diff --git a/.dockerignore b/.dockerignore index aea737c4dce..14c2f5a8bf5 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,7 +5,5 @@ **/*.dSYM build -tests/testdata -tests/.git +tests cmd/prometheus - diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f87996cdcb9..9fb3c86a6b0 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -4,10 +4,10 @@ Thank you for considering to help out with the source code! We welcome contributions from anyone on the internet, and are grateful for even the smallest of fixes! -If you'd like to contribute to go-ethereum, please fork, fix, commit and send a +If you'd like to contribute to Erigon, please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base. If you wish to submit more complex changes though, please check up with the core -devs first on [our gitter channel](https://gitter.im/ethereum/go-ethereum) to +devs first on [Discord server](https://github.com/ledgerwatch/erigon#erigon-discord-server) to ensure those changes are in line with the general philosophy of the project and/or get some early feedback which can make both your efforts much lighter as well as our review and merge procedures quick and simple. @@ -21,7 +21,7 @@ Please make sure your contributions adhere to our coding guidelines: (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. - * Pull requests need to be based on and opened against the `master` branch. + * Pull requests need to be based on and opened against the `devel` branch. * Commit messages should be prefixed with the package(s) they modify. * E.g. "eth, rpc: make trace configs optional" @@ -30,11 +30,11 @@ Please make sure your contributions adhere to our coding guidelines: Before you submit a feature request, please check and make sure that it isn't possible through some other means. The JavaScript-enabled console is a powerful feature in the right hands. Please check our -[Wiki page](https://github.com/ethereum/go-ethereum/wiki) for more info +[Wiki page](https://github.com/ledgerwatch/erigon/wiki) for more info and help. ## Configuration, dependencies, and tests -Please see the [Developers' Guide](https://github.com/ethereum/go-ethereum/wiki/Developers'-Guide) +Please see the [Readme](https://github.com/ledgerwatch/erigon#readme) file for more details on configuring your environment, managing project dependencies and testing procedures. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c69428160b1..636a25f1a0a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,73 +3,105 @@ on: push: branches: - devel + - alpha + - stable pull_request: branches: - devel + - alpha + - stable jobs: tests: strategy: matrix: - os: [ ubuntu-16.04, ubuntu-20.04, macos-10.15 ] # list of os: https://github.com/actions/virtual-environments + os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: git submodule update --init --recursive --force - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: - go-version: 1.16.x - - name: Install dependencies - run: | - if [ "$RUNNER_OS" == "Linux" ]; then - sudo apt update && sudo apt install build-essential - fi - shell: bash - - uses: actions/cache@v2 + go-version: 1.18.x + - name: Install dependencies on Linux + if: runner.os == 'Linux' + run: sudo apt update && sudo apt install build-essential + + - uses: actions/cache@v3 with: - path: ~/go/pkg/mod - key: ${{ matrix.os }}-go-${{ hashFiles('**/go.sum') }} - - run: make all + path: | + ~/.cache/go-build + ~/Library/Caches/go-build + ~/go/pkg/mod + key: go-${{ matrix.os }}-${{ hashFiles('**/go.sum') }} + restore-keys: go-${{ matrix.os }}- + + - name: Build + run: make all + - name: Reproducible build test run: | + make erigon shasum -a256 ./build/bin/erigon > erigon1.sha256 make erigon shasum -a256 ./build/bin/erigon > erigon2.sha256 if ! cmp -s erigon1.sha256 erigon2.sha256; then - echo >&2 "Reproducible build broken"; exit 1 + echo >&2 "Reproducible build broken"; cat erigon1.sha256; cat erigon2.sha256; exit 1 fi + - name: Lint - if: matrix.os == 'ubuntu-20.04' - uses: golangci/golangci-lint-action@v2 + if: runner.os == 'Linux' + uses: golangci/golangci-lint-action@v3 with: - version: v1.41 - skip-go-installation: true + version: v1.46 skip-pkg-cache: true skip-build-cache: true - - run: make test - win: + - name: Test + run: make test + + tests-windows: strategy: matrix: - os: [ windows-2019 ] + os: [ windows-2022 ] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: git submodule update --init --recursive --force - - uses: actions/setup-go@v2 + - uses: actions/setup-go@v3 with: - go-version: 1.16.x - - run: choco upgrade mingw cmake -y --no-progress - - name: Build + go-version: 1.18.x + + - uses: actions/cache@v3 + with: + path: | + C:\ProgramData\chocolatey\lib\mingw + C:\ProgramData\chocolatey\lib\cmake + key: chocolatey-${{ matrix.os }} + - name: Install dependencies run: | - .\wmake.ps1 - make test - shell: powershell + choco upgrade mingw -y --no-progress --version 11.2.0.07112021 + choco install cmake -y --no-progress --version 3.23.1 + + - uses: actions/cache@v3 + with: + path: | + ~\AppData\Local\go-build + ~\go\pkg\mod + key: go-${{ matrix.os }}-${{ hashFiles('**/go.sum') }} + restore-keys: go-${{ matrix.os }}- + + - name: Build + run: .\wmake.ps1 all + + - name: Test + run: .\wmake.ps1 test docker: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 - - run: git submodule update --init --recursive --force - - run: docker build . + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # fetch git tags for "git describe" + - run: make docker diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml new file mode 100644 index 00000000000..e8ddb57ed2e --- /dev/null +++ b/.github/workflows/test-integration.yml @@ -0,0 +1,72 @@ +name: Integration tests +on: + push: + branches: + - devel + - alpha + - stable + schedule: + - cron: '20 16 * * *' # daily at 16:20 UTC +jobs: + tests: + strategy: + matrix: + os: [ ubuntu-20.04, macos-11 ] # list of os: https://github.com/actions/virtual-environments + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + - run: git submodule update --init --recursive --force + - uses: actions/setup-go@v3 + with: + go-version: 1.18.x + - name: Install dependencies on Linux + if: runner.os == 'Linux' + run: sudo apt update && sudo apt install build-essential + + - uses: actions/cache@v3 + with: + path: | + ~/.cache/go-build + ~/Library/Caches/go-build + ~/go/pkg/mod + key: go-${{ matrix.os }}-${{ hashFiles('**/go.sum') }} + restore-keys: go-${{ matrix.os }}- + + - name: test-integration + run: make test-integration + + tests-windows: + strategy: + matrix: + os: [ windows-2022 ] + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + - run: git submodule update --init --recursive --force + - uses: actions/setup-go@v3 + with: + go-version: 1.18.x + + - uses: actions/cache@v3 + with: + path: | + C:\ProgramData\chocolatey\lib\mingw + C:\ProgramData\chocolatey\lib\cmake + key: chocolatey-${{ matrix.os }} + - name: Install dependencies + run: | + choco upgrade mingw -y --no-progress --version 11.2.0.07112021 + choco install cmake -y --no-progress --version 3.23.1 + + - uses: actions/cache@v3 + with: + path: | + ~\AppData\Local\go-build + ~\go\pkg\mod + key: go-${{ matrix.os }}-${{ hashFiles('**/go.sum') }} + restore-keys: go-${{ matrix.os }}- + + - name: test-integration + run: .\wmake.ps1 test-integration diff --git a/.gitignore b/.gitignore index 850526e6479..36bd64dfef4 100644 --- a/.gitignore +++ b/.gitignore @@ -62,11 +62,16 @@ right_*.txt root_*.txt __pycache__ -docker-compose.dev.yml /build *.tmp /ethdb/*.fail libmdbx/build/* -tests/testdata/* \ No newline at end of file +tests/testdata/* + +go.work + +/goerli + +docker-compose.*.yml \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 5bc6224029f..e7ceb250819 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,13 @@ [submodule "tests"] path = tests/testdata url = https://github.com/ethereum/tests +[submodule "turbo/snapshotsync/snapshothashes/erigon-snapshots"] + path = turbo/snapshotsync/snapshothashes/erigon-snapshots + url = https://github.com/ledgerwatch/erigon-snapshot.git +[submodule "cmd/downloader/trackers/trackerslist"] + path = cmd/downloader/trackers/trackerslist + url = https://github.com/ngosang/trackerslist.git + [submodule "libmdbx"] path = libmdbx - url = https://github.com/erthink/libmdbx + url = https://github.com/torquem-ch/libmdbx.git diff --git a/.golangci.yml b/.golangci.yml index 97e3f955748..01253b4176f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -7,30 +7,33 @@ linters: - gofmt - deadcode - errcheck - - gosimple +# - gosimple # 1.18 - govet - ineffassign - - staticcheck - - structcheck - - unused +# - staticcheck # 1.18 +# - structcheck # 1.18 +# - unused # 1.18 - varcheck - - gocritic +# - gocritic +# - bodyclose # 1.18 +# - gosec # - forcetypeassert linters-settings: gocritic: # Which checks should be enabled; can't be combined with 'disabled-checks'; # See https://go-critic.github.io/overview#checks-overview - # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run` + # To check which checks are enabled run `GL_DEBUG=gocritic ./build/bin/golangci-lint run` # By default list of stable checks is used. enabled-checks: - ruleguard - truncateCmp - # - defaultCaseOrder + # - defaultCaseOrder # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty disabled-checks: - regexpMust + - appendAssign # - hugeParam - rangeValCopy - exitAfterDefer @@ -42,17 +45,22 @@ linters-settings: - captLocal - commentFormatting - ifElseChain - - appendAssign + - importShadow + - paramTypeCombine + - builtinShadow + - typeUnparen # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks. # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". enabled-tags: - performance + - diagnostic + - opinionated disabled-tags: - experimental - ruleguard: - rules: "rules.go" settings: + ruleguard: + rules: "rules.go" hugeParam: # size in bytes that makes the warning trigger (default 80) sizeThreshold: 1000 @@ -92,7 +100,19 @@ issues: - staticcheck text: "SA(1019|1029|5011)" # Exclude some linters from running on tests files. - - path: _test\.go + - path: test\.go + linters: + - gosec + - unused + - deadcode + - gocritic + - path: hack\.go + linters: + - gosec + - unused + - deadcode + - gocritic + - path: cmd/devp2p linters: - gosec - unused @@ -102,3 +122,7 @@ issues: linters: - gosec - gocritic + - path: p2p/simulations + linters: + - gosec + - gocritic diff --git a/DEV_CHAIN.md b/DEV_CHAIN.md new file mode 100644 index 00000000000..d3510aea3df --- /dev/null +++ b/DEV_CHAIN.md @@ -0,0 +1,144 @@ +Steps to setup and run Erigon dev chain. This tutorial is made for macOS. + + +## 1. Clone and Build Erigon +Open terminal 1 and type the following command + +```bash +git clone --recurse-submodules -j8 https://github.com/ledgerwatch/erigon.git +cd erigon +make erigon +``` + + +## 2. Build RPCdeamon +On the same terminal folder you can build the RPC daemon. + +```bash +make rpcdaemon +``` + +## 3. Start Node 1 +If evereything is fine, by changing directory to erigon/build/bin you will see the two exec for erigon and rpc daemon. +On the terminal you can type the following command to start node1. + +```bash +./erigon --datadir=dev --chain dev --private.api.addr=localhost:9090 --mine +``` + + Argument notes: + * datadir : Tells where the data is stored, default level is dev folder. + * chain : Tells that we want to run Erigon in the dev chain. + * private.api.addr=localhost:9090 : Tells where Eigon is going to listen for connections. + * mine : Add this if you want the node to mine. + * dev.period : Add this to specify the timing interval amongst blocks. Number of seconds MUST be > 0 (if you want empty blocks) otherwise the default value 0 does not allow mining of empty blocks. + +The result will be somenthing like this: + +Node 1 start + + +Now save the enode information generated in the logs, we will use this in a minute. Here there is an example. +``` +enode://d30d079163d7b69fcb261c0538c0c3faba4fb4429652970e60fa25deb02a789b4811e98b468726ba0be63b9dc925a019f433177eb6b45c23bb78892f786d8f7a@127.0.0.1:53171 +``` + +## 4. Start RPC deamon + +Open terminal 2 and navigate to erigon/build/bin folder. Here type the following command + +```bash +./rpcdaemon --datadir=dev --private.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool,parity +``` +The result will look like this: +rpc daemon start + + + +## 5. Start Node 2 + +Node 2 has to connect to Node 1 in order to sync. As such, we will use the argument --staticpeers. +To tell Node 2 where Node 1 is we will use the Enode info of Node 1 we saved before. + +Open terminal 3 and navigate to erigon/build/bin folder. Paste in the following command the Enode info and run it, be careful to remove the last part ?discport=0. + +```bash +./erigon --datadir=dev2 --chain dev --private.api.addr=localhost:9091 \ + --staticpeers "enode://d30d079163d7b69fcb261c0538c0c3faba4fb4429652970e60fa25deb02a789b4811e98b468726ba0be63b9dc925a019f433177eb6b45c23bb78892f786d8f7a@127.0.0.1:53171" \ + --nodiscover +``` + +To check if the nodes are connected, you can go to the log of both the nodes and look for the line + + ``` [p2p] GoodPeers eth66=1 ``` + +Note: this might take a while it is not istantaneus, also if you see a 1 on either one of the two the node is fine. + + + + + +## 6. Interact with the node using RPC + + Open a terminal 4 and type + +```bash + curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_chainId", "params": [], "id":1}' localhost:8545 + +``` + The result should look like this: + +```json +{"jsonrpc":"2.0","id":1,"result":"0x539"} +``` + +Other commands you can try: + + ```bash + curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_gasPrice", "params": [], "id":1}' localhost:8545 + ``` + ```bash + curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_mining", "params": [], "id":1}' localhost:8545 + ``` + ```bash + curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_syncing", "params": [], "id":1}' localhost:8545 + ``` + ```bash + curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "net_peerCount", "params": [], "id":74}' localhost:8545 + ``` + ```bash + curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id":83}' localhost:8545 + ``` + +## 7. Send a transaction with metamask + + Finally, we want to try sending a transaction between two accounts. + For this example we will use dev accounts retrived from Erigon code: + + * Account with balance (Dev 1) + * address = ``` 0x67b1d87101671b127f5f8714789C7192f7ad340e ``` + * privateKey = ``` 26e86e45f6fc45ec6e2ecd128cec80fa1d1505e5507dcd2ae58c3130a7a97b48 ``` + + * Empty account (Dev 2) + * address = ``` 0xa94f5374Fce5edBC8E2a8697C15331677e6EbF0B ``` + * privateKey = ``` 45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8 ``` + + + +Now from metamask, you can import Dev 1 , and then send a transaction to pass some ethers from Dev 1 to Dev 2. +From the RPC daemon terminal, you will see something like this + +Transaction example + + Finally you will see the ethers in the Dev 2 account balance. + + + + ## 7. Check a mined block + + Now we want to check the creation of a new block and that all the nodes sync. + +Below we can see that block 1 is created (blocn_num=1) and that the next block to be proposed increments from 1 to 2 ( block=2). The other nodes will see the same update. + +Block + diff --git a/Dockerfile b/Dockerfile index 29acc9e2dc5..1f913496e97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,19 @@ -# syntax=docker/dockerfile:1 -FROM docker.io/library/golang:1.16-alpine3.13 AS builder +# syntax = docker/dockerfile:1.2 +FROM docker.io/library/golang:1.18-alpine3.15 AS builder -RUN apk --no-cache add make gcc g++ linux-headers git bash ca-certificates libgcc libstdc++ +RUN apk --no-cache add build-base linux-headers git bash ca-certificates libstdc++ WORKDIR /app ADD . . -# expect that host run `git submodule update --init` -RUN make erigon rpcdaemon integration sentry +RUN --mount=type=cache,target=/root/.cache \ + --mount=type=cache,target=/tmp/go-build \ + --mount=type=cache,target=/go/pkg/mod \ + make all db-tools -FROM docker.io/library/alpine:3.13 +FROM docker.io/library/alpine:3.15 -RUN apk add --no-cache ca-certificates libgcc libstdc++ tzdata +RUN apk add --no-cache ca-certificates libstdc++ tzdata COPY --from=builder /app/build/bin/* /usr/local/bin/ RUN adduser -H -u 1000 -g 1000 -D erigon @@ -21,11 +23,12 @@ RUN chown -R erigon:erigon /home/erigon USER erigon -EXPOSE 8545 8546 30303 30303/udp 30304 30304/udp 8080 9090 6060 +EXPOSE 8545 8551 8546 30303 30303/udp 42069 42069/udp 8080 9090 6060 # https://github.com/opencontainers/image-spec/blob/main/annotations.md ARG BUILD_DATE ARG VCS_REF +ARG VERSION LABEL org.label-schema.build-date=$BUILD_DATE \ org.label-schema.name="Erigon" \ org.label-schema.description="Erigon Ethereum Client" \ diff --git a/Makefile b/Makefile index abdd9ffa62b..15176d5aa15 100644 --- a/Makefile +++ b/Makefile @@ -1,25 +1,41 @@ +GO = go GOBIN = $(CURDIR)/build/bin -GOTEST = GODEBUG=cgocheck=0 go test ./... -p 2 GIT_COMMIT ?= $(shell git rev-list -1 HEAD) GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD) -GIT_TAG ?= $(shell git describe --tags) -GOBUILD = env GO111MODULE=on go build -trimpath -ldflags "-X github.com/ledgerwatch/erigon/params.GitCommit=${GIT_COMMIT} -X github.com/ledgerwatch/erigon/params.GitBranch=${GIT_BRANCH} -X github.com/ledgerwatch/erigon/params.GitTag=${GIT_TAG}" -GO_DBG_BUILD = go build -trimpath -tags=debug -ldflags "-X github.com/ledgerwatch/erigon/params.GitCommit=${GIT_COMMIT} -X github.com/ledgerwatch/erigon/params.GitBranch=${GIT_BRANCH} -X github.com/ledgerwatch/erigon/params.GitTag=${GIT_TAG}" -gcflags=all="-N -l" # see delve docs +GIT_TAG ?= $(shell git describe --tags '--match=v*' --dirty) -GO_MAJOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1) -GO_MINOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f2) +CGO_CFLAGS := $(shell $(GO) env CGO_CFLAGS) # don't loose default +CGO_CFLAGS += -DMDBX_FORCE_ASSERTIONS=1 # Enable MDBX's asserts by default in 'devel' branch and disable in 'stable' +CGO_CFLAGS := CGO_CFLAGS="$(CGO_CFLAGS)" +DBG_CGO_CFLAGS += -DMDBX_DEBUG=1 -all: erigon hack rpctest state pics rpcdaemon integration db-tools sentry +GO_MINOR_VERSION = $(shell $(GO) version | cut -c 16-17) +BUILD_TAGS = nosqlite,noboltdb +PACKAGE = github.com/ledgerwatch/erigon + +GO_FLAGS += -trimpath -tags $(BUILD_TAGS) -buildvcs=false +GO_FLAGS += -ldflags "-X ${PACKAGE}/params.GitCommit=${GIT_COMMIT} -X ${PACKAGE}/params.GitBranch=${GIT_BRANCH} -X ${PACKAGE}/params.GitTag=${GIT_TAG}" + +GOBUILD = $(CGO_CFLAGS) $(GO) build $(GO_FLAGS) +GO_DBG_BUILD = $(DBG_CGO_CFLAGS) $(GO) build $(GO_FLAGS) -tags $(BUILD_TAGS),debug -gcflags=all="-N -l" # see delve docs +GOTEST = GODEBUG=cgocheck=0 $(GO) test $(GO_FLAGS) ./... -p 2 + +default: all go-version: - @if [ $(GO_MINOR_VERSION) -lt 16 ]; then \ - echo "minimum required Golang version is 1.16"; \ + @if [ $(GO_MINOR_VERSION) -lt 18 ]; then \ + echo "minimum required Golang version is 1.18"; \ exit 1 ;\ fi -docker: - DOCKER_BUILDKIT=1 docker build -t erigon:latest --build-arg git_commit='${GIT_COMMIT}' --build-arg git_branch='${GIT_BRANCH}' --build-arg git_tag='${GIT_TAG}' . +docker: git-submodules + DOCKER_BUILDKIT=1 docker build -t thorax/erigon:latest \ + --build-arg "BUILD_DATE=$(shell date -Iseconds)" \ + --build-arg VCS_REF=${GIT_COMMIT} \ + --build-arg VERSION=${GIT_TAG} \ + ${DOCKER_FLAGS} \ + . xdg_data_home := ~/.local/share ifdef XDG_DATA_HOME @@ -33,80 +49,42 @@ docker-compose: dbg: $(GO_DBG_BUILD) -o $(GOBIN)/ ./cmd/... +%.cmd: git-submodules + @# Note: $* is replaced by the command name + @echo "Building $*" + @cd ./cmd/$* && $(GOBUILD) -o $(GOBIN)/$* + @echo "Run \"$(GOBIN)/$*\" to launch $*." + geth: erigon -erigon: go-version - @echo "Building Erigon" - rm -f $(GOBIN)/tg # Remove old binary to prevent confusion where users still use it because of the scripts - $(GOBUILD) -o $(GOBIN)/erigon ./cmd/erigon - @echo "Done building." - @echo "Run \"$(GOBIN)/erigon\" to launch Erigon." - -hack: - $(GOBUILD) -o $(GOBIN)/hack ./cmd/hack - @echo "Done building." - @echo "Run \"$(GOBIN)/hack\" to launch hack." - -rpctest: - $(GOBUILD) -o $(GOBIN)/rpctest ./cmd/rpctest - @echo "Done building." - @echo "Run \"$(GOBIN)/rpctest\" to launch rpctest." - -state: - $(GOBUILD) -o $(GOBIN)/state ./cmd/state - @echo "Done building." - @echo "Run \"$(GOBIN)/state\" to launch state." - - -pics: - $(GOBUILD) -o $(GOBIN)/pics ./cmd/pics - @echo "Done building." - @echo "Run \"$(GOBIN)/pics\" to launch pics." - -rpcdaemon: - $(GOBUILD) -o $(GOBIN)/rpcdaemon ./cmd/rpcdaemon - @echo "Done building." - @echo "Run \"$(GOBIN)/rpcdaemon\" to launch rpcdaemon." - -integration: - $(GOBUILD) -o $(GOBIN)/integration ./cmd/integration - @echo "Done building." - @echo "Run \"$(GOBIN)/integration\" to launch integration tests." - -sentry: - $(GOBUILD) -o $(GOBIN)/sentry ./cmd/sentry - rm -f $(GOBIN)/headers # Remove old binary to prevent confusion where users still use it because of the scripts - @echo "Done building." - @echo "Run \"$(GOBIN)/sentry\" to run sentry" - -cons: - $(GOBUILD) -o $(GOBIN)/cons ./cmd/cons - @echo "Done building." - @echo "Run \"$(GOBIN)/cons\" to run consensus engine PoC." - -evm: - $(GOBUILD) -o $(GOBIN)/evm ./cmd/evm - @echo "Done building." - @echo "Run \"$(GOBIN)/evm\" to run EVM" - -seeder: - $(GOBUILD) -o $(GOBIN)/seeder ./cmd/snapshots/seeder - @echo "Done building." - @echo "Run \"$(GOBIN)/seeder\" to seed snapshots." - -sndownloader: - $(GOBUILD) -o $(GOBIN)/sndownloader ./cmd/snapshots/downloader - @echo "Done building." - @echo "Run \"$(GOBIN)/sndownloader\" to seed snapshots." - -tracker: - $(GOBUILD) -o $(GOBIN)/tracker ./cmd/snapshots/tracker - @echo "Done building." - @echo "Run \"$(GOBIN)/tracker\" to run snapshots tracker." - -db-tools: libmdbx +erigon: go-version erigon.cmd + @rm -f $(GOBIN)/tg # Remove old binary to prevent confusion where users still use it because of the scripts + +COMMANDS += cons +COMMANDS += devnettest +COMMANDS += downloader +COMMANDS += hack +COMMANDS += integration +COMMANDS += observer +COMMANDS += pics +COMMANDS += rpcdaemon +COMMANDS += rpctest +COMMANDS += sentry +COMMANDS += state +COMMANDS += txpool + +# build each command using %.cmd rule +$(COMMANDS): %: %.cmd + +all: erigon $(COMMANDS) + +db-tools: git-submodules @echo "Building db-tools" - git submodule update --init --recursive + + # hub.docker.com setup incorrect gitpath for git modules. Just remove it and re-init submodule. + rm -rf libmdbx + git submodule update --init --recursive --force libmdbx + cd libmdbx && MDBX_BUILD_TIMESTAMP=unknown make tools cp libmdbx/mdbx_chk $(GOBIN) cp libmdbx/mdbx_copy $(GOBIN) @@ -117,7 +95,10 @@ db-tools: libmdbx @echo "Run \"$(GOBIN)/mdbx_stat -h\" to get info about mdbx db file." test: - $(GOTEST) --timeout 30m + $(GOTEST) --timeout 30s + +test-integration: + $(GOTEST) --timeout 30m -tags $(BUILD_TAGS),integration lint: @./build/bin/golangci-lint run --config ./.golangci.yml @@ -128,10 +109,10 @@ lintci: lintci-deps: rm -f ./build/bin/golangci-lint - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./build/bin v1.41.1 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ./build/bin v1.46.2 clean: - env GO111MODULE=on go clean -cache + go clean -cache rm -fr build/* cd libmdbx/ && make clean @@ -140,7 +121,6 @@ clean: devtools: # Notice! If you adding new binary - add it also to cmd/hack/binary-deps/main.go file - $(GOBUILD) -o $(GOBIN)/stringer golang.org/x/tools/cmd/stringer $(GOBUILD) -o $(GOBIN)/go-bindata github.com/kevinburke/go-bindata/go-bindata $(GOBUILD) -o $(GOBIN)/gencodec github.com/fjl/gencodec $(GOBUILD) -o $(GOBIN)/codecgen github.com/ugorji/go/codec/codecgen @@ -148,6 +128,7 @@ devtools: PATH=$(GOBIN):$(PATH) go generate ./common PATH=$(GOBIN):$(PATH) go generate ./core/types PATH=$(GOBIN):$(PATH) go generate ./consensus/aura/... + #PATH=$(GOBIN):$(PATH) go generate ./eth/ethconfig/... @type "npm" 2> /dev/null || echo 'Please install node.js and npm' @type "solc" 2> /dev/null || echo 'Please install solc' @type "protoc" 2> /dev/null || echo 'Please install protoc' @@ -162,3 +143,10 @@ prometheus: escape: cd $(path) && go test -gcflags "-m -m" -run none -bench=BenchmarkJumpdest* -benchmem -memprofile mem.out + +git-submodules: + @[ -d ".git" ] || (echo "Not a git repository" && exit 1) + @echo "Updating git submodules" + @# Dockerhub using ./hooks/post-checkout to set submodules, so this line will fail on Dockerhub + @git submodule sync --quiet --recursive + @git submodule update --quiet --init --recursive --force || true diff --git a/README.md b/README.md index 8cd165518de..08acb532ea3 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ Erigon is an implementation of Ethereum (aka "Ethereum client"), on the efficien + [Mining](#mining) + [Windows](#windows) + [GoDoc](https://godoc.org/github.com/ledgerwatch/erigon) + + [Beacon Chain](#beacon-chain) + + [Dev Chain](#dev-chain) + - [Key features](#key-features) + [More Efficient State Storage](#more-efficient-state-storage) + [Faster Initial Sync](#faster-initial-sync) @@ -22,7 +25,7 @@ Erigon is an implementation of Ethereum (aka "Ethereum client"), on the efficien - [FAQ](#faq) - [Getting in touch](#getting-in-touch) + [Erigon Discord Server](#erigon-discord-server) - + [Reporting security issues/concerns](#reporting-security-issues-concerns) + + [Reporting security issues/concerns](#reporting-security-issues/concerns) + [Team](#team) - [Known issues](#known-issues) + [`htop` shows incorrect memory usage](#htop-shows-incorrect-memory-usage) @@ -32,20 +35,29 @@ Erigon is an implementation of Ethereum (aka "Ethereum client"), on the efficien NB! In-depth links are marked by the microscope sign (🔬) -**Disclaimer: this software is currenly a tech preview. We will do our best to keep it stable and make no breaking +**Disclaimer: this software is currently a tech preview. We will do our best to keep it stable and make no breaking changes but we don't guarantee anything. Things can and will break.** -The current version is currently based on Go-Ethereum 1.10.1 +🔬 Alpha/Beta versions difference: [here](https://erigon.substack.com/p/erigon-2-three-upgrades?s=r) System Requirements =================== -Recommend 2Tb storage space on a single partition: 1.3Tb state, 200GB temp files (can symlink or mount -folder `/etl-tmp` to another disk). +* For an Archive node of Ethereum Mainnet we recommend >=3TB storage space: 1.8TB state (as of March 2022), +200GB temp files (can symlink or mount folder `/etl-tmp` to another disk). Ethereum Mainnet Full node (see `--prune*` flags): 400Gb (April 2022). + +* Goerli Full node (see `--prune*` flags): 189GB on Beta, 114GB on Alpha (April 2022). + +* BSC Archive: 7TB. BSC Full: 1TB. + +* Polygon Mainnet Archive: 5TB. Polygon Mumbai Archive: 1TB. + +SSD or NVMe. Do not recommend HDD - on HDD Erigon will always stay N blocks behind chain tip, but not fall behind. +Bear in mind that SSD performance deteriorates when close to capacity. -RAM: 16GB, 64-bit architecture, [Golang version >= 1.16](https://golang.org/doc/install) +RAM: >=16GB, 64-bit architecture, [Golang version >= 1.18](https://golang.org/doc/install), GCC 10+ -🔬 more info on disk storage is [here](https://ledgerwatch.github.io/turbo_geth_release.html#Disk-space)) +🔬 more details on disk storage [here](https://erigon.substack.com/p/disk-footprint-changes-in-new-erigon?s=r) and [here](https://ledgerwatch.github.io/turbo_geth_release.html#Disk-space). Usage ===== @@ -53,37 +65,59 @@ Usage ### Getting Started ```sh -> git clone --recurse-submodules -j8 https://github.com/ledgerwatch/erigon.git -> cd erigon -> make erigon -> ./build/bin/erigon +git clone --recurse-submodules -j8 https://github.com/ledgerwatch/erigon.git +cd erigon +make erigon +./build/bin/erigon ``` +Default `--snapshots=true` for `mainnet`, `goerli`, `bsc`. Other networks now have default `--snapshots=false`. Increase download speed by flag `--torrent.download.rate=20mb`. 🔬 See [Downloader docs](./cmd/downloader/readme.md) + +Use `--datadir` to choose where to store data. + +Use `--chain=bor-mainnet` for Polygon Mainnet and `--chain=mumbai` for Polygon Mumbai. + +### Modularity + +Erigon by default is "all in one binary" solution, but it's possible start TxPool as separated processes. +Same true about: JSON RPC layer (RPCDaemon), p2p layer (Sentry), history download layer (Downloader), consensus. +Don't start services as separated processes unless you have clear reason for it: resource limiting, scale, replace by +your own implementation, security. +How to start Erigon's services as separated processes, see in [docker-compose.yml](./docker-compose.yml). + +### Optional stages + +There is an optional stage that can be enabled through flags: + +* `--watch-the-burn`, Enable WatchTheBurn stage which keeps track of ETH issuance and is required to use `erigon_watchTheBurn`. + ### Testnets -If you would like to give Erigon a try, but do not have spare 2Tb on your driver, a good option is to start syncing one +If you would like to give Erigon a try, but do not have spare 2TB on your drive, a good option is to start syncing one of the public testnets, Görli. It syncs much quicker, and does not take so much disk space: ```sh -> git clone --recurse-submodules -j8 https://github.com/ledgerwatch/erigon.git -> cd erigon -> make erigon -> ./build/bin/erigon --datadir goerli --chain goerli +git clone --recurse-submodules -j8 https://github.com/ledgerwatch/erigon.git +cd erigon +make erigon +./build/bin/erigon --datadir goerli --chain goerli ``` Please note the `--datadir` option that allows you to store Erigon files in a non-default location, in this example, -in `goerli` subdirectory of the current directory. Name of the directory `--datadir` does not have to match the name if +in `goerli` subdirectory of the current directory. Name of the directory `--datadir` does not have to match the name of the chain in `--chain`. ### Mining +**Disclaimer: Not supported/tested for Polygon Network (In Progress)** + Support only remote-miners. * To enable, add `--mine --miner.etherbase=...` or `--mine --miner.miner.sigkey=...` flags. * Other supported options: `--miner.extradata`, `--miner.notify`, `--miner.gaslimit`, `--miner.gasprice` , `--miner.gastarget` -* RPCDaemon supports methods: eth_coinbase , eth_hashrate, eth_mining, eth_getWork, eth_submitWork, eth_submitHashrate -* RPCDaemon supports websocket methods: newPendingTransaction +* JSON-RPC supports methods: eth_coinbase , eth_hashrate, eth_mining, eth_getWork, eth_submitWork, eth_submitHashrate +* JSON-RPC supports websocket methods: newPendingTransaction * TODO: + we don't broadcast mined blocks to p2p-network yet, [but it's easy to accomplish](https://github.com/ledgerwatch/erigon/blob/9b8cdc0f2289a7cef78218a15043de5bdff4465e/eth/downloader/downloader.go#L673) @@ -104,7 +138,9 @@ Windows users may run erigon in 3 possible ways: build on windows : * [Git](https://git-scm.com/downloads) for Windows must be installed. If you're cloning this repository is very likely you already have it - * [GO Programming Language](https://golang.org/dl/) must be installed. Minimum required version is 1.16 + * [GO Programming Language](https://golang.org/dl/) must be installed. Minimum required version is 1.18 + * GNU CC Compiler at least version 10 (is highly suggested that you install `chocolatey` package manager - see + following point) * If you need to build MDBX tools (i.e. `.\wmake.ps1 db-tools`) then [Chocolatey package manager](https://chocolatey.org/) for Windows must be installed. By Chocolatey you need to install the following components : `cmake`, `make`, `mingw` by `choco install cmake make mingw`. @@ -114,7 +150,7 @@ Windows users may run erigon in 3 possible ways: been reported some anti-virus programs detect those files as possibly infected by `Win64/Kryptic.CIS` trojan horse (or a variant of it). Although those are false positives we have no control over 100+ vendors of security products for Windows and their respective detection algorythms and we understand this might make your experience with Windows - builds uncomfortable. To workaround the issue you might either set exlusions for your antivirus specifically + builds uncomfortable. To workaround the issue you might either set exclusions for your antivirus specifically for `build\bin\mdbx\CMakeFiles` sub-folder of the cloned repo or you can run erigon using the following other two options @@ -131,6 +167,48 @@ Windows users may run erigon in 3 possible ways: **Please also note the default WSL2 environment has its own IP address which does not match the one of the network interface of Windows host: take this into account when configuring NAT for port 30303 on your router.** +### Beacon Chain + +Erigon can be used as an execution-layer for beacon chain consensus clients (Eth2). Default configuration is ok. Eth2 +relies on availability of receipts - don't prune them: don't add character `r` to `--prune` flag. However, old receipts + are not needed for Eth2 and you can safely prune them with `--prune.r.before=11184524` in combination with `--prune htc`. + +You must enable JSON-RPC by `--http` and add `engine` to `--http.api` list. (Or run the [JSON-RPC daemon](#json-rpc-daemon) in addition to the Erigon) + +If beacon chain client on a different device: add `--http.addr 0.0.0.0` (JSON-RPC listen on localhost by default) +. + +Once the JSON-RPC is running, all you need to do is point your beacon chain client to `:8545`, +where `` is either localhost or the IP address of the device running the JSON-RPC. + +Erigon has been tested with Lighthouse however all other clients that support JSON-RPC should also work. + +### Authentication API + +In order to establish a secure connection between the Consensus Layer and the Execution Layer, a JWT secret key is automatically generated. + +The JWT secret key will be present in the datadir by default under the name of `jwt.hex` and its path can be specified with the flag `--authrpc.jwtsecret`. + +This piece of info needs to be specified in the Consensus Layer as well in order to establish connection successfully. More information can be found [here](https://github.com/ethereum/execution-apis/blob/main/src/engine/authentication.md) + +### Multiple Instances / One Machine + +Define 5 flags to avoid conflicts: `--datadir --port --http.port --torrent.port --private.api.addr`. Example of multiple chains on the same machine: + +``` +# mainnet +./build/bin/erigon --datadir="" --chain=mainnet --port=30303 --http.port=8545 --torrent.port=42069 --private.api.addr=127.0.0.1:9090 --http --ws --http.api=eth,debug,net,trace,web3,erigon + + +# rinkeby +./build/bin/erigon --datadir="" --chain=rinkeby --port=30304 --http.port=8546 --torrent.port=42068 --private.api.addr=127.0.0.1:9091 --http --ws --http.api=eth,debug,net,trace,web3,erigon +``` + +Quote your path if it has spaces. + +### Dev Chain + 🔬 Detailed explanation is [DEV_CHAIN](/DEV_CHAIN.md). + Key features ============ @@ -147,7 +225,7 @@ is being updated on recurring basis. **Preprocessing**. For some operations, Erigon uses temporary files to preprocess data before inserting it into the main DB. That reduces write amplification and DB inserts are orders of magnitude quicker. - 🔬 See our detailed ETL explanation [here](/common/etl/README.md). + 🔬 See our detailed ETL explanation [here](https://github.com/ledgerwatch/erigon-lib/blob/main/etl/README.md). **Plain state**. @@ -164,7 +242,7 @@ Erigon uses a rearchitected full sync algorithm from It uses the same network primitives and is compatible with regular go-ethereum nodes that are using full sync, you do not need any special sync capabilities for Erigon to sync. -When reimagining the full sync, we focused on batching data together and minimize DB overwrites. That makes it possible +When reimagining the full sync, with focus on batching data together and minimize DB overwrites. That makes it possible to sync Ethereum mainnet in under 2 days if you have a fast enough network connection and an SSD drive. Examples of stages are: @@ -183,38 +261,27 @@ Examples of stages are: ### JSON-RPC daemon -In Erigon RPC calls are extracted out of the main binary into a separate daemon. This daemon can use both local or -remote DBs. That means, that this RPC daemon doesn't have to be running on the same machine as the main Erigon binary or -it can run from a snapshot of a database for read-only calls. - -🔬 See [RPC-Daemon docs](./cmd/rpcdaemon/README.md) +Most of Erigon's components (sentry, txpool, snapshots downloader, can work inside Erigon and as independent process. -#### **For local DB** +To enable built-in RPC server: `--http` and `--ws` (sharing same port with http) -This is only possible if RPC daemon runs on the same computer as Erigon. This mode uses shared memory access to the -database of Erigon, which has better performance than accessing via TPC socket (see "For remote DB" section below). -Provide both `--datadir` and `--private.api.addr` options: - -``` -> make erigon -> ./build/bin/erigon --private.api.addr=localhost:9090 -> make rpcdaemon -> ./build/bin/rpcdaemon --datadir= --private.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool,shh -``` +Run RPCDaemon as separated process: this daemon can use local DB (with running Erigon or on snapshot of a database) or remote DB (run on another server). 🔬 See [RPC-Daemon docs](./cmd/rpcdaemon/README.md) #### **For remote DB** This works regardless of whether RPC daemon is on the same computer with Erigon, or on a different one. They use TPC socket connection to pass data between them. To use this mode, run Erigon in one terminal window -``` -> make erigon -> ./build/bin/erigon --private.api.addr=localhost:9090 -> make rpcdaemon -> ./build/bin/rpcdaemon --private.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool,shh +```sh +make erigon +./build/bin/erigon --private.api.addr=localhost:9090 +make rpcdaemon +./build/bin/rpcdaemon --private.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool ``` -**gRPC ports**: `9090` erigon, `9091` sentry, `9092` consensus engine, `9093` snapshot downloader, `9094` TxPool +#### **gRPC ports** + +`9090` erigon, `9091` sentry, `9092` consensus engine, `9093` torrent downloader, `9094` transactions pool Supported JSON-RPC calls ([eth](./cmd/rpcdaemon/commands/eth_api.go), [debug](./cmd/rpcdaemon/commands/debug_api.go) , [net](./cmd/rpcdaemon/commands/net_api.go), [web3](./cmd/rpcdaemon/commands/web3_api.go)): @@ -224,19 +291,24 @@ command, [see this table](./cmd/rpcdaemon/README.md#rpc-implementation-status). ### Run all components by docker-compose -Next command starts: Erigon on port 30303, rpcdaemon 8545, prometheus 9090, grafana 3000 +Next command starts: Erigon on port 30303, rpcdaemon on port 8545, prometheus on port 9090, and grafana on port 3000. -``` +```sh make docker-compose -or -XDG_DATA_HOME=/preferred/data/folder make docker-compose +# or +XDG_DATA_HOME=/preferred/data/folder DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 make docker-compose ``` Makefile creates the initial directories for erigon, prometheus and grafana. The PID namespace is shared between erigon and rpcdaemon which is required to open Erigon's DB from another process (RPCDaemon local-mode). See: https://github.com/ledgerwatch/erigon/pull/2392/files -Windows support for docker-compose is not ready yet. Please help us with .ps1 port +If your docker installation requires the docker daemon to run as root (which is by default), you will need to prefix +the command above with `sudo`. However, it is sometimes recommended running docker (and therefore its containers) as a +non-root user for security reasons. For more information about how to do this, refer to +[this article](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user). + +Windows support for docker-compose is not ready yet. Please help us with .ps1 port. ### Grafana dashboard @@ -251,12 +323,79 @@ FAQ ### How much RAM do I need -- Baseline (ext4 SSD): 16Gb RAM sync takes 5 days, 32Gb - 4 days, 64Gb - 3 days +- Baseline (ext4 SSD): 16Gb RAM sync takes 6 days, 32Gb - 5 days, 64Gb - 4 days - +1 day on "zfs compression=off". +2 days on "zfs compression=on" (2x compression ratio). +3 days on btrfs. - -1 day on NVMe Detailed explanation: [./docs/programmers_guide/db_faq.md](./docs/programmers_guide/db_faq.md) +### Default Ports and Protocols / Firewalls? + +#### `erigon` ports + +| Port | Protocol | Purpose | Expose | +|:-----:|:---------:|:----------------------:|:-------:| +| 30303 | TCP & UDP | eth/66 peering | Public | +| 9090 | TCP | gRPC Connections | Private | +| 42069 | TCP & UDP | Snap sync (Bittorrent) | Public | +| 6060 | TCP | Metrics or Pprof | Private | + +Typically, 30303 and 30304 are exposed to the internet to allow incoming peering connections. 9090 is exposed only +internally for rpcdaemon or other connections, (e.g. rpcdaemon -> erigon). + +#### `RPC` ports + +| Port | Protocol | Purpose | Expose | +|:-----:|:---------:|:------------------:|:-------:| +| 8545 | TCP | HTTP & WebSockets | Private | +| 8551 | TCP | HTTP with JWT auth | Private | + +Typically, 8545 is exposed only internally for JSON-RPC queries. Both HTTP and WebSocket connections are on the same port. +Typically, 8551 (JWT authenticated) is exposed only internally for the Engine API JSON-RPC queries. + +#### `sentry` ports + +| Port | Protocol | Purpose | Expose | +|:-----:|:---------:|:----------------:|:-------:| +| 30303 | TCP & UDP | Peering | Public | +| 9091 | TCP | gRPC Connections | Private | + +Typically, a sentry process will run one eth/xx protocol (e.g. eth/66) and will be exposed to the internet on 30303. Port +9091 is for internal gRCP connections (e.g erigon -> sentry). + +#### Other ports + +| Port | Protocol | Purpose | Expose | +|:----:|:--------:|:-------:|:-------:| +| 6060 | TCP | pprof | Private | +| 6060 | TCP | metrics | Private | + +Optional flags can be enabled that enable pprof or metrics (or both) - however, they both run on 6060 by default, so +you'll have to change one if you want to run both at the same time. use `--help` with the binary for more info. + +Reserved for future use: **gRPC ports**: `9092` consensus engine, `9093` snapshot downloader, `9094` TxPool + +### How to get diagnostic for bug report? + +- Get stack trace: `kill -SIGUSR1 `, get trace and stop: `kill -6 ` +- Get CPU profiling: add `--pprof flag` + run `go tool pprof -png http://127.0.0.1:6060/debug/pprof/profile\?seconds\=20 > cpu.png` +- Get RAM profiling: add `--pprof flag` + run `go tool pprof -inuse_space -png http://127.0.0.1:6060/debug/pprof/heap > mem.png` + +### How to run local devnet? + 🔬 Detailed explanation is [here](/DEV_CHAIN.md). + +### Docker permissions error + +Docker uses user erigon with UID/GID 1000 (for security reasons). You can see this user being created in the Dockerfile. +Can fix by giving a host's user ownership of the folder, where the host's user UID/GID is the same as the docker's user UID/GID (1000). +More details in [post](https://www.fullstaq.com/knowledge-hub/blogs/docker-and-the-host-filesystem-owner-matching-problem) + +### Run RaspberyPI + +https://github.com/mathMakesArt/Erigon-on-RPi-4 + Getting in touch ================ @@ -342,3 +481,11 @@ multiple genesis syncs on same Disk. If genesis sync passed, then it's fine to r Please read https://github.com/ledgerwatch/erigon/issues/1516#issuecomment-811958891 In short: network-disks are bad for blocks execution - because blocks execution reading data from db non-parallel non-batched way. + +### Filesystem's background features are expensive + +For example: btrfs's autodefrag option - may increase write IO 100x times + +### Gnome Tracker can kill Erigon + +[Gnome Tracker](https://wiki.gnome.org/Projects/Tracker) - detecting miners and kill them. diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index e6d52455965..2a0559a6fc3 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -46,7 +46,7 @@ func (argument *Argument) UnmarshalJSON(data []byte) error { var arg ArgumentMarshaling err := json.Unmarshal(data, &arg) if err != nil { - return fmt.Errorf("argument json err: %v", err) + return fmt.Errorf("argument json err: %w", err) } argument.Type, err = NewType(arg.Type, arg.InternalType, arg.Components) diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index d2053943bb5..a04bcb9149d 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -66,9 +66,9 @@ var ( // ChainReader, ChainStateReader, ContractBackend, ContractCaller, ContractFilterer, ContractTransactor, // DeployBackend, GasEstimator, GasPricer, LogFilterer, PendingContractCaller, TransactionReader, and TransactionSender type SimulatedBackend struct { - m *stages.MockSentry - getHeader func(hash common.Hash, number uint64) *types.Header - checkTEVM func(common.Hash) (bool, error) + m *stages.MockSentry + getHeader func(hash common.Hash, number uint64) *types.Header + contractHasTEVM func(common.Hash) (bool, error) mu sync.Mutex prependBlock *types.Block @@ -105,7 +105,7 @@ func NewSimulatedBackendWithConfig(alloc core.GenesisAlloc, config *params.Chain return h }, } - backend.checkTEVM = ethdb.GetCheckTEVM(olddb.NewObjectDatabase(m.DB)) + backend.contractHasTEVM = ethdb.GetHasTEVM(olddb.NewObjectDatabase(m.DB)) backend.events = filters.NewEventSystem(&filterBackend{m.DB, backend}) backend.emptyPendingBlock() return backend @@ -125,9 +125,8 @@ func (b *SimulatedBackend) DB() kv.RwDB { } // Close terminates the underlying blockchain's update loop. -func (b *SimulatedBackend) Close() error { - b.m.DB.Close() - return nil +func (b *SimulatedBackend) Close() { + b.m.Close() } // Commit imports all the pending transactions as a single block and starts a @@ -174,9 +173,9 @@ func (b *SimulatedBackend) emptyPendingBlock() { // stateByBlockNumber retrieves a state by a given blocknumber. func (b *SimulatedBackend) stateByBlockNumber(db kv.Tx, blockNumber *big.Int) *state.IntraBlockState { if blockNumber == nil || blockNumber.Cmp(b.pendingBlock.Number()) == 0 { - return state.New(state.NewPlainState(db, b.pendingBlock.NumberU64())) + return state.New(state.NewPlainState(db, b.pendingBlock.NumberU64()+1)) } - return state.New(state.NewPlainState(db, uint64(blockNumber.Int64()))) + return state.New(state.NewPlainState(db, blockNumber.Uint64()+1)) } // CodeAt returns the code associated with a certain account in the blockchain. @@ -267,7 +266,14 @@ func (b *SimulatedBackend) TransactionByHash(ctx context.Context, txHash common. if txn != nil { return txn, true, nil } - txn, _, _, _, err = rawdb.ReadTransaction(tx, txHash) + blockNumber, err := rawdb.ReadTxLookupEntry(tx, txHash) + if err != nil { + return nil, false, err + } + if blockNumber == nil { + return nil, false, ethereum.NotFound + } + txn, _, _, _, err = rawdb.ReadTransaction(tx, txHash, *blockNumber) if err != nil { return nil, false, err } @@ -558,7 +564,7 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs hi = b.pendingBlock.GasLimit() } // Recap the highest gas allowance with account's balance. - if call.GasPrice != nil && call.GasPrice.BitLen() != 0 { + if call.GasPrice != nil && !call.GasPrice.IsZero() { balance := b.pendingState.GetBalance(call.From) // from can't be nil available := balance.ToBig() if call.Value != nil { @@ -637,10 +643,17 @@ func (b *SimulatedBackend) EstimateGas(ctx context.Context, call ethereum.CallMs // callContract implements common code between normal and pending contract calls. // state is modified during execution, make sure to copy it if necessary. func (b *SimulatedBackend) callContract(_ context.Context, call ethereum.CallMsg, block *types.Block, statedb *state.IntraBlockState) (*core.ExecutionResult, error) { + const baseFeeUpperLimit = 880000000 // Ensure message is initialized properly. if call.GasPrice == nil { call.GasPrice = u256.Num1 } + if call.FeeCap == nil { + call.FeeCap = uint256.NewInt(baseFeeUpperLimit) + } + if call.Tip == nil { + call.Tip = uint256.NewInt(baseFeeUpperLimit) + } if call.Gas == 0 { call.Gas = 50000000 } @@ -654,7 +667,7 @@ func (b *SimulatedBackend) callContract(_ context.Context, call ethereum.CallMsg msg := callMsg{call} txContext := core.NewEVMTxContext(msg) - evmContext := core.NewEVMBlockContext(block.Header(), b.getHeader, b.m.Engine, nil, b.checkTEVM) + evmContext := core.NewEVMBlockContext(block.Header(), b.getHeader, b.m.Engine, nil, b.contractHasTEVM) // Create a new environment which holds all relevant information // about the transaction and calling mechanisms. vmEnv := vm.NewEVM(evmContext, txContext, statedb, b.m.ChainConfig, vm.Config{}) @@ -673,7 +686,7 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx types.Transac signer := types.MakeSigner(b.m.ChainConfig, b.pendingBlock.NumberU64()) sender, senderErr := tx.Sender(*signer) if senderErr != nil { - return fmt.Errorf("invalid transaction: %v", senderErr) + return fmt.Errorf("invalid transaction: %w", senderErr) } nonce := b.pendingState.GetNonce(sender) if tx.GetNonce() != nonce { @@ -687,7 +700,7 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx types.Transac &b.pendingHeader.Coinbase, b.gasPool, b.pendingState, state.NewNoopWriter(), b.pendingHeader, tx, - &b.pendingHeader.GasUsed, vm.Config{}, b.checkTEVM); err != nil { + &b.pendingHeader.GasUsed, vm.Config{}, b.contractHasTEVM); err != nil { return err } //fmt.Printf("==== Start producing block %d\n", (b.prependBlock.NumberU64() + 1)) @@ -868,7 +881,15 @@ func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (typ return nil, err } defer tx.Rollback() - b, senders, err := rawdb.ReadBlockByHashWithSenders(tx, hash) + number := rawdb.ReadHeaderNumber(tx, hash) + if number == nil { + return nil, err + } + canonicalHash, err := rawdb.ReadCanonicalHash(tx, *number) + if err != nil { + return nil, fmt.Errorf("requested non-canonical hash %x. canonical=%x", hash, canonicalHash) + } + b, senders, err := rawdb.ReadBlockWithSenders(tx, hash, *number) if err != nil { return nil, err } @@ -881,7 +902,15 @@ func (fb *filterBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*ty return nil, err } defer tx.Rollback() - b, senders, err := rawdb.ReadBlockByHashWithSenders(tx, hash) + number := rawdb.ReadHeaderNumber(tx, hash) + if number == nil { + return nil, err + } + canonicalHash, err := rawdb.ReadCanonicalHash(tx, *number) + if err != nil { + return nil, fmt.Errorf("requested non-canonical hash %x. canonical=%x", hash, canonicalHash) + } + b, senders, err := rawdb.ReadBlockWithSenders(tx, hash, *number) if err != nil { return nil, err } diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go index ba3003cbb60..3e813c91168 100644 --- a/accounts/abi/bind/backends/simulated_test.go +++ b/accounts/abi/bind/backends/simulated_test.go @@ -146,7 +146,7 @@ func TestNewSimulatedBackend(t *testing.T) { }); err != nil { t.Fatal(err) } - statedb := state.New(state.NewPlainState(tx, num)) + statedb := state.New(state.NewPlainState(tx, num+1)) bal := statedb.GetBalance(testAddr) if !bal.Eq(expectedBal) { t.Errorf("expected balance for test address not received. expected: %v actual: %v", expectedBal, bal) diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index b25221cf430..2b30bf7ad68 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -221,7 +221,7 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i if opts.Nonce == nil { nonce, err = c.transactor.PendingNonceAt(ensureContext(opts.Context), opts.From) if err != nil { - return nil, fmt.Errorf("failed to retrieve account nonce: %v", err) + return nil, fmt.Errorf("failed to retrieve account nonce: %w", err) } } else { nonce = opts.Nonce.Uint64() @@ -252,7 +252,7 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i msg := ethereum.CallMsg{From: opts.From, To: contract, GasPrice: gasPrice, Value: value, Data: input} gasLimit, err = c.transactor.EstimateGas(ensureContext(opts.Context), msg) if err != nil { - return nil, fmt.Errorf("failed to estimate gas needed: %v", err) + return nil, fmt.Errorf("failed to estimate gas needed: %w", err) } } // Create the transaction, sign it and schedule it for execution diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 9befda58edc..0e6e832ed1b 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -240,7 +240,7 @@ func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string] if lang == LangGo { code, err := format.Source(buffer.Bytes()) if err != nil { - return "", fmt.Errorf("%v\n%s", err, buffer) + return "", fmt.Errorf("%w\n%s", err, buffer) } return string(code), nil } diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 7f10af56e0a..1302c10dc94 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -14,11 +14,12 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package bind import ( "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -540,7 +541,7 @@ var bindTests = []struct { struct A { bytes32 B; } - + function F() public view returns (A[] memory a, uint256[] memory c, bool[] memory d) { A[] memory a = new A[](2); a[0].B = bytes32(uint256(1234) << 96); @@ -548,7 +549,7 @@ var bindTests = []struct { bool[] memory d; return (a, c, d); } - + function G() public view returns (A[] memory a) { A[] memory a = new A[](2); a[0].B = bytes32(uint256(1234) << 96); @@ -570,10 +571,10 @@ var bindTests = []struct { // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) - + sim := backends.NewSimulatedBackend(t, core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) defer sim.Close() - + // Deploy a structs method invoker contract and execute its default method _, _, structs, err := DeployStructs(auth, sim) if err != nil { @@ -1700,13 +1701,13 @@ var bindTests = []struct { `NewFallbacks`, ` pragma solidity >=0.6.0 <0.7.0; - + contract NewFallbacks { event Fallback(bytes data); fallback() external { emit Fallback(msg.data); } - + event Received(address addr, uint value); receive() external payable { emit Received(msg.sender, msg.value); @@ -1718,7 +1719,7 @@ var bindTests = []struct { ` "bytes" "math/big" - + "github.com/ledgerwatch/erigon/accounts/abi/bind" "github.com/ledgerwatch/erigon/accounts/abi/bind/backends" "github.com/ledgerwatch/erigon/core" @@ -1727,22 +1728,22 @@ var bindTests = []struct { ` key, _ := crypto.GenerateKey() addr := crypto.PubkeyToAddress(key.PublicKey) - + sim := backends.NewSimulatedBackend(t, core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 1000000) defer sim.Close() - + opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337)) _, _, c, err := DeployNewFallbacks(opts, sim) if err != nil { t.Fatalf("Failed to deploy contract: %v", err) } sim.Commit() - + // Test receive function opts.Value = big.NewInt(100) c.Receive(opts) sim.Commit() - + var gotEvent bool iter, _ := c.FilterReceived(nil) defer iter.Close() @@ -1759,14 +1760,14 @@ var bindTests = []struct { if !gotEvent { t.Fatal("Expect to receive event emitted by receive") } - + // Test fallback function gotEvent = false opts.Value = nil calldata := []byte{0x01, 0x02, 0x03} c.Fallback(opts, calldata) sim.Commit() - + iter2, _ := c.FilterFallback(nil) defer iter2.Close() for iter2.Next() { @@ -1815,7 +1816,7 @@ func TestGolangBindings(t *testing.T) { if err != nil { t.Fatalf("test %d: failed to generate binding: %v", i, err) } - if err = ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil { + if err = os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil { t.Fatalf("test %d: failed to write binding: %v", i, err) } // Generate the test file with the injected test code @@ -1831,7 +1832,7 @@ func TestGolangBindings(t *testing.T) { %s } `, tt.imports, tt.name, tt.tester) - if err := ioutil.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { + if err := os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil { t.Fatalf("test %d: failed to write tests: %v", i, err) } } @@ -1924,7 +1925,7 @@ import java.util.*; public class Test { // ABI is the input ABI used to generate the binding from. public final static String ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"u16\",\"type\":\"uint16\"}],\"name\":\"setUint16\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_a\",\"type\":\"bool[2]\"}],\"name\":\"setBoolArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_a\",\"type\":\"address[2]\"}],\"name\":\"setAddressArray\",\"outputs\":[{\"name\":\"\",\"type\":\"address[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_l\",\"type\":\"bytes[]\"}],\"name\":\"setBytesList\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u8\",\"type\":\"uint8\"}],\"name\":\"setUint8\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u32\",\"type\":\"uint32\"}],\"name\":\"setUint32\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_l\",\"type\":\"int256[]\"}],\"name\":\"setInt256List\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_a\",\"type\":\"uint256[2]\"}],\"name\":\"setUint256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_l\",\"type\":\"bool[]\"}],\"name\":\"setBoolList\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_a\",\"type\":\"bytes[2]\"}],\"name\":\"setBytesArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_l\",\"type\":\"address[]\"}],\"name\":\"setAddressList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_a\",\"type\":\"int256[2]\"}],\"name\":\"setInt256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_a\",\"type\":\"string[2]\"}],\"name\":\"setStringArray\",\"outputs\":[{\"name\":\"\",\"type\":\"string[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u64\",\"type\":\"uint64\"}],\"name\":\"setUint64\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i16\",\"type\":\"int16\"}],\"name\":\"setInt16\",\"outputs\":[{\"name\":\"\",\"type\":\"int16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i8\",\"type\":\"int8\"}],\"name\":\"setInt8\",\"outputs\":[{\"name\":\"\",\"type\":\"int8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_l\",\"type\":\"uint256[]\"}],\"name\":\"setUint256List\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256\",\"type\":\"int256\"}],\"name\":\"setInt256\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i32\",\"type\":\"int32\"}],\"name\":\"setInt32\",\"outputs\":[{\"name\":\"\",\"type\":\"int32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b32\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_l\",\"type\":\"string[]\"}],\"name\":\"setStringList\",\"outputs\":[{\"name\":\"\",\"type\":\"string[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256\",\"type\":\"uint256\"}],\"name\":\"setUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i64\",\"type\":\"int64\"}],\"name\":\"setInt64\",\"outputs\":[{\"name\":\"\",\"type\":\"int64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b1\",\"type\":\"bytes1\"}],\"name\":\"setBytes1\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes1\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"; - + // BYTECODE is the compiled bytecode used for deploying new contracts. public final static String BYTECODE = "0x608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037"; @@ -1941,7 +1942,7 @@ public class Test { this.Deployer = deployment.getDeployer(); this.Contract = deployment; } - + // Ethereum address where this contract is located at. public final Address Address; @@ -1962,277 +1963,277 @@ public class Test { public Transaction setAddress(TransactOpts opts, Address a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setAddress(a);args.set(0,arg0); - + return this.Contract.transact(opts, "setAddress" , args); } - + // setAddressArray is a paid mutator transaction binding the contract method 0x151f5471. // // Solidity: function setAddressArray(address[2] a_a) returns(address[2]) public Transaction setAddressArray(TransactOpts opts, Addresses a_a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setAddresses(a_a);args.set(0,arg0); - + return this.Contract.transact(opts, "setAddressArray" , args); } - + // setAddressList is a paid mutator transaction binding the contract method 0x5be6b37e. // // Solidity: function setAddressList(address[] a_l) returns(address[]) public Transaction setAddressList(TransactOpts opts, Addresses a_l) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setAddresses(a_l);args.set(0,arg0); - + return this.Contract.transact(opts, "setAddressList" , args); } - + // setBool is a paid mutator transaction binding the contract method 0x1e26fd33. // // Solidity: function setBool(bool b) returns(bool) public Transaction setBool(TransactOpts opts, boolean b) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBool(b);args.set(0,arg0); - + return this.Contract.transact(opts, "setBool" , args); } - + // setBoolArray is a paid mutator transaction binding the contract method 0x118a9718. // // Solidity: function setBoolArray(bool[2] b_a) returns(bool[2]) public Transaction setBoolArray(TransactOpts opts, Bools b_a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBools(b_a);args.set(0,arg0); - + return this.Contract.transact(opts, "setBoolArray" , args); } - + // setBoolList is a paid mutator transaction binding the contract method 0x4d5ee6da. // // Solidity: function setBoolList(bool[] b_l) returns(bool[]) public Transaction setBoolList(TransactOpts opts, Bools b_l) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBools(b_l);args.set(0,arg0); - + return this.Contract.transact(opts, "setBoolList" , args); } - + // setBytes is a paid mutator transaction binding the contract method 0xda359dc8. // // Solidity: function setBytes(bytes bs) returns(bytes) public Transaction setBytes(TransactOpts opts, byte[] bs) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBinary(bs);args.set(0,arg0); - + return this.Contract.transact(opts, "setBytes" , args); } - + // setBytes1 is a paid mutator transaction binding the contract method 0xfba1a1c3. // // Solidity: function setBytes1(bytes1 b1) returns(bytes1) public Transaction setBytes1(TransactOpts opts, byte[] b1) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBinary(b1);args.set(0,arg0); - + return this.Contract.transact(opts, "setBytes1" , args); } - + // setBytes32 is a paid mutator transaction binding the contract method 0xc2b12a73. // // Solidity: function setBytes32(bytes32 b32) returns(bytes32) public Transaction setBytes32(TransactOpts opts, byte[] b32) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBinary(b32);args.set(0,arg0); - + return this.Contract.transact(opts, "setBytes32" , args); } - + // setBytesArray is a paid mutator transaction binding the contract method 0x5119655d. // // Solidity: function setBytesArray(bytes[2] bs_a) returns(bytes[2]) public Transaction setBytesArray(TransactOpts opts, Binaries bs_a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_a);args.set(0,arg0); - + return this.Contract.transact(opts, "setBytesArray" , args); } - + // setBytesList is a paid mutator transaction binding the contract method 0x16c105e2. // // Solidity: function setBytesList(bytes[] bs_l) returns(bytes[]) public Transaction setBytesList(TransactOpts opts, Binaries bs_l) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_l);args.set(0,arg0); - + return this.Contract.transact(opts, "setBytesList" , args); } - + // setInt16 is a paid mutator transaction binding the contract method 0x86114cea. // // Solidity: function setInt16(int16 i16) returns(int16) public Transaction setInt16(TransactOpts opts, short i16) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setInt16(i16);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt16" , args); } - + // setInt256 is a paid mutator transaction binding the contract method 0xa53b1c1e. // // Solidity: function setInt256(int256 i256) returns(int256) public Transaction setInt256(TransactOpts opts, BigInt i256) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBigInt(i256);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt256" , args); } - + // setInt256Array is a paid mutator transaction binding the contract method 0x6aa482fc. // // Solidity: function setInt256Array(int256[2] i256_a) returns(int256[2]) public Transaction setInt256Array(TransactOpts opts, BigInts i256_a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_a);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt256Array" , args); } - + // setInt256List is a paid mutator transaction binding the contract method 0x22722302. // // Solidity: function setInt256List(int256[] i256_l) returns(int256[]) public Transaction setInt256List(TransactOpts opts, BigInts i256_l) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_l);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt256List" , args); } - + // setInt32 is a paid mutator transaction binding the contract method 0xb7d5df31. // // Solidity: function setInt32(int32 i32) returns(int32) public Transaction setInt32(TransactOpts opts, int i32) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setInt32(i32);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt32" , args); } - + // setInt64 is a paid mutator transaction binding the contract method 0xe673eb32. // // Solidity: function setInt64(int64 i64) returns(int64) public Transaction setInt64(TransactOpts opts, long i64) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setInt64(i64);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt64" , args); } - + // setInt8 is a paid mutator transaction binding the contract method 0x9a19a953. // // Solidity: function setInt8(int8 i8) returns(int8) public Transaction setInt8(TransactOpts opts, byte i8) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setInt8(i8);args.set(0,arg0); - + return this.Contract.transact(opts, "setInt8" , args); } - + // setString is a paid mutator transaction binding the contract method 0x7fcaf666. // // Solidity: function setString(string s) returns(string) public Transaction setString(TransactOpts opts, String s) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setString(s);args.set(0,arg0); - + return this.Contract.transact(opts, "setString" , args); } - + // setStringArray is a paid mutator transaction binding the contract method 0x7173b695. // // Solidity: function setStringArray(string[2] s_a) returns(string[2]) public Transaction setStringArray(TransactOpts opts, Strings s_a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setStrings(s_a);args.set(0,arg0); - + return this.Contract.transact(opts, "setStringArray" , args); } - + // setStringList is a paid mutator transaction binding the contract method 0xc5777961. // // Solidity: function setStringList(string[] s_l) returns(string[]) public Transaction setStringList(TransactOpts opts, Strings s_l) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setStrings(s_l);args.set(0,arg0); - + return this.Contract.transact(opts, "setStringList" , args); } - + // setUint16 is a paid mutator transaction binding the contract method 0x0477988a. // // Solidity: function setUint16(uint16 u16) returns(uint16) public Transaction setUint16(TransactOpts opts, BigInt u16) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setUint16(u16);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint16" , args); } - + // setUint256 is a paid mutator transaction binding the contract method 0xd2282dc5. // // Solidity: function setUint256(uint256 u256) returns(uint256) public Transaction setUint256(TransactOpts opts, BigInt u256) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBigInt(u256);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint256" , args); } - + // setUint256Array is a paid mutator transaction binding the contract method 0x2766a755. // // Solidity: function setUint256Array(uint256[2] u256_a) returns(uint256[2]) public Transaction setUint256Array(TransactOpts opts, BigInts u256_a) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_a);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint256Array" , args); } - + // setUint256List is a paid mutator transaction binding the contract method 0xa0709e19. // // Solidity: function setUint256List(uint256[] u256_l) returns(uint256[]) public Transaction setUint256List(TransactOpts opts, BigInts u256_l) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_l);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint256List" , args); } - + // setUint32 is a paid mutator transaction binding the contract method 0x1c9352e2. // // Solidity: function setUint32(uint32 u32) returns(uint32) public Transaction setUint32(TransactOpts opts, BigInt u32) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setUint32(u32);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint32" , args); } - + // setUint64 is a paid mutator transaction binding the contract method 0x822cba69. // // Solidity: function setUint64(uint64 u64) returns(uint64) public Transaction setUint64(TransactOpts opts, BigInt u64) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setUint64(u64);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint64" , args); } - + // setUint8 is a paid mutator transaction binding the contract method 0x1774e646. // // Solidity: function setUint8(uint8 u8) returns(uint8) public Transaction setUint8(TransactOpts opts, BigInt u8) throws Exception { Interfaces args = Geth.newInterfaces(1); Interface arg0 = Geth.newInterface();arg0.setUint8(u8);args.set(0,arg0); - + return this.Contract.transact(opts, "setUint8" , args); } } diff --git a/accounts/abi/type.go b/accounts/abi/type.go index 7272b9440bf..199410da840 100644 --- a/accounts/abi/type.go +++ b/accounts/abi/type.go @@ -103,7 +103,7 @@ func NewType(t string, internalType string, components []ArgumentMarshaling) (ty typ.Elem = &embeddedType typ.Size, err = strconv.Atoi(intz[0]) if err != nil { - return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) + return Type{}, fmt.Errorf("abi: error parsing variable size: %w", err) } typ.stringKind = embeddedType.stringKind + sliced } else { @@ -124,7 +124,7 @@ func NewType(t string, internalType string, components []ArgumentMarshaling) (ty var err error varSize, err = strconv.Atoi(parsedType[2]) if err != nil { - return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) + return Type{}, fmt.Errorf("abi: error parsing variable size: %w", err) } } else { if parsedType[0] == "uint" || parsedType[0] == "int" { diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go index cc617254c04..2d169d65f96 100644 --- a/accounts/abi/unpack_test.go +++ b/accounts/abi/unpack_test.go @@ -66,9 +66,9 @@ type unpackTest struct { func (test unpackTest) checkError(err error) error { if err != nil { if len(test.err) == 0 { - return fmt.Errorf("expected no err but got: %v", err) + return fmt.Errorf("expected no err but got: %w", err) } else if err.Error() != test.err { - return fmt.Errorf("expected err: '%v' got err: %q", test.err, err) + return fmt.Errorf("expected err: '%v' got err: %w", test.err, err) } } else if len(test.err) > 0 { return fmt.Errorf("expected err: %v but got none", test.err) diff --git a/cmd/abigen/main.go b/cmd/abigen/main.go index b1a3a5214d2..2eeac93eb06 100644 --- a/cmd/abigen/main.go +++ b/cmd/abigen/main.go @@ -19,7 +19,7 @@ package main import ( "encoding/json" "fmt" - "io/ioutil" + "io" "os" "path/filepath" "regexp" @@ -115,7 +115,6 @@ func init() { aliasFlag, } app.Action = abigen - cli.CommandHelpTemplate = flags.OriginCommandHelpTemplate } func abigen(c *cli.Context) error { @@ -152,9 +151,9 @@ func abigen(c *cli.Context) error { ) input := c.GlobalString(abiFlag.Name) if input == "-" { - abi, err = ioutil.ReadAll(os.Stdin) + abi, err = io.ReadAll(os.Stdin) } else { - abi, err = ioutil.ReadFile(input) + abi, err = os.ReadFile(input) } if err != nil { utils.Fatalf("Failed to read input ABI: %v", err) @@ -163,7 +162,7 @@ func abigen(c *cli.Context) error { var bin []byte if binFile := c.GlobalString(binFlag.Name); binFile != "" { - if bin, err = ioutil.ReadFile(binFile); err != nil { + if bin, err = os.ReadFile(binFile); err != nil { utils.Fatalf("Failed to read input bytecode: %v", err) } if strings.Contains(string(bin), "//") { @@ -210,7 +209,7 @@ func abigen(c *cli.Context) error { } case c.GlobalIsSet(jsonFlag.Name): - jsonOutput, err := ioutil.ReadFile(c.GlobalString(jsonFlag.Name)) + jsonOutput, err := os.ReadFile(c.GlobalString(jsonFlag.Name)) if err != nil { utils.Fatalf("Failed to read combined-json from compiler: %v", err) } @@ -260,7 +259,7 @@ func abigen(c *cli.Context) error { fmt.Printf("%s\n", code) return nil } - if err := ioutil.WriteFile(c.GlobalString(outFlag.Name), []byte(code), 0600); err != nil { + if err := os.WriteFile(c.GlobalString(outFlag.Name), []byte(code), 0600); err != nil { utils.Fatalf("Failed to write ABI binding: %v", err) } return nil diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index 986b8939a12..7a36c249cc8 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -21,6 +21,7 @@ import ( "crypto/ecdsa" "flag" "fmt" + "github.com/ledgerwatch/erigon-lib/common" "net" "os" @@ -40,7 +41,7 @@ func main() { writeAddr = flag.Bool("writeaddress", false, "write out the node's public key and quit") nodeKeyFile = flag.String("nodekey", "", "private key filename") nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)") - natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:)") + natdesc = flag.String(utils.NATFlag.Name, "", utils.NATFlag.Usage) netrestrict = flag.String("netrestrict", "", "restrict network communication to the given IP networks (CIDR masks)") runv5 = flag.Bool("v5", false, "run a v5 topic discovery bootnode") verbosity = flag.Int("verbosity", int(log.LvlInfo), "log verbosity (0-5)") @@ -87,7 +88,7 @@ func main() { } if *writeAddr { - fmt.Printf("%x\n", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:]) + fmt.Printf("%x\n", crypto.MarshalPubkey(&nodeKey.PublicKey)) os.Exit(0) } @@ -110,7 +111,7 @@ func main() { realaddr := conn.LocalAddr().(*net.UDPAddr) if natm != nil { - if !realaddr.IP.IsLoopback() { + if !realaddr.IP.IsLoopback() && natm.SupportsMapping() { go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") } if ext, err := natm.ExternalIP(); err == nil { @@ -129,12 +130,16 @@ func main() { PrivateKey: nodeKey, NetRestrict: restrictList, } + + ctx, cancel := common.RootContext() + defer cancel() + if *runv5 { - if _, err := discover.ListenV5(conn, ln, cfg); err != nil { + if _, err := discover.ListenV5(ctx, conn, ln, cfg); err != nil { utils.Fatalf("%v", err) } } else { - if _, err := discover.ListenUDP(conn, ln, cfg); err != nil { + if _, err := discover.ListenUDP(ctx, conn, ln, cfg); err != nil { utils.Fatalf("%v", err) } } diff --git a/cmd/cons/commands/clique.go b/cmd/cons/commands/clique.go index efef2f9b643..c63e6f23b82 100644 --- a/cmd/cons/commands/clique.go +++ b/cmd/cons/commands/clique.go @@ -15,17 +15,15 @@ import ( grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" - grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/holiman/uint256" + common2 "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/gointerfaces" proto_cons "github.com/ledgerwatch/erigon-lib/gointerfaces/consensus" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus/clique" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/log/v3" "github.com/pelletier/go-toml" @@ -40,7 +38,7 @@ var configs embed.FS func init() { withApiAddr(cliqueCmd) - withDatadir(cliqueCmd) + withDataDir(cliqueCmd) withConfig(cliqueCmd) rootCmd.AddCommand(cliqueCmd) } @@ -49,7 +47,7 @@ var cliqueCmd = &cobra.Command{ Use: "clique", Short: "Run clique consensus engine", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() return cliqueEngine(ctx, logger) }, @@ -87,7 +85,7 @@ func cliqueEngine(ctx context.Context, logger log.Logger) error { } } server.db = openDB(filepath.Join(datadir, "clique", "db"), logger) - server.c = clique.New(server.chainConfig, ¶ms.SnapshotConfig{}, server.db) + server.c = clique.New(server.chainConfig, params.CliqueSnapshot, server.db) <-ctx.Done() return nil } @@ -109,10 +107,10 @@ func grpcCliqueServer(ctx context.Context, testServer bool) (*CliqueServerImpl, streamInterceptors []grpc.StreamServerInterceptor unaryInterceptors []grpc.UnaryServerInterceptor ) - if metrics.Enabled { - streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) - unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) - } + //if metrics.Enabled { + //streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) + //unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) + //} streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) var grpcServer *grpc.Server @@ -125,6 +123,12 @@ func grpcCliqueServer(ctx context.Context, testServer bool) (*CliqueServerImpl, grpc.KeepaliveParams(keepalive.ServerParameters{ Time: 10 * time.Minute, }), + // Don't drop the connection, settings accordign to this comment on GitHub + // https://github.com/grpc/grpc-go/issues/3171#issuecomment-552796779 + grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ + MinTime: 10 * time.Second, + PermitWithoutStream: true, + }), grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(streamInterceptors...)), grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(unaryInterceptors...)), } @@ -135,9 +139,9 @@ func grpcCliqueServer(ctx context.Context, testServer bool) (*CliqueServerImpl, if testServer { proto_cons.RegisterTestServer(grpcServer, cliqueServer) } - if metrics.Enabled { - grpc_prometheus.Register(grpcServer) - } + //if metrics.Enabled { + // grpc_prometheus.Register(grpcServer) + //} go func() { if err1 := grpcServer.Serve(lis); err1 != nil { log.Error("Clique server fail", "err", err1) @@ -223,10 +227,9 @@ func (cs *CliqueServerImpl) initAndConfig(configuration []byte) error { case "homestead": chainConfig.HomesteadBlock = bigNumber case "tangerine": - chainConfig.EIP150Block = bigNumber + chainConfig.TangerineWhistleBlock = bigNumber case "spurious": - chainConfig.EIP155Block = bigNumber - chainConfig.EIP158Block = bigNumber + chainConfig.SpuriousDragonBlock = bigNumber case "byzantium": chainConfig.ByzantiumBlock = bigNumber case "constantinople": diff --git a/cmd/cons/commands/root.go b/cmd/cons/commands/root.go index 32602d91d89..0e4a57d5c37 100644 --- a/cmd/cons/commands/root.go +++ b/cmd/cons/commands/root.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/mdbx" "github.com/ledgerwatch/erigon/cmd/utils" @@ -37,7 +38,7 @@ var rootCmd = &cobra.Command{ } func Execute() { - ctx, _ := utils.RootContext() + ctx, _ := common.RootContext() if err := rootCmd.ExecuteContext(ctx); err != nil { fmt.Println(err) os.Exit(1) @@ -50,7 +51,7 @@ func must(err error) { } } -func withDatadir(cmd *cobra.Command) { +func withDataDir(cmd *cobra.Command) { cmd.Flags().StringVar(&datadir, "datadir", paths.DefaultDataDir(), "directory where databases and temporary files are kept") must(cmd.MarkFlagDirname("datadir")) } diff --git a/cmd/devnettest/commands/account.go b/cmd/devnettest/commands/account.go new file mode 100644 index 00000000000..80ee5b375de --- /dev/null +++ b/cmd/devnettest/commands/account.go @@ -0,0 +1,69 @@ +package commands + +import ( + "fmt" + + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/ledgerwatch/erigon/common" + "github.com/spf13/cobra" +) + +const ( + devAddress = "0x67b1d87101671b127f5f8714789C7192f7ad340e" + blockNum = "latest" +) + +func init() { + rootCmd.AddCommand(getBalanceCmd) + rootCmd.AddCommand(getTransactionCountCmd) +} + +var getBalanceCmd = &cobra.Command{ + Use: "get-balance", + Short: fmt.Sprintf("Checks balance for the address: %q", devAddress), + Run: func(cmd *cobra.Command, args []string) { + callGetBalance(devAddress, blockNum, 0) + }, +} + +var getTransactionCountCmd = &cobra.Command{ + Use: "get-transaction-count", + Short: fmt.Sprintf("Gets nonce for the address: %q", devAddress), + Run: func(cmd *cobra.Command, args []string) { + callGetTransactionCount(devAddress, blockNum, 0) + }, +} + +func callGetBalance(addr, blockNum string, checkBal uint64) { + fmt.Printf("Getting balance for address: %q...\n", addr) + address := common.HexToAddress(addr) + bal, err := requests.GetBalance(reqId, address, blockNum) + if err != nil { + fmt.Printf("FAILURE => %v\n", err) + return + } + + if checkBal > 0 && checkBal != bal { + fmt.Printf("FAILURE => Balance should be %d, got %d\n", checkBal, bal) + return + } + + fmt.Printf("SUCCESS => Balance: %d\n", bal) +} + +func callGetTransactionCount(addr, blockNum string, checkNonce uint64) { + fmt.Printf("Getting nonce for address: %q...\n", addr) + address := common.HexToAddress(addr) + nonce, err := requests.GetTransactionCountCmd(reqId, address, blockNum) + if err != nil { + fmt.Printf("FAILURE => %v\n", err) + return + } + + if checkNonce > 0 && checkNonce != nonce { + fmt.Printf("FAILURE => Nonce should be %d, got %d\n", checkNonce, nonce) + return + } + + fmt.Printf("SUCCESS => Nonce: %d\n", nonce) +} diff --git a/cmd/devnettest/commands/all.go b/cmd/devnettest/commands/all.go new file mode 100644 index 00000000000..4da64a1643e --- /dev/null +++ b/cmd/devnettest/commands/all.go @@ -0,0 +1,50 @@ +package commands + +import ( + "fmt" + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(allCmd) +} + +var allCmd = &cobra.Command{ + Use: "all", + Short: "Runs all the simulation tests for erigon devnet", + Run: func(cmd *cobra.Command, args []string) { + // Test connection to JSON RPC + fmt.Println("Mocking get requests to JSON RPC...") + callMockGetRequest() + fmt.Println() + + // First get balance of the receiver's account + callGetBalance(recvAddr, blockNum, 0) + fmt.Println() + + // Send a token from the dev address to the receiver's address + callSendRegularTxAndSearchBlock(sendValue, devAddress, recvAddr, true) + fmt.Println() + + // Check the balance to make sure the receiver received such token + callGetBalance(recvAddr, blockNum, sendValue) + fmt.Println() + + // Get the nonce of the devAddress, it should be 1 + callGetTransactionCount(devAddress, blockNum, 1) + fmt.Println() + + // Create a contract transaction signed by the dev address and emit a log for it + // callContractTx() + // time.Sleep(erigon.DevPeriod * 2 * time.Second) + // fmt.Println() + + // Get the nonce of the devAddress, check that it is 3 + // callGetTransactionCount(devAddress, blockNum, 3) + // fmt.Println() + + // Confirm that the txpool is empty (meaning all txs have been mined) + fmt.Println("Confirming the tx pool is empty...") + showTxPoolContent() + }, +} diff --git a/cmd/devnettest/commands/block.go b/cmd/devnettest/commands/block.go new file mode 100644 index 00000000000..a688ea5c170 --- /dev/null +++ b/cmd/devnettest/commands/block.go @@ -0,0 +1,97 @@ +package commands + +import ( + "context" + "fmt" + "time" + + "github.com/ledgerwatch/erigon/cmd/devnettest/erigon" + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/ledgerwatch/erigon/cmd/devnettest/services" + "github.com/spf13/cobra" +) + +const ( + recvAddr = "0x71562b71999873DB5b286dF957af199Ec94617F7" + sendValue uint64 = 10000 +) + +func init() { + rootCmd.AddCommand(sendTxCmd) +} + +var sendTxCmd = &cobra.Command{ + Use: "send-tx", + Short: "Sends a transaction", + Run: func(cmd *cobra.Command, args []string) { + callSendRegularTxAndSearchBlock(sendValue, recvAddr, devAddress, true) + }, +} + +func callSendRegularTxAndSearchBlock(value uint64, fromAddr, toAddr string, search bool) { + fmt.Printf("Sending %d ETH from %q to %q...\n", value, fromAddr, toAddr) + + nonce, err := services.GetNonce(reqId) + if err != nil { + fmt.Printf("failed to get latest nonce: %v\n", err) + return + } + + // subscriptionContract is the handler to the contract for further operations + signedTx, _, _, _, err := services.CreateTransaction("regular", toAddr, value, nonce) + if err != nil { + fmt.Printf("failed to create transaction: %v\n", err) + return + } + + hash, err := requests.SendTx(reqId, signedTx) + if err != nil { + fmt.Printf("failed to send transaction: %v\n", err) + return + } + + fmt.Printf("SUCCESS => Tx submitted, adding tx with hash %q to txpool\n", hash) + + if search { + if _, err := services.SearchBlockForTx(*hash); err != nil { + fmt.Printf("error searching block for tx: %v\n", err) + return + } + } + + err = services.ApplyTransaction(context.Background(), *signedTx) + if err != nil { + fmt.Printf("failed to apply transaction: %v\n", err) + return + } +} + +func callContractTx() { + nonce, err := services.GetNonce(reqId) + if err != nil { + fmt.Printf("failed to get latest nonce: %v\n", err) + return + } + + // subscriptionContract is the handler to the contract for further operations + signedTx, address, subscriptionContract, transactOpts, err := services.CreateTransaction("contract", "", 0, nonce) + if err != nil { + fmt.Printf("failed to create transaction: %v\n", err) + return + } + + fmt.Println("Creating contract tx...") + hash, err := requests.SendTx(reqId, signedTx) + if err != nil { + fmt.Printf("failed to send transaction: %v\n", err) + return + } + fmt.Printf("SUCCESS => Tx submitted, adding tx with hash %q to txpool\n", hash) + + time.Sleep(erigon.DevPeriod * time.Second) + + if err := services.EmitEventAndGetLogs(reqId, subscriptionContract, transactOpts, address); err != nil { + fmt.Printf("failed to emit events: %v\n", err) + return + } +} diff --git a/cmd/devnettest/commands/event.go b/cmd/devnettest/commands/event.go new file mode 100644 index 00000000000..bd59b052c6e --- /dev/null +++ b/cmd/devnettest/commands/event.go @@ -0,0 +1,40 @@ +package commands + +import ( + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/services" + "github.com/spf13/cobra" + "sync" +) + +var ( + //eventAddrs = []string{devAddress, recvAddr} + eventTopics []string +) + +func init() { + rootCmd.AddCommand(LogsCmd) +} + +var LogsCmd = &cobra.Command{ + Use: "logs", + Short: "Subscribes to log event sends a notification each time a new log appears", + Run: func(cmd *cobra.Command, args []string) { + callLogs() + }, +} + +var wg sync.WaitGroup + +func callLogs() { + wg.Add(1) + go func() { + if err := services.Logs([]string{}, eventTopics); err != nil { + fmt.Printf("could not subscribe to log events: %v\n", err) + } + defer wg.Done() + }() + wg.Wait() + + callContractTx() +} diff --git a/cmd/devnettest/commands/parity.go b/cmd/devnettest/commands/parity.go new file mode 100644 index 00000000000..e07d4169cba --- /dev/null +++ b/cmd/devnettest/commands/parity.go @@ -0,0 +1,42 @@ +package commands + +import ( + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/services" + "strings" + + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/ledgerwatch/erigon/common" + "github.com/spf13/cobra" +) + +var ( + offsetAddr string + quantity int +) + +func init() { + //listStorageKeysCmd.Flags().StringVar(&services.DevAddress, "addr", "", "String address to list keys") + //listStorageKeysCmd.MarkFlagRequired("addr") + //listStorageKeysCmd.Flags().StringVar(&offsetAddr, "offset", "", "Offset storage key from which the batch should start") + //listStorageKeysCmd.Flags().IntVar(&quantity, "quantity", 10, "Integer number of addresses to display in a batch") + //listStorageKeysCmd.Flags().StringVar(&blockNum, "block", "latest", "Integer block number, or the string 'latest', 'earliest' or 'pending'; now only 'latest' is available") + + rootCmd.AddCommand(listStorageKeysCmd) +} + +var listStorageKeysCmd = &cobra.Command{ + Use: "parity-list", + Short: "Returns all storage keys of the given address", + RunE: func(cmd *cobra.Command, args []string) error { + if !common.IsHexAddress(services.DevAddress) { + return fmt.Errorf("address: %v, is not a valid hex address\n", services.DevAddress) + } + toAddress := common.HexToAddress(services.DevAddress) + offset := common.Hex2Bytes(strings.TrimSuffix(offsetAddr, "0x")) + if err := requests.ParityList(reqId, toAddress, quantity, offset, blockNum); err != nil { + fmt.Printf("error getting parity list: %v\n", err) + } + return nil + }, +} diff --git a/cmd/devnettest/commands/requests.go b/cmd/devnettest/commands/requests.go new file mode 100644 index 00000000000..d34bc363037 --- /dev/null +++ b/cmd/devnettest/commands/requests.go @@ -0,0 +1,25 @@ +package commands + +import ( + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(mockRequestCmd) +} + +var mockRequestCmd = &cobra.Command{ + Use: "mock", + Short: "Mocks a request on the devnet", + Run: func(cmd *cobra.Command, args []string) { + callMockGetRequest() + }, +} + +func callMockGetRequest() { + if err := requests.MockGetRequest(reqId); err != nil { + fmt.Printf("error mocking get request: %v\n", err) + } +} diff --git a/cmd/devnettest/commands/root.go b/cmd/devnettest/commands/root.go new file mode 100644 index 00000000000..8cecb0f03ed --- /dev/null +++ b/cmd/devnettest/commands/root.go @@ -0,0 +1,23 @@ +package commands + +import ( + "github.com/spf13/cobra" +) + +var ( + reqId int +) + +func init() { + rootCmd.PersistentFlags().IntVar(&reqId, "req-id", 0, "Defines number of request id") +} + +var rootCmd = &cobra.Command{ + Use: "devnettest", + Short: "Devnettest root command", +} + +// Execute executes the root command. +func Execute() error { + return rootCmd.Execute() +} diff --git a/cmd/devnettest/commands/tx.go b/cmd/devnettest/commands/tx.go new file mode 100644 index 00000000000..2710002889c --- /dev/null +++ b/cmd/devnettest/commands/tx.go @@ -0,0 +1,26 @@ +package commands + +import ( + "fmt" + + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(txPoolCmd) +} + +var txPoolCmd = &cobra.Command{ + Use: "txpool-content", + Short: "Gets content of txpool", + Run: func(cmd *cobra.Command, args []string) { + showTxPoolContent() + }, +} + +func showTxPoolContent() { + if err := requests.TxpoolContent(reqId); err != nil { + fmt.Printf("error getting txpool content: %v\n", err) + } +} diff --git a/cmd/devnettest/contracts/build/Subscription.abi b/cmd/devnettest/contracts/build/Subscription.abi new file mode 100644 index 00000000000..ccb0c274f26 --- /dev/null +++ b/cmd/devnettest/contracts/build/Subscription.abi @@ -0,0 +1 @@ +[{"anonymous":false,"inputs":[],"name":"SubscriptionEvent","type":"event"},{"stateMutability":"nonpayable","type":"fallback"}] \ No newline at end of file diff --git a/cmd/devnettest/contracts/build/Subscription.bin b/cmd/devnettest/contracts/build/Subscription.bin new file mode 100644 index 00000000000..2c423f4bd32 --- /dev/null +++ b/cmd/devnettest/contracts/build/Subscription.bin @@ -0,0 +1 @@ +6080604052348015600f57600080fd5b50607180601d6000396000f3fe6080604052348015600f57600080fd5b506040517f67abc7edb0ab50964ef0e90541d39366b9c69f6f714520f2ff4570059ee8ad8090600090a100fea264697066735822122045a70478ef4f6a283c0e153ad72ec6731dc9ee2e1c191c7334b74dea21a92eaf64736f6c634300080c0033 \ No newline at end of file diff --git a/cmd/devnettest/contracts/gen_subscription.go b/cmd/devnettest/contracts/gen_subscription.go new file mode 100644 index 00000000000..f308506f4b9 --- /dev/null +++ b/cmd/devnettest/contracts/gen_subscription.go @@ -0,0 +1,343 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contracts + +import ( + "math/big" + "strings" + + ethereum "github.com/ledgerwatch/erigon" + "github.com/ledgerwatch/erigon/accounts/abi" + "github.com/ledgerwatch/erigon/accounts/abi/bind" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// SubscriptionABI is the input ABI used to generate the binding from. +const SubscriptionABI = "[{\"anonymous\":false,\"inputs\":[],\"name\":\"SubscriptionEvent\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"}]" + +// SubscriptionBin is the compiled bytecode used for deploying new contracts. +var SubscriptionBin = "0x6080604052348015600f57600080fd5b50607180601d6000396000f3fe6080604052348015600f57600080fd5b506040517f67abc7edb0ab50964ef0e90541d39366b9c69f6f714520f2ff4570059ee8ad8090600090a100fea264697066735822122045a70478ef4f6a283c0e153ad72ec6731dc9ee2e1c191c7334b74dea21a92eaf64736f6c634300080c0033" + +// DeploySubscription deploys a new Ethereum contract, binding an instance of Subscription to it. +func DeploySubscription(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, types.Transaction, *Subscription, error) { + parsed, err := abi.JSON(strings.NewReader(SubscriptionABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SubscriptionBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Subscription{SubscriptionCaller: SubscriptionCaller{contract: contract}, SubscriptionTransactor: SubscriptionTransactor{contract: contract}, SubscriptionFilterer: SubscriptionFilterer{contract: contract}}, nil +} + +// Subscription is an auto generated Go binding around an Ethereum contract. +type Subscription struct { + SubscriptionCaller // Read-only binding to the contract + SubscriptionTransactor // Write-only binding to the contract + SubscriptionFilterer // Log filterer for contract events +} + +// SubscriptionCaller is an auto generated read-only Go binding around an Ethereum contract. +type SubscriptionCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SubscriptionTransactor is an auto generated write-only Go binding around an Ethereum contract. +type SubscriptionTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SubscriptionFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type SubscriptionFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// SubscriptionSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type SubscriptionSession struct { + Contract *Subscription // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SubscriptionCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type SubscriptionCallerSession struct { + Contract *SubscriptionCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// SubscriptionTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type SubscriptionTransactorSession struct { + Contract *SubscriptionTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// SubscriptionRaw is an auto generated low-level Go binding around an Ethereum contract. +type SubscriptionRaw struct { + Contract *Subscription // Generic contract binding to access the raw methods on +} + +// SubscriptionCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type SubscriptionCallerRaw struct { + Contract *SubscriptionCaller // Generic read-only contract binding to access the raw methods on +} + +// SubscriptionTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type SubscriptionTransactorRaw struct { + Contract *SubscriptionTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewSubscription creates a new instance of Subscription, bound to a specific deployed contract. +func NewSubscription(address common.Address, backend bind.ContractBackend) (*Subscription, error) { + contract, err := bindSubscription(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Subscription{SubscriptionCaller: SubscriptionCaller{contract: contract}, SubscriptionTransactor: SubscriptionTransactor{contract: contract}, SubscriptionFilterer: SubscriptionFilterer{contract: contract}}, nil +} + +// NewSubscriptionCaller creates a new read-only instance of Subscription, bound to a specific deployed contract. +func NewSubscriptionCaller(address common.Address, caller bind.ContractCaller) (*SubscriptionCaller, error) { + contract, err := bindSubscription(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SubscriptionCaller{contract: contract}, nil +} + +// NewSubscriptionTransactor creates a new write-only instance of Subscription, bound to a specific deployed contract. +func NewSubscriptionTransactor(address common.Address, transactor bind.ContractTransactor) (*SubscriptionTransactor, error) { + contract, err := bindSubscription(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SubscriptionTransactor{contract: contract}, nil +} + +// NewSubscriptionFilterer creates a new log filterer instance of Subscription, bound to a specific deployed contract. +func NewSubscriptionFilterer(address common.Address, filterer bind.ContractFilterer) (*SubscriptionFilterer, error) { + contract, err := bindSubscription(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SubscriptionFilterer{contract: contract}, nil +} + +// bindSubscription binds a generic wrapper to an already deployed contract. +func bindSubscription(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(SubscriptionABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Subscription *SubscriptionRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Subscription.Contract.SubscriptionCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Subscription *SubscriptionRaw) Transfer(opts *bind.TransactOpts) (types.Transaction, error) { + return _Subscription.Contract.SubscriptionTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Subscription *SubscriptionRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (types.Transaction, error) { + return _Subscription.Contract.SubscriptionTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Subscription *SubscriptionCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Subscription.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Subscription *SubscriptionTransactorRaw) Transfer(opts *bind.TransactOpts) (types.Transaction, error) { + return _Subscription.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Subscription *SubscriptionTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (types.Transaction, error) { + return _Subscription.Contract.contract.Transact(opts, method, params...) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() returns() +func (_Subscription *SubscriptionTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (types.Transaction, error) { + return _Subscription.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() returns() +func (_Subscription *SubscriptionSession) Fallback(calldata []byte) (types.Transaction, error) { + return _Subscription.Contract.Fallback(&_Subscription.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() returns() +func (_Subscription *SubscriptionTransactorSession) Fallback(calldata []byte) (types.Transaction, error) { + return _Subscription.Contract.Fallback(&_Subscription.TransactOpts, calldata) +} + +// SubscriptionSubscriptionEventIterator is returned from FilterSubscriptionEvent and is used to iterate over the raw logs and unpacked data for SubscriptionEvent events raised by the Subscription contract. +type SubscriptionSubscriptionEventIterator struct { + Event *SubscriptionSubscriptionEvent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *SubscriptionSubscriptionEventIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(SubscriptionSubscriptionEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(SubscriptionSubscriptionEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *SubscriptionSubscriptionEventIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *SubscriptionSubscriptionEventIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// SubscriptionSubscriptionEvent represents a SubscriptionEvent event raised by the Subscription contract. +type SubscriptionSubscriptionEvent struct { + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSubscriptionEvent is a free log retrieval operation binding the contract event 0x67abc7edb0ab50964ef0e90541d39366b9c69f6f714520f2ff4570059ee8ad80. +// +// Solidity: event SubscriptionEvent() +func (_Subscription *SubscriptionFilterer) FilterSubscriptionEvent(opts *bind.FilterOpts) (*SubscriptionSubscriptionEventIterator, error) { + + logs, sub, err := _Subscription.contract.FilterLogs(opts, "SubscriptionEvent") + if err != nil { + return nil, err + } + return &SubscriptionSubscriptionEventIterator{contract: _Subscription.contract, event: "SubscriptionEvent", logs: logs, sub: sub}, nil +} + +// WatchSubscriptionEvent is a free log subscription operation binding the contract event 0x67abc7edb0ab50964ef0e90541d39366b9c69f6f714520f2ff4570059ee8ad80. +// +// Solidity: event SubscriptionEvent() +func (_Subscription *SubscriptionFilterer) WatchSubscriptionEvent(opts *bind.WatchOpts, sink chan<- *SubscriptionSubscriptionEvent) (event.Subscription, error) { + + logs, sub, err := _Subscription.contract.WatchLogs(opts, "SubscriptionEvent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(SubscriptionSubscriptionEvent) + if err := _Subscription.contract.UnpackLog(event, "SubscriptionEvent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSubscriptionEvent is a log parse operation binding the contract event 0x67abc7edb0ab50964ef0e90541d39366b9c69f6f714520f2ff4570059ee8ad80. +// +// Solidity: event SubscriptionEvent() +func (_Subscription *SubscriptionFilterer) ParseSubscriptionEvent(log types.Log) (*SubscriptionSubscriptionEvent, error) { + event := new(SubscriptionSubscriptionEvent) + if err := _Subscription.contract.UnpackLog(event, "SubscriptionEvent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/cmd/devnettest/contracts/subscription.sol b/cmd/devnettest/contracts/subscription.sol new file mode 100644 index 00000000000..092d4470feb --- /dev/null +++ b/cmd/devnettest/contracts/subscription.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.0; + +contract Subscription { + event SubscriptionEvent(); + fallback() external { + emit SubscriptionEvent(); + } +} diff --git a/cmd/devnettest/erigon/node.go b/cmd/devnettest/erigon/node.go new file mode 100644 index 00000000000..440c4688498 --- /dev/null +++ b/cmd/devnettest/erigon/node.go @@ -0,0 +1,61 @@ +package erigon + +import ( + "fmt" + "os" + + "github.com/ledgerwatch/erigon-lib/common/dbg" + "github.com/ledgerwatch/erigon/cmd/devnettest/rpcdaemon" + "github.com/ledgerwatch/erigon/params" + erigonapp "github.com/ledgerwatch/erigon/turbo/app" + erigoncli "github.com/ledgerwatch/erigon/turbo/cli" + "github.com/ledgerwatch/erigon/turbo/node" + "github.com/ledgerwatch/log/v3" + "github.com/urfave/cli" +) + +const DevPeriod = 5 + +func RunNode() { + defer func() { + panicResult := recover() + if panicResult == nil { + return + } + + log.Error("catch panic", "err", panicResult, "stack", dbg.Stack()) + os.Exit(1) + }() + + app := erigonapp.MakeApp(runDevnet, erigoncli.DefaultFlags) // change to erigoncli.DefaultFlags later on + customArgs := []string{"./build/bin/devnettest", "--datadir=./dev", "--chain=dev", "--mine", fmt.Sprintf("--dev.period=%d", DevPeriod), "--verbosity=0"} + if err := app.Run(customArgs); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func runDevnet(cliCtx *cli.Context) { + logger := log.New() + // initializing the node and providing the current git commit there + logger.Info("Build info", "git_branch", params.GitBranch, "git_tag", params.GitTag, "git_commit", params.GitCommit) + + nodeCfg := node.NewNodConfigUrfave(cliCtx) + ethCfg := node.NewEthConfigUrfave(cliCtx, nodeCfg) + + ethNode, err := node.New(nodeCfg, ethCfg, logger) + if err != nil { + log.Error("Devnet startup", "err", err) + return + } + err = ethNode.Serve() + if err != nil { + log.Error("error while serving a Devnet node", "err", err) + } +} + +func StartProcess() { + fmt.Println("Starting erigon node and rpc daemon...") + go RunNode() + go rpcdaemon.RunDaemon() +} diff --git a/cmd/devnettest/main.go b/cmd/devnettest/main.go new file mode 100644 index 00000000000..66e419bfc7c --- /dev/null +++ b/cmd/devnettest/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "time" + + "github.com/ledgerwatch/erigon/cmd/devnettest/commands" + "github.com/ledgerwatch/erigon/cmd/devnettest/erigon" + "github.com/ledgerwatch/erigon/cmd/devnettest/services" +) + +func main() { + erigon.StartProcess() + + time.Sleep(10 * time.Second) + + fmt.Printf("SUCCESS => Started!\n\n") + err := commands.Execute() + if err != nil { + panic(err) + } + + defer services.ClearDevDB() +} diff --git a/cmd/devnettest/requests/mock_requests.go b/cmd/devnettest/requests/mock_requests.go new file mode 100644 index 00000000000..1e5c950d36d --- /dev/null +++ b/cmd/devnettest/requests/mock_requests.go @@ -0,0 +1,13 @@ +package requests + +import "fmt" + +func MockGetRequest(reqId int) error { + reqGen := initialiseRequestGenerator(reqId) + res := reqGen.Get() + if res.Err != nil { + return fmt.Errorf("failed to make get request: %v", res.Err) + } + fmt.Printf("SUCCESS => OK\n") + return nil +} diff --git a/cmd/devnettest/requests/request_generator.go b/cmd/devnettest/requests/request_generator.go new file mode 100644 index 00000000000..0be4ca87b58 --- /dev/null +++ b/cmd/devnettest/requests/request_generator.go @@ -0,0 +1,124 @@ +package requests + +import ( + "errors" + "fmt" + "io" + "net/http" + "time" + + "github.com/ledgerwatch/erigon/cmd/rpctest/rpctest" + "github.com/ledgerwatch/erigon/common" +) + +var ( + erigonUrl = "http://localhost:8545" +) + +type RequestGenerator struct { + reqID int + client *http.Client +} + +func initialiseRequestGenerator(reqId int) *RequestGenerator { + var client = &http.Client{ + Timeout: time.Second * 600, + } + + reqGen := RequestGenerator{ + client: client, + reqID: reqId, + } + if reqGen.reqID == 0 { + reqGen.reqID++ + } + + return &reqGen +} + +func (req *RequestGenerator) Get() rpctest.CallResult { + start := time.Now() + res := rpctest.CallResult{ + RequestID: req.reqID, + } + + resp, err := http.Get(erigonUrl) + if err != nil { + res.Took = time.Since(start) + res.Err = err + return res + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + res.Took = time.Since(start) + res.Err = errors.New("bad request") + return res + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + res.Took = time.Since(start) + res.Err = err + return res + } + + res.Response = body + res.Took = time.Since(start) + res.Err = err + return res +} + +func (req *RequestGenerator) Erigon(method, body string, response interface{}) rpctest.CallResult { + return req.call(erigonUrl, method, body, response) +} + +func (req *RequestGenerator) call(target string, method, body string, response interface{}) rpctest.CallResult { + start := time.Now() + err := post(req.client, erigonUrl, body, response) + return rpctest.CallResult{ + RequestBody: body, + Target: target, + Took: time.Since(start), + RequestID: req.reqID, + Method: method, + Err: err, + } +} + +func (req *RequestGenerator) getBalance(address common.Address, blockNum string) string { + const template = `{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x%x","%v"],"id":%d}` + return fmt.Sprintf(template, address, blockNum, req.reqID) +} + +func (req *RequestGenerator) sendRawTransaction(signedTx []byte) string { + const template = `{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":["0x%x"],"id":%d}` + return fmt.Sprintf(template, signedTx, req.reqID) +} + +func (req *RequestGenerator) txpoolContent() string { + const template = `{"jsonrpc":"2.0","method":"txpool_content","params":[],"id":%d}` + return fmt.Sprintf(template, req.reqID) +} + +func (req *RequestGenerator) parityStorageKeyListContent(address common.Address, quantity int, offset []byte, blockNum string) string { + const template = `{"jsonrpc":"2.0","method":"parity_listStorageKeys","params":["0x%x", %d, %v, "%s"],"id":%d}` + var offsetString string + if len(offset) != 0 { + offsetString = fmt.Sprintf(`"0x%x"`, offset) + } else { + offsetString = "null" + } + + return fmt.Sprintf(template, address, quantity, offsetString, blockNum, req.reqID) +} + +func (req *RequestGenerator) getLogs(fromBlock, toBlock uint64, address common.Address) string { + const template = `{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock": "0x%x", "toBlock": "0x%x", "address": "0x%x"}],"id":%d}` + return fmt.Sprintf(template, fromBlock, toBlock, address, req.reqID) +} + +func (req *RequestGenerator) getTransactionCount(address common.Address, blockNum string) string { + const template = `{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x%x","%v"],"id":%d}` + return fmt.Sprintf(template, address, blockNum, req.reqID) +} diff --git a/cmd/devnettest/requests/requests.go b/cmd/devnettest/requests/requests.go new file mode 100644 index 00000000000..a678a6b74af --- /dev/null +++ b/cmd/devnettest/requests/requests.go @@ -0,0 +1,176 @@ +package requests + +import ( + "bytes" + "encoding/json" + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/utils" + "net/http" + "strconv" + "strings" + "time" + + "github.com/ledgerwatch/erigon/cmd/rpctest/rpctest" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/log/v3" +) + +func post(client *http.Client, url, request string, response interface{}) error { + start := time.Now() + r, err := client.Post(url, "application/json", strings.NewReader(request)) + if err != nil { + return fmt.Errorf("client failed to make post request: %v", err) + } + defer r.Body.Close() + + if r.StatusCode != 200 { + return fmt.Errorf("status %s", r.Status) + } + + decoder := json.NewDecoder(r.Body) + err = decoder.Decode(response) + if err != nil { + return fmt.Errorf("failed to decode response: %v", err) + } + + log.Info("Got in", "time", time.Since(start).Seconds()) + return nil +} + +func GetBalance(reqId int, address common.Address, blockNum string) (uint64, error) { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.EthBalance + + if res := reqGen.Erigon("eth_getBalance", reqGen.getBalance(address, blockNum), &b); res.Err != nil { + return 0, fmt.Errorf("failed to get balance: %v", res.Err) + } + + bal, err := json.Marshal(b.Balance) + if err != nil { + fmt.Println(err) + } + + balStr := string(bal)[3 : len(bal)-1] + balance, err := strconv.ParseInt(balStr, 16, 64) + if err != nil { + return 0, fmt.Errorf("cannot convert balance to decimal: %v", err) + } + + return uint64(balance), nil +} + +func SendTx(reqId int, signedTx *types.Transaction) (*common.Hash, error) { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.EthSendRawTransaction + + var buf bytes.Buffer + if err := (*signedTx).MarshalBinary(&buf); err != nil { + return nil, fmt.Errorf("failed to marshal binary: %v", err) + } + + if res := reqGen.Erigon("eth_sendRawTransaction", reqGen.sendRawTransaction(buf.Bytes()), &b); res.Err != nil { + return nil, fmt.Errorf("could not make request to eth_sendRawTransaction: %v", res.Err) + } + + return &b.TxnHash, nil +} + +func TxpoolContent(reqId int) error { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.EthTxPool + + if res := reqGen.Erigon("txpool_content", reqGen.txpoolContent(), &b); res.Err != nil { + return fmt.Errorf("failed to fetch txpool content: %v", res.Err) + } + + //fmt.Printf("Pending: %+v\n", b.Result.(map[string]interface{})["pending"].(map[string]interface{})["hash"]) + //fmt.Printf("Type: %T\n", b.Result.(map[string]interface{})["pending"]) + + s, err := utils.ParseResponse(b) + if err != nil { + return fmt.Errorf("error parsing resonse: %v", err) + } + + fmt.Printf("Txpool content: %v\n", s) + return nil +} + +func ParityList(reqId int, account common.Address, quantity int, offset []byte, blockNum string) error { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.ParityListStorageKeysResult + + if res := reqGen.Erigon("parity_listStorageKeys", reqGen.parityStorageKeyListContent(account, quantity, offset, blockNum), &b); res.Err != nil { + return fmt.Errorf("failed to fetch storage keys: %v", res.Err) + } + + s, err := utils.ParseResponse(b) + if err != nil { + return fmt.Errorf("error parsing resonse: %v", err) + } + + fmt.Printf("Storage keys: %v\n", s) + return nil +} + +func GetLogs(reqId int, fromBlock, toBlock uint64, address common.Address, show bool) error { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.EthGetLogs + + if res := reqGen.Erigon("eth_getLogs", reqGen.getLogs(fromBlock, toBlock, address), &b); res.Err != nil { + return fmt.Errorf("error fetching logs: %v\n", res.Err) + } + + s, err := utils.ParseResponse(b) + if err != nil { + return fmt.Errorf("error parsing resonse: %v", err) + } + + if show { + fmt.Printf("Logs: %v\n", s) + } + + return nil +} + +func GetTransactionCountCmd(reqId int, address common.Address, blockNum string) (uint64, error) { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.EthGetTransactionCount + + if res := reqGen.Erigon("eth_getTransactionCount", reqGen.getTransactionCount(address, blockNum), &b); res.Err != nil { + return 0, fmt.Errorf("error getting transaction count: %v\n", res.Err) + } + + if b.Error != nil { + return 0, fmt.Errorf("error populating response object: %v", b.Error) + } + + n, err := json.Marshal(b.Result) + if err != nil { + fmt.Println(err) + } + + nonceStr := string(n)[3 : len(n)-1] + + nonce, err := strconv.ParseInt(nonceStr, 16, 64) + if err != nil { + return 0, fmt.Errorf("cannot convert nonce to decimal: %v", err) + } + + return uint64(nonce), nil +} + +func GetTransactionCount(reqId int, address common.Address, blockNum string) (rpctest.EthGetTransactionCount, error) { + reqGen := initialiseRequestGenerator(reqId) + var b rpctest.EthGetTransactionCount + + if res := reqGen.Erigon("eth_getTransactionCount", reqGen.getTransactionCount(address, blockNum), &b); res.Err != nil { + return b, fmt.Errorf("error getting transaction count: %v\n", res.Err) + } + + if b.Error != nil { + return b, fmt.Errorf("error populating response object: %v", b.Error) + } + + return b, nil +} diff --git a/cmd/devnettest/rpcdaemon/daemon.go b/cmd/devnettest/rpcdaemon/daemon.go new file mode 100644 index 00000000000..226a2fd9a30 --- /dev/null +++ b/cmd/devnettest/rpcdaemon/daemon.go @@ -0,0 +1,51 @@ +package rpcdaemon + +import ( + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" + "os" + "time" + + "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" +) + +func RunDaemon() { + cmd, cfg := cli.RootCommand() + setupCfg(cfg) + rootCtx, rootCancel := common.RootContext() + cmd.RunE = func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + logger := log.New() + time.Sleep(100 * time.Millisecond) + db, borDb, backend, txPool, mining, starknet, stateCache, blockReader, ff, err := cli.RemoteServices(ctx, *cfg, logger, rootCancel) + if err != nil { + log.Error("Could not connect to DB", "err", err) + return nil + } + defer db.Close() + if borDb != nil { + defer borDb.Close() + } + + apiList := commands.APIList(db, borDb, backend, txPool, mining, starknet, ff, stateCache, blockReader, *cfg) + if err := cli.StartRpcServer(ctx, *cfg, apiList); err != nil { + log.Error(err.Error()) + return nil + } + + return nil + } + + if err := cmd.ExecuteContext(rootCtx); err != nil { + log.Error(err.Error()) + os.Exit(1) + } +} + +func setupCfg(cfg *httpcfg.HttpCfg) { + cfg.WebsocketEnabled = true + cfg.API = []string{"eth", "erigon", "web3", "net", "debug", "trace", "txpool"} +} diff --git a/cmd/devnettest/services/account.go b/cmd/devnettest/services/account.go new file mode 100644 index 00000000000..da067ed6861 --- /dev/null +++ b/cmd/devnettest/services/account.go @@ -0,0 +1,20 @@ +package services + +import ( + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/ledgerwatch/erigon/common" +) + +// GetNonce fetches the latest nonce of the developer account by making an JSONRPC request +func GetNonce(reqId int) (uint64, error) { + blockNum := "latest" + address := common.HexToAddress(DevAddress) + + res, err := requests.GetTransactionCount(reqId, address, blockNum) + if err != nil { + return 0, fmt.Errorf("failed to get transaction count for address 0x%x: %v", address, err) + } + + return uint64(res.Result), nil +} diff --git a/cmd/devnettest/services/block.go b/cmd/devnettest/services/block.go new file mode 100644 index 00000000000..777e2a8dc23 --- /dev/null +++ b/cmd/devnettest/services/block.go @@ -0,0 +1,216 @@ +package services + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/utils" + "math/big" + "os/exec" + "time" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/accounts/abi/bind" + "github.com/ledgerwatch/erigon/accounts/abi/bind/backends" + "github.com/ledgerwatch/erigon/cmd/devnettest/contracts" + "github.com/ledgerwatch/erigon/cmd/devnettest/requests" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rpc" +) + +const ( + gasPrice = 912345678 +) + +var ( + devnetSignPrivateKey, _ = crypto.HexToECDSA("26e86e45f6fc45ec6e2ecd128cec80fa1d1505e5507dcd2ae58c3130a7a97b48") + signer = types.LatestSigner(params.AllCliqueProtocolChanges) + DevAddress = "67b1d87101671b127f5f8714789C7192f7ad340e" + gspec = core.DeveloperGenesisBlock(uint64(0), common.HexToAddress(DevAddress)) + contractBackend = backends.NewSimulatedBackendWithConfig(gspec.Alloc, gspec.Config, 1_000_000) +) + +type Block struct { + Number *hexutil.Big + Transactions []common.Hash +} + +// CreateTransaction returns transaction details depending on what transaction type is given +func CreateTransaction(transactionType, addr string, value, nonce uint64) (*types.Transaction, common.Address, *contracts.Subscription, *bind.TransactOpts, error) { + if transactionType == "regular" { + tx, address, err := createNonContractTx(addr, value, nonce) + if err != nil { + return nil, common.Address{}, nil, nil, fmt.Errorf("failed to create non-contract transaction: %v", err) + } + return tx, address, nil, nil, nil + } + return createContractTx(nonce) +} + +// createNonContractTx takes in a signer and returns the signed transaction and the address receiving the sent value +func createNonContractTx(addr string, value, nonce uint64) (*types.Transaction, common.Address, error) { + toAddress := common.HexToAddress(addr) + signedTx, err := types.SignTx(types.NewTransaction(nonce, toAddress, uint256.NewInt(value), + params.TxGas, uint256.NewInt(gasPrice), nil), *signer, devnetSignPrivateKey) + if err != nil { + return nil, toAddress, fmt.Errorf("failed to sign transaction: %v", err) + } + return &signedTx, toAddress, nil +} + +// createContractTx creates and signs a transaction using the developer address, returns the contract and the signed transaction +func createContractTx(nonce uint64) (*types.Transaction, common.Address, *contracts.Subscription, *bind.TransactOpts, error) { + // initialize transactOpts + transactOpts, err := initializeTransactOps(nonce) + if err != nil { + return nil, common.Address{}, nil, nil, fmt.Errorf("failed to initialize transactOpts: %v", err) + } + + // deploy the contract and get the contract handler + address, txToSign, subscriptionContract, err := contracts.DeploySubscription(transactOpts, contractBackend) + if err != nil { + return nil, common.Address{}, nil, nil, fmt.Errorf("failed to deploy subscription: %v", err) + } + + // sign the transaction with the private key + signedTx, err := types.SignTx(txToSign, *signer, devnetSignPrivateKey) + if err != nil { + return nil, common.Address{}, nil, nil, fmt.Errorf("failed to sign tx: %v", err) + } + + return &signedTx, address, subscriptionContract, transactOpts, nil +} + +func initializeTransactOps(nonce uint64) (*bind.TransactOpts, error) { + const txGas uint64 = 200_000 + var chainID = big.NewInt(1337) + + transactOpts, err := bind.NewKeyedTransactorWithChainID(devnetSignPrivateKey, chainID) + if err != nil { + return nil, fmt.Errorf("cannot create transactor with chainID %s, error: %v", chainID, err) + } + + transactOpts.GasLimit = txGas + transactOpts.GasPrice = big.NewInt(880_000_000) + // TODO: Get Nonce from account automatically + transactOpts.Nonce = big.NewInt(int64(nonce)) + + return transactOpts, nil +} + +// SearchBlockForTx connects the client to a websocket and listens for new heads to search the blocks for a tx hash +func SearchBlockForTx(txnHash common.Hash) (uint64, error) { + client, clientErr := rpc.DialWebsocket(context.Background(), "ws://127.0.0.1:8545", "") + if clientErr != nil { + return 0, fmt.Errorf("failed to dial websocket: %v", clientErr) + } + + fmt.Printf("\nSearching for tx %q in new blocks...\n", txnHash) + blockN, err := subscribeToNewHeadsAndSearch(client, "eth_newHeads", txnHash) + if err != nil { + return 0, fmt.Errorf("failed to subscribe to ws: %v", err) + } + + // var count int + + // ForLoop: + // for { + // select { + // case v := <-ch: + // count++ + // _map := v.(map[string]interface{}) + // for k, val := range _map { + // fmt.Printf("%s: %+v, ", k, val) + // } + // fmt.Println() + // fmt.Println() + // if count == numberOfIterations { + // break ForLoop + // } + // } + // } + + return blockN, nil +} + +// blockHasHash checks if the current block has the transaction hash in its list of transactions +func blockHasHash(client *rpc.Client, hash common.Hash, blockNumber string) (uint64, bool, error) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + var currentBlock Block + err := client.CallContext(ctx, ¤tBlock, "eth_getBlockByNumber", blockNumber, false) + if err != nil { + return uint64(0), false, fmt.Errorf("failed to get block by number: %v", err) + } + + for _, txnHash := range currentBlock.Transactions { + if txnHash == hash { + fmt.Printf("SUCCESS => Tx with hash %q is in mined block with number %q\n", hash, blockNumber) + return utils.HexToInt(blockNumber), true, nil + } + } + + return uint64(0), false, nil +} + +// EmitEventAndGetLogs emits an event from the contract using the fallback method +func EmitEventAndGetLogs(reqId int, subContract *contracts.Subscription, opts *bind.TransactOpts, address common.Address) error { + opts.Nonce.Add(opts.Nonce, big.NewInt(1)) + + tx, err := subContract.Fallback(opts, []byte{}) + if err != nil { + return fmt.Errorf("failed to emit event from fallback: %v", err) + } + + signedTx, err := types.SignTx(tx, *signer, devnetSignPrivateKey) + if err != nil { + return fmt.Errorf("failed to sign transaction: %v", err) + } + + fmt.Printf("\nSending Fallback tx from contract...\n") + hash, err := requests.SendTx(reqId, &signedTx) + if err != nil { + return fmt.Errorf("failed to send transaction: %v", err) + } + fmt.Printf("SUCCESS => Tx submitted, adding tx with hash %q to txpool\n", hash) + + // TODO: Mining does not happen because node is stuck in StageSync + blockN, err := SearchBlockForTx(*hash) + if err != nil { + return fmt.Errorf("error searching block for tx: %v", err) + } + + if err = requests.GetLogs(reqId, blockN, blockN, address, false); err != nil { + return fmt.Errorf("failed to get logs: %v", err) + } + + return nil +} + +func ApplyTransaction(ctx context.Context, tx types.Transaction) error { + err := contractBackend.SendTransaction(ctx, tx) + if err != nil { + return fmt.Errorf("failed to send transaction: %v", err) + } + contractBackend.Commit() + return nil +} + +// ClearDevDB cleans up the dev folder used for the operations +func ClearDevDB() { + fmt.Printf("\nDeleting ./dev folder\n") + + cmd := exec.Command("rm", "-rf", "./dev") + err := cmd.Run() + if err != nil { + fmt.Println("Error occurred clearing Dev DB") + panic("could not clear dev DB") + } + + fmt.Printf("SUCCESS => Deleted ./dev\n") +} diff --git a/cmd/devnettest/services/event.go b/cmd/devnettest/services/event.go new file mode 100644 index 00000000000..a524898060f --- /dev/null +++ b/cmd/devnettest/services/event.go @@ -0,0 +1,129 @@ +package services + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/devnettest/utils" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/rpc" +) + +const numberOfIterations = 128 + +var ch = make(chan interface{}) + +// subscribe connects to a websocket and returns the subscription handler and a channel buffer +func subscribe(client *rpc.Client, method string, args ...interface{}) (*rpc.ClientSubscription, error) { + var ( + namespace string + subMethod string + splitErr error + ) + + namespace, subMethod, splitErr = utils.NamespaceAndSubMethodFromMethod(method) + if splitErr != nil { + return nil, fmt.Errorf("cannot get namespace and submethod from method: %v", splitErr) + } + + var arr = []interface{}{subMethod} + arr = append(arr, args...) + + sub, err := client.Subscribe(context.Background(), namespace, ch, arr...) + if err != nil { + return nil, fmt.Errorf("client failed to subscribe: %v", err) + } + + return sub, nil +} + +// subscribeToNewHeadsAndSearch makes a ws subscription for eth_newHeads and searches each new header for the tx hash +func subscribeToNewHeadsAndSearch(client *rpc.Client, method string, hash common.Hash) (uint64, error) { + sub, err := subscribe(client, method) + if err != nil { + return uint64(0), fmt.Errorf("error subscribing to newHeads: %v", err) + } + defer unSubscribe(sub) + + var ( + blockCount int + blockN uint64 + ) +mark: + for { + select { + case v := <-ch: + blockCount++ + blockNumber := v.(map[string]interface{})["number"] + num, foundTx, err := blockHasHash(client, hash, blockNumber.(string)) + if err != nil { + return uint64(0), fmt.Errorf("could not verify if current block contains the tx hash: %v", err) + } + if foundTx || blockCount == numberOfIterations { + blockN = num + break mark + } + case err := <-sub.Err(): + return uint64(0), fmt.Errorf("subscription error from client: %v", err) + } + } + + return blockN, nil +} + +// Logs dials a websocket connection and listens for log events by calling subscribeToLogs +func Logs(addresses, topics []string) error { + client, clientErr := rpc.DialWebsocket(context.Background(), "ws://127.0.0.1:8545", "") + if clientErr != nil { + return fmt.Errorf("failed to dial websocket: %v", clientErr) + } + + if err := subscribeToLogs(client, "eth_logs", addresses, topics); err != nil { + return fmt.Errorf("failed to subscribe to logs: %v", err) + } + + return nil +} + +// subscribeToLogs makes a ws subscription for eth_subscribeLogs +func subscribeToLogs(client *rpc.Client, method string, addresses []string, topics []string) error { + params := map[string][]string{ + "address": addresses, + "topics": topics, + } + + _, err := subscribe(client, method, params) + if err != nil { + return fmt.Errorf("error subscribing to logs: %v", err) + } + //defer unSubscribe(sub) + + //var count int + + //ForLoop: + // for { + // select { + // case v := <-ch: + // count++ + // _map := v.(map[string]interface{}) + // for k, val := range _map { + // fmt.Printf("%s: %+v, ", k, val) + // } + // fmt.Println() + // fmt.Println() + // if count == numberOfIterations { + // break ForLoop + // } + // case err := <-sub.Err(): + // return fmt.Errorf("subscription error from client: %v", err) + // } + // } + + return nil +} + +func unSubscribe(sub *rpc.ClientSubscription) { + sub.Unsubscribe() + for len(ch) > 0 { + <-ch + } +} diff --git a/cmd/devnettest/utils/tools.go b/cmd/devnettest/utils/tools.go new file mode 100644 index 00000000000..820fed468d1 --- /dev/null +++ b/cmd/devnettest/utils/tools.go @@ -0,0 +1,36 @@ +package utils + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" +) + +// HexToInt converts a hex string to a type uint64 +func HexToInt(hexStr string) uint64 { + // Remove the 0x prefix + cleaned := strings.ReplaceAll(hexStr, "0x", "") + + result, _ := strconv.ParseUint(cleaned, 16, 64) + return result +} + +// ParseResponse converts any of the rpctest interfaces to a string for readability +func ParseResponse(resp interface{}) (string, error) { + result, err := json.Marshal(resp) + if err != nil { + return "", fmt.Errorf("error trying to marshal response: %v", err) + } + + return string(result), nil +} + +// NamespaceAndSubMethodFromMethod splits a parent method into namespace and the actual method +func NamespaceAndSubMethodFromMethod(method string) (string, string, error) { + parts := strings.SplitN(method, "_", 2) + if len(parts) != 2 { + return "", "", fmt.Errorf("invalid string to split") + } + return parts[0], parts[1], nil +} diff --git a/cmd/devp2p/README.md b/cmd/devp2p/README.md deleted file mode 100644 index e934ee25c91..00000000000 --- a/cmd/devp2p/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# The devp2p command - -The devp2p command line tool is a utility for low-level peer-to-peer debugging and -protocol development purposes. It can do many things. - -### ENR Decoding - -Use `devp2p enrdump ` to verify and display an Ethereum Node Record. - -### Node Key Management - -The `devp2p key ...` command family deals with node key files. - -Run `devp2p key generate mynode.key` to create a new node key in the `mynode.key` file. - -Run `devp2p key to-enode mynode.key -ip 127.0.0.1 -tcp 30303` to create an enode:// URL -corresponding to the given node key and address information. - -### Maintaining DNS Discovery Node Lists - -The devp2p command can create and publish DNS discovery node lists. - -Run `devp2p dns sign ` to update the signature of a DNS discovery tree. - -Run `devp2p dns sync ` to download a complete DNS discovery tree. - -Run `devp2p dns to-cloudflare ` to publish a tree to CloudFlare DNS. - -Run `devp2p dns to-route53 ` to publish a tree to Amazon Route53. - -You can find more information about these commands in the [DNS Discovery Setup Guide][dns-tutorial]. - -### Discovery v4 Utilities - -The `devp2p discv4 ...` command family deals with the [Node Discovery v4][discv4] -protocol. - -Run `devp2p discv4 ping ` to ping a node. - -Run `devp2p discv4 resolve ` to find the most recent node record of a node in -the DHT. - -Run `devp2p discv4 crawl ` to create or update a JSON node set. - -### Discovery v5 Utilities - -The `devp2p discv5 ...` command family deals with the [Node Discovery v5][discv5] -protocol. This protocol is currently under active development. - -Run `devp2p discv5 ping ` to ping a node. - -Run `devp2p discv5 resolve ` to find the most recent node record of a node in -the discv5 DHT. - -Run `devp2p discv5 listen` to run a Discovery v5 node. - -Run `devp2p discv5 crawl ` to create or update a JSON node set containing -discv5 nodes. - -### Discovery Test Suites - -The devp2p command also contains interactive test suites for Discovery v4 and Discovery -v5. - -To run these tests against your implementation, you need to set up a networking -environment where two separate UDP listening addresses are available on the same machine. -The two listening addresses must also be routed such that they are able to reach the node -you want to test. - -For example, if you want to run the test on your local host, and the node under test is -also on the local host, you need to assign two IP addresses (or a larger range) to your -loopback interface. On macOS, this can be done by executing the following command: - - sudo ifconfig lo0 add 127.0.0.2 - -You can now run either test suite as follows: Start the node under test first, ensuring -that it won't talk to the Internet (i.e. disable bootstrapping). An easy way to prevent -unintended connections to the global DHT is listening on `127.0.0.1`. - -Now get the ENR of your node and store it in the `NODE` environment variable. - -Start the test by running `devp2p discv5 test -listen1 127.0.0.1 -listen2 127.0.0.2 $NODE`. - -### Eth Protocol Test Suite - -The Eth Protocol test suite is a conformance test suite for the [eth protocol][eth]. - -To run the eth protocol test suite against your implementation, the node needs to be initialized as such: - -1. initialize the geth node with the `genesis.json` file contained in the `testdata` directory -2. import the `halfchain.rlp` file in the `testdata` directory -3. run geth with the following flags: -``` -geth --datadir --nodiscover --nat=none --networkid 19763 --verbosity 5 -``` - -Then, run the following command, replacing `` with the enode of the geth node: - ``` - devp2p rlpx eth-test cmd/devp2p/internal/ethtest/testdata/chain.rlp cmd/devp2p/internal/ethtest/testdata/genesis.json -``` - -Repeat the above process (re-initialising the node) in order to run the Eth Protocol test suite again. - -#### Eth66 Test Suite - -The Eth66 test suite is also a conformance test suite for the eth 66 protocol version specifically. -To run the eth66 protocol test suite, initialize a geth node as described above and run the following command, -replacing `` with the enode of the geth node: - - ``` - devp2p rlpx eth66-test cmd/devp2p/internal/ethtest/testdata/chain.rlp cmd/devp2p/internal/ethtest/testdata/genesis.json -``` - -[eth]: https://github.com/ethereum/devp2p/blob/master/caps/eth.md -[dns-tutorial]: https://geth.ethereum.org/docs/developers/dns-discovery-setup -[discv4]: https://github.com/ethereum/devp2p/tree/master/discv4.md -[discv5]: https://github.com/ethereum/devp2p/tree/master/discv5/discv5.md diff --git a/cmd/devp2p/crawl.go b/cmd/devp2p/crawl.go deleted file mode 100644 index c813e389bef..00000000000 --- a/cmd/devp2p/crawl.go +++ /dev/null @@ -1,158 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "time" - - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/log/v3" -) - -type crawler struct { - input nodeSet - output nodeSet - disc resolver - iters []enode.Iterator - inputIter enode.Iterator - ch chan *enode.Node - closed chan struct{} - - // settings - revalidateInterval time.Duration -} - -type resolver interface { - RequestENR(*enode.Node) (*enode.Node, error) -} - -func newCrawler(input nodeSet, disc resolver, iters ...enode.Iterator) *crawler { - c := &crawler{ - input: input, - output: make(nodeSet, len(input)), - disc: disc, - iters: iters, - inputIter: enode.IterNodes(input.nodes()), - ch: make(chan *enode.Node), - closed: make(chan struct{}), - } - c.iters = append(c.iters, c.inputIter) - // Copy input to output initially. Any nodes that fail validation - // will be dropped from output during the run. - for id, n := range input { - c.output[id] = n - } - return c -} - -func (c *crawler) run(timeout time.Duration) nodeSet { - var ( - timeoutTimer = time.NewTimer(timeout) - timeoutCh <-chan time.Time - doneCh = make(chan enode.Iterator, len(c.iters)) - liveIters = len(c.iters) - ) - defer timeoutTimer.Stop() - for _, it := range c.iters { - go c.runIterator(doneCh, it) - } - -loop: - for { - select { - case n := <-c.ch: - c.updateNode(n) - case it := <-doneCh: - if it == c.inputIter { - // Enable timeout when we're done revalidating the input nodes. - log.Info("Revalidation of input set is done", "len", len(c.input)) - if timeout > 0 { - timeoutCh = timeoutTimer.C - } - } - if liveIters--; liveIters == 0 { - break loop - } - case <-timeoutCh: - break loop - } - } - - close(c.closed) - for _, it := range c.iters { - it.Close() - } - for ; liveIters > 0; liveIters-- { - <-doneCh - } - return c.output -} - -func (c *crawler) runIterator(done chan<- enode.Iterator, it enode.Iterator) { - defer debug.LogPanic() - defer func() { done <- it }() - for it.Next() { - select { - case c.ch <- it.Node(): - case <-c.closed: - return - } - } -} - -func (c *crawler) updateNode(n *enode.Node) { - node, ok := c.output[n.ID()] - - // Skip validation of recently-seen nodes. - if ok && time.Since(node.LastCheck) < c.revalidateInterval { - return - } - - // Request the node record. - nn, err := c.disc.RequestENR(n) - node.LastCheck = truncNow() - if err != nil { - if node.Score == 0 { - // Node doesn't implement EIP-868. - log.Debug("Skipping node", "id", n.ID()) - return - } - node.Score /= 2 - } else { - node.N = nn - node.Seq = nn.Seq() - node.Score++ - if node.FirstResponse.IsZero() { - node.FirstResponse = node.LastCheck - } - node.LastResponse = node.LastCheck - } - - // Store/update node in output set. - if node.Score <= 0 { - log.Info("Removing node", "id", n.ID()) - delete(c.output, n.ID()) - } else { - log.Info("Updating node", "id", n.ID(), "seq", n.Seq(), "score", node.Score) - c.output[n.ID()] = node - } -} - -func truncNow() time.Time { - return time.Now().UTC().Truncate(1 * time.Second) -} diff --git a/cmd/devp2p/discv4cmd.go b/cmd/devp2p/discv4cmd.go deleted file mode 100644 index 0a47c91cb09..00000000000 --- a/cmd/devp2p/discv4cmd.go +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "net" - "strings" - "time" - - "github.com/ledgerwatch/erigon/cmd/devp2p/internal/v4test" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p/discover" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/params" - "github.com/urfave/cli" -) - -var ( - discv4Command = cli.Command{ - Name: "discv4", - Usage: "Node Discovery v4 tools", - Subcommands: []cli.Command{ - discv4PingCommand, - discv4RequestRecordCommand, - discv4ResolveCommand, - discv4ResolveJSONCommand, - discv4CrawlCommand, - discv4TestCommand, - }, - } - discv4PingCommand = cli.Command{ - Name: "ping", - Usage: "Sends ping to a node", - Action: discv4Ping, - ArgsUsage: "", - } - discv4RequestRecordCommand = cli.Command{ - Name: "requestenr", - Usage: "Requests a node record using EIP-868 enrRequest", - Action: discv4RequestRecord, - ArgsUsage: "", - } - discv4ResolveCommand = cli.Command{ - Name: "resolve", - Usage: "Finds a node in the DHT", - Action: discv4Resolve, - ArgsUsage: "", - Flags: []cli.Flag{bootnodesFlag}, - } - discv4ResolveJSONCommand = cli.Command{ - Name: "resolve-json", - Usage: "Re-resolves nodes in a nodes.json file", - Action: discv4ResolveJSON, - Flags: []cli.Flag{bootnodesFlag}, - ArgsUsage: "", - } - discv4CrawlCommand = cli.Command{ - Name: "crawl", - Usage: "Updates a nodes.json file with random nodes found in the DHT", - Action: discv4Crawl, - Flags: []cli.Flag{bootnodesFlag, crawlTimeoutFlag}, - } - discv4TestCommand = cli.Command{ - Name: "test", - Usage: "Runs tests against a node", - Action: discv4Test, - Flags: []cli.Flag{ - remoteEnodeFlag, - testPatternFlag, - testTAPFlag, - testListen1Flag, - testListen2Flag, - }, - } -) - -var ( - bootnodesFlag = cli.StringFlag{ - Name: "bootnodes", - Usage: "Comma separated nodes used for bootstrapping", - } - nodekeyFlag = cli.StringFlag{ - Name: "nodekey", - Usage: "Hex-encoded node key", - } - nodedbFlag = cli.StringFlag{ - Name: "nodedb", - Usage: "Nodes database location", - } - listenAddrFlag = cli.StringFlag{ - Name: "addr", - Usage: "Listening address", - } - crawlTimeoutFlag = cli.DurationFlag{ - Name: "timeout", - Usage: "Time limit for the crawl.", - Value: 30 * time.Minute, - } - remoteEnodeFlag = cli.StringFlag{ - Name: "remote", - Usage: "Enode of the remote node under test", - EnvVar: "REMOTE_ENODE", - } -) - -func discv4Ping(ctx *cli.Context) error { - n := getNodeArg(ctx) - disc := startV4(ctx) - defer disc.Close() - - start := time.Now() - if err := disc.Ping(n); err != nil { - return fmt.Errorf("node didn't respond: %v", err) - } - fmt.Printf("node responded to ping (RTT %v).\n", time.Since(start)) - return nil -} - -func discv4RequestRecord(ctx *cli.Context) error { - n := getNodeArg(ctx) - disc := startV4(ctx) - defer disc.Close() - - respN, err := disc.RequestENR(n) - if err != nil { - return fmt.Errorf("can't retrieve record: %v", err) - } - fmt.Println(respN.String()) - return nil -} - -func discv4Resolve(ctx *cli.Context) error { - n := getNodeArg(ctx) - disc := startV4(ctx) - defer disc.Close() - - fmt.Println(disc.Resolve(n).String()) - return nil -} - -func discv4ResolveJSON(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need nodes file as argument") - } - nodesFile := ctx.Args().Get(0) - inputSet := make(nodeSet) - if common.FileExist(nodesFile) { - inputSet = loadNodesJSON(nodesFile) - } - - // Add extra nodes from command line arguments. - var nodeargs []*enode.Node - for i := 1; i < ctx.NArg(); i++ { - n, err := parseNode(ctx.Args().Get(i)) - if err != nil { - exit(err) - } - nodeargs = append(nodeargs, n) - } - - // Run the crawler. - disc := startV4(ctx) - defer disc.Close() - c := newCrawler(inputSet, disc, enode.IterNodes(nodeargs)) - c.revalidateInterval = 0 - output := c.run(0) - writeNodesJSON(nodesFile, output) - return nil -} - -func discv4Crawl(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need nodes file as argument") - } - nodesFile := ctx.Args().First() - var inputSet nodeSet - if common.FileExist(nodesFile) { - inputSet = loadNodesJSON(nodesFile) - } - - disc := startV4(ctx) - defer disc.Close() - c := newCrawler(inputSet, disc, disc.RandomNodes()) - c.revalidateInterval = 10 * time.Minute - output := c.run(ctx.Duration(crawlTimeoutFlag.Name)) - writeNodesJSON(nodesFile, output) - return nil -} - -// discv4Test runs the protocol test suite. -func discv4Test(ctx *cli.Context) error { - // Configure test package globals. - if !ctx.IsSet(remoteEnodeFlag.Name) { - return fmt.Errorf("missing -%v", remoteEnodeFlag.Name) - } - v4test.Remote = ctx.String(remoteEnodeFlag.Name) - v4test.Listen1 = ctx.String(testListen1Flag.Name) - v4test.Listen2 = ctx.String(testListen2Flag.Name) - return runTests(ctx, v4test.AllTests) -} - -// startV4 starts an ephemeral discovery V4 node. -func startV4(ctx *cli.Context) *discover.UDPv4 { - ln, config := makeDiscoveryConfig(ctx) - socket := listen(ln, ctx.String(listenAddrFlag.Name)) - disc, err := discover.ListenV4(socket, ln, config) - if err != nil { - exit(err) - } - return disc -} - -func makeDiscoveryConfig(ctx *cli.Context) (*enode.LocalNode, discover.Config) { - var cfg discover.Config - - if ctx.IsSet(nodekeyFlag.Name) { - key, err := crypto.HexToECDSA(ctx.String(nodekeyFlag.Name)) - if err != nil { - exit(fmt.Errorf("-%s: %v", nodekeyFlag.Name, err)) - } - cfg.PrivateKey = key - } else { - cfg.PrivateKey, _ = crypto.GenerateKey() - } - - if commandHasFlag(ctx, bootnodesFlag) { - bn, err := parseBootnodes(ctx) - if err != nil { - exit(err) - } - cfg.Bootnodes = bn - } - - dbpath := ctx.String(nodedbFlag.Name) - db, err := enode.OpenDB(dbpath) - if err != nil { - exit(err) - } - ln := enode.NewLocalNode(db, cfg.PrivateKey) - return ln, cfg -} - -func listen(ln *enode.LocalNode, addr string) *net.UDPConn { - if addr == "" { - addr = "0.0.0.0:0" - } - socket, err := net.ListenPacket("udp4", addr) - if err != nil { - exit(err) - } - usocket := socket.(*net.UDPConn) - uaddr := socket.LocalAddr().(*net.UDPAddr) - if uaddr.IP.IsUnspecified() { - ln.SetFallbackIP(net.IP{127, 0, 0, 1}) - } else { - ln.SetFallbackIP(uaddr.IP) - } - ln.SetFallbackUDP(uaddr.Port) - return usocket -} - -func parseBootnodes(ctx *cli.Context) ([]*enode.Node, error) { - s := params.RinkebyBootnodes - if ctx.IsSet(bootnodesFlag.Name) { - input := ctx.String(bootnodesFlag.Name) - if input == "" { - return nil, nil - } - s = strings.Split(input, ",") - } - nodes := make([]*enode.Node, len(s)) - var err error - for i, record := range s { - nodes[i], err = parseNode(record) - if err != nil { - return nil, fmt.Errorf("invalid bootstrap node: %v", err) - } - } - return nodes, nil -} diff --git a/cmd/devp2p/discv5cmd.go b/cmd/devp2p/discv5cmd.go deleted file mode 100644 index 63255157bad..00000000000 --- a/cmd/devp2p/discv5cmd.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "time" - - "github.com/ledgerwatch/erigon/cmd/devp2p/internal/v5test" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/p2p/discover" - "github.com/urfave/cli" -) - -var ( - discv5Command = cli.Command{ - Name: "discv5", - Usage: "Node Discovery v5 tools", - Subcommands: []cli.Command{ - discv5PingCommand, - discv5ResolveCommand, - discv5CrawlCommand, - discv5TestCommand, - discv5ListenCommand, - }, - } - discv5PingCommand = cli.Command{ - Name: "ping", - Usage: "Sends ping to a node", - Action: discv5Ping, - } - discv5ResolveCommand = cli.Command{ - Name: "resolve", - Usage: "Finds a node in the DHT", - Action: discv5Resolve, - Flags: []cli.Flag{bootnodesFlag}, - } - discv5CrawlCommand = cli.Command{ - Name: "crawl", - Usage: "Updates a nodes.json file with random nodes found in the DHT", - Action: discv5Crawl, - Flags: []cli.Flag{bootnodesFlag, crawlTimeoutFlag}, - } - discv5TestCommand = cli.Command{ - Name: "test", - Usage: "Runs protocol tests against a node", - Action: discv5Test, - Flags: []cli.Flag{ - testPatternFlag, - testTAPFlag, - testListen1Flag, - testListen2Flag, - }, - } - discv5ListenCommand = cli.Command{ - Name: "listen", - Usage: "Runs a node", - Action: discv5Listen, - Flags: []cli.Flag{ - bootnodesFlag, - nodekeyFlag, - nodedbFlag, - listenAddrFlag, - }, - } -) - -func discv5Ping(ctx *cli.Context) error { - n := getNodeArg(ctx) - disc := startV5(ctx) - defer disc.Close() - - fmt.Println(disc.Ping(n)) - return nil -} - -func discv5Resolve(ctx *cli.Context) error { - n := getNodeArg(ctx) - disc := startV5(ctx) - defer disc.Close() - - fmt.Println(disc.Resolve(n)) - return nil -} - -func discv5Crawl(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need nodes file as argument") - } - nodesFile := ctx.Args().First() - var inputSet nodeSet - if common.FileExist(nodesFile) { - inputSet = loadNodesJSON(nodesFile) - } - - disc := startV5(ctx) - defer disc.Close() - c := newCrawler(inputSet, disc, disc.RandomNodes()) - c.revalidateInterval = 10 * time.Minute - output := c.run(ctx.Duration(crawlTimeoutFlag.Name)) - writeNodesJSON(nodesFile, output) - return nil -} - -// discv5Test runs the protocol test suite. -func discv5Test(ctx *cli.Context) error { - suite := &v5test.Suite{ - Dest: getNodeArg(ctx), - Listen1: ctx.String(testListen1Flag.Name), - Listen2: ctx.String(testListen2Flag.Name), - } - return runTests(ctx, suite.AllTests()) -} - -func discv5Listen(ctx *cli.Context) error { - disc := startV5(ctx) - defer disc.Close() - - fmt.Println(disc.Self()) - select {} -} - -// startV5 starts an ephemeral discovery v5 node. -func startV5(ctx *cli.Context) *discover.UDPv5 { - ln, config := makeDiscoveryConfig(ctx) - socket := listen(ln, ctx.String(listenAddrFlag.Name)) - disc, err := discover.ListenV5(socket, ln, config) - if err != nil { - exit(err) - } - return disc -} diff --git a/cmd/devp2p/dns_cloudflare.go b/cmd/devp2p/dns_cloudflare.go deleted file mode 100644 index 14b4ec1853f..00000000000 --- a/cmd/devp2p/dns_cloudflare.go +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "strings" - - "github.com/cloudflare/cloudflare-go" - "github.com/ledgerwatch/erigon/p2p/dnsdisc" - "github.com/ledgerwatch/log/v3" - "github.com/urfave/cli" -) - -var ( - cloudflareTokenFlag = cli.StringFlag{ - Name: "token", - Usage: "CloudFlare API token", - EnvVar: "CLOUDFLARE_API_TOKEN", - } - cloudflareZoneIDFlag = cli.StringFlag{ - Name: "zoneid", - Usage: "CloudFlare Zone ID (optional)", - } -) - -type cloudflareClient struct { - *cloudflare.API - zoneID string -} - -// newCloudflareClient sets up a CloudFlare API client from command line flags. -func newCloudflareClient(ctx *cli.Context) *cloudflareClient { - token := ctx.String(cloudflareTokenFlag.Name) - if token == "" { - exit(fmt.Errorf("need cloudflare API token to proceed")) - } - api, err := cloudflare.NewWithAPIToken(token) - if err != nil { - exit(fmt.Errorf("can't create Cloudflare client: %v", err)) - } - return &cloudflareClient{ - API: api, - zoneID: ctx.String(cloudflareZoneIDFlag.Name), - } -} - -// deploy uploads the given tree to CloudFlare DNS. -func (c *cloudflareClient) deploy(name string, t *dnsdisc.Tree) error { - if err := c.checkZone(name); err != nil { - return err - } - records := t.ToTXT(name) - return c.uploadRecords(name, records) -} - -// checkZone verifies permissions on the CloudFlare DNS Zone for name. -func (c *cloudflareClient) checkZone(name string) error { - if c.zoneID == "" { - log.Info(fmt.Sprintf("Finding CloudFlare zone ID for %s", name)) - id, err := c.ZoneIDByName(name) - if err != nil { - return err - } - c.zoneID = id - } - log.Info(fmt.Sprintf("Checking Permissions on zone %s", c.zoneID)) - zone, err := c.ZoneDetails(c.zoneID) - if err != nil { - return err - } - if !strings.HasSuffix(name, "."+zone.Name) { - return fmt.Errorf("CloudFlare zone name %q does not match name %q to be deployed", zone.Name, name) - } - needPerms := map[string]bool{"#zone:edit": false, "#zone:read": false} - for _, perm := range zone.Permissions { - if _, ok := needPerms[perm]; ok { - needPerms[perm] = true - } - } - for _, ok := range needPerms { - if !ok { - return fmt.Errorf("wrong permissions on zone %s: %v", c.zoneID, needPerms) - } - } - return nil -} - -// uploadRecords updates the TXT records at a particular subdomain. All non-root records -// will have a TTL of "infinity" and all existing records not in the new map will be -// nuked! -func (c *cloudflareClient) uploadRecords(name string, records map[string]string) error { - // Convert all names to lowercase. - lrecords := make(map[string]string, len(records)) - for name, r := range records { - lrecords[strings.ToLower(name)] = r - } - records = lrecords - - log.Info(fmt.Sprintf("Retrieving existing TXT records on %s", name)) - entries, err := c.DNSRecords(c.zoneID, cloudflare.DNSRecord{Type: "TXT"}) - if err != nil { - return err - } - existing := make(map[string]cloudflare.DNSRecord) - for _, entry := range entries { - if !strings.HasSuffix(entry.Name, name) { - continue - } - existing[strings.ToLower(entry.Name)] = entry - } - - // Iterate over the new records and inject anything missing. - for path, val := range records { - old, exists := existing[path] - if !exists { - // Entry is unknown, push a new one to Cloudflare. - log.Info(fmt.Sprintf("Creating %s = %q", path, val)) - ttl := rootTTL - if path != name { - ttl = treeNodeTTL // Max TTL permitted by Cloudflare - } - _, err = c.CreateDNSRecord(c.zoneID, cloudflare.DNSRecord{Type: "TXT", Name: path, Content: val, TTL: ttl}) - } else if old.Content != val { - // Entry already exists, only change its content. - log.Info(fmt.Sprintf("Updating %s from %q to %q", path, old.Content, val)) - old.Content = val - err = c.UpdateDNSRecord(c.zoneID, old.ID, old) - } else { - log.Info(fmt.Sprintf("Skipping %s = %q", path, val)) - } - if err != nil { - return fmt.Errorf("failed to publish %s: %v", path, err) - } - } - - // Iterate over the old records and delete anything stale. - for path, entry := range existing { - if _, ok := records[path]; ok { - continue - } - // Stale entry, nuke it. - log.Info(fmt.Sprintf("Deleting %s = %q", path, entry.Content)) - if err := c.DeleteDNSRecord(c.zoneID, entry.ID); err != nil { - return fmt.Errorf("failed to delete %s: %v", path, err) - } - } - return nil -} diff --git a/cmd/devp2p/dns_route53.go b/cmd/devp2p/dns_route53.go deleted file mode 100644 index 7c71dc99aa6..00000000000 --- a/cmd/devp2p/dns_route53.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "errors" - "fmt" - "sort" - "strconv" - "strings" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/credentials" - "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/route53" - "github.com/ledgerwatch/erigon/p2p/dnsdisc" - "github.com/ledgerwatch/log/v3" - - cli "github.com/urfave/cli" -) - -const ( - // Route53 limits change sets to 32k of 'RDATA size'. Change sets are also limited to - // 1000 items. UPSERTs count double. - // https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html#limits-api-requests-changeresourcerecordsets - route53ChangeSizeLimit = 32000 - route53ChangeCountLimit = 1000 -) - -var ( - route53AccessKeyFlag = cli.StringFlag{ - Name: "access-key-id", - Usage: "AWS Access Key ID", - EnvVar: "AWS_ACCESS_KEY_ID", - } - route53AccessSecretFlag = cli.StringFlag{ - Name: "access-key-secret", - Usage: "AWS Access Key Secret", - EnvVar: "AWS_SECRET_ACCESS_KEY", - } - route53ZoneIDFlag = cli.StringFlag{ - Name: "zone-id", - Usage: "Route53 Zone ID", - } -) - -type route53Client struct { - api *route53.Route53 - zoneID string -} - -type recordSet struct { - values []string - ttl int64 -} - -// newRoute53Client sets up a Route53 API client from command line flags. -func newRoute53Client(ctx *cli.Context) *route53Client { - akey := ctx.String(route53AccessKeyFlag.Name) - asec := ctx.String(route53AccessSecretFlag.Name) - if akey == "" || asec == "" { - exit(fmt.Errorf("need Route53 Access Key ID and secret proceed")) - } - config := &aws.Config{Credentials: credentials.NewStaticCredentials(akey, asec, "")} - session, err := session.NewSession(config) - if err != nil { - exit(fmt.Errorf("can't create AWS session: %v", err)) - } - return &route53Client{ - api: route53.New(session), - zoneID: ctx.String(route53ZoneIDFlag.Name), - } -} - -// deploy uploads the given tree to Route53. -func (c *route53Client) deploy(name string, t *dnsdisc.Tree) error { - if err := c.checkZone(name); err != nil { - return err - } - - // Compute DNS changes. - existing, err := c.collectRecords(name) - if err != nil { - return err - } - log.Info(fmt.Sprintf("Found %d TXT records", len(existing))) - - records := t.ToTXT(name) - changes := c.computeChanges(name, records, existing) - if len(changes) == 0 { - log.Info("No DNS changes needed") - return nil - } - - // Submit change batches. - batches := splitChanges(changes, route53ChangeSizeLimit, route53ChangeCountLimit) - for i, changes := range batches { - log.Info(fmt.Sprintf("Submitting %d changes to Route53", len(changes))) - batch := new(route53.ChangeBatch) - batch.SetChanges(changes) - batch.SetComment(fmt.Sprintf("enrtree update %d/%d of %s at seq %d", i+1, len(batches), name, t.Seq())) - req := &route53.ChangeResourceRecordSetsInput{HostedZoneId: &c.zoneID, ChangeBatch: batch} - resp, err := c.api.ChangeResourceRecordSets(req) - if err != nil { - return err - } - - log.Info(fmt.Sprintf("Waiting for change request %s", *resp.ChangeInfo.Id)) - wreq := &route53.GetChangeInput{Id: resp.ChangeInfo.Id} - if err := c.api.WaitUntilResourceRecordSetsChanged(wreq); err != nil { - return err - } - } - return nil -} - -// checkZone verifies zone information for the given domain. -func (c *route53Client) checkZone(name string) (err error) { - if c.zoneID == "" { - c.zoneID, err = c.findZoneID(name) - } - return err -} - -// findZoneID searches for the Zone ID containing the given domain. -func (c *route53Client) findZoneID(name string) (string, error) { - log.Info(fmt.Sprintf("Finding Route53 Zone ID for %s", name)) - var req route53.ListHostedZonesByNameInput - for { - resp, err := c.api.ListHostedZonesByName(&req) - if err != nil { - return "", err - } - for _, zone := range resp.HostedZones { - if isSubdomain(name, *zone.Name) { - return *zone.Id, nil - } - } - if !*resp.IsTruncated { - break - } - req.DNSName = resp.NextDNSName - req.HostedZoneId = resp.NextHostedZoneId - } - return "", errors.New("can't find zone ID for " + name) -} - -// computeChanges creates DNS changes for the given record. -func (c *route53Client) computeChanges(name string, records map[string]string, existing map[string]recordSet) []*route53.Change { - // Convert all names to lowercase. - lrecords := make(map[string]string, len(records)) - for name, r := range records { - lrecords[strings.ToLower(name)] = r - } - records = lrecords - - //nolint:prealloc - var changes []*route53.Change - for path, val := range records { - ttl := int64(rootTTL) - if path != name { - ttl = int64(treeNodeTTL) - } - - prevRecords, exists := existing[path] - prevValue := strings.Join(prevRecords.values, "") - if !exists { - // Entry is unknown, push a new one - log.Info(fmt.Sprintf("Creating %s = %q", path, val)) - changes = append(changes, newTXTChange("CREATE", path, ttl, splitTXT(val))) - } else if prevValue != val || prevRecords.ttl != ttl { - // Entry already exists, only change its content. - log.Info(fmt.Sprintf("Updating %s from %q to %q", path, prevValue, val)) - changes = append(changes, newTXTChange("UPSERT", path, ttl, splitTXT(val))) - } else { - log.Info(fmt.Sprintf("Skipping %s = %q", path, val)) - } - } - - // Iterate over the old records and delete anything stale. - for path, set := range existing { - if _, ok := records[path]; ok { - continue - } - // Stale entry, nuke it. - log.Info(fmt.Sprintf("Deleting %s = %q", path, strings.Join(set.values, ""))) - changes = append(changes, newTXTChange("DELETE", path, set.ttl, set.values...)) - } - - sortChanges(changes) - return changes -} - -// sortChanges ensures DNS changes are in leaf-added -> root-changed -> leaf-deleted order. -func sortChanges(changes []*route53.Change) { - score := map[string]int{"CREATE": 1, "UPSERT": 2, "DELETE": 3} - sort.Slice(changes, func(i, j int) bool { - if *changes[i].Action == *changes[j].Action { - return *changes[i].ResourceRecordSet.Name < *changes[j].ResourceRecordSet.Name - } - return score[*changes[i].Action] < score[*changes[j].Action] - }) -} - -// splitChanges splits up DNS changes such that each change batch -// is smaller than the given RDATA limit. -func splitChanges(changes []*route53.Change, sizeLimit, countLimit int) [][]*route53.Change { - var ( - batches [][]*route53.Change - batchSize int - batchCount int - ) - for _, ch := range changes { - // Start new batch if this change pushes the current one over the limit. - count := changeCount(ch) - size := changeSize(ch) * count - overSize := batchSize+size > sizeLimit - overCount := batchCount+count > countLimit - if len(batches) == 0 || overSize || overCount { - batches = append(batches, nil) - batchSize = 0 - batchCount = 0 - } - batches[len(batches)-1] = append(batches[len(batches)-1], ch) - batchSize += size - batchCount += count - } - return batches -} - -// changeSize returns the RDATA size of a DNS change. -func changeSize(ch *route53.Change) int { - size := 0 - for _, rr := range ch.ResourceRecordSet.ResourceRecords { - if rr.Value != nil { - size += len(*rr.Value) - } - } - return size -} - -func changeCount(ch *route53.Change) int { - if *ch.Action == "UPSERT" { - return 2 - } - return 1 -} - -// collectRecords collects all TXT records below the given name. -func (c *route53Client) collectRecords(name string) (map[string]recordSet, error) { - log.Info(fmt.Sprintf("Retrieving existing TXT records on %s (%s)", name, c.zoneID)) - var req route53.ListResourceRecordSetsInput - req.SetHostedZoneId(c.zoneID) - existing := make(map[string]recordSet) - err := c.api.ListResourceRecordSetsPages(&req, func(resp *route53.ListResourceRecordSetsOutput, last bool) bool { - for _, set := range resp.ResourceRecordSets { - if !isSubdomain(*set.Name, name) || *set.Type != "TXT" { - continue - } - s := recordSet{ttl: *set.TTL} - for _, rec := range set.ResourceRecords { - s.values = append(s.values, *rec.Value) - } - name := strings.TrimSuffix(*set.Name, ".") - existing[name] = s - } - return true - }) - return existing, err -} - -// newTXTChange creates a change to a TXT record. -func newTXTChange(action, name string, ttl int64, values ...string) *route53.Change { - var c route53.Change - var r route53.ResourceRecordSet - rrs := make([]*route53.ResourceRecord, len(values)) - for i := range values { - rr := new(route53.ResourceRecord) - rr.SetValue(values[i]) - rrs[i] = rr - } - r.SetType("TXT") - r.SetName(name) - r.SetTTL(ttl) - r.SetResourceRecords(rrs) - c.SetAction(action) - c.SetResourceRecordSet(&r) - return &c -} - -// isSubdomain returns true if name is a subdomain of domain. -func isSubdomain(name, domain string) bool { - domain = strings.TrimSuffix(domain, ".") - name = strings.TrimSuffix(name, ".") - return strings.HasSuffix("."+name, "."+domain) -} - -// splitTXT splits value into a list of quoted 255-character strings. -func splitTXT(value string) string { - var result strings.Builder - for len(value) > 0 { - rlen := len(value) - if rlen > 253 { - rlen = 253 - } - result.WriteString(strconv.Quote(value[:rlen])) - value = value[rlen:] - } - return result.String() -} diff --git a/cmd/devp2p/dns_route53_test.go b/cmd/devp2p/dns_route53_test.go deleted file mode 100644 index a2ef3791f68..00000000000 --- a/cmd/devp2p/dns_route53_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "reflect" - "testing" - - "github.com/aws/aws-sdk-go/service/route53" -) - -// This test checks that computeChanges/splitChanges create DNS changes in -// leaf-added -> root-changed -> leaf-deleted order. -func TestRoute53ChangeSort(t *testing.T) { - testTree0 := map[string]recordSet{ - "2kfjogvxdqtxxugbh7gs7naaai.n": {ttl: 3333, values: []string{ - `"enr:-HW4QO1ml1DdXLeZLsUxewnthhUy8eROqkDyoMTyavfks9JlYQIlMFEUoM78PovJDPQrAkrb3LRJ-""vtrymDguKCOIAWAgmlkgnY0iXNlY3AyNTZrMaEDffaGfJzgGhUif1JqFruZlYmA31HzathLSWxfbq_QoQ4"`, - }}, - "fdxn3sn67na5dka4j2gok7bvqi.n": {ttl: treeNodeTTL, values: []string{`"enrtree-branch:"`}}, - "n": {ttl: rootTTL, values: []string{`"enrtree-root:v1 e=2KFJOGVXDQTXXUGBH7GS7NAAAI l=FDXN3SN67NA5DKA4J2GOK7BVQI seq=0 sig=v_-J_q_9ICQg5ztExFvLQhDBGMb0lZPJLhe3ts9LAcgqhOhtT3YFJsl8BWNDSwGtamUdR-9xl88_w-X42SVpjwE"`}}, - } - - testTree1 := map[string]string{ - "n": "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA", - "C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org", - "JWXYDBPXYWG6FX3GMDIBFA6CJ4.n": "enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24", - "2XS2367YHAXJFGLZHVAWLQD4ZY.n": "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA", - "H4FHT4B454P6UXFD7JCYQ5PWDY.n": "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI", - "MHTDO6TMUBRIA2XWG5LUDACK24.n": "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o", - } - - wantChanges := []*route53.Change{ - { - Action: sp("CREATE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("2xs2367yhaxjfglzhvawlqd4zy.n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA"`), - }}, - TTL: ip(treeNodeTTL), - Type: sp("TXT"), - }, - }, - { - Action: sp("CREATE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("c7hrfpf3blgf3yr4dy5kx3smbe.n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"`), - }}, - TTL: ip(treeNodeTTL), - Type: sp("TXT"), - }, - }, - { - Action: sp("CREATE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("h4fht4b454p6uxfd7jcyq5pwdy.n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI"`), - }}, - TTL: ip(treeNodeTTL), - Type: sp("TXT"), - }, - }, - { - Action: sp("CREATE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("jwxydbpxywg6fx3gmdibfa6cj4.n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24"`), - }}, - TTL: ip(treeNodeTTL), - Type: sp("TXT"), - }, - }, - { - Action: sp("CREATE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("mhtdo6tmubria2xwg5ludack24.n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o"`), - }}, - TTL: ip(treeNodeTTL), - Type: sp("TXT"), - }, - }, - { - Action: sp("UPSERT"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA"`), - }}, - TTL: ip(rootTTL), - Type: sp("TXT"), - }, - }, - { - Action: sp("DELETE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("2kfjogvxdqtxxugbh7gs7naaai.n"), - ResourceRecords: []*route53.ResourceRecord{ - {Value: sp(`"enr:-HW4QO1ml1DdXLeZLsUxewnthhUy8eROqkDyoMTyavfks9JlYQIlMFEUoM78PovJDPQrAkrb3LRJ-""vtrymDguKCOIAWAgmlkgnY0iXNlY3AyNTZrMaEDffaGfJzgGhUif1JqFruZlYmA31HzathLSWxfbq_QoQ4"`)}, - }, - TTL: ip(3333), - Type: sp("TXT"), - }, - }, - { - Action: sp("DELETE"), - ResourceRecordSet: &route53.ResourceRecordSet{ - Name: sp("fdxn3sn67na5dka4j2gok7bvqi.n"), - ResourceRecords: []*route53.ResourceRecord{{ - Value: sp(`"enrtree-branch:"`), - }}, - TTL: ip(treeNodeTTL), - Type: sp("TXT"), - }, - }, - } - - var client route53Client - changes := client.computeChanges("n", testTree1, testTree0) - if !reflect.DeepEqual(changes, wantChanges) { - t.Fatalf("wrong changes (got %d, want %d)", len(changes), len(wantChanges)) - } - - // Check splitting according to size. - wantSplit := [][]*route53.Change{ - wantChanges[:4], - wantChanges[4:6], - wantChanges[6:], - } - split := splitChanges(changes, 600, 4000) - if !reflect.DeepEqual(split, wantSplit) { - t.Fatalf("wrong split batches: got %d, want %d", len(split), len(wantSplit)) - } - - // Check splitting according to count. - wantSplit = [][]*route53.Change{ - wantChanges[:5], - wantChanges[5:], - } - split = splitChanges(changes, 10000, 6) - if !reflect.DeepEqual(split, wantSplit) { - t.Fatalf("wrong split batches: got %d, want %d", len(split), len(wantSplit)) - } -} - -func sp(s string) *string { return &s } -func ip(i int64) *int64 { return &i } diff --git a/cmd/devp2p/dnscmd.go b/cmd/devp2p/dnscmd.go deleted file mode 100644 index 53522a5d548..00000000000 --- a/cmd/devp2p/dnscmd.go +++ /dev/null @@ -1,374 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "crypto/ecdsa" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "time" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p/dnsdisc" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/urfave/cli" -) - -var ( - dnsCommand = cli.Command{ - Name: "dns", - Usage: "DNS Discovery Commands", - Subcommands: []cli.Command{ - dnsSyncCommand, - dnsSignCommand, - dnsTXTCommand, - dnsCloudflareCommand, - dnsRoute53Command, - }, - } - dnsSyncCommand = cli.Command{ - Name: "sync", - Usage: "Download a DNS discovery tree", - ArgsUsage: " [ ]", - Action: dnsSync, - Flags: []cli.Flag{dnsTimeoutFlag}, - } - dnsSignCommand = cli.Command{ - Name: "sign", - Usage: "Sign a DNS discovery tree", - ArgsUsage: " ", - Action: dnsSign, - Flags: []cli.Flag{dnsDomainFlag, dnsSeqFlag}, - } - dnsTXTCommand = cli.Command{ - Name: "to-txt", - Usage: "Create a DNS TXT records for a discovery tree", - ArgsUsage: " ", - Action: dnsToTXT, - } - dnsCloudflareCommand = cli.Command{ - Name: "to-cloudflare", - Usage: "Deploy DNS TXT records to CloudFlare", - ArgsUsage: "", - Action: dnsToCloudflare, - Flags: []cli.Flag{cloudflareTokenFlag, cloudflareZoneIDFlag}, - } - dnsRoute53Command = cli.Command{ - Name: "to-route53", - Usage: "Deploy DNS TXT records to Amazon Route53", - ArgsUsage: "", - Action: dnsToRoute53, - Flags: []cli.Flag{route53AccessKeyFlag, route53AccessSecretFlag, route53ZoneIDFlag}, - } -) - -var ( - dnsTimeoutFlag = cli.DurationFlag{ - Name: "timeout", - Usage: "Timeout for DNS lookups", - } - dnsDomainFlag = cli.StringFlag{ - Name: "domain", - Usage: "Domain name of the tree", - } - dnsSeqFlag = cli.UintFlag{ - Name: "seq", - Usage: "New sequence number of the tree", - } -) - -const ( - rootTTL = 30 * 60 // 30 min - treeNodeTTL = 4 * 7 * 24 * 60 * 60 // 4 weeks -) - -// dnsSync performs dnsSyncCommand. -func dnsSync(ctx *cli.Context) error { - var ( - c = dnsClient(ctx) - url = ctx.Args().Get(0) - outdir = ctx.Args().Get(1) - ) - domain, _, err := dnsdisc.ParseURL(url) - if err != nil { - return err - } - if outdir == "" { - outdir = domain - } - - t, err := c.SyncTree(url) - if err != nil { - return err - } - def := treeToDefinition(url, t) - def.Meta.LastModified = time.Now() - writeTreeMetadata(outdir, def) - writeTreeNodes(outdir, def) - return nil -} - -func dnsSign(ctx *cli.Context) error { - if ctx.NArg() < 2 { - return fmt.Errorf("need tree definition directory and key file as arguments") - } - var ( - defdir = ctx.Args().Get(0) - keyText = ctx.Args().Get(1) - def = loadTreeDefinition(defdir) - domain = directoryName(defdir) - ) - if def.Meta.URL != "" { - d, _, err := dnsdisc.ParseURL(def.Meta.URL) - if err != nil { - return fmt.Errorf("invalid 'url' field: %v", err) - } - domain = d - } - if ctx.IsSet(dnsDomainFlag.Name) { - domain = ctx.String(dnsDomainFlag.Name) - } - if ctx.IsSet(dnsSeqFlag.Name) { - def.Meta.Seq = ctx.Uint(dnsSeqFlag.Name) - } else { - def.Meta.Seq++ // Auto-bump sequence number if not supplied via flag. - } - t, err := dnsdisc.MakeTree(def.Meta.Seq, def.Nodes, def.Meta.Links) - if err != nil { - return err - } - - key, keyErr := crypto.HexToECDSA(keyText) - if keyErr != nil { - return fmt.Errorf("invalid signing key: %v", keyErr) - } - url, err := t.Sign(key, domain) - if err != nil { - return fmt.Errorf("can't sign: %v", err) - } - - def = treeToDefinition(url, t) - def.Meta.LastModified = time.Now() - writeTreeMetadata(defdir, def) - return nil -} - -func directoryName(dir string) string { - abs, err := filepath.Abs(dir) - if err != nil { - exit(err) - } - return filepath.Base(abs) -} - -// dnsToTXT peforms dnsTXTCommand. -func dnsToTXT(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need tree definition directory as argument") - } - output := ctx.Args().Get(1) - if output == "" { - output = "-" // default to stdout - } - domain, t, err := loadTreeDefinitionForExport(ctx.Args().Get(0)) - if err != nil { - return err - } - writeTXTJSON(output, t.ToTXT(domain)) - return nil -} - -// dnsToCloudflare peforms dnsCloudflareCommand. -func dnsToCloudflare(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need tree definition directory as argument") - } - domain, t, err := loadTreeDefinitionForExport(ctx.Args().Get(0)) - if err != nil { - return err - } - client := newCloudflareClient(ctx) - return client.deploy(domain, t) -} - -// dnsToRoute53 peforms dnsRoute53Command. -func dnsToRoute53(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need tree definition directory as argument") - } - domain, t, err := loadTreeDefinitionForExport(ctx.Args().Get(0)) - if err != nil { - return err - } - client := newRoute53Client(ctx) - return client.deploy(domain, t) -} - -// dnsClient configures the DNS discovery client from command line flags. -func dnsClient(ctx *cli.Context) *dnsdisc.Client { - var cfg dnsdisc.Config - if commandHasFlag(ctx, dnsTimeoutFlag) { - cfg.Timeout = ctx.Duration(dnsTimeoutFlag.Name) - } - return dnsdisc.NewClient(cfg) -} - -// There are two file formats for DNS node trees on disk: -// -// The 'TXT' format is a single JSON file containing DNS TXT records -// as a JSON object where the keys are names and the values are objects -// containing the value of the record. -// -// The 'definition' format is a directory containing two files: -// -// enrtree-info.json -- contains sequence number & links to other trees -// nodes.json -- contains the nodes as a JSON array. -// -// This format exists because it's convenient to edit. nodes.json can be generated -// in multiple ways: it may be written by a DHT crawler or compiled by a human. - -type dnsDefinition struct { - Meta dnsMetaJSON - Nodes []*enode.Node -} - -type dnsMetaJSON struct { - URL string `json:"url,omitempty"` - Seq uint `json:"seq"` - Sig string `json:"signature,omitempty"` - Links []string `json:"links"` - LastModified time.Time `json:"lastModified"` -} - -func treeToDefinition(url string, t *dnsdisc.Tree) *dnsDefinition { - meta := dnsMetaJSON{ - URL: url, - Seq: t.Seq(), - Sig: t.Signature(), - Links: t.Links(), - } - if meta.Links == nil { - meta.Links = []string{} - } - return &dnsDefinition{Meta: meta, Nodes: t.Nodes()} -} - -// loadTreeDefinition loads a directory in 'definition' format. -func loadTreeDefinition(directory string) *dnsDefinition { - metaFile, nodesFile := treeDefinitionFiles(directory) - var def dnsDefinition - err := common.LoadJSON(metaFile, &def.Meta) - if err != nil && !os.IsNotExist(err) { - exit(err) - } - if def.Meta.Links == nil { - def.Meta.Links = []string{} - } - // Check link syntax. - for _, link := range def.Meta.Links { - if _, _, err := dnsdisc.ParseURL(link); err != nil { - exit(fmt.Errorf("invalid link %q: %v", link, err)) - } - } - // Check/convert nodes. - nodes := loadNodesJSON(nodesFile) - if err := nodes.verify(); err != nil { - exit(err) - } - def.Nodes = nodes.nodes() - return &def -} - -// loadTreeDefinitionForExport loads a DNS tree and ensures it is signed. -func loadTreeDefinitionForExport(dir string) (domain string, t *dnsdisc.Tree, err error) { - metaFile, _ := treeDefinitionFiles(dir) - def := loadTreeDefinition(dir) - if def.Meta.URL == "" { - return "", nil, fmt.Errorf("missing 'url' field in %v", metaFile) - } - domain, pubkey, err := dnsdisc.ParseURL(def.Meta.URL) - if err != nil { - return "", nil, fmt.Errorf("invalid 'url' field in %v: %v", metaFile, err) - } - if t, err = dnsdisc.MakeTree(def.Meta.Seq, def.Nodes, def.Meta.Links); err != nil { - return "", nil, err - } - if err := ensureValidTreeSignature(t, pubkey, def.Meta.Sig); err != nil { - return "", nil, err - } - return domain, t, nil -} - -// ensureValidTreeSignature checks that sig is valid for tree and assigns it as the -// tree's signature if valid. -func ensureValidTreeSignature(t *dnsdisc.Tree, pubkey *ecdsa.PublicKey, sig string) error { - if sig == "" { - return fmt.Errorf("missing signature, run 'devp2p dns sign' first") - } - if err := t.SetSignature(pubkey, sig); err != nil { - return fmt.Errorf("invalid signature on tree, run 'devp2p dns sign' to update it") - } - return nil -} - -// writeTreeMetadata writes a DNS node tree metadata file to the given directory. -func writeTreeMetadata(directory string, def *dnsDefinition) { - metaJSON, err := json.MarshalIndent(&def.Meta, "", jsonIndent) - if err != nil { - exit(err) - } - if err := os.MkdirAll(directory, 0744); err != nil && !os.IsExist(err) { - exit(err) - } - metaFile, _ := treeDefinitionFiles(directory) - if err := ioutil.WriteFile(metaFile, metaJSON, 0644); err != nil { - exit(err) - } -} - -func writeTreeNodes(directory string, def *dnsDefinition) { - ns := make(nodeSet, len(def.Nodes)) - ns.add(def.Nodes...) - _, nodesFile := treeDefinitionFiles(directory) - writeNodesJSON(nodesFile, ns) -} - -func treeDefinitionFiles(directory string) (string, string) { - meta := filepath.Join(directory, "enrtree-info.json") - nodes := filepath.Join(directory, "nodes.json") - return meta, nodes -} - -// writeTXTJSON writes TXT records in JSON format. -func writeTXTJSON(file string, txt map[string]string) { - txtJSON, err := json.MarshalIndent(txt, "", jsonIndent) - if err != nil { - exit(err) - } - if file == "-" { - os.Stdout.Write(txtJSON) - fmt.Println() - return - } - if err := ioutil.WriteFile(file, txtJSON, 0644); err != nil { - exit(err) - } -} diff --git a/cmd/devp2p/enrcmd.go b/cmd/devp2p/enrcmd.go deleted file mode 100644 index aacd966db6c..00000000000 --- a/cmd/devp2p/enrcmd.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "bytes" - "encoding/base64" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "net" - "os" - "strconv" - "strings" - - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/p2p/enr" - "github.com/ledgerwatch/erigon/rlp" - "github.com/urfave/cli" -) - -var enrdumpCommand = cli.Command{ - Name: "enrdump", - Usage: "Pretty-prints node records", - Action: enrdump, - Flags: []cli.Flag{ - cli.StringFlag{Name: "file"}, - }, -} - -func enrdump(ctx *cli.Context) error { - var source string - if file := ctx.String("file"); file != "" { - if ctx.NArg() != 0 { - return fmt.Errorf("can't dump record from command-line argument in -file mode") - } - var b []byte - var err error - if file == "-" { - b, err = ioutil.ReadAll(os.Stdin) - } else { - b, err = ioutil.ReadFile(file) - } - if err != nil { - return err - } - source = string(b) - } else if ctx.NArg() == 1 { - source = ctx.Args()[0] - } else { - return fmt.Errorf("need record as argument") - } - - r, err := parseRecord(source) - if err != nil { - return fmt.Errorf("INVALID: %v", err) - } - dumpRecord(os.Stdout, r) - return nil -} - -// dumpRecord creates a human-readable description of the given node record. -func dumpRecord(out io.Writer, r *enr.Record) { - n, err := enode.New(enode.ValidSchemes, r) - if err != nil { - fmt.Fprintf(out, "INVALID: %v\n", err) - } else { - fmt.Fprintf(out, "Node ID: %v\n", n.ID()) - dumpNodeURL(out, n) - } - kv := r.AppendElements(nil)[1:] - fmt.Fprintf(out, "Record has sequence number %d and %d key/value pairs.\n", r.Seq(), len(kv)/2) - fmt.Fprint(out, dumpRecordKV(kv, 2)) -} - -func dumpNodeURL(out io.Writer, n *enode.Node) { - var key enode.Secp256k1 - if n.Load(&key) != nil { - return // no secp256k1 public key - } - fmt.Fprintf(out, "URLv4: %s\n", n.URLv4()) -} - -func dumpRecordKV(kv []interface{}, indent int) string { - // Determine the longest key name for alignment. - var out string - var longestKey = 0 - for i := 0; i < len(kv); i += 2 { - key := kv[i].(string) - if len(key) > longestKey { - longestKey = len(key) - } - } - // Print the keys, invoking formatters for known keys. - for i := 0; i < len(kv); i += 2 { - key := kv[i].(string) - val := kv[i+1].(rlp.RawValue) - pad := longestKey - len(key) - out += strings.Repeat(" ", indent) + strconv.Quote(key) + strings.Repeat(" ", pad+1) - formatter := attrFormatters[key] - if formatter == nil { - formatter = formatAttrRaw - } - fmtval, ok := formatter(val) - if ok { - out += fmtval + "\n" - } else { - out += hex.EncodeToString(val) + " (!)\n" - } - } - return out -} - -// parseNode parses a node record and verifies its signature. -func parseNode(source string) (*enode.Node, error) { - if strings.HasPrefix(source, "enode://") { - return enode.ParseV4(source) - } - r, err := parseRecord(source) - if err != nil { - return nil, err - } - return enode.New(enode.ValidSchemes, r) -} - -// parseRecord parses a node record from hex, base64, or raw binary input. -func parseRecord(source string) (*enr.Record, error) { - bin := []byte(source) - if d, ok := decodeRecordHex(bytes.TrimSpace(bin)); ok { - bin = d - } else if d, ok := decodeRecordBase64(bytes.TrimSpace(bin)); ok { - bin = d - } - var r enr.Record - err := rlp.DecodeBytes(bin, &r) - return &r, err -} - -func decodeRecordHex(b []byte) ([]byte, bool) { - if bytes.HasPrefix(b, []byte("0x")) { - b = b[2:] - } - dec := make([]byte, hex.DecodedLen(len(b))) - _, err := hex.Decode(dec, b) - return dec, err == nil -} - -func decodeRecordBase64(b []byte) ([]byte, bool) { - if bytes.HasPrefix(b, []byte("enr:")) { - b = b[4:] - } - dec := make([]byte, base64.RawURLEncoding.DecodedLen(len(b))) - n, err := base64.RawURLEncoding.Decode(dec, b) - return dec[:n], err == nil -} - -// attrFormatters contains formatting functions for well-known ENR keys. -var attrFormatters = map[string]func(rlp.RawValue) (string, bool){ - "id": formatAttrString, - "ip": formatAttrIP, - "ip6": formatAttrIP, - "tcp": formatAttrUint, - "tcp6": formatAttrUint, - "udp": formatAttrUint, - "udp6": formatAttrUint, -} - -func formatAttrRaw(v rlp.RawValue) (string, bool) { - s := hex.EncodeToString(v) - return s, true -} - -func formatAttrString(v rlp.RawValue) (string, bool) { - content, _, err := rlp.SplitString(v) - return strconv.Quote(string(content)), err == nil -} - -func formatAttrIP(v rlp.RawValue) (string, bool) { - content, _, err := rlp.SplitString(v) - if err != nil || len(content) != 4 && len(content) != 6 { - return "", false - } - return net.IP(content).String(), true -} - -func formatAttrUint(v rlp.RawValue) (string, bool) { - var x uint64 - if err := rlp.DecodeBytes(v, &x); err != nil { - return "", false - } - return strconv.FormatUint(x, 10), true -} diff --git a/cmd/devp2p/internal/ethtest/chain.go b/cmd/devp2p/internal/ethtest/chain.go deleted file mode 100644 index a1056ae976c..00000000000 --- a/cmd/devp2p/internal/ethtest/chain.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "compress/gzip" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "math/big" - "os" - "strings" - - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rlp" -) - -type Chain struct { - blocks []*types.Block - chainConfig *params.ChainConfig -} - -// Len returns the length of the chain. -func (c *Chain) Len() int { - return len(c.blocks) -} - -// TD calculates the total difficulty of the chain. -func (c *Chain) TD(height int) *big.Int { // TODO later on channge scheme so that the height is included in range - sum := big.NewInt(0) - for _, block := range c.blocks[:height] { - sum.Add(sum, block.Difficulty()) - } - return sum -} - -// ForkID gets the fork id of the chain. -func (c *Chain) ForkID() forkid.ID { - return forkid.NewID(c.chainConfig, c.blocks[0].Hash(), uint64(c.Len())) -} - -// Shorten returns a copy chain of a desired height from the imported -func (c *Chain) Shorten(height int) *Chain { - blocks := make([]*types.Block, height) - copy(blocks, c.blocks[:height]) - - config := *c.chainConfig - return &Chain{ - blocks: blocks, - chainConfig: &config, - } -} - -// Head returns the chain head. -func (c *Chain) Head() *types.Block { - return c.blocks[c.Len()-1] -} - -func (c *Chain) GetHeaders(req GetBlockHeaders) (BlockHeaders, error) { - if req.Amount < 1 { - return nil, fmt.Errorf("no block headers requested") - } - - headers := make(BlockHeaders, req.Amount) - var blockNumber uint64 - - // range over blocks to check if our chain has the requested header - for _, block := range c.blocks { - if block.Hash() == req.Origin.Hash || block.Number().Uint64() == req.Origin.Number { - headers[0] = block.Header() - blockNumber = block.Number().Uint64() - } - } - if headers[0] == nil { - return nil, fmt.Errorf("no headers found for given origin number %v, hash %v", req.Origin.Number, req.Origin.Hash) - } - - if req.Reverse { - for i := 1; i < int(req.Amount); i++ { - blockNumber -= (1 - req.Skip) - headers[i] = c.blocks[blockNumber].Header() - - } - - return headers, nil - } - - for i := 1; i < int(req.Amount); i++ { - blockNumber += (1 + req.Skip) - headers[i] = c.blocks[blockNumber].Header() - } - - return headers, nil -} - -// loadChain takes the given chain.rlp file, and decodes and returns -// the blocks from the file. -func loadChain(chainfile string, genesis string) (*Chain, error) { - chainConfig, err := ioutil.ReadFile(genesis) - if err != nil { - return nil, err - } - var gen core.Genesis - if err = json.Unmarshal(chainConfig, &gen); err != nil { - return nil, err - } - gblock, _, err := gen.ToBlock() - if err != nil { - return nil, err - } - // Load chain.rlp. - fh, err := os.Open(chainfile) - if err != nil { - return nil, err - } - defer fh.Close() - var reader io.Reader = fh - if strings.HasSuffix(chainfile, ".gz") { - if reader, err = gzip.NewReader(reader); err != nil { - return nil, err - } - } - stream := rlp.NewStream(reader, 0) - var blocks = make([]*types.Block, 1) - blocks[0] = gblock - for i := 0; ; i++ { - var b types.Block - if err = stream.Decode(&b); err == io.EOF { - break - } else if err != nil { - return nil, fmt.Errorf("at block index %d: %v", i, err) - } - if b.NumberU64() != uint64(i+1) { - return nil, fmt.Errorf("block at index %d has wrong number %d", i, b.NumberU64()) - } - blocks = append(blocks, &b) - } - - c := &Chain{blocks: blocks, chainConfig: gen.Config} - return c, nil -} diff --git a/cmd/devp2p/internal/ethtest/chain_test.go b/cmd/devp2p/internal/ethtest/chain_test.go deleted file mode 100644 index a864a5c5bc0..00000000000 --- a/cmd/devp2p/internal/ethtest/chain_test.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -//nolint:scopelint -package ethtest - -import ( - "path/filepath" - "strconv" - "testing" - - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/p2p" - "github.com/stretchr/testify/assert" -) - -// TestEthProtocolNegotiation tests whether the test suite -// can negotiate the highest eth protocol in a status message exchange -func TestEthProtocolNegotiation(t *testing.T) { - var tests = []struct { - conn *Conn - caps []p2p.Cap - expected uint32 - }{ - { - conn: &Conn{}, - caps: []p2p.Cap{ - {Name: "eth", Version: 63}, - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - }, - expected: uint32(65), - }, - { - conn: &Conn{}, - caps: []p2p.Cap{ - {Name: "eth", Version: 0}, - {Name: "eth", Version: 89}, - {Name: "eth", Version: 65}, - }, - expected: uint32(65), - }, - { - conn: &Conn{}, - caps: []p2p.Cap{ - {Name: "eth", Version: 63}, - {Name: "eth", Version: 64}, - {Name: "wrongProto", Version: 65}, - }, - expected: uint32(64), - }, - } - - for i, tt := range tests { - t.Run(strconv.Itoa(i), func(t *testing.T) { - tt.conn.negotiateEthProtocol(tt.caps) - assert.Equal(t, tt.expected, uint32(tt.conn.ethProtocolVersion)) - }) - } -} - -// TestChain_GetHeaders tests whether the test suite can correctly -// respond to a GetBlockHeaders request from a node. -func TestChain_GetHeaders(t *testing.T) { - chainFile, err := filepath.Abs("./testdata/chain.rlp") - if err != nil { - t.Fatal(err) - } - genesisFile, err := filepath.Abs("./testdata/genesis.json") - if err != nil { - t.Fatal(err) - } - - chain, err := loadChain(chainFile, genesisFile) - if err != nil { - t.Fatal(err) - } - - var tests = []struct { - req GetBlockHeaders - expected BlockHeaders - }{ - { - req: GetBlockHeaders{ - Origin: eth.HashOrNumber{ - Number: uint64(2), - }, - Amount: uint64(5), - Skip: 1, - Reverse: false, - }, - expected: BlockHeaders{ - chain.blocks[2].Header(), - chain.blocks[4].Header(), - chain.blocks[6].Header(), - chain.blocks[8].Header(), - chain.blocks[10].Header(), - }, - }, - { - req: GetBlockHeaders{ - Origin: eth.HashOrNumber{ - Number: uint64(chain.Len() - 1), - }, - Amount: uint64(3), - Skip: 0, - Reverse: true, - }, - expected: BlockHeaders{ - chain.blocks[chain.Len()-1].Header(), - chain.blocks[chain.Len()-2].Header(), - chain.blocks[chain.Len()-3].Header(), - }, - }, - { - req: GetBlockHeaders{ - Origin: eth.HashOrNumber{ - Hash: chain.Head().Hash(), - }, - Amount: uint64(1), - Skip: 0, - Reverse: false, - }, - expected: BlockHeaders{ - chain.Head().Header(), - }, - }, - } - - for i, tt := range tests { - t.Run(strconv.Itoa(i), func(t *testing.T) { - headers, err := chain.GetHeaders(tt.req) - if err != nil { - t.Fatal(err) - } - assert.Equal(t, headers, tt.expected) - }) - } -} diff --git a/cmd/devp2p/internal/ethtest/eth66_suite.go b/cmd/devp2p/internal/ethtest/eth66_suite.go deleted file mode 100644 index cbd819d54b8..00000000000 --- a/cmd/devp2p/internal/ethtest/eth66_suite.go +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright 2021 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "time" - - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/erigon/p2p" -) - -// TestStatus_66 attempts to connect to the given node and exchange -// a status message with it on the eth66 protocol, and then check to -// make sure the chain head is correct. -func (s *Suite) TestStatus_66(t *utesting.T) { - conn := s.dial66(t) - // get protoHandshake - conn.handshake(t) - // get status - switch msg := conn.statusExchange66(t, s.chain).(type) { - case *Status: - status := *msg - if status.ProtocolVersion != uint32(66) { - t.Fatalf("mismatch in version: wanted 66, got %d", status.ProtocolVersion) - } - t.Logf("got status message: %s", pretty.Sdump(msg)) - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -// TestGetBlockHeaders_66 tests whether the given node can respond to -// an eth66 `GetBlockHeaders` request and that the response is accurate. -func (s *Suite) TestGetBlockHeaders_66(t *utesting.T) { - conn := s.setupConnection66(t) - // get block headers - req := ð.GetBlockHeadersPacket66{ - RequestId: 3, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Hash: s.chain.blocks[1].Hash(), - }, - Amount: 2, - Skip: 1, - Reverse: false, - }, - } - // write message - headers := s.getBlockHeaders66(t, conn, req, req.RequestId) - // check for correct headers - headersMatch(t, s.chain, headers) -} - -// TestSimultaneousRequests_66 sends two simultaneous `GetBlockHeader` requests -// with different request IDs and checks to make sure the node responds with the correct -// headers per request. -func (s *Suite) TestSimultaneousRequests_66(t *utesting.T) { - // create two connections - conn1, conn2 := s.setupConnection66(t), s.setupConnection66(t) - // create two requests - req1 := ð.GetBlockHeadersPacket66{ - RequestId: 111, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Hash: s.chain.blocks[1].Hash(), - }, - Amount: 2, - Skip: 1, - Reverse: false, - }, - } - req2 := ð.GetBlockHeadersPacket66{ - RequestId: 222, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Hash: s.chain.blocks[1].Hash(), - }, - Amount: 4, - Skip: 1, - Reverse: false, - }, - } - // wait for headers for first request - headerChan := make(chan BlockHeaders, 1) - go func(headers chan BlockHeaders) { - headers <- s.getBlockHeaders66(t, conn1, req1, req1.RequestId) - }(headerChan) - // check headers of second request - headersMatch(t, s.chain, s.getBlockHeaders66(t, conn2, req2, req2.RequestId)) - // check headers of first request - headersMatch(t, s.chain, <-headerChan) -} - -// TestBroadcast_66 tests whether a block announcement is correctly -// propagated to the given node's peer(s) on the eth66 protocol. -func (s *Suite) TestBroadcast_66(t *utesting.T) { - sendConn, receiveConn := s.setupConnection66(t), s.setupConnection66(t) - nextBlock := len(s.chain.blocks) - blockAnnouncement := &NewBlock{ - Block: s.fullChain.blocks[nextBlock], - TD: s.fullChain.TD(nextBlock + 1), - } - s.testAnnounce66(t, sendConn, receiveConn, blockAnnouncement) - // update test suite chain - s.chain.blocks = append(s.chain.blocks, s.fullChain.blocks[nextBlock]) - // wait for client to update its chain - if err := receiveConn.waitForBlock66(s.chain.Head()); err != nil { - t.Fatal(err) - } -} - -// TestGetBlockBodies_66 tests whether the given node can respond to -// a `GetBlockBodies` request and that the response is accurate over -// the eth66 protocol. -func (s *Suite) TestGetBlockBodies_66(t *utesting.T) { - conn := s.setupConnection66(t) - // create block bodies request - id := uint64(55) - req := ð.GetBlockBodiesPacket66{ - RequestId: id, - GetBlockBodiesPacket: eth.GetBlockBodiesPacket{ - s.chain.blocks[54].Hash(), - s.chain.blocks[75].Hash(), - }, - } - if err := conn.write66(req, GetBlockBodies{}.Code()); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - - reqID, msg := conn.readAndServe66(s.chain, timeout) - switch msg := msg.(type) { - case BlockBodies: - if reqID != req.RequestId { - t.Fatalf("request ID mismatch: wanted %d, got %d", req.RequestId, reqID) - } - t.Logf("received %d block bodies", len(msg)) - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -// TestLargeAnnounce_66 tests the announcement mechanism with a large block. -func (s *Suite) TestLargeAnnounce_66(t *utesting.T) { - nextBlock := len(s.chain.blocks) - blocks := []*NewBlock{ - { - Block: largeBlock(), - TD: s.fullChain.TD(nextBlock + 1), - }, - { - Block: s.fullChain.blocks[nextBlock], - TD: largeNumber(2).ToBig(), - }, - { - Block: largeBlock(), - TD: largeNumber(2).ToBig(), - }, - { - Block: s.fullChain.blocks[nextBlock], - TD: s.fullChain.TD(nextBlock + 1), - }, - } - - for i, blockAnnouncement := range blocks[0:3] { - t.Logf("Testing malicious announcement: %v\n", i) - sendConn := s.setupConnection66(t) - if err := sendConn.Write(blockAnnouncement); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - // Invalid announcement, check that peer disconnected - switch msg := sendConn.ReadAndServe(s.chain, timeout).(type) { - case *Disconnect: - case *Error: - break - default: - t.Fatalf("unexpected: %s wanted disconnect", pretty.Sdump(msg)) - } - } - // Test the last block as a valid block - sendConn := s.setupConnection66(t) - receiveConn := s.setupConnection66(t) - s.testAnnounce66(t, sendConn, receiveConn, blocks[3]) - // update test suite chain - s.chain.blocks = append(s.chain.blocks, s.fullChain.blocks[nextBlock]) - // wait for client to update its chain - if err := receiveConn.waitForBlock66(s.fullChain.blocks[nextBlock]); err != nil { - t.Fatal(err) - } -} - -// TestMaliciousHandshake_66 tries to send malicious data during the handshake. -func (s *Suite) TestMaliciousHandshake_66(t *utesting.T) { - conn := s.dial66(t) - // write hello to client - pub0 := crypto.FromECDSAPub(&conn.ourKey.PublicKey)[1:] - handshakes := []*Hello{ - { - Version: 5, - Caps: []p2p.Cap{ - {Name: largeString(2), Version: 66}, - }, - ID: pub0, - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - {Name: "eth", Version: 66}, - }, - ID: append(pub0, byte(0)), - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - {Name: "eth", Version: 66}, - }, - ID: append(pub0, pub0...), - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - {Name: "eth", Version: 66}, - }, - ID: largeBuffer(2), - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: largeString(2), Version: 66}, - }, - ID: largeBuffer(2), - }, - } - for i, handshake := range handshakes { - t.Logf("Testing malicious handshake %v\n", i) - // Init the handshake - if err := conn.Write(handshake); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - // check that the peer disconnected - //nolint:govet - timeout := 20 * time.Second - // Discard one hello - for i := 0; i < 2; i++ { - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *Disconnect: - case *Error: - case *Hello: - // Hello's are sent concurrently, so ignore them - continue - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } - } - // Dial for the next round - conn = s.dial66(t) - } -} - -// TestMaliciousStatus_66 sends a status package with a large total difficulty. -func (s *Suite) TestMaliciousStatus_66(t *utesting.T) { - conn := s.dial66(t) - // get protoHandshake - conn.handshake(t) - status := &Status{ - ProtocolVersion: uint32(66), - NetworkID: s.chain.chainConfig.ChainID.Uint64(), - TD: largeNumber(2).ToBig(), - Head: s.chain.blocks[s.chain.Len()-1].Hash(), - Genesis: s.chain.blocks[0].Hash(), - ForkID: s.chain.ForkID(), - } - // get status - switch msg := conn.statusExchange(t, s.chain, status).(type) { - case *Status: - t.Logf("%+v\n", msg) - default: - t.Fatalf("expected status, got: %#v ", msg) - } - // wait for disconnect - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *Disconnect: - case *Error: - return - default: - t.Fatalf("expected disconnect, got: %s", pretty.Sdump(msg)) - } -} - -func (s *Suite) TestTransaction_66(t *utesting.T) { - tests := []types.Transaction{ - getNextTxFromChain(t, s), - unknownTx(t, s), - } - for i, tx := range tests { - t.Logf("Testing tx propagation: %v\n", i) - sendSuccessfulTx66(t, s, tx) - } -} - -func (s *Suite) TestMaliciousTx_66(t *utesting.T) { - tests := []types.Transaction{ - getOldTxFromChain(t, s), - invalidNonceTx(t, s), - hugeAmount(t, s), - hugeGasPrice(t, s), - hugeData(t, s), - } - for i, tx := range tests { - t.Logf("Testing malicious tx propagation: %v\n", i) - sendFailingTx66(t, s, tx) - } -} - -// TestZeroRequestID_66 checks that a request ID of zero is still handled -// by the node. -func (s *Suite) TestZeroRequestID_66(t *utesting.T) { - conn := s.setupConnection66(t) - req := ð.GetBlockHeadersPacket66{ - RequestId: 0, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Number: 0, - }, - Amount: 2, - }, - } - headersMatch(t, s.chain, s.getBlockHeaders66(t, conn, req, req.RequestId)) -} - -// TestSameRequestID_66 sends two requests with the same request ID -// concurrently to a single node. -func (s *Suite) TestSameRequestID_66(t *utesting.T) { - conn := s.setupConnection66(t) - // create two separate requests with same ID - reqID := uint64(1234) - req1 := ð.GetBlockHeadersPacket66{ - RequestId: reqID, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Number: 0, - }, - Amount: 2, - }, - } - req2 := ð.GetBlockHeadersPacket66{ - RequestId: reqID, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Number: 33, - }, - Amount: 2, - }, - } - // send requests concurrently - go func() { - headersMatch(t, s.chain, s.getBlockHeaders66(t, conn, req2, reqID)) - }() - // check response from first request - headersMatch(t, s.chain, s.getBlockHeaders66(t, conn, req1, reqID)) -} diff --git a/cmd/devp2p/internal/ethtest/eth66_suiteHelpers.go b/cmd/devp2p/internal/ethtest/eth66_suiteHelpers.go deleted file mode 100644 index 84d9dbf0984..00000000000 --- a/cmd/devp2p/internal/ethtest/eth66_suiteHelpers.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2021 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "fmt" - "time" - - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/rlp" - "github.com/stretchr/testify/assert" -) - -func (c *Conn) statusExchange66(t *utesting.T, chain *Chain) Message { - status := &Status{ - ProtocolVersion: uint32(66), - NetworkID: chain.chainConfig.ChainID.Uint64(), - TD: chain.TD(chain.Len()), - Head: chain.blocks[chain.Len()-1].Hash(), - Genesis: chain.blocks[0].Hash(), - ForkID: chain.ForkID(), - } - return c.statusExchange(t, chain, status) -} - -func (s *Suite) dial66(t *utesting.T) *Conn { - conn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - conn.caps = append(conn.caps, p2p.Cap{Name: "eth", Version: 66}) - return conn -} - -func (c *Conn) write66(req eth.Packet, code int) error { - payload, err := rlp.EncodeToBytes(req) - if err != nil { - return err - } - _, err = c.Conn.Write(uint64(code), payload) - return err -} - -func (c *Conn) read66() (uint64, Message) { - code, rawData, _, err := c.Conn.Read() - if err != nil { - return 0, errorf("could not read from connection: %v", err) - } - - var msg Message - - switch int(code) { - case (Hello{}).Code(): - msg = new(Hello) - - case (Ping{}).Code(): - msg = new(Ping) - case (Pong{}).Code(): - msg = new(Pong) - case (Disconnect{}).Code(): - msg = new(Disconnect) - case (Status{}).Code(): - msg = new(Status) - case (GetBlockHeaders{}).Code(): - ethMsg := new(eth.GetBlockHeadersPacket66) - if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { - return 0, errorf("could not rlp decode message: %v", err) - } - return ethMsg.RequestId, GetBlockHeaders(*ethMsg.GetBlockHeadersPacket) - case (BlockHeaders{}).Code(): - ethMsg := new(eth.BlockHeadersPacket66) - if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { - return 0, errorf("could not rlp decode message: %v", err) - } - return ethMsg.RequestId, BlockHeaders(ethMsg.BlockHeadersPacket) - case (GetBlockBodies{}).Code(): - ethMsg := new(eth.GetBlockBodiesPacket66) - if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { - return 0, errorf("could not rlp decode message: %v", err) - } - return ethMsg.RequestId, GetBlockBodies(ethMsg.GetBlockBodiesPacket) - case (BlockBodies{}).Code(): - ethMsg := new(eth.BlockBodiesPacket66) - if err := rlp.DecodeBytes(rawData, ethMsg); err != nil { - return 0, errorf("could not rlp decode message: %v", err) - } - return ethMsg.RequestId, BlockBodies(ethMsg.BlockBodiesPacket) - case (NewBlock{}).Code(): - msg = new(NewBlock) - case (NewBlockHashes{}).Code(): - msg = new(NewBlockHashes) - case (Transactions{}).Code(): - msg = new(Transactions) - case (NewPooledTransactionHashes{}).Code(): - msg = new(NewPooledTransactionHashes) - default: - msg = errorf("invalid message code: %d", code) - } - - if msg != nil { - if err := rlp.DecodeBytes(rawData, msg); err != nil { - return 0, errorf("could not rlp decode message: %v", err) - } - return 0, msg - } - return 0, errorf("invalid message: %s", string(rawData)) -} - -// ReadAndServe serves GetBlockHeaders requests while waiting -// on another message from the node. -func (c *Conn) readAndServe66(chain *Chain, timeout time.Duration) (uint64, Message) { - start := time.Now() - for time.Since(start) < timeout { - timeout := time.Now().Add(10 * time.Second) - //nolint:errcheck - c.SetReadDeadline(timeout) - - reqID, msg := c.read66() - - switch msg := msg.(type) { - case *Ping: - //nolint:errcheck - c.Write(&Pong{}) - case *GetBlockHeaders: - headers, err := chain.GetHeaders(*msg) - if err != nil { - return 0, errorf("could not get headers for inbound header request: %v", err) - } - - if err := c.Write(headers); err != nil { - return 0, errorf("could not write to connection: %v", err) - } - default: - return reqID, msg - } - } - return 0, errorf("no message received within %v", timeout) -} - -func (s *Suite) setupConnection66(t *utesting.T) *Conn { - // create conn - sendConn := s.dial66(t) - sendConn.handshake(t) - sendConn.statusExchange66(t, s.chain) - return sendConn -} - -func (s *Suite) testAnnounce66(t *utesting.T, sendConn, receiveConn *Conn, blockAnnouncement *NewBlock) { - // Announce the block. - if err := sendConn.Write(blockAnnouncement); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - s.waitAnnounce66(t, receiveConn, blockAnnouncement) -} - -func (s *Suite) waitAnnounce66(t *utesting.T, conn *Conn, blockAnnouncement *NewBlock) { - //nolint:govet - timeout := 20 * time.Second - _, msg := conn.readAndServe66(s.chain, timeout) - switch msg := msg.(type) { - case *NewBlock: - t.Logf("received NewBlock message: %s", pretty.Sdump(msg.Block)) - assert.Equal(t, - blockAnnouncement.Block.Header(), msg.Block.Header(), - "wrong block header in announcement", - ) - assert.Equal(t, - blockAnnouncement.TD, msg.TD, - "wrong TD in announcement", - ) - case *NewBlockHashes: - blockHashes := *msg - t.Logf("received NewBlockHashes message: %s", pretty.Sdump(blockHashes)) - assert.Equal(t, blockAnnouncement.Block.Hash(), blockHashes[0].Hash, - "wrong block hash in announcement", - ) - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -// waitForBlock66 waits for confirmation from the client that it has -// imported the given block. -func (c *Conn) waitForBlock66(block *types.Block) error { - //nolint:errcheck - defer c.SetReadDeadline(time.Time{}) - - timeout := time.Now().Add(20 * time.Second) - //nolint:errcheck - c.SetReadDeadline(timeout) - for { - req := eth.GetBlockHeadersPacket66{ - RequestId: 54, - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Origin: eth.HashOrNumber{ - Hash: block.Hash(), - }, - Amount: 1, - }, - } - if err := c.write66(req, GetBlockHeaders{}.Code()); err != nil { - return err - } - - reqID, msg := c.read66() - // check message - switch msg := msg.(type) { - case BlockHeaders: - // check request ID - if reqID != req.RequestId { - return fmt.Errorf("request ID mismatch: wanted %d, got %d", req.RequestId, reqID) - } - if len(msg) > 0 { - return nil - } - time.Sleep(100 * time.Millisecond) - default: - return fmt.Errorf("invalid message: %s", pretty.Sdump(msg)) - } - } -} - -func sendSuccessfulTx66(t *utesting.T, s *Suite, tx types.Transaction) { - sendConn := s.setupConnection66(t) - sendSuccessfulTxWithConn(t, s, tx, sendConn) -} - -func sendFailingTx66(t *utesting.T, s *Suite, tx types.Transaction) { - sendConn, recvConn := s.setupConnection66(t), s.setupConnection66(t) - sendFailingTxWithConns(t, s, tx, sendConn, recvConn) -} - -func (s *Suite) getBlockHeaders66(t *utesting.T, conn *Conn, req eth.Packet, expectedID uint64) BlockHeaders { - if err := conn.write66(req, GetBlockHeaders{}.Code()); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - // check block headers response - reqID, msg := conn.readAndServe66(s.chain, timeout) - - switch msg := msg.(type) { - case BlockHeaders: - if reqID != expectedID { - t.Fatalf("request ID mismatch: wanted %d, got %d", expectedID, reqID) - } - return msg - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - return nil - } -} - -func headersMatch(t *utesting.T, chain *Chain, headers BlockHeaders) { - for _, header := range headers { - num := header.Number.Uint64() - t.Logf("received header (%d): %s", num, pretty.Sdump(header.Hash())) - assert.Equal(t, chain.blocks[int(num)].Header(), header) - } -} diff --git a/cmd/devp2p/internal/ethtest/large.go b/cmd/devp2p/internal/ethtest/large.go deleted file mode 100644 index cdd39f9e51b..00000000000 --- a/cmd/devp2p/internal/ethtest/large.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "crypto/rand" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/hexutil" - "github.com/ledgerwatch/erigon/core/types" -) - -// largeNumber returns a very large big.Int. -func largeNumber(megabytes int) *uint256.Int { //nolint:unparam - buf := make([]byte, megabytes*1024*1024) - //nolint:errcheck - rand.Read(buf) - bigint := new(uint256.Int) - bigint.SetBytes(buf) - return bigint -} - -// largeBuffer returns a very large buffer. -func largeBuffer(megabytes int) []byte { //nolint:unparam - buf := make([]byte, megabytes*1024*1024) - //nolint:errcheck - rand.Read(buf) - return buf -} - -// largeString returns a very large string. -func largeString(megabytes int) string { //nolint:unparam - buf := make([]byte, megabytes*1024*1024) - //nolint:errcheck - rand.Read(buf) - return hexutil.Encode(buf) -} - -func largeBlock() *types.Block { - return types.NewBlockWithHeader(largeHeader()) -} - -// Returns a random hash -func randHash() common.Hash { - var h common.Hash - //nolint:errcheck - rand.Read(h[:]) - return h -} - -func largeHeader() *types.Header { - return &types.Header{ - MixDigest: randHash(), - ReceiptHash: randHash(), - TxHash: randHash(), - Nonce: types.BlockNonce{}, - Extra: []byte{}, - Bloom: types.Bloom{}, - GasUsed: 0, - Coinbase: common.Address{}, - GasLimit: 0, - UncleHash: randHash(), - Time: 1337, - ParentHash: randHash(), - Root: randHash(), - Number: largeNumber(2).ToBig(), - Difficulty: largeNumber(2).ToBig(), - } -} diff --git a/cmd/devp2p/internal/ethtest/suite.go b/cmd/devp2p/internal/ethtest/suite.go deleted file mode 100644 index 04046addd62..00000000000 --- a/cmd/devp2p/internal/ethtest/suite.go +++ /dev/null @@ -1,451 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "fmt" - "net" - "time" - - "github.com/davecgh/go-spew/spew" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/p2p/rlpx" - "github.com/stretchr/testify/assert" -) - -var pretty = spew.ConfigState{ - Indent: " ", - DisableCapacities: true, - DisablePointerAddresses: true, - SortKeys: true, -} - -var timeout = 20 * time.Second - -// Suite represents a structure used to test the eth -// protocol of a node(s). -type Suite struct { - Dest *enode.Node - - chain *Chain - fullChain *Chain -} - -// NewSuite creates and returns a new eth-test suite that can -// be used to test the given node against the given blockchain -// data. -func NewSuite(dest *enode.Node, chainfile string, genesisfile string) (*Suite, error) { - chain, err := loadChain(chainfile, genesisfile) - if err != nil { - return nil, err - } - return &Suite{ - Dest: dest, - chain: chain.Shorten(1000), - fullChain: chain, - }, nil -} - -func (s *Suite) EthTests() []utesting.Test { - return []utesting.Test{ - // status - {Name: "Status", Fn: s.TestStatus}, - {Name: "Status_66", Fn: s.TestStatus_66}, - // get block headers - {Name: "GetBlockHeaders", Fn: s.TestGetBlockHeaders}, - {Name: "GetBlockHeaders_66", Fn: s.TestGetBlockHeaders_66}, - {Name: "TestSimultaneousRequests_66", Fn: s.TestSimultaneousRequests_66}, - {Name: "TestSameRequestID_66", Fn: s.TestSameRequestID_66}, - {Name: "TestZeroRequestID_66", Fn: s.TestZeroRequestID_66}, - // get block bodies - {Name: "GetBlockBodies", Fn: s.TestGetBlockBodies}, - {Name: "GetBlockBodies_66", Fn: s.TestGetBlockBodies_66}, - // broadcast - {Name: "Broadcast", Fn: s.TestBroadcast}, - {Name: "Broadcast_66", Fn: s.TestBroadcast_66}, - {Name: "TestLargeAnnounce", Fn: s.TestLargeAnnounce}, - {Name: "TestLargeAnnounce_66", Fn: s.TestLargeAnnounce_66}, - // malicious handshakes + status - {Name: "TestMaliciousHandshake", Fn: s.TestMaliciousHandshake}, - {Name: "TestMaliciousStatus", Fn: s.TestMaliciousStatus}, - {Name: "TestMaliciousHandshake_66", Fn: s.TestMaliciousHandshake_66}, - {Name: "TestMaliciousStatus_66", Fn: s.TestMaliciousStatus}, - // test transactions - {Name: "TestTransactions", Fn: s.TestTransaction}, - {Name: "TestTransactions_66", Fn: s.TestTransaction_66}, - {Name: "TestMaliciousTransactions", Fn: s.TestMaliciousTx}, - {Name: "TestMaliciousTransactions_66", Fn: s.TestMaliciousTx_66}, - } -} - -// TestStatus attempts to connect to the given node and exchange -// a status message with it, and then check to make sure -// the chain head is correct. -func (s *Suite) TestStatus(t *utesting.T) { - conn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - // get protoHandshake - conn.handshake(t) - // get status - switch msg := conn.statusExchange(t, s.chain, nil).(type) { - case *Status: - t.Logf("got status message: %s", pretty.Sdump(msg)) - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -// TestMaliciousStatus sends a status package with a large total difficulty. -func (s *Suite) TestMaliciousStatus(t *utesting.T) { - conn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - // get protoHandshake - conn.handshake(t) - status := &Status{ - ProtocolVersion: uint32(conn.ethProtocolVersion), - NetworkID: s.chain.chainConfig.ChainID.Uint64(), - TD: largeNumber(2).ToBig(), - Head: s.chain.blocks[s.chain.Len()-1].Hash(), - Genesis: s.chain.blocks[0].Hash(), - ForkID: s.chain.ForkID(), - } - // get status - switch msg := conn.statusExchange(t, s.chain, status).(type) { - case *Status: - t.Logf("%+v\n", msg) - default: - t.Fatalf("expected status, got: %#v ", msg) - } - // wait for disconnect - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *Disconnect: - case *Error: - return - default: - t.Fatalf("expected disconnect, got: %s", pretty.Sdump(msg)) - } -} - -// TestGetBlockHeaders tests whether the given node can respond to -// a `GetBlockHeaders` request and that the response is accurate. -func (s *Suite) TestGetBlockHeaders(t *utesting.T) { - conn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - - conn.handshake(t) - conn.statusExchange(t, s.chain, nil) - - // get block headers - req := &GetBlockHeaders{ - Origin: eth.HashOrNumber{ - Hash: s.chain.blocks[1].Hash(), - }, - Amount: 2, - Skip: 1, - Reverse: false, - } - - if err := conn.Write(req); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *BlockHeaders: - headers := *msg - for _, header := range headers { - num := header.Number.Uint64() - t.Logf("received header (%d): %s", num, pretty.Sdump(header.Hash())) - assert.Equal(t, s.chain.blocks[int(num)].Header(), header) - } - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -// TestGetBlockBodies tests whether the given node can respond to -// a `GetBlockBodies` request and that the response is accurate. -func (s *Suite) TestGetBlockBodies(t *utesting.T) { - conn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - - conn.handshake(t) - conn.statusExchange(t, s.chain, nil) - // create block bodies request - req := &GetBlockBodies{ - s.chain.blocks[54].Hash(), - s.chain.blocks[75].Hash(), - } - if err := conn.Write(req); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *BlockBodies: - t.Logf("received %d block bodies", len(*msg)) - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -// TestBroadcast tests whether a block announcement is correctly -// propagated to the given node's peer(s). -func (s *Suite) TestBroadcast(t *utesting.T) { - sendConn, receiveConn := s.setupConnection(t), s.setupConnection(t) - nextBlock := len(s.chain.blocks) - blockAnnouncement := &NewBlock{ - Block: s.fullChain.blocks[nextBlock], - TD: s.fullChain.TD(nextBlock + 1), - } - s.testAnnounce(t, sendConn, receiveConn, blockAnnouncement) - // update test suite chain - s.chain.blocks = append(s.chain.blocks, s.fullChain.blocks[nextBlock]) - // wait for client to update its chain - if err := receiveConn.waitForBlock(s.chain.Head()); err != nil { - t.Fatal(err) - } -} - -// TestMaliciousHandshake tries to send malicious data during the handshake. -func (s *Suite) TestMaliciousHandshake(t *utesting.T) { - conn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - // write hello to client - pub0 := crypto.FromECDSAPub(&conn.ourKey.PublicKey)[1:] - handshakes := []*Hello{ - { - Version: 5, - Caps: []p2p.Cap{ - {Name: largeString(2), Version: 64}, - }, - ID: pub0, - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - }, - ID: append(pub0, byte(0)), - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - }, - ID: append(pub0, pub0...), - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - }, - ID: largeBuffer(2), - }, - { - Version: 5, - Caps: []p2p.Cap{ - {Name: largeString(2), Version: 64}, - }, - ID: largeBuffer(2), - }, - } - for i, handshake := range handshakes { - t.Logf("Testing malicious handshake %v\n", i) - // Init the handshake - if err = conn.Write(handshake); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - // check that the peer disconnected - //nolint:govet - timeout := 20 * time.Second - // Discard one hello - for i := 0; i < 2; i++ { - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *Disconnect: - case *Error: - case *Hello: - // Hello's are send concurrently, so ignore them - continue - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } - } - // Dial for the next round - conn, err = s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - } -} - -// TestLargeAnnounce tests the announcement mechanism with a large block. -func (s *Suite) TestLargeAnnounce(t *utesting.T) { - nextBlock := len(s.chain.blocks) - blocks := []*NewBlock{ - { - Block: largeBlock(), - TD: s.fullChain.TD(nextBlock + 1), - }, - { - Block: s.fullChain.blocks[nextBlock], - TD: largeNumber(2).ToBig(), - }, - { - Block: largeBlock(), - TD: largeNumber(2).ToBig(), - }, - { - Block: s.fullChain.blocks[nextBlock], - TD: s.fullChain.TD(nextBlock + 1), - }, - } - - for i, blockAnnouncement := range blocks[0:3] { - t.Logf("Testing malicious announcement: %v\n", i) - sendConn := s.setupConnection(t) - if err := sendConn.Write(blockAnnouncement); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - // Invalid announcement, check that peer disconnected - switch msg := sendConn.ReadAndServe(s.chain, timeout).(type) { - case *Disconnect: - case *Error: - break - default: - t.Fatalf("unexpected: %s wanted disconnect", pretty.Sdump(msg)) - } - } - // Test the last block as a valid block - sendConn := s.setupConnection(t) - receiveConn := s.setupConnection(t) - s.testAnnounce(t, sendConn, receiveConn, blocks[3]) - // update test suite chain - s.chain.blocks = append(s.chain.blocks, s.fullChain.blocks[nextBlock]) - // wait for client to update its chain - if err := receiveConn.waitForBlock(s.fullChain.blocks[nextBlock]); err != nil { - t.Fatal(err) - } -} - -func (s *Suite) testAnnounce(t *utesting.T, sendConn, receiveConn *Conn, blockAnnouncement *NewBlock) { - // Announce the block. - if err := sendConn.Write(blockAnnouncement); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - s.waitAnnounce(t, receiveConn, blockAnnouncement) -} - -func (s *Suite) waitAnnounce(t *utesting.T, conn *Conn, blockAnnouncement *NewBlock) { - timeout := 20 * time.Second - switch msg := conn.ReadAndServe(s.chain, timeout).(type) { - case *NewBlock: - t.Logf("received NewBlock message: %s", pretty.Sdump(msg.Block)) - assert.Equal(t, - blockAnnouncement.Block.Header(), msg.Block.Header(), - "wrong block header in announcement", - ) - assert.Equal(t, - blockAnnouncement.TD, msg.TD, - "wrong TD in announcement", - ) - case *NewBlockHashes: - message := *msg - t.Logf("received NewBlockHashes message: %s", pretty.Sdump(message)) - assert.Equal(t, blockAnnouncement.Block.Hash(), message[0].Hash, - "wrong block hash in announcement", - ) - default: - t.Fatalf("unexpected: %s", pretty.Sdump(msg)) - } -} - -func (s *Suite) setupConnection(t *utesting.T) *Conn { - // create conn - sendConn, err := s.dial() - if err != nil { - t.Fatalf("could not dial: %v", err) - } - sendConn.handshake(t) - sendConn.statusExchange(t, s.chain, nil) - return sendConn -} - -// dial attempts to dial the given node and perform a handshake, -// returning the created Conn if successful. -func (s *Suite) dial() (*Conn, error) { - var conn Conn - // dial - fd, err := net.Dial("tcp", fmt.Sprintf("%v:%d", s.Dest.IP(), s.Dest.TCP())) - if err != nil { - return nil, err - } - conn.Conn = rlpx.NewConn(fd, s.Dest.Pubkey()) - // do encHandshake - conn.ourKey, _ = crypto.GenerateKey() - _, err = conn.Handshake(conn.ourKey) - if err != nil { - return nil, err - } - // set default p2p capabilities - conn.caps = []p2p.Cap{ - {Name: "eth", Version: 64}, - {Name: "eth", Version: 65}, - } - return &conn, nil -} - -func (s *Suite) TestTransaction(t *utesting.T) { - tests := []types.Transaction{ - getNextTxFromChain(t, s), - unknownTx(t, s), - } - for i, tx := range tests { - t.Logf("Testing tx propagation: %v\n", i) - sendSuccessfulTx(t, s, tx) - } -} - -func (s *Suite) TestMaliciousTx(t *utesting.T) { - tests := []types.Transaction{ - getOldTxFromChain(t, s), - invalidNonceTx(t, s), - hugeAmount(t, s), - hugeGasPrice(t, s), - hugeData(t, s), - } - for i, tx := range tests { - t.Logf("Testing malicious tx propagation: %v\n", i) - sendFailingTx(t, s, tx) - } -} diff --git a/cmd/devp2p/internal/ethtest/testdata/chain.rlp b/cmd/devp2p/internal/ethtest/testdata/chain.rlp deleted file mode 100644 index 5ebc2f3bb78..00000000000 Binary files a/cmd/devp2p/internal/ethtest/testdata/chain.rlp and /dev/null differ diff --git a/cmd/devp2p/internal/ethtest/testdata/genesis.json b/cmd/devp2p/internal/ethtest/testdata/genesis.json deleted file mode 100644 index d8b5d225024..00000000000 --- a/cmd/devp2p/internal/ethtest/testdata/genesis.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "config": { - "chainId": 19763, - "homesteadBlock": 0, - "eip150Block": 0, - "eip155Block": 0, - "eip158Block": 0, - "byzantiumBlock": 0, - "ethash": {} - }, - "nonce": "0xdeadbeefdeadbeef", - "timestamp": "0x0", - "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0x80000000", - "difficulty": "0x20000", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "alloc": { - "71562b71999873db5b286df957af199ec94617f7": { - "balance": "0xffffffffffffffffffffffffff" - } - }, - "number": "0x0", - "gasUsed": "0x0", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" -} diff --git a/cmd/devp2p/internal/ethtest/testdata/halfchain.rlp b/cmd/devp2p/internal/ethtest/testdata/halfchain.rlp deleted file mode 100644 index 1a820734e10..00000000000 Binary files a/cmd/devp2p/internal/ethtest/testdata/halfchain.rlp and /dev/null differ diff --git a/cmd/devp2p/internal/ethtest/transaction.go b/cmd/devp2p/internal/ethtest/transaction.go deleted file mode 100644 index 9b0eef99e3d..00000000000 --- a/cmd/devp2p/internal/ethtest/transaction.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "time" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/internal/utesting" -) - -//var faucetAddr = common.HexToAddress("0x71562b71999873DB5b286dF957af199Ec94617F7") -var faucetKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - -func sendSuccessfulTx(t *utesting.T, s *Suite, tx types.Transaction) { - sendConn := s.setupConnection(t) - sendSuccessfulTxWithConn(t, s, tx, sendConn) -} - -func sendSuccessfulTxWithConn(t *utesting.T, s *Suite, tx types.Transaction, sendConn *Conn) { - t.Logf("sending tx: %v %v %v\n", tx.Hash().String(), tx.GetPrice(), tx.GetGas()) - // Send the transaction - if err := sendConn.Write(&Transactions{tx}); err != nil { - t.Fatal(err) - } - time.Sleep(100 * time.Millisecond) - recvConn := s.setupConnection(t) - // Wait for the transaction announcement - switch msg := recvConn.ReadAndServe(s.chain, timeout).(type) { - case *Transactions: - recTxs := *msg - for _, gotTx := range recTxs { - if gotTx.Hash() == tx.Hash() { - // Ok - return - } - } - t.Fatalf("missing transaction: got %v missing %v", recTxs, tx.Hash()) - case *NewPooledTransactionHashes: - txHashes := *msg - for _, gotHash := range txHashes { - if gotHash == tx.Hash() { - return - } - } - t.Fatalf("missing transaction announcement: got %v missing %v", txHashes, tx.Hash()) - default: - t.Fatalf("unexpected message in sendSuccessfulTx: %s", pretty.Sdump(msg)) - } -} - -func sendFailingTx(t *utesting.T, s *Suite, tx types.Transaction) { - sendConn, recvConn := s.setupConnection(t), s.setupConnection(t) - sendFailingTxWithConns(t, s, tx, sendConn, recvConn) -} - -func sendFailingTxWithConns(t *utesting.T, s *Suite, tx types.Transaction, sendConn, recvConn *Conn) { - // Wait for a transaction announcement - switch msg := recvConn.ReadAndServe(s.chain, timeout).(type) { - case *NewPooledTransactionHashes: - break - default: - t.Logf("unexpected message, logging: %v", pretty.Sdump(msg)) - } - // Send the transaction - if err := sendConn.Write(&Transactions{tx}); err != nil { - t.Fatal(err) - } - // Wait for another transaction announcement - switch msg := recvConn.ReadAndServe(s.chain, timeout).(type) { - case *Transactions: - t.Fatalf("Received unexpected transaction announcement: %v", msg) - case *NewPooledTransactionHashes: - t.Fatalf("Received unexpected pooledTx announcement: %v", msg) - case *Error: - // Transaction should not be announced -> wait for timeout - return - default: - t.Fatalf("unexpected message in sendFailingTx: %s", pretty.Sdump(msg)) - } -} - -func unknownTx(t *utesting.T, s *Suite) types.Transaction { - tx := getNextTxFromChain(t, s) - var to common.Address - if tx.GetTo() != nil { - to = *tx.GetTo() - } - txNew := types.NewTransaction(tx.GetNonce()+1, to, tx.GetValue(), tx.GetGas(), tx.GetPrice(), tx.GetData()) - return signWithFaucet(t, txNew) -} - -func getNextTxFromChain(t *utesting.T, s *Suite) types.Transaction { - // Get a new transaction - var tx types.Transaction - for _, blocks := range s.fullChain.blocks[s.chain.Len():] { - txs := blocks.Transactions() - if txs.Len() != 0 { - tx = txs[0] - break - } - } - if tx == nil { - t.Fatal("could not find transaction") - } - return tx -} - -func getOldTxFromChain(t *utesting.T, s *Suite) types.Transaction { - var tx types.Transaction - for _, blocks := range s.fullChain.blocks[:s.chain.Len()-1] { - txs := blocks.Transactions() - if txs.Len() != 0 { - tx = txs[0] - break - } - } - if tx == nil { - t.Fatal("could not find transaction") - } - return tx -} - -func invalidNonceTx(t *utesting.T, s *Suite) types.Transaction { - tx := getNextTxFromChain(t, s) - var to common.Address - if tx.GetTo() != nil { - to = *tx.GetTo() - } - txNew := types.NewTransaction(tx.GetNonce()-2, to, tx.GetValue(), tx.GetGas(), tx.GetPrice(), tx.GetData()) - return signWithFaucet(t, txNew) -} - -func hugeAmount(t *utesting.T, s *Suite) types.Transaction { - tx := getNextTxFromChain(t, s) - amount := largeNumber(2) - var to common.Address - if tx.GetTo() != nil { - to = *tx.GetTo() - } - txNew := types.NewTransaction(tx.GetNonce(), to, amount, tx.GetGas(), tx.GetPrice(), tx.GetData()) - return signWithFaucet(t, txNew) -} - -func hugeGasPrice(t *utesting.T, s *Suite) types.Transaction { - tx := getNextTxFromChain(t, s) - gasPrice := largeNumber(2) - var to common.Address - if tx.GetTo() != nil { - to = *tx.GetTo() - } - txNew := types.NewTransaction(tx.GetNonce(), to, tx.GetValue(), tx.GetGas(), gasPrice, tx.GetData()) - return signWithFaucet(t, txNew) -} - -func hugeData(t *utesting.T, s *Suite) types.Transaction { - tx := getNextTxFromChain(t, s) - var to common.Address - if tx.GetTo() != nil { - to = *tx.GetTo() - } - txNew := types.NewTransaction(tx.GetNonce(), to, tx.GetValue(), tx.GetGas(), tx.GetPrice(), largeBuffer(2)) - return signWithFaucet(t, txNew) -} - -func signWithFaucet(t *utesting.T, tx types.Transaction) types.Transaction { - signer := types.LatestSignerForChainID(nil) - signedTx, err := types.SignTx(tx, *signer, faucetKey) - if err != nil { - t.Fatalf("could not sign tx: %v\n", err) - } - return signedTx -} diff --git a/cmd/devp2p/internal/ethtest/types.go b/cmd/devp2p/internal/ethtest/types.go deleted file mode 100644 index 3e7137487d2..00000000000 --- a/cmd/devp2p/internal/ethtest/types.go +++ /dev/null @@ -1,343 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethtest - -import ( - "crypto/ecdsa" - "fmt" - "reflect" - "time" - - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/rlpx" - "github.com/ledgerwatch/erigon/rlp" -) - -type Message interface { - Code() int -} - -type Error struct { - err error -} - -func (e *Error) Unwrap() error { return e.err } -func (e *Error) Error() string { return e.err.Error() } -func (e *Error) Code() int { return -1 } -func (e *Error) String() string { return e.Error() } - -func errorf(format string, args ...interface{}) *Error { - return &Error{fmt.Errorf(format, args...)} -} - -// Hello is the RLP structure of the protocol handshake. -type Hello struct { - Version uint64 - Name string - Caps []p2p.Cap - ListenPort uint64 - ID []byte // secp256k1 public key - - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` -} - -func (h Hello) Code() int { return 0x00 } - -// Disconnect is the RLP structure for a disconnect message. -type Disconnect struct { - Reason p2p.DiscReason -} - -func (d Disconnect) Code() int { return 0x01 } - -type Ping struct{} - -func (p Ping) Code() int { return 0x02 } - -type Pong struct{} - -func (p Pong) Code() int { return 0x03 } - -// Status is the network packet for the status message for eth/64 and later. -type Status eth.StatusPacket - -func (s Status) Code() int { return 16 } - -// NewBlockHashes is the network packet for the block announcements. -type NewBlockHashes eth.NewBlockHashesPacket - -func (nbh NewBlockHashes) Code() int { return 17 } - -type Transactions eth.TransactionsPacket - -func (t Transactions) Code() int { return 18 } - -// GetBlockHeaders represents a block header query. -type GetBlockHeaders eth.GetBlockHeadersPacket - -func (g GetBlockHeaders) Code() int { return 19 } - -type BlockHeaders eth.BlockHeadersPacket - -func (bh BlockHeaders) Code() int { return 20 } - -// GetBlockBodies represents a GetBlockBodies request -type GetBlockBodies eth.GetBlockBodiesPacket - -func (gbb GetBlockBodies) Code() int { return 21 } - -// BlockBodies is the network packet for block content distribution. -type BlockBodies eth.BlockBodiesPacket - -func (bb BlockBodies) Code() int { return 22 } - -// NewBlock is the network packet for the block propagation message. -type NewBlock eth.NewBlockPacket - -func (nb NewBlock) Code() int { return 23 } - -// NewPooledTransactionHashes is the network packet for the tx hash propagation message. -type NewPooledTransactionHashes eth.NewPooledTransactionHashesPacket - -func (nb NewPooledTransactionHashes) Code() int { return 24 } - -// Conn represents an individual connection with a peer -type Conn struct { - *rlpx.Conn - ourKey *ecdsa.PrivateKey - ethProtocolVersion uint - caps []p2p.Cap -} - -func (c *Conn) Read() Message { - code, rawData, _, err := c.Conn.Read() - if err != nil { - return errorf("could not read from connection: %v", err) - } - - var msg Message - switch int(code) { - case (Hello{}).Code(): - msg = new(Hello) - case (Ping{}).Code(): - msg = new(Ping) - case (Pong{}).Code(): - msg = new(Pong) - case (Disconnect{}).Code(): - msg = new(Disconnect) - case (Status{}).Code(): - msg = new(Status) - case (GetBlockHeaders{}).Code(): - msg = new(GetBlockHeaders) - case (BlockHeaders{}).Code(): - msg = new(BlockHeaders) - case (GetBlockBodies{}).Code(): - msg = new(GetBlockBodies) - case (BlockBodies{}).Code(): - msg = new(BlockBodies) - case (NewBlock{}).Code(): - msg = new(NewBlock) - case (NewBlockHashes{}).Code(): - msg = new(NewBlockHashes) - case (Transactions{}).Code(): - msg = new(Transactions) - case (NewPooledTransactionHashes{}).Code(): - msg = new(NewPooledTransactionHashes) - default: - return errorf("invalid message code: %d", code) - } - // if message is devp2p, decode here - if err := rlp.DecodeBytes(rawData, msg); err != nil { - return errorf("could not rlp decode message: %v", err) - } - return msg -} - -// ReadAndServe serves GetBlockHeaders requests while waiting -// on another message from the node. -func (c *Conn) ReadAndServe(chain *Chain, timeout time.Duration) Message { - start := time.Now() - for time.Since(start) < timeout { - timeout := time.Now().Add(10 * time.Second) - c.SetReadDeadline(timeout) //nolint:errcheck - switch msg := c.Read().(type) { - case *Ping: - c.Write(&Pong{}) //nolint:errcheck - case *GetBlockHeaders: - req := *msg - headers, err := chain.GetHeaders(req) - if err != nil { - return errorf("could not get headers for inbound header request: %v", err) - } - - if err := c.Write(headers); err != nil { - return errorf("could not write to connection: %v", err) - } - default: - return msg - } - } - return errorf("no message received within %v", timeout) -} - -func (c *Conn) Write(msg Message) error { - // check if message is eth protocol message - var ( - payload []byte - err error - ) - payload, err = rlp.EncodeToBytes(msg) - if err != nil { - return err - } - _, err = c.Conn.Write(uint64(msg.Code()), payload) - return err -} - -// handshake checks to make sure a `HELLO` is received. -//nolint:unparam -func (c *Conn) handshake(t *utesting.T) Message { - defer c.SetDeadline(time.Time{}) //nolint:errcheck - c.SetDeadline(time.Now().Add(10 * time.Second)) //nolint:errcheck - - // write hello to client - pub0 := crypto.FromECDSAPub(&c.ourKey.PublicKey)[1:] - ourHandshake := &Hello{ - Version: 5, - Caps: c.caps, - ID: pub0, - } - if err := c.Write(ourHandshake); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - // read hello from client - switch msg := c.Read().(type) { - case *Hello: - // set snappy if version is at least 5 - if msg.Version >= 5 { - c.SetSnappy(true) - } - c.negotiateEthProtocol(msg.Caps) - if c.ethProtocolVersion == 0 { - t.Fatalf("unexpected eth protocol version") - } - return msg - default: - t.Fatalf("bad handshake: %#v", msg) - return nil - } -} - -// negotiateEthProtocol sets the Conn's eth protocol version -// to highest advertised capability from peer -func (c *Conn) negotiateEthProtocol(caps []p2p.Cap) { - var highestEthVersion uint - for _, capability := range caps { - if capability.Name != "eth" { - continue - } - if capability.Version > highestEthVersion && capability.Version <= 65 { - highestEthVersion = capability.Version - } - } - c.ethProtocolVersion = highestEthVersion -} - -// statusExchange performs a `Status` message exchange with the given -// node. -func (c *Conn) statusExchange(t *utesting.T, chain *Chain, status *Status) Message { - defer c.SetDeadline(time.Time{}) //nolint:errcheck - c.SetDeadline(time.Now().Add(20 * time.Second)) //nolint:errcheck - - // read status message from client - var message Message -loop: - for { - switch msg := c.Read().(type) { - case *Status: - if msg.Head != chain.blocks[chain.Len()-1].Hash() { - t.Fatalf("wrong head block in status: %s", msg.Head.String()) - } - if msg.TD.Cmp(chain.TD(chain.Len())) != 0 { - t.Fatalf("wrong TD in status: %v", msg.TD) - } - if !reflect.DeepEqual(msg.ForkID, chain.ForkID()) { - t.Fatalf("wrong fork ID in status: %v", msg.ForkID) - } - message = msg - break loop - case *Disconnect: - t.Fatalf("disconnect received: %v", msg.Reason) - case *Ping: - c.Write(&Pong{}) //nolint:errcheck - // TODO (renaynay): in the future, this should be an error - // (PINGs should not be a response upon fresh connection) - default: - t.Fatalf("bad status message: %s", pretty.Sdump(msg)) - } - } - // make sure eth protocol version is set for negotiation - if c.ethProtocolVersion == 0 { - t.Fatalf("eth protocol version must be set in Conn") - } - if status == nil { - // write status message to client - status = &Status{ - ProtocolVersion: uint32(c.ethProtocolVersion), - NetworkID: chain.chainConfig.ChainID.Uint64(), - TD: chain.TD(chain.Len()), - Head: chain.blocks[chain.Len()-1].Hash(), - Genesis: chain.blocks[0].Hash(), - ForkID: chain.ForkID(), - } - } - - if err := c.Write(status); err != nil { - t.Fatalf("could not write to connection: %v", err) - } - - return message -} - -// waitForBlock waits for confirmation from the client that it has -// imported the given block. -func (c *Conn) waitForBlock(block *types.Block) error { - defer c.SetReadDeadline(time.Time{}) //nolint:errcheck - - timeout := time.Now().Add(20 * time.Second) - c.SetReadDeadline(timeout) //nolint:errcheck - for { - req := &GetBlockHeaders{Origin: eth.HashOrNumber{Hash: block.Hash()}, Amount: 1} - if err := c.Write(req); err != nil { - return err - } - switch msg := c.Read().(type) { - case *BlockHeaders: - if len(*msg) > 0 { - return nil - } - time.Sleep(100 * time.Millisecond) - default: - return fmt.Errorf("invalid message: %s", pretty.Sdump(msg)) - } - } -} diff --git a/cmd/devp2p/internal/v4test/discv4tests.go b/cmd/devp2p/internal/v4test/discv4tests.go deleted file mode 100644 index 9843659c468..00000000000 --- a/cmd/devp2p/internal/v4test/discv4tests.go +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package v4test - -import ( - "bytes" - "crypto/rand" - "fmt" - "net" - "reflect" - "time" - - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/erigon/p2p/discover/v4wire" -) - -const ( - expiration = 20 * time.Second - wrongPacket = 66 - macSize = 256 / 8 -) - -var ( - // Remote node under test - Remote string - // IP where the first tester is listening, port will be assigned - Listen1 string = "127.0.0.1" - // IP where the second tester is listening, port will be assigned - // Before running the test, you may have to `sudo ifconfig lo0 add 127.0.0.2` (on MacOS at least) - Listen2 string = "127.0.0.2" -) - -type pingWithJunk struct { - Version uint - From, To v4wire.Endpoint - Expiration uint64 - JunkData1 uint - JunkData2 []byte -} - -func (req *pingWithJunk) Name() string { return "PING/v4" } -func (req *pingWithJunk) Kind() byte { return v4wire.PingPacket } - -type pingWrongType struct { - Version uint - From, To v4wire.Endpoint - Expiration uint64 -} - -func (req *pingWrongType) Name() string { return "WRONG/v4" } -func (req *pingWrongType) Kind() byte { return wrongPacket } - -func futureExpiration() uint64 { - return uint64(time.Now().Add(expiration).Unix()) -} - -// This test just sends a PING packet and expects a response. -func BasicPing(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - pingHash := te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: te.localEndpoint(te.l1), - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - }) - - reply, _, _ := te.read(te.l1) - if err := te.checkPong(reply, pingHash); err != nil { - t.Fatal(err) - } -} - -// checkPong verifies that reply is a valid PONG matching the given ping hash. -func (te *testenv) checkPong(reply v4wire.Packet, pingHash []byte) error { - if reply == nil || reply.Kind() != v4wire.PongPacket { - return fmt.Errorf("expected PONG reply, got %v", reply) - } - pong := reply.(*v4wire.Pong) - if !bytes.Equal(pong.ReplyTok, pingHash) { - return fmt.Errorf("PONG reply token mismatch: got %x, want %x", pong.ReplyTok, pingHash) - } - wantEndpoint := te.localEndpoint(te.l1) - if !reflect.DeepEqual(pong.To, wantEndpoint) { - return fmt.Errorf("PONG 'to' endpoint mismatch: got %+v, want %+v", pong.To, wantEndpoint) - } - if v4wire.Expired(pong.Expiration) { - return fmt.Errorf("PONG is expired (%v)", pong.Expiration) - } - return nil -} - -// This test sends a PING packet with wrong 'to' field and expects a PONG response. -func PingWrongTo(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - wrongEndpoint := v4wire.Endpoint{IP: net.ParseIP("192.0.2.0")} - pingHash := te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: te.localEndpoint(te.l1), - To: wrongEndpoint, - Expiration: futureExpiration(), - }) - - reply, _, _ := te.read(te.l1) - if err := te.checkPong(reply, pingHash); err != nil { - t.Fatal(err) - } -} - -// This test sends a PING packet with wrong 'from' field and expects a PONG response. -func PingWrongFrom(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - wrongEndpoint := v4wire.Endpoint{IP: net.ParseIP("192.0.2.0")} - pingHash := te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: wrongEndpoint, - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - }) - - reply, _, _ := te.read(te.l1) - if err := te.checkPong(reply, pingHash); err != nil { - t.Fatal(err) - } -} - -// This test sends a PING packet with additional data at the end and expects a PONG -// response. The remote node should respond because EIP-8 mandates ignoring additional -// trailing data. -func PingExtraData(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - pingHash := te.send(te.l1, &pingWithJunk{ - Version: 4, - From: te.localEndpoint(te.l1), - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - JunkData1: 42, - JunkData2: []byte{9, 8, 7, 6, 5, 4, 3, 2, 1}, - }) - - reply, _, _ := te.read(te.l1) - if err := te.checkPong(reply, pingHash); err != nil { - t.Fatal(err) - } -} - -// This test sends a PING packet with additional data and wrong 'from' field -// and expects a PONG response. -func PingExtraDataWrongFrom(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - wrongEndpoint := v4wire.Endpoint{IP: net.ParseIP("192.0.2.0")} - req := pingWithJunk{ - Version: 4, - From: wrongEndpoint, - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - JunkData1: 42, - JunkData2: []byte{9, 8, 7, 6, 5, 4, 3, 2, 1}, - } - pingHash := te.send(te.l1, &req) - reply, _, _ := te.read(te.l1) - if err := te.checkPong(reply, pingHash); err != nil { - t.Fatal(err) - } -} - -// This test sends a PING packet with an expiration in the past. -// The remote node should not respond. -func PingPastExpiration(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: te.localEndpoint(te.l1), - To: te.remoteEndpoint(), - Expiration: -futureExpiration(), - }) - - reply, _, _ := te.read(te.l1) - if reply != nil { - t.Fatal("Expected no reply, got", reply) - } -} - -// This test sends an invalid packet. The remote node should not respond. -func WrongPacketType(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - te.send(te.l1, &pingWrongType{ - Version: 4, - From: te.localEndpoint(te.l1), - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - }) - - reply, _, _ := te.read(te.l1) - if reply != nil { - t.Fatal("Expected no reply, got", reply) - } -} - -// This test verifies that the default behaviour of ignoring 'from' fields is unaffected by -// the bonding process. After bonding, it pings the target with a different from endpoint. -func BondThenPingWithWrongFrom(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - bond(t, te) - - wrongEndpoint := v4wire.Endpoint{IP: net.ParseIP("192.0.2.0")} - pingHash := te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: wrongEndpoint, - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - }) - - reply, _, _ := te.read(te.l1) - if err := te.checkPong(reply, pingHash); err != nil { - t.Fatal(err) - } -} - -// This test just sends FINDNODE. The remote node should not reply -// because the endpoint proof has not completed. -func FindnodeWithoutEndpointProof(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - req := v4wire.Findnode{Expiration: futureExpiration()} - rand.Read(req.Target[:]) //nolint:errcheck - te.send(te.l1, &req) - - reply, _, _ := te.read(te.l1) - if reply != nil { - t.Fatal("Expected no response, got", reply) - } -} - -// BasicFindnode sends a FINDNODE request after performing the endpoint -// proof. The remote node should respond. -func BasicFindnode(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - bond(t, te) - - findnode := v4wire.Findnode{Expiration: futureExpiration()} - rand.Read(findnode.Target[:]) //nolint:errcheck - te.send(te.l1, &findnode) - - reply, _, err := te.read(te.l1) - if err != nil { - t.Fatal("read find nodes", err) - } - if reply.Kind() != v4wire.NeighborsPacket { - t.Fatal("Expected neighbors, got", reply.Name()) - } -} - -// This test sends an unsolicited NEIGHBORS packet after the endpoint proof, then sends -// FINDNODE to read the remote table. The remote node should not return the node contained -// in the unsolicited NEIGHBORS packet. -func UnsolicitedNeighbors(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - bond(t, te) - - // Send unsolicited NEIGHBORS response. - fakeKey, _ := crypto.GenerateKey() - encFakeKey := v4wire.EncodePubkey(&fakeKey.PublicKey) - neighbors := v4wire.Neighbors{ - Expiration: futureExpiration(), - Nodes: []v4wire.Node{{ - ID: encFakeKey, - IP: net.IP{1, 2, 3, 4}, - UDP: 30303, - TCP: 30303, - }}, - } - te.send(te.l1, &neighbors) - - // Check if the remote node included the fake node. - te.send(te.l1, &v4wire.Findnode{ - Expiration: futureExpiration(), - Target: encFakeKey, - }) - - reply, _, err := te.read(te.l1) - if err != nil { - t.Fatal("read find nodes", err) - } - if reply.Kind() != v4wire.NeighborsPacket { - t.Fatal("Expected neighbors, got", reply.Name()) - } - nodes := reply.(*v4wire.Neighbors).Nodes - if contains(nodes, encFakeKey) { - t.Fatal("neighbors response contains node from earlier unsolicited neighbors response") - } -} - -// This test sends FINDNODE with an expiration timestamp in the past. -// The remote node should not respond. -func FindnodePastExpiration(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - bond(t, te) - - findnode := v4wire.Findnode{Expiration: -futureExpiration()} - rand.Read(findnode.Target[:]) //nolint:errcheck - te.send(te.l1, &findnode) - - for { - reply, _, _ := te.read(te.l1) - if reply == nil { - return - } else if reply.Kind() == v4wire.NeighborsPacket { - t.Fatal("Unexpected NEIGHBORS response for expired FINDNODE request") - } - } -} - -// bond performs the endpoint proof with the remote node. -func bond(t *utesting.T, te *testenv) { - te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: te.localEndpoint(te.l1), - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - }) - - var gotPing, gotPong bool - for !gotPing || !gotPong { - req, hash, err := te.read(te.l1) - if err != nil { - t.Fatal(err) - } - switch req.(type) { - case *v4wire.Ping: - te.send(te.l1, &v4wire.Pong{ - To: te.remoteEndpoint(), - ReplyTok: hash, - Expiration: futureExpiration(), - }) - gotPing = true - case *v4wire.Pong: - // TODO: maybe verify pong data here - gotPong = true - } - } -} - -// This test attempts to perform a traffic amplification attack against a -// 'victim' endpoint using FINDNODE. In this attack scenario, the attacker -// attempts to complete the endpoint proof non-interactively by sending a PONG -// with mismatching reply token from the 'victim' endpoint. The attack works if -// the remote node does not verify the PONG reply token field correctly. The -// attacker could then perform traffic amplification by sending many FINDNODE -// requests to the discovery node, which would reply to the 'victim' address. -func FindnodeAmplificationInvalidPongHash(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - // Send PING to start endpoint verification. - te.send(te.l1, &v4wire.Ping{ - Version: 4, - From: te.localEndpoint(te.l1), - To: te.remoteEndpoint(), - Expiration: futureExpiration(), - }) - - var gotPing, gotPong bool - for !gotPing || !gotPong { - req, _, err := te.read(te.l1) - if err != nil { - t.Fatal(err) - } - switch req.(type) { - case *v4wire.Ping: - // Send PONG from this node ID, but with invalid ReplyTok. - te.send(te.l1, &v4wire.Pong{ - To: te.remoteEndpoint(), - ReplyTok: make([]byte, macSize), - Expiration: futureExpiration(), - }) - gotPing = true - case *v4wire.Pong: - gotPong = true - } - } - - // Now send FINDNODE. The remote node should not respond because our - // PONG did not reference the PING hash. - findnode := v4wire.Findnode{Expiration: futureExpiration()} - rand.Read(findnode.Target[:]) //nolint:errcheck - te.send(te.l1, &findnode) - - // If we receive a NEIGHBORS response, the attack worked and the test fails. - reply, _, _ := te.read(te.l1) - if reply != nil && reply.Kind() == v4wire.NeighborsPacket { - t.Error("Got neighbors") - } -} - -// This test attempts to perform a traffic amplification attack using FINDNODE. -// The attack works if the remote node does not verify the IP address of FINDNODE -// against the endpoint verification proof done by PING/PONG. -func FindnodeAmplificationWrongIP(t *utesting.T) { - te := newTestEnv(Remote, Listen1, Listen2) - defer te.close() - - // Do the endpoint proof from the l1 IP. - bond(t, te) - - // Now send FINDNODE from the same node ID, but different IP address. - // The remote node should not respond. - findnode := v4wire.Findnode{Expiration: futureExpiration()} - rand.Read(findnode.Target[:]) //nolint:errcheck - te.send(te.l2, &findnode) - - // If we receive a NEIGHBORS response, the attack worked and the test fails. - reply, _, _ := te.read(te.l2) - if reply != nil { - t.Error("Got NEIGHORS response for FINDNODE from wrong IP") - } -} - -var AllTests = []utesting.Test{ - {Name: "Ping/Basic", Fn: BasicPing}, - {Name: "Ping/WrongTo", Fn: PingWrongTo}, - {Name: "Ping/WrongFrom", Fn: PingWrongFrom}, - {Name: "Ping/ExtraData", Fn: PingExtraData}, - {Name: "Ping/ExtraDataWrongFrom", Fn: PingExtraDataWrongFrom}, - {Name: "Ping/PastExpiration", Fn: PingPastExpiration}, - {Name: "Ping/WrongPacketType", Fn: WrongPacketType}, - {Name: "Ping/BondThenPingWithWrongFrom", Fn: BondThenPingWithWrongFrom}, - {Name: "Findnode/WithoutEndpointProof", Fn: FindnodeWithoutEndpointProof}, - {Name: "Findnode/BasicFindnode", Fn: BasicFindnode}, - {Name: "Findnode/UnsolicitedNeighbors", Fn: UnsolicitedNeighbors}, - {Name: "Findnode/PastExpiration", Fn: FindnodePastExpiration}, - {Name: "Amplification/InvalidPongHash", Fn: FindnodeAmplificationInvalidPongHash}, - {Name: "Amplification/WrongIP", Fn: FindnodeAmplificationWrongIP}, -} diff --git a/cmd/devp2p/internal/v4test/framework.go b/cmd/devp2p/internal/v4test/framework.go deleted file mode 100644 index c728ade7e42..00000000000 --- a/cmd/devp2p/internal/v4test/framework.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package v4test - -import ( - "crypto/ecdsa" - "fmt" - "net" - "time" - - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p/discover/v4wire" - "github.com/ledgerwatch/erigon/p2p/enode" -) - -const waitTime = 300 * time.Millisecond - -type testenv struct { - l1, l2 net.PacketConn - key *ecdsa.PrivateKey - remote *enode.Node - remoteAddr *net.UDPAddr -} - -func newTestEnv(remote string, listen1, listen2 string) *testenv { - l1, err := net.ListenPacket("udp", fmt.Sprintf("%v:0", listen1)) - if err != nil { - panic(err) - } - l2, err := net.ListenPacket("udp", fmt.Sprintf("%v:0", listen2)) - if err != nil { - panic(err) - } - key, err := crypto.GenerateKey() - if err != nil { - panic(err) - } - node, err := enode.Parse(enode.ValidSchemes, remote) - if err != nil { - panic(err) - } - if node.IP() == nil || node.UDP() == 0 { - var ip net.IP - var tcpPort, udpPort int - if ip = node.IP(); ip == nil { - ip = net.ParseIP("127.0.0.1") - } - if tcpPort = node.TCP(); tcpPort == 0 { - tcpPort = 30303 - } - if udpPort = node.TCP(); udpPort == 0 { - udpPort = 30303 - } - node = enode.NewV4(node.Pubkey(), ip, tcpPort, udpPort) - } - addr := &net.UDPAddr{IP: node.IP(), Port: node.UDP()} - return &testenv{l1, l2, key, node, addr} -} - -func (te *testenv) close() { - te.l1.Close() - te.l2.Close() -} - -func (te *testenv) send(c net.PacketConn, req v4wire.Packet) []byte { - packet, hash, err := v4wire.Encode(te.key, req) - if err != nil { - panic(fmt.Errorf("can't encode %v packet: %v", req.Name(), err)) - } - if _, err := c.WriteTo(packet, te.remoteAddr); err != nil { - panic(fmt.Errorf("can't send %v: %v", req.Name(), err)) - } - return hash -} - -func (te *testenv) read(c net.PacketConn) (v4wire.Packet, []byte, error) { - buf := make([]byte, 2048) - if err := c.SetReadDeadline(time.Now().Add(waitTime)); err != nil { - return nil, nil, err - } - n, _, err := c.ReadFrom(buf) - if err != nil { - return nil, nil, err - } - p, _, hash, err := v4wire.Decode(buf[:n]) - return p, hash, err -} - -func (te *testenv) localEndpoint(c net.PacketConn) v4wire.Endpoint { - addr := c.LocalAddr().(*net.UDPAddr) - return v4wire.Endpoint{ - IP: addr.IP.To4(), - UDP: uint16(addr.Port), - TCP: 0, - } -} - -func (te *testenv) remoteEndpoint() v4wire.Endpoint { - return v4wire.NewEndpoint(te.remoteAddr, 0) -} - -func contains(ns []v4wire.Node, key v4wire.Pubkey) bool { - for _, n := range ns { - if n.ID == key { - return true - } - } - return false -} diff --git a/cmd/devp2p/internal/v5test/discv5tests.go b/cmd/devp2p/internal/v5test/discv5tests.go deleted file mode 100644 index 41bf99f82a0..00000000000 --- a/cmd/devp2p/internal/v5test/discv5tests.go +++ /dev/null @@ -1,378 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package v5test - -import ( - "bytes" - "errors" - "net" - "sync" - "time" - - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/erigon/p2p/discover/v5wire" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/p2p/netutil" -) - -// Suite is the discv5 test suite. -type Suite struct { - Dest *enode.Node - Listen1, Listen2 string // listening addresses -} - -func (s *Suite) listen1(log logger) (*conn, net.PacketConn) { - c := newConn(s.Dest, log) - l := c.listen(s.Listen1) - return c, l -} - -func (s *Suite) listen2(log logger) (*conn, net.PacketConn, net.PacketConn) { - c := newConn(s.Dest, log) - l1, l2 := c.listen(s.Listen1), c.listen(s.Listen2) - return c, l1, l2 -} - -func (s *Suite) AllTests() []utesting.Test { - return []utesting.Test{ - {Name: "Ping", Fn: s.TestPing}, - {Name: "PingLargeRequestID", Fn: s.TestPingLargeRequestID}, - {Name: "PingMultiIP", Fn: s.TestPingMultiIP}, - {Name: "PingHandshakeInterrupted", Fn: s.TestPingHandshakeInterrupted}, - {Name: "TalkRequest", Fn: s.TestTalkRequest}, - {Name: "FindnodeZeroDistance", Fn: s.TestFindnodeZeroDistance}, - {Name: "FindnodeResults", Fn: s.TestFindnodeResults}, - } -} - -// This test sends PING and expects a PONG response. -func (s *Suite) TestPing(t *utesting.T) { - conn, l1 := s.listen1(t) - defer conn.close() - - ping := &v5wire.Ping{ReqID: conn.nextReqID()} - switch resp := conn.reqresp(l1, ping).(type) { - case *v5wire.Pong: - checkPong(t, resp, ping, l1) - default: - t.Fatal("expected PONG, got", resp.Name()) - } -} - -func checkPong(t *utesting.T, pong *v5wire.Pong, ping *v5wire.Ping, c net.PacketConn) { - if !bytes.Equal(pong.ReqID, ping.ReqID) { - t.Fatalf("wrong request ID %x in PONG, want %x", pong.ReqID, ping.ReqID) - } - if !pong.ToIP.Equal(laddr(c).IP) { - t.Fatalf("wrong destination IP %v in PONG, want %v", pong.ToIP, laddr(c).IP) - } - if int(pong.ToPort) != laddr(c).Port { - t.Fatalf("wrong destination port %v in PONG, want %v", pong.ToPort, laddr(c).Port) - } -} - -// This test sends PING with a 9-byte request ID, which isn't allowed by the spec. -// The remote node should not respond. -func (s *Suite) TestPingLargeRequestID(t *utesting.T) { - conn, l1 := s.listen1(t) - defer conn.close() - - ping := &v5wire.Ping{ReqID: make([]byte, 9)} - switch resp := conn.reqresp(l1, ping).(type) { - case *v5wire.Pong: - t.Errorf("PONG response with unknown request ID %x", resp.ReqID) - case *readError: - if errors.Is(resp.err, v5wire.ErrInvalidReqID) { - t.Error("response with oversized request ID") - } else if !netutil.IsTimeout(resp.err) { - t.Error(resp) - } - } -} - -// In this test, a session is established from one IP as usual. The session is then reused -// on another IP, which shouldn't work. The remote node should respond with WHOAREYOU for -// the attempt from a different IP. -func (s *Suite) TestPingMultiIP(t *utesting.T) { - conn, l1, l2 := s.listen2(t) - defer conn.close() - - // Create the session on l1. - ping := &v5wire.Ping{ReqID: conn.nextReqID()} - resp := conn.reqresp(l1, ping) - if resp.Kind() != v5wire.PongMsg { - t.Fatal("expected PONG, got", resp) - } - checkPong(t, resp.(*v5wire.Pong), ping, l1) - - // Send on l2. This reuses the session because there is only one codec. - ping2 := &v5wire.Ping{ReqID: conn.nextReqID()} - conn.write(l2, ping2, nil) - switch resp := conn.read(l2).(type) { - case *v5wire.Pong: - t.Fatalf("remote responded to PING from %v for session on IP %v", laddr(l2).IP, laddr(l1).IP) - case *v5wire.Whoareyou: - t.Logf("got WHOAREYOU for new session as expected") - resp.Node = s.Dest - conn.write(l2, ping2, resp) - default: - t.Fatal("expected WHOAREYOU, got", resp) - } - - // Catch the PONG on l2. - switch resp := conn.read(l2).(type) { - case *v5wire.Pong: - checkPong(t, resp, ping2, l2) - default: - t.Fatal("expected PONG, got", resp) - } - - // Try on l1 again. - ping3 := &v5wire.Ping{ReqID: conn.nextReqID()} - conn.write(l1, ping3, nil) - switch resp := conn.read(l1).(type) { - case *v5wire.Pong: - t.Fatalf("remote responded to PING from %v for session on IP %v", laddr(l1).IP, laddr(l2).IP) - case *v5wire.Whoareyou: - t.Logf("got WHOAREYOU for new session as expected") - default: - t.Fatal("expected WHOAREYOU, got", resp) - } -} - -// This test starts a handshake, but doesn't finish it and sends a second ordinary message -// packet instead of a handshake message packet. The remote node should respond with -// another WHOAREYOU challenge for the second packet. -func (s *Suite) TestPingHandshakeInterrupted(t *utesting.T) { - conn, l1 := s.listen1(t) - defer conn.close() - - // First PING triggers challenge. - ping := &v5wire.Ping{ReqID: conn.nextReqID()} - conn.write(l1, ping, nil) - switch resp := conn.read(l1).(type) { - case *v5wire.Whoareyou: - t.Logf("got WHOAREYOU for PING") - default: - t.Fatal("expected WHOAREYOU, got", resp) - } - - // Send second PING. - ping2 := &v5wire.Ping{ReqID: conn.nextReqID()} - switch resp := conn.reqresp(l1, ping2).(type) { - case *v5wire.Pong: - checkPong(t, resp, ping2, l1) - default: - t.Fatal("expected WHOAREYOU, got", resp) - } -} - -// This test sends TALKREQ and expects an empty TALKRESP response. -func (s *Suite) TestTalkRequest(t *utesting.T) { - conn, l1 := s.listen1(t) - defer conn.close() - - // Non-empty request ID. - id := conn.nextReqID() - resp := conn.reqresp(l1, &v5wire.TalkRequest{ReqID: id, Protocol: "test-protocol"}) - switch resp := resp.(type) { - case *v5wire.TalkResponse: - if !bytes.Equal(resp.ReqID, id) { - t.Fatalf("wrong request ID %x in TALKRESP, want %x", resp.ReqID, id) - } - if len(resp.Message) > 0 { - t.Fatalf("non-empty message %x in TALKRESP", resp.Message) - } - default: - t.Fatal("expected TALKRESP, got", resp.Name()) - } - - // Empty request ID. - resp = conn.reqresp(l1, &v5wire.TalkRequest{Protocol: "test-protocol"}) - switch resp := resp.(type) { - case *v5wire.TalkResponse: - if len(resp.ReqID) > 0 { - t.Fatalf("wrong request ID %x in TALKRESP, want empty byte array", resp.ReqID) - } - if len(resp.Message) > 0 { - t.Fatalf("non-empty message %x in TALKRESP", resp.Message) - } - default: - t.Fatal("expected TALKRESP, got", resp.Name()) - } -} - -// This test checks that the remote node returns itself for FINDNODE with distance zero. -func (s *Suite) TestFindnodeZeroDistance(t *utesting.T) { - conn, l1 := s.listen1(t) - defer conn.close() - - nodes, err := conn.findnode(l1, []uint{0}) - if err != nil { - t.Fatal(err) - } - if len(nodes) != 1 { - t.Fatalf("remote returned more than one node for FINDNODE [0]") - } - if nodes[0].ID() != conn.remote.ID() { - t.Errorf("ID of response node is %v, want %v", nodes[0].ID(), conn.remote.ID()) - } -} - -// In this test, multiple nodes ping the node under test. After waiting for them to be -// accepted into the remote table, the test checks that they are returned by FINDNODE. -func (s *Suite) TestFindnodeResults(t *utesting.T) { - // Create bystanders. - nodes := make([]*bystander, 5) - added := make(chan enode.ID, len(nodes)) - for i := range nodes { - nodes[i] = newBystander(t, s, added) - defer nodes[i].close() - } - - // Get them added to the remote table. - timeout := 60 * time.Second - timeoutCh := time.After(timeout) - for count := 0; count < len(nodes); { - select { - case id := <-added: - t.Logf("bystander node %v added to remote table", id) - count++ - case <-timeoutCh: - t.Errorf("remote added %d bystander nodes in %v, need %d to continue", count, timeout, len(nodes)) - t.Logf("this can happen if the node has a non-empty table from previous runs") - return - } - } - t.Logf("all %d bystander nodes were added", len(nodes)) - - // Collect our nodes by distance. - var dists []uint - expect := make(map[enode.ID]*enode.Node) - for _, bn := range nodes { - n := bn.conn.localNode.Node() - expect[n.ID()] = n - d := uint(enode.LogDist(n.ID(), s.Dest.ID())) - if !containsUint(dists, d) { - dists = append(dists, d) - } - } - - // Send FINDNODE for all distances. - conn, l1 := s.listen1(t) - defer conn.close() - foundNodes, err := conn.findnode(l1, dists) - if err != nil { - t.Fatal(err) - } - t.Logf("remote returned %d nodes for distance list %v", len(foundNodes), dists) - for _, n := range foundNodes { - delete(expect, n.ID()) - } - if len(expect) > 0 { - t.Errorf("missing %d nodes in FINDNODE result", len(expect)) - t.Logf("this can happen if the test is run multiple times in quick succession") - t.Logf("and the remote node hasn't removed dead nodes from previous runs yet") - } else { - t.Logf("all %d expected nodes were returned", len(nodes)) - } -} - -// A bystander is a node whose only purpose is filling a spot in the remote table. -type bystander struct { - dest *enode.Node - conn *conn - l net.PacketConn - - addedCh chan enode.ID - done sync.WaitGroup -} - -func newBystander(t *utesting.T, s *Suite, added chan enode.ID) *bystander { - conn, l := s.listen1(t) - conn.setEndpoint(l) // bystander nodes need IP/port to get pinged - bn := &bystander{ - conn: conn, - l: l, - dest: s.Dest, - addedCh: added, - } - bn.done.Add(1) - go bn.loop() - return bn -} - -// id returns the node ID of the bystander. -func (bn *bystander) id() enode.ID { - return bn.conn.localNode.ID() -} - -// close shuts down loop. -func (bn *bystander) close() { - bn.conn.close() - bn.done.Wait() -} - -// loop answers packets from the remote node until quit. -func (bn *bystander) loop() { - defer bn.done.Done() - - var ( - lastPing time.Time - wasAdded bool - ) - for { - // Ping the remote node. - if !wasAdded && time.Since(lastPing) > 10*time.Second { - bn.conn.reqresp(bn.l, &v5wire.Ping{ - ReqID: bn.conn.nextReqID(), - ENRSeq: bn.dest.Seq(), - }) - lastPing = time.Now() - } - // Answer packets. - switch p := bn.conn.read(bn.l).(type) { - case *v5wire.Ping: - bn.conn.write(bn.l, &v5wire.Pong{ - ReqID: p.ReqID, - ENRSeq: bn.conn.localNode.Seq(), - ToIP: bn.dest.IP(), - ToPort: uint16(bn.dest.UDP()), - }, nil) - wasAdded = true - bn.notifyAdded() - case *v5wire.Findnode: - bn.conn.write(bn.l, &v5wire.Nodes{ReqID: p.ReqID, Total: 1}, nil) - wasAdded = true - bn.notifyAdded() - case *v5wire.TalkRequest: - bn.conn.write(bn.l, &v5wire.TalkResponse{ReqID: p.ReqID}, nil) - case *readError: - if !netutil.IsTemporaryError(p.err) { - bn.conn.logf("shutting down: %v", p.err) - return - } - } - } -} - -func (bn *bystander) notifyAdded() { - if bn.addedCh != nil { - bn.addedCh <- bn.id() - bn.addedCh = nil - } -} diff --git a/cmd/devp2p/internal/v5test/framework.go b/cmd/devp2p/internal/v5test/framework.go deleted file mode 100644 index 280271c02f3..00000000000 --- a/cmd/devp2p/internal/v5test/framework.go +++ /dev/null @@ -1,261 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package v5test - -import ( - "bytes" - "crypto/ecdsa" - "encoding/binary" - "fmt" - "net" - "time" - - "github.com/ledgerwatch/erigon/common/mclock" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p/discover/v5wire" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/p2p/enr" -) - -// readError represents an error during packet reading. -// This exists to facilitate type-switching on the result of conn.read. -type readError struct { - err error -} - -func (p *readError) Kind() byte { return 99 } -func (p *readError) Name() string { return fmt.Sprintf("error: %v", p.err) } -func (p *readError) Error() string { return p.err.Error() } -func (p *readError) Unwrap() error { return p.err } -func (p *readError) RequestID() []byte { return nil } -func (p *readError) SetRequestID([]byte) {} - -// readErrorf creates a readError with the given text. -func readErrorf(format string, args ...interface{}) *readError { - return &readError{fmt.Errorf(format, args...)} -} - -// This is the response timeout used in tests. -const waitTime = 300 * time.Millisecond - -// conn is a connection to the node under test. -type conn struct { - localNode *enode.LocalNode - localKey *ecdsa.PrivateKey - remote *enode.Node - remoteAddr *net.UDPAddr - listeners []net.PacketConn - - log logger - codec *v5wire.Codec - idCounter uint32 -} - -type logger interface { - Logf(string, ...interface{}) -} - -// newConn sets up a connection to the given node. -func newConn(dest *enode.Node, log logger) *conn { - key, err := crypto.GenerateKey() - if err != nil { - panic(err) - } - db, err := enode.OpenDB("") - if err != nil { - panic(err) - } - ln := enode.NewLocalNode(db, key) - - return &conn{ - localKey: key, - localNode: ln, - remote: dest, - remoteAddr: &net.UDPAddr{IP: dest.IP(), Port: dest.UDP()}, - codec: v5wire.NewCodec(ln, key, mclock.System{}), - log: log, - } -} - -func (tc *conn) setEndpoint(c net.PacketConn) { - tc.localNode.SetStaticIP(laddr(c).IP) - tc.localNode.SetFallbackUDP(laddr(c).Port) -} - -func (tc *conn) listen(ip string) net.PacketConn { - l, err := net.ListenPacket("udp", fmt.Sprintf("%v:0", ip)) - if err != nil { - panic(err) - } - tc.listeners = append(tc.listeners, l) - return l -} - -// close shuts down all listeners and the local node. -func (tc *conn) close() { - for _, l := range tc.listeners { - l.Close() - } - tc.localNode.Database().Close() -} - -// nextReqID creates a request id. -func (tc *conn) nextReqID() []byte { - id := make([]byte, 4) - tc.idCounter++ - binary.BigEndian.PutUint32(id, tc.idCounter) - return id -} - -// reqresp performs a request/response interaction on the given connection. -// The request is retried if a handshake is requested. -func (tc *conn) reqresp(c net.PacketConn, req v5wire.Packet) v5wire.Packet { - reqnonce := tc.write(c, req, nil) - switch resp := tc.read(c).(type) { - case *v5wire.Whoareyou: - if resp.Nonce != reqnonce { - return readErrorf("wrong nonce %x in WHOAREYOU (want %x)", resp.Nonce[:], reqnonce[:]) - } - resp.Node = tc.remote - tc.write(c, req, resp) - return tc.read(c) - default: - return resp - } -} - -// findnode sends a FINDNODE request and waits for its responses. -func (tc *conn) findnode(c net.PacketConn, dists []uint) ([]*enode.Node, error) { - var ( - findnode = &v5wire.Findnode{ReqID: tc.nextReqID(), Distances: dists} - reqnonce = tc.write(c, findnode, nil) - first = true - total uint8 - results []*enode.Node - ) - for n := 1; n > 0; { - switch resp := tc.read(c).(type) { - case *v5wire.Whoareyou: - // Handle handshake. - if resp.Nonce == reqnonce { - resp.Node = tc.remote - tc.write(c, findnode, resp) - } else { - return nil, fmt.Errorf("unexpected WHOAREYOU (nonce %x), waiting for NODES", resp.Nonce[:]) - } - case *v5wire.Ping: - // Handle ping from remote. - tc.write(c, &v5wire.Pong{ - ReqID: resp.ReqID, - ENRSeq: tc.localNode.Seq(), - }, nil) - case *v5wire.Nodes: - // Got NODES! Check request ID. - if !bytes.Equal(resp.ReqID, findnode.ReqID) { - return nil, fmt.Errorf("NODES response has wrong request id %x", resp.ReqID) - } - // Check total count. It should be greater than one - // and needs to be the same across all responses. - if first { - if resp.Total == 0 || resp.Total > 6 { - return nil, fmt.Errorf("invalid NODES response 'total' %d (not in (0,7))", resp.Total) - } - total = resp.Total - n = int(total) - 1 - first = false - } else { - n-- - if resp.Total != total { - return nil, fmt.Errorf("invalid NODES response 'total' %d (!= %d)", resp.Total, total) - } - } - // Check nodes. - nodes, err := checkRecords(resp.Nodes) - if err != nil { - return nil, fmt.Errorf("invalid node in NODES response: %v", err) - } - results = append(results, nodes...) - default: - return nil, fmt.Errorf("expected NODES, got %v", resp) - } - } - return results, nil -} - -// write sends a packet on the given connection. -func (tc *conn) write(c net.PacketConn, p v5wire.Packet, challenge *v5wire.Whoareyou) v5wire.Nonce { - packet, nonce, err := tc.codec.Encode(tc.remote.ID(), tc.remoteAddr.String(), p, challenge) - if err != nil { - panic(fmt.Errorf("can't encode %v packet: %v", p.Name(), err)) - } - if _, err := c.WriteTo(packet, tc.remoteAddr); err != nil { - tc.logf("Can't send %s: %v", p.Name(), err) - } else { - tc.logf(">> %s", p.Name()) - } - return nonce -} - -// read waits for an incoming packet on the given connection. -func (tc *conn) read(c net.PacketConn) v5wire.Packet { - buf := make([]byte, 1280) - if err := c.SetReadDeadline(time.Now().Add(waitTime)); err != nil { - return &readError{err} - } - n, fromAddr, err := c.ReadFrom(buf) - if err != nil { - return &readError{err} - } - _, _, p, err := tc.codec.Decode(buf[:n], fromAddr.String()) - if err != nil { - return &readError{err} - } - tc.logf("<< %s", p.Name()) - return p -} - -// logf prints to the test log. -func (tc *conn) logf(format string, args ...interface{}) { - if tc.log != nil { - tc.log.Logf("(%s) %s", tc.localNode.ID().TerminalString(), fmt.Sprintf(format, args...)) - } -} - -func laddr(c net.PacketConn) *net.UDPAddr { - return c.LocalAddr().(*net.UDPAddr) -} - -func checkRecords(records []*enr.Record) ([]*enode.Node, error) { - nodes := make([]*enode.Node, len(records)) - for i := range records { - n, err := enode.New(enode.ValidSchemes, records[i]) - if err != nil { - return nil, err - } - nodes[i] = n - } - return nodes, nil -} - -func containsUint(ints []uint, x uint) bool { - for i := range ints { - if ints[i] == x { - return true - } - } - return false -} diff --git a/cmd/devp2p/keycmd.go b/cmd/devp2p/keycmd.go deleted file mode 100644 index 0fe57ae8263..00000000000 --- a/cmd/devp2p/keycmd.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "net" - - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p/enode" - - "github.com/urfave/cli" -) - -var ( - keyCommand = cli.Command{ - Name: "key", - Usage: "Operations on node keys", - Subcommands: []cli.Command{ - keyGenerateCommand, - keyToNodeCommand, - }, - } - keyGenerateCommand = cli.Command{ - Name: "generate", - Usage: "Generates node key files", - ArgsUsage: "keyfile", - Action: genkey, - } - keyToNodeCommand = cli.Command{ - Name: "to-enode", - Usage: "Creates an enode URL from a node key file", - ArgsUsage: "keyfile", - Action: keyToURL, - Flags: []cli.Flag{hostFlag, tcpPortFlag, udpPortFlag}, - } -) - -var ( - hostFlag = cli.StringFlag{ - Name: "ip", - Usage: "IP address of the node", - Value: "127.0.0.1", - } - tcpPortFlag = cli.IntFlag{ - Name: "tcp", - Usage: "TCP port of the node", - Value: 30303, - } - udpPortFlag = cli.IntFlag{ - Name: "udp", - Usage: "UDP port of the node", - Value: 30303, - } -) - -func genkey(ctx *cli.Context) error { - if ctx.NArg() != 1 { - return fmt.Errorf("need key file as argument") - } - file := ctx.Args().Get(0) - - key, err := crypto.GenerateKey() - if err != nil { - return fmt.Errorf("could not generate key: %v", err) - } - return crypto.SaveECDSA(file, key) -} - -func keyToURL(ctx *cli.Context) error { - if ctx.NArg() != 1 { - return fmt.Errorf("need key file as argument") - } - - var ( - file = ctx.Args().Get(0) - host = ctx.String(hostFlag.Name) - tcp = ctx.Int(tcpPortFlag.Name) - udp = ctx.Int(udpPortFlag.Name) - ) - key, err := crypto.LoadECDSA(file) - if err != nil { - return err - } - ip := net.ParseIP(host) - if ip == nil { - return fmt.Errorf("invalid IP address %q", host) - } - node := enode.NewV4(&key.PublicKey, ip, tcp, udp) - fmt.Println(node.URLv4()) - return nil -} diff --git a/cmd/devp2p/main.go b/cmd/devp2p/main.go deleted file mode 100644 index e6741d0a614..00000000000 --- a/cmd/devp2p/main.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "os" - "path/filepath" - "sort" - - "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/params" - "github.com/urfave/cli" -) - -var ( - // Git information set by linker when building with ci.go. - app = &cli.App{ - Name: filepath.Base(os.Args[0]), - Usage: "go-ethereum devp2p tool", - Version: params.VersionWithCommit(params.GitCommit, ""), - Writer: os.Stdout, - HideVersion: true, - } -) - -func init() { - // Set up the CLI app. - app.Flags = append(app.Flags, debug.Flags...) - app.Before = func(ctx *cli.Context) error { - return debug.Setup(ctx) - } - app.After = func(ctx *cli.Context) error { - debug.Exit() - return nil - } - app.CommandNotFound = func(ctx *cli.Context, cmd string) { - fmt.Fprintf(os.Stderr, "No such command: %s\n", cmd) - os.Exit(1) - } - // Add subcommands. - app.Commands = []cli.Command{ - enrdumpCommand, - keyCommand, - discv4Command, - discv5Command, - dnsCommand, - nodesetCommand, - rlpxCommand, - } -} - -func main() { - exit(app.Run(os.Args)) -} - -// commandHasFlag returns true if the current command supports the given flag. -func commandHasFlag(ctx *cli.Context, flag cli.Flag) bool { - flags := ctx.FlagNames() - sort.Strings(flags) - i := sort.SearchStrings(flags, flag.GetName()) - return i != len(flags) && flags[i] == flag.GetName() -} - -// getNodeArg handles the common case of a single node descriptor argument. -func getNodeArg(ctx *cli.Context) *enode.Node { - if ctx.NArg() < 1 { - exit("missing node as command-line argument") - } - n, err := parseNode(ctx.Args()[0]) - if err != nil { - exit(err) - } - return n -} - -func exit(err interface{}) { - if err == nil { - os.Exit(0) - } - fmt.Fprintln(os.Stderr, err) - os.Exit(1) -} diff --git a/cmd/devp2p/nodeset.go b/cmd/devp2p/nodeset.go deleted file mode 100644 index 05719dd13ac..00000000000 --- a/cmd/devp2p/nodeset.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "os" - "sort" - "time" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/p2p/enode" -) - -const jsonIndent = " " - -// nodeSet is the nodes.json file format. It holds a set of node records -// as a JSON object. -type nodeSet map[enode.ID]nodeJSON - -type nodeJSON struct { - Seq uint64 `json:"seq"` - N *enode.Node `json:"record"` - - // The score tracks how many liveness checks were performed. It is incremented by one - // every time the node passes a check, and halved every time it doesn't. - Score int `json:"score,omitempty"` - // These two track the time of last successful contact. - FirstResponse time.Time `json:"firstResponse,omitempty"` - LastResponse time.Time `json:"lastResponse,omitempty"` - // This one tracks the time of our last attempt to contact the node. - LastCheck time.Time `json:"lastCheck,omitempty"` -} - -func loadNodesJSON(file string) nodeSet { - var nodes nodeSet - if err := common.LoadJSON(file, &nodes); err != nil { - exit(err) - } - return nodes -} - -func writeNodesJSON(file string, nodes nodeSet) { - nodesJSON, err := json.MarshalIndent(nodes, "", jsonIndent) - if err != nil { - exit(err) - } - if file == "-" { - os.Stdout.Write(nodesJSON) - return - } - if err := ioutil.WriteFile(file, nodesJSON, 0644); err != nil { - exit(err) - } -} - -func (ns nodeSet) nodes() []*enode.Node { - result := make([]*enode.Node, 0, len(ns)) - for _, n := range ns { - result = append(result, n.N) - } - // Sort by ID. - sort.Slice(result, func(i, j int) bool { - return bytes.Compare(result[i].ID().Bytes(), result[j].ID().Bytes()) < 0 - }) - return result -} - -func (ns nodeSet) add(nodes ...*enode.Node) { - for _, n := range nodes { - ns[n.ID()] = nodeJSON{Seq: n.Seq(), N: n} - } -} - -func (ns nodeSet) verify() error { - for id, n := range ns { - if n.N.ID() != id { - return fmt.Errorf("invalid node %v: ID does not match ID %v in record", id, n.N.ID()) - } - if n.N.Seq() != n.Seq { - return fmt.Errorf("invalid node %v: 'seq' does not match seq %d from record", id, n.N.Seq()) - } - } - return nil -} diff --git a/cmd/devp2p/nodesetcmd.go b/cmd/devp2p/nodesetcmd.go deleted file mode 100644 index 0564be63e94..00000000000 --- a/cmd/devp2p/nodesetcmd.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "net" - "time" - - "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/p2p/enr" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rlp" - - "github.com/urfave/cli" -) - -var ( - nodesetCommand = cli.Command{ - Name: "nodeset", - Usage: "Node set tools", - Subcommands: []cli.Command{ - nodesetInfoCommand, - nodesetFilterCommand, - }, - } - nodesetInfoCommand = cli.Command{ - Name: "info", - Usage: "Shows statistics about a node set", - Action: nodesetInfo, - ArgsUsage: "", - } - nodesetFilterCommand = cli.Command{ - Name: "filter", - Usage: "Filters a node set", - Action: nodesetFilter, - ArgsUsage: " filters..", - - SkipFlagParsing: true, - } -) - -func nodesetInfo(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need nodes file as argument") - } - - ns := loadNodesJSON(ctx.Args().First()) - fmt.Printf("Set contains %d nodes.\n", len(ns)) - return nil -} - -func nodesetFilter(ctx *cli.Context) error { - if ctx.NArg() < 1 { - return fmt.Errorf("need nodes file as argument") - } - ns := loadNodesJSON(ctx.Args().First()) - filter, err := andFilter(ctx.Args().Tail()) - if err != nil { - return err - } - - result := make(nodeSet) - for id, n := range ns { - if filter(n) { - result[id] = n - } - } - writeNodesJSON("-", result) - return nil -} - -type nodeFilter func(nodeJSON) bool - -type nodeFilterC struct { - narg int - fn func([]string) (nodeFilter, error) -} - -var filterFlags = map[string]nodeFilterC{ - "-ip": {1, ipFilter}, - "-min-age": {1, minAgeFilter}, - "-eth-network": {1, ethFilter}, -} - -func parseFilters(args []string) ([]nodeFilter, error) { - var filters []nodeFilter - for len(args) > 0 { - fc, ok := filterFlags[args[0]] - if !ok { - return nil, fmt.Errorf("invalid filter %q", args[0]) - } - if len(args)-1 < fc.narg { - return nil, fmt.Errorf("filter %q wants %d arguments, have %d", args[0], fc.narg, len(args)-1) - } - filter, err := fc.fn(args[1 : 1+fc.narg]) - if err != nil { - return nil, fmt.Errorf("%s: %v", args[0], err) - } - filters = append(filters, filter) - args = args[1+fc.narg:] - } - return filters, nil -} - -func andFilter(args []string) (nodeFilter, error) { - checks, err := parseFilters(args) - if err != nil { - return nil, err - } - f := func(n nodeJSON) bool { - for _, filter := range checks { - if !filter(n) { - return false - } - } - return true - } - return f, nil -} - -func ipFilter(args []string) (nodeFilter, error) { - _, cidr, err := net.ParseCIDR(args[0]) - if err != nil { - return nil, err - } - f := func(n nodeJSON) bool { return cidr.Contains(n.N.IP()) } - return f, nil -} - -func minAgeFilter(args []string) (nodeFilter, error) { - minage, err := time.ParseDuration(args[0]) - if err != nil { - return nil, err - } - f := func(n nodeJSON) bool { - age := n.LastResponse.Sub(n.FirstResponse) - return age >= minage - } - return f, nil -} - -func ethFilter(args []string) (nodeFilter, error) { - var filter forkid.Filter - switch args[0] { - case "mainnet": - filter = forkid.NewStaticFilter(params.MainnetChainConfig, params.MainnetGenesisHash) - case "rinkeby": - filter = forkid.NewStaticFilter(params.RinkebyChainConfig, params.RinkebyGenesisHash) - case "goerli": - filter = forkid.NewStaticFilter(params.GoerliChainConfig, params.GoerliGenesisHash) - case "ropsten": - filter = forkid.NewStaticFilter(params.RopstenChainConfig, params.RopstenGenesisHash) - case "sokol": - filter = forkid.NewStaticFilter(params.SokolChainConfig, params.SokolGenesisHash) - default: - return nil, fmt.Errorf("unknown network %q", args[0]) - } - - f := func(n nodeJSON) bool { - var eth struct { - ForkID forkid.ID - _ []rlp.RawValue `rlp:"tail"` - } - if n.N.Load(enr.WithEntry("eth", ð)) != nil { - return false - } - return filter(eth.ForkID) == nil - } - return f, nil -} diff --git a/cmd/devp2p/rlpxcmd.go b/cmd/devp2p/rlpxcmd.go deleted file mode 100644 index 006dfc31fc8..00000000000 --- a/cmd/devp2p/rlpxcmd.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "fmt" - "net" - - "github.com/ledgerwatch/erigon/cmd/devp2p/internal/ethtest" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/rlpx" - "github.com/ledgerwatch/erigon/rlp" - - "github.com/urfave/cli" -) - -var ( - rlpxCommand = cli.Command{ - Name: "rlpx", - Usage: "RLPx Commands", - Subcommands: []cli.Command{ - rlpxPingCommand, - rlpxEthTestCommand, - }, - } - rlpxPingCommand = cli.Command{ - Name: "ping", - Usage: "ping ", - Action: rlpxPing, - } - rlpxEthTestCommand = cli.Command{ - Name: "eth-test", - Usage: "Runs tests against a node", - ArgsUsage: " ", - Action: rlpxEthTest, - Flags: []cli.Flag{ - testPatternFlag, - testTAPFlag, - }, - } -) - -func rlpxPing(ctx *cli.Context) error { - n := getNodeArg(ctx) - fd, err := net.Dial("tcp", fmt.Sprintf("%v:%d", n.IP(), n.TCP())) - if err != nil { - return err - } - conn := rlpx.NewConn(fd, n.Pubkey()) - ourKey, _ := crypto.GenerateKey() - _, err = conn.Handshake(ourKey) - if err != nil { - return err - } - code, data, _, err := conn.Read() - if err != nil { - return err - } - switch code { - case 0: - var h ethtest.Hello - if err = rlp.DecodeBytes(data, &h); err != nil { - return fmt.Errorf("invalid handshake: %v", err) - } - fmt.Printf("%+v\n", h) - case 1: - var msg []p2p.DiscReason - if err = rlp.DecodeBytes(data, &msg); len(msg) == 0 || err != nil { - return fmt.Errorf("invalid disconnect message: %v", err) - } - return fmt.Errorf("received disconnect message: %v", msg[0]) - default: - return fmt.Errorf("invalid message code %d, expected handshake (code zero)", code) - } - return nil -} - -// rlpxEthTest runs the eth protocol test suite. -func rlpxEthTest(ctx *cli.Context) error { - if ctx.NArg() < 3 { - exit("missing path to chain.rlp as command-line argument") - } - suite, err := ethtest.NewSuite(getNodeArg(ctx), ctx.Args()[1], ctx.Args()[2]) - if err != nil { - exit(err) - } - return runTests(ctx, suite.EthTests()) -} diff --git a/cmd/devp2p/runtest.go b/cmd/devp2p/runtest.go deleted file mode 100644 index 869b7d66965..00000000000 --- a/cmd/devp2p/runtest.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of go-ethereum. -// -// go-ethereum 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. -// -// go-ethereum 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 go-ethereum. If not, see . - -package main - -import ( - "os" - - "github.com/ledgerwatch/erigon/cmd/devp2p/internal/v4test" - "github.com/ledgerwatch/erigon/internal/utesting" - "github.com/ledgerwatch/log/v3" - "github.com/urfave/cli" -) - -var ( - testPatternFlag = cli.StringFlag{ - Name: "run", - Usage: "Pattern of test suite(s) to run", - } - testTAPFlag = cli.BoolFlag{ - Name: "tap", - Usage: "Output TAP", - } - // These two are specific to the discovery tests. - testListen1Flag = cli.StringFlag{ - Name: "listen1", - Usage: "IP address of the first tester", - Value: v4test.Listen1, - } - testListen2Flag = cli.StringFlag{ - Name: "listen2", - Usage: "IP address of the second tester", - Value: v4test.Listen2, - } -) - -func runTests(ctx *cli.Context, tests []utesting.Test) error { - // Filter test cases. - if ctx.IsSet(testPatternFlag.Name) { - tests = utesting.MatchTests(tests, ctx.String(testPatternFlag.Name)) - } - // Disable logging unless explicitly enabled. - if !ctx.GlobalIsSet("verbosity") && !ctx.GlobalIsSet("vmodule") { - log.Root().SetHandler(log.DiscardHandler()) - } - // Run the tests. - var run = utesting.RunTests - if ctx.Bool(testTAPFlag.Name) { - run = utesting.RunTAP - } - results := run(tests, os.Stdout) - if utesting.CountFailures(results) > 0 { - os.Exit(1) - } - return nil -} diff --git a/cmd/downloader/downloader/downloader.go b/cmd/downloader/downloader/downloader.go new file mode 100644 index 00000000000..b1f6c304239 --- /dev/null +++ b/cmd/downloader/downloader/downloader.go @@ -0,0 +1,369 @@ +package downloader + +import ( + "context" + "fmt" + "io/fs" + "os" + "path/filepath" + "sync" + "time" + + "github.com/anacrolix/torrent" + "github.com/anacrolix/torrent/metainfo" + "github.com/anacrolix/torrent/storage" + common2 "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader/torrentcfg" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/log/v3" + mdbx2 "github.com/torquem-ch/mdbx-go/mdbx" + "golang.org/x/sync/semaphore" +) + +// Downloader - component which downloading historical files. Can use BitTorrent, or other protocols +type Downloader struct { + db kv.RwDB + pieceCompletionDB storage.PieceCompletion + torrentClient *torrent.Client + clientLock *sync.RWMutex + + cfg *torrentcfg.Cfg + + statsLock *sync.RWMutex + stats AggStats + + folder storage.ClientImplCloser +} + +type AggStats struct { + MetadataReady, FilesTotal int32 + PeersUnique int32 + ConnectionsTotal uint64 + + Completed bool + Progress float32 + + BytesCompleted, BytesTotal uint64 + + BytesDownload, BytesUpload uint64 + UploadRate, DownloadRate uint64 +} + +func New(cfg *torrentcfg.Cfg) (*Downloader, error) { + if err := portMustBeTCPAndUDPOpen(cfg.ListenPort); err != nil { + return nil, err + } + + // Application must never see partially-downloaded files + // To provide such consistent view - downloader does: + // add /snapshots/tmp - then method .onComplete will remove this suffix + // and App only work with /snapshot s folder + if common.FileExist(cfg.DataDir + "_tmp") { // migration from prev versions + _ = os.Rename(cfg.DataDir+"_tmp", filepath.Join(cfg.DataDir, "tmp")) // ignore error, because maybe they are on different drive, or target folder already created manually, all is fine + } + if !common.FileExist(filepath.Join(cfg.DataDir, "db")) { + cfg.DataDir = filepath.Join(cfg.DataDir, "tmp") + } else { + if err := copyFromTmp(cfg.DataDir); err != nil { + return nil, err + } + } + db, c, m, torrentClient, err := openClient(cfg.ClientConfig) + if err != nil { + return nil, fmt.Errorf("openClient: %w", err) + } + + peerID, err := readPeerID(db) + if err != nil { + return nil, fmt.Errorf("get peer id: %w", err) + } + cfg.PeerID = string(peerID) + if len(peerID) == 0 { + if err = savePeerID(db, torrentClient.PeerID()); err != nil { + return nil, fmt.Errorf("save peer id: %w", err) + } + } + + return &Downloader{ + cfg: cfg, + db: db, + pieceCompletionDB: c, + folder: m, + torrentClient: torrentClient, + clientLock: &sync.RWMutex{}, + + statsLock: &sync.RWMutex{}, + }, nil +} + +func (d *Downloader) SnapDir() string { + d.clientLock.RLock() + defer d.clientLock.RUnlock() + return d.cfg.DataDir +} + +func (d *Downloader) ReCalcStats(interval time.Duration) { + d.statsLock.Lock() + defer d.statsLock.Unlock() + prevStats, stats := d.stats, d.stats + + peers := make(map[torrent.PeerID]struct{}, 16) + torrents := d.torrentClient.Torrents() + connStats := d.torrentClient.ConnStats() + + stats.Completed = true + stats.BytesDownload = uint64(connStats.BytesReadUsefulIntendedData.Int64()) + stats.BytesUpload = uint64(connStats.BytesWrittenData.Int64()) + + stats.BytesTotal, stats.BytesCompleted, stats.ConnectionsTotal, stats.MetadataReady = 0, 0, 0, 0 + for _, t := range torrents { + select { + case <-t.GotInfo(): + stats.MetadataReady++ + for _, peer := range t.PeerConns() { + stats.ConnectionsTotal++ + peers[peer.PeerID] = struct{}{} + } + stats.BytesCompleted += uint64(t.BytesCompleted()) + stats.BytesTotal += uint64(t.Length()) + default: + } + + stats.Completed = stats.Completed && t.Complete.Bool() + } + + stats.DownloadRate = (stats.BytesDownload - prevStats.BytesDownload) / uint64(interval.Seconds()) + stats.UploadRate = (stats.BytesUpload - prevStats.BytesUpload) / uint64(interval.Seconds()) + + if stats.BytesTotal == 0 { + stats.Progress = 0 + } else { + stats.Progress = float32(float64(100) * (float64(stats.BytesCompleted) / float64(stats.BytesTotal))) + if stats.Progress == 100 && !stats.Completed { + stats.Progress = 99.99 + } + } + stats.PeersUnique = int32(len(peers)) + stats.FilesTotal = int32(len(torrents)) + + if !prevStats.Completed && stats.Completed { + d.onComplete() + } + + d.stats = stats +} + +func copyFromTmp(snapDir string) error { + tmpDir := filepath.Join(snapDir, "tmp") + if !common.FileExist(tmpDir) { + return nil + } + + snFs := os.DirFS(tmpDir) + paths, err := fs.ReadDir(snFs, ".") + if err != nil { + return err + } + for _, p := range paths { + if p.Name() == "." || p.Name() == ".." || p.Name() == "tmp" { + continue + } + src := filepath.Join(tmpDir, p.Name()) + if err := os.Rename(src, filepath.Join(snapDir, p.Name())); err != nil { + if os.IsExist(err) { + _ = os.Remove(src) + continue + } + return err + } + } + _ = os.Remove(tmpDir) + return nil +} + +// onComplete - only once - after download of all files fully done: +// - closing torrent client, closing downloader db +// - removing _tmp suffix from snapDir +// - open new torrentClient and db +func (d *Downloader) onComplete() { + snapDir, lastPart := filepath.Split(d.cfg.DataDir) + if lastPart != "tmp" { + return + } + + d.clientLock.Lock() + defer d.clientLock.Unlock() + + d.torrentClient.Close() + d.folder.Close() + d.pieceCompletionDB.Close() + d.db.Close() + + if err := copyFromTmp(snapDir); err != nil { + panic(err) + } + d.cfg.DataDir = snapDir + fmt.Printf("alex1: %s\n", d.cfg.DataDir) + + db, c, m, torrentClient, err := openClient(d.cfg.ClientConfig) + if err != nil { + panic(err) + } + d.db = db + d.pieceCompletionDB = c + d.folder = m + d.torrentClient = torrentClient +} + +func (d *Downloader) Stats() AggStats { + d.statsLock.RLock() + defer d.statsLock.RUnlock() + return d.stats +} + +func (d *Downloader) Close() { + d.torrentClient.Close() + if err := d.folder.Close(); err != nil { + log.Warn("[Snapshots] folder.close", "err", err) + } + if err := d.pieceCompletionDB.Close(); err != nil { + log.Warn("[Snapshots] pieceCompletionDB.close", "err", err) + } + d.db.Close() +} + +func (d *Downloader) PeerID() []byte { + peerID := d.torrentClient.PeerID() + return peerID[:] +} + +func (d *Downloader) StopSeeding(hash metainfo.Hash) error { + t, ok := d.torrentClient.Torrent(hash) + if !ok { + return nil + } + ch := t.Closed() + t.Drop() + <-ch + return nil +} + +func (d *Downloader) Torrent() *torrent.Client { + d.clientLock.RLock() + defer d.clientLock.RUnlock() + return d.torrentClient +} + +func openClient(cfg *torrent.ClientConfig) (db kv.RwDB, c storage.PieceCompletion, m storage.ClientImplCloser, torrentClient *torrent.Client, err error) { + snapDir := cfg.DataDir + db, err = mdbx.NewMDBX(log.New()). + Flags(func(f uint) uint { return f | mdbx2.SafeNoSync }). + Label(kv.DownloaderDB). + WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { return kv.DownloaderTablesCfg }). + SyncPeriod(15 * time.Second). + Path(filepath.Join(snapDir, "db")). + Open() + if err != nil { + return nil, nil, nil, nil, err + } + c, err = NewMdbxPieceCompletion(db) + if err != nil { + return nil, nil, nil, nil, fmt.Errorf("torrentcfg.NewMdbxPieceCompletion: %w", err) + } + m = storage.NewMMapWithCompletion(snapDir, c) + cfg.DefaultStorage = m + torrentClient, err = torrent.NewClient(cfg) + if err != nil { + return nil, nil, nil, nil, fmt.Errorf("torrent.NewClient: %w", err) + } + + if err := BuildTorrentsAndAdd(context.Background(), snapDir, torrentClient); err != nil { + if err != nil { + return nil, nil, nil, nil, fmt.Errorf("BuildTorrentsAndAdd: %w", err) + } + } + + return db, c, m, torrentClient, nil +} + +func MainLoop(ctx context.Context, d *Downloader, silent bool) { + var sem = semaphore.NewWeighted(int64(d.cfg.DownloadSlots)) + + go func() { + for { + torrents := d.Torrent().Torrents() + for _, t := range torrents { + <-t.GotInfo() + if t.Complete.Bool() { + continue + } + if err := sem.Acquire(ctx, 1); err != nil { + return + } + t.AllowDataDownload() + t.DownloadAll() + go func(t *torrent.Torrent) { + //r := t.NewReader() + //r.SetReadahead(t.Length()) + //_, _ = io.Copy(io.Discard, r) // enable streaming - it will prioritize sequential download + + <-t.Complete.On() + sem.Release(1) + }(t) + } + time.Sleep(30 * time.Second) + } + }() + + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + + statInterval := 20 * time.Second + statEvery := time.NewTicker(statInterval) + defer statEvery.Stop() + for { + select { + case <-ctx.Done(): + return + case <-statEvery.C: + d.ReCalcStats(statInterval) + + case <-logEvery.C: + if silent { + continue + } + + stats := d.Stats() + + if stats.MetadataReady < stats.FilesTotal { + log.Info(fmt.Sprintf("[Snapshots] Waiting for torrents metadata: %d/%d", stats.MetadataReady, stats.FilesTotal)) + continue + } + + if stats.Completed { + log.Info("[Snapshots] Seeding", + "up", common2.ByteCount(stats.UploadRate)+"/s", + "peers", stats.PeersUnique, + "connections", stats.ConnectionsTotal, + "files", stats.FilesTotal) + continue + } + + log.Info("[Snapshots] Downloading", + "progress", fmt.Sprintf("%.2f%% %s/%s", stats.Progress, common2.ByteCount(stats.BytesCompleted), common2.ByteCount(stats.BytesTotal)), + "download", common2.ByteCount(stats.DownloadRate)+"/s", + "upload", common2.ByteCount(stats.UploadRate)+"/s", + "peers", stats.PeersUnique, + "connections", stats.ConnectionsTotal, + "files", stats.FilesTotal) + if stats.PeersUnique == 0 { + ips := d.Torrent().BadPeerIPs() + if len(ips) > 0 { + log.Info("[Snapshots] Stats", "banned", ips) + } + } + } + } +} diff --git a/cmd/downloader/downloader/downloader_grpc_server.go b/cmd/downloader/downloader/downloader_grpc_server.go new file mode 100644 index 00000000000..8c7411e2158 --- /dev/null +++ b/cmd/downloader/downloader/downloader_grpc_server.go @@ -0,0 +1,87 @@ +package downloader + +import ( + "context" + "time" + + "github.com/anacrolix/torrent/metainfo" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + prototypes "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/log/v3" + "google.golang.org/protobuf/types/known/emptypb" +) + +var ( + _ proto_downloader.DownloaderServer = &GrpcServer{} +) + +func NewGrpcServer(d *Downloader) (*GrpcServer, error) { + return &GrpcServer{d: d}, nil +} + +type GrpcServer struct { + proto_downloader.UnimplementedDownloaderServer + d *Downloader +} + +func (s *GrpcServer) Download(ctx context.Context, request *proto_downloader.DownloadRequest) (*emptypb.Empty, error) { + torrentClient := s.d.Torrent() + mi := &metainfo.MetaInfo{AnnounceList: Trackers} + for _, it := range request.Items { + if it.TorrentHash == nil { + err := BuildTorrentAndAdd(ctx, it.Path, s.d.SnapDir(), torrentClient) + if err != nil { + return nil, err + } + continue + } + + hash := Proto2InfoHash(it.TorrentHash) + if _, ok := torrentClient.Torrent(hash); ok { + continue + } + + magnet := mi.Magnet(&hash, nil) + go func(magnetUrl string) { + t, err := torrentClient.AddMagnet(magnetUrl) + if err != nil { + log.Warn("[downloader] add magnet link", "err", err) + return + } + t.DisallowDataDownload() + t.AllowDataUpload() + <-t.GotInfo() + mi := t.Metainfo() + if err := CreateTorrentFileIfNotExists(s.d.SnapDir(), t.Info(), &mi); err != nil { + log.Warn("[downloader] create torrent file", "err", err) + return + } + }(magnet.String()) + } + s.d.ReCalcStats(10 * time.Second) // immediately call ReCalc to set stat.Complete flag + return &emptypb.Empty{}, nil +} + +func (s *GrpcServer) Stats(ctx context.Context, request *proto_downloader.StatsRequest) (*proto_downloader.StatsReply, error) { + stats := s.d.Stats() + return &proto_downloader.StatsReply{ + MetadataReady: stats.MetadataReady, + FilesTotal: stats.FilesTotal, + + Completed: stats.Completed, + Progress: stats.Progress, + + PeersUnique: stats.PeersUnique, + ConnectionsTotal: stats.ConnectionsTotal, + + BytesCompleted: stats.BytesCompleted, + BytesTotal: stats.BytesTotal, + UploadRate: stats.UploadRate, + DownloadRate: stats.DownloadRate, + }, nil +} + +func Proto2InfoHash(in *prototypes.H160) metainfo.Hash { + return gointerfaces.ConvertH160toAddress(in) +} diff --git a/cmd/downloader/downloader/mdbx_piece_completion.go b/cmd/downloader/downloader/mdbx_piece_completion.go new file mode 100644 index 00000000000..1bcbd349ca7 --- /dev/null +++ b/cmd/downloader/downloader/mdbx_piece_completion.go @@ -0,0 +1,73 @@ +package downloader + +import ( + "context" + "encoding/binary" + + "github.com/anacrolix/torrent/metainfo" + "github.com/anacrolix/torrent/storage" + "github.com/ledgerwatch/erigon-lib/kv" +) + +const ( + complete = "c" + incomplete = "i" +) + +type mdbxPieceCompletion struct { + db kv.RwDB +} + +var _ storage.PieceCompletion = (*mdbxPieceCompletion)(nil) + +func NewMdbxPieceCompletion(db kv.RwDB) (ret storage.PieceCompletion, err error) { + ret = &mdbxPieceCompletion{db} + return +} + +func (me mdbxPieceCompletion) Get(pk metainfo.PieceKey) (cn storage.Completion, err error) { + err = me.db.View(context.Background(), func(tx kv.Tx) error { + var key [4]byte + binary.BigEndian.PutUint32(key[:], uint32(pk.Index)) + cn.Ok = true + v, err := tx.GetOne(kv.BittorrentCompletion, append(pk.InfoHash[:], key[:]...)) + if err != nil { + return err + } + switch string(v) { + case complete: + cn.Complete = true + case incomplete: + cn.Complete = false + default: + cn.Ok = false + } + return nil + }) + return +} + +func (me mdbxPieceCompletion) Set(pk metainfo.PieceKey, b bool) error { + if c, err := me.Get(pk); err == nil && c.Ok && c.Complete == b { + return nil + } + return me.db.Update(context.Background(), func(tx kv.RwTx) error { + var key [4]byte + binary.BigEndian.PutUint32(key[:], uint32(pk.Index)) + + v := []byte(incomplete) + if b { + v = []byte(complete) + } + err := tx.Put(kv.BittorrentCompletion, append(pk.InfoHash[:], key[:]...), v) + if err != nil { + return err + } + return nil + }) +} + +func (me *mdbxPieceCompletion) Close() error { + me.db.Close() + return nil +} diff --git a/cmd/downloader/downloader/mdbx_piece_completion_test.go b/cmd/downloader/downloader/mdbx_piece_completion_test.go new file mode 100644 index 00000000000..15303b952d7 --- /dev/null +++ b/cmd/downloader/downloader/mdbx_piece_completion_test.go @@ -0,0 +1,37 @@ +package downloader + +import ( + "testing" + + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/anacrolix/torrent/metainfo" + "github.com/anacrolix/torrent/storage" +) + +func TestMdbxPieceCompletion(t *testing.T) { + db := memdb.NewTestDownloaderDB(t) + pc, err := NewMdbxPieceCompletion(db) + require.NoError(t, err) + defer pc.Close() + + pk := metainfo.PieceKey{} + + b, err := pc.Get(pk) + require.NoError(t, err) + assert.False(t, b.Ok) + + require.NoError(t, pc.Set(pk, false)) + + b, err = pc.Get(pk) + require.NoError(t, err) + assert.Equal(t, storage.Completion{Complete: false, Ok: true}, b) + + require.NoError(t, pc.Set(pk, true)) + + b, err = pc.Get(pk) + require.NoError(t, err) + assert.Equal(t, storage.Completion{Complete: true, Ok: true}, b) +} diff --git a/cmd/downloader/downloader/torrentcfg/logger.go b/cmd/downloader/downloader/torrentcfg/logger.go new file mode 100644 index 00000000000..e5a8a31881c --- /dev/null +++ b/cmd/downloader/downloader/torrentcfg/logger.go @@ -0,0 +1,88 @@ +package torrentcfg + +import ( + "strings" + + utp "github.com/anacrolix/go-libutp" + lg "github.com/anacrolix/log" + "github.com/ledgerwatch/log/v3" +) + +func init() { + lg.Default.Handlers = []lg.Handler{adapterHandler{}} + utp.Logger.Handlers = []lg.Handler{noopHandler{}} +} + +func Str2LogLevel(in string) (lg.Level, error) { + lvl := lg.Level{} + if err := lvl.UnmarshalText([]byte(in)); err != nil { + return lvl, err + } + return lvl, nil +} + +type noopHandler struct{} + +func (b noopHandler) Handle(r lg.Record) { +} + +type adapterHandler struct{} + +func (b adapterHandler) Handle(r lg.Record) { + lvl := r.Level + + switch lvl { + case lg.Debug: + log.Debug(r.String()) + case lg.Info: + str := r.String() + if strings.Contains(str, "EOF") || + strings.Contains(str, "spurious timer") || + strings.Contains(str, "banning ip ") { // suppress useless errors + break + } + + log.Info(str) + case lg.Warning: + str := r.String() + if strings.Contains(str, "could not find offer for id") { // suppress useless errors + break + } + if strings.Contains(str, "webrtc conn for unloaded torrent") { // suppress useless errors + break + } + if strings.Contains(str, "TrackerClient closed") { // suppress useless errors + break + } + if strings.Contains(str, "banned ip") { // suppress useless errors + break + } + if strings.Contains(str, "being sole dirtier of piece") { // suppress useless errors + break + } + + log.Warn(str) + case lg.Error: + str := r.String() + if strings.Contains(str, "EOF") { // suppress useless errors + break + } + + log.Error(str) + case lg.Critical: + str := r.String() + if strings.Contains(str, "EOF") { // suppress useless errors + break + } + if strings.Contains(str, "don't want conns") { // suppress useless errors + break + } + if strings.Contains(str, "torrent closed") { // suppress useless errors + break + } + + log.Error(str) + default: + log.Debug(r.String(), "torrent_log_type", "unknown") + } +} diff --git a/cmd/downloader/downloader/torrentcfg/torrentcfg.go b/cmd/downloader/downloader/torrentcfg/torrentcfg.go new file mode 100644 index 00000000000..9ca2bd48a84 --- /dev/null +++ b/cmd/downloader/downloader/torrentcfg/torrentcfg.go @@ -0,0 +1,124 @@ +package torrentcfg + +import ( + "fmt" + "net" + "strings" + + lg "github.com/anacrolix/log" + "github.com/anacrolix/torrent" + "github.com/c2h5oh/datasize" + "github.com/ledgerwatch/erigon/p2p/nat" + "github.com/ledgerwatch/log/v3" + "golang.org/x/time/rate" +) + +// DefaultPieceSize - Erigon serves many big files, bigger pieces will reduce +// amount of network announcements, but can't go over 2Mb +// see https://wiki.theory.org/BitTorrentSpecification#Metainfo_File_Structure +const DefaultPieceSize = 2 * 1024 * 1024 + +// DefaultNetworkChunkSize - how much data request per 1 network call to peer. +// default: 16Kb +// TODO: can we increase this value together with --torrent.upload.rate ? +const DefaultNetworkChunkSize = DefaultPieceSize + +type Cfg struct { + *torrent.ClientConfig + DownloadSlots int +} + +func Default() *torrent.ClientConfig { + torrentConfig := torrent.NewDefaultClientConfig() + + // enable dht + torrentConfig.NoDHT = true + //torrentConfig.DisableTrackers = true + //torrentConfig.DisableWebtorrent = true + //torrentConfig.DisableWebseeds = true + + // Reduce defaults - to avoid peers with very bad geography + //torrentConfig.MinDialTimeout = 1 * time.Second // default: 3sec + //torrentConfig.NominalDialTimeout = 10 * time.Second // default: 20sec + //torrentConfig.HandshakesTimeout = 1 * time.Second // default: 4sec + + // see: https://en.wikipedia.org/wiki/TCP_half-open + //torrentConfig.TotalHalfOpenConns = 100 // default: 100 + //torrentConfig.HalfOpenConnsPerTorrent = 25 // default: 25 + //torrentConfig.TorrentPeersHighWater = 500 // default: 500 + //torrentConfig.TorrentPeersLowWater = 50 // default: 50 + + torrentConfig.Seed = true + torrentConfig.UpnpID = torrentConfig.UpnpID + "leecher" + + return torrentConfig +} + +func New(snapDir string, verbosity lg.Level, natif nat.Interface, downloadRate, uploadRate datasize.ByteSize, port, connsPerFile int, downloadSlots int) (*Cfg, error) { + torrentConfig := Default() + // We would-like to reduce amount of goroutines in Erigon, so reducing next params + torrentConfig.EstablishedConnsPerTorrent = connsPerFile // default: 50 + torrentConfig.DataDir = snapDir + + torrentConfig.ListenPort = port + // check if ipv6 is enabled + torrentConfig.DisableIPv6 = true + l, err := net.Listen("tcp6", fmt.Sprintf(":%d", port)) + if err != nil { + isDisabled := strings.Contains(err.Error(), "cannot assign requested address") || strings.Contains(err.Error(), "address family not supported by protocol") + if !isDisabled { + log.Warn("can't enable ipv6", "err", err) + } + } else { + l.Close() + torrentConfig.DisableIPv6 = false + } + + switch natif.(type) { + case nil: + // No NAT interface, do nothing. + case nat.ExtIP: + // ExtIP doesn't block, set the IP right away. + ip, _ := natif.ExternalIP() + if ip != nil { + if ip.To4() != nil { + torrentConfig.PublicIp4 = ip + } else { + torrentConfig.PublicIp6 = ip + } + } + log.Info("[torrent] Public IP", "ip", ip) + + default: + // Ask the router about the IP. This takes a while and blocks startup, + // do it in the background. + if ip, err := natif.ExternalIP(); err == nil { + if ip != nil { + if ip.To4() != nil { + torrentConfig.PublicIp4 = ip + } else { + torrentConfig.PublicIp6 = ip + } + } + log.Info("[torrent] Public IP", "ip", ip) + } + } + // rates are divided by 2 - I don't know why it works, maybe bug inside torrent lib accounting + torrentConfig.UploadRateLimiter = rate.NewLimiter(rate.Limit(uploadRate.Bytes()), 2*DefaultPieceSize) // default: unlimited + if downloadRate.Bytes() < 500_000_000 { + b := int(2 * DefaultPieceSize) + if downloadRate.Bytes() > DefaultPieceSize { + b = int(2 * downloadRate.Bytes()) + } + torrentConfig.DownloadRateLimiter = rate.NewLimiter(rate.Limit(downloadRate.Bytes()), b) // default: unlimited + } + + // debug + //if lg.Debug == verbosity { + // torrentConfig.Debug = true + //} + torrentConfig.Logger = lg.Default.FilterLevel(verbosity) + torrentConfig.Logger.Handlers = []lg.Handler{adapterHandler{}} + + return &Cfg{ClientConfig: torrentConfig, DownloadSlots: downloadSlots}, nil +} diff --git a/cmd/downloader/downloader/util.go b/cmd/downloader/downloader/util.go new file mode 100644 index 00000000000..ef896335b1e --- /dev/null +++ b/cmd/downloader/downloader/util.go @@ -0,0 +1,449 @@ +package downloader + +import ( + "bytes" + "context" + "crypto/sha1" //nolint:gosec + "errors" + "fmt" + "io" + "net" + "os" + "path/filepath" + "runtime" + "sync" + "time" + + "github.com/anacrolix/torrent" + "github.com/anacrolix/torrent/bencode" + "github.com/anacrolix/torrent/metainfo" + "github.com/anacrolix/torrent/mmap_span" + "github.com/edsrzf/mmap-go" + common2 "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader/torrentcfg" + "github.com/ledgerwatch/erigon/cmd/downloader/trackers" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" + "github.com/ledgerwatch/log/v3" + "golang.org/x/sync/semaphore" +) + +// Trackers - break down by priority tier +var Trackers = [][]string{ + trackers.First(7, trackers.Best), + //trackers.First(3, trackers.Udp), + //trackers.First(3, trackers.Https), + //trackers.First(10, trackers.Ws), +} + +func AllTorrentPaths(dir string) ([]string, error) { + files, err := AllTorrentFiles(dir) + if err != nil { + return nil, err + } + var res []string + for _, f := range files { + torrentFilePath := filepath.Join(dir, f) + res = append(res, torrentFilePath) + } + return res, nil +} + +func AllTorrentFiles(dir string) ([]string, error) { + files, err := os.ReadDir(dir) + if err != nil { + return nil, err + } + var res []string + for _, f := range files { + if !snap.IsCorrectFileName(f.Name()) { + continue + } + fileInfo, err := f.Info() + if err != nil { + return nil, err + } + if fileInfo.Size() == 0 { + continue + } + if filepath.Ext(f.Name()) != ".torrent" { // filter out only compressed files + continue + } + res = append(res, f.Name()) + } + return res, nil +} +func allSegmentFiles(dir string) ([]string, error) { + files, err := os.ReadDir(dir) + if err != nil { + return nil, err + } + var res []string + for _, f := range files { + if !snap.IsCorrectFileName(f.Name()) { + continue + } + fileInfo, err := f.Info() + if err != nil { + return nil, err + } + if fileInfo.Size() == 0 { + continue + } + if filepath.Ext(f.Name()) != ".seg" { // filter out only compressed files + continue + } + res = append(res, f.Name()) + } + return res, nil +} + +// BuildTorrentFileIfNeed - create .torrent files from .seg files (big IO) - if .seg files were added manually +func BuildTorrentFileIfNeed(ctx context.Context, originalFileName, root string) (ok bool, err error) { + f, err := snap.ParseFileName(root, originalFileName) + if err != nil { + return false, fmt.Errorf("ParseFileName: %w", err) + } + if f.To-f.From != snap.DEFAULT_SEGMENT_SIZE { + return false, nil + } + torrentFilePath := filepath.Join(root, originalFileName+".torrent") + if _, err := os.Stat(torrentFilePath); err != nil { + if !errors.Is(err, os.ErrNotExist) { + return false, fmt.Errorf("os.Stat: %w", err) + } + info := &metainfo.Info{PieceLength: torrentcfg.DefaultPieceSize} + if err := info.BuildFromFilePath(filepath.Join(root, originalFileName)); err != nil { + return false, fmt.Errorf("BuildFromFilePath: %w", err) + } + if err := CreateTorrentFile(root, info, nil); err != nil { + return false, fmt.Errorf("CreateTorrentFile: %w", err) + } + } + return true, nil +} + +func BuildTorrentAndAdd(ctx context.Context, originalFileName, snapDir string, client *torrent.Client) error { + ok, err := BuildTorrentFileIfNeed(ctx, originalFileName, snapDir) + if err != nil { + return fmt.Errorf("BuildTorrentFileIfNeed: %w", err) + } + if !ok { + return nil + } + torrentFilePath := filepath.Join(snapDir, originalFileName+".torrent") + _, err = AddTorrentFile(ctx, torrentFilePath, client) + if err != nil { + return fmt.Errorf("AddTorrentFile: %w", err) + } + return nil +} + +// BuildTorrentFilesIfNeed - create .torrent files from .seg files (big IO) - if .seg files were added manually +func BuildTorrentFilesIfNeed(ctx context.Context, snapDir string) error { + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + + files, err := allSegmentFiles(snapDir) + if err != nil { + return err + } + errs := make(chan error, len(files)*2) + wg := &sync.WaitGroup{} + for i, f := range files { + wg.Add(1) + go func(f string, i int) { + defer wg.Done() + _, err = BuildTorrentFileIfNeed(ctx, f, snapDir) + if err != nil { + errs <- err + } + + select { + default: + case <-ctx.Done(): + errs <- ctx.Err() + case <-logEvery.C: + log.Info("[Snapshots] Creating .torrent files", "Progress", fmt.Sprintf("%d/%d", i, len(files))) + } + }(f, i) + } + go func() { + wg.Wait() + close(errs) + }() + for err := range errs { + if err != nil { + return err + } + } + return nil +} + +// BuildTorrentsAndAdd - create .torrent files from .seg files (big IO) - if .seg files were placed manually to snapDir +func BuildTorrentsAndAdd(ctx context.Context, snapDir string, client *torrent.Client) error { + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + files, err := allSegmentFiles(snapDir) + if err != nil { + return fmt.Errorf("allSegmentFiles: %w", err) + } + errs := make(chan error, len(files)*2) + wg := &sync.WaitGroup{} + workers := runtime.GOMAXPROCS(-1) - 1 + if workers < 1 { + workers = 1 + } + var sem = semaphore.NewWeighted(int64(workers)) + for i, f := range files { + wg.Add(1) + if err := sem.Acquire(ctx, 1); err != nil { + return err + } + go func(f string, i int) { + defer sem.Release(1) + defer wg.Done() + + select { + case <-ctx.Done(): + errs <- ctx.Err() + case <-logEvery.C: + log.Info("[Snapshots] Verify snapshots", "Progress", fmt.Sprintf("%d/%d", i, len(files))) + default: + } + errs <- BuildTorrentAndAdd(ctx, f, snapDir, client) + }(f, i) + } + go func() { + wg.Wait() + close(errs) + }() + for err := range errs { + if err != nil { + return err + } + } + return nil +} + +func CreateTorrentFileIfNotExists(root string, info *metainfo.Info, mi *metainfo.MetaInfo) error { + torrentFileName := filepath.Join(root, info.Name+".torrent") + if _, err := os.Stat(torrentFileName); err != nil { + if errors.Is(err, os.ErrNotExist) { + return CreateTorrentFile(root, info, mi) + } + return err + } + return nil +} + +func CreateTorrentFile(root string, info *metainfo.Info, mi *metainfo.MetaInfo) error { + if mi == nil { + infoBytes, err := bencode.Marshal(info) + if err != nil { + return err + } + mi = &metainfo.MetaInfo{ + CreationDate: time.Now().Unix(), + CreatedBy: "erigon", + InfoBytes: infoBytes, + AnnounceList: Trackers, + } + } else { + mi.AnnounceList = Trackers + } + torrentFileName := filepath.Join(root, info.Name+".torrent") + + file, err := os.Create(torrentFileName) + if err != nil { + return err + } + defer file.Sync() + defer file.Close() + if err := mi.Write(file); err != nil { + return err + } + return nil +} + +// nolint +func segmentFileNameFromTorrentFileName(in string) string { + ext := filepath.Ext(in) + return in[0 : len(in)-len(ext)] +} + +func mmapFile(name string) (mm mmap.MMap, err error) { + f, err := os.Open(name) + if err != nil { + return + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return + } + if fi.Size() == 0 { + return + } + return mmap.MapRegion(f, -1, mmap.RDONLY, mmap.COPY, 0) +} + +func verifyTorrent(info *metainfo.Info, root string, consumer func(i int, good bool) error) error { + span := new(mmap_span.MMapSpan) + for _, file := range info.UpvertedFiles() { + filename := filepath.Join(append([]string{root, info.Name}, file.Path...)...) + mm, err := mmapFile(filename) + if err != nil { + return err + } + if int64(len(mm)) != file.Length { + return fmt.Errorf("file %q has wrong length", filename) + } + span.Append(mm) + } + span.InitIndex() + for i, numPieces := 0, info.NumPieces(); i < numPieces; i += 1 { + p := info.Piece(i) + hash := sha1.New() //nolint:gosec + _, err := io.Copy(hash, io.NewSectionReader(span, p.Offset(), p.Length())) + if err != nil { + return err + } + good := bytes.Equal(hash.Sum(nil), p.Hash().Bytes()) + if err := consumer(i, good); err != nil { + return err + } + } + return nil +} + +// AddTorrentFile - adding .torrent file to torrentClient (and checking their hashes), if .torrent file +// added first time - pieces verification process will start (disk IO heavy) - Progress +// kept in `piece completion storage` (surviving reboot). Once it done - no disk IO needed again. +// Don't need call torrent.VerifyData manually +func AddTorrentFile(ctx context.Context, torrentFilePath string, torrentClient *torrent.Client) (*torrent.Torrent, error) { + mi, err := metainfo.LoadFromFile(torrentFilePath) + if err != nil { + return nil, err + } + mi.AnnounceList = Trackers + ts, err := torrent.TorrentSpecFromMetaInfoErr(mi) + if err != nil { + return nil, err + } + + if _, ok := torrentClient.Torrent(ts.InfoHash); !ok { // can set ChunkSize only for new torrents + ts.ChunkSize = torrentcfg.DefaultNetworkChunkSize + } else { + ts.ChunkSize = 0 + } + + t, _, err := torrentClient.AddTorrentSpec(ts) + if err != nil { + return nil, err + } + t.DisallowDataDownload() + t.AllowDataUpload() + return t, nil +} + +func VerifyDtaFiles(ctx context.Context, snapDir string) error { + logEvery := time.NewTicker(5 * time.Second) + defer logEvery.Stop() + files, err := AllTorrentPaths(snapDir) + if err != nil { + return err + } + totalPieces := 0 + for _, f := range files { + metaInfo, err := metainfo.LoadFromFile(f) + if err != nil { + return err + } + info, err := metaInfo.UnmarshalInfo() + if err != nil { + return err + } + totalPieces += info.NumPieces() + } + + j := 0 + failsAmount := 0 + for _, f := range files { + metaInfo, err := metainfo.LoadFromFile(f) + if err != nil { + return err + } + info, err := metaInfo.UnmarshalInfo() + if err != nil { + return err + } + + err = verifyTorrent(&info, snapDir, func(i int, good bool) error { + j++ + if !good { + failsAmount++ + log.Error("[Snapshots] Verify hash mismatch", "at piece", i, "file", info.Name) + return nil + } + select { + case <-logEvery.C: + log.Info("[Snapshots] Verify", "Progress", fmt.Sprintf("%.2f%%", 100*float64(j)/float64(totalPieces))) + case <-ctx.Done(): + return ctx.Err() + default: + } + return nil + }) + if err != nil { + return err + } + } + if failsAmount > 0 { + return fmt.Errorf("not all files are valid") + } + log.Info("[Snapshots] Verify done") + return nil +} + +func portMustBeTCPAndUDPOpen(port int) error { + tcpAddr := &net.TCPAddr{ + Port: port, + IP: net.ParseIP("127.0.0.1"), + } + ln, err := net.ListenTCP("tcp", tcpAddr) + if err != nil { + return fmt.Errorf("please open port %d for TCP and UDP. %w", port, err) + } + _ = ln.Close() + udpAddr := &net.UDPAddr{ + Port: port, + IP: net.ParseIP("127.0.0.1"), + } + ser, err := net.ListenUDP("udp", udpAddr) + if err != nil { + return fmt.Errorf("please open port %d for UDP. %w", port, err) + } + _ = ser.Close() + return nil +} + +func savePeerID(db kv.RwDB, peerID torrent.PeerID) error { + return db.Update(context.Background(), func(tx kv.RwTx) error { + return tx.Put(kv.BittorrentInfo, []byte(kv.BittorrentPeerID), peerID[:]) + }) +} + +func readPeerID(db kv.RoDB) (peerID []byte, err error) { + if err = db.View(context.Background(), func(tx kv.Tx) error { + peerIDFromDB, err := tx.GetOne(kv.BittorrentInfo, []byte(kv.BittorrentPeerID)) + if err != nil { + return fmt.Errorf("get peer id: %w", err) + } + peerID = common2.Copy(peerIDFromDB) + return nil + }); err != nil { + return nil, err + } + return peerID, nil +} diff --git a/cmd/downloader/downloadergrpc/client.go b/cmd/downloader/downloadergrpc/client.go new file mode 100644 index 00000000000..47ae9492f21 --- /dev/null +++ b/cmd/downloader/downloadergrpc/client.go @@ -0,0 +1,64 @@ +package downloadergrpc + +import ( + "context" + "fmt" + "time" + + "github.com/anacrolix/torrent/metainfo" + "github.com/c2h5oh/datasize" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + prototypes "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon/common" + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/keepalive" +) + +func NewClient(ctx context.Context, downloaderAddr string) (proto_downloader.DownloaderClient, error) { + // creating grpc client connection + var dialOpts []grpc.DialOption + + backoffCfg := backoff.DefaultConfig + backoffCfg.BaseDelay = 500 * time.Millisecond + backoffCfg.MaxDelay = 10 * time.Second + dialOpts = []grpc.DialOption{ + grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoffCfg, MinConnectTimeout: 10 * time.Minute}), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(int(16 * datasize.MB))), + grpc.WithKeepaliveParams(keepalive.ClientParameters{}), + } + + dialOpts = append(dialOpts, grpc.WithInsecure()) + conn, err := grpc.DialContext(ctx, downloaderAddr, dialOpts...) + if err != nil { + return nil, fmt.Errorf("creating client connection to sentry P2P: %w", err) + } + return proto_downloader.NewDownloaderClient(conn), nil +} + +func InfoHashes2Proto(in []metainfo.Hash) []*prototypes.H160 { + infoHashes := make([]*prototypes.H160, len(in)) + i := 0 + for _, h := range in { + infoHashes[i] = gointerfaces.ConvertAddressToH160(h) + i++ + } + return infoHashes +} + +func Strings2Proto(in []string) []*prototypes.H160 { + infoHashes := make([]*prototypes.H160, len(in)) + i := 0 + for _, h := range in { + infoHashes[i] = String2Proto(h) + i++ + } + return infoHashes +} + +func String2Proto(in string) *prototypes.H160 { + var infoHash [20]byte + copy(infoHash[:], common.FromHex(in)) + return gointerfaces.ConvertAddressToH160(infoHash) +} diff --git a/cmd/downloader/main.go b/cmd/downloader/main.go new file mode 100644 index 00000000000..b82c7c237e5 --- /dev/null +++ b/cmd/downloader/main.go @@ -0,0 +1,297 @@ +package main + +import ( + "context" + "fmt" + "net" + "os" + "path/filepath" + "time" + + "github.com/anacrolix/torrent/metainfo" + "github.com/c2h5oh/datasize" + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" + grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" + "github.com/ledgerwatch/erigon-lib/common" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader/torrentcfg" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/common/paths" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/p2p/nat" + "github.com/ledgerwatch/log/v3" + "github.com/pelletier/go-toml/v2" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/health" + "google.golang.org/grpc/health/grpc_health_v1" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/reflection" +) + +var ( + datadir string + forceRebuild bool + forceVerify bool + downloaderApiAddr string + natSetting string + torrentVerbosity string + downloadRateStr, uploadRateStr string + torrentDownloadSlots int + torrentPort int + torrentMaxPeers int + torrentConnsPerFile int + targetFile string +) + +func init() { + flags := append(debug.Flags, utils.MetricFlags...) + utils.CobraFlags(rootCmd, flags) + + withDataDir(rootCmd) + + rootCmd.Flags().StringVar(&natSetting, "nat", utils.NATFlag.Value, utils.NATFlag.Usage) + rootCmd.Flags().StringVar(&downloaderApiAddr, "downloader.api.addr", "127.0.0.1:9093", "external downloader api network address, for example: 127.0.0.1:9093 serves remote downloader interface") + rootCmd.Flags().StringVar(&torrentVerbosity, "torrent.verbosity", utils.TorrentVerbosityFlag.Value, utils.TorrentVerbosityFlag.Usage) + rootCmd.Flags().StringVar(&downloadRateStr, "torrent.download.rate", utils.TorrentDownloadRateFlag.Value, utils.TorrentDownloadRateFlag.Usage) + rootCmd.Flags().StringVar(&uploadRateStr, "torrent.upload.rate", utils.TorrentUploadRateFlag.Value, utils.TorrentUploadRateFlag.Usage) + rootCmd.Flags().IntVar(&torrentPort, "torrent.port", utils.TorrentPortFlag.Value, utils.TorrentPortFlag.Usage) + rootCmd.Flags().IntVar(&torrentMaxPeers, "torrent.maxpeers", utils.TorrentMaxPeersFlag.Value, utils.TorrentMaxPeersFlag.Usage) + rootCmd.Flags().IntVar(&torrentConnsPerFile, "torrent.conns.perfile", utils.TorrentConnsPerFileFlag.Value, utils.TorrentConnsPerFileFlag.Usage) + rootCmd.Flags().IntVar(&torrentDownloadSlots, "torrent.download.slots", utils.TorrentDownloadSlotsFlag.Value, utils.TorrentDownloadSlotsFlag.Usage) + + withDataDir(printTorrentHashes) + printTorrentHashes.PersistentFlags().BoolVar(&forceRebuild, "rebuild", false, "Force re-create .torrent files") + printTorrentHashes.PersistentFlags().BoolVar(&forceVerify, "verify", false, "Force verify data files if have .torrent files") + printTorrentHashes.Flags().StringVar(&targetFile, "targetfile", "", "write output to file") + if err := printTorrentHashes.MarkFlagFilename("targetfile"); err != nil { + panic(err) + } + + rootCmd.AddCommand(printTorrentHashes) +} + +func withDataDir(cmd *cobra.Command) { + cmd.Flags().StringVar(&datadir, utils.DataDirFlag.Name, paths.DefaultDataDir(), utils.DataDirFlag.Usage) + if err := cmd.MarkFlagDirname(utils.DataDirFlag.Name); err != nil { + panic(err) + } +} + +func main() { + ctx, cancel := common.RootContext() + defer cancel() + + if err := rootCmd.ExecuteContext(ctx); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +var rootCmd = &cobra.Command{ + Use: "", + Short: "snapshot downloader", + Example: "go run ./cmd/snapshots --datadir --downloader.api.addr 127.0.0.1:9093", + PersistentPreRun: func(cmd *cobra.Command, args []string) { + if err := debug.SetupCobra(cmd); err != nil { + panic(err) + } + }, + PersistentPostRun: func(cmd *cobra.Command, args []string) { + debug.Exit() + }, + RunE: func(cmd *cobra.Command, args []string) error { + if err := Downloader(cmd.Context()); err != nil { + log.Error("Downloader", "err", err) + return nil + } + return nil + }, +} + +func Downloader(ctx context.Context) error { + snapDir := filepath.Join(datadir, "snapshots") + torrentLogLevel, err := torrentcfg.Str2LogLevel(torrentVerbosity) + if err != nil { + return err + } + + var downloadRate, uploadRate datasize.ByteSize + if err := downloadRate.UnmarshalText([]byte(downloadRateStr)); err != nil { + return err + } + if err := uploadRate.UnmarshalText([]byte(uploadRateStr)); err != nil { + return err + } + + log.Info("Run snapshot downloader", "addr", downloaderApiAddr, "datadir", datadir, "download.rate", downloadRate.String(), "upload.rate", uploadRate.String()) + natif, err := nat.Parse(natSetting) + if err != nil { + return fmt.Errorf("invalid nat option %s: %w", natSetting, err) + } + + cfg, err := torrentcfg.New(snapDir, torrentLogLevel, natif, downloadRate, uploadRate, torrentPort, torrentConnsPerFile, torrentDownloadSlots) + if err != nil { + return err + } + + d, err := downloader.New(cfg) + if err != nil { + return err + } + defer d.Close() + log.Info("[torrent] Start", "my peerID", fmt.Sprintf("%x", d.Torrent().PeerID())) + go downloader.MainLoop(ctx, d, false) + + bittorrentServer, err := downloader.NewGrpcServer(d) + if err != nil { + return fmt.Errorf("new server: %w", err) + } + + grpcServer, err := StartGrpc(bittorrentServer, downloaderApiAddr, nil) + if err != nil { + return err + } + defer grpcServer.GracefulStop() + + <-ctx.Done() + return nil +} + +var printTorrentHashes = &cobra.Command{ + Use: "torrent_hashes", + Example: "go run ./cmd/downloader torrent_hashes --datadir ", + RunE: func(cmd *cobra.Command, args []string) error { + snapDir := filepath.Join(datadir, "snapshots") + ctx := cmd.Context() + + if forceVerify { // remove and create .torrent files (will re-read all snapshots) + return downloader.VerifyDtaFiles(ctx, snapDir) + } + + if forceRebuild { // remove and create .torrent files (will re-read all snapshots) + //removePieceCompletionStorage(snapDir) + files, err := downloader.AllTorrentPaths(snapDir) + if err != nil { + return err + } + for _, filePath := range files { + if err := os.Remove(filePath); err != nil { + return err + } + } + if err := downloader.BuildTorrentFilesIfNeed(ctx, snapDir); err != nil { + return err + } + } + + res := map[string]string{} + files, err := downloader.AllTorrentPaths(snapDir) + if err != nil { + return err + } + for _, torrentFilePath := range files { + mi, err := metainfo.LoadFromFile(torrentFilePath) + if err != nil { + return err + } + info, err := mi.UnmarshalInfo() + if err != nil { + return err + } + res[info.Name] = mi.HashInfoBytes().String() + } + serialized, err := toml.Marshal(res) + if err != nil { + return err + } + + if targetFile == "" { + fmt.Printf("%s\n", serialized) + return nil + } + + oldContent, err := os.ReadFile(targetFile) + if err != nil { + return err + } + oldLines := map[string]string{} + if err := toml.Unmarshal(oldContent, &oldLines); err != nil { + return fmt.Errorf("unmarshal: %w", err) + } + if len(oldLines) >= len(res) { + log.Info("amount of lines in target file is equal or greater than amount of lines in snapshot dir", "old", len(oldLines), "new", len(res)) + return nil + } + if err := os.WriteFile(targetFile, serialized, 0644); err != nil { + return err + } + return nil + }, +} + +//nolint +func removePieceCompletionStorage(snapDir string) { + _ = os.RemoveAll(filepath.Join(snapDir, "db")) + _ = os.RemoveAll(filepath.Join(snapDir, ".torrent.db")) + _ = os.RemoveAll(filepath.Join(snapDir, ".torrent.bolt.db")) + _ = os.RemoveAll(filepath.Join(snapDir, ".torrent.db-shm")) + _ = os.RemoveAll(filepath.Join(snapDir, ".torrent.db-wal")) +} + +func StartGrpc(snServer *downloader.GrpcServer, addr string, creds *credentials.TransportCredentials) (*grpc.Server, error) { + lis, err := net.Listen("tcp", addr) + if err != nil { + return nil, fmt.Errorf("could not create listener: %w, addr=%s", err, addr) + } + + var ( + streamInterceptors []grpc.StreamServerInterceptor + unaryInterceptors []grpc.UnaryServerInterceptor + ) + streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) + unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) + + //if metrics.Enabled { + // streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) + // unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) + //} + + opts := []grpc.ServerOption{ + // https://github.com/grpc/grpc-go/issues/3171#issuecomment-552796779 + grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ + MinTime: 10 * time.Second, + PermitWithoutStream: true, + }), + grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(streamInterceptors...)), + grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(unaryInterceptors...)), + } + if creds == nil { + // no specific opts + } else { + opts = append(opts, grpc.Creds(*creds)) + } + grpcServer := grpc.NewServer(opts...) + reflection.Register(grpcServer) // Register reflection service on gRPC server. + if snServer != nil { + proto_downloader.RegisterDownloaderServer(grpcServer, snServer) + } + + //if metrics.Enabled { + // grpc_prometheus.Register(grpcServer) + //} + + healthServer := health.NewServer() + grpc_health_v1.RegisterHealthServer(grpcServer, healthServer) + + go func() { + defer healthServer.Shutdown() + if err := grpcServer.Serve(lis); err != nil { + log.Error("gRPC server stop", "err", err) + } + }() + log.Info("Started gRPC server", "on", addr) + return grpcServer, nil +} diff --git a/cmd/downloader/readme.md b/cmd/downloader/readme.md new file mode 100644 index 00000000000..8861dff589c --- /dev/null +++ b/cmd/downloader/readme.md @@ -0,0 +1,116 @@ +# Downloader + +Service to seed/download historical data (snapshots, immutable .seg files) by Bittorrent protocol + +## How to Start Erigon in snapshot sync mode + +As many other Erigon components (txpool, sentry, rpc daemon) it may be built-into Erigon or run as separated process. + +```shell +# 1. Downloader by default run inside Erigon, by `--syncmode=snap` flag: +erigon --syncmode=snap --datadir= +``` + +```shell +# 2. It's possible to start Downloader as independent process, by `--syncmode=snap --downloader.api.addr=127.0.0.1:9093` flags: +make erigon downloader + +# Start downloader (can limit network usage by 512mb/sec: --torrent.download.rate=512mb --torrent.upload.rate=512mb) +downloader --downloader.api.addr=127.0.0.1:9093 --torrent.port=42068 --datadir= +# --downloader.api.addr - is for internal communication with Erigon +# --torrent.port=42068 - is for public BitTorrent protocol listen + +# Erigon on startup does send list of .torrent files to Downloader and wait for 100% download accomplishment +erigon --syncmode=snap --downloader.api.addr=127.0.0.1:9093 --datadir= +``` + +Use `--snap.keepblocks=true` to don't delete retired blocks from DB + +Any network/chain can start with snapshot sync: + +- node will download only snapshots registered in next repo https://github.com/ledgerwatch/erigon-snapshot +- node will move old blocks from DB to snapshots of 1K blocks size, then merge snapshots to bigger range, until + snapshots of 500K blocks, then automatically start seeding new snapshot + +Flag `--syncmode=snap` is compatible with `--prune` flag + +## How to create new network or bootnode + +```shell +# Need create new snapshots and start seeding them + +# Create new snapshots (can change snapshot size by: --from=0 --to=1_000_000 --segment.size=500_000) +# It will dump blocks from Database to .seg files: +erigon snapshots create --datadir= + +# Create .torrent files (Downloader will seed automatically all .torrent files) +# output format is compatible with https://github.com/ledgerwatch/erigon-snapshot +downloader torrent_hashes --rebuild --datadir= + +# Start downloader (seeds automatically) +downloader --downloader.api.addr=127.0.0.1:9093 --datadir= + +# Erigon is not required for snapshots seeding. But Erigon with --syncmode=snap also does seeding. +``` + +Additional info: +```shell +# Snapshots creation does not require fully-synced Erigon - few first stages enough. For example: +STOP_BEFORE_STAGE=Execution ./build/bin/erigon --syncmode=full --datadir= +# But for security - better have fully-synced Erigon + + +# Erigon can use snapshots only after indexing them. Erigon will automatically index them but also can run (this step is not required for seeding): +erigon snapshots index --datadir= +``` + +## Architecture + +Downloader works based on /snapshots/*.torrent files. Such files can be created 4 ways: + +- Erigon can do grpc call downloader.Download(list_of_hashes), it will trigger creation of .torrent files +- Erigon can create new .seg file, Downloader will scan .seg file and create .torrent +- operator can manually copy .torrent files (rsync from other server or restore from backup) +- operator can manually copy .seg file, Downloader will scan .seg file and create .torrent + +Erigon does: + +- connect to Downloader +- share list of hashes (see https://github.com/ledgerwatch/erigon-snapshot ) +- wait for download of all snapshots +- when .seg available - automatically create .idx files - secondary indices, for example to find block by hash +- then switch to normal staged sync (which doesn't require connection to Downloader) + +Downloader does: + +- Read .torrent files, download everything described by .torrent files +- Use https://github.com/ngosang/trackerslist see [./trackers/embed.go](./trackers/embed.go) +- automatically seeding + +Technical details: + +- To prevent attack - .idx creation using random Seed - all nodes will have different .idx file (and same .seg files) + +## How to verify that .seg files have same checksum withch current .torrent files + +``` +# Use it if you see weird behavior, bugs, bans, hardware issues, etc... +downloader torrent_hashes --verify --datadir= +``` + +## Faster rsync + +``` +rsync -aP --delete -e "ssh -T -o Compression=no -x" +``` + +## Release details + +Start automatic commit of new hashes to branch `master` + +``` +crontab -e +@hourly cd && ./cmd/downloader/torrent_hashes_update.sh 1>&2 2>> ~/erigon_cron.log +``` + +It does push to branch `auto`, before release - merge `auto` to `main` manually diff --git a/cmd/downloader/recompress.sh b/cmd/downloader/recompress.sh new file mode 100755 index 00000000000..4118e47dc40 --- /dev/null +++ b/cmd/downloader/recompress.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -e + +dir=$1 +files=$(ls $dir/snapshots | grep -v old | grep -v tor | grep seg | sort -n -t$'-' -k1) +for file in $files +do + from=$dir/snapshots/$file + to=$dir/snapshots/$file.new + echo "file: $file" + + ./build/bin/erigon_old snapshots uncompress $from | ./build/bin/erigon snapshots compress $to --datadir=$dir + a=$(du -h $from | awk '{print $1;}') + b=$(du -h $to | awk '{print $1;}') + echo "size: $a -> $b" + mv $from $from.old + mv $from.new $from + +done + + diff --git a/cmd/downloader/torrent_hashes_update.sh b/cmd/downloader/torrent_hashes_update.sh new file mode 100755 index 00000000000..0cb7f712452 --- /dev/null +++ b/cmd/downloader/torrent_hashes_update.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +datadir=$1 +network=$2 + +if [ -z "$datadir" ]; then + echo "arguments: " + exit 1 +fi +if [ -z "$network" ]; then + echo "arguments: " + exit 1 +fi + +#git reset --hard +#git checkout devel +#git pull + +# clean +cd ./../erigon-snapshot +git reset --hard +git checkout auto +git pull --ff-only origin auto +cd ../erigon + +# it will return only .seg of 500K (because Erigon send to Downloader only such files) +go run -trimpath ./cmd/downloader torrent_hashes --datadir="$datadir" --targetfile=./../erigon-snapshot/"$network".toml +cd ./../erigon-snapshot +git add "$network".toml +git commit -m "[ci]: $network, [from]: $HOSTNAME" + +#GH_TOKEN="" +GH_TOKEN_FILE="" +if [ ! type gcloud ] &>/dev/null; then + # GH_TOKEN=$(gcloud secrets versions access 1 --secret="github-snapshot-push") + GH_TOKEN_FILE="~/.ssh/vm_rsa" +fi + +# /dev/null to avoid logging of insecure git output +#SSH_CMD='echo ${GH_TOKEN} | ssh -i /dev/stdin -o IdentitiesOnly=yes' +SSH_CMD="ssh -i ${GH_TOKEN_FILE} -o IdentitiesOnly=yes" +GIT_SSH_COMMAND=${SSH_CMD} git push git@github.com:ledgerwatch/erigon-snapshot.git auto >/dev/null 2>&1 +echo "Done" diff --git a/cmd/downloader/trackers/embed.go b/cmd/downloader/trackers/embed.go new file mode 100644 index 00000000000..694f2eee40e --- /dev/null +++ b/cmd/downloader/trackers/embed.go @@ -0,0 +1,51 @@ +package trackers + +import ( + "bufio" + _ "embed" + "strings" +) + +//go:embed trackerslist/trackers_best.txt +var best string +var Best = split(best) + +//go:embed trackerslist/trackers_all_https.txt +var https string +var Https = split(https) + +//go:embed trackerslist/trackers_all_http.txt +var http string +var Http = split(http) + +//go:embed trackerslist/trackers_all_udp.txt +var udp string +var Udp = split(udp) + +//go:embed trackerslist/trackers_all_ws.txt +var ws string +var Ws = split(ws) + +func split(txt string) (lines []string) { + sc := bufio.NewScanner(strings.NewReader(txt)) + for sc.Scan() { + l := sc.Text() + l = strings.TrimSpace(l) + if len(l) == 0 { + continue + } + lines = append(lines, sc.Text()) + } + + if err := sc.Err(); err != nil { + panic(err) + } + return lines +} + +func First(n int, in []string) (res []string) { + if n <= len(in) { + return in[:n] + } + return in +} diff --git a/cmd/downloader/trackers/trackerslist b/cmd/downloader/trackers/trackerslist new file mode 160000 index 00000000000..17f277f3762 --- /dev/null +++ b/cmd/downloader/trackers/trackerslist @@ -0,0 +1 @@ +Subproject commit 17f277f376286f5a99db386421897d5f82031f57 diff --git a/cmd/erigon/main.go b/cmd/erigon/main.go index e189a25215e..525aca262f3 100644 --- a/cmd/erigon/main.go +++ b/cmd/erigon/main.go @@ -1,16 +1,12 @@ package main import ( - "context" "fmt" "os" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/erigon/params" + erigonapp "github.com/ledgerwatch/erigon/turbo/app" erigoncli "github.com/ledgerwatch/erigon/turbo/cli" "github.com/ledgerwatch/erigon/turbo/node" "github.com/ledgerwatch/log/v3" @@ -18,8 +14,17 @@ import ( ) func main() { - defer debug.LogPanic() - app := erigoncli.MakeApp(runErigon, erigoncli.DefaultFlags) + defer func() { + panicResult := recover() + if panicResult == nil { + return + } + + log.Error("catch panic", "err", panicResult, "stack", dbg.Stack()) + os.Exit(1) + }() + + app := erigonapp.MakeApp(runErigon, erigoncli.DefaultFlags) if err := app.Run(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -32,24 +37,6 @@ func runErigon(cliCtx *cli.Context) { logger.Info("Build info", "git_branch", params.GitBranch, "git_tag", params.GitTag, "git_commit", params.GitCommit) nodeCfg := node.NewNodConfigUrfave(cliCtx) ethCfg := node.NewEthConfigUrfave(cliCtx, nodeCfg) - if cliCtx.GlobalIsSet(utils.DataDirFlag.Name) { - // Check if we have an already initialized chain and fall back to - // that if so. Otherwise we need to generate a new genesis spec. - chaindb := utils.MakeChainDatabase(logger, nodeCfg) - if err := chaindb.View(context.Background(), func(tx kv.Tx) error { - h, err := rawdb.ReadCanonicalHash(tx, 0) - if err != nil { - panic(err) - } - if h != (common.Hash{}) { - ethCfg.Genesis = nil // fallback to db content - } - return nil - }); err != nil { - panic(err) - } - chaindb.Close() - } ethNode, err := node.New(nodeCfg, ethCfg, logger) if err != nil { diff --git a/cmd/erigoncustom/README.md b/cmd/erigoncustom/README.md index 0d20e52e9b5..67c0e078d7b 100644 --- a/cmd/erigoncustom/README.md +++ b/cmd/erigoncustom/README.md @@ -1,3 +1,4 @@ + # Erigon Custom This is an example of an app based on Erigon library that adds a custom diff --git a/cmd/erigoncustom/main.go b/cmd/erigoncustom/main.go index f3d7f9db924..0778d04a2c2 100644 --- a/cmd/erigoncustom/main.go +++ b/cmd/erigoncustom/main.go @@ -4,6 +4,7 @@ import ( "fmt" "os" + erigonapp "github.com/ledgerwatch/erigon/turbo/app" erigoncli "github.com/ledgerwatch/erigon/turbo/cli" "github.com/urfave/cli" @@ -23,7 +24,7 @@ const ( // the regular main function func main() { // initializing Erigon application here and providing our custom flag - app := erigoncli.MakeApp(runErigon, + app := erigonapp.MakeApp(runErigon, append(erigoncli.DefaultFlags, flag), // always use DefaultFlags, but add a new one in the end. ) if err := app.Run(os.Args); err != nil { diff --git a/cmd/evm/compiler.go b/cmd/evm/compiler.go index baed562d6d9..c5f88719962 100644 --- a/cmd/evm/compiler.go +++ b/cmd/evm/compiler.go @@ -19,7 +19,7 @@ package main import ( "errors" "fmt" - "io/ioutil" + "os" "github.com/ledgerwatch/erigon/cmd/evm/internal/compiler" @@ -41,7 +41,7 @@ func compileCmd(ctx *cli.Context) error { } fn := ctx.Args().First() - src, err := ioutil.ReadFile(fn) + src, err := os.ReadFile(fn) if err != nil { return err } diff --git a/cmd/evm/disasm.go b/cmd/evm/disasm.go index c3f19f5b062..e944a9dcb52 100644 --- a/cmd/evm/disasm.go +++ b/cmd/evm/disasm.go @@ -19,7 +19,7 @@ package main import ( "errors" "fmt" - "io/ioutil" + "os" "strings" "github.com/ledgerwatch/erigon/core/asm" @@ -38,7 +38,7 @@ func disasmCmd(ctx *cli.Context) error { switch { case len(ctx.Args().First()) > 0: fn := ctx.Args().First() - input, err := ioutil.ReadFile(fn) + input, err := os.ReadFile(fn) if err != nil { return err } diff --git a/cmd/evm/internal/t8ntool/execution.go b/cmd/evm/internal/t8ntool/execution.go index 5d2cc74e0b1..06988c0ed78 100644 --- a/cmd/evm/internal/t8ntool/execution.go +++ b/cmd/evm/internal/t8ntool/execution.go @@ -24,19 +24,21 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/log/v3" + "golang.org/x/crypto/sha3" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/consensus/misc" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/systemcontracts" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/trie" - "github.com/ledgerwatch/log/v3" - "golang.org/x/crypto/sha3" ) type Prestate struct { @@ -71,6 +73,7 @@ type stEnv struct { BlockHashes map[math.HexOrDecimal64]common.Hash `json:"blockHashes,omitempty"` Ommers []ommer `json:"ommers,omitempty"` BaseFee *big.Int `json:"currentBaseFee,omitempty"` + Random *common.Hash `json:"currentRandom,omitempty"` } type rejectedTx struct { @@ -115,7 +118,10 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, defer tx.Rollback() var ( - ibs = MakePreState(chainConfig.Rules(0), tx, pre.Pre) + rules0 = chainConfig.Rules(0) + rules1 = chainConfig.Rules(1) + rules = chainConfig.Rules(pre.Env.Number) + ibs = MakePreState(rules0, tx, pre.Pre) signer = types.MakeSigner(chainConfig, pre.Env.Number) gaspool = new(core.GasPool) blockHash = common.Hash{0x13, 0x37} @@ -126,16 +132,25 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, txIndex = 0 ) gaspool.AddGas(pre.Env.GasLimit) + + difficulty := new(big.Int) + if pre.Env.Random == nil { + difficulty = pre.Env.Difficulty + } else { + // We are on POS hence difficulty opcode is now supplant with RANDOM + random := pre.Env.Random.Bytes() + difficulty.SetBytes(random) + } vmContext := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - Coinbase: pre.Env.Coinbase, - BlockNumber: pre.Env.Number, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, - Time: pre.Env.Timestamp, - Difficulty: pre.Env.Difficulty, - GasLimit: pre.Env.GasLimit, - GetHash: getHash, + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Coinbase: pre.Env.Coinbase, + BlockNumber: pre.Env.Number, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, + Time: pre.Env.Timestamp, + Difficulty: difficulty, + GasLimit: pre.Env.GasLimit, + GetHash: getHash, } // If currentBaseFee is defined, add it to the vmContext. if pre.Env.BaseFee != nil { @@ -152,11 +167,12 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, chainConfig.DAOForkBlock.Cmp(new(big.Int).SetUint64(pre.Env.Number)) == 0 { misc.ApplyDAOHardFork(ibs) } + systemcontracts.UpgradeBuildInSystemContract(chainConfig, new(big.Int).SetUint64(pre.Env.Number), ibs) for i, txn := range txs { - msg, err := txn.AsMessage(*signer, pre.Env.BaseFee) + msg, err := txn.AsMessage(*signer, pre.Env.BaseFee, rules) if err != nil { - log.Warn("rejected txn", "index", i, "hash", txn.Hash(), "error", err) + log.Warn("rejected txn", "index", i, "hash", txn.Hash(), "err", err) rejectedTxs = append(rejectedTxs, &rejectedTx{i, err.Error()}) continue } @@ -175,7 +191,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, msgResult, err := core.ApplyMessage(evm, msg, gaspool, true /* refunds */, false /* gasBailout */) if err != nil { ibs.RevertToSnapshot(snapshot) - log.Info("rejected txn", "index", i, "hash", txn.Hash(), "from", msg.From(), "error", err) + log.Info("rejected txn", "index", i, "hash", txn.Hash(), "from", msg.From(), "err", err) rejectedTxs = append(rejectedTxs, &rejectedTx{i, err.Error()}) continue } @@ -200,7 +216,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, // If the transaction created a contract, store the creation address in the receipt. if msg.To() == nil { - receipt.ContractAddress = crypto.CreateAddress(evm.TxContext.Origin, txn.GetNonce()) + receipt.ContractAddress = crypto.CreateAddress(evm.TxContext().Origin, txn.GetNonce()) } // Set the receipt logs and create a bloom for filtering @@ -242,7 +258,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, // Commit block var root common.Hash - if err = ibs.FinalizeTx(chainConfig.Rules(1), state.NewPlainStateWriter(tx, tx, 1)); err != nil { + if err = ibs.FinalizeTx(rules1, state.NewPlainStateWriter(tx, tx, 1)); err != nil { return nil, nil, err } root, err = trie.CalcRoot("", tx) @@ -265,7 +281,7 @@ func (pre *Prestate) Apply(vmConfig vm.Config, chainConfig *params.ChainConfig, return db, execRs, nil } -func MakePreState(chainRules params.Rules, tx kv.RwTx, accounts core.GenesisAlloc) *state.IntraBlockState { +func MakePreState(chainRules *params.Rules, tx kv.RwTx, accounts core.GenesisAlloc) *state.IntraBlockState { var blockNr uint64 = 0 r, _ := state.NewPlainStateReader(tx), state.NewPlainStateWriter(tx, tx, blockNr) statedb := state.New(r) diff --git a/cmd/evm/internal/t8ntool/gen_stenv.go b/cmd/evm/internal/t8ntool/gen_stenv.go index fe77ec4d285..88dfc4d3cb2 100644 --- a/cmd/evm/internal/t8ntool/gen_stenv.go +++ b/cmd/evm/internal/t8ntool/gen_stenv.go @@ -24,6 +24,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) { BlockHashes map[math.HexOrDecimal64]common.Hash `json:"blockHashes,omitempty"` Ommers []ommer `json:"ommers,omitempty"` BaseFee *math.HexOrDecimal256 `json:"currentBaseFee,omitempty"` + Random *common.Hash `json:"currentRandom,omitempty"` } var enc stEnv enc.Coinbase = common.UnprefixedAddress(s.Coinbase) @@ -34,6 +35,7 @@ func (s stEnv) MarshalJSON() ([]byte, error) { enc.BlockHashes = s.BlockHashes enc.Ommers = s.Ommers enc.BaseFee = (*math.HexOrDecimal256)(s.BaseFee) + enc.Random = s.Random return json.Marshal(&enc) } @@ -48,6 +50,7 @@ func (s *stEnv) UnmarshalJSON(input []byte) error { BlockHashes map[math.HexOrDecimal64]common.Hash `json:"blockHashes,omitempty"` Ommers []ommer `json:"ommers,omitempty"` BaseFee *math.HexOrDecimal256 `json:"currentBaseFee,omitempty"` + Random *common.Hash `json:"currentRandom,omitempty"` } var dec stEnv if err := json.Unmarshal(input, &dec); err != nil { @@ -82,5 +85,8 @@ func (s *stEnv) UnmarshalJSON(input []byte) error { if dec.BaseFee != nil { s.BaseFee = (*big.Int)(dec.BaseFee) } + if dec.Random != nil { + s.Random = dec.Random + } return nil } diff --git a/cmd/evm/internal/t8ntool/transition.go b/cmd/evm/internal/t8ntool/transition.go index 923069e3e40..a6547a7a3d6 100644 --- a/cmd/evm/internal/t8ntool/transition.go +++ b/cmd/evm/internal/t8ntool/transition.go @@ -21,11 +21,13 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "math/big" "os" "path" + "path/filepath" + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core" @@ -259,12 +261,30 @@ func (t *txWithKey) UnmarshalJSON(input []byte) error { return err } } + gasPrice, value := uint256.NewInt(0), uint256.NewInt(0) + var overflow bool // Now, read the transaction itself - var tx types.Transaction - if err := json.Unmarshal(input, &tx); err != nil { + var txJson commands.RPCTransaction + + if err := json.Unmarshal(input, &txJson); err != nil { return err } - t.tx = tx + + if txJson.Value != nil { + value, overflow = uint256.FromBig((*big.Int)(txJson.Value)) + if overflow { + return fmt.Errorf("value field caused an overflow (uint256)") + } + } + + if txJson.GasPrice != nil { + gasPrice, overflow = uint256.FromBig((*big.Int)(txJson.GasPrice)) + if overflow { + return fmt.Errorf("gasPrice field caused an overflow (uint256)") + } + } + // assemble transaction + t.tx = types.NewTransaction(uint64(txJson.Nonce), *txJson.To, value, uint64(txJson.Gas), gasPrice, txJson.Input) return nil } @@ -285,7 +305,7 @@ func signUnsignedTransactions(txs []*txWithKey, signer types.Signer) (types.Tran tx := txWithKey.tx key := txWithKey.key v, r, s := tx.RawSignatureValues() - if key != nil && v.BitLen()+r.BitLen()+s.BitLen() == 0 { + if key != nil && v.IsZero() && r.IsZero() && s.IsZero() { // This transaction needs to be signed signed, err := types.SignTx(tx, signer, key) if err != nil { @@ -328,8 +348,8 @@ func saveFile(baseDir, filename string, data interface{}) error { if err != nil { return NewError(ErrorJson, fmt.Errorf("failed marshalling output: %v", err)) } - location := path.Join(baseDir, filename) - if err = ioutil.WriteFile(location, b, 0644); err != nil { //nolint:gosec + location := filepath.Join(baseDir, filename) + if err = os.WriteFile(location, b, 0644); err != nil { //nolint:gosec return NewError(ErrorIO, fmt.Errorf("failed writing output: %v", err)) } log.Info("Wrote file", "file", location) diff --git a/cmd/evm/main.go b/cmd/evm/main.go index 66cbc6e8ed2..451c0edbd8d 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -186,7 +186,6 @@ func init() { stateTestCommand, stateTransitionCommand, } - cli.CommandHelpTemplate = flags.OriginCommandHelpTemplate } func main() { diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index e2d26ac3528..ff96209d604 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -21,7 +21,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "math/big" "os" goruntime "runtime" @@ -30,6 +30,7 @@ import ( "time" "github.com/holiman/uint256" + common2 "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/urfave/cli" @@ -94,11 +95,11 @@ func timedExec(bench bool, execFunc func() ([]byte, uint64, error)) (output []by stats.bytesAllocated = result.AllocedBytesPerOp() } else { var memStatsBefore, memStatsAfter goruntime.MemStats - goruntime.ReadMemStats(&memStatsBefore) + common2.ReadMemStats(&memStatsBefore) startTime := time.Now() output, gasLeft, err = execFunc() stats.time = time.Since(startTime) - goruntime.ReadMemStats(&memStatsAfter) + common2.ReadMemStats(&memStatsAfter) stats.allocs = int64(memStatsAfter.Mallocs - memStatsBefore.Mallocs) stats.bytesAllocated = int64(memStatsAfter.TotalAlloc - memStatsBefore.TotalAlloc) } @@ -173,13 +174,13 @@ func runCmd(ctx *cli.Context) error { // If - is specified, it means that code comes from stdin if codeFileFlag == "-" { //Try reading from stdin - if hexcode, err = ioutil.ReadAll(os.Stdin); err != nil { + if hexcode, err = io.ReadAll(os.Stdin); err != nil { fmt.Printf("Could not load code from stdin: %v\n", err) os.Exit(1) } } else { // Codefile with hex assembly - if hexcode, err = ioutil.ReadFile(codeFileFlag); err != nil { + if hexcode, err = os.ReadFile(codeFileFlag); err != nil { fmt.Printf("Could not load code from file: %v\n", err) os.Exit(1) } @@ -195,7 +196,7 @@ func runCmd(ctx *cli.Context) error { code = common.FromHex(string(hexcode)) } else if fn := ctx.Args().First(); len(fn) > 0 { // EASM-file to compile - src, err := ioutil.ReadFile(fn) + src, err := os.ReadFile(fn) if err != nil { return err } @@ -248,7 +249,7 @@ func runCmd(ctx *cli.Context) error { var hexInput []byte if inputFileFlag := ctx.GlobalString(InputFileFlag.Name); inputFileFlag != "" { var err error - if hexInput, err = ioutil.ReadFile(inputFileFlag); err != nil { + if hexInput, err = os.ReadFile(inputFileFlag); err != nil { fmt.Printf("could not load input from file: %v\n", err) os.Exit(1) } @@ -277,7 +278,7 @@ func runCmd(ctx *cli.Context) error { output, leftOverGas, stats, err := timedExec(bench, execFunc) if ctx.GlobalBool(DumpFlag.Name) { - var rules params.Rules + rules := ¶ms.Rules{} if chainConfig != nil { rules = chainConfig.Rules(runtimeConfig.BlockNumber.Uint64()) } diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index 2ec67648432..7d4cddb4e67 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -21,7 +21,6 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "os" "github.com/ledgerwatch/erigon-lib/kv/memdb" @@ -84,7 +83,7 @@ func stateTestCmd(ctx *cli.Context) error { debugger = vm.NewStructLogger(config) } // Load the test content from the input file - src, err := ioutil.ReadFile(ctx.Args().First()) + src, err := os.ReadFile(ctx.Args().First()) if err != nil { return err } @@ -115,7 +114,7 @@ func stateTestCmd(ctx *cli.Context) error { var root common.Hash var calcRootErr error - statedb, err := test.Run(params.Rules{}, tx, st, cfg) + statedb, err := test.Run(¶ms.Rules{}, tx, st, cfg) // print state root for evmlab tracing root, calcRootErr = trie.CalcRoot("", tx) if err == nil && calcRootErr != nil { diff --git a/cmd/evm/testdata/9/alloc.json b/cmd/evm/testdata/9/alloc.json new file mode 100644 index 00000000000..430e4242732 --- /dev/null +++ b/cmd/evm/testdata/9/alloc.json @@ -0,0 +1,19 @@ +{ + "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b": { + "balance": "0x100000000000000000", + "nonce": "0x00" + }, + "0x00000000000000000000000000000000b0b0face": { + "code":"0x40600052", + "storage":{}, + "balance":"0x0", + "nonce": + "0x0" + }, + "0x000000000000000000000000000000ca1100f022": { + "code":"0x60806040527f248f18b25d9b5856c092f62a7d329b239f4a0a77e6ee6c58637f56745b9803f3446040518082815260200191505060405180910390a100fea265627a7a72315820eea50cf12e938601a56dcdef0ab1446f14ba25367299eb81834af54e1672f5d864736f6c63430005110032", + "storage":{}, + "balance":"0x0", + "nonce":"0x0" + } + } \ No newline at end of file diff --git a/cmd/evm/testdata/9/env.json b/cmd/evm/testdata/9/env.json new file mode 100644 index 00000000000..479d8a3f47d --- /dev/null +++ b/cmd/evm/testdata/9/env.json @@ -0,0 +1,8 @@ +{ + "currentCoinbase": "0x2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty": "0x20000", + "currentGasLimit": "0x1000000000", + "currentNumber": "0x1000000", + "currentTimestamp": "0x04", + "currentRandom": "0x1000000000000000000000000000000000000000000000000000000000000001" + } \ No newline at end of file diff --git a/cmd/evm/testdata/9/txs.json b/cmd/evm/testdata/9/txs.json new file mode 100644 index 00000000000..7f15b0b2215 --- /dev/null +++ b/cmd/evm/testdata/9/txs.json @@ -0,0 +1,14 @@ +[ + { + "gasPrice":"0x80", + "nonce":"0x0", + "to":"0x000000000000000000000000000000ca1100f022", + "input": "", + "gas":"0x1312d00", + "value": "0x0", + "v": "0x0", + "r": "0x0", + "s": "0x0", + "secretKey": "0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8" + } +] \ No newline at end of file diff --git a/cmd/hack/db/lmdb.go b/cmd/hack/db/lmdb.go index 39bed92d1d9..640bfb44690 100644 --- a/cmd/hack/db/lmdb.go +++ b/cmd/hack/db/lmdb.go @@ -5,14 +5,14 @@ import ( "bytes" "context" "encoding/binary" + // "errors" "fmt" "io" - "io/ioutil" "math" "os" "os/exec" - "path" + "path/filepath" "strings" "github.com/ledgerwatch/erigon-lib/kv" @@ -384,7 +384,7 @@ func (m *mdbx_meta) readMeta(page []byte) error { m.txnID_b = _64(page, pos) pos += 8 - pos += (3 * 8) // pagesRetired, x, y + pos += 3 * 8 // pagesRetired, x, y return nil } @@ -502,7 +502,7 @@ func generate2(tx kv.RwTx, entries int) error { func generate3(_ kv.RwDB, tx kv.RwTx) (bool, error) { for i := 0; i < 61; i++ { k := fmt.Sprintf("table_%05d", i) - if err := tx.(kv.BucketMigrator).CreateBucket(k); err != nil { + if err := tx.CreateBucket(k); err != nil { return false, err } } @@ -773,7 +773,7 @@ func checkReader(tx kv.Tx, errorCh chan error) (bool, error) { } func defragSteps(filename string, bucketsCfg kv.TableCfg, generateFs ...func(kv.RwDB, kv.RwTx) (bool, error)) error { - dir, err := ioutil.TempDir(".", "db-vis") + dir, err := os.MkdirTemp(".", "db-vis") if err != nil { return fmt.Errorf("creating temp dir for db visualisation: %w", err) } @@ -941,17 +941,17 @@ func Defrag() error { func TextInfo(chaindata string, visStream io.Writer) error { log.Info("Text Info", "db", chaindata) fmt.Fprint(visStream, "digraph lmdb {\nrankdir=LR\n") - datafile := path.Join(chaindata, MdbxDataFile) + datafile := filepath.Join(chaindata, MdbxDataFile) f, err := os.Open(datafile) if err != nil { - return fmt.Errorf("opening %v: %v", MdbxDataFile, err) + return fmt.Errorf("opening %v: %w", MdbxDataFile, err) } defer f.Close() var meta [PageSize]byte // Read meta page 0 if _, err = f.ReadAt(meta[:], 0*PageSize); err != nil { - return fmt.Errorf("reading meta page 0: %v", err) + return fmt.Errorf("reading meta page 0: %w", err) } header1 := new(header) @@ -967,12 +967,12 @@ func TextInfo(chaindata string, visStream io.Writer) error { // meta1.print() if err != nil { - return fmt.Errorf("reading meta page 0: %v", err) + return fmt.Errorf("reading meta page 0: %w", err) } // Read meta page 1 if _, err = f.ReadAt(meta[:], 1*PageSize); err != nil { - return fmt.Errorf("reading meta page 1: %v", err) + return fmt.Errorf("reading meta page 1: %w", err) } header2 := new(header) @@ -988,7 +988,7 @@ func TextInfo(chaindata string, visStream io.Writer) error { // meta2.print() if err != nil { - return fmt.Errorf("reading meta page 1: %v", err) + return fmt.Errorf("reading meta page 1: %w", err) } var freeRoot, mainRoot uint32 @@ -1115,7 +1115,7 @@ func _conditions(f io.ReaderAt, visStream io.Writer, node *mdbx_node, _header *h func readPages(f io.ReaderAt, visStream io.Writer, pgno uint32, blockID *int, parentBlock int, level *int) error { var page [PageSize]byte if _, err := f.ReadAt(page[:], int64(pgno*PageSize)); err != nil { - return fmt.Errorf("reading page: %v, error: %v", pgno, err) + return fmt.Errorf("reading page: %v, error: %w", pgno, err) } _header := new(header) @@ -1193,7 +1193,7 @@ func readPages(f io.ReaderAt, visStream io.Writer, pgno uint32, blockID *int, pa func freeDBPages(f io.ReaderAt, visStream io.Writer, freeRoot uint32) error { var page [PageSize]byte if _, err := f.ReadAt(page[:], int64(freeRoot*PageSize)); err != nil { - return fmt.Errorf("reading page: %v, error: %v", freeRoot, err) + return fmt.Errorf("reading page: %v, error: %w", freeRoot, err) } _header := new(header) diff --git a/cmd/hack/flow/flow.go b/cmd/hack/flow/flow.go index 7b3c927a970..e619c48e9ae 100644 --- a/cmd/hack/flow/flow.go +++ b/cmd/hack/flow/flow.go @@ -14,6 +14,7 @@ import ( "strings" "time" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon/cmd/hack/tool" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/core/vm" @@ -93,7 +94,7 @@ func worker(code []byte) { defer debug.LogPanic() for { var m runtime.MemStats - runtime.ReadMemStats(&m) + common.ReadMemStats(&m) // For info on each, see: https://golang.org/pkg/runtime/#MemStats if !*quiet { fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc)) @@ -142,7 +143,7 @@ func bToMb(b uint64) uint64 { } func batchServer() { - numWorkers := runtime.NumCPU() - 2 + numWorkers := runtime.GOMAXPROCS(-1) - 2 fmt.Printf("Number of cores: %v\n", numWorkers) file, err := os.Open("absintdata/contract_bytecode_txcnt.csv") diff --git a/cmd/hack/hack.go b/cmd/hack/hack.go index 74f4d79494c..f6806984986 100644 --- a/cmd/hack/hack.go +++ b/cmd/hack/hack.go @@ -5,30 +5,34 @@ import ( "bytes" "context" "encoding/binary" + "encoding/json" + "errors" "flag" "fmt" - "io/ioutil" + "io" "math/big" + "net/http" + _ "net/http/pprof" //nolint:gosec "os" "os/signal" + "path/filepath" + "regexp" "runtime" "runtime/pprof" - "sort" + "strconv" "strings" "syscall" "time" "github.com/RoaringBitmap/roaring/roaring64" "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/compress" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/consensus/ethash" - "github.com/ledgerwatch/erigon/consensus/misc" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/ethdb/cbor" - "github.com/ledgerwatch/erigon/params" - "github.com/wcharczuk/go-chart" - "github.com/wcharczuk/go-chart/util" + "github.com/ledgerwatch/erigon-lib/recsplit" + "golang.org/x/exp/slices" hackdb "github.com/ledgerwatch/erigon/cmd/hack/db" "github.com/ledgerwatch/erigon/cmd/hack/flow" @@ -37,27 +41,35 @@ import ( "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/common/paths" + "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/types/accounts" - "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/migrations" + "github.com/ledgerwatch/erigon/ethdb/cbor" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/parallelcompress" "github.com/ledgerwatch/erigon/turbo/trie" "github.com/ledgerwatch/log/v3" + "github.com/wcharczuk/go-chart/v2" ) +const ASSERT = false + var ( verbosity = flag.Uint("verbosity", 3, "Logging verbosity: 0=silent, 1=error, 2=warn, 3=info, 4=debug, 5=detail (default 3)") action = flag.String("action", "", "action to execute") cpuprofile = flag.String("cpuprofile", "", "write cpu profile `file`") rewind = flag.Int("rewind", 1, "rewind to given number of blocks") block = flag.Int("block", 1, "specifies a block number for operation") - blockTotal = flag.Int("blocktotal", 1, "specifies a total amount of blocks to process") + blockTotal = flag.Int("blocktotal", 1, "specifies a total amount of blocks to process (will offset from head block if <= 0)") account = flag.String("account", "0x", "specifies account to investigate") name = flag.String("name", "", "name to add to the file names") chaindata = flag.String("chaindata", "chaindata", "path to the chaindata database file") @@ -66,7 +78,7 @@ var ( ) func readData(filename string) (blocks []float64, hours []float64, dbsize []float64, trienodes []float64, heap []float64) { - err := util.File.ReadByLines(filename, func(line string) error { + err := chart.ReadLines(filename, func(line string) error { parts := strings.Split(line, ",") blocks = append(blocks, tool.ParseFloat64(strings.Trim(parts[0], " "))) hours = append(hours, tool.ParseFloat64(strings.Trim(parts[1], " "))) @@ -115,7 +127,6 @@ func mychart() { mainSeries := &chart.ContinuousSeries{ Name: "Cumulative sync time (bolt)", Style: chart.Style{ - Show: true, StrokeColor: chart.ColorBlue, FillColor: chart.ColorBlue.WithAlpha(100), }, @@ -125,7 +136,6 @@ func mychart() { badgerSeries := &chart.ContinuousSeries{ Name: "Cumulative sync time (badger)", Style: chart.Style{ - Show: true, StrokeColor: chart.ColorRed, FillColor: chart.ColorRed.WithAlpha(100), }, @@ -135,7 +145,7 @@ func mychart() { dbsizeSeries := &chart.ContinuousSeries{ Name: "Database size (bolt)", Style: chart.Style{ - Show: true, + StrokeColor: chart.ColorBlack, }, YAxis: chart.YAxisSecondary, @@ -145,7 +155,7 @@ func mychart() { dbsizeSeries0 := &chart.ContinuousSeries{ Name: "Database size (badger)", Style: chart.Style{ - Show: true, + StrokeColor: chart.ColorOrange, }, YAxis: chart.YAxisSecondary, @@ -163,8 +173,8 @@ func mychart() { }, YAxis: chart.YAxis{ Name: "Elapsed time", - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -172,15 +182,15 @@ func mychart() { return fmt.Sprintf("%d h", int(v.(float64))) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.ColorBlue, StrokeWidth: 1.0, }, GridLines: days(), }, YAxisSecondary: chart.YAxis{ - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -189,15 +199,13 @@ func mychart() { }, }, XAxis: chart.XAxis{ - Name: "Blocks, million", - Style: chart.Style{ - Show: true, - }, + Name: "Blocks, million", + Style: chart.Style{}, ValueFormatter: func(v interface{}) string { return fmt.Sprintf("%.3fm", v.(float64)) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.ColorAlternateGray, StrokeWidth: 1.0, }, @@ -216,13 +224,13 @@ func mychart() { buffer := bytes.NewBuffer([]byte{}) err := graph1.Render(chart.PNG, buffer) tool.Check(err) - err = ioutil.WriteFile("chart1.png", buffer.Bytes(), 0644) + err = os.WriteFile("chart1.png", buffer.Bytes(), 0644) tool.Check(err) heapSeries := &chart.ContinuousSeries{ Name: "Allocated heap", Style: chart.Style{ - Show: true, + StrokeColor: chart.ColorYellow, FillColor: chart.ColorYellow.WithAlpha(100), }, @@ -232,7 +240,7 @@ func mychart() { trienodesSeries := &chart.ContinuousSeries{ Name: "Trie nodes", Style: chart.Style{ - Show: true, + StrokeColor: chart.ColorGreen, }, YAxis: chart.YAxisSecondary, @@ -249,8 +257,8 @@ func mychart() { }, YAxis: chart.YAxis{ Name: "Allocated heap", - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -258,15 +266,15 @@ func mychart() { return fmt.Sprintf("%.1f G", v.(float64)) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.ColorYellow, StrokeWidth: 1.0, }, GridLines: days(), }, YAxisSecondary: chart.YAxis{ - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -275,15 +283,13 @@ func mychart() { }, }, XAxis: chart.XAxis{ - Name: "Blocks, million", - Style: chart.Style{ - Show: true, - }, + Name: "Blocks, million", + Style: chart.Style{}, ValueFormatter: func(v interface{}) string { return fmt.Sprintf("%.3fm", v.(float64)) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.ColorAlternateGray, StrokeWidth: 1.0, }, @@ -299,7 +305,7 @@ func mychart() { buffer.Reset() err = graph2.Render(chart.PNG, buffer) tool.Check(err) - err = ioutil.WriteFile("chart2.png", buffer.Bytes(), 0644) + err = os.WriteFile("chart2.png", buffer.Bytes(), 0644) tool.Check(err) } @@ -347,7 +353,7 @@ func bucketStats(chaindata string) error { } func readTrieLog() ([]float64, map[int][]float64, []float64) { - data, err := ioutil.ReadFile("dust/hack.log") + data, err := os.ReadFile("dust/hack.log") tool.Check(err) thresholds := []float64{} counts := map[int][]float64{} @@ -380,7 +386,7 @@ func trieChart() { shortsSeries := &chart.ContinuousSeries{ Name: "Short nodes", Style: chart.Style{ - Show: true, + StrokeColor: chart.ColorBlue, FillColor: chart.ColorBlue.WithAlpha(100), }, @@ -392,7 +398,7 @@ func trieChart() { countSeries[i] = &chart.ContinuousSeries{ Name: fmt.Sprintf("%d-nodes", i), Style: chart.Style{ - Show: true, + StrokeColor: chart.GetAlternateColor(i), }, XValues: thresholds, @@ -400,15 +406,13 @@ func trieChart() { } } xaxis := &chart.XAxis{ - Name: "Dust theshold", - Style: chart.Style{ - Show: true, - }, + Name: "Dust theshold", + Style: chart.Style{}, ValueFormatter: func(v interface{}) string { return fmt.Sprintf("%d wei", int(v.(float64))) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.DefaultStrokeColor, StrokeWidth: 1.0, }, @@ -445,8 +449,8 @@ func trieChart() { XAxis: *xaxis, YAxis: chart.YAxis{ Name: "Node count", - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -454,7 +458,7 @@ func trieChart() { return fmt.Sprintf("%dm", int(v.(float64)/1e6)) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.DefaultStrokeColor, StrokeWidth: 1.0, }, @@ -467,7 +471,7 @@ func trieChart() { buffer := bytes.NewBuffer([]byte{}) err := graph3.Render(chart.PNG, buffer) tool.Check(err) - err = ioutil.WriteFile("chart3.png", buffer.Bytes(), 0644) + err = os.WriteFile("chart3.png", buffer.Bytes(), 0644) tool.Check(err) graph4 := chart.Chart{ Width: 1280, @@ -480,8 +484,8 @@ func trieChart() { XAxis: *xaxis, YAxis: chart.YAxis{ Name: "Node count", - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -489,7 +493,7 @@ func trieChart() { return fmt.Sprintf("%.2fm", v.(float64)/1e6) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.DefaultStrokeColor, StrokeWidth: 1.0, }, @@ -503,7 +507,7 @@ func trieChart() { buffer = bytes.NewBuffer([]byte{}) err = graph4.Render(chart.PNG, buffer) tool.Check(err) - err = ioutil.WriteFile("chart4.png", buffer.Bytes(), 0644) + err = os.WriteFile("chart4.png", buffer.Bytes(), 0644) tool.Check(err) graph5 := chart.Chart{ Width: 1280, @@ -516,8 +520,8 @@ func trieChart() { XAxis: *xaxis, YAxis: chart.YAxis{ Name: "Node count", - NameStyle: chart.StyleShow(), - Style: chart.StyleShow(), + NameStyle: chart.Shown(), + Style: chart.Shown(), TickStyle: chart.Style{ TextRotationDegrees: 45.0, }, @@ -525,7 +529,7 @@ func trieChart() { return fmt.Sprintf("%.2fk", v.(float64)/1e3) }, GridMajorStyle: chart.Style{ - Show: true, + StrokeColor: chart.DefaultStrokeColor, StrokeWidth: 1.0, }, @@ -550,7 +554,7 @@ func trieChart() { buffer = bytes.NewBuffer([]byte{}) err = graph5.Render(chart.PNG, buffer) tool.Check(err) - err = ioutil.WriteFile("chart5.png", buffer.Bytes(), 0644) + err = os.WriteFile("chart5.png", buffer.Bytes(), 0644) tool.Check(err) } @@ -646,36 +650,49 @@ func testBlockHashes(chaindata string, block int, stateRoot common.Hash) { })) } +func getCurrentBlockNumber(tx kv.Tx) *uint64 { + hash := rawdb.ReadHeadBlockHash(tx) + if hash == (common.Hash{}) { + return nil + } + return rawdb.ReadHeaderNumber(tx, hash) +} + func printCurrentBlockNumber(chaindata string) { ethDb := mdbx.MustOpen(chaindata) defer ethDb.Close() ethDb.View(context.Background(), func(tx kv.Tx) error { - hash := rawdb.ReadHeadBlockHash(tx) - number := rawdb.ReadHeaderNumber(tx, hash) - fmt.Printf("Block number: %d\n", *number) + if number := getCurrentBlockNumber(tx); number != nil { + fmt.Printf("Block number: %d\n", *number) + } else { + fmt.Println("Block number: ") + } return nil }) } -func printTxHashes() { - db := mdbx.MustOpen(paths.DefaultDataDir() + "/geth/chaindata") +func printTxHashes(chaindata string, block uint64) error { + db := mdbx.MustOpen(chaindata) defer db.Close() if err := db.View(context.Background(), func(tx kv.Tx) error { - for b := uint64(0); b < uint64(100000); b++ { - hash, err := rawdb.ReadCanonicalHash(tx, b) - tool.Check(err) + for b := block; b < block+1; b++ { + hash, e := rawdb.ReadCanonicalHash(tx, b) + if e != nil { + return e + } block := rawdb.ReadBlock(tx, hash, b) if block == nil { break } - for _, tx := range block.Transactions() { - fmt.Printf("%x\n", tx.Hash()) + for i, tx := range block.Transactions() { + fmt.Printf("%d: %x\n", i, tx.Hash()) } } return nil }); err != nil { - panic(err) + return err } + return nil } func readTrie(filename string) *trie.Trie { @@ -867,7 +884,7 @@ func validateTxLookups2(db kv.RwDB, startBlock uint64, interruptCh chan bool) { for !interrupt { blockHash, err := rawdb.ReadCanonicalHash(tx, blockNum) tool.Check(err) - body := rawdb.ReadBody(tx, blockHash, blockNum) + body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blockNum) if body == nil { break @@ -896,19 +913,6 @@ func validateTxLookups2(db kv.RwDB, startBlock uint64, interruptCh chan bool) { } } -func getModifiedAccounts(chaindata string) { - // TODO(tjayrush): The call to GetModifiedAccounts needs a database tx - fmt.Println("hack - getModiiedAccounts is temporarily disabled.") - db := mdbx.MustOpen(chaindata) - defer db.Close() - tool.Check(db.View(context.Background(), func(tx kv.Tx) error { - addrs, err := changeset.GetModifiedAccounts(tx, 49300, 49400) - tool.Check(err) - fmt.Printf("Len(addrs)=%d\n", len(addrs)) - return nil - })) -} - type Receiver struct { defaultReceiver *trie.RootHashAggregator accountMap map[string]*accounts.Account @@ -991,7 +995,8 @@ func regenerate(chaindata string) error { } syncHeadHeader := rawdb.ReadHeader(tx, hash, to) expectedRootHash := syncHeadHeader.Root - _, err = stagedsync.RegenerateIntermediateHashes("", tx, stagedsync.StageTrieCfg(db, true, true, ""), expectedRootHash, nil) + blockReader := snapshotsync.NewBlockReader() + _, err = stagedsync.RegenerateIntermediateHashes("", tx, stagedsync.StageTrieCfg(db, true, true, "", blockReader), expectedRootHash, nil) tool.Check(err) log.Info("Regeneration ended") return tx.Commit() @@ -1005,7 +1010,7 @@ func testGetProof(chaindata string, address common.Address, rewind int, regen bo } storageKeys := []string{} var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) db := mdbx.MustOpen(chaindata) defer db.Close() tx, err1 := db.BeginRo(context.Background()) @@ -1018,19 +1023,14 @@ func testGetProof(chaindata string, address common.Address, rewind int, regen bo headNumber := rawdb.ReadHeaderNumber(tx, headHash) block := *headNumber - uint64(rewind) log.Info("GetProof", "address", address, "storage keys", len(storageKeys), "head", *headNumber, "block", block, - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) - ts := dbutils.EncodeBlockNumber(block + 1) accountMap := make(map[string]*accounts.Account) - if err := changeset.Walk(tx, kv.AccountChangeSet, ts, 0, func(blockN uint64, address, v []byte) (bool, error) { - if blockN > *headNumber { - return false, nil - } - + if err := changeset.ForRange(tx, kv.AccountChangeSet, block+1, *headNumber+1, func(blockN uint64, address, v []byte) error { var addrHash, err = common.HashData(address) if err != nil { - return false, err + return err } k := addrHash[:] @@ -1038,40 +1038,37 @@ func testGetProof(chaindata string, address common.Address, rewind int, regen bo if len(v) > 0 { var a accounts.Account if innerErr := a.DecodeForStorage(v); innerErr != nil { - return false, innerErr + return innerErr } accountMap[string(k)] = &a } else { accountMap[string(k)] = nil } } - return true, nil + return nil }); err != nil { return err } - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info("Constructed account map", "size", len(accountMap), - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) storageMap := make(map[string][]byte) - if err := changeset.Walk(tx, kv.StorageChangeSet, ts, 0, func(blockN uint64, address, v []byte) (bool, error) { - if blockN > *headNumber { - return false, nil - } + if err := changeset.ForRange(tx, kv.StorageChangeSet, block+1, *headNumber+1, func(blockN uint64, address, v []byte) error { var addrHash, err = common.HashData(address) if err != nil { - return false, err + return err } k := addrHash[:] if _, ok := storageMap[string(k)]; !ok { storageMap[string(k)] = v } - return true, nil + return nil }); err != nil { return err } - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info("Constructed storage map", "size", len(storageMap), - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) var unfurlList = make([]string, len(accountMap)+len(storageMap)) unfurl := trie.NewRetainList(0) i := 0 @@ -1113,10 +1110,10 @@ func testGetProof(chaindata string, address common.Address, rewind int, regen bo return err1 } } - sort.Strings(unfurlList) - runtime.ReadMemStats(&m) + slices.Sort(unfurlList) + libcommon.ReadMemStats(&m) log.Info("Constructed account unfurl lists", - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) loader := trie.NewFlatDBTrieLoader("checkRoots") if err = loader.Reset(unfurl, nil, nil, false); err != nil { @@ -1133,72 +1130,327 @@ func testGetProof(chaindata string, address common.Address, rewind int, regen bo if err != nil { return err } - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info("Loaded subtries", - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) hash, err := rawdb.ReadCanonicalHash(tx, block) tool.Check(err) header := rawdb.ReadHeader(tx, hash, block) - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info("Constructed trie", - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) fmt.Printf("Resulting root: %x, expected root: %x\n", root, header.Root) return nil } -func dumpState(chaindata string) error { +// dumpState writes the content of current state into a file with given name +func dumpState(chaindata string, block int, name string) error { db := mdbx.MustOpen(chaindata) defer db.Close() - f, err := os.Create("statedump") + fa, err := os.Create(name + ".accounts.dat") if err != nil { return err } - defer f.Close() - w := bufio.NewWriter(f) - defer w.Flush() - stAccounts := 0 - stStorage := 0 - var varintBuf [10]byte // Buffer for varint number - if err := db.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(kv.PlainState) - if err != nil { - return err - } - k, v, e := c.First() - for ; k != nil && e == nil; k, v, e = c.Next() { - keyLen := binary.PutUvarint(varintBuf[:], uint64(len(k))) - if _, err = w.Write(varintBuf[:keyLen]); err != nil { + defer fa.Close() + wa := bufio.NewWriterSize(fa, etl.BufIOSize) + // Write out number of key/value pairs first + var countBytes [8]byte + binary.BigEndian.PutUint64(countBytes[:], 0) // TODO: Write correct number or remove + if _, err = wa.Write(countBytes[:]); err != nil { + return err + } + defer wa.Flush() + var fs, fc *os.File + if fs, err = os.Create(name + ".storage.dat"); err != nil { + return err + } + defer fs.Close() + ws := bufio.NewWriterSize(fs, etl.BufIOSize) + binary.BigEndian.PutUint64(countBytes[:], 0) // TODO: Write correct number or remove + if _, err = ws.Write(countBytes[:]); err != nil { + return err + } + defer ws.Flush() + if fc, err = os.Create(name + ".code.dat"); err != nil { + return err + } + defer fc.Close() + wc := bufio.NewWriterSize(fc, etl.BufIOSize) + binary.BigEndian.PutUint64(countBytes[:], 0) // TODO: Write correct number or remove + if _, err = wc.Write(countBytes[:]); err != nil { + return err + } + defer wc.Flush() + tx, err := db.BeginRo(context.Background()) + if err != nil { + return err + } + defer tx.Rollback() + var sc kv.Cursor + if sc, err = tx.Cursor(kv.PlainState); err != nil { + return err + } + defer sc.Close() + var cc kv.Cursor + if cc, err = tx.Cursor(kv.PlainContractCode); err != nil { + return err + } + defer cc.Close() + i := 0 + numBuf := make([]byte, binary.MaxVarintLen64) + k, v, e := sc.First() + var a accounts.Account + var addr common.Address + var ks [20 + 32]byte + for ; k != nil && e == nil; k, v, e = sc.Next() { + if len(k) == 20 { + n := binary.PutUvarint(numBuf, uint64(len(k))) + if _, err = wa.Write(numBuf[:n]); err != nil { return err } - if _, err = w.Write([]byte(k)); err != nil { + if _, err = wa.Write(k); err != nil { return err } - valLen := binary.PutUvarint(varintBuf[:], uint64(len(v))) - if _, err = w.Write(varintBuf[:valLen]); err != nil { + n = binary.PutUvarint(numBuf, uint64(len(v))) + if _, err = wa.Write(numBuf[:n]); err != nil { return err } if len(v) > 0 { - if _, err = w.Write(v); err != nil { + if _, err = wa.Write(v); err != nil { return err } } - if len(k) > 28 { - stStorage++ - } else { - stAccounts++ + if err = a.DecodeForStorage(v); err != nil { + return err } - if (stStorage+stAccounts)%100000 == 0 { - fmt.Printf("State records: %d\n", stStorage+stAccounts) + if a.CodeHash != trie.EmptyCodeHash { + code, err := tx.GetOne(kv.Code, a.CodeHash[:]) + if err != nil { + return err + } + if len(code) != 0 { + n = binary.PutUvarint(numBuf, uint64(len(k))) + if _, err = wc.Write(numBuf[:n]); err != nil { + return err + } + if _, err = wc.Write(k); err != nil { + return err + } + n = binary.PutUvarint(numBuf, uint64(len(code))) + if _, err = wc.Write(numBuf[:n]); err != nil { + return err + } + if len(code) > 0 { + if _, err = wc.Write(code); err != nil { + return err + } + } + i += 2 + if i%10_000_000 == 0 { + log.Info("Written into file", "millions", i/1_000_000) + } + } + } + copy(addr[:], k) + i += 2 + if i%10_000_000 == 0 { + log.Info("Written into file", "millions", i/1_000_000) } } + if len(k) == 60 { + inc := binary.BigEndian.Uint64(k[20:]) + if bytes.Equal(k[:20], addr[:]) && inc == a.Incarnation { + copy(ks[:], k[:20]) + copy(ks[20:], k[20+8:]) + n := binary.PutUvarint(numBuf, uint64(len(ks))) + if _, err = ws.Write(numBuf[:n]); err != nil { + return err + } + if _, err = ws.Write(ks[:]); err != nil { + return err + } + n = binary.PutUvarint(numBuf, uint64(len(v))) + if _, err = ws.Write(numBuf[:n]); err != nil { + return err + } + if len(v) > 0 { + if _, err = ws.Write(v); err != nil { + return err + } + } + i += 2 + if i%10_000_000 == 0 { + log.Info("Written into file", "millions", i/1_000_000) + } + } + } + } + if e != nil { return e + } + return nil +} + +func mphf(chaindata string, block int) error { + // Create a file to compress if it does not exist already + statefile := "statedump.dat" + if _, err := os.Stat(statefile); err != nil { + if !os.IsNotExist(err) { + return fmt.Errorf("not sure if statedump.dat exists: %w", err) + } + if err = dumpState(chaindata, int(block), "statefile"); err != nil { + return err + } + } + var rs *recsplit.RecSplit + f, err := os.Open(statefile) + if err != nil { + return err + } + r := bufio.NewReaderSize(f, etl.BufIOSize) + defer f.Close() + var countBuf [8]byte + if _, err = io.ReadFull(r, countBuf[:]); err != nil { + return err + } + count := binary.BigEndian.Uint64(countBuf[:]) + if rs, err = recsplit.NewRecSplit(recsplit.RecSplitArgs{ + KeyCount: int(count), + BucketSize: 2000, + Salt: 1, + LeafSize: 8, + TmpDir: "", + StartSeed: []uint64{0x106393c187cae21a, 0x6453cec3f7376937, 0x643e521ddbd2be98, 0x3740c6412f6572cb, 0x717d47562f1ce470, 0x4cd6eb4c63befb7c, 0x9bfd8c5e18c8da73, + 0x082f20e10092a9a3, 0x2ada2ce68d21defc, 0xe33cb4f3e7c6466b, 0x3980be458c509c59, 0xc466fd9584828e8c, 0x45f0aabe1a61ede6, 0xf6e7b8b33ad9b98d, + 0x4ef95e25f4b4983d, 0x81175195173b92d3, 0x4e50927d8dd15978, 0x1ea2099d1fafae7f, 0x425c8a06fbaaa815, 0xcd4216006c74052a}, + IndexFile: "state.idx", }); err != nil { return err } - fmt.Printf("stAccounts = %d, stStorage = %d\n", stAccounts, stStorage) + var buf [256]byte + l, e := r.ReadByte() + i := 0 + for ; e == nil; l, e = r.ReadByte() { + if _, e = io.ReadFull(r, buf[:l]); e != nil { + return e + } + if i%2 == 0 { + // It is key, we skip the values here + if err := rs.AddKey(buf[:l], uint64(i/2)); err != nil { + return err + } + } + i++ + if i == int(count*2) { + break + } + } + if e != nil && !errors.Is(e, io.EOF) { + return e + } + start := time.Now() + log.Info("Building recsplit...") + if err = rs.Build(); err != nil { + return err + } + s1, s2 := rs.Stats() + log.Info("Done", "time", time.Since(start), "s1", s1, "s2", s2) + idx := recsplit.MustOpen("state.idx") + defer idx.Close() + log.Info("Testing bijection") + bitCount := (count + 63) / 64 + bits := make([]uint64, bitCount) + if _, err = f.Seek(8, 0); err != nil { + return err + } + r = bufio.NewReaderSize(f, etl.BufIOSize) + l, e = r.ReadByte() + i = 0 + var lookupTime time.Duration + idxReader := recsplit.NewIndexReader(idx) + for ; e == nil; l, e = r.ReadByte() { + if _, e = io.ReadFull(r, buf[:l]); e != nil { + return e + } + if i%2 == 0 { + // It is key, we skip the values here + start := time.Now() + offset := idxReader.Lookup(buf[:l]) + lookupTime += time.Since(start) + if offset >= count { + return fmt.Errorf("idx %d >= count %d", offset, count) + } + mask := uint64(1) << (offset & 63) + if bits[offset>>6]&mask != 0 { + return fmt.Errorf("no bijection key idx=%d, lookup up idx = %d", i, offset) + } + bits[offset>>6] |= mask + } + i++ + if i == int(count*2) { + break + } + } + if e != nil && !errors.Is(e, io.EOF) { + return e + } + log.Info("Average lookup time", "per key", time.Duration(uint64(lookupTime)/count)) + return nil +} + +// genstate generates statedump.dat file for testing +func genstate() error { + f, err := os.Create("statedump.dat") + if err != nil { + return err + } + defer f.Close() + w := bufio.NewWriterSize(f, etl.BufIOSize) + defer w.Flush() + var count uint64 = 25 + var countBuf [8]byte + binary.BigEndian.PutUint64(countBuf[:], count) + if _, err = w.Write(countBuf[:]); err != nil { + return err + } + for i := 0; i < 5; i++ { + for j := 0; j < 5; j++ { + key := fmt.Sprintf("addr%dxlocation%d", i, j) + val := "value" + if err = w.WriteByte(byte(len(key))); err != nil { + return err + } + if _, err = w.Write([]byte(key)); err != nil { + return err + } + if err = w.WriteByte(byte(len(val))); err != nil { + return err + } + if _, err = w.Write([]byte(val)); err != nil { + return err + } + } + } return nil } +func compress1(fileName, segmentFileName string) error { + compressor, err := compress.NewCompressor(context.Background(), "", segmentFileName, "", compress.MinPatternScore, runtime.GOMAXPROCS(-1), log.LvlDebug) + if err != nil { + return err + } + defer compressor.Close() + if err := compress.ReadSimpleFile(fileName, func(v []byte) error { + return compressor.AddWord(v) + }); err != nil { + return err + } + return compressor.Compress() +} +func decompress(name string) error { + return parallelcompress.Decompress("hack", name+".seg", name+".decompressed.dat") +} + func changeSetStats(chaindata string, block1, block2 uint64) error { db := mdbx.MustOpen(chaindata) defer db.Close() @@ -1234,29 +1486,23 @@ func changeSetStats(chaindata string, block1, block2 uint64) error { return err1 } defer tx.Rollback() - if err := changeset.Walk(tx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(block1), 0, func(blockN uint64, k, v []byte) (bool, error) { - if blockN >= block2 { - return false, nil - } + if err := changeset.ForRange(tx, kv.AccountChangeSet, block1, block2, func(blockN uint64, k, v []byte) error { if (blockN-block1)%100000 == 0 { fmt.Printf("at the block %d for accounts, booster size: %d\n", blockN, len(accounts)) } accounts[string(common.CopyBytes(k))] = struct{}{} - return true, nil + return nil }); err != nil { return err } storage := make(map[string]struct{}) - if err := changeset.Walk(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(block1), 0, func(blockN uint64, k, v []byte) (bool, error) { - if blockN >= block2 { - return false, nil - } + if err := changeset.ForRange(tx, kv.StorageChangeSet, block1, block2, func(blockN uint64, k, v []byte) error { if (blockN-block1)%100000 == 0 { fmt.Printf("at the block %d for accounts, booster size: %d\n", blockN, len(accounts)) } storage[string(common.CopyBytes(k))] = struct{}{} - return true, nil + return nil }); err != nil { return err } @@ -1275,11 +1521,11 @@ func searchChangeSet(chaindata string, key []byte, block uint64) error { } defer tx.Rollback() - if err := changeset.Walk(tx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(block), 0, func(blockN uint64, k, v []byte) (bool, error) { + if err := changeset.ForEach(tx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(block), func(blockN uint64, k, v []byte) error { if bytes.Equal(k, key) { fmt.Printf("Found in block %d with value %x\n", blockN, v) } - return true, nil + return nil }); err != nil { return err } @@ -1295,11 +1541,11 @@ func searchStorageChangeSet(chaindata string, key []byte, block uint64) error { return err1 } defer tx.Rollback() - if err := changeset.Walk(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(block), 0, func(blockN uint64, k, v []byte) (bool, error) { + if err := changeset.ForEach(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(block), func(blockN uint64, k, v []byte) error { if bytes.Equal(k, key) { fmt.Printf("Found in block %d with value %x\n", blockN, v) } - return true, nil + return nil }); err != nil { return err } @@ -1371,43 +1617,32 @@ func extractCode(chaindata string) error { func iterateOverCode(chaindata string) error { db := mdbx.MustOpen(chaindata) defer db.Close() - var contractCount int - var contractKeyTotalLength int - var contractValTotalLength int - var codeHashTotalLength int - var codeTotalLength int // Total length of all byte code (just to illustrate iterating) + hashes := make(map[common.Hash][]byte) if err1 := db.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(kv.PlainContractCode) - if err != nil { + // This is a mapping of CodeHash => Byte code + if err := tx.ForEach(kv.Code, nil, func(k, v []byte) error { + if len(v) > 0 && v[0] == 0xef { + fmt.Printf("Found code with hash %x: %x\n", k, v) + hashes[common.BytesToHash(k)] = common.CopyBytes(v) + } + return nil + }); err != nil { return err } // This is a mapping of contractAddress + incarnation => CodeHash - for k, v, err := c.First(); k != nil; k, v, err = c.Next() { - if err != nil { - return err + if err := tx.ForEach(kv.PlainContractCode, nil, func(k, v []byte) error { + hash := common.BytesToHash(v) + if code, ok := hashes[hash]; ok { + fmt.Printf("address: %x: %x\n", k[:20], code) } - contractKeyTotalLength += len(k) - contractValTotalLength += len(v) - } - c, err = tx.Cursor(kv.Code) - if err != nil { + return nil + }); err != nil { return err } - // This is a mapping of CodeHash => Byte code - for k, v, err := c.First(); k != nil; k, v, err = c.Next() { - if err != nil { - return err - } - codeHashTotalLength += len(k) - codeTotalLength += len(v) - contractCount++ - } return nil }); err1 != nil { return err1 } - fmt.Printf("contractCount: %d,contractKeyTotalLength: %d, contractValTotalLength: %d, codeHashTotalLength: %d, codeTotalLength: %d\n", - contractCount, contractKeyTotalLength, contractValTotalLength, codeHashTotalLength, codeTotalLength) return nil } @@ -1468,7 +1703,7 @@ func mint(chaindata string, block uint64) error { fmt.Printf("Gap [%d-%d]\n", prevBlock, blockNumber-1) } prevBlock = blockNumber - body := rawdb.ReadBody(tx, blockHash, blockNumber) + body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blockNumber) header := rawdb.ReadHeader(tx, blockHash, blockNumber) senders, errSenders := rawdb.ReadSenders(tx, blockHash, blockNumber) if errSenders != nil { @@ -1502,7 +1737,21 @@ func mint(chaindata string, block uint64) error { return tx.Commit() } -func extractHashes(chaindata string, blockStep uint64, blockTotal uint64, name string) error { +func getBlockTotal(tx kv.Tx, blockFrom uint64, blockTotalOrOffset int64) uint64 { + if blockTotalOrOffset > 0 { + return uint64(blockTotalOrOffset) + } + if head := getCurrentBlockNumber(tx); head != nil { + if blockSub := uint64(-blockTotalOrOffset); blockSub <= *head { + if blockEnd := *head - blockSub; blockEnd > blockFrom { + return blockEnd - blockFrom + 1 + } + } + } + return 1 +} + +func extractHashes(chaindata string, blockStep uint64, blockTotalOrOffset int64, name string) error { db := mdbx.MustOpen(chaindata) defer db.Close() @@ -1520,6 +1769,8 @@ func extractHashes(chaindata string, blockStep uint64, blockTotal uint64, name s b := uint64(0) tool.Check(db.View(context.Background(), func(tx kv.Tx) error { + blockTotal := getBlockTotal(tx, b, blockTotalOrOffset) + // Note: blockTotal used here as block number rather than block count for b <= blockTotal { hash, err := rawdb.ReadCanonicalHash(tx, b) if err != nil { @@ -1543,7 +1794,7 @@ func extractHashes(chaindata string, blockStep uint64, blockTotal uint64, name s return nil } -func extractHeaders(chaindata string, block uint64) error { +func extractHeaders(chaindata string, block uint64, blockTotalOrOffset int64) error { db := mdbx.MustOpen(chaindata) defer db.Close() tx, err := db.BeginRo(context.Background()) @@ -1557,7 +1808,8 @@ func extractHeaders(chaindata string, block uint64) error { } defer c.Close() blockEncoded := dbutils.EncodeBlockNumber(block) - for k, v, err := c.Seek(blockEncoded); k != nil; k, v, err = c.Next() { + blockTotal := getBlockTotal(tx, block, blockTotalOrOffset) + for k, v, err := c.Seek(blockEncoded); k != nil && blockTotal > 0; k, v, err = c.Next() { if err != nil { return err } @@ -1565,9 +1817,10 @@ func extractHeaders(chaindata string, block uint64) error { blockHash := common.BytesToHash(k[8:]) var header types.Header if err = rlp.DecodeBytes(v, &header); err != nil { - return fmt.Errorf("decoding header from %x: %v", v, err) + return fmt.Errorf("decoding header from %x: %w", v, err) } fmt.Printf("Header %d %x: stateRoot %x, parentHash %x, diff %d\n", blockNumber, blockHash, header.Root, header.ParentHash, header.Difficulty) + blockTotal-- } return nil } @@ -1586,14 +1839,19 @@ func extractBodies(chaindata string, block uint64) error { } defer c.Close() blockEncoded := dbutils.EncodeBlockNumber(block) + i := 0 for k, _, err := c.Seek(blockEncoded); k != nil; k, _, err = c.Next() { if err != nil { return err } blockNumber := binary.BigEndian.Uint64(k[:8]) blockHash := common.BytesToHash(k[8:]) - _, baseTxId, txAmount := rawdb.ReadBodyWithoutTransactions(tx, blockHash, blockNumber) + _, baseTxId, txAmount := rawdb.ReadBody(tx, blockHash, blockNumber) fmt.Printf("Body %d %x: baseTxId %d, txAmount %d\n", blockNumber, blockHash, baseTxId, txAmount) + i++ + if i == 1 { + break + } } return nil } @@ -1658,7 +1916,7 @@ func snapSizes(chaindata string) error { lens[i] = l i++ } - sort.Ints(lens) + slices.Sort(lens) for _, l := range lens { fmt.Printf("%6d - %d\n", l, sizes[l]) @@ -1701,7 +1959,7 @@ func readCallTraces(chaindata string, block uint64) error { if err2 != nil { return err2 } - var acc common.Address = common.HexToAddress("0x511bc4556d823ae99630ae8de28b9b80df90ea2e") + var acc = common.HexToAddress("0x511bc4556d823ae99630ae8de28b9b80df90ea2e") for k, v, err = idxCursor.Seek(acc[:]); k != nil && err == nil && bytes.HasPrefix(k, acc[:]); k, v, err = idxCursor.Next() { bm := roaring64.New() _, err = bm.ReadFrom(bytes.NewReader(v)) @@ -1739,7 +1997,7 @@ func fixTd(chaindata string) error { fmt.Printf("Missing TD record for %x, fixing\n", k) var header types.Header if err = rlp.DecodeBytes(v, &header); err != nil { - return fmt.Errorf("decoding header from %x: %v", v, err) + return fmt.Errorf("decoding header from %x: %w", v, err) } if header.Number.Uint64() == 0 { continue @@ -1749,17 +2007,17 @@ func fixTd(chaindata string) error { copy(parentK[8:], header.ParentHash[:]) var parentTdRec []byte if parentTdRec, err = tx.GetOne(kv.HeaderTD, parentK[:]); err != nil { - return fmt.Errorf("reading parentTd Rec for %d: %v", header.Number.Uint64(), err) + return fmt.Errorf("reading parentTd Rec for %d: %w", header.Number.Uint64(), err) } var parentTd big.Int if err = rlp.DecodeBytes(parentTdRec, &parentTd); err != nil { - return fmt.Errorf("decoding parent Td record for block %d, from %x: %v", header.Number.Uint64(), parentTdRec, err) + return fmt.Errorf("decoding parent Td record for block %d, from %x: %w", header.Number.Uint64(), parentTdRec, err) } var td big.Int td.Add(&parentTd, header.Difficulty) var newHv []byte if newHv, err = rlp.EncodeToBytes(&td); err != nil { - return fmt.Errorf("encoding td record for block %d: %v", header.Number.Uint64(), err) + return fmt.Errorf("encoding td record for block %d: %w", header.Number.Uint64(), err) } if err = tx.Put(kv.HeaderTD, k, newHv); err != nil { return err @@ -1856,7 +2114,7 @@ func fixState(chaindata string) error { } var header types.Header if err = rlp.DecodeBytes(hv, &header); err != nil { - return fmt.Errorf("decoding header from %x: %v", v, err) + return fmt.Errorf("decoding header from %x: %w", v, err) } if header.Number.Uint64() > 1 { var parentK [40]byte @@ -2006,9 +2264,9 @@ func scanTxs(chaindata string) error { } func scanReceipts3(chaindata string, block uint64) error { - dbdb := mdbx.MustOpen(chaindata) - defer dbdb.Close() - tx, err := dbdb.BeginRw(context.Background()) + db := mdbx.MustOpen(chaindata) + defer db.Close() + tx, err := db.BeginRw(context.Background()) if err != nil { return err } @@ -2043,8 +2301,8 @@ func scanReceipts2(chaindata string) error { return err } fixedCount := 0 - logInterval := 30 * time.Second - logEvery := time.NewTicker(logInterval) + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() var key [8]byte var v []byte for ; true; blockNum++ { @@ -2088,201 +2346,323 @@ func scanReceipts2(chaindata string) error { return nil } -func scanReceipts(chaindata string, block uint64) error { - f, err := os.Create("fixed.txt") - if err != nil { - return err - } - defer f.Close() - w := bufio.NewWriter(f) - defer w.Flush() +func devTx(chaindata string) error { db := mdbx.MustOpen(chaindata) defer db.Close() - tx, err := db.BeginRw(context.Background()) + tx, err := db.BeginRo(context.Background()) if err != nil { return err } defer tx.Rollback() - blockNum, err := changeset.AvailableFrom(tx) + cc := tool.ChainConfig(tx) + txn := types.NewTransaction(2, common.Address{}, uint256.NewInt(100), 100_000, uint256.NewInt(1), []byte{1}) + signedTx, err := types.SignTx(txn, *types.LatestSigner(cc), core.DevnetSignPrivateKey) + tool.Check(err) + buf := bytes.NewBuffer(nil) + err = signedTx.MarshalBinary(buf) + tool.Check(err) + fmt.Printf("%x\n", buf.Bytes()) + return nil +} + +func mainnetGenesis() error { + g := core.DefaultGenesisBlock() + _, _, err := g.ToBlock() if err != nil { return err } - if block > blockNum { - blockNum = block + return nil +} + +func junkdb() error { + dir, err := os.MkdirTemp(".", "junk") + if err != nil { + return fmt.Errorf("creating temp dir for db size test: %w", err) + } + //defer os.RemoveAll(dir) + oneBucketCfg := make(kv.TableCfg) + oneBucketCfg["t"] = kv.TableCfgItem{} + var db kv.RwDB + db, err = mdbx.NewMDBX(log.New()).Path(dir).WithTablessCfg(func(kv.TableCfg) kv.TableCfg { + return oneBucketCfg + }).Open() + if err != nil { + return fmt.Errorf("opening database: %w", err) + } + defer db.Close() + for i := 0; i < 1_000_000; i++ { + if err = db.Update(context.Background(), func(tx kv.RwTx) error { + c, e := tx.RwCursor("t") + if e != nil { + return e + } + defer c.Close() + for j := 0; j < 1_000_000_000; j++ { + var b [8]byte + binary.BigEndian.PutUint64(b[:], uint64(i*1_000_000_000+j)) + if e = c.Append(b[:], b[:]); e != nil { + return e + } + } + return nil + }); err != nil { + return err + } + log.Info("Appended records", "bln", i+1) } + return nil +} - genesisBlock, err := rawdb.ReadBlockByNumber(tx, 0) +func histStats() error { + files, err := os.ReadDir(".") if err != nil { return err } - chainConfig, cerr := rawdb.ReadChainConfig(tx, genesisBlock.Hash()) - if cerr != nil { - return cerr - } - vmConfig := vm.Config{} - noOpWriter := state.NewNoopWriter() - var buf bytes.Buffer - fixedCount := 0 - logInterval := 30 * time.Second - logEvery := time.NewTicker(logInterval) - var key [8]byte - var v []byte - for ; true; blockNum++ { - select { - default: - case <-logEvery.C: - log.Info("Commit", "block", blockNum, "fixed", fixedCount) - tx.Commit() - if tx, err = db.BeginRw(context.Background()); err != nil { - return err + endBlockMap := map[uint64]struct{}{} + pageMap := map[string]map[uint64]uint64{} + keys := []string{"ahistory", "shistory", "abitmap", "sbitmap"} + for _, k := range keys { + pageMap[k] = map[uint64]uint64{} + } + re := regexp.MustCompile(`(ahistory|shistory|abitmap|sbitmap).([0-9]+).txt`) + for _, f := range files { + name := f.Name() + subs := re.FindStringSubmatch(name) + if len(subs) != 3 { + if len(subs) != 0 { + log.Warn("File ignored by changes scan, more than 3 submatches", "name", name, "submatches", len(subs)) } + continue } - var hash common.Hash - if hash, err = rawdb.ReadCanonicalHash(tx, blockNum); err != nil { + var endBlock uint64 + if endBlock, err = strconv.ParseUint(subs[2], 10, 64); err != nil { return err } - if hash == (common.Hash{}) { - break - } - binary.BigEndian.PutUint64(key[:], blockNum) - if v, err = tx.GetOne(kv.Receipts, key[:]); err != nil { + endBlockMap[endBlock] = struct{}{} + var ff *os.File + if ff, err = os.Open(name); err != nil { return err } - var receipts types.Receipts - if err = cbor.Unmarshal(&receipts, bytes.NewReader(v)); err == nil { - broken := false - for _, receipt := range receipts { - if receipt.CumulativeGasUsed < 10000 { - broken = true - break - } - } - if !broken { - continue - } - } else { - // Receipt is using old CBOR encoding - var oldReceipts migrations.OldReceipts - if err = cbor.Unmarshal(&oldReceipts, bytes.NewReader(v)); err != nil { + scanner := bufio.NewScanner(ff) + // Skip 5 lines + for i := 0; i < 5; i++ { + scanner.Scan() + } + var totalPages uint64 + for i := 0; i < 3; i++ { + scanner.Scan() + line := scanner.Text() + p := strings.Index(line, ": ") + var pages uint64 + if pages, err = strconv.ParseUint(line[p+2:], 10, 64); err != nil { return err } - var body *types.Body - if chainConfig.IsBerlin(blockNum) { - body = rawdb.ReadBody(tx, hash, blockNum) - } - receipts = make(types.Receipts, len(oldReceipts)) - for i, oldReceipt := range oldReceipts { - receipts[i] = new(types.Receipt) - receipts[i].PostState = oldReceipt.PostState - receipts[i].Status = oldReceipt.Status - receipts[i].CumulativeGasUsed = oldReceipt.CumulativeGasUsed - if body != nil { - receipts[i].Type = body.Transactions[i].Type() - } - } - buf.Reset() - if err = cbor.Marshal(&buf, receipts); err != nil { - return err + totalPages += pages + } + pageMap[subs[1]][endBlock] = totalPages + ff.Close() + } + var endBlocks []uint64 + for endBlock := range endBlockMap { + endBlocks = append(endBlocks, endBlock) + } + slices.Sort(endBlocks) + var lastEndBlock uint64 + fmt.Printf("endBlock,%s\n", strings.Join(keys, ",")) + for _, endBlock := range endBlocks { + fmt.Printf("%d", endBlock) + for _, k := range keys { + if lastEndBlock == 0 { + fmt.Printf(",%.3f", float64(pageMap[k][endBlock])/256.0/1024.0) + } else { + fmt.Printf(",%.3f", float64(pageMap[k][endBlock]-pageMap[k][lastEndBlock])/256.0/1024.0) } - if err = tx.Put(kv.Receipts, common.CopyBytes(key[:]), common.CopyBytes(buf.Bytes())); err != nil { - return err + } + fmt.Printf("\n") + lastEndBlock = endBlock + } + return nil +} + +func histStat1(chaindata string) error { + files, err := os.ReadDir(chaindata) + if err != nil { + return err + } + endBlockMap := map[uint64]struct{}{} + sizeMap := map[string]map[uint64]uint64{} + keys := []string{"ahistory", "shistory", "chistory", "abitmap", "sbitmap", "cbitmap"} + for _, k := range keys { + sizeMap[k] = map[uint64]uint64{} + } + re := regexp.MustCompile(fmt.Sprintf("(%s).([0-9]+)-([0-9]+).(dat|idx)", strings.Join(keys, "|"))) + for _, f := range files { + name := f.Name() + subs := re.FindStringSubmatch(name) + if len(subs) != 5 { + if len(subs) != 0 { + log.Warn("File ignored by changes scan, more than 5 submatches", "name", name, "submatches", len(subs)) } - fixedCount++ continue } - var block *types.Block - if block, _, err = rawdb.ReadBlockWithSenders(tx, hash, blockNum); err != nil { + var startBlock uint64 + if startBlock, err = strconv.ParseUint(subs[2], 10, 64); err != nil { return err } - - dbstate := state.NewPlainState(tx, block.NumberU64()-1) - intraBlockState := state.New(dbstate) - - getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } - receipts1, err1 := runBlock(intraBlockState, noOpWriter, noOpWriter, chainConfig, getHeader, nil /* checkTEVM */, block, vmConfig) - if err1 != nil { - return err1 + var endBlock uint64 + if endBlock, err = strconv.ParseUint(subs[3], 10, 64); err != nil { + return err } - fix := true - if chainConfig.IsByzantium(blockNum) { - receiptSha := types.DeriveSha(receipts1) - if receiptSha != block.Header().ReceiptHash { - fmt.Printf("(retrace) mismatched receipt headers for block %d: %x, %x\n", block.NumberU64(), receiptSha, block.Header().ReceiptHash) - fix = false - } + if endBlock-startBlock < 499_999 { + continue } - if fix { - // All good, we can fix receipt record - buf.Reset() - err := cbor.Marshal(&buf, receipts1) - if err != nil { - return fmt.Errorf("encode block receipts for block %d: %v", blockNum, err) - } - if err = tx.Put(kv.Receipts, key[:], buf.Bytes()); err != nil { - return fmt.Errorf("writing receipts for block %d: %v", blockNum, err) - } - if _, err = w.Write([]byte(fmt.Sprintf("%d\n", blockNum))); err != nil { - return err - } - fixedCount++ + endBlockMap[endBlock] = struct{}{} + if fileInfo, err1 := os.Stat(filepath.Join(chaindata, name)); err1 == nil { + sizeMap[subs[1]][endBlock] += uint64(fileInfo.Size()) + } else { + return err1 } } - return tx.Commit() + var endBlocks []uint64 + for endBlock := range endBlockMap { + endBlocks = append(endBlocks, endBlock) + } + slices.Sort(endBlocks) + fmt.Printf("endBlock,%s\n", strings.Join(keys, ",")) + for _, endBlock := range endBlocks { + fmt.Printf("%d", endBlock) + for _, k := range keys { + fmt.Printf(",%.3f", float64(sizeMap[k][endBlock])/1024.0/1024.0/1024.0) + } + fmt.Printf("\n") + } + return nil } -func runBlock(ibs *state.IntraBlockState, txnWriter state.StateWriter, blockWriter state.StateWriter, - chainConfig *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), block *types.Block, vmConfig vm.Config) (types.Receipts, error) { - header := block.Header() - vmConfig.TraceJumpDest = true - engine := ethash.NewFullFaker() - gp := new(core.GasPool).AddGas(block.GasLimit()) - usedGas := new(uint64) - var receipts types.Receipts - if chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 { - misc.ApplyDAOHardFork(ibs) - } - rules := chainConfig.Rules(block.NumberU64()) - for i, tx := range block.Transactions() { - ibs.Prepare(tx.Hash(), block.Hash(), i) - receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, txnWriter, header, tx, usedGas, vmConfig, checkTEVM) - if err != nil { - return nil, fmt.Errorf("could not apply tx %d [%x] failed: %v", i, tx.Hash(), err) - } - receipts = append(receipts, receipt) - //fmt.Printf("%d, cumulative gas: %d\n", i, receipt.CumulativeGasUsed) +func chainConfig(name string) error { + var chainConfig *params.ChainConfig + switch name { + case "mainnet": + chainConfig = params.MainnetChainConfig + case "ropsten": + chainConfig = params.RopstenChainConfig + case "sepolia": + chainConfig = params.SepoliaChainConfig + case "rinkeby": + chainConfig = params.RinkebyChainConfig + case "goerli": + chainConfig = params.GoerliChainConfig + case "kiln-devnet": + chainConfig = params.KilnDevnetChainConfig + case "bsc": + chainConfig = params.BSCChainConfig + case "sokol": + chainConfig = params.SokolChainConfig + case "chapel": + chainConfig = params.ChapelChainConfig + case "rialto": + chainConfig = params.RialtoChainConfig + case "fermion": + chainConfig = params.FermionChainConfig + case "mumbai": + chainConfig = params.MumbaiChainConfig + case "bor-mainnet": + chainConfig = params.BorMainnetChainConfig + default: + return fmt.Errorf("unknown name: %s", name) + } + f, err := os.Create(filepath.Join("params", "chainspecs", fmt.Sprintf("%s.json", name))) + if err != nil { + return err } + w := bufio.NewWriter(f) + encoder := json.NewEncoder(w) + encoder.SetIndent("", " ") + if err = encoder.Encode(chainConfig); err != nil { + return err + } + if err = w.Flush(); err != nil { + return err + } + if err = f.Close(); err != nil { + return err + } + return nil +} - if !vmConfig.ReadOnly { - // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) - if _, err := engine.FinalizeAndAssemble(chainConfig, header, ibs, block.Transactions(), block.Uncles(), receipts, nil, nil, nil, nil); err != nil { - return nil, fmt.Errorf("finalize of block %d failed: %v", block.NumberU64(), err) - } +func keybytesToHex(str []byte) []byte { + l := len(str)*2 + 1 + var nibbles = make([]byte, l) + for i, b := range str { + nibbles[i*2] = b / 16 + nibbles[i*2+1] = b % 16 + } + nibbles[l-1] = 16 + return nibbles +} - if err := ibs.CommitBlock(rules, blockWriter); err != nil { - return nil, fmt.Errorf("committing block %d failed: %v", block.NumberU64(), err) - } +func findPrefix(chaindata string) error { + db := mdbx.MustOpen(chaindata) + defer db.Close() + + tx, txErr := db.BeginRo(context.Background()) + if txErr != nil { + return txErr } + defer tx.Rollback() - return receipts, nil + c, err := tx.Cursor(kv.PlainState) + if err != nil { + return err + } + defer c.Close() + var k []byte + var e error + prefix := common.FromHex("0x0901050b0c03") + count := 0 + for k, _, e = c.First(); k != nil && e == nil; k, _, e = c.Next() { + if len(k) != 20 { + continue + } + hash := crypto.Keccak256(k) + nibbles := keybytesToHex(hash) + if bytes.HasPrefix(nibbles, prefix) { + fmt.Printf("addr = [%x], hash = [%x]\n", k, hash) + break + } + count++ + if count%1_000_000 == 0 { + fmt.Printf("Searched %d records\n", count) + } + } + if e != nil { + return e + } + return nil } func main() { + debug.RaiseFdLimit() flag.Parse() - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*verbosity), log.StderrHandler)) if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { - log.Error("could not create CPU profile", "error", err) + log.Error("could not create CPU profile", "err", err) return } if err := pprof.StartCPUProfile(f); err != nil { - log.Error("could not start CPU profile", "error", err) + log.Error("could not start CPU profile", "err", err) return } defer pprof.StopCPUProfile() } + go func() { + if err := http.ListenAndServe("localhost:6060", nil); err != nil { + log.Error("Failure in running pprof server", "err", err) + } + }() var err error switch *action { @@ -2321,9 +2701,6 @@ func main() { case "val-tx-lookup-2": ValidateTxLookups2(*chaindata) - case "modiAccounts": - getModifiedAccounts(*chaindata) - case "slice": dbSlice(*chaindata, *bucket, common.FromHex(*hash)) @@ -2355,10 +2732,10 @@ func main() { err = mint(*chaindata, uint64(*block)) case "extractHeaders": - err = extractHeaders(*chaindata, uint64(*block)) + err = extractHeaders(*chaindata, uint64(*block), int64(*blockTotal)) case "extractHashes": - err = extractHashes(*chaindata, uint64(*block), uint64(*blockTotal), *name) + err = extractHashes(*chaindata, uint64(*block), int64(*blockTotal), *name) case "defrag": err = hackdb.Defrag() @@ -2388,13 +2765,13 @@ func main() { trieChart() case "printTxHashes": - printTxHashes() + printTxHashes(*chaindata, uint64(*block)) case "snapSizes": err = snapSizes(*chaindata) - case "dumpState": - err = dumpState(*chaindata) + case "mphf": + err = mphf(*chaindata, *block) case "readCallTraces": err = readCallTraces(*chaindata, uint64(*block)) @@ -2417,14 +2794,34 @@ func main() { case "scanTxs": err = scanTxs(*chaindata) - case "scanReceipts": - err = scanReceipts(*chaindata, uint64(*block)) - case "scanReceipts2": err = scanReceipts2(*chaindata) case "scanReceipts3": err = scanReceipts3(*chaindata, uint64(*block)) + + case "devTx": + err = devTx(*chaindata) + case "dumpState": + err = dumpState(*chaindata, int(*block), *name) + case "compress": + err = compress1(*name, *name) + case "decompress": + err = decompress(*name) + case "genstate": + err = genstate() + case "mainnetGenesis": + err = mainnetGenesis() + case "junkdb": + err = junkdb() + case "histStats": + err = histStats() + case "histStat1": + err = histStat1(*chaindata) + case "chainConfig": + err = chainConfig(*name) + case "findPrefix": + err = findPrefix(*chaindata) } if err != nil { diff --git a/cmd/hack/tool/tool.go b/cmd/hack/tool/tool.go index 59cbb1b3d6c..efd808414f4 100644 --- a/cmd/hack/tool/tool.go +++ b/cmd/hack/tool/tool.go @@ -1,6 +1,13 @@ package tool -import "strconv" +import ( + "context" + "strconv" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/params" +) func Check(e error) { if e != nil { @@ -12,3 +19,20 @@ func ParseFloat64(str string) float64 { v, _ := strconv.ParseFloat(str, 64) return v } + +func ChainConfig(tx kv.Tx) *params.ChainConfig { + genesisBlock, err := rawdb.ReadBlockByNumber(tx, 0) + Check(err) + chainConfig, err := rawdb.ReadChainConfig(tx, genesisBlock.Hash()) + Check(err) + return chainConfig +} + +func ChainConfigFromDB(db kv.RoDB) (cc *params.ChainConfig) { + err := db.View(context.Background(), func(tx kv.Tx) error { + cc = ChainConfig(tx) + return nil + }) + Check(err) + return cc +} diff --git a/cmd/integration/commands/flags.go b/cmd/integration/commands/flags.go index f01750ddd08..06ebb91fc74 100644 --- a/cmd/integration/commands/flags.go +++ b/cmd/integration/commands/flags.go @@ -11,7 +11,6 @@ import ( var ( chaindata string databaseVerbosity int - snapshotMode, snapshotDir string referenceChaindata string block, pruneTo, unwind uint64 unwindEvery uint64 @@ -22,11 +21,15 @@ var ( migration string integrityFast, integritySlow bool file string + HeimdallURL string txtrace bool // Whether to trace the execution (should only be used together eith `block`) pruneFlag string pruneH, pruneR, pruneT, pruneC uint64 + pruneHBefore, pruneRBefore uint64 + pruneTBefore, pruneCBefore uint64 experiments []string chain string // Which chain to use (mainnet, ropsten, rinkeby, goerli, etc.) + snapshotsBool bool ) func must(err error) { @@ -38,8 +41,7 @@ func must(err error) { func withMining(cmd *cobra.Command) { cmd.Flags().Bool("mine", false, "Enable mining") cmd.Flags().StringArray("miner.notify", nil, "Comma separated HTTP URL list to notify of new work packages") - cmd.Flags().Uint64("miner.gastarget", ethconfig.Defaults.Miner.GasFloor, "Target gas floor for mined blocks") - cmd.Flags().Uint64("miner.gaslimit", ethconfig.Defaults.Miner.GasCeil, "Target gas ceiling for mined blocks") + cmd.Flags().Uint64("miner.gaslimit", ethconfig.Defaults.Miner.GasLimit, "Target gas limit for mined blocks") cmd.Flags().Int64("miner.gasprice", ethconfig.Defaults.Miner.GasPrice.Int64(), "Target gas price for mined blocks") cmd.Flags().String("miner.etherbase", "0", "Public address for block mining rewards (default = first account") cmd.Flags().String("miner.extradata", "", "Block extra data set by the miner (default = client version)") @@ -87,25 +89,23 @@ func withBucket(cmd *cobra.Command) { cmd.Flags().StringVar(&bucket, "bucket", "", "reset given stage") } -func withDatadir2(cmd *cobra.Command) { - cmd.Flags().String(utils.DataDirFlag.Name, paths.DefaultDataDir(), utils.DataDirFlag.Usage) +func withDataDir2(cmd *cobra.Command) { + cmd.Flags().StringVar(&datadir, utils.DataDirFlag.Name, paths.DefaultDataDir(), utils.DataDirFlag.Usage) must(cmd.MarkFlagDirname(utils.DataDirFlag.Name)) must(cmd.MarkFlagRequired(utils.DataDirFlag.Name)) cmd.Flags().IntVar(&databaseVerbosity, "database.verbosity", 2, "Enabling internal db logs. Very high verbosity levels may require recompile db. Default: 2, means warning.") + cmd.Flags().BoolVar(&snapshotsBool, "snapshots", true, utils.SnapshotFlag.Usage) } -func withDatadir(cmd *cobra.Command) { +func withDataDir(cmd *cobra.Command) { cmd.Flags().StringVar(&datadir, "datadir", paths.DefaultDataDir(), "data directory for temporary ELT files") must(cmd.MarkFlagDirname("datadir")) cmd.Flags().StringVar(&chaindata, "chaindata", "", "path to the db") must(cmd.MarkFlagDirname("chaindata")) - cmd.Flags().StringVar(&snapshotMode, "snapshot.mode", "", "set of snapshots to use") - cmd.Flags().StringVar(&snapshotDir, "snapshot.dir", "", "snapshot dir") - must(cmd.MarkFlagDirname("snapshot.dir")) - cmd.Flags().IntVar(&databaseVerbosity, "database.verbosity", 2, "Enabling internal db logs. Very high verbosity levels may require recompile db. Default: 2, means warning") + cmd.Flags().BoolVar(&snapshotsBool, "snapshots", true, utils.SnapshotFlag.Usage) } func withBatchSize(cmd *cobra.Command) { @@ -113,7 +113,7 @@ func withBatchSize(cmd *cobra.Command) { } func withIntegrityChecks(cmd *cobra.Command) { - cmd.Flags().BoolVar(&integritySlow, "integrity.slow", true, "enable slow data-integrity checks") + cmd.Flags().BoolVar(&integritySlow, "integrity.slow", false, "enable slow data-integrity checks") cmd.Flags().BoolVar(&integrityFast, "integrity.fast", true, "enable fast data-integrity checks") } @@ -128,3 +128,7 @@ func withTxTrace(cmd *cobra.Command) { func withChain(cmd *cobra.Command) { cmd.Flags().StringVar(&chain, "chain", "", "pick a chain to assume (mainnet, ropsten, etc.)") } + +func withHeimdall(cmd *cobra.Command) { + cmd.Flags().StringVar(&HeimdallURL, "bor.heimdall", "http://localhost:1317", "URL of Heimdall service") +} diff --git a/cmd/integration/commands/refetence_db.go b/cmd/integration/commands/refetence_db.go index 3889d407bf6..f58fca9fd00 100644 --- a/cmd/integration/commands/refetence_db.go +++ b/cmd/integration/commands/refetence_db.go @@ -9,9 +9,9 @@ import ( "strings" "time" + common2 "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" mdbx2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" @@ -40,7 +40,7 @@ var cmdCompareBucket = &cobra.Command{ Use: "compare_bucket", Short: "compare bucket to the same bucket in '--chaindata.reference'", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() if referenceChaindata == "" { referenceChaindata = chaindata + "-copy" } @@ -57,7 +57,7 @@ var cmdCompareStates = &cobra.Command{ Use: "compare_states", Short: "compare state buckets to buckets in '--chaindata.reference'", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() if referenceChaindata == "" { referenceChaindata = chaindata + "-copy" } @@ -74,7 +74,7 @@ var cmdMdbxToMdbx = &cobra.Command{ Use: "mdbx_to_mdbx", Short: "copy data from '--chaindata' to '--chaindata.to'", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() err := mdbxToMdbx(ctx, logger, chaindata, toChaindata) if err != nil { @@ -89,7 +89,7 @@ var cmdFToMdbx = &cobra.Command{ Use: "f_to_mdbx", Short: "copy data from '--chaindata' to '--chaindata.to'", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() err := fToMdbx(ctx, logger, toChaindata) if err != nil { @@ -101,19 +101,19 @@ var cmdFToMdbx = &cobra.Command{ } func init() { - withDatadir(cmdCompareBucket) + withDataDir(cmdCompareBucket) withReferenceChaindata(cmdCompareBucket) withBucket(cmdCompareBucket) rootCmd.AddCommand(cmdCompareBucket) - withDatadir(cmdCompareStates) + withDataDir(cmdCompareStates) withReferenceChaindata(cmdCompareStates) withBucket(cmdCompareStates) rootCmd.AddCommand(cmdCompareStates) - withDatadir(cmdMdbxToMdbx) + withDataDir(cmdMdbxToMdbx) withToChaindata(cmdMdbxToMdbx) withBucket(cmdMdbxToMdbx) diff --git a/cmd/integration/commands/reset_state.go b/cmd/integration/commands/reset_state.go index 4308e4860d9..17e0cd727cc 100644 --- a/cmd/integration/commands/reset_state.go +++ b/cmd/integration/commands/reset_state.go @@ -2,13 +2,15 @@ package commands import ( "context" + "encoding/binary" "fmt" "os" "text/tabwriter" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb/prune" @@ -20,7 +22,7 @@ var cmdResetState = &cobra.Command{ Use: "reset_state", Short: "Reset StateStages (5,6,7,8,9,10) and buckets", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -36,7 +38,7 @@ var cmdResetState = &cobra.Command{ } func init() { - withDatadir(cmdResetState) + withDataDir(cmdResetState) withChain(cmdResetState) rootCmd.AddCommand(cmdResetState) @@ -65,14 +67,11 @@ func resetState(db kv.RwDB, logger log.Logger, ctx context.Context) error { if err := db.Update(ctx, resetTxLookup); err != nil { return err } - if err := db.Update(ctx, resetTxPool); err != nil { - return err - } if err := db.Update(ctx, resetFinish); err != nil { return err } - genesis, _ := byChain() + genesis, _ := byChain(chain) if err := db.Update(ctx, func(tx kv.RwTx) error { return resetExec(tx, genesis) }); err != nil { return err } @@ -141,6 +140,9 @@ func resetExec(tx kv.RwTx, g *core.Genesis) error { if err := tx.ClearBucket(kv.PendingEpoch); err != nil { return err } + if err := tx.ClearBucket(kv.BorReceipts); err != nil { + return err + } if err := stages.SaveStageProgress(tx, stages.Execution, 0); err != nil { return err } @@ -148,8 +150,7 @@ func resetExec(tx kv.RwTx, g *core.Genesis) error { return err } - _, _, err := core.OverrideGenesisBlock(tx, g) - if err != nil { + if _, _, err := g.WriteGenesisState(tx); err != nil { return err } return nil @@ -223,16 +224,6 @@ func resetTxLookup(tx kv.RwTx) error { return nil } -func resetTxPool(tx kv.RwTx) error { - if err := stages.SaveStageProgress(tx, stages.TxPool, 0); err != nil { - return err - } - if err := stages.SaveStagePruneProgress(tx, stages.TxPool, 0); err != nil { - return err - } - return nil -} - func resetFinish(tx kv.RwTx) error { if err := stages.SaveStageProgress(tx, stages.Finish, 0); err != nil { return err @@ -243,7 +234,7 @@ func resetFinish(tx kv.RwTx) error { return nil } -func printStages(db kv.Getter) error { +func printStages(db kv.Tx) error { var err error var progress uint64 w := new(tabwriter.Writer) @@ -267,5 +258,37 @@ func printStages(db kv.Getter) error { } fmt.Fprintf(w, "--\n") fmt.Fprintf(w, "prune distance: %s\n\n", pm.String()) + + s1, err := db.ReadSequence(kv.EthTx) + if err != nil { + return err + } + s2, err := db.ReadSequence(kv.NonCanonicalTxs) + if err != nil { + return err + } + fmt.Fprintf(w, "sequence: EthTx=%d, NonCanonicalTx=%d\n\n", s1, s2) + + { + firstNonGenesis, err := rawdb.SecondKey(db, kv.Headers) + if err != nil { + return err + } + if firstNonGenesis != nil { + fmt.Fprintf(w, "first header in db: %d\n", binary.BigEndian.Uint64(firstNonGenesis)) + } else { + fmt.Fprintf(w, "no headers in db\n") + } + firstNonGenesis, err = rawdb.SecondKey(db, kv.BlockBody) + if err != nil { + return err + } + if firstNonGenesis != nil { + fmt.Fprintf(w, "first body in db: %d\n\n", binary.BigEndian.Uint64(firstNonGenesis)) + } else { + fmt.Fprintf(w, "no bodies in db\n\n") + } + } + return nil } diff --git a/cmd/integration/commands/root.go b/cmd/integration/commands/root.go index df29f20282d..f9111257a0c 100644 --- a/cmd/integration/commands/root.go +++ b/cmd/integration/commands/root.go @@ -1,8 +1,9 @@ package commands import ( - "path" + "path/filepath" + "github.com/c2h5oh/datasize" "github.com/ledgerwatch/erigon-lib/kv" kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" "github.com/ledgerwatch/erigon/cmd/utils" @@ -20,10 +21,7 @@ var rootCmd = &cobra.Command{ panic(err) } if chaindata == "" { - chaindata = path.Join(datadir, "erigon", "chaindata") - } - if snapshotDir == "" { - snapshotDir = path.Join(datadir, "erigon", "snapshot") + chaindata = filepath.Join(datadir, "chaindata") } }, PersistentPostRun: func(cmd *cobra.Command, args []string) { @@ -60,6 +58,9 @@ func openDB(path string, logger log.Logger, applyMigrations bool) kv.RwDB { func openKV(label kv.Label, logger log.Logger, path string, exclusive bool) kv.RwDB { opts := kv2.NewMDBX(logger).Path(path).Label(label) + if label == kv.ChainDB { + opts = opts.MapSize(8 * datasize.TB) + } if exclusive { opts = opts.Exclusive() } diff --git a/cmd/integration/commands/snapshot_check.go b/cmd/integration/commands/snapshot_check.go deleted file mode 100644 index c817d3c7d40..00000000000 --- a/cmd/integration/commands/snapshot_check.go +++ /dev/null @@ -1,287 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "time" - - "github.com/c2h5oh/datasize" - "github.com/ledgerwatch/erigon-lib/kv" - kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/eth/stagedsync" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/ethdb/prune" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - withDatadir(cmdSnapshotCheck) - withBlock(cmdSnapshotCheck) - withBatchSize(cmdSnapshotCheck) - withChain(cmdSnapshotCheck) - cmdSnapshotCheck.Flags().StringVar(&tmpDBPath, "tmp_db", "", "path to temporary db(for debug)") -} - -var tmpDBPath string - -var cmdSnapshotCheck = &cobra.Command{ - Use: "snapshot_check", - Short: "check execution over state snapshot by block", - Example: "go run cmd/integration/main.go snapshot_check --block 11400000 --datadir /media/b00ris/nvme/backup/snapshotsync/ --snapshotDir /media/b00ris/nvme/snapshots/ --snapshotMode s --tmp_db /media/b00ris/nvme/tmp/debug", - RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() - logger := log.New() - //db to provide headers, blocks, senders ... - mainDB, err := kv2.Open(chaindata, logger, true) - if err != nil { - return err - } - mode, err := snapshotsync.SnapshotModeFromString(snapshotMode) - if err != nil { - panic(err) - } - - if !mode.State || len(snapshotDir) == 0 { - return fmt.Errorf("you need state snapshot for it") - } - - stateSnapshotPath := filepath.Join(snapshotDir, "state") - stateSnapshot := kv2.NewMDBX(logger).Path(stateSnapshotPath).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.PlainState: kv.ChaindataTablesCfg[kv.PlainState], - kv.PlainContractCode: kv.ChaindataTablesCfg[kv.PlainContractCode], - kv.Code: kv.ChaindataTablesCfg[kv.Code], - } - }).Readonly().MustOpen() - isNew := true - var path string - if len(tmpDBPath) > 0 { - isNew = false - path = tmpDBPath - } else { - path, err = ioutil.TempDir(os.TempDir(), "sndbg") - if err != nil { - return err - } - } - - defer func() { - if err == nil { - os.RemoveAll(path) - } else { - log.Info("Temp database", "path", path) - } - }() - tmpDb := kv2.NewMDBX(logger).Path(path).MustOpen() - db := snapshotdb.NewSnapshotKV(). - DB(tmpDb). - //broken - //SnapshotDB([]string{dbutils.Headers, dbutils.HeaderCanonical, dbutils.HeaderTD, dbutils.BlockBody, dbutils.Senders, dbutils.HeadBlockKey, dbutils.HeaderNumber}, mainDB.RwDB()). - //SnapshotDB([]string{dbutils.PlainState, dbutils.Code, dbutils.PlainContractCode}, stateSnapshot). - Open() - _ = mainDB - _ = stateSnapshot - - if isNew { - if err := db.Update(ctx, func(tx kv.RwTx) error { - return prune.SetIfNotExist(tx, prune.DefaultMode) - }); err != nil { - return err - } - } - if err := snapshotCheck(ctx, db, isNew, os.TempDir()); err != nil { - log.Error("snapshotCheck error", "err", err) - return err - } - return nil - }, -} - -func snapshotCheck(ctx context.Context, db kv.RwDB, isNew bool, tmpDir string) (err error) { - pm, engine, chainConfig, vmConfig, _, sync, _, _ := newSync(ctx, db, nil) - - var snapshotBlock uint64 = 11_000_000 - var lastBlockHeaderNumber, blockNum uint64 - if err := db.View(ctx, func(tx kv.Tx) error { - blockNum, err = stages.GetStageProgress(tx, stages.Execution) - if err != nil { - return err - } - - //snapshot or last executed block - if blockNum > snapshotBlock { - snapshotBlock = blockNum - } - - //get end of check - if block == 0 { - lastBlockHash := rawdb.ReadHeadBlockHash(tx) - lastBlockHeader, innerErr := rawdb.ReadHeaderByHash(tx, lastBlockHash) - if innerErr != nil { - return innerErr - } - lastBlockHeaderNumber = lastBlockHeader.Number.Uint64() - } else { - lastBlockHeaderNumber = block - } - - if lastBlockHeaderNumber <= snapshotBlock { - return fmt.Errorf("incorrect header number last block:%v, snapshotBlock: %v", lastBlockHeaderNumber, snapshotBlock) - } - return nil - }); err != nil { - return err - } - - if isNew { - log.Info("New tmp db. We need to promote hash state.") - if err := db.Update(ctx, func(tx kv.RwTx) error { - - tt := time.Now() - err = stagedsync.PromoteHashedStateCleanly("", tx, stagedsync.StageHashStateCfg(db, tmpDir), ctx.Done()) - log.Info("Promote took", "t", time.Since(tt)) - if err != nil { - return fmt.Errorf("promote state err: %w", err) - } - tt = time.Now() - err = tx.Commit() - if err != nil { - return fmt.Errorf("commit promote state err: %w", err) - } - log.Info("promote committed", "t", time.Since(tt)) - return nil - }); err != nil { - return err - } - } - - if isNew { - log.Info("Regenerate IH") - if err := db.Update(ctx, func(tx kv.RwTx) error { - hash, innerErr := rawdb.ReadCanonicalHash(tx, snapshotBlock) - if innerErr != nil { - return innerErr - } - - syncHeadHeader := rawdb.ReadHeader(tx, hash, snapshotBlock) - if syncHeadHeader == nil { - return fmt.Errorf("empty header for %v", snapshotBlock) - } - expectedRootHash := syncHeadHeader.Root - - tt := time.Now() - _, err = stagedsync.RegenerateIntermediateHashes("", tx, stagedsync.StageTrieCfg(db, true, true, tmpDir), expectedRootHash, ctx.Done()) - if err != nil { - return fmt.Errorf("regenerateIntermediateHashes err: %w", err) - } - log.Info("RegenerateIntermediateHashes took", "t", time.Since(tt)) - return nil - }); err != nil { - return err - } - } - - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - sync.DisableStages(stages.Headers, - stages.BlockHashes, - stages.Bodies, - stages.Senders, - stages.Translation, - stages.AccountHistoryIndex, - stages.StorageHistoryIndex, - stages.LogIndex, - stages.CallTraces, - stages.TxLookup, - stages.TxPool, - stages.Finish, - ) - - if isNew { - stage3 := stage(sync, tx, nil, stages.Senders) - err = stage3.Update(tx, lastBlockHeaderNumber) - if err != nil { - return err - } - - stage4 := stage(sync, tx, nil, stages.Execution) - err = stage4.Update(tx, snapshotBlock) - if err != nil { - return err - } - stage5 := stage(sync, tx, nil, stages.HashState) - err = stage5.Update(tx, snapshotBlock) - if err != nil { - return err - } - - stage6 := stage(sync, tx, nil, stages.IntermediateHashes) - err = stage6.Update(tx, snapshotBlock) - if err != nil { - return err - } - } - - var batchSize datasize.ByteSize - must(batchSize.UnmarshalText([]byte(batchSizeStr))) - - for blockNumber := snapshotBlock + 1; blockNumber <= lastBlockHeaderNumber; blockNumber++ { - err = sync.SetCurrentStage(stages.Execution) - if err != nil { - return err - } - stage4 := stage(sync, tx, nil, stages.Execution) - stage4.BlockNumber = blockNumber - 1 - log.Info("Stage4", "progress", stage4.BlockNumber) - - err = stagedsync.SpawnExecuteBlocksStage(stage4, sync, tx, blockNumber, ctx, - stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, nil, chainConfig, engine, vmConfig, nil, false, tmpDir), - false) - if err != nil { - return fmt.Errorf("execution err %w", err) - } - - stage5 := stage(sync, tx, nil, stages.HashState) - stage5.BlockNumber = blockNumber - 1 - log.Info("Stage5", "progress", stage5.BlockNumber) - err = stagedsync.SpawnHashStateStage(stage5, tx, stagedsync.StageHashStateCfg(db, tmpDir), ctx) - if err != nil { - return fmt.Errorf("spawnHashStateStage err %w", err) - } - - stage6 := stage(sync, tx, nil, stages.IntermediateHashes) - stage6.BlockNumber = blockNumber - 1 - log.Info("Stage6", "progress", stage6.BlockNumber) - if _, err = stagedsync.SpawnIntermediateHashesStage(stage5, nil /* Unwinder */, tx, stagedsync.StageTrieCfg(db, true, true, tmpDir), ctx); err != nil { - log.Error("Error on ih", "err", err, "block", blockNumber) - return fmt.Errorf("spawnIntermediateHashesStage %w", err) - } - - log.Info("Done", "progress", blockNumber) - err = tx.Commit() - if err != nil { - log.Error("Error on commit", "err", err, "block", blockNumber) - return err - } - tx, err = db.BeginRw(ctx) - if err != nil { - log.Error("Error on begin", "err", err, "block", blockNumber) - return err - } - defer tx.Rollback() - } - - return nil -} diff --git a/cmd/integration/commands/stages.go b/cmd/integration/commands/stages.go index 59a88dd5edc..1297a083726 100644 --- a/cmd/integration/commands/stages.go +++ b/cmd/integration/commands/stages.go @@ -1,24 +1,29 @@ package commands import ( + "bytes" "context" "fmt" - "path" - "sort" + "path/filepath" + "runtime" "strings" + "sync" "github.com/c2h5oh/datasize" + common2 "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/sentry/download" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/etl" + "github.com/ledgerwatch/erigon/cmd/sentry/sentry" + "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/eth/ethconfig" - "github.com/ledgerwatch/erigon/eth/fetcher" + "github.com/ledgerwatch/erigon/eth/ethconsensusconfig" "github.com/ledgerwatch/erigon/eth/integrity" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" @@ -27,17 +32,38 @@ import ( "github.com/ledgerwatch/erigon/migrations" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" stages2 "github.com/ledgerwatch/erigon/turbo/stages" - "github.com/ledgerwatch/erigon/turbo/txpool" "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/secp256k1" "github.com/spf13/cobra" + "golang.org/x/exp/slices" ) +var cmdStageHeaders = &cobra.Command{ + Use: "stage_headers", + Short: "", + RunE: func(cmd *cobra.Command, args []string) error { + ctx, _ := common2.RootContext() + logger := log.New() + db := openDB(chaindata, logger, true) + defer db.Close() + + if err := stageHeaders(db, ctx); err != nil { + log.Error("Error", "err", err) + return err + } + return nil + }, +} + var cmdStageBodies = &cobra.Command{ Use: "stage_bodies", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -55,7 +81,7 @@ var cmdStageSenders = &cobra.Command{ Short: "", RunE: func(cmd *cobra.Command, args []string) error { logger := log.New() - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() db := openDB(chaindata, logger, true) defer db.Close() @@ -71,7 +97,7 @@ var cmdStageExec = &cobra.Command{ Use: "stage_exec", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -88,7 +114,7 @@ var cmdStageTrie = &cobra.Command{ Use: "stage_trie", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -106,7 +132,7 @@ var cmdStageHashState = &cobra.Command{ Short: "", RunE: func(cmd *cobra.Command, args []string) error { logger := log.New() - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() db := openDB(chaindata, logger, true) defer db.Close() @@ -122,7 +148,7 @@ var cmdStageHistory = &cobra.Command{ Use: "stage_history", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -139,7 +165,7 @@ var cmdLogIndex = &cobra.Command{ Use: "stage_log_index", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -156,7 +182,7 @@ var cmdCallTraces = &cobra.Command{ Use: "stage_call_traces", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -173,7 +199,7 @@ var cmdStageTxLookup = &cobra.Command{ Use: "stage_tx_lookup", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -189,7 +215,7 @@ var cmdPrintStages = &cobra.Command{ Use: "print_stages", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, false) defer db.Close() @@ -206,7 +232,7 @@ var cmdPrintMigrations = &cobra.Command{ Use: "print_migrations", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, false) defer db.Close() @@ -222,7 +248,7 @@ var cmdRemoveMigration = &cobra.Command{ Use: "remove_migration", Short: "", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, false) defer db.Close() @@ -247,7 +273,7 @@ var cmdRunMigrations = &cobra.Command{ } var cmdSetPrune = &cobra.Command{ - Use: "set_prune", + Use: "force_set_prune", Short: "Override existing --prune flag value (if you know what you are doing)", RunE: func(cmd *cobra.Command, args []string) error { logger := log.New() @@ -257,26 +283,56 @@ var cmdSetPrune = &cobra.Command{ }, } +var cmdSetSnapshto = &cobra.Command{ + Use: "force_set_snapshot", + Short: "Override existing --snapshots flag value (if you know what you are doing)", + RunE: func(cmd *cobra.Command, args []string) error { + logger := log.New() + db := openDB(chaindata, logger, true) + defer db.Close() + _, chainConfig := byChain(chain) + snapshots := allSnapshots(chainConfig, db) + if err := db.Update(context.Background(), func(tx kv.RwTx) error { + return snap.ForceSetFlags(tx, snapshots.Cfg()) + }); err != nil { + return err + } + return nil + }, +} + func init() { - withDatadir(cmdPrintStages) + withDataDir(cmdPrintStages) withChain(cmdPrintStages) + withHeimdall(cmdPrintStages) rootCmd.AddCommand(cmdPrintStages) + withIntegrityChecks(cmdStageSenders) withReset(cmdStageSenders) withBlock(cmdStageSenders) withUnwind(cmdStageSenders) - withDatadir(cmdStageSenders) + withDataDir(cmdStageSenders) withChain(cmdStageSenders) + withHeimdall(cmdStageSenders) rootCmd.AddCommand(cmdStageSenders) - withDatadir(cmdStageBodies) + withDataDir(cmdStageHeaders) + withUnwind(cmdStageHeaders) + withReset(cmdStageHeaders) + withChain(cmdStageHeaders) + withHeimdall(cmdStageHeaders) + + rootCmd.AddCommand(cmdStageHeaders) + + withDataDir(cmdStageBodies) withUnwind(cmdStageBodies) withChain(cmdStageBodies) + withHeimdall(cmdStageBodies) rootCmd.AddCommand(cmdStageBodies) - withDatadir(cmdStageExec) + withDataDir(cmdStageExec) withReset(cmdStageExec) withBlock(cmdStageExec) withUnwind(cmdStageExec) @@ -284,102 +340,205 @@ func init() { withBatchSize(cmdStageExec) withTxTrace(cmdStageExec) withChain(cmdStageExec) + withHeimdall(cmdStageExec) rootCmd.AddCommand(cmdStageExec) - withDatadir(cmdStageHashState) + withDataDir(cmdStageHashState) withReset(cmdStageHashState) withBlock(cmdStageHashState) withUnwind(cmdStageHashState) withPruneTo(cmdStageHashState) withBatchSize(cmdStageHashState) withChain(cmdStageHashState) + withHeimdall(cmdStageHashState) rootCmd.AddCommand(cmdStageHashState) - withDatadir(cmdStageTrie) + withDataDir(cmdStageTrie) withReset(cmdStageTrie) withBlock(cmdStageTrie) withUnwind(cmdStageTrie) withPruneTo(cmdStageTrie) withIntegrityChecks(cmdStageTrie) withChain(cmdStageTrie) + withHeimdall(cmdStageTrie) rootCmd.AddCommand(cmdStageTrie) - withDatadir(cmdStageHistory) + withDataDir(cmdStageHistory) withReset(cmdStageHistory) withBlock(cmdStageHistory) withUnwind(cmdStageHistory) withPruneTo(cmdStageHistory) withChain(cmdStageHistory) + withHeimdall(cmdStageHistory) rootCmd.AddCommand(cmdStageHistory) - withDatadir(cmdLogIndex) + withDataDir(cmdLogIndex) withReset(cmdLogIndex) withBlock(cmdLogIndex) withUnwind(cmdLogIndex) withPruneTo(cmdLogIndex) withChain(cmdLogIndex) + withHeimdall(cmdLogIndex) rootCmd.AddCommand(cmdLogIndex) - withDatadir(cmdCallTraces) + withDataDir(cmdCallTraces) withReset(cmdCallTraces) withBlock(cmdCallTraces) withUnwind(cmdCallTraces) withPruneTo(cmdCallTraces) withChain(cmdCallTraces) + withHeimdall(cmdCallTraces) rootCmd.AddCommand(cmdCallTraces) withReset(cmdStageTxLookup) withBlock(cmdStageTxLookup) withUnwind(cmdStageTxLookup) - withDatadir(cmdStageTxLookup) + withDataDir(cmdStageTxLookup) withPruneTo(cmdStageTxLookup) withChain(cmdStageTxLookup) + withHeimdall(cmdStageTxLookup) rootCmd.AddCommand(cmdStageTxLookup) - withDatadir(cmdPrintMigrations) + withDataDir(cmdPrintMigrations) rootCmd.AddCommand(cmdPrintMigrations) - withDatadir(cmdRemoveMigration) + withDataDir(cmdRemoveMigration) withMigration(cmdRemoveMigration) withChain(cmdRemoveMigration) + withHeimdall(cmdRemoveMigration) rootCmd.AddCommand(cmdRemoveMigration) - withDatadir(cmdRunMigrations) + withDataDir(cmdRunMigrations) withChain(cmdRunMigrations) + withHeimdall(cmdRunMigrations) rootCmd.AddCommand(cmdRunMigrations) - withDatadir(cmdSetPrune) + withDataDir2(cmdSetSnapshto) + withChain(cmdSetSnapshto) + rootCmd.AddCommand(cmdSetSnapshto) + + withDataDir(cmdSetPrune) withChain(cmdSetPrune) cmdSetPrune.Flags().StringVar(&pruneFlag, "prune", "hrtc", "") - cmdSetPrune.Flags().Uint64Var(&pruneH, "--prune.h.older", 0, "") - cmdSetPrune.Flags().Uint64Var(&pruneR, "--prune.r.older", 0, "") - cmdSetPrune.Flags().Uint64Var(&pruneT, "--prune.t.older", 0, "") - cmdSetPrune.Flags().Uint64Var(&pruneC, "--prune.c.older", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneH, "prune.h.older", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneR, "prune.r.older", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneT, "prune.t.older", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneC, "prune.c.older", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneHBefore, "prune.h.before", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneRBefore, "prune.r.before", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneTBefore, "prune.t.before", 0, "") + cmdSetPrune.Flags().Uint64Var(&pruneCBefore, "prune.c.before", 0, "") cmdSetPrune.Flags().StringSliceVar(&experiments, "experiments", nil, "Storage mode to override database") rootCmd.AddCommand(cmdSetPrune) } -func stageBodies(db kv.RwDB, ctx context.Context) error { +func stageHeaders(db kv.RwDB, ctx context.Context) error { return db.Update(ctx, func(tx kv.RwTx) error { - if unwind > 0 { - progress, err := stages.GetStageProgress(tx, stages.Bodies) + if !(unwind > 0 || reset) { + log.Info("This command only works with --unwind or --reset options") + } + + if reset { + progress, err := stages.GetStageProgress(tx, stages.Headers) if err != nil { return fmt.Errorf("read Bodies progress: %w", err) } - if unwind > progress { + unwind = progress + } + + progress, err := stages.GetStageProgress(tx, stages.Headers) + if err != nil { + return fmt.Errorf("read Bodies progress: %w", err) + } + var unwindTo uint64 + if unwind > progress { + unwindTo = 1 // keep genesis + } else { + unwindTo = uint64(cmp.Max(1, int(progress)-int(unwind))) + } + + if err = stages.SaveStageProgress(tx, stages.Headers, unwindTo); err != nil { + return fmt.Errorf("saving Bodies progress failed: %w", err) + } + progress, err = stages.GetStageProgress(tx, stages.Headers) + if err != nil { + return fmt.Errorf("re-read Bodies progress: %w", err) + } + { // hard-unwind stage_body also + if err := rawdb.TruncateBlocks(ctx, tx, progress+1); err != nil { + return err + } + progressBodies, err := stages.GetStageProgress(tx, stages.Bodies) + if err != nil { + return fmt.Errorf("read Bodies progress: %w", err) + } + if progress < progressBodies { + if err = stages.SaveStageProgress(tx, stages.Bodies, progress); err != nil { + return fmt.Errorf("saving Bodies progress failed: %w", err) + } + } + } + // remove all canonical markers from this point + if err = rawdb.TruncateCanonicalHash(tx, progress+1); err != nil { + return err + } + if err = rawdb.TruncateTd(tx, progress+1); err != nil { + return err + } + hash, err := rawdb.ReadCanonicalHash(tx, progress-1) + if err != nil { + return err + } + if err = rawdb.WriteHeadHeaderHash(tx, hash); err != nil { + return err + } + + if reset { + // ensure no grabage records left (it may happen if db is inconsistent) + if err := tx.ForEach(kv.BlockBody, dbutils.EncodeBlockNumber(2), func(k, _ []byte) error { return tx.Delete(kv.BlockBody, k, nil) }); err != nil { + return err + } + if err := tx.ClearBucket(kv.NonCanonicalTxs); err != nil { + return err + } + if err := tx.ClearBucket(kv.EthTx); err != nil { + return err + } + if err := rawdb.ResetSequence(tx, kv.EthTx, 0); err != nil { + return err + } + if err := rawdb.ResetSequence(tx, kv.NonCanonicalTxs, 0); err != nil { + return err + } + } + log.Info("Progress", "headers", progress) + return nil + }) +} + +func stageBodies(db kv.RwDB, ctx context.Context) error { + _, _, chainConfig, _, sync, _, _ := newSync(ctx, db, nil) + if err := db.Update(ctx, func(tx kv.RwTx) error { + s := stage(sync, tx, nil, stages.Bodies) + + if unwind > 0 { + if unwind > s.BlockNumber { return fmt.Errorf("cannot unwind past 0") } - if err = stages.SaveStageProgress(tx, stages.Bodies, progress-unwind); err != nil { - return fmt.Errorf("saving Bodies progress failed: %w", err) + + u := sync.NewUnwindState(stages.Bodies, s.BlockNumber-unwind, s.BlockNumber) + if err := stagedsync.UnwindBodiesStage(u, tx, stagedsync.StageBodiesCfg(db, nil, nil, nil, nil, 0, *chainConfig, 0, allSnapshots(chainConfig, db), getBlockReader(chainConfig, db)), ctx); err != nil { + return err } - progress, err = stages.GetStageProgress(tx, stages.Bodies) + + progress, err := stages.GetStageProgress(tx, stages.Bodies) if err != nil { return fmt.Errorf("re-read Bodies progress: %w", err) } @@ -388,12 +547,17 @@ func stageBodies(db kv.RwDB, ctx context.Context) error { } log.Info("This command only works with --unwind option") return nil - }) + }); err != nil { + return err + } + return nil } func stageSenders(db kv.RwDB, ctx context.Context) error { - tmpdir := path.Join(datadir, etl.TmpDirName) - _, _, chainConfig, _, _, sync, _, _ := newSync(ctx, db, nil) + tmpdir := filepath.Join(datadir, etl.TmpDirName) + _, _, chainConfig, _, sync, _, _ := newSync(ctx, db, nil) + + must(sync.SetCurrentStage(stages.Senders)) tx, err := db.BeginRw(ctx) if err != nil { @@ -401,6 +565,42 @@ func stageSenders(db kv.RwDB, ctx context.Context) error { } defer tx.Rollback() + if integritySlow { + secp256k1.ContextForThread(1) + for i := block; ; i++ { + if err := common2.Stopped(ctx.Done()); err != nil { + return err + } + withoutSenders, _ := rawdb.ReadBlockByNumber(tx, i) + if withoutSenders == nil { + break + } + txs := withoutSenders.Transactions() + _, senders, _ := rawdb.CanonicalBlockByNumberWithSenders(tx, i) + if txs.Len() != len(senders) { + log.Error("not equal amount of senders", "block", i, "db", len(senders), "expect", txs.Len()) + return nil + } + if txs.Len() == 0 { + continue + } + signer := types.MakeSigner(chainConfig, i) + for j := 0; j < txs.Len(); j++ { + from, err := signer.Sender(txs[j]) + if err != nil { + return err + } + if !bytes.Equal(from[:], senders[j][:]) { + log.Error("wrong sender", "block", i, "tx", j, "db", fmt.Sprintf("%x", senders[j]), "expect", fmt.Sprintf("%x", from)) + } + } + if i%10 == 0 { + log.Info("checked", "block", i) + } + } + return nil + } + if reset { err = resetSenders(tx) if err != nil { @@ -412,28 +612,51 @@ func stageSenders(db kv.RwDB, ctx context.Context) error { s := stage(sync, tx, nil, stages.Senders) log.Info("Stage", "name", s.ID, "progress", s.BlockNumber) - cfg := stagedsync.StageSendersCfg(db, chainConfig, tmpdir) + var br *snapshotsync.BlockRetire + snapshots := allSnapshots(chainConfig, db) + if snapshots.Cfg().Enabled { + workers := runtime.GOMAXPROCS(-1) - 1 + if workers < 1 { + workers = 1 + } + br = snapshotsync.NewBlockRetire(workers, tmpdir, snapshots, db, nil, nil) + } + + pm, err := prune.Get(tx) + if err != nil { + return err + } + + cfg := stagedsync.StageSendersCfg(db, chainConfig, tmpdir, pm, br) if unwind > 0 { u := sync.NewUnwindState(stages.Senders, s.BlockNumber-unwind, s.BlockNumber) - err = stagedsync.UnwindSendersStage(u, tx, cfg, ctx) + if err = stagedsync.UnwindSendersStage(u, tx, cfg, ctx); err != nil { + return err + } + } else if pruneTo > 0 { + p, err := sync.PruneStageState(stages.Senders, s.BlockNumber, tx, db) if err != nil { return err } + if err = stagedsync.PruneSendersStage(p, tx, cfg, ctx); err != nil { + return err + } + return nil } else { - err = stagedsync.SpawnRecoverSendersStage(cfg, s, sync, tx, block, ctx) - if err != nil { + if err = stagedsync.SpawnRecoverSendersStage(cfg, s, sync, tx, block, ctx); err != nil { return err } } - return tx.Commit() } func stageExec(db kv.RwDB, ctx context.Context) error { - pm, engine, chainConfig, vmConfig, _, sync, _, _ := newSync(ctx, db, nil) + pm, engine, chainConfig, vmConfig, sync, _, _ := newSync(ctx, db, nil) + must(sync.SetCurrentStage(stages.Execution)) + tmpdir := filepath.Join(datadir, etl.TmpDirName) if reset { - genesis, _ := byChain() + genesis, _ := byChain(chain) if err := db.Update(ctx, func(tx kv.RwTx) error { return resetExec(tx, genesis) }); err != nil { return err } @@ -458,7 +681,7 @@ func stageExec(db kv.RwDB, ctx context.Context) error { pm.TxIndex = prune.Distance(s.BlockNumber - pruneTo) } - cfg := stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, nil, chainConfig, engine, vmConfig, nil, false, tmpDBPath) + cfg := stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, nil, chainConfig, engine, vmConfig, nil, false, tmpdir, getBlockReader(chainConfig, db)) if unwind > 0 { u := sync.NewUnwindState(stages.Execution, s.BlockNumber-unwind, s.BlockNumber) err := stagedsync.UnwindExecutionStage(u, s, nil, ctx, cfg, false) @@ -488,8 +711,9 @@ func stageExec(db kv.RwDB, ctx context.Context) error { } func stageTrie(db kv.RwDB, ctx context.Context) error { - pm, _, _, _, _, sync, _, _ := newSync(ctx, db, nil) - tmpdir := path.Join(datadir, etl.TmpDirName) + pm, _, chainConfig, _, sync, _, _ := newSync(ctx, db, nil) + must(sync.SetCurrentStage(stages.IntermediateHashes)) + tmpdir := filepath.Join(datadir, etl.TmpDirName) tx, err := db.BeginRw(ctx) if err != nil { @@ -498,7 +722,10 @@ func stageTrie(db kv.RwDB, ctx context.Context) error { defer tx.Rollback() if reset { - return stagedsync.ResetIH(tx) + if err := stagedsync.ResetIH(tx); err != nil { + return err + } + return tx.Commit() } execStage := stage(sync, tx, nil, stages.Execution) s := stage(sync, tx, nil, stages.IntermediateHashes) @@ -511,9 +738,9 @@ func stageTrie(db kv.RwDB, ctx context.Context) error { } fmt.Printf("distance: %d\n", pm.History) - log.Info("Stage4", "progress", execStage.BlockNumber) - log.Info("Stage5", "progress", s.BlockNumber) - cfg := stagedsync.StageTrieCfg(db, true, true, tmpdir) + log.Info("StageExec", "progress", execStage.BlockNumber) + log.Info("StageTrie", "progress", s.BlockNumber) + cfg := stagedsync.StageTrieCfg(db, true, true, tmpdir, getBlockReader(chainConfig, db)) if unwind > 0 { u := sync.NewUnwindState(stages.IntermediateHashes, s.BlockNumber-unwind, s.BlockNumber) if err := stagedsync.UnwindIntermediateHashesStage(u, s, tx, cfg, ctx); err != nil { @@ -529,18 +756,19 @@ func stageTrie(db kv.RwDB, ctx context.Context) error { return err } } else { - if _, err := stagedsync.SpawnIntermediateHashesStage(s, nil /* Unwinder */, tx, cfg, ctx); err != nil { + if _, err := stagedsync.SpawnIntermediateHashesStage(s, sync /* Unwinder */, tx, cfg, ctx); err != nil { return err } } - integrity.Trie(tx, integritySlow, ctx) - return nil + integrity.Trie(db, tx, integritySlow, ctx) + return tx.Commit() } func stageHashState(db kv.RwDB, ctx context.Context) error { - tmpdir := path.Join(datadir, etl.TmpDirName) + tmpdir := filepath.Join(datadir, etl.TmpDirName) - pm, _, _, _, _, sync, _, _ := newSync(ctx, db, nil) + pm, _, _, _, sync, _, _ := newSync(ctx, db, nil) + must(sync.SetCurrentStage(stages.HashState)) tx, err := db.BeginRw(ctx) if err != nil { @@ -591,9 +819,10 @@ func stageHashState(db kv.RwDB, ctx context.Context) error { } func stageLogIndex(db kv.RwDB, ctx context.Context) error { - tmpdir := path.Join(datadir, etl.TmpDirName) + tmpdir := filepath.Join(datadir, etl.TmpDirName) - pm, _, _, _, _, sync, _, _ := newSync(ctx, db, nil) + pm, _, _, _, sync, _, _ := newSync(ctx, db, nil) + must(sync.SetCurrentStage(stages.LogIndex)) tx, err := db.BeginRw(ctx) if err != nil { return err @@ -645,9 +874,10 @@ func stageLogIndex(db kv.RwDB, ctx context.Context) error { } func stageCallTraces(kv kv.RwDB, ctx context.Context) error { - tmpdir := path.Join(datadir, etl.TmpDirName) + tmpdir := filepath.Join(datadir, etl.TmpDirName) - pm, _, _, _, _, sync, _, _ := newSync(ctx, kv, nil) + pm, _, _, _, sync, _, _ := newSync(ctx, kv, nil) + must(sync.SetCurrentStage(stages.CallTraces)) tx, err := kv.BeginRw(ctx) if err != nil { return err @@ -705,8 +935,10 @@ func stageCallTraces(kv kv.RwDB, ctx context.Context) error { } func stageHistory(db kv.RwDB, ctx context.Context) error { - tmpdir := path.Join(datadir, etl.TmpDirName) - pm, _, _, _, _, sync, _, _ := newSync(ctx, db, nil) + tmpdir := filepath.Join(datadir, etl.TmpDirName) + pm, _, _, _, sync, _, _ := newSync(ctx, db, nil) + must(sync.SetCurrentStage(stages.AccountHistoryIndex)) + tx, err := db.BeginRw(ctx) if err != nil { return err @@ -756,10 +988,11 @@ func stageHistory(db kv.RwDB, ctx context.Context) error { if err != nil { return err } - err = stagedsync.PruneAccountHistoryIndex(ps, tx, cfg, ctx) + err = stagedsync.PruneStorageHistoryIndex(ps, tx, cfg, ctx) if err != nil { return err } + _ = printStages(tx) } else { if err := stagedsync.SpawnAccountHistoryIndex(stageAcc, tx, cfg, ctx); err != nil { return err @@ -772,9 +1005,10 @@ func stageHistory(db kv.RwDB, ctx context.Context) error { } func stageTxLookup(db kv.RwDB, ctx context.Context) error { - tmpdir := path.Join(datadir, etl.TmpDirName) + tmpdir := filepath.Join(datadir, etl.TmpDirName) - pm, _, _, _, _, sync, _, _ := newSync(ctx, db, nil) + pm, _, chainConfig, _, sync, _, _ := newSync(ctx, db, nil) + must(sync.SetCurrentStage(stages.TxLookup)) tx, err := db.BeginRw(ctx) if err != nil { @@ -797,8 +1031,8 @@ func stageTxLookup(db kv.RwDB, ctx context.Context) error { pm.TxIndex = prune.Distance(s.BlockNumber - pruneTo) } log.Info("Stage", "name", s.ID, "progress", s.BlockNumber) - - cfg := stagedsync.StageTxLookupCfg(db, pm, tmpdir) + isBor := chainConfig.Bor != nil + cfg := stagedsync.StageTxLookupCfg(db, pm, tmpdir, allSnapshots(chainConfig, db), isBor) if unwind > 0 { u := sync.NewUnwindState(stages.TxLookup, s.BlockNumber-unwind, s.BlockNumber) err = stagedsync.UnwindTxLookup(u, s, tx, cfg, ctx) @@ -806,7 +1040,7 @@ func stageTxLookup(db kv.RwDB, ctx context.Context) error { return err } } else if pruneTo > 0 { - p, err := sync.PruneStageState(stages.TxPool, s.BlockNumber, tx, nil) + p, err := sync.PruneStageState(stages.TxLookup, s.BlockNumber, tx, nil) if err != nil { return err } @@ -815,7 +1049,7 @@ func stageTxLookup(db kv.RwDB, ctx context.Context) error { return err } } else { - err = stagedsync.SpawnTxLookup(s, tx, cfg, ctx) + err = stagedsync.SpawnTxLookup(s, tx, block, cfg, ctx) if err != nil { return err } @@ -839,7 +1073,7 @@ func printAppliedMigrations(db kv.RwDB, ctx context.Context) error { appliedStrs[i] = k i++ } - sort.Strings(appliedStrs) + slices.Sort(appliedStrs) log.Info("Applied", "migrations", strings.Join(appliedStrs, " ")) return nil }) @@ -851,36 +1085,67 @@ func removeMigration(db kv.RwDB, ctx context.Context) error { }) } -func byChain() (*core.Genesis, *params.ChainConfig) { +func byChain(chain string) (*core.Genesis, *params.ChainConfig) { var chainConfig *params.ChainConfig - var genesis *core.Genesis - switch chain { - case "", params.MainnetChainName: + if chain == "" { chainConfig = params.MainnetChainConfig genesis = core.DefaultGenesisBlock() - case params.RopstenChainName: - chainConfig = params.RopstenChainConfig - genesis = core.DefaultRopstenGenesisBlock() - case params.GoerliChainName: - chainConfig = params.GoerliChainConfig - genesis = core.DefaultGoerliGenesisBlock() - case params.RinkebyChainName: - chainConfig = params.RinkebyChainConfig - genesis = core.DefaultRinkebyGenesisBlock() - case params.CalaverasChainName: - chainConfig = params.CalaverasChainConfig - genesis = core.DefaultCalaverasGenesisBlock() - case params.SokolChainName: - chainConfig = params.SokolChainConfig - genesis = core.DefaultSokolGenesisBlock() + } else { + chainConfig = params.ChainConfigByChainName(chain) + genesis = core.DefaultGenesisBlockByChainName(chain) } return genesis, chainConfig } -func newSync(ctx context.Context, db kv.RwDB, miningConfig *params.MiningConfig) (prune.Mode, consensus.Engine, *params.ChainConfig, *vm.Config, *core.TxPool, *stagedsync.Sync, *stagedsync.Sync, stagedsync.MiningState) { - tmpdir := path.Join(datadir, etl.TmpDirName) - snapshotDir = path.Join(datadir, "erigon", "snapshot") +var openSnapshotOnce sync.Once +var _allSnapshotsSingleton *snapshotsync.RoSnapshots + +func allSnapshots(cc *params.ChainConfig, db kv.RwDB) *snapshotsync.RoSnapshots { + openSnapshotOnce.Do(func() { + useSnapshots := ethconfig.UseSnapshotsByChainName(cc.ChainName) + snapCfg := ethconfig.NewSnapCfg(useSnapshots && snapshotsBool, true, true) + if err := db.Update(context.Background(), func(tx kv.RwTx) error { + // if we dont have the correct syncmode here return an error + changed, snapSync, err := snap.EnsureNotChanged(tx, snapCfg) + if err != nil { + return err + } + + if !changed { + return fmt.Errorf("syncmode has changed. Run erigon again with --snapshots=%v", snapSync) + } + + return nil + }); err != nil { + panic(err) + } + _allSnapshotsSingleton = snapshotsync.NewRoSnapshots(snapCfg, filepath.Join(datadir, "snapshots")) + if useSnapshots { + if err := _allSnapshotsSingleton.Reopen(); err != nil { + panic(err) + } + } + }) + return _allSnapshotsSingleton +} + +var openBlockReaderOnce sync.Once +var _blockReaderSingleton services.FullBlockReader + +func getBlockReader(cc *params.ChainConfig, db kv.RwDB) (blockReader services.FullBlockReader) { + openBlockReaderOnce.Do(func() { + _blockReaderSingleton = snapshotsync.NewBlockReader() + if sn := allSnapshots(cc, db); sn.Cfg().Enabled { + x := snapshotsync.NewBlockReaderWithSnapshots(sn) + _blockReaderSingleton = x + } + }) + return _blockReaderSingleton +} + +func newSync(ctx context.Context, db kv.RwDB, miningConfig *params.MiningConfig) (prune.Mode, consensus.Engine, *params.ChainConfig, *vm.Config, *stagedsync.Sync, *stagedsync.Sync, stagedsync.MiningState) { + tmpdir := filepath.Join(datadir, etl.TmpDirName) logger := log.New() var pm prune.Mode @@ -890,82 +1155,97 @@ func newSync(ctx context.Context, db kv.RwDB, miningConfig *params.MiningConfig) if err != nil { return err } + if err = stagedsync.UpdateMetrics(tx); err != nil { + return err + } return nil }); err != nil { panic(err) } vmConfig := &vm.Config{} - genesis, chainConfig := byChain() - var engine consensus.Engine - engine = ethash.NewFaker() - switch chain { - case params.SokolChainName: - engine = ethconfig.CreateConsensusEngine(chainConfig, logger, ¶ms.AuRaConfig{DBPath: path.Join(datadir, "aura")}, nil, false) - } + genesis, _ := byChain(chain) events := privateapi.NewEvents() - txPool := core.NewTxPool(ethconfig.Defaults.TxPool, chainConfig, db) - chainConfig, genesisBlock, genesisErr := core.CommitGenesisBlock(db, genesis) if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok { panic(genesisErr) } log.Info("Initialised chain configuration", "config", chainConfig) - var batchSize datasize.ByteSize - must(batchSize.UnmarshalText([]byte(batchSizeStr))) - - blockDownloaderWindow := 65536 - downloadServer, err := download.NewControlServer(db, "", chainConfig, genesisBlock.Hash(), engine, 1, nil, blockDownloaderWindow) - if err != nil { - panic(err) + // Apply special hacks for BSC params + if chainConfig.Parlia != nil { + params.ApplyBinanceSmartChainParams() } - txPoolP2PServer, err := txpool.NewP2PServer(context.Background(), nil, txPool) - if err != nil { - panic(err) - } - fetchTx := func(peerID string, hashes []common.Hash) error { - txPoolP2PServer.SendTxsRequest(context.TODO(), peerID, hashes) - return nil - } - - txPoolP2PServer.TxFetcher = fetcher.NewTxFetcher(txPool.Has, txPool.AddRemotes, fetchTx) + var batchSize datasize.ByteSize + must(batchSize.UnmarshalText([]byte(batchSizeStr))) cfg := ethconfig.Defaults cfg.Prune = pm cfg.BatchSize = batchSize + cfg.DeprecatedTxPool.Disable = true if miningConfig != nil { cfg.Miner = *miningConfig } + allSn := allSnapshots(chainConfig, db) + cfg.Snapshot = allSn.Cfg() + cfg.SnapDir = filepath.Join(datadir, "snapshots") + var engine consensus.Engine + config := ðconfig.Defaults + if chainConfig.Clique != nil { + c := params.CliqueSnapshot + c.DBPath = filepath.Join(datadir, "clique", "db") + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, c, config.Miner.Notify, config.Miner.Noverify, "", true, datadir, allSn) + } else if chainConfig.Aura != nil { + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, ¶ms.AuRaConfig{DBPath: filepath.Join(datadir, "aura")}, config.Miner.Notify, config.Miner.Noverify, "", true, datadir, allSn) + } else if chainConfig.Parlia != nil { + consensusConfig := ¶ms.ParliaConfig{DBPath: filepath.Join(datadir, "parlia")} + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify, "", true, datadir, allSn) + } else if chainConfig.Bor != nil { + consensusConfig := &config.Bor + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify, HeimdallURL, false, datadir, allSn) + } else { //ethash + engine = ethash.NewFaker() + } - sync, err := stages2.NewStagedSync(context.Background(), logger, db, p2p.Config{}, cfg, - downloadServer, - tmpdir, - txPool, - txPoolP2PServer, - nil, nil, nil, + br := getBlockReader(chainConfig, db) + sentryControlServer, err := sentry.NewMultiClient( + db, + "", + chainConfig, + genesisBlock.Hash(), + engine, + 1, + nil, + ethconfig.Defaults.Sync, + br, + false, ) if err != nil { panic(err) } + + sync, err := stages2.NewStagedSync(context.Background(), logger, db, p2p.Config{}, cfg, sentryControlServer, tmpdir, &stagedsync.Notifications{}, nil, allSn, nil) + if err != nil { + panic(err) + } miner := stagedsync.NewMiningState(&cfg.Miner) miningSync := stagedsync.New( stagedsync.MiningStages(ctx, - stagedsync.StageMiningCreateBlockCfg(db, miner, *chainConfig, engine, txPool, tmpdir), + stagedsync.StageMiningCreateBlockCfg(db, miner, *chainConfig, engine, nil, nil, nil, tmpdir), stagedsync.StageMiningExecCfg(db, miner, events, *chainConfig, engine, &vm.Config{}, tmpdir), stagedsync.StageHashStateCfg(db, tmpdir), - stagedsync.StageTrieCfg(db, false, true, tmpdir), + stagedsync.StageTrieCfg(db, false, true, tmpdir, br), stagedsync.StageMiningFinishCfg(db, *chainConfig, engine, miner, ctx.Done()), ), stagedsync.MiningUnwindOrder, stagedsync.MiningPruneOrder, ) - return pm, engine, chainConfig, vmConfig, txPool, sync, miningSync, miner + return pm, engine, chainConfig, vmConfig, sync, miningSync, miner } func progress(tx kv.Getter, stage stages.SyncStage) uint64 { @@ -985,7 +1265,8 @@ func stage(st *stagedsync.Sync, tx kv.Tx, db kv.RoDB, stage stages.SyncStage) *s } func overrideStorageMode(db kv.RwDB) error { - pm, err := prune.FromCli(pruneFlag, pruneH, pruneR, pruneT, pruneC, experiments) + pm, err := prune.FromCli(pruneFlag, pruneH, pruneR, pruneT, pruneC, + pruneHBefore, pruneRBefore, pruneTBefore, pruneCBefore, experiments) if err != nil { return err } diff --git a/cmd/integration/commands/state_stages.go b/cmd/integration/commands/state_stages.go index 66f8546d770..f63021677e0 100644 --- a/cmd/integration/commands/state_stages.go +++ b/cmd/integration/commands/state_stages.go @@ -7,19 +7,22 @@ import ( "fmt" "os" "path" + "path/filepath" "sort" "time" "github.com/c2h5oh/datasize" + common2 "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/node/nodecfg" "github.com/spf13/cobra" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/common/debugprint" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" @@ -30,7 +33,6 @@ import ( "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb/bitmapdb" - "github.com/ledgerwatch/erigon/node" "github.com/ledgerwatch/erigon/params" erigoncli "github.com/ledgerwatch/erigon/turbo/cli" "github.com/ledgerwatch/log/v3" @@ -49,15 +51,15 @@ Examples: `, Example: "go run ./cmd/integration state_stages --datadir=... --verbosity=3 --unwind=100 --unwind.every=100000 --block=2000000", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() - cfg := &node.DefaultConfig + ctx, _ := common2.RootContext() + cfg := &nodecfg.DefaultConfig utils.SetNodeConfigCobra(cmd, cfg) ethConfig := ðconfig.Defaults erigoncli.ApplyFlagsForEthConfigCobra(cmd.Flags(), ethConfig) miningConfig := params.MiningConfig{} utils.SetupMinerCobra(cmd, &miningConfig) logger := log.New() - db := openDB(path.Join(cfg.DataDir, "erigon", "chaindata"), logger, true) + db := openDB(path.Join(cfg.DataDir, "chaindata"), logger, true) defer db.Close() if err := syncBySmallSteps(db, miningConfig, ctx); err != nil { @@ -78,7 +80,7 @@ Examples: var loopIhCmd = &cobra.Command{ Use: "loop_ih", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -98,7 +100,7 @@ var loopIhCmd = &cobra.Command{ var loopExecCmd = &cobra.Command{ Use: "loop_exec", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common2.RootContext() logger := log.New() db := openDB(chaindata, logger, true) defer db.Close() @@ -115,7 +117,7 @@ var loopExecCmd = &cobra.Command{ } func init() { - withDatadir2(stateStags) + withDataDir2(stateStags) withReferenceChaindata(stateStags) withUnwind(stateStags) withUnwindEvery(stateStags) @@ -123,26 +125,29 @@ func init() { withIntegrityChecks(stateStags) withMining(stateStags) withChain(stateStags) + withHeimdall(stateStags) rootCmd.AddCommand(stateStags) - withDatadir(loopIhCmd) + withDataDir(loopIhCmd) withBatchSize(loopIhCmd) withUnwind(loopIhCmd) withChain(loopIhCmd) + withHeimdall(loopIhCmd) rootCmd.AddCommand(loopIhCmd) - withDatadir(loopExecCmd) + withDataDir(loopExecCmd) withBatchSize(loopExecCmd) withUnwind(loopExecCmd) withChain(loopExecCmd) + withHeimdall(loopExecCmd) rootCmd.AddCommand(loopExecCmd) } func syncBySmallSteps(db kv.RwDB, miningConfig params.MiningConfig, ctx context.Context) error { - pm, engine, chainConfig, vmConfig, txPool, stateStages, miningStages, miner := newSync(ctx, db, &miningConfig) + pm, engine, chainConfig, vmConfig, stateStages, miningStages, miner := newSync(ctx, db, &miningConfig) tx, err := db.BeginRw(ctx) if err != nil { @@ -150,7 +155,7 @@ func syncBySmallSteps(db kv.RwDB, miningConfig params.MiningConfig, ctx context. } defer tx.Rollback() - tmpDir := path.Join(datadir, etl.TmpDirName) + tmpDir := filepath.Join(datadir, etl.TmpDirName) quit := ctx.Done() var batchSize datasize.ByteSize @@ -177,17 +182,12 @@ func syncBySmallSteps(db kv.RwDB, miningConfig params.MiningConfig, ctx context. } } - stateStages.DisableStages(stages.Headers, stages.BlockHashes, stages.Bodies, stages.Senders, - stages.CreateHeadersSnapshot, - stages.CreateBodiesSnapshot, - stages.CreateStateSnapshot, - stages.TxPool, // TODO: enable TxPoolDB stage - stages.Finish) + stateStages.DisableStages(stages.Headers, stages.BlockHashes, stages.Bodies, stages.Senders) - execCfg := stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, changeSetHook, chainConfig, engine, vmConfig, nil, false, tmpDir) + execCfg := stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, changeSetHook, chainConfig, engine, vmConfig, nil, false, tmpDir, getBlockReader(chainConfig, db)) - execUntilFunc := func(execToBlock uint64) func(firstCycle bool, stageState *stagedsync.StageState, unwinder stagedsync.Unwinder, tx kv.RwTx) error { - return func(firstCycle bool, s *stagedsync.StageState, unwinder stagedsync.Unwinder, tx kv.RwTx) error { + execUntilFunc := func(execToBlock uint64) func(firstCycle bool, badBlockUnwind bool, stageState *stagedsync.StageState, unwinder stagedsync.Unwinder, tx kv.RwTx) error { + return func(firstCycle bool, badBlockUnwind bool, s *stagedsync.StageState, unwinder stagedsync.Unwinder, tx kv.RwTx) error { if err := stagedsync.SpawnExecuteBlocksStage(s, unwinder, tx, execToBlock, ctx, execCfg, firstCycle); err != nil { return fmt.Errorf("spawnExecuteBlocksStage: %w", err) } @@ -283,7 +283,7 @@ func syncBySmallSteps(db kv.RwDB, miningConfig params.MiningConfig, ctx context. if err := checkChanges(expectedAccountChanges, tx, expectedStorageChanges, execAtBlock, pm.History.PruneTo(execToBlock)); err != nil { return err } - integrity.Trie(tx, integritySlow, ctx) + integrity.Trie(db, tx, integritySlow, ctx) } //receiptsInDB := rawdb.ReadReceiptsByNumber(tx, progress(tx, stages.Execution)+1) @@ -302,31 +302,26 @@ func syncBySmallSteps(db kv.RwDB, miningConfig params.MiningConfig, ctx context. break } - nextBlock, _, err := rawdb.ReadBlockByNumberWithSenders(tx, execAtBlock+1) + nextBlock, _, err := rawdb.CanonicalBlockByNumberWithSenders(tx, execAtBlock+1) if err != nil { panic(err) } - if miner.MiningConfig.Enabled && nextBlock != nil && nextBlock.Header().Coinbase != (common.Address{}) { - miner.MiningConfig.Etherbase = nextBlock.Header().Coinbase - miner.MiningConfig.ExtraData = nextBlock.Header().Extra - miningStages.MockExecFunc(stages.MiningCreateBlock, func(firstCycle bool, s *stagedsync.StageState, u stagedsync.Unwinder, tx kv.RwTx) error { + if miner.MiningConfig.Enabled && nextBlock != nil && nextBlock.Coinbase() != (common.Address{}) { + miner.MiningConfig.Etherbase = nextBlock.Coinbase() + miner.MiningConfig.ExtraData = nextBlock.Extra() + miningStages.MockExecFunc(stages.MiningCreateBlock, func(firstCycle bool, badBlockUnwind bool, s *stagedsync.StageState, u stagedsync.Unwinder, tx kv.RwTx) error { err = stagedsync.SpawnMiningCreateBlockStage(s, tx, - stagedsync.StageMiningCreateBlockCfg(db, - miner, - *chainConfig, - engine, - txPool, - tmpDir), + stagedsync.StageMiningCreateBlockCfg(db, miner, *chainConfig, engine, nil, nil, nil, tmpDir), quit) if err != nil { return err } miner.MiningBlock.Uncles = nextBlock.Uncles() - miner.MiningBlock.Header.Time = nextBlock.Header().Time - miner.MiningBlock.Header.GasLimit = nextBlock.Header().GasLimit - miner.MiningBlock.Header.Difficulty = nextBlock.Header().Difficulty - miner.MiningBlock.Header.Nonce = nextBlock.Header().Nonce + miner.MiningBlock.Header.Time = nextBlock.Time() + miner.MiningBlock.Header.GasLimit = nextBlock.GasLimit() + miner.MiningBlock.Header.Difficulty = nextBlock.Difficulty() + miner.MiningBlock.Header.Nonce = nextBlock.Nonce() miner.MiningBlock.LocalTxs = types.NewTransactionsFixedOrder(nextBlock.Transactions()) miner.MiningBlock.RemoteTxs = types.NewTransactionsFixedOrder(nil) //debugprint.Headers(miningWorld.Block.Header, nextBlock.Header()) @@ -399,30 +394,29 @@ func checkChanges(expectedAccountChanges map[uint64]*changeset.ChangeSet, tx kv. } func checkMinedBlock(b1, b2 *types.Block, chainConfig *params.ChainConfig) { - h1 := b1.Header() - h2 := b2.Header() - if h1.Root != h2.Root || - (chainConfig.IsByzantium(b1.NumberU64()) && h1.ReceiptHash != h2.ReceiptHash) || - h1.TxHash != h2.TxHash || - h1.ParentHash != h2.ParentHash || - h1.UncleHash != h2.UncleHash || - h1.GasUsed != h2.GasUsed || - !bytes.Equal(h1.Extra, h2.Extra) { - debugprint.Headers(h1, h2) + if b1.Root() != b2.Root() || + (chainConfig.IsByzantium(b1.NumberU64()) && b1.ReceiptHash() != b2.ReceiptHash()) || + b1.TxHash() != b2.TxHash() || + b1.ParentHash() != b2.ParentHash() || + b1.UncleHash() != b2.UncleHash() || + b1.GasUsed() != b2.GasUsed() || + !bytes.Equal(b1.Extra(), b2.Extra()) { // TODO: Extra() doesn't need to be a copy for a read-only compare + // Header()'s deep-copy doesn't matter here since it will panic anyway + debugprint.Headers(b1.Header(), b2.Header()) panic("blocks are not same") } } func loopIh(db kv.RwDB, ctx context.Context, unwind uint64) error { - _, _, _, _, _, sync, _, _ := newSync(ctx, db, nil) - tmpdir := path.Join(datadir, etl.TmpDirName) + _, _, chainConfig, _, sync, _, _ := newSync(ctx, db, nil) + tmpdir := filepath.Join(datadir, etl.TmpDirName) tx, err := db.BeginRw(ctx) if err != nil { return err } defer tx.Rollback() - sync.DisableStages(stages.Headers, stages.BlockHashes, stages.Bodies, stages.Senders, stages.Execution, stages.Translation, stages.AccountHistoryIndex, stages.StorageHistoryIndex, stages.TxPool, stages.TxLookup, stages.Finish) + sync.DisableStages(stages.Headers, stages.BlockHashes, stages.Bodies, stages.Senders, stages.Execution, stages.Translation, stages.AccountHistoryIndex, stages.StorageHistoryIndex, stages.TxLookup, stages.Finish) if err = sync.Run(db, tx, false); err != nil { return err } @@ -435,7 +429,7 @@ func loopIh(db kv.RwDB, ctx context.Context, unwind uint64) error { } _ = sync.SetCurrentStage(stages.IntermediateHashes) u = &stagedsync.UnwindState{ID: stages.IntermediateHashes, UnwindPoint: to} - if err = stagedsync.UnwindIntermediateHashesStage(u, stage(sync, tx, nil, stages.IntermediateHashes), tx, stagedsync.StageTrieCfg(db, true, true, tmpdir), ctx); err != nil { + if err = stagedsync.UnwindIntermediateHashesStage(u, stage(sync, tx, nil, stages.IntermediateHashes), tx, stagedsync.StageTrieCfg(db, true, true, tmpdir, getBlockReader(chainConfig, db)), ctx); err != nil { return err } must(tx.Commit()) @@ -479,7 +473,8 @@ func loopIh(db kv.RwDB, ctx context.Context, unwind uint64) error { } func loopExec(db kv.RwDB, ctx context.Context, unwind uint64) error { - pm, engine, chainConfig, vmConfig, _, sync, _, _ := newSync(ctx, db, nil) + pm, engine, chainConfig, vmConfig, sync, _, _ := newSync(ctx, db, nil) + tmpdir := filepath.Join(datadir, etl.TmpDirName) tx, err := db.BeginRw(ctx) if err != nil { @@ -498,10 +493,11 @@ func loopExec(db kv.RwDB, ctx context.Context, unwind uint64) error { from := progress(tx, stages.Execution) to := from + unwind - cfg := stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, nil, chainConfig, engine, vmConfig, nil, false, tmpDBPath) + + cfg := stagedsync.StageExecuteBlocksCfg(db, pm, batchSize, nil, chainConfig, engine, vmConfig, nil, false, tmpdir, getBlockReader(chainConfig, db)) // set block limit of execute stage - sync.MockExecFunc(stages.Execution, func(firstCycle bool, stageState *stagedsync.StageState, unwinder stagedsync.Unwinder, tx kv.RwTx) error { + sync.MockExecFunc(stages.Execution, func(firstCycle bool, badBlockUnwind bool, stageState *stagedsync.StageState, unwinder stagedsync.Unwinder, tx kv.RwTx) error { if err = stagedsync.SpawnExecuteBlocksStage(stageState, sync, tx, to, ctx, cfg, false); err != nil { return fmt.Errorf("spawnExecuteBlocksStage: %w", err) } @@ -533,11 +529,11 @@ func loopExec(db kv.RwDB, ctx context.Context, unwind uint64) error { func checkChangeSet(db kv.Tx, blockNum uint64, expectedAccountChanges *changeset.ChangeSet, expectedStorageChanges *changeset.ChangeSet) error { i := 0 sort.Sort(expectedAccountChanges) - err := changeset.Walk(db, kv.AccountChangeSet, dbutils.EncodeBlockNumber(blockNum), 8*8, func(blockN uint64, k, v []byte) (bool, error) { + err := changeset.ForPrefix(db, kv.AccountChangeSet, dbutils.EncodeBlockNumber(blockNum), func(blockN uint64, k, v []byte) error { c := expectedAccountChanges.Changes[i] i++ if bytes.Equal(c.Key, k) && bytes.Equal(c.Value, v) { - return true, nil + return nil } fmt.Printf("Unexpected account changes in block %d\n", blockNum) @@ -545,13 +541,13 @@ func checkChangeSet(db kv.Tx, blockNum uint64, expectedAccountChanges *changeset fmt.Printf("0x%x: %x\n", k, v) fmt.Printf("Expected: ==========================\n") fmt.Printf("0x%x %x\n", c.Key, c.Value) - return false, fmt.Errorf("check change set failed") + return fmt.Errorf("check change set failed") }) if err != nil { return err } if expectedAccountChanges.Len() != i { - return fmt.Errorf("db has less changets") + return fmt.Errorf("db has less changesets") } if expectedStorageChanges == nil { expectedStorageChanges = changeset.NewChangeSet() @@ -559,11 +555,11 @@ func checkChangeSet(db kv.Tx, blockNum uint64, expectedAccountChanges *changeset i = 0 sort.Sort(expectedStorageChanges) - err = changeset.Walk(db, kv.StorageChangeSet, dbutils.EncodeBlockNumber(blockNum), 8*8, func(blockN uint64, k, v []byte) (bool, error) { + err = changeset.ForPrefix(db, kv.StorageChangeSet, dbutils.EncodeBlockNumber(blockNum), func(blockN uint64, k, v []byte) error { c := expectedStorageChanges.Changes[i] i++ if bytes.Equal(c.Key, k) && bytes.Equal(c.Value, v) { - return true, nil + return nil } fmt.Printf("Unexpected storage changes in block %d\n", blockNum) @@ -571,13 +567,13 @@ func checkChangeSet(db kv.Tx, blockNum uint64, expectedAccountChanges *changeset fmt.Printf("0x%x: %x\n", k, v) fmt.Printf("Expected: ==========================\n") fmt.Printf("0x%x %x\n", c.Key, c.Value) - return false, fmt.Errorf("check change set failed") + return fmt.Errorf("check change set failed") }) if err != nil { return err } if expectedStorageChanges.Len() != i { - return fmt.Errorf("db has less changets") + return fmt.Errorf("db has less changesets") } return nil @@ -586,7 +582,7 @@ func checkChangeSet(db kv.Tx, blockNum uint64, expectedAccountChanges *changeset func checkHistory(tx kv.Tx, changeSetBucket string, blockNum uint64) error { indexBucket := changeset.Mapper[changeSetBucket].IndexBucket blockNumBytes := dbutils.EncodeBlockNumber(blockNum) - if err := changeset.Walk(tx, changeSetBucket, blockNumBytes, 0, func(blockN uint64, address, v []byte) (bool, error) { + if err := changeset.ForEach(tx, changeSetBucket, blockNumBytes, func(blockN uint64, address, v []byte) error { k := dbutils.CompositeKeyWithoutIncarnation(address) from := blockN if from > 0 { @@ -594,12 +590,12 @@ func checkHistory(tx kv.Tx, changeSetBucket string, blockNum uint64) error { } bm, innerErr := bitmapdb.Get64(tx, indexBucket, k, from, blockN+1) if innerErr != nil { - return false, innerErr + return innerErr } if !bm.Contains(blockN) { - return false, fmt.Errorf("checkHistory failed: bucket=%s,block=%d,addr=%x", changeSetBucket, blockN, k) + return fmt.Errorf("checkHistory failed: bucket=%s,block=%d,addr=%x", changeSetBucket, blockN, k) } - return true, nil + return nil }); err != nil { return err } diff --git a/cmd/integration/commands/testing.go b/cmd/integration/commands/testing.go index cd6e6a449a1..bc096adfc0c 100644 --- a/cmd/integration/commands/testing.go +++ b/cmd/integration/commands/testing.go @@ -10,11 +10,11 @@ import ( grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" - grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "github.com/ledgerwatch/erigon-lib/common" + + //grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" proto_testing "github.com/ledgerwatch/erigon-lib/gointerfaces/testing" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" "google.golang.org/grpc" @@ -42,7 +42,7 @@ var cmdTestCore = &cobra.Command{ Use: "test_core", Short: "Test server for testing core of Erigon or equivalent component", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common.RootContext() if err := testCore(ctx); err != nil { log.Error("Error", "err", err) @@ -56,7 +56,7 @@ var cmdTestCons = &cobra.Command{ Use: "test_cons", Short: "Integration test for consensus engine", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common.RootContext() if err := testCons(ctx); err != nil { log.Error("Error", "err", err) return err @@ -93,10 +93,10 @@ func grpcTestDriverServer(ctx context.Context, testingAddr string) (*TestDriverS streamInterceptors []grpc.StreamServerInterceptor unaryInterceptors []grpc.UnaryServerInterceptor ) - if metrics.Enabled { - streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) - unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) - } + //if metrics.Enabled { + // streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) + // unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) + //} streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) var grpcServer *grpc.Server @@ -109,6 +109,12 @@ func grpcTestDriverServer(ctx context.Context, testingAddr string) (*TestDriverS grpc.KeepaliveParams(keepalive.ServerParameters{ Time: 10 * time.Minute, }), + // Don't drop the connection, settings accordign to this comment on GitHub + // https://github.com/grpc/grpc-go/issues/3171#issuecomment-552796779 + grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ + MinTime: 10 * time.Second, + PermitWithoutStream: true, + }), grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(streamInterceptors...)), grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(unaryInterceptors...)), } @@ -116,9 +122,9 @@ func grpcTestDriverServer(ctx context.Context, testingAddr string) (*TestDriverS testDriverServer := NewTestDriverServer(ctx) proto_testing.RegisterTestDriverServer(grpcServer, testDriverServer) - if metrics.Enabled { - grpc_prometheus.Register(grpcServer) - } + //if metrics.Enabled { + // grpc_prometheus.Register(grpcServer) + //} go func() { if err1 := grpcServer.Serve(lis); err1 != nil { log.Error("Test driver server fail", "err", err1) @@ -152,10 +158,10 @@ func grpcTestSentryServer(ctx context.Context, sentryAddr string) (*TestSentrySe streamInterceptors []grpc.StreamServerInterceptor unaryInterceptors []grpc.UnaryServerInterceptor ) - if metrics.Enabled { - streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) - unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) - } + //if metrics.Enabled { + // streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) + // unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) + //} streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) var grpcServer *grpc.Server @@ -175,9 +181,9 @@ func grpcTestSentryServer(ctx context.Context, sentryAddr string) (*TestSentrySe testSentryServer := NewTestSentryServer(ctx) proto_sentry.RegisterSentryServer(grpcServer, testSentryServer) - if metrics.Enabled { - grpc_prometheus.Register(grpcServer) - } + //if metrics.Enabled { + // grpc_prometheus.Register(grpcServer) + //} go func() { if err1 := grpcServer.Serve(lis); err1 != nil { log.Error("Test driver server fail", "err", err1) diff --git a/cmd/integration/main.go b/cmd/integration/main.go index 821876a7db1..e4c0c3e2684 100644 --- a/cmd/integration/main.go +++ b/cmd/integration/main.go @@ -4,13 +4,13 @@ import ( "fmt" "os" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon/cmd/integration/commands" - "github.com/ledgerwatch/erigon/cmd/utils" ) func main() { rootCmd := commands.RootCommand() - ctx, _ := utils.RootContext() + ctx, _ := common.RootContext() if err := rootCmd.ExecuteContext(ctx); err != nil { fmt.Println(err) diff --git a/cmd/observer/README.md b/cmd/observer/README.md new file mode 100644 index 00000000000..d094f06b3b8 --- /dev/null +++ b/cmd/observer/README.md @@ -0,0 +1,35 @@ +# Observer - P2P network crawler + +Observer crawls the Ethereum network and collects information about the nodes. + +### Build + + make observer + +### Run + + observer --datadir ... --nat extip: --port + +Where `IP` is your public IP, and `PORT` has to be open for incoming UDP traffic. + +See `observer --help` for available options. + +### Report + +To get the report about the currently known network state run: + + observer report --datadir ... + +## Description + +Observer uses [discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) protocol to discover new nodes. +Starting from a list of preconfigured "bootnodes" it uses FindNode +to obtain their "neighbor" nodes, and then recursively crawls neighbors of neighbors and so on. +Each found node is re-crawled again a few times. +If the node fails to be pinged after maximum attempts, it is considered "dead", but still re-crawled less often. + +A separate "diplomacy" process is doing "handshakes" to obtain information about the discovered nodes. +It tries to get [RLPx Hello](https://github.com/ethereum/devp2p/blob/master/rlpx.md#hello-0x00) +and [Eth Status](https://github.com/ethereum/devp2p/blob/master/caps/eth.md#status-0x00) +from each node. +The handshake repeats a few times according to the configured delays. diff --git a/cmd/observer/database/db.go b/cmd/observer/database/db.go new file mode 100644 index 00000000000..c64303ee10e --- /dev/null +++ b/cmd/observer/database/db.go @@ -0,0 +1,77 @@ +package database + +import ( + "context" + "io" + "net" + "time" +) + +type NodeID string + +type NodeAddr1 struct { + IP net.IP + PortDisc uint16 + PortRLPx uint16 +} + +type NodeAddr struct { + NodeAddr1 + IPv6 NodeAddr1 +} + +type HandshakeError struct { + StringCode string + Time time.Time +} + +type DB interface { + io.Closer + + UpsertNodeAddr(ctx context.Context, id NodeID, addr NodeAddr) error + FindNodeAddr(ctx context.Context, id NodeID) (*NodeAddr, error) + + ResetPingError(ctx context.Context, id NodeID) error + UpdatePingError(ctx context.Context, id NodeID) error + CountPingErrors(ctx context.Context, id NodeID) (*uint, error) + + UpdateClientID(ctx context.Context, id NodeID, clientID string) error + FindClientID(ctx context.Context, id NodeID) (*string, error) + UpdateNetworkID(ctx context.Context, id NodeID, networkID uint) error + UpdateEthVersion(ctx context.Context, id NodeID, ethVersion uint) error + UpdateHandshakeTransientError(ctx context.Context, id NodeID, hasTransientErr bool) error + InsertHandshakeError(ctx context.Context, id NodeID, handshakeErr string) error + DeleteHandshakeErrors(ctx context.Context, id NodeID) error + FindHandshakeLastErrors(ctx context.Context, id NodeID, limit uint) ([]HandshakeError, error) + UpdateHandshakeRetryTime(ctx context.Context, id NodeID, retryTime time.Time) error + FindHandshakeRetryTime(ctx context.Context, id NodeID) (*time.Time, error) + CountHandshakeCandidates(ctx context.Context) (uint, error) + FindHandshakeCandidates(ctx context.Context, limit uint) ([]NodeID, error) + MarkTakenHandshakeCandidates(ctx context.Context, nodes []NodeID) error + // TakeHandshakeCandidates runs FindHandshakeCandidates + MarkTakenHandshakeCandidates in a transaction. + TakeHandshakeCandidates(ctx context.Context, limit uint) ([]NodeID, error) + + UpdateForkCompatibility(ctx context.Context, id NodeID, isCompatFork bool) error + + UpdateNeighborBucketKeys(ctx context.Context, id NodeID, keys []string) error + FindNeighborBucketKeys(ctx context.Context, id NodeID) ([]string, error) + + UpdateSentryCandidatesLastEventTime(ctx context.Context, value time.Time) error + FindSentryCandidatesLastEventTime(ctx context.Context) (*time.Time, error) + + UpdateCrawlRetryTime(ctx context.Context, id NodeID, retryTime time.Time) error + CountCandidates(ctx context.Context) (uint, error) + FindCandidates(ctx context.Context, limit uint) ([]NodeID, error) + MarkTakenNodes(ctx context.Context, nodes []NodeID) error + // TakeCandidates runs FindCandidates + MarkTakenNodes in a transaction. + TakeCandidates(ctx context.Context, limit uint) ([]NodeID, error) + + IsConflictError(err error) bool + + CountNodes(ctx context.Context, maxPingTries uint, networkID uint) (uint, error) + CountIPs(ctx context.Context, maxPingTries uint, networkID uint) (uint, error) + CountClients(ctx context.Context, clientIDPrefix string, maxPingTries uint, networkID uint) (uint, error) + CountClientsWithNetworkID(ctx context.Context, clientIDPrefix string, maxPingTries uint) (uint, error) + CountClientsWithHandshakeTransientError(ctx context.Context, clientIDPrefix string, maxPingTries uint) (uint, error) + EnumerateClientIDs(ctx context.Context, maxPingTries uint, networkID uint, enumFunc func(clientID *string)) error +} diff --git a/cmd/observer/database/db_retrier.go b/cmd/observer/database/db_retrier.go new file mode 100644 index 00000000000..09674f2b2df --- /dev/null +++ b/cmd/observer/database/db_retrier.go @@ -0,0 +1,271 @@ +package database + +import ( + "context" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/log/v3" + "math/rand" + "time" +) + +type DBRetrier struct { + db DB + log log.Logger +} + +func NewDBRetrier(db DB, logger log.Logger) DBRetrier { + return DBRetrier{db, logger} +} + +func retryBackoffTime(attempt int) time.Duration { + if attempt <= 0 { + return 0 + } + jitter := rand.Int63n(30 * time.Millisecond.Nanoseconds() * int64(attempt)) + var ns int64 + if attempt <= 6 { + ns = ((50 * time.Millisecond.Nanoseconds()) << (attempt - 1)) + jitter + } else { + ns = 1600*time.Millisecond.Nanoseconds() + jitter + } + return time.Duration(ns) +} + +func (db DBRetrier) retry(ctx context.Context, opName string, op func(context.Context) (interface{}, error)) (interface{}, error) { + const retryCount = 40 + return utils.Retry(ctx, retryCount, retryBackoffTime, db.db.IsConflictError, db.log, opName, op) +} + +func (db DBRetrier) UpsertNodeAddr(ctx context.Context, id NodeID, addr NodeAddr) error { + _, err := db.retry(ctx, "UpsertNodeAddr", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpsertNodeAddr(ctx, id, addr) + }) + return err +} + +func (db DBRetrier) FindNodeAddr(ctx context.Context, id NodeID) (*NodeAddr, error) { + resultAny, err := db.retry(ctx, "FindNodeAddr", func(ctx context.Context) (interface{}, error) { + return db.db.FindNodeAddr(ctx, id) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.(*NodeAddr) + return result, err +} + +func (db DBRetrier) ResetPingError(ctx context.Context, id NodeID) error { + _, err := db.retry(ctx, "ResetPingError", func(ctx context.Context) (interface{}, error) { + return nil, db.db.ResetPingError(ctx, id) + }) + return err +} + +func (db DBRetrier) UpdatePingError(ctx context.Context, id NodeID) error { + _, err := db.retry(ctx, "UpdatePingError", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdatePingError(ctx, id) + }) + return err +} + +func (db DBRetrier) CountPingErrors(ctx context.Context, id NodeID) (*uint, error) { + resultAny, err := db.retry(ctx, "CountPingErrors", func(ctx context.Context) (interface{}, error) { + return db.db.CountPingErrors(ctx, id) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.(*uint) + return result, err +} + +func (db DBRetrier) UpdateClientID(ctx context.Context, id NodeID, clientID string) error { + _, err := db.retry(ctx, "UpdateClientID", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateClientID(ctx, id, clientID) + }) + return err +} + +func (db DBRetrier) FindClientID(ctx context.Context, id NodeID) (*string, error) { + resultAny, err := db.retry(ctx, "FindClientID", func(ctx context.Context) (interface{}, error) { + return db.db.FindClientID(ctx, id) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.(*string) + return result, err +} + +func (db DBRetrier) UpdateNetworkID(ctx context.Context, id NodeID, networkID uint) error { + _, err := db.retry(ctx, "UpdateNetworkID", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateNetworkID(ctx, id, networkID) + }) + return err +} + +func (db DBRetrier) UpdateEthVersion(ctx context.Context, id NodeID, ethVersion uint) error { + _, err := db.retry(ctx, "UpdateEthVersion", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateEthVersion(ctx, id, ethVersion) + }) + return err +} + +func (db DBRetrier) UpdateHandshakeTransientError(ctx context.Context, id NodeID, hasTransientErr bool) error { + _, err := db.retry(ctx, "UpdateHandshakeTransientError", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateHandshakeTransientError(ctx, id, hasTransientErr) + }) + return err +} + +func (db DBRetrier) InsertHandshakeError(ctx context.Context, id NodeID, handshakeErr string) error { + _, err := db.retry(ctx, "InsertHandshakeError", func(ctx context.Context) (interface{}, error) { + return nil, db.db.InsertHandshakeError(ctx, id, handshakeErr) + }) + return err +} + +func (db DBRetrier) DeleteHandshakeErrors(ctx context.Context, id NodeID) error { + _, err := db.retry(ctx, "DeleteHandshakeErrors", func(ctx context.Context) (interface{}, error) { + return nil, db.db.DeleteHandshakeErrors(ctx, id) + }) + return err +} + +func (db DBRetrier) FindHandshakeLastErrors(ctx context.Context, id NodeID, limit uint) ([]HandshakeError, error) { + resultAny, err := db.retry(ctx, "FindHandshakeLastErrors", func(ctx context.Context) (interface{}, error) { + return db.db.FindHandshakeLastErrors(ctx, id, limit) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.([]HandshakeError) + return result, err +} + +func (db DBRetrier) UpdateHandshakeRetryTime(ctx context.Context, id NodeID, retryTime time.Time) error { + _, err := db.retry(ctx, "UpdateHandshakeRetryTime", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateHandshakeRetryTime(ctx, id, retryTime) + }) + return err +} + +func (db DBRetrier) FindHandshakeRetryTime(ctx context.Context, id NodeID) (*time.Time, error) { + resultAny, err := db.retry(ctx, "FindHandshakeRetryTime", func(ctx context.Context) (interface{}, error) { + return db.db.FindHandshakeRetryTime(ctx, id) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.(*time.Time) + return result, err +} + +func (db DBRetrier) CountHandshakeCandidates(ctx context.Context) (uint, error) { + resultAny, err := db.retry(ctx, "CountHandshakeCandidates", func(ctx context.Context) (interface{}, error) { + return db.db.CountHandshakeCandidates(ctx) + }) + + if resultAny == nil { + return 0, err + } + result := resultAny.(uint) + return result, err +} + +func (db DBRetrier) TakeHandshakeCandidates(ctx context.Context, limit uint) ([]NodeID, error) { + resultAny, err := db.retry(ctx, "TakeHandshakeCandidates", func(ctx context.Context) (interface{}, error) { + return db.db.TakeHandshakeCandidates(ctx, limit) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.([]NodeID) + return result, err +} + +func (db DBRetrier) UpdateForkCompatibility(ctx context.Context, id NodeID, isCompatFork bool) error { + _, err := db.retry(ctx, "UpdateForkCompatibility", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateForkCompatibility(ctx, id, isCompatFork) + }) + return err +} + +func (db DBRetrier) UpdateNeighborBucketKeys(ctx context.Context, id NodeID, keys []string) error { + _, err := db.retry(ctx, "UpdateNeighborBucketKeys", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateNeighborBucketKeys(ctx, id, keys) + }) + return err +} + +func (db DBRetrier) FindNeighborBucketKeys(ctx context.Context, id NodeID) ([]string, error) { + resultAny, err := db.retry(ctx, "FindNeighborBucketKeys", func(ctx context.Context) (interface{}, error) { + return db.db.FindNeighborBucketKeys(ctx, id) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.([]string) + return result, err +} + +func (db DBRetrier) UpdateSentryCandidatesLastEventTime(ctx context.Context, value time.Time) error { + _, err := db.retry(ctx, "UpdateSentryCandidatesLastEventTime", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateSentryCandidatesLastEventTime(ctx, value) + }) + return err +} + +func (db DBRetrier) FindSentryCandidatesLastEventTime(ctx context.Context) (*time.Time, error) { + resultAny, err := db.retry(ctx, "FindSentryCandidatesLastEventTime", func(ctx context.Context) (interface{}, error) { + return db.db.FindSentryCandidatesLastEventTime(ctx) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.(*time.Time) + return result, err +} + +func (db DBRetrier) UpdateCrawlRetryTime(ctx context.Context, id NodeID, retryTime time.Time) error { + _, err := db.retry(ctx, "UpdateCrawlRetryTime", func(ctx context.Context) (interface{}, error) { + return nil, db.db.UpdateCrawlRetryTime(ctx, id, retryTime) + }) + return err +} + +func (db DBRetrier) CountCandidates(ctx context.Context) (uint, error) { + resultAny, err := db.retry(ctx, "CountCandidates", func(ctx context.Context) (interface{}, error) { + return db.db.CountCandidates(ctx) + }) + + if resultAny == nil { + return 0, err + } + result := resultAny.(uint) + return result, err +} + +func (db DBRetrier) TakeCandidates(ctx context.Context, limit uint) ([]NodeID, error) { + resultAny, err := db.retry(ctx, "TakeCandidates", func(ctx context.Context) (interface{}, error) { + return db.db.TakeCandidates(ctx, limit) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.([]NodeID) + return result, err +} + +func (db DBRetrier) IsConflictError(err error) bool { + return db.db.IsConflictError(err) +} diff --git a/cmd/observer/database/db_sqlite.go b/cmd/observer/database/db_sqlite.go new file mode 100644 index 00000000000..b59e33974f6 --- /dev/null +++ b/cmd/observer/database/db_sqlite.go @@ -0,0 +1,927 @@ +package database + +import ( + "context" + "database/sql" + "errors" + "fmt" + _ "modernc.org/sqlite" + "net" + "strings" + "time" +) + +type DBSQLite struct { + db *sql.DB +} + +// language=SQL +const ( + sqlCreateSchema = ` +PRAGMA journal_mode = WAL; + +CREATE TABLE IF NOT EXISTS nodes ( + id TEXT PRIMARY KEY, + + ip TEXT, + port_disc INTEGER, + port_rlpx INTEGER, + ip_v6 TEXT, + ip_v6_port_disc INTEGER, + ip_v6_port_rlpx INTEGER, + addr_updated INTEGER NOT NULL, + + ping_try INTEGER NOT NULL DEFAULT 0, + + compat_fork INTEGER, + compat_fork_updated INTEGER, + + client_id TEXT, + network_id INTEGER, + eth_version INTEGER, + handshake_transient_err INTEGER NOT NULL DEFAULT 0, + handshake_updated INTEGER, + handshake_retry_time INTEGER, + + neighbor_keys TEXT, + + crawl_retry_time INTEGER +); + +CREATE TABLE IF NOT EXISTS handshake_errors ( + id TEXT NOT NULL, + err TEXT NOT NULL, + updated INTEGER NOT NULL +); + +CREATE TABLE IF NOT EXISTS sentry_candidates_intake ( + id INTEGER PRIMARY KEY, + last_event_time INTEGER NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_nodes_crawl_retry_time ON nodes (crawl_retry_time); +CREATE INDEX IF NOT EXISTS idx_nodes_ip ON nodes (ip); +CREATE INDEX IF NOT EXISTS idx_nodes_ip_v6 ON nodes (ip_v6); +CREATE INDEX IF NOT EXISTS idx_nodes_ping_try ON nodes (ping_try); +CREATE INDEX IF NOT EXISTS idx_nodes_compat_fork ON nodes (compat_fork); +CREATE INDEX IF NOT EXISTS idx_nodes_network_id ON nodes (network_id); +CREATE INDEX IF NOT EXISTS idx_nodes_handshake_retry_time ON nodes (handshake_retry_time); +CREATE INDEX IF NOT EXISTS idx_handshake_errors_id ON handshake_errors (id); +` + + sqlUpsertNodeAddr = ` +INSERT INTO nodes( + id, + ip, + port_disc, + port_rlpx, + ip_v6, + ip_v6_port_disc, + ip_v6_port_rlpx, + addr_updated +) VALUES (?, ?, ?, ?, ?, ?, ?, ?) +ON CONFLICT(id) DO UPDATE SET + ip = excluded.ip, + port_disc = excluded.port_disc, + port_rlpx = excluded.port_rlpx, + ip_v6 = excluded.ip_v6, + ip_v6_port_disc = excluded.ip_v6_port_disc, + ip_v6_port_rlpx = excluded.ip_v6_port_rlpx, + addr_updated = excluded.addr_updated +` + + sqlFindNodeAddr = ` +SELECT + ip, + port_disc, + port_rlpx, + ip_v6, + ip_v6_port_disc, + ip_v6_port_rlpx +FROM nodes +WHERE id = ? +` + + sqlResetPingError = ` +UPDATE nodes SET ping_try = 0 WHERE id = ? +` + + sqlUpdatePingError = ` +UPDATE nodes SET ping_try = nodes.ping_try + 1 WHERE id = ? +` + + sqlCountPingErrors = ` +SELECT ping_try FROM nodes WHERE id = ? +` + + sqlUpdateClientID = ` +UPDATE nodes SET + client_id = ?, + handshake_updated = ? +WHERE id = ? +` + + sqlFindClientID = ` +SELECT client_id FROM nodes WHERE id = ? +` + + sqlUpdateNetworkID = ` +UPDATE nodes SET + network_id = ?, + handshake_updated = ? +WHERE id = ? +` + + sqlUpdateEthVersion = ` +UPDATE nodes SET + eth_version = ?, + handshake_updated = ? +WHERE id = ? +` + + sqlUpdateHandshakeTransientError = ` +UPDATE nodes SET + handshake_transient_err = ?, + handshake_updated = ? +WHERE id = ? +` + + sqlInsertHandshakeError = ` +INSERT INTO handshake_errors( + id, + err, + updated +) VALUES (?, ?, ?) +` + + sqlDeleteHandshakeErrors = ` +DELETE FROM handshake_errors WHERE id = ? +` + + sqlFindHandshakeLastErrors = ` +SELECT err, updated FROM handshake_errors +WHERE id = ? +ORDER BY updated DESC +LIMIT ? +` + + sqlUpdateHandshakeRetryTime = ` +UPDATE nodes SET handshake_retry_time = ? WHERE id = ? +` + + sqlFindHandshakeRetryTime = ` +SELECT handshake_retry_time FROM nodes WHERE id = ? +` + + sqlCountHandshakeCandidates = ` +SELECT COUNT(*) FROM nodes +WHERE ((handshake_retry_time IS NULL) OR (handshake_retry_time < ?)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +` + + sqlFindHandshakeCandidates = ` +SELECT id FROM nodes +WHERE ((handshake_retry_time IS NULL) OR (handshake_retry_time < ?)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +ORDER BY handshake_retry_time +LIMIT ? +` + + sqlMarkTakenHandshakeCandidates = ` +UPDATE nodes SET handshake_retry_time = ? WHERE id IN (123) +` + + sqlUpdateForkCompatibility = ` +UPDATE nodes SET compat_fork = ?, compat_fork_updated = ? WHERE id = ? +` + + sqlUpdateNeighborBucketKeys = ` +UPDATE nodes SET neighbor_keys = ? WHERE id = ? +` + + sqlFindNeighborBucketKeys = ` +SELECT neighbor_keys FROM nodes WHERE id = ? +` + + sqlUpdateSentryCandidatesLastEventTime = ` +INSERT INTO sentry_candidates_intake( + id, + last_event_time +) VALUES (0, ?) +ON CONFLICT(id) DO UPDATE SET + last_event_time = excluded.last_event_time +` + + sqlFindSentryCandidatesLastEventTime = ` +SELECT last_event_time FROM sentry_candidates_intake WHERE id = 0 +` + + sqlUpdateCrawlRetryTime = ` +UPDATE nodes SET crawl_retry_time = ? WHERE id = ? +` + + sqlCountCandidates = ` +SELECT COUNT(*) FROM nodes +WHERE ((crawl_retry_time IS NULL) OR (crawl_retry_time < ?)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +` + + sqlFindCandidates = ` +SELECT id FROM nodes +WHERE ((crawl_retry_time IS NULL) OR (crawl_retry_time < ?)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +ORDER BY crawl_retry_time +LIMIT ? +` + + sqlMarkTakenNodes = ` +UPDATE nodes SET crawl_retry_time = ? WHERE id IN (123) +` + + sqlCountNodes = ` +SELECT COUNT(*) FROM nodes +WHERE (ping_try < ?) + AND ((network_id = ?) OR (network_id IS NULL)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +` + + sqlCountIPs = ` +SELECT COUNT(DISTINCT ip) FROM nodes +WHERE (ping_try < ?) + AND ((network_id = ?) OR (network_id IS NULL)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +` + + sqlCountClients = ` +SELECT COUNT(*) FROM nodes +WHERE (ping_try < ?) + AND (network_id = ?) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) + AND (client_id LIKE ?) +` + + sqlCountClientsWithNetworkID = ` +SELECT COUNT(*) FROM nodes +WHERE (ping_try < ?) + AND (network_id IS NOT NULL) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) + AND (client_id LIKE ?) +` + + sqlCountClientsWithHandshakeTransientError = ` +SELECT COUNT(*) FROM nodes +WHERE (ping_try < ?) + AND (handshake_transient_err = 1) + AND (network_id IS NULL) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) + AND (client_id LIKE ?) +` + + sqlEnumerateClientIDs = ` +SELECT client_id FROM nodes +WHERE (ping_try < ?) + AND ((network_id = ?) OR (network_id IS NULL)) + AND ((compat_fork == TRUE) OR (compat_fork IS NULL)) +` +) + +func NewDBSQLite(filePath string) (*DBSQLite, error) { + db, err := sql.Open("sqlite", filePath) + if err != nil { + return nil, fmt.Errorf("failed to open DB: %w", err) + } + + _, err = db.Exec(sqlCreateSchema) + if err != nil { + return nil, fmt.Errorf("failed to create the DB schema: %w", err) + } + + instance := DBSQLite{db} + return &instance, nil +} + +func (db *DBSQLite) Close() error { + return db.db.Close() +} + +func (db *DBSQLite) UpsertNodeAddr(ctx context.Context, id NodeID, addr NodeAddr) error { + var ip *string + if addr.IP != nil { + value := addr.IP.String() + ip = &value + } + + var ipV6 *string + if addr.IPv6.IP != nil { + value := addr.IPv6.IP.String() + ipV6 = &value + } + + var portDisc *int + if (ip != nil) && (addr.PortDisc != 0) { + value := int(addr.PortDisc) + portDisc = &value + } + + var ipV6PortDisc *int + if (ipV6 != nil) && (addr.IPv6.PortDisc != 0) { + value := int(addr.IPv6.PortDisc) + ipV6PortDisc = &value + } + + var portRLPx *int + if (ip != nil) && (addr.PortRLPx != 0) { + value := int(addr.PortRLPx) + portRLPx = &value + } + + var ipV6PortRLPx *int + if (ipV6 != nil) && (addr.IPv6.PortRLPx != 0) { + value := int(addr.IPv6.PortRLPx) + ipV6PortRLPx = &value + } + + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlUpsertNodeAddr, + id, + ip, portDisc, portRLPx, + ipV6, ipV6PortDisc, ipV6PortRLPx, + updated) + if err != nil { + return fmt.Errorf("failed to upsert a node address: %w", err) + } + return nil +} + +func (db *DBSQLite) FindNodeAddr(ctx context.Context, id NodeID) (*NodeAddr, error) { + row := db.db.QueryRowContext(ctx, sqlFindNodeAddr, id) + + var ip sql.NullString + var portDisc sql.NullInt32 + var portRLPx sql.NullInt32 + var ipV6 sql.NullString + var ipV6PortDisc sql.NullInt32 + var ipV6PortRLPx sql.NullInt32 + + err := row.Scan( + &ip, + &portDisc, + &portRLPx, + &ipV6, + &ipV6PortDisc, + &ipV6PortRLPx) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("FindNodeAddr failed: %w", err) + } + + var addr NodeAddr + + if ip.Valid { + value := net.ParseIP(ip.String) + if value == nil { + return nil, errors.New("FindNodeAddr failed to parse IP") + } + addr.IP = value + } + if ipV6.Valid { + value := net.ParseIP(ipV6.String) + if value == nil { + return nil, errors.New("FindNodeAddr failed to parse IPv6") + } + addr.IPv6.IP = value + } + if portDisc.Valid { + value := uint16(portDisc.Int32) + addr.PortDisc = value + } + if portRLPx.Valid { + value := uint16(portRLPx.Int32) + addr.PortRLPx = value + } + if ipV6PortDisc.Valid { + value := uint16(ipV6PortDisc.Int32) + addr.IPv6.PortDisc = value + } + if ipV6PortRLPx.Valid { + value := uint16(ipV6PortRLPx.Int32) + addr.IPv6.PortRLPx = value + } + + return &addr, nil +} + +func (db *DBSQLite) ResetPingError(ctx context.Context, id NodeID) error { + _, err := db.db.ExecContext(ctx, sqlResetPingError, id) + if err != nil { + return fmt.Errorf("ResetPingError failed: %w", err) + } + return nil +} + +func (db *DBSQLite) UpdatePingError(ctx context.Context, id NodeID) error { + _, err := db.db.ExecContext(ctx, sqlUpdatePingError, id) + if err != nil { + return fmt.Errorf("UpdatePingError failed: %w", err) + } + return nil +} + +func (db *DBSQLite) CountPingErrors(ctx context.Context, id NodeID) (*uint, error) { + row := db.db.QueryRowContext(ctx, sqlCountPingErrors, id) + var count uint + if err := row.Scan(&count); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("CountPingErrors failed: %w", err) + } + return &count, nil +} + +func (db *DBSQLite) UpdateClientID(ctx context.Context, id NodeID, clientID string) error { + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlUpdateClientID, clientID, updated, id) + if err != nil { + return fmt.Errorf("UpdateClientID failed to update a node: %w", err) + } + return nil +} + +func (db *DBSQLite) FindClientID(ctx context.Context, id NodeID) (*string, error) { + row := db.db.QueryRowContext(ctx, sqlFindClientID, id) + var clientID sql.NullString + err := row.Scan(&clientID) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("FindClientID failed: %w", err) + } + if clientID.Valid { + return &clientID.String, nil + } + return nil, nil +} + +func (db *DBSQLite) UpdateNetworkID(ctx context.Context, id NodeID, networkID uint) error { + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlUpdateNetworkID, networkID, updated, id) + if err != nil { + return fmt.Errorf("UpdateNetworkID failed: %w", err) + } + return nil +} + +func (db *DBSQLite) UpdateEthVersion(ctx context.Context, id NodeID, ethVersion uint) error { + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlUpdateEthVersion, ethVersion, updated, id) + if err != nil { + return fmt.Errorf("UpdateEthVersion failed: %w", err) + } + return nil +} + +func (db *DBSQLite) UpdateHandshakeTransientError(ctx context.Context, id NodeID, hasTransientErr bool) error { + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlUpdateHandshakeTransientError, hasTransientErr, updated, id) + if err != nil { + return fmt.Errorf("UpdateHandshakeTransientError failed: %w", err) + } + return nil +} + +func (db *DBSQLite) InsertHandshakeError(ctx context.Context, id NodeID, handshakeErr string) error { + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlInsertHandshakeError, id, handshakeErr, updated) + if err != nil { + return fmt.Errorf("InsertHandshakeError failed: %w", err) + } + return nil +} + +func (db *DBSQLite) DeleteHandshakeErrors(ctx context.Context, id NodeID) error { + _, err := db.db.ExecContext(ctx, sqlDeleteHandshakeErrors, id) + if err != nil { + return fmt.Errorf("DeleteHandshakeErrors failed: %w", err) + } + return nil +} + +func (db *DBSQLite) FindHandshakeLastErrors(ctx context.Context, id NodeID, limit uint) ([]HandshakeError, error) { + cursor, err := db.db.QueryContext( + ctx, + sqlFindHandshakeLastErrors, + id, + limit) + if err != nil { + return nil, fmt.Errorf("FindHandshakeLastErrors failed to query: %w", err) + } + defer func() { + _ = cursor.Close() + }() + + var handshakeErrors []HandshakeError + for cursor.Next() { + var stringCode string + var updatedTimestamp int64 + err := cursor.Scan(&stringCode, &updatedTimestamp) + if err != nil { + return nil, fmt.Errorf("FindHandshakeLastErrors failed to read data: %w", err) + } + + handshakeError := HandshakeError{ + stringCode, + time.Unix(updatedTimestamp, 0), + } + + handshakeErrors = append(handshakeErrors, handshakeError) + } + + if err := cursor.Err(); err != nil { + return nil, fmt.Errorf("FindHandshakeLastErrors failed to iterate over rows: %w", err) + } + return handshakeErrors, nil +} + +func (db *DBSQLite) UpdateHandshakeRetryTime(ctx context.Context, id NodeID, retryTime time.Time) error { + _, err := db.db.ExecContext(ctx, sqlUpdateHandshakeRetryTime, retryTime.Unix(), id) + if err != nil { + return fmt.Errorf("UpdateHandshakeRetryTime failed: %w", err) + } + return nil +} + +func (db *DBSQLite) FindHandshakeRetryTime(ctx context.Context, id NodeID) (*time.Time, error) { + row := db.db.QueryRowContext(ctx, sqlFindHandshakeRetryTime, id) + + var timestamp sql.NullInt64 + + if err := row.Scan(×tamp); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("FindHandshakeRetryTime failed: %w", err) + } + + // if never we tried to handshake then the time is NULL + if !timestamp.Valid { + return nil, nil + } + + retryTime := time.Unix(timestamp.Int64, 0) + return &retryTime, nil +} + +func (db *DBSQLite) CountHandshakeCandidates(ctx context.Context) (uint, error) { + retryTimeBefore := time.Now().Unix() + row := db.db.QueryRowContext(ctx, sqlCountHandshakeCandidates, retryTimeBefore) + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountHandshakeCandidates failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) FindHandshakeCandidates( + ctx context.Context, + limit uint, +) ([]NodeID, error) { + retryTimeBefore := time.Now().Unix() + cursor, err := db.db.QueryContext( + ctx, + sqlFindHandshakeCandidates, + retryTimeBefore, + limit) + if err != nil { + return nil, fmt.Errorf("FindHandshakeCandidates failed to query candidates: %w", err) + } + defer func() { + _ = cursor.Close() + }() + + var nodes []NodeID + for cursor.Next() { + var id string + err := cursor.Scan(&id) + if err != nil { + return nil, fmt.Errorf("FindHandshakeCandidates failed to read candidate data: %w", err) + } + + nodes = append(nodes, NodeID(id)) + } + + if err := cursor.Err(); err != nil { + return nil, fmt.Errorf("FindHandshakeCandidates failed to iterate over candidates: %w", err) + } + return nodes, nil +} + +func (db *DBSQLite) MarkTakenHandshakeCandidates(ctx context.Context, ids []NodeID) error { + if len(ids) == 0 { + return nil + } + + delayedRetryTime := time.Now().Add(time.Hour).Unix() + + idsPlaceholders := strings.TrimRight(strings.Repeat("?,", len(ids)), ",") + query := strings.Replace(sqlMarkTakenHandshakeCandidates, "123", idsPlaceholders, 1) + args := append([]interface{}{delayedRetryTime}, stringsToAny(ids)...) + + _, err := db.db.ExecContext(ctx, query, args...) + if err != nil { + return fmt.Errorf("failed to mark taken handshake candidates: %w", err) + } + return nil +} + +func (db *DBSQLite) TakeHandshakeCandidates( + ctx context.Context, + limit uint, +) ([]NodeID, error) { + tx, err := db.db.BeginTx(ctx, nil) + if err != nil { + return nil, fmt.Errorf("TakeHandshakeCandidates failed to start transaction: %w", err) + } + + ids, err := db.FindHandshakeCandidates( + ctx, + limit) + if err != nil { + _ = tx.Rollback() + return nil, err + } + + err = db.MarkTakenHandshakeCandidates(ctx, ids) + if err != nil { + _ = tx.Rollback() + return nil, err + } + + err = tx.Commit() + if err != nil { + return nil, fmt.Errorf("TakeHandshakeCandidates failed to commit transaction: %w", err) + } + return ids, nil +} + +func (db *DBSQLite) UpdateForkCompatibility(ctx context.Context, id NodeID, isCompatFork bool) error { + updated := time.Now().Unix() + + _, err := db.db.ExecContext(ctx, sqlUpdateForkCompatibility, isCompatFork, updated, id) + if err != nil { + return fmt.Errorf("UpdateForkCompatibility failed to update a node: %w", err) + } + return nil +} + +func (db *DBSQLite) UpdateNeighborBucketKeys(ctx context.Context, id NodeID, keys []string) error { + keysStr := strings.Join(keys, ",") + + _, err := db.db.ExecContext(ctx, sqlUpdateNeighborBucketKeys, keysStr, id) + if err != nil { + return fmt.Errorf("UpdateNeighborBucketKeys failed to update a node: %w", err) + } + return nil +} + +func (db *DBSQLite) FindNeighborBucketKeys(ctx context.Context, id NodeID) ([]string, error) { + row := db.db.QueryRowContext(ctx, sqlFindNeighborBucketKeys, id) + + var keysStr sql.NullString + if err := row.Scan(&keysStr); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("FindNeighborBucketKeys failed: %w", err) + } + + if !keysStr.Valid { + return nil, nil + } + return strings.Split(keysStr.String, ","), nil +} + +func (db *DBSQLite) UpdateSentryCandidatesLastEventTime(ctx context.Context, value time.Time) error { + _, err := db.db.ExecContext(ctx, sqlUpdateSentryCandidatesLastEventTime, value.Unix()) + if err != nil { + return fmt.Errorf("UpdateSentryCandidatesLastEventTime failed: %w", err) + } + return nil +} + +func (db *DBSQLite) FindSentryCandidatesLastEventTime(ctx context.Context) (*time.Time, error) { + row := db.db.QueryRowContext(ctx, sqlFindSentryCandidatesLastEventTime) + + var timestamp sql.NullInt64 + if err := row.Scan(×tamp); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return nil, fmt.Errorf("FindSentryCandidatesLastEventTime failed: %w", err) + } + + value := time.Unix(timestamp.Int64, 0) + return &value, nil +} + +func (db *DBSQLite) UpdateCrawlRetryTime(ctx context.Context, id NodeID, retryTime time.Time) error { + _, err := db.db.ExecContext(ctx, sqlUpdateCrawlRetryTime, retryTime.Unix(), id) + if err != nil { + return fmt.Errorf("UpdateCrawlRetryTime failed: %w", err) + } + return nil +} + +func (db *DBSQLite) CountCandidates(ctx context.Context) (uint, error) { + retryTimeBefore := time.Now().Unix() + row := db.db.QueryRowContext(ctx, sqlCountCandidates, retryTimeBefore) + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountCandidates failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) FindCandidates( + ctx context.Context, + limit uint, +) ([]NodeID, error) { + retryTimeBefore := time.Now().Unix() + cursor, err := db.db.QueryContext( + ctx, + sqlFindCandidates, + retryTimeBefore, + limit) + if err != nil { + return nil, fmt.Errorf("FindCandidates failed to query candidates: %w", err) + } + defer func() { + _ = cursor.Close() + }() + + var nodes []NodeID + for cursor.Next() { + var id string + err := cursor.Scan(&id) + if err != nil { + return nil, fmt.Errorf("FindCandidates failed to read candidate data: %w", err) + } + + nodes = append(nodes, NodeID(id)) + } + + if err := cursor.Err(); err != nil { + return nil, fmt.Errorf("FindCandidates failed to iterate over candidates: %w", err) + } + return nodes, nil +} + +func (db *DBSQLite) MarkTakenNodes(ctx context.Context, ids []NodeID) error { + if len(ids) == 0 { + return nil + } + + delayedRetryTime := time.Now().Add(time.Hour).Unix() + + idsPlaceholders := strings.TrimRight(strings.Repeat("?,", len(ids)), ",") + query := strings.Replace(sqlMarkTakenNodes, "123", idsPlaceholders, 1) + args := append([]interface{}{delayedRetryTime}, stringsToAny(ids)...) + + _, err := db.db.ExecContext(ctx, query, args...) + if err != nil { + return fmt.Errorf("failed to mark taken nodes: %w", err) + } + return nil +} + +func (db *DBSQLite) TakeCandidates( + ctx context.Context, + limit uint, +) ([]NodeID, error) { + tx, err := db.db.BeginTx(ctx, nil) + if err != nil { + return nil, fmt.Errorf("TakeCandidates failed to start transaction: %w", err) + } + + ids, err := db.FindCandidates( + ctx, + limit) + if err != nil { + _ = tx.Rollback() + return nil, err + } + + err = db.MarkTakenNodes(ctx, ids) + if err != nil { + _ = tx.Rollback() + return nil, err + } + + err = tx.Commit() + if err != nil { + return nil, fmt.Errorf("TakeCandidates failed to commit transaction: %w", err) + } + return ids, nil +} + +func (db *DBSQLite) IsConflictError(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), "SQLITE_BUSY") +} + +func (db *DBSQLite) CountNodes(ctx context.Context, maxPingTries uint, networkID uint) (uint, error) { + row := db.db.QueryRowContext(ctx, sqlCountNodes, maxPingTries, networkID) + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountNodes failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) CountIPs(ctx context.Context, maxPingTries uint, networkID uint) (uint, error) { + row := db.db.QueryRowContext(ctx, sqlCountIPs, maxPingTries, networkID) + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountIPs failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) CountClients(ctx context.Context, clientIDPrefix string, maxPingTries uint, networkID uint) (uint, error) { + row := db.db.QueryRowContext(ctx, sqlCountClients, maxPingTries, networkID, clientIDPrefix+"%") + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountClients failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) CountClientsWithNetworkID(ctx context.Context, clientIDPrefix string, maxPingTries uint) (uint, error) { + row := db.db.QueryRowContext(ctx, sqlCountClientsWithNetworkID, maxPingTries, clientIDPrefix+"%") + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountClientsWithNetworkID failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) CountClientsWithHandshakeTransientError(ctx context.Context, clientIDPrefix string, maxPingTries uint) (uint, error) { + row := db.db.QueryRowContext(ctx, sqlCountClientsWithHandshakeTransientError, maxPingTries, clientIDPrefix+"%") + var count uint + if err := row.Scan(&count); err != nil { + return 0, fmt.Errorf("CountClientsWithHandshakeTransientError failed: %w", err) + } + return count, nil +} + +func (db *DBSQLite) EnumerateClientIDs( + ctx context.Context, + maxPingTries uint, + networkID uint, + enumFunc func(clientID *string), +) error { + cursor, err := db.db.QueryContext(ctx, sqlEnumerateClientIDs, maxPingTries, networkID) + if err != nil { + return fmt.Errorf("EnumerateClientIDs failed to query: %w", err) + } + defer func() { + _ = cursor.Close() + }() + + for cursor.Next() { + var clientID sql.NullString + err := cursor.Scan(&clientID) + if err != nil { + return fmt.Errorf("EnumerateClientIDs failed to read data: %w", err) + } + if clientID.Valid { + enumFunc(&clientID.String) + } else { + enumFunc(nil) + } + } + + if err := cursor.Err(); err != nil { + return fmt.Errorf("EnumerateClientIDs failed to iterate: %w", err) + } + return nil +} + +func stringsToAny(strValues []NodeID) []interface{} { + values := make([]interface{}, 0, len(strValues)) + for _, value := range strValues { + values = append(values, value) + } + return values +} diff --git a/cmd/observer/database/db_sqlite_test.go b/cmd/observer/database/db_sqlite_test.go new file mode 100644 index 00000000000..c43e39f15be --- /dev/null +++ b/cmd/observer/database/db_sqlite_test.go @@ -0,0 +1,40 @@ +package database + +import ( + "context" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "net" + "path/filepath" + "testing" +) + +func TestDBSQLiteInsertAndFind(t *testing.T) { + ctx := context.Background() + db, err := NewDBSQLite(filepath.Join(t.TempDir(), "observer.sqlite")) + require.Nil(t, err) + defer func() { _ = db.Close() }() + + var id NodeID = "ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c" + var addr NodeAddr + addr.IP = net.ParseIP("10.0.1.16") + addr.PortRLPx = 30303 + addr.PortDisc = 30304 + + err = db.UpsertNodeAddr(ctx, id, addr) + require.Nil(t, err) + + candidates, err := db.FindCandidates(ctx, 1) + require.Nil(t, err) + require.Equal(t, 1, len(candidates)) + + candidateID := candidates[0] + assert.Equal(t, id, candidateID) + + candidate, err := db.FindNodeAddr(ctx, candidateID) + require.Nil(t, err) + + assert.Equal(t, addr.IP, candidate.IP) + assert.Equal(t, addr.PortDisc, candidate.PortDisc) + assert.Equal(t, addr.PortRLPx, candidate.PortRLPx) +} diff --git a/cmd/observer/main.go b/cmd/observer/main.go new file mode 100644 index 00000000000..7063beb4219 --- /dev/null +++ b/cmd/observer/main.go @@ -0,0 +1,119 @@ +package main + +import ( + "context" + "errors" + "fmt" + "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/observer" + "github.com/ledgerwatch/erigon/cmd/observer/reports" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/log/v3" + "path/filepath" +) + +func mainWithFlags(ctx context.Context, flags observer.CommandFlags) error { + server, err := observer.NewServer(flags) + if err != nil { + return err + } + + db, err := database.NewDBSQLite(filepath.Join(flags.DataDir, "observer.sqlite")) + if err != nil { + return err + } + defer func() { _ = db.Close() }() + + discV4, err := server.Listen(ctx) + if err != nil { + return err + } + + networkID := uint(params.NetworkIDByChainName(flags.Chain)) + go observer.StatusLoggerLoop(ctx, db, networkID, flags.StatusLogPeriod, log.Root()) + + crawlerConfig := observer.CrawlerConfig{ + Chain: flags.Chain, + Bootnodes: server.Bootnodes(), + PrivateKey: server.PrivateKey(), + ConcurrencyLimit: flags.CrawlerConcurrency, + RefreshTimeout: flags.RefreshTimeout, + MaxPingTries: flags.MaxPingTries, + StatusLogPeriod: flags.StatusLogPeriod, + + HandshakeRefreshTimeout: flags.HandshakeRefreshTimeout, + HandshakeRetryDelay: flags.HandshakeRetryDelay, + HandshakeMaxTries: flags.HandshakeMaxTries, + + KeygenTimeout: flags.KeygenTimeout, + KeygenConcurrency: flags.KeygenConcurrency, + + ErigonLogPath: flags.ErigonLogPath, + } + + crawler, err := observer.NewCrawler(discV4, db, crawlerConfig, log.Root()) + if err != nil { + return err + } + + return crawler.Run(ctx) +} + +func reportWithFlags(ctx context.Context, flags reports.CommandFlags) error { + db, err := database.NewDBSQLite(filepath.Join(flags.DataDir, "observer.sqlite")) + if err != nil { + return err + } + defer func() { _ = db.Close() }() + + networkID := uint(params.NetworkIDByChainName(flags.Chain)) + + if flags.Estimate { + report, err := reports.CreateClientsEstimateReport(ctx, db, flags.ClientsLimit, flags.MaxPingTries, networkID) + if err != nil { + return err + } + fmt.Println(report) + return nil + } + + if flags.SentryCandidates { + report, err := reports.CreateSentryCandidatesReport(ctx, db, flags.ErigonLogPath) + if err != nil { + return err + } + fmt.Println(report) + return nil + } + + statusReport, err := reports.CreateStatusReport(ctx, db, flags.MaxPingTries, networkID) + if err != nil { + return err + } + clientsReport, err := reports.CreateClientsReport(ctx, db, flags.ClientsLimit, flags.MaxPingTries, networkID) + if err != nil { + return err + } + + fmt.Println(statusReport) + fmt.Println(clientsReport) + return nil +} + +func main() { + ctx, cancel := common.RootContext() + defer cancel() + + command := observer.NewCommand() + + reportCommand := reports.NewCommand() + reportCommand.OnRun(reportWithFlags) + command.AddSubCommand(reportCommand.RawCommand()) + + err := command.ExecuteContext(ctx, mainWithFlags) + if (err != nil) && !errors.Is(err, context.Canceled) { + utils.Fatalf("%v", err) + } +} diff --git a/cmd/observer/observer/client_id.go b/cmd/observer/observer/client_id.go new file mode 100644 index 00000000000..2dec521ac29 --- /dev/null +++ b/cmd/observer/observer/client_id.go @@ -0,0 +1,133 @@ +package observer + +import "strings" + +func clientNameBlacklist() []string { + return []string{ + // bor/v0.2.14-stable-9edb2836/linux-amd64/go1.17.7 + // https://polygon.technology + "bor", + + // Cypher/v1.9.24-unstable-a7d8c0f9/linux-amd64/go1.11 + // unknown, but it's likely outdated since almost all nodes are running on go 1.11 (2018) + "Cypher", + + // Ecoball/v1.0.2-stable-ac03aee-20211125/x86_64-linux-gnu/rustc1.52.1 + // https://ecoball.org + "Ecoball", + + // egem/v1.1.4-titanus-9b056f56-20210808/linux-amd64/go1.15.13 + // https://egem.io + "egem", + + // energi3/v3.1.1-stable/linux-amd64/go1.15.8 + // https://energi.world + "energi3", + + // Gdbix/v1.5.3-fluxdbix-f6911ea5/linux/go1.8.3 + // https://www.arabianchain.org + "Gdbix", + + // Gddm/v0.8.1-master-7155d9dd/linux-amd64/go1.9.2 + // unknown, but it's likely outdated since all nodes are running on go 1.9 (2017) + "Gddm", + + // Gero/v1.1.3-dev-f8efb930/linux-amd64/go1.13.4 + // https://sero.cash + "Gero", + + // Gesn/v0.3.13-stable-b6c12eb2/linux-amd64/go1.12.4 + // https://ethersocial.org + "Gesn", + + // Gexp/v1.10.8-stable-1eb55798/linux-amd64/go1.17 + // https://expanse.tech + "Gexp", + + // Gnekonium/v1.6.6-stable-820982d6/linux-amd64/go1.9.2 + // https://nekonium.github.io + "Gnekonium", + + // go-corex/v1.0.0-rc.1-6197c8bf-1638348709/linux-amd64/go1.17.3 + // https://www.corexchain.io + "go-corex", + + // go-opera/v1.1.0-rc.4-91951f74-1647353617/linux-amd64/go1.17.8 + // https://www.fantom.foundation + "go-opera", + + // go-photon/v1.0.2-rc.5-32a52936-1646808549/linux-amd64/go1.17.8 + // https://github.com/TechPay-io/go-photon + "go-photon", + + // GoChain/v4.0.2/linux-amd64/go1.17.3 + // https://gochain.io + "GoChain", + + // gqdc/v1.5.2-stable-53b6a36d/linux-amd64/go1.13.4 + // https://quadrans.io + "gqdc", + + // Gtsf/v1.2.1-stable-df201e7e/linux-amd64/go1.13.4 + // https://tsf-network.com + "Gtsf", + + // Gubiq/v7.0.0-monoceros-c9009e89/linux-amd64/go1.17.6 + // https://ubiqsmart.com + "Gubiq", + + // Gvns/v3.2.0-unstable/linux-amd64/go1.12.4 + // https://github.com/AMTcommunity/go-vnscoin + "Gvns", + + // Moac/v2.1.5-stable-af7bea47/linux-amd64/go1.13.4 + // https://www.moac.io + "Moac", + + // pchain/linux-amd64/go1.13.3 + // http://pchain.org + "pchain", + + // Pirl/v1.9.12-v7-masternode-premium-lion-ea07aebf-20200407/linux-amd64/go1.13.6 + // https://pirl.io + "Pirl", + + // Q-Client/v1.0.8-stable/Geth/v1.10.8-stable-850a0145/linux-amd64/go1.16.15 + // https://q.org + "Q-Client", + + // qk_node/v1.10.16-stable-75ceb6c6-20220308/linux-amd64/go1.17.8 + // https://quarkblockchain.medium.com + "qk_node", + + // Quai/v1.10.10-unstable-b1b52e79-20220226/linux-amd64/go1.17.7 + // https://quai.network + "Quai", + + // REOSC/v2.2.4-unstable-6bcba06-20190321/x86_64-linux-gnu/rustc1.37.0 + // https://www.reosc.io + "REOSC", + + // ronin/v2.3.0-stable-f07cd8d1/linux-amd64/go1.15.5 + // https://wallet.roninchain.com + "ronin", + } +} + +func IsClientIDBlacklisted(clientID string) bool { + // some unknown clients return an empty string + if clientID == "" { + return true + } + for _, clientName := range clientNameBlacklist() { + if strings.HasPrefix(clientID, clientName) { + return true + } + } + return false +} + +func NameFromClientID(clientID string) string { + parts := strings.SplitN(clientID, "/", 2) + return parts[0] +} diff --git a/cmd/observer/observer/command.go b/cmd/observer/observer/command.go new file mode 100644 index 00000000000..24d1395483d --- /dev/null +++ b/cmd/observer/observer/command.go @@ -0,0 +1,245 @@ +package observer + +import ( + "context" + "errors" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/spf13/cobra" + "github.com/urfave/cli" + "runtime" + "time" +) + +type CommandFlags struct { + DataDir string + StatusLogPeriod time.Duration + + Chain string + Bootnodes string + + ListenPort int + NATDesc string + NetRestrict string + + NodeKeyFile string + NodeKeyHex string + + CrawlerConcurrency uint + RefreshTimeout time.Duration + MaxPingTries uint + + KeygenTimeout time.Duration + KeygenConcurrency uint + + HandshakeRefreshTimeout time.Duration + HandshakeRetryDelay time.Duration + HandshakeMaxTries uint + + ErigonLogPath string +} + +type Command struct { + command cobra.Command + flags CommandFlags +} + +func NewCommand() *Command { + command := cobra.Command{ + Short: "P2P network crawler", + } + + // debug flags + utils.CobraFlags(&command, append(debug.Flags, utils.MetricFlags...)) + + instance := Command{ + command: command, + } + + instance.withDatadir() + instance.withStatusLogPeriod() + + instance.withChain() + instance.withBootnodes() + + instance.withListenPort() + instance.withNAT() + instance.withNetRestrict() + + instance.withNodeKeyFile() + instance.withNodeKeyHex() + + instance.withCrawlerConcurrency() + instance.withRefreshTimeout() + instance.withMaxPingTries() + + instance.withKeygenTimeout() + instance.withKeygenConcurrency() + + instance.withHandshakeRefreshTimeout() + instance.withHandshakeRetryDelay() + instance.withHandshakeMaxTries() + + instance.withErigonLogPath() + + return &instance +} + +func (command *Command) withDatadir() { + flag := utils.DataDirFlag + command.command.Flags().StringVar(&command.flags.DataDir, flag.Name, flag.Value.String(), flag.Usage) + must(command.command.MarkFlagDirname(utils.DataDirFlag.Name)) +} + +func (command *Command) withStatusLogPeriod() { + flag := cli.DurationFlag{ + Name: "status-log-period", + Usage: "How often to log status summaries", + Value: 10 * time.Second, + } + command.command.Flags().DurationVar(&command.flags.StatusLogPeriod, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withChain() { + flag := utils.ChainFlag + command.command.Flags().StringVar(&command.flags.Chain, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withBootnodes() { + flag := utils.BootnodesFlag + command.command.Flags().StringVar(&command.flags.Bootnodes, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withListenPort() { + flag := utils.ListenPortFlag + command.command.Flags().IntVar(&command.flags.ListenPort, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withNAT() { + flag := utils.NATFlag + command.command.Flags().StringVar(&command.flags.NATDesc, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withNetRestrict() { + flag := utils.NetrestrictFlag + command.command.Flags().StringVar(&command.flags.NetRestrict, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withNodeKeyFile() { + flag := utils.NodeKeyFileFlag + command.command.Flags().StringVar(&command.flags.NodeKeyFile, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withNodeKeyHex() { + flag := utils.NodeKeyHexFlag + command.command.Flags().StringVar(&command.flags.NodeKeyHex, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withCrawlerConcurrency() { + flag := cli.UintFlag{ + Name: "crawler-concurrency", + Usage: "A number of maximum parallel node interrogations", + Value: uint(runtime.GOMAXPROCS(-1)) * 10, + } + command.command.Flags().UintVar(&command.flags.CrawlerConcurrency, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withRefreshTimeout() { + flag := cli.DurationFlag{ + Name: "refresh-timeout", + Usage: "A timeout to wait before considering to re-crawl a node", + Value: 2 * 24 * time.Hour, + } + command.command.Flags().DurationVar(&command.flags.RefreshTimeout, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withMaxPingTries() { + flag := cli.UintFlag{ + Name: "max-ping-tries", + Usage: "How many times to try PING before applying exponential back-off logic", + Value: 3, + } + command.command.Flags().UintVar(&command.flags.MaxPingTries, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withKeygenTimeout() { + flag := cli.DurationFlag{ + Name: "keygen-timeout", + Usage: "How much time can be used to generate node bucket keys", + Value: 2 * time.Second, + } + command.command.Flags().DurationVar(&command.flags.KeygenTimeout, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withKeygenConcurrency() { + flag := cli.UintFlag{ + Name: "keygen-concurrency", + Usage: "How many parallel goroutines can be used by the node bucket keys generator", + Value: 2, + } + command.command.Flags().UintVar(&command.flags.KeygenConcurrency, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withHandshakeRefreshTimeout() { + flag := cli.DurationFlag{ + Name: "handshake-refresh-timeout", + Usage: "When a node's handshake data is considered expired and needs to be re-crawled", + Value: 20 * 24 * time.Hour, + } + command.command.Flags().DurationVar(&command.flags.HandshakeRefreshTimeout, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withHandshakeRetryDelay() { + flag := cli.DurationFlag{ + Name: "handshake-retry-delay", + Usage: "How long to wait before retrying a failed handshake", + Value: 4 * time.Hour, + } + command.command.Flags().DurationVar(&command.flags.HandshakeRetryDelay, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withHandshakeMaxTries() { + flag := cli.UintFlag{ + Name: "handshake-max-tries", + Usage: "How many times to retry handshake before abandoning a candidate", + Value: 3, + } + command.command.Flags().UintVar(&command.flags.HandshakeMaxTries, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withErigonLogPath() { + flag := cli.StringFlag{ + Name: "erigon-log", + Usage: "Erigon log file path. Enables sentry candidates intake.", + } + command.command.Flags().StringVar(&command.flags.ErigonLogPath, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) ExecuteContext(ctx context.Context, runFunc func(ctx context.Context, flags CommandFlags) error) error { + command.command.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + // apply debug flags + return utils.SetupCobra(cmd) + } + command.command.PersistentPostRun = func(cmd *cobra.Command, args []string) { + debug.Exit() + } + command.command.RunE = func(cmd *cobra.Command, args []string) error { + defer debug.Exit() + err := runFunc(cmd.Context(), command.flags) + if errors.Is(err, context.Canceled) { + return nil + } + return err + } + return command.command.ExecuteContext(ctx) +} + +func (command *Command) AddSubCommand(subCommand *cobra.Command) { + command.command.AddCommand(subCommand) +} + +func must(err error) { + if err != nil { + panic(err) + } +} diff --git a/cmd/observer/observer/crawler.go b/cmd/observer/observer/crawler.go new file mode 100644 index 00000000000..bfdfa5881a5 --- /dev/null +++ b/cmd/observer/observer/crawler.go @@ -0,0 +1,530 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/observer/node_utils" + "github.com/ledgerwatch/erigon/cmd/observer/observer/sentry_candidates" + "sync/atomic" + "time" + + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/log/v3" + "golang.org/x/sync/semaphore" +) + +type Crawler struct { + transport DiscV4Transport + + db database.DBRetrier + saveQueue *utils.TaskQueue + + config CrawlerConfig + forkFilter forkid.Filter + + diplomacy *Diplomacy + + sentryCandidatesIntake *sentry_candidates.Intake + + log log.Logger +} + +type CrawlerConfig struct { + Chain string + Bootnodes []*enode.Node + PrivateKey *ecdsa.PrivateKey + ConcurrencyLimit uint + RefreshTimeout time.Duration + MaxPingTries uint + StatusLogPeriod time.Duration + + HandshakeRefreshTimeout time.Duration + HandshakeRetryDelay time.Duration + HandshakeMaxTries uint + + KeygenTimeout time.Duration + KeygenConcurrency uint + + ErigonLogPath string +} + +func NewCrawler( + transport DiscV4Transport, + db database.DB, + config CrawlerConfig, + logger log.Logger, +) (*Crawler, error) { + saveQueueLogFuncProvider := func(err error) func(msg string, ctx ...interface{}) { + if db.IsConflictError(err) { + return logger.Warn + } + return logger.Error + } + saveQueue := utils.NewTaskQueue("Crawler.saveQueue", config.ConcurrencyLimit*2, saveQueueLogFuncProvider) + + chain := config.Chain + chainConfig := params.ChainConfigByChainName(chain) + genesisHash := params.GenesisHashByChainName(chain) + if (chainConfig == nil) || (genesisHash == nil) { + return nil, fmt.Errorf("unknown chain %s", chain) + } + + forkFilter := forkid.NewStaticFilter(chainConfig, *genesisHash) + + diplomacy := NewDiplomacy( + database.NewDBRetrier(db, logger), + saveQueue, + config.PrivateKey, + config.ConcurrencyLimit, + config.HandshakeRefreshTimeout, + config.HandshakeRetryDelay, + config.HandshakeMaxTries, + config.StatusLogPeriod, + logger) + + var sentryCandidatesIntake *sentry_candidates.Intake + if config.ErigonLogPath != "" { + sentryCandidatesIntake = sentry_candidates.NewIntake( + config.ErigonLogPath, + database.NewDBRetrier(db, logger), + saveQueue, + chain, + config.HandshakeRefreshTimeout, + config.StatusLogPeriod, + logger) + } + + instance := Crawler{ + transport, + database.NewDBRetrier(db, logger), + saveQueue, + config, + forkFilter, + diplomacy, + sentryCandidatesIntake, + logger, + } + return &instance, nil +} + +func (crawler *Crawler) startSaveQueue(ctx context.Context) { + go crawler.saveQueue.Run(ctx) +} + +func (crawler *Crawler) startDiplomacy(ctx context.Context) { + go func() { + err := crawler.diplomacy.Run(ctx) + if (err != nil) && !errors.Is(err, context.Canceled) { + crawler.log.Error("Diplomacy has failed", "err", err) + } + }() +} + +func (crawler *Crawler) startSentryCandidatesIntake(ctx context.Context) { + go func() { + err := crawler.sentryCandidatesIntake.Run(ctx) + if (err != nil) && !errors.Is(err, context.Canceled) { + crawler.log.Error("Sentry candidates intake has failed", "err", err) + } + }() +} + +type candidateNode struct { + id database.NodeID + node *enode.Node +} + +func (crawler *Crawler) startSelectCandidates(ctx context.Context) <-chan candidateNode { + nodes := make(chan candidateNode) + go func() { + err := crawler.selectCandidates(ctx, nodes) + if (err != nil) && !errors.Is(err, context.Canceled) { + crawler.log.Error("Failed to select candidates", "err", err) + } + close(nodes) + }() + return nodes +} + +func (crawler *Crawler) selectCandidates(ctx context.Context, nodes chan<- candidateNode) error { + for _, node := range crawler.config.Bootnodes { + id, err := node_utils.NodeID(node) + if err != nil { + return fmt.Errorf("failed to get a bootnode ID: %w", err) + } + + select { + case <-ctx.Done(): + return ctx.Err() + case nodes <- candidateNode{id, node}: + } + } + + for ctx.Err() == nil { + candidates, err := crawler.db.TakeCandidates( + ctx, + crawler.config.ConcurrencyLimit) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to take candidates", "err", err) + } else { + return err + } + } + + if len(candidates) == 0 { + utils.Sleep(ctx, 1*time.Second) + } + + for _, id := range candidates { + select { + case <-ctx.Done(): + return ctx.Err() + case nodes <- candidateNode{id, nil}: + } + } + } + + return ctx.Err() +} + +func (crawler *Crawler) Run(ctx context.Context) error { + crawler.startSaveQueue(ctx) + crawler.startDiplomacy(ctx) + if crawler.sentryCandidatesIntake != nil { + crawler.startSentryCandidatesIntake(ctx) + } + + nodes := crawler.startSelectCandidates(ctx) + sem := semaphore.NewWeighted(int64(crawler.config.ConcurrencyLimit)) + // allow only 1 keygen at a time + keygenSem := semaphore.NewWeighted(int64(1)) + + crawledCount := 0 + crawledCountLogDate := time.Now() + foundPeersCountPtr := new(uint64) + + for candidate := range nodes { + if err := sem.Acquire(ctx, 1); err != nil { + if !errors.Is(err, context.Canceled) { + return fmt.Errorf("failed to acquire semaphore: %w", err) + } else { + break + } + } + + crawledCount++ + if time.Since(crawledCountLogDate) > crawler.config.StatusLogPeriod { + foundPeersCount := atomic.LoadUint64(foundPeersCountPtr) + + remainingCount, err := crawler.db.CountCandidates(ctx) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to count candidates", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to count candidates: %w", err) + } + + crawler.log.Info( + "Crawling", + "crawled", crawledCount, + "remaining", remainingCount, + "foundPeers", foundPeersCount, + ) + crawledCountLogDate = time.Now() + } + + id := candidate.id + node := candidate.node + + if node == nil { + nodeAddr, err := crawler.db.FindNodeAddr(ctx, id) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to get the node address", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to get the node address: %w", err) + } + + node, err = node_utils.MakeNodeFromAddr(id, *nodeAddr) + if err != nil { + return fmt.Errorf("failed to make node from node address: %w", err) + } + } + + nodeDesc := node.URLv4() + logger := crawler.log.New("node", nodeDesc) + + prevPingTries, err := crawler.db.CountPingErrors(ctx, id) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to count ping errors", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to count ping errors: %w", err) + } + if prevPingTries == nil { + prevPingTries = new(uint) + } + + handshakeNextRetryTime, err := crawler.db.FindHandshakeRetryTime(ctx, id) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to get handshake next retry time", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to get handshake next retry time: %w", err) + } + + handshakeLastErrors, err := crawler.db.FindHandshakeLastErrors(ctx, id, crawler.config.HandshakeMaxTries) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to get handshake last errors", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to get handshake last errors: %w", err) + } + + diplomat := NewDiplomat( + node, + crawler.config.PrivateKey, + handshakeLastErrors, + crawler.config.HandshakeRefreshTimeout, + crawler.config.HandshakeRetryDelay, + crawler.config.HandshakeMaxTries, + logger) + + keygenCachedHexKeys, err := crawler.db.FindNeighborBucketKeys(ctx, id) + if err != nil { + if crawler.db.IsConflictError(err) { + crawler.log.Warn("Failed to get neighbor bucket keys", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to get neighbor bucket keys: %w", err) + } + keygenCachedKeys, err := utils.ParseHexPublicKeys(keygenCachedHexKeys) + if err != nil { + return fmt.Errorf("failed to parse cached neighbor bucket keys: %w", err) + } + + interrogator, err := NewInterrogator( + node, + crawler.transport, + crawler.forkFilter, + diplomat, + handshakeNextRetryTime, + crawler.config.KeygenTimeout, + crawler.config.KeygenConcurrency, + keygenSem, + keygenCachedKeys, + logger) + if err != nil { + return fmt.Errorf("failed to create Interrogator for node %s: %w", nodeDesc, err) + } + + go func() { + defer sem.Release(1) + + result, err := interrogator.Run(ctx) + + isPingError := (err != nil) && (err.id == InterrogationErrorPing) + nextRetryTime := crawler.nextRetryTime(isPingError, *prevPingTries) + + var isCompatFork *bool + if result != nil { + isCompatFork = result.IsCompatFork + } else if (err != nil) && + ((err.id == InterrogationErrorIncompatibleForkID) || + (err.id == InterrogationErrorBlacklistedClientID)) { + isCompatFork = new(bool) + *isCompatFork = false + } + + var clientID *string + var handshakeRetryTime *time.Time + if (result != nil) && (result.HandshakeResult != nil) { + clientID = result.HandshakeResult.ClientID + handshakeRetryTime = result.HandshakeRetryTime + } else if (err != nil) && (err.id == InterrogationErrorBlacklistedClientID) { + clientID = new(string) + *clientID = err.wrappedErr.Error() + handshakeRetryTime = new(time.Time) + *handshakeRetryTime = time.Now().Add(crawler.config.HandshakeRefreshTimeout) + } + + if err != nil { + if !errors.Is(err, context.Canceled) { + var logFunc func(msg string, ctx ...interface{}) + switch err.id { + case InterrogationErrorPing: + fallthrough + case InterrogationErrorIncompatibleForkID: + fallthrough + case InterrogationErrorBlacklistedClientID: + fallthrough + case InterrogationErrorFindNodeTimeout: + logFunc = logger.Debug + default: + logFunc = logger.Warn + } + logFunc("Failed to interrogate node", "err", err) + } + } + + if result != nil { + peers := result.Peers + logger.Debug(fmt.Sprintf("Got %d peers", len(peers))) + atomic.AddUint64(foundPeersCountPtr, uint64(len(peers))) + } + + crawler.saveQueue.EnqueueTask(ctx, func(ctx context.Context) error { + return crawler.saveInterrogationResult( + ctx, + id, + result, + isPingError, + isCompatFork, + clientID, + handshakeRetryTime, + nextRetryTime) + }) + }() + } + return nil +} + +func (crawler *Crawler) saveInterrogationResult( + ctx context.Context, + id database.NodeID, + result *InterrogationResult, + isPingError bool, + isCompatFork *bool, + clientID *string, + handshakeRetryTime *time.Time, + nextRetryTime time.Time, +) error { + var peers []*enode.Node + if result != nil { + peers = result.Peers + } + + for _, peer := range peers { + peerID, err := node_utils.NodeID(peer) + if err != nil { + return fmt.Errorf("failed to get peer node ID: %w", err) + } + + dbErr := crawler.db.UpsertNodeAddr(ctx, peerID, node_utils.MakeNodeAddr(peer)) + if dbErr != nil { + return dbErr + } + } + + if (result != nil) && (len(result.KeygenKeys) >= 15) { + keygenHexKeys := utils.HexEncodePublicKeys(result.KeygenKeys) + dbErr := crawler.db.UpdateNeighborBucketKeys(ctx, id, keygenHexKeys) + if dbErr != nil { + return dbErr + } + } + + if isPingError { + dbErr := crawler.db.UpdatePingError(ctx, id) + if dbErr != nil { + return dbErr + } + } else { + dbErr := crawler.db.ResetPingError(ctx, id) + if dbErr != nil { + return dbErr + } + } + + if isCompatFork != nil { + dbErr := crawler.db.UpdateForkCompatibility(ctx, id, *isCompatFork) + if dbErr != nil { + return dbErr + } + } + + if clientID != nil { + dbErr := crawler.db.UpdateClientID(ctx, id, *clientID) + if dbErr != nil { + return dbErr + } + + dbErr = crawler.db.DeleteHandshakeErrors(ctx, id) + if dbErr != nil { + return dbErr + } + } + + if (result != nil) && (result.HandshakeResult != nil) && (result.HandshakeResult.NetworkID != nil) { + dbErr := crawler.db.UpdateNetworkID(ctx, id, uint(*result.HandshakeResult.NetworkID)) + if dbErr != nil { + return dbErr + } + } + + if (result != nil) && (result.HandshakeResult != nil) && (result.HandshakeResult.EthVersion != nil) { + dbErr := crawler.db.UpdateEthVersion(ctx, id, uint(*result.HandshakeResult.EthVersion)) + if dbErr != nil { + return dbErr + } + } + + if (result != nil) && (result.HandshakeResult != nil) && (result.HandshakeResult.HandshakeErr != nil) { + dbErr := crawler.db.InsertHandshakeError(ctx, id, result.HandshakeResult.HandshakeErr.StringCode()) + if dbErr != nil { + return dbErr + } + } + + if (result != nil) && (result.HandshakeResult != nil) { + dbErr := crawler.db.UpdateHandshakeTransientError(ctx, id, result.HandshakeResult.HasTransientErr) + if dbErr != nil { + return dbErr + } + } + + if handshakeRetryTime != nil { + dbErr := crawler.db.UpdateHandshakeRetryTime(ctx, id, *handshakeRetryTime) + if dbErr != nil { + return dbErr + } + } + + return crawler.db.UpdateCrawlRetryTime(ctx, id, nextRetryTime) +} + +func (crawler *Crawler) nextRetryTime(isPingError bool, prevPingTries uint) time.Time { + return time.Now().Add(crawler.nextRetryDelay(isPingError, prevPingTries)) +} + +func (crawler *Crawler) nextRetryDelay(isPingError bool, prevPingTries uint) time.Duration { + if !isPingError { + return crawler.config.RefreshTimeout + } + + pingTries := prevPingTries + 1 + if pingTries < crawler.config.MaxPingTries { + return crawler.config.RefreshTimeout + } + + // back off: double for each next retry + return crawler.config.RefreshTimeout << (pingTries - crawler.config.MaxPingTries + 1) +} diff --git a/cmd/observer/observer/diplomacy.go b/cmd/observer/observer/diplomacy.go new file mode 100644 index 00000000000..18be20f4fab --- /dev/null +++ b/cmd/observer/observer/diplomacy.go @@ -0,0 +1,253 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/observer/node_utils" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/log/v3" + "golang.org/x/sync/semaphore" + "sync/atomic" + "time" +) + +type Diplomacy struct { + db database.DBRetrier + saveQueue *utils.TaskQueue + + privateKey *ecdsa.PrivateKey + concurrencyLimit uint + refreshTimeout time.Duration + retryDelay time.Duration + maxHandshakeTries uint + + statusLogPeriod time.Duration + log log.Logger +} + +func NewDiplomacy( + db database.DBRetrier, + saveQueue *utils.TaskQueue, + privateKey *ecdsa.PrivateKey, + concurrencyLimit uint, + refreshTimeout time.Duration, + retryDelay time.Duration, + maxHandshakeTries uint, + statusLogPeriod time.Duration, + logger log.Logger, +) *Diplomacy { + instance := Diplomacy{ + db, + saveQueue, + privateKey, + concurrencyLimit, + refreshTimeout, + retryDelay, + maxHandshakeTries, + statusLogPeriod, + logger, + } + return &instance +} + +func (diplomacy *Diplomacy) startSelectCandidates(ctx context.Context) <-chan database.NodeID { + candidatesChan := make(chan database.NodeID) + go func() { + err := diplomacy.selectCandidates(ctx, candidatesChan) + if (err != nil) && !errors.Is(err, context.Canceled) { + diplomacy.log.Error("Failed to select handshake candidates", "err", err) + } + close(candidatesChan) + }() + return candidatesChan +} + +func (diplomacy *Diplomacy) selectCandidates(ctx context.Context, candidatesChan chan<- database.NodeID) error { + for ctx.Err() == nil { + candidates, err := diplomacy.db.TakeHandshakeCandidates( + ctx, + diplomacy.concurrencyLimit) + if err != nil { + if diplomacy.db.IsConflictError(err) { + diplomacy.log.Warn("Failed to take handshake candidates", "err", err) + } else { + return err + } + } + + if len(candidates) == 0 { + utils.Sleep(ctx, 1*time.Second) + } + + for _, id := range candidates { + select { + case <-ctx.Done(): + return ctx.Err() + case candidatesChan <- id: + } + } + } + + return ctx.Err() +} + +func (diplomacy *Diplomacy) Run(ctx context.Context) error { + candidatesChan := diplomacy.startSelectCandidates(ctx) + sem := semaphore.NewWeighted(int64(diplomacy.concurrencyLimit)) + + doneCount := 0 + statusLogDate := time.Now() + clientIDCountPtr := new(uint64) + + for id := range candidatesChan { + if err := sem.Acquire(ctx, 1); err != nil { + if !errors.Is(err, context.Canceled) { + return fmt.Errorf("failed to acquire semaphore: %w", err) + } else { + break + } + } + + doneCount++ + if time.Since(statusLogDate) > diplomacy.statusLogPeriod { + clientIDCount := atomic.LoadUint64(clientIDCountPtr) + + remainingCount, err := diplomacy.db.CountHandshakeCandidates(ctx) + if err != nil { + if diplomacy.db.IsConflictError(err) { + diplomacy.log.Warn("Failed to count handshake candidates", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to count handshake candidates: %w", err) + } + + diplomacy.log.Info( + "Handshaking", + "done", doneCount, + "remaining", remainingCount, + "clientIDs", clientIDCount, + ) + statusLogDate = time.Now() + } + + nodeAddr, err := diplomacy.db.FindNodeAddr(ctx, id) + if err != nil { + if diplomacy.db.IsConflictError(err) { + diplomacy.log.Warn("Failed to get the node address", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to get the node address: %w", err) + } + + node, err := node_utils.MakeNodeFromAddr(id, *nodeAddr) + if err != nil { + return fmt.Errorf("failed to make node from node address: %w", err) + } + + nodeDesc := node.URLv4() + logger := diplomacy.log.New("node", nodeDesc) + + handshakeLastErrors, err := diplomacy.db.FindHandshakeLastErrors(ctx, id, diplomacy.maxHandshakeTries) + if err != nil { + if diplomacy.db.IsConflictError(err) { + diplomacy.log.Warn("Failed to get handshake last errors", "err", err) + sem.Release(1) + continue + } + return fmt.Errorf("failed to get handshake last errors: %w", err) + } + + diplomat := NewDiplomat( + node, + diplomacy.privateKey, + handshakeLastErrors, + diplomacy.refreshTimeout, + diplomacy.retryDelay, + diplomacy.maxHandshakeTries, + logger) + + go func(id database.NodeID) { + defer sem.Release(1) + + result := diplomat.Run(ctx) + clientID := result.ClientID + + if clientID != nil { + atomic.AddUint64(clientIDCountPtr, 1) + } + + var isCompatFork *bool + if (clientID != nil) && IsClientIDBlacklisted(*clientID) { + isCompatFork = new(bool) + *isCompatFork = false + } + + nextRetryTime := diplomat.NextRetryTime(result.HandshakeErr) + + diplomacy.saveQueue.EnqueueTask(ctx, func(ctx context.Context) error { + return diplomacy.saveDiplomatResult(ctx, id, result, isCompatFork, nextRetryTime) + }) + }(id) + } + return nil +} + +func (diplomacy *Diplomacy) saveDiplomatResult( + ctx context.Context, + id database.NodeID, + result DiplomatResult, + isCompatFork *bool, + nextRetryTime time.Time, +) error { + if result.ClientID != nil { + dbErr := diplomacy.db.UpdateClientID(ctx, id, *result.ClientID) + if dbErr != nil { + return dbErr + } + + dbErr = diplomacy.db.DeleteHandshakeErrors(ctx, id) + if dbErr != nil { + return dbErr + } + } + + if result.NetworkID != nil { + dbErr := diplomacy.db.UpdateNetworkID(ctx, id, uint(*result.NetworkID)) + if dbErr != nil { + return dbErr + } + } + + if result.EthVersion != nil { + dbErr := diplomacy.db.UpdateEthVersion(ctx, id, uint(*result.EthVersion)) + if dbErr != nil { + return dbErr + } + } + + if result.HandshakeErr != nil { + dbErr := diplomacy.db.InsertHandshakeError(ctx, id, result.HandshakeErr.StringCode()) + if dbErr != nil { + return dbErr + } + } + + dbErr := diplomacy.db.UpdateHandshakeTransientError(ctx, id, result.HasTransientErr) + if dbErr != nil { + return dbErr + } + + if isCompatFork != nil { + dbErr := diplomacy.db.UpdateForkCompatibility(ctx, id, *isCompatFork) + if dbErr != nil { + return dbErr + } + } + + return diplomacy.db.UpdateHandshakeRetryTime(ctx, id, nextRetryTime) +} diff --git a/cmd/observer/observer/diplomat.go b/cmd/observer/observer/diplomat.go new file mode 100644 index 00000000000..9812b3bc037 --- /dev/null +++ b/cmd/observer/observer/diplomat.go @@ -0,0 +1,150 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "errors" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/p2p" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/log/v3" + "time" +) + +type Diplomat struct { + node *enode.Node + privateKey *ecdsa.PrivateKey + + handshakeLastErrors []database.HandshakeError + handshakeRefreshTimeout time.Duration + handshakeRetryDelay time.Duration + handshakeMaxTries uint + + log log.Logger +} + +type DiplomatResult struct { + ClientID *string + NetworkID *uint64 + EthVersion *uint32 + HandshakeErr *HandshakeError + HasTransientErr bool +} + +func NewDiplomat( + node *enode.Node, + privateKey *ecdsa.PrivateKey, + handshakeLastErrors []database.HandshakeError, + handshakeRefreshTimeout time.Duration, + handshakeRetryDelay time.Duration, + handshakeMaxTries uint, + logger log.Logger, +) *Diplomat { + instance := Diplomat{ + node, + privateKey, + handshakeLastErrors, + handshakeRefreshTimeout, + handshakeRetryDelay, + handshakeMaxTries, + logger, + } + return &instance +} + +func (diplomat *Diplomat) handshake(ctx context.Context) (*HelloMessage, *StatusMessage, *HandshakeError) { + node := diplomat.node + return Handshake(ctx, node.IP(), node.TCP(), node.Pubkey(), diplomat.privateKey) +} + +func (diplomat *Diplomat) Run(ctx context.Context) DiplomatResult { + diplomat.log.Debug("Handshaking with a node") + hello, status, handshakeErr := diplomat.handshake(ctx) + + var result DiplomatResult + + if (handshakeErr != nil) && !errors.Is(handshakeErr, context.Canceled) { + result.HandshakeErr = handshakeErr + diplomat.log.Debug("Failed to handshake", "err", handshakeErr) + } + result.HasTransientErr = diplomat.hasRecentTransientError(handshakeErr) + + if hello != nil { + result.ClientID = &hello.ClientID + diplomat.log.Debug("Got client ID", "clientID", *result.ClientID) + } + + if status != nil { + result.NetworkID = &status.NetworkID + diplomat.log.Debug("Got network ID", "networkID", *result.NetworkID) + } + if status != nil { + result.EthVersion = &status.ProtocolVersion + diplomat.log.Debug("Got eth version", "ethVersion", *result.EthVersion) + } + + return result +} + +func (diplomat *Diplomat) NextRetryTime(handshakeErr *HandshakeError) time.Time { + return time.Now().Add(diplomat.NextRetryDelay(handshakeErr)) +} + +func (diplomat *Diplomat) NextRetryDelay(handshakeErr *HandshakeError) time.Duration { + if handshakeErr == nil { + return diplomat.handshakeRefreshTimeout + } + + dbHandshakeErr := database.HandshakeError{ + StringCode: handshakeErr.StringCode(), + Time: time.Now(), + } + + lastErrors := append([]database.HandshakeError{dbHandshakeErr}, diplomat.handshakeLastErrors...) + + if uint(len(lastErrors)) < diplomat.handshakeMaxTries { + return diplomat.handshakeRetryDelay + } + + if containsHandshakeError(diplomat.transientError(), lastErrors) { + return diplomat.handshakeRetryDelay + } + + if len(lastErrors) < 2 { + return 1000000 * time.Hour // never + } + + backOffDelay := 2 * lastErrors[0].Time.Sub(lastErrors[1].Time) + if backOffDelay < diplomat.handshakeRetryDelay { + return diplomat.handshakeRetryDelay + } + + return backOffDelay +} + +func (diplomat *Diplomat) transientError() *HandshakeError { + return NewHandshakeError(HandshakeErrorIDDisconnect, p2p.DiscTooManyPeers, uint64(p2p.DiscTooManyPeers)) +} + +func (diplomat *Diplomat) hasRecentTransientError(handshakeErr *HandshakeError) bool { + if handshakeErr == nil { + return false + } + + dbHandshakeErr := database.HandshakeError{ + StringCode: handshakeErr.StringCode(), + Time: time.Now(), + } + + lastErrors := append([]database.HandshakeError{dbHandshakeErr}, diplomat.handshakeLastErrors...) + return containsHandshakeError(diplomat.transientError(), lastErrors) +} + +func containsHandshakeError(target *HandshakeError, list []database.HandshakeError) bool { + for _, err := range list { + if err.StringCode == target.StringCode() { + return true + } + } + return false +} diff --git a/cmd/observer/observer/handshake.go b/cmd/observer/observer/handshake.go new file mode 100644 index 00000000000..6fdcd3414ab --- /dev/null +++ b/cmd/observer/observer/handshake.go @@ -0,0 +1,252 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "fmt" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p" + "github.com/ledgerwatch/erigon/p2p/rlpx" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "math/big" + "net" + "strings" + "time" +) + +// https://github.com/ethereum/devp2p/blob/master/rlpx.md#p2p-capability +const ( + RLPxMessageIDHello = 0 + RLPxMessageIDDisconnect = 1 + RLPxMessageIDPing = 2 + RLPxMessageIDPong = 3 +) + +// HelloMessage is the RLPx Hello message. +// (same as protoHandshake in p2p/peer.go) +// https://github.com/ethereum/devp2p/blob/master/rlpx.md#hello-0x00 +type HelloMessage struct { + Version uint64 + ClientID string + Caps []p2p.Cap + ListenPort uint64 + Pubkey []byte // secp256k1 public key + + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` +} + +// StatusMessage is the Ethereum Status message v63+. +// (same as StatusPacket in eth/protocols/eth/protocol.go) +// https://github.com/ethereum/devp2p/blob/master/caps/eth.md#status-0x00 +type StatusMessage struct { + ProtocolVersion uint32 + NetworkID uint64 + TD *big.Int + Head common.Hash + Genesis common.Hash + ForkID *forkid.ID `rlp:"-"` // parsed from Rest if exists in v64+ + Rest []rlp.RawValue `rlp:"tail"` +} + +type HandshakeErrorID string + +const ( + HandshakeErrorIDConnect HandshakeErrorID = "connect" + HandshakeErrorIDSetTimeout HandshakeErrorID = "set-timeout" + HandshakeErrorIDAuth HandshakeErrorID = "auth" + HandshakeErrorIDRead HandshakeErrorID = "read" + HandshakeErrorIDUnexpectedMessage HandshakeErrorID = "unexpected-message" + HandshakeErrorIDDisconnectDecode HandshakeErrorID = "disconnect-decode" + HandshakeErrorIDDisconnect HandshakeErrorID = "disconnect" + HandshakeErrorIDHelloEncode HandshakeErrorID = "hello-encode" + HandshakeErrorIDHelloDecode HandshakeErrorID = "hello-decode" + HandshakeErrorIDStatusDecode HandshakeErrorID = "status-decode" +) + +type HandshakeError struct { + id HandshakeErrorID + wrappedErr error + param uint64 +} + +func NewHandshakeError(id HandshakeErrorID, wrappedErr error, param uint64) *HandshakeError { + instance := HandshakeError{ + id, + wrappedErr, + param, + } + return &instance +} + +func (e *HandshakeError) Unwrap() error { + return e.wrappedErr +} + +func (e *HandshakeError) Error() string { + switch e.id { + case HandshakeErrorIDConnect: + return fmt.Sprintf("handshake failed to connect: %v", e.wrappedErr) + case HandshakeErrorIDSetTimeout: + return fmt.Sprintf("handshake failed to set timeout: %v", e.wrappedErr) + case HandshakeErrorIDAuth: + return fmt.Sprintf("handshake RLPx auth failed: %v", e.wrappedErr) + case HandshakeErrorIDRead: + return fmt.Sprintf("handshake RLPx read failed: %v", e.wrappedErr) + case HandshakeErrorIDUnexpectedMessage: + return fmt.Sprintf("handshake got unexpected message ID: %d", e.param) + case HandshakeErrorIDDisconnectDecode: + return fmt.Sprintf("handshake failed to parse disconnect reason: %v", e.wrappedErr) + case HandshakeErrorIDDisconnect: + return fmt.Sprintf("handshake got disconnected: %v", e.wrappedErr) + case HandshakeErrorIDHelloEncode: + return fmt.Sprintf("handshake failed to encode outgoing Hello message: %v", e.wrappedErr) + case HandshakeErrorIDHelloDecode: + return fmt.Sprintf("handshake failed to parse Hello message: %v", e.wrappedErr) + case HandshakeErrorIDStatusDecode: + return fmt.Sprintf("handshake failed to parse Status message: %v", e.wrappedErr) + default: + return "" + } +} + +func (e *HandshakeError) StringCode() string { + switch e.id { + case HandshakeErrorIDUnexpectedMessage: + fallthrough + case HandshakeErrorIDDisconnect: + return fmt.Sprintf("%s-%d", e.id, e.param) + default: + return string(e.id) + } +} + +func Handshake( + ctx context.Context, + ip net.IP, + rlpxPort int, + pubkey *ecdsa.PublicKey, + myPrivateKey *ecdsa.PrivateKey, +) (*HelloMessage, *StatusMessage, *HandshakeError) { + connectTimeout := 10 * time.Second + dialer := net.Dialer{ + Timeout: connectTimeout, + } + addr := net.TCPAddr{IP: ip, Port: rlpxPort} + + tcpConn, err := dialer.DialContext(ctx, "tcp", addr.String()) + if err != nil { + return nil, nil, NewHandshakeError(HandshakeErrorIDConnect, err, 0) + } + + conn := rlpx.NewConn(tcpConn, pubkey) + defer func() { _ = conn.Close() }() + + handshakeTimeout := 5 * time.Second + handshakeDeadline := time.Now().Add(handshakeTimeout) + err = conn.SetDeadline(handshakeDeadline) + if err != nil { + return nil, nil, NewHandshakeError(HandshakeErrorIDSetTimeout, err, 0) + } + err = conn.SetWriteDeadline(handshakeDeadline) + if err != nil { + return nil, nil, NewHandshakeError(HandshakeErrorIDSetTimeout, err, 0) + } + + _, err = conn.Handshake(myPrivateKey) + if err != nil { + return nil, nil, NewHandshakeError(HandshakeErrorIDAuth, err, 0) + } + + ourHelloMessage := makeOurHelloMessage(myPrivateKey) + ourHelloData, err := rlp.EncodeToBytes(&ourHelloMessage) + if err != nil { + return nil, nil, NewHandshakeError(HandshakeErrorIDHelloEncode, err, 0) + } + go func() { _, _ = conn.Write(RLPxMessageIDHello, ourHelloData) }() + + var helloMessage HelloMessage + if err := readMessage(conn, RLPxMessageIDHello, HandshakeErrorIDHelloDecode, &helloMessage); err != nil { + return nil, nil, err + } + + // All messages following Hello are compressed using the Snappy algorithm. + if helloMessage.Version >= 5 { + conn.SetSnappy(true) + } + + var statusMessage StatusMessage + if err := readMessage(conn, 16+eth.StatusMsg, HandshakeErrorIDStatusDecode, &statusMessage); err != nil { + return &helloMessage, nil, err + } + + // parse fork ID + if (statusMessage.ProtocolVersion >= 64) && (len(statusMessage.Rest) > 0) { + var forkID forkid.ID + if err := rlp.DecodeBytes(statusMessage.Rest[0], &forkID); err != nil { + return &helloMessage, nil, NewHandshakeError(HandshakeErrorIDStatusDecode, err, 0) + } + statusMessage.ForkID = &forkID + } + + return &helloMessage, &statusMessage, nil +} + +func readMessage(conn *rlpx.Conn, expectedMessageID uint64, decodeError HandshakeErrorID, message interface{}) *HandshakeError { + messageID, data, _, err := conn.Read() + if err != nil { + return NewHandshakeError(HandshakeErrorIDRead, err, 0) + } + + if messageID == RLPxMessageIDPing { + pongData, _ := rlp.EncodeToBytes(make([]string, 0, 1)) + go func() { _, _ = conn.Write(RLPxMessageIDPong, pongData) }() + return readMessage(conn, expectedMessageID, decodeError, message) + } + if messageID == 16+eth.GetPooledTransactionsMsg { + return readMessage(conn, expectedMessageID, decodeError, message) + } + if messageID == RLPxMessageIDDisconnect { + var reason [1]p2p.DiscReason + err = rlp.DecodeBytes(data, &reason) + if (err != nil) && strings.Contains(err.Error(), "rlp: expected input list") { + err = rlp.DecodeBytes(data, &reason[0]) + } + if err != nil { + return NewHandshakeError(HandshakeErrorIDDisconnectDecode, err, 0) + } + return NewHandshakeError(HandshakeErrorIDDisconnect, reason[0], uint64(reason[0])) + } + if messageID != expectedMessageID { + return NewHandshakeError(HandshakeErrorIDUnexpectedMessage, nil, messageID) + } + + if err = rlp.DecodeBytes(data, message); err != nil { + return NewHandshakeError(decodeError, err, 0) + } + return nil +} + +func makeOurHelloMessage(myPrivateKey *ecdsa.PrivateKey) HelloMessage { + version := params.VersionWithCommit(params.GitCommit, "") + clientID := common.MakeName("observer", version) + + caps := []p2p.Cap{ + {Name: eth.ProtocolName, Version: 63}, + {Name: eth.ProtocolName, Version: 64}, + {Name: eth.ProtocolName, Version: 65}, + {Name: eth.ProtocolName, Version: eth.ETH66}, + } + + return HelloMessage{ + Version: 5, + ClientID: clientID, + Caps: caps, + ListenPort: 0, // not listening + Pubkey: crypto.MarshalPubkey(&myPrivateKey.PublicKey), + } +} diff --git a/cmd/observer/observer/handshake_test.go b/cmd/observer/observer/handshake_test.go new file mode 100644 index 00000000000..2691cd24006 --- /dev/null +++ b/cmd/observer/observer/handshake_test.go @@ -0,0 +1,35 @@ +package observer + +import ( + "context" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/params" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestHandshake(t *testing.T) { + t.Skip("only for dev") + + // grep 'self=enode' the log, and paste it here + // url := "enode://..." + url := params.MainnetBootnodes[0] + node := enode.MustParseV4(url) + myPrivateKey, _ := crypto.GenerateKey() + + ctx := context.Background() + hello, status, err := Handshake(ctx, node.IP(), node.TCP(), node.Pubkey(), myPrivateKey) + + require.Nil(t, err) + require.NotNil(t, hello) + assert.Equal(t, uint64(5), hello.Version) + assert.NotEmpty(t, hello.ClientID) + assert.Contains(t, hello.ClientID, "erigon") + + require.NotNil(t, status) + assert.Equal(t, uint32(eth.ETH66), status.ProtocolVersion) + assert.Equal(t, uint64(1), status.NetworkID) +} diff --git a/cmd/observer/observer/interrogation_error.go b/cmd/observer/observer/interrogation_error.go new file mode 100644 index 00000000000..bc99dd93a9c --- /dev/null +++ b/cmd/observer/observer/interrogation_error.go @@ -0,0 +1,53 @@ +package observer + +import "fmt" + +type InterrogationErrorID int + +const ( + InterrogationErrorPing InterrogationErrorID = iota + 1 + InterrogationErrorENRDecode + InterrogationErrorIncompatibleForkID + InterrogationErrorBlacklistedClientID + InterrogationErrorKeygen + InterrogationErrorFindNode + InterrogationErrorFindNodeTimeout +) + +type InterrogationError struct { + id InterrogationErrorID + wrappedErr error +} + +func NewInterrogationError(id InterrogationErrorID, wrappedErr error) *InterrogationError { + instance := InterrogationError{ + id, + wrappedErr, + } + return &instance +} + +func (e *InterrogationError) Unwrap() error { + return e.wrappedErr +} + +func (e *InterrogationError) Error() string { + switch e.id { + case InterrogationErrorPing: + return fmt.Sprintf("ping-pong failed: %v", e.wrappedErr) + case InterrogationErrorENRDecode: + return e.wrappedErr.Error() + case InterrogationErrorIncompatibleForkID: + return fmt.Sprintf("incompatible ENR fork ID %v", e.wrappedErr) + case InterrogationErrorBlacklistedClientID: + return fmt.Sprintf("incompatible client ID %v", e.wrappedErr) + case InterrogationErrorKeygen: + return fmt.Sprintf("keygen failed: %v", e.wrappedErr) + case InterrogationErrorFindNode: + return fmt.Sprintf("FindNode request failed: %v", e.wrappedErr) + case InterrogationErrorFindNodeTimeout: + return fmt.Sprintf("FindNode request timeout: %v", e.wrappedErr) + default: + return "" + } +} diff --git a/cmd/observer/observer/interrogator.go b/cmd/observer/observer/interrogator.go new file mode 100644 index 00000000000..a66bd811600 --- /dev/null +++ b/cmd/observer/observer/interrogator.go @@ -0,0 +1,230 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/log/v3" + "golang.org/x/sync/semaphore" + "strings" + "time" +) + +type DiscV4Transport interface { + RequestENR(*enode.Node) (*enode.Node, error) + Ping(*enode.Node) error + FindNode(toNode *enode.Node, targetKey *ecdsa.PublicKey) ([]*enode.Node, error) +} + +type Interrogator struct { + node *enode.Node + transport DiscV4Transport + forkFilter forkid.Filter + + diplomat *Diplomat + handshakeRetryTime *time.Time + + keygenTimeout time.Duration + keygenConcurrency uint + keygenSemaphore *semaphore.Weighted + keygenCachedKeys []*ecdsa.PublicKey + + log log.Logger +} + +type InterrogationResult struct { + Node *enode.Node + IsCompatFork *bool + HandshakeResult *DiplomatResult + HandshakeRetryTime *time.Time + KeygenKeys []*ecdsa.PublicKey + Peers []*enode.Node +} + +func NewInterrogator( + node *enode.Node, + transport DiscV4Transport, + forkFilter forkid.Filter, + diplomat *Diplomat, + handshakeRetryTime *time.Time, + keygenTimeout time.Duration, + keygenConcurrency uint, + keygenSemaphore *semaphore.Weighted, + keygenCachedKeys []*ecdsa.PublicKey, + logger log.Logger, +) (*Interrogator, error) { + instance := Interrogator{ + node, + transport, + forkFilter, + diplomat, + handshakeRetryTime, + keygenTimeout, + keygenConcurrency, + keygenSemaphore, + keygenCachedKeys, + logger, + } + return &instance, nil +} + +func (interrogator *Interrogator) Run(ctx context.Context) (*InterrogationResult, *InterrogationError) { + interrogator.log.Debug("Interrogating a node") + + err := interrogator.transport.Ping(interrogator.node) + if err != nil { + return nil, NewInterrogationError(InterrogationErrorPing, err) + } + + // The outgoing Ping above triggers an incoming Ping. + // We need to wait until Server sends a Pong reply to that. + // The remote side is waiting for this Pong no longer than v4_udp.respTimeout. + // If we don't wait, the ENRRequest/FindNode might fail due to errUnknownNode. + utils.Sleep(ctx, 500*time.Millisecond) + + // request client ID + var handshakeResult *DiplomatResult + var handshakeRetryTime *time.Time + if (interrogator.handshakeRetryTime == nil) || interrogator.handshakeRetryTime.Before(time.Now()) { + result := interrogator.diplomat.Run(ctx) + clientID := result.ClientID + if (clientID != nil) && IsClientIDBlacklisted(*clientID) { + return nil, NewInterrogationError(InterrogationErrorBlacklistedClientID, errors.New(*clientID)) + } + handshakeResult = &result + handshakeRetryTime = new(time.Time) + *handshakeRetryTime = interrogator.diplomat.NextRetryTime(result.HandshakeErr) + } + + // request ENR + var forkID *forkid.ID + var enr *enode.Node + if (handshakeResult == nil) || (handshakeResult.ClientID == nil) || isENRRequestSupportedByClientID(*handshakeResult.ClientID) { + enr, err = interrogator.transport.RequestENR(interrogator.node) + } + if err != nil { + interrogator.log.Debug("ENR request failed", "err", err) + } else if enr != nil { + interrogator.log.Debug("Got ENR", "enr", enr) + forkID, err = eth.LoadENRForkID(enr.Record()) + if err != nil { + return nil, NewInterrogationError(InterrogationErrorENRDecode, err) + } + if forkID == nil { + interrogator.log.Debug("Got ENR, but it doesn't contain a ForkID") + } + } + + // filter by fork ID + var isCompatFork *bool + if forkID != nil { + err := interrogator.forkFilter(*forkID) + isCompatFork = new(bool) + *isCompatFork = (err == nil) || !errors.Is(err, forkid.ErrLocalIncompatibleOrStale) + if !*isCompatFork { + return nil, NewInterrogationError(InterrogationErrorIncompatibleForkID, err) + } + } + + // keygen + keys, err := interrogator.keygen(ctx) + if err != nil { + return nil, NewInterrogationError(InterrogationErrorKeygen, err) + } + + // FindNode + peersByID := make(map[enode.ID]*enode.Node) + for _, key := range keys { + neighbors, err := interrogator.findNode(ctx, key) + if err != nil { + if isFindNodeTimeoutError(err) { + return nil, NewInterrogationError(InterrogationErrorFindNodeTimeout, err) + } + return nil, NewInterrogationError(InterrogationErrorFindNode, err) + } + + for _, node := range neighbors { + if node.Incomplete() { + continue + } + peersByID[node.ID()] = node + } + + utils.Sleep(ctx, 1*time.Second) + } + + peers := valuesOfIDToNodeMap(peersByID) + + result := InterrogationResult{ + interrogator.node, + isCompatFork, + handshakeResult, + handshakeRetryTime, + keys, + peers, + } + return &result, nil +} + +func (interrogator *Interrogator) keygen(ctx context.Context) ([]*ecdsa.PublicKey, error) { + if interrogator.keygenCachedKeys != nil { + return interrogator.keygenCachedKeys, nil + } + + if err := interrogator.keygenSemaphore.Acquire(ctx, 1); err != nil { + return nil, err + } + defer interrogator.keygenSemaphore.Release(1) + + keys := keygen( + ctx, + interrogator.node.Pubkey(), + interrogator.keygenTimeout, + interrogator.keygenConcurrency, + interrogator.log) + + interrogator.log.Trace(fmt.Sprintf("Generated %d keys", len(keys))) + if (len(keys) < 13) && (ctx.Err() == nil) { + msg := "Generated just %d keys within a given timeout and concurrency (expected 16-17). " + + "If this happens too often, try to increase keygen-timeout/keygen-concurrency parameters." + interrogator.log.Warn(fmt.Sprintf(msg, len(keys))) + } + return keys, ctx.Err() +} + +func (interrogator *Interrogator) findNode(ctx context.Context, targetKey *ecdsa.PublicKey) ([]*enode.Node, error) { + delayForAttempt := func(attempt int) time.Duration { return 2 * time.Second } + resultAny, err := utils.Retry(ctx, 2, delayForAttempt, isFindNodeTimeoutError, interrogator.log, "FindNode", func(ctx context.Context) (interface{}, error) { + return interrogator.transport.FindNode(interrogator.node, targetKey) + }) + + if resultAny == nil { + return nil, err + } + result := resultAny.([]*enode.Node) + return result, err +} + +func isFindNodeTimeoutError(err error) bool { + return (err != nil) && (err.Error() == "RPC timeout") +} + +func isENRRequestSupportedByClientID(clientID string) bool { + isUnsupported := strings.HasPrefix(clientID, "Parity-Ethereum") || + strings.HasPrefix(clientID, "OpenEthereum") || + strings.HasPrefix(clientID, "Nethermind") + return !isUnsupported +} + +func valuesOfIDToNodeMap(m map[enode.ID]*enode.Node) []*enode.Node { + values := make([]*enode.Node, 0, len(m)) + for _, value := range m { + values = append(values, value) + } + return values +} diff --git a/cmd/observer/observer/keygen.go b/cmd/observer/observer/keygen.go new file mode 100644 index 00000000000..5de9bc3f9c0 --- /dev/null +++ b/cmd/observer/observer/keygen.go @@ -0,0 +1,76 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/log/v3" + "time" +) + +func keygen( + parentContext context.Context, + targetKey *ecdsa.PublicKey, + timeout time.Duration, + concurrencyLimit uint, + logger log.Logger, +) []*ecdsa.PublicKey { + ctx, cancel := context.WithTimeout(parentContext, timeout) + defer cancel() + + targetID := enode.PubkeyToIDV4(targetKey) + cpus := concurrencyLimit + + type result struct { + key *ecdsa.PublicKey + distance int + } + + generatedKeys := make(chan result, cpus) + + for i := uint(0); i < cpus; i++ { + go func() { + for ctx.Err() == nil { + keyPair, err := crypto.GenerateKey() + if err != nil { + logger.Error("keygen has failed to generate a key", "err", err) + break + } + + key := &keyPair.PublicKey + id := enode.PubkeyToIDV4(key) + distance := enode.LogDist(targetID, id) + + select { + case generatedKeys <- result{key, distance}: + case <-ctx.Done(): + break + } + } + }() + } + + keysAtDist := make(map[int]*ecdsa.PublicKey) + + for ctx.Err() == nil { + select { + case res := <-generatedKeys: + keysAtDist[res.distance] = res.key + case <-ctx.Done(): + break + } + } + + keys := valuesOfIntToPubkeyMap(keysAtDist) + + return keys +} + +func valuesOfIntToPubkeyMap(m map[int]*ecdsa.PublicKey) []*ecdsa.PublicKey { + values := make([]*ecdsa.PublicKey, 0, len(m)) + for _, value := range m { + values = append(values, value) + } + return values +} diff --git a/cmd/observer/observer/keygen_test.go b/cmd/observer/observer/keygen_test.go new file mode 100644 index 00000000000..b57e56b0d23 --- /dev/null +++ b/cmd/observer/observer/keygen_test.go @@ -0,0 +1,23 @@ +package observer + +import ( + "context" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/log/v3" + "github.com/stretchr/testify/assert" + "runtime" + "testing" + "time" +) + +func TestKeygen(t *testing.T) { + targetKeyPair, err := crypto.GenerateKey() + assert.NotNil(t, targetKeyPair) + assert.Nil(t, err) + + targetKey := &targetKeyPair.PublicKey + keys := keygen(context.Background(), targetKey, 50*time.Millisecond, uint(runtime.GOMAXPROCS(-1)), log.Root()) + + assert.NotNil(t, keys) + assert.GreaterOrEqual(t, len(keys), 4) +} diff --git a/cmd/observer/observer/node_utils/node_addr.go b/cmd/observer/observer/node_utils/node_addr.go new file mode 100644 index 00000000000..0e09add518c --- /dev/null +++ b/cmd/observer/observer/node_utils/node_addr.go @@ -0,0 +1,90 @@ +package node_utils + +import ( + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/p2p/enr" + "net" +) + +func MakeNodeAddr(node *enode.Node) database.NodeAddr { + var addr database.NodeAddr + + var ipEntry enr.IPv4 + if node.Load(&ipEntry) == nil { + addr.IP = net.IP(ipEntry) + } + + var ipV6Entry enr.IPv6 + if node.Load(&ipV6Entry) == nil { + addr.IPv6.IP = net.IP(ipEntry) + } + + var portDiscEntry enr.UDP + if (addr.IP != nil) && (node.Load(&portDiscEntry) == nil) { + addr.PortDisc = uint16(portDiscEntry) + } + + var ipV6PortDiscEntry enr.UDP6 + if (addr.IPv6.IP != nil) && (node.Load(&ipV6PortDiscEntry) == nil) { + addr.IPv6.PortDisc = uint16(ipV6PortDiscEntry) + } + + var portRLPxEntry enr.TCP + if (addr.IP != nil) && (node.Load(&portRLPxEntry) == nil) { + addr.PortRLPx = uint16(portRLPxEntry) + } + + var ipV6PortRLPxEntry enr.TCP + if (addr.IPv6.IP != nil) && (node.Load(&ipV6PortRLPxEntry) == nil) { + addr.IPv6.PortRLPx = uint16(ipV6PortRLPxEntry) + } + + return addr +} + +func MakeNodeFromAddr(id database.NodeID, addr database.NodeAddr) (*enode.Node, error) { + rec := new(enr.Record) + + pubkey, err := utils.ParseHexPublicKey(string(id)) + if err != nil { + return nil, err + } + rec.Set((*enode.Secp256k1)(pubkey)) + + if addr.IP != nil { + rec.Set(enr.IP(addr.IP)) + } + if addr.IPv6.IP != nil { + rec.Set(enr.IPv6(addr.IPv6.IP)) + } + if addr.PortDisc != 0 { + rec.Set(enr.UDP(addr.PortDisc)) + } + if addr.PortRLPx != 0 { + rec.Set(enr.TCP(addr.PortRLPx)) + } + if addr.IPv6.PortDisc != 0 { + rec.Set(enr.UDP6(addr.IPv6.PortDisc)) + } + if addr.IPv6.PortRLPx != 0 { + rec.Set(enr.TCP6(addr.IPv6.PortRLPx)) + } + + rec.Set(enr.ID("unsigned")) + node, err := enode.New(enr.SchemeMap{"unsigned": noSignatureIDScheme{}}, rec) + if err != nil { + return nil, fmt.Errorf("failed to make a node: %w", err) + } + return node, nil +} + +type noSignatureIDScheme struct { + enode.V4ID +} + +func (noSignatureIDScheme) Verify(_ *enr.Record, _ []byte) error { + return nil +} diff --git a/cmd/observer/observer/node_utils/node_id.go b/cmd/observer/observer/node_utils/node_id.go new file mode 100644 index 00000000000..e7c27f0e985 --- /dev/null +++ b/cmd/observer/observer/node_utils/node_id.go @@ -0,0 +1,21 @@ +package node_utils + +import ( + "errors" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/p2p/enode" + "net/url" +) + +func NodeID(node *enode.Node) (database.NodeID, error) { + if node.Incomplete() { + return "", errors.New("NodeID not implemented for incomplete nodes") + } + nodeURL, err := url.Parse(node.URLv4()) + if err != nil { + return "", fmt.Errorf("failed to parse node URL: %w", err) + } + id := nodeURL.User.Username() + return database.NodeID(id), nil +} diff --git a/cmd/observer/observer/sentry_candidates/intake.go b/cmd/observer/observer/sentry_candidates/intake.go new file mode 100644 index 00000000000..d6ba42fe786 --- /dev/null +++ b/cmd/observer/observer/sentry_candidates/intake.go @@ -0,0 +1,207 @@ +package sentry_candidates + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/observer/node_utils" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/log/v3" + "github.com/nxadm/tail" + "time" +) + +type Intake struct { + logPath string + db database.DBRetrier + saveQueue *utils.TaskQueue + chain string + + handshakeRefreshTimeout time.Duration + + statusLogPeriod time.Duration + log log.Logger +} + +func NewIntake( + logPath string, + db database.DBRetrier, + saveQueue *utils.TaskQueue, + chain string, + handshakeRefreshTimeout time.Duration, + statusLogPeriod time.Duration, + logger log.Logger, +) *Intake { + instance := Intake{ + logPath, + db, + saveQueue, + chain, + handshakeRefreshTimeout, + statusLogPeriod, + logger, + } + return &instance +} + +func (intake *Intake) Run(ctx context.Context) error { + tailConfig := tail.Config{ + MustExist: true, + Follow: true, + CompleteLines: true, + } + logFile, err := tail.TailFile(intake.logPath, tailConfig) + if err != nil { + return err + } + defer func() { + _ = logFile.Stop() + logFile.Cleanup() + }() + eventLog := NewLog(NewTailLineReader(ctx, logFile)) + + var lastEventTime *time.Time + lastEventTime, err = intake.db.FindSentryCandidatesLastEventTime(ctx) + if err != nil { + return err + } + + doneCount := 0 + statusLogDate := time.Now() + + for { + event, err := eventLog.Read() + if err != nil { + return err + } + if event == nil { + break + } + + if (event.NodeURL == "") || (event.ClientID == "") { + continue + } + + // Skip all events processed previously. + // The time is stored with a second precision, hence adding a slack. + if (lastEventTime != nil) && !event.Timestamp.After(lastEventTime.Add(time.Second)) { + continue + } + + doneCount++ + if time.Since(statusLogDate) > intake.statusLogPeriod { + intake.log.Info( + "Sentry candidates intake", + "done", doneCount, + ) + statusLogDate = time.Now() + } + + peerNode, err := enode.ParseV4(event.NodeURL) + if err != nil { + return err + } + + networkID := params.NetworkIDByChainName(intake.chain) + isCompatFork := true + + handshakeRetryTime := time.Now().Add(intake.handshakeRefreshTimeout) + crawlRetryTime := time.Now() + + intake.log.Trace("sentry_candidates.Intake saving peer", + "timestamp", event.Timestamp, + "peerNode", peerNode, + "clientID", event.ClientID, + ) + + intake.saveQueue.EnqueueTask(ctx, func(ctx context.Context) error { + return intake.savePeer( + ctx, + event.Timestamp, + peerNode, + event.ClientID, + networkID, + isCompatFork, + event.EthVersion(), + handshakeRetryTime, + crawlRetryTime) + }) + } + return nil +} + +func (intake *Intake) savePeer( + ctx context.Context, + eventTime time.Time, + peer *enode.Node, + clientID string, + networkID uint64, + isCompatFork bool, + ethVersion uint, + handshakeRetryTime time.Time, + crawlRetryTime time.Time, +) error { + id, err := node_utils.NodeID(peer) + if err != nil { + return fmt.Errorf("failed to get peer node ID: %w", err) + } + + var dbErr error + + // Update the eventTime early. If the save fails, the candidate will be skipped on the next run. + dbErr = intake.db.UpdateSentryCandidatesLastEventTime(ctx, eventTime) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.UpsertNodeAddr(ctx, id, node_utils.MakeNodeAddr(peer)) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.ResetPingError(ctx, id) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.UpdateClientID(ctx, id, clientID) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.UpdateNetworkID(ctx, id, uint(networkID)) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.UpdateForkCompatibility(ctx, id, isCompatFork) + if dbErr != nil { + return dbErr + } + + if ethVersion != 0 { + dbErr = intake.db.UpdateEthVersion(ctx, id, ethVersion) + if dbErr != nil { + return dbErr + } + } + + dbErr = intake.db.DeleteHandshakeErrors(ctx, id) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.UpdateHandshakeTransientError(ctx, id, false) + if dbErr != nil { + return dbErr + } + + dbErr = intake.db.UpdateHandshakeRetryTime(ctx, id, handshakeRetryTime) + if dbErr != nil { + return dbErr + } + + return intake.db.UpdateCrawlRetryTime(ctx, id, crawlRetryTime) +} diff --git a/cmd/observer/observer/sentry_candidates/log.go b/cmd/observer/observer/sentry_candidates/log.go new file mode 100644 index 00000000000..71ad2a3f0ce --- /dev/null +++ b/cmd/observer/observer/sentry_candidates/log.go @@ -0,0 +1,104 @@ +package sentry_candidates + +import ( + "bufio" + "context" + "encoding/json" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/nxadm/tail" + "io" + "strconv" + "strings" + "time" +) + +type Log struct { + reader LineReader +} + +type LogEvent struct { + Timestamp time.Time `json:"t"` + Message string `json:"msg"` + PeerIDHex string `json:"peer,omitempty"` + NodeURL string `json:"nodeURL,omitempty"` + ClientID string `json:"clientID,omitempty"` + Capabilities []string `json:"capabilities,omitempty"` +} + +func NewLog(reader LineReader) *Log { + return &Log{reader} +} + +func (log *Log) Read() (*LogEvent, error) { + var event LogEvent + for event.Message != "Sentry peer did Connect" { + line, err := log.reader.ReadLine() + if (err != nil) || (line == nil) { + return nil, err + } + + lineData := []byte(*line) + if err := json.Unmarshal(lineData, &event); err != nil { + return nil, err + } + } + return &event, nil +} + +func (event *LogEvent) EthVersion() uint { + var maxVersion uint64 + for _, capability := range event.Capabilities { + if !strings.HasPrefix(capability, eth.ProtocolName) { + continue + } + versionStr := capability[len(eth.ProtocolName)+1:] + version, _ := strconv.ParseUint(versionStr, 10, 32) + if version > maxVersion { + maxVersion = version + } + } + return uint(maxVersion) +} + +type LineReader interface { + ReadLine() (*string, error) +} + +type ScannerLineReader struct { + scanner *bufio.Scanner +} + +func NewScannerLineReader(reader io.Reader) *ScannerLineReader { + return &ScannerLineReader{bufio.NewScanner(reader)} +} + +func (reader *ScannerLineReader) ReadLine() (*string, error) { + if reader.scanner.Scan() { + line := reader.scanner.Text() + return &line, nil + } else { + return nil, reader.scanner.Err() + } +} + +type TailLineReader struct { + ctx context.Context + tail *tail.Tail +} + +func NewTailLineReader(ctx context.Context, tail *tail.Tail) *TailLineReader { + return &TailLineReader{ctx, tail} +} + +func (reader *TailLineReader) ReadLine() (*string, error) { + select { + case line, ok := <-reader.tail.Lines: + if ok { + return &line.Text, nil + } else { + return nil, reader.tail.Err() + } + case <-reader.ctx.Done(): + return nil, reader.ctx.Err() + } +} diff --git a/cmd/observer/observer/sentry_candidates/log_test.go b/cmd/observer/observer/sentry_candidates/log_test.go new file mode 100644 index 00000000000..e1ac9c391c7 --- /dev/null +++ b/cmd/observer/observer/sentry_candidates/log_test.go @@ -0,0 +1,60 @@ +package sentry_candidates + +import ( + "context" + "github.com/nxadm/tail" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "strings" + "testing" +) + +func TestLogRead(t *testing.T) { + line := ` +{"capabilities":["eth/66","wit/0"],"clientID":"Nethermind/v1.13.0-0-2e8910b5b-20220520/X64-Linux/6.0.4","lvl":"dbug","msg":"Sentry peer did Connect","nodeURL":"enode://4293b17b897abed4a88d6e760e86a4bb700d62c12a9411fbf9ec0c9df3740c8670b184bd9f24d163cbd9bf05264b3047a69f079209d53d2e0dc05dd678d07cf0@1.2.3.4:45492","peer":"93b17b897abed4a88d6e760e86a4bb700d62c12a9411fbf9ec0c9df3740c8670b184bd9f24d163cbd9bf05264b3047a69f079209d53d2e0dc05dd678d07cf000","t":"2022-05-31T11:10:19.032092272Z"} +` + line = strings.TrimLeft(line, "\r\n ") + eventLog := NewLog(NewScannerLineReader(strings.NewReader(line))) + event, err := eventLog.Read() + assert.Nil(t, err) + require.NotNil(t, event) + + assert.NotEmpty(t, event.Message) + assert.NotEmpty(t, event.PeerIDHex) + assert.NotEmpty(t, event.NodeURL) + assert.NotEmpty(t, event.ClientID) + + assert.Equal(t, int64(1653995419), event.Timestamp.Unix()) + assert.Equal(t, "Sentry peer did Connect", event.Message) + assert.True(t, strings.HasPrefix(event.NodeURL, "enode:")) + assert.True(t, strings.HasPrefix(event.ClientID, "Nethermind")) + assert.Equal(t, 2, len(event.Capabilities)) +} + +func TestLogReadTailSkimFile(t *testing.T) { + t.Skip() + + logFile, err := tail.TailFile( + "erigon.log", + tail.Config{Follow: false, MustExist: true}) + require.Nil(t, err) + defer func() { + _ = logFile.Stop() + }() + + eventLog := NewLog(NewTailLineReader(context.Background(), logFile)) + for { + event, err := eventLog.Read() + require.Nil(t, err) + if event == nil { + break + } + } +} + +func TestLogEventEthVersion(t *testing.T) { + event := LogEvent{} + event.Capabilities = []string{"wit/0", "eth/64", "eth/65", "eth/66"} + version := event.EthVersion() + assert.Equal(t, uint(66), version) +} diff --git a/cmd/observer/observer/server.go b/cmd/observer/observer/server.go new file mode 100644 index 00000000000..907b7c709a6 --- /dev/null +++ b/cmd/observer/observer/server.go @@ -0,0 +1,183 @@ +package observer + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/common/debug" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p" + "github.com/ledgerwatch/erigon/p2p/discover" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/p2p/enr" + "github.com/ledgerwatch/erigon/p2p/nat" + "github.com/ledgerwatch/erigon/p2p/netutil" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/log/v3" + "net" + "path/filepath" +) + +type Server struct { + localNode *enode.LocalNode + + listenAddr string + natInterface nat.Interface + discConfig discover.Config + + log log.Logger +} + +func NewServer(flags CommandFlags) (*Server, error) { + nodeDBPath := filepath.Join(flags.DataDir, "nodes", "eth66") + + nodeKeyConfig := p2p.NodeKeyConfig{} + privateKey, err := nodeKeyConfig.LoadOrParseOrGenerateAndSave(flags.NodeKeyFile, flags.NodeKeyHex, flags.DataDir) + if err != nil { + return nil, err + } + + localNode, err := makeLocalNode(nodeDBPath, privateKey, flags.Chain) + if err != nil { + return nil, err + } + + listenAddr := fmt.Sprintf(":%d", flags.ListenPort) + + natInterface, err := nat.Parse(flags.NATDesc) + if err != nil { + return nil, fmt.Errorf("NAT parse error: %w", err) + } + + var netRestrictList *netutil.Netlist + if flags.NetRestrict != "" { + netRestrictList, err = netutil.ParseNetlist(flags.NetRestrict) + if err != nil { + return nil, fmt.Errorf("net restrict parse error: %w", err) + } + } + + bootnodes, err := utils.GetBootnodesFromFlags(flags.Bootnodes, flags.Chain) + if err != nil { + return nil, fmt.Errorf("bootnodes parse error: %w", err) + } + + logger := log.New() + + discConfig := discover.Config{ + PrivateKey: privateKey, + NetRestrict: netRestrictList, + Bootnodes: bootnodes, + Log: logger.New(), + } + + instance := Server{ + localNode, + listenAddr, + natInterface, + discConfig, + logger, + } + return &instance, nil +} + +func makeLocalNode(nodeDBPath string, privateKey *ecdsa.PrivateKey, chain string) (*enode.LocalNode, error) { + db, err := enode.OpenDB(nodeDBPath) + if err != nil { + return nil, err + } + localNode := enode.NewLocalNode(db, privateKey) + localNode.SetFallbackIP(net.IP{127, 0, 0, 1}) + + forksEntry, err := makeForksENREntry(chain) + if err != nil { + return nil, err + } + localNode.Set(forksEntry) + + return localNode, nil +} + +func makeForksENREntry(chain string) (enr.Entry, error) { + chainConfig := params.ChainConfigByChainName(chain) + genesisHash := params.GenesisHashByChainName(chain) + if (chainConfig == nil) || (genesisHash == nil) { + return nil, fmt.Errorf("unknown chain %s", chain) + } + + forks := forkid.GatherForks(chainConfig) + return eth.CurrentENREntryFromForks(forks, *genesisHash, 0), nil +} + +func (server *Server) Bootnodes() []*enode.Node { + return server.discConfig.Bootnodes +} + +func (server *Server) PrivateKey() *ecdsa.PrivateKey { + return server.discConfig.PrivateKey +} + +func (server *Server) mapNATPort(ctx context.Context, realAddr *net.UDPAddr) { + if server.natInterface == nil { + return + } + if realAddr.IP.IsLoopback() { + return + } + if !server.natInterface.SupportsMapping() { + return + } + + go func() { + defer debug.LogPanic() + nat.Map(server.natInterface, ctx.Done(), "udp", realAddr.Port, realAddr.Port, "ethereum discovery") + }() +} + +func (server *Server) detectNATExternalIP() (net.IP, error) { + if server.natInterface == nil { + return nil, errors.New("no NAT flag configured") + } + if _, hasExtIP := server.natInterface.(nat.ExtIP); !hasExtIP { + server.log.Debug("Detecting external IP...") + } + ip, err := server.natInterface.ExternalIP() + if err != nil { + return nil, fmt.Errorf("NAT ExternalIP error: %w", err) + } + server.log.Debug("External IP detected", "ip", ip) + return ip, nil +} + +func (server *Server) Listen(ctx context.Context) (*discover.UDPv4, error) { + if server.natInterface != nil { + ip, err := server.detectNATExternalIP() + if err != nil { + return nil, err + } + server.localNode.SetStaticIP(ip) + } + + addr, err := net.ResolveUDPAddr("udp", server.listenAddr) + if err != nil { + return nil, fmt.Errorf("ResolveUDPAddr error: %w", err) + } + conn, err := net.ListenUDP("udp", addr) + if err != nil { + return nil, fmt.Errorf("ListenUDP error: %w", err) + } + + realAddr := conn.LocalAddr().(*net.UDPAddr) + server.localNode.SetFallbackUDP(realAddr.Port) + + if server.natInterface != nil { + server.mapNATPort(ctx, realAddr) + } + + server.log.Debug("Discovery UDP listener is up", "addr", realAddr) + + return discover.ListenV4(ctx, conn, server.localNode, server.discConfig) +} diff --git a/cmd/observer/observer/status_logger.go b/cmd/observer/observer/status_logger.go new file mode 100644 index 00000000000..2757ecd7ca3 --- /dev/null +++ b/cmd/observer/observer/status_logger.go @@ -0,0 +1,44 @@ +package observer + +import ( + "context" + "errors" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/utils" + "github.com/ledgerwatch/log/v3" + "time" +) + +func StatusLoggerLoop(ctx context.Context, db database.DB, networkID uint, period time.Duration, logger log.Logger) { + var maxPingTries uint = 1000000 // unlimited (include dead nodes) + var prevTotalCount uint + var prevDistinctIPCount uint + + for ctx.Err() == nil { + utils.Sleep(ctx, period) + + totalCount, err := db.CountNodes(ctx, maxPingTries, networkID) + if err != nil { + if !errors.Is(err, context.Canceled) { + logger.Error("Failed to count nodes", "err", err) + } + continue + } + + distinctIPCount, err := db.CountIPs(ctx, maxPingTries, networkID) + if err != nil { + if !errors.Is(err, context.Canceled) { + logger.Error("Failed to count IPs", "err", err) + } + continue + } + + if (totalCount == prevTotalCount) && (distinctIPCount == prevDistinctIPCount) { + continue + } + + logger.Info("Status", "totalCount", totalCount, "distinctIPCount", distinctIPCount) + prevTotalCount = totalCount + prevDistinctIPCount = distinctIPCount + } +} diff --git a/cmd/observer/reports/clients_estimate_report.go b/cmd/observer/reports/clients_estimate_report.go new file mode 100644 index 00000000000..4ec7d149bf0 --- /dev/null +++ b/cmd/observer/reports/clients_estimate_report.go @@ -0,0 +1,95 @@ +package reports + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "math" + "strings" +) + +type ClientsEstimateReportEntry struct { + Name string + CountLow uint + CountHigh uint +} + +type ClientsEstimateReport struct { + Clients []ClientsEstimateReportEntry +} + +func CreateClientsEstimateReport( + ctx context.Context, + db database.DB, + limit uint, + maxPingTries uint, + networkID uint, +) (*ClientsEstimateReport, error) { + clientsReport, err := CreateClientsReport(ctx, db, limit, maxPingTries, networkID) + if err != nil { + return nil, err + } + + report := ClientsEstimateReport{} + + for i, topClient := range clientsReport.Clients { + if uint(i) >= limit { + break + } + clientName := topClient.Name + + sameNetworkCount, err := db.CountClients(ctx, clientName+"/", maxPingTries, networkID) + if err != nil { + return nil, err + } + if sameNetworkCount == 0 { + continue + } + + knownNetworkCount, err := db.CountClientsWithNetworkID(ctx, clientName+"/", maxPingTries) + if err != nil { + return nil, err + } + if knownNetworkCount == 0 { + continue + } + + // 1 - (1 - p)/2 percentile for 95% confidence + const z = 1.96 + intervalLow, intervalHigh := waldInterval(knownNetworkCount, sameNetworkCount, z) + + transientErrCount, err := db.CountClientsWithHandshakeTransientError(ctx, clientName+"/", maxPingTries) + if err != nil { + return nil, err + } + + countLow := sameNetworkCount + uint(math.Round(float64(transientErrCount)*intervalLow)) + countHigh := sameNetworkCount + uint(math.Round(float64(transientErrCount)*intervalHigh)) + + client := ClientsEstimateReportEntry{ + clientName, + countLow, + countHigh, + } + report.Clients = append(report.Clients, client) + } + + return &report, nil +} + +// https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval#Normal_approximation_interval_or_Wald_interval +func waldInterval(n uint, ns uint, z float64) (float64, float64) { + nf := n - ns + p := float64(ns) / float64(n) + interval := z * math.Sqrt(float64(ns*nf)) / (float64(n) * math.Sqrt(float64(n))) + return p - interval, p + interval +} + +func (report *ClientsEstimateReport) String() string { + var builder strings.Builder + for _, client := range report.Clients { + builder.WriteString(fmt.Sprintf("%6d - %-6d %s", client.CountLow, client.CountHigh, client.Name)) + builder.WriteRune('\n') + } + return builder.String() +} diff --git a/cmd/observer/reports/clients_report.go b/cmd/observer/reports/clients_report.go new file mode 100644 index 00000000000..e41b82e49dd --- /dev/null +++ b/cmd/observer/reports/clients_report.go @@ -0,0 +1,97 @@ +package reports + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/observer" + "strings" +) + +type ClientsReportEntry struct { + Name string + Count uint +} + +type ClientsReport struct { + Clients []ClientsReportEntry +} + +func CreateClientsReport(ctx context.Context, db database.DB, limit uint, maxPingTries uint, networkID uint) (*ClientsReport, error) { + groups := make(map[string]uint) + unknownCount := uint(0) + enumFunc := func(clientID *string) { + if clientID != nil { + if observer.IsClientIDBlacklisted(*clientID) { + return + } + clientName := observer.NameFromClientID(*clientID) + groups[clientName]++ + } else { + unknownCount++ + } + } + if err := db.EnumerateClientIDs(ctx, maxPingTries, networkID, enumFunc); err != nil { + return nil, err + } + + totalCount := sumMapValues(groups) + + report := ClientsReport{} + + for i := uint(0); i < limit; i++ { + clientName, count := takeMapMaxValue(groups) + if count == 0 { + break + } + + client := ClientsReportEntry{ + clientName, + count, + } + report.Clients = append(report.Clients, client) + } + + othersCount := sumMapValues(groups) + + report.Clients = append(report.Clients, + ClientsReportEntry{"...", othersCount}, + ClientsReportEntry{"total", totalCount}, + ClientsReportEntry{"unknown", unknownCount}) + + return &report, nil +} + +func (report *ClientsReport) String() string { + var builder strings.Builder + builder.WriteString("clients:") + builder.WriteRune('\n') + for _, client := range report.Clients { + builder.WriteString(fmt.Sprintf("%6d %s", client.Count, client.Name)) + builder.WriteRune('\n') + } + return builder.String() +} + +func takeMapMaxValue(m map[string]uint) (string, uint) { + maxKey := "" + maxValue := uint(0) + + for k, v := range m { + if v > maxValue { + maxKey = k + maxValue = v + } + } + + delete(m, maxKey) + return maxKey, maxValue +} + +func sumMapValues(m map[string]uint) uint { + sum := uint(0) + for _, v := range m { + sum += v + } + return sum +} diff --git a/cmd/observer/reports/command.go b/cmd/observer/reports/command.go new file mode 100644 index 00000000000..bba73cbe363 --- /dev/null +++ b/cmd/observer/reports/command.go @@ -0,0 +1,113 @@ +package reports + +import ( + "context" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/spf13/cobra" + "github.com/urfave/cli" +) + +type CommandFlags struct { + DataDir string + Chain string + ClientsLimit uint + MaxPingTries uint + Estimate bool + + SentryCandidates bool + ErigonLogPath string +} + +type Command struct { + command cobra.Command + flags CommandFlags +} + +func NewCommand() *Command { + command := cobra.Command{ + Use: "report", + Short: "P2P network crawler database report", + } + + instance := Command{ + command: command, + } + instance.withDatadir() + instance.withChain() + instance.withClientsLimit() + instance.withMaxPingTries() + instance.withEstimate() + instance.withSentryCandidates() + instance.withErigonLogPath() + + return &instance +} + +func (command *Command) withDatadir() { + flag := utils.DataDirFlag + command.command.Flags().StringVar(&command.flags.DataDir, flag.Name, flag.Value.String(), flag.Usage) + must(command.command.MarkFlagDirname(utils.DataDirFlag.Name)) +} + +func (command *Command) withChain() { + flag := utils.ChainFlag + command.command.Flags().StringVar(&command.flags.Chain, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withClientsLimit() { + flag := cli.UintFlag{ + Name: "clients-limit", + Usage: "A number of top clients to show", + Value: uint(10), + } + command.command.Flags().UintVar(&command.flags.ClientsLimit, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withMaxPingTries() { + flag := cli.UintFlag{ + Name: "max-ping-tries", + Usage: "A number of PING failures for a node to be considered dead", + Value: 3, + } + command.command.Flags().UintVar(&command.flags.MaxPingTries, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) withEstimate() { + flag := cli.BoolFlag{ + Name: "estimate", + Usage: "Estimate totals including nodes that replied with 'too many peers'", + } + command.command.Flags().BoolVar(&command.flags.Estimate, flag.Name, false, flag.Usage) +} + +func (command *Command) withSentryCandidates() { + flag := cli.BoolFlag{ + Name: "sentry-candidates", + Usage: "Count unseen peers. Requires 'erigon-log'.", + } + command.command.Flags().BoolVar(&command.flags.SentryCandidates, flag.Name, false, flag.Usage) +} + +func (command *Command) withErigonLogPath() { + flag := cli.StringFlag{ + Name: "erigon-log", + Usage: "Erigon log file path", + } + command.command.Flags().StringVar(&command.flags.ErigonLogPath, flag.Name, flag.Value, flag.Usage) +} + +func (command *Command) RawCommand() *cobra.Command { + return &command.command +} + +func (command *Command) OnRun(runFunc func(ctx context.Context, flags CommandFlags) error) { + command.command.RunE = func(cmd *cobra.Command, args []string) error { + return runFunc(cmd.Context(), command.flags) + } +} + +func must(err error) { + if err != nil { + panic(err) + } +} diff --git a/cmd/observer/reports/sentry_candidates_report.go b/cmd/observer/reports/sentry_candidates_report.go new file mode 100644 index 00000000000..29e7b7cfb0b --- /dev/null +++ b/cmd/observer/reports/sentry_candidates_report.go @@ -0,0 +1,111 @@ +package reports + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "github.com/ledgerwatch/erigon/cmd/observer/observer/sentry_candidates" + "net/url" + "os" + "strings" +) + +type SentryCandidatesReport struct { + TotalCount uint + SeenCount uint + HandshakeCount uint + UnknownClientIDs []string + UnseenClientIDs []string +} + +func CreateSentryCandidatesReport( + ctx context.Context, + db database.DB, + logPath string, +) (*SentryCandidatesReport, error) { + logFile, err := os.Open(logPath) + if err != nil { + return nil, err + } + defer func() { + _ = logFile.Close() + }() + log := sentry_candidates.NewLog(sentry_candidates.NewScannerLineReader(logFile)) + + report := SentryCandidatesReport{} + + for { + event, err := log.Read() + if err != nil { + return nil, err + } + if event == nil { + break + } + + if event.NodeURL == "" { + continue + } + nodeURL, err := url.Parse(event.NodeURL) + if err != nil { + return nil, err + } + id := database.NodeID(nodeURL.User.Username()) + + knownAddr, err := db.FindNodeAddr(ctx, id) + if err != nil { + return nil, err + } + + knownClientID, err := db.FindClientID(ctx, id) + if err != nil { + return nil, err + } + + isSeen := knownAddr != nil + isKnownClientID := knownClientID != nil + + report.TotalCount++ + if isSeen { + report.SeenCount++ + } else { + report.UnseenClientIDs = append(report.UnseenClientIDs, event.ClientID) + } + if isKnownClientID { + report.HandshakeCount++ + } else { + report.UnknownClientIDs = append(report.UnknownClientIDs, event.ClientID) + } + } + + return &report, nil +} + +func (report *SentryCandidatesReport) String() string { + var builder strings.Builder + + builder.WriteString(fmt.Sprintf("total: %d", report.TotalCount)) + builder.WriteRune('\n') + builder.WriteString(fmt.Sprintf("seen: %d", report.SeenCount)) + builder.WriteRune('\n') + builder.WriteString(fmt.Sprintf("handshakes: %d", report.HandshakeCount)) + builder.WriteRune('\n') + + builder.WriteRune('\n') + builder.WriteString("unseen:") + builder.WriteRune('\n') + for _, clientID := range report.UnseenClientIDs { + builder.WriteString(clientID) + builder.WriteRune('\n') + } + + builder.WriteRune('\n') + builder.WriteString("unknown:") + builder.WriteRune('\n') + for _, clientID := range report.UnknownClientIDs { + builder.WriteString(clientID) + builder.WriteRune('\n') + } + + return builder.String() +} diff --git a/cmd/observer/reports/status_report.go b/cmd/observer/reports/status_report.go new file mode 100644 index 00000000000..c094e9b2036 --- /dev/null +++ b/cmd/observer/reports/status_report.go @@ -0,0 +1,40 @@ +package reports + +import ( + "context" + "fmt" + "github.com/ledgerwatch/erigon/cmd/observer/database" + "strings" +) + +type StatusReport struct { + TotalCount uint + DistinctIPCount uint +} + +func CreateStatusReport(ctx context.Context, db database.DB, maxPingTries uint, networkID uint) (*StatusReport, error) { + totalCount, err := db.CountNodes(ctx, maxPingTries, networkID) + if err != nil { + return nil, err + } + + distinctIPCount, err := db.CountIPs(ctx, maxPingTries, networkID) + if err != nil { + return nil, err + } + + report := StatusReport{ + totalCount, + distinctIPCount, + } + return &report, nil +} + +func (report *StatusReport) String() string { + var builder strings.Builder + builder.WriteString(fmt.Sprintf("total: %d", report.TotalCount)) + builder.WriteRune('\n') + builder.WriteString(fmt.Sprintf("distinct IPs: %d", report.DistinctIPCount)) + builder.WriteRune('\n') + return builder.String() +} diff --git a/cmd/observer/utils/pubkey_hex.go b/cmd/observer/utils/pubkey_hex.go new file mode 100644 index 00000000000..0644bba00a8 --- /dev/null +++ b/cmd/observer/utils/pubkey_hex.go @@ -0,0 +1,48 @@ +package utils + +import ( + "crypto/ecdsa" + "encoding/hex" + "fmt" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/p2p/enode" +) + +func ParseHexPublicKey(keyStr string) (*ecdsa.PublicKey, error) { + nodeWithPubkey, err := enode.ParseV4("enode://" + keyStr) + if err != nil { + return nil, fmt.Errorf("failed to decode a public key: %w", err) + } + return nodeWithPubkey.Pubkey(), nil +} + +func ParseHexPublicKeys(hexKeys []string) ([]*ecdsa.PublicKey, error) { + if hexKeys == nil { + return nil, nil + } + keys := make([]*ecdsa.PublicKey, 0, len(hexKeys)) + for _, keyStr := range hexKeys { + key, err := ParseHexPublicKey(keyStr) + if err != nil { + return nil, err + } + keys = append(keys, key) + } + return keys, nil +} + +func HexEncodePublicKey(key *ecdsa.PublicKey) string { + return hex.EncodeToString(crypto.MarshalPubkey(key)) +} + +func HexEncodePublicKeys(keys []*ecdsa.PublicKey) []string { + if keys == nil { + return nil + } + hexKeys := make([]string, 0, len(keys)) + for _, key := range keys { + keyStr := HexEncodePublicKey(key) + hexKeys = append(hexKeys, keyStr) + } + return hexKeys +} diff --git a/cmd/observer/utils/retry.go b/cmd/observer/utils/retry.go new file mode 100644 index 00000000000..ab745415a37 --- /dev/null +++ b/cmd/observer/utils/retry.go @@ -0,0 +1,32 @@ +package utils + +import ( + "context" + "github.com/ledgerwatch/log/v3" + "time" +) + +func Retry( + ctx context.Context, + retryCount int, + delayForAttempt func(attempt int) time.Duration, + isRecoverableError func(error) bool, + logger log.Logger, + opName string, + op func(context.Context) (interface{}, error), +) (interface{}, error) { + var result interface{} + var err error + + for i := 0; i <= retryCount; i++ { + if i > 0 { + logger.Trace("retrying", "op", opName, "attempt", i, "err", err) + Sleep(ctx, delayForAttempt(i)) + } + result, err = op(ctx) + if (err == nil) || !isRecoverableError(err) { + break + } + } + return result, err +} diff --git a/cmd/observer/utils/sleep.go b/cmd/observer/utils/sleep.go new file mode 100644 index 00000000000..336f5314021 --- /dev/null +++ b/cmd/observer/utils/sleep.go @@ -0,0 +1,15 @@ +package utils + +import ( + "context" + "time" +) + +func Sleep(parentContext context.Context, timeout time.Duration) { + if timeout <= 0 { + return + } + ctx, cancel := context.WithTimeout(parentContext, timeout) + defer cancel() + <-ctx.Done() +} diff --git a/cmd/observer/utils/task_queue.go b/cmd/observer/utils/task_queue.go new file mode 100644 index 00000000000..b01af3c60be --- /dev/null +++ b/cmd/observer/utils/task_queue.go @@ -0,0 +1,51 @@ +package utils + +import ( + "context" + "errors" +) + +type TaskQueue struct { + name string + queue chan func(context.Context) error + + logFuncProvider func(err error) func(msg string, ctx ...interface{}) +} + +func NewTaskQueue( + name string, + capacity uint, + logFuncProvider func(err error) func(msg string, ctx ...interface{}), +) *TaskQueue { + queue := make(chan func(context.Context) error, capacity) + + instance := TaskQueue{ + name, + queue, + logFuncProvider, + } + return &instance +} + +func (queue *TaskQueue) Run(ctx context.Context) { + for ctx.Err() == nil { + select { + case <-ctx.Done(): + break + case op := <-queue.queue: + err := op(ctx) + if (err != nil) && !errors.Is(err, context.Canceled) { + logFunc := queue.logFuncProvider(err) + logFunc("Task failed", "queue", queue.name, "err", err) + } + } + } +} + +func (queue *TaskQueue) EnqueueTask(ctx context.Context, op func(context.Context) error) { + select { + case <-ctx.Done(): + break + case queue.queue <- op: + } +} diff --git a/cmd/prometheus/dashboards/erigon.json b/cmd/prometheus/dashboards/erigon.json index 9f6a3a28744..15e7a4226fe 100644 --- a/cmd/prometheus/dashboards/erigon.json +++ b/cmd/prometheus/dashboards/erigon.json @@ -8,20 +8,36 @@ "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, "type": "dashboard" } ] }, "editable": true, - "gnetId": null, + "fiscalYearStartMonth": 0, "graphTooltip": 0, "id": 1, - "iteration": 1627480859250, + "iteration": 1642907202703, "links": [], + "liveNow": false, "panels": [ { - "cacheTimeout": null, - "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 171, + "title": "Blocks execution", + "type": "row" + }, + { "fieldConfig": { "defaults": { "color": { @@ -77,14 +93,14 @@ "h": 5, "w": 8, "x": 0, - "y": 0 + "y": 1 }, "id": 144, "links": [], "options": { "legend": { "calcs": [ - "lastNotNull" + "last" ], "displayMode": "list", "placement": "bottom" @@ -96,22 +112,19 @@ "pluginVersion": "8.0.6", "targets": [ { - "expr": "stage_execution{instance=~\"$instance\"}", + "exemplar": true, + "expr": "sync{instance=~\"$instance\"}", "format": "time_series", "interval": "", "intervalFactor": 1, - "legendFormat": "execution: {{instance}}", + "legendFormat": "{{ stage }}: {{instance}}", "refId": "A" } ], - "timeFrom": null, - "timeShift": null, - "title": "Block Execution progress", + "title": "Sync Stages progress", "type": "timeseries" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -167,15 +180,14 @@ "h": 5, "w": 8, "x": 8, - "y": 0 + "y": 1 }, "id": 158, "links": [], "options": { "legend": { "calcs": [ - "mean", - "lastNotNull" + "mean" ], "displayMode": "list", "placement": "bottom" @@ -187,22 +199,19 @@ "pluginVersion": "8.0.6", "targets": [ { - "expr": "rate(stage_execution{instance=~\"$instance\"}[5m])", + "exemplar": true, + "expr": "rate(sync{instance=~\"$instance\"}[$rate_interval])", "format": "time_series", "interval": "", "intervalFactor": 1, - "legendFormat": "execution: {{instance}}", + "legendFormat": "{{ stage }}: {{instance}}", "refId": "A" } ], - "timeFrom": null, - "timeShift": null, - "title": "Blocks Execution rate", + "title": "Sync Stages progress rate", "type": "timeseries" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -250,7 +259,7 @@ } ] }, - "unit": "ns" + "unit": "s" }, "overrides": [] }, @@ -258,7 +267,7 @@ "h": 5, "w": 8, "x": 16, - "y": 0 + "y": 1 }, "id": 112, "links": [], @@ -287,19 +296,16 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Block Execution speed ", "type": "timeseries" }, { "collapsed": false, - "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 5 + "y": 6 }, "id": 17, "panels": [], @@ -307,7 +313,6 @@ "type": "row" }, { - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -363,7 +368,7 @@ "h": 5, "w": 8, "x": 0, - "y": 6 + "y": 7 }, "id": 141, "options": { @@ -386,13 +391,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Commit", "type": "timeseries" }, { - "datasource": null, "description": "", "fieldConfig": { "defaults": { @@ -449,7 +451,7 @@ "h": 5, "w": 8, "x": 8, - "y": 6 + "y": 7 }, "id": 166, "options": { @@ -498,13 +500,10 @@ "refId": "D" } ], - "timeFrom": null, - "timeShift": null, "title": "Commit speed", "type": "timeseries" }, { - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -560,7 +559,7 @@ "h": 5, "w": 8, "x": 16, - "y": 6 + "y": 7 }, "id": 159, "options": { @@ -584,13 +583,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "DB Size", "type": "timeseries" }, { - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -646,7 +642,7 @@ "h": 6, "w": 8, "x": 0, - "y": 11 + "y": 12 }, "id": 169, "options": { @@ -695,13 +691,10 @@ "refId": "D" } ], - "timeFrom": null, - "timeShift": null, "title": "GC and State", "type": "timeseries" }, { - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -757,7 +750,7 @@ "h": 6, "w": 8, "x": 8, - "y": 11 + "y": 12 }, "id": 168, "options": { @@ -839,13 +832,10 @@ "refId": "H" } ], - "timeFrom": null, - "timeShift": null, "title": "DB Pages Ops/sec", "type": "timeseries" }, { - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -901,7 +891,7 @@ "h": 6, "w": 8, "x": 16, - "y": 11 + "y": 12 }, "id": 167, "options": { @@ -932,19 +922,16 @@ "refId": "B" } ], - "timeFrom": null, - "timeShift": null, "title": "Tx Size", "type": "timeseries" }, { "collapsed": false, - "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 17 + "y": 18 }, "id": 134, "panels": [], @@ -952,7 +939,6 @@ "type": "row" }, { - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -971,7 +957,7 @@ "h": 18, "w": 8, "x": 0, - "y": 18 + "y": 19 }, "id": 165, "options": { @@ -992,7 +978,7 @@ }, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "expr": "ru_inblock{instance=~\"$instance\"}", @@ -1092,13 +1078,14 @@ "refId": "N" } ], - "timeFrom": null, - "timeShift": null, "title": "Rusage Total (\"last value\" - \"first value\" on selected period)", "type": "stat" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "description": "", "fieldConfig": { "defaults": { @@ -1155,7 +1142,7 @@ "h": 6, "w": 8, "x": 8, - "y": 18 + "y": 19 }, "id": 155, "links": [], @@ -1194,13 +1181,10 @@ "refId": "D" } ], - "timeFrom": null, - "timeShift": null, "title": "Read/Write syscall/sec", "type": "timeseries" }, { - "datasource": null, "description": "", "fieldConfig": { "defaults": { @@ -1257,7 +1241,7 @@ "h": 6, "w": 8, "x": 16, - "y": 18 + "y": 19 }, "id": 150, "options": { @@ -1290,13 +1274,14 @@ "refId": "B" } ], - "timeFrom": null, - "timeShift": null, "title": "getrusage: minflt - soft page faults (reclaims), majflt - hard faults", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "fieldConfig": { "defaults": { "color": { @@ -1352,7 +1337,7 @@ "h": 6, "w": 8, "x": 8, - "y": 24 + "y": 25 }, "id": 85, "links": [], @@ -1389,13 +1374,10 @@ "refId": "B" } ], - "timeFrom": null, - "timeShift": null, "title": "Disk bytes/sec", "type": "timeseries" }, { - "datasource": null, "description": "", "fieldConfig": { "defaults": { @@ -1444,7 +1426,7 @@ } ] }, - "unit": "short" + "unit": "cps" }, "overrides": [] }, @@ -1452,7 +1434,7 @@ "h": 6, "w": 8, "x": 16, - "y": 24 + "y": 25 }, "id": 153, "options": { @@ -1477,13 +1459,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, - "title": "go_cgo_calls_count", + "title": "cgo calls", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "description": "", "fieldConfig": { "defaults": { @@ -1540,7 +1523,7 @@ "h": 6, "w": 8, "x": 8, - "y": 30 + "y": 31 }, "id": 154, "links": [], @@ -1616,13 +1599,14 @@ "refId": "F" } ], - "timeFrom": null, - "timeShift": null, "title": "go memstat", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "fieldConfig": { "defaults": { "color": { @@ -1678,7 +1662,7 @@ "h": 6, "w": 8, "x": 16, - "y": 30 + "y": 31 }, "id": 128, "options": { @@ -1708,13 +1692,10 @@ "refId": "B" } ], - "timeFrom": null, - "timeShift": null, "title": "GO Goroutines and Threads", "type": "timeseries" }, { - "datasource": null, "description": "", "fieldConfig": { "defaults": { @@ -1771,7 +1752,7 @@ "h": 5, "w": 8, "x": 0, - "y": 36 + "y": 37 }, "id": 148, "options": { @@ -1841,13 +1822,14 @@ "refId": "G" } ], - "timeFrom": null, - "timeShift": null, "title": "mem: resident set size", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "fieldConfig": { "defaults": { "color": { @@ -1897,13 +1879,38 @@ }, "unit": "s" }, - "overrides": [] + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "{instance=\"turbogeth16c.weblogix.it:6062\", job=\"erigon\", quantile=\"0.75\"}" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] }, "gridPos": { "h": 5, "w": 8, "x": 16, - "y": 36 + "y": 37 }, "id": 124, "options": { @@ -1927,13 +1934,14 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "GC Stop the World per sec", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "description": "", "fieldConfig": { "defaults": { @@ -1990,7 +1998,7 @@ "h": 5, "w": 8, "x": 0, - "y": 41 + "y": 42 }, "id": 86, "links": [], @@ -2026,13 +2034,14 @@ "refId": "B" } ], - "timeFrom": null, - "timeShift": null, "title": "Process Mem: allocate objects/sec, free", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "fieldConfig": { "defaults": { "color": { @@ -2088,7 +2097,7 @@ "h": 5, "w": 8, "x": 0, - "y": 46 + "y": 47 }, "id": 106, "links": [], @@ -2123,19 +2132,16 @@ "refId": "B" } ], - "timeFrom": null, - "timeShift": null, "title": "CPU", "type": "timeseries" }, { "collapsed": false, - "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 51 + "y": 52 }, "id": 82, "panels": [], @@ -2143,7 +2149,10 @@ "type": "row" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "description": "", "fieldConfig": { "defaults": { @@ -2200,7 +2209,7 @@ "h": 5, "w": 8, "x": 0, - "y": 52 + "y": 53 }, "id": 157, "links": [], @@ -2299,174 +2308,1465 @@ "refId": "I" } ], - "timeFrom": null, - "timeShift": null, "title": "Host VMem", "type": "timeseries" }, { - "collapsed": true, - "datasource": null, + "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 57 + "y": 58 }, - "id": 146, - "panels": [ - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 54 - }, - "hiddenSeries": false, - "id": 122, - "legend": { - "alignAsTable": true, - "avg": true, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sort": "avg", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true + "id": 173, + "panels": [], + "title": "TxPool v2", + "type": "row" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" }, - "percentage": false, - "pluginVersion": "8.0.6", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "trie_subtrieloader_flatdb{quantile=\"$quantile\",instance=~\"$instance\"}", - "interval": "", - "legendFormat": "trie_subtrieloader_flatdb: {{quantile}}, {{instance}}", - "refId": "B" + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false }, - { - "expr": "trie_subtrieloader_witnessdb{quantile=\"$quantile\",instance=~\"$instance\"}", - "interval": "", - "legendFormat": "trie_subtrieloader_witnessdb: {{quantile}}, {{instance}}", - "refId": "C" + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Merkle Root calculation (stage 5)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "graph", - "xaxis": { - "buckets": 6, - "mode": "time", - "name": null, - "show": true, - "values": [] + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] }, - "yaxes": [ - { - "$$hashKey": "object:431", - "format": "ns", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "unit": "s" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "pool_write_to_db: turbogeth16c.weblogix.it:6060" + ], + "prefix": "All except:", + "readOnly": true + } }, - { - "$$hashKey": "object:432", - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 59 + }, + "id": 175, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "Prometheus", - "description": "", - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 54 - }, - "hiddenSeries": false, - "id": 162, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "alertThreshold": true - }, - "percentage": false, - "pluginVersion": "8.0.6", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(db_op_set_count{instance=~\"$instance\"}[1m])", - "interval": "", - "legendFormat": "", + "exemplar": true, + "expr": "pool_process_remote_txs{quantile=\"$quantile\",instance=~\"$instance\"}", + "interval": "", + "legendFormat": "process_remote_txs: {{ instance }}", + "refId": "A" + }, + { + "exemplar": true, + "expr": "pool_add_remote_txs{quantile=\"$quantile\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "add_remote_txs: {{ instance }}", + "refId": "B" + }, + { + "exemplar": true, + "expr": "pool_new_block{quantile=\"$quantile\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "new_block: {{ instance }}", + "refId": "C" + }, + { + "exemplar": true, + "expr": "pool_write_to_db{quantile=\"$quantile\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "write_to_db: {{ instance }}", + "refId": "D" + }, + { + "exemplar": true, + "expr": "pool_propagate_to_new_peer{quantile=\"$quantile\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "propagate_to_new_peer: {{ instance }}", + "refId": "E" + }, + { + "exemplar": true, + "expr": "pool_propagate_new_txs{quantile=\"$quantile\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "propagate_new_txs: {{ instance }}", + "refId": "F" + } + ], + "title": "Timings", + "transformations": [], + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "pool_add_remote_txs_count: turbogeth16c.weblogix.it:6060" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 59 + }, + "id": 177, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "rate(pool_process_remote_txs_count{instance=~\"$instance\"}[$rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "pool_process_remote_txs_count: {{ instance }}", + "refId": "A" + }, + { + "exemplar": true, + "expr": "rate(pool_add_remote_txs_count{instance=~\"$instance\"}[$rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "pool_add_remote_txs_count: {{ instance }}", + "refId": "B" + }, + { + "exemplar": true, + "expr": "rate(pool_new_block_count{instance=~\"$instance\"}[$rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "pool_new_block_count: {{ instance }}", + "refId": "C" + }, + { + "exemplar": true, + "expr": "rate(pool_write_to_db_count{instance=~\"$instance\"}[$rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "pool_write_to_db_count: {{ instance }}", + "refId": "D" + } + ], + "title": "RPS", + "transformations": [], + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 67 + }, + "id": 176, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "sum(delta(cache_total{result=\"hit\",name=\"txpool\",instance=~\"$instance\"}[1m]))/sum(delta(cache_total{name=\"txpool\",instance=~\"$instance\"}[1m])) ", + "hide": false, + "interval": "", + "legendFormat": "hit rate: {{ instance }} ", + "refId": "A" + } + ], + "title": "Cache hit-rate", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "hit: turbogeth16c.weblogix.it:6060 " + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 67 + }, + "id": 180, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "rate(cache_total{name=\"txpool\",instance=~\"$instance\"}[1m])", + "hide": false, + "interval": "", + "legendFormat": "{{ result }}: {{ instance }} ", + "refId": "A" + }, + { + "exemplar": true, + "expr": "rate(cache_timeout_total{name=\"txpool\",instance=~\"$instance\"}[1m])", + "hide": false, + "interval": "", + "legendFormat": "timeout: {{ instance }} ", + "refId": "B" + } + ], + "title": "Cache rps", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 67 + }, + "id": 181, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "cache_keys_total{name=\"txpool\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "keys: {{ instance }} ", + "refId": "A" + }, + { + "exemplar": true, + "expr": "cache_list_total{name=\"txpool\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "list: {{ instance }} ", + "refId": "B" + } + ], + "title": "Cache keys", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 73 + }, + "id": 178, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "rate(pool_write_to_db_bytes{instance=~\"$instance\"}[$rate_interval])", + "hide": false, + "interval": "", + "legendFormat": "pool_write_to_db_bytes: {{ instance }}", + "refId": "A" + } + ], + "title": "DB", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 79 + }, + "id": 183, + "panels": [], + "title": "RPC", + "type": "row" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "success eth_call turbogeth16c.weblogix.it:6062 " + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 80 + }, + "id": 185, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "rate(rpc_duration_seconds_count{instance=~\"$instance\",success=\"success\"}[1m])", + "interval": "", + "legendFormat": "success {{ method }} {{ instance }} ", + "refId": "A" + }, + { + "exemplar": true, + "expr": "rate(rpc_duration_seconds_count{instance=~\"$instance\",success=\"failure\"}[1m])", + "hide": false, + "interval": "", + "legendFormat": "failure {{ method }} {{ instance }} ", + "refId": "B" + } + ], + "title": "RPS", + "transformations": [], + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 80 + }, + "id": 186, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "db_begin_seconds{quantile=\"$quantile\",instance=~\"$instance\"}", + "interval": "", + "legendFormat": "db_begin_seconds: {{ method }} {{ instance }}", + "refId": "A" + } + ], + "title": "DB begin", + "transformations": [], + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + " eth_call turbogeth16c.weblogix.it:6062 success", + " eth_call turbogeth16c.weblogix.it:6062 failure" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 88 + }, + "id": 187, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "rpc_duration_seconds{quantile=\"$quantile\",instance=~\"$instance\"}", + "interval": "", + "legendFormat": " {{ method }} {{ instance }} {{ success }}", + "refId": "A" + } + ], + "title": "Timings", + "transformations": [], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 88 + }, + "id": 188, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi" + } + }, + "pluginVersion": "8.0.6", + "targets": [ + { + "expr": "go_goroutines{instance=~\"$instance\"}", + "instant": false, + "interval": "", + "legendFormat": "go/goroutines: {{instance}}", + "refId": "A" + }, + { + "expr": "go_threads{instance=~\"$instance\"}", + "instant": false, + "interval": "", + "legendFormat": "go/threads: {{instance}}", + "refId": "B" + } + ], + "title": "GO Goroutines and Threads", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 96 + }, + "id": 189, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "cache_keys_total{name=\"rpc\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "keys: {{ instance }} ", + "refId": "A" + }, + { + "exemplar": true, + "expr": "cache_list_total{name=\"rpc\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "list: {{ instance }} ", + "refId": "B" + }, + { + "exemplar": true, + "expr": "cache_code_keys_total{name=\"rpc\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "code_keys: {{ instance }} ", + "refId": "C" + }, + { + "exemplar": true, + "expr": "cache_code_list_total{name=\"rpc\",instance=~\"$instance\"}", + "hide": false, + "interval": "", + "legendFormat": "code_list: {{ instance }} ", + "refId": "D" + } + ], + "title": "Cache keys", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 96 + }, + "id": 184, + "options": { + "legend": { + "calcs": [ + "mean", + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "exemplar": true, + "expr": "sum(delta(cache_total{result=\"hit\",name=\"rpc\",instance=~\"$instance\"}[1m]))/sum(delta(cache_total{name=\"rpc\",instance=~\"$instance\"}[1m])) ", + "hide": false, + "interval": "", + "legendFormat": "hit rate: {{ instance }} ", + "refId": "A" + }, + { + "exemplar": true, + "expr": "sum(delta(cache_code_total{result=\"hit\",name=\"rpc\",instance=~\"$instance\"}[1m]))/sum(delta(cache_code_total{name=\"rpc\",instance=~\"$instance\"}[1m])) ", + "hide": false, + "interval": "", + "legendFormat": "code hit rate: {{ instance }} ", + "refId": "B" + } + ], + "title": "Cache hit-rate", + "type": "timeseries" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 102 + }, + "id": 146, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 5, + "w": 8, + "x": 0, + "y": 54 + }, + "hiddenSeries": false, + "id": 122, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.6", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "trie_subtrieloader_flatdb{quantile=\"$quantile\",instance=~\"$instance\"}", + "interval": "", + "legendFormat": "trie_subtrieloader_flatdb: {{quantile}}, {{instance}}", + "refId": "B" + }, + { + "expr": "trie_subtrieloader_witnessdb{quantile=\"$quantile\",instance=~\"$instance\"}", + "interval": "", + "legendFormat": "trie_subtrieloader_witnessdb: {{quantile}}, {{instance}}", + "refId": "C" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Merkle Root calculation (stage 5)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": 6, + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:431", + "format": "ns", + "logBase": 1, + "show": true + }, + { + "$$hashKey": "object:432", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, + "description": "", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 5, + "w": 8, + "x": 8, + "y": 54 + }, + "hiddenSeries": false, + "id": 162, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.0.6", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(db_op_set_count{instance=~\"$instance\"}[1m])", + "interval": "", + "legendFormat": "", "refId": "E" }, { @@ -2518,9 +3818,7 @@ } ], "thresholds": [], - "timeFrom": null, "timeRegions": [], - "timeShift": null, "title": "AutoDupsort Call/Sec", "tooltip": { "shared": true, @@ -2529,9 +3827,7 @@ }, "type": "graph", "xaxis": { - "buckets": null, "mode": "time", - "name": null, "show": true, "values": [] }, @@ -2539,25 +3835,18 @@ { "$$hashKey": "object:139", "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true }, { "$$hashKey": "object:140", "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true } ], "yaxis": { - "align": false, - "alignLevel": null + "align": false } }, { @@ -2565,7 +3854,6 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": null, "fill": 1, "fillGradient": 0, "gridPos": { @@ -2609,9 +3897,7 @@ } ], "thresholds": [], - "timeFrom": null, "timeRegions": [], - "timeShift": null, "title": "db.Get() latency", "tooltip": { "shared": true, @@ -2620,9 +3906,7 @@ }, "type": "graph", "xaxis": { - "buckets": null, "mode": "time", - "name": null, "show": true, "values": [] }, @@ -2630,25 +3914,18 @@ { "$$hashKey": "object:887", "format": "ns", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true }, { "$$hashKey": "object:888", "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true } ], "yaxis": { - "align": false, - "alignLevel": null + "align": false } }, { @@ -2656,7 +3933,10 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "description": "", "fill": 1, "fillGradient": 0, @@ -2751,9 +4031,7 @@ } ], "thresholds": [], - "timeFrom": null, "timeRegions": [], - "timeShift": null, "title": "AutoDupsort Call/Sec", "tooltip": { "shared": true, @@ -2762,9 +4040,7 @@ }, "type": "graph", "xaxis": { - "buckets": null, "mode": "time", - "name": null, "show": true, "values": [] }, @@ -2772,25 +4048,18 @@ { "$$hashKey": "object:139", "format": "ns", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true }, { "$$hashKey": "object:140", "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true } ], "yaxis": { - "align": false, - "alignLevel": null + "align": false } }, { @@ -2798,7 +4067,10 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "description": "", "fill": 1, "fillGradient": 0, @@ -2957,9 +4229,7 @@ } ], "thresholds": [], - "timeFrom": null, "timeRegions": [], - "timeShift": null, "title": "AutoDupsort Put latency", "tooltip": { "shared": true, @@ -2968,9 +4238,7 @@ }, "type": "graph", "xaxis": { - "buckets": null, "mode": "time", - "name": null, "show": true, "values": [] }, @@ -2978,25 +4246,18 @@ { "$$hashKey": "object:139", "format": "ns", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true }, { "$$hashKey": "object:140", "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": false } ], "yaxis": { - "align": false, - "alignLevel": null + "align": false } } ], @@ -3005,12 +4266,11 @@ }, { "collapsed": false, - "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 58 + "y": 103 }, "id": 75, "panels": [], @@ -3018,7 +4278,10 @@ "type": "row" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "fieldConfig": { "defaults": { "color": { @@ -3074,7 +4337,7 @@ "h": 6, "w": 12, "x": 0, - "y": 59 + "y": 104 }, "id": 96, "links": [], @@ -3115,13 +4378,14 @@ "refId": "C" } ], - "timeFrom": null, - "timeShift": null, "title": "Traffic", "type": "timeseries" }, { - "datasource": "Prometheus", + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" + }, "fieldConfig": { "defaults": { "color": { @@ -3177,7 +4441,7 @@ "h": 6, "w": 12, "x": 12, - "y": 59 + "y": 104 }, "id": 77, "links": [], @@ -3223,19 +4487,16 @@ "refId": "C" } ], - "timeFrom": null, - "timeShift": null, "title": "Peers", "type": "timeseries" }, { "collapsed": false, - "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 65 + "y": 110 }, "id": 4, "panels": [], @@ -3243,8 +4504,6 @@ "type": "row" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "mappings": [ @@ -3279,10 +4538,9 @@ "h": 3, "w": 4, "x": 0, - "y": 66 + "y": 111 }, "id": 108, - "interval": null, "links": [], "maxDataPoints": 100, "options": { @@ -3305,7 +4563,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "expr": "stage_headers{instance=~\"$instance\"}", @@ -3316,14 +4574,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Latest header", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "mappings": [ @@ -3358,10 +4612,9 @@ "h": 3, "w": 4, "x": 4, - "y": 66 + "y": 111 }, "id": 111, - "interval": null, "links": [], "maxDataPoints": 100, "options": { @@ -3384,7 +4637,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "exemplar": true, @@ -3396,14 +4649,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Latest receipt", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "mappings": [ @@ -3438,10 +4687,9 @@ "h": 3, "w": 4, "x": 8, - "y": 66 + "y": 111 }, "id": 109, - "interval": null, "links": [], "maxDataPoints": 100, "options": { @@ -3464,7 +4712,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "exemplar": true, @@ -3476,14 +4724,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Latest block", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "mappings": [ @@ -3518,10 +4762,9 @@ "h": 3, "w": 4, "x": 12, - "y": 66 + "y": 111 }, "id": 113, - "interval": null, "links": [], "maxDataPoints": 100, "options": { @@ -3544,7 +4787,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "expr": "txpool_pending{instance=~\"$instance\"}", @@ -3555,14 +4798,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Executable transactions", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "mappings": [ @@ -3597,10 +4836,9 @@ "h": 3, "w": 4, "x": 16, - "y": 66 + "y": 111 }, "id": 114, - "interval": null, "links": [], "maxDataPoints": 100, "options": { @@ -3623,7 +4861,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "expr": "txpool_queued{instance=~\"$instance\"}", @@ -3634,14 +4872,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Gapped transactions", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "mappings": [ @@ -3676,10 +4910,9 @@ "h": 3, "w": 4, "x": 20, - "y": 66 + "y": 111 }, "id": 115, - "interval": null, "links": [], "maxDataPoints": 100, "options": { @@ -3702,7 +4935,7 @@ "text": {}, "textMode": "auto" }, - "pluginVersion": "8.0.6", + "pluginVersion": "8.3.3", "targets": [ { "expr": "txpool_local{instance=~\"$instance\"}", @@ -3713,14 +4946,10 @@ "refId": "A" } ], - "timeFrom": null, - "timeShift": null, "title": "Local transactions", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -3776,7 +5005,7 @@ "h": 6, "w": 12, "x": 0, - "y": 69 + "y": 114 }, "id": 110, "links": [], @@ -3817,14 +5046,10 @@ "refId": "C" } ], - "timeFrom": null, - "timeShift": null, "title": "Chain head", "type": "timeseries" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -3880,7 +5105,7 @@ "h": 6, "w": 12, "x": 12, - "y": 69 + "y": 114 }, "id": 116, "links": [], @@ -3921,14 +5146,10 @@ "refId": "C" } ], - "timeFrom": null, - "timeShift": null, "title": "Transaction pool", "type": "timeseries" }, { - "cacheTimeout": null, - "datasource": null, "fieldConfig": { "defaults": { "color": { @@ -3984,7 +5205,7 @@ "h": 7, "w": 24, "x": 0, - "y": 75 + "y": 120 }, "id": 117, "links": [], @@ -4100,19 +5321,16 @@ "refId": "J" } ], - "timeFrom": null, - "timeShift": null, "title": "Transaction propagation", "type": "timeseries" }, { "collapsed": true, - "datasource": null, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 82 + "y": 127 }, "id": 138, "panels": [ @@ -4121,7 +5339,6 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": null, "fieldConfig": { "defaults": { "custom": {} @@ -4177,9 +5394,7 @@ } ], "thresholds": [], - "timeFrom": null, "timeRegions": [], - "timeShift": null, "title": "gRPC call, error rates ", "tooltip": { "shared": true, @@ -4188,33 +5403,24 @@ }, "type": "graph", "xaxis": { - "buckets": null, "mode": "time", - "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true }, { "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": true } ], "yaxis": { - "align": false, - "alignLevel": null + "align": false } } ], @@ -4223,23 +5429,19 @@ } ], "refresh": "30s", - "schemaVersion": 30, + "schemaVersion": 34, "style": "dark", "tags": [], "templating": { "list": [ { - "allValue": null, "current": { "selected": false, "text": "0.97", "value": "0.97" }, - "description": null, - "error": null, "hide": 0, "includeAll": false, - "label": null, "multi": false, "name": "quantile", "options": [ @@ -4275,20 +5477,16 @@ "type": "custom" }, { - "allValue": null, "current": { - "selected": true, - "text": [ - "turbogeth16d.weblogix.it:6060" - ], - "value": [ - "turbogeth16d.weblogix.it:6060" - ] + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "PBFA97CFB590B2093" }, - "datasource": "Prometheus", "definition": "go_goroutines", - "description": null, - "error": null, "hide": 0, "includeAll": true, "label": "instance", @@ -4314,17 +5512,20 @@ "auto_min": "10s", "current": { "selected": false, - "text": "10m", - "value": "10m" + "text": "1m", + "value": "1m" }, - "description": null, - "error": null, "hide": 0, "label": "Rate Interval", "name": "rate_interval", "options": [ { "selected": true, + "text": "1m", + "value": "1m" + }, + { + "selected": false, "text": "10m", "value": "10m" }, @@ -4374,7 +5575,7 @@ "value": "30d" } ], - "query": "10m,30m,1h,3h,6h,12h,1d,7d,14d,30d", + "query": "1m,10m,30m,1h,3h,6h,12h,1d,7d,14d,30d", "queryValue": "", "refresh": 2, "skipUrlSync": false, @@ -4413,5 +5614,6 @@ "timezone": "", "title": "Erigon Prometheus", "uid": "FPpjH6Hik", - "version": 10 + "version": 57, + "weekStart": "" } \ No newline at end of file diff --git a/cmd/rpcdaemon/README.md b/cmd/rpcdaemon/README.md index 277fd82f746..50ad1581831 100644 --- a/cmd/rpcdaemon/README.md +++ b/cmd/rpcdaemon/README.md @@ -2,6 +2,7 @@ - [Getting Started](#getting-started) * [Running locally](#running-locally) * [Running remotely](#running-remotely) + * [Healthcheck](#healthcheck) * [Testing](#testing) - [FAQ](#faq) * [Relations between prune options and rpc methods](#relations-between-prune-options-and-rpc-method) @@ -12,7 +13,7 @@ * [Trace transactions progress](#trace-transactions-progress) * [Clients getting timeout, but server load is low](#clients-getting-timeout--but-server-load-is-low) * [Server load too high](#server-load-too-high) - * [Batch requests](#batch-requests) + * [Faster Batch requests](#faster-batch-requests) - [For Developers](#for-developers) * [Code generation](#code-generation) @@ -41,7 +42,7 @@ it's much faster than TCP access. Provide both `--datadir` and `--private.api.ad make erigon ./build/bin/erigon --datadir= --private.api.addr=localhost:9090 make rpcdaemon -./build/bin/rpcdaemon --datadir= --private.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool,shh +./build/bin/rpcdaemon --datadir= --txpool.api.addr=localhost:9090 --private.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool ``` Note that we've also specified which RPC namespaces to enable in the above command by `--http.api` flag. @@ -54,7 +55,7 @@ To start the daemon remotely - just don't set `--datadir` flag: make erigon ./build/bin/erigon --datadir= --private.api.addr=0.0.0.0:9090 make rpcdaemon -./build/bin/rpcdaemon --private.api.addr=:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool,shh +./build/bin/rpcdaemon --private.api.addr=:9090 --txpool.api.addr=localhost:9090 --http.api=eth,erigon,web3,net,debug,trace,txpool ``` The daemon should respond with something like: @@ -63,6 +64,49 @@ The daemon should respond with something like: INFO [date-time] HTTP endpoint opened url=localhost:8545... ``` +When RPC daemon runs remotely, by default it maintains a state cache, which is updated every time when Erigon imports a +new block. When state cache is reasonably warm, it allows such remote RPC daemon to execute queries related to `latest` +block (i.e. to current state) with comparable performance to a local RPC daemon +(around 2x slower vs 10x slower without state cache). Since there can be multiple such RPC daemons per one Erigon node, +it may scale well for some workloads that are heavy on the current state queries. + +### Healthcheck + +Running the daemon also opens an endpoint `/health` that provides a basic health check. + +If the health check is successful it returns 200 OK. + +If the health check fails it returns 500 Internal Server Error. + +Configuration of the health check is sent as POST body of the method. + +``` +{ + "min_peer_count": , + "known_block": +} +``` + +Not adding a check disables that. + +**`min_peer_count`** -- checks for mimimum of healthy node peers. Requires +`net` namespace to be listed in `http.api`. + +**`known_block`** -- sets up the block that node has to know about. Requires +`eth` namespace to be listed in `http.api`. + +Example request +```http POST http://localhost:8545/health --raw '{"min_peer_count": 3, "known_block": "0x1F"}'``` +Example response + +``` +{ + "check_block": "HEALTHY", + "healthcheck_query": "HEALTHY", + "min_peer_count": "HEALTHY" +} +``` + ### Testing By default, the `rpcdaemon` serves data from `localhost:8545`. You may send `curl` commands to see if things are @@ -95,10 +139,10 @@ to test the RPC. Next options available (by `--prune` flag): ``` -* h - prune history (ChangeSets, HistoryIndices - used to access historical state) +* h - prune history (ChangeSets, HistoryIndices - used to access historical state, like eth_getStorageAt, eth_getBalanceAt, debug_traceTransaction, trace_block, trace_transaction, etc.) * r - prune receipts (Receipts, Logs, LogTopicIndex, LogAddressIndex - used by eth_getLogs and similar RPC methods) * t - prune tx lookup (used to get transaction by hash) -* c - prune call traces (used by trace_* methods) +* c - prune call traces (used by trace_filter method) ``` By default data pruned after 90K blocks, can change it by flags like `--prune.history.after=100_000` @@ -107,6 +151,8 @@ Some methods, if not found historical data in DB, can fallback to old blocks re- ### RPC Implementation Status +Label "remote" means: `--private.api.addr` flag is required. + The following table shows the current implementation status of Erigon's RPC daemon. | Command | Avail | Notes | @@ -114,15 +160,17 @@ The following table shows the current implementation status of Erigon's RPC daem | web3_clientVersion | Yes | | | web3_sha3 | Yes | | | | | | -| net_listening | HC | (remote only hard coded returns true) | +| net_listening | HC | (`remote` hard coded returns true) | | net_peerCount | Limited | internal sentries only | -| net_version | Yes | remote only | +| net_version | Yes | `remote`. | | | | | | eth_blockNumber | Yes | | -| eth_chainID | Yes | | +| eth_chainID/eth_chainId | Yes | | | eth_protocolVersion | Yes | | | eth_syncing | Yes | | | eth_gasPrice | Yes | | +| eth_maxPriorityFeePerGas | Yes | | +| eth_feeHistory | Yes | | | | | | | eth_getBlockByHash | Yes | | | eth_getBlockByNumber | Yes | | @@ -149,6 +197,7 @@ The following table shows the current implementation status of Erigon's RPC daem | eth_getStorageAt | Yes | | | eth_call | Yes | | | eth_callBundle | Yes | | +| eth_createAccessList | Yes | | | | | | eth_newFilter | - | not yet implemented | | eth_newBlockFilter | - | not yet implemented | @@ -158,7 +207,7 @@ The following table shows the current implementation status of Erigon's RPC daem | eth_getLogs | Yes | | | | | | | eth_accounts | No | deprecated | -| eth_sendRawTransaction | Yes | remote only | +| eth_sendRawTransaction | Yes | `remote`. | | eth_sendTransaction | - | not yet implemented | | eth_sign | No | deprecated | | eth_signTransaction | - | not yet implemented | @@ -174,14 +223,21 @@ The following table shows the current implementation status of Erigon's RPC daem | eth_submitWork | Yes | | | | | | | eth_subscribe | Limited | Websock Only - newHeads, | -| | | newPendingTransaction | +| | | newPendingTransactions | | eth_unsubscribe | Yes | Websock Only | | | | | +| engine_newPayloadV1 | Yes | | +| engine_forkchoiceUpdatedV1 | Yes | | +| engine_getPayloadV1 | Yes | | +| engine_exchangeTransitionConfigurationV1 | Yes | | +| | | | | debug_accountRange | Yes | Private Erigon debug module | | debug_accountAt | Yes | Private Erigon debug module | | debug_getModifiedAccountsByNumber | Yes | | | debug_getModifiedAccountsByHash | Yes | | | debug_storageRangeAt | Yes | | +| debug_traceBlockByHash | Yes | Streaming (can handle huge results) | +| debug_traceBlockByNumber | Yes | Streaming (can handle huge results) | | debug_traceTransaction | Yes | Streaming (can handle huge results) | | debug_traceCall | Yes | Streaming (can handle huge results) | | | | | @@ -195,7 +251,8 @@ The following table shows the current implementation status of Erigon's RPC daem | trace_get | Yes | | | trace_transaction | Yes | | | | | | -| txpool_content | Yes | remote only | +| txpool_content | Yes | `remote` | +| txpool_status | Yes | `remote` | | | | | | eth_getCompilers | No | deprecated | | eth_compileLLL | No | deprecated | @@ -207,22 +264,23 @@ The following table shows the current implementation status of Erigon's RPC daem | db_putHex | No | deprecated | | db_getHex | No | deprecated | | | | | -| shh_post | No | deprecated | -| shh_version | No | deprecated | -| shh_newIdentity | No | deprecated | -| shh_hasIdentity | No | deprecated | -| shh_newGroup | No | deprecated | -| shh_addToGroup | No | deprecated | -| shh_newFilter | No | deprecated | -| shh_uninstallFilter | No | deprecated | -| shh_getFilterChanges | No | deprecated | -| shh_getMessages | No | deprecated | -| | | | | erigon_getHeaderByHash | Yes | Erigon only | | erigon_getHeaderByNumber | Yes | Erigon only | | erigon_getLogsByHash | Yes | Erigon only | | erigon_forks | Yes | Erigon only | | erigon_issuance | Yes | Erigon only | +| erigon_GetBlockByTimestamp | Yes | Erigon only | +| | | | +| starknet_call | Yes | Starknet only | +| | | | +| bor_getSnapshot | Yes | Bor only | +| bor_getAuthor | Yes | Bor only | +| bor_getSnapshotAtHash | Yes | Bor only | +| bor_getSigners | Yes | Bor only | +| bor_getSignersAtHash | Yes | Bor only | +| bor_getCurrentProposer | Yes | Bor only | +| bor_getCurrentValidators | Yes | Bor only | +| bor_getRootHash | Yes | Bor only | This table is constantly updated. Please visit again. @@ -349,15 +407,9 @@ Then update your `app.json` for ethstats-client like that: "RPC_PORT": "8545", "LISTENING_PORT": "30303", "INSTANCE_NAME": "Erigon node", - "CONTACT_DETAILS": , + "CONTACT_DETAILS": , "WS_SERVER": "wss://ethstats.net/api", - "WS_SECRET": , + "WS_SECRET": , "VERBOSITY": 2 } } @@ -414,12 +466,12 @@ Reduce `--private.api.ratelimit` ### Read DB directly without Json-RPC/Graphql -[./docs/programmers_guide/db_faq.md](./docs/programmers_guide/db_faq.md) +[./../../docs/programmers_guide/db_faq.md](./../../docs/programmers_guide/db_faq.md) -### Batch requests +### Faster Batch requests Currently batch requests are spawn multiple goroutines and process all sub-requests in parallel. To limit impact of 1 -huge batch to other users - added flag `--rpc.batch.concurrency` (default: 50). Increase it to process large batches +huge batch to other users - added flag `--rpc.batch.concurrency` (default: 2). Increase it to process large batches faster. Known Issue: if at least 1 request is "stremable" (has parameter of type *jsoniter.Stream) - then whole batch will diff --git a/cmd/rpcdaemon/cli/config.go b/cmd/rpcdaemon/cli/config.go index 417f84ae337..098670bef72 100644 --- a/cmd/rpcdaemon/cli/config.go +++ b/cmd/rpcdaemon/cli/config.go @@ -2,87 +2,97 @@ package cli import ( "context" + "crypto/rand" "encoding/binary" + "errors" "fmt" + "net" "net/http" - "path" + "os" + "path/filepath" + "runtime" + "strings" "time" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/rpc/rpccfg" + + "github.com/ledgerwatch/erigon-lib/direct" "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" + "github.com/ledgerwatch/erigon-lib/kv/remotedb" + "github.com/ledgerwatch/erigon-lib/kv/remotedbserver" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/health" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/common/paths" - "github.com/ledgerwatch/erigon/ethdb/remotedb" - "github.com/ledgerwatch/erigon/ethdb/remotedbserver" - "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/node" + "github.com/ledgerwatch/erigon/node/nodecfg" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" + "google.golang.org/grpc" + grpcHealth "google.golang.org/grpc/health" + "google.golang.org/grpc/health/grpc_health_v1" ) -type Flags struct { - PrivateApiAddr string - SingleNodeMode bool // Erigon's database can be read by separated processes on same machine - in read-only mode - with full support of transactions. It will share same "OS PageCache" with Erigon process. - Datadir string - Chaindata string - SnapshotDir string - SnapshotMode string - HttpListenAddress string - TLSCertfile string - TLSCACert string - TLSKeyFile string - HttpPort int - HttpCORSDomain []string - HttpVirtualHost []string - HttpCompression bool - API []string - Gascap uint64 - MaxTraces uint64 - WebsocketEnabled bool - WebsocketCompression bool - RpcAllowListFilePath string - RpcBatchConcurrency uint - TraceCompatibility bool // Bug for bug compatibility for trace_ routines with OpenEthereum -} - var rootCmd = &cobra.Command{ Use: "rpcdaemon", Short: "rpcdaemon is JSON RPC server that connects to Erigon node for remote DB access", } -func RootCommand() (*cobra.Command, *Flags) { +const JwtDefaultFile = "jwt.hex" + +func RootCommand() (*cobra.Command, *httpcfg.HttpCfg) { utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) - cfg := &Flags{} - rootCmd.PersistentFlags().StringVar(&cfg.PrivateApiAddr, "private.api.addr", "127.0.0.1:9090", "private api network address, for example: 127.0.0.1:9090, empty string means not to start the listener. do not expose to public network. serves remote database interface") - rootCmd.PersistentFlags().StringVar(&cfg.Datadir, "datadir", "", "path to Erigon working directory") + cfg := &httpcfg.HttpCfg{StateCache: kvcache.DefaultCoherentConfig} + rootCmd.PersistentFlags().StringVar(&cfg.PrivateApiAddr, "private.api.addr", "127.0.0.1:9090", "private api network address, for example: 127.0.0.1:9090") + rootCmd.PersistentFlags().StringVar(&cfg.DataDir, "datadir", "", "path to Erigon working directory") rootCmd.PersistentFlags().StringVar(&cfg.Chaindata, "chaindata", "", "path to the database") - rootCmd.PersistentFlags().StringVar(&cfg.SnapshotDir, "snapshot.dir", "", "path to snapshot dir(only for chaindata mode)") - rootCmd.PersistentFlags().StringVar(&cfg.SnapshotMode, "snapshot.mode", "", `Configures the storage mode of the app(only for chaindata mode): -* h - use headers snapshot -* b - use bodies snapshot -* s - use state snapshot -* r - use receipts snapshot -`) - rootCmd.PersistentFlags().StringVar(&cfg.HttpListenAddress, "http.addr", node.DefaultHTTPHost, "HTTP-RPC server listening interface") + rootCmd.PersistentFlags().StringVar(&cfg.HttpListenAddress, "http.addr", nodecfg.DefaultHTTPHost, "HTTP-RPC server listening interface") + rootCmd.PersistentFlags().StringVar(&cfg.EngineHTTPListenAddress, "engine.addr", nodecfg.DefaultHTTPHost, "HTTP-RPC server listening interface for engineAPI") rootCmd.PersistentFlags().StringVar(&cfg.TLSCertfile, "tls.cert", "", "certificate for client side TLS handshake") rootCmd.PersistentFlags().StringVar(&cfg.TLSKeyFile, "tls.key", "", "key file for client side TLS handshake") rootCmd.PersistentFlags().StringVar(&cfg.TLSCACert, "tls.cacert", "", "CA certificate for client side TLS handshake") - rootCmd.PersistentFlags().IntVar(&cfg.HttpPort, "http.port", node.DefaultHTTPPort, "HTTP-RPC server listening port") + rootCmd.PersistentFlags().IntVar(&cfg.HttpPort, "http.port", nodecfg.DefaultHTTPPort, "HTTP-RPC server listening port") + rootCmd.PersistentFlags().IntVar(&cfg.EnginePort, "engine.port", nodecfg.DefaultEngineHTTPPort, "HTTP-RPC server listening port for the engineAPI") rootCmd.PersistentFlags().StringSliceVar(&cfg.HttpCORSDomain, "http.corsdomain", []string{}, "Comma separated list of domains from which to accept cross origin requests (browser enforced)") - rootCmd.PersistentFlags().StringSliceVar(&cfg.HttpVirtualHost, "http.vhosts", node.DefaultConfig.HTTPVirtualHosts, "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.") + rootCmd.PersistentFlags().StringSliceVar(&cfg.HttpVirtualHost, "http.vhosts", nodecfg.DefaultConfig.HTTPVirtualHosts, "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.") rootCmd.PersistentFlags().BoolVar(&cfg.HttpCompression, "http.compression", true, "Disable http compression") - rootCmd.PersistentFlags().StringSliceVar(&cfg.API, "http.api", []string{"eth", "erigon"}, "API's offered over the HTTP-RPC interface: eth,erigon,web3,net,debug,trace,txpool,shh,db. Supported methods: https://github.com/ledgerwatch/erigon/tree/devel/cmd/rpcdaemon") - rootCmd.PersistentFlags().Uint64Var(&cfg.Gascap, "rpc.gascap", 25000000, "Sets a cap on gas that can be used in eth_call/estimateGas") + rootCmd.PersistentFlags().StringSliceVar(&cfg.API, "http.api", []string{"eth", "erigon", "engine"}, "API's offered over the HTTP-RPC interface: eth,engine,erigon,web3,net,debug,trace,txpool,db,starknet. Supported methods: https://github.com/ledgerwatch/erigon/tree/devel/cmd/rpcdaemon") + rootCmd.PersistentFlags().Uint64Var(&cfg.Gascap, "rpc.gascap", 50000000, "Sets a cap on gas that can be used in eth_call/estimateGas") rootCmd.PersistentFlags().Uint64Var(&cfg.MaxTraces, "trace.maxtraces", 200, "Sets a limit on traces that can be returned in trace_filter") rootCmd.PersistentFlags().BoolVar(&cfg.WebsocketEnabled, "ws", false, "Enable Websockets") rootCmd.PersistentFlags().BoolVar(&cfg.WebsocketCompression, "ws.compression", false, "Enable Websocket compression (RFC 7692)") rootCmd.PersistentFlags().StringVar(&cfg.RpcAllowListFilePath, "rpc.accessList", "", "Specify granular (method-by-method) API allowlist") - rootCmd.PersistentFlags().UintVar(&cfg.RpcBatchConcurrency, "rpc.batch.concurrency", 50, "Does limit amount of goroutines to process 1 batch request. Means 1 bach request can't overload server. 1 batch still can have unlimited amount of request") + rootCmd.PersistentFlags().UintVar(&cfg.RpcBatchConcurrency, "rpc.batch.concurrency", 2, "Does limit amount of goroutines to process 1 batch request. Means 1 bach request can't overload server. 1 batch still can have unlimited amount of request") + rootCmd.PersistentFlags().IntVar(&cfg.DBReadConcurrency, "db.read.concurrency", runtime.GOMAXPROCS(-1), "Does limit amount of parallel db reads") rootCmd.PersistentFlags().BoolVar(&cfg.TraceCompatibility, "trace.compat", false, "Bug for bug compatibility with OE for trace_ routines") + rootCmd.PersistentFlags().StringVar(&cfg.TxPoolApiAddr, "txpool.api.addr", "", "txpool api network address, for example: 127.0.0.1:9090 (default: use value of --private.api.addr)") + rootCmd.PersistentFlags().BoolVar(&cfg.TevmEnabled, utils.TevmFlag.Name, false, utils.TevmFlag.Usage) + rootCmd.PersistentFlags().BoolVar(&cfg.Sync.UseSnapshots, "snapshot", true, utils.SnapshotFlag.Usage) + rootCmd.PersistentFlags().IntVar(&cfg.StateCache.KeysLimit, "state.cache", kvcache.DefaultCoherentConfig.KeysLimit, "Amount of keys to store in StateCache (enabled if no --datadir set). Set 0 to disable StateCache. 1_000_000 keys ~ equal to 2Gb RAM (maybe we will add RAM accounting in future versions).") + rootCmd.PersistentFlags().BoolVar(&cfg.GRPCServerEnabled, "grpc", false, "Enable GRPC server") + rootCmd.PersistentFlags().StringVar(&cfg.GRPCListenAddress, "grpc.addr", nodecfg.DefaultGRPCHost, "GRPC server listening interface") + rootCmd.PersistentFlags().IntVar(&cfg.GRPCPort, "grpc.port", nodecfg.DefaultGRPCPort, "GRPC server listening port") + rootCmd.PersistentFlags().BoolVar(&cfg.GRPCHealthCheckEnabled, "grpc.healthcheck", false, "Enable GRPC health check") + rootCmd.PersistentFlags().StringVar(&cfg.StarknetGRPCAddress, "starknet.grpc.address", "127.0.0.1:6066", "Starknet GRPC address") + rootCmd.PersistentFlags().StringVar(&cfg.JWTSecretPath, utils.JWTSecretPath.Name, utils.JWTSecretPath.Value, "Token to ensure safe connection between CL and EL") if err := rootCmd.MarkPersistentFlagFilename("rpc.accessList", "json"); err != nil { panic(err) @@ -93,25 +103,22 @@ func RootCommand() (*cobra.Command, *Flags) { if err := rootCmd.MarkPersistentFlagDirname("chaindata"); err != nil { panic(err) } - if err := rootCmd.MarkPersistentFlagDirname("snapshot.dir"); err != nil { - panic(err) - } rootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { if err := utils.SetupCobra(cmd); err != nil { return err } - cfg.SingleNodeMode = cfg.Datadir != "" || cfg.Chaindata != "" - if cfg.SingleNodeMode { - if cfg.Datadir == "" { - cfg.Datadir = paths.DefaultDataDir() + cfg.WithDatadir = cfg.DataDir != "" || cfg.Chaindata != "" + if cfg.WithDatadir { + if cfg.DataDir == "" { + cfg.DataDir = paths.DefaultDataDir() } if cfg.Chaindata == "" { - cfg.Chaindata = path.Join(cfg.Datadir, "erigon", "chaindata") + cfg.Chaindata = filepath.Join(cfg.DataDir, "chaindata") } - //if cfg.SnapshotDir == "" { - // cfg.SnapshotDir = path.Join(cfg.Datadir, "erigon", "snapshot") - //} + } + if cfg.TxPoolApiAddr == "" { + cfg.TxPoolApiAddr = cfg.PrivateApiAddr } return nil } @@ -120,15 +127,59 @@ func RootCommand() (*cobra.Command, *Flags) { return nil } + cfg.StateCache.MetricsLabel = "rpc" + return rootCmd, cfg } -func checkDbCompatibility(db kv.RoDB) error { +type StateChangesClient interface { + StateChanges(ctx context.Context, in *remote.StateChangeRequest, opts ...grpc.CallOption) (remote.KV_StateChangesClient, error) +} + +func subscribeToStateChangesLoop(ctx context.Context, client StateChangesClient, cache kvcache.Cache) { + go func() { + for { + select { + case <-ctx.Done(): + return + default: + } + if err := subscribeToStateChanges(ctx, client, cache); err != nil { + if grpcutil.IsRetryLater(err) || grpcutil.IsEndOfStream(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("[txpool.handleStateChanges]", "err", err) + } + } + }() +} + +func subscribeToStateChanges(ctx context.Context, client StateChangesClient, cache kvcache.Cache) error { + streamCtx, cancel := context.WithCancel(ctx) + defer cancel() + stream, err := client.StateChanges(streamCtx, &remote.StateChangeRequest{WithStorage: true, WithTransactions: false}, grpc.WaitForReady(true)) + if err != nil { + return err + } + for req, err := stream.Recv(); ; req, err = stream.Recv() { + if err != nil { + return err + } + if req == nil { + return nil + } + + cache.OnNewBlock(req) + } +} + +func checkDbCompatibility(ctx context.Context, db kv.RoDB) error { // DB schema version compatibility check var version []byte var compatErr error var compatTx kv.Tx - if compatTx, compatErr = db.BeginRo(context.Background()); compatErr != nil { + if compatTx, compatErr = db.BeginRo(ctx); compatErr != nil { return fmt.Errorf("open Ro Tx for DB schema compability check: %w", compatErr) } defer compatTx.Rollback() @@ -160,56 +211,228 @@ func checkDbCompatibility(db kv.RoDB) error { return nil } -func RemoteServices(cfg Flags, logger log.Logger, rootCancel context.CancelFunc) (db kv.RoDB, eth services.ApiBackend, txPool *services.TxPoolService, mining *services.MiningService, err error) { - if !cfg.SingleNodeMode && cfg.PrivateApiAddr == "" { - return nil, nil, nil, nil, fmt.Errorf("either remote db or local db must be specified") +func EmbeddedServices(ctx context.Context, erigonDB kv.RoDB, stateCacheCfg kvcache.CoherentConfig, blockReader services.FullBlockReader, ethBackendServer remote.ETHBACKENDServer, + txPoolServer txpool.TxpoolServer, miningServer txpool.MiningServer, +) ( + eth rpcinterfaces.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, starknet *rpcservices.StarknetService, stateCache kvcache.Cache, ff *rpcservices.Filters, err error, +) { + if stateCacheCfg.KeysLimit > 0 { + stateCache = kvcache.New(stateCacheCfg) + } else { + stateCache = kvcache.NewDummy() } + kvRPC := remotedbserver.NewKvServer(ctx, erigonDB) + stateDiffClient := direct.NewStateDiffClientDirect(kvRPC) + _ = stateDiffClient + subscribeToStateChangesLoop(ctx, stateDiffClient, stateCache) + + directClient := direct.NewEthBackendClientDirect(ethBackendServer) + + eth = rpcservices.NewRemoteBackend(directClient, erigonDB, blockReader) + txPool = direct.NewTxPoolClient(txPoolServer) + mining = direct.NewMiningClient(miningServer) + ff = rpcservices.New(ctx, eth, txPool, mining, func() {}) + return +} + +// RemoteServices - use when RPCDaemon run as independent process. Still it can use --datadir flag to enable +// `cfg.WithDatadir` (mode when it on 1 machine with Erigon) +func RemoteServices(ctx context.Context, cfg httpcfg.HttpCfg, logger log.Logger, rootCancel context.CancelFunc) ( + db kv.RoDB, borDb kv.RoDB, + eth rpcinterfaces.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, + starknet *rpcservices.StarknetService, + stateCache kvcache.Cache, blockReader services.FullBlockReader, + ff *rpcservices.Filters, err error) { + if !cfg.WithDatadir && cfg.PrivateApiAddr == "" { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("either remote db or local db must be specified") + } + // Do not change the order of these checks. Chaindata needs to be checked first, because PrivateApiAddr has default value which is not "" // If PrivateApiAddr is checked first, the Chaindata option will never work - if cfg.SingleNodeMode { + if cfg.WithDatadir { var rwKv kv.RwDB - rwKv, err = kv2.NewMDBX(logger).Path(cfg.Chaindata).Readonly().Open() + log.Trace("Creating chain db", "path", cfg.Chaindata) + limiter := make(chan struct{}, cfg.DBReadConcurrency) + rwKv, err = kv2.NewMDBX(logger).RoTxsLimiter(limiter).Path(cfg.Chaindata).Readonly().Open() if err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, nil, nil, nil, nil, nil, ff, err } - if compatErr := checkDbCompatibility(rwKv); compatErr != nil { - return nil, nil, nil, nil, compatErr + if compatErr := checkDbCompatibility(ctx, rwKv); compatErr != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, compatErr } db = rwKv + stateCache = kvcache.NewDummy() + blockReader = snapshotsync.NewBlockReader() + + // bor (consensus) specific db + var borKv kv.RoDB + borDbPath := filepath.Join(cfg.DataDir, "bor") + { + // ensure db exist + tmpDb, err := kv2.NewMDBX(logger).Path(borDbPath).Label(kv.ConsensusDB).Open() + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, err + } + tmpDb.Close() + } + log.Trace("Creating consensus db", "path", borDbPath) + borKv, err = kv2.NewMDBX(logger).Path(borDbPath).Label(kv.ConsensusDB).Readonly().Open() + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, err + } + // Skip the compatibility check, until we have a schema in erigon-lib + borDb = borKv } else { + if cfg.StateCache.KeysLimit > 0 { + stateCache = kvcache.New(cfg.StateCache) + } else { + stateCache = kvcache.NewDummy() + } log.Info("if you run RPCDaemon on same machine with Erigon add --datadir option") } - if cfg.PrivateApiAddr != "" { - remoteKv, err := remotedb.NewRemote(gointerfaces.VersionFromProto(remotedbserver.KvServiceAPIVersion), logger).Path(cfg.PrivateApiAddr).Open(cfg.TLSCertfile, cfg.TLSKeyFile, cfg.TLSCACert) - if err != nil { - return nil, nil, nil, nil, fmt.Errorf("could not connect to remoteKv: %w", err) - } - remoteEth := services.NewRemoteBackend(remoteKv.GrpcConn()) - mining = services.NewMiningService(remoteKv.GrpcConn()) - txPool = services.NewTxPoolService(remoteKv.GrpcConn()) - if db == nil { - db = remoteKv - } - eth = remoteEth - go func() { - if !remoteKv.EnsureVersionCompatibility() { - rootCancel() + + if db != nil { + var cc *params.ChainConfig + if err := db.View(context.Background(), func(tx kv.Tx) error { + genesisBlock, err := rawdb.ReadBlockByNumber(tx, 0) + if err != nil { + return err + } + if genesisBlock == nil { + return fmt.Errorf("genesis not found in DB. Likely Erigon was never started on this datadir") + } + cc, err = rawdb.ReadChainConfig(tx, genesisBlock.Hash()) + if err != nil { + return err + } + cfg.Snap.Enabled, err = snap.Enabled(tx) + if err != nil { + return err + } + return nil + }); err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, err + } + if cc == nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("chain config not found in db. Need start erigon at least once on this db") + } + cfg.Snap.Enabled = cfg.Snap.Enabled || cfg.Sync.UseSnapshots + + // if chain config has terminal total difficulty then rpc must have eth and engine APIs enableds + if cc.TerminalTotalDifficulty != nil { + hasEthApiEnabled := false + hasEngineApiEnabled := false + + for _, api := range cfg.API { + switch api { + case "eth": + hasEthApiEnabled = true + case "engine": + hasEngineApiEnabled = true + } + } + + if !hasEthApiEnabled { + cfg.API = append(cfg.API, "eth") } - if !remoteEth.EnsureVersionCompatibility() { - rootCancel() + + if !hasEngineApiEnabled { + cfg.API = append(cfg.API, "engine") } - if !mining.EnsureVersionCompatibility() { - rootCancel() + } + } + + onNewSnapshot := func() {} + if cfg.WithDatadir { + if cfg.Snap.Enabled { + allSnapshots := snapshotsync.NewRoSnapshots(cfg.Snap, filepath.Join(cfg.DataDir, "snapshots")) + if err := allSnapshots.Reopen(); err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("allSnapshots.Reopen: %w", err) } - if !txPool.EnsureVersionCompatibility() { - rootCancel() + log.Info("[Snapshots] see new", "blocks", allSnapshots.BlocksAvailable()) + // don't reopen it right here, because snapshots may be not ready yet + onNewSnapshot = func() { + allSnapshots.Reopen() + log.Info("[Snapshots] see new", "blocks", allSnapshots.BlocksAvailable()) } - }() + blockReader = snapshotsync.NewBlockReaderWithSnapshots(allSnapshots) + } else { + log.Info("Use --snapshots=false") + } } - return db, eth, txPool, mining, err + + creds, err := grpcutil.TLS(cfg.TLSCACert, cfg.TLSCertfile, cfg.TLSKeyFile) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("open tls cert: %w", err) + } + conn, err := grpcutil.Connect(creds, cfg.PrivateApiAddr) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("could not connect to execution service privateApi: %w", err) + } + + kvClient := remote.NewKVClient(conn) + remoteKv, err := remotedb.NewRemote(gointerfaces.VersionFromProto(remotedbserver.KvServiceAPIVersion), logger, kvClient).Open() + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("could not connect to remoteKv: %w", err) + } + + subscribeToStateChangesLoop(ctx, kvClient, stateCache) + + if !cfg.WithDatadir { + blockReader = snapshotsync.NewRemoteBlockReader(remote.NewETHBACKENDClient(conn)) + } + remoteEth := rpcservices.NewRemoteBackend(remote.NewETHBACKENDClient(conn), db, blockReader) + blockReader = remoteEth + + txpoolConn := conn + if cfg.TxPoolApiAddr != cfg.PrivateApiAddr { + txpoolConn, err = grpcutil.Connect(creds, cfg.TxPoolApiAddr) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("could not connect to txpool api: %w", err) + } + } + + mining = txpool.NewMiningClient(txpoolConn) + miningService := rpcservices.NewMiningService(mining) + txPool = txpool.NewTxpoolClient(txpoolConn) + txPoolService := rpcservices.NewTxPoolService(txPool) + if db == nil { + db = remoteKv + } + eth = remoteEth + go func() { + if !remoteKv.EnsureVersionCompatibility() { + rootCancel() + } + if !remoteEth.EnsureVersionCompatibility() { + rootCancel() + } + if mining != nil && !miningService.EnsureVersionCompatibility() { + rootCancel() + } + if !txPoolService.EnsureVersionCompatibility() { + rootCancel() + } + }() + + if cfg.StarknetGRPCAddress != "" { + starknetConn, err := grpcutil.Connect(creds, cfg.StarknetGRPCAddress) + if err != nil { + return nil, nil, nil, nil, nil, nil, nil, nil, ff, fmt.Errorf("could not connect to starknet api: %w", err) + } + starknet = rpcservices.NewStarknetService(starknetConn) + } + + ff = rpcservices.New(ctx, eth, txPool, mining, onNewSnapshot) + + return db, borDb, eth, txPool, mining, starknet, stateCache, blockReader, ff, err } -func StartRpcServer(ctx context.Context, cfg Flags, rpcAPI []rpc.API) error { +func StartRpcServer(ctx context.Context, cfg httpcfg.HttpCfg, rpcAPI []rpc.API) error { + var engineListener *http.Server + var engineSrv *rpc.Server + var engineHttpEndpoint string + // register apis and create handler stack httpEndpoint := fmt.Sprintf("%s:%d", cfg.HttpListenAddress, cfg.HttpPort) @@ -221,39 +444,208 @@ func StartRpcServer(ctx context.Context, cfg Flags, rpcAPI []rpc.API) error { } srv.SetAllowList(allowListForRPC) - if err := node.RegisterApisFromWhitelist(rpcAPI, cfg.API, srv, false); err != nil { + var defaultAPIList []rpc.API + var engineAPI []rpc.API + + for _, api := range rpcAPI { + if api.Namespace != "engine" { + defaultAPIList = append(defaultAPIList, api) + } else { + engineAPI = append(engineAPI, api) + } + } + + if len(engineAPI) != 0 { + // eth API should also be exposed on the same port as engine API + for _, api := range rpcAPI { + if api.Namespace == "eth" { + engineAPI = append(engineAPI, api) + } + } + } + + var apiFlags []string + for _, flag := range cfg.API { + if flag != "engine" { + apiFlags = append(apiFlags, flag) + } + } + + if err := node.RegisterApisFromWhitelist(defaultAPIList, apiFlags, srv, false); err != nil { return fmt.Errorf("could not start register RPC apis: %w", err) } httpHandler := node.NewHTTPHandlerStack(srv, cfg.HttpCORSDomain, cfg.HttpVirtualHost, cfg.HttpCompression) var wsHandler http.Handler if cfg.WebsocketEnabled { - wsHandler = srv.WebsocketHandler([]string{"*"}, cfg.WebsocketCompression) + wsHandler = srv.WebsocketHandler([]string{"*"}, nil, cfg.WebsocketCompression) } - var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if cfg.WebsocketEnabled && r.Method == "GET" { - wsHandler.ServeHTTP(w, r) - return - } - httpHandler.ServeHTTP(w, r) - }) + apiHandler, err := createHandler(cfg, defaultAPIList, httpHandler, wsHandler, nil) + if err != nil { + return err + } - listener, _, err := node.StartHTTPEndpoint(httpEndpoint, rpc.DefaultHTTPTimeouts, handler) + listener, _, err := node.StartHTTPEndpoint(httpEndpoint, rpccfg.DefaultHTTPTimeouts, apiHandler) if err != nil { return fmt.Errorf("could not start RPC api: %w", err) } + info := []interface{}{"url", httpEndpoint, "ws", cfg.WebsocketEnabled, + "ws.compression", cfg.WebsocketCompression, "grpc", cfg.GRPCServerEnabled} - log.Info("HTTP endpoint opened", "url", httpEndpoint, "ws", cfg.WebsocketEnabled, "ws.compression", cfg.WebsocketCompression) + if len(engineAPI) > 0 { + engineListener, engineSrv, engineHttpEndpoint, err = createEngineListener(cfg, engineAPI) + if err != nil { + return fmt.Errorf("could not start RPC api for engine: %w", err) + } + } + + var ( + healthServer *grpcHealth.Server + grpcServer *grpc.Server + grpcListener net.Listener + grpcEndpoint string + ) + if cfg.GRPCServerEnabled { + grpcEndpoint = fmt.Sprintf("%s:%d", cfg.GRPCListenAddress, cfg.GRPCPort) + if grpcListener, err = net.Listen("tcp", grpcEndpoint); err != nil { + return fmt.Errorf("could not start GRPC listener: %w", err) + } + grpcServer = grpc.NewServer() + if cfg.GRPCHealthCheckEnabled { + healthServer = grpcHealth.NewServer() + grpc_health_v1.RegisterHealthServer(grpcServer, healthServer) + } + go grpcServer.Serve(grpcListener) + info = append(info, "grpc.port", cfg.GRPCPort) + } + + log.Info("HTTP endpoint opened", info...) defer func() { srv.Stop() + if engineSrv != nil { + engineSrv.Stop() + } shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() _ = listener.Shutdown(shutdownCtx) log.Info("HTTP endpoint closed", "url", httpEndpoint) + + if engineListener != nil { + _ = engineListener.Shutdown(shutdownCtx) + log.Info("Engine HTTP endpoint close", "url", engineHttpEndpoint) + } + + if cfg.GRPCServerEnabled { + if cfg.GRPCHealthCheckEnabled { + healthServer.Shutdown() + } + grpcServer.GracefulStop() + _ = grpcListener.Close() + log.Info("GRPC endpoint closed", "url", grpcEndpoint) + } }() <-ctx.Done() log.Info("Exiting...") return nil } + +// isWebsocket checks the header of a http request for a websocket upgrade request. +func isWebsocket(r *http.Request) bool { + return strings.ToLower(r.Header.Get("Upgrade")) == "websocket" && + strings.Contains(strings.ToLower(r.Header.Get("Connection")), "upgrade") +} + +// obtainJWTSecret loads the jwt-secret, either from the provided config, +// or from the default location. If neither of those are present, it generates +// a new secret and stores to the default location. +func obtainJWTSecret(cfg httpcfg.HttpCfg) ([]byte, error) { + // try reading from file + log.Info("Reading JWT secret", "path", cfg.JWTSecretPath) + // If we run the rpcdaemon and datadir is not specified we just use jwt.hex in current directory. + if len(cfg.JWTSecretPath) == 0 { + cfg.JWTSecretPath = "jwt.hex" + } + if data, err := os.ReadFile(cfg.JWTSecretPath); err == nil { + jwtSecret := common.FromHex(strings.TrimSpace(string(data))) + if len(jwtSecret) == 32 { + return jwtSecret, nil + } + log.Error("Invalid JWT secret", "path", cfg.JWTSecretPath, "length", len(jwtSecret)) + return nil, errors.New("invalid JWT secret") + } + // Need to generate one + jwtSecret := make([]byte, 32) + rand.Read(jwtSecret) + + if err := os.WriteFile(cfg.JWTSecretPath, []byte(hexutil.Encode(jwtSecret)), 0600); err != nil { + return nil, err + } + log.Info("Generated JWT secret", "path", cfg.JWTSecretPath) + return jwtSecret, nil +} + +func createHandler(cfg httpcfg.HttpCfg, apiList []rpc.API, httpHandler http.Handler, wsHandler http.Handler, jwtSecret []byte) (http.Handler, error) { + var handler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // adding a healthcheck here + if health.ProcessHealthcheckIfNeeded(w, r, apiList) { + return + } + if cfg.WebsocketEnabled && wsHandler != nil && isWebsocket(r) { + wsHandler.ServeHTTP(w, r) + return + } + + if jwtSecret != nil && !rpc.CheckJwtSecret(w, r, jwtSecret) { + return + } + + httpHandler.ServeHTTP(w, r) + }) + + return handler, nil +} + +func createEngineListener(cfg httpcfg.HttpCfg, engineApi []rpc.API) (*http.Server, *rpc.Server, string, error) { + engineHttpEndpoint := fmt.Sprintf("%s:%d", cfg.EngineHTTPListenAddress, cfg.EnginePort) + + engineSrv := rpc.NewServer(cfg.RpcBatchConcurrency) + + allowListForRPC, err := parseAllowListForRPC(cfg.RpcAllowListFilePath) + if err != nil { + return nil, nil, "", err + } + engineSrv.SetAllowList(allowListForRPC) + + if err := node.RegisterApisFromWhitelist(engineApi, nil, engineSrv, true); err != nil { + return nil, nil, "", fmt.Errorf("could not start register RPC engine api: %w", err) + } + + jwtSecret, err := obtainJWTSecret(cfg) + if err != nil { + return nil, nil, "", err + } + + var wsHandler http.Handler + if cfg.WebsocketEnabled { + wsHandler = engineSrv.WebsocketHandler([]string{"*"}, jwtSecret, cfg.WebsocketCompression) + } + + engineHttpHandler := node.NewHTTPHandlerStack(engineSrv, cfg.HttpCORSDomain, cfg.HttpVirtualHost, cfg.HttpCompression) + + engineApiHandler, err := createHandler(cfg, engineApi, engineHttpHandler, wsHandler, jwtSecret) + if err != nil { + return nil, nil, "", err + } + + engineListener, _, err := node.StartHTTPEndpoint(engineHttpEndpoint, rpccfg.DefaultHTTPTimeouts, engineApiHandler) + if err != nil { + return nil, nil, "", fmt.Errorf("could not start RPC api: %w", err) + } + + engineInfo := []interface{}{"url", engineHttpEndpoint, "ws", cfg.WebsocketEnabled} + log.Info("HTTP endpoint opened for Engine API", engineInfo...) + + return engineListener, engineSrv, engineHttpEndpoint, nil +} diff --git a/cmd/rpcdaemon/cli/httpcfg/http_cfg.go b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go new file mode 100644 index 00000000000..59156349851 --- /dev/null +++ b/cmd/rpcdaemon/cli/httpcfg/http_cfg.go @@ -0,0 +1,44 @@ +package httpcfg + +import ( + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/eth/ethconfig" +) + +type HttpCfg struct { + Enabled bool + PrivateApiAddr string + WithDatadir bool // Erigon's database can be read by separated processes on same machine - in read-only mode - with full support of transactions. It will share same "OS PageCache" with Erigon process. + DataDir string + Chaindata string + HttpListenAddress string + EngineHTTPListenAddress string + TLSCertfile string + TLSCACert string + TLSKeyFile string + HttpPort int + EnginePort int + HttpCORSDomain []string + HttpVirtualHost []string + HttpCompression bool + API []string + Gascap uint64 + MaxTraces uint64 + WebsocketEnabled bool + WebsocketCompression bool + RpcAllowListFilePath string + RpcBatchConcurrency uint + DBReadConcurrency int + TraceCompatibility bool // Bug for bug compatibility for trace_ routines with OpenEthereum + TxPoolApiAddr string + TevmEnabled bool + StateCache kvcache.CoherentConfig + Snap ethconfig.Snapshot + Sync ethconfig.Sync + GRPCServerEnabled bool + GRPCListenAddress string + GRPCPort int + GRPCHealthCheckEnabled bool + StarknetGRPCAddress string + JWTSecretPath string // Engine API Authentication +} diff --git a/cmd/rpcdaemon/cli/rpc_allow_list.go b/cmd/rpcdaemon/cli/rpc_allow_list.go index 119a1ff2ee5..dbf6fbff88a 100644 --- a/cmd/rpcdaemon/cli/rpc_allow_list.go +++ b/cmd/rpcdaemon/cli/rpc_allow_list.go @@ -2,7 +2,7 @@ package cli import ( "encoding/json" - "io/ioutil" + "io" "os" "strings" @@ -27,7 +27,7 @@ func parseAllowListForRPC(path string) (rpc.AllowList, error) { file.Close() //nolint: errcheck }() - fileContents, err := ioutil.ReadAll(file) + fileContents, err := io.ReadAll(file) if err != nil { return nil, err } diff --git a/cmd/rpcdaemon/commands/admin_api.go b/cmd/rpcdaemon/commands/admin_api.go new file mode 100644 index 00000000000..6e6e11b9811 --- /dev/null +++ b/cmd/rpcdaemon/commands/admin_api.go @@ -0,0 +1,49 @@ +package commands + +import ( + "context" + "errors" + "fmt" + + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" + "github.com/ledgerwatch/erigon/p2p" +) + +// AdminAPI the interface for the admin_* RPC commands. +type AdminAPI interface { + // NodeInfo returns a collection of metadata known about the host. + NodeInfo(ctx context.Context) (*p2p.NodeInfo, error) + + // Peers returns information about the connected remote nodes. + // https://geth.ethereum.org/docs/rpc/ns-admin#admin_peers + Peers(ctx context.Context) ([]*p2p.PeerInfo, error) +} + +// AdminAPIImpl data structure to store things needed for admin_* commands. +type AdminAPIImpl struct { + ethBackend rpcinterfaces.ApiBackend +} + +// NewAdminAPI returns AdminAPIImpl instance. +func NewAdminAPI(eth rpcinterfaces.ApiBackend) *AdminAPIImpl { + return &AdminAPIImpl{ + ethBackend: eth, + } +} + +func (api *AdminAPIImpl) NodeInfo(ctx context.Context) (*p2p.NodeInfo, error) { + nodes, err := api.ethBackend.NodeInfo(ctx, 1) + if err != nil { + return nil, fmt.Errorf("node info request error: %w", err) + } + + if len(nodes) == 0 { + return nil, errors.New("empty nodesInfo response") + } + + return &nodes[0], nil +} + +func (api *AdminAPIImpl) Peers(ctx context.Context) ([]*p2p.PeerInfo, error) { + return api.ethBackend.Peers(ctx) +} diff --git a/cmd/rpcdaemon/commands/bor_api.go b/cmd/rpcdaemon/commands/bor_api.go new file mode 100644 index 00000000000..79eb2a48327 --- /dev/null +++ b/cmd/rpcdaemon/commands/bor_api.go @@ -0,0 +1,37 @@ +package commands + +import ( + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/bor" + "github.com/ledgerwatch/erigon/rpc" +) + +// BorAPI Bor specific routines +type BorAPI interface { + // Bor snapshot related (see ./bor_snapshot.go) + GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) + GetAuthor(number *rpc.BlockNumber) (*common.Address, error) + GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) + GetSigners(number *rpc.BlockNumber) ([]common.Address, error) + GetSignersAtHash(hash common.Hash) ([]common.Address, error) + GetCurrentProposer() (common.Address, error) + GetCurrentValidators() ([]*bor.Validator, error) + GetRootHash(start uint64, end uint64) (string, error) +} + +// BorImpl is implementation of the BorAPI interface +type BorImpl struct { + *BaseAPI + db kv.RoDB // the chain db + borDb kv.RoDB // the consensus db +} + +// NewBorAPI returns BorImpl instance +func NewBorAPI(base *BaseAPI, db kv.RoDB, borDb kv.RoDB) *BorImpl { + return &BorImpl{ + BaseAPI: base, + db: db, + borDb: borDb, + } +} diff --git a/cmd/rpcdaemon/commands/bor_helper.go b/cmd/rpcdaemon/commands/bor_helper.go new file mode 100644 index 00000000000..49d074307da --- /dev/null +++ b/cmd/rpcdaemon/commands/bor_helper.go @@ -0,0 +1,156 @@ +package commands + +import ( + "bytes" + "errors" + "fmt" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/bor" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rpc" +) + +const ( + checkpointInterval = 1024 // Number of blocks after which vote snapshots are saved to db +) + +var ( + extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity + extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal +) + +var ( + // errUnknownBlock is returned when the list of signers is requested for a block + // that is not part of the local blockchain. + errUnknownBlock = errors.New("unknown block") + + // errMissingSignature is returned if a block's extra-data section doesn't seem + // to contain a 65 byte secp256k1 signature. + errMissingSignature = errors.New("extra-data 65 byte signature suffix missing") + + // errOutOfRangeChain is returned if an authorization list is attempted to + // be modified via out-of-range or non-contiguous headers. + errOutOfRangeChain = errors.New("out of range or non-contiguous chain") + + // errMissingVanity is returned if a block's extra-data section is shorter than + // 32 bytes, which is required to store the signer vanity. + errMissingVanity = errors.New("extra-data 32 byte vanity prefix missing") +) + +// getHeaderByNumber returns a block's header given a block number ignoring the block's transaction and uncle list (may be faster). +// derived from erigon_getHeaderByNumber implementation (see ./erigon_block.go) +func getHeaderByNumber(number rpc.BlockNumber, api *BorImpl, tx kv.Tx) (*types.Header, error) { + // Pending block is only known by the miner + if number == rpc.PendingBlockNumber { + block := api.pendingBlock() + if block == nil { + return nil, nil + } + return block.Header(), nil + } + + blockNum, err := getBlockNumber(number, tx) + if err != nil { + return nil, err + } + + header := rawdb.ReadHeaderByNumber(tx, blockNum) + if header == nil { + return nil, fmt.Errorf("block header not found: %d", blockNum) + } + + return header, nil +} + +// getHeaderByHash returns a block's header given a block's hash. +// derived from erigon_getHeaderByHash implementation (see ./erigon_block.go) +func getHeaderByHash(tx kv.Tx, hash common.Hash) (*types.Header, error) { + header, err := rawdb.ReadHeaderByHash(tx, hash) + if err != nil { + return nil, err + } + if header == nil { + return nil, fmt.Errorf("block header not found: %s", hash.String()) + } + + return header, nil +} + +// ecrecover extracts the Ethereum account address from a signed header. +func ecrecover(header *types.Header, c *params.BorConfig) (common.Address, error) { + // Retrieve the signature from the header extra-data + if len(header.Extra) < extraSeal { + return common.Address{}, errMissingSignature + } + signature := header.Extra[len(header.Extra)-extraSeal:] + + // Recover the public key and the Ethereum address + pubkey, err := crypto.Ecrecover(bor.SealHash(header, c).Bytes(), signature) + if err != nil { + return common.Address{}, err + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + + return signer, nil +} + +// validateHeaderExtraField validates that the extra-data contains both the vanity and signature. +// header.Extra = header.Vanity + header.ProducerBytes (optional) + header.Seal +func validateHeaderExtraField(extraBytes []byte) error { + if len(extraBytes) < extraVanity { + return errMissingVanity + } + if len(extraBytes) < extraVanity+extraSeal { + return errMissingSignature + } + return nil +} + +// validatorContains checks for a validator in given validator set +func validatorContains(a []*bor.Validator, x *bor.Validator) (*bor.Validator, bool) { + for _, n := range a { + if bytes.Equal(n.Address.Bytes(), x.Address.Bytes()) { + return n, true + } + } + return nil, false +} + +// getUpdatedValidatorSet applies changes to a validator set and returns a new validator set +func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*bor.Validator) *ValidatorSet { + v := oldValidatorSet + oldVals := v.Validators + + var changes []*bor.Validator + for _, ov := range oldVals { + if f, ok := validatorContains(newVals, ov); ok { + ov.VotingPower = f.VotingPower + } else { + ov.VotingPower = 0 + } + + changes = append(changes, ov) + } + + for _, nv := range newVals { + if _, ok := validatorContains(changes, nv); !ok { + changes = append(changes, nv) + } + } + + v.UpdateWithChangeSet(changes) + return v +} + +// author returns the Ethereum address recovered +// from the signature in the header's extra-data section. +func author(api *BorImpl, tx kv.Tx, header *types.Header) (common.Address, error) { + config, _ := api.BaseAPI.chainConfig(tx) + return ecrecover(header, config.Bor) +} diff --git a/cmd/rpcdaemon/commands/bor_snapshot.go b/cmd/rpcdaemon/commands/bor_snapshot.go new file mode 100644 index 00000000000..96d18cc86bf --- /dev/null +++ b/cmd/rpcdaemon/commands/bor_snapshot.go @@ -0,0 +1,424 @@ +package commands + +import ( + "context" + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/bor" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/log/v3" + "github.com/xsleonard/go-merkle" + "golang.org/x/crypto/sha3" +) + +type Snapshot struct { + config *params.BorConfig // Consensus engine parameters to fine tune behavior + + Number uint64 `json:"number"` // Block number where the snapshot was created + Hash common.Hash `json:"hash"` // Block hash where the snapshot was created + ValidatorSet *ValidatorSet `json:"validatorSet"` // Validator set at this moment + Recents map[uint64]common.Address `json:"recents"` // Set of recent signers for spam protections +} + +// GetSnapshot retrieves the state snapshot at a given block. +func (api *BorImpl) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { + // init chain db + ctx := context.Background() + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = rawdb.ReadCurrentHeader(tx) + } else { + header, _ = getHeaderByNumber(*number, api, tx) + } + // Ensure we have an actually valid block + if header == nil { + return nil, errUnknownBlock + } + + // init consensus db + borTx, err := api.borDb.BeginRo(ctx) + if err != nil { + return nil, err + } + defer borTx.Rollback() + return snapshot(api, tx, borTx, header) +} + +// GetAuthor retrieves the author a block. +func (api *BorImpl) GetAuthor(number *rpc.BlockNumber) (*common.Address, error) { + ctx := context.Background() + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = rawdb.ReadCurrentHeader(tx) + } else { + header, _ = getHeaderByNumber(*number, api, tx) + } + // Ensure we have an actually valid block + if header == nil { + return nil, errUnknownBlock + } + author, err := author(api, tx, header) + return &author, err +} + +// GetSnapshotAtHash retrieves the state snapshot at a given block. +func (api *BorImpl) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) { + // init chain db + ctx := context.Background() + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + // Retreive the header + header, _ := getHeaderByHash(tx, hash) + + // Ensure we have an actually valid block + if header == nil { + return nil, errUnknownBlock + } + + // init consensus db + borTx, err := api.borDb.BeginRo(ctx) + if err != nil { + return nil, err + } + defer borTx.Rollback() + return snapshot(api, tx, borTx, header) +} + +// GetSigners retrieves the list of authorized signers at the specified block. +func (api *BorImpl) GetSigners(number *rpc.BlockNumber) ([]common.Address, error) { + // init chain db + ctx := context.Background() + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = rawdb.ReadCurrentHeader(tx) + } else { + header, _ = getHeaderByNumber(*number, api, tx) + } + // Ensure we have an actually valid block + if header == nil { + return nil, errUnknownBlock + } + + // init consensus db + borTx, err := api.borDb.BeginRo(ctx) + if err != nil { + return nil, err + } + defer borTx.Rollback() + snap, err := snapshot(api, tx, borTx, header) + return snap.signers(), err +} + +// GetSignersAtHash retrieves the list of authorized signers at the specified block. +func (api *BorImpl) GetSignersAtHash(hash common.Hash) ([]common.Address, error) { + // init chain db + ctx := context.Background() + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + // Retreive the header + header, _ := getHeaderByHash(tx, hash) + + // Ensure we have an actually valid block + if header == nil { + return nil, errUnknownBlock + } + + // init consensus db + borTx, err := api.borDb.BeginRo(ctx) + if err != nil { + return nil, err + } + defer borTx.Rollback() + + snap, err := snapshot(api, tx, borTx, header) + return snap.signers(), err +} + +// GetCurrentProposer gets the current proposer +func (api *BorImpl) GetCurrentProposer() (common.Address, error) { + snap, err := api.GetSnapshot(nil) + if err != nil { + return common.Address{}, err + } + return snap.ValidatorSet.GetProposer().Address, nil +} + +// GetCurrentValidators gets the current validators +func (api *BorImpl) GetCurrentValidators() ([]*bor.Validator, error) { + snap, err := api.GetSnapshot(nil) + if err != nil { + return make([]*bor.Validator, 0), err + } + return snap.ValidatorSet.Validators, nil +} + +// GetRootHash returns the merkle root of the start to end block headers +func (api *BorImpl) GetRootHash(start, end uint64) (string, error) { + length := uint64(end - start + 1) + if length > bor.MaxCheckpointLength { + return "", &bor.MaxCheckpointLengthExceededError{Start: start, End: end} + } + ctx := context.Background() + tx, err := api.db.BeginRo(ctx) + if err != nil { + return "", err + } + defer tx.Rollback() + header := rawdb.ReadCurrentHeader(tx) + var currentHeaderNumber uint64 = 0 + if header == nil { + return "", &bor.InvalidStartEndBlockError{Start: start, End: end, CurrentHeader: currentHeaderNumber} + } + currentHeaderNumber = header.Number.Uint64() + if start > end || end > currentHeaderNumber { + return "", &bor.InvalidStartEndBlockError{Start: start, End: end, CurrentHeader: currentHeaderNumber} + } + blockHeaders := make([]*types.Header, end-start+1) + for number := start; number <= end; number++ { + blockHeaders[number-start], _ = getHeaderByNumber(rpc.BlockNumber(number), api, tx) + } + + headers := make([][32]byte, bor.NextPowerOfTwo(length)) + for i := 0; i < len(blockHeaders); i++ { + blockHeader := blockHeaders[i] + header := crypto.Keccak256(bor.AppendBytes32( + blockHeader.Number.Bytes(), + new(big.Int).SetUint64(blockHeader.Time).Bytes(), + blockHeader.TxHash.Bytes(), + blockHeader.ReceiptHash.Bytes(), + )) + + var arr [32]byte + copy(arr[:], header) + headers[i] = arr + } + tree := merkle.NewTreeWithOpts(merkle.TreeOptions{EnableHashSorting: false, DisableHashLeaves: true}) + if err := tree.Generate(bor.Convert(headers), sha3.NewLegacyKeccak256()); err != nil { + return "", err + } + root := hex.EncodeToString(tree.Root().Hash) + return root, nil +} + +// Helper functions for Snapshot Type + +// copy creates a deep copy of the snapshot, though not the individual votes. +func (s *Snapshot) copy() *Snapshot { + cpy := &Snapshot{ + config: s.config, + Number: s.Number, + Hash: s.Hash, + ValidatorSet: s.ValidatorSet.Copy(), + Recents: make(map[uint64]common.Address), + } + for block, signer := range s.Recents { + cpy.Recents[block] = signer + } + + return cpy +} + +// GetSignerSuccessionNumber returns the relative position of signer in terms of the in-turn proposer +func (s *Snapshot) GetSignerSuccessionNumber(signer common.Address) (int, error) { + validators := s.ValidatorSet.Validators + proposer := s.ValidatorSet.GetProposer().Address + proposerIndex, _ := s.ValidatorSet.GetByAddress(proposer) + if proposerIndex == -1 { + return -1, &bor.UnauthorizedProposerError{Number: s.Number, Proposer: proposer.Bytes()} + } + signerIndex, _ := s.ValidatorSet.GetByAddress(signer) + if signerIndex == -1 { + return -1, &bor.UnauthorizedSignerError{Number: s.Number, Signer: signer.Bytes()} + } + + tempIndex := signerIndex + if proposerIndex != tempIndex { + if tempIndex < proposerIndex { + tempIndex = tempIndex + len(validators) + } + } + return tempIndex - proposerIndex, nil +} + +// signers retrieves the list of authorized signers in ascending order. +func (s *Snapshot) signers() []common.Address { + sigs := make([]common.Address, 0, len(s.ValidatorSet.Validators)) + for _, sig := range s.ValidatorSet.Validators { + sigs = append(sigs, sig.Address) + } + return sigs +} + +// apply header changes on snapshot +func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { + // Allow passing in no headers for cleaner code + if len(headers) == 0 { + return s, nil + } + // Sanity check that the headers can be applied + for i := 0; i < len(headers)-1; i++ { + if headers[i+1].Number.Uint64() != headers[i].Number.Uint64()+1 { + return nil, errOutOfRangeChain + } + } + if headers[0].Number.Uint64() != s.Number+1 { + return nil, errOutOfRangeChain + } + // Iterate through the headers and create a new snapshot + snap := s.copy() + + for _, header := range headers { + // Remove any votes on checkpoint blocks + number := header.Number.Uint64() + + // Delete the oldest signer from the recent list to allow it signing again + if number >= s.config.Sprint { + delete(snap.Recents, number-s.config.Sprint) + } + + // Resolve the authorization key and check against signers + signer, err := ecrecover(header, s.config) + if err != nil { + return nil, err + } + + // check if signer is in validator set + if !snap.ValidatorSet.HasAddress(signer.Bytes()) { + return nil, &bor.UnauthorizedSignerError{Number: number, Signer: signer.Bytes()} + } + + if _, err = snap.GetSignerSuccessionNumber(signer); err != nil { + return nil, err + } + + // add recents + snap.Recents[number] = signer + + // change validator set and change proposer + if number > 0 && (number+1)%s.config.Sprint == 0 { + if err := validateHeaderExtraField(header.Extra); err != nil { + return nil, err + } + validatorBytes := header.Extra[extraVanity : len(header.Extra)-extraSeal] + + // get validators from headers and use that for new validator set + newVals, _ := bor.ParseValidators(validatorBytes) + v := getUpdatedValidatorSet(snap.ValidatorSet.Copy(), newVals) + v.IncrementProposerPriority(1) + snap.ValidatorSet = v + } + } + snap.Number += uint64(len(headers)) + snap.Hash = headers[len(headers)-1].Hash() + + return snap, nil +} + +// snapshot retrieves the authorization snapshot at a given point in time. +func snapshot(api *BorImpl, db kv.Tx, borDb kv.Tx, header *types.Header) (*Snapshot, error) { + // Search for a snapshot on disk or build it from checkpoint + var ( + headers []*types.Header + snap *Snapshot + ) + + number := header.Number.Uint64() + hash := header.Hash() + + for snap == nil { + // If an on-disk checkpoint snapshot can be found, use that + if number%checkpointInterval == 0 { + if s, err := loadSnapshot(api, db, borDb, hash); err == nil { + log.Info("Loaded snapshot from disk", "number", number, "hash", hash) + snap = s + } + break + } + + // No snapshot for this header, move backward and check parent snapshots + if header == nil { + header, _ = getHeaderByNumber(rpc.BlockNumber(number), api, db) + if header == nil { + return nil, consensus.ErrUnknownAncestor + } + } + headers = append(headers, header) + number, hash = number-1, header.ParentHash + header = nil + } + + if snap == nil { + return nil, fmt.Errorf("unknown error while retrieving snapshot at block number %v", number) + } + + // Previous snapshot found, apply any pending headers on top of it + for i := 0; i < len(headers)/2; i++ { + headers[i], headers[len(headers)-1-i] = headers[len(headers)-1-i], headers[i] + } + + snap, err := snap.apply(headers) + if err != nil { + return nil, err + } + return snap, nil +} + +// loadSnapshot loads an existing snapshot from the database. +func loadSnapshot(api *BorImpl, db kv.Tx, borDb kv.Tx, hash common.Hash) (*Snapshot, error) { + blob, err := borDb.GetOne(kv.BorSeparate, append([]byte("bor-"), hash[:]...)) + if err != nil { + return nil, err + } + snap := new(Snapshot) + if err := json.Unmarshal(blob, snap); err != nil { + return nil, err + } + config, _ := api.BaseAPI.chainConfig(db) + snap.config = config.Bor + + // update total voting power + if err := snap.ValidatorSet.updateTotalVotingPower(); err != nil { + return nil, err + } + + return snap, nil +} diff --git a/cmd/rpcdaemon/commands/call_traces_test.go b/cmd/rpcdaemon/commands/call_traces_test.go index dcf5c550217..58949d7da98 100644 --- a/cmd/rpcdaemon/commands/call_traces_test.go +++ b/cmd/rpcdaemon/commands/call_traces_test.go @@ -3,16 +3,23 @@ package commands import ( "bytes" "context" + "sync" "testing" + "github.com/holiman/uint256" jsoniter "github.com/json-iterator/go" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/valyala/fastjson" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages" - "github.com/stretchr/testify/assert" - "github.com/valyala/fastjson" ) func blockNumbersFromTraces(t *testing.T, b []byte) []int { @@ -40,19 +47,21 @@ func TestCallTraceOneByOne(t *testing.T) { defer m.DB.Close() chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chain: %v", err) } - api := NewTraceAPI(NewBaseApi(nil), m.DB, &cli.Flags{}) + api := NewTraceAPI( + NewBaseApi(nil, kvcache.New(kvcache.DefaultCoherentConfig), snapshotsync.NewBlockReader(), false), + m.DB, &httpcfg.HttpCfg{}) // Insert blocks 1 by 1, to tirgget possible "off by one" errors for i := 0; i < chain.Length; i++ { if err = m.InsertChain(chain.Slice(i, i+1)); err != nil { t.Fatalf("inserting chain: %v", err) } } - var buf bytes.Buffer - stream := jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 4096) + stream := jsoniter.ConfigDefault.BorrowStream(nil) + defer jsoniter.ConfigDefault.ReturnStream(stream) var fromBlock, toBlock uint64 fromBlock = 1 toBlock = 10 @@ -65,7 +74,7 @@ func TestCallTraceOneByOne(t *testing.T) { if err = api.Filter(context.Background(), traceReq1, stream); err != nil { t.Fatalf("trace_filter failed: %v", err) } - assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, blockNumbersFromTraces(t, buf.Bytes())) + assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, blockNumbersFromTraces(t, stream.Buffer())) } func TestCallTraceUnwind(t *testing.T) { @@ -75,7 +84,7 @@ func TestCallTraceUnwind(t *testing.T) { var err error chainA, err = core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chainA: %v", err) } @@ -85,11 +94,11 @@ func TestCallTraceUnwind(t *testing.T) { } else { gen.SetCoinbase(common.Address{2}) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chainB: %v", err) } - api := NewTraceAPI(NewBaseApi(nil), m.DB, &cli.Flags{}) + api := NewTraceAPI(NewBaseApi(nil, kvcache.New(kvcache.DefaultCoherentConfig), snapshotsync.NewBlockReader(), false), m.DB, &httpcfg.HttpCfg{}) if err = m.InsertChain(chainA); err != nil { t.Fatalf("inserting chainA: %v", err) } @@ -145,11 +154,11 @@ func TestFilterNoAddresses(t *testing.T) { defer m.DB.Close() chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, gen *core.BlockGen) { gen.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chain: %v", err) } - api := NewTraceAPI(NewBaseApi(nil), m.DB, &cli.Flags{}) + api := NewTraceAPI(NewBaseApi(nil, kvcache.New(kvcache.DefaultCoherentConfig), snapshotsync.NewBlockReader(), false), m.DB, &httpcfg.HttpCfg{}) // Insert blocks 1 by 1, to tirgget possible "off by one" errors for i := 0; i < chain.Length; i++ { if err = m.InsertChain(chain.Slice(i, i+1)); err != nil { @@ -170,3 +179,87 @@ func TestFilterNoAddresses(t *testing.T) { } assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, blockNumbersFromTraces(t, buf.Bytes())) } + +func TestFilterAddressIntersection(t *testing.T) { + m := stages.Mock(t) + defer m.DB.Close() + + api := NewTraceAPI(NewBaseApi(nil, kvcache.New(kvcache.DefaultCoherentConfig), snapshotsync.NewBlockReader(), false), m.DB, &httpcfg.HttpCfg{}) + + toAddress1, toAddress2, other := common.Address{1}, common.Address{2}, common.Address{3} + + once := new(sync.Once) + chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 15, func(i int, block *core.BlockGen) { + once.Do(func() { block.SetCoinbase(common.Address{4}) }) + + var rcv common.Address + if i < 5 { + rcv = toAddress1 + } else if i < 10 { + rcv = toAddress2 + } else { + rcv = other + } + + signer := types.LatestSigner(m.ChainConfig) + txn, err := types.SignTx(types.NewTransaction(block.TxNonce(m.Address), rcv, new(uint256.Int), 21000, new(uint256.Int), nil), *signer, m.Key) + if err != nil { + t.Fatal(err) + } + block.AddTx(txn) + }, false /* intermediateHashes */) + require.NoError(t, err, "generate chain") + + err = m.InsertChain(chain) + require.NoError(t, err, "inserting chain") + + fromBlock, toBlock := uint64(1), uint64(15) + t.Run("second", func(t *testing.T) { + stream := jsoniter.ConfigDefault.BorrowStream(nil) + defer jsoniter.ConfigDefault.ReturnStream(stream) + + traceReq1 := TraceFilterRequest{ + FromBlock: (*hexutil.Uint64)(&fromBlock), + ToBlock: (*hexutil.Uint64)(&toBlock), + FromAddress: []*common.Address{&m.Address, &other}, + ToAddress: []*common.Address{&m.Address, &toAddress2}, + Mode: TraceFilterModeIntersection, + } + if err = api.Filter(context.Background(), traceReq1, stream); err != nil { + t.Fatalf("trace_filter failed: %v", err) + } + assert.Equal(t, []int{6, 7, 8, 9, 10}, blockNumbersFromTraces(t, stream.Buffer())) + }) + t.Run("first", func(t *testing.T) { + stream := jsoniter.ConfigDefault.BorrowStream(nil) + defer jsoniter.ConfigDefault.ReturnStream(stream) + + traceReq1 := TraceFilterRequest{ + FromBlock: (*hexutil.Uint64)(&fromBlock), + ToBlock: (*hexutil.Uint64)(&toBlock), + FromAddress: []*common.Address{&m.Address, &other}, + ToAddress: []*common.Address{&toAddress1, &m.Address}, + Mode: TraceFilterModeIntersection, + } + if err = api.Filter(context.Background(), traceReq1, stream); err != nil { + t.Fatalf("trace_filter failed: %v", err) + } + assert.Equal(t, []int{1, 2, 3, 4, 5}, blockNumbersFromTraces(t, stream.Buffer())) + }) + t.Run("empty", func(t *testing.T) { + stream := jsoniter.ConfigDefault.BorrowStream(nil) + defer jsoniter.ConfigDefault.ReturnStream(stream) + + traceReq1 := TraceFilterRequest{ + FromBlock: (*hexutil.Uint64)(&fromBlock), + ToBlock: (*hexutil.Uint64)(&toBlock), + ToAddress: []*common.Address{&other}, + FromAddress: []*common.Address{&toAddress2, &toAddress1, &other}, + Mode: TraceFilterModeIntersection, + } + if err = api.Filter(context.Background(), traceReq1, stream); err != nil { + t.Fatalf("trace_filter failed: %v", err) + } + require.Empty(t, blockNumbersFromTraces(t, stream.Buffer())) + }) +} diff --git a/cmd/rpcdaemon/commands/corner_cases_support_test.go b/cmd/rpcdaemon/commands/corner_cases_support_test.go index 36c678cbcda..1ab11b66caa 100644 --- a/cmd/rpcdaemon/commands/corner_cases_support_test.go +++ b/cmd/rpcdaemon/commands/corner_cases_support_test.go @@ -4,9 +4,11 @@ import ( "context" "testing" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/stretchr/testify/require" ) @@ -16,7 +18,10 @@ func TestNotFoundMustReturnNil(t *testing.T) { require := require.New(t) db := rpcdaemontest.CreateTestKV(t) defer db.Close() - api := NewEthAPI(NewBaseApi(nil), db, nil, nil, nil, 5000000) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI( + NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), + db, nil, nil, nil, 5000000) ctx := context.Background() a, err := api.GetTransactionByBlockNumberAndIndex(ctx, 10_000, 1) diff --git a/cmd/rpcdaemon/commands/daemon.go b/cmd/rpcdaemon/commands/daemon.go index 5e064cee250..004f2d02542 100644 --- a/cmd/rpcdaemon/commands/daemon.go +++ b/cmd/rpcdaemon/commands/daemon.go @@ -1,98 +1,135 @@ package commands import ( - "context" - + "github.com/ledgerwatch/erigon-lib/gointerfaces/starknet" "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/services" ) // APIList describes the list of available RPC apis -func APIList(ctx context.Context, db kv.RoDB, eth services.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, filters *filters.Filters, cfg cli.Flags, customAPIList []rpc.API) []rpc.API { - var defaultAPIList []rpc.API +func APIList(db kv.RoDB, borDb kv.RoDB, eth rpcinterfaces.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, + starknet starknet.CAIROVMClient, filters *rpcservices.Filters, stateCache kvcache.Cache, + blockReader services.FullBlockReader, cfg httpcfg.HttpCfg) (list []rpc.API) { - base := NewBaseApi(filters) + base := NewBaseApi(filters, stateCache, blockReader, cfg.WithDatadir) + if cfg.TevmEnabled { + base.EnableTevmExperiment() + } ethImpl := NewEthAPI(base, db, eth, txPool, mining, cfg.Gascap) - erigonImpl := NewErigonAPI(base, db) + erigonImpl := NewErigonAPI(base, db, eth) + starknetImpl := NewStarknetAPI(base, db, starknet, txPool) txpoolImpl := NewTxPoolAPI(base, db, txPool) netImpl := NewNetAPIImpl(eth) debugImpl := NewPrivateDebugAPI(base, db, cfg.Gascap) traceImpl := NewTraceAPI(base, db, &cfg) web3Impl := NewWeb3APIImpl(eth) - dbImpl := NewDBAPIImpl() /* deprecated */ - shhImpl := NewSHHAPIImpl() /* deprecated */ + dbImpl := NewDBAPIImpl() /* deprecated */ + engineImpl := NewEngineAPI(base, db, eth) + adminImpl := NewAdminAPI(eth) + parityImpl := NewParityAPIImpl(db) + borImpl := NewBorAPI(base, db, borDb) // bor (consensus) specific for _, enabledAPI := range cfg.API { switch enabledAPI { case "eth": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "eth", Public: true, Service: EthAPI(ethImpl), Version: "1.0", }) case "debug": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "debug", Public: true, Service: PrivateDebugAPI(debugImpl), Version: "1.0", }) case "net": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "net", Public: true, Service: NetAPI(netImpl), Version: "1.0", }) case "txpool": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "txpool", Public: true, Service: TxPoolAPI(txpoolImpl), Version: "1.0", }) case "web3": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "web3", Public: true, Service: Web3API(web3Impl), Version: "1.0", }) case "trace": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "trace", Public: true, Service: TraceAPI(traceImpl), Version: "1.0", }) - case "db": - defaultAPIList = append(defaultAPIList, rpc.API{ + case "db": /* Deprecated */ + list = append(list, rpc.API{ Namespace: "db", Public: true, Service: DBAPI(dbImpl), Version: "1.0", }) - case "shh": - defaultAPIList = append(defaultAPIList, rpc.API{ - Namespace: "shh", - Public: true, - Service: SHHAPI(shhImpl), - Version: "1.0", - }) case "erigon": - defaultAPIList = append(defaultAPIList, rpc.API{ + list = append(list, rpc.API{ Namespace: "erigon", Public: true, Service: ErigonAPI(erigonImpl), Version: "1.0", }) + case "starknet": + list = append(list, rpc.API{ + Namespace: "starknet", + Public: true, + Service: StarknetAPI(starknetImpl), + Version: "1.0", + }) + case "engine": + list = append(list, rpc.API{ + Namespace: "engine", + Public: true, + Service: EngineAPI(engineImpl), + Version: "1.0", + }) + case "bor": + list = append(list, rpc.API{ + Namespace: "bor", + Public: true, + Service: BorAPI(borImpl), + Version: "1.0", + }) + case "admin": + list = append(list, rpc.API{ + Namespace: "admin", + Public: false, + Service: AdminAPI(adminImpl), + Version: "1.0", + }) + case "parity": + list = append(list, rpc.API{ + Namespace: "parity", + Public: false, + Service: ParityAPI(parityImpl), + Version: "1.0", + }) } } - return append(defaultAPIList, customAPIList...) + return list } diff --git a/cmd/rpcdaemon/commands/debug_api.go b/cmd/rpcdaemon/commands/debug_api.go index 6eb4c56c9f0..f692da238d5 100644 --- a/cmd/rpcdaemon/commands/debug_api.go +++ b/cmd/rpcdaemon/commands/debug_api.go @@ -13,19 +13,24 @@ import ( "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/eth/tracers" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/turbo/transactions" + "github.com/ledgerwatch/log/v3" ) +// AccountRangeMaxResults is the maximum number of results to be returned per call +const AccountRangeMaxResults = 256 + // PrivateDebugAPI Exposed RPC endpoints for debugging use type PrivateDebugAPI interface { StorageRangeAt(ctx context.Context, blockHash common.Hash, txIndex uint64, contractAddress common.Address, keyStart hexutil.Bytes, maxResult int) (StorageRangeResult, error) TraceTransaction(ctx context.Context, hash common.Hash, config *tracers.TraceConfig, stream *jsoniter.Stream) error + TraceBlockByHash(ctx context.Context, hash common.Hash, config *tracers.TraceConfig, stream *jsoniter.Stream) error + TraceBlockByNumber(ctx context.Context, number rpc.BlockNumber, config *tracers.TraceConfig, stream *jsoniter.Stream) error AccountRange(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, start []byte, maxResults int, nocode, nostorage bool) (state.IteratorDump, error) GetModifiedAccountsByNumber(ctx context.Context, startNum rpc.BlockNumber, endNum *rpc.BlockNumber) ([]common.Address, error) GetModifiedAccountsByHash(_ context.Context, startHash common.Hash, endHash *common.Hash) ([]common.Address, error) @@ -62,7 +67,7 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co return StorageRangeResult{}, err } - block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash) + block, err := api.blockByHashWithSenders(tx, blockHash) if err != nil { return StorageRangeResult{}, err } @@ -70,10 +75,19 @@ func (api *PrivateDebugAPIImpl) StorageRangeAt(ctx context.Context, blockHash co return StorageRangeResult{}, nil } getHeader := func(hash common.Hash, number uint64) *types.Header { - return rawdb.ReadHeader(tx, hash, number) + h, e := api._blockReader.Header(ctx, tx, hash, number) + if e != nil { + log.Error("getHeader error", "number", number, "hash", hash, "err", e) + } + return h } - checkTEVM := ethdb.GetCheckTEVM(tx) - _, _, _, _, stateReader, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex) + + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + + _, _, _, _, stateReader, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, blockHash, txIndex) if err != nil { return StorageRangeResult{}, err } @@ -106,7 +120,7 @@ func (api *PrivateDebugAPIImpl) AccountRange(ctx context.Context, blockNrOrHash } } else if hash, ok := blockNrOrHash.Hash(); ok { - block, err1 := rawdb.ReadBlockByHash(tx, hash) + block, err1 := api.blockByHashWithSenders(tx, hash) if err1 != nil { return state.IteratorDump{}, err1 } @@ -116,8 +130,8 @@ func (api *PrivateDebugAPIImpl) AccountRange(ctx context.Context, blockNrOrHash blockNumber = block.NumberU64() } - if maxResults > eth.AccountRangeMaxResults || maxResults <= 0 { - maxResults = eth.AccountRangeMaxResults + if maxResults > AccountRangeMaxResults || maxResults <= 0 { + maxResults = AccountRangeMaxResults } dumper := state.NewDumper(tx, blockNumber) @@ -159,10 +173,10 @@ func (api *PrivateDebugAPIImpl) GetModifiedAccountsByNumber(ctx context.Context, return nil, fmt.Errorf("start block (%d) is later than the latest block (%d)", startNum, latestBlock) } - endNum := startNum // allows for single param calls + endNum := startNum + 1 // allows for single param calls if endNumber != nil { // forces negative numbers to fail (too large) but allows zero - endNum = uint64(endNumber.Int64()) + endNum = uint64(endNumber.Int64()) + 1 } // is endNum too big? @@ -185,7 +199,7 @@ func (api *PrivateDebugAPIImpl) GetModifiedAccountsByHash(ctx context.Context, s } defer tx.Rollback() - startBlock, err := rawdb.ReadBlockByHash(tx, startHash) + startBlock, err := api.blockByHashWithSenders(tx, startHash) if err != nil { return nil, err } @@ -193,17 +207,17 @@ func (api *PrivateDebugAPIImpl) GetModifiedAccountsByHash(ctx context.Context, s return nil, fmt.Errorf("start block %x not found", startHash) } startNum := startBlock.NumberU64() - endNum := startNum // allows for single parameter calls + endNum := startNum + 1 // allows for single parameter calls if endHash != nil { - endBlock, err := rawdb.ReadBlockByHash(tx, *endHash) + endBlock, err := api.blockByHashWithSenders(tx, *endHash) if err != nil { return nil, err } if endBlock == nil { return nil, fmt.Errorf("end block %x not found", *endHash) } - endNum = endBlock.NumberU64() + endNum = endBlock.NumberU64() + 1 } if startNum > endNum { @@ -225,7 +239,7 @@ func (api *PrivateDebugAPIImpl) AccountAt(ctx context.Context, blockHash common. return nil, err } - block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash) + block, err := api.blockByHashWithSenders(tx, blockHash) if err != nil { return nil, err } @@ -235,8 +249,11 @@ func (api *PrivateDebugAPIImpl) AccountAt(ctx context.Context, blockHash common. getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } - checkTEVM := ethdb.GetCheckTEVM(tx) - _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, blockHash, txIndex) + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, blockHash, txIndex) if err != nil { return nil, err } diff --git a/cmd/rpcdaemon/commands/debug_api_test.go b/cmd/rpcdaemon/commands/debug_api_test.go index e2c3e816a3d..8cc7bfa0dcf 100644 --- a/cmd/rpcdaemon/commands/debug_api_test.go +++ b/cmd/rpcdaemon/commands/debug_api_test.go @@ -7,10 +7,13 @@ import ( "testing" jsoniter "github.com/json-iterator/go" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/eth/tracers" "github.com/ledgerwatch/erigon/internal/ethapi" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" ) var debugTraceTransactionTests = []struct { @@ -35,9 +38,93 @@ var debugTraceTransactionNoRefundTests = []struct { {"b6449d8e167a8826d050afe4c9f07095236ff769a985f02649b1023c2ded2059", 62899, false, ""}, } +func TestTraceBlockByNumber(t *testing.T) { + db := rpcdaemontest.CreateTestKV(t) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + baseApi := NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false) + ethApi := NewEthAPI(baseApi, db, nil, nil, nil, 5000000) + api := NewPrivateDebugAPI(baseApi, db, 0) + for _, tt := range debugTraceTransactionTests { + var buf bytes.Buffer + stream := jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 4096) + tx, err := ethApi.GetTransactionByHash(context.Background(), common.HexToHash(tt.txHash)) + if err != nil { + t.Errorf("traceBlock %s: %v", tt.txHash, err) + } + txcount, err := ethApi.GetBlockTransactionCountByHash(context.Background(), *tx.BlockHash) + if err != nil { + t.Errorf("traceBlock %s: %v", tt.txHash, err) + } + err = api.TraceBlockByNumber(context.Background(), rpc.BlockNumber(tx.BlockNumber.ToInt().Uint64()), &tracers.TraceConfig{}, stream) + if err != nil { + t.Errorf("traceBlock %s: %v", tt.txHash, err) + } + if err = stream.Flush(); err != nil { + t.Fatalf("error flusing: %v", err) + } + var er []ethapi.ExecutionResult + if err = json.Unmarshal(buf.Bytes(), &er); err != nil { + t.Fatalf("parsing result: %v", err) + } + if len(er) != int(*txcount) { + t.Fatalf("incorrect length: %v", err) + } + } + var buf bytes.Buffer + stream := jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 4096) + err := api.TraceBlockByNumber(context.Background(), rpc.BlockNumber(rpc.LatestBlockNumber), &tracers.TraceConfig{}, stream) + if err != nil { + t.Errorf("traceBlock %v: %v", rpc.LatestBlockNumber, err) + } + if err = stream.Flush(); err != nil { + t.Fatalf("error flusing: %v", err) + } + var er []ethapi.ExecutionResult + if err = json.Unmarshal(buf.Bytes(), &er); err != nil { + t.Fatalf("parsing result: %v", err) + } +} + +func TestTraceBlockByHash(t *testing.T) { + db := rpcdaemontest.CreateTestKV(t) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + baseApi := NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false) + ethApi := NewEthAPI(baseApi, db, nil, nil, nil, 5000000) + api := NewPrivateDebugAPI(baseApi, db, 0) + for _, tt := range debugTraceTransactionTests { + var buf bytes.Buffer + stream := jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 4096) + tx, err := ethApi.GetTransactionByHash(context.Background(), common.HexToHash(tt.txHash)) + if err != nil { + t.Errorf("traceBlock %s: %v", tt.txHash, err) + } + txcount, err := ethApi.GetBlockTransactionCountByHash(context.Background(), *tx.BlockHash) + if err != nil { + t.Errorf("traceBlock %s: %v", tt.txHash, err) + } + err = api.TraceBlockByHash(context.Background(), *tx.BlockHash, &tracers.TraceConfig{}, stream) + if err != nil { + t.Errorf("traceBlock %s: %v", tt.txHash, err) + } + if err = stream.Flush(); err != nil { + t.Fatalf("error flusing: %v", err) + } + var er []ethapi.ExecutionResult + if err = json.Unmarshal(buf.Bytes(), &er); err != nil { + t.Fatalf("parsing result: %v", err) + } + if len(er) != int(*txcount) { + t.Fatalf("incorrect length: %v", err) + } + } +} + func TestTraceTransaction(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewPrivateDebugAPI(NewBaseApi(nil), db, 0) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewPrivateDebugAPI( + NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), + db, 0) for _, tt := range debugTraceTransactionTests { var buf bytes.Buffer stream := jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 4096) @@ -66,7 +153,10 @@ func TestTraceTransaction(t *testing.T) { func TestTraceTransactionNoRefund(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewPrivateDebugAPI(NewBaseApi(nil), db, 0) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewPrivateDebugAPI( + NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), + db, 0) for _, tt := range debugTraceTransactionNoRefundTests { var buf bytes.Buffer stream := jsoniter.NewStream(jsoniter.ConfigDefault, &buf, 4096) diff --git a/cmd/rpcdaemon/commands/engine_api.go b/cmd/rpcdaemon/commands/engine_api.go new file mode 100644 index 00000000000..d5ee5076953 --- /dev/null +++ b/cmd/rpcdaemon/commands/engine_api.go @@ -0,0 +1,262 @@ +package commands + +import ( + "context" + "encoding/binary" + "fmt" + "math/big" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/log/v3" +) + +// ExecutionPayload represents an execution payload (aka slot/block) +type ExecutionPayload struct { + ParentHash common.Hash `json:"parentHash" gencodec:"required"` + FeeRecipient common.Address `json:"feeRecipient" gencodec:"required"` + StateRoot common.Hash `json:"stateRoot" gencodec:"required"` + ReceiptsRoot common.Hash `json:"receiptsRoot" gencodec:"required"` + LogsBloom hexutil.Bytes `json:"logsBloom" gencodec:"required"` + PrevRandao common.Hash `json:"prevRandao" gencodec:"required"` + BlockNumber hexutil.Uint64 `json:"blockNumber" gencodec:"required"` + GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` + GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + ExtraData hexutil.Bytes `json:"extraData" gencodec:"required"` + BaseFeePerGas *hexutil.Big `json:"baseFeePerGas" gencodec:"required"` + BlockHash common.Hash `json:"blockHash" gencodec:"required"` + Transactions []hexutil.Bytes `json:"transactions" gencodec:"required"` +} + +// PayloadAttributes represent the attributes required to start assembling a payload +type ForkChoiceState struct { + HeadHash common.Hash `json:"headBlockHash" gencodec:"required"` + SafeBlockHash common.Hash `json:"safeBlockHash" gencodec:"required"` + FinalizedBlockHash common.Hash `json:"finalizedBlockHash" gencodec:"required"` +} + +// PayloadAttributes represent the attributes required to start assembling a payload +type PayloadAttributes struct { + Timestamp hexutil.Uint64 `json:"timestamp" gencodec:"required"` + PrevRandao common.Hash `json:"prevRandao" gencodec:"required"` + SuggestedFeeRecipient common.Address `json:"suggestedFeeRecipient" gencodec:"required"` +} + +// TransitionConfiguration represents the correct configurations of the CL and the EL +type TransitionConfiguration struct { + TerminalTotalDifficulty *hexutil.Big `json:"terminalTotalDifficulty" gencodec:"required"` + TerminalBlockHash common.Hash `json:"terminalBlockHash" gencodec:"required"` + TerminalBlockNumber *hexutil.Big `json:"terminalBlockNumber" gencodec:"required"` +} + +// EngineAPI Beacon chain communication endpoint +type EngineAPI interface { + ForkchoiceUpdatedV1(ctx context.Context, forkChoiceState *ForkChoiceState, payloadAttributes *PayloadAttributes) (map[string]interface{}, error) + NewPayloadV1(context.Context, *ExecutionPayload) (map[string]interface{}, error) + GetPayloadV1(ctx context.Context, payloadID hexutil.Bytes) (*ExecutionPayload, error) + ExchangeTransitionConfigurationV1(ctx context.Context, transitionConfiguration TransitionConfiguration) (TransitionConfiguration, error) +} + +// EngineImpl is implementation of the EngineAPI interface +type EngineImpl struct { + *BaseAPI + db kv.RoDB + api rpcinterfaces.ApiBackend +} + +func convertPayloadStatus(x *remote.EnginePayloadStatus) map[string]interface{} { + json := map[string]interface{}{ + "status": x.Status.String(), + } + if x.LatestValidHash != nil { + json["latestValidHash"] = common.Hash(gointerfaces.ConvertH256ToHash(x.LatestValidHash)) + } + if x.ValidationError != "" { + json["validationError"] = x.ValidationError + } + + return json +} + +func (e *EngineImpl) ForkchoiceUpdatedV1(ctx context.Context, forkChoiceState *ForkChoiceState, payloadAttributes *PayloadAttributes) (map[string]interface{}, error) { + log.Trace("Received ForkchoiceUpdated", "head", forkChoiceState.HeadHash, "safe", forkChoiceState.HeadHash, "finalized", forkChoiceState.FinalizedBlockHash, + "build", payloadAttributes != nil) + + var prepareParameters *remote.EnginePayloadAttributes + if payloadAttributes != nil { + prepareParameters = &remote.EnginePayloadAttributes{ + Timestamp: uint64(payloadAttributes.Timestamp), + PrevRandao: gointerfaces.ConvertHashToH256(payloadAttributes.PrevRandao), + SuggestedFeeRecipient: gointerfaces.ConvertAddressToH160(payloadAttributes.SuggestedFeeRecipient), + } + } + reply, err := e.api.EngineForkchoiceUpdatedV1(ctx, &remote.EngineForkChoiceUpdatedRequest{ + ForkchoiceState: &remote.EngineForkChoiceState{ + HeadBlockHash: gointerfaces.ConvertHashToH256(forkChoiceState.HeadHash), + SafeBlockHash: gointerfaces.ConvertHashToH256(forkChoiceState.SafeBlockHash), + FinalizedBlockHash: gointerfaces.ConvertHashToH256(forkChoiceState.FinalizedBlockHash), + }, + PayloadAttributes: prepareParameters, + }) + if err != nil { + return nil, err + } + + json := map[string]interface{}{ + "payloadStatus": convertPayloadStatus(reply.PayloadStatus), + } + if reply.PayloadId != 0 { + encodedPayloadId := make([]byte, 8) + binary.BigEndian.PutUint64(encodedPayloadId, reply.PayloadId) + json["payloadId"] = hexutil.Bytes(encodedPayloadId) + } + + return json, nil +} + +// NewPayloadV1 processes new payloads (blocks) from the beacon chain. +// See https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md#engine_newpayloadv1 +func (e *EngineImpl) NewPayloadV1(ctx context.Context, payload *ExecutionPayload) (map[string]interface{}, error) { + log.Trace("Received NewPayload", "height", uint64(payload.BlockNumber), "hash", payload.BlockHash) + + var baseFee *uint256.Int + if payload.BaseFeePerGas != nil { + var overflow bool + baseFee, overflow = uint256.FromBig((*big.Int)(payload.BaseFeePerGas)) + if overflow { + log.Warn("NewPayload BaseFeePerGas overflow") + return nil, fmt.Errorf("invalid request") + } + } + + // Convert slice of hexutil.Bytes to a slice of slice of bytes + transactions := make([][]byte, len(payload.Transactions)) + for i, transaction := range payload.Transactions { + transactions[i] = ([]byte)(transaction) + } + res, err := e.api.EngineNewPayloadV1(ctx, &types2.ExecutionPayload{ + ParentHash: gointerfaces.ConvertHashToH256(payload.ParentHash), + Coinbase: gointerfaces.ConvertAddressToH160(payload.FeeRecipient), + StateRoot: gointerfaces.ConvertHashToH256(payload.StateRoot), + ReceiptRoot: gointerfaces.ConvertHashToH256(payload.ReceiptsRoot), + LogsBloom: gointerfaces.ConvertBytesToH2048(([]byte)(payload.LogsBloom)), + PrevRandao: gointerfaces.ConvertHashToH256(payload.PrevRandao), + BlockNumber: uint64(payload.BlockNumber), + GasLimit: uint64(payload.GasLimit), + GasUsed: uint64(payload.GasUsed), + Timestamp: uint64(payload.Timestamp), + ExtraData: payload.ExtraData, + BaseFeePerGas: gointerfaces.ConvertUint256IntToH256(baseFee), + BlockHash: gointerfaces.ConvertHashToH256(payload.BlockHash), + Transactions: transactions, + }) + if err != nil { + log.Warn("NewPayload", "err", err) + return nil, err + } + + return convertPayloadStatus(res), nil +} + +func (e *EngineImpl) GetPayloadV1(ctx context.Context, payloadID hexutil.Bytes) (*ExecutionPayload, error) { + decodedPayloadId := binary.BigEndian.Uint64(payloadID) + log.Info("Received GetPayload", "payloadId", decodedPayloadId) + + payload, err := e.api.EngineGetPayloadV1(ctx, decodedPayloadId) + if err != nil { + return nil, err + } + var bloom types.Bloom = gointerfaces.ConvertH2048ToBloom(payload.LogsBloom) + + var baseFee *big.Int + if payload.BaseFeePerGas != nil { + baseFee = gointerfaces.ConvertH256ToUint256Int(payload.BaseFeePerGas).ToBig() + } + + // Convert slice of hexutil.Bytes to a slice of slice of bytes + transactions := make([]hexutil.Bytes, len(payload.Transactions)) + for i, transaction := range payload.Transactions { + transactions[i] = transaction + } + return &ExecutionPayload{ + ParentHash: gointerfaces.ConvertH256ToHash(payload.ParentHash), + FeeRecipient: gointerfaces.ConvertH160toAddress(payload.Coinbase), + StateRoot: gointerfaces.ConvertH256ToHash(payload.StateRoot), + ReceiptsRoot: gointerfaces.ConvertH256ToHash(payload.ReceiptRoot), + LogsBloom: bloom[:], + PrevRandao: gointerfaces.ConvertH256ToHash(payload.PrevRandao), + BlockNumber: hexutil.Uint64(payload.BlockNumber), + GasLimit: hexutil.Uint64(payload.GasLimit), + GasUsed: hexutil.Uint64(payload.GasUsed), + Timestamp: hexutil.Uint64(payload.Timestamp), + ExtraData: payload.ExtraData, + BaseFeePerGas: (*hexutil.Big)(baseFee), + BlockHash: gointerfaces.ConvertH256ToHash(payload.BlockHash), + Transactions: transactions, + }, nil +} + +// Receives consensus layer's transition configuration and checks if the execution layer has the correct configuration. +// Can also be used to ping the execution layer (heartbeats). +// See https://github.com/ethereum/execution-apis/blob/v1.0.0-alpha.7/src/engine/specification.md#engine_exchangetransitionconfigurationv1 +func (e *EngineImpl) ExchangeTransitionConfigurationV1(ctx context.Context, beaconConfig TransitionConfiguration) (TransitionConfiguration, error) { + tx, err := e.db.BeginRo(ctx) + + if err != nil { + return TransitionConfiguration{}, err + } + + defer tx.Rollback() + + chainConfig, err := e.BaseAPI.chainConfig(tx) + + if err != nil { + return TransitionConfiguration{}, err + } + + terminalTotalDifficulty := chainConfig.TerminalTotalDifficulty + + if terminalTotalDifficulty == nil { + return TransitionConfiguration{}, fmt.Errorf("the execution layer doesn't have a terminal total difficulty. expected: %v", beaconConfig.TerminalTotalDifficulty) + } + + if terminalTotalDifficulty.Cmp((*big.Int)(beaconConfig.TerminalTotalDifficulty)) != 0 { + return TransitionConfiguration{}, fmt.Errorf("the execution layer has a wrong terminal total difficulty. expected %v, but instead got: %d", beaconConfig.TerminalTotalDifficulty, terminalTotalDifficulty) + } + + if chainConfig.TerminalBlockHash != beaconConfig.TerminalBlockHash { + return TransitionConfiguration{}, fmt.Errorf("the execution layer has a wrong terminal block hash. expected %s, but instead got: %s", beaconConfig.TerminalBlockHash, chainConfig.TerminalBlockHash) + } + + terminalBlockNumber := chainConfig.TerminalBlockNumber + if terminalBlockNumber == nil { + terminalBlockNumber = common.Big0 + } + + if terminalBlockNumber.Cmp((*big.Int)(beaconConfig.TerminalBlockNumber)) != 0 { + return TransitionConfiguration{}, fmt.Errorf("the execution layer has a wrong terminal block number. expected %v, but instead got: %d", beaconConfig.TerminalBlockNumber, terminalBlockNumber) + } + + return TransitionConfiguration{ + TerminalTotalDifficulty: (*hexutil.Big)(terminalTotalDifficulty), + TerminalBlockHash: chainConfig.TerminalBlockHash, + TerminalBlockNumber: (*hexutil.Big)(terminalBlockNumber), + }, nil +} + +// NewEngineAPI returns EngineImpl instance +func NewEngineAPI(base *BaseAPI, db kv.RoDB, api rpcinterfaces.ApiBackend) *EngineImpl { + return &EngineImpl{ + BaseAPI: base, + db: db, + api: api, + } +} diff --git a/cmd/rpcdaemon/commands/engine_api_test.go b/cmd/rpcdaemon/commands/engine_api_test.go new file mode 100644 index 00000000000..a209b8469b6 --- /dev/null +++ b/cmd/rpcdaemon/commands/engine_api_test.go @@ -0,0 +1,18 @@ +package commands + +import ( + "testing" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon/common" + "github.com/stretchr/testify/assert" +) + +// Test case for https://github.com/ethereum/execution-apis/pull/217 responses +func TestZeroLatestValidHash(t *testing.T) { + payloadStatus := remote.EnginePayloadStatus{Status: remote.EngineStatus_INVALID, LatestValidHash: gointerfaces.ConvertHashToH256(common.Hash{})} + json := convertPayloadStatus(&payloadStatus) + assert.Equal(t, "INVALID", json["status"]) + assert.Equal(t, common.Hash{}, json["latestValidHash"]) +} diff --git a/cmd/rpcdaemon/commands/erigon_api.go b/cmd/rpcdaemon/commands/erigon_api.go index 9870b6b683e..8f644a2587c 100644 --- a/cmd/rpcdaemon/commands/erigon_api.go +++ b/cmd/rpcdaemon/commands/erigon_api.go @@ -4,8 +4,10 @@ import ( "context" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/rpc" ) @@ -17,27 +19,34 @@ type ErigonAPI interface { // Blocks related (see ./erigon_blocks.go) GetHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) GetHeaderByHash(_ context.Context, hash common.Hash) (*types.Header, error) + GetBlockByTimestamp(ctx context.Context, timeStamp rpc.Timestamp, fullTx bool) (map[string]interface{}, error) // Receipt related (see ./erigon_receipts.go) GetLogsByHash(ctx context.Context, hash common.Hash) ([][]*types.Log, error) //GetLogsByNumber(ctx context.Context, number rpc.BlockNumber) ([][]*types.Log, error) - // Issuance / reward related (see ./erigon_issuance.go) - // BlockReward(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) - // UncleReward(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) - Issuance(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) + // WatchTheBurn / reward related (see ./erigon_issuance.go) + WatchTheBurn(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) + + // CumulativeChainTraffic / related to chain traffic (see ./erigon_cumulative_index.go) + CumulativeChainTraffic(ctx context.Context, blockNr rpc.BlockNumber) (ChainTraffic, error) + + // NodeInfo returns a collection of metadata known about the host. + NodeInfo(ctx context.Context) ([]p2p.NodeInfo, error) } // ErigonImpl is implementation of the ErigonAPI interface type ErigonImpl struct { *BaseAPI - db kv.RoDB + db kv.RoDB + ethBackend rpcinterfaces.ApiBackend } // NewErigonAPI returns ErigonImpl instance -func NewErigonAPI(base *BaseAPI, db kv.RoDB) *ErigonImpl { +func NewErigonAPI(base *BaseAPI, db kv.RoDB, eth rpcinterfaces.ApiBackend) *ErigonImpl { return &ErigonImpl{ - BaseAPI: base, - db: db, + BaseAPI: base, + db: db, + ethBackend: eth, } } diff --git a/cmd/rpcdaemon/commands/erigon_block.go b/cmd/rpcdaemon/commands/erigon_block.go index 5330e1c9e5c..d32557024e4 100644 --- a/cmd/rpcdaemon/commands/erigon_block.go +++ b/cmd/rpcdaemon/commands/erigon_block.go @@ -3,10 +3,13 @@ package commands import ( "context" "fmt" + "sort" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" ) @@ -27,9 +30,14 @@ func (api *ErigonImpl) GetHeaderByNumber(ctx context.Context, blockNumber rpc.Bl } defer tx.Rollback() - header := rawdb.ReadHeaderByNumber(tx, uint64(blockNumber.Int64())) + blockNum, err := getBlockNumber(blockNumber, tx) + if err != nil { + return nil, err + } + + header := rawdb.ReadHeaderByNumber(tx, blockNum) if header == nil { - return nil, fmt.Errorf("block header not found: %d", blockNumber.Int64()) + return nil, fmt.Errorf("block header not found: %d", blockNum) } return header, nil @@ -53,3 +61,82 @@ func (api *ErigonImpl) GetHeaderByHash(ctx context.Context, hash common.Hash) (* return header, nil } + +func (api *ErigonImpl) GetBlockByTimestamp(ctx context.Context, timeStamp rpc.Timestamp, fullTx bool) (map[string]interface{}, error) { + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + uintTimestamp := timeStamp.TurnIntoUint64() + + currentHeader := rawdb.ReadCurrentHeader(tx) + currenttHeaderTime := currentHeader.Time + highestNumber := currentHeader.Number.Uint64() + + firstHeader := rawdb.ReadHeaderByNumber(tx, 0) + firstHeaderTime := firstHeader.Time + + if currenttHeaderTime <= uintTimestamp { + blockResponse, err := buildBlockResponse(tx, highestNumber, fullTx) + if err != nil { + return nil, err + } + + return blockResponse, nil + } + + if firstHeaderTime >= uintTimestamp { + blockResponse, err := buildBlockResponse(tx, 0, fullTx) + if err != nil { + return nil, err + } + + return blockResponse, nil + } + + blockNum := sort.Search(int(currentHeader.Number.Uint64()), func(blockNum int) bool { + currentHeader := rawdb.ReadHeaderByNumber(tx, uint64(blockNum)) + + return currentHeader.Time >= uintTimestamp + }) + + resultingHeader := rawdb.ReadHeaderByNumber(tx, uint64(blockNum)) + + if resultingHeader.Time > uintTimestamp { + response, err := buildBlockResponse(tx, uint64(blockNum)-1, fullTx) + if err != nil { + return nil, err + } + return response, nil + } + + response, err := buildBlockResponse(tx, uint64(blockNum), fullTx) + if err != nil { + return nil, err + } + + return response, nil +} + +func buildBlockResponse(db kv.Tx, blockNum uint64, fullTx bool) (map[string]interface{}, error) { + block, err := rawdb.ReadBlockByNumber(db, blockNum) + if err != nil { + return nil, err + } + + if block == nil { + return nil, nil + } + + response, err := ethapi.RPCMarshalBlock(block, true, fullTx) + + if err == nil && rpc.BlockNumber(block.NumberU64()) == rpc.PendingBlockNumber { + // Pending blocks need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + return response, err +} diff --git a/cmd/rpcdaemon/commands/erigon_cumulative_chain_traffic.go b/cmd/rpcdaemon/commands/erigon_cumulative_chain_traffic.go new file mode 100644 index 00000000000..640ececce78 --- /dev/null +++ b/cmd/rpcdaemon/commands/erigon_cumulative_chain_traffic.go @@ -0,0 +1,41 @@ +package commands + +import ( + "context" + + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/rpc" +) + +// CumulativeGasIndex implements erigon_cumulativeChainTraffic. Returns how much traffic there has been at the specified block number. +// Aka. amount of gas used so far + total transactions issued to the network +func (api *ErigonImpl) CumulativeChainTraffic(ctx context.Context, blockNr rpc.BlockNumber) (ChainTraffic, error) { + tx, err := api.db.BeginRo(ctx) + if err != nil { + return ChainTraffic{}, err + } + defer tx.Rollback() + + blockNumber := uint64(blockNr) + cumulativeGasUsed, err := rawdb.ReadCumulativeGasUsed(tx, blockNumber) + if err != nil { + return ChainTraffic{}, err + } + + _, baseTxId, txCount, err := rawdb.ReadBodyByNumber(tx, blockNumber) + if err != nil { + return ChainTraffic{}, err + } + + cumulativeTransactionCount := baseTxId + uint64(txCount) + return ChainTraffic{ + CumulativeGasUsed: (*hexutil.Big)(cumulativeGasUsed), + CumulativeTransactionsCount: (*hexutil.Uint64)(&cumulativeTransactionCount), + }, nil +} + +type ChainTraffic struct { + CumulativeGasUsed *hexutil.Big `json:"cumulativeGasUsed"` + CumulativeTransactionsCount *hexutil.Uint64 `json:"cumulativeTransactionsCount"` +} diff --git a/cmd/rpcdaemon/commands/erigon_issuance.go b/cmd/rpcdaemon/commands/erigon_issuance.go index b45d60cbc47..7aef3595e2a 100644 --- a/cmd/rpcdaemon/commands/erigon_issuance.go +++ b/cmd/rpcdaemon/commands/erigon_issuance.go @@ -2,12 +2,13 @@ package commands import ( "context" + "fmt" + "math/big" - "github.com/ledgerwatch/erigon-lib/kv" + "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/rpc" ) @@ -34,7 +35,7 @@ import ( //} // Issuance implements erigon_issuance. Returns the total issuance (block reward plus uncle reward) for the given block. -func (api *ErigonImpl) Issuance(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) { +func (api *ErigonImpl) WatchTheBurn(ctx context.Context, blockNr rpc.BlockNumber) (Issuance, error) { tx, err := api.db.BeginRo(ctx) if err != nil { return Issuance{}, err @@ -49,12 +50,22 @@ func (api *ErigonImpl) Issuance(ctx context.Context, blockNr rpc.BlockNumber) (I // Clique for example has no issuance return Issuance{}, nil } - - block, err := api.getBlockByRPCNumber(tx, blockNr) + hash, err := rawdb.ReadCanonicalHash(tx, uint64(blockNr)) if err != nil { return Issuance{}, err } - minerReward, uncleRewards := ethash.AccumulateRewards(chainConfig, block.Header(), block.Uncles()) + header := rawdb.ReadHeader(tx, hash, uint64(blockNr)) + if header == nil { + return Issuance{}, fmt.Errorf("could not find block header") + } + + body := rawdb.ReadCanonicalBodyWithTransactions(tx, hash, uint64(blockNr)) + + if body == nil { + return Issuance{}, fmt.Errorf("could not find block body") + } + + minerReward, uncleRewards := ethash.AccumulateRewards(chainConfig, header, body.Uncles) issuance := minerReward for _, r := range uncleRewards { p := r // avoids warning? @@ -62,24 +73,61 @@ func (api *ErigonImpl) Issuance(ctx context.Context, blockNr rpc.BlockNumber) (I } var ret Issuance - ret.BlockReward = hexutil.EncodeBig(minerReward.ToBig()) - ret.Issuance = hexutil.EncodeBig(issuance.ToBig()) + ret.BlockReward = (*hexutil.Big)(minerReward.ToBig()) + ret.Issuance = (*hexutil.Big)(issuance.ToBig()) issuance.Sub(&issuance, &minerReward) - ret.UncleReward = hexutil.EncodeBig(issuance.ToBig()) - return ret, nil -} - -func (api *ErigonImpl) getBlockByRPCNumber(tx kv.Tx, blockNr rpc.BlockNumber) (*types.Block, error) { - blockNum, err := getBlockNumber(blockNr, tx) + ret.UncleReward = (*hexutil.Big)(issuance.ToBig()) + // Compute how much was burnt + if header.BaseFee != nil { + burnt := header.BaseFee + burnt.Mul(burnt, big.NewInt(int64(header.GasUsed))) + ret.Burnt = (*hexutil.Big)(burnt) + } else { + ret.Burnt = (*hexutil.Big)(big.NewInt(0)) + } + // Compute totalIssued, totalBurnt and the supply of eth + totalIssued, err := rawdb.ReadTotalIssued(tx, uint64(blockNr)) if err != nil { - return nil, err + return Issuance{}, err } - return rawdb.ReadBlockByNumber(tx, blockNum) + totalBurnt, err := rawdb.ReadTotalBurnt(tx, uint64(blockNr)) + if err != nil { + return Issuance{}, err + } + + ret.TotalIssued = (*hexutil.Big)(totalIssued) + ret.TotalBurnt = (*hexutil.Big)(totalBurnt) + + // Compute tips + tips := big.NewInt(0) + + if header.BaseFee != nil { + receipts, err := rawdb.ReadReceiptsByHash(tx, hash) + if err != nil { + return Issuance{}, err + } + + baseFee, overflow := uint256.FromBig(header.BaseFee) + if overflow { + return Issuance{}, fmt.Errorf("baseFee overflow") + } + + for i, transaction := range body.Transactions { + tip := transaction.GetEffectiveGasTip(baseFee).ToBig() + tips.Add(tips, tip.Mul(tip, big.NewInt(int64(receipts[i].GasUsed)))) + } + } + ret.Tips = (*hexutil.Big)(tips) + return ret, nil } // Issuance structure to return information about issuance type Issuance struct { - BlockReward string `json:"blockReward,omitempty"` - UncleReward string `json:"uncleReward,omitempty"` - Issuance string `json:"issuance,omitempty"` + BlockReward *hexutil.Big `json:"blockReward"` // Block reward for given block + UncleReward *hexutil.Big `json:"uncleReward"` // Uncle reward for gived block + Issuance *hexutil.Big `json:"issuance"` // Total amount of wei created in the block + Burnt *hexutil.Big `json:"burnt"` // Total amount of wei burned in the block + TotalIssued *hexutil.Big `json:"totalIssued"` // Total amount of wei created in total so far + TotalBurnt *hexutil.Big `json:"totalBurnt"` // Total amount of wei burnt so far + Tips *hexutil.Big `json:"tips"` // Total Tips generated by the block } diff --git a/cmd/rpcdaemon/commands/erigon_nodeInfo.go b/cmd/rpcdaemon/commands/erigon_nodeInfo.go new file mode 100644 index 00000000000..68ef98d9299 --- /dev/null +++ b/cmd/rpcdaemon/commands/erigon_nodeInfo.go @@ -0,0 +1,16 @@ +package commands + +import ( + "context" + + "github.com/ledgerwatch/erigon/p2p" +) + +const ( + // allNodesInfo used in NodeInfo request to receive meta data from all running sentries. + allNodesInfo = 0 +) + +func (api *ErigonImpl) NodeInfo(ctx context.Context) ([]p2p.NodeInfo, error) { + return api.ethBackend.NodeInfo(ctx, allNodesInfo) +} diff --git a/cmd/rpcdaemon/commands/erigon_receipts.go b/cmd/rpcdaemon/commands/erigon_receipts.go index 0e792b30603..cc9a6bae69f 100644 --- a/cmd/rpcdaemon/commands/erigon_receipts.go +++ b/cmd/rpcdaemon/commands/erigon_receipts.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" ) @@ -22,13 +21,16 @@ func (api *ErigonImpl) GetLogsByHash(ctx context.Context, hash common.Hash) ([][ return nil, err } - block, senders, err := rawdb.ReadBlockByHashWithSenders(tx, hash) + block, err := api.blockByHashWithSenders(tx, hash) if err != nil { return nil, err } - receipts, err := getReceipts(ctx, tx, chainConfig, block, senders) + if block == nil { + return nil, nil + } + receipts, err := api.getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs()) if err != nil { - return nil, fmt.Errorf("getReceipts error: %v", err) + return nil, fmt.Errorf("getReceipts error: %w", err) } logs := make([][]*types.Log, len(receipts)) @@ -53,7 +55,7 @@ func (api *ErigonImpl) GetLogsByHash(ctx context.Context, hash common.Hash) ([][ // receipts, err := getReceipts(ctx, tx, *number, hash) // if err != nil { -// return nil, fmt.Errorf("getReceipts error: %v", err) +// return nil, fmt.Errorf("getReceipts error: %w", err) // } // logs := make([][]*types.Log, len(receipts)) diff --git a/cmd/rpcdaemon/commands/eth_accounts.go b/cmd/rpcdaemon/commands/eth_accounts.go index f0dd9f2aa4f..c55869d3999 100644 --- a/cmd/rpcdaemon/commands/eth_accounts.go +++ b/cmd/rpcdaemon/commands/eth_accounts.go @@ -5,9 +5,11 @@ import ( "fmt" "math/big" - "github.com/ledgerwatch/erigon/turbo/adapter" + "github.com/ledgerwatch/erigon-lib/gointerfaces" "github.com/ledgerwatch/erigon/turbo/rpchelper" + "google.golang.org/grpc" + txpool_proto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/rpc" @@ -17,17 +19,17 @@ import ( func (api *APIImpl) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { tx, err1 := api.db.BeginRo(ctx) if err1 != nil { - return nil, fmt.Errorf("getBalance cannot open tx: %v", err1) + return nil, fmt.Errorf("getBalance cannot open tx: %w", err1) } defer tx.Rollback() - blockNumber, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) + reader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, api.filters, api.stateCache) if err != nil { return nil, err } - acc, err := rpchelper.GetAccount(tx, blockNumber, address) + acc, err := reader.ReadAccountData(address) if err != nil { - return nil, fmt.Errorf("cant get a balance for account %q for block %v", address.String(), blockNumber) + return nil, fmt.Errorf("cant get a balance for account %x: %w", address.String(), err) } if acc == nil { // Special case - non-existent account is assumed to have zero balance @@ -39,17 +41,28 @@ func (api *APIImpl) GetBalance(ctx context.Context, address common.Address, bloc // GetTransactionCount implements eth_getTransactionCount. Returns the number of transactions sent from an address (the nonce). func (api *APIImpl) GetTransactionCount(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Uint64, error) { + if blockNrOrHash.BlockNumber != nil && *blockNrOrHash.BlockNumber == rpc.PendingBlockNumber { + reply, err := api.txPool.Nonce(ctx, &txpool_proto.NonceRequest{ + Address: gointerfaces.ConvertAddressToH160(address), + }, &grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + if reply.Found { + reply.Nonce++ + return (*hexutil.Uint64)(&reply.Nonce), nil + } + } tx, err1 := api.db.BeginRo(ctx) if err1 != nil { - return nil, fmt.Errorf("getTransactionCount cannot open tx: %v", err1) + return nil, fmt.Errorf("getTransactionCount cannot open tx: %w", err1) } defer tx.Rollback() - blockNumber, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) + reader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, api.filters, api.stateCache) if err != nil { return nil, err } nonce := hexutil.Uint64(0) - reader := adapter.NewStateReader(tx, blockNumber) acc, err := reader.ReadAccountData(address) if acc == nil || err != nil { return &nonce, err @@ -61,15 +74,14 @@ func (api *APIImpl) GetTransactionCount(ctx context.Context, address common.Addr func (api *APIImpl) GetCode(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) { tx, err1 := api.db.BeginRo(ctx) if err1 != nil { - return nil, fmt.Errorf("getCode cannot open tx: %v", err1) + return nil, fmt.Errorf("getCode cannot open tx: %w", err1) } defer tx.Rollback() - blockNumber, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) + reader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, api.filters, api.stateCache) if err != nil { return nil, err } - reader := adapter.NewStateReader(tx, blockNumber) acc, err := reader.ReadAccountData(address) if acc == nil || err != nil { return hexutil.Bytes(""), nil @@ -91,11 +103,10 @@ func (api *APIImpl) GetStorageAt(ctx context.Context, address common.Address, in } defer tx.Rollback() - blockNumber, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) + reader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, api.filters, api.stateCache) if err != nil { return hexutil.Encode(common.LeftPadBytes(empty, 32)), err } - reader := adapter.NewStateReader(tx, blockNumber) acc, err := reader.ReadAccountData(address) if acc == nil || err != nil { return hexutil.Encode(common.LeftPadBytes(empty, 32)), err diff --git a/cmd/rpcdaemon/commands/eth_api.go b/cmd/rpcdaemon/commands/eth_api.go index f522db64c87..830506ad2b7 100644 --- a/cmd/rpcdaemon/commands/eth_api.go +++ b/cmd/rpcdaemon/commands/eth_api.go @@ -6,22 +6,24 @@ import ( "math/big" "sync" + lru "github.com/hashicorp/golang-lru" "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/consensus/misc" - "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/common/math" + "github.com/ledgerwatch/erigon/consensus/misc" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" ethFilters "github.com/ledgerwatch/erigon/eth/filters" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/services" ) // EthAPI is a collection of functions that are exposed in the @@ -52,11 +54,11 @@ type EthAPI interface { GetUncleCountByBlockHash(ctx context.Context, hash common.Hash) (*hexutil.Uint, error) // Filter related (see ./eth_filters.go) - NewPendingTransactionFilter(_ context.Context) (hexutil.Uint64, error) - NewBlockFilter(_ context.Context) (hexutil.Uint64, error) - NewFilter(_ context.Context, filter interface{}) (hexutil.Uint64, error) - UninstallFilter(_ context.Context, index hexutil.Uint64) (bool, error) - GetFilterChanges(_ context.Context, index hexutil.Uint64) ([]interface{}, error) + NewPendingTransactionFilter(_ context.Context) (common.Hash, error) + NewBlockFilter(_ context.Context) (common.Hash, error) + NewFilter(_ context.Context, crit ethFilters.FilterCriteria) (common.Hash, error) + UninstallFilter(_ context.Context, index string) (bool, error) + GetFilterChanges(_ context.Context, index string) ([]interface{}, error) // Account related (see ./eth_accounts.go) Accounts(ctx context.Context) ([]common.Address, error) @@ -73,13 +75,14 @@ type EthAPI interface { GasPrice(_ context.Context) (*hexutil.Big, error) // Sending related (see ./eth_call.go) - Call(ctx context.Context, args ethapi.CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *map[common.Address]ethapi.Account) (hexutil.Bytes, error) - EstimateGas(ctx context.Context, args ethapi.CallArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) + Call(ctx context.Context, args ethapi.CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *ethapi.StateOverrides) (hexutil.Bytes, error) + EstimateGas(ctx context.Context, argsOrNil *ethapi.CallArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) SendRawTransaction(ctx context.Context, encodedTx hexutil.Bytes) (common.Hash, error) SendTransaction(_ context.Context, txObject interface{}) (common.Hash, error) Sign(ctx context.Context, _ common.Address, _ hexutil.Bytes) (hexutil.Bytes, error) SignTransaction(_ context.Context, txObject interface{}) (common.Hash, error) GetProof(ctx context.Context, address common.Address, storageKeys []string, blockNr rpc.BlockNumber) (*interface{}, error) + CreateAccessList(ctx context.Context, args ethapi.CallArgs, blockNrOrHash *rpc.BlockNumberOrHash, optimizeGas *bool) (*accessListResult, error) // Mining related (see ./eth_mining.go) Coinbase(ctx context.Context) (common.Address, error) @@ -88,23 +91,32 @@ type EthAPI interface { GetWork(ctx context.Context) ([4]string, error) SubmitWork(ctx context.Context, nonce types.BlockNonce, powHash, digest common.Hash) (bool, error) SubmitHashrate(ctx context.Context, hashRate hexutil.Uint64, id common.Hash) (bool, error) - - // Deprecated commands in eth_ (proposed file: ./eth_deprecated.go) - GetCompilers(_ context.Context) ([]string, error) - CompileLLL(_ context.Context, _ string) (hexutil.Bytes, error) - CompileSolidity(ctx context.Context, _ string) (hexutil.Bytes, error) - CompileSerpent(ctx context.Context, _ string) (hexutil.Bytes, error) } type BaseAPI struct { - filters *filters.Filters - _chainConfig *params.ChainConfig - _genesis *types.Block - _genesisSetOnce sync.Once + stateCache kvcache.Cache // thread-safe + blocksLRU *lru.Cache // thread-safe + filters *rpcservices.Filters + _chainConfig *params.ChainConfig + _genesis *types.Block + _genesisLock sync.RWMutex + + _blockReader services.FullBlockReader + _txnReader services.TxnReader + TevmEnabled bool // experiment } -func NewBaseApi(f *filters.Filters) *BaseAPI { - return &BaseAPI{filters: f} +func NewBaseApi(f *rpcservices.Filters, stateCache kvcache.Cache, blockReader services.FullBlockReader, singleNodeMode bool) *BaseAPI { + blocksLRUSize := 128 // ~32Mb + if !singleNodeMode { + blocksLRUSize = 512 + } + blocksLRU, err := lru.New(blocksLRUSize) + if err != nil { + panic(err) + } + + return &BaseAPI{filters: f, stateCache: stateCache, blocksLRU: blocksLRU, _blockReader: blockReader, _txnReader: blockReader} } func (api *BaseAPI) chainConfig(tx kv.Tx) (*params.ChainConfig, error) { @@ -112,30 +124,87 @@ func (api *BaseAPI) chainConfig(tx kv.Tx) (*params.ChainConfig, error) { return cfg, err } +func (api *BaseAPI) EnableTevmExperiment() { api.TevmEnabled = true } + // nolint:unused func (api *BaseAPI) genesis(tx kv.Tx) (*types.Block, error) { _, genesis, err := api.chainConfigWithGenesis(tx) return genesis, err } -func (api *BaseAPI) chainConfigWithGenesis(tx kv.Tx) (*params.ChainConfig, *types.Block, error) { - if api._chainConfig != nil { - return api._chainConfig, api._genesis, nil +func (api *BaseAPI) txnLookup(ctx context.Context, tx kv.Tx, txnHash common.Hash) (uint64, bool, error) { + return api._txnReader.TxnLookup(ctx, tx, txnHash) +} + +func (api *BaseAPI) blockByNumberWithSenders(tx kv.Tx, number uint64) (*types.Block, error) { + hash, hashErr := rawdb.ReadCanonicalHash(tx, number) + if hashErr != nil { + return nil, hashErr + } + return api.blockWithSenders(tx, hash, number) +} +func (api *BaseAPI) blockByHashWithSenders(tx kv.Tx, hash common.Hash) (*types.Block, error) { + if api.blocksLRU != nil { + if it, ok := api.blocksLRU.Get(hash); ok && it != nil { + return it.(*types.Block), nil + } } + number := rawdb.ReadHeaderNumber(tx, hash) + if number == nil { + return nil, nil + } + return api.blockWithSenders(tx, hash, *number) +} +func (api *BaseAPI) blockWithSenders(tx kv.Tx, hash common.Hash, number uint64) (*types.Block, error) { + if api.blocksLRU != nil { + if it, ok := api.blocksLRU.Get(hash); ok && it != nil { + return it.(*types.Block), nil + } + } + block, _, err := api._blockReader.BlockWithSenders(context.Background(), tx, hash, number) + if err != nil { + return nil, err + } + if block == nil { // don't save nil's to cache + return nil, nil + } + // don't save empty blocks to cache, because in Erigon + // if block become non-canonical - we remove it's transactions, but block can become canonical in future + if block.Transactions().Len() == 0 { + return block, nil + } + if api.blocksLRU != nil { + // calc fields before put to cache + for _, txn := range block.Transactions() { + txn.Hash() + } + block.Hash() + api.blocksLRU.Add(hash, block) + } + return block, nil +} + +func (api *BaseAPI) chainConfigWithGenesis(tx kv.Tx) (*params.ChainConfig, *types.Block, error) { + api._genesisLock.RLock() + cc, genesisBlock := api._chainConfig, api._genesis + api._genesisLock.RUnlock() + if cc != nil { + return cc, genesisBlock, nil + } genesisBlock, err := rawdb.ReadBlockByNumber(tx, 0) if err != nil { return nil, nil, err } - cc, err := rawdb.ReadChainConfig(tx, genesisBlock.Hash()) + cc, err = rawdb.ReadChainConfig(tx, genesisBlock.Hash()) if err != nil { return nil, nil, err } if cc != nil && genesisBlock != nil { - api._genesisSetOnce.Do(func() { - api._genesis = genesisBlock - api._chainConfig = cc - }) + api._genesisLock.Lock() + api._genesis = genesisBlock + api._chainConfig = cc + api._genesisLock.Unlock() } return cc, genesisBlock, nil } @@ -144,7 +213,7 @@ func (api *BaseAPI) pendingBlock() *types.Block { return api.filters.LastPendingBlock() } -func (api *BaseAPI) getBlockByNumber(number rpc.BlockNumber, tx kv.Tx) (*types.Block, error) { +func (api *BaseAPI) blockByRPCNumber(number rpc.BlockNumber, tx kv.Tx) (*types.Block, error) { if number == rpc.PendingBlockNumber { return api.pendingBlock(), nil } @@ -154,14 +223,14 @@ func (api *BaseAPI) getBlockByNumber(number rpc.BlockNumber, tx kv.Tx) (*types.B return nil, err } - block, _, err := rawdb.ReadBlockByNumberWithSenders(tx, n) + block, err := api.blockByNumberWithSenders(tx, n) return block, err } // APIImpl is implementation of the EthAPI interface based on remote Db access type APIImpl struct { *BaseAPI - ethBackend services.ApiBackend + ethBackend rpcinterfaces.ApiBackend txPool txpool.TxpoolClient mining txpool.MiningClient db kv.RoDB @@ -169,7 +238,7 @@ type APIImpl struct { } // NewEthAPI returns APIImpl instance -func NewEthAPI(base *BaseAPI, db kv.RoDB, eth services.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, gascap uint64) *APIImpl { +func NewEthAPI(base *BaseAPI, db kv.RoDB, eth rpcinterfaces.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, gascap uint64) *APIImpl { if gascap == 0 { gascap = uint64(math.MaxUint64 / 2) } diff --git a/cmd/rpcdaemon/commands/eth_api_test.go b/cmd/rpcdaemon/commands/eth_api_test.go index 92d3312636f..cc940c43e66 100644 --- a/cmd/rpcdaemon/commands/eth_api_test.go +++ b/cmd/rpcdaemon/commands/eth_api_test.go @@ -2,15 +2,24 @@ package commands import ( "context" + "fmt" "testing" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/internal/ethapi" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/stretchr/testify/assert" + + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/common" ) func TestGetTransactionReceipt(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewEthAPI(NewBaseApi(nil), db, nil, nil, nil, 5000000) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) // Call GetTransactionReceipt for transaction which is not in the database if _, err := api.GetTransactionReceipt(context.Background(), common.Hash{}); err != nil { t.Errorf("calling GetTransactionReceipt with empty hash: %v", err) @@ -19,9 +28,192 @@ func TestGetTransactionReceipt(t *testing.T) { func TestGetTransactionReceiptUnprotected(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewEthAPI(NewBaseApi(nil), db, nil, nil, nil, 5000000) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) // Call GetTransactionReceipt for un-protected transaction if _, err := api.GetTransactionReceipt(context.Background(), common.HexToHash("0x3f3cb8a0e13ed2481f97f53f7095b9cbc78b6ffb779f2d3e565146371a8830ea")); err != nil { t.Errorf("calling GetTransactionReceipt for unprotected tx: %v", err) } } + +// EIP-1898 test cases + +func TestGetStorageAt_ByBlockNumber_WithRequireCanonicalDefault(t *testing.T) { + assert := assert.New(t) + db := rpcdaemontest.CreateTestKV(t) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithNumber(0)) + if err != nil { + t.Errorf("calling GetStorageAt: %v", err) + } + + assert.Equal(common.HexToHash("0x0").String(), result) +} + +func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault(t *testing.T) { + assert := assert.New(t) + m, _, _ := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(m.Genesis.Hash(), false)) + if err != nil { + t.Errorf("calling GetStorageAt: %v", err) + } + + assert.Equal(common.HexToHash("0x0").String(), result) +} + +func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue(t *testing.T) { + assert := assert.New(t) + m, _, _ := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(m.Genesis.Hash(), true)) + if err != nil { + t.Errorf("calling GetStorageAt: %v", err) + } + + assert.Equal(common.HexToHash("0x0").String(), result) +} + +func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault_BlockNotFoundError(t *testing.T) { + m, _, _ := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + offChain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, block *core.BlockGen) { + }, true) + if err != nil { + t.Fatal(err) + } + offChainBlock := offChain.Blocks[0] + + if _, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(offChainBlock.Hash(), false)); err != nil { + if fmt.Sprintf("%v", err) != fmt.Sprintf("block %s not found", offChainBlock.Hash().String()[2:]) { + t.Errorf("wrong error: %v", err) + } + } else { + t.Error("error expected") + } +} + +func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue_BlockNotFoundError(t *testing.T) { + m, _, _ := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + offChain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, block *core.BlockGen) { + }, true) + if err != nil { + t.Fatal(err) + } + offChainBlock := offChain.Blocks[0] + + if _, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(offChainBlock.Hash(), true)); err != nil { + if fmt.Sprintf("%v", err) != fmt.Sprintf("block %s not found", offChainBlock.Hash().String()[2:]) { + t.Errorf("wrong error: %v", err) + } + } else { + t.Error("error expected") + } +} + +func TestGetStorageAt_ByBlockHash_WithRequireCanonicalDefault_NonCanonicalBlock(t *testing.T) { + assert := assert.New(t) + m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + orphanedBlock := orphanedChain[0].Blocks[0] + + result, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(orphanedBlock.Hash(), false)) + if err != nil { + if fmt.Sprintf("%v", err) != fmt.Sprintf("hash %s is not currently canonical", orphanedBlock.Hash().String()[2:]) { + t.Errorf("wrong error: %v", err) + } + } else { + t.Error("error expected") + } + + assert.Equal(common.HexToHash("0x0").String(), result) +} + +func TestGetStorageAt_ByBlockHash_WithRequireCanonicalTrue_NonCanonicalBlock(t *testing.T) { + m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + addr := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + + orphanedBlock := orphanedChain[0].Blocks[0] + + if _, err := api.GetStorageAt(context.Background(), addr, "0x0", rpc.BlockNumberOrHashWithHash(orphanedBlock.Hash(), true)); err != nil { + if fmt.Sprintf("%v", err) != fmt.Sprintf("hash %s is not currently canonical", orphanedBlock.Hash().String()[2:]) { + t.Errorf("wrong error: %v", err) + } + } else { + t.Error("error expected") + } +} + +func TestCall_ByBlockHash_WithRequireCanonicalDefault_NonCanonicalBlock(t *testing.T) { + m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + from := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + to := common.HexToAddress("0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e") + + orphanedBlock := orphanedChain[0].Blocks[0] + + if _, err := api.Call(context.Background(), ethapi.CallArgs{ + From: &from, + To: &to, + }, rpc.BlockNumberOrHashWithHash(orphanedBlock.Hash(), false), nil); err != nil { + if fmt.Sprintf("%v", err) != fmt.Sprintf("hash %s is not currently canonical", orphanedBlock.Hash().String()[2:]) { + /* Not sure. Here https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1898.md it is not explicitly said that + eth_call should only work with canonical blocks. + But since there is no point in changing the state of non-canonical block, it ignores RequireCanonical. */ + t.Errorf("wrong error: %v", err) + } + } else { + t.Error("error expected") + } +} + +func TestCall_ByBlockHash_WithRequireCanonicalTrue_NonCanonicalBlock(t *testing.T) { + m, _, orphanedChain := rpcdaemontest.CreateTestSentry(t) + db := m.DB + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) + from := common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") + to := common.HexToAddress("0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e") + + orphanedBlock := orphanedChain[0].Blocks[0] + + if _, err := api.Call(context.Background(), ethapi.CallArgs{ + From: &from, + To: &to, + }, rpc.BlockNumberOrHashWithHash(orphanedBlock.Hash(), true), nil); err != nil { + if fmt.Sprintf("%v", err) != fmt.Sprintf("hash %s is not currently canonical", orphanedBlock.Hash().String()[2:]) { + t.Errorf("wrong error: %v", err) + } + } else { + t.Error("error expected") + } +} diff --git a/cmd/rpcdaemon/commands/eth_block.go b/cmd/rpcdaemon/commands/eth_block.go index c126520956b..985f22256ff 100644 --- a/cmd/rpcdaemon/commands/eth_block.go +++ b/cmd/rpcdaemon/commands/eth_block.go @@ -14,6 +14,7 @@ import ( "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/turbo/adapter/ethapi" "github.com/ledgerwatch/erigon/turbo/rpchelper" @@ -41,25 +42,46 @@ func (api *APIImpl) CallBundle(ctx context.Context, txHashes []common.Hash, stat var txs types.Transactions for _, txHash := range txHashes { - txn, _, _, _, err := rawdb.ReadTransaction(tx, txHash) + blockNum, ok, err := api.txnLookup(ctx, tx, txHash) if err != nil { return nil, err } + if !ok { + return nil, nil + } + block, err := api.blockByNumberWithSenders(tx, blockNum) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil + } + var txn types.Transaction + for _, transaction := range block.Transactions() { + if transaction.Hash() == txHash { + txn = transaction + break + } + } if txn == nil { return nil, nil // not error, see https://github.com/ledgerwatch/turbo-geth/issues/1645 } txs = append(txs, txn) } - defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) + defer func(start time.Time) { log.Trace("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) - stateBlockNumber, hash, err := rpchelper.GetBlockNumber(stateBlockNumberOrHash, tx, api.filters) + stateBlockNumber, hash, latest, err := rpchelper.GetBlockNumber(stateBlockNumberOrHash, tx, api.filters) if err != nil { return nil, err } var stateReader state.StateReader - if num, ok := stateBlockNumberOrHash.Number(); ok && num == rpc.LatestBlockNumber { - stateReader = state.NewPlainStateReader(tx) + if latest { + cacheView, err := api.stateCache.View(ctx, tx) + if err != nil { + return nil, err + } + stateReader = state.NewCachedReader2(cacheView, tx) } else { stateReader = state.NewPlainState(tx, stateBlockNumber) } @@ -86,12 +108,18 @@ func (api *APIImpl) CallBundle(ctx context.Context, txHashes []common.Hash, stat // Get a new instance of the EVM signer := types.MakeSigner(chainConfig, blockNumber) - firstMsg, err := txs[0].AsMessage(*signer, nil) + rules := chainConfig.Rules(blockNumber) + firstMsg, err := txs[0].AsMessage(*signer, nil, rules) if err != nil { return nil, err } - blockCtx, txCtx := transactions.GetEvmContext(firstMsg, header, stateBlockNumberOrHash.RequireCanonical, tx) + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + + blockCtx, txCtx := transactions.GetEvmContext(firstMsg, header, stateBlockNumberOrHash.RequireCanonical, tx, contractHasTEVM) evm := vm.NewEVM(blockCtx, txCtx, st, chainConfig, vm.Config{Debug: false}) timeoutMilliSeconds := int64(5000) @@ -126,7 +154,7 @@ func (api *APIImpl) CallBundle(ctx context.Context, txHashes []common.Hash, stat bundleHash := sha3.NewLegacyKeccak256() for _, txn := range txs { - msg, err := txn.AsMessage(*signer, nil) + msg, err := txn.AsMessage(*signer, nil, rules) if err != nil { return nil, err } @@ -168,7 +196,7 @@ func (api *APIImpl) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber return nil, err } defer tx.Rollback() - b, err := api.getBlockByNumber(number, tx) + b, err := api.blockByRPCNumber(number, tx) if err != nil { return nil, err } @@ -176,7 +204,6 @@ func (api *APIImpl) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber return nil, nil } additionalFields := make(map[string]interface{}) - td, err := rawdb.ReadTd(tx, b.Hash(), b.NumberU64()) if err != nil { return nil, err @@ -214,7 +241,7 @@ func (api *APIImpl) GetBlockByHash(ctx context.Context, numberOrHash rpc.BlockNu additionalFields := make(map[string]interface{}) - block, err := rawdb.ReadBlockByHash(tx, hash) + block, err := api.blockByHashWithSenders(tx, hash) if err != nil { return nil, err } @@ -247,7 +274,7 @@ func (api *APIImpl) GetBlockTransactionCountByNumber(ctx context.Context, blockN } defer tx.Rollback() if blockNr == rpc.PendingBlockNumber { - b, err := api.getBlockByNumber(blockNr, tx) + b, err := api.blockByRPCNumber(blockNr, tx) if err != nil { return nil, err } @@ -284,7 +311,7 @@ func (api *APIImpl) GetBlockTransactionCountByHash(ctx context.Context, blockHas if num == nil { return nil, nil } - body, _, txAmount := rawdb.ReadBodyWithoutTransactions(tx, blockHash, *num) + body, _, txAmount := rawdb.ReadBody(tx, blockHash, *num) if body == nil { return nil, nil } diff --git a/cmd/rpcdaemon/commands/eth_call.go b/cmd/rpcdaemon/commands/eth_call.go index 03e9608dbb6..ce09c837479 100644 --- a/cmd/rpcdaemon/commands/eth_call.go +++ b/cmd/rpcdaemon/commands/eth_call.go @@ -6,6 +6,9 @@ import ( "fmt" "math/big" + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + txpool_proto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" @@ -14,15 +17,20 @@ import ( "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/eth/tracers/logger" + "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/rpchelper" "github.com/ledgerwatch/erigon/turbo/transactions" "github.com/ledgerwatch/log/v3" + "google.golang.org/grpc" ) // Call implements eth_call. Executes a new message call immediately without creating a transaction on the block chain. -func (api *APIImpl) Call(ctx context.Context, args ethapi.CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *map[common.Address]ethapi.Account) (hexutil.Bytes, error) { +func (api *APIImpl) Call(ctx context.Context, args ethapi.CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *ethapi.StateOverrides) (hexutil.Bytes, error) { tx, err := api.db.BeginRo(ctx) if err != nil { return nil, err @@ -38,7 +46,24 @@ func (api *APIImpl) Call(ctx context.Context, args ethapi.CallArgs, blockNrOrHas args.Gas = (*hexutil.Uint64)(&api.GasCap) } - result, err := transactions.DoCall(ctx, args, tx, blockNrOrHash, overrides, api.GasCap, chainConfig, api.filters) + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + + blockNumber, hash, _, err := rpchelper.GetCanonicalBlockNumber(blockNrOrHash, tx, api.filters) // DoCall cannot be executed on non-canonical blocks + if err != nil { + return nil, err + } + block, err := api.BaseAPI.blockWithSenders(tx, hash, blockNumber) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil + } + + result, err := transactions.DoCall(ctx, args, tx, blockNrOrHash, block, overrides, api.GasCap, chainConfig, api.filters, api.stateCache, contractHasTEVM) if err != nil { return nil, err } @@ -88,7 +113,13 @@ func HeaderByNumberOrHash(ctx context.Context, tx kv.Tx, blockNrOrHash rpc.Block } // EstimateGas implements eth_estimateGas. Returns an estimate of how much gas is necessary to allow the transaction to complete. The transaction will not be added to the blockchain. -func (api *APIImpl) EstimateGas(ctx context.Context, args ethapi.CallArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) { +func (api *APIImpl) EstimateGas(ctx context.Context, argsOrNil *ethapi.CallArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) { + var args ethapi.CallArgs + // if we actually get CallArgs here, we use them + if argsOrNil != nil { + args = *argsOrNil + } + bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) if blockNrOrHash != nil { bNrOrHash = *blockNrOrHash @@ -123,9 +154,23 @@ func (api *APIImpl) EstimateGas(ctx context.Context, args ethapi.CallArgs, block hi = h.GasLimit } + var feeCap *big.Int + if args.GasPrice != nil && (args.MaxFeePerGas != nil || args.MaxPriorityFeePerGas != nil) { + return 0, errors.New("both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified") + } else if args.GasPrice != nil { + feeCap = args.GasPrice.ToInt() + } else if args.MaxFeePerGas != nil { + feeCap = args.MaxFeePerGas.ToInt() + } else { + feeCap = common.Big0 + } // Recap the highest gas limit with account's available balance. - if args.GasPrice != nil && args.GasPrice.ToInt().Uint64() != 0 { - stateReader := state.NewPlainStateReader(dbtx) + if feeCap.Sign() != 0 { + cacheView, err := api.stateCache.View(ctx, dbtx) + if err != nil { + return 0, err + } + stateReader := state.NewCachedReader2(cacheView, dbtx) state := state.New(stateReader) if state == nil { return 0, fmt.Errorf("can't get the current state") @@ -139,17 +184,20 @@ func (api *APIImpl) EstimateGas(ctx context.Context, args ethapi.CallArgs, block } available.Sub(available, args.Value.ToInt()) } - allowance := new(big.Int).Div(available, args.GasPrice.ToInt()) - if hi > allowance.Uint64() { + allowance := new(big.Int).Div(available, feeCap) + + // If the allowance is larger than maximum uint64, skip checking + if allowance.IsUint64() && hi > allowance.Uint64() { transfer := args.Value if transfer == nil { transfer = new(hexutil.Big) } log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance, - "sent", transfer.ToInt(), "gasprice", args.GasPrice.ToInt(), "fundable", allowance) + "sent", transfer.ToInt(), "maxFeePerGas", feeCap, "fundable", allowance) hi = allowance.Uint64() } } + // Recap the highest gas allowance with specified gascap. if hi > api.GasCap { log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", api.GasCap) @@ -163,11 +211,30 @@ func (api *APIImpl) EstimateGas(ctx context.Context, args ethapi.CallArgs, block return 0, err } + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(dbtx) + } + // Create a helper to check if a gas allowance results in an executable transaction executable := func(gas uint64) (bool, *core.ExecutionResult, error) { args.Gas = (*hexutil.Uint64)(&gas) - result, err := transactions.DoCall(ctx, args, dbtx, rpc.BlockNumberOrHash{BlockNumber: &lastBlockNum}, nil, api.GasCap, chainConfig, api.filters) + numOrHash := rpc.BlockNumberOrHash{BlockNumber: &lastBlockNum} + blockNumber, hash, _, err := rpchelper.GetCanonicalBlockNumber(numOrHash, dbtx, api.filters) // DoCall cannot be executed on non-canonical blocks + if err != nil { + return false, nil, err + } + block, err := api.BaseAPI.blockWithSenders(dbtx, hash, blockNumber) + if err != nil { + return false, nil, err + } + if block == nil { + return false, nil, nil + } + + result, err := transactions.DoCall(ctx, args, dbtx, numOrHash, block, nil, + api.GasCap, chainConfig, api.filters, api.stateCache, contractHasTEVM) if err != nil { if errors.Is(err, core.ErrIntrinsicGas) { // Special case, raise gas limit @@ -221,3 +288,166 @@ func (api *APIImpl) GetProof(ctx context.Context, address common.Address, storag var stub interface{} return &stub, fmt.Errorf(NotImplemented, "eth_getProof") } + +// accessListResult returns an optional accesslist +// Its the result of the `eth_createAccessList` RPC call. +// It contains an error if the transaction itself failed. +type accessListResult struct { + Accesslist *types.AccessList `json:"accessList"` + Error string `json:"error,omitempty"` + GasUsed hexutil.Uint64 `json:"gasUsed"` +} + +// CreateAccessList implements eth_createAccessList. It creates an access list for the given transaction. +// If the accesslist creation fails an error is returned. +// If the transaction itself fails, an vmErr is returned. +func (api *APIImpl) CreateAccessList(ctx context.Context, args ethapi.CallArgs, blockNrOrHash *rpc.BlockNumberOrHash, optimizeGas *bool) (*accessListResult, error) { + bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + if blockNrOrHash != nil { + bNrOrHash = *blockNrOrHash + } + + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + chainConfig, err := api.chainConfig(tx) + if err != nil { + return nil, err + } + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + blockNumber, hash, latest, err := rpchelper.GetCanonicalBlockNumber(bNrOrHash, tx, api.filters) // DoCall cannot be executed on non-canonical blocks + if err != nil { + return nil, err + } + block, err := api.BaseAPI.blockWithSenders(tx, hash, blockNumber) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil + } + var stateReader state.StateReader + if latest { + cacheView, err := api.stateCache.View(ctx, tx) + if err != nil { + return nil, err + } + stateReader = state.NewCachedReader2(cacheView, tx) + } else { + stateReader = state.NewPlainState(tx, blockNumber) + } + + header := block.Header() + // If the gas amount is not set, extract this as it will depend on access + // lists and we'll need to reestimate every time + nogas := args.Gas == nil + + var to common.Address + if args.To != nil { + to = *args.To + } else { + // Require nonce to calculate address of created contract + if args.Nonce == nil { + var nonce uint64 + reply, err := api.txPool.Nonce(ctx, &txpool_proto.NonceRequest{ + Address: gointerfaces.ConvertAddressToH160(*args.From), + }, &grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + if reply.Found { + nonce = reply.Nonce + 1 + } + args.Nonce = (*hexutil.Uint64)(&nonce) + } + to = crypto.CreateAddress(*args.From, uint64(*args.Nonce)) + } + + // Retrieve the precompiles since they don't need to be added to the access list + precompiles := vm.ActivePrecompiles(chainConfig.Rules(blockNumber)) + + // Create an initial tracer + prevTracer := logger.NewAccessListTracer(nil, *args.From, to, precompiles) + if args.AccessList != nil { + prevTracer = logger.NewAccessListTracer(*args.AccessList, *args.From, to, precompiles) + } + for { + state := state.New(stateReader) + // Retrieve the current access list to expand + accessList := prevTracer.AccessList() + log.Trace("Creating access list", "input", accessList) + + // If no gas amount was specified, each unique access list needs it's own + // gas calculation. This is quite expensive, but we need to be accurate + // and it's convered by the sender only anyway. + if nogas { + args.Gas = nil + } + // Set the accesslist to the last al + args.AccessList = &accessList + baseFee, _ := uint256.FromBig(header.BaseFee) + msg, err := args.ToMessage(api.GasCap, baseFee) + if err != nil { + return nil, err + } + + // Apply the transaction with the access list tracer + tracer := logger.NewAccessListTracer(accessList, *args.From, to, precompiles) + config := vm.Config{Tracer: tracer, Debug: true, NoBaseFee: true} + blockCtx, txCtx := transactions.GetEvmContext(msg, header, bNrOrHash.RequireCanonical, tx, contractHasTEVM) + + evm := vm.NewEVM(blockCtx, txCtx, state, chainConfig, config) + gp := new(core.GasPool).AddGas(msg.Gas()) + res, err := core.ApplyMessage(evm, msg, gp, true /* refunds */, false /* gasBailout */) + if err != nil { + return nil, err + } + if tracer.Equal(prevTracer) { + var errString string + if res.Err != nil { + errString = res.Err.Error() + } + accessList := &accessListResult{Accesslist: &accessList, Error: errString, GasUsed: hexutil.Uint64(res.UsedGas)} + if optimizeGas != nil && *optimizeGas { + optimizeToInAccessList(accessList, to) + } + return accessList, nil + } + prevTracer = tracer + } +} + +// to address is warm already, so we can save by adding it to the access list +// only if we are adding a lot of its storage slots as well +func optimizeToInAccessList(accessList *accessListResult, to common.Address) { + indexToRemove := -1 + + for i := 0; i < len(*accessList.Accesslist); i++ { + entry := (*accessList.Accesslist)[i] + if entry.Address != to { + continue + } + + // https://eips.ethereum.org/EIPS/eip-2930#charging-less-for-accesses-in-the-access-list + accessListSavingPerSlot := params.ColdSloadCostEIP2929 - params.WarmStorageReadCostEIP2929 - params.TxAccessListStorageKeyGas + + numSlots := uint64(len(entry.StorageKeys)) + if numSlots*accessListSavingPerSlot <= params.TxAccessListAddressGas { + indexToRemove = i + } + } + + if indexToRemove >= 0 { + *accessList.Accesslist = removeIndex(*accessList.Accesslist, indexToRemove) + } +} + +func removeIndex(s types.AccessList, index int) types.AccessList { + return append(s[:index], s[index+1:]...) +} diff --git a/cmd/rpcdaemon/commands/eth_call_test.go b/cmd/rpcdaemon/commands/eth_call_test.go index d276172f0ac..b3ee394e82d 100644 --- a/cmd/rpcdaemon/commands/eth_call_test.go +++ b/cmd/rpcdaemon/commands/eth_call_test.go @@ -5,18 +5,22 @@ import ( "fmt" "testing" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" ) func TestEstimateGas(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewEthAPI(NewBaseApi(nil), db, nil, nil, nil, 5000000) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) var from = common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") var to = common.HexToAddress("0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e") - if _, err := api.EstimateGas(context.Background(), ethapi.CallArgs{ + if _, err := api.EstimateGas(context.Background(), ðapi.CallArgs{ From: &from, To: &to, }, nil); err != nil { @@ -26,7 +30,8 @@ func TestEstimateGas(t *testing.T) { func TestEthCallNonCanonical(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewEthAPI(NewBaseApi(nil), db, nil, nil, nil, 5000000) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil, nil, nil, 5000000) var from = common.HexToAddress("0x71562b71999873db5b286df957af199ec94617f7") var to = common.HexToAddress("0x0d3ab14bbad3d99f4203bd7a11acb94882050e7e") if _, err := api.Call(context.Background(), ethapi.CallArgs{ @@ -38,3 +43,209 @@ func TestEthCallNonCanonical(t *testing.T) { } } } + +func TestGetBlockByTimestampLatestTime(t *testing.T) { + ctx := context.Background() + db := rpcdaemontest.CreateTestKV(t) + + tx, err := db.BeginRo(ctx) + if err != nil { + t.Errorf("fail at beginning tx") + } + defer tx.Rollback() + + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewErigonAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil) + + latestBlock := rawdb.ReadCurrentBlock(tx) + response, err := ethapi.RPCMarshalBlock(latestBlock, true, false) + + if err != nil { + t.Error("couldn't get the rpc marshal block") + } + + if err == nil && rpc.BlockNumber(latestBlock.NumberU64()) == rpc.PendingBlockNumber { + // Pending blocks need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + + block, err := api.GetBlockByTimestamp(ctx, rpc.Timestamp(latestBlock.Header().Time), false) + if err != nil { + t.Errorf("couldn't retrieve block %v", err) + } + + if block["timestamp"] != response["timestamp"] || block["hash"] != response["hash"] { + t.Errorf("Retrieved the wrong block.\nexpected block hash: %s expected timestamp: %d\nblock hash retrieved: %s timestamp retrieved: %d", response["hash"], response["timestamp"], block["hash"], block["timestamp"]) + } +} + +func TestGetBlockByTimestampOldestTime(t *testing.T) { + ctx := context.Background() + db := rpcdaemontest.CreateTestKV(t) + + tx, err := db.BeginRo(ctx) + if err != nil { + t.Errorf("failed at beginning tx") + } + defer tx.Rollback() + + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewErigonAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil) + + oldestBlock, err := rawdb.ReadBlockByNumber(tx, 0) + if err != nil { + t.Error("couldn't retrieve oldest block") + } + + response, err := ethapi.RPCMarshalBlock(oldestBlock, true, false) + + if err != nil { + t.Error("couldn't get the rpc marshal block") + } + + if err == nil && rpc.BlockNumber(oldestBlock.NumberU64()) == rpc.PendingBlockNumber { + // Pending blocks need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + + block, err := api.GetBlockByTimestamp(ctx, rpc.Timestamp(oldestBlock.Header().Time), false) + if err != nil { + t.Errorf("couldn't retrieve block %v", err) + } + + if block["timestamp"] != response["timestamp"] || block["hash"] != response["hash"] { + t.Errorf("Retrieved the wrong block.\nexpected block hash: %s expected timestamp: %d\nblock hash retrieved: %s timestamp retrieved: %d", response["hash"], response["timestamp"], block["hash"], block["timestamp"]) + } +} + +func TestGetBlockByTimeHigherThanLatestBlock(t *testing.T) { + ctx := context.Background() + db := rpcdaemontest.CreateTestKV(t) + + tx, err := db.BeginRo(ctx) + if err != nil { + t.Errorf("fail at beginning tx") + } + defer tx.Rollback() + + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewErigonAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil) + + latestBlock := rawdb.ReadCurrentBlock(tx) + + response, err := ethapi.RPCMarshalBlock(latestBlock, true, false) + + if err != nil { + t.Error("couldn't get the rpc marshal block") + } + + if err == nil && rpc.BlockNumber(latestBlock.NumberU64()) == rpc.PendingBlockNumber { + // Pending blocks need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + + block, err := api.GetBlockByTimestamp(ctx, rpc.Timestamp(latestBlock.Header().Time+999999999999), false) + if err != nil { + t.Errorf("couldn't retrieve block %v", err) + } + + if block["timestamp"] != response["timestamp"] || block["hash"] != response["hash"] { + t.Errorf("Retrieved the wrong block.\nexpected block hash: %s expected timestamp: %d\nblock hash retrieved: %s timestamp retrieved: %d", response["hash"], response["timestamp"], block["hash"], block["timestamp"]) + } +} + +func TestGetBlockByTimeMiddle(t *testing.T) { + ctx := context.Background() + db := rpcdaemontest.CreateTestKV(t) + + tx, err := db.BeginRo(ctx) + if err != nil { + t.Errorf("fail at beginning tx") + } + defer tx.Rollback() + + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewErigonAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil) + + currentHeader := rawdb.ReadCurrentHeader(tx) + oldestHeader := rawdb.ReadHeaderByNumber(tx, 0) + + middleNumber := (currentHeader.Number.Uint64() + oldestHeader.Number.Uint64()) / 2 + middleBlock, err := rawdb.ReadBlockByNumber(tx, middleNumber) + if err != nil { + t.Error("couldn't retrieve middle block") + } + + response, err := ethapi.RPCMarshalBlock(middleBlock, true, false) + + if err != nil { + t.Error("couldn't get the rpc marshal block") + } + + if err == nil && rpc.BlockNumber(middleBlock.NumberU64()) == rpc.PendingBlockNumber { + // Pending blocks need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + + block, err := api.GetBlockByTimestamp(ctx, rpc.Timestamp(middleBlock.Header().Time), false) + if err != nil { + t.Errorf("couldn't retrieve block %v", err) + } + + if block["timestamp"] != response["timestamp"] || block["hash"] != response["hash"] { + t.Errorf("Retrieved the wrong block.\nexpected block hash: %s expected timestamp: %d\nblock hash retrieved: %s timestamp retrieved: %d", response["hash"], response["timestamp"], block["hash"], block["timestamp"]) + } +} + +func TestGetBlockByTimestamp(t *testing.T) { + ctx := context.Background() + db := rpcdaemontest.CreateTestKV(t) + + tx, err := db.BeginRo(ctx) + if err != nil { + t.Errorf("fail at beginning tx") + } + defer tx.Rollback() + + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewErigonAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, nil) + + highestBlockNumber := rawdb.ReadCurrentHeader(tx).Number + pickedBlock, err := rawdb.ReadBlockByNumber(tx, highestBlockNumber.Uint64()/3) + if err != nil { + t.Errorf("couldn't get block %v", pickedBlock.Number()) + } + + if pickedBlock == nil { + t.Error("couldn't retrieve picked block") + } + response, err := ethapi.RPCMarshalBlock(pickedBlock, true, false) + + if err != nil { + t.Error("couldn't get the rpc marshal block") + } + + if err == nil && rpc.BlockNumber(pickedBlock.NumberU64()) == rpc.PendingBlockNumber { + // Pending blocks need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + + block, err := api.GetBlockByTimestamp(ctx, rpc.Timestamp(pickedBlock.Header().Time), false) + if err != nil { + t.Errorf("couldn't retrieve block %v", err) + } + + if block["timestamp"] != response["timestamp"] || block["hash"] != response["hash"] { + t.Errorf("Retrieved the wrong block.\nexpected block hash: %s expected timestamp: %d\nblock hash retrieved: %s timestamp retrieved: %d", response["hash"], response["timestamp"], block["hash"], block["timestamp"]) + } +} diff --git a/cmd/rpcdaemon/commands/eth_deprecated.go b/cmd/rpcdaemon/commands/eth_deprecated.go index 76e34c74491..46d918f641f 100644 --- a/cmd/rpcdaemon/commands/eth_deprecated.go +++ b/cmd/rpcdaemon/commands/eth_deprecated.go @@ -8,30 +8,6 @@ import ( "github.com/ledgerwatch/erigon/common/hexutil" ) -// GetCompilers implements eth_getCompilers. Returns a list of available compilers in the client. -// Deprecated: This function will be removed in the future. -func (api *APIImpl) GetCompilers(_ context.Context) ([]string, error) { - return []string{}, fmt.Errorf(NotAvailableDeprecated, "eth_getCompilers") -} - -// CompileLLL implements eth_compileLLL. Returns compiled LLL code. -// Deprecated: This function will be removed in the future. -func (api *APIImpl) CompileLLL(_ context.Context, _ string) (hexutil.Bytes, error) { - return hexutil.Bytes(""), fmt.Errorf(NotAvailableDeprecated, "eth_compileLLL") -} - -// CompileSolidity implements eth_compileSolidity. Returns compiled solidity code. -// Deprecated: This function will be removed in the future. -func (api *APIImpl) CompileSolidity(ctx context.Context, _ string) (hexutil.Bytes, error) { - return hexutil.Bytes(""), fmt.Errorf(NotAvailableDeprecated, "eth_compileSolidity") -} - -// CompileSerpent implements eth_compileSerpent. Returns compiled serpent code. -// Deprecated: This function will be removed in the future. -func (api *APIImpl) CompileSerpent(ctx context.Context, _ string) (hexutil.Bytes, error) { - return hexutil.Bytes(""), fmt.Errorf(NotAvailableDeprecated, "eth_compileSerpent") -} - // Accounts implements eth_accounts. Returns a list of addresses owned by the client. // Deprecated: This function will be removed in the future. func (api *APIImpl) Accounts(ctx context.Context) ([]common.Address, error) { diff --git a/cmd/rpcdaemon/commands/eth_filters.go b/cmd/rpcdaemon/commands/eth_filters.go index 306c86a42d8..596d0ee7ed8 100644 --- a/cmd/rpcdaemon/commands/eth_filters.go +++ b/cmd/rpcdaemon/commands/eth_filters.go @@ -4,41 +4,147 @@ import ( "context" "fmt" + filters2 "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/filters" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/log/v3" ) // NewPendingTransactionFilter new transaction filter -func (api *APIImpl) NewPendingTransactionFilter(ctx context.Context) (hexutil.Uint64, error) { - return 0, fmt.Errorf(NotImplemented, "eth_newPendingTransactionFilter") +func (api *APIImpl) NewPendingTransactionFilter(_ context.Context) (common.Hash, error) { + if api.filters == nil { + return common.Hash{}, rpc.ErrNotificationsUnsupported + } + txsCh := make(chan []types.Transaction, 1) + id := api.filters.SubscribePendingTxs(txsCh) + go func() { + for { + select { + case txs, ok := <-txsCh: + if !ok { + return + } + api.filters.AddPendingTxs(id, txs) + default: + } + } + }() + return common.HexToHash(string(id)), nil } -// NewBlockFilter new transaction filter -func (api *APIImpl) NewBlockFilter(_ context.Context) (hexutil.Uint64, error) { - return 0, fmt.Errorf(NotImplemented, "eth_newBlockFilter") +// NewBlockFilter implements eth_newBlockFilter. Creates a filter in the node, to notify when a new block arrives. +func (api *APIImpl) NewBlockFilter(_ context.Context) (common.Hash, error) { + if api.filters == nil { + return common.Hash{}, rpc.ErrNotificationsUnsupported + } + ch := make(chan *types.Block, 1) + id := api.filters.SubscribePendingBlock(ch) + go func() { + for { + select { + case block, ok := <-ch: + if !ok { + return + } + api.filters.AddPendingBlock(id, block) + default: + } + } + }() + return common.HexToHash(string(id)), nil } // NewFilter implements eth_newFilter. Creates an arbitrary filter object, based on filter options, to notify when the state changes (logs). -func (api *APIImpl) NewFilter(_ context.Context, filter interface{}) (hexutil.Uint64, error) { - return 0, fmt.Errorf(NotImplemented, "eth_newFilter") +func (api *APIImpl) NewFilter(_ context.Context, crit filters.FilterCriteria) (common.Hash, error) { + if api.filters == nil { + return common.Hash{}, rpc.ErrNotificationsUnsupported + } + logs := make(chan *types.Log, 1) + id := api.filters.SubscribeLogs(logs, crit) + go func() { + for { + select { + case lg, ok := <-logs: + if !ok { + return + } + api.filters.AddLogs(id, lg) + default: + } + } + }() + return common.HexToHash(hexutil.EncodeUint64(uint64(id))), nil } // UninstallFilter new transaction filter -func (api *APIImpl) UninstallFilter(_ context.Context, index hexutil.Uint64) (bool, error) { - return false, fmt.Errorf(NotImplemented, "eth_uninstallFilter") +func (api *APIImpl) UninstallFilter(_ context.Context, index string) (bool, error) { + if api.filters == nil { + return false, rpc.ErrNotificationsUnsupported + } + if common.IsHexAddress32(index) { + // remove 0x + if len(index) >= 2 && index[0] == '0' && (index[1] == 'x' || index[1] == 'X') { + index = index[2:] + } + isDeleted := api.filters.UnsubscribePendingBlock(filters2.PendingBlockSubID(index)) || + api.filters.UnsubscribePendingTxs(filters2.PendingTxsSubID(index)) + id, err := hexutil.DecodeUint64(index) + if err == nil { + return isDeleted || api.filters.UnsubscribeLogs(filters2.LogsSubID(id)), nil + } + } + + return false, nil } // GetFilterChanges implements eth_getFilterChanges. Polling method for a previously-created filter, which returns an array of logs which occurred since last poll. -func (api *APIImpl) GetFilterChanges(_ context.Context, index hexutil.Uint64) ([]interface{}, error) { - var stub []interface{} - return stub, fmt.Errorf(NotImplemented, "eth_getFilterChanges") +func (api *APIImpl) GetFilterChanges(_ context.Context, index string) ([]interface{}, error) { + if api.filters == nil { + return nil, rpc.ErrNotificationsUnsupported + } + stub := make([]interface{}, 0) + if common.IsHexAddress32(index) { + // remove 0x + if len(index) >= 2 && index[0] == '0' && (index[1] == 'x' || index[1] == 'X') { + index = index[2:] + } + if blocks, ok := api.filters.ReadPendingBlocks(filters2.PendingBlockSubID(index)); ok { + for _, v := range blocks { + stub = append(stub, v.Hash()) + } + return stub, nil + } + if txs, ok := api.filters.ReadPendingTxs(filters2.PendingTxsSubID(index)); ok { + for _, v := range txs { + for _, tx := range v { + stub = append(stub, tx.Hash()) + } + } + return stub, nil + } + id, err := hexutil.DecodeUint64(index) + if err != nil { + return stub, fmt.Errorf("eth_getFilterChanges, wrong index: %w", err) + } + if logs, ok := api.filters.ReadLogs(filters2.LogsSubID(id)); ok { + for _, v := range logs { + stub = append(stub, v) + } + return stub, nil + } + } + return stub, nil } // NewHeads send a notification each time a new (header) block is appended to the chain. func (api *APIImpl) NewHeads(ctx context.Context) (*rpc.Subscription, error) { + if api.filters == nil { + return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported + } notifier, supported := rpc.NotifierFromContext(ctx) if !supported { return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported @@ -71,6 +177,9 @@ func (api *APIImpl) NewHeads(ctx context.Context) (*rpc.Subscription, error) { // NewPendingTransactions send a notification each time a new (header) block is appended to the chain. func (api *APIImpl) NewPendingTransactions(ctx context.Context) (*rpc.Subscription, error) { + if api.filters == nil { + return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported + } notifier, supported := rpc.NotifierFromContext(ctx) if !supported { return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported @@ -81,7 +190,6 @@ func (api *APIImpl) NewPendingTransactions(ctx context.Context) (*rpc.Subscripti go func() { defer debug.LogPanic() txsCh := make(chan []types.Transaction, 1) - defer close(txsCh) id := api.filters.SubscribePendingTxs(txsCh) defer api.filters.UnsubscribePendingTxs(id) @@ -89,9 +197,11 @@ func (api *APIImpl) NewPendingTransactions(ctx context.Context) (*rpc.Subscripti select { case txs := <-txsCh: for _, t := range txs { - err := notifier.Notify(rpcSub.ID, t.Hash()) - if err != nil { - log.Warn("error while notifying subscription", "err", err) + if t != nil { + err := notifier.Notify(rpcSub.ID, t.Hash()) + if err != nil { + log.Warn("error while notifying subscription", "err", err) + } } } case <-rpcSub.Err(): @@ -102,3 +212,37 @@ func (api *APIImpl) NewPendingTransactions(ctx context.Context) (*rpc.Subscripti return rpcSub, nil } + +// Logs send a notification each time a new log appears. +func (api *APIImpl) Logs(ctx context.Context, crit filters.FilterCriteria) (*rpc.Subscription, error) { + if api.filters == nil { + return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported + } + notifier, supported := rpc.NotifierFromContext(ctx) + if !supported { + return &rpc.Subscription{}, rpc.ErrNotificationsUnsupported + } + + rpcSub := notifier.CreateSubscription() + + go func() { + defer debug.LogPanic() + logs := make(chan *types.Log, 1) + id := api.filters.SubscribeLogs(logs, crit) + defer api.filters.UnsubscribeLogs(id) + + for { + select { + case h := <-logs: + err := notifier.Notify(rpcSub.ID, h) + if err != nil { + log.Warn("error while notifying subscription", "err", err) + } + case <-rpcSub.Err(): + return + } + } + }() + + return rpcSub, nil +} diff --git a/cmd/rpcdaemon/commands/eth_ming_test.go b/cmd/rpcdaemon/commands/eth_ming_test.go index 4d8868491f2..bf6919d89b2 100644 --- a/cmd/rpcdaemon/commands/eth_ming_test.go +++ b/cmd/rpcdaemon/commands/eth_ming_test.go @@ -6,10 +6,12 @@ import ( "time" "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages" "github.com/stretchr/testify/require" ) @@ -17,23 +19,23 @@ import ( func TestPendingBlock(t *testing.T) { ctx, conn := rpcdaemontest.CreateTestGrpcConn(t, stages.Mock(t)) mining := txpool.NewMiningClient(conn) - ff := filters.New(ctx, nil, nil, mining) - api := NewEthAPI(NewBaseApi(ff), nil, nil, nil, mining, 5000000) + ff := rpcservices.New(ctx, nil, nil, mining, func() {}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewEthAPI(NewBaseApi(ff, stateCache, snapshotsync.NewBlockReader(), false), nil, nil, nil, mining, 5000000) expect := uint64(12345) b, err := rlp.EncodeToBytes(types.NewBlockWithHeader(&types.Header{Number: big.NewInt(int64(expect))})) require.NoError(t, err) ch := make(chan *types.Block, 1) - defer close(ch) id := ff.SubscribePendingBlock(ch) defer ff.UnsubscribePendingBlock(id) ff.HandlePendingBlock(&txpool.OnPendingBlockReply{RplBlock: b}) block := api.pendingBlock() - require.Equal(t, block.Number().Uint64(), expect) + require.Equal(t, block.NumberU64(), expect) select { case got := <-ch: - require.Equal(t, expect, got.Number().Uint64()) + require.Equal(t, expect, got.NumberU64()) case <-time.After(100 * time.Millisecond): t.Fatalf("timeout waiting for expected notification") } @@ -42,7 +44,7 @@ func TestPendingBlock(t *testing.T) { func TestPendingLogs(t *testing.T) { ctx, conn := rpcdaemontest.CreateTestGrpcConn(t, stages.Mock(t)) mining := txpool.NewMiningClient(conn) - ff := filters.New(ctx, nil, nil, mining) + ff := rpcservices.New(ctx, nil, nil, mining, func() {}) expect := []byte{211} ch := make(chan types.Logs, 1) diff --git a/cmd/rpcdaemon/commands/eth_receipts.go b/cmd/rpcdaemon/commands/eth_receipts.go index edfd25be0b7..988dd3389eb 100644 --- a/cmd/rpcdaemon/commands/eth_receipts.go +++ b/cmd/rpcdaemon/commands/eth_receipts.go @@ -9,6 +9,7 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/log/v3" "github.com/RoaringBitmap/roaring" "github.com/ledgerwatch/erigon/common" @@ -29,31 +30,40 @@ import ( "github.com/ledgerwatch/erigon/turbo/transactions" ) -func getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, block *types.Block, senders []common.Address) (types.Receipts, error) { +func (api *BaseAPI) getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, block *types.Block, senders []common.Address) (types.Receipts, error) { if cached := rawdb.ReadReceipts(tx, block, senders); cached != nil { return cached, nil } getHeader := func(hash common.Hash, number uint64) *types.Header { - return rawdb.ReadHeader(tx, hash, number) + h, e := api._blockReader.Header(ctx, tx, hash, number) + if e != nil { + log.Error("getHeader error", "number", number, "hash", hash, "err", e) + } + return h } - checkTEVM := ethdb.GetCheckTEVM(tx) - _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, checkTEVM, ethash.NewFaker(), tx, block.Hash(), 0) + contractHasTEVM := ethdb.GetHasTEVM(tx) + _, _, _, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, block.Hash(), 0) if err != nil { return nil, err } - var receipts types.Receipts + usedGas := new(uint64) gp := new(core.GasPool).AddGas(block.GasLimit()) - var usedGas = new(uint64) + + ethashFaker := ethash.NewFaker() + noopWriter := state.NewNoopWriter() + + receipts := make(types.Receipts, len(block.Transactions())) + for i, txn := range block.Transactions() { ibs.Prepare(txn.Hash(), block.Hash(), i) - receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, ethash.NewFaker(), nil, gp, ibs, state.NewNoopWriter(), block.Header(), txn, usedGas, vm.Config{}, checkTEVM) + receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, ethashFaker, nil, gp, ibs, noopWriter, block.Header(), txn, usedGas, vm.Config{}, contractHasTEVM) if err != nil { return nil, err } receipt.BlockHash = block.Hash() - receipts = append(receipts, receipt) + receipts[i] = receipt } return receipts, nil @@ -62,11 +72,11 @@ func getReceipts(ctx context.Context, tx kv.Tx, chainConfig *params.ChainConfig, // GetLogs implements eth_getLogs. Returns an array of logs matching a given filter object. func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([]*types.Log, error) { var begin, end uint64 - var logs []*types.Log //nolint:prealloc + logs := []*types.Log{} tx, beginErr := api.db.BeginRo(ctx) if beginErr != nil { - return returnLogs(logs), beginErr + return logs, beginErr } defer tx.Rollback() @@ -84,15 +94,26 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([ return nil, err } - begin = 0 - if crit.FromBlock != nil && crit.FromBlock.Sign() > 0 { - begin = crit.FromBlock.Uint64() + begin = latest + if crit.FromBlock != nil { + if crit.FromBlock.Sign() >= 0 { + begin = crit.FromBlock.Uint64() + } else if !crit.FromBlock.IsInt64() || crit.FromBlock.Int64() != int64(rpc.LatestBlockNumber) { + return nil, fmt.Errorf("negative value for FromBlock: %v", crit.FromBlock) + } } end = latest - if crit.ToBlock != nil && crit.ToBlock.Sign() > 0 { - end = crit.ToBlock.Uint64() + if crit.ToBlock != nil { + if crit.ToBlock.Sign() >= 0 { + end = crit.ToBlock.Uint64() + } else if !crit.ToBlock.IsInt64() || crit.ToBlock.Int64() != int64(rpc.LatestBlockNumber) { + return nil, fmt.Errorf("negative value for ToBlock: %v", crit.ToBlock) + } } } + if end < begin { + return nil, fmt.Errorf("end (%d) < begin (%d)", end, begin) + } blockNumbers := roaring.New() blockNumbers.AddRange(begin, end+1) // [min,max) @@ -102,11 +123,7 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([ return nil, err } if topicsBitmap != nil { - if blockNumbers == nil { - blockNumbers = topicsBitmap - } else { - blockNumbers.And(topicsBitmap) - } + blockNumbers.And(topicsBitmap) } var addrBitmap *roaring.Bitmap @@ -117,33 +134,29 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([ } if addrBitmap == nil { addrBitmap = m - } else { - addrBitmap = roaring.Or(addrBitmap, m) + continue } + addrBitmap = roaring.Or(addrBitmap, m) } if addrBitmap != nil { - if blockNumbers == nil { - blockNumbers = addrBitmap - } else { - blockNumbers.And(addrBitmap) - } + blockNumbers.And(addrBitmap) } if blockNumbers.GetCardinality() == 0 { - return returnLogs(logs), nil + return logs, nil } iter := blockNumbers.Iterator() for iter.HasNext() { - if err = common.Stopped(ctx.Done()); err != nil { + if err = ctx.Err(); err != nil { return nil, err } - blockNToMatch := uint64(iter.Next()) + block := uint64(iter.Next()) var logIndex uint - var blockLogs types.Logs - if err := tx.ForPrefix(kv.Log, dbutils.EncodeBlockNumber(blockNToMatch), func(k, v []byte) error { + var blockLogs []*types.Log + err := tx.ForPrefix(kv.Log, dbutils.EncodeBlockNumber(block), func(k, v []byte) error { var logs types.Logs if err := cbor.Unmarshal(&logs, bytes.NewReader(v)); err != nil { return fmt.Errorf("receipt unmarshal failed: %w", err) @@ -153,36 +166,41 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) ([ logIndex++ } filtered := filterLogs(logs, crit.Addresses, crit.Topics) - if len(filtered) > 0 { - txIndex := uint(binary.BigEndian.Uint32(k[8:])) - for _, log := range filtered { - log.TxIndex = txIndex - } - blockLogs = append(blockLogs, filtered...) + if len(filtered) == 0 { + return nil + } + txIndex := uint(binary.BigEndian.Uint32(k[8:])) + for _, log := range filtered { + log.TxIndex = txIndex } + blockLogs = append(blockLogs, filtered...) + return nil - }); err != nil { - return returnLogs(logs), err + }) + if err != nil { + return logs, err + } + if len(blockLogs) == 0 { + continue } - if len(blockLogs) > 0 { - b, err := rawdb.ReadBlockByNumber(tx, blockNToMatch) - if err != nil { - return nil, err - } - if b == nil { - return nil, fmt.Errorf("block not found %d", blockNToMatch) - } - blockHash := b.Hash() - for _, log := range blockLogs { - log.BlockNumber = blockNToMatch - log.BlockHash = blockHash - log.TxHash = b.Transactions()[log.TxIndex].Hash() - } - logs = append(logs, blockLogs...) + b, err := api.blockByNumberWithSenders(tx, block) + if err != nil { + return nil, err + } + if b == nil { + return nil, fmt.Errorf("block not found %d", block) } + blockHash := b.Hash() + for _, log := range blockLogs { + log.BlockNumber = block + log.BlockHash = blockHash + log.TxHash = b.Transactions()[log.TxIndex].Hash() + } + logs = append(logs, blockLogs...) } - return returnLogs(logs), nil + + return logs, nil } // The Topic list restricts matches to particular event topics. Each event has a list @@ -207,18 +225,19 @@ func getTopicsBitmap(c kv.Tx, topics [][]common.Hash, from, to uint32) (*roaring } if bitmapForORing == nil { bitmapForORing = m - } else { - bitmapForORing.Or(m) + continue } + bitmapForORing.Or(m) } - if bitmapForORing != nil { - if result == nil { - result = bitmapForORing - } else { - result = roaring.And(bitmapForORing, result) - } + if bitmapForORing == nil { + continue + } + if result == nil { + result = bitmapForORing + continue } + result = roaring.And(bitmapForORing, result) } return result, nil } @@ -231,45 +250,83 @@ func (api *APIImpl) GetTransactionReceipt(ctx context.Context, hash common.Hash) } defer tx.Rollback() - blockNumber, err := rawdb.ReadTxLookupEntry(tx, hash) + var borTx *types.Transaction + var blockHash common.Hash + var blockNum uint64 + var ok bool + + chainConfig, err := api.chainConfig(tx) if err != nil { return nil, err } - if blockNumber == nil { - return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 - } - // Extract transactions from block - block, senders, bErr := rawdb.ReadBlockByNumberWithSenders(tx, *blockNumber) - if bErr != nil { - return nil, bErr + blockNum, ok, err = api.txnLookup(ctx, tx, hash) + if blockNum == 0 { + // It is not an ideal solution (ideal solution requires extending TxnLookupReply proto type to include bool flag indicating absense of result), + // but 0 block number is used here to mean that the transaction is not found + return nil, nil } - if block == nil { - return nil, fmt.Errorf("could not find block %d", *blockNumber) + if err != nil { + return nil, err } - var txIndex uint64 - for idx, txn := range block.Transactions() { - if txn.Hash() == hash { - txIndex = uint64(idx) - break + if !ok { + if chainConfig.Bor != nil { + var blocN uint64 + borTx, blockHash, blocN, _, err = rawdb.ReadBorTransaction(tx, hash) + if err != nil { + return nil, err + } + if borTx == nil { + return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 + } + blockNum = blocN + } else { + return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 } } + block, err := api.blockByNumberWithSenders(tx, blockNum) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 + } + cc, err := api.chainConfig(tx) if err != nil { return nil, err } - receipts, err := getReceipts(ctx, tx, cc, block, senders) + if borTx != nil { + receipt := rawdb.ReadBorReceipt(tx, blockHash, blockNum) + return marshalReceipt(receipt, *borTx, cc, block, hash), nil + } + var txnIndex uint64 + var txn types.Transaction + for idx, transaction := range block.Transactions() { + if transaction.Hash() == hash { + txn = transaction + txnIndex = uint64(idx) + break + } + } + + if txn == nil { + return nil, nil + } + + receipts, err := api.getReceipts(ctx, tx, cc, block, block.Body().SendersFromTxs()) if err != nil { - return nil, fmt.Errorf("getReceipts error: %v", err) + return nil, fmt.Errorf("getReceipts error: %w", err) } - if len(receipts) <= int(txIndex) { - return nil, fmt.Errorf("block has less receipts than expected: %d <= %d, block: %d", len(receipts), int(txIndex), blockNumber) + if len(receipts) <= int(txnIndex) { + return nil, fmt.Errorf("block has less receipts than expected: %d <= %d, block: %d", len(receipts), int(txnIndex), blockNum) } - return marshalReceipt(receipts[txIndex], block.Transactions()[txIndex], cc, block), nil + return marshalReceipt(receipts[txnIndex], block.Transactions()[txnIndex], cc, block, hash), nil } // GetBlockReceipts - receipts for individual block +// func (api *APIImpl) GetBlockReceipts(ctx context.Context, number rpc.BlockNumber) ([]map[string]interface{}, error) { func (api *APIImpl) GetBlockReceipts(ctx context.Context, number rpc.BlockNumber) ([]map[string]interface{}, error) { tx, err := api.db.BeginRo(ctx) if err != nil { @@ -281,7 +338,7 @@ func (api *APIImpl) GetBlockReceipts(ctx context.Context, number rpc.BlockNumber if err != nil { return nil, err } - block, senders, err := rawdb.ReadBlockByNumberWithSenders(tx, blockNum) + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return nil, err } @@ -292,20 +349,20 @@ func (api *APIImpl) GetBlockReceipts(ctx context.Context, number rpc.BlockNumber if err != nil { return nil, err } - receipts, err := getReceipts(ctx, tx, chainConfig, block, senders) + receipts, err := api.getReceipts(ctx, tx, chainConfig, block, block.Body().SendersFromTxs()) if err != nil { - return nil, fmt.Errorf("getReceipts error: %v", err) + return nil, fmt.Errorf("getReceipts error: %w", err) } result := make([]map[string]interface{}, 0, len(receipts)) for _, receipt := range receipts { txn := block.Transactions()[receipt.TransactionIndex] - result = append(result, marshalReceipt(receipt, txn, chainConfig, block)) + result = append(result, marshalReceipt(receipt, txn, chainConfig, block, txn.Hash())) } return result, nil } -func marshalReceipt(receipt *types.Receipt, txn types.Transaction, chainConfig *params.ChainConfig, block *types.Block) map[string]interface{} { +func marshalReceipt(receipt *types.Receipt, txn types.Transaction, chainConfig *params.ChainConfig, block *types.Block, hash common.Hash) map[string]interface{} { var chainId *big.Int switch t := txn.(type) { case *types.LegacyTx: @@ -323,7 +380,7 @@ func marshalReceipt(receipt *types.Receipt, txn types.Transaction, chainConfig * fields := map[string]interface{}{ "blockHash": receipt.BlockHash, "blockNumber": hexutil.Uint64(receipt.BlockNumber.Uint64()), - "transactionHash": txn.Hash(), + "transactionHash": hash, "transactionIndex": hexutil.Uint64(receipt.TransactionIndex), "from": from, "to": txn.GetTo(), @@ -366,7 +423,7 @@ func includes(addresses []common.Address, a common.Address) bool { // filterLogs creates a slice of logs matching the given criteria. func filterLogs(logs []*types.Log, addresses []common.Address, topics [][]common.Hash) []*types.Log { - var ret []*types.Log + result := make(types.Logs, 0, len(logs)) Logs: for _, log := range logs { @@ -389,14 +446,7 @@ Logs: continue Logs } } - ret = append(ret, log) - } - return ret -} - -func returnLogs(logs []*types.Log) []*types.Log { - if logs == nil { - return []*types.Log{} + result = append(result, log) } - return logs + return result } diff --git a/cmd/rpcdaemon/commands/eth_subscribe_test.go b/cmd/rpcdaemon/commands/eth_subscribe_test.go new file mode 100644 index 00000000000..02002d9bbc1 --- /dev/null +++ b/cmd/rpcdaemon/commands/eth_subscribe_test.go @@ -0,0 +1,58 @@ +package commands + +import ( + "testing" + + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/stages" + "github.com/stretchr/testify/require" +) + +func TestEthSubscribe(t *testing.T) { + m, require := stages.Mock(t), require.New(t) + chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 21, func(i int, b *core.BlockGen) { + b.SetCoinbase(common.Address{1}) + }, false /* intermediateHashes */) + require.NoError(err) + + b, err := rlp.EncodeToBytes(ð.BlockHeadersPacket66{ + RequestId: 1, + BlockHeadersPacket: chain.Headers, + }) + require.NoError(err) + + m.ReceiveWg.Add(1) + for _, err = range m.Send(&sentry.InboundMessage{Id: sentry.MessageId_BLOCK_HEADERS_66, Data: b, PeerId: m.PeerId}) { + require.NoError(err) + } + m.ReceiveWg.Wait() // Wait for all messages to be processed before we proceeed + + ctx, conn := rpcdaemontest.CreateTestGrpcConn(t, m) + backend := rpcservices.NewRemoteBackend(remote.NewETHBACKENDClient(conn), m.DB, snapshotsync.NewBlockReader()) + ff := rpcservices.New(ctx, backend, nil, nil, func() {}) + + newHeads := make(chan *types.Header) + defer close(newHeads) + id := ff.SubscribeNewHeads(newHeads) + defer ff.UnsubscribeHeads(id) + + initialCycle := true + highestSeenHeader := chain.TopBlock.NumberU64() + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + t.Fatal(err) + } + + for i := uint64(1); i <= highestSeenHeader; i++ { + header := <-newHeads + require.Equal(i, header.Number.Uint64()) + } +} diff --git a/cmd/rpcdaemon/commands/eth_system.go b/cmd/rpcdaemon/commands/eth_system.go index bbf3d8e6335..e9969f5d086 100644 --- a/cmd/rpcdaemon/commands/eth_system.go +++ b/cmd/rpcdaemon/commands/eth_system.go @@ -2,8 +2,9 @@ package commands import ( "context" - "fmt" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" @@ -12,7 +13,6 @@ import ( "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" - "github.com/ledgerwatch/log/v3" ) // BlockNumber implements eth_blockNumber. Returns the block number of most recent block. @@ -103,64 +103,116 @@ func (api *APIImpl) ProtocolVersion(ctx context.Context) (hexutil.Uint, error) { // GasPrice implements eth_gasPrice. Returns the current price per gas in wei. func (api *APIImpl) GasPrice(ctx context.Context) (*hexutil.Big, error) { - oracle := gasprice.NewOracle(api, ethconfig.Defaults.GPO) - price, err := oracle.SuggestPrice(ctx) - return (*hexutil.Big)(price), err -} - -// HeaderByNumber is necessary for gasprice.OracleBackend implementation -func (api *APIImpl) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { tx, err := api.db.BeginRo(ctx) if err != nil { return nil, err } defer tx.Rollback() - - blockNum, err := getBlockNumber(number, tx) + cc, err := api.chainConfig(tx) if err != nil { return nil, err } - - header := rawdb.ReadHeaderByNumber(tx, blockNum) - if header == nil { - return nil, fmt.Errorf("header not found: %d", blockNum) + oracle := gasprice.NewOracle(NewGasPriceOracleBackend(tx, cc, api.BaseAPI), ethconfig.Defaults.GPO) + tipcap, err := oracle.SuggestTipCap(ctx) + if err != nil { + return nil, err + } + if head := rawdb.ReadCurrentHeader(tx); head != nil && head.BaseFee != nil { + tipcap.Add(tipcap, head.BaseFee) } - return header, nil + return (*hexutil.Big)(tipcap), err } -// BlockByNumber is necessary for gasprice.OracleBackend implementation -func (api *APIImpl) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { +// MaxPriorityFeePerGas returns a suggestion for a gas tip cap for dynamic fee transactions. +func (api *APIImpl) MaxPriorityFeePerGas(ctx context.Context) (*hexutil.Big, error) { tx, err := api.db.BeginRo(ctx) if err != nil { return nil, err } defer tx.Rollback() - - blockNum, err := getBlockNumber(number, tx) + cc, err := api.chainConfig(tx) if err != nil { return nil, err } - - block, _, err := rawdb.ReadBlockByNumberWithSenders(tx, blockNum) + oracle := gasprice.NewOracle(NewGasPriceOracleBackend(tx, cc, api.BaseAPI), ethconfig.Defaults.GPO) + tipcap, err := oracle.SuggestTipCap(ctx) if err != nil { return nil, err } - return block, nil + return (*hexutil.Big)(tipcap), err } -// ChainConfig is necessary for gasprice.OracleBackend implementation -func (api *APIImpl) ChainConfig() *params.ChainConfig { - tx, err := api.db.BeginRo(context.TODO()) +type feeHistoryResult struct { + OldestBlock *hexutil.Big `json:"oldestBlock"` + Reward [][]*hexutil.Big `json:"reward,omitempty"` + BaseFee []*hexutil.Big `json:"baseFeePerGas,omitempty"` + GasUsedRatio []float64 `json:"gasUsedRatio"` +} + +func (api *APIImpl) FeeHistory(ctx context.Context, blockCount rpc.DecimalOrHex, lastBlock rpc.BlockNumber, rewardPercentiles []float64) (*feeHistoryResult, error) { + tx, err := api.db.BeginRo(ctx) if err != nil { - log.Warn("Could not read chain config from the db, defaulting to MainnetChainConfig", "err", err) - return params.MainnetChainConfig + return nil, err } defer tx.Rollback() + cc, err := api.chainConfig(tx) + if err != nil { + return nil, err + } + oracle := gasprice.NewOracle(NewGasPriceOracleBackend(tx, cc, api.BaseAPI), ethconfig.Defaults.GPO) - chainConfig, err := api.chainConfig(tx) + oldest, reward, baseFee, gasUsed, err := oracle.FeeHistory(ctx, int(blockCount), lastBlock, rewardPercentiles) if err != nil { - log.Warn("Could not read chain config from the db, defaulting to MainnetChainConfig", "err", err) - return params.MainnetChainConfig + return nil, err } - return chainConfig + results := &feeHistoryResult{ + OldestBlock: (*hexutil.Big)(oldest), + GasUsedRatio: gasUsed, + } + if reward != nil { + results.Reward = make([][]*hexutil.Big, len(reward)) + for i, w := range reward { + results.Reward[i] = make([]*hexutil.Big, len(w)) + for j, v := range w { + results.Reward[i][j] = (*hexutil.Big)(v) + } + } + } + if baseFee != nil { + results.BaseFee = make([]*hexutil.Big, len(baseFee)) + for i, v := range baseFee { + results.BaseFee[i] = (*hexutil.Big)(v) + } + } + return results, nil +} + +type GasPriceOracleBackend struct { + tx kv.Tx + cc *params.ChainConfig + baseApi *BaseAPI +} + +func NewGasPriceOracleBackend(tx kv.Tx, cc *params.ChainConfig, baseApi *BaseAPI) *GasPriceOracleBackend { + return &GasPriceOracleBackend{tx: tx, cc: cc, baseApi: baseApi} +} + +func (b *GasPriceOracleBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { + block, err := b.baseApi.blockByRPCNumber(number, b.tx) + if err != nil { + return nil, err + } + return block.Header(), nil +} +func (b *GasPriceOracleBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { + return b.baseApi.blockByRPCNumber(number, b.tx) +} +func (b *GasPriceOracleBackend) ChainConfig() *params.ChainConfig { + return b.cc +} +func (b *GasPriceOracleBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { + return rawdb.ReadReceiptsByHash(b.tx, hash) +} +func (b *GasPriceOracleBackend) PendingBlockAndReceipts() (*types.Block, types.Receipts) { + return nil, nil } diff --git a/cmd/rpcdaemon/commands/eth_txs.go b/cmd/rpcdaemon/commands/eth_txs.go index 85a08cc542e..2cf26862d70 100644 --- a/cmd/rpcdaemon/commands/eth_txs.go +++ b/cmd/rpcdaemon/commands/eth_txs.go @@ -3,7 +3,6 @@ package commands import ( "bytes" "context" - "fmt" "math/big" "github.com/ledgerwatch/erigon-lib/gointerfaces" @@ -13,6 +12,7 @@ import ( "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" types2 "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/rpc" ) @@ -23,32 +23,54 @@ func (api *APIImpl) GetTransactionByHash(ctx context.Context, hash common.Hash) return nil, err } defer tx.Rollback() - - // https://infura.io/docs/ethereum/json-rpc/eth-getTransactionByHash - txn, blockHash, blockNumber, txIndex, err := rawdb.ReadTransaction(tx, hash) + chainConfig, err := api.chainConfig(tx) if err != nil { return nil, err } - // Add GasPrice for the DynamicFeeTransaction - var baseFee *big.Int - chainConfig, err := api.chainConfig(tx) + // https://infura.io/docs/ethereum/json-rpc/eth-getTransactionByHash + blockNum, ok, err := api.txnLookup(ctx, tx, hash) if err != nil { return nil, err } - if chainConfig.IsLondon(blockNumber) && blockHash != (common.Hash{}) { - block, err := rawdb.ReadBlockByHash(tx, blockHash) + if ok { + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return nil, err } - baseFee = block.BaseFee() - } + if block == nil { + return nil, nil + } + blockHash := block.Hash() + var txnIndex uint64 + var txn types2.Transaction + for i, transaction := range block.Transactions() { + if transaction.Hash() == hash { + txn = transaction + txnIndex = uint64(i) + break + } + } - if txn != nil { - return newRPCTransaction(txn, blockHash, blockNumber, txIndex, baseFee), nil + // Add GasPrice for the DynamicFeeTransaction + var baseFee *big.Int + if chainConfig.IsLondon(blockNum) && blockHash != (common.Hash{}) { + baseFee = block.BaseFee() + } + + // if no transaction was found then we return nil + if txn == nil { + return nil, nil + + } + + return newRPCTransaction(txn, blockHash, blockNum, txnIndex, baseFee), nil } curHeader := rawdb.ReadCurrentHeader(tx) + if curHeader == nil { + return nil, nil + } // No finalized transaction, try to retrieve it from the pool reply, err := api.txPool.Transactions(ctx, &txpool.TransactionsRequest{Hashes: []*types.H256{gointerfaces.ConvertHashToH256(hash)}}) @@ -56,10 +78,17 @@ func (api *APIImpl) GetTransactionByHash(ctx context.Context, hash common.Hash) return nil, err } if len(reply.RlpTxs[0]) > 0 { - txn, err = types2.UnmarshalTransactionFromBinary(reply.RlpTxs[0]) + s := rlp.NewStream(bytes.NewReader(reply.RlpTxs[0]), uint64(len(reply.RlpTxs[0]))) + txn, err := types2.DecodeTransaction(s) if err != nil { return nil, err } + + // if no transaction was found in the txpool then we return nil and an error warning that we didn't find the transaction by the hash + if txn == nil { + return nil, nil + } + return newRPCPendingTransaction(txn, curHeader, chainConfig), nil } @@ -76,10 +105,28 @@ func (api *APIImpl) GetRawTransactionByHash(ctx context.Context, hash common.Has defer tx.Rollback() // https://infura.io/docs/ethereum/json-rpc/eth-getTransactionByHash - txn, _, _, _, err := rawdb.ReadTransaction(tx, hash) + blockNum, ok, err := api.txnLookup(ctx, tx, hash) + if err != nil { + return nil, err + } + if !ok { + return nil, nil + } + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return nil, err } + if block == nil { + return nil, nil + } + var txn types2.Transaction + for _, transaction := range block.Transactions() { + if transaction.Hash() == hash { + txn = transaction + break + } + } + if txn != nil { var buf bytes.Buffer err = txn.MarshalBinary(&buf) @@ -106,7 +153,7 @@ func (api *APIImpl) GetTransactionByBlockHashAndIndex(ctx context.Context, block defer tx.Rollback() // https://infura.io/docs/ethereum/json-rpc/eth-getTransactionByBlockHashAndIndex - block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash) + block, err := api.blockByHashWithSenders(tx, blockHash) if err != nil { return nil, err } @@ -116,7 +163,7 @@ func (api *APIImpl) GetTransactionByBlockHashAndIndex(ctx context.Context, block txs := block.Transactions() if uint64(txIndex) >= uint64(len(txs)) { - return nil, fmt.Errorf("txIndex (%d) out of range (nTxs: %d)", uint64(txIndex), uint64(len(txs))) + return nil, nil // not error } return newRPCTransaction(txs[txIndex], block.Hash(), block.NumberU64(), uint64(txIndex), block.BaseFee()), nil @@ -131,7 +178,7 @@ func (api *APIImpl) GetRawTransactionByBlockHashAndIndex(ctx context.Context, bl defer tx.Rollback() // https://infura.io/docs/ethereum/json-rpc/eth-getRawTransactionByBlockHashAndIndex - block, err := rawdb.ReadBlockByHash(tx, blockHash) + block, err := api.blockByHashWithSenders(tx, blockHash) if err != nil { return nil, err } @@ -156,7 +203,7 @@ func (api *APIImpl) GetTransactionByBlockNumberAndIndex(ctx context.Context, blo return nil, err } - block, err := rawdb.ReadBlockByNumber(tx, blockNum) + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return nil, err } @@ -166,7 +213,7 @@ func (api *APIImpl) GetTransactionByBlockNumberAndIndex(ctx context.Context, blo txs := block.Transactions() if uint64(txIndex) >= uint64(len(txs)) { - return nil, fmt.Errorf("txIndex (%d) out of range (nTxs: %d)", uint64(txIndex), uint64(len(txs))) + return nil, nil // not error } return newRPCTransaction(txs[txIndex], block.Hash(), block.NumberU64(), uint64(txIndex), block.BaseFee()), nil @@ -181,12 +228,7 @@ func (api *APIImpl) GetRawTransactionByBlockNumberAndIndex(ctx context.Context, defer tx.Rollback() // https://infura.io/docs/ethereum/json-rpc/eth-getRawTransactionByBlockNumberAndIndex - blockNum, err := getBlockNumber(blockNr, tx) - if err != nil { - return nil, err - } - - block, err := rawdb.ReadBlockByNumber(tx, blockNum) + block, err := api.blockByRPCNumber(blockNr, tx) if err != nil { return nil, err } diff --git a/cmd/rpcdaemon/commands/eth_uncles.go b/cmd/rpcdaemon/commands/eth_uncles.go index 4e8207e3e2e..4d21345ffc0 100644 --- a/cmd/rpcdaemon/commands/eth_uncles.go +++ b/cmd/rpcdaemon/commands/eth_uncles.go @@ -24,7 +24,7 @@ func (api *APIImpl) GetUncleByBlockNumberAndIndex(ctx context.Context, number rp if err != nil { return nil, err } - block, err := rawdb.ReadBlockByNumber(tx, blockNum) + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return nil, err } @@ -41,7 +41,7 @@ func (api *APIImpl) GetUncleByBlockNumberAndIndex(ctx context.Context, number rp uncles := block.Uncles() if index >= hexutil.Uint(len(uncles)) { - log.Debug("Requested uncle not found", "number", block.Number(), "hash", hash, "index", index) + log.Trace("Requested uncle not found", "number", block.Number(), "hash", hash, "index", index) return nil, nil } uncle := types.NewBlockWithHeader(uncles[index]) @@ -56,7 +56,7 @@ func (api *APIImpl) GetUncleByBlockHashAndIndex(ctx context.Context, hash common } defer tx.Rollback() - block, err := rawdb.ReadBlockByHash(tx, hash) + block, err := api.blockByHashWithSenders(tx, hash) if err != nil { return nil, err } @@ -73,7 +73,7 @@ func (api *APIImpl) GetUncleByBlockHashAndIndex(ctx context.Context, hash common uncles := block.Uncles() if index >= hexutil.Uint(len(uncles)) { - log.Debug("Requested uncle not found", "number", block.Number(), "hash", hash, "index", index) + log.Trace("Requested uncle not found", "number", block.Number(), "hash", hash, "index", index) return nil, nil } uncle := types.NewBlockWithHeader(uncles[index]) @@ -96,7 +96,7 @@ func (api *APIImpl) GetUncleCountByBlockNumber(ctx context.Context, number rpc.B return &n, err } - block, err := rawdb.ReadBlockByNumber(tx, blockNum) + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return nil, err } @@ -116,9 +116,14 @@ func (api *APIImpl) GetUncleCountByBlockHash(ctx context.Context, hash common.Ha } defer tx.Rollback() - block, err := rawdb.ReadBlockByHash(tx, hash) + number := rawdb.ReadHeaderNumber(tx, hash) + if number == nil { + return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 + } + + block, err := api.blockWithSenders(tx, hash, *number) if err != nil { - return &n, err + return nil, err } if block == nil { return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 diff --git a/cmd/rpcdaemon/commands/net_api.go b/cmd/rpcdaemon/commands/net_api.go index 3ccc43ec87e..c9ea34fefdd 100644 --- a/cmd/rpcdaemon/commands/net_api.go +++ b/cmd/rpcdaemon/commands/net_api.go @@ -5,7 +5,7 @@ import ( "fmt" "strconv" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" "github.com/ledgerwatch/erigon/common/hexutil" ) @@ -18,11 +18,11 @@ type NetAPI interface { // NetAPIImpl data structure to store things needed for net_ commands type NetAPIImpl struct { - ethBackend services.ApiBackend + ethBackend rpcinterfaces.ApiBackend } // NewNetAPIImpl returns NetAPIImplImpl instance -func NewNetAPIImpl(eth services.ApiBackend) *NetAPIImpl { +func NewNetAPIImpl(eth rpcinterfaces.ApiBackend) *NetAPIImpl { return &NetAPIImpl{ ethBackend: eth, } diff --git a/cmd/rpcdaemon/commands/parity_api.go b/cmd/rpcdaemon/commands/parity_api.go new file mode 100644 index 00000000000..5e6d7bac23b --- /dev/null +++ b/cmd/rpcdaemon/commands/parity_api.go @@ -0,0 +1,89 @@ +package commands + +import ( + "context" + "encoding/binary" + "fmt" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/rpc" +) + +var latestTag = common.BytesToHash([]byte("latest")) + +var ErrWrongTag = fmt.Errorf("listStorageKeys wrong block tag or number: must be '%s' ('latest')", latestTag) + +// ParityAPI the interface for the parity_ RPC commands +type ParityAPI interface { + ListStorageKeys(ctx context.Context, account common.Address, quantity int, offset *hexutil.Bytes, blockNumber rpc.BlockNumberOrHash) ([]hexutil.Bytes, error) +} + +// ParityAPIImpl data structure to store things needed for parity_ commands +type ParityAPIImpl struct { + db kv.RoDB +} + +// NewParityAPIImpl returns ParityAPIImpl instance +func NewParityAPIImpl(db kv.RoDB) *ParityAPIImpl { + return &ParityAPIImpl{ + db: db, + } +} + +// ListStorageKeys implements parity_listStorageKeys. Returns all storage keys of the given address +func (api *ParityAPIImpl) ListStorageKeys(ctx context.Context, account common.Address, quantity int, offset *hexutil.Bytes, blockNumberOrTag rpc.BlockNumberOrHash) ([]hexutil.Bytes, error) { + if err := api.checkBlockNumber(blockNumberOrTag); err != nil { + return nil, err + } + + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, fmt.Errorf("listStorageKeys cannot open tx: %w", err) + } + defer tx.Rollback() + a, err := state.NewPlainStateReader(tx).ReadAccountData(account) + if err != nil { + return nil, err + } else if a == nil { + return nil, fmt.Errorf("acc not found") + } + + b := make([]byte, 8) + binary.BigEndian.PutUint64(b, a.GetIncarnation()) + seekBytes := append(account.Bytes(), b...) + + c, err := tx.CursorDupSort(kv.PlainState) + if err != nil { + return nil, err + } + defer c.Close() + keys := make([]hexutil.Bytes, 0) + var v []byte + var seekVal []byte + if offset != nil { + seekVal = *offset + } + + for v, err = c.SeekBothRange(seekBytes, seekVal); v != nil && len(keys) != quantity && err == nil; _, v, err = c.NextDup() { + if len(v) > common.HashLength { + keys = append(keys, v[:common.HashLength]) + } else { + keys = append(keys, v) + } + } + if err != nil { + return nil, err + } + return keys, nil +} + +func (api *ParityAPIImpl) checkBlockNumber(blockNumber rpc.BlockNumberOrHash) error { + num, isNum := blockNumber.Number() + if isNum && rpc.LatestBlockNumber == num { + return nil + } + return ErrWrongTag +} diff --git a/cmd/rpcdaemon/commands/parity_api_test.go b/cmd/rpcdaemon/commands/parity_api_test.go new file mode 100644 index 00000000000..70a607a8f4b --- /dev/null +++ b/cmd/rpcdaemon/commands/parity_api_test.go @@ -0,0 +1,105 @@ +package commands + +import ( + "context" + "fmt" + "testing" + + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/rpc" + "github.com/stretchr/testify/assert" +) + +var latestBlock = rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber) + +func TestParityAPIImpl_ListStorageKeys_NoOffset(t *testing.T) { + assert := assert.New(t) + db := rpcdaemontest.CreateTestKV(t) + api := NewParityAPIImpl(db) + answers := []string{ + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000002", + "0a2127994676ca91e4eb3d2a1e46ec9dcee074dc2643bb5ebd4e9ac6541a3148", + "0fe673b4bc06161f39bc26f4e8831c810a72ffe69e5c8cb26f7f54752618e696", + "120e23dcb7e4437386073613853db77b10011a2404eefc716b97c7767e37f8eb", + } + addr := common.HexToAddress("0x920fd5070602feaea2e251e9e7238b6c376bcae5") + result, err := api.ListStorageKeys(context.Background(), addr, 5, nil, latestBlock) + if err != nil { + t.Errorf("calling ListStorageKeys: %v", err) + } + assert.Equal(len(answers), len(result)) + for k, v := range result { + assert.Equal(answers[k], common.Bytes2Hex(v)) + } +} + +func TestParityAPIImpl_ListStorageKeys_WithOffset_ExistingPrefix(t *testing.T) { + assert := assert.New(t) + db := rpcdaemontest.CreateTestKV(t) + api := NewParityAPIImpl(db) + answers := []string{ + "29d05770ca9ee7088a64e18c8e5160fc62c3c2179dc8ef9b4dbc970c9e51b4d8", + "29edc84535d98b29835079d685b97b41ee8e831e343cc80793057e462353a26d", + "2c05ac60f9aa2df5e64ef977f271e4b9a2d13951f123a2cb5f5d4ad5eb344f1a", + "4644be453c81744b6842ddf615d7fca0e14a23b09734be63d44c23452de95631", + "4974416255391052161ba8184fe652f3bf8c915592c65f7de127af8e637dce5d", + } + addr := common.HexToAddress("0x920fd5070602feaea2e251e9e7238b6c376bcae5") + offset := common.Hex2Bytes("29") + b := hexutil.Bytes(offset) + result, err := api.ListStorageKeys(context.Background(), addr, 5, &b, latestBlock) + if err != nil { + t.Errorf("calling ListStorageKeys: %v", err) + } + assert.Equal(len(answers), len(result)) + for k, v := range result { + assert.Equal(answers[k], common.Bytes2Hex(v)) + } +} + +func TestParityAPIImpl_ListStorageKeys_WithOffset_NonExistingPrefix(t *testing.T) { + assert := assert.New(t) + db := rpcdaemontest.CreateTestKV(t) + api := NewParityAPIImpl(db) + answers := []string{ + "4644be453c81744b6842ddf615d7fca0e14a23b09734be63d44c23452de95631", + "4974416255391052161ba8184fe652f3bf8c915592c65f7de127af8e637dce5d", + } + addr := common.HexToAddress("0x920fd5070602feaea2e251e9e7238b6c376bcae5") + offset := common.Hex2Bytes("30") + b := hexutil.Bytes(offset) + result, err := api.ListStorageKeys(context.Background(), addr, 2, &b, latestBlock) + if err != nil { + t.Errorf("calling ListStorageKeys: %v", err) + } + assert.Equal(len(answers), len(result)) + for k, v := range result { + assert.Equal(answers[k], common.Bytes2Hex(v)) + } +} + +func TestParityAPIImpl_ListStorageKeys_WithOffset_EmptyResponse(t *testing.T) { + assert := assert.New(t) + db := rpcdaemontest.CreateTestKV(t) + api := NewParityAPIImpl(db) + addr := common.HexToAddress("0x920fd5070602feaea2e251e9e7238b6c376bcae5") + offset := common.Hex2Bytes("ff") + b := hexutil.Bytes(offset) + result, err := api.ListStorageKeys(context.Background(), addr, 2, &b, latestBlock) + if err != nil { + t.Errorf("calling ListStorageKeys: %v", err) + } + assert.Equal(0, len(result)) +} + +func TestParityAPIImpl_ListStorageKeys_AccNotFound(t *testing.T) { + assert := assert.New(t) + db := rpcdaemontest.CreateTestKV(t) + api := NewParityAPIImpl(db) + addr := common.HexToAddress("0x920fd5070602feaea2e251e9e7238b6c376bcaef") + _, err := api.ListStorageKeys(context.Background(), addr, 2, nil, latestBlock) + assert.Error(err, fmt.Errorf("acc not found")) +} diff --git a/cmd/rpcdaemon/commands/rpc_block.go b/cmd/rpcdaemon/commands/rpc_block.go index 2465831c01e..b24451c538b 100644 --- a/cmd/rpcdaemon/commands/rpc_block.go +++ b/cmd/rpcdaemon/commands/rpc_block.go @@ -28,7 +28,7 @@ func getBlockNumber(number rpc.BlockNumber, tx kv.Tx) (uint64, error) { func getLatestBlockNumber(tx kv.Tx) (uint64, error) { blockNum, err := stages.GetStageProgress(tx, stages.Execution) if err != nil { - return 0, fmt.Errorf("getting latest block number: %v", err) + return 0, fmt.Errorf("getting latest block number: %w", err) } return blockNum, nil diff --git a/cmd/rpcdaemon/commands/send_transaction.go b/cmd/rpcdaemon/commands/send_transaction.go index 1309638beab..7ce01f31395 100644 --- a/cmd/rpcdaemon/commands/send_transaction.go +++ b/cmd/rpcdaemon/commands/send_transaction.go @@ -7,7 +7,7 @@ import ( "fmt" "math/big" - "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + txPoolProto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" @@ -35,13 +35,13 @@ func (api *APIImpl) SendRawTransaction(ctx context.Context, encodedTx hexutil.By return common.Hash{}, errors.New("only replay-protected (EIP-155) transactions allowed over RPC") } hash := txn.Hash() - res, err := api.txPool.Add(ctx, &txpool.AddRequest{RlpTxs: [][]byte{encodedTx}}) + res, err := api.txPool.Add(ctx, &txPoolProto.AddRequest{RlpTxs: [][]byte{encodedTx}}) if err != nil { return common.Hash{}, err } - if res.Imported[0] != txpool.ImportResult_SUCCESS { - return hash, fmt.Errorf("%s: %s", txpool.ImportResult_name[int32(res.Imported[0])], res.Errors[0]) + if res.Imported[0] != txPoolProto.ImportResult_SUCCESS { + return hash, fmt.Errorf("%s: %s", txPoolProto.ImportResult_name[int32(res.Imported[0])], res.Errors[0]) } tx, err := api.db.BeginRo(ctx) @@ -49,12 +49,17 @@ func (api *APIImpl) SendRawTransaction(ctx context.Context, encodedTx hexutil.By return common.Hash{}, err } defer tx.Rollback() + // Print a log with full txn details for manual investigations and interventions blockNum := rawdb.ReadCurrentBlockNumber(tx) if blockNum == nil { return common.Hash{}, err } - signer := types.MakeSigner(api.ChainConfig(), *blockNum) + cc, err := api.chainConfig(tx) + if err != nil { + return common.Hash{}, err + } + signer := types.MakeSigner(cc, *blockNum) from, err := txn.Sender(*signer) if err != nil { return common.Hash{}, err diff --git a/cmd/rpcdaemon/commands/send_transaction_test.go b/cmd/rpcdaemon/commands/send_transaction_test.go index b4f05b693e0..bc65da77ad3 100644 --- a/cmd/rpcdaemon/commands/send_transaction_test.go +++ b/cmd/rpcdaemon/commands/send_transaction_test.go @@ -9,9 +9,10 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" "github.com/ledgerwatch/erigon/core" @@ -19,6 +20,7 @@ import ( "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages" "github.com/stretchr/testify/require" ) @@ -29,7 +31,7 @@ func TestSendRawTransaction(t *testing.T) { chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) require.NoError(err) { // Do 1 step to start txPool @@ -57,26 +59,26 @@ func TestSendRawTransaction(t *testing.T) { initialCycle := true highestSeenHeader := chain.TopBlock.NumberU64() - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } } expectValue := uint64(1234) - txn, err := types.SignTx(types.NewTransaction(0, common.Address{1}, uint256.NewInt(expectValue), params.TxGas, u256.Num1, nil), *types.LatestSignerForChainID(m.ChainConfig.ChainID), m.Key) + txn, err := types.SignTx(types.NewTransaction(0, common.Address{1}, uint256.NewInt(expectValue), params.TxGas, uint256.NewInt(10*params.GWei), nil), *types.LatestSignerForChainID(m.ChainConfig.ChainID), m.Key) require.NoError(err) ctx, conn := rpcdaemontest.CreateTestGrpcConn(t, m) txPool := txpool.NewTxpoolClient(conn) - ff := filters.New(ctx, nil, txPool, txpool.NewMiningClient(conn)) - api := commands.NewEthAPI(commands.NewBaseApi(ff), m.DB, nil, txPool, nil, 5000000) + ff := rpcservices.New(ctx, nil, txPool, txpool.NewMiningClient(conn), func() {}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := commands.NewEthAPI(commands.NewBaseApi(ff, stateCache, snapshotsync.NewBlockReader(), false), m.DB, nil, txPool, nil, 5000000) buf := bytes.NewBuffer(nil) err = txn.MarshalBinary(buf) require.NoError(err) txsCh := make(chan []types.Transaction, 1) - defer close(txsCh) id := ff.SubscribePendingTxs(txsCh) defer ff.UnsubscribePendingTxs(id) @@ -95,7 +97,7 @@ func TestSendRawTransaction(t *testing.T) { //TODO: make propagation easy to test - now race //time.Sleep(time.Second) //sent := m.SentMessage(0) - //require.Equal(eth.ToProto[m.SentryClient.Protocol()][eth.NewPooledTransactionHashesMsg], sent.Id) + //require.Equal(eth.ToProto[m.MultiClient.Protocol()][eth.NewPooledTransactionHashesMsg], sent.Id) } func transaction(nonce uint64, gaslimit uint64, key *ecdsa.PrivateKey) types.Transaction { diff --git a/cmd/rpcdaemon/commands/shh_api_deprecated.go b/cmd/rpcdaemon/commands/shh_api_deprecated.go deleted file mode 100644 index de9d4c46cdb..00000000000 --- a/cmd/rpcdaemon/commands/shh_api_deprecated.go +++ /dev/null @@ -1,110 +0,0 @@ -package commands - -import ( - "context" - "fmt" - - "github.com/ledgerwatch/erigon/common/hexutil" -) - -// SHHAPI the interface for the shh_ RPC commands (deprecated) -type SHHAPI interface { - Post(_ context.Context, _ SHHPost) (bool, error) - Version(_ context.Context) (string, error) - NewIdentity(_ context.Context) (string, error) - HasIdentity(_ context.Context, _ string) (bool, error) - NewGroup(_ context.Context) (string, error) - AddToGroup(_ context.Context, _ string) (bool, error) - NewFilter(_ context.Context, _ SHHFilter) (hexutil.Uint, error) - UninstallFilter(_ context.Context, _ hexutil.Uint) (bool, error) - GetFilterChanges(_ context.Context, _ hexutil.Uint) ([]string, error) - GetMessages(_ context.Context, _ hexutil.Uint) ([]string, error) -} - -// SHHAPIImpl data structure to store things needed for shh_ commands -type SHHAPIImpl struct { - unused uint64 -} - -// NewSHHAPIImpl returns NetAPIImplImpl instance -func NewSHHAPIImpl() *SHHAPIImpl { - return &SHHAPIImpl{ - unused: uint64(0), - } -} - -// SHHPost type for shh_post command (deprecated) -type SHHPost struct { - _ string // from - _ string // to - _ []string // topics - _ string // payload - _ hexutil.Uint // priority - _ hexutil.Uint // ttl -} - -// Post implements shh_post. Sends a whisper message. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) Post(_ context.Context, _ SHHPost) (bool, error) { - return false, fmt.Errorf(NotAvailableDeprecated, "shh_post") -} - -// Version implements shh_version. Returns the current whisper protocol version. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) Version(_ context.Context) (string, error) { - return "", fmt.Errorf(NotAvailableDeprecated, "shh_version") -} - -// NewIdentity implements shh_newIdentity. Creates new whisper identity in the client. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) NewIdentity(_ context.Context) (string, error) { - return "", fmt.Errorf(NotAvailableDeprecated, "shh_newIdentity") -} - -// HasIdentity implements shh_hasIdentity. Checks if the client hold the private keys for a given identity. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) HasIdentity(_ context.Context, _ string) (bool, error) { - return false, fmt.Errorf(NotAvailableDeprecated, "shh_hasIdentity") -} - -// NewGroup implements shh_newGroup. Create a new group. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) NewGroup(_ context.Context) (string, error) { - return "", fmt.Errorf(NotAvailableDeprecated, "shh_newGroup") -} - -// AddToGroup implements shh_addToGroup. Add to a group. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) AddToGroup(_ context.Context, _ string) (bool, error) { - return false, fmt.Errorf(NotAvailableDeprecated, "shh_addToGroup") -} - -// SHHFilter type for shh_newFilter command -type SHHFilter struct { - _ string - _ []string -} - -// NewFilter implements shh_newFilter. Creates filter to notify, when client receives whisper message matching the filter options. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) NewFilter(_ context.Context, _ SHHFilter) (hexutil.Uint, error) { - return hexutil.Uint(0), fmt.Errorf(NotAvailableDeprecated, "shh_newFilter") -} - -// UninstallFilter implements shh_uninstallFilter. Uninstalls a filter with given id. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) UninstallFilter(_ context.Context, _ hexutil.Uint) (bool, error) { - return false, fmt.Errorf(NotAvailableDeprecated, "shh_uninstallFilter") -} - -// GetFilterChanges implements shh_getFilterChanges. Polling method for whisper filters. Returns new messages since the last call of this method. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) GetFilterChanges(_ context.Context, _ hexutil.Uint) ([]string, error) { - return []string{}, fmt.Errorf(NotAvailableDeprecated, "shh_getFilterChanges") -} - -// GetMessages implements shh_getMessages. Get all messages matching a filter. Unlike shh_getFilterChanges this returns all messages. -// Deprecated: This function will be removed in the future. -func (api *SHHAPIImpl) GetMessages(_ context.Context, _ hexutil.Uint) ([]string, error) { - return []string{}, fmt.Errorf(NotAvailableDeprecated, "shh_getMessages") -} diff --git a/cmd/rpcdaemon/commands/starknet_accounts.go b/cmd/rpcdaemon/commands/starknet_accounts.go new file mode 100644 index 00000000000..abe0e5c7903 --- /dev/null +++ b/cmd/rpcdaemon/commands/starknet_accounts.go @@ -0,0 +1,39 @@ +package commands + +import ( + "context" + "fmt" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/adapter" + "github.com/ledgerwatch/erigon/turbo/rpchelper" +) + +// GetCode implements starknet_getCode. Returns the byte code at a given address (if it's a smart contract). +func (api *StarknetImpl) GetCode(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) { + tx, err1 := api.db.BeginRo(ctx) + if err1 != nil { + return nil, fmt.Errorf("getCode cannot open tx: %w", err1) + } + defer tx.Rollback() + blockNumber, _, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) + if err != nil { + return nil, err + } + + reader := adapter.NewStateReader(tx, blockNumber) + acc, err := reader.ReadAccountData(address) + if acc == nil || err != nil { + return hexutil.Bytes(""), nil + } + res, err := reader.ReadAccountCode(address, acc.Incarnation, acc.CodeHash) + if res == nil || err != nil { + return hexutil.Bytes(""), nil + } + if res == nil { + return hexutil.Bytes(""), nil + } + return res, nil +} diff --git a/cmd/rpcdaemon/commands/starknet_api.go b/cmd/rpcdaemon/commands/starknet_api.go new file mode 100644 index 00000000000..0423e31e725 --- /dev/null +++ b/cmd/rpcdaemon/commands/starknet_api.go @@ -0,0 +1,34 @@ +package commands + +import ( + "context" + "github.com/ledgerwatch/erigon-lib/gointerfaces/starknet" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/rpc" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" +) + +type StarknetAPI interface { + SendRawTransaction(ctx context.Context, encodedTx hexutil.Bytes) (common.Hash, error) + GetCode(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) + Call(ctx context.Context, request StarknetCallRequest, blockNrOrHash rpc.BlockNumberOrHash) ([]string, error) +} + +type StarknetImpl struct { + *BaseAPI + db kv.RoDB + client starknet.CAIROVMClient + txPool txpool.TxpoolClient +} + +func NewStarknetAPI(base *BaseAPI, db kv.RoDB, client starknet.CAIROVMClient, txPool txpool.TxpoolClient) *StarknetImpl { + return &StarknetImpl{ + BaseAPI: base, + db: db, + client: client, + txPool: txPool, + } +} diff --git a/cmd/rpcdaemon/commands/starknet_call.go b/cmd/rpcdaemon/commands/starknet_call.go new file mode 100644 index 00000000000..4b68eac9c39 --- /dev/null +++ b/cmd/rpcdaemon/commands/starknet_call.go @@ -0,0 +1,96 @@ +package commands + +import ( + "context" + "github.com/ledgerwatch/erigon-lib/gointerfaces/starknet" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/rpc" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/known/wrapperspb" + "reflect" + "strings" +) + +type StarknetGrpcCallArgs struct { + Inputs string + Address string + Function string + Code string + BlockHash string + BlockNumber int64 + Network string +} + +type StarknetCallRequest struct { + ContractAddress common.Address32 + EntryPointSelector string + CallData []string +} + +func (s StarknetGrpcCallArgs) ToMapAny() (result map[string]*anypb.Any) { + result = make(map[string]*anypb.Any) + + v := reflect.ValueOf(s) + typeOfS := v.Type() + + for i := 0; i < v.NumField(); i++ { + fieldName := strings.ToLower(typeOfS.Field(i).Name) + switch v.Field(i).Kind() { + case reflect.Int64: + result[fieldName], _ = anypb.New(wrapperspb.Int64(v.Field(i).Interface().(int64))) + default: + result[fieldName], _ = anypb.New(wrapperspb.String(v.Field(i).Interface().(string))) + } + } + return result +} + +// Call implements starknet_call. +func (api *StarknetImpl) Call(ctx context.Context, request StarknetCallRequest, blockNrOrHash rpc.BlockNumberOrHash) ([]string, error) { + tx, err := api.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + code, err := api.GetCode(ctx, request.ContractAddress.ToCommonAddress(), blockNrOrHash) + if err != nil { + return nil, err + } + + requestParams := &StarknetGrpcCallArgs{ + Inputs: strings.Join(request.CallData, ","), + Address: request.ContractAddress.String(), + Function: request.EntryPointSelector, + Code: code.String(), + } + + if blockNrOrHash.BlockHash != nil { + requestParams.BlockHash = blockNrOrHash.BlockHash.String() + } + + if blockNrOrHash.BlockNumber != nil { + requestParams.BlockNumber = blockNrOrHash.BlockNumber.Int64() + } + + requestParamsMap := requestParams.ToMapAny() + + grpcRequest := &starknet.CallRequest{ + Method: "starknet_call", + Params: requestParamsMap, + } + + response, err := api.client.Call(ctx, grpcRequest) + if err != nil { + return nil, err + } + + var result []string + for _, v := range response.Result { + s := wrapperspb.String("") + v.UnmarshalTo(s) + result = append(result, s.GetValue()) + } + + return result, nil +} diff --git a/cmd/rpcdaemon/commands/starknet_send_transaction.go b/cmd/rpcdaemon/commands/starknet_send_transaction.go new file mode 100644 index 00000000000..7bb90ea3bf0 --- /dev/null +++ b/cmd/rpcdaemon/commands/starknet_send_transaction.go @@ -0,0 +1,50 @@ +package commands + +import ( + "bytes" + "context" + "errors" + "fmt" + txPoolProto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" +) + +var ( + ErrOnlyStarknetTx = errors.New("only support starknet transactions") + ErrOnlyContractDeploy = errors.New("only support contract creation") +) + +// SendRawTransaction deploy new cairo contract +func (api *StarknetImpl) SendRawTransaction(ctx context.Context, encodedTx hexutil.Bytes) (common.Hash, error) { + txn, err := types.DecodeTransaction(rlp.NewStream(bytes.NewReader(encodedTx), uint64(len(encodedTx)))) + + if err != nil { + return common.Hash{}, err + } + + if !txn.IsStarkNet() { + return common.Hash{}, ErrOnlyStarknetTx + } + + if !txn.IsContractDeploy() { + return common.Hash{}, ErrOnlyContractDeploy + } + + hash := txn.Hash() + res, err := api.txPool.Add(ctx, &txPoolProto.AddRequest{RlpTxs: [][]byte{encodedTx}}) + if err != nil { + return common.Hash{}, err + } + + if res.Imported[0] != txPoolProto.ImportResult_SUCCESS { + return hash, fmt.Errorf("%s: %s", txPoolProto.ImportResult_name[int32(res.Imported[0])], res.Errors[0]) + } + + log.Info("Submitted contract creation", "hash", txn.Hash().Hex(), "nonce", txn.GetNonce(), "value", txn.GetValue()) + + return txn.Hash(), nil +} diff --git a/cmd/rpcdaemon/commands/starknet_send_transaction_test.go b/cmd/rpcdaemon/commands/starknet_send_transaction_test.go new file mode 100644 index 00000000000..5ab2791bd67 --- /dev/null +++ b/cmd/rpcdaemon/commands/starknet_send_transaction_test.go @@ -0,0 +1,83 @@ +package commands_test + +import ( + "bytes" + "testing" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/starknet" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/stages" + "github.com/stretchr/testify/require" +) + +func TestErrorStarknetSendRawTransaction(t *testing.T) { + var cases = []struct { + name string + tx string + error error + }{ + {name: "wrong tx type", tx: generateDynamicFeeTransaction(), error: commands.ErrOnlyStarknetTx}, + {name: "not contract creation", tx: generateStarknetTransaction(), error: commands.ErrOnlyContractDeploy}, + } + + m, require := stages.MockWithTxPool(t), require.New(t) + ctx, conn := rpcdaemontest.CreateTestGrpcConn(t, m) + txPool := txpool.NewTxpoolClient(conn) + starknetClient := starknet.NewCAIROVMClient(conn) + ff := rpcservices.New(ctx, nil, txPool, txpool.NewMiningClient(conn), func() {}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + + for _, tt := range cases { + api := commands.NewStarknetAPI(commands.NewBaseApi(ff, stateCache, snapshotsync.NewBlockReader(), false), m.DB, starknetClient, txPool) + + t.Run(tt.name, func(t *testing.T) { + hex, _ := hexutil.Decode(tt.tx) + + _, err := api.SendRawTransaction(ctx, hex) + + require.ErrorIs(err, tt.error) + }) + } +} + +func generateDynamicFeeTransaction() string { + buf := bytes.NewBuffer(nil) + types.DynamicFeeTransaction{ + CommonTx: types.CommonTx{ + ChainID: new(uint256.Int), + Nonce: 1, + Value: uint256.NewInt(1), + Gas: 1, + }, + Tip: new(uint256.Int), + FeeCap: new(uint256.Int), + }.MarshalBinary(buf) + + return hexutil.Encode(buf.Bytes()) +} + +func generateStarknetTransaction() string { + buf := bytes.NewBuffer(nil) + types.StarknetTransaction{ + CommonTx: types.CommonTx{ + ChainID: new(uint256.Int), + Nonce: 1, + Value: uint256.NewInt(1), + Gas: 1, + To: &common.Address{}, + }, + Tip: new(uint256.Int), + FeeCap: new(uint256.Int), + }.MarshalBinary(buf) + + return hexutil.Encode(buf.Bytes()) +} diff --git a/cmd/rpcdaemon/commands/storage_range.go b/cmd/rpcdaemon/commands/storage_range.go index 69d8f0f0025..141be618bbc 100644 --- a/cmd/rpcdaemon/commands/storage_range.go +++ b/cmd/rpcdaemon/commands/storage_range.go @@ -36,7 +36,7 @@ func StorageRangeAt(stateReader *state.PlainState, contractAddress common.Addres resultCount++ return resultCount <= maxResult }, maxResult+1); err != nil { - return StorageRangeResult{}, fmt.Errorf("error walking over storage: %v", err) + return StorageRangeResult{}, fmt.Errorf("error walking over storage: %w", err) } return result, nil } diff --git a/cmd/rpcdaemon/commands/trace_adhoc.go b/cmd/rpcdaemon/commands/trace_adhoc.go index 01997b9b4f5..5426b869530 100644 --- a/cmd/rpcdaemon/commands/trace_adhoc.go +++ b/cmd/rpcdaemon/commands/trace_adhoc.go @@ -7,20 +7,21 @@ import ( "fmt" "math" "math/big" + "strings" "time" "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" math2 "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/core/vm/stack" + "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/turbo/rpchelper" "github.com/ledgerwatch/erigon/turbo/shards" @@ -63,7 +64,7 @@ type TraceCallResult struct { Output hexutil.Bytes `json:"output"` StateDiff map[common.Address]*StateDiffAccount `json:"stateDiff"` Trace []*ParityTrace `json:"trace"` - VmTrace *TraceCallVmTrace `json:"vmTrace"` + VmTrace *VmTrace `json:"vmTrace"` TransactionHash *common.Hash `json:"transactionHash,omitempty"` } @@ -95,8 +96,37 @@ type StateDiffStorage struct { To common.Hash `json:"to"` } -// TraceCallVmTrace is the part of `trace_call` response that is under "vmTrace" tag -type TraceCallVmTrace struct { +// VmTrace is the part of `trace_call` response that is under "vmTrace" tag +type VmTrace struct { + Code hexutil.Bytes `json:"code"` + Ops []*VmTraceOp `json:"ops"` +} + +// VmTraceOp is one element of the vmTrace ops trace +type VmTraceOp struct { + Cost int `json:"cost"` + Ex *VmTraceEx `json:"ex"` + Pc int `json:"pc"` + Sub *VmTrace `json:"sub"` + Op string `json:"op,omitempty"` + Idx string `json:"idx,omitempty"` +} + +type VmTraceEx struct { + Mem *VmTraceMem `json:"mem"` + Push []string `json:"push"` + Store *VmTraceStore `json:"store"` + Used int `json:"used"` +} + +type VmTraceMem struct { + Data string `json:"data"` + Off int `json:"off"` +} + +type VmTraceStore struct { + Key string `json:"key"` + Val string `json:"val"` } // ToMessage converts CallArgs to the Message type used by the core evm @@ -162,8 +192,12 @@ func (args *TraceCallParam) ToMessage(globalGasCap uint64, baseFee *uint256.Int) } // Backfill the legacy gasPrice for EVM execution, unless we're all zeroes gasPrice = new(uint256.Int) - if gasFeeCap.BitLen() > 0 || gasTipCap.BitLen() > 0 { + if !gasFeeCap.IsZero() || !gasTipCap.IsZero() { gasPrice = math2.U256Min(new(uint256.Int).Add(gasTipCap, baseFee), gasFeeCap) + } else { + // This means gasFeeCap == 0, gasTipCap == 0 + gasPrice.Set(baseFee) + gasFeeCap, gasTipCap = gasPrice, gasPrice } } } @@ -171,7 +205,7 @@ func (args *TraceCallParam) ToMessage(globalGasCap uint64, baseFee *uint256.Int) if args.Value != nil { overflow := value.SetFromBig(args.Value.ToInt()) if overflow { - panic(fmt.Errorf("args.Value higher than 2^256-1")) + return types.Message{}, fmt.Errorf("args.Value higher than 2^256-1") } } var data []byte @@ -188,23 +222,60 @@ func (args *TraceCallParam) ToMessage(globalGasCap uint64, baseFee *uint256.Int) // OpenEthereum-style tracer type OeTracer struct { - r *TraceCallResult - traceAddr []int - traceStack []*ParityTrace - lastTop *ParityTrace - precompile bool // Whether the last CaptureStart was called with `precompile = true` - compat bool // Bug for bug compatibility mode + r *TraceCallResult + traceAddr []int + traceStack []*ParityTrace + precompile bool // Whether the last CaptureStart was called with `precompile = true` + compat bool // Bug for bug compatibility mode + lastVmOp *VmTraceOp + lastOp vm.OpCode + lastMemOff uint64 + lastMemLen uint64 + memOffStack []uint64 + memLenStack []uint64 + lastOffStack *VmTraceOp + vmOpStack []*VmTraceOp // Stack of vmTrace operations as call depth increases + idx []string // Prefix for the "idx" inside operations, for easier navigation } -func (ot *OeTracer) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { - if precompile { +func (ot *OeTracer) CaptureStart(env *vm.EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, code []byte) { + //fmt.Printf("CaptureStart depth %d, from %x, to %x, create %t, input %x, gas %d, value %d, precompile %t\n", depth, from, to, create, input, gas, value, precompile) + if ot.r.VmTrace != nil { + var vmTrace *VmTrace + if depth > 0 { + var vmT *VmTrace + if len(ot.vmOpStack) > 0 { + vmT = ot.vmOpStack[len(ot.vmOpStack)-1].Sub + } else { + vmT = ot.r.VmTrace + } + if !ot.compat { + ot.idx = append(ot.idx, fmt.Sprintf("%d-", len(vmT.Ops)-1)) + } + } + if ot.lastVmOp != nil { + vmTrace = &VmTrace{Ops: []*VmTraceOp{}} + ot.lastVmOp.Sub = vmTrace + ot.vmOpStack = append(ot.vmOpStack, ot.lastVmOp) + } else { + vmTrace = ot.r.VmTrace + } + if create { + vmTrace.Code = common.CopyBytes(input) + if ot.lastVmOp != nil { + ot.lastVmOp.Cost += int(gas) + } + } else { + vmTrace.Code = code + } + } + if precompile && depth > 0 && value.Sign() <= 0 { ot.precompile = true - return nil + return } if gas > 500000000 { gas = 500000001 - (0x8000000000000000 - gas) } - //fmt.Printf("CaptureStart depth %d, from %x, to %x, create %t, input %x, gas %d, value %d\n", depth, from, to, create, input, gas, value) trace := &ParityTrace{} if create { trResult := &CreateTraceResult{} @@ -263,20 +334,33 @@ func (ot *OeTracer) CaptureStart(depth int, from common.Address, to common.Addre } ot.r.Trace = append(ot.r.Trace, trace) ot.traceStack = append(ot.traceStack, trace) - return nil } -func (ot *OeTracer) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { +func (ot *OeTracer) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { + if ot.r.VmTrace != nil { + if len(ot.vmOpStack) > 0 { + ot.lastOffStack = ot.vmOpStack[len(ot.vmOpStack)-1] + ot.vmOpStack = ot.vmOpStack[:len(ot.vmOpStack)-1] + } + if !ot.compat && depth > 0 { + ot.idx = ot.idx[:len(ot.idx)-1] + } + if depth > 0 { + ot.lastMemOff = ot.memOffStack[len(ot.memOffStack)-1] + ot.memOffStack = ot.memOffStack[:len(ot.memOffStack)-1] + ot.lastMemLen = ot.memLenStack[len(ot.memLenStack)-1] + ot.memLenStack = ot.memLenStack[:len(ot.memLenStack)-1] + } + } if ot.precompile { ot.precompile = false - return nil + return } if depth == 0 { ot.r.Output = common.CopyBytes(output) } - topTrace := ot.traceStack[len(ot.traceStack)-1] - ot.lastTop = topTrace ignoreError := false + topTrace := ot.traceStack[len(ot.traceStack)-1] if ot.compat { ignoreError = depth == 0 && topTrace.Type == CREATE } @@ -313,25 +397,128 @@ func (ot *OeTracer) CaptureEnd(depth int, output []byte, gasUsed uint64, t time. switch topTrace.Type { case CALL: topTrace.Result.(*TraceResult).GasUsed = new(hexutil.Big) - topTrace.Result.(*TraceResult).GasUsed.ToInt().SetUint64(gasUsed) + topTrace.Result.(*TraceResult).GasUsed.ToInt().SetUint64(startGas - endGas) case CREATE: topTrace.Result.(*CreateTraceResult).GasUsed = new(hexutil.Big) - topTrace.Result.(*CreateTraceResult).GasUsed.ToInt().SetUint64(gasUsed) + topTrace.Result.(*CreateTraceResult).GasUsed.ToInt().SetUint64(startGas - endGas) } } ot.traceStack = ot.traceStack[:len(ot.traceStack)-1] if depth > 0 { ot.traceAddr = ot.traceAddr[:len(ot.traceAddr)-1] } - return nil } -func (ot *OeTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, st *stack.Stack, rData []byte, contract *vm.Contract, opDepth int, err error) error { - return nil +func (ot *OeTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, opDepth int, err error) { + memory := scope.Memory + st := scope.Stack + + if ot.r.VmTrace != nil { + var vmTrace *VmTrace + if len(ot.vmOpStack) > 0 { + vmTrace = ot.vmOpStack[len(ot.vmOpStack)-1].Sub + } else { + vmTrace = ot.r.VmTrace + } + if ot.lastVmOp != nil && ot.lastVmOp.Ex != nil { + // Set the "push" of the last operation + var showStack int + switch { + case ot.lastOp >= vm.PUSH1 && ot.lastOp <= vm.PUSH32: + showStack = 1 + case ot.lastOp >= vm.SWAP1 && ot.lastOp <= vm.SWAP16: + showStack = int(ot.lastOp-vm.SWAP1) + 2 + case ot.lastOp >= vm.DUP1 && ot.lastOp <= vm.DUP16: + showStack = int(ot.lastOp-vm.DUP1) + 2 + } + switch ot.lastOp { + case vm.CALLDATALOAD, vm.SLOAD, vm.MLOAD, vm.CALLDATASIZE, vm.LT, vm.GT, vm.DIV, vm.SDIV, vm.SAR, vm.AND, vm.EQ, vm.CALLVALUE, vm.ISZERO, + vm.ADD, vm.EXP, vm.CALLER, vm.SHA3, vm.SUB, vm.ADDRESS, vm.GAS, vm.MUL, vm.RETURNDATASIZE, vm.NOT, vm.SHR, vm.SHL, + vm.EXTCODESIZE, vm.SLT, vm.OR, vm.NUMBER, vm.PC, vm.TIMESTAMP, vm.BALANCE, vm.SELFBALANCE, vm.MULMOD, vm.ADDMOD, vm.BASEFEE, + vm.BLOCKHASH, vm.BYTE, vm.XOR, vm.ORIGIN, vm.CODESIZE, vm.MOD, vm.SIGNEXTEND, vm.GASLIMIT, vm.DIFFICULTY, vm.SGT, vm.GASPRICE, + vm.MSIZE, vm.EXTCODEHASH: + showStack = 1 + } + for i := showStack - 1; i >= 0; i-- { + ot.lastVmOp.Ex.Push = append(ot.lastVmOp.Ex.Push, st.Back(i).String()) + } + // Set the "mem" of the last operation + var setMem bool + switch ot.lastOp { + case vm.MSTORE, vm.MSTORE8, vm.MLOAD, vm.RETURNDATACOPY, vm.CALLDATACOPY, vm.CODECOPY: + setMem = true + } + if setMem && ot.lastMemLen > 0 { + cpy := memory.GetCopy(ot.lastMemOff, ot.lastMemLen) + if len(cpy) == 0 { + cpy = make([]byte, ot.lastMemLen) + } + ot.lastVmOp.Ex.Mem = &VmTraceMem{Data: fmt.Sprintf("0x%0x", cpy), Off: int(ot.lastMemOff)} + } + } + if ot.lastOffStack != nil { + ot.lastOffStack.Ex.Used = int(gas) + ot.lastOffStack.Ex.Push = []string{st.Back(0).String()} + if ot.lastMemLen > 0 && memory != nil { + cpy := memory.GetCopy(ot.lastMemOff, ot.lastMemLen) + if len(cpy) == 0 { + cpy = make([]byte, ot.lastMemLen) + } + ot.lastOffStack.Ex.Mem = &VmTraceMem{Data: fmt.Sprintf("0x%0x", cpy), Off: int(ot.lastMemOff)} + } + ot.lastOffStack = nil + } + if ot.lastOp == vm.STOP && op == vm.STOP && len(ot.vmOpStack) == 0 { + // Looks like OE is "optimising away" the second STOP + return + } + ot.lastVmOp = &VmTraceOp{Ex: &VmTraceEx{}} + vmTrace.Ops = append(vmTrace.Ops, ot.lastVmOp) + if !ot.compat { + var sb strings.Builder + for _, idx := range ot.idx { + sb.WriteString(idx) + } + ot.lastVmOp.Idx = fmt.Sprintf("%s%d", sb.String(), len(vmTrace.Ops)-1) + } + ot.lastOp = op + ot.lastVmOp.Cost = int(cost) + ot.lastVmOp.Pc = int(pc) + ot.lastVmOp.Ex.Push = []string{} + ot.lastVmOp.Ex.Used = int(gas) - int(cost) + if !ot.compat { + ot.lastVmOp.Op = op.String() + } + switch op { + case vm.MSTORE, vm.MLOAD: + ot.lastMemOff = st.Back(0).Uint64() + ot.lastMemLen = 32 + case vm.MSTORE8: + ot.lastMemOff = st.Back(0).Uint64() + ot.lastMemLen = 1 + case vm.RETURNDATACOPY, vm.CALLDATACOPY, vm.CODECOPY: + ot.lastMemOff = st.Back(0).Uint64() + ot.lastMemLen = st.Back(2).Uint64() + case vm.STATICCALL, vm.DELEGATECALL: + ot.memOffStack = append(ot.memOffStack, st.Back(4).Uint64()) + ot.memLenStack = append(ot.memLenStack, st.Back(5).Uint64()) + case vm.CALL, vm.CALLCODE: + ot.memOffStack = append(ot.memOffStack, st.Back(5).Uint64()) + ot.memLenStack = append(ot.memLenStack, st.Back(6).Uint64()) + case vm.CREATE, vm.CREATE2: + // Effectively disable memory output + ot.memOffStack = append(ot.memOffStack, 0) + ot.memLenStack = append(ot.memLenStack, 0) + case vm.SSTORE: + ot.lastVmOp.Ex.Store = &VmTraceStore{Key: st.Back(0).String(), Val: st.Back(1).String()} + } + if ot.lastVmOp.Ex.Used < 0 { + ot.lastVmOp.Ex = nil + } + } } -func (ot *OeTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, contract *vm.Contract, opDepth int, err error) error { - return nil +func (ot *OeTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, opDepth int, err error) { } func (ot *OeTracer) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { @@ -508,30 +695,29 @@ func (api *TraceAPIImpl) ReplayTransaction(ctx context.Context, txHash common.Ha return nil, err } - blockNumber, err := rawdb.ReadTxLookupEntry(tx, txHash) + blockNum, ok, err := api.txnLookup(ctx, tx, txHash) if err != nil { return nil, err } - if blockNumber == nil { - return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 + if !ok { + return nil, nil } - - // Extract transactions from block - block, _, bErr := rawdb.ReadBlockByNumberWithSenders(tx, *blockNumber) - if bErr != nil { - return nil, bErr + block, err := api.blockByNumberWithSenders(tx, blockNum) + if err != nil { + return nil, err } if block == nil { - return nil, fmt.Errorf("could not find block %d", *blockNumber) + return nil, nil } - var txIndex int - for idx, txn := range block.Transactions() { - if txn.Hash() == txHash { - txIndex = idx + var txnIndex uint64 + for i, transaction := range block.Transactions() { + if transaction.Hash() == txHash { + txnIndex = uint64(i) break } } - bn := hexutil.Uint64(*blockNumber) + + bn := hexutil.Uint64(blockNum) parentNr := bn if parentNr > 0 { @@ -539,7 +725,7 @@ func (api *TraceAPIImpl) ReplayTransaction(ctx context.Context, txHash common.Ha } // Returns an array of trace arrays, one trace array for each transaction - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), traceTypes, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, *blockNumber)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), traceTypes, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), int(txnIndex), types.MakeSigner(chainConfig, blockNum), chainConfig.Rules(blockNum)) if err != nil { return nil, err } @@ -561,7 +747,7 @@ func (api *TraceAPIImpl) ReplayTransaction(ctx context.Context, txHash common.Ha for txno, trace := range traces { // We're only looking for a specific transaction - if txno == txIndex { + if txno == int(txnIndex) { result.Output = trace.Output if traceTypeTrace { result.Trace = trace.Trace @@ -591,7 +777,7 @@ func (api *TraceAPIImpl) ReplayBlockTransactions(ctx context.Context, blockNrOrH return nil, err } - blockNumber, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) + blockNumber, _, _, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, api.filters) if err != nil { return nil, err } @@ -601,7 +787,7 @@ func (api *TraceAPIImpl) ReplayBlockTransactions(ctx context.Context, blockNrOrH parentNr -= 1 } // Extract transactions from block - block, _, bErr := rawdb.ReadBlockByNumberWithSenders(tx, blockNumber) + block, bErr := api.blockByNumberWithSenders(tx, blockNumber) if bErr != nil { return nil, bErr } @@ -623,21 +809,19 @@ func (api *TraceAPIImpl) ReplayBlockTransactions(ctx context.Context, blockNrOrH } // Returns an array of trace arrays, one trace array for each transaction - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), traceTypes, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNumber)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), traceTypes, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNumber), chainConfig.Rules(blockNumber)) if err != nil { return nil, err } - if traceTypeVmTrace { - return nil, fmt.Errorf("vmTrace not implemented yet") - } - result := make([]*TraceCallResult, len(traces)) for i, trace := range traces { tr := &TraceCallResult{} tr.Output = trace.Output if traceTypeTrace { tr.Trace = trace.Trace + } else { + tr.Trace = []*ParityTrace{} } if traceTypeStateDiff { tr.StateDiff = trace.StateDiff @@ -670,22 +854,31 @@ func (api *TraceAPIImpl) Call(ctx context.Context, args TraceCallParam, traceTyp var num = rpc.LatestBlockNumber blockNrOrHash = &rpc.BlockNumberOrHash{BlockNumber: &num} } - blockNumber, hash, err := rpchelper.GetBlockNumber(*blockNrOrHash, tx, api.filters) + + blockNumber, hash, latest, err := rpchelper.GetBlockNumber(*blockNrOrHash, tx, api.filters) if err != nil { return nil, err } var stateReader state.StateReader - if num, ok := blockNrOrHash.Number(); ok && num == rpc.LatestBlockNumber { - stateReader = state.NewPlainStateReader(tx) + if latest { + cacheView, err := api.stateCache.View(ctx, tx) + if err != nil { + return nil, err + } + stateReader = state.NewCachedReader2(cacheView, tx) } else { stateReader = state.NewPlainState(tx, blockNumber) } ibs := state.New(stateReader) - header := rawdb.ReadHeader(tx, hash, blockNumber) - if header == nil { + block, err := api.blockWithSenders(tx, hash, blockNumber) + if err != nil { + return nil, err + } + if block == nil { return nil, fmt.Errorf("block %d(%x) not found", blockNumber, hash) } + header := block.Header() // Setup context so it may be cancelled the call has completed // or, in case of unmetered gas, setup a context with a timeout. @@ -714,9 +907,12 @@ func (api *TraceAPIImpl) Call(ctx context.Context, args TraceCallParam, traceTyp return nil, fmt.Errorf("unrecognized trace type: %s", traceType) } } + if traceTypeVmTrace { + traceResult.VmTrace = &VmTrace{Ops: []*VmTraceOp{}} + } var ot OeTracer ot.compat = api.compatibility - if traceTypeTrace { + if traceTypeTrace || traceTypeVmTrace { ot.r = traceResult ot.traceAddr = []int{} } @@ -735,7 +931,11 @@ func (api *TraceAPIImpl) Call(ctx context.Context, args TraceCallParam, traceTyp return nil, err } - blockCtx, txCtx := transactions.GetEvmContext(msg, header, blockNrOrHash.RequireCanonical, tx) + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + blockCtx, txCtx := transactions.GetEvmContext(msg, header, blockNrOrHash.RequireCanonical, tx, contractHasTEVM) blockCtx.GasLimit = math.MaxUint64 blockCtx.MaxGasLimit = true @@ -760,16 +960,13 @@ func (api *TraceAPIImpl) Call(ctx context.Context, args TraceCallParam, traceTyp sdMap := make(map[common.Address]*StateDiffAccount) traceResult.StateDiff = sdMap sd := &StateDiff{sdMap: sdMap} - if err = ibs.FinalizeTx(evm.ChainRules, sd); err != nil { + if err = ibs.FinalizeTx(evm.ChainRules(), sd); err != nil { return nil, err } // Create initial IntraBlockState, we will compare it with ibs (IntraBlockState after the transaction) initialIbs := state.New(stateReader) sd.CompareStates(initialIbs, ibs) } - if traceTypeVmTrace { - return nil, fmt.Errorf("vmTrace not implemented yet") - } // If the timer caused an abort, return an appropriate error message if evm.Cancelled() { @@ -832,11 +1029,17 @@ func (api *TraceAPIImpl) CallMany(ctx context.Context, calls json.RawMessage, pa var num = rpc.LatestBlockNumber parentNrOrHash = &rpc.BlockNumberOrHash{BlockNumber: &num} } - blockNumber, hash, err := rpchelper.GetBlockNumber(*parentNrOrHash, dbtx, api.filters) + blockNumber, hash, _, err := rpchelper.GetBlockNumber(*parentNrOrHash, dbtx, api.filters) + if err != nil { + return nil, err + } + + // TODO: can read here only parent header + parentBlock, err := api.blockWithSenders(dbtx, hash, blockNumber) if err != nil { return nil, err } - parentHeader := rawdb.ReadHeader(dbtx, hash, blockNumber) + parentHeader := parentBlock.Header() if parentHeader == nil { return nil, fmt.Errorf("parent header %d(%x) not found", blockNumber, hash) } @@ -868,22 +1071,31 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type var num = rpc.LatestBlockNumber parentNrOrHash = &rpc.BlockNumberOrHash{BlockNumber: &num} } - blockNumber, hash, err := rpchelper.GetBlockNumber(*parentNrOrHash, dbtx, api.filters) + blockNumber, hash, latest, err := rpchelper.GetBlockNumber(*parentNrOrHash, dbtx, api.filters) if err != nil { return nil, err } var stateReader state.StateReader - if num, ok := parentNrOrHash.Number(); ok && num == rpc.LatestBlockNumber { - stateReader = state.NewPlainStateReader(dbtx) + if latest { + cacheView, err := api.stateCache.View(ctx, dbtx) + if err != nil { + return nil, err + } + stateReader = state.NewCachedReader2(cacheView, dbtx) // this cache stays between RPC calls } else { - stateReader = state.NewPlainState(dbtx, blockNumber) + stateReader = state.NewPlainState(dbtx, blockNumber+1) } - stateCache := shards.NewStateCache(32, 0 /* no limit */) + stateCache := shards.NewStateCache(32, 0 /* no limit */) // this cache living only during current RPC call, but required to store state writes cachedReader := state.NewCachedReader(stateReader, stateCache) noop := state.NewNoopWriter() cachedWriter := state.NewCachedWriter(noop, stateCache) - parentHeader := rawdb.ReadHeader(dbtx, hash, blockNumber) + // TODO: can read here only parent header + parentBlock, err := api.blockWithSenders(dbtx, hash, blockNumber) + if err != nil { + return nil, err + } + parentHeader := parentBlock.Header() if parentHeader == nil { return nil, fmt.Errorf("parent header %d(%x) not found", blockNumber, hash) } @@ -902,8 +1114,19 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type defer cancel() results := []*TraceCallResult{} + useParent := false + if header == nil { + header = parentHeader + useParent = true + } + + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(dbtx) + } + for txIndex, msg := range msgs { - if err := common.Stopped(ctx.Done()); err != nil { + if err := libcommon.Stopped(ctx.Done()); err != nil { return nil, err } traceResult := &TraceCallResult{Trace: []*ParityTrace{}} @@ -922,22 +1145,23 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type } } vmConfig := vm.Config{} - if traceTypeTrace && (txIndexNeeded == -1 || txIndex == txIndexNeeded) { + if (traceTypeTrace && (txIndexNeeded == -1 || txIndex == txIndexNeeded)) || traceTypeVmTrace { var ot OeTracer ot.compat = api.compatibility ot.r = traceResult - ot.traceAddr = []int{} + ot.idx = []string{fmt.Sprintf("%d-", txIndex)} + if traceTypeTrace && (txIndexNeeded == -1 || txIndex == txIndexNeeded) { + ot.traceAddr = []int{} + } + if traceTypeVmTrace { + traceResult.VmTrace = &VmTrace{Ops: []*VmTraceOp{}} + } vmConfig.Debug = true vmConfig.Tracer = &ot } // Get a new instance of the EVM. - useParent := false - if header == nil { - header = parentHeader - useParent = true - } - blockCtx, txCtx := transactions.GetEvmContext(msg, header, parentNrOrHash.RequireCanonical, dbtx) + blockCtx, txCtx := transactions.GetEvmContext(msg, header, parentNrOrHash.RequireCanonical, dbtx, contractHasTEVM) if useParent { blockCtx.GasLimit = math.MaxUint64 blockCtx.MaxGasLimit = true @@ -970,24 +1194,23 @@ func (api *TraceAPIImpl) doCallMany(ctx context.Context, dbtx kv.Tx, msgs []type sdMap := make(map[common.Address]*StateDiffAccount) traceResult.StateDiff = sdMap sd := &StateDiff{sdMap: sdMap} - if err = ibs.FinalizeTx(evm.ChainRules, sd); err != nil { + if err = ibs.FinalizeTx(evm.ChainRules(), sd); err != nil { return nil, err } sd.CompareStates(initialIbs, ibs) - if err = ibs.CommitBlock(evm.ChainRules, cachedWriter); err != nil { + if err = ibs.CommitBlock(evm.ChainRules(), cachedWriter); err != nil { return nil, err } } else { - if err = ibs.FinalizeTx(evm.ChainRules, noop); err != nil { + if err = ibs.FinalizeTx(evm.ChainRules(), noop); err != nil { return nil, err } - if err = ibs.CommitBlock(evm.ChainRules, cachedWriter); err != nil { + if err = ibs.CommitBlock(evm.ChainRules(), cachedWriter); err != nil { return nil, err } } - - if traceTypeVmTrace { - return nil, fmt.Errorf("vmTrace not implemented yet") + if !traceTypeTrace { + traceResult.Trace = []*ParityTrace{} } results = append(results, traceResult) } diff --git a/cmd/rpcdaemon/commands/trace_adhoc_test.go b/cmd/rpcdaemon/commands/trace_adhoc_test.go index a2f8df2008d..b3b2ea5f843 100644 --- a/cmd/rpcdaemon/commands/trace_adhoc_test.go +++ b/cmd/rpcdaemon/commands/trace_adhoc_test.go @@ -6,18 +6,21 @@ import ( "testing" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/stretchr/testify/require" ) func TestEmptyQuery(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewTraceAPI(NewBaseApi(nil), db, &cli.Flags{}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewTraceAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, &httpcfg.HttpCfg{}) // Call GetTransactionReceipt for transaction which is not in the database var latest = rpc.LatestBlockNumber results, err := api.CallMany(context.Background(), json.RawMessage("[]"), &rpc.BlockNumberOrHash{BlockNumber: &latest}) @@ -33,7 +36,8 @@ func TestEmptyQuery(t *testing.T) { } func TestCoinbaseBalance(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewTraceAPI(NewBaseApi(nil), db, &cli.Flags{}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewTraceAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, &httpcfg.HttpCfg{}) // Call GetTransactionReceipt for transaction which is not in the database var latest = rpc.LatestBlockNumber results, err := api.CallMany(context.Background(), json.RawMessage(` @@ -59,7 +63,8 @@ func TestCoinbaseBalance(t *testing.T) { func TestReplayTransaction(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewTraceAPI(NewBaseApi(nil), db, &cli.Flags{}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewTraceAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, &httpcfg.HttpCfg{}) var txnHash common.Hash if err := db.View(context.Background(), func(tx kv.Tx) error { b, err := rawdb.ReadBlockByNumber(tx, 6) @@ -86,7 +91,8 @@ func TestReplayTransaction(t *testing.T) { func TestReplayBlockTransactions(t *testing.T) { db := rpcdaemontest.CreateTestKV(t) - api := NewTraceAPI(NewBaseApi(nil), db, &cli.Flags{}) + stateCache := kvcache.New(kvcache.DefaultCoherentConfig) + api := NewTraceAPI(NewBaseApi(nil, stateCache, snapshotsync.NewBlockReader(), false), db, &httpcfg.HttpCfg{}) // Call GetTransactionReceipt for transaction which is not in the database n := rpc.BlockNumber(6) diff --git a/cmd/rpcdaemon/commands/trace_api.go b/cmd/rpcdaemon/commands/trace_api.go index df58c8c747b..d71dc1d4b84 100644 --- a/cmd/rpcdaemon/commands/trace_api.go +++ b/cmd/rpcdaemon/commands/trace_api.go @@ -6,7 +6,7 @@ import ( jsoniter "github.com/json-iterator/go" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/rpc" @@ -38,7 +38,7 @@ type TraceAPIImpl struct { } // NewTraceAPI returns NewTraceAPI instance -func NewTraceAPI(base *BaseAPI, kv kv.RoDB, cfg *cli.Flags) *TraceAPIImpl { +func NewTraceAPI(base *BaseAPI, kv kv.RoDB, cfg *httpcfg.HttpCfg) *TraceAPIImpl { return &TraceAPIImpl{ BaseAPI: base, kv: kv, diff --git a/cmd/rpcdaemon/commands/trace_filtering.go b/cmd/rpcdaemon/commands/trace_filtering.go index 82694f0a83c..fdae1610393 100644 --- a/cmd/rpcdaemon/commands/trace_filtering.go +++ b/cmd/rpcdaemon/commands/trace_filtering.go @@ -2,17 +2,21 @@ package commands import ( "context" + "errors" "fmt" "github.com/RoaringBitmap/roaring/roaring64" jsoniter "github.com/json-iterator/go" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/bitmapdb" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" ) @@ -28,21 +32,28 @@ func (api *TraceAPIImpl) Transaction(ctx context.Context, txHash common.Hash) (P return nil, err } - blockNumber, err := rawdb.ReadTxLookupEntry(tx, txHash) + blockNumber, ok, err := api.txnLookup(ctx, tx, txHash) if err != nil { return nil, err } - if blockNumber == nil { - return nil, nil // not error, see https://github.com/ledgerwatch/erigon/issues/1645 + if !ok { + return nil, nil + } + block, err := api.blockByNumberWithSenders(tx, blockNumber) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil } // Extract transactions from block - block, _, bErr := rawdb.ReadBlockByNumberWithSenders(tx, *blockNumber) + block, bErr := api.blockByNumberWithSenders(tx, blockNumber) if bErr != nil { return nil, bErr } if block == nil { - return nil, fmt.Errorf("could not find block %d", *blockNumber) + return nil, fmt.Errorf("could not find block %d", blockNumber) } var txIndex int for idx, txn := range block.Transactions() { @@ -51,7 +62,7 @@ func (api *TraceAPIImpl) Transaction(ctx context.Context, txHash common.Hash) (P break } } - bn := hexutil.Uint64(*blockNumber) + bn := hexutil.Uint64(blockNumber) parentNr := bn if parentNr > 0 { @@ -60,7 +71,7 @@ func (api *TraceAPIImpl) Transaction(ctx context.Context, txHash common.Hash) (P hash := block.Hash() // Returns an array of trace arrays, one trace array for each transaction - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, *blockNumber)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), txIndex, types.MakeSigner(chainConfig, blockNumber), chainConfig.Rules(blockNumber)) if err != nil { return nil, err } @@ -118,20 +129,20 @@ func (api *TraceAPIImpl) Block(ctx context.Context, blockNr rpc.BlockNumber) (Pa if err != nil { return nil, err } + if blockNum == 0 { + return []ParityTrace{}, nil + } bn := hexutil.Uint64(blockNum) // Extract transactions from block - hash, hashErr := rawdb.ReadCanonicalHash(tx, blockNum) - if hashErr != nil { - return nil, hashErr - } - block, _, bErr := rawdb.ReadBlockWithSenders(tx, hash, uint64(bn)) + block, bErr := api.blockByNumberWithSenders(tx, blockNum) if bErr != nil { return nil, bErr } if block == nil { - return nil, fmt.Errorf("could not find block %x %d", hash, uint64(bn)) + return nil, fmt.Errorf("could not find block %d", uint64(bn)) } + hash := block.Hash() parentNr := bn if parentNr > 0 { @@ -142,7 +153,7 @@ func (api *TraceAPIImpl) Block(ctx context.Context, blockNr rpc.BlockNumber) (Pa if err != nil { return nil, err } - traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNum)) + traces, err := api.callManyTransactions(ctx, tx, block.Transactions(), []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(parentNr), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, blockNum), chainConfig.Rules(blockNum)) if err != nil { return nil, err } @@ -202,7 +213,7 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str dbtx, err1 := api.kv.BeginRo(ctx) if err1 != nil { stream.WriteNil() - return fmt.Errorf("traceFilter cannot open tx: %v", err1) + return fmt.Errorf("traceFilter cannot open tx: %w", err1) } defer dbtx.Rollback() @@ -229,11 +240,18 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str fromAddresses := make(map[common.Address]struct{}, len(req.FromAddress)) toAddresses := make(map[common.Address]struct{}, len(req.ToAddress)) - var allBlocks roaring64.Bitmap + var ( + allBlocks roaring64.Bitmap + blocksTo roaring64.Bitmap + ) + for _, addr := range req.FromAddress { if addr != nil { b, err := bitmapdb.Get64(dbtx, kv.CallFromIndex, addr.Bytes(), fromBlock, toBlock) if err != nil { + if errors.Is(err, ethdb.ErrKeyNotFound) { + continue + } stream.WriteNil() return err } @@ -241,17 +259,31 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str fromAddresses[*addr] = struct{}{} } } + for _, addr := range req.ToAddress { if addr != nil { b, err := bitmapdb.Get64(dbtx, kv.CallToIndex, addr.Bytes(), fromBlock, toBlock) if err != nil { + if errors.Is(err, ethdb.ErrKeyNotFound) { + continue + } stream.WriteNil() return err } - allBlocks.Or(b) + blocksTo.Or(b) toAddresses[*addr] = struct{}{} } } + + switch req.Mode { + case TraceFilterModeIntersection: + allBlocks.And(&blocksTo) + case TraceFilterModeUnion: + fallthrough + default: + allBlocks.Or(&blocksTo) + } + // Special case - if no addresses specified, take all traces if len(req.FromAddress) == 0 && len(req.ToAddress) == 0 { allBlocks.AddRange(fromBlock, toBlock+1) @@ -265,11 +297,23 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str stream.WriteNil() return err } + var json = jsoniter.ConfigCompatibleWithStandardLibrary stream.WriteArrayStart() first := true // Execute all transactions in picked blocks + count := uint64(^uint(0)) // this just makes it easier to use below + if req.Count != nil { + count = *req.Count + } + after := uint64(0) // this just makes it easier to use below + if req.After != nil { + after = *req.After + } + nSeen := uint64(0) + nExported := uint64(0) + it := allBlocks.Iterator() for it.HasNext() { b := uint64(it.Next()) @@ -280,7 +324,7 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str return hashErr } - block, _, bErr := rawdb.ReadBlockWithSenders(dbtx, hash, b) + block, bErr := api.blockWithSenders(dbtx, hash, b) if bErr != nil { stream.WriteNil() return bErr @@ -293,7 +337,7 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str blockHash := block.Hash() blockNumber := block.NumberU64() txs := block.Transactions() - t, tErr := api.callManyTransactions(ctx, dbtx, txs, []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(block.NumberU64()-1), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, b)) + t, tErr := api.callManyTransactions(ctx, dbtx, txs, []string{TraceTypeTrace}, block.ParentHash(), rpc.BlockNumber(block.NumberU64()-1), block.Header(), -1 /* all tx indices */, types.MakeSigner(chainConfig, b), chainConfig.Rules(b)) if tErr != nil { stream.WriteNil() return tErr @@ -305,6 +349,7 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str // Check if transaction concerns any of the addresses we wanted for _, pt := range trace.Trace { if includeAll || filter_trace(pt, fromAddresses, toAddresses) { + nSeen++ pt.BlockHash = &blockHash pt.BlockNumber = &blockNumber pt.TransactionHash = &txHash @@ -314,17 +359,21 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str stream.WriteNil() return err } - if first { - first = false - } else { - stream.WriteMore() + if nSeen > after && nExported < count { + if first { + first = false + } else { + stream.WriteMore() + } + stream.Write(b) + nExported++ } - stream.Write(b) } } } minerReward, uncleRewards := ethash.AccumulateRewards(chainConfig, block.Header(), block.Uncles()) if _, ok := toAddresses[block.Coinbase()]; ok || includeAll { + nSeen++ var tr ParityTrace var rewardAction = &RewardTraceAction{} rewardAction.Author = block.Coinbase() @@ -342,16 +391,20 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str stream.WriteNil() return err } - if first { - first = false - } else { - stream.WriteMore() + if nSeen > after && nExported < count { + if first { + first = false + } else { + stream.WriteMore() + } + stream.Write(b) + nExported++ } - stream.Write(b) } for i, uncle := range block.Uncles() { if _, ok := toAddresses[uncle.Coinbase]; ok || includeAll { if i < len(uncleRewards) { + nSeen++ var tr ParityTrace rewardAction := &RewardTraceAction{} rewardAction.Author = uncle.Coinbase @@ -369,12 +422,15 @@ func (api *TraceAPIImpl) Filter(ctx context.Context, req TraceFilterRequest, str stream.WriteNil() return err } - if first { - first = false - } else { - stream.WriteMore() + if nSeen > after && nExported < count { + if first { + first = false + } else { + stream.WriteMore() + } + stream.Write(b) + nExported++ } - stream.Write(b) } } } @@ -415,7 +471,7 @@ func filter_trace(pt *ParityTrace, fromAddresses map[common.Address]struct{}, to return false } -func (api *TraceAPIImpl) callManyTransactions(ctx context.Context, dbtx kv.Tx, txs []types.Transaction, traceTypes []string, parentHash common.Hash, parentNo rpc.BlockNumber, header *types.Header, txIndex int, signer *types.Signer) ([]*TraceCallResult, error) { +func (api *TraceAPIImpl) callManyTransactions(ctx context.Context, dbtx kv.Tx, txs []types.Transaction, traceTypes []string, parentHash common.Hash, parentNo rpc.BlockNumber, header *types.Header, txIndex int, signer *types.Signer, rules *params.Rules) ([]*TraceCallResult, error) { callParams := make([]TraceCallParam, 0, len(txs)) msgs := make([]types.Message, len(txs)) for i, tx := range txs { @@ -425,7 +481,7 @@ func (api *TraceAPIImpl) callManyTransactions(ctx context.Context, dbtx kv.Tx, t traceTypes: traceTypes, }) var err error - if msgs[i], err = tx.AsMessage(*signer, header.BaseFee); err != nil { + if msgs[i], err = tx.AsMessage(*signer, header.BaseFee, rules); err != nil { return nil, fmt.Errorf("convert tx into msg: %w", err) } } @@ -449,6 +505,16 @@ type TraceFilterRequest struct { ToBlock *hexutil.Uint64 `json:"toBlock"` FromAddress []*common.Address `json:"fromAddress"` ToAddress []*common.Address `json:"toAddress"` + Mode TraceFilterMode `json:"mode"` After *uint64 `json:"after"` Count *uint64 `json:"count"` } + +type TraceFilterMode string + +const ( + // Default mode for TraceFilter. Unions results referred to addresses from FromAddress or ToAddress + TraceFilterModeUnion = "union" + // IntersectionMode retrives results referred to addresses provided both in FromAddress and ToAddress + TraceFilterModeIntersection = "intersection" +) diff --git a/cmd/rpcdaemon/commands/trace_types.go b/cmd/rpcdaemon/commands/trace_types.go index d4c45ffaae4..2b98c70bdb0 100644 --- a/cmd/rpcdaemon/commands/trace_types.go +++ b/cmd/rpcdaemon/commands/trace_types.go @@ -44,8 +44,8 @@ type ParityTrace struct { Result interface{} `json:"result"` Subtraces int `json:"subtraces"` TraceAddress []int `json:"traceAddress"` - TransactionHash *common.Hash `json:"transactionHash"` - TransactionPosition *uint64 `json:"transactionPosition"` + TransactionHash *common.Hash `json:"transactionHash,omitempty"` + TransactionPosition *uint64 `json:"transactionPosition,omitempty"` Type string `json:"type"` } diff --git a/cmd/rpcdaemon/commands/tracing.go b/cmd/rpcdaemon/commands/tracing.go index 87f4f928aae..26312b8a78d 100644 --- a/cmd/rpcdaemon/commands/tracing.go +++ b/cmd/rpcdaemon/commands/tracing.go @@ -11,49 +11,163 @@ import ( "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/eth/tracers" + "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/internal/ethapi" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/erigon/turbo/rpchelper" "github.com/ledgerwatch/erigon/turbo/transactions" + "github.com/ledgerwatch/log/v3" ) -// TraceTransaction implements debug_traceTransaction. Returns Geth style transaction traces. -func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash common.Hash, config *tracers.TraceConfig, stream *jsoniter.Stream) error { +// TraceBlockByNumber implements debug_traceBlockByNumber. Returns Geth style block traces. +func (api *PrivateDebugAPIImpl) TraceBlockByNumber(ctx context.Context, blockNum rpc.BlockNumber, config *tracers.TraceConfig, stream *jsoniter.Stream) error { + return api.traceBlock(ctx, rpc.BlockNumberOrHashWithNumber(blockNum), config, stream) +} + +// TraceBlockByHash implements debug_traceBlockByHash. Returns Geth style block traces. +func (api *PrivateDebugAPIImpl) TraceBlockByHash(ctx context.Context, hash common.Hash, config *tracers.TraceConfig, stream *jsoniter.Stream) error { + return api.traceBlock(ctx, rpc.BlockNumberOrHashWithHash(hash, true), config, stream) +} + +func (api *PrivateDebugAPIImpl) traceBlock(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash, config *tracers.TraceConfig, stream *jsoniter.Stream) error { tx, err := api.db.BeginRo(ctx) if err != nil { stream.WriteNil() return err } defer tx.Rollback() + var block *types.Block + if number, ok := blockNrOrHash.Number(); ok { + block, err = api.blockByRPCNumber(number, tx) + } else if hash, ok := blockNrOrHash.Hash(); ok { + block, err = api.blockByHashWithSenders(tx, hash) + } else { + return fmt.Errorf("invalid arguments; neither block nor hash specified") + } - // Retrieve the transaction and assemble its EVM context - txn, blockHash, _, txIndex, err := rawdb.ReadTransaction(tx, hash) if err != nil { + stream.WriteNil() return err } - if txn == nil { + + chainConfig, err := api.chainConfig(tx) + if err != nil { stream.WriteNil() - return fmt.Errorf("transaction %#x not found", hash) + return err } - chainConfig, err := api.chainConfig(tx) + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + + getHeader := func(hash common.Hash, number uint64) *types.Header { + h, e := api._blockReader.Header(ctx, tx, hash, number) + if e != nil { + log.Error("getHeader error", "number", number, "hash", hash, "err", e) + } + return h + } + + _, blockCtx, _, ibs, reader, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, block.Hash(), 0) if err != nil { stream.WriteNil() return err } - block, _, err := rawdb.ReadBlockByHashWithSenders(tx, blockHash) + signer := types.MakeSigner(chainConfig, block.NumberU64()) + rules := chainConfig.Rules(block.NumberU64()) + stream.WriteArrayStart() + for idx, tx := range block.Transactions() { + select { + default: + case <-ctx.Done(): + stream.WriteNil() + return ctx.Err() + } + ibs.Prepare(tx.Hash(), block.Hash(), idx) + msg, _ := tx.AsMessage(*signer, block.BaseFee(), rules) + txCtx := vm.TxContext{ + TxHash: tx.Hash(), + Origin: msg.From(), + GasPrice: msg.GasPrice().ToBig(), + } + + transactions.TraceTx(ctx, msg, blockCtx, txCtx, ibs, config, chainConfig, stream) + _ = ibs.FinalizeTx(rules, reader) + if idx != len(block.Transactions())-1 { + stream.WriteMore() + } + stream.Flush() + } + stream.WriteArrayEnd() + stream.Flush() + return nil +} + +// TraceTransaction implements debug_traceTransaction. Returns Geth style transaction traces. +func (api *PrivateDebugAPIImpl) TraceTransaction(ctx context.Context, hash common.Hash, config *tracers.TraceConfig, stream *jsoniter.Stream) error { + tx, err := api.db.BeginRo(ctx) + if err != nil { + stream.WriteNil() + return err + } + defer tx.Rollback() + // Retrieve the transaction and assemble its EVM context + blockNum, ok, err := api.txnLookup(ctx, tx, hash) + if err != nil { + return err + } + if !ok { + return nil + } + block, err := api.blockByNumberWithSenders(tx, blockNum) if err != nil { return err } if block == nil { return nil } + blockHash := block.Hash() + var txnIndex uint64 + var txn types.Transaction + for i, transaction := range block.Transactions() { + if transaction.Hash() == hash { + txnIndex = uint64(i) + txn = transaction + break + } + } + if txn == nil { + var borTx *types.Transaction + borTx, _, _, _, err = rawdb.ReadBorTransaction(tx, hash) + + if err != nil { + return err + } + + if borTx != nil { + return nil + } + stream.WriteNil() + return fmt.Errorf("transaction %#x not found", hash) + } + chainConfig, err := api.chainConfig(tx) + if err != nil { + stream.WriteNil() + return err + } + getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } - msg, blockCtx, txCtx, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, nil /* checkTEVM */, ethash.NewFaker(), tx, blockHash, txIndex) + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(tx) + } + msg, blockCtx, txCtx, ibs, _, err := transactions.ComputeTxEnv(ctx, block, chainConfig, getHeader, contractHasTEVM, ethash.NewFaker(), tx, blockHash, txnIndex) if err != nil { stream.WriteNil() return err @@ -76,14 +190,18 @@ func (api *PrivateDebugAPIImpl) TraceCall(ctx context.Context, args ethapi.CallA return err } - blockNumber, hash, err := rpchelper.GetBlockNumber(blockNrOrHash, dbtx, api.filters) + blockNumber, hash, latest, err := rpchelper.GetBlockNumber(blockNrOrHash, dbtx, api.filters) if err != nil { stream.WriteNil() return err } var stateReader state.StateReader - if num, ok := blockNrOrHash.Number(); ok && num == rpc.LatestBlockNumber { - stateReader = state.NewPlainStateReader(dbtx) + if latest { + cacheView, err := api.stateCache.View(ctx, dbtx) + if err != nil { + return err + } + stateReader = state.NewCachedReader2(cacheView, dbtx) } else { stateReader = state.NewPlainState(dbtx, blockNumber) } @@ -94,6 +212,12 @@ func (api *PrivateDebugAPIImpl) TraceCall(ctx context.Context, args ethapi.CallA } ibs := state.New(stateReader) + if config != nil && config.StateOverrides != nil { + if err := config.StateOverrides.Override(ibs); err != nil { + return err + } + } + var baseFee *uint256.Int if header != nil && header.BaseFee != nil { var overflow bool @@ -106,7 +230,12 @@ func (api *PrivateDebugAPIImpl) TraceCall(ctx context.Context, args ethapi.CallA if err != nil { return err } - blockCtx, txCtx := transactions.GetEvmContext(msg, header, blockNrOrHash.RequireCanonical, dbtx) + + contractHasTEVM := func(contractHash common.Hash) (bool, error) { return false, nil } + if api.TevmEnabled { + contractHasTEVM = ethdb.GetHasTEVM(dbtx) + } + blockCtx, txCtx := transactions.GetEvmContext(msg, header, blockNrOrHash.RequireCanonical, dbtx, contractHasTEVM) // Trace the transaction and return return transactions.TraceTx(ctx, msg, blockCtx, txCtx, ibs, config, chainConfig, stream) } diff --git a/cmd/rpcdaemon/commands/txpool_api.go b/cmd/rpcdaemon/commands/txpool_api.go index bb6a321fc9f..eccb66bc4f5 100644 --- a/cmd/rpcdaemon/commands/txpool_api.go +++ b/cmd/rpcdaemon/commands/txpool_api.go @@ -5,9 +5,11 @@ import ( "context" "fmt" + "github.com/ledgerwatch/erigon-lib/gointerfaces" proto_txpool "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/rlp" @@ -42,10 +44,12 @@ func (api *TxPoolAPIImpl) Content(ctx context.Context) (map[string]map[string]ma content := map[string]map[string]map[string]*RPCTransaction{ "pending": make(map[string]map[string]*RPCTransaction), + "baseFee": make(map[string]map[string]*RPCTransaction), "queued": make(map[string]map[string]*RPCTransaction), } pending := make(map[common.Address][]types.Transaction, 8) + baseFee := make(map[common.Address][]types.Transaction, 8) queued := make(map[common.Address][]types.Transaction, 8) for i := range reply.Txs { stream := rlp.NewStream(bytes.NewReader(reply.Txs[i].RlpTx), 0) @@ -53,13 +57,18 @@ func (api *TxPoolAPIImpl) Content(ctx context.Context) (map[string]map[string]ma if err != nil { return nil, err } - addr := common.BytesToAddress(reply.Txs[i].Sender) - switch reply.Txs[i].Type { + addr := gointerfaces.ConvertH160toAddress(reply.Txs[i].Sender) + switch reply.Txs[i].TxnType { case proto_txpool.AllReply_PENDING: if _, ok := pending[addr]; !ok { pending[addr] = make([]types.Transaction, 0, 4) } pending[addr] = append(pending[addr], txn) + case proto_txpool.AllReply_BASE_FEE: + if _, ok := baseFee[addr]; !ok { + baseFee[addr] = make([]types.Transaction, 0, 4) + } + baseFee[addr] = append(baseFee[addr], txn) case proto_txpool.AllReply_QUEUED: if _, ok := queued[addr]; !ok { queued[addr] = make([]types.Transaction, 0, 4) @@ -79,6 +88,9 @@ func (api *TxPoolAPIImpl) Content(ctx context.Context) (map[string]map[string]ma } curHeader := rawdb.ReadCurrentHeader(tx) + if curHeader == nil { + return nil, nil + } // Flatten the pending transactions for account, txs := range pending { dump := make(map[string]*RPCTransaction) @@ -87,6 +99,14 @@ func (api *TxPoolAPIImpl) Content(ctx context.Context) (map[string]map[string]ma } content["pending"][account.Hex()] = dump } + // Flatten the baseFee transactions + for account, txs := range baseFee { + dump := make(map[string]*RPCTransaction) + for _, txn := range txs { + dump[fmt.Sprintf("%d", txn.GetNonce())] = newRPCPendingTransaction(txn, curHeader, cc) + } + content["baseFee"][account.Hex()] = dump + } // Flatten the queued transactions for account, txs := range queued { dump := make(map[string]*RPCTransaction) @@ -98,17 +118,21 @@ func (api *TxPoolAPIImpl) Content(ctx context.Context) (map[string]map[string]ma return content, nil } -/* - // Status returns the number of pending and queued transaction in the pool. -func (s *PublicTxPoolAPI) Status() map[string]hexutil.Uint { - pending, queue := s.b.Stats() - return map[string]hexutil.Uint{ - "pending": hexutil.Uint(pending), - "queued": hexutil.Uint(queue), +func (api *TxPoolAPIImpl) Status(ctx context.Context) (map[string]hexutil.Uint, error) { + reply, err := api.pool.Status(ctx, &proto_txpool.StatusRequest{}) + if err != nil { + return nil, err } + return map[string]hexutil.Uint{ + "pending": hexutil.Uint(reply.PendingCount), + "baseFee": hexutil.Uint(reply.BaseFeeCount), + "queued": hexutil.Uint(reply.QueuedCount), + }, nil } +/* + // Inspect retrieves the content of the transaction pool and flattens it into an // easily inspectable list. func (s *PublicTxPoolAPI) Inspect() map[string]map[string]map[string]string { diff --git a/cmd/rpcdaemon/commands/txpool_api_test.go b/cmd/rpcdaemon/commands/txpool_api_test.go index 41f535569f2..972f56c5be6 100644 --- a/cmd/rpcdaemon/commands/txpool_api_test.go +++ b/cmd/rpcdaemon/commands/txpool_api_test.go @@ -2,81 +2,63 @@ package commands import ( "bytes" - "math/big" + "fmt" "testing" "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" + txPoolProto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/u256" + "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages" "github.com/stretchr/testify/require" ) func TestTxPoolContent(t *testing.T) { - m, require := stages.Mock(t), require.New(t) + m, require := stages.MockWithTxPool(t), require.New(t) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) + require.NoError(err) + err = m.InsertChain(chain) require.NoError(err) - { // Do 1 step to start txPool - - // Send NewBlock message - b, err := rlp.EncodeToBytes(ð.NewBlockPacket{ - Block: chain.TopBlock, - TD: big.NewInt(1), // This is ignored anyway - }) - require.NoError(err) - m.ReceiveWg.Add(1) - for _, err = range m.Send(&sentry.InboundMessage{Id: sentry.MessageId_NEW_BLOCK_66, Data: b, PeerId: m.PeerId}) { - require.NoError(err) - } - // Send all the headers - b, err = rlp.EncodeToBytes(ð.BlockHeadersPacket66{ - RequestId: 1, - BlockHeadersPacket: chain.Headers, - }) - require.NoError(err) - m.ReceiveWg.Add(1) - for _, err = range m.Send(&sentry.InboundMessage{Id: sentry.MessageId_BLOCK_HEADERS_66, Data: b, PeerId: m.PeerId}) { - require.NoError(err) - } - m.ReceiveWg.Wait() // Wait for all messages to be processed before we proceeed - - initialCycle := true - highestSeenHeader := chain.TopBlock.NumberU64() - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { - t.Fatal(err) - } - } ctx, conn := rpcdaemontest.CreateTestGrpcConn(t, m) txPool := txpool.NewTxpoolClient(conn) - ff := filters.New(ctx, nil, txPool, txpool.NewMiningClient(conn)) - api := NewTxPoolAPI(NewBaseApi(ff), m.DB, txPool) + ff := rpcservices.New(ctx, nil, txPool, txpool.NewMiningClient(conn), func() {}) + api := NewTxPoolAPI(NewBaseApi(ff, kvcache.New(kvcache.DefaultCoherentConfig), snapshotsync.NewBlockReader(), false), m.DB, txPool) expectValue := uint64(1234) - txn, err := types.SignTx(types.NewTransaction(0, common.Address{1}, uint256.NewInt(expectValue), params.TxGas, u256.Num1, nil), *types.LatestSignerForChainID(m.ChainConfig.ChainID), m.Key) + txn, err := types.SignTx(types.NewTransaction(0, common.Address{1}, uint256.NewInt(expectValue), params.TxGas, uint256.NewInt(10*params.GWei), nil), *types.LatestSignerForChainID(m.ChainConfig.ChainID), m.Key) require.NoError(err) buf := bytes.NewBuffer(nil) err = txn.MarshalBinary(buf) require.NoError(err) - _, err = txPool.Add(ctx, &txpool.AddRequest{RlpTxs: [][]byte{buf.Bytes()}}) + reply, err := txPool.Add(ctx, &txpool.AddRequest{RlpTxs: [][]byte{buf.Bytes()}}) require.NoError(err) + for _, res := range reply.Imported { + require.Equal(res, txPoolProto.ImportResult_SUCCESS, fmt.Sprintf("%s", reply.Errors)) + } + content, err := api.Content(ctx) require.NoError(err) sender := m.Address.String() require.Equal(1, len(content["pending"][sender])) require.Equal(expectValue, content["pending"][sender]["0"].Value.ToInt().Uint64()) + + status, err := api.Status(ctx) + require.NoError(err) + require.Len(status, 3) + require.Equal(status["pending"], hexutil.Uint(1)) + require.Equal(status["queued"], hexutil.Uint(0)) } diff --git a/cmd/rpcdaemon/commands/validator_set.go b/cmd/rpcdaemon/commands/validator_set.go new file mode 100644 index 00000000000..5ebbe35217a --- /dev/null +++ b/cmd/rpcdaemon/commands/validator_set.go @@ -0,0 +1,702 @@ +package commands + +// Tendermint leader selection algorithm + +import ( + "bytes" + "fmt" + "math" + "math/big" + "sort" + "strings" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/bor" + "github.com/ledgerwatch/log/v3" +) + +// MaxTotalVotingPower - the maximum allowed total voting power. +// It needs to be sufficiently small to, in all cases: +// 1. prevent clipping in incrementProposerPriority() +// 2. let (diff+diffMax-1) not overflow in IncrementProposerPriority() +// (Proof of 1 is tricky, left to the reader). +// It could be higher, but this is sufficiently large for our purposes, +// and leaves room for defensive purposes. +// PriorityWindowSizeFactor - is a constant that when multiplied with the total voting power gives +// the maximum allowed distance between validator priorities. + +const ( + MaxTotalVotingPower = int64(math.MaxInt64) / 8 + PriorityWindowSizeFactor = 2 +) + +// ValidatorSet represent a set of *Validator at a given height. +// The validators can be fetched by address or index. +// The index is in order of .Address, so the indices are fixed +// for all rounds of a given blockchain height - ie. the validators +// are sorted by their address. +// On the other hand, the .ProposerPriority of each validator and +// the designated .GetProposer() of a set changes every round, +// upon calling .IncrementProposerPriority(). +// NOTE: Not goroutine-safe. +// NOTE: All get/set to validators should copy the value for safety. +type ValidatorSet struct { + // NOTE: persisted via reflect, must be exported. + Validators []*bor.Validator `json:"validators"` + Proposer *bor.Validator `json:"proposer"` + + // cached (unexported) + totalVotingPower int64 +} + +// NewValidatorSet initializes a ValidatorSet by copying over the +// values from `valz`, a list of Validators. If valz is nil or empty, +// the new ValidatorSet will have an empty list of Validators. +// The addresses of validators in `valz` must be unique otherwise the +// function panics. +func NewValidatorSet(valz []*bor.Validator) *ValidatorSet { + vals := &ValidatorSet{} + err := vals.updateWithChangeSet(valz, false) + if err != nil { + panic(fmt.Sprintf("cannot create validator set: %s", err)) + } + if len(valz) > 0 { + vals.IncrementProposerPriority(1) + } + return vals +} + +// Nil or empty validator sets are invalid. +func (vals *ValidatorSet) IsNilOrEmpty() bool { + return vals == nil || len(vals.Validators) == 0 +} + +// Increment ProposerPriority and update the proposer on a copy, and return it. +func (vals *ValidatorSet) CopyIncrementProposerPriority(times int) *ValidatorSet { + copy := vals.Copy() + copy.IncrementProposerPriority(times) + return copy +} + +// IncrementProposerPriority increments ProposerPriority of each validator and updates the +// proposer. Panics if validator set is empty. +// `times` must be positive. +func (vals *ValidatorSet) IncrementProposerPriority(times int) { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + if times <= 0 { + panic("Cannot call IncrementProposerPriority with non-positive times") + } + + // Cap the difference between priorities to be proportional to 2*totalPower by + // re-normalizing priorities, i.e., rescale all priorities by multiplying with: + // 2*totalVotingPower/(maxPriority - minPriority) + diffMax := PriorityWindowSizeFactor * vals.TotalVotingPower() + vals.RescalePriorities(diffMax) + vals.shiftByAvgProposerPriority() + + var proposer *bor.Validator + // Call IncrementProposerPriority(1) times times. + for i := 0; i < times; i++ { + proposer = vals.incrementProposerPriority() + } + + vals.Proposer = proposer +} + +func (vals *ValidatorSet) RescalePriorities(diffMax int64) { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + // NOTE: This check is merely a sanity check which could be + // removed if all tests would init. voting power appropriately; + // i.e. diffMax should always be > 0 + if diffMax <= 0 { + return + } + + // Calculating ceil(diff/diffMax): + // Re-normalization is performed by dividing by an integer for simplicity. + // NOTE: This may make debugging priority issues easier as well. + diff := computeMaxMinPriorityDiff(vals) + ratio := (diff + diffMax - 1) / diffMax + if diff > diffMax { + for _, val := range vals.Validators { + val.ProposerPriority = val.ProposerPriority / ratio + } + } +} + +func (vals *ValidatorSet) incrementProposerPriority() *bor.Validator { + for _, val := range vals.Validators { + // Check for overflow for sum. + newPrio := safeAddClip(val.ProposerPriority, val.VotingPower) + val.ProposerPriority = newPrio + } + // Decrement the validator with most ProposerPriority. + mostest := vals.getValWithMostPriority() + // Mind the underflow. + mostest.ProposerPriority = safeSubClip(mostest.ProposerPriority, vals.TotalVotingPower()) + + return mostest +} + +// Should not be called on an empty validator set. +func (vals *ValidatorSet) computeAvgProposerPriority() int64 { + n := int64(len(vals.Validators)) + sum := big.NewInt(0) + for _, val := range vals.Validators { + sum.Add(sum, big.NewInt(val.ProposerPriority)) + } + avg := sum.Div(sum, big.NewInt(n)) + if avg.IsInt64() { + return avg.Int64() + } + + // This should never happen: each val.ProposerPriority is in bounds of int64. + panic(fmt.Sprintf("Cannot represent avg ProposerPriority as an int64 %v", avg)) +} + +// Compute the difference between the max and min ProposerPriority of that set. +func computeMaxMinPriorityDiff(vals *ValidatorSet) int64 { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + max := int64(math.MinInt64) + min := int64(math.MaxInt64) + for _, v := range vals.Validators { + if v.ProposerPriority < min { + min = v.ProposerPriority + } + if v.ProposerPriority > max { + max = v.ProposerPriority + } + } + diff := max - min + if diff < 0 { + return -1 * diff + } else { + return diff + } +} + +func (vals *ValidatorSet) getValWithMostPriority() *bor.Validator { + var res *bor.Validator + for _, val := range vals.Validators { + res = res.Cmp(val) + } + return res +} + +func (vals *ValidatorSet) shiftByAvgProposerPriority() { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + avgProposerPriority := vals.computeAvgProposerPriority() + for _, val := range vals.Validators { + val.ProposerPriority = safeSubClip(val.ProposerPriority, avgProposerPriority) + } +} + +// Makes a copy of the validator list. +func validatorListCopy(valsList []*bor.Validator) []*bor.Validator { + if valsList == nil { + return nil + } + valsCopy := make([]*bor.Validator, len(valsList)) + for i, val := range valsList { + valsCopy[i] = val.Copy() + } + return valsCopy +} + +// Copy each validator into a new ValidatorSet. +func (vals *ValidatorSet) Copy() *ValidatorSet { + return &ValidatorSet{ + Validators: validatorListCopy(vals.Validators), + Proposer: vals.Proposer, + totalVotingPower: vals.totalVotingPower, + } +} + +// HasAddress returns true if address given is in the validator set, false - +// otherwise. +func (vals *ValidatorSet) HasAddress(address []byte) bool { + idx := sort.Search(len(vals.Validators), func(i int) bool { + return bytes.Compare(address, vals.Validators[i].Address.Bytes()) <= 0 + }) + return idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address) +} + +// GetByAddress returns an index of the validator with address and validator +// itself if found. Otherwise, -1 and nil are returned. +func (vals *ValidatorSet) GetByAddress(address common.Address) (index int, val *bor.Validator) { + idx := sort.Search(len(vals.Validators), func(i int) bool { + return bytes.Compare(address.Bytes(), vals.Validators[i].Address.Bytes()) <= 0 + }) + if idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address.Bytes()) { + return idx, vals.Validators[idx].Copy() + } + return -1, nil +} + +// GetByIndex returns the validator's address and validator itself by index. +// It returns nil values if index is less than 0 or greater or equal to +// len(ValidatorSet.Validators). +func (vals *ValidatorSet) GetByIndex(index int) (address []byte, val *bor.Validator) { + if index < 0 || index >= len(vals.Validators) { + return nil, nil + } + val = vals.Validators[index] + return val.Address.Bytes(), val.Copy() +} + +// Size returns the length of the validator set. +func (vals *ValidatorSet) Size() int { + return len(vals.Validators) +} + +// Force recalculation of the set's total voting power. +func (vals *ValidatorSet) updateTotalVotingPower() error { + + sum := int64(0) + for _, val := range vals.Validators { + // mind overflow + sum = safeAddClip(sum, val.VotingPower) + if sum > MaxTotalVotingPower { + return &bor.TotalVotingPowerExceededError{Sum: sum, Validators: vals.Validators} + } + } + vals.totalVotingPower = sum + return nil +} + +// TotalVotingPower returns the sum of the voting powers of all validators. +// It recomputes the total voting power if required. +func (vals *ValidatorSet) TotalVotingPower() int64 { + if vals.totalVotingPower == 0 { + log.Info("invoking updateTotalVotingPower before returning it") + if err := vals.updateTotalVotingPower(); err != nil { + // Can/should we do better? + panic(err) + } + } + return vals.totalVotingPower +} + +// GetProposer returns the current proposer. If the validator set is empty, nil +// is returned. +func (vals *ValidatorSet) GetProposer() (proposer *bor.Validator) { + if len(vals.Validators) == 0 { + return nil + } + if vals.Proposer == nil { + vals.Proposer = vals.findProposer() + } + return vals.Proposer.Copy() +} + +func (vals *ValidatorSet) findProposer() *bor.Validator { + var proposer *bor.Validator + for _, val := range vals.Validators { + if proposer == nil || !bytes.Equal(val.Address.Bytes(), proposer.Address.Bytes()) { + proposer = proposer.Cmp(val) + } + } + return proposer +} + +// Hash returns the Merkle root hash build using validators (as leaves) in the +// set. +// func (vals *ValidatorSet) Hash() []byte { +// if len(vals.Validators) == 0 { +// return nil +// } +// bzs := make([][]byte, len(vals.Validators)) +// for i, val := range vals.Validators { +// bzs[i] = val.Bytes() +// } +// return merkle.SimpleHashFromByteSlices(bzs) +// } + +// Iterate will run the given function over the set. +func (vals *ValidatorSet) Iterate(fn func(index int, val *bor.Validator) bool) { + for i, val := range vals.Validators { + stop := fn(i, val.Copy()) + if stop { + break + } + } +} + +// Checks changes against duplicates, splits the changes in updates and removals, sorts them by address. +// +// Returns: +// updates, removals - the sorted lists of updates and removals +// err - non-nil if duplicate entries or entries with negative voting power are seen +// +// No changes are made to 'origChanges'. +func processChanges(origChanges []*bor.Validator) (updates, removals []*bor.Validator, err error) { + // Make a deep copy of the changes and sort by address. + changes := validatorListCopy(origChanges) + sort.Sort(ValidatorsByAddress(changes)) + + removals = make([]*bor.Validator, 0, len(changes)) + updates = make([]*bor.Validator, 0, len(changes)) + var prevAddr common.Address + + // Scan changes by address and append valid validators to updates or removals lists. + for _, valUpdate := range changes { + if bytes.Equal(valUpdate.Address.Bytes(), prevAddr.Bytes()) { + err = fmt.Errorf("duplicate entry %v in %v", valUpdate, changes) + return nil, nil, err + } + if valUpdate.VotingPower < 0 { + err = fmt.Errorf("voting power can't be negative: %v", valUpdate) + return nil, nil, err + } + if valUpdate.VotingPower > MaxTotalVotingPower { + err = fmt.Errorf("to prevent clipping/ overflow, voting power can't be higher than %v: %v ", + MaxTotalVotingPower, valUpdate) + return nil, nil, err + } + if valUpdate.VotingPower == 0 { + removals = append(removals, valUpdate) + } else { + updates = append(updates, valUpdate) + } + prevAddr = valUpdate.Address + } + return updates, removals, err +} + +// Verifies a list of updates against a validator set, making sure the allowed +// total voting power would not be exceeded if these updates would be applied to the set. +// +// Returns: +// updatedTotalVotingPower - the new total voting power if these updates would be applied +// numNewValidators - number of new validators +// err - non-nil if the maximum allowed total voting power would be exceeded +// +// 'updates' should be a list of proper validator changes, i.e. they have been verified +// by processChanges for duplicates and invalid values. +// No changes are made to the validator set 'vals'. +func verifyUpdates(updates []*bor.Validator, vals *ValidatorSet) (updatedTotalVotingPower int64, numNewValidators int, err error) { + + updatedTotalVotingPower = vals.TotalVotingPower() + + for _, valUpdate := range updates { + address := valUpdate.Address + _, val := vals.GetByAddress(address) + if val == nil { + // New validator, add its voting power the the total. + updatedTotalVotingPower += valUpdate.VotingPower + numNewValidators++ + } else { + // Updated validator, add the difference in power to the total. + updatedTotalVotingPower += valUpdate.VotingPower - val.VotingPower + } + overflow := updatedTotalVotingPower > MaxTotalVotingPower + if overflow { + err = fmt.Errorf( + "failed to add/update validator %v, total voting power would exceed the max allowed %v", + valUpdate, MaxTotalVotingPower) + return 0, 0, err + } + } + + return updatedTotalVotingPower, numNewValidators, nil +} + +// Computes the proposer priority for the validators not present in the set based on 'updatedTotalVotingPower'. +// Leaves unchanged the priorities of validators that are changed. +// +// 'updates' parameter must be a list of unique validators to be added or updated. +// No changes are made to the validator set 'vals'. +func computeNewPriorities(updates []*bor.Validator, vals *ValidatorSet, updatedTotalVotingPower int64) { + + for _, valUpdate := range updates { + address := valUpdate.Address + _, val := vals.GetByAddress(address) + if val == nil { + // add val + // Set ProposerPriority to -C*totalVotingPower (with C ~= 1.125) to make sure validators can't + // un-bond and then re-bond to reset their (potentially previously negative) ProposerPriority to zero. + // + // Contract: updatedVotingPower < MaxTotalVotingPower to ensure ProposerPriority does + // not exceed the bounds of int64. + // + // Compute ProposerPriority = -1.125*totalVotingPower == -(updatedVotingPower + (updatedVotingPower >> 3)). + valUpdate.ProposerPriority = -(updatedTotalVotingPower + (updatedTotalVotingPower >> 3)) + } else { + valUpdate.ProposerPriority = val.ProposerPriority + } + } + +} + +// Merges the vals' validator list with the updates list. +// When two elements with same address are seen, the one from updates is selected. +// Expects updates to be a list of updates sorted by address with no duplicates or errors, +// must have been validated with verifyUpdates() and priorities computed with computeNewPriorities(). +func (vals *ValidatorSet) applyUpdates(updates []*bor.Validator) { + + existing := vals.Validators + merged := make([]*bor.Validator, len(existing)+len(updates)) + i := 0 + + for len(existing) > 0 && len(updates) > 0 { + if bytes.Compare(existing[0].Address.Bytes(), updates[0].Address.Bytes()) < 0 { // unchanged validator + merged[i] = existing[0] + existing = existing[1:] + } else { + // Apply add or update. + merged[i] = updates[0] + if bytes.Equal(existing[0].Address.Bytes(), updates[0].Address.Bytes()) { + // bor.Validator is present in both, advance existing. + existing = existing[1:] + } + updates = updates[1:] + } + i++ + } + + // Add the elements which are left. + for j := 0; j < len(existing); j++ { + merged[i] = existing[j] + i++ + } + // OR add updates which are left. + for j := 0; j < len(updates); j++ { + merged[i] = updates[j] + i++ + } + + vals.Validators = merged[:i] +} + +// Checks that the validators to be removed are part of the validator set. +// No changes are made to the validator set 'vals'. +func verifyRemovals(deletes []*bor.Validator, vals *ValidatorSet) error { + + for _, valUpdate := range deletes { + address := valUpdate.Address + _, val := vals.GetByAddress(address) + if val == nil { + return fmt.Errorf("failed to find validator %X to remove", address) + } + } + if len(deletes) > len(vals.Validators) { + panic("more deletes than validators") + } + return nil +} + +// Removes the validators specified in 'deletes' from validator set 'vals'. +// Should not fail as verification has been done before. +func (vals *ValidatorSet) applyRemovals(deletes []*bor.Validator) { + + existing := vals.Validators + + merged := make([]*bor.Validator, len(existing)-len(deletes)) + i := 0 + + // Loop over deletes until we removed all of them. + for len(deletes) > 0 { + if bytes.Equal(existing[0].Address.Bytes(), deletes[0].Address.Bytes()) { + deletes = deletes[1:] + } else { // Leave it in the resulting slice. + merged[i] = existing[0] + i++ + } + existing = existing[1:] + } + + // Add the elements which are left. + for j := 0; j < len(existing); j++ { + merged[i] = existing[j] + i++ + } + + vals.Validators = merged[:i] +} + +// Main function used by UpdateWithChangeSet() and NewValidatorSet(). +// If 'allowDeletes' is false then delete operations (identified by validators with voting power 0) +// are not allowed and will trigger an error if present in 'changes'. +// The 'allowDeletes' flag is set to false by NewValidatorSet() and to true by UpdateWithChangeSet(). +func (vals *ValidatorSet) updateWithChangeSet(changes []*bor.Validator, allowDeletes bool) error { + + if len(changes) < 1 { + return nil + } + + // Check for duplicates within changes, split in 'updates' and 'deletes' lists (sorted). + updates, deletes, err := processChanges(changes) + if err != nil { + return err + } + + if !allowDeletes && len(deletes) != 0 { + return fmt.Errorf("cannot process validators with voting power 0: %v", deletes) + } + + // Verify that applying the 'deletes' against 'vals' will not result in error. + if err := verifyRemovals(deletes, vals); err != nil { + return err + } + + // Verify that applying the 'updates' against 'vals' will not result in error. + updatedTotalVotingPower, numNewValidators, err := verifyUpdates(updates, vals) + if err != nil { + return err + } + + // Check that the resulting set will not be empty. + if numNewValidators == 0 && len(vals.Validators) == len(deletes) { + return fmt.Errorf("applying the validator changes would result in empty set") + } + + // Compute the priorities for updates. + computeNewPriorities(updates, vals, updatedTotalVotingPower) + + // Apply updates and removals. + vals.applyUpdates(updates) + vals.applyRemovals(deletes) + + if err := vals.updateTotalVotingPower(); err != nil { + return err + } + + // Scale and center. + vals.RescalePriorities(PriorityWindowSizeFactor * vals.TotalVotingPower()) + vals.shiftByAvgProposerPriority() + + return nil +} + +// UpdateWithChangeSet attempts to update the validator set with 'changes'. +// It performs the following steps: +// - validates the changes making sure there are no duplicates and splits them in updates and deletes +// - verifies that applying the changes will not result in errors +// - computes the total voting power BEFORE removals to ensure that in the next steps the priorities +// across old and newly added validators are fair +// - computes the priorities of new validators against the final set +// - applies the updates against the validator set +// - applies the removals against the validator set +// - performs scaling and centering of priority values +// If an error is detected during verification steps, it is returned and the validator set +// is not changed. +func (vals *ValidatorSet) UpdateWithChangeSet(changes []*bor.Validator) error { + return vals.updateWithChangeSet(changes, true) +} + +//----------------- +// ErrTooMuchChange + +func IsErrTooMuchChange(err error) bool { + switch err.(type) { + case errTooMuchChange: + return true + default: + return false + } +} + +type errTooMuchChange struct { + got int64 + needed int64 +} + +func (e errTooMuchChange) Error() string { + return fmt.Sprintf("Invalid commit -- insufficient old voting power: got %v, needed %v", e.got, e.needed) +} + +//---------------- + +func (vals *ValidatorSet) String() string { + return vals.StringIndented("") +} + +func (vals *ValidatorSet) StringIndented(indent string) string { + if vals == nil { + return "nil-ValidatorSet" + } + var valStrings []string + vals.Iterate(func(index int, val *bor.Validator) bool { + valStrings = append(valStrings, val.String()) + return false + }) + return fmt.Sprintf(`ValidatorSet{ +%s Proposer: %v +%s Validators: +%s %v +%s}`, + indent, vals.GetProposer().String(), + indent, + indent, strings.Join(valStrings, "\n"+indent+" "), + indent) + +} + +//------------------------------------- +// Implements sort for sorting validators by address. + +// Sort validators by address. +type ValidatorsByAddress []*bor.Validator + +func (valz ValidatorsByAddress) Len() int { + return len(valz) +} + +func (valz ValidatorsByAddress) Less(i, j int) bool { + return bytes.Compare(valz[i].Address.Bytes(), valz[j].Address.Bytes()) == -1 +} + +func (valz ValidatorsByAddress) Swap(i, j int) { + valz[i], valz[j] = valz[j], valz[i] +} + +/////////////////////////////////////////////////////////////////////////////// +// safe addition/subtraction + +func safeAdd(a, b int64) (int64, bool) { + if b > 0 && a > math.MaxInt64-b { + return -1, true + } else if b < 0 && a < math.MinInt64-b { + return -1, true + } + return a + b, false +} + +func safeSub(a, b int64) (int64, bool) { + if b > 0 && a < math.MinInt64+b { + return -1, true + } else if b < 0 && a > math.MaxInt64+b { + return -1, true + } + return a - b, false +} + +func safeAddClip(a, b int64) int64 { + c, overflow := safeAdd(a, b) + if overflow { + if b < 0 { + return math.MinInt64 + } + return math.MaxInt64 + } + return c +} + +func safeSubClip(a, b int64) int64 { + c, overflow := safeSub(a, b) + if overflow { + if b > 0 { + return math.MinInt64 + } + return math.MaxInt64 + } + return c +} diff --git a/cmd/rpcdaemon/commands/web3_api.go b/cmd/rpcdaemon/commands/web3_api.go index 5ad8cc9a738..7a13f9a8fe1 100644 --- a/cmd/rpcdaemon/commands/web3_api.go +++ b/cmd/rpcdaemon/commands/web3_api.go @@ -3,7 +3,7 @@ package commands import ( "context" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/crypto" ) @@ -16,11 +16,11 @@ type Web3API interface { type Web3APIImpl struct { *BaseAPI - ethBackend services.ApiBackend + ethBackend rpcinterfaces.ApiBackend } // NewWeb3APIImpl returns Web3APIImpl instance -func NewWeb3APIImpl(ethBackend services.ApiBackend) *Web3APIImpl { +func NewWeb3APIImpl(ethBackend rpcinterfaces.ApiBackend) *Web3APIImpl { return &Web3APIImpl{ BaseAPI: &BaseAPI{}, ethBackend: ethBackend, diff --git a/cmd/rpcdaemon/filters/filters.go b/cmd/rpcdaemon/filters/filters.go deleted file mode 100644 index e9cce4a200f..00000000000 --- a/cmd/rpcdaemon/filters/filters.go +++ /dev/null @@ -1,408 +0,0 @@ -package filters - -import ( - "bytes" - "context" - "crypto/rand" - "errors" - "fmt" - "io" - "sync" - "time" - - "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" - "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/services" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -type ( - SubscriptionID string - HeadsSubID SubscriptionID - PendingLogsSubID SubscriptionID - PendingBlockSubID SubscriptionID - PendingTxsSubID SubscriptionID -) - -type Filters struct { - mu sync.RWMutex - - pendingBlock *types.Block - - headsSubs map[HeadsSubID]chan *types.Header - pendingLogsSubs map[PendingLogsSubID]chan types.Logs - pendingBlockSubs map[PendingBlockSubID]chan *types.Block - pendingTxsSubs map[PendingTxsSubID]chan []types.Transaction -} - -func New(ctx context.Context, ethBackend services.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient) *Filters { - log.Info("rpc filters: subscribing to Erigon events") - - ff := &Filters{ - headsSubs: make(map[HeadsSubID]chan *types.Header), - pendingTxsSubs: make(map[PendingTxsSubID]chan []types.Transaction), - pendingLogsSubs: make(map[PendingLogsSubID]chan types.Logs), - pendingBlockSubs: make(map[PendingBlockSubID]chan *types.Block), - } - - go func() { - if ethBackend == nil { - return - } - for { - select { - case <-ctx.Done(): - return - default: - } - - if err := ethBackend.Subscribe(ctx, ff.OnNewEvent); err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - continue - } - if errors.Is(err, io.EOF) { - continue - } - - log.Warn("rpc filters: error subscribing to events", "err", err) - time.Sleep(time.Second) - } - } - }() - - if txPool != nil { - go func() { - for { - select { - case <-ctx.Done(): - return - default: - } - if err := ff.subscribeToPendingTransactions(ctx, txPool); err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - continue - } - if errors.Is(err, io.EOF) { - continue - } - log.Warn("rpc filters: error subscribing to pending transactions", "err", err) - time.Sleep(time.Second) - } - } - }() - go func() { - for { - select { - case <-ctx.Done(): - return - default: - } - if err := ff.subscribeToPendingBlocks(ctx, mining); err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - continue - } - if errors.Is(err, io.EOF) { - continue - } - log.Warn("rpc filters: error subscribing to pending blocks", "err", err) - time.Sleep(time.Second) - } - } - }() - go func() { - for { - select { - case <-ctx.Done(): - return - default: - } - if err := ff.subscribeToPendingLogs(ctx, mining); err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - continue - } - if errors.Is(err, io.EOF) { - continue - } - log.Warn("rpc filters: error subscribing to pending logs", "err", err) - time.Sleep(time.Second) - } - } - }() - } - - return ff -} - -func (ff *Filters) LastPendingBlock() *types.Block { - ff.mu.RLock() - defer ff.mu.RUnlock() - return ff.pendingBlock -} - -func (ff *Filters) subscribeToPendingTransactions(ctx context.Context, txPool txpool.TxpoolClient) error { - subscription, err := txPool.OnAdd(ctx, &txpool.OnAddRequest{}, grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok { - return errors.New(s.Message()) - } - return err - } - for { - event, err := subscription.Recv() - if err == io.EOF { - log.Info("rpcdaemon: the subscription channel was closed") - break - } - if err != nil { - return err - } - - ff.OnNewTx(event) - } - return nil -} - -func (ff *Filters) subscribeToPendingBlocks(ctx context.Context, mining txpool.MiningClient) error { - subscription, err := mining.OnPendingBlock(ctx, &txpool.OnPendingBlockRequest{}, grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok { - return errors.New(s.Message()) - } - return err - } - for { - select { - case <-ctx.Done(): - return nil - default: - } - - event, err := subscription.Recv() - if err == io.EOF { - log.Info("rpcdaemon: the subscription channel was closed") - break - } - if err != nil { - return err - } - - ff.HandlePendingBlock(event) - } - return nil -} - -func (ff *Filters) HandlePendingBlock(reply *txpool.OnPendingBlockReply) { - b := &types.Block{} - if err := rlp.Decode(bytes.NewReader(reply.RplBlock), b); err != nil { - log.Warn("OnNewTx rpc filters, unprocessable payload", "err", err) - } - - ff.mu.Lock() - defer ff.mu.Unlock() - ff.pendingBlock = b - - for _, v := range ff.pendingBlockSubs { - v <- b - } -} - -func (ff *Filters) subscribeToPendingLogs(ctx context.Context, mining txpool.MiningClient) error { - subscription, err := mining.OnPendingLogs(ctx, &txpool.OnPendingLogsRequest{}, grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok { - return errors.New(s.Message()) - } - return err - } - for { - select { - case <-ctx.Done(): - return nil - default: - } - - event, err := subscription.Recv() - if err == io.EOF { - log.Info("rpcdaemon: the subscription channel was closed") - break - } - if err != nil { - return err - } - - ff.HandlePendingLogs(event) - } - return nil -} - -func (ff *Filters) HandlePendingLogs(reply *txpool.OnPendingLogsReply) { - l := []*types.Log{} - if err := rlp.Decode(bytes.NewReader(reply.RplLogs), &l); err != nil { - log.Warn("OnNewTx rpc filters, unprocessable payload", "err", err) - } - - ff.mu.RLock() - defer ff.mu.RUnlock() - for _, v := range ff.pendingLogsSubs { - v <- l - } -} - -func (ff *Filters) SubscribeNewHeads(out chan *types.Header) HeadsSubID { - ff.mu.Lock() - defer ff.mu.Unlock() - id := HeadsSubID(generateSubscriptionID()) - ff.headsSubs[id] = out - return id -} - -func (ff *Filters) UnsubscribeHeads(id HeadsSubID) { - ff.mu.Lock() - defer ff.mu.Unlock() - delete(ff.headsSubs, id) -} - -func (ff *Filters) SubscribePendingLogs(c chan types.Logs) PendingLogsSubID { - ff.mu.Lock() - defer ff.mu.Unlock() - id := PendingLogsSubID(generateSubscriptionID()) - ff.pendingLogsSubs[id] = c - return id -} - -func (ff *Filters) UnsubscribePendingLogs(id PendingLogsSubID) { - ff.mu.Lock() - defer ff.mu.Unlock() - delete(ff.pendingLogsSubs, id) -} - -func (ff *Filters) SubscribePendingBlock(f chan *types.Block) PendingBlockSubID { - ff.mu.Lock() - defer ff.mu.Unlock() - id := PendingBlockSubID(generateSubscriptionID()) - ff.pendingBlockSubs[id] = f - return id -} - -func (ff *Filters) UnsubscribePendingBlock(id PendingBlockSubID) { - ff.mu.Lock() - defer ff.mu.Unlock() - delete(ff.pendingBlockSubs, id) -} - -func (ff *Filters) SubscribePendingTxs(out chan []types.Transaction) PendingTxsSubID { - ff.mu.Lock() - defer ff.mu.Unlock() - id := PendingTxsSubID(generateSubscriptionID()) - ff.pendingTxsSubs[id] = out - return id -} - -func (ff *Filters) UnsubscribePendingTxs(id PendingTxsSubID) { - ff.mu.Lock() - defer ff.mu.Unlock() - delete(ff.pendingTxsSubs, id) -} - -func (ff *Filters) OnNewEvent(event *remote.SubscribeReply) { - ff.mu.RLock() - defer ff.mu.RUnlock() - - switch event.Type { - case remote.Event_HEADER: - payload := event.Data - var header types.Header - - err := rlp.Decode(bytes.NewReader(payload), &header) - if err != nil { - // ignoring what we can't unmarshal - log.Warn("OnNewEvent rpc filters (header), unprocessable payload", "err", err) - } else { - for _, v := range ff.headsSubs { - v <- &header - } - } - //case remote.Event_PENDING_LOGS: - // payload := event.Data - // var logs types.Logs - // err := rlp.Decode(bytes.NewReader(payload), &logs) - // if err != nil { - // // ignoring what we can't unmarshal - // log.Warn("OnNewEvent rpc filters (pending logs), unprocessable payload", "err", err) - // } else { - // for _, v := range ff.pendingLogsSubs { - // v <- logs - // } - // } - //case remote.Event_PENDING_BLOCK: - // payload := event.Data - // var block types.Block - // err := rlp.Decode(bytes.NewReader(payload), &block) - // if err != nil { - // // ignoring what we can't unmarshal - // log.Warn("OnNewEvent rpc filters (pending txs), unprocessable payload", "err", err) - // } else { - // for _, v := range ff.pendingBlockSubs { - // v <- &block - // } - // } - default: - log.Warn("OnNewEvent rpc filters: unsupported event type", "type", event.Type) - return - } -} - -func (ff *Filters) OnNewTx(reply *txpool.OnAddReply) { - ff.mu.RLock() - defer ff.mu.RUnlock() - - txs := make([]types.Transaction, len(reply.RplTxs)) - for i, rplTx := range reply.RplTxs { - var decodeErr error - txs[i], decodeErr = types.UnmarshalTransactionFromBinary(rplTx) - if decodeErr != nil { - // ignoring what we can't unmarshal - log.Warn("OnNewTx rpc filters, unprocessable payload", "err", decodeErr) - break - } - } - for _, v := range ff.pendingTxsSubs { - v <- txs - } -} - -func generateSubscriptionID() SubscriptionID { - var id [32]byte - - _, err := rand.Read(id[:]) - if err != nil { - log.Crit("rpc filters: error creating random id", "err", err) - } - - return SubscriptionID(fmt.Sprintf("%x", id)) -} diff --git a/cmd/rpcdaemon/health/check_block.go b/cmd/rpcdaemon/health/check_block.go new file mode 100644 index 00000000000..8978b6ffc4e --- /dev/null +++ b/cmd/rpcdaemon/health/check_block.go @@ -0,0 +1,23 @@ +package health + +import ( + "context" + "fmt" + + "github.com/ledgerwatch/erigon/rpc" +) + +func checkBlockNumber(blockNumber rpc.BlockNumber, api EthAPI) error { + if api == nil { + return fmt.Errorf("no connection to the Erigon server or `eth` namespace isn't enabled") + } + data, err := api.GetBlockByNumber(context.TODO(), blockNumber, false) + if err != nil { + return err + } + if len(data) == 0 { // block not found + return fmt.Errorf("no known block with number %v (%x hex)", blockNumber, blockNumber) + } + + return nil +} diff --git a/cmd/rpcdaemon/health/check_peers.go b/cmd/rpcdaemon/health/check_peers.go new file mode 100644 index 00000000000..818152b668b --- /dev/null +++ b/cmd/rpcdaemon/health/check_peers.go @@ -0,0 +1,23 @@ +package health + +import ( + "context" + "fmt" +) + +func checkMinPeers(minPeerCount uint, api NetAPI) error { + if api == nil { + return fmt.Errorf("no connection to the Erigon server or `net` namespace isn't enabled") + } + + peerCount, err := api.PeerCount(context.TODO()) + if err != nil { + return err + } + + if uint64(peerCount) < uint64(minPeerCount) { + return fmt.Errorf("not enough peers: %d (minimum %d))", peerCount, minPeerCount) + } + + return nil +} diff --git a/cmd/rpcdaemon/health/health.go b/cmd/rpcdaemon/health/health.go new file mode 100644 index 00000000000..311af85c5d9 --- /dev/null +++ b/cmd/rpcdaemon/health/health.go @@ -0,0 +1,131 @@ +package health + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strings" + + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/log/v3" +) + +type requestBody struct { + MinPeerCount *uint `json:"min_peer_count"` + BlockNumber *rpc.BlockNumber `json:"known_block"` +} + +const ( + urlPath = "/health" +) + +var ( + errCheckDisabled = errors.New("error check disabled") +) + +func ProcessHealthcheckIfNeeded( + w http.ResponseWriter, + r *http.Request, + rpcAPI []rpc.API, +) bool { + if !strings.EqualFold(r.URL.Path, urlPath) { + return false + } + + netAPI, ethAPI := parseAPI(rpcAPI) + + var errMinPeerCount = errCheckDisabled + var errCheckBlock = errCheckDisabled + + body, errParse := parseHealthCheckBody(r.Body) + defer r.Body.Close() + + if errParse != nil { + log.Root().Warn("unable to process healthcheck request", "err", errParse) + } else { + // 1. net_peerCount + if body.MinPeerCount != nil { + errMinPeerCount = checkMinPeers(*body.MinPeerCount, netAPI) + } + // 2. custom query (shouldn't fail) + if body.BlockNumber != nil { + errCheckBlock = checkBlockNumber(*body.BlockNumber, ethAPI) + } + // TODO add time from the last sync cycle + } + + err := reportHealth(errParse, errMinPeerCount, errCheckBlock, w) + if err != nil { + log.Root().Warn("unable to process healthcheck request", "err", err) + } + + return true +} + +func parseHealthCheckBody(reader io.Reader) (requestBody, error) { + var body requestBody + + bodyBytes, err := io.ReadAll(reader) + if err != nil { + return body, err + } + + err = json.Unmarshal(bodyBytes, &body) + if err != nil { + return body, err + } + + return body, nil +} + +func reportHealth(errParse, errMinPeerCount, errCheckBlock error, w http.ResponseWriter) error { + statusCode := http.StatusOK + errors := make(map[string]string) + + if shouldChangeStatusCode(errParse) { + statusCode = http.StatusInternalServerError + } + errors["healthcheck_query"] = errorStringOrOK(errParse) + + if shouldChangeStatusCode(errMinPeerCount) { + statusCode = http.StatusInternalServerError + } + errors["min_peer_count"] = errorStringOrOK(errMinPeerCount) + + if shouldChangeStatusCode(errCheckBlock) { + statusCode = http.StatusInternalServerError + } + errors["check_block"] = errorStringOrOK(errCheckBlock) + + w.WriteHeader(statusCode) + + bodyJson, err := json.Marshal(errors) + if err != nil { + return err + } + + _, err = w.Write(bodyJson) + if err != nil { + return err + } + + return nil +} + +func shouldChangeStatusCode(err error) bool { + return err != nil && !errors.Is(err, errCheckDisabled) +} + +func errorStringOrOK(err error) string { + if err == nil { + return "HEALTHY" + } + + if errors.Is(err, errCheckDisabled) { + return "DISABLED" + } + + return fmt.Sprintf("ERROR: %v", err) +} diff --git a/cmd/rpcdaemon/health/interfaces.go b/cmd/rpcdaemon/health/interfaces.go new file mode 100644 index 00000000000..4cf0fc6892b --- /dev/null +++ b/cmd/rpcdaemon/health/interfaces.go @@ -0,0 +1,16 @@ +package health + +import ( + "context" + + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/rpc" +) + +type NetAPI interface { + PeerCount(_ context.Context) (hexutil.Uint, error) +} + +type EthAPI interface { + GetBlockByNumber(_ context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) +} diff --git a/cmd/rpcdaemon/health/parse_api.go b/cmd/rpcdaemon/health/parse_api.go new file mode 100644 index 00000000000..21e003e5a59 --- /dev/null +++ b/cmd/rpcdaemon/health/parse_api.go @@ -0,0 +1,22 @@ +package health + +import ( + "github.com/ledgerwatch/erigon/rpc" +) + +func parseAPI(api []rpc.API) (netAPI NetAPI, ethAPI EthAPI) { + for _, rpc := range api { + if rpc.Service == nil { + continue + } + + if netCandidate, ok := rpc.Service.(NetAPI); ok { + netAPI = netCandidate + } + + if ethCandidate, ok := rpc.Service.(EthAPI); ok { + ethAPI = ethCandidate + } + } + return netAPI, ethAPI +} diff --git a/cmd/rpcdaemon/main.go b/cmd/rpcdaemon/main.go index 917a99992b3..3d273486b83 100644 --- a/cmd/rpcdaemon/main.go +++ b/cmd/rpcdaemon/main.go @@ -3,39 +3,35 @@ package main import ( "os" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common/fdlimit" "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" ) func main() { - raiseFdLimit() cmd, cfg := cli.RootCommand() - rootCtx, rootCancel := utils.RootContext() + rootCtx, rootCancel := common.RootContext() cmd.RunE = func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() logger := log.New() - db, backend, txPool, mining, err := cli.RemoteServices(*cfg, logger, rootCancel) + db, borDb, backend, txPool, mining, starknet, stateCache, blockReader, ff, err := cli.RemoteServices(ctx, *cfg, logger, rootCancel) if err != nil { - log.Error("Could not connect to DB", "error", err) + log.Error("Could not connect to DB", "err", err) return nil } defer db.Close() - - var ff *filters.Filters - if backend != nil { - ff = filters.New(rootCtx, backend, txPool, mining) - } else { - log.Info("filters are not supported in chaindata mode") + if borDb != nil { + defer borDb.Close() } - if err := cli.StartRpcServer(cmd.Context(), *cfg, commands.APIList(cmd.Context(), db, backend, txPool, mining, ff, *cfg, nil)); err != nil { + apiList := commands.APIList(db, borDb, backend, txPool, mining, starknet, ff, stateCache, blockReader, *cfg) + if err := cli.StartRpcServer(ctx, *cfg, apiList); err != nil { log.Error(err.Error()) return nil } + return nil } @@ -44,15 +40,3 @@ func main() { os.Exit(1) } } - -// raiseFdLimit raises out the number of allowed file handles per process -func raiseFdLimit() { - limit, err := fdlimit.Maximum() - if err != nil { - log.Error("Failed to retrieve file descriptor allowance", "error", err) - return - } - if _, err = fdlimit.Raise(uint64(limit)); err != nil { - log.Error("Failed to raise file descriptor allowance", "error", err) - } -} diff --git a/cmd/rpcdaemon/rpcdaemontest/test_util.go b/cmd/rpcdaemon/rpcdaemontest/test_util.go index 45bf89484e2..4df38906345 100644 --- a/cmd/rpcdaemon/rpcdaemontest/test_util.go +++ b/cmd/rpcdaemon/rpcdaemontest/test_util.go @@ -2,12 +2,16 @@ package rpcdaemontest import ( "context" + "crypto/ecdsa" "encoding/binary" + "github.com/ledgerwatch/erigon/consensus" "math/big" "net" "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/starknet" "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/accounts/abi/bind" @@ -20,13 +24,27 @@ import ( "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/ethdb/privateapi" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" ) func CreateTestKV(t *testing.T) kv.RwDB { - // Configure and generate a sample block chain + s, _, _ := CreateTestSentry(t) + return s.DB +} + +type testAddresses struct { + key *ecdsa.PrivateKey + key1 *ecdsa.PrivateKey + key2 *ecdsa.PrivateKey + address common.Address + address1 common.Address + address2 common.Address +} + +func makeTestAddresses() testAddresses { var ( key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") key1, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") @@ -34,8 +52,29 @@ func CreateTestKV(t *testing.T) kv.RwDB { address = crypto.PubkeyToAddress(key.PublicKey) address1 = crypto.PubkeyToAddress(key1.PublicKey) address2 = crypto.PubkeyToAddress(key2.PublicKey) - theAddr = common.Address{1} - gspec = &core.Genesis{ + ) + + return testAddresses{ + key: key, + key1: key1, + key2: key2, + address: address, + address1: address1, + address2: address2, + } +} + +func CreateTestSentry(t *testing.T) (*stages.MockSentry, *core.ChainPack, []*core.ChainPack) { + addresses := makeTestAddresses() + var ( + key = addresses.key + address = addresses.address + address1 = addresses.address1 + address2 = addresses.address2 + ) + + var ( + gspec = &core.Genesis{ Config: params.AllEthashProtocolChanges, Alloc: core.GenesisAlloc{ address: {Balance: big.NewInt(9000000000000000000)}, @@ -44,30 +83,80 @@ func CreateTestKV(t *testing.T) kv.RwDB { }, GasLimit: 10000000, } - chainId = big.NewInt(1337) - // this code generates a log - signer = types.LatestSignerForChainID(nil) ) m := stages.MockWithGenesis(t, gspec, key) contractBackend := backends.NewSimulatedBackendWithConfig(gspec.Alloc, gspec.Config, gspec.GasLimit) defer contractBackend.Close() - transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, chainId) - transactOpts1, _ := bind.NewKeyedTransactorWithChainID(key1, chainId) - transactOpts2, _ := bind.NewKeyedTransactorWithChainID(key2, chainId) - var poly *contracts.Poly - - var err error - var tokenContract *contracts.Token // Generate empty chain to have some orphaned blocks for tests orphanedChain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 5, func(i int, block *core.BlockGen) { }, true) if err != nil { t.Fatal(err) } - // We generate the blocks without plainstant because it's not supported in core.GenerateChain - chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, block *core.BlockGen) { + + chain, err := getChainInstance(&addresses, m.ChainConfig, m.Genesis, m.Engine, m.DB, contractBackend) + if err != nil { + t.Fatal(err) + } + + if err = m.InsertChain(orphanedChain); err != nil { + t.Fatal(err) + } + if err = m.InsertChain(chain); err != nil { + t.Fatal(err) + } + + return m, chain, []*core.ChainPack{orphanedChain} +} + +var chainInstance *core.ChainPack + +func getChainInstance( + addresses *testAddresses, + config *params.ChainConfig, + parent *types.Block, + engine consensus.Engine, + db kv.RwDB, + contractBackend *backends.SimulatedBackend, +) (*core.ChainPack, error) { + var err error + if chainInstance == nil { + chainInstance, err = generateChain(addresses, config, parent, engine, db, contractBackend) + } + return chainInstance.Copy(), err +} + +func generateChain( + addresses *testAddresses, + config *params.ChainConfig, + parent *types.Block, + engine consensus.Engine, + db kv.RwDB, + contractBackend *backends.SimulatedBackend, +) (*core.ChainPack, error) { + var ( + key = addresses.key + key1 = addresses.key1 + key2 = addresses.key2 + address = addresses.address + address1 = addresses.address1 + address2 = addresses.address2 + theAddr = common.Address{1} + chainId = big.NewInt(1337) + // this code generates a log + signer = types.LatestSignerForChainID(nil) + ) + + transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, chainId) + transactOpts1, _ := bind.NewKeyedTransactorWithChainID(key1, chainId) + transactOpts2, _ := bind.NewKeyedTransactorWithChainID(key2, chainId) + var poly *contracts.Poly + var tokenContract *contracts.Token + + // We generate the blocks without plain state because it's not supported in core.GenerateChain + return core.GenerateChain(config, parent, engine, db, 10, func(i int, block *core.BlockGen) { var ( txn types.Transaction txs []types.Transaction @@ -185,18 +274,6 @@ func CreateTestKV(t *testing.T) kv.RwDB { } contractBackend.Commit() }, true) - if err != nil { - t.Fatal(err) - } - - if err = m.InsertChain(orphanedChain); err != nil { - t.Fatal(err) - } - if err = m.InsertChain(chain); err != nil { - t.Fatal(err) - } - - return m.DB } type IsMiningMock struct{} @@ -214,8 +291,10 @@ func CreateTestGrpcConn(t *testing.T, m *stages.MockSentry) (context.Context, *g ethashApi := apis[1].Service.(*ethash.API) server := grpc.NewServer() - txpool.RegisterTxpoolServer(server, privateapi.NewTxPoolServer(ctx, m.TxPoolP2PServer.TxPool)) + remote.RegisterETHBACKENDServer(server, privateapi.NewEthBackendServer(ctx, nil, m.DB, m.Notifications.Events, snapshotsync.NewBlockReader(), nil, nil, nil, nil, false)) + txpool.RegisterTxpoolServer(server, m.TxPoolGrpcServer) txpool.RegisterMiningServer(server, privateapi.NewMiningServer(ctx, &IsMiningMock{}, ethashApi)) + starknet.RegisterCAIROVMServer(server, &starknet.UnimplementedCAIROVMServer{}) listener := bufconn.Listen(1024 * 1024) dialer := func() func(context.Context, string) (net.Conn, error) { diff --git a/cmd/rpcdaemon/rpcservices/eth_backend.go b/cmd/rpcdaemon/rpcservices/eth_backend.go new file mode 100644 index 00000000000..f86aaa0515d --- /dev/null +++ b/cmd/rpcdaemon/rpcservices/eth_backend.go @@ -0,0 +1,288 @@ +package rpcservices + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "sync/atomic" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/ethdb/privateapi" + "github.com/ledgerwatch/erigon/p2p" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/log/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" +) + +type RemoteBackend struct { + remoteEthBackend remote.ETHBACKENDClient + log log.Logger + version gointerfaces.Version + db kv.RoDB + blockReader services.FullBlockReader +} + +func NewRemoteBackend(client remote.ETHBACKENDClient, db kv.RoDB, blockReader services.FullBlockReader) *RemoteBackend { + return &RemoteBackend{ + remoteEthBackend: client, + version: gointerfaces.VersionFromProto(privateapi.EthBackendAPIVersion), + log: log.New("remote_service", "eth_backend"), + db: db, + blockReader: blockReader, + } +} + +func (back *RemoteBackend) EnsureVersionCompatibility() bool { + versionReply, err := back.remoteEthBackend.Version(context.Background(), &emptypb.Empty{}, grpc.WaitForReady(true)) + if err != nil { + + back.log.Error("getting Version", "err", err) + return false + } + if !gointerfaces.EnsureVersion(back.version, versionReply) { + back.log.Error("incompatible interface versions", "client", back.version.String(), + "server", fmt.Sprintf("%d.%d.%d", versionReply.Major, versionReply.Minor, versionReply.Patch)) + return false + } + back.log.Info("interfaces compatible", "client", back.version.String(), + "server", fmt.Sprintf("%d.%d.%d", versionReply.Major, versionReply.Minor, versionReply.Patch)) + return true +} + +func (back *RemoteBackend) Etherbase(ctx context.Context) (common.Address, error) { + res, err := back.remoteEthBackend.Etherbase(ctx, &remote.EtherbaseRequest{}) + if err != nil { + if s, ok := status.FromError(err); ok { + return common.Address{}, errors.New(s.Message()) + } + return common.Address{}, err + } + + return gointerfaces.ConvertH160toAddress(res.Address), nil +} + +func (back *RemoteBackend) NetVersion(ctx context.Context) (uint64, error) { + res, err := back.remoteEthBackend.NetVersion(ctx, &remote.NetVersionRequest{}) + if err != nil { + if s, ok := status.FromError(err); ok { + return 0, errors.New(s.Message()) + } + return 0, err + } + + return res.Id, nil +} + +func (back *RemoteBackend) NetPeerCount(ctx context.Context) (uint64, error) { + res, err := back.remoteEthBackend.NetPeerCount(ctx, &remote.NetPeerCountRequest{}) + if err != nil { + if s, ok := status.FromError(err); ok { + return 0, errors.New(s.Message()) + } + return 0, err + } + + return res.Count, nil +} + +func (back *RemoteBackend) ProtocolVersion(ctx context.Context) (uint64, error) { + res, err := back.remoteEthBackend.ProtocolVersion(ctx, &remote.ProtocolVersionRequest{}) + if err != nil { + if s, ok := status.FromError(err); ok { + return 0, errors.New(s.Message()) + } + return 0, err + } + + return res.Id, nil +} + +func (back *RemoteBackend) ClientVersion(ctx context.Context) (string, error) { + res, err := back.remoteEthBackend.ClientVersion(ctx, &remote.ClientVersionRequest{}) + if err != nil { + if s, ok := status.FromError(err); ok { + return "", errors.New(s.Message()) + } + return "", err + } + + return res.NodeName, nil +} + +func (back *RemoteBackend) Subscribe(ctx context.Context, onNewEvent func(*remote.SubscribeReply)) error { + subscription, err := back.remoteEthBackend.Subscribe(ctx, &remote.SubscribeRequest{}, grpc.WaitForReady(true)) + if err != nil { + if s, ok := status.FromError(err); ok { + return errors.New(s.Message()) + } + return err + } + for { + event, err := subscription.Recv() + if errors.Is(err, io.EOF) { + log.Debug("rpcdaemon: the subscription channel was closed") + break + } + if err != nil { + return err + } + + onNewEvent(event) + } + return nil +} + +func (back *RemoteBackend) SubscribeLogs(ctx context.Context, onNewLogs func(reply *remote.SubscribeLogsReply), requestor *atomic.Value) error { + subscription, err := back.remoteEthBackend.SubscribeLogs(ctx, grpc.WaitForReady(true)) + if err != nil { + if s, ok := status.FromError(err); ok { + return errors.New(s.Message()) + } + return err + } + requestor.Store(subscription.Send) + for { + logs, err := subscription.Recv() + if errors.Is(err, io.EOF) { + log.Info("rpcdaemon: the logs subscription channel was closed") + break + } + if err != nil { + return err + } + onNewLogs(logs) + } + return nil +} + +func (back *RemoteBackend) TxnLookup(ctx context.Context, tx kv.Getter, txnHash common.Hash) (uint64, bool, error) { + return back.blockReader.TxnLookup(ctx, tx, txnHash) +} +func (back *RemoteBackend) BlockWithSenders(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (block *types.Block, senders []common.Address, err error) { + return back.blockReader.BlockWithSenders(ctx, tx, hash, blockHeight) +} +func (back *RemoteBackend) BodyWithTransactions(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + return back.blockReader.BodyWithTransactions(ctx, tx, hash, blockHeight) +} +func (back *RemoteBackend) BodyRlp(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (bodyRlp rlp.RawValue, err error) { + return back.blockReader.BodyRlp(ctx, tx, hash, blockHeight) +} +func (back *RemoteBackend) Body(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + return back.blockReader.Body(ctx, tx, hash, blockHeight) +} +func (back *RemoteBackend) Header(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (*types.Header, error) { + return back.blockReader.Header(ctx, tx, hash, blockHeight) +} +func (back *RemoteBackend) HeaderByNumber(ctx context.Context, tx kv.Getter, blockHeight uint64) (*types.Header, error) { + return back.blockReader.HeaderByNumber(ctx, tx, blockHeight) +} +func (back *RemoteBackend) HeaderByHash(ctx context.Context, tx kv.Getter, hash common.Hash) (*types.Header, error) { + return back.blockReader.HeaderByHash(ctx, tx, hash) +} +func (back *RemoteBackend) CanonicalHash(ctx context.Context, tx kv.Getter, blockHeight uint64) (common.Hash, error) { + return back.blockReader.CanonicalHash(ctx, tx, blockHeight) +} + +func (back *RemoteBackend) EngineNewPayloadV1(ctx context.Context, payload *types2.ExecutionPayload) (res *remote.EnginePayloadStatus, err error) { + return back.remoteEthBackend.EngineNewPayloadV1(ctx, payload) +} + +func (back *RemoteBackend) EngineForkchoiceUpdatedV1(ctx context.Context, request *remote.EngineForkChoiceUpdatedRequest) (*remote.EngineForkChoiceUpdatedReply, error) { + return back.remoteEthBackend.EngineForkChoiceUpdatedV1(ctx, request) +} + +func (back *RemoteBackend) EngineGetPayloadV1(ctx context.Context, payloadId uint64) (res *types2.ExecutionPayload, err error) { + return back.remoteEthBackend.EngineGetPayloadV1(ctx, &remote.EngineGetPayloadRequest{ + PayloadId: payloadId, + }) +} + +func (back *RemoteBackend) NodeInfo(ctx context.Context, limit uint32) ([]p2p.NodeInfo, error) { + nodes, err := back.remoteEthBackend.NodeInfo(ctx, &remote.NodesInfoRequest{Limit: limit}) + if err != nil { + return nil, fmt.Errorf("nodes info request error: %w", err) + } + + if nodes == nil || len(nodes.NodesInfo) == 0 { + return nil, errors.New("empty nodesInfo response") + } + + ret := make([]p2p.NodeInfo, 0, len(nodes.NodesInfo)) + for _, node := range nodes.NodesInfo { + var rawProtocols map[string]json.RawMessage + if err = json.Unmarshal(node.Protocols, &rawProtocols); err != nil { + return nil, fmt.Errorf("cannot decode protocols metadata: %w", err) + } + + protocols := make(map[string]interface{}, len(rawProtocols)) + for k, v := range rawProtocols { + protocols[k] = v + } + + ret = append(ret, p2p.NodeInfo{ + Enode: node.Enode, + ID: node.Id, + IP: node.Enode, + ENR: node.Enr, + ListenAddr: node.ListenerAddr, + Name: node.Name, + Ports: struct { + Discovery int `json:"discovery"` + Listener int `json:"listener"` + }{ + Discovery: int(node.Ports.Discovery), + Listener: int(node.Ports.Listener), + }, + Protocols: protocols, + }) + } + + return ret, nil +} + +func (back *RemoteBackend) Peers(ctx context.Context) ([]*p2p.PeerInfo, error) { + rpcPeers, err := back.remoteEthBackend.Peers(ctx, &emptypb.Empty{}) + if err != nil { + return nil, fmt.Errorf("ETHBACKENDClient.Peers() error: %w", err) + } + + peers := make([]*p2p.PeerInfo, 0, len(rpcPeers.Peers)) + + for _, rpcPeer := range rpcPeers.Peers { + peer := p2p.PeerInfo{ + ENR: rpcPeer.Enr, + Enode: rpcPeer.Enode, + ID: rpcPeer.Id, + Name: rpcPeer.Name, + Caps: rpcPeer.Caps, + Network: struct { + LocalAddress string `json:"localAddress"` + RemoteAddress string `json:"remoteAddress"` + Inbound bool `json:"inbound"` + Trusted bool `json:"trusted"` + Static bool `json:"static"` + }{ + LocalAddress: rpcPeer.ConnLocalAddr, + RemoteAddress: rpcPeer.ConnRemoteAddr, + Inbound: rpcPeer.ConnIsInbound, + Trusted: rpcPeer.ConnIsTrusted, + Static: rpcPeer.ConnIsStatic, + }, + Protocols: nil, + } + + peers = append(peers, &peer) + } + + return peers, nil +} diff --git a/cmd/rpcdaemon/services/eth_mining.go b/cmd/rpcdaemon/rpcservices/eth_mining.go similarity index 87% rename from cmd/rpcdaemon/services/eth_mining.go rename to cmd/rpcdaemon/rpcservices/eth_mining.go index 0a07cb77ff5..889b24d62e3 100644 --- a/cmd/rpcdaemon/services/eth_mining.go +++ b/cmd/rpcdaemon/rpcservices/eth_mining.go @@ -1,4 +1,4 @@ -package services +package rpcservices import ( "context" @@ -18,9 +18,9 @@ type MiningService struct { version gointerfaces.Version } -func NewMiningService(cc grpc.ClientConnInterface) *MiningService { +func NewMiningService(client txpool.MiningClient) *MiningService { return &MiningService{ - MiningClient: txpool.NewMiningClient(cc), + MiningClient: client, version: gointerfaces.VersionFromProto(privateapi.MiningAPIVersion), log: log.New("remote_service", "mining"), } @@ -29,7 +29,7 @@ func NewMiningService(cc grpc.ClientConnInterface) *MiningService { func (s *MiningService) EnsureVersionCompatibility() bool { versionReply, err := s.Version(context.Background(), &emptypb.Empty{}, grpc.WaitForReady(true)) if err != nil { - s.log.Error("getting Version", "error", err) + s.log.Error("getting Version", "err", err) return false } if !gointerfaces.EnsureVersion(s.version, versionReply) { diff --git a/cmd/rpcdaemon/rpcservices/eth_starknet.go b/cmd/rpcdaemon/rpcservices/eth_starknet.go new file mode 100644 index 00000000000..6dcc02d448d --- /dev/null +++ b/cmd/rpcdaemon/rpcservices/eth_starknet.go @@ -0,0 +1,31 @@ +package rpcservices + +import ( + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/starknet" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/log/v3" + "google.golang.org/grpc" +) + +// StarknetAPIVersion +var StarknetAPIVersion = &types2.VersionReply{Major: 1, Minor: 0, Patch: 0} + +type StarknetService struct { + starknet.CAIROVMClient + log log.Logger + version gointerfaces.Version +} + +func NewStarknetService(cc grpc.ClientConnInterface) *StarknetService { + return &StarknetService{ + CAIROVMClient: starknet.NewCAIROVMClient(cc), + version: gointerfaces.VersionFromProto(StarknetAPIVersion), + log: log.New("remote_service", "starknet"), + } +} + +func (s *StarknetService) EnsureVersionCompatibility() bool { + //TODO: add version check + return true +} diff --git a/cmd/rpcdaemon/services/eth_txpool.go b/cmd/rpcdaemon/rpcservices/eth_txpool.go similarity index 63% rename from cmd/rpcdaemon/services/eth_txpool.go rename to cmd/rpcdaemon/rpcservices/eth_txpool.go index 7d4753901a2..670a77b538b 100644 --- a/cmd/rpcdaemon/services/eth_txpool.go +++ b/cmd/rpcdaemon/rpcservices/eth_txpool.go @@ -1,35 +1,42 @@ -package services +package rpcservices import ( "context" "fmt" + "time" "github.com/ledgerwatch/erigon-lib/gointerfaces" - "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/ethdb/privateapi" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + txpooproto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + txpool2 "github.com/ledgerwatch/erigon-lib/txpool" "github.com/ledgerwatch/log/v3" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/emptypb" ) type TxPoolService struct { - txpool.TxpoolClient + txpooproto.TxpoolClient log log.Logger version gointerfaces.Version } -func NewTxPoolService(cc grpc.ClientConnInterface) *TxPoolService { +func NewTxPoolService(client txpooproto.TxpoolClient) *TxPoolService { return &TxPoolService{ - TxpoolClient: txpool.NewTxpoolClient(cc), - version: gointerfaces.VersionFromProto(privateapi.TxPoolAPIVersion), + TxpoolClient: client, + version: gointerfaces.VersionFromProto(txpool2.TxPoolAPIVersion), log: log.New("remote_service", "tx_pool"), } } func (s *TxPoolService) EnsureVersionCompatibility() bool { +Start: versionReply, err := s.Version(context.Background(), &emptypb.Empty{}, grpc.WaitForReady(true)) if err != nil { - s.log.Error("ensure version", "error", err) + if grpcutil.ErrIs(err, txpool2.ErrPoolDisabled) { + time.Sleep(3 * time.Second) + goto Start + } + s.log.Error("ensure version", "err", err) return false } if !gointerfaces.EnsureVersion(s.version, versionReply) { diff --git a/cmd/rpcdaemon/rpcservices/filters.go b/cmd/rpcdaemon/rpcservices/filters.go new file mode 100644 index 00000000000..32bce150a8c --- /dev/null +++ b/cmd/rpcdaemon/rpcservices/filters.go @@ -0,0 +1,628 @@ +package rpcservices + +import ( + "bytes" + "context" + "crypto/rand" + "errors" + "fmt" + "io" + "reflect" + "sync" + "sync/atomic" + "time" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + txpool2 "github.com/ledgerwatch/erigon-lib/txpool" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices/rpcinterfaces" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/filters" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" + "google.golang.org/grpc" +) + +type ( + SubscriptionID string + HeadsSubID SubscriptionID + PendingLogsSubID SubscriptionID + PendingBlockSubID SubscriptionID + PendingTxsSubID SubscriptionID + LogsSubID uint64 +) + +type Filters struct { + mu sync.RWMutex + + pendingBlock *types.Block + + headsSubs map[HeadsSubID]chan *types.Header + pendingLogsSubs map[PendingLogsSubID]chan types.Logs + pendingBlockSubs map[PendingBlockSubID]chan *types.Block + pendingTxsSubs map[PendingTxsSubID]chan []types.Transaction + logsSubs *LogsFilterAggregator + logsRequestor atomic.Value + onNewSnapshot func() + + storeMu sync.Mutex + logsStores map[LogsSubID][]*types.Log + pendingBlockStores map[PendingBlockSubID][]*types.Block + pendingTxsStores map[PendingTxsSubID][][]types.Transaction +} + +func New(ctx context.Context, ethBackend rpcinterfaces.ApiBackend, txPool txpool.TxpoolClient, mining txpool.MiningClient, onNewSnapshot func()) *Filters { + log.Info("rpc filters: subscribing to Erigon events") + + ff := &Filters{ + headsSubs: make(map[HeadsSubID]chan *types.Header), + pendingTxsSubs: make(map[PendingTxsSubID]chan []types.Transaction), + pendingLogsSubs: make(map[PendingLogsSubID]chan types.Logs), + pendingBlockSubs: make(map[PendingBlockSubID]chan *types.Block), + logsSubs: NewLogsFilterAggregator(), + onNewSnapshot: onNewSnapshot, + logsStores: make(map[LogsSubID][]*types.Log), + pendingBlockStores: make(map[PendingBlockSubID][]*types.Block), + pendingTxsStores: make(map[PendingTxsSubID][][]types.Transaction), + } + + go func() { + if ethBackend == nil { + return + } + for { + select { + case <-ctx.Done(): + return + default: + } + + if err := ethBackend.Subscribe(ctx, ff.OnNewEvent); err != nil { + select { + case <-ctx.Done(): + return + default: + } + if grpcutil.IsEndOfStream(err) || grpcutil.IsRetryLater(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("rpc filters: error subscribing to events", "err", err) + } + } + }() + + go func() { + if ethBackend == nil { + return + } + for { + select { + case <-ctx.Done(): + return + default: + } + if err := ethBackend.SubscribeLogs(ctx, ff.OnNewLogs, &ff.logsRequestor); err != nil { + select { + case <-ctx.Done(): + return + default: + } + if grpcutil.IsEndOfStream(err) || grpcutil.IsRetryLater(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("rpc filters: error subscribing to logs", "err", err) + } + } + }() + + if txPool != nil { + go func() { + for { + select { + case <-ctx.Done(): + return + default: + } + if err := ff.subscribeToPendingTransactions(ctx, txPool); err != nil { + select { + case <-ctx.Done(): + return + default: + } + if grpcutil.IsEndOfStream(err) || grpcutil.IsRetryLater(err) || grpcutil.ErrIs(err, txpool2.ErrPoolDisabled) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("rpc filters: error subscribing to pending transactions", "err", err) + } + } + }() + if !reflect.ValueOf(mining).IsNil() { //https://groups.google.com/g/golang-nuts/c/wnH302gBa4I + go func() { + for { + select { + case <-ctx.Done(): + return + default: + } + if err := ff.subscribeToPendingBlocks(ctx, mining); err != nil { + select { + case <-ctx.Done(): + return + default: + } + if grpcutil.IsEndOfStream(err) || grpcutil.IsRetryLater(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("rpc filters: error subscribing to pending blocks", "err", err) + } + } + }() + go func() { + for { + select { + case <-ctx.Done(): + return + default: + } + if err := ff.subscribeToPendingLogs(ctx, mining); err != nil { + select { + case <-ctx.Done(): + return + default: + } + if grpcutil.IsEndOfStream(err) || grpcutil.IsRetryLater(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("rpc filters: error subscribing to pending logs", "err", err) + } + } + }() + } + } + + return ff +} + +func (ff *Filters) LastPendingBlock() *types.Block { + ff.mu.RLock() + defer ff.mu.RUnlock() + return ff.pendingBlock +} + +func (ff *Filters) subscribeToPendingTransactions(ctx context.Context, txPool txpool.TxpoolClient) error { + subscription, err := txPool.OnAdd(ctx, &txpool.OnAddRequest{}, grpc.WaitForReady(true)) + if err != nil { + return err + } + for { + event, err := subscription.Recv() + if errors.Is(err, io.EOF) { + log.Debug("rpcdaemon: the subscription to pending transactions channel was closed") + break + } + if err != nil { + return err + } + + ff.OnNewTx(event) + } + return nil +} + +func (ff *Filters) subscribeToPendingBlocks(ctx context.Context, mining txpool.MiningClient) error { + subscription, err := mining.OnPendingBlock(ctx, &txpool.OnPendingBlockRequest{}, grpc.WaitForReady(true)) + if err != nil { + return err + } + for { + select { + case <-ctx.Done(): + return nil + default: + } + + event, err := subscription.Recv() + if errors.Is(err, io.EOF) { + log.Debug("rpcdaemon: the subscription to pending blocks channel was closed") + break + } + if err != nil { + return err + } + + ff.HandlePendingBlock(event) + } + return nil +} + +func (ff *Filters) HandlePendingBlock(reply *txpool.OnPendingBlockReply) { + b := &types.Block{} + if reply == nil || len(reply.RplBlock) == 0 { + return + } + if err := rlp.Decode(bytes.NewReader(reply.RplBlock), b); err != nil { + log.Warn("OnNewPendingBlock rpc filters, unprocessable payload", "err", err) + } + + ff.mu.Lock() + defer ff.mu.Unlock() + ff.pendingBlock = b + + for _, v := range ff.pendingBlockSubs { + v <- b + } +} + +func (ff *Filters) subscribeToPendingLogs(ctx context.Context, mining txpool.MiningClient) error { + subscription, err := mining.OnPendingLogs(ctx, &txpool.OnPendingLogsRequest{}, grpc.WaitForReady(true)) + if err != nil { + return err + } + for { + select { + case <-ctx.Done(): + return nil + default: + } + + event, err := subscription.Recv() + if errors.Is(err, io.EOF) { + log.Debug("rpcdaemon: the subscription to pending logs channel was closed") + break + } + if err != nil { + return err + } + + ff.HandlePendingLogs(event) + } + return nil +} + +func (ff *Filters) HandlePendingLogs(reply *txpool.OnPendingLogsReply) { + if len(reply.RplLogs) == 0 { + return + } + l := []*types.Log{} + if err := rlp.Decode(bytes.NewReader(reply.RplLogs), &l); err != nil { + log.Warn("OnNewPendingLogs rpc filters, unprocessable payload", "err", err) + } + + ff.mu.RLock() + defer ff.mu.RUnlock() + for _, v := range ff.pendingLogsSubs { + v <- l + } +} + +func (ff *Filters) SubscribeNewHeads(out chan *types.Header) HeadsSubID { + ff.mu.Lock() + defer ff.mu.Unlock() + id := HeadsSubID(generateSubscriptionID()) + ff.headsSubs[id] = out + return id +} + +func (ff *Filters) UnsubscribeHeads(id HeadsSubID) { + ff.mu.Lock() + defer ff.mu.Unlock() + delete(ff.headsSubs, id) +} + +func (ff *Filters) SubscribePendingLogs(c chan types.Logs) PendingLogsSubID { + ff.mu.Lock() + defer ff.mu.Unlock() + id := PendingLogsSubID(generateSubscriptionID()) + ff.pendingLogsSubs[id] = c + return id +} + +func (ff *Filters) UnsubscribePendingLogs(id PendingLogsSubID) { + ff.mu.Lock() + defer ff.mu.Unlock() + delete(ff.pendingLogsSubs, id) +} + +func (ff *Filters) SubscribePendingBlock(f chan *types.Block) PendingBlockSubID { + ff.mu.Lock() + defer ff.mu.Unlock() + id := PendingBlockSubID(generateSubscriptionID()) + ff.pendingBlockSubs[id] = f + return id +} + +func (ff *Filters) UnsubscribePendingBlock(id PendingBlockSubID) bool { + ff.mu.Lock() + defer ff.mu.Unlock() + if ch, ok := ff.pendingBlockSubs[id]; ok { + close(ch) + delete(ff.pendingBlockSubs, id) + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + delete(ff.pendingBlockStores, id) + return true + } + return false +} + +func (ff *Filters) SubscribePendingTxs(out chan []types.Transaction) PendingTxsSubID { + ff.mu.Lock() + defer ff.mu.Unlock() + id := PendingTxsSubID(generateSubscriptionID()) + ff.pendingTxsSubs[id] = out + return id +} + +func (ff *Filters) UnsubscribePendingTxs(id PendingTxsSubID) bool { + ff.mu.Lock() + defer ff.mu.Unlock() + if ch, ok := ff.pendingTxsSubs[id]; ok { + close(ch) + delete(ff.pendingTxsSubs, id) + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + delete(ff.pendingTxsStores, id) + return true + } + return false +} + +func (ff *Filters) SubscribeLogs(out chan *types.Log, crit filters.FilterCriteria) LogsSubID { + id, f := ff.logsSubs.insertLogsFilter(out) + f.addrs = map[common.Address]int{} + if len(crit.Addresses) == 0 { + f.allAddrs = 1 + } else { + for _, addr := range crit.Addresses { + f.addrs[addr] = 1 + } + } + f.topics = map[common.Hash]int{} + if len(crit.Topics) == 0 { + f.allTopics = 1 + } else { + for _, topics := range crit.Topics { + for _, topic := range topics { + f.topics[topic] = 1 + } + } + } + f.topicsOriginal = crit.Topics + ff.logsSubs.addLogsFilters(f) + lfr := &remote.LogsFilterRequest{ + AllAddresses: ff.logsSubs.aggLogsFilter.allAddrs == 1, + AllTopics: ff.logsSubs.aggLogsFilter.allTopics == 1, + } + for addr := range ff.logsSubs.aggLogsFilter.addrs { + lfr.Addresses = append(lfr.Addresses, gointerfaces.ConvertAddressToH160(addr)) + } + for topic := range ff.logsSubs.aggLogsFilter.topics { + lfr.Topics = append(lfr.Topics, gointerfaces.ConvertHashToH256(topic)) + } + ff.mu.Lock() + defer ff.mu.Unlock() + loaded := ff.logsRequestor.Load() + if loaded != nil { + if err := loaded.(func(*remote.LogsFilterRequest) error)(lfr); err != nil { + log.Warn("Could not update remote logs filter", "err", err) + ff.logsSubs.removeLogsFilter(id) + } + } + return id +} + +func (ff *Filters) UnsubscribeLogs(id LogsSubID) bool { + isDeleted := ff.logsSubs.removeLogsFilter(id) + lfr := &remote.LogsFilterRequest{ + AllAddresses: ff.logsSubs.aggLogsFilter.allAddrs == 1, + AllTopics: ff.logsSubs.aggLogsFilter.allTopics == 1, + } + for addr := range ff.logsSubs.aggLogsFilter.addrs { + lfr.Addresses = append(lfr.Addresses, gointerfaces.ConvertAddressToH160(addr)) + } + for topic := range ff.logsSubs.aggLogsFilter.topics { + lfr.Topics = append(lfr.Topics, gointerfaces.ConvertHashToH256(topic)) + } + ff.mu.Lock() + defer ff.mu.Unlock() + loaded := ff.logsRequestor.Load() + if loaded != nil { + if err := loaded.(func(*remote.LogsFilterRequest) error)(lfr); err != nil { + log.Warn("Could not update remote logs filter", "err", err) + return isDeleted || ff.logsSubs.removeLogsFilter(id) + } + } + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + delete(ff.logsStores, id) + return isDeleted +} + +func (ff *Filters) OnNewEvent(event *remote.SubscribeReply) { + ff.mu.RLock() + defer ff.mu.RUnlock() + + switch event.Type { + case remote.Event_HEADER: + payload := event.Data + var header types.Header + if len(payload) == 0 { + return + + } + err := rlp.Decode(bytes.NewReader(payload), &header) + if err != nil { + // ignoring what we can't unmarshal + log.Warn("OnNewEvent rpc filters (header), unprocessable payload", "err", err) + } else { + for _, v := range ff.headsSubs { + v <- &header + } + } + case remote.Event_NEW_SNAPSHOT: + ff.onNewSnapshot() + //case remote.Event_PENDING_LOGS: + // payload := event.Data + // var logs types.Logs + // err := rlp.Decode(bytes.NewReader(payload), &logs) + // if err != nil { + // // ignoring what we can't unmarshal + // log.Warn("OnNewEvent rpc filters (pending logs), unprocessable payload", "err", err) + // } else { + // for _, v := range ff.pendingLogsSubs { + // v <- logs + // } + // } + //case remote.Event_PENDING_BLOCK: + // payload := event.Data + // var block types.Block + // err := rlp.Decode(bytes.NewReader(payload), &block) + // if err != nil { + // // ignoring what we can't unmarshal + // log.Warn("OnNewEvent rpc filters (pending txs), unprocessable payload", "err", err) + // } else { + // for _, v := range ff.pendingBlockSubs { + // v <- &block + // } + // } + default: + log.Warn("OnNewEvent rpc filters: unsupported event type", "type", event.Type) + return + } +} + +func (ff *Filters) OnNewTx(reply *txpool.OnAddReply) { + ff.mu.RLock() + defer ff.mu.RUnlock() + + txs := make([]types.Transaction, len(reply.RplTxs)) + for i, rlpTx := range reply.RplTxs { + var decodeErr error + if len(rlpTx) == 0 { + continue + } + s := rlp.NewStream(bytes.NewReader(rlpTx), uint64(len(rlpTx))) + txs[i], decodeErr = types.DecodeTransaction(s) + if decodeErr != nil { + // ignoring what we can't unmarshal + log.Warn("OnNewTx rpc filters, unprocessable payload", "err", decodeErr, "data", fmt.Sprintf("%x", rlpTx)) + break + } + } + for _, v := range ff.pendingTxsSubs { + v <- txs + } +} + +func (ff *Filters) OnNewLogs(reply *remote.SubscribeLogsReply) { + lg := &types.Log{ + Address: gointerfaces.ConvertH160toAddress(reply.Address), + Data: reply.Data, + BlockNumber: reply.BlockNumber, + TxHash: gointerfaces.ConvertH256ToHash(reply.TransactionHash), + TxIndex: uint(reply.TransactionIndex), + BlockHash: gointerfaces.ConvertH256ToHash(reply.BlockHash), + Index: uint(reply.LogIndex), + Removed: reply.Removed, + } + t := make([]common.Hash, 0) + for _, v := range reply.Topics { + t = append(t, gointerfaces.ConvertH256ToHash(v)) + } + lg.Topics = t + ff.logsSubs.distributeLog(reply) +} + +func generateSubscriptionID() SubscriptionID { + var id [32]byte + + _, err := rand.Read(id[:]) + if err != nil { + log.Crit("rpc filters: error creating random id", "err", err) + } + + return SubscriptionID(fmt.Sprintf("%x", id)) +} + +func (ff *Filters) AddLogs(id LogsSubID, logs *types.Log) { + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + st, ok := ff.logsStores[id] + if !ok { + st = make([]*types.Log, 0) + } + st = append(st, logs) + ff.logsStores[id] = st +} + +func (ff *Filters) ReadLogs(id LogsSubID) ([]*types.Log, bool) { + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + res := make([]*types.Log, 0) + st, ok := ff.logsStores[id] + if !ok { + return res, false + } + res = append(res, st...) + st = make([]*types.Log, 0) + ff.logsStores[id] = st + return res, true +} + +func (ff *Filters) AddPendingBlock(id PendingBlockSubID, block *types.Block) { + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + st, ok := ff.pendingBlockStores[id] + if !ok { + st = make([]*types.Block, 0) + } + st = append(st, block) + ff.pendingBlockStores[id] = st +} + +func (ff *Filters) ReadPendingBlocks(id PendingBlockSubID) ([]*types.Block, bool) { + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + res := make([]*types.Block, 0) + st, ok := ff.pendingBlockStores[id] + if !ok { + return res, false + } + res = append(res, st...) + st = make([]*types.Block, 0) + ff.pendingBlockStores[id] = st + return res, true +} + +func (ff *Filters) AddPendingTxs(id PendingTxsSubID, txs []types.Transaction) { + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + st, ok := ff.pendingTxsStores[id] + if !ok { + st = make([][]types.Transaction, 0) + } + st = append(st, txs) + ff.pendingTxsStores[id] = st +} + +func (ff *Filters) ReadPendingTxs(id PendingTxsSubID) ([][]types.Transaction, bool) { + ff.storeMu.Lock() + defer ff.storeMu.Unlock() + res := make([][]types.Transaction, 0) + st, ok := ff.pendingTxsStores[id] + if !ok { + return res, false + } + res = append(res, st...) + st = make([][]types.Transaction, 0) + ff.pendingTxsStores[id] = st + return res, true +} diff --git a/cmd/rpcdaemon/rpcservices/logsfilter.go b/cmd/rpcdaemon/rpcservices/logsfilter.go new file mode 100644 index 00000000000..b3c6c90c2f1 --- /dev/null +++ b/cmd/rpcdaemon/rpcservices/logsfilter.go @@ -0,0 +1,163 @@ +package rpcservices + +import ( + "sync" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon/common" + types2 "github.com/ledgerwatch/erigon/core/types" +) + +type LogsFilterAggregator struct { + aggLogsFilter LogsFilter // Aggregation of all current log filters + logsFilters map[LogsSubID]*LogsFilter // Filter for each subscriber, keyed by filterID + logsFilterLock sync.Mutex + nextFilterId LogsSubID +} + +// LogsFilter is used for both representing log filter for a specific subscriber (RPC daemon usually) +// and "aggregated" log filter representing a union of all subscribers. Therefore, the values in +// the mappings are counters (of type int) and they get deleted when counter goes back to 0 +// Also, addAddr and allTopic are int instead of bool because they are also counter, counting +// how many subscribers have this set on +type LogsFilter struct { + allAddrs int + addrs map[common.Address]int + allTopics int + topics map[common.Hash]int + topicsOriginal [][]common.Hash // Original topic filters to be applied before distributing to individual subscribers + sender chan *types2.Log // nil for aggregate subscriber, for appropriate stream server otherwise +} + +func NewLogsFilterAggregator() *LogsFilterAggregator { + return &LogsFilterAggregator{ + aggLogsFilter: LogsFilter{ + addrs: make(map[common.Address]int), + topics: make(map[common.Hash]int), + }, + logsFilters: make(map[LogsSubID]*LogsFilter), + nextFilterId: 0, + } +} + +func (a *LogsFilterAggregator) insertLogsFilter(sender chan *types2.Log) (LogsSubID, *LogsFilter) { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + filterId := a.nextFilterId + a.nextFilterId++ + filter := &LogsFilter{addrs: map[common.Address]int{}, topics: map[common.Hash]int{}, sender: sender} + a.logsFilters[filterId] = filter + return filterId, filter +} + +func (a *LogsFilterAggregator) removeLogsFilter(filterId LogsSubID) bool { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + if filter, ok := a.logsFilters[filterId]; ok { + a.subtractLogFilters(filter) + close(filter.sender) + delete(a.logsFilters, filterId) + return true + } + return false +} + +func (a *LogsFilterAggregator) subtractLogFilters(f *LogsFilter) { + a.aggLogsFilter.allAddrs -= f.allAddrs + for addr, count := range f.addrs { + a.aggLogsFilter.addrs[addr] -= count + if a.aggLogsFilter.addrs[addr] == 0 { + delete(a.aggLogsFilter.addrs, addr) + } + } + a.aggLogsFilter.allTopics -= f.allTopics + for topic, count := range f.topics { + a.aggLogsFilter.topics[topic] -= count + if a.aggLogsFilter.topics[topic] == 0 { + delete(a.aggLogsFilter.topics, topic) + } + } +} + +func (a *LogsFilterAggregator) addLogsFilters(f *LogsFilter) { + a.aggLogsFilter.allAddrs += f.allAddrs + for addr, count := range f.addrs { + a.aggLogsFilter.addrs[addr] += count + } + a.aggLogsFilter.allTopics += f.allTopics + for topic, count := range f.topics { + a.aggLogsFilter.topics[topic] += count + } +} + +func (a *LogsFilterAggregator) distributeLog(eventLog *remote.SubscribeLogsReply) error { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + filtersToDelete := make(map[LogsSubID]*LogsFilter) + for _, filter := range a.logsFilters { + if filter.allAddrs == 0 { + _, addrOk := filter.addrs[gointerfaces.ConvertH160toAddress(eventLog.Address)] + if !addrOk { + continue + } + } + var topics []common.Hash + for _, topic := range eventLog.Topics { + topics = append(topics, gointerfaces.ConvertH256ToHash(topic)) + } + if filter.allTopics == 0 { + if !a.chooseTopics(filter, topics) { + continue + } + } + lg := &types2.Log{ + Address: gointerfaces.ConvertH160toAddress(eventLog.Address), + Topics: topics, + Data: eventLog.Data, + BlockNumber: eventLog.BlockNumber, + TxHash: gointerfaces.ConvertH256ToHash(eventLog.TransactionHash), + TxIndex: uint(eventLog.TransactionIndex), + BlockHash: gointerfaces.ConvertH256ToHash(eventLog.BlockHash), + Index: uint(eventLog.LogIndex), + Removed: eventLog.Removed, + } + filter.sender <- lg + } + // remove malfunctioned filters + for filterId, filter := range filtersToDelete { + a.subtractLogFilters(filter) + delete(a.logsFilters, filterId) + } + + return nil +} + +func (a *LogsFilterAggregator) chooseTopics(filter *LogsFilter, logTopics []common.Hash) bool { + var found bool + for _, logTopic := range logTopics { + if _, ok := filter.topics[logTopic]; ok { + found = true + break + } + } + if !found { + return false + } + if len(filter.topicsOriginal) > len(logTopics) { + return false + } + for i, sub := range filter.topicsOriginal { + match := len(sub) == 0 // empty rule set == wildcard + for _, topic := range sub { + if logTopics[i] == topic { + match = true + break + } + } + if !match { + return false + } + } + return true +} diff --git a/cmd/rpcdaemon/rpcservices/rpcinterfaces/interface.go b/cmd/rpcdaemon/rpcservices/rpcinterfaces/interface.go new file mode 100644 index 00000000000..35c39b3f962 --- /dev/null +++ b/cmd/rpcdaemon/rpcservices/rpcinterfaces/interface.go @@ -0,0 +1,32 @@ +package rpcinterfaces + +import ( + "context" + "sync/atomic" + + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/p2p" +) + +// ApiBackend - interface which must be used by API layer +// implementation can work with local Ethereum object or with Remote (grpc-based) one +// this is reason why all methods are accepting context and returning error +type ApiBackend interface { + Etherbase(ctx context.Context) (common.Address, error) + NetVersion(ctx context.Context) (uint64, error) + NetPeerCount(ctx context.Context) (uint64, error) + ProtocolVersion(ctx context.Context) (uint64, error) + ClientVersion(ctx context.Context) (string, error) + Subscribe(ctx context.Context, cb func(*remote.SubscribeReply)) error + SubscribeLogs(ctx context.Context, cb func(*remote.SubscribeLogsReply), requestor *atomic.Value) error + BlockWithSenders(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (block *types.Block, senders []common.Address, err error) + EngineNewPayloadV1(ctx context.Context, payload *types2.ExecutionPayload) (*remote.EnginePayloadStatus, error) + EngineForkchoiceUpdatedV1(ctx context.Context, request *remote.EngineForkChoiceUpdatedRequest) (*remote.EngineForkChoiceUpdatedReply, error) + EngineGetPayloadV1(ctx context.Context, payloadId uint64) (*types2.ExecutionPayload, error) + NodeInfo(ctx context.Context, limit uint32) ([]p2p.NodeInfo, error) + Peers(ctx context.Context) ([]*p2p.PeerInfo, error) +} diff --git a/cmd/rpcdaemon/services/eth_backend.go b/cmd/rpcdaemon/services/eth_backend.go deleted file mode 100644 index 6b3a45430bc..00000000000 --- a/cmd/rpcdaemon/services/eth_backend.go +++ /dev/null @@ -1,143 +0,0 @@ -package services - -import ( - "context" - "errors" - "fmt" - "io" - - "github.com/ledgerwatch/erigon-lib/gointerfaces" - "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/ethdb/privateapi" - "github.com/ledgerwatch/log/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" -) - -// ApiBackend - interface which must be used by API layer -// implementation can work with local Ethereum object or with Remote (grpc-based) one -// this is reason why all methods are accepting context and returning error -type ApiBackend interface { - Etherbase(ctx context.Context) (common.Address, error) - NetVersion(ctx context.Context) (uint64, error) - NetPeerCount(ctx context.Context) (uint64, error) - ProtocolVersion(ctx context.Context) (uint64, error) - ClientVersion(ctx context.Context) (string, error) - Subscribe(ctx context.Context, cb func(*remote.SubscribeReply)) error -} - -type RemoteBackend struct { - remoteEthBackend remote.ETHBACKENDClient - log log.Logger - version gointerfaces.Version -} - -func NewRemoteBackend(cc grpc.ClientConnInterface) *RemoteBackend { - return &RemoteBackend{ - remoteEthBackend: remote.NewETHBACKENDClient(cc), - version: gointerfaces.VersionFromProto(privateapi.EthBackendAPIVersion), - log: log.New("remote_service", "eth_backend"), - } -} - -func (back *RemoteBackend) EnsureVersionCompatibility() bool { - versionReply, err := back.remoteEthBackend.Version(context.Background(), &emptypb.Empty{}, grpc.WaitForReady(true)) - if err != nil { - - back.log.Error("getting Version", "error", err) - return false - } - if !gointerfaces.EnsureVersion(back.version, versionReply) { - back.log.Error("incompatible interface versions", "client", back.version.String(), - "server", fmt.Sprintf("%d.%d.%d", versionReply.Major, versionReply.Minor, versionReply.Patch)) - return false - } - back.log.Info("interfaces compatible", "client", back.version.String(), - "server", fmt.Sprintf("%d.%d.%d", versionReply.Major, versionReply.Minor, versionReply.Patch)) - return true -} - -func (back *RemoteBackend) Etherbase(ctx context.Context) (common.Address, error) { - res, err := back.remoteEthBackend.Etherbase(ctx, &remote.EtherbaseRequest{}) - if err != nil { - if s, ok := status.FromError(err); ok { - return common.Address{}, errors.New(s.Message()) - } - return common.Address{}, err - } - - return gointerfaces.ConvertH160toAddress(res.Address), nil -} - -func (back *RemoteBackend) NetVersion(ctx context.Context) (uint64, error) { - res, err := back.remoteEthBackend.NetVersion(ctx, &remote.NetVersionRequest{}) - if err != nil { - if s, ok := status.FromError(err); ok { - return 0, errors.New(s.Message()) - } - return 0, err - } - - return res.Id, nil -} - -func (back *RemoteBackend) NetPeerCount(ctx context.Context) (uint64, error) { - res, err := back.remoteEthBackend.NetPeerCount(ctx, &remote.NetPeerCountRequest{}) - if err != nil { - if s, ok := status.FromError(err); ok { - return 0, errors.New(s.Message()) - } - return 0, err - } - - return res.Count, nil -} - -func (back *RemoteBackend) ProtocolVersion(ctx context.Context) (uint64, error) { - res, err := back.remoteEthBackend.ProtocolVersion(ctx, &remote.ProtocolVersionRequest{}) - if err != nil { - if s, ok := status.FromError(err); ok { - return 0, errors.New(s.Message()) - } - return 0, err - } - - return res.Id, nil -} - -func (back *RemoteBackend) ClientVersion(ctx context.Context) (string, error) { - res, err := back.remoteEthBackend.ClientVersion(ctx, &remote.ClientVersionRequest{}) - if err != nil { - if s, ok := status.FromError(err); ok { - return "", errors.New(s.Message()) - } - return "", err - } - - return res.NodeName, nil -} - -func (back *RemoteBackend) Subscribe(ctx context.Context, onNewEvent func(*remote.SubscribeReply)) error { - subscription, err := back.remoteEthBackend.Subscribe(ctx, &remote.SubscribeRequest{}, grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok { - return errors.New(s.Message()) - } - return err - } - for { - event, err := subscription.Recv() - if err == io.EOF { - log.Info("rpcdaemon: the subscription channel was closed") - break - } - if err != nil { - return err - } - - onNewEvent(event) - } - return nil -} diff --git a/cmd/rpcdaemon/test.http b/cmd/rpcdaemon/test.http index 41e780cb183..cf6205cf37c 100644 --- a/cmd/rpcdaemon/test.http +++ b/cmd/rpcdaemon/test.http @@ -4,25 +4,67 @@ POST localhost:8545 Content-Type: application/json -{ "jsonrpc": "2.0", "method": "eth_syncing", "params": [], "id":1} +{ + "jsonrpc": "2.0", + "method": "eth_syncing", + "params": [], + "id": 1 +} ### POST localhost:8545 Content-Type: application/json -{"jsonrpc":"2.0","method":"eth_getBalance","params": ["0xfffa4763f94f7ad191b366a343092a5d1a47ed08", "0xde84"],"id":1} +{ + "jsonrpc": "2.0", + "method": "eth_getBalance", + "params": [ + "0xfffa4763f94f7ad191b366a343092a5d1a47ed08", + "0xde84" + ], + "id": 1 +} ### POST localhost:8545 Content-Type: application/json -{ "jsonrpc": "2.0", "method": "debug_accountRange", "params": ["0x1e8480", "", 256, false, false, false], "id":1} +{ + "jsonrpc": "2.0", + "method": "debug_accountRange", + "params": [ + "0x1e8480", + "", + 256, + false, + false, + false + ], + "id": 1 +} ### -# curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber", "params": ["0x1b4", true], "id":1}' localhost:8545 +# curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash", "params": ["0x1302cc71b89c1482b18a97a6fa2c9c375f4bf7548122363b6e91528440272fde"], "id":1}' localhost:8545 +POST localhost:8545 +Content-Type: application/json + +{ + "jsonrpc": "2.0", + "method": "eth_getTransactionByHash", + "params": [ + "0x1302cc71b89c1482b18a97a6fa2c9c375f4bf7548122363b6e91528440272fde" + ], + "id": 1 +} + +### + + + +# curl -X POST -H "Content-Type: application/json" --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash", "params": ["0x1302cc71b89c1482b18a97a6fa2c9c375f4bf7548122363b6e91528440272fde"], "id":1}' localhost:8545 POST localhost:8545 Content-Type: application/json @@ -30,7 +72,7 @@ Content-Type: application/json "jsonrpc": "2.0", "method": "eth_getBlockByNumber", "params": [ - "0x1b4", + "0x4C4B40", true ], "id": 1 @@ -54,7 +96,15 @@ Content-Type: application/json POST localhost:8545 Content-Type: application/json -{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0xf4240",true],"id":2} +{ + "jsonrpc": "2.0", + "method": "eth_getBlockByNumber", + "params": [ + "0xf4240", + true + ], + "id": 2 +} ### @@ -73,6 +123,7 @@ Content-Type: application/json ], "id": 537758 } + ### > 60 ### >20 diff --git a/cmd/rpctest/main.go b/cmd/rpctest/main.go index 1cca82b2e34..53a19fe0877 100644 --- a/cmd/rpctest/main.go +++ b/cmd/rpctest/main.go @@ -22,6 +22,7 @@ func main() { erigonURL string blockFrom uint64 blockTo uint64 + latest bool recordFile string errorFile string ) @@ -35,6 +36,9 @@ func main() { cmd.Flags().Uint64Var(&blockFrom, "blockFrom", 2000000, "Block number to start test generation from") cmd.Flags().Uint64Var(&blockTo, "blockTo", 2101000, "Block number to end test generation at") } + withLatest := func(cmd *cobra.Command) { + cmd.Flags().BoolVar(&latest, "latest", false, "Exec on latest ") + } withNeedCompare := func(cmd *cobra.Command) { cmd.Flags().BoolVar(&needCompare, "needCompare", false, "need compare with geth") } @@ -50,6 +54,16 @@ func main() { } } + var benchEthCallCmd = &cobra.Command{ + Use: "benchEthCall", + Short: "", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + rpctest.BenchEthCall(erigonURL, gethURL, needCompare, latest, blockFrom, blockTo, recordFile, errorFile) + }, + } + with(benchEthCallCmd, withErigonUrl, withGethUrl, withNeedCompare, withBlockNum, withRecord, withErrorFile, withLatest) + var bench1Cmd = &cobra.Command{ Use: "bench1", Short: "", @@ -138,6 +152,16 @@ func main() { } with(bench9Cmd, withErigonUrl, withGethUrl, withNeedCompare) + var benchTraceBlockByHashCmd = &cobra.Command{ + Use: "benchTraceBlockByHash", + Short: "", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + rpctest.BenchTraceBlockByHash(erigonURL, gethURL, needCompare, blockFrom, blockTo, recordFile, errorFile) + }, + } + with(benchTraceBlockByHashCmd, withGethUrl, withErigonUrl, withNeedCompare, withBlockNum, withRecord, withErrorFile) + var benchTraceTransactionCmd = &cobra.Command{ Use: "benchTraceTransaction", Short: "", @@ -222,8 +246,8 @@ func main() { Use: "replay", Short: "", Long: ``, - Run: func(cmd *cobra.Command, args []string) { - rpctest.Replay(erigonURL, recordFile) + RunE: func(cmd *cobra.Command, args []string) error { + return rpctest.Replay(erigonURL, recordFile) }, } with(replayCmd, withErigonUrl, withRecord) @@ -250,6 +274,7 @@ func main() { rootCmd.Flags().Uint64Var(&blockTo, "blockTo", 2101000, "Block number to end test generation at") rootCmd.AddCommand( + benchEthCallCmd, bench1Cmd, bench2Cmd, bench3Cmd, diff --git a/cmd/rpctest/rpctest/bench1.go b/cmd/rpctest/rpctest/bench1.go index a4d500f4e92..3096e8eb1f9 100644 --- a/cmd/rpctest/rpctest/bench1.go +++ b/cmd/rpctest/rpctest/bench1.go @@ -6,7 +6,7 @@ import ( "fmt" "net/http" "os" - "path" + "path/filepath" "time" "github.com/ledgerwatch/erigon/common" @@ -357,14 +357,14 @@ func vegetaWrite(enabled bool, methods []string, resultsCh chan CallResult) { } tmpDir := os.TempDir() fmt.Printf("tmp dir is: %s\n", tmpDir) - dir := path.Join(tmpDir, "erigon_stress_test") + dir := filepath.Join(tmpDir, "erigon_stress_test") if err = os.MkdirAll(dir, 0770); err != nil { panic(err) } for _, route := range []string{Geth, Erigon} { for _, method := range methods { - file := path.Join(dir, "results_"+route+"_"+method+".csv") + file := filepath.Join(dir, "results_"+route+"_"+method+".csv") files[route][method], err = os.OpenFile(file, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) if err != nil { panic(err) @@ -374,7 +374,7 @@ func vegetaWrite(enabled bool, methods []string, resultsCh chan CallResult) { for _, route := range []string{Geth, Erigon} { for _, method := range methods { - file := path.Join(dir, "vegeta_"+route+"_"+method+".txt") + file := filepath.Join(dir, "vegeta_"+route+"_"+method+".txt") vegetaFiles[route][method], err = os.OpenFile(file, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) if err != nil { panic(err) diff --git a/cmd/rpctest/rpctest/bench_debugtracecall.go b/cmd/rpctest/rpctest/bench_debugtracecall.go index e4acd7812e5..033a3d1fb80 100644 --- a/cmd/rpctest/rpctest/bench_debugtracecall.go +++ b/cmd/rpctest/rpctest/bench_debugtracecall.go @@ -12,7 +12,6 @@ import ( // but also can be used for comparing RPCDaemon with Geth // parameters: // needCompare - if false - doesn't call Erigon and doesn't compare responses -// use false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon func BenchDebugTraceCall(erigonURL, gethURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, gethURL) var client = &http.Client{ @@ -94,7 +93,7 @@ func BenchDebugTraceCall(erigonURL, gethURL string, needCompare bool, blockFrom request := reqGen.debugTraceCall(tx.From, tx.To, &tx.Gas, &tx.GasPrice, &tx.Value, tx.Input, bn-1) errCtx := fmt.Sprintf("block %d tx %s", bn, tx.Hash) - if err := requestAndCompare(request, "debug_traceCall", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "debug_traceCall", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_ethcall.go b/cmd/rpctest/rpctest/bench_ethcall.go new file mode 100644 index 00000000000..3358f98c591 --- /dev/null +++ b/cmd/rpctest/rpctest/bench_ethcall.go @@ -0,0 +1,122 @@ +package rpctest + +import ( + "bufio" + "fmt" + "net/http" + "os" + "time" +) + +// BenchEthCall compares response of Erigon with Geth +// but also can be used for comparing RPCDaemon with Geth or infura +// parameters: +// needCompare - if false - doesn't call Erigon and doesn't compare responses +// false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon +// recordFile stores all eth_call returned with success +// errorFile stores information when erigon and geth doesn't return same data +func BenchEthCall(erigonURL, gethURL string, needCompare, latest bool, blockFrom, blockTo uint64, recordFile string, errorFile string) { + setRoutes(erigonURL, gethURL) + var client = &http.Client{ + Timeout: time.Second * 600, + } + + var rec *bufio.Writer + var errs *bufio.Writer + var resultsCh chan CallResult = nil + var nTransactions = 0 + + if errorFile != "" { + f, err := os.Create(errorFile) + if err != nil { + fmt.Printf("Cannot create file %s for errorFile: %v\n", errorFile, err) + return + } + defer f.Close() + errs = bufio.NewWriter(f) + defer errs.Flush() + } + + if recordFile != "" { + frec, errRec := os.Create(recordFile) + if errRec != nil { + fmt.Printf("Cannot create file %s for errorFile: %v\n", recordFile, errRec) + return + } + defer frec.Close() + rec = bufio.NewWriter(frec) + defer rec.Flush() + } + + if !needCompare { + resultsCh = make(chan CallResult, 1000) + defer close(resultsCh) + go vegetaWrite(true, []string{"eth_call"}, resultsCh) + } + var res CallResult + + reqGen := &RequestGenerator{ + client: client, + } + + reqGen.reqID++ + + for bn := blockFrom; bn <= blockTo; bn++ { + reqGen.reqID++ + var b EthBlockByNumber + res = reqGen.Erigon("eth_getBlockByNumber", reqGen.getBlockByNumber(bn), &b) + if res.Err != nil { + fmt.Printf("Could not retrieve block (Erigon) %d: %v\n", bn, res.Err) + return + } + + if b.Error != nil { + fmt.Printf("Error retrieving block (Erigon): %d %s\n", b.Error.Code, b.Error.Message) + return + } + + if needCompare { + var bg EthBlockByNumber + res = reqGen.Geth("eth_getBlockByNumber", reqGen.getBlockByNumber(bn), &bg) + if res.Err != nil { + fmt.Printf("Could not retrieve block (geth) %d: %v\n", bn, res.Err) + return + } + if bg.Error != nil { + fmt.Printf("Error retrieving block (geth): %d %s\n", bg.Error.Code, bg.Error.Message) + return + } + if !compareBlocks(&b, &bg) { + fmt.Printf("Block difference for %d\n", bn) + if rec != nil { + fmt.Fprintf(rec, "Block difference for block=%d\n", bn) + rec.Flush() + continue + } else { + return + } + } + } + + for _, tx := range b.Result.Transactions { + + reqGen.reqID++ + nTransactions = nTransactions + 1 + + var request string + if latest { + request = reqGen.ethCallLatest(tx.From, tx.To, &tx.Gas, &tx.GasPrice, &tx.Value, tx.Input) + } else { + request = reqGen.ethCall(tx.From, tx.To, &tx.Gas, &tx.GasPrice, &tx.Value, tx.Input, bn-1) + } + errCtx := fmt.Sprintf(" bn=%d hash=%s", bn, tx.Hash) + + if err := requestAndCompare(request, "eth_call", errCtx, reqGen, needCompare, rec, errs, resultsCh); err != nil { + fmt.Println(err) + return + } + } + + fmt.Println("\nProcessed Transactions: ", nTransactions) + } +} diff --git a/cmd/rpctest/rpctest/bench_ethgetlogs.go b/cmd/rpctest/rpctest/bench_ethgetlogs.go index f3a8fe086fd..0d02f1ade46 100644 --- a/cmd/rpctest/rpctest/bench_ethgetlogs.go +++ b/cmd/rpctest/rpctest/bench_ethgetlogs.go @@ -9,6 +9,13 @@ import ( "time" ) +// BenchEthGetLogs compares response of Erigon with Geth +// but also can be used for comparing RPCDaemon with Geth or infura +// parameters: +// needCompare - if false - doesn't call Erigon and doesn't compare responses +// false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon +// recordFile stores all eth_getlogs returned with success +// errorFile stores information when erigon and geth doesn't return same data func BenchEthGetLogs(erigonURL, gethURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, gethURL) var client = &http.Client{ @@ -37,9 +44,13 @@ func BenchEthGetLogs(erigonURL, gethURL string, needCompare bool, blockFrom uint errs = bufio.NewWriter(ferr) defer errs.Flush() } - resultsCh := make(chan CallResult, 1000) - defer close(resultsCh) - go vegetaWrite(false, []string{"debug_getModifiedAccountsByNumber", "eth_getLogs"}, resultsCh) + + var resultsCh chan CallResult = nil + if !needCompare { + resultsCh = make(chan CallResult, 1000) + defer close(resultsCh) + go vegetaWrite(true, []string{"debug_getModifiedAccountsByNumber", "eth_getLogs"}, resultsCh) + } var res CallResult reqGen := &RequestGenerator{ @@ -81,7 +92,7 @@ func BenchEthGetLogs(erigonURL, gethURL string, needCompare bool, blockFrom uint reqGen.reqID++ request := reqGen.getLogs(prevBn, bn, account) errCtx := fmt.Sprintf("account %x blocks %d-%d", account, prevBn, bn) - if err := requestAndCompare(request, "eth_getLogs", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "eth_getLogs", errCtx, reqGen, needCompare, rec, errs, resultsCh); err != nil { fmt.Println(err) return } @@ -91,7 +102,7 @@ func BenchEthGetLogs(erigonURL, gethURL string, needCompare bool, blockFrom uint reqGen.reqID++ request = reqGen.getLogs1(prevBn, bn+10000, account, topic) errCtx := fmt.Sprintf("account %x topic %x blocks %d-%d", account, topic, prevBn, bn) - if err := requestAndCompare(request, "eth_getLogs", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "eth_getLogs", errCtx, reqGen, needCompare, rec, errs, resultsCh); err != nil { fmt.Println(err) return } @@ -106,7 +117,7 @@ func BenchEthGetLogs(erigonURL, gethURL string, needCompare bool, blockFrom uint reqGen.reqID++ request = reqGen.getLogs2(prevBn, bn+100000, account, topics[idx1], topics[idx2]) errCtx := fmt.Sprintf("account %x topic1 %x topic2 %x blocks %d-%d", account, topics[idx1], topics[idx2], prevBn, bn) - if err := requestAndCompare(request, "eth_getLogs", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "eth_getLogs", errCtx, reqGen, needCompare, rec, errs, resultsCh); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_traceblock.go b/cmd/rpctest/rpctest/bench_traceblock.go index 8752b391704..fe05c04b6f9 100644 --- a/cmd/rpctest/rpctest/bench_traceblock.go +++ b/cmd/rpctest/rpctest/bench_traceblock.go @@ -12,7 +12,6 @@ import ( // but also can be used for comparing RPCDaemon with OpenEthereum // parameters: // needCompare - if false - doesn't call Erigon and doesn't compare responses -// use false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon func BenchTraceBlock(erigonURL, oeURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, oeURL) var client = &http.Client{ @@ -74,7 +73,7 @@ func BenchTraceBlock(erigonURL, oeURL string, needCompare bool, blockFrom uint64 reqGen.reqID++ request := reqGen.traceBlock(bn) errCtx := fmt.Sprintf("block %d", bn) - if err := requestAndCompare(request, "trace_block", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "trace_block", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_tracecall.go b/cmd/rpctest/rpctest/bench_tracecall.go index 4caff26c7b7..2ba848b0c58 100644 --- a/cmd/rpctest/rpctest/bench_tracecall.go +++ b/cmd/rpctest/rpctest/bench_tracecall.go @@ -12,7 +12,6 @@ import ( // but also can be used for comparing RPCDaemon with Geth // parameters: // needCompare - if false - doesn't call Erigon and doesn't compare responses -// use false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon func BenchTraceCall(erigonURL, oeURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, oeURL) var client = &http.Client{ @@ -76,7 +75,7 @@ func BenchTraceCall(erigonURL, oeURL string, needCompare bool, blockFrom uint64, reqGen.reqID++ request := reqGen.traceCall(tx.From, tx.To, &tx.Gas, &tx.GasPrice, &tx.Value, tx.Input, bn-1) errCtx := fmt.Sprintf("block %d, tx %s", bn, tx.Hash) - if err := requestAndCompare(request, "trace_call", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "trace_call", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { return } } diff --git a/cmd/rpctest/rpctest/bench_tracecallmany.go b/cmd/rpctest/rpctest/bench_tracecallmany.go index ab0133c8ea5..7035a8cadd4 100644 --- a/cmd/rpctest/rpctest/bench_tracecallmany.go +++ b/cmd/rpctest/rpctest/bench_tracecallmany.go @@ -15,7 +15,6 @@ import ( // but also can be used for comparing RPCDaemon with Geth // parameters: // needCompare - if false - doesn't call Erigon and doesn't compare responses -// use false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon func BenchTraceCallMany(erigonURL, oeURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, oeURL) var client = &http.Client{ @@ -95,7 +94,7 @@ func BenchTraceCallMany(erigonURL, oeURL string, needCompare bool, blockFrom uin request := reqGen.traceCallMany(from, to, gas, gasPrice, value, data, bn-1) errCtx := fmt.Sprintf("block %d", bn) - if err := requestAndCompare(request, "trace_callMany", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "trace_callMany", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_tracefilter.go b/cmd/rpctest/rpctest/bench_tracefilter.go index 26b116a687a..17af54977d8 100644 --- a/cmd/rpctest/rpctest/bench_tracefilter.go +++ b/cmd/rpctest/rpctest/bench_tracefilter.go @@ -3,16 +3,18 @@ package rpctest import ( "bufio" "fmt" + "math/rand" "net/http" "os" "time" + + "github.com/ledgerwatch/erigon/common" ) // Compares response of Erigon with OpenEthereum // but also can be used for comparing RPCDaemon with Geth // parameters: // needCompare - if false - doesn't call Erigon and doesn't compare responses -// use false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon func BenchTraceFilter(erigonURL, oeURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, oeURL) var client = &http.Client{ @@ -58,6 +60,7 @@ func BenchTraceFilter(erigonURL, oeURL string, needCompare bool, blockFrom uint6 return } fmt.Printf("Last block: %d\n", blockNumber.Number) + rnd := rand.New(rand.NewSource(42)) // nolint:gosec prevBn := blockFrom for bn := blockFrom + 100; bn < blockTo; bn += 100 { // Checking modified accounts @@ -74,18 +77,64 @@ func BenchTraceFilter(erigonURL, oeURL string, needCompare bool, blockFrom uint6 } if res.Err == nil && mag.Error == nil { accountSet := extractAccountMap(&mag) + accounts := make([]common.Address, 0, len(accountSet)) for account := range accountSet { + accounts = append(accounts, account) + } + // Randomly select 100 accounts + selects := 100 + if len(accounts) < 100 { + selects = len(accounts) + } + for i := 0; i < selects; i++ { + idx := i + if len(accounts) > 100 { + idx = int(rnd.Int31n(int32(len(accounts)))) + } + account := accounts[idx] reqGen.reqID++ request := reqGen.traceFilterFrom(prevBn, bn, account) errCtx := fmt.Sprintf("traceFilterFrom fromBlock %d, toBlock %d, fromAddress %x", prevBn, bn, account) - if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } reqGen.reqID++ request = reqGen.traceFilterTo(prevBn, bn, account) errCtx = fmt.Sprintf("traceFilterTo fromBlock %d, toBlock %d, fromAddress %x", prevBn, bn, account) - if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { + fmt.Println(err) + return + } + } + if len(accounts) > 1 { + from := accounts[0] + to := accounts[1] + reqGen.reqID++ + request := reqGen.traceFilterUnion(prevBn, bn, from, to) + errCtx := fmt.Sprintf("traceFilterUnion fromBlock %d, toBlock %d, fromAddress %x, toAddress %x", prevBn, bn, from, to) + if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { + fmt.Println(err) + return + } + reqGen.reqID++ + request = reqGen.traceFilterAfter(prevBn, bn, 1) + errCtx = fmt.Sprintf("traceFilterAfter fromBlock %d, toBlock %d, after %x", prevBn, bn, 1) + if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { + fmt.Println(err) + return + } + reqGen.reqID++ + request = reqGen.traceFilterCount(prevBn, bn, 1) + errCtx = fmt.Sprintf("traceFilterCount fromBlock %d, toBlock %d, count %x", prevBn, bn, 1) + if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { + fmt.Println(err) + return + } + reqGen.reqID++ + request = reqGen.traceFilterCountAfter(prevBn, bn, 1, 1) + errCtx = fmt.Sprintf("traceFilterCountAfter fromBlock %d, toBlock %d, count %x, after %x", prevBn, bn, 1, 1) + if err := requestAndCompare(request, "trace_filter", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_tracereplaytransaction.go b/cmd/rpctest/rpctest/bench_tracereplaytransaction.go index f02488d4f50..9249474da18 100644 --- a/cmd/rpctest/rpctest/bench_tracereplaytransaction.go +++ b/cmd/rpctest/rpctest/bench_tracereplaytransaction.go @@ -59,7 +59,7 @@ func BenchTraceReplayTransaction(erigonUrl, gethUrl string, needCompare bool, bl reqGen.reqID++ request := reqGen.traceReplayTransaction(tx.Hash) errCtx := fmt.Sprintf("block %d, tx %s", bn, tx.Hash) - if err := requestAndCompare(request, "trace_replayTransaction", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "trace_replayTransaction", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_tracetransaction.go b/cmd/rpctest/rpctest/bench_tracetransaction.go index 83e9c14c2e3..403e1b99b17 100644 --- a/cmd/rpctest/rpctest/bench_tracetransaction.go +++ b/cmd/rpctest/rpctest/bench_tracetransaction.go @@ -8,6 +8,63 @@ import ( "time" ) +func BenchTraceBlockByHash(erigonUrl, gethUrl string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { + setRoutes(erigonUrl, gethUrl) + var client = &http.Client{ + Timeout: time.Second * 600, + } + + var rec *bufio.Writer + if recordFile != "" { + f, err := os.Create(recordFile) + if err != nil { + fmt.Printf("Cannot create file %s for recording: %v\n", recordFile, err) + return + } + defer f.Close() + rec = bufio.NewWriter(f) + defer rec.Flush() + } + var errs *bufio.Writer + if errorFile != "" { + ferr, err := os.Create(errorFile) + if err != nil { + fmt.Printf("Cannot create file %s for error output: %v\n", errorFile, err) + return + } + defer ferr.Close() + errs = bufio.NewWriter(ferr) + defer errs.Flush() + } + + var res CallResult + reqGen := &RequestGenerator{ + client: client, + } + + reqGen.reqID++ + + for bn := blockFrom; bn < blockTo; bn++ { + var b EthBlockByNumber + res = reqGen.Erigon("eth_getBlockByNumber", reqGen.getBlockByNumber(bn), &b) + if res.Err != nil { + fmt.Printf("retrieve block (Erigon) %d: %v", blockFrom, res.Err) + return + } + if b.Error != nil { + fmt.Printf("retrieving block (Erigon): %d %s", b.Error.Code, b.Error.Message) + return + } + reqGen.reqID++ + request := reqGen.traceBlockByHash(b.Result.Hash.Hex()) + errCtx := fmt.Sprintf("block %d, tx %s", bn, b.Result.Hash.Hex()) + if err := requestAndCompare(request, "debug_traceBlockByHash", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { + fmt.Println(err) + return + } + } +} + func BenchTraceTransaction(erigonUrl, gethUrl string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonUrl, gethUrl) var client = &http.Client{ @@ -59,7 +116,7 @@ func BenchTraceTransaction(erigonUrl, gethUrl string, needCompare bool, blockFro reqGen.reqID++ request := reqGen.traceTransaction(tx.Hash) errCtx := fmt.Sprintf("block %d, tx %s", bn, tx.Hash) - if err := requestAndCompare(request, "debug_traceTransaction", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "debug_traceTransaction", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/bench_txreceipts.go b/cmd/rpctest/rpctest/bench_txreceipts.go index 14f635dedc0..2ee7406f7d7 100644 --- a/cmd/rpctest/rpctest/bench_txreceipts.go +++ b/cmd/rpctest/rpctest/bench_txreceipts.go @@ -12,7 +12,6 @@ import ( // but also can be used for comparing RPCDaemon with Geth // parameters: // needCompare - if false - doesn't call Erigon and doesn't compare responses -// use false value - to generate vegeta files, it's faster but we can generate vegeta files for Geth and Erigon func BenchTxReceipt(erigonURL, gethURL string, needCompare bool, blockFrom uint64, blockTo uint64, recordFile string, errorFile string) { setRoutes(erigonURL, gethURL) var client = &http.Client{ @@ -76,7 +75,7 @@ func BenchTxReceipt(erigonURL, gethURL string, needCompare bool, blockFrom uint6 reqGen.reqID++ request := reqGen.getTransactionReceipt(tx.Hash) errCtx := fmt.Sprintf("block %d, tx %s", bn, tx.Hash) - if err := requestAndCompare(request, "eth_getTransactionReceipt", errCtx, reqGen, needCompare, rec, errs); err != nil { + if err := requestAndCompare(request, "eth_getTransactionReceipt", errCtx, reqGen, needCompare, rec, errs, nil); err != nil { fmt.Println(err) return } diff --git a/cmd/rpctest/rpctest/replay.go b/cmd/rpctest/rpctest/replay.go index 8ec72e77a61..b204a461163 100644 --- a/cmd/rpctest/rpctest/replay.go +++ b/cmd/rpctest/rpctest/replay.go @@ -10,7 +10,7 @@ import ( "github.com/valyala/fastjson" ) -func Replay(erigonURL string, recordFile string) { +func Replay(erigonURL string, recordFile string) error { setRoutes(erigonURL, "") var client = &http.Client{ Timeout: time.Second * 600, @@ -18,7 +18,7 @@ func Replay(erigonURL string, recordFile string) { f, err := os.Open(recordFile) if err != nil { fmt.Printf("Cannot open file %s for replay: %v\n", recordFile, err) - return + return err } defer f.Close() s := bufio.NewScanner(f) @@ -33,26 +33,24 @@ func Replay(erigonURL string, recordFile string) { request := s.Text() res = reqGen.Erigon2("", request) if res.Err != nil { - fmt.Printf("Could not get replay for %s: %v\n", request, res.Err) - return + return fmt.Errorf("could not get replay for %s: %w", request, res.Err) } if errVal := res.Result.Get("error"); errVal != nil { - fmt.Printf("Error getting replay for %s: %d %s\n", request, errVal.GetInt("code"), errVal.GetStringBytes("message")) - return + return fmt.Errorf("error getting replay for %s: %d %s", request, errVal.GetInt("code"), errVal.GetStringBytes("message")) } s.Scan() // Advance to the expected response expectedResult, err1 := fastjson.ParseBytes(s.Bytes()) if err1 != nil { - fmt.Printf("Could not parse expected result %s: %v\n", request, err1) - return + return fmt.Errorf("could not parse expected result %s: %w", request, err1) } if err := compareResults(res.Result, expectedResult); err != nil { fmt.Printf("Different results for %s:\n %v\n", request, err) fmt.Printf("\n\nTG response=================================\n%s\n", res.Response) fmt.Printf("\n\nG response=================================\n%s\n", s.Bytes()) - return + return fmt.Errorf("different results for %s:\n %w", request, err) } s.Scan() s.Scan() // Skip the extra new line between response and the next request } + return nil } diff --git a/cmd/rpctest/rpctest/request_generator.go b/cmd/rpctest/rpctest/request_generator.go index 6ee9bb45f56..5e23c3f1a7c 100644 --- a/cmd/rpctest/rpctest/request_generator.go +++ b/cmd/rpctest/rpctest/request_generator.go @@ -41,6 +41,11 @@ func (g *RequestGenerator) storageRangeAt(hash common.Hash, i int, to *common.Ad return fmt.Sprintf(template, hash, i, to, nextKey, 1024, g.reqID) } +func (g *RequestGenerator) traceBlockByHash(hash string) string { + const template = `{"jsonrpc":"2.0","method":"debug_traceBlockByHash","params":["%s"],"id":%d}` + return fmt.Sprintf(template, hash, g.reqID) +} + func (g *RequestGenerator) traceTransaction(hash string) string { const template = `{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["%s"],"id":%d}` return fmt.Sprintf(template, hash, g.reqID) @@ -137,7 +142,7 @@ func (g *RequestGenerator) traceCallMany(from []common.Address, to []*common.Add if len(data[i]) > 0 { fmt.Fprintf(&sb, `,"data":"%s"`, data[i]) } - fmt.Fprintf(&sb, `},["trace", "stateDiff"]]`) + fmt.Fprintf(&sb, `},["trace", "stateDiff", "vmTrace"]]`) } fmt.Fprintf(&sb, `],"0x%x"], "id":%d}`, bn, g.reqID) return sb.String() @@ -172,6 +177,34 @@ func (g *RequestGenerator) traceBlock(bn uint64) string { return sb.String() } +func (g *RequestGenerator) traceFilterCount(prevBn uint64, bn uint64, count uint64) string { + var sb strings.Builder + fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "trace_filter", "params": [{"fromBlock":"0x%x", "toBlock": "0x%x", "count": %d}]`, prevBn, bn, count) + fmt.Fprintf(&sb, `, "id":%d}`, g.reqID) + return sb.String() +} + +func (g *RequestGenerator) traceFilterAfter(prevBn uint64, bn uint64, after uint64) string { + var sb strings.Builder + fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "trace_filter", "params": [{"fromBlock":"0x%x", "toBlock": "0x%x", "after": %d}]`, prevBn, bn, after) + fmt.Fprintf(&sb, `, "id":%d}`, g.reqID) + return sb.String() +} + +func (g *RequestGenerator) traceFilterCountAfter(prevBn uint64, bn uint64, after, count uint64) string { + var sb strings.Builder + fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "trace_filter", "params": [{"fromBlock":"0x%x", "toBlock": "0x%x", "count": %d, "after": %d}]`, prevBn, bn, count, after) + fmt.Fprintf(&sb, `, "id":%d}`, g.reqID) + return sb.String() +} + +func (g *RequestGenerator) traceFilterUnion(prevBn uint64, bn uint64, from, to common.Address) string { + var sb strings.Builder + fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "trace_filter", "params": [{"fromBlock":"0x%x", "toBlock": "0x%x", "fromAddress": ["0x%x"], "toAddress": ["0x%x"]}]`, prevBn, bn, from, to) + fmt.Fprintf(&sb, `, "id":%d}`, g.reqID) + return sb.String() +} + func (g *RequestGenerator) traceFilterFrom(prevBn uint64, bn uint64, account common.Address) string { var sb strings.Builder fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "trace_filter", "params": [{"fromBlock":"0x%x", "toBlock": "0x%x", "fromAddress": ["0x%x"]}]`, prevBn, bn, account) @@ -191,6 +224,50 @@ func (g *RequestGenerator) traceReplayTransaction(hash string) string { return fmt.Sprintf(template, hash, g.reqID) } +func (g *RequestGenerator) ethCall(from common.Address, to *common.Address, gas *hexutil.Big, gasPrice *hexutil.Big, value *hexutil.Big, data hexutil.Bytes, bn uint64) string { + var sb strings.Builder + fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "eth_call", "params": [{"from":"0x%x"`, from) + if to != nil { + fmt.Fprintf(&sb, `,"to":"0x%x"`, *to) + } + if gas != nil { + fmt.Fprintf(&sb, `,"gas":"%s"`, gas) + } + if gasPrice != nil { + fmt.Fprintf(&sb, `,"gasPrice":"%s"`, gasPrice) + } + if len(data) > 0 { + fmt.Fprintf(&sb, `,"data":"%s"`, data) + } + if value != nil { + fmt.Fprintf(&sb, `,"value":"%s"`, value) + } + fmt.Fprintf(&sb, `},"0x%x"], "id":%d}`, bn, g.reqID) + return sb.String() +} + +func (g *RequestGenerator) ethCallLatest(from common.Address, to *common.Address, gas *hexutil.Big, gasPrice *hexutil.Big, value *hexutil.Big, data hexutil.Bytes) string { + var sb strings.Builder + fmt.Fprintf(&sb, `{ "jsonrpc": "2.0", "method": "eth_call", "params": [{"from":"0x%x"`, from) + if to != nil { + fmt.Fprintf(&sb, `,"to":"0x%x"`, *to) + } + if gas != nil { + fmt.Fprintf(&sb, `,"gas":"%s"`, gas) + } + if gasPrice != nil { + fmt.Fprintf(&sb, `,"gasPrice":"%s"`, gasPrice) + } + if len(data) > 0 { + fmt.Fprintf(&sb, `,"data":"%s"`, data) + } + if value != nil { + fmt.Fprintf(&sb, `,"value":"%s"`, value) + } + fmt.Fprintf(&sb, `},"latest"], "id":%d}`, g.reqID) + return sb.String() +} + func (g *RequestGenerator) call(target string, method, body string, response interface{}) CallResult { start := time.Now() err := post(g.client, routes[target], body, response) diff --git a/cmd/rpctest/rpctest/type.go b/cmd/rpctest/rpctest/type.go index 06f9740643f..29cd65e5989 100644 --- a/cmd/rpctest/rpctest/type.go +++ b/cmd/rpctest/rpctest/type.go @@ -2,7 +2,6 @@ package rpctest import ( "fmt" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/core/state" @@ -42,6 +41,16 @@ type EthTransaction struct { Value hexutil.Big `json:"value"` } +type EthSendRawTransaction struct { + CommonResponse + TxnHash common.Hash `json:"result"` +} + +type EthTxPool struct { + CommonResponse + Result interface{} `json:"result"` +} + type EthBlockByNumberResult struct { Difficulty hexutil.Big `json:"difficulty"` Miner common.Address `json:"miner"` @@ -219,17 +228,22 @@ type EthReceipt struct { Result Receipt `json:"result"` } -type EthLogs struct { +type EthGetProof struct { CommonResponse - Result []*Log `json:"result"` + Result AccountResult `json:"result"` } -type EthGetProof struct { +type EthGetLogs struct { CommonResponse - Result AccountResult `json:"result"` + Result []Log `json:"result"` +} + +type EthGetTransactionCount struct { + CommonResponse + Result hexutil.Uint64 `json:"result"` } -// Result structs for GetProof +// AccountResult is the result struct for GetProof type AccountResult struct { Address common.Address `json:"address"` AccountProof []string `json:"accountProof"` @@ -244,3 +258,8 @@ type StorageResult struct { Value *hexutil.Big `json:"value"` Proof []string `json:"proof"` } + +type ParityListStorageKeysResult struct { + CommonResponse + Result []hexutil.Bytes `json:"result"` +} diff --git a/cmd/rpctest/rpctest/utils.go b/cmd/rpctest/rpctest/utils.go index 18c09c3b61c..629332ee49a 100644 --- a/cmd/rpctest/rpctest/utils.go +++ b/cmd/rpctest/rpctest/utils.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "net/http" + "os" "strings" "time" @@ -184,24 +185,73 @@ func compareResults(trace, traceg *fastjson.Value) error { return compareJsonValues("result", r, rg) } -func requestAndCompare(request string, methodName string, errCtx string, reqGen *RequestGenerator, needCompare bool, rec *bufio.Writer, errs *bufio.Writer) error { +func compareErrors(errVal *fastjson.Value, errValg *fastjson.Value, methodName string, errCtx string, errs *bufio.Writer) error { + if errVal != nil && errValg == nil { + if errs != nil { + fmt.Printf("different results for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "Different results for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "Result (Erigon) returns error code=%d message=%s, while G/OE returns OK\n", errVal.GetInt("code"), errVal.GetStringBytes("message")) + errs.Flush() // nolint:errcheck + } else { + return fmt.Errorf("different result (Erigon) returns error code=%d message=%s, while G/OE returns OK", errVal.GetInt("code"), errVal.GetStringBytes("message")) + } + } else if errVal == nil && errValg != nil { + if errs != nil { + fmt.Printf("different results for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "Different results for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "Result (Erigon) returns OK, while G/OE returns error code=%d message=%s\n", errValg.GetInt("code"), errValg.GetStringBytes("message")) + errs.Flush() // nolint:errcheck + } else { + return fmt.Errorf("different result (Erigon) returns OK, while G/OE returns error code=%d message=%s", errValg.GetInt("code"), errValg.GetStringBytes("message")) + } + } else { + s1 := strings.ToUpper(string((errVal.GetStringBytes("message")))) + s2 := strings.ToUpper(string((errValg.GetStringBytes("message")))) + if strings.Compare(s1, s2) != 0 { + if errs != nil { + fmt.Printf("different error-message for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "Different results for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "error-message (Erigon) returns message=%s, while G/OE returns message=%s\n", errVal.GetStringBytes("message"), errValg.GetStringBytes("message")) + errs.Flush() // nolint:errcheck + } else { + return fmt.Errorf("different error-message (Erigon) returns message=%s, while G/OE returns message=%s", errVal.GetStringBytes("message"), errValg.GetStringBytes("message")) + } + } else if errVal.GetInt("code") != errValg.GetInt("code") { + if errs != nil { + fmt.Printf("Different error-code for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "Different results for method %s, errCtx: %s\n", methodName, errCtx) + fmt.Fprintf(errs, "error-code (Erigon) returns code=%d, while G/OE returns code=%d\n", errVal.GetInt("code"), errValg.GetInt("code")) + errs.Flush() // nolint:errcheck + } else { + return fmt.Errorf("different error-code (Erigon) returns code=%d, while G/OE returns code=%d", errVal.GetInt("code"), errValg.GetInt("code")) + } + } + } + return nil +} + +func requestAndCompare(request string, methodName string, errCtx string, reqGen *RequestGenerator, needCompare bool, rec *bufio.Writer, errs *bufio.Writer, channel chan CallResult) error { recording := rec != nil res := reqGen.Erigon2(methodName, request) if res.Err != nil { - return fmt.Errorf("could not invoke %s (Erigon): %w\n", methodName, res.Err) + return fmt.Errorf("could not invoke %s (Erigon): %w", methodName, res.Err) } - if errVal := res.Result.Get("error"); errVal != nil { - return fmt.Errorf("error invoking %s (Erigon): %d %s\n", methodName, errVal.GetInt("code"), errVal.GetStringBytes("message")) + errVal := res.Result.Get("error") + if errVal != nil { + if !needCompare && channel == nil { + return fmt.Errorf("error invoking %s (Erigon): %d %s", methodName, errVal.GetInt("code"), errVal.GetStringBytes("message")) + } + } + if channel != nil { + channel <- res } if needCompare { resg := reqGen.Geth2(methodName, request) if resg.Err != nil { - return fmt.Errorf("could not invoke %s (Geth/OE): %w\n", methodName, res.Err) - } - if errVal := resg.Result.Get("error"); errVal != nil { - return fmt.Errorf("error invoking %s (Geth/OE): %d %s\n", methodName, errVal.GetInt("code"), errVal.GetStringBytes("message")) + return fmt.Errorf("could not invoke %s (Geth/OE): %w", methodName, res.Err) } - if resg.Err == nil && resg.Result.Get("error") == nil { + errValg := resg.Result.Get("error") + if errVal == nil && errValg == nil { if err := compareResults(res.Result, resg.Result); err != nil { recording = false if errs != nil { @@ -213,11 +263,20 @@ func requestAndCompare(request string, methodName string, errCtx string, reqGen errs.Flush() // nolint:errcheck // Keep going } else { - fmt.Printf("TG response=================================\n%s\n", res.Response) - fmt.Printf("G response=================================\n%s\n", resg.Response) - return fmt.Errorf("different results for method %s, errCtx %s: %v\n", methodName, errCtx, err) + reqFile, _ := os.Create("request.json") //nolint:errcheck + reqFile.Write([]byte(request)) //nolint:errcheck + reqFile.Close() //nolint:errcheck + erigonRespFile, _ := os.Create("erigon-response.json") //nolint:errcheck + erigonRespFile.Write(res.Response) //nolint:errcheck + erigonRespFile.Close() //nolint:errcheck + oeRespFile, _ := os.Create("oe-response.json") //nolint:errcheck + oeRespFile.Write(resg.Response) //nolint:errcheck + oeRespFile.Close() //nolint:errcheck + return fmt.Errorf("different results for method %s, errCtx %s: %v\nRequest in file request.json, Erigon response in file erigon-response.json, Geth/OE response in file oe-response.json", methodName, errCtx, err) } } + } else { + return compareErrors(errVal, errValg, methodName, errCtx, errs) } } if recording { @@ -561,6 +620,7 @@ func print(client *http.Client, url, request string) { fmt.Printf("Could not print: %v\n", err) return } + defer r.Body.Close() if r.StatusCode != 200 { fmt.Printf("Status %s", r.Status) return diff --git a/cmd/sentry/README.md b/cmd/sentry/README.md index f0c9f19bff8..b3dc81ad2eb 100644 --- a/cmd/sentry/README.md +++ b/cmd/sentry/README.md @@ -16,16 +16,16 @@ combined). Ethereum mainnet configuration is currently hard-coded. ``` ``` -./buid/bin/sentry --datadir +./buid/bin/sentry --datadir ``` -The command above specifies `--datadir` option - directory where the database files will be written. These two options +The command above specifies `--datadir` option - directory where the database files will be written (it doesn't need access to Erion's datadir). These two options will need to be specified regardless of the mode the program is run. This specific command above assumes and external p2p sentry running on the same computer listening to the port `9091`. In order to use a p2p sentry on a different computer, or a different port (or both), the option `--sentry.api.addr` can be used. For example: ``` -./buid/bin/sentry --datadir --sentry.api.addr localhost:9999 +./buid/bin/sentry --datadir --sentry.api.addr localhost:9999 ``` The command above will expect the p2p sentry running on the same computer, but on the port `9999` diff --git a/cmd/sentry/commands/sentry.go b/cmd/sentry/commands/sentry.go deleted file mode 100644 index e9297caf29d..00000000000 --- a/cmd/sentry/commands/sentry.go +++ /dev/null @@ -1,97 +0,0 @@ -package commands - -import ( - "fmt" - "os" - "path" - "strings" - - "github.com/ledgerwatch/erigon/cmd/sentry/download" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common/paths" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/internal/debug" - node2 "github.com/ledgerwatch/erigon/turbo/node" - "github.com/spf13/cobra" -) - -var ( - sentryAddr string // Address of the sentry : - chaindata string // Path to chaindata - datadir string // Path to td working dir - - natSetting string // NAT setting - port int // Listening port - staticPeers []string // static peers - discoveryDNS []string - nodiscover bool // disable sentry's discovery mechanism - protocol string - netRestrict string // CIDR to restrict peering to -) - -func init() { - utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) - - rootCmd.Flags().StringVar(&natSetting, "nat", "", `NAT port mapping mechanism (any|none|upnp|pmp|extip:) - "" or "none" default - do not nat - "extip:77.12.33.4" will assume the local machine is reachable on the given IP - "any" uses the first auto-detected mechanism - "upnp" uses the Universal Plug and Play protocol - "pmp" uses NAT-PMP with an auto-detected gateway address - "pmp:192.168.0.1" uses NAT-PMP with the given gateway address -`) - rootCmd.Flags().IntVar(&port, "port", 30303, "p2p port number") - rootCmd.Flags().StringVar(&sentryAddr, "sentry.api.addr", "localhost:9091", "comma separated sentry addresses ':,:'") - rootCmd.Flags().StringVar(&protocol, "p2p.protocol", "eth66", "eth65|eth66") - rootCmd.Flags().StringSliceVar(&staticPeers, "staticpeers", []string{}, "static peer list [enode]") - rootCmd.Flags().StringSliceVar(&discoveryDNS, utils.DNSDiscoveryFlag.Name, []string{}, utils.DNSDiscoveryFlag.Usage) - rootCmd.Flags().BoolVar(&nodiscover, utils.NoDiscoverFlag.Name, false, utils.NoDiscoverFlag.Usage) - rootCmd.Flags().StringVar(&netRestrict, "netrestrict", "", "CIDR range to accept peers from ") - rootCmd.Flags().StringVar(&datadir, utils.DataDirFlag.Name, paths.DefaultDataDir(), utils.DataDirFlag.Usage) - if err := rootCmd.MarkFlagDirname(utils.DataDirFlag.Name); err != nil { - panic(err) - } - -} - -var rootCmd = &cobra.Command{ - Use: "sentry", - Short: "Run p2p sentry", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if err := debug.SetupCobra(cmd); err != nil { - panic(err) - } - if chaindata == "" { - chaindata = path.Join(datadir, "erigon", "chaindata") - } - //if snapshotDir == "" { - // snapshotDir = path.Join(datadir, "erigon", "snapshot") - //} - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - debug.Exit() - }, - RunE: func(cmd *cobra.Command, args []string) error { - p := eth.ETH66 - switch strings.ToLower(protocol) { - case "eth65": - p = eth.ETH65 - } - - nodeConfig := node2.NewNodeConfig() - p2pConfig, err := utils.NewP2PConfig(nodiscover, datadir, netRestrict, natSetting, nodeConfig.NodeName(), staticPeers, uint(port), uint(p)) - if err != nil { - return err - } - return download.Sentry(datadir, sentryAddr, discoveryDNS, p2pConfig, uint(p)) - }, -} - -func Execute() { - ctx, cancel := utils.RootContext() - defer cancel() - if err := rootCmd.ExecuteContext(ctx); err != nil { - fmt.Println(err) - os.Exit(1) - } -} diff --git a/cmd/sentry/download/downloader.go b/cmd/sentry/download/downloader.go deleted file mode 100644 index b9cdeb4013c..00000000000 --- a/cmd/sentry/download/downloader.go +++ /dev/null @@ -1,902 +0,0 @@ -package download - -import ( - "bytes" - "context" - "errors" - "fmt" - "io" - "math/rand" - "sync" - "time" - - "github.com/c2h5oh/datasize" - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - debug2 "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/consensus" - "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/erigon/turbo/remote" - "github.com/ledgerwatch/erigon/turbo/stages/bodydownload" - "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" - "github.com/ledgerwatch/log/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/backoff" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/status" -) - -// Methods of Core called by sentry - -func GrpcSentryClient(ctx context.Context, sentryAddr string) (*remote.SentryClientRemote, error) { - // creating grpc client connection - var dialOpts []grpc.DialOption - - backoffCfg := backoff.DefaultConfig - backoffCfg.BaseDelay = 500 * time.Millisecond - backoffCfg.MaxDelay = 10 * time.Second - dialOpts = []grpc.DialOption{ - grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoffCfg, MinConnectTimeout: 10 * time.Minute}), - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(int(16 * datasize.MB))), - grpc.WithKeepaliveParams(keepalive.ClientParameters{}), - } - - dialOpts = append(dialOpts, grpc.WithInsecure()) - conn, err := grpc.DialContext(ctx, sentryAddr, dialOpts...) - if err != nil { - return nil, fmt.Errorf("creating client connection to sentry P2P: %w", err) - } - return remote.NewSentryClientRemote(proto_sentry.NewSentryClient(conn)), nil -} - -func RecvUploadMessageLoop(ctx context.Context, - sentry remote.SentryClient, - cs *ControlServerImpl, - wg *sync.WaitGroup, -) { - for { - select { - case <-ctx.Done(): - return - default: - } - - if err := SentryHandshake(ctx, sentry, cs); err != nil { - log.Error("[RecvUploadMessage] sentry not ready yet", "err", err) - time.Sleep(time.Second) - continue - } - if err := RecvUploadMessage(ctx, sentry, cs.HandleInboundMessage, wg); err != nil { - if isPeerNotFoundErr(err) { - continue - } - log.Error("[RecvUploadMessage]", "err", err) - } - } -} - -func RecvUploadMessage(ctx context.Context, - sentry remote.SentryClient, - handleInboundMessage func(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error, - wg *sync.WaitGroup, -) (err error) { - defer func() { err = debug2.ReportPanicAndRecover(err) }() // avoid crash because Erigon's core does many things - streamCtx, cancel := context.WithCancel(ctx) - defer cancel() - - stream, err := sentry.Messages(streamCtx, &proto_sentry.MessagesRequest{Ids: []proto_sentry.MessageId{ - eth.ToProto[eth.ETH65][eth.GetBlockHeadersMsg], - eth.ToProto[eth.ETH65][eth.GetBlockBodiesMsg], - eth.ToProto[eth.ETH65][eth.GetReceiptsMsg], - - eth.ToProto[eth.ETH66][eth.GetBlockHeadersMsg], - eth.ToProto[eth.ETH66][eth.GetBlockBodiesMsg], - eth.ToProto[eth.ETH66][eth.GetReceiptsMsg], - }}, grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - var req *proto_sentry.InboundMessage - for req, err = stream.Recv(); ; req, err = stream.Recv() { - if err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - if req == nil { - return - } - if err = handleInboundMessage(ctx, req, sentry); err != nil { - log.Error("RecvUploadMessage: Handling incoming message", "error", err) - } - if wg != nil { - wg.Done() - } - - } -} - -func RecvMessageLoop(ctx context.Context, - sentry remote.SentryClient, - cs *ControlServerImpl, - wg *sync.WaitGroup, -) { - for { - select { - case <-ctx.Done(): - return - default: - } - - if err := SentryHandshake(ctx, sentry, cs); err != nil { - log.Error("[RecvMessage] sentry not ready yet", "err", err) - time.Sleep(time.Second) - continue - } - if err := RecvMessage(ctx, sentry, cs.HandleInboundMessage, wg); err != nil { - if isPeerNotFoundErr(err) { - continue - } - log.Error("[RecvMessage]", "err", err) - } - } -} - -// RecvMessage is normally run in a separate go-routine because it only exists when there a no more messages -// to be received (end of process, or interruption, or end of test) -// wg is used only in tests to avoid using waits, which is brittle. For non-test code wg == nil -func RecvMessage( - ctx context.Context, - sentry remote.SentryClient, - handleInboundMessage func(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error, - wg *sync.WaitGroup, -) (err error) { - defer func() { err = debug2.ReportPanicAndRecover(err) }() // avoid crash because Erigon's core does many things - streamCtx, cancel := context.WithCancel(ctx) - defer cancel() - defer sentry.MarkDisconnected() - - stream, err := sentry.Messages(streamCtx, &proto_sentry.MessagesRequest{Ids: []proto_sentry.MessageId{ - eth.ToProto[eth.ETH65][eth.BlockHeadersMsg], - eth.ToProto[eth.ETH65][eth.BlockBodiesMsg], - eth.ToProto[eth.ETH65][eth.NewBlockHashesMsg], - eth.ToProto[eth.ETH65][eth.NewBlockMsg], - - eth.ToProto[eth.ETH66][eth.BlockHeadersMsg], - eth.ToProto[eth.ETH66][eth.BlockBodiesMsg], - eth.ToProto[eth.ETH66][eth.NewBlockHashesMsg], - eth.ToProto[eth.ETH66][eth.NewBlockMsg], - }}, grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - - var req *proto_sentry.InboundMessage - for req, err = stream.Recv(); ; req, err = stream.Recv() { - if err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - if req == nil { - return - } - - if err = handleInboundMessage(ctx, req, sentry); err != nil { - return err - } - - if wg != nil { - wg.Done() - } - } -} - -func SentryHandshake(ctx context.Context, sentry remote.SentryClient, controlServer *ControlServerImpl) error { - _, err := sentry.SetStatus(ctx, makeStatusData(controlServer), grpc.WaitForReady(true)) - if err != nil { - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return nil - } - return err - } - return nil -} - -type ControlServerImpl struct { - lock sync.RWMutex - Hd *headerdownload.HeaderDownload - Bd *bodydownload.BodyDownload - nodeName string - sentries []remote.SentryClient - headHeight uint64 - headHash common.Hash - headTd *uint256.Int - ChainConfig *params.ChainConfig - forks []uint64 - genesisHash common.Hash - networkId uint64 - db kv.RwDB - Engine consensus.Engine -} - -func NewControlServer(db kv.RwDB, nodeName string, chainConfig *params.ChainConfig, genesisHash common.Hash, engine consensus.Engine, networkID uint64, sentries []remote.SentryClient, window int) (*ControlServerImpl, error) { - hd := headerdownload.NewHeaderDownload( - 512, /* anchorLimit */ - 1024*1024, /* linkLimit */ - engine, - ) - if err := hd.RecoverFromDb(db); err != nil { - return nil, fmt.Errorf("recovery from DB failed: %w", err) - } - preverifiedHashes, preverifiedHeight := headerdownload.InitPreverifiedHashes(chainConfig.ChainName) - - hd.SetPreverifiedHashes(preverifiedHashes, preverifiedHeight) - bd := bodydownload.NewBodyDownload(window /* outstandingLimit */, engine) - - cs := &ControlServerImpl{ - nodeName: nodeName, - Hd: hd, - Bd: bd, - sentries: sentries, - db: db, - Engine: engine, - } - cs.ChainConfig = chainConfig - cs.forks = forkid.GatherForks(cs.ChainConfig) - cs.genesisHash = genesisHash - cs.networkId = networkID - var err error - err = db.Update(context.Background(), func(tx kv.RwTx) error { - cs.headHeight, cs.headHash, cs.headTd, err = bd.UpdateFromDb(tx) - return err - }) - return cs, err -} - -func (cs *ControlServerImpl) newBlockHashes66(ctx context.Context, req *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - if !cs.Hd.RequestChaining() && !cs.Hd.Fetching() { - return nil - } - //log.Info(fmt.Sprintf("NewBlockHashes from [%s]", gointerfaces.ConvertH512ToBytes(req.PeerId))) - var request eth.NewBlockHashesPacket - if err := rlp.DecodeBytes(req.Data, &request); err != nil { - return fmt.Errorf("decode NewBlockHashes66: %v", err) - } - for _, announce := range request { - cs.Hd.SaveExternalAnnounce(announce.Hash) - if cs.Hd.HasLink(announce.Hash) { - continue - } - //log.Info(fmt.Sprintf("Sending header request {hash: %x, height: %d, length: %d}", announce.Hash, announce.Number, 1)) - b, err := rlp.EncodeToBytes(ð.GetBlockHeadersPacket66{ - RequestId: rand.Uint64(), - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Amount: 1, - Reverse: false, - Skip: 0, - Origin: eth.HashOrNumber{Hash: announce.Hash}, - }, - }) - if err != nil { - return fmt.Errorf("encode header request: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: req.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_66, - Data: b, - }, - } - - if _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { - continue - } - return fmt.Errorf("send header request: %v", err) - } - } - return nil -} - -func (cs *ControlServerImpl) newBlockHashes65(ctx context.Context, req *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - if !cs.Hd.RequestChaining() && !cs.Hd.Fetching() { - return nil - } - //log.Info(fmt.Sprintf("NewBlockHashes from [%s]", gointerfaces.ConvertH512ToBytes(req.PeerId))) - var request eth.NewBlockHashesPacket - if err := rlp.DecodeBytes(req.Data, &request); err != nil { - return fmt.Errorf("decode newBlockHashes65: %v", err) - } - for _, announce := range request { - cs.Hd.SaveExternalAnnounce(announce.Hash) - if cs.Hd.HasLink(announce.Hash) { - continue - } - //log.Info(fmt.Sprintf("Sending header request {hash: %x, height: %d, length: %d}", announce.Hash, announce.Number, 1)) - b, err := rlp.EncodeToBytes(ð.GetBlockHeadersPacket{ - Amount: 1, - Reverse: false, - Skip: 0, - Origin: eth.HashOrNumber{Hash: announce.Hash}, - }) - if err != nil { - return fmt.Errorf("encode header request: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: req.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_65, - Data: b, - }, - } - - if _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { - continue - } - return fmt.Errorf("send header request: %v", err) - } - } - return nil -} - -func (cs *ControlServerImpl) blockHeaders66(ctx context.Context, in *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - // Extract header from the block - rlpStream := rlp.NewStream(bytes.NewReader(in.Data), uint64(len(in.Data))) - if _, err := rlpStream.List(); err != nil { // Now stream is at the beginning of 66 object - return fmt.Errorf("decode 1 BlockHeadersPacket66: %w", err) - } - if _, err := rlpStream.Uint(); err != nil { // Now stream is at the requestID field - return fmt.Errorf("decode 2 BlockHeadersPacket66: %w", err) - } - if _, err := rlpStream.List(); err != nil { // Now stream is at the BlockHeadersPacket, which is list of headers - return fmt.Errorf("decode 3 BlockHeadersPacket66: %w", err) - } - var headersRaw [][]byte - for headerRaw, err := rlpStream.Raw(); ; headerRaw, err = rlpStream.Raw() { - if err != nil { - if !errors.Is(err, rlp.EOL) { - return fmt.Errorf("decode 4 BlockHeadersPacket66: %w", err) - } - break - } - - headersRaw = append(headersRaw, headerRaw) - } - - // Parse the entire request from scratch - var request eth.BlockHeadersPacket66 - if err := rlp.DecodeBytes(in.Data, &request); err != nil { - return fmt.Errorf("decode 5 BlockHeadersPacket66: %v", err) - } - headers := request.BlockHeadersPacket - var heighestBlock uint64 - for _, h := range headers { - if h.Number.Uint64() > heighestBlock { - heighestBlock = h.Number.Uint64() - } - } - - if segments, penalty, err := cs.Hd.SplitIntoSegments(headersRaw, headers); err == nil { - if penalty == headerdownload.NoPenalty { - var canRequestMore bool - for _, segment := range segments { - requestMore, penalties := cs.Hd.ProcessSegment(segment, false /* newBlock */, string(gointerfaces.ConvertH512ToBytes(in.PeerId))) - canRequestMore = canRequestMore || requestMore - if len(penalties) > 0 { - cs.Penalize(ctx, penalties) - } - } - - if canRequestMore { - currentTime := uint64(time.Now().Unix()) - req, penalties := cs.Hd.RequestMoreHeaders(currentTime) - if req != nil { - if peer := cs.SendHeaderRequest(ctx, req); peer != nil { - cs.Hd.SentRequest(req, currentTime, 5 /* timeout */) - log.Debug("Sent request", "height", req.Number) - } - } - cs.Penalize(ctx, penalties) - } - } else { - outreq := proto_sentry.PenalizePeerRequest{ - PeerId: in.PeerId, - Penalty: proto_sentry.PenaltyKind_Kick, // TODO: Extend penalty kinds - } - if _, err1 := sentry.PenalizePeer(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { - log.Error("Could not send penalty", "err", err1) - } - } - } else { - return fmt.Errorf("singleHeaderAsSegment failed: %v", err) - } - outreq := proto_sentry.PeerMinBlockRequest{ - PeerId: in.PeerId, - MinBlock: heighestBlock, - } - if _, err1 := sentry.PeerMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { - log.Error("Could not send min block for peer", "err", err1) - } - return nil -} - -func (cs *ControlServerImpl) blockHeaders65(ctx context.Context, in *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - // Extract header from the block - rlpStream := rlp.NewStream(bytes.NewReader(in.Data), uint64(len(in.Data))) - if _, err := rlpStream.List(); err != nil { // Now stream is at the BlockHeadersPacket, which is list of headers - return fmt.Errorf("decode 3 BlockHeadersPacket66: %w", err) - } - var headersRaw [][]byte - for headerRaw, err := rlpStream.Raw(); ; headerRaw, err = rlpStream.Raw() { - if err != nil { - if !errors.Is(err, rlp.EOL) { - return fmt.Errorf("decode 4 BlockHeadersPacket66: %w", err) - } - break - } - - headersRaw = append(headersRaw, headerRaw) - } - - // Parse the entire request from scratch - var request eth.BlockHeadersPacket - if err := rlp.DecodeBytes(in.Data, &request); err != nil { - return fmt.Errorf("decode 5 BlockHeadersPacket66: %v", err) - } - headers := request - var heighestBlock uint64 - for _, h := range headers { - if h.Number.Uint64() > heighestBlock { - heighestBlock = h.Number.Uint64() - } - } - - if segments, penalty, err := cs.Hd.SplitIntoSegments(headersRaw, headers); err == nil { - if penalty == headerdownload.NoPenalty { - var canRequestMore bool - for _, segment := range segments { - requestMore, penalties := cs.Hd.ProcessSegment(segment, false /* newBlock */, string(gointerfaces.ConvertH512ToBytes(in.PeerId))) - canRequestMore = canRequestMore || requestMore - if len(penalties) > 0 { - cs.Penalize(ctx, penalties) - } - } - - if canRequestMore { - currentTime := uint64(time.Now().Unix()) - req, penalties := cs.Hd.RequestMoreHeaders(currentTime) - if req != nil { - if peer := cs.SendHeaderRequest(ctx, req); peer != nil { - cs.Hd.SentRequest(req, currentTime, 5 /* timeout */) - log.Debug("Sent request", "height", req.Number) - } - } - cs.Penalize(ctx, penalties) - } - } else { - outreq := proto_sentry.PenalizePeerRequest{ - PeerId: in.PeerId, - Penalty: proto_sentry.PenaltyKind_Kick, // TODO: Extend penalty kinds - } - if _, err1 := sentry.PenalizePeer(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { - log.Error("Could not send penalty", "err", err1) - } - } - } else { - return fmt.Errorf("singleHeaderAsSegment failed: %v", err) - } - outreq := proto_sentry.PeerMinBlockRequest{ - PeerId: in.PeerId, - MinBlock: heighestBlock, - } - if _, err1 := sentry.PeerMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { - log.Error("Could not send min block for peer", "err", err1) - } - return nil -} - -func (cs *ControlServerImpl) newBlock66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - return cs.newBlock65(ctx, inreq, sentry) -} - -func (cs *ControlServerImpl) newBlock65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - // Extract header from the block - rlpStream := rlp.NewStream(bytes.NewReader(inreq.Data), uint64(len(inreq.Data))) - _, err := rlpStream.List() // Now stream is at the beginning of the block record - if err != nil { - return fmt.Errorf("decode 1 NewBlockMsg: %w", err) - } - _, err = rlpStream.List() // Now stream is at the beginning of the header - if err != nil { - return fmt.Errorf("decode 2 NewBlockMsg: %w", err) - } - var headerRaw []byte - if headerRaw, err = rlpStream.Raw(); err != nil { - return fmt.Errorf("decode 3 NewBlockMsg: %w", err) - } - // Parse the entire request from scratch - var request eth.NewBlockPacket - if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { - return fmt.Errorf("decode 4 NewBlockMsg: %v", err) - } - if segments, penalty, err := cs.Hd.SingleHeaderAsSegment(headerRaw, request.Block.Header()); err == nil { - if penalty == headerdownload.NoPenalty { - cs.Hd.ProcessSegment(segments[0], true /* newBlock */, string(gointerfaces.ConvertH512ToBytes(inreq.PeerId))) // There is only one segment in this case - } else { - outreq := proto_sentry.PenalizePeerRequest{ - PeerId: inreq.PeerId, - Penalty: proto_sentry.PenaltyKind_Kick, // TODO: Extend penalty kinds - } - for _, sentry := range cs.sentries { - if !sentry.Ready() { - continue - } - if _, err1 := sentry.PenalizePeer(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { - log.Error("Could not send penalty", "err", err1) - } - } - } - } else { - return fmt.Errorf("singleHeaderAsSegment failed: %v", err) - } - cs.Bd.AddToPrefetch(request.Block) - outreq := proto_sentry.PeerMinBlockRequest{ - PeerId: inreq.PeerId, - MinBlock: request.Block.NumberU64(), - } - if _, err1 := sentry.PeerMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { - log.Error("Could not send min block for peer", "err", err1) - } - log.Debug(fmt.Sprintf("NewBlockMsg{blockNumber: %d} from [%s]", request.Block.NumberU64(), gointerfaces.ConvertH512ToBytes(inreq.PeerId))) - return nil -} - -func (cs *ControlServerImpl) blockBodies66(inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var request eth.BlockRawBodiesPacket66 - if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { - return fmt.Errorf("decode BlockBodiesPacket66: %v", err) - } - txs, uncles := request.BlockRawBodiesPacket.Unpack() - cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), string(gointerfaces.ConvertH512ToBytes(inreq.PeerId))) - return nil -} - -func (cs *ControlServerImpl) blockBodies65(inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var request eth.BlockRawBodiesPacket - if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { - return fmt.Errorf("decode blockBodies65: %v", err) - } - txs, uncles := request.Unpack() - cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), string(gointerfaces.ConvertH512ToBytes(inreq.PeerId))) - return nil -} - -func (cs *ControlServerImpl) receipts66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - return nil -} -func (cs *ControlServerImpl) receipts65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - return nil -} - -func (cs *ControlServerImpl) getBlockHeaders66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.GetBlockHeadersPacket66 - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockHeaders66: %v, data: %x", err, inreq.Data) - } - - tx, err := cs.db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - headers, err := eth.AnswerGetBlockHeadersQuery(tx, query.GetBlockHeadersPacket) - tx.Rollback() - if err != nil { - return fmt.Errorf("querying BlockHeaders: %w", err) - } - b, err := rlp.EncodeToBytes(ð.BlockHeadersPacket66{ - RequestId: query.RequestId, - BlockHeadersPacket: headers, - }) - if err != nil { - return fmt.Errorf("encode header response: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_BLOCK_HEADERS_66, - Data: b, - }, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - if !isPeerNotFoundErr(err) { - return fmt.Errorf("send header response 65: %v", err) - } - return fmt.Errorf("send header response 66: %v", err) - } - //log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b))) - return nil -} - -func (cs *ControlServerImpl) getBlockHeaders65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.GetBlockHeadersPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockHeaders65: %v, data: %x", err, inreq.Data) - } - - tx, err := cs.db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - headers, err := eth.AnswerGetBlockHeadersQuery(tx, &query) - tx.Rollback() - if err != nil { - return fmt.Errorf("querying BlockHeaders: %w", err) - } - b, err := rlp.EncodeToBytes(eth.BlockHeadersPacket(headers)) - if err != nil { - return fmt.Errorf("encode header response: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_BLOCK_HEADERS_65, - Data: b, - }, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - if !isPeerNotFoundErr(err) { - return fmt.Errorf("send header response 65: %v", err) - } - } - //log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b))) - return nil -} - -func (cs *ControlServerImpl) getBlockBodies66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.GetBlockBodiesPacket66 - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockBodies66: %v, data: %x", err, inreq.Data) - } - tx, err := cs.db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - response := eth.AnswerGetBlockBodiesQuery(tx, query.GetBlockBodiesPacket) - tx.Rollback() - b, err := rlp.EncodeToBytes(ð.BlockBodiesRLPPacket66{ - RequestId: query.RequestId, - BlockBodiesRLPPacket: response, - }) - if err != nil { - return fmt.Errorf("encode header response: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_BLOCK_BODIES_66, - Data: b, - }, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - if isPeerNotFoundErr(err) { - return nil - } - return fmt.Errorf("send bodies response: %v", err) - } - //log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) - return nil -} - -func (cs *ControlServerImpl) getBlockBodies65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.GetBlockBodiesPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getBlockBodies65: %v, data: %x", err, inreq.Data) - } - tx, err := cs.db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - response := eth.AnswerGetBlockBodiesQuery(tx, query) - tx.Rollback() - b, err := rlp.EncodeToBytes(eth.BlockBodiesRLPPacket(response)) - if err != nil { - return fmt.Errorf("encode header response: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_BLOCK_BODIES_65, - Data: b, - }, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - if isPeerNotFoundErr(err) { - return nil - } - return fmt.Errorf("send bodies response: %v", err) - } - //log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) - return nil -} - -func (cs *ControlServerImpl) getReceipts66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.GetReceiptsPacket66 - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getReceipts66: %v, data: %x", err, inreq.Data) - } - tx, err := cs.db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - receipts, err := eth.AnswerGetReceiptsQuery(tx, query.GetReceiptsPacket) - if err != nil { - return err - } - tx.Rollback() - b, err := rlp.EncodeToBytes(ð.ReceiptsRLPPacket66{ - RequestId: query.RequestId, - ReceiptsRLPPacket: receipts, - }) - if err != nil { - return fmt.Errorf("encode header response: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_RECEIPTS_66, - Data: b, - }, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - if isPeerNotFoundErr(err) { - return nil - } - return fmt.Errorf("send bodies response: %v", err) - } - //log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) - return nil -} - -func (cs *ControlServerImpl) getReceipts65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.GetReceiptsPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getReceipts65: %v, data: %x", err, inreq.Data) - } - tx, err := cs.db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - receipts, err := eth.AnswerGetReceiptsQuery(tx, query) - if err != nil { - return err - } - tx.Rollback() - b, err := rlp.EncodeToBytes(eth.ReceiptsRLPPacket(receipts)) - if err != nil { - return fmt.Errorf("encode header response: %v", err) - } - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_RECEIPTS_66, - Data: b, - }, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - if isPeerNotFoundErr(err) { - return nil - } - return fmt.Errorf("send bodies response: %v", err) - } - //log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), len(b))) - return nil -} - -func (cs *ControlServerImpl) HandleInboundMessage(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - switch inreq.Id { - // ========= eth 65 ========== - case proto_sentry.MessageId_GET_BLOCK_HEADERS_65: - return cs.getBlockHeaders65(ctx, inreq, sentry) - case proto_sentry.MessageId_BLOCK_HEADERS_65: - return cs.blockHeaders65(ctx, inreq, sentry) - case proto_sentry.MessageId_NEW_BLOCK_65: - return cs.newBlock65(ctx, inreq, sentry) - case proto_sentry.MessageId_GET_BLOCK_BODIES_65: - return cs.getBlockBodies65(ctx, inreq, sentry) - case proto_sentry.MessageId_BLOCK_BODIES_65: - return cs.blockBodies65(inreq, sentry) - case proto_sentry.MessageId_GET_RECEIPTS_65: - return cs.getReceipts65(ctx, inreq, sentry) - case proto_sentry.MessageId_RECEIPTS_65: - return cs.receipts65(ctx, inreq, sentry) - case proto_sentry.MessageId_NEW_BLOCK_HASHES_65: - return cs.newBlockHashes65(ctx, inreq, sentry) - - // transactions-related methods are in tx-pool server - - // ========= eth 66 ========== - - case proto_sentry.MessageId_NEW_BLOCK_HASHES_66: - return cs.newBlockHashes66(ctx, inreq, sentry) - case proto_sentry.MessageId_BLOCK_HEADERS_66: - return cs.blockHeaders66(ctx, inreq, sentry) - case proto_sentry.MessageId_NEW_BLOCK_66: - return cs.newBlock66(ctx, inreq, sentry) - case proto_sentry.MessageId_BLOCK_BODIES_66: - return cs.blockBodies66(inreq, sentry) - case proto_sentry.MessageId_GET_BLOCK_HEADERS_66: - return cs.getBlockHeaders66(ctx, inreq, sentry) - case proto_sentry.MessageId_GET_BLOCK_BODIES_66: - return cs.getBlockBodies66(ctx, inreq, sentry) - case proto_sentry.MessageId_RECEIPTS_66: - return cs.receipts66(ctx, inreq, sentry) - case proto_sentry.MessageId_GET_RECEIPTS_66: - return cs.getReceipts66(ctx, inreq, sentry) - default: - return fmt.Errorf("not implemented for message Id: %s", inreq.Id) - } -} - -func makeStatusData(s *ControlServerImpl) *proto_sentry.StatusData { - return &proto_sentry.StatusData{ - NetworkId: s.networkId, - TotalDifficulty: gointerfaces.ConvertUint256IntToH256(s.headTd), - BestHash: gointerfaces.ConvertHashToH256(s.headHash), - MaxBlock: s.headHeight, - ForkData: &proto_sentry.Forks{ - Genesis: gointerfaces.ConvertHashToH256(s.genesisHash), - Forks: s.forks, - }, - } -} diff --git a/cmd/sentry/download/sentry.go b/cmd/sentry/download/sentry.go deleted file mode 100644 index 9d545ff0080..00000000000 --- a/cmd/sentry/download/sentry.go +++ /dev/null @@ -1,1103 +0,0 @@ -package download - -import ( - "bytes" - "context" - "fmt" - "io" - "math" - "math/rand" - "net" - "os" - "os/signal" - "path" - "sort" - "sync" - "syscall" - "time" - - "github.com/golang/protobuf/ptypes/empty" - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" - grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" - grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" - proto_types "github.com/ledgerwatch/erigon-lib/gointerfaces/types" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/metrics" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/dnsdisc" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/keepalive" -) - -const ( - // handshakeTimeout is the maximum allowed time for the `eth` handshake to - // complete before dropping the connection.= as malicious. - handshakeTimeout = 5 * time.Second - maxPermitsPerPeer = 4 // How many outstanding requests per peer we may have -) - -// PeerInfo collects various extra bits of information about the peer, -// for example deadlines that is used for regulating requests sent to the peer -type PeerInfo struct { - peer *p2p.Peer - lock sync.RWMutex - deadlines []time.Time // Request deadlines - height uint64 - rw p2p.MsgReadWriter - removed bool -} - -// AddDeadline adds given deadline to the list of deadlines -// Deadlines must be added in the chronological order for the function -// ClearDeadlines to work correctly (it uses binary search) -func (pi *PeerInfo) AddDeadline(deadline time.Time) { - pi.lock.Lock() - defer pi.lock.Unlock() - pi.deadlines = append(pi.deadlines, deadline) -} - -// ClearDeadlines goes through the deadlines of -// given peers and removes the ones that have passed -// Optionally, it also clears one extra deadline - this is used when response is received -// It returns the number of deadlines left -func (pi *PeerInfo) ClearDeadlines(now time.Time, givePermit bool) int { - pi.lock.Lock() - defer pi.lock.Unlock() - // Look for the first deadline which is not passed yet - firstNotPassed := sort.Search(len(pi.deadlines), func(i int) bool { - return pi.deadlines[i].After(now) - }) - cutOff := firstNotPassed - if cutOff < len(pi.deadlines) && givePermit { - cutOff++ - } - pi.deadlines = pi.deadlines[cutOff:] - return len(pi.deadlines) -} - -func (pi *PeerInfo) Remove() { - pi.lock.Lock() - defer pi.lock.Unlock() - pi.removed = true -} - -func (pi *PeerInfo) Removed() bool { - pi.lock.RLock() - defer pi.lock.RUnlock() - return pi.removed -} - -func makeP2PServer( - p2pConfig p2p.Config, - genesisHash common.Hash, - protocol p2p.Protocol, -) (*p2p.Server, error) { - var urls []string - switch genesisHash { - case params.MainnetGenesisHash: - urls = params.MainnetBootnodes - case params.RopstenGenesisHash: - urls = params.RopstenBootnodes - case params.GoerliGenesisHash: - urls = params.GoerliBootnodes - case params.RinkebyGenesisHash: - urls = params.RinkebyBootnodes - case params.CalaverasGenesisHash: - urls = params.CalaverasBootnodes - case params.SokolGenesisHash: - urls = params.SokolBootnodes - } - p2pConfig.BootstrapNodes = make([]*enode.Node, 0, len(urls)) - for _, url := range urls { - if url != "" { - node, err := enode.Parse(enode.ValidSchemes, url) - if err != nil { - log.Crit("Bootstrap URL invalid", "enode", url, "err", err) - continue - } - p2pConfig.BootstrapNodes = append(p2pConfig.BootstrapNodes, node) - } - } - p2pConfig.BootstrapNodesV5 = p2pConfig.BootstrapNodes - p2pConfig.Protocols = []p2p.Protocol{protocol} - return &p2p.Server{Config: p2pConfig}, nil -} - -func handShake( - ctx context.Context, - status *proto_sentry.StatusData, - peerID string, - rw p2p.MsgReadWriter, - version uint, - minVersion uint, - startSync func(bestHash common.Hash) error, -) error { - if status == nil { - return fmt.Errorf("could not get status message from core for peer %s connection", peerID) - } - - // Send out own handshake in a new thread - errc := make(chan error, 2) - - ourTD := gointerfaces.ConvertH256ToUint256Int(status.TotalDifficulty) - // Convert proto status data into the one required by devp2p - genesisHash := gointerfaces.ConvertH256ToHash(status.ForkData.Genesis) - go func() { - defer debug.LogPanic() - s := ð.StatusPacket{ - ProtocolVersion: uint32(version), - NetworkID: status.NetworkId, - TD: ourTD.ToBig(), - Head: gointerfaces.ConvertH256ToHash(status.BestHash), - Genesis: genesisHash, - ForkID: forkid.NewIDFromForks(status.ForkData.Forks, genesisHash, status.MaxBlock), - } - errc <- p2p.Send(rw, eth.StatusMsg, s) - }() - var readStatus = func() error { - forkFilter := forkid.NewFilterFromForks(status.ForkData.Forks, genesisHash, status.MaxBlock) - networkID := status.NetworkId - // Read handshake message - msg, err1 := rw.ReadMsg() - if err1 != nil { - return err1 - } - - if msg.Code != eth.StatusMsg { - msg.Discard() - return fmt.Errorf("first msg has code %x (!= %x)", msg.Code, eth.StatusMsg) - } - if msg.Size > eth.ProtocolMaxMsgSize { - msg.Discard() - return fmt.Errorf("message is too large %d, limit %d", msg.Size, eth.ProtocolMaxMsgSize) - } - // Decode the handshake and make sure everything matches - var reply eth.StatusPacket - if err1 = msg.Decode(&reply); err1 != nil { - msg.Discard() - return fmt.Errorf("decode message %v: %v", msg, err1) - } - msg.Discard() - if reply.NetworkID != networkID { - return fmt.Errorf("network id does not match: theirs %d, ours %d", reply.NetworkID, networkID) - } - if uint(reply.ProtocolVersion) < minVersion { - return fmt.Errorf("version is less than allowed minimum: theirs %d, min %d", reply.ProtocolVersion, minVersion) - } - if reply.Genesis != genesisHash { - return fmt.Errorf("genesis hash does not match: theirs %x, ours %x", reply.Genesis, genesisHash) - } - if err1 = forkFilter(reply.ForkID); err1 != nil { - return fmt.Errorf("%v", err1) - } - - td, overflow := uint256.FromBig(reply.TD) - if overflow { - return fmt.Errorf("reply.TD higher than 2^256-1") - } - - startSyncWithThisPeer := td.Cmp(ourTD) > 0 && startSync != nil - if startSyncWithThisPeer { - if err := startSync(reply.Head); err != nil { - return err - } - } - - return nil - } - go func() { - errc <- readStatus() - }() - - timeout := time.NewTimer(handshakeTimeout) - defer timeout.Stop() - for i := 0; i < 2; i++ { - select { - case err := <-errc: - if err != nil { - return err - } - case <-timeout.C: - return p2p.DiscReadTimeout - case <-ctx.Done(): - return ctx.Err() - } - } - - return nil -} - -func runPeer( - ctx context.Context, - peerID string, - protocol uint, - rw p2p.MsgReadWriter, - peerInfo *PeerInfo, - send func(msgId proto_sentry.MessageId, peerID string, b []byte), - hasSubscribers func(msgId proto_sentry.MessageId) bool, -) error { - printTime := time.Now().Add(time.Minute) - peerPrinted := false - defer func() { - select { // don't print logs if we stopping - case <-ctx.Done(): - return - default: - } - if peerPrinted { - log.Info(fmt.Sprintf("Peer %s [%s] disconnected", peerID, peerInfo.peer.Fullname()), "proto", protocol) - } - }() - for { - if !peerPrinted { - if time.Now().After(printTime) { - log.Info(fmt.Sprintf("Peer %s [%s] stable", peerID, peerInfo.peer.Fullname()), "proto", protocol) - peerPrinted = true - } - } - if err := common.Stopped(ctx.Done()); err != nil { - return err - } - if peerInfo.Removed() { - return fmt.Errorf("peer removed") - } - msg, err := rw.ReadMsg() - if err != nil { - return fmt.Errorf("reading message: %v", err) - } - if msg.Size > eth.ProtocolMaxMsgSize { - msg.Discard() - return fmt.Errorf("message is too large %d, limit %d", msg.Size, eth.ProtocolMaxMsgSize) - } - givePermit := false - switch msg.Code { - case eth.StatusMsg: - msg.Discard() - // Status messages should never arrive after the handshake - return fmt.Errorf("uncontrolled status message") - case eth.GetBlockHeadersMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.BlockHeadersMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - givePermit = true - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.GetBlockBodiesMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.BlockBodiesMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - givePermit = true - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.GetNodeDataMsg: - //log.Info(fmt.Sprintf("[%s] GetNodeData", peerID)) - case eth.GetReceiptsMsg: - //log.Info(fmt.Sprintf("[%s] GetReceiptsMsg", peerID)) - case eth.ReceiptsMsg: - //log.Info(fmt.Sprintf("[%s] ReceiptsMsg", peerID)) - case eth.NewBlockHashesMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.NewBlockMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.NewPooledTransactionHashesMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.GetPooledTransactionsMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.TransactionsMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - case eth.PooledTransactionsMsg: - if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { - continue - } - - b := make([]byte, msg.Size) - if _, err := io.ReadFull(msg.Payload, b); err != nil { - log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) - } - send(eth.ToProto[protocol][msg.Code], peerID, b) - default: - log.Error(fmt.Sprintf("[%s] Unknown message code: %d", peerID, msg.Code)) - } - msg.Discard() - peerInfo.ClearDeadlines(time.Now(), givePermit) - } -} - -func rootContext() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - defer debug.LogPanic() - ch := make(chan os.Signal, 1) - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case <-ch: - log.Info("Got interrupt, shutting down...") - case <-ctx.Done(): - } - - cancel() - }() - return ctx -} - -func grpcSentryServer(ctx context.Context, sentryAddr string, ss *SentryServerImpl) error { - // STARTING GRPC SERVER - log.Info("Starting Sentry P2P server", "on", sentryAddr) - listenConfig := net.ListenConfig{ - Control: func(network, address string, _ syscall.RawConn) error { - log.Info("Sentry P2P received connection", "via", network, "from", address) - return nil - }, - } - lis, err := listenConfig.Listen(ctx, "tcp", sentryAddr) - if err != nil { - return fmt.Errorf("could not create Sentry P2P listener: %w, addr=%s", err, sentryAddr) - } - var ( - streamInterceptors []grpc.StreamServerInterceptor - unaryInterceptors []grpc.UnaryServerInterceptor - ) - streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) - unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) - if metrics.Enabled { - streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) - unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) - } - - var grpcServer *grpc.Server - //cpus := uint32(runtime.GOMAXPROCS(-1)) - opts := []grpc.ServerOption{ - //grpc.NumStreamWorkers(cpus), // reduce amount of goroutines - grpc.WriteBufferSize(1024), // reduce buffers to save mem - grpc.ReadBufferSize(1024), - grpc.MaxConcurrentStreams(100), // to force clients reduce concurrency level - // Don't drop the connection, settings accordign to this comment on GitHub - // https://github.com/grpc/grpc-go/issues/3171#issuecomment-552796779 - grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ - MinTime: 10 * time.Second, - PermitWithoutStream: true, - }), - grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(streamInterceptors...)), - grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(unaryInterceptors...)), - } - grpcServer = grpc.NewServer(opts...) - - proto_sentry.RegisterSentryServer(grpcServer, ss) - if metrics.Enabled { - grpc_prometheus.Register(grpcServer) - } - go func() { - if err1 := grpcServer.Serve(lis); err1 != nil { - log.Error("Sentry P2P server fail", "err", err1) - } - }() - return nil -} - -func NewSentryServer(ctx context.Context, dialCandidates enode.Iterator, readNodeInfo func() *eth.NodeInfo, cfg *p2p.Config, protocol uint) *SentryServerImpl { - ss := &SentryServerImpl{ - ctx: ctx, - p2p: cfg, - peersStreams: NewPeersStreams(), - } - - if protocol != eth.ETH65 && protocol != eth.ETH66 { - panic(fmt.Errorf("unexpected p2p protocol: %d", protocol)) - } - - ss.Protocol = p2p.Protocol{ - Name: eth.ProtocolName, - Version: protocol, - Length: 17, - DialCandidates: dialCandidates, - Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { - peerID := peer.ID().String() - if _, ok := ss.GoodPeers.Load(peerID); ok { - log.Debug(fmt.Sprintf("[%s] Peer already has connection", peerID)) - return nil - } - log.Debug(fmt.Sprintf("[%s] Start with peer", peerID)) - - peerInfo := &PeerInfo{ - peer: peer, - rw: rw, - } - - defer ss.GoodPeers.Delete(peerID) - err := handShake(ctx, ss.GetStatus(), peerID, rw, protocol, protocol, func(bestHash common.Hash) error { - ss.GoodPeers.Store(peerID, peerInfo) - ss.sendNewPeerToClients(gointerfaces.ConvertBytesToH512([]byte(peerID))) - return ss.startSync(ctx, bestHash, peerID) - }) - if err != nil { - return fmt.Errorf("handshake to peer %s: %v", peerID, err) - } - log.Debug(fmt.Sprintf("[%s] Received status message OK", peerID), "name", peer.Name()) - - if err := runPeer( - ctx, - peerID, - protocol, - rw, - peerInfo, - ss.send, - ss.hasSubscribers, - ); err != nil { - log.Debug(fmt.Sprintf("[%s] Error while running peer: %v", peerID, err)) - } - return nil - }, - NodeInfo: func() interface{} { - return readNodeInfo() - }, - PeerInfo: func(id enode.ID) interface{} { - p, ok := ss.GoodPeers.Load(id.String()) - if !ok { - return nil - } - return p.(*PeerInfo).peer.Info() - }, - //Attributes: []enr.Entry{eth.CurrentENREntry(chainConfig, genesisHash, headHeight)}, - } - - return ss -} - -// Sentry creates and runs standalone sentry -func Sentry(datadir string, sentryAddr string, discoveryDNS []string, cfg *p2p.Config, protocolVersion uint) error { - if err := os.MkdirAll(path.Join(datadir, "erigon"), 0744); err != nil { - return fmt.Errorf("could not create dir: %s, %w", datadir, err) - } - ctx := rootContext() - sentryServer := NewSentryServer(ctx, nil, func() *eth.NodeInfo { return nil }, cfg, protocolVersion) - - err := grpcSentryServer(ctx, sentryAddr, sentryServer) - if err != nil { - return err - } - sentryServer.discoveryDNS = discoveryDNS - - <-ctx.Done() - return nil -} - -type SentryServerImpl struct { - proto_sentry.UnimplementedSentryServer - ctx context.Context - Protocol p2p.Protocol - discoveryDNS []string - GoodPeers sync.Map - statusData *proto_sentry.StatusData - P2pServer *p2p.Server - TxSubscribed uint32 // Set to non-zero if downloader is subscribed to transaction messages - lock sync.RWMutex - messageStreams map[proto_sentry.MessageId]*MessageStreams - messageStreamsLock sync.RWMutex - peersStreams *PeersStreams - p2p *p2p.Config -} - -func (ss *SentryServerImpl) startSync(ctx context.Context, bestHash common.Hash, peerID string) error { - switch ss.Protocol.Version { - case eth.ETH65: - b, err := rlp.EncodeToBytes(ð.GetBlockHeadersPacket{ - Amount: 1, - Reverse: false, - Skip: 0, - Origin: eth.HashOrNumber{Hash: bestHash}, - }) - if err != nil { - return fmt.Errorf("startSync encode packet failed: %v", err) - } - - if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{ - PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)), - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_65, - Data: b, - }, - }); err != nil { - return err - } - - case eth.ETH66: - b, err := rlp.EncodeToBytes(ð.GetBlockHeadersPacket66{ - RequestId: rand.Uint64(), - GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ - Amount: 1, - Reverse: false, - Skip: 0, - Origin: eth.HashOrNumber{Hash: bestHash}, - }, - }) - if err != nil { - return fmt.Errorf("startSync encode packet failed: %v", err) - } - if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{ - PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)), - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_66, - Data: b, - }, - }); err != nil { - return err - } - } - return nil -} - -func (ss *SentryServerImpl) PenalizePeer(_ context.Context, req *proto_sentry.PenalizePeerRequest) (*empty.Empty, error) { - //log.Warn("Received penalty", "kind", req.GetPenalty().Descriptor().FullName, "from", fmt.Sprintf("%s", req.GetPeerId())) - strId := string(gointerfaces.ConvertH512ToBytes(req.PeerId)) - if x, ok := ss.GoodPeers.Load(strId); ok { - peerInfo := x.(*PeerInfo) - if peerInfo != nil { - peerInfo.Remove() - } - } - ss.GoodPeers.Delete(strId) - return &empty.Empty{}, nil -} - -func (ss *SentryServerImpl) PeerMinBlock(_ context.Context, req *proto_sentry.PeerMinBlockRequest) (*empty.Empty, error) { - peerID := string(gointerfaces.ConvertH512ToBytes(req.PeerId)) - x, _ := ss.GoodPeers.Load(peerID) - peerInfo, _ := x.(*PeerInfo) - if peerInfo == nil { - return &empty.Empty{}, nil - } - peerInfo.lock.Lock() - defer peerInfo.lock.Unlock() - if req.MinBlock > peerInfo.height { - peerInfo.height = req.MinBlock - } - return &empty.Empty{}, nil -} - -func (ss *SentryServerImpl) findPeer(minBlock uint64) (string, *PeerInfo, bool) { - // Choose a peer that we can send this request to, with maximum number of permits - var foundPeerID string - var foundPeerInfo *PeerInfo - var maxPermits int - now := time.Now() - ss.GoodPeers.Range(func(key, value interface{}) bool { - peerID := key.(string) - x, _ := ss.GoodPeers.Load(peerID) - peerInfo, _ := x.(*PeerInfo) - if peerInfo == nil { - return true - } - if peerInfo.height >= minBlock { - deadlines := peerInfo.ClearDeadlines(now, false /* givePermit */) - //fmt.Printf("%d deadlines for peer %s\n", deadlines, peerID) - if deadlines < maxPermitsPerPeer { - permits := maxPermitsPerPeer - deadlines - if permits > maxPermits { - maxPermits = permits - foundPeerID = peerID - foundPeerInfo = peerInfo - } - } - } - return true - }) - return foundPeerID, foundPeerInfo, maxPermits > 0 -} - -func (ss *SentryServerImpl) SendMessageByMinBlock(_ context.Context, inreq *proto_sentry.SendMessageByMinBlockRequest) (*proto_sentry.SentPeers, error) { - peerID, peerInfo, found := ss.findPeer(inreq.MinBlock) - if !found { - return &proto_sentry.SentPeers{}, nil - } - msgcode := eth.FromProto[ss.Protocol.Version][inreq.Data.Id] - if msgcode != eth.GetBlockHeadersMsg && - msgcode != eth.GetBlockBodiesMsg && - msgcode != eth.GetPooledTransactionsMsg { - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageByMinBlock not implemented for message Id: %s", inreq.Data.Id) - } - if err := peerInfo.rw.WriteMsg(p2p.Msg{Code: msgcode, Size: uint32(len(inreq.Data.Data)), Payload: bytes.NewReader(inreq.Data.Data)}); err != nil { - if x, ok := ss.GoodPeers.Load(peerID); ok { - peerInfo := x.(*PeerInfo) - if peerInfo != nil { - peerInfo.Remove() - } - } - ss.GoodPeers.Delete(peerID) - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageByMinBlock to peer %s: %v", peerID, err) - } - peerInfo.AddDeadline(time.Now().Add(30 * time.Second)) - return &proto_sentry.SentPeers{Peers: []*proto_types.H512{gointerfaces.ConvertBytesToH512([]byte(peerID))}}, nil -} - -func (ss *SentryServerImpl) SendMessageById(_ context.Context, inreq *proto_sentry.SendMessageByIdRequest) (*proto_sentry.SentPeers, error) { - peerID := string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)) - x, ok := ss.GoodPeers.Load(peerID) - if !ok { - //TODO: enable after support peer to sentry mapping - //return &proto_sentry.SentPeers{}, fmt.Errorf("peer not found: %s", peerID) - return &proto_sentry.SentPeers{}, nil - } - peerInfo := x.(*PeerInfo) - msgcode := eth.FromProto[ss.Protocol.Version][inreq.Data.Id] - if msgcode != eth.GetBlockHeadersMsg && - msgcode != eth.BlockHeadersMsg && - msgcode != eth.BlockBodiesMsg && - msgcode != eth.GetReceiptsMsg && - msgcode != eth.ReceiptsMsg && - msgcode != eth.NewPooledTransactionHashesMsg && - msgcode != eth.PooledTransactionsMsg && - msgcode != eth.GetPooledTransactionsMsg { - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageById not implemented for message Id: %s", inreq.Data.Id) - } - - if err := peerInfo.rw.WriteMsg(p2p.Msg{Code: msgcode, Size: uint32(len(inreq.Data.Data)), Payload: bytes.NewReader(inreq.Data.Data)}); err != nil { - if x, ok := ss.GoodPeers.Load(peerID); ok { - peerInfo := x.(*PeerInfo) - if peerInfo != nil { - peerInfo.Remove() - } - } - ss.GoodPeers.Delete(peerID) - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageById to peer %s: %v", peerID, err) - } - return &proto_sentry.SentPeers{Peers: []*proto_types.H512{inreq.PeerId}}, nil -} - -func (ss *SentryServerImpl) SendMessageToRandomPeers(ctx context.Context, req *proto_sentry.SendMessageToRandomPeersRequest) (*proto_sentry.SentPeers, error) { - msgcode := eth.FromProto[ss.Protocol.Version][req.Data.Id] - if msgcode != eth.NewBlockMsg && - msgcode != eth.NewBlockHashesMsg && - msgcode != eth.NewPooledTransactionHashesMsg { - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageToRandomPeers not implemented for message Id: %s", req.Data.Id) - } - - amount := uint64(0) - ss.GoodPeers.Range(func(key, value interface{}) bool { - amount++ - return true - }) - if req.MaxPeers < amount { - amount = req.MaxPeers - } - - // Send the block to a subset of our peers - sendToAmount := int(math.Sqrt(float64(amount))) - i := 0 - var innerErr error - reply := &proto_sentry.SentPeers{Peers: []*proto_types.H512{}} - ss.GoodPeers.Range(func(key, value interface{}) bool { - peerID := key.(string) - peerInfo, _ := value.(*PeerInfo) - if peerInfo == nil { - return true - } - if err := peerInfo.rw.WriteMsg(p2p.Msg{Code: msgcode, Size: uint32(len(req.Data.Data)), Payload: bytes.NewReader(req.Data.Data)}); err != nil { - peerInfo.Remove() - ss.GoodPeers.Delete(peerID) - innerErr = err - return true - } - reply.Peers = append(reply.Peers, gointerfaces.ConvertBytesToH512([]byte(peerID))) - i++ - return i < sendToAmount - }) - if innerErr != nil { - return reply, fmt.Errorf("sendMessageToRandomPeers to peer %w", innerErr) - } - return reply, nil -} - -func (ss *SentryServerImpl) SendMessageToAll(ctx context.Context, req *proto_sentry.OutboundMessageData) (*proto_sentry.SentPeers, error) { - msgcode := eth.FromProto[ss.Protocol.Version][req.Id] - if msgcode != eth.NewBlockMsg && - msgcode != eth.NewPooledTransactionHashesMsg && // to broadcast new local transactions - msgcode != eth.NewBlockHashesMsg { - return &proto_sentry.SentPeers{}, fmt.Errorf("sendMessageToAll not implemented for message Id: %s", req.Id) - } - - var innerErr error - reply := &proto_sentry.SentPeers{Peers: []*proto_types.H512{}} - ss.GoodPeers.Range(func(key, value interface{}) bool { - peerID := key.(string) - peerInfo, _ := value.(*PeerInfo) - if peerInfo == nil { - return true - } - if err := peerInfo.rw.WriteMsg(p2p.Msg{Code: msgcode, Size: uint32(len(req.Data)), Payload: bytes.NewReader(req.Data)}); err != nil { - peerInfo.Remove() - ss.GoodPeers.Delete(peerID) - innerErr = err - return true - } - reply.Peers = append(reply.Peers, gointerfaces.ConvertBytesToH512([]byte(peerID))) - return true - }) - if innerErr != nil { - return reply, fmt.Errorf("sendMessageToRandomPeers to peer %w", innerErr) - } - return reply, nil -} - -func (ss *SentryServerImpl) SetStatus(_ context.Context, statusData *proto_sentry.StatusData) (*proto_sentry.SetStatusReply, error) { - genesisHash := gointerfaces.ConvertH256ToHash(statusData.ForkData.Genesis) - - ss.lock.Lock() - defer ss.lock.Unlock() - reply := &proto_sentry.SetStatusReply{} - switch ss.Protocol.Version { - case eth.ETH66: - reply.Protocol = proto_sentry.Protocol_ETH66 - case eth.ETH65: - reply.Protocol = proto_sentry.Protocol_ETH65 - } - - if ss.P2pServer == nil { - var err error - if !ss.p2p.NoDiscovery { - if len(ss.discoveryDNS) == 0 { - if url := params.KnownDNSNetwork(genesisHash, "all"); url != "" { - ss.discoveryDNS = []string{url} - } - } - ss.Protocol.DialCandidates, err = setupDiscovery(ss.discoveryDNS) - if err != nil { - return nil, err - } - } - - ss.P2pServer, err = makeP2PServer(*ss.p2p, genesisHash, ss.Protocol) - if err != nil { - return reply, err - } - // Add protocol - if err := ss.P2pServer.Start(); err != nil { - return reply, fmt.Errorf("could not start server: %w", err) - } - } - ss.P2pServer.LocalNode().Set(eth.CurrentENREntryFromForks(statusData.ForkData.Forks, genesisHash, statusData.MaxBlock)) - if ss.statusData == nil || statusData.MaxBlock != 0 { - // Not overwrite statusData if the message contains zero MaxBlock (comes from standalone transaction pool) - ss.statusData = statusData - } - return reply, nil -} - -func (ss *SentryServerImpl) SimplePeerCount() (pc int) { - ss.GoodPeers.Range(func(key, value interface{}) bool { - peerID := key.(string) - x, _ := ss.GoodPeers.Load(peerID) - peerInfo, _ := x.(*PeerInfo) - if peerInfo == nil { - return true - } - pc++ - return true - }) - return pc -} - -func (ss *SentryServerImpl) PeerCount(_ context.Context, req *proto_sentry.PeerCountRequest) (*proto_sentry.PeerCountReply, error) { - return &proto_sentry.PeerCountReply{Count: uint64(ss.SimplePeerCount())}, nil -} - -// setupDiscovery creates the node discovery source for the `eth` and `snap` -// protocols. -func setupDiscovery(urls []string) (enode.Iterator, error) { - if len(urls) == 0 { - return nil, nil - } - client := dnsdisc.NewClient(dnsdisc.Config{}) - return client.NewIterator(urls...) -} - -func (ss *SentryServerImpl) GetStatus() *proto_sentry.StatusData { - ss.lock.RLock() - defer ss.lock.RUnlock() - return ss.statusData -} - -func (ss *SentryServerImpl) send(msgID proto_sentry.MessageId, peerID string, b []byte) { - ss.messageStreamsLock.RLock() - defer ss.messageStreamsLock.RUnlock() - errs := ss.messageStreams[msgID].Broadcast(&proto_sentry.InboundMessage{ - PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)), - Id: msgID, - Data: b, - }) - for _, err := range errs { - log.Error("Sending msg to core P2P failed", "msg", proto_sentry.MessageId_name[int32(msgID)], "error", err) - } -} - -func (ss *SentryServerImpl) hasSubscribers(msgID proto_sentry.MessageId) bool { - ss.messageStreamsLock.RLock() - defer ss.messageStreamsLock.RUnlock() - return ss.messageStreams[msgID] != nil && ss.messageStreams[msgID].Len() > 0 - // log.Error("Sending msg to core P2P failed", "msg", proto_sentry.MessageId_name[int32(streamMsg.msgId)], "error", err) -} - -func (ss *SentryServerImpl) addMessagesStream(ids []proto_sentry.MessageId, server proto_sentry.Sentry_MessagesServer) func() { - ss.messageStreamsLock.Lock() - defer ss.messageStreamsLock.Unlock() - if ss.messageStreams == nil { - ss.messageStreams = map[proto_sentry.MessageId]*MessageStreams{} - } - - cleanStack := make([]func(), len(ids)) - for i, id := range ids { - m, ok := ss.messageStreams[id] - if !ok { - m = NewStreamsList() - ss.messageStreams[id] = m - } - - cleanStack[i] = m.Add(server) - } - return func() { - for i := range cleanStack { - cleanStack[i]() - } - } -} - -func (ss *SentryServerImpl) Messages(req *proto_sentry.MessagesRequest, server proto_sentry.Sentry_MessagesServer) error { - log.Debug(fmt.Sprintf("[Messages] new subscriber to: %s", req.Ids)) - clean := ss.addMessagesStream(req.Ids, server) - defer clean() - select { - case <-ss.ctx.Done(): - return nil - case <-server.Context().Done(): - return nil - } -} - -// MessageStreams - it's safe to use this class as non-pointer -type MessageStreams struct { - mu sync.RWMutex - id uint - streams map[uint]proto_sentry.Sentry_MessagesServer -} - -func NewStreamsList() *MessageStreams { - return &MessageStreams{} -} - -func (s *MessageStreams) Add(stream proto_sentry.Sentry_MessagesServer) (remove func()) { - s.mu.Lock() - defer s.mu.Unlock() - if s.streams == nil { - s.streams = make(map[uint]proto_sentry.Sentry_MessagesServer) - } - s.id++ - id := s.id - s.streams[id] = stream - return func() { s.remove(id) } -} - -func (s *MessageStreams) doBroadcast(reply *proto_sentry.InboundMessage) (ids []uint, errs []error) { - s.mu.RLock() - defer s.mu.RUnlock() - for id, stream := range s.streams { - err := stream.Send(reply) - if err != nil { - select { - case <-stream.Context().Done(): - ids = append(ids, id) - default: - } - errs = append(errs, err) - } - } - return -} - -func (s *MessageStreams) Broadcast(reply *proto_sentry.InboundMessage) (errs []error) { - var ids []uint - ids, errs = s.doBroadcast(reply) - if len(ids) > 0 { - s.mu.Lock() - defer s.mu.Unlock() - } - for _, id := range ids { - delete(s.streams, id) - } - return errs -} - -func (s *MessageStreams) Len() int { - s.mu.RLock() - defer s.mu.RUnlock() - return len(s.streams) -} - -func (s *MessageStreams) remove(id uint) { - s.mu.Lock() - defer s.mu.Unlock() - _, ok := s.streams[id] - if !ok { // double-unsubscribe support - return - } - delete(s.streams, id) -} - -func (ss *SentryServerImpl) sendNewPeerToClients(peerID *proto_types.H512) { - if err := ss.peersStreams.Broadcast(&proto_sentry.PeersReply{PeerId: peerID, Event: proto_sentry.PeersReply_Connect}); err != nil { - log.Error("Sending new peer notice to core P2P failed", "error", err) - } -} - -func (ss *SentryServerImpl) Peers(req *proto_sentry.PeersRequest, server proto_sentry.Sentry_PeersServer) error { - clean := ss.peersStreams.Add(server) - defer clean() - select { - case <-ss.ctx.Done(): - return nil - case <-server.Context().Done(): - return nil - } -} - -// PeersStreams - it's safe to use this class as non-pointer -type PeersStreams struct { - mu sync.RWMutex - id uint - streams map[uint]proto_sentry.Sentry_PeersServer -} - -func NewPeersStreams() *PeersStreams { - return &PeersStreams{} -} - -func (s *PeersStreams) Add(stream proto_sentry.Sentry_PeersServer) (remove func()) { - s.mu.Lock() - defer s.mu.Unlock() - if s.streams == nil { - s.streams = make(map[uint]proto_sentry.Sentry_PeersServer) - } - s.id++ - id := s.id - s.streams[id] = stream - return func() { s.remove(id) } -} - -func (s *PeersStreams) doBroadcast(reply *proto_sentry.PeersReply) (ids []uint, errs []error) { - s.mu.RLock() - defer s.mu.RUnlock() - for id, stream := range s.streams { - err := stream.Send(reply) - if err != nil { - select { - case <-stream.Context().Done(): - ids = append(ids, id) - default: - } - errs = append(errs, err) - } - } - return -} - -func (s *PeersStreams) Broadcast(reply *proto_sentry.PeersReply) (errs []error) { - var ids []uint - ids, errs = s.doBroadcast(reply) - if len(ids) > 0 { - s.mu.Lock() - defer s.mu.Unlock() - } - for _, id := range ids { - delete(s.streams, id) - } - return errs -} - -func (s *PeersStreams) Len() int { - s.mu.RLock() - defer s.mu.RUnlock() - return len(s.streams) -} - -func (s *PeersStreams) remove(id uint) { - s.mu.Lock() - defer s.mu.Unlock() - _, ok := s.streams[id] - if !ok { // double-unsubscribe support - return - } - delete(s.streams, id) -} diff --git a/cmd/sentry/main.go b/cmd/sentry/main.go index b212bb0493f..23522a5a9d4 100644 --- a/cmd/sentry/main.go +++ b/cmd/sentry/main.go @@ -1,11 +1,106 @@ package main import ( - "github.com/ledgerwatch/erigon/cmd/sentry/commands" + "fmt" + "os" + "path/filepath" + + "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon/cmd/sentry/sentry" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/common/paths" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/internal/debug" + node2 "github.com/ledgerwatch/erigon/turbo/node" + "github.com/spf13/cobra" ) // generate the messages +var ( + sentryAddr string // Address of the sentry : + chaindata string // Path to chaindata + datadir string // Path to td working dir + + natSetting string // NAT setting + port int // Listening port + staticPeers []string // static peers + trustedPeers []string // trusted peers + discoveryDNS []string + nodiscover bool // disable sentry's discovery mechanism + protocol string + netRestrict string // CIDR to restrict peering to + maxPeers int + maxPendPeers int + healthCheck bool +) + +func init() { + utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) + + rootCmd.Flags().StringVar(&sentryAddr, "sentry.api.addr", "localhost:9091", "grpc addresses") + rootCmd.Flags().StringVar(&datadir, utils.DataDirFlag.Name, paths.DefaultDataDir(), utils.DataDirFlag.Usage) + rootCmd.Flags().StringVar(&natSetting, utils.NATFlag.Name, utils.NATFlag.Value, utils.NATFlag.Usage) + rootCmd.Flags().IntVar(&port, utils.ListenPortFlag.Name, utils.ListenPortFlag.Value, utils.ListenPortFlag.Usage) + rootCmd.Flags().StringSliceVar(&staticPeers, utils.StaticPeersFlag.Name, []string{}, utils.StaticPeersFlag.Usage) + rootCmd.Flags().StringSliceVar(&trustedPeers, utils.TrustedPeersFlag.Name, []string{}, utils.TrustedPeersFlag.Usage) + rootCmd.Flags().StringSliceVar(&discoveryDNS, utils.DNSDiscoveryFlag.Name, []string{}, utils.DNSDiscoveryFlag.Usage) + rootCmd.Flags().BoolVar(&nodiscover, utils.NoDiscoverFlag.Name, false, utils.NoDiscoverFlag.Usage) + rootCmd.Flags().StringVar(&protocol, "p2p.protocol", "eth66", "eth66") + rootCmd.Flags().StringVar(&netRestrict, utils.NetrestrictFlag.Name, utils.NetrestrictFlag.Value, utils.NetrestrictFlag.Usage) + rootCmd.Flags().IntVar(&maxPeers, utils.MaxPeersFlag.Name, utils.MaxPeersFlag.Value, utils.MaxPeersFlag.Usage) + rootCmd.Flags().IntVar(&maxPendPeers, utils.MaxPendingPeersFlag.Name, utils.MaxPendingPeersFlag.Value, utils.MaxPendingPeersFlag.Usage) + rootCmd.Flags().BoolVar(&healthCheck, utils.HealthCheckFlag.Name, false, utils.HealthCheckFlag.Usage) + + if err := rootCmd.MarkFlagDirname(utils.DataDirFlag.Name); err != nil { + panic(err) + } +} + +var rootCmd = &cobra.Command{ + Use: "sentry", + Short: "Run p2p sentry", + PersistentPreRun: func(cmd *cobra.Command, args []string) { + if err := debug.SetupCobra(cmd); err != nil { + panic(err) + } + if chaindata == "" { + chaindata = filepath.Join(datadir, "chaindata") + } + }, + PersistentPostRun: func(cmd *cobra.Command, args []string) { + debug.Exit() + }, + RunE: func(cmd *cobra.Command, args []string) error { + p := eth.ETH66 + + nodeConfig := node2.NewNodeConfig() + p2pConfig, err := utils.NewP2PConfig( + nodiscover, + datadir, + netRestrict, + natSetting, + maxPeers, + maxPendPeers, + nodeConfig.NodeName(), + staticPeers, + trustedPeers, + uint(port), + uint(p), + ) + if err != nil { + return err + } + + return sentry.Sentry(cmd.Context(), datadir, sentryAddr, discoveryDNS, p2pConfig, uint(p), healthCheck) + }, +} + func main() { - commands.Execute() + ctx, cancel := common.RootContext() + defer cancel() + if err := rootCmd.ExecuteContext(ctx); err != nil { + fmt.Println(err) + os.Exit(1) + } } diff --git a/cmd/sentry/download/broadcast.go b/cmd/sentry/sentry/broadcast.go similarity index 57% rename from cmd/sentry/download/broadcast.go rename to cmd/sentry/sentry/broadcast.go index 552afbd422d..869fede9555 100644 --- a/cmd/sentry/download/broadcast.go +++ b/cmd/sentry/sentry/broadcast.go @@ -1,15 +1,19 @@ -package download +package sentry import ( "context" + "errors" + "math" "math/big" "strings" + "syscall" proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" "github.com/ledgerwatch/log/v3" @@ -24,7 +28,7 @@ const ( maxTxPacketSize = 100 * 1024 ) -func (cs *ControlServerImpl) PropagateNewBlockHashes(ctx context.Context, announces []headerdownload.Announce) { +func (cs *MultiClient) PropagateNewBlockHashes(ctx context.Context, announces []headerdownload.Announce) { cs.lock.RLock() defer cs.lock.RUnlock() typedRequest := make(eth.NewBlockHashesPacket, len(announces)) @@ -34,28 +38,22 @@ func (cs *ControlServerImpl) PropagateNewBlockHashes(ctx context.Context, announ } data, err := rlp.EncodeToBytes(&typedRequest) if err != nil { - log.Error("propagateNewBlockHashes", "error", err) + log.Error("propagateNewBlockHashes", "err", err) return } - var req66, req65 *proto_sentry.OutboundMessageData - for _, sentry := range cs.sentries { + var req66 *proto_sentry.OutboundMessageData + // Send the block to a subset of our peers + sendToAmount := int(math.Sqrt(float64(len(cs.sentries)))) + for i, sentry := range cs.sentries { if !sentry.Ready() { continue } + if i > sendToAmount { //TODO: send to random sentries, not just to fi + break + } switch sentry.Protocol() { - case eth.ETH65: - if req65 == nil { - req65 = &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_NEW_BLOCK_HASHES_65, - Data: data, - } - } - _, err = sentry.SendMessageToAll(ctx, req65, &grpc.EmptyCallOption{}) - if err != nil { - log.Error("propagateNewBlockHashes", "error", err) - } case eth.ETH66: if req66 == nil { req66 = &proto_sentry.OutboundMessageData{ @@ -65,7 +63,7 @@ func (cs *ControlServerImpl) PropagateNewBlockHashes(ctx context.Context, announ _, err = sentry.SendMessageToAll(ctx, req66, &grpc.EmptyCallOption{}) if err != nil { - log.Error("propagateNewBlockHashes", "error", err) + log.Error("propagateNewBlockHashes", "err", err) } } default: @@ -74,7 +72,7 @@ func (cs *ControlServerImpl) PropagateNewBlockHashes(ctx context.Context, announ } } -func (cs *ControlServerImpl) BroadcastNewBlock(ctx context.Context, block *types.Block, td *big.Int) { +func (cs *MultiClient) BroadcastNewBlock(ctx context.Context, block *types.Block, td *big.Int) { cs.lock.RLock() defer cs.lock.RUnlock() data, err := rlp.EncodeToBytes(ð.NewBlockPacket{ @@ -82,32 +80,20 @@ func (cs *ControlServerImpl) BroadcastNewBlock(ctx context.Context, block *types TD: td, }) if err != nil { - log.Error("broadcastNewBlock", "error", err) + log.Error("broadcastNewBlock", "err", err) } - var req66, req65 *proto_sentry.SendMessageToRandomPeersRequest - for _, sentry := range cs.sentries { + var req66 *proto_sentry.SendMessageToRandomPeersRequest + // Send the block to a subset of our peers + sendToAmount := int(math.Sqrt(float64(len(cs.sentries)))) + for i, sentry := range cs.sentries { if !sentry.Ready() { continue } + if i > sendToAmount { //TODO: send to random sentries, not just to fi + break + } switch sentry.Protocol() { - case eth.ETH65: - if req65 == nil { - req65 = &proto_sentry.SendMessageToRandomPeersRequest{ - MaxPeers: 1024, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_NEW_BLOCK_65, - Data: data, - }, - } - } - - if _, err = sentry.SendMessageToRandomPeers(ctx, req65, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { - continue - } - log.Error("broadcastNewBlock", "error", err) - } case eth.ETH66: if req66 == nil { @@ -120,16 +106,17 @@ func (cs *ControlServerImpl) BroadcastNewBlock(ctx context.Context, block *types } } if _, err = sentry.SendMessageToRandomPeers(ctx, req66, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { + if isPeerNotFoundErr(err) || networkTemporaryErr(err) { + log.Debug("broadcastNewBlock", "err", err) continue } - log.Error("broadcastNewBlock", "error", err) + log.Error("broadcastNewBlock", "err", err) } } } } -func (cs *ControlServerImpl) BroadcastLocalPooledTxs(ctx context.Context, txs []common.Hash) { +func (cs *MultiClient) BroadcastLocalPooledTxs(ctx context.Context, txs []common.Hash) { if len(txs) == 0 { return } @@ -152,32 +139,20 @@ func (cs *ControlServerImpl) BroadcastLocalPooledTxs(ctx context.Context, txs [] data, err := rlp.EncodeToBytes(eth.NewPooledTransactionHashesPacket(pending)) if err != nil { - log.Error("BroadcastLocalPooledTxs", "error", err) + log.Error("BroadcastLocalPooledTxs", "err", err) } - var req66, req65 *proto_sentry.OutboundMessageData - for _, sentry := range cs.sentries { + var req66 *proto_sentry.OutboundMessageData + // Send the block to a subset of our peers + sendToAmount := int(math.Sqrt(float64(len(cs.sentries)))) + for i, sentry := range cs.sentries { if !sentry.Ready() { continue } + if i > sendToAmount { //TODO: send to random sentries, not just to fi + break + } switch sentry.Protocol() { - case eth.ETH65: - if req65 == nil { - req65 = &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_65, - Data: data, - } - } - - peers, err := sentry.SendMessageToAll(ctx, req65, &grpc.EmptyCallOption{}) - if err != nil { - if isPeerNotFoundErr(err) { - continue - } - log.Error("BroadcastLocalPooledTxs", "error", err) - } - avgPeersPerSent65 += len(peers.Peers) - case eth.ETH66: if req66 == nil { req66 = &proto_sentry.OutboundMessageData{ @@ -187,12 +162,13 @@ func (cs *ControlServerImpl) BroadcastLocalPooledTxs(ctx context.Context, txs [] } peers, err := sentry.SendMessageToAll(ctx, req66, &grpc.EmptyCallOption{}) if err != nil { - if isPeerNotFoundErr(err) { + if isPeerNotFoundErr(err) || networkTemporaryErr(err) { + log.Debug("BroadcastLocalPooledTxs", "err", err) continue } - log.Error("BroadcastLocalPooledTxs", "error", err) + log.Error("BroadcastLocalPooledTxs", "err", err) } - avgPeersPerSent66 += len(peers.Peers) + avgPeersPerSent66 += len(peers.GetPeers()) } } } @@ -203,7 +179,7 @@ func (cs *ControlServerImpl) BroadcastLocalPooledTxs(ctx context.Context, txs [] } } -func (cs *ControlServerImpl) BroadcastRemotePooledTxs(ctx context.Context, txs []common.Hash) { +func (cs *MultiClient) BroadcastRemotePooledTxs(ctx context.Context, txs []common.Hash) { if len(txs) == 0 { return } @@ -222,32 +198,20 @@ func (cs *ControlServerImpl) BroadcastRemotePooledTxs(ctx context.Context, txs [ data, err := rlp.EncodeToBytes(eth.NewPooledTransactionHashesPacket(pending)) if err != nil { - log.Error("BroadcastRemotePooledTxs", "error", err) + log.Error("BroadcastRemotePooledTxs", "err", err) } - var req66, req65 *proto_sentry.SendMessageToRandomPeersRequest - for _, sentry := range cs.sentries { + var req66 *proto_sentry.SendMessageToRandomPeersRequest + // Send the block to a subset of our peers + sendToAmount := int(math.Sqrt(float64(len(cs.sentries)))) + for i, sentry := range cs.sentries { if !sentry.Ready() { continue } + if i > sendToAmount { //TODO: send to random sentries, not just to fi + break + } switch sentry.Protocol() { - case eth.ETH65: - if req65 == nil { - req65 = &proto_sentry.SendMessageToRandomPeersRequest{ - MaxPeers: 1024, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_65, - Data: data, - }, - } - } - - if _, err = sentry.SendMessageToRandomPeers(ctx, req65, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { - continue - } - log.Error("BroadcastRemotePooledTxs", "error", err) - } case eth.ETH66: if req66 == nil { @@ -260,17 +224,18 @@ func (cs *ControlServerImpl) BroadcastRemotePooledTxs(ctx context.Context, txs [ } } if _, err = sentry.SendMessageToRandomPeers(ctx, req66, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { + if isPeerNotFoundErr(err) || networkTemporaryErr(err) { + log.Debug("BroadcastRemotePooledTxs", "err", err) continue } - log.Error("BroadcastRemotePooledTxs", "error", err) + log.Error("BroadcastRemotePooledTxs", "err", err) } } } } } -func (cs *ControlServerImpl) PropagatePooledTxsToPeersList(ctx context.Context, peers []*types2.H512, txs []common.Hash) { +func (cs *MultiClient) PropagatePooledTxsToPeersList(ctx context.Context, peers []*types2.H512, txs []common.Hash) { if len(txs) == 0 { return } @@ -289,7 +254,7 @@ func (cs *ControlServerImpl) PropagatePooledTxsToPeersList(ctx context.Context, data, err := rlp.EncodeToBytes(eth.NewPooledTransactionHashesPacket(pending)) if err != nil { - log.Error("PropagatePooledTxsToPeersList", "error", err) + log.Error("PropagatePooledTxsToPeersList", "err", err) } for _, sentry := range cs.sentries { if !sentry.Ready() { @@ -298,21 +263,6 @@ func (cs *ControlServerImpl) PropagatePooledTxsToPeersList(ctx context.Context, for _, peer := range peers { switch sentry.Protocol() { - case eth.ETH65: - req65 := &proto_sentry.SendMessageByIdRequest{ - PeerId: peer, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_65, - Data: data, - }, - } - - if _, err = sentry.SendMessageById(ctx, req65, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { - continue - } - log.Error("broadcastNewBlock", "error", err) - } case eth.ETH66: req66 := &proto_sentry.SendMessageByIdRequest{ @@ -323,10 +273,11 @@ func (cs *ControlServerImpl) PropagatePooledTxsToPeersList(ctx context.Context, }, } if _, err = sentry.SendMessageById(ctx, req66, &grpc.EmptyCallOption{}); err != nil { - if isPeerNotFoundErr(err) { + if isPeerNotFoundErr(err) || networkTemporaryErr(err) { + log.Debug("PropagatePooledTxsToPeersList", "err", err) continue } - log.Error("PropagatePooledTxsToPeersList", "error", err) + log.Error("PropagatePooledTxsToPeersList", "err", err) } } } @@ -334,6 +285,9 @@ func (cs *ControlServerImpl) PropagatePooledTxsToPeersList(ctx context.Context, } } +func networkTemporaryErr(err error) bool { + return errors.Is(err, syscall.EPIPE) || errors.Is(err, p2p.ErrShuttingDown) +} func isPeerNotFoundErr(err error) bool { return strings.Contains(err.Error(), "peer not found") } diff --git a/cmd/sentry/sentry/eth_handshake.go b/cmd/sentry/sentry/eth_handshake.go new file mode 100644 index 00000000000..acda7a8c41e --- /dev/null +++ b/cmd/sentry/sentry/eth_handshake.go @@ -0,0 +1,83 @@ +package sentry + +import ( + "fmt" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p" +) + +func readAndValidatePeerStatusMessage( + rw p2p.MsgReadWriter, + status *proto_sentry.StatusData, + version uint, + minVersion uint, +) (*eth.StatusPacket, error) { + msg, err := rw.ReadMsg() + if err != nil { + return nil, err + } + + reply, err := tryDecodeStatusMessage(&msg) + msg.Discard() + if err != nil { + return nil, err + } + + err = checkPeerStatusCompatibility(reply, status, version, minVersion) + return reply, err +} + +func tryDecodeStatusMessage(msg *p2p.Msg) (*eth.StatusPacket, error) { + if msg.Code != eth.StatusMsg { + return nil, fmt.Errorf("first msg has code %x (!= %x)", msg.Code, eth.StatusMsg) + } + + if msg.Size > eth.ProtocolMaxMsgSize { + return nil, fmt.Errorf("message is too large %d, limit %d", msg.Size, eth.ProtocolMaxMsgSize) + } + + var reply eth.StatusPacket + if err := msg.Decode(&reply); err != nil { + return nil, fmt.Errorf("decode message %v: %w", msg, err) + } + + return &reply, nil +} + +func checkPeerStatusCompatibility( + reply *eth.StatusPacket, + status *proto_sentry.StatusData, + version uint, + minVersion uint, +) error { + networkID := status.NetworkId + if reply.NetworkID != networkID { + return fmt.Errorf("network id does not match: theirs %d, ours %d", reply.NetworkID, networkID) + } + + if uint(reply.ProtocolVersion) > version { + return fmt.Errorf("version is more than what this senty supports: theirs %d, max %d", reply.ProtocolVersion, version) + } + if uint(reply.ProtocolVersion) < minVersion { + return fmt.Errorf("version is less than allowed minimum: theirs %d, min %d", reply.ProtocolVersion, minVersion) + } + + genesisHash := gointerfaces.ConvertH256ToHash(status.ForkData.Genesis) + if reply.Genesis != genesisHash { + return fmt.Errorf("genesis hash does not match: theirs %x, ours %x", reply.Genesis, genesisHash) + } + + forks := make([]uint64, len(status.ForkData.Forks)) + // copy because forkid.NewFilterFromForks will write into this slice + copy(forks, status.ForkData.Forks) + forkFilter := forkid.NewFilterFromForks(forks, genesisHash, status.MaxBlock) + if err := forkFilter(reply.ForkID); err != nil { + return err + } + + return nil +} diff --git a/cmd/sentry/sentry/eth_handshake_test.go b/cmd/sentry/sentry/eth_handshake_test.go new file mode 100644 index 00000000000..eeec146f3f9 --- /dev/null +++ b/cmd/sentry/sentry/eth_handshake_test.go @@ -0,0 +1,78 @@ +package sentry + +import ( + "math/big" + "testing" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/params" + "github.com/stretchr/testify/assert" +) + +func TestCheckPeerStatusCompatibility(t *testing.T) { + var version uint = eth.ETH66 + networkID := params.MainnetChainConfig.ChainID.Uint64() + goodReply := eth.StatusPacket{ + ProtocolVersion: uint32(version), + NetworkID: networkID, + TD: big.NewInt(0), + Head: common.Hash{}, + Genesis: params.MainnetGenesisHash, + ForkID: forkid.NewID(params.MainnetChainConfig, params.MainnetGenesisHash, 0), + } + status := proto_sentry.StatusData{ + NetworkId: networkID, + TotalDifficulty: gointerfaces.ConvertUint256IntToH256(new(uint256.Int)), + BestHash: nil, + ForkData: &proto_sentry.Forks{ + Genesis: gointerfaces.ConvertHashToH256(params.MainnetGenesisHash), + Forks: forkid.GatherForks(params.MainnetChainConfig), + }, + MaxBlock: 0, + } + + t.Run("ok", func(t *testing.T) { + err := checkPeerStatusCompatibility(&goodReply, &status, version, version) + assert.Nil(t, err) + }) + t.Run("network mismatch", func(t *testing.T) { + reply := goodReply + reply.NetworkID = 0 + err := checkPeerStatusCompatibility(&reply, &status, version, version) + assert.NotNil(t, err) + assert.Contains(t, err.Error(), "network") + }) + t.Run("version mismatch min", func(t *testing.T) { + reply := goodReply + reply.ProtocolVersion = eth.ETH66 - 1 + err := checkPeerStatusCompatibility(&reply, &status, version, version) + assert.NotNil(t, err) + assert.Contains(t, err.Error(), "version is less") + }) + t.Run("version mismatch max", func(t *testing.T) { + reply := goodReply + reply.ProtocolVersion = eth.ETH66 + 1 + err := checkPeerStatusCompatibility(&reply, &status, version, version) + assert.NotNil(t, err) + assert.Contains(t, err.Error(), "version is more") + }) + t.Run("genesis mismatch", func(t *testing.T) { + reply := goodReply + reply.Genesis = common.Hash{} + err := checkPeerStatusCompatibility(&reply, &status, version, version) + assert.NotNil(t, err) + assert.Contains(t, err.Error(), "genesis") + }) + t.Run("fork mismatch", func(t *testing.T) { + reply := goodReply + reply.ForkID = forkid.ID{} + err := checkPeerStatusCompatibility(&reply, &status, version, version) + assert.NotNil(t, err) + assert.ErrorIs(t, err, forkid.ErrLocalIncompatibleOrStale) + }) +} diff --git a/cmd/sentry/download/sentry_api.go b/cmd/sentry/sentry/sentry_api.go similarity index 56% rename from cmd/sentry/download/sentry_api.go rename to cmd/sentry/sentry/sentry_api.go index a45bb5ba3ef..fbb1ed814d9 100644 --- a/cmd/sentry/download/sentry_api.go +++ b/cmd/sentry/sentry/sentry_api.go @@ -1,4 +1,4 @@ -package download +package sentry import ( "context" @@ -18,25 +18,25 @@ import ( // Methods of sentry called by Core -func (cs *ControlServerImpl) UpdateHead(ctx context.Context, height uint64, hash common.Hash, td *uint256.Int) { +func (cs *MultiClient) UpdateHead(ctx context.Context, height uint64, hash common.Hash, td *uint256.Int) { cs.lock.Lock() defer cs.lock.Unlock() cs.headHeight = height cs.headHash = hash cs.headTd = td - statusMsg := makeStatusData(cs) + statusMsg := cs.makeStatusData() for _, sentry := range cs.sentries { if !sentry.Ready() { continue } if _, err := sentry.SetStatus(ctx, statusMsg, &grpc.EmptyCallOption{}); err != nil { - log.Error("Update status message for the sentry", "error", err) + log.Error("Update status message for the sentry", "err", err) } } } -func (cs *ControlServerImpl) SendBodyRequest(ctx context.Context, req *bodydownload.BodyRequest) []byte { +func (cs *MultiClient) SendBodyRequest(ctx context.Context, req *bodydownload.BodyRequest) (peerID [64]byte, ok bool) { // if sentry not found peers to send such message, try next one. stop if found. for i, ok, next := cs.randSentryIndex(); ok; i, ok = next() { if !cs.sentries[i].Ready() { @@ -54,7 +54,7 @@ func (cs *ControlServerImpl) SendBodyRequest(ctx context.Context, req *bodydownl }) if err != nil { log.Error("Could not encode block bodies request", "err", err) - return nil + return [64]byte{}, false } outreq := proto_sentry.SendMessageByMinBlockRequest{ MinBlock: req.BlockNums[len(req.BlockNums)-1], @@ -67,44 +67,18 @@ func (cs *ControlServerImpl) SendBodyRequest(ctx context.Context, req *bodydownl sentPeers, err1 := cs.sentries[i].SendMessageByMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}) if err1 != nil { log.Error("Could not send block bodies request", "err", err1) - return nil + return [64]byte{}, false } if sentPeers == nil || len(sentPeers.Peers) == 0 { continue } - return gointerfaces.ConvertH512ToBytes(sentPeers.Peers[0]) - case eth.ETH65: - //log.Info(fmt.Sprintf("Sending body request for %v", req.BlockNums)) - var bytes []byte - var err error - bytes, err = rlp.EncodeToBytes(eth.GetBlockBodiesPacket(req.Hashes)) - if err != nil { - log.Error("Could not encode block bodies request", "err", err) - return nil - } - outreq := proto_sentry.SendMessageByMinBlockRequest{ - MinBlock: req.BlockNums[len(req.BlockNums)-1], - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_GET_BLOCK_BODIES_65, - Data: bytes, - }, - } - - sentPeers, err1 := cs.sentries[i].SendMessageByMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}) - if err1 != nil { - log.Error("Could not send block bodies request", "err", err1) - return nil - } - if sentPeers == nil || len(sentPeers.Peers) == 0 { - continue - } - return gointerfaces.ConvertH512ToBytes(sentPeers.Peers[0]) + return ConvertH512ToPeerID(sentPeers.Peers[0]), true } } - return nil + return [64]byte{}, false } -func (cs *ControlServerImpl) SendHeaderRequest(ctx context.Context, req *headerdownload.HeaderRequest) []byte { +func (cs *MultiClient) SendHeaderRequest(ctx context.Context, req *headerdownload.HeaderRequest) (peerID [64]byte, ok bool) { // if sentry not found peers to send such message, try next one. stop if found. for i, ok, next := cs.randSentryIndex(); ok; i, ok = next() { if !cs.sentries[i].Ready() { @@ -128,12 +102,9 @@ func (cs *ControlServerImpl) SendHeaderRequest(ctx context.Context, req *headerd bytes, err := rlp.EncodeToBytes(reqData) if err != nil { log.Error("Could not encode header request", "err", err) - return nil + return [64]byte{}, false } minBlock := req.Number - if !req.Reverse { - minBlock = req.Number + req.Length*req.Skip - } outreq := proto_sentry.SendMessageByMinBlockRequest{ MinBlock: minBlock, @@ -145,55 +116,18 @@ func (cs *ControlServerImpl) SendHeaderRequest(ctx context.Context, req *headerd sentPeers, err1 := cs.sentries[i].SendMessageByMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}) if err1 != nil { log.Error("Could not send header request", "err", err1) - return nil - } - if sentPeers == nil || len(sentPeers.Peers) == 0 { - continue - } - return gointerfaces.ConvertH512ToBytes(sentPeers.Peers[0]) - case eth.ETH65: - //log.Info(fmt.Sprintf("Sending header request {hash: %x, height: %d, length: %d}", req.Hash, req.Number, req.Length)) - reqData := ð.GetBlockHeadersPacket{ - Amount: req.Length, - Reverse: req.Reverse, - Skip: req.Skip, - Origin: eth.HashOrNumber{Hash: req.Hash}, - } - if req.Hash == (common.Hash{}) { - reqData.Origin.Number = req.Number - } - bytes, err := rlp.EncodeToBytes(reqData) - if err != nil { - log.Error("Could not encode header request", "err", err) - return nil - } - minBlock := req.Number - if !req.Reverse { - minBlock = req.Number + req.Length*req.Skip - } - - outreq := proto_sentry.SendMessageByMinBlockRequest{ - MinBlock: minBlock, - Data: &proto_sentry.OutboundMessageData{ - Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_65, - Data: bytes, - }, - } - sentPeers, err1 := cs.sentries[i].SendMessageByMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}) - if err1 != nil { - log.Error("Could not send header request", "err", err1) - return nil + return [64]byte{}, false } if sentPeers == nil || len(sentPeers.Peers) == 0 { continue } - return gointerfaces.ConvertH512ToBytes(sentPeers.Peers[0]) + return ConvertH512ToPeerID(sentPeers.Peers[0]), true } } - return nil + return [64]byte{}, false } -func (cs *ControlServerImpl) randSentryIndex() (int, bool, func() (int, bool)) { +func (cs *MultiClient) randSentryIndex() (int, bool, func() (int, bool)) { var i int if len(cs.sentries) > 1 { i = rand.Intn(len(cs.sentries) - 1) @@ -206,10 +140,10 @@ func (cs *ControlServerImpl) randSentryIndex() (int, bool, func() (int, bool)) { } // sending list of penalties to all sentries -func (cs *ControlServerImpl) Penalize(ctx context.Context, penalties []headerdownload.PenaltyItem) { +func (cs *MultiClient) Penalize(ctx context.Context, penalties []headerdownload.PenaltyItem) { for i := range penalties { outreq := proto_sentry.PenalizePeerRequest{ - PeerId: gointerfaces.ConvertBytesToH512([]byte(penalties[i].PeerID)), + PeerId: gointerfaces.ConvertHashToH512(penalties[i].PeerID), Penalty: proto_sentry.PenaltyKind_Kick, // TODO: Extend penalty kinds } for i, ok, next := cs.randSentryIndex(); ok; i, ok = next() { diff --git a/cmd/sentry/sentry/sentry_grpc_server.go b/cmd/sentry/sentry/sentry_grpc_server.go new file mode 100644 index 00000000000..817972dda60 --- /dev/null +++ b/cmd/sentry/sentry/sentry_grpc_server.go @@ -0,0 +1,1119 @@ +package sentry + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "math" + "math/rand" + "net" + "sort" + "sync" + "sync/atomic" + "syscall" + "time" + + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/dir" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + proto_types "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/debug" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/p2p" + "github.com/ledgerwatch/erigon/p2p/dnsdisc" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/health" + "google.golang.org/grpc/health/grpc_health_v1" + "google.golang.org/protobuf/types/known/emptypb" +) + +const ( + // handshakeTimeout is the maximum allowed time for the `eth` handshake to + // complete before dropping the connection.= as malicious. + handshakeTimeout = 5 * time.Second + maxPermitsPerPeer = 4 // How many outstanding requests per peer we may have +) + +// PeerInfo collects various extra bits of information about the peer, +// for example deadlines that is used for regulating requests sent to the peer +type PeerInfo struct { + peer *p2p.Peer + lock sync.RWMutex + deadlines []time.Time // Request deadlines + height uint64 + rw p2p.MsgReadWriter + + removed chan struct{} // close this channel on remove + ctx context.Context + ctxCancel context.CancelFunc + removeOnce sync.Once + // each peer has own worker (goroutine) - all funcs from this queue will execute on this worker + // if this queue is full (means peer is slow) - old messages will be dropped + // channel closed on peer remove + tasks chan func() +} + +func NewPeerInfo(peer *p2p.Peer, rw p2p.MsgReadWriter) *PeerInfo { + ctx, cancel := context.WithCancel(context.Background()) + + p := &PeerInfo{peer: peer, rw: rw, removed: make(chan struct{}), tasks: make(chan func(), 16), ctx: ctx, ctxCancel: cancel} + go func() { // each peer has own worker, then slow + for f := range p.tasks { + f() + } + }() + return p +} + +func (pi *PeerInfo) ID() [64]byte { + return pi.peer.Pubkey() +} + +// AddDeadline adds given deadline to the list of deadlines +// Deadlines must be added in the chronological order for the function +// ClearDeadlines to work correctly (it uses binary search) +func (pi *PeerInfo) AddDeadline(deadline time.Time) { + pi.lock.Lock() + defer pi.lock.Unlock() + pi.deadlines = append(pi.deadlines, deadline) +} + +func (pi *PeerInfo) Height() uint64 { + return atomic.LoadUint64(&pi.height) +} + +// SetIncreasedHeight atomically updates PeerInfo.height only if newHeight is higher +func (pi *PeerInfo) SetIncreasedHeight(newHeight uint64) { + for { + oldHeight := atomic.LoadUint64(&pi.height) + if oldHeight >= newHeight || atomic.CompareAndSwapUint64(&pi.height, oldHeight, newHeight) { + break + } + } +} + +// ClearDeadlines goes through the deadlines of +// given peers and removes the ones that have passed +// Optionally, it also clears one extra deadline - this is used when response is received +// It returns the number of deadlines left +func (pi *PeerInfo) ClearDeadlines(now time.Time, givePermit bool) int { + pi.lock.Lock() + defer pi.lock.Unlock() + // Look for the first deadline which is not passed yet + firstNotPassed := sort.Search(len(pi.deadlines), func(i int) bool { + return pi.deadlines[i].After(now) + }) + cutOff := firstNotPassed + if cutOff < len(pi.deadlines) && givePermit { + cutOff++ + } + pi.deadlines = pi.deadlines[cutOff:] + return len(pi.deadlines) +} + +func (pi *PeerInfo) Remove() { + pi.lock.Lock() + defer pi.lock.Unlock() + pi.removeOnce.Do(func() { + close(pi.removed) + pi.ctxCancel() + }) +} + +func (pi *PeerInfo) Async(f func()) { + pi.lock.Lock() + defer pi.lock.Unlock() + select { + case <-pi.removed: // noop if peer removed + case <-pi.ctx.Done(): + if pi.tasks != nil { + close(pi.tasks) + pi.tasks = nil + } + case pi.tasks <- f: + if len(pi.tasks) == cap(pi.tasks) { // if channel full - loose old messages + for i := 0; i < cap(pi.tasks)/2; i++ { + select { + case <-pi.tasks: + default: + } + } + log.Debug("slow peer or too many requests, dropping its old requests", "name", pi.peer.Name()) + } + } +} + +func (pi *PeerInfo) Removed() bool { + select { + case <-pi.removed: + return true + default: + return false + } +} + +// ConvertH512ToPeerID() ensures the return type is [64]byte +// so that short variable declarations will still be formatted as hex in logs +func ConvertH512ToPeerID(h512 *proto_types.H512) [64]byte { + return gointerfaces.ConvertH512ToHash(h512) +} + +func makeP2PServer( + p2pConfig p2p.Config, + genesisHash common.Hash, + protocol p2p.Protocol, +) (*p2p.Server, error) { + var urls []string + chainConfig := params.ChainConfigByGenesisHash(genesisHash) + if chainConfig != nil { + urls = params.BootnodeURLsOfChain(chainConfig.ChainName) + } + if len(p2pConfig.BootstrapNodes) == 0 { + bootstrapNodes, err := utils.ParseNodesFromURLs(urls) + if err != nil { + return nil, fmt.Errorf("bad option %s: %w", utils.BootnodesFlag.Name, err) + } + p2pConfig.BootstrapNodes = bootstrapNodes + p2pConfig.BootstrapNodesV5 = bootstrapNodes + } + p2pConfig.Protocols = []p2p.Protocol{protocol} + return &p2p.Server{Config: p2pConfig}, nil +} + +func handShake( + ctx context.Context, + status *proto_sentry.StatusData, + peerID [64]byte, + rw p2p.MsgReadWriter, + version uint, + minVersion uint, + startSync func(bestHash common.Hash) error, +) error { + if status == nil { + return fmt.Errorf("could not get status message from core for peer %s connection", peerID) + } + + // Send out own handshake in a new thread + errc := make(chan error, 2) + + ourTD := gointerfaces.ConvertH256ToUint256Int(status.TotalDifficulty) + // Convert proto status data into the one required by devp2p + genesisHash := gointerfaces.ConvertH256ToHash(status.ForkData.Genesis) + + go func() { + defer debug.LogPanic() + s := ð.StatusPacket{ + ProtocolVersion: uint32(version), + NetworkID: status.NetworkId, + TD: ourTD.ToBig(), + Head: gointerfaces.ConvertH256ToHash(status.BestHash), + Genesis: genesisHash, + ForkID: forkid.NewIDFromForks(status.ForkData.Forks, genesisHash, status.MaxBlock), + } + errc <- p2p.Send(rw, eth.StatusMsg, s) + }() + + go func() { + reply, err := readAndValidatePeerStatusMessage(rw, status, version, minVersion) + + if (err == nil) && (startSync != nil) { + err = startSync(reply.Head) + } + + errc <- err + }() + + timeout := time.NewTimer(handshakeTimeout) + defer timeout.Stop() + for i := 0; i < 2; i++ { + select { + case err := <-errc: + if err != nil { + return err + } + case <-timeout.C: + return p2p.DiscReadTimeout + case <-ctx.Done(): + return ctx.Err() + } + } + + return nil +} + +func runPeer( + ctx context.Context, + peerID [64]byte, + protocol uint, + rw p2p.MsgReadWriter, + peerInfo *PeerInfo, + send func(msgId proto_sentry.MessageId, peerID [64]byte, b []byte), + hasSubscribers func(msgId proto_sentry.MessageId) bool, +) error { + printTime := time.Now().Add(time.Minute) + peerPrinted := false + defer func() { + select { // don't print logs if we stopping + case <-ctx.Done(): + return + default: + } + if peerPrinted { + log.Trace("Peer disconnected", "id", peerID, "name", peerInfo.peer.Fullname()) + } + }() + for { + if !peerPrinted { + if time.Now().After(printTime) { + log.Trace("Peer stable", "id", peerID, "name", peerInfo.peer.Fullname()) + peerPrinted = true + } + } + if err := libcommon.Stopped(ctx.Done()); err != nil { + return err + } + if peerInfo.Removed() { + return fmt.Errorf("peer removed") + } + msg, err := rw.ReadMsg() + if err != nil { + return fmt.Errorf("reading message: %w", err) + } + if msg.Size > eth.ProtocolMaxMsgSize { + msg.Discard() + return fmt.Errorf("message is too large %d, limit %d", msg.Size, eth.ProtocolMaxMsgSize) + } + givePermit := false + switch msg.Code { + case eth.StatusMsg: + msg.Discard() + // Status messages should never arrive after the handshake + return fmt.Errorf("uncontrolled status message") + case eth.GetBlockHeadersMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.BlockHeadersMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + givePermit = true + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.GetBlockBodiesMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.BlockBodiesMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + givePermit = true + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.GetNodeDataMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + //log.Info(fmt.Sprintf("[%s] GetNodeData", peerID)) + case eth.GetReceiptsMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + //log.Info(fmt.Sprintf("[%s] GetReceiptsMsg", peerID)) + case eth.ReceiptsMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + //log.Info(fmt.Sprintf("[%s] ReceiptsMsg", peerID)) + case eth.NewBlockHashesMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.NewBlockMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.NewPooledTransactionHashesMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.GetPooledTransactionsMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.TransactionsMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + case eth.PooledTransactionsMsg: + if !hasSubscribers(eth.ToProto[protocol][msg.Code]) { + continue + } + + b := make([]byte, msg.Size) + if _, err := io.ReadFull(msg.Payload, b); err != nil { + log.Error(fmt.Sprintf("%s: reading msg into bytes: %v", peerID, err)) + } + send(eth.ToProto[protocol][msg.Code], peerID, b) + default: + log.Error(fmt.Sprintf("[%s] Unknown message code: %d", peerID, msg.Code)) + } + msg.Discard() + peerInfo.ClearDeadlines(time.Now(), givePermit) + } +} + +func grpcSentryServer(ctx context.Context, sentryAddr string, ss *GrpcServer, healthCheck bool) (*grpc.Server, error) { + // STARTING GRPC SERVER + log.Info("Starting Sentry gRPC server", "on", sentryAddr) + listenConfig := net.ListenConfig{ + Control: func(network, address string, _ syscall.RawConn) error { + log.Info("Sentry gRPC received connection", "via", network, "from", address) + return nil + }, + } + lis, err := listenConfig.Listen(ctx, "tcp", sentryAddr) + if err != nil { + return nil, fmt.Errorf("could not create Sentry P2P listener: %w, addr=%s", err, sentryAddr) + } + grpcServer := grpcutil.NewServer(100, nil) + proto_sentry.RegisterSentryServer(grpcServer, ss) + var healthServer *health.Server + if healthCheck { + healthServer = health.NewServer() + grpc_health_v1.RegisterHealthServer(grpcServer, healthServer) + } + + go func() { + if healthCheck { + defer healthServer.Shutdown() + } + if err1 := grpcServer.Serve(lis); err1 != nil { + log.Error("Sentry gRPC server fail", "err", err1) + } + }() + return grpcServer, nil +} + +func NewGrpcServer(ctx context.Context, dialCandidates enode.Iterator, readNodeInfo func() *eth.NodeInfo, cfg *p2p.Config, protocol uint) *GrpcServer { + ss := &GrpcServer{ + ctx: ctx, + p2p: cfg, + peersStreams: NewPeersStreams(), + } + + if protocol != eth.ETH66 { + panic(fmt.Errorf("unexpected p2p protocol: %d", protocol)) + } + + ss.Protocol = p2p.Protocol{ + Name: eth.ProtocolName, + Version: protocol, + Length: 17, + DialCandidates: dialCandidates, + Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { + peerID := peer.Pubkey() + if ss.getPeer(peerID) != nil { + log.Trace(fmt.Sprintf("[%s] Peer already has connection", peerID)) + return nil + } + log.Trace(fmt.Sprintf("[%s] Start with peer", peerID)) + + peerInfo := NewPeerInfo(peer, rw) + + defer ss.GoodPeers.Delete(peerID) + err := handShake(ctx, ss.GetStatus(), peerID, rw, protocol, protocol, func(bestHash common.Hash) error { + ss.GoodPeers.Store(peerID, peerInfo) + ss.sendNewPeerToClients(gointerfaces.ConvertHashToH512(peerID)) + return ss.startSync(ctx, bestHash, peerID) + }) + if err != nil { + return fmt.Errorf("handshake to peer %s: %w", peerID, err) + } + log.Trace(fmt.Sprintf("[%s] Received status message OK", peerID), "name", peer.Name()) + + err = runPeer( + ctx, + peerID, + protocol, + rw, + peerInfo, + ss.send, + ss.hasSubscribers, + ) // runPeer never returns a nil error + log.Trace(fmt.Sprintf("[%s] Error while running peer: %v", peerID, err)) + ss.sendGonePeerToClients(gointerfaces.ConvertHashToH512(peerID)) + return nil + }, + NodeInfo: func() interface{} { + return readNodeInfo() + }, + PeerInfo: func(peerID [64]byte) interface{} { + // TODO: remember handshake reply per peer ID and return eth-related Status info (see ethPeerInfo in geth) + return nil + }, + //Attributes: []enr.Entry{eth.CurrentENREntry(chainConfig, genesisHash, headHeight)}, + } + + return ss +} + +// Sentry creates and runs standalone sentry +func Sentry(ctx context.Context, datadir string, sentryAddr string, discoveryDNS []string, cfg *p2p.Config, protocolVersion uint, healthCheck bool) error { + dir.MustExist(datadir) + sentryServer := NewGrpcServer(ctx, nil, func() *eth.NodeInfo { return nil }, cfg, protocolVersion) + sentryServer.discoveryDNS = discoveryDNS + + grpcServer, err := grpcSentryServer(ctx, sentryAddr, sentryServer, healthCheck) + if err != nil { + return err + } + + <-ctx.Done() + grpcServer.GracefulStop() + sentryServer.Close() + return nil +} + +type GrpcServer struct { + proto_sentry.UnimplementedSentryServer + ctx context.Context + Protocol p2p.Protocol + discoveryDNS []string + GoodPeers sync.Map + statusData *proto_sentry.StatusData + P2pServer *p2p.Server + TxSubscribed uint32 // Set to non-zero if downloader is subscribed to transaction messages + lock sync.RWMutex + messageStreams map[proto_sentry.MessageId]map[uint64]chan *proto_sentry.InboundMessage + messagesSubscriberID uint64 + messageStreamsLock sync.RWMutex + peersStreams *PeersStreams + p2p *p2p.Config +} + +func (ss *GrpcServer) rangePeers(f func(peerInfo *PeerInfo) bool) { + ss.GoodPeers.Range(func(key, value interface{}) bool { + peerInfo, _ := value.(*PeerInfo) + if peerInfo == nil { + return true + } + return f(peerInfo) + }) +} + +func (ss *GrpcServer) getPeer(peerID [64]byte) (peerInfo *PeerInfo) { + if value, ok := ss.GoodPeers.Load(peerID); ok { + peerInfo := value.(*PeerInfo) + if peerInfo != nil { + return peerInfo + } + ss.GoodPeers.Delete(peerID) + } + return nil +} + +func (ss *GrpcServer) removePeer(peerID [64]byte) { + if value, ok := ss.GoodPeers.LoadAndDelete(peerID); ok { + peerInfo := value.(*PeerInfo) + if peerInfo != nil { + peerInfo.Remove() + } + } +} + +func (ss *GrpcServer) writePeer(logPrefix string, peerInfo *PeerInfo, msgcode uint64, data []byte, ttl time.Duration) { + peerInfo.Async(func() { + err := peerInfo.rw.WriteMsg(p2p.Msg{Code: msgcode, Size: uint32(len(data)), Payload: bytes.NewReader(data)}) + if err != nil { + peerInfo.Remove() + ss.GoodPeers.Delete(peerInfo.ID()) + if !errors.Is(err, p2p.ErrShuttingDown) { + log.Debug(logPrefix, "msgcode", msgcode, "err", err) + } + } else { + if ttl > 0 { + peerInfo.AddDeadline(time.Now().Add(ttl)) + } + } + }) +} + +func (ss *GrpcServer) startSync(ctx context.Context, bestHash common.Hash, peerID [64]byte) error { + switch ss.Protocol.Version { + case eth.ETH66: + b, err := rlp.EncodeToBytes(ð.GetBlockHeadersPacket66{ + RequestId: rand.Uint64(), + GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ + Amount: 1, + Reverse: false, + Skip: 0, + Origin: eth.HashOrNumber{Hash: bestHash}, + }, + }) + if err != nil { + return fmt.Errorf("startSync encode packet failed: %w", err) + } + if _, err := ss.SendMessageById(ctx, &proto_sentry.SendMessageByIdRequest{ + PeerId: gointerfaces.ConvertHashToH512(peerID), + Data: &proto_sentry.OutboundMessageData{ + Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_66, + Data: b, + }, + }); err != nil { + return err + } + } + return nil +} + +func (ss *GrpcServer) PenalizePeer(_ context.Context, req *proto_sentry.PenalizePeerRequest) (*emptypb.Empty, error) { + //log.Warn("Received penalty", "kind", req.GetPenalty().Descriptor().FullName, "from", fmt.Sprintf("%s", req.GetPeerId())) + peerID := ConvertH512ToPeerID(req.PeerId) + ss.removePeer(peerID) + return &emptypb.Empty{}, nil +} + +func (ss *GrpcServer) PeerMinBlock(_ context.Context, req *proto_sentry.PeerMinBlockRequest) (*emptypb.Empty, error) { + peerID := ConvertH512ToPeerID(req.PeerId) + if peerInfo := ss.getPeer(peerID); peerInfo != nil { + peerInfo.SetIncreasedHeight(req.MinBlock) + } + return &emptypb.Empty{}, nil +} + +func (ss *GrpcServer) findPeer(minBlock uint64) (*PeerInfo, bool) { + // Choose a peer that we can send this request to, with maximum number of permits + var foundPeerInfo *PeerInfo + var maxPermits int + now := time.Now() + ss.rangePeers(func(peerInfo *PeerInfo) bool { + if peerInfo.Height() >= minBlock { + deadlines := peerInfo.ClearDeadlines(now, false /* givePermit */) + //fmt.Printf("%d deadlines for peer %s\n", deadlines, peerID) + if deadlines < maxPermitsPerPeer { + permits := maxPermitsPerPeer - deadlines + if permits > maxPermits { + maxPermits = permits + foundPeerInfo = peerInfo + } + } + } + return true + }) + return foundPeerInfo, maxPermits > 0 +} + +func (ss *GrpcServer) SendMessageByMinBlock(_ context.Context, inreq *proto_sentry.SendMessageByMinBlockRequest) (*proto_sentry.SentPeers, error) { + reply := &proto_sentry.SentPeers{} + msgcode := eth.FromProto[ss.Protocol.Version][inreq.Data.Id] + if msgcode != eth.GetBlockHeadersMsg && + msgcode != eth.GetBlockBodiesMsg && + msgcode != eth.GetPooledTransactionsMsg { + return reply, fmt.Errorf("sendMessageByMinBlock not implemented for message Id: %s", inreq.Data.Id) + } + + var lastErr error + for retry := 0; retry < 16 && len(reply.Peers) == 0; retry++ { // limit number of retries + peerInfo, found := ss.findPeer(inreq.MinBlock) + if !found { + break + } + ss.writePeer("sendMessageByMinBlock", peerInfo, msgcode, inreq.Data.Data, 30*time.Second) + reply.Peers = []*proto_types.H512{gointerfaces.ConvertHashToH512(peerInfo.ID())} + } + return reply, lastErr +} + +func (ss *GrpcServer) SendMessageById(_ context.Context, inreq *proto_sentry.SendMessageByIdRequest) (*proto_sentry.SentPeers, error) { + reply := &proto_sentry.SentPeers{} + msgcode := eth.FromProto[ss.Protocol.Version][inreq.Data.Id] + if msgcode != eth.GetBlockHeadersMsg && + msgcode != eth.BlockHeadersMsg && + msgcode != eth.BlockBodiesMsg && + msgcode != eth.GetReceiptsMsg && + msgcode != eth.ReceiptsMsg && + msgcode != eth.NewPooledTransactionHashesMsg && + msgcode != eth.PooledTransactionsMsg && + msgcode != eth.GetPooledTransactionsMsg { + return reply, fmt.Errorf("sendMessageById not implemented for message Id: %s", inreq.Data.Id) + } + + peerID := ConvertH512ToPeerID(inreq.PeerId) + peerInfo := ss.getPeer(peerID) + if peerInfo == nil { + //TODO: enable after support peer to sentry mapping + //return reply, fmt.Errorf("peer not found: %s", peerID) + return reply, nil + } + + ss.writePeer("sendMessageById", peerInfo, msgcode, inreq.Data.Data, 0) + reply.Peers = []*proto_types.H512{inreq.PeerId} + return reply, nil +} + +func (ss *GrpcServer) SendMessageToRandomPeers(ctx context.Context, req *proto_sentry.SendMessageToRandomPeersRequest) (*proto_sentry.SentPeers, error) { + reply := &proto_sentry.SentPeers{} + + msgcode := eth.FromProto[ss.Protocol.Version][req.Data.Id] + if msgcode != eth.NewBlockMsg && + msgcode != eth.NewBlockHashesMsg && + msgcode != eth.NewPooledTransactionHashesMsg && + msgcode != eth.TransactionsMsg { + return reply, fmt.Errorf("sendMessageToRandomPeers not implemented for message Id: %s", req.Data.Id) + } + + amount := uint64(0) + ss.rangePeers(func(peerInfo *PeerInfo) bool { + amount++ + return true + }) + if req.MaxPeers < amount { + amount = req.MaxPeers + } + + // Send the block to a subset of our peers + sendToAmount := int(math.Sqrt(float64(amount))) + i := 0 + var lastErr error + ss.rangePeers(func(peerInfo *PeerInfo) bool { + ss.writePeer("sendMessageToRandomPeers", peerInfo, msgcode, req.Data.Data, 0) + reply.Peers = append(reply.Peers, gointerfaces.ConvertHashToH512(peerInfo.ID())) + i++ + return i < sendToAmount + }) + return reply, lastErr +} + +func (ss *GrpcServer) SendMessageToAll(ctx context.Context, req *proto_sentry.OutboundMessageData) (*proto_sentry.SentPeers, error) { + reply := &proto_sentry.SentPeers{} + + msgcode := eth.FromProto[ss.Protocol.Version][req.Id] + if msgcode != eth.NewBlockMsg && + msgcode != eth.NewPooledTransactionHashesMsg && // to broadcast new local transactions + msgcode != eth.NewBlockHashesMsg { + return reply, fmt.Errorf("sendMessageToAll not implemented for message Id: %s", req.Id) + } + + var lastErr error + ss.rangePeers(func(peerInfo *PeerInfo) bool { + ss.writePeer("SendMessageToAll", peerInfo, msgcode, req.Data, 0) + reply.Peers = append(reply.Peers, gointerfaces.ConvertHashToH512(peerInfo.ID())) + return true + }) + return reply, lastErr +} + +func (ss *GrpcServer) HandShake(context.Context, *emptypb.Empty) (*proto_sentry.HandShakeReply, error) { + reply := &proto_sentry.HandShakeReply{} + switch ss.Protocol.Version { + case eth.ETH66: + reply.Protocol = proto_sentry.Protocol_ETH66 + } + return reply, nil +} + +func (ss *GrpcServer) SetStatus(ctx context.Context, statusData *proto_sentry.StatusData) (*proto_sentry.SetStatusReply, error) { + genesisHash := gointerfaces.ConvertH256ToHash(statusData.ForkData.Genesis) + + ss.lock.Lock() + defer ss.lock.Unlock() + reply := &proto_sentry.SetStatusReply{} + + if ss.P2pServer == nil { + var err error + if !ss.p2p.NoDiscovery { + if len(ss.discoveryDNS) == 0 { + if url := params.KnownDNSNetwork(genesisHash, "all"); url != "" { + ss.discoveryDNS = []string{url} + } + } + ss.Protocol.DialCandidates, err = setupDiscovery(ss.discoveryDNS) + if err != nil { + return nil, err + } + } + + srv, err := makeP2PServer(*ss.p2p, genesisHash, ss.Protocol) + if err != nil { + return reply, err + } + + // Add protocol + if err = srv.Start(ss.ctx); err != nil { + srv.Stop() + return reply, fmt.Errorf("could not start server: %w", err) + } + + ss.P2pServer = srv + } + + ss.P2pServer.LocalNode().Set(eth.CurrentENREntryFromForks(statusData.ForkData.Forks, genesisHash, statusData.MaxBlock)) + if ss.statusData == nil || statusData.MaxBlock != 0 { + // Not overwrite statusData if the message contains zero MaxBlock (comes from standalone transaction pool) + ss.statusData = statusData + } + return reply, nil +} + +func (ss *GrpcServer) Peers(_ context.Context, _ *emptypb.Empty) (*proto_sentry.PeersReply, error) { + if ss.P2pServer == nil { + return nil, errors.New("p2p server was not started") + } + + peers := ss.P2pServer.PeersInfo() + + var reply proto_sentry.PeersReply + reply.Peers = make([]*proto_types.PeerInfo, 0, len(peers)) + + for _, peer := range peers { + rpcPeer := proto_types.PeerInfo{ + Id: peer.ID, + Name: peer.Name, + Enode: peer.Enode, + Enr: peer.ENR, + Caps: peer.Caps, + ConnLocalAddr: peer.Network.LocalAddress, + ConnRemoteAddr: peer.Network.RemoteAddress, + ConnIsInbound: peer.Network.Inbound, + ConnIsTrusted: peer.Network.Trusted, + ConnIsStatic: peer.Network.Static, + } + reply.Peers = append(reply.Peers, &rpcPeer) + } + + return &reply, nil +} + +func (ss *GrpcServer) SimplePeerCount() (pc int) { + ss.rangePeers(func(peerInfo *PeerInfo) bool { + pc++ + return true + }) + return pc +} + +func (ss *GrpcServer) PeerCount(_ context.Context, req *proto_sentry.PeerCountRequest) (*proto_sentry.PeerCountReply, error) { + return &proto_sentry.PeerCountReply{Count: uint64(ss.SimplePeerCount())}, nil +} + +func (ss *GrpcServer) PeerById(_ context.Context, req *proto_sentry.PeerByIdRequest) (*proto_sentry.PeerByIdReply, error) { + peerID := ConvertH512ToPeerID(req.PeerId) + + var rpcPeer *proto_types.PeerInfo + sentryPeer := ss.getPeer(peerID) + + if sentryPeer != nil { + peer := sentryPeer.peer.Info() + rpcPeer = &proto_types.PeerInfo{ + Id: peer.ID, + Name: peer.Name, + Enode: peer.Enode, + Enr: peer.ENR, + Caps: peer.Caps, + ConnLocalAddr: peer.Network.LocalAddress, + ConnRemoteAddr: peer.Network.RemoteAddress, + ConnIsInbound: peer.Network.Inbound, + ConnIsTrusted: peer.Network.Trusted, + ConnIsStatic: peer.Network.Static, + } + } + + return &proto_sentry.PeerByIdReply{Peer: rpcPeer}, nil +} + +// setupDiscovery creates the node discovery source for the `eth` and `snap` +// protocols. +func setupDiscovery(urls []string) (enode.Iterator, error) { + if len(urls) == 0 { + return nil, nil + } + client := dnsdisc.NewClient(dnsdisc.Config{}) + return client.NewIterator(urls...) +} + +func (ss *GrpcServer) GetStatus() *proto_sentry.StatusData { + ss.lock.RLock() + defer ss.lock.RUnlock() + return ss.statusData +} + +func (ss *GrpcServer) send(msgID proto_sentry.MessageId, peerID [64]byte, b []byte) { + ss.messageStreamsLock.RLock() + defer ss.messageStreamsLock.RUnlock() + req := &proto_sentry.InboundMessage{ + PeerId: gointerfaces.ConvertHashToH512(peerID), + Id: msgID, + Data: b, + } + for i := range ss.messageStreams[msgID] { + ch := ss.messageStreams[msgID][i] + ch <- req + if len(ch) > MessagesQueueSize/2 { + log.Debug("[sentry] consuming is slow, drop 50% of old messages", "msgID", msgID.String()) + // evict old messages from channel + for j := 0; j < MessagesQueueSize/4; j++ { + select { + case <-ch: + default: + } + } + } + } +} + +func (ss *GrpcServer) hasSubscribers(msgID proto_sentry.MessageId) bool { + ss.messageStreamsLock.RLock() + defer ss.messageStreamsLock.RUnlock() + return ss.messageStreams[msgID] != nil && len(ss.messageStreams[msgID]) > 0 + // log.Error("Sending msg to core P2P failed", "msg", proto_sentry.MessageId_name[int32(streamMsg.msgId)], "err", err) +} + +func (ss *GrpcServer) addMessagesStream(ids []proto_sentry.MessageId, ch chan *proto_sentry.InboundMessage) func() { + ss.messageStreamsLock.Lock() + defer ss.messageStreamsLock.Unlock() + if ss.messageStreams == nil { + ss.messageStreams = map[proto_sentry.MessageId]map[uint64]chan *proto_sentry.InboundMessage{} + } + + ss.messagesSubscriberID++ + for _, id := range ids { + m, ok := ss.messageStreams[id] + if !ok { + m = map[uint64]chan *proto_sentry.InboundMessage{} + ss.messageStreams[id] = m + } + m[ss.messagesSubscriberID] = ch + } + + sID := ss.messagesSubscriberID + return func() { + ss.messageStreamsLock.Lock() + defer ss.messageStreamsLock.Unlock() + for _, id := range ids { + delete(ss.messageStreams[id], sID) + } + } +} + +const MessagesQueueSize = 1024 // one such queue per client of .Messages stream +func (ss *GrpcServer) Messages(req *proto_sentry.MessagesRequest, server proto_sentry.Sentry_MessagesServer) error { + log.Trace("[Messages] new subscriber", "to", req.Ids) + ch := make(chan *proto_sentry.InboundMessage, MessagesQueueSize) + defer close(ch) + clean := ss.addMessagesStream(req.Ids, ch) + defer clean() + + for { + select { + case <-ss.ctx.Done(): + return nil + case <-server.Context().Done(): + return nil + case in := <-ch: + if err := server.Send(in); err != nil { + log.Warn("Sending msg to core P2P failed", "msg", in.Id.String(), "err", err) + return err + } + } + } +} + +// Close performs cleanup operations for the sentry +func (ss *GrpcServer) Close() { + if ss.P2pServer != nil { + ss.P2pServer.Stop() + } +} + +func (ss *GrpcServer) sendNewPeerToClients(peerID *proto_types.H512) { + if err := ss.peersStreams.Broadcast(&proto_sentry.PeerEvent{PeerId: peerID, EventId: proto_sentry.PeerEvent_Connect}); err != nil { + log.Warn("Sending new peer notice to core P2P failed", "err", err) + } +} + +func (ss *GrpcServer) sendGonePeerToClients(peerID *proto_types.H512) { + if err := ss.peersStreams.Broadcast(&proto_sentry.PeerEvent{PeerId: peerID, EventId: proto_sentry.PeerEvent_Disconnect}); err != nil { + log.Warn("Sending gone peer notice to core P2P failed", "err", err) + } +} + +func (ss *GrpcServer) PeerEvents(req *proto_sentry.PeerEventsRequest, server proto_sentry.Sentry_PeerEventsServer) error { + clean := ss.peersStreams.Add(server) + defer clean() + select { + case <-ss.ctx.Done(): + return nil + case <-server.Context().Done(): + return nil + } +} + +func (ss *GrpcServer) NodeInfo(_ context.Context, _ *emptypb.Empty) (*proto_types.NodeInfoReply, error) { + if ss.P2pServer == nil { + return nil, errors.New("p2p server was not started") + } + + info := ss.P2pServer.NodeInfo() + ret := &proto_types.NodeInfoReply{ + Id: info.ID, + Name: info.Name, + Enode: info.Enode, + Enr: info.ENR, + Ports: &proto_types.NodeInfoPorts{ + Discovery: uint32(info.Ports.Discovery), + Listener: uint32(info.Ports.Listener), + }, + ListenerAddr: info.ListenAddr, + } + + protos, err := json.Marshal(info.Protocols) + if err != nil { + return nil, fmt.Errorf("cannot encode protocols map: %w", err) + } + + ret.Protocols = protos + return ret, nil +} + +// PeersStreams - it's safe to use this class as non-pointer +type PeersStreams struct { + mu sync.RWMutex + id uint + streams map[uint]proto_sentry.Sentry_PeerEventsServer +} + +func NewPeersStreams() *PeersStreams { + return &PeersStreams{} +} + +func (s *PeersStreams) Add(stream proto_sentry.Sentry_PeerEventsServer) (remove func()) { + s.mu.Lock() + defer s.mu.Unlock() + if s.streams == nil { + s.streams = make(map[uint]proto_sentry.Sentry_PeerEventsServer) + } + s.id++ + id := s.id + s.streams[id] = stream + return func() { s.remove(id) } +} + +func (s *PeersStreams) doBroadcast(reply *proto_sentry.PeerEvent) (ids []uint, errs []error) { + s.mu.RLock() + defer s.mu.RUnlock() + for id, stream := range s.streams { + err := stream.Send(reply) + if err != nil { + select { + case <-stream.Context().Done(): + ids = append(ids, id) + default: + } + errs = append(errs, err) + } + } + return +} + +func (s *PeersStreams) Broadcast(reply *proto_sentry.PeerEvent) (errs []error) { + var ids []uint + ids, errs = s.doBroadcast(reply) + if len(ids) > 0 { + s.mu.Lock() + defer s.mu.Unlock() + } + for _, id := range ids { + delete(s.streams, id) + } + return errs +} + +func (s *PeersStreams) Len() int { + s.mu.RLock() + defer s.mu.RUnlock() + return len(s.streams) +} + +func (s *PeersStreams) remove(id uint) { + s.mu.Lock() + defer s.mu.Unlock() + _, ok := s.streams[id] + if !ok { // double-unsubscribe support + return + } + delete(s.streams, id) +} diff --git a/cmd/sentry/download/sentry_test.go b/cmd/sentry/sentry/sentry_grpc_server_test.go similarity index 67% rename from cmd/sentry/download/sentry_test.go rename to cmd/sentry/sentry/sentry_grpc_server_test.go index d9852573ee8..8cbd567a9e2 100644 --- a/cmd/sentry/download/sentry_test.go +++ b/cmd/sentry/sentry/sentry_grpc_server_test.go @@ -1,4 +1,4 @@ -package download +package sentry import ( "context" @@ -21,8 +21,8 @@ import ( "github.com/stretchr/testify/require" ) -func testSentryServer(db kv.Getter, genesis *core.Genesis, genesisHash common.Hash) *SentryServerImpl { - s := &SentryServerImpl{ +func testSentryServer(db kv.Getter, genesis *core.Genesis, genesisHash common.Hash) *GrpcServer { + s := &GrpcServer{ ctx: context.Background(), } @@ -57,12 +57,11 @@ func testForkIDSplit(t *testing.T, protocol uint) { ctx = context.Background() configNoFork = ¶ms.ChainConfig{HomesteadBlock: big.NewInt(1), ChainID: big.NewInt(1)} configProFork = ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(1), - EIP150Block: big.NewInt(2), - EIP155Block: big.NewInt(2), - EIP158Block: big.NewInt(2), - ByzantiumBlock: big.NewInt(3), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(1), + TangerineWhistleBlock: big.NewInt(2), + SpuriousDragonBlock: big.NewInt(2), + ByzantiumBlock: big.NewInt(3), } dbNoFork = memdb.NewTestDB(t) dbProFork = memdb.NewTestDB(t) @@ -74,7 +73,7 @@ func testForkIDSplit(t *testing.T, protocol uint) { genesisProFork = gspecProFork.MustCommit(dbProFork) ) - var s1, s2 *SentryServerImpl + var s1, s2 *GrpcServer err := dbNoFork.Update(context.Background(), func(tx kv.RwTx) error { s1 = testSentryServer(tx, gspecNoFork, genesisNoFork.Hash()) @@ -93,8 +92,8 @@ func testForkIDSplit(t *testing.T, protocol uint) { defer p2pProFork.Close() errc := make(chan error, 2) - go func() { errc <- handShake(ctx, s1.GetStatus(), "1", p2pNoFork, protocol, protocol, nil) }() - go func() { errc <- handShake(ctx, s2.GetStatus(), "2", p2pProFork, protocol, protocol, nil) }() + go func() { errc <- handShake(ctx, s1.GetStatus(), [64]byte{1}, p2pNoFork, protocol, protocol, nil) }() + go func() { errc <- handShake(ctx, s2.GetStatus(), [64]byte{2}, p2pProFork, protocol, protocol, nil) }() for i := 0; i < 2; i++ { select { @@ -111,8 +110,8 @@ func testForkIDSplit(t *testing.T, protocol uint) { s1.statusData.MaxBlock = 1 s2.statusData.MaxBlock = 1 - go func() { errc <- handShake(ctx, s1.GetStatus(), "1", p2pNoFork, protocol, protocol, nil) }() - go func() { errc <- handShake(ctx, s2.GetStatus(), "2", p2pProFork, protocol, protocol, nil) }() + go func() { errc <- handShake(ctx, s1.GetStatus(), [64]byte{1}, p2pNoFork, protocol, protocol, nil) }() + go func() { errc <- handShake(ctx, s2.GetStatus(), [64]byte{2}, p2pProFork, protocol, protocol, nil) }() for i := 0; i < 2; i++ { select { @@ -130,8 +129,8 @@ func testForkIDSplit(t *testing.T, protocol uint) { s2.statusData.MaxBlock = 2 // Both nodes should allow the other to connect (same genesis, next fork is the same) - go func() { errc <- handShake(ctx, s1.GetStatus(), "1", p2pNoFork, protocol, protocol, nil) }() - go func() { errc <- handShake(ctx, s2.GetStatus(), "2", p2pProFork, protocol, protocol, nil) }() + go func() { errc <- handShake(ctx, s1.GetStatus(), [64]byte{1}, p2pNoFork, protocol, protocol, nil) }() + go func() { errc <- handShake(ctx, s2.GetStatus(), [64]byte{2}, p2pProFork, protocol, protocol, nil) }() var successes int for i := 0; i < 2; i++ { @@ -148,3 +147,32 @@ func testForkIDSplit(t *testing.T, protocol uint) { } } } + +func TestSentryServerImpl_SetStatusInitPanic(t *testing.T) { + defer func() { + if r := recover(); r != nil { + t.Fatalf("panic during server initialization") + } + }() + + configNoFork := ¶ms.ChainConfig{HomesteadBlock: big.NewInt(1), ChainID: big.NewInt(1)} + dbNoFork := memdb.NewTestDB(t) + gspecNoFork := &core.Genesis{Config: configNoFork} + genesisNoFork := gspecNoFork.MustCommit(dbNoFork) + ss := &GrpcServer{p2p: &p2p.Config{}} + + _, err := ss.SetStatus(context.Background(), &proto_sentry.StatusData{ + ForkData: &proto_sentry.Forks{Genesis: gointerfaces.ConvertHashToH256(genesisNoFork.Hash())}, + }) + if err == nil { + t.Fatalf("error expected") + } + + // Should not panic here. + _, err = ss.SetStatus(context.Background(), &proto_sentry.StatusData{ + ForkData: &proto_sentry.Forks{Genesis: gointerfaces.ConvertHashToH256(genesisNoFork.Hash())}, + }) + if err == nil { + t.Fatalf("error expected") + } +} diff --git a/cmd/sentry/sentry/sentry_multi_client.go b/cmd/sentry/sentry/sentry_multi_client.go new file mode 100644 index 00000000000..3b487333da2 --- /dev/null +++ b/cmd/sentry/sentry/sentry_multi_client.go @@ -0,0 +1,739 @@ +package sentry + +import ( + "bytes" + "context" + "encoding/hex" + "errors" + "fmt" + "math/rand" + "sort" + "sync" + "time" + + "github.com/c2h5oh/datasize" + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/common/dbg" + "github.com/ledgerwatch/erigon-lib/direct" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + proto_types "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/ethconfig" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/erigon/turbo/stages/bodydownload" + "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" + "github.com/ledgerwatch/log/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/keepalive" + "google.golang.org/protobuf/types/known/emptypb" +) + +type sentryMessageStream grpc.ClientStream +type sentryMessageStreamFactory func(context.Context, direct.SentryClient) (sentryMessageStream, error) + +// StartStreamLoops starts message processing loops for all sentries. +// The processing happens in several streams: +// RecvMessage - processing incoming headers/bodies +// RecvUploadMessage - sending bodies/receipts - may be heavy, it's ok to not process this messages enough fast, it's also ok to drop some of these messages if we can't process. +// RecvUploadHeadersMessage - sending headers - dedicated stream because headers propagation speed important for network health +// PeerEventsLoop - logging peer connect/disconnect events +func (cs *MultiClient) StartStreamLoops(ctx context.Context) { + sentries := cs.Sentries() + for i := range sentries { + sentry := sentries[i] + go cs.RecvMessageLoop(ctx, sentry, nil) + go cs.RecvUploadMessageLoop(ctx, sentry, nil) + go cs.RecvUploadHeadersMessageLoop(ctx, sentry, nil) + go cs.PeerEventsLoop(ctx, sentry, nil) + } +} + +func (cs *MultiClient) RecvUploadMessageLoop( + ctx context.Context, + sentry direct.SentryClient, + wg *sync.WaitGroup, +) { + ids := []proto_sentry.MessageId{ + eth.ToProto[eth.ETH66][eth.GetBlockBodiesMsg], + eth.ToProto[eth.ETH66][eth.GetReceiptsMsg], + } + streamFactory := func(streamCtx context.Context, sentry direct.SentryClient) (sentryMessageStream, error) { + return sentry.Messages(streamCtx, &proto_sentry.MessagesRequest{Ids: ids}, grpc.WaitForReady(true)) + } + + sentryReconnectAndPumpStreamLoop(ctx, sentry, cs.makeStatusData, "RecvUploadMessage", streamFactory, makeInboundMessage, cs.HandleInboundMessage, wg) +} + +func (cs *MultiClient) RecvUploadHeadersMessageLoop( + ctx context.Context, + sentry direct.SentryClient, + wg *sync.WaitGroup, +) { + ids := []proto_sentry.MessageId{ + eth.ToProto[eth.ETH66][eth.GetBlockHeadersMsg], + } + streamFactory := func(streamCtx context.Context, sentry direct.SentryClient) (sentryMessageStream, error) { + return sentry.Messages(streamCtx, &proto_sentry.MessagesRequest{Ids: ids}, grpc.WaitForReady(true)) + } + + sentryReconnectAndPumpStreamLoop(ctx, sentry, cs.makeStatusData, "RecvUploadHeadersMessage", streamFactory, makeInboundMessage, cs.HandleInboundMessage, wg) +} + +func (cs *MultiClient) RecvMessageLoop( + ctx context.Context, + sentry direct.SentryClient, + wg *sync.WaitGroup, +) { + ids := []proto_sentry.MessageId{ + eth.ToProto[eth.ETH66][eth.BlockHeadersMsg], + eth.ToProto[eth.ETH66][eth.BlockBodiesMsg], + eth.ToProto[eth.ETH66][eth.NewBlockHashesMsg], + eth.ToProto[eth.ETH66][eth.NewBlockMsg], + } + streamFactory := func(streamCtx context.Context, sentry direct.SentryClient) (sentryMessageStream, error) { + return sentry.Messages(streamCtx, &proto_sentry.MessagesRequest{Ids: ids}, grpc.WaitForReady(true)) + } + + sentryReconnectAndPumpStreamLoop(ctx, sentry, cs.makeStatusData, "RecvMessage", streamFactory, makeInboundMessage, cs.HandleInboundMessage, wg) +} + +func (cs *MultiClient) PeerEventsLoop( + ctx context.Context, + sentry direct.SentryClient, + wg *sync.WaitGroup, +) { + streamFactory := func(streamCtx context.Context, sentry direct.SentryClient) (sentryMessageStream, error) { + return sentry.PeerEvents(streamCtx, &proto_sentry.PeerEventsRequest{}, grpc.WaitForReady(true)) + } + messageFactory := func() *proto_sentry.PeerEvent { + return new(proto_sentry.PeerEvent) + } + + sentryReconnectAndPumpStreamLoop(ctx, sentry, cs.makeStatusData, "PeerEvents", streamFactory, messageFactory, cs.HandlePeerEvent, wg) +} + +func sentryReconnectAndPumpStreamLoop[TMessage interface{}]( + ctx context.Context, + sentry direct.SentryClient, + statusDataFactory func() *proto_sentry.StatusData, + streamName string, + streamFactory sentryMessageStreamFactory, + messageFactory func() TMessage, + handleInboundMessage func(context.Context, TMessage, direct.SentryClient) error, + wg *sync.WaitGroup, +) { + for ctx.Err() == nil { + if _, err := sentry.HandShake(ctx, &emptypb.Empty{}, grpc.WaitForReady(true)); err != nil { + if errors.Is(err, context.Canceled) { + continue + } + if grpcutil.IsRetryLater(err) || grpcutil.IsEndOfStream(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("HandShake error, sentry not ready yet", "stream", streamName, "err", err) + time.Sleep(time.Second) + continue + } + + if _, err := sentry.SetStatus(ctx, statusDataFactory()); err != nil { + if errors.Is(err, context.Canceled) { + continue + } + if grpcutil.IsRetryLater(err) || grpcutil.IsEndOfStream(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("Status error, sentry not ready yet", "stream", streamName, "err", err) + time.Sleep(time.Second) + continue + } + + if err := pumpStreamLoop(ctx, sentry, streamName, streamFactory, messageFactory, handleInboundMessage, wg); err != nil { + if errors.Is(err, context.Canceled) { + continue + } + if isPeerNotFoundErr(err) { + continue + } + if grpcutil.IsRetryLater(err) || grpcutil.IsEndOfStream(err) { + time.Sleep(3 * time.Second) + continue + } + log.Warn("pumpStreamLoop failure", "stream", streamName, "err", err) + continue + } + } +} + +// pumpStreamLoop is normally run in a separate go-routine. +// It only exists until there are no more messages +// to be received (end of process, or interruption, or end of test). +// wg is used only in tests to avoid using waits, which is brittle. For non-test code wg == nil. +func pumpStreamLoop[TMessage interface{}]( + ctx context.Context, + sentry direct.SentryClient, + streamName string, + streamFactory sentryMessageStreamFactory, + messageFactory func() TMessage, + handleInboundMessage func(context.Context, TMessage, direct.SentryClient) error, + wg *sync.WaitGroup, +) (err error) { + defer func() { + if rec := recover(); rec != nil { + err = fmt.Errorf("%+v, trace: %s", rec, dbg.Stack()) + } + }() // avoid crash because Erigon's core does many things + + streamCtx, cancel := context.WithCancel(ctx) + defer cancel() + defer sentry.MarkDisconnected() + + // need to read all messages from Sentry as fast as we can, then: + // - can group them or process in batch + // - can have slow processing + reqs := make(chan TMessage, 256) + defer close(reqs) + + go func() { + for req := range reqs { + if err := handleInboundMessage(ctx, req, sentry); err != nil { + log.Warn("Handling incoming message", "stream", streamName, "err", err) + } + if wg != nil { + wg.Done() + } + } + }() + + stream, err := streamFactory(streamCtx, sentry) + if err != nil { + return err + } + + for ctx.Err() == nil { + req := messageFactory() + err := stream.RecvMsg(req) + if err != nil { + return err + } + + select { + case reqs <- req: + case <-ctx.Done(): + } + } + + return ctx.Err() +} + +// MultiClient - does handle request/response/subscriptions to multiple sentries +// each sentry may support same or different p2p protocol +type MultiClient struct { + lock sync.RWMutex + Hd *headerdownload.HeaderDownload + Bd *bodydownload.BodyDownload + nodeName string + sentries []direct.SentryClient + headHeight uint64 + headHash common.Hash + headTd *uint256.Int + ChainConfig *params.ChainConfig + forks []uint64 + genesisHash common.Hash + networkId uint64 + db kv.RwDB + Engine consensus.Engine + blockReader services.HeaderAndCanonicalReader + logPeerInfo bool +} + +func NewMultiClient( + db kv.RwDB, + nodeName string, + chainConfig *params.ChainConfig, + genesisHash common.Hash, + engine consensus.Engine, + networkID uint64, + sentries []direct.SentryClient, + syncCfg ethconfig.Sync, + blockReader services.HeaderAndCanonicalReader, + logPeerInfo bool, +) (*MultiClient, error) { + hd := headerdownload.NewHeaderDownload( + 512, /* anchorLimit */ + 1024*1024, /* linkLimit */ + engine, + blockReader, + ) + + if err := hd.RecoverFromDb(db); err != nil { + return nil, fmt.Errorf("recovery from DB failed: %w", err) + } + bd := bodydownload.NewBodyDownload(syncCfg.BlockDownloaderWindow /* outstandingLimit */, engine) + + cs := &MultiClient{ + nodeName: nodeName, + Hd: hd, + Bd: bd, + sentries: sentries, + db: db, + Engine: engine, + blockReader: blockReader, + logPeerInfo: logPeerInfo, + } + cs.ChainConfig = chainConfig + cs.forks = forkid.GatherForks(cs.ChainConfig) + cs.genesisHash = genesisHash + cs.networkId = networkID + var err error + err = db.View(context.Background(), func(tx kv.Tx) error { + cs.headHeight, cs.headHash, cs.headTd, err = cs.Bd.UpdateFromDb(tx) + return err + }) + return cs, err +} + +func (cs *MultiClient) Sentries() []direct.SentryClient { return cs.sentries } + +func (cs *MultiClient) newBlockHashes66(ctx context.Context, req *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + if !cs.Hd.RequestChaining() && !cs.Hd.FetchingNew() { + return nil + } + //log.Info(fmt.Sprintf("NewBlockHashes from [%s]", ConvertH256ToPeerID(req.PeerId))) + var request eth.NewBlockHashesPacket + if err := rlp.DecodeBytes(req.Data, &request); err != nil { + return fmt.Errorf("decode NewBlockHashes66: %w", err) + } + for _, announce := range request { + cs.Hd.SaveExternalAnnounce(announce.Hash) + if cs.Hd.HasLink(announce.Hash) { + continue + } + //log.Info(fmt.Sprintf("Sending header request {hash: %x, height: %d, length: %d}", announce.Hash, announce.Number, 1)) + b, err := rlp.EncodeToBytes(ð.GetBlockHeadersPacket66{ + RequestId: rand.Uint64(), + GetBlockHeadersPacket: ð.GetBlockHeadersPacket{ + Amount: 1, + Reverse: false, + Skip: 0, + Origin: eth.HashOrNumber{Hash: announce.Hash}, + }, + }) + if err != nil { + return fmt.Errorf("encode header request: %w", err) + } + outreq := proto_sentry.SendMessageByIdRequest{ + PeerId: req.PeerId, + Data: &proto_sentry.OutboundMessageData{ + Id: proto_sentry.MessageId_GET_BLOCK_HEADERS_66, + Data: b, + }, + } + + if _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}); err != nil { + if isPeerNotFoundErr(err) { + continue + } + return fmt.Errorf("send header request: %w", err) + } + } + return nil +} + +func (cs *MultiClient) blockHeaders66(ctx context.Context, in *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + // Parse the entire packet from scratch + var pkt eth.BlockHeadersPacket66 + if err := rlp.DecodeBytes(in.Data, &pkt); err != nil { + return fmt.Errorf("decode 1 BlockHeadersPacket66: %w", err) + } + + // Prepare to extract raw headers from the block + rlpStream := rlp.NewStream(bytes.NewReader(in.Data), uint64(len(in.Data))) + if _, err := rlpStream.List(); err != nil { // Now stream is at the beginning of 66 object + return fmt.Errorf("decode 1 BlockHeadersPacket66: %w", err) + } + if _, err := rlpStream.Uint(); err != nil { // Now stream is at the requestID field + return fmt.Errorf("decode 2 BlockHeadersPacket66: %w", err) + } + // Now stream is at the BlockHeadersPacket, which is list of headers + + return cs.blockHeaders(ctx, pkt.BlockHeadersPacket, rlpStream, in.PeerId, sentry) +} + +func (cs *MultiClient) blockHeaders(ctx context.Context, pkt eth.BlockHeadersPacket, rlpStream *rlp.Stream, peerID *proto_types.H512, sentry direct.SentryClient) error { + // Stream is at the BlockHeadersPacket, which is list of headers + if _, err := rlpStream.List(); err != nil { + return fmt.Errorf("decode 2 BlockHeadersPacket66: %w", err) + } + // Extract headers from the block + var highestBlock uint64 + csHeaders := make([]headerdownload.ChainSegmentHeader, 0, len(pkt)) + for _, header := range pkt { + headerRaw, err := rlpStream.Raw() + if err != nil { + return fmt.Errorf("decode 3 BlockHeadersPacket66: %w", err) + } + number := header.Number.Uint64() + if number > highestBlock { + highestBlock = number + } + csHeaders = append(csHeaders, headerdownload.ChainSegmentHeader{ + Header: header, + HeaderRaw: headerRaw, + Hash: types.RawRlpHash(headerRaw), + Number: number, + }) + } + if cs.Hd.POSSync() { + sort.Sort(headerdownload.HeadersReverseSort(csHeaders)) // Sorting by reverse order of block heights + tx, err := cs.db.BeginRo(ctx) + defer tx.Rollback() + if err != nil { + return err + } + penalties, err := cs.Hd.ProcessHeadersPOS(csHeaders, tx, ConvertH512ToPeerID(peerID)) + if err != nil { + return err + } + if len(penalties) > 0 { + cs.Penalize(ctx, penalties) + } + } else { + sort.Sort(headerdownload.HeadersSort(csHeaders)) // Sorting by order of block heights + canRequestMore := cs.Hd.ProcessHeaders(csHeaders, false /* newBlock */, ConvertH512ToPeerID(peerID)) + + if canRequestMore { + currentTime := uint64(time.Now().Unix()) + req, penalties := cs.Hd.RequestMoreHeaders(currentTime) + if req != nil { + if _, sentToPeer := cs.SendHeaderRequest(ctx, req); sentToPeer { + // If request was actually sent to a peer, we update retry time to be 5 seconds in the future + cs.Hd.UpdateRetryTime(req, currentTime, 5 /* timeout */) + log.Trace("Sent request", "height", req.Number) + cs.Hd.UpdateStats(req, false /* skeleton */) + } + } + if len(penalties) > 0 { + cs.Penalize(ctx, penalties) + } + } + } + outreq := proto_sentry.PeerMinBlockRequest{ + PeerId: peerID, + MinBlock: highestBlock, + } + if _, err1 := sentry.PeerMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { + log.Error("Could not send min block for peer", "err", err1) + } + return nil +} + +func (cs *MultiClient) newBlock66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + // Extract header from the block + rlpStream := rlp.NewStream(bytes.NewReader(inreq.Data), uint64(len(inreq.Data))) + _, err := rlpStream.List() // Now stream is at the beginning of the block record + if err != nil { + return fmt.Errorf("decode 1 NewBlockMsg: %w", err) + } + _, err = rlpStream.List() // Now stream is at the beginning of the header + if err != nil { + return fmt.Errorf("decode 2 NewBlockMsg: %w", err) + } + var headerRaw []byte + if headerRaw, err = rlpStream.Raw(); err != nil { + return fmt.Errorf("decode 3 NewBlockMsg: %w", err) + } + // Parse the entire request from scratch + request := ð.NewBlockPacket{} + if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { + return fmt.Errorf("decode 4 NewBlockMsg: %w", err) + } + if err := request.SanityCheck(); err != nil { + return fmt.Errorf("newBlock66: %w", err) + } + + if segments, penalty, err := cs.Hd.SingleHeaderAsSegment(headerRaw, request.Block.Header(), true /* penalizePoSBlocks */); err == nil { + if penalty == headerdownload.NoPenalty { + cs.Hd.ProcessHeaders(segments, true /* newBlock */, ConvertH512ToPeerID(inreq.PeerId)) // There is only one segment in this case + } else { + outreq := proto_sentry.PenalizePeerRequest{ + PeerId: inreq.PeerId, + Penalty: proto_sentry.PenaltyKind_Kick, // TODO: Extend penalty kinds + } + for _, sentry := range cs.sentries { + if !sentry.Ready() { + continue + } + if _, err1 := sentry.PenalizePeer(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { + log.Error("Could not send penalty", "err", err1) + } + } + } + } else { + return fmt.Errorf("singleHeaderAsSegment failed: %w", err) + } + cs.Bd.AddToPrefetch(request.Block) + outreq := proto_sentry.PeerMinBlockRequest{ + PeerId: inreq.PeerId, + MinBlock: request.Block.NumberU64(), + } + if _, err1 := sentry.PeerMinBlock(ctx, &outreq, &grpc.EmptyCallOption{}); err1 != nil { + log.Error("Could not send min block for peer", "err", err1) + } + log.Trace(fmt.Sprintf("NewBlockMsg{blockNumber: %d} from [%s]", request.Block.NumberU64(), ConvertH512ToPeerID(inreq.PeerId))) + return nil +} + +func (cs *MultiClient) blockBodies66(inreq *proto_sentry.InboundMessage, _ direct.SentryClient) error { + var request eth.BlockRawBodiesPacket66 + if err := rlp.DecodeBytes(inreq.Data, &request); err != nil { + return fmt.Errorf("decode BlockBodiesPacket66: %w", err) + } + txs, uncles := request.BlockRawBodiesPacket.Unpack() + cs.Bd.DeliverBodies(txs, uncles, uint64(len(inreq.Data)), ConvertH512ToPeerID(inreq.PeerId)) + return nil +} + +func (cs *MultiClient) receipts66(_ context.Context, _ *proto_sentry.InboundMessage, _ direct.SentryClient) error { + return nil +} + +func (cs *MultiClient) getBlockHeaders66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + var query eth.GetBlockHeadersPacket66 + if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { + return fmt.Errorf("decoding getBlockHeaders66: %w, data: %x", err, inreq.Data) + } + + var headers []*types.Header + if err := cs.db.View(ctx, func(tx kv.Tx) (err error) { + headers, err = eth.AnswerGetBlockHeadersQuery(tx, query.GetBlockHeadersPacket, cs.blockReader) + if err != nil { + return err + } + return nil + }); err != nil { + return fmt.Errorf("querying BlockHeaders: %w", err) + } + b, err := rlp.EncodeToBytes(ð.BlockHeadersPacket66{ + RequestId: query.RequestId, + BlockHeadersPacket: headers, + }) + if err != nil { + return fmt.Errorf("encode header response: %w", err) + } + outreq := proto_sentry.SendMessageByIdRequest{ + PeerId: inreq.PeerId, + Data: &proto_sentry.OutboundMessageData{ + Id: proto_sentry.MessageId_BLOCK_HEADERS_66, + Data: b, + }, + } + _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) + if err != nil { + if !isPeerNotFoundErr(err) { + return fmt.Errorf("send header response 66: %w", err) + } + return fmt.Errorf("send header response 66: %w", err) + } + //log.Info(fmt.Sprintf("[%s] GetBlockHeaderMsg{hash=%x, number=%d, amount=%d, skip=%d, reverse=%t, responseLen=%d}", ConvertH512ToPeerID(inreq.PeerId), query.Origin.Hash, query.Origin.Number, query.Amount, query.Skip, query.Reverse, len(b))) + return nil +} + +func (cs *MultiClient) getBlockBodies66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + var query eth.GetBlockBodiesPacket66 + if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { + return fmt.Errorf("decoding getBlockBodies66: %w, data: %x", err, inreq.Data) + } + tx, err := cs.db.BeginRo(ctx) + if err != nil { + return err + } + defer tx.Rollback() + response := eth.AnswerGetBlockBodiesQuery(tx, query.GetBlockBodiesPacket) + tx.Rollback() + b, err := rlp.EncodeToBytes(ð.BlockBodiesRLPPacket66{ + RequestId: query.RequestId, + BlockBodiesRLPPacket: response, + }) + if err != nil { + return fmt.Errorf("encode header response: %w", err) + } + outreq := proto_sentry.SendMessageByIdRequest{ + PeerId: inreq.PeerId, + Data: &proto_sentry.OutboundMessageData{ + Id: proto_sentry.MessageId_BLOCK_BODIES_66, + Data: b, + }, + } + _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) + if err != nil { + if isPeerNotFoundErr(err) { + return nil + } + return fmt.Errorf("send bodies response: %w", err) + } + //log.Info(fmt.Sprintf("[%s] GetBlockBodiesMsg responseLen %d", ConvertH512ToPeerID(inreq.PeerId), len(b))) + return nil +} + +func (cs *MultiClient) getReceipts66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + var query eth.GetReceiptsPacket66 + if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { + return fmt.Errorf("decoding getReceipts66: %w, data: %x", err, inreq.Data) + } + tx, err := cs.db.BeginRo(ctx) + if err != nil { + return err + } + defer tx.Rollback() + receipts, err := eth.AnswerGetReceiptsQuery(tx, query.GetReceiptsPacket) + if err != nil { + return err + } + tx.Rollback() + b, err := rlp.EncodeToBytes(ð.ReceiptsRLPPacket66{ + RequestId: query.RequestId, + ReceiptsRLPPacket: receipts, + }) + if err != nil { + return fmt.Errorf("encode header response: %w", err) + } + outreq := proto_sentry.SendMessageByIdRequest{ + PeerId: inreq.PeerId, + Data: &proto_sentry.OutboundMessageData{ + Id: proto_sentry.MessageId_RECEIPTS_66, + Data: b, + }, + } + _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) + if err != nil { + if isPeerNotFoundErr(err) { + return nil + } + return fmt.Errorf("send bodies response: %w", err) + } + //log.Info(fmt.Sprintf("[%s] GetReceipts responseLen %d", ConvertH512ToPeerID(inreq.PeerId), len(b))) + return nil +} + +func makeInboundMessage() *proto_sentry.InboundMessage { + return new(proto_sentry.InboundMessage) +} + +func (cs *MultiClient) HandleInboundMessage(ctx context.Context, message *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + err := cs.handleInboundMessage(ctx, message, sentry) + + if (err != nil) && rlp.IsInvalidRLPError(err) { + log.Debug("Kick peer for invalid RLP", "err", err) + penalizeRequest := proto_sentry.PenalizePeerRequest{ + PeerId: message.PeerId, + Penalty: proto_sentry.PenaltyKind_Kick, // TODO: Extend penalty kinds + } + if _, err1 := sentry.PenalizePeer(ctx, &penalizeRequest, &grpc.EmptyCallOption{}); err1 != nil { + log.Error("Could not send penalty", "err", err1) + } + } + + return err +} + +func (cs *MultiClient) handleInboundMessage(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry direct.SentryClient) error { + switch inreq.Id { + // ========= eth 66 ========== + + case proto_sentry.MessageId_NEW_BLOCK_HASHES_66: + return cs.newBlockHashes66(ctx, inreq, sentry) + case proto_sentry.MessageId_BLOCK_HEADERS_66: + return cs.blockHeaders66(ctx, inreq, sentry) + case proto_sentry.MessageId_NEW_BLOCK_66: + return cs.newBlock66(ctx, inreq, sentry) + case proto_sentry.MessageId_BLOCK_BODIES_66: + return cs.blockBodies66(inreq, sentry) + case proto_sentry.MessageId_GET_BLOCK_HEADERS_66: + return cs.getBlockHeaders66(ctx, inreq, sentry) + case proto_sentry.MessageId_GET_BLOCK_BODIES_66: + return cs.getBlockBodies66(ctx, inreq, sentry) + case proto_sentry.MessageId_RECEIPTS_66: + return cs.receipts66(ctx, inreq, sentry) + case proto_sentry.MessageId_GET_RECEIPTS_66: + return cs.getReceipts66(ctx, inreq, sentry) + default: + return fmt.Errorf("not implemented for message Id: %s", inreq.Id) + } +} + +func (cs *MultiClient) HandlePeerEvent(ctx context.Context, event *proto_sentry.PeerEvent, sentry direct.SentryClient) error { + eventID := event.EventId.String() + peerID := ConvertH512ToPeerID(event.PeerId) + peerIDStr := hex.EncodeToString(peerID[:]) + + if !cs.logPeerInfo { + log.Debug(fmt.Sprintf("Sentry peer did %s", eventID), "peer", peerIDStr) + return nil + } + + var nodeURL string + var clientID string + var capabilities []string + if event.EventId == proto_sentry.PeerEvent_Connect { + reply, err := sentry.PeerById(ctx, &proto_sentry.PeerByIdRequest{PeerId: event.PeerId}) + if err != nil { + log.Debug("sentry.PeerById failed", "err", err) + } + if (reply != nil) && (reply.Peer != nil) { + nodeURL = reply.Peer.Enode + clientID = reply.Peer.Name + capabilities = reply.Peer.Caps + } + } + + log.Debug(fmt.Sprintf("Sentry peer did %s", eventID), "peer", peerIDStr, + "nodeURL", nodeURL, "clientID", clientID, "capabilities", capabilities) + return nil +} + +func (cs *MultiClient) makeStatusData() *proto_sentry.StatusData { + s := cs + return &proto_sentry.StatusData{ + NetworkId: s.networkId, + TotalDifficulty: gointerfaces.ConvertUint256IntToH256(s.headTd), + BestHash: gointerfaces.ConvertHashToH256(s.headHash), + MaxBlock: s.headHeight, + ForkData: &proto_sentry.Forks{ + Genesis: gointerfaces.ConvertHashToH256(s.genesisHash), + Forks: s.forks, + }, + } +} + +func GrpcClient(ctx context.Context, sentryAddr string) (*direct.SentryClientRemote, error) { + // creating grpc client connection + var dialOpts []grpc.DialOption + + backoffCfg := backoff.DefaultConfig + backoffCfg.BaseDelay = 500 * time.Millisecond + backoffCfg.MaxDelay = 10 * time.Second + dialOpts = []grpc.DialOption{ + grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoffCfg, MinConnectTimeout: 10 * time.Minute}), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(int(16 * datasize.MB))), + grpc.WithKeepaliveParams(keepalive.ClientParameters{}), + } + + dialOpts = append(dialOpts, grpc.WithInsecure()) + conn, err := grpc.DialContext(ctx, sentryAddr, dialOpts...) + if err != nil { + return nil, fmt.Errorf("creating client connection to sentry P2P: %w", err) + } + return direct.NewSentryClientRemote(proto_sentry.NewSentryClient(conn)), nil +} diff --git a/cmd/snapshots/debug/debug_test.go b/cmd/snapshots/debug/debug_test.go deleted file mode 100644 index cb5e510e49d..00000000000 --- a/cmd/snapshots/debug/debug_test.go +++ /dev/null @@ -1,375 +0,0 @@ -package debug - -import ( - "context" - "encoding/binary" - "fmt" - "os" - "testing" - "time" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/consensus/ethash" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/core/types/accounts" - "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" -) - -const ( - AccountDiff = "accdiff" - StorageDiff = "stdiff" - ContractDiff = "contractdiff" - Deleted = "it is deleted" -) - -func WithBlock(block uint64, key []byte) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, block) - return append(b, key...) -} -func TestMatreshkaStream(t *testing.T) { - t.Skip() - chaindataDir := "/media/b00ris/nvme/fresh_sync/tg/chaindata" - tmpDbDir := "/home/b00ris/event_stream" - - chaindata, err := mdbx.Open(chaindataDir, log.New(), true) - if err != nil { - t.Fatal(err) - } - //tmpDb:=ethdb.NewMemDatabase() - os.RemoveAll(tmpDbDir) - - db, err := mdbx.NewMDBX(log.New()).Path(tmpDbDir).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - defaultBuckets[AccountDiff] = kv.TableCfgItem{} - defaultBuckets[StorageDiff] = kv.TableCfgItem{} - defaultBuckets[ContractDiff] = kv.TableCfgItem{} - return defaultBuckets - }).Open() - if err != nil { - t.Fatal(err) - } - - chainConfig, _, genesisErr := core.CommitGenesisBlock(db, core.DefaultGenesisBlock()) - if genesisErr != nil { - t.Fatal(err) - } - if err := db.Update(context.Background(), func(tx kv.RwTx) error { - return tx.ClearBucket(kv.HeadHeaderKey) - }); err != nil { - t.Fatal(err) - } - - snkv := snapshotdb.NewSnapshotKV().DB(db). - //broken - //SnapshotDB([]string{dbutils.Headers, dbutils.HeaderCanonical, dbutils.HeaderTD, dbutils.HeaderNumber, dbutils.BlockBody, dbutils.HeadHeaderKey, dbutils.Senders}, chaindata.RwDB()). - Open() - _ = chaindata - defer snkv.Close() - - tx, err := snkv.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - // - //tx, err := db.Begin(context.Background(), ethdb.RW) - //if err != nil { - // t.Fatal(err) - //} - psCursor, err := tx.Cursor(kv.PlainState) - if err != nil { - t.Fatal(err) - } - - i := 5 - err = ethdb.Walk(psCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - fmt.Println(common.Bytes2Hex(k)) - i-- - if i == 0 { - return false, nil - } - return true, nil - }) - if err != nil { - t.Fatal(err) - } - - currentBlock := rawdb.ReadCurrentHeader(tx) - fmt.Println("currentBlock", currentBlock.Number.Uint64()) - blockNum := uint64(1) - limit := currentBlock.Number.Uint64() - getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } - - stateReaderWriter := NewDebugReaderWriter(state.NewPlainStateReader(tx), state.NewPlainStateWriter(tx, tx, blockNum)) - tt := time.Now() - ttt := time.Now() - for currentBlock := blockNum; currentBlock < blockNum+limit; currentBlock++ { - stateReaderWriter.UpdateWriter(state.NewPlainStateWriter(tx, tx, currentBlock)) - block, err := rawdb.ReadBlockByNumber(tx, currentBlock) - if err != nil { - t.Fatal(err, currentBlock) - } - - checkTEVM := ethdb.GetCheckTEVM(tx) - - _, err = core.ExecuteBlockEphemerally(chainConfig, &vm.Config{NoReceipts: true}, getHeader, ethash.NewFaker(), block, stateReaderWriter, stateReaderWriter, nil, nil, checkTEVM) - if err != nil { - t.Fatal(err, currentBlock) - } - cs := stateReaderWriter.UpdatedAccouts() - accDiffLen := len(cs) - for i := range cs { - if len(cs[i].Value) == 0 { - cs[i].Value = []byte(Deleted) - } - err = tx.Put(AccountDiff, WithBlock(currentBlock, cs[i].Key), cs[i].Value) - if err != nil { - t.Fatal(err, cs[i].Key, currentBlock) - } - } - cs = stateReaderWriter.UpdatedStorage() - stDiffLen := len(cs) - for i := range cs { - if len(cs[i].Value) == 0 { - cs[i].Value = []byte(Deleted) - } - err = tx.Put(StorageDiff, WithBlock(currentBlock, cs[i].Key), cs[i].Value) - if err != nil { - t.Fatal(err, cs[i].Key, currentBlock) - } - } - cs = stateReaderWriter.UpdatedCodes() - codesDiffLen := len(cs) - for i := range cs { - if len(cs[i].Value) == 0 { - cs[i].Value = []byte(Deleted) - } - err = tx.Put(ContractDiff, WithBlock(currentBlock, cs[i].Key), cs[i].Value) - if err != nil { - t.Fatal(err, cs[i].Key, currentBlock) - } - } - - stateReaderWriter.Reset() - if currentBlock%10000 == 0 { - err = tx.Commit() - if err != nil { - t.Fatal(err, currentBlock) - } - tx, err = snkv.BeginRw(context.Background()) - if err != nil { - t.Fatal(err, currentBlock) - } - defer tx.Rollback() - - dr := time.Since(ttt) - fmt.Println(currentBlock, "finished", "acc-", accDiffLen, "st-", stDiffLen, "codes - ", codesDiffLen, "all -", time.Since(tt), "chunk - ", dr, "blocks/s", 10000/dr.Seconds()) - ttt = time.Now() - } - } - err = tx.Commit() - if err != nil { - t.Fatal(err) - } - - fmt.Println("End") - //spew.Dump("readAcc",len(stateReaderWriter.readAcc)) - //spew.Dump("readStr",len(stateReaderWriter.readStorage)) - //spew.Dump("createdContracts", len(stateReaderWriter.createdContracts)) - //spew.Dump("deleted",len(stateReaderWriter.deletedAcc)) - -} - -var _ state.StateReader = &DebugReaderWriter{} -var _ state.WriterWithChangeSets = &DebugReaderWriter{} - -func NewDebugReaderWriter(r state.StateReader, w state.WriterWithChangeSets) *DebugReaderWriter { - return &DebugReaderWriter{ - r: r, - w: w, - //readAcc: make(map[common.Address]struct{}), - //readStorage: make(map[string]struct{}), - //readCodes: make(map[common.Hash]struct{}), - //readIncarnations: make(map[common.Address]struct{}), - - updatedAcc: make(map[common.Address][]byte), - updatedStorage: make(map[string][]byte), - updatedCodes: make(map[common.Hash][]byte), - //deletedAcc: make(map[common.Address]struct{}), - //createdContracts: make(map[common.Address]struct{}), - - } -} - -type DebugReaderWriter struct { - r state.StateReader - w state.WriterWithChangeSets - //readAcc map[common.Address]struct{} - //readStorage map[string]struct{} - //readCodes map[common.Hash] struct{} - //readIncarnations map[common.Address] struct{} - updatedAcc map[common.Address][]byte - updatedStorage map[string][]byte - updatedCodes map[common.Hash][]byte - //deletedAcc map[common.Address]struct{} - //createdContracts map[common.Address]struct{} -} - -func (d *DebugReaderWriter) Reset() { - d.updatedAcc = map[common.Address][]byte{} - d.updatedStorage = map[string][]byte{} - d.updatedCodes = map[common.Hash][]byte{} -} -func (d *DebugReaderWriter) UpdateWriter(w state.WriterWithChangeSets) { - d.w = w -} - -func (d *DebugReaderWriter) ReadAccountData(address common.Address) (*accounts.Account, error) { - //d.readAcc[address] = struct{}{} - return d.r.ReadAccountData(address) -} - -func (d *DebugReaderWriter) ReadAccountStorage(address common.Address, incarnation uint64, key *common.Hash) ([]byte, error) { - //d.readStorage[string(dbutils.PlainGenerateCompositeStorageKey(address.Bytes(),incarnation, key.Bytes()))] = struct{}{} - return d.r.ReadAccountStorage(address, incarnation, key) -} - -func (d *DebugReaderWriter) ReadAccountCode(address common.Address, incarnation uint64, codeHash common.Hash) ([]byte, error) { - //d.readCodes[codeHash] = struct{}{} - return d.r.ReadAccountCode(address, incarnation, codeHash) -} - -func (d *DebugReaderWriter) ReadAccountCodeSize(address common.Address, incarnation uint64, codeHash common.Hash) (int, error) { - return d.r.ReadAccountCodeSize(address, incarnation, codeHash) -} - -func (d *DebugReaderWriter) ReadAccountIncarnation(address common.Address) (uint64, error) { - //d.readIncarnations[address] = struct{}{} - return d.r.ReadAccountIncarnation(address) -} - -func (d *DebugReaderWriter) WriteChangeSets() error { - return d.w.WriteChangeSets() -} - -func (d *DebugReaderWriter) WriteHistory() error { - return d.w.WriteHistory() -} - -func (d *DebugReaderWriter) UpdateAccountData(address common.Address, original, account *accounts.Account) error { - b, err := rlp.EncodeToBytes(account) - if err != nil { - return err - } - d.updatedAcc[address] = b - return d.w.UpdateAccountData(address, original, account) -} - -func (d *DebugReaderWriter) UpdateAccountCode(address common.Address, incarnation uint64, codeHash common.Hash, code []byte) error { - d.updatedCodes[codeHash] = code - return d.w.UpdateAccountCode(address, incarnation, codeHash, code) -} - -func (d *DebugReaderWriter) DeleteAccount(address common.Address, original *accounts.Account) error { - d.updatedAcc[address] = nil - //d.deletedAcc[address]= struct{}{} - return d.w.DeleteAccount(address, original) -} - -func (d *DebugReaderWriter) WriteAccountStorage(address common.Address, incarnation uint64, key *common.Hash, original, value *uint256.Int) error { - d.updatedStorage[string(dbutils.PlainGenerateCompositeStorageKey(address.Bytes(), incarnation, key.Bytes()))] = value.Bytes() - return d.w.WriteAccountStorage(address, incarnation, key, original, value) -} - -func (d *DebugReaderWriter) CreateContract(address common.Address) error { - //d.createdContracts[address] = struct{}{} - return d.w.CreateContract(address) -} - -type Change struct { - Key []byte - Value []byte -} - -func (d *DebugReaderWriter) UpdatedAccouts() []Change { - ch := make([]Change, 0, len(d.updatedAcc)) - for k, v := range d.updatedAcc { - ch = append(ch, Change{ - Key: common.CopyBytes(k.Bytes()), - Value: common.CopyBytes(v), - }) - } - return ch -} -func (d *DebugReaderWriter) UpdatedStorage() []Change { - ch := make([]Change, 0, len(d.updatedStorage)) - for k, v := range d.updatedStorage { - ch = append(ch, Change{ - Key: common.CopyBytes([]byte(k)), - Value: common.CopyBytes(v), - }) - } - return ch - -} -func (d *DebugReaderWriter) UpdatedCodes() []Change { - ch := make([]Change, 0, len(d.updatedCodes)) - for k, v := range d.updatedCodes { - ch = append(ch, Change{ - Key: common.CopyBytes(k.Bytes()), - Value: common.CopyBytes(v), - }) - } - return ch -} - -//func (d *DebugReaderWriter) AllAccounts() map[common.Address]struct{} { -// accs:=make(map[common.Address]struct{}) -// for i:=range d.readAcc { -// accs[i]=struct{}{} -// } -// for i:=range d.updatedAcc { -// accs[i]=struct{}{} -// } -// for i:=range d.readIncarnations { -// accs[i]=struct{}{} -// } -// for i:=range d.deletedAcc { -// accs[i]=struct{}{} -// } -// for i:=range d.createdContracts { -// accs[i]=struct{}{} -// } -// return accs -//} -//func (d *DebugReaderWriter) AllStorage() map[string]struct{} { -// st:=make(map[string]struct{}) -// for i:=range d.readStorage { -// st[i]=struct{}{} -// } -// for i:=range d.updatedStorage { -// st[i]=struct{}{} -// } -// return st -//} -//func (d *DebugReaderWriter) AllCodes() map[common.Hash]struct{} { -// c:=make(map[common.Hash]struct{}) -// for i:=range d.readCodes { -// c[i]=struct{}{} -// } -// for i:=range d.updatedCodes { -// c[i]=struct{}{} -// } -// return c -//} diff --git a/cmd/snapshots/downloader/commands/root.go b/cmd/snapshots/downloader/commands/root.go deleted file mode 100644 index eaf659270d6..00000000000 --- a/cmd/snapshots/downloader/commands/root.go +++ /dev/null @@ -1,199 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "net" - "os" - "os/signal" - "runtime" - "syscall" - "time" - - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" - grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" - "github.com/urfave/cli" - "google.golang.org/grpc" - "google.golang.org/grpc/keepalive" -) - -func init() { - flags := append(debug.Flags, utils.MetricFlags...) - flags = append(flags, PreDownloadMainnetFlag, Addr, Dir, HttpApi) - utils.CobraFlags(rootCmd, flags) - - rootCmd.PersistentFlags().Bool("seeding", true, "Seed snapshots") -} - -var ( - Addr = cli.StringFlag{ - Name: "addr", - Usage: "external downloader api network address, for example: 127.0.0.1:9191 serves remote downloader interface", - Value: "127.0.0.1:9191", - } - Dir = cli.StringFlag{ - Name: "dir", - Usage: "directory to store snapshots", - Value: os.TempDir(), - } - PreDownloadMainnetFlag = cli.BoolFlag{ - Name: "predownload.mainnet", - Usage: "add all available mainnet snapshots for seeding", - } - HttpApi = cli.BoolFlag{ - Name: "http", - Usage: "Enable http", - } -) - -type Config struct { - Addr string - Dir string - Seeding bool -} - -func Execute() { - if err := rootCmd.ExecuteContext(rootContext()); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func rootContext() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - ch := make(chan os.Signal, 1) - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case <-ch: - log.Info("Got interrupt, shutting down...") - case <-ctx.Done(): - } - - cancel() - }() - return ctx -} - -var rootCmd = &cobra.Command{ - Use: "", - Short: "run snapshot downloader", - Example: "go run ./cmd/snapshots/downloader/main.go --dir /tmp --addr 127.0.0.1:9191 --predownload.mainnet", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if err := debug.SetupCobra(cmd); err != nil { - panic(err) - } - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - debug.Exit() - }, - RunE: runDownloader, -} - -func runDownloader(cmd *cobra.Command, args []string) error { - cfg := &Config{} - var err error - cfg.Addr, err = cmd.Flags().GetString(Addr.Name) - if err != nil { - return err - } - cfg.Dir, err = cmd.Flags().GetString(Dir.Name) - if err != nil { - return err - } - cfg.Seeding, err = cmd.Flags().GetBool("seeding") - if err != nil { - return err - } - log.Info("Run snapshot downloader", "addr", cfg.Addr, "dir", cfg.Dir, "seeding", cfg.Seeding) - lis, err := net.Listen("tcp", cfg.Addr) - if err != nil { - return fmt.Errorf("failed to listen: %w", err) - } - var opts []grpc.ServerOption - var ( - streamInterceptors []grpc.StreamServerInterceptor - unaryInterceptors []grpc.UnaryServerInterceptor - ) - streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) - unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) - - cpus := uint32(runtime.GOMAXPROCS(-1)) - opts = []grpc.ServerOption{ - grpc.NumStreamWorkers(cpus), - grpc.KeepaliveParams(keepalive.ServerParameters{ - Time: 10 * time.Minute, - }), - grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(streamInterceptors...)), - grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(unaryInterceptors...)), - } - grpcServer := grpc.NewServer(opts...) - bittorrentServer, err := snapshotsync.NewServer(cfg.Dir, cfg.Seeding) - if err != nil { - return fmt.Errorf("new server: %w", err) - } - log.Info("Load") - err = bittorrentServer.Load() - if err != nil { - return fmt.Errorf("load: %w", err) - } - - mainNetPreDownload, err := cmd.Flags().GetBool(PreDownloadMainnetFlag.Name) - if err != nil { - return fmt.Errorf("get bool: %w", err) - } - if mainNetPreDownload { - log.Info("Predownload mainnet snapshots") - go func() { - _, err := bittorrentServer.Download(context.Background(), &snapshotsync.DownloadSnapshotRequest{ - NetworkId: params.MainnetChainConfig.ChainID.Uint64(), - Type: snapshotsync.GetAvailableSnapshotTypes(params.MainnetChainConfig.ChainID.Uint64()), - }) - if err != nil { - log.Error("Predownload failed", "err", err, "networkID", params.MainnetChainConfig.ChainID.Uint64()) - } - }() - } - go func() { - for { - select { - case <-cmd.Context().Done(): - return - default: - } - - snapshots, err := bittorrentServer.Snapshots(context.Background(), &snapshotsync.SnapshotsRequest{ - NetworkId: params.MainnetChainConfig.ChainID.Uint64(), - }) - if err != nil { - log.Error("get snapshots", "err", err) - time.Sleep(time.Minute) - continue - } - stats := bittorrentServer.Stats(context.Background()) - for _, v := range snapshots.Info { - log.Info("Snapshot "+v.Type.String(), "%", v.Readiness, "peers", stats[v.Type.String()].ConnectedSeeders) - } - time.Sleep(time.Minute) - } - }() - snapshotsync.RegisterDownloaderServer(grpcServer, bittorrentServer) - go func() { - log.Info("Starting grpc") - err := grpcServer.Serve(lis) - if err != nil { - log.Error("Stop", "err", err) - } - }() - <-cmd.Context().Done() - return nil - -} diff --git a/cmd/snapshots/downloader/main.go b/cmd/snapshots/downloader/main.go deleted file mode 100644 index e3f4fbd9240..00000000000 --- a/cmd/snapshots/downloader/main.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import ( - "github.com/ledgerwatch/erigon/cmd/snapshots/downloader/commands" -) - -func main() { - commands.Execute() -} diff --git a/cmd/snapshots/generator/commands/copy_from_state.go b/cmd/snapshots/generator/commands/copy_from_state.go deleted file mode 100644 index d2274ad816f..00000000000 --- a/cmd/snapshots/generator/commands/copy_from_state.go +++ /dev/null @@ -1,128 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "os" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - withDatadir(copyFromStateSnapshotCmd) - withSnapshotFile(copyFromStateSnapshotCmd) - withBlock(copyFromStateSnapshotCmd) - rootCmd.AddCommand(copyFromStateSnapshotCmd) - -} - -//go run cmd/snapshots/generator/main.go state_copy --block 11000000 --snapshot /media/b00ris/nvme/snapshots/state --datadir /media/b00ris/nvme/backup/snapshotsync/ &> /media/b00ris/nvme/copy.log -var copyFromStateSnapshotCmd = &cobra.Command{ - Use: "state_copy", - Short: "Copy from state snapshot", - Example: "go run cmd/snapshots/generator/main.go state_copy --block 11000000 --snapshot /media/b00ris/nvme/snapshots/state --datadir /media/b00ris/nvme/backup/snapshotsync", - RunE: func(cmd *cobra.Command, args []string) error { - return CopyFromState(cmd.Context(), log.New(), chaindata, snapshotFile, block, snapshotDir, snapshotMode) - }, -} - -func CopyFromState(ctx context.Context, logger log.Logger, dbpath string, snapshotPath string, block uint64, snapshotDir, snapshotMode string) error { - db, err := mdbx.Open(dbpath, logger, true) - if err != nil { - return err - } - defer db.Close() - - tx, err := db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - - err = os.RemoveAll(snapshotPath) - if err != nil { - return err - } - snkv := mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.PlainState: kv.ChaindataTablesCfg[kv.PlainState], - kv.PlainContractCode: kv.ChaindataTablesCfg[kv.PlainContractCode], - kv.Code: kv.ChaindataTablesCfg[kv.Code], - } - }).Path(snapshotPath).MustOpen() - log.Info("Create snapshot db", "path", snapshotPath) - - logEvery := time.NewTicker(30 * time.Second) - defer logEvery.Stop() - - tt := time.Now() - if err = snkv.Update(ctx, func(snTx kv.RwTx) error { - return tx.ForEach(kv.PlainState, []byte{}, func(k, v []byte) error { - innerErr := snTx.Put(kv.PlainState, k, v) - if innerErr != nil { - return fmt.Errorf("put state err: %w", innerErr) - } - select { - case <-logEvery.C: - log.Info("progress", "bucket", kv.PlainState, "key", fmt.Sprintf("%x", k)) - default: - } - - return nil - }) - }); err != nil { - return err - } - log.Info("Copy state", "batch", "t", time.Since(tt)) - - log.Info("Copy plain state end", "t", time.Since(tt)) - tt = time.Now() - if err = snkv.Update(ctx, func(sntx kv.RwTx) error { - return tx.ForEach(kv.PlainContractCode, []byte{}, func(k, v []byte) error { - innerErr := sntx.Put(kv.PlainContractCode, k, v) - if innerErr != nil { - return fmt.Errorf("put contract code err: %w", innerErr) - } - select { - case <-logEvery.C: - log.Info("progress", "bucket", kv.PlainContractCode, "key", fmt.Sprintf("%x", k)) - default: - } - return nil - }) - }); err != nil { - return err - } - log.Info("Copy contract code end", "t", time.Since(tt)) - - tt = time.Now() - if err = snkv.Update(ctx, func(sntx kv.RwTx) error { - return tx.ForEach(kv.Code, []byte{}, func(k, v []byte) error { - innerErr := sntx.Put(kv.Code, k, v) - if innerErr != nil { - return fmt.Errorf("put code err: %w", innerErr) - } - select { - case <-logEvery.C: - log.Info("progress", "bucket", kv.Code, "key", fmt.Sprintf("%x", k)) - default: - } - return nil - }) - }); err != nil { - return err - } - log.Info("Copy code", "t", time.Since(tt)) - - db.Close() - snkv.Close() - tt = time.Now() - defer func() { - log.Info("Verify end", "t", time.Since(tt)) - }() - return VerifyStateSnapshot(ctx, logger, dbpath, snapshotPath, block) -} diff --git a/cmd/snapshots/generator/commands/generate_body_snapshot.go b/cmd/snapshots/generator/commands/generate_body_snapshot.go deleted file mode 100644 index 194acebfce4..00000000000 --- a/cmd/snapshots/generator/commands/generate_body_snapshot.go +++ /dev/null @@ -1,88 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "os" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/spf13/cobra" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/log/v3" -) - -func init() { - withDatadir(generateBodiesSnapshotCmd) - withSnapshotFile(generateBodiesSnapshotCmd) - withBlock(generateBodiesSnapshotCmd) - rootCmd.AddCommand(generateBodiesSnapshotCmd) - -} - -var generateBodiesSnapshotCmd = &cobra.Command{ - Use: "bodies", - Short: "Generate bodies snapshot", - Example: "go run cmd/snapshots/generator/main.go bodies --block 11000000 --datadir /media/b00ris/nvme/snapshotsync/ --snapshotDir /media/b00ris/nvme/snapshotsync/tg/snapshots/ --snapshotMode \"hb\" --snapshot /media/b00ris/nvme/snapshots/bodies_test", - RunE: func(cmd *cobra.Command, args []string) error { - return BodySnapshot(cmd.Context(), log.New(), chaindata, snapshotFile, block, snapshotDir, snapshotMode) - }, -} - -func BodySnapshot(ctx context.Context, logger log.Logger, dbPath, snapshotPath string, toBlock uint64, snapshotDir string, snapshotMode string) error { - db := kv2.NewMDBX(logger).Path(dbPath).MustOpen() - snKV := kv2.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.BlockBody: kv.TableCfgItem{}, - } - }).Path(snapshotPath).MustOpen() - - tx, err := db.BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - logEvery := time.NewTicker(30 * time.Second) - defer logEvery.Stop() - - t := time.Now() - var hash common.Hash - if err := snKV.Update(ctx, func(sntx kv.RwTx) error { - for i := uint64(1); i <= toBlock; i++ { - if common.IsCanceled(ctx) { - return common.ErrStopped - } - - hash, err = rawdb.ReadCanonicalHash(tx, i) - if err != nil { - return fmt.Errorf("getting canonical hash for block %d: %v", i, err) - } - body := rawdb.ReadBodyRLP(tx, hash, i) - if err = sntx.Put(kv.BlockBody, dbutils.BlockBodyKey(i, hash), body); err != nil { - return err - } - select { - case <-logEvery.C: - log.Info("progress", "bucket", kv.BlockBody, "block num", i) - default: - } - } - return nil - }); err != nil { - return err - } - snKV.Close() - err = os.Remove(snapshotPath + "/mdbx.lck") - if err != nil { - log.Warn("Remove lock", "err", err) - return err - } - - log.Info("Finished", "duration", time.Since(t)) - return nil -} diff --git a/cmd/snapshots/generator/commands/generate_header_snapshot.go b/cmd/snapshots/generator/commands/generate_header_snapshot.go deleted file mode 100644 index fd3b85d6701..00000000000 --- a/cmd/snapshots/generator/commands/generate_header_snapshot.go +++ /dev/null @@ -1,107 +0,0 @@ -package commands - -import ( - "context" - "errors" - "fmt" - "os" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/spf13/cobra" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/log/v3" -) - -func init() { - withDatadir(generateHeadersSnapshotCmd) - withSnapshotFile(generateHeadersSnapshotCmd) - withBlock(generateHeadersSnapshotCmd) - - rootCmd.AddCommand(generateHeadersSnapshotCmd) -} - -var generateHeadersSnapshotCmd = &cobra.Command{ - Use: "headers", - Short: "Generate headers snapshot", - Example: "go run cmd/snapshots/generator/main.go headers --block 11000000 --datadir /media/b00ris/nvme/snapshotsync/ --snapshotDir /media/b00ris/nvme/snapshotsync/tg/snapshots/ --snapshotMode \"hb\" --snapshot /media/b00ris/nvme/snapshots/headers_test", - RunE: func(cmd *cobra.Command, args []string) error { - return HeaderSnapshot(cmd.Context(), log.New(), chaindata, snapshotFile, block, snapshotDir, snapshotMode) - }, -} - -func HeaderSnapshot(ctx context.Context, logger log.Logger, dbPath, snapshotPath string, toBlock uint64, snapshotDir string, snapshotMode string) error { - if snapshotPath == "" { - return errors.New("empty snapshot path") - } - err := os.RemoveAll(snapshotPath) - if err != nil { - return err - } - db := kv2.NewMDBX(logger).Path(dbPath).MustOpen() - - snKV := kv2.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.Headers: kv.TableCfgItem{}, - } - }).Path(snapshotPath).MustOpen() - - tx, err := db.BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - snTx, err := snKV.BeginRw(context.Background()) - if err != nil { - return err - } - defer snTx.Rollback() - - t := time.Now() - var hash common.Hash - var header []byte - c, err := snTx.RwCursor(kv.Headers) - if err != nil { - return err - } - defer c.Close() - for i := uint64(1); i <= toBlock; i++ { - if common.IsCanceled(ctx) { - return common.ErrStopped - } - - hash, err = rawdb.ReadCanonicalHash(tx, i) - if err != nil { - return fmt.Errorf("getting canonical hash for block %d: %v", i, err) - } - header = rawdb.ReadHeaderRLP(tx, hash, i) - if len(header) == 0 { - return fmt.Errorf("empty header: %v", i) - } - if err = c.Append(dbutils.HeaderKey(i, hash), header); err != nil { - return err - } - if i%1000 == 0 { - log.Info("Committed", "block", i) - } - } - - if err = snTx.Commit(); err != nil { - return err - } - - snKV.Close() - - err = os.Remove(snapshotPath + "/lock.mdb") - if err != nil { - log.Warn("Remove lock", "err", err) - return err - } - log.Info("Finished", "duration", time.Since(t)) - - return nil -} diff --git a/cmd/snapshots/generator/commands/generate_state_snapshot.go b/cmd/snapshots/generator/commands/generate_state_snapshot.go deleted file mode 100644 index 45490e8c475..00000000000 --- a/cmd/snapshots/generator/commands/generate_state_snapshot.go +++ /dev/null @@ -1,163 +0,0 @@ -package commands - -import ( - "context" - "errors" - "fmt" - "os" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types/accounts" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/turbo/trie" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - withDatadir(generateStateSnapshotCmd) - withSnapshotFile(generateStateSnapshotCmd) - withBlock(generateStateSnapshotCmd) - rootCmd.AddCommand(generateStateSnapshotCmd) - -} - -//go run cmd/snapshots/generator/main.go state_copy --block 11000000 --snapshot /media/b00ris/nvme/snapshots/state --datadir /media/b00ris/nvme/backup/snapshotsync &> /media/b00ris/nvme/copy.log -var generateStateSnapshotCmd = &cobra.Command{ - Use: "state", - Short: "Generate state snapshot", - Example: "go run ./cmd/state/main.go stateSnapshot --block 11000000 --datadir /media/b00ris/nvme/tgstaged/ --snapshot /media/b00ris/nvme/snapshots/state", - RunE: func(cmd *cobra.Command, args []string) error { - return GenerateStateSnapshot(cmd.Context(), log.New(), chaindata, snapshotFile, block, snapshotDir, snapshotMode) - }, -} - -func GenerateStateSnapshot(ctx context.Context, logger log.Logger, dbPath, snapshotPath string, toBlock uint64, snapshotDir string, snapshotMode string) error { - if snapshotPath == "" { - return errors.New("empty snapshot path") - } - - err := os.RemoveAll(snapshotPath) - if err != nil { - return err - } - var db, snkv kv.RwDB - - db = kv2.NewMDBX(logger).Path(dbPath).MustOpen() - snkv = kv2.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.PlainState: kv.TableCfgItem{}, - kv.PlainContractCode: kv.TableCfgItem{}, - kv.Code: kv.TableCfgItem{}, - } - }).Path(snapshotPath).MustOpen() - - writeTx, err := snkv.BeginRw(ctx) - if err != nil { - return err - } - defer writeTx.Rollback() - - tx, err := db.BeginRo(context.Background()) - if err != nil { - return err - } - tx2, err := db.BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - i := 0 - t := time.Now() - tt := time.Now() - commitEvery := time.NewTicker(30 * time.Second) - defer commitEvery.Stop() - - err = state.WalkAsOfAccounts(tx, common.Address{}, toBlock+1, func(k []byte, v []byte) (bool, error) { - i++ - if i%100000 == 0 { - fmt.Println(i, common.Bytes2Hex(k), "batch", time.Since(tt)) - tt = time.Now() - select { - case <-ctx.Done(): - return false, errors.New("interrupted") - default: - } - } - if len(k) != 20 { - return true, nil - } - - var acc accounts.Account - if err = acc.DecodeForStorage(v); err != nil { - return false, fmt.Errorf("decoding %x for %x: %v", v, k, err) - } - - if acc.Incarnation > 0 { - storagePrefix := dbutils.PlainGenerateStoragePrefix(k, acc.Incarnation) - if acc.IsEmptyRoot() { - t := trie.New(common.Hash{}) - j := 0 - innerErr := state.WalkAsOfStorage(tx2, common.BytesToAddress(k), acc.Incarnation, common.Hash{}, toBlock+1, func(k1, k2 []byte, vv []byte) (bool, error) { - j++ - innerErr1 := writeTx.Put(kv.PlainState, dbutils.PlainGenerateCompositeStorageKey(k1, acc.Incarnation, k2), common.CopyBytes(vv)) - if innerErr1 != nil { - return false, innerErr1 - } - - h, _ := common.HashData(k1) - t.Update(h.Bytes(), common.CopyBytes(vv)) - - return true, nil - }) - if innerErr != nil { - return false, innerErr - } - acc.Root = t.Hash() - } - - if acc.IsEmptyCodeHash() { - codeHash, err1 := tx2.GetOne(kv.PlainContractCode, storagePrefix) - if err1 != nil && errors.Is(err1, ethdb.ErrKeyNotFound) { - return false, fmt.Errorf("getting code hash for %x: %v", k, err1) - } - if len(codeHash) > 0 { - code, err1 := tx2.GetOne(kv.Code, codeHash) - if err1 != nil { - return false, err1 - } - if err1 = writeTx.Put(kv.Code, codeHash, code); err1 != nil { - return false, err1 - } - if err1 = writeTx.Put(kv.PlainContractCode, storagePrefix, codeHash); err1 != nil { - return false, err1 - } - } - } - } - newAcc := make([]byte, acc.EncodingLengthForStorage()) - acc.EncodeForStorage(newAcc) - innerErr := writeTx.Put(kv.PlainState, common.CopyBytes(k), newAcc) - if innerErr != nil { - return false, innerErr - } - - return true, nil - }) - if err != nil { - return err - } - err = writeTx.Commit() - if err != nil { - return err - } - fmt.Println("took", time.Since(t)) - - return VerifyStateSnapshot(ctx, logger, dbPath, snapshotFile, block) -} diff --git a/cmd/snapshots/generator/commands/metainfo_hash.go b/cmd/snapshots/generator/commands/metainfo_hash.go deleted file mode 100644 index 81efd1b2f9c..00000000000 --- a/cmd/snapshots/generator/commands/metainfo_hash.go +++ /dev/null @@ -1,46 +0,0 @@ -package commands - -import ( - "errors" - "fmt" - "time" - - "github.com/anacrolix/torrent/bencode" - "github.com/anacrolix/torrent/metainfo" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/spf13/cobra" -) - -func init() { - rootCmd.AddCommand(snapshotMetainfoCmd) -} - -func PrintMetaInfoHash(path string) error { - t := time.Now() - mi := metainfo.MetaInfo{} - info, err := snapshotsync.BuildInfoBytesForSnapshot(path, snapshotsync.MdbxFilename) - if err != nil { - return err - } - mi.InfoBytes, err = bencode.Marshal(info) - if err != nil { - return err - } - - fmt.Println("infohash:", mi.HashInfoBytes().String()) - fmt.Println("infobytes:", common.Bytes2Hex(mi.InfoBytes)) - fmt.Println("It took", time.Since(t)) - return nil -} - -var snapshotMetainfoCmd = &cobra.Command{ - Use: "snapshotMetainfo", - Short: "Calculate snapshot metainfo", - RunE: func(cmd *cobra.Command, args []string) error { - if len(args) == 0 { - return errors.New("empty path") - } - return PrintMetaInfoHash(args[0]) - }, -} diff --git a/cmd/snapshots/generator/commands/root.go b/cmd/snapshots/generator/commands/root.go deleted file mode 100644 index 273106e21d1..00000000000 --- a/cmd/snapshots/generator/commands/root.go +++ /dev/null @@ -1,96 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "os" - "os/signal" - "path" - "syscall" - - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common/paths" - "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) - -} -func Execute() { - if err := rootCmd.ExecuteContext(rootContext()); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func rootContext() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - ch := make(chan os.Signal, 1) - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case <-ch: - log.Info("Got interrupt, shutting down...") - case <-ctx.Done(): - } - - cancel() - }() - return ctx -} - -var ( - datadir string - chaindata string - snapshotFile string - block uint64 - snapshotDir string - snapshotMode string -) - -var rootCmd = &cobra.Command{ - Use: "generate_snapshot", - Short: "generate snapshot", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if err := debug.SetupCobra(cmd); err != nil { - panic(err) - } - if chaindata == "" { - chaindata = path.Join(datadir, "erigon", "chaindata") - } - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - debug.Exit() - }, -} - -func must(err error) { - if err != nil { - panic(err) - } -} - -func withBlock(cmd *cobra.Command) { - cmd.Flags().Uint64Var(&block, "block", 1, "specifies a block number for operation") -} - -func withDatadir(cmd *cobra.Command) { - cmd.Flags().StringVar(&datadir, "datadir", paths.DefaultDataDir(), "data directory for temporary ELT files") - must(cmd.MarkFlagDirname("datadir")) - - cmd.Flags().StringVar(&chaindata, "chaindata", "", "path to the db") - must(cmd.MarkFlagDirname("chaindata")) - - cmd.Flags().StringVar(&snapshotMode, "snapshot.mode", "", "set of snapshots to use") - cmd.Flags().StringVar(&snapshotDir, "snapshot.dir", "", "snapshot dir") - must(cmd.MarkFlagDirname("snapshot.dir")) -} - -func withSnapshotFile(cmd *cobra.Command) { - cmd.Flags().StringVar(&snapshotFile, "snapshot", "", "path where to write the snapshot file") -} diff --git a/cmd/snapshots/generator/commands/verify_headers.go b/cmd/snapshots/generator/commands/verify_headers.go deleted file mode 100644 index 07043204bdf..00000000000 --- a/cmd/snapshots/generator/commands/verify_headers.go +++ /dev/null @@ -1,109 +0,0 @@ -package commands - -import ( - "context" - "errors" - "sync/atomic" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - withSnapshotFile(verifyHeadersSnapshotCmd) - withBlock(verifyHeadersSnapshotCmd) - rootCmd.AddCommand(verifyHeadersSnapshotCmd) - -} - -//go run cmd/snapshots/generator/main.go state_copy --block 11000000 --snapshot /media/b00ris/nvme/snapshots/state -var verifyHeadersSnapshotCmd = &cobra.Command{ - Use: "verify_headers", - Short: "Copy from state snapshot", - Example: "go run cmd/snapshots/generator/main.go verify_headers --block 11000000 --snapshot /media/b00ris/nvme/snapshots/state", - RunE: func(cmd *cobra.Command, args []string) error { - return VerifyHeadersSnapshot(cmd.Context(), snapshotFile) - }, -} - -func VerifyHeadersSnapshot(ctx context.Context, snapshotPath string) error { - tt := time.Now() - log.Info("Start validation") - var prevHeader *types.Header - var lastHeader uint64 - - go func() { - for { - select { - case <-ctx.Done(): - return - default: - log.Info("Verifying", "t", time.Since(tt), "block", atomic.LoadUint64(&lastHeader)) - } - time.Sleep(time.Second * 10) - } - }() - snKV, err := snapshotsync.OpenHeadersSnapshot(snapshotPath) - if err != nil { - return err - } - err = snKV.View(ctx, func(tx kv.Tx) error { - c, err := tx.Cursor(kv.Headers) - if err != nil { - return err - } - k, v, innerErr := c.First() - for { - if len(k) == 0 && len(v) == 0 { - break - } - if innerErr != nil { - return innerErr - } - - header := new(types.Header) - innerErr := rlp.DecodeBytes(v, header) - if innerErr != nil { - return innerErr - } - - if prevHeader != nil { - if prevHeader.Number.Uint64()+1 != header.Number.Uint64() { - log.Error("invalid header number", "p", prevHeader.Number.Uint64(), "c", header.Number.Uint64()) - return errors.New("invalid header number") - } - if prevHeader.Hash() != header.ParentHash { - log.Error("invalid parent hash", "p", prevHeader.Hash(), "c", header.ParentHash) - return errors.New("invalid parent hash") - } - } - k, v, innerErr = c.Next() - if innerErr != nil { - return innerErr - } - - prevHeader = header - - atomic.StoreUint64(&lastHeader, header.Number.Uint64()) - } - if innerErr != nil { - return innerErr - } - return nil - }) - if err != nil { - return err - } - if block != 0 { - if lastHeader != block { - return errors.New("incorrect last block") - } - } - log.Info("Success", "t", time.Since(tt)) - return nil -} diff --git a/cmd/snapshots/generator/commands/verify_state_snapshot.go b/cmd/snapshots/generator/commands/verify_state_snapshot.go deleted file mode 100644 index fa3d0ffc922..00000000000 --- a/cmd/snapshots/generator/commands/verify_state_snapshot.go +++ /dev/null @@ -1,84 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "io/ioutil" - "os" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/eth/stagedsync" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - withDatadir(verifyStateSnapshotCmd) - withSnapshotFile(verifyStateSnapshotCmd) - withBlock(verifyStateSnapshotCmd) - - rootCmd.AddCommand(verifyStateSnapshotCmd) -} - -// -var verifyStateSnapshotCmd = &cobra.Command{ - Use: "verify_state", - Short: "Verify state snapshot", - Example: "go run cmd/snapshots/generator/main.go verify_state --block 11000000 --snapshot /media/b00ris/nvme/snapshots/state/ --datadir /media/b00ris/nvme/backup/snapshotsync/", - RunE: func(cmd *cobra.Command, args []string) error { - logger := log.New() - return VerifyStateSnapshot(cmd.Context(), logger, chaindata, snapshotFile, block) - }, -} - -func VerifyStateSnapshot(ctx context.Context, logger log.Logger, dbPath, snapshotPath string, block uint64) error { - var snkv, tmpDB kv.RwDB - tmpPath, err := ioutil.TempDir(os.TempDir(), "vrf*") - if err != nil { - return err - } - - snkv = mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.PlainState: kv.ChaindataTablesCfg[kv.PlainState], - kv.PlainContractCode: kv.ChaindataTablesCfg[kv.PlainContractCode], - kv.Code: kv.ChaindataTablesCfg[kv.Code], - } - }).Path(snapshotPath).Readonly().MustOpen() - tmpDB = mdbx.NewMDBX(logger).Path(tmpPath).MustOpen() - - defer os.RemoveAll(tmpPath) - defer tmpDB.Close() - snkv = snapshotdb.NewSnapshotKV().StateSnapshot(snkv).DB(tmpDB).Open() - tx, err := snkv.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - hash, err := rawdb.ReadCanonicalHash(tx, block) - if err != nil { - return err - } - - syncHeadHeader := rawdb.ReadHeader(tx, hash, block) - if syncHeadHeader == nil { - return fmt.Errorf("empty header") - } - expectedRootHash := syncHeadHeader.Root - tt := time.Now() - err = stagedsync.PromoteHashedStateCleanly("", tx, stagedsync.StageHashStateCfg(snkv, os.TempDir()), ctx.Done()) - fmt.Println("Promote took", time.Since(tt)) - if err != nil { - return fmt.Errorf("promote state err: %w", err) - } - - _, err = stagedsync.RegenerateIntermediateHashes("", tx, stagedsync.StageTrieCfg(snkv, true, true, os.TempDir()), expectedRootHash, ctx.Done()) - if err != nil { - return fmt.Errorf("regenerateIntermediateHashes err: %w", err) - } - return nil -} diff --git a/cmd/snapshots/generator/main.go b/cmd/snapshots/generator/main.go deleted file mode 100644 index 18e7ad6ff42..00000000000 --- a/cmd/snapshots/generator/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "github.com/ledgerwatch/erigon/cmd/snapshots/generator/commands" - -func main() { - commands.Execute() -} diff --git a/cmd/snapshots/seeder/commands/root.go b/cmd/snapshots/seeder/commands/root.go deleted file mode 100644 index eb65cd03c6f..00000000000 --- a/cmd/snapshots/seeder/commands/root.go +++ /dev/null @@ -1,61 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "os" - "os/signal" - "syscall" - - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) -} - -func Execute() { - if err := rootCmd.ExecuteContext(rootContext()); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func rootContext() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - ch := make(chan os.Signal, 1) - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case <-ch: - log.Info("Got interrupt, shutting down...") - case <-ctx.Done(): - } - - cancel() - }() - return ctx -} - -var rootCmd = &cobra.Command{ - Use: "seed", - Short: "seed snapshot", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if err := debug.SetupCobra(cmd); err != nil { - panic(err) - } - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - debug.Exit() - }, - Args: cobra.ExactArgs(1), - ArgAliases: []string{"snapshots dir"}, - RunE: func(cmd *cobra.Command, args []string) error { - return Seed(cmd.Context(), args[0]) - }, -} diff --git a/cmd/snapshots/seeder/commands/seeder.go b/cmd/snapshots/seeder/commands/seeder.go deleted file mode 100644 index add8940a0d3..00000000000 --- a/cmd/snapshots/seeder/commands/seeder.go +++ /dev/null @@ -1,114 +0,0 @@ -package commands - -import ( - "context" - "fmt" - "os" - "path/filepath" - "time" - - lg "github.com/anacrolix/log" - "github.com/anacrolix/torrent" - "github.com/anacrolix/torrent/bencode" - "github.com/anacrolix/torrent/metainfo" - "github.com/ledgerwatch/erigon/common" - trnt "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/ledgerwatch/log/v3" -) - -func Seed(ctx context.Context, datadir string) error { - defer func() { - //hack origin lib don't have proper close handling - time.Sleep(time.Second * 5) - }() - datadir = filepath.Dir(datadir) - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - cfg := trnt.DefaultTorrentConfig() - cfg.NoDHT = false - cfg.DisableTrackers = false - cfg.Seed = true - cfg.Debug = false - cfg.Logger = cfg.Logger.FilterLevel(lg.Info) - cfg.DataDir = datadir - - pathes := []string{ - cfg.DataDir + "/headers", - cfg.DataDir + "/bodies", - cfg.DataDir + "/state", - } - - cl, err := torrent.NewClient(cfg) - if err != nil { - return err - } - defer cl.Close() - - torrents := make([]*torrent.Torrent, len(pathes)) - for i, v := range pathes { - i := i - mi := &metainfo.MetaInfo{ - CreationDate: time.Now().Unix(), - CreatedBy: "erigon", - AnnounceList: trnt.Trackers, - } - - if _, err := os.Stat(v); os.IsNotExist(err) { - fmt.Println(err) - continue - } else if err != nil { - return err - } - tt := time.Now() - if common.IsCanceled(ctx) { - return common.ErrStopped - } - info, err := trnt.BuildInfoBytesForSnapshot(v, trnt.MdbxFilename) - if err != nil { - return err - } - - mi.InfoBytes, err = bencode.Marshal(info) - if err != nil { - return err - } - - torrents[i], _, err = cl.AddTorrentSpec(&torrent.TorrentSpec{ - Trackers: trnt.Trackers, - InfoHash: mi.HashInfoBytes(), - InfoBytes: mi.InfoBytes, - ChunkSize: trnt.DefaultChunkSize, - }) - if err != nil { - return err - } - - log.Info("Torrent added", "name", torrents[i].Info().Name, "path", v, "t", time.Since(tt)) - - if !torrents[i].Seeding() { - log.Warn(torrents[i].Name() + " not seeding") - } - - if common.IsCanceled(ctx) { - return common.ErrStopped - } - } - - go func() { - ticker := time.NewTicker(10 * time.Second) - for range ticker.C { - for _, t := range cl.Torrents() { - log.Info("Snapshot stats", "snapshot", t.Name(), "active peers", t.Stats().ActivePeers, "seeding", t.Seeding(), "hash", t.Metainfo().HashInfoBytes().String()) - } - - if common.IsCanceled(ctx) { - ticker.Stop() - return - } - } - }() - - <-ctx.Done() - return nil -} diff --git a/cmd/snapshots/seeder/main.go b/cmd/snapshots/seeder/main.go deleted file mode 100644 index 7377684c99e..00000000000 --- a/cmd/snapshots/seeder/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "github.com/ledgerwatch/erigon/cmd/snapshots/seeder/commands" - -func main() { - commands.Execute() -} diff --git a/cmd/snapshots/tracker/commands/root.go b/cmd/snapshots/tracker/commands/root.go deleted file mode 100644 index 6c443015e41..00000000000 --- a/cmd/snapshots/tracker/commands/root.go +++ /dev/null @@ -1,395 +0,0 @@ -package commands - -import ( - "context" - "encoding/json" - "errors" - "fmt" - "net" - "net/http" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - "time" - - "github.com/anacrolix/torrent/bencode" - "github.com/anacrolix/torrent/tracker" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -const DefaultInterval = 60 //in seconds -const SoftLimit = 5 //in seconds -const DisconnectInterval = time.Minute //in seconds -var trackerID = "erigon snapshot tracker" - -func init() { - utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) -} - -func Execute() { - if err := rootCmd.ExecuteContext(rootContext()); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func rootContext() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - ch := make(chan os.Signal, 1) - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case <-ch: - log.Info("Got interrupt, shutting down...") - case <-ctx.Done(): - } - - cancel() - }() - return ctx -} - -var rootCmd = &cobra.Command{ - Use: "start", - Short: "start tracker", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - if err := debug.SetupCobra(cmd); err != nil { - panic(err) - } - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - debug.Exit() - }, - Args: cobra.ExactArgs(1), - ArgAliases: []string{"snapshots dir"}, - RunE: func(cmd *cobra.Command, args []string) error { - db := mdbx.MustOpen(args[0]) - m := http.NewServeMux() - m.Handle("/announce", &Tracker{db: db}) - m.HandleFunc("/scrape", func(writer http.ResponseWriter, request *http.Request) { - log.Warn("scrape", "url", request.RequestURI) - ih := request.URL.Query().Get("info_hash") - if len(ih) != 20 { - log.Error("wronng infohash", "ih", ih, "l", len(ih)) - WriteResp(writer, ErrResponse{FailureReason: "incorrect infohash"}, false) - return - } - resp := ScrapeResponse{Files: map[string]*ScrapeData{ - ih: {}, - }} - - err := db.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(kv.SnapshotInfo) - if err != nil { - return err - } - defer c.Close() - return ethdb.Walk(c, append([]byte(ih), make([]byte, 20)...), 20*8, func(k, v []byte) (bool, error) { - a := AnnounceReqWithTime{} - err := json.Unmarshal(v, &a) - if err != nil { - log.Error("Fail to unmarshall", "k", common.Bytes2Hex(k), "err", err) - //skip failed - return true, nil - } - if time.Since(a.UpdatedAt) > 24*time.Hour { - log.Debug("Skipped", "k", common.Bytes2Hex(k), "last updated", a.UpdatedAt) - return true, nil - } - if a.Left == 0 { - resp.Files[ih].Downloaded++ - resp.Files[ih].Complete++ - } else { - resp.Files[ih].Incomplete++ - } - return true, nil - }) - }) - if err != nil { - log.Error("Walk", "err", err) - WriteResp(writer, ErrResponse{FailureReason: err.Error()}, false) - return - } - jsonResp, err := json.Marshal(resp) - if err == nil { - log.Info("scrape resp", "v", string(jsonResp)) - } else { - log.Info("marshall scrape resp", "err", err) - } - - WriteResp(writer, resp, false) - }) - m.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { - log.Warn("404", "url", request.RequestURI) - }) - - log.Info("Listen1") - go func() { - err := http.ListenAndServe(":80", m) - log.Error("error", "err", err) - }() - <-cmd.Context().Done() - return nil - }, -} - -type Tracker struct { - db kv.RwDB -} - -/* -/announce?compact=1 -&downloaded=0 -&event="started" -&info_hash=D%22%5C%80%F7%FD%12Z%EA%9B%F0%A5z%DA%AF%1F%A4%E1je -&left=0 -&peer_id=-GT0002-9%EA%FB+%BF%B3%AD%DE%8Ae%D0%B7 -&port=53631 -&supportcrypto=1 -&uploaded=0" -*/ -type AnnounceReqWithTime struct { - AnnounceReq - UpdatedAt time.Time -} -type AnnounceReq struct { - InfoHash []byte - PeerID []byte - RemoteAddr net.IP - Port int - Event string - Uploaded int64 - Downloaded int64 - SupportCrypto bool - Left int64 - Compact bool -} - -type Peer struct { - IP string - Port int - PeerID []byte -} - -func (t *Tracker) ServeHTTP(w http.ResponseWriter, r *http.Request) { - log.Info("call", "url", r.RequestURI) - - req, err := ParseRequest(r) - if err != nil { - log.Error("Parse request", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - if err = ValidateReq(req); err != nil { - log.Error("Validate failed", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - - toSave := AnnounceReqWithTime{ - req, - time.Now(), - } - peerBytes, err := json.Marshal(toSave) - if err != nil { - log.Error("Json marshal", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - - key := append(req.InfoHash, req.PeerID...) - if req.Event == tracker.Stopped.String() { - err = t.db.Update(context.Background(), func(tx kv.RwTx) error { - return tx.Delete(kv.SnapshotInfo, key, nil) - }) - if err != nil { - log.Error("Json marshal", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - } else { - var prevBytes []byte - err = t.db.View(context.Background(), func(tx kv.Tx) error { - prevBytes, err = tx.GetOne(kv.SnapshotInfo, key) - return err - }) - if err != nil { - log.Error("get from db is return error", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - if prevBytes == nil { - return - } - - prev := new(AnnounceReqWithTime) - err = json.Unmarshal(prevBytes, prev) - if err != nil { - log.Error("Unable to unmarshall", "err", err) - } - if time.Since(prev.UpdatedAt) < time.Second*SoftLimit { - //too early to update - WriteResp(w, ErrResponse{FailureReason: "too early to update"}, req.Compact) - return - - } - if err = t.db.Update(context.Background(), func(tx kv.RwTx) error { - return tx.Put(kv.SnapshotInfo, key, peerBytes) - }); err != nil { - log.Error("db.Put", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - } - - resp := HttpResponse{ - Interval: DefaultInterval, - TrackerId: trackerID, - } - - if err := t.db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForPrefix(kv.SnapshotInfo, append(req.InfoHash, make([]byte, 20)...), func(k, v []byte) error { - a := AnnounceReqWithTime{} - err = json.Unmarshal(v, &a) - if err != nil { - log.Error("Fail to unmarshall", "k", common.Bytes2Hex(k), "err", err) - //skip failed - return nil - } - if time.Since(a.UpdatedAt) > 5*DisconnectInterval { - log.Debug("Skipped requset", "peer", common.Bytes2Hex(a.PeerID), "last updated", a.UpdatedAt, "now", time.Now()) - return nil - } - if a.Left == 0 { - resp.Complete++ - } else { - resp.Incomplete++ - } - resp.Peers = append(resp.Peers, map[string]interface{}{ - "ip": a.RemoteAddr.String(), - "peer id": a.PeerID, - "port": a.Port, - }) - return nil - }) - }); err != nil { - log.Error("Walk", "err", err) - WriteResp(w, ErrResponse{FailureReason: err.Error()}, req.Compact) - return - } - jsonResp, err := json.Marshal(resp) - if err == nil { - log.Info("announce resp", "v", string(jsonResp)) - } else { - log.Info("marshall announce resp", "err", err) - } - - WriteResp(w, resp, req.Compact) -} - -func WriteResp(w http.ResponseWriter, res interface{}, compact bool) { - if _, ok := res.(ErrResponse); ok { - log.Error("Err", "err", res) - } - if compact { - err := bencode.NewEncoder(w).Encode(res) - if err != nil { - log.Error("Bencode encode", "err", err) - } - } else { - err := json.NewEncoder(w).Encode(res) - if err != nil { - log.Error("Json marshal", "err", err) - return - } - } -} - -func ParseRequest(r *http.Request) (AnnounceReq, error) { - q := r.URL.Query() - - var remoteAddr net.IP - if strings.Contains(r.RemoteAddr, ":") { - remoteAddr = net.ParseIP(strings.Split(r.RemoteAddr, ":")[0]) - } else { - remoteAddr = net.ParseIP(r.RemoteAddr) - } - - downloaded, err := strconv.ParseInt(q.Get("downloaded"), 10, 64) - if err != nil { - log.Warn("downloaded", "err", err) - return AnnounceReq{}, fmt.Errorf("downloaded %v - %w", q.Get("downloaded"), err) - } - uploaded, err := strconv.ParseInt(q.Get("uploaded"), 10, 64) - if err != nil { - log.Warn("uploaded", "err", err) - return AnnounceReq{}, fmt.Errorf("uploaded %v - %w", q.Get("uploaded"), err) - } - left, err := strconv.ParseInt(q.Get("left"), 10, 64) - if err != nil { - log.Warn("left", "err", err) - return AnnounceReq{}, fmt.Errorf("left: %v - %w", q.Get("left"), err) - } - port, err := strconv.Atoi(q.Get("port")) - if err != nil { - return AnnounceReq{}, fmt.Errorf("port: %v - %w", q.Get("port"), err) - } - - res := AnnounceReq{ - InfoHash: []byte(q.Get("info_hash")), - PeerID: []byte(q.Get("peer_id")), - RemoteAddr: remoteAddr, - Event: q.Get("event"), - Compact: q.Get("compact") == "1", - SupportCrypto: q.Get("supportcrypto") == "1", - Downloaded: downloaded, - Uploaded: uploaded, - Left: left, - Port: port, - } - return res, nil -} - -func ValidateReq(req AnnounceReq) error { - if len(req.InfoHash) != 20 { - return errors.New("invalid infohash") - } - if len(req.PeerID) != 20 { - return errors.New("invalid peer id") - } - if req.Port == 0 { - return errors.New("invalid port") - } - return nil -} - -type HttpResponse struct { - Interval int32 `bencode:"interval" json:"interval"` - TrackerId string `bencode:"tracker id" json:"tracker_id"` - Complete int32 `bencode:"complete" json:"complete"` - Incomplete int32 `bencode:"incomplete" json:"incomplete"` - Peers []map[string]interface{} `bencode:"peers" json:"peers"` -} -type ErrResponse struct { - FailureReason string `bencode:"failure reason" json:"failure_reason"` -} -type ScrapeResponse struct { - Files map[string]*ScrapeData `json:"files" bencode:"files"` -} - -type ScrapeData struct { - Complete int32 `bencode:"complete" json:"complete"` - Downloaded int32 `json:"downloaded" bencode:"downloaded"` - Incomplete int32 `json:"incomplete" bencode:"incomplete"` -} diff --git a/cmd/snapshots/tracker/main.go b/cmd/snapshots/tracker/main.go deleted file mode 100644 index b88ca80d538..00000000000 --- a/cmd/snapshots/tracker/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "github.com/ledgerwatch/erigon/cmd/snapshots/tracker/commands" - -func main() { - commands.Execute() -} diff --git a/cmd/snapshots/utils/utils.go b/cmd/snapshots/utils/utils.go deleted file mode 100644 index ed7930f9d67..00000000000 --- a/cmd/snapshots/utils/utils.go +++ /dev/null @@ -1,20 +0,0 @@ -package utils - -import ( - "errors" - "os" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/log/v3" -) - -var ErrUnsupported error = errors.New("unsupported KV type") - -func RmTmpFiles(snapshotPath string) error { - return os.Remove(snapshotPath + "/mdbx.lck") -} - -func OpenSnapshotKV(configsFunc mdbx.TableCfgFunc, path string) kv.RwDB { - return mdbx.NewMDBX(log.New()).WithTablessCfg(configsFunc).Path(path).MustOpen() -} diff --git a/cmd/starknet/README.md b/cmd/starknet/README.md new file mode 100644 index 00000000000..c203f7cf519 --- /dev/null +++ b/cmd/starknet/README.md @@ -0,0 +1,26 @@ +# How to deploy cairo smart contract + +1. Compile cairo smart contract + + `starknet-compile contract.cairo --output contract_compiled.json --abi contract_abi.json` + + +2. Generate payload for `starknet_sendRawTransaction` PRC method + + ``` + go run ./cmd/starknet/main.go generateRawTx + -c ./cairo/contract.json + -o /cairo/send_raw_transaction + -s salt_test + -g 11452296 + -k b9a8b19ff082a7f4b943fcbe0da6cce6ce2c860090f05d031f463412ab534e95 + ``` + + Command syntax: `go run main.go generateRawTx --help` + + +3. Use command output in RPC call + +```json +"params":["0x03f86583127ed80180800180019637623232363136323639323233613230356235643764c080a0b44c2f4e18ca27e621171da5cf3a0c875c0749c7b998ec2759974280d987143aa04f01823122d972baa1a03b113535d9f9057fd9366fd8770e766b91f835b88ea6"], +``` diff --git a/cmd/starknet/cmd/generate_raw_tx.go b/cmd/starknet/cmd/generate_raw_tx.go new file mode 100644 index 00000000000..c74d384e9f6 --- /dev/null +++ b/cmd/starknet/cmd/generate_raw_tx.go @@ -0,0 +1,125 @@ +package cmd + +import ( + "bytes" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/ledgerwatch/erigon-lib/kv" + kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/cmd/starknet/services" + "github.com/ledgerwatch/erigon/common/paths" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" +) + +const ( + DefaultGas = 11_000_000 + DefaultNonce = 0 +) + +type Flags struct { + Contract string + Salt string + Gas uint64 + Nonce uint64 + PrivateKey string + DataDir string + Chaindata string + Output string +} + +var generateRawTxCmd = &cobra.Command{ + Use: "generateRawTx", + Short: "Generate data for starknet_sendRawTransaction RPC method", +} + +func init() { + generateRawTxCmd, flags := config() + generateRawTxCmd.RunE = func(cmd *cobra.Command, args []string) error { + logger := log.New() + db, err := db(flags, logger) + if err != nil { + return err + } + defer db.Close() + + rawTxGenerator := services.NewRawTxGenerator(flags.PrivateKey) + + fs := os.DirFS("/") + buf := bytes.NewBuffer(nil) + + config := &services.Config{ + ContractFileName: strings.Trim(flags.Contract, "/"), + Salt: []byte(flags.Salt), + Gas: flags.Gas, + Nonce: flags.Nonce, + } + + err = rawTxGenerator.CreateFromFS(cmd.Context(), fs, db, config, buf) + if err != nil { + return err + } + + if flags.Output != "" { + outputFile, err := os.Create(flags.Output) + if err != nil { + return fmt.Errorf("could not create output file: %v", flags.Output) + } + defer outputFile.Close() + + _, err = outputFile.WriteString(buf.String()) + if err != nil { + return fmt.Errorf("could not write to output file: %v", flags.Output) + } + } else { + fmt.Println(buf.String()) + } + + return err + } + + rootCmd.AddCommand(generateRawTxCmd) +} + +func config() (*cobra.Command, *Flags) { + flags := &Flags{} + generateRawTxCmd.PersistentFlags().StringVar(&flags.Contract, "contract", "", "Path to compiled cairo contract in JSON format") + generateRawTxCmd.MarkPersistentFlagRequired("contract") + + generateRawTxCmd.PersistentFlags().StringVar(&flags.Salt, "salt", "", "Cairo contract address salt") + generateRawTxCmd.MarkPersistentFlagRequired("salt") + + generateRawTxCmd.PersistentFlags().Uint64Var(&flags.Gas, "gas", DefaultGas, "Gas") + + generateRawTxCmd.PersistentFlags().Uint64Var(&flags.Nonce, "nonce", DefaultNonce, "Nonce") + + generateRawTxCmd.PersistentFlags().StringVar(&flags.PrivateKey, "private_key", "", "Private key") + generateRawTxCmd.MarkPersistentFlagRequired("private_key") + + generateRawTxCmd.PersistentFlags().StringVar(&flags.DataDir, "datadir", "", "path to Erigon working directory") + + generateRawTxCmd.PersistentFlags().StringVarP(&flags.Output, "output", "o", "", "Path to file where sign transaction will be saved. Print to stdout if empty.") + + generateRawTxCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + if flags.DataDir == "" { + flags.DataDir = paths.DefaultDataDir() + } + if flags.Chaindata == "" { + flags.Chaindata = filepath.Join(flags.DataDir, "chaindata") + } + return nil + } + + return generateRawTxCmd, flags +} + +func db(flags *Flags, logger log.Logger) (kv.RoDB, error) { + rwKv, err := kv2.NewMDBX(logger).Path(flags.Chaindata).Readonly().Open() + if err != nil { + return nil, err + } + return rwKv, nil +} diff --git a/cmd/starknet/cmd/root.go b/cmd/starknet/cmd/root.go new file mode 100644 index 00000000000..a7d1d3ab357 --- /dev/null +++ b/cmd/starknet/cmd/root.go @@ -0,0 +1,19 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: "starknet", + Short: "Starknet cli commands", +} + +func Execute() { + cobra.CheckErr(rootCmd.Execute()) +} + +func init() { + cobra.OnInitialize() +} diff --git a/cmd/starknet/main.go b/cmd/starknet/main.go new file mode 100644 index 00000000000..47a140a703e --- /dev/null +++ b/cmd/starknet/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/ledgerwatch/erigon/cmd/starknet/cmd" + +func main() { + cmd.Execute() +} diff --git a/cmd/starknet/services/raw_tx_generator.go b/cmd/starknet/services/raw_tx_generator.go new file mode 100644 index 00000000000..f3728bcfa21 --- /dev/null +++ b/cmd/starknet/services/raw_tx_generator.go @@ -0,0 +1,136 @@ +package services + +import ( + "bytes" + "context" + "crypto/ecdsa" + "encoding/hex" + "errors" + "fmt" + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/adapter" + "io/fs" +) + +var ( + ErrReadContract = errors.New("contract read error") + ErrInvalidPrivateKey = errors.New("invalid private key") +) + +type Config struct { + ContractFileName string + Salt []byte + Gas uint64 + Nonce uint64 +} + +func NewRawTxGenerator(privateKey string) *RawTxGenerator { + return &RawTxGenerator{ + privateKey: privateKey, + } +} + +type RawTxGenerator struct { + privateKey string +} + +func (g RawTxGenerator) CreateFromFS(ctx context.Context, fileSystem fs.FS, db kv.RoDB, config *Config, writer *bytes.Buffer) error { + privateKey, err := crypto.HexToECDSA(g.privateKey) + if err != nil { + return ErrInvalidPrivateKey + } + + address, err := addressFromPrivateKey(privateKey) + if err != nil { + return err + } + + nonce, err := getNonce(ctx, db, address, config.Nonce) + if err != nil { + return err + } + + contract, err := fs.ReadFile(fileSystem, config.ContractFileName) + if err != nil { + return ErrReadContract + } + + enc := make([]byte, hex.EncodedLen(len(contract))) + hex.Encode(enc, contract) + + tx := types.StarknetTransaction{ + CommonTx: types.CommonTx{ + Nonce: nonce + 1, + Value: uint256.NewInt(1), + Gas: config.Gas, + Data: enc, + }, + Salt: config.Salt, + FeeCap: uint256.NewInt(875000000), + Tip: uint256.NewInt(100000), + } + + sighash := tx.SigningHash(params.FermionChainConfig.ChainID) + + signature, _ := crypto.Sign(sighash[:], privateKey) + signer := types.MakeSigner(params.FermionChainConfig, 1) + + signedTx, err := tx.WithSignature(*signer, signature) + if err != nil { + return err + } + + err = signedTx.(rlp.Encoder).EncodeRLP(writer) + signedTxRlp := writer.Bytes() + writer.Reset() + writer.WriteString(hexutil.Encode(signedTxRlp)) + + if err != nil { + return errors.New("can not save signed tx") + } + + return nil +} + +func addressFromPrivateKey(privateKey *ecdsa.PrivateKey) (common.Address, error) { + publicKey := privateKey.Public() + publicKeyECDSA, _ := publicKey.(*ecdsa.PublicKey) + return crypto.PubkeyToAddress(*publicKeyECDSA), nil +} + +func getNonce(ctx context.Context, db kv.RoDB, address common.Address, configNonce uint64) (uint64, error) { + if configNonce != 0 { + return configNonce, nil + } + + var nonce uint64 = 0 + + tx, err := db.BeginRo(ctx) + if err != nil { + return nonce, fmt.Errorf("cannot open tx: %w", err) + } + defer tx.Rollback() + blockNumber, err := stages.GetStageProgress(tx, stages.Execution) + if err != nil { + return nonce, err + } + reader := adapter.NewStateReader(tx, blockNumber) + acc, err := reader.ReadAccountData(address) + if err != nil { + return nonce, err + } + + if acc == nil { + return 0, nil + } + + return acc.Nonce, nil +} diff --git a/cmd/starknet/services/raw_tx_generator_test.go b/cmd/starknet/services/raw_tx_generator_test.go new file mode 100644 index 00000000000..e20ad33b81b --- /dev/null +++ b/cmd/starknet/services/raw_tx_generator_test.go @@ -0,0 +1,97 @@ +package services_test + +import ( + "bytes" + "context" + "encoding/hex" + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/cmd/starknet/services" + "testing" + "testing/fstest" + + "github.com/ledgerwatch/erigon/crypto" +) + +func TestCreate(t *testing.T) { + privateKey := "26e86e45f6fc45ec6e2ecd128cec80fa1d1505e5507dcd2ae58c3130a7a97b48" + + var cases = []struct { + name string + privateKey string + config *services.Config + want string + error error + }{ + {name: "invalid private key", privateKey: "abc", config: &services.Config{ + ContractFileName: "not_exist.json", + }, error: services.ErrInvalidPrivateKey}, + {name: "contract file not found", privateKey: generatePrivateKey(t), config: &services.Config{ + ContractFileName: "not_exist.json", + }, error: services.ErrReadContract}, + {name: "success", privateKey: privateKey, config: &services.Config{ + ContractFileName: "contract_test.json", + Salt: []byte("contract_address_salt"), + Gas: 1, + Nonce: 0, + }, want: "0xb88503f88283127ed801830186a084342770c0018001963762323236313632363932323361323035623564376495636f6e74726163745f616464726573735f73616c74c080a08b88467d0a9a6cba87ec6c2ad9e7399d12a1b6f7f5b951bdd2c5c2ea08b76134a0472e1b37ca5f87c9c38690718c6b2b9db1a3d5398dc664fc4e158ab60d02d64b"}, + } + + fs := fstest.MapFS{ + "contract_test.json": {Data: []byte("{\"abi\": []}")}, + } + + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + rawTxGenerator := services.NewRawTxGenerator(tt.privateKey) + + ctx := context.Background() + buf := bytes.NewBuffer(nil) + db := memdb.NewTestDB(t) + + err := rawTxGenerator.CreateFromFS(ctx, fs, db, tt.config, buf) + + if tt.error == nil { + assertNoError(t, err) + + got := buf.String() + + if got != tt.want { + t.Errorf("got %q not equals want %q", got, tt.want) + } + } else { + assertError(t, err, tt.error) + } + }) + } +} + +func generatePrivateKey(t testing.TB) string { + t.Helper() + + privateKey, err := crypto.GenerateKey() + if err != nil { + t.Error(err) + } + + return hex.EncodeToString(crypto.FromECDSA(privateKey)) +} + +func assertNoError(t testing.TB, got error) { + t.Helper() + + if got != nil { + t.Fatal("got an error but didn't want one") + } +} + +func assertError(t testing.TB, got error, want error) { + t.Helper() + + if got == nil { + t.Fatal("didn't get an error but wanted one") + } + + if got != want { + t.Errorf("got %q, want %q", got, want) + } +} diff --git a/cmd/state/commands/check_change_sets.go b/cmd/state/commands/check_change_sets.go index c2cd22839f1..7b014e21078 100644 --- a/cmd/state/commands/check_change_sets.go +++ b/cmd/state/commands/check_change_sets.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "os/signal" + "path" "sort" "syscall" "time" @@ -16,27 +17,29 @@ import ( "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/eth/ethconfig" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/ethdb" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" ) var ( - historyfile string - nocheck bool - writeReceipts bool + historyfile string + nocheck bool ) func init() { withBlock(checkChangeSetsCmd) - withDatadir(checkChangeSetsCmd) + withDataDir(checkChangeSetsCmd) + withSnapshotBlocks(checkChangeSetsCmd) checkChangeSetsCmd.Flags().StringVar(&historyfile, "historyfile", "", "path to the file where the changesets and history are expected to be. If omitted, the same as /erion/chaindata") checkChangeSetsCmd.Flags().BoolVar(&nocheck, "nocheck", false, "set to turn off the changeset checking and only execute transaction (for performance testing)") - checkChangeSetsCmd.Flags().BoolVar(&writeReceipts, "writeReceipts", false, "set to turn on writing receipts as the execution ongoing") rootCmd.AddCommand(checkChangeSetsCmd) } @@ -45,13 +48,13 @@ var checkChangeSetsCmd = &cobra.Command{ Short: "Re-executes historical transactions in read-only mode and checks that their outputs match the database ChangeSets", RunE: func(cmd *cobra.Command, args []string) error { logger := log.New() - return CheckChangeSets(genesis, logger, block, chaindata, historyfile, nocheck, writeReceipts) + return CheckChangeSets(genesis, logger, block, chaindata, historyfile, nocheck) }, } // CheckChangeSets re-executes historical transactions in read-only mode // and checks that their outputs match the database ChangeSets. -func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, chaindata string, historyfile string, nocheck bool, writeReceipts bool) error { +func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, chaindata string, historyfile string, nocheck bool) error { if len(historyfile) == 0 { historyfile = chaindata } @@ -76,7 +79,8 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, if chaindata != historyfile { historyDb = kv2.MustOpen(historyfile) } - historyTx, err1 := historyDb.BeginRo(context.Background()) + ctx := context.Background() + historyTx, err1 := historyDb.BeginRo(ctx) if err1 != nil { return err1 } @@ -87,7 +91,7 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, noOpWriter := state.NewNoopWriter() interrupt := false - rwtx, err := chainDb.BeginRw(context.Background()) + rwtx, err := chainDb.BeginRw(ctx) if err != nil { return err } @@ -104,6 +108,22 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, commitEvery := time.NewTicker(30 * time.Second) defer commitEvery.Stop() + + var blockReader services.FullBlockReader + var allSnapshots *snapshotsync.RoSnapshots + useSnapshots := ethconfig.UseSnapshotsByChainName(chainConfig.ChainName) && snapshotsCli + if useSnapshots { + allSnapshots = snapshotsync.NewRoSnapshots(ethconfig.NewSnapCfg(true, false, true), path.Join(datadir, "snapshots")) + defer allSnapshots.Close() + if err := allSnapshots.Reopen(); err != nil { + return fmt.Errorf("reopen snapshot segments: %w", err) + } + blockReader = snapshotsync.NewBlockReaderWithSnapshots(allSnapshots) + } else { + blockReader = snapshotsync.NewBlockReader() + } + engine := initConsensusEngine(chainConfig, logger, allSnapshots) + for !interrupt { if blockNum > execAt { @@ -115,21 +135,22 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, break } - blockHash, err := rawdb.ReadCanonicalHash(rwtx, blockNum) + blockHash, err := blockReader.CanonicalHash(ctx, historyTx, blockNum) if err != nil { return err } - var block *types.Block - block, _, err = rawdb.ReadBlockWithSenders(rwtx, blockHash, blockNum) + var b *types.Block + b, _, err = blockReader.BlockWithSenders(ctx, historyTx, blockHash, blockNum) if err != nil { return err } - if block == nil { + if b == nil { break } - - intraBlockState := state.New(state.NewPlainState(historyTx, block.NumberU64()-1)) - csw := state.NewChangeSetWriterPlain(nil /* db */, block.NumberU64()-1) + reader := state.NewPlainState(historyTx, blockNum) + //reader.SetTrace(blockNum == uint64(block)) + intraBlockState := state.New(reader) + csw := state.NewChangeSetWriterPlain(nil /* db */, blockNum) var blockWriter state.StateWriter if nocheck { blockWriter = noOpWriter @@ -137,21 +158,22 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, blockWriter = csw } - getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(rwtx, hash, number) } - receipts, err1 := runBlock(intraBlockState, noOpWriter, blockWriter, chainConfig, getHeader, nil /* checkTEVM */, block, vmConfig) + getHeader := func(hash common.Hash, number uint64) *types.Header { + h, e := blockReader.Header(ctx, rwtx, hash, number) + if e != nil { + panic(e) + } + return h + } + contractHasTEVM := ethdb.GetHasTEVM(rwtx) + receipts, err1 := runBlock(engine, intraBlockState, noOpWriter, blockWriter, chainConfig, getHeader, contractHasTEVM, b, vmConfig) if err1 != nil { return err1 } - if writeReceipts { - if chainConfig.IsByzantium(block.Number().Uint64()) { - receiptSha := types.DeriveSha(receipts) - if receiptSha != block.Header().ReceiptHash { - return fmt.Errorf("mismatched receipt headers for block %d", block.NumberU64()) - } - } - - if err := rawdb.AppendReceipts(rwtx, block.NumberU64(), receipts); err != nil { - return err + if chainConfig.IsByzantium(blockNum) { + receiptSha := types.DeriveSha(receipts) + if receiptSha != b.ReceiptHash() { + return fmt.Errorf("mismatched receipt headers for block %d", blockNum) } } @@ -163,11 +185,24 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, sort.Sort(accountChanges) i := 0 match := true - err = changeset.Walk(historyTx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(blockNum), 8*8, func(blockN uint64, k, v []byte) (bool, error) { + err = changeset.ForPrefix(historyTx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(blockNum), func(blockN uint64, k, v []byte) error { + if i >= len(accountChanges.Changes) { + if len(v) != 0 { + fmt.Printf("Unexpected account changes in block %d\n", blockNum) + fmt.Printf("In the database: ======================\n") + fmt.Printf("%d: 0x%x: %x\n", i, k, v) + match = false + } + i++ + return nil + } c := accountChanges.Changes[i] if bytes.Equal(c.Key, k) && bytes.Equal(c.Value, v) { i++ - return true, nil + return nil + } + if len(v) == 0 { + return nil } match = false @@ -176,7 +211,8 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, fmt.Printf("%d: 0x%x: %x\n", i, k, v) fmt.Printf("Expected: ==========================\n") fmt.Printf("%d: 0x%x %x\n", i, c.Key, c.Value) - return false, nil + i++ + return nil }) if err != nil { return err @@ -195,22 +231,34 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, expectedStorageChanges = changeset.NewChangeSet() } sort.Sort(expectedStorageChanges) - err = changeset.Walk(historyTx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(blockNum), 8*8, func(blockN uint64, k, v []byte) (bool, error) { + match = true + err = changeset.ForPrefix(historyTx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(blockNum), func(blockN uint64, k, v []byte) error { + if i >= len(expectedStorageChanges.Changes) { + fmt.Printf("Unexpected storage changes in block %d\nIn the database: ======================\n", blockNum) + fmt.Printf("0x%x: %x\n", k, v) + match = false + i++ + return nil + } c := expectedStorageChanges.Changes[i] i++ if bytes.Equal(c.Key, k) && bytes.Equal(c.Value, v) { - return false, nil + return nil } - + match = false fmt.Printf("Unexpected storage changes in block %d\nIn the database: ======================\n", blockNum) fmt.Printf("0x%x: %x\n", k, v) fmt.Printf("Expected: ==========================\n") fmt.Printf("0x%x %x\n", c.Key, c.Value) - return true, fmt.Errorf("check change set failed") + i++ + return nil }) if err != nil { return err } + if !match { + return fmt.Errorf("check change set failed") + } } blockNum++ @@ -222,32 +270,9 @@ func CheckChangeSets(genesis *core.Genesis, logger log.Logger, blockNum uint64, select { case interrupt = <-interruptCh: fmt.Println("interrupted, please wait for cleanup...") - case <-commitEvery.C: - if writeReceipts { - log.Info("Committing receipts", "up to block", block.NumberU64()) - if err = rwtx.Commit(); err != nil { - return err - } - rwtx, err = chainDb.BeginRw(context.Background()) - if err != nil { - return err - } - defer rwtx.Rollback() - historyTx.Rollback() - historyTx, err = historyDb.BeginRo(context.Background()) - if err != nil { - return err - } - } default: } } - if writeReceipts { - log.Info("Committing final receipts", "batch size") - if err = rwtx.Commit(); err != nil { - return err - } - } log.Info("Checked", "blocks", blockNum, "next time specify --block", blockNum, "duration", time.Since(startTime)) return nil } diff --git a/cmd/state/commands/check_enc.go b/cmd/state/commands/check_enc.go index d71d8f057db..220e0fc92d1 100644 --- a/cmd/state/commands/check_enc.go +++ b/cmd/state/commands/check_enc.go @@ -6,7 +6,7 @@ import ( ) func init() { - withDatadir(checkEncCmd) + withDataDir(checkEncCmd) withStatsfile(checkEncCmd) rootCmd.AddCommand(checkEncCmd) } diff --git a/cmd/state/commands/check_index.go b/cmd/state/commands/check_index.go index 9a2fb60b9e9..2c229a78f49 100644 --- a/cmd/state/commands/check_index.go +++ b/cmd/state/commands/check_index.go @@ -1,13 +1,13 @@ package commands import ( + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon/cmd/state/verify" - "github.com/ledgerwatch/erigon/cmd/utils" "github.com/spf13/cobra" ) func init() { - withDatadir(checkIndexCMD) + withDataDir(checkIndexCMD) withIndexBucket(checkIndexCMD) withCSBucket(checkIndexCMD) rootCmd.AddCommand(checkIndexCMD) @@ -17,7 +17,7 @@ var checkIndexCMD = &cobra.Command{ Use: "checkIndex", Short: "Index checker", RunE: func(cmd *cobra.Command, args []string) error { - ctx, _ := utils.RootContext() + ctx, _ := common.RootContext() return verify.CheckIndex(ctx, chaindata, changeSetBucket, indexBucket) }, } diff --git a/cmd/state/commands/erigon2.go b/cmd/state/commands/erigon2.go new file mode 100644 index 00000000000..934f79cac63 --- /dev/null +++ b/cmd/state/commands/erigon2.go @@ -0,0 +1,645 @@ +package commands + +import ( + "bytes" + "context" + "errors" + "fmt" + "math/bits" + "os" + "os/signal" + "path" + "path/filepath" + "runtime" + "syscall" + "time" + + metrics2 "github.com/VictoriaMetrics/metrics" + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/aggregator" + "github.com/ledgerwatch/erigon-lib/commitment" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/mdbx" + kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/eth/ethconsensusconfig" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/consensus/misc" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/types/accounts" + "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/eth/ethconfig" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" +) + +const ( + aggregationStep = 15625 /* this is 500'000 / 32 */ + unwindLimit = 90000 /* how it is in geth */ + logInterval = 30 * time.Second // time period to print aggregation stat to log + dirtySpaceThreshold = 2 * 1024 * 1024 * 1024 /* threshold of dirty space in MDBX transaction that triggers a commit */ +) + +var ( + commitmentFrequency int // How many blocks to skip between calculating commitment + changesets bool + commitments bool + commitmentTrie string +) + +var blockExecutionTimer = metrics2.GetOrCreateSummary("chain_execution_seconds") + +func init() { + withBlock(erigon2Cmd) + withDataDir(erigon2Cmd) + withSnapshotBlocks(erigon2Cmd) + withChain(erigon2Cmd) + + erigon2Cmd.Flags().BoolVar(&changesets, "changesets", false, "set to true to generate changesets") + erigon2Cmd.Flags().IntVar(&commitmentFrequency, "commfreq", 625, "how many blocks to skip between calculating commitment") + erigon2Cmd.Flags().BoolVar(&commitments, "commitments", false, "set to true to calculate commitments") + erigon2Cmd.Flags().StringVar(&commitmentTrie, "commitments.trie", "hex", "hex - use Hex Patricia Hashed Trie for commitments, bin - use of binary patricia trie") + erigon2Cmd.Flags().IntVar(&traceBlock, "traceblock", 0, "block number at which to turn on tracing") + rootCmd.AddCommand(erigon2Cmd) +} + +var erigon2Cmd = &cobra.Command{ + Use: "erigon2", + Short: "Exerimental command to re-execute blocks from beginning using erigon2 state representation", + RunE: func(cmd *cobra.Command, args []string) error { + if commitmentFrequency < 1 || commitmentFrequency > aggregationStep { + return fmt.Errorf("commitmentFrequency cannot be less than 1 or more than %d: %d", commitmentFrequency, aggregationStep) + } + logger := log.New() + return Erigon2(genesis, chainConfig, logger) + }, +} + +func Erigon2(genesis *core.Genesis, chainConfig *params.ChainConfig, logger log.Logger) error { + sigs := make(chan os.Signal, 1) + interruptCh := make(chan bool, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + interruptCh <- true + }() + + historyDb, err := kv2.NewMDBX(logger).Path(path.Join(datadir, "chaindata")).Open() + if err != nil { + return fmt.Errorf("opening chaindata as read only: %v", err) + } + defer historyDb.Close() + + ctx := context.Background() + historyTx, err1 := historyDb.BeginRo(ctx) + if err1 != nil { + return err1 + } + defer historyTx.Rollback() + stateDbPath := path.Join(datadir, "statedb") + if block == 0 { + if _, err = os.Stat(stateDbPath); err != nil { + if !errors.Is(err, os.ErrNotExist) { + return err + } + } else if err = os.RemoveAll(stateDbPath); err != nil { + return err + } + } + db, err2 := kv2.NewMDBX(logger).Path(stateDbPath).WriteMap().Open() + if err2 != nil { + return err2 + } + defer db.Close() + + aggPath := filepath.Join(datadir, "aggregator") + if block == 0 { + if _, err = os.Stat(aggPath); err != nil { + if !errors.Is(err, os.ErrNotExist) { + return err + } + } else if err = os.RemoveAll(aggPath); err != nil { + return err + } + if err = os.Mkdir(aggPath, os.ModePerm); err != nil { + return err + } + } + + var rwTx kv.RwTx + defer func() { + if rwTx != nil { + rwTx.Rollback() + } + }() + if rwTx, err = db.BeginRw(ctx); err != nil { + return err + } + var blockRootMismatchExpected bool + var trieVariant commitment.TrieVariant + switch commitmentTrie { + case "bin": + logger.Info("using Binary Patricia Hashed Trie for commitments") + trieVariant = commitment.VariantBinPatriciaTrie + blockRootMismatchExpected = true + case "hex": + fallthrough + default: + logger.Info("using Hex Patricia Hashed Trie for commitments") + trieVariant = commitment.VariantHexPatriciaTrie + } + + agg, err3 := aggregator.NewAggregator(aggPath, unwindLimit, aggregationStep, changesets, commitments, 100_000_000, commitment.InitializeTrie(trieVariant), rwTx) + if err3 != nil { + return fmt.Errorf("create aggregator: %w", err3) + } + defer agg.Close() + + interrupt := false + w := agg.MakeStateWriter(changesets /* beforeOn */) + var rootHash []byte + if block == 0 { + genBlock, genesisIbs, err4 := genesis.ToBlock() + if err4 != nil { + return err4 + } + if err = w.Reset(0, rwTx); err != nil { + return err + } + if err = genesisIbs.CommitBlock(¶ms.Rules{}, &WriterWrapper{w: w}); err != nil { + return fmt.Errorf("cannot write state: %w", err) + } + if err = w.FinishTx(0, false); err != nil { + return err + } + if commitments { + if rootHash, err = w.ComputeCommitment(false); err != nil { + return err + } + } + if err = w.Aggregate(false); err != nil { + return err + } + if commitments && !blockRootMismatchExpected { + if !bytes.Equal(rootHash, genBlock.Header().Root[:]) { + return fmt.Errorf("root hash mismatch for genesis block, expected [%x], was [%x]", genBlock.Header().Root[:], rootHash) + } + } + } + + logger.Info("Initialised chain configuration", "config", chainConfig) + + var ( + blockNum uint64 + trace bool + vmConfig vm.Config + + txNum uint64 = 2 // Consider that each block contains at least first system tx and enclosing transactions, except for Clique consensus engine + ) + + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + statx := &stat{ + prevBlock: blockNum, + prevTime: time.Now(), + } + + go func() { + for range logEvery.C { + aStats := agg.Stats() + statx.delta(aStats, blockNum).print(aStats, logger) + } + }() + + var blockReader services.FullBlockReader + var allSnapshots *snapshotsync.RoSnapshots + useSnapshots := ethconfig.UseSnapshotsByChainName(chainConfig.ChainName) && snapshotsCli + if useSnapshots { + allSnapshots = snapshotsync.NewRoSnapshots(ethconfig.NewSnapCfg(true, false, true), path.Join(datadir, "snapshots")) + defer allSnapshots.Close() + if err := allSnapshots.Reopen(); err != nil { + return fmt.Errorf("reopen snapshot segments: %w", err) + } + blockReader = snapshotsync.NewBlockReaderWithSnapshots(allSnapshots) + } else { + blockReader = snapshotsync.NewBlockReader() + } + engine := initConsensusEngine(chainConfig, logger, allSnapshots) + + for !interrupt { + blockNum++ + trace = traceBlock > 0 && blockNum == uint64(traceBlock) + blockHash, err := blockReader.CanonicalHash(ctx, historyTx, blockNum) + if err != nil { + return err + } + + if blockNum <= block { + _, _, txAmount := rawdb.ReadBody(historyTx, blockHash, blockNum) + + // Skip that block, but increase txNum + txNum += uint64(txAmount) + 2 // Pre and Post block transaction + continue + } + + block, _, err := blockReader.BlockWithSenders(ctx, historyTx, blockHash, blockNum) + if err != nil { + return err + } + if block == nil { + log.Info("history: block is nil", "block", blockNum) + break + } + if err = w.Reset(blockNum, rwTx); err != nil { + return err + } + + r := agg.MakeStateReader(blockNum, rwTx) + readWrapper := &ReaderWrapper{r: r, blockNum: blockNum} + writeWrapper := &WriterWrapper{w: w, blockNum: blockNum} + getHeader := func(hash common.Hash, number uint64) *types.Header { + h, err := blockReader.Header(ctx, historyTx, hash, number) + if err != nil { + panic(err) + } + return h + } + + txNum++ // Pre-block transaction + + if txNum, _, err = processBlock(trace, txNum, readWrapper, writeWrapper, chainConfig, engine, getHeader, block, vmConfig); err != nil { + return fmt.Errorf("processing block %d: %w", blockNum, err) + } + if err := w.FinishTx(txNum, trace); err != nil { + return fmt.Errorf("failed to finish tx: %w", err) + } + if trace { + fmt.Printf("FinishTx called for %d block %d\n", txNum, blockNum) + } + + txNum++ // Post-block transaction + + // Check for interrupts + select { + case interrupt = <-interruptCh: + log.Info(fmt.Sprintf("interrupted, please wait for cleanup, next time start with --block %d", blockNum)) + default: + } + + if commitments && (interrupt || blockNum%uint64(commitmentFrequency) == 0) { + if rootHash, err = w.ComputeCommitment(trace /* trace */); err != nil { + return err + } + if !blockRootMismatchExpected { + if !bytes.Equal(rootHash, block.Header().Root[:]) { + return fmt.Errorf("root hash mismatch for block %d, expected [%x], was [%x]", blockNum, block.Header().Root[:], rootHash) + } + } + } + if err = w.Aggregate(trace); err != nil { + return err + } + // Commit transaction only when interrupted or just before computing commitment (so it can be re-done) + commit := interrupt + if !commit && (blockNum+1)%uint64(commitmentFrequency) == 0 { + var spaceDirty uint64 + if spaceDirty, _, err = rwTx.(*mdbx.MdbxTx).SpaceDirty(); err != nil { + return fmt.Errorf("retrieving spaceDirty: %w", err) + } + if spaceDirty >= dirtySpaceThreshold { + log.Info("Initiated tx commit", "block", blockNum, "space dirty", libcommon.ByteCount(spaceDirty)) + commit = true + } + } + if commit { + if err = rwTx.Commit(); err != nil { + return err + } + if !interrupt { + if rwTx, err = db.BeginRw(ctx); err != nil { + return err + } + } + } + } + + aStats := agg.Stats() + statx.delta(aStats, blockNum).print(aStats, logger) + if w != nil { + w.Close() + } + return nil +} + +type stat struct { + blockNum uint64 + hits uint64 + misses uint64 + prevBlock uint64 + prevMisses uint64 + prevHits uint64 + hitMissRatio float64 + speed float64 + prevTime time.Time + mem runtime.MemStats +} + +func (s *stat) print(aStats aggregator.FilesStats, logger log.Logger) { + totalFiles := aStats.AccountsCount + aStats.CodeCount + aStats.StorageCount + aStats.CommitmentCount + totalDatSize := aStats.AccountsDatSize + aStats.CodeDatSize + aStats.StorageDatSize + aStats.CommitmentDatSize + totalIdxSize := aStats.AccountsIdxSize + aStats.CodeIdxSize + aStats.StorageIdxSize + aStats.CommitmentIdxSize + + logger.Info("Progress", "block", s.blockNum, "blk/s", s.speed, "state files", totalFiles, + "accounts", libcommon.ByteCount(uint64(aStats.AccountsDatSize+aStats.AccountsIdxSize)), + "code", libcommon.ByteCount(uint64(aStats.CodeDatSize+aStats.CodeIdxSize)), + "storage", libcommon.ByteCount(uint64(aStats.StorageDatSize+aStats.StorageIdxSize)), + "commitment", libcommon.ByteCount(uint64(aStats.CommitmentDatSize+aStats.CommitmentIdxSize)), + "total dat", libcommon.ByteCount(uint64(totalDatSize)), "total idx", libcommon.ByteCount(uint64(totalIdxSize)), + "hit ratio", s.hitMissRatio, "hits+misses", s.hits+s.misses, + "alloc", libcommon.ByteCount(s.mem.Alloc), "sys", libcommon.ByteCount(s.mem.Sys), + ) +} + +func (s *stat) delta(aStats aggregator.FilesStats, blockNum uint64) *stat { + currentTime := time.Now() + libcommon.ReadMemStats(&s.mem) + + interval := currentTime.Sub(s.prevTime).Seconds() + s.blockNum = blockNum + s.speed = float64(s.blockNum-s.prevBlock) / interval + s.prevBlock = blockNum + s.prevTime = currentTime + + s.hits = aStats.Hits - s.prevHits + s.misses = aStats.Misses - s.prevMisses + s.prevHits = aStats.Hits + s.prevMisses = aStats.Misses + + total := s.hits + s.misses + if total > 0 { + s.hitMissRatio = float64(s.hits) / float64(total) + } + return s +} + +func processBlock(trace bool, txNumStart uint64, rw *ReaderWrapper, ww *WriterWrapper, chainConfig *params.ChainConfig, engine consensus.Engine, getHeader func(hash common.Hash, number uint64) *types.Header, block *types.Block, vmConfig vm.Config) (uint64, types.Receipts, error) { + defer blockExecutionTimer.UpdateDuration(time.Now()) + + header := block.Header() + vmConfig.TraceJumpDest = true + gp := new(core.GasPool).AddGas(block.GasLimit()) + usedGas := new(uint64) + var receipts types.Receipts + daoBlock := chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 + rules := chainConfig.Rules(block.NumberU64()) + txNum := txNumStart + + for i, tx := range block.Transactions() { + ibs := state.New(rw) + if daoBlock { + misc.ApplyDAOHardFork(ibs) + daoBlock = false + } + ibs.Prepare(tx.Hash(), block.Hash(), i) + receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, ww, header, tx, usedGas, vmConfig, nil) + if err != nil { + return 0, nil, fmt.Errorf("could not apply tx %d [%x] failed: %w", i, tx.Hash(), err) + } + receipts = append(receipts, receipt) + if err = ww.w.FinishTx(txNum, trace); err != nil { + return 0, nil, fmt.Errorf("finish tx %d [%x] failed: %w", i, tx.Hash(), err) + } + if trace { + fmt.Printf("FinishTx called for %d [%x]\n", txNum, tx.Hash()) + } + txNum++ + } + + ibs := state.New(rw) + + // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) + if _, _, _, err := engine.FinalizeAndAssemble(chainConfig, header, ibs, block.Transactions(), block.Uncles(), receipts, nil, nil, nil, nil); err != nil { + return 0, nil, fmt.Errorf("finalize of block %d failed: %w", block.NumberU64(), err) + } + + if err := ibs.CommitBlock(rules, ww); err != nil { + return 0, nil, fmt.Errorf("committing block %d failed: %w", block.NumberU64(), err) + } + + return txNum, receipts, nil +} + +// Implements StateReader and StateWriter +type ReaderWrapper struct { + blockNum uint64 + r *aggregator.Reader +} + +type WriterWrapper struct { + blockNum uint64 + w *aggregator.Writer +} + +func bytesToUint64(buf []byte) (x uint64) { + for i, b := range buf { + x = x<<8 + uint64(b) + if i == 7 { + return + } + } + return +} + +func (rw *ReaderWrapper) ReadAccountData(address common.Address) (*accounts.Account, error) { + enc, err := rw.r.ReadAccountData(address.Bytes(), false /* trace */) + if err != nil { + return nil, err + } + if len(enc) == 0 { + return nil, nil + } + + var a accounts.Account + a.Reset() + pos := 0 + nonceBytes := int(enc[pos]) + pos++ + if nonceBytes > 0 { + a.Nonce = bytesToUint64(enc[pos : pos+nonceBytes]) + pos += nonceBytes + } + balanceBytes := int(enc[pos]) + pos++ + if balanceBytes > 0 { + a.Balance.SetBytes(enc[pos : pos+balanceBytes]) + pos += balanceBytes + } + codeHashBytes := int(enc[pos]) + pos++ + if codeHashBytes > 0 { + copy(a.CodeHash[:], enc[pos:pos+codeHashBytes]) + pos += codeHashBytes + } + incBytes := int(enc[pos]) + pos++ + if incBytes > 0 { + a.Incarnation = bytesToUint64(enc[pos : pos+incBytes]) + } + return &a, nil +} + +func (rw *ReaderWrapper) ReadAccountStorage(address common.Address, incarnation uint64, key *common.Hash) ([]byte, error) { + trace := false + enc, err := rw.r.ReadAccountStorage(address.Bytes(), key.Bytes(), trace) + if err != nil { + return nil, err + } + if enc == nil { + return nil, nil + } + return enc, nil +} + +func (rw *ReaderWrapper) ReadAccountCode(address common.Address, incarnation uint64, codeHash common.Hash) ([]byte, error) { + return rw.r.ReadAccountCode(address.Bytes(), false /* trace */) +} + +func (rw *ReaderWrapper) ReadAccountCodeSize(address common.Address, incarnation uint64, codeHash common.Hash) (int, error) { + return rw.r.ReadAccountCodeSize(address.Bytes(), false /* trace */) +} + +func (rw *ReaderWrapper) ReadAccountIncarnation(address common.Address) (uint64, error) { + return 0, nil +} + +func (ww *WriterWrapper) UpdateAccountData(address common.Address, original, account *accounts.Account) error { + var l int + l++ + if account.Nonce > 0 { + l += (bits.Len64(account.Nonce) + 7) / 8 + } + l++ + if !account.Balance.IsZero() { + l += account.Balance.ByteLen() + } + l++ + if !account.IsEmptyCodeHash() { + l += 32 + } + l++ + if account.Incarnation > 0 { + l += (bits.Len64(account.Incarnation) + 7) / 8 + } + value := make([]byte, l) + pos := 0 + if account.Nonce == 0 { + value[pos] = 0 + pos++ + } else { + nonceBytes := (bits.Len64(account.Nonce) + 7) / 8 + value[pos] = byte(nonceBytes) + var nonce = account.Nonce + for i := nonceBytes; i > 0; i-- { + value[pos+i] = byte(nonce) + nonce >>= 8 + } + pos += nonceBytes + 1 + } + if account.Balance.IsZero() { + value[pos] = 0 + pos++ + } else { + balanceBytes := account.Balance.ByteLen() + value[pos] = byte(balanceBytes) + pos++ + account.Balance.WriteToSlice(value[pos : pos+balanceBytes]) + pos += balanceBytes + } + if account.IsEmptyCodeHash() { + value[pos] = 0 + pos++ + } else { + value[pos] = 32 + pos++ + copy(value[pos:pos+32], account.CodeHash[:]) + pos += 32 + } + if account.Incarnation == 0 { + value[pos] = 0 + } else { + incBytes := (bits.Len64(account.Incarnation) + 7) / 8 + value[pos] = byte(incBytes) + var inc = account.Incarnation + for i := incBytes; i > 0; i-- { + value[pos+i] = byte(inc) + inc >>= 8 + } + } + if err := ww.w.UpdateAccountData(address.Bytes(), value, false /* trace */); err != nil { + return err + } + return nil +} + +func (ww *WriterWrapper) UpdateAccountCode(address common.Address, incarnation uint64, codeHash common.Hash, code []byte) error { + if err := ww.w.UpdateAccountCode(address.Bytes(), code, false /* trace */); err != nil { + return err + } + return nil +} + +func (ww *WriterWrapper) DeleteAccount(address common.Address, original *accounts.Account) error { + if err := ww.w.DeleteAccount(address.Bytes(), false /* trace */); err != nil { + return err + } + return nil +} + +func (ww *WriterWrapper) WriteAccountStorage(address common.Address, incarnation uint64, key *common.Hash, original, value *uint256.Int) error { + trace := false + if trace { + fmt.Printf("block %d, WriteAccountStorage %x %x, original %s, value %s\n", ww.blockNum, address, *key, original, value) + } + if err := ww.w.WriteAccountStorage(address.Bytes(), key.Bytes(), value.Bytes(), trace); err != nil { + return err + } + return nil +} + +func (ww *WriterWrapper) CreateContract(address common.Address) error { + return nil +} + +func initConsensusEngine(chainConfig *params.ChainConfig, logger log.Logger, snapshots *snapshotsync.RoSnapshots) (engine consensus.Engine) { + config := ethconfig.Defaults + + switch { + case chainConfig.Clique != nil: + c := params.CliqueSnapshot + c.DBPath = filepath.Join(datadir, "clique", "db") + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, c, config.Miner.Notify, config.Miner.Noverify, "", true, datadir, snapshots) + case chainConfig.Aura != nil: + consensusConfig := ¶ms.AuRaConfig{DBPath: filepath.Join(datadir, "aura")} + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify, "", true, datadir, snapshots) + case chainConfig.Parlia != nil: + consensusConfig := ¶ms.ParliaConfig{DBPath: filepath.Join(datadir, "parlia")} + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify, "", true, datadir, snapshots) + case chainConfig.Bor != nil: + consensusConfig := &config.Bor + engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify, "http://localhost:1317", false, datadir, snapshots) + default: //ethash + engine = ethash.NewFaker() + } + return +} diff --git a/cmd/state/commands/global_flags_vars.go b/cmd/state/commands/global_flags_vars.go index 71df5183d92..547f1b8a2d6 100644 --- a/cmd/state/commands/global_flags_vars.go +++ b/cmd/state/commands/global_flags_vars.go @@ -2,6 +2,7 @@ package commands import ( "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/common/paths" "github.com/spf13/cobra" ) @@ -9,12 +10,12 @@ import ( var ( datadir string chaindata string - snapshotDir string - snapshotMode string statsfile string block uint64 changeSetBucket string indexBucket string + snapshotsCli bool + chain string ) func must(err error) { @@ -24,19 +25,15 @@ func must(err error) { } func withBlock(cmd *cobra.Command) { - cmd.Flags().Uint64Var(&block, "block", 1, "specifies a block number for operation") + cmd.Flags().Uint64Var(&block, "block", 0, "specifies a block number for operation") } -func withDatadir(cmd *cobra.Command) { +func withDataDir(cmd *cobra.Command) { cmd.Flags().StringVar(&datadir, "datadir", paths.DefaultDataDir(), "data directory for temporary ELT files") must(cmd.MarkFlagDirname("datadir")) cmd.Flags().StringVar(&chaindata, "chaindata", "", "path to the db") must(cmd.MarkFlagDirname("chaindata")) - - cmd.Flags().StringVar(&snapshotMode, "snapshot.mode", "", "set of snapshots to use") - cmd.Flags().StringVar(&snapshotDir, "snapshot.dir", "", "snapshot dir") - must(cmd.MarkFlagDirname("snapshot.dir")) } func withStatsfile(cmd *cobra.Command) { @@ -51,3 +48,11 @@ func withCSBucket(cmd *cobra.Command) { func withIndexBucket(cmd *cobra.Command) { cmd.Flags().StringVar(&indexBucket, "index-bucket", kv.AccountsHistory, kv.AccountsHistory+" for account and "+kv.StorageHistory+" for storage") } + +func withSnapshotBlocks(cmd *cobra.Command) { + cmd.Flags().BoolVar(&snapshotsCli, "snapshots", true, utils.SnapshotFlag.Usage) +} + +func withChain(cmd *cobra.Command) { + cmd.Flags().StringVar(&chain, "chain", "", "pick a chain to assume (mainnet, ropsten, etc.)") +} diff --git a/cmd/state/commands/history2.go b/cmd/state/commands/history2.go new file mode 100644 index 00000000000..63332bcb0b0 --- /dev/null +++ b/cmd/state/commands/history2.go @@ -0,0 +1,249 @@ +package commands + +import ( + "context" + "fmt" + "os" + "os/signal" + "path" + "path/filepath" + "syscall" + "time" + + "github.com/ledgerwatch/erigon-lib/aggregator" + kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/consensus/misc" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/types/accounts" + "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" +) + +var ( + blockTo int + traceBlock int +) + +func init() { + withBlock(history2Cmd) + withDataDir(history2Cmd) + history2Cmd.Flags().IntVar(&traceBlock, "traceblock", 0, "block number at which to turn on tracing") + history2Cmd.Flags().IntVar(&blockTo, "blockto", 0, "block number to stop replay of history at") + rootCmd.AddCommand(history2Cmd) +} + +var history2Cmd = &cobra.Command{ + Use: "history2", + Short: "Exerimental command to re-execute historical transactions in erigon2 format", + RunE: func(cmd *cobra.Command, args []string) error { + logger := log.New() + return History2(genesis, logger) + }, +} + +func History2(genesis *core.Genesis, logger log.Logger) error { + sigs := make(chan os.Signal, 1) + interruptCh := make(chan bool, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + interruptCh <- true + }() + historyDb, err := kv2.NewMDBX(logger).Path(path.Join(datadir, "chaindata")).Open() + if err != nil { + return fmt.Errorf("opening chaindata as read only: %v", err) + } + defer historyDb.Close() + ctx := context.Background() + historyTx, err1 := historyDb.BeginRo(ctx) + if err1 != nil { + return err1 + } + defer historyTx.Rollback() + aggPath := filepath.Join(datadir, "aggregator") + h, err3 := aggregator.NewHistory(aggPath, uint64(blockTo), aggregationStep) + if err3 != nil { + return fmt.Errorf("create history: %w", err3) + } + defer h.Close() + chainConfig := genesis.Config + vmConfig := vm.Config{} + + interrupt := false + blockNum := uint64(0) + var txNum uint64 = 2 + trace := false + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + prevBlock := blockNum + prevTime := time.Now() + for !interrupt { + select { + default: + case <-logEvery.C: + currentTime := time.Now() + interval := currentTime.Sub(prevTime) + speed := float64(blockNum-prevBlock) / (float64(interval) / float64(time.Second)) + prevBlock = blockNum + prevTime = currentTime + log.Info("Progress", "block", blockNum, "blk/s", speed) + } + blockNum++ + if blockNum > uint64(blockTo) { + break + } + blockHash, err := rawdb.ReadCanonicalHash(historyTx, blockNum) + if err != nil { + return err + } + if blockNum <= block { + _, _, txAmount := rawdb.ReadBody(historyTx, blockHash, blockNum) + // Skip that block, but increase txNum + txNum += uint64(txAmount) + 2 + continue + } + var b *types.Block + b, _, err = rawdb.ReadBlockWithSenders(historyTx, blockHash, blockNum) + if err != nil { + return err + } + if b == nil { + break + } + r := h.MakeHistoryReader() + readWrapper := &HistoryWrapper{r: r} + if traceBlock != 0 { + readWrapper.trace = blockNum == uint64(traceBlock) + } + writeWrapper := state.NewNoopWriter() + txNum++ // Pre block transaction + getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(historyTx, hash, number) } + if txNum, _, err = runHistory2(trace, blockNum, txNum, readWrapper, writeWrapper, chainConfig, getHeader, b, vmConfig); err != nil { + return fmt.Errorf("block %d: %w", blockNum, err) + } + txNum++ // Post block transaction + // Check for interrupts + select { + case interrupt = <-interruptCh: + log.Info(fmt.Sprintf("interrupted, please wait for cleanup, next time start with --block %d", blockNum)) + default: + } + } + return nil +} + +func runHistory2(trace bool, blockNum, txNumStart uint64, hw *HistoryWrapper, ww state.StateWriter, chainConfig *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, block *types.Block, vmConfig vm.Config) (uint64, types.Receipts, error) { + header := block.Header() + vmConfig.TraceJumpDest = true + engine := ethash.NewFullFaker() + gp := new(core.GasPool).AddGas(block.GasLimit()) + usedGas := new(uint64) + var receipts types.Receipts + daoBlock := chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 + txNum := txNumStart + for i, tx := range block.Transactions() { + hw.r.SetNums(blockNum, txNum, false) + ibs := state.New(hw) + if daoBlock { + misc.ApplyDAOHardFork(ibs) + daoBlock = false + } + ibs.Prepare(tx.Hash(), block.Hash(), i) + receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, ww, header, tx, usedGas, vmConfig, nil) + if err != nil { + return 0, nil, fmt.Errorf("could not apply tx %d [%x] failed: %w", i, tx.Hash(), err) + } + if traceBlock != 0 && blockNum == uint64(traceBlock) { + fmt.Printf("tx idx %d, num %d, gas used %d\n", i, txNum, receipt.GasUsed) + } + receipts = append(receipts, receipt) + txNum++ + } + + return txNum, receipts, nil +} + +// Implements StateReader and StateWriter +type HistoryWrapper struct { + r *aggregator.HistoryReader + trace bool +} + +func (hw *HistoryWrapper) ReadAccountData(address common.Address) (*accounts.Account, error) { + enc, err := hw.r.ReadAccountData(address.Bytes(), hw.trace) + if err != nil { + return nil, err + } + if len(enc) == 0 { + return nil, nil + } + var a accounts.Account + a.Reset() + pos := 0 + nonceBytes := int(enc[pos]) + pos++ + if nonceBytes > 0 { + a.Nonce = bytesToUint64(enc[pos : pos+nonceBytes]) + pos += nonceBytes + } + balanceBytes := int(enc[pos]) + pos++ + if balanceBytes > 0 { + a.Balance.SetBytes(enc[pos : pos+balanceBytes]) + pos += balanceBytes + } + codeHashBytes := int(enc[pos]) + pos++ + if codeHashBytes > 0 { + copy(a.CodeHash[:], enc[pos:pos+codeHashBytes]) + pos += codeHashBytes + } + if pos >= len(enc) { + fmt.Printf("panic ReadAccountData(%x)=>[%x]\n", address, enc) + } + incBytes := int(enc[pos]) + pos++ + if incBytes > 0 { + a.Incarnation = bytesToUint64(enc[pos : pos+incBytes]) + } + return &a, nil +} + +func (hw *HistoryWrapper) ReadAccountStorage(address common.Address, incarnation uint64, key *common.Hash) ([]byte, error) { + enc, err := hw.r.ReadAccountStorage(address.Bytes(), key.Bytes(), hw.trace) + if hw.trace { + if enc == nil { + fmt.Printf("ReadAccountStorage [%x] [%x] => []\n", address, key.Bytes()) + } else { + fmt.Printf("ReadAccountStorage [%x] [%x] => [%x]\n", address, key.Bytes(), enc.Bytes()) + } + } + if err != nil { + fmt.Printf("%v\n", err) + return nil, err + } + if enc == nil { + return nil, nil + } + return enc.Bytes(), nil +} + +func (hw *HistoryWrapper) ReadAccountCode(address common.Address, incarnation uint64, codeHash common.Hash) ([]byte, error) { + return hw.r.ReadAccountCode(address.Bytes(), false /* trace */) +} + +func (hw *HistoryWrapper) ReadAccountCodeSize(address common.Address, incarnation uint64, codeHash common.Hash) (int, error) { + return hw.r.ReadAccountCodeSize(address.Bytes(), false /* trace */) +} + +func (hw *HistoryWrapper) ReadAccountIncarnation(address common.Address) (uint64, error) { + return 0, nil +} diff --git a/cmd/state/commands/index_stats.go b/cmd/state/commands/index_stats.go index e27f00dd161..907f2fbe3cf 100644 --- a/cmd/state/commands/index_stats.go +++ b/cmd/state/commands/index_stats.go @@ -6,7 +6,7 @@ import ( ) func init() { - withDatadir(indexStatsCmd) + withDataDir(indexStatsCmd) withStatsfile(indexStatsCmd) withIndexBucket(indexStatsCmd) rootCmd.AddCommand(indexStatsCmd) diff --git a/cmd/state/commands/opcode_tracer.go b/cmd/state/commands/opcode_tracer.go index edfd3fa64ba..522f74c60be 100644 --- a/cmd/state/commands/opcode_tracer.go +++ b/cmd/state/commands/opcode_tracer.go @@ -15,19 +15,22 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" + "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/consensus/misc" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/systemcontracts" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/core/vm/stack" + "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" ) var ( @@ -38,7 +41,7 @@ var ( func init() { withBlock(opcodeTracerCmd) - withDatadir(opcodeTracerCmd) + withDataDir(opcodeTracerCmd) opcodeTracerCmd.Flags().Uint64Var(&numBlocks, "numBlocks", 1, "number of blocks to run the operation on") opcodeTracerCmd.Flags().BoolVar(&saveOpcodes, "saveOpcodes", false, "set to save the opcodes") opcodeTracerCmd.Flags().BoolVar(&saveBBlocks, "saveBBlocks", false, "set to save the basic blocks") @@ -154,7 +157,7 @@ type blockTxs struct { Txs slicePtrTx } -func (ot *opcodeTracer) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { +func (ot *opcodeTracer) CaptureStart(env *vm.EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, code []byte) { //fmt.Fprint(ot.summary, ot.lastLine) // When a CaptureStart is called, a Tx is starting. Create its entry in our list and initialize it with the partial data available @@ -180,11 +183,9 @@ func (ot *opcodeTracer) CaptureStart(depth int, from common.Address, to common.A // take note in our own stack that the tx stack has grown ot.stack = append(ot.stack, &newTx) - - return nil } -func (ot *opcodeTracer) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { +func (ot *opcodeTracer) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { // When a CaptureEnd is called, a Tx has finished. Pop our stack ls := len(ot.stack) currentEntry := ot.stack[ls-1] @@ -215,11 +216,11 @@ func (ot *opcodeTracer) CaptureEnd(depth int, output []byte, gasUsed uint64, t t currentEntry.Fault = errstr } - return nil } -func (ot *opcodeTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, st *stack.Stack, rData []byte, contract *vm.Contract, opDepth int, err error) error { +func (ot *opcodeTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, opDepth int, err error) { //CaptureState sees the system as it is before the opcode is run. It seems to never get an error. + contract := scope.Contract //sanity check if pc > uint64(MaxUint16) { @@ -227,7 +228,7 @@ func (ot *opcodeTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, } pc16 := uint16(pc) - currentTxHash := env.TxHash + currentTxHash := env.TxContext().TxHash currentTxDepth := opDepth - 1 ls := len(ot.stack) @@ -349,16 +350,14 @@ func (ot *opcodeTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, currentEntry.lastPc16 = pc16 currentEntry.lastOp = op - return nil } -func (ot *opcodeTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, contract *vm.Contract, opDepth int, err error) error { +func (ot *opcodeTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, opDepth int, err error) { // CaptureFault sees the system as it is after the fault happens // CaptureState might have already recorded the opcode before it failed. Let's centralize the processing there. - e := ot.CaptureState(env, pc, op, gas, cost, memory, stack, nil, contract, opDepth, err) + ot.CaptureState(env, pc, op, gas, cost, scope, nil, opDepth, err) - return e } func (ot *opcodeTracer) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { @@ -433,14 +432,16 @@ func OpcodeTracer(genesis *core.Genesis, blockNum uint64, chaindata string, numB } if fops == nil { - fops, e = os.Create("./opcodes-" + bnStr) - check(e) + if fops, e = os.Create("./opcodes-" + bnStr); e != nil { + panic(e) + } fopsWriter = bufio.NewWriter(fops) fopsEnc = gob.NewEncoder(fopsWriter) } - e = fopsEnc.Encode(blockTxs) - check(e) + if e = fopsEnc.Encode(blockTxs); e != nil { + panic(e) + } } @@ -477,38 +478,45 @@ func OpcodeTracer(genesis *core.Genesis, blockNum uint64, chaindata string, numB bnStr := strconv.Itoa(int(bn)) if f != nil && bn%1000 == 0 { - _, e = fWriter.WriteString("\n}") - check(e) + if _, e = fWriter.WriteString("\n}"); e != nil { + panic(e) + } fWriter.Flush() f.Close() f = nil } if f == nil { - f, e = os.Create("./bblocks-" + bnStr + ".json") - check(e) + if f, e = os.Create("./bblocks-" + bnStr + ".json"); e != nil { + panic(e) + } fWriter = bufio.NewWriter(f) fwEnc = json.NewEncoder(fWriter) } - _, e = fWriter.WriteString(",\n\"" + bnStr + "\":[\n") - check(e) + if _, e = fWriter.WriteString(",\n\"" + bnStr + "\":[\n"); e != nil { + panic(e) + } for i := uint(0); i < sp.NumTxs; i++ { if i != 0 { - _, e = fWriter.WriteString(",") - check(e) + if _, e = fWriter.WriteString(","); e != nil { + panic(e) + } } sd := <-chanSegDump - e = fwEnc.Encode(sd) - check(e) + if e = fwEnc.Encode(sd); e != nil { + panic(e) + } + } + if _, e = fWriter.WriteString("]"); e != nil { + panic(e) } - _, e = fWriter.WriteString("]") - check(e) } if fWriter != nil { - _, e = fWriter.WriteString("\n}") - check(e) + if _, e = fWriter.WriteString("\n}"); e != nil { + panic(e) + } fWriter.Flush() f.Close() f = nil @@ -539,23 +547,26 @@ func OpcodeTracer(genesis *core.Genesis, blockNum uint64, chaindata string, numB if fsum == nil { var err error - fsum, err = os.Create("./summary-" + bnStr) - check(err) + if fsum, err = os.Create("./summary-" + bnStr); err != nil { + return err + } + ot.fsumWriter = bufio.NewWriter(fsum) } - dbstate := state.NewPlainState(historyTx, block.NumberU64()-1) + dbstate := state.NewPlainState(historyTx, block.NumberU64()) intraBlockState := state.New(dbstate) intraBlockState.SetTracer(ot) getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(historyTx, hash, number) } - receipts, err1 := runBlock(intraBlockState, noOpWriter, noOpWriter, chainConfig, getHeader, nil /* checkTEVM */, block, vmConfig) + contractHasTEVM := ethdb.GetHasTEVM(historyTx) + receipts, err1 := runBlock(ethash.NewFullFaker(), intraBlockState, noOpWriter, noOpWriter, chainConfig, getHeader, contractHasTEVM, block, vmConfig) if err1 != nil { return err1 } - if chainConfig.IsByzantium(block.Number().Uint64()) { + if chainConfig.IsByzantium(block.NumberU64()) { receiptSha := types.DeriveSha(receipts) - if receiptSha != block.Header().ReceiptHash { + if receiptSha != block.ReceiptHash() { return fmt.Errorf("mismatched receipt headers for block %d", block.NumberU64()) } } @@ -640,7 +651,9 @@ func OpcodeTracer(genesis *core.Genesis, blockNum uint64, chaindata string, numB ot.fsumWriter.Flush() fi, err := fsum.Stat() - check(err) + if err != nil { + return err + } // if the summary file for the just-finished range of blocks is empty, delete it if fi.Size() == 0 { os.Remove(fi.Name()) @@ -657,41 +670,36 @@ func OpcodeTracer(genesis *core.Genesis, blockNum uint64, chaindata string, numB return nil } -func check(e error) { - if e != nil { - panic(e) - } -} - -func runBlock(ibs *state.IntraBlockState, txnWriter state.StateWriter, blockWriter state.StateWriter, - chainConfig *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), block *types.Block, vmConfig vm.Config) (types.Receipts, error) { +func runBlock(engine consensus.Engine, ibs *state.IntraBlockState, txnWriter state.StateWriter, blockWriter state.StateWriter, + chainConfig *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, contractHasTEVM func(common.Hash) (bool, error), block *types.Block, vmConfig vm.Config) (types.Receipts, error) { header := block.Header() vmConfig.TraceJumpDest = true - engine := ethash.NewFullFaker() gp := new(core.GasPool).AddGas(block.GasLimit()) usedGas := new(uint64) var receipts types.Receipts if chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 { misc.ApplyDAOHardFork(ibs) } + systemcontracts.UpgradeBuildInSystemContract(chainConfig, header.Number, ibs) rules := chainConfig.Rules(block.NumberU64()) for i, tx := range block.Transactions() { ibs.Prepare(tx.Hash(), block.Hash(), i) - receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, txnWriter, header, tx, usedGas, vmConfig, checkTEVM) + receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, txnWriter, header, tx, usedGas, vmConfig, contractHasTEVM) if err != nil { - return nil, fmt.Errorf("could not apply tx %d [%x] failed: %v", i, tx.Hash(), err) + return nil, fmt.Errorf("could not apply tx %d [%x] failed: %w", i, tx.Hash(), err) } receipts = append(receipts, receipt) } if !vmConfig.ReadOnly { // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) - if _, err := engine.FinalizeAndAssemble(chainConfig, header, ibs, block.Transactions(), block.Uncles(), receipts, nil, nil, nil, nil); err != nil { - return nil, fmt.Errorf("finalize of block %d failed: %v", block.NumberU64(), err) + tx := block.Transactions() + if _, _, _, err := engine.FinalizeAndAssemble(chainConfig, header, ibs, tx, block.Uncles(), receipts, nil, nil, nil, nil); err != nil { + return nil, fmt.Errorf("finalize of block %d failed: %w", block.NumberU64(), err) } if err := ibs.CommitBlock(rules, blockWriter); err != nil { - return nil, fmt.Errorf("committing block %d failed: %v", block.NumberU64(), err) + return nil, fmt.Errorf("committing block %d failed: %w", block.NumberU64(), err) } } diff --git a/cmd/state/commands/regenerate_txlookup.go b/cmd/state/commands/regenerate_txlookup.go deleted file mode 100644 index da23e927396..00000000000 --- a/cmd/state/commands/regenerate_txlookup.go +++ /dev/null @@ -1,19 +0,0 @@ -package commands - -import ( - "github.com/ledgerwatch/erigon/cmd/state/generate" - "github.com/spf13/cobra" -) - -func init() { - withDatadir(regenerateTxLookupCmd) - rootCmd.AddCommand(regenerateTxLookupCmd) -} - -var regenerateTxLookupCmd = &cobra.Command{ - Use: "regenerateTxLookup", - Short: "Generate tx lookup index", - RunE: func(cmd *cobra.Command, args []string) error { - return generate.RegenerateTxLookup(chaindata) - }, -} diff --git a/cmd/state/commands/root.go b/cmd/state/commands/root.go index e1cece9867e..33cdb814f01 100644 --- a/cmd/state/commands/root.go +++ b/cmd/state/commands/root.go @@ -1,24 +1,24 @@ package commands import ( - "context" "encoding/json" "fmt" "os" - "os/signal" - "path" - "syscall" + "path/filepath" + + "github.com/ledgerwatch/erigon-lib/common" + "github.com/spf13/cobra" "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" + "github.com/ledgerwatch/erigon/params" ) var ( genesisPath string genesis *core.Genesis + chainConfig *params.ChainConfig ) func init() { @@ -26,24 +26,6 @@ func init() { rootCmd.PersistentFlags().StringVar(&genesisPath, "genesis", "", "path to genesis.json file") } -func rootContext() context.Context { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - ch := make(chan os.Signal, 1) - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case <-ch: - log.Info("Got interrupt, shutting down...") - case <-ctx.Done(): - } - - cancel() - }() - return ctx -} - var rootCmd = &cobra.Command{ Use: "state", Short: "state is a utility for Stateless ethereum clients", @@ -52,12 +34,21 @@ var rootCmd = &cobra.Command{ panic(err) } - genesis = core.DefaultGenesisBlock() + genesis, chainConfig = getChainGenesisAndConfig() if genesisPath != "" { genesis = genesisFromFile(genesisPath) } + if genesis.Config != nil && genesis.Config.ChainID.Cmp(chainConfig.ChainID) != 0 { + utils.Fatalf("provided genesis.json chain configuration is invalid: expected chainId to be %v, got %v", + chainConfig.ChainID.String(), genesis.Config.ChainID.String()) + } + // Apply special hacks for BSC params + if chainConfig.Parlia != nil { + params.ApplyBinanceSmartChainParams() + } + if chaindata == "" { - chaindata = path.Join(datadir, "erigon", "chaindata") + chaindata = filepath.Join(datadir, "chaindata") } }, PersistentPostRun: func(cmd *cobra.Command, args []string) { @@ -79,8 +70,19 @@ func genesisFromFile(genesisPath string) *core.Genesis { return genesis } +func getChainGenesisAndConfig() (genesis *core.Genesis, chainConfig *params.ChainConfig) { + if chain == "" { + genesis, chainConfig = core.DefaultGenesisBlock(), params.MainnetChainConfig + } else { + genesis, chainConfig = core.DefaultGenesisBlockByChainName(chain), params.ChainConfigByChainName(chain) + } + return genesis, chainConfig +} + func Execute() { - if err := rootCmd.ExecuteContext(rootContext()); err != nil { + ctx, cancel := common.RootContext() + defer cancel() + if err := rootCmd.ExecuteContext(ctx); err != nil { fmt.Println(err) os.Exit(1) } diff --git a/cmd/state/commands/state_root.go b/cmd/state/commands/state_root.go new file mode 100644 index 00000000000..22dca7de421 --- /dev/null +++ b/cmd/state/commands/state_root.go @@ -0,0 +1,169 @@ +package commands + +import ( + "context" + "errors" + "fmt" + "os" + "os/signal" + "path" + "path/filepath" + "syscall" + + "github.com/ledgerwatch/erigon-lib/kv" + kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/eth/stagedsync" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/trie" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" +) + +func init() { + withBlock(stateRootCmd) + withDataDir(stateRootCmd) + rootCmd.AddCommand(stateRootCmd) +} + +var stateRootCmd = &cobra.Command{ + Use: "stateroot", + Short: "Exerimental command to re-execute blocks from beginning and compute state root", + RunE: func(cmd *cobra.Command, args []string) error { + logger := log.New() + return StateRoot(genesis, logger, block, datadir) + }, +} + +func StateRoot(genesis *core.Genesis, logger log.Logger, blockNum uint64, datadir string) error { + sigs := make(chan os.Signal, 1) + interruptCh := make(chan bool, 1) + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigs + interruptCh <- true + }() + historyDb, err := kv2.NewMDBX(logger).Path(path.Join(datadir, "chaindata")).Open() + if err != nil { + return err + } + defer historyDb.Close() + ctx := context.Background() + historyTx, err1 := historyDb.BeginRo(ctx) + if err1 != nil { + return err1 + } + defer historyTx.Rollback() + stateDbPath := filepath.Join(datadir, "staterootdb") + if _, err = os.Stat(stateDbPath); err != nil { + if !errors.Is(err, os.ErrNotExist) { + return err + } + } else if err = os.RemoveAll(stateDbPath); err != nil { + return err + } + db, err2 := kv2.NewMDBX(logger).Path(stateDbPath).Open() + if err2 != nil { + return err2 + } + defer db.Close() + chainConfig := genesis.Config + vmConfig := vm.Config{} + + noOpWriter := state.NewNoopWriter() + interrupt := false + block := uint64(0) + var rwTx kv.RwTx + defer func() { + rwTx.Rollback() + }() + if rwTx, err = db.BeginRw(ctx); err != nil { + return err + } + _, genesisIbs, err4 := genesis.ToBlock() + if err4 != nil { + return err4 + } + w := state.NewPlainStateWriter(rwTx, nil, 0) + if err = genesisIbs.CommitBlock(¶ms.Rules{}, w); err != nil { + return fmt.Errorf("cannot write state: %w", err) + } + if err = rwTx.Commit(); err != nil { + return err + } + var tx kv.Tx + defer func() { + if tx != nil { + tx.Rollback() + } + }() + for !interrupt { + block++ + if block >= blockNum { + break + } + blockHash, err := rawdb.ReadCanonicalHash(historyTx, block) + if err != nil { + return err + } + var b *types.Block + b, _, err = rawdb.ReadBlockWithSenders(historyTx, blockHash, block) + if err != nil { + return err + } + if b == nil { + break + } + if tx, err = db.BeginRo(ctx); err != nil { + return err + } + if rwTx, err = db.BeginRw(ctx); err != nil { + return err + } + w = state.NewPlainStateWriter(rwTx, nil, block) + r := state.NewPlainStateReader(tx) + intraBlockState := state.New(r) + getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(historyTx, hash, number) } + if _, err = runBlock(ethash.NewFullFaker(), intraBlockState, noOpWriter, w, chainConfig, getHeader, nil, b, vmConfig); err != nil { + return fmt.Errorf("block %d: %w", block, err) + } + if block+1 == blockNum { + if err = rwTx.ClearBucket(kv.HashedAccounts); err != nil { + return err + } + if err = rwTx.ClearBucket(kv.HashedStorage); err != nil { + return err + } + if err = stagedsync.PromoteHashedStateCleanly("hashedstate", rwTx, stagedsync.StageHashStateCfg(nil, stateDbPath), make(chan struct{})); err != nil { + return err + } + var root common.Hash + root, err = trie.CalcRoot("genesis", rwTx) + if err != nil { + return err + } + fmt.Printf("root for block %d=[%x]\n", block, root) + } + if block%1000 == 0 { + log.Info("Processed", "blocks", block) + } + // Check for interrupts + select { + case interrupt = <-interruptCh: + fmt.Println("interrupted, please wait for cleanup...") + default: + } + tx.Rollback() + if err = rwTx.Commit(); err != nil { + return err + } + } + return nil +} diff --git a/cmd/state/commands/verify_headers_snapshot.go b/cmd/state/commands/verify_headers_snapshot.go deleted file mode 100644 index 92395320b8a..00000000000 --- a/cmd/state/commands/verify_headers_snapshot.go +++ /dev/null @@ -1,24 +0,0 @@ -package commands - -import ( - "github.com/ledgerwatch/erigon/cmd/state/verify" - "github.com/ledgerwatch/log/v3" - "github.com/spf13/cobra" -) - -func init() { - withDatadir(verifyHeadersSnapshotCmd) - rootCmd.AddCommand(verifyHeadersSnapshotCmd) -} - -var verifyHeadersSnapshotCmd = &cobra.Command{ - Use: "verifyHeadersSnapshot", - Short: "Verify headers snapshot", - RunE: func(cmd *cobra.Command, args []string) error { - if chaindata == "" && len(args) > 0 { - chaindata = args[0] - } - logger := log.New() - return verify.HeadersSnapshot(logger, chaindata) - }, -} diff --git a/cmd/state/commands/verify_txlookup.go b/cmd/state/commands/verify_txlookup.go index bd6dc75b3d1..660f6899934 100644 --- a/cmd/state/commands/verify_txlookup.go +++ b/cmd/state/commands/verify_txlookup.go @@ -6,7 +6,7 @@ import ( ) func init() { - withDatadir(verifyTxLookupCmd) + withDataDir(verifyTxLookupCmd) rootCmd.AddCommand(verifyTxLookupCmd) } diff --git a/cmd/state/generate/regenerate_tx_lookup.go b/cmd/state/generate/regenerate_tx_lookup.go deleted file mode 100644 index 89b388a9f5e..00000000000 --- a/cmd/state/generate/regenerate_tx_lookup.go +++ /dev/null @@ -1,59 +0,0 @@ -package generate - -import ( - "context" - "os" - "os/signal" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/eth/stagedsync" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/ethdb/prune" - "github.com/ledgerwatch/log/v3" -) - -func RegenerateTxLookup(chaindata string) error { - db := mdbx.MustOpen(chaindata) - defer db.Close() - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - if err := tx.ClearBucket(kv.TxLookup); err != nil { - return err - } - - startTime := time.Now() - ch := make(chan os.Signal, 1) - quitCh := make(chan struct{}) - signal.Notify(ch, os.Interrupt) - go func() { - <-ch - close(quitCh) - }() - - pm, err := prune.Get(tx) - if err != nil { - return err - } - lastExecutedBlock, err := stages.GetStageProgress(tx, stages.Execution) - if err != nil { - //There could be headers without block in the end - log.Error("Cant get last executed block", "err", err) - } - log.Info("TxLookup generation started", "start time", startTime) - err = stagedsync.TxLookupTransform("txlookup", tx, - dbutils.EncodeBlockNumber(pm.TxIndex.PruneTo(lastExecutedBlock)), - dbutils.EncodeBlockNumber(lastExecutedBlock+1), - quitCh, - stagedsync.StageTxLookupCfg(db, pm, os.TempDir())) - if err != nil { - return err - } - log.Info("TxLookup index is successfully regenerated", "it took", time.Since(startTime)) - return nil -} diff --git a/cmd/state/stats/index_stats.go b/cmd/state/stats/index_stats.go index 11a82336d40..6f75623c415 100644 --- a/cmd/state/stats/index_stats.go +++ b/cmd/state/stats/index_stats.go @@ -12,6 +12,8 @@ import ( "strings" "time" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/length" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/mdbx" "github.com/ledgerwatch/erigon/common" @@ -20,9 +22,9 @@ import ( func IndexStats(chaindata string, indexBucket string, statsFile string) error { db := mdbx.MustOpen(chaindata) startTime := time.Now() - lenOfKey := common.AddressLength + lenOfKey := length.Addr if strings.HasPrefix(indexBucket, kv.StorageHistory) { - lenOfKey = common.AddressLength + common.HashLength + common.IncarnationLength + lenOfKey = length.Addr + length.Hash + length.Incarnation } more1index := 0 @@ -53,27 +55,27 @@ func IndexStats(chaindata string, indexBucket string, statsFile string) error { added = true } if count > 10 { - more10index[string(common.CopyBytes(k[:lenOfKey]))] = count + more10index[string(libcommon.Copy(k[:lenOfKey]))] = count } if count > 50 { - more50index[string(common.CopyBytes(k[:lenOfKey]))] = count + more50index[string(libcommon.Copy(k[:lenOfKey]))] = count } if count > 100 { - more100index[string(common.CopyBytes(k[:lenOfKey]))] = count + more100index[string(libcommon.Copy(k[:lenOfKey]))] = count } if count > 200 { - more200index[string(common.CopyBytes(k[:lenOfKey]))] = count + more200index[string(libcommon.Copy(k[:lenOfKey]))] = count } if count > 500 { - more500index[string(common.CopyBytes(k[:lenOfKey]))] = count + more500index[string(libcommon.Copy(k[:lenOfKey]))] = count } if count > 1000 { - more1000index[string(common.CopyBytes(k[:lenOfKey]))] = count + more1000index[string(libcommon.Copy(k[:lenOfKey]))] = count } } else { added = false count = 1 - prevKey = common.CopyBytes(k[:common.AddressLength]) + prevKey = libcommon.Copy(k[:length.Addr]) } return nil @@ -101,7 +103,7 @@ func IndexStats(chaindata string, indexBucket string, statsFile string) error { NumOfIndexes uint64 }, 0, len(more10index)) for hash, v := range more10index { - p := []byte(hash)[:common.AddressLength] + p := []byte(hash)[:length.Addr] if len(p) == 0 { p = make([]byte, 20) } diff --git a/cmd/state/verify/check_changeset_enc.go b/cmd/state/verify/check_changeset_enc.go index bd1f49705d6..6d271941e9e 100644 --- a/cmd/state/verify/check_changeset_enc.go +++ b/cmd/state/verify/check_changeset_enc.go @@ -46,13 +46,19 @@ func CheckEnc(chaindata string) error { for { select { case v := <-ch: - blockNum, kk, vv := chainDataStorageDecoder(v.k, v.v) + blockNum, kk, vv, err := chainDataStorageDecoder(v.k, v.v) + if err != nil { + return err + } cs := changeset.NewStorageChangeSet() _ = cs.Add(v.k, v.v) atomic.AddUint64(¤tSize, uint64(len(v.v))) innerErr := testStorageEncoder(blockNum, cs, func(k, v []byte) error { atomic.AddUint64(&newSize, uint64(len(v))) - _, a, b := testStorageDecoder(k, v) + _, a, b, err := testStorageDecoder(k, v) + if err != nil { + return err + } if !bytes.Equal(kk, a) { return fmt.Errorf("incorrect order. block: %d", blockNum) } diff --git a/cmd/state/verify/check_indexes.go b/cmd/state/verify/check_indexes.go index f11b3459d50..de9489ba915 100644 --- a/cmd/state/verify/check_indexes.go +++ b/cmd/state/verify/check_indexes.go @@ -24,7 +24,7 @@ func CheckIndex(ctx context.Context, chaindata string, changeSetBucket string, i startTime := time.Now() i := 0 - if err := changeset.Walk(tx, changeSetBucket, nil, 0, func(blockN uint64, k, v []byte) (bool, error) { + if err := changeset.ForEach(tx, changeSetBucket, nil, func(blockN uint64, k, v []byte) error { i++ if i%100_000 == 0 { fmt.Printf("Processed %dK, %s\n", blockN/1000, time.Since(startTime)) @@ -32,17 +32,17 @@ func CheckIndex(ctx context.Context, chaindata string, changeSetBucket string, i select { default: case <-ctx.Done(): - return false, ctx.Err() + return ctx.Err() } bm, innerErr := bitmapdb.Get64(tx, indexBucket, dbutils.CompositeKeyWithoutIncarnation(k), blockN-1, blockN+1) if innerErr != nil { - return false, innerErr + return innerErr } if !bm.Contains(blockN) { - return false, fmt.Errorf("%v,%v", blockN, common.Bytes2Hex(k)) + return fmt.Errorf("%v,%v", blockN, common.Bytes2Hex(k)) } - return true, nil + return nil }); err != nil { return err } diff --git a/cmd/state/verify/verify_headers_snapshot.go b/cmd/state/verify/verify_headers_snapshot.go deleted file mode 100644 index 0debde447b1..00000000000 --- a/cmd/state/verify/verify_headers_snapshot.go +++ /dev/null @@ -1,57 +0,0 @@ -package verify - -import ( - "context" - "errors" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" -) - -func HeadersSnapshot(logger log.Logger, snapshotPath string) error { - snKV := mdbx.NewMDBX(logger).Path(snapshotPath).Readonly().WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.Headers: kv.TableCfgItem{}, - } - }).MustOpen() - var prevHeader *types.Header - err := snKV.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(kv.Headers) - if err != nil { - return err - } - k, v, innerErr := c.First() - for { - if len(k) == 0 && len(v) == 0 { - break - } - if innerErr != nil { - return innerErr - } - - header := new(types.Header) - innerErr := rlp.DecodeBytes(v, header) - if innerErr != nil { - return innerErr - } - - if prevHeader != nil { - if prevHeader.Number.Uint64()+1 != header.Number.Uint64() { - log.Error("invalid header number", "p", prevHeader.Number.Uint64(), "c", header.Number.Uint64()) - return errors.New("invalid header number") - } - if prevHeader.Hash() != header.ParentHash { - log.Error("invalid parent hash", "p", prevHeader.Hash(), "c", header.ParentHash) - return errors.New("invalid parent hash") - } - } - k, v, innerErr = c.Next() //nolint - prevHeader = header - } - return nil - }) - return err -} diff --git a/cmd/state/verify/verify_txlookup.go b/cmd/state/verify/verify_txlookup.go index 872f9398349..97fc5153464 100644 --- a/cmd/state/verify/verify_txlookup.go +++ b/cmd/state/verify/verify_txlookup.go @@ -9,9 +9,9 @@ import ( "os/signal" "time" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/log/v3" ) @@ -41,14 +41,14 @@ func ValidateTxLookups(chaindata string) error { // Validation Process blockBytes := big.NewInt(0) for !interrupt { - if err := common.Stopped(quitCh); err != nil { + if err := libcommon.Stopped(quitCh); err != nil { return err } blockHash, err := rawdb.ReadCanonicalHash(tx, blockNum) if err != nil { return err } - body := rawdb.ReadBody(tx, blockHash, blockNum) + body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blockNum) if body == nil { log.Error("Empty body", "blocknum", blockNum) diff --git a/cmd/txpool/main.go b/cmd/txpool/main.go new file mode 100644 index 00000000000..e09807036ea --- /dev/null +++ b/cmd/txpool/main.go @@ -0,0 +1,171 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "time" + + "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/direct" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon-lib/kv/remotedb" + "github.com/ledgerwatch/erigon-lib/kv/remotedbserver" + "github.com/ledgerwatch/erigon-lib/txpool" + "github.com/ledgerwatch/erigon-lib/txpool/txpooluitl" + "github.com/ledgerwatch/erigon-lib/types" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcdaemontest" + "github.com/ledgerwatch/erigon/cmd/utils" + common2 "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/paths" + "github.com/ledgerwatch/erigon/ethdb/privateapi" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/log/v3" + "github.com/spf13/cobra" +) + +var ( + sentryAddr []string // Address of the sentry : + traceSenders []string + privateApiAddr string + txpoolApiAddr string + datadir string // Path to td working dir + + TLSCertfile string + TLSCACert string + TLSKeyFile string + + pendingPoolLimit int + baseFeePoolLimit int + queuedPoolLimit int + + priceLimit uint64 + priceBump uint64 +) + +func init() { + utils.CobraFlags(rootCmd, append(debug.Flags, utils.MetricFlags...)) + rootCmd.Flags().StringSliceVar(&sentryAddr, "sentry.api.addr", []string{"localhost:9091"}, "comma separated sentry addresses ':,:'") + rootCmd.Flags().StringVar(&privateApiAddr, "private.api.addr", "localhost:9090", "execution service :") + rootCmd.Flags().StringVar(&txpoolApiAddr, "txpool.api.addr", "localhost:9094", "txpool service :") + rootCmd.Flags().StringVar(&datadir, utils.DataDirFlag.Name, paths.DefaultDataDir(), utils.DataDirFlag.Usage) + if err := rootCmd.MarkFlagDirname(utils.DataDirFlag.Name); err != nil { + panic(err) + } + rootCmd.PersistentFlags().StringVar(&TLSCertfile, "tls.cert", "", "certificate for client side TLS handshake") + rootCmd.PersistentFlags().StringVar(&TLSKeyFile, "tls.key", "", "key file for client side TLS handshake") + rootCmd.PersistentFlags().StringVar(&TLSCACert, "tls.cacert", "", "CA certificate for client side TLS handshake") + + rootCmd.PersistentFlags().IntVar(&pendingPoolLimit, "txpool.globalslots", txpool.DefaultConfig.PendingSubPoolLimit, "Maximum number of executable transaction slots for all accounts") + rootCmd.PersistentFlags().IntVar(&baseFeePoolLimit, "txpool.globalbasefeeeslots", txpool.DefaultConfig.BaseFeeSubPoolLimit, "Maximum number of non-executable transactions where only not enough baseFee") + rootCmd.PersistentFlags().IntVar(&queuedPoolLimit, "txpool.globalqueue", txpool.DefaultConfig.QueuedSubPoolLimit, "Maximum number of non-executable transaction slots for all accounts") + rootCmd.PersistentFlags().Uint64Var(&priceLimit, "txpool.pricelimit", txpool.DefaultConfig.MinFeeCap, "Minimum gas price (fee cap) limit to enforce for acceptance into the pool") + rootCmd.PersistentFlags().Uint64Var(&priceLimit, "txpool.accountslots", txpool.DefaultConfig.AccountSlots, "Minimum number of executable transaction slots guaranteed per account") + rootCmd.PersistentFlags().Uint64Var(&priceBump, "txpool.pricebump", txpool.DefaultConfig.PriceBump, "Price bump percentage to replace an already existing transaction") + rootCmd.Flags().StringSliceVar(&traceSenders, utils.TxPoolTraceSendersFlag.Name, []string{}, utils.TxPoolTraceSendersFlag.Usage) +} + +var rootCmd = &cobra.Command{ + Use: "txpool", + Short: "Launch externa Transaction Pool instance - same as built-into Erigon, but as independent Service", + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + return debug.SetupCobra(cmd) + }, + PersistentPostRun: func(cmd *cobra.Command, args []string) { + debug.Exit() + }, + RunE: func(cmd *cobra.Command, args []string) error { + ctx := cmd.Context() + creds, err := grpcutil.TLS(TLSCACert, TLSCertfile, TLSKeyFile) + if err != nil { + return fmt.Errorf("could not connect to remoteKv: %w", err) + } + coreConn, err := grpcutil.Connect(creds, privateApiAddr) + if err != nil { + return fmt.Errorf("could not connect to remoteKv: %w", err) + } + + kvClient := remote.NewKVClient(coreConn) + coreDB, err := remotedb.NewRemote(gointerfaces.VersionFromProto(remotedbserver.KvServiceAPIVersion), log.New(), kvClient).Open() + if err != nil { + return fmt.Errorf("could not connect to remoteKv: %w", err) + } + + log.Info("TxPool started", "db", filepath.Join(datadir, "txpool")) + + sentryClients := make([]direct.SentryClient, len(sentryAddr)) + for i := range sentryAddr { + creds, err := grpcutil.TLS(TLSCACert, TLSCertfile, TLSKeyFile) + if err != nil { + return fmt.Errorf("could not connect to sentry: %w", err) + } + sentryConn, err := grpcutil.Connect(creds, sentryAddr[i]) + if err != nil { + return fmt.Errorf("could not connect to sentry: %w", err) + } + + sentryClients[i] = direct.NewSentryClientRemote(proto_sentry.NewSentryClient(sentryConn)) + } + + cfg := txpool.DefaultConfig + cfg.DBDir = filepath.Join(datadir, "txpool") + cfg.CommitEvery = 30 * time.Second + cfg.PendingSubPoolLimit = pendingPoolLimit + cfg.BaseFeeSubPoolLimit = baseFeePoolLimit + cfg.QueuedSubPoolLimit = queuedPoolLimit + cfg.MinFeeCap = priceLimit + cfg.PriceBump = priceBump + + cacheConfig := kvcache.DefaultCoherentConfig + cacheConfig.MetricsLabel = "txpool" + + cfg.TracedSenders = make([]string, len(traceSenders)) + for i, senderHex := range traceSenders { + sender := common2.HexToAddress(senderHex) + cfg.TracedSenders[i] = string(sender[:]) + } + + newTxs := make(chan types.Hashes, 1024) + defer close(newTxs) + txPoolDB, txPool, fetch, send, txpoolGrpcServer, err := txpooluitl.AllComponents(ctx, cfg, + kvcache.New(cacheConfig), newTxs, coreDB, sentryClients, kvClient) + if err != nil { + return err + } + fetch.ConnectCore() + fetch.ConnectSentries() + + /* + var ethashApi *ethash.API + sif casted, ok := backend.engine.(*ethash.Ethash); ok { + ethashApi = casted.APIs(nil)[1].Service.(*ethash.API) + } + */ + miningGrpcServer := privateapi.NewMiningServer(cmd.Context(), &rpcdaemontest.IsMiningMock{}, nil) + + grpcServer, err := txpool.StartGrpc(txpoolGrpcServer, miningGrpcServer, txpoolApiAddr, nil) + if err != nil { + return err + } + + notifyMiner := func() {} + txpool.MainLoop(cmd.Context(), txPoolDB, coreDB, txPool, newTxs, send, txpoolGrpcServer.NewSlotsStreams, notifyMiner) + + grpcServer.GracefulStop() + return nil + }, +} + +func main() { + ctx, cancel := common.RootContext() + defer cancel() + + if err := rootCmd.ExecuteContext(ctx); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/cmd/txpool/readme.md b/cmd/txpool/readme.md new file mode 100644 index 00000000000..a3077ea7b8d --- /dev/null +++ b/cmd/txpool/readme.md @@ -0,0 +1,44 @@ +# TxPool v2 + +Transaction Pool - place where living "not-included-to-block-yet transactions". +Erigon's TxPool can work inside Erigon (default) and as separated process. + +Erigon's pool implementation is not fork of Geth’s, has Apache license - Design +docs: https://github.com/ledgerwatch/erigon/wiki/Transaction-Pool-Design +95% of pool-related code (from p2p message parsing, to sorting logic) is inside this +folder: https://github.com/ledgerwatch/erigon-lib/tree/main/txpool + +## Internal mode + +It's default. No special flags required - just start Erigon. +RPCDaemon - flags `--private.api.addr` and `--txpool.api.addr` must have same value in this case. + +## External mode + +``` +make txpool + +# Add `--txpool.disable` flag to Erigon + +# External TxPool require(!) external Sentry +./build/bin/sentry --sentry.api.addr=localhost:9091 --datadir= + +# Start TxPool service (it connects to Erigon and Sentry): +# --private.api.addr - connect to Erigon's grpc api +# --sentry.api.addr - connect to Sentry's grpc api +# --txpool.api.addr - other services to connect TxPool's grpc api +# Increase limits flags: --txpool.globalslots, --txpool.globalbasefeeeslots, --txpool.globalqueue +# --txpool.trace.senders - print more logs about Txs with senders in this list +./build/bin/txpool --private.api.addr=localhost:9090 --sentry.api.addr=localhost:9091 --txpool.api.addr=localhost:9094 --datadir= + +# Add flag `--txpool.api.addr` to RPCDaemon +``` + +## ToDo list + +[] Hard-forks support (now TxPool require restart - after hard-fork happens) +[] Add pool to docker-compose +[] Add pool (db table) - where store recently mined txs - for faster unwind/reorg. +[] Save history of local transactions - with 1 day expiration +[] move tx.rlp field to separated map, to make tx immutable + diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 27577b7a561..002f9447e13 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -18,21 +18,16 @@ package utils import ( - "context" "fmt" "io" "os" - "os/signal" "runtime" - "syscall" "github.com/spf13/cobra" "github.com/urfave/cli" - _debug "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/internal/debug" "github.com/ledgerwatch/erigon/node" - "github.com/ledgerwatch/log/v3" ) // Fatalf formats a message to standard error and exits the program. @@ -59,24 +54,8 @@ func StartNode(stack *node.Node) { if err := stack.Start(); err != nil { Fatalf("Error starting protocol stack: %v", err) } - go func() { - sigc := make(chan os.Signal, 1) - signal.Notify(sigc, syscall.SIGINT, syscall.SIGTERM) - _debug.GetSigC(&sigc) - defer signal.Stop(sigc) - <-sigc - log.Info("Got interrupt, shutting down...") - go stack.Close() - for i := 10; i > 0; i-- { - <-sigc - if i > 1 { - log.Warn("Already shutting down, interrupt more to panic.", "times", i-1) - } - } - debug.Exit() // ensure trace and CPU profile data is flushed. - debug.LoudPanic("boom") - }() + go debug.ListenSignals(stack) } func SetupCobra(cmd *cobra.Command) error { @@ -90,23 +69,3 @@ func StopDebug() { func SetupUrfave(ctx *cli.Context) error { return debug.Setup(ctx) } - -func RootContext() (context.Context, context.CancelFunc) { - ctx, cancel := context.WithCancel(context.Background()) - go func() { - defer cancel() - - ch := make(chan os.Signal, 1) - defer close(ch) - - signal.Notify(ch, os.Interrupt, syscall.SIGTERM) - defer signal.Stop(ch) - - select { - case sig := <-ch: - log.Info("Got interrupt, shutting down...", "sig", sig) - case <-ctx.Done(): - } - }() - return ctx, cancel -} diff --git a/cmd/utils/customflags.go b/cmd/utils/customflags.go index 1e96e49c32f..0fdb6f9e954 100644 --- a/cmd/utils/customflags.go +++ b/cmd/utils/customflags.go @@ -154,11 +154,11 @@ func (b *bigValue) String() string { } func (b *bigValue) Set(s string) error { - int, ok := math.ParseBig256(s) + intVal, ok := math.ParseBig256(s) if !ok { return errors.New("invalid integer syntax") } - *b = (bigValue)(*int) + *b = bigValue(*intVal) return nil } @@ -172,6 +172,7 @@ func (f BigFlag) String() string { func (f BigFlag) Apply(set *flag.FlagSet) { eachName(f.Name, func(name string) { + f.Value = new(big.Int) set.Var((*bigValue)(f.Value), f.Name, f.Usage) }) } diff --git a/cmd/utils/diskusage_windows.go b/cmd/utils/diskusage_windows.go index 9bf7740b994..75e76500ded 100644 --- a/cmd/utils/diskusage_windows.go +++ b/cmd/utils/diskusage_windows.go @@ -26,12 +26,12 @@ func getFreeDiskSpace(path string) (uint64, error) { cwd, err := windows.UTF16PtrFromString(path) if err != nil { - return 0, fmt.Errorf("failed to call UTF16PtrFromString: %v", err) + return 0, fmt.Errorf("failed to call UTF16PtrFromString: %w", err) } var freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes uint64 if err := windows.GetDiskFreeSpaceEx(cwd, &freeBytesAvailableToCaller, &totalNumberOfBytes, &totalNumberOfFreeBytes); err != nil { - return 0, fmt.Errorf("failed to call GetDiskFreeSpaceEx: %v", err) + return 0, fmt.Errorf("failed to call GetDiskFreeSpaceEx: %w", err) } return freeBytesAvailableToCaller, nil diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 011fee7d329..2300d9b70a1 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -22,20 +22,27 @@ import ( "fmt" "io" "math/big" - "os" - "path" "path/filepath" + "runtime" "strconv" "strings" "text/tabwriter" "text/template" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/eth/protocols/eth" + lg "github.com/anacrolix/log" + "github.com/c2h5oh/datasize" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon-lib/txpool" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader/torrentcfg" + "github.com/ledgerwatch/erigon/node/nodecfg" + "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/urfave/cli" + "github.com/ledgerwatch/erigon/eth/protocols/eth" + "github.com/ledgerwatch/erigon/params/networkname" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/paths" "github.com/ledgerwatch/erigon/consensus/ethash" @@ -43,15 +50,12 @@ import ( "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/ethconfig" "github.com/ledgerwatch/erigon/eth/gasprice" - "github.com/ledgerwatch/erigon/internal/flags" "github.com/ledgerwatch/erigon/metrics" - "github.com/ledgerwatch/erigon/node" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/p2p/nat" "github.com/ledgerwatch/erigon/p2p/netutil" "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" ) func init() { @@ -67,7 +71,6 @@ GLOBAL OPTIONS: {{range .Flags}}{{.}} {{end}}{{end}} ` - cli.CommandHelpTemplate = flags.CommandHelpTemplate cli.HelpPrinter = printHelp } @@ -75,8 +78,7 @@ func printHelp(out io.Writer, templ string, data interface{}) { funcMap := template.FuncMap{"join": strings.Join} t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) w := tabwriter.NewWriter(out, 38, 8, 2, ' ', 0) - err := t.Execute(w, data) - if err != nil { + if err := t.Execute(w, data); err != nil { panic(err) } w.Flush() @@ -96,6 +98,7 @@ var ( Usage: "Data directory for the databases", Value: DirectoryString(paths.DefaultDataDir()), } + AncientFlag = DirectoryFlag{ Name: "datadir.ancient", Usage: "Data directory for ancient chain segments (default = inside chaindata)", @@ -116,7 +119,7 @@ var ( ChainFlag = cli.StringFlag{ Name: "chain", Usage: "Name of the testnet to join", - Value: params.MainnetChainName, + Value: networkname.MainnetChainName, } IdentityFlag = cli.StringFlag{ Name: "identity", @@ -126,6 +129,14 @@ var ( Name: "whitelist", Usage: "Comma separated block number-to-hash mappings to enforce (=)", } + OverrideTerminalTotalDifficulty = BigFlag{ + Name: "override.terminaltotaldifficulty", + Usage: "Manually specify TerminalTotalDifficulty, overriding the bundled setting", + } + OverrideMergeForkBlock = BigFlag{ + Name: "override.mergeForkBlock", + Usage: "Manually specify FORK_NEXT_VALUE (see EIP-3675), overriding the bundled setting", + } // Ethash settings EthashCachesInMemoryFlag = cli.IntFlag{ Name: "ethash.cachesinmem", @@ -145,7 +156,15 @@ var ( Name: "ethash.dagslockmmap", Usage: "Lock memory maps for recent ethash mining DAGs", } + SnapshotFlag = cli.BoolTFlag{ + Name: "snapshots", + Usage: `Default: use snapshots "true" for BSC, Mainnet and Goerli. use snapshots "false" in all other cases`, + } // Transaction pool settings + TxPoolDisableFlag = cli.BoolFlag{ + Name: "txpool.disable", + Usage: "experimental external pool and block producer, see ./cmd/txpool/readme.md for more info. Disabling internal txpool and block producer.", + } TxPoolLocalsFlag = cli.StringFlag{ Name: "txpool.locals", Usage: "Comma separated accounts to treat as locals (no flush, priority inclusion)", @@ -154,69 +173,72 @@ var ( Name: "txpool.nolocals", Usage: "Disables price exemptions for locally submitted transactions", } - TxPoolJournalFlag = cli.StringFlag{ - Name: "txpool.journal", - Usage: "Disk journal for local transaction to survive node restarts", - Value: core.DefaultTxPoolConfig.Journal, - } - TxPoolRejournalFlag = cli.DurationFlag{ - Name: "txpool.rejournal", - Usage: "Time interval to regenerate the local transaction journal", - Value: core.DefaultTxPoolConfig.Rejournal, - } TxPoolPriceLimitFlag = cli.Uint64Flag{ Name: "txpool.pricelimit", - Usage: "Minimum gas price limit to enforce for acceptance into the pool", - Value: ethconfig.Defaults.TxPool.PriceLimit, + Usage: "Minimum gas price (fee cap) limit to enforce for acceptance into the pool", + Value: ethconfig.Defaults.DeprecatedTxPool.PriceLimit, } TxPoolPriceBumpFlag = cli.Uint64Flag{ Name: "txpool.pricebump", Usage: "Price bump percentage to replace an already existing transaction", - Value: ethconfig.Defaults.TxPool.PriceBump, + Value: txpool.DefaultConfig.PriceBump, } TxPoolAccountSlotsFlag = cli.Uint64Flag{ Name: "txpool.accountslots", Usage: "Minimum number of executable transaction slots guaranteed per account", - Value: ethconfig.Defaults.TxPool.AccountSlots, + Value: ethconfig.Defaults.DeprecatedTxPool.AccountSlots, } TxPoolGlobalSlotsFlag = cli.Uint64Flag{ Name: "txpool.globalslots", Usage: "Maximum number of executable transaction slots for all accounts", - Value: ethconfig.Defaults.TxPool.GlobalSlots, + Value: ethconfig.Defaults.DeprecatedTxPool.GlobalSlots, + } + TxPoolGlobalBaseFeeSlotsFlag = cli.Uint64Flag{ + Name: "txpool.globalbasefeeslots", + Usage: "Maximum number of non-executable transactions where only not enough baseFee", + Value: ethconfig.Defaults.DeprecatedTxPool.GlobalQueue, } TxPoolAccountQueueFlag = cli.Uint64Flag{ Name: "txpool.accountqueue", Usage: "Maximum number of non-executable transaction slots permitted per account", - Value: ethconfig.Defaults.TxPool.AccountQueue, + Value: ethconfig.Defaults.DeprecatedTxPool.AccountQueue, } TxPoolGlobalQueueFlag = cli.Uint64Flag{ Name: "txpool.globalqueue", Usage: "Maximum number of non-executable transaction slots for all accounts", - Value: ethconfig.Defaults.TxPool.GlobalQueue, + Value: ethconfig.Defaults.DeprecatedTxPool.GlobalQueue, } TxPoolLifetimeFlag = cli.DurationFlag{ Name: "txpool.lifetime", Usage: "Maximum amount of time non-executable transaction are queued", - Value: ethconfig.Defaults.TxPool.Lifetime, + Value: ethconfig.Defaults.DeprecatedTxPool.Lifetime, + } + TxPoolTraceSendersFlag = cli.StringFlag{ + Name: "txpool.trace.senders", + Usage: "Comma separared list of addresses, whoes transactions will traced in transaction pool with debug printing", + Value: "", + } + EnabledIssuance = cli.BoolFlag{ + Name: "watch-the-burn", + Usage: "Enable WatchTheBurn stage to keep track of ETH issuance", } // Miner settings MiningEnabledFlag = cli.BoolFlag{ Name: "mine", Usage: "Enable mining", } + ProposingDisableFlag = cli.BoolFlag{ + Name: "proposer.disable", + Usage: "Disables PoS proposer", + } MinerNotifyFlag = cli.StringFlag{ Name: "miner.notify", Usage: "Comma separated HTTP URL list to notify of new work packages", } - MinerGasTargetFlag = cli.Uint64Flag{ - Name: "miner.gastarget", - Usage: "Target gas floor for mined blocks", - Value: ethconfig.Defaults.Miner.GasFloor, - } MinerGasLimitFlag = cli.Uint64Flag{ Name: "miner.gaslimit", - Usage: "Target gas ceiling for mined blocks", - Value: ethconfig.Defaults.Miner.GasCeil, + Usage: "Target gas limit for mined blocks", + Value: ethconfig.Defaults.Miner.GasLimit, } MinerGasPriceFlag = BigFlag{ Name: "miner.gasprice", @@ -228,8 +250,8 @@ var ( Usage: "Public address for block mining rewards", Value: "0", } - MinerSigningKeyFlag = cli.StringFlag{ - Name: "miner.sigkey", + MinerSigningKeyFileFlag = cli.StringFlag{ + Name: "miner.sigfile", Usage: "Private key to sign blocks with", Value: "", } @@ -268,6 +290,7 @@ var ( EthStatsURLFlag = cli.StringFlag{ Name: "ethstats", Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", + Value: "", } FakePoWFlag = cli.BoolFlag{ Name: "fakepow", @@ -284,17 +307,42 @@ var ( } HTTPEnabledFlag = cli.BoolFlag{ Name: "http", - Usage: "Enable the HTTP-RPC server", + Usage: "Enabled by default. Use --http=false to disable the HTTP-RPC server", } HTTPListenAddrFlag = cli.StringFlag{ Name: "http.addr", Usage: "HTTP-RPC server listening interface", - Value: node.DefaultHTTPHost, + Value: nodecfg.DefaultHTTPHost, } HTTPPortFlag = cli.IntFlag{ Name: "http.port", Usage: "HTTP-RPC server listening port", - Value: node.DefaultHTTPPort, + Value: nodecfg.DefaultHTTPPort, + } + EngineAddr = cli.StringFlag{ + Name: "engine.addr", + Usage: "HTTP-RPC server listening interface for engineAPI", + Value: nodecfg.DefaultHTTPHost, + } + EnginePort = cli.UintFlag{ + Name: "engine.port", + Usage: "HTTP-RPC server listening port for the engineAPI", + Value: nodecfg.DefaultEngineHTTPPort, + } + + JWTSecretPath = cli.StringFlag{ + Name: "authrpc.jwtsecret", + Usage: "Path to the token that ensures safe connection between CL and EL", + Value: "", + } + + HttpCompressionFlag = cli.BoolFlag{ + Name: "http.compression", + Usage: "Enable compression over HTTP-RPC", + } + WsCompressionFlag = cli.BoolFlag{ + Name: "ws.compression", + Usage: "Enable compression over WebSocket", } HTTPCORSDomainFlag = cli.StringFlag{ Name: "http.corsdomain", @@ -304,13 +352,59 @@ var ( HTTPVirtualHostsFlag = cli.StringFlag{ Name: "http.vhosts", Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", - Value: strings.Join(node.DefaultConfig.HTTPVirtualHosts, ","), + Value: strings.Join(nodecfg.DefaultConfig.HTTPVirtualHosts, ","), } HTTPApiFlag = cli.StringFlag{ Name: "http.api", Usage: "API's offered over the HTTP-RPC interface", - Value: "", + Value: "eth,erigon,engine", + } + RpcBatchConcurrencyFlag = cli.UintFlag{ + Name: "rpc.batch.concurrency", + Usage: "Does limit amount of goroutines to process 1 batch request. Means 1 bach request can't overload server. 1 batch still can have unlimited amount of request", + Value: 2, + } + DBReadConcurrencyFlag = cli.IntFlag{ + Name: "db.read.concurrency", + Usage: "Does limit amount of parallel db reads. Default: equal to GOMAXPROCS (or number of CPU)", + Value: runtime.GOMAXPROCS(-1), + } + RpcAccessListFlag = cli.StringFlag{ + Name: "rpc.accessList", + Usage: "Specify granular (method-by-method) API allowlist", + } + + RpcGasCapFlag = cli.UintFlag{ + Name: "rpc.gascap", + Usage: "Sets a cap on gas that can be used in eth_call/estimateGas", + Value: 50000000, + } + RpcTraceCompatFlag = cli.BoolFlag{ + Name: "trace.compat", + Usage: "Bug for bug compatibility with OE for trace_ routines", + } + + StarknetGrpcAddressFlag = cli.StringFlag{ + Name: "starknet.grpc.address", + Usage: "Starknet GRPC address", + Value: "127.0.0.1:6066", + } + + TevmFlag = cli.BoolFlag{ + Name: "experimental.tevm", + Usage: "Enables Transpiled EVM experiment", + } + TxpoolApiAddrFlag = cli.StringFlag{ + Name: "txpool.api.addr", + Usage: "txpool api network address, for example: 127.0.0.1:9090 (default: use value of --private.api.addr)", + } + + TraceMaxtracesFlag = cli.UintFlag{ + Name: "trace.maxtraces", + Usage: "Sets a limit on traces that can be returned in trace_filter", + Value: 200, } + HTTPPathPrefixFlag = cli.StringFlag{ Name: "http.rpcprefix", Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", @@ -342,12 +436,12 @@ var ( WSListenAddrFlag = cli.StringFlag{ Name: "ws.addr", Usage: "WS-RPC server listening interface", - Value: node.DefaultWSHost, + Value: nodecfg.DefaultWSHost, } WSPortFlag = cli.IntFlag{ Name: "ws.port", Usage: "WS-RPC server listening port", - Value: node.DefaultWSPort, + Value: nodecfg.DefaultWSPort, } WSApiFlag = cli.StringFlag{ Name: "ws.api", @@ -376,32 +470,40 @@ var ( Name: "rpc.allow-unprotected-txs", Usage: "Allow for unprotected (non EIP155 signed) transactions to be submitted via RPC", } + StateCacheFlag = cli.IntFlag{ + Name: "state.cache", + Value: kvcache.DefaultCoherentConfig.KeysLimit, + Usage: "Amount of keys to store in StateCache (enabled if no --datadir set). Set 0 to disable StateCache. 1_000_000 keys ~ equal to 2Gb RAM (maybe we will add RAM accounting in future versions).", + } // Network Settings MaxPeersFlag = cli.IntFlag{ Name: "maxpeers", Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: node.DefaultConfig.P2P.MaxPeers, + Value: nodecfg.DefaultConfig.P2P.MaxPeers, } MaxPendingPeersFlag = cli.IntFlag{ Name: "maxpendpeers", - Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", - Value: node.DefaultConfig.P2P.MaxPendingPeers, + Usage: "Maximum number of TCP connections pending to become connected peers", + Value: nodecfg.DefaultConfig.P2P.MaxPendingPeers, } ListenPortFlag = cli.IntFlag{ Name: "port", Usage: "Network listening port", Value: 30303, } - ListenPort65Flag = cli.IntFlag{ - Name: "p2p.eth65.port", - Usage: "ETH65 Network listening port", - Value: 30304, - } SentryAddrFlag = cli.StringFlag{ Name: "sentry.api.addr", Usage: "comma separated sentry addresses ':,:'", } + SentryLogPeerInfoFlag = cli.BoolFlag{ + Name: "sentry.log-peer-info", + Usage: "Log detailed peer info when a peer connects or disconnects. Enable to integrate with observer.", + } + DownloaderAddrFlag = cli.StringFlag{ + Name: "downloader.api.addr", + Usage: "downloader address ':'", + } BootnodesFlag = cli.StringFlag{ Name: "bootnodes", Usage: "Comma separated enode URLs for P2P discovery bootstrap", @@ -412,6 +514,11 @@ var ( Usage: "Comma separated enode URLs to connect to", Value: "", } + TrustedPeersFlag = cli.StringFlag{ + Name: "trustedpeers", + Usage: "Comma separated enode URLs which are always allowed to connect, even above the peer limit", + Value: "", + } NodeKeyFileFlag = cli.StringFlag{ Name: "nodekey", Usage: "P2P node key file", @@ -422,13 +529,15 @@ var ( } NATFlag = cli.StringFlag{ Name: "nat", - Usage: `NAT port mapping mechanism (any|none|upnp|pmp|extip:) + Usage: `NAT port mapping mechanism (any|none|upnp|pmp|stun|extip:) "" or "none" default - do not nat "extip:77.12.33.4" will assume the local machine is reachable on the given IP "any" uses the first auto-detected mechanism "upnp" uses the Universal Plug and Play protocol "pmp" uses NAT-PMP with an auto-detected gateway address "pmp:192.168.0.1" uses NAT-PMP with the given gateway address + "stun" uses STUN to detect an external IP using a default server + "stun:" uses STUN to detect an external IP using the given server (host:port) `, Value: "", } @@ -518,220 +627,261 @@ var ( Usage: "a path to clique db folder", Value: "", } + + SnapKeepBlocksFlag = cli.BoolFlag{ + Name: ethconfig.FlagSnapKeepBlocks, + Usage: "Keep ancient blocks in db (useful for debug)", + } + SnapStopFlag = cli.BoolFlag{ + Name: ethconfig.FlagSnapStop, + Usage: "Stop producing new snapshots", + } + TorrentVerbosityFlag = cli.StringFlag{ + Name: "torrent.verbosity", + Value: lg.Warning.LogString(), + Usage: "DBG | INF | WRN | ERR (must set --verbosity to equal or higher level)", + } + TorrentDownloadRateFlag = cli.StringFlag{ + Name: "torrent.download.rate", + Value: "16mb", + Usage: "bytes per second, example: 32mb", + } + TorrentUploadRateFlag = cli.StringFlag{ + Name: "torrent.upload.rate", + Value: "4mb", + Usage: "bytes per second, example: 32mb", + } + TorrentDownloadSlotsFlag = cli.IntFlag{ + Name: "torrent.download.slots", + Value: 3, + Usage: "amount of files to download in parallel. If network has enough seeders 1-3 slot enough, if network has lack of seeders increase to 5-7 (too big value will slow down everything).", + } + TorrentPortFlag = cli.IntFlag{ + Name: "torrent.port", + Value: 42069, + Usage: "port to listen and serve BitTorrent protocol", + } + TorrentMaxPeersFlag = cli.IntFlag{ + Name: "torrent.maxpeers", + Value: 100, + Usage: "unused parameter (reserved for future use)", + } + TorrentConnsPerFileFlag = cli.IntFlag{ + Name: "torrent.conns.perfile", + Value: 10, + Usage: "connections per file", + } + DbPageSizeFlag = cli.StringFlag{ + Name: "db.pagesize", + Usage: "set mdbx pagesize on db creation: must be power of 2 and '256b <= pagesize <= 64kb' ", + Value: "4kb", + } + + HealthCheckFlag = cli.BoolFlag{ + Name: "healthcheck", + Usage: "Enabling grpc health check", + } + + HeimdallURLFlag = cli.StringFlag{ + Name: "bor.heimdall", + Usage: "URL of Heimdall service", + Value: "http://localhost:1317", + } + + // WithoutHeimdallFlag no heimdall (for testing purpose) + WithoutHeimdallFlag = cli.BoolFlag{ + Name: "bor.withoutheimdall", + Usage: "Run without Heimdall service (for testing purpose)", + } ) var MetricFlags = []cli.Flag{MetricsEnabledFlag, MetricsEnabledExpensiveFlag, MetricsHTTPFlag, MetricsPortFlag} -// setNodeKey creates a node key from set command line flags, either loading it -// from a file or as a specified hex value. If neither flags were provided, this -// method returns nil and an emphemeral key is to be generated. -func setNodeKey(ctx *cli.Context, cfg *p2p.Config, nodeName, dataDir string) { - cfg.Name = nodeName - var ( - hex = ctx.GlobalString(NodeKeyHexFlag.Name) - file = ctx.GlobalString(NodeKeyFileFlag.Name) - key *ecdsa.PrivateKey - err error - ) - switch { - case file != "" && hex != "": - Fatalf("Options %q and %q are mutually exclusive", NodeKeyFileFlag.Name, NodeKeyHexFlag.Name) - case file != "": - if err := os.MkdirAll(path.Dir(file), 0755); err != nil { - panic(err) - } +// setNodeKey loads a node key from command line flags if provided, +// otherwise it tries to load it from datadir, +// otherwise it generates a new key in datadir. +func setNodeKey(ctx *cli.Context, cfg *p2p.Config, datadir string) { + file := ctx.GlobalString(NodeKeyFileFlag.Name) + hex := ctx.GlobalString(NodeKeyHexFlag.Name) - if key, err = crypto.LoadECDSA(file); err != nil { - Fatalf("Option %q: %v", NodeKeyFileFlag.Name, err) - } - cfg.PrivateKey = key - case hex != "": - if key, err = crypto.HexToECDSA(hex); err != nil { - Fatalf("Option %q: %v", NodeKeyHexFlag.Name, err) - } - cfg.PrivateKey = key - default: - cfg.PrivateKey = nodeKey(path.Join(dataDir, "erigon", "nodekey")) + config := p2p.NodeKeyConfig{} + key, err := config.LoadOrParseOrGenerateAndSave(file, hex, datadir) + if err != nil { + Fatalf("%v", err) } + cfg.PrivateKey = key } // setNodeUserIdent creates the user identifier from CLI flags. -func setNodeUserIdent(ctx *cli.Context, cfg *node.Config) { +func setNodeUserIdent(ctx *cli.Context, cfg *nodecfg.Config) { if identity := ctx.GlobalString(IdentityFlag.Name); len(identity) > 0 { cfg.UserIdent = identity } } -func setNodeUserIdentCobra(f *pflag.FlagSet, cfg *node.Config) { +func setNodeUserIdentCobra(f *pflag.FlagSet, cfg *nodecfg.Config) { if identity := f.String(IdentityFlag.Name, IdentityFlag.Value, IdentityFlag.Usage); identity != nil && len(*identity) > 0 { cfg.UserIdent = *identity } } -// setBootstrapNodes creates a list of bootstrap nodes from the command line -// flags, reverting to pre-configured ones if none have been specified. func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { - urls := params.MainnetBootnodes - if ctx.GlobalIsSet(BootnodesFlag.Name) { - urls = SplitAndTrim(ctx.GlobalString(BootnodesFlag.Name)) - } else { - chain := ctx.GlobalString(ChainFlag.Name) - switch chain { - case params.RopstenChainName: - urls = params.RopstenBootnodes - case params.RinkebyChainName: - urls = params.RinkebyBootnodes - case params.GoerliChainName: - urls = params.GoerliBootnodes - case params.ErigonMineName: - urls = params.ErigonBootnodes - case params.CalaverasChainName: - urls = params.CalaverasBootnodes - case params.SokolChainName: - urls = params.SokolBootnodes - default: - if cfg.BootstrapNodes != nil { - return // already set, don't apply defaults. - } - } + // If already set, don't apply defaults. + if cfg.BootstrapNodes != nil { + return } - cfg.BootstrapNodes = make([]*enode.Node, 0, len(urls)) - for _, url := range urls { - if url != "" { - node, err := enode.Parse(enode.ValidSchemes, url) - if err != nil { - log.Crit("Bootstrap URL invalid", "enode", url, "err", err) - continue - } - cfg.BootstrapNodes = append(cfg.BootstrapNodes, node) - } + nodes, err := GetBootnodesFromFlags(ctx.GlobalString(BootnodesFlag.Name), ctx.GlobalString(ChainFlag.Name)) + if err != nil { + Fatalf("Option %s: %v", BootnodesFlag.Name, err) } + + cfg.BootstrapNodes = nodes } -// setBootstrapNodesV5 creates a list of bootstrap nodes from the command line -// flags, reverting to pre-configured ones if none have been specified. func setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) { - urls := params.MainnetBootnodes - if ctx.GlobalIsSet(BootnodesFlag.Name) { - urls = SplitAndTrim(ctx.GlobalString(BootnodesFlag.Name)) + // If already set, don't apply defaults. + if cfg.BootstrapNodesV5 != nil { + return + } + + nodes, err := GetBootnodesFromFlags(ctx.GlobalString(BootnodesFlag.Name), ctx.GlobalString(ChainFlag.Name)) + if err != nil { + Fatalf("Option %s: %v", BootnodesFlag.Name, err) + } + + cfg.BootstrapNodesV5 = nodes +} + +// GetBootnodesFromFlags makes a list of bootnodes from command line flags. +// If urlsStr is given, it is used and parsed as a comma-separated list of enode:// urls, +// otherwise a list of preconfigured bootnodes of the specified chain is returned. +func GetBootnodesFromFlags(urlsStr, chain string) ([]*enode.Node, error) { + var urls []string + if urlsStr != "" { + urls = SplitAndTrim(urlsStr) } else { + urls = params.BootnodeURLsOfChain(chain) + } + return ParseNodesFromURLs(urls) +} +func setStaticPeers(ctx *cli.Context, cfg *p2p.Config) { + var urls []string + if ctx.GlobalIsSet(StaticPeersFlag.Name) { + urls = SplitAndTrim(ctx.GlobalString(StaticPeersFlag.Name)) + } else { chain := ctx.GlobalString(ChainFlag.Name) - switch chain { - case params.RopstenChainName: - urls = params.RopstenBootnodes - case params.RinkebyChainName: - urls = params.RinkebyBootnodes - case params.GoerliChainName: - urls = params.GoerliBootnodes - case params.ErigonMineName: - urls = params.ErigonBootnodes - case params.CalaverasChainName: - urls = params.CalaverasBootnodes - case params.SokolChainName: - urls = params.SokolBootnodes - default: - if cfg.BootstrapNodesV5 != nil { - return // already set, don't apply defaults. - } - } + urls = params.StaticPeerURLsOfChain(chain) } - cfg.BootstrapNodesV5 = make([]*enode.Node, 0, len(urls)) - for _, url := range urls { - if url != "" { - node, err := enode.Parse(enode.ValidSchemes, url) - if err != nil { - log.Error("Bootstrap URL invalid", "enode", url, "err", err) - continue - } - cfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node) - } + nodes, err := ParseNodesFromURLs(urls) + if err != nil { + Fatalf("Option %s: %v", StaticPeersFlag.Name, err) } + + cfg.StaticNodes = nodes } -func setStaticPeers(ctx *cli.Context, cfg *p2p.Config) { - if !ctx.GlobalIsSet(StaticPeersFlag.Name) { +func setTrustedPeers(ctx *cli.Context, cfg *p2p.Config) { + if !ctx.GlobalIsSet(TrustedPeersFlag.Name) { return } - urls := SplitAndTrim(ctx.GlobalString(StaticPeersFlag.Name)) - err := SetStaticPeers(cfg, urls) + + urls := SplitAndTrim(ctx.GlobalString(TrustedPeersFlag.Name)) + trustedNodes, err := ParseNodesFromURLs(urls) if err != nil { - log.Error("setStaticPeers", "err", err) + Fatalf("Option %s: %v", TrustedPeersFlag.Name, err) } + + cfg.TrustedNodes = append(cfg.TrustedNodes, trustedNodes...) } -func SetStaticPeers(cfg *p2p.Config, urls []string) error { +func ParseNodesFromURLs(urls []string) ([]*enode.Node, error) { + nodes := make([]*enode.Node, 0, len(urls)) for _, url := range urls { if url == "" { continue } - node, err := enode.Parse(enode.ValidSchemes, url) + n, err := enode.Parse(enode.ValidSchemes, url) if err != nil { - return fmt.Errorf("static peer URL invalid: %s, %w", url, err) + return nil, fmt.Errorf("invalid node URL %s: %w", url, err) } - cfg.StaticNodes = append(cfg.StaticNodes, node) + nodes = append(nodes, n) } - return nil + return nodes, nil } // NewP2PConfig // - doesn't setup bootnodes - they will set when genesisHash will know -func NewP2PConfig(nodiscover bool, datadir, netRestrict, natSetting, nodeName string, staticPeers []string, port, protocol uint) (*p2p.Config, error) { +func NewP2PConfig( + nodiscover bool, + datadir string, + netRestrict string, + natSetting string, + maxPeers int, + maxPendPeers int, + nodeName string, + staticPeers []string, + trustedPeers []string, + port, + protocol uint, +) (*p2p.Config, error) { var enodeDBPath string switch protocol { - case eth.ETH65: - enodeDBPath = path.Join(datadir, "nodes", "eth65") case eth.ETH66: - enodeDBPath = path.Join(datadir, "nodes", "eth66") + enodeDBPath = filepath.Join(datadir, "nodes", "eth66") default: return nil, fmt.Errorf("unknown protocol: %v", protocol) } - serverKey := nodeKey(path.Join(datadir, "erigon", "nodekey")) + + serverKey, err := nodeKey(datadir) + if err != nil { + return nil, err + } cfg := &p2p.Config{ - ListenAddr: fmt.Sprintf(":%d", port), - MaxPeers: 100, - NAT: nat.Any(), - NoDiscovery: nodiscover, - PrivateKey: serverKey, - Name: nodeName, - Logger: log.New(), - NodeDatabase: enodeDBPath, + ListenAddr: fmt.Sprintf(":%d", port), + MaxPeers: maxPeers, + MaxPendingPeers: maxPendPeers, + NAT: nat.Any(), + NoDiscovery: nodiscover, + PrivateKey: serverKey, + Name: nodeName, + Log: log.New(), + NodeDatabase: enodeDBPath, } if netRestrict != "" { cfg.NetRestrict = new(netutil.Netlist) cfg.NetRestrict.Add(netRestrict) } if staticPeers != nil { - if err := SetStaticPeers(cfg, staticPeers); err != nil { - return nil, err + staticNodes, err := ParseNodesFromURLs(staticPeers) + if err != nil { + return nil, fmt.Errorf("bad option %s: %w", StaticPeersFlag.Name, err) + } + cfg.StaticNodes = staticNodes + } + if trustedPeers != nil { + trustedNodes, err := ParseNodesFromURLs(trustedPeers) + if err != nil { + return nil, fmt.Errorf("bad option %s: %w", TrustedPeersFlag.Name, err) } + cfg.TrustedNodes = trustedNodes } natif, err := nat.Parse(natSetting) if err != nil { - return nil, fmt.Errorf("invalid nat option %s: %v", natSetting, err) + return nil, fmt.Errorf("invalid nat option %s: %w", natSetting, err) } cfg.NAT = natif return cfg, nil } -func nodeKey(keyfile string) *ecdsa.PrivateKey { - if err := os.MkdirAll(path.Dir(keyfile), 0755); err != nil { - panic(err) - } - if key, err := crypto.LoadECDSA(keyfile); err == nil { - return key - } - // No persistent key found, generate and store a new one. - key, err := crypto.GenerateKey() - if err != nil { - log.Crit(fmt.Sprintf("Failed to generate node key: %v", err)) - } - if err := crypto.SaveECDSA(keyfile, key); err != nil { - log.Error(fmt.Sprintf("Failed to persist node key: %v", err)) - } - return key +// nodeKey loads a node key from datadir if it exists, +// otherwise it generates a new key in datadir. +func nodeKey(datadir string) (*ecdsa.PrivateKey, error) { + config := p2p.NodeKeyConfig{} + keyfile := config.DefaultPath(datadir) + return config.LoadOrGenerateAndSave(keyfile) } // setListenAddress creates a TCP listening address string from set command @@ -740,9 +890,6 @@ func setListenAddress(ctx *cli.Context, cfg *p2p.Config) { if ctx.GlobalIsSet(ListenPortFlag.Name) { cfg.ListenAddr = fmt.Sprintf(":%d", ctx.GlobalInt(ListenPortFlag.Name)) } - if ctx.GlobalIsSet(ListenPort65Flag.Name) { - cfg.ListenAddr65 = fmt.Sprintf(":%d", ctx.GlobalInt(ListenPort65Flag.Name)) - } if ctx.GlobalIsSet(SentryAddrFlag.Name) { cfg.SentryAddr = SplitAndTrim(ctx.GlobalString(SentryAddrFlag.Name)) } @@ -774,31 +921,59 @@ func SplitAndTrim(input string) (ret []string) { // setEtherbase retrieves the etherbase from the directly specified // command line flags. func setEtherbase(ctx *cli.Context, cfg *ethconfig.Config) { - if ctx.GlobalIsSet(MinerSigningKeyFlag.Name) { - sigkey := ctx.GlobalString(MinerSigningKeyFlag.Name) - if sigkey != "" { - var err error - cfg.Miner.SigKey, err = crypto.HexToECDSA(sigkey) + var etherbase string + if ctx.GlobalIsSet(MinerEtherbaseFlag.Name) { + etherbase = ctx.GlobalString(MinerEtherbaseFlag.Name) + if etherbase != "" { + cfg.Miner.Etherbase = common.HexToAddress(etherbase) + } + } + + setSigKey := func(ctx *cli.Context, cfg *ethconfig.Config) { + if ctx.GlobalIsSet(MinerSigningKeyFileFlag.Name) { + signingKeyFileName := ctx.GlobalString(MinerSigningKeyFileFlag.Name) + key, err := crypto.LoadECDSA(signingKeyFileName) if err != nil { - Fatalf("Failed to parse ECDSA private key: %v", err) + panic(err) } - cfg.Miner.Etherbase = crypto.PubkeyToAddress(cfg.Miner.SigKey.PublicKey) + cfg.Miner.SigKey = key } - } else if ctx.GlobalIsSet(MinerEtherbaseFlag.Name) { - etherbase := ctx.GlobalString(MinerEtherbaseFlag.Name) - if etherbase != "" { - cfg.Miner.Etherbase = common.HexToAddress(etherbase) + } + + if ctx.GlobalString(ChainFlag.Name) == networkname.DevChainName { + if etherbase == "" { + cfg.Miner.SigKey = core.DevnetSignPrivateKey + cfg.Miner.Etherbase = core.DevnetEtherbase + } + setSigKey(ctx, cfg) + } + + chainsWithValidatorMode := map[string]bool{ + networkname.FermionChainName: true, + networkname.BSCChainName: true, + networkname.RialtoChainName: true, + networkname.ChapelChainName: true, + } + if _, ok := chainsWithValidatorMode[ctx.GlobalString(ChainFlag.Name)]; ok || ctx.GlobalIsSet(MinerSigningKeyFileFlag.Name) { + if ctx.GlobalIsSet(MiningEnabledFlag.Name) && !ctx.GlobalIsSet(MinerSigningKeyFileFlag.Name) { + panic(fmt.Sprintf("Flag --%s is required in %s chain with --%s flag", MinerSigningKeyFileFlag.Name, ChainFlag.Name, MiningEnabledFlag.Name)) + } + setSigKey(ctx, cfg) + if cfg.Miner.SigKey != nil { + cfg.Miner.Etherbase = crypto.PubkeyToAddress(cfg.Miner.SigKey.PublicKey) } } } -func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config, nodeName, dataDir string) { - setNodeKey(ctx, cfg, nodeName, dataDir) +func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config, nodeName, datadir string) { + cfg.Name = nodeName + setNodeKey(ctx, cfg, datadir) setNAT(ctx, cfg) setListenAddress(ctx, cfg) setBootstrapNodes(ctx, cfg) setBootstrapNodesV5(ctx, cfg) setStaticPeers(ctx, cfg) + setTrustedPeers(ctx, cfg) if ctx.GlobalIsSet(MaxPeersFlag.Name) { cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) @@ -827,23 +1002,29 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config, nodeName, dataDir string) { cfg.NetRestrict = list } - if ctx.GlobalString(ChainFlag.Name) == params.DevChainName { + if ctx.GlobalString(ChainFlag.Name) == networkname.DevChainName { // --dev mode can't use p2p networking. - cfg.MaxPeers = 0 - cfg.ListenAddr = ":0" + //cfg.MaxPeers = 0 // It can have peers otherwise local sync is not possible + if !ctx.GlobalIsSet(ListenPortFlag.Name) { + cfg.ListenAddr = ":0" + } cfg.NoDiscovery = true cfg.DiscoveryV5 = false + log.Info("Development chain flags set", "--nodiscover", cfg.NoDiscovery, "--v5disc", cfg.DiscoveryV5, "--port", cfg.ListenAddr) } } // SetNodeConfig applies node-related command line flags to the config. -func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { +func SetNodeConfig(ctx *cli.Context, cfg *nodecfg.Config) { setDataDir(ctx, cfg) setNodeUserIdent(ctx, cfg) SetP2PConfig(ctx, &cfg.P2P, cfg.NodeName(), cfg.DataDir) + + cfg.DownloaderAddr = strings.TrimSpace(ctx.GlobalString(DownloaderAddrFlag.Name)) + cfg.SentryLogPeerInfo = ctx.GlobalIsSet(SentryLogPeerInfoFlag.Name) } -func SetNodeConfigCobra(cmd *cobra.Command, cfg *node.Config) { +func SetNodeConfigCobra(cmd *cobra.Command, cfg *nodecfg.Config) { flags := cmd.Flags() //SetP2PConfig(ctx, &cfg.P2P) setNodeUserIdentCobra(flags, cfg) @@ -856,16 +1037,24 @@ func DataDirForNetwork(datadir string, network string) string { } switch network { - case params.DevChainName: + case networkname.DevChainName: return "" // unless explicitly requested, use memory databases - case params.RinkebyChainName: + case networkname.RinkebyChainName: return filepath.Join(datadir, "rinkeby") - case params.GoerliChainName: + case networkname.GoerliChainName: filepath.Join(datadir, "goerli") - case params.CalaverasChainName: - return filepath.Join(datadir, "calaveras") - case params.SokolChainName: + case networkname.KilnDevnetChainName: + filepath.Join(datadir, "kiln-devnet") + case networkname.SokolChainName: return filepath.Join(datadir, "sokol") + case networkname.FermionChainName: + return filepath.Join(datadir, "fermion") + case networkname.MumbaiChainName: + return filepath.Join(datadir, "mumbai") + case networkname.BorMainnetChainName: + return filepath.Join(datadir, "bor-mainnet") + case networkname.SepoliaChainName: + return filepath.Join(datadir, "sepolia") default: return datadir } @@ -873,15 +1062,30 @@ func DataDirForNetwork(datadir string, network string) string { return datadir } -func setDataDir(ctx *cli.Context, cfg *node.Config) { +func setDataDir(ctx *cli.Context, cfg *nodecfg.Config) { if ctx.GlobalIsSet(DataDirFlag.Name) { cfg.DataDir = ctx.GlobalString(DataDirFlag.Name) } else { cfg.DataDir = DataDirForNetwork(cfg.DataDir, ctx.GlobalString(ChainFlag.Name)) } + + if err := cfg.MdbxPageSize.UnmarshalText([]byte(ctx.GlobalString(DbPageSizeFlag.Name))); err != nil { + panic(err) + } + sz := cfg.MdbxPageSize.Bytes() + if !isPowerOfTwo(sz) || sz < 256 || sz > 64*1024 { + panic("invalid --db.pagesize: " + DbPageSizeFlag.Usage) + } +} + +func isPowerOfTwo(n uint64) bool { + if n == 0 { //corner case: if n is zero it will also consider as power 2 + return true + } + return n&(n-1) == 0 } -func setDataDirCobra(f *pflag.FlagSet, cfg *node.Config) { +func setDataDirCobra(f *pflag.FlagSet, cfg *nodecfg.Config) { dirname, err := f.GetString(DataDirFlag.Name) if err != nil { panic(err) @@ -895,6 +1099,9 @@ func setDataDirCobra(f *pflag.FlagSet, cfg *node.Config) { } else { cfg.DataDir = DataDirForNetwork(cfg.DataDir, chain) } + + cfg.DataDir = DataDirForNetwork(cfg.DataDir, chain) + } func setGPO(ctx *cli.Context, cfg *gasprice.Config) { @@ -923,6 +1130,9 @@ func setGPOCobra(f *pflag.FlagSet, cfg *gasprice.Config) { } func setTxPool(ctx *cli.Context, cfg *core.TxPoolConfig) { + if ctx.GlobalIsSet(TxPoolDisableFlag.Name) { + cfg.Disable = true + } if ctx.GlobalIsSet(TxPoolLocalsFlag.Name) { locals := strings.Split(ctx.GlobalString(TxPoolLocalsFlag.Name), ",") for _, account := range locals { @@ -936,12 +1146,6 @@ func setTxPool(ctx *cli.Context, cfg *core.TxPoolConfig) { if ctx.GlobalIsSet(TxPoolNoLocalsFlag.Name) { cfg.NoLocals = ctx.GlobalBool(TxPoolNoLocalsFlag.Name) } - if ctx.GlobalIsSet(TxPoolJournalFlag.Name) { - cfg.Journal = ctx.GlobalString(TxPoolJournalFlag.Name) - } - if ctx.GlobalIsSet(TxPoolRejournalFlag.Name) { - cfg.Rejournal = ctx.GlobalDuration(TxPoolRejournalFlag.Name) - } if ctx.GlobalIsSet(TxPoolPriceLimitFlag.Name) { cfg.PriceLimit = ctx.GlobalUint64(TxPoolPriceLimitFlag.Name) } @@ -960,16 +1164,28 @@ func setTxPool(ctx *cli.Context, cfg *core.TxPoolConfig) { if ctx.GlobalIsSet(TxPoolGlobalQueueFlag.Name) { cfg.GlobalQueue = ctx.GlobalUint64(TxPoolGlobalQueueFlag.Name) } + if ctx.GlobalIsSet(TxPoolGlobalBaseFeeSlotsFlag.Name) { + cfg.GlobalBaseFeeQueue = ctx.GlobalUint64(TxPoolGlobalBaseFeeSlotsFlag.Name) + } if ctx.GlobalIsSet(TxPoolLifetimeFlag.Name) { cfg.Lifetime = ctx.GlobalDuration(TxPoolLifetimeFlag.Name) } + if ctx.GlobalIsSet(TxPoolTraceSendersFlag.Name) { + // Parse the command separated flag + senderHexes := SplitAndTrim(ctx.GlobalString(TxPoolTraceSendersFlag.Name)) + cfg.TracedSenders = make([]string, len(senderHexes)) + for i, senderHex := range senderHexes { + sender := common.HexToAddress(senderHex) + cfg.TracedSenders[i] = string(sender[:]) + } + } } func setEthash(ctx *cli.Context, datadir string, cfg *ethconfig.Config) { if ctx.GlobalIsSet(EthashDatasetDirFlag.Name) { cfg.Ethash.DatasetDir = ctx.GlobalString(EthashDatasetDirFlag.Name) } else { - cfg.Ethash.DatasetDir = path.Join(datadir, "erigon", "ethash-dags") + cfg.Ethash.DatasetDir = filepath.Join(datadir, "ethash-dags") } if ctx.GlobalIsSet(EthashCachesInMemoryFlag.Name) { cfg.Ethash.CachesInMem = ctx.GlobalInt(EthashCachesInMemoryFlag.Name) @@ -993,7 +1209,7 @@ func SetupMinerCobra(cmd *cobra.Command, cfg *params.MiningConfig) { panic(err) } if cfg.Enabled && len(cfg.Etherbase.Bytes()) == 0 { - panic(fmt.Sprintf("Erigon supports only remote miners. Flag --%s or --%s is required", MinerNotifyFlag.Name, MinerSigningKeyFlag.Name)) + panic(fmt.Sprintf("Erigon supports only remote miners. Flag --%s or --%s is required", MinerNotifyFlag.Name, MinerSigningKeyFileFlag.Name)) } cfg.Notify, err = flags.GetStringArray(MinerNotifyFlag.Name) if err != nil { @@ -1004,11 +1220,7 @@ func SetupMinerCobra(cmd *cobra.Command, cfg *params.MiningConfig) { panic(err) } cfg.ExtraData = []byte(extraDataStr) - cfg.GasFloor, err = flags.GetUint64(MinerGasTargetFlag.Name) - if err != nil { - panic(err) - } - cfg.GasCeil, err = flags.GetUint64(MinerGasLimitFlag.Name) + cfg.GasLimit, err = flags.GetUint64(MinerGasLimitFlag.Name) if err != nil { panic(err) } @@ -1040,27 +1252,36 @@ func SetupMinerCobra(cmd *cobra.Command, cfg *params.MiningConfig) { cfg.Etherbase = common.HexToAddress(etherbase) } -func setClique(ctx *cli.Context, cfg *params.SnapshotConfig, datadir string) { +func setClique(ctx *cli.Context, cfg *params.ConsensusSnapshotConfig, datadir string) { cfg.CheckpointInterval = ctx.GlobalUint64(CliqueSnapshotCheckpointIntervalFlag.Name) cfg.InmemorySnapshots = ctx.GlobalInt(CliqueSnapshotInmemorySnapshotsFlag.Name) cfg.InmemorySignatures = ctx.GlobalInt(CliqueSnapshotInmemorySignaturesFlag.Name) if ctx.GlobalIsSet(CliqueDataDirFlag.Name) { - cfg.DBPath = path.Join(ctx.GlobalString(CliqueDataDirFlag.Name), "clique/db") + cfg.DBPath = filepath.Join(ctx.GlobalString(CliqueDataDirFlag.Name), "clique", "db") } else { - cfg.DBPath = path.Join(datadir, "clique/db") + cfg.DBPath = filepath.Join(datadir, "clique", "db") } } func setAuRa(ctx *cli.Context, cfg *params.AuRaConfig, datadir string) { - cfg.DBPath = path.Join(datadir, "aura") + cfg.DBPath = filepath.Join(datadir, "aura") +} + +func setParlia(ctx *cli.Context, cfg *params.ParliaConfig, datadir string) { + cfg.DBPath = filepath.Join(datadir, "parlia") +} + +func setBorConfig(ctx *cli.Context, cfg *ethconfig.Config) { + cfg.HeimdallURL = ctx.GlobalString(HeimdallURLFlag.Name) + cfg.WithoutHeimdall = ctx.GlobalBool(WithoutHeimdallFlag.Name) } func setMiner(ctx *cli.Context, cfg *params.MiningConfig) { - if ctx.GlobalIsSet(MiningEnabledFlag.Name) { - cfg.Enabled = true - } + cfg.Enabled = ctx.GlobalIsSet(MiningEnabledFlag.Name) + cfg.EnabledPOS = !ctx.GlobalIsSet(ProposingDisableFlag.Name) + if cfg.Enabled && len(cfg.Etherbase.Bytes()) == 0 { - panic(fmt.Sprintf("Erigon supports only remote miners. Flag --%s or --%s is required", MinerNotifyFlag.Name, MinerSigningKeyFlag.Name)) + panic(fmt.Sprintf("Erigon supports only remote miners. Flag --%s or --%s is required", MinerNotifyFlag.Name, MinerSigningKeyFileFlag.Name)) } if ctx.GlobalIsSet(MinerNotifyFlag.Name) { cfg.Notify = strings.Split(ctx.GlobalString(MinerNotifyFlag.Name), ",") @@ -1068,11 +1289,8 @@ func setMiner(ctx *cli.Context, cfg *params.MiningConfig) { if ctx.GlobalIsSet(MinerExtraDataFlag.Name) { cfg.ExtraData = []byte(ctx.GlobalString(MinerExtraDataFlag.Name)) } - if ctx.GlobalIsSet(MinerGasTargetFlag.Name) { - cfg.GasFloor = ctx.GlobalUint64(MinerGasTargetFlag.Name) - } if ctx.GlobalIsSet(MinerGasLimitFlag.Name) { - cfg.GasCeil = ctx.GlobalUint64(MinerGasLimitFlag.Name) + cfg.GasLimit = ctx.GlobalUint64(MinerGasLimitFlag.Name) } if ctx.GlobalIsSet(MinerGasPriceFlag.Name) { cfg.GasPrice = GlobalBig(ctx, MinerGasPriceFlag.Name) @@ -1150,19 +1368,63 @@ func CheckExclusive(ctx *cli.Context, args ...interface{}) { } // SetEthConfig applies eth-related command line flags to the config. -func SetEthConfig(ctx *cli.Context, nodeConfig *node.Config, cfg *ethconfig.Config) { - CheckExclusive(ctx, MinerSigningKeyFlag, MinerEtherbaseFlag) +func SetEthConfig(ctx *cli.Context, nodeConfig *nodecfg.Config, cfg *ethconfig.Config) { + cfg.Sync.UseSnapshots = ctx.GlobalBoolT(SnapshotFlag.Name) + cfg.SnapDir = filepath.Join(nodeConfig.DataDir, "snapshots") + cfg.Snapshot.KeepBlocks = ctx.GlobalBool(SnapKeepBlocksFlag.Name) + cfg.Snapshot.Produce = !ctx.GlobalBool(SnapStopFlag.Name) + if !ctx.GlobalIsSet(DownloaderAddrFlag.Name) { + downloadRateStr := ctx.GlobalString(TorrentDownloadRateFlag.Name) + uploadRateStr := ctx.GlobalString(TorrentUploadRateFlag.Name) + var downloadRate, uploadRate datasize.ByteSize + if err := downloadRate.UnmarshalText([]byte(downloadRateStr)); err != nil { + panic(err) + } + if err := uploadRate.UnmarshalText([]byte(uploadRateStr)); err != nil { + panic(err) + } + + lvl, err := torrentcfg.Str2LogLevel(ctx.GlobalString(TorrentVerbosityFlag.Name)) + if err != nil { + panic(err) + } + cfg.Torrent, err = torrentcfg.New(cfg.SnapDir, + lvl, + nodeConfig.P2P.NAT, + downloadRate, uploadRate, + ctx.GlobalInt(TorrentPortFlag.Name), + ctx.GlobalInt(TorrentConnsPerFileFlag.Name), + ctx.GlobalInt(TorrentDownloadSlotsFlag.Name), + ) + if err != nil { + panic(err) + } + } + + nodeConfig.Http.Snap = cfg.Snapshot + + if ctx.Command.Name == "import" { + cfg.ImportMode = true + } + setEtherbase(ctx, cfg) setGPO(ctx, &cfg.GPO) - setTxPool(ctx, &cfg.TxPool) + + setTxPool(ctx, &cfg.DeprecatedTxPool) + cfg.TxPool = core.DefaultTxPool2Config(cfg.DeprecatedTxPool) + cfg.TxPool.DBDir = filepath.Join(nodeConfig.DataDir, "txpool") + setEthash(ctx, nodeConfig.DataDir, cfg) setClique(ctx, &cfg.Clique, nodeConfig.DataDir) setAuRa(ctx, &cfg.Aura, nodeConfig.DataDir) + setParlia(ctx, &cfg.Parlia, nodeConfig.DataDir) setMiner(ctx, &cfg.Miner) setWhitelist(ctx, cfg) + setBorConfig(ctx, cfg) + cfg.Ethstats = ctx.GlobalString(EthStatsURLFlag.Name) cfg.P2PEnabled = len(nodeConfig.P2P.SentryAddr) == 0 - + cfg.EnabledIssuance = ctx.GlobalIsSet(EnabledIssuance.Name) if ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkID = ctx.GlobalUint64(NetworkIdFlag.Name) } @@ -1190,54 +1452,29 @@ func SetEthConfig(ctx *cli.Context, nodeConfig *node.Config, cfg *ethconfig.Conf } // Override any default configs for hard coded networks. chain := ctx.GlobalString(ChainFlag.Name) + switch chain { - case "": - if cfg.NetworkID == 1 { - SetDNSDiscoveryDefaults(cfg, params.MainnetGenesisHash) - } - case params.MainnetChainName: - if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = 1 - } - cfg.Genesis = core.DefaultGenesisBlock() - SetDNSDiscoveryDefaults(cfg, params.MainnetGenesisHash) - case params.RopstenChainName: - if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = 3 - } - cfg.Genesis = core.DefaultRopstenGenesisBlock() - SetDNSDiscoveryDefaults(cfg, params.RopstenGenesisHash) - case params.RinkebyChainName: - if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = 4 - } - cfg.Genesis = core.DefaultRinkebyGenesisBlock() - SetDNSDiscoveryDefaults(cfg, params.RinkebyGenesisHash) - case params.GoerliChainName: - if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = 5 - } - cfg.Genesis = core.DefaultGoerliGenesisBlock() - SetDNSDiscoveryDefaults(cfg, params.GoerliGenesisHash) - case params.ErigonMineName: - if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = new(big.Int).SetBytes([]byte("erigon-mine")).Uint64() // erigon-mine + default: + genesis := core.DefaultGenesisBlockByChainName(chain) + genesisHash := params.GenesisHashByChainName(chain) + if (genesis == nil) || (genesisHash == nil) { + Fatalf("ChainDB name is not recognized: %s", chain) + return } - cfg.Genesis = core.DefaultErigonGenesisBlock() - case params.CalaverasChainName: + cfg.Genesis = genesis if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = 123 // https://gist.github.com/holiman/c5697b041b3dc18c50a5cdd382cbdd16 + cfg.NetworkID = params.NetworkIDByChainName(chain) } - cfg.Genesis = core.DefaultCalaverasGenesisBlock() - case params.SokolChainName: - if !ctx.GlobalIsSet(NetworkIdFlag.Name) { - cfg.NetworkID = 77 + SetDNSDiscoveryDefaults(cfg, *genesisHash) + case "": + if cfg.NetworkID == 1 { + SetDNSDiscoveryDefaults(cfg, params.MainnetGenesisHash) } - cfg.Genesis = core.DefaultSokolGenesisBlock() - case params.DevChainName: + case networkname.DevChainName: if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkID = 1337 } + // Create new developer account or reuse existing one developer := cfg.Miner.Etherbase if developer == (common.Address{}) { @@ -1247,11 +1484,17 @@ func SetEthConfig(ctx *cli.Context, nodeConfig *node.Config, cfg *ethconfig.Conf // Create a new developer genesis block or reuse existing one cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer) + log.Info("Using custom developer period", "seconds", cfg.Genesis.Config.Clique.Period) if !ctx.GlobalIsSet(MinerGasPriceFlag.Name) { cfg.Miner.GasPrice = big.NewInt(1) } - default: - Fatalf("ChainDB name is not recognized: %s", chain) + } + + if ctx.GlobalIsSet(OverrideTerminalTotalDifficulty.Name) { + cfg.OverrideTerminalTotalDifficulty = GlobalBig(ctx, OverrideTerminalTotalDifficulty.Name) + } + if ctx.GlobalIsSet(OverrideMergeForkBlock.Name) { + cfg.OverrideMergeForkBlock = GlobalBig(ctx, OverrideMergeForkBlock.Name) } } @@ -1284,37 +1527,6 @@ func SplitTagsFlag(tagsFlag string) map[string]string { return tagsMap } -// MakeChainDatabase open a database using the flags passed to the client and will hard crash if it fails. -func MakeChainDatabase(logger log.Logger, cfg *node.Config) kv.RwDB { - chainDb, err := node.OpenDatabase(cfg, logger, kv.ChainDB) - if err != nil { - Fatalf("Could not open database: %v", err) - } - return chainDb -} - -func MakeGenesis(ctx *cli.Context) *core.Genesis { - var genesis *core.Genesis - chain := ctx.GlobalString(ChainFlag.Name) - switch chain { - case params.RopstenChainName: - genesis = core.DefaultRopstenGenesisBlock() - case params.RinkebyChainName: - genesis = core.DefaultRinkebyGenesisBlock() - case params.GoerliChainName: - genesis = core.DefaultGoerliGenesisBlock() - case params.ErigonMineName: - genesis = core.DefaultErigonGenesisBlock() - case params.CalaverasChainName: - genesis = core.DefaultCalaverasGenesisBlock() - case params.SokolChainName: - genesis = core.DefaultSokolGenesisBlock() - case params.DevChainName: - Fatalf("Developer chains are ephemeral") - } - return genesis -} - // MakeConsolePreloads retrieves the absolute paths for the console JavaScript // scripts to preload before starting. func MakeConsolePreloads(ctx *cli.Context) []string { diff --git a/common/chan.go b/common/chan.go deleted file mode 100644 index 455de9460de..00000000000 --- a/common/chan.go +++ /dev/null @@ -1,30 +0,0 @@ -package common - -import "errors" - -var ErrStopped = errors.New("stopped") -var ErrUnwind = errors.New("unwound") - -func Stopped(ch <-chan struct{}) error { - if ch == nil { - return nil - } - select { - case <-ch: - return ErrStopped - default: - } - return nil -} - -func SafeClose(ch chan struct{}) { - if ch == nil { - return - } - select { - case <-ch: - // Channel was already closed - default: - close(ch) - } -} diff --git a/common/changeset/account_changeset.go b/common/changeset/account_changeset.go index 57f3b1d2bf6..8d28f7c6f50 100644 --- a/common/changeset/account_changeset.go +++ b/common/changeset/account_changeset.go @@ -3,20 +3,22 @@ package changeset import ( "bytes" "encoding/binary" + "fmt" "sort" + "github.com/ledgerwatch/erigon-lib/common/length" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" ) type Encoder func(blockN uint64, s *ChangeSet, f func(k, v []byte) error) error -type Decoder func(dbKey, dbValue []byte) (blockN uint64, k, v []byte) +type Decoder func(dbKey, dbValue []byte) (blockN uint64, k, v []byte, err error) func NewAccountChangeSet() *ChangeSet { return &ChangeSet{ Changes: make([]Change, 0), - keyLen: common.AddressLength, + keyLen: length.Addr, } } @@ -34,12 +36,14 @@ func EncodeAccounts(blockN uint64, s *ChangeSet, f func(k, v []byte) error) erro return nil } -func DecodeAccounts(dbKey, dbValue []byte) (uint64, []byte, []byte) { +func DecodeAccounts(dbKey, dbValue []byte) (uint64, []byte, []byte, error) { blockN := binary.BigEndian.Uint64(dbKey) - k := dbValue[:common.AddressLength] - v := dbValue[common.AddressLength:] - - return blockN, k, v + if len(dbValue) < length.Addr { + return 0, nil, nil, fmt.Errorf("account changes purged for block %d", blockN) + } + k := dbValue[:length.Addr] + v := dbValue[length.Addr:] + return blockN, k, v, nil } func FindAccount(c kv.CursorDupSort, blockNumber uint64, key []byte) ([]byte, error) { @@ -48,7 +52,10 @@ func FindAccount(c kv.CursorDupSort, blockNumber uint64, key []byte) ([]byte, er if err != nil { return nil, err } - _, k, v = DecodeAccounts(k, v) + _, k, v, err = DecodeAccounts(k, v) + if err != nil { + return nil, err + } if !bytes.HasPrefix(k, key) { return nil, nil } @@ -56,14 +63,12 @@ func FindAccount(c kv.CursorDupSort, blockNumber uint64, key []byte) ([]byte, er } // GetModifiedAccounts returns a list of addresses that were modified in the block range +// [startNum:endNum) func GetModifiedAccounts(db kv.Tx, startNum, endNum uint64) ([]common.Address, error) { changedAddrs := make(map[common.Address]struct{}) - if err := Walk(db, kv.AccountChangeSet, dbutils.EncodeBlockNumber(startNum), 0, func(blockN uint64, k, v []byte) (bool, error) { - if blockN > endNum { - return false, nil - } + if err := ForRange(db, kv.AccountChangeSet, startNum, endNum, func(blockN uint64, k, v []byte) error { changedAddrs[common.BytesToAddress(k)] = struct{}{} - return true, nil + return nil }); err != nil { return nil, err } diff --git a/common/changeset/account_changeset_test.go b/common/changeset/account_changeset_test.go index a2ec2023014..5e396eba41a 100644 --- a/common/changeset/account_changeset_test.go +++ b/common/changeset/account_changeset_test.go @@ -38,7 +38,11 @@ func TestEncodingAccount(t *testing.T) { ch2 := m.New() err = m.Encode(1, ch, func(k, v []byte) error { - _, k, v = m.Decode(k, v) + var err error + _, k, v, err = m.Decode(k, v) + if err != nil { + return err + } return ch2.Add(k, v) }) if err != nil { diff --git a/common/changeset/changeset.go b/common/changeset/changeset.go index 36799ebb16e..a149a251be1 100644 --- a/common/changeset/changeset.go +++ b/common/changeset/changeset.go @@ -105,7 +105,7 @@ func (s *ChangeSet) String() string { } // Encoded Method -func FromDBFormat(dbKey, dbValue []byte) (uint64, []byte, []byte) { +func FromDBFormat(dbKey, dbValue []byte) (uint64, []byte, []byte, error) { if len(dbKey) == 8 { return DecodeAccounts(dbKey, dbValue) } else { @@ -144,15 +144,48 @@ func AvailableStorageFrom(tx kv.Tx) (uint64, error) { return binary.BigEndian.Uint64(k), nil } -func Walk(db kv.Tx, bucket string, startkey []byte, fixedbits int, walker func(blockN uint64, k, v []byte) (bool, error)) error { +// [from:to) +func ForRange(db kv.Tx, bucket string, from, to uint64, walker func(blockN uint64, k, v []byte) error) error { var blockN uint64 c, err := db.Cursor(bucket) if err != nil { return err } defer c.Close() - return ethdb.Walk(c, startkey, fixedbits, func(k, v []byte) (bool, error) { - blockN, k, v = FromDBFormat(k, v) + return ethdb.Walk(c, dbutils.EncodeBlockNumber(from), 0, func(k, v []byte) (bool, error) { + var err error + blockN, k, v, err = FromDBFormat(k, v) + if err != nil { + return false, err + } + if blockN >= to { + return false, nil + } + if err = walker(blockN, k, v); err != nil { + return false, err + } + return true, nil + }) +} +func ForEach(db kv.Tx, bucket string, startkey []byte, walker func(blockN uint64, k, v []byte) error) error { + var blockN uint64 + return db.ForEach(bucket, startkey, func(k, v []byte) error { + var err error + blockN, k, v, err = FromDBFormat(k, v) + if err != nil { + return err + } + return walker(blockN, k, v) + }) +} +func ForPrefix(db kv.Tx, bucket string, startkey []byte, walker func(blockN uint64, k, v []byte) error) error { + var blockN uint64 + return db.ForPrefix(bucket, startkey, func(k, v []byte) error { + var err error + blockN, k, v, err = FromDBFormat(k, v) + if err != nil { + return err + } return walker(blockN, k, v) }) } diff --git a/common/changeset/storage_changeset.go b/common/changeset/storage_changeset.go index b595f493b2c..1cd78aa461f 100644 --- a/common/changeset/storage_changeset.go +++ b/common/changeset/storage_changeset.go @@ -4,13 +4,13 @@ import ( "bytes" "encoding/binary" "errors" + "fmt" "sort" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" - "github.com/ledgerwatch/erigon/ethdb" ) const ( @@ -18,25 +18,24 @@ const ( ) var ( - ErrNotFound = errors.New("not found") - ErrFindValue = errors.New("find value error") + ErrNotFound = errors.New("not found") ) func NewStorageChangeSet() *ChangeSet { return &ChangeSet{ Changes: make([]Change, 0), - keyLen: common.AddressLength + common.HashLength + common.IncarnationLength, + keyLen: length.Addr + length.Hash + length.Incarnation, } } func EncodeStorage(blockN uint64, s *ChangeSet, f func(k, v []byte) error) error { sort.Sort(s) - keyPart := common.AddressLength + common.IncarnationLength + keyPart := length.Addr + length.Incarnation for _, cs := range s.Changes { - newK := make([]byte, common.BlockNumberLength+keyPart) + newK := make([]byte, length.BlockNum+keyPart) binary.BigEndian.PutUint64(newK, blockN) copy(newK[8:], cs.Key[:keyPart]) - newV := make([]byte, 0, common.HashLength+len(cs.Value)) + newV := make([]byte, 0, length.Hash+len(cs.Value)) newV = append(append(newV, cs.Key[keyPart:]...), cs.Value...) if err := f(newK, newV); err != nil { return err @@ -45,23 +44,26 @@ func EncodeStorage(blockN uint64, s *ChangeSet, f func(k, v []byte) error) error return nil } -func DecodeStorage(dbKey, dbValue []byte) (uint64, []byte, []byte) { +func DecodeStorage(dbKey, dbValue []byte) (uint64, []byte, []byte, error) { blockN := binary.BigEndian.Uint64(dbKey) - k := make([]byte, common.AddressLength+common.IncarnationLength+common.HashLength) - dbKey = dbKey[common.BlockNumberLength:] // remove BlockN bytes + if len(dbValue) < length.Hash { + return 0, nil, nil, fmt.Errorf("storage changes purged for block %d", blockN) + } + k := make([]byte, length.Addr+length.Incarnation+length.Hash) + dbKey = dbKey[length.BlockNum:] // remove BlockN bytes copy(k, dbKey) - copy(k[len(dbKey):], dbValue[:common.HashLength]) - v := dbValue[common.HashLength:] + copy(k[len(dbKey):], dbValue[:length.Hash]) + v := dbValue[length.Hash:] if len(v) == 0 { v = nil } - return blockN, k, v + return blockN, k, v, nil } func FindStorage(c kv.CursorDupSort, blockNumber uint64, k []byte) ([]byte, error) { - addWithInc, loc := k[:common.AddressLength+common.IncarnationLength], k[common.AddressLength+common.IncarnationLength:] - seek := make([]byte, common.BlockNumberLength+common.AddressLength+common.IncarnationLength) + addWithInc, loc := k[:length.Addr+length.Incarnation], k[length.Addr+length.Incarnation:] + seek := make([]byte, length.BlockNum+length.Addr+length.Incarnation) binary.BigEndian.PutUint64(seek, blockNumber) copy(seek[8:], addWithInc) v, err := c.SeekBothRange(seek, loc) @@ -71,7 +73,7 @@ func FindStorage(c kv.CursorDupSort, blockNumber uint64, k []byte) ([]byte, erro if !bytes.HasPrefix(v, loc) { return nil, ErrNotFound } - return v[common.HashLength:], nil + return v[length.Hash:], nil } // RewindDataPlain generates rewind data for all plain buckets between the timestamp @@ -99,22 +101,13 @@ func RewindData(db kv.Tx, timestampSrc, timestampDst uint64, changes *etl.Collec } func walkAndCollect(collectorFunc func([]byte, []byte) error, db kv.Tx, bucket string, timestampDst, timestampSrc uint64, quit <-chan struct{}) error { - c, err := db.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - return ethdb.Walk(c, dbutils.EncodeBlockNumber(timestampDst), 0, func(dbKey, dbValue []byte) (bool, error) { - if err := common.Stopped(quit); err != nil { - return false, err - } - timestamp, k, v := Mapper[bucket].Decode(dbKey, dbValue) - if timestamp > timestampSrc { - return false, nil + return ForRange(db, bucket, timestampDst, timestampSrc+1, func(_ uint64, k, v []byte) error { + if err := libcommon.Stopped(quit); err != nil { + return err } - if innerErr := collectorFunc(common.CopyBytes(k), common.CopyBytes(v)); innerErr != nil { - return false, innerErr + if innerErr := collectorFunc(libcommon.Copy(k), libcommon.Copy(v)); innerErr != nil { + return innerErr } - return true, nil + return nil }) } diff --git a/common/changeset/storage_changeset_test.go b/common/changeset/storage_changeset_test.go index 74e4505c634..aac0b090b3c 100644 --- a/common/changeset/storage_changeset_test.go +++ b/common/changeset/storage_changeset_test.go @@ -8,6 +8,7 @@ import ( "strconv" "testing" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/ledgerwatch/erigon/common" @@ -77,7 +78,11 @@ func doTestEncodingStorageNew( } ch2 := m.New() err = m.Encode(0, ch, func(k, v []byte) error { - _, k, v = m.Decode(k, v) + var err error + _, k, v, err = m.Decode(k, v) + if err != nil { + return err + } return ch2.Add(k, v) }) if err != nil { @@ -155,7 +160,9 @@ func TestEncodingStorageNewWithoutNotDefaultIncarnationWalk(t *testing.T) { i := 0 err := m.Encode(0, ch, func(k, v []byte) error { - _, k, v = m.Decode(k, v) + var err error + _, k, v, err = m.Decode(k, v) + assert.NoError(t, err) if !bytes.Equal(k, ch.Changes[i].Key) { t.Log(common.Bytes2Hex(ch.Changes[i].Key)) t.Log(common.Bytes2Hex(k)) @@ -267,7 +274,7 @@ func doTestFind( require.NoError(t, err) err = m.Encode(1, ch, func(k, v []byte) error { - if err2 := c.Put(common.CopyBytes(k), common.CopyBytes(v)); err2 != nil { + if err2 := c.Put(libcommon.Copy(k), libcommon.Copy(v)); err2 != nil { return err2 } return nil @@ -320,8 +327,9 @@ func BenchmarkDecodeNewStorage(t *testing.B) { var ch2 *ChangeSet for i := 0; i < t.N; i++ { err := EncodeStorage(1, ch, func(k, v []byte) error { - _, _, _ = DecodeStorage(k, v) - return nil + var err error + _, _, _, err = DecodeStorage(k, v) + return err }) if err != nil { t.Fatal(err) diff --git a/common/compiler/helpers.go b/common/compiler/helpers.go index 5ed640de8f0..59d242af3df 100644 --- a/common/compiler/helpers.go +++ b/common/compiler/helpers.go @@ -19,7 +19,7 @@ package compiler import ( "bytes" - "io/ioutil" + "os" "regexp" ) @@ -55,7 +55,7 @@ type ContractInfo struct { func slurpFiles(files []string) (string, error) { var concat bytes.Buffer for _, file := range files { - content, err := ioutil.ReadFile(file) + content, err := os.ReadFile(file) if err != nil { return "", err } diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index 01de3d4c65f..0e50cd18a86 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -109,7 +109,7 @@ func CompileSolidityString(solc, source string) (map[string]*Contract, error) { return nil, err } args := append(s.makeArgs(), "--") - cmd := exec.Command(s.Path, append(args, "-")...) + cmd := exec.Command(s.Path, append(args, "-")...) //nolint:gosec cmd.Stdin = strings.NewReader(source) return s.run(cmd, source) } @@ -128,7 +128,7 @@ func CompileSolidity(solc string, sourcefiles ...string) (map[string]*Contract, return nil, err } args := append(s.makeArgs(), "--") - cmd := exec.Command(s.Path, append(args, sourcefiles...)...) + cmd := exec.Command(s.Path, append(args, sourcefiles...)...) //nolint:gosec return s.run(cmd, source) } @@ -137,7 +137,7 @@ func (s *Solidity) run(cmd *exec.Cmd, source string) (map[string]*Contract, erro cmd.Stderr = &stderr cmd.Stdout = &stdout if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("solc: %v\n%s", err, stderr.Bytes()) + return nil, fmt.Errorf("solc: %w\n%s", err, stderr.Bytes()) } return ParseCombinedJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), " ")) } @@ -163,7 +163,7 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin // Parse the individual compilation results. var abi interface{} if err := json.Unmarshal([]byte(info.Abi), &abi); err != nil { - return nil, fmt.Errorf("solc: error reading abi definition (%v)", err) + return nil, fmt.Errorf("solc: error reading abi definition (%w)", err) } var userdoc, devdoc interface{} json.Unmarshal([]byte(info.Userdoc), &userdoc) diff --git a/common/compiler/vyper.go b/common/compiler/vyper.go index a9bca95e590..dd588260b09 100644 --- a/common/compiler/vyper.go +++ b/common/compiler/vyper.go @@ -83,7 +83,7 @@ func CompileVyper(vyper string, sourcefiles ...string) (map[string]*Contract, er return nil, err } args := s.makeArgs() - cmd := exec.Command(s.Path, append(args, sourcefiles...)...) + cmd := exec.Command(s.Path, append(args, sourcefiles...)...) //nolint:gosec return s.run(cmd, source) } @@ -92,7 +92,7 @@ func (s *Vyper) run(cmd *exec.Cmd, source string) (map[string]*Contract, error) cmd.Stderr = &stderr cmd.Stdout = &stdout if err := cmd.Run(); err != nil { - return nil, fmt.Errorf("vyper: %v\n%s", err, stderr.Bytes()) + return nil, fmt.Errorf("vyper: %w\n%s", err, stderr.Bytes()) } return ParseVyperJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), " ")) diff --git a/common/dbutils/composite_keys.go b/common/dbutils/composite_keys.go index 19df9c2f6c4..c96592c8711 100644 --- a/common/dbutils/composite_keys.go +++ b/common/dbutils/composite_keys.go @@ -42,13 +42,6 @@ func BlockBodyKey(number uint64, hash common.Hash) []byte { return k } -// ReceiptsKey = blockN (uint64 big endian) -func ReceiptsKey(blockNumber uint64) []byte { - newK := make([]byte, 8) - binary.BigEndian.PutUint64(newK, blockNumber) - return newK -} - // LogKey = blockN (uint64 big endian) + txId (uint32 big endian) func LogKey(blockNumber uint64, txId uint32) []byte { newK := make([]byte, 8+4) diff --git a/common/debug/experiments.go b/common/debug/experiments.go index b95ab7a35c7..2abd9db8771 100644 --- a/common/debug/experiments.go +++ b/common/debug/experiments.go @@ -104,21 +104,6 @@ func SlowCommit() time.Duration { return slowCommit } -var ( - headersSeal bool - getHeadersSeal sync.Once -) - -func HeadersSeal() bool { - getHeadersSeal.Do(func() { - v, _ := os.LookupEnv("HEADERS_SEAL") - if v == "true" { - headersSeal = true - } - }) - return headersSeal -} - var ( stopBeforeStage string stopBeforeStageFlag sync.Once diff --git a/common/debug/log_panic.go b/common/debug/log_panic.go index ef863f1ead1..c7b91a35f44 100644 --- a/common/debug/log_panic.go +++ b/common/debug/log_panic.go @@ -1,12 +1,10 @@ package debug import ( - "fmt" "os" - "runtime/debug" - "strings" "syscall" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/log/v3" ) @@ -16,43 +14,6 @@ func GetSigC(sig *chan os.Signal) { sigc = *sig } -/* -var crashReportDir string -func prettyTime() string { - time := fmt.Sprintf("%v", time.Now()) - return strings.Replace(time[:19], " ", "-", 1) -} -func CheckForCrashes(datadir string) { - crashReportDir = filepath.Join(datadir, "crashreports") - if _, err := os.Stat(crashReportDir); err != nil && os.IsNotExist(err) { - _ = os.MkdirAll(crashReportDir, 0755) - } else if err != nil { - log.Error("log_panic.go: CheckForCrashes", "error", err) - return - } - f, err := os.Open(crashReportDir) - if err != nil { - log.Error("log_panic.go: CheckForCrashes", "error", err) - return - } - fileInfo, err := f.ReadDir(-1) - if err != nil { - log.Error("log_panic.go: CheckForCrashes", "error", err) - return - } - for _, v := range fileInfo { - if !v.IsDir() { - msg := fmt.Sprintf("Crashes From Previous Boots Detected. Find the stack trace in %v", - crashReportDir) - log.Warn(msg) - _ = f.Close() - return - } - } -} -*/ -var panicReplacer = strings.NewReplacer("\n", " ", "\t", "", "\r", "") - // LogPanic - does log panic to logger and to /crashreports then stops the process func LogPanic() { panicResult := recover() @@ -60,49 +21,8 @@ func LogPanic() { return } - stack := string(debug.Stack()) - log.Error("catch panic", "err", panicResult, "stack", panicReplacer.Replace(stack)) - //WriteStackTraceOnPanic(stack) + log.Error("catch panic", "err", panicResult, "stack", dbg.Stack()) if sigc != nil { sigc <- syscall.SIGINT } } - -// ReportPanicAndRecover - does save panic to datadir/crashreports, bud doesn't log to logger and doesn't stop the process -// it returns recovered panic as error in format friendly for our logger -// common pattern of use - assign to named output param: -// func A() (err error) { -// defer func() { err = debug.ReportPanicAndRecover() }() // avoid crash because Erigon's core does many things -// } -func ReportPanicAndRecover(err error) error { - panicResult := recover() - if panicResult == nil { - return err - } - - stack := string(debug.Stack()) - switch typed := panicResult.(type) { - case error: - err = fmt.Errorf("%w, trace: %s", typed, panicReplacer.Replace(stack)) - default: - err = fmt.Errorf("%+v, trace: %s", typed, panicReplacer.Replace(stack)) - } - //log.Error("panic", "err", panicResult, "stack", panicReplacer.Replace(stack)) - //WriteStackTraceOnPanic(stack) - return err -} - -/* -func WriteStackTraceOnPanic(stack string) { - fileName := filepath.Join(crashReportDir, prettyTime()+".txt") - f, errFs := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) - if errFs != nil { - log.Error("log_panic.go:WriteStackTraceOnPanic", "error", errFs) - f.Close() - return - } - f.WriteString(stack) - f.Sync() - f.Close() -} -*/ diff --git a/common/debug/memstats.go b/common/debug/memstats.go index 31e255dc265..0d046ecf4d3 100644 --- a/common/debug/memstats.go +++ b/common/debug/memstats.go @@ -3,11 +3,13 @@ package debug import ( "fmt" "runtime" + + "github.com/ledgerwatch/erigon-lib/common" ) func PrintMemStats(short bool) { var m runtime.MemStats - runtime.ReadMemStats(&m) + common.ReadMemStats(&m) // For info on each, see: https://golang.org/pkg/runtime/#MemStats if short { fmt.Printf("HeapInuse: %vMb\n", ByteToMb(m.HeapInuse)) diff --git a/common/etl/ETL-collector.png b/common/etl/ETL-collector.png deleted file mode 100644 index 2e88cb2d43b..00000000000 Binary files a/common/etl/ETL-collector.png and /dev/null differ diff --git a/common/etl/ETL.png b/common/etl/ETL.png deleted file mode 100644 index 757921eeff9..00000000000 Binary files a/common/etl/ETL.png and /dev/null differ diff --git a/common/etl/README.md b/common/etl/README.md deleted file mode 100644 index 79bc21bce1c..00000000000 --- a/common/etl/README.md +++ /dev/null @@ -1,183 +0,0 @@ -# ETL - -ETL framework is most commonly used in [staged sync](../../eth/stagedsync/README.md). - -It implements a pattern where we extract some data from a database, transform it, -then put it into temp files and insert back to the database in sorted order. - -Inserting entries into our KV storage sorted by keys helps to minimize write -amplification, hence it is much faster, even considering additional I/O that -is generated by storing files. - -It behaves similarly to enterprise [Extract, Tranform, Load](https://en.wikipedia.org/wiki/Extract,_transform,_load) frameworks, hence the name. -We use temporary files because that helps keep RAM usage predictable and allows -using ETL on large amounts of data. - -### Example - -``` -func keyTransformExtractFunc(transformKey func([]byte) ([]byte, error)) etl.ExtractFunc { - return func(k, v []byte, next etl.ExtractNextFunc) error { - newK, err := transformKey(k) - if err != nil { - return err - } - return next(k, newK, v) - } -} - -err := etl.Transform( - db, // database - dbutils.PlainStateBucket, // "from" bucket - dbutils.CurrentStateBucket, // "to" bucket - datadir, // where to store temp files - keyTransformExtractFunc(transformPlainStateKey), // transformFunc on extraction - etl.IdentityLoadFunc, // transform on load - etl.TransformArgs{ // additional arguments - Quit: quit, - }, - ) - if err != nil { - return err - } - -``` - -## Data Transformation - -The whole flow is shown in the image - -![](./ETL.png) - -Data could be transformed in two places along the pipeline: - -* transform on extraction - -* transform on loading - -### Transform On Extraction - -`type ExtractFunc func(k []byte, v []byte, next ExtractNextFunc) error` - -Transform on extraction function receives the currenk key and value from the -source bucket. - -### Transform On Loading - -`type LoadFunc func(k []byte, value []byte, state State, next LoadNextFunc) error` - -As well as the current key and value, the transform on loading function -receives the `State` object that can receive data from the destination bucket. - -That is used in index generation where we want to extend index entries with new -data instead of just adding new ones. - -### `<...>NextFunc` pattern - -Sometimes we need to produce multiple entries from a single entry when -transforming. - -To do that, each of the transform function receives a next function that should -be called to move data further. That means that each transformation can produce -any number of outputs for a single input. - -It can be one output, like in `IdentityLoadFunc`: - -``` -func IdentityLoadFunc(k []byte, value []byte, _ State, next LoadNextFunc) error { - return next(k, k, value) // go to the next step -} -``` - -It can be multiple outputs like when each entry is a `ChangeSet`: - -``` -func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - blockNum, _ := dbutils.DecodeTimestamp(dbKey) - return bytes2walker(dbValue).Walk(func(changesetKey, changesetValue []byte) error { - key := common.CopyBytes(changesetKey) - v := make([]byte, 9) - binary.BigEndian.PutUint64(v, blockNum) - if len(changesetValue) == 0 { - v[8] = 1 - } - return next(dbKey, key, v) // go to the next step - }) - } -``` - -### Buffer Types - -Before the data is being flushed into temp files, it is getting collected into -a buffer until if overflows (`etl.ExtractArgs.BufferSize`). - -There are different types of buffers available with different behaviour. - -* `SortableSliceBuffer` -- just append `(k, v1)`, `(k, v2)` onto a slice. Duplicate keys - will lead to duplicate entries: `[(k, v1) (k, v2)]`. - -* `SortableAppendBuffer` -- on duplicate keys: merge. `(k, v1)`, `(k, v2)` - will lead to `k: [v1 v2]` - -* `SortableOldestAppearedBuffer` -- on duplicate keys: keep the oldest. `(k, - v1)`, `(k v2)` will lead to `k: v1` - -### Transforming Structs - -Both transform functions and next functions allow only byte arrays. -If you need to pass a struct, you will need to marshal it. - -### Loading Into Database - -We load data from the temp files into a database in batches, limited by -`IdealBatchSize()` of an `ethdb.Mutation`. - -(for tests we can also override it) - -### Handling Interruptions - -ETL processes are long, so we need to be able to handle interruptions. - -#### Handing `Ctrl+C` - -You can pass your quit channel into `Quit` parameter into `etl.TransformArgs`. - -When this channel is closed, ETL will be interrupted. - -#### Saving & Restoring State - -Interrupting in the middle of loading can lead to inconsistent state in the -database. - -To avoid that, the ETL framework allows storing progress by setting `OnLoadCommit` in `etl.TransformArgs`. - -Then we can use this data to know the progress the ETL transformation made. - -You can also specify `ExtractStartKey` and `ExtractEndKey` to limit the nubmer -of items transformed. - -## Ways to work with ETL framework - -There might be 2 scenarios on how you want to work with the ETL framework. - -![](./ETL-collector.png) - -### `etl.Transform` function - -The vast majority of use-cases is when we extract data from one bucket and in -the end, load it into another bucket. That is the use-case for `etl.Transform` -function. - -### `etl.Collector` struct - -If you want a more modular behaviour instead of just reading from the DB (like -generating intermediate hashes in `../../core/chain_makers.go`, you can use -`etl.Collector` struct directly. - -It has a `.Collect()` method that you can provide your data to. - - -## Optimizations - -* if all data fits into a single file, we don't write anything to disk and just - use in-memory storage. diff --git a/common/etl/buffers.go b/common/etl/buffers.go deleted file mode 100644 index f07876ef789..00000000000 --- a/common/etl/buffers.go +++ /dev/null @@ -1,285 +0,0 @@ -package etl - -import ( - "bytes" - "fmt" - "sort" - "strconv" - - "github.com/c2h5oh/datasize" - "github.com/ledgerwatch/erigon-lib/kv" -) - -const ( - //SliceBuffer - just simple slice w - SortableSliceBuffer = iota - //SortableAppendBuffer - map[k] [v1 v2 v3] - SortableAppendBuffer - // SortableOldestAppearedBuffer - buffer that keeps only the oldest entries. - // if first v1 was added under key K, then v2; only v1 will stay - SortableOldestAppearedBuffer - - BufIOSize = 64 * 4096 // 64 pages | default is 1 page | increasing further doesn't show speedup on SSD -) - -var BufferOptimalSize = 256 * datasize.MB /* var because we want to sometimes change it from tests or command-line flags */ - -type Buffer interface { - Put(k, v []byte) - Get(i int) sortableBufferEntry - Len() int - Reset() - GetEntries() []sortableBufferEntry - Sort() - CheckFlushSize() bool - SetComparator(cmp kv.CmpFunc) -} - -type sortableBufferEntry struct { - key []byte - value []byte -} - -var ( - _ Buffer = &sortableBuffer{} - _ Buffer = &appendSortableBuffer{} - _ Buffer = &oldestEntrySortableBuffer{} -) - -func NewSortableBuffer(bufferOptimalSize datasize.ByteSize) *sortableBuffer { - return &sortableBuffer{ - entries: make([]sortableBufferEntry, 0), - size: 0, - optimalSize: int(bufferOptimalSize.Bytes()), - } -} - -type sortableBuffer struct { - entries []sortableBufferEntry - size int - optimalSize int - comparator kv.CmpFunc -} - -func (b *sortableBuffer) Put(k, v []byte) { - b.size += len(k) - b.size += len(v) - b.entries = append(b.entries, sortableBufferEntry{k, v}) -} - -func (b *sortableBuffer) Size() int { - return b.size -} - -func (b *sortableBuffer) Len() int { - return len(b.entries) -} - -func (b *sortableBuffer) SetComparator(cmp kv.CmpFunc) { - b.comparator = cmp -} - -func (b *sortableBuffer) Less(i, j int) bool { - if b.comparator != nil { - return b.comparator(b.entries[i].key, b.entries[j].key, b.entries[i].value, b.entries[j].value) < 0 - } - return bytes.Compare(b.entries[i].key, b.entries[j].key) < 0 -} - -func (b *sortableBuffer) Swap(i, j int) { - b.entries[i], b.entries[j] = b.entries[j], b.entries[i] -} - -func (b *sortableBuffer) Get(i int) sortableBufferEntry { - return b.entries[i] -} - -func (b *sortableBuffer) Reset() { - b.entries = nil - b.size = 0 -} -func (b *sortableBuffer) Sort() { - sort.Stable(b) -} - -func (b *sortableBuffer) GetEntries() []sortableBufferEntry { - return b.entries -} - -func (b *sortableBuffer) CheckFlushSize() bool { - return b.size >= b.optimalSize -} - -func NewAppendBuffer(bufferOptimalSize datasize.ByteSize) *appendSortableBuffer { - return &appendSortableBuffer{ - entries: make(map[string][]byte), - size: 0, - optimalSize: int(bufferOptimalSize.Bytes()), - } -} - -type appendSortableBuffer struct { - entries map[string][]byte - size int - optimalSize int - sortedBuf []sortableBufferEntry - comparator kv.CmpFunc -} - -func (b *appendSortableBuffer) Put(k, v []byte) { - ks := string(k) - stored, ok := b.entries[ks] - if !ok { - b.size += len(k) - } - b.size += len(v) - stored = append(stored, v...) - b.entries[ks] = stored -} - -func (b *appendSortableBuffer) SetComparator(cmp kv.CmpFunc) { - b.comparator = cmp -} - -func (b *appendSortableBuffer) Size() int { - return b.size -} - -func (b *appendSortableBuffer) Len() int { - return len(b.entries) -} -func (b *appendSortableBuffer) Sort() { - for i := range b.entries { - b.sortedBuf = append(b.sortedBuf, sortableBufferEntry{key: []byte(i), value: b.entries[i]}) - } - sort.Stable(b) -} - -func (b *appendSortableBuffer) Less(i, j int) bool { - if b.comparator != nil { - return b.comparator(b.sortedBuf[i].key, b.sortedBuf[j].key, b.sortedBuf[i].value, b.sortedBuf[j].value) < 0 - } - return bytes.Compare(b.sortedBuf[i].key, b.sortedBuf[j].key) < 0 -} - -func (b *appendSortableBuffer) Swap(i, j int) { - b.sortedBuf[i], b.sortedBuf[j] = b.sortedBuf[j], b.sortedBuf[i] -} - -func (b *appendSortableBuffer) Get(i int) sortableBufferEntry { - return b.sortedBuf[i] -} -func (b *appendSortableBuffer) Reset() { - b.sortedBuf = nil - b.entries = make(map[string][]byte) - b.size = 0 -} - -func (b *appendSortableBuffer) GetEntries() []sortableBufferEntry { - return b.sortedBuf -} - -func (b *appendSortableBuffer) CheckFlushSize() bool { - return b.size >= b.optimalSize -} - -func NewOldestEntryBuffer(bufferOptimalSize datasize.ByteSize) *oldestEntrySortableBuffer { - return &oldestEntrySortableBuffer{ - entries: make(map[string][]byte), - size: 0, - optimalSize: int(bufferOptimalSize.Bytes()), - } -} - -type oldestEntrySortableBuffer struct { - entries map[string][]byte - size int - optimalSize int - sortedBuf []sortableBufferEntry - comparator kv.CmpFunc -} - -func (b *oldestEntrySortableBuffer) SetComparator(cmp kv.CmpFunc) { - b.comparator = cmp -} - -func (b *oldestEntrySortableBuffer) Put(k, v []byte) { - ks := string(k) - _, ok := b.entries[ks] - if ok { - // if we already had this entry, we are going to keep it and ignore new value - return - } - - b.size += len(k) + len(v) - b.entries[ks] = v -} - -func (b *oldestEntrySortableBuffer) Size() int { - return b.size -} - -func (b *oldestEntrySortableBuffer) Len() int { - return len(b.entries) -} - -func (b *oldestEntrySortableBuffer) Sort() { - for k, v := range b.entries { - b.sortedBuf = append(b.sortedBuf, sortableBufferEntry{key: []byte(k), value: v}) - } - sort.Stable(b) -} - -func (b *oldestEntrySortableBuffer) Less(i, j int) bool { - if b.comparator != nil { - return b.comparator(b.sortedBuf[i].key, b.sortedBuf[j].key, b.sortedBuf[i].value, b.sortedBuf[j].value) < 0 - } - return bytes.Compare(b.sortedBuf[i].key, b.sortedBuf[j].key) < 0 -} - -func (b *oldestEntrySortableBuffer) Swap(i, j int) { - b.sortedBuf[i], b.sortedBuf[j] = b.sortedBuf[j], b.sortedBuf[i] -} - -func (b *oldestEntrySortableBuffer) Get(i int) sortableBufferEntry { - return b.sortedBuf[i] -} -func (b *oldestEntrySortableBuffer) Reset() { - b.sortedBuf = nil - b.entries = make(map[string][]byte) - b.size = 0 -} - -func (b *oldestEntrySortableBuffer) GetEntries() []sortableBufferEntry { - return b.sortedBuf -} - -func (b *oldestEntrySortableBuffer) CheckFlushSize() bool { - return b.size >= b.optimalSize -} - -func getBufferByType(tp int, size datasize.ByteSize) Buffer { - switch tp { - case SortableSliceBuffer: - return NewSortableBuffer(size) - case SortableAppendBuffer: - return NewAppendBuffer(size) - case SortableOldestAppearedBuffer: - return NewOldestEntryBuffer(size) - default: - panic("unknown buffer type " + strconv.Itoa(tp)) - } -} - -func getTypeByBuffer(b Buffer) int { - switch b.(type) { - case *sortableBuffer: - return SortableSliceBuffer - case *appendSortableBuffer: - return SortableAppendBuffer - case *oldestEntrySortableBuffer: - return SortableOldestAppearedBuffer - default: - panic(fmt.Sprintf("unknown buffer type: %T ", b)) - } -} diff --git a/common/etl/collector.go b/common/etl/collector.go deleted file mode 100644 index d080d7f87ff..00000000000 --- a/common/etl/collector.go +++ /dev/null @@ -1,277 +0,0 @@ -package etl - -import ( - "bytes" - "container/heap" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "time" - - "github.com/c2h5oh/datasize" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/log/v3" - "github.com/ugorji/go/codec" -) - -const TmpDirName = "etl-temp" - -type LoadNextFunc func(originalK, k, v []byte) error -type LoadFunc func(k, v []byte, table CurrentTableReader, next LoadNextFunc) error - -// Collector performs the job of ETL Transform, but can also be used without "E" (Extract) part -// as a Collect Transform Load -type Collector struct { - extractNextFunc ExtractNextFunc - flushBuffer func([]byte, bool) error - dataProviders []dataProvider - allFlushed bool - autoClean bool - bufType int -} - -// NewCollectorFromFiles creates collector from existing files (left over from previous unsuccessful loading) -func NewCollectorFromFiles(tmpdir string) (*Collector, error) { - if _, err := os.Stat(tmpdir); os.IsNotExist(err) { - return nil, nil - } - fileInfos, err := ioutil.ReadDir(tmpdir) - if err != nil { - return nil, fmt.Errorf("collector from files - reading directory %s: %w", tmpdir, err) - } - if len(fileInfos) == 0 { - return nil, nil - } - dataProviders := make([]dataProvider, len(fileInfos)) - for i, fileInfo := range fileInfos { - var dataProvider fileDataProvider - dataProvider.file, err = os.Open(filepath.Join(tmpdir, fileInfo.Name())) - if err != nil { - return nil, fmt.Errorf("collector from files - opening file %s: %w", fileInfo.Name(), err) - } - dataProviders[i] = &dataProvider - } - return &Collector{dataProviders: dataProviders, allFlushed: true, autoClean: false}, nil -} - -// NewCriticalCollector does not clean up temporary files if loading has failed -func NewCriticalCollector(tmpdir string, sortableBuffer Buffer) *Collector { - c := NewCollector(tmpdir, sortableBuffer) - c.autoClean = false - return c -} - -func NewCollector(tmpdir string, sortableBuffer Buffer) *Collector { - c := &Collector{autoClean: true, bufType: getTypeByBuffer(sortableBuffer)} - encoder := codec.NewEncoder(nil, &cbor) - - c.flushBuffer = func(currentKey []byte, canStoreInRam bool) error { - if sortableBuffer.Len() == 0 { - return nil - } - var provider dataProvider - var err error - sortableBuffer.Sort() - if canStoreInRam && len(c.dataProviders) == 0 { - provider = KeepInRAM(sortableBuffer) - c.allFlushed = true - } else { - provider, err = FlushToDisk(encoder, currentKey, sortableBuffer, tmpdir) - } - if err != nil { - return err - } - if provider != nil { - c.dataProviders = append(c.dataProviders, provider) - } - return nil - } - - c.extractNextFunc = func(originalK, k []byte, v []byte) error { - sortableBuffer.Put(common.CopyBytes(k), common.CopyBytes(v)) - if sortableBuffer.CheckFlushSize() { - if err := c.flushBuffer(originalK, false); err != nil { - return err - } - } - return nil - } - return c -} - -func (c *Collector) Collect(k, v []byte) error { - return c.extractNextFunc(k, k, v) -} - -func (c *Collector) Load(logPrefix string, db kv.RwTx, toBucket string, loadFunc LoadFunc, args TransformArgs) error { - defer func() { - if c.autoClean { - c.Close(logPrefix) - } - }() - if !c.allFlushed { - if e := c.flushBuffer(nil, true); e != nil { - return e - } - } - if err := loadFilesIntoBucket(logPrefix, db, toBucket, c.bufType, c.dataProviders, loadFunc, args); err != nil { - return err - } - return nil -} - -func (c *Collector) Close(logPrefix string) { - totalSize := uint64(0) - for _, p := range c.dataProviders { - totalSize += p.Dispose() - } - if totalSize > 0 { - log.Info(fmt.Sprintf("[%s] etl: temp files removed", logPrefix), "total size", datasize.ByteSize(totalSize).HumanReadable()) - } -} - -func loadFilesIntoBucket(logPrefix string, db kv.RwTx, bucket string, bufType int, providers []dataProvider, loadFunc LoadFunc, args TransformArgs) error { - decoder := codec.NewDecoder(nil, &cbor) - var m runtime.MemStats - - h := &Heap{comparator: args.Comparator} - heap.Init(h) - for i, provider := range providers { - if key, value, err := provider.Next(decoder); err == nil { - he := HeapElem{key, i, value} - heap.Push(h, he) - } else /* we must have at least one entry per file */ { - eee := fmt.Errorf("%s: error reading first readers: n=%d current=%d provider=%s err=%v", - logPrefix, len(providers), i, provider, err) - panic(eee) - } - } - var c kv.RwCursor - - currentTable := ¤tTableReader{db, bucket} - haveSortingGuaranties := isIdentityLoadFunc(loadFunc) // user-defined loadFunc may change ordering - var lastKey []byte - if bucket != "" { // passing empty bucket name is valid case for etl when DB modification is not expected - var err error - c, err = db.RwCursor(bucket) - if err != nil { - return err - } - var errLast error - lastKey, _, errLast = c.Last() - if errLast != nil { - return errLast - } - } - var canUseAppend bool - isDupSort := kv.ChaindataTablesCfg[bucket].Flags&kv.DupSort != 0 && !kv.ChaindataTablesCfg[bucket].AutoDupSortKeysConversion - - logEvery := time.NewTicker(30 * time.Second) - defer logEvery.Stop() - - i := 0 - var prevK []byte - loadNextFunc := func(originalK, k, v []byte) error { - if i == 0 { - isEndOfBucket := lastKey == nil || bytes.Compare(lastKey, k) == -1 - canUseAppend = haveSortingGuaranties && isEndOfBucket - } - i++ - - // SortableOldestAppearedBuffer must guarantee that only 1 oldest value of key will appear - // but because size of buffer is limited - each flushed file does guarantee "oldest appeared" - // property, but files may overlap. files are sorted, just skip repeated keys here - if bufType == SortableOldestAppearedBuffer && bytes.Equal(prevK, k) { - return nil - } - prevK = k - - select { - default: - case <-logEvery.C: - logArs := []interface{}{"into", bucket} - if args.LogDetailsLoad != nil { - logArs = append(logArs, args.LogDetailsLoad(k, v)...) - } else { - logArs = append(logArs, "current key", makeCurrentKeyStr(k)) - } - - runtime.ReadMemStats(&m) - logArs = append(logArs, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) - log.Info(fmt.Sprintf("[%s] ETL [2/2] Loading", logPrefix), logArs...) - } - - if canUseAppend && len(v) == 0 { - return nil // nothing to delete after end of bucket - } - if len(v) == 0 { - if err := c.Delete(k, nil); err != nil { - return err - } - return nil - } - if canUseAppend { - if isDupSort { - if err := c.(kv.RwCursorDupSort).AppendDup(k, v); err != nil { - return fmt.Errorf("%s: bucket: %s, appendDup: k=%x, %w", logPrefix, bucket, k, err) - } - } else { - if err := c.Append(k, v); err != nil { - return fmt.Errorf("%s: bucket: %s, append: k=%x, v=%x, %w", logPrefix, bucket, k, v, err) - } - } - - return nil - } - if err := c.Put(k, v); err != nil { - return fmt.Errorf("%s: put: k=%x, %w", logPrefix, k, err) - } - return nil - } - // Main loading loop - for h.Len() > 0 { - if err := common.Stopped(args.Quit); err != nil { - return err - } - - element := (heap.Pop(h)).(HeapElem) - provider := providers[element.TimeIdx] - err := loadFunc(element.Key, element.Value, currentTable, loadNextFunc) - if err != nil { - return err - } - if element.Key, element.Value, err = provider.Next(decoder); err == nil { - heap.Push(h, element) - } else if err != io.EOF { - return fmt.Errorf("%s: error while reading next element from disk: %v", logPrefix, err) - } - } - - runtime.ReadMemStats(&m) - log.Debug( - fmt.Sprintf("[%s] Committed batch", logPrefix), - "bucket", bucket, - "records", i, - "current key", makeCurrentKeyStr(nil), - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) - - return nil -} - -func makeCurrentKeyStr(k []byte) string { - var currentKeyStr string - if k == nil { - currentKeyStr = "final" - } else if len(k) < 4 { - currentKeyStr = fmt.Sprintf("%x", k) - } else if k[0] == 0 && k[1] == 0 && k[2] == 0 && k[3] == 0 && len(k) >= 8 { // if key has leading zeroes, show a bit more info - currentKeyStr = fmt.Sprintf("%x", k) - } else { - currentKeyStr = fmt.Sprintf("%x...", k[:4]) - } - return currentKeyStr -} diff --git a/common/etl/dataprovider.go b/common/etl/dataprovider.go deleted file mode 100644 index 04adf7c87b0..00000000000 --- a/common/etl/dataprovider.go +++ /dev/null @@ -1,133 +0,0 @@ -package etl - -import ( - "bufio" - "fmt" - "io" - "io/ioutil" - "os" - "runtime" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/log/v3" -) - -type dataProvider interface { - Next(decoder Decoder) ([]byte, []byte, error) - Dispose() uint64 // Safe for repeated call, doesn't return error - means defer-friendly -} - -type fileDataProvider struct { - file *os.File - reader io.Reader -} - -type Encoder interface { - Encode(toWrite interface{}) error - Reset(writer io.Writer) -} - -func FlushToDisk(encoder Encoder, currentKey []byte, b Buffer, tmpdir string) (dataProvider, error) { - if b.Len() == 0 { - return nil, nil - } - // if we are going to create files in the system temp dir, we don't need any - // subfolders. - if tmpdir != "" { - if err := os.MkdirAll(tmpdir, 0755); err != nil { - return nil, err - } - } - - bufferFile, err := ioutil.TempFile(tmpdir, "tg-sync-sortable-buf") - if err != nil { - return nil, err - } - defer bufferFile.Sync() //nolint:errcheck - - w := bufio.NewWriterSize(bufferFile, BufIOSize) - defer w.Flush() //nolint:errcheck - - defer func() { - b.Reset() // run it after buf.flush and file.sync - var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Info( - "Flushed buffer file", - "name", bufferFile.Name(), - "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) - }() - - encoder.Reset(w) - for _, entry := range b.GetEntries() { - err = writeToDisk(encoder, entry.key, entry.value) - if err != nil { - return nil, fmt.Errorf("error writing entries to disk: %v", err) - } - } - - return &fileDataProvider{bufferFile, nil}, nil -} - -func (p *fileDataProvider) Next(decoder Decoder) ([]byte, []byte, error) { - if p.reader == nil { - _, err := p.file.Seek(0, 0) - if err != nil { - return nil, nil, err - } - p.reader = bufio.NewReaderSize(p.file, BufIOSize) - } - decoder.Reset(p.reader) - return readElementFromDisk(decoder) -} - -func (p *fileDataProvider) Dispose() uint64 { - info, _ := os.Stat(p.file.Name()) - _ = p.file.Close() - _ = os.Remove(p.file.Name()) - if info == nil { - return 0 - } - return uint64(info.Size()) -} - -func (p *fileDataProvider) String() string { - return fmt.Sprintf("%T(file: %s)", p, p.file.Name()) -} - -func writeToDisk(encoder Encoder, key []byte, value []byte) error { - toWrite := [][]byte{key, value} - return encoder.Encode(toWrite) -} - -func readElementFromDisk(decoder Decoder) ([]byte, []byte, error) { - result := make([][]byte, 2) - err := decoder.Decode(&result) - return result[0], result[1], err -} - -type memoryDataProvider struct { - buffer Buffer - currentIndex int -} - -func KeepInRAM(buffer Buffer) dataProvider { - return &memoryDataProvider{buffer, 0} -} - -func (p *memoryDataProvider) Next(decoder Decoder) ([]byte, []byte, error) { - if p.currentIndex >= p.buffer.Len() { - return nil, nil, io.EOF - } - entry := p.buffer.Get(p.currentIndex) - p.currentIndex++ - return entry.key, entry.value, nil -} - -func (p *memoryDataProvider) Dispose() uint64 { - return 0 /* doesn't take space on disk */ -} - -func (p *memoryDataProvider) String() string { - return fmt.Sprintf("%T(buffer.Len: %d)", p, p.buffer.Len()) -} diff --git a/common/etl/etl.go b/common/etl/etl.go deleted file mode 100644 index 2769bdd0a23..00000000000 --- a/common/etl/etl.go +++ /dev/null @@ -1,175 +0,0 @@ -package etl - -import ( - "bytes" - "fmt" - "io" - "reflect" - "runtime" - "time" - - "github.com/c2h5oh/datasize" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/log/v3" - "github.com/ugorji/go/codec" -) - -var ( - cbor codec.CborHandle -) - -type Decoder interface { - Reset(reader io.Reader) - Decode(interface{}) error -} - -type CurrentTableReader interface { - Get([]byte) ([]byte, error) -} - -type ExtractNextFunc func(originalK, k []byte, v []byte) error -type ExtractFunc func(k []byte, v []byte, next ExtractNextFunc) error - -// NextKey generates the possible next key w/o changing the key length. -// for [0x01, 0x01, 0x01] it will generate [0x01, 0x01, 0x02], etc -func NextKey(key []byte) ([]byte, error) { - if len(key) == 0 { - return key, fmt.Errorf("could not apply NextKey for the empty key") - } - nextKey := common.CopyBytes(key) - for i := len(key) - 1; i >= 0; i-- { - b := nextKey[i] - if b < 0xFF { - nextKey[i] = b + 1 - return nextKey, nil - } - if b == 0xFF { - nextKey[i] = 0 - } - } - return key, fmt.Errorf("overflow while applying NextKey") -} - -// LoadCommitHandler is a callback called each time a new batch is being -// loaded from files into a DB -// * `key`: last commited key to the database (use etl.NextKey helper to use in LoadStartKey) -// * `isDone`: true, if everything is processed -type LoadCommitHandler func(db kv.Putter, key []byte, isDone bool) error -type AdditionalLogArguments func(k, v []byte) (additionalLogArguments []interface{}) - -type TransformArgs struct { - ExtractStartKey []byte - ExtractEndKey []byte - FixedBits int - BufferType int - BufferSize int - Quit <-chan struct{} - - LogDetailsExtract AdditionalLogArguments - LogDetailsLoad AdditionalLogArguments - - Comparator kv.CmpFunc -} - -func Transform( - logPrefix string, - db kv.RwTx, - fromBucket string, - toBucket string, - tmpdir string, - extractFunc ExtractFunc, - loadFunc LoadFunc, - args TransformArgs, -) error { - bufferSize := BufferOptimalSize - if args.BufferSize > 0 { - bufferSize = datasize.ByteSize(args.BufferSize) - } - buffer := getBufferByType(args.BufferType, bufferSize) - collector := NewCollector(tmpdir, buffer) - defer collector.Close(logPrefix) - - t := time.Now() - if err := extractBucketIntoFiles(logPrefix, db, fromBucket, args.ExtractStartKey, args.ExtractEndKey, args.FixedBits, collector, extractFunc, args.Quit, args.LogDetailsExtract); err != nil { - return err - } - log.Debug(fmt.Sprintf("[%s] Extraction finished", logPrefix), "it took", time.Since(t)) - - defer func(t time.Time) { - log.Debug(fmt.Sprintf("[%s] Collection finished", logPrefix), "it took", time.Since(t)) - }(time.Now()) - return collector.Load(logPrefix, db, toBucket, loadFunc, args) -} - -func extractBucketIntoFiles( - logPrefix string, - db kv.Tx, - bucket string, - startkey []byte, - endkey []byte, - fixedBits int, - collector *Collector, - extractFunc ExtractFunc, - quit <-chan struct{}, - additionalLogArguments AdditionalLogArguments, -) error { - logEvery := time.NewTicker(30 * time.Second) - defer logEvery.Stop() - var m runtime.MemStats - - c, err := db.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - if err := ethdb.Walk(c, startkey, fixedBits, func(k, v []byte) (bool, error) { - if err := common.Stopped(quit); err != nil { - return false, err - } - - select { - default: - case <-logEvery.C: - logArs := []interface{}{"from", bucket} - if additionalLogArguments != nil { - logArs = append(logArs, additionalLogArguments(k, v)...) - } else { - logArs = append(logArs, "current key", makeCurrentKeyStr(k)) - } - - runtime.ReadMemStats(&m) - logArs = append(logArs, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) - log.Info(fmt.Sprintf("[%s] ETL [1/2] Extracting", logPrefix), logArs...) - } - if endkey != nil && bytes.Compare(k, endkey) > 0 { - return false, nil - } - if err := extractFunc(k, v, collector.extractNextFunc); err != nil { - return false, err - } - return true, nil - }); err != nil { - return err - } - return collector.flushBuffer(nil, true) -} - -type currentTableReader struct { - getter kv.Tx - bucket string -} - -func (s *currentTableReader) Get(key []byte) ([]byte, error) { - return s.getter.GetOne(s.bucket, key) -} - -// IdentityLoadFunc loads entries as they are, without transformation -var IdentityLoadFunc LoadFunc = func(k []byte, value []byte, _ CurrentTableReader, next LoadNextFunc) error { - return next(k, k, value) -} - -func isIdentityLoadFunc(f LoadFunc) bool { - return f == nil || reflect.ValueOf(IdentityLoadFunc).Pointer() == reflect.ValueOf(f).Pointer() -} diff --git a/common/etl/etl_test.go b/common/etl/etl_test.go deleted file mode 100644 index 8466b4148cd..00000000000 --- a/common/etl/etl_test.go +++ /dev/null @@ -1,359 +0,0 @@ -package etl - -import ( - "bytes" - "fmt" - "io" - "os" - "strings" - "testing" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/common" - "github.com/stretchr/testify/assert" - "github.com/ugorji/go/codec" -) - -func TestWriteAndReadBufferEntry(t *testing.T) { - buffer := bytes.NewBuffer(make([]byte, 0)) - encoder := codec.NewEncoder(buffer, &cbor) - - keys := make([]string, 100) - vals := make([]string, 100) - - for i := range keys { - keys[i] = fmt.Sprintf("key-%d", i) - vals[i] = fmt.Sprintf("value-%d", i) - } - - for i := range keys { - if err := writeToDisk(encoder, []byte(keys[i]), []byte(vals[i])); err != nil { - t.Error(err) - } - } - - bb := buffer.Bytes() - - readBuffer := bytes.NewReader(bb) - - decoder := codec.NewDecoder(readBuffer, &cbor) - - for i := range keys { - k, v, err := readElementFromDisk(decoder) - if err != nil { - t.Error(err) - } - assert.Equal(t, keys[i], string(k)) - assert.Equal(t, vals[i], string(v)) - } - - _, _, err := readElementFromDisk(decoder) - assert.Equal(t, io.EOF, err) -} - -func TestNextKey(t *testing.T) { - for _, tc := range []string{ - "00000001->00000002", - "000000FF->00000100", - "FEFFFFFF->FF000000", - } { - parts := strings.Split(tc, "->") - input := common.Hex2Bytes(parts[0]) - expectedOutput := common.Hex2Bytes(parts[1]) - actualOutput, err := NextKey(input) - assert.NoError(t, err) - assert.Equal(t, expectedOutput, actualOutput) - } -} - -func TestNextKeyErr(t *testing.T) { - for _, tc := range []string{ - "", - "FFFFFF", - } { - input := common.Hex2Bytes(tc) - _, err := NextKey(input) - assert.Error(t, err) - } -} - -func TestFileDataProviders(t *testing.T) { - // test invariant when we go through files (> 1 buffer) - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - - generateTestData(t, tx, sourceBucket, 10) - - collector := NewCollector("", NewSortableBuffer(1)) - - err := extractBucketIntoFiles("logPrefix", tx, sourceBucket, nil, nil, 0, collector, testExtractToMapFunc, nil, nil) - assert.NoError(t, err) - - assert.Equal(t, 10, len(collector.dataProviders)) - - for _, p := range collector.dataProviders { - fp, ok := p.(*fileDataProvider) - assert.True(t, ok) - _, err = os.Stat(fp.file.Name()) - assert.NoError(t, err) - } - - collector.Close("logPrefix") - - for _, p := range collector.dataProviders { - fp, ok := p.(*fileDataProvider) - assert.True(t, ok) - _, err = os.Stat(fp.file.Name()) - assert.True(t, os.IsNotExist(err)) - } -} - -func TestRAMDataProviders(t *testing.T) { - // test invariant when we go through memory (1 buffer) - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - generateTestData(t, tx, sourceBucket, 10) - - collector := NewCollector("", NewSortableBuffer(BufferOptimalSize)) - err := extractBucketIntoFiles("logPrefix", tx, sourceBucket, nil, nil, 0, collector, testExtractToMapFunc, nil, nil) - assert.NoError(t, err) - - assert.Equal(t, 1, len(collector.dataProviders)) - - for _, p := range collector.dataProviders { - mp, ok := p.(*memoryDataProvider) - assert.True(t, ok) - assert.Equal(t, 10, mp.buffer.Len()) - } -} - -func TestTransformRAMOnly(t *testing.T) { - // test invariant when we only have one buffer and it fits into RAM (exactly 1 buffer) - _, tx := memdb.NewTestTx(t) - - sourceBucket := kv.ChaindataTables[0] - destBucket := kv.ChaindataTables[1] - generateTestData(t, tx, sourceBucket, 20) - err := Transform( - "logPrefix", - tx, - sourceBucket, - destBucket, - "", // temp dir - testExtractToMapFunc, - testLoadFromMapFunc, - TransformArgs{}, - ) - assert.Nil(t, err) - compareBuckets(t, tx, sourceBucket, destBucket, nil) -} - -func TestEmptySourceBucket(t *testing.T) { - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - destBucket := kv.ChaindataTables[1] - err := Transform( - "logPrefix", - tx, - sourceBucket, - destBucket, - "", // temp dir - testExtractToMapFunc, - testLoadFromMapFunc, - TransformArgs{}, - ) - assert.Nil(t, err) - compareBuckets(t, tx, sourceBucket, destBucket, nil) -} - -func TestTransformExtractStartKey(t *testing.T) { - // test invariant when we only have one buffer and it fits into RAM (exactly 1 buffer) - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - destBucket := kv.ChaindataTables[1] - generateTestData(t, tx, sourceBucket, 10) - err := Transform( - "logPrefix", - tx, - sourceBucket, - destBucket, - "", // temp dir - testExtractToMapFunc, - testLoadFromMapFunc, - TransformArgs{ExtractStartKey: []byte(fmt.Sprintf("%10d-key-%010d", 5, 5))}, - ) - assert.Nil(t, err) - compareBuckets(t, tx, sourceBucket, destBucket, []byte(fmt.Sprintf("%10d-key-%010d", 5, 5))) -} - -func TestTransformThroughFiles(t *testing.T) { - // test invariant when we go through files (> 1 buffer) - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - destBucket := kv.ChaindataTables[1] - generateTestData(t, tx, sourceBucket, 10) - err := Transform( - "logPrefix", - tx, - sourceBucket, - destBucket, - "", // temp dir - testExtractToMapFunc, - testLoadFromMapFunc, - TransformArgs{ - BufferSize: 1, - }, - ) - assert.Nil(t, err) - compareBuckets(t, tx, sourceBucket, destBucket, nil) -} - -func TestTransformDoubleOnExtract(t *testing.T) { - // test invariant when extractFunc multiplies the data 2x - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - destBucket := kv.ChaindataTables[1] - generateTestData(t, tx, sourceBucket, 10) - err := Transform( - "logPrefix", - tx, - sourceBucket, - destBucket, - "", // temp dir - testExtractDoubleToMapFunc, - testLoadFromMapFunc, - TransformArgs{}, - ) - assert.Nil(t, err) - compareBucketsDouble(t, tx, sourceBucket, destBucket) -} - -func TestTransformDoubleOnLoad(t *testing.T) { - // test invariant when loadFunc multiplies the data 2x - _, tx := memdb.NewTestTx(t) - sourceBucket := kv.ChaindataTables[0] - destBucket := kv.ChaindataTables[1] - generateTestData(t, tx, sourceBucket, 10) - err := Transform( - "logPrefix", - tx, - sourceBucket, - destBucket, - "", // temp dir - testExtractToMapFunc, - testLoadFromMapDoubleFunc, - TransformArgs{}, - ) - assert.Nil(t, err) - compareBucketsDouble(t, tx, sourceBucket, destBucket) -} - -func generateTestData(t *testing.T, db kv.Putter, bucket string, count int) { - for i := 0; i < count; i++ { - k := []byte(fmt.Sprintf("%10d-key-%010d", i, i)) - v := []byte(fmt.Sprintf("val-%099d", i)) - err := db.Put(bucket, k, v) - assert.NoError(t, err) - } -} - -func testExtractToMapFunc(k, v []byte, next ExtractNextFunc) error { - buf := bytes.NewBuffer(nil) - encoder := codec.NewEncoder(nil, &cbor) - - valueMap := make(map[string][]byte) - valueMap["value"] = v - encoder.Reset(buf) - encoder.MustEncode(valueMap) - return next(k, k, buf.Bytes()) -} - -func testExtractDoubleToMapFunc(k, v []byte, next ExtractNextFunc) error { - buf := bytes.NewBuffer(nil) - encoder := codec.NewEncoder(nil, &cbor) - - valueMap := make(map[string][]byte) - valueMap["value"] = append(v, 0xAA) - k1 := append(k, 0xAA) - encoder.Reset(buf) - encoder.MustEncode(valueMap) - - err := next(k, k1, buf.Bytes()) - if err != nil { - return err - } - - valueMap = make(map[string][]byte) - valueMap["value"] = append(v, 0xBB) - k2 := append(k, 0xBB) - buf.Reset() - encoder.Reset(buf) - encoder.MustEncode(valueMap) - return next(k, k2, buf.Bytes()) -} - -func testLoadFromMapFunc(k []byte, v []byte, _ CurrentTableReader, next LoadNextFunc) error { - decoder := codec.NewDecoder(nil, &cbor) - decoder.ResetBytes(v) - valueMap := make(map[string][]byte) - err := decoder.Decode(&valueMap) - if err != nil { - return err - } - realValue := valueMap["value"] - return next(k, k, realValue) -} - -func testLoadFromMapDoubleFunc(k []byte, v []byte, _ CurrentTableReader, next LoadNextFunc) error { - decoder := codec.NewDecoder(nil, &cbor) - decoder.ResetBytes(v) - - valueMap := make(map[string][]byte) - err := decoder.Decode(valueMap) - if err != nil { - return err - } - realValue := valueMap["value"] - - err = next(k, append(k, 0xAA), append(realValue, 0xAA)) - if err != nil { - return err - } - return next(k, append(k, 0xBB), append(realValue, 0xBB)) -} - -func compareBuckets(t *testing.T, db kv.Tx, b1, b2 string, startKey []byte) { - t.Helper() - b1Map := make(map[string]string) - err := db.ForEach(b1, startKey, func(k, v []byte) error { - b1Map[fmt.Sprintf("%x", k)] = fmt.Sprintf("%x", v) - return nil - }) - assert.NoError(t, err) - b2Map := make(map[string]string) - err = db.ForEach(b2, nil, func(k, v []byte) error { - b2Map[fmt.Sprintf("%x", k)] = fmt.Sprintf("%x", v) - return nil - }) - assert.NoError(t, err) - assert.Equal(t, b1Map, b2Map) -} - -func compareBucketsDouble(t *testing.T, db kv.Tx, b1, b2 string) { - t.Helper() - b1Map := make(map[string]string) - err := db.ForEach(b1, nil, func(k, v []byte) error { - b1Map[fmt.Sprintf("%x", append(k, 0xAA))] = fmt.Sprintf("%x", append(v, 0xAA)) - b1Map[fmt.Sprintf("%x", append(k, 0xBB))] = fmt.Sprintf("%x", append(v, 0xBB)) - return nil - }) - assert.NoError(t, err) - b2Map := make(map[string]string) - err = db.ForEach(b2, nil, func(k, v []byte) error { - b2Map[fmt.Sprintf("%x", k)] = fmt.Sprintf("%x", v) - return nil - }) - assert.NoError(t, err) - assert.Equal(t, b1Map, b2Map) -} diff --git a/common/etl/heap.go b/common/etl/heap.go deleted file mode 100644 index 37c8f7426f0..00000000000 --- a/common/etl/heap.go +++ /dev/null @@ -1,54 +0,0 @@ -package etl - -import ( - "bytes" - - "github.com/ledgerwatch/erigon-lib/kv" -) - -type HeapElem struct { - Key []byte - TimeIdx int - Value []byte -} - -type Heap struct { - comparator kv.CmpFunc - elems []HeapElem -} - -func (h Heap) Len() int { - return len(h.elems) -} - -func (h Heap) Less(i, j int) bool { - if h.comparator != nil { - if c := h.comparator(h.elems[i].Key, h.elems[j].Key, h.elems[i].Value, h.elems[j].Value); c != 0 { - return c < 0 - } - return h.elems[i].TimeIdx < h.elems[j].TimeIdx - } - - if c := bytes.Compare(h.elems[i].Key, h.elems[j].Key); c != 0 { - return c < 0 - } - return h.elems[i].TimeIdx < h.elems[j].TimeIdx -} - -func (h Heap) Swap(i, j int) { - h.elems[i], h.elems[j] = h.elems[j], h.elems[i] -} - -func (h *Heap) Push(x interface{}) { - // Push and Pop use pointer receivers because they modify the slice's length, - // not just its contents. - h.elems = append(h.elems, x.(HeapElem)) -} - -func (h *Heap) Pop() interface{} { - old := h.elems - n := len(old) - x := old[n-1] - h.elems = old[0 : n-1] - return x -} diff --git a/common/etl/progress.go b/common/etl/progress.go deleted file mode 100644 index f12ec7f9e83..00000000000 --- a/common/etl/progress.go +++ /dev/null @@ -1,8 +0,0 @@ -package etl - -func ProgressFromKey(k []byte) int { - if len(k) < 1 { - return 0 - } - return int(float64(k[0]>>4) * 3.3) -} diff --git a/common/fdlimit/fdlimit_bsd.go b/common/fdlimit/fdlimit_bsd.go index 86181337a2d..ede99551684 100644 --- a/common/fdlimit/fdlimit_bsd.go +++ b/common/fdlimit/fdlimit_bsd.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build freebsd dragonfly +//go:build freebsd || dragonfly package fdlimit diff --git a/common/fdlimit/fdlimit_test.go b/common/fdlimit/fdlimit_test.go index 21362b8463a..9fd5e9fc3cb 100644 --- a/common/fdlimit/fdlimit_test.go +++ b/common/fdlimit/fdlimit_test.go @@ -17,7 +17,6 @@ package fdlimit import ( - "fmt" "testing" ) @@ -30,7 +29,7 @@ func TestFileDescriptorLimits(t *testing.T) { t.Fatal(err) } if hardlimit < target { - t.Skip(fmt.Sprintf("system limit is less than desired test target: %d < %d", hardlimit, target)) + t.Skipf("system limit is less than desired test target: %d < %d", hardlimit, target) } if limit, err := Current(); err != nil || limit <= 0 { diff --git a/common/fdlimit/fdlimit_unix.go b/common/fdlimit/fdlimit_unix.go index e5a575f7a79..704ca27f262 100644 --- a/common/fdlimit/fdlimit_unix.go +++ b/common/fdlimit/fdlimit_unix.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build linux netbsd openbsd solaris +//go:build linux || netbsd || openbsd || solaris package fdlimit diff --git a/common/hexutil/json.go b/common/hexutil/json.go index fbc21241c8a..9c49570cfd9 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -36,10 +36,12 @@ var ( // The empty slice marshals as "0x". type Bytes []byte +const hexPrefix = `0x` + // MarshalText implements encoding.TextMarshaler func (b Bytes) MarshalText() ([]byte, error) { result := make([]byte, len(b)*2+2) - copy(result, `0x`) + copy(result, hexPrefix) hex.Encode(result[2:], b) return result, nil } diff --git a/common/path.go b/common/path.go index ca107fbf77a..3c76fdacd2f 100644 --- a/common/path.go +++ b/common/path.go @@ -41,7 +41,7 @@ func FileExist(filePath string) bool { } // AbsolutePath returns datadir + filename, or filename if it is absolute. -func AbsolutePath(datadir string, filename string) string { +func AbsolutePath(datadir, filename string) string { if filepath.IsAbs(filename) { return filename } diff --git a/common/test_utils.go b/common/test_utils.go index a848642f77f..596e2ffaf57 100644 --- a/common/test_utils.go +++ b/common/test_utils.go @@ -19,21 +19,21 @@ package common import ( "encoding/json" "fmt" - "io/ioutil" + "os" ) // LoadJSON reads the given file and unmarshals its content. func LoadJSON(file string, val interface{}) error { - content, err := ioutil.ReadFile(file) + content, err := os.ReadFile(file) if err != nil { return err } if err := json.Unmarshal(content, val); err != nil { if syntaxerr, ok := err.(*json.SyntaxError); ok { line := findLine(content, syntaxerr.Offset) - return fmt.Errorf("JSON syntax error at %v:%v: %v", file, line, err) + return fmt.Errorf("JSON syntax error at %v:%v: %w", file, line, err) } - return fmt.Errorf("JSON unmarshal error in %v: %v", file, err) + return fmt.Errorf("JSON unmarshal error in %v: %w", file, err) } return nil } diff --git a/common/types.go b/common/types.go index b8dda8bf5e1..efa7f679b8e 100644 --- a/common/types.go +++ b/common/types.go @@ -42,11 +42,14 @@ const ( BlockNumberLength = 8 // IncarnationLength length of uint64 for contract incarnations IncarnationLength = 8 + // Address32Length is the expected length of the Starknet address (in bytes) + Address32Length = 32 ) var ( - hashT = reflect.TypeOf(Hash{}) - addressT = reflect.TypeOf(Address{}) + hashT = reflect.TypeOf(Hash{}) + addressT = reflect.TypeOf(Address{}) + addressSt = reflect.TypeOf(Address32{}) ) // Hash represents the 32 byte Keccak256 hash of arbitrary data. @@ -60,6 +63,12 @@ func BytesToHash(b []byte) Hash { return h } +// CastToHash - sets b to hash +// If b is larger than len(h), b will be cropped from the left. +// panics if input is shorter than 32 bytes, see https://go.dev/doc/go1.17#language +// faster than BytesToHash +func CastToHash(b []byte) Hash { return *(*Hash)(b) } + // BigToHash sets byte representation of b to hash. // If b is larger than len(h), b will be cropped from the left. func BigToHash(b *big.Int) Hash { return BytesToHash(b.Bytes()) } @@ -197,6 +206,9 @@ func BytesToAddress(b []byte) Address { return a } +// BytesToAddressNoCopy - see https://tip.golang.org/ref/spec#Conversions_from_slice_to_array_pointer +func BytesToAddressNoCopy(b []byte) Address { return *(*Address)(b) } + // BigToAddress returns Address with byte values of b. // If b is larger than len(h), b will be cropped from the left. func BigToAddress(b *big.Int) Address { return BytesToAddress(b.Bytes()) } @@ -448,3 +460,133 @@ func (keys StorageKeys) Less(i, j int) bool { func (keys StorageKeys) Swap(i, j int) { keys[i], keys[j] = keys[j], keys[i] } + +/////////// Address32 + +// Address32 represents the 32 byte address. +type Address32 [Address32Length]byte + +// BytesToAddress32 returns Address32 with value b. +// If b is larger than len(h), b will be cropped from the left. +func BytesToAddress32(b []byte) Address32 { + var a Address32 + a.SetBytes(b) + return a +} + +// HexToAddress32 returns Address32 with byte values of s. +// If s is larger than len(h), s will be cropped from the left. +func HexToAddress32(s string) Address32 { return BytesToAddress32(FromHex(s)) } + +// IsHexAddress32 verifies whether a string can represent a valid hex-encoded +// Starknet address or not. +func IsHexAddress32(s string) bool { + if has0xPrefix(s) { + s = s[2:] + } + return len(s) == 2*Address32Length && isHex(s) +} + +// Bytes gets the string representation of the underlying address. +func (a Address32) Bytes() []byte { return a[:] } + +// Hash converts an address to a hash by left-padding it with zeros. +func (a Address32) Hash() Hash { return BytesToHash(a[:]) } + +// Hex returns an EIP55-compliant hex string representation of the address. +func (a Address32) Hex() string { + return string(a.checksumHex()) +} + +// String implements fmt.Stringer. +func (a Address32) String() string { + return a.Hex() +} + +func (a *Address32) checksumHex() []byte { + buf := a.hex() + + // compute checksum + sha := sha3.NewLegacyKeccak256() + //nolint:errcheck + sha.Write(buf[2:]) + hash := sha.Sum(nil) + for i := 2; i < len(buf); i++ { + hashByte := hash[(i-2)/2] + if i%2 == 0 { + hashByte = hashByte >> 4 + } else { + hashByte &= 0xf + } + if buf[i] > '9' && hashByte > 7 { + buf[i] -= 32 + } + } + return buf +} + +func (a Address32) hex() []byte { + var buf [len(a)*2 + 2]byte + copy(buf[:2], "0x") + hex.Encode(buf[2:], a[:]) + return buf[:] +} + +// SetBytes sets the address to the value of b. +// If b is larger than len(a), b will be cropped from the left. +func (a *Address32) SetBytes(b []byte) { + if len(b) > len(a) { + b = b[len(b)-Address32Length:] + } + copy(a[Address32Length-len(b):], b) +} + +// MarshalText returns the hex representation of a. +func (a Address32) MarshalText() ([]byte, error) { + return hexutil.Bytes(a[:]).MarshalText() +} + +// UnmarshalText parses a hash in hex syntax. +func (a *Address32) UnmarshalText(input []byte) error { + return hexutil.UnmarshalFixedText("Address", input, a[:]) +} + +// UnmarshalJSON parses a hash in hex syntax. +func (a *Address32) UnmarshalJSON(input []byte) error { + return hexutil.UnmarshalFixedJSON(addressSt, input, a[:]) +} + +// ToCommonAddress converts Address32 to Address +func (a *Address32) ToCommonAddress() Address { + ad := Address{} + ad.SetBytes(a.Bytes()) + return ad +} + +// Format implements fmt.Formatter. +// Address32 supports the %v, %s, %v, %x, %X and %d format verbs. +func (a Address32) Format(s fmt.State, c rune) { + switch c { + case 'v', 's': + s.Write(a.checksumHex()) + case 'q': + q := []byte{'"'} + s.Write(q) + s.Write(a.checksumHex()) + s.Write(q) + case 'x', 'X': + // %x disables the checksum. + hex := a.hex() + if !s.Flag('#') { + hex = hex[2:] + } + if c == 'X' { + hex = bytes.ToUpper(hex) + } + s.Write(hex) + case 'd': + fmt.Fprint(s, ([len(a)]byte)(a)) + default: + fmt.Fprintf(s, "%%!%c(address=%x)", c, a) + } +} diff --git a/common/types_test.go b/common/types_test.go index 01223520997..2f85b76a5af 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -537,3 +537,143 @@ func TestHash_Format(t *testing.T) { }) } } + +func TestAddress32UnmarshalJSON(t *testing.T) { + var tests = []struct { + Input string + ShouldErr bool + Output *big.Int + }{ + {"", true, nil}, + {`""`, true, nil}, + {`"0x"`, true, nil}, + {`"0x00"`, true, nil}, + {`"0xG000000000000000000000000000000000000000000000000000000000000000"`, true, nil}, + {`"0x0000000000000000000000000000000000000000000000000000000000000000"`, false, big.NewInt(0)}, + {`"0x0000000000000000000000000000000000000000000000000000000000000010"`, false, big.NewInt(16)}, + } + for i, test := range tests { + var v Address32 + err := json.Unmarshal([]byte(test.Input), &v) + if err != nil && !test.ShouldErr { + t.Errorf("test #%d: unexpected error: %v", i, err) + } + if err == nil { + if test.ShouldErr { + t.Errorf("test #%d: expected error, got none", i) + } + if got := new(big.Int).SetBytes(v.Bytes()); got.Cmp(test.Output) != 0 { + t.Errorf("test #%d: address mismatch: have %v, want %v", i, got, test.Output) + } + } + } +} + +func TestAddress32HexChecksum(t *testing.T) { + var tests = []struct { + Input string + Output string + }{ + {"0xc9b9a09f33669435e7ef1bea5aaeb6053f3e94c9b9a09f33669435e7ef1beaed", "0xc9B9a09F33669435E7ef1Bea5AAEb6053f3e94C9b9A09f33669435E7EF1bEaEd"}, + {"0xf8c6dbf03b4b6916095ca1df60bb79ce99435e7ef1b21ed2ce3ea74c37c5d359", "0xf8C6dbF03b4b6916095cA1Df60BB79Ce99435e7EF1B21eD2cE3ea74c37C5d359"}, + {"0xcd3c1ea99509d93f8d3dc8c6dbf03b407c01e7cd3cbea99509d93f8dddc8c6fb", "0xCD3c1EA99509D93F8D3dc8c6DBf03B407c01e7CD3Cbea99509D93F8ddDc8C6fB"}, + {"0xe7a2e6ba89f429762e7b9ad3d1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", "0xE7A2e6bA89F429762e7B9Ad3d1220a0cf47C7b9Be7A2e6ba89F429762E7b9Adb"}, + // Ensure that non-standard length input values are handled correctly + {"0xa", "0x000000000000000000000000000000000000000000000000000000000000000A"}, + {"0x0a", "0x000000000000000000000000000000000000000000000000000000000000000A"}, + {"0x00a", "0x000000000000000000000000000000000000000000000000000000000000000A"}, + {"0x000000000000000000000000000000000000000000000000000000000000000a", "0x000000000000000000000000000000000000000000000000000000000000000A"}, + } + for i, test := range tests { + output := HexToAddress32(test.Input).Hex() + if output != test.Output { + t.Errorf("test #%d: failed to match when it should (%s != %s)", i, output, test.Output) + } + } +} + +func BenchmarkAddress32Hex(b *testing.B) { + testAddr := HexToAddress("0x02f9e8d79ceb60818adef3372729c60aeb0428d6357eb7d1587c347f0113b338") + for n := 0; n < b.N; n++ { + println(testAddr.Hex()) + } +} + +func TestAddress32_Format(t *testing.T) { + b := []byte{ + 0x2, 0xf9, 0xe8, 0xd7, 0x9c, 0xeb, 0x60, 0x81, 0x8a, 0xde, 0xf3, 0x37, 0x27, 0x29, 0xc6, 0xa, + 0xeb, 0x4, 0x28, 0xd6, 0x35, 0x7e, 0xb7, 0xd1, 0x58, 0x7c, 0x34, 0x7f, 0x1, 0x13, 0xb3, 0x33, + } + var addr Address32 + addr.SetBytes(b) + + tests := []struct { + name string + out string + want string + }{ + { + name: "println", + out: fmt.Sprintln(addr), + want: "0x02f9e8d79cEB60818ADef3372729C60AEB0428D6357eb7D1587C347f0113b333\n", + }, + { + name: "print", + out: fmt.Sprint(addr), + want: "0x02f9e8d79cEB60818ADef3372729C60AEB0428D6357eb7D1587C347f0113b333", + }, + { + name: "printf-s", + out: func() string { + buf := new(bytes.Buffer) + fmt.Fprintf(buf, "%s", addr) + return buf.String() + }(), + want: "0x02f9e8d79cEB60818ADef3372729C60AEB0428D6357eb7D1587C347f0113b333", + }, + { + name: "printf-q", + out: fmt.Sprintf("%q", addr), + want: `"0x02f9e8d79cEB60818ADef3372729C60AEB0428D6357eb7D1587C347f0113b333"`, + }, + { + name: "printf-x", + out: fmt.Sprintf("%x", addr), + want: "02f9e8d79ceb60818adef3372729c60aeb0428d6357eb7d1587c347f0113b333", + }, + { + name: "printf-X", + out: fmt.Sprintf("%X", addr), + want: "02F9E8D79CEB60818ADEF3372729C60AEB0428D6357EB7D1587C347F0113B333", + }, + { + name: "printf-#x", + out: fmt.Sprintf("%#x", addr), + want: "0x02f9e8d79ceb60818adef3372729c60aeb0428d6357eb7d1587c347f0113b333", + }, + { + name: "printf-v", + out: fmt.Sprintf("%v", addr), + want: "0x02f9e8d79cEB60818ADef3372729C60AEB0428D6357eb7D1587C347f0113b333", + }, + // The original default formatter for byte slice + { + name: "printf-d", + out: fmt.Sprintf("%d", addr), + want: "[2 249 232 215 156 235 96 129 138 222 243 55 39 41 198 10 235 4 40 214 53 126 183 209 88 124 52 127 1 19 179 51]", + }, + // Invalid format char. + { + name: "printf-t", + out: fmt.Sprintf("%t", addr), + want: "%!t(address=02f9e8d79ceb60818adef3372729c60aeb0428d6357eb7d1587c347f0113b333)", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.out != tt.want { //nolint:scopelint + t.Errorf("%s does not render as expected:\n got %s\nwant %s", tt.name, tt.out, tt.want) //nolint:scopelint + } + }) + } +} diff --git a/consensus/aura/aura.go b/consensus/aura/aura.go index 5e34525c17d..67e08197318 100644 --- a/consensus/aura/aura.go +++ b/consensus/aura/aura.go @@ -28,6 +28,7 @@ import ( lru "github.com/hashicorp/golang-lru" "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/accounts/abi" "github.com/ledgerwatch/erigon/common" @@ -230,7 +231,7 @@ func (e *EpochManager) zoomToAfter(chain consensus.ChainHeaderReader, er consens panic(fmt.Errorf("proof produced by this engine is invalid: %w", err)) } epochSet := list.validators - log.Debug("[aura] Updating finality checker with new validator set extracted from epoch", "num", lastTransition.BlockNumber) + log.Trace("[aura] Updating finality checker with new validator set extracted from epoch", "num", lastTransition.BlockNumber) e.finalityChecker = NewRollingFinality(epochSet) if proof.SignalNumber >= DEBUG_LOG_FROM { fmt.Printf("new rolling finality: %d\n", proof.SignalNumber) @@ -500,6 +501,11 @@ func nextStepTimeDuration(info StepDurationInfo, time uint64) (uint64, uint64, b return info.TransitionStep + stepDiff, info.TransitionTimestamp + timeDiff, true } +// Type returns underlying consensus engine +func (c *AuRa) Type() params.ConsensusType { + return params.AuRaConsensus +} + // Author implements consensus.Engine, returning the Ethereum address recovered // from the signature in the header's extra-data section. func (c *AuRa) Author(header *types.Header) (common.Address, error) { @@ -563,7 +569,7 @@ func (c *AuRa) verifyFamily(chain consensus.ChainHeaderReader, e consensus.Epoch //nolint if step == parentStep || (header.Number.Uint64() >= c.cfg.ValidateStepTransition && step <= parentStep) { - log.Debug("[engine] Multiple blocks proposed for step", "num", parentStep) + log.Trace("[aura] Multiple blocks proposed for step", "num", parentStep) _ = setNumber /* self.validators.report_malicious( @@ -696,13 +702,6 @@ func (c *AuRa) verifyFamily(chain consensus.ChainHeaderReader, e consensus.Epoch return nil } -// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers. The -// method returns a quit channel to abort the operations and a results channel to -// retrieve the async verifications (the order is that of the input slice). -func (c *AuRa) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, _ []bool) error { - return nil -} - // VerifyUncles implements consensus.Engine, always returning an error for any // uncles as this consensus mechanism doesn't permit uncles. func (c *AuRa) VerifyUncles(chain consensus.ChainReader, header *types.Header, uncles []*types.Header) error { @@ -726,7 +725,7 @@ func (c *AuRa) VerifySeal(chain consensus.ChainHeaderReader, header *types.Heade // Prepare implements consensus.Engine, preparing all the consensus fields of the // header for running the transactions on top. -func (c *AuRa) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error { +func (c *AuRa) Prepare(chain consensus.ChainHeaderReader, header *types.Header, state *state.IntraBlockState) error { return nil /// If the block isn't a checkpoint, cast a random vote (good enough for now) //header.Coinbase = common.Address{} @@ -832,11 +831,14 @@ func (c *AuRa) Initialize(config *params.ChainConfig, chain consensus.ChainHeade } //word `signal epoch` == word `pending epoch` -func (c *AuRa) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall) error { +func (c *AuRa) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, receipts types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, +) (types.Transactions, types.Receipts, error) { // accumulateRewards retrieves rewards for a block and applies them to the coinbase accounts for miner and uncle miners beneficiaries, _, rewards, err := AccumulateRewards(config, c, header, uncles, syscall) if err != nil { - return fmt.Errorf("buildAncestrySubChain: %w", err) + return nil, nil, fmt.Errorf("buildAncestrySubChain: %w", err) } for i := range beneficiaries { //fmt.Printf("beneficiary: n=%d, %x,%d\n", header.Number.Uint64(), beneficiaries[i], rewards[i]) @@ -845,18 +847,18 @@ func (c *AuRa) Finalize(config *params.ChainConfig, header *types.Header, state // check_and_lock_block -> check_epoch_end_signal (after enact) if header.Number.Uint64() >= DEBUG_LOG_FROM { - fmt.Printf("finalize1: %d,%d\n", header.Number.Uint64(), len(r)) + fmt.Printf("finalize1: %d,%d\n", header.Number.Uint64(), len(receipts)) } - pendingTransitionProof, err := c.cfg.Validators.signalEpochEnd(header.Number.Uint64() == 0, header, r) + pendingTransitionProof, err := c.cfg.Validators.signalEpochEnd(header.Number.Uint64() == 0, header, receipts) if err != nil { - return err + return nil, nil, err } if pendingTransitionProof != nil { if header.Number.Uint64() >= DEBUG_LOG_FROM { - fmt.Printf("insert_pending_trancition: %d,receipts=%d, lenProof=%d\n", header.Number.Uint64(), len(r), len(pendingTransitionProof)) + fmt.Printf("insert_pending_trancition: %d,receipts=%d, lenProof=%d\n", header.Number.Uint64(), len(receipts), len(pendingTransitionProof)) } if err = e.PutPendingEpoch(header.Hash(), header.Number.Uint64(), pendingTransitionProof); err != nil { - return err + return nil, nil, err } } // check_and_lock_block -> check_epoch_end_signal END @@ -865,17 +867,17 @@ func (c *AuRa) Finalize(config *params.ChainConfig, header *types.Header, state c.EpochManager.finalityChecker.print(header.Number.Uint64()) epochEndProof, err := isEpochEnd(chain, e, finalized, header) if err != nil { - return err + return nil, nil, err } if epochEndProof != nil { c.EpochManager.noteNewEpoch() log.Info("[aura] epoch transition", "block_num", header.Number.Uint64()) if err := e.PutEpoch(header.Hash(), header.Number.Uint64(), epochEndProof); err != nil { - return err + return nil, nil, err } } - return nil + return txs, receipts, nil } func buildFinality(e *EpochManager, chain consensus.ChainHeaderReader, er consensus.EpochReader, validators ValidatorSet, header *types.Header, syscall consensus.SystemCall) []unAssembledHeader { @@ -975,12 +977,17 @@ func allHeadersUntil(chain consensus.ChainHeaderReader, from *types.Header, to c //} // FinalizeAndAssemble implements consensus.Engine -func (c *AuRa) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, - e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call) (*types.Block, error) { - c.Finalize(chainConfig, header, state, txs, uncles, r, e, chain, syscall) +func (c *AuRa) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, receipts types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call, +) (*types.Block, types.Transactions, types.Receipts, error) { + outTxs, outReceipts, err := c.Finalize(chainConfig, header, state, txs, uncles, receipts, e, chain, syscall) + if err != nil { + return nil, nil, nil, err + } // Assemble and return the final block for sealing - return types.NewBlock(header, txs, uncles, r), nil + return types.NewBlock(header, outTxs, uncles, outReceipts), outTxs, outReceipts, nil } // Authorize injects a private key into the consensus engine to mint new blocks @@ -1095,7 +1102,7 @@ func (c *AuRa) GenerateSeal(chain consensus.ChainHeaderReader, current, parent * // first check to avoid generating signature most of the time // (but there's still a race to the `compare_exchange`) if !c.step.canPropose.Load() { - log.Trace("[engine] Aborting seal generation. Can't propose.") + log.Trace("[aura] Aborting seal generation. Can't propose.") return nil } parentStep, err := headerStep(parent) @@ -1107,24 +1114,24 @@ func (c *AuRa) GenerateSeal(chain consensus.ChainHeaderReader, current, parent * // filter messages from old and future steps and different parents expectedDiff := calculateScore(parentStep, step, 0) if current.Difficulty.Cmp(expectedDiff.ToBig()) != 0 { - log.Debug(fmt.Sprintf("[engine] Aborting seal generation. The step or empty_steps have changed in the meantime. %d != %d", current.Difficulty, expectedDiff)) + log.Trace(fmt.Sprintf("[aura] Aborting seal generation. The step or empty_steps have changed in the meantime. %d != %d", current.Difficulty, expectedDiff)) return nil } if parentStep > step { - log.Warn(fmt.Sprintf("[engine] Aborting seal generation for invalid step: %d > %d", parentStep, step)) + log.Warn(fmt.Sprintf("[aura] Aborting seal generation for invalid step: %d > %d", parentStep, step)) return nil } validators, setNumber, err := c.epochSet(chain, nil, current, nil) if err != nil { - log.Warn("[engine] Unable to generate seal", "err", err) + log.Warn("[aura] Unable to generate seal", "err", err) return nil } stepProposerAddr, err := stepProposer(validators, current.ParentHash, step, call) if err != nil { - log.Warn("[engine] Unable to get stepProposer", "err", err) + log.Warn("[aura] Unable to get stepProposer", "err", err) return nil } if stepProposerAddr != current.Coinbase { @@ -1142,7 +1149,7 @@ func (c *AuRa) GenerateSeal(chain consensus.ChainHeaderReader, current, parent * /* signature, err := c.sign(current.bareHash()) if err != nil { - log.Warn("[engine] generate_seal: FAIL: Accounts secret key unavailable.", "err", err) + log.Warn("[aura] generate_seal: FAIL: Accounts secret key unavailable.", "err", err) return nil } */ @@ -1244,7 +1251,7 @@ func (c *AuRa) SealHash(header *types.Header) common.Hash { // Close implements consensus.Engine. It's a noop for clique as there are no background threads. func (c *AuRa) Close() error { - common.SafeClose(c.exitCh) + libcommon.SafeClose(c.exitCh) return nil } @@ -1484,7 +1491,7 @@ func (s *EmptyStep) author() (common.Address, error) { if err != nil { return common.Address{}, err } - ecdsa, err := crypto.UnmarshalPubkey(public) + ecdsa, err := crypto.UnmarshalPubkeyStd(public) if err != nil { return common.Address{}, err } diff --git a/consensus/aura/consensusconfig/embed.go b/consensus/aura/consensusconfig/embed.go index 2ab017dd741..93eaae5bcaa 100644 --- a/consensus/aura/consensusconfig/embed.go +++ b/consensus/aura/consensusconfig/embed.go @@ -2,7 +2,18 @@ package consensusconfig import ( _ "embed" + + "github.com/ledgerwatch/erigon/params/networkname" ) //go:embed poasokol.json var Sokol []byte + +func GetConfigByChain(chainName string) []byte { + switch chainName { + case networkname.SokolChainName: + return Sokol + default: + return Sokol + } +} diff --git a/consensus/aura/consensusconfig/kovan.json b/consensus/aura/consensusconfig/kovan.json new file mode 100644 index 00000000000..603a5fbdd31 --- /dev/null +++ b/consensus/aura/consensusconfig/kovan.json @@ -0,0 +1,36 @@ +{ + "stepDuration": 4, + "blockReward": "0x4563918244F40000", + "validators": { + "multi": { + "0": { + "list": [ + "0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED", + "0x00427feae2419c15b89d1c21af10d1b6650a4d3d", + "0x4Ed9B08e6354C70fE6F8CB0411b0d3246b424d6c", + "0x0020ee4Be0e2027d76603cB751eE069519bA81A1", + "0x0010f94b296a852aaac52ea6c5ac72e03afd032d", + "0x007733a1FE69CF3f2CF989F81C7b4cAc1693387A", + "0x00E6d2b931F55a3f1701c7389d592a7778897879", + "0x00e4a10650e5a6D6001C38ff8E64F97016a1645c", + "0x00a0a24b9f0e5ec7aa4c7389b8302fd0123194de" + ] + }, + "10960440": { + "list": [ + "0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED", + "0x0010f94b296a852aaac52ea6c5ac72e03afd032d", + "0x00a0a24b9f0e5ec7aa4c7389b8302fd0123194de" + ] + }, + "10960500": { + "safeContract": "0xaE71807C1B0a093cB1547b682DC78316D945c9B8" + } + } + }, + "validateScoreTransition": 4301764, + "validateStepTransition": 1500000, + "maximumUncleCountTransition": 5067000, + "maximumUncleCount": 0 +} + diff --git a/consensus/bor/api.go b/consensus/bor/api.go new file mode 100644 index 00000000000..1801c385c3a --- /dev/null +++ b/consensus/bor/api.go @@ -0,0 +1,192 @@ +package bor + +import ( + "encoding/hex" + "math" + "math/big" + "strconv" + "sync" + + lru "github.com/hashicorp/golang-lru" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/rpc" + "github.com/xsleonard/go-merkle" + "golang.org/x/crypto/sha3" +) + +var ( + // MaxCheckpointLength is the maximum number of blocks that can be requested for constructing a checkpoint root hash + MaxCheckpointLength = uint64(math.Pow(2, 15)) +) + +// API is a user facing RPC API to allow controlling the signer and voting +// mechanisms of the proof-of-authority scheme. +type API struct { + chain consensus.ChainHeaderReader + bor *Bor + rootHashCache *lru.ARCCache +} + +// GetSnapshot retrieves the state snapshot at a given block. +func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = api.chain.CurrentHeader() + } else { + header = api.chain.GetHeaderByNumber(uint64(number.Int64())) + } + // Ensure we have an actually valid block and return its snapshot + if header == nil { + return nil, errUnknownBlock + } + return api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) +} + +// GetAuthor retrieves the author a block. +func (api *API) GetAuthor(number *rpc.BlockNumber) (*common.Address, error) { + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = api.chain.CurrentHeader() + } else { + header = api.chain.GetHeaderByNumber(uint64(number.Int64())) + } + // Ensure we have an actually valid block and return its snapshot + if header == nil { + return nil, errUnknownBlock + } + author, err := api.bor.Author(header) + return &author, err +} + +// GetSnapshotAtHash retrieves the state snapshot at a given block. +func (api *API) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) { + header := api.chain.GetHeaderByHash(hash) + if header == nil { + return nil, errUnknownBlock + } + return api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) +} + +// GetSigners retrieves the list of authorized signers at the specified block. +func (api *API) GetSigners(number *rpc.BlockNumber) ([]common.Address, error) { + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = api.chain.CurrentHeader() + } else { + header = api.chain.GetHeaderByNumber(uint64(number.Int64())) + } + // Ensure we have an actually valid block and return the signers from its snapshot + if header == nil { + return nil, errUnknownBlock + } + snap, err := api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) + if err != nil { + return nil, err + } + return snap.signers(), nil +} + +// GetSignersAtHash retrieves the list of authorized signers at the specified block. +func (api *API) GetSignersAtHash(hash common.Hash) ([]common.Address, error) { + header := api.chain.GetHeaderByHash(hash) + if header == nil { + return nil, errUnknownBlock + } + snap, err := api.bor.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) + if err != nil { + return nil, err + } + return snap.signers(), nil +} + +// GetCurrentProposer gets the current proposer +func (api *API) GetCurrentProposer() (common.Address, error) { + snap, err := api.GetSnapshot(nil) + if err != nil { + return common.Address{}, err + } + return snap.ValidatorSet.GetProposer().Address, nil +} + +// GetCurrentValidators gets the current validators +func (api *API) GetCurrentValidators() ([]*Validator, error) { + snap, err := api.GetSnapshot(nil) + if err != nil { + return make([]*Validator, 0), err + } + return snap.ValidatorSet.Validators, nil +} + +// GetRootHash returns the merkle root of the start to end block headers +func (api *API) GetRootHash(start uint64, end uint64) (string, error) { + if err := api.initializeRootHashCache(); err != nil { + return "", err + } + key := getRootHashKey(start, end) + if root, known := api.rootHashCache.Get(key); known { + return root.(string), nil + } + length := uint64(end - start + 1) + if length > MaxCheckpointLength { + return "", &MaxCheckpointLengthExceededError{start, end} + } + currentHeaderNumber := api.chain.CurrentHeader().Number.Uint64() + if start > end || end > currentHeaderNumber { + return "", &InvalidStartEndBlockError{start, end, currentHeaderNumber} + } + blockHeaders := make([]*types.Header, end-start+1) + wg := new(sync.WaitGroup) + concurrent := make(chan bool, 20) + for i := start; i <= end; i++ { + wg.Add(1) + concurrent <- true + go func(number uint64) { + blockHeaders[number-start] = api.chain.GetHeaderByNumber(uint64(number)) + <-concurrent + wg.Done() + }(i) + } + wg.Wait() + close(concurrent) + + headers := make([][32]byte, NextPowerOfTwo(length)) + for i := 0; i < len(blockHeaders); i++ { + blockHeader := blockHeaders[i] + header := crypto.Keccak256(AppendBytes32( + blockHeader.Number.Bytes(), + new(big.Int).SetUint64(blockHeader.Time).Bytes(), + blockHeader.TxHash.Bytes(), + blockHeader.ReceiptHash.Bytes(), + )) + + var arr [32]byte + copy(arr[:], header) + headers[i] = arr + } + + tree := merkle.NewTreeWithOpts(merkle.TreeOptions{EnableHashSorting: false, DisableHashLeaves: true}) + if err := tree.Generate(Convert(headers), sha3.NewLegacyKeccak256()); err != nil { + return "", err + } + root := hex.EncodeToString(tree.Root().Hash) + api.rootHashCache.Add(key, root) + return root, nil +} + +func (api *API) initializeRootHashCache() error { + var err error + if api.rootHashCache == nil { + api.rootHashCache, err = lru.NewARC(10) + } + return err +} + +func getRootHashKey(start uint64, end uint64) string { + return strconv.FormatUint(start, 10) + "-" + strconv.FormatUint(end, 10) +} diff --git a/consensus/bor/bor.go b/consensus/bor/bor.go new file mode 100644 index 00000000000..24c372d31aa --- /dev/null +++ b/consensus/bor/bor.go @@ -0,0 +1,1330 @@ +package bor + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "io" + "math/big" + "sort" + "strconv" + "strings" + "sync" + "time" + + "github.com/google/btree" + lru "github.com/hashicorp/golang-lru" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/accounts/abi" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/misc" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/types/accounts" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/log/v3" + "golang.org/x/crypto/sha3" +) + +const ( + checkpointInterval = 1024 // Number of blocks after which to save the vote snapshot to the database + inmemorySnapshots = 128 // Number of recent vote snapshots to keep in memory + inmemorySignatures = 4096 // Number of recent block signatures to keep in memory +) + +// Bor protocol constants. +var ( + defaultSprintLength = uint64(64) // Default number of blocks after which to checkpoint and reset the pending votes + + extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity + extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal + + uncleHash = types.CalcUncleHash(nil) // Always Keccak256(RLP([])) as uncles are meaningless outside of PoW. + + // diffInTurn = big.NewInt(2) // Block difficulty for in-turn signatures + // diffNoTurn = big.NewInt(1) // Block difficulty for out-of-turn signatures + + validatorHeaderBytesLength = common.AddressLength + 20 // address + power + // systemAddress = common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") +) + +// Various error messages to mark blocks invalid. These should be private to +// prevent engine specific errors from being referenced in the remainder of the +// codebase, inherently breaking if the engine is swapped out. Please put common +// error types into the consensus package. +var ( + // errUnknownBlock is returned when the list of signers is requested for a block + // that is not part of the local blockchain. + errUnknownBlock = errors.New("unknown block") + + // errInvalidCheckpointBeneficiary is returned if a checkpoint/epoch transition + // block has a beneficiary set to non-zeroes. + // errInvalidCheckpointBeneficiary = errors.New("beneficiary in checkpoint block non-zero") + + // errInvalidVote is returned if a nonce value is something else that the two + // allowed constants of 0x00..0 or 0xff..f. + // errInvalidVote = errors.New("vote nonce not 0x00..0 or 0xff..f") + + // errInvalidCheckpointVote is returned if a checkpoint/epoch transition block + // has a vote nonce set to non-zeroes. + // errInvalidCheckpointVote = errors.New("vote nonce in checkpoint block non-zero") + + // errMissingVanity is returned if a block's extra-data section is shorter than + // 32 bytes, which is required to store the signer vanity. + errMissingVanity = errors.New("extra-data 32 byte vanity prefix missing") + + // errMissingSignature is returned if a block's extra-data section doesn't seem + // to contain a 65 byte secp256k1 signature. + errMissingSignature = errors.New("extra-data 65 byte signature suffix missing") + + // errExtraValidators is returned if non-sprint-end block contain validator data in + // their extra-data fields. + errExtraValidators = errors.New("non-sprint-end block contains extra validator list") + + // errInvalidSpanValidators is returned if a block contains an + // invalid list of validators (i.e. non divisible by 40 bytes). + errInvalidSpanValidators = errors.New("invalid validator list on sprint end block") + + // errInvalidMixDigest is returned if a block's mix digest is non-zero. + errInvalidMixDigest = errors.New("non-zero mix digest") + + // errInvalidUncleHash is returned if a block contains an non-empty uncle list. + errInvalidUncleHash = errors.New("non empty uncle hash") + + // errInvalidDifficulty is returned if the difficulty of a block neither 1 or 2. + errInvalidDifficulty = errors.New("invalid difficulty") + + // ErrInvalidTimestamp is returned if the timestamp of a block is lower than + // the previous block's timestamp + the minimum block period. + ErrInvalidTimestamp = errors.New("invalid timestamp") + + // errOutOfRangeChain is returned if an authorization list is attempted to + // be modified via out-of-range or non-contiguous headers. + errOutOfRangeChain = errors.New("out of range or non-contiguous chain") +) + +// SignerFn is a signer callback function to request a header to be signed by a +// backing account. +type SignerFn func(signer common.Address, mimeType string, message []byte) ([]byte, error) + +// ecrecover extracts the Ethereum account address from a signed header. +func ecrecover(header *types.Header, sigcache *lru.ARCCache, c *params.BorConfig) (common.Address, error) { + // If the signature's already cached, return that + hash := header.Hash() + if address, known := sigcache.Get(hash); known { + return address.(common.Address), nil + } + // Retrieve the signature from the header extra-data + if len(header.Extra) < extraSeal { + return common.Address{}, errMissingSignature + } + signature := header.Extra[len(header.Extra)-extraSeal:] + + // Recover the public key and the Ethereum address + pubkey, err := crypto.Ecrecover(SealHash(header, c).Bytes(), signature) + if err != nil { + return common.Address{}, err + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + + sigcache.Add(hash, signer) + return signer, nil +} + +// SealHash returns the hash of a block prior to it being sealed. +func SealHash(header *types.Header, c *params.BorConfig) (hash common.Hash) { + hasher := sha3.NewLegacyKeccak256() + encodeSigHeader(hasher, header, c) + hasher.Sum(hash[:0]) + return hash +} + +func encodeSigHeader(w io.Writer, header *types.Header, c *params.BorConfig) { + enc := []interface{}{ + header.ParentHash, + header.UncleHash, + header.Coinbase, + header.Root, + header.TxHash, + header.ReceiptHash, + header.Bloom, + header.Difficulty, + header.Number, + header.GasLimit, + header.GasUsed, + header.Time, + header.Extra[:len(header.Extra)-65], // Yes, this will panic if extra is too short + header.MixDigest, + header.Nonce, + } + + if c.IsJaipur(header.Number.Uint64()) { + if header.BaseFee != nil { + enc = append(enc, header.BaseFee) + } + } + if err := rlp.Encode(w, enc); err != nil { + panic("can't encode: " + err.Error()) + } +} + +// CalcProducerDelay is the block delay algorithm based on block time, period, producerDelay and turn-ness of a signer +func CalcProducerDelay(number uint64, succession int, c *params.BorConfig) uint64 { + // When the block is the first block of the sprint, it is expected to be delayed by `producerDelay`. + // That is to allow time for block propagation in the last sprint + delay := c.CalculatePeriod(number) + if number%c.Sprint == 0 { + delay = c.ProducerDelay + } + if succession > 0 { + delay += uint64(succession) * c.CalculateBackupMultiplier(number) + } + return delay +} + +// BorRLP returns the rlp bytes which needs to be signed for the bor +// sealing. The RLP to sign consists of the entire header apart from the 65 byte signature +// contained at the end of the extra data. +// +// Note, the method requires the extra data to be at least 65 bytes, otherwise it +// panics. This is done to avoid accidentally using both forms (signature present +// or not), which could be abused to produce different hashes for the same header. +func BorRLP(header *types.Header, c *params.BorConfig) []byte { + b := new(bytes.Buffer) + encodeSigHeader(b, header, c) + return b.Bytes() +} + +// Bor is the matic-bor consensus engine +type Bor struct { + chainConfig *params.ChainConfig // Chain config + config *params.BorConfig // Consensus engine configuration parameters for bor consensus + DB kv.RwDB // Database to store and retrieve snapshot checkpoints + + recents *lru.ARCCache // Snapshots for recent block to speed up reorgs + signatures *lru.ARCCache // Signatures of recent blocks to speed up mining + + signer common.Address // Ethereum address of the signing key + signFn SignerFn // Signer function to authorize hashes with + lock sync.RWMutex // Protects the signer fields + + GenesisContractsClient *GenesisContractsClient + validatorSetABI abi.ABI + stateReceiverABI abi.ABI + HeimdallClient IHeimdallClient + WithoutHeimdall bool + + // scope event.SubscriptionScope + // The fields below are for testing only + fakeDiff bool // Skip difficulty verifications + spanCache *btree.BTree +} + +// New creates a Matic Bor consensus engine. +func New( + chainConfig *params.ChainConfig, + db kv.RwDB, + heimdallURL string, + withoutHeimdall bool, +) *Bor { + // get bor config + borConfig := chainConfig.Bor + + // Set any missing consensus parameters to their defaults + if borConfig != nil && borConfig.Sprint == 0 { + borConfig.Sprint = defaultSprintLength + } + + // Allocate the snapshot caches and create the engine + recents, _ := lru.NewARC(inmemorySnapshots) + signatures, _ := lru.NewARC(inmemorySignatures) + vABI, _ := abi.JSON(strings.NewReader(validatorsetABI)) + sABI, _ := abi.JSON(strings.NewReader(stateReceiverABI)) + heimdallClient, _ := NewHeimdallClient(heimdallURL) + genesisContractsClient := NewGenesisContractsClient(chainConfig, borConfig.ValidatorContract, borConfig.StateReceiverContract) + c := &Bor{ + chainConfig: chainConfig, + config: borConfig, + DB: db, + recents: recents, + signatures: signatures, + validatorSetABI: vABI, + stateReceiverABI: sABI, + GenesisContractsClient: genesisContractsClient, + HeimdallClient: heimdallClient, + WithoutHeimdall: withoutHeimdall, + spanCache: btree.New(32), + } + + // make sure we can decode all the GenesisAlloc in the BorConfig. + for key, genesisAlloc := range c.config.BlockAlloc { + if _, err := decodeGenesisAlloc(genesisAlloc); err != nil { + panic(fmt.Sprintf("BUG: Block alloc '%s' in genesis is not correct: %v", key, err)) + } + } + + return c +} + +// Type returns underlying consensus engine +func (c *Bor) Type() params.ConsensusType { + return params.BorConsensus +} + +// Author implements consensus.Engine, returning the Ethereum address recovered +// from the signature in the header's extra-data section. +func (c *Bor) Author(header *types.Header) (common.Address, error) { + return ecrecover(header, c.signatures, c.config) +} + +// VerifyHeader checks whether a header conforms to the consensus rules. +func (c *Bor) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error { + + return c.verifyHeader(chain, header, nil) +} + +// verifyHeader checks whether a header conforms to the consensus rules.The +// caller may optionally pass in a batch of parents (ascending order) to avoid +// looking those up from the database. This is useful for concurrently verifying +// a batch of new headers. +func (c *Bor) verifyHeader(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { + if header.Number == nil { + return errUnknownBlock + } + number := header.Number.Uint64() + + // Don't waste time checking blocks from the future + if header.Time > uint64(time.Now().Unix()) { + return consensus.ErrFutureBlock + } + + if err := validateHeaderExtraField(header.Extra); err != nil { + return err + } + + // check extr adata + isSprintEnd := (number+1)%c.config.Sprint == 0 + + // Ensure that the extra-data contains a signer list on checkpoint, but none otherwise + signersBytes := len(header.Extra) - extraVanity - extraSeal + if !isSprintEnd && signersBytes != 0 { + return errExtraValidators + } + if isSprintEnd && signersBytes%validatorHeaderBytesLength != 0 { + return errInvalidSpanValidators + } + // Ensure that the mix digest is zero as we don't have fork protection currently + if header.MixDigest != (common.Hash{}) { + return errInvalidMixDigest + } + // Ensure that the block doesn't contain any uncles which are meaningless in PoA + if header.UncleHash != uncleHash { + return errInvalidUncleHash + } + // Ensure that the block's difficulty is meaningful (may not be correct at this point) + if number > 0 { + if header.Difficulty == nil { + return errInvalidDifficulty + } + } + // If all checks passed, validate any special fields for hard forks + if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil { + return err + } + // All basic checks passed, verify cascading fields + return c.verifyCascadingFields(chain, header, parents) +} + +// validateHeaderExtraField validates that the extra-data contains both the vanity and signature. +// header.Extra = header.Vanity + header.ProducerBytes (optional) + header.Seal +func validateHeaderExtraField(extraBytes []byte) error { + if len(extraBytes) < extraVanity { + return errMissingVanity + } + if len(extraBytes) < extraVanity+extraSeal { + return errMissingSignature + } + return nil +} + +// verifyCascadingFields verifies all the header fields that are not standalone, +// rather depend on a batch of previous headers. The caller may optionally pass +// in a batch of parents (ascending order) to avoid looking those up from the +// database. This is useful for concurrently verifying a batch of new headers. +func (c *Bor) verifyCascadingFields(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { + // The genesis block is the always valid dead-end + number := header.Number.Uint64() + if number == 0 { + return nil + } + + // Ensure that the block's timestamp isn't too close to it's parent + var parent *types.Header + if len(parents) > 0 { + parent = parents[len(parents)-1] + } else { + parent = chain.GetHeader(header.ParentHash, number-1) + } + + if parent == nil || parent.Number.Uint64() != number-1 || parent.Hash() != header.ParentHash { + return consensus.ErrUnknownAncestor + } + + // Verify that the gasUsed is <= gasLimit + if header.GasUsed > header.GasLimit { + return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit) + } + if !chain.Config().IsLondon(header.Number.Uint64()) { + // Verify BaseFee not present before EIP-1559 fork. + if header.BaseFee != nil { + return fmt.Errorf("invalid baseFee before fork: have %d, want ", header.BaseFee) + } + if err := misc.VerifyGaslimit(parent.GasLimit, header.GasLimit); err != nil { + return err + } + } else if err := misc.VerifyEip1559Header(chain.Config(), parent, header); err != nil { + // Verify the header's EIP-1559 attributes. + return err + } + + if parent.Time+c.config.CalculatePeriod(number) > header.Time { + return ErrInvalidTimestamp + } + + // Retrieve the snapshot needed to verify this header and cache it + snap, err := c.snapshot(chain, number-1, header.ParentHash, parents) + if err != nil { + return err + } + + // verify the validator list in the last sprint block + if isSprintStart(number, c.config.Sprint) { + parentValidatorBytes := parent.Extra[extraVanity : len(parent.Extra)-extraSeal] + validatorsBytes := make([]byte, len(snap.ValidatorSet.Validators)*validatorHeaderBytesLength) + + currentValidators := snap.ValidatorSet.Copy().Validators + // sort validator by address + sort.Sort(ValidatorsByAddress(currentValidators)) + for i, validator := range currentValidators { + copy(validatorsBytes[i*validatorHeaderBytesLength:], validator.HeaderBytes()) + } + // len(header.Extra) >= extraVanity+extraSeal has already been validated in validateHeaderExtraField, so this won't result in a panic + if !bytes.Equal(parentValidatorBytes, validatorsBytes) { + return &MismatchingValidatorsError{number - 1, validatorsBytes, parentValidatorBytes} + } + } + + // All basic checks passed, verify the seal and return + return c.verifySeal(chain, header, parents) +} + +// snapshot retrieves the authorization snapshot at a given point in time. +func (c *Bor) snapshot(chain consensus.ChainHeaderReader, number uint64, hash common.Hash, parents []*types.Header) (*Snapshot, error) { + // Search for a snapshot in memory or on disk for checkpoints + var ( + snap *Snapshot + ) + + cont := true // Continue applying snapshots + limit := 256 + for cont { + var headersList [][]*types.Header // List of lists because we will apply headers to snapshot such that we can persist snapshot after every list + var headers []*types.Header + h := hash + n := number + p := parents + cont = false + for snap == nil { + // If an in-memory snapshot was found, use that + if s, ok := c.recents.Get(h); ok { + snap = s.(*Snapshot) + break + } + + // If an on-disk checkpoint snapshot can be found, use that + if n%checkpointInterval == 0 { + if s, err := loadSnapshot(c.config, c.signatures, c.DB, h); err == nil { + log.Trace("Loaded snapshot from disk", "number", n, "hash", h) + snap = s + break + } + } + + // If we're at the genesis, snapshot the initial state. Alternatively if we're + // at a checkpoint block without a parent (light client CHT), or we have piled + // up more headers than allowed to be reorged (chain reinit from a freezer), + // consider the checkpoint trusted and snapshot it. + // TODO fix this + if n == 0 { + checkpoint := chain.GetHeaderByNumber(n) + if checkpoint != nil { + // get checkpoint data + h := checkpoint.Hash() + + // get validators and current span + validators, err := c.GetCurrentValidators(n + 1) + if err != nil { + return nil, err + } + + // new snap shot + snap = newSnapshot(c.config, c.signatures, n, h, validators) + if err := snap.store(c.DB); err != nil { + return nil, err + } + log.Info("Stored checkpoint snapshot to disk", "number", n, "hash", h) + break + } + } + + // No snapshot for this header, gather the header and move backward + var header *types.Header + if len(p) > 0 { + // If we have explicit parents, pick from there (enforced) + header = p[len(p)-1] + if header.Hash() != h || header.Number.Uint64() != n { + return nil, consensus.ErrUnknownAncestor + } + p = p[:len(p)-1] + } else { + // No explicit parents (or no more left), reach out to the database + header = chain.GetHeader(h, n) + if header == nil { + return nil, consensus.ErrUnknownAncestor + } + } + if n%checkpointInterval == 0 && len(headers) > 0 { + headersList = append(headersList, headers) + if len(headersList) > limit { + headersList = headersList[1:] + cont = true + } + headers = nil + } + headers = append(headers, header) + n-- + h = header.ParentHash + } + + // check if snapshot is nil + if snap == nil { + return nil, fmt.Errorf("unknown error while retrieving snapshot at block number %v", n) + } + if len(headers) > 0 { + headersList = append(headersList, headers) + } + + // Previous snapshot found, apply any pending headers on top of it + if cont { + lastList := headersList[len(headersList)-1] + firstList := headersList[0] + log.Info("Applying headers to snapshot", "from", lastList[len(lastList)-1].Number.Uint64(), "to", firstList[0].Number.Uint64()) + } + for i := 0; i < len(headersList)/2; i++ { + headersList[i], headersList[len(headersList)-1-i] = headersList[len(headersList)-1-i], headersList[i] + } + for j := 0; j < len(headersList); j++ { + hs := headersList[j] + for i := 0; i < len(hs)/2; i++ { + hs[i], hs[len(hs)-1-i] = hs[len(hs)-1-i], hs[i] + } + var err error + snap, err = snap.apply(hs) + if err != nil { + return nil, err + } + c.recents.Add(snap.Hash, snap) + // We've generated a new checkpoint snapshot, save to disk + if err = snap.store(c.DB); err != nil { + return nil, err + } + log.Trace("Stored snapshot to disk", "number", snap.Number, "hash", snap.Hash) + } + if cont { + snap = nil + } + } + + return snap, nil +} + +// VerifyUncles implements consensus.Engine, always returning an error for any +// uncles as this consensus mechanism doesn't permit uncles. +// VerifyUncles implements consensus.Engine, always returning an error for any +// uncles as this consensus mechanism doesn't permit uncles. +func (c *Bor) VerifyUncles(chain consensus.ChainReader, header *types.Header, uncles []*types.Header) error { + if len(uncles) > 0 { + return errors.New("uncles not allowed") + } + return nil +} + +// VerifySeal implements consensus.Engine, checking whether the signature contained +// in the header satisfies the consensus protocol requirements. +func (c *Bor) VerifySeal(chain consensus.ChainHeaderReader, header *types.Header) error { + return c.verifySeal(chain, header, nil) +} + +// verifySeal checks whether the signature contained in the header satisfies the +// consensus protocol requirements. The method accepts an optional list of parent +// headers that aren't yet part of the local blockchain to generate the snapshots +// from. +func (c *Bor) verifySeal(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { + // Verifying the genesis block is not supported + number := header.Number.Uint64() + if number == 0 { + return errUnknownBlock + } + + // Resolve the authorization key and check against signers + signer, err := ecrecover(header, c.signatures, c.config) + if err != nil { + return err + } + // Retrieve the snapshot needed to verify this header and cache it + snap, err := c.snapshot(chain, number-1, header.ParentHash, parents) + if err != nil { + return err + } + if !snap.ValidatorSet.HasAddress(signer.Bytes()) { + // Check the UnauthorizedSignerError.Error() msg to see why we pass number-1 + return &UnauthorizedSignerError{number - 1, signer.Bytes()} + } + + succession, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { + return err + } + + var parent *types.Header + if len(parents) > 0 { // if parents is nil, len(parents) is zero + parent = parents[len(parents)-1] + } else if number > 0 { + parent = chain.GetHeader(header.ParentHash, number-1) + } + + if parent != nil && header.Time < parent.Time+CalcProducerDelay(number, succession, c.config) { + return &BlockTooSoonError{number, succession} + } + + // Ensure that the difficulty corresponds to the turn-ness of the signer + if !c.fakeDiff { + difficulty := snap.Difficulty(signer) + if header.Difficulty.Uint64() != difficulty { + return &WrongDifficultyError{number, difficulty, header.Difficulty.Uint64(), signer.Bytes()} + } + } + + return nil +} + +// Prepare implements consensus.Engine, preparing all the consensus fields of the +// header for running the transactions on top. +func (c *Bor) Prepare(chain consensus.ChainHeaderReader, header *types.Header, state *state.IntraBlockState) error { + + // If the block isn't a checkpoint, cast a random vote (good enough for now) + header.Coinbase = common.Address{} + header.Nonce = types.BlockNonce{} + + number := header.Number.Uint64() + // Assemble the validator snapshot to check which votes make sense + snap, err := c.snapshot(chain, number-1, header.ParentHash, nil) + if err != nil { + return err + } + + // Set the correct difficulty + header.Difficulty = new(big.Int).SetUint64(snap.Difficulty(c.signer)) + + // Ensure the extra data has all it's components + if len(header.Extra) < extraVanity { + header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...) + } + header.Extra = header.Extra[:extraVanity] + + // get validator set if number + if (number+1)%c.config.Sprint == 0 { + newValidators, err := c.GetCurrentValidators(number + 1) + if err != nil { + return errors.New("unknown validators") + } + + // sort validator by address + sort.Sort(ValidatorsByAddress(newValidators)) + for _, validator := range newValidators { + header.Extra = append(header.Extra, validator.HeaderBytes()...) + } + } + + // add extra seal space + header.Extra = append(header.Extra, make([]byte, extraSeal)...) + + // Mix digest is reserved for now, set to empty + header.MixDigest = common.Hash{} + + // Ensure the timestamp has the correct delay + parent := chain.GetHeader(header.ParentHash, number-1) + if parent == nil { + return consensus.ErrUnknownAncestor + } + + var succession int + // if signer is not empty + if !bytes.Equal(c.signer.Bytes(), common.Address{}.Bytes()) { + succession, err = snap.GetSignerSuccessionNumber(c.signer) + if err != nil { + return err + } + } + + header.Time = parent.Time + CalcProducerDelay(number, succession, c.config) + if header.Time < uint64(time.Now().Unix()) { + header.Time = uint64(time.Now().Unix()) + } + return nil +} + +// Finalize implements consensus.Engine, ensuring no uncles are set, nor block +// rewards given. +func (c *Bor) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs types.Transactions, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall) (types.Transactions, types.Receipts, error) { + var err error + headerNumber := header.Number.Uint64() + if headerNumber%c.config.Sprint == 0 { + cx := chainContext{Chain: chain, Bor: c} + // check and commit span + if err := c.checkAndCommitSpan(state, header, cx, syscall); err != nil { + log.Error("Error while committing span", "err", err) + return nil, types.Receipts{}, err + } + + if !c.WithoutHeimdall { + // commit states + _, err = c.CommitStates(state, header, cx, syscall) + if err != nil { + log.Error("Error while committing states", "err", err) + return nil, types.Receipts{}, err + } + } + } + + if err = c.changeContractCodeIfNeeded(headerNumber, state); err != nil { + log.Error("Error changing contract code", "err", err) + return nil, types.Receipts{}, err + } + + // No block rewards in PoA, so the state remains as is and uncles are dropped + // header.Root = state.IntermediateRoot(chain.Config().IsSpuriousDragon(header.Number.Uint64())) + header.UncleHash = types.CalcUncleHash(nil) + + // Set state sync data to blockchain + // bc := chain.(*core.BlockChain) + // bc.SetStateSync(stateSyncData) + return nil, types.Receipts{}, nil +} + +func decodeGenesisAlloc(i interface{}) (core.GenesisAlloc, error) { + var alloc core.GenesisAlloc + b, err := json.Marshal(i) + if err != nil { + return nil, err + } + if err := json.Unmarshal(b, &alloc); err != nil { + return nil, err + } + return alloc, nil +} + +func (c *Bor) changeContractCodeIfNeeded(headerNumber uint64, state *state.IntraBlockState) error { + for blockNumber, genesisAlloc := range c.config.BlockAlloc { + if blockNumber == strconv.FormatUint(headerNumber, 10) { + allocs, err := decodeGenesisAlloc(genesisAlloc) + if err != nil { + return fmt.Errorf("failed to decode genesis alloc: %v", err) + } + for addr, account := range allocs { + log.Trace("change contract code", "address", addr) + state.SetCode(addr, account.Code) + } + } + } + return nil +} + +// FinalizeAndAssemble implements consensus.Engine, ensuring no uncles are set, +// nor block rewards given, and returns the final block. +func (c *Bor) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs types.Transactions, uncles []*types.Header, receipts types.Receipts, + e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call) (*types.Block, types.Transactions, types.Receipts, error) { + // stateSyncData := []*types.StateSyncData{} + + headerNumber := header.Number.Uint64() + if headerNumber%c.config.Sprint == 0 { + cx := chainContext{Chain: chain, Bor: c} + + // check and commit span + err := c.checkAndCommitSpan(state, header, cx, syscall) + if err != nil { + log.Error("Error while committing span", "err", err) + return nil, nil, types.Receipts{}, err + } + + if !c.WithoutHeimdall { + // commit states + _, err = c.CommitStates(state, header, cx, syscall) + if err != nil { + log.Error("Error while committing states", "err", err) + return nil, nil, types.Receipts{}, err + } + } + } + + if err := c.changeContractCodeIfNeeded(headerNumber, state); err != nil { + log.Error("Error changing contract code", "err", err) + return nil, nil, types.Receipts{}, err + } + + // No block rewards in PoA, so the state remains as is and uncles are dropped + // header.Root = state.IntermediateRoot(chain.Config().IsSpuriousDragon(header.Number)) + header.UncleHash = types.CalcUncleHash(nil) + + // Assemble block + block := types.NewBlock(header, txs, nil, receipts) + + // set state sync + // bc := chain.(*core.BlockChain) + // bc.SetStateSync(stateSyncData) + + // return the final block for sealing + return block, nil, types.Receipts{}, nil +} + +func (c *Bor) GenerateSeal(chain consensus.ChainHeaderReader, currnt, parent *types.Header, call consensus.Call) []rlp.RawValue { + return nil +} + +func (c *Bor) Initialize(config *params.ChainConfig, chain consensus.ChainHeaderReader, e consensus.EpochReader, header *types.Header, txs []types.Transaction, uncles []*types.Header, syscall consensus.SystemCall) { +} + +// Authorize injects a private key into the consensus engine to mint new blocks +// with. +func (c *Bor) Authorize(signer common.Address, signFn SignerFn) { + c.lock.Lock() + defer c.lock.Unlock() + + c.signer = signer + c.signFn = signFn +} + +// Seal implements consensus.Engine, attempting to create a sealed block using +// the local signing credentials. +func (c *Bor) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + header := block.Header() + // Sealing the genesis block is not supported + number := header.Number.Uint64() + if number == 0 { + return errUnknownBlock + } + // For 0-period chains, refuse to seal empty blocks (no reward but would spin sealing) + if c.config.CalculatePeriod(number) == 0 && len(block.Transactions()) == 0 { + log.Trace("Sealing paused, waiting for transactions") + return nil + } + // Don't hold the signer fields for the entire sealing procedure + c.lock.RLock() + signer, signFn := c.signer, c.signFn + c.lock.RUnlock() + + snap, err := c.snapshot(chain, number-1, header.ParentHash, nil) + if err != nil { + return err + } + + // Bail out if we're unauthorized to sign a block + if !snap.ValidatorSet.HasAddress(signer.Bytes()) { + // Check the UnauthorizedSignerError.Error() msg to see why we pass number-1 + return &UnauthorizedSignerError{number - 1, signer.Bytes()} + } + + successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { + return err + } + + // Sweet, the protocol permits us to sign the block, wait for our time + delay := time.Unix(int64(header.Time), 0).Sub(time.Now()) // nolint: gosimple + // wiggle was already accounted for in header.Time, this is just for logging + wiggle := time.Duration(successionNumber) * time.Duration(c.config.CalculateBackupMultiplier(number)) * time.Second + + // Sign all the things! + sighash, err := signFn(signer, accounts.MimetypeBor, BorRLP(header, c.config)) + if err != nil { + return err + } + copy(header.Extra[len(header.Extra)-extraSeal:], sighash) + + // Wait until sealing is terminated or delay timeout. + log.Trace("Waiting for slot to sign and propagate", "delay", common.PrettyDuration(delay)) + go func() { + select { + case <-stop: + log.Debug("Discarding sealing operation for block", "number", number) + return + case <-time.After(delay): + if wiggle > 0 { + log.Trace( + "Sealing out-of-turn", + "number", number, + "wiggle", common.PrettyDuration(wiggle), + "in-turn-signer", snap.ValidatorSet.GetProposer().Address.Hex(), + ) + } + log.Trace( + "Sealing successful", + "number", number, + "delay", delay, + "headerDifficulty", header.Difficulty, + ) + } + select { + case results <- block.WithSeal(header): + default: + log.Warn("Sealing result was not read by miner", "number", number, "sealhash", SealHash(header, c.config)) + } + }() + return nil +} + +// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty +// that a new block should have based on the previous blocks in the chain and the +// current signer. +// func (c *Bor) CalcDifficulty(chain consensus.ChainHeaderReader, time uint64, parent *types.Header) *big.Int { +// snap, err := c.snapshot(chain, parent.Number.Uint64(), parent.Hash(), nil) +// if err != nil { +// return nil +// } +// return new(big.Int).SetUint64(snap.Difficulty(c.signer)) +// } + +func (c *Bor) CalcDifficulty(chain consensus.ChainHeaderReader, _, _ uint64, _ *big.Int, parentNumber uint64, parentHash, _ common.Hash, _ []rlp.RawValue) *big.Int { + + snap, err := c.snapshot(chain, parentNumber, parentHash, nil) + if err != nil { + return nil + } + return new(big.Int).SetUint64(snap.Difficulty(c.signer)) +} + +// SealHash returns the hash of a block prior to it being sealed. +func (c *Bor) SealHash(header *types.Header) common.Hash { + return SealHash(header, c.config) +} + +// APIs implements consensus.Engine, returning the user facing RPC API to allow +// controlling the signer voting. +func (c *Bor) APIs(chain consensus.ChainHeaderReader) []rpc.API { + return []rpc.API{{ + Namespace: "bor", + Version: "1.0", + Service: &API{chain: chain, bor: c}, + Public: false, + }} +} + +// Close implements consensus.Engine. It's a noop for bor as there are no background threads. +func (c *Bor) Close() error { + c.DB.Close() + return nil +} + +// GetCurrentSpan get current span from contract +func (c *Bor) GetCurrentSpan(header *types.Header, state *state.IntraBlockState, chain chainContext, syscall consensus.SystemCall) (*Span, error) { + + // method + method := "getCurrentSpan" + data, err := c.validatorSetABI.Pack(method) + if err != nil { + log.Error("Unable to pack tx for getCurrentSpan", "err", err) + return nil, err + } + + result, err := syscall(common.HexToAddress(c.config.ValidatorContract), data) + if err != nil { + return nil, err + } + + // span result + ret := new(struct { + Number *big.Int + StartBlock *big.Int + EndBlock *big.Int + }) + if err := c.validatorSetABI.UnpackIntoInterface(ret, method, result); err != nil { + return nil, err + } + + // create new span + span := Span{ + ID: ret.Number.Uint64(), + StartBlock: ret.StartBlock.Uint64(), + EndBlock: ret.EndBlock.Uint64(), + } + + return &span, nil +} + +// GetCurrentValidators get current validators +func (c *Bor) GetCurrentValidators(blockNumber uint64) ([]*Validator, error) { + span, err := c.getSpanForBlock(blockNumber) + if err != nil { + return nil, err + } + return span.ValidatorSet.Validators, nil +} + +func (c *Bor) checkAndCommitSpan( + state *state.IntraBlockState, + header *types.Header, + chain chainContext, + syscall consensus.SystemCall, +) error { + headerNumber := header.Number.Uint64() + span, err := c.GetCurrentSpan(header, state, chain, syscall) + if err != nil { + return err + } + if c.needToCommitSpan(span, headerNumber) { + err := c.fetchAndCommitSpan(span.ID+1, state, header, chain, syscall) + return err + } + return nil +} + +func (c *Bor) needToCommitSpan(span *Span, headerNumber uint64) bool { + // if span is nil + if span == nil { + return false + } + + // check span is not set initially + if span.EndBlock == 0 { + return true + } + + // if current block is first block of last sprint in current span + if span.EndBlock > c.config.Sprint && span.EndBlock-c.config.Sprint+1 == headerNumber { + return true + } + + return false +} + +func (c *Bor) getSpanForBlock(blockNum uint64) (*HeimdallSpan, error) { + log.Info("Getting span", "for block", blockNum) + var span *HeimdallSpan + c.spanCache.AscendGreaterOrEqual(&HeimdallSpan{Span: Span{EndBlock: blockNum}}, func(item btree.Item) bool { + span = item.(*HeimdallSpan) + return false + }) + if span == nil { + // Span with high enough block number is not loaded + var spanID uint64 + if c.spanCache.Len() > 0 { + spanID = c.spanCache.Max().(*HeimdallSpan).ID + 1 + } + for span == nil || span.EndBlock < blockNum { + var heimdallSpan HeimdallSpan + log.Info("Span with high enough block number is not loaded", "fetching span", spanID) + response, err := c.HeimdallClient.FetchWithRetry(fmt.Sprintf("bor/span/%d", spanID), "") + if err != nil { + return nil, err + } + if err := json.Unmarshal(response.Result, &heimdallSpan); err != nil { + return nil, err + } + span = &heimdallSpan + c.spanCache.ReplaceOrInsert(span) + spanID++ + } + } else { + for span.StartBlock > blockNum { + // Span wit low enough block number is not loaded + var spanID uint64 = span.ID - 1 + var heimdallSpan HeimdallSpan + log.Info("Span with low enough block number is not loaded", "fetching span", spanID) + response, err := c.HeimdallClient.FetchWithRetry(fmt.Sprintf("bor/span/%d", spanID), "") + if err != nil { + return nil, err + } + if err := json.Unmarshal(response.Result, &heimdallSpan); err != nil { + return nil, err + } + span = &heimdallSpan + c.spanCache.ReplaceOrInsert(span) + } + } + for c.spanCache.Len() > 128 { + c.spanCache.DeleteMin() + } + return span, nil +} + +func (c *Bor) fetchAndCommitSpan( + newSpanID uint64, + state *state.IntraBlockState, + header *types.Header, + chain chainContext, + syscall consensus.SystemCall, +) error { + var heimdallSpan HeimdallSpan + + if c.WithoutHeimdall { + s, err := c.getNextHeimdallSpanForTest(newSpanID, state, header, chain, syscall) + if err != nil { + return err + } + heimdallSpan = *s + } else { + response, err := c.HeimdallClient.FetchWithRetry(fmt.Sprintf("bor/span/%d", newSpanID), "") + if err != nil { + return err + } + + if err := json.Unmarshal(response.Result, &heimdallSpan); err != nil { + return err + } + } + + // check if chain id matches with heimdall span + if heimdallSpan.ChainID != c.chainConfig.ChainID.String() { + return fmt.Errorf( + "chain id proposed span, %s, and bor chain id, %s, doesn't match", + heimdallSpan.ChainID, + c.chainConfig.ChainID.String(), + ) + } + + // get validators bytes + var validators []MinimalVal + for _, val := range heimdallSpan.ValidatorSet.Validators { + validators = append(validators, val.MinimalVal()) + } + validatorBytes, err := rlp.EncodeToBytes(validators) + if err != nil { + return err + } + + // get producers bytes + var producers []MinimalVal + for _, val := range heimdallSpan.SelectedProducers { + producers = append(producers, val.MinimalVal()) + } + producerBytes, err := rlp.EncodeToBytes(producers) + if err != nil { + return err + } + + // method + method := "commitSpan" + log.Debug("✅ Committing new span", + "id", heimdallSpan.ID, + "startBlock", heimdallSpan.StartBlock, + "endBlock", heimdallSpan.EndBlock, + "validatorBytes", hex.EncodeToString(validatorBytes), + "producerBytes", hex.EncodeToString(producerBytes), + ) + + // get packed data + data, err := c.validatorSetABI.Pack(method, + big.NewInt(0).SetUint64(heimdallSpan.ID), + big.NewInt(0).SetUint64(heimdallSpan.StartBlock), + big.NewInt(0).SetUint64(heimdallSpan.EndBlock), + validatorBytes, + producerBytes, + ) + if err != nil { + log.Error("Unable to pack tx for commitSpan", "err", err) + return err + } + + _, err = syscall(common.HexToAddress(c.config.ValidatorContract), data) + // apply message + return err +} + +// CommitStates commit states +func (c *Bor) CommitStates( + state *state.IntraBlockState, + header *types.Header, + chain chainContext, + syscall consensus.SystemCall, +) ([]*types.StateSyncData, error) { + stateSyncs := make([]*types.StateSyncData, 0) + number := header.Number.Uint64() + _lastStateID, err := c.GenesisContractsClient.LastStateId(header, state, chain, c, syscall) + if err != nil { + return nil, err + } + + to := time.Unix(int64(chain.Chain.GetHeaderByNumber(number-c.config.Sprint).Time), 0) + lastStateID := _lastStateID.Uint64() + log.Trace( + "Fetching state updates from Heimdall", + "fromID", lastStateID+1, + "to", to.Format(time.RFC3339)) + eventRecords, err := c.HeimdallClient.FetchStateSyncEvents(lastStateID+1, to.Unix()) + + if err != nil { + return nil, err + } + if c.config.OverrideStateSyncRecords != nil { + if val, ok := c.config.OverrideStateSyncRecords[strconv.FormatUint(number, 10)]; ok { + eventRecords = eventRecords[0:val] + } + } + + chainID := c.chainConfig.ChainID.String() + for _, eventRecord := range eventRecords { + if eventRecord.ID <= lastStateID { + continue + } + if err := validateEventRecord(eventRecord, number, to, lastStateID, chainID); err != nil { + log.Error(err.Error()) + break + } + + stateData := types.StateSyncData{ + ID: eventRecord.ID, + Contract: eventRecord.Contract, + Data: hex.EncodeToString(eventRecord.Data), + TxHash: eventRecord.TxHash, + } + stateSyncs = append(stateSyncs, &stateData) + + if err := c.GenesisContractsClient.CommitState(eventRecord, state, header, chain, c, syscall); err != nil { + return nil, err + } + lastStateID++ + } + return stateSyncs, nil +} + +func validateEventRecord(eventRecord *EventRecordWithTime, number uint64, to time.Time, lastStateID uint64, chainID string) error { + // event id should be sequential and event.Time should lie in the range [from, to) + if lastStateID+1 != eventRecord.ID || eventRecord.ChainID != chainID || !eventRecord.Time.Before(to) { + return &InvalidStateReceivedError{number, lastStateID, &to, eventRecord} + } + return nil +} + +func (c *Bor) SetHeimdallClient(h IHeimdallClient) { + c.HeimdallClient = h +} + +// +// Private methods +// + +func (c *Bor) getNextHeimdallSpanForTest( + newSpanID uint64, + state *state.IntraBlockState, + header *types.Header, + chain chainContext, + syscall consensus.SystemCall, +) (*HeimdallSpan, error) { + headerNumber := header.Number.Uint64() + span, err := c.GetCurrentSpan(header, state, chain, syscall) + if err != nil { + return nil, err + } + + // Retrieve the snapshot needed to verify this header and cache it + snap, err := c.snapshot(chain.Chain, headerNumber-1, header.ParentHash, nil) + if err != nil { + return nil, err + } + + // new span + span.ID = newSpanID + if span.EndBlock == 0 { + span.StartBlock = 256 + } else { + span.StartBlock = span.EndBlock + 1 + } + span.EndBlock = span.StartBlock + (100 * c.config.Sprint) - 1 + + selectedProducers := make([]Validator, len(snap.ValidatorSet.Validators)) + for i, v := range snap.ValidatorSet.Validators { + selectedProducers[i] = *v + } + heimdallSpan := &HeimdallSpan{ + Span: *span, + ValidatorSet: *snap.ValidatorSet, + SelectedProducers: selectedProducers, + ChainID: c.chainConfig.ChainID.String(), + } + + return heimdallSpan, nil +} + +// +// Chain context +// + +// chain context +type chainContext struct { + Chain consensus.ChainHeaderReader + Bor consensus.Engine +} + +func (c chainContext) Engine() consensus.Engine { + return c.Bor +} + +func (c chainContext) GetHeader(hash common.Hash, number uint64) *types.Header { + return c.Chain.GetHeader(hash, number) +} + +func validatorContains(a []*Validator, x *Validator) (*Validator, bool) { + for _, n := range a { + if bytes.Equal(n.Address.Bytes(), x.Address.Bytes()) { + return n, true + } + } + return nil, false +} + +func getUpdatedValidatorSet(oldValidatorSet *ValidatorSet, newVals []*Validator) *ValidatorSet { + v := oldValidatorSet + oldVals := v.Validators + + var changes []*Validator + for _, ov := range oldVals { + if f, ok := validatorContains(newVals, ov); ok { + ov.VotingPower = f.VotingPower + } else { + ov.VotingPower = 0 + } + + changes = append(changes, ov) + } + + for _, nv := range newVals { + if _, ok := validatorContains(changes, nv); !ok { + changes = append(changes, nv) + } + } + + v.UpdateWithChangeSet(changes) + return v +} + +func isSprintStart(number, sprint uint64) bool { + return number%sprint == 0 +} diff --git a/consensus/bor/clerk.go b/consensus/bor/clerk.go new file mode 100644 index 00000000000..acb254fb04a --- /dev/null +++ b/consensus/bor/clerk.go @@ -0,0 +1,49 @@ +package bor + +import ( + "fmt" + "time" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" +) + +// EventRecord represents state record +type EventRecord struct { + ID uint64 `json:"id" yaml:"id"` + Contract common.Address `json:"contract" yaml:"contract"` + Data hexutil.Bytes `json:"data" yaml:"data"` + TxHash common.Hash `json:"tx_hash" yaml:"tx_hash"` + LogIndex uint64 `json:"log_index" yaml:"log_index"` + ChainID string `json:"bor_chain_id" yaml:"bor_chain_id"` +} + +type EventRecordWithTime struct { + EventRecord + Time time.Time `json:"record_time" yaml:"record_time"` +} + +// String returns the string representatin of span +func (e *EventRecordWithTime) String() string { + return fmt.Sprintf( + "id %v, contract %v, data: %v, txHash: %v, logIndex: %v, chainId: %v, time %s", + e.ID, + e.Contract.String(), + e.Data.String(), + e.TxHash.Hex(), + e.LogIndex, + e.ChainID, + e.Time.Format(time.RFC3339), + ) +} + +func (e *EventRecordWithTime) BuildEventRecord() *EventRecord { + return &EventRecord{ + ID: e.ID, + Contract: e.Contract, + Data: e.Data, + TxHash: e.TxHash, + LogIndex: e.LogIndex, + ChainID: e.ChainID, + } +} diff --git a/consensus/bor/errors.go b/consensus/bor/errors.go new file mode 100644 index 00000000000..a1e60d1e219 --- /dev/null +++ b/consensus/bor/errors.go @@ -0,0 +1,143 @@ +package bor + +import ( + "fmt" + "time" +) + +// TotalVotingPowerExceededError is returned when the maximum allowed total voting power is exceeded +type TotalVotingPowerExceededError struct { + Sum int64 + Validators []*Validator +} + +func (e *TotalVotingPowerExceededError) Error() string { + return fmt.Sprintf( + "Total voting power should be guarded to not exceed %v; got: %v; for validator set: %v", + MaxTotalVotingPower, + e.Sum, + e.Validators, + ) +} + +type InvalidStartEndBlockError struct { + Start uint64 + End uint64 + CurrentHeader uint64 +} + +func (e *InvalidStartEndBlockError) Error() string { + return fmt.Sprintf( + "Invalid parameters start: %d and end block: %d params", + e.Start, + e.End, + ) +} + +type MaxCheckpointLengthExceededError struct { + Start uint64 + End uint64 +} + +func (e *MaxCheckpointLengthExceededError) Error() string { + return fmt.Sprintf( + "Start: %d and end block: %d exceed max allowed checkpoint length: %d", + e.Start, + e.End, + MaxCheckpointLength, + ) +} + +// MismatchingValidatorsError is returned if a last block in sprint contains a +// list of validators different from the one that local node calculated +type MismatchingValidatorsError struct { + Number uint64 + ValidatorSetSnap []byte + ValidatorSetHeader []byte +} + +func (e *MismatchingValidatorsError) Error() string { + return fmt.Sprintf( + "Mismatching validators at block %d\nValidatorBytes from snapshot: 0x%x\nValidatorBytes in Header: 0x%x\n", + e.Number, + e.ValidatorSetSnap, + e.ValidatorSetHeader, + ) +} + +type BlockTooSoonError struct { + Number uint64 + Succession int +} + +func (e *BlockTooSoonError) Error() string { + return fmt.Sprintf( + "Block %d was created too soon. Signer turn-ness number is %d\n", + e.Number, + e.Succession, + ) +} + +// UnauthorizedProposerError is returned if a header is [being] signed by an unauthorized entity. +type UnauthorizedProposerError struct { + Number uint64 + Proposer []byte +} + +func (e *UnauthorizedProposerError) Error() string { + return fmt.Sprintf( + "Proposer 0x%x is not a part of the producer set at block %d", + e.Proposer, + e.Number, + ) +} + +// UnauthorizedSignerError is returned if a header is [being] signed by an unauthorized entity. +type UnauthorizedSignerError struct { + Number uint64 + Signer []byte +} + +func (e *UnauthorizedSignerError) Error() string { + return fmt.Sprintf( + "Signer 0x%x is not a part of the producer set at block %d", + e.Signer, + e.Number, + ) +} + +// WrongDifficultyError is returned if the difficulty of a block doesn't match the +// turn of the signer. +type WrongDifficultyError struct { + Number uint64 + Expected uint64 + Actual uint64 + Signer []byte +} + +func (e *WrongDifficultyError) Error() string { + return fmt.Sprintf( + "Wrong difficulty at block %d, expected: %d, actual %d. Signer was %x\n", + e.Number, + e.Expected, + e.Actual, + e.Signer, + ) +} + +type InvalidStateReceivedError struct { + Number uint64 + LastStateID uint64 + To *time.Time + Event *EventRecordWithTime +} + +func (e *InvalidStateReceivedError) Error() string { + return fmt.Sprintf( + "Received invalid event %s at block %d. Requested events until %s. Last state id was %d", + e.Event, + e.Number, + e.To.Format(time.RFC3339), + e.LastStateID, + ) +} diff --git a/consensus/bor/genesis_contracts_client.go b/consensus/bor/genesis_contracts_client.go new file mode 100644 index 00000000000..2f8da8ce5a6 --- /dev/null +++ b/consensus/bor/genesis_contracts_client.go @@ -0,0 +1,95 @@ +package bor + +import ( + "math/big" + "strings" + + "github.com/ledgerwatch/erigon/accounts/abi" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" +) + +type GenesisContractsClient struct { + validatorSetABI abi.ABI + stateReceiverABI abi.ABI + ValidatorContract string + StateReceiverContract string + chainConfig *params.ChainConfig +} + +const validatorsetABI = `[{"constant":true,"inputs":[],"name":"SPRINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SYSTEM_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CHAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FIRST_END_BLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"producers","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROUND_TYPE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BOR_ID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"spanNumbers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VOTE_TYPE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"spans","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewSpan","type":"event"},{"constant":true,"inputs":[],"name":"currentSprint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNextSpan","outputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getSpanByBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentSpanNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getValidatorsTotalStakeBySpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"}],"name":"getProducersTotalStakeBySpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"getValidatorBySigner","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"internalType":"struct BorValidatorSet.Validator","name":"result","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"address","name":"signer","type":"address"}],"name":"isProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isCurrentValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"isCurrentProducer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"getBorValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitialValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getValidators","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newSpan","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"bytes","name":"validatorBytes","type":"bytes"},{"internalType":"bytes","name":"producerBytes","type":"bytes"}],"name":"commitSpan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"span","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bytes","name":"sigs","type":"bytes"}],"name":"getStakePowerBySigs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"rootHash","type":"bytes32"},{"internalType":"bytes32","name":"leaf","type":"bytes32"},{"internalType":"bytes","name":"proof","type":"bytes"}],"name":"checkMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"d","type":"bytes32"}],"name":"leafNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"left","type":"bytes32"},{"internalType":"bytes32","name":"right","type":"bytes32"}],"name":"innerNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"}]` +const stateReceiverABI = `[{"constant":true,"inputs":[],"name":"SYSTEM_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastStateId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"syncTime","type":"uint256"},{"internalType":"bytes","name":"recordBytes","type":"bytes"}],"name":"commitState","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` + +func NewGenesisContractsClient( + chainConfig *params.ChainConfig, + validatorContract, + stateReceiverContract string, +) *GenesisContractsClient { + vABI, _ := abi.JSON(strings.NewReader(validatorsetABI)) + sABI, _ := abi.JSON(strings.NewReader(stateReceiverABI)) + return &GenesisContractsClient{ + validatorSetABI: vABI, + stateReceiverABI: sABI, + ValidatorContract: validatorContract, + StateReceiverContract: stateReceiverContract, + chainConfig: chainConfig, + } +} + +func (gc *GenesisContractsClient) CommitState( + event *EventRecordWithTime, + state *state.IntraBlockState, + header *types.Header, + chCtx chainContext, + c *Bor, + syscall consensus.SystemCall, +) error { + eventRecord := event.BuildEventRecord() + recordBytes, err := rlp.EncodeToBytes(eventRecord) + if err != nil { + return err + } + method := "commitState" + t := event.Time.Unix() + data, err := gc.stateReceiverABI.Pack(method, big.NewInt(0).SetInt64(t), recordBytes) + if err != nil { + log.Error("Unable to pack tx for commitState", "err", err) + return err + } + log.Trace("→ committing new state", "eventRecord", event.String()) + _, err = syscall(common.HexToAddress(gc.StateReceiverContract), data) + if err != nil { + return err + } + return nil +} + +func (gc *GenesisContractsClient) LastStateId(header *types.Header, + state *state.IntraBlockState, + chain chainContext, + c *Bor, + syscall consensus.SystemCall, +) (*big.Int, error) { + method := "lastStateId" + data, err := gc.stateReceiverABI.Pack(method) + if err != nil { + log.Error("Unable to pack tx for LastStateId", "err", err) + return nil, err + } + + result, err := syscall(common.HexToAddress(gc.StateReceiverContract), data) + if err != nil { + return nil, err + } + + var ret = new(*big.Int) + if err := gc.stateReceiverABI.UnpackIntoInterface(ret, method, result); err != nil { + return nil, err + } + return *ret, nil +} diff --git a/consensus/bor/merkle.go b/consensus/bor/merkle.go new file mode 100644 index 00000000000..68244f8d080 --- /dev/null +++ b/consensus/bor/merkle.go @@ -0,0 +1,48 @@ +package bor + +func AppendBytes32(data ...[]byte) []byte { + var result []byte + for _, v := range data { + paddedV, err := ConvertTo32(v) + if err == nil { + result = append(result, paddedV[:]...) + } + } + return result +} + +func NextPowerOfTwo(n uint64) uint64 { + if n == 0 { + return 1 + } + // http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 + n-- + n |= n >> 1 + n |= n >> 2 + n |= n >> 4 + n |= n >> 8 + n |= n >> 16 + n |= n >> 32 + n++ + return n +} + +func ConvertTo32(input []byte) (output [32]byte, err error) { + l := len(input) + if l > 32 || l == 0 { + return + } + copy(output[32-l:], input) + return +} + +func Convert(input []([32]byte)) [][]byte { + var output [][]byte + for _, in := range input { + newInput := make([]byte, len(in[:])) + copy(newInput, in[:]) + output = append(output, newInput) + + } + return output +} diff --git a/consensus/bor/rest.go b/consensus/bor/rest.go new file mode 100644 index 00000000000..55057767d31 --- /dev/null +++ b/consensus/bor/rest.go @@ -0,0 +1,139 @@ +package bor + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/url" + "sort" + "time" + + "github.com/ledgerwatch/log/v3" +) + +var ( + stateFetchLimit = 50 +) + +// ResponseWithHeight defines a response object type that wraps an original +// response with a height. +type ResponseWithHeight struct { + Height string `json:"height"` + Result json.RawMessage `json:"result"` +} + +type IHeimdallClient interface { + Fetch(path string, query string) (*ResponseWithHeight, error) + FetchWithRetry(path string, query string) (*ResponseWithHeight, error) + FetchStateSyncEvents(fromID uint64, to int64) ([]*EventRecordWithTime, error) +} + +type HeimdallClient struct { + urlString string + client http.Client +} + +func NewHeimdallClient(urlString string) (*HeimdallClient, error) { + h := &HeimdallClient{ + urlString: urlString, + client: http.Client{ + Timeout: time.Duration(5 * time.Second), + }, + } + return h, nil +} + +func (h *HeimdallClient) FetchStateSyncEvents(fromID uint64, to int64) ([]*EventRecordWithTime, error) { + eventRecords := make([]*EventRecordWithTime, 0) + for { + queryParams := fmt.Sprintf("from-id=%d&to-time=%d&limit=%d", fromID, to, stateFetchLimit) + log.Trace("Fetching state sync events", "queryParams", queryParams) + response, err := h.FetchWithRetry("clerk/event-record/list", queryParams) + if err != nil { + return nil, err + } + var _eventRecords []*EventRecordWithTime + if response.Result == nil { // status 204 + break + } + if err := json.Unmarshal(response.Result, &_eventRecords); err != nil { + return nil, err + } + eventRecords = append(eventRecords, _eventRecords...) + if len(_eventRecords) < stateFetchLimit { + break + } + fromID += uint64(stateFetchLimit) + } + + sort.SliceStable(eventRecords, func(i, j int) bool { + return eventRecords[i].ID < eventRecords[j].ID + }) + return eventRecords, nil +} + +// Fetch fetches response from heimdall +func (h *HeimdallClient) Fetch(rawPath string, rawQuery string) (*ResponseWithHeight, error) { + u, err := url.Parse(h.urlString) + if err != nil { + return nil, err + } + + u.Path = rawPath + u.RawQuery = rawQuery + + return h.internalFetch(u) +} + +// FetchWithRetry returns data from heimdall with retry +func (h *HeimdallClient) FetchWithRetry(rawPath string, rawQuery string) (*ResponseWithHeight, error) { + u, err := url.Parse(h.urlString) + if err != nil { + return nil, err + } + + u.Path = rawPath + u.RawQuery = rawQuery + + for { + res, err := h.internalFetch(u) + if err == nil && res != nil { + return res, nil + } + log.Info("Retrying again in 5 seconds for next Heimdall span", "path", u.Path) + time.Sleep(5 * time.Second) + } +} + +// internal fetch method +func (h *HeimdallClient) internalFetch(u *url.URL) (*ResponseWithHeight, error) { + res, err := h.client.Get(u.String()) + if err != nil { + return nil, err + } + defer res.Body.Close() + + // check status code + if res.StatusCode != 200 && res.StatusCode != 204 { + return nil, fmt.Errorf("Error while fetching data from Heimdall") + } + + // unmarshall data from buffer + var response ResponseWithHeight + if res.StatusCode == 204 { + return &response, nil + } + + // get response + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + + if err := json.Unmarshal(body, &response); err != nil { + return nil, err + } + + return &response, nil +} diff --git a/consensus/bor/snapshot.go b/consensus/bor/snapshot.go new file mode 100644 index 00000000000..fa5aa9dac6c --- /dev/null +++ b/consensus/bor/snapshot.go @@ -0,0 +1,227 @@ +package bor + +import ( + "bytes" + "context" + "encoding/json" + + lru "github.com/hashicorp/golang-lru" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/params" +) + +// Snapshot is the state of the authorization voting at a given point in time. +type Snapshot struct { + config *params.BorConfig // Consensus engine parameters to fine tune behavior + sigcache *lru.ARCCache // Cache of recent block signatures to speed up ecrecover + + Number uint64 `json:"number"` // Block number where the snapshot was created + Hash common.Hash `json:"hash"` // Block hash where the snapshot was created + ValidatorSet *ValidatorSet `json:"validatorSet"` // Validator set at this moment + Recents map[uint64]common.Address `json:"recents"` // Set of recent signers for spam protections +} + +const BorSeparate = "BorSeparate" + +// signersAscending implements the sort interface to allow sorting a list of addresses +// type signersAscending []common.Address + +// func (s signersAscending) Len() int { return len(s) } +// func (s signersAscending) Less(i, j int) bool { return bytes.Compare(s[i][:], s[j][:]) < 0 } +// func (s signersAscending) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// newSnapshot creates a new snapshot with the specified startup parameters. This +// method does not initialize the set of recent signers, so only ever use if for +// the genesis block. +func newSnapshot( + config *params.BorConfig, + sigcache *lru.ARCCache, + number uint64, + hash common.Hash, + validators []*Validator, +) *Snapshot { + snap := &Snapshot{ + config: config, + sigcache: sigcache, + Number: number, + Hash: hash, + ValidatorSet: NewValidatorSet(validators), + Recents: make(map[uint64]common.Address), + } + return snap +} + +// loadSnapshot loads an existing snapshot from the database. +func loadSnapshot(config *params.BorConfig, sigcache *lru.ARCCache, db kv.RwDB, hash common.Hash) (*Snapshot, error) { + tx, err := db.BeginRo(context.Background()) + if err != nil { + return nil, err + } + defer tx.Rollback() + blob, err := tx.GetOne(kv.BorSeparate, append([]byte("bor-"), hash[:]...)) + if err != nil { + return nil, err + } + snap := new(Snapshot) + if err := json.Unmarshal(blob, snap); err != nil { + return nil, err + } + snap.config = config + snap.sigcache = sigcache + + // update total voting power + if err := snap.ValidatorSet.updateTotalVotingPower(); err != nil { + return nil, err + } + + return snap, nil +} + +// store inserts the snapshot into the database. +func (s *Snapshot) store(db kv.RwDB) error { + blob, err := json.Marshal(s) + if err != nil { + return err + } + + return db.Update(context.Background(), func(tx kv.RwTx) error { + return tx.Put(kv.BorSeparate, append([]byte("bor-"), s.Hash[:]...), blob) + }) +} + +// copy creates a deep copy of the snapshot, though not the individual votes. +func (s *Snapshot) copy() *Snapshot { + cpy := &Snapshot{ + config: s.config, + sigcache: s.sigcache, + Number: s.Number, + Hash: s.Hash, + ValidatorSet: s.ValidatorSet.Copy(), + Recents: make(map[uint64]common.Address), + } + for block, signer := range s.Recents { + cpy.Recents[block] = signer + } + + return cpy +} + +func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { + // Allow passing in no headers for cleaner code + if len(headers) == 0 { + return s, nil + } + // Sanity check that the headers can be applied + for i := 0; i < len(headers)-1; i++ { + if headers[i+1].Number.Uint64() != headers[i].Number.Uint64()+1 { + return nil, errOutOfRangeChain + } + } + if headers[0].Number.Uint64() != s.Number+1 { + return nil, errOutOfRangeChain + } + // Iterate through the headers and create a new snapshot + snap := s.copy() + + for _, header := range headers { + // Remove any votes on checkpoint blocks + number := header.Number.Uint64() + + // Delete the oldest signer from the recent list to allow it signing again + if number >= s.config.Sprint { + delete(snap.Recents, number-s.config.Sprint) + } + + // Resolve the authorization key and check against signers + signer, err := ecrecover(header, s.sigcache, s.config) + if err != nil { + return nil, err + } + + // check if signer is in validator set + if !snap.ValidatorSet.HasAddress(signer.Bytes()) { + return nil, &UnauthorizedSignerError{number, signer.Bytes()} + } + + if _, err = snap.GetSignerSuccessionNumber(signer); err != nil { + return nil, err + } + + // add recents + snap.Recents[number] = signer + + // change validator set and change proposer + if number > 0 && (number+1)%s.config.Sprint == 0 { + if err := validateHeaderExtraField(header.Extra); err != nil { + return nil, err + } + validatorBytes := header.Extra[extraVanity : len(header.Extra)-extraSeal] + + // get validators from headers and use that for new validator set + newVals, _ := ParseValidators(validatorBytes) + v := getUpdatedValidatorSet(snap.ValidatorSet.Copy(), newVals) + v.IncrementProposerPriority(1) + snap.ValidatorSet = v + } + } + snap.Number += uint64(len(headers)) + snap.Hash = headers[len(headers)-1].Hash() + + return snap, nil +} + +// GetSignerSuccessionNumber returns the relative position of signer in terms of the in-turn proposer +func (s *Snapshot) GetSignerSuccessionNumber(signer common.Address) (int, error) { + validators := s.ValidatorSet.Validators + proposer := s.ValidatorSet.GetProposer().Address + proposerIndex, _ := s.ValidatorSet.GetByAddress(proposer) + if proposerIndex == -1 { + return -1, &UnauthorizedProposerError{s.Number, proposer.Bytes()} + } + signerIndex, _ := s.ValidatorSet.GetByAddress(signer) + if signerIndex == -1 { + return -1, &UnauthorizedSignerError{s.Number, signer.Bytes()} + } + + tempIndex := signerIndex + if proposerIndex != tempIndex { + if tempIndex < proposerIndex { + tempIndex = tempIndex + len(validators) + } + } + return tempIndex - proposerIndex, nil +} + +// signers retrieves the list of authorized signers in ascending order. +func (s *Snapshot) signers() []common.Address { + sigs := make([]common.Address, 0, len(s.ValidatorSet.Validators)) + for _, sig := range s.ValidatorSet.Validators { + sigs = append(sigs, sig.Address) + } + return sigs +} + +// Difficulty returns the difficulty for a particular signer at the current snapshot number +func (s *Snapshot) Difficulty(signer common.Address) uint64 { + // if signer is empty + if bytes.Equal(signer.Bytes(), common.Address{}.Bytes()) { + return 1 + } + + validators := s.ValidatorSet.Validators + proposer := s.ValidatorSet.GetProposer().Address + totalValidators := len(validators) + + proposerIndex, _ := s.ValidatorSet.GetByAddress(proposer) + signerIndex, _ := s.ValidatorSet.GetByAddress(signer) + + // temp index + tempIndex := signerIndex + if tempIndex < proposerIndex { + tempIndex = tempIndex + totalValidators + } + + return uint64(totalValidators - (tempIndex - proposerIndex)) +} diff --git a/consensus/bor/snapshot_test.go b/consensus/bor/snapshot_test.go new file mode 100644 index 00000000000..67ef24306bc --- /dev/null +++ b/consensus/bor/snapshot_test.go @@ -0,0 +1,123 @@ +package bor + +import ( + "math/rand" + "sort" + "testing" + "time" + + "github.com/ledgerwatch/erigon/common" + "github.com/stretchr/testify/assert" +) + +const ( + numVals = 100 +) + +func TestGetSignerSuccessionNumber_ProposerIsSigner(t *testing.T) { + validators := buildRandomValidatorSet(numVals) + validatorSet := NewValidatorSet(validators) + snap := Snapshot{ + ValidatorSet: validatorSet, + } + + // proposer is signer + signer := validatorSet.Proposer.Address + successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { + t.Fatalf("%s", err) + } + assert.Equal(t, 0, successionNumber) +} + +func TestGetSignerSuccessionNumber_SignerIndexIsLarger(t *testing.T) { + validators := buildRandomValidatorSet(numVals) + + // sort validators by address, which is what NewValidatorSet also does + sort.Sort(ValidatorsByAddress(validators)) + proposerIndex := 32 + signerIndex := 56 + // give highest ProposerPriority to a particular val, so that they become the proposer + validators[proposerIndex].VotingPower = 200 + snap := Snapshot{ + ValidatorSet: NewValidatorSet(validators), + } + + // choose a signer at an index greater than proposer index + signer := snap.ValidatorSet.Validators[signerIndex].Address + successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { + t.Fatalf("%s", err) + } + assert.Equal(t, signerIndex-proposerIndex, successionNumber) +} + +func TestGetSignerSuccessionNumber_SignerIndexIsSmaller(t *testing.T) { + validators := buildRandomValidatorSet(numVals) + proposerIndex := 98 + signerIndex := 11 + // give highest ProposerPriority to a particular val, so that they become the proposer + validators[proposerIndex].VotingPower = 200 + snap := Snapshot{ + ValidatorSet: NewValidatorSet(validators), + } + + // choose a signer at an index greater than proposer index + signer := snap.ValidatorSet.Validators[signerIndex].Address + successionNumber, err := snap.GetSignerSuccessionNumber(signer) + if err != nil { + t.Fatalf("%s", err) + } + assert.Equal(t, signerIndex+numVals-proposerIndex, successionNumber) +} + +func TestGetSignerSuccessionNumber_ProposerNotFound(t *testing.T) { + validators := buildRandomValidatorSet(numVals) + snap := Snapshot{ + ValidatorSet: NewValidatorSet(validators), + } + dummyProposerAddress := randomAddress() + snap.ValidatorSet.Proposer = &Validator{Address: dummyProposerAddress} + // choose any signer + signer := snap.ValidatorSet.Validators[3].Address + _, err := snap.GetSignerSuccessionNumber(signer) + assert.NotNil(t, err) + e, ok := err.(*UnauthorizedProposerError) + assert.True(t, ok) + assert.Equal(t, dummyProposerAddress.Bytes(), e.Proposer) +} + +func TestGetSignerSuccessionNumber_SignerNotFound(t *testing.T) { + validators := buildRandomValidatorSet(numVals) + snap := Snapshot{ + ValidatorSet: NewValidatorSet(validators), + } + dummySignerAddress := randomAddress() + _, err := snap.GetSignerSuccessionNumber(dummySignerAddress) + assert.NotNil(t, err) + e, ok := err.(*UnauthorizedSignerError) + assert.True(t, ok) + assert.Equal(t, dummySignerAddress.Bytes(), e.Signer) +} + +func buildRandomValidatorSet(numVals int) []*Validator { + rand.Seed(time.Now().Unix()) + validators := make([]*Validator, numVals) + for i := 0; i < numVals; i++ { + validators[i] = &Validator{ + Address: randomAddress(), + // cannot process validators with voting power 0, hence +1 + VotingPower: int64(rand.Intn(99) + 1), + } + } + + // sort validators by address, which is what NewValidatorSet also does + sort.Sort(ValidatorsByAddress(validators)) + return validators +} + +func randomAddress() common.Address { + bytes := make([]byte, 32) + rand.Read(bytes) + return common.BytesToAddress(bytes) +} diff --git a/consensus/bor/span.go b/consensus/bor/span.go new file mode 100644 index 00000000000..3c9887a774c --- /dev/null +++ b/consensus/bor/span.go @@ -0,0 +1,29 @@ +package bor + +import ( + "github.com/google/btree" +) + +// Span represents a current bor span +type Span struct { + ID uint64 `json:"span_id" yaml:"span_id"` + StartBlock uint64 `json:"start_block" yaml:"start_block"` + EndBlock uint64 `json:"end_block" yaml:"end_block"` +} + +// HeimdallSpan represents span from heimdall APIs +type HeimdallSpan struct { + Span + ValidatorSet ValidatorSet `json:"validator_set" yaml:"validator_set"` + SelectedProducers []Validator `json:"selected_producers" yaml:"selected_producers"` + ChainID string `json:"bor_chain_id" yaml:"bor_chain_id"` +} + +func (hs *HeimdallSpan) Less(other btree.Item) bool { + otherHs := other.(*HeimdallSpan) + if hs.EndBlock == 0 || otherHs.EndBlock == 0 { + // if endblock is not specified in one of the items, allow search by ID + return hs.ID < otherHs.ID + } + return hs.EndBlock < otherHs.EndBlock +} diff --git a/consensus/bor/validator.go b/consensus/bor/validator.go new file mode 100644 index 00000000000..11e3dfb1e7e --- /dev/null +++ b/consensus/bor/validator.go @@ -0,0 +1,154 @@ +package bor + +import ( + "bytes" + // "encoding/json" + "errors" + "fmt" + "math/big" + "sort" + "strings" + + "github.com/ledgerwatch/erigon/common" +) + +// Validator represets Volatile state for each Validator +type Validator struct { + ID uint64 `json:"ID"` + Address common.Address `json:"signer"` + VotingPower int64 `json:"power"` + ProposerPriority int64 `json:"accum"` +} + +// NewValidator creates new validator +func NewValidator(address common.Address, votingPower int64) *Validator { + return &Validator{ + Address: address, + VotingPower: votingPower, + ProposerPriority: 0, + } +} + +// Copy creates a new copy of the validator so we can mutate ProposerPriority. +// Panics if the validator is nil. +func (v *Validator) Copy() *Validator { + vCopy := *v + return &vCopy +} + +// Cmp returns the one validator with a higher ProposerPriority. +// If ProposerPriority is same, it returns the validator with lexicographically smaller address +func (v *Validator) Cmp(other *Validator) *Validator { + // if both of v and other are nil, nil will be returned and that could possibly lead to nil pointer dereference bubbling up the stack + if v == nil { + return other + } + if other == nil { + return v + } + if v.ProposerPriority > other.ProposerPriority { + return v + } else if v.ProposerPriority < other.ProposerPriority { + return other + } else { + result := bytes.Compare(v.Address.Bytes(), other.Address.Bytes()) + if result < 0 { + return v + } else if result > 0 { + return other + } else { + panic("Cannot compare identical validators") + } + } +} + +func (v *Validator) String() string { + if v == nil { + return "nil-Validator" + } + return fmt.Sprintf("Validator{%v Power:%v Priority:%v}", + v.Address.Hex(), + v.VotingPower, + v.ProposerPriority) +} + +// ValidatorListString returns a prettified validator list for logging purposes. +func ValidatorListString(vals []*Validator) string { + chunks := make([]string, len(vals)) + for i, val := range vals { + chunks[i] = fmt.Sprintf("%s:%d", val.Address, val.VotingPower) + } + + return strings.Join(chunks, ",") +} + +// HeaderBytes return header bytes +func (v *Validator) HeaderBytes() []byte { + result := make([]byte, 40) + copy(result[:20], v.Address.Bytes()) + copy(result[20:], v.PowerBytes()) + return result +} + +// PowerBytes return power bytes +func (v *Validator) PowerBytes() []byte { + powerBytes := big.NewInt(0).SetInt64(v.VotingPower).Bytes() + result := make([]byte, 20) + copy(result[20-len(powerBytes):], powerBytes) + return result +} + +// MinimalVal returns block number of last validator update +func (v *Validator) MinimalVal() MinimalVal { + return MinimalVal{ + ID: v.ID, + VotingPower: uint64(v.VotingPower), + Signer: v.Address, + } +} + +// ParseValidators returns validator set bytes +func ParseValidators(validatorsBytes []byte) ([]*Validator, error) { + if len(validatorsBytes)%40 != 0 { + return nil, errors.New("Invalid validators bytes") + } + + result := make([]*Validator, len(validatorsBytes)/40) + for i := 0; i < len(validatorsBytes); i += 40 { + address := make([]byte, 20) + power := make([]byte, 20) + + copy(address, validatorsBytes[i:i+20]) + copy(power, validatorsBytes[i+20:i+40]) + + result[i/40] = NewValidator(common.BytesToAddress(address), big.NewInt(0).SetBytes(power).Int64()) + } + + return result, nil +} + +// --- + +// MinimalVal is the minimal validator representation +// Used to send validator information to bor validator contract +type MinimalVal struct { + ID uint64 `json:"ID"` + VotingPower uint64 `json:"power"` // TODO add 10^-18 here so that we dont overflow easily + Signer common.Address `json:"signer"` +} + +// SortMinimalValByAddress sorts validators +func SortMinimalValByAddress(a []MinimalVal) []MinimalVal { + sort.Slice(a, func(i, j int) bool { + return bytes.Compare(a[i].Signer.Bytes(), a[j].Signer.Bytes()) < 0 + }) + return a +} + +// ValidatorsToMinimalValidators converts array of validators to minimal validators +func ValidatorsToMinimalValidators(vals []Validator) (minVals []MinimalVal) { + for _, val := range vals { + minVals = append(minVals, val.MinimalVal()) + } + return +} diff --git a/consensus/bor/validator_set.go b/consensus/bor/validator_set.go new file mode 100644 index 00000000000..c1b7f181034 --- /dev/null +++ b/consensus/bor/validator_set.go @@ -0,0 +1,701 @@ +package bor + +// Tendermint leader selection algorithm + +import ( + "bytes" + "fmt" + "math" + "math/big" + "sort" + "strings" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/log/v3" +) + +// MaxTotalVotingPower - the maximum allowed total voting power. +// It needs to be sufficiently small to, in all cases: +// 1. prevent clipping in incrementProposerPriority() +// 2. let (diff+diffMax-1) not overflow in IncrementProposerPriority() +// (Proof of 1 is tricky, left to the reader). +// It could be higher, but this is sufficiently large for our purposes, +// and leaves room for defensive purposes. +// PriorityWindowSizeFactor - is a constant that when multiplied with the total voting power gives +// the maximum allowed distance between validator priorities. + +const ( + MaxTotalVotingPower = int64(math.MaxInt64) / 8 + PriorityWindowSizeFactor = 2 +) + +// ValidatorSet represent a set of *Validator at a given height. +// The validators can be fetched by address or index. +// The index is in order of .Address, so the indices are fixed +// for all rounds of a given blockchain height - ie. the validators +// are sorted by their address. +// On the other hand, the .ProposerPriority of each validator and +// the designated .GetProposer() of a set changes every round, +// upon calling .IncrementProposerPriority(). +// NOTE: Not goroutine-safe. +// NOTE: All get/set to validators should copy the value for safety. +type ValidatorSet struct { + // NOTE: persisted via reflect, must be exported. + Validators []*Validator `json:"validators"` + Proposer *Validator `json:"proposer"` + + // cached (unexported) + totalVotingPower int64 +} + +// NewValidatorSet initializes a ValidatorSet by copying over the +// values from `valz`, a list of Validators. If valz is nil or empty, +// the new ValidatorSet will have an empty list of Validators. +// The addresses of validators in `valz` must be unique otherwise the +// function panics. +func NewValidatorSet(valz []*Validator) *ValidatorSet { + vals := &ValidatorSet{} + err := vals.updateWithChangeSet(valz, false) + if err != nil { + panic(fmt.Sprintf("cannot create validator set: %s", err)) + } + if len(valz) > 0 { + vals.IncrementProposerPriority(1) + } + return vals +} + +// Nil or empty validator sets are invalid. +func (vals *ValidatorSet) IsNilOrEmpty() bool { + return vals == nil || len(vals.Validators) == 0 +} + +// Increment ProposerPriority and update the proposer on a copy, and return it. +func (vals *ValidatorSet) CopyIncrementProposerPriority(times int) *ValidatorSet { + copy := vals.Copy() + copy.IncrementProposerPriority(times) + return copy +} + +// IncrementProposerPriority increments ProposerPriority of each validator and updates the +// proposer. Panics if validator set is empty. +// `times` must be positive. +func (vals *ValidatorSet) IncrementProposerPriority(times int) { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + if times <= 0 { + panic("Cannot call IncrementProposerPriority with non-positive times") + } + + // Cap the difference between priorities to be proportional to 2*totalPower by + // re-normalizing priorities, i.e., rescale all priorities by multiplying with: + // 2*totalVotingPower/(maxPriority - minPriority) + diffMax := PriorityWindowSizeFactor * vals.TotalVotingPower() + vals.RescalePriorities(diffMax) + vals.shiftByAvgProposerPriority() + + var proposer *Validator + // Call IncrementProposerPriority(1) times times. + for i := 0; i < times; i++ { + proposer = vals.incrementProposerPriority() + } + + vals.Proposer = proposer +} + +func (vals *ValidatorSet) RescalePriorities(diffMax int64) { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + // NOTE: This check is merely a sanity check which could be + // removed if all tests would init. voting power appropriately; + // i.e. diffMax should always be > 0 + if diffMax <= 0 { + return + } + + // Calculating ceil(diff/diffMax): + // Re-normalization is performed by dividing by an integer for simplicity. + // NOTE: This may make debugging priority issues easier as well. + diff := computeMaxMinPriorityDiff(vals) + ratio := (diff + diffMax - 1) / diffMax + if diff > diffMax { + for _, val := range vals.Validators { + val.ProposerPriority = val.ProposerPriority / ratio + } + } +} + +func (vals *ValidatorSet) incrementProposerPriority() *Validator { + for _, val := range vals.Validators { + // Check for overflow for sum. + newPrio := safeAddClip(val.ProposerPriority, val.VotingPower) + val.ProposerPriority = newPrio + } + // Decrement the validator with most ProposerPriority. + mostest := vals.getValWithMostPriority() + // Mind the underflow. + mostest.ProposerPriority = safeSubClip(mostest.ProposerPriority, vals.TotalVotingPower()) + + return mostest +} + +// Should not be called on an empty validator set. +func (vals *ValidatorSet) computeAvgProposerPriority() int64 { + n := int64(len(vals.Validators)) + sum := big.NewInt(0) + for _, val := range vals.Validators { + sum.Add(sum, big.NewInt(val.ProposerPriority)) + } + avg := sum.Div(sum, big.NewInt(n)) + if avg.IsInt64() { + return avg.Int64() + } + + // This should never happen: each val.ProposerPriority is in bounds of int64. + panic(fmt.Sprintf("Cannot represent avg ProposerPriority as an int64 %v", avg)) +} + +// Compute the difference between the max and min ProposerPriority of that set. +func computeMaxMinPriorityDiff(vals *ValidatorSet) int64 { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + max := int64(math.MinInt64) + min := int64(math.MaxInt64) + for _, v := range vals.Validators { + if v.ProposerPriority < min { + min = v.ProposerPriority + } + if v.ProposerPriority > max { + max = v.ProposerPriority + } + } + diff := max - min + if diff < 0 { + return -1 * diff + } else { + return diff + } +} + +func (vals *ValidatorSet) getValWithMostPriority() *Validator { + var res *Validator + for _, val := range vals.Validators { + res = res.Cmp(val) + } + return res +} + +func (vals *ValidatorSet) shiftByAvgProposerPriority() { + if vals.IsNilOrEmpty() { + panic("empty validator set") + } + avgProposerPriority := vals.computeAvgProposerPriority() + for _, val := range vals.Validators { + val.ProposerPriority = safeSubClip(val.ProposerPriority, avgProposerPriority) + } +} + +// Makes a copy of the validator list. +func validatorListCopy(valsList []*Validator) []*Validator { + if valsList == nil { + return nil + } + valsCopy := make([]*Validator, len(valsList)) + for i, val := range valsList { + valsCopy[i] = val.Copy() + } + return valsCopy +} + +// Copy each validator into a new ValidatorSet. +func (vals *ValidatorSet) Copy() *ValidatorSet { + return &ValidatorSet{ + Validators: validatorListCopy(vals.Validators), + Proposer: vals.Proposer, + totalVotingPower: vals.totalVotingPower, + } +} + +// HasAddress returns true if address given is in the validator set, false - +// otherwise. +func (vals *ValidatorSet) HasAddress(address []byte) bool { + idx := sort.Search(len(vals.Validators), func(i int) bool { + return bytes.Compare(address, vals.Validators[i].Address.Bytes()) <= 0 + }) + return idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address) +} + +// GetByAddress returns an index of the validator with address and validator +// itself if found. Otherwise, -1 and nil are returned. +func (vals *ValidatorSet) GetByAddress(address common.Address) (index int, val *Validator) { + idx := sort.Search(len(vals.Validators), func(i int) bool { + return bytes.Compare(address.Bytes(), vals.Validators[i].Address.Bytes()) <= 0 + }) + if idx < len(vals.Validators) && bytes.Equal(vals.Validators[idx].Address.Bytes(), address.Bytes()) { + return idx, vals.Validators[idx].Copy() + } + return -1, nil +} + +// GetByIndex returns the validator's address and validator itself by index. +// It returns nil values if index is less than 0 or greater or equal to +// len(ValidatorSet.Validators). +func (vals *ValidatorSet) GetByIndex(index int) (address []byte, val *Validator) { + if index < 0 || index >= len(vals.Validators) { + return nil, nil + } + val = vals.Validators[index] + return val.Address.Bytes(), val.Copy() +} + +// Size returns the length of the validator set. +func (vals *ValidatorSet) Size() int { + return len(vals.Validators) +} + +// Force recalculation of the set's total voting power. +func (vals *ValidatorSet) updateTotalVotingPower() error { + + sum := int64(0) + for _, val := range vals.Validators { + // mind overflow + sum = safeAddClip(sum, val.VotingPower) + if sum > MaxTotalVotingPower { + return &TotalVotingPowerExceededError{sum, vals.Validators} + } + } + vals.totalVotingPower = sum + return nil +} + +// TotalVotingPower returns the sum of the voting powers of all validators. +// It recomputes the total voting power if required. +func (vals *ValidatorSet) TotalVotingPower() int64 { + if vals.totalVotingPower == 0 { + log.Info("invoking updateTotalVotingPower before returning it") + if err := vals.updateTotalVotingPower(); err != nil { + // Can/should we do better? + panic(err) + } + } + return vals.totalVotingPower +} + +// GetProposer returns the current proposer. If the validator set is empty, nil +// is returned. +func (vals *ValidatorSet) GetProposer() (proposer *Validator) { + if len(vals.Validators) == 0 { + return nil + } + if vals.Proposer == nil { + vals.Proposer = vals.findProposer() + } + return vals.Proposer.Copy() +} + +func (vals *ValidatorSet) findProposer() *Validator { + var proposer *Validator + for _, val := range vals.Validators { + if proposer == nil || !bytes.Equal(val.Address.Bytes(), proposer.Address.Bytes()) { + proposer = proposer.Cmp(val) + } + } + return proposer +} + +// Hash returns the Merkle root hash build using validators (as leaves) in the +// set. +// func (vals *ValidatorSet) Hash() []byte { +// if len(vals.Validators) == 0 { +// return nil +// } +// bzs := make([][]byte, len(vals.Validators)) +// for i, val := range vals.Validators { +// bzs[i] = val.Bytes() +// } +// return merkle.SimpleHashFromByteSlices(bzs) +// } + +// Iterate will run the given function over the set. +func (vals *ValidatorSet) Iterate(fn func(index int, val *Validator) bool) { + for i, val := range vals.Validators { + stop := fn(i, val.Copy()) + if stop { + break + } + } +} + +// Checks changes against duplicates, splits the changes in updates and removals, sorts them by address. +// +// Returns: +// updates, removals - the sorted lists of updates and removals +// err - non-nil if duplicate entries or entries with negative voting power are seen +// +// No changes are made to 'origChanges'. +func processChanges(origChanges []*Validator) (updates, removals []*Validator, err error) { + // Make a deep copy of the changes and sort by address. + changes := validatorListCopy(origChanges) + sort.Sort(ValidatorsByAddress(changes)) + + removals = make([]*Validator, 0, len(changes)) + updates = make([]*Validator, 0, len(changes)) + var prevAddr common.Address + + // Scan changes by address and append valid validators to updates or removals lists. + for _, valUpdate := range changes { + if bytes.Equal(valUpdate.Address.Bytes(), prevAddr.Bytes()) { + err = fmt.Errorf("duplicate entry %v in %v", valUpdate, changes) + return nil, nil, err + } + if valUpdate.VotingPower < 0 { + err = fmt.Errorf("voting power can't be negative: %v", valUpdate) + return nil, nil, err + } + if valUpdate.VotingPower > MaxTotalVotingPower { + err = fmt.Errorf("to prevent clipping/ overflow, voting power can't be higher than %v: %v ", + MaxTotalVotingPower, valUpdate) + return nil, nil, err + } + if valUpdate.VotingPower == 0 { + removals = append(removals, valUpdate) + } else { + updates = append(updates, valUpdate) + } + prevAddr = valUpdate.Address + } + return updates, removals, err +} + +// Verifies a list of updates against a validator set, making sure the allowed +// total voting power would not be exceeded if these updates would be applied to the set. +// +// Returns: +// updatedTotalVotingPower - the new total voting power if these updates would be applied +// numNewValidators - number of new validators +// err - non-nil if the maximum allowed total voting power would be exceeded +// +// 'updates' should be a list of proper validator changes, i.e. they have been verified +// by processChanges for duplicates and invalid values. +// No changes are made to the validator set 'vals'. +func verifyUpdates(updates []*Validator, vals *ValidatorSet) (updatedTotalVotingPower int64, numNewValidators int, err error) { + + updatedTotalVotingPower = vals.TotalVotingPower() + + for _, valUpdate := range updates { + address := valUpdate.Address + _, val := vals.GetByAddress(address) + if val == nil { + // New validator, add its voting power the the total. + updatedTotalVotingPower += valUpdate.VotingPower + numNewValidators++ + } else { + // Updated validator, add the difference in power to the total. + updatedTotalVotingPower += valUpdate.VotingPower - val.VotingPower + } + overflow := updatedTotalVotingPower > MaxTotalVotingPower + if overflow { + err = fmt.Errorf( + "failed to add/update validator %v, total voting power would exceed the max allowed %v", + valUpdate, MaxTotalVotingPower) + return 0, 0, err + } + } + + return updatedTotalVotingPower, numNewValidators, nil +} + +// Computes the proposer priority for the validators not present in the set based on 'updatedTotalVotingPower'. +// Leaves unchanged the priorities of validators that are changed. +// +// 'updates' parameter must be a list of unique validators to be added or updated. +// No changes are made to the validator set 'vals'. +func computeNewPriorities(updates []*Validator, vals *ValidatorSet, updatedTotalVotingPower int64) { + + for _, valUpdate := range updates { + address := valUpdate.Address + _, val := vals.GetByAddress(address) + if val == nil { + // add val + // Set ProposerPriority to -C*totalVotingPower (with C ~= 1.125) to make sure validators can't + // un-bond and then re-bond to reset their (potentially previously negative) ProposerPriority to zero. + // + // Contract: updatedVotingPower < MaxTotalVotingPower to ensure ProposerPriority does + // not exceed the bounds of int64. + // + // Compute ProposerPriority = -1.125*totalVotingPower == -(updatedVotingPower + (updatedVotingPower >> 3)). + valUpdate.ProposerPriority = -(updatedTotalVotingPower + (updatedTotalVotingPower >> 3)) + } else { + valUpdate.ProposerPriority = val.ProposerPriority + } + } + +} + +// Merges the vals' validator list with the updates list. +// When two elements with same address are seen, the one from updates is selected. +// Expects updates to be a list of updates sorted by address with no duplicates or errors, +// must have been validated with verifyUpdates() and priorities computed with computeNewPriorities(). +func (vals *ValidatorSet) applyUpdates(updates []*Validator) { + + existing := vals.Validators + merged := make([]*Validator, len(existing)+len(updates)) + i := 0 + + for len(existing) > 0 && len(updates) > 0 { + if bytes.Compare(existing[0].Address.Bytes(), updates[0].Address.Bytes()) < 0 { // unchanged validator + merged[i] = existing[0] + existing = existing[1:] + } else { + // Apply add or update. + merged[i] = updates[0] + if bytes.Equal(existing[0].Address.Bytes(), updates[0].Address.Bytes()) { + // Validator is present in both, advance existing. + existing = existing[1:] + } + updates = updates[1:] + } + i++ + } + + // Add the elements which are left. + for j := 0; j < len(existing); j++ { + merged[i] = existing[j] + i++ + } + // OR add updates which are left. + for j := 0; j < len(updates); j++ { + merged[i] = updates[j] + i++ + } + + vals.Validators = merged[:i] +} + +// Checks that the validators to be removed are part of the validator set. +// No changes are made to the validator set 'vals'. +func verifyRemovals(deletes []*Validator, vals *ValidatorSet) error { + + for _, valUpdate := range deletes { + address := valUpdate.Address + _, val := vals.GetByAddress(address) + if val == nil { + return fmt.Errorf("failed to find validator %X to remove", address) + } + } + if len(deletes) > len(vals.Validators) { + panic("more deletes than validators") + } + return nil +} + +// Removes the validators specified in 'deletes' from validator set 'vals'. +// Should not fail as verification has been done before. +func (vals *ValidatorSet) applyRemovals(deletes []*Validator) { + + existing := vals.Validators + + merged := make([]*Validator, len(existing)-len(deletes)) + i := 0 + + // Loop over deletes until we removed all of them. + for len(deletes) > 0 { + if bytes.Equal(existing[0].Address.Bytes(), deletes[0].Address.Bytes()) { + deletes = deletes[1:] + } else { // Leave it in the resulting slice. + merged[i] = existing[0] + i++ + } + existing = existing[1:] + } + + // Add the elements which are left. + for j := 0; j < len(existing); j++ { + merged[i] = existing[j] + i++ + } + + vals.Validators = merged[:i] +} + +// Main function used by UpdateWithChangeSet() and NewValidatorSet(). +// If 'allowDeletes' is false then delete operations (identified by validators with voting power 0) +// are not allowed and will trigger an error if present in 'changes'. +// The 'allowDeletes' flag is set to false by NewValidatorSet() and to true by UpdateWithChangeSet(). +func (vals *ValidatorSet) updateWithChangeSet(changes []*Validator, allowDeletes bool) error { + + if len(changes) < 1 { + return nil + } + + // Check for duplicates within changes, split in 'updates' and 'deletes' lists (sorted). + updates, deletes, err := processChanges(changes) + if err != nil { + return err + } + + if !allowDeletes && len(deletes) != 0 { + return fmt.Errorf("cannot process validators with voting power 0: %v", deletes) + } + + // Verify that applying the 'deletes' against 'vals' will not result in error. + if err := verifyRemovals(deletes, vals); err != nil { + return err + } + + // Verify that applying the 'updates' against 'vals' will not result in error. + updatedTotalVotingPower, numNewValidators, err := verifyUpdates(updates, vals) + if err != nil { + return err + } + + // Check that the resulting set will not be empty. + if numNewValidators == 0 && len(vals.Validators) == len(deletes) { + return fmt.Errorf("applying the validator changes would result in empty set") + } + + // Compute the priorities for updates. + computeNewPriorities(updates, vals, updatedTotalVotingPower) + + // Apply updates and removals. + vals.applyUpdates(updates) + vals.applyRemovals(deletes) + + if err := vals.updateTotalVotingPower(); err != nil { + return err + } + + // Scale and center. + vals.RescalePriorities(PriorityWindowSizeFactor * vals.TotalVotingPower()) + vals.shiftByAvgProposerPriority() + + return nil +} + +// UpdateWithChangeSet attempts to update the validator set with 'changes'. +// It performs the following steps: +// - validates the changes making sure there are no duplicates and splits them in updates and deletes +// - verifies that applying the changes will not result in errors +// - computes the total voting power BEFORE removals to ensure that in the next steps the priorities +// across old and newly added validators are fair +// - computes the priorities of new validators against the final set +// - applies the updates against the validator set +// - applies the removals against the validator set +// - performs scaling and centering of priority values +// If an error is detected during verification steps, it is returned and the validator set +// is not changed. +func (vals *ValidatorSet) UpdateWithChangeSet(changes []*Validator) error { + return vals.updateWithChangeSet(changes, true) +} + +//----------------- +// ErrTooMuchChange + +func IsErrTooMuchChange(err error) bool { + switch err.(type) { + case errTooMuchChange: + return true + default: + return false + } +} + +type errTooMuchChange struct { + got int64 + needed int64 +} + +func (e errTooMuchChange) Error() string { + return fmt.Sprintf("Invalid commit -- insufficient old voting power: got %v, needed %v", e.got, e.needed) +} + +//---------------- + +func (vals *ValidatorSet) String() string { + return vals.StringIndented("") +} + +func (vals *ValidatorSet) StringIndented(indent string) string { + if vals == nil { + return "nil-ValidatorSet" + } + var valStrings []string + vals.Iterate(func(index int, val *Validator) bool { + valStrings = append(valStrings, val.String()) + return false + }) + return fmt.Sprintf(`ValidatorSet{ +%s Proposer: %v +%s Validators: +%s %v +%s}`, + indent, vals.GetProposer().String(), + indent, + indent, strings.Join(valStrings, "\n"+indent+" "), + indent) + +} + +//------------------------------------- +// Implements sort for sorting validators by address. + +// Sort validators by address. +type ValidatorsByAddress []*Validator + +func (valz ValidatorsByAddress) Len() int { + return len(valz) +} + +func (valz ValidatorsByAddress) Less(i, j int) bool { + return bytes.Compare(valz[i].Address.Bytes(), valz[j].Address.Bytes()) == -1 +} + +func (valz ValidatorsByAddress) Swap(i, j int) { + valz[i], valz[j] = valz[j], valz[i] +} + +/////////////////////////////////////////////////////////////////////////////// +// safe addition/subtraction + +func safeAdd(a, b int64) (int64, bool) { + if b > 0 && a > math.MaxInt64-b { + return -1, true + } else if b < 0 && a < math.MinInt64-b { + return -1, true + } + return a + b, false +} + +func safeSub(a, b int64) (int64, bool) { + if b > 0 && a < math.MinInt64+b { + return -1, true + } else if b < 0 && a > math.MaxInt64+b { + return -1, true + } + return a - b, false +} + +func safeAddClip(a, b int64) int64 { + c, overflow := safeAdd(a, b) + if overflow { + if b < 0 { + return math.MinInt64 + } + return math.MaxInt64 + } + return c +} + +func safeSubClip(a, b int64) int64 { + c, overflow := safeSub(a, b) + if overflow { + if b > 0 { + return math.MinInt64 + } + return math.MaxInt64 + } + return c +} diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index a35d55acdd5..cd61882a551 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -32,6 +32,7 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" "golang.org/x/crypto/sha3" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/common/debug" @@ -173,9 +174,9 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, er // Ethereum testnet following the Ropsten attacks. type Clique struct { chainConfig *params.ChainConfig - config *params.CliqueConfig // Consensus engine configuration parameters - snapshotConfig *params.SnapshotConfig // Consensus engine configuration parameters - db kv.RwDB // Database to store and retrieve snapshot checkpoints + config *params.CliqueConfig // Consensus engine configuration parameters + snapshotConfig *params.ConsensusSnapshotConfig // Consensus engine configuration parameters + db kv.RwDB // Database to store and retrieve snapshot checkpoints signatures *lru.ARCCache // Signatures of recent blocks to speed up mining recents *lru.ARCCache // Snapshots for recent block to speed up reorgs @@ -184,7 +185,7 @@ type Clique struct { signer common.Address // Ethereum address of the signing key signFn SignerFn // Signer function to authorize hashes with - lock sync.RWMutex // Protects the signer fields + lock sync.RWMutex // Protects the signer and proposals fields // The fields below are for testing only FakeDiff bool // Skip difficulty verifications @@ -194,7 +195,7 @@ type Clique struct { // New creates a Clique proof-of-authority consensus engine with the initial // signers set to the ones provided by the user. -func New(cfg *params.ChainConfig, snapshotConfig *params.SnapshotConfig, cliqueDB kv.RwDB) *Clique { +func New(cfg *params.ChainConfig, snapshotConfig *params.ConsensusSnapshotConfig, cliqueDB kv.RwDB) *Clique { config := cfg.Clique // Set any missing consensus parameters to their defaults @@ -223,12 +224,12 @@ func New(cfg *params.ChainConfig, snapshotConfig *params.SnapshotConfig, cliqueD snapNum, err := lastSnapshot(cliqueDB) if err != nil { if !errors.Is(err, ErrNotFound) { - log.Error("on Clique init while getting latest snapshot", "error", err) + log.Error("on Clique init while getting latest snapshot", "err", err) } } else { snaps, err := c.snapshots(snapNum, warmupCacheSnapshots) if err != nil { - log.Error("on Clique init", "error", err) + log.Error("on Clique init", "err", err) } for _, sn := range snaps { @@ -239,6 +240,11 @@ func New(cfg *params.ChainConfig, snapshotConfig *params.SnapshotConfig, cliqueD return c } +// Type returns underlying consensus engine +func (c *Clique) Type() params.ConsensusType { + return params.CliqueConsensus +} + // Author implements consensus.Engine, returning the Ethereum address recovered // from the signature in the header's extra-data section. func (c *Clique) Author(header *types.Header) (common.Address, error) { @@ -250,21 +256,6 @@ func (c *Clique) VerifyHeader(chain consensus.ChainHeaderReader, header *types.H return c.verifyHeader(chain, header, nil) } -// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers. The -// method returns a quit channel to abort the operations and a results channel to -// retrieve the async verifications (the order is that of the input slice). -func (c *Clique) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, _ []bool) error { - if len(headers) == 0 { - return nil - } - for i, header := range headers { - if err := c.verifyHeader(chain, header, headers[:i]); err != nil { - return err - } - } - return nil -} - type VerifyHeaderResponse struct { Results chan error Cancel func() @@ -296,7 +287,7 @@ func (c *Clique) VerifySeal(chain consensus.ChainHeaderReader, header *types.Hea // Prepare implements consensus.Engine, preparing all the consensus fields of the // header for running the transactions on top. -func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error { +func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header, state *state.IntraBlockState) error { // If the block isn't a checkpoint, cast a random vote (good enough for now) header.Coinbase = common.Address{} @@ -308,9 +299,8 @@ func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header if err != nil { return err } + c.lock.RLock() if number%c.config.Epoch != 0 { - c.lock.RLock() - // Gather all the proposals that make sense voting on addresses := make([]common.Address, 0, len(c.proposals)) for address, authorize := range c.proposals { @@ -327,10 +317,14 @@ func (c *Clique) Prepare(chain consensus.ChainHeaderReader, header *types.Header copy(header.Nonce[:], nonceDropVote) } } - c.lock.RUnlock() } + + // Copy signer protected by mutex to avoid race condition + signer := c.signer + c.lock.RUnlock() + // Set the correct difficulty - header.Difficulty = calcDifficulty(snap, c.signer) + header.Difficulty = calcDifficulty(snap, signer) // Ensure the extra data has all its components if len(header.Extra) < ExtraVanity { @@ -368,21 +362,26 @@ func (c *Clique) Initialize(config *params.ChainConfig, chain consensus.ChainHea // Finalize implements consensus.Engine, ensuring no uncles are set, nor block // rewards given. -func (c *Clique) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall) error { +func (c *Clique) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, +) (types.Transactions, types.Receipts, error) { // No block rewards in PoA, so the state remains as is and uncles are dropped header.UncleHash = types.CalcUncleHash(nil) - return nil + return txs, r, nil } // FinalizeAndAssemble implements consensus.Engine, ensuring no uncles are set, // nor block rewards given, and returns the final block. -func (c *Clique) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, receipts types.Receipts, - e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call) (*types.Block, error) { +func (c *Clique) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, receipts types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call, +) (*types.Block, types.Transactions, types.Receipts, error) { // No block rewards in PoA, so the state remains as is and uncles are dropped header.UncleHash = types.CalcUncleHash(nil) // Assemble and return the final block for sealing - return types.NewBlock(header, txs, nil, receipts), nil + return types.NewBlock(header, txs, nil, receipts), txs, receipts, nil } // Authorize injects a private key into the consensus engine to mint new blocks @@ -483,7 +482,10 @@ func (c *Clique) CalcDifficulty(chain consensus.ChainHeaderReader, _, _ uint64, if err != nil { return nil } - return calcDifficulty(snap, c.signer) + c.lock.RLock() + signer := c.signer + c.lock.RUnlock() + return calcDifficulty(snap, signer) } func calcDifficulty(snap *Snapshot, signer common.Address) *big.Int { @@ -500,7 +502,7 @@ func (c *Clique) SealHash(header *types.Header) common.Hash { // Close implements consensus.Engine. It's a noop for clique as there are no background threads. func (c *Clique) Close() error { - common.SafeClose(c.exitCh) + libcommon.SafeClose(c.exitCh) return nil } diff --git a/consensus/clique/clique_test.go b/consensus/clique/clique_test.go index 1d0946de8e8..8b10d8a64fc 100644 --- a/consensus/clique/clique_test.go +++ b/consensus/clique/clique_test.go @@ -53,7 +53,7 @@ func TestReimportMirroredState(t *testing.T) { genspec := &core.Genesis{ ExtraData: make([]byte, clique.ExtraVanity+common.AddressLength+clique.ExtraSeal), Alloc: map[common.Address]core.GenesisAccount{ - addr: {Balance: big.NewInt(1)}, + addr: {Balance: big.NewInt(10000000000000000)}, }, Config: params.AllCliqueProtocolChanges, } @@ -79,7 +79,8 @@ func TestReimportMirroredState(t *testing.T) { // We want to simulate an empty middle block, having the same state as the // first one. The last is needs a state change again to force a reorg. if i != 1 { - tx, err := types.SignTx(types.NewTransaction(block.TxNonce(addr), common.Address{0x00}, new(uint256.Int), params.TxGas, nil, nil), *signer, key) + baseFee, _ := uint256.FromBig(block.GetHeader().BaseFee) + tx, err := types.SignTx(types.NewTransaction(block.TxNonce(addr), common.Address{0x00}, new(uint256.Int), params.TxGas, baseFee, nil), *signer, key) if err != nil { panic(err) } diff --git a/consensus/clique/snapshot_test.go b/consensus/clique/snapshot_test.go index 9043bfdcabd..6eb3f39f422 100644 --- a/consensus/clique/snapshot_test.go +++ b/consensus/clique/snapshot_test.go @@ -433,7 +433,7 @@ func TestClique(t *testing.T) { copy(nonce[:], clique.NonceAuthVote) gen.SetNonce(nonce) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } diff --git a/consensus/clique/verifier.go b/consensus/clique/verifier.go index 5c4143602e8..85ea1c737dc 100644 --- a/consensus/clique/verifier.go +++ b/consensus/clique/verifier.go @@ -190,7 +190,7 @@ func (c *Clique) Snapshot(chain consensus.ChainHeaderReader, number uint64, hash if err := snap.store(c.db); err != nil { return nil, err } - log.Info("Stored checkpoint snapshot to disk", "number", number, "hash", hash) + log.Info("[Clique] Stored checkpoint snapshot to disk", "number", number, "hash", hash) break } } diff --git a/consensus/consensus.go b/consensus/consensus.go index 84233f4e424..044cc5218d3 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -45,6 +45,9 @@ type ChainHeaderReader interface { // GetHeaderByHash retrieves a block header from the database by its hash. GetHeaderByHash(hash common.Hash) *types.Header + + // GetTd retrieves the total difficulty from the database by hash and number. + GetTd(hash common.Hash, number uint64) *big.Int } // ChainReader defines a small collection of methods needed to access the local @@ -82,19 +85,13 @@ type Engine interface { // via the VerifySeal method. VerifyHeader(chain ChainHeaderReader, header *types.Header, seal bool) error - // VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers - // concurrently. The method returns a quit channel to abort the operations and - // a results channel to retrieve the async verifications (the order is that of - // the input slice). - VerifyHeaders(chain ChainHeaderReader, headers []*types.Header, seals []bool) error - // VerifyUncles verifies that the given block's uncles conform to the consensus // rules of a given engine. VerifyUncles(chain ChainReader, header *types.Header, uncles []*types.Header) error // Prepare initializes the consensus fields of a block header according to the // rules of a particular engine. The changes are executed inline. - Prepare(chain ChainHeaderReader, header *types.Header) error + Prepare(chain ChainHeaderReader, header *types.Header, state *state.IntraBlockState) error // Initialize runs any pre-transaction state modifications (e.g. epoch start) Initialize(config *params.ChainConfig, chain ChainHeaderReader, e EpochReader, header *types.Header, txs []types.Transaction, uncles []*types.Header, syscall SystemCall) @@ -104,15 +101,20 @@ type Engine interface { // // Note: The block header and state database might be updated to reflect any // consensus rules that happen at finalization (e.g. block rewards). - Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, e EpochReader, chain ChainHeaderReader, syscall SystemCall) error + Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, receipts types.Receipts, + e EpochReader, chain ChainHeaderReader, syscall SystemCall, + ) (types.Transactions, types.Receipts, error) // FinalizeAndAssemble runs any post-transaction state modifications (e.g. block // rewards) and assembles the final block. // // Note: The block header and state database might be updated to reflect any // consensus rules that happen at finalization (e.g. block rewards). - FinalizeAndAssemble(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, - uncles []*types.Header, receipts types.Receipts, e EpochReader, chain ChainHeaderReader, syscall SystemCall, call Call) (*types.Block, error) + FinalizeAndAssemble(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, receipts types.Receipts, + e EpochReader, chain ChainHeaderReader, syscall SystemCall, call Call, + ) (*types.Block, types.Transactions, types.Receipts, error) // Seal generates a new sealing request for the given input block and pushes // the result into the given channel. @@ -133,6 +135,7 @@ type Engine interface { // APIs returns the RPC APIs this consensus engine provides. APIs(chain ChainHeaderReader) []rpc.API + Type() params.ConsensusType // Close terminates any background threads maintained by the consensus engine. Close() error } @@ -144,3 +147,17 @@ type PoW interface { // Hashrate returns the current mining hashrate of a PoW consensus engine. Hashrate() float64 } + +var ( + SystemAddress = common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") +) + +type PoSA interface { + Engine + + IsSystemTransaction(tx types.Transaction, header *types.Header) (bool, error) + IsSystemContract(to *common.Address) bool + EnoughDistance(chain ChainReader, header *types.Header) bool + IsLocalBlock(header *types.Header) bool + AllowLightProcess(chain ChainReader, currentHeader *types.Header) bool +} diff --git a/consensus/db/db.go b/consensus/db/db.go index 72db22fc7c6..d5b6f45e8f2 100644 --- a/consensus/db/db.go +++ b/consensus/db/db.go @@ -7,7 +7,7 @@ import ( ) func OpenDatabase(path string, logger log.Logger, inmem bool) kv.RwDB { - opts := mdbx.NewMDBX(logger) + opts := mdbx.NewMDBX(logger).Label(kv.ConsensusDB) if inmem { opts = opts.InMem() } else { diff --git a/consensus/errors.go b/consensus/errors.go index ac5242fb54c..28021094c24 100644 --- a/consensus/errors.go +++ b/consensus/errors.go @@ -23,6 +23,10 @@ var ( // that is unknown. ErrUnknownAncestor = errors.New("unknown ancestor") + // ErrUnknownAncestorTD is returned when validating a block requires an ancestor + // whose total difficulty is unknown. + ErrUnknownAncestorTD = errors.New("unknown ancestor TD") + // ErrPrunedAncestor is returned when validating a block requires an ancestor // that is known, but the state of which is not available. ErrPrunedAncestor = errors.New("pruned ancestor") diff --git a/consensus/ethash/algorithm.go b/consensus/ethash/algorithm.go index cc423ad4300..e8f342b9198 100644 --- a/consensus/ethash/algorithm.go +++ b/consensus/ethash/algorithm.go @@ -168,8 +168,8 @@ func generateCache(dest []uint32, epoch uint64, seed []byte) { defer func() { elapsed := time.Since(start) - logFn := logger.Debug - if elapsed > 3*time.Second { + logFn := logger.Trace + if elapsed > 5*time.Second { logFn = logger.Info } logFn("Generated ethash verification cache", "elapsed", common.PrettyDuration(elapsed)) @@ -343,7 +343,7 @@ func generateDataset(dest []uint32, epoch uint64, cache []uint32) { datasetHdr.Cap = destHdr.Cap * 4 // Generate the dataset on many goroutines since it takes a while - threads := runtime.NumCPU() + threads := runtime.GOMAXPROCS(-1) size := uint64(len(dataset)) var pend sync.WaitGroup diff --git a/consensus/ethash/algorithm_test.go b/consensus/ethash/algorithm_test.go index 7d198162b0f..efecc0f6fd2 100644 --- a/consensus/ethash/algorithm_test.go +++ b/consensus/ethash/algorithm_test.go @@ -20,7 +20,6 @@ import ( "bytes" "encoding/binary" "io" - "io/ioutil" "reflect" "testing" @@ -770,7 +769,7 @@ func BenchmarkSeedHash(b *testing.B) { } } - _, err := io.Copy(ioutil.Discard, bytes.NewBuffer(res)) + _, err := io.Copy(io.Discard, bytes.NewBuffer(res)) if err != nil { b.Error(err) } @@ -785,7 +784,7 @@ func BenchmarkSeedHashOld(b *testing.B) { } } - _, err := io.Copy(ioutil.Discard, bytes.NewBuffer(res)) + _, err := io.Copy(io.Discard, bytes.NewBuffer(res)) if err != nil { b.Error(err) } diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index 2029d730450..cf0a6f8e7c2 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -22,14 +22,11 @@ import ( "fmt" "math/big" "runtime" - "sync" - "sync/atomic" "time" mapset "github.com/deckarep/golang-set" "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/common/u256" "github.com/ledgerwatch/erigon/consensus" @@ -50,6 +47,11 @@ var ( maxUncles = 2 // Maximum number of uncles allowed in a single block allowedFutureBlockTimeSeconds = int64(15) // Max seconds from current time allowed for blocks, before they're considered future blocks + // calcDifficultyEip4345 is the difficulty adjustment algorithm as specified by EIP 4345. + // It offsets the bomb a total of 10.7M blocks. + // Specification EIP-4345: https://eips.ethereum.org/EIPS/eip-4345 + calcDifficultyEip4345 = makeDifficultyCalculator(10700000) + // calcDifficultyEip3554 is the difficulty adjustment algorithm as specified by EIP 3554. // It offsets the bomb a total of 9.7M blocks. // Specification EIP-3554: https://eips.ethereum.org/EIPS/eip-3554 @@ -89,6 +91,11 @@ var ( errInvalidPoW = errors.New("invalid proof-of-work") ) +// Type returns underlying consensus engine +func (ethash *Ethash) Type() params.ConsensusType { + return params.EtHashConsensus +} + // Author implements consensus.Engine, returning the header's coinbase as the // proof-of-work verified author of the block. func (ethash *Ethash) Author(header *types.Header) (common.Address, error) { @@ -112,80 +119,6 @@ func (ethash *Ethash) VerifyHeader(chain consensus.ChainHeaderReader, header *ty return ethash.verifyHeader(chain, header, parent, false, seal) } -// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers -// concurrently. The method returns a quit channel to abort the operations and -// a results channel to retrieve the async verifications. -func (ethash *Ethash) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) error { - if len(headers) == 0 { - return nil - } - - // Spawn as many workers as allowed threads - workers := runtime.GOMAXPROCS(0) - if len(headers) < workers { - workers = len(headers) - } - - // Create a task channel and spawn the verifiers - var ( - errors = make([]error, len(headers)) - ) - - wg := sync.WaitGroup{} - - input := new(int64) - - for i := 0; i < workers; i++ { - wg.Add(1) - go func() { - defer debug.LogPanic() - defer wg.Done() - var index int64 - for { - index = atomic.AddInt64(input, 1) - 1 - if int(index) > len(headers)-1 { - return - } - errors[index] = ethash.verifyHeaderWorker(chain, headers, seals, int(index)) - if errors[index] != nil { - return - } - } - }() - } - - wg.Wait() - for _, err := range errors { - if err != nil { - return err - } - } - - return nil -} - -func (ethash *Ethash) verifyHeaderWorker(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool, index int) error { - var parent *types.Header - if index == 0 { - parent = chain.GetHeader(headers[0].ParentHash, headers[0].Number.Uint64()-1) - } else if headers[index-1].Hash() == headers[index].ParentHash { - parent = headers[index-1] - } - if parent == nil { - if index-1 >= 0 && index-1 <= len(headers)-1 { - log.Error("consensus.ErrUnknownAncestor", "index", index, "headers", len(headers), "index-1", headers[index-1].Number.Uint64(), "index", headers[index].Number.Uint64()) - } else { - log.Error("consensus.ErrUnknownAncestor", "index", index, "headers", len(headers)) - } - - return consensus.ErrUnknownAncestor - } - if chain.GetHeader(headers[index].Hash(), headers[index].Number.Uint64()) != nil { - return nil // known block - } - return ethash.verifyHeader(chain, headers[index], parent, false, seals[index]) -} - // VerifyUncles verifies that the given block's uncles conform to the consensus // rules of the stock Ethereum ethash engine. func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, header *types.Header, uncles []*types.Header) error { @@ -280,9 +213,8 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainHeaderReader, header, pa return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, expected) } // Verify that the gas limit is <= 2^63-1 - cap := uint64(0x7fffffffffffffff) - if header.GasLimit > cap { - return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, cap) + if header.GasLimit > params.MaxGasLimit { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, params.MaxGasLimit) } // Verify that the gasUsed is <= gasLimit if header.GasUsed > header.GasLimit { @@ -345,6 +277,8 @@ func (ethash *Ethash) CalcDifficulty(chain consensus.ChainHeaderReader, time, pa func CalcDifficulty(config *params.ChainConfig, time, parentTime uint64, parentDifficulty *big.Int, parentNumber uint64, parentUncleHash common.Hash) *big.Int { next := parentNumber + 1 switch { + case config.IsArrowGlacier(next): + return calcDifficultyEip4345(time, parentTime, parentDifficulty, parentNumber, parentUncleHash) case config.IsLondon(next): return calcDifficultyEip3554(time, parentTime, parentDifficulty, parentNumber, parentUncleHash) case config.IsMuirGlacier(next): @@ -587,7 +521,7 @@ func (ethash *Ethash) verifySeal(header *types.Header, fulldag bool) error { //n // Prepare implements consensus.Engine, initializing the difficulty field of a // header to conform to the ethash protocol. The changes are done inline. -func (ethash *Ethash) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error { +func (ethash *Ethash) Prepare(chain consensus.ChainHeaderReader, header *types.Header, state *state.IntraBlockState) error { parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1) if parent == nil { return consensus.ErrUnknownAncestor @@ -601,21 +535,29 @@ func (ethash *Ethash) Initialize(config *params.ChainConfig, chain consensus.Cha // Finalize implements consensus.Engine, accumulating the block and uncle rewards, // setting the final state on the header -func (ethash *Ethash) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall) error { +func (ethash *Ethash) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, +) (types.Transactions, types.Receipts, error) { // Accumulate any block and uncle rewards and commit the final state root accumulateRewards(config, state, header, uncles) - return nil + return txs, r, nil } // FinalizeAndAssemble implements consensus.Engine, accumulating the block and // uncle rewards, setting the final state and assembling the block. -func (ethash *Ethash) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, - e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call) (*types.Block, error) { +func (ethash *Ethash) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call, +) (*types.Block, types.Transactions, types.Receipts, error) { // Finalize block - ethash.Finalize(chainConfig, header, state, txs, uncles, r, e, chain, syscall) + outTxs, outR, err := ethash.Finalize(chainConfig, header, state, txs, uncles, r, e, chain, syscall) + if err != nil { + return nil, nil, nil, err + } // Header seems complete, assemble into a block and return - return types.NewBlock(header, txs, uncles, r), nil + return types.NewBlock(header, outTxs, uncles, outR), outTxs, outR, nil } // SealHash returns the hash of a block prior to it being sealed. diff --git a/consensus/ethash/fake.go b/consensus/ethash/fake.go index da98aa892a4..d8a0f000395 100644 --- a/consensus/ethash/fake.go +++ b/consensus/ethash/fake.go @@ -55,21 +55,6 @@ func newFakeEth(mode Mode) Ethash { } } -func (f *FakeEthash) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) error { - fakeSeals := make([]bool, len(seals)) - if err := f.Ethash.VerifyHeaders(chain, headers, fakeSeals); err != nil { - return err - } - for i, header := range headers { - if seals[i] { - if err := f.VerifySeal(chain, header); err != nil { - return err - } - } - } - return nil -} - func (f *FakeEthash) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error { err := f.Ethash.VerifyHeader(chain, header, false) if err != nil { @@ -160,11 +145,6 @@ func (f *FullFakeEthash) VerifyHeader(_ consensus.ChainHeaderReader, _ *types.He return nil } -// If we're running a full engine faking, accept any input as valid -func (f *FullFakeEthash) VerifyHeaders(_ consensus.ChainHeaderReader, headers []*types.Header, _ []bool) error { - return nil -} - func (f *FullFakeEthash) VerifyUncles(_ consensus.ChainReader, _ *types.Header, _ []*types.Header) error { return nil } diff --git a/consensus/ethash/sealer.go b/consensus/ethash/sealer.go index bed0649f755..ce143340ba3 100644 --- a/consensus/ethash/sealer.go +++ b/consensus/ethash/sealer.go @@ -283,7 +283,7 @@ func (s *remoteSealer) sendNotification(ctx context.Context, url string, json [] // any other error, like no pending work or stale mining result). func (s *remoteSealer) submitWork(nonce types.BlockNonce, mixDigest common.Hash, sealhash common.Hash) bool { if s.currentBlock == nil { - s.ethash.config.Log.Error("Pending work without block", "sealhash", sealhash) + s.ethash.config.Log.Warn("Pending work without block", "sealhash", sealhash) return false } // Make sure the work submitted is present @@ -318,7 +318,7 @@ func (s *remoteSealer) submitWork(nonce types.BlockNonce, mixDigest common.Hash, if solution.NumberU64()+staleThreshold > s.currentBlock.NumberU64() { select { case s.results <- solution: - s.ethash.config.Log.Debug("Work submitted is acceptable", "number", solution.NumberU64(), "sealhash", sealhash, "hash", solution.Hash()) + s.ethash.config.Log.Trace("Work submitted is acceptable", "number", solution.NumberU64(), "sealhash", sealhash, "hash", solution.Hash()) return true default: s.ethash.config.Log.Warn("Sealing result is not read by miner", "mode", "remote", "sealhash", sealhash) diff --git a/consensus/ethash/sealer_test.go b/consensus/ethash/sealer_test.go index 1691f075384..75caecb9d23 100644 --- a/consensus/ethash/sealer_test.go +++ b/consensus/ethash/sealer_test.go @@ -17,7 +17,7 @@ package ethash import ( - "io/ioutil" + "io" "math/big" "net/http" "net/http/httptest" @@ -38,7 +38,7 @@ func TestRemoteNotify(t *testing.T) { // Start a simple web server to capture notifications. sink := make(chan [3]string) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - blob, err := ioutil.ReadAll(req.Body) + blob, err := io.ReadAll(req.Body) if err != nil { t.Errorf("failed to read miner notification: %v", err) } @@ -83,7 +83,7 @@ func TestRemoteNotifyFull(t *testing.T) { // Start a simple web server to capture notifications. sink := make(chan map[string]interface{}) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - blob, err := ioutil.ReadAll(req.Body) + blob, err := io.ReadAll(req.Body) if err != nil { t.Errorf("failed to read miner notification: %v", err) } @@ -132,7 +132,7 @@ func TestRemoteMultiNotify(t *testing.T) { // Start a simple web server to capture notifications. sink := make(chan [3]string, 64) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - blob, err := ioutil.ReadAll(req.Body) + blob, err := io.ReadAll(req.Body) if err != nil { t.Errorf("failed to read miner notification: %v", err) } @@ -181,7 +181,7 @@ func TestRemoteMultiNotifyFull(t *testing.T) { // Start a simple web server to capture notifications. sink := make(chan map[string]interface{}, 64) server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - blob, err := ioutil.ReadAll(req.Body) + blob, err := io.ReadAll(req.Body) if err != nil { t.Errorf("failed to read miner notification: %v", err) } @@ -293,20 +293,20 @@ func TestStaleSubmission(t *testing.T) { } select { case res := <-results: - if res.Header().Nonce != fakeNonce { - t.Errorf("case %d block nonce mismatch, want %x, get %x", id+1, fakeNonce, res.Header().Nonce) + if res.Nonce() != fakeNonce { + t.Errorf("case %d block nonce mismatch, want %x, get %x", id+1, fakeNonce, res.Nonce()) } - if res.Header().MixDigest != fakeDigest { - t.Errorf("case %d block digest mismatch, want %x, get %x", id+1, fakeDigest, res.Header().MixDigest) + if res.MixDigest() != fakeDigest { + t.Errorf("case %d block digest mismatch, want %x, get %x", id+1, fakeDigest, res.MixDigest()) } - if res.Header().Difficulty.Uint64() != c.headers[c.submitIndex].Difficulty.Uint64() { - t.Errorf("case %d block difficulty mismatch, want %d, get %d", id+1, c.headers[c.submitIndex].Difficulty, res.Header().Difficulty) + if res.Difficulty().Uint64() != c.headers[c.submitIndex].Difficulty.Uint64() { + t.Errorf("case %d block difficulty mismatch, want %d, get %d", id+1, c.headers[c.submitIndex].Difficulty, res.Difficulty()) } - if res.Header().Number.Uint64() != c.headers[c.submitIndex].Number.Uint64() { - t.Errorf("case %d block number mismatch, want %d, get %d", id+1, c.headers[c.submitIndex].Number.Uint64(), res.Header().Number.Uint64()) + if res.NumberU64() != c.headers[c.submitIndex].Number.Uint64() { + t.Errorf("case %d block number mismatch, want %d, get %d", id+1, c.headers[c.submitIndex].Number.Uint64(), res.NumberU64()) } - if res.Header().ParentHash != c.headers[c.submitIndex].ParentHash { - t.Errorf("case %d block parent hash mismatch, want %s, get %s", id+1, c.headers[c.submitIndex].ParentHash.Hex(), res.Header().ParentHash.Hex()) + if res.ParentHash() != c.headers[c.submitIndex].ParentHash { + t.Errorf("case %d block parent hash mismatch, want %s, get %s", id+1, c.headers[c.submitIndex].ParentHash.Hex(), res.ParentHash().Hex()) } case <-time.NewTimer(time.Second).C: t.Errorf("case %d fetch ethash result timeout", id+1) diff --git a/consensus/misc/eip1559_test.go b/consensus/misc/eip1559_test.go index 6ea0c0086e4..392a3a7067f 100644 --- a/consensus/misc/eip1559_test.go +++ b/consensus/misc/eip1559_test.go @@ -29,23 +29,23 @@ import ( // do not use e.g. SetInt() on the numbers. For testing only func copyConfig(original *params.ChainConfig) *params.ChainConfig { return ¶ms.ChainConfig{ - ChainID: original.ChainID, - HomesteadBlock: original.HomesteadBlock, - DAOForkBlock: original.DAOForkBlock, - DAOForkSupport: original.DAOForkSupport, - EIP150Block: original.EIP150Block, - EIP150Hash: original.EIP150Hash, - EIP155Block: original.EIP155Block, - EIP158Block: original.EIP158Block, - ByzantiumBlock: original.ByzantiumBlock, - ConstantinopleBlock: original.ConstantinopleBlock, - PetersburgBlock: original.PetersburgBlock, - IstanbulBlock: original.IstanbulBlock, - MuirGlacierBlock: original.MuirGlacierBlock, - BerlinBlock: original.BerlinBlock, - LondonBlock: original.LondonBlock, - Ethash: original.Ethash, - Clique: original.Clique, + ChainID: original.ChainID, + HomesteadBlock: original.HomesteadBlock, + DAOForkBlock: original.DAOForkBlock, + DAOForkSupport: original.DAOForkSupport, + TangerineWhistleBlock: original.TangerineWhistleBlock, + TangerineWhistleHash: original.TangerineWhistleHash, + SpuriousDragonBlock: original.SpuriousDragonBlock, + ByzantiumBlock: original.ByzantiumBlock, + ConstantinopleBlock: original.ConstantinopleBlock, + PetersburgBlock: original.PetersburgBlock, + IstanbulBlock: original.IstanbulBlock, + MuirGlacierBlock: original.MuirGlacierBlock, + BerlinBlock: original.BerlinBlock, + LondonBlock: original.LondonBlock, + ArrowGlacierBlock: original.ArrowGlacierBlock, + Ethash: original.Ethash, + Clique: original.Clique, } } diff --git a/consensus/misc/forks.go b/consensus/misc/forks.go index 18052d58caa..fc629aba12a 100644 --- a/consensus/misc/forks.go +++ b/consensus/misc/forks.go @@ -33,9 +33,9 @@ func VerifyForkHashes(config *params.ChainConfig, header *types.Header, uncle bo return nil } // If the homestead reprice hash is set, validate it - if config.EIP150Block != nil && config.EIP150Block.Cmp(header.Number) == 0 { - if config.EIP150Hash != (common.Hash{}) && config.EIP150Hash != header.Hash() { - return fmt.Errorf("homestead gas reprice fork: have 0x%x, want 0x%x", header.Hash(), config.EIP150Hash) + if config.TangerineWhistleBlock != nil && config.TangerineWhistleBlock.Cmp(header.Number) == 0 { + if config.TangerineWhistleHash != (common.Hash{}) && config.TangerineWhistleHash != header.Hash() { + return fmt.Errorf("tangerine whistle gas reprice fork: have 0x%x, want 0x%x", header.Hash(), config.TangerineWhistleHash) } } // All ok, return diff --git a/consensus/parlia/abi.go b/consensus/parlia/abi.go new file mode 100644 index 00000000000..a0b49800c49 --- /dev/null +++ b/consensus/parlia/abi.go @@ -0,0 +1,676 @@ +package parlia + +const validatorSetABI = ` +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "batchTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deprecatedDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address payable", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "directTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "systemTransfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "validatorDeposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "validatorFelony", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "validatorJailed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "validatorMisdemeanor", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "validatorSetUpdated", + "type": "event" + }, + { + "inputs": [], + "name": "CHANNEL_ID", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DUSTY_INCOMING", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXTRA_FEE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "JAIL_MESSAGE_TYPE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RELAYER_REWARD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SYSTEM_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATORS_UPDATE_MESSAGE_TYPE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "alreadyInit", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "currentValidatorSet", + "outputs": [ + { + "internalType": "address", + "name": "consensusAddress", + "type": "address" + }, + { + "internalType": "address payable", + "name": "feeAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "BBCFeeAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "votingPower", + "type": "uint64" + }, + { + "internalType": "bool", + "name": "jailed", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "incoming", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "fromChainId", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initLightClientAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initSlashContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initSystemRewardAddr", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initTokenHubAddr", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initValidatorSetBytes", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "keyPrefix", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "previousDepositHeight", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sequence", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "toChainId", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalInComing", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "valAddr", + "type": "address" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "msgBytes", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "proof", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "height", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "packageSequence", + "type": "uint64" + } + ], + "name": "update", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getValidators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "getIncoming", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "misdemeanor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "felony", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] +` + +const slashABI = ` +[ + { + "anonymous": false, + "inputs": [], + "name": "indicatorCleaned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "validatorSlashed", + "type": "event" + }, + { + "inputs": [], + "name": "FELONY_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MISDEMEANOR_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SYSTEM_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VALIDATOR_CONTRACT_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "previousHeight", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "slash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "clean", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "validator", + "type": "address" + } + ], + "name": "getSlashIndicator", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ] +` diff --git a/consensus/parlia/api.go b/consensus/parlia/api.go new file mode 100644 index 00000000000..fbcec09e6e6 --- /dev/null +++ b/consensus/parlia/api.go @@ -0,0 +1,88 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package parlia + +import ( + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rpc" +) + +// API is a user facing RPC API to allow query snapshot and validators +type API struct { + chain consensus.ChainHeaderReader + parlia *Parlia +} + +// GetSnapshot retrieves the state snapshot at a given block. +func (api *API) GetSnapshot(number *rpc.BlockNumber) (*Snapshot, error) { + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = api.chain.CurrentHeader() + } else { + header = api.chain.GetHeaderByNumber(uint64(number.Int64())) + } + // Ensure we have an actually valid block and return its snapshot + if header == nil { + return nil, errUnknownBlock + } + return api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) +} + +// GetSnapshotAtHash retrieves the state snapshot at a given block. +func (api *API) GetSnapshotAtHash(hash common.Hash) (*Snapshot, error) { + header := api.chain.GetHeaderByHash(hash) + if header == nil { + return nil, errUnknownBlock + } + return api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) +} + +// GetValidators retrieves the list of validators at the specified block. +func (api *API) GetValidators(number *rpc.BlockNumber) ([]common.Address, error) { + // Retrieve the requested block number (or current if none requested) + var header *types.Header + if number == nil || *number == rpc.LatestBlockNumber { + header = api.chain.CurrentHeader() + } else { + header = api.chain.GetHeaderByNumber(uint64(number.Int64())) + } + // Ensure we have an actually valid block and return the validators from its snapshot + if header == nil { + return nil, errUnknownBlock + } + snap, err := api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + if err != nil { + return nil, err + } + return snap.validators(), nil +} + +// GetValidatorsAtHash retrieves the list of validators at the specified block. +func (api *API) GetValidatorsAtHash(hash common.Hash) ([]common.Address, error) { + header := api.chain.GetHeaderByHash(hash) + if header == nil { + return nil, errUnknownBlock + } + snap, err := api.parlia.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil, false /* verify */) + if err != nil { + return nil, err + } + return snap.validators(), nil +} diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go new file mode 100644 index 00000000000..c60e20f2ab2 --- /dev/null +++ b/consensus/parlia/parlia.go @@ -0,0 +1,1230 @@ +package parlia + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "io" + "math/big" + "os" + "sort" + "strings" + "sync" + "time" + + lru "github.com/hashicorp/golang-lru" + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/log/v3" + "golang.org/x/crypto/sha3" + "golang.org/x/exp/slices" + + "github.com/ledgerwatch/erigon/accounts/abi" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/common/math" + "github.com/ledgerwatch/erigon/common/u256" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/misc" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/forkid" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/systemcontracts" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" +) + +const ( + inMemorySnapshots = 128 // Number of recent snapshots to keep in memory + inMemorySignatures = 4096 // Number of recent block signatures to keep in memory + + checkpointInterval = 1024 // Number of blocks after which to save the snapshot to the database + defaultEpochLength = uint64(100) // Default number of blocks of checkpoint to update validatorSet from contract + + extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity + extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal + nextForkHashSize = 4 // Fixed number of extra-data suffix bytes reserved for nextForkHash. + + validatorBytesLength = common.AddressLength + wiggleTime = uint64(1) // second, Random delay (per signer) to allow concurrent signers + initialBackOffTime = uint64(1) // second + processBackOffTime = uint64(1) // second + + systemRewardPercent = 4 // it means 1/2^4 = 1/16 percentage of gas fee incoming will be distributed to system +) + +var ( + uncleHash = types.CalcUncleHash(nil) // Always Keccak256(RLP([])) as uncles are meaningless outside of PoW. + diffInTurn = big.NewInt(2) // Block difficulty for in-turn signatures + diffNoTurn = big.NewInt(1) // Block difficulty for out-of-turn signatures + // 100 native token + maxSystemBalance = new(uint256.Int).Mul(uint256.NewInt(100), uint256.NewInt(params.Ether)) + + systemContracts = map[common.Address]struct{}{ + systemcontracts.ValidatorContract: {}, + systemcontracts.SlashContract: {}, + systemcontracts.SystemRewardContract: {}, + systemcontracts.LightClientContract: {}, + systemcontracts.RelayerHubContract: {}, + systemcontracts.GovHubContract: {}, + systemcontracts.TokenHubContract: {}, + systemcontracts.RelayerIncentivizeContract: {}, + systemcontracts.CrossChainContract: {}, + } +) + +// Various error messages to mark blocks invalid. These should be private to +// prevent engine specific errors from being referenced in the remainder of the +// codebase, inherently breaking if the engine is swapped out. Please put common +// error types into the consensus package. +var ( + // errUnknownBlock is returned when the list of validators is requested for a block + // that is not part of the local blockchain. + errUnknownBlock = errors.New("unknown block") + + // errMissingVanity is returned if a block's extra-data section is shorter than + // 32 bytes, which is required to store the signer vanity. + errMissingVanity = errors.New("extra-data 32 byte vanity prefix missing") + + // errMissingSignature is returned if a block's extra-data section doesn't seem + // to contain a 65 byte secp256k1 signature. + errMissingSignature = errors.New("extra-data 65 byte signature suffix missing") + + // errExtraValidators is returned if non-sprint-end block contain validator data in + // their extra-data fields. + errExtraValidators = errors.New("non-sprint-end block contains extra validator list") + + // errInvalidSpanValidators is returned if a block contains an + // invalid list of validators (i.e. non divisible by 20 bytes). + errInvalidSpanValidators = errors.New("invalid validator list on sprint end block") + + // errInvalidMixDigest is returned if a block's mix digest is non-zero. + errInvalidMixDigest = errors.New("non-zero mix digest") + + // errInvalidUncleHash is returned if a block contains an non-empty uncle list. + errInvalidUncleHash = errors.New("non empty uncle hash") + + // errMismatchingEpochValidators is returned if a sprint block contains a + // list of validators different than the one the local node calculated. + errMismatchingEpochValidators = errors.New("mismatching validator list on epoch block") + + // errInvalidDifficulty is returned if the difficulty of a block is missing. + errInvalidDifficulty = errors.New("invalid difficulty") + + // errWrongDifficulty is returned if the difficulty of a block doesn't match the + // turn of the signer. + errWrongDifficulty = errors.New("wrong difficulty") + + // errOutOfRangeChain is returned if an authorization list is attempted to + // be modified via out-of-range or non-contiguous headers. + errOutOfRangeChain = errors.New("out of range or non-contiguous chain") + + // errBlockHashInconsistent is returned if an authorization list is attempted to + // insert an inconsistent block. + errBlockHashInconsistent = errors.New("the block hash is inconsistent") + + // errUnauthorizedValidator is returned if a header is signed by a non-authorized entity. + errUnauthorizedValidator = errors.New("unauthorized validator") + + // errCoinBaseMisMatch is returned if a header's coinbase do not match with signature + errCoinBaseMisMatch = errors.New("coinbase do not match with signature") + + // errRecentlySigned is returned if a header is signed by an authorized entity + // that already signed a header recently, thus is temporarily not allowed to. + errRecentlySigned = errors.New("recently signed") +) + +// SignFn is a signer callback function to request a header to be signed by a +// backing account. +type SignFn func(validator common.Address, payload []byte, chainId *big.Int) ([]byte, error) + +// ecrecover extracts the Ethereum account address from a signed header. +func ecrecover(header *types.Header, sigCache *lru.ARCCache, chainId *big.Int) (common.Address, error) { + // If the signature's already cached, return that + hash := header.Hash() + if address, known := sigCache.Get(hash); known { + return address.(common.Address), nil + } + // Retrieve the signature from the header extra-data + if len(header.Extra) < extraSeal { + return common.Address{}, errMissingSignature + } + signature := header.Extra[len(header.Extra)-extraSeal:] + + // Recover the public key and the Ethereum address + pubkey, err := crypto.Ecrecover(SealHash(header, chainId).Bytes(), signature) + if err != nil { + return common.Address{}, err + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + + sigCache.Add(hash, signer) + return signer, nil +} + +// SealHash returns the hash of a block prior to it being sealed. +func SealHash(header *types.Header, chainId *big.Int) (hash common.Hash) { + hasher := sha3.NewLegacyKeccak256() + encodeSigHeader(hasher, header, chainId) + hasher.Sum(hash[:0]) + return hash +} + +func encodeSigHeader(w io.Writer, header *types.Header, chainId *big.Int) { + err := rlp.Encode(w, []interface{}{ + chainId, + header.ParentHash, + header.UncleHash, + header.Coinbase, + header.Root, + header.TxHash, + header.ReceiptHash, + header.Bloom, + header.Difficulty, + header.Number, + header.GasLimit, + header.GasUsed, + header.Time, + header.Extra[:len(header.Extra)-65], // this will panic if extra is too short, should check before calling encodeSigHeader + header.MixDigest, + header.Nonce, + }) + if err != nil { + panic("can't encode: " + err.Error()) + } +} + +// parliaRLP returns the rlp bytes which needs to be signed for the parlia +// sealing. The RLP to sign consists of the entire header apart from the 65 byte signature +// contained at the end of the extra data. +// +// Note, the method requires the extra data to be at least 65 bytes, otherwise it +// panics. This is done to avoid accidentally using both forms (signature present +// or not), which could be abused to produce different hashes for the same header. +func parliaRLP(header *types.Header, chainId *big.Int) []byte { + b := new(bytes.Buffer) + encodeSigHeader(b, header, chainId) + return b.Bytes() +} + +type Parlia struct { + chainConfig *params.ChainConfig // Chain config + config *params.ParliaConfig // Consensus engine configuration parameters for parlia consensus + genesisHash common.Hash + db kv.RwDB // Database to store and retrieve snapshot checkpoints + + recentSnaps *lru.ARCCache // Snapshots for recent block to speed up + signatures *lru.ARCCache // Signatures of recent blocks to speed up mining + + signer *types.Signer + + val common.Address // Ethereum address of the signing key + signFn SignFn // Signer function to authorize hashes with + + lock sync.RWMutex // Protects the signer fields + + validatorSetABI abi.ABI + slashABI abi.ABI + + // The fields below are for testing only + fakeDiff bool // Skip difficulty verifications + forks []uint64 // Forks extracted from the chainConfig + snapshots *snapshotsync.RoSnapshots +} + +// New creates a Parlia consensus engine. +func New( + chainConfig *params.ChainConfig, + db kv.RwDB, + snapshots *snapshotsync.RoSnapshots, +) *Parlia { + // get parlia config + parliaConfig := chainConfig.Parlia + + // Set any missing consensus parameters to their defaults + if parliaConfig != nil && parliaConfig.Epoch == 0 { + parliaConfig.Epoch = defaultEpochLength + } + + // Allocate the snapshot caches and create the engine + recentSnaps, err := lru.NewARC(inMemorySnapshots) + if err != nil { + panic(err) + } + signatures, err := lru.NewARC(inMemorySignatures) + if err != nil { + panic(err) + } + vABI, err := abi.JSON(strings.NewReader(validatorSetABI)) + if err != nil { + panic(err) + } + sABI, err := abi.JSON(strings.NewReader(slashABI)) + if err != nil { + panic(err) + } + c := &Parlia{ + chainConfig: chainConfig, + config: parliaConfig, + db: db, + recentSnaps: recentSnaps, + signatures: signatures, + validatorSetABI: vABI, + slashABI: sABI, + signer: types.LatestSigner(chainConfig), + forks: forkid.GatherForks(chainConfig), + snapshots: snapshots, + } + + return c +} + +// Type returns underlying consensus engine +func (p *Parlia) Type() params.ConsensusType { + return params.ParliaConsensus +} + +// Author retrieves the Ethereum address of the account that minted the given +// block, which may be different from the header's coinbase if a consensus +// engine is based on signatures. +func (p *Parlia) Author(header *types.Header) (common.Address, error) { + return header.Coinbase, nil +} + +// VerifyHeader checks whether a header conforms to the consensus rules of a +// given engine. Verifying the seal may be done optionally here, or explicitly +// via the VerifySeal method. +func (p *Parlia) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error { + return p.verifyHeader(chain, header, nil) +} + +// VerifyHeaders is similar to VerifyHeader, but verifies a batch of headers +// concurrently. The method returns a quit channel to abort the operations and +// a results channel to retrieve the async verifications (the order is that of +// the input slice). +func (p *Parlia) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) error { + for i, header := range headers { + err := p.verifyHeader(chain, header, headers[:i]) + if err != nil { + return err + } + } + return nil +} + +// verifyHeader checks whether a header conforms to the consensus rules.The +// caller may optionally pass in a batch of parents (ascending order) to avoid +// looking those up from the database. This is useful for concurrently verifying +// a batch of new headers. +func (p *Parlia) verifyHeader(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { + if header.Number == nil { + return errUnknownBlock + } + number := header.Number.Uint64() + + // Don't waste time checking blocks from the future + if header.Time > uint64(time.Now().Unix()) { + return consensus.ErrFutureBlock + } + // Check that the extra-data contains the vanity, validators and signature. + if len(header.Extra) < extraVanity { + return errMissingVanity + } + if len(header.Extra) < extraVanity+extraSeal { + return errMissingSignature + } + // check extra data + isEpoch := number%p.config.Epoch == 0 + + // Ensure that the extra-data contains a signer list on checkpoint, but none otherwise + signersBytes := len(header.Extra) - extraVanity - extraSeal + if !isEpoch && signersBytes != 0 { + return errExtraValidators + } + + if isEpoch && signersBytes%validatorBytesLength != 0 { + return errInvalidSpanValidators + } + + // Ensure that the mix digest is zero as we don't have fork protection currently + if header.MixDigest != (common.Hash{}) { + return errInvalidMixDigest + } + // Ensure that the block doesn't contain any uncles which are meaningless in PoA + if header.UncleHash != uncleHash { + return errInvalidUncleHash + } + // Ensure that the block's difficulty is meaningful (may not be correct at this point) + if number > 0 { + if header.Difficulty == nil { + return errInvalidDifficulty + } + } + // If all checks passed, validate any special fields for hard forks + if err := misc.VerifyForkHashes(chain.Config(), header, false); err != nil { + return err + } + // All basic checks passed, verify cascading fields + return p.verifyCascadingFields(chain, header, parents) +} + +// verifyCascadingFields verifies all the header fields that are not standalone, +// rather depend on a batch of previous headers. The caller may optionally pass +// in a batch of parents (ascending order) to avoid looking those up from the +// database. This is useful for concurrently verifying a batch of new headers. +func (p *Parlia) verifyCascadingFields(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { + // The genesis block is the always valid dead-end + number := header.Number.Uint64() + if number == 0 { + return nil + } + + var parent *types.Header + if len(parents) > 0 { + parent = parents[len(parents)-1] + } else { + parent = chain.GetHeader(header.ParentHash, number-1) + } + + if parent == nil || parent.Number.Uint64() != number-1 || parent.Hash() != header.ParentHash { + return consensus.ErrUnknownAncestor + } + + snap, err := p.snapshot(chain, number-1, header.ParentHash, parents, true /* verify */) + if err != nil { + return err + } + + err = p.blockTimeVerifyForRamanujanFork(snap, header, parent) + if err != nil { + return err + } + + // Verify that the gas limit is <= 2^63-1 + capacity := uint64(0x7fffffffffffffff) + if header.GasLimit > capacity { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, capacity) + } + // Verify that the gasUsed is <= gasLimit + if header.GasUsed > header.GasLimit { + return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit) + } + + // Verify that the gas limit remains within allowed bounds + diff := int64(parent.GasLimit) - int64(header.GasLimit) + if diff < 0 { + diff *= -1 + } + limit := parent.GasLimit / params.GasLimitBoundDivisor + + if uint64(diff) >= limit || header.GasLimit < params.MinGasLimit { + return fmt.Errorf("invalid gas limit: have %d, want %d += %d", header.GasLimit, parent.GasLimit, limit) + } + + // All basic checks passed, verify the seal and return + return p.verifySeal(chain, header, parents) +} + +// verifySeal checks whether the signature contained in the header satisfies the +// consensus protocol requirements. The method accepts an optional list of parent +// headers that aren't yet part of the local blockchain to generate the snapshots +// from. +func (p *Parlia) verifySeal(chain consensus.ChainHeaderReader, header *types.Header, parents []*types.Header) error { + // Verifying the genesis block is not supported + number := header.Number.Uint64() + if number == 0 { + return errUnknownBlock + } + // Retrieve the snapshot needed to verify this header and cache it + snap, err := p.snapshot(chain, number-1, header.ParentHash, parents, true /* verify */) + if err != nil { + return err + } + + // Resolve the authorization key and check against validators + signer, err := ecrecover(header, p.signatures, p.chainConfig.ChainID) + if err != nil { + return err + } + + if signer != header.Coinbase { + return errCoinBaseMisMatch + } + + if _, ok := snap.Validators[signer]; !ok { + return errUnauthorizedValidator + } + + for seen, recent := range snap.Recents { + if recent == signer { + // Signer is among recents, only fail if the current block doesn't shift it out + if limit := uint64(len(snap.Validators)/2 + 1); seen > number-limit { + return errRecentlySigned + } + } + } + + // Ensure that the difficulty corresponds to the turn-ness of the signer + if !p.fakeDiff { + inturn := snap.inturn(signer) + if inturn && header.Difficulty.Cmp(diffInTurn) != 0 { + return errWrongDifficulty + } + if !inturn && header.Difficulty.Cmp(diffNoTurn) != 0 { + return errWrongDifficulty + } + } + + return nil +} + +// snapshot retrieves the authorization snapshot at a given point in time. +func (p *Parlia) snapshot(chain consensus.ChainHeaderReader, number uint64, hash common.Hash, parents []*types.Header, verify bool) (*Snapshot, error) { + // Search for a snapshot in memory or on disk for checkpoints + var ( + headers []*types.Header + snap *Snapshot + ) + + for snap == nil { + // If an in-memory snapshot was found, use that + if s, ok := p.recentSnaps.Get(hash); ok { + snap = s.(*Snapshot) + break + } + + // If an on-disk checkpoint snapshot can be found, use that + if number%checkpointInterval == 0 { + if s, err := loadSnapshot(p.config, p.signatures, p.db, number, hash); err == nil { + //log.Trace("Loaded snapshot from disk", "number", number, "hash", hash) + snap = s + if !verify || snap != nil { + break + } + } + } + if (verify && number%p.config.Epoch == 0) || number == 0 { + if (p.snapshots != nil && number <= p.snapshots.BlocksAvailable()) || number == 0 { + // Headers included into the snapshots have to be trusted as checkpoints + checkpoint := chain.GetHeader(hash, number) + if checkpoint != nil { + validatorBytes := checkpoint.Extra[extraVanity : len(checkpoint.Extra)-extraSeal] + // get validators from headers + validators, err := ParseValidators(validatorBytes) + if err != nil { + return nil, err + } + // new snapshot + snap = newSnapshot(p.config, p.signatures, number, hash, validators) + break + } + } + } + + // No snapshot for this header, gather the header and move backward + var header *types.Header + if len(parents) > 0 { + // If we have explicit parents, pick from there (enforced) + header = parents[len(parents)-1] + if header.Hash() != hash || header.Number.Uint64() != number { + return nil, consensus.ErrUnknownAncestor + } + parents = parents[:len(parents)-1] + } else { + // No explicit parents (or no more left), reach out to the database + header = chain.GetHeader(hash, number) + if header == nil { + return nil, consensus.ErrUnknownAncestor + } + } + headers = append(headers, header) + number, hash = number-1, header.ParentHash + } + + // check if snapshot is nil + if snap == nil { + return nil, fmt.Errorf("unknown error while retrieving snapshot at block number %v", number) + } + + // Previous snapshot found, apply any pending headers on top of it + for i := 0; i < len(headers)/2; i++ { + headers[i], headers[len(headers)-1-i] = headers[len(headers)-1-i], headers[i] + } + snap, err := snap.apply(headers, chain, parents, p.chainConfig.ChainID) + if err != nil { + return nil, err + } + p.recentSnaps.Add(snap.Hash, snap) + + // If we've generated a new checkpoint snapshot, save to disk + if snap.Number%checkpointInterval == 0 && len(headers) > 0 { + if err = snap.store(p.db); err != nil { + return nil, err + } + //log.Trace("Stored snapshot to disk", "number", snap.Number, "hash", snap.Hash) + } + return snap, err +} + +// VerifyUncles verifies that the given block's uncles conform to the consensus +// rules of a given engine. +func (p *Parlia) VerifyUncles(chain consensus.ChainReader, header *types.Header, uncles []*types.Header) error { + if len(uncles) > 0 { + return errors.New("uncles not allowed") + } + return nil +} + +// Prepare initializes the consensus fields of a block header according to the +// rules of a particular engine. The changes are executed inline. +func (p *Parlia) Prepare(chain consensus.ChainHeaderReader, header *types.Header, ibs *state.IntraBlockState) error { + header.Coinbase = p.val + header.Nonce = types.BlockNonce{} + + number := header.Number.Uint64() + snap, err := p.snapshot(chain, number-1, header.ParentHash, nil, false /* verify */) + if err != nil { + return err + } + + // Set the correct difficulty + header.Difficulty = CalcDifficulty(snap, p.val) + + // Ensure the extra data has all it's components + if len(header.Extra) < extraVanity-nextForkHashSize { + header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-nextForkHashSize-len(header.Extra))...) + } + header.Extra = header.Extra[:extraVanity-nextForkHashSize] + nextForkHash := forkid.NextForkHashFromForks(p.forks, p.genesisHash, number) + header.Extra = append(header.Extra, nextForkHash[:]...) + + parent := chain.GetHeader(header.ParentHash, number-1) + if parent == nil { + return consensus.ErrUnknownAncestor + } + + if number%p.config.Epoch == 0 { + newValidators, err := p.getCurrentValidators(parent, ibs) + if err != nil { + return err + } + // sort validator by address + sort.Sort(validatorsAscending(newValidators)) + for _, validator := range newValidators { + header.Extra = append(header.Extra, validator.Bytes()...) + } + } + + // add extra seal space + header.Extra = append(header.Extra, make([]byte, extraSeal)...) + + // Mix digest is reserved for now, set to empty + header.MixDigest = common.Hash{} + + // Ensure the timestamp has the correct delay + header.Time = p.blockTimeForRamanujanFork(snap, header, parent) + if header.Time < uint64(time.Now().Unix()) { + header.Time = uint64(time.Now().Unix()) + } + return nil +} + +// Initialize runs any pre-transaction state modifications (e.g. epoch start) +func (p *Parlia) Initialize(config *params.ChainConfig, chain consensus.ChainHeaderReader, e consensus.EpochReader, header *types.Header, txs []types.Transaction, uncles []*types.Header, syscall consensus.SystemCall) { +} + +func (p *Parlia) splitTxs(txs types.Transactions, header *types.Header) (userTxs types.Transactions, systemTxs types.Transactions, err error) { + for _, tx := range txs { + isSystemTx, err2 := p.IsSystemTransaction(tx, header) + if err2 != nil { + err = err2 + return + } + if isSystemTx { + systemTxs = append(systemTxs, tx) + } else { + userTxs = append(userTxs, tx) + } + } + if userTxs == nil { + userTxs = types.Transactions{} + } + if systemTxs == nil { + systemTxs = types.Transactions{} + } + return +} + +// Finalize runs any post-transaction state modifications (e.g. block rewards) +// but does not assemble the block. +// +// Note: The block header and state database might be updated to reflect any +// consensus rules that happen at finalization (e.g. block rewards). +func (p *Parlia) Finalize(_ *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, _ []*types.Header, receipts types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, +) (types.Transactions, types.Receipts, error) { + return p.finalize(header, state, txs, receipts, chain, false) +} + +func (p *Parlia) finalize(header *types.Header, state *state.IntraBlockState, txs types.Transactions, + receipts types.Receipts, chain consensus.ChainHeaderReader, mining bool, +) (types.Transactions, types.Receipts, error) { + userTxs, systemTxs, err := p.splitTxs(txs, header) + if err != nil { + return nil, nil, err + } + txs = userTxs + // warn if not in majority fork + number := header.Number.Uint64() + snap, err := p.snapshot(chain, number-1, header.ParentHash, nil, false /* verify */) + if err != nil { + return nil, nil, err + } + /* + nextForkHash := forkid.NextForkHashFromForks(p.forks, p.genesisHash, number) + nextForkHashStr := hex.EncodeToString(nextForkHash[:]) + if !snap.isMajorityFork(nextForkHashStr) { + log.Debug("[parlia] there is a possible fork, and your client is not the majority. Please check...", "nextForkHash", nextForkHashStr) + } + */ + // If the block is an epoch end block, verify the validator list + // The verification can only be done when the state is ready, it can't be done in VerifyHeader. + if number%p.config.Epoch == 0 { + parentHeader := chain.GetHeader(header.ParentHash, number-1) + newValidators, err := p.getCurrentValidators(parentHeader, state) + if err != nil { + return nil, nil, err + } + // sort validator by address + sort.Sort(validatorsAscending(newValidators)) + validatorsBytes := make([]byte, len(newValidators)*validatorBytesLength) + for i, validator := range newValidators { + copy(validatorsBytes[i*validatorBytesLength:], validator.Bytes()) + } + + extraSuffix := len(header.Extra) - extraSeal + if !bytes.Equal(header.Extra[extraVanity:extraSuffix], validatorsBytes) { + return nil, nil, errMismatchingEpochValidators + } + } + // No block rewards in PoA, so the state remains as is and uncles are dropped + if number == 1 { + var err error + if txs, systemTxs, receipts, err = p.initContract(state, header, txs, receipts, systemTxs, &header.GasUsed, mining); err != nil { + log.Error("[parlia] init contract failed: %+v", err) + os.Exit(1) + } + } + if header.Difficulty.Cmp(diffInTurn) != 0 { + spoiledVal := snap.supposeValidator() + signedRecently := false + for _, recent := range snap.Recents { + if recent == spoiledVal { + signedRecently = true + break + } + } + if !signedRecently { + //log.Trace("slash validator", "block hash", header.Hash(), "address", spoiledVal) + var tx types.Transaction + var receipt *types.Receipt + if systemTxs, tx, receipt, err = p.slash(spoiledVal, state, header, len(txs), systemTxs, &header.GasUsed, mining); err != nil { + // it is possible that slash validator failed because of the slash channel is disabled. + log.Error("slash validator failed", "block hash", header.Hash(), "address", spoiledVal) + } else { + txs = append(txs, tx) + receipts = append(receipts, receipt) + } + } + } + if txs, systemTxs, receipts, err = p.distributeIncoming(header.Coinbase, state, header, txs, receipts, systemTxs, &header.GasUsed, mining); err != nil { + return nil, nil, err + } + if len(systemTxs) > 0 { + return nil, nil, fmt.Errorf("the length of systemTxs is still %d", len(systemTxs)) + } + // Re-order receipts so that are in right order + slices.SortFunc(receipts, func(a, b *types.Receipt) bool { return a.TransactionIndex < b.TransactionIndex }) + return txs, receipts, nil +} + +// FinalizeAndAssemble runs any post-transaction state modifications (e.g. block +// rewards) and assembles the final block. +// +// Note: The block header and state database might be updated to reflect any +// consensus rules that happen at finalization (e.g. block rewards). +func (p *Parlia) FinalizeAndAssemble(_ *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, _ []*types.Header, receipts types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call, +) (*types.Block, types.Transactions, types.Receipts, error) { + outTxs, outReceipts, err := p.finalize(header, state, txs, receipts, chain, true) + if err != nil { + return nil, nil, nil, err + } + return types.NewBlock(header, outTxs, nil, outReceipts), outTxs, outReceipts, nil +} + +// Authorize injects a private key into the consensus engine to mint new blocks +// with. +func (p *Parlia) Authorize(val common.Address, signFn SignFn) { + p.lock.Lock() + defer p.lock.Unlock() + + p.val = val + p.signFn = signFn +} + +// Seal generates a new sealing request for the given input block and pushes +// the result into the given channel. +// +// Note, the method returns immediately and will send the result async. More +// than one result may also be returned depending on the consensus algorithm. +func (p *Parlia) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + header := block.Header() + + // Sealing the genesis block is not supported + number := header.Number.Uint64() + if number == 0 { + return errUnknownBlock + } + // For 0-period chains, refuse to seal empty blocks (no reward but would spin sealing) + if p.config.Period == 0 && len(block.Transactions()) == 0 { + log.Info("[parlia] Sealing paused, waiting for transactions") + return nil + } + // Don't hold the val fields for the entire sealing procedure + p.lock.RLock() + val, signFn := p.val, p.signFn + p.lock.RUnlock() + + snap, err := p.snapshot(chain, number-1, header.ParentHash, nil, false /* verify */) + if err != nil { + return err + } + + // Bail out if we're unauthorized to sign a block + if _, authorized := snap.Validators[val]; !authorized { + return errUnauthorizedValidator + } + + // If we're amongst the recent signers, wait for the next block + for seen, recent := range snap.Recents { + if recent == val { + // Signer is among recent, only wait if the current block doesn't shift it out + if limit := uint64(len(snap.Validators)/2 + 1); number < limit || seen > number-limit { + log.Info("[parlia] Signed recently, must wait for others") + return nil + } + } + } + + // Sweet, the protocol permits us to sign the block, wait for our time + delay := p.delayForRamanujanFork(snap, header) + + log.Info("Sealing block with", "number", number, "delay", delay, "headerDifficulty", header.Difficulty, "val", val.Hex()) + + // Sign all the things! + sig, err := signFn(val, crypto.Keccak256(parliaRLP(header, p.chainConfig.ChainID)), p.chainConfig.ChainID) + if err != nil { + return err + } + copy(header.Extra[len(header.Extra)-extraSeal:], sig) + + // Wait until sealing is terminated or delay timeout. + //log.Trace("Waiting for slot to sign and propagate", "delay", common.PrettyDuration(delay)) + go func() { + select { + case <-stop: + return + case <-time.After(delay): + } + if p.shouldWaitForCurrentBlockProcess(chain, header, snap) { + log.Info("[parlia] Waiting for received in turn block to process") + select { + case <-stop: + log.Info("[parlia] Received block process finished, abort block seal") + return + case <-time.After(time.Duration(processBackOffTime) * time.Second): + log.Info("[parlia] Process backoff time exhausted, start to seal block") + } + } + + select { + case results <- block.WithSeal(header): + default: + log.Warn("[parlia] Sealing result is not read by miner", "sealhash", SealHash(header, p.chainConfig.ChainID)) + } + }() + + return nil +} + +// SealHash returns the hash of a block prior to it being sealed. +func (p *Parlia) SealHash(header *types.Header) common.Hash { + return SealHash(header, p.chainConfig.ChainID) +} + +// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty +// that a new block should have. +func (p *Parlia) CalcDifficulty(chain consensus.ChainHeaderReader, time, parentTime uint64, parentDifficulty *big.Int, parentNumber uint64, parentHash, parentUncleHash common.Hash, parentSeal []rlp.RawValue) *big.Int { + snap, err := p.snapshot(chain, parentNumber, parentHash, nil, false /* verify */) + if err != nil { + return nil + } + return CalcDifficulty(snap, p.val) +} + +// CalcDifficulty is the difficulty adjustment algorithm. It returns the difficulty +// that a new block should have based on the previous blocks in the chain and the +// current signer. +func CalcDifficulty(snap *Snapshot, signer common.Address) *big.Int { + if snap.inturn(signer) { + return new(big.Int).Set(diffInTurn) + } + return new(big.Int).Set(diffNoTurn) +} + +func (p *Parlia) GenerateSeal(chain consensus.ChainHeaderReader, current, parent *types.Header, call consensus.Call) []rlp.RawValue { + return nil +} + +// APIs returns the RPC APIs this consensus engine provides. +func (p *Parlia) APIs(chain consensus.ChainHeaderReader) []rpc.API { + return []rpc.API{{ + Namespace: "parlia", + Version: "1.0", + Service: &API{chain: chain, parlia: p}, + Public: false, + }} +} + +func (p *Parlia) IsSystemTransaction(tx types.Transaction, header *types.Header) (bool, error) { + // deploy a contract + if tx.GetTo() == nil { + return false, nil + } + sender, err := tx.Sender(*p.signer) + if err != nil { + return false, errors.New("UnAuthorized transaction") + } + if sender == header.Coinbase && isToSystemContract(*tx.GetTo()) && tx.GetPrice().IsZero() { + return true, nil + } + return false, nil +} + +func isToSystemContract(to common.Address) bool { + _, ok := systemContracts[to] + return ok +} + +func (p *Parlia) IsSystemContract(to *common.Address) bool { + if to == nil { + return false + } + return isToSystemContract(*to) +} + +func (p *Parlia) shouldWaitForCurrentBlockProcess(chain consensus.ChainHeaderReader, header *types.Header, snap *Snapshot) bool { + if header.Difficulty.Cmp(diffInTurn) == 0 { + return false + } + + highestVerifiedHeader := chain.CurrentHeader() + if highestVerifiedHeader == nil { + return false + } + + if header.ParentHash == highestVerifiedHeader.ParentHash { + return true + } + return false +} + +func (p *Parlia) EnoughDistance(chain consensus.ChainReader, header *types.Header) bool { + snap, err := p.snapshot(chain, header.Number.Uint64()-1, header.ParentHash, nil, false /* verify */) + if err != nil { + return true + } + return snap.enoughDistance(p.val, header) +} + +func (p *Parlia) IsLocalBlock(header *types.Header) bool { + return p.val == header.Coinbase +} + +func (p *Parlia) AllowLightProcess(chain consensus.ChainReader, currentHeader *types.Header) bool { + snap, err := p.snapshot(chain, currentHeader.Number.Uint64()-1, currentHeader.ParentHash, nil, false /* verify */) + if err != nil { + return true + } + + idx := snap.indexOfVal(p.val) + // validator is not allowed to diff sync + return idx < 0 +} + +// Close terminates any background threads maintained by the consensus engine. +func (p *Parlia) Close() error { + return nil +} + +// ========================== interaction with contract/account ========= + +// getCurrentValidators get current validators +func (p *Parlia) getCurrentValidators(header *types.Header, ibs *state.IntraBlockState) ([]common.Address, error) { + // method + method := "getValidators" + data, err := p.validatorSetABI.Pack(method) + if err != nil { + log.Error("Unable to pack tx for getValidators", "err", err) + return nil, err + } + // call + msgData := hexutil.Bytes(data) + _, returnData, err := p.systemCall(header.Coinbase, systemcontracts.ValidatorContract, msgData[:], ibs, header, u256.Num0) + if err != nil { + return nil, err + } + var ret0 = new([]common.Address) + out := ret0 + if err := p.validatorSetABI.UnpackIntoInterface(out, method, returnData); err != nil { + return nil, err + } + valz := make([]common.Address, len(*ret0)) + copy(valz, *ret0) + //for i, a := range *ret0 { + // valz[i] = a + //} + return valz, nil +} + +// slash spoiled validators +func (p *Parlia) distributeIncoming(val common.Address, state *state.IntraBlockState, header *types.Header, + txs types.Transactions, receipts types.Receipts, systemTxs types.Transactions, + usedGas *uint64, mining bool, +) (types.Transactions, types.Transactions, types.Receipts, error) { + coinbase := header.Coinbase + balance := state.GetBalance(consensus.SystemAddress).Clone() + if balance.Cmp(u256.Num0) <= 0 { + return txs, systemTxs, receipts, nil + } + state.SetBalance(consensus.SystemAddress, u256.Num0) + state.AddBalance(coinbase, balance) + + doDistributeSysReward := state.GetBalance(systemcontracts.SystemRewardContract).Cmp(maxSystemBalance) < 0 + if doDistributeSysReward { + var rewards = new(uint256.Int) + rewards = rewards.Rsh(balance, systemRewardPercent) + if rewards.Cmp(u256.Num0) > 0 { + var err error + var tx types.Transaction + var receipt *types.Receipt + if systemTxs, tx, receipt, err = p.distributeToSystem(rewards, state, header, len(txs), systemTxs, usedGas, mining); err != nil { + return nil, nil, nil, err + } + txs = append(txs, tx) + receipts = append(receipts, receipt) + //log.Debug("[parlia] distribute to system reward pool", "block hash", header.Hash(), "amount", rewards) + balance = balance.Sub(balance, rewards) + } + } + //log.Debug("[parlia] distribute to validator contract", "block hash", header.Hash(), "amount", balance) + var err error + var tx types.Transaction + var receipt *types.Receipt + if systemTxs, tx, receipt, err = p.distributeToValidator(balance, val, state, header, len(txs), systemTxs, usedGas, mining); err != nil { + return nil, nil, nil, err + } + txs = append(txs, tx) + receipts = append(receipts, receipt) + return txs, systemTxs, receipts, nil +} + +// slash spoiled validators +func (p *Parlia) slash(spoiledVal common.Address, state *state.IntraBlockState, header *types.Header, + txIndex int, systemTxs types.Transactions, usedGas *uint64, mining bool, +) (types.Transactions, types.Transaction, *types.Receipt, error) { + // method + method := "slash" + + // get packed data + data, err := p.slashABI.Pack(method, + spoiledVal, + ) + if err != nil { + log.Error("[parlia] Unable to pack tx for slash", "err", err) + return nil, nil, nil, err + } + // apply message + return p.applyTransaction(header.Coinbase, systemcontracts.SlashContract, u256.Num0, data, state, header, txIndex, systemTxs, usedGas, mining) +} + +// init contract +func (p *Parlia) initContract(state *state.IntraBlockState, header *types.Header, + txs types.Transactions, receipts types.Receipts, systemTxs types.Transactions, + usedGas *uint64, mining bool, +) (types.Transactions, types.Transactions, types.Receipts, error) { + // method + method := "init" + // contracts + contracts := []common.Address{ + systemcontracts.ValidatorContract, + systemcontracts.SlashContract, + systemcontracts.LightClientContract, + systemcontracts.RelayerHubContract, + systemcontracts.TokenHubContract, + systemcontracts.RelayerIncentivizeContract, + systemcontracts.CrossChainContract, + } + // get packed data + data, err := p.validatorSetABI.Pack(method) + if err != nil { + log.Error("[parlia] Unable to pack tx for init validator set", "err", err) + return nil, nil, nil, err + } + for _, c := range contracts { + log.Info("[parlia] init contract", "block hash", header.Hash(), "contract", c) + var tx types.Transaction + var receipt *types.Receipt + if systemTxs, tx, receipt, err = p.applyTransaction(header.Coinbase, c, u256.Num0, data, state, header, len(txs), systemTxs, usedGas, mining); err != nil { + return nil, nil, nil, err + } + txs = append(txs, tx) + receipts = append(receipts, receipt) + } + return txs, systemTxs, receipts, nil +} + +func (p *Parlia) distributeToSystem(amount *uint256.Int, state *state.IntraBlockState, header *types.Header, + txIndex int, systemTxs types.Transactions, + usedGas *uint64, mining bool, +) (types.Transactions, types.Transaction, *types.Receipt, error) { + return p.applyTransaction(header.Coinbase, systemcontracts.SystemRewardContract, amount, nil, state, header, + txIndex, systemTxs, usedGas, mining) +} + +// slash spoiled validators +func (p *Parlia) distributeToValidator(amount *uint256.Int, validator common.Address, state *state.IntraBlockState, header *types.Header, + txIndex int, systemTxs types.Transactions, + usedGas *uint64, mining bool, +) (types.Transactions, types.Transaction, *types.Receipt, error) { + // method + method := "deposit" + + // get packed data + data, err := p.validatorSetABI.Pack(method, + validator, + ) + if err != nil { + log.Error("[parlia] Unable to pack tx for deposit", "err", err) + return nil, nil, nil, err + } + // apply message + return p.applyTransaction(header.Coinbase, systemcontracts.ValidatorContract, amount, data, state, header, txIndex, systemTxs, usedGas, mining) +} + +func (p *Parlia) applyTransaction(from common.Address, to common.Address, value *uint256.Int, data []byte, ibs *state.IntraBlockState, header *types.Header, + txIndex int, systemTxs types.Transactions, usedGas *uint64, mining bool, +) (types.Transactions, types.Transaction, *types.Receipt, error) { + nonce := ibs.GetNonce(from) + expectedTx := types.Transaction(types.NewTransaction(nonce, to, value, math.MaxUint64/2, u256.Num0, data)) + expectedHash := expectedTx.SigningHash(p.chainConfig.ChainID) + if from == p.val && mining { + signature, err := p.signFn(from, expectedTx.SigningHash(p.chainConfig.ChainID).Bytes(), p.chainConfig.ChainID) + if err != nil { + return nil, nil, nil, err + } + signer := types.LatestSignerForChainID(p.chainConfig.ChainID) + expectedTx, err = expectedTx.WithSignature(*signer, signature) + if err != nil { + return nil, nil, nil, err + } + } else { + if len(systemTxs) == 0 || systemTxs[0] == nil { + return nil, nil, nil, fmt.Errorf("supposed to get a actual transaction, but get none") + } + actualTx := systemTxs[0] + actualHash := actualTx.SigningHash(p.chainConfig.ChainID) + if !bytes.Equal(actualHash.Bytes(), expectedHash.Bytes()) { + return nil, nil, nil, fmt.Errorf("expected system tx (hash %v, nonce %d, to %s, value %s, gas %d, gasPrice %s, data %s), actual tx (hash %v, nonce %d, to %s, value %s, gas %d, gasPrice %s, data %s)", + expectedHash.String(), + expectedTx.GetNonce(), + expectedTx.GetTo().String(), + expectedTx.GetValue().String(), + expectedTx.GetGas(), + expectedTx.GetPrice().String(), + hex.EncodeToString(expectedTx.GetData()), + actualHash.String(), + actualTx.GetNonce(), + actualTx.GetTo().String(), + actualTx.GetValue().String(), + actualTx.GetGas(), + actualTx.GetPrice().String(), + hex.EncodeToString(actualTx.GetData()), + ) + } + expectedTx = actualTx + // move to next + systemTxs = systemTxs[1:] + } + ibs.Prepare(expectedTx.Hash(), common.Hash{}, txIndex) + gasUsed, _, err := p.systemCall(from, to, data, ibs, header, value) + if err != nil { + return nil, nil, nil, err + } + *usedGas += gasUsed + receipt := types.NewReceipt(false, *usedGas) + receipt.TxHash = expectedTx.Hash() + receipt.GasUsed = gasUsed + if err := ibs.FinalizeTx(p.chainConfig.Rules(header.Number.Uint64()), state.NewNoopWriter()); err != nil { + return nil, nil, nil, err + } + // Set the receipt logs and create a bloom for filtering + receipt.Logs = ibs.GetLogs(expectedTx.Hash()) + receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) + receipt.BlockHash = header.Hash() + receipt.BlockNumber = header.Number + receipt.TransactionIndex = uint(txIndex) + ibs.SetNonce(from, nonce+1) + return systemTxs, expectedTx, receipt, nil +} + +func (p *Parlia) systemCall(from, contract common.Address, data []byte, ibs *state.IntraBlockState, header *types.Header, value *uint256.Int) (gasUsed uint64, returnData []byte, err error) { + chainConfig := p.chainConfig + if chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(header.Number) == 0 { + misc.ApplyDAOHardFork(ibs) + } + msg := types.NewMessage( + from, + &contract, + 0, value, + math.MaxUint64/2, u256.Num0, + nil, nil, + data, nil, false, + ) + vmConfig := vm.Config{NoReceipts: true} + // Create a new context to be used in the EVM environment + blockContext := core.NewEVMBlockContext(header, nil, p, &from, nil) + evm := vm.NewEVM(blockContext, core.NewEVMTxContext(msg), ibs, chainConfig, vmConfig) + ret, leftOverGas, err := evm.Call( + vm.AccountRef(msg.From()), + *msg.To(), + msg.Data(), + msg.Gas(), + msg.Value(), + false, + ) + if err != nil { + return 0, nil, err + } + return msg.Gas() - leftOverGas, ret, nil +} diff --git a/consensus/parlia/ramanujanfork.go b/consensus/parlia/ramanujanfork.go new file mode 100644 index 00000000000..e908c8f5f0e --- /dev/null +++ b/consensus/parlia/ramanujanfork.go @@ -0,0 +1,44 @@ +package parlia + +import ( + "math/rand" + "time" + + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/types" +) + +const ( + wiggleTimeBeforeFork = 500 * time.Millisecond // Random delay (per signer) to allow concurrent signers + fixedBackOffTimeBeforeFork = 200 * time.Millisecond +) + +func (p *Parlia) delayForRamanujanFork(snap *Snapshot, header *types.Header) time.Duration { + delay := time.Until(time.Unix(int64(header.Time), 0)) // nolint: gosimple + if p.chainConfig.IsRamanujan(header.Number.Uint64()) { + return delay + } + if header.Difficulty.Cmp(diffNoTurn) == 0 { + // It's not our turn explicitly to sign, delay it a bit + wiggle := time.Duration(len(snap.Validators)/2+1) * wiggleTimeBeforeFork + delay += fixedBackOffTimeBeforeFork + time.Duration(rand.Int63n(int64(wiggle))) + } + return delay +} + +func (p *Parlia) blockTimeForRamanujanFork(snap *Snapshot, header, parent *types.Header) uint64 { + blockTime := parent.Time + p.config.Period + if p.chainConfig.IsRamanujan(header.Number.Uint64()) { + blockTime = blockTime + backOffTime(snap, p.val) + } + return blockTime +} + +func (p *Parlia) blockTimeVerifyForRamanujanFork(snap *Snapshot, header, parent *types.Header) error { + if p.chainConfig.IsRamanujan(header.Number.Uint64()) { + if header.Time < parent.Time+p.config.Period+backOffTime(snap, header.Coinbase) { + return consensus.ErrFutureBlock + } + } + return nil +} diff --git a/consensus/parlia/snapshot.go b/consensus/parlia/snapshot.go new file mode 100644 index 00000000000..2d9198d1dbb --- /dev/null +++ b/consensus/parlia/snapshot.go @@ -0,0 +1,341 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package parlia + +import ( + "bytes" + "context" + "encoding/binary" + "encoding/hex" + "encoding/json" + "errors" + "math/big" + "sort" + + "github.com/ledgerwatch/erigon-lib/kv" + + lru "github.com/hashicorp/golang-lru" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/params" +) + +// Snapshot is the state of the validatorSet at a given point. +type Snapshot struct { + config *params.ParliaConfig // Consensus engine parameters to fine tune behavior + sigCache *lru.ARCCache // Cache of recent block signatures to speed up ecrecover + + Number uint64 `json:"number"` // Block number where the snapshot was created + Hash common.Hash `json:"hash"` // Block hash where the snapshot was created + Validators map[common.Address]struct{} `json:"validators"` // Set of authorized validators at this moment + Recents map[uint64]common.Address `json:"recents"` // Set of recent validators for spam protections + RecentForkHashes map[uint64]string `json:"recent_fork_hashes"` // Set of recent forkHash +} + +// newSnapshot creates a new snapshot with the specified startup parameters. This +// method does not initialize the set of recent validators, so only ever use it for +// the genesis block. +func newSnapshot( + config *params.ParliaConfig, + sigCache *lru.ARCCache, + number uint64, + hash common.Hash, + validators []common.Address, +) *Snapshot { + snap := &Snapshot{ + config: config, + sigCache: sigCache, + Number: number, + Hash: hash, + Recents: make(map[uint64]common.Address), + RecentForkHashes: make(map[uint64]string), + Validators: make(map[common.Address]struct{}), + } + for _, v := range validators { + snap.Validators[v] = struct{}{} + } + return snap +} + +// validatorsAscending implements the sort interface to allow sorting a list of addresses +type validatorsAscending []common.Address + +func (s validatorsAscending) Len() int { return len(s) } +func (s validatorsAscending) Less(i, j int) bool { return bytes.Compare(s[i][:], s[j][:]) < 0 } +func (s validatorsAscending) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +const NumberLength = 8 + +// EncodeBlockNumber encodes a block number as big endian uint64 +func EncodeBlockNumber(number uint64) []byte { + enc := make([]byte, NumberLength) + binary.BigEndian.PutUint64(enc, number) + return enc +} + +// SnapshotFullKey = SnapshotBucket + num (uint64 big endian) + hash +func SnapshotFullKey(number uint64, hash common.Hash) []byte { + return append(EncodeBlockNumber(number), hash.Bytes()...) +} + +// loadSnapshot loads an existing snapshot from the database. +func loadSnapshot(config *params.ParliaConfig, sigCache *lru.ARCCache, db kv.RwDB, num uint64, hash common.Hash) (*Snapshot, error) { + tx, err := db.BeginRo(context.Background()) + if err != nil { + return nil, err + } + defer tx.Rollback() + blob, err := tx.GetOne(kv.ParliaSnapshot, SnapshotFullKey(num, hash)) + if err != nil { + return nil, err + } + snap := new(Snapshot) + if err := json.Unmarshal(blob, snap); err != nil { + return nil, err + } + snap.config = config + snap.sigCache = sigCache + return snap, nil +} + +// store inserts the snapshot into the database. +func (s *Snapshot) store(db kv.RwDB) error { + blob, err := json.Marshal(s) + if err != nil { + return err + } + return db.Update(context.Background(), func(tx kv.RwTx) error { + return tx.Put(kv.ParliaSnapshot, SnapshotFullKey(s.Number, s.Hash), blob) + }) +} + +// copy creates a deep copy of the snapshot +func (s *Snapshot) copy() *Snapshot { + cpy := &Snapshot{ + config: s.config, + sigCache: s.sigCache, + Number: s.Number, + Hash: s.Hash, + Validators: make(map[common.Address]struct{}), + Recents: make(map[uint64]common.Address), + RecentForkHashes: make(map[uint64]string), + } + + for v := range s.Validators { + cpy.Validators[v] = struct{}{} + } + for block, v := range s.Recents { + cpy.Recents[block] = v + } + for block, id := range s.RecentForkHashes { + cpy.RecentForkHashes[block] = id + } + return cpy +} + +//nolint +func (s *Snapshot) isMajorityFork(forkHash string) bool { + ally := 0 + for _, h := range s.RecentForkHashes { + if h == forkHash { + ally++ + } + } + return ally > len(s.RecentForkHashes)/2 +} + +func (s *Snapshot) apply(headers []*types.Header, chain consensus.ChainHeaderReader, parents []*types.Header, chainId *big.Int) (*Snapshot, error) { + // Allow passing in no headers for cleaner code + if len(headers) == 0 { + return s, nil + } + // Sanity check that the headers can be applied + for i := 0; i < len(headers)-1; i++ { + if headers[i+1].Number.Uint64() != headers[i].Number.Uint64()+1 { + return nil, errOutOfRangeChain + } + if !bytes.Equal(headers[i+1].ParentHash.Bytes(), headers[i].Hash().Bytes()) { + return nil, errBlockHashInconsistent + } + } + if headers[0].Number.Uint64() != s.Number+1 { + return nil, errOutOfRangeChain + } + if !bytes.Equal(headers[0].ParentHash.Bytes(), s.Hash.Bytes()) { + return nil, errBlockHashInconsistent + } + // Iterate through the headers and create a new snapshot + snap := s.copy() + + for _, header := range headers { + number := header.Number.Uint64() + // Delete the oldest validator from the recent list to allow it signing again + if limit := uint64(len(snap.Validators)/2 + 1); number >= limit { + delete(snap.Recents, number-limit) + } + if limit := uint64(len(snap.Validators)); number >= limit { + delete(snap.RecentForkHashes, number-limit) + } + // Resolve the authorization key and check against signers + validator, err := ecrecover(header, s.sigCache, chainId) + if err != nil { + return nil, err + } + if _, ok := snap.Validators[validator]; !ok { + return nil, errUnauthorizedValidator + } + for _, recent := range snap.Recents { + if recent == validator { + return nil, errRecentlySigned + } + } + snap.Recents[number] = validator + // change validator set + if number > 0 && number%s.config.Epoch == uint64(len(snap.Validators)/2) { + checkpointHeader := FindAncientHeader(header, uint64(len(snap.Validators)/2), chain, parents) + if checkpointHeader == nil { + return nil, consensus.ErrUnknownAncestor + } + + validatorBytes := checkpointHeader.Extra[extraVanity : len(checkpointHeader.Extra)-extraSeal] + // get validators from headers and use that for new validator set + newValArr, err := ParseValidators(validatorBytes) + if err != nil { + return nil, err + } + newVals := make(map[common.Address]struct{}, len(newValArr)) + for _, val := range newValArr { + newVals[val] = struct{}{} + } + oldLimit := len(snap.Validators)/2 + 1 + newLimit := len(newVals)/2 + 1 + if newLimit < oldLimit { + for i := 0; i < oldLimit-newLimit; i++ { + delete(snap.Recents, number-uint64(newLimit)-uint64(i)) + } + } + oldLimit = len(snap.Validators) + newLimit = len(newVals) + if newLimit < oldLimit { + for i := 0; i < oldLimit-newLimit; i++ { + delete(snap.RecentForkHashes, number-uint64(newLimit)-uint64(i)) + } + } + snap.Validators = newVals + } + snap.RecentForkHashes[number] = hex.EncodeToString(header.Extra[extraVanity-nextForkHashSize : extraVanity]) + } + snap.Number += uint64(len(headers)) + snap.Hash = headers[len(headers)-1].Hash() + return snap, nil +} + +// validators retrieves the list of validators in ascending order. +func (s *Snapshot) validators() []common.Address { + validators := make([]common.Address, 0, len(s.Validators)) + for v := range s.Validators { + validators = append(validators, v) + } + sort.Sort(validatorsAscending(validators)) + return validators +} + +// inturn returns if a validator at a given block height is in-turn or not. +func (s *Snapshot) inturn(validator common.Address) bool { + validators := s.validators() + offset := (s.Number + 1) % uint64(len(validators)) + return validators[offset] == validator +} + +func (s *Snapshot) enoughDistance(validator common.Address, header *types.Header) bool { + idx := s.indexOfVal(validator) + if idx < 0 { + return true + } + validatorNum := int64(len(s.validators())) + if validatorNum == 1 { + return true + } + if validator == header.Coinbase { + return false + } + offset := (int64(s.Number) + 1) % validatorNum + if int64(idx) >= offset { + return int64(idx)-offset >= validatorNum-2 + } else { + return validatorNum+int64(idx)-offset >= validatorNum-2 + } +} + +func (s *Snapshot) indexOfVal(validator common.Address) int { + validators := s.validators() + for idx, val := range validators { + if val == validator { + return idx + } + } + return -1 +} + +func (s *Snapshot) supposeValidator() common.Address { + validators := s.validators() + index := (s.Number + 1) % uint64(len(validators)) + return validators[index] +} + +func ParseValidators(validatorsBytes []byte) ([]common.Address, error) { + if len(validatorsBytes)%validatorBytesLength != 0 { + return nil, errors.New("invalid validators bytes") + } + n := len(validatorsBytes) / validatorBytesLength + result := make([]common.Address, n) + for i := 0; i < n; i++ { + address := make([]byte, validatorBytesLength) + copy(address, validatorsBytes[i*validatorBytesLength:(i+1)*validatorBytesLength]) + result[i] = common.BytesToAddress(address) + } + return result, nil +} + +func FindAncientHeader(header *types.Header, ite uint64, chain consensus.ChainHeaderReader, candidateParents []*types.Header) *types.Header { + ancient := header + for i := uint64(1); i <= ite; i++ { + parentHash := ancient.ParentHash + parentHeight := ancient.Number.Uint64() - 1 + found := false + if len(candidateParents) > 0 { + index := sort.Search(len(candidateParents), func(i int) bool { + return candidateParents[i].Number.Uint64() >= parentHeight + }) + if index < len(candidateParents) && candidateParents[index].Number.Uint64() == parentHeight && + candidateParents[index].Hash() == parentHash { + ancient = candidateParents[index] + found = true + } + } + if !found { + ancient = chain.GetHeader(parentHash, parentHeight) + found = true + } + if ancient == nil || !found { + return nil + } + } + return ancient +} diff --git a/consensus/parlia/snapshot_test.go b/consensus/parlia/snapshot_test.go new file mode 100644 index 00000000000..88ef01e06cf --- /dev/null +++ b/consensus/parlia/snapshot_test.go @@ -0,0 +1,30 @@ +package parlia + +import ( + "bytes" + "math/rand" + "sort" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/ledgerwatch/erigon/common" +) + +func TestValidatorSetSort(t *testing.T) { + size := 100 + validators := make([]common.Address, size) + for i := 0; i < size; i++ { + validators[i] = randomAddress() + } + sort.Sort(validatorsAscending(validators)) + for i := 0; i < size-1; i++ { + assert.True(t, bytes.Compare(validators[i][:], validators[i+1][:]) < 0) + } +} + +func randomAddress() common.Address { + addrBytes := make([]byte, 20) + rand.Read(addrBytes) + return common.BytesToAddress(addrBytes) +} diff --git a/consensus/parlia/utils.go b/consensus/parlia/utils.go new file mode 100644 index 00000000000..27f663db04f --- /dev/null +++ b/consensus/parlia/utils.go @@ -0,0 +1,31 @@ +package parlia + +import ( + "math/rand" + + "github.com/ledgerwatch/erigon/common" +) + +func backOffTime(snap *Snapshot, val common.Address) uint64 { + if snap.inturn(val) { + return 0 + } else { + idx := snap.indexOfVal(val) + if idx < 0 { + // The backOffTime does not matter when a validator is not authorized. + return 0 + } + s := rand.NewSource(int64(snap.Number)) + r := rand.New(s) + n := len(snap.Validators) + backOffSteps := make([]uint64, 0, n) + for idx := uint64(0); idx < uint64(n); idx++ { + backOffSteps = append(backOffSteps, idx) + } + r.Shuffle(n, func(i, j int) { + backOffSteps[i], backOffSteps[j] = backOffSteps[j], backOffSteps[i] + }) + delay := initialBackOffTime + backOffSteps[idx]*wiggleTime + return delay + } +} diff --git a/consensus/result.go b/consensus/result.go index a1e3dfa7436..ccde2333c6b 100644 --- a/consensus/result.go +++ b/consensus/result.go @@ -19,7 +19,7 @@ type Cancel struct { } func (c *Cancel) CancelFunc() { - log.Debug("cancel mining task", "callers", debug.Callers(10)) + log.Trace("Cancel mining task", "callers", debug.Callers(10)) c.cancel() } diff --git a/consensus/serenity/serenity.go b/consensus/serenity/serenity.go new file mode 100644 index 00000000000..c1192ea6375 --- /dev/null +++ b/consensus/serenity/serenity.go @@ -0,0 +1,241 @@ +package serenity + +import ( + "bytes" + "errors" + "fmt" + "math/big" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/misc" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/rpc" +) + +// Constants for Serenity as specified into https://eips.ethereum.org/EIPS/eip-2982 +var ( + SerenityDifficulty = common.Big0 // Serenity block's difficulty is always 0. + SerenityNonce = types.BlockNonce{} // Serenity chain's nonces are 0. + RewardSerenity = big.NewInt(300000000000000000) +) + +var ( + // errInvalidDifficulty is returned if the difficulty is non-zero. + errInvalidDifficulty = errors.New("invalid difficulty") + + // errInvalidNonce is returned if the nonce is non-zero. + errInvalidNonce = errors.New("invalid nonce") + + // errInvalidUncleHash is returned if a block contains an non-empty uncle list. + errInvalidUncleHash = errors.New("non empty uncle hash") + + errOlderBlockTime = errors.New("timestamp older than parent") +) + +// Serenity Consensus Engine for the Execution Layer. +// Serenity is a consensus engine that combines the eth1 consensus and proof-of-stake +// algorithm. The transition rule is described in the eth1/2 merge spec: +// https://eips.ethereum.org/EIPS/eip-3675 +// +// Note: After the Merge the work is mostly done on the Consensus Layer, so nothing much is to be added on this side. +type Serenity struct { + eth1Engine consensus.Engine // Original consensus engine used in eth1, e.g. ethash or clique +} + +// New creates a new instance of the Serenity Engine with the given embedded eth1 engine. +func New(eth1Engine consensus.Engine) *Serenity { + if _, ok := eth1Engine.(*Serenity); ok { + panic("nested consensus engine") + } + return &Serenity{eth1Engine: eth1Engine} +} + +// InnerEngine returns the embedded eth1 consensus engine. +func (s *Serenity) InnerEngine() consensus.Engine { + return s.eth1Engine +} + +// Type returns the type of the underlying consensus engine. +func (s *Serenity) Type() params.ConsensusType { + return s.eth1Engine.Type() +} + +// Author implements consensus.Engine, returning the header's coinbase as the +// proof-of-stake verified author of the block. +func (s *Serenity) Author(header *types.Header) (common.Address, error) { + if !IsPoSHeader(header) { + return s.eth1Engine.Author(header) + } + return header.Coinbase, nil +} + +// VerifyHeader checks whether a header conforms to the consensus rules of the +// stock Ethereum serenity engine. +func (s *Serenity) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error { + reached, err := IsTTDReached(chain, header.ParentHash, header.Number.Uint64()-1) + if err != nil { + return err + } + if !reached { + return s.eth1Engine.VerifyHeader(chain, header, seal) + } + // Short circuit if the parent is not known + parent := chain.GetHeader(header.ParentHash, header.Number.Uint64()-1) + if parent == nil { + return consensus.ErrUnknownAncestor + } + + return s.verifyHeader(chain, header, parent) +} + +// VerifyUncles implements consensus.Engine, always returning an error for any +// uncles as this consensus mechanism doesn't permit uncles. +func (s *Serenity) VerifyUncles(chain consensus.ChainReader, header *types.Header, uncles []*types.Header) error { + if !IsPoSHeader(header) { + return s.eth1Engine.VerifyUncles(chain, header, uncles) + } + if len(uncles) > 0 { + return errors.New("uncles not allowed") + } + return nil +} + +// Prepare makes sure difficulty and nonce are correct +func (s *Serenity) Prepare(chain consensus.ChainHeaderReader, header *types.Header, state *state.IntraBlockState) error { + reached, err := IsTTDReached(chain, header.ParentHash, header.Number.Uint64()-1) + if err != nil { + return err + } + if !reached { + return s.eth1Engine.Prepare(chain, header, state) + } + header.Difficulty = SerenityDifficulty + header.Nonce = SerenityNonce + return nil +} + +func (s *Serenity) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, +) (types.Transactions, types.Receipts, error) { + if !IsPoSHeader(header) { + return s.eth1Engine.Finalize(config, header, state, txs, uncles, r, e, chain, syscall) + } + return txs, r, nil +} + +func (s *Serenity) FinalizeAndAssemble(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, + txs types.Transactions, uncles []*types.Header, receipts types.Receipts, e consensus.EpochReader, + chain consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call, +) (*types.Block, types.Transactions, types.Receipts, error) { + if !IsPoSHeader(header) { + return s.eth1Engine.FinalizeAndAssemble(config, header, state, txs, uncles, receipts, e, chain, syscall, call) + } + return types.NewBlock(header, txs, uncles, receipts), txs, receipts, nil +} + +func (s *Serenity) SealHash(header *types.Header) (hash common.Hash) { + return s.eth1Engine.SealHash(header) +} + +func (s *Serenity) CalcDifficulty(chain consensus.ChainHeaderReader, time, parentTime uint64, parentDifficulty *big.Int, parentNumber uint64, parentHash, parentUncleHash common.Hash, parentSeal []rlp.RawValue) *big.Int { + reached, err := IsTTDReached(chain, parentHash, parentNumber) + if err != nil { + return nil + } + if !reached { + return s.eth1Engine.CalcDifficulty(chain, time, parentTime, parentDifficulty, parentNumber, parentHash, parentUncleHash, parentSeal) + } + return SerenityDifficulty +} + +// verifyHeader checks whether a Proof-of-Stake header conforms to the consensus rules of the +// stock Ethereum consensus engine with EIP-3675 modifications. +func (s *Serenity) verifyHeader(chain consensus.ChainHeaderReader, header, parent *types.Header) error { + + if uint64(len(header.Extra)) > params.MaximumExtraDataSize { + return fmt.Errorf("extra-data longer than %d bytes (%d)", params.MaximumExtraDataSize, len(header.Extra)) + } + + if header.Time <= parent.Time { + return errOlderBlockTime + } + + if header.Difficulty.Cmp(SerenityDifficulty) != 0 { + return errInvalidDifficulty + } + + if !bytes.Equal(header.Nonce[:], SerenityNonce[:]) { + return errInvalidNonce + } + + // Verify that the gas limit is within cap + if header.GasLimit > params.MaxGasLimit { + return fmt.Errorf("invalid gasLimit: have %v, max %v", header.GasLimit, params.MaxGasLimit) + } + // Verify that the gasUsed is <= gasLimit + if header.GasUsed > header.GasLimit { + return fmt.Errorf("invalid gasUsed: have %d, gasLimit %d", header.GasUsed, header.GasLimit) + } + + // Verify that the block number is parent's +1 + if diff := new(big.Int).Sub(header.Number, parent.Number); diff.Cmp(common.Big1) != 0 { + return consensus.ErrInvalidNumber + } + + if header.UncleHash != types.EmptyUncleHash { + return errInvalidUncleHash + } + + return misc.VerifyEip1559Header(chain.Config(), parent, header) +} + +func (s *Serenity) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + if !IsPoSHeader(block.Header()) { + return s.eth1Engine.Seal(chain, block, results, stop) + } + return nil +} + +func (s *Serenity) GenerateSeal(chain consensus.ChainHeaderReader, currnt, parent *types.Header, call consensus.Call) []rlp.RawValue { + return nil +} + +func (s *Serenity) Initialize(config *params.ChainConfig, chain consensus.ChainHeaderReader, e consensus.EpochReader, header *types.Header, txs []types.Transaction, uncles []*types.Header, syscall consensus.SystemCall) { +} + +func (s *Serenity) APIs(chain consensus.ChainHeaderReader) []rpc.API { + return s.eth1Engine.APIs(chain) +} + +func (s *Serenity) Close() error { + return s.eth1Engine.Close() +} + +// IsPoSHeader reports the header belongs to the PoS-stage with some special fields. +// This function is not suitable for a part of APIs like Prepare or CalcDifficulty +// because the header difficulty is not set yet. +func IsPoSHeader(header *types.Header) bool { + if header.Difficulty == nil { + panic("IsPoSHeader called with invalid difficulty") + } + return header.Difficulty.Cmp(SerenityDifficulty) == 0 +} + +// IsTTDReached checks if the TotalTerminalDifficulty has been surpassed on the `parentHash` block. +// It depends on the parentHash already being stored in the database. +// If the total difficulty is not stored in the database a ErrUnknownAncestorTD error is returned. +func IsTTDReached(chain consensus.ChainHeaderReader, parentHash common.Hash, number uint64) (bool, error) { + if chain.Config().TerminalTotalDifficulty == nil { + return false, nil + } + td := chain.GetTd(parentHash, number) + if td == nil { + return false, consensus.ErrUnknownAncestorTD + } + return td.Cmp(chain.Config().TerminalTotalDifficulty) >= 0, nil +} diff --git a/consensus/serenity/serenity_test.go b/consensus/serenity/serenity_test.go new file mode 100644 index 00000000000..3452da3d342 --- /dev/null +++ b/consensus/serenity/serenity_test.go @@ -0,0 +1,82 @@ +package serenity + +import ( + "math/big" + "testing" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/params" +) + +type readerMock struct{} + +func (r readerMock) Config() *params.ChainConfig { + return nil +} + +func (r readerMock) CurrentHeader() *types.Header { + return nil +} + +func (r readerMock) GetHeader(common.Hash, uint64) *types.Header { + return nil +} + +func (r readerMock) GetHeaderByNumber(uint64) *types.Header { + return nil +} + +func (r readerMock) GetHeaderByHash(common.Hash) *types.Header { + return nil +} + +func (r readerMock) GetTd(common.Hash, uint64) *big.Int { + return nil +} + +// The thing only that changes beetwen normal ethash checks other than POW, is difficulty +// and nonce so we are gonna test those +func TestVerifyHeaderDifficulty(t *testing.T) { + header := &types.Header{ + Difficulty: big.NewInt(1), + Time: 1, + } + + parent := &types.Header{} + + var eth1Engine consensus.Engine + serenity := New(eth1Engine) + + err := serenity.verifyHeader(readerMock{}, header, parent) + if err != errInvalidDifficulty { + if err != nil { + t.Fatalf("Serenity should not accept non-zero difficulty, got %s", err.Error()) + } else { + t.Fatalf("Serenity should not accept non-zero difficulty") + } + } +} + +func TestVerifyHeaderNonce(t *testing.T) { + header := &types.Header{ + Nonce: types.BlockNonce{1, 0, 0, 0, 0, 0, 0, 0}, + Difficulty: big.NewInt(0), + Time: 1, + } + + parent := &types.Header{} + + var eth1Engine consensus.Engine + serenity := New(eth1Engine) + + err := serenity.verifyHeader(readerMock{}, header, parent) + if err != errInvalidNonce { + if err != nil { + t.Fatalf("Serenity should not accept non-zero difficulty, got %s", err.Error()) + } else { + t.Fatalf("Serenity should not accept non-zero difficulty") + } + } +} diff --git a/core/allocs/bor_mainnet.json b/core/allocs/bor_mainnet.json new file mode 100644 index 00000000000..912ea99654c --- /dev/null +++ b/core/allocs/bor_mainnet.json @@ -0,0 +1,35 @@ +{ + "0000000000000000000000000000000000001000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806360c8614d1161010f578063af26aa96116100a2578063d5b844eb11610071578063d5b844eb14610666578063dcf2793a14610684578063e3b7c924146106b6578063f59cf565146106d4576101f0565b8063af26aa96146105c7578063b71d7a69146105e7578063b7ab4db514610617578063c1b3c91914610636576101f0565b806370ba5707116100de57806370ba57071461052b57806398ab2b621461055b5780639d11b80714610579578063ae756451146105a9576101f0565b806360c8614d1461049c57806365b3a1e2146104bc57806366332354146104db578063687a9bd6146104f9576101f0565b80633434735f1161018757806344d6528f1161015657806344d6528f146103ee5780634dbc959f1461041e57806355614fcc1461043c578063582a8d081461046c576101f0565b80633434735f1461035257806335ddfeea1461037057806343ee8213146103a057806344c15cb1146103be576101f0565b806323f2a73f116101c357806323f2a73f146102a45780632bc06564146102d45780632de3a180146102f25780632eddf35214610322576101f0565b8063047a6c5b146101f55780630c35b1cb146102275780631270b5741461025857806323c2a2b414610288575b600080fd5b61020f600480360361020a9190810190612c14565b610706565b60405161021e93929190613553565b60405180910390f35b610241600480360361023c9190810190612c14565b61075d565b60405161024f929190613374565b60405180910390f35b610272600480360361026d9190810190612c3d565b610939565b60405161027f91906133ab565b60405180910390f35b6102a2600480360361029d9190810190612d1c565b610a91565b005b6102be60048036036102b99190810190612c3d565b61112a565b6040516102cb91906133ab565b60405180910390f35b6102dc611281565b6040516102e99190613501565b60405180910390f35b61030c60048036036103079190810190612b71565b611286565b60405161031991906133c6565b60405180910390f35b61033c60048036036103379190810190612c14565b611307565b6040516103499190613501565b60405180910390f35b61035a611437565b6040516103679190613359565b60405180910390f35b61038a60048036036103859190810190612bad565b61144f565b60405161039791906133ab565b60405180910390f35b6103a861151a565b6040516103b591906133c6565b60405180910390f35b6103d860048036036103d39190810190612c79565b611531565b6040516103e59190613501565b60405180910390f35b61040860048036036104039190810190612c3d565b611619565b60405161041591906134e6565b60405180910390f35b610426611781565b6040516104339190613501565b60405180910390f35b61045660048036036104519190810190612af6565b611791565b60405161046391906133ab565b60405180910390f35b61048660048036036104819190810190612b1f565b6117ab565b60405161049391906133c6565b60405180910390f35b6104a4611829565b6040516104b393929190613553565b60405180910390f35b6104c461189d565b6040516104d2929190613374565b60405180910390f35b6104e3611c5e565b6040516104f09190613501565b60405180910390f35b610513600480360361050e9190810190612ce0565b611c63565b6040516105229392919061351c565b60405180910390f35b61054560048036036105409190810190612af6565b611cc7565b60405161055291906133ab565b60405180910390f35b610563611ce1565b60405161057091906133c6565b60405180910390f35b610593600480360361058e9190810190612c14565b611cf8565b6040516105a09190613501565b60405180910390f35b6105b1611e29565b6040516105be91906133c6565b60405180910390f35b6105cf611e40565b6040516105de93929190613553565b60405180910390f35b61060160048036036105fc9190810190612c14565b611ea1565b60405161060e9190613501565b60405180910390f35b61061f611fa1565b60405161062d929190613374565b60405180910390f35b610650600480360361064b9190810190612c14565b611fb5565b60405161065d9190613501565b60405180910390f35b61066e611fd6565b60405161067b919061358a565b60405180910390f35b61069e60048036036106999190810190612ce0565b611fdb565b6040516106ad9392919061351c565b60405180910390f35b6106be61203f565b6040516106cb9190613501565b60405180910390f35b6106ee60048036036106e99190810190612c14565b612051565b6040516106fd93929190613553565b60405180910390f35b60008060006002600085815260200190815260200160002060000154600260008681526020019081526020016000206001015460026000878152602001908152602001600020600201549250925092509193909250565b60608060ff83116107795761077061189d565b91509150610934565b600061078484611ea1565b9050606060016000838152602001908152602001600020805490506040519080825280602002602001820160405280156107cd5781602001602082028038833980820191505090505b509050606060016000848152602001908152602001600020805490506040519080825280602002602001820160405280156108175781602001602082028038833980820191505090505b50905060008090505b60016000858152602001908152602001600020805490508110156109295760016000858152602001908152602001600020818154811061085c57fe5b906000526020600020906003020160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061089a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600085815260200190815260200160002081815481106108f257fe5b90600052602060002090600302016001015482828151811061091057fe5b6020026020010181815250508080600101915050610820565b508181945094505050505b915091565b6000606060016000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610970565b50505050905060008090505b8151811015610a84578373ffffffffffffffffffffffffffffffffffffffff16828281518110610a4457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff161415610a7757600192505050610a8b565b8080600101915050610a18565b5060009150505b92915050565b73fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906134c6565b60405180910390fd5b6000610b1d611781565b90506000811415610b3157610b3061207b565b5b610b4560018261239c90919063ffffffff16565b8814610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613446565b60405180910390fd5b868611610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906134a6565b60405180910390fd5b6000604060018989030181610bd957fe5b0614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613486565b60405180910390fd5b8660026000838152602001908152602001600020600101541115610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613426565b60405180910390fd5b6000600260008a81526020019081526020016000206000015414610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613466565b60405180910390fd5b604051806060016040528089815260200188815260200187815250600260008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600388908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008a815260200190815260200160002081610d6691906128f0565b506000600160008a815260200190815260200160002081610d8791906128f0565b506060610ddf610dda87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506123bb565b6123e9565b905060008090505b8151811015610f51576060610e0e838381518110610e0157fe5b60200260200101516123e9565b90506000808c81526020019081526020016000208054809190600101610e3491906128f0565b506040518060600160405280610e5d83600081518110610e5057fe5b60200260200101516124c6565b8152602001610e7f83600181518110610e7257fe5b60200260200101516124c6565b8152602001610ea183600281518110610e9457fe5b6020026020010151612537565b73ffffffffffffffffffffffffffffffffffffffff168152506000808d81526020019081526020016000208381548110610ed757fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610de7565b506060610fa9610fa486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506123bb565b6123e9565b905060008090505b815181101561111d576060610fd8838381518110610fcb57fe5b60200260200101516123e9565b9050600160008d81526020019081526020016000208054809190600101610fff91906128f0565b5060405180606001604052806110288360008151811061101b57fe5b60200260200101516124c6565b815260200161104a8360018151811061103d57fe5b60200260200101516124c6565b815260200161106c8360028151811061105f57fe5b6020026020010151612537565b73ffffffffffffffffffffffffffffffffffffffff16815250600160008e815260200190815260200160002083815481106110a357fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610fb1565b5050505050505050505050565b60006060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156111fc578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611160565b50505050905060008090505b8151811015611274578373ffffffffffffffffffffffffffffffffffffffff1682828151811061123457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1614156112675760019250505061127b565b8080600101915050611208565b5060009150505b92915050565b604081565b60006002600160f81b84846040516020016112a3939291906132c6565b6040516020818303038152906040526040516112bf9190613303565b602060405180830381855afa1580156112dc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506112ff9190810190612b48565b905092915050565b60006060600080848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113d9578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061133d565b505050509050600080905060008090505b825181101561142c5761141d83828151811061140257fe5b6020026020010151602001518361239c90919063ffffffff16565b915080806001019150506113ea565b508092505050919050565b73fffffffffffffffffffffffffffffffffffffffe81565b600080600080859050600060218087518161146657fe5b04029050600081111561147f5761147c876117ab565b91505b6000602190505b818111611509576000600182038801519050818801519550806000602081106114ab57fe5b1a60f81b9450600060f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156114f0576114e98685611286565b93506114fd565b6114fa8487611286565b93505b50602181019050611486565b508782149450505050509392505050565b60405161152690613344565b604051809103902081565b60008060009050600080905060008090505b84518167ffffffffffffffff16101561160c57606061156e868367ffffffffffffffff16604161255a565b9050600061158582896125e690919063ffffffff16565b905061158f612922565b6115998a83611619565b90506115a58a8361112a565b80156115dc57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16115b156115fe578194506115fb81602001518761239c90919063ffffffff16565b95505b505050604181019050611543565b5081925050509392505050565b611621612922565b6060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156116f1578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611655565b50505050905060008090505b8151811015611779578373ffffffffffffffffffffffffffffffffffffffff1682828151811061172957fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff16141561176c5781818151811061175d57fe5b60200260200101519250611779565b80806001019150506116fd565b505092915050565b600061178c43611ea1565b905090565b60006117a461179e611781565b8361112a565b9050919050565b60006002600060f81b836040516020016117c692919061329a565b6040516020818303038152906040526040516117e29190613303565b602060405180830381855afa1580156117ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506118229190810190612b48565b9050919050565b60008060008061184a600161183c611781565b61239c90919063ffffffff16565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b606080606060076040519080825280602002602001820160405280156118d25781602001602082028038833980820191505090505b509050735973918275c01f50555d44e92c9d9b353cadad54816000815181106118f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b8bb158b93c94ed35c1970d610d1e2b34e26652c8160018151811061195357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073f84c74dea96df0ec22e11e7c33996c73fcc2d822816002815181106119af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073b702f1c9154ac9c08da247a8e30ee6f2f3373f4181600381518110611a0b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737fcd58c2d53d980b247f1612fdba93e9a76193e681600481518110611a6757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050730375b2fc7140977c9c76d45421564e354ed4227781600581518110611ac357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507342eefcda06ead475cde3731b8eb138e88cd0bac381600681518110611b1f57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606007604051908082528060200260200182016040528015611b8b5781602001602082028038833980820191505090505b50905061271081600081518110611b9e57fe5b60200260200101818152505061271081600181518110611bba57fe5b60200260200101818152505061271081600281518110611bd657fe5b60200260200101818152505061271081600381518110611bf257fe5b60200260200101818152505061271081600481518110611c0e57fe5b60200260200101818152505061271081600581518110611c2a57fe5b60200260200101818152505061271081600681518110611c4657fe5b60200260200101818152505081819350935050509091565b60ff81565b60016020528160005260406000208181548110611c7c57fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b6000611cda611cd4611781565b83610939565b9050919050565b604051611ced9061331a565b604051809103902081565b6000606060016000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611dcb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611d2f565b505050509050600080905060008090505b8251811015611e1e57611e0f838281518110611df457fe5b6020026020010151602001518361239c90919063ffffffff16565b91508080600101915050611ddc565b508092505050919050565b604051611e359061332f565b604051809103902081565b600080600080611e4e611781565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b60008060038054905090505b6000811115611f6157611ebe612959565b6002600060036001850381548110611ed257fe5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816020015111158015611f2f57506000816040015114155b8015611f3f575080604001518411155b15611f5257806000015192505050611f9c565b50808060019003915050611ead565b5060006003805490501115611f9757600360016003805490500381548110611f8557fe5b90600052602060002001549050611f9c565b600090505b919050565b606080611fad4361075d565b915091509091565b60038181548110611fc257fe5b906000526020600020016000915090505481565b600281565b60006020528160005260406000208181548110611ff457fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b60006040438161204b57fe5b04905090565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b60608061208661189d565b8092508193505050600080905060405180606001604052808281526020016000815260200160ff81525060026000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600381908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008381526020019081526020016000208161212f91906128f0565b506000600160008381526020019081526020016000208161215091906128f0565b5060008090505b835181101561227257600080838152602001908152602001600020805480919060010161218491906128f0565b5060405180606001604052808281526020018483815181106121a257fe5b602002602001015181526020018583815181106121bb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060008084815260200190815260200160002082815481106121f957fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612157565b5060008090505b8351811015612396576001600083815260200190815260200160002080548091906001016122a791906128f0565b5060405180606001604052808281526020018483815181106122c557fe5b602002602001015181526020018583815181106122de57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060016000848152602001908152602001600020828154811061231d57fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612279565b50505050565b6000808284019050838110156123b157600080fd5b8091505092915050565b6123c361297a565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606123f4826126f0565b6123fd57600080fd5b60006124088361273e565b905060608160405190808252806020026020018201604052801561244657816020015b612433612994565b81526020019060019003908161242b5790505b509050600061245885602001516127af565b8560200151019050600080600090505b848110156124b95761247983612838565b915060405180604001604052808381526020018481525084828151811061249c57fe5b602002602001018190525081830192508080600101915050612468565b5082945050505050919050565b60008082600001511180156124e057506021826000015111155b6124e957600080fd5b60006124f883602001516127af565b9050600081846000015103905060008083866020015101905080519150602083101561252b57826020036101000a820491505b81945050505050919050565b6000601582600001511461254a57600080fd5b612553826124c6565b9050919050565b60608183018451101561256c57600080fd5b6060821560008114612589576040519150602082016040526125da565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156125c757805183526020830192506020810190506125aa565b50868552601f19601f8301166040525050505b50809150509392505050565b600080600080604185511461260157600093505050506126ea565b602085015192506040850151915060ff6041860151169050601b8160ff16101561262c57601b810190505b601b8160ff16141580156126445750601c8160ff1614155b1561265557600093505050506126ea565b60006001878386866040516000815260200160405260405161267a94939291906133e1565b6020604051602081039080840390855afa15801561269c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126e257600080fd5b809450505050505b92915050565b600080826000015114156127075760009050612739565b60008083602001519050805160001a915060c060ff168260ff16101561273257600092505050612739565b6001925050505b919050565b6000808260000151141561275557600090506127aa565b6000809050600061276984602001516127af565b84602001510190506000846000015185602001510190505b808210156127a35761279282612838565b820191508280600101935050612781565b8293505050505b919050565b600080825160001a9050608060ff168110156127cf576000915050612833565b60b860ff168110806127f4575060c060ff1681101580156127f3575060f860ff1681105b5b15612803576001915050612833565b60c060ff168110156128235760018060b80360ff16820301915050612833565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561285957600191506128e6565b60b860ff16811015612876576001608060ff1682030191506128e5565b60c060ff168110156128a65760b78103600185019450806020036101000a855104600182018101935050506128e4565b60f860ff168110156128c357600160c060ff1682030191506128e3565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b81548183558181111561291d5760030281600302836000526020600020918201910161291c91906129ae565b5b505050565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604051806040016040528060008152602001600081525090565b612a0191905b808211156129fd5760008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506003016129b4565b5090565b90565b600081359050612a1381613783565b92915050565b600081359050612a288161379a565b92915050565b600081519050612a3d8161379a565b92915050565b60008083601f840112612a5557600080fd5b8235905067ffffffffffffffff811115612a6e57600080fd5b602083019150836001820283011115612a8657600080fd5b9250929050565b600082601f830112612a9e57600080fd5b8135612ab1612aac826135d2565b6135a5565b91508082526020830160208301858383011115612acd57600080fd5b612ad883828461372d565b50505092915050565b600081359050612af0816137b1565b92915050565b600060208284031215612b0857600080fd5b6000612b1684828501612a04565b91505092915050565b600060208284031215612b3157600080fd5b6000612b3f84828501612a19565b91505092915050565b600060208284031215612b5a57600080fd5b6000612b6884828501612a2e565b91505092915050565b60008060408385031215612b8457600080fd5b6000612b9285828601612a19565b9250506020612ba385828601612a19565b9150509250929050565b600080600060608486031215612bc257600080fd5b6000612bd086828701612a19565b9350506020612be186828701612a19565b925050604084013567ffffffffffffffff811115612bfe57600080fd5b612c0a86828701612a8d565b9150509250925092565b600060208284031215612c2657600080fd5b6000612c3484828501612ae1565b91505092915050565b60008060408385031215612c5057600080fd5b6000612c5e85828601612ae1565b9250506020612c6f85828601612a04565b9150509250929050565b600080600060608486031215612c8e57600080fd5b6000612c9c86828701612ae1565b9350506020612cad86828701612a19565b925050604084013567ffffffffffffffff811115612cca57600080fd5b612cd686828701612a8d565b9150509250925092565b60008060408385031215612cf357600080fd5b6000612d0185828601612ae1565b9250506020612d1285828601612ae1565b9150509250929050565b600080600080600080600060a0888a031215612d3757600080fd5b6000612d458a828b01612ae1565b9750506020612d568a828b01612ae1565b9650506040612d678a828b01612ae1565b955050606088013567ffffffffffffffff811115612d8457600080fd5b612d908a828b01612a43565b9450945050608088013567ffffffffffffffff811115612daf57600080fd5b612dbb8a828b01612a43565b925092505092959891949750929550565b6000612dd88383612dfc565b60208301905092915050565b6000612df0838361326d565b60208301905092915050565b612e05816136a2565b82525050565b612e14816136a2565b82525050565b6000612e258261361e565b612e2f8185613659565b9350612e3a836135fe565b8060005b83811015612e6b578151612e528882612dcc565b9750612e5d8361363f565b925050600181019050612e3e565b5085935050505092915050565b6000612e8382613629565b612e8d818561366a565b9350612e988361360e565b8060005b83811015612ec9578151612eb08882612de4565b9750612ebb8361364c565b925050600181019050612e9c565b5085935050505092915050565b612edf816136b4565b82525050565b612ef6612ef1826136c0565b61376f565b82525050565b612f05816136ec565b82525050565b612f1c612f17826136ec565b613779565b82525050565b6000612f2d82613634565b612f37818561367b565b9350612f4781856020860161373c565b80840191505092915050565b6000612f60600483613697565b91507f766f7465000000000000000000000000000000000000000000000000000000006000830152600482019050919050565b6000612fa0602d83613686565b91507f537461727420626c6f636b206d7573742062652067726561746572207468616e60008301527f2063757272656e74207370616e000000000000000000000000000000000000006020830152604082019050919050565b6000613006600383613697565b91507f31333700000000000000000000000000000000000000000000000000000000006000830152600382019050919050565b6000613046600f83613686565b91507f496e76616c6964207370616e20696400000000000000000000000000000000006000830152602082019050919050565b6000613086601383613686565b91507f5370616e20616c726561647920657869737473000000000000000000000000006000830152602082019050919050565b60006130c6604583613686565b91507f446966666572656e6365206265747765656e20737461727420616e6420656e6460008301527f20626c6f636b206d75737420626520696e206d756c7469706c6573206f66207360208301527f7072696e740000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613152600c83613697565b91507f6865696d64616c6c2d31333700000000000000000000000000000000000000006000830152600c82019050919050565b6000613192602a83613686565b91507f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008301527f7461727420626c6f636b000000000000000000000000000000000000000000006020830152604082019050919050565b60006131f8601283613686565b91507f4e6f742053797374656d204164646573732100000000000000000000000000006000830152602082019050919050565b606082016000820151613241600085018261326d565b506020820151613254602085018261326d565b5060408201516132676040850182612dfc565b50505050565b61327681613716565b82525050565b61328581613716565b82525050565b61329481613720565b82525050565b60006132a68285612ee5565b6001820191506132b68284612f0b565b6020820191508190509392505050565b60006132d28286612ee5565b6001820191506132e28285612f0b565b6020820191506132f28284612f0b565b602082019150819050949350505050565b600061330f8284612f22565b915081905092915050565b600061332582612f53565b9150819050919050565b600061333a82612ff9565b9150819050919050565b600061334f82613145565b9150819050919050565b600060208201905061336e6000830184612e0b565b92915050565b6000604082019050818103600083015261338e8185612e1a565b905081810360208301526133a28184612e78565b90509392505050565b60006020820190506133c06000830184612ed6565b92915050565b60006020820190506133db6000830184612efc565b92915050565b60006080820190506133f66000830187612efc565b613403602083018661328b565b6134106040830185612efc565b61341d6060830184612efc565b95945050505050565b6000602082019050818103600083015261343f81612f93565b9050919050565b6000602082019050818103600083015261345f81613039565b9050919050565b6000602082019050818103600083015261347f81613079565b9050919050565b6000602082019050818103600083015261349f816130b9565b9050919050565b600060208201905081810360008301526134bf81613185565b9050919050565b600060208201905081810360008301526134df816131eb565b9050919050565b60006060820190506134fb600083018461322b565b92915050565b6000602082019050613516600083018461327c565b92915050565b6000606082019050613531600083018661327c565b61353e602083018561327c565b61354b6040830184612e0b565b949350505050565b6000606082019050613568600083018661327c565b613575602083018561327c565b613582604083018461327c565b949350505050565b600060208201905061359f600083018461328b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156135c857600080fd5b8060405250919050565b600067ffffffffffffffff8211156135e957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006136ad826136f6565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561375a57808201518184015260208101905061373f565b83811115613769576000848401525b50505050565b6000819050919050565b6000819050919050565b61378c816136a2565b811461379757600080fd5b50565b6137a3816136ec565b81146137ae57600080fd5b50565b6137ba81613716565b81146137c557600080fd5b5056fea365627a7a72315820638c74b73aaddeb2f2fb9267028e09737291458f6da93b6619d30c86432701d96c6578706572696d656e74616cf564736f6c634300050b0040" + }, + "0000000000000000000000000000000000001001": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806319494a17146100465780633434735f146100e15780635407ca671461012b575b600080fd5b6100c76004803603604081101561005c57600080fd5b81019080803590602001909291908035906020019064010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460018302840111640100000000831117156100b757600080fd5b9091929391929390505050610149565b604051808215151515815260200191505060405180910390f35b6100e961047a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610133610492565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742053797374656d2041646465737321000000000000000000000000000081525060200191505060405180910390fd5b606061025761025285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610498565b6104c6565b905060006102788260008151811061026b57fe5b60200260200101516105a3565b905080600160005401146102f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b600080815480929190600101919050555060006103248360018151811061031757fe5b6020026020010151610614565b905060606103458460028151811061033857fe5b6020026020010151610637565b9050610350826106c3565b1561046f576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103aa57808201518184015260208101905061038f565b50505050905090810190601f1680156103d75780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b6104a0610943565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104d1826106dc565b6104da57600080fd5b60006104e58361072a565b905060608160405190808252806020026020018201604052801561052357816020015b61051061095d565b8152602001906001900390816105085790505b5090506000610535856020015161079b565b8560200151019050600080600090505b848110156105965761055683610824565b915060405180604001604052808381526020018481525084828151811061057957fe5b602002602001018190525081830192508080600101915050610545565b5082945050505050919050565b60008082600001511180156105bd57506021826000015111155b6105c657600080fd5b60006105d5836020015161079b565b9050600081846000015103905060008083866020015101905080519150602083101561060857826020036101000a820491505b81945050505050919050565b6000601582600001511461062757600080fd5b610630826105a3565b9050919050565b6060600082600001511161064a57600080fd5b6000610659836020015161079b565b905060008184600001510390506060816040519080825280601f01601f19166020018201604052801561069b5781602001600182028038833980820191505090505b50905060008160200190506106b78487602001510182856108dc565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106f35760009050610725565b60008083602001519050805160001a915060c060ff168260ff16101561071e57600092505050610725565b6001925050505b919050565b600080826000015114156107415760009050610796565b60008090506000610755846020015161079b565b84602001510190506000846000015185602001510190505b8082101561078f5761077e82610824565b82019150828060010193505061076d565b8293505050505b919050565b600080825160001a9050608060ff168110156107bb57600091505061081f565b60b860ff168110806107e0575060c060ff1681101580156107df575060f860ff1681105b5b156107ef57600191505061081f565b60c060ff1681101561080f5760018060b80360ff1682030191505061081f565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561084557600191506108d2565b60b860ff16811015610862576001608060ff1682030191506108d1565b60c060ff168110156108925760b78103600185019450806020036101000a855104600182018101935050506108d0565b60f860ff168110156108af57600160c060ff1682030191506108cf565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108ea5761093e565b5b602060ff16811061091a5782518252602060ff1683019250602060ff1682019150602060ff16810390506108eb565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a7231582083fbdacb76f32b4112d0f7db9a596937925824798a0026ba0232322390b5263764736f6c634300050b0032" + }, + "0000000000000000000000000000000000001010": { + "balance": "0x204fcce2c5a141f7f9a00000", + "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610e06565b005b3480156103eb57600080fd5b506103f4610f58565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f61565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061111d565b005b3480156104e857600080fd5b506104f16111ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b50610548611212565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b50610604611259565b005b34801561061257600080fd5b5061061b611329565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061132f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b506107586114b4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af6114dd565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de611534565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e61156d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115aa565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b506109646115d0565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b810190808035906020019092919050505061165d565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061167d565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a6561169d565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a906116a2565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb6116a8565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611735565b005b348015610b2e57600080fd5b50610b37611752565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b6000808511610c4857600080fd5b6000831480610c575750824311155b610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206973206578706972656400000000000000000000000081525060200191505060405180910390fd5b6000610cd73387878761167d565b9050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f536967206465616374697661746564000000000000000000000000000000000081525060200191505060405180910390fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610ded8189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061132f565b9150610dfa828488611778565b50509695505050505050565b60003390506000610e1682611238565b9050610e2d83600654611b3590919063ffffffff16565b600681905550600083118015610e4257508234145b610eb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610f3087611238565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610f696114dd565b610f7257600080fd5b600081118015610faf5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611f036023913960400191505060405180910390fd5b600061100f83611238565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b5061107283600654611b5590919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f685856110f489611238565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611183576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611ee06023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111e882611b74565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6112616114dd565b61126a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b600080600080604185511461134a57600093505050506114ae565b602085015192506040850151915060ff6041860151169050601b8160ff16101561137557601b810190505b601b8160ff161415801561138d5750601c8160ff1614155b1561139e57600093505050506114ae565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113fb573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600181526020017f890000000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b60008134146115bc57600090506115ca565b6115c7338484611778565b90505b92915050565b6040518060800160405280605b8152602001611f78605b91396040516020018082805190602001908083835b6020831061161f57805182526020820191506020810190506020830392506115fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061169361168e86868686611c6c565b611d42565b9050949350505050565b608981565b60015481565b604051806080016040528060528152602001611f26605291396040516020018082805190602001908083835b602083106116f757805182526020820191506020810190506020830392506116d4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b61173d6114dd565b61174657600080fd5b61174f81611b74565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117f857600080fd5b505afa15801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118b457600080fd5b505afa1580156118c8573d6000803e3d6000fd5b505050506040513d60208110156118de57600080fd5b810190808051906020019092919050505090506118fc868686611d8c565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0457600080fd5b505afa158015611a18573d6000803e3d6000fd5b505050506040513d6020811015611a2e57600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d6020811015611ae657600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b600082821115611b4457600080fd5b600082840390508091505092915050565b600080828401905083811015611b6a57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bae57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806040518060800160405280605b8152602001611f78605b91396040516020018082805190602001908083835b60208310611cbe5780518252602082019150602081019050602083039250611c9b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611e74573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a7231582098247ec3c8d127ebf969c8f317e340b1cd6c481af077234c38e0c7d92aba4d6364736f6c634300050b0032" + }, + "5973918275C01F50555d44e92c9d9b353CaDAD54": { + "balance": "0x3635c9adc5dea00000" + }, + "b8bB158B93c94ed35c1970D610d1E2B34E26652c": { + "balance": "0x3635c9adc5dea00000" + }, + "F84C74dEa96DF0EC22e11e7C33996C73FCC2D822": { + "balance": "0x3635c9adc5dea00000" + }, + "b702f1C9154ac9c08Da247a8e30ee6F2F3373f41": { + "balance": "0x3635c9adc5dea00000" + }, + "7fCD58C2D53D980b247F1612FdbA93E9a76193E6": { + "balance": "0x3635c9adc5dea00000" + }, + "0375b2fc7140977c9c76D45421564e354ED42277": { + "balance": "0x3635c9adc5dea00000" + }, + "42EEfcda06eaD475cdE3731B8eb138e88CD0bAC3": { + "balance": "0x3635c9adc5dea00000" + } +} diff --git a/core/allocs/bsc.json b/core/allocs/bsc.json new file mode 100644 index 00000000000..2ffe140b9e6 --- /dev/null +++ b/core/allocs/bsc.json @@ -0,0 +1,51 @@ +{ + "0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000001000": { + "balance": "0x0", + "code": "0x60806040526004361061027d5760003560e01c80639dc092621161014f578063c8509d81116100c1578063eb57e2021161007a578063eb57e20214610940578063eda5868c14610973578063f340fa0114610988578063f9a2bbc7146109ae578063fc3e5908146109c3578063fd6a6879146109d85761027d565b8063c8509d8114610609578063d86222d5146108d7578063daacdb66146108ec578063dc927faf14610901578063e086c7b114610916578063e1c7392a1461092b5761027d565b8063ab51bb9611610113578063ab51bb961461074a578063ac4317511461075f578063ad3c9da61461082a578063b7ab4db51461085d578063bf9f49951461041b578063c81b1662146108c25761027d565b80639dc09262146106cd578063a1a11bf5146106e2578063a5422d5c146106f7578063a78abc161461070c578063aaf5eb68146107355761027d565b80635667515a116101f35780637942fd05116101ac5780637942fd05146105df57806381650b62146105f4578063831d65d114610609578063853230aa1461068e57806386249882146106a357806396713da9146106b85761027d565b80635667515a146105005780635d77156c146105155780636969a25c1461052a5780636e47b482146105a057806370fd5bad146105b557806375d47a0a146105ca5761027d565b80633dffc387116102455780633dffc3871461041b57806343756e5c14610446578063493279b1146104775780634bf6c882146104a357806351e80672146104b8578063565c56b3146104cd5761027d565b80630bee7a67146102825780631182b875146102b05780631ff18069146103aa578063219f22d5146103d157806335409f7f146103e6575b600080fd5b34801561028e57600080fd5b506102976109ed565b6040805163ffffffff9092168252519081900360200190f35b3480156102bc57600080fd5b50610335600480360360408110156102d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460018302840111600160201b8311171561032a57600080fd5b5090925090506109f2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036f578181015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b657600080fd5b506103bf610bdf565b60408051918252519081900360200190f35b3480156103dd57600080fd5b50610297610be5565b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b0316610bea565b005b34801561042757600080fd5b50610430610efe565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061045b610f03565b604080516001600160a01b039092168252519081900360200190f35b34801561048357600080fd5b5061048c610f09565b6040805161ffff9092168252519081900360200190f35b3480156104af57600080fd5b50610430610f0e565b3480156104c457600080fd5b5061045b610f13565b3480156104d957600080fd5b506103bf600480360360208110156104f057600080fd5b50356001600160a01b0316610f19565b34801561050c57600080fd5b50610430610f6b565b34801561052157600080fd5b50610297610f70565b34801561053657600080fd5b506105546004803603602081101561054d57600080fd5b5035610f75565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156105ac57600080fd5b5061045b610fd9565b3480156105c157600080fd5b50610430610fdf565b3480156105d657600080fd5b5061045b610fe4565b3480156105eb57600080fd5b50610430610fea565b34801561060057600080fd5b50610297610fef565b34801561061557600080fd5b506104196004803603604081101561062c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561065057600080fd5b82018360208201111561066257600080fd5b803590602001918460018302840111600160201b8311171561068357600080fd5b509092509050610ff4565b34801561069a57600080fd5b506103bf6110a7565b3480156106af57600080fd5b506103bf6110ad565b3480156106c457600080fd5b506104306110b3565b3480156106d957600080fd5b5061045b6110b8565b3480156106ee57600080fd5b5061045b6110be565b34801561070357600080fd5b506103356110c4565b34801561071857600080fd5b506107216110e3565b604080519115158252519081900360200190f35b34801561074157600080fd5b506103bf6110ec565b34801561075657600080fd5b50610297610f6b565b34801561076b57600080fd5b506104196004803603604081101561078257600080fd5b810190602081018135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460018302840111600160201b831117156107cf57600080fd5b919390929091602081019035600160201b8111156107ec57600080fd5b8201836020820111156107fe57600080fd5b803590602001918460018302840111600160201b8311171561081f57600080fd5b5090925090506110f5565b34801561083657600080fd5b506103bf6004803603602081101561084d57600080fd5b50356001600160a01b031661139c565b34801561086957600080fd5b506108726113ae565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ae578181015183820152602001610896565b505050509050019250505060405180910390f35b3480156108ce57600080fd5b5061045b6114d4565b3480156108e357600080fd5b506103bf6114da565b3480156108f857600080fd5b506103bf6114e6565b34801561090d57600080fd5b5061045b6114ec565b34801561092257600080fd5b506103bf6114f2565b34801561093757600080fd5b506104196114f7565b34801561094c57600080fd5b506104196004803603602081101561096357600080fd5b50356001600160a01b03166116fa565b34801561097f57600080fd5b506102976118c9565b6104196004803603602081101561099e57600080fd5b50356001600160a01b03166118ce565b3480156109ba57600080fd5b5061045b611b04565b3480156109cf57600080fd5b50610430611b0a565b3480156109e457600080fd5b5061045b611b0f565b606481565b60005460609060ff16610a48576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a885760405162461bcd60e51b815260040180806020018281038252602f815260200180614516602f913960400191505060405180910390fd5b610a90613d69565b6000610ad185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b1592505050565b9150915080610aed57610ae46064611c6e565b92505050610bd8565b815160009060ff16610b0d57610b068360200151611ccf565b9050610ba4565b825160ff1660011415610ba057826020015151600114610b7a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613e6c6025913960400191505060405180910390a1506067610b9b565b610b068360200151600081518110610b8e57fe5b6020026020010151612ad5565b610ba4565b5060655b63ffffffff8116610bc95750506040805160008152602081019091529150610bd89050565b610bd281611c6e565b93505050505b9392505050565b60035481565b606881565b3361100114610c2a5760405162461bcd60e51b81526004018080602001828103825260298152602001806145726029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610c4e5750610efb565b600181039050600060018281548110610c6357fe5b60009182526020909120600360049092020101546001549091506000190180610cb257600060018481548110610c9557fe5b906000526020600020906004020160030181905550505050610efb565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610e3457600180546000198101908110610d2957fe5b906000526020600020906004020160018481548110610d4457fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610e0957fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610e3f57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610e9257fe5b0490508015610ef65760015460005b81811015610ef3578260018281548110610eb757fe5b9060005260206000209060040201600301540160018281548110610ed757fe5b6000918252602090912060036004909202010155600101610ea1565b50505b505050505b50565b600181565b61100181565b603881565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610f41576000915050610f66565b600180820381548110610f5057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610f8257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f815260200180614516602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b6040518061062001604052806105ef8152602001613f276105ef913981565b60005460ff1681565b6402540be40081565b60005460ff16611148576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146111885760405162461bcd60e51b815260040180806020018281038252602e815260200180613e91602e913960400191505060405180910390fd5b6111f284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c4c9050565b156112cd57602081146112365760405162461bcd60e51b8152600401808060200182810382526026815260200180613ee06026913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161127491858580838501838280828437600092019190915250612d3492505050565b90506064811015801561128a5750620186a08111155b6112c55760405162461bcd60e51b8152600401808060200182810382526027815260200180613e456027913960400191505060405180910390fd5b60025561130a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156113ff57600181815481106113cd57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166113f7576001909101905b6001016113b8565b5060608160405190808252806020026020018201604052801561142c578160200160208202803683370190505b50600092509050815b838110156114cc576001818154811061144a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166114c4576001818154811061147a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106114a557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611435565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561154f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611557613d69565b600061157d6040518061062001604052806105ef8152602001613f276105ef9139611b15565b91509150806115bd5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f066021913960400191505060405180910390fd5b60005b8260200151518110156116e2576001836020015182815181106115df57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106116b557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016115c0565b50506103e8600255506000805460ff19166001179055565b336110011461173a5760405162461bcd60e51b81526004018080602001828103825260298152602001806145726029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061175e5750610efb565b60018103905060006001828154811061177357fe5b906000526020600020906004020160030154905060006001838154811061179657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061180557505050610efb565b600081838161181057fe5b0490508015610ef65760005b8481101561186e57816001828154811061183257fe5b906000526020600020906004020160030154016001828154811061185257fe5b600091825260209091206003600490920201015560010161181c565b50600180549085015b81811015610ef357826001828154811061188d57fe5b90600052602060002090600402016003015401600182815481106118ad57fe5b6000918252602090912060036004909202010155600101611877565b606581565b33411461190c5760405162461bcd60e51b815260040180806020018281038252602d815260200180614545602d913960400191505060405180910390fd5b60005460ff1661195f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116119ac576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205434908015611abf5760006001808303815481106119de57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611a49576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611ab9565b600354611a5c908463ffffffff612d3916565b6003908155810154611a74908463ffffffff612d3916565b60038201556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611aff565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611b1d613d69565b6000611b27613d69565b611b2f613d81565b611b40611b3b86612d93565b612db8565b90506000805b611b4f83612e02565b15611c605780611b7457611b6a611b6584612e23565b612e71565b60ff168452611c58565b8060011415611c53576060611b90611b8b85612e23565b612f28565b90508051604051908082528060200260200182016040528015611bcd57816020015b611bba613da1565b815260200190600190039081611bb25790505b50602086015260005b8151811015611c4857611be7613da1565b6000611c05848481518110611bf857fe5b6020026020010151612ff9565b9150915080611c2257876000995099505050505050505050611c69565b8188602001518481518110611c3357fe5b60209081029190910101525050600101611bd6565b506001925050611c58565b611c60565b600101611b46565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611c88579050509050611cae8363ffffffff166130d6565b81600081518110611cbb57fe5b6020026020010181905250610bd8816130e9565b6000806060611cdd84613173565b9150915081611d8a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d45578181015183820152602001611d2d565b50505050905090810190601f168015611d725780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610f66565b600080805b600154811015611e075767016345785d8a000060018281548110611daf57fe5b90600052602060002090600402016003015410611dd157600190920191611dff565b600060018281548110611de057fe5b9060005260206000209060040201600301541115611dff576001909101905b600101611d8f565b50606082604051908082528060200260200182016040528015611e34578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611e63578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611e92578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ec1578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611ef2578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611f21578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051905067016345785d8a000081111561200d577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613ebf6021913960400191505060405180910390a160689d5050505050505050505050505050610f66565b60005b6001548110156122805767016345785d8a00006001828154811061203057fe5b906000526020600020906004020160030154106121b6576001818154811061205457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061208557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106120ba57fe5b906000526020600020906004020160030154816120d357fe5b06600183815481106120e157fe5b906000526020600020906004020160030154039050612109838261325590919063ffffffff16565b8a8e8151811061211557fe5b6020026020010181815250506001828154811061212e57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061215f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061218c57fe5b60209081029190910101526121a7878263ffffffff612d3916565b6001909d019c96506122789050565b6000600182815481106121c557fe5b906000526020600020906004020160030154111561227857600181815481106121ea57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061224857fe5b906000526020600020906004020160030154848c8151811061226657fe5b60209081029190910101526001909a01995b600101612010565b50600085156126be576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156123125781810151838201526020016122fa565b50505050905001848103835287818151815260200191508051906020019060200280838360005b83811015612351578181015183820152602001612339565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015612390578181015183820152602001612378565b505050509050019750505050505050506020604051808303818588803b1580156123b957600080fd5b505af1935050505080156123df57506040513d60208110156123da57600080fd5b505160015b61261a576040516000815260443d10156123fb57506000612496565b60046000803e60005160e01c6308c379a0811461241c576000915050612496565b60043d036004833e81513d60248201116001600160401b038211171561244757600092505050612496565b80830180516001600160401b03811115612468576000945050505050612496565b8060208301013d860181111561248657600095505050505050612496565b601f01601f191660405250925050505b806124a15750612545565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125055781810151838201526020016124ed565b50505050905090810190601f1680156125325780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612615565b3d80801561256f576040519150601f19603f3d011682016040523d82523d6000602084013e612574565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125d95781810151838201526020016125c1565b50505050905090810190601f1680156126065780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6126be565b8015612658576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16126bc565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156128745760005b88518110156128725760008982815181106126de57fe5b602002602001015190506000600182815481106126f757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061272857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156127e4576001828154811061276957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106127b857fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612868565b600182815481106127f157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061284057fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016126c7565b505b8451156129be5760005b85518110156129bc57600086828151811061289557fe5b60200260200101516001600160a01b03166108fc8784815181106128b557fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561294b578682815181106128eb57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061292957fe5b60200260200101516040518082815260200191505060405180910390a26129b3565b86828151811061295757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d87848151811061299557fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161287e565b505b4715612a27576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612a25573d6000803e3d6000fd5b505b60006003819055600555825115612a4157612a4183613297565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612b265750600180820381548110612b0657fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612b6c5782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050610f66565b600154600554600019820111801590612bc25784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050610f66565b600580546001908101909155805481906000198601908110612be057fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612c815780518252601f199092019160209182019101612c62565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612cef5780518252601f199092019160209182019101612cd0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b600082820183811015610bd8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d9b613dd6565b506040805180820190915281518152602082810190820152919050565b612dc0613d81565b612dc98261375e565b612dd257600080fd5b6000612de18360200151613798565b60208085015160408051808201909152868152920190820152915050919050565b6000612e0c613dd6565b505080518051602091820151919092015191011190565b612e2b613dd6565b612e3482612e02565b612e3d57600080fd5b60208201516000612e4d826137fb565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e8657508151602110155b612e8f57600080fd5b6000612e9e8360200151613798565b90508083600001511015612ef9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015612f1f57826020036101000a820491505b50949350505050565b6060612f338261375e565b612f3c57600080fd5b6000612f478361392e565b9050606081604051908082528060200260200182016040528015612f8557816020015b612f72613dd6565b815260200190600190039081612f6a5790505b5090506000612f978560200151613798565b60208601510190506000805b84811015612fee57612fb4836137fb565b9150604051806040016040528083815260200184815250848281518110612fd757fe5b602090810291909101015291810191600101612fa3565b509195945050505050565b613001613da1565b600061300b613da1565b613013613d81565b61301c85612db8565b90506000805b61302b83612e02565b15611c6057806130565761304661304184612e23565b61398a565b6001600160a01b031684526130ce565b806001141561307e5761306b61304184612e23565b6001600160a01b031660208501526130ce565b80600214156130a65761309361304184612e23565b6001600160a01b031660408501526130ce565b8060031415611c53576130bb611b6584612e23565b6001600160401b03166060850152600191505b600101613022565b6060612d2e6130e4836139a4565b613a8a565b606081516000141561310a5750604080516000815260208101909152610f66565b60608260008151811061311957fe5b602002602001015190506000600190505b835181101561315a576131508285838151811061314357fe5b6020026020010151613adc565b915060010161312a565b50610bd861316d825160c060ff16613b59565b82613adc565b600060606029835111156131a5576000604051806060016040528060298152602001613df16029913991509150611c69565b60005b835181101561323b5760005b81811015613232578481815181106131c857fe5b6020026020010151600001516001600160a01b03168583815181106131e957fe5b6020026020010151600001516001600160a01b0316141561322a5760006040518060600160405280602b8152602001613e1a602b9139935093505050611c69565b6001016131b4565b506001016131a8565b505060408051602081019091526000815260019150915091565b6000610bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c51565b600154815160005b828110156133b45760016132b1613da1565b600183815481106132be57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156133885786818151811061334e57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156133805760009250613388565b60010161333a565b5081156133aa5780516001600160a01b03166000908152600460205260408120555b505060010161329f565b508082111561342957805b828110156134275760018054806133d257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b03191690556003909101919091559155016133bf565b505b6000818310613438578161343a565b825b905060005b81811015613634576134ec85828151811061345657fe5b60200260200101516001838154811061346b57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ce8565b61360757806001016004600087848151811061350457fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061354057fe5b60200260200101516001828154811061355557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561362c565b60006001828154811061361657fe5b9060005260206000209060040201600301819055505b60010161343f565b508282111561375857825b82811015610ef657600185828151811061365557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061372b57fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161363f565b50505050565b805160009061376f57506000610f66565b6020820151805160001a9060c082101561378e57600092505050610f66565b5060019392505050565b8051600090811a60808110156137b2576000915050610f66565b60b88110806137cd575060c081108015906137cd575060f881105b156137dc576001915050610f66565b60c08110156137f05760b519019050610f66565b60f519019050610f66565b80516000908190811a60808110156138165760019150613927565b60b881101561382b57607e1981019150613927565b60c08110156138a557600060b78203600186019550806020036101000a86510491506001810182019350508083101561389f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613927565b60f88110156138ba5760be1981019150613927565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613925576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061393f57506000610f66565b600080905060006139538460200151613798565b602085015185519181019250015b8082101561398157613972826137fb565b60019093019290910190613961565b50909392505050565b805160009060151461399b57600080fd5b612d2e82612e71565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166139e857506018613a0c565b6fffffffffffffffffffffffffffffffff198416613a0857506010613a0c565b5060005b6020811015613a4257818181518110613a2157fe5b01602001516001600160f81b03191615613a3a57613a42565b600101613a0c565b60008160200390506060816040519080825280601f01601f191660200182016040528015613a77576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613abc5750607f60f81b82600081518110613aaa57fe5b01602001516001600160f81b03191611155b15613ac8575080610f66565b612d2e613ada8351608060ff16613b59565b835b6060806040519050835180825260208201818101602087015b81831015613b0d578051835260209283019201613af5565b50855184518101855292509050808201602086015b81831015613b3a578051835260209283019201613b22565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613ba9576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613c035782840160f81b81600081518110613be557fe5b60200101906001600160f81b031916908160001a9053509050612d2e565b6060613c0e856139a4565b90508381510160370160f81b82600081518110613c2757fe5b60200101906001600160f81b031916908160001a905350613c488282613adc565b95945050505050565b60008184841115613ce05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ca5578181015183820152602001613c8d565b50505050905090810190601f168015613cd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613d22575081602001516001600160a01b031683602001516001600160a01b0316145b8015613d47575081604001516001600160a01b031683604001516001600160a01b0316145b8015610bd85750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613d94613dd6565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d69746475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220f4016eb3755efa2abde797b21f8695280d971b0fea37198122d2e5867516da0464736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001001": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063831d65d111610130578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a146106d9578063f9a2bbc7146106e1578063fc3e5908146106e9578063fc4333cd146106f1578063fd6a6879146106f957610227565b8063c80d4b8f14610623578063c81b16621461062b578063c8509d8114610633578063c96be4cb146106ab578063dc927faf146106d157610227565b8063a1a11bf5116100ff578063a1a11bf514610531578063a78abc1614610539578063ab51bb9614610555578063ac0af6291461055d578063ac4317511461056557610227565b8063831d65d11461049f57806396713da9146105195780639bc8e4f2146105215780639dc092621461052957610227565b80634bf6c882116101b35780636e47b482116101825780636e47b4821461047757806370fd5bad1461047f57806375d47a0a146104875780637912a65d1461048f5780637942fd051461049757610227565b80634bf6c8821461045757806351e806721461045f578063567a372d1461046757806362b72cf51461046f57610227565b806337c8dab9116101fa57806337c8dab9146103b9578063389f4f71146103f85780633dffc3871461041257806343756e5c14610430578063493279b11461043857610227565b80630bee7a671461022c5780631182b8751461024d57806323bac5a21461033a57806335aa2e4414610380575b600080fd5b610234610701565b6040805163ffffffff9092168252519081900360200190f35b6102c56004803603604081101561026357600080fd5b60ff8235169190810190604081016020820135600160201b81111561028757600080fd5b82018360208201111561029957600080fd5b803590602001918460018302840111600160201b831117156102ba57600080fd5b509092509050610706565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103606004803603602081101561035057600080fd5b50356001600160a01b03166107da565b604080519384526020840192909252151582820152519081900360600190f35b61039d6004803603602081101561039657600080fd5b50356107fd565b604080516001600160a01b039092168252519081900360200190f35b6103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610824565b6040805192835260208301919091528051918290030190f35b61040061087b565b60408051918252519081900360200190f35b61041a610881565b6040805160ff9092168252519081900360200190f35b61039d610886565b61044061088c565b6040805161ffff9092168252519081900360200190f35b61041a610891565b61039d610896565b61040061089c565b6104006108a2565b61039d6108a8565b61041a6108ae565b61039d6108b3565b6104006108b9565b61041a6108be565b610517600480360360408110156104b557600080fd5b60ff8235169190810190604081016020820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460018302840111600160201b8311171561050c57600080fd5b5090925090506108c3565b005b61041a610a1e565b610400610a23565b61039d610a2e565b61039d610a34565b610541610a3a565b604080519115158252519081900360200190f35b610234610a43565b610400610a48565b6105176004803603604081101561057b57600080fd5b810190602081018135600160201b81111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111600160201b831117156105c857600080fd5b919390929091602081019035600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460018302840111600160201b8311171561061857600080fd5b509092509050610a4d565b610400610e3b565b61039d610e40565b6105176004803603604081101561064957600080fd5b60ff8235169190810190604081016020820135600160201b81111561066d57600080fd5b82018360208201111561067f57600080fd5b803590602001918460018302840111600160201b831117156106a057600080fd5b509092509050610e46565b610517600480360360208110156106c157600080fd5b50356001600160a01b0316610ef9565b61039d61131e565b610517611324565b61039d611395565b61041a61139b565b6105176113a0565b61039d61182b565b606481565b606033612000146107485760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff1661078d576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061080a57fe5b6000918252602090912001546001600160a01b0316905081565b60008061082f612146565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b603881565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b33612000146109035760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610948576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b610950612169565b600061099184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183192505050565b9150915080156109db5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a17565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610a92576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b3361100714610ad25760405162461bcd60e51b815260040180806020018281038252602e81526020018061220d602e913960400191505060405180910390fd5b610b3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506118b19050565b15610c165760208114610b815760405162461bcd60e51b81526004018080602001828103825260278152602001806121b66027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610bbf9185858083850183828082843760009201919091525061199992505050565b905060018110158015610bd3575060055481105b610c0e5760405162461bcd60e51b815260040180806020018281038252602581526020018061225d6025913960400191505060405180910390fd5b600455610da9565b610c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506118b19050565b15610d6c5760208114610cc05760405162461bcd60e51b815260040180806020018281038252602281526020018061223b6022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610cfe9185858083850183828082843760009201919091525061199992505050565b90506103e88111158015610d13575060045481115b610d64576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610da9565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b3361200014610e865760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610ecb576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610f375760405162461bcd60e51b815260040180806020018281038252602d8152602001806122b1602d913960400191505060405180910390fd5b60005460ff16610f7c576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6003544311610fd2576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a1561101c576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b611024612146565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061107f5760208101805160010190526110d8565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526005546020820151816110ea57fe5b0661123c57600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6111718561199e565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111d15781810151838201526020016111b9565b50505050905090810190601f1680156111fe5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506112b2565b60045481602001518161124b57fe5b066112b257604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505043600355565b61100381565b60005460ff161561137c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146113e05760405162461bcd60e51b81526004018080602001828103825260308152602001806121dd6030913960400191505060405180910390fd5b60005460ff16611425576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b60015461143157611829565b600154600090600019015b8082116117fd576000805b8284101561156057611457612146565b600260006001878154811061146857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561154a576004600554816114d557fe5b048160200151038160200181815250508060026000600188815481106114f757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611554565b6001925050611560565b50600190930192611447565b8284116116f75761156f612146565b600260006001868154811061158057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611668576004600554816115ed57fe5b0481602001510381602001818152505080600260006001878154811061160f57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506116f79050565b600260006001868154811061167957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806116bd57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836116ea57506116f7565b5060001990920191611560565b8180156117015750805b156117e057600260006001868154811061171757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061175e57fe5b600091825260209091200154600180546001600160a01b03909216918690811061178457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806117bd57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826117ec5750506117fd565b50506001909101906000190161143c565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b611839612169565b6000611843612169565b61184b61217b565b61185c61185786611a70565b611a95565b90506000805b61186b83611adf565b156118a457806118975761188661188184611b00565b611b4e565b63ffffffff1684526001915061189c565b6118a4565b600101611862565b5091935090915050915091565b6000816040516020018082805190602001908083835b602083106118e65780518252601f1990920191602091820191016118c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106119545780518252601f199092019160209182019101611935565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816119b95790505090506119e2836001600160a01b0316611c05565b816000815181106119ef57fe5b6020026020010181905250611a0343611c28565b81600181518110611a1057fe5b6020908102919091010152611a256038611c28565b81600281518110611a3257fe5b6020026020010181905250611a4642611c28565b81600381518110611a5357fe5b6020026020010181905250611a6781611c3b565b9150505b919050565b611a7861219b565b506040805180820190915281518152602082810190820152919050565b611a9d61217b565b611aa682611cc5565b611aaf57600080fd5b6000611abe8360200151611cff565b60208085015160408051808201909152868152920190820152915050919050565b6000611ae961219b565b505080518051602091820151919092015191011190565b611b0861219b565b611b1182611adf565b611b1a57600080fd5b60208201516000611b2a82611d62565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611b6357508151602110155b611b6c57600080fd5b6000611b7b8360200151611cff565b90508083600001511015611bd6576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611bfc57826020036101000a820491505b50949350505050565b60408051600560a21b8318601482015260348101909152606090611a6781611e95565b6060611993611c3683611eeb565b611e95565b6060815160001415611c5c5750604080516000815260208101909152611a6b565b606082600081518110611c6b57fe5b602002602001015190506000600190505b8351811015611cac57611ca282858381518110611c9557fe5b6020026020010151611fd1565b9150600101611c7c565b50611a67611cbf825160c060ff1661204e565b82611fd1565b8051600090611cd657506000611a6b565b6020820151805160001a9060c0821015611cf557600092505050611a6b565b5060019392505050565b8051600090811a6080811015611d19576000915050611a6b565b60b8811080611d34575060c08110801590611d34575060f881105b15611d43576001915050611a6b565b60c0811015611d575760b519019050611a6b565b60f519019050611a6b565b80516000908190811a6080811015611d7d5760019150611e8e565b60b8811015611d9257607e1981019150611e8e565b60c0811015611e0c57600060b78203600186019550806020036101000a865104915060018101820193505080831015611e06576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611e8e565b60f8811015611e215760be1981019150611e8e565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611e8c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b606081516001148015611ec75750607f60f81b82600081518110611eb557fe5b01602001516001600160f81b03191611155b15611ed3575080611a6b565b611993611ee58351608060ff1661204e565b83611fd1565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f2f57506018611f53565b6fffffffffffffffffffffffffffffffff198416611f4f57506010611f53565b5060005b6020811015611f8957818181518110611f6857fe5b01602001516001600160f81b03191615611f8157611f89565b600101611f53565b60008160200390506060816040519080825280601f01601f191660200182016040528015611fbe576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612002578051835260209283019201611fea565b50855184518101855292509050808201602086015b8183101561202f578051835260209283019201612017565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061209e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116120f85782840160f81b816000815181106120da57fe5b60200101906001600160f81b031916908160001a9053509050611993565b606061210385611eeb565b90508381510160370160f81b8260008151811061211c57fe5b60200101906001600160f81b031916908160001a90535061213d8282611fd1565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061218e61219b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a2646970667358221220978db7b9b4e7fb0a1f9436afd2b57418fb3ba1969a491794d2da96ee68de87d064736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001002": { + "balance": "0x0", + "code": "0x60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b603881565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a8602b913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f64a2646970667358221220c09e2c37549a0aef291c4f977743d3cea839c669624a8cfae895b3979a32800764736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001003": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139b565b61027f6113b6565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bc565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113e0565b61052a611422565b6106656115c9565b604080516001600160401b039092168252519081900360200190f35b6106656115d8565b6102d26115ee565b61027f61160d565b610261611613565b61027f611618565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b603881565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806119ea602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061161e9050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611989602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170592505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611a18602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611a476026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611867565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e5957506003546001600160401b0390811690831610155b15610f3a5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f2a5780601f10610eff57610100808354040283529160200191610f2a565b820191906000526020600020905b815481529060010190602001808311610f0d57829003601f168201915b5050505050815250509050610e28565b6060810151516110315780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b505050506060830182905250516110315760405162461bcd60e51b81526004018080602001828103825260218152602001806119686021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611070576020820181803683370190505b509050600061107e8261170a565b905061108c84868386611710565b6110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806119456023913960400191505060405180910390fd5b6000838201915061110d8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177c92505050565b9450905061111c818386611786565b8251602001935061112b61188d565b6110008186866064600019fa61114057600080fd5b805194506000600160f81b8616156111cf5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b505050506040513d60208110156111cc57600080fd5b50505b856001600160401b0316955060208201935060006111ef858884156117c7565b90985090506001600160401b03808216908c161461123e5760405162461bcd60e51b81526004018080602001828103825260338152602001806119b76033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c59260038501929101906118ac565b50506003546001600160401b03600160401b9091048116908d161115905061130d576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141c57506003546001600160401b038381169116145b92915050565b60005460ff161561147a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b6000806114a16040518061024001604052806102208152602001611a6d610220913961177c565b815160045590925090506114b3611867565b60006114c1848460006117c7565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152d9260038501929101906118ac565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518061024001604052806102208152602001611a6d610220913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b602083106116535780518252601f199092019160209182019101611634565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116c15780518252601f1990920191602091820191016116a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061172e876060015161177c565b909250905061173e828683611786565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a6578251825260209283019290910190601f1901611787565b915181516020939093036101000a6000190180199091169216919091179052565b6117cf611867565b60088401516028850151604890950180519095600092916117ee611867565b6020810183905260408101829052866118595760008060688a036040519080825280601f01601f191660200182016040528015611832576020820181803683370190505b50606084018190526118439061177c565b909250905061185660208c018383611786565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118ed57805160ff191683800117855561191a565b8280016001018555821561191a579182015b8281111561191a5782518255916020019190600101906118ff565b5061192692915061192a565b5090565b6107e391905b80821115611926576000815560010161193056fe6661696c656420746f2073657269616c697a6520636f6e73656e7375732073746174656661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c48656967687442696e616e63652d436861696e2d5469677269730000000000000000000000000000000006915167cedaf7bbf7df47d932fdda630527ee648562cf3e52c5e5f46156a3a971a4ceb443c53a50d8653ef8cf1e5716da68120fb51b636dc6d111ec3277b098ecd42d49d3769d8a1f78b4c17a965f7a30d4181fabbd1f969f46d3c8e83b5ad4845421d8000000e8d4a510002ba4e81542f437b7ae1f8a35ddb233c789a8dc22734377d9b6d63af1ca403b61000000e8d4a51000df8da8c5abfdb38595391308bb71e5a1e0aabdc1d0cf38315d50d6be939b2606000000e8d4a51000b6619edca4143484800281d698b70c935e9152ad57b31d85c05f2f79f64b39f3000000e8d4a510009446d14ad86c8d2d74780b0847110001a1c2e252eedfea4753ebbbfce3a22f52000000e8d4a510000353c639f80cc8015944436dab1032245d44f912edc31ef668ff9f4a45cd0599000000e8d4a51000e81d3797e0544c3a718e1f05f0fb782212e248e784c1a851be87e77ae0db230e000000e8d4a510005e3fcda30bd19d45c4b73688da35e7da1fce7c6859b2c1f20ed5202d24144e3e000000e8d4a51000b06a59a2d75bf5d014fce7c999b5e71e7a960870f725847d4ba3235baeaa08ef000000e8d4a510000c910e2fe650e4e01406b3310b489fb60a84bc3ff5c5bee3a56d5898b6a8af32000000e8d4a5100071f2d7b8ec1c8b99a653429b0118cd201f794f409d0fea4d65b1b662f2b00063000000e8d4a51000a264697066735822122032fc162aed7c2a4fe0f40397d327efc38d8aaf5dbdd1720f7f5d8101877da61d64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001004": { + "balance": "176405560900000000000000000", + "code": "0x60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610686578063fd6a687914610ce6578063ff9c0027146107dc57610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f01461091e5780639dc0926214610957578063a1a11bf51461096c578063a496fba214610981578063a78abc1614610996578063a7c9f02d1461068657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108b557806396713da9146108f45780639a854bbd1461090957610366565b806375d47a0a146108065780637942fd051461081b578063831d65d11461083057610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad146107dc57806371d30863146107f157610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e74565b34801561062957600080fd5b506104a8610e79565b34801561063e57600080fd5b5061056b610e84565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104a8610ea5565b34801561069257600080fd5b5061059c610eae565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb3565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611388565b3480156107e857600080fd5b5061059c61138e565b3480156107fd57600080fd5b506104a8611393565b34801561081257600080fd5b5061056b611399565b34801561082757600080fd5b5061059c61139f565b34801561083c57600080fd5b506103646004803603604081101561085357600080fd5b60ff8235169190810190604081016020820135600160201b81111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460018302840111600160201b831117156108aa57600080fd5b5090925090506113a4565b3480156108c157600080fd5b50610364600480360360608110156108d857600080fd5b508035906001600160a01b0360208201351690604001356114ed565b34801561090057600080fd5b5061059c611573565b34801561091557600080fd5b506104a8611578565b34801561092a57600080fd5b506104a86004803603604081101561094157600080fd5b506001600160a01b038135169060200135611584565b34801561096357600080fd5b5061056b6116c2565b34801561097857600080fd5b5061056b6116c8565b34801561098d57600080fd5b5061059c6116ce565b3480156109a257600080fd5b506107b36116d3565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dc565b3480156109fe57600080fd5b506103806116ce565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9d565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200c565b348015610b1757600080fd5b506104a8612082565b348015610b2c57600080fd5b506104a861208c565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612092565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b5061056b6120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b5061056b612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061059c61223b565b348015610c8057600080fd5b5061059c612240565b348015610c9557600080fd5b5061056b612245565b348015610caa57600080fd5b506104a861224b565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b5061056b612378565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b603881565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600381565b6000805460ff16610ef9576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b868514610f375760405162461bcd60e51b815260040180806020018281038252603b815260200180614732603b913960400191505060405180910390fd5b868314610f755760405162461bcd60e51b815260040180806020018281038252603f815260200180614605603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc15760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156110055760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611038578160200160208202803683370190505b50905060005b84811015611113576402540be4008b8b8381811061105857fe5b905060200201358161106657fe5b06156110a35760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6110c88b8b838181106110b257fe5b90506020020135856124a290919063ffffffff16565b93506110f46402540be4008c8c848181106110df57fe5b905060200201356124fc90919063ffffffff16565b82828151811061110057fe5b602090810291909101015260010161103e565b506001546111389061112b908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111765760405162461bcd60e51b81526004018080602001828103825260568152602001806147df6056913960600191505060405180910390fd5b611186348463ffffffff61259716565b915061119061434e565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611254846125d9565b611269876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c75781810151838201526020016112af565b50505050905090810190601f1680156112f45780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff166113e9576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33612000146114295760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114795761147482828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e8565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b336110081461152d5760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115ca576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336110051461160a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614468602f913960400191505060405180910390fd5b6000478310611619574761161b565b825b9050670de0b6b3a76400008111156116375760009150506116bc565b80156116b9576040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015611673573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b6000805460ff16611722576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176e5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156117b25760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b600080806001600160a01b038816611891576001546117d890879063ffffffff6124a216565b3410156118165760405162461bcd60e51b815260040180806020018281038252606181526020018061457f6061913960800191505060405180910390fd5b6402540be40086061561185a5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b61186a348763ffffffff61259716565b9050611881866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b34565b6001600160a01b0388166000908152600360205260409020549250826118e85760405162461bcd60e51b815260040180806020018281038252603181526020018061454e6031913960400191505060405180910390fd5b6001543410156119295760405162461bcd60e51b815260040180806020018281038252603f8152602001806146a1603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197457506008811180156119745750611972876007198301600a0a63ffffffff6128f016565b155b6119af5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6119b98782612932565b92506119c484612972565b15611a0c576305f5e100831015611a0c5760405162461bcd60e51b815260040180806020018281038252603a815260200180614497603a913960400191505060405180910390fd5b600881101580611a265750600881108015611a2657508683115b611a615760405162461bcd60e51b81526004018080602001828103825260258152602001806145e06025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa85760405162461bcd60e51b81526004018080602001828103825260358152602001806145196035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3257600080fd5b505b611b3c61434e565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bea57fe5b602002602001018181525050878160600151600081518110611c0857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3a57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c65846125d9565b611c7a866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd8578181015183820152602001611cc0565b50505050905090810190601f168015611d055780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611ddd5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146e0602e913960400191505060405180910390fd5b60208114611e32576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3a576020820151670de0b6b3a76400008111801590611ee157506402540be4008106155b611f32576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f77565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204c5760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114795761147482828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b606061238861439a565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143cf565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116bc565b8282028284828161255a57fe5b04146116b95760405162461bcd60e51b81526004018080602001828103825260218152602001806146806021913960400191505060405180910390fd5b60006116b983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143f6565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b815260040180806020018281038252602481526020018061470e6024913960400191505060405180910390fd5b6114e882613465565b60006116b983836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116bc565b6116b9836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600860ff82161015612a0057600092505050610e53565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e53565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e53565b5060019392505050565b612a8061434e565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612ad36143f6565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613bc6565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e61439a565b6000612b8861439a565b612b9061442d565b612ba1612b9c86613bff565b613c24565b90506000805b612bb083613c6e565b15612ca85780612bd257612bcb612bc684613c8f565b613cdd565b8452612ca0565b8060011415612bff57612bec612be784613c8f565b613d94565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c8f565b6040850152612ca0565b8060031415612c4657612c33612be784613c8f565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c8f565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c8f565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e53565b8160400151471015612cfc57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0a57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2781613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116bc6131e883613dae565b613e94565b60408051600560a21b8318601482015260348101909152606090610e2781613e94565b60608151600014156132315750604080516000815260208101909152610e53565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ee6565b9150600101613251565b50610e27613294825160c060ff16613f63565b82613ee6565b6132a26143f6565b60006132ac6143f6565b6132b461442d565b6132c0612b9c86613bff565b90506000805b6132cf83613c6e565b15612ca857806132f5576132e5612be784613c8f565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c8f565b61405b565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cdd565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c8f565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d94565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c8f565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b61395361434e565b600061395d61434e565b61396561442d565b613971612b9c86613bff565b90506000805b61398083613c6e565b15613bb8578061399d57613996612bc684613c8f565b8452613bb0565b80600114156139c5576139b2612be784613c8f565b6001600160a01b03166020850152613bb0565b8060021415613a545760606139dc61330c85613c8f565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613bb0565b8060031415613ae9576060613a6b61330c85613c8f565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c8f565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415613bab57613b93612bc684613c8f565b67ffffffffffffffff1660a085015260019150613bb0565b613bb8565b600101613977565b509195600195509350505050565b60006008821115613be857612954836007198401600a0a63ffffffff61253e16565b6116b9836008849003600a0a63ffffffff6124fc16565b613c0761444d565b506040805180820190915281518152602082810190820152919050565b613c2c61442d565b613c358261412c565b613c3e57600080fd5b6000613c4d836020015161415c565b60208085015160408051808201909152868152920190820152915050919050565b6000613c7861444d565b505080518051602091820151919092015191011190565b613c9761444d565b613ca082613c6e565b613ca957600080fd5b60208201516000613cb9826141bf565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cf257508151602110155b613cfb57600080fd5b6000613d0a836020015161415c565b90508083600001511015613d65576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d8b57826020036101000a820491505b50949350505050565b8051600090601514613da557600080fd5b6116bc82613cdd565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613df257506018613e16565b6fffffffffffffffffffffffffffffffff198416613e1257506010613e16565b5060005b6020811015613e4c57818181518110613e2b57fe5b01602001516001600160f81b03191615613e4457613e4c565b600101613e16565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ec65750607f60f81b82600081518110613eb457fe5b01602001516001600160f81b03191611155b15613ed2575080610e53565b6116bc613ee48351608060ff16613f63565b835b6060806040519050835180825260208201818101602087015b81831015613f17578051835260209283019201613eff565b50855184518101855292509050808201602086015b81831015613f44578051835260209283019201613f2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613fb3576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161400d5782840160f81b81600081518110613fef57fe5b60200101906001600160f81b031916908160001a90535090506116bc565b606061401885613dae565b90508381510160370160f81b8260008151811061403157fe5b60200101906001600160f81b031916908160001a9053506140528282613ee6565b95945050505050565b60606140668261412c565b61406f57600080fd5b600061407a836142f2565b90506060816040519080825280602002602001820160405280156140b857816020015b6140a561444d565b81526020019060019003908161409d5790505b50905060006140ca856020015161415c565b60208601510190506000805b84811015614121576140e7836141bf565b915060405180604001604052808381526020018481525084828151811061410a57fe5b6020908102919091010152918101916001016140d6565b509195945050505050565b805160009061413d57506000610e53565b6020820151805160001a9060c0821015612a6e57600092505050610e53565b8051600090811a6080811015614176576000915050610e53565b60b8811080614191575060c08110801590614191575060f881105b156141a0576001915050610e53565b60c08110156141b45760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141da57600191506142eb565b60b88110156141ef57607e19810191506142eb565b60c081101561426957600060b78203600186019550806020036101000a865104915060018101820193505080831015614263576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142eb565b60f881101561427e5760be19810191506142eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061430357506000610e53565b60008090506000614317846020015161415c565b602085015185519181019250015b8082101561434557614336826141bf565b60019093019290910190614325565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061444061444d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea26469706673582212200ed3b493edce71fd9235e1f674e51718f846ead6af3ed00debad31d4e3d4dc5f64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001005": { + "balance": "0x0", + "code": "0x6080604052600436106102765760003560e01c80637e146cc51161014f578063af400681116100c1578063e75d72c71161007a578063e75d72c714610795578063e89a3020146107c8578063f9a2bbc7146107f2578063fc3e590814610807578063fd6a68791461081c578063fdd31fcd146108315761027d565b8063af400681146106ed578063bd4cc83014610717578063c81b166214610741578063dc927faf14610756578063dcae76ab1461076b578063e1c7392a146107805761027d565b8063a3c3c0ad11610113578063a3c3c0ad146105b3578063a78abc16146105c8578063a7c6a59d146105dd578063ab51bb96146105f2578063ac43175114610607578063ace9fcc2146106d85761027d565b80637e146cc51461052c578063930e1b091461054157806396713da9146105745780639dc0926214610589578063a1a11bf51461059e5761027d565b806343756e5c116101e85780636e47b482116101ac5780636e47b482146104645780636f93d2e61461047957806370fd5bad146104d857806374f2272d146104ed57806375d47a0a146105025780637942fd05146105175761027d565b806343756e5c146103e4578063493279b1146103f95780634bf6c8821461042557806351e806721461043a578063541333071461044f5761027d565b806312950c461161023a57806312950c46146103165780631b20087c1461032b5780631c643312146103405780633a975612146102825780633dffc3871461038657806340bb43c0146103b15761027d565b8063081e9d131461028257806308f2ec06146102a9578063093f2fc4146102be5780630bee7a67146102d357806310e06a76146103015761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610864565b60408051918252519081900360200190f35b3480156102b557600080fd5b50610297610869565b3480156102ca57600080fd5b5061029761086e565b3480156102df57600080fd5b506102e8610873565b6040805163ffffffff9092168252519081900360200190f35b34801561030d57600080fd5b50610297610878565b34801561032257600080fd5b5061029761087e565b34801561033757600080fd5b50610297610884565b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b503561088a565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b5061039b610864565b6040805160ff9092168252519081900360200190f35b3480156103bd57600080fd5b50610297600480360360208110156103d457600080fd5b50356001600160a01b03166108b1565b3480156103f057600080fd5b5061036a6108c3565b34801561040557600080fd5b5061040e6108c9565b6040805161ffff9092168252519081900360200190f35b34801561043157600080fd5b5061039b6108ce565b34801561044657600080fd5b5061036a6108d3565b34801561045b57600080fd5b50610297610873565b34801561047057600080fd5b5061036a6108d9565b34801561048557600080fd5b506104c46004803603608081101561049c57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108df565b604080519115158252519081900360200190f35b3480156104e457600080fd5b5061039b610cad565b3480156104f957600080fd5b50610297610cb2565b34801561050e57600080fd5b5061036a610cb8565b34801561052357600080fd5b5061039b610cbe565b34801561053857600080fd5b50610297610cc3565b34801561054d57600080fd5b506102976004803603602081101561056457600080fd5b50356001600160a01b0316610cc8565b34801561058057600080fd5b5061039b610cda565b34801561059557600080fd5b5061036a610cdf565b3480156105aa57600080fd5b5061036a610ce5565b3480156105bf57600080fd5b50610297610ceb565b3480156105d457600080fd5b506104c4610cf1565b3480156105e957600080fd5b50610297610cfa565b3480156105fe57600080fd5b506102e8610d00565b34801561061357600080fd5b506106d66004803603604081101561062a57600080fd5b81019060208101813564010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91939092909160208101903564010000000081111561069757600080fd5b8201836020820111156106a957600080fd5b803590602001918460018302840111640100000000831117156106cb57600080fd5b509092509050610d05565b005b3480156106e457600080fd5b50610297611354565b3480156106f957600080fd5b506102976004803603602081101561071057600080fd5b503561135a565b34801561072357600080fd5b506102976004803603602081101561073a57600080fd5b50356113b5565b34801561074d57600080fd5b5061036a6113ce565b34801561076257600080fd5b5061036a6113d4565b34801561077757600080fd5b506102976113da565b34801561078c57600080fd5b506106d66113e0565b3480156107a157600080fd5b506106d6600480360360208110156107b857600080fd5b50356001600160a01b03166114a9565b3480156107d457600080fd5b5061036a600480360360208110156107eb57600080fd5b5035611602565b3480156107fe57600080fd5b5061036a61160f565b34801561081357600080fd5b5061039b611615565b34801561082857600080fd5b5061036a61161a565b34801561083d57600080fd5b506102976004803603602081101561085457600080fd5b50356001600160a01b0316611620565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b6006818154811061089757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200081565b61100581565b6000805460ff16610937576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f815260200180612164602f913960400191505060405180910390fd5b600082156109fc57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050506040513d60208110156109f357600080fd5b50519050610a75565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a4657600080fd5b505af1158015610a5a573d6000803e3d6000fd5b505050506040513d6020811015610a7057600080fd5b505190505b600c805460010190556000610a8982611632565b600954909150610a9f908263ffffffff61166116565b600955600a54610ac7908290610abb908563ffffffff61166116565b9063ffffffff6116c216565b600a556001600160a01b038716600090815260056020526040902054610b3357600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610bb157600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610ca057600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610c2b611704565b90506000610c376119e8565b6001600160a01b0389166000908152600d6020526040902054909150610c75908290610c69908563ffffffff61166116565b9063ffffffff61166116565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610d455760405162461bcd60e51b815260040180806020018281038252602e8152602001806120a9602e913960400191505060405180910390fd5b60005460ff16610d865760405162461bcd60e51b81526004018080602001828103825260218152602001806120d76021913960400191505060405180910390fd5b610dfa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611c669050565b15610ec75760208114610e3e5760405162461bcd60e51b81526004018080602001828103825260328152602001806121936032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610e7c91858580838501838280828437600092019190915250611d4d92505050565b9050600254811115610ebf5760405162461bcd60e51b8152600401808060200182810382526060815260200180611f826060913960600191505060405180910390fd5b6001556112c2565b610f2084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506120876020830139611c66565b15610ff85760208114610f645760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fa291858580838501838280828437600092019190915250611d4d92505050565b90508015801590610fb557506001548110155b610ff05760405162461bcd60e51b815260040180806020018281038252606c8152602001806120f8606c913960800191505060405180910390fd5b6002556112c2565b61106c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611c669050565b1561113957602081146110b05760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110ee91858580838501838280828437600092019190915250611d4d92505050565b90506004548111156111315760405162461bcd60e51b8152600401808060200182810382526056815260200180611fe26056913960600191505060405180910390fd5b6003556112c2565b6111ad84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611c669050565b1561128557602081146111f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161122f91858580838501838280828437600092019190915250611d4d92505050565b9050801580159061124257506003548110155b61127d5760405162461bcd60e51b8152600401808060200182810382526061815260200180611f216061913960800191505060405180910390fd5b6004556112c2565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161136b5750806113b0565b81602810801561137c575060508211155b15611389575060286113b0565b60508211801561139a5750606e8211155b156113aa575060788190036113b0565b50600481045b919050565b6000602882116113c65750806113b0565b5060286113b0565b61100281565b61100381565b60095481565b60005460ff1615611438576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611486576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480611508576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506115b85760405161100290819084156108fc029085906000818181858888f19350505050158015611572573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506115ff565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061089757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600061165b60025461164f60015485611d5290919063ffffffff16565b9063ffffffff611dab16565b92915050565b6000828201838110156116bb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006116bb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ded565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561176057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611742575b5050505050905060608151604051908082528060200260200182016040528015611794578160200160208202803683370190505b50905060005b82518110156118215760008382815181106117b157fe5b6020026020010151905060006117eb60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546113b5565b9050808484815181106117fa57fe5b6020908102919091010152611815868263ffffffff61166116565b9550505060010161179a565b50600061183f60045461164f60035488611d5290919063ffffffff16565b9050611851858263ffffffff6116c216565b94508460015b845181101561192857600061188c8761164f8a88868151811061187657fe5b6020026020010151611d5290919063ffffffff16565b90506118d981600d60008986815181106118a257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461166190919063ffffffff16565b600d60008885815181106118e957fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205561191d838263ffffffff6116c216565b925050600101611857565b5061193e81600d6000876000815181106118a257fe5b600d60008660008151811061194f57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b84518110156119d057600560008683815181106119a257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611989565b506119dd60066000611ee9565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611a4457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a26575b5050505050905060608151604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905060005b8251811015611af7576000838281518110611a9557fe5b602002602001015190506000611acf60076000846001600160a01b03166001600160a01b031681526020019081526020016000205461135a565b905080848481518110611ade57fe5b6020908102919091010152949094019350600101611a7e565b506000611b1560045461164f60035488611d5290919063ffffffff16565b9050611b27858263ffffffff6116c216565b94508460015b8451811015611bb1576000611b4c8761164f8a88868151811061187657fe5b9050611b6281600d60008986815181106118a257fe5b600d6000888581518110611b7257fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611ba6838263ffffffff6116c216565b925050600101611b2d565b50611bc781600d6000876000815181106118a257fe5b600d600086600081518110611bd857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611c595760076000868381518110611c2b57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611c12565b506119dd60086000611ee9565b6000816040516020018082805190602001908083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611d095780518252601f199092019160209182019101611cea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611d615750600061165b565b82820282848281611d6e57fe5b04146116bb5760405162461bcd60e51b81526004018080602001828103825260218152602001806120666021913960400191505060405180910390fd5b60006116bb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e84565b60008184841115611e7c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e41578181015183820152602001611e29565b50505050905090810190601f168015611e6e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611ed35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e41578181015183820152602001611e29565b506000838581611edf57fe5b0495945050505050565b50805460008255906000526020600020908101906115ff91906119e591905b80821115611f1c5760008155600101611f08565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220cd7c1ec8296551de0c54d97959872d6570445d6b1250fde9150f66f3ae10dc7164736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001006": { + "balance": "0x0", + "code": "0x6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b5061021461077d565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610782565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b50610270610788565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b5061021461078d565b3480156102a857600080fd5b5061023f610792565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b0316610798565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d6107b6565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f6107bc565b34801561034057600080fd5b506102146107c2565b34801561035557600080fd5b5061023f6107c7565b34801561036a57600080fd5b506102146107cd565b34801561037f57600080fd5b5061030d6107d2565b34801561039457600080fd5b5061030d6107df565b3480156103a957600080fd5b506102146107eb565b3480156103be57600080fd5b5061023f6107f0565b3480156103d357600080fd5b5061023f6107f6565b3480156103e857600080fd5b506102e46107fc565b3480156103fd57600080fd5b506101dc610805565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b50909250905061080a565b3480156104e157600080fd5b5061023f610c2c565b3480156104f657600080fd5b5061023f610c32565b34801561050b57600080fd5b506101fd610c38565b34801561052057600080fd5b506101fd610cba565b34801561053557600080fd5b5061023f610e73565b34801561054a57600080fd5b5061030d610e79565b34801561055f57600080fd5b50610214610e7f565b34801561057457600080fd5b5061023f610e84565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e8a565b156106775760405162461bcd60e51b815260040180806020018281038252602781526020018061109c6027913960400191505060405180910390fd5b3332146106c1576040805162461bcd60e51b81526020600482015260136024820152721b9bc81c1c9bde1e481a5cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60015434146107015760405162461bcd60e51b81526004018080602001828103825260258152602001806110776025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b603881565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661085d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461089d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110c3602e913960400191505060405180910390fd5b61090384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e909050565b15610a0657602081146109475760405162461bcd60e51b81526004018080602001828103825260228152602001806110f16022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161098591858580838501838280828437600092019190915250610f7792505050565b90506001811180156109a05750683635c9adc5dea000008111155b80156109ad575060025481115b6109fe576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b9a565b610a6184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e909050565b15610b5d5760208114610abb576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610af991858580838501838280828437600092019190915250610f7792505050565b9050600081118015610b0c575060015481105b610b55576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b9a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c90576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610d15576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d68576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d7061105c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610db4919063ffffffff610f7c16565b6040518115909202916000818181858888f19350505050158015610ddc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610e12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610ec55780518252601f199092019160209182019101610ea6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610f335780518252601f199092019160209182019101610f14565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6000610fbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610fc5565b9392505050565b600081848411156110545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611019578181015183820152602001611001565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a2646970667358221220449507f2557413401b33bd1aa888e40f31523a5d010a891cf7383c0090d7f49a64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001007": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610667565b61019b61066c565b6102d1610671565b6102d1610677565b6103e861067d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610686565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061068c565b6102d1610703565b6102d1610709565b6102b361070f565b6102d1610714565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6104f5611382565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061071a92505050565b91509150806105525761054960646107e0565b92505050610593565b600061055d8361084a565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d816107e0565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b603881565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b33612000146106155760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b33612000146106cc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114166023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b610722611382565b600061072c611382565b6107346113ac565b61074561074086610beb565b610c10565b90506000805b61075483610c5a565b156107d357806107765761076f61076a84610c7b565b610cc9565b84526107cb565b80600114156107955761078b61076a84610c7b565b60208501526107cb565b80600214156107c6576107af6107aa84610c7b565b610d42565b6001600160a01b03166040850152600191506107cb565b6107d3565b60010161074b565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816107fa5790505090506108208363ffffffff16610d62565b8160008151811061082d57fe5b602002602001018190525061084181610d75565b9150505b919050565b60006108598260400151610dff565b6108c557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610845565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561093257818101518382015260200161091a565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561099257818101518382015260200161097a565b50505050905090810190601f1680156109bf5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109e057600080fd5b505af19250505080156109f1575060015b610be3576040516000815260443d1015610a0d57506000610aaa565b60046000803e60005160e01c6308c379a08114610a2e576000915050610aaa565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a5a57600092505050610aaa565b808301805167ffffffffffffffff811115610a7c576000945050505050610aaa565b8060208301013d8601811115610a9a57600095505050505050610aaa565b601f01601f191660405250925050505b80610ab55750610b58565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b14578181015183820152602001610afc565b50505050905090810190601f168015610b415780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610845565b3d808015610b82576040519150601f19603f3d011682016040523d82523d6000602084013e610b87565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b14578181015183820152602001610afc565b506000919050565b610bf36113cc565b506040805180820190915281518152602082810190820152919050565b610c186113ac565b610c2182610e05565b610c2a57600080fd5b6000610c398360200151610e3f565b60208085015160408051808201909152868152920190820152915050919050565b6000610c646113cc565b505080518051602091820151919092015191011190565b610c836113cc565b610c8c82610c5a565b610c9557600080fd5b60208201516000610ca582610ea2565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610cd757600080fd5b6000610ce68360200151610e3f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d1d576020820181803683370190505b5090506000816020019050610d39848760200151018285610fd5565b50949350505050565b8051600090601514610d5357600080fd5b610d5c82611020565b92915050565b6060610d5c610d70836110d5565b6111bb565b6060815160001415610d965750604080516000815260208101909152610845565b606082600081518110610da557fe5b602002602001015190506000600190505b8351811015610de657610ddc82858381518110610dcf57fe5b602002602001015161120d565b9150600101610db6565b50610841610df9825160c060ff1661128a565b8261120d565b3b151590565b8051600090610e1657506000610845565b6020820151805160001a9060c0821015610e3557600092505050610845565b5060019392505050565b8051600090811a6080811015610e59576000915050610845565b60b8811080610e74575060c08110801590610e74575060f881105b15610e83576001915050610845565b60c0811015610e975760b519019050610845565b60f519019050610845565b80516000908190811a6080811015610ebd5760019150610fce565b60b8811015610ed257607e1981019150610fce565b60c0811015610f4c57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f46576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50610fce565b60f8811015610f615760be1981019150610fce565b600060f78203600186019550806020036101000a865104915060018101820193505080831015610fcc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80610fdf57610662565b5b60208110610fff578251825260209283019290910190601f1901610fe0565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061103557508151602110155b61103e57600080fd5b600061104d8360200151610e3f565b905080836000015110156110a8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d3957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166111195750601861113d565b6fffffffffffffffffffffffffffffffff1984166111395750601061113d565b5060005b60208110156111735781818151811061115257fe5b01602001516001600160f81b0319161561116b57611173565b60010161113d565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111a8576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156111ed5750607f60f81b826000815181106111db57fe5b01602001516001600160f81b03191611155b156111f9575080610845565b610d5c61120b8351608060ff1661128a565b835b6060806040519050835180825260208201818101602087015b8183101561123e578051835260209283019201611226565b50855184518101855292509050808201602086015b8183101561126b578051835260209283019201611253565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106112da576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113345782840160f81b8160008151811061131657fe5b60200101906001600160f81b031916908160001a9053509050610d5c565b606061133f856110d5565b90508381510160370160f81b8260008151811061135857fe5b60200101906001600160f81b031916908160001a905350611379828261120d565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b60405180604001604052806113bf6113cc565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220a5eefec118f5b467b996b871e3b96c20aa4fe4192a6c4b34c6afc795161d4a9a64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001008": { + "balance": "0x0", + "code": "0x6080604052600436106102465760003560e01c806375d47a0a11610139578063ab51bb96116100b6578063d9e6dae91161007a578063d9e6dae914610512578063dc927faf14610975578063f9a2bbc71461098a578063fc3e590814610566578063fd6a68791461099f578063fe3a2af5146104e857610246565b8063ab51bb96146108ca578063c81b1662146108df578063c8509d81146107da578063c8e704a414610566578063d117a110146108f457610246565b806395b9ad26116100fd57806395b9ad261461086157806396713da9146108765780639dc092621461088b578063a1a11bf5146108a0578063a78abc16146108b557610246565b806375d47a0a146106fc57806377d9dae8146107115780637942fd05146107c55780637d078e13146103b3578063831d65d1146107da57610246565b80634bc81c00116101c757806366dea52a1161018b57806366dea52a146105665780636b3f13071461057b5780636e47b4821461064357806370fd5bad1461055157806372c4e0861461065857610246565b80634bc81c00146104fd5780634bf6c8821461051257806351e80672146105275780635d499b1b1461053c5780635f558f861461055157610246565b80633dffc3871161020e5780633dffc387146103b357806343756e5c146103c8578063445fcefe146103f9578063493279b1146104bc5780634a688818146104e857610246565b80630bee7a671461024b5780630f212b1b146102795780631182b875146102a45780631f91600b1461039e57806323996b53146103b3575b600080fd5b34801561025757600080fd5b506102606109b4565b6040805163ffffffff9092168252519081900360200190f35b34801561028557600080fd5b5061028e6109b9565b6040805160ff9092168252519081900360200190f35b3480156102b057600080fd5b50610329600480360360408110156102c757600080fd5b60ff8235169190810190604081016020820135600160201b8111156102eb57600080fd5b8201836020820111156102fd57600080fd5b803590602001918460018302840111600160201b8311171561031e57600080fd5b5090925090506109be565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036357818101518382015260200161034b565b50505050905090810190601f1680156103905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103aa57600080fd5b5061028e610a47565b3480156103bf57600080fd5b5061028e610a4c565b3480156103d457600080fd5b506103dd610a51565b604080516001600160a01b039092168252519081900360200190f35b34801561040557600080fd5b506104aa6004803603602081101561041c57600080fd5b810190602081018135600160201b81111561043657600080fd5b82018360208201111561044857600080fd5b803590602001918460018302840111600160201b8311171561046957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a57945050505050565b60408051918252519081900360200190f35b3480156104c857600080fd5b506104d1610bb6565b6040805161ffff9092168252519081900360200190f35b3480156104f457600080fd5b5061028e610bbb565b34801561050957600080fd5b5061028e610bc0565b34801561051e57600080fd5b5061028e610bc5565b34801561053357600080fd5b506103dd610bca565b34801561054857600080fd5b506104aa610bd0565b34801561055d57600080fd5b5061028e610bd9565b34801561057257600080fd5b5061028e610bde565b61062f6004803603604081101561059157600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105bb57600080fd5b8201836020820111156105cd57600080fd5b803590602001918460018302840111600160201b831117156105ee57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610be3945050505050565b604080519115158252519081900360200190f35b34801561064f57600080fd5b506103dd611465565b61062f6004803603602081101561066e57600080fd5b810190602081018135600160201b81111561068857600080fd5b82018360208201111561069a57600080fd5b803590602001918460018302840111600160201b831117156106bb57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061146b945050505050565b34801561070857600080fd5b506103dd6118b9565b61062f6004803603604081101561072757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561075157600080fd5b82018360208201111561076357600080fd5b803590602001918460018302840111600160201b8311171561078457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118bf945050505050565b3480156107d157600080fd5b5061028e611dc6565b3480156107e657600080fd5b5061085f600480360360408110156107fd57600080fd5b60ff8235169190810190604081016020820135600160201b81111561082157600080fd5b82018360208201111561083357600080fd5b803590602001918460018302840111600160201b8311171561085457600080fd5b509092509050611dcb565b005b34801561086d57600080fd5b5061028e611e7e565b34801561088257600080fd5b5061028e611e83565b34801561089757600080fd5b506103dd611e88565b3480156108ac57600080fd5b506103dd611e8e565b3480156108c157600080fd5b5061062f611e94565b3480156108d657600080fd5b50610260610bbb565b3480156108eb57600080fd5b506103dd611e9d565b34801561090057600080fd5b5061091e6004803603602081101561091757600080fd5b5035611ea3565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561098157600080fd5b506103dd611efb565b34801561099657600080fd5b506103dd611f01565b3480156109ab57600080fd5b506103dd611f07565b606481565b600681565b60603361200014610a005760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b610a3f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f0d92505050565b949350505050565b600481565b600181565b61100181565b6020810151600090610a67613168565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610aef57600092505050610bb1565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b4d57600080fd5b505afa158015610b61573d6000803e3d6000fd5b505050506040513d6020811015610b7757600080fd5b505160808301516060840151919250600091610b989163ffffffff61219e16565b9050610baa818363ffffffff61219e16565b9450505050505b919050565b603881565b600081565b600581565b600881565b61200081565b6402540be40081565b600281565b600381565b600080610bef836121e7565b9050610bf9613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610cbf576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610cdc8260800151836060015161219e90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610d325760405162461bcd60e51b815260040180806020018281038252604581526020018061325b6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7557600080fd5b505afa158015610d89573d6000803e3d6000fd5b505050506040513d6020811015610d9f57600080fd5b50516001600160a01b031614610de65760405162461bcd60e51b815260040180806020018281038252602e8152602001806131f6602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610e3257600080fd5b505afa158015610e46573d6000803e3d6000fd5b505050506040513d6020811015610e5c57600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610eed9184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610eb557600080fd5b505afa158015610ec9573d6000803e3d6000fd5b505050506040513d6020811015610edf57600080fd5b50519063ffffffff6121ee16565b1015610f40576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8257600080fd5b505afa158015610f96573d6000803e3d6000fd5b505050506040513d6020811015610fac57600080fd5b50519050808210801590610fc557506402540be4008206155b6110005760405162461bcd60e51b81526004018080602001828103825260378152602001806132246037913960400191505060405180910390fd5b600061100c868b612248565b905063ffffffff811661120b576001600160a01b038a166323b872dd3361100461103c898963ffffffff61219e16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156110a457600080fd5b505af11580156110b8573d6000803e3d6000fd5b505050506040513d60208110156110ce57600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b15801561113757600080fd5b505af115801561114b573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111ca5781810151838201526020016111b2565b50505050905090810190601f1680156111f75780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26112c3565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561128757818101518382015260200161126f565b50505050905090810190601f1680156112b45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff1916905561131d6131a4565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611365573d6000803e3d6000fd5b5061200063f7a251d760016113798461269f565b61138e886402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113ec5781810151838201526020016113d4565b50505050905090810190601f1680156114195780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561143a57600080fd5b505af115801561144e573d6000803e3d6000fd5b505050506001985050505050505050505b92915050565b61100581565b600080611477836121e7565b9050611481613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611547576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff16106115a9576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d602081101561161557600080fd5b5051905080821080159061162e57506402540be4008206155b6116695760405162461bcd60e51b81526004018080602001828103825260378152602001806132246037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556116c36131a4565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611706573d6000803e3d6000fd5b5061200063f7a251d7600161171a8461269f565b61172f876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561178d578181015183820152602001611775565b50505050905090810190601f1680156117ba5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156117db57600080fd5b505af11580156117ef573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611871578181015183820152602001611859565b50505050905090810190601f16801561189e5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806118cb836121e7565b90506118d5613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c083015261199b576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146119ef5760405162461bcd60e51b815260040180806020018281038252604581526020018061325b6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d6020811015611a5c57600080fd5b50516001600160a01b031614611ab9576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611afb57600080fd5b505afa158015611b0f573d6000803e3d6000fd5b505050506040513d6020811015611b2557600080fd5b50519050808210801590611b3e57506402540be4008206155b611b795760405162461bcd60e51b81526004018080602001828103825260378152602001806132246037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611bd36131a4565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611c16573d6000803e3d6000fd5b5061200063f7a251d76001611c2a8461269f565b611c3f876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c9d578181015183820152602001611c85565b50505050905090810190601f168015611cca5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ceb57600080fd5b505af1158015611cff573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611d7d578181015183820152602001611d65565b50505050905090810190601f168015611daa5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611e0b5760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611f17613168565b6000611f228461276b565b9150915080611f78576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff1661202c576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055612183565b815160ff16600114156121365760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208557600080fd5b505afa158015612099573d6000803e3d6000fd5b505050506040513d60208110156120af57600080fd5b505190506001600160a01b038116156121305760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561211757600080fd5b505af115801561212b573d6000803e3d6000fd5b505050505b50612183565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b60006121e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128bd565b9392505050565b6020015190565b6000828201838110156121e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d60208110156122ae57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561233357600080fd5b8101908080516040519392919084600160201b82111561235257600080fd5b90830190602082018581111561236757600080fd5b8251600160201b81118282018810171561238057600080fd5b82525081516020918201929091019080838360005b838110156123ad578181015183820152602001612395565b50505050905090810190601f1680156123da5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b5051608087015160608801519192506000916124759163ffffffff61219e16565b9050428760c0015167ffffffffffffffff16101561249b57506001935061145f92505050565b6124a9838860200151612954565b6124bb57506002935061145f92505050565b808211156124d157506003935061145f92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50511461255257506004935061145f92505050565b8660a0015160ff16841461256e57506005935061145f92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b1580156125b357600080fd5b505afa1580156125c7573d6000803e3d6000fd5b505050506040513d60208110156125dd57600080fd5b50516001600160a01b031614158061267f57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d602081101561267a57600080fd5b505114155b1561269257506006935061145f92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816126b857505083519091506126e09063ffffffff16612a3c565b816000815181106126ed57fe5b6020026020010181905250612708836020015160001c612a3c565b8160018151811061271557fe5b60200260200101819052506121e081612a4f565b60006121e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ad9565b612773613168565b600061277d613168565b6127856131bb565b61279661279186612b3e565b612b63565b90506000805b6127a583612bad565b156128b057806127ca576127c06127bb84612bce565b612c1c565b60ff1684526128a8565b80600114156127e9576127df6127bb84612bce565b60208501526128a8565b8060021415612816576128036127fe84612bce565b612cd1565b6001600160a01b031660408501526128a8565b80600314156128355761282b6127bb84612bce565b60608501526128a8565b80600414156128545761284a6127bb84612bce565b60808501526128a8565b8060051415612876576128696127bb84612bce565b60ff1660a08501526128a8565b80600614156128a35761288b6127bb84612bce565b67ffffffffffffffff1660c0850152600191506128a8565b6128b0565b60010161279c565b5091935090915050915091565b6000818484111561294c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129115781810151838201526020016128f9565b50505050905090810190601f16801561293e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b815160009083906008108061296a575080516003115b1561297957600091505061145f565b604080516020808252818301909252606091602082018180368337019050509050836020820152808251815181106129ad57fe5b6020910101516001600160f81b031916602d60f81b146129d25760009250505061145f565b600160005b8351811015612a32578281815181106129ec57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612a0d57fe5b01602001516001600160f81b03191614612a2a5760009150612a32565b6001016129d7565b5095945050505050565b606061145f612a4a83612ceb565b612dd1565b6060815160001415612a705750604080516000815260208101909152610bb1565b606082600081518110612a7f57fe5b602002602001015190506000600190505b8351811015612ac057612ab682858381518110612aa957fe5b6020026020010151612e23565b9150600101612a90565b506121e0612ad3825160c060ff16612ea0565b82612e23565b60008183612b285760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129115781810151838201526020016128f9565b506000838581612b3457fe5b0495945050505050565b612b466131db565b506040805180820190915281518152602082810190820152919050565b612b6b6131bb565b612b7482612f98565b612b7d57600080fd5b6000612b8c8360200151612fd2565b60208085015160408051808201909152868152920190820152915050919050565b6000612bb76131db565b505080518051602091820151919092015191011190565b612bd66131db565b612bdf82612bad565b612be857600080fd5b60208201516000612bf882613035565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612c3157508151602110155b612c3a57600080fd5b6000612c498360200151612fd2565b90508083600001511015612ca4576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561219557506020919091036101000a90049392505050565b8051600090601514612ce257600080fd5b61145f82612c1c565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612d2f57506018612d53565b6fffffffffffffffffffffffffffffffff198416612d4f57506010612d53565b5060005b6020811015612d8957818181518110612d6857fe5b01602001516001600160f81b03191615612d8157612d89565b600101612d53565b60008160200390506060816040519080825280601f01601f191660200182016040528015612dbe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612e035750607f60f81b82600081518110612df157fe5b01602001516001600160f81b03191611155b15612e0f575080610bb1565b61145f612e218351608060ff16612ea0565b835b6060806040519050835180825260208201818101602087015b81831015612e54578051835260209283019201612e3c565b50855184518101855292509050808201602086015b81831015612e81578051835260209283019201612e69565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612ef0576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612f4a5782840160f81b81600081518110612f2c57fe5b60200101906001600160f81b031916908160001a905350905061145f565b6060612f5585612ceb565b90508381510160370160f81b82600081518110612f6e57fe5b60200101906001600160f81b031916908160001a905350612f8f8282612e23565b95945050505050565b8051600090612fa957506000610bb1565b6020820151805160001a9060c0821015612fc857600092505050610bb1565b5060019392505050565b8051600090811a6080811015612fec576000915050610bb1565b60b8811080613007575060c08110801590613007575060f881105b15613016576001915050610bb1565b60c081101561302a5760b519019050610bb1565b60f519019050610bb1565b80516000908190811a60808110156130505760019150613161565b60b881101561306557607e1981019150613161565b60c08110156130df57600060b78203600186019550806020036101000a8651049150600181018201935050808310156130d9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613161565b60f88110156130f45760be1981019150613161565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561315f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b60405180604001604052806131ce6131db565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737472656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a264697066735822122030cc6c250f37ad9452c0933399bf3f460a19215bce5c10c377f100761098776a64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000002000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612051565b604080516001600160401b039092168252519081900360200190f35b61044361206c565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612072565b61038a612092565b6104436120b1565b6105b16120b7565b6106c16004803603602081101561074257600080fd5b503560ff1661246e565b6105b16004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919350915035612489565b6104436125da565b6102556125e0565b6104436125e5565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125eb565b50905061086a818388516125f5565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b603881565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612bcc6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c612636565b858561267d565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da08861277a565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b61282a565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100380081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b22602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129809050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a6792505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b9a6032913960400191505060405180910390fd5b600155611fbf565b611c5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506129809050565b15611de457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cdf5760405162461bcd60e51b815260040180806020018281038252605a815260200180612ac8605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590611cfd81612a6c565b611d4e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a35050505050611fbf565b611e5184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129809050565b15611f8257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ed45760405162461bcd60e51b815260040180806020018281038252604a815260200180612b50604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f78576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fbf565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff161561210f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166124dc576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff80891685529252909120548591166125395760405162461bcd60e51b8152600401808060200182810382526031815260200180612a976031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b03169261259e9284928a9261115792909189918c908c908190840183828082843760009201919091525061080092505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b8051602090910191565b5b60208110612615578251825260209283019290910190601f19016125f6565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100380060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268c57506000612771565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126c3576020820181803683370190505b50905060006126d182612a72565b6020808901518252019050866000806126e9896125eb565b80865260209095019490925090506127028285836125f5565b9283019261270f886125eb565b80865260209095019490925090506127288285836125f5565b9283018a81526020019261273b876125eb565b909250905061274b8285836125f5565b508351602001612759612a78565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127aa575050604080516000808252602082019092529092508291508190612823565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127f5576020820181803683370190505b5090506000612803826125eb565b509050612815858260218d51036125f5565b506001975091955093509150505b9193509193565b600254431115612869576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128aa565b600380546001908101918290555410156128aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe603885604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612940578181015183820152602001612928565b50505050905090810190601f16801561296d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129b55780518252601f199092019160209182019101612996565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a235780518252601f199092019160209182019101612a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a264697066735822122083f6194f9a326fa5963aa39ffe11dcd28d1421a9f74fbe97a97f4853026e29ff64736f6c63430006040033" + }, + "b005741528b86F5952469d80A8614591E3c5B632": { + "balance": "0x1b1ae4d6e2ef500000" + }, + "446AA6E0DC65690403dF3F127750da1322941F3e": { + "balance": "0x1b1ae4d6e2ef500000" + } +} \ No newline at end of file diff --git a/core/allocs/calaveras.json b/core/allocs/calaveras.json deleted file mode 100644 index 328a262d5f8..00000000000 --- a/core/allocs/calaveras.json +++ /dev/null @@ -1,806 +0,0 @@ -{ - "0000000000000000000000000000000000000000": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000001": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000002": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000003": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000004": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000005": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000006": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000007": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000008": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000009": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000000f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000010": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000011": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000012": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000013": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000014": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000015": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000016": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000017": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000018": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000019": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000001f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000020": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000021": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000022": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000023": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000024": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000025": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000026": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000027": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000028": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000029": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000002f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000030": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000031": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000032": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000033": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000034": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000035": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000036": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000037": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000038": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000039": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000003f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000040": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000041": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000042": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000043": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000044": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000045": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000046": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000047": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000048": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000049": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000004f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000050": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000051": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000052": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000053": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000054": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000055": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000056": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000057": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000058": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000059": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000005f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000060": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000061": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000062": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000063": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000064": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000065": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000066": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000067": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000068": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000069": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000006f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000070": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000071": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000072": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000073": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000074": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000075": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000076": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000077": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000078": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000079": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000007f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000080": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000081": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000082": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000083": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000084": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000085": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000086": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000087": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000088": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000089": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000008f": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000090": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000091": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000092": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000093": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000094": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000095": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000096": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000097": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000098": { - "balance": "0x1" - }, - "0000000000000000000000000000000000000099": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009a": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009b": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009c": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009d": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009e": { - "balance": "0x1" - }, - "000000000000000000000000000000000000009f": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000a9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000aa": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ab": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ac": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ad": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ae": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000af": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000b9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ba": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000be": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000bf": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000c9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ca": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ce": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000cf": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000d9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000da": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000db": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000dc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000dd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000de": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000df": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000e9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ea": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000eb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ec": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ed": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ee": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ef": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f0": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f1": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f2": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f3": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f4": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f5": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f6": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f7": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f8": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000f9": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fa": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fb": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fc": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fd": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000fe": { - "balance": "0x1" - }, - "00000000000000000000000000000000000000ff": { - "balance": "0x1" - }, - "0e89e2aedb1cfcdb9424d41a1f218f4132738172": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "1041afbcb359d5a8dc58c15b2ff51354ff8a217d": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "236ff1e97419ae93ad80cafbaa21220c5d78fb7d": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "60adc0f89a41af237ce73554ede170d733ec14e0": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "799d329e5f583419167cd722962485926e338f4a": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "7cf5b79bfe291a67ab02b393e456ccc4c266f753": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "8a8eafb1cf62bfbeb1741769dae1a9dd47996192": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "8ba1f109551bd432803012645ac136ddd64dba72": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "b02a2eda1b317fbd16760128836b0ac59b560e9d": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "badc0de9e0794b049b5ea63c3e1e698a3476c172": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "f0300bee898ae272eb347e8369ac0c76df42c93f": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - }, - "fe3b557e8fb62b89f4916b721be55ceb828dbd73": { - "balance": "0x200000000000000000000000000000000000000000000000000000000000000" - } -} \ No newline at end of file diff --git a/core/allocs/chapel.json b/core/allocs/chapel.json new file mode 100644 index 00000000000..32990606d7e --- /dev/null +++ b/core/allocs/chapel.json @@ -0,0 +1,51 @@ +{ + "0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE": { + "balance": "0x0" + }, + "0x0000000000000000000000000000000000001000": { + "balance": "0x0", + "code": "0x6080604052600436106102675760003560e01c806396713da911610144578063c81b1662116100b6578063eb57e2021161007a578063eb57e20214610900578063eda5868c14610933578063f340fa0114610948578063f9a2bbc71461096e578063fc3e590814610983578063fd6a68791461099857610267565b8063c81b1662146108ac578063c8509d81146105f3578063d86222d5146108c1578063dc927faf146108d6578063e1c7392a146108eb57610267565b8063aaf5eb6811610108578063aaf5eb681461071f578063ab51bb9614610734578063ac43175114610749578063ad3c9da614610814578063b7ab4db514610847578063bf9f49951461040557610267565b806396713da9146106a25780639dc09262146106b7578063a1a11bf5146106cc578063a5422d5c146106e1578063a78abc16146106f657610267565b80635667515a116101dd57806375d47a0a116101a157806375d47a0a146105b45780637942fd05146105c957806381650b62146105de578063831d65d1146105f3578063853230aa14610678578063862498821461068d57610267565b80635667515a146104ea5780635d77156c146104ff5780636969a25c146105145780636e47b4821461058a57806370fd5bad1461059f57610267565b80633dffc3871161022f5780633dffc3871461040557806343756e5c14610430578063493279b1146104615780634bf6c8821461048d57806351e80672146104a2578063565c56b3146104b757610267565b80630bee7a671461026c5780631182b8751461029a5780631ff1806914610394578063219f22d5146103bb57806335409f7f146103d0575b600080fd5b34801561027857600080fd5b506102816109ad565b6040805163ffffffff9092168252519081900360200190f35b3480156102a657600080fd5b5061031f600480360360408110156102bd57600080fd5b60ff8235169190810190604081016020820135600160201b8111156102e157600080fd5b8201836020820111156102f357600080fd5b803590602001918460018302840111600160201b8311171561031457600080fd5b5090925090506109b2565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610359578181015183820152602001610341565b50505050905090810190601f1680156103865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a057600080fd5b506103a9610b26565b60408051918252519081900360200190f35b3480156103c757600080fd5b50610281610b2c565b3480156103dc57600080fd5b50610403600480360360208110156103f357600080fd5b50356001600160a01b0316610b31565b005b34801561041157600080fd5b5061041a610e45565b6040805160ff9092168252519081900360200190f35b34801561043c57600080fd5b50610445610e4a565b604080516001600160a01b039092168252519081900360200190f35b34801561046d57600080fd5b50610476610e50565b6040805161ffff9092168252519081900360200190f35b34801561049957600080fd5b5061041a610e55565b3480156104ae57600080fd5b50610445610e5a565b3480156104c357600080fd5b506103a9600480360360208110156104da57600080fd5b50356001600160a01b0316610e60565b3480156104f657600080fd5b5061041a610eb2565b34801561050b57600080fd5b50610281610eb7565b34801561052057600080fd5b5061053e6004803603602081101561053757600080fd5b5035610ebc565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b34801561059657600080fd5b50610445610f20565b3480156105ab57600080fd5b5061041a610f26565b3480156105c057600080fd5b50610445610f2b565b3480156105d557600080fd5b5061041a610f31565b3480156105ea57600080fd5b50610281610f36565b3480156105ff57600080fd5b506104036004803603604081101561061657600080fd5b60ff8235169190810190604081016020820135600160201b81111561063a57600080fd5b82018360208201111561064c57600080fd5b803590602001918460018302840111600160201b8311171561066d57600080fd5b509092509050610f3b565b34801561068457600080fd5b506103a9610fee565b34801561069957600080fd5b506103a9610ff4565b3480156106ae57600080fd5b5061041a610ffa565b3480156106c357600080fd5b50610445610fff565b3480156106d857600080fd5b50610445611005565b3480156106ed57600080fd5b5061031f61100b565b34801561070257600080fd5b5061070b61102a565b604080519115158252519081900360200190f35b34801561072b57600080fd5b506103a9611033565b34801561074057600080fd5b50610281610eb2565b34801561075557600080fd5b506104036004803603604081101561076c57600080fd5b810190602081018135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919390929091602081019035600160201b8111156107d657600080fd5b8201836020820111156107e857600080fd5b803590602001918460018302840111600160201b8311171561080957600080fd5b50909250905061103c565b34801561082057600080fd5b506103a96004803603602081101561083757600080fd5b50356001600160a01b03166112e3565b34801561085357600080fd5b5061085c6112f5565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610898578181015183820152602001610880565b505050509050019250505060405180910390f35b3480156108b857600080fd5b5061044561141b565b3480156108cd57600080fd5b506103a9611421565b3480156108e257600080fd5b5061044561142d565b3480156108f757600080fd5b50610403611433565b34801561090c57600080fd5b506104036004803603602081101561092357600080fd5b50356001600160a01b0316611636565b34801561093f57600080fd5b50610281611805565b6104036004803603602081101561095e57600080fd5b50356001600160a01b031661180a565b34801561097a57600080fd5b50610445611a20565b34801561098f57600080fd5b5061041a611a26565b3480156109a457600080fd5b50610445611a2b565b606481565b60005460609060ff16610a08576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a485760405162461bcd60e51b815260040180806020018281038252602f815260200180613f73602f913960400191505060405180910390fd5b610a50613c27565b6000610a9185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611a3192505050565b9150915080610aad57610aa46064611b8a565b92505050610b1f565b815160009060ff16610acd57610ac68360200151611beb565b9050610aeb565b825160ff1660011415610ae757610ac683602001516129ec565b5060655b63ffffffff8116610b105750506040805160008152602081019091529150610b1f9050565b610b1981611b8a565b93505050505b9392505050565b60035481565b606881565b3361100114610b715760405162461bcd60e51b8152600401808060200182810382526029815260200180613fcf6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610b955750610e42565b600181039050600060018281548110610baa57fe5b60009182526020909120600360049092020101546001549091506000190180610bf957600060018481548110610bdc57fe5b906000526020600020906004020160030181905550505050610e42565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610d7b57600180546000198101908110610c7057fe5b906000526020600020906004020160018481548110610c8b57fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610d5057fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610d8657fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610dd957fe5b0490508015610e3d5760015460005b81811015610e3a578260018281548110610dfe57fe5b9060005260206000209060040201600301540160018281548110610e1e57fe5b6000918252602090912060036004909202010155600101610de8565b50505b505050505b50565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610e88576000915050610ead565b600180820381548110610e9757fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610ec957fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b3361200014610f7b5760405162461bcd60e51b815260040180806020018281038252602f815260200180613f73602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101b78152602001613d9b6101b7913981565b60005460ff1681565b6402540be40081565b60005460ff1661108f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146110cf5760405162461bcd60e51b815260040180806020018281038252602e815260200180613d26602e913960400191505060405180910390fd5b61113984848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c2a9050565b15611214576020811461117d5760405162461bcd60e51b8152600401808060200182810382526026815260200180613d756026913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111bb91858580838501838280828437600092019190915250612d1292505050565b9050606481101580156111d15750620186a08111155b61120c5760405162461bcd60e51b8152600401808060200182810382526027815260200180613cda6027913960400191505060405180910390fd5b600255611251565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b82811015611346576001818154811061131457fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661133e576001909101905b6001016112ff565b50606081604051908082528060200260200182016040528015611373578160200160208202803683370190505b50600092509050815b83811015611413576001818154811061139157fe5b9060005260206000209060040201600201601c9054906101000a900460ff1661140b57600181815481106113c157fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106113ec57fe5b6001600160a01b03909216602092830291909101909101526001909201915b60010161137c565b509250505090565b61100281565b67016345785d8a000081565b61100381565b60005460ff161561148b576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611493613c27565b60006114b9604051806101e001604052806101b78152602001613d9b6101b79139611a31565b91509150806114f95760405162461bcd60e51b8152600401808060200182810382526021815260200180613f526021913960400191505060405180910390fd5b60005b82602001515181101561161e5760018360200151828151811061151b57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106115f157fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016114fc565b50506103e8600255506000805460ff19166001179055565b33611001146116765760405162461bcd60e51b8152600401808060200182810382526029815260200180613fcf6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061169a5750610e42565b6001810390506000600182815481106116af57fe5b90600052602060002090600402016003015490506000600183815481106116d257fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061174157505050610e42565b600081838161174c57fe5b0490508015610e3d5760005b848110156117aa57816001828154811061176e57fe5b906000526020600020906004020160030154016001828154811061178e57fe5b6000918252602090912060036004909202010155600101611758565b50600180549085015b81811015610e3a5782600182815481106117c957fe5b90600052602060002090600402016003015401600182815481106117e957fe5b60009182526020909120600360049092020101556001016117b3565b606581565b3341146118485760405162461bcd60e51b815260040180806020018281038252602d815260200180613fa2602d913960400191505060405180910390fd5b60005460ff1661189b576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116118e8576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b038116600090815260046020526040902054349080156119db57600060018083038154811061191a57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611985576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a26119d5565b600380548401815581018054840190556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611a1b565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611a39613c27565b6000611a43613c27565b611a4b613c3f565b611a5c611a5786612d17565b612d3c565b90506000805b611a6b83612d86565b15611b7c5780611a9057611a86611a8184612da7565b612df5565b60ff168452611b74565b8060011415611b6f576060611aac611aa785612da7565b612e55565b90508051604051908082528060200260200182016040528015611ae957816020015b611ad6613c5f565b815260200190600190039081611ace5790505b50602086015260005b8151811015611b6457611b03613c5f565b6000611b21848481518110611b1457fe5b6020026020010151612f26565b9150915080611b3e57876000995099505050505050505050611b85565b8188602001518481518110611b4f57fe5b60209081029190910101525050600101611af2565b506001925050611b74565b611b7c565b600101611a62565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611ba4579050509050611bca8363ffffffff16613003565b81600081518110611bd757fe5b6020026020010181905250610b1f81613016565b6000806060611bf9846130a0565b9150915081611ca6577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611c61578181015183820152602001611c49565b50505050905090810190601f168015611c8e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610ead565b600080805b600154811015611d235767016345785d8a000060018281548110611ccb57fe5b90600052602060002090600402016003015410611ced57600190920191611d1b565b600060018281548110611cfc57fe5b9060005260206000209060040201600301541115611d1b576001909101905b600101611cab565b50606082604051908082528060200260200182016040528015611d50578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611d7f578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611dae578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ddd578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611e0e578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611e3d578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6020811015611eb457600080fd5b5051905067016345785d8a0000811115611f29577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613d546021913960400191505060405180910390a160689d5050505050505050505050505050610ead565b60005b60015481101561219c5767016345785d8a000060018281548110611f4c57fe5b906000526020600020906004020160030154106120d25760018181548110611f7057fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d81518110611fa157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be40060018381548110611fd657fe5b90600052602060002090600402016003015481611fef57fe5b0660018381548110611ffd57fe5b906000526020600020906004020160030154039050612025838261315390919063ffffffff16565b8a8e8151811061203157fe5b6020026020010181815250506001828154811061204a57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061207b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e815181106120a857fe5b60209081029190910101526120c3878263ffffffff61319516565b6001909d019c96506121949050565b6000600182815481106120e157fe5b9060005260206000209060040201600301541115612194576001818154811061210657fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061213757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061216457fe5b906000526020600020906004020160030154848c8151811061218257fe5b60209081029190910101526001909a01995b600101611f2c565b50600085156125da576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b8381101561222e578181015183820152602001612216565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561226d578181015183820152602001612255565b50505050905001848103825286818151815260200191508051906020019060200280838360005b838110156122ac578181015183820152602001612294565b505050509050019750505050505050506020604051808303818588803b1580156122d557600080fd5b505af1935050505080156122fb57506040513d60208110156122f657600080fd5b505160015b612536576040516000815260443d1015612317575060006123b2565b60046000803e60005160e01c6308c379a081146123385760009150506123b2565b60043d036004833e81513d60248201116001600160401b0382111715612363576000925050506123b2565b80830180516001600160401b038111156123845760009450505050506123b2565b8060208301013d86018111156123a2576000955050505050506123b2565b601f01601f191660405250925050505b806123bd5750612461565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b83811015612421578181015183820152602001612409565b50505050905090810190601f16801561244e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612531565b3d80801561248b576040519150601f19603f3d011682016040523d82523d6000602084013e612490565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156124f55781810151838201526020016124dd565b50505050905090810190601f1680156125225780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6125da565b8015612574576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16125d8565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156127905760005b885181101561278e5760008982815181106125fa57fe5b6020026020010151905060006001828154811061261357fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061264457fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015612700576001828154811061268557fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106126d457fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612784565b6001828154811061270d57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061275c57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016125e3565b505b8451156128da5760005b85518110156128d85760008682815181106127b157fe5b60200260200101516001600160a01b03166108fc8784815181106127d157fe5b60200260200101519081150290604051600060405180830381858888f19350505050905080156128675786828151811061280757fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061284557fe5b60200260200101516040518082815260200191505060405180910390a26128cf565b86828151811061287357fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d8784815181106128b157fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161279a565b505b4715612943576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612941573d6000803e3d6000fd5b505b600060035582511561295857612958836131ef565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b60008151600114612a4a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613d016025913960400191505060405180910390a1506067610ead565b612a52613c5f565b82600081518110612a5f57fe5b60209081029190910181015180516001600160a01b03166000908152600490925260409091205490915080612ad05781516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a2600092505050610ead565b600154600090815b81811015612b625760018181548110612aed57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16158015612b4c575084600001516001600160a01b031660018281548110612b2f57fe5b60009182526020909120600490910201546001600160a01b031614155b15612b5a5760019250612b62565b600101612ad8565b5081612bac5783516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000945050505050610ead565b6001806001850381548110612bbd57fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915584516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a250600095945050505050565b6000816040516020018082805190602001908083835b60208310612c5f5780518252601f199092019160209182019101612c40565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612ccd5780518252601f199092019160209182019101612cae565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b612d1f613c94565b506040805180820190915281518152602082810190820152919050565b612d44613c3f565b612d4d826136b6565b612d5657600080fd5b6000612d6583602001516136f0565b60208085015160408051808201909152868152920190820152915050919050565b6000612d90613c94565b505080518051602091820151919092015191011190565b612daf613c94565b612db882612d86565b612dc157600080fd5b60208201516000612dd182613753565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e0a57508151602110155b612e1357600080fd5b6000612e2283602001516136f0565b83516020808601518301805193945091849003929190831015612e4c57826020036101000a820491505b50949350505050565b6060612e60826136b6565b612e6957600080fd5b6000612e74836137ec565b9050606081604051908082528060200260200182016040528015612eb257816020015b612e9f613c94565b815260200190600190039081612e975790505b5090506000612ec485602001516136f0565b60208601510190506000805b84811015612f1b57612ee183613753565b9150604051806040016040528083815260200184815250848281518110612f0457fe5b602090810291909101015291810191600101612ed0565b509195945050505050565b612f2e613c5f565b6000612f38613c5f565b612f40613c3f565b612f4985612d3c565b90506000805b612f5883612d86565b15611b7c5780612f8357612f73612f6e84612da7565b613848565b6001600160a01b03168452612ffb565b8060011415612fab57612f98612f6e84612da7565b6001600160a01b03166020850152612ffb565b8060021415612fd357612fc0612f6e84612da7565b6001600160a01b03166040850152612ffb565b8060031415611b6f57612fe8611a8184612da7565b6001600160401b03166060850152600191505b600101612f4f565b6060612d0c61301183613862565b613948565b60608151600014156130375750604080516000815260208101909152610ead565b60608260008151811061304657fe5b602002602001015190506000600190505b83518110156130875761307d8285838151811061307057fe5b602002602001015161399a565b9150600101613057565b50610b1f61309a825160c060ff16613a17565b8261399a565b60006060815b83518110156131395760005b81811015613130578481815181106130c657fe5b6020026020010151600001516001600160a01b03168583815181106130e757fe5b6020026020010151600001516001600160a01b031614156131285760006040518060600160405280602b8152602001613caf602b9139935093505050611b85565b6001016130b2565b506001016130a6565b505060408051602081019091526000815260019150915091565b6000610b1f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b0f565b600082820183811015610b1f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600154815160005b8281101561330c576001613209613c5f565b6001838154811061321657fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156132e0578681815181106132a657fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156132d857600092506132e0565b600101613292565b5081156133025780516001600160a01b03166000908152600460205260408120555b50506001016131f7565b508082111561338157805b8281101561337f57600180548061332a57fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b0319169055600390910191909155915501613317565b505b60008183106133905781613392565b825b905060005b8181101561358c576134448582815181106133ae57fe5b6020026020010151600183815481106133c357fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ba6565b61355f57806001016004600087848151811061345c57fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061349857fe5b6020026020010151600182815481106134ad57fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155613584565b60006001828154811061356e57fe5b9060005260206000209060040201600301819055505b600101613397565b50828211156136b057825b82811015610e3d5760018582815181106135ad57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061368357fe5b602090810291909101810151516001600160a01b0316825281019190915260400160002055600101613597565b50505050565b80516000906136c757506000610ead565b6020820151805160001a9060c08210156136e657600092505050610ead565b5060019392505050565b8051600090811a608081101561370a576000915050610ead565b60b8811080613725575060c08110801590613725575060f881105b15613734576001915050610ead565b60c08110156137485760b519019050610ead565b60f519019050610ead565b80516000908190811a608081101561376e57600191506137e5565b60b881101561378357607e19810191506137e5565b60c08110156137b05760b78103600185019450806020036101000a855104600182018101935050506137e5565b60f88110156137c55760be19810191506137e5565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b80516000906137fd57506000610ead565b6000809050600061381184602001516136f0565b602085015185519181019250015b8082101561383f5761383082613753565b6001909301929091019061381f565b50909392505050565b805160009060151461385957600080fd5b612d0c82612df5565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166138a6575060186138ca565b6fffffffffffffffffffffffffffffffff1984166138c6575060106138ca565b5060005b6020811015613900578181815181106138df57fe5b01602001516001600160f81b031916156138f857613900565b6001016138ca565b60008160200390506060816040519080825280601f01601f191660200182016040528015613935576020820181803683370190505b5080830196909652508452509192915050565b60608151600114801561397a5750607f60f81b8260008151811061396857fe5b01602001516001600160f81b03191611155b15613986575080610ead565b612d0c6139988351608060ff16613a17565b835b6060806040519050835180825260208201818101602087015b818310156139cb5780518352602092830192016139b3565b50855184518101855292509050808201602086015b818310156139f85780518352602092830192016139e0565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613a67576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ac15782840160f81b81600081518110613aa357fe5b60200101906001600160f81b031916908160001a9053509050612d0c565b6060613acc85613862565b90508381510160370160f81b82600081518110613ae557fe5b60200101906001600160f81b031916908160001a905350613b06828261399a565b95945050505050565b60008184841115613b9e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b63578181015183820152602001613b4b565b50505050905090810190601f168015613b905780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613be0575081602001516001600160a01b031683602001516001600160a01b0316145b8015613c05575081604001516001600160a01b031683604001516001600160a01b0316145b8015610b1f5750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613c52613c94565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe6475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d61746368f901b480f901b0f846941284214b9b9c85549ab3d2b972df0deef66ac2c99477f066f3fb515bb97015e4b4afddbcb25c94286b946ddf42a51534fc98d0c0a3b42c963cace8441ddf86048c27395000f84694b71b214cb885500844365e95cd9942c7276e7fd894748c284f46ab87fd492326f1e2fe731d22ad2db394d22ca3ba2141d23adab65ce4940eb7665ea2b6a786048c27395000f84694a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0940ce09b38374887cb564b7efa60be130d99ed5f95948081ef03f1d9e0bb4a5bf38f16285c879299f07f86048c27395000f84694980a75ecd1309ea12fa2ed87a8744fbfc9b863d59407eecf36cf0901fefe4bc505d6ba03c7480c7b5794cc6ac05c95a99c1f7b5f88de0e3486c82293b27086048c27395000f8469435552c16704d214347f29fa77f77da6d75d7c75294f57d36e129881a3a13a024fe8072507e5b2e70f894dc4973e838e3949c77aced16ac2315dc2d7ab11186048c27395000f84694f474cf03cceff28abc65c9cbae594f725c80e12d94ddfcaedf9bb451098c9917a45f02bd61342cca6694e61a183325a18a173319dd8e19c8d069459e217586048c273950006661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a26469706673582212201a362ffe5872c7b034fe0bdf76cb3980b7a822a1eb1f36e261d39b52df28597164736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001001": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102065760003560e01c806396713da91161011a578063c81b1662116100ad578063e1c7392a1161007c578063e1c7392a1461064d578063f9a2bbc714610655578063fc3e59081461065d578063fc4333cd14610665578063fd6a68791461066d57610206565b8063c81b16621461059f578063c8509d81146105a7578063c96be4cb1461061f578063dc927faf1461064557610206565b8063a78abc16116100e9578063a78abc16146104b5578063ab51bb96146104d1578063ac431751146104d9578063c80d4b8f1461059757610206565b806396713da9146104955780639bc8e4f21461049d5780639dc09262146104a5578063a1a11bf5146104ad57610206565b806351e806721161019d57806370fd5bad1161016c57806370fd5bad146103fb57806375d47a0a146104035780637912a65d1461040b5780637942fd0514610413578063831d65d11461041b57610206565b806351e80672146103db578063567a372d146103e357806362b72cf5146103eb5780636e47b482146103f357610206565b80633dffc387116101d95780633dffc3871461037257806343756e5c14610390578063493279b1146103b45780634bf6c882146103d357610206565b80630bee7a671461020b5780631182b8751461022c57806337c8dab914610319578063389f4f7114610358575b600080fd5b610213610675565b6040805163ffffffff9092168252519081900360200190f35b6102a46004803603604081101561024257600080fd5b60ff8235169190810190604081016020820135600160201b81111561026657600080fd5b82018360208201111561027857600080fd5b803590602001918460018302840111600160201b8311171561029957600080fd5b50909250905061067a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102de5781810151838201526020016102c6565b50505050905090810190601f16801561030b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033f6004803603602081101561032f57600080fd5b50356001600160a01b0316610709565b6040805192835260208301919091528051918290030190f35b610360610760565b60408051918252519081900360200190f35b61037a610766565b6040805160ff9092168252519081900360200190f35b61039861076b565b604080516001600160a01b039092168252519081900360200190f35b6103bc610771565b6040805161ffff9092168252519081900360200190f35b61037a610776565b61039861077b565b610360610781565b610360610787565b61039861078d565b61037a610793565b610398610798565b61036061079e565b61037a6107a3565b6104936004803603604081101561043157600080fd5b60ff8235169190810190604081016020820135600160201b81111561045557600080fd5b82018360208201111561046757600080fd5b803590602001918460018302840111600160201b8311171561048857600080fd5b5090925090506107a8565b005b61037a61087e565b610360610883565b61039861088e565b610398610894565b6104bd61089a565b604080519115158252519081900360200190f35b6102136108a3565b610493600480360360408110156104ef57600080fd5b810190602081018135600160201b81111561050957600080fd5b82018360208201111561051b57600080fd5b803590602001918460018302840111600160201b8311171561053c57600080fd5b919390929091602081019035600160201b81111561055957600080fd5b82018360208201111561056b57600080fd5b803590602001918460018302840111600160201b8311171561058c57600080fd5b5090925090506108a8565b610360610ca3565b610398610ca8565b610493600480360360408110156105bd57600080fd5b60ff8235169190810190604081016020820135600160201b8111156105e157600080fd5b8201836020820111156105f357600080fd5b803590602001918460018302840111600160201b8311171561061457600080fd5b509092509050610cae565b6104936004803603602081101561063557600080fd5b50356001600160a01b0316610cdc565b6103986110e1565b6104936110e7565b610398611158565b61037a61115e565b610493611163565b6103986112b4565b606481565b606033612000146106bc5760405162461bcd60e51b815260040180806020018281038252602f815260200180611c1a602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600080610714611ade565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606181565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b6107b0611b01565b60006107f184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112ba92505050565b91509150801561083b5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610877565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff166108fb576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461093b5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ba5602e913960400191505060405180910390fd5b6109a684848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b6020820152915061133a9050565b15610a7f57602081146109ea5760405162461bcd60e51b8152600401808060200182810382526027815260200180611b4e6027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a289185858083850183828082843760009201919091525061142292505050565b9050600a8110158015610a3c575060055481105b610a775760405162461bcd60e51b8152600401808060200182810382526025815260200180611bf56025913960400191505060405180910390fd5b600455610c11565b610ae584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b6020820152915061133a9050565b15610bd45760208114610b295760405162461bcd60e51b8152600401808060200182810382526022815260200180611bd36022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610b679185858083850183828082843760009201919091525061142292505050565b9050601481118015610b7b57506103e88111155b610bcc576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610c11565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610d1a5760405162461bcd60e51b815260040180806020018281038252602d815260200180611c49602d913960400191505060405180910390fd5b60005460ff16610d6d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b6003544311610dc3576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b610dcb611ade565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff161580159282019290925290610e26576020810180516001019052610e7f565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526001600160a01b038216600090815260026020818152604092839020845181559084015160018201819055928401519101805460ff19169115159190911790556005549081610ecd57fe5b0661102f57604080516335409f7f60e01b81526001600160a01b03841660048201529051611000916335409f7f91602480830192600092919082900301818387803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b610f4f85611427565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015610faf578181015183820152602001610f97565b50505050905090810190601f168015610fdc5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610ffd57600080fd5b505af1158015611011573d6000803e3d6000fd5b505050506040513d602081101561102757600080fd5b506110a59050565b60045481602001518161103e57fe5b066110a557604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561108c57600080fd5b505af11580156110a0573d6000803e3d6000fd5b505050505b6040516001600160a01b038316907fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e90600090a2505043600355565b61100381565b60005460ff161561113f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146111a35760405162461bcd60e51b8152600401808060200182810382526030815260200180611b756030913960400191505060405180910390fd5b60005460ff166111f6576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60015460005b818110156112875760026000600180848603038154811061121957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548061125d57fe5b600082815260209020810160001990810180546001600160a01b03191690550190556001016111fc565b506040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150565b61100481565b6112c2611b01565b60006112cc611b01565b6112d4611b13565b6112e56112e0866114f9565b61151e565b90506000805b6112f483611568565b1561132d57806113205761130f61130a84611589565b6115d7565b63ffffffff16845260019150611325565b61132d565b6001016112eb565b5091935090915050915091565b6000816040516020018082805190602001908083835b6020831061136f5780518252601f199092019160209182019101611350565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106113dd5780518252601f1990920191602091820191016113be565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161144257905050905061146b836001600160a01b0316611637565b8160008151811061147857fe5b602002602001018190525061148c4361165a565b8160018151811061149957fe5b60209081029190910101526114ae606161165a565b816002815181106114bb57fe5b60200260200101819052506114cf4261165a565b816003815181106114dc57fe5b60200260200101819052506114f08161166d565b9150505b919050565b611501611b33565b506040805180820190915281518152602082810190820152919050565b611526611b13565b61152f826116f7565b61153857600080fd5b60006115478360200151611731565b60208085015160408051808201909152868152920190820152915050919050565b6000611572611b33565b505080518051602091820151919092015191011190565b611591611b33565b61159a82611568565b6115a357600080fd5b602082015160006115b382611794565b80830160209586015260408051808201909152908152938401919091525090919050565b8051600090158015906115ec57508151602110155b6115f557600080fd5b60006116048360200151611731565b8351602080860151830180519394509184900392919083101561162e57826020036101000a820491505b50949350505050565b60408051600560a21b83186014820152603481019091526060906114f08161182d565b606061141c61166883611883565b61182d565b606081516000141561168e57506040805160008152602081019091526114f4565b60608260008151811061169d57fe5b602002602001015190506000600190505b83518110156116de576116d4828583815181106116c757fe5b6020026020010151611969565b91506001016116ae565b506114f06116f1825160c060ff166119e6565b82611969565b8051600090611708575060006114f4565b6020820151805160001a9060c0821015611727576000925050506114f4565b5060019392505050565b8051600090811a608081101561174b5760009150506114f4565b60b8811080611766575060c08110801590611766575060f881105b156117755760019150506114f4565b60c08110156117895760b5190190506114f4565b60f5190190506114f4565b80516000908190811a60808110156117af5760019150611826565b60b88110156117c457607e1981019150611826565b60c08110156117f15760b78103600185019450806020036101000a85510460018201810193505050611826565b60f88110156118065760be1981019150611826565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b60608151600114801561185f5750607f60f81b8260008151811061184d57fe5b01602001516001600160f81b03191611155b1561186b5750806114f4565b61141c61187d8351608060ff166119e6565b83611969565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166118c7575060186118eb565b6fffffffffffffffffffffffffffffffff1984166118e7575060106118eb565b5060005b60208110156119215781818151811061190057fe5b01602001516001600160f81b0319161561191957611921565b6001016118eb565b60008160200390506060816040519080825280601f01601f191660200182016040528015611956576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561199a578051835260209283019201611982565b50855184518101855292509050808201602086015b818310156119c75780518352602092830192016119af565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310611a36576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411611a905782840160f81b81600081518110611a7257fe5b60200101906001600160f81b031916908160001a905350905061141c565b6060611a9b85611883565b90508381510160370160f81b82600081518110611ab457fe5b60200101906001600160f81b031916908160001a905350611ad58282611969565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b6040518060400160405280611b26611b33565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572a26469706673582212203c75feabfa95d80f8670bc9249ad2a813867311d79e6a0c9e3a1233d3c2c953964736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001002": { + "balance": "0x0", + "code": "0x60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602d8152602001806106a8602d913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320617661696c61626c6520746f2063616c6c20746865206d6574686f64a26469706673582212206e40023fb74e48dfc701bcc667e0729a8491ff7ddabd668e2c6383a508bb167764736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001003": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139a565b61027f6113b5565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bb565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113df565b61052a611421565b6106656115c6565b604080516001600160401b039092168252519081900360200190f35b6106656115d5565b6102d26115eb565b61027f611608565b61026161160e565b61027f611613565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b606181565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ac5602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e67650000000000602082015291506116199050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611a64602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170092505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611af3602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b226026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611862565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b6003546001600160401b0390811690831610610f3957836001600160401b0316826001600160401b03161015610e5d57610f39565b80516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f295780601f10610efe57610100808354040283529160200191610f29565b820191906000526020600020905b815481529060010190602001808311610f0c57829003601f168201915b5050505050815250509050610e28565b6060810151516110305780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe85780601f10610fbd57610100808354040283529160200191610fe8565b820191906000526020600020905b815481529060010190602001808311610fcb57829003601f168201915b505050506060830182905250516110305760405162461bcd60e51b8152600401808060200182810382526021815260200180611a436021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f19166020018201604052801561106f576020820181803683370190505b509050600061107d82611705565b905061108b8486838661170b565b6110c65760405162461bcd60e51b81526004018080602001828103825260238152602001806119406023913960400191505060405180910390fd5b6000838201915061110c8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177792505050565b9450905061111b818386611781565b8251602001935061112a611888565b6110008186866064600019fa61113f57600080fd5b805194506000600160f81b8616156111ce5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050506040513d60208110156111cb57600080fd5b50505b856001600160401b0316955060208201935060006111ee858884156117c2565b90985090506001600160401b03808216908c161461123d5760405162461bcd60e51b8152600401808060200182810382526033815260200180611a926033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c49260038501929101906118a7565b50506003546001600160401b03600160401b9091048116908d161115905061130c576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141b57506003546001600160401b038381169116145b92915050565b60005460ff1615611479576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60008061149e60405180610100016040528060e0815260200161196360e09139611777565b815160045590925090506114b0611862565b60006114be848460006117c2565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152a9260038501929101906118a7565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b60405180610100016040528060e0815260200161196360e0913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061164e5780518252601f19909201916020918201910161162f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116bc5780518252601f19909201916020918201910161169d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b60008460600151518284010392506000806117298760600151611777565b9092509050611739828683611781565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a1578251825260209283019290910190601f1901611782565b915181516020939093036101000a6000190180199091169216919091179052565b6117ca611862565b60088401516028850151604890950180519095600092916117e9611862565b6020810183905260408101829052866118545760008060688a036040519080825280601f01601f19166020018201604052801561182d576020820181803683370190505b506060840181905261183e90611777565b909250905061185160208c018383611781565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118e857805160ff1916838001178555611915565b82800160010185558215611915579182015b828111156119155782518255916020019190600101906118fa565b50611921929150611925565b5090565b6107e391905b80821115611921576000815560010161192b56fe6661696c656420746f2073657269616c697a6520636f6e73656e73757320737461746542696e616e63652d436861696e2d47616e67657300000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000aea1ac326886b992a991d21a6eb155f41b77867cbf659e78f31d89d8205122a84d1be64f0e9a466c2e66a53433928192783e29f8fa21beb2133499b5ef770f60000000e8d4a5100099308aa365c40554bc89982af505d85da95251445d5dd4a9bb37dd2584fd92d3000000e8d4a5100001776920ff0b0f38d78cf95c033c21adf7045785114e392a7544179652e0a612000000e8d4a510006661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a264697066735822122054f539d4f9624b5b87ea3b4d66b04e31a6fa9de3789af1872d4cddc7acc2a79364736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001004": { + "balance": "180000000000000000000000000", + "code": "0x6080604052600436106102cd5760003560e01c80639dc0926211610175578063bd466461116100dc578063ebf71d5311610095578063fc1a598f1161006f578063fc1a598f14610c23578063fc3e59081461094e578063fd6a687914610c56578063ff9c00271461074c57610315565b8063ebf71d5314610be4578063f014847214610bf9578063f9a2bbc714610c0e57610315565b8063bd46646114610aed578063c81b166214610b20578063c8509d8114610b35578063dc6f5e901461094e578063dc927faf14610bba578063e1c7392a14610bcf57610315565b8063aa7415f51161012e578063aa7415f514610963578063ab51bb96146109aa578063ac431751146109bf578063b770186114610a8a578063b99328c514610a9f578063b9fd21e314610ad857610315565b80639dc09262146108c7578063a1a11bf5146108dc578063a496fba2146108f1578063a5cd588b14610906578063a78abc1614610939578063a7c9f02d1461094e57610315565b806361368475116102345780637942fd05116101ed5780638eff336c116101c75780638eff336c1461082557806396713da9146108645780639a854bbd146108795780639a99b4f01461088e57610315565b80637942fd051461078b578063831d65d1146107a05780638b87b21f1461056157610315565b8063613684751461031a5780636e0565201461060b5780636e47b4821461073757806370fd5bad1461074c57806371d308631461076157806375d47a0a1461077657610315565b806343756e5c1161028657806343756e5c14610576578063493279b11461058b5780634bf6c8821461031a57806350432d32146105b757806351e80672146105cc57806359b92789146105e157610315565b8063077b8f351461031a5780630bee7a67146103455780631182b87514610373578063149d14d91461046d5780633d713223146104945780633dffc3871461056157610315565b36610315573415610313576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561032657600080fd5b5061032f610c6b565b6040805160ff9092168252519081900360200190f35b34801561035157600080fd5b5061035a610c70565b6040805163ffffffff9092168252519081900360200190f35b34801561037f57600080fd5b506103f86004803603604081101561039657600080fd5b60ff8235169190810190604081016020820135600160201b8111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460018302840111600160201b831117156103ed57600080fd5b509092509050610c75565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561043257818101518382015260200161041a565b50505050905090810190601f16801561045f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561047957600080fd5b50610482610da3565b60408051918252519081900360200190f35b3480156104a057600080fd5b50610545600480360360208110156104b757600080fd5b810190602081018135600160201b8111156104d157600080fd5b8201836020820111156104e357600080fd5b803590602001918460018302840111600160201b8311171561050457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610da9945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561056d57600080fd5b5061032f610dcd565b34801561058257600080fd5b50610545610dd2565b34801561059757600080fd5b506105a0610dd8565b6040805161ffff9092168252519081900360200190f35b3480156105c357600080fd5b50610482610ddd565b3480156105d857600080fd5b50610545610de8565b3480156105ed57600080fd5b506105456004803603602081101561060457600080fd5b5035610dee565b6107236004803603608081101561062157600080fd5b810190602081018135600160201b81111561063b57600080fd5b82018360208201111561064d57600080fd5b803590602001918460208302840111600160201b8311171561066e57600080fd5b919390929091602081019035600160201b81111561068b57600080fd5b82018360208201111561069d57600080fd5b803590602001918460208302840111600160201b831117156106be57600080fd5b919390929091602081019035600160201b8111156106db57600080fd5b8201836020820111156106ed57600080fd5b803590602001918460208302840111600160201b8311171561070e57600080fd5b91935091503567ffffffffffffffff16610e09565b604080519115158252519081900360200190f35b34801561074357600080fd5b506105456112f1565b34801561075857600080fd5b5061032f6112f7565b34801561076d57600080fd5b506104826112fc565b34801561078257600080fd5b50610545611302565b34801561079757600080fd5b5061032f611308565b3480156107ac57600080fd5b50610313600480360360408110156107c357600080fd5b60ff8235169190810190604081016020820135600160201b8111156107e757600080fd5b8201836020820111156107f957600080fd5b803590602001918460018302840111600160201b8311171561081a57600080fd5b50909250905061130d565b34801561083157600080fd5b506103136004803603606081101561084857600080fd5b508035906001600160a01b036020820135169060400135611456565b34801561087057600080fd5b5061032f6114dc565b34801561088557600080fd5b506104826114e1565b34801561089a57600080fd5b50610482600480360360408110156108b157600080fd5b506001600160a01b0381351690602001356114ed565b3480156108d357600080fd5b50610545611611565b3480156108e857600080fd5b50610545611617565b3480156108fd57600080fd5b5061032f61161d565b34801561091257600080fd5b506104826004803603602081101561092957600080fd5b50356001600160a01b0316611622565b34801561094557600080fd5b50610723611634565b34801561095a57600080fd5b5061032f61163d565b6107236004803603608081101561097957600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff16611642565b3480156109b657600080fd5b5061035a61161d565b3480156109cb57600080fd5b50610313600480360360408110156109e257600080fd5b810190602081018135600160201b8111156109fc57600080fd5b820183602082011115610a0e57600080fd5b803590602001918460018302840111600160201b83111715610a2f57600080fd5b919390929091602081019035600160201b811115610a4c57600080fd5b820183602082011115610a5e57600080fd5b803590602001918460018302840111600160201b83111715610a7f57600080fd5b509092509050611d16565b348015610a9657600080fd5b50610482611f85565b348015610aab57600080fd5b5061031360048036036040811015610ac257600080fd5b50803590602001356001600160a01b0316611f8b565b348015610ae457600080fd5b50610482612001565b348015610af957600080fd5b5061048260048036036020811015610b1057600080fd5b50356001600160a01b031661200b565b348015610b2c57600080fd5b50610545612026565b348015610b4157600080fd5b5061031360048036036040811015610b5857600080fd5b60ff8235169190810190604081016020820135600160201b811115610b7c57600080fd5b820183602082011115610b8e57600080fd5b803590602001918460018302840111600160201b83111715610baf57600080fd5b50909250905061202c565b348015610bc657600080fd5b506105456120fc565b348015610bdb57600080fd5b50610313612102565b348015610bf057600080fd5b5061032f6121a2565b348015610c0557600080fd5b5061032f6121a7565b348015610c1a57600080fd5b506105456121ac565b348015610c2f57600080fd5b506103f860048036036020811015610c4657600080fd5b50356001600160a01b03166121b2565b348015610c6257600080fd5b506105456122d9565b600881565b606481565b60005460609060ff16610cbd576040805162461bcd60e51b815260206004820152601960248201526000805160206145c7833981519152604482015290519081900360640190fd5b3361200014610cfd5760405162461bcd60e51b815260040180806020018281038252602f815260200180614575602f913960400191505060405180910390fd5b60ff841660021415610d4f57610d4883838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506122df92505050565b9050610d9c565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b606181565b662386f26fc1000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6000805460ff16610e4f576040805162461bcd60e51b815260206004820152601960248201526000805160206145c7833981519152604482015290519081900360640190fd5b868514610e8d5760405162461bcd60e51b815260040180806020018281038252603b81526020018061453a603b913960400191505060405180910390fd5b868314610ecb5760405162461bcd60e51b815260040180806020018281038252603f81526020018061440d603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610f175760405162461bcd60e51b81526004018080602001828103825260248152602001806142fd6024913960400191505060405180910390fd5b6402540be400340615610f5b5760405162461bcd60e51b815260040180806020018281038252604081526020018061463d6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015610f8e578160200160208202803683370190505b50905060005b84811015611069576402540be4008b8b83818110610fae57fe5b9050602002013581610fbc57fe5b0615610ff95760405162461bcd60e51b815260040180806020018281038252603c81526020018061444c603c913960400191505060405180910390fd5b61101e8b8b8381811061100857fe5b905060200201358561240390919063ffffffff16565b935061104a6402540be4008c8c8481811061103557fe5b9050602002013561245d90919063ffffffff16565b82828151811061105657fe5b6020908102919091010152600101610f94565b5060015461108e90611081908663ffffffff61249f16565b849063ffffffff61240316565b3410156110cc5760405162461bcd60e51b81526004018080602001828103825260568152602001806145e76056913960600191505060405180910390fd5b6110dc348463ffffffff6124f816565b91506110e6614156565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d760036111aa8461253a565b6111bf876402540be40063ffffffff61245d16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561121d578181015183820152602001611205565b50505050905090810190601f16801561124a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561126b57600080fd5b505af115801561127f573d6000803e3d6000fd5b505050506040513d602081101561129557600080fd5b505060408051600081523360208201528082018690526060810185905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9181900360800190a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff16611352576040805162461bcd60e51b815260206004820152601960248201526000805160206145c7833981519152604482015290519081900360640190fd5b33612000146113925760405162461bcd60e51b815260040180806020018281038252602f815260200180614575602f913960400191505060405180910390fd5b60ff8316600314156113e2576113dd82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127f592505050565b611451565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146114965760405162461bcd60e51b81526004018080602001828103825260238152602001806145a46023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff16611533576040805162461bcd60e51b815260206004820152601960248201526000805160206145c7833981519152604482015290519081900360640190fd5b33611005146115735760405162461bcd60e51b815260040180806020018281038252602f815260200180614270602f913960400191505060405180910390fd5b60004783106115825747611584565b825b90508015611608576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156115c2573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60026020526000908152604090205481565b60005460ff1681565b600381565b6000805460ff16611688576040805162461bcd60e51b815260206004820152601960248201526000805160206145c7833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156116d45760405162461bcd60e51b81526004018080602001828103825260248152602001806142fd6024913960400191505060405180910390fd5b6402540be4003406156117185760405162461bcd60e51b815260040180806020018281038252604081526020018061463d6040913960400191505060405180910390fd5b600080806001600160a01b0388166117f75760015461173e90879063ffffffff61240316565b34101561177c5760405162461bcd60e51b81526004018080602001828103825260618152602001806143876061913960800191505060405180910390fd5b6402540be4008606156117c05760405162461bcd60e51b815260040180806020018281038252603c81526020018061444c603c913960400191505060405180910390fd5b6117d0348763ffffffff6124f816565b90506117e7866402540be40063ffffffff61245d16565b6221272160e91b93509150611a9a565b6001600160a01b03881660009081526003602052604090205492508261184e5760405162461bcd60e51b81526004018080602001828103825260318152602001806143566031913960400191505060405180910390fd5b60015434101561188f5760405162461bcd60e51b815260040180806020018281038252603f8152602001806144a9603f913960400191505060405180910390fd5b506001600160a01b03871660009081526002602052604090205434906008811115806118da57506008811180156118da57506118d8876007198301600a0a63ffffffff61285116565b155b6119155760405162461bcd60e51b815260040180806020018281038252603c81526020018061444c603c913960400191505060405180910390fd5b61191f8782612893565b925061192a846128d3565b15611972576305f5e1008310156119725760405162461bcd60e51b815260040180806020018281038252603a81526020018061429f603a913960400191505060405180910390fd5b60088110158061198c575060088110801561198c57508683115b6119c75760405162461bcd60e51b81526004018080602001828103825260258152602001806143e86025913960400191505060405180910390fd5b677ce66c50e2840000831115611a0e5760405162461bcd60e51b81526004018080602001828103825260358152602001806143216035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611a6357600080fd5b505af1158015611a77573d6000803e3d6000fd5b505050506040513d6020811015611a8d57600080fd5b5051611a9857600080fd5b505b611aa2614156565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611b5057fe5b602002602001018181525050878160600151600081518110611b6e57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611ba057fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611bcb8461253a565b611be0866402540be40063ffffffff61245d16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c3e578181015183820152602001611c26565b50505050905090810190601f168015611c6b5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015611c8c57600080fd5b505af1158015611ca0573d6000803e3d6000fd5b505050506040513d6020811015611cb657600080fd5b5050604080516001600160a01b038b1681523360208201528082018990526060810184905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9181900360800190a150600198975050505050505050565b3361100714611d565760405162461bcd60e51b815260040180806020018281038252602e8152602001806144e8602e913960400191505060405180910390fd5b60208114611dab576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611eb3576020820151670de0b6b3a76400008111158015611e5a57506402540be4008106155b611eab576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611ef0565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61c35081565b3361100814611fcb5760405162461bcd60e51b81526004018080602001828103825260238152602001806145a46023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff16612071576040805162461bcd60e51b815260206004820152601960248201526000805160206145c7833981519152604482015290519081900360640190fd5b33612000146120b15760405162461bcd60e51b815260040180806020018281038252602f815260200180614575602f913960400191505060405180910390fd5b60ff8316600314156113e2576113dd82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129d992505050565b61100381565b60005460ff161561215a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b662386f26fc1000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff16101561224257828160ff168151811061221657fe5b01602001516001600160f81b031916156122355760019091019061223a565b612242565b6001016121fb565b5060608160ff166040519080825280601f01601f191660200182016040528015612273576020820181803683370190505b50905060005b8260ff168160ff1610156122cf57838160ff168151811061229657fe5b602001015160f81c60f81b828260ff16815181106122b057fe5b60200101906001600160f81b031916908160001a905350600101612279565b5095945050505050565b61100481565b60606122e96141a2565b60006122f484612ad7565b915091508061234a576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b600061235583612c16565b905063ffffffff8116156123e9576040808401516020808601516001600160a01b031660009081526002909152918220546123909190612893565b905061239a6141d7565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff1681525090506123dd81612f2e565b95505050505050610dc8565b50506040805160008152602081019091529150610dc89050565b600082820183811015611608576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600061160883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061300a565b6000826124ae5750600061160b565b828202828482816124bb57fe5b04146116085760405162461bcd60e51b81526004018080602001828103825260218152602001806144886021913960400191505060405180910390fd5b600061160883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130ac565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081612555575050835190915061257790613106565b8160008151811061258457fe5b60200260200101819052506125a583602001516001600160a01b0316613119565b816001815181106125b257fe5b6020026020010181905250600083604001515190506060816040519080825280602002602001820160405280156125fd57816020015b60608152602001906001900390816125e85790505b50905060005b8281101561264a5761262b8660400151828151811061261e57fe5b6020026020010151613106565b82828151811061263757fe5b6020908102919091010152600101612603565b506126548161313c565b8360028151811061266157fe5b60200260200101819052506060826040519080825280602002602001820160405280156126a257816020015b606081526020019060019003908161268d5790505b50905060005b838110156126f8576126d9876060015182815181106126c357fe5b60200260200101516001600160a01b0316613119565b8282815181106126e557fe5b60209081029190910101526001016126a8565b506127028161313c565b8460038151811061270f57fe5b602002602001018190525060608360405190808252806020026020018201604052801561275057816020015b606081526020019060019003908161273b5790505b50905060005b8481101561279057612771886080015182815181106126c357fe5b82828151811061277d57fe5b6020908102919091010152600101612756565b5061279a8161313c565b856004815181106127a757fe5b60200260200101819052506127c98760a0015167ffffffffffffffff16613106565b856005815181106127d657fe5b60200260200101819052506127ea8561313c565b979650505050505050565b6127fd6141fe565b6000612808836131c6565b91509150806128485760405162461bcd60e51b81526004018080602001828103825260248152602001806145166024913960400191505060405180910390fd5b61145182613391565b600061160883836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506137e2565b600060088211156128bc576128b5836007198401600a0a63ffffffff61245d16565b905061160b565b611608836008849003600a0a63ffffffff61249f16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff16101561294957828160ff168151811061291d57fe5b01602001516001600160f81b0319161561293c57600190910190612941565b612949565b600101612902565b50600860ff8216101561296157600092505050610dc8565b816005820360ff168151811061297357fe5b6020910101516001600160f81b031916602d60f81b1461299857600092505050610dc8565b816001820360ff16815181106129aa57fe5b6020910101516001600160f81b031916604d60f81b146129cf57600092505050610dc8565b5060019392505050565b6129e1614156565b60006129ec83613844565b9150915080612a2c5760405162461bcd60e51b81526004018080602001828103825260248152602001806142d96024913960400191505060405180910390fd5b612a346141fe565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612ab557612a9285604001518281518110612a8457fe5b602002602001015183613abf565b85604001518281518110612aa257fe5b6020908102919091010152600101612a64565b506080840151604083015260056060830152612ad082613391565b5050505050565b612adf6141a2565b6000612ae96141a2565b612af1614235565b612b02612afd86613af8565b613b1d565b90506000805b612b1183613b67565b15612c095780612b3357612b2c612b2784613b88565b613bd6565b8452612c01565b8060011415612b6057612b4d612b4884613b88565b613c36565b6001600160a01b03166020850152612c01565b8060021415612b7f57612b75612b2784613b88565b6040850152612c01565b8060031415612ba757612b94612b4884613b88565b6001600160a01b03166060850152612c01565b8060041415612bcf57612bbc612b4884613b88565b6001600160a01b03166080850152612c01565b8060051415612bfc57612be4612b2784613b88565b67ffffffffffffffff1660a085015260019150612c01565b612c09565b600101612b08565b5091935090915050915091565b60208101516000906001600160a01b0316612d18578160a0015167ffffffffffffffff16421115612c4957506001610dc8565b8160400151471015612c5d57506003610dc8565b81606001516001600160a01b03166108fc83604001519081150290604051600060405180830381858888f19350505050612c9957506004610dc8565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5982602001518360600151846040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a1506000610dc8565b8160a0015167ffffffffffffffff16421115612d3657506001610dc8565b81516020808401516001600160a01b031660009081526003909152604090205414612d6357506002610dc8565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612db357600080fd5b5086fa158015612dc7573d6000803e3d6000fd5b50505050506040513d6020811015612dde57600080fd5b50516040840151909150811015612df9575060039050610dc8565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612e6a57600080fd5b5087f1158015612e7e573d6000803e3d6000fd5b50505050506040513d6020811015612e9557600080fd5b505190508015612f22577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610dc89050565b5060059150610dc89050565b60408051600480825260a08201909252606091829190816020015b6060815260200190600190039081612f495750508351909150612f6b90613106565b81600081518110612f7857fe5b6020026020010181905250612f908360200151613106565b81600181518110612f9d57fe5b6020026020010181905250612fbe83604001516001600160a01b0316613119565b81600281518110612fcb57fe5b6020026020010181905250612fe9836060015163ffffffff16613106565b81600381518110612ff657fe5b6020026020010181905250610d9c8161313c565b600081836130965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561305b578181015183820152602001613043565b50505050905090810190601f1680156130885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816130a257fe5b0495945050505050565b600081848411156130fe5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561305b578181015183820152602001613043565b505050900390565b606061160b61311483613c50565b613d36565b60408051600560a21b8318601482015260348101909152606090610d9c81613d36565b606081516000141561315d5750604080516000815260208101909152610dc8565b60608260008151811061316c57fe5b602002602001015190506000600190505b83518110156131ad576131a38285838151811061319657fe5b6020026020010151613d88565b915060010161317d565b50610d9c6131c0825160c060ff16613e05565b82613d88565b6131ce6141fe565b60006131d86141fe565b6131e0614235565b6131ec612afd86613af8565b90506000805b6131fb83613b67565b15612c09578061322157613211612b4884613b88565b6001600160a01b03168452613389565b80600114156132c257606061323d61323885613b88565b613efd565b9050805160405190808252806020026020018201604052801561326a578160200160208202803683370190505b50602086015260005b81518110156132bb5761329882828151811061328b57fe5b6020026020010151613bd6565b866020015182815181106132a857fe5b6020908102919091010152600101613273565b5050613389565b80600214156133645760606132d961323885613b88565b90508051604051908082528060200260200182016040528015613306578160200160208202803683370190505b50604086015260005b81518110156132bb5761333482828151811061332757fe5b6020026020010151613c36565b8660400151828151811061334457fe5b6001600160a01b039092166020928302919091019091015260010161330f565b8060031415612bfc57613379612b2784613b88565b63ffffffff166060850152600191505b6001016131f2565b80516001600160a01b03166135885760005b81602001515181101561358257816040015181815181106133c057fe5b60200260200101516001600160a01b03166108fc836020015183815181106133e457fe5b60200260200101519081150290604051600060405180830381858888f193505050506134c4577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e82600001518360400151838151811061344057fe5b60200260200101518460200151848151811061345857fe5b6020026020010151856060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a161357a565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8260000151836040015183815181106134fa57fe5b60200260200101518460200151848151811061351257fe5b6020026020010151856060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b6001016133a3565b506137df565b60005b8160200151518110156137dd57600082600001516001600160a01b031663a9059cbb61c350856040015185815181106135c057fe5b6020026020010151866020015186815181106135d857fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561362f57600080fd5b5087f1158015613643573d6000803e3d6000fd5b50505050506040513d602081101561365a57600080fd5b50519050801561371e577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061369a57fe5b6020026020010151856020015185815181106136b257fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16137d4565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061375457fe5b60200260200101518560200151858151811061376c57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b5060010161358b565b505b50565b600081836138315760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561305b578181015183820152602001613043565b5082848161383b57fe5b06949350505050565b61384c614156565b6000613856614156565b61385e614235565b61386a612afd86613af8565b90506000805b61387983613b67565b15613ab157806138965761388f612b2784613b88565b8452613aa9565b80600114156138be576138ab612b4884613b88565b6001600160a01b03166020850152613aa9565b806002141561394d5760606138d561323885613b88565b90508051604051908082528060200260200182016040528015613902578160200160208202803683370190505b50604086015260005b81518110156139465761392382828151811061328b57fe5b8660400151828151811061393357fe5b602090810291909101015260010161390b565b5050613aa9565b80600314156139e257606061396461323885613b88565b90508051604051908082528060200260200182016040528015613991578160200160208202803683370190505b50606086015260005b8151811015613946576139b282828151811061332757fe5b866060015182815181106139c257fe5b6001600160a01b039092166020928302919091019091015260010161399a565b8060041415613a775760606139f961323885613b88565b90508051604051908082528060200260200182016040528015613a26578160200160208202803683370190505b50608086015260005b815181101561394657613a4782828151811061332757fe5b86608001518281518110613a5757fe5b6001600160a01b0390921660209283029190910190910152600101613a2f565b8060051415613aa457613a8c612b2784613b88565b67ffffffffffffffff1660a085015260019150613aa9565b613ab1565b600101613870565b509195600195509350505050565b60006008821115613ae1576128b5836007198401600a0a63ffffffff61249f16565b611608836008849003600a0a63ffffffff61245d16565b613b00614255565b506040805180820190915281518152602082810190820152919050565b613b25614235565b613b2e82613fce565b613b3757600080fd5b6000613b468360200151613ffe565b60208085015160408051808201909152868152920190820152915050919050565b6000613b71614255565b505080518051602091820151919092015191011190565b613b90614255565b613b9982613b67565b613ba257600080fd5b60208201516000613bb282614061565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613beb57508151602110155b613bf457600080fd5b6000613c038360200151613ffe565b83516020808601518301805193945091849003929190831015613c2d57826020036101000a820491505b50949350505050565b8051600090601514613c4757600080fd5b61160b82613bd6565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613c9457506018613cb8565b6fffffffffffffffffffffffffffffffff198416613cb457506010613cb8565b5060005b6020811015613cee57818181518110613ccd57fe5b01602001516001600160f81b03191615613ce657613cee565b600101613cb8565b60008160200390506060816040519080825280601f01601f191660200182016040528015613d23576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613d685750607f60f81b82600081518110613d5657fe5b01602001516001600160f81b03191611155b15613d74575080610dc8565b61160b613d868351608060ff16613e05565b835b6060806040519050835180825260208201818101602087015b81831015613db9578051835260209283019201613da1565b50855184518101855292509050808201602086015b81831015613de6578051835260209283019201613dce565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613e55576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613eaf5782840160f81b81600081518110613e9157fe5b60200101906001600160f81b031916908160001a905350905061160b565b6060613eba85613c50565b90508381510160370160f81b82600081518110613ed357fe5b60200101906001600160f81b031916908160001a905350613ef48282613d88565b95945050505050565b6060613f0882613fce565b613f1157600080fd5b6000613f1c836140fa565b9050606081604051908082528060200260200182016040528015613f5a57816020015b613f47614255565b815260200190600190039081613f3f5790505b5090506000613f6c8560200151613ffe565b60208601510190506000805b84811015613fc357613f8983614061565b9150604051806040016040528083815260200184815250848281518110613fac57fe5b602090810291909101015291810191600101613f78565b509195945050505050565b8051600090613fdf57506000610dc8565b6020820151805160001a9060c08210156129cf57600092505050610dc8565b8051600090811a6080811015614018576000915050610dc8565b60b8811080614033575060c08110801590614033575060f881105b15614042576001915050610dc8565b60c08110156140565760b519019050610dc8565b60f519019050610dc8565b80516000908190811a608081101561407c57600191506140f3565b60b881101561409157607e19810191506140f3565b60c08110156140be5760b78103600185019450806020036101000a855104600182018101935050506140f3565b60f88110156140d35760be19810191506140f3565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b805160009061410b57506000610dc8565b6000809050600061411f8460200151613ffe565b602085015185519181019250015b8082101561414d5761413e82614061565b6001909301929091019061412d565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614248614255565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220ee0772c728608488e6a5f5dfa5f29f8c4467aea7333c447ace15be38f4600ff464736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001005": { + "balance": "0x0", + "code": "0x6080604052600436106102605760003560e01c80637942fd0511610144578063ac431751116100b6578063dc927faf1161007a578063dc927faf1461076a578063dcae76ab1461077f578063e1c7392a14610794578063f9a2bbc7146107a9578063fc3e5908146107be578063fd6a6879146107d357610267565b8063ac43175114610630578063af40068114610701578063bd4cc8301461072b578063c7d2b028146102eb578063c81b16621461075557610267565b8063a1a11bf511610108578063a1a11bf5146105b2578063a3c3c0ad146105c7578063a413aff6146105dc578063a60d770b146105f1578063a78abc1614610606578063ab51bb961461061b57610267565b80637942fd051461052b57806387c1830a14610540578063930e1b091461055557806396713da9146105885780639dc092621461059d57610267565b806343756e5c116101dd57806354133307116101a15780635413330714610445578063572120951461045a5780636e47b4821461048d5780636f93d2e6146104a257806370fd5bad1461050157806375d47a0a1461051657610267565b806343756e5c146103b0578063490dfdf7146103c5578063493279b1146103ef5780634bf6c8821461041b57806351e806721461043057610267565b8063189d817211610224578063189d8172146103005780631b20087c146103155780631c6433121461032a5780633dffc3871461037057806341b5f4e51461039b57610267565b806308f2ec061461026c5780630bee7a67146102935780630c732068146102c157806310e06a76146102d6578063117048d8146102eb57610267565b3661026757005b600080fd5b34801561027857600080fd5b506102816107e8565b60408051918252519081900360200190f35b34801561029f57600080fd5b506102a86107ee565b6040805163ffffffff9092168252519081900360200190f35b3480156102cd57600080fd5b506102816107f3565b3480156102e257600080fd5b506102816107f9565b3480156102f757600080fd5b506102816107ff565b34801561030c57600080fd5b50610281610804565b34801561032157600080fd5b5061028161080a565b34801561033657600080fd5b506103546004803603602081101561034d57600080fd5b5035610810565b604080516001600160a01b039092168252519081900360200190f35b34801561037c57600080fd5b506103856107ff565b6040805160ff9092168252519081900360200190f35b3480156103a757600080fd5b50610281610837565b3480156103bc57600080fd5b5061035461083c565b3480156103d157600080fd5b50610354600480360360208110156103e857600080fd5b5035610842565b3480156103fb57600080fd5b5061040461084f565b6040805161ffff9092168252519081900360200190f35b34801561042757600080fd5b50610385610854565b34801561043c57600080fd5b50610354610859565b34801561045157600080fd5b5061028161085f565b34801561046657600080fd5b506102816004803603602081101561047d57600080fd5b50356001600160a01b0316610865565b34801561049957600080fd5b50610354610877565b3480156104ae57600080fd5b506104ed600480360360808110156104c557600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135151561087d565b604080519115158252519081900360200190f35b34801561050d57600080fd5b50610385610c21565b34801561052257600080fd5b50610354610c26565b34801561053757600080fd5b50610385610c2c565b34801561054c57600080fd5b50610281610c31565b34801561056157600080fd5b506102816004803603602081101561057857600080fd5b50356001600160a01b0316610c37565b34801561059457600080fd5b50610385610c49565b3480156105a957600080fd5b50610354610c4e565b3480156105be57600080fd5b50610354610c54565b3480156105d357600080fd5b50610281610c5a565b3480156105e857600080fd5b50610281610c60565b3480156105fd57600080fd5b50610281610c66565b34801561061257600080fd5b506104ed610c6b565b34801561062757600080fd5b506102a8610c74565b34801561063c57600080fd5b506106ff6004803603604081101561065357600080fd5b81019060208101813564010000000081111561066e57600080fd5b82018360208201111561068057600080fd5b803590602001918460018302840111640100000000831117156106a257600080fd5b9193909290916020810190356401000000008111156106c057600080fd5b8201836020820111156106d257600080fd5b803590602001918460018302840111640100000000831117156106f457600080fd5b509092509050610c79565b005b34801561070d57600080fd5b506102816004803603602081101561072457600080fd5b5035611237565b34801561073757600080fd5b506102816004803603602081101561074e57600080fd5b5035611299565b34801561076157600080fd5b506103546112b4565b34801561077657600080fd5b506103546112ba565b34801561078b57600080fd5b506102816112c0565b3480156107a057600080fd5b506106ff6112c6565b3480156107b557600080fd5b5061035461138f565b3480156107ca57600080fd5b50610385611395565b3480156107df57600080fd5b5061035461139a565b61019081565b606481565b60035481565b600b5481565b600181565b60045481565b600c5481565b6006818154811061081d57fe5b6000918252602090912001546001600160a01b0316905081565b605081565b61100181565b6008818154811061081d57fe5b606181565b600881565b61200081565b6103e881565b60076020526000908152604090205481565b61100581565b6000805460ff166108d5576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109155760405162461bcd60e51b815260040180806020018281038252602f815260200180611d2b602f913960400191505060405180910390fd5b6000821561099a57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b15801561096757600080fd5b505af115801561097b573d6000803e3d6000fd5b505050506040513d602081101561099157600080fd5b50519050610a13565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b1580156109e457600080fd5b505af11580156109f8573d6000803e3d6000fd5b505050506040513d6020811015610a0e57600080fd5b505190505b600c805460010190556000610a27826113a0565b600954909150610a3d908263ffffffff6113cf16565b600955600a54610a65908290610a59908563ffffffff6113cf16565b9063ffffffff61143016565b600a556001600160a01b038716600090815260056020526040902054610ad157600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610b4f57600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c546103e81415610c1457600b54600954600a5460408051938452602084019290925282820152517f127fd0fd1fcf84c71c5c649625ef186be105a71ecc80c7cb3f96cd99ccae1e0f9181900360600190a1610bca86611472565b610bd38661171f565b6040516110029081904780156108fc02916000818181858888f19350505050158015610c03573d6000803e3d6000fd5b5050600b805460010190556000600c555b5060019695505050505050565b600281565b61100881565b600b81565b60015481565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60025481565b600581565b60005460ff1681565b600081565b3361100714610cb95760405162461bcd60e51b815260040180806020018281038252602e815260200180611cdc602e913960400191505060405180910390fd5b60005460ff16610cfa5760405162461bcd60e51b8152600401808060200182810382526021815260200180611d0a6021913960400191505060405180910390fd5b610d6684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601581527436b7b632b1bab632a432b0b232b92932b630bcb2b960591b6020820152915061199f9050565b15610df15760208114610daa5760405162461bcd60e51b8152600401808060200182810382526028815260200180611c656028913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610de891858580838501838280828437600092019190915250611a8692505050565b600155506111a5565b610e6584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601881527f64656e6f6d696e61746f7248656164657252656c6179657200000000000000006020820152915061199f9050565b15610f2d5760208114610ea95760405162461bcd60e51b815260040180806020018281038252602e815260200180611c8d602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610ee791858580838501838280828437600092019190915250611a8692505050565b905080610f255760405162461bcd60e51b8152600401808060200182810382526030815260200180611d5a6030913960400191505060405180910390fd5b6002556111a5565b610fa184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f6d6f6c6563756c6543616c6c6572436f6d70656e736174696f6e0000000000006020820152915061199f9050565b1561102c5760208114610fe55760405162461bcd60e51b815260040180806020018281038252602e815260200180611c8d602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161102391858580838501838280828437600092019190915250611a8692505050565b600355506111a5565b6110a084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f64656e6f6d696e61746f7243616c6c6572436f6d70656e736174696f6e0000006020820152915061199f9050565b1561116857602081146110e45760405162461bcd60e51b815260040180806020018281038252602e815260200180611c8d602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161112291858580838501838280828437600092019190915250611a8692505050565b9050806111605760405162461bcd60e51b8152600401808060200182810382526035815260200180611d8a6035913960400191505060405180910390fd5b6004556111a5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60006101908211611249575080611294565b8161019010801561125c57506103208211155b1561126a5750610190611294565b6103208211801561127d575061044c8211155b1561128e57506104b0819003611294565b50600481045b919050565b600061019082116112ab575080611294565b50610190611294565b61100281565b61100381565b60095481565b60005460ff161561131e576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561136c576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b61100081565b600381565b61100481565b60006113c96002546113bd60015485611a8b90919063ffffffff16565b9063ffffffff611ae416565b92915050565b600082820183811015611429576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600061142983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b26565b600954600680546040805160208084028201810190925282815260009360609391929091908301828280156114d057602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116114b2575b5050505050905060608151604051908082528060200260200182016040528015611504578160200160208202803683370190505b50905060005b825181101561159157600083828151811061152157fe5b60200260200101519050600061155b60056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611299565b90508084848151811061156a57fe5b6020908102919091010152611585868263ffffffff6113cf16565b9550505060010161150a565b5060006115af6004546113bd60035488611a8b90919063ffffffff16565b90506115c1858263ffffffff61143016565b94508460015b84518110156116575760006115fc876113bd8a8886815181106115e657fe5b6020026020010151611a8b90919063ffffffff16565b905085828151811061160a57fe5b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f15061164c93508692508491505063ffffffff61143016565b9250506001016115c7565b508360008151811061166557fe5b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f150506040516001600160a01b038b16935085156108fc0292508591506000818181858888f1505060006009819055925050505b845181101561170957600560008683815181106116db57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000908120556001016116c2565b5061171660066000611c22565b50505050505050565b600a546008805460408051602080840282018101909252828152600093606093919290919083018282801561177d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161175f575b50505050509050606081516040519080825280602002602001820160405280156117b1578160200160208202803683370190505b50905060005b82518110156118305760008382815181106117ce57fe5b60200260200101519050600061180860076000846001600160a01b03166001600160a01b0316815260200190815260200160002054611237565b90508084848151811061181757fe5b60209081029190910101529490940193506001016117b7565b50600061184e6004546113bd60035488611a8b90919063ffffffff16565b9050611860858263ffffffff61143016565b94508460015b84518110156118e0576000611885876113bd8a8886815181106115e657fe5b905085828151811061189357fe5b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f1506118d593508692508491505063ffffffff61143016565b925050600101611866565b50836000815181106118ee57fe5b60200260200101516001600160a01b03166108fc829081150290604051600060405180830381858888f150506040516001600160a01b038b16935085156108fc0292508591506000818181858888f150506000600a819055925050505b8451811015611992576007600086838151811061196457fe5b6020908102919091018101516001600160a01b0316825281019190915260400160009081205560010161194b565b5061171660086000611c22565b6000816040516020018082805190602001908083835b602083106119d45780518252601f1990920191602091820191016119b5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611a425780518252601f199092019160209182019101611a23565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611a9a575060006113c9565b82820282848281611aa757fe5b04146114295760405162461bcd60e51b8152600401808060200182810382526021815260200180611cbb6021913960400191505060405180910390fd5b600061142983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611bbd565b60008184841115611bb55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b7a578181015183820152602001611b62565b50505050905090810190601f168015611ba75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611c0c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611b7a578181015183820152602001611b62565b506000838581611c1857fe5b0495945050505050565b5080546000825590600052602060002090810190611c409190611c43565b50565b611c6191905b80821115611c5d5760008155600101611c49565b5090565b9056fe6c656e677468206f66206d6f6c6563756c6548656164657252656c61796572206d69736d617463686c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206e657744656e6f6d696e61746f7248656164657252656c61796572206d757374206e6f74206265207a65726f746865206e657744656e6f6d696e61746f7243616c6c6572436f6d70656e736174696f6e206d757374206e6f74206265207a65726fa26469706673582212202548a56b68ed51ad6e9a1aa43899b24ae5df4a24a9f594232fc5392c443544fb64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001006": { + "balance": "0x0", + "code": "0x6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b50610214610733565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610738565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b5061027061073e565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b50610214610743565b3480156102a857600080fd5b5061023f610748565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b031661074e565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d61076c565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f610772565b34801561034057600080fd5b50610214610778565b34801561035557600080fd5b5061023f61077d565b34801561036a57600080fd5b50610214610783565b34801561037f57600080fd5b5061030d610788565b34801561039457600080fd5b5061030d610795565b3480156103a957600080fd5b506102146107a1565b3480156103be57600080fd5b5061023f6107a6565b3480156103d357600080fd5b5061023f6107ac565b3480156103e857600080fd5b506102e46107b2565b3480156103fd57600080fd5b506101dc6107bb565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b5090925090506107c0565b3480156104e157600080fd5b5061023f610bd6565b3480156104f657600080fd5b5061023f610bdc565b34801561050b57600080fd5b506101fd610be2565b34801561052057600080fd5b506101fd610c64565b34801561053557600080fd5b5061023f610e0b565b34801561054a57600080fd5b5061030d610e11565b34801561055f57600080fd5b50610214610e17565b34801561057457600080fd5b5061023f610e1c565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e22565b156106775760405162461bcd60e51b8152600401808060200182810382526027815260200180610f546027913960400191505060405180910390fd5b60015434146106b75760405162461bcd60e51b8152600401808060200182810382526025815260200180610f2f6025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff16610813576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146108535760405162461bcd60e51b815260040180806020018281038252602e815260200180610f7b602e913960400191505060405180910390fd5b6108b984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e289050565b156109b057602081146108fd5760405162461bcd60e51b8152600401808060200182810382526022815260200180610fa96022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161093b91858580838501838280828437600092019190915250610f0f92505050565b9050600181101580156109575750683635c9adc5dea000008111155b6109a8576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b44565b610a0b84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e289050565b15610b075760208114610a65576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610aa391858580838501838280828437600092019190915250610f0f92505050565b9050600081118015610ab6575060015481105b610aff576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b44565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c3a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610cbf576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d12576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d1a610f14565b50336000818152600360209081526040808320815180830183528154808252600190920154938101849052915191949392900380156108fc0292909190818181858888f19350505050158015610d74573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610daa573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610e5d5780518252601f199092019160209182019101610e3e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610ecb5780518252601f199092019160209182019101610eac565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a2646970667358221220fb9552ef120a66e5db5b423b7f53133dfd781b3274938e279792aad5d583b27564736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001007": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610627565b61019b61062c565b6102d1610631565b6102d1610637565b6103e861063d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610646565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061064c565b6102d1610683565b6102d1610689565b6102b361068f565b6102d1610694565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f815260200180611276602f913960400191505060405180910390fd5b6104f5611211565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061069a92505050565b9150915080610552576105496064610760565b92505050610593565b600061055d836107ca565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d81610760565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606181565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b60405162461bcd60e51b81526004018080602001828103825260238152602001806112a56023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b6106a2611211565b60006106ac611211565b6106b461123b565b6106c56106c086610b6b565b610b90565b90506000805b6106d483610bda565b1561075357806106f6576106ef6106ea84610bfb565b610c49565b845261074b565b80600114156107155761070b6106ea84610bfb565b602085015261074b565b80600214156107465761072f61072a84610bfb565b610cc2565b6001600160a01b031660408501526001915061074b565b610753565b6001016106cb565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b606081526020019060019003908161077a5790505090506107a08363ffffffff16610ce2565b816000815181106107ad57fe5b60200260200101819052506107c181610cf5565b9150505b919050565b60006107d98260400151610d7f565b61084557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a15060656107c5565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b838110156108b257818101518382015260200161089a565b50505050905090810190601f1680156108df5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156109125781810151838201526020016108fa565b50505050905090810190601f16801561093f5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561096057600080fd5b505af1925050508015610971575060015b610b63576040516000815260443d101561098d57506000610a2a565b60046000803e60005160e01c6308c379a081146109ae576000915050610a2a565b60043d036004833e81513d602482011167ffffffffffffffff821117156109da57600092505050610a2a565b808301805167ffffffffffffffff8111156109fc576000945050505050610a2a565b8060208301013d8601811115610a1a57600095505050505050610a2a565b601f01601f191660405250925050505b80610a355750610ad8565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a94578181015183820152602001610a7c565b50505050905090810190601f168015610ac15780820380516001836020036101000a031916815260200191505b509250505060405180910390a160669150506107c5565b3d808015610b02576040519150601f19603f3d011682016040523d82523d6000602084013e610b07565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610a94578181015183820152602001610a7c565b506000919050565b610b7361125b565b506040805180820190915281518152602082810190820152919050565b610b9861123b565b610ba182610d85565b610baa57600080fd5b6000610bb98360200151610dbf565b60208085015160408051808201909152868152920190820152915050919050565b6000610be461125b565b505080518051602091820151919092015191011190565b610c0361125b565b610c0c82610bda565b610c1557600080fd5b60208201516000610c2582610e22565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610c5757600080fd5b6000610c668360200151610dbf565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610c9d576020820181803683370190505b5090506000816020019050610cb9848760200151018285610ebb565b50949350505050565b8051600090601514610cd357600080fd5b610cdc82610f06565b92915050565b6060610cdc610cf083610f64565b61104a565b6060815160001415610d1657506040805160008152602081019091526107c5565b606082600081518110610d2557fe5b602002602001015190506000600190505b8351811015610d6657610d5c82858381518110610d4f57fe5b602002602001015161109c565b9150600101610d36565b506107c1610d79825160c060ff16611119565b8261109c565b3b151590565b8051600090610d96575060006107c5565b6020820151805160001a9060c0821015610db5576000925050506107c5565b5060019392505050565b8051600090811a6080811015610dd95760009150506107c5565b60b8811080610df4575060c08110801590610df4575060f881105b15610e035760019150506107c5565b60c0811015610e175760b5190190506107c5565b60f5190190506107c5565b80516000908190811a6080811015610e3d5760019150610eb4565b60b8811015610e5257607e1981019150610eb4565b60c0811015610e7f5760b78103600185019450806020036101000a85510460018201810193505050610eb4565b60f8811015610e945760be1981019150610eb4565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b80610ec557610622565b5b60208110610ee5578251825260209283019290910190601f1901610ec6565b915181516020939093036101000a6000190180199091169216919091179052565b805160009015801590610f1b57508151602110155b610f2457600080fd5b6000610f338360200151610dbf565b83516020808601518301805193945091849003929190831015610cb957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416610fa857506018610fcc565b6fffffffffffffffffffffffffffffffff198416610fc857506010610fcc565b5060005b602081101561100257818181518110610fe157fe5b01602001516001600160f81b03191615610ffa57611002565b600101610fcc565b60008160200390506060816040519080825280601f01601f191660200182016040528015611037576020820181803683370190505b5080830196909652508452509192915050565b60608151600114801561107c5750607f60f81b8260008151811061106a57fe5b01602001516001600160f81b03191611155b156110885750806107c5565b610cdc61109a8351608060ff16611119565b835b6060806040519050835180825260208201818101602087015b818310156110cd5780518352602092830192016110b5565b50855184518101855292509050808201602086015b818310156110fa5780518352602092830192016110e2565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310611169576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116111c35782840160f81b816000815181106111a557fe5b60200101906001600160f81b031916908160001a9053509050610cdc565b60606111ce85610f64565b90508381510160370160f81b826000815181106111e757fe5b60200101906001600160f81b031916908160001a905350611208828261109c565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b604051806040016040528061124e61125b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a264697066735822122019628d70dd9ac62a7a85eb3f845d01808a095ab280a95e6dd5609e52788b4c5e64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000001008": { + "balance": "0x0", + "code": "0x6080604052600436106102305760003560e01c806377d9dae81161012e578063c81b1662116100ab578063dc927faf1161006f578063dc927faf14610887578063f9a2bbc71461089c578063fc3e5908146107f1578063fd6a6879146108b1578063fe3a2af51461042457610230565b8063c81b1662146107dc578063c8509d81146106d7578063c8e704a4146107f1578063d117a11014610806578063dc6f5e90146107f157610230565b806396713da9116100f257806396713da9146107735780639dc0926214610788578063a1a11bf51461079d578063a78abc16146107b2578063ab51bb96146107c757610230565b806377d9dae81461060e5780637942fd05146106c25780637d078e13146103b2578063831d65d1146106d757806395b9ad261461075e57610230565b80634a688818116101bc5780636b3f1307116101805780636b3f1307146104785780636e47b4821461054057806370fd5bad1461046357806372c4e0861461055557806375d47a0a146105f957610230565b80634a688818146104245780634bc81c00146104395780634bf6c8821461023557806351e806721461044e5780635f558f861461046357610230565b80631f91600b116102035780631f91600b1461039d57806323996b53146103b25780633dffc387146103b257806343756e5c146103c7578063493279b1146103f857610230565b8063077b8f35146102355780630bee7a67146102605780630f212b1b1461028e5780631182b875146102a3575b600080fd5b34801561024157600080fd5b5061024a6108c6565b6040805160ff9092168252519081900360200190f35b34801561026c57600080fd5b506102756108cb565b6040805163ffffffff9092168252519081900360200190f35b34801561029a57600080fd5b5061024a6108d0565b3480156102af57600080fd5b50610328600480360360408110156102c657600080fd5b60ff8235169190810190604081016020820135600160201b8111156102ea57600080fd5b8201836020820111156102fc57600080fd5b803590602001918460018302840111600160201b8311171561031d57600080fd5b5090925090506108d5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036257818101518382015260200161034a565b50505050905090810190601f16801561038f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103a957600080fd5b5061024a61095e565b3480156103be57600080fd5b5061024a610963565b3480156103d357600080fd5b506103dc610968565b604080516001600160a01b039092168252519081900360200190f35b34801561040457600080fd5b5061040d61096e565b6040805161ffff9092168252519081900360200190f35b34801561043057600080fd5b5061024a610973565b34801561044557600080fd5b5061024a610978565b34801561045a57600080fd5b506103dc61097d565b34801561046f57600080fd5b5061024a610983565b61052c6004803603604081101561048e57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460018302840111600160201b831117156104eb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610988945050505050565b604080519115158252519081900360200190f35b34801561054c57600080fd5b506103dc61121e565b61052c6004803603602081101561056b57600080fd5b810190602081018135600160201b81111561058557600080fd5b82018360208201111561059757600080fd5b803590602001918460018302840111600160201b831117156105b857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611224945050505050565b34801561060557600080fd5b506103dc611683565b61052c6004803603604081101561062457600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561064e57600080fd5b82018360208201111561066057600080fd5b803590602001918460018302840111600160201b8311171561068157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611689945050505050565b3480156106ce57600080fd5b5061024a611ba0565b3480156106e357600080fd5b5061075c600480360360408110156106fa57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071e57600080fd5b82018360208201111561073057600080fd5b803590602001918460018302840111600160201b8311171561075157600080fd5b509092509050611ba5565b005b34801561076a57600080fd5b5061024a611c58565b34801561077f57600080fd5b5061024a611c5d565b34801561079457600080fd5b506103dc611c62565b3480156107a957600080fd5b506103dc611c68565b3480156107be57600080fd5b5061052c611c6e565b3480156107d357600080fd5b50610275610973565b3480156107e857600080fd5b506103dc611c77565b3480156107fd57600080fd5b5061024a611c7d565b34801561081257600080fd5b506108306004803603602081101561082957600080fd5b5035611c82565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561089357600080fd5b506103dc611cda565b3480156108a857600080fd5b506103dc611ce0565b3480156108bd57600080fd5b506103dc611ce6565b600881565b606481565b600681565b606033612000146109175760405162461bcd60e51b815260040180806020018281038252602f815260200180612f8e602f913960400191505060405180910390fd5b61095683838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611cec92505050565b949350505050565b600481565b600181565b61100181565b606181565b600081565b600581565b61200081565b600281565b60008061099483611f7d565b905061099e612e56565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610a64576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610a8182608001518360600151611f8490919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610ad75760405162461bcd60e51b8152600401808060200182810382526045815260200180612f1b6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610b1a57600080fd5b505afa158015610b2e573d6000803e3d6000fd5b505050506040513d6020811015610b4457600080fd5b50516001600160a01b031614610b8b5760405162461bcd60e51b815260040180806020018281038252602e815260200180612f60602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610bd757600080fd5b505afa158015610beb573d6000803e3d6000fd5b505050506040513d6020811015610c0157600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610c929184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610c5a57600080fd5b505afa158015610c6e573d6000803e3d6000fd5b505050506040513d6020811015610c8457600080fd5b50519063ffffffff611fcd16565b1015610ce5576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610d2757600080fd5b505afa158015610d3b573d6000803e3d6000fd5b505050506040513d6020811015610d5157600080fd5b50519050808210801590610d6a57506402540be4008206155b610da55760405162461bcd60e51b8152600401808060200182810382526037815260200180612ee46037913960400191505060405180910390fd5b6000610db1868b612027565b905063ffffffff8116610fb0576001600160a01b038a166323b872dd33611004610de1898963ffffffff611f8416565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015610e4957600080fd5b505af1158015610e5d573d6000803e3d6000fd5b505050506040513d6020811015610e7357600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015610edc57600080fd5b505af1158015610ef0573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015610f6f578181015183820152602001610f57565b50505050905090810190601f168015610f9c5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611068565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556110c2612e92565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f1935050505015801561110a573d6000803e3d6000fd5b5061200063f7a251d7600161111e8461247e565b611133886402540be40063ffffffff61250816565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611191578181015183820152602001611179565b50505050905090810190601f1680156111be5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156111df57600080fd5b505af11580156111f3573d6000803e3d6000fd5b505050506040513d602081101561120957600080fd5b50600199505050505050505050505b92915050565b61100581565b60008061123083611f7d565b905061123a612e56565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611300576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff1610611362576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156113a457600080fd5b505afa1580156113b8573d6000803e3d6000fd5b505050506040513d60208110156113ce57600080fd5b505190508082108015906113e757506402540be4008206155b6114225760405162461bcd60e51b8152600401808060200182810382526037815260200180612ee46037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff1916905561147c612e92565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f193505050501580156114bf573d6000803e3d6000fd5b5061200063f7a251d760016114d38461247e565b6114e8876402540be40063ffffffff61250816565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561154657818101518382015260200161152e565b50505050905090810190601f1680156115735780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561159457600080fd5b505af11580156115a8573d6000803e3d6000fd5b505050506040513d60208110156115be57600080fd5b50506040808501518151600160208281018290528483528b51948301949094528a516001600160a01b03909316937f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a107938c93918291606083019186019080838360005b83811015611639578181015183820152602001611621565b50505050905090810190601f1680156116665780820380516001836020036101000a031916815260200191505b50935050505060405180910390a26001955050505050505b919050565b61100881565b60008061169583611f7d565b905061169f612e56565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611765576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146117b95760405162461bcd60e51b8152600401808060200182810382526045815260200180612f1b6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b1580156117fc57600080fd5b505afa158015611810573d6000803e3d6000fd5b505050506040513d602081101561182657600080fd5b50516001600160a01b031614611883576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703265206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156118c557600080fd5b505afa1580156118d9573d6000803e3d6000fd5b505050506040513d60208110156118ef57600080fd5b5051905080821080159061190857506402540be4008206155b6119435760405162461bcd60e51b8152600401808060200182810382526037815260200180612ee46037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff1916905561199d612e92565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f193505050501580156119e0573d6000803e3d6000fd5b5061200063f7a251d760016119f48461247e565b611a09876402540be40063ffffffff61250816565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611a67578181015183820152602001611a4f565b50505050905090810190601f168015611a945780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b505050506040513d6020811015611adf57600080fd5b505060408051600760208281018290528383528a519383019390935289516001600160a01b038c16937f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a107938c939290918291606083019186019080838360005b83811015611b57578181015183820152602001611b3f565b50505050905090810190601f168015611b845780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611be55760405162461bcd60e51b815260040180806020018281038252602f815260200180612f8e602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600381565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611cf6612e56565b6000611d018461254a565b9150915080611d57576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff16611e0b576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055611f62565b815160ff1660011415611f155760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611e6457600080fd5b505afa158015611e78573d6000803e3d6000fd5b505050506040513d6020811015611e8e57600080fd5b505190506001600160a01b03811615611f0f5760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b158015611ef657600080fd5b505af1158015611f0a573d6000803e3d6000fd5b505050505b50611f62565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b6020015190565b6000611fc683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061269c565b9392505050565b600082820183811015611fc6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d602081101561208d57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156120d557600080fd5b505afa1580156120e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561211257600080fd5b8101908080516040519392919084600160201b82111561213157600080fd5b90830190602082018581111561214657600080fd5b8251600160201b81118282018810171561215f57600080fd5b82525081516020918201929091019080838360005b8381101561218c578181015183820152602001612174565b50505050905090810190601f1680156121b95780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561220957600080fd5b505afa15801561221d573d6000803e3d6000fd5b505050506040513d602081101561223357600080fd5b5051608087015160608801519192506000916122549163ffffffff611f8416565b9050428760c0015167ffffffffffffffff16101561227a57506001935061121892505050565b612288838860200151612733565b61229a57506002935061121892505050565b808211156122b057506003935061121892505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122f257600080fd5b505afa158015612306573d6000803e3d6000fd5b505050506040513d602081101561231c57600080fd5b50511461233157506004935061121892505050565b8660a0015160ff16841461234d57506005935061121892505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561239257600080fd5b505afa1580156123a6573d6000803e3d6000fd5b505050506040513d60208110156123bc57600080fd5b50516001600160a01b031614158061245e57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561242f57600080fd5b505afa158015612443573d6000803e3d6000fd5b505050506040513d602081101561245957600080fd5b505114155b1561247157506006935061121892505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b606081526020019060019003908161249757505083519091506124bf9063ffffffff1661281b565b816000815181106124cc57fe5b60200260200101819052506124e7836020015160001c61281b565b816001815181106124f457fe5b6020026020010181905250611fc68161282e565b6000611fc683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506128b8565b612552612e56565b600061255c612e56565b612564612ea9565b6125756125708661291d565b612942565b90506000805b6125848361298c565b1561268f57806125a95761259f61259a846129ad565b6129fb565b60ff168452612687565b80600114156125c8576125be61259a846129ad565b6020850152612687565b80600214156125f5576125e26125dd846129ad565b612a59565b6001600160a01b03166040850152612687565b80600314156126145761260a61259a846129ad565b6060850152612687565b80600414156126335761262961259a846129ad565b6080850152612687565b80600514156126555761264861259a846129ad565b60ff1660a0850152612687565b80600614156126825761266a61259a846129ad565b67ffffffffffffffff1660c085015260019150612687565b61268f565b60010161257b565b5091935090915050915091565b6000818484111561272b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126f05781810151838201526020016126d8565b50505050905090810190601f16801561271d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b8151600090839060081080612749575080516003115b15612758576000915050611218565b6040805160208082528183019092526060916020820181803683370190505090508360208201528082518151811061278c57fe5b6020910101516001600160f81b031916602d60f81b146127b157600092505050611218565b600160005b8351811015612811578281815181106127cb57fe5b602001015160f81c60f81b6001600160f81b0319168482815181106127ec57fe5b01602001516001600160f81b031916146128095760009150612811565b6001016127b6565b5095945050505050565b606061121861282983612a73565b612b59565b606081516000141561284f575060408051600081526020810190915261167e565b60608260008151811061285e57fe5b602002602001015190506000600190505b835181101561289f576128958285838151811061288857fe5b6020026020010151612bab565b915060010161286f565b50611fc66128b2825160c060ff16612c28565b82612bab565b600081836129075760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156126f05781810151838201526020016126d8565b50600083858161291357fe5b0495945050505050565b612925612ec9565b506040805180820190915281518152602082810190820152919050565b61294a612ea9565b61295382612d20565b61295c57600080fd5b600061296b8360200151612d5a565b60208085015160408051808201909152868152920190820152915050919050565b6000612996612ec9565b505080518051602091820151919092015191011190565b6129b5612ec9565b6129be8261298c565b6129c757600080fd5b602082015160006129d782612dbd565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612a1057508151602110155b612a1957600080fd5b6000612a288360200151612d5a565b83516020808601518301805193945091849003929190831015611f7457506020919091036101000a90049392505050565b8051600090601514612a6a57600080fd5b611218826129fb565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612ab757506018612adb565b6fffffffffffffffffffffffffffffffff198416612ad757506010612adb565b5060005b6020811015612b1157818181518110612af057fe5b01602001516001600160f81b03191615612b0957612b11565b600101612adb565b60008160200390506060816040519080825280601f01601f191660200182016040528015612b46576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612b8b5750607f60f81b82600081518110612b7957fe5b01602001516001600160f81b03191611155b15612b9757508061167e565b611218612ba98351608060ff16612c28565b835b6060806040519050835180825260208201818101602087015b81831015612bdc578051835260209283019201612bc4565b50855184518101855292509050808201602086015b81831015612c09578051835260209283019201612bf1565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612c78576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612cd25782840160f81b81600081518110612cb457fe5b60200101906001600160f81b031916908160001a9053509050611218565b6060612cdd85612a73565b90508381510160370160f81b82600081518110612cf657fe5b60200101906001600160f81b031916908160001a905350612d178282612bab565b95945050505050565b8051600090612d315750600061167e565b6020820151805160001a9060c0821015612d505760009250505061167e565b5060019392505050565b8051600090811a6080811015612d7457600091505061167e565b60b8811080612d8f575060c08110801590612d8f575060f881105b15612d9e57600191505061167e565b60c0811015612db25760b51901905061167e565b60f51901905061167e565b80516000908190811a6080811015612dd85760019150612e4f565b60b8811015612ded57607e1981019150612e4f565b60c0811015612e1a5760b78103600185019450806020036101000a85510460018201810193505050612e4f565b60f8811015612e2f5760be1981019150612e4f565b60f78103600185019450806020036101000a855104600182018101935050505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040518060400160405280612ebc612ec9565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe72656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e6420726571756573746f6e6c79206265703265206f776e65722063616e20617070726f766520746869732062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a26469706673582212208d24722e295c34fcc944dfda2183ee07fab7234ce8b7001a715c221bd92ef86e64736f6c63430006040033" + }, + "0x0000000000000000000000000000000000002000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612046565b604080516001600160401b039092168252519081900360200190f35b610443612061565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612067565b61038a612087565b6104436120a6565b6105b16120ac565b6106c16004803603602081101561074257600080fd5b503560ff16612463565b6104276004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b91935091503561247e565b6104436125d0565b6102556125d6565b6104436125db565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125e1565b50905061086a818388516125eb565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606181565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612b686023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c61262c565b8585612673565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da088612770565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b612820565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100610081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612abe602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129769050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a5d92505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b366032913960400191505060405180910390fd5b600155611fb4565b611c5484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600a81526918591910da185b9b995b60b21b602082015291506129769050565b15611dd957606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cd75760405162461bcd60e51b8152600401808060200182810382526052815260200180612b8b6052913960600191505060405180910390fd5b600181015160028201516016830151611cef81612a62565b611d40576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff808416600081815260056020908152604080832080546001600160a01b0388166001600160a01b03199091168117909155808452600683528184208585528352818420805460ff19908116600117909155600990935281842080549093169588161595909517909155517f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e09190a350505050611fb4565b611e4684848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129769050565b15611f7757606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ec95760405162461bcd60e51b815260040180806020018281038252604a815260200180612aec604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f6d576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fb4565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff1615612104576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b6000805460ff166124d2576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff808a16855292529091205486911661252f5760405162461bcd60e51b8152600401808060200182810382526031815260200180612a8d6031913960400191505060405180910390fd5b60ff86166000908152600760209081526040808320548151601f89018490048402810184019092528782526001600160401b0316926125949284928b926111579290918a918d908d908190840183828082843760009201919091525061080092505050565b60ff969096166000908152600760205260409020805467ffffffffffffffff191660019788016001600160401b03161790555093949350505050565b61100081565b600381565b61100481565b8051602090910191565b5b6020811061260b578251825260209283019290910190601f19016125ec565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100610060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268257506000612767565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126b9576020820181803683370190505b50905060006126c782612a68565b6020808901518252019050866000806126df896125e1565b80865260209095019490925090506126f88285836125eb565b92830192612705886125e1565b808652602090950194909250905061271e8285836125eb565b9283018a815260200192612731876125e1565b90925090506127418285836125eb565b50835160200161274f612a6e565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127a0575050604080516000808252602082019092529092508291508190612819565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127eb576020820181803683370190505b50905060006127f9826125e1565b50905061280b858260218d51036125eb565b506001975091955093509150505b9193509193565b60025443111561285f576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128a0565b600380546001908101918290555410156128a0576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606185604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561293657818101518382015260200161291e565b50505050905090810190601f1680156129635780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129ab5780518252601f19909201916020918201910161298c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a195780518252601f1990920191602091820191016129fa565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e2072656769737465726564746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b207965746c656e677468206f662076616c756520666f72206164644368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373a2646970667358221220230d7e9288613f5afb55ab3692ab4b25169e86ce53da4ef6333e3703c1351f7864736f6c63430006040033" + }, + "9fB29AAc15b9A4B7F17c3385939b007540f4d791": { + "balance": "0x84595161401484a000000" + }, + "37B8516a0F88E65D677229b402ec6C1e0E333004": { + "balance": "0x84595161401484a000000" + } +} \ No newline at end of file diff --git a/core/allocs/dev.json b/core/allocs/dev.json new file mode 100644 index 00000000000..afdf4f9feac --- /dev/null +++ b/core/allocs/dev.json @@ -0,0 +1,35 @@ +{ + "0x0000000000000000000000000000000000000001": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "0x1" + }, + "0x67b1d87101671b127f5f8714789C7192f7ad340e": { + "balance": "0x21e19e0c9bab2400000" + }, + "0xa94f5374Fce5edBC8E2a8697C15331677e6EbF0B": { + "balance": "0x21e19e0c9bab2400000" + } +} \ No newline at end of file diff --git a/core/allocs/fermion.json b/core/allocs/fermion.json new file mode 100644 index 00000000000..8ee158b6a06 --- /dev/null +++ b/core/allocs/fermion.json @@ -0,0 +1,38 @@ +{ + "0x0000000000000000000000000000000000000001": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "0x1" + }, + "0x42D5d120aD9c1692c5Fa72DcA20657254bbAa08D": { + "balance": "1000000000000000000000000" + }, + "0x3EC60Da1858eC7fA8EDD0dc736611Dba9ab43999": { + "balance": "1000000000000000000000000" + }, + "0x3a03F6D88437328CE8623EF5e80C67383704eBc1": { + "balance": "1000000000000000000000000" + } +} \ No newline at end of file diff --git a/core/allocs/kiln-devnet.json b/core/allocs/kiln-devnet.json new file mode 100644 index 00000000000..f2935e638c4 --- /dev/null +++ b/core/allocs/kiln-devnet.json @@ -0,0 +1,840 @@ +{ + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x4242424242424242424242424242424242424242": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0xf97e180c050e5Ab072211Ad2C213Eb5AEE4DF134": { + "balance": "10000000000000000000000000" + }, + "0x2cA5F489CC1Fd1CEC24747B64E8dE0F4A6A850E1": { + "balance": "10000000000000000000000000" + }, + "0x7203bd333a874D9d329050ecE393820fCD501eaA": { + "balance": "10000000000000000000000000" + }, + "0xA51918aA40D78Ff8be939bf0E8404252875c6aDF": { + "balance": "10000000000000000000000000" + }, + "0xAA81078e6b2121dd7A846690DFdD6b10d7658d8B": { + "balance": "10000000000000000000000000" + }, + "0xFA2d31D8f21c1D1633E9BEB641dF77D21D63ccDd": { + "balance": "10000000000000000000000000" + }, + "0xf751C9c6d60614226fE57D2cAD6e10C856a2ddA3": { + "balance": "10000000000000000000000000" + }, + "0x9cD16887f6A808AEaa65D3c840f059EeA4ca1319": { + "balance": "10000000000000000000000000" + }, + "0x2E07043584F11BFF0AC39c927665DF6c6ebaffFB": { + "balance": "10000000000000000000000000" + }, + "0x60e771E5eCA8E26690920de669520Da210D64A9B": { + "balance": "10000000000000000000000000" + }, + "0xFC4db92C2Cf77CE02fBfd7Da0346d2CbFA66aD59": { + "balance": "10000000000000000000000000" + } +} \ No newline at end of file diff --git a/core/allocs/kovan.json b/core/allocs/kovan.json new file mode 100644 index 00000000000..1821842a563 --- /dev/null +++ b/core/allocs/kovan.json @@ -0,0 +1,17 @@ +{ + "0x0000000000000000000000000000000000000001": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1" + }, + "0x00521965e7bd230323c423d96c657db5b79d099f": { + "balance": "1606938044258990275541962092341162602522202993782792835301376" + } +} \ No newline at end of file diff --git a/core/allocs/mumbai.json b/core/allocs/mumbai.json new file mode 100644 index 00000000000..e90415e3193 --- /dev/null +++ b/core/allocs/mumbai.json @@ -0,0 +1,30 @@ +{ + "0000000000000000000000000000000000001000": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806360c8614d1161010f578063af26aa96116100a2578063d5b844eb11610071578063d5b844eb14610666578063dcf2793a14610684578063e3b7c924146106b6578063f59cf565146106d4576101f0565b8063af26aa96146105c7578063b71d7a69146105e7578063b7ab4db514610617578063c1b3c91914610636576101f0565b806370ba5707116100de57806370ba57071461052b57806398ab2b621461055b5780639d11b80714610579578063ae756451146105a9576101f0565b806360c8614d1461049c57806365b3a1e2146104bc57806366332354146104db578063687a9bd6146104f9576101f0565b80633434735f1161018757806344d6528f1161015657806344d6528f146103ee5780634dbc959f1461041e57806355614fcc1461043c578063582a8d081461046c576101f0565b80633434735f1461035257806335ddfeea1461037057806343ee8213146103a057806344c15cb1146103be576101f0565b806323f2a73f116101c357806323f2a73f146102a45780632bc06564146102d45780632de3a180146102f25780632eddf35214610322576101f0565b8063047a6c5b146101f55780630c35b1cb146102275780631270b5741461025857806323c2a2b414610288575b600080fd5b61020f600480360361020a9190810190612b24565b610706565b60405161021e93929190613463565b60405180910390f35b610241600480360361023c9190810190612b24565b61075d565b60405161024f929190613284565b60405180910390f35b610272600480360361026d9190810190612b4d565b610939565b60405161027f91906132bb565b60405180910390f35b6102a2600480360361029d9190810190612c2c565b610a91565b005b6102be60048036036102b99190810190612b4d565b61112a565b6040516102cb91906132bb565b60405180910390f35b6102dc611281565b6040516102e99190613411565b60405180910390f35b61030c60048036036103079190810190612a81565b611286565b60405161031991906132d6565b60405180910390f35b61033c60048036036103379190810190612b24565b611307565b6040516103499190613411565b60405180910390f35b61035a611437565b6040516103679190613269565b60405180910390f35b61038a60048036036103859190810190612abd565b61144f565b60405161039791906132bb565b60405180910390f35b6103a861151a565b6040516103b591906132d6565b60405180910390f35b6103d860048036036103d39190810190612b89565b611531565b6040516103e59190613411565b60405180910390f35b61040860048036036104039190810190612b4d565b611619565b60405161041591906133f6565b60405180910390f35b610426611781565b6040516104339190613411565b60405180910390f35b61045660048036036104519190810190612a06565b611791565b60405161046391906132bb565b60405180910390f35b61048660048036036104819190810190612a2f565b6117ab565b60405161049391906132d6565b60405180910390f35b6104a4611829565b6040516104b393929190613463565b60405180910390f35b6104c461189d565b6040516104d2929190613284565b60405180910390f35b6104e3611b6e565b6040516104f09190613411565b60405180910390f35b610513600480360361050e9190810190612bf0565b611b73565b6040516105229392919061342c565b60405180910390f35b61054560048036036105409190810190612a06565b611bd7565b60405161055291906132bb565b60405180910390f35b610563611bf1565b60405161057091906132d6565b60405180910390f35b610593600480360361058e9190810190612b24565b611c08565b6040516105a09190613411565b60405180910390f35b6105b1611d39565b6040516105be91906132d6565b60405180910390f35b6105cf611d50565b6040516105de93929190613463565b60405180910390f35b61060160048036036105fc9190810190612b24565b611db1565b60405161060e9190613411565b60405180910390f35b61061f611eb1565b60405161062d929190613284565b60405180910390f35b610650600480360361064b9190810190612b24565b611ec5565b60405161065d9190613411565b60405180910390f35b61066e611ee6565b60405161067b919061349a565b60405180910390f35b61069e60048036036106999190810190612bf0565b611eeb565b6040516106ad9392919061342c565b60405180910390f35b6106be611f4f565b6040516106cb9190613411565b60405180910390f35b6106ee60048036036106e99190810190612b24565b611f61565b6040516106fd93929190613463565b60405180910390f35b60008060006002600085815260200190815260200160002060000154600260008681526020019081526020016000206001015460026000878152602001908152602001600020600201549250925092509193909250565b60608060ff83116107795761077061189d565b91509150610934565b600061078484611db1565b9050606060016000838152602001908152602001600020805490506040519080825280602002602001820160405280156107cd5781602001602082028038833980820191505090505b509050606060016000848152602001908152602001600020805490506040519080825280602002602001820160405280156108175781602001602082028038833980820191505090505b50905060008090505b60016000858152602001908152602001600020805490508110156109295760016000858152602001908152602001600020818154811061085c57fe5b906000526020600020906003020160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683828151811061089a57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001600085815260200190815260200160002081815481106108f257fe5b90600052602060002090600302016001015482828151811061091057fe5b6020026020010181815250508080600101915050610820565b508181945094505050505b915091565b6000606060016000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190610970565b50505050905060008090505b8151811015610a84578373ffffffffffffffffffffffffffffffffffffffff16828281518110610a4457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff161415610a7757600192505050610a8b565b8080600101915050610a18565b5060009150505b92915050565b73fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0a906133d6565b60405180910390fd5b6000610b1d611781565b90506000811415610b3157610b30611f8b565b5b610b456001826122ac90919063ffffffff16565b8814610b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7d90613356565b60405180910390fd5b868611610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf906133b6565b60405180910390fd5b6000604060018989030181610bd957fe5b0614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190613396565b60405180910390fd5b8660026000838152602001908152602001600020600101541115610c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6a90613336565b60405180910390fd5b6000600260008a81526020019081526020016000206000015414610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390613376565b60405180910390fd5b604051806060016040528089815260200188815260200187815250600260008a8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600388908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008a815260200190815260200160002081610d669190612800565b506000600160008a815260200190815260200160002081610d879190612800565b506060610ddf610dda87878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b8151811015610f51576060610e0e838381518110610e0157fe5b60200260200101516122f9565b90506000808c81526020019081526020016000208054809190600101610e349190612800565b506040518060600160405280610e5d83600081518110610e5057fe5b60200260200101516123d6565b8152602001610e7f83600181518110610e7257fe5b60200260200101516123d6565b8152602001610ea183600281518110610e9457fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff168152506000808d81526020019081526020016000208381548110610ed757fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610de7565b506060610fa9610fa486868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506122cb565b6122f9565b905060008090505b815181101561111d576060610fd8838381518110610fcb57fe5b60200260200101516122f9565b9050600160008d81526020019081526020016000208054809190600101610fff9190612800565b5060405180606001604052806110288360008151811061101b57fe5b60200260200101516123d6565b815260200161104a8360018151811061103d57fe5b60200260200101516123d6565b815260200161106c8360028151811061105f57fe5b6020026020010151612447565b73ffffffffffffffffffffffffffffffffffffffff16815250600160008e815260200190815260200160002083815481106110a357fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050508080600101915050610fb1565b5050505050505050505050565b60006060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156111fc578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611160565b50505050905060008090505b8151811015611274578373ffffffffffffffffffffffffffffffffffffffff1682828151811061123457fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff1614156112675760019250505061127b565b8080600101915050611208565b5060009150505b92915050565b604081565b60006002600160f81b84846040516020016112a3939291906131d6565b6040516020818303038152906040526040516112bf9190613213565b602060405180830381855afa1580156112dc573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506112ff9190810190612a58565b905092915050565b60006060600080848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113d9578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250508152602001906001019061133d565b505050509050600080905060008090505b825181101561142c5761141d83828151811061140257fe5b602002602001015160200151836122ac90919063ffffffff16565b915080806001019150506113ea565b508092505050919050565b73fffffffffffffffffffffffffffffffffffffffe81565b600080600080859050600060218087518161146657fe5b04029050600081111561147f5761147c876117ab565b91505b6000602190505b818111611509576000600182038801519050818801519550806000602081106114ab57fe5b1a60f81b9450600060f81b857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156114f0576114e98685611286565b93506114fd565b6114fa8487611286565b93505b50602181019050611486565b508782149450505050509392505050565b60405161152690613254565b604051809103902081565b60008060009050600080905060008090505b84518167ffffffffffffffff16101561160c57606061156e868367ffffffffffffffff16604161246a565b9050600061158582896124f690919063ffffffff16565b905061158f612832565b6115998a83611619565b90506115a58a8361112a565b80156115dc57508473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16115b156115fe578194506115fb8160200151876122ac90919063ffffffff16565b95505b505050604181019050611543565b5081925050509392505050565b611621612832565b6060600080858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156116f1578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611655565b50505050905060008090505b8151811015611779578373ffffffffffffffffffffffffffffffffffffffff1682828151811061172957fe5b60200260200101516040015173ffffffffffffffffffffffffffffffffffffffff16141561176c5781818151811061175d57fe5b60200260200101519250611779565b80806001019150506116fd565b505092915050565b600061178c43611db1565b905090565b60006117a461179e611781565b8361112a565b9050919050565b60006002600060f81b836040516020016117c69291906131aa565b6040516020818303038152906040526040516117e29190613213565b602060405180830381855afa1580156117ff573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052506118229190810190612a58565b9050919050565b60008060008061184a600161183c611781565b6122ac90919063ffffffff16565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b606080606060056040519080825280602002602001820160405280156118d25781602001602082028038833980820191505090505b50905073c26880a0af2ea0c7e8130e6ec47af756465452e8816000815181106118f757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073be188d6641e8b680743a4815dfa0f6208038960f8160018151811061195357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c275dc8be39f50d12f66b6a63629c39da5bae5bd816002815181106119af57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073f903ba9e006193c1527bfbe65fe2123704ea3f9981600381518110611a0b57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073928ed6a3e94437bbd316ccad78479f1d163a6a8c81600481518110611a6757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606005604051908082528060200260200182016040528015611ad35781602001602082028038833980820191505090505b50905061271081600081518110611ae657fe5b60200260200101818152505061271081600181518110611b0257fe5b60200260200101818152505061271081600281518110611b1e57fe5b60200260200101818152505061271081600381518110611b3a57fe5b60200260200101818152505061271081600481518110611b5657fe5b60200260200101818152505081819350935050509091565b60ff81565b60016020528160005260406000208181548110611b8c57fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b6000611bea611be4611781565b83610939565b9050919050565b604051611bfd9061322a565b604051809103902081565b6000606060016000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611cdb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505081526020019060010190611c3f565b505050509050600080905060008090505b8251811015611d2e57611d1f838281518110611d0457fe5b602002602001015160200151836122ac90919063ffffffff16565b91508080600101915050611cec565b508092505050919050565b604051611d459061323f565b604051809103902081565b600080600080611d5e611781565b905060026000828152602001908152602001600020600001546002600083815260200190815260200160002060010154600260008481526020019081526020016000206002015493509350935050909192565b60008060038054905090505b6000811115611e7157611dce612869565b6002600060036001850381548110611de257fe5b906000526020600020015481526020019081526020016000206040518060600160405290816000820154815260200160018201548152602001600282015481525050905083816020015111158015611e3f57506000816040015114155b8015611e4f575080604001518411155b15611e6257806000015192505050611eac565b50808060019003915050611dbd565b5060006003805490501115611ea757600360016003805490500381548110611e9557fe5b90600052602060002001549050611eac565b600090505b919050565b606080611ebd4361075d565b915091509091565b60038181548110611ed257fe5b906000526020600020016000915090505481565b600281565b60006020528160005260406000208181548110611f0457fe5b9060005260206000209060030201600091509150508060000154908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b600060404381611f5b57fe5b04905090565b60026020528060005260406000206000915090508060000154908060010154908060020154905083565b606080611f9661189d565b8092508193505050600080905060405180606001604052808281526020016000815260200160ff81525060026000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600381908060018154018082558091505090600182039060005260206000200160009091929091909150555060008060008381526020019081526020016000208161203f9190612800565b50600060016000838152602001908152602001600020816120609190612800565b5060008090505b83518110156121825760008083815260200190815260200160002080548091906001016120949190612800565b5060405180606001604052808281526020018483815181106120b257fe5b602002602001015181526020018583815181106120cb57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815250600080848152602001908152602001600020828154811061210957fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612067565b5060008090505b83518110156122a6576001600083815260200190815260200160002080548091906001016121b79190612800565b5060405180606001604052808281526020018483815181106121d557fe5b602002602001015181526020018583815181106121ee57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681525060016000848152602001908152602001600020828154811061222d57fe5b9060005260206000209060030201600082015181600001556020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050508080600101915050612189565b50505050565b6000808284019050838110156122c157600080fd5b8091505092915050565b6122d361288a565b600060208301905060405180604001604052808451815260200182815250915050919050565b606061230482612600565b61230d57600080fd5b60006123188361264e565b905060608160405190808252806020026020018201604052801561235657816020015b6123436128a4565b81526020019060019003908161233b5790505b509050600061236885602001516126bf565b8560200151019050600080600090505b848110156123c95761238983612748565b91506040518060400160405280838152602001848152508482815181106123ac57fe5b602002602001018190525081830192508080600101915050612378565b5082945050505050919050565b60008082600001511180156123f057506021826000015111155b6123f957600080fd5b600061240883602001516126bf565b9050600081846000015103905060008083866020015101905080519150602083101561243b57826020036101000a820491505b81945050505050919050565b6000601582600001511461245a57600080fd5b612463826123d6565b9050919050565b60608183018451101561247c57600080fd5b6060821560008114612499576040519150602082016040526124ea565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124d757805183526020830192506020810190506124ba565b50868552601f19601f8301166040525050505b50809150509392505050565b600080600080604185511461251157600093505050506125fa565b602085015192506040850151915060ff6041860151169050601b8160ff16101561253c57601b810190505b601b8160ff16141580156125545750601c8160ff1614155b1561256557600093505050506125fa565b60006001878386866040516000815260200160405260405161258a94939291906132f1565b6020604051602081039080840390855afa1580156125ac573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125f257600080fd5b809450505050505b92915050565b600080826000015114156126175760009050612649565b60008083602001519050805160001a915060c060ff168260ff16101561264257600092505050612649565b6001925050505b919050565b6000808260000151141561266557600090506126ba565b6000809050600061267984602001516126bf565b84602001510190506000846000015185602001510190505b808210156126b3576126a282612748565b820191508280600101935050612691565b8293505050505b919050565b600080825160001a9050608060ff168110156126df576000915050612743565b60b860ff16811080612704575060c060ff168110158015612703575060f860ff1681105b5b15612713576001915050612743565b60c060ff168110156127335760018060b80360ff16820301915050612743565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561276957600191506127f6565b60b860ff16811015612786576001608060ff1682030191506127f5565b60c060ff168110156127b65760b78103600185019450806020036101000a855104600182018101935050506127f4565b60f860ff168110156127d357600160c060ff1682030191506127f3565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b81548183558181111561282d5760030281600302836000526020600020918201910161282c91906128be565b5b505050565b60405180606001604052806000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b60405180606001604052806000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b604051806040016040528060008152602001600081525090565b61291191905b8082111561290d5760008082016000905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506003016128c4565b5090565b90565b60008135905061292381613693565b92915050565b600081359050612938816136aa565b92915050565b60008151905061294d816136aa565b92915050565b60008083601f84011261296557600080fd5b8235905067ffffffffffffffff81111561297e57600080fd5b60208301915083600182028301111561299657600080fd5b9250929050565b600082601f8301126129ae57600080fd5b81356129c16129bc826134e2565b6134b5565b915080825260208301602083018583830111156129dd57600080fd5b6129e883828461363d565b50505092915050565b600081359050612a00816136c1565b92915050565b600060208284031215612a1857600080fd5b6000612a2684828501612914565b91505092915050565b600060208284031215612a4157600080fd5b6000612a4f84828501612929565b91505092915050565b600060208284031215612a6a57600080fd5b6000612a788482850161293e565b91505092915050565b60008060408385031215612a9457600080fd5b6000612aa285828601612929565b9250506020612ab385828601612929565b9150509250929050565b600080600060608486031215612ad257600080fd5b6000612ae086828701612929565b9350506020612af186828701612929565b925050604084013567ffffffffffffffff811115612b0e57600080fd5b612b1a8682870161299d565b9150509250925092565b600060208284031215612b3657600080fd5b6000612b44848285016129f1565b91505092915050565b60008060408385031215612b6057600080fd5b6000612b6e858286016129f1565b9250506020612b7f85828601612914565b9150509250929050565b600080600060608486031215612b9e57600080fd5b6000612bac868287016129f1565b9350506020612bbd86828701612929565b925050604084013567ffffffffffffffff811115612bda57600080fd5b612be68682870161299d565b9150509250925092565b60008060408385031215612c0357600080fd5b6000612c11858286016129f1565b9250506020612c22858286016129f1565b9150509250929050565b600080600080600080600060a0888a031215612c4757600080fd5b6000612c558a828b016129f1565b9750506020612c668a828b016129f1565b9650506040612c778a828b016129f1565b955050606088013567ffffffffffffffff811115612c9457600080fd5b612ca08a828b01612953565b9450945050608088013567ffffffffffffffff811115612cbf57600080fd5b612ccb8a828b01612953565b925092505092959891949750929550565b6000612ce88383612d0c565b60208301905092915050565b6000612d00838361317d565b60208301905092915050565b612d15816135b2565b82525050565b612d24816135b2565b82525050565b6000612d358261352e565b612d3f8185613569565b9350612d4a8361350e565b8060005b83811015612d7b578151612d628882612cdc565b9750612d6d8361354f565b925050600181019050612d4e565b5085935050505092915050565b6000612d9382613539565b612d9d818561357a565b9350612da88361351e565b8060005b83811015612dd9578151612dc08882612cf4565b9750612dcb8361355c565b925050600181019050612dac565b5085935050505092915050565b612def816135c4565b82525050565b612e06612e01826135d0565b61367f565b82525050565b612e15816135fc565b82525050565b612e2c612e27826135fc565b613689565b82525050565b6000612e3d82613544565b612e47818561358b565b9350612e5781856020860161364c565b80840191505092915050565b6000612e706004836135a7565b91507f766f7465000000000000000000000000000000000000000000000000000000006000830152600482019050919050565b6000612eb0602d83613596565b91507f537461727420626c6f636b206d7573742062652067726561746572207468616e60008301527f2063757272656e74207370616e000000000000000000000000000000000000006020830152604082019050919050565b6000612f16600f83613596565b91507f496e76616c6964207370616e20696400000000000000000000000000000000006000830152602082019050919050565b6000612f56601383613596565b91507f5370616e20616c726561647920657869737473000000000000000000000000006000830152602082019050919050565b6000612f96604583613596565b91507f446966666572656e6365206265747765656e20737461727420616e6420656e6460008301527f20626c6f636b206d75737420626520696e206d756c7469706c6573206f66207360208301527f7072696e740000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000613022602a83613596565b91507f456e6420626c6f636b206d7573742062652067726561746572207468616e207360008301527f7461727420626c6f636b000000000000000000000000000000000000000000006020830152604082019050919050565b6000613088601283613596565b91507f4e6f742053797374656d204164646573732100000000000000000000000000006000830152602082019050919050565b60006130c86005836135a7565b91507f38303030310000000000000000000000000000000000000000000000000000006000830152600582019050919050565b6000613108600e836135a7565b91507f6865696d64616c6c2d38303030310000000000000000000000000000000000006000830152600e82019050919050565b606082016000820151613151600085018261317d565b506020820151613164602085018261317d565b5060408201516131776040850182612d0c565b50505050565b61318681613626565b82525050565b61319581613626565b82525050565b6131a481613630565b82525050565b60006131b68285612df5565b6001820191506131c68284612e1b565b6020820191508190509392505050565b60006131e28286612df5565b6001820191506131f28285612e1b565b6020820191506132028284612e1b565b602082019150819050949350505050565b600061321f8284612e32565b915081905092915050565b600061323582612e63565b9150819050919050565b600061324a826130bb565b9150819050919050565b600061325f826130fb565b9150819050919050565b600060208201905061327e6000830184612d1b565b92915050565b6000604082019050818103600083015261329e8185612d2a565b905081810360208301526132b28184612d88565b90509392505050565b60006020820190506132d06000830184612de6565b92915050565b60006020820190506132eb6000830184612e0c565b92915050565b60006080820190506133066000830187612e0c565b613313602083018661319b565b6133206040830185612e0c565b61332d6060830184612e0c565b95945050505050565b6000602082019050818103600083015261334f81612ea3565b9050919050565b6000602082019050818103600083015261336f81612f09565b9050919050565b6000602082019050818103600083015261338f81612f49565b9050919050565b600060208201905081810360008301526133af81612f89565b9050919050565b600060208201905081810360008301526133cf81613015565b9050919050565b600060208201905081810360008301526133ef8161307b565b9050919050565b600060608201905061340b600083018461313b565b92915050565b6000602082019050613426600083018461318c565b92915050565b6000606082019050613441600083018661318c565b61344e602083018561318c565b61345b6040830184612d1b565b949350505050565b6000606082019050613478600083018661318c565b613485602083018561318c565b613492604083018461318c565b949350505050565b60006020820190506134af600083018461319b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134d857600080fd5b8060405250919050565b600067ffffffffffffffff8211156134f957600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006135bd82613606565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561366a57808201518184015260208101905061364f565b83811115613679576000848401525b50505050565b6000819050919050565b6000819050919050565b61369c816135b2565b81146136a757600080fd5b50565b6136b3816135fc565b81146136be57600080fd5b50565b6136ca81613626565b81146136d557600080fd5b5056fea365627a7a723158208f52ee07630ffe523cc6ad3e15f437f973dcfa36729cd697f9b0fc4a145a48f06c6578706572696d656e74616cf564736f6c634300050b0040" + }, + "0000000000000000000000000000000000001001": { + "balance": "0x0", + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806319494a17146100465780633434735f146100e15780635407ca671461012b575b600080fd5b6100c76004803603604081101561005c57600080fd5b81019080803590602001909291908035906020019064010000000081111561008357600080fd5b82018360208201111561009557600080fd5b803590602001918460018302840111640100000000831117156100b757600080fd5b9091929391929390505050610149565b604051808215151515815260200191505060405180910390f35b6100e961047a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610133610492565b6040518082815260200191505060405180910390f35b600073fffffffffffffffffffffffffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610200576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f742053797374656d2041646465737321000000000000000000000000000081525060200191505060405180910390fd5b606061025761025285858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050610498565b6104c6565b905060006102788260008151811061026b57fe5b60200260200101516105a3565b905080600160005401146102f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f537461746549647320617265206e6f742073657175656e7469616c000000000081525060200191505060405180910390fd5b600080815480929190600101919050555060006103248360018151811061031757fe5b6020026020010151610614565b905060606103458460028151811061033857fe5b6020026020010151610637565b9050610350826106c3565b1561046f576000624c4b409050606084836040516024018083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103aa57808201518184015260208101905061038f565b50505050905090810190601f1680156103d75780820380516001836020036101000a031916815260200191505b5093505050506040516020818303038152906040527f26c53bea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060008082516020840160008887f1965050505b505050509392505050565b73fffffffffffffffffffffffffffffffffffffffe81565b60005481565b6104a0610943565b600060208301905060405180604001604052808451815260200182815250915050919050565b60606104d1826106dc565b6104da57600080fd5b60006104e58361072a565b905060608160405190808252806020026020018201604052801561052357816020015b61051061095d565b8152602001906001900390816105085790505b5090506000610535856020015161079b565b8560200151019050600080600090505b848110156105965761055683610824565b915060405180604001604052808381526020018481525084828151811061057957fe5b602002602001018190525081830192508080600101915050610545565b5082945050505050919050565b60008082600001511180156105bd57506021826000015111155b6105c657600080fd5b60006105d5836020015161079b565b9050600081846000015103905060008083866020015101905080519150602083101561060857826020036101000a820491505b81945050505050919050565b6000601582600001511461062757600080fd5b610630826105a3565b9050919050565b6060600082600001511161064a57600080fd5b6000610659836020015161079b565b905060008184600001510390506060816040519080825280601f01601f19166020018201604052801561069b5781602001600182028038833980820191505090505b50905060008160200190506106b78487602001510182856108dc565b81945050505050919050565b600080823b905060008163ffffffff1611915050919050565b600080826000015114156106f35760009050610725565b60008083602001519050805160001a915060c060ff168260ff16101561071e57600092505050610725565b6001925050505b919050565b600080826000015114156107415760009050610796565b60008090506000610755846020015161079b565b84602001510190506000846000015185602001510190505b8082101561078f5761077e82610824565b82019150828060010193505061076d565b8293505050505b919050565b600080825160001a9050608060ff168110156107bb57600091505061081f565b60b860ff168110806107e0575060c060ff1681101580156107df575060f860ff1681105b5b156107ef57600191505061081f565b60c060ff1681101561080f5760018060b80360ff1682030191505061081f565b60018060f80360ff168203019150505b919050565b6000806000835160001a9050608060ff1681101561084557600191506108d2565b60b860ff16811015610862576001608060ff1682030191506108d1565b60c060ff168110156108925760b78103600185019450806020036101000a855104600182018101935050506108d0565b60f860ff168110156108af57600160c060ff1682030191506108cf565b60f78103600185019450806020036101000a855104600182018101935050505b5b5b5b8192505050919050565b60008114156108ea5761093e565b5b602060ff16811061091a5782518252602060ff1683019250602060ff1682019150602060ff16810390506108eb565b6000600182602060ff16036101000a03905080198451168184511681811785525050505b505050565b604051806040016040528060008152602001600081525090565b60405180604001604052806000815260200160008152509056fea265627a7a7231582083fbdacb76f32b4112d0f7db9a596937925824798a0026ba0232322390b5263764736f6c634300050b0032" + }, + "0000000000000000000000000000000000001010": { + "balance": "0x204fcd4f31349d83b6e00000", + "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610e06565b005b3480156103eb57600080fd5b506103f4610f58565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f61565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061111d565b005b3480156104e857600080fd5b506104f16111ec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b50610548611212565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611238565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b50610604611259565b005b34801561061257600080fd5b5061061b611329565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061132f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b506107586114b4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af6114dd565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de611534565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e61156d565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115aa565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b506109646115d0565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b810190808035906020019092919050505061165d565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919050505061167d565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a6561169d565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a906116a4565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb6116aa565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611737565b005b348015610b2e57600080fd5b50610b37611754565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b6000808511610c4857600080fd5b6000831480610c575750824311155b610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5369676e6174757265206973206578706972656400000000000000000000000081525060200191505060405180910390fd5b6000610cd73387878761167d565b9050600015156005600083815260200190815260200160002060009054906101000a900460ff16151514610d73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f536967206465616374697661746564000000000000000000000000000000000081525060200191505060405180910390fd5b60016005600083815260200190815260200160002060006101000a81548160ff021916908315150217905550610ded8189898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061132f565b9150610dfa82848861177a565b50509695505050505050565b60003390506000610e1682611238565b9050610e2d83600654611b3790919063ffffffff16565b600681905550600083118015610e4257508234145b610eb4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610f3087611238565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610f696114dd565b610f7257600080fd5b600081118015610faf5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e636023913960400191505060405180910390fd5b600061100f83611238565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b5061107283600654611b5790919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f685856110f489611238565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611183576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611e406023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111e882611b76565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b6112616114dd565b61126a57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b600080600080604185511461134a57600093505050506114ae565b602085015192506040850151915060ff6041860151169050601b8160ff16101561137557601b810190505b601b8160ff161415801561138d5750601c8160ff1614155b1561139e57600093505050506114ae565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156113fb573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b60008134146115bc57600090506115ca565b6115c733848461177a565b90505b92915050565b6040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b6020831061161f57805182526020820191506020810190506020830392506115fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061169361168e86868686611c6e565b611d44565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611e86605291396040516020018082805190602001908083835b602083106116f957805182526020820191506020810190506020830392506116d6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b61173f6114dd565b61174857600080fd5b61175181611b76565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117fa57600080fd5b505afa15801561180e573d6000803e3d6000fd5b505050506040513d602081101561182457600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156118b657600080fd5b505afa1580156118ca573d6000803e3d6000fd5b505050506040513d60208110156118e057600080fd5b810190808051906020019092919050505090506118fe868686611d8e565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a0657600080fd5b505afa158015611a1a573d6000803e3d6000fd5b505050506040513d6020811015611a3057600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611abe57600080fd5b505afa158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b600082821115611b4657600080fd5b600082840390508091505092915050565b600080828401905083811015611b6c57600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bb057600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806040518060800160405280605b8152602001611ed8605b91396040516020018082805190602001908083835b60208310611cc05780518252602082019150602081019050602083039250611c9d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611dd4573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a723158208f81700133738d766ae3d68af591ad588b0125bd91449192179f460893f79f6b64736f6c634300050b0032" + }, + "C26880A0AF2EA0c7E8130e6EC47Af756465452E8": { + "balance": "0x3635c9adc5dea00000" + }, + "be188D6641E8b680743A4815dFA0f6208038960F": { + "balance": "0x3635c9adc5dea00000" + }, + "c275DC8bE39f50D12F66B6a63629C39dA5BAe5bd": { + "balance": "0x3635c9adc5dea00000" + }, + "F903ba9E006193c1527BfBe65fe2123704EA3F99": { + "balance": "0x3635c9adc5dea00000" + }, + "928Ed6A3e94437bbd316cCAD78479f1d163A6A8C": { + "balance": "0x3635c9adc5dea00000" + } + } + \ No newline at end of file diff --git a/core/allocs/sepolia.json b/core/allocs/sepolia.json new file mode 100644 index 00000000000..e3d1af45ce9 --- /dev/null +++ b/core/allocs/sepolia.json @@ -0,0 +1,47 @@ +{ + "0xa2A6d93439144FFE4D27c9E088dCD8b783946263": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xBc11295936Aa79d594139de1B2e12629414F3BDB": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x7cF5b79bfe291A67AB02b393E456cCc4c266F753": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xaaec86394441f915bce3e6ab399977e9906f3b69": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xF47CaE1CF79ca6758Bfc787dbD21E6bdBe7112B8": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xd7eDDB78ED295B3C9629240E8924fb8D8874ddD8": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x8b7F0977Bb4f0fBE7076FA22bC24acA043583F5e": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xe2e2659028143784d557bcec6ff3a0721048880a": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xd9a5179f091d85051d3c982785efd1455cec8699": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0xbeef32ca5b9a198d27B4e02F4c70439fE60356Cf": { + "balance": "0xD3C21BCECCEDA1000000" + }, + "0x0000006916a87b82333f4245046623b23794c65c": { + "balance": "0x84595161401484A000000" + }, + "0xb21c33de1fab3fa15499c62b59fe0cc3250020d1": { + "balance": "0x52B7D2DCC80CD2E4000000" + }, + "0x10F5d45854e038071485AC9e402308cF80D2d2fE": { + "balance": "0x52B7D2DCC80CD2E4000000" + }, + "0xd7d76c58b3a519e9fA6Cc4D22dC017259BC49F1E": { + "balance": "0x52B7D2DCC80CD2E4000000" + }, + "0x799D329e5f583419167cD722962485926E338F4a": { + "balance": "0xDE0B6B3A7640000" + } +} \ No newline at end of file diff --git a/core/block_proposer.go b/core/block_proposer.go new file mode 100644 index 00000000000..b8f81b8e537 --- /dev/null +++ b/core/block_proposer.go @@ -0,0 +1,11 @@ +package core + +import "github.com/ledgerwatch/erigon/common" + +// See https://github.com/ethereum/execution-apis/blob/main/src/engine/specification.md#payloadattributesv1 +type BlockProposerParametersPOS struct { + ParentHash common.Hash + Timestamp uint64 + PrevRandao common.Hash + SuggestedFeeRecipient common.Address +} diff --git a/core/block_validator.go b/core/block_validator.go index a88b7d8f54c..57dd9bbb3e7 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -21,37 +21,26 @@ import ( ) // CalcGasLimit computes the gas limit of the next block after parent. It aims -// to keep the baseline gas above the provided floor, and increase it towards the -// ceil if the blocks are full. If the ceil is exceeded, it will always decrease -// the gas allowance. -func CalcGasLimit(parentGasUsed, parentGasLimit, gasFloor, gasCeil uint64) uint64 { - // contrib = (parentGasUsed * 3 / 2) / 1024 - contrib := (parentGasUsed + parentGasUsed/2) / params.GasLimitBoundDivisor - - // decay = parentGasLimit / 1024 -1 - decay := parentGasLimit/params.GasLimitBoundDivisor - 1 - - /* - strategy: gasLimit of block-to-mine is set based on parent's - gasUsed value. if parentGasUsed > parentGasLimit * (2/3) then we - increase it, otherwise lower it (or leave it unchanged if it's right - at that usage) the amount increased/decreased depends on how far away - from parentGasLimit * (2/3) parentGasUsed is. - */ - limit := parentGasLimit - decay + contrib - if limit < params.MinGasLimit { - limit = params.MinGasLimit +// to keep the baseline gas close to the provided target, and increase it towards +// the target if the baseline gas is lower. +func CalcGasLimit(parentGasLimit, desiredLimit uint64) uint64 { + delta := parentGasLimit/params.GasLimitBoundDivisor - 1 + limit := parentGasLimit + if desiredLimit < params.MinGasLimit { + desiredLimit = params.MinGasLimit } // If we're outside our allowed gas range, we try to hone towards them - if limit < gasFloor { - limit = parentGasLimit + decay - if limit > gasFloor { - limit = gasFloor + if limit < desiredLimit { + limit = parentGasLimit + delta + if limit > desiredLimit { + limit = desiredLimit } - } else if limit > gasCeil { - limit = parentGasLimit - decay - if limit < gasCeil { - limit = gasCeil + return limit + } + if limit > desiredLimit { + limit = parentGasLimit - delta + if limit < desiredLimit { + limit = desiredLimit } } return limit diff --git a/core/block_validator_test.go b/core/block_validator_test.go index 6c7c5ac908f..4a0cbd34e75 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -21,7 +21,6 @@ import ( "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/ethdb/olddb" "github.com/ledgerwatch/erigon/params" @@ -37,7 +36,7 @@ func TestHeaderVerification(t *testing.T) { ) m := stages.MockWithGenesisEngine(t, gspec, engine) - chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 8, nil, false /* intemediateHashes */) + chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 8, nil, false /* intermediateHashes */) if err != nil { t.Fatalf("genetate chain: %v", err) } @@ -47,10 +46,47 @@ func TestHeaderVerification(t *testing.T) { for j, valid := range []bool{true, false} { if valid { engine := ethash.NewFaker() - err = engine.VerifyHeaders(stagedsync.ChainReader{Cfg: *params.TestChainConfig, Db: olddb.NewObjectDatabase(m.DB)}, []*types.Header{chain.Headers[i]}, []bool{true}) + err = engine.VerifyHeader(stagedsync.ChainReader{Cfg: *params.TestChainConfig, Db: olddb.NewObjectDatabase(m.DB)}, chain.Headers[i], true) } else { engine := ethash.NewFakeFailer(chain.Headers[i].Number.Uint64()) - err = engine.VerifyHeaders(stagedsync.ChainReader{Cfg: *params.TestChainConfig, Db: olddb.NewObjectDatabase(m.DB)}, []*types.Header{chain.Headers[i]}, []bool{true}) + err = engine.VerifyHeader(stagedsync.ChainReader{Cfg: *params.TestChainConfig, Db: olddb.NewObjectDatabase(m.DB)}, chain.Headers[i], true) + } + if (err == nil) != valid { + t.Errorf("test %d.%d: validity mismatch: have %v, want %v", i, j, err, valid) + } + } + + if err = m.InsertChain(chain.Slice(i, i+1)); err != nil { + t.Fatalf("test %d: error inserting the block: %v", i, err) + } + + engine.Close() + } +} + +// Tests that simple header with seal verification works, for both good and bad blocks. +func TestHeaderWithSealVerification(t *testing.T) { + // Create a simple chain to verify + var ( + gspec = &core.Genesis{Config: params.TestChainAuraConfig} + engine = ethash.NewFaker() + ) + m := stages.MockWithGenesisEngine(t, gspec, engine) + + chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 8, nil, false /* intermediateHashes */) + if err != nil { + t.Fatalf("genetate chain: %v", err) + } + + // Run the header checker for blocks one-by-one, checking for both valid and invalid nonces + for i := 0; i < chain.Length; i++ { + for j, valid := range []bool{true, false} { + if valid { + engine := ethash.NewFaker() + err = engine.VerifyHeader(stagedsync.ChainReader{Cfg: *params.TestChainAuraConfig, Db: olddb.NewObjectDatabase(m.DB)}, chain.Headers[i], true) + } else { + engine := ethash.NewFakeFailer(chain.Headers[i].Number.Uint64()) + err = engine.VerifyHeader(stagedsync.ChainReader{Cfg: *params.TestChainAuraConfig, Db: olddb.NewObjectDatabase(m.DB)}, chain.Headers[i], true) } if (err == nil) != valid { t.Errorf("test %d.%d: validity mismatch: have %v, want %v", i, j, err, valid) diff --git a/core/blockchain.go b/core/blockchain.go index 133d2ad3dbc..ef830c54388 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -23,7 +23,12 @@ import ( "os" "time" + "github.com/ledgerwatch/erigon/core/systemcontracts" + "golang.org/x/exp/slices" + metrics2 "github.com/VictoriaMetrics/metrics" + "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/mclock" "github.com/ledgerwatch/erigon/common/u256" @@ -34,14 +39,14 @@ import ( "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" ) var ( - blockExecutionTimer = metrics2.GetOrCreateSummary("chain_execution_seconds") - blockReorgInvalidatedTx = metrics2.GetOrCreateCounter("chain_reorg_invalidTx") + blockExecutionTimer = metrics2.GetOrCreateSummary("chain_execution_seconds") ) +type SyncMode string + const ( TriesInMemory = 128 ) @@ -87,7 +92,7 @@ func (st *InsertStats) Report(logPrefix string, chain []*types.Block, index int, // ExecuteBlockEphemerally runs a block from provided stateReader and // writes the result to the provided stateWriter -func ExecuteBlockEphemerally( +func ExecuteBlockEphemerallyForBSC( chainConfig *params.ChainConfig, vmConfig *vm.Config, getHeader func(hash common.Hash, number uint64) *types.Header, @@ -97,7 +102,7 @@ func ExecuteBlockEphemerally( stateWriter state.WriterWithChangeSets, epochReader consensus.EpochReader, chainReader consensus.ChainHeaderReader, - checkTEVM func(codeHash common.Hash) (bool, error), + contractHasTEVM func(codeHash common.Hash) (bool, error), ) (types.Receipts, error) { defer blockExecutionTimer.UpdateDuration(time.Now()) block.Uncles() @@ -117,9 +122,18 @@ func ExecuteBlockEphemerally( if chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 { misc.ApplyDAOHardFork(ibs) } + systemcontracts.UpgradeBuildInSystemContract(chainConfig, header.Number, ibs) noop := state.NewNoopWriter() + posa, isPoSA := engine.(consensus.PoSA) //fmt.Printf("====txs processing start: %d====\n", block.NumberU64()) for i, tx := range block.Transactions() { + if isPoSA { + if isSystemTx, err := posa.IsSystemTransaction(tx, block.Header()); err != nil { + return nil, err + } else if isSystemTx { + continue + } + } ibs.Prepare(tx.Hash(), block.Hash(), i) writeTrace := false if vmConfig.Debug && vmConfig.Tracer == nil { @@ -127,7 +141,7 @@ func ExecuteBlockEphemerally( writeTrace = true } - receipt, _, err := ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, noop, header, tx, usedGas, *vmConfig, checkTEVM) + receipt, _, err := ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, noop, header, tx, usedGas, *vmConfig, contractHasTEVM) if writeTrace { w, err1 := os.Create(fmt.Sprintf("txtrace_%x.txt", tx.Hash())) if err1 != nil { @@ -151,29 +165,171 @@ func ExecuteBlockEphemerally( } } + var newBlock *types.Block + if !vmConfig.ReadOnly { + // We're doing this hack for BSC to avoid changing consensus interfaces a lot. BSC modifies txs and receipts by appending + // system transactions, and they increase used gas and write cumulative gas to system receipts, that's why we need + // to deduct system gas before. This line is equal to "blockGas-systemGas", but since we don't know how much gas is + // used by system transactions we just override. Of course, we write used by block gas back. It also always true + // that used gas by block is always equal to original's block header gas, and it's checked by receipts root verification + // otherwise it causes block verification error. + header.GasUsed = *usedGas + syscall := func(contract common.Address, data []byte) ([]byte, error) { + return SysCallContract(contract, data, *chainConfig, ibs, header, engine) + } + outTxs, outReceipts, err := engine.Finalize(chainConfig, header, ibs, block.Transactions(), block.Uncles(), receipts, epochReader, chainReader, syscall) + if err != nil { + return nil, err + } + *usedGas = header.GasUsed + + // We need repack this block because transactions and receipts might be changed by consensus, and + // it won't pass receipts hash or bloom verification + newBlock = types.NewBlock(block.Header(), outTxs, block.Uncles(), outReceipts) + // Update receipts + if !vmConfig.NoReceipts { + receipts = outReceipts + } + } else { + newBlock = block + } + + if chainConfig.IsByzantium(header.Number.Uint64()) && !vmConfig.NoReceipts { + if newBlock.ReceiptHash() != block.ReceiptHash() { + return nil, fmt.Errorf("mismatched receipt headers for block %d (%s != %s)", block.NumberU64(), newBlock.ReceiptHash().Hex(), block.Header().ReceiptHash.Hex()) + } + } + if newBlock.GasUsed() != header.GasUsed { + return nil, fmt.Errorf("gas used by execution: %d, in header: %d", *usedGas, header.GasUsed) + } + if !vmConfig.NoReceipts { + if newBlock.Bloom() != header.Bloom { + return nil, fmt.Errorf("bloom computed by execution: %x, in header: %x", newBlock.Bloom(), header.Bloom) + } + } + + if err := ibs.CommitBlock(chainConfig.Rules(header.Number.Uint64()), stateWriter); err != nil { + return nil, fmt.Errorf("committing block %d failed: %w", header.Number.Uint64(), err) + } else if err := stateWriter.WriteChangeSets(); err != nil { + return nil, fmt.Errorf("writing changesets for block %d failed: %w", header.Number.Uint64(), err) + } + + return receipts, nil +} + +// ExecuteBlockEphemerally runs a block from provided stateReader and +// writes the result to the provided stateWriter +func ExecuteBlockEphemerally( + chainConfig *params.ChainConfig, + vmConfig *vm.Config, + getHeader func(hash common.Hash, number uint64) *types.Header, + engine consensus.Engine, + block *types.Block, + stateReader state.StateReader, + stateWriter state.WriterWithChangeSets, + epochReader consensus.EpochReader, + chainReader consensus.ChainHeaderReader, + contractHasTEVM func(codeHash common.Hash) (bool, error), +) (types.Receipts, *types.ReceiptForStorage, error) { + defer blockExecutionTimer.UpdateDuration(time.Now()) + block.Uncles() + ibs := state.New(stateReader) + header := block.Header() + var receipts types.Receipts + usedGas := new(uint64) + gp := new(GasPool) + gp.AddGas(block.GasLimit()) + + if !vmConfig.ReadOnly { + if err := InitializeBlockExecution(engine, chainReader, epochReader, block.Header(), block.Transactions(), block.Uncles(), chainConfig, ibs); err != nil { + return nil, nil, err + } + } + + if chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 { + misc.ApplyDAOHardFork(ibs) + } + noop := state.NewNoopWriter() + //fmt.Printf("====txs processing start: %d====\n", block.NumberU64()) + for i, tx := range block.Transactions() { + ibs.Prepare(tx.Hash(), block.Hash(), i) + writeTrace := false + if vmConfig.Debug && vmConfig.Tracer == nil { + vmConfig.Tracer = vm.NewStructLogger(&vm.LogConfig{}) + writeTrace = true + } + + receipt, _, err := ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, noop, header, tx, usedGas, *vmConfig, contractHasTEVM) + if writeTrace { + w, err1 := os.Create(fmt.Sprintf("txtrace_%x.txt", tx.Hash())) + if err1 != nil { + panic(err1) + } + encoder := json.NewEncoder(w) + logs := FormatLogs(vmConfig.Tracer.(*vm.StructLogger).StructLogs()) + if err2 := encoder.Encode(logs); err2 != nil { + panic(err2) + } + if err2 := w.Close(); err2 != nil { + panic(err2) + } + vmConfig.Tracer = nil + } + if err != nil { + return nil, nil, fmt.Errorf("could not apply tx %d from block %d [%v]: %w", i, block.NumberU64(), tx.Hash().Hex(), err) + } + if !vmConfig.NoReceipts { + receipts = append(receipts, receipt) + } + } + if chainConfig.IsByzantium(header.Number.Uint64()) && !vmConfig.NoReceipts { receiptSha := types.DeriveSha(receipts) - if receiptSha != block.Header().ReceiptHash { - return nil, fmt.Errorf("mismatched receipt headers for block %d", block.NumberU64()) + if receiptSha != block.ReceiptHash() { + return nil, nil, fmt.Errorf("mismatched receipt headers for block %d", block.NumberU64()) } } if *usedGas != header.GasUsed { - return nil, fmt.Errorf("gas used by execution: %d, in header: %d", *usedGas, header.GasUsed) + return nil, nil, fmt.Errorf("gas used by execution: %d, in header: %d", *usedGas, header.GasUsed) } if !vmConfig.NoReceipts { bloom := types.CreateBloom(receipts) if bloom != header.Bloom { - return nil, fmt.Errorf("bloom computed by execution: %x, in header: %x", bloom, header.Bloom) + return nil, nil, fmt.Errorf("bloom computed by execution: %x, in header: %x", bloom, header.Bloom) } } if !vmConfig.ReadOnly { - if err := FinalizeBlockExecution(engine, stateReader, block.Header(), block.Transactions(), block.Uncles(), stateWriter, chainConfig, ibs, receipts, epochReader, chainReader); err != nil { - return nil, err + txs := block.Transactions() + if _, err := FinalizeBlockExecution(engine, stateReader, block.Header(), txs, block.Uncles(), stateWriter, chainConfig, ibs, receipts, epochReader, chainReader, false); err != nil { + return nil, nil, err } } - return receipts, nil + var logs []*types.Log + for _, receipt := range receipts { + logs = append(logs, receipt.Logs...) + } + + blockLogs := ibs.Logs() + var stateSyncReceipt *types.ReceiptForStorage + if chainConfig.Consensus == params.BorConsensus && len(blockLogs) > 0 { + var stateSyncLogs []*types.Log + slices.SortStableFunc(blockLogs, func(i, j *types.Log) bool { return i.Index < j.Index }) + + if len(blockLogs) > len(logs) { + stateSyncLogs = blockLogs[len(logs):] // get state-sync logs from `state.Logs()` + + types.DeriveFieldsForBorLogs(stateSyncLogs, block.Hash(), block.NumberU64(), uint(len(receipts)), uint(len(logs))) + + stateSyncReceipt = &types.ReceiptForStorage{ + Status: types.ReceiptStatusSuccessful, // make receipt status successful + Logs: stateSyncLogs, + } + } + } + + return receipts, stateSyncReceipt, nil } func SysCallContract(contract common.Address, data []byte, chainConfig params.ChainConfig, ibs *state.IntraBlockState, header *types.Header, engine consensus.Engine) (result []byte, err error) { @@ -193,8 +349,35 @@ func SysCallContract(contract common.Address, data []byte, chainConfig params.Ch ) vmConfig := vm.Config{NoReceipts: true} // Create a new context to be used in the EVM environment - blockContext := NewEVMBlockContext(header, nil, engine, &state.SystemAddress, nil) - evm := vm.NewEVM(blockContext, NewEVMTxContext(msg), ibs, &chainConfig, vmConfig) + isBor := chainConfig.Bor != nil + var author *common.Address + if isBor { + author = &header.Coinbase + } else { + author = &state.SystemAddress + } + blockContext := NewEVMBlockContext(header, nil, engine, author, nil) + var txContext vm.TxContext + if isBor { + txContext = vm.TxContext{} + } else { + txContext = NewEVMTxContext(msg) + } + evm := vm.NewEVM(blockContext, txContext, ibs, &chainConfig, vmConfig) + if isBor { + ret, _, err := evm.Call( + vm.AccountRef(msg.From()), + *msg.To(), + msg.Data(), + msg.Gas(), + msg.Value(), + false, + ) + if err != nil { + return nil, nil + } + return ret, nil + } res, err := ApplyMessage(evm, msg, gp, true /* refunds */, false /* gasBailout */) if err != nil { return nil, err @@ -238,49 +421,50 @@ func CallContractTx(contract common.Address, data []byte, ibs *state.IntraBlockS return tx.FakeSign(from) } -func FinalizeBlockExecution(engine consensus.Engine, stateReader state.StateReader, header *types.Header, txs types.Transactions, uncles []*types.Header, stateWriter state.WriterWithChangeSets, cc *params.ChainConfig, ibs *state.IntraBlockState, receipts types.Receipts, e consensus.EpochReader, headerReader consensus.ChainHeaderReader) error { - //ibs.Print(cc.Rules(header.Number.Uint64())) - //fmt.Printf("====tx processing end====\n") - - if err := engine.Finalize(cc, header, ibs, txs, uncles, receipts, e, headerReader, func(contract common.Address, data []byte) ([]byte, error) { +func FinalizeBlockExecution(engine consensus.Engine, stateReader state.StateReader, header *types.Header, + txs types.Transactions, uncles []*types.Header, stateWriter state.WriterWithChangeSets, cc *params.ChainConfig, ibs *state.IntraBlockState, + receipts types.Receipts, e consensus.EpochReader, headerReader consensus.ChainHeaderReader, isMining bool, +) (newBlock *types.Block, err error) { + syscall := func(contract common.Address, data []byte) ([]byte, error) { return SysCallContract(contract, data, *cc, ibs, header, engine) - }); err != nil { - return err } - - //fmt.Printf("====finalize start %d====\n", header.Number.Uint64()) - //ibs.Print(cc.Rules(header.Number.Uint64())) - //fmt.Printf("====finalize end====\n") + if isMining { + newBlock, _, _, err = engine.FinalizeAndAssemble(cc, header, ibs, txs, uncles, receipts, e, headerReader, syscall, nil) + } else { + _, _, err = engine.Finalize(cc, header, ibs, txs, uncles, receipts, e, headerReader, syscall) + } + if err != nil { + return + } var originalSystemAcc *accounts.Account - if cc.ChainID.Uint64() == 77 { // hack for Sokol - don't understand why eip158 is enabled, but OE still save SystemAddress with nonce=0 n := ibs.GetNonce(state.SystemAddress) //hack - because syscall must use ApplyMessage instead of ApplyTx (and don't create tx at all). But CallContract must create tx. if n > 0 { var err error originalSystemAcc, err = stateReader.ReadAccountData(state.SystemAddress) if err != nil { - return err + return nil, err } } } if err := ibs.CommitBlock(cc.Rules(header.Number.Uint64()), stateWriter); err != nil { - return fmt.Errorf("committing block %d failed: %v", header.Number.Uint64(), err) + return nil, fmt.Errorf("committing block %d failed: %w", header.Number.Uint64(), err) } if originalSystemAcc != nil { // hack for Sokol - don't understand why eip158 is enabled, but OE still save SystemAddress with nonce=0 acc := accounts.NewAccount() acc.Nonce = 0 if err := stateWriter.UpdateAccountData(state.SystemAddress, originalSystemAcc, &acc); err != nil { - return err + return nil, err } } if err := stateWriter.WriteChangeSets(); err != nil { - return fmt.Errorf("writing changesets for block %d failed: %v", header.Number.Uint64(), err) + return nil, fmt.Errorf("writing changesets for block %d failed: %w", header.Number.Uint64(), err) } - return nil + return newBlock, nil } func InitializeBlockExecution(engine consensus.Engine, chain consensus.ChainHeaderReader, epochReader consensus.EpochReader, header *types.Header, txs types.Transactions, uncles []*types.Header, cc *params.ChainConfig, ibs *state.IntraBlockState) error { @@ -288,9 +472,5 @@ func InitializeBlockExecution(engine consensus.Engine, chain consensus.ChainHead engine.Initialize(cc, chain, epochReader, header, txs, uncles, func(contract common.Address, data []byte) ([]byte, error) { return SysCallContract(contract, data, *cc, ibs, header, engine) }) - //fmt.Printf("====InitializeBlockExecution start %d====\n", header.Number.Uint64()) - //ibs.Print(cc.Rules(header.Number.Uint64())) - //fmt.Printf("====InitializeBlockExecution end====\n") - return nil } diff --git a/core/bor_fee_log.go b/core/bor_fee_log.go new file mode 100644 index 00000000000..b2264025f11 --- /dev/null +++ b/core/bor_fee_log.go @@ -0,0 +1,109 @@ +package core + +import ( + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/vm" +) + +var transferLogSig = common.HexToHash("0xe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c4") +var transferFeeLogSig = common.HexToHash("0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63") +var feeAddress = common.HexToAddress("0x0000000000000000000000000000000000001010") +var zero = uint256.NewInt(0) + +// AddTransferLog adds transfer log into state +func AddTransferLog( + state vm.IntraBlockState, + + sender, + recipient common.Address, + + amount, + input1, + input2, + output1, + output2 *uint256.Int, +) { + addTransferLog( + state, + transferLogSig, + + sender, + recipient, + + amount, + input1, + input2, + output1, + output2, + ) +} + +// AddFeeTransferLog adds transfer log into state +// Deprecating transfer log and will be removed in future fork. PLEASE DO NOT USE this transfer log going forward. Parameters won't get updated as expected going forward with EIP1559 +func AddFeeTransferLog( + state vm.IntraBlockState, + + sender, + recipient common.Address, + + amount, + input1, + input2, + output1, + output2 *uint256.Int, +) { + addTransferLog( + state, + transferFeeLogSig, + + sender, + recipient, + + amount, + input1, + input2, + output1, + output2, + ) +} + +// addTransferLog adds transfer log into state +func addTransferLog( + state vm.IntraBlockState, + eventSig common.Hash, + + sender, + recipient common.Address, + + amount, + input1, + input2, + output1, + output2 *uint256.Int, +) { + // ignore if amount is 0 + if amount.Cmp(zero) <= 0 { + return + } + + data := make([]byte, 32*5) + amount.WriteToSlice(data) + input1.WriteToSlice(data[32:]) + input2.WriteToSlice(data[64:]) + output1.WriteToSlice(data[96:]) + output2.WriteToSlice(data[128:]) + + // add transfer log + state.AddLog(&types.Log{ + Address: feeAddress, + Topics: []common.Hash{ + eventSig, + feeAddress.Hash(), + sender.Hash(), + recipient.Hash(), + }, + Data: data, + }) +} diff --git a/core/chain_makers.go b/core/chain_makers.go index 9cfac15cfd3..24a8e4266df 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -21,6 +21,8 @@ import ( "fmt" "math/big" + "github.com/ledgerwatch/erigon/core/systemcontracts" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus" @@ -109,8 +111,8 @@ func (b *BlockGen) AddTxWithChain(getHeader func(hash common.Hash, number uint64 b.SetCoinbase(common.Address{}) } b.ibs.Prepare(tx.Hash(), common.Hash{}, len(b.txs)) - checkTEVM := func(_ common.Hash) (bool, error) { return false, nil } - receipt, _, err := ApplyTransaction(b.config, getHeader, engine, &b.header.Coinbase, b.gasPool, b.ibs, state.NewNoopWriter(), b.header, tx, &b.header.GasUsed, vm.Config{}, checkTEVM) + contractHasTEVM := func(_ common.Hash) (bool, error) { return false, nil } + receipt, _, err := ApplyTransaction(b.config, getHeader, engine, &b.header.Coinbase, b.gasPool, b.ibs, state.NewNoopWriter(), b.header, tx, &b.header.GasUsed, vm.Config{}, contractHasTEVM) if err != nil { panic(err) } @@ -123,8 +125,8 @@ func (b *BlockGen) AddFailedTxWithChain(getHeader func(hash common.Hash, number b.SetCoinbase(common.Address{}) } b.ibs.Prepare(tx.Hash(), common.Hash{}, len(b.txs)) - checkTEVM := func(common.Hash) (bool, error) { return false, nil } - receipt, _, err := ApplyTransaction(b.config, getHeader, engine, &b.header.Coinbase, b.gasPool, b.ibs, state.NewNoopWriter(), b.header, tx, &b.header.GasUsed, vm.Config{}, checkTEVM) + contractHasTEVM := func(common.Hash) (bool, error) { return false, nil } + receipt, _, err := ApplyTransaction(b.config, getHeader, engine, &b.header.Coinbase, b.gasPool, b.ibs, state.NewNoopWriter(), b.header, tx, &b.header.GasUsed, vm.Config{}, contractHasTEVM) _ = err // accept failed transactions b.txs = append(b.txs, tx) b.receipts = append(b.receipts, receipt) @@ -185,12 +187,21 @@ func (b *BlockGen) PrevBlock(index int) *types.Block { // tied to chain length directly. func (b *BlockGen) OffsetTime(seconds int64) { b.header.Time += uint64(seconds) - if b.header.Time <= b.parent.Header().Time { + parent := b.parent + if b.header.Time <= parent.Time() { panic("block time out of range") } chainreader := &FakeChainReader{Cfg: b.config} - parent := b.parent.Header() - b.header.Difficulty = b.engine.CalcDifficulty(chainreader, b.header.Time, parent.Time, parent.Difficulty, parent.Number.Uint64(), parent.Hash(), parent.UncleHash, parent.Seal) + b.header.Difficulty = b.engine.CalcDifficulty( + chainreader, + b.header.Time, + parent.Time(), + parent.Difficulty(), + parent.NumberU64(), + parent.Hash(), + parent.UncleHash(), + parent.Seal(), + ) } func (b *BlockGen) GetHeader() *types.Header { @@ -212,7 +223,7 @@ type ChainPack struct { Headers []*types.Header Blocks []*types.Block Receipts []types.Receipts - TopBlock *types.Block // Convinience field to access the last block + TopBlock *types.Block // Convenience field to access the last block } // OneBlock returns a ChainPack which contains just one @@ -227,6 +238,38 @@ func (cp ChainPack) Slice(i, j int) *ChainPack { } } +// Copy creates a deep copy of the ChainPack. +func (cp *ChainPack) Copy() *ChainPack { + headers := make([]*types.Header, 0, len(cp.Headers)) + for _, header := range cp.Headers { + headers = append(headers, types.CopyHeader(header)) + } + + blocks := make([]*types.Block, 0, len(cp.Blocks)) + for _, block := range cp.Blocks { + blocks = append(blocks, block.Copy()) + } + + receipts := make([]types.Receipts, 0, len(cp.Receipts)) + for _, receiptList := range cp.Receipts { + receiptListCopy := make(types.Receipts, 0, len(receiptList)) + for _, receipt := range receiptList { + receiptListCopy = append(receiptListCopy, receipt.Copy()) + } + receipts = append(receipts, receiptListCopy) + } + + topBlock := cp.TopBlock.Copy() + + return &ChainPack{ + Length: cp.Length, + Headers: headers, + Blocks: blocks, + Receipts: receipts, + TopBlock: topBlock, + } +} + // GenerateChain creates a chain of n blocks. The first block's // parent will be the provided parent. db is used to store // intermediate states and should contain the parent's state trie. @@ -246,6 +289,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse config = params.TestChainConfig } headers, blocks, receipts := make([]*types.Header, n), make(types.Blocks, n), make([]types.Receipts, n) + types.SetHeaderSealFlag(config.IsHeaderWithSeal()) chainreader := &FakeChainReader{Cfg: config, current: parent} tx, errBegin := db.BeginRw(context.Background()) if errBegin != nil { @@ -269,13 +313,14 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse if config.DAOForkSupport && config.DAOForkBlock != nil && config.DAOForkBlock.Cmp(b.header.Number) == 0 { misc.ApplyDAOHardFork(ibs) } + systemcontracts.UpgradeBuildInSystemContract(config, b.header.Number, ibs) // Execute any user modifications to the block if gen != nil { gen(i, b) } if b.engine != nil { // Finalize and seal the block - if _, err := b.engine.FinalizeAndAssemble(config, b.header, ibs, b.txs, b.uncles, b.receipts, nil, nil, nil, nil); err != nil { + if _, _, _, err := b.engine.FinalizeAndAssemble(config, b.header, ibs, b.txs, b.uncles, b.receipts, nil, nil, nil, nil); err != nil { return nil, nil, fmt.Errorf("call to FinaliseAndAssemble: %w", err) } // Write state changes to db @@ -366,7 +411,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse for i := 0; i < n; i++ { stateReader := state.NewPlainStateReader(tx) - plainStateWriter := state.NewPlainStateWriter(tx, nil, parent.Number().Uint64()+uint64(i)+1) + plainStateWriter := state.NewPlainStateWriter(tx, nil, parent.NumberU64()+uint64(i)+1) ibs := state.New(stateReader) block, receipt, err := genblock(i, parent, ibs, stateReader, plainStateWriter) if err != nil { @@ -383,6 +428,33 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse return &ChainPack{Length: n, Headers: headers, Blocks: blocks, Receipts: receipts, TopBlock: blocks[n-1]}, nil } +func MakeEmptyHeader(parent *types.Header, chainConfig *params.ChainConfig, timestamp uint64, targetGasLimit *uint64) *types.Header { + header := &types.Header{ + Root: parent.Root, + ParentHash: parent.Hash(), + Number: new(big.Int).Add(parent.Number, common.Big1), + Difficulty: common.Big0, + Time: timestamp, + } + + parentGasLimit := parent.GasLimit + // Set baseFee and GasLimit if we are on an EIP-1559 chain + if chainConfig.IsLondon(header.Number.Uint64()) { + header.Eip1559 = true + header.BaseFee = misc.CalcBaseFee(chainConfig, parent) + if !chainConfig.IsLondon(parent.Number.Uint64()) { + parentGasLimit = parent.GasLimit * params.ElasticityMultiplier + } + } + if targetGasLimit != nil { + header.GasLimit = CalcGasLimit(parentGasLimit, *targetGasLimit) + } else { + header.GasLimit = parentGasLimit + } + + return header +} + func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.IntraBlockState, engine consensus.Engine) *types.Header { var time uint64 if parent.Time() == 0 { @@ -391,29 +463,18 @@ func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.I time = parent.Time() + 10 // block time is fixed at 10 seconds } - header := &types.Header{ - Root: common.Hash{}, - ParentHash: parent.Hash(), - Coinbase: parent.Coinbase(), - Difficulty: engine.CalcDifficulty(chain, time, - time-10, - parent.Difficulty(), - parent.Number().Uint64(), - parent.Hash(), - parent.UncleHash(), - parent.Header().Seal, - ), - GasLimit: CalcGasLimit(parent.GasUsed(), parent.GasLimit(), parent.GasLimit(), parent.GasLimit()), - Number: new(big.Int).Add(parent.Number(), common.Big1), - Time: time, - } + header := MakeEmptyHeader(parent.Header(), chain.Config(), time, nil) + header.Coinbase = parent.Coinbase() + header.Difficulty = engine.CalcDifficulty(chain, time, + time-10, + parent.Difficulty(), + parent.NumberU64(), + parent.Hash(), + parent.UncleHash(), + parent.Seal(), + ) header.Seal = engine.GenerateSeal(chain, header, parent.Header(), nil) - - if chain.Config().IsLondon(header.Number.Uint64()) { - header.BaseFee = misc.CalcBaseFee(chain.Config(), parent.Header()) - header.Eip1559 = true - } - //header.WithSeal = debug.HeadersSeal() + header.WithSeal = chain.Config().IsHeaderWithSeal() return header } @@ -434,3 +495,4 @@ func (cr *FakeChainReader) GetHeaderByHash(hash common.Hash) *types.Header func (cr *FakeChainReader) GetHeader(hash common.Hash, number uint64) *types.Header { return nil } func (cr *FakeChainReader) GetBlock(hash common.Hash, number uint64) *types.Block { return nil } func (cr *FakeChainReader) HasBlock(hash common.Hash, number uint64) bool { return false } +func (cr *FakeChainReader) GetTd(hash common.Hash, number uint64) *big.Int { return nil } diff --git a/core/error.go b/core/error.go index 753f200158d..9104c11d668 100644 --- a/core/error.go +++ b/core/error.go @@ -61,6 +61,10 @@ var ( // next one expected based on the local chain. ErrNonceTooHigh = errors.New("nonce too high") + // ErrNonceMax is returned if the nonce of a transaction sender account has + // maximum allowed value and would become invalid if incremented. + ErrNonceMax = errors.New("nonce has max value") + // ErrGasLimitReached is returned by the gas pool if the amount of gas required // by a transaction is higher than what's left in the block. ErrGasLimitReached = errors.New("gas limit reached") @@ -83,4 +87,8 @@ var ( // ErrFeeCapTooLow is returned if the transaction fee cap is less than the // the base fee of the block. ErrFeeCapTooLow = errors.New("fee cap less than block base fee") + + // ErrSenderNoEOA is returned if the sender of a transaction is a contract. + // See EIP-3607: Reject transactions from senders with deployed code. + ErrSenderNoEOA = errors.New("sender not an eoa") ) diff --git a/core/evm.go b/core/evm.go index 6418dec206f..c2fa1471cd5 100644 --- a/core/evm.go +++ b/core/evm.go @@ -23,12 +23,14 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/serenity" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/params" ) // NewEVMBlockContext creates a new context for use in the EVM. -func NewEVMBlockContext(header *types.Header, getHeader func(hash common.Hash, number uint64) *types.Header, engine consensus.Engine, author *common.Address, checkTEVM func(contractHash common.Hash) (bool, error)) vm.BlockContext { +func NewEVMBlockContext(header *types.Header, getHeader func(hash common.Hash, number uint64) *types.Header, engine consensus.Engine, author *common.Address, contractHasTEVM func(contractHash common.Hash) (bool, error)) vm.BlockContext { // If we don't have an explicit author (i.e. not mining), extract from the header var beneficiary common.Address if author == nil { @@ -43,22 +45,40 @@ func NewEVMBlockContext(header *types.Header, getHeader func(hash common.Hash, n panic(fmt.Errorf("header.BaseFee higher than 2^256-1")) } } - if checkTEVM == nil { - checkTEVM = func(_ common.Hash) (bool, error) { + + difficulty := new(big.Int) + + if header.Difficulty.Cmp(serenity.SerenityDifficulty) == 0 { + // EIP-4399. We use SerenityDifficulty (i.e. 0) as a telltale of Proof-of-Stake blocks. + // TODO: Turn DIFFICULTY into RANDOM when the Merge is done. + difficulty.SetBytes(header.MixDigest[:]) + } else { + difficulty.Set(header.Difficulty) + } + if contractHasTEVM == nil { + contractHasTEVM = func(_ common.Hash) (bool, error) { return false, nil } } + + var transferFunc vm.TransferFunc + if engine != nil && engine.Type() == params.BorConsensus { + transferFunc = BorTransfer + } else { + transferFunc = Transfer + } + return vm.BlockContext{ - CanTransfer: CanTransfer, - Transfer: Transfer, - GetHash: GetHashFn(header, getHeader), - Coinbase: beneficiary, - BlockNumber: header.Number.Uint64(), - Time: header.Time, - Difficulty: new(big.Int).Set(header.Difficulty), - BaseFee: &baseFee, - GasLimit: header.GasLimit, - CheckTEVM: checkTEVM, + CanTransfer: CanTransfer, + Transfer: transferFunc, + GetHash: GetHashFn(header, getHeader), + Coinbase: beneficiary, + BlockNumber: header.Number.Uint64(), + Time: header.Time, + Difficulty: difficulty, + BaseFee: &baseFee, + GasLimit: header.GasLimit, + ContractHasTEVM: contractHasTEVM, } } @@ -117,3 +137,22 @@ func Transfer(db vm.IntraBlockState, sender, recipient common.Address, amount *u } db.AddBalance(recipient, amount) } + +// BorTransfer transfer in Bor +func BorTransfer(db vm.IntraBlockState, sender, recipient common.Address, amount *uint256.Int, bailout bool) { + // get inputs before + input1 := db.GetBalance(sender).Clone() + input2 := db.GetBalance(recipient).Clone() + + if !bailout { + db.SubBalance(sender, amount) + } + db.AddBalance(recipient, amount) + + // get outputs after + output1 := db.GetBalance(sender).Clone() + output2 := db.GetBalance(recipient).Clone() + + // add transfer log + AddTransferLog(db, sender, recipient, amount, input1, input2, output1, output2) +} diff --git a/core/forkid/forkid.go b/core/forkid/forkid.go index 73f26f408c5..4bcf477b1c0 100644 --- a/core/forkid/forkid.go +++ b/core/forkid/forkid.go @@ -24,12 +24,12 @@ import ( "math" "math/big" "reflect" - "sort" "strings" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/log/v3" + "golang.org/x/exp/slices" ) var ( @@ -76,6 +76,32 @@ func NewIDFromForks(forks []uint64, genesis common.Hash, head uint64) ID { return ID{Hash: checksumToBytes(hash), Next: next} } +func NextForkHash(config *params.ChainConfig, genesis common.Hash, head uint64) [4]byte { + return NextForkHashFromForks(GatherForks(config), genesis, head) +} + +func NextForkHashFromForks(forks []uint64, genesis common.Hash, head uint64) [4]byte { + // Calculate the starting checksum from the genesis hash + hash := crc32.ChecksumIEEE(genesis[:]) + + // Calculate the current fork checksum and the next fork block + var next uint64 + for _, fork := range forks { + if fork <= head { + // Fork already passed, checksum the previous hash and the fork number + hash = checksumUpdate(hash, fork) + continue + } + next = fork + break + } + if next == 0 { + return checksumToBytes(hash) + } else { + return checksumToBytes(checksumUpdate(hash, next)) + } +} + // NewFilter creates a filter that returns if a fork ID should be rejected or notI // based on the local chain's status. func NewFilter(config *params.ChainConfig, genesis common.Hash, head func() uint64) Filter { @@ -203,15 +229,11 @@ func checksumToBytes(hash uint32) [4]byte { // GatherForks gathers all the known forks and creates a sorted list out of them. func GatherForks(config *params.ChainConfig) []uint64 { - if config.ChainID.Uint64() == 77 { - return []uint64{6464300, 7026400, 12095200, 21050600} - } - // Gather all the fork block numbers via reflection kind := reflect.TypeOf(params.ChainConfig{}) conf := reflect.ValueOf(config).Elem() - forks := make(map[uint64]struct{}) + var forks []uint64 for i := 0; i < kind.NumField(); i++ { // Fetch the next field and skip non-fork rules field := kind.Field(i) @@ -224,21 +246,21 @@ func GatherForks(config *params.ChainConfig) []uint64 { // Extract the fork rule block number and aggregate it rule := conf.Field(i).Interface().(*big.Int) if rule != nil { - forks[rule.Uint64()] = struct{}{} + forks = append(forks, rule.Uint64()) } } - // Sort the fork block numbers to permit chronological XOR - forkBlocks := make([]uint64, 0, len(forks)) - for num := range forks { - forkBlocks = append(forkBlocks, num) + slices.Sort(forks) + // Deduplicate block numbers applying multiple forks + for i := 1; i < len(forks); i++ { + if forks[i] == forks[i-1] { + forks = append(forks[:i], forks[i+1:]...) + i-- + } } - sort.SliceStable(forkBlocks, func(i, j int) bool { - return forkBlocks[i] < forkBlocks[j] - }) // Skip any forks in block 0, that's the genesis ruleset - if len(forkBlocks) > 0 && forkBlocks[0] == 0 { - forkBlocks = forkBlocks[1:] + if len(forks) > 0 && forks[0] == 0 { + forks = forks[1:] } - return forkBlocks + return forks } diff --git a/core/forkid/forkid_test.go b/core/forkid/forkid_test.go index cc22b6313ca..21f6f84f1bd 100644 --- a/core/forkid/forkid_test.go +++ b/core/forkid/forkid_test.go @@ -63,8 +63,10 @@ func TestCreation(t *testing.T) { {12243999, ID{Hash: checksumToBytes(0xe029e991), Next: 12244000}}, // Last Muir Glacier block {12244000, ID{Hash: checksumToBytes(0x0eb440f6), Next: 12965000}}, // First Berlin block {12964999, ID{Hash: checksumToBytes(0x0eb440f6), Next: 12965000}}, // Last Berlin block - {12965000, ID{Hash: checksumToBytes(0xb715077d), Next: 0}}, // First London block - {20000000, ID{Hash: checksumToBytes(0xb715077d), Next: 0}}, // Future London block + {12965000, ID{Hash: checksumToBytes(0xb715077d), Next: 13773000}}, // First London block + {13772999, ID{Hash: checksumToBytes(0xb715077d), Next: 13773000}}, // Last London block + {13773000, ID{Hash: checksumToBytes(0x20c327fc), Next: 0}}, // First Arrow Glacier block + {20000000, ID{Hash: checksumToBytes(0x20c327fc), Next: 0}}, // Future Arrow Glacier block }, }, // Ropsten test cases @@ -201,11 +203,11 @@ func TestValidation(t *testing.T) { // Local is mainnet Petersburg, remote is Rinkeby Petersburg. {7987396, ID{Hash: checksumToBytes(0xafec6b27), Next: 0}, ErrLocalIncompatibleOrStale}, - // Local is mainnet London, far in the future. Remote announces Gopherium (non existing fork) + // Local is mainnet Arrow Glacier, far in the future. Remote announces Gopherium (non existing fork) // at some future block 88888888, for itself, but past block for local. Local is incompatible. // // This case detects non-upgraded nodes with majority hash power (typical Ropsten mess). - {88888888, ID{Hash: checksumToBytes(0xb715077d), Next: 88888888}, ErrLocalIncompatibleOrStale}, + {88888888, ID{Hash: checksumToBytes(0x20c327fc), Next: 88888888}, ErrLocalIncompatibleOrStale}, // Local is mainnet Byzantium. Remote is also in Byzantium, but announces Gopherium (non existing // fork) at block 7279999, before Petersburg. Local is incompatible. diff --git a/core/gen_genesis.go b/core/gen_genesis.go index baba318db12..3002d826b11 100644 --- a/core/gen_genesis.go +++ b/core/gen_genesis.go @@ -30,7 +30,7 @@ func (g Genesis) MarshalJSON() ([]byte, error) { Number math.HexOrDecimal64 `json:"number"` GasUsed math.HexOrDecimal64 `json:"gasUsed"` ParentHash common.Hash `json:"parentHash"` - BaseFee *math.HexOrDecimal256 `json:"baseFee"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` } var enc Genesis enc.Config = g.Config @@ -69,7 +69,7 @@ func (g *Genesis) UnmarshalJSON(input []byte) error { Number *math.HexOrDecimal64 `json:"number"` GasUsed *math.HexOrDecimal64 `json:"gasUsed"` ParentHash *common.Hash `json:"parentHash"` - BaseFee *math.HexOrDecimal256 `json:"baseFee"` + BaseFee *math.HexOrDecimal256 `json:"baseFeePerGas"` } var dec Genesis if err := json.Unmarshal(input, &dec); err != nil { diff --git a/core/genesis.go b/core/genesis.go index e7de75ced1f..e63dda658e4 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -34,11 +34,14 @@ import ( "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/common/math" + "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/consensus/serenity" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/params/networkname" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/trie" "github.com/ledgerwatch/log/v3" @@ -71,7 +74,7 @@ type Genesis struct { Number uint64 `json:"number"` GasUsed uint64 `json:"gasUsed"` ParentHash common.Hash `json:"parentHash"` - BaseFee *big.Int `json:"baseFee"` + BaseFee *big.Int `json:"baseFeePerGas"` } // GenesisAlloc specifies the initial state that is part of the genesis block. @@ -170,12 +173,16 @@ func (e *GenesisMismatchError) Error() string { // // The returned chain configuration is never nil. func CommitGenesisBlock(db kv.RwDB, genesis *Genesis) (*params.ChainConfig, *types.Block, error) { + return CommitGenesisBlockWithOverride(db, genesis, nil, nil) +} + +func CommitGenesisBlockWithOverride(db kv.RwDB, genesis *Genesis, overrideMergeForkBlock, overrideTerminalTotalDifficulty *big.Int) (*params.ChainConfig, *types.Block, error) { tx, err := db.BeginRw(context.Background()) if err != nil { return nil, nil, err } defer tx.Rollback() - c, b, err := WriteGenesisBlock(tx, genesis) + c, b, err := WriteGenesisBlock(tx, genesis, overrideMergeForkBlock, overrideTerminalTotalDifficulty) if err != nil { return c, b, err } @@ -194,38 +201,28 @@ func MustCommitGenesisBlock(db kv.RwDB, genesis *Genesis) (*params.ChainConfig, return c, b } -func OverrideGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *types.Block, error) { - stored, err := rawdb.ReadCanonicalHash(db, 0) - if err != nil { - return nil, nil, err - } - err = rawdb.DeleteCanonicalHash(db, 0) - if err != nil { - return nil, nil, err - } - err = rawdb.DeleteChainConfig(db, stored) - if err != nil { - return nil, nil, err - } - return WriteGenesisBlock(db, genesis) -} - -func WriteGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *types.Block, error) { +func WriteGenesisBlock(db kv.RwTx, genesis *Genesis, overrideMergeForkBlock, overrideTerminalTotalDifficulty *big.Int) (*params.ChainConfig, *types.Block, error) { if genesis != nil && genesis.Config == nil { return params.AllEthashProtocolChanges, nil, ErrGenesisNoConfig } // Just commit the new block if there is no stored genesis block. - stored, storedErr := rawdb.ReadCanonicalHash(db, 0) + storedHash, storedErr := rawdb.ReadCanonicalHash(db, 0) if storedErr != nil { return nil, nil, storedErr } - if (stored == common.Hash{}) { + if (storedHash == common.Hash{}) { custom := true if genesis == nil { log.Info("Writing default main-net genesis block") genesis = DefaultGenesisBlock() custom = false } + if overrideMergeForkBlock != nil { + genesis.Config.MergeForkBlock = overrideMergeForkBlock + } + if overrideTerminalTotalDifficulty != nil { + genesis.Config.TerminalTotalDifficulty = overrideTerminalTotalDifficulty + } block, _, err1 := genesis.Write(db) if err1 != nil { return genesis.Config, nil, err1 @@ -243,73 +240,67 @@ func WriteGenesisBlock(db kv.RwTx, genesis *Genesis) (*params.ChainConfig, *type return genesis.Config, nil, err1 } hash := block.Hash() - if hash != stored { - return genesis.Config, block, &GenesisMismatchError{stored, hash} + if hash != storedHash { + return genesis.Config, block, &GenesisMismatchError{storedHash, hash} } } - storedBlock, err := rawdb.ReadBlockByHash(db, stored) + storedBlock, err := rawdb.ReadBlockByHash(db, storedHash) if err != nil { return genesis.Config, nil, err } // Get the existing chain configuration. - newcfg := genesis.configOrDefault(stored) - if err := newcfg.CheckConfigForkOrder(); err != nil { - return newcfg, nil, err + newCfg := genesis.configOrDefault(storedHash) + if overrideMergeForkBlock != nil { + newCfg.MergeForkBlock = overrideMergeForkBlock + } + if overrideTerminalTotalDifficulty != nil { + newCfg.TerminalTotalDifficulty = overrideTerminalTotalDifficulty } - storedcfg, storedErr := rawdb.ReadChainConfig(db, stored) + if err := newCfg.CheckConfigForkOrder(); err != nil { + return newCfg, nil, err + } + storedCfg, storedErr := rawdb.ReadChainConfig(db, storedHash) if storedErr != nil { - return newcfg, nil, storedErr + return newCfg, nil, storedErr } - if storedcfg == nil { + if storedCfg == nil { log.Warn("Found genesis block without chain config") - err1 := rawdb.WriteChainConfig(db, stored, newcfg) + err1 := rawdb.WriteChainConfig(db, storedHash, newCfg) if err1 != nil { - return newcfg, nil, err1 + return newCfg, nil, err1 } - return newcfg, storedBlock, nil + return newCfg, storedBlock, nil } // Special case: don't change the existing config of a non-mainnet chain if no new - // config is supplied. These chains would get AllProtocolChanges (and a compat error) + // config is supplied. These chains would get AllProtocolChanges (and a compatibility error) // if we just continued here. - if genesis == nil && stored != params.MainnetGenesisHash { - return storedcfg, storedBlock, nil + if genesis == nil && storedHash != params.MainnetGenesisHash && overrideMergeForkBlock == nil && overrideTerminalTotalDifficulty == nil { + return storedCfg, storedBlock, nil } // Check config compatibility and write the config. Compatibility errors // are returned to the caller unless we're already at block zero. height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db)) - if height == nil { - //return newcfg, stored, stateDB, fmt.Errorf("missing block number for head header hash") - } else { - compatErr := storedcfg.CheckCompatible(newcfg, *height) - if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 { - return newcfg, storedBlock, compatErr + if height != nil { + compatibilityErr := storedCfg.CheckCompatible(newCfg, *height) + if compatibilityErr != nil && *height != 0 && compatibilityErr.RewindTo != 0 { + return newCfg, storedBlock, compatibilityErr } } - if err := rawdb.WriteChainConfig(db, stored, newcfg); err != nil { - return newcfg, nil, err + if err := rawdb.WriteChainConfig(db, storedHash, newCfg); err != nil { + return newCfg, nil, err } - return newcfg, storedBlock, nil + return newCfg, storedBlock, nil } -func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { - switch { - case g != nil: +func (g *Genesis) configOrDefault(genesisHash common.Hash) *params.ChainConfig { + if g != nil { return g.Config - case ghash == params.MainnetGenesisHash: - return params.MainnetChainConfig - case ghash == params.RopstenGenesisHash: - return params.RopstenChainConfig - case ghash == params.RinkebyGenesisHash: - return params.RinkebyChainConfig - case ghash == params.GoerliGenesisHash: - return params.GoerliChainConfig - case ghash == params.ErigonGenesisHash: - return params.ErigonChainConfig - case ghash == params.CalaverasGenesisHash: - return params.CalaverasChainConfig - case ghash == params.SokolGenesisHash: - return params.SokolChainConfig - default: + } + + config := params.ChainConfigByGenesisHash(genesisHash) + if config != nil { + return config + } else { return params.AllEthashProtocolChanges } } @@ -350,7 +341,7 @@ func (g *Genesis) ToBlock() (*types.Block, *state.IntraBlockState, error) { statedb.SetIncarnation(addr, 1) } } - if err := statedb.FinalizeTx(params.Rules{}, w); err != nil { + if err := statedb.FinalizeTx(¶ms.Rules{}, w); err != nil { panic(err) } root, err = trie.CalcRoot("genesis", tx) @@ -426,14 +417,14 @@ func (g *Genesis) WriteGenesisState(tx kv.RwTx) (*types.Block, *state.IntraBlock blockWriter := state.NewPlainStateWriter(tx, tx, 0) - if err := statedb.CommitBlock(params.Rules{}, blockWriter); err != nil { - return nil, statedb, fmt.Errorf("cannot write state: %v", err) + if err := statedb.CommitBlock(¶ms.Rules{}, blockWriter); err != nil { + return nil, statedb, fmt.Errorf("cannot write state: %w", err) } if err := blockWriter.WriteChangeSets(); err != nil { - return nil, statedb, fmt.Errorf("cannot write change sets: %v", err) + return nil, statedb, fmt.Errorf("cannot write change sets: %w", err) } if err := blockWriter.WriteHistory(); err != nil { - return nil, statedb, fmt.Errorf("cannot write history: %v", err) + return nil, statedb, fmt.Errorf("cannot write history: %w", err) } return block, statedb, nil } @@ -481,7 +472,29 @@ func (g *Genesis) Write(tx kv.RwTx) (*types.Block, *state.IntraBlockState, error if err := rawdb.WriteChainConfig(tx, block.Hash(), config); err != nil { return nil, nil, err } - return block, statedb, nil + // We support ethash/serenity for issuance (for now) + if g.Config.Consensus != params.EtHashConsensus { + return block, statedb, nil + } + // Issuance is the sum of allocs + genesisIssuance := big.NewInt(0) + for _, account := range g.Alloc { + genesisIssuance.Add(genesisIssuance, account.Balance) + } + + // BlockReward can be present at genesis + if block.Header().Difficulty.Cmp(serenity.SerenityDifficulty) == 0 { + // Proof-of-stake is 0.3 ether per block (TODO: revisit) + genesisIssuance.Add(genesisIssuance, serenity.RewardSerenity) + } else { + blockReward, _ := ethash.AccumulateRewards(g.Config, block.Header(), nil) + // Set BlockReward + genesisIssuance.Add(genesisIssuance, blockReward.ToBig()) + } + if err := rawdb.WriteTotalIssued(tx, 0, genesisIssuance); err != nil { + return nil, nil, err + } + return block, statedb, rawdb.WriteTotalBurnt(tx, 0, common.Big0) } // MustCommit writes the genesis block and state to db, panicking on error. @@ -535,6 +548,19 @@ func DefaultGenesisBlock() *Genesis { } } +// DefaultSepoliaGenesisBlock returns the Sepolia network genesis block. +func DefaultSepoliaGenesisBlock() *Genesis { + return &Genesis{ + Config: params.SepoliaChainConfig, + Nonce: 0, + ExtraData: []byte("Sepolia, Athens, Attica, Greece!"), + GasLimit: 30000000, + Difficulty: big.NewInt(131072), + Timestamp: 1633267481, + Alloc: readPrealloc("allocs/sepolia.json"), + } +} + // DefaultRopstenGenesisBlock returns the Ropsten network genesis block. func DefaultRopstenGenesisBlock() *Genesis { return &Genesis{ @@ -571,29 +597,6 @@ func DefaultGoerliGenesisBlock() *Genesis { } } -func DefaultErigonGenesisBlock() *Genesis { - return &Genesis{ - Config: params.ErigonChainConfig, - Nonce: 66, - ExtraData: hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"), - GasLimit: 1000000000, - Difficulty: big.NewInt(1048576), - Alloc: readPrealloc("allocs/erigonmine.json"), - } -} - -func DefaultCalaverasGenesisBlock() *Genesis { - // Full genesis: https://github.com/ethereum/eth1.0-specs/blob/master/network-upgrades/client-integration-testnets/aleut.md - return &Genesis{ - Config: params.CalaverasChainConfig, - Timestamp: 0x60b3877f, - ExtraData: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000005211cea3870c7ba7c6c44b185e62eecdb864cd8c560228ce57d31efbf64c200b2c200aacec78cf17a7148e784fe95a7a750335f8b9572ee28d72e7650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), - GasLimit: 0x47b760, - Difficulty: big.NewInt(1), - Alloc: readPrealloc("allocs/calaveras.json"), - } -} - func DefaultSokolGenesisBlock() *Genesis { /* header rlp: f9020da00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0fad4af258fd11939fae0c6c6eec9d340b1caac0b0196fd9a1bc3f489c5bf00b3a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830200008083663be080808080b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 @@ -615,6 +618,98 @@ func DefaultSokolGenesisBlock() *Genesis { } } +func DefaultBSCGenesisBlock() *Genesis { + return &Genesis{ + Config: params.BSCChainConfig, + Nonce: 0x00, + Timestamp: 0x5e9da7ce, + ExtraData: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000002a7cdd959bfe8d9487b2a43b33565295a698f7e26488aa4d1955ee33403f8ccb1d4de5fb97c7ade29ef9f4360c606c7ab4db26b016007d3ad0ab86a0ee01c3b1283aa067c58eab4709f85e99d46de5fe685b1ded8013785d6623cc18d214320b6bb6475978f3adfc719c99674c072166708589033e2d9afec2be4ec20253b8642161bc3f444f53679c1f3d472f7be8361c80a4c1e7e9aaf001d0877f1cfde218ce2fd7544e0b2cc94692d4a704debef7bcb61328b8f7166496996a7da21cf1f1b04d9b3e26a3d0772d4c407bbe49438ed859fe965b140dcf1aab71a96bbad7cf34b5fa511d8e963dbba288b1960e75d64430b3230294d12c6ab2aac5c2cd68e80b16b581ea0a6e3c511bbd10f4519ece37dc24887e11b55d7ae2f5b9e386cd1b50a4550696d957cb4900f03a82012708dafc9e1b880fd083b32182b869be8e0922b81f8e175ffde54d797fe11eb03f9e3bf75f1d68bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d8c4d90829ce8f72d0163c1d5cf348a862d55063035e7a025f4da968de7e4d7e4004197917f4070f1d6caa02bbebaebb5d7e581e4b66559e635f805ff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + GasLimit: 0x2625a00, + Difficulty: big.NewInt(0x1), + Mixhash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + Coinbase: common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE"), + Alloc: readPrealloc("allocs/bsc.json"), + Number: 0x00, + GasUsed: 0x00, + } +} + +func DefaultChapelGenesisBlock() *Genesis { + return &Genesis{ + Config: params.ChapelChainConfig, + Nonce: 0x00, + Timestamp: 0x5e9da7ce, + ExtraData: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000001284214b9b9c85549ab3d2b972df0deef66ac2c9b71b214cb885500844365e95cd9942c7276e7fd8a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0980a75ecd1309ea12fa2ed87a8744fbfc9b863d535552c16704d214347f29fa77f77da6d75d7c752f474cf03cceff28abc65c9cbae594f725c80e12d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + GasLimit: 0x2625a00, + Difficulty: big.NewInt(0x1), + Mixhash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + Coinbase: common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE"), + Alloc: readPrealloc("allocs/chapel.json"), + Number: 0x00, + GasUsed: 0x00, + } +} + +func DefaultRialtoGenesisBlock() *Genesis { + return &Genesis{ + Config: params.RialtoChainConfig, + Nonce: 0x00, + Timestamp: 0x5e9da7ce, + ExtraData: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000001284214b9b9c85549ab3d2b972df0deef66ac2c9b71b214cb885500844365e95cd9942c7276e7fd8a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0980a75ecd1309ea12fa2ed87a8744fbfc9b863d535552c16704d214347f29fa77f77da6d75d7c752f474cf03cceff28abc65c9cbae594f725c80e12d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + GasLimit: 0x2625a00, + Difficulty: big.NewInt(0x1), + Mixhash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + Coinbase: common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE"), + Alloc: readPrealloc("allocs/bsc.json"), + Number: 0x00, + GasUsed: 0x00, + } +} + +func DefaultFermionGenesisBlock() *Genesis { + return &Genesis{ + Config: params.FermionChainConfig, + Timestamp: 0x0, + ExtraData: hexutil.MustDecode("0x00000000000000000000000000000000000000000000000000000000000000003a03f6d88437328ce8623ef5e80c67383704ebc13ec60da1858ec7fa8edd0dc736611dba9ab4399942d5d120ad9c1692c5fa72dca20657254bbaa08d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + GasLimit: 0x5B8D80, + Difficulty: big.NewInt(0x20000), + Alloc: readPrealloc("allocs/fermion.json"), + } +} + +func DefaultMumbaiGenesisBlock() *Genesis { + return &Genesis{ + Config: params.MumbaiChainConfig, + Nonce: 0, + Timestamp: 1558348305, + GasLimit: 10000000, + Difficulty: big.NewInt(1), + Mixhash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + Coinbase: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Alloc: readPrealloc("allocs/mumbai.json"), + } +} + +//DefaultBorMainnet returns the Bor Mainnet network gensis block. +func DefaultBorMainnetGenesisBlock() *Genesis { + return &Genesis{ + Config: params.BorMainnetChainConfig, + Nonce: 0, + Timestamp: 1590824836, + GasLimit: 10000000, + Difficulty: big.NewInt(1), + Mixhash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + Coinbase: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Alloc: readPrealloc("allocs/bor_mainnet.json"), + } +} + +// Pre-calculated version of: +// DevnetSignPrivateKey = crypto.HexToECDSA(sha256.Sum256([]byte("erigon devnet key"))) +// DevnetEtherbase=crypto.PubkeyToAddress(DevnetSignPrivateKey.PublicKey) +var DevnetSignPrivateKey, _ = crypto.HexToECDSA("26e86e45f6fc45ec6e2ecd128cec80fa1d1505e5507dcd2ae58c3130a7a97b48") +var DevnetEtherbase = common.HexToAddress("67b1d87101671b127f5f8714789c7192f7ad340e") + // DeveloperGenesisBlock returns the 'geth --dev' genesis block. func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { // Override the default period to the user requested one @@ -627,18 +722,20 @@ func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...), GasLimit: 11500000, Difficulty: big.NewInt(1), - Alloc: map[common.Address]GenesisAccount{ - common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover - common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256 - common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD - common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity - common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp - common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd - common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul - common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing - common.BytesToAddress([]byte{9}): {Balance: big.NewInt(1)}, // BLAKE2b - faucet: {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}, - }, + Alloc: readPrealloc("allocs/dev.json"), + } +} + +func DefaultKilnDevnetGenesisBlock() *Genesis { + return &Genesis{ + Config: params.KilnDevnetChainConfig, + Nonce: 0x1234, + Timestamp: 0, + GasLimit: 0x400000, + Difficulty: big.NewInt(1), + Mixhash: common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), + Coinbase: common.HexToAddress("0x0000000000000000000000000000000000000000"), + Alloc: readPrealloc("allocs/kiln-devnet.json"), } } @@ -656,3 +753,36 @@ func readPrealloc(filename string) GenesisAlloc { } return ga } + +func DefaultGenesisBlockByChainName(chain string) *Genesis { + switch chain { + case networkname.MainnetChainName: + return DefaultGenesisBlock() + case networkname.SepoliaChainName: + return DefaultSepoliaGenesisBlock() + case networkname.RopstenChainName: + return DefaultRopstenGenesisBlock() + case networkname.RinkebyChainName: + return DefaultRinkebyGenesisBlock() + case networkname.GoerliChainName: + return DefaultGoerliGenesisBlock() + case networkname.SokolChainName: + return DefaultSokolGenesisBlock() + case networkname.FermionChainName: + return DefaultFermionGenesisBlock() + case networkname.BSCChainName: + return DefaultBSCGenesisBlock() + case networkname.ChapelChainName: + return DefaultChapelGenesisBlock() + case networkname.RialtoChainName: + return DefaultRialtoGenesisBlock() + case networkname.MumbaiChainName: + return DefaultMumbaiGenesisBlock() + case networkname.BorMainnetChainName: + return DefaultBorMainnetGenesisBlock() + case networkname.KilnDevnetChainName: + return DefaultKilnDevnetGenesisBlock() + default: + return nil + } +} diff --git a/core/genesis_test.go b/core/genesis_test.go new file mode 100644 index 00000000000..d4f89f83f68 --- /dev/null +++ b/core/genesis_test.go @@ -0,0 +1,48 @@ +package core + +import ( + "context" + "testing" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/params/networkname" + "github.com/stretchr/testify/require" +) + +func TestDefaultBSCGenesisBlock(t *testing.T) { + db := memdb.NewTestDB(t) + check := func(network string) { + genesis := DefaultGenesisBlockByChainName(network) + tx, err := db.BeginRw(context.Background()) + if err != nil { + t.Fatal(err) + } + defer tx.Rollback() + _, block, err := WriteGenesisBlock(tx, genesis, nil, nil) + require.NoError(t, err) + expect := params.GenesisHashByChainName(network) + require.NotNil(t, expect, network) + require.Equal(t, block.Hash().Bytes(), expect.Bytes(), network) + } + for _, network := range networkname.All { + check(network) + } +} + +func TestCommitGenesisIdempotency(t *testing.T) { + _, tx := memdb.NewTestTx(t) + genesis := DefaultGenesisBlockByChainName(networkname.MainnetChainName) + _, _, err := WriteGenesisBlock(tx, genesis, nil, nil) + require.NoError(t, err) + seq, err := tx.ReadSequence(kv.EthTx) + require.NoError(t, err) + require.Equal(t, uint64(2), seq) + + _, _, err = WriteGenesisBlock(tx, genesis, nil, nil) + require.NoError(t, err) + seq, err = tx.ReadSequence(kv.EthTx) + require.NoError(t, err) + require.Equal(t, uint64(2), seq) +} diff --git a/core/mkalloc.go b/core/mkalloc.go index 8218838daeb..3f72c78b16c 100644 --- a/core/mkalloc.go +++ b/core/mkalloc.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build none +//go:build none /* diff --git a/core/rawdb/accessors_account.go b/core/rawdb/accessors_account.go index 59c58b3b5eb..ce5e50a43db 100644 --- a/core/rawdb/accessors_account.go +++ b/core/rawdb/accessors_account.go @@ -22,9 +22,8 @@ import ( "github.com/ledgerwatch/erigon/core/types/accounts" ) -func ReadAccount(db kv.Tx, addrHash common.Address, acc *accounts.Account) (bool, error) { - addrHashBytes := addrHash[:] - enc, err := db.GetOne(kv.PlainState, addrHashBytes) +func ReadAccount(db kv.Tx, addr common.Address, acc *accounts.Account) (bool, error) { + enc, err := db.GetOne(kv.PlainState, addr[:]) if err != nil { return false, err } diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 1de3584383e..2334678d580 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -18,17 +18,23 @@ package rawdb import ( "bytes" + "context" "encoding/binary" "fmt" "math" "math/big" + "time" + libcommon "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb/cbor" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/log/v3" ) @@ -52,14 +58,29 @@ func WriteCanonicalHash(db kv.Putter, hash common.Hash, number uint64) error { return nil } -// DeleteCanonicalHash removes the number to hash canonical mapping. -func DeleteCanonicalHash(db kv.Deleter, number uint64) error { - if err := db.Delete(kv.HeaderCanonical, dbutils.EncodeBlockNumber(number), nil); err != nil { - return fmt.Errorf("failed to delete number to hash mapping: %w", err) +// TruncateCanonicalHash removes all the number to hash canonical mapping from block number N +func TruncateCanonicalHash(tx kv.RwTx, blockFrom uint64) error { + if err := tx.ForEach(kv.HeaderCanonical, dbutils.EncodeBlockNumber(blockFrom), func(k, _ []byte) error { + return tx.Delete(kv.HeaderCanonical, k, nil) + }); err != nil { + return fmt.Errorf("TruncateCanonicalHash: %w", err) } return nil } +// IsCanonicalHash determines whether a header with the given hash is on the canonical chain. +func IsCanonicalHash(db kv.Getter, hash common.Hash) (bool, error) { + number := ReadHeaderNumber(db, hash) + if number == nil { + return false, nil + } + canonicalHash, err := ReadCanonicalHash(db, *number) + if err != nil { + return false, err + } + return canonicalHash != (common.Hash{}) && canonicalHash == hash, nil +} + // ReadHeaderNumber returns the header number assigned to a hash. func ReadHeaderNumber(db kv.Getter, hash common.Hash) *uint64 { data, err := db.GetOne(kv.HeaderNumber, hash.Bytes()) @@ -78,18 +99,11 @@ func ReadHeaderNumber(db kv.Getter, hash common.Hash) *uint64 { } // WriteHeaderNumber stores the hash->number mapping. -func WriteHeaderNumber(db kv.Putter, hash common.Hash, number uint64) { - enc := dbutils.EncodeBlockNumber(number) - if err := db.Put(kv.HeaderNumber, hash[:], enc); err != nil { - log.Crit("Failed to store hash to number mapping", "err", err) - } -} - -// DeleteHeaderNumber removes hash->number mapping. -func DeleteHeaderNumber(db kv.Deleter, hash common.Hash) { - if err := db.Delete(kv.HeaderNumber, hash[:], nil); err != nil { - log.Crit("Failed to delete hash to number mapping", "err", err) +func WriteHeaderNumber(db kv.Putter, hash common.Hash, number uint64) error { + if err := db.Put(kv.HeaderNumber, hash[:], dbutils.EncodeBlockNumber(number)); err != nil { + return err } + return nil } // ReadHeadHeaderHash retrieves the hash of the current canonical head header. @@ -185,6 +199,18 @@ func ReadCurrentBlock(db kv.Tx) *types.Block { return ReadBlock(db, headHash, *headNumber) } +func ReadLastBlockSynced(db kv.Tx) (*types.Block, error) { + headNumber, err := stages.GetStageProgress(db, stages.Execution) + if err != nil { + return nil, err + } + headHash, err := ReadCanonicalHash(db, headNumber) + if err != nil { + return nil, err + } + return ReadBlock(db, headHash, headNumber), nil +} + func ReadHeadersByNumber(db kv.Tx, number uint64) ([]*types.Header, error) { var res []*types.Header c, err := db.Cursor(kv.Headers) @@ -231,8 +257,8 @@ func WriteHeader(db kv.Putter, header *types.Header) { } } -// DeleteHeader removes all block header data associated with a hash. -func DeleteHeader(db kv.Deleter, hash common.Hash, number uint64) { +// deleteHeader - dangerous, use DeleteAncientBlocks/TruncateBlocks methods +func deleteHeader(db kv.Deleter, hash common.Hash, number uint64) { if err := db.Delete(kv.Headers, dbutils.HeaderKey(number, hash), nil); err != nil { log.Crit("Failed to delete header", "err", err) } @@ -243,7 +269,15 @@ func DeleteHeader(db kv.Deleter, hash common.Hash, number uint64) { // ReadBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. func ReadBodyRLP(db kv.Tx, hash common.Hash, number uint64) rlp.RawValue { - body := ReadBody(db, hash, number) + body := ReadCanonicalBodyWithTransactions(db, hash, number) + bodyRlp, err := rlp.EncodeToBytes(body) + if err != nil { + log.Error("ReadBodyRLP failed", "err", err) + } + return bodyRlp +} +func NonCanonicalBodyRLP(db kv.Tx, hash common.Hash, number uint64) rlp.RawValue { + body := NonCanonicalBodyWithTransactions(db, hash, number) bodyRlp, err := rlp.EncodeToBytes(body) if err != nil { log.Error("ReadBodyRLP failed", "err", err) @@ -259,7 +293,60 @@ func ReadStorageBodyRLP(db kv.Getter, hash common.Hash, number uint64) rlp.RawVa return bodyRlp } -func ReadTransactions(db kv.Getter, baseTxId uint64, amount uint32) ([]types.Transaction, error) { +func ReadStorageBody(db kv.Getter, hash common.Hash, number uint64) (types.BodyForStorage, error) { + bodyRlp, err := db.GetOne(kv.BlockBody, dbutils.BlockBodyKey(number, hash)) + if err != nil { + log.Error("ReadBodyRLP failed", "err", err) + } + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(bodyRlp, bodyForStorage); err != nil { + return types.BodyForStorage{}, err + } + return *bodyForStorage, nil +} + +func CanonicalTxnByID(db kv.Getter, id uint64) (types.Transaction, error) { + txIdKey := make([]byte, 8) + binary.BigEndian.PutUint64(txIdKey, id) + v, err := db.GetOne(kv.EthTx, txIdKey) + if err != nil { + return nil, err + } + txn, err := types.DecodeTransaction(rlp.NewStream(bytes.NewReader(v), uint64(len(v)))) + if err != nil { + return nil, err + } + return txn, nil +} + +func CanonicalTransactions(db kv.Getter, baseTxId uint64, amount uint32) ([]types.Transaction, error) { + if amount == 0 { + return []types.Transaction{}, nil + } + txIdKey := make([]byte, 8) + reader := bytes.NewReader(nil) + stream := rlp.NewStream(reader, 0) + txs := make([]types.Transaction, amount) + binary.BigEndian.PutUint64(txIdKey, baseTxId) + i := uint32(0) + + if err := db.ForAmount(kv.EthTx, txIdKey, amount, func(k, v []byte) error { + var decodeErr error + reader.Reset(v) + stream.Reset(reader, 0) + if txs[i], decodeErr = types.DecodeTransaction(stream); decodeErr != nil { + return decodeErr + } + i++ + return nil + }); err != nil { + return nil, err + } + txs = txs[:i] // user may request big "amount", but db can return small "amount". Return as much as we found. + return txs, nil +} + +func NonCanonicalTransactions(db kv.Getter, baseTxId uint64, amount uint32) ([]types.Transaction, error) { if amount == 0 { return []types.Transaction{}, nil } @@ -289,12 +376,6 @@ func ReadTransactions(db kv.Getter, baseTxId uint64, amount uint32) ([]types.Tra func WriteTransactions(db kv.RwTx, txs []types.Transaction, baseTxId uint64) error { txId := baseTxId buf := bytes.NewBuffer(nil) - c, err := db.RwCursor(kv.EthTx) - if err != nil { - return err - } - defer c.Close() - for _, tx := range txs { txIdKey := make([]byte, 8) binary.BigEndian.PutUint64(txIdKey, txId) @@ -306,7 +387,7 @@ func WriteTransactions(db kv.RwTx, txs []types.Transaction, baseTxId uint64) err } // If next Append returns KeyExists error - it means you need to open transaction in App code before calling this func. Batch is also fine. - if err := c.Append(txIdKey, common.CopyBytes(buf.Bytes())); err != nil { + if err := db.Append(kv.EthTx, txIdKey, common.CopyBytes(buf.Bytes())); err != nil { return err } } @@ -315,39 +396,34 @@ func WriteTransactions(db kv.RwTx, txs []types.Transaction, baseTxId uint64) err func WriteRawTransactions(db kv.RwTx, txs [][]byte, baseTxId uint64) error { txId := baseTxId - c, err := db.RwCursor(kv.EthTx) - if err != nil { - return err - } - defer c.Close() - for _, tx := range txs { txIdKey := make([]byte, 8) binary.BigEndian.PutUint64(txIdKey, txId) - txId++ // If next Append returns KeyExists error - it means you need to open transaction in App code before calling this func. Batch is also fine. - if err := c.Append(txIdKey, tx); err != nil { + if err := db.Append(kv.EthTx, txIdKey, tx); err != nil { + c, err := db.Cursor(kv.EthTx) + if err != nil { + kk, _, _ := c.Last() + c.Close() + return fmt.Errorf("txId=%d, baseTxId=%d, lastInDb=%d, %w", txId, baseTxId, binary.BigEndian.Uint64(kk), err) + } return err } + txId++ } return nil } -// WriteBodyRLP stores an RLP encoded block body into the database. -func WriteBodyRLP(db kv.Putter, hash common.Hash, number uint64, rlp rlp.RawValue) { - if err := db.Put(kv.BlockBody, dbutils.BlockBodyKey(number, hash), rlp); err != nil { - log.Crit("Failed to store block body", "err", err) - } -} - -// HasBody verifies the existence of a block body corresponding to the hash. -func HasBody(db kv.Has, hash common.Hash, number uint64) bool { - if has, err := db.Has(kv.BlockBody, dbutils.BlockBodyKey(number, hash)); !has || err != nil { - return false +// WriteBodyForStorage stores an RLP encoded block body into the database. +func WriteBodyForStorage(db kv.Putter, hash common.Hash, number uint64, body *types.BodyForStorage) error { + data, err := rlp.EncodeToBytes(body) + if err != nil { + return err } - return true + return db.Put(kv.BlockBody, dbutils.BlockBodyKey(number, hash), data) } +// ReadBodyByNumber - returns canonical block body func ReadBodyByNumber(db kv.Tx, number uint64) (*types.Body, uint64, uint32, error) { hash, err := ReadCanonicalHash(db, number) if err != nil { @@ -356,25 +432,114 @@ func ReadBodyByNumber(db kv.Tx, number uint64) (*types.Body, uint64, uint32, err if hash == (common.Hash{}) { return nil, 0, 0, nil } - body, baseTxId, txAmount := ReadBodyWithoutTransactions(db, hash, number) + body, baseTxId, txAmount := ReadBody(db, hash, number) return body, baseTxId, txAmount, nil } -func ReadBody(db kv.Getter, hash common.Hash, number uint64) *types.Body { - body, baseTxId, txAmount := ReadBodyWithoutTransactions(db, hash, number) +func ReadBodyWithTransactions(db kv.Getter, hash common.Hash, number uint64) (*types.Body, error) { + canonicalHash, err := ReadCanonicalHash(db, number) + if err != nil { + return nil, fmt.Errorf("read canonical hash failed: %d, %w", number, err) + } + if canonicalHash == hash { + return ReadCanonicalBodyWithTransactions(db, hash, number), nil + } + return NonCanonicalBodyWithTransactions(db, hash, number), nil +} + +func ReadCanonicalBodyWithTransactions(db kv.Getter, hash common.Hash, number uint64) *types.Body { + body, baseTxId, txAmount := ReadBody(db, hash, number) if body == nil { return nil } var err error - body.Transactions, err = ReadTransactions(db, baseTxId, txAmount) + body.Transactions, err = CanonicalTransactions(db, baseTxId, txAmount) if err != nil { - log.Error("failed ReadTransaction", "hash", hash, "block", number, "err", err) + log.Error("failed ReadTransactionByHash", "hash", hash, "block", number, "err", err) return nil } return body } -func ReadBodyWithoutTransactions(db kv.Getter, hash common.Hash, number uint64) (*types.Body, uint64, uint32) { +func NonCanonicalBodyWithTransactions(db kv.Getter, hash common.Hash, number uint64) *types.Body { + body, baseTxId, txAmount := ReadBody(db, hash, number) + if body == nil { + return nil + } + var err error + body.Transactions, err = NonCanonicalTransactions(db, baseTxId, txAmount) + if err != nil { + log.Error("failed ReadTransactionByHash", "hash", hash, "block", number, "err", err) + return nil + } + return body +} + +func RawTransactionsRange(db kv.Getter, from, to uint64) (res [][]byte, err error) { + blockKey := make([]byte, dbutils.NumberLength+common.HashLength) + encNum := make([]byte, 8) + for i := from; i < to+1; i++ { + binary.BigEndian.PutUint64(encNum, i) + hash, err := db.GetOne(kv.HeaderCanonical, encNum) + if err != nil { + return nil, err + } + if len(hash) == 0 { + continue + } + + binary.BigEndian.PutUint64(blockKey, i) + copy(blockKey[dbutils.NumberLength:], hash) + bodyRlp, err := db.GetOne(kv.BlockBody, blockKey) + if err != nil { + return nil, err + } + if len(bodyRlp) == 0 { + continue + } + baseTxId, txAmount, err := types.DecodeOnlyTxMetadataFromBody(bodyRlp) + if err != nil { + return nil, err + } + + binary.BigEndian.PutUint64(encNum, baseTxId) + if err = db.ForAmount(kv.EthTx, encNum, txAmount, func(k, v []byte) error { + res = append(res, v) + return nil + }); err != nil { + return nil, err + } + } + return +} + +// ResetSequence - allow set arbitrary value to sequence (for example to decrement it to exact value) +func ResetSequence(tx kv.RwTx, bucket string, newValue uint64) error { + newVBytes := make([]byte, 8) + binary.BigEndian.PutUint64(newVBytes, newValue) + if err := tx.Put(kv.Sequence, []byte(bucket), newVBytes); err != nil { + return err + } + return nil +} + +func ReadBodyForStorageByKey(db kv.Getter, k []byte) (*types.BodyForStorage, error) { + bodyRlp, err := db.GetOne(kv.BlockBody, k) + if err != nil { + return nil, err + } + if len(bodyRlp) == 0 { + return nil, nil + } + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(bodyRlp, bodyForStorage); err != nil { + return nil, err + } + + return bodyForStorage, nil +} + +func ReadBody(db kv.Getter, hash common.Hash, number uint64) (*types.Body, uint64, uint32) { data := ReadStorageBodyRLP(db, hash, number) if len(data) == 0 { return nil, 0, 0 @@ -387,7 +552,11 @@ func ReadBodyWithoutTransactions(db kv.Getter, hash common.Hash, number uint64) } body := new(types.Body) body.Uncles = bodyForStorage.Uncles - return body, bodyForStorage.BaseTxId, bodyForStorage.TxAmount + + if bodyForStorage.TxAmount < 2 { + panic(fmt.Sprintf("block body hash too few txs amount: %d, %d", number, bodyForStorage.TxAmount)) + } + return body, bodyForStorage.BaseTxId + 1, bodyForStorage.TxAmount - 2 // 1 system txn in the begining of block, and 1 at the end } func ReadSenders(db kv.Getter, hash common.Hash, number uint64) ([]common.Address, error) { @@ -402,23 +571,32 @@ func ReadSenders(db kv.Getter, hash common.Hash, number uint64) ([]common.Addres return senders, nil } +func WriteRawBodyIfNotExists(db kv.RwTx, hash common.Hash, number uint64, body *types.RawBody) error { + exists, err := db.Has(kv.BlockBody, dbutils.BlockBodyKey(number, hash)) + if err != nil { + return err + } + if exists { + return nil + } + return WriteRawBody(db, hash, number, body) +} + func WriteRawBody(db kv.RwTx, hash common.Hash, number uint64, body *types.RawBody) error { - baseTxId, err := db.IncrementSequence(kv.EthTx, uint64(len(body.Transactions))) + baseTxId, err := db.IncrementSequence(kv.EthTx, uint64(len(body.Transactions))+2) if err != nil { return err } - data, err := rlp.EncodeToBytes(types.BodyForStorage{ + data := types.BodyForStorage{ BaseTxId: baseTxId, - TxAmount: uint32(len(body.Transactions)), + TxAmount: uint32(len(body.Transactions)) + 2, Uncles: body.Uncles, - }) - if err != nil { - return fmt.Errorf("failed to RLP encode body: %w", err) } - WriteBodyRLP(db, hash, number, data) - err = WriteRawTransactions(db, body.Transactions, baseTxId) - if err != nil { - return fmt.Errorf("failed to WriteRawTransactions: %w", err) + if err = WriteBodyForStorage(db, hash, number, &data); err != nil { + return fmt.Errorf("WriteBodyForStorage: %w", err) + } + if err = WriteRawTransactions(db, body.Transactions, baseTxId+1); err != nil { + return fmt.Errorf("WriteRawTransactions: %w", err) } return nil } @@ -426,27 +604,26 @@ func WriteRawBody(db kv.RwTx, hash common.Hash, number uint64, body *types.RawBo func WriteBody(db kv.RwTx, hash common.Hash, number uint64, body *types.Body) error { // Pre-processing body.SendersFromTxs() - baseTxId, err := db.IncrementSequence(kv.EthTx, uint64(len(body.Transactions))) + baseTxId, err := db.IncrementSequence(kv.EthTx, uint64(len(body.Transactions))+2) if err != nil { return err } - data, err := rlp.EncodeToBytes(types.BodyForStorage{ + data := types.BodyForStorage{ BaseTxId: baseTxId, - TxAmount: uint32(len(body.Transactions)), + TxAmount: uint32(len(body.Transactions)) + 2, Uncles: body.Uncles, - }) - if err != nil { - return fmt.Errorf("failed to RLP encode body: %w", err) } - WriteBodyRLP(db, hash, number, data) - err = WriteTransactions(db, body.Transactions, baseTxId) + if err := WriteBodyForStorage(db, hash, number, &data); err != nil { + return fmt.Errorf("failed to write body: %w", err) + } + err = WriteTransactions(db, body.Transactions, baseTxId+1) if err != nil { return fmt.Errorf("failed to WriteTransactions: %w", err) } return nil } -func WriteSenders(db kv.RwTx, hash common.Hash, number uint64, senders []common.Address) error { +func WriteSenders(db kv.Putter, hash common.Hash, number uint64, senders []common.Address) error { data := make([]byte, common.AddressLength*len(senders)) for i, sender := range senders { copy(data[i*common.AddressLength:], sender[:]) @@ -457,13 +634,150 @@ func WriteSenders(db kv.RwTx, hash common.Hash, number uint64, senders []common. return nil } -// DeleteBody removes all block body data associated with a hash. -func DeleteBody(db kv.Deleter, hash common.Hash, number uint64) { +// deleteBody removes all block body data associated with a hash. +func deleteBody(db kv.Deleter, hash common.Hash, number uint64) { if err := db.Delete(kv.BlockBody, dbutils.BlockBodyKey(number, hash), nil); err != nil { log.Crit("Failed to delete block body", "err", err) } } +// MakeBodiesCanonical - move all txs of non-canonical blocks from NonCanonicalTxs table to EthTx table +func MakeBodiesCanonical(tx kv.RwTx, from uint64, ctx context.Context, logPrefix string, logEvery *time.Ticker) error { + for blockNum := from; ; blockNum++ { + h, err := ReadCanonicalHash(tx, blockNum) + if err != nil { + return err + } + if h == (common.Hash{}) { + break + } + + data := ReadStorageBodyRLP(tx, h, blockNum) + if len(data) == 0 { + break + } + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(data, bodyForStorage); err != nil { + return err + } + newBaseId, err := tx.IncrementSequence(kv.EthTx, uint64(bodyForStorage.TxAmount)) + if err != nil { + return err + } + + // next loop does move only non-system txs. need move system-txs manually (because they may not exist) + i := uint64(0) + if err := tx.ForAmount(kv.NonCanonicalTxs, dbutils.EncodeBlockNumber(bodyForStorage.BaseTxId+1), bodyForStorage.TxAmount-2, func(k, v []byte) error { + id := newBaseId + 1 + i + if err := tx.Put(kv.EthTx, dbutils.EncodeBlockNumber(id), v); err != nil { + return err + } + if err := tx.Delete(kv.NonCanonicalTxs, k, nil); err != nil { + return err + } + i++ + return nil + }); err != nil { + return err + } + + bodyForStorage.BaseTxId = newBaseId + if err := WriteBodyForStorage(tx, h, blockNum, bodyForStorage); err != nil { + return err + } + + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Making bodies canonical...", logPrefix), "current block", blockNum) + default: + } + } + return nil +} + +// MakeBodiesNonCanonical - move all txs of canonical blocks to NonCanonicalTxs bucket +func MakeBodiesNonCanonical(tx kv.RwTx, from uint64, ctx context.Context, logPrefix string, logEvery *time.Ticker) error { + var firstMovedTxnID uint64 + var firstMovedTxnIDIsSet bool + for blockNum := from; ; blockNum++ { + h, err := ReadCanonicalHash(tx, blockNum) + if err != nil { + return err + } + if h == (common.Hash{}) { + break + } + data := ReadStorageBodyRLP(tx, h, blockNum) + if len(data) == 0 { + break + } + + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(data, bodyForStorage); err != nil { + return err + } + if !firstMovedTxnIDIsSet { + firstMovedTxnIDIsSet = true + firstMovedTxnID = bodyForStorage.BaseTxId + } + + // move txs to NonCanonical bucket, it has own sequence + newBaseId, err := tx.IncrementSequence(kv.NonCanonicalTxs, uint64(bodyForStorage.TxAmount)) + if err != nil { + return err + } + // next loop does move only non-system txs. need move system-txs manually (because they may not exist) + i := uint64(0) + if err := tx.ForAmount(kv.EthTx, dbutils.EncodeBlockNumber(bodyForStorage.BaseTxId+1), bodyForStorage.TxAmount-2, func(k, v []byte) error { + id := newBaseId + 1 + i + if err := tx.Put(kv.NonCanonicalTxs, dbutils.EncodeBlockNumber(id), v); err != nil { + return err + } + if err := tx.Delete(kv.EthTx, k, nil); err != nil { + return err + } + i++ + return nil + }); err != nil { + return err + } + bodyForStorage.BaseTxId = newBaseId + if err := WriteBodyForStorage(tx, h, blockNum, bodyForStorage); err != nil { + return err + } + + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Unwinding transactions...", logPrefix), "current block", blockNum) + default: + } + } + + // EthTx must have canonical id's - means need decrement it's sequence on unwind + if firstMovedTxnIDIsSet { + c, err := tx.Cursor(kv.EthTx) + if err != nil { + return err + } + k, _, err := c.Last() + if err != nil { + return err + } + if k != nil && binary.BigEndian.Uint64(k) >= firstMovedTxnID { + panic(fmt.Sprintf("must not happen, ResetSequence: %d, lastInDB: %d", firstMovedTxnID, binary.BigEndian.Uint64(k))) + } + + if err := ResetSequence(tx, kv.EthTx, firstMovedTxnID); err != nil { + return err + } + } + return nil +} + // ReadTd retrieves a block's total difficulty corresponding to the hash. func ReadTd(db kv.Getter, hash common.Hash, number uint64) (*big.Int, error) { data, err := db.GetOne(kv.HeaderTD, dbutils.HeaderKey(number, hash)) @@ -500,10 +814,12 @@ func WriteTd(db kv.Putter, hash common.Hash, number uint64, td *big.Int) error { return nil } -// DeleteTd removes all block total difficulty data associated with a hash. -func DeleteTd(db kv.Deleter, hash common.Hash, number uint64) error { - if err := db.Delete(kv.HeaderTD, dbutils.HeaderKey(number, hash), nil); err != nil { - return fmt.Errorf("failed to delete block total difficulty: %w", err) +// TruncateTd removes all block total difficulty from block number N +func TruncateTd(tx kv.RwTx, blockFrom uint64) error { + if err := tx.ForEach(kv.HeaderTD, dbutils.EncodeBlockNumber(blockFrom), func(k, _ []byte) error { + return tx.Delete(kv.HeaderTD, k, nil) + }); err != nil { + return fmt.Errorf("TruncateTd: %w", err) } return nil } @@ -511,7 +827,7 @@ func DeleteTd(db kv.Deleter, hash common.Hash, number uint64) error { // HasReceipts verifies the existence of all the transaction receipts belonging // to a block. func HasReceipts(db kv.Has, hash common.Hash, number uint64) bool { - if has, err := db.Has(kv.Receipts, dbutils.ReceiptsKey(number)); !has || err != nil { + if has, err := db.Has(kv.Receipts, dbutils.EncodeBlockNumber(number)); !has || err != nil { return false } return true @@ -522,7 +838,7 @@ func HasReceipts(db kv.Has, hash common.Hash, number uint64) bool { // should not be used. Use ReadReceipts instead if the metadata is needed. func ReadRawReceipts(db kv.Tx, blockNum uint64) types.Receipts { // Retrieve the flattened receipt slice - data, err := db.GetOne(kv.Receipts, dbutils.ReceiptsKey(blockNum)) + data, err := db.GetOne(kv.Receipts, dbutils.EncodeBlockNumber(blockNum)) if err != nil { log.Error("ReadRawReceipts failed", "err", err) } @@ -554,7 +870,7 @@ func ReadRawReceipts(db kv.Tx, blockNum uint64) types.Receipts { } // ReadReceipts retrieves all the transaction receipts belonging to a block, including -// its correspoinding metadata fields. If it is unable to populate these metadata +// its corresponding metadata fields. If it is unable to populate these metadata // fields then nil is returned. // // The current implementation populates these metadata fields by reading the receipts' @@ -569,16 +885,26 @@ func ReadReceipts(db kv.Tx, block *types.Block, senders []common.Address) types. if receipts == nil { return nil } - block.SendersToTxs(senders) + if len(senders) > 0 { + block.SendersToTxs(senders) + } if err := receipts.DeriveFields(block.Hash(), block.NumberU64(), block.Transactions(), senders); err != nil { - log.Error("Failed to derive block receipts fields", "hash", block.Hash(), "number", block.NumberU64(), "err", err) + log.Error("Failed to derive block receipts fields", "hash", block.Hash(), "number", block.NumberU64(), "err", err, "stack", dbg.Stack()) return nil } return receipts } func ReadReceiptsByHash(db kv.Tx, hash common.Hash) (types.Receipts, error) { - b, s, err := ReadBlockByHashWithSenders(db, hash) + number := ReadHeaderNumber(db, hash) + if number == nil { + return nil, nil + } + canonicalHash, err := ReadCanonicalHash(db, *number) + if err != nil { + return nil, fmt.Errorf("requested non-canonical hash %x. canonical=%x", hash, canonicalHash) + } + b, s, err := ReadBlockWithSenders(db, hash, *number) if err != nil { return nil, err } @@ -603,28 +929,28 @@ func WriteReceipts(tx kv.Putter, number uint64, receipts types.Receipts) error { buf.Reset() err := cbor.Marshal(buf, r.Logs) if err != nil { - return fmt.Errorf("encode block logs for block %d: %v", number, err) + return fmt.Errorf("encode block logs for block %d: %w", number, err) } if err = tx.Put(kv.Log, dbutils.LogKey(number, uint32(txId)), buf.Bytes()); err != nil { - return fmt.Errorf("writing logs for block %d: %v", number, err) + return fmt.Errorf("writing logs for block %d: %w", number, err) } } buf.Reset() err := cbor.Marshal(buf, receipts) if err != nil { - return fmt.Errorf("encode block receipts for block %d: %v", number, err) + return fmt.Errorf("encode block receipts for block %d: %w", number, err) } - if err = tx.Put(kv.Receipts, dbutils.ReceiptsKey(number), buf.Bytes()); err != nil { - return fmt.Errorf("writing receipts for block %d: %v", number, err) + if err = tx.Put(kv.Receipts, dbutils.EncodeBlockNumber(number), buf.Bytes()); err != nil { + return fmt.Errorf("writing receipts for block %d: %w", number, err) } return nil } // AppendReceipts stores all the transaction receipts belonging to a block. -func AppendReceipts(tx kv.RwTx, blockNumber uint64, receipts types.Receipts) error { +func AppendReceipts(tx kv.StatelessWriteTx, blockNumber uint64, receipts types.Receipts) error { buf := bytes.NewBuffer(make([]byte, 0, 1024)) for txId, r := range receipts { @@ -635,45 +961,29 @@ func AppendReceipts(tx kv.RwTx, blockNumber uint64, receipts types.Receipts) err buf.Reset() err := cbor.Marshal(buf, r.Logs) if err != nil { - return fmt.Errorf("encode block receipts for block %d: %v", blockNumber, err) + return fmt.Errorf("encode block receipts for block %d: %w", blockNumber, err) } if err = tx.Append(kv.Log, dbutils.LogKey(blockNumber, uint32(txId)), buf.Bytes()); err != nil { - return fmt.Errorf("writing receipts for block %d: %v", blockNumber, err) + return fmt.Errorf("writing receipts for block %d: %w", blockNumber, err) } } buf.Reset() err := cbor.Marshal(buf, receipts) if err != nil { - return fmt.Errorf("encode block receipts for block %d: %v", blockNumber, err) + return fmt.Errorf("encode block receipts for block %d: %w", blockNumber, err) } - if err = tx.Append(kv.Receipts, dbutils.ReceiptsKey(blockNumber), buf.Bytes()); err != nil { - return fmt.Errorf("writing receipts for block %d: %v", blockNumber, err) + if err = tx.Append(kv.Receipts, dbutils.EncodeBlockNumber(blockNumber), buf.Bytes()); err != nil { + return fmt.Errorf("writing receipts for block %d: %w", blockNumber, err) } return nil } -// DeleteReceipts removes all receipt data associated with a block hash. -func DeleteReceipts(db kv.RwTx, number uint64) error { - if err := db.Delete(kv.Receipts, dbutils.ReceiptsKey(number), nil); err != nil { - return fmt.Errorf("receipts delete failed: %d, %w", number, err) - } - - prefix := make([]byte, 8) - binary.BigEndian.PutUint64(prefix, number) - if err := db.ForPrefix(kv.Log, prefix, func(k, v []byte) error { - return db.Delete(kv.Log, k, nil) - }); err != nil { - return err - } - return nil -} - -// DeleteNewerReceipts removes all receipt for given block number or newer -func DeleteNewerReceipts(db kv.RwTx, number uint64) error { - if err := db.ForEach(kv.Receipts, dbutils.ReceiptsKey(number), func(k, v []byte) error { +// TruncateReceipts removes all receipt for given block number or newer +func TruncateReceipts(db kv.RwTx, number uint64) error { + if err := db.ForEach(kv.Receipts, dbutils.EncodeBlockNumber(number), func(k, _ []byte) error { return db.Delete(kv.Receipts, k, nil) }); err != nil { return err @@ -681,7 +991,7 @@ func DeleteNewerReceipts(db kv.RwTx, number uint64) error { from := make([]byte, 8) binary.BigEndian.PutUint64(from, number) - if err := db.ForEach(kv.Log, from, func(k, v []byte) error { + if err := db.ForEach(kv.Log, from, func(k, _ []byte) error { return db.Delete(kv.Log, k, nil) }); err != nil { return err @@ -716,14 +1026,34 @@ func ReadBlock(tx kv.Getter, hash common.Hash, number uint64) *types.Block { if header == nil { return nil } - body := ReadBody(tx, hash, number) + body := ReadCanonicalBodyWithTransactions(tx, hash, number) if body == nil { return nil } - //return types.NewBlockWithHeader(header).WithBody(body.Transactions, body.Uncles) return types.NewBlockFromStorage(hash, header, body.Transactions, body.Uncles) } +func NonCanonicalBlockWithSenders(tx kv.Getter, hash common.Hash, number uint64) (*types.Block, []common.Address, error) { + header := ReadHeader(tx, hash, number) + if header == nil { + return nil, nil, fmt.Errorf("header not found for block %d, %x", number, hash) + } + body := NonCanonicalBodyWithTransactions(tx, hash, number) + if body == nil { + return nil, nil, fmt.Errorf("body not found for block %d, %x", number, hash) + } + block := types.NewBlockFromStorage(hash, header, body.Transactions, body.Uncles) + senders, err := ReadSenders(tx, hash, number) + if err != nil { + return nil, nil, err + } + if len(senders) != block.Transactions().Len() { + return block, senders, nil // no senders is fine - will recover them on the fly + } + block.SendersToTxs(senders) + return block, senders, nil +} + // HasBlock - is more efficient than ReadBlock because doesn't read transactions. // It's is not equivalent of HasHeader because headers and bodies written by different stages func HasBlock(db kv.Getter, hash common.Hash, number uint64) bool { @@ -731,7 +1061,7 @@ func HasBlock(db kv.Getter, hash common.Hash, number uint64) bool { return len(body) > 0 } -func ReadBlockWithSenders(db kv.Tx, hash common.Hash, number uint64) (*types.Block, []common.Address, error) { +func ReadBlockWithSenders(db kv.Getter, hash common.Hash, number uint64) (*types.Block, []common.Address, error) { block := ReadBlock(db, hash, number) if block == nil { return nil, nil, nil @@ -741,7 +1071,7 @@ func ReadBlockWithSenders(db kv.Tx, hash common.Hash, number uint64) (*types.Blo return nil, nil, err } if len(senders) != block.Transactions().Len() { - return nil, nil, nil + return block, senders, nil // no senders is fine - will recover them on the fly } block.SendersToTxs(senders) return block, senders, nil @@ -756,16 +1086,195 @@ func WriteBlock(db kv.RwTx, block *types.Block) error { return nil } -// DeleteBlock removes all block data associated with a hash. -func DeleteBlock(db kv.RwTx, hash common.Hash, number uint64) error { - if err := DeleteReceipts(db, number); err != nil { - return err +// DeleteAncientBlocks - delete [1, to) old blocks after moving it to snapshots. +// keeps genesis in db: [1, to) +// doesn't change sequnces of kv.EthTx and kv.NonCanonicalTxs +// doesn't delete Reciepts, Senders, Canonical markers, TotalDifficulty +// returns [deletedFrom, deletedTo) +func DeleteAncientBlocks(tx kv.RwTx, blockTo uint64, blocksDeleteLimit int) (deletedFrom, deletedTo uint64, err error) { + c, err := tx.Cursor(kv.Headers) + if err != nil { + return + } + defer c.Close() + + // find first non-genesis block + firstK, _, err := c.Seek(dbutils.EncodeBlockNumber(1)) + if err != nil { + return + } + if firstK == nil { //nothing to delete + return } - DeleteHeader(db, hash, number) - DeleteBody(db, hash, number) - if err := DeleteTd(db, hash, number); err != nil { + blockFrom := binary.BigEndian.Uint64(firstK) + stopAtBlock := libcommon.Min(blockTo, blockFrom+uint64(blocksDeleteLimit)) + k, _, _ := c.Current() + deletedFrom = binary.BigEndian.Uint64(k) + + var canonicalHash common.Hash + var b *types.BodyForStorage + + for k, _, err = c.Current(); k != nil; k, _, err = c.Next() { + if err != nil { + return + } + + n := binary.BigEndian.Uint64(k) + if n >= stopAtBlock { // [from, to) + break + } + + canonicalHash, err = ReadCanonicalHash(tx, n) + if err != nil { + return + } + isCanonical := bytes.Equal(k[8:], canonicalHash[:]) + + b, err = ReadBodyForStorageByKey(tx, k) + if err != nil { + return + } + if b == nil { + log.Debug("DeleteAncientBlocks: block body not found", "height", n) + } else { + txIDBytes := make([]byte, 8) + for txID := b.BaseTxId; txID < b.BaseTxId+uint64(b.TxAmount); txID++ { + binary.BigEndian.PutUint64(txIDBytes, txID) + bucket := kv.EthTx + if !isCanonical { + bucket = kv.NonCanonicalTxs + } + if err = tx.Delete(bucket, txIDBytes, nil); err != nil { + return + } + } + } + if err = tx.Delete(kv.Headers, k, nil); err != nil { + return + } + if err = tx.Delete(kv.BlockBody, k, nil); err != nil { + return + } + } + + k, _, _ = c.Current() + deletedTo = binary.BigEndian.Uint64(k) + + return +} + +// LastKey - candidate on move to kv.Tx interface +func LastKey(tx kv.Tx, table string) ([]byte, error) { + c, err := tx.Cursor(table) + if err != nil { + return nil, err + } + defer c.Close() + k, _, err := c.Last() + if err != nil { + return nil, err + } + return k, nil +} + +// FirstKey - candidate on move to kv.Tx interface +func FirstKey(tx kv.Tx, table string) ([]byte, error) { + c, err := tx.Cursor(table) + if err != nil { + return nil, err + } + defer c.Close() + k, _, err := c.First() + if err != nil { + return nil, err + } + return k, nil +} + +// SecondKey - useful if table always has zero-key (for example genesis block) +func SecondKey(tx kv.Tx, table string) ([]byte, error) { + c, err := tx.Cursor(table) + if err != nil { + return nil, err + } + defer c.Close() + _, _, err = c.First() + if err != nil { + return nil, err + } + k, _, err := c.Next() + if err != nil { + return nil, err + } + return k, nil +} + +// TruncateBlocks - delete block >= blockFrom +// does decrement sequnces of kv.EthTx and kv.NonCanonicalTxs +// doesn't delete Reciepts, Senders, Canonical markers, TotalDifficulty +func TruncateBlocks(ctx context.Context, tx kv.RwTx, blockFrom uint64) error { + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + + c, err := tx.Cursor(kv.Headers) + if err != nil { return err } + defer c.Close() + if blockFrom < 1 { //protect genesis + blockFrom = 1 + } + for k, _, err := c.Last(); k != nil; k, _, err = c.Prev() { + if err != nil { + return err + } + n := binary.BigEndian.Uint64(k) + if n < blockFrom { // [from, to) + break + } + canonicalHash, err := ReadCanonicalHash(tx, n) + if err != nil { + return err + } + isCanonical := bytes.Equal(k[8:], canonicalHash[:]) + + b, err := ReadBodyForStorageByKey(tx, k) + if err != nil { + return err + } + if b != nil { + bucket := kv.EthTx + if !isCanonical { + bucket = kv.NonCanonicalTxs + } + if err := tx.ForEach(bucket, dbutils.EncodeBlockNumber(b.BaseTxId), func(k, _ []byte) error { + if err := tx.Delete(bucket, k, nil); err != nil { + return err + } + return nil + }); err != nil { + return err + } + if err := ResetSequence(tx, bucket, b.BaseTxId); err != nil { + return err + } + } + if err := tx.Delete(kv.Headers, k, nil); err != nil { + return err + } + if err := tx.Delete(kv.BlockBody, k, nil); err != nil { + return err + } + + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + log.Info("TruncateBlocks", "block", n) + default: + } + } + return nil } @@ -781,7 +1290,7 @@ func ReadBlockByNumber(db kv.Tx, number uint64) (*types.Block, error) { return ReadBlock(db, hash, number), nil } -func ReadBlockByNumberWithSenders(db kv.Tx, number uint64) (*types.Block, []common.Address, error) { +func CanonicalBlockByNumberWithSenders(db kv.Tx, number uint64) (*types.Block, []common.Address, error) { hash, err := ReadCanonicalHash(db, number) if err != nil { return nil, nil, fmt.Errorf("failed ReadCanonicalHash: %w", err) @@ -801,12 +1310,46 @@ func ReadBlockByHash(db kv.Tx, hash common.Hash) (*types.Block, error) { return ReadBlock(db, hash, *number), nil } -func ReadBlockByHashWithSenders(db kv.Tx, hash common.Hash) (*types.Block, []common.Address, error) { - number := ReadHeaderNumber(db, hash) - if number == nil { - return nil, nil, nil +func ReadTotalIssued(db kv.Getter, number uint64) (*big.Int, error) { + data, err := db.GetOne(kv.Issuance, dbutils.EncodeBlockNumber(number)) + if err != nil { + return nil, err } - return ReadBlockWithSenders(db, hash, *number) + + return new(big.Int).SetBytes(data), nil +} + +func WriteTotalIssued(db kv.Putter, number uint64, totalIssued *big.Int) error { + return db.Put(kv.Issuance, dbutils.EncodeBlockNumber(number), totalIssued.Bytes()) +} + +func ReadTotalBurnt(db kv.Getter, number uint64) (*big.Int, error) { + data, err := db.GetOne(kv.Issuance, append([]byte("burnt"), dbutils.EncodeBlockNumber(number)...)) + if err != nil { + return nil, err + } + + return new(big.Int).SetBytes(data), nil +} + +func WriteTotalBurnt(db kv.Putter, number uint64, totalBurnt *big.Int) error { + return db.Put(kv.Issuance, append([]byte("burnt"), dbutils.EncodeBlockNumber(number)...), totalBurnt.Bytes()) +} + +func ReadCumulativeGasUsed(db kv.Getter, number uint64) (*big.Int, error) { + data, err := db.GetOne(kv.CumulativeGasIndex, dbutils.EncodeBlockNumber(number)) + if err != nil { + return nil, err + } + if len(data) == 0 { + return big.NewInt(0), nil + } + + return new(big.Int).SetBytes(data), nil +} + +func WriteCumulativeGasUsed(db kv.Putter, number uint64, cumulativeGasUsed *big.Int) error { + return db.Put(kv.CumulativeGasIndex, dbutils.EncodeBlockNumber(number), cumulativeGasUsed.Bytes()) } func ReadHeaderByNumber(db kv.Getter, number uint64) *types.Header { @@ -830,28 +1373,32 @@ func ReadHeaderByHash(db kv.Getter, hash common.Hash) (*types.Header, error) { return ReadHeader(db, hash, *number), nil } -func ReadAncestor(db kv.Getter, hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { +func ReadAncestor(db kv.Getter, hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64, blockReader services.HeaderAndCanonicalReader) (common.Hash, uint64) { if ancestor > number { return common.Hash{}, 0 } if ancestor == 1 { + header, err := blockReader.Header(context.Background(), db, hash, number) + if err != nil { + panic(err) + } // in this case it is cheaper to just read the header - if header := ReadHeader(db, hash, number); header != nil { + if header != nil { return header.ParentHash, number - 1 } return common.Hash{}, 0 } for ancestor != 0 { - h, err := ReadCanonicalHash(db, number) + h, err := blockReader.CanonicalHash(context.Background(), db, number) if err != nil { panic(err) } if h == hash { - ancestorHash, err := ReadCanonicalHash(db, number-ancestor) + ancestorHash, err := blockReader.CanonicalHash(context.Background(), db, number-ancestor) if err != nil { panic(err) } - h, err := ReadCanonicalHash(db, number) + h, err := blockReader.CanonicalHash(context.Background(), db, number) if err != nil { panic(err) } @@ -865,7 +1412,10 @@ func ReadAncestor(db kv.Getter, hash common.Hash, number, ancestor uint64, maxNo } *maxNonCanonical-- ancestor-- - header := ReadHeader(db, hash, number) + header, err := blockReader.Header(context.Background(), db, hash, number) + if err != nil { + panic(err) + } if header == nil { return common.Hash{}, 0 } @@ -938,3 +1488,29 @@ func WritePendingEpoch(tx kv.RwTx, blockNum uint64, blockHash common.Hash, trans copy(k[8:], blockHash[:]) return tx.Put(kv.PendingEpoch, k, transitionProof) } + +// Transitioned returns true if the block number comes after POS transition or is the last POW block +func Transitioned(db kv.Getter, blockNum uint64, terminalTotalDifficulty *big.Int) (trans bool, err error) { + if terminalTotalDifficulty == nil { + return false, nil + } + + if terminalTotalDifficulty.Cmp(common.Big0) == 0 { + return true, nil + } + header := ReadHeaderByNumber(db, blockNum) + if header == nil { + return false, nil + } + + if header.Difficulty.Cmp(common.Big0) == 0 { + return true, nil + } + + headerTd, err := ReadTd(db, header.Hash(), blockNum) + if err != nil { + return false, err + } + + return headerTd.Cmp(terminalTotalDifficulty) >= 0, nil +} diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index beb318e26a0..7239ffafde0 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -18,6 +18,7 @@ package rawdb import ( "bytes" + "context" "encoding/hex" "fmt" "math/big" @@ -61,7 +62,7 @@ func TestHeaderStorage(t *testing.T) { } } // Delete the header and verify the execution - DeleteHeader(tx, header.Hash(), header.Number.Uint64()) + deleteHeader(tx, header.Hash(), header.Number.Uint64()) if entry := ReadHeader(tx, header.Hash(), header.Number.Uint64()); entry != nil { t.Fatalf("Deleted header returned: %v", entry) } @@ -96,11 +97,11 @@ func TestBodyStorage(t *testing.T) { _ = rlp.Encode(hasher, body) hash := common.BytesToHash(hasher.Sum(nil)) - if entry := ReadBody(tx, hash, 0); entry != nil { + if entry := ReadCanonicalBodyWithTransactions(tx, hash, 0); entry != nil { t.Fatalf("Non existent body returned: %v", entry) } require.NoError(WriteBody(tx, hash, 0, body)) - if entry := ReadBody(tx, hash, 0); entry == nil { + if entry := ReadCanonicalBodyWithTransactions(tx, hash, 0); entry == nil { t.Fatalf("Stored body not found") } else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(types.Transactions(body.Transactions)) || types.CalcUncleHash(entry.Uncles) != types.CalcUncleHash(body.Uncles) { t.Fatalf("Retrieved body mismatch: have %v, want %v", entry, body) @@ -116,8 +117,8 @@ func TestBodyStorage(t *testing.T) { } } // Delete the body and verify the execution - DeleteBody(tx, hash, 0) - if entry := ReadBody(tx, hash, 0); entry != nil { + deleteBody(tx, hash, 0) + if entry := ReadCanonicalBodyWithTransactions(tx, hash, 0); entry != nil { t.Fatalf("Deleted body returned: %v", entry) } } @@ -128,6 +129,7 @@ func TestBlockStorage(t *testing.T) { // Create a test block to move around the database and make sure it's really new block := types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(1), Extra: []byte("test block"), UncleHash: types.EmptyUncleHash, TxHash: types.EmptyRootHash, @@ -139,7 +141,7 @@ func TestBlockStorage(t *testing.T) { if entry := ReadHeader(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent header returned: %v", entry) } - if entry := ReadBody(tx, block.Hash(), block.NumberU64()); entry != nil { + if entry := ReadCanonicalBodyWithTransactions(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent body returned: %v", entry) } // Write and verify the block in the database @@ -154,27 +156,41 @@ func TestBlockStorage(t *testing.T) { } if entry := ReadHeader(tx, block.Hash(), block.NumberU64()); entry == nil { t.Fatalf("Stored header not found") - } else if entry.Hash() != block.Header().Hash() { + } else if entry.Hash() != block.Hash() { t.Fatalf("Retrieved header mismatch: have %v, want %v", entry, block.Header()) } - if entry := ReadBody(tx, block.Hash(), block.NumberU64()); entry == nil { + if err := TruncateBlocks(context.Background(), tx, 2); err != nil { + t.Fatal(err) + } + if entry := ReadCanonicalBodyWithTransactions(tx, block.Hash(), block.NumberU64()); entry == nil { t.Fatalf("Stored body not found") } else if types.DeriveSha(types.Transactions(entry.Transactions)) != types.DeriveSha(block.Transactions()) || types.CalcUncleHash(entry.Uncles) != types.CalcUncleHash(block.Uncles()) { t.Fatalf("Retrieved body mismatch: have %v, want %v", entry, block.Body()) } // Delete the block and verify the execution - if err := DeleteBlock(tx, block.Hash(), block.NumberU64()); err != nil { - t.Fatalf("Could not delete block: %v", err) + if err := TruncateBlocks(context.Background(), tx, block.NumberU64()); err != nil { + t.Fatal(err) } + //if err := DeleteBlock(tx, block.Hash(), block.NumberU64()); err != nil { + // t.Fatalf("Could not delete block: %v", err) + //} if entry := ReadBlock(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Deleted block returned: %v", entry) } if entry := ReadHeader(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Deleted header returned: %v", entry) } - if entry := ReadBody(tx, block.Hash(), block.NumberU64()); entry != nil { + if entry := ReadCanonicalBodyWithTransactions(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Deleted body returned: %v", entry) } + + // write again and delete it as old one + if err := WriteBlock(tx, block); err != nil { + t.Fatalf("Could not write block: %v", err) + } + if _, _, err := DeleteAncientBlocks(tx, 0, 1); err != nil { + t.Fatal(err) + } } // Tests that partial block contents don't get reassembled into full blocks. @@ -186,12 +202,14 @@ func TestPartialBlockStorage(t *testing.T) { TxHash: types.EmptyRootHash, ReceiptHash: types.EmptyRootHash, }) + header := block.Header() // Not identical to struct literal above, due to other fields + // Store a header and check that it's not recognized as a block - WriteHeader(tx, block.Header()) + WriteHeader(tx, header) if entry := ReadBlock(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent block returned: %v", entry) } - DeleteHeader(tx, block.Hash(), block.NumberU64()) + deleteHeader(tx, block.Hash(), block.NumberU64()) // Store a body and check that it's not recognized as a block if err := WriteBody(tx, block.Hash(), block.NumberU64(), block.Body()); err != nil { @@ -200,10 +218,10 @@ func TestPartialBlockStorage(t *testing.T) { if entry := ReadBlock(tx, block.Hash(), block.NumberU64()); entry != nil { t.Fatalf("Non existent block returned: %v", entry) } - DeleteBody(tx, block.Hash(), block.NumberU64()) + deleteBody(tx, block.Hash(), block.NumberU64()) // Store a header and a body separately and check reassembly - WriteHeader(tx, block.Header()) + WriteHeader(tx, header) if err := WriteBody(tx, block.Hash(), block.NumberU64(), block.Body()); err != nil { t.Fatal(err) } @@ -243,7 +261,7 @@ func TestTdStorage(t *testing.T) { t.Fatalf("Retrieved TD mismatch: have %v, want %v", entry, td) } // Delete the TD and verify the execution - err = DeleteTd(tx, hash, 0) + err = TruncateTd(tx, 0) if err != nil { t.Fatalf("DeleteTd failed: %v", err) } @@ -284,7 +302,7 @@ func TestCanonicalMappingStorage(t *testing.T) { t.Fatalf("Retrieved canonical mapping mismatch: have %v, want %v", entry, hash) } // Delete the TD and verify the execution - err = DeleteCanonicalHash(tx, number) + err = TruncateCanonicalHash(tx, number) if err != nil { t.Fatalf("DeleteCanonicalHash failed: %v", err) } @@ -392,8 +410,8 @@ func TestBlockReceiptStorage(t *testing.T) { } } // Delete the body and ensure that the receipts are no longer returned (metadata can't be recomputed) - DeleteHeader(tx, hash, 0) - DeleteBody(tx, hash, 0) + deleteHeader(tx, hash, 0) + deleteBody(tx, hash, 0) b, senders, err = ReadBlockWithSenders(tx, hash, 0) require.NoError(err) require.Nil(b) @@ -407,7 +425,7 @@ func TestBlockReceiptStorage(t *testing.T) { WriteHeader(tx, header) // Sanity check that body alone without the receipt is a full purge require.NoError(WriteBody(tx, hash, 0, body)) - require.NoError(DeleteReceipts(tx, 0)) + require.NoError(TruncateReceipts(tx, 0)) b, senders, err = ReadBlockWithSenders(tx, hash, 0) require.NoError(err) require.NotNil(b) diff --git a/core/rawdb/accessors_indexes.go b/core/rawdb/accessors_indexes.go index 5ea1e7ecf79..14e312e9ae8 100644 --- a/core/rawdb/accessors_indexes.go +++ b/core/rawdb/accessors_indexes.go @@ -35,7 +35,7 @@ type TxLookupEntry struct { // ReadTxLookupEntry retrieves the positional metadata associated with a transaction // hash to allow retrieving the transaction or receipt by hash. -func ReadTxLookupEntry(db kv.Tx, txnHash common.Hash) (*uint64, error) { +func ReadTxLookupEntry(db kv.Getter, txnHash common.Hash) (*uint64, error) { data, err := db.GetOne(kv.TxLookup, txnHash.Bytes()) if err != nil { return nil, err @@ -63,9 +63,9 @@ func DeleteTxLookupEntry(db kv.Deleter, hash common.Hash) error { return db.Delete(kv.TxLookup, hash.Bytes(), nil) } -// ReadTransaction retrieves a specific transaction from the database, along with +// ReadTransactionByHash retrieves a specific transaction from the database, along with // its added positional metadata. -func ReadTransaction(db kv.Tx, hash common.Hash) (types.Transaction, common.Hash, uint64, uint64, error) { +func ReadTransactionByHash(db kv.Tx, hash common.Hash) (types.Transaction, common.Hash, uint64, uint64, error) { blockNumber, err := ReadTxLookupEntry(db, hash) if err != nil { return nil, common.Hash{}, 0, 0, err @@ -80,7 +80,7 @@ func ReadTransaction(db kv.Tx, hash common.Hash) (types.Transaction, common.Hash if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0, nil } - body := ReadBody(db, blockHash, *blockNumber) + body := ReadCanonicalBodyWithTransactions(db, blockHash, *blockNumber) if body == nil { log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash) return nil, common.Hash{}, 0, 0, nil @@ -99,6 +99,35 @@ func ReadTransaction(db kv.Tx, hash common.Hash) (types.Transaction, common.Hash return nil, common.Hash{}, 0, 0, nil } +// ReadTransaction retrieves a specific transaction from the database, along with +// its added positional metadata. +func ReadTransaction(db kv.Tx, hash common.Hash, blockNumber uint64) (types.Transaction, common.Hash, uint64, uint64, error) { + blockHash, err := ReadCanonicalHash(db, blockNumber) + if err != nil { + return nil, common.Hash{}, 0, 0, err + } + if blockHash == (common.Hash{}) { + return nil, common.Hash{}, 0, 0, nil + } + body := ReadCanonicalBodyWithTransactions(db, blockHash, blockNumber) + if body == nil { + log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash) + return nil, common.Hash{}, 0, 0, nil + } + senders, err1 := ReadSenders(db, blockHash, blockNumber) + if err1 != nil { + return nil, common.Hash{}, 0, 0, err1 + } + body.SendersToTxs(senders) + for txIndex, tx := range body.Transactions { + if tx.Hash() == hash { + return tx, blockHash, blockNumber, uint64(txIndex), nil + } + } + log.Error("Transaction not found", "number", blockNumber, "hash", blockHash, "txhash", hash) + return nil, common.Hash{}, 0, 0, nil +} + func ReadReceipt(db kv.Tx, txHash common.Hash) (*types.Receipt, common.Hash, uint64, uint64, error) { // Retrieve the context of the receipt based on the transaction hash blockNumber, err := ReadTxLookupEntry(db, txHash) diff --git a/core/rawdb/accessors_indexes_test.go b/core/rawdb/accessors_indexes_test.go index f98aa8600f2..cdf56135511 100644 --- a/core/rawdb/accessors_indexes_test.go +++ b/core/rawdb/accessors_indexes_test.go @@ -56,7 +56,7 @@ func TestLookupStorage(t *testing.T) { // Check that no transactions entries are in a pristine database for i, txn := range txs { - if txn2, _, _, _, _ := ReadTransaction(tx, txn.Hash()); txn2 != nil { + if txn2, _, _, _, _ := ReadTransactionByHash(tx, txn.Hash()); txn2 != nil { t.Fatalf("txn #%d [%x]: non existent transaction returned: %v", i, txn.Hash(), txn2) } } @@ -73,7 +73,7 @@ func TestLookupStorage(t *testing.T) { tc.writeTxLookupEntries(tx, block) for i, txn := range txs { - if txn2, hash, number, index, _ := ReadTransaction(tx, txn.Hash()); txn2 == nil { + if txn2, hash, number, index, _ := ReadTransactionByHash(tx, txn.Hash()); txn2 == nil { t.Fatalf("txn #%d [%x]: transaction not found", i, txn.Hash()) } else { if hash != block.Hash() || number != block.NumberU64() || index != uint64(i) { @@ -89,7 +89,7 @@ func TestLookupStorage(t *testing.T) { if err := DeleteTxLookupEntry(tx, txn.Hash()); err != nil { t.Fatal(err) } - if txn2, _, _, _, _ := ReadTransaction(tx, txn.Hash()); txn2 != nil { + if txn2, _, _, _, _ := ReadTransactionByHash(tx, txn.Hash()); txn2 != nil { t.Fatalf("txn #%d [%x]: deleted transaction returned: %v", i, txn.Hash(), txn2) } } diff --git a/core/rawdb/bor_receipts.go b/core/rawdb/bor_receipts.go new file mode 100644 index 00000000000..123edabe76a --- /dev/null +++ b/core/rawdb/bor_receipts.go @@ -0,0 +1,160 @@ +package rawdb + +import ( + "errors" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" +) + +var ( + // bor receipt key + borReceiptKey = types.BorReceiptKey +) + +// HasBorReceipt verifies the existence of all block receipt belonging +// to a block. +func HasBorReceipts(db kv.Has, hash common.Hash, number uint64) bool { + if has, err := db.Has(kv.BorReceipts, borReceiptKey(number)); !has || err != nil { + return false + } + return true +} + +// ReadBorReceiptRLP retrieves the block receipt belonging to a block in RLP encoding. +func ReadBorReceiptRLP(db kv.Getter, hash common.Hash, number uint64) rlp.RawValue { + data, err := db.GetOne(kv.BorReceipts, borReceiptKey(number)) + if err != nil { + log.Error("ReadBorReceiptRLP failed", "err", err) + } + return data +} + +// ReadRawBorReceipt retrieves the block receipt belonging to a block. +// The receipt metadata fields are not guaranteed to be populated, so they +// should not be used. Use ReadBorReceipt instead if the metadata is needed. +func ReadRawBorReceipt(db kv.Tx, hash common.Hash, number uint64) *types.Receipt { + // Retrieve the flattened receipt slice + data := ReadBorReceiptRLP(db, hash, number) + if len(data) == 0 { + return nil + } + + // Convert the receipts from their storage form to their internal representation + var storageReceipt types.ReceiptForStorage + if err := rlp.DecodeBytes(data, &storageReceipt); err != nil { + log.Error("Invalid receipt array RLP", "hash", hash, "err", err) + return nil + } + + return (*types.Receipt)(&storageReceipt) +} + +// ReadBorReceipt retrieves all the bor block receipts belonging to a block, including +// its correspoinding metadata fields. If it is unable to populate these metadata +// fields then nil is returned. +func ReadBorReceipt(db kv.Tx, hash common.Hash, number uint64) *types.Receipt { + // We're deriving many fields from the block body, retrieve beside the receipt + borReceipt := ReadRawBorReceipt(db, hash, number) + if borReceipt == nil { + return nil + } + + // We're deriving many fields from the block body, retrieve beside the receipt + receipts := ReadRawReceipts(db, number) + if receipts == nil { + receipts = make(types.Receipts, 0) + } + + data := ReadStorageBodyRLP(db, hash, number) + if len(data) == 0 { + log.Error("Missing body but have bor receipt", "hash", hash, "number", number) + return nil + } + + if err := types.DeriveFieldsForBorReceipt(borReceipt, hash, number, receipts); err != nil { + log.Error("Failed to derive bor receipt fields", "hash", hash, "number", number, "err", err) + return nil + } + return borReceipt +} + +// WriteBorReceipt stores all the bor receipt belonging to a block. +func WriteBorReceipt(tx kv.RwTx, hash common.Hash, number uint64, borReceipt *types.ReceiptForStorage) error { + // Convert the bor receipt into their storage form and serialize them + bytes, err := rlp.EncodeToBytes(borReceipt) + if err != nil { + return err + } + + // Store the flattened receipt slice + if err := tx.Append(kv.BorReceipts, borReceiptKey(number), bytes); err != nil { + return err + } + + return nil +} + +// DeleteBorReceipt removes receipt data associated with a block hash. +func DeleteBorReceipt(tx kv.RwTx, hash common.Hash, number uint64) { + key := borReceiptKey(number) + + if err := tx.Delete(kv.BorReceipts, key, nil); err != nil { + log.Crit("Failed to delete bor receipt", "err", err) + } +} + +// ReadBorTransactionWithBlockHash retrieves a specific bor (fake) transaction by tx hash and block hash, along with +// its added positional metadata. +func ReadBorTransactionWithBlockHash(db kv.Tx, txHash common.Hash, blockHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + blockNumber := ReadHeaderNumber(db, txHash) + + if blockNumber == nil { + return nil, common.Hash{}, 0, 0, nil + } + + bodyForStorage, err := ReadStorageBody(db, blockHash, *blockNumber) + if err != nil { + return nil, common.Hash{}, 0, 0, nil + } + + var tx types.Transaction = types.NewBorTransaction() + return &tx, blockHash, *blockNumber, uint64(bodyForStorage.TxAmount), nil +} + +// ReadBorTransaction retrieves a specific bor (fake) transaction by hash, along with +// its added positional metadata. +func ReadBorTransaction(db kv.Tx, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + blockNumber := ReadHeaderNumber(db, hash) + + if blockNumber == nil { + return nil, common.Hash{}, 0, 0, errors.New("missing block number") + } + + blockHash, _ := ReadCanonicalHash(db, *blockNumber) + if blockHash == (common.Hash{}) { + return nil, common.Hash{}, 0, 0, errors.New("missing block hash") + } + + bodyForStorage, err := ReadStorageBody(db, hash, *blockNumber) + if err != nil { + return nil, common.Hash{}, 0, 0, nil + } + + var tx types.Transaction = types.NewBorTransaction() + return &tx, blockHash, *blockNumber, uint64(bodyForStorage.TxAmount), nil +} + +// TruncateBorReceipts removes all bor receipt for given block number or newer +func TruncateBorReceipts(db kv.RwTx, number uint64) error { + if err := db.ForEach(kv.BorReceipts, dbutils.EncodeBlockNumber(number), func(k, _ []byte) error { + return db.Delete(kv.BorReceipts, k, nil) + }); err != nil { + return err + } + return nil +} diff --git a/core/skip_analysis.go b/core/skip_analysis.go index 3b7ff5d8a24..35da3ec7b80 100644 --- a/core/skip_analysis.go +++ b/core/skip_analysis.go @@ -21,7 +21,14 @@ import ( ) // MainnetNotCheckedFrom is the first block number not yet checked for invalid jumps -const MainnetNotCheckedFrom uint64 = 12919300 +const MainnetNotCheckedFrom uint64 = 14_909_200 + +// MainnetNotCheckedFrom is the first block number not yet checked for invalid jumps +const BSCNotCheckedFrom uint64 = 17_048_970 + +const BorMainnetNotCheckedFrom uint64 = 14_232_422 + +const RopstenNotCheckedFrom uint64 = 12_331_664 // SkipAnalysis function tells us whether we can skip performing jumpdest analysis // for the historical blocks (on mainnet now but perhaps on the testsnets @@ -33,15 +40,31 @@ const MainnetNotCheckedFrom uint64 = 12919300 // 0x86e55d1818b5355424975de9633a57c40789ca08552297b726333a9433949c92 (block 6426298) // 0x3666640316df11865abd1352f4c0b4c5126f8ac1d858ef2a0c6e744a4865bca2 (block 5800596) // 0xcdb5bf0b4b51093e1c994f471921f88623c9d3e1b6aa2782049f53a0048f2b32 (block 11079912) +// 0x21ab7bf7245a87eae265124aaf180d91133377e47db2b1a4866493ec4b371150 (block 13119520) + func SkipAnalysis(config *params.ChainConfig, blockNumber uint64) bool { - if config != params.MainnetChainConfig { - return false - } - if blockNumber >= MainnetNotCheckedFrom { // We have not checked beyond that block - return false - } - if blockNumber == 6426298 || blockNumber == 6426432 || blockNumber == 5800596 || blockNumber == 11079912 { - return false + if config == params.MainnetChainConfig { + if blockNumber >= MainnetNotCheckedFrom { // We have not checked beyond that block + return false + } + if blockNumber == 6426298 || blockNumber == 6426432 || blockNumber == 5800596 || blockNumber == 11079912 || blockNumber == 13119520 { + return false + } + return true + } else if config == params.BSCChainConfig { + return blockNumber < BSCNotCheckedFrom + } else if config == params.BorMainnetChainConfig { + return blockNumber < BorMainnetNotCheckedFrom + } else if config == params.RopstenChainConfig { + if blockNumber >= RopstenNotCheckedFrom { + return false + } + if blockNumber == 2534105 || blockNumber == 2534116 || blockNumber == 3028887 || blockNumber == 3028940 || blockNumber == 3028956 || + blockNumber == 3450102 || blockNumber == 5294626 || blockNumber == 5752787 || blockNumber == 10801303 || blockNumber == 10925062 || + blockNumber == 11440683 || blockNumber == 11897655 || blockNumber == 11898288 || blockNumber == 12291199 { + return false + } + return true } - return true + return false } diff --git a/core/state/access_list_test.go b/core/state/access_list_test.go new file mode 100644 index 00000000000..119990e723d --- /dev/null +++ b/core/state/access_list_test.go @@ -0,0 +1,173 @@ +package state + +import ( + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/common" + "testing" +) + +func verifyAddrs(t *testing.T, s *IntraBlockState, astrings ...string) { + t.Helper() + // convert to common.Address form + var addresses []common.Address + var addressMap = make(map[common.Address]struct{}) + for _, astring := range astrings { + address := common.HexToAddress(astring) + addresses = append(addresses, address) + addressMap[address] = struct{}{} + } + // Check that the given addresses are in the access list + for _, address := range addresses { + if !s.AddressInAccessList(address) { + t.Fatalf("expected %x to be in access list", address) + } + } + // Check that only the expected addresses are present in the acesslist + for address := range s.accessList.addresses { + if _, exist := addressMap[address]; !exist { + t.Fatalf("extra address %x in access list", address) + } + } +} + +func verifySlots(t *testing.T, s *IntraBlockState, addrString string, slotStrings ...string) { + if !s.AddressInAccessList(common.HexToAddress(addrString)) { + t.Fatalf("scope missing address/slots %v", addrString) + } + var address = common.HexToAddress(addrString) + // convert to common.Hash form + var slots []common.Hash + var slotMap = make(map[common.Hash]struct{}) + for _, slotString := range slotStrings { + s := common.HexToHash(slotString) + slots = append(slots, s) + slotMap[s] = struct{}{} + } + // Check that the expected items are in the access list + for i, slot := range slots { + if _, slotPresent := s.SlotInAccessList(address, slot); !slotPresent { + t.Fatalf("input %d: scope missing slot %v (address %v)", i, slot, addrString) + } + } + // Check that no extra elements are in the access list + index := s.accessList.addresses[address] + if index >= 0 { + stateSlots := s.accessList.slots[index] + for s := range stateSlots { + if _, slotPresent := slotMap[s]; !slotPresent { + t.Fatalf("scope has extra slot %v (address %v)", s, addrString) + } + } + } +} + +func TestAccessList(t *testing.T) { + // Some helpers + addr := common.HexToAddress + slot := common.HexToHash + + _, tx := memdb.NewTestTx(t) + state := New(NewPlainState(tx, 1)) + state.accessList = newAccessList() + + state.AddAddressToAccessList(addr("aa")) // 1 + state.AddSlotToAccessList(addr("bb"), slot("01")) // 2,3 + state.AddSlotToAccessList(addr("bb"), slot("02")) // 4 + verifyAddrs(t, state, "aa", "bb") + verifySlots(t, state, "bb", "01", "02") + + verifyAddrs(t, state, "aa", "bb") + verifySlots(t, state, "bb", "01", "02") + if got, exp := len(state.accessList.addresses), 2; got != exp { + t.Fatalf("expected empty, got %d", got) + } + if got, exp := len(state.accessList.slots), 1; got != exp { + t.Fatalf("expected empty, got %d", got) + } + + if exp, got := 4, state.journal.length(); exp != got { + t.Fatalf("journal length mismatch: have %d, want %d", got, exp) + } + + // same again, should cause no journal entries + state.AddSlotToAccessList(addr("bb"), slot("01")) + state.AddSlotToAccessList(addr("bb"), slot("02")) + state.AddAddressToAccessList(addr("aa")) + if exp, got := 4, state.journal.length(); exp != got { + t.Fatalf("journal length mismatch: have %d, want %d", got, exp) + } + // some new ones + state.AddSlotToAccessList(addr("bb"), slot("03")) // 5 + state.AddSlotToAccessList(addr("aa"), slot("01")) // 6 + state.AddSlotToAccessList(addr("cc"), slot("01")) // 7,8 + state.AddAddressToAccessList(addr("cc")) + if exp, got := 8, state.journal.length(); exp != got { + t.Fatalf("journal length mismatch: have %d, want %d", got, exp) + } + + verifyAddrs(t, state, "aa", "bb", "cc") + verifySlots(t, state, "aa", "01") + verifySlots(t, state, "bb", "01", "02", "03") + verifySlots(t, state, "cc", "01") + + // now start rolling back changes + state.journal.revert(state, 7) + if _, ok := state.SlotInAccessList(addr("cc"), slot("01")); ok { + t.Fatalf("slot present, expected missing") + } + verifyAddrs(t, state, "aa", "bb", "cc") + verifySlots(t, state, "aa", "01") + verifySlots(t, state, "bb", "01", "02", "03") + + state.journal.revert(state, 6) + if state.AddressInAccessList(addr("cc")) { + t.Fatalf("addr present, expected missing") + } + verifyAddrs(t, state, "aa", "bb") + verifySlots(t, state, "aa", "01") + verifySlots(t, state, "bb", "01", "02", "03") + + state.journal.revert(state, 5) + if _, ok := state.SlotInAccessList(addr("aa"), slot("01")); ok { + t.Fatalf("slot present, expected missing") + } + verifyAddrs(t, state, "aa", "bb") + verifySlots(t, state, "bb", "01", "02", "03") + + state.journal.revert(state, 4) + if _, ok := state.SlotInAccessList(addr("bb"), slot("03")); ok { + t.Fatalf("slot present, expected missing") + } + verifyAddrs(t, state, "aa", "bb") + verifySlots(t, state, "bb", "01", "02") + + state.journal.revert(state, 3) + if _, ok := state.SlotInAccessList(addr("bb"), slot("02")); ok { + t.Fatalf("slot present, expected missing") + } + verifyAddrs(t, state, "aa", "bb") + verifySlots(t, state, "bb", "01") + + state.journal.revert(state, 2) + if _, ok := state.SlotInAccessList(addr("bb"), slot("01")); ok { + t.Fatalf("slot present, expected missing") + } + verifyAddrs(t, state, "aa", "bb") + + state.journal.revert(state, 1) + if state.AddressInAccessList(addr("bb")) { + t.Fatalf("addr present, expected missing") + } + verifyAddrs(t, state, "aa") + + state.journal.revert(state, 0) + if state.AddressInAccessList(addr("aa")) { + t.Fatalf("addr present, expected missing") + } + if got, exp := len(state.accessList.addresses), 0; got != exp { + t.Fatalf("expected empty, got %d", got) + } + if got, exp := len(state.accessList.slots), 0; got != exp { + t.Fatalf("expected empty, got %d", got) + } +} diff --git a/core/state/cached_reader2.go b/core/state/cached_reader2.go new file mode 100644 index 00000000000..bb438a618cd --- /dev/null +++ b/core/state/cached_reader2.go @@ -0,0 +1,79 @@ +package state + +import ( + "bytes" + "encoding/binary" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/core/types/accounts" +) + +// CachedReader2 is a wrapper for an instance of type StateReader +// This wrapper only makes calls to the underlying reader if the item is not in the cache +type CachedReader2 struct { + cache kvcache.CacheView + db kv.Tx +} + +// NewCachedReader2 wraps a given state reader into the cached reader +func NewCachedReader2(cache kvcache.CacheView, tx kv.Tx) *CachedReader2 { + return &CachedReader2{cache: cache, db: tx} +} + +// ReadAccountData is called when an account needs to be fetched from the state +func (r *CachedReader2) ReadAccountData(address common.Address) (*accounts.Account, error) { + enc, err := r.cache.Get(address[:]) + if err != nil { + return nil, err + } + if len(enc) == 0 { + return nil, nil + } + var a accounts.Account + if err = a.DecodeForStorage(enc); err != nil { + return nil, err + } + return &a, nil +} + +func (r *CachedReader2) ReadAccountStorage(address common.Address, incarnation uint64, key *common.Hash) ([]byte, error) { + compositeKey := dbutils.PlainGenerateCompositeStorageKey(address.Bytes(), incarnation, key.Bytes()) + enc, err := r.cache.Get(compositeKey) + if err != nil { + return nil, err + } + if len(enc) == 0 { + return nil, nil + } + return enc, nil +} + +func (r *CachedReader2) ReadAccountCode(address common.Address, incarnation uint64, codeHash common.Hash) ([]byte, error) { + if bytes.Equal(codeHash.Bytes(), emptyCodeHash) { + return nil, nil + } + code, err := r.cache.GetCode(codeHash.Bytes()) + if len(code) == 0 { + return nil, nil + } + return code, err +} + +func (r *CachedReader2) ReadAccountCodeSize(address common.Address, incarnation uint64, codeHash common.Hash) (int, error) { + code, err := r.ReadAccountCode(address, incarnation, codeHash) + return len(code), err +} + +func (r *CachedReader2) ReadAccountIncarnation(address common.Address) (uint64, error) { + b, err := r.db.GetOne(kv.IncarnationMap, address.Bytes()) + if err != nil { + return 0, err + } + if len(b) == 0 { + return 0, nil + } + return binary.BigEndian.Uint64(b), nil +} diff --git a/core/state/change_set_writer.go b/core/state/change_set_writer.go index 85f6ca3132c..df9c496169d 100644 --- a/core/state/change_set_writer.go +++ b/core/state/change_set_writer.go @@ -84,6 +84,7 @@ func accountsEqual(a1, a2 *accounts.Account) bool { } func (w *ChangeSetWriter) UpdateAccountData(address common.Address, original, account *accounts.Account) error { + //fmt.Printf("balance,%x,%d\n", address, &account.Balance) if !accountsEqual(original, account) || w.storageChanged[address] { w.accountChanges[address] = originalAccountData(original, true /*omitHashes*/) } @@ -91,15 +92,21 @@ func (w *ChangeSetWriter) UpdateAccountData(address common.Address, original, ac } func (w *ChangeSetWriter) UpdateAccountCode(address common.Address, incarnation uint64, codeHash common.Hash, code []byte) error { + //fmt.Printf("code,%x,%x\n", address, code) return nil } func (w *ChangeSetWriter) DeleteAccount(address common.Address, original *accounts.Account) error { + //fmt.Printf("delete,%x\n", address) + if original == nil || !original.Initialised { + return nil + } w.accountChanges[address] = originalAccountData(original, false) return nil } func (w *ChangeSetWriter) WriteAccountStorage(address common.Address, incarnation uint64, key *common.Hash, original, value *uint256.Int) error { + //fmt.Printf("storage,%x,%x,%x\n", address, *key, value.Bytes()) if *original == *value { return nil } diff --git a/core/state/database_test.go b/core/state/database_test.go index 905461901b2..b29b3a966a0 100644 --- a/core/state/database_test.go +++ b/core/state/database_test.go @@ -54,16 +54,15 @@ func TestCreate2Revive(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ - address: {Balance: funds}, + address: core.GenesisAccount{Balance: funds}, }, } signer = types.LatestSignerForChainID(nil) @@ -247,16 +246,15 @@ func TestCreate2Polymorth(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ - address: {Balance: funds}, + address: core.GenesisAccount{Balance: funds}, }, } signer = types.LatestSignerForChainID(nil) @@ -494,16 +492,15 @@ func TestReorgOverSelfDestruct(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ - address: {Balance: funds}, + address: core.GenesisAccount{Balance: funds}, }, } ) @@ -644,13 +641,12 @@ func TestReorgOverStateChange(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ address: {Balance: funds}, @@ -796,13 +792,12 @@ func TestCreateOnExistingStorage(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ address: {Balance: funds}, @@ -895,29 +890,29 @@ func TestReproduceCrash(t *testing.T) { value2 := uint256.NewInt(0x58c00a51) _, tx := memdb.NewTestTx(t) - tsw := state.NewPlainStateWriter(tx, nil, 0) - intraBlockState := state.New(state.NewPlainState(tx, 0)) + tsw := state.NewPlainStateWriter(tx, nil, 1) + intraBlockState := state.New(state.NewPlainState(tx, 1)) // Start the 1st transaction intraBlockState.CreateAccount(contract, true) - if err := intraBlockState.FinalizeTx(params.Rules{}, tsw); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, tsw); err != nil { t.Errorf("error finalising 1st tx: %v", err) } // Start the 2nd transaction intraBlockState.SetState(contract, &storageKey1, *value1) - if err := intraBlockState.FinalizeTx(params.Rules{}, tsw); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, tsw); err != nil { t.Errorf("error finalising 1st tx: %v", err) } // Start the 3rd transaction intraBlockState.AddBalance(contract, uint256.NewInt(1000000000)) intraBlockState.SetState(contract, &storageKey2, *value2) - if err := intraBlockState.FinalizeTx(params.Rules{}, tsw); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, tsw); err != nil { t.Errorf("error finalising 1st tx: %v", err) } // Start the 4th transaction - clearing both storage cells intraBlockState.SubBalance(contract, uint256.NewInt(1000000000)) intraBlockState.SetState(contract, &storageKey1, *value0) intraBlockState.SetState(contract, &storageKey2, *value0) - if err := intraBlockState.FinalizeTx(params.Rules{}, tsw); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, tsw); err != nil { t.Errorf("error finalising 1st tx: %v", err) } } @@ -929,15 +924,14 @@ func TestEip2200Gas(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - PetersburgBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), - IstanbulBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + PetersburgBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), + IstanbulBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ address: {Balance: funds}, @@ -1026,14 +1020,13 @@ func TestWrongIncarnation(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ - address: {Balance: funds}, + address: core.GenesisAccount{Balance: funds}, }, } ) @@ -1140,14 +1133,13 @@ func TestWrongIncarnation2(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), }, Alloc: core.GenesisAlloc{ - address: {Balance: funds}, + address: core.GenesisAccount{Balance: funds}, }, } signer = types.LatestSignerForChainID(nil) @@ -1295,8 +1287,8 @@ func TestChangeAccountCodeBetweenBlocks(t *testing.T) { intraBlockState.SetCode(contract, oldCode) intraBlockState.AddBalance(contract, uint256.NewInt(1000000000)) - if err := intraBlockState.FinalizeTx(params.Rules{}, tsw); err != nil { - t.Errorf("error finalising 1st tx: %w", err) + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, tsw); err != nil { + t.Errorf("error finalising 1st tx: %v", err) } _, err := trie.CalcRoot("test", tx) require.NoError(t, err) @@ -1308,7 +1300,7 @@ func TestChangeAccountCodeBetweenBlocks(t *testing.T) { newCode := []byte{0x04, 0x04, 0x04, 0x04} intraBlockState.SetCode(contract, newCode) - if err := intraBlockState.FinalizeTx(params.Rules{}, tsw); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, tsw); err != nil { t.Errorf("error finalising 1st tx: %v", err) } @@ -1333,10 +1325,10 @@ func TestCacheCodeSizeSeparately(t *testing.T) { intraBlockState.SetCode(contract, code) intraBlockState.AddBalance(contract, uint256.NewInt(1000000000)) - if err := intraBlockState.FinalizeTx(params.Rules{}, w); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, w); err != nil { t.Errorf("error finalising 1st tx: %v", err) } - if err := intraBlockState.CommitBlock(params.Rules{}, w); err != nil { + if err := intraBlockState.CommitBlock(¶ms.Rules{}, w); err != nil { t.Errorf("error committing block: %v", err) } @@ -1366,10 +1358,10 @@ func TestCacheCodeSizeInTrie(t *testing.T) { intraBlockState.SetCode(contract, code) intraBlockState.AddBalance(contract, uint256.NewInt(1000000000)) - if err := intraBlockState.FinalizeTx(params.Rules{}, w); err != nil { + if err := intraBlockState.FinalizeTx(¶ms.Rules{}, w); err != nil { t.Errorf("error finalising 1st tx: %v", err) } - if err := intraBlockState.CommitBlock(params.Rules{}, w); err != nil { + if err := intraBlockState.CommitBlock(¶ms.Rules{}, w); err != nil { t.Errorf("error committing block: %v", err) } @@ -1402,7 +1394,7 @@ func TestRecreateAndRewind(t *testing.T) { gspec = &core.Genesis{ Config: params.AllEthashProtocolChanges, Alloc: core.GenesisAlloc{ - address: {Balance: funds}, + address: core.GenesisAccount{Balance: funds}, }, } ) @@ -1593,3 +1585,69 @@ func TestRecreateAndRewind(t *testing.T) { require.NoError(t, err) } +func TestTxLookupUnwind(t *testing.T) { + var ( + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address = crypto.PubkeyToAddress(key.PublicKey) + funds = big.NewInt(1000000000) + gspec = &core.Genesis{ + Config: ¶ms.ChainConfig{ + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), + }, + Alloc: core.GenesisAlloc{ + address: core.GenesisAccount{Balance: funds}, + }, + } + signer = types.LatestSignerForChainID(nil) + ) + + m := stages.MockWithGenesis(t, gspec, key) + chain1, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 2, func(i int, block *core.BlockGen) { + var tx types.Transaction + var e error + switch i { + case 1: + tx, e = types.SignTx(types.NewTransaction(block.TxNonce(address), address, uint256.NewInt(0), 1000000, new(uint256.Int), nil), *signer, key) + if e != nil { + t.Fatal(e) + } + block.AddTx(tx) + } + }, false) + if err != nil { + t.Fatal(err) + } + chain2, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 3, func(i int, block *core.BlockGen) { + }, false) + if err != nil { + t.Fatal(err) + } + if err = m.InsertChain(chain1); err != nil { + t.Fatal(err) + } + if err = m.InsertChain(chain2); err != nil { + t.Fatal(err) + } + var count uint64 + if err = m.DB.View(context.Background(), func(tx kv.Tx) error { + c, e := tx.Cursor(kv.TxLookup) + if e != nil { + return e + } + defer c.Close() + if count, e = c.Count(); e != nil { + return e + } + return nil + }); err != nil { + t.Fatal(err) + } + if count != 0 { + t.Errorf("txlookup record expected to be deleted, got %d", count) + } +} diff --git a/core/state/dump.go b/core/state/dump.go index c0427f56564..e46f25593be 100644 --- a/core/state/dump.go +++ b/core/state/dump.go @@ -155,7 +155,7 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo return true, nil } if e := acc.DecodeForStorage(v); e != nil { - return false, fmt.Errorf("decoding %x for %x: %v", v, k, e) + return false, fmt.Errorf("decoding %x for %x: %w", v, k, e) } account := DumpAccount{ Balance: acc.Balance.ToBig().String(), @@ -181,7 +181,7 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo if incarnation > 0 { codeHash, err := d.db.GetOne(kv.PlainContractCode, storagePrefix) if err != nil { - return nil, fmt.Errorf("getting code hash for %x: %v", addr, err) + return nil, fmt.Errorf("getting code hash for %x: %w", addr, err) } if codeHash != nil { account.CodeHash = codeHash @@ -211,7 +211,7 @@ func (d *Dumper) DumpToCollector(c DumpCollector, excludeCode, excludeStorage bo t.Update(h.Bytes(), common.CopyBytes(vs)) return true, nil }); err != nil { - return nil, fmt.Errorf("walking over storage for %x: %v", addr, err) + return nil, fmt.Errorf("walking over storage for %x: %w", addr, err) } account.Root = t.Hash().Bytes() } diff --git a/core/state/history.go b/core/state/history.go index 629a52cc675..9e91610172c 100644 --- a/core/state/history.go +++ b/core/state/history.go @@ -16,8 +16,8 @@ import ( "github.com/ledgerwatch/erigon/ethdb/bitmapdb" ) -func GetAsOf(tx kv.Tx, storage bool, key []byte, timestamp uint64) ([]byte, error) { - v, err := FindByHistory(tx, storage, key, timestamp) +func GetAsOf(tx kv.Tx, indexC kv.Cursor, changesC kv.CursorDupSort, storage bool, key []byte, timestamp uint64) ([]byte, error) { + v, err := FindByHistory(tx, indexC, changesC, storage, key, timestamp) if err == nil { return v, nil } @@ -27,7 +27,7 @@ func GetAsOf(tx kv.Tx, storage bool, key []byte, timestamp uint64) ([]byte, erro return tx.GetOne(kv.PlainState, key) } -func FindByHistory(tx kv.Tx, storage bool, key []byte, timestamp uint64) ([]byte, error) { +func FindByHistory(tx kv.Tx, indexC kv.Cursor, changesC kv.CursorDupSort, storage bool, key []byte, timestamp uint64) ([]byte, error) { var csBucket string if storage { csBucket = kv.StorageChangeSet @@ -35,12 +35,7 @@ func FindByHistory(tx kv.Tx, storage bool, key []byte, timestamp uint64) ([]byte csBucket = kv.AccountChangeSet } - ch, err := tx.Cursor(changeset.Mapper[csBucket].IndexBucket) - if err != nil { - return nil, err - } - defer ch.Close() - k, v, seekErr := ch.Seek(changeset.Mapper[csBucket].IndexChunkKey(key, timestamp)) + k, v, seekErr := indexC.Seek(changeset.Mapper[csBucket].IndexChunkKey(key, timestamp)) if seekErr != nil { return nil, seekErr } @@ -66,17 +61,9 @@ func FindByHistory(tx kv.Tx, storage bool, key []byte, timestamp uint64) ([]byte changeSetBlock := found var data []byte + var err error if ok { - c, err := tx.CursorDupSort(csBucket) - if err != nil { - return nil, err - } - defer c.Close() - if storage { - data, err = changeset.Mapper[csBucket].Find(c, changeSetBlock, key) - } else { - data, err = changeset.Mapper[csBucket].Find(c, changeSetBlock, key) - } + data, err = changeset.Mapper[csBucket].Find(changesC, changeSetBlock, key) if err != nil { if !errors.Is(err, changeset.ErrNotFound) { return nil, fmt.Errorf("finding %x in the changeset %d: %w", key, changeSetBlock, err) @@ -101,7 +88,7 @@ func FindByHistory(tx kv.Tx, storage bool, key []byte, timestamp uint64) ([]byte return nil, err } if len(codeHash) > 0 { - acc.CodeHash = common.BytesToHash(codeHash) + acc.CodeHash.SetBytes(codeHash) } data = make([]byte, acc.EncodingLengthForStorage()) acc.EncodeForStorage(data) diff --git a/core/state/history_test.go b/core/state/history_test.go index b07ca3eff6f..ef82c84cc68 100644 --- a/core/state/history_test.go +++ b/core/state/history_test.go @@ -45,9 +45,9 @@ func TestMutationDeleteTimestamp(t *testing.T) { } i := 0 - err := changeset.Walk(tx, kv.AccountChangeSet, nil, 0, func(blockN uint64, k, v []byte) (bool, error) { + err := changeset.ForEach(tx, kv.AccountChangeSet, nil, func(blockN uint64, k, v []byte) error { i++ - return true, nil + return nil }) if err != nil { t.Fatal(err) @@ -67,9 +67,9 @@ func TestMutationDeleteTimestamp(t *testing.T) { } count := 0 - err = changeset.Walk(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(1), 8*8, func(blockN uint64, k, v []byte) (bool, error) { + err = changeset.ForPrefix(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(1), func(blockN uint64, k, v []byte) error { count++ - return true, nil + return nil }) if err != nil { t.Fatal(err) @@ -132,7 +132,9 @@ func TestMutationCommit(t *testing.T) { } for k, v := range accHistoryStateStorage[i] { - res, err := GetAsOf(tx, true /* storage */, dbutils.PlainGenerateCompositeStorageKey(addr.Bytes(), acc.Incarnation, k.Bytes()), 1) + c1, _ := tx.Cursor(kv.StorageHistory) + c2, _ := tx.CursorDupSort(kv.StorageChangeSet) + res, err := GetAsOf(tx, c1, c2, true /* storage */, dbutils.PlainGenerateCompositeStorageKey(addr.Bytes(), acc.Incarnation, k.Bytes()), 1) if err != nil { t.Fatal(err) } @@ -145,11 +147,11 @@ func TestMutationCommit(t *testing.T) { } changeSetInDB := changeset.NewAccountChangeSet() - err := changeset.Walk(tx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(2), 8*8, func(_ uint64, k, v []byte) (bool, error) { + err := changeset.ForPrefix(tx, kv.AccountChangeSet, dbutils.EncodeBlockNumber(2), func(_ uint64, k, v []byte) error { if err := changeSetInDB.Add(k, v); err != nil { - return false, err + return err } - return true, nil + return nil }) if err != nil { t.Fatal(err) @@ -177,11 +179,11 @@ func TestMutationCommit(t *testing.T) { } cs := changeset.NewStorageChangeSet() - err = changeset.Walk(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(2), 8*8, func(_ uint64, k, v []byte) (bool, error) { + err = changeset.ForPrefix(tx, kv.StorageChangeSet, dbutils.EncodeBlockNumber(2), func(_ uint64, k, v []byte) error { if err2 := cs.Add(k, v); err2 != nil { - return false, err2 + return err2 } - return true, nil + return nil }) if err != nil { t.Fatal(err) diff --git a/core/state/intra_block_state.go b/core/state/intra_block_state.go index 5c3939fe8ba..43c98f608a2 100644 --- a/core/state/intra_block_state.go +++ b/core/state/intra_block_state.go @@ -45,6 +45,14 @@ type StateTracer interface { // SystemAddress - sender address for internal state updates. var SystemAddress = common.HexToAddress("0xfffffffffffffffffffffffffffffffffffffffe") +// BalanceIncrease represents the increase of balance of an account that did not require +// reading the account first +type BalanceIncrease struct { + increase uint256.Int + transferred bool // Set to true when the corresponding stateObject is created and balance increase is transferred to the stateObject + count int // Number of increases - this needs tracking for proper reversion +} + // IntraBlockState is responsible for caching and managing state changes // that occur during block's execution. // NOT THREAD SAFE! @@ -80,76 +88,23 @@ type IntraBlockState struct { tracer StateTracer trace bool accessList *accessList + balanceInc map[common.Address]*BalanceIncrease // Map of balance increases (without first reading the account) } // Create a new state from a given trie func New(stateReader StateReader) *IntraBlockState { return &IntraBlockState{ stateReader: stateReader, - stateObjects: make(map[common.Address]*stateObject), - stateObjectsDirty: make(map[common.Address]struct{}), - nilAccounts: make(map[common.Address]struct{}), - logs: make(map[common.Hash][]*types.Log), + stateObjects: map[common.Address]*stateObject{}, + stateObjectsDirty: map[common.Address]struct{}{}, + nilAccounts: map[common.Address]struct{}{}, + logs: map[common.Hash][]*types.Log{}, journal: newJournal(), accessList: newAccessList(), + balanceInc: map[common.Address]*BalanceIncrease{}, } } -// Copy creates a deep, independent copy of the state. -// Snapshots of the copied state cannot be applied to the copy. -func (sdb *IntraBlockState) Copy() *IntraBlockState { - // Copy all the basic fields, initialize the memory ones - ibs := &IntraBlockState{ - stateReader: sdb.stateReader, - stateObjects: make(map[common.Address]*stateObject, len(sdb.journal.dirties)), - stateObjectsDirty: make(map[common.Address]struct{}, len(sdb.journal.dirties)), - nilAccounts: make(map[common.Address]struct{}), - refund: sdb.refund, - logs: make(map[common.Hash][]*types.Log, len(sdb.logs)), - logSize: sdb.logSize, - journal: newJournal(), - } - // Copy the dirty states, logs, and preimages - for addr := range sdb.journal.dirties { - // As documented [here](https://github.com/ethereum/go-ethereum/pull/16485#issuecomment-380438527), - // and in the Finalise-method, there is a case where an object is in the journal but not - // in the stateObjects: OOG after touch on ripeMD prior to Byzantium. Thus, we need to check for - // nil - if object, exist := sdb.stateObjects[addr]; exist { - // Even though the original object is dirty, we are not copying the journal, - // so we need to make sure that anyside effect the journal would have caused - // during a commit (or similar op) is already applied to the copy. - ibs.stateObjects[addr] = object.deepCopy(ibs) - ibs.stateObjectsDirty[addr] = struct{}{} // Mark the copy dirty to force internal (code/state) commits - } - } - // Above, we don't copy the actual journal. This means that if the copy is copied, the - // loop above will be a no-op, since the copy's journal is empty. - // Thus, here we iterate over stateObjects, to enable copies of copies - for addr := range sdb.stateObjectsDirty { - if _, exist := ibs.stateObjects[addr]; !exist { - ibs.stateObjects[addr] = sdb.stateObjects[addr].deepCopy(ibs) - } - ibs.stateObjectsDirty[addr] = struct{}{} - } - for hash, logs := range sdb.logs { - cpy := make([]*types.Log, len(logs)) - for i, l := range logs { - cpy[i] = new(types.Log) - *cpy[i] = *l - } - ibs.logs[hash] = cpy - } - // comment from https://github.com/ethereum/go-ethereum/commit/6487c002f6b47e08cb9814f16712c6789b313a97#diff-c3757dc9e9d868f63bc84a0cc67159c1d5c22cc5d8c9468757098f0492e0658cR705 - // Do we need to copy the access list? In practice: No. At the start of a - // transaction, the access list is empty. In practice, we only ever copy state - // _between_ transactions/blocks, never in the middle of a transaction. - // However, it doesn't cost us much to copy an empty list, so we do it anyway - // to not blow up if we ever decide copy it in the middle of a transaction - ibs.accessList = sdb.accessList.Copy() - return ibs -} - func (sdb *IntraBlockState) SetTracer(tracer StateTracer) { sdb.tracer = tracer } @@ -181,16 +136,16 @@ func (sdb *IntraBlockState) Reset() { sdb.logSize = 0 sdb.clearJournalAndRefund() sdb.accessList = newAccessList() + sdb.balanceInc = make(map[common.Address]*BalanceIncrease) } -func (sdb *IntraBlockState) AddLog(log *types.Log) { +func (sdb *IntraBlockState) AddLog(log2 *types.Log) { sdb.journal.append(addLogChange{txhash: sdb.thash}) - - log.TxHash = sdb.thash - log.BlockHash = sdb.bhash - log.TxIndex = uint(sdb.txIndex) - log.Index = sdb.logSize - sdb.logs[sdb.thash] = append(sdb.logs[sdb.thash], log) + log2.TxHash = sdb.thash + log2.BlockHash = sdb.bhash + log2.TxIndex = uint(sdb.txIndex) + log2.Index = sdb.logSize + sdb.logs[sdb.thash] = append(sdb.logs[sdb.thash], log2) sdb.logSize++ } @@ -395,11 +350,28 @@ func (sdb *IntraBlockState) AddBalance(addr common.Address, amount *uint256.Int) fmt.Println("CaptureAccountWrite err", err) } } + // If this account has not been read, add to the balance increment map + _, needAccount := sdb.stateObjects[addr] + if !needAccount && addr == ripemd && amount.IsZero() { + needAccount = true + } + if !needAccount { + sdb.journal.append(balanceIncrease{ + account: &addr, + increase: *amount, + }) + bi, ok := sdb.balanceInc[addr] + if !ok { + bi = &BalanceIncrease{} + sdb.balanceInc[addr] = bi + } + bi.increase.Add(&bi.increase, amount) + bi.count++ + return + } stateObject := sdb.GetOrNewStateObject(addr) - if stateObject != nil { - stateObject.AddBalance(amount) - } + stateObject.AddBalance(amount) } // SubBalance subtracts amount from the account associated with addr. @@ -479,7 +451,6 @@ func (sdb *IntraBlockState) SetState(addr common.Address, key *common.Hash, valu // SetStorage replaces the entire storage for the specified account with given // storage. This function should only be used for debugging. func (sdb *IntraBlockState) SetStorage(addr common.Address, storage Storage) { - fmt.Printf("SetStorage: %x, %s\n ", addr, storage.String()) stateObject := sdb.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetStorage(storage) @@ -534,7 +505,6 @@ func (sdb *IntraBlockState) Suicide(addr common.Address) bool { return true } -// Retrieve a state object given my the address. Returns nil if not found. func (sdb *IntraBlockState) getStateObject(addr common.Address) (stateObject *stateObject) { // Prefer 'live' objects. if obj := sdb.stateObjects[addr]; obj != nil { @@ -543,6 +513,9 @@ func (sdb *IntraBlockState) getStateObject(addr common.Address) (stateObject *st // Load the object from the database. if _, ok := sdb.nilAccounts[addr]; ok { + if bi, ok := sdb.balanceInc[addr]; ok && !bi.transferred { + return sdb.createObject(addr, nil) + } return nil } account, err := sdb.stateReader.ReadAccountData(addr) @@ -552,24 +525,32 @@ func (sdb *IntraBlockState) getStateObject(addr common.Address) (stateObject *st } if account == nil { sdb.nilAccounts[addr] = struct{}{} + if bi, ok := sdb.balanceInc[addr]; ok && !bi.transferred { + return sdb.createObject(addr, nil) + } return nil } // Insert into the live set. obj := newObject(sdb, addr, account, account) - sdb.setStateObject(obj) + sdb.setStateObject(addr, obj) return obj } -func (sdb *IntraBlockState) setStateObject(object *stateObject) { - sdb.stateObjects[object.Address()] = object +func (sdb *IntraBlockState) setStateObject(addr common.Address, object *stateObject) { + if bi, ok := sdb.balanceInc[addr]; ok && !bi.transferred { + object.data.Balance.Add(&object.data.Balance, &bi.increase) + bi.transferred = true + sdb.journal.append(balanceIncreaseTransfer{bi: bi}) + } + sdb.stateObjects[addr] = object } // Retrieve a state object or create a new state object if nil. func (sdb *IntraBlockState) GetOrNewStateObject(addr common.Address) *stateObject { stateObject := sdb.getStateObject(addr) if stateObject == nil || stateObject.deleted { - stateObject = sdb.createObject(addr, nil /* previous */) + stateObject = sdb.createObject(addr, stateObject /* previous */) } return stateObject } @@ -578,10 +559,6 @@ func (sdb *IntraBlockState) GetOrNewStateObject(addr common.Address) *stateObjec // the given address, it is overwritten. func (sdb *IntraBlockState) createObject(addr common.Address, previous *stateObject) (newobj *stateObject) { account := new(accounts.Account) - if previous != nil { - account.Balance.Set(&previous.data.Balance) - account.Initialised = true - } var original *accounts.Account if previous == nil { original = &accounts.Account{} @@ -590,16 +567,13 @@ func (sdb *IntraBlockState) createObject(addr common.Address, previous *stateObj } account.Root.SetBytes(trie.EmptyRoot[:]) // old storage should be ignored newobj = newObject(sdb, addr, account, original) - if previous != nil && previous.suicided { - newobj.suicided = true - } newobj.setNonce(0) // sets the object to dirty if previous == nil { sdb.journal.append(createObjectChange{account: &addr}) } else { - sdb.journal.append(resetObjectChange{prev: previous}) + sdb.journal.append(resetObjectChange{account: &addr, prev: previous}) } - sdb.setStateObject(newobj) + sdb.setStateObject(addr, newobj) return newobj } @@ -643,6 +617,10 @@ func (sdb *IntraBlockState) CreateAccount(addr common.Address, contractCreation } newObj := sdb.createObject(addr, previous) + if previous != nil { + newObj.data.Balance.Set(&previous.data.Balance) + newObj.data.Initialised = true + } if contractCreation { newObj.created = true @@ -681,8 +659,8 @@ func (sdb *IntraBlockState) GetRefund() uint64 { return sdb.refund } -func updateAccount(EIP158Enabled bool, stateWriter StateWriter, addr common.Address, stateObject *stateObject, isDirty bool) error { - emptyRemoval := EIP158Enabled && stateObject.empty() +func updateAccount(EIP161Enabled bool, stateWriter StateWriter, addr common.Address, stateObject *stateObject, isDirty bool) error { + emptyRemoval := EIP161Enabled && stateObject.empty() if stateObject.suicided || (isDirty && emptyRemoval) { if err := stateWriter.DeleteAccount(addr, &stateObject.original); err != nil { return err @@ -712,8 +690,8 @@ func updateAccount(EIP158Enabled bool, stateWriter StateWriter, addr common.Addr return nil } -func printAccount(EIP158Enabled bool, addr common.Address, stateObject *stateObject, isDirty bool) { - emptyRemoval := EIP158Enabled && stateObject.empty() +func printAccount(EIP161Enabled bool, addr common.Address, stateObject *stateObject, isDirty bool) { + emptyRemoval := EIP161Enabled && stateObject.empty() if stateObject.suicided || (isDirty && emptyRemoval) { fmt.Printf("delete: %x\n", addr) } @@ -736,9 +714,14 @@ func printAccount(EIP158Enabled bool, addr common.Address, stateObject *stateObj } // FinalizeTx should be called after every transaction. -func (sdb *IntraBlockState) FinalizeTx(chainRules params.Rules, stateWriter StateWriter) error { +func (sdb *IntraBlockState) FinalizeTx(chainRules *params.Rules, stateWriter StateWriter) error { + for addr, bi := range sdb.balanceInc { + if !bi.transferred { + sdb.getStateObject(addr) + } + } for addr := range sdb.journal.dirties { - stateObject, exist := sdb.stateObjects[addr] + so, exist := sdb.stateObjects[addr] if !exist { // ripeMD is 'touched' at block 1714175, in tx 0x1237f737031e40bcde4a8b7e717b2d15e3ecadfe49bb1bbc71ee9deb09c6fcf2 // That tx goes out of gas, and although the notion of 'touched' does not exist there, the @@ -749,7 +732,7 @@ func (sdb *IntraBlockState) FinalizeTx(chainRules params.Rules, stateWriter Stat continue } - if err := updateAccount(chainRules.IsEIP158, stateWriter, addr, stateObject, true); err != nil { + if err := updateAccount(chainRules.IsSpuriousDragon, stateWriter, addr, so, true); err != nil { return err } @@ -762,13 +745,18 @@ func (sdb *IntraBlockState) FinalizeTx(chainRules params.Rules, stateWriter Stat // CommitBlock finalizes the state by removing the self destructed objects // and clears the journal as well as the refunds. -func (sdb *IntraBlockState) CommitBlock(chainRules params.Rules, stateWriter StateWriter) error { +func (sdb *IntraBlockState) CommitBlock(chainRules *params.Rules, stateWriter StateWriter) error { + for addr, bi := range sdb.balanceInc { + if !bi.transferred { + sdb.getStateObject(addr) + } + } for addr := range sdb.journal.dirties { sdb.stateObjectsDirty[addr] = struct{}{} } for addr, stateObject := range sdb.stateObjects { _, isDirty := sdb.stateObjectsDirty[addr] - if err := updateAccount(chainRules.IsEIP158, stateWriter, addr, stateObject, isDirty); err != nil { + if err := updateAccount(chainRules.IsSpuriousDragon, stateWriter, addr, stateObject, isDirty); err != nil { return err } } @@ -782,7 +770,7 @@ func (sdb *IntraBlockState) Print(chainRules params.Rules) { _, isDirty := sdb.stateObjectsDirty[addr] _, isDirty2 := sdb.journal.dirties[addr] - printAccount(chainRules.IsEIP158, addr, stateObject, isDirty || isDirty2) + printAccount(chainRules.IsSpuriousDragon, addr, stateObject, isDirty || isDirty2) } } diff --git a/core/state/intra_block_state_test.go b/core/state/intra_block_state_test.go index 3b6c0b4be75..e06c9a5f976 100644 --- a/core/state/intra_block_state_test.go +++ b/core/state/intra_block_state_test.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package state import ( @@ -31,9 +33,6 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/params" - "gopkg.in/check.v1" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" ) @@ -226,7 +225,7 @@ func (test *snapshotTest) run() bool { } defer tx.Rollback() var ( - ds = NewPlainState(tx, 0) + ds = NewPlainState(tx, 1) state = New(ds) snapshotRevs = make([]int, len(test.snapshots)) sindex = 0 @@ -241,14 +240,14 @@ func (test *snapshotTest) run() bool { // Revert all snapshots in reverse order. Each revert must yield a state // that is equivalent to fresh state with all actions up the snapshot applied. for sindex--; sindex >= 0; sindex-- { - checkds := NewPlainState(tx, 0) + checkds := NewPlainState(tx, 1) checkstate := New(checkds) for _, action := range test.actions[:test.snapshots[sindex]] { action.fn(action, checkstate) } state.RevertToSnapshot(snapshotRevs[sindex]) if err := test.checkEqual(state, checkstate); err != nil { - test.err = fmt.Errorf("state mismatch after revert to snapshot %d\n%v", sindex, err) + test.err = fmt.Errorf("state mismatch after revert to snapshot %d\n%w", sindex, err) return false } } @@ -315,199 +314,3 @@ func (test *snapshotTest) checkEqual(state, checkstate *IntraBlockState) error { } return nil } - -func (s *StateSuite) TestTouchDelete(c *check.C) { - s.state.GetOrNewStateObject(common.Address{}) - - err := s.state.FinalizeTx(params.Rules{}, s.w) - if err != nil { - c.Fatal("error while finalize", err) - } - - err = s.state.CommitBlock(params.Rules{}, s.w) - if err != nil { - c.Fatal("error while commit", err) - } - - s.state.Reset() - - snapshot := s.state.Snapshot() - s.state.AddBalance(common.Address{}, new(uint256.Int)) - - if len(s.state.journal.dirties) != 1 { - c.Fatal("expected one dirty state object") - } - s.state.RevertToSnapshot(snapshot) - if len(s.state.journal.dirties) != 0 { - c.Fatal("expected no dirty state object") - } -} - -func TestAccessList(t *testing.T) { - // Some helpers - addr := common.HexToAddress - slot := common.HexToHash - - _, tx := memdb.NewTestTx(t) - state := New(NewPlainState(tx, 0)) - state.accessList = newAccessList() - - verifyAddrs := func(astrings ...string) { - t.Helper() - // convert to common.Address form - var addresses []common.Address - var addressMap = make(map[common.Address]struct{}) - for _, astring := range astrings { - address := addr(astring) - addresses = append(addresses, address) - addressMap[address] = struct{}{} - } - // Check that the given addresses are in the access list - for _, address := range addresses { - if !state.AddressInAccessList(address) { - t.Fatalf("expected %x to be in access list", address) - } - } - // Check that only the expected addresses are present in the acesslist - for address := range state.accessList.addresses { - if _, exist := addressMap[address]; !exist { - t.Fatalf("extra address %x in access list", address) - } - } - } - verifySlots := func(addrString string, slotStrings ...string) { - if !state.AddressInAccessList(addr(addrString)) { - t.Fatalf("scope missing address/slots %v", addrString) - } - var address = addr(addrString) - // convert to common.Hash form - var slots []common.Hash - var slotMap = make(map[common.Hash]struct{}) - for _, slotString := range slotStrings { - s := slot(slotString) - slots = append(slots, s) - slotMap[s] = struct{}{} - } - // Check that the expected items are in the access list - for i, s := range slots { - if _, slotPresent := state.SlotInAccessList(address, s); !slotPresent { - t.Fatalf("input %d: scope missing slot %v (address %v)", i, s, addrString) - } - } - // Check that no extra elements are in the access list - index := state.accessList.addresses[address] - if index >= 0 { - stateSlots := state.accessList.slots[index] - for s := range stateSlots { - if _, slotPresent := slotMap[s]; !slotPresent { - t.Fatalf("scope has extra slot %v (address %v)", s, addrString) - } - } - } - } - - state.AddAddressToAccessList(addr("aa")) // 1 - state.AddSlotToAccessList(addr("bb"), slot("01")) // 2,3 - state.AddSlotToAccessList(addr("bb"), slot("02")) // 4 - verifyAddrs("aa", "bb") - verifySlots("bb", "01", "02") - - // Make a copy - stateCopy1 := state.Copy() - if exp, got := 4, state.journal.length(); exp != got { - t.Fatalf("journal length mismatch: have %d, want %d", got, exp) - } - - // same again, should cause no journal entries - state.AddSlotToAccessList(addr("bb"), slot("01")) - state.AddSlotToAccessList(addr("bb"), slot("02")) - state.AddAddressToAccessList(addr("aa")) - if exp, got := 4, state.journal.length(); exp != got { - t.Fatalf("journal length mismatch: have %d, want %d", got, exp) - } - // some new ones - state.AddSlotToAccessList(addr("bb"), slot("03")) // 5 - state.AddSlotToAccessList(addr("aa"), slot("01")) // 6 - state.AddSlotToAccessList(addr("cc"), slot("01")) // 7,8 - state.AddAddressToAccessList(addr("cc")) - if exp, got := 8, state.journal.length(); exp != got { - t.Fatalf("journal length mismatch: have %d, want %d", got, exp) - } - - verifyAddrs("aa", "bb", "cc") - verifySlots("aa", "01") - verifySlots("bb", "01", "02", "03") - verifySlots("cc", "01") - - // now start rolling back changes - state.journal.revert(state, 7) - if _, ok := state.SlotInAccessList(addr("cc"), slot("01")); ok { - t.Fatalf("slot present, expected missing") - } - verifyAddrs("aa", "bb", "cc") - verifySlots("aa", "01") - verifySlots("bb", "01", "02", "03") - - state.journal.revert(state, 6) - if state.AddressInAccessList(addr("cc")) { - t.Fatalf("addr present, expected missing") - } - verifyAddrs("aa", "bb") - verifySlots("aa", "01") - verifySlots("bb", "01", "02", "03") - - state.journal.revert(state, 5) - if _, ok := state.SlotInAccessList(addr("aa"), slot("01")); ok { - t.Fatalf("slot present, expected missing") - } - verifyAddrs("aa", "bb") - verifySlots("bb", "01", "02", "03") - - state.journal.revert(state, 4) - if _, ok := state.SlotInAccessList(addr("bb"), slot("03")); ok { - t.Fatalf("slot present, expected missing") - } - verifyAddrs("aa", "bb") - verifySlots("bb", "01", "02") - - state.journal.revert(state, 3) - if _, ok := state.SlotInAccessList(addr("bb"), slot("02")); ok { - t.Fatalf("slot present, expected missing") - } - verifyAddrs("aa", "bb") - verifySlots("bb", "01") - - state.journal.revert(state, 2) - if _, ok := state.SlotInAccessList(addr("bb"), slot("01")); ok { - t.Fatalf("slot present, expected missing") - } - verifyAddrs("aa", "bb") - - state.journal.revert(state, 1) - if state.AddressInAccessList(addr("bb")) { - t.Fatalf("addr present, expected missing") - } - verifyAddrs("aa") - - state.journal.revert(state, 0) - if state.AddressInAccessList(addr("aa")) { - t.Fatalf("addr present, expected missing") - } - if got, exp := len(state.accessList.addresses), 0; got != exp { - t.Fatalf("expected empty, got %d", got) - } - if got, exp := len(state.accessList.slots), 0; got != exp { - t.Fatalf("expected empty, got %d", got) - } - // Check the copy - // Make a copy - state = stateCopy1 - verifyAddrs("aa", "bb") - verifySlots("bb", "01", "02") - if got, exp := len(state.accessList.addresses), 2; got != exp { - t.Fatalf("expected empty, got %d", got) - } - if got, exp := len(state.accessList.slots), 1; got != exp { - t.Fatalf("expected empty, got %d", got) - } -} diff --git a/core/state/journal.go b/core/state/journal.go index a1674af0648..d5183dbbc55 100644 --- a/core/state/journal.go +++ b/core/state/journal.go @@ -102,7 +102,8 @@ type ( account *common.Address } resetObjectChange struct { - prev *stateObject + account *common.Address + prev *stateObject } suicideChange struct { account *common.Address @@ -115,6 +116,13 @@ type ( account *common.Address prev uint256.Int } + balanceIncrease struct { + account *common.Address + increase uint256.Int + } + balanceIncreaseTransfer struct { + bi *BalanceIncrease + } nonceChange struct { account *common.Address prev uint64 @@ -124,6 +132,11 @@ type ( key common.Hash prevalue uint256.Int } + fakeStorageChange struct { + account *common.Address + key common.Hash + prevalue uint256.Int + } codeChange struct { account *common.Address prevcode []byte @@ -160,7 +173,7 @@ func (ch createObjectChange) dirtied() *common.Address { } func (ch resetObjectChange) revert(s *IntraBlockState) { - s.setStateObject(ch.prev) + s.setStateObject(*ch.account, ch.prev) } func (ch resetObjectChange) dirtied() *common.Address { @@ -196,6 +209,27 @@ func (ch balanceChange) dirtied() *common.Address { return ch.account } +func (ch balanceIncrease) revert(s *IntraBlockState) { + if bi, ok := s.balanceInc[*ch.account]; ok { + bi.increase.Sub(&bi.increase, &ch.increase) + bi.count-- + if bi.count == 0 { + delete(s.balanceInc, *ch.account) + } + } +} + +func (ch balanceIncrease) dirtied() *common.Address { + return ch.account +} + +func (ch balanceIncreaseTransfer) dirtied() *common.Address { + return nil +} + +func (ch balanceIncreaseTransfer) revert(s *IntraBlockState) { + ch.bi.transferred = false +} func (ch nonceChange) revert(s *IntraBlockState) { s.getStateObject(*ch.account).setNonce(ch.prev) } @@ -220,6 +254,14 @@ func (ch storageChange) dirtied() *common.Address { return ch.account } +func (ch fakeStorageChange) revert(s *IntraBlockState) { + s.getStateObject(*ch.account).fakeStorage[ch.key] = ch.prevalue +} + +func (ch fakeStorageChange) dirtied() *common.Address { + return ch.account +} + func (ch refundChange) revert(s *IntraBlockState) { s.refund = ch.prev } diff --git a/core/state/plain_readonly.go b/core/state/plain_readonly.go index a3f5f824b5c..08809bb2a60 100644 --- a/core/state/plain_readonly.go +++ b/core/state/plain_readonly.go @@ -19,14 +19,15 @@ package state import ( "bytes" "encoding/binary" + "fmt" + "github.com/google/btree" "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/log/v3" - "github.com/petar/GoLLRB/llrb" ) type storageItem struct { @@ -34,25 +35,39 @@ type storageItem struct { value uint256.Int } -func (a *storageItem) Less(b llrb.Item) bool { +func (a *storageItem) Less(b btree.Item) bool { bi := b.(*storageItem) return bytes.Compare(a.key[:], bi.key[:]) < 0 } +// State at the beginning of blockNr type PlainState struct { - tx kv.Tx - blockNr uint64 - storage map[common.Address]*llrb.LLRB + accHistoryC, storageHistoryC kv.Cursor + accChangesC, storageChangesC kv.CursorDupSort + tx kv.Tx + blockNr uint64 + storage map[common.Address]*btree.BTree + trace bool } func NewPlainState(tx kv.Tx, blockNr uint64) *PlainState { + c1, _ := tx.Cursor(kv.AccountsHistory) + c2, _ := tx.Cursor(kv.StorageHistory) + c3, _ := tx.CursorDupSort(kv.AccountChangeSet) + c4, _ := tx.CursorDupSort(kv.StorageChangeSet) + return &PlainState{ - tx: tx, - blockNr: blockNr, - storage: make(map[common.Address]*llrb.LLRB), + tx: tx, + blockNr: blockNr, + storage: make(map[common.Address]*btree.BTree), + accHistoryC: c1, storageHistoryC: c2, accChangesC: c3, storageChangesC: c4, } } +func (s *PlainState) SetTrace(trace bool) { + s.trace = trace +} + func (s *PlainState) SetBlockNr(blockNr uint64) { s.blockNr = blockNr } @@ -62,16 +77,16 @@ func (s *PlainState) GetBlockNr() uint64 { } func (s *PlainState) ForEachStorage(addr common.Address, startLocation common.Hash, cb func(key, seckey common.Hash, value uint256.Int) bool, maxResults int) error { - st := llrb.New() + st := btree.New(16) var k [common.AddressLength + common.IncarnationLength + common.HashLength]byte copy(k[:], addr[:]) - accData, err := GetAsOf(s.tx, false /* storage */, addr[:], s.blockNr+1) + accData, err := GetAsOf(s.tx, s.accHistoryC, s.accChangesC, false /* storage */, addr[:], s.blockNr) if err != nil { return err } var acc accounts.Account if err := acc.DecodeForStorage(accData); err != nil { - log.Error("Error decoding account", "error", err) + log.Error("Error decoding account", "err", err) return err } binary.BigEndian.PutUint64(k[common.AddressLength:], acc.Incarnation) @@ -80,7 +95,7 @@ func (s *PlainState) ForEachStorage(addr common.Address, startLocation common.Ha overrideCounter := 0 min := &storageItem{key: startLocation} if t, ok := s.storage[addr]; ok { - t.AscendGreaterOrEqual(min, func(i llrb.Item) bool { + t.AscendGreaterOrEqual(min, func(i btree.Item) bool { item := i.(*storageItem) st.ReplaceOrInsert(item) if !item.value.IsZero() { @@ -92,7 +107,7 @@ func (s *PlainState) ForEachStorage(addr common.Address, startLocation common.Ha }) } numDeletes := st.Len() - overrideCounter - if err := WalkAsOfStorage(s.tx, addr, acc.Incarnation, startLocation, s.blockNr+1, func(kAddr, kLoc, vs []byte) (bool, error) { + if err := WalkAsOfStorage(s.tx, addr, acc.Incarnation, startLocation, s.blockNr, func(kAddr, kLoc, vs []byte) (bool, error) { if !bytes.Equal(kAddr, addr[:]) { return false, nil } @@ -112,7 +127,7 @@ func (s *PlainState) ForEachStorage(addr common.Address, startLocation common.Ha return true, nil } si.value.SetBytes(vs) - st.InsertNoReplace(&si) + st.ReplaceOrInsert(&si) if bytes.Compare(kLoc, lastKey[:]) > 0 { // Beyond overrides return st.Len() < maxResults+numDeletes, nil @@ -124,7 +139,7 @@ func (s *PlainState) ForEachStorage(addr common.Address, startLocation common.Ha } results := 0 var innerErr error - st.AscendGreaterOrEqual(min, func(i llrb.Item) bool { + st.AscendGreaterOrEqual(min, func(i btree.Item) bool { item := i.(*storageItem) if !item.value.IsZero() { // Skip if value == 0 @@ -137,7 +152,7 @@ func (s *PlainState) ForEachStorage(addr common.Address, startLocation common.Ha } func (s *PlainState) ReadAccountData(address common.Address) (*accounts.Account, error) { - enc, err := GetAsOf(s.tx, false /* storage */, address[:], s.blockNr+1) + enc, err := GetAsOf(s.tx, s.accHistoryC, s.accChangesC, false /* storage */, address[:], s.blockNr) if err != nil { return nil, err } @@ -163,10 +178,13 @@ func (s *PlainState) ReadAccountData(address common.Address) (*accounts.Account, func (s *PlainState) ReadAccountStorage(address common.Address, incarnation uint64, key *common.Hash) ([]byte, error) { compositeKey := dbutils.PlainGenerateCompositeStorageKey(address.Bytes(), incarnation, key.Bytes()) - enc, err := GetAsOf(s.tx, true /* storage */, compositeKey, s.blockNr+1) + enc, err := GetAsOf(s.tx, s.storageHistoryC, s.storageChangesC, true /* storage */, compositeKey, s.blockNr) if err != nil { return nil, err } + if s.trace { + fmt.Printf("ReadAccountStorage [%x] [%x] => [%x]\n", address, *key, enc) + } if len(enc) == 0 { return nil, nil } @@ -190,7 +208,7 @@ func (s *PlainState) ReadAccountCodeSize(address common.Address, incarnation uin } func (s *PlainState) ReadAccountIncarnation(address common.Address) (uint64, error) { - enc, err := GetAsOf(s.tx, false /* storage */, address[:], s.blockNr+2) + enc, err := GetAsOf(s.tx, s.accHistoryC, s.accChangesC, false /* storage */, address[:], s.blockNr+1) if err != nil { return 0, err } @@ -222,7 +240,7 @@ func (s *PlainState) UpdateAccountCode(address common.Address, incarnation uint6 func (s *PlainState) WriteAccountStorage(address common.Address, incarnation uint64, key *common.Hash, original, value *uint256.Int) error { t, ok := s.storage[address] if !ok { - t = llrb.New() + t = btree.New(16) s.storage[address] = t } h := common.NewHasher() diff --git a/core/state/plain_state_writer.go b/core/state/plain_state_writer.go index a8dc51fc6e4..bce28a27b9e 100644 --- a/core/state/plain_state_writer.go +++ b/core/state/plain_state_writer.go @@ -42,6 +42,7 @@ func (w *PlainStateWriter) SetAccumulator(accumulator *shards.Accumulator) *Plai } func (w *PlainStateWriter) UpdateAccountData(address common.Address, original, account *accounts.Account) error { + //fmt.Printf("balance,%x,%d\n", address, &account.Balance) if w.csw != nil { if err := w.csw.UpdateAccountData(address, original, account); err != nil { return err @@ -50,12 +51,13 @@ func (w *PlainStateWriter) UpdateAccountData(address common.Address, original, a value := make([]byte, account.EncodingLengthForStorage()) account.EncodeForStorage(value) if w.accumulator != nil { - w.accumulator.ChangeAccount(address, value) + w.accumulator.ChangeAccount(address, account.Incarnation, value) } return w.db.Put(kv.PlainState, address[:], value) } func (w *PlainStateWriter) UpdateAccountCode(address common.Address, incarnation uint64, codeHash common.Hash, code []byte) error { + //fmt.Printf("code,%x,%x\n", address, code) if w.csw != nil { if err := w.csw.UpdateAccountCode(address, incarnation, codeHash, code); err != nil { return err @@ -71,6 +73,7 @@ func (w *PlainStateWriter) UpdateAccountCode(address common.Address, incarnation } func (w *PlainStateWriter) DeleteAccount(address common.Address, original *accounts.Account) error { + //fmt.Printf("delete,%x\n", address) if w.csw != nil { if err := w.csw.DeleteAccount(address, original); err != nil { return err @@ -93,6 +96,7 @@ func (w *PlainStateWriter) DeleteAccount(address common.Address, original *accou } func (w *PlainStateWriter) WriteAccountStorage(address common.Address, incarnation uint64, key *common.Hash, original, value *uint256.Int) error { + //fmt.Printf("storage,%x,%x,%x\n", address, *key, value.Bytes()) if w.csw != nil { if err := w.csw.WriteAccountStorage(address, incarnation, key, original, value); err != nil { return err diff --git a/core/state/state_object.go b/core/state/state_object.go index d6617d17701..7547a97fda9 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -99,7 +99,7 @@ type stateObject struct { // empty returns whether the account is considered empty. func (so *stateObject) empty() bool { - return so.data.Nonce == 0 && so.data.Balance.Sign() == 0 && bytes.Equal(so.data.CodeHash[:], emptyCodeHash) + return so.data.Nonce == 0 && so.data.Balance.IsZero() && bytes.Equal(so.data.CodeHash[:], emptyCodeHash) } // newObject creates a state object. @@ -156,6 +156,11 @@ func (so *stateObject) touch() { // GetState returns a value from account storage. func (so *stateObject) GetState(key *common.Hash, out *uint256.Int) { + // If the fake storage is set, only lookup the state here(in the debugging mode) + if so.fakeStorage != nil { + *out = so.fakeStorage[*key] + return + } value, dirty := so.dirtyStorage[*key] if dirty { *out = value @@ -167,6 +172,11 @@ func (so *stateObject) GetState(key *common.Hash, out *uint256.Int) { // GetCommittedState retrieves a value from the committed account storage trie. func (so *stateObject) GetCommittedState(key *common.Hash, out *uint256.Int) { + // If the fake storage is set, only lookup the state here(in the debugging mode) + if so.fakeStorage != nil { + *out = so.fakeStorage[*key] + return + } // If we have the original value cached, return that { value, cached := so.originStorage[*key] @@ -197,6 +207,16 @@ func (so *stateObject) GetCommittedState(key *common.Hash, out *uint256.Int) { // SetState updates a value in account storage. func (so *stateObject) SetState(key *common.Hash, value uint256.Int) { + // If the fake storage is set, put the temporary state update here. + if so.fakeStorage != nil { + so.db.journal.append(fakeStorageChange{ + account: &so.address, + key: *key, + prevalue: so.fakeStorage[*key], + }) + so.fakeStorage[*key] = value + return + } // If the new value is the same as old, don't set var prev uint256.Int so.GetState(key, &prev) @@ -297,18 +317,6 @@ func (so *stateObject) setIncarnation(incarnation uint64) { so.data.SetIncarnation(incarnation) } -func (so *stateObject) deepCopy(db *IntraBlockState) *stateObject { - stateObject := newObject(db, so.address, &so.data, &so.original) - stateObject.code = so.code - stateObject.dirtyStorage = so.dirtyStorage.Copy() - stateObject.originStorage = so.originStorage.Copy() - stateObject.blockOriginStorage = so.blockOriginStorage.Copy() - stateObject.suicided = so.suicided - stateObject.dirtyCode = so.dirtyCode - stateObject.deleted = so.deleted - return stateObject -} - // // Attribute accessors // @@ -328,7 +336,7 @@ func (so *stateObject) Code() []byte { } code, err := so.db.stateReader.ReadAccountCode(so.Address(), so.data.Incarnation, common.BytesToHash(so.CodeHash())) if err != nil { - so.setError(fmt.Errorf("can't load code hash %x: %v", so.CodeHash(), err)) + so.setError(fmt.Errorf("can't load code hash %x: %w", so.CodeHash(), err)) } so.code = code return code diff --git a/core/state/state_test.go b/core/state/state_test.go index af7e9785fb6..0f344d1c16e 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -59,10 +59,10 @@ func (s *StateSuite) TestDump(c *checker.C) { err = s.w.UpdateAccountData(obj2.address, &obj2.data, new(accounts.Account)) c.Check(err, checker.IsNil) - err = s.state.FinalizeTx(params.Rules{}, s.w) + err = s.state.FinalizeTx(¶ms.Rules{}, s.w) c.Check(err, checker.IsNil) - err = s.state.CommitBlock(params.Rules{}, s.w) + err = s.state.CommitBlock(¶ms.Rules{}, s.w) c.Check(err, checker.IsNil) // check that dump contains the state objects that are in trie @@ -108,8 +108,8 @@ func (s *StateSuite) SetUpTest(c *checker.C) { panic(err) } s.tx = tx - s.r = NewPlainState(tx, 0) - s.w = NewPlainState(tx, 0) + s.r = NewPlainState(tx, 1) + s.w = NewPlainState(tx, 1) s.state = New(s.r) } @@ -126,10 +126,10 @@ func (s *StateSuite) TestNull(c *checker.C) { s.state.SetState(address, &common.Hash{}, value) - err := s.state.FinalizeTx(params.Rules{}, s.w) + err := s.state.FinalizeTx(¶ms.Rules{}, s.w) c.Check(err, checker.IsNil) - err = s.state.CommitBlock(params.Rules{}, s.w) + err = s.state.CommitBlock(¶ms.Rules{}, s.w) c.Check(err, checker.IsNil) s.state.GetCommittedState(address, &common.Hash{}, &value) @@ -138,6 +138,33 @@ func (s *StateSuite) TestNull(c *checker.C) { } } +func (s *StateSuite) TestTouchDelete(c *checker.C) { + s.state.GetOrNewStateObject(common.Address{}) + + err := s.state.FinalizeTx(¶ms.Rules{}, s.w) + if err != nil { + c.Fatal("error while finalize", err) + } + + err = s.state.CommitBlock(¶ms.Rules{}, s.w) + if err != nil { + c.Fatal("error while commit", err) + } + + s.state.Reset() + + snapshot := s.state.Snapshot() + s.state.AddBalance(common.Address{}, new(uint256.Int)) + + if len(s.state.journal.dirties) != 1 { + c.Fatal("expected one dirty state object") + } + s.state.RevertToSnapshot(snapshot) + if len(s.state.journal.dirties) != 0 { + c.Fatal("expected no dirty state object") + } +} + func (s *StateSuite) TestSnapshot(c *checker.C) { stateobjaddr := toAddr([]byte("aa")) var storageaddr common.Hash @@ -177,8 +204,8 @@ func (s *StateSuite) TestSnapshotEmpty(c *checker.C) { // printing/logging in tests (-check.vv does not work) func TestSnapshot2(t *testing.T) { _, tx := memdb.NewTestTx(t) - w := NewPlainState(tx, 0) - state := New(NewPlainState(tx, 0)) + w := NewPlainState(tx, 1) + state := New(NewPlainState(tx, 1)) stateobjaddr0 := toAddr([]byte("so0")) stateobjaddr1 := toAddr([]byte("so1")) @@ -197,15 +224,15 @@ func TestSnapshot2(t *testing.T) { so0.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e'}), []byte{'c', 'a', 'f', 'e'}) so0.suicided = false so0.deleted = false - state.setStateObject(so0) + state.setStateObject(stateobjaddr0, so0) - err := state.FinalizeTx(params.Rules{}, w) + err := state.FinalizeTx(¶ms.Rules{}, w) if err != nil { t.Fatal("error while finalizing transaction", err) } - w = NewPlainState(tx, 1) + w = NewPlainState(tx, 2) - err = state.CommitBlock(params.Rules{}, w) + err = state.CommitBlock(¶ms.Rules{}, w) if err != nil { t.Fatal("error while committing state", err) } @@ -217,7 +244,7 @@ func TestSnapshot2(t *testing.T) { so1.SetCode(crypto.Keccak256Hash([]byte{'c', 'a', 'f', 'e', '2'}), []byte{'c', 'a', 'f', 'e', '2'}) so1.suicided = true so1.deleted = true - state.setStateObject(so1) + state.setStateObject(stateobjaddr1, so1) so1 = state.getStateObject(stateobjaddr1) if so1 != nil && !so1.deleted { @@ -314,13 +341,13 @@ func TestDump(t *testing.T) { t.Fatal(err) } - err = state.FinalizeTx(params.Rules{}, w) + err = state.FinalizeTx(¶ms.Rules{}, w) if err != nil { t.Fatal(err) } blockWriter := NewPlainStateWriter(tx, tx, 1) - err = state.CommitBlock(params.Rules{}, blockWriter) + err = state.CommitBlock(¶ms.Rules{}, blockWriter) if err != nil { t.Fatal(err) } diff --git a/core/state_processor.go b/core/state_processor.go index 29cbe3c7779..56608c94dfc 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -84,8 +84,9 @@ func FormatLogs(logs []vm.StructLog) []StructLogRes { // and uses the input parameters for its environment. It returns the receipt // for the transaction, gas used and an error if the transaction failed, // indicating the block was invalid. -func applyTransaction(config *params.ChainConfig, gp *GasPool, statedb *state.IntraBlockState, stateWriter state.StateWriter, header *types.Header, tx types.Transaction, usedGas *uint64, evm *vm.EVM, cfg vm.Config) (*types.Receipt, []byte, error) { - msg, err := tx.AsMessage(*types.MakeSigner(config, header.Number.Uint64()), header.BaseFee) +func applyTransaction(config *params.ChainConfig, gp *GasPool, statedb *state.IntraBlockState, stateWriter state.StateWriter, header *types.Header, tx types.Transaction, usedGas *uint64, evm vm.VMInterface, cfg vm.Config) (*types.Receipt, []byte, error) { + rules := evm.ChainRules() + msg, err := tx.AsMessage(*types.MakeSigner(config, header.Number.Uint64()), header.BaseFee, rules) if err != nil { return nil, nil, err } @@ -103,7 +104,7 @@ func applyTransaction(config *params.ChainConfig, gp *GasPool, statedb *state.In return nil, nil, err } // Update the state with pending changes - if err = statedb.FinalizeTx(evm.ChainRules, stateWriter); err != nil { + if err = statedb.FinalizeTx(rules, stateWriter); err != nil { return nil, nil, err } @@ -124,7 +125,7 @@ func applyTransaction(config *params.ChainConfig, gp *GasPool, statedb *state.In receipt.GasUsed = result.UsedGas // if the transaction created a contract, store the creation address in the receipt. if msg.To() == nil { - receipt.ContractAddress = crypto.CreateAddress(evm.TxContext.Origin, tx.GetNonce()) + receipt.ContractAddress = crypto.CreateAddress(evm.TxContext().Origin, tx.GetNonce()) } // Set the receipt logs and create a bloom for filtering receipt.Logs = statedb.GetLogs(tx.Hash()) @@ -132,6 +133,7 @@ func applyTransaction(config *params.ChainConfig, gp *GasPool, statedb *state.In receipt.BlockNumber = header.Number receipt.TransactionIndex = uint(statedb.TxIndex()) } + return receipt, result.ReturnData, err } @@ -139,13 +141,21 @@ func applyTransaction(config *params.ChainConfig, gp *GasPool, statedb *state.In // and uses the input parameters for its environment. It returns the receipt // for the transaction, gas used and an error if the transaction failed, // indicating the block was invalid. -func ApplyTransaction(config *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, engine consensus.Engine, author *common.Address, gp *GasPool, ibs *state.IntraBlockState, stateWriter state.StateWriter, header *types.Header, tx types.Transaction, usedGas *uint64, cfg vm.Config, checkTEVM func(contractHash common.Hash) (bool, error)) (*types.Receipt, []byte, error) { +func ApplyTransaction(config *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, engine consensus.Engine, author *common.Address, gp *GasPool, ibs *state.IntraBlockState, stateWriter state.StateWriter, header *types.Header, tx types.Transaction, usedGas *uint64, cfg vm.Config, contractHasTEVM func(contractHash common.Hash) (bool, error)) (*types.Receipt, []byte, error) { // Create a new context to be used in the EVM environment - blockContext := NewEVMBlockContext(header, getHeader, engine, author, checkTEVM) - vmenv := vm.NewEVM(blockContext, vm.TxContext{}, ibs, config, cfg) + // Add addresses to access list if applicable // about the transaction and calling mechanisms. cfg.SkipAnalysis = SkipAnalysis(config, header.Number.Uint64()) + var vmenv vm.VMInterface + + if tx.IsStarkNet() { + vmenv = &vm.CVMAdapter{Cvm: vm.NewCVM(ibs)} + } else { + blockContext := NewEVMBlockContext(header, getHeader, engine, author, contractHasTEVM) + vmenv = vm.NewEVM(blockContext, vm.TxContext{}, ibs, config, cfg) + } + return applyTransaction(config, gp, ibs, stateWriter, header, tx, usedGas, vmenv, cfg) } diff --git a/core/state_transition.go b/core/state_transition.go index a7ab0cb8c32..c8b8248b485 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -18,7 +18,9 @@ package core import ( "fmt" - "math" + "math/bits" + + "github.com/ledgerwatch/erigon/consensus" "github.com/holiman/uint256" @@ -26,9 +28,12 @@ import ( cmath "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/params" ) +var emptyCodeHash = crypto.Keccak256Hash(nil) + /* The State Transitioning Model @@ -57,11 +62,14 @@ type StateTransition struct { value *uint256.Int data []byte state vm.IntraBlockState - evm *vm.EVM + evm vm.VMInterface //some pre-allocated intermediate variables sharedBuyGas *uint256.Int sharedBuyGasBalance *uint256.Int + + isParlia bool + isBor bool } // Message represents a message sent to a contract. @@ -125,6 +133,10 @@ func IntrinsicGas(data []byte, accessList types.AccessList, isContractCreation b } else { gas = params.TxGas } + + // Auxiliary variables for overflow protection + var product, overflow uint64 + // Bump the required gas by the amount of transactional data if len(data) > 0 { // Zero and non-zero bytes are priced differently @@ -139,26 +151,52 @@ func IntrinsicGas(data []byte, accessList types.AccessList, isContractCreation b if isEIP2028 { nonZeroGas = params.TxDataNonZeroGasEIP2028 } - if (math.MaxUint64-gas)/nonZeroGas < nz { + + overflow, product = bits.Mul64(nz, nonZeroGas) + if overflow != 0 { + return 0, ErrGasUintOverflow + } + gas, overflow = bits.Add64(gas, product, 0) + if overflow != 0 { return 0, ErrGasUintOverflow } - gas += nz * nonZeroGas z := uint64(len(data)) - nz - if (math.MaxUint64-gas)/params.TxDataZeroGas < z { + overflow, product = bits.Mul64(z, params.TxDataZeroGas) + if overflow != 0 { + return 0, ErrGasUintOverflow + } + gas, overflow = bits.Add64(gas, product, 0) + if overflow != 0 { return 0, ErrGasUintOverflow } - gas += z * params.TxDataZeroGas } if accessList != nil { - gas += uint64(len(accessList)) * params.TxAccessListAddressGas - gas += uint64(accessList.StorageKeys()) * params.TxAccessListStorageKeyGas + overflow, product = bits.Mul64(uint64(len(accessList)), params.TxAccessListAddressGas) + if overflow != 0 { + return 0, ErrGasUintOverflow + } + gas, overflow = bits.Add64(gas, product, 0) + if overflow != 0 { + return 0, ErrGasUintOverflow + } + + overflow, product = bits.Mul64(uint64(accessList.StorageKeys()), params.TxAccessListStorageKeyGas) + if overflow != 0 { + return 0, ErrGasUintOverflow + } + gas, overflow = bits.Add64(gas, product, 0) + if overflow != 0 { + return 0, ErrGasUintOverflow + } } return gas, nil } // NewStateTransition initialises and returns a new state transition object. -func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition { +func NewStateTransition(evm vm.VMInterface, msg Message, gp *GasPool) *StateTransition { + isParlia := evm.ChainConfig().Parlia != nil + isBor := evm.ChainConfig().Bor != nil return &StateTransition{ gp: gp, evm: evm, @@ -168,10 +206,13 @@ func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition tip: msg.Tip(), value: msg.Value(), data: msg.Data(), - state: evm.IntraBlockState, + state: evm.IntraBlockState(), sharedBuyGas: uint256.NewInt(0), sharedBuyGasBalance: uint256.NewInt(0), + + isParlia: isParlia, + isBor: isBor, } } @@ -185,7 +226,7 @@ func NewStateTransition(evm *vm.EVM, msg Message, gp *GasPool) *StateTransition // `refunds` is false when it is not required to apply gas refunds // `gasBailout` is true when it is not required to fail transaction if the balance is not enough to pay gas. // for trace_call to replicate OE/Pariry behaviour -func ApplyMessage(evm *vm.EVM, msg Message, gp *GasPool, refunds bool, gasBailout bool) (*ExecutionResult, error) { +func ApplyMessage(evm vm.VMInterface, msg Message, gp *GasPool, refunds bool, gasBailout bool) (*ExecutionResult, error) { return NewStateTransition(evm, msg, gp).TransitionDb(refunds, gasBailout) } @@ -200,12 +241,21 @@ func (st *StateTransition) to() common.Address { func (st *StateTransition) buyGas(gasBailout bool) error { mgval := st.sharedBuyGas mgval.SetUint64(st.msg.Gas()) - mgval = mgval.Mul(mgval, st.gasPrice) + mgval, overflow := mgval.MulOverflow(mgval, st.gasPrice) + if overflow { + return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) + } balanceCheck := mgval if st.gasFeeCap != nil { balanceCheck = st.sharedBuyGasBalance.SetUint64(st.msg.Gas()) - balanceCheck = balanceCheck.Mul(balanceCheck, st.gasFeeCap) - balanceCheck.Add(balanceCheck, st.value) + balanceCheck, overflow = balanceCheck.MulOverflow(balanceCheck, st.gasFeeCap) + if overflow { + return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) + } + balanceCheck, overflow = balanceCheck.AddOverflow(balanceCheck, st.value) + if overflow { + return fmt.Errorf("%w: address %v", ErrInsufficientFunds, st.msg.From().Hex()) + } } if have, want := st.state.GetBalance(st.msg.From()), balanceCheck; have.Cmp(want) < 0 { if !gasBailout { @@ -225,6 +275,18 @@ func (st *StateTransition) buyGas(gasBailout bool) error { return nil } +func CheckEip1559TxGasFeeCap(from common.Address, gasFeeCap, tip, baseFee *uint256.Int) error { + if gasFeeCap.Cmp(tip) < 0 { + return fmt.Errorf("%w: address %v, tip: %s, gasFeeCap: %s", ErrTipAboveFeeCap, + from.Hex(), gasFeeCap, tip) + } + if baseFee != nil && gasFeeCap.Cmp(baseFee) < 0 { + return fmt.Errorf("%w: address %v, gasFeeCap: %s baseFee: %s", ErrFeeCapTooLow, + from.Hex(), gasFeeCap, baseFee) + } + return nil +} + // DESCRIBED: docs/programmers_guide/guide.md#nonce func (st *StateTransition) preCheck(gasBailout bool) error { // Make sure this transaction's nonce is correct. @@ -236,28 +298,27 @@ func (st *StateTransition) preCheck(gasBailout bool) error { } else if stNonce > msgNonce { return fmt.Errorf("%w: address %v, tx: %d state: %d", ErrNonceTooLow, st.msg.From().Hex(), msgNonce, stNonce) + } else if stNonce+1 < stNonce { + return fmt.Errorf("%w: address %v, nonce: %d", ErrNonceMax, + st.msg.From().Hex(), stNonce) + } + + // Make sure the sender is an EOA (EIP-3607) + if codeHash := st.state.GetCodeHash(st.msg.From()); codeHash != emptyCodeHash && codeHash != (common.Hash{}) { + // common.Hash{} means that the sender is not in the state. + // Historically there were transactions with 0 gas price and non-existing sender, + // so we have to allow that. + return fmt.Errorf("%w: address %v, codehash: %s", ErrSenderNoEOA, + st.msg.From().Hex(), codeHash) } } // Make sure the transaction gasFeeCap is greater than the block's baseFee. - if st.evm.ChainRules.IsLondon { + if st.evm.ChainRules().IsLondon { // Skip the checks if gas fields are zero and baseFee was explicitly disabled (eth_call) - if !st.evm.Config.NoBaseFee || st.gasFeeCap.BitLen() > 0 || st.tip.BitLen() > 0 { - if l := st.gasFeeCap.BitLen(); l > 256 { - return fmt.Errorf("%w: address %v, gasFeeCap bit length: %d", ErrFeeCapVeryHigh, - st.msg.From().Hex(), l) - } - if l := st.tip.BitLen(); l > 256 { - return fmt.Errorf("%w: address %v, tip bit length: %d", ErrTipVeryHigh, - st.msg.From().Hex(), l) - } - if st.gasFeeCap.Cmp(st.tip) < 0 { - return fmt.Errorf("%w: address %v, tip: %s, gasFeeCap: %s", ErrTipAboveFeeCap, - st.msg.From().Hex(), st.gasFeeCap, st.tip) - } - if st.gasFeeCap.Cmp(st.evm.Context.BaseFee) < 0 { - return fmt.Errorf("%w: address %v, gasFeeCap: %d baseFee: %d", ErrFeeCapTooLow, - st.msg.From().Hex(), st.gasFeeCap.Uint64(), st.evm.Context.BaseFee.Uint64()) + if !st.evm.Config().NoBaseFee || !st.gasFeeCap.IsZero() || !st.tip.IsZero() { + if err := CheckEip1559TxGasFeeCap(st.msg.From(), st.gasFeeCap, st.tip, st.evm.Context().BaseFee); err != nil { + return err } } } @@ -278,6 +339,13 @@ func (st *StateTransition) preCheck(gasBailout bool) error { // However if any consensus issue encountered, return the error directly with // nil evm execution result. func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*ExecutionResult, error) { + var input1 *uint256.Int + var input2 *uint256.Int + if st.isBor { + input1 = st.state.GetBalance(st.msg.From()).Clone() + input2 = st.state.GetBalance(st.evm.Context().Coinbase).Clone() + } + // First check this message satisfies all consensus rules before // applying the message. The rules include these clauses // @@ -288,15 +356,21 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*Executi // 5. there is no overflow when calculating intrinsic gas // 6. caller has enough balance to cover asset transfer for **topmost** call + // BSC always gave gas bailout due to system transactions that set 2^256/2 gas limit and + // for Parlia consensus this flag should be always be set + if st.isParlia { + gasBailout = true + } + // Check clauses 1-3 and 6, buy gas if everything is correct if err := st.preCheck(gasBailout); err != nil { return nil, err } msg := st.msg sender := vm.AccountRef(msg.From()) - homestead := st.evm.ChainRules.IsHomestead - istanbul := st.evm.ChainRules.IsIstanbul - london := st.evm.ChainRules.IsLondon + homestead := st.evm.ChainRules().IsHomestead + istanbul := st.evm.ChainRules().IsIstanbul + london := st.evm.ChainRules().IsLondon contractCreation := msg.To() == nil // Check clauses 4-5, subtract intrinsic gas if everything is correct @@ -309,9 +383,17 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*Executi } st.gas -= gas + var bailout bool + // Gas bailout (for trace_call) should only be applied if there is not sufficient balance to perform value transfer + if gasBailout { + if !msg.Value().IsZero() && !st.evm.Context().CanTransfer(st.state, msg.From(), msg.Value()) { + bailout = true + } + } + // Set up the initial access list. - if st.evm.ChainRules.IsBerlin { - st.state.PrepareAccessList(msg.From(), msg.To(), vm.ActivePrecompiles(st.evm.ChainRules), msg.AccessList()) + if st.evm.ChainRules().IsBerlin { + st.state.PrepareAccessList(msg.From(), msg.To(), vm.ActivePrecompiles(st.evm.ChainRules()), msg.AccessList()) } var ( @@ -327,7 +409,7 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*Executi } else { // Increment the nonce for the next transaction st.state.SetNonce(msg.From(), st.state.GetNonce(sender.Address())+1) - ret, st.gas, vmerr = st.evm.Call(sender, st.to(), st.data, st.gas, st.value, gasBailout) + ret, st.gas, vmerr = st.evm.Call(sender, st.to(), st.data, st.gas, st.value, bailout) } if refunds { if london { @@ -339,10 +421,39 @@ func (st *StateTransition) TransitionDb(refunds bool, gasBailout bool) (*Executi } } effectiveTip := st.gasPrice - if st.evm.ChainRules.IsLondon { - effectiveTip = cmath.Min256(st.tip, new(uint256.Int).Sub(st.gasFeeCap, st.evm.Context.BaseFee)) + if london { + effectiveTip = cmath.Min256(st.tip, new(uint256.Int).Sub(st.gasFeeCap, st.evm.Context().BaseFee)) + } + amount := new(uint256.Int).SetUint64(st.gasUsed()) + amount.Mul(amount, effectiveTip) // gasUsed * effectiveTip = how much goes to the block producer (miner, validator) + if st.isParlia { + st.state.AddBalance(consensus.SystemAddress, amount) + } else { + st.state.AddBalance(st.evm.Context().Coinbase, amount) + } + if st.isBor { + if london { + burntContractAddress := common.HexToAddress(st.evm.ChainConfig().Bor.CalculateBurntContract(st.evm.Context().BlockNumber)) + burnAmount := new(uint256.Int).Mul(new(uint256.Int).SetUint64(st.gasUsed()), st.evm.Context().BaseFee) + st.state.AddBalance(burntContractAddress, burnAmount) + } + // Deprecating transfer log and will be removed in future fork. PLEASE DO NOT USE this transfer log going forward. Parameters won't get updated as expected going forward with EIP1559 + // add transfer log + output1 := input1.Clone() + output2 := input2.Clone() + AddFeeTransferLog( + st.state, + + msg.From(), + st.evm.Context().Coinbase, + + amount, + input1, + input2, + output1.Sub(output1, amount), + output2.Add(output2, amount), + ) } - st.state.AddBalance(st.evm.Context.Coinbase, new(uint256.Int).Mul(new(uint256.Int).SetUint64(st.gasUsed()), effectiveTip)) return &ExecutionResult{ UsedGas: st.gasUsed(), diff --git a/core/systemcontracts/const.go b/core/systemcontracts/const.go new file mode 100644 index 00000000000..7cb6a5d2122 --- /dev/null +++ b/core/systemcontracts/const.go @@ -0,0 +1,17 @@ +package systemcontracts + +import "github.com/ledgerwatch/erigon/common" + +var ( + // genesis contracts + ValidatorContract = common.HexToAddress("0x0000000000000000000000000000000000001000") + SlashContract = common.HexToAddress("0x0000000000000000000000000000000000001001") + SystemRewardContract = common.HexToAddress("0x0000000000000000000000000000000000001002") + LightClientContract = common.HexToAddress("0x0000000000000000000000000000000000001003") + TokenHubContract = common.HexToAddress("0x0000000000000000000000000000000000001004") + RelayerIncentivizeContract = common.HexToAddress("0x0000000000000000000000000000000000001005") + RelayerHubContract = common.HexToAddress("0x0000000000000000000000000000000000001006") + GovHubContract = common.HexToAddress("0x0000000000000000000000000000000000001007") + TokenManagerContract = common.HexToAddress("0x0000000000000000000000000000000000001008") + CrossChainContract = common.HexToAddress("0x0000000000000000000000000000000000002000") +) diff --git a/core/systemcontracts/upgrade.go b/core/systemcontracts/upgrade.go new file mode 100644 index 00000000000..abbc618552a --- /dev/null +++ b/core/systemcontracts/upgrade.go @@ -0,0 +1,383 @@ +package systemcontracts + +import ( + "encoding/hex" + "fmt" + "math/big" + + "github.com/ledgerwatch/log/v3" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/params/networkname" +) + +type UpgradeConfig struct { + BeforeUpgrade upgradeHook + AfterUpgrade upgradeHook + ContractAddr common.Address + CommitUrl string + Code string +} + +type Upgrade struct { + UpgradeName string + Configs []*UpgradeConfig +} + +type upgradeHook func(blockNumber *big.Int, contractAddr common.Address, statedb *state.IntraBlockState) error + +const ( + mainNet = "Mainnet" + chapelNet = "Chapel" + rialtoNet = "Rialto" + defaultNet = "Default" +) + +var ( + //upgrade config + ramanujanUpgrade = make(map[string]*Upgrade) + + nielsUpgrade = make(map[string]*Upgrade) + + mirrorUpgrade = make(map[string]*Upgrade) + + brunoUpgrade = make(map[string]*Upgrade) +) + +func init() { + ramanujanUpgrade[rialtoNet] = &Upgrade{ + UpgradeName: "ramanujan", + Configs: []*UpgradeConfig{ + { + ContractAddr: ValidatorContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "60806040526004361061027d5760003560e01c80639dc092621161014f578063c8509d81116100c1578063eb57e2021161007a578063eb57e20214610940578063eda5868c14610973578063f340fa0114610988578063f9a2bbc7146109ae578063fc3e5908146109c3578063fd6a6879146109d85761027d565b8063c8509d8114610609578063d86222d5146108d7578063daacdb66146108ec578063dc927faf14610901578063e086c7b114610916578063e1c7392a1461092b5761027d565b8063ab51bb9611610113578063ab51bb961461074a578063ac4317511461075f578063ad3c9da61461082a578063b7ab4db51461085d578063bf9f49951461041b578063c81b1662146108c25761027d565b80639dc09262146106cd578063a1a11bf5146106e2578063a5422d5c146106f7578063a78abc161461070c578063aaf5eb68146107355761027d565b80635667515a116101f35780637942fd05116101ac5780637942fd05146105df57806381650b62146105f4578063831d65d114610609578063853230aa1461068e57806386249882146106a357806396713da9146106b85761027d565b80635667515a146105005780635d77156c146105155780636969a25c1461052a5780636e47b482146105a057806370fd5bad146105b557806375d47a0a146105ca5761027d565b80633dffc387116102455780633dffc3871461041b57806343756e5c14610446578063493279b1146104775780634bf6c882146104a357806351e80672146104b8578063565c56b3146104cd5761027d565b80630bee7a67146102825780631182b875146102b05780631ff18069146103aa578063219f22d5146103d157806335409f7f146103e6575b600080fd5b34801561028e57600080fd5b506102976109ed565b6040805163ffffffff9092168252519081900360200190f35b3480156102bc57600080fd5b50610335600480360360408110156102d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460018302840111600160201b8311171561032a57600080fd5b5090925090506109f2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036f578181015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b657600080fd5b506103bf610bdf565b60408051918252519081900360200190f35b3480156103dd57600080fd5b50610297610be5565b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b0316610bea565b005b34801561042757600080fd5b50610430610efe565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061045b610f03565b604080516001600160a01b039092168252519081900360200190f35b34801561048357600080fd5b5061048c610f09565b6040805161ffff9092168252519081900360200190f35b3480156104af57600080fd5b50610430610f0e565b3480156104c457600080fd5b5061045b610f13565b3480156104d957600080fd5b506103bf600480360360208110156104f057600080fd5b50356001600160a01b0316610f19565b34801561050c57600080fd5b50610430610f6b565b34801561052157600080fd5b50610297610f70565b34801561053657600080fd5b506105546004803603602081101561054d57600080fd5b5035610f75565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156105ac57600080fd5b5061045b610fd9565b3480156105c157600080fd5b50610430610fdf565b3480156105d657600080fd5b5061045b610fe4565b3480156105eb57600080fd5b50610430610fea565b34801561060057600080fd5b50610297610fef565b34801561061557600080fd5b506104196004803603604081101561062c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561065057600080fd5b82018360208201111561066257600080fd5b803590602001918460018302840111600160201b8311171561068357600080fd5b509092509050610ff4565b34801561069a57600080fd5b506103bf6110a7565b3480156106af57600080fd5b506103bf6110ad565b3480156106c457600080fd5b506104306110b3565b3480156106d957600080fd5b5061045b6110b8565b3480156106ee57600080fd5b5061045b6110be565b34801561070357600080fd5b506103356110c4565b34801561071857600080fd5b506107216110e1565b604080519115158252519081900360200190f35b34801561074157600080fd5b506103bf6110ea565b34801561075657600080fd5b50610297610f6b565b34801561076b57600080fd5b506104196004803603604081101561078257600080fd5b810190602081018135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460018302840111600160201b831117156107cf57600080fd5b919390929091602081019035600160201b8111156107ec57600080fd5b8201836020820111156107fe57600080fd5b803590602001918460018302840111600160201b8311171561081f57600080fd5b5090925090506110f3565b34801561083657600080fd5b506103bf6004803603602081101561084d57600080fd5b50356001600160a01b031661139a565b34801561086957600080fd5b506108726113ac565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ae578181015183820152602001610896565b505050509050019250505060405180910390f35b3480156108ce57600080fd5b5061045b6114d2565b3480156108e357600080fd5b506103bf6114d8565b3480156108f857600080fd5b506103bf6114e4565b34801561090d57600080fd5b5061045b6114ea565b34801561092257600080fd5b506103bf6114f0565b34801561093757600080fd5b506104196114f5565b34801561094c57600080fd5b506104196004803603602081101561096357600080fd5b50356001600160a01b03166116f6565b34801561097f57600080fd5b506102976118c5565b6104196004803603602081101561099e57600080fd5b50356001600160a01b03166118ca565b3480156109ba57600080fd5b5061045b611b00565b3480156109cf57600080fd5b50610430611b06565b3480156109e457600080fd5b5061045b611b0b565b606481565b60005460609060ff16610a48576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a885760405162461bcd60e51b815260040180806020018281038252602f815260200180614000602f913960400191505060405180910390fd5b610a90613d65565b6000610ad185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b1192505050565b9150915080610aed57610ae46064611c6a565b92505050610bd8565b815160009060ff16610b0d57610b068360200151611ccb565b9050610ba4565b825160ff1660011415610ba057826020015151600114610b7a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613e686025913960400191505060405180910390a1506067610b9b565b610b068360200151600081518110610b8e57fe5b6020026020010151612ad1565b610ba4565b5060655b63ffffffff8116610bc95750506040805160008152602081019091529150610bd89050565b610bd281611c6a565b93505050505b9392505050565b60035481565b606881565b3361100114610c2a5760405162461bcd60e51b815260040180806020018281038252602981526020018061405c6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610c4e5750610efb565b600181039050600060018281548110610c6357fe5b60009182526020909120600360049092020101546001549091506000190180610cb257600060018481548110610c9557fe5b906000526020600020906004020160030181905550505050610efb565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610e3457600180546000198101908110610d2957fe5b906000526020600020906004020160018481548110610d4457fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610e0957fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610e3f57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610e9257fe5b0490508015610ef65760015460005b81811015610ef3578260018281548110610eb757fe5b9060005260206000209060040201600301540160018281548110610ed757fe5b6000918252602090912060036004909202010155600101610ea1565b50505b505050505b50565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610f41576000915050610f66565b600180820381548110610f5057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610f8257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f815260200180614000602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b60405180610100016040528060dd8152602001613edc60dd913981565b60005460ff1681565b6402540be40081565b60005460ff16611146576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146111865760405162461bcd60e51b815260040180806020018281038252602e815260200180613e8d602e913960400191505060405180910390fd5b6111f084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c489050565b156112cb57602081146112345760405162461bcd60e51b8152600401808060200182810382526026815260200180613fb96026913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161127291858580838501838280828437600092019190915250612d3092505050565b9050606481101580156112885750620186a08111155b6112c35760405162461bcd60e51b8152600401808060200182810382526027815260200180613e416027913960400191505060405180910390fd5b600255611308565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156113fd57600181815481106113cb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166113f5576001909101905b6001016113b6565b5060608160405190808252806020026020018201604052801561142a578160200160208202803683370190505b50600092509050815b838110156114ca576001818154811061144857fe5b9060005260206000209060040201600201601c9054906101000a900460ff166114c2576001818154811061147857fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106114a357fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611433565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561154d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611555613d65565b600061157960405180610100016040528060dd8152602001613edc60dd9139611b11565b91509150806115b95760405162461bcd60e51b8152600401808060200182810382526021815260200180613fdf6021913960400191505060405180910390fd5b60005b8260200151518110156116de576001836020015182815181106115db57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106116b157fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016115bc565b50506103e8600255506000805460ff19166001179055565b33611001146117365760405162461bcd60e51b815260040180806020018281038252602981526020018061405c6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061175a5750610efb565b60018103905060006001828154811061176f57fe5b906000526020600020906004020160030154905060006001838154811061179257fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061180157505050610efb565b600081838161180c57fe5b0490508015610ef65760005b8481101561186a57816001828154811061182e57fe5b906000526020600020906004020160030154016001828154811061184e57fe5b6000918252602090912060036004909202010155600101611818565b50600180549085015b81811015610ef357826001828154811061188957fe5b90600052602060002090600402016003015401600182815481106118a957fe5b6000918252602090912060036004909202010155600101611873565b606581565b3341146119085760405162461bcd60e51b815260040180806020018281038252602d81526020018061402f602d913960400191505060405180910390fd5b60005460ff1661195b576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116119a8576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205434908015611abb5760006001808303815481106119da57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611a45576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611ab5565b600354611a58908463ffffffff612d3516565b6003908155810154611a70908463ffffffff612d3516565b60038201556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611afb565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611b19613d65565b6000611b23613d65565b611b2b613d7d565b611b3c611b3786612d8f565b612db4565b90506000805b611b4b83612dfe565b15611c5c5780611b7057611b66611b6184612e1f565b612e6d565b60ff168452611c54565b8060011415611c4f576060611b8c611b8785612e1f565b612f24565b90508051604051908082528060200260200182016040528015611bc957816020015b611bb6613d9d565b815260200190600190039081611bae5790505b50602086015260005b8151811015611c4457611be3613d9d565b6000611c01848481518110611bf457fe5b6020026020010151612ff5565b9150915080611c1e57876000995099505050505050505050611c65565b8188602001518481518110611c2f57fe5b60209081029190910101525050600101611bd2565b506001925050611c54565b611c5c565b600101611b42565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611c84579050509050611caa8363ffffffff166130d2565b81600081518110611cb757fe5b6020026020010181905250610bd8816130e5565b6000806060611cd98461316f565b9150915081611d86577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d41578181015183820152602001611d29565b50505050905090810190601f168015611d6e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610f66565b600080805b600154811015611e035767016345785d8a000060018281548110611dab57fe5b90600052602060002090600402016003015410611dcd57600190920191611dfb565b600060018281548110611ddc57fe5b9060005260206000209060040201600301541115611dfb576001909101905b600101611d8b565b50606082604051908082528060200260200182016040528015611e30578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611e5f578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611e8e578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ebd578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611eee578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611f1d578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d6020811015611f9457600080fd5b5051905067016345785d8a0000811115612009577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613ebb6021913960400191505060405180910390a160689d5050505050505050505050505050610f66565b60005b60015481101561227c5767016345785d8a00006001828154811061202c57fe5b906000526020600020906004020160030154106121b2576001818154811061205057fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061208157fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106120b657fe5b906000526020600020906004020160030154816120cf57fe5b06600183815481106120dd57fe5b906000526020600020906004020160030154039050612105838261325190919063ffffffff16565b8a8e8151811061211157fe5b6020026020010181815250506001828154811061212a57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061215b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061218857fe5b60209081029190910101526121a3878263ffffffff612d3516565b6001909d019c96506122749050565b6000600182815481106121c157fe5b906000526020600020906004020160030154111561227457600181815481106121e657fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061221757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061224457fe5b906000526020600020906004020160030154848c8151811061226257fe5b60209081029190910101526001909a01995b60010161200c565b50600085156126ba576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b8381101561230e5781810151838201526020016122f6565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561234d578181015183820152602001612335565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561238c578181015183820152602001612374565b505050509050019750505050505050506020604051808303818588803b1580156123b557600080fd5b505af1935050505080156123db57506040513d60208110156123d657600080fd5b505160015b612616576040516000815260443d10156123f757506000612492565b60046000803e60005160e01c6308c379a08114612418576000915050612492565b60043d036004833e81513d60248201116001600160401b038211171561244357600092505050612492565b80830180516001600160401b03811115612464576000945050505050612492565b8060208301013d860181111561248257600095505050505050612492565b601f01601f191660405250925050505b8061249d5750612541565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125015781810151838201526020016124e9565b50505050905090810190601f16801561252e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612611565b3d80801561256b576040519150601f19603f3d011682016040523d82523d6000602084013e612570565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125d55781810151838201526020016125bd565b50505050905090810190601f1680156126025780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6126ba565b8015612654576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16126b8565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156128705760005b885181101561286e5760008982815181106126da57fe5b602002602001015190506000600182815481106126f357fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061272457fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156127e0576001828154811061276557fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106127b457fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612864565b600182815481106127ed57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061283c57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016126c3565b505b8451156129ba5760005b85518110156129b857600086828151811061289157fe5b60200260200101516001600160a01b03166108fc8784815181106128b157fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015612947578682815181106128e757fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061292557fe5b60200260200101516040518082815260200191505060405180910390a26129af565b86828151811061295357fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d87848151811061299157fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161287a565b505b4715612a23576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612a21573d6000803e3d6000fd5b505b60006003819055600555825115612a3d57612a3d83613293565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a7a57600080fd5b505af1158015612a8e573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612b225750600180820381548110612b0257fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612b685782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050610f66565b600154600554600019820111801590612bbe5784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050610f66565b600580546001908101909155805481906000198601908110612bdc57fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612c7d5780518252601f199092019160209182019101612c5e565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612ceb5780518252601f199092019160209182019101612ccc565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b600082820183811015610bd8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d97613dd2565b506040805180820190915281518152602082810190820152919050565b612dbc613d7d565b612dc58261375a565b612dce57600080fd5b6000612ddd8360200151613794565b60208085015160408051808201909152868152920190820152915050919050565b6000612e08613dd2565b505080518051602091820151919092015191011190565b612e27613dd2565b612e3082612dfe565b612e3957600080fd5b60208201516000612e49826137f7565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e8257508151602110155b612e8b57600080fd5b6000612e9a8360200151613794565b90508083600001511015612ef5576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015612f1b57826020036101000a820491505b50949350505050565b6060612f2f8261375a565b612f3857600080fd5b6000612f438361392a565b9050606081604051908082528060200260200182016040528015612f8157816020015b612f6e613dd2565b815260200190600190039081612f665790505b5090506000612f938560200151613794565b60208601510190506000805b84811015612fea57612fb0836137f7565b9150604051806040016040528083815260200184815250848281518110612fd357fe5b602090810291909101015291810191600101612f9f565b509195945050505050565b612ffd613d9d565b6000613007613d9d565b61300f613d7d565b61301885612db4565b90506000805b61302783612dfe565b15611c5c57806130525761304261303d84612e1f565b613986565b6001600160a01b031684526130ca565b806001141561307a5761306761303d84612e1f565b6001600160a01b031660208501526130ca565b80600214156130a25761308f61303d84612e1f565b6001600160a01b031660408501526130ca565b8060031415611c4f576130b7611b6184612e1f565b6001600160401b03166060850152600191505b60010161301e565b6060612d2a6130e0836139a0565b613a86565b60608151600014156131065750604080516000815260208101909152610f66565b60608260008151811061311557fe5b602002602001015190506000600190505b83518110156131565761314c8285838151811061313f57fe5b6020026020010151613ad8565b9150600101613126565b50610bd8613169825160c060ff16613b55565b82613ad8565b600060606029835111156131a1576000604051806060016040528060298152602001613ded6029913991509150611c65565b60005b83518110156132375760005b8181101561322e578481815181106131c457fe5b6020026020010151600001516001600160a01b03168583815181106131e557fe5b6020026020010151600001516001600160a01b031614156132265760006040518060600160405280602b8152602001613e16602b9139935093505050611c65565b6001016131b0565b506001016131a4565b505060408051602081019091526000815260019150915091565b6000610bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c4d565b600154815160005b828110156133b05760016132ad613d9d565b600183815481106132ba57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156133845786818151811061334a57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b0316141561337c5760009250613384565b600101613336565b5081156133a65780516001600160a01b03166000908152600460205260408120555b505060010161329b565b508082111561342557805b828110156134235760018054806133ce57fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b03191690556003909101919091559155016133bb565b505b60008183106134345781613436565b825b905060005b81811015613630576134e885828151811061345257fe5b60200260200101516001838154811061346757fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ce4565b61360357806001016004600087848151811061350057fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061353c57fe5b60200260200101516001828154811061355157fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a090910151600390910155613628565b60006001828154811061361257fe5b9060005260206000209060040201600301819055505b60010161343b565b508282111561375457825b82811015610ef657600185828151811061365157fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061372757fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161363b565b50505050565b805160009061376b57506000610f66565b6020820151805160001a9060c082101561378a57600092505050610f66565b5060019392505050565b8051600090811a60808110156137ae576000915050610f66565b60b88110806137c9575060c081108015906137c9575060f881105b156137d8576001915050610f66565b60c08110156137ec5760b519019050610f66565b60f519019050610f66565b80516000908190811a60808110156138125760019150613923565b60b881101561382757607e1981019150613923565b60c08110156138a157600060b78203600186019550806020036101000a86510491506001810182019350508083101561389b576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613923565b60f88110156138b65760be1981019150613923565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613921576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061393b57506000610f66565b6000809050600061394f8460200151613794565b602085015185519181019250015b8082101561397d5761396e826137f7565b6001909301929091019061395d565b50909392505050565b805160009060151461399757600080fd5b612d2a82612e6d565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166139e457506018613a08565b6fffffffffffffffffffffffffffffffff198416613a0457506010613a08565b5060005b6020811015613a3e57818181518110613a1d57fe5b01602001516001600160f81b03191615613a3657613a3e565b600101613a08565b60008160200390506060816040519080825280601f01601f191660200182016040528015613a73576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ab85750607f60f81b82600081518110613aa657fe5b01602001516001600160f81b03191611155b15613ac4575080610f66565b612d2a613ad68351608060ff16613b55565b835b6060806040519050835180825260208201818101602087015b81831015613b09578051835260209283019201613af1565b50855184518101855292509050808201602086015b81831015613b36578051835260209283019201613b1e565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613ba5576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613bff5782840160f81b81600081518110613be157fe5b60200101906001600160f81b031916908160001a9053509050612d2a565b6060613c0a856139a0565b90508381510160370160f81b82600081518110613c2357fe5b60200101906001600160f81b031916908160001a905350613c448282613ad8565b95945050505050565b60008184841115613cdc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ca1578181015183820152602001613c89565b50505050905090810190601f168015613cce5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613d1e575081602001516001600160a01b031683602001516001600160a01b0316145b8015613d43575081604001516001600160a01b031683604001516001600160a01b0316145b8015610bd85750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613d90613dd2565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d69746475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e47f8db80f8d8f84694a50381a86cd38ca23f6136556fc604329a054a85945d2287739da12be1f3e3b1aeaf14f888e9d63795942ae1ace6a7e31c76ee3c7d2f0b5977c21d5a2a3a86048c27395000f846940dd11a413972d8b1e1367c4b9196f75348424e7094c9c121c762d1e349dc3e38324d1c108c0b08abf99451f1512d6bfac004c862e761c43ad87dd8235dc486048c27395000f84694a5f6a270f60c83624dd1849038ee7c9e8a3e55fc94c9ff491fd30c1026b24b975274cf3d4286d36fa194a86cfcf4753a5df58d89bd6524f69b0e1ae072a986048c273950006c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220fdcf56e550bb645c25bbb322f7eea0d3ca90b5bb689e2fd4e559c38f5e858cb564736f6c63430006040033", + }, + { + ContractAddr: SlashContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "608060405234801561001057600080fd5b50600436106102275760003560e01c8063831d65d111610130578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a146106d9578063f9a2bbc7146106e1578063fc3e5908146106e9578063fc4333cd146106f1578063fd6a6879146106f957610227565b8063c80d4b8f14610623578063c81b16621461062b578063c8509d8114610633578063c96be4cb146106ab578063dc927faf146106d157610227565b8063a1a11bf5116100ff578063a1a11bf514610531578063a78abc1614610539578063ab51bb9614610555578063ac0af6291461055d578063ac4317511461056557610227565b8063831d65d11461049f57806396713da9146105195780639bc8e4f2146105215780639dc092621461052957610227565b80634bf6c882116101b35780636e47b482116101825780636e47b4821461047757806370fd5bad1461047f57806375d47a0a146104875780637912a65d1461048f5780637942fd051461049757610227565b80634bf6c8821461045757806351e806721461045f578063567a372d1461046757806362b72cf51461046f57610227565b806337c8dab9116101fa57806337c8dab9146103b9578063389f4f71146103f85780633dffc3871461041257806343756e5c14610430578063493279b11461043857610227565b80630bee7a671461022c5780631182b8751461024d57806323bac5a21461033a57806335aa2e4414610380575b600080fd5b610234610701565b6040805163ffffffff9092168252519081900360200190f35b6102c56004803603604081101561026357600080fd5b60ff8235169190810190604081016020820135600160201b81111561028757600080fd5b82018360208201111561029957600080fd5b803590602001918460018302840111600160201b831117156102ba57600080fd5b509092509050610706565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103606004803603602081101561035057600080fd5b50356001600160a01b03166107da565b604080519384526020840192909252151582820152519081900360600190f35b61039d6004803603602081101561039657600080fd5b50356107fd565b604080516001600160a01b039092168252519081900360200190f35b6103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610824565b6040805192835260208301919091528051918290030190f35b61040061087b565b60408051918252519081900360200190f35b61041a610881565b6040805160ff9092168252519081900360200190f35b61039d610886565b61044061088c565b6040805161ffff9092168252519081900360200190f35b61041a610891565b61039d610896565b61040061089c565b6104006108a2565b61039d6108a8565b61041a6108ae565b61039d6108b3565b6104006108b9565b61041a6108be565b610517600480360360408110156104b557600080fd5b60ff8235169190810190604081016020820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460018302840111600160201b8311171561050c57600080fd5b5090925090506108c3565b005b61041a610a1e565b610400610a23565b61039d610a2e565b61039d610a34565b610541610a3a565b604080519115158252519081900360200190f35b610234610a43565b610400610a48565b6105176004803603604081101561057b57600080fd5b810190602081018135600160201b81111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111600160201b831117156105c857600080fd5b919390929091602081019035600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460018302840111600160201b8311171561061857600080fd5b509092509050610a4d565b610400610e3b565b61039d610e40565b6105176004803603604081101561064957600080fd5b60ff8235169190810190604081016020820135600160201b81111561066d57600080fd5b82018360208201111561067f57600080fd5b803590602001918460018302840111600160201b831117156106a057600080fd5b509092509050610e46565b610517600480360360208110156106c157600080fd5b50356001600160a01b0316610ef9565b61039d61131e565b610517611324565b61039d611395565b61041a61139b565b6105176113a0565b61039d61182b565b606481565b606033612000146107485760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff1661078d576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061080a57fe5b6000918252602090912001546001600160a01b0316905081565b60008061082f612146565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606081565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b33612000146109035760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610948576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b610950612169565b600061099184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183192505050565b9150915080156109db5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a17565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610a92576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b3361100714610ad25760405162461bcd60e51b815260040180806020018281038252602e81526020018061220d602e913960400191505060405180910390fd5b610b3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506118b19050565b15610c165760208114610b815760405162461bcd60e51b81526004018080602001828103825260278152602001806121b66027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610bbf9185858083850183828082843760009201919091525061199992505050565b905060018110158015610bd3575060055481105b610c0e5760405162461bcd60e51b815260040180806020018281038252602581526020018061225d6025913960400191505060405180910390fd5b600455610da9565b610c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506118b19050565b15610d6c5760208114610cc05760405162461bcd60e51b815260040180806020018281038252602281526020018061223b6022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610cfe9185858083850183828082843760009201919091525061199992505050565b90506103e88111158015610d13575060045481115b610d64576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610da9565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b3361200014610e865760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610ecb576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610f375760405162461bcd60e51b815260040180806020018281038252602d8152602001806122b1602d913960400191505060405180910390fd5b60005460ff16610f7c576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6003544311610fd2576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a1561101c576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b611024612146565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061107f5760208101805160010190526110d8565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526005546020820151816110ea57fe5b0661123c57600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6111718561199e565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111d15781810151838201526020016111b9565b50505050905090810190601f1680156111fe5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506112b2565b60045481602001518161124b57fe5b066112b257604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505043600355565b61100381565b60005460ff161561137c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146113e05760405162461bcd60e51b81526004018080602001828103825260308152602001806121dd6030913960400191505060405180910390fd5b60005460ff16611425576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b60015461143157611829565b600154600090600019015b8082116117fd576000805b8284101561156057611457612146565b600260006001878154811061146857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561154a576004600554816114d557fe5b048160200151038160200181815250508060026000600188815481106114f757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611554565b6001925050611560565b50600190930192611447565b8284116116f75761156f612146565b600260006001868154811061158057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611668576004600554816115ed57fe5b0481602001510381602001818152505080600260006001878154811061160f57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506116f79050565b600260006001868154811061167957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806116bd57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836116ea57506116f7565b5060001990920191611560565b8180156117015750805b156117e057600260006001868154811061171757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061175e57fe5b600091825260209091200154600180546001600160a01b03909216918690811061178457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806117bd57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826117ec5750506117fd565b50506001909101906000190161143c565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b611839612169565b6000611843612169565b61184b61217b565b61185c61185786611a70565b611a95565b90506000805b61186b83611adf565b156118a457806118975761188661188184611b00565b611b4e565b63ffffffff1684526001915061189c565b6118a4565b600101611862565b5091935090915050915091565b6000816040516020018082805190602001908083835b602083106118e65780518252601f1990920191602091820191016118c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106119545780518252601f199092019160209182019101611935565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816119b95790505090506119e2836001600160a01b0316611c05565b816000815181106119ef57fe5b6020026020010181905250611a0343611c28565b81600181518110611a1057fe5b6020908102919091010152611a256060611c28565b81600281518110611a3257fe5b6020026020010181905250611a4642611c28565b81600381518110611a5357fe5b6020026020010181905250611a6781611c3b565b9150505b919050565b611a7861219b565b506040805180820190915281518152602082810190820152919050565b611a9d61217b565b611aa682611cc5565b611aaf57600080fd5b6000611abe8360200151611cff565b60208085015160408051808201909152868152920190820152915050919050565b6000611ae961219b565b505080518051602091820151919092015191011190565b611b0861219b565b611b1182611adf565b611b1a57600080fd5b60208201516000611b2a82611d62565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611b6357508151602110155b611b6c57600080fd5b6000611b7b8360200151611cff565b90508083600001511015611bd6576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611bfc57826020036101000a820491505b50949350505050565b60408051600560a21b8318601482015260348101909152606090611a6781611e95565b6060611993611c3683611eeb565b611e95565b6060815160001415611c5c5750604080516000815260208101909152611a6b565b606082600081518110611c6b57fe5b602002602001015190506000600190505b8351811015611cac57611ca282858381518110611c9557fe5b6020026020010151611fd1565b9150600101611c7c565b50611a67611cbf825160c060ff1661204e565b82611fd1565b8051600090611cd657506000611a6b565b6020820151805160001a9060c0821015611cf557600092505050611a6b565b5060019392505050565b8051600090811a6080811015611d19576000915050611a6b565b60b8811080611d34575060c08110801590611d34575060f881105b15611d43576001915050611a6b565b60c0811015611d575760b519019050611a6b565b60f519019050611a6b565b80516000908190811a6080811015611d7d5760019150611e8e565b60b8811015611d9257607e1981019150611e8e565b60c0811015611e0c57600060b78203600186019550806020036101000a865104915060018101820193505080831015611e06576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611e8e565b60f8811015611e215760be1981019150611e8e565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611e8c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b606081516001148015611ec75750607f60f81b82600081518110611eb557fe5b01602001516001600160f81b03191611155b15611ed3575080611a6b565b611993611ee58351608060ff1661204e565b83611fd1565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f2f57506018611f53565b6fffffffffffffffffffffffffffffffff198416611f4f57506010611f53565b5060005b6020811015611f8957818181518110611f6857fe5b01602001516001600160f81b03191615611f8157611f89565b600101611f53565b60008160200390506060816040519080825280601f01601f191660200182016040528015611fbe576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612002578051835260209283019201611fea565b50855184518101855292509050808201602086015b8183101561202f578051835260209283019201612017565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061209e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116120f85782840160f81b816000815181106120da57fe5b60200101906001600160f81b031916908160001a9053509050611993565b606061210385611eeb565b90508381510160370160f81b8260008151811061211c57fe5b60200101906001600160f81b031916908160001a90535061213d8282611fd1565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061218e61219b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a26469706673582212204ff575d7be356d691e7b7eae41716a4ccc366ec84f8235486e935261df61a18a64736f6c63430006040033", + }, + { + ContractAddr: SystemRewardContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a8602b913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f64a2646970667358221220d0a7618a32d393c0757994fad066c9aaf7342a982498e0748019ec232f5dc86764736f6c63430006040033", + }, + { + ContractAddr: LightClientContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139b565b61027f6113b6565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bc565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113e0565b61052a611422565b6106656115c9565b604080516001600160401b039092168252519081900360200190f35b6106656115d8565b6102d26115ee565b61027f61160d565b610261611613565b61027f611618565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b606081565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e815260200180611c0a602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061161e9050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611ba9602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170592505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611c38602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611c676026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611867565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e5957506003546001600160401b0390811690831610155b15610f3a5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f2a5780601f10610eff57610100808354040283529160200191610f2a565b820191906000526020600020905b815481529060010190602001808311610f0d57829003601f168201915b5050505050815250509050610e28565b6060810151516110315780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b505050506060830182905250516110315760405162461bcd60e51b8152600401808060200182810382526021815260200180611b886021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611070576020820181803683370190505b509050600061107e8261170a565b905061108c84868386611710565b6110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806119456023913960400191505060405180910390fd5b6000838201915061110d8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177c92505050565b9450905061111c818386611786565b8251602001935061112b61188d565b6110008186866064600019fa61114057600080fd5b805194506000600160f81b8616156111cf5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b505050506040513d60208110156111cc57600080fd5b50505b856001600160401b0316955060208201935060006111ef858884156117c7565b90985090506001600160401b03808216908c161461123e5760405162461bcd60e51b8152600401808060200182810382526033815260200180611bd76033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c59260038501929101906118ac565b50506003546001600160401b03600160401b9091048116908d161115905061130d576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141c57506003546001600160401b038381169116145b92915050565b60005460ff161561147a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b6000806114a16040518061024001604052806102208152602001611968610220913961177c565b815160045590925090506114b3611867565b60006114c1848460006117c7565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152d9260038501929101906118ac565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b6040518061024001604052806102208152602001611968610220913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b602083106116535780518252601f199092019160209182019101611634565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116c15780518252601f1990920191602091820191016116a2565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061172e876060015161177c565b909250905061173e828683611786565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a6578251825260209283019290910190601f1901611787565b915181516020939093036101000a6000190180199091169216919091179052565b6117cf611867565b60088401516028850151604890950180519095600092916117ee611867565b6020810183905260408101829052866118595760008060688a036040519080825280601f01601f191660200182016040528015611832576020820181803683370190505b50606084018190526118439061177c565b909250905061185660208c018383611786565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118ed57805160ff191683800117855561191a565b8280016001018555821561191a579182015b8281111561191a5782518255916020019190600101906118ff565b5061192692915061192a565b5090565b6107e391905b80821115611926576000815560010161193056fe6661696c656420746f2073657269616c697a6520636f6e73656e73757320737461746542696e616e63652d436861696e2d4e696c6500000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000089496eba7b813d8eb37621a6983f05e98801eff557b3ba1c79872f27db06bb8ab4a3dfe007b6270d81a63acbb4432a0fc884fee651e4fbc4c40150d8f99c43f5000000e8d4a51000cad7bd770c1dd0397e33e9d9d3add62d34abd8a30dc5b616525baaaf8df417d6000000e8d4a5100034044e0606196391d09dffeb7671a2a2be43abe37f684ef406545660882e2d0b000000e8d4a5100073e0b195030b79529b8fedd12106ab9523ba23b1510c9bc0cead1d8265dc05c0000000e8d4a5100045356ac26abb1ca953a2bdf0e28229f70b2c1c7b85f837f072cc604d0d4779d5000000e8d4a510003b22dfb3b0d3764283106bc93fd24b5f4ee1a955f04e36ce5da6a014d1dcd18b000000e8d4a51000ae4ccacf75b148552a3a5bd5b410ee4381a288d44895218246e4762d5e8dfff4000000e8d4a5100071559e8cb1d83cad1db470e29fc45fa1c42724820545166b49a72ab2ba223dd2000000e8d4a51000319dac1531d185b9f4542749cd115af5970c717cee23d730dd98737de4fbcc89000000e8d4a5100078a98a1177c61a44306387dd986f056d3460ae8bf05980b3c20e5c5ddd81ca6e000000e8d4a51000df33205d0974d06f3f5d32e6fd98e5debd7ec39a796455f93c63aeef0dadb31a000000e8d4a510006661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a264697066735822122083e44fd9d22eaf3b42c9fd118b0a6cfa12136f8079295814965549488d9c308064736f6c63430006040033", + }, + { + ContractAddr: TokenHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e5908146109c9578063fd6a687914610ce6578063ff9c0027146107c757610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063dc6f5e90116100d1578063dc6f5e90146109c9578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063a7c9f02d11610164578063ac4317511161013e578063ac43175114610a3a578063b770186114610b05578063b99328c514610b1a578063b9fd21e314610b5357610366565b8063a7c9f02d146109c9578063aa7415f5146109de578063ab51bb9614610a2557610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a5cd588b14610981578063a78abc16146109b457610366565b80635d499b1b1161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105b25780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b80635d499b1b14610671578063613684751461036b5780636e056520146106865780636e47b482146107b257806370fd5bad146107c757806371d30863146107dc57610366565b806343756e5c116102d75780634bf6c882116102b15780634bf6c8821461036b57806350432d321461061d57806351e806721461063257806359b927891461064757610366565b806343756e5c146105c757806343a368b9146105dc578063493279b1146105f157610366565b8063077b8f351461036b5780630bee7a67146103965780631182b875146103c4578063149d14d9146104be5780633d713223146104e55780633dffc387146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805160ff9092168252519081900360200190f35b3480156103a257600080fd5b506103ab610d00565b6040805163ffffffff9092168252519081900360200190f35b3480156103d057600080fd5b50610449600480360360408110156103e757600080fd5b60ff8235169190810190604081016020820135600160201b81111561040b57600080fd5b82018360208201111561041d57600080fd5b803590602001918460018302840111600160201b8311171561043e57600080fd5b509092509050610d05565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048357818101518382015260200161046b565b50505050905090810190601f1680156104b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ca57600080fd5b506104d3610e33565b60408051918252519081900360200190f35b3480156104f157600080fd5b506105966004803603602081101561050857600080fd5b810190602081018135600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e39945050505050565b604080516001600160a01b039092168252519081900360200190f35b3480156105be57600080fd5b50610380610e5d565b3480156105d357600080fd5b50610596610e62565b3480156105e857600080fd5b506104d3610e68565b3480156105fd57600080fd5b50610606610e74565b6040805161ffff9092168252519081900360200190f35b34801561062957600080fd5b506104d3610e79565b34801561063e57600080fd5b50610596610e84565b34801561065357600080fd5b506105966004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104d3610ea5565b61079e6004803603608081101561069c57600080fd5b810190602081018135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b919390929091602081019035600160201b81111561070657600080fd5b82018360208201111561071857600080fd5b803590602001918460208302840111600160201b8311171561073957600080fd5b919390929091602081019035600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b91935091503567ffffffffffffffff16610eae565b604080519115158252519081900360200190f35b3480156107be57600080fd5b50610596611383565b3480156107d357600080fd5b50610380611389565b3480156107e857600080fd5b506104d361138e565b3480156107fd57600080fd5b50610596611394565b34801561081257600080fd5b5061038061139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061038061156e565b34801561090057600080fd5b506104d3611573565b34801561091557600080fd5b506104d36004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b506105966116bd565b34801561096357600080fd5b506105966116c3565b34801561097857600080fd5b506103806116c9565b34801561098d57600080fd5b506104d3600480360360208110156109a457600080fd5b50356001600160a01b03166116ce565b3480156109c057600080fd5b5061079e6116e0565b3480156109d557600080fd5b506103806116e9565b61079e600480360360808110156109f457600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116ee565b348015610a3157600080fd5b506103ab6116c9565b348015610a4657600080fd5b5061036460048036036040811015610a5d57600080fd5b810190602081018135600160201b811115610a7757600080fd5b820183602082011115610a8957600080fd5b803590602001918460018302840111600160201b83111715610aaa57600080fd5b919390929091602081019035600160201b811115610ac757600080fd5b820183602082011115610ad957600080fd5b803590602001918460018302840111600160201b83111715610afa57600080fd5b509092509050611daf565b348015610b1157600080fd5b506104d361201e565b348015610b2657600080fd5b5061036460048036036040811015610b3d57600080fd5b50803590602001356001600160a01b0316612024565b348015610b5f57600080fd5b506104d361209a565b348015610b7457600080fd5b506104d360048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b506105966120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b50610596612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061038061223b565b348015610c8057600080fd5b50610380612240565b348015610c9557600080fd5b50610596612245565b348015610caa57600080fd5b506104d361224b565b348015610cbf57600080fd5b5061044960048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b50610596612378565b600881565b606481565b60005460609060ff16610d4d576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b3361200014610d8d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff841660021415610ddf57610dd883838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e2c565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606081565b662386f26fc1000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610ef4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b868514610f325760405162461bcd60e51b815260040180806020018281038252603b815260200180614732603b913960400191505060405180910390fd5b868314610f705760405162461bcd60e51b815260040180806020018281038252603f815260200180614605603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fbc5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156110005760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611033578160200160208202803683370190505b50905060005b8481101561110e576402540be4008b8b8381811061105357fe5b905060200201358161106157fe5b061561109e5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6110c38b8b838181106110ad57fe5b90506020020135856124a290919063ffffffff16565b93506110ef6402540be4008c8c848181106110da57fe5b905060200201356124fc90919063ffffffff16565b8282815181106110fb57fe5b6020908102919091010152600101611039565b5060015461113390611126908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111715760405162461bcd60e51b81526004018080602001828103825260568152602001806147df6056913960600191505060405180910390fd5b611181348463ffffffff61259716565b915061118b61434e565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d7600361124f846125d9565b611264876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c25781810151838201526020016112aa565b50505050905090810190601f1680156112ef5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614468602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60026020526000908152604090205481565b60005460ff1681565b600381565b6000805460ff16611734576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156117805760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156117c45760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b600080806001600160a01b0388166118a3576001546117ea90879063ffffffff6124a216565b3410156118285760405162461bcd60e51b815260040180806020018281038252606181526020018061457f6061913960800191505060405180910390fd5b6402540be40086061561186c5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b61187c348763ffffffff61259716565b9050611893866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b46565b6001600160a01b0388166000908152600360205260409020549250826118fa5760405162461bcd60e51b815260040180806020018281038252603181526020018061454e6031913960400191505060405180910390fd5b60015434101561193b5760405162461bcd60e51b815260040180806020018281038252603f8152602001806146a1603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061198657506008811180156119865750611984876007198301600a0a63ffffffff6128f016565b155b6119c15760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6119cb8782612932565b92506119d684612972565b15611a1e576305f5e100831015611a1e5760405162461bcd60e51b815260040180806020018281038252603a815260200180614497603a913960400191505060405180910390fd5b600881101580611a385750600881108015611a3857508683115b611a735760405162461bcd60e51b81526004018080602001828103825260258152602001806145e06025913960400191505060405180910390fd5b677ce66c50e2840000831115611aba5760405162461bcd60e51b81526004018080602001828103825260358152602001806145196035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050506040513d6020811015611b3957600080fd5b5051611b4457600080fd5b505b611b4e61434e565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bfc57fe5b602002602001018181525050878160600151600081518110611c1a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c4c57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c77846125d9565b611c8c866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cea578181015183820152602001611cd2565b50505050905090810190601f168015611d175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d3857600080fd5b505af1158015611d4c573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611def5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146e0602e913960400191505060405180910390fd5b60208114611e44576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f4c576020820151670de0b6b3a76400008111801590611ef357506402540be4008106155b611f44576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f89565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61c35081565b33611008146120645760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b662386f26fc1000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b606061238861439a565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143cf565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e58565b50506040805160008152602081019091529150610e589050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146806021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143f6565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b815260040180806020018281038252602481526020018061470e6024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600860ff82161015612a0057600092505050610e58565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e58565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e58565b5060019392505050565b612a8061434e565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612ad36143f6565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613bc6565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e61439a565b6000612b8861439a565b612b9061442d565b612ba1612b9c86613bff565b613c24565b90506000805b612bb083613c6e565b15612ca85780612bd257612bcb612bc684613c8f565b613cdd565b8452612ca0565b8060011415612bff57612bec612be784613c8f565b613d94565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c8f565b6040850152612ca0565b8060031415612c4657612c33612be784613c8f565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c8f565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c8f565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e58565b8160400151471015612cfc57506003610e58565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e58565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e58565b8160a0015167ffffffffffffffff16421115612e0a57506001610e58565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e58565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e58565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e589050565b5060059150610e589050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2c81613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613dae565b613e94565b60408051600560a21b8318601482015260348101909152606090610e2c81613e94565b60608151600014156132315750604080516000815260208101909152610e58565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ee6565b9150600101613251565b50610e2c613294825160c060ff16613f63565b82613ee6565b6132a26143f6565b60006132ac6143f6565b6132b461442d565b6132c0612b9c86613bff565b90506000805b6132cf83613c6e565b15612ca857806132f5576132e5612be784613c8f565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c8f565b61405b565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cdd565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c8f565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d94565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c8f565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b61395361434e565b600061395d61434e565b61396561442d565b613971612b9c86613bff565b90506000805b61398083613c6e565b15613bb8578061399d57613996612bc684613c8f565b8452613bb0565b80600114156139c5576139b2612be784613c8f565b6001600160a01b03166020850152613bb0565b8060021415613a545760606139dc61330c85613c8f565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613bb0565b8060031415613ae9576060613a6b61330c85613c8f565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c8f565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415613bab57613b93612bc684613c8f565b67ffffffffffffffff1660a085015260019150613bb0565b613bb8565b600101613977565b509195600195509350505050565b60006008821115613be857612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613c0761444d565b506040805180820190915281518152602082810190820152919050565b613c2c61442d565b613c358261412c565b613c3e57600080fd5b6000613c4d836020015161415c565b60208085015160408051808201909152868152920190820152915050919050565b6000613c7861444d565b505080518051602091820151919092015191011190565b613c9761444d565b613ca082613c6e565b613ca957600080fd5b60208201516000613cb9826141bf565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cf257508151602110155b613cfb57600080fd5b6000613d0a836020015161415c565b90508083600001511015613d65576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d8b57826020036101000a820491505b50949350505050565b8051600090601514613da557600080fd5b6116b782613cdd565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613df257506018613e16565b6fffffffffffffffffffffffffffffffff198416613e1257506010613e16565b5060005b6020811015613e4c57818181518110613e2b57fe5b01602001516001600160f81b03191615613e4457613e4c565b600101613e16565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ec65750607f60f81b82600081518110613eb457fe5b01602001516001600160f81b03191611155b15613ed2575080610e58565b6116b7613ee48351608060ff16613f63565b835b6060806040519050835180825260208201818101602087015b81831015613f17578051835260209283019201613eff565b50855184518101855292509050808201602086015b81831015613f44578051835260209283019201613f2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613fb3576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161400d5782840160f81b81600081518110613fef57fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061401885613dae565b90508381510160370160f81b8260008151811061403157fe5b60200101906001600160f81b031916908160001a9053506140528282613ee6565b95945050505050565b60606140668261412c565b61406f57600080fd5b600061407a836142f2565b90506060816040519080825280602002602001820160405280156140b857816020015b6140a561444d565b81526020019060019003908161409d5790505b50905060006140ca856020015161415c565b60208601510190506000805b84811015614121576140e7836141bf565b915060405180604001604052808381526020018481525084828151811061410a57fe5b6020908102919091010152918101916001016140d6565b509195945050505050565b805160009061413d57506000610e58565b6020820151805160001a9060c0821015612a6e57600092505050610e58565b8051600090811a6080811015614176576000915050610e58565b60b8811080614191575060c08110801590614191575060f881105b156141a0576001915050610e58565b60c08110156141b45760b519019050610e58565b60f519019050610e58565b80516000908190811a60808110156141da57600191506142eb565b60b88110156141ef57607e19810191506142eb565b60c081101561426957600060b78203600186019550806020036101000a865104915060018101820193505080831015614263576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142eb565b60f881101561427e5760be19810191506142eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061430357506000610e58565b60008090506000614317846020015161415c565b602085015185519181019250015b8082101561434557614336826141bf565b60019093019290910190614325565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061444061444d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220560ad3b1f9184c6b58a836a4c111faf5fdf5dc0e93dc1c013cd41cea18c69cbb64736f6c63430006040033", + }, + { + ContractAddr: RelayerIncentivizeContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "6080604052600436106102765760003560e01c80637e146cc51161014f578063af400681116100c1578063e75d72c71161007a578063e75d72c714610795578063e89a3020146107c8578063f9a2bbc7146107f2578063fc3e590814610807578063fd6a68791461081c578063fdd31fcd146108315761027d565b8063af400681146106ed578063bd4cc83014610717578063c81b166214610741578063dc927faf14610756578063dcae76ab1461076b578063e1c7392a146107805761027d565b8063a3c3c0ad11610113578063a3c3c0ad146105b3578063a78abc16146105c8578063a7c6a59d146105dd578063ab51bb96146105f2578063ac43175114610607578063ace9fcc2146106d85761027d565b80637e146cc51461052c578063930e1b091461054157806396713da9146105745780639dc0926214610589578063a1a11bf51461059e5761027d565b806343756e5c116101e85780636e47b482116101ac5780636e47b482146104645780636f93d2e61461047957806370fd5bad146104d857806374f2272d146104ed57806375d47a0a146105025780637942fd05146105175761027d565b806343756e5c146103e4578063493279b1146103f95780634bf6c8821461042557806351e806721461043a578063541333071461044f5761027d565b806312950c461161023a57806312950c46146103165780631b20087c1461032b5780631c643312146103405780633a975612146102825780633dffc3871461038657806340bb43c0146103b15761027d565b8063081e9d131461028257806308f2ec06146102a9578063093f2fc4146102be5780630bee7a67146102d357806310e06a76146103015761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610864565b60408051918252519081900360200190f35b3480156102b557600080fd5b50610297610869565b3480156102ca57600080fd5b5061029761086e565b3480156102df57600080fd5b506102e8610873565b6040805163ffffffff9092168252519081900360200190f35b34801561030d57600080fd5b50610297610878565b34801561032257600080fd5b5061029761087e565b34801561033757600080fd5b50610297610884565b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b503561088a565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b5061039b610864565b6040805160ff9092168252519081900360200190f35b3480156103bd57600080fd5b50610297600480360360208110156103d457600080fd5b50356001600160a01b03166108b1565b3480156103f057600080fd5b5061036a6108c3565b34801561040557600080fd5b5061040e6108c9565b6040805161ffff9092168252519081900360200190f35b34801561043157600080fd5b5061039b6108ce565b34801561044657600080fd5b5061036a6108d3565b34801561045b57600080fd5b50610297610873565b34801561047057600080fd5b5061036a6108d9565b34801561048557600080fd5b506104c46004803603608081101561049c57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108df565b604080519115158252519081900360200190f35b3480156104e457600080fd5b5061039b610cae565b3480156104f957600080fd5b50610297610cb3565b34801561050e57600080fd5b5061036a610cb9565b34801561052357600080fd5b5061039b610cbf565b34801561053857600080fd5b50610297610cc4565b34801561054d57600080fd5b506102976004803603602081101561056457600080fd5b50356001600160a01b0316610cc9565b34801561058057600080fd5b5061039b610cdb565b34801561059557600080fd5b5061036a610ce0565b3480156105aa57600080fd5b5061036a610ce6565b3480156105bf57600080fd5b50610297610cec565b3480156105d457600080fd5b506104c4610cf2565b3480156105e957600080fd5b50610297610cfb565b3480156105fe57600080fd5b506102e8610d01565b34801561061357600080fd5b506106d66004803603604081101561062a57600080fd5b81019060208101813564010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91939092909160208101903564010000000081111561069757600080fd5b8201836020820111156106a957600080fd5b803590602001918460018302840111640100000000831117156106cb57600080fd5b509092509050610d06565b005b3480156106e457600080fd5b50610297611355565b3480156106f957600080fd5b506102976004803603602081101561071057600080fd5b503561135b565b34801561072357600080fd5b506102976004803603602081101561073a57600080fd5b50356113b6565b34801561074d57600080fd5b5061036a6113cf565b34801561076257600080fd5b5061036a6113d5565b34801561077757600080fd5b506102976113db565b34801561078c57600080fd5b506106d66113e1565b3480156107a157600080fd5b506106d6600480360360208110156107b857600080fd5b50356001600160a01b03166114aa565b3480156107d457600080fd5b5061036a600480360360208110156107eb57600080fd5b5035611603565b3480156107fe57600080fd5b5061036a611610565b34801561081357600080fd5b5061039b611616565b34801561082857600080fd5b5061036a61161b565b34801561083d57600080fd5b506102976004803603602081101561085457600080fd5b50356001600160a01b0316611621565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b6006818154811061089757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606081565b600881565b61200081565b61100581565b6000805460ff16610937576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f815260200180612165602f913960400191505060405180910390fd5b600082156109fc57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050506040513d60208110156109f357600080fd5b50519050610a75565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a4657600080fd5b505af1158015610a5a573d6000803e3d6000fd5b505050506040513d6020811015610a7057600080fd5b505190505b600c805460010190556000610a8982611633565b600954909150610a9f908263ffffffff61166216565b600955600a54610ac7908290610abb908563ffffffff61166216565b9063ffffffff6116c316565b600a556001600160a01b038716600090815260056020526040902054610b3357600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610bb157600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c5460641415610ca157600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610c2c611705565b90506000610c386119e9565b6001600160a01b0389166000908152600d6020526040902054909150610c76908290610c6a908563ffffffff61166216565b9063ffffffff61166216565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610d465760405162461bcd60e51b815260040180806020018281038252602e8152602001806120aa602e913960400191505060405180910390fd5b60005460ff16610d875760405162461bcd60e51b81526004018080602001828103825260218152602001806120d86021913960400191505060405180910390fd5b610dfb84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611c679050565b15610ec85760208114610e3f5760405162461bcd60e51b81526004018080602001828103825260328152602001806121946032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610e7d91858580838501838280828437600092019190915250611d4e92505050565b9050600254811115610ec05760405162461bcd60e51b8152600401808060200182810382526060815260200180611f836060913960600191505060405180910390fd5b6001556112c3565b610f2184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506120886020830139611c67565b15610ff95760208114610f655760405162461bcd60e51b815260040180806020018281038252602e815260200180612039602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fa391858580838501838280828437600092019190915250611d4e92505050565b90508015801590610fb657506001548110155b610ff15760405162461bcd60e51b815260040180806020018281038252606c8152602001806120f9606c913960800191505060405180910390fd5b6002556112c3565b61106d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611c679050565b1561113a57602081146110b15760405162461bcd60e51b815260040180806020018281038252602e815260200180612039602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110ef91858580838501838280828437600092019190915250611d4e92505050565b90506004548111156111325760405162461bcd60e51b8152600401808060200182810382526056815260200180611fe36056913960600191505060405180910390fd5b6003556112c3565b6111ae84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611c679050565b1561128657602081146111f25760405162461bcd60e51b815260040180806020018281038252602e815260200180612039602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161123091858580838501838280828437600092019190915250611d4e92505050565b9050801580159061124357506003548110155b61127e5760405162461bcd60e51b8152600401808060200182810382526061815260200180611f226061913960800191505060405180910390fd5b6004556112c3565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161136c5750806113b1565b81602810801561137d575060508211155b1561138a575060286113b1565b60508211801561139b5750606e8211155b156113ab575060788190036113b1565b50600481045b919050565b6000602882116113c75750806113b1565b5060286113b1565b61100281565b61100381565b60095481565b60005460ff1615611439576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611487576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480611509576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506115b95760405161100290819084156108fc029085906000818181858888f19350505050158015611573573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a1505050611600565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061089757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600061165c60025461165060015485611d5390919063ffffffff16565b9063ffffffff611dac16565b92915050565b6000828201838110156116bc576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006116bc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611dee565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561176157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611743575b5050505050905060608151604051908082528060200260200182016040528015611795578160200160208202803683370190505b50905060005b82518110156118225760008382815181106117b257fe5b6020026020010151905060006117ec60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546113b6565b9050808484815181106117fb57fe5b6020908102919091010152611816868263ffffffff61166216565b9550505060010161179b565b50600061184060045461165060035488611d5390919063ffffffff16565b9050611852858263ffffffff6116c316565b94508460015b845181101561192957600061188d876116508a88868151811061187757fe5b6020026020010151611d5390919063ffffffff16565b90506118da81600d60008986815181106118a357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461166290919063ffffffff16565b600d60008885815181106118ea57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205561191e838263ffffffff6116c316565b925050600101611858565b5061193f81600d6000876000815181106118a357fe5b600d60008660008151811061195057fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b84518110156119d157600560008683815181106119a357fe5b6020908102919091018101516001600160a01b0316825281019190915260400160009081205560010161198a565b506119de60066000611eea565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611a4557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a27575b5050505050905060608151604051908082528060200260200182016040528015611a79578160200160208202803683370190505b50905060005b8251811015611af8576000838281518110611a9657fe5b602002602001015190506000611ad060076000846001600160a01b03166001600160a01b031681526020019081526020016000205461135b565b905080848481518110611adf57fe5b6020908102919091010152949094019350600101611a7f565b506000611b1660045461165060035488611d5390919063ffffffff16565b9050611b28858263ffffffff6116c316565b94508460015b8451811015611bb2576000611b4d876116508a88868151811061187757fe5b9050611b6381600d60008986815181106118a357fe5b600d6000888581518110611b7357fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611ba7838263ffffffff6116c316565b925050600101611b2e565b50611bc881600d6000876000815181106118a357fe5b600d600086600081518110611bd957fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611c5a5760076000868381518110611c2c57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611c13565b506119de60086000611eea565b6000816040516020018082805190602001908083835b60208310611c9c5780518252601f199092019160209182019101611c7d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611d0a5780518252601f199092019160209182019101611ceb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611d625750600061165c565b82820282848281611d6f57fe5b04146116bc5760405162461bcd60e51b81526004018080602001828103825260218152602001806120676021913960400191505060405180910390fd5b60006116bc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e85565b60008184841115611e7d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e42578181015183820152602001611e2a565b50505050905090810190601f168015611e6f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611ed45760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e42578181015183820152602001611e2a565b506000838581611ee057fe5b0495945050505050565b508054600082559060005260206000209081019061160091906119e691905b80821115611f1d5760008155600101611f09565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a26469706673582212209942fb859157a9a570f5d4a9dbba6573b75155e0372793b0dd76c49a6ff6fbbb64736f6c63430006040033", + }, + { + ContractAddr: RelayerHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b5061021461077d565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610782565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b50610270610788565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b5061021461078d565b3480156102a857600080fd5b5061023f610792565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b0316610798565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d6107b6565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f6107bc565b34801561034057600080fd5b506102146107c2565b34801561035557600080fd5b5061023f6107c7565b34801561036a57600080fd5b506102146107cd565b34801561037f57600080fd5b5061030d6107d2565b34801561039457600080fd5b5061030d6107df565b3480156103a957600080fd5b506102146107eb565b3480156103be57600080fd5b5061023f6107f0565b3480156103d357600080fd5b5061023f6107f6565b3480156103e857600080fd5b506102e46107fc565b3480156103fd57600080fd5b506101dc610805565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b50909250905061080a565b3480156104e157600080fd5b5061023f610c2c565b3480156104f657600080fd5b5061023f610c32565b34801561050b57600080fd5b506101fd610c38565b34801561052057600080fd5b506101fd610cba565b34801561053557600080fd5b5061023f610e73565b34801561054a57600080fd5b5061030d610e79565b34801561055f57600080fd5b50610214610e7f565b34801561057457600080fd5b5061023f610e84565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e8a565b156106775760405162461bcd60e51b815260040180806020018281038252602781526020018061109c6027913960400191505060405180910390fd5b3332146106c1576040805162461bcd60e51b81526020600482015260136024820152721b9bc81c1c9bde1e481a5cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60015434146107015760405162461bcd60e51b81526004018080602001828103825260258152602001806110776025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661085d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461089d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110c3602e913960400191505060405180910390fd5b61090384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e909050565b15610a0657602081146109475760405162461bcd60e51b81526004018080602001828103825260228152602001806110f16022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161098591858580838501838280828437600092019190915250610f7792505050565b90506001811180156109a05750683635c9adc5dea000008111155b80156109ad575060025481115b6109fe576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b9a565b610a6184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e909050565b15610b5d5760208114610abb576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610af991858580838501838280828437600092019190915250610f7792505050565b9050600081118015610b0c575060015481105b610b55576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b9a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c90576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610d15576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d68576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d7061105c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610db4919063ffffffff610f7c16565b6040518115909202916000818181858888f19350505050158015610ddc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610e12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610ec55780518252601f199092019160209182019101610ea6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610f335780518252601f199092019160209182019101610f14565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6000610fbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610fc5565b9392505050565b600081848411156110545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611019578181015183820152602001611001565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a264697066735822122011778451ed6d3e3757ce2e74acfc7fa17bf5d16f07168a6ce073d7c91e583c8c64736f6c63430006040033", + }, + { + ContractAddr: GovHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610667565b61019b61066c565b6102d1610671565b6102d1610677565b6103e861067d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610686565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061068c565b6102d1610703565b6102d1610709565b6102b361070f565b6102d1610714565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6104f5611382565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061071a92505050565b91509150806105525761054960646107e0565b92505050610593565b600061055d8361084a565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d816107e0565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606081565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b33612000146106155760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b33612000146106cc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114166023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b610722611382565b600061072c611382565b6107346113ac565b61074561074086610beb565b610c10565b90506000805b61075483610c5a565b156107d357806107765761076f61076a84610c7b565b610cc9565b84526107cb565b80600114156107955761078b61076a84610c7b565b60208501526107cb565b80600214156107c6576107af6107aa84610c7b565b610d42565b6001600160a01b03166040850152600191506107cb565b6107d3565b60010161074b565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816107fa5790505090506108208363ffffffff16610d62565b8160008151811061082d57fe5b602002602001018190525061084181610d75565b9150505b919050565b60006108598260400151610dff565b6108c557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610845565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561093257818101518382015260200161091a565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561099257818101518382015260200161097a565b50505050905090810190601f1680156109bf5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109e057600080fd5b505af19250505080156109f1575060015b610be3576040516000815260443d1015610a0d57506000610aaa565b60046000803e60005160e01c6308c379a08114610a2e576000915050610aaa565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a5a57600092505050610aaa565b808301805167ffffffffffffffff811115610a7c576000945050505050610aaa565b8060208301013d8601811115610a9a57600095505050505050610aaa565b601f01601f191660405250925050505b80610ab55750610b58565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b14578181015183820152602001610afc565b50505050905090810190601f168015610b415780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610845565b3d808015610b82576040519150601f19603f3d011682016040523d82523d6000602084013e610b87565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b14578181015183820152602001610afc565b506000919050565b610bf36113cc565b506040805180820190915281518152602082810190820152919050565b610c186113ac565b610c2182610e05565b610c2a57600080fd5b6000610c398360200151610e3f565b60208085015160408051808201909152868152920190820152915050919050565b6000610c646113cc565b505080518051602091820151919092015191011190565b610c836113cc565b610c8c82610c5a565b610c9557600080fd5b60208201516000610ca582610ea2565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610cd757600080fd5b6000610ce68360200151610e3f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d1d576020820181803683370190505b5090506000816020019050610d39848760200151018285610fd5565b50949350505050565b8051600090601514610d5357600080fd5b610d5c82611020565b92915050565b6060610d5c610d70836110d5565b6111bb565b6060815160001415610d965750604080516000815260208101909152610845565b606082600081518110610da557fe5b602002602001015190506000600190505b8351811015610de657610ddc82858381518110610dcf57fe5b602002602001015161120d565b9150600101610db6565b50610841610df9825160c060ff1661128a565b8261120d565b3b151590565b8051600090610e1657506000610845565b6020820151805160001a9060c0821015610e3557600092505050610845565b5060019392505050565b8051600090811a6080811015610e59576000915050610845565b60b8811080610e74575060c08110801590610e74575060f881105b15610e83576001915050610845565b60c0811015610e975760b519019050610845565b60f519019050610845565b80516000908190811a6080811015610ebd5760019150610fce565b60b8811015610ed257607e1981019150610fce565b60c0811015610f4c57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f46576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50610fce565b60f8811015610f615760be1981019150610fce565b600060f78203600186019550806020036101000a865104915060018101820193505080831015610fcc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80610fdf57610662565b5b60208110610fff578251825260209283019290910190601f1901610fe0565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061103557508151602110155b61103e57600080fd5b600061104d8360200151610e3f565b905080836000015110156110a8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d3957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166111195750601861113d565b6fffffffffffffffffffffffffffffffff1984166111395750601061113d565b5060005b60208110156111735781818151811061115257fe5b01602001516001600160f81b0319161561116b57611173565b60010161113d565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111a8576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156111ed5750607f60f81b826000815181106111db57fe5b01602001516001600160f81b03191611155b156111f9575080610845565b610d5c61120b8351608060ff1661128a565b835b6060806040519050835180825260208201818101602087015b8183101561123e578051835260209283019201611226565b50855184518101855292509050808201602086015b8183101561126b578051835260209283019201611253565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106112da576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113345782840160f81b8160008151811061131657fe5b60200101906001600160f81b031916908160001a9053509050610d5c565b606061133f856110d5565b90508381510160370160f81b8260008151811061135857fe5b60200101906001600160f81b031916908160001a905350611379828261120d565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b60405180604001604052806113bf6113cc565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220ea2b2b402a564a222b3f3e7c0f671622652543c9c5f6cb6c7b8db265ae9ebe4564736f6c63430006040033", + }, + { + ContractAddr: TokenManagerContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "6080604052600436106102465760003560e01c806375d47a0a11610139578063ab51bb96116100b6578063dc6f5e901161007a578063dc6f5e90146108df578063dc927faf14610975578063f9a2bbc71461098a578063fc3e5908146108df578063fd6a68791461099f578063fe3a2af5146104fd57610246565b8063ab51bb96146108b5578063c81b1662146108ca578063c8509d81146107c5578063c8e704a4146108df578063d117a110146108f457610246565b806395b9ad26116100fd57806395b9ad261461084c57806396713da9146108615780639dc0926214610876578063a1a11bf51461088b578063a78abc16146108a057610246565b806375d47a0a146106e757806377d9dae8146106fc5780637942fd05146107b05780637d078e13146103c8578063831d65d1146107c557610246565b80634a688818116101c75780635f558f861161018b5780635f558f86146105515780636b3f1307146105665780636e47b4821461062e57806370fd5bad1461055157806372c4e0861461064357610246565b80634a688818146104fd5780634bc81c00146105125780634bf6c8821461024b57806351e80672146105275780635d499b1b1461053c57610246565b806323996b531161020e57806323996b53146103c85780633dffc387146103c857806343756e5c146103dd578063445fcefe1461040e578063493279b1146104d157610246565b8063077b8f351461024b5780630bee7a67146102765780630f212b1b146102a45780631182b875146102b95780631f91600b146103b3575b600080fd5b34801561025757600080fd5b506102606109b4565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b5061028b6109b9565b6040805163ffffffff9092168252519081900360200190f35b3480156102b057600080fd5b506102606109be565b3480156102c557600080fd5b5061033e600480360360408110156102dc57600080fd5b60ff8235169190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460018302840111600160201b8311171561033357600080fd5b5090925090506109c3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610378578181015183820152602001610360565b50505050905090810190601f1680156103a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103bf57600080fd5b50610260610a4c565b3480156103d457600080fd5b50610260610a51565b3480156103e957600080fd5b506103f2610a56565b604080516001600160a01b039092168252519081900360200190f35b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a5c945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610bbb565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b50610260610bc0565b34801561051e57600080fd5b50610260610bc5565b34801561053357600080fd5b506103f2610bca565b34801561054857600080fd5b506104bf610bd0565b34801561055d57600080fd5b50610260610bd9565b61061a6004803603604081101561057c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111600160201b831117156105d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bde945050505050565b604080519115158252519081900360200190f35b34801561063a57600080fd5b506103f2611460565b61061a6004803603602081101561065957600080fd5b810190602081018135600160201b81111561067357600080fd5b82018360208201111561068557600080fd5b803590602001918460018302840111600160201b831117156106a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611466945050505050565b3480156106f357600080fd5b506103f26118b4565b61061a6004803603604081101561071257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118ba945050505050565b3480156107bc57600080fd5b50610260611dc1565b3480156107d157600080fd5b5061084a600480360360408110156107e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b509092509050611dc6565b005b34801561085857600080fd5b50610260611e79565b34801561086d57600080fd5b50610260611e7e565b34801561088257600080fd5b506103f2611e83565b34801561089757600080fd5b506103f2611e89565b3480156108ac57600080fd5b5061061a611e8f565b3480156108c157600080fd5b5061028b610bc0565b3480156108d657600080fd5b506103f2611e98565b3480156108eb57600080fd5b50610260611e9e565b34801561090057600080fd5b5061091e6004803603602081101561091757600080fd5b5035611ea3565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561098157600080fd5b506103f2611efb565b34801561099657600080fd5b506103f2611f01565b3480156109ab57600080fd5b506103f2611f07565b600881565b606481565b600681565b60603361200014610a055760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b610a4483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f0d92505050565b949350505050565b600481565b600181565b61100181565b6020810151600090610a6c613168565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610af457600092505050610bb6565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d6020811015610b7c57600080fd5b505160808301516060840151919250600091610b9d9163ffffffff61219e16565b9050610baf818363ffffffff61219e16565b9450505050505b919050565b606081565b600081565b600581565b61200081565b6402540be40081565b600281565b600080610bea836121e7565b9050610bf4613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610cba576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610cd78260800151836060015161219e90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610d2d5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610de15760405162461bcd60e51b815260040180806020018281038252602e815260200180613272602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610e2d57600080fd5b505afa158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610ee89184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50519063ffffffff6121ee16565b1015610f3b576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b50519050808210801590610fc057506402540be4008206155b610ffb5760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b6000611007868b612248565b905063ffffffff8116611206576001600160a01b038a166323b872dd33611004611037898963ffffffff61219e16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b15801561113257600080fd5b505af1158015611146573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111c55781810151838201526020016111ad565b50505050905090810190601f1680156111f25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26112be565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561128257818101518382015260200161126a565b50505050905090810190601f1680156112af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556113186131a4565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611360573d6000803e3d6000fd5b5061200063f7a251d760016113748461269f565b611389886402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113e75781810151838201526020016113cf565b50505050905090810190601f1680156114145780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561143557600080fd5b505af1158015611449573d6000803e3d6000fd5b505050506001985050505050505050505b92915050565b61100581565b600080611472836121e7565b905061147c613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611542576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff16106115a4576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e657600080fd5b505afa1580156115fa573d6000803e3d6000fd5b505050506040513d602081101561161057600080fd5b5051905080821080159061162957506402540be4008206155b6116645760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556116be6131a4565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611701573d6000803e3d6000fd5b5061200063f7a251d760016117158461269f565b61172a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611788578181015183820152602001611770565b50505050905090810190601f1680156117b55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561186c578181015183820152602001611854565b50505050905090810190601f1680156118995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806118c6836121e7565b90506118d0613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611996576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d6020811015611a5757600080fd5b50516001600160a01b031614611ab4576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703265206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d6020811015611b2057600080fd5b50519050808210801590611b3957506402540be4008206155b611b745760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611bce6131a4565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611c11573d6000803e3d6000fd5b5061200063f7a251d76001611c258461269f565b611c3a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c98578181015183820152602001611c80565b50505050905090810190601f168015611cc55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611d78578181015183820152602001611d60565b50505050905090810190601f168015611da55780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611e065760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600381565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611f17613168565b6000611f228461276b565b9150915080611f78576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff1661202c576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055612183565b815160ff16600114156121365760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208557600080fd5b505afa158015612099573d6000803e3d6000fd5b505050506040513d60208110156120af57600080fd5b505190506001600160a01b038116156121305760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561211757600080fd5b505af115801561212b573d6000803e3d6000fd5b505050505b50612183565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b60006121e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128bd565b9392505050565b6020015190565b6000828201838110156121e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d60208110156122ae57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561233357600080fd5b8101908080516040519392919084600160201b82111561235257600080fd5b90830190602082018581111561236757600080fd5b8251600160201b81118282018810171561238057600080fd5b82525081516020918201929091019080838360005b838110156123ad578181015183820152602001612395565b50505050905090810190601f1680156123da5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b5051608087015160608801519192506000916124759163ffffffff61219e16565b9050428760c0015167ffffffffffffffff16101561249b57506001935061145a92505050565b6124a9838860200151612954565b6124bb57506002935061145a92505050565b808211156124d157506003935061145a92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50511461255257506004935061145a92505050565b8660a0015160ff16841461256e57506005935061145a92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b1580156125b357600080fd5b505afa1580156125c7573d6000803e3d6000fd5b505050506040513d60208110156125dd57600080fd5b50516001600160a01b031614158061267f57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d602081101561267a57600080fd5b505114155b1561269257506006935061145a92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816126b857505083519091506126e09063ffffffff16612a3c565b816000815181106126ed57fe5b6020026020010181905250612708836020015160001c612a3c565b8160018151811061271557fe5b60200260200101819052506121e081612a4f565b60006121e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ad9565b612773613168565b600061277d613168565b6127856131bb565b61279661279186612b3e565b612b63565b90506000805b6127a583612bad565b156128b057806127ca576127c06127bb84612bce565b612c1c565b60ff1684526128a8565b80600114156127e9576127df6127bb84612bce565b60208501526128a8565b8060021415612816576128036127fe84612bce565b612cd1565b6001600160a01b031660408501526128a8565b80600314156128355761282b6127bb84612bce565b60608501526128a8565b80600414156128545761284a6127bb84612bce565b60808501526128a8565b8060051415612876576128696127bb84612bce565b60ff1660a08501526128a8565b80600614156128a35761288b6127bb84612bce565b67ffffffffffffffff1660c0850152600191506128a8565b6128b0565b60010161279c565b5091935090915050915091565b6000818484111561294c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129115781810151838201526020016128f9565b50505050905090810190601f16801561293e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b815160009083906008108061296a575080516003115b1561297957600091505061145a565b604080516020808252818301909252606091602082018180368337019050509050836020820152808251815181106129ad57fe5b6020910101516001600160f81b031916602d60f81b146129d25760009250505061145a565b600160005b8351811015612a32578281815181106129ec57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612a0d57fe5b01602001516001600160f81b03191614612a2a5760009150612a32565b6001016129d7565b5095945050505050565b606061145a612a4a83612ceb565b612dd1565b6060815160001415612a705750604080516000815260208101909152610bb6565b606082600081518110612a7f57fe5b602002602001015190506000600190505b8351811015612ac057612ab682858381518110612aa957fe5b6020026020010151612e23565b9150600101612a90565b506121e0612ad3825160c060ff16612ea0565b82612e23565b60008183612b285760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129115781810151838201526020016128f9565b506000838581612b3457fe5b0495945050505050565b612b466131db565b506040805180820190915281518152602082810190820152919050565b612b6b6131bb565b612b7482612f98565b612b7d57600080fd5b6000612b8c8360200151612fd2565b60208085015160408051808201909152868152920190820152915050919050565b6000612bb76131db565b505080518051602091820151919092015191011190565b612bd66131db565b612bdf82612bad565b612be857600080fd5b60208201516000612bf882613035565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612c3157508151602110155b612c3a57600080fd5b6000612c498360200151612fd2565b90508083600001511015612ca4576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561219557506020919091036101000a90049392505050565b8051600090601514612ce257600080fd5b61145a82612c1c565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612d2f57506018612d53565b6fffffffffffffffffffffffffffffffff198416612d4f57506010612d53565b5060005b6020811015612d8957818181518110612d6857fe5b01602001516001600160f81b03191615612d8157612d89565b600101612d53565b60008160200390506060816040519080825280601f01601f191660200182016040528015612dbe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612e035750607f60f81b82600081518110612df157fe5b01602001516001600160f81b03191611155b15612e0f575080610bb6565b61145a612e218351608060ff16612ea0565b835b6060806040519050835180825260208201818101602087015b81831015612e54578051835260209283019201612e3c565b50855184518101855292509050808201602086015b81831015612e81578051835260209283019201612e69565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612ef0576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612f4a5782840160f81b81600081518110612f2c57fe5b60200101906001600160f81b031916908160001a905350905061145a565b6060612f5585612ceb565b90508381510160370160f81b82600081518110612f6e57fe5b60200101906001600160f81b031916908160001a905350612f8f8282612e23565b95945050505050565b8051600090612fa957506000610bb6565b6020820151805160001a9060c0821015612fc857600092505050610bb6565b5060019392505050565b8051600090811a6080811015612fec576000915050610bb6565b60b8811080613007575060c08110801590613007575060f881105b15613016576001915050610bb6565b60c081101561302a5760b519019050610bb6565b60f519019050610bb6565b80516000908190811a60808110156130505760019150613161565b60b881101561306557607e1981019150613161565b60c08110156130df57600060b78203600186019550806020036101000a8651049150600181018201935050808310156130d9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613161565b60f88110156130f45760be1981019150613161565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561315f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b60405180604001604052806131ce6131db565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe72656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e6420726571756573746f6e6c79206265703265206f776e65722063616e20617070726f766520746869732062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a2646970667358221220f5905eb90e4a072fe66973705300bc7792e1c43c73c571a09629b9153e6b871864736f6c63430006040033", + }, + { + ContractAddr: CrossChainContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/f4bc161dac5937b8cbd4fe3089c7514c415430f9", + Code: "608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612051565b604080516001600160401b039092168252519081900360200190f35b61044361206c565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612072565b61038a612092565b6104436120b1565b6105b16120b7565b6106c16004803603602081101561074257600080fd5b503560ff1661246e565b6105b16004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919350915035612489565b6104436125da565b6102556125e0565b6104436125e5565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125eb565b50905061086a818388516125f5565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606081565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612bcc6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c612636565b858561267d565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da08861277a565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b61282a565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100600081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b22602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129809050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a6792505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b9a6032913960400191505060405180910390fd5b600155611fbf565b611c5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506129809050565b15611de457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cdf5760405162461bcd60e51b815260040180806020018281038252605a815260200180612ac8605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590611cfd81612a6c565b611d4e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a35050505050611fbf565b611e5184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129809050565b15611f8257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ed45760405162461bcd60e51b815260040180806020018281038252604a815260200180612b50604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f78576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fbf565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff161561210f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166124dc576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff80891685529252909120548591166125395760405162461bcd60e51b8152600401808060200182810382526031815260200180612a976031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b03169261259e9284928a9261115792909189918c908c908190840183828082843760009201919091525061080092505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b8051602090910191565b5b60208110612615578251825260209283019290910190601f19016125f6565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100600060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268c57506000612771565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126c3576020820181803683370190505b50905060006126d182612a72565b6020808901518252019050866000806126e9896125eb565b80865260209095019490925090506127028285836125f5565b9283019261270f886125eb565b80865260209095019490925090506127288285836125f5565b9283018a81526020019261273b876125eb565b909250905061274b8285836125f5565b508351602001612759612a78565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127aa575050604080516000808252602082019092529092508291508190612823565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127f5576020820181803683370190505b5090506000612803826125eb565b509050612815858260218d51036125f5565b506001975091955093509150505b9193509193565b600254431115612869576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128aa565b600380546001908101918290555410156128aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606085604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612940578181015183820152602001612928565b50505050905090810190601f16801561296d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129b55780518252601f199092019160209182019101612996565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a235780518252601f199092019160209182019101612a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a264697066735822122033c2492ac02e70488d9ed3adb95888d7f5998dff786cf03d72be0cde759a14d064736f6c63430006040033", + }, + }, + } + + ramanujanUpgrade[chapelNet] = &Upgrade{ + UpgradeName: "ramanujan", + Configs: []*UpgradeConfig{ + { + ContractAddr: ValidatorContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "60806040526004361061027d5760003560e01c80639dc092621161014f578063c8509d81116100c1578063eb57e2021161007a578063eb57e20214610940578063eda5868c14610973578063f340fa0114610988578063f9a2bbc7146109ae578063fc3e5908146109c3578063fd6a6879146109d85761027d565b8063c8509d8114610609578063d86222d5146108d7578063daacdb66146108ec578063dc927faf14610901578063e086c7b114610916578063e1c7392a1461092b5761027d565b8063ab51bb9611610113578063ab51bb961461074a578063ac4317511461075f578063ad3c9da61461082a578063b7ab4db51461085d578063bf9f49951461041b578063c81b1662146108c25761027d565b80639dc09262146106cd578063a1a11bf5146106e2578063a5422d5c146106f7578063a78abc161461070c578063aaf5eb68146107355761027d565b80635667515a116101f35780637942fd05116101ac5780637942fd05146105df57806381650b62146105f4578063831d65d114610609578063853230aa1461068e57806386249882146106a357806396713da9146106b85761027d565b80635667515a146105005780635d77156c146105155780636969a25c1461052a5780636e47b482146105a057806370fd5bad146105b557806375d47a0a146105ca5761027d565b80633dffc387116102455780633dffc3871461041b57806343756e5c14610446578063493279b1146104775780634bf6c882146104a357806351e80672146104b8578063565c56b3146104cd5761027d565b80630bee7a67146102825780631182b875146102b05780631ff18069146103aa578063219f22d5146103d157806335409f7f146103e6575b600080fd5b34801561028e57600080fd5b506102976109ed565b6040805163ffffffff9092168252519081900360200190f35b3480156102bc57600080fd5b50610335600480360360408110156102d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460018302840111600160201b8311171561032a57600080fd5b5090925090506109f2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036f578181015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b657600080fd5b506103bf610bdf565b60408051918252519081900360200190f35b3480156103dd57600080fd5b50610297610be5565b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b0316610bea565b005b34801561042757600080fd5b50610430610efe565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061045b610f03565b604080516001600160a01b039092168252519081900360200190f35b34801561048357600080fd5b5061048c610f09565b6040805161ffff9092168252519081900360200190f35b3480156104af57600080fd5b50610430610f0e565b3480156104c457600080fd5b5061045b610f13565b3480156104d957600080fd5b506103bf600480360360208110156104f057600080fd5b50356001600160a01b0316610f19565b34801561050c57600080fd5b50610430610f6b565b34801561052157600080fd5b50610297610f70565b34801561053657600080fd5b506105546004803603602081101561054d57600080fd5b5035610f75565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156105ac57600080fd5b5061045b610fd9565b3480156105c157600080fd5b50610430610fdf565b3480156105d657600080fd5b5061045b610fe4565b3480156105eb57600080fd5b50610430610fea565b34801561060057600080fd5b50610297610fef565b34801561061557600080fd5b506104196004803603604081101561062c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561065057600080fd5b82018360208201111561066257600080fd5b803590602001918460018302840111600160201b8311171561068357600080fd5b509092509050610ff4565b34801561069a57600080fd5b506103bf6110a7565b3480156106af57600080fd5b506103bf6110ad565b3480156106c457600080fd5b506104306110b3565b3480156106d957600080fd5b5061045b6110b8565b3480156106ee57600080fd5b5061045b6110be565b34801561070357600080fd5b506103356110c4565b34801561071857600080fd5b506107216110e3565b604080519115158252519081900360200190f35b34801561074157600080fd5b506103bf6110ec565b34801561075657600080fd5b50610297610f6b565b34801561076b57600080fd5b506104196004803603604081101561078257600080fd5b810190602081018135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460018302840111600160201b831117156107cf57600080fd5b919390929091602081019035600160201b8111156107ec57600080fd5b8201836020820111156107fe57600080fd5b803590602001918460018302840111600160201b8311171561081f57600080fd5b5090925090506110f5565b34801561083657600080fd5b506103bf6004803603602081101561084d57600080fd5b50356001600160a01b031661139c565b34801561086957600080fd5b506108726113ae565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ae578181015183820152602001610896565b505050509050019250505060405180910390f35b3480156108ce57600080fd5b5061045b6114d4565b3480156108e357600080fd5b506103bf6114da565b3480156108f857600080fd5b506103bf6114e6565b34801561090d57600080fd5b5061045b6114ec565b34801561092257600080fd5b506103bf6114f2565b34801561093757600080fd5b506104196114f7565b34801561094c57600080fd5b506104196004803603602081101561096357600080fd5b50356001600160a01b03166116fa565b34801561097f57600080fd5b506102976118c9565b6104196004803603602081101561099e57600080fd5b50356001600160a01b03166118ce565b3480156109ba57600080fd5b5061045b611b04565b3480156109cf57600080fd5b50610430611b0a565b3480156109e457600080fd5b5061045b611b0f565b606481565b60005460609060ff16610a48576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a885760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b610a90613d69565b6000610ad185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b1592505050565b9150915080610aed57610ae46064611c6e565b92505050610bd8565b815160009060ff16610b0d57610b068360200151611ccf565b9050610ba4565b825160ff1660011415610ba057826020015151600114610b7a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613e6c6025913960400191505060405180910390a1506067610b9b565b610b068360200151600081518110610b8e57fe5b6020026020010151612ad5565b610ba4565b5060655b63ffffffff8116610bc95750506040805160008152602081019091529150610bd89050565b610bd281611c6e565b93505050505b9392505050565b60035481565b606881565b3361100114610c2a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610c4e5750610efb565b600181039050600060018281548110610c6357fe5b60009182526020909120600360049092020101546001549091506000190180610cb257600060018481548110610c9557fe5b906000526020600020906004020160030181905550505050610efb565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610e3457600180546000198101908110610d2957fe5b906000526020600020906004020160018481548110610d4457fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610e0957fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610e3f57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610e9257fe5b0490508015610ef65760015460005b81811015610ef3578260018281548110610eb757fe5b9060005260206000209060040201600301540160018281548110610ed757fe5b6000918252602090912060036004909202010155600101610ea1565b50505b505050505b50565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610f41576000915050610f66565b600180820381548110610f5057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610f8257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101b78152602001613f066101b7913981565b60005460ff1681565b6402540be40081565b60005460ff16611148576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146111885760405162461bcd60e51b815260040180806020018281038252602e815260200180613e91602e913960400191505060405180910390fd5b6111f284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c4c9050565b156112cd57602081146112365760405162461bcd60e51b8152600401808060200182810382526026815260200180613ee06026913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161127491858580838501838280828437600092019190915250612d3492505050565b90506064811015801561128a5750620186a08111155b6112c55760405162461bcd60e51b8152600401808060200182810382526027815260200180613e456027913960400191505060405180910390fd5b60025561130a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156113ff57600181815481106113cd57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166113f7576001909101905b6001016113b8565b5060608160405190808252806020026020018201604052801561142c578160200160208202803683370190505b50600092509050815b838110156114cc576001818154811061144a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166114c4576001818154811061147a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106114a557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611435565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561154f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611557613d69565b600061157d604051806101e001604052806101b78152602001613f066101b79139611b15565b91509150806115bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806140bd6021913960400191505060405180910390fd5b60005b8260200151518110156116e2576001836020015182815181106115df57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106116b557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016115c0565b50506103e8600255506000805460ff19166001179055565b336110011461173a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061175e5750610efb565b60018103905060006001828154811061177357fe5b906000526020600020906004020160030154905060006001838154811061179657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061180557505050610efb565b600081838161181057fe5b0490508015610ef65760005b8481101561186e57816001828154811061183257fe5b906000526020600020906004020160030154016001828154811061185257fe5b600091825260209091206003600490920201015560010161181c565b50600180549085015b81811015610ef357826001828154811061188d57fe5b90600052602060002090600402016003015401600182815481106118ad57fe5b6000918252602090912060036004909202010155600101611877565b606581565b33411461190c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061410d602d913960400191505060405180910390fd5b60005460ff1661195f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116119ac576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205434908015611abf5760006001808303815481106119de57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611a49576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611ab9565b600354611a5c908463ffffffff612d3916565b6003908155810154611a74908463ffffffff612d3916565b60038201556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611aff565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611b1d613d69565b6000611b27613d69565b611b2f613d81565b611b40611b3b86612d93565b612db8565b90506000805b611b4f83612e02565b15611c605780611b7457611b6a611b6584612e23565b612e71565b60ff168452611c58565b8060011415611c53576060611b90611b8b85612e23565b612f28565b90508051604051908082528060200260200182016040528015611bcd57816020015b611bba613da1565b815260200190600190039081611bb25790505b50602086015260005b8151811015611c4857611be7613da1565b6000611c05848481518110611bf857fe5b6020026020010151612ff9565b9150915080611c2257876000995099505050505050505050611c69565b8188602001518481518110611c3357fe5b60209081029190910101525050600101611bd6565b506001925050611c58565b611c60565b600101611b46565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611c88579050509050611cae8363ffffffff166130d6565b81600081518110611cbb57fe5b6020026020010181905250610bd8816130e9565b6000806060611cdd84613173565b9150915081611d8a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d45578181015183820152602001611d2d565b50505050905090810190601f168015611d725780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610f66565b600080805b600154811015611e075767016345785d8a000060018281548110611daf57fe5b90600052602060002090600402016003015410611dd157600190920191611dff565b600060018281548110611de057fe5b9060005260206000209060040201600301541115611dff576001909101905b600101611d8f565b50606082604051908082528060200260200182016040528015611e34578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611e63578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611e92578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ec1578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611ef2578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611f21578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051905067016345785d8a000081111561200d577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613ebf6021913960400191505060405180910390a160689d5050505050505050505050505050610f66565b60005b6001548110156122805767016345785d8a00006001828154811061203057fe5b906000526020600020906004020160030154106121b6576001818154811061205457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061208557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106120ba57fe5b906000526020600020906004020160030154816120d357fe5b06600183815481106120e157fe5b906000526020600020906004020160030154039050612109838261325590919063ffffffff16565b8a8e8151811061211557fe5b6020026020010181815250506001828154811061212e57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061215f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061218c57fe5b60209081029190910101526121a7878263ffffffff612d3916565b6001909d019c96506122789050565b6000600182815481106121c557fe5b906000526020600020906004020160030154111561227857600181815481106121ea57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061224857fe5b906000526020600020906004020160030154848c8151811061226657fe5b60209081029190910101526001909a01995b600101612010565b50600085156126be576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156123125781810151838201526020016122fa565b50505050905001848103835287818151815260200191508051906020019060200280838360005b83811015612351578181015183820152602001612339565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015612390578181015183820152602001612378565b505050509050019750505050505050506020604051808303818588803b1580156123b957600080fd5b505af1935050505080156123df57506040513d60208110156123da57600080fd5b505160015b61261a576040516000815260443d10156123fb57506000612496565b60046000803e60005160e01c6308c379a0811461241c576000915050612496565b60043d036004833e81513d60248201116001600160401b038211171561244757600092505050612496565b80830180516001600160401b03811115612468576000945050505050612496565b8060208301013d860181111561248657600095505050505050612496565b601f01601f191660405250925050505b806124a15750612545565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125055781810151838201526020016124ed565b50505050905090810190601f1680156125325780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612615565b3d80801561256f576040519150601f19603f3d011682016040523d82523d6000602084013e612574565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125d95781810151838201526020016125c1565b50505050905090810190601f1680156126065780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6126be565b8015612658576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16126bc565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156128745760005b88518110156128725760008982815181106126de57fe5b602002602001015190506000600182815481106126f757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061272857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156127e4576001828154811061276957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106127b857fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612868565b600182815481106127f157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061284057fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016126c7565b505b8451156129be5760005b85518110156129bc57600086828151811061289557fe5b60200260200101516001600160a01b03166108fc8784815181106128b557fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561294b578682815181106128eb57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061292957fe5b60200260200101516040518082815260200191505060405180910390a26129b3565b86828151811061295757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d87848151811061299557fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161287e565b505b4715612a27576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612a25573d6000803e3d6000fd5b505b60006003819055600555825115612a4157612a4183613297565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612b265750600180820381548110612b0657fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612b6c5782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050610f66565b600154600554600019820111801590612bc25784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050610f66565b600580546001908101909155805481906000198601908110612be057fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612c815780518252601f199092019160209182019101612c62565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612cef5780518252601f199092019160209182019101612cd0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b600082820183811015610bd8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d9b613dd6565b506040805180820190915281518152602082810190820152919050565b612dc0613d81565b612dc98261375e565b612dd257600080fd5b6000612de18360200151613798565b60208085015160408051808201909152868152920190820152915050919050565b6000612e0c613dd6565b505080518051602091820151919092015191011190565b612e2b613dd6565b612e3482612e02565b612e3d57600080fd5b60208201516000612e4d826137fb565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e8657508151602110155b612e8f57600080fd5b6000612e9e8360200151613798565b90508083600001511015612ef9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015612f1f57826020036101000a820491505b50949350505050565b6060612f338261375e565b612f3c57600080fd5b6000612f478361392e565b9050606081604051908082528060200260200182016040528015612f8557816020015b612f72613dd6565b815260200190600190039081612f6a5790505b5090506000612f978560200151613798565b60208601510190506000805b84811015612fee57612fb4836137fb565b9150604051806040016040528083815260200184815250848281518110612fd757fe5b602090810291909101015291810191600101612fa3565b509195945050505050565b613001613da1565b600061300b613da1565b613013613d81565b61301c85612db8565b90506000805b61302b83612e02565b15611c6057806130565761304661304184612e23565b61398a565b6001600160a01b031684526130ce565b806001141561307e5761306b61304184612e23565b6001600160a01b031660208501526130ce565b80600214156130a65761309361304184612e23565b6001600160a01b031660408501526130ce565b8060031415611c53576130bb611b6584612e23565b6001600160401b03166060850152600191505b600101613022565b6060612d2e6130e4836139a4565b613a8a565b606081516000141561310a5750604080516000815260208101909152610f66565b60608260008151811061311957fe5b602002602001015190506000600190505b835181101561315a576131508285838151811061314357fe5b6020026020010151613adc565b915060010161312a565b50610bd861316d825160c060ff16613b59565b82613adc565b600060606029835111156131a5576000604051806060016040528060298152602001613df16029913991509150611c69565b60005b835181101561323b5760005b81811015613232578481815181106131c857fe5b6020026020010151600001516001600160a01b03168583815181106131e957fe5b6020026020010151600001516001600160a01b0316141561322a5760006040518060600160405280602b8152602001613e1a602b9139935093505050611c69565b6001016131b4565b506001016131a8565b505060408051602081019091526000815260019150915091565b6000610bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c51565b600154815160005b828110156133b45760016132b1613da1565b600183815481106132be57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156133885786818151811061334e57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156133805760009250613388565b60010161333a565b5081156133aa5780516001600160a01b03166000908152600460205260408120555b505060010161329f565b508082111561342957805b828110156134275760018054806133d257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b03191690556003909101919091559155016133bf565b505b6000818310613438578161343a565b825b905060005b81811015613634576134ec85828151811061345657fe5b60200260200101516001838154811061346b57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ce8565b61360757806001016004600087848151811061350457fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061354057fe5b60200260200101516001828154811061355557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561362c565b60006001828154811061361657fe5b9060005260206000209060040201600301819055505b60010161343f565b508282111561375857825b82811015610ef657600185828151811061365557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061372b57fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161363f565b50505050565b805160009061376f57506000610f66565b6020820151805160001a9060c082101561378e57600092505050610f66565b5060019392505050565b8051600090811a60808110156137b2576000915050610f66565b60b88110806137cd575060c081108015906137cd575060f881105b156137dc576001915050610f66565b60c08110156137f05760b519019050610f66565b60f519019050610f66565b80516000908190811a60808110156138165760019150613927565b60b881101561382b57607e1981019150613927565b60c08110156138a557600060b78203600186019550806020036101000a86510491506001810182019350508083101561389f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613927565b60f88110156138ba5760be1981019150613927565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613925576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061393f57506000610f66565b600080905060006139538460200151613798565b602085015185519181019250015b8082101561398157613972826137fb565b60019093019290910190613961565b50909392505050565b805160009060151461399b57600080fd5b612d2e82612e71565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166139e857506018613a0c565b6fffffffffffffffffffffffffffffffff198416613a0857506010613a0c565b5060005b6020811015613a4257818181518110613a2157fe5b01602001516001600160f81b03191615613a3a57613a42565b600101613a0c565b60008160200390506060816040519080825280601f01601f191660200182016040528015613a77576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613abc5750607f60f81b82600081518110613aaa57fe5b01602001516001600160f81b03191611155b15613ac8575080610f66565b612d2e613ada8351608060ff16613b59565b835b6060806040519050835180825260208201818101602087015b81831015613b0d578051835260209283019201613af5565b50855184518101855292509050808201602086015b81831015613b3a578051835260209283019201613b22565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613ba9576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613c035782840160f81b81600081518110613be557fe5b60200101906001600160f81b031916908160001a9053509050612d2e565b6060613c0e856139a4565b90508381510160370160f81b82600081518110613c2757fe5b60200101906001600160f81b031916908160001a905350613c488282613adc565b95945050505050565b60008184841115613ce05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ca5578181015183820152602001613c8d565b50505050905090810190601f168015613cd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613d22575081602001516001600160a01b031683602001516001600160a01b0316145b8015613d47575081604001516001600160a01b031683604001516001600160a01b0316145b8015610bd85750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613d94613dd6565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d69746475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d61746368f901b480f901b0f846941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf9477f066f3fb515bb97015e4b4afddbcb25c94286b86048c27395000f84694b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794748c284f46ab87fd492326f1e2fe731d22ad2db386048c27395000f84694a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f940ce09b38374887cb564b7efa60be130d99ed5f9586048c27395000f84694980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b2709407eecf36cf0901fefe4bc505d6ba03c7480c7b5786048c27395000f8469435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194f57d36e129881a3a13a024fe8072507e5b2e70f886048c27395000f84694f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594ddfcaedf9bb451098c9917a45f02bd61342cca6686048c273950006661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a26469706673582212203ab4e2f538c9084d689a3e9fdfcee54d2149c820c48e01a03c7f65be805a8edf64736f6c63430006040033", + }, + { + ContractAddr: SlashContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b50600436106102275760003560e01c8063831d65d111610130578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a146106d9578063f9a2bbc7146106e1578063fc3e5908146106e9578063fc4333cd146106f1578063fd6a6879146106f957610227565b8063c80d4b8f14610623578063c81b16621461062b578063c8509d8114610633578063c96be4cb146106ab578063dc927faf146106d157610227565b8063a1a11bf5116100ff578063a1a11bf514610531578063a78abc1614610539578063ab51bb9614610555578063ac0af6291461055d578063ac4317511461056557610227565b8063831d65d11461049f57806396713da9146105195780639bc8e4f2146105215780639dc092621461052957610227565b80634bf6c882116101b35780636e47b482116101825780636e47b4821461047757806370fd5bad1461047f57806375d47a0a146104875780637912a65d1461048f5780637942fd051461049757610227565b80634bf6c8821461045757806351e806721461045f578063567a372d1461046757806362b72cf51461046f57610227565b806337c8dab9116101fa57806337c8dab9146103b9578063389f4f71146103f85780633dffc3871461041257806343756e5c14610430578063493279b11461043857610227565b80630bee7a671461022c5780631182b8751461024d57806323bac5a21461033a57806335aa2e4414610380575b600080fd5b610234610701565b6040805163ffffffff9092168252519081900360200190f35b6102c56004803603604081101561026357600080fd5b60ff8235169190810190604081016020820135600160201b81111561028757600080fd5b82018360208201111561029957600080fd5b803590602001918460018302840111600160201b831117156102ba57600080fd5b509092509050610706565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103606004803603602081101561035057600080fd5b50356001600160a01b03166107da565b604080519384526020840192909252151582820152519081900360600190f35b61039d6004803603602081101561039657600080fd5b50356107fd565b604080516001600160a01b039092168252519081900360200190f35b6103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610824565b6040805192835260208301919091528051918290030190f35b61040061087b565b60408051918252519081900360200190f35b61041a610881565b6040805160ff9092168252519081900360200190f35b61039d610886565b61044061088c565b6040805161ffff9092168252519081900360200190f35b61041a610891565b61039d610896565b61040061089c565b6104006108a2565b61039d6108a8565b61041a6108ae565b61039d6108b3565b6104006108b9565b61041a6108be565b610517600480360360408110156104b557600080fd5b60ff8235169190810190604081016020820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460018302840111600160201b8311171561050c57600080fd5b5090925090506108c3565b005b61041a610a1e565b610400610a23565b61039d610a2e565b61039d610a34565b610541610a3a565b604080519115158252519081900360200190f35b610234610a43565b610400610a48565b6105176004803603604081101561057b57600080fd5b810190602081018135600160201b81111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111600160201b831117156105c857600080fd5b919390929091602081019035600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460018302840111600160201b8311171561061857600080fd5b509092509050610a4d565b610400610e3b565b61039d610e40565b6105176004803603604081101561064957600080fd5b60ff8235169190810190604081016020820135600160201b81111561066d57600080fd5b82018360208201111561067f57600080fd5b803590602001918460018302840111600160201b831117156106a057600080fd5b509092509050610e46565b610517600480360360208110156106c157600080fd5b50356001600160a01b0316610ef9565b61039d61131e565b610517611324565b61039d611395565b61041a61139b565b6105176113a0565b61039d61182b565b606481565b606033612000146107485760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff1661078d576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061080a57fe5b6000918252602090912001546001600160a01b0316905081565b60008061082f612146565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606081565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b33612000146109035760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610948576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b610950612169565b600061099184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183192505050565b9150915080156109db5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a17565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610a92576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b3361100714610ad25760405162461bcd60e51b815260040180806020018281038252602e81526020018061220d602e913960400191505060405180910390fd5b610b3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506118b19050565b15610c165760208114610b815760405162461bcd60e51b81526004018080602001828103825260278152602001806121b66027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610bbf9185858083850183828082843760009201919091525061199992505050565b905060018110158015610bd3575060055481105b610c0e5760405162461bcd60e51b815260040180806020018281038252602581526020018061225d6025913960400191505060405180910390fd5b600455610da9565b610c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506118b19050565b15610d6c5760208114610cc05760405162461bcd60e51b815260040180806020018281038252602281526020018061223b6022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610cfe9185858083850183828082843760009201919091525061199992505050565b90506103e88111158015610d13575060045481115b610d64576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610da9565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b3361200014610e865760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610ecb576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610f375760405162461bcd60e51b815260040180806020018281038252602d8152602001806122b1602d913960400191505060405180910390fd5b60005460ff16610f7c576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6003544311610fd2576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a1561101c576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b611024612146565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061107f5760208101805160010190526110d8565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526005546020820151816110ea57fe5b0661123c57600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6111718561199e565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111d15781810151838201526020016111b9565b50505050905090810190601f1680156111fe5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506112b2565b60045481602001518161124b57fe5b066112b257604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505043600355565b61100381565b60005460ff161561137c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146113e05760405162461bcd60e51b81526004018080602001828103825260308152602001806121dd6030913960400191505060405180910390fd5b60005460ff16611425576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b60015461143157611829565b600154600090600019015b8082116117fd576000805b8284101561156057611457612146565b600260006001878154811061146857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561154a576004600554816114d557fe5b048160200151038160200181815250508060026000600188815481106114f757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611554565b6001925050611560565b50600190930192611447565b8284116116f75761156f612146565b600260006001868154811061158057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611668576004600554816115ed57fe5b0481602001510381602001818152505080600260006001878154811061160f57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506116f79050565b600260006001868154811061167957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806116bd57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836116ea57506116f7565b5060001990920191611560565b8180156117015750805b156117e057600260006001868154811061171757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061175e57fe5b600091825260209091200154600180546001600160a01b03909216918690811061178457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806117bd57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826117ec5750506117fd565b50506001909101906000190161143c565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b611839612169565b6000611843612169565b61184b61217b565b61185c61185786611a70565b611a95565b90506000805b61186b83611adf565b156118a457806118975761188661188184611b00565b611b4e565b63ffffffff1684526001915061189c565b6118a4565b600101611862565b5091935090915050915091565b6000816040516020018082805190602001908083835b602083106118e65780518252601f1990920191602091820191016118c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106119545780518252601f199092019160209182019101611935565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816119b95790505090506119e2836001600160a01b0316611c05565b816000815181106119ef57fe5b6020026020010181905250611a0343611c28565b81600181518110611a1057fe5b6020908102919091010152611a256060611c28565b81600281518110611a3257fe5b6020026020010181905250611a4642611c28565b81600381518110611a5357fe5b6020026020010181905250611a6781611c3b565b9150505b919050565b611a7861219b565b506040805180820190915281518152602082810190820152919050565b611a9d61217b565b611aa682611cc5565b611aaf57600080fd5b6000611abe8360200151611cff565b60208085015160408051808201909152868152920190820152915050919050565b6000611ae961219b565b505080518051602091820151919092015191011190565b611b0861219b565b611b1182611adf565b611b1a57600080fd5b60208201516000611b2a82611d62565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611b6357508151602110155b611b6c57600080fd5b6000611b7b8360200151611cff565b90508083600001511015611bd6576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611bfc57826020036101000a820491505b50949350505050565b60408051600560a21b8318601482015260348101909152606090611a6781611e95565b6060611993611c3683611eeb565b611e95565b6060815160001415611c5c5750604080516000815260208101909152611a6b565b606082600081518110611c6b57fe5b602002602001015190506000600190505b8351811015611cac57611ca282858381518110611c9557fe5b6020026020010151611fd1565b9150600101611c7c565b50611a67611cbf825160c060ff1661204e565b82611fd1565b8051600090611cd657506000611a6b565b6020820151805160001a9060c0821015611cf557600092505050611a6b565b5060019392505050565b8051600090811a6080811015611d19576000915050611a6b565b60b8811080611d34575060c08110801590611d34575060f881105b15611d43576001915050611a6b565b60c0811015611d575760b519019050611a6b565b60f519019050611a6b565b80516000908190811a6080811015611d7d5760019150611e8e565b60b8811015611d9257607e1981019150611e8e565b60c0811015611e0c57600060b78203600186019550806020036101000a865104915060018101820193505080831015611e06576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611e8e565b60f8811015611e215760be1981019150611e8e565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611e8c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b606081516001148015611ec75750607f60f81b82600081518110611eb557fe5b01602001516001600160f81b03191611155b15611ed3575080611a6b565b611993611ee58351608060ff1661204e565b83611fd1565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f2f57506018611f53565b6fffffffffffffffffffffffffffffffff198416611f4f57506010611f53565b5060005b6020811015611f8957818181518110611f6857fe5b01602001516001600160f81b03191615611f8157611f89565b600101611f53565b60008160200390506060816040519080825280601f01601f191660200182016040528015611fbe576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612002578051835260209283019201611fea565b50855184518101855292509050808201602086015b8183101561202f578051835260209283019201612017565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061209e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116120f85782840160f81b816000815181106120da57fe5b60200101906001600160f81b031916908160001a9053509050611993565b606061210385611eeb565b90508381510160370160f81b8260008151811061211c57fe5b60200101906001600160f81b031916908160001a90535061213d8282611fd1565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061218e61219b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a26469706673582212204ff575d7be356d691e7b7eae41716a4ccc366ec84f8235486e935261df61a18a64736f6c63430006040033", + }, + { + ContractAddr: SystemRewardContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a8602b913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f64a2646970667358221220d0a7618a32d393c0757994fad066c9aaf7342a982498e0748019ec232f5dc86764736f6c63430006040033", + }, + { + ContractAddr: LightClientContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139b565b61027f6113b6565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bc565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113e0565b61052a611422565b6106656115c7565b604080516001600160401b039092168252519081900360200190f35b6106656115d6565b6102d26115ec565b61027f611609565b61026161160f565b61027f611614565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b606081565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ac6602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061161a9050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611a65602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170192505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611af4602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b236026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611863565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e5957506003546001600160401b0390811690831610155b15610f3a5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f2a5780601f10610eff57610100808354040283529160200191610f2a565b820191906000526020600020905b815481529060010190602001808311610f0d57829003601f168201915b5050505050815250509050610e28565b6060810151516110315780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b505050506060830182905250516110315760405162461bcd60e51b8152600401808060200182810382526021815260200180611a446021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611070576020820181803683370190505b509050600061107e82611706565b905061108c8486838661170c565b6110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806119416023913960400191505060405180910390fd5b6000838201915061110d8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177892505050565b9450905061111c818386611782565b8251602001935061112b611889565b6110008186866064600019fa61114057600080fd5b805194506000600160f81b8616156111cf5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b505050506040513d60208110156111cc57600080fd5b50505b856001600160401b0316955060208201935060006111ef858884156117c3565b90985090506001600160401b03808216908c161461123e5760405162461bcd60e51b8152600401808060200182810382526033815260200180611a936033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c59260038501929101906118a8565b50506003546001600160401b03600160401b9091048116908d161115905061130d576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141c57506003546001600160401b038381169116145b92915050565b60005460ff161561147a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60008061149f60405180610100016040528060e0815260200161196460e09139611778565b815160045590925090506114b1611863565b60006114bf848460006117c3565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152b9260038501929101906118a8565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b60405180610100016040528060e0815260200161196460e0913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061164f5780518252601f199092019160209182019101611630565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116bd5780518252601f19909201916020918201910161169e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061172a8760600151611778565b909250905061173a828683611782565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a2578251825260209283019290910190601f1901611783565b915181516020939093036101000a6000190180199091169216919091179052565b6117cb611863565b60088401516028850151604890950180519095600092916117ea611863565b6020810183905260408101829052866118555760008060688a036040519080825280601f01601f19166020018201604052801561182e576020820181803683370190505b506060840181905261183f90611778565b909250905061185260208c018383611782565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118e957805160ff1916838001178555611916565b82800160010185558215611916579182015b828111156119165782518255916020019190600101906118fb565b50611922929150611926565b5090565b6107e391905b80821115611922576000815560010161192c56fe6661696c656420746f2073657269616c697a6520636f6e73656e73757320737461746542696e616e63652d436861696e2d47616e67657300000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000aea1ac326886b992a991d21a6eb155f41b77867cbf659e78f31d89d8205122a84d1be64f0e9a466c2e66a53433928192783e29f8fa21beb2133499b5ef770f60000000e8d4a5100099308aa365c40554bc89982af505d85da95251445d5dd4a9bb37dd2584fd92d3000000e8d4a5100001776920ff0b0f38d78cf95c033c21adf7045785114e392a7544179652e0a612000000e8d4a510006661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a26469706673582212205276b0300b4926074c5521abe49ba680eda1820c6f75c2779994658ed250924164736f6c63430006040033", + }, + { + ContractAddr: TokenHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e5908146109c9578063fd6a687914610ce6578063ff9c0027146107c757610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063dc6f5e90116100d1578063dc6f5e90146109c9578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063a7c9f02d11610164578063ac4317511161013e578063ac43175114610a3a578063b770186114610b05578063b99328c514610b1a578063b9fd21e314610b5357610366565b8063a7c9f02d146109c9578063aa7415f5146109de578063ab51bb9614610a2557610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a5cd588b14610981578063a78abc16146109b457610366565b80635d499b1b1161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105b25780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b80635d499b1b14610671578063613684751461036b5780636e056520146106865780636e47b482146107b257806370fd5bad146107c757806371d30863146107dc57610366565b806343756e5c116102d75780634bf6c882116102b15780634bf6c8821461036b57806350432d321461061d57806351e806721461063257806359b927891461064757610366565b806343756e5c146105c757806343a368b9146105dc578063493279b1146105f157610366565b8063077b8f351461036b5780630bee7a67146103965780631182b875146103c4578063149d14d9146104be5780633d713223146104e55780633dffc387146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805160ff9092168252519081900360200190f35b3480156103a257600080fd5b506103ab610d00565b6040805163ffffffff9092168252519081900360200190f35b3480156103d057600080fd5b50610449600480360360408110156103e757600080fd5b60ff8235169190810190604081016020820135600160201b81111561040b57600080fd5b82018360208201111561041d57600080fd5b803590602001918460018302840111600160201b8311171561043e57600080fd5b509092509050610d05565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048357818101518382015260200161046b565b50505050905090810190601f1680156104b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ca57600080fd5b506104d3610e33565b60408051918252519081900360200190f35b3480156104f157600080fd5b506105966004803603602081101561050857600080fd5b810190602081018135600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e39945050505050565b604080516001600160a01b039092168252519081900360200190f35b3480156105be57600080fd5b50610380610e5d565b3480156105d357600080fd5b50610596610e62565b3480156105e857600080fd5b506104d3610e68565b3480156105fd57600080fd5b50610606610e74565b6040805161ffff9092168252519081900360200190f35b34801561062957600080fd5b506104d3610e79565b34801561063e57600080fd5b50610596610e84565b34801561065357600080fd5b506105966004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104d3610ea5565b61079e6004803603608081101561069c57600080fd5b810190602081018135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b919390929091602081019035600160201b81111561070657600080fd5b82018360208201111561071857600080fd5b803590602001918460208302840111600160201b8311171561073957600080fd5b919390929091602081019035600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b91935091503567ffffffffffffffff16610eae565b604080519115158252519081900360200190f35b3480156107be57600080fd5b50610596611383565b3480156107d357600080fd5b50610380611389565b3480156107e857600080fd5b506104d361138e565b3480156107fd57600080fd5b50610596611394565b34801561081257600080fd5b5061038061139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061038061156e565b34801561090057600080fd5b506104d3611573565b34801561091557600080fd5b506104d36004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b506105966116bd565b34801561096357600080fd5b506105966116c3565b34801561097857600080fd5b506103806116c9565b34801561098d57600080fd5b506104d3600480360360208110156109a457600080fd5b50356001600160a01b03166116ce565b3480156109c057600080fd5b5061079e6116e0565b3480156109d557600080fd5b506103806116e9565b61079e600480360360808110156109f457600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116ee565b348015610a3157600080fd5b506103ab6116c9565b348015610a4657600080fd5b5061036460048036036040811015610a5d57600080fd5b810190602081018135600160201b811115610a7757600080fd5b820183602082011115610a8957600080fd5b803590602001918460018302840111600160201b83111715610aaa57600080fd5b919390929091602081019035600160201b811115610ac757600080fd5b820183602082011115610ad957600080fd5b803590602001918460018302840111600160201b83111715610afa57600080fd5b509092509050611daf565b348015610b1157600080fd5b506104d361201e565b348015610b2657600080fd5b5061036460048036036040811015610b3d57600080fd5b50803590602001356001600160a01b0316612024565b348015610b5f57600080fd5b506104d361209a565b348015610b7457600080fd5b506104d360048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b506105966120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b50610596612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061038061223b565b348015610c8057600080fd5b50610380612240565b348015610c9557600080fd5b50610596612245565b348015610caa57600080fd5b506104d361224b565b348015610cbf57600080fd5b5061044960048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b50610596612378565b600881565b606481565b60005460609060ff16610d4d576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b3361200014610d8d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff841660021415610ddf57610dd883838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e2c565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606081565b662386f26fc1000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610ef4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b868514610f325760405162461bcd60e51b815260040180806020018281038252603b815260200180614732603b913960400191505060405180910390fd5b868314610f705760405162461bcd60e51b815260040180806020018281038252603f815260200180614605603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fbc5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156110005760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611033578160200160208202803683370190505b50905060005b8481101561110e576402540be4008b8b8381811061105357fe5b905060200201358161106157fe5b061561109e5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6110c38b8b838181106110ad57fe5b90506020020135856124a290919063ffffffff16565b93506110ef6402540be4008c8c848181106110da57fe5b905060200201356124fc90919063ffffffff16565b8282815181106110fb57fe5b6020908102919091010152600101611039565b5060015461113390611126908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111715760405162461bcd60e51b81526004018080602001828103825260568152602001806147df6056913960600191505060405180910390fd5b611181348463ffffffff61259716565b915061118b61434e565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d7600361124f846125d9565b611264876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c25781810151838201526020016112aa565b50505050905090810190601f1680156112ef5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614468602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60026020526000908152604090205481565b60005460ff1681565b600381565b6000805460ff16611734576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156117805760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156117c45760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b600080806001600160a01b0388166118a3576001546117ea90879063ffffffff6124a216565b3410156118285760405162461bcd60e51b815260040180806020018281038252606181526020018061457f6061913960800191505060405180910390fd5b6402540be40086061561186c5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b61187c348763ffffffff61259716565b9050611893866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b46565b6001600160a01b0388166000908152600360205260409020549250826118fa5760405162461bcd60e51b815260040180806020018281038252603181526020018061454e6031913960400191505060405180910390fd5b60015434101561193b5760405162461bcd60e51b815260040180806020018281038252603f8152602001806146a1603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061198657506008811180156119865750611984876007198301600a0a63ffffffff6128f016565b155b6119c15760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6119cb8782612932565b92506119d684612972565b15611a1e576305f5e100831015611a1e5760405162461bcd60e51b815260040180806020018281038252603a815260200180614497603a913960400191505060405180910390fd5b600881101580611a385750600881108015611a3857508683115b611a735760405162461bcd60e51b81526004018080602001828103825260258152602001806145e06025913960400191505060405180910390fd5b677ce66c50e2840000831115611aba5760405162461bcd60e51b81526004018080602001828103825260358152602001806145196035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050506040513d6020811015611b3957600080fd5b5051611b4457600080fd5b505b611b4e61434e565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bfc57fe5b602002602001018181525050878160600151600081518110611c1a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c4c57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c77846125d9565b611c8c866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cea578181015183820152602001611cd2565b50505050905090810190601f168015611d175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d3857600080fd5b505af1158015611d4c573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611def5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146e0602e913960400191505060405180910390fd5b60208114611e44576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f4c576020820151670de0b6b3a76400008111801590611ef357506402540be4008106155b611f44576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f89565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61c35081565b33611008146120645760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b662386f26fc1000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b606061238861439a565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143cf565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e58565b50506040805160008152602081019091529150610e589050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146806021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143f6565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b815260040180806020018281038252602481526020018061470e6024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600860ff82161015612a0057600092505050610e58565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e58565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e58565b5060019392505050565b612a8061434e565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612ad36143f6565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613bc6565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e61439a565b6000612b8861439a565b612b9061442d565b612ba1612b9c86613bff565b613c24565b90506000805b612bb083613c6e565b15612ca85780612bd257612bcb612bc684613c8f565b613cdd565b8452612ca0565b8060011415612bff57612bec612be784613c8f565b613d94565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c8f565b6040850152612ca0565b8060031415612c4657612c33612be784613c8f565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c8f565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c8f565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e58565b8160400151471015612cfc57506003610e58565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e58565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e58565b8160a0015167ffffffffffffffff16421115612e0a57506001610e58565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e58565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e58565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e589050565b5060059150610e589050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2c81613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613dae565b613e94565b60408051600560a21b8318601482015260348101909152606090610e2c81613e94565b60608151600014156132315750604080516000815260208101909152610e58565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ee6565b9150600101613251565b50610e2c613294825160c060ff16613f63565b82613ee6565b6132a26143f6565b60006132ac6143f6565b6132b461442d565b6132c0612b9c86613bff565b90506000805b6132cf83613c6e565b15612ca857806132f5576132e5612be784613c8f565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c8f565b61405b565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cdd565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c8f565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d94565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c8f565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b61395361434e565b600061395d61434e565b61396561442d565b613971612b9c86613bff565b90506000805b61398083613c6e565b15613bb8578061399d57613996612bc684613c8f565b8452613bb0565b80600114156139c5576139b2612be784613c8f565b6001600160a01b03166020850152613bb0565b8060021415613a545760606139dc61330c85613c8f565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613bb0565b8060031415613ae9576060613a6b61330c85613c8f565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c8f565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415613bab57613b93612bc684613c8f565b67ffffffffffffffff1660a085015260019150613bb0565b613bb8565b600101613977565b509195600195509350505050565b60006008821115613be857612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613c0761444d565b506040805180820190915281518152602082810190820152919050565b613c2c61442d565b613c358261412c565b613c3e57600080fd5b6000613c4d836020015161415c565b60208085015160408051808201909152868152920190820152915050919050565b6000613c7861444d565b505080518051602091820151919092015191011190565b613c9761444d565b613ca082613c6e565b613ca957600080fd5b60208201516000613cb9826141bf565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cf257508151602110155b613cfb57600080fd5b6000613d0a836020015161415c565b90508083600001511015613d65576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d8b57826020036101000a820491505b50949350505050565b8051600090601514613da557600080fd5b6116b782613cdd565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613df257506018613e16565b6fffffffffffffffffffffffffffffffff198416613e1257506010613e16565b5060005b6020811015613e4c57818181518110613e2b57fe5b01602001516001600160f81b03191615613e4457613e4c565b600101613e16565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ec65750607f60f81b82600081518110613eb457fe5b01602001516001600160f81b03191611155b15613ed2575080610e58565b6116b7613ee48351608060ff16613f63565b835b6060806040519050835180825260208201818101602087015b81831015613f17578051835260209283019201613eff565b50855184518101855292509050808201602086015b81831015613f44578051835260209283019201613f2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613fb3576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161400d5782840160f81b81600081518110613fef57fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061401885613dae565b90508381510160370160f81b8260008151811061403157fe5b60200101906001600160f81b031916908160001a9053506140528282613ee6565b95945050505050565b60606140668261412c565b61406f57600080fd5b600061407a836142f2565b90506060816040519080825280602002602001820160405280156140b857816020015b6140a561444d565b81526020019060019003908161409d5790505b50905060006140ca856020015161415c565b60208601510190506000805b84811015614121576140e7836141bf565b915060405180604001604052808381526020018481525084828151811061410a57fe5b6020908102919091010152918101916001016140d6565b509195945050505050565b805160009061413d57506000610e58565b6020820151805160001a9060c0821015612a6e57600092505050610e58565b8051600090811a6080811015614176576000915050610e58565b60b8811080614191575060c08110801590614191575060f881105b156141a0576001915050610e58565b60c08110156141b45760b519019050610e58565b60f519019050610e58565b80516000908190811a60808110156141da57600191506142eb565b60b88110156141ef57607e19810191506142eb565b60c081101561426957600060b78203600186019550806020036101000a865104915060018101820193505080831015614263576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142eb565b60f881101561427e5760be19810191506142eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061430357506000610e58565b60008090506000614317846020015161415c565b602085015185519181019250015b8082101561434557614336826141bf565b60019093019290910190614325565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061444061444d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220560ad3b1f9184c6b58a836a4c111faf5fdf5dc0e93dc1c013cd41cea18c69cbb64736f6c63430006040033", + }, + { + ContractAddr: RelayerIncentivizeContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "6080604052600436106102765760003560e01c80637e146cc51161014f578063af400681116100c1578063e75d72c71161007a578063e75d72c714610795578063e89a3020146107c8578063f9a2bbc7146107f2578063fc3e590814610807578063fd6a68791461081c578063fdd31fcd146108315761027d565b8063af400681146106ed578063bd4cc83014610717578063c81b166214610741578063dc927faf14610756578063dcae76ab1461076b578063e1c7392a146107805761027d565b8063a3c3c0ad11610113578063a3c3c0ad146105b3578063a78abc16146105c8578063a7c6a59d146105dd578063ab51bb96146105f2578063ac43175114610607578063ace9fcc2146106d85761027d565b80637e146cc51461052c578063930e1b091461054157806396713da9146105745780639dc0926214610589578063a1a11bf51461059e5761027d565b806343756e5c116101e85780636e47b482116101ac5780636e47b482146104645780636f93d2e61461047957806370fd5bad146104d857806374f2272d146104ed57806375d47a0a146105025780637942fd05146105175761027d565b806343756e5c146103e4578063493279b1146103f95780634bf6c8821461042557806351e806721461043a578063541333071461044f5761027d565b806312950c461161023a57806312950c46146103165780631b20087c1461032b5780631c643312146103405780633a975612146102825780633dffc3871461038657806340bb43c0146103b15761027d565b8063081e9d131461028257806308f2ec06146102a9578063093f2fc4146102be5780630bee7a67146102d357806310e06a76146103015761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610864565b60408051918252519081900360200190f35b3480156102b557600080fd5b50610297610869565b3480156102ca57600080fd5b5061029761086e565b3480156102df57600080fd5b506102e8610873565b6040805163ffffffff9092168252519081900360200190f35b34801561030d57600080fd5b50610297610878565b34801561032257600080fd5b5061029761087e565b34801561033757600080fd5b50610297610884565b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b503561088a565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b5061039b610864565b6040805160ff9092168252519081900360200190f35b3480156103bd57600080fd5b50610297600480360360208110156103d457600080fd5b50356001600160a01b03166108b1565b3480156103f057600080fd5b5061036a6108c3565b34801561040557600080fd5b5061040e6108c9565b6040805161ffff9092168252519081900360200190f35b34801561043157600080fd5b5061039b6108ce565b34801561044657600080fd5b5061036a6108d3565b34801561045b57600080fd5b50610297610873565b34801561047057600080fd5b5061036a6108d9565b34801561048557600080fd5b506104c46004803603608081101561049c57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108df565b604080519115158252519081900360200190f35b3480156104e457600080fd5b5061039b610cad565b3480156104f957600080fd5b50610297610cb2565b34801561050e57600080fd5b5061036a610cb8565b34801561052357600080fd5b5061039b610cbe565b34801561053857600080fd5b50610297610cc3565b34801561054d57600080fd5b506102976004803603602081101561056457600080fd5b50356001600160a01b0316610cc8565b34801561058057600080fd5b5061039b610cda565b34801561059557600080fd5b5061036a610cdf565b3480156105aa57600080fd5b5061036a610ce5565b3480156105bf57600080fd5b50610297610ceb565b3480156105d457600080fd5b506104c4610cf1565b3480156105e957600080fd5b50610297610cfa565b3480156105fe57600080fd5b506102e8610d00565b34801561061357600080fd5b506106d66004803603604081101561062a57600080fd5b81019060208101813564010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91939092909160208101903564010000000081111561069757600080fd5b8201836020820111156106a957600080fd5b803590602001918460018302840111640100000000831117156106cb57600080fd5b509092509050610d05565b005b3480156106e457600080fd5b50610297611354565b3480156106f957600080fd5b506102976004803603602081101561071057600080fd5b503561135a565b34801561072357600080fd5b506102976004803603602081101561073a57600080fd5b50356113b5565b34801561074d57600080fd5b5061036a6113ce565b34801561076257600080fd5b5061036a6113d4565b34801561077757600080fd5b506102976113da565b34801561078c57600080fd5b506106d66113e0565b3480156107a157600080fd5b506106d6600480360360208110156107b857600080fd5b50356001600160a01b03166114a9565b3480156107d457600080fd5b5061036a600480360360208110156107eb57600080fd5b5035611602565b3480156107fe57600080fd5b5061036a61160f565b34801561081357600080fd5b5061039b611615565b34801561082857600080fd5b5061036a61161a565b34801561083d57600080fd5b506102976004803603602081101561085457600080fd5b50356001600160a01b0316611620565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b6006818154811061089757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606081565b600881565b61200081565b61100581565b6000805460ff16610937576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f815260200180612164602f913960400191505060405180910390fd5b600082156109fc57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050506040513d60208110156109f357600080fd5b50519050610a75565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a4657600080fd5b505af1158015610a5a573d6000803e3d6000fd5b505050506040513d6020811015610a7057600080fd5b505190505b600c805460010190556000610a8982611632565b600954909150610a9f908263ffffffff61166116565b600955600a54610ac7908290610abb908563ffffffff61166116565b9063ffffffff6116c216565b600a556001600160a01b038716600090815260056020526040902054610b3357600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610bb157600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610ca057600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610c2b611704565b90506000610c376119e8565b6001600160a01b0389166000908152600d6020526040902054909150610c75908290610c69908563ffffffff61166116565b9063ffffffff61166116565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610d455760405162461bcd60e51b815260040180806020018281038252602e8152602001806120a9602e913960400191505060405180910390fd5b60005460ff16610d865760405162461bcd60e51b81526004018080602001828103825260218152602001806120d76021913960400191505060405180910390fd5b610dfa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611c669050565b15610ec75760208114610e3e5760405162461bcd60e51b81526004018080602001828103825260328152602001806121936032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610e7c91858580838501838280828437600092019190915250611d4d92505050565b9050600254811115610ebf5760405162461bcd60e51b8152600401808060200182810382526060815260200180611f826060913960600191505060405180910390fd5b6001556112c2565b610f2084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506120876020830139611c66565b15610ff85760208114610f645760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fa291858580838501838280828437600092019190915250611d4d92505050565b90508015801590610fb557506001548110155b610ff05760405162461bcd60e51b815260040180806020018281038252606c8152602001806120f8606c913960800191505060405180910390fd5b6002556112c2565b61106c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611c669050565b1561113957602081146110b05760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110ee91858580838501838280828437600092019190915250611d4d92505050565b90506004548111156111315760405162461bcd60e51b8152600401808060200182810382526056815260200180611fe26056913960600191505060405180910390fd5b6003556112c2565b6111ad84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611c669050565b1561128557602081146111f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161122f91858580838501838280828437600092019190915250611d4d92505050565b9050801580159061124257506003548110155b61127d5760405162461bcd60e51b8152600401808060200182810382526061815260200180611f216061913960800191505060405180910390fd5b6004556112c2565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161136b5750806113b0565b81602810801561137c575060508211155b15611389575060286113b0565b60508211801561139a5750606e8211155b156113aa575060788190036113b0565b50600481045b919050565b6000602882116113c65750806113b0565b5060286113b0565b61100281565b61100381565b60095481565b60005460ff1615611438576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611486576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480611508576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506115b85760405161100290819084156108fc029085906000818181858888f19350505050158015611572573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506115ff565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061089757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600061165b60025461164f60015485611d5290919063ffffffff16565b9063ffffffff611dab16565b92915050565b6000828201838110156116bb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006116bb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ded565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561176057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611742575b5050505050905060608151604051908082528060200260200182016040528015611794578160200160208202803683370190505b50905060005b82518110156118215760008382815181106117b157fe5b6020026020010151905060006117eb60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546113b5565b9050808484815181106117fa57fe5b6020908102919091010152611815868263ffffffff61166116565b9550505060010161179a565b50600061183f60045461164f60035488611d5290919063ffffffff16565b9050611851858263ffffffff6116c216565b94508460015b845181101561192857600061188c8761164f8a88868151811061187657fe5b6020026020010151611d5290919063ffffffff16565b90506118d981600d60008986815181106118a257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461166190919063ffffffff16565b600d60008885815181106118e957fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205561191d838263ffffffff6116c216565b925050600101611857565b5061193e81600d6000876000815181106118a257fe5b600d60008660008151811061194f57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b84518110156119d057600560008683815181106119a257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611989565b506119dd60066000611ee9565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611a4457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a26575b5050505050905060608151604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905060005b8251811015611af7576000838281518110611a9557fe5b602002602001015190506000611acf60076000846001600160a01b03166001600160a01b031681526020019081526020016000205461135a565b905080848481518110611ade57fe5b6020908102919091010152949094019350600101611a7e565b506000611b1560045461164f60035488611d5290919063ffffffff16565b9050611b27858263ffffffff6116c216565b94508460015b8451811015611bb1576000611b4c8761164f8a88868151811061187657fe5b9050611b6281600d60008986815181106118a257fe5b600d6000888581518110611b7257fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611ba6838263ffffffff6116c216565b925050600101611b2d565b50611bc781600d6000876000815181106118a257fe5b600d600086600081518110611bd857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611c595760076000868381518110611c2b57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611c12565b506119dd60086000611ee9565b6000816040516020018082805190602001908083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611d095780518252601f199092019160209182019101611cea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611d615750600061165b565b82820282848281611d6e57fe5b04146116bb5760405162461bcd60e51b81526004018080602001828103825260218152602001806120666021913960400191505060405180910390fd5b60006116bb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e84565b60008184841115611e7c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e41578181015183820152602001611e29565b50505050905090810190601f168015611e6e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611ed35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e41578181015183820152602001611e29565b506000838581611edf57fe5b0495945050505050565b50805460008255906000526020600020908101906115ff91906119e591905b80821115611f1c5760008155600101611f08565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a264697066735822122046aa8f3564133ae19cf0f29fe8a7ebdf2a5f74f0268c42431d82384fe137b2ed64736f6c63430006040033", + }, + { + ContractAddr: RelayerHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b5061021461077d565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610782565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b50610270610788565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b5061021461078d565b3480156102a857600080fd5b5061023f610792565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b0316610798565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d6107b6565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f6107bc565b34801561034057600080fd5b506102146107c2565b34801561035557600080fd5b5061023f6107c7565b34801561036a57600080fd5b506102146107cd565b34801561037f57600080fd5b5061030d6107d2565b34801561039457600080fd5b5061030d6107df565b3480156103a957600080fd5b506102146107eb565b3480156103be57600080fd5b5061023f6107f0565b3480156103d357600080fd5b5061023f6107f6565b3480156103e857600080fd5b506102e46107fc565b3480156103fd57600080fd5b506101dc610805565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b50909250905061080a565b3480156104e157600080fd5b5061023f610c2c565b3480156104f657600080fd5b5061023f610c32565b34801561050b57600080fd5b506101fd610c38565b34801561052057600080fd5b506101fd610cba565b34801561053557600080fd5b5061023f610e73565b34801561054a57600080fd5b5061030d610e79565b34801561055f57600080fd5b50610214610e7f565b34801561057457600080fd5b5061023f610e84565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e8a565b156106775760405162461bcd60e51b815260040180806020018281038252602781526020018061109c6027913960400191505060405180910390fd5b3332146106c1576040805162461bcd60e51b81526020600482015260136024820152721b9bc81c1c9bde1e481a5cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60015434146107015760405162461bcd60e51b81526004018080602001828103825260258152602001806110776025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b606081565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661085d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461089d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110c3602e913960400191505060405180910390fd5b61090384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e909050565b15610a0657602081146109475760405162461bcd60e51b81526004018080602001828103825260228152602001806110f16022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161098591858580838501838280828437600092019190915250610f7792505050565b90506001811180156109a05750683635c9adc5dea000008111155b80156109ad575060025481115b6109fe576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b9a565b610a6184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e909050565b15610b5d5760208114610abb576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610af991858580838501838280828437600092019190915250610f7792505050565b9050600081118015610b0c575060015481105b610b55576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b9a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c90576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610d15576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d68576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d7061105c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610db4919063ffffffff610f7c16565b6040518115909202916000818181858888f19350505050158015610ddc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610e12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610ec55780518252601f199092019160209182019101610ea6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610f335780518252601f199092019160209182019101610f14565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6000610fbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610fc5565b9392505050565b600081848411156110545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611019578181015183820152602001611001565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a264697066735822122011778451ed6d3e3757ce2e74acfc7fa17bf5d16f07168a6ce073d7c91e583c8c64736f6c63430006040033", + }, + { + ContractAddr: GovHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610667565b61019b61066c565b6102d1610671565b6102d1610677565b6103e861067d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610686565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061068c565b6102d1610703565b6102d1610709565b6102b361070f565b6102d1610714565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6104f5611382565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061071a92505050565b91509150806105525761054960646107e0565b92505050610593565b600061055d8361084a565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d816107e0565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606081565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b33612000146106155760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b33612000146106cc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114166023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b610722611382565b600061072c611382565b6107346113ac565b61074561074086610beb565b610c10565b90506000805b61075483610c5a565b156107d357806107765761076f61076a84610c7b565b610cc9565b84526107cb565b80600114156107955761078b61076a84610c7b565b60208501526107cb565b80600214156107c6576107af6107aa84610c7b565b610d42565b6001600160a01b03166040850152600191506107cb565b6107d3565b60010161074b565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816107fa5790505090506108208363ffffffff16610d62565b8160008151811061082d57fe5b602002602001018190525061084181610d75565b9150505b919050565b60006108598260400151610dff565b6108c557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610845565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561093257818101518382015260200161091a565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561099257818101518382015260200161097a565b50505050905090810190601f1680156109bf5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109e057600080fd5b505af19250505080156109f1575060015b610be3576040516000815260443d1015610a0d57506000610aaa565b60046000803e60005160e01c6308c379a08114610a2e576000915050610aaa565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a5a57600092505050610aaa565b808301805167ffffffffffffffff811115610a7c576000945050505050610aaa565b8060208301013d8601811115610a9a57600095505050505050610aaa565b601f01601f191660405250925050505b80610ab55750610b58565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b14578181015183820152602001610afc565b50505050905090810190601f168015610b415780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610845565b3d808015610b82576040519150601f19603f3d011682016040523d82523d6000602084013e610b87565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b14578181015183820152602001610afc565b506000919050565b610bf36113cc565b506040805180820190915281518152602082810190820152919050565b610c186113ac565b610c2182610e05565b610c2a57600080fd5b6000610c398360200151610e3f565b60208085015160408051808201909152868152920190820152915050919050565b6000610c646113cc565b505080518051602091820151919092015191011190565b610c836113cc565b610c8c82610c5a565b610c9557600080fd5b60208201516000610ca582610ea2565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610cd757600080fd5b6000610ce68360200151610e3f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d1d576020820181803683370190505b5090506000816020019050610d39848760200151018285610fd5565b50949350505050565b8051600090601514610d5357600080fd5b610d5c82611020565b92915050565b6060610d5c610d70836110d5565b6111bb565b6060815160001415610d965750604080516000815260208101909152610845565b606082600081518110610da557fe5b602002602001015190506000600190505b8351811015610de657610ddc82858381518110610dcf57fe5b602002602001015161120d565b9150600101610db6565b50610841610df9825160c060ff1661128a565b8261120d565b3b151590565b8051600090610e1657506000610845565b6020820151805160001a9060c0821015610e3557600092505050610845565b5060019392505050565b8051600090811a6080811015610e59576000915050610845565b60b8811080610e74575060c08110801590610e74575060f881105b15610e83576001915050610845565b60c0811015610e975760b519019050610845565b60f519019050610845565b80516000908190811a6080811015610ebd5760019150610fce565b60b8811015610ed257607e1981019150610fce565b60c0811015610f4c57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f46576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50610fce565b60f8811015610f615760be1981019150610fce565b600060f78203600186019550806020036101000a865104915060018101820193505080831015610fcc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80610fdf57610662565b5b60208110610fff578251825260209283019290910190601f1901610fe0565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061103557508151602110155b61103e57600080fd5b600061104d8360200151610e3f565b905080836000015110156110a8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d3957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166111195750601861113d565b6fffffffffffffffffffffffffffffffff1984166111395750601061113d565b5060005b60208110156111735781818151811061115257fe5b01602001516001600160f81b0319161561116b57611173565b60010161113d565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111a8576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156111ed5750607f60f81b826000815181106111db57fe5b01602001516001600160f81b03191611155b156111f9575080610845565b610d5c61120b8351608060ff1661128a565b835b6060806040519050835180825260208201818101602087015b8183101561123e578051835260209283019201611226565b50855184518101855292509050808201602086015b8183101561126b578051835260209283019201611253565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106112da576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113345782840160f81b8160008151811061131657fe5b60200101906001600160f81b031916908160001a9053509050610d5c565b606061133f856110d5565b90508381510160370160f81b8260008151811061135857fe5b60200101906001600160f81b031916908160001a905350611379828261120d565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b60405180604001604052806113bf6113cc565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220ea2b2b402a564a222b3f3e7c0f671622652543c9c5f6cb6c7b8db265ae9ebe4564736f6c63430006040033", + }, + { + ContractAddr: TokenManagerContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "6080604052600436106102465760003560e01c806375d47a0a11610139578063ab51bb96116100b6578063dc6f5e901161007a578063dc6f5e90146108df578063dc927faf14610975578063f9a2bbc71461098a578063fc3e5908146108df578063fd6a68791461099f578063fe3a2af5146104fd57610246565b8063ab51bb96146108b5578063c81b1662146108ca578063c8509d81146107c5578063c8e704a4146108df578063d117a110146108f457610246565b806395b9ad26116100fd57806395b9ad261461084c57806396713da9146108615780639dc0926214610876578063a1a11bf51461088b578063a78abc16146108a057610246565b806375d47a0a146106e757806377d9dae8146106fc5780637942fd05146107b05780637d078e13146103c8578063831d65d1146107c557610246565b80634a688818116101c75780635f558f861161018b5780635f558f86146105515780636b3f1307146105665780636e47b4821461062e57806370fd5bad1461055157806372c4e0861461064357610246565b80634a688818146104fd5780634bc81c00146105125780634bf6c8821461024b57806351e80672146105275780635d499b1b1461053c57610246565b806323996b531161020e57806323996b53146103c85780633dffc387146103c857806343756e5c146103dd578063445fcefe1461040e578063493279b1146104d157610246565b8063077b8f351461024b5780630bee7a67146102765780630f212b1b146102a45780631182b875146102b95780631f91600b146103b3575b600080fd5b34801561025757600080fd5b506102606109b4565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b5061028b6109b9565b6040805163ffffffff9092168252519081900360200190f35b3480156102b057600080fd5b506102606109be565b3480156102c557600080fd5b5061033e600480360360408110156102dc57600080fd5b60ff8235169190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460018302840111600160201b8311171561033357600080fd5b5090925090506109c3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610378578181015183820152602001610360565b50505050905090810190601f1680156103a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103bf57600080fd5b50610260610a4c565b3480156103d457600080fd5b50610260610a51565b3480156103e957600080fd5b506103f2610a56565b604080516001600160a01b039092168252519081900360200190f35b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a5c945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610bbb565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b50610260610bc0565b34801561051e57600080fd5b50610260610bc5565b34801561053357600080fd5b506103f2610bca565b34801561054857600080fd5b506104bf610bd0565b34801561055d57600080fd5b50610260610bd9565b61061a6004803603604081101561057c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111600160201b831117156105d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bde945050505050565b604080519115158252519081900360200190f35b34801561063a57600080fd5b506103f2611460565b61061a6004803603602081101561065957600080fd5b810190602081018135600160201b81111561067357600080fd5b82018360208201111561068557600080fd5b803590602001918460018302840111600160201b831117156106a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611466945050505050565b3480156106f357600080fd5b506103f26118b4565b61061a6004803603604081101561071257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118ba945050505050565b3480156107bc57600080fd5b50610260611dc1565b3480156107d157600080fd5b5061084a600480360360408110156107e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b509092509050611dc6565b005b34801561085857600080fd5b50610260611e79565b34801561086d57600080fd5b50610260611e7e565b34801561088257600080fd5b506103f2611e83565b34801561089757600080fd5b506103f2611e89565b3480156108ac57600080fd5b5061061a611e8f565b3480156108c157600080fd5b5061028b610bc0565b3480156108d657600080fd5b506103f2611e98565b3480156108eb57600080fd5b50610260611e9e565b34801561090057600080fd5b5061091e6004803603602081101561091757600080fd5b5035611ea3565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561098157600080fd5b506103f2611efb565b34801561099657600080fd5b506103f2611f01565b3480156109ab57600080fd5b506103f2611f07565b600881565b606481565b600681565b60603361200014610a055760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b610a4483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f0d92505050565b949350505050565b600481565b600181565b61100181565b6020810151600090610a6c613168565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610af457600092505050610bb6565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d6020811015610b7c57600080fd5b505160808301516060840151919250600091610b9d9163ffffffff61219e16565b9050610baf818363ffffffff61219e16565b9450505050505b919050565b606081565b600081565b600581565b61200081565b6402540be40081565b600281565b600080610bea836121e7565b9050610bf4613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610cba576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610cd78260800151836060015161219e90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610d2d5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610de15760405162461bcd60e51b815260040180806020018281038252602e815260200180613272602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610e2d57600080fd5b505afa158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610ee89184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50519063ffffffff6121ee16565b1015610f3b576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b50519050808210801590610fc057506402540be4008206155b610ffb5760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b6000611007868b612248565b905063ffffffff8116611206576001600160a01b038a166323b872dd33611004611037898963ffffffff61219e16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b15801561113257600080fd5b505af1158015611146573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111c55781810151838201526020016111ad565b50505050905090810190601f1680156111f25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26112be565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561128257818101518382015260200161126a565b50505050905090810190601f1680156112af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556113186131a4565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611360573d6000803e3d6000fd5b5061200063f7a251d760016113748461269f565b611389886402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113e75781810151838201526020016113cf565b50505050905090810190601f1680156114145780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561143557600080fd5b505af1158015611449573d6000803e3d6000fd5b505050506001985050505050505050505b92915050565b61100581565b600080611472836121e7565b905061147c613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611542576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff16106115a4576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e657600080fd5b505afa1580156115fa573d6000803e3d6000fd5b505050506040513d602081101561161057600080fd5b5051905080821080159061162957506402540be4008206155b6116645760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556116be6131a4565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611701573d6000803e3d6000fd5b5061200063f7a251d760016117158461269f565b61172a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611788578181015183820152602001611770565b50505050905090810190601f1680156117b55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561186c578181015183820152602001611854565b50505050905090810190601f1680156118995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806118c6836121e7565b90506118d0613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611996576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d6020811015611a5757600080fd5b50516001600160a01b031614611ab4576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703265206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d6020811015611b2057600080fd5b50519050808210801590611b3957506402540be4008206155b611b745760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611bce6131a4565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611c11573d6000803e3d6000fd5b5061200063f7a251d76001611c258461269f565b611c3a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c98578181015183820152602001611c80565b50505050905090810190601f168015611cc55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611d78578181015183820152602001611d60565b50505050905090810190601f168015611da55780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611e065760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600381565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611f17613168565b6000611f228461276b565b9150915080611f78576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff1661202c576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055612183565b815160ff16600114156121365760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208557600080fd5b505afa158015612099573d6000803e3d6000fd5b505050506040513d60208110156120af57600080fd5b505190506001600160a01b038116156121305760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561211757600080fd5b505af115801561212b573d6000803e3d6000fd5b505050505b50612183565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b60006121e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128bd565b9392505050565b6020015190565b6000828201838110156121e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d60208110156122ae57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561233357600080fd5b8101908080516040519392919084600160201b82111561235257600080fd5b90830190602082018581111561236757600080fd5b8251600160201b81118282018810171561238057600080fd5b82525081516020918201929091019080838360005b838110156123ad578181015183820152602001612395565b50505050905090810190601f1680156123da5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b5051608087015160608801519192506000916124759163ffffffff61219e16565b9050428760c0015167ffffffffffffffff16101561249b57506001935061145a92505050565b6124a9838860200151612954565b6124bb57506002935061145a92505050565b808211156124d157506003935061145a92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50511461255257506004935061145a92505050565b8660a0015160ff16841461256e57506005935061145a92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b1580156125b357600080fd5b505afa1580156125c7573d6000803e3d6000fd5b505050506040513d60208110156125dd57600080fd5b50516001600160a01b031614158061267f57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d602081101561267a57600080fd5b505114155b1561269257506006935061145a92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816126b857505083519091506126e09063ffffffff16612a3c565b816000815181106126ed57fe5b6020026020010181905250612708836020015160001c612a3c565b8160018151811061271557fe5b60200260200101819052506121e081612a4f565b60006121e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ad9565b612773613168565b600061277d613168565b6127856131bb565b61279661279186612b3e565b612b63565b90506000805b6127a583612bad565b156128b057806127ca576127c06127bb84612bce565b612c1c565b60ff1684526128a8565b80600114156127e9576127df6127bb84612bce565b60208501526128a8565b8060021415612816576128036127fe84612bce565b612cd1565b6001600160a01b031660408501526128a8565b80600314156128355761282b6127bb84612bce565b60608501526128a8565b80600414156128545761284a6127bb84612bce565b60808501526128a8565b8060051415612876576128696127bb84612bce565b60ff1660a08501526128a8565b80600614156128a35761288b6127bb84612bce565b67ffffffffffffffff1660c0850152600191506128a8565b6128b0565b60010161279c565b5091935090915050915091565b6000818484111561294c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129115781810151838201526020016128f9565b50505050905090810190601f16801561293e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b815160009083906008108061296a575080516003115b1561297957600091505061145a565b604080516020808252818301909252606091602082018180368337019050509050836020820152808251815181106129ad57fe5b6020910101516001600160f81b031916602d60f81b146129d25760009250505061145a565b600160005b8351811015612a32578281815181106129ec57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612a0d57fe5b01602001516001600160f81b03191614612a2a5760009150612a32565b6001016129d7565b5095945050505050565b606061145a612a4a83612ceb565b612dd1565b6060815160001415612a705750604080516000815260208101909152610bb6565b606082600081518110612a7f57fe5b602002602001015190506000600190505b8351811015612ac057612ab682858381518110612aa957fe5b6020026020010151612e23565b9150600101612a90565b506121e0612ad3825160c060ff16612ea0565b82612e23565b60008183612b285760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129115781810151838201526020016128f9565b506000838581612b3457fe5b0495945050505050565b612b466131db565b506040805180820190915281518152602082810190820152919050565b612b6b6131bb565b612b7482612f98565b612b7d57600080fd5b6000612b8c8360200151612fd2565b60208085015160408051808201909152868152920190820152915050919050565b6000612bb76131db565b505080518051602091820151919092015191011190565b612bd66131db565b612bdf82612bad565b612be857600080fd5b60208201516000612bf882613035565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612c3157508151602110155b612c3a57600080fd5b6000612c498360200151612fd2565b90508083600001511015612ca4576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561219557506020919091036101000a90049392505050565b8051600090601514612ce257600080fd5b61145a82612c1c565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612d2f57506018612d53565b6fffffffffffffffffffffffffffffffff198416612d4f57506010612d53565b5060005b6020811015612d8957818181518110612d6857fe5b01602001516001600160f81b03191615612d8157612d89565b600101612d53565b60008160200390506060816040519080825280601f01601f191660200182016040528015612dbe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612e035750607f60f81b82600081518110612df157fe5b01602001516001600160f81b03191611155b15612e0f575080610bb6565b61145a612e218351608060ff16612ea0565b835b6060806040519050835180825260208201818101602087015b81831015612e54578051835260209283019201612e3c565b50855184518101855292509050808201602086015b81831015612e81578051835260209283019201612e69565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612ef0576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612f4a5782840160f81b81600081518110612f2c57fe5b60200101906001600160f81b031916908160001a905350905061145a565b6060612f5585612ceb565b90508381510160370160f81b82600081518110612f6e57fe5b60200101906001600160f81b031916908160001a905350612f8f8282612e23565b95945050505050565b8051600090612fa957506000610bb6565b6020820151805160001a9060c0821015612fc857600092505050610bb6565b5060019392505050565b8051600090811a6080811015612fec576000915050610bb6565b60b8811080613007575060c08110801590613007575060f881105b15613016576001915050610bb6565b60c081101561302a5760b519019050610bb6565b60f519019050610bb6565b80516000908190811a60808110156130505760019150613161565b60b881101561306557607e1981019150613161565b60c08110156130df57600060b78203600186019550806020036101000a8651049150600181018201935050808310156130d9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613161565b60f88110156130f45760be1981019150613161565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561315f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b60405180604001604052806131ce6131db565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe72656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e6420726571756573746f6e6c79206265703265206f776e65722063616e20617070726f766520746869732062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a2646970667358221220f5905eb90e4a072fe66973705300bc7792e1c43c73c571a09629b9153e6b871864736f6c63430006040033", + }, + { + ContractAddr: CrossChainContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612051565b604080516001600160401b039092168252519081900360200190f35b61044361206c565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612072565b61038a612092565b6104436120b1565b6105b16120b7565b6106c16004803603602081101561074257600080fd5b503560ff1661246e565b6105b16004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919350915035612489565b6104436125da565b6102556125e0565b6104436125e5565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125eb565b50905061086a818388516125f5565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606081565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612bcc6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c612636565b858561267d565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da08861277a565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b61282a565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100600081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b22602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129809050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a6792505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b9a6032913960400191505060405180910390fd5b600155611fbf565b611c5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506129809050565b15611de457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cdf5760405162461bcd60e51b815260040180806020018281038252605a815260200180612ac8605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590611cfd81612a6c565b611d4e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a35050505050611fbf565b611e5184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129809050565b15611f8257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ed45760405162461bcd60e51b815260040180806020018281038252604a815260200180612b50604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f78576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fbf565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff161561210f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166124dc576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff80891685529252909120548591166125395760405162461bcd60e51b8152600401808060200182810382526031815260200180612a976031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b03169261259e9284928a9261115792909189918c908c908190840183828082843760009201919091525061080092505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b8051602090910191565b5b60208110612615578251825260209283019290910190601f19016125f6565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100600060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268c57506000612771565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126c3576020820181803683370190505b50905060006126d182612a72565b6020808901518252019050866000806126e9896125eb565b80865260209095019490925090506127028285836125f5565b9283019261270f886125eb565b80865260209095019490925090506127288285836125f5565b9283018a81526020019261273b876125eb565b909250905061274b8285836125f5565b508351602001612759612a78565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127aa575050604080516000808252602082019092529092508291508190612823565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127f5576020820181803683370190505b5090506000612803826125eb565b509050612815858260218d51036125f5565b506001975091955093509150505b9193509193565b600254431115612869576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128aa565b600380546001908101918290555410156128aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606085604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612940578181015183820152602001612928565b50505050905090810190601f16801561296d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129b55780518252601f199092019160209182019101612996565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a235780518252601f199092019160209182019101612a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a264697066735822122033c2492ac02e70488d9ed3adb95888d7f5998dff786cf03d72be0cde759a14d064736f6c63430006040033", + }, + }, + } + + nielsUpgrade[chapelNet] = &Upgrade{ + UpgradeName: "niels", + Configs: []*UpgradeConfig{ + { + ContractAddr: ValidatorContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "60806040526004361061027d5760003560e01c80639dc092621161014f578063c8509d81116100c1578063eb57e2021161007a578063eb57e20214610940578063eda5868c14610973578063f340fa0114610988578063f9a2bbc7146109ae578063fc3e5908146109c3578063fd6a6879146109d85761027d565b8063c8509d8114610609578063d86222d5146108d7578063daacdb66146108ec578063dc927faf14610901578063e086c7b114610916578063e1c7392a1461092b5761027d565b8063ab51bb9611610113578063ab51bb961461074a578063ac4317511461075f578063ad3c9da61461082a578063b7ab4db51461085d578063bf9f49951461041b578063c81b1662146108c25761027d565b80639dc09262146106cd578063a1a11bf5146106e2578063a5422d5c146106f7578063a78abc161461070c578063aaf5eb68146107355761027d565b80635667515a116101f35780637942fd05116101ac5780637942fd05146105df57806381650b62146105f4578063831d65d114610609578063853230aa1461068e57806386249882146106a357806396713da9146106b85761027d565b80635667515a146105005780635d77156c146105155780636969a25c1461052a5780636e47b482146105a057806370fd5bad146105b557806375d47a0a146105ca5761027d565b80633dffc387116102455780633dffc3871461041b57806343756e5c14610446578063493279b1146104775780634bf6c882146104a357806351e80672146104b8578063565c56b3146104cd5761027d565b80630bee7a67146102825780631182b875146102b05780631ff18069146103aa578063219f22d5146103d157806335409f7f146103e6575b600080fd5b34801561028e57600080fd5b506102976109ed565b6040805163ffffffff9092168252519081900360200190f35b3480156102bc57600080fd5b50610335600480360360408110156102d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156102f757600080fd5b82018360208201111561030957600080fd5b803590602001918460018302840111600160201b8311171561032a57600080fd5b5090925090506109f2565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036f578181015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103b657600080fd5b506103bf610bdf565b60408051918252519081900360200190f35b3480156103dd57600080fd5b50610297610be5565b3480156103f257600080fd5b506104196004803603602081101561040957600080fd5b50356001600160a01b0316610bea565b005b34801561042757600080fd5b50610430610efe565b6040805160ff9092168252519081900360200190f35b34801561045257600080fd5b5061045b610f03565b604080516001600160a01b039092168252519081900360200190f35b34801561048357600080fd5b5061048c610f09565b6040805161ffff9092168252519081900360200190f35b3480156104af57600080fd5b50610430610f0e565b3480156104c457600080fd5b5061045b610f13565b3480156104d957600080fd5b506103bf600480360360208110156104f057600080fd5b50356001600160a01b0316610f19565b34801561050c57600080fd5b50610430610f6b565b34801561052157600080fd5b50610297610f70565b34801561053657600080fd5b506105546004803603602081101561054d57600080fd5b5035610f75565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b3480156105ac57600080fd5b5061045b610fd9565b3480156105c157600080fd5b50610430610fdf565b3480156105d657600080fd5b5061045b610fe4565b3480156105eb57600080fd5b50610430610fea565b34801561060057600080fd5b50610297610fef565b34801561061557600080fd5b506104196004803603604081101561062c57600080fd5b60ff8235169190810190604081016020820135600160201b81111561065057600080fd5b82018360208201111561066257600080fd5b803590602001918460018302840111600160201b8311171561068357600080fd5b509092509050610ff4565b34801561069a57600080fd5b506103bf6110a7565b3480156106af57600080fd5b506103bf6110ad565b3480156106c457600080fd5b506104306110b3565b3480156106d957600080fd5b5061045b6110b8565b3480156106ee57600080fd5b5061045b6110be565b34801561070357600080fd5b506103356110c4565b34801561071857600080fd5b506107216110e3565b604080519115158252519081900360200190f35b34801561074157600080fd5b506103bf6110ec565b34801561075657600080fd5b50610297610f6b565b34801561076b57600080fd5b506104196004803603604081101561078257600080fd5b810190602081018135600160201b81111561079c57600080fd5b8201836020820111156107ae57600080fd5b803590602001918460018302840111600160201b831117156107cf57600080fd5b919390929091602081019035600160201b8111156107ec57600080fd5b8201836020820111156107fe57600080fd5b803590602001918460018302840111600160201b8311171561081f57600080fd5b5090925090506110f5565b34801561083657600080fd5b506103bf6004803603602081101561084d57600080fd5b50356001600160a01b031661139c565b34801561086957600080fd5b506108726113ae565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156108ae578181015183820152602001610896565b505050509050019250505060405180910390f35b3480156108ce57600080fd5b5061045b6114d4565b3480156108e357600080fd5b506103bf6114da565b3480156108f857600080fd5b506103bf6114e6565b34801561090d57600080fd5b5061045b6114ec565b34801561092257600080fd5b506103bf6114f2565b34801561093757600080fd5b506104196114f7565b34801561094c57600080fd5b506104196004803603602081101561096357600080fd5b50356001600160a01b03166116fa565b34801561097f57600080fd5b506102976118c9565b6104196004803603602081101561099e57600080fd5b50356001600160a01b03166118ce565b3480156109ba57600080fd5b5061045b611b04565b3480156109cf57600080fd5b50610430611b0a565b3480156109e457600080fd5b5061045b611b0f565b606481565b60005460609060ff16610a48576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610a885760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b610a90613d69565b6000610ad185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b1592505050565b9150915080610aed57610ae46064611c6e565b92505050610bd8565b815160009060ff16610b0d57610b068360200151611ccf565b9050610ba4565b825160ff1660011415610ba057826020015151600114610b7a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526025815260200180613e6c6025913960400191505060405180910390a1506067610b9b565b610b068360200151600081518110610b8e57fe5b6020026020010151612ad5565b610ba4565b5060655b63ffffffff8116610bc95750506040805160008152602081019091529150610bd89050565b610bd281611c6e565b93505050505b9392505050565b60035481565b606881565b3361100114610c2a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610c4e5750610efb565b600181039050600060018281548110610c6357fe5b60009182526020909120600360049092020101546001549091506000190180610cb257600060018481548110610c9557fe5b906000526020600020906004020160030181905550505050610efb565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610e3457600180546000198101908110610d2957fe5b906000526020600020906004020160018481548110610d4457fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610e0957fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610e3f57fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610e9257fe5b0490508015610ef65760015460005b81811015610ef3578260018281548110610eb757fe5b9060005260206000209060040201600301540160018281548110610ed757fe5b6000918252602090912060036004909202010155600101610ea1565b50505b505050505b50565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b03811660009081526004602052604081205480610f41576000915050610f66565b600180820381548110610f5057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b60018181548110610f8257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b600b81565b606681565b33612000146110345760405162461bcd60e51b815260040180806020018281038252602f8152602001806140de602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b6103e881565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101b78152602001613f066101b7913981565b60005460ff1681565b6402540be40081565b60005460ff16611148576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146111885760405162461bcd60e51b815260040180806020018281038252602e815260200180613e91602e913960400191505060405180910390fd5b6111f284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612c4c9050565b156112cd57602081146112365760405162461bcd60e51b8152600401808060200182810382526026815260200180613ee06026913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161127491858580838501838280828437600092019190915250612d3492505050565b90506064811015801561128a5750620186a08111155b6112c55760405162461bcd60e51b8152600401808060200182810382526027815260200180613e456027913960400191505060405180910390fd5b60025561130a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b828110156113ff57600181815481106113cd57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166113f7576001909101905b6001016113b8565b5060608160405190808252806020026020018201604052801561142c578160200160208202803683370190505b50600092509050815b838110156114cc576001818154811061144a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166114c4576001818154811061147a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106114a557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611435565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561154f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611557613d69565b600061157d604051806101e001604052806101b78152602001613f066101b79139611b15565b91509150806115bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806140bd6021913960400191505060405180910390fd5b60005b8260200151518110156116e2576001836020015182815181106115df57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106116b557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016115c0565b50506103e8600255506000805460ff19166001179055565b336110011461173a5760405162461bcd60e51b815260040180806020018281038252602981526020018061413a6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061175e5750610efb565b60018103905060006001828154811061177357fe5b906000526020600020906004020160030154905060006001838154811061179657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a28061180557505050610efb565b600081838161181057fe5b0490508015610ef65760005b8481101561186e57816001828154811061183257fe5b906000526020600020906004020160030154016001828154811061185257fe5b600091825260209091206003600490920201015560010161181c565b50600180549085015b81811015610ef357826001828154811061188d57fe5b90600052602060002090600402016003015401600182815481106118ad57fe5b6000918252602090912060036004909202010155600101611877565b606581565b33411461190c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061410d602d913960400191505060405180910390fd5b60005460ff1661195f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b600034116119ac576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b03811660009081526004602052604090205434908015611abf5760006001808303815481106119de57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611a49576040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611ab9565b600354611a5c908463ffffffff612d3916565b6003908155810154611a74908463ffffffff612d3916565b60038201556040805184815290516001600160a01b038616917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611aff565b6040805183815290516001600160a01b038516917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b505050565b61100081565b600381565b61100481565b611b1d613d69565b6000611b27613d69565b611b2f613d81565b611b40611b3b86612d93565b612db8565b90506000805b611b4f83612e02565b15611c605780611b7457611b6a611b6584612e23565b612e71565b60ff168452611c58565b8060011415611c53576060611b90611b8b85612e23565b612f28565b90508051604051908082528060200260200182016040528015611bcd57816020015b611bba613da1565b815260200190600190039081611bb25790505b50602086015260005b8151811015611c4857611be7613da1565b6000611c05848481518110611bf857fe5b6020026020010151612ff9565b9150915080611c2257876000995099505050505050505050611c69565b8188602001518481518110611c3357fe5b60209081029190910101525050600101611bd6565b506001925050611c58565b611c60565b600101611b46565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611c88579050509050611cae8363ffffffff166130d6565b81600081518110611cbb57fe5b6020026020010181905250610bd8816130e9565b6000806060611cdd84613173565b9150915081611d8a577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015611d45578181015183820152602001611d2d565b50505050905090810190601f168015611d725780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050610f66565b600080805b600154811015611e075767016345785d8a000060018281548110611daf57fe5b90600052602060002090600402016003015410611dd157600190920191611dff565b600060018281548110611de057fe5b9060005260206000209060040201600301541115611dff576001909101905b600101611d8f565b50606082604051908082528060200260200182016040528015611e34578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015611e63578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015611e92578160200160208202803683370190505b509050606085604051908082528060200260200182016040528015611ec1578160200160208202803683370190505b5090506000606086604051908082528060200260200182016040528015611ef2578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015611f21578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051905067016345785d8a000081111561200d577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2604051808060200182810382526021815260200180613ebf6021913960400191505060405180910390a160689d5050505050505050505050505050610f66565b60005b6001548110156122805767016345785d8a00006001828154811061203057fe5b906000526020600020906004020160030154106121b6576001818154811061205457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061208557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106120ba57fe5b906000526020600020906004020160030154816120d357fe5b06600183815481106120e157fe5b906000526020600020906004020160030154039050612109838261325590919063ffffffff16565b8a8e8151811061211557fe5b6020026020010181815250506001828154811061212e57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061215f57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061218c57fe5b60209081029190910101526121a7878263ffffffff612d3916565b6001909d019c96506122789050565b6000600182815481106121c557fe5b906000526020600020906004020160030154111561227857600181815481106121ea57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061221b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061224857fe5b906000526020600020906004020160030154848c8151811061226657fe5b60209081029190910101526001909a01995b600101612010565b50600085156126be576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156123125781810151838201526020016122fa565b50505050905001848103835287818151815260200191508051906020019060200280838360005b83811015612351578181015183820152602001612339565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015612390578181015183820152602001612378565b505050509050019750505050505050506020604051808303818588803b1580156123b957600080fd5b505af1935050505080156123df57506040513d60208110156123da57600080fd5b505160015b61261a576040516000815260443d10156123fb57506000612496565b60046000803e60005160e01c6308c379a0811461241c576000915050612496565b60043d036004833e81513d60248201116001600160401b038211171561244757600092505050612496565b80830180516001600160401b03811115612468576000945050505050612496565b8060208301013d860181111561248657600095505050505050612496565b601f01601f191660405250925050505b806124a15750612545565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125055781810151838201526020016124ed565b50505050905090810190601f1680156125325780820380516001836020036101000a031916815260200191505b509250505060405180910390a250612615565b3d80801561256f576040519150601f19603f3d011682016040523d82523d6000602084013e612574565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156125d95781810151838201526020016125c1565b50505050905090810190601f1680156126065780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6126be565b8015612658576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16126bc565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b80156128745760005b88518110156128725760008982815181106126de57fe5b602002602001015190506000600182815481106126f757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc918590811061272857fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f19350505050905080156127e4576001828154811061276957fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d91859081106127b857fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612868565b600182815481106127f157fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d918590811061284057fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016126c7565b505b8451156129be5760005b85518110156129bc57600086828151811061289557fe5b60200260200101516001600160a01b03166108fc8784815181106128b557fe5b60200260200101519081150290604051600060405180830381858888f193505050509050801561294b578682815181106128eb57fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d87848151811061292957fe5b60200260200101516040518082815260200191505060405180910390a26129b3565b86828151811061295757fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d87848151811061299557fe5b60200260200101516040518082815260200191505060405180910390a25b5060010161287e565b505b4715612a27576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612a25573d6000803e3d6000fd5b505b60006003819055600555825115612a4157612a4183613297565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a7e57600080fd5b505af1158015612a92573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612b265750600180820381548110612b0657fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612b6c5782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050610f66565b600154600554600019820111801590612bc25784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050610f66565b600580546001908101909155805481906000198601908110612be057fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612c815780518252601f199092019160209182019101612c62565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612cef5780518252601f199092019160209182019101612cd0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b600082820183811015610bd8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b612d9b613dd6565b506040805180820190915281518152602082810190820152919050565b612dc0613d81565b612dc98261375e565b612dd257600080fd5b6000612de18360200151613798565b60208085015160408051808201909152868152920190820152915050919050565b6000612e0c613dd6565b505080518051602091820151919092015191011190565b612e2b613dd6565b612e3482612e02565b612e3d57600080fd5b60208201516000612e4d826137fb565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612e8657508151602110155b612e8f57600080fd5b6000612e9e8360200151613798565b90508083600001511015612ef9576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015612f1f57826020036101000a820491505b50949350505050565b6060612f338261375e565b612f3c57600080fd5b6000612f478361392e565b9050606081604051908082528060200260200182016040528015612f8557816020015b612f72613dd6565b815260200190600190039081612f6a5790505b5090506000612f978560200151613798565b60208601510190506000805b84811015612fee57612fb4836137fb565b9150604051806040016040528083815260200184815250848281518110612fd757fe5b602090810291909101015291810191600101612fa3565b509195945050505050565b613001613da1565b600061300b613da1565b613013613d81565b61301c85612db8565b90506000805b61302b83612e02565b15611c6057806130565761304661304184612e23565b61398a565b6001600160a01b031684526130ce565b806001141561307e5761306b61304184612e23565b6001600160a01b031660208501526130ce565b80600214156130a65761309361304184612e23565b6001600160a01b031660408501526130ce565b8060031415611c53576130bb611b6584612e23565b6001600160401b03166060850152600191505b600101613022565b6060612d2e6130e4836139a4565b613a8a565b606081516000141561310a5750604080516000815260208101909152610f66565b60608260008151811061311957fe5b602002602001015190506000600190505b835181101561315a576131508285838151811061314357fe5b6020026020010151613adc565b915060010161312a565b50610bd861316d825160c060ff16613b59565b82613adc565b600060606029835111156131a5576000604051806060016040528060298152602001613df16029913991509150611c69565b60005b835181101561323b5760005b81811015613232578481815181106131c857fe5b6020026020010151600001516001600160a01b03168583815181106131e957fe5b6020026020010151600001516001600160a01b0316141561322a5760006040518060600160405280602b8152602001613e1a602b9139935093505050611c69565b6001016131b4565b506001016131a8565b505060408051602081019091526000815260019150915091565b6000610bd883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613c51565b600154815160005b828110156133b45760016132b1613da1565b600183815481106132be57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b848110156133885786818151811061334e57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156133805760009250613388565b60010161333a565b5081156133aa5780516001600160a01b03166000908152600460205260408120555b505060010161329f565b508082111561342957805b828110156134275760018054806133d257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b03191690556003909101919091559155016133bf565b505b6000818310613438578161343a565b825b905060005b81811015613634576134ec85828151811061345657fe5b60200260200101516001838154811061346b57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a0820152613ce8565b61360757806001016004600087848151811061350457fe5b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000208190555084818151811061354057fe5b60200260200101516001828154811061355557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a09091015160039091015561362c565b60006001828154811061361657fe5b9060005260206000209060040201600301819055505b60010161343f565b508282111561375857825b82811015610ef657600185828151811061365557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a0909201516003909301929092558751908401929088908590811061372b57fe5b602090810291909101810151516001600160a01b031682528101919091526040016000205560010161363f565b50505050565b805160009061376f57506000610f66565b6020820151805160001a9060c082101561378e57600092505050610f66565b5060019392505050565b8051600090811a60808110156137b2576000915050610f66565b60b88110806137cd575060c081108015906137cd575060f881105b156137dc576001915050610f66565b60c08110156137f05760b519019050610f66565b60f519019050610f66565b80516000908190811a60808110156138165760019150613927565b60b881101561382b57607e1981019150613927565b60c08110156138a557600060b78203600186019550806020036101000a86510491506001810182019350508083101561389f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613927565b60f88110156138ba5760be1981019150613927565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613925576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061393f57506000610f66565b600080905060006139538460200151613798565b602085015185519181019250015b8082101561398157613972826137fb565b60019093019290910190613961565b50909392505050565b805160009060151461399b57600080fd5b612d2e82612e71565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166139e857506018613a0c565b6fffffffffffffffffffffffffffffffff198416613a0857506010613a0c565b5060005b6020811015613a4257818181518110613a2157fe5b01602001516001600160f81b03191615613a3a57613a42565b600101613a0c565b60008160200390506060816040519080825280601f01601f191660200182016040528015613a77576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613abc5750607f60f81b82600081518110613aaa57fe5b01602001516001600160f81b03191611155b15613ac8575080610f66565b612d2e613ada8351608060ff16613b59565b835b6060806040519050835180825260208201818101602087015b81831015613b0d578051835260209283019201613af5565b50855184518101855292509050808201602086015b81831015613b3a578051835260209283019201613b22565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613ba9576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613c035782840160f81b81600081518110613be557fe5b60200101906001600160f81b031916908160001a9053509050612d2e565b6060613c0e856139a4565b90508381510160370160f81b82600081518110613c2757fe5b60200101906001600160f81b031916908160001a905350613c488282613adc565b95945050505050565b60008184841115613ce05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613ca5578181015183820152602001613c8d565b50505050905090810190601f168015613cd25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b805182516000916001600160a01b039182169116148015613d22575081602001516001600160a01b031683602001516001600160a01b0316145b8015613d47575081604001516001600160a01b031683604001516001600160a01b0316145b8015610bd85750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b6040518060400160405280613d94613dd6565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d69746475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d61746368f901b480f901b0f846941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf9477f066f3fb515bb97015e4b4afddbcb25c94286b86048c27395000f84694b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794748c284f46ab87fd492326f1e2fe731d22ad2db386048c27395000f84694a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f940ce09b38374887cb564b7efa60be130d99ed5f9586048c27395000f84694980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b2709407eecf36cf0901fefe4bc505d6ba03c7480c7b5786048c27395000f8469435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194f57d36e129881a3a13a024fe8072507e5b2e70f886048c27395000f84694f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594ddfcaedf9bb451098c9917a45f02bd61342cca6686048c273950006661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220ccbabefa423adb1cc63a2da2811a349dd54007c9dc3bd490ac200572c4e8eb1064736f6c63430006040033", + }, + { + ContractAddr: SlashContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b50600436106102275760003560e01c8063831d65d111610130578063c80d4b8f116100b8578063e1c7392a1161007c578063e1c7392a146106d9578063f9a2bbc7146106e1578063fc3e5908146106e9578063fc4333cd146106f1578063fd6a6879146106f957610227565b8063c80d4b8f14610623578063c81b16621461062b578063c8509d8114610633578063c96be4cb146106ab578063dc927faf146106d157610227565b8063a1a11bf5116100ff578063a1a11bf514610531578063a78abc1614610539578063ab51bb9614610555578063ac0af6291461055d578063ac4317511461056557610227565b8063831d65d11461049f57806396713da9146105195780639bc8e4f2146105215780639dc092621461052957610227565b80634bf6c882116101b35780636e47b482116101825780636e47b4821461047757806370fd5bad1461047f57806375d47a0a146104875780637912a65d1461048f5780637942fd051461049757610227565b80634bf6c8821461045757806351e806721461045f578063567a372d1461046757806362b72cf51461046f57610227565b806337c8dab9116101fa57806337c8dab9146103b9578063389f4f71146103f85780633dffc3871461041257806343756e5c14610430578063493279b11461043857610227565b80630bee7a671461022c5780631182b8751461024d57806323bac5a21461033a57806335aa2e4414610380575b600080fd5b610234610701565b6040805163ffffffff9092168252519081900360200190f35b6102c56004803603604081101561026357600080fd5b60ff8235169190810190604081016020820135600160201b81111561028757600080fd5b82018360208201111561029957600080fd5b803590602001918460018302840111600160201b831117156102ba57600080fd5b509092509050610706565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ff5781810151838201526020016102e7565b50505050905090810190601f16801561032c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103606004803603602081101561035057600080fd5b50356001600160a01b03166107da565b604080519384526020840192909252151582820152519081900360600190f35b61039d6004803603602081101561039657600080fd5b50356107fd565b604080516001600160a01b039092168252519081900360200190f35b6103df600480360360208110156103cf57600080fd5b50356001600160a01b0316610824565b6040805192835260208301919091528051918290030190f35b61040061087b565b60408051918252519081900360200190f35b61041a610881565b6040805160ff9092168252519081900360200190f35b61039d610886565b61044061088c565b6040805161ffff9092168252519081900360200190f35b61041a610891565b61039d610896565b61040061089c565b6104006108a2565b61039d6108a8565b61041a6108ae565b61039d6108b3565b6104006108b9565b61041a6108be565b610517600480360360408110156104b557600080fd5b60ff8235169190810190604081016020820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460018302840111600160201b8311171561050c57600080fd5b5090925090506108c3565b005b61041a610a1e565b610400610a23565b61039d610a2e565b61039d610a34565b610541610a3a565b604080519115158252519081900360200190f35b610234610a43565b610400610a48565b6105176004803603604081101561057b57600080fd5b810190602081018135600160201b81111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111600160201b831117156105c857600080fd5b919390929091602081019035600160201b8111156105e557600080fd5b8201836020820111156105f757600080fd5b803590602001918460018302840111600160201b8311171561061857600080fd5b509092509050610a4d565b610400610e3b565b61039d610e40565b6105176004803603604081101561064957600080fd5b60ff8235169190810190604081016020820135600160201b81111561066d57600080fd5b82018360208201111561067f57600080fd5b803590602001918460018302840111600160201b831117156106a057600080fd5b509092509050610e46565b610517600480360360208110156106c157600080fd5b50356001600160a01b0316610ef9565b61039d61131e565b610517611324565b61039d611395565b61041a61139b565b6105176113a0565b61039d61182b565b606481565b606033612000146107485760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff1661078d576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642073796e207061636b6167650000604482015290519081900360640190fd5b600260208190526000918252604090912080546001820154919092015460ff1683565b6001818154811061080a57fe5b6000918252602090912001546001600160a01b0316905081565b60008061082f612146565b5050506001600160a01b0316600090815260026020818152604092839020835160608101855281548082526001830154938201849052919093015460ff16151592909301919091529091565b60055481565b600181565b61100181565b606181565b600881565b61200081565b60045481565b60035481565b61100581565b600281565b61100881565b603281565b600b81565b33612000146109035760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610948576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b610950612169565b600061099184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061183192505050565b9150915080156109db5781516040805163ffffffff9092168252517f7f0956d47419b9525356e7111652b653b530ec6f5096dccc04589bc38e6299679181900360200190a1610a17565b81516040805163ffffffff9092168252517f7d45f62d17443dd4547bca8a8112c60e2385669318dc300ec61a5d2492f262e79181900360200190a15b5050505050565b600981565b662386f26fc1000081565b61100781565b61100681565b60005460ff1681565b600081565b600481565b60005460ff16610a92576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b3361100714610ad25760405162461bcd60e51b815260040180806020018281038252602e81526020018061220d602e913960400191505060405180910390fd5b610b3d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260148152731b5a5cd9195b59585b9bdc951a1c995cda1bdb1960621b602082015291506118b19050565b15610c165760208114610b815760405162461bcd60e51b81526004018080602001828103825260278152602001806121b66027913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610bbf9185858083850183828082843760009201919091525061199992505050565b905060018110158015610bd3575060055481105b610c0e5760405162461bcd60e51b815260040180806020018281038252602581526020018061225d6025913960400191505060405180910390fd5b600455610da9565b610c7c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e19995b1bdb9e551a1c995cda1bdb19608a1b602082015291506118b19050565b15610d6c5760208114610cc05760405162461bcd60e51b815260040180806020018281038252602281526020018061223b6022913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610cfe9185858083850183828082843760009201919091525061199992505050565b90506103e88111158015610d13575060045481115b610d64576040805162461bcd60e51b815260206004820181905260248201527f7468652066656c6f6e795468726573686f6c64206f7574206f662072616e6765604482015290519081900360640190fd5b600555610da9565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b609681565b61100281565b3361200014610e865760405162461bcd60e51b815260040180806020018281038252602f815260200180612282602f913960400191505060405180910390fd5b60005460ff16610ecb576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6040517f07db600eebe2ac176be8dcebad61858c245a4961bb32ca2aa3d159b09aa0810e90600090a1505050565b334114610f375760405162461bcd60e51b815260040180806020018281038252602d8152602001806122b1602d913960400191505060405180910390fd5b60005460ff16610f7c576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b6003544311610fd2576040805162461bcd60e51b815260206004820181905260248201527f63616e206e6f7420736c61736820747769636520696e206f6e6520626c6f636b604482015290519081900360640190fd5b3a1561101c576040805162461bcd60e51b81526020600482015260146024820152736761737072696365206973206e6f74207a65726f60601b604482015290519081900360640190fd5b611024612146565b506001600160a01b0381166000908152600260208181526040928390208351606081018552815481526001820154928101929092529091015460ff16158015928201929092529061107f5760208101805160010190526110d8565b60016040820181905260208201819052805480820182556000919091527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b0384161790555b4381526005546020820151816110ea57fe5b0661123c57600060208201819052604080516335409f7f60e01b81526001600160a01b03851660048201529051611000926335409f7f926024808201939182900301818387803b15801561113d57600080fd5b505af1158015611151573d6000803e3d6000fd5b505050506120006001600160a01b031663f7a251d7600b6111718561199e565b60006040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156111d15781810151838201526020016111b9565b50505050905090810190601f1680156111fe5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b505050506112b2565b60045481602001518161124b57fe5b066112b257604080516375abf10160e11b81526001600160a01b038416600482015290516110009163eb57e20291602480830192600092919082900301818387803b15801561129957600080fd5b505af11580156112ad573d6000803e3d6000fd5b505050505b6001600160a01b0382166000818152600260208181526040808420865181559186015160018301558581015191909201805460ff1916911515919091179055517fddb6012116e51abf5436d956a4f0ebd927e92c576ff96d7918290c8782291e3e9190a2505043600355565b61100381565b60005460ff161561137c576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b603260045560966005556000805460ff19166001179055565b61100081565b600381565b33611000146113e05760405162461bcd60e51b81526004018080602001828103825260308152602001806121dd6030913960400191505060405180910390fd5b60005460ff16611425576040805162461bcd60e51b815260206004820152601960248201526000805160206122de833981519152604482015290519081900360640190fd5b60015461143157611829565b600154600090600019015b8082116117fd576000805b8284101561156057611457612146565b600260006001878154811061146857fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff16151590820152600554909150600490048160200151111561154a576004600554816114d557fe5b048160200151038160200181815250508060026000600188815481106114f757fe5b6000918252602080832091909101546001600160a01b0316835282810193909352604091820190208351815591830151600183015591909101516002909101805460ff1916911515919091179055611554565b6001925050611560565b50600190930192611447565b8284116116f75761156f612146565b600260006001868154811061158057fe5b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208151606081018352815481526001820154938101939093526002015460ff161515908201526005549091506004900481602001511115611668576004600554816115ed57fe5b0481602001510381602001818152505080600260006001878154811061160f57fe5b6000918252602080832091909101546001600160a01b03168352828101939093526040918201902083518155918301516001808401919091559201516002909101805460ff191691151591909117905591506116f79050565b600260006001868154811061167957fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff191690558054806116bd57fe5b600082815260209020810160001990810180546001600160a01b0319169055019055836116ea57506116f7565b5060001990920191611560565b8180156117015750805b156117e057600260006001868154811061171757fe5b60009182526020808320909101546001600160a01b031683528201929092526040018120818155600181810192909255600201805460ff1916905580548490811061175e57fe5b600091825260209091200154600180546001600160a01b03909216918690811061178457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060018054806117bd57fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b826117ec5750506117fd565b50506001909101906000190161143c565b6040517fcfdb3b6ccaeccbdc68be3c59c840e3b3c90f0a7c491f5fff1cf56cfda200dd9c90600090a150505b565b61100481565b611839612169565b6000611843612169565b61184b61217b565b61185c61185786611a70565b611a95565b90506000805b61186b83611adf565b156118a457806118975761188661188184611b00565b611b4e565b63ffffffff1684526001915061189c565b6118a4565b600101611862565b5091935090915050915091565b6000816040516020018082805190602001908083835b602083106118e65780518252601f1990920191602091820191016118c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106119545780518252601f199092019160209182019101611935565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60408051600480825260a08201909252606091829190816020015b60608152602001906001900390816119b95790505090506119e2836001600160a01b0316611c05565b816000815181106119ef57fe5b6020026020010181905250611a0343611c28565b81600181518110611a1057fe5b6020908102919091010152611a256061611c28565b81600281518110611a3257fe5b6020026020010181905250611a4642611c28565b81600381518110611a5357fe5b6020026020010181905250611a6781611c3b565b9150505b919050565b611a7861219b565b506040805180820190915281518152602082810190820152919050565b611a9d61217b565b611aa682611cc5565b611aaf57600080fd5b6000611abe8360200151611cff565b60208085015160408051808201909152868152920190820152915050919050565b6000611ae961219b565b505080518051602091820151919092015191011190565b611b0861219b565b611b1182611adf565b611b1a57600080fd5b60208201516000611b2a82611d62565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590611b6357508151602110155b611b6c57600080fd5b6000611b7b8360200151611cff565b90508083600001511015611bd6576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015611bfc57826020036101000a820491505b50949350505050565b60408051600560a21b8318601482015260348101909152606090611a6781611e95565b6060611993611c3683611eeb565b611e95565b6060815160001415611c5c5750604080516000815260208101909152611a6b565b606082600081518110611c6b57fe5b602002602001015190506000600190505b8351811015611cac57611ca282858381518110611c9557fe5b6020026020010151611fd1565b9150600101611c7c565b50611a67611cbf825160c060ff1661204e565b82611fd1565b8051600090611cd657506000611a6b565b6020820151805160001a9060c0821015611cf557600092505050611a6b565b5060019392505050565b8051600090811a6080811015611d19576000915050611a6b565b60b8811080611d34575060c08110801590611d34575060f881105b15611d43576001915050611a6b565b60c0811015611d575760b519019050611a6b565b60f519019050611a6b565b80516000908190811a6080811015611d7d5760019150611e8e565b60b8811015611d9257607e1981019150611e8e565b60c0811015611e0c57600060b78203600186019550806020036101000a865104915060018101820193505080831015611e06576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50611e8e565b60f8811015611e215760be1981019150611e8e565b600060f78203600186019550806020036101000a865104915060018101820193505080831015611e8c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b606081516001148015611ec75750607f60f81b82600081518110611eb557fe5b01602001516001600160f81b03191611155b15611ed3575080611a6b565b611993611ee58351608060ff1661204e565b83611fd1565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416611f2f57506018611f53565b6fffffffffffffffffffffffffffffffff198416611f4f57506010611f53565b5060005b6020811015611f8957818181518110611f6857fe5b01602001516001600160f81b03191615611f8157611f89565b600101611f53565b60008160200390506060816040519080825280601f01601f191660200182016040528015611fbe576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b81831015612002578051835260209283019201611fea565b50855184518101855292509050808201602086015b8183101561202f578051835260209283019201612017565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061209e576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116120f85782840160f81b816000815181106120da57fe5b60200101906001600160f81b031916908160001a9053509050611993565b606061210385611eeb565b90508381510160370160f81b8260008151811061211c57fe5b60200101906001600160f81b031916908160001a90535061213d8282611fd1565b95945050505050565b604051806060016040528060008152602001600081526020016000151581525090565b60408051602081019091526000815290565b604051806040016040528061218e61219b565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6c656e677468206f66206d697364656d65616e6f725468726573686f6c64206d69736d61746368746865206d6573736167652073656e646572206d7573742062652076616c696461746f7253657420636f6e7472616374746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662066656c6f6e795468726573686f6c64206d69736d61746368746865206d697364656d65616e6f725468726573686f6c64206f7574206f662072616e6765746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f647563657274686520636f6e7472616374206e6f7420696e69742079657400000000000000a2646970667358221220928e8ab9d0213bb25ef35f991d92a3bba9ae0b32c8a4041abe55fcb03c7709dd64736f6c63430006040033", + }, + { + ContractAddr: SystemRewardContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "60806040526004361061014f5760003560e01c806396713da9116100b6578063c81b16621161006f578063c81b1662146103dc578063dc927faf146103f1578063f9a2bbc714610406578063fb5478b31461041b578063fc3e590814610430578063fd6a68791461044557610193565b806396713da91461033a5780639a99b4f01461034f5780639dc0926214610388578063a1a11bf51461039d578063a78abc16146103b2578063ab51bb96146103c757610193565b806351e806721161010857806351e806721461028a5780636d70f7ae1461029f5780636e47b482146102e657806370fd5bad146102fb57806375d47a0a146103105780637942fd051461032557610193565b80630bee7a67146101985780633a0b0eff146101c65780633dffc387146101ed57806343756e5c14610218578063493279b1146102495780634bf6c8821461027557610193565b366101935734156101915760408051348152905133917f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db919081900360200190a25b005b600080fd5b3480156101a457600080fd5b506101ad61045a565b6040805163ffffffff9092168252519081900360200190f35b3480156101d257600080fd5b506101db61045f565b60408051918252519081900360200190f35b3480156101f957600080fd5b50610202610465565b6040805160ff9092168252519081900360200190f35b34801561022457600080fd5b5061022d61046a565b604080516001600160a01b039092168252519081900360200190f35b34801561025557600080fd5b5061025e610470565b6040805161ffff9092168252519081900360200190f35b34801561028157600080fd5b50610202610475565b34801561029657600080fd5b5061022d61047a565b3480156102ab57600080fd5b506102d2600480360360208110156102c257600080fd5b50356001600160a01b0316610480565b604080519115158252519081900360200190f35b3480156102f257600080fd5b5061022d61049e565b34801561030757600080fd5b506102026104a4565b34801561031c57600080fd5b5061022d6104a9565b34801561033157600080fd5b506102026104af565b34801561034657600080fd5b506102026104b4565b34801561035b57600080fd5b506101db6004803603604081101561037257600080fd5b506001600160a01b0381351690602001356104b9565b34801561039457600080fd5b5061022d610664565b3480156103a957600080fd5b5061022d61066a565b3480156103be57600080fd5b506102d2610670565b3480156103d357600080fd5b506101ad610679565b3480156103e857600080fd5b5061022d61067e565b3480156103fd57600080fd5b5061022d610684565b34801561041257600080fd5b5061022d61068a565b34801561042757600080fd5b506101db610690565b34801561043c57600080fd5b5061020261069c565b34801561045157600080fd5b5061022d6106a1565b606481565b60015481565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526002602052604090205460ff1690565b61100581565b600281565b61100881565b600b81565b600981565b6000805460ff1661053657600260208190527fe57bda0a954a7c7381b17b2c763e646ba2c60f67292d287ba583603e2c1c41668054600160ff19918216811790925561100560009081527fe25235fc0de9d7165652bef0846fefda506174abb9a190f03d0f7bcc6146dbce80548316841790559282558254161790555b3360009081526002602052604090205460ff166105845760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a8602b913960400191505060405180910390fd5b60004783106105935747610595565b825b9050670de0b6b3a76400008111156105b25750670de0b6b3a76400005b8015610633576040516001600160a01b0385169082156108fc029083906000818181858888f193505050501580156105ee573d6000803e3d6000fd5b506040805182815290516001600160a01b038616917ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0919081900360200190a261065d565b6040517fe589651933c2457488cc0d8e0941518abf748e799435e4e396d9c4d0b2db2d4d90600090a15b9392505050565b61100781565b61100681565b60005460ff1681565b600081565b61100281565b61100381565b61100081565b670de0b6b3a764000081565b600381565b6110048156fe6f6e6c79206f70657261746f7220697320616c6c6f77656420746f2063616c6c20746865206d6574686f64a2646970667358221220276887b515b756cf3ef5b38df18fd3a11174ee7fd973bdd337fc09d6b0e42f3b64736f6c63430006040033", + }, + { + ContractAddr: LightClientContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b50600436106102115760003560e01c8063a78abc1611610125578063dda83148116100ad578063e405bbc31161007c578063e405bbc314610681578063ea54b2aa14610689578063f9a2bbc714610691578063fc3e590814610699578063fd6a6879146106a157610211565b8063dda8314814610609578063df5fe7041461062f578063e1c7392a14610655578063e2761af01461065d57610211565b8063c81b1662116100f4578063c81b166214610534578063cba510a91461053c578063d816987914610562578063da8d08f0146105db578063dc927faf1461060157610211565b8063a78abc1614610444578063ab51bb9614610460578063ac43175114610468578063adc879e91461052c57610211565b8063564b81ef116101a857806375d47a0a1161017757806375d47a0a1461041c5780637942fd051461042457806396713da91461042c5780639dc0926214610434578063a1a11bf51461043c57610211565b8063564b81ef146102ca5780635c5ae8db146103475780636e47b4821461040c57806370fd5bad1461041457610211565b806343756e5c116101e457806343756e5c14610277578063493279b11461029b5780634bf6c882146102ba57806351e80672146102c257610211565b80630bee7a67146102165780632657e9b61461023757806333f7798d146102515780633dffc38714610259575b600080fd5b61021e6106a9565b6040805163ffffffff9092168252519081900360200190f35b61023f6106ae565b60408051918252519081900360200190f35b61023f6106b9565b6102616106bf565b6040805160ff9092168252519081900360200190f35b61027f6106c4565b604080516001600160a01b039092168252519081900360200190f35b6102a36106ca565b6040805161ffff9092168252519081900360200190f35b6102616106cf565b61027f6106d4565b6102d26106da565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030c5781810151838201526020016102f4565b50505050905090810190601f1680156103395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036d6004803603602081101561035d57600080fd5b50356001600160401b03166107e6565b60405180856001600160401b03166001600160401b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156103ce5781810151838201526020016103b6565b50505050905090810190601f1680156103fb5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b61027f6108a1565b6102616108a7565b61027f6108ac565b6102616108b2565b6102616108b7565b61027f6108bc565b61027f6108c2565b61044c6108c8565b604080519115158252519081900360200190f35b61021e6108d1565b61052a6004803603604081101561047e57600080fd5b81019060208101813564010000000081111561049957600080fd5b8201836020820111156104ab57600080fd5b803590602001918460018302840111640100000000831117156104cd57600080fd5b9193909290916020810190356401000000008111156104eb57600080fd5b8201836020820111156104fd57600080fd5b8035906020019184600183028401116401000000008311171561051f57600080fd5b5090925090506108d6565b005b61023f610b8f565b61027f610b95565b61023f6004803603602081101561055257600080fd5b50356001600160401b0316610b9b565b61044c6004803603604081101561057857600080fd5b81019060208101813564010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460018302840111640100000000831117156105c757600080fd5b9193509150356001600160401b0316610bba565b61027f600480360360208110156105f157600080fd5b50356001600160401b031661139b565b61027f6113b6565b61027f6004803603602081101561061f57600080fd5b50356001600160401b03166113bc565b61044c6004803603602081101561064557600080fd5b50356001600160401b03166113e0565b61052a611422565b6106656115c7565b604080516001600160401b039092168252519081900360200190f35b6106656115d6565b6102d26115ec565b61027f611609565b61026161160f565b61027f611614565b606481565b662386f26fc1000081565b60055481565b600181565b61100181565b606181565b600881565b61200081565b604080516020808252818301909252606091829190602082018180368337505060045460208301525090506000805b60208160ff16101561075057828160ff168151811061072457fe5b01602001516001600160f81b0319161561074357600190910190610748565b610750565b600101610709565b5060608160ff166040519080825280601f01601f191660200182016040528015610781576020820181803683370190505b50905060005b8260ff168160ff1610156107dd57838160ff16815181106107a457fe5b602001015160f81c60f81b828260ff16815181106107be57fe5b60200101906001600160f81b031916908160001a905350600101610787565b50925050505b90565b60016020818152600092835260409283902080548184015460028084015460038501805489516101009982161599909902600019011692909204601f81018790048702880187019098528787526001600160401b0390931696919592949091908301828280156108975780601f1061086c57610100808354040283529160200191610897565b820191906000526020600020905b81548152906001019060200180831161087a57829003601f168201915b5050505050905084565b61100581565b600281565b61100881565b600b81565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661092d576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b336110071461096d5760405162461bcd60e51b815260040180806020018281038252602e815260200180611ac6602e913960400191505060405180910390fd5b6109e184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f726577617264466f7256616c696461746f725365744368616e676500000000006020820152915061161a9050565b15610ac05760208114610a255760405162461bcd60e51b815260040180806020018281038252602e815260200180611a65602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610a639185858083850183828082843760009201919091525061170192505050565b9050600081118015610a7d5750670de0b6b3a76400008111155b610ab85760405162461bcd60e51b815260040180806020018281038252602f815260200180611af4602f913960400191505060405180910390fd5b600555610afd565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60045481565b61100281565b6001600160401b03166000908152600160208190526040909120015490565b60408051630a83aaa960e31b815233600482015290516000916110069163541d554891602480820192602092909190829003018186803b158015610bfd57600080fd5b505afa158015610c11573d6000803e3d6000fd5b505050506040513d6020811015610c2757600080fd5b5051610c7a576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b6001600160401b0382166000908152600260205260409020546001600160a01b031615610cee576040805162461bcd60e51b815260206004820152601c60248201527f63616e27742073796e63206475706c6963617465642068656164657200000000604482015290519081900360640190fd5b6003546001600160401b0390811690831611610d3b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611b236026913960400191505060405180910390fd5b600354600160401b90046001600160401b0316610d56611863565b6001600160401b0382811660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f81018490048402850184019095528484529093606086019392830182828015610e1c5780601f10610df157610100808354040283529160200191610e1c565b820191906000526020600020905b815481529060010190602001808311610dff57829003601f168201915b50505050508152505090505b836001600160401b0316826001600160401b031610158015610e5957506003546001600160401b0390811690831610155b15610f3a5780516001600160401b0380821660009081526001602081815260409283902083516080810185528154909516855280830154858301526002808201548686015260038201805486516101009682161596909602600019011691909104601f8101849004840285018401909552848452959750939460608601939091830182828015610f2a5780601f10610eff57610100808354040283529160200191610f2a565b820191906000526020600020905b815481529060010190602001808311610f0d57829003601f168201915b5050505050815250509050610e28565b6060810151516110315780516001600160401b03811660009081526001602081815260409283902060030180548451600294821615610100026000190190911693909304601f810183900483028401830190945283835293955090929190830182828015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b505050506060830182905250516110315760405162461bcd60e51b8152600401808060200182810382526021815260200180611a446021913960400191505060405180910390fd5b6000816060015151608801905060608787905082016040519080825280601f01601f191660200182016040528015611070576020820181803683370190505b509050600061107e82611706565b905061108c8486838661170c565b6110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806119416023913960400191505060405180910390fd5b6000838201915061110d8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061177892505050565b9450905061111c818386611782565b8251602001935061112b611889565b6110008186866064600019fa61114057600080fd5b805194506000600160f81b8616156111cf5750600554604080516309a99b4f60e41b815233600482015260248101929092525160019161100291639a99b4f0916044808201926020929091908290030181600087803b1580156111a257600080fd5b505af11580156111b6573d6000803e3d6000fd5b505050506040513d60208110156111cc57600080fd5b50505b856001600160401b0316955060208201935060006111ef858884156117c3565b90985090506001600160401b03808216908c161461123e5760405162461bcd60e51b8152600401808060200182810382526033815260200180611a936033913960400191505060405180910390fd5b6001600160401b03808c16600081815260026020818152604080842080546001600160a01b031916331790558e86168e529383526001808252928490208d518154961667ffffffffffffffff199096169590951785558c81015192850192909255918b01519183019190915560608a015180518b93926112c59260038501929101906118a8565b50506003546001600160401b03600160401b9091048116908d161115905061130d576003805467ffffffffffffffff60401b1916600160401b6001600160401b038e16021790555b7f4042c1020a8f410fb1c8859d276ab436aeb2c3074960e48467299cf1c966d3b48b8a8a602001518560405180856001600160401b03166001600160401b03168152602001846001600160401b03166001600160401b031681526020018381526020018215151515815260200194505050505060405180910390a15060019c9b505050505050505050505050565b6002602052600090815260409020546001600160a01b031681565b61100381565b6001600160401b03166000908152600260205260409020546001600160a01b031690565b6001600160401b0381166000908152600260205260408120546001600160a01b031615158061141c57506003546001600160401b038381169116145b92915050565b60005460ff161561147a576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60008061149f60405180610100016040528060e0815260200161196460e09139611778565b815160045590925090506114b1611863565b60006114bf848460006117c3565b60008083526001600160401b038281168252600160208181526040938490208651815467ffffffffffffffff191694169390931783558086015191830191909155918401516002820155606084015180519496509294508593909261152b9260038501929101906118a8565b50506003805467ffffffffffffffff19166001600160401b0384811691821767ffffffffffffffff60401b1916600160401b9290920291909117918290556000805460ff19166001179055662386f26fc10000600555602085810151604080519490931684529083015280517f5ac9b37d571677b80957ca05693f371526c602fd08042b416a29fdab7efefa499350918290030190a150505050565b6003546001600160401b031681565b600354600160401b90046001600160401b031681565b60405180610100016040528060e0815260200161196460e0913981565b61100081565b600381565b61100481565b6000816040516020018082805190602001908083835b6020831061164f5780518252601f199092019160209182019101611630565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b602083106116bd5780518252601f19909201916020918201910161169e565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b60200190565b600084606001515182840103925060008061172a8760600151611778565b909250905061173a828683611782565b5050506040840151601f1983810191909152602090940151603f19830152605f19820192909252600454606719820152910160871990910152600190565b8051602090910191565b5b602081106117a2578251825260209283019290910190601f1901611783565b915181516020939093036101000a6000190180199091169216919091179052565b6117cb611863565b60088401516028850151604890950180519095600092916117ea611863565b6020810183905260408101829052866118555760008060688a036040519080825280601f01601f19166020018201604052801561182e576020820181803683370190505b506060840181905261183f90611778565b909250905061185260208c018383611782565b50505b989297509195505050505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b6040518061100001604052806080906020820280368337509192915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106118e957805160ff1916838001178555611916565b82800160010185558215611916579182015b828111156119165782518255916020019190600101906118fb565b50611922929150611926565b5090565b6107e391905b80821115611922576000815560010161192c56fe6661696c656420746f2073657269616c697a6520636f6e73656e73757320737461746542696e616e63652d436861696e2d47616e67657300000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000aea1ac326886b992a991d21a6eb155f41b77867cbf659e78f31d89d8205122a84d1be64f0e9a466c2e66a53433928192783e29f8fa21beb2133499b5ef770f60000000e8d4a5100099308aa365c40554bc89982af505d85da95251445d5dd4a9bb37dd2584fd92d3000000e8d4a5100001776920ff0b0f38d78cf95c033c21adf7045785114e392a7544179652e0a612000000e8d4a510006661696c656420746f206c6f61642076616c696461746f722073657420646174616c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d617463686865616465722068656967687420646f65736e277420657175616c20746f207468652073706563696669656420686569676874746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206e6577526577617264466f7256616c696461746f725365744368616e6765206f7574206f662072616e676563616e27742073796e6320686561646572206265666f726520696e697469616c486569676874a2646970667358221220137a8776113e727049f523a5f1486edaec611d89ff3d19f099dfe799b6b5e66f64736f6c63430006040033", + }, + { + ContractAddr: TokenHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e5908146109c9578063fd6a687914610ce6578063ff9c0027146107c757610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063dc6f5e90116100d1578063dc6f5e90146109c9578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063a7c9f02d11610164578063ac4317511161013e578063ac43175114610a3a578063b770186114610b05578063b99328c514610b1a578063b9fd21e314610b5357610366565b8063a7c9f02d146109c9578063aa7415f5146109de578063ab51bb9614610a2557610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a5cd588b14610981578063a78abc16146109b457610366565b80635d499b1b1161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105b25780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b80635d499b1b14610671578063613684751461036b5780636e056520146106865780636e47b482146107b257806370fd5bad146107c757806371d30863146107dc57610366565b806343756e5c116102d75780634bf6c882116102b15780634bf6c8821461036b57806350432d321461061d57806351e806721461063257806359b927891461064757610366565b806343756e5c146105c757806343a368b9146105dc578063493279b1146105f157610366565b8063077b8f351461036b5780630bee7a67146103965780631182b875146103c4578063149d14d9146104be5780633d713223146104e55780633dffc387146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805160ff9092168252519081900360200190f35b3480156103a257600080fd5b506103ab610d00565b6040805163ffffffff9092168252519081900360200190f35b3480156103d057600080fd5b50610449600480360360408110156103e757600080fd5b60ff8235169190810190604081016020820135600160201b81111561040b57600080fd5b82018360208201111561041d57600080fd5b803590602001918460018302840111600160201b8311171561043e57600080fd5b509092509050610d05565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048357818101518382015260200161046b565b50505050905090810190601f1680156104b05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ca57600080fd5b506104d3610e33565b60408051918252519081900360200190f35b3480156104f157600080fd5b506105966004803603602081101561050857600080fd5b810190602081018135600160201b81111561052257600080fd5b82018360208201111561053457600080fd5b803590602001918460018302840111600160201b8311171561055557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e39945050505050565b604080516001600160a01b039092168252519081900360200190f35b3480156105be57600080fd5b50610380610e5d565b3480156105d357600080fd5b50610596610e62565b3480156105e857600080fd5b506104d3610e68565b3480156105fd57600080fd5b50610606610e74565b6040805161ffff9092168252519081900360200190f35b34801561062957600080fd5b506104d3610e79565b34801561063e57600080fd5b50610596610e84565b34801561065357600080fd5b506105966004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104d3610ea5565b61079e6004803603608081101561069c57600080fd5b810190602081018135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b919390929091602081019035600160201b81111561070657600080fd5b82018360208201111561071857600080fd5b803590602001918460208302840111600160201b8311171561073957600080fd5b919390929091602081019035600160201b81111561075657600080fd5b82018360208201111561076857600080fd5b803590602001918460208302840111600160201b8311171561078957600080fd5b91935091503567ffffffffffffffff16610eae565b604080519115158252519081900360200190f35b3480156107be57600080fd5b50610596611383565b3480156107d357600080fd5b50610380611389565b3480156107e857600080fd5b506104d361138e565b3480156107fd57600080fd5b50610596611394565b34801561081257600080fd5b5061038061139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061038061156e565b34801561090057600080fd5b506104d3611573565b34801561091557600080fd5b506104d36004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b506105966116bd565b34801561096357600080fd5b506105966116c3565b34801561097857600080fd5b506103806116c9565b34801561098d57600080fd5b506104d3600480360360208110156109a457600080fd5b50356001600160a01b03166116ce565b3480156109c057600080fd5b5061079e6116e0565b3480156109d557600080fd5b506103806116e9565b61079e600480360360808110156109f457600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116ee565b348015610a3157600080fd5b506103ab6116c9565b348015610a4657600080fd5b5061036460048036036040811015610a5d57600080fd5b810190602081018135600160201b811115610a7757600080fd5b820183602082011115610a8957600080fd5b803590602001918460018302840111600160201b83111715610aaa57600080fd5b919390929091602081019035600160201b811115610ac757600080fd5b820183602082011115610ad957600080fd5b803590602001918460018302840111600160201b83111715610afa57600080fd5b509092509050611daf565b348015610b1157600080fd5b506104d361201e565b348015610b2657600080fd5b5061036460048036036040811015610b3d57600080fd5b50803590602001356001600160a01b0316612024565b348015610b5f57600080fd5b506104d361209a565b348015610b7457600080fd5b506104d360048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b506105966120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b50610596612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061038061223b565b348015610c8057600080fd5b50610380612240565b348015610c9557600080fd5b50610596612245565b348015610caa57600080fd5b506104d361224b565b348015610cbf57600080fd5b5061044960048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b50610596612378565b600881565b606481565b60005460609060ff16610d4d576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b3361200014610d8d5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff841660021415610ddf57610dd883838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e2c565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606181565b662386f26fc1000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b6000805460ff16610ef4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b868514610f325760405162461bcd60e51b815260040180806020018281038252603b815260200180614732603b913960400191505060405180910390fd5b868314610f705760405162461bcd60e51b815260040180806020018281038252603f815260200180614605603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fbc5760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156110005760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611033578160200160208202803683370190505b50905060005b8481101561110e576402540be4008b8b8381811061105357fe5b905060200201358161106157fe5b061561109e5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6110c38b8b838181106110ad57fe5b90506020020135856124a290919063ffffffff16565b93506110ef6402540be4008c8c848181106110da57fe5b905060200201356124fc90919063ffffffff16565b8282815181106110fb57fe5b6020908102919091010152600101611039565b5060015461113390611126908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111715760405162461bcd60e51b81526004018080602001828103825260568152602001806147df6056913960600191505060405180910390fd5b611181348463ffffffff61259716565b915061118b61434e565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d7600361124f846125d9565b611264876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c25781810151838201526020016112aa565b50505050905090810190601f1680156112ef5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131057600080fd5b505af1158015611324573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b600281565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614468602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60026020526000908152604090205481565b60005460ff1681565b600381565b6000805460ff16611734576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff1610156117805760405162461bcd60e51b81526004018080602001828103825260248152602001806144f56024913960400191505060405180910390fd5b6402540be4003406156117c45760405162461bcd60e51b81526004018080602001828103825260408152602001806148356040913960400191505060405180910390fd5b600080806001600160a01b0388166118a3576001546117ea90879063ffffffff6124a216565b3410156118285760405162461bcd60e51b815260040180806020018281038252606181526020018061457f6061913960800191505060405180910390fd5b6402540be40086061561186c5760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b61187c348763ffffffff61259716565b9050611893866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b46565b6001600160a01b0388166000908152600360205260409020549250826118fa5760405162461bcd60e51b815260040180806020018281038252603181526020018061454e6031913960400191505060405180910390fd5b60015434101561193b5760405162461bcd60e51b815260040180806020018281038252603f8152602001806146a1603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061198657506008811180156119865750611984876007198301600a0a63ffffffff6128f016565b155b6119c15760405162461bcd60e51b815260040180806020018281038252603c815260200180614644603c913960400191505060405180910390fd5b6119cb8782612932565b92506119d684612972565b15611a1e576305f5e100831015611a1e5760405162461bcd60e51b815260040180806020018281038252603a815260200180614497603a913960400191505060405180910390fd5b600881101580611a385750600881108015611a3857508683115b611a735760405162461bcd60e51b81526004018080602001828103825260258152602001806145e06025913960400191505060405180910390fd5b677ce66c50e2840000831115611aba5760405162461bcd60e51b81526004018080602001828103825260358152602001806145196035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611b0f57600080fd5b505af1158015611b23573d6000803e3d6000fd5b505050506040513d6020811015611b3957600080fd5b5051611b4457600080fd5b505b611b4e61434e565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bfc57fe5b602002602001018181525050878160600151600081518110611c1a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c4c57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c77846125d9565b611c8c866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cea578181015183820152602001611cd2565b50505050905090810190601f168015611d175780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d3857600080fd5b505af1158015611d4c573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611def5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146e0602e913960400191505060405180910390fd5b60208114611e44576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f4c576020820151670de0b6b3a76400008111801590611ef357506402540be4008106155b611f44576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f89565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61c35081565b33611008146120645760405162461bcd60e51b815260040180806020018281038252602381526020018061479c6023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147bf833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061476d602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b662386f26fc1000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b606061238861439a565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143cf565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e58565b50506040805160008152602081019091529150610e589050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146806021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143f6565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b815260040180806020018281038252602481526020018061470e6024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600860ff82161015612a0057600092505050610e58565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e58565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e58565b5060019392505050565b612a8061434e565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144d16024913960400191505060405180910390fd5b612ad36143f6565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613bc6565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e61439a565b6000612b8861439a565b612b9061442d565b612ba1612b9c86613bff565b613c24565b90506000805b612bb083613c6e565b15612ca85780612bd257612bcb612bc684613c8f565b613cdd565b8452612ca0565b8060011415612bff57612bec612be784613c8f565b613d94565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c8f565b6040850152612ca0565b8060031415612c4657612c33612be784613c8f565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c8f565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c8f565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e58565b8160400151471015612cfc57506003610e58565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e58565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e58565b8160a0015167ffffffffffffffff16421115612e0a57506001610e58565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e58565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e58565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e589050565b5060059150610e589050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2c81613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613dae565b613e94565b60408051600560a21b8318601482015260348101909152606090610e2c81613e94565b60608151600014156132315750604080516000815260208101909152610e58565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ee6565b9150600101613251565b50610e2c613294825160c060ff16613f63565b82613ee6565b6132a26143f6565b60006132ac6143f6565b6132b461442d565b6132c0612b9c86613bff565b90506000805b6132cf83613c6e565b15612ca857806132f5576132e5612be784613c8f565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c8f565b61405b565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cdd565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c8f565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d94565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c8f565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b61395361434e565b600061395d61434e565b61396561442d565b613971612b9c86613bff565b90506000805b61398083613c6e565b15613bb8578061399d57613996612bc684613c8f565b8452613bb0565b80600114156139c5576139b2612be784613c8f565b6001600160a01b03166020850152613bb0565b8060021415613a545760606139dc61330c85613c8f565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613bb0565b8060031415613ae9576060613a6b61330c85613c8f565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c8f565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415613bab57613b93612bc684613c8f565b67ffffffffffffffff1660a085015260019150613bb0565b613bb8565b600101613977565b509195600195509350505050565b60006008821115613be857612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613c0761444d565b506040805180820190915281518152602082810190820152919050565b613c2c61442d565b613c358261412c565b613c3e57600080fd5b6000613c4d836020015161415c565b60208085015160408051808201909152868152920190820152915050919050565b6000613c7861444d565b505080518051602091820151919092015191011190565b613c9761444d565b613ca082613c6e565b613ca957600080fd5b60208201516000613cb9826141bf565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cf257508151602110155b613cfb57600080fd5b6000613d0a836020015161415c565b90508083600001511015613d65576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d8b57826020036101000a820491505b50949350505050565b8051600090601514613da557600080fd5b6116b782613cdd565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613df257506018613e16565b6fffffffffffffffffffffffffffffffff198416613e1257506010613e16565b5060005b6020811015613e4c57818181518110613e2b57fe5b01602001516001600160f81b03191615613e4457613e4c565b600101613e16565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e81576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613ec65750607f60f81b82600081518110613eb457fe5b01602001516001600160f81b03191611155b15613ed2575080610e58565b6116b7613ee48351608060ff16613f63565b835b6060806040519050835180825260208201818101602087015b81831015613f17578051835260209283019201613eff565b50855184518101855292509050808201602086015b81831015613f44578051835260209283019201613f2c565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613fb3576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161400d5782840160f81b81600081518110613fef57fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061401885613dae565b90508381510160370160f81b8260008151811061403157fe5b60200101906001600160f81b031916908160001a9053506140528282613ee6565b95945050505050565b60606140668261412c565b61406f57600080fd5b600061407a836142f2565b90506060816040519080825280602002602001820160405280156140b857816020015b6140a561444d565b81526020019060019003908161409d5790505b50905060006140ca856020015161415c565b60208601510190506000805b84811015614121576140e7836141bf565b915060405180604001604052808381526020018481525084828151811061410a57fe5b6020908102919091010152918101916001016140d6565b509195945050505050565b805160009061413d57506000610e58565b6020820151805160001a9060c0821015612a6e57600092505050610e58565b8051600090811a6080811015614176576000915050610e58565b60b8811080614191575060c08110801590614191575060f881105b156141a0576001915050610e58565b60c08110156141b45760b519019050610e58565b60f519019050610e58565b80516000908190811a60808110156141da57600191506142eb565b60b88110156141ef57607e19810191506142eb565b60c081101561426957600060b78203600186019550806020036101000a865104915060018101820193505080831015614263576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142eb565b60f881101561427e5760be19810191506142eb565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142e9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b805160009061430357506000610e58565b60008090506000614317846020015161415c565b602085015185519181019250015b8082101561434557614336826141bf565b60019093019290910190614325565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061444061444d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220e59d62bf5fb2933f655143755e397406da6b105ef90a69a8209ff1a057bc41c964736f6c63430006040033", + }, + { + ContractAddr: RelayerIncentivizeContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "6080604052600436106102765760003560e01c80637e146cc51161014f578063af400681116100c1578063e75d72c71161007a578063e75d72c714610795578063e89a3020146107c8578063f9a2bbc7146107f2578063fc3e590814610807578063fd6a68791461081c578063fdd31fcd146108315761027d565b8063af400681146106ed578063bd4cc83014610717578063c81b166214610741578063dc927faf14610756578063dcae76ab1461076b578063e1c7392a146107805761027d565b8063a3c3c0ad11610113578063a3c3c0ad146105b3578063a78abc16146105c8578063a7c6a59d146105dd578063ab51bb96146105f2578063ac43175114610607578063ace9fcc2146106d85761027d565b80637e146cc51461052c578063930e1b091461054157806396713da9146105745780639dc0926214610589578063a1a11bf51461059e5761027d565b806343756e5c116101e85780636e47b482116101ac5780636e47b482146104645780636f93d2e61461047957806370fd5bad146104d857806374f2272d146104ed57806375d47a0a146105025780637942fd05146105175761027d565b806343756e5c146103e4578063493279b1146103f95780634bf6c8821461042557806351e806721461043a578063541333071461044f5761027d565b806312950c461161023a57806312950c46146103165780631b20087c1461032b5780631c643312146103405780633a975612146102825780633dffc3871461038657806340bb43c0146103b15761027d565b8063081e9d131461028257806308f2ec06146102a9578063093f2fc4146102be5780630bee7a67146102d357806310e06a76146103015761027d565b3661027d57005b600080fd5b34801561028e57600080fd5b50610297610864565b60408051918252519081900360200190f35b3480156102b557600080fd5b50610297610869565b3480156102ca57600080fd5b5061029761086e565b3480156102df57600080fd5b506102e8610873565b6040805163ffffffff9092168252519081900360200190f35b34801561030d57600080fd5b50610297610878565b34801561032257600080fd5b5061029761087e565b34801561033757600080fd5b50610297610884565b34801561034c57600080fd5b5061036a6004803603602081101561036357600080fd5b503561088a565b604080516001600160a01b039092168252519081900360200190f35b34801561039257600080fd5b5061039b610864565b6040805160ff9092168252519081900360200190f35b3480156103bd57600080fd5b50610297600480360360208110156103d457600080fd5b50356001600160a01b03166108b1565b3480156103f057600080fd5b5061036a6108c3565b34801561040557600080fd5b5061040e6108c9565b6040805161ffff9092168252519081900360200190f35b34801561043157600080fd5b5061039b6108ce565b34801561044657600080fd5b5061036a6108d3565b34801561045b57600080fd5b50610297610873565b34801561047057600080fd5b5061036a6108d9565b34801561048557600080fd5b506104c46004803603608081101561049c57600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108df565b604080519115158252519081900360200190f35b3480156104e457600080fd5b5061039b610cad565b3480156104f957600080fd5b50610297610cb2565b34801561050e57600080fd5b5061036a610cb8565b34801561052357600080fd5b5061039b610cbe565b34801561053857600080fd5b50610297610cc3565b34801561054d57600080fd5b506102976004803603602081101561056457600080fd5b50356001600160a01b0316610cc8565b34801561058057600080fd5b5061039b610cda565b34801561059557600080fd5b5061036a610cdf565b3480156105aa57600080fd5b5061036a610ce5565b3480156105bf57600080fd5b50610297610ceb565b3480156105d457600080fd5b506104c4610cf1565b3480156105e957600080fd5b50610297610cfa565b3480156105fe57600080fd5b506102e8610d00565b34801561061357600080fd5b506106d66004803603604081101561062a57600080fd5b81019060208101813564010000000081111561064557600080fd5b82018360208201111561065757600080fd5b8035906020019184600183028401116401000000008311171561067957600080fd5b91939092909160208101903564010000000081111561069757600080fd5b8201836020820111156106a957600080fd5b803590602001918460018302840111640100000000831117156106cb57600080fd5b509092509050610d05565b005b3480156106e457600080fd5b50610297611354565b3480156106f957600080fd5b506102976004803603602081101561071057600080fd5b503561135a565b34801561072357600080fd5b506102976004803603602081101561073a57600080fd5b50356113b5565b34801561074d57600080fd5b5061036a6113ce565b34801561076257600080fd5b5061036a6113d4565b34801561077757600080fd5b506102976113da565b34801561078c57600080fd5b506106d66113e0565b3480156107a157600080fd5b506106d6600480360360208110156107b857600080fd5b50356001600160a01b03166114a9565b3480156107d457600080fd5b5061036a600480360360208110156107eb57600080fd5b5035611602565b3480156107fe57600080fd5b5061036a61160f565b34801561081357600080fd5b5061039b611615565b34801561082857600080fd5b5061036a61161a565b34801561083d57600080fd5b506102976004803603602081101561085457600080fd5b50356001600160a01b0316611620565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b6006818154811061089757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606181565b600881565b61200081565b61100581565b6000805460ff16610937576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109775760405162461bcd60e51b815260040180806020018281038252602f815260200180612164602f913960400191505060405180910390fd5b600082156109fc57604080516309a99b4f60e41b8152611005600482015260248101869052905161100291639a99b4f09160448083019260209291908290030181600087803b1580156109c957600080fd5b505af11580156109dd573d6000803e3d6000fd5b505050506040513d60208110156109f357600080fd5b50519050610a75565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a4657600080fd5b505af1158015610a5a573d6000803e3d6000fd5b505050506040513d6020811015610a7057600080fd5b505190505b600c805460010190556000610a8982611632565b600954909150610a9f908263ffffffff61166116565b600955600a54610ac7908290610abb908563ffffffff61166116565b9063ffffffff6116c216565b600a556001600160a01b038716600090815260056020526040902054610b3357600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610bb157600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610ca057600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610c2b611704565b90506000610c376119e8565b6001600160a01b0389166000908152600d6020526040902054909150610c75908290610c69908563ffffffff61166116565b9063ffffffff61166116565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610d455760405162461bcd60e51b815260040180806020018281038252602e8152602001806120a9602e913960400191505060405180910390fd5b60005460ff16610d865760405162461bcd60e51b81526004018080602001828103825260218152602001806120d76021913960400191505060405180910390fd5b610dfa84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611c669050565b15610ec75760208114610e3e5760405162461bcd60e51b81526004018080602001828103825260328152602001806121936032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610e7c91858580838501838280828437600092019190915250611d4d92505050565b9050600254811115610ebf5760405162461bcd60e51b8152600401808060200182810382526060815260200180611f826060913960600191505060405180910390fd5b6001556112c2565b610f2084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160608101909152602280825290925090506120876020830139611c66565b15610ff85760208114610f645760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610fa291858580838501838280828437600092019190915250611d4d92505050565b90508015801590610fb557506001548110155b610ff05760405162461bcd60e51b815260040180806020018281038252606c8152602001806120f8606c913960800191505060405180910390fd5b6002556112c2565b61106c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611c669050565b1561113957602081146110b05760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916110ee91858580838501838280828437600092019190915250611d4d92505050565b90506004548111156111315760405162461bcd60e51b8152600401808060200182810382526056815260200180611fe26056913960600191505060405180910390fd5b6003556112c2565b6111ad84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611c669050565b1561128557602081146111f15760405162461bcd60e51b815260040180806020018281038252602e815260200180612038602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161122f91858580838501838280828437600092019190915250611d4d92505050565b9050801580159061124257506003548110155b61127d5760405162461bcd60e51b8152600401808060200182810382526061815260200180611f216061913960800191505060405180910390fd5b6004556112c2565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161136b5750806113b0565b81602810801561137c575060508211155b15611389575060286113b0565b60508211801561139a5750606e8211155b156113aa575060788190036113b0565b50600481045b919050565b6000602882116113c65750806113b0565b5060286113b0565b61100281565b61100381565b60095481565b60005460ff1615611438576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611486576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d602052604090205480611508576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506115b85760405161100290819084156108fc029085906000818181858888f19350505050158015611572573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506115ff565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b6008818154811061089757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600061165b60025461164f60015485611d5290919063ffffffff16565b9063ffffffff611dab16565b92915050565b6000828201838110156116bb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60006116bb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ded565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561176057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611742575b5050505050905060608151604051908082528060200260200182016040528015611794578160200160208202803683370190505b50905060005b82518110156118215760008382815181106117b157fe5b6020026020010151905060006117eb60056000846001600160a01b03166001600160a01b03168152602001908152602001600020546113b5565b9050808484815181106117fa57fe5b6020908102919091010152611815868263ffffffff61166116565b9550505060010161179a565b50600061183f60045461164f60035488611d5290919063ffffffff16565b9050611851858263ffffffff6116c216565b94508460015b845181101561192857600061188c8761164f8a88868151811061187657fe5b6020026020010151611d5290919063ffffffff16565b90506118d981600d60008986815181106118a257fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461166190919063ffffffff16565b600d60008885815181106118e957fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205561191d838263ffffffff6116c216565b925050600101611857565b5061193e81600d6000876000815181106118a257fe5b600d60008660008151811061194f57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b84518110156119d057600560008683815181106119a257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611989565b506119dd60066000611ee9565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611a4457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a26575b5050505050905060608151604051908082528060200260200182016040528015611a78578160200160208202803683370190505b50905060005b8251811015611af7576000838281518110611a9557fe5b602002602001015190506000611acf60076000846001600160a01b03166001600160a01b031681526020019081526020016000205461135a565b905080848481518110611ade57fe5b6020908102919091010152949094019350600101611a7e565b506000611b1560045461164f60035488611d5290919063ffffffff16565b9050611b27858263ffffffff6116c216565b94508460015b8451811015611bb1576000611b4c8761164f8a88868151811061187657fe5b9050611b6281600d60008986815181106118a257fe5b600d6000888581518110611b7257fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611ba6838263ffffffff6116c216565b925050600101611b2d565b50611bc781600d6000876000815181106118a257fe5b600d600086600081518110611bd857fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611c595760076000868381518110611c2b57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611c12565b506119dd60086000611ee9565b6000816040516020018082805190602001908083835b60208310611c9b5780518252601f199092019160209182019101611c7c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611d095780518252601f199092019160209182019101611cea565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611d615750600061165b565b82820282848281611d6e57fe5b04146116bb5760405162461bcd60e51b81526004018080602001828103825260218152602001806120666021913960400191505060405180910390fd5b60006116bb83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611e84565b60008184841115611e7c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611e41578181015183820152602001611e29565b50505050905090810190601f168015611e6e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183611ed35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611e41578181015183820152602001611e29565b506000838581611edf57fe5b0495945050505050565b50805460008255906000526020600020908101906115ff91906119e591905b80821115611f1c5760008155600101611f08565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220b0f586134d92421afeb7764dfa9711bf04e0920aa1729c40e9183ccccafbb49d64736f6c63430006040033", + }, + { + ContractAddr: RelayerHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "6080604052600436106101c25760003560e01c806395468d26116100f7578063c81b166211610095578063f9a2bbc711610064578063f9a2bbc714610529578063fb7cfdd71461053e578063fc3e590814610553578063fd6a687914610568576101c2565b8063c81b1662146104d5578063dc927faf146104ea578063e1c7392a146104ff578063e79a198f14610514576101c2565b8063a1a11bf5116100d1578063a1a11bf5146103c7578063a78abc16146103dc578063ab51bb96146103f1578063ac43175114610406576101c2565b806395468d261461038857806396713da91461039d5780639dc09262146103b2576101c2565b8063541d55481161016457806370fd5bad1161013e57806370fd5bad1461033457806375d47a0a146103495780637942fd051461035e5780637ae2308814610373576101c2565b8063541d5548146102b15780636a87d780146102f85780636e47b4821461031f576101c2565b806343756e5c116101a057806343756e5c1461022a578063493279b11461025b5780634bf6c8821461028757806351e806721461029c576101c2565b80630bee7a67146101c75780631aa3a008146101f55780633dffc387146101ff575b600080fd5b3480156101d357600080fd5b506101dc61057d565b6040805163ffffffff9092168252519081900360200190f35b6101fd610582565b005b34801561020b57600080fd5b5061021461077d565b6040805160ff9092168252519081900360200190f35b34801561023657600080fd5b5061023f610782565b604080516001600160a01b039092168252519081900360200190f35b34801561026757600080fd5b50610270610788565b6040805161ffff9092168252519081900360200190f35b34801561029357600080fd5b5061021461078d565b3480156102a857600080fd5b5061023f610792565b3480156102bd57600080fd5b506102e4600480360360208110156102d457600080fd5b50356001600160a01b0316610798565b604080519115158252519081900360200190f35b34801561030457600080fd5b5061030d6107b6565b60408051918252519081900360200190f35b34801561032b57600080fd5b5061023f6107bc565b34801561034057600080fd5b506102146107c2565b34801561035557600080fd5b5061023f6107c7565b34801561036a57600080fd5b506102146107cd565b34801561037f57600080fd5b5061030d6107d2565b34801561039457600080fd5b5061030d6107df565b3480156103a957600080fd5b506102146107eb565b3480156103be57600080fd5b5061023f6107f0565b3480156103d357600080fd5b5061023f6107f6565b3480156103e857600080fd5b506102e46107fc565b3480156103fd57600080fd5b506101dc610805565b34801561041257600080fd5b506101fd6004803603604081101561042957600080fd5b81019060208101813564010000000081111561044457600080fd5b82018360208201111561045657600080fd5b8035906020019184600183028401116401000000008311171561047857600080fd5b91939092909160208101903564010000000081111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111640100000000831117156104ca57600080fd5b50909250905061080a565b3480156104e157600080fd5b5061023f610c2c565b3480156104f657600080fd5b5061023f610c32565b34801561050b57600080fd5b506101fd610c38565b34801561052057600080fd5b506101fd610cba565b34801561053557600080fd5b5061023f610e73565b34801561054a57600080fd5b5061030d610e79565b34801561055f57600080fd5b50610214610e7f565b34801561057457600080fd5b5061023f610e84565b606481565b3360009081526004602052604090205460ff16156105df576040805162461bcd60e51b81526020600482015260156024820152741c995b185e595c88185b1c9958591e48195e1a5cdd605a1b604482015290519081900360640190fd5b60005460ff16610632576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b61063b33610e8a565b156106775760405162461bcd60e51b815260040180806020018281038252602781526020018061109c6027913960400191505060405180910390fd5b3332146106c1576040805162461bcd60e51b81526020600482015260136024820152721b9bc81c1c9bde1e481a5cc8185b1b1bddd959606a1b604482015290519081900360640190fd5b60015434146107015760405162461bcd60e51b81526004018080602001828103825260258152602001806110776025913960400191505060405180910390fd5b604080518082018252600180548252600254602080840191825233600081815260038352868120955186559251948401949094556004815290849020805460ff1916909217909155825191825291517fdb33a09d38b59a8fa8b7d92a1d82c8015e99f05f67ae9c9ae623157767959496929181900390910190a1565b600181565b61100181565b606181565b600881565b61200081565b6001600160a01b031660009081526004602052604090205460ff1690565b60025481565b61100581565b600281565b61100881565b600b81565b68056bc75e2d6310000081565b67016345785d8a000081565b600981565b61100781565b61100681565b60005460ff1681565b600081565b60005460ff1661085d576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b336110071461089d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806110c3602e913960400191505060405180910390fd5b61090384848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152600f81526e1c995c5d5a5c995911195c1bdcda5d608a1b60208201529150610e909050565b15610a0657602081146109475760405162461bcd60e51b81526004018080602001828103825260228152602001806110f16022913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161098591858580838501838280828437600092019190915250610f7792505050565b90506001811180156109a05750683635c9adc5dea000008111155b80156109ad575060025481115b6109fe576040805162461bcd60e51b815260206004820181905260248201527f7468652072657175697265644465706f736974206f7574206f662072616e6765604482015290519081900360640190fd5b600155610b9a565b610a6184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260048152636475657360e01b60208201529150610e909050565b15610b5d5760208114610abb576040805162461bcd60e51b815260206004820152601760248201527f6c656e677468206f662064756573206d69736d61746368000000000000000000604482015290519081900360640190fd5b604080516020601f8401819004810282018101909252828152600091610af991858580838501838280828437600092019190915250610f7792505050565b9050600081118015610b0c575060015481105b610b55576040805162461bcd60e51b81526020600482015260156024820152747468652064756573206f7574206f662072616e676560581b604482015290519081900360640190fd5b600255610b9a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b61100281565b61100381565b60005460ff1615610c90576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b68056bc75e2d63100000600190815567016345785d8a00006002556000805460ff19169091179055565b3360009081526004602052604090205460ff16610d15576040805162461bcd60e51b81526020600482015260146024820152731c995b185e595c88191bc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b60005460ff16610d68576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b610d7061105c565b5033600081815260036020908152604091829020825180840190935280548084526001909101549183018290529192916108fc91610db4919063ffffffff610f7c16565b6040518115909202916000818181858888f19350505050158015610ddc573d6000803e3d6000fd5b50602081015160405161100291829181156108fc0291906000818181858888f19350505050158015610e12573d6000803e3d6000fd5b50336000818152600460209081526040808320805460ff191690556003825280832083815560010192909255815192835290517fd17202129b83db7880d6b9f25df81c58ad46f7e0e2c92236b1aa10663a4876679281900390910190a15050565b61100081565b60015481565b600381565b61100481565b3b151590565b6000816040516020018082805190602001908083835b60208310610ec55780518252601f199092019160209182019101610ea6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310610f335780518252601f199092019160209182019101610f14565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b6000610fbe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610fc5565b9392505050565b600081848411156110545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611019578181015183820152602001611001565b50505050905090810190601f1680156110465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60405180604001604052806000815260200160008152509056fe6465706f7369742076616c7565206973206e6f742065786163746c79207468652073616d65636f6e7472616374206973206e6f7420616c6c6f77656420746f20626520612072656c61796572746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662072657175697265644465706f736974206d69736d61746368a26469706673582212205b3719dbe352a0da1c7c0fda084d877d745e453695a354811ae82144145a56ae64736f6c63430006040033", + }, + { + ContractAddr: GovHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b506004361061018e5760003560e01c8063831d65d1116100de578063ab51bb9611610097578063dc927faf11610071578063dc927faf14610486578063f9a2bbc71461048e578063fc3e590814610496578063fd6a68791461049e5761018e565b8063ab51bb96146103fc578063c81b166214610404578063c8509d811461040c5761018e565b8063831d65d11461034457806396713da9146103c05780639ab1a373146103c85780639dc09262146103d0578063a1a11bf5146103d8578063a78abc16146103e05761018e565b8063493279b11161014b5780636e47b482116101255780636e47b4821461032457806370fd5bad1461032c57806375d47a0a146103345780637942fd051461033c5761018e565b8063493279b1146102f55780634bf6c8821461031457806351e806721461031c5761018e565b80630bee7a67146101935780631182b875146101b45780633a21baae146102a35780633dffc387146102ab57806343756e5c146102c95780634900c4ea146102ed575b600080fd5b61019b6104a6565b6040805163ffffffff9092168252519081900360200190f35b61022e600480360360408110156101ca57600080fd5b60ff82351691908101906040810160208201356401000000008111156101ef57600080fd5b82018360208201111561020157600080fd5b8035906020019184600183028401116401000000008311171561022357600080fd5b5090925090506104ab565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610268578181015183820152602001610250565b50505050905090810190601f1680156102955780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61019b61059a565b6102b361059f565b6040805160ff9092168252519081900360200190f35b6102d16105a4565b604080516001600160a01b039092168252519081900360200190f35b6102b36105aa565b6102fd6105af565b6040805161ffff9092168252519081900360200190f35b6102b36105b4565b6102d16105b9565b6102d16105bf565b6102b36105c5565b6102d16105ca565b6102b36105d0565b6103be6004803603604081101561035a57600080fd5b60ff823516919081019060408101602082013564010000000081111561037f57600080fd5b82018360208201111561039157600080fd5b803590602001918460018302840111640100000000831117156103b357600080fd5b5090925090506105d5565b005b6102b3610667565b61019b61066c565b6102d1610671565b6102d1610677565b6103e861067d565b604080519115158252519081900360200190f35b61019b6105aa565b6102d1610686565b6103be6004803603604081101561042257600080fd5b60ff823516919081019060408101602082013564010000000081111561044757600080fd5b82018360208201111561045957600080fd5b8035906020019184600183028401116401000000008311171561047b57600080fd5b50909250905061068c565b6102d1610703565b6102d1610709565b6102b361070f565b6102d1610714565b606481565b606033612000146104ed5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6104f5611382565b600061053685858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061071a92505050565b91509150806105525761054960646107e0565b92505050610593565b600061055d8361084a565b905063ffffffff811661058457505060408051600081526020810190915291506105939050565b61058d816107e0565b93505050505b9392505050565b606681565b600181565b61100181565b600081565b606181565b600881565b61200081565b61100581565b600281565b61100881565b600b81565b33612000146106155760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b6040805162461bcd60e51b815260206004820152601e60248201527f7265636569766520756e65787065637465642061636b207061636b6167650000604482015290519081900360640190fd5b505050565b600981565b606581565b61100781565b61100681565b60005460ff1681565b61100281565b33612000146106cc5760405162461bcd60e51b815260040180806020018281038252602f8152602001806113e7602f913960400191505060405180910390fd5b60405162461bcd60e51b81526004018080602001828103825260238152602001806114166023913960400191505060405180910390fd5b61100381565b61100081565b600381565b61100481565b610722611382565b600061072c611382565b6107346113ac565b61074561074086610beb565b610c10565b90506000805b61075483610c5a565b156107d357806107765761076f61076a84610c7b565b610cc9565b84526107cb565b80600114156107955761078b61076a84610c7b565b60208501526107cb565b80600214156107c6576107af6107aa84610c7b565b610d42565b6001600160a01b03166040850152600191506107cb565b6107d3565b60010161074b565b5091935090915050915091565b604080516001808252818301909252606091829190816020015b60608152602001906001900390816107fa5790505090506108208363ffffffff16610d62565b8160008151811061082d57fe5b602002602001018190525061084181610d75565b9150505b919050565b60006108598260400151610dff565b6108c557604080516020808252601c908201527f74686520746172676574206973206e6f74206120636f6e7472616374000000008183015290517f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb29181900360600190a1506065610845565b81604001516001600160a01b031663ac431751836000015184602001516040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561093257818101518382015260200161091a565b50505050905090810190601f16801561095f5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561099257818101518382015260200161097a565b50505050905090810190601f1680156109bf5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156109e057600080fd5b505af19250505080156109f1575060015b610be3576040516000815260443d1015610a0d57506000610aaa565b60046000803e60005160e01c6308c379a08114610a2e576000915050610aaa565b60043d036004833e81513d602482011167ffffffffffffffff82111715610a5a57600092505050610aaa565b808301805167ffffffffffffffff811115610a7c576000945050505050610aaa565b8060208301013d8601811115610a9a57600095505050505050610aaa565b601f01601f191660405250925050505b80610ab55750610b58565b7f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610b14578181015183820152602001610afc565b50505050905090810190601f168015610b415780820380516001836020036101000a031916815260200191505b509250505060405180910390a16066915050610845565b3d808015610b82576040519150601f19603f3d011682016040523d82523d6000602084013e610b87565b606091505b5060408051602080825283518183015283517f1279f84165b4fd69c35e1f338ff107231b036c655cd1688851e011ce617c4e8d938593928392918301919085019080838360008315610b14578181015183820152602001610afc565b506000919050565b610bf36113cc565b506040805180820190915281518152602082810190820152919050565b610c186113ac565b610c2182610e05565b610c2a57600080fd5b6000610c398360200151610e3f565b60208085015160408051808201909152868152920190820152915050919050565b6000610c646113cc565b505080518051602091820151919092015191011190565b610c836113cc565b610c8c82610c5a565b610c9557600080fd5b60208201516000610ca582610ea2565b80830160209586015260408051808201909152908152938401919091525090919050565b8051606090610cd757600080fd5b6000610ce68360200151610e3f565b83516040805191839003808352601f19601f8201168301602001909152919250606090828015610d1d576020820181803683370190505b5090506000816020019050610d39848760200151018285610fd5565b50949350505050565b8051600090601514610d5357600080fd5b610d5c82611020565b92915050565b6060610d5c610d70836110d5565b6111bb565b6060815160001415610d965750604080516000815260208101909152610845565b606082600081518110610da557fe5b602002602001015190506000600190505b8351811015610de657610ddc82858381518110610dcf57fe5b602002602001015161120d565b9150600101610db6565b50610841610df9825160c060ff1661128a565b8261120d565b3b151590565b8051600090610e1657506000610845565b6020820151805160001a9060c0821015610e3557600092505050610845565b5060019392505050565b8051600090811a6080811015610e59576000915050610845565b60b8811080610e74575060c08110801590610e74575060f881105b15610e83576001915050610845565b60c0811015610e975760b519019050610845565b60f519019050610845565b80516000908190811a6080811015610ebd5760019150610fce565b60b8811015610ed257607e1981019150610fce565b60c0811015610f4c57600060b78203600186019550806020036101000a865104915060018101820193505080831015610f46576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50610fce565b60f8811015610f615760be1981019150610fce565b600060f78203600186019550806020036101000a865104915060018101820193505080831015610fcc576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80610fdf57610662565b5b60208110610fff578251825260209283019290910190601f1901610fe0565b915181516020939093036101000a6000190180199091169216919091179052565b80516000901580159061103557508151602110155b61103e57600080fd5b600061104d8360200151610e3f565b905080836000015110156110a8576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015610d3957506020919091036101000a90049392505050565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff1984166111195750601861113d565b6fffffffffffffffffffffffffffffffff1984166111395750601061113d565b5060005b60208110156111735781818151811061115257fe5b01602001516001600160f81b0319161561116b57611173565b60010161113d565b60008160200390506060816040519080825280601f01601f1916602001820160405280156111a8576020820181803683370190505b5080830196909652508452509192915050565b6060815160011480156111ed5750607f60f81b826000815181106111db57fe5b01602001516001600160f81b03191611155b156111f9575080610845565b610d5c61120b8351608060ff1661128a565b835b6060806040519050835180825260208201818101602087015b8183101561123e578051835260209283019201611226565b50855184518101855292509050808201602086015b8183101561126b578051835260209283019201611253565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106112da576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116113345782840160f81b8160008151811061131657fe5b60200101906001600160f81b031916908160001a9053509050610d5c565b606061133f856110d5565b90508381510160370160f81b8260008151811061135857fe5b60200101906001600160f81b031916908160001a905350611379828261120d565b95945050505050565b6040518060600160405280606081526020016060815260200160006001600160a01b031681525090565b60405180604001604052806113bf6113cc565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163747265636569766520756e6578706563746564206661696c2061636b207061636b616765a2646970667358221220401be81505a1aa0dde70753881234490b5e4c39ce009cb7950f994eead5c3f9064736f6c63430006040033", + }, + { + ContractAddr: TokenManagerContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "6080604052600436106102465760003560e01c806375d47a0a11610139578063ab51bb96116100b6578063dc6f5e901161007a578063dc6f5e90146108df578063dc927faf14610975578063f9a2bbc71461098a578063fc3e5908146108df578063fd6a68791461099f578063fe3a2af5146104fd57610246565b8063ab51bb96146108b5578063c81b1662146108ca578063c8509d81146107c5578063c8e704a4146108df578063d117a110146108f457610246565b806395b9ad26116100fd57806395b9ad261461084c57806396713da9146108615780639dc0926214610876578063a1a11bf51461088b578063a78abc16146108a057610246565b806375d47a0a146106e757806377d9dae8146106fc5780637942fd05146107b05780637d078e13146103c8578063831d65d1146107c557610246565b80634a688818116101c75780635f558f861161018b5780635f558f86146105515780636b3f1307146105665780636e47b4821461062e57806370fd5bad1461055157806372c4e0861461064357610246565b80634a688818146104fd5780634bc81c00146105125780634bf6c8821461024b57806351e80672146105275780635d499b1b1461053c57610246565b806323996b531161020e57806323996b53146103c85780633dffc387146103c857806343756e5c146103dd578063445fcefe1461040e578063493279b1146104d157610246565b8063077b8f351461024b5780630bee7a67146102765780630f212b1b146102a45780631182b875146102b95780631f91600b146103b3575b600080fd5b34801561025757600080fd5b506102606109b4565b6040805160ff9092168252519081900360200190f35b34801561028257600080fd5b5061028b6109b9565b6040805163ffffffff9092168252519081900360200190f35b3480156102b057600080fd5b506102606109be565b3480156102c557600080fd5b5061033e600480360360408110156102dc57600080fd5b60ff8235169190810190604081016020820135600160201b81111561030057600080fd5b82018360208201111561031257600080fd5b803590602001918460018302840111600160201b8311171561033357600080fd5b5090925090506109c3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610378578181015183820152602001610360565b50505050905090810190601f1680156103a55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103bf57600080fd5b50610260610a4c565b3480156103d457600080fd5b50610260610a51565b3480156103e957600080fd5b506103f2610a56565b604080516001600160a01b039092168252519081900360200190f35b34801561041a57600080fd5b506104bf6004803603602081101561043157600080fd5b810190602081018135600160201b81111561044b57600080fd5b82018360208201111561045d57600080fd5b803590602001918460018302840111600160201b8311171561047e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a5c945050505050565b60408051918252519081900360200190f35b3480156104dd57600080fd5b506104e6610bbb565b6040805161ffff9092168252519081900360200190f35b34801561050957600080fd5b50610260610bc0565b34801561051e57600080fd5b50610260610bc5565b34801561053357600080fd5b506103f2610bca565b34801561054857600080fd5b506104bf610bd0565b34801561055d57600080fd5b50610260610bd9565b61061a6004803603604081101561057c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156105a657600080fd5b8201836020820111156105b857600080fd5b803590602001918460018302840111600160201b831117156105d957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610bde945050505050565b604080519115158252519081900360200190f35b34801561063a57600080fd5b506103f2611460565b61061a6004803603602081101561065957600080fd5b810190602081018135600160201b81111561067357600080fd5b82018360208201111561068557600080fd5b803590602001918460018302840111600160201b831117156106a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611466945050505050565b3480156106f357600080fd5b506103f26118b4565b61061a6004803603604081101561071257600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561073c57600080fd5b82018360208201111561074e57600080fd5b803590602001918460018302840111600160201b8311171561076f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118ba945050505050565b3480156107bc57600080fd5b50610260611dc1565b3480156107d157600080fd5b5061084a600480360360408110156107e857600080fd5b60ff8235169190810190604081016020820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b509092509050611dc6565b005b34801561085857600080fd5b50610260611e79565b34801561086d57600080fd5b50610260611e7e565b34801561088257600080fd5b506103f2611e83565b34801561089757600080fd5b506103f2611e89565b3480156108ac57600080fd5b5061061a611e8f565b3480156108c157600080fd5b5061028b610bc0565b3480156108d657600080fd5b506103f2611e98565b3480156108eb57600080fd5b50610260611e9e565b34801561090057600080fd5b5061091e6004803603602081101561091757600080fd5b5035611ea3565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a083015267ffffffffffffffff90921660c082015290519081900360e00190f35b34801561098157600080fd5b506103f2611efb565b34801561099657600080fd5b506103f2611f01565b3480156109ab57600080fd5b506103f2611f07565b600881565b606481565b600681565b60603361200014610a055760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b610a4483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f0d92505050565b949350505050565b600481565b600181565b61100181565b6020810151600090610a6c613168565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a082015261010090910467ffffffffffffffff1660c082015290610af457600092505050610bb6565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610b5257600080fd5b505afa158015610b66573d6000803e3d6000fd5b505050506040513d6020811015610b7c57600080fd5b505160808301516060840151919250600091610b9d9163ffffffff61219e16565b9050610baf818363ffffffff61219e16565b9450505050505b919050565b606181565b600081565b600581565b61200081565b6402540be40081565b600281565b600080610bea836121e7565b9050610bf4613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152610cba576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b6000610cd78260800151836060015161219e90919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b031614610d2d5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015610d7057600080fd5b505afa158015610d84573d6000803e3d6000fd5b505050506040513d6020811015610d9a57600080fd5b50516001600160a01b031614610de15760405162461bcd60e51b815260040180806020018281038252602e815260200180613272602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b158015610e2d57600080fd5b505afa158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505160408051636eb1769f60e11b815233600482015230602482015290519192508391610ee89184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b158015610eb057600080fd5b505afa158015610ec4573d6000803e3d6000fd5b505050506040513d6020811015610eda57600080fd5b50519063ffffffff6121ee16565b1015610f3b576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7d57600080fd5b505afa158015610f91573d6000803e3d6000fd5b505050506040513d6020811015610fa757600080fd5b50519050808210801590610fc057506402540be4008206155b610ffb5760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b6000611007868b612248565b905063ffffffff8116611206576001600160a01b038a166323b872dd33611004611037898963ffffffff61219e16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b15801561113257600080fd5b505af1158015611146573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b838110156111c55781810151838201526020016111ad565b50505050905090810190601f1680156111f25780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a26112be565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561128257818101518382015260200161126a565b50505050905090810190601f1680156112af5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556113186131a4565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611360573d6000803e3d6000fd5b5061200063f7a251d760016113748461269f565b611389886402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156113e75781810151838201526020016113cf565b50505050905090810190601f1680156114145780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561143557600080fd5b505af1158015611449573d6000803e3d6000fd5b505050506001985050505050505050505b92915050565b61100581565b600080611472836121e7565b905061147c613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611542576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c0015167ffffffffffffffff16106115a4576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e657600080fd5b505afa1580156115fa573d6000803e3d6000fd5b505050506040513d602081101561161057600080fd5b5051905080821080159061162957506402540be4008206155b6116645760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556116be6131a4565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611701573d6000803e3d6000fd5b5061200063f7a251d760016117158461269f565b61172a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611788578181015183820152602001611770565b50505050905090810190601f1680156117b55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561186c578181015183820152602001611854565b50505050905090810190601f1680156118995780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806118c6836121e7565b90506118d0613168565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a084015261010090910467ffffffffffffffff1660c0830152611996576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252604581526020018061322d6045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b158015611a2d57600080fd5b505afa158015611a41573d6000803e3d6000fd5b505050506040513d6020811015611a5757600080fd5b50516001600160a01b031614611ab4576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703265206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015611af657600080fd5b505afa158015611b0a573d6000803e3d6000fd5b505050506040513d6020811015611b2057600080fd5b50519050808210801590611b3957506402540be4008206155b611b745760405162461bcd60e51b81526004018080602001828103825260378152602001806131f66037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611bce6131a4565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f19350505050158015611c11573d6000803e3d6000fd5b5061200063f7a251d76001611c258461269f565b611c3a876402540be40063ffffffff61272916565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611c98578181015183820152602001611c80565b50505050905090810190601f168015611cc55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ce657600080fd5b505af1158015611cfa573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611d78578181015183820152602001611d60565b50505050905090810190601f168015611da55780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b3361200014611e065760405162461bcd60e51b815260040180806020018281038252602f8152602001806132a0602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b600781565b600981565b61100781565b61100681565b60005460ff1681565b61100281565b600381565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b0390931693919291811690610100900467ffffffffffffffff1687565b61100381565b61100081565b61100481565b6060611f17613168565b6000611f228461276b565b9150915080611f78576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff1661202c576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff00191661010067ffffffffffffffff90921691909102179055612183565b815160ff16600114156121365760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561208557600080fd5b505afa158015612099573d6000803e3d6000fd5b505050506040513d60208110156120af57600080fd5b505190506001600160a01b038116156121305760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561211757600080fd5b505af115801561212b573d6000803e3d6000fd5b505050505b50612183565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b60006121e083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128bd565b9392505050565b6020015190565b6000828201838110156121e0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561228457600080fd5b505afa158015612298573d6000803e3d6000fd5b505050506040513d60208110156122ae57600080fd5b5051604080516395d89b4160e01b815290519192506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b1580156122f657600080fd5b505afa15801561230a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561233357600080fd5b8101908080516040519392919084600160201b82111561235257600080fd5b90830190602082018581111561236757600080fd5b8251600160201b81118282018810171561238057600080fd5b82525081516020918201929091019080838360005b838110156123ad578181015183820152602001612395565b50505050905090810190601f1680156123da5780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b15801561242a57600080fd5b505afa15801561243e573d6000803e3d6000fd5b505050506040513d602081101561245457600080fd5b5051608087015160608801519192506000916124759163ffffffff61219e16565b9050428760c0015167ffffffffffffffff16101561249b57506001935061145a92505050565b6124a9838860200151612954565b6124bb57506002935061145a92505050565b808211156124d157506003935061145a92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561251357600080fd5b505afa158015612527573d6000803e3d6000fd5b505050506040513d602081101561253d57600080fd5b50511461255257506004935061145a92505050565b8660a0015160ff16841461256e57506005935061145a92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b1580156125b357600080fd5b505afa1580156125c7573d6000803e3d6000fd5b505050506040513d60208110156125dd57600080fd5b50516001600160a01b031614158061267f57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561265057600080fd5b505afa158015612664573d6000803e3d6000fd5b505050506040513d602081101561267a57600080fd5b505114155b1561269257506006935061145a92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b60608152602001906001900390816126b857505083519091506126e09063ffffffff16612a3c565b816000815181106126ed57fe5b6020026020010181905250612708836020015160001c612a3c565b8160018151811061271557fe5b60200260200101819052506121e081612a4f565b60006121e083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ad9565b612773613168565b600061277d613168565b6127856131bb565b61279661279186612b3e565b612b63565b90506000805b6127a583612bad565b156128b057806127ca576127c06127bb84612bce565b612c1c565b60ff1684526128a8565b80600114156127e9576127df6127bb84612bce565b60208501526128a8565b8060021415612816576128036127fe84612bce565b612cd1565b6001600160a01b031660408501526128a8565b80600314156128355761282b6127bb84612bce565b60608501526128a8565b80600414156128545761284a6127bb84612bce565b60808501526128a8565b8060051415612876576128696127bb84612bce565b60ff1660a08501526128a8565b80600614156128a35761288b6127bb84612bce565b67ffffffffffffffff1660c0850152600191506128a8565b6128b0565b60010161279c565b5091935090915050915091565b6000818484111561294c5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129115781810151838201526020016128f9565b50505050905090810190601f16801561293e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b815160009083906008108061296a575080516003115b1561297957600091505061145a565b604080516020808252818301909252606091602082018180368337019050509050836020820152808251815181106129ad57fe5b6020910101516001600160f81b031916602d60f81b146129d25760009250505061145a565b600160005b8351811015612a32578281815181106129ec57fe5b602001015160f81c60f81b6001600160f81b031916848281518110612a0d57fe5b01602001516001600160f81b03191614612a2a5760009150612a32565b6001016129d7565b5095945050505050565b606061145a612a4a83612ceb565b612dd1565b6060815160001415612a705750604080516000815260208101909152610bb6565b606082600081518110612a7f57fe5b602002602001015190506000600190505b8351811015612ac057612ab682858381518110612aa957fe5b6020026020010151612e23565b9150600101612a90565b506121e0612ad3825160c060ff16612ea0565b82612e23565b60008183612b285760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156129115781810151838201526020016128f9565b506000838581612b3457fe5b0495945050505050565b612b466131db565b506040805180820190915281518152602082810190820152919050565b612b6b6131bb565b612b7482612f98565b612b7d57600080fd5b6000612b8c8360200151612fd2565b60208085015160408051808201909152868152920190820152915050919050565b6000612bb76131db565b505080518051602091820151919092015191011190565b612bd66131db565b612bdf82612bad565b612be857600080fd5b60208201516000612bf882613035565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590612c3157508151602110155b612c3a57600080fd5b6000612c498360200151612fd2565b90508083600001511015612ca4576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b82516020808501518301805192849003929183101561219557506020919091036101000a90049392505050565b8051600090601514612ce257600080fd5b61145a82612c1c565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416612d2f57506018612d53565b6fffffffffffffffffffffffffffffffff198416612d4f57506010612d53565b5060005b6020811015612d8957818181518110612d6857fe5b01602001516001600160f81b03191615612d8157612d89565b600101612d53565b60008160200390506060816040519080825280601f01601f191660200182016040528015612dbe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015612e035750607f60f81b82600081518110612df157fe5b01602001516001600160f81b03191611155b15612e0f575080610bb6565b61145a612e218351608060ff16612ea0565b835b6060806040519050835180825260208201818101602087015b81831015612e54578051835260209283019201612e3c565b50855184518101855292509050808201602086015b81831015612e81578051835260209283019201612e69565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310612ef0576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411612f4a5782840160f81b81600081518110612f2c57fe5b60200101906001600160f81b031916908160001a905350905061145a565b6060612f5585612ceb565b90508381510160370160f81b82600081518110612f6e57fe5b60200101906001600160f81b031916908160001a905350612f8f8282612e23565b95945050505050565b8051600090612fa957506000610bb6565b6020820151805160001a9060c0821015612fc857600092505050610bb6565b5060019392505050565b8051600090811a6080811015612fec576000915050610bb6565b60b8811080613007575060c08110801590613007575060f881105b15613016576001915050610bb6565b60c081101561302a5760b519019050610bb6565b60f519019050610bb6565b80516000908190811a60808110156130505760019150613161565b60b881101561306557607e1981019150613161565b60c08110156130df57600060b78203600186019550806020036101000a8651049150600181018201935050808310156130d9576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613161565b60f88110156130f45760be1981019150613161565b600060f78203600186019550806020036101000a86510491506001810182019350508083101561315f576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b60405180604001604052806131ce6131db565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe72656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e6420726571756573746f6e6c79206265703265206f776e65722063616e20617070726f766520746869732062696e642072657175657374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374a2646970667358221220914ada54d09b696ad62036cb65a565d2a3c3d1be8ef0e6805b9a955ec5783d0864736f6c63430006040033", + }, + { + ContractAddr: CrossChainContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/823b953232a344ba3c32d6690e70a245477e5760", + Code: "608060405234801561001057600080fd5b50600436106102485760003560e01c8063863fe4ab1161013b578063c81b1662116100b8578063e3b048051161007c578063e3b048051461072c578063f7a251d71461074c578063f9a2bbc7146107c4578063fc3e5908146107cc578063fd6a6879146107d457610248565b8063c81b1662146106dd578063d31f968d146106e5578063d76a867514610714578063dc927faf1461071c578063e1c7392a1461072457610248565b8063a78abc16116100ff578063a78abc16146105d3578063ab51bb96146105db578063ac431751146105e3578063b0355f5b146103ff578063c27cdcfb146106a157610248565b8063863fe4ab146105b35780638cc8f561146104b657806396713da9146105bb5780639dc09262146105c3578063a1a11bf5146105cb57610248565b8063493279b1116101c957806370fd5bad1161018d57806370fd5bad146104b657806374f079b8146104be57806375d47a0a146104c65780637942fd05146104ce57806384013b6a146104d657610248565b8063493279b11461045f5780634bf6c8821461047e57806351e80672146104865780636e47a51a1461048e5780636e47b482146104ae57610248565b8063308325f411610210578063308325f4146102cf5780633bdc47a6146102d75780633dffc387146103ff578063422f90501461040757806343756e5c1461043b57610248565b806305e682581461024d5780630bee7a671461026b57806314b3023b1461028c57806322556cdc146102a65780632ff32aea146102ae575b600080fd5b6102556107dc565b6040805160ff9092168252519081900360200190f35b6102736107e1565b6040805163ffffffff9092168252519081900360200190f35b6102946107e6565b60408051918252519081900360200190f35b6102946107ec565b6102b66107f1565b60408051600792830b90920b8252519081900360200190f35b6102946107fa565b61038a600480360360608110156102ed57600080fd5b60ff82351691602081013591810190606081016040820135600160201b81111561031657600080fd5b82018360208201111561032857600080fd5b803590602001918460018302840111600160201b8311171561034957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610800945050505050565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255610876565b6104276004803603602081101561041d57600080fd5b503560ff1661087b565b604080519115158252519081900360200190f35b610443610890565b604080516001600160a01b039092168252519081900360200190f35b610467610896565b6040805161ffff9092168252519081900360200190f35b61025561089b565b6104436108a0565b610443600480360360208110156104a457600080fd5b503560ff166108a6565b6104436108c1565b6102556108c7565b6102946108cc565b6104436108d2565b6102556108d8565b6105b1600480360360a08110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460018302840111600160201b8311171561053957600080fd5b919390929091602081019035600160201b81111561055657600080fd5b82018360208201111561056857600080fd5b803590602001918460018302840111600160201b8311171561058957600080fd5b919350915080356001600160401b03908116916020810135909116906040013560ff166108dd565b005b610294611a8d565b610255611a95565b610443611a9a565b610443611aa0565b610427611aa6565b6102736107dc565b6105b1600480360360408110156105f957600080fd5b810190602081018135600160201b81111561061357600080fd5b82018360208201111561062557600080fd5b803590602001918460018302840111600160201b8311171561064657600080fd5b919390929091602081019035600160201b81111561066357600080fd5b82018360208201111561067557600080fd5b803590602001918460018302840111600160201b8311171561069657600080fd5b509092509050611aaf565b6106c1600480360360208110156106b757600080fd5b503560ff16612051565b604080516001600160401b039092168252519081900360200190f35b61044361206c565b610427600480360360408110156106fb57600080fd5b5080356001600160a01b0316906020013560ff16612072565b61038a612092565b6104436120b1565b6105b16120b7565b6106c16004803603602081101561074257600080fd5b503560ff1661246e565b6105b16004803603606081101561076257600080fd5b60ff8235169190810190604081016020820135600160201b81111561078657600080fd5b82018360208201111561079857600080fd5b803590602001918460018302840111600160201b831117156107b957600080fd5b919350915035612489565b6104436125da565b6102556125e0565b6104436125e5565b600081565b606481565b60015481565b603281565b60045460070b81565b60025481565b60606000825160210190506060816040519080825280601f01601f191660200182016040528015610838576020820181803683370190505b506021810186905260018101879052828152905060418101600061085b866125eb565b50905061086a818388516125f5565b50909695505050505050565b600181565b60096020526000908152604090205460ff1681565b61100181565b606181565b600881565b61200081565b6005602052600090815260409020546001600160a01b031681565b61100581565b600281565b60035481565b61100881565b600b81565b60005460ff16610930576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60408051630a83aaa960e31b815233600482015290516110069163541d5548916024808301926020929190829003018186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d602081101561099957600080fd5b50516109ec576040805162461bcd60e51b815260206004820152601f60248201527f746865206d73672073656e646572206973206e6f7420612072656c6179657200604482015290519081900360640190fd5b60ff8116600090815260086020526040902054829082906001600160401b039081169083168114610a5c576040805162461bcd60e51b815260206004820152601560248201527439b2b8bab2b731b2903737ba1034b71037b93232b960591b604482015290519081900360640190fd5b60ff8216600090815260086020908152604091829020805467ffffffffffffffff1916600185016001600160401b039081169190911790915582516337d7f9c160e21b81529089166004820152915188926110039263df5fe70492602480840193829003018186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d6020811015610afb57600080fd5b5051610b385760405162461bcd60e51b8152600401808060200182810382526023815260200180612bcc6023913960400191505060405180910390fd5b60ff851660009081526005602052604090205485906001600160a01b0316610ba7576040805162461bcd60e51b815260206004820152601860248201527f6368616e6e656c206973206e6f7420737570706f727465640000000000000000604482015290519081900360640190fd5b60608c8c8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050905060608b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805163cba510a960e01b81526001600160401b038f1660048201529051939450610cce93611003935063cba510a992506024808301926020929190829003018186803b158015610c7757600080fd5b505afa158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b505160408051808201909152600381526269626360e81b6020820152610cc78c8c612636565b858561267d565b610d16576040805162461bcd60e51b815260206004820152601460248201527334b73b30b634b21036b2b935b63290383937b7b360611b604482015290519081900360640190fd5b60408051631bb5062960e31b81526001600160401b038c16600482015290516000916110039163dda8314891602480820192602092909190829003018186803b158015610d6257600080fd5b505afa158015610d76573d6000803e3d6000fd5b505050506040513d6020811015610d8c57600080fd5b5051905088600080806060610da08861277a565b935093509350935083610e61578460ff168f6001600160401b03167ff7b2e42d694eb1100184aae86d4245d9e46966100b1dc7e723275b98326854ac8a6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e1a578181015183820152602001610e02565b50505050905090810190601f168015610e475780820380516001836020036101000a031916815260200191505b509250505060405180910390a35050505050505050611a7f565b8460ff168f6001600160401b03167f36afdaf439a8f43fe72135135d804ae620b37a474f0943b5b85f6788312cad4085604051808260ff1660ff16815260200191505060405180910390a360ff83166113ea5760ff85166000818152600560209081526040808320548151631182b87560e01b815260048101958652602481019283528651604482015286516001600160a01b03909216958695631182b875958d958a9593949093606490910192918601918190849084905b83811015610f32578181015183820152602001610f1a565b50505050905090810190601f168015610f5f5780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b158015610f7f57600080fd5b505af192505050801561106357506040513d6000823e601f3d908101601f191682016040526020811015610fb257600080fd5b8101908080516040519392919084600160201b821115610fd157600080fd5b908301906020820185811115610fe657600080fd5b8251600160201b811182820188101715610fff57600080fd5b82525081516020918201929091019080838360005b8381101561102c578181015183820152602001611014565b50505050905090810190601f1680156110595780820380516001836020036101000a031916815260200191505b5060405250505060015b611375576040516000815260443d101561107f5750600061111a565b60046000803e60005160e01c6308c379a081146110a057600091505061111a565b60043d036004833e81513d60248201116001600160401b03821117156110cb5760009250505061111a565b80830180516001600160401b038111156110ec57600094505050505061111a565b8060208301013d860181111561110a5760009550505050505061111a565b601f01601f191660405250925050505b806111255750611237565b60ff871660009081526007602052604081205461115c916001600160401b039091169089906111579060029088610800565b61282a565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf948794849390840192918601918190849084905b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b509250505060405180910390a250611370565b3d808015611261576040519150601f19603f3d011682016040523d82523d6000602084013e611266565b606091505b5060ff8716600090815260076020526040812054611299916001600160401b039091169089906111579060029088610800565b60ff8716600090815260076020908152604080832080546001600160401b038082166001011667ffffffffffffffff19909116179055805182815284518184015284516001600160a01b038716947f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351948794849390840192918601918190849084905b8381101561133457818101518382015260200161131c565b50505050905090810190601f1680156113615780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6113e4565b8051156113e25760ff87166000908152600760205260408120546113ae916001600160401b039091169089906111579060019086610800565b60ff8716600090815260076020526040902080546001600160401b038082166001011667ffffffffffffffff199091161790555b505b506119b8565b60ff83166001141561168e5760ff8516600081815260056020908152604080832054815163831d65d160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563831d65d1958d958a9593949093606490910192918601918190849084905b8381101561147457818101518382015260200161145c565b50505050905090810190601f1680156114a15780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1580156114c157600080fd5b505af19250505080156114d2575060015b6113e4576040516000815260443d10156114ee57506000611589565b60046000803e60005160e01c6308c379a0811461150f576000915050611589565b60043d036004833e81513d60248201116001600160401b038211171561153a57600092505050611589565b80830180516001600160401b0381111561155b576000945050505050611589565b8060208301013d860181111561157957600095505050505050611589565b601f01601f191660405250925050505b8061159457506115f9565b60408051602080825283518183015283516001600160a01b038616937ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf93869390928392830191850190808383600083156111f75781810151838201526020016111df565b3d808015611623576040519150601f19603f3d011682016040523d82523d6000602084013e611628565b606091505b5060408051602080825283518183015283516001600160a01b038616937f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351938693909283928301918501908083836000831561133457818101518382015260200161131c565b60ff8316600214156119b85760ff8516600081815260056020908152604080832054815163c8509d8160e01b815260048101958652602481019283528651604482015286516001600160a01b0390921695869563c8509d81958d958a9593949093606490910192918601918190849084905b83811015611718578181015183820152602001611700565b50505050905090810190601f1680156117455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b15801561176557600080fd5b505af1925050508015611776575060015b6119b6576040516000815260443d10156117925750600061182d565b60046000803e60005160e01c6308c379a081146117b357600091505061182d565b60043d036004833e81513d60248201116001600160401b03821117156117de5760009250505061182d565b80830180516001600160401b038111156117ff57600094505050505061182d565b8060208301013d860181111561181d5760009550505050505061182d565b601f01601f191660405250925050505b8061183857506118e1565b816001600160a01b03167ff91a8f63e5b3e0e89e5f93e1915a7805f3c52d9a73b3c09769785c2c7bf87acf826040518080602001828103825283818151815260200191508051906020019080838360005b838110156118a1578181015183820152602001611889565b50505050905090810190601f1680156118ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2506119b6565b3d80801561190b576040519150601f19603f3d011682016040523d82523d6000602084013e611910565b606091505b50816001600160a01b03167f63ac299d6332d1cc4e61b81e59bc00c0ac7c798addadf33840f1307cd2977351826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561197a578181015183820152602001611962565b50505050905090810190601f1680156119a75780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b505b60ff80861660009081526009602052604090205461100591636f93d2e69189913391879116806119ea575060ff881615155b604080516001600160e01b031960e088901b1681526001600160a01b039586166004820152939094166024840152604483019190915215156064820152905160848083019260209291908290030181600087803b158015611a4a57600080fd5b505af1158015611a5e573d6000803e3d6000fd5b505050506040513d6020811015611a7457600080fd5b505050505050505050505b505050505050505050505050565b630100610081565b600981565b61100781565b61100681565b60005460ff1681565b3361100714611aef5760405162461bcd60e51b815260040180806020018281038252602e815260200180612b22602e913960400191505060405180910390fd5b611b5884848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526012815271626174636853697a65466f724f7261636c6560701b602082015291506129809050565b15611bf357604080516020601f8401819004810282018101909252828152600091611b9b91858580838501838280828437600092019190915250612a6792505050565b90506127108111158015611bb05750600a8110155b611beb5760405162461bcd60e51b8152600401808060200182810382526032815260200180612b9a6032913960400191505060405180910390fd5b600155611fbf565b611c5c84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601281527118591913dc955c19185d1950da185b9b995b60721b602082015291506129809050565b15611de457606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060169091149050611cdf5760405162461bcd60e51b815260040180806020018281038252605a815260200180612ac8605a913960600191505060405180910390fd5b60018101516002820151601683015160ff82161590611cfd81612a6c565b611d4e576040805162461bcd60e51b815260206004820152601960248201527f61646472657373206973206e6f74206120636f6e747261637400000000000000604482015290519081900360640190fd5b60ff8416600081815260056020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600683528184208585528352818420805460ff199081166001179091556009909352818420805490931687151517909255519092917f7e3b6af43092577ee20e60eaa1d9b114a7031305c895ee7dd3ffe17196d2e1e091a35050505050611fbf565b611e5184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526016815275195b98589b1953dc911a5cd8589b1950da185b9b995b60521b602082015291506129809050565b15611f8257606082828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505082519293505060029091149050611ed45760405162461bcd60e51b815260040180806020018281038252604a815260200180612b50604a913960600191505060405180910390fd5b600181810151600283015160ff80831660009081526005602052604090205492939192908316909114906001600160a01b03168015611f78576001600160a01b038116600090815260066020908152604080832060ff881680855290835292819020805460ff1916861515908117909155815190815290517fa3132e3f9819fbddc7f0ed6d38d7feef59aa95112090b7c592f5cb5bc4aa4adc929181900390910190a25b5050505050611fbf565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b6008602052600090815260409020546001600160401b031681565b61100281565b600660209081526000928352604080842090915290825290205460ff1681565b6040518060400160405280600381526020016269626360e81b81525081565b61100381565b60005460ff161561210f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b7f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b80546001600160a01b0319908116611008179091557f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36805460ff199081169091557fd8af288fc1c8680b4f4706064cf021e264efb6828fcaf7eb5ca36818eb365bcc8054821660019081179091557f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a805484166110049081179091557f6cde3cea4b3a3fb2488b2808bae7556f4a405e50f65e1794383bc026131b13c38054841690557f72e4efa1513b071517c6c74dba31b5934a81aa83cddd400e7081df5529c9943680548416831790557fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc08054851690911790557fc575c31fea594a6eb97c8e9d3f9caee4c16218c6ef37e923234c0fe9014a61e78054831690557f4e523af77f034e9810f1c94057f5e931fb3d16a51511a4c3add793617d18610580548316821790557ffb33122aa9f93cc639ebe80a7bc4784c11e6053dde89c6f4f7e268c6a623da1e805484166110001790557fc7694af312c4f286114180fd0ba6a52461fcee8a381636770b19a343af92538a80548316821790557f01112dd68e482ba8d68a7e828cff8b3abcea08eab88941953c180a7e650e9cd480548316821790557fc0a4a8be475dfebc377ebef2d7c4ff47656f572a08dd92b81017efcdba0febe1805484166110071790557f87e8a52529e8ece4ef759037313542a6429ff494a9fab9027fb79db90124eba680548316821790557f4c7666bbcb22d46469f7cc282f70764a7012dca2cce630ff8d83db9a9cdd48f080548316821790557f40f28f99a40bc9f6beea1013afdbc3cdcc689eb76b82c4de06c0acf1e1932ed58054909316611001179092557f0d9cf2cd531699eed8dd34e40ff2884a14a698c4898184fba85194e6f6772d248054821683179055600b60009081527f23f68c9bd22b8a93d06adabe17481c87c016bcbd20adc8bfd707a4d813a572176020527fdf0d5d05428057f5455c2dc8e810dd86d1e9350faa72f16bda8a45443c5b39328054831684179055603283556004805467ffffffffffffffff19166001600160401b031790556002819055600381905580549091169091179055565b6007602052600090815260409020546001600160401b031681565b60005460ff166124dc576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33600090815260066020908152604080832060ff80891685529252909120548591166125395760405162461bcd60e51b8152600401808060200182810382526031815260200180612a976031913960400191505060405180910390fd5b60ff85166000908152600760209081526040808320548151601f88018490048402810184019092528682526001600160401b03169261259e9284928a9261115792909189918c908c908190840183828082843760009201919091525061080092505050565b60ff959095166000908152600760205260409020805467ffffffffffffffff191660019096016001600160401b03169590951790945550505050565b61100081565b600381565b61100481565b8051602090910191565b5b60208110612615578251825260209283019290910190601f19016125f6565b915181516020939093036101000a6000190180199091169216919091179052565b60408051600e808252818301909252606091630100610060ff851617918391602082018180368337505050600e818101969096526006810192909252509283525090919050565b60008561268c57506000612771565b606082518451865160800101016040519080825280601f01601f1916602001820160405280156126c3576020820181803683370190505b50905060006126d182612a72565b6020808901518252019050866000806126e9896125eb565b80865260209095019490925090506127028285836125f5565b9283019261270f886125eb565b80865260209095019490925090506127288285836125f5565b9283018a81526020019261273b876125eb565b909250905061274b8285836125f5565b508351602001612759612a78565b60208183886065600019fa5051600114955050505050505b95945050505050565b600080600060606021855110156127aa575050604080516000808252602082019092529092508291508190612823565b600185015160218601518651604080516020198301808252601f19600119909401939093168101602001909152604189019392916060919080156127f5576020820181803683370190505b5090506000612803826125eb565b509050612815858260218d51036125f5565b506001975091955093509150505b9193509193565b600254431115612869576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b1617909155600355436002556128aa565b600380546001908101918290555410156128aa576004805467ffffffffffffffff1981166001600160401b036001600793840b810190930b16179091556003555b8160ff16836001600160401b0316600460009054906101000a900460070b6001600160401b03167f3a6e0fc61675aa2a100bcba0568368bb92bcec91c97673391074f11138f0cffe606185604051808361ffff1661ffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612940578181015183820152602001612928565b50505050905090810190601f16801561296d5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a4505050565b6000816040516020018082805190602001908083835b602083106129b55780518252601f199092019160209182019101612996565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612a235780518252601f199092019160209182019101612a04565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b3b151590565b60200190565b6040518060200160405280600190602082028036833750919291505056fe74686520636f6e747261637420616e64206368616e6e656c2068617665206e6f74206265656e20726567697374657265646c656e677468206f662076616c756520666f72206164644f725570646174654368616e6e656c2073686f756c642062652032322c206368616e6e656c49643a697346726f6d53797374656d3a68616e646c657241646472657373746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e74726163746c656e677468206f662076616c756520666f7220656e61626c654f7244697361626c654368616e6e656c2073686f756c6420626520322c206368616e6e656c49643a6973456e61626c65746865206e6577426174636853697a65466f724f7261636c652073686f756c6420626520696e205b31302c2031303030305d6c6967687420636c69656e74206e6f742073796e632074686520626c6f636b20796574a26469706673582212207ab71aabd28c992023fb9ff6fe581825d14cb96a7bc39321484311e85804154864736f6c63430006040033", + }, + }, + } + + mirrorUpgrade[mainNet] = &Upgrade{ + UpgradeName: "mirror", + Configs: []*UpgradeConfig{ + { + ContractAddr: TokenManagerContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "6080604052600436106103815760003560e01c80637d078e13116101d1578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d38578063fc3e5908146105b2578063fd6a687914610d4d578063fe3a2af514610d6257610381565b8063d9e6dae9146106fc578063dc927faf14610cf9578063e605bca014610d0e578063f9a2bbc714610d2357610381565b8063c8509d81116100dc578063c8509d8114610bdf578063c8e704a4146105b2578063d117a11014610c64578063d7109ce614610ce457610381565b8063b79503171461073b578063bd32d3f9146104d9578063c81b166214610bca57610381565b80639a854bbd1161016f578063a78abc1611610149578063a78abc1614610ad5578063ab51bb9614610aea578063ab67a4851461073b578063ac43175114610aff57610381565b80639a854bbd14610a965780639dc0926214610aab578063a1a11bf514610ac057610381565b8063859180fb116101ab578063859180fb146106e757806394553a4e14610a3757806395b9ad2614610a6c57806396713da914610a8157610381565b80637d078e13146104ee5780637ec816dd1461099b578063831d65d1146109b057610381565b8063493279b1116102b657806366dea52a1161025457806372c4e0861161022357806372c4e0861461081957806375d47a0a146108bd57806377d9dae8146108d25780637942fd051461098657610381565b806366dea52a1461073b5780636b3f1307146107505780636e47b4821461080457806370fd5bad1461073b57610381565b806351e806721161029057806351e80672146107115780635d499b1b146107265780635f558f861461073b57806361368475146106fc57610381565b8063493279b1146106bb5780634bc81c00146106e75780634bf6c882146106fc57610381565b80632e02d77611610323578063401809f9116102fd578063401809f9146105b257806343756e5c146105c7578063445fcefe146105f8578063487c88ac146104ee57610381565b80632e02d7761461054c57806337e6ecda1461057f5780633dffc387146104ee57610381565b80631f91600b1161035f5780631f91600b146104d957806323996b53146104ee57806325c751b7146105035780632d89ac32146104ee57610381565b80630bee7a67146103865780630f212b1b146103b45780631182b875146103df575b600080fd5b34801561039257600080fd5b5061039b610d77565b6040805163ffffffff9092168252519081900360200190f35b3480156103c057600080fd5b506103c9610d7c565b6040805160ff9092168252519081900360200190f35b3480156103eb57600080fd5b506104646004803603604081101561040257600080fd5b60ff8235169190810190604081016020820135600160201b81111561042657600080fd5b82018360208201111561043857600080fd5b803590602001918460018302840111600160201b8311171561045957600080fd5b509092509050610d81565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e557600080fd5b506103c9610e9b565b3480156104fa57600080fd5b506103c9610ea0565b6105386004803603604081101561051957600080fd5b5080356001600160a01b031690602001356001600160401b0316610ea5565b604080519115158252519081900360200190f35b34801561055857600080fd5b506105386004803603602081101561056f57600080fd5b50356001600160a01b03166113f1565b34801561058b57600080fd5b50610538600480360360208110156105a257600080fd5b50356001600160a01b0316611406565b3480156105be57600080fd5b506103c961141b565b3480156105d357600080fd5b506105dc611420565b604080516001600160a01b039092168252519081900360200190f35b34801561060457600080fd5b506106a96004803603602081101561061b57600080fd5b810190602081018135600160201b81111561063557600080fd5b82018360208201111561064757600080fd5b803590602001918460018302840111600160201b8311171561066857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611426945050505050565b60408051918252519081900360200190f35b3480156106c757600080fd5b506106d0611584565b6040805161ffff9092168252519081900360200190f35b3480156106f357600080fd5b506103c9611589565b34801561070857600080fd5b506103c961158e565b34801561071d57600080fd5b506105dc611593565b34801561073257600080fd5b506106a9611599565b34801561074757600080fd5b506103c96115a2565b6105386004803603604081101561076657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111600160201b831117156107c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115a7945050505050565b34801561081057600080fd5b506105dc611e7d565b6105386004803603602081101561082f57600080fd5b810190602081018135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e83945050505050565b3480156108c957600080fd5b506105dc6122cf565b610538600480360360408110156108e857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460018302840111600160201b8311171561094557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122d5945050505050565b34801561099257600080fd5b506103c96127db565b3480156109a757600080fd5b506106a96127e0565b3480156109bc57600080fd5b50610a35600480360360408110156109d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156109f757600080fd5b820183602082011115610a0957600080fd5b803590602001918460018302840111600160201b83111715610a2a57600080fd5b5090925090506127e6565b005b61053860048036036040811015610a4d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612935565b348015610a7857600080fd5b506103c961332c565b348015610a8d57600080fd5b506103c9613331565b348015610aa257600080fd5b506106a9613336565b348015610ab757600080fd5b506105dc613342565b348015610acc57600080fd5b506105dc613348565b348015610ae157600080fd5b5061053861334e565b348015610af657600080fd5b5061039b613357565b348015610b0b57600080fd5b50610a3560048036036040811015610b2257600080fd5b810190602081018135600160201b811115610b3c57600080fd5b820183602082011115610b4e57600080fd5b803590602001918460018302840111600160201b83111715610b6f57600080fd5b919390929091602081019035600160201b811115610b8c57600080fd5b820183602082011115610b9e57600080fd5b803590602001918460018302840111600160201b83111715610bbf57600080fd5b50909250905061335c565b348015610bd657600080fd5b506105dc613631565b348015610beb57600080fd5b50610a3560048036036040811015610c0257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c2657600080fd5b820183602082011115610c3857600080fd5b803590602001918460018302840111600160201b83111715610c5957600080fd5b509092509050613637565b348015610c7057600080fd5b50610c8e60048036036020811015610c8757600080fd5b503561370d565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610cf057600080fd5b506106a9613764565b348015610d0557600080fd5b506105dc613769565b348015610d1a57600080fd5b506106a961376f565b348015610d2f57600080fd5b506105dc613775565b348015610d4457600080fd5b506106a961377b565b348015610d5957600080fd5b506105dc613781565b348015610d6e57600080fd5b506103c9613357565b606481565b600681565b60603361200014610dc35760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff841660011415610e1557610e0e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061378792505050565b9050610e94565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b5051905080610f5e576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16610fc1576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b505190506402540be4003406158015611053575060055461104f908263ffffffff613a1716565b3410155b61108e5760405162461bcd60e51b8152600401808060200182810382526046815260200180615b156046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110b85750426201518001846001600160401b031611155b6110f35760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d602081101561115857600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111a057600080fd5b505afa1580156111b4573d6000803e3d6000fd5b505050506040513d60208110156111ca57600080fd5b50519050677ce66c50e28400006111e48360ff8416613a71565b1115611230576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061124c90349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015611274573d6000803e3d6000fd5b5061127d615869565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016112cc6402540be400600554613b4290919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d760056112f384613b84565b61131d6402540be40061131160055434613b0090919063ffffffff16565b9063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137b578181015183820152602001611363565b50505050905090810190601f1680156113a85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061143661589e565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906114bd5760009250505061157f565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561151b57600080fd5b505afa15801561152f573d6000803e3d6000fd5b505050506040513d602081101561154557600080fd5b5051608083015160608401519192506000916115669163ffffffff613b0016565b9050611578818363ffffffff613b0016565b9450505050505b919050565b603881565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156115ff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615bb8602b913960400191505060405180910390fd5b600061160a83613cb9565b905061161461589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526116d9576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b60006116f682608001518360600151613b0090919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461174c5760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561178f57600080fd5b505afa1580156117a3573d6000803e3d6000fd5b505050506040513d60208110156117b957600080fd5b50516001600160a01b0316146118005760405162461bcd60e51b815260040180806020018281038252602e8152602001806159e4602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561184c57600080fd5b505afa158015611860573d6000803e3d6000fd5b505050506040513d602081101561187657600080fd5b505160408051636eb1769f60e11b8152336004820152306024820152905191925083916119079184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50519063ffffffff613a1716565b101561195a576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d60208110156119c657600080fd5b505190508082108015906119df57506402540be4008206155b611a1a5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b6000611a26868b613cc0565b905063ffffffff8116611c25576001600160a01b038a166323b872dd33611004611a56898963ffffffff613b0016565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611be4578181015183820152602001611bcc565b50505050905090810190601f168015611c115780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611cdd565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ca1578181015183820152602001611c89565b50505050905090810190601f168015611cce5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d376158da565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611d7f573d6000803e3d6000fd5b5061200063f7a251d76001611d938461411a565b611da8886402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e06578181015183820152602001611dee565b50505050905090810190601f168015611e335780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b600080611e8f83613cb9565b9050611e9961589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611f5e576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b031610611fbf576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b5051905080821080159061204457506402540be4008206155b61207f5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556120d96158da565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561211c573d6000803e3d6000fd5b5061200063f7a251d760016121308461411a565b612145876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121a357818101518382015260200161218b565b50505050905090810190601f1680156121d05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561228757818101518382015260200161226f565b50505050905090810190601f1680156122b45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806122e183613cb9565b90506122eb61589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123b0576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124045760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b50516001600160a01b0316146124ce576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d602081101561253a57600080fd5b5051905080821080159061255357506402540be4008206155b61258e5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556125e86158da565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561262b573d6000803e3d6000fd5b5061200063f7a251d7600161263f8461411a565b612654876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126b257818101518382015260200161269a565b50505050905090810190601f1680156126df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561279257818101518382015260200161277a565b50505050905090810190601f1680156127bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128265760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156128765761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b612930565b60ff8316600514156128c15761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061443d92505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561298257600080fd5b505afa158015612996573d6000803e3d6000fd5b505050506040513d60208110156129ac57600080fd5b5051146129f0576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a4f576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505190506402540be4003406158015612ae15750600454612add908263ffffffff613a1716565b3410155b612b1c5760405162461bcd60e51b815260040180806020018281038252604d815260200180615997604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b465750426201518001836001600160401b031611155b612b815760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d6020811015612c5857600080fd5b50519050677ce66c50e2840000612c728260ff8516613a71565b1115612cbe576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d3657600080fd5b8101908080516040519392919084600160201b821115612d5557600080fd5b908301906020820185811115612d6a57600080fd5b8251600160201b811182820188101715612d8357600080fd5b82525081516020918201929091019080838360005b83811015612db0578181015183820152602001612d98565b50505050905090810190601f168015612ddd5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612dff57506020815111155b612e50576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612ec857600080fd5b8101908080516040519392919084600160201b821115612ee757600080fd5b908301906020820185811115612efc57600080fd5b8251600160201b811182820188101715612f1557600080fd5b82525081516020918201929091019080838360005b83811015612f42578181015183820152602001612f2a565b50505050905090810190601f168015612f6f5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612f8f57508051600810155b612fe0576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561313457604160f81b828260ff168151811061300357fe5b01602001516001600160f81b031916108015906130415750602d60f91b828260ff168151811061302f57fe5b01602001516001600160f81b03191611155b806130995750606160f81b828260ff168151811061305b57fe5b01602001516001600160f81b031916108015906130995750603d60f91b828260ff168151811061308757fe5b01602001516001600160f81b03191611155b806130f15750600360fc1b828260ff16815181106130b357fe5b01602001516001600160f81b031916108015906130f15750603960f81b828260ff16815181106130df57fe5b01602001516001600160f81b03191611155b61312c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615ac6602e913960400191505060405180910390fd5b600101612fe3565b50600454611004906108fc9061315190349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015613179573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131b06158f1565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161320f6402540be400600454613b4290919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461323684614608565b6132546402540be40061131160045434613b0090919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132b257818101518382015260200161329a565b50505050905090810190601f1680156132df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b336110071461339c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615b5b602e913960400191505060405180910390fd5b602081146133f1576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156134e65760208201516402540be4008106156134de576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b60045561359c565b6673796e6346656560c81b81141561355f5760208201516402540be400810615613557576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b60055561359c565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136775760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156136c25761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061477a92505050565b60ff8316600514156128c15761287182828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148b992505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b606061379161589e565b600061379c846149b3565b91509150806137f2576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138a5576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b03909216919091021790556139fc565b815160ff16600114156139af5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d602081101561392857600080fd5b505190506001600160a01b038116156139a95760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050505b506139fc565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610e94576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613ae957604d60071983011115613acb576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613ae2836007198401600a0a63ffffffff613b4216565b90506113eb565b610e94836008849003600a0a63ffffffff614b0416565b6000610e9483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614b5d565b6000610e9483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614bf4565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613b9f5750508351909150613bca906001600160a01b0316614c59565b81600081518110613bd757fe5b6020026020010181905250613bf883602001516001600160a01b0316614c59565b81600181518110613c0557fe5b6020026020010181905250613c20836040015160001c614c7c565b81600281518110613c2d57fe5b6020026020010181905250613c458360600151614c7c565b81600381518110613c5257fe5b6020026020010181905250613c6a8360800151614c7c565b81600481518110613c7757fe5b6020026020010181905250613c988360a001516001600160401b0316614c7c565b81600581518110613ca557fe5b6020026020010181905250610e9481614c8f565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613cfc57600080fd5b505afa158015613d10573d6000803e3d6000fd5b505050506040513d6020811015613d2657600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613d7257600080fd5b505afa158015613d86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613daf57600080fd5b8101908080516040519392919084600160201b821115613dce57600080fd5b908301906020820185811115613de357600080fd5b8251600160201b811182820188101715613dfc57600080fd5b82525081516020918201929091019080838360005b83811015613e29578181015183820152602001613e11565b50505050905090810190601f168015613e565780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ea657600080fd5b505afa158015613eba573d6000803e3d6000fd5b505050506040513d6020811015613ed057600080fd5b505160808701516060880151919250600091613ef19163ffffffff613b0016565b9050428760c001516001600160401b03161015613f165750600193506113eb92505050565b613f24838860200151614d19565b613f365750600293506113eb92505050565b80821115613f4c5750600393506113eb92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8e57600080fd5b505afa158015613fa2573d6000803e3d6000fd5b505050506040513d6020811015613fb857600080fd5b505114613fcd5750600493506113eb92505050565b8660a0015160ff168414613fe95750600593506113eb92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516001600160a01b03161415806140fa57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156140cb57600080fd5b505afa1580156140df573d6000803e3d6000fd5b505050506040513d60208110156140f557600080fd5b505114155b1561410d5750600693506113eb92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081614133575050835190915061415b9063ffffffff16614c7c565b8160008151811061416857fe5b6020026020010181905250614183836020015160001c614c7c565b81600181518110613ca557fe5b614198615869565b60006141a383614e01565b91509150806141f0576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166143515760808201516040516110049180156108fc02916000818181858888f19350505050158015614253573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b1580156142cd57600080fd5b505af11580156142e1573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061443a565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143a5576040519150601f19603f3d011682016040523d82523d6000602084013e6143aa565b606091505b50509050806143e75760808301516040516110029180156108fc02916000818181858888f193505050501580156143e5573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614445615935565b600061445083614f0e565b915091508061449d576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff1661451d5760408083015190516110049180156108fc02916000818181858888f193505050501580156144db573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061443a565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d80600081146145c0576040519150601f19603f3d011682016040523d82523d6000602084013e6145c5565b606091505b50509050806146025760408084015190516110029180156108fc02916000818181858888f19350505050158015614600573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b6060815260200190600190039081614624575050835190915061464f906001600160a01b0316614c59565b8160008151811061465c57fe5b602002602001018190525061467d83602001516001600160a01b0316614c59565b8160018151811061468a57fe5b60200260200101819052506146a5836040015160001c614c7c565b816002815181106146b257fe5b60200260200101819052506146cd836060015160001c614c7c565b816003815181106146da57fe5b60200260200101819052506146f28360800151614c7c565b816004815181106146ff57fe5b602002602001018190525061471a8360a0015160ff16614c7c565b8160058151811061472757fe5b602002602001018190525061473f8360c00151614c7c565b8160068151811061474c57fe5b602002602001018190525061476d8360e001516001600160401b0316614c7c565b81600781518110613ca557fe5b6147826158f1565b600061478d83614fda565b91509150806147da576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614824906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614861576040519150601f19603f3d011682016040523d82523d6000602084013e614866565b606091505b50509050806146025760c0830151611002906108fc90614891906402540be40063ffffffff614b0416565b6040518115909202916000818181858888f19350505050158015614600573d6000803e3d6000fd5b6148c1615869565b60006148cc8361512b565b9150915080614919576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614946906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614983576040519150601f19603f3d011682016040523d82523d6000602084013e614988565b606091505b5050905080614602576080830151611002906108fc90614891906402540be40063ffffffff614b0416565b6149bb61589e565b60006149c561589e565b6149cd61595c565b6149de6149d98661523b565b615260565b90506000805b6149ed836152aa565b15614af75780614a1257614a08614a03846152cb565b615319565b60ff168452614aef565b8060011415614a3157614a27614a03846152cb565b6020850152614aef565b8060021415614a5e57614a4b614a46846152cb565b6153ce565b6001600160a01b03166040850152614aef565b8060031415614a7d57614a73614a03846152cb565b6060850152614aef565b8060041415614a9c57614a92614a03846152cb565b6080850152614aef565b8060051415614abe57614ab1614a03846152cb565b60ff1660a0850152614aef565b8060061415614aea57614ad3614a03846152cb565b6001600160401b031660c085015260019150614aef565b614af7565b6001016149e4565b5091935090915050915091565b600082614b13575060006113eb565b82820282848281614b2057fe5b0414610e945760405162461bcd60e51b8152600401808060200182810382526021815260200180615af46021913960400191505060405180910390fd5b60008184841115614bec5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bb1578181015183820152602001614b99565b50505050905090810190601f168015614bde5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c435760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bb1578181015183820152602001614b99565b506000838581614c4f57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610e94816153e8565b60606113eb614c8a8361543e565b6153e8565b6060815160001415614cb0575060408051600081526020810190915261157f565b606082600081518110614cbf57fe5b602002602001015190506000600190505b8351811015614d0057614cf682858381518110614ce957fe5b6020026020010151615524565b9150600101614cd0565b50610e94614d13825160c060ff166155a1565b82615524565b8151600090839060081080614d2f575080516002115b15614d3e5760009150506113eb565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614d7257fe5b6020910101516001600160f81b031916602d60f81b14614d97576000925050506113eb565b600160005b8351811015614df757828181518110614db157fe5b602001015160f81c60f81b6001600160f81b031916848281518110614dd257fe5b01602001516001600160f81b03191614614def5760009150614df7565b600101614d9c565b5095945050505050565b614e09615869565b6000614e13615869565b614e1b61595c565b614e276149d98661523b565b90506000805b614e36836152aa565b15614af75780614e5c57614e4c614a46846152cb565b6001600160a01b03168452614f06565b8060011415614e8457614e71614a46846152cb565b6001600160a01b03166020850152614f06565b8060021415614ea657614e99614a03846152cb565b60ff166040850152614f06565b8060031415614ec557614ebb614a03846152cb565b6060850152614f06565b8060041415614ee457614eda614a03846152cb565b6080850152614f06565b8060051415614aea57614ef9614a03846152cb565b60ff1660a0850152600191505b600101614e2d565b614f16615935565b6000614f20615935565b614f2861595c565b614f346149d98661523b565b90506000805b614f43836152aa565b15614af75780614f6957614f59614a46846152cb565b6001600160a01b03168452614fd2565b8060011415614f9157614f7e614a46846152cb565b6001600160a01b03166020850152614fd2565b8060021415614fb057614fa6614a03846152cb565b6040850152614fd2565b8060031415614aea57614fc5614a03846152cb565b60ff166060850152600191505b600101614f3a565b614fe26158f1565b6000614fec6158f1565b614ff461595c565b6150006149d98661523b565b90506000805b61500f836152aa565b15614af7578061503557615025614a46846152cb565b6001600160a01b03168452615123565b806001141561505d5761504a614a46846152cb565b6001600160a01b03166020850152615123565b806002141561507c57615072614a03846152cb565b6040850152615123565b806003141561509b57615091614a03846152cb565b6060850152615123565b80600414156150ba576150b0614a03846152cb565b6080850152615123565b80600514156150dc576150cf614a03846152cb565b60ff1660a0850152615123565b80600614156150fb576150f1614a03846152cb565b60c0850152615123565b8060071415614aea57615110614a03846152cb565b6001600160401b031660e0850152600191505b600101615006565b615133615869565b600061513d615869565b61514561595c565b6151516149d98661523b565b90506000805b615160836152aa565b15614af7578061518657615176614a46846152cb565b6001600160a01b03168452615233565b80600114156151ae5761519b614a46846152cb565b6001600160a01b03166020850152615233565b80600214156151cd576151c3614a03846152cb565b6040850152615233565b80600314156151ec576151e2614a03846152cb565b6060850152615233565b806004141561520b57615201614a03846152cb565b6080850152615233565b8060051415614aea57615220614a03846152cb565b6001600160401b031660a0850152600191505b600101615157565b61524361597c565b506040805180820190915281518152602082810190820152919050565b61526861595c565b61527182615699565b61527a57600080fd5b600061528983602001516156d3565b60208085015160408051808201909152868152920190820152915050919050565b60006152b461597c565b505080518051602091820151919092015191011190565b6152d361597c565b6152dc826152aa565b6152e557600080fd5b602082015160006152f582615736565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061532e57508151602110155b61533757600080fd5b600061534683602001516156d3565b905080836000015110156153a1576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a0e57506020919091036101000a90049392505050565b80516000906015146153df57600080fd5b6113eb82615319565b60608151600114801561541a5750607f60f81b8260008151811061540857fe5b01602001516001600160f81b03191611155b1561542657508061157f565b6113eb6154388351608060ff166155a1565b83615524565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615482575060186154a6565b6fffffffffffffffffffffffffffffffff1984166154a2575060106154a6565b5060005b60208110156154dc578181815181106154bb57fe5b01602001516001600160f81b031916156154d4576154dc565b6001016154a6565b60008160200390506060816040519080825280601f01601f191660200182016040528015615511576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561555557805183526020928301920161553d565b50855184518101855292509050808201602086015b8183101561558257805183526020928301920161556a565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106155f1576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161564b5782840160f81b8160008151811061562d57fe5b60200101906001600160f81b031916908160001a90535090506113eb565b60606156568561543e565b90508381510160370160f81b8260008151811061566f57fe5b60200101906001600160f81b031916908160001a9053506156908282615524565b95945050505050565b80516000906156aa5750600061157f565b6020820151805160001a9060c08210156156c95760009250505061157f565b5060019392505050565b8051600090811a60808110156156ed57600091505061157f565b60b8811080615708575060c08110801590615708575060f881105b1561571757600191505061157f565b60c081101561572b5760b51901905061157f565b60f51901905061157f565b80516000908190811a60808110156157515760019150615862565b60b881101561576657607e1981019150615862565b60c08110156157e057600060b78203600186019550806020036101000a8651049150600181018201935050808310156157da576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615862565b60f88110156157f55760be1981019150615862565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615860576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528061596f61597c565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a2646970667358221220ab8dfdd9914857b55fc1c6e49c911de2d861380dc81004c5ff0a4e67915545b764736f6c63430006040033", + }, + { + ContractAddr: TokenHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610996578063fd6a687914610ce6578063ff9c00271461068657610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a78abc1614610981578063a7c9f02d1461099657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad1461068657806371d30863146107dc57610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e74565b34801561062957600080fd5b506104a8610e79565b34801561063e57600080fd5b5061056b610e84565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104a8610ea5565b34801561069257600080fd5b5061059c610eae565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb3565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611388565b3480156107e857600080fd5b506104a861138e565b3480156107fd57600080fd5b5061056b611394565b34801561081257600080fd5b5061059c61139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061059c61156e565b34801561090057600080fd5b506104a8611573565b34801561091557600080fd5b506104a86004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b5061056b6116bd565b34801561096357600080fd5b5061056b6116c3565b34801561097857600080fd5b5061059c6116c9565b34801561098d57600080fd5b506107b36116ce565b3480156109a257600080fd5b5061059c6116d7565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dc565b3480156109fe57600080fd5b506103806116c9565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9d565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200c565b348015610b1757600080fd5b506104a8612082565b348015610b2c57600080fd5b506104a861208c565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612092565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b5061056b6120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b5061056b612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061059c61223b565b348015610c8057600080fd5b5061059c612240565b348015610c9557600080fd5b5061056b612245565b348015610caa57600080fd5b506104a861224b565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b5061056b612378565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b603881565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610ef9576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b868514610f375760405162461bcd60e51b815260040180806020018281038252603b81526020018061471b603b913960400191505060405180910390fd5b868314610f755760405162461bcd60e51b815260040180806020018281038252603f8152602001806145ee603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc15760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156110055760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611038578160200160208202803683370190505b50905060005b84811015611113576402540be4008b8b8381811061105857fe5b905060200201358161106657fe5b06156110a35760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6110c88b8b838181106110b257fe5b90506020020135856124a290919063ffffffff16565b93506110f46402540be4008c8c848181106110df57fe5b905060200201356124fc90919063ffffffff16565b82828151811061110057fe5b602090810291909101015260010161103e565b506001546111389061112b908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111765760405162461bcd60e51b81526004018080602001828103825260568152602001806147c86056913960600191505060405180910390fd5b611186348463ffffffff61259716565b9150611190614337565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611254846125d9565b611269876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c75781810151838201526020016112af565b50505050905090810190601f1680156112f45780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614451602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611722576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176e5760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156117b25760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b600080806001600160a01b038816611891576001546117d890879063ffffffff6124a216565b3410156118165760405162461bcd60e51b81526004018080602001828103825260618152602001806145686061913960800191505060405180910390fd5b6402540be40086061561185a5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b61186a348763ffffffff61259716565b9050611881866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b34565b6001600160a01b0388166000908152600360205260409020549250826118e85760405162461bcd60e51b81526004018080602001828103825260318152602001806145376031913960400191505060405180910390fd5b6001543410156119295760405162461bcd60e51b815260040180806020018281038252603f81526020018061468a603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197457506008811180156119745750611972876007198301600a0a63ffffffff6128f016565b155b6119af5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6119b98782612932565b92506119c484612972565b15611a0c576305f5e100831015611a0c5760405162461bcd60e51b815260040180806020018281038252603a815260200180614480603a913960400191505060405180910390fd5b600881101580611a265750600881108015611a2657508683115b611a615760405162461bcd60e51b81526004018080602001828103825260258152602001806145c96025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa85760405162461bcd60e51b81526004018080602001828103825260358152602001806145026035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3257600080fd5b505b611b3c614337565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bea57fe5b602002602001018181525050878160600151600081518110611c0857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3a57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c65846125d9565b611c7a866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd8578181015183820152602001611cc0565b50505050905090810190601f168015611d055780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611ddd5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146c9602e913960400191505060405180910390fd5b60208114611e32576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3a576020820151670de0b6b3a76400008111801590611ee157506402540be4008106155b611f32576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f77565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204c5760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b6060612388614383565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143b8565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146696021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143df565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b81526004018080602001828103825260248152602001806146f76024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600760ff82161015612a0057600092505050610e53565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e53565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e53565b5060019392505050565b612a80614337565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144ba6024913960400191505060405180910390fd5b612ad36143df565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613baf565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e614383565b6000612b88614383565b612b90614416565b612ba1612b9c86613be8565b613c0d565b90506000805b612bb083613c57565b15612ca85780612bd257612bcb612bc684613c78565b613cc6565b8452612ca0565b8060011415612bff57612bec612be784613c78565b613d7d565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c78565b6040850152612ca0565b8060031415612c4657612c33612be784613c78565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c78565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c78565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e53565b8160400151471015612cfc57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0a57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2781613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613d97565b613e7d565b60408051600560a21b8318601482015260348101909152606090610e2781613e7d565b60608151600014156132315750604080516000815260208101909152610e53565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ecf565b9150600101613251565b50610e27613294825160c060ff16613f4c565b82613ecf565b6132a26143df565b60006132ac6143df565b6132b4614416565b6132c0612b9c86613be8565b90506000805b6132cf83613c57565b15612ca857806132f5576132e5612be784613c78565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c78565b614044565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cc6565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c78565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d7d565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c78565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b613953614337565b600061395d614337565b613965614416565b613971612b9c86613be8565b90506000805b61398083613c57565b15612ca8578061399d57613996612bc684613c78565b8452613ba7565b80600114156139c5576139b2612be784613c78565b6001600160a01b03166020850152613ba7565b8060021415613a545760606139dc61330c85613c78565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613ba7565b8060031415613ae9576060613a6b61330c85613c78565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c78565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415612c9b57613b93612bc684613c78565b67ffffffffffffffff1660a0850152600191505b600101613977565b60006008821115613bd157612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613bf0614436565b506040805180820190915281518152602082810190820152919050565b613c15614416565b613c1e82614115565b613c2757600080fd5b6000613c368360200151614145565b60208085015160408051808201909152868152920190820152915050919050565b6000613c61614436565b505080518051602091820151919092015191011190565b613c80614436565b613c8982613c57565b613c9257600080fd5b60208201516000613ca2826141a8565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cdb57508151602110155b613ce457600080fd5b6000613cf38360200151614145565b90508083600001511015613d4e576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d7457826020036101000a820491505b50949350505050565b8051600090601514613d8e57600080fd5b6116b782613cc6565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613ddb57506018613dff565b6fffffffffffffffffffffffffffffffff198416613dfb57506010613dff565b5060005b6020811015613e3557818181518110613e1457fe5b01602001516001600160f81b03191615613e2d57613e35565b600101613dff565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e6a576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613eaf5750607f60f81b82600081518110613e9d57fe5b01602001516001600160f81b03191611155b15613ebb575080610e53565b6116b7613ecd8351608060ff16613f4c565b835b6060806040519050835180825260208201818101602087015b81831015613f00578051835260209283019201613ee8565b50855184518101855292509050808201602086015b81831015613f2d578051835260209283019201613f15565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613f9c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ff65782840160f81b81600081518110613fd857fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061400185613d97565b90508381510160370160f81b8260008151811061401a57fe5b60200101906001600160f81b031916908160001a90535061403b8282613ecf565b95945050505050565b606061404f82614115565b61405857600080fd5b6000614063836142db565b90506060816040519080825280602002602001820160405280156140a157816020015b61408e614436565b8152602001906001900390816140865790505b50905060006140b38560200151614145565b60208601510190506000805b8481101561410a576140d0836141a8565b91506040518060400160405280838152602001848152508482815181106140f357fe5b6020908102919091010152918101916001016140bf565b509195945050505050565b805160009061412657506000610e53565b6020820151805160001a9060c0821015612a6e57600092505050610e53565b8051600090811a608081101561415f576000915050610e53565b60b881108061417a575060c0811080159061417a575060f881105b15614189576001915050610e53565b60c081101561419d5760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141c357600191506142d4565b60b88110156141d857607e19810191506142d4565b60c081101561425257600060b78203600186019550806020036101000a86510491506001810182019350508083101561424c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142d4565b60f88110156142675760be19810191506142d4565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142d2576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906142ec57506000610e53565b600080905060006143008460200151614145565b602085015185519181019250015b8082101561432e5761431f826141a8565b6001909301929091019061430e565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614429614436565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220c72f4ad63f8f84b0b15ae9d71fffb0d09b3b3b97a728e64b385305ecb6431b0e64736f6c63430006040033", + }, + { + ContractAddr: RelayerIncentivizeContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "6080604052600436106102815760003560e01c8063930e1b091161014f578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107b5578063e89a3020146107e8578063f9a2bbc714610812578063fc3e590814610827578063fd6a68791461083c578063fdd31fcd1461085157610288565b8063bd4cc83014610722578063c81b16621461074c578063d0ab528a14610761578063dc927faf14610776578063dcae76ab1461078b578063e1c7392a146107a057610288565b8063a78abc1611610113578063a78abc16146105d3578063a7c6a59d146105e8578063ab51bb96146105fd578063ac43175114610612578063ace9fcc2146106e3578063af400681146106f857610288565b8063930e1b091461054c57806396713da91461057f5780639dc0926214610594578063a1a11bf5146105a9578063a3c3c0ad146105be57610288565b806343756e5c116101f35780636f93d2e6116101ac5780636f93d2e61461048457806370fd5bad146104e357806374f2272d146104f857806375d47a0a1461050d5780637942fd05146105225780637e146cc51461053757610288565b806343756e5c146103ef578063493279b1146104045780634bf6c8821461043057806351e8067214610445578063541333071461045a5780636e47b4821461046f57610288565b806312950c461161024557806312950c46146103215780631b20087c146103365780631c6433121461034b5780633a9756121461028d5780633dffc3871461039157806340bb43c0146103bc57610288565b8063081e9d131461028d57806308f2ec06146102b4578063093f2fc4146102c95780630bee7a67146102de57806310e06a761461030c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610884565b60408051918252519081900360200190f35b3480156102c057600080fd5b506102a2610889565b3480156102d557600080fd5b506102a261088e565b3480156102ea57600080fd5b506102f3610893565b6040805163ffffffff9092168252519081900360200190f35b34801561031857600080fd5b506102a2610898565b34801561032d57600080fd5b506102a261089e565b34801561034257600080fd5b506102a26108a4565b34801561035757600080fd5b506103756004803603602081101561036e57600080fd5b50356108aa565b604080516001600160a01b039092168252519081900360200190f35b34801561039d57600080fd5b506103a6610884565b6040805160ff9092168252519081900360200190f35b3480156103c857600080fd5b506102a2600480360360208110156103df57600080fd5b50356001600160a01b03166108d1565b3480156103fb57600080fd5b506103756108e3565b34801561041057600080fd5b506104196108e9565b6040805161ffff9092168252519081900360200190f35b34801561043c57600080fd5b506103a66108ee565b34801561045157600080fd5b506103756108f3565b34801561046657600080fd5b506102a2610893565b34801561047b57600080fd5b506103756108f9565b34801561049057600080fd5b506104cf600480360360808110156104a757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108ff565b604080519115158252519081900360200190f35b3480156104ef57600080fd5b506103a6610d91565b34801561050457600080fd5b506102a2610d96565b34801561051957600080fd5b50610375610d9c565b34801561052e57600080fd5b506103a6610da2565b34801561054357600080fd5b506102a2610da7565b34801561055857600080fd5b506102a26004803603602081101561056f57600080fd5b50356001600160a01b0316610dac565b34801561058b57600080fd5b506103a6610dbe565b3480156105a057600080fd5b50610375610dc3565b3480156105b557600080fd5b50610375610dc9565b3480156105ca57600080fd5b506102a2610dcf565b3480156105df57600080fd5b506104cf610dd5565b3480156105f457600080fd5b506102a2610dde565b34801561060957600080fd5b506102f3610de4565b34801561061e57600080fd5b506106e16004803603604081101561063557600080fd5b81019060208101813564010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9193909290916020810190356401000000008111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460018302840111640100000000831117156106d657600080fd5b509092509050610de9565b005b3480156106ef57600080fd5b506102a2611537565b34801561070457600080fd5b506102a26004803603602081101561071b57600080fd5b503561153d565b34801561072e57600080fd5b506102a26004803603602081101561074557600080fd5b5035611598565b34801561075857600080fd5b506103756115b1565b34801561076d57600080fd5b506102a26115b7565b34801561078257600080fd5b506103756115bd565b34801561079757600080fd5b506102a26115c3565b3480156107ac57600080fd5b506106e16115c9565b3480156107c157600080fd5b506106e1600480360360208110156107d857600080fd5b50356001600160a01b0316611692565b3480156107f457600080fd5b506103756004803603602081101561080b57600080fd5b50356117eb565b34801561081e57600080fd5b506103756117f8565b34801561083357600080fd5b506103a66117fe565b34801561084857600080fd5b50610375611803565b34801561085d57600080fd5b506102a26004803603602081101561087457600080fd5b50356001600160a01b0316611809565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b600681815481106108b757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b603881565b600881565b61200081565b61100581565b6000805460ff16610957576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109975760405162461bcd60e51b815260040180806020018281038252602f815260200180612377602f913960400191505060405180910390fd5b60008215610a4a576110026001600160a01b0316639a99b4f06110056109c8600e548861181b90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a1757600080fd5b505af1158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b50519050610b59565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a9457600080fd5b505af1158015610aa8573d6000803e3d6000fd5b505050506040513d6020811015610abe57600080fd5b5051600e5490915015610b5957600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b569161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b5051829063ffffffff61181b16565b90505b600c805460010190556000610b6d8261187e565b600954909150610b83908263ffffffff61181b16565b600955600a54610bab908290610b9f908563ffffffff61181b16565b9063ffffffff6118a716565b600a556001600160a01b038716600090815260056020526040902054610c1757600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610c9557600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610d8457600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d0f6118e9565b90506000610d1b611bcd565b6001600160a01b0389166000908152600d6020526040902054909150610d59908290610d4d908563ffffffff61181b16565b9063ffffffff61181b16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e295760405162461bcd60e51b815260040180806020018281038252602e8152602001806122bc602e913960400191505060405180910390fd5b60005460ff16610e6a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ea6021913960400191505060405180910390fd5b610ede84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611e4b9050565b15610fab5760208114610f225760405162461bcd60e51b81526004018080602001828103825260328152602001806123a66032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610f6091858580838501838280828437600092019190915250611f3292505050565b9050600254811115610fa35760405162461bcd60e51b81526004018080602001828103825260608152602001806121956060913960600191505060405180910390fd5b6001556114a5565b61100484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051606081019091526022808252909250905061229a6020830139611e4b565b156110dc57602081146110485760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161108691858580838501838280828437600092019190915250611f3292505050565b9050801580159061109957506001548110155b6110d45760405162461bcd60e51b815260040180806020018281038252606c81526020018061230b606c913960800191505060405180910390fd5b6002556114a5565b61115084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611e4b9050565b1561121d57602081146111945760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111d291858580838501838280828437600092019190915250611f3292505050565b90506004548111156112155760405162461bcd60e51b81526004018080602001828103825260568152602001806121f56056913960600191505060405180910390fd5b6003556114a5565b61129184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611e4b9050565b1561136957602081146112d55760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161131391858580838501838280828437600092019190915250611f3292505050565b9050801580159061132657506003548110155b6113615760405162461bcd60e51b81526004018080602001828103825260618152602001806121066061913960800191505060405180910390fd5b6004556114a5565b6113dd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611e4b9050565b1561146857602081146114215760405162461bcd60e51b815260040180806020018281038252602e815260200180612167602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161145f91858580838501838280828437600092019190915250611f3292505050565b600e55506114a5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161154e575080611593565b81602810801561155f575060508211155b1561156c57506028611593565b60508211801561157d5750606e8211155b1561158d57506078819003611593565b50600481045b919050565b6000602882116115a9575080611593565b506028611593565b61100281565b600e5481565b61100381565b60095481565b60005460ff1615611621576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561166f576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806116f1576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117a15760405161100290819084156108fc029085906000818181858888f1935050505015801561175b573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506117e8565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108b757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611875576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061187860025461189b60015485611f3790919063ffffffff16565b9063ffffffff611f9016565b600061187583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fd2565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561194557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611927575b5050505050905060608151604051908082528060200260200182016040528015611979578160200160208202803683370190505b50905060005b8251811015611a0657600083828151811061199657fe5b6020026020010151905060006119d060056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611598565b9050808484815181106119df57fe5b60209081029190910101526119fa868263ffffffff61181b16565b9550505060010161197f565b506000611a2460045461189b60035488611f3790919063ffffffff16565b9050611a36858263ffffffff6118a716565b94508460015b8451811015611b0d576000611a718761189b8a888681518110611a5b57fe5b6020026020010151611f3790919063ffffffff16565b9050611abe81600d6000898681518110611a8757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461181b90919063ffffffff16565b600d6000888581518110611ace57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b02838263ffffffff6118a716565b925050600101611a3c565b50611b2381600d600087600081518110611a8757fe5b600d600086600081518110611b3457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611bb55760056000868381518110611b8757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611b6e565b50611bc2600660006120ce565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c2957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0b575b5050505050905060608151604051908082528060200260200182016040528015611c5d578160200160208202803683370190505b50905060005b8251811015611cdc576000838281518110611c7a57fe5b602002602001015190506000611cb460076000846001600160a01b03166001600160a01b031681526020019081526020016000205461153d565b905080848481518110611cc357fe5b6020908102919091010152949094019350600101611c63565b506000611cfa60045461189b60035488611f3790919063ffffffff16565b9050611d0c858263ffffffff6118a716565b94508460015b8451811015611d96576000611d318761189b8a888681518110611a5b57fe5b9050611d4781600d6000898681518110611a8757fe5b600d6000888581518110611d5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611d8b838263ffffffff6118a716565b925050600101611d12565b50611dac81600d600087600081518110611a8757fe5b600d600086600081518110611dbd57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e3e5760076000868381518110611e1057fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611df7565b50611bc2600860006120ce565b6000816040516020018082805190602001908083835b60208310611e805780518252601f199092019160209182019101611e61565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611eee5780518252601f199092019160209182019101611ecf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611f4657506000611878565b82820282848281611f5357fe5b04146118755760405162461bcd60e51b81526004018080602001828103825260218152602001806122796021913960400191505060405180910390fd5b600061187583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612069565b600081848411156120615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561202657818101518382015260200161200e565b50505050905090810190601f1680156120535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561202657818101518382015260200161200e565b5060008385816120c457fe5b0495945050505050565b50805460008255906000526020600020908101906117e89190611bca91905b8082111561210157600081556001016120ed565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220ed761a0a8bb4eac3f5f94897efb6059f8cb261a19ed73bef336cbc05af2a532064736f6c63430006040033", + }, + }, + } + + mirrorUpgrade[chapelNet] = &Upgrade{ + UpgradeName: "mirror", + Configs: []*UpgradeConfig{ + { + ContractAddr: TokenManagerContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "6080604052600436106103815760003560e01c80637d078e13116101d1578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d38578063fc3e5908146105b2578063fd6a687914610d4d578063fe3a2af514610d6257610381565b8063d9e6dae9146106fc578063dc927faf14610cf9578063e605bca014610d0e578063f9a2bbc714610d2357610381565b8063c8509d81116100dc578063c8509d8114610bdf578063c8e704a4146105b2578063d117a11014610c64578063d7109ce614610ce457610381565b8063b79503171461073b578063bd32d3f9146104d9578063c81b166214610bca57610381565b80639a854bbd1161016f578063a78abc1611610149578063a78abc1614610ad5578063ab51bb9614610aea578063ab67a4851461073b578063ac43175114610aff57610381565b80639a854bbd14610a965780639dc0926214610aab578063a1a11bf514610ac057610381565b8063859180fb116101ab578063859180fb146106e757806394553a4e14610a3757806395b9ad2614610a6c57806396713da914610a8157610381565b80637d078e13146104ee5780637ec816dd1461099b578063831d65d1146109b057610381565b8063493279b1116102b657806366dea52a1161025457806372c4e0861161022357806372c4e0861461081957806375d47a0a146108bd57806377d9dae8146108d25780637942fd051461098657610381565b806366dea52a1461073b5780636b3f1307146107505780636e47b4821461080457806370fd5bad1461073b57610381565b806351e806721161029057806351e80672146107115780635d499b1b146107265780635f558f861461073b57806361368475146106fc57610381565b8063493279b1146106bb5780634bc81c00146106e75780634bf6c882146106fc57610381565b80632e02d77611610323578063401809f9116102fd578063401809f9146105b257806343756e5c146105c7578063445fcefe146105f8578063487c88ac146104ee57610381565b80632e02d7761461054c57806337e6ecda1461057f5780633dffc387146104ee57610381565b80631f91600b1161035f5780631f91600b146104d957806323996b53146104ee57806325c751b7146105035780632d89ac32146104ee57610381565b80630bee7a67146103865780630f212b1b146103b45780631182b875146103df575b600080fd5b34801561039257600080fd5b5061039b610d77565b6040805163ffffffff9092168252519081900360200190f35b3480156103c057600080fd5b506103c9610d7c565b6040805160ff9092168252519081900360200190f35b3480156103eb57600080fd5b506104646004803603604081101561040257600080fd5b60ff8235169190810190604081016020820135600160201b81111561042657600080fd5b82018360208201111561043857600080fd5b803590602001918460018302840111600160201b8311171561045957600080fd5b509092509050610d81565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e557600080fd5b506103c9610e9b565b3480156104fa57600080fd5b506103c9610ea0565b6105386004803603604081101561051957600080fd5b5080356001600160a01b031690602001356001600160401b0316610ea5565b604080519115158252519081900360200190f35b34801561055857600080fd5b506105386004803603602081101561056f57600080fd5b50356001600160a01b03166113f1565b34801561058b57600080fd5b50610538600480360360208110156105a257600080fd5b50356001600160a01b0316611406565b3480156105be57600080fd5b506103c961141b565b3480156105d357600080fd5b506105dc611420565b604080516001600160a01b039092168252519081900360200190f35b34801561060457600080fd5b506106a96004803603602081101561061b57600080fd5b810190602081018135600160201b81111561063557600080fd5b82018360208201111561064757600080fd5b803590602001918460018302840111600160201b8311171561066857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611426945050505050565b60408051918252519081900360200190f35b3480156106c757600080fd5b506106d0611584565b6040805161ffff9092168252519081900360200190f35b3480156106f357600080fd5b506103c9611589565b34801561070857600080fd5b506103c961158e565b34801561071d57600080fd5b506105dc611593565b34801561073257600080fd5b506106a9611599565b34801561074757600080fd5b506103c96115a2565b6105386004803603604081101561076657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111600160201b831117156107c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115a7945050505050565b34801561081057600080fd5b506105dc611e7d565b6105386004803603602081101561082f57600080fd5b810190602081018135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e83945050505050565b3480156108c957600080fd5b506105dc6122cf565b610538600480360360408110156108e857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460018302840111600160201b8311171561094557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122d5945050505050565b34801561099257600080fd5b506103c96127db565b3480156109a757600080fd5b506106a96127e0565b3480156109bc57600080fd5b50610a35600480360360408110156109d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156109f757600080fd5b820183602082011115610a0957600080fd5b803590602001918460018302840111600160201b83111715610a2a57600080fd5b5090925090506127e6565b005b61053860048036036040811015610a4d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612935565b348015610a7857600080fd5b506103c961332c565b348015610a8d57600080fd5b506103c9613331565b348015610aa257600080fd5b506106a9613336565b348015610ab757600080fd5b506105dc613342565b348015610acc57600080fd5b506105dc613348565b348015610ae157600080fd5b5061053861334e565b348015610af657600080fd5b5061039b613357565b348015610b0b57600080fd5b50610a3560048036036040811015610b2257600080fd5b810190602081018135600160201b811115610b3c57600080fd5b820183602082011115610b4e57600080fd5b803590602001918460018302840111600160201b83111715610b6f57600080fd5b919390929091602081019035600160201b811115610b8c57600080fd5b820183602082011115610b9e57600080fd5b803590602001918460018302840111600160201b83111715610bbf57600080fd5b50909250905061335c565b348015610bd657600080fd5b506105dc613631565b348015610beb57600080fd5b50610a3560048036036040811015610c0257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c2657600080fd5b820183602082011115610c3857600080fd5b803590602001918460018302840111600160201b83111715610c5957600080fd5b509092509050613637565b348015610c7057600080fd5b50610c8e60048036036020811015610c8757600080fd5b503561370d565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610cf057600080fd5b506106a9613764565b348015610d0557600080fd5b506105dc613769565b348015610d1a57600080fd5b506106a961376f565b348015610d2f57600080fd5b506105dc613775565b348015610d4457600080fd5b506106a961377b565b348015610d5957600080fd5b506105dc613781565b348015610d6e57600080fd5b506103c9613357565b606481565b600681565b60603361200014610dc35760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff841660011415610e1557610e0e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061378792505050565b9050610e94565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b5051905080610f5e576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16610fc1576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b505190506402540be4003406158015611053575060055461104f908263ffffffff613a1716565b3410155b61108e5760405162461bcd60e51b8152600401808060200182810382526046815260200180615b156046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110b85750426201518001846001600160401b031611155b6110f35760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d602081101561115857600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111a057600080fd5b505afa1580156111b4573d6000803e3d6000fd5b505050506040513d60208110156111ca57600080fd5b50519050677ce66c50e28400006111e48360ff8416613a71565b1115611230576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061124c90349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015611274573d6000803e3d6000fd5b5061127d615869565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016112cc6402540be400600554613b4290919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d760056112f384613b84565b61131d6402540be40061131160055434613b0090919063ffffffff16565b9063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137b578181015183820152602001611363565b50505050905090810190601f1680156113a85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061143661589e565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906114bd5760009250505061157f565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561151b57600080fd5b505afa15801561152f573d6000803e3d6000fd5b505050506040513d602081101561154557600080fd5b5051608083015160608401519192506000916115669163ffffffff613b0016565b9050611578818363ffffffff613b0016565b9450505050505b919050565b606181565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156115ff5760405162461bcd60e51b815260040180806020018281038252602b815260200180615bb8602b913960400191505060405180910390fd5b600061160a83613cb9565b905061161461589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526116d9576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b60006116f682608001518360600151613b0090919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461174c5760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561178f57600080fd5b505afa1580156117a3573d6000803e3d6000fd5b505050506040513d60208110156117b957600080fd5b50516001600160a01b0316146118005760405162461bcd60e51b815260040180806020018281038252602e8152602001806159e4602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561184c57600080fd5b505afa158015611860573d6000803e3d6000fd5b505050506040513d602081101561187657600080fd5b505160408051636eb1769f60e11b8152336004820152306024820152905191925083916119079184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d60208110156118f957600080fd5b50519063ffffffff613a1716565b101561195a576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561199c57600080fd5b505afa1580156119b0573d6000803e3d6000fd5b505050506040513d60208110156119c657600080fd5b505190508082108015906119df57506402540be4008206155b611a1a5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b6000611a26868b613cc0565b905063ffffffff8116611c25576001600160a01b038a166323b872dd33611004611a56898963ffffffff613b0016565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611abe57600080fd5b505af1158015611ad2573d6000803e3d6000fd5b505050506040513d6020811015611ae857600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b5157600080fd5b505af1158015611b65573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611be4578181015183820152602001611bcc565b50505050905090810190601f168015611c115780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611cdd565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ca1578181015183820152602001611c89565b50505050905090810190601f168015611cce5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d376158da565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611d7f573d6000803e3d6000fd5b5061200063f7a251d76001611d938461411a565b611da8886402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e06578181015183820152602001611dee565b50505050905090810190601f168015611e335780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5457600080fd5b505af1158015611e68573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b600080611e8f83613cb9565b9050611e9961589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611f5e576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b031610611fbf576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561200157600080fd5b505afa158015612015573d6000803e3d6000fd5b505050506040513d602081101561202b57600080fd5b5051905080821080159061204457506402540be4008206155b61207f5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556120d96158da565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561211c573d6000803e3d6000fd5b5061200063f7a251d760016121308461411a565b612145876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121a357818101518382015260200161218b565b50505050905090810190601f1680156121d05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156121f157600080fd5b505af1158015612205573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561228757818101518382015260200161226f565b50505050905090810190601f1680156122b45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806122e183613cb9565b90506122eb61589e565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123b0576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124045760405162461bcd60e51b8152600401808060200182810382526045815260200180615a816045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b50516001600160a01b0316146124ce576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561251057600080fd5b505afa158015612524573d6000803e3d6000fd5b505050506040513d602081101561253a57600080fd5b5051905080821080159061255357506402540be4008206155b61258e5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4a6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556125e86158da565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561262b573d6000803e3d6000fd5b5061200063f7a251d7600161263f8461411a565b612654876402540be40063ffffffff613b4216565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126b257818101518382015260200161269a565b50505050905090810190601f1680156126df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561279257818101518382015260200161277a565b50505050905090810190601f1680156127bf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128265760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156128765761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419092505050565b612930565b60ff8316600514156128c15761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061443d92505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561298257600080fd5b505afa158015612996573d6000803e3d6000fd5b505050506040513d60208110156129ac57600080fd5b5051146129f0576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a4f576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b505190506402540be4003406158015612ae15750600454612add908263ffffffff613a1716565b3410155b612b1c5760405162461bcd60e51b815260040180806020018281038252604d815260200180615997604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b465750426201518001836001600160401b031611155b612b815760405162461bcd60e51b8152600401808060200182810382526038815260200180615a126038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bbc57600080fd5b505afa158015612bd0573d6000803e3d6000fd5b505050506040513d6020811015612be657600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c2e57600080fd5b505afa158015612c42573d6000803e3d6000fd5b505050506040513d6020811015612c5857600080fd5b50519050677ce66c50e2840000612c728260ff8516613a71565b1115612cbe576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612cf957600080fd5b505afa158015612d0d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d3657600080fd5b8101908080516040519392919084600160201b821115612d5557600080fd5b908301906020820185811115612d6a57600080fd5b8251600160201b811182820188101715612d8357600080fd5b82525081516020918201929091019080838360005b83811015612db0578181015183820152602001612d98565b50505050905090810190601f168015612ddd5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612dff57506020815111155b612e50576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612e8b57600080fd5b505afa158015612e9f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612ec857600080fd5b8101908080516040519392919084600160201b821115612ee757600080fd5b908301906020820185811115612efc57600080fd5b8251600160201b811182820188101715612f1557600080fd5b82525081516020918201929091019080838360005b83811015612f42578181015183820152602001612f2a565b50505050905090810190601f168015612f6f5780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612f8f57508051600810155b612fe0576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561313457604160f81b828260ff168151811061300357fe5b01602001516001600160f81b031916108015906130415750602d60f91b828260ff168151811061302f57fe5b01602001516001600160f81b03191611155b806130995750606160f81b828260ff168151811061305b57fe5b01602001516001600160f81b031916108015906130995750603d60f91b828260ff168151811061308757fe5b01602001516001600160f81b03191611155b806130f15750600360fc1b828260ff16815181106130b357fe5b01602001516001600160f81b031916108015906130f15750603960f81b828260ff16815181106130df57fe5b01602001516001600160f81b03191611155b61312c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615ac6602e913960400191505060405180910390fd5b600101612fe3565b50600454611004906108fc9061315190349063ffffffff613b0016565b6040518115909202916000818181858888f19350505050158015613179573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131b06158f1565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff16815260200161320f6402540be400600454613b4290919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461323684614608565b6132546402540be40061131160045434613b0090919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132b257818101518382015260200161329a565b50505050905090810190601f1680156132df5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561330057600080fd5b505af1158015613314573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b336110071461339c5760405162461bcd60e51b815260040180806020018281038252602e815260200180615b5b602e913960400191505060405180910390fd5b602081146133f1576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156134e65760208201516402540be4008106156134de576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b60045561359c565b6673796e6346656560c81b81141561355f5760208201516402540be400810615613557576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b60055561359c565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136775760405162461bcd60e51b815260040180806020018281038252602f815260200180615b89602f913960400191505060405180910390fd5b60ff8316600414156136c25761287182828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061477a92505050565b60ff8316600514156128c15761287182828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148b992505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b606061379161589e565b600061379c846149b3565b91509150806137f2576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138a5576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b03909216919091021790556139fc565b815160ff16600114156139af5760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156138fe57600080fd5b505afa158015613912573d6000803e3d6000fd5b505050506040513d602081101561392857600080fd5b505190506001600160a01b038116156139a95760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561399057600080fd5b505af11580156139a4573d6000803e3d6000fd5b505050505b506139fc565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610e94576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613ae957604d60071983011115613acb576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613ae2836007198401600a0a63ffffffff613b4216565b90506113eb565b610e94836008849003600a0a63ffffffff614b0416565b6000610e9483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614b5d565b6000610e9483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614bf4565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613b9f5750508351909150613bca906001600160a01b0316614c59565b81600081518110613bd757fe5b6020026020010181905250613bf883602001516001600160a01b0316614c59565b81600181518110613c0557fe5b6020026020010181905250613c20836040015160001c614c7c565b81600281518110613c2d57fe5b6020026020010181905250613c458360600151614c7c565b81600381518110613c5257fe5b6020026020010181905250613c6a8360800151614c7c565b81600481518110613c7757fe5b6020026020010181905250613c988360a001516001600160401b0316614c7c565b81600581518110613ca557fe5b6020026020010181905250610e9481614c8f565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613cfc57600080fd5b505afa158015613d10573d6000803e3d6000fd5b505050506040513d6020811015613d2657600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613d7257600080fd5b505afa158015613d86573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613daf57600080fd5b8101908080516040519392919084600160201b821115613dce57600080fd5b908301906020820185811115613de357600080fd5b8251600160201b811182820188101715613dfc57600080fd5b82525081516020918201929091019080838360005b83811015613e29578181015183820152602001613e11565b50505050905090810190601f168015613e565780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ea657600080fd5b505afa158015613eba573d6000803e3d6000fd5b505050506040513d6020811015613ed057600080fd5b505160808701516060880151919250600091613ef19163ffffffff613b0016565b9050428760c001516001600160401b03161015613f165750600193506113eb92505050565b613f24838860200151614d19565b613f365750600293506113eb92505050565b80821115613f4c5750600393506113eb92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8e57600080fd5b505afa158015613fa2573d6000803e3d6000fd5b505050506040513d6020811015613fb857600080fd5b505114613fcd5750600493506113eb92505050565b8660a0015160ff168414613fe95750600593506113eb92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561402e57600080fd5b505afa158015614042573d6000803e3d6000fd5b505050506040513d602081101561405857600080fd5b50516001600160a01b03161415806140fa57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156140cb57600080fd5b505afa1580156140df573d6000803e3d6000fd5b505050506040513d60208110156140f557600080fd5b505114155b1561410d5750600693506113eb92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081614133575050835190915061415b9063ffffffff16614c7c565b8160008151811061416857fe5b6020026020010181905250614183836020015160001c614c7c565b81600181518110613ca557fe5b614198615869565b60006141a383614e01565b91509150806141f0576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166143515760808201516040516110049180156108fc02916000818181858888f19350505050158015614253573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b1580156142cd57600080fd5b505af11580156142e1573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061443a565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143a5576040519150601f19603f3d011682016040523d82523d6000602084013e6143aa565b606091505b50509050806143e75760808301516040516110029180156108fc02916000818181858888f193505050501580156143e5573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614445615935565b600061445083614f0e565b915091508061449d576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff1661451d5760408083015190516110049180156108fc02916000818181858888f193505050501580156144db573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061443a565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d80600081146145c0576040519150601f19603f3d011682016040523d82523d6000602084013e6145c5565b606091505b50509050806146025760408084015190516110029180156108fc02916000818181858888f19350505050158015614600573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b6060815260200190600190039081614624575050835190915061464f906001600160a01b0316614c59565b8160008151811061465c57fe5b602002602001018190525061467d83602001516001600160a01b0316614c59565b8160018151811061468a57fe5b60200260200101819052506146a5836040015160001c614c7c565b816002815181106146b257fe5b60200260200101819052506146cd836060015160001c614c7c565b816003815181106146da57fe5b60200260200101819052506146f28360800151614c7c565b816004815181106146ff57fe5b602002602001018190525061471a8360a0015160ff16614c7c565b8160058151811061472757fe5b602002602001018190525061473f8360c00151614c7c565b8160068151811061474c57fe5b602002602001018190525061476d8360e001516001600160401b0316614c7c565b81600781518110613ca557fe5b6147826158f1565b600061478d83614fda565b91509150806147da576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614824906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614861576040519150601f19603f3d011682016040523d82523d6000602084013e614866565b606091505b50509050806146025760c0830151611002906108fc90614891906402540be40063ffffffff614b0416565b6040518115909202916000818181858888f19350505050158015614600573d6000803e3d6000fd5b6148c1615869565b60006148cc8361512b565b9150915080614919576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614946906402540be40063ffffffff614b0416565b6040516000818181858888f193505050503d8060008114614983576040519150601f19603f3d011682016040523d82523d6000602084013e614988565b606091505b5050905080614602576080830151611002906108fc90614891906402540be40063ffffffff614b0416565b6149bb61589e565b60006149c561589e565b6149cd61595c565b6149de6149d98661523b565b615260565b90506000805b6149ed836152aa565b15614af75780614a1257614a08614a03846152cb565b615319565b60ff168452614aef565b8060011415614a3157614a27614a03846152cb565b6020850152614aef565b8060021415614a5e57614a4b614a46846152cb565b6153ce565b6001600160a01b03166040850152614aef565b8060031415614a7d57614a73614a03846152cb565b6060850152614aef565b8060041415614a9c57614a92614a03846152cb565b6080850152614aef565b8060051415614abe57614ab1614a03846152cb565b60ff1660a0850152614aef565b8060061415614aea57614ad3614a03846152cb565b6001600160401b031660c085015260019150614aef565b614af7565b6001016149e4565b5091935090915050915091565b600082614b13575060006113eb565b82820282848281614b2057fe5b0414610e945760405162461bcd60e51b8152600401808060200182810382526021815260200180615af46021913960400191505060405180910390fd5b60008184841115614bec5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bb1578181015183820152602001614b99565b50505050905090810190601f168015614bde5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c435760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bb1578181015183820152602001614b99565b506000838581614c4f57fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610e94816153e8565b60606113eb614c8a8361543e565b6153e8565b6060815160001415614cb0575060408051600081526020810190915261157f565b606082600081518110614cbf57fe5b602002602001015190506000600190505b8351811015614d0057614cf682858381518110614ce957fe5b6020026020010151615524565b9150600101614cd0565b50610e94614d13825160c060ff166155a1565b82615524565b8151600090839060081080614d2f575080516002115b15614d3e5760009150506113eb565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614d7257fe5b6020910101516001600160f81b031916602d60f81b14614d97576000925050506113eb565b600160005b8351811015614df757828181518110614db157fe5b602001015160f81c60f81b6001600160f81b031916848281518110614dd257fe5b01602001516001600160f81b03191614614def5760009150614df7565b600101614d9c565b5095945050505050565b614e09615869565b6000614e13615869565b614e1b61595c565b614e276149d98661523b565b90506000805b614e36836152aa565b15614af75780614e5c57614e4c614a46846152cb565b6001600160a01b03168452614f06565b8060011415614e8457614e71614a46846152cb565b6001600160a01b03166020850152614f06565b8060021415614ea657614e99614a03846152cb565b60ff166040850152614f06565b8060031415614ec557614ebb614a03846152cb565b6060850152614f06565b8060041415614ee457614eda614a03846152cb565b6080850152614f06565b8060051415614aea57614ef9614a03846152cb565b60ff1660a0850152600191505b600101614e2d565b614f16615935565b6000614f20615935565b614f2861595c565b614f346149d98661523b565b90506000805b614f43836152aa565b15614af75780614f6957614f59614a46846152cb565b6001600160a01b03168452614fd2565b8060011415614f9157614f7e614a46846152cb565b6001600160a01b03166020850152614fd2565b8060021415614fb057614fa6614a03846152cb565b6040850152614fd2565b8060031415614aea57614fc5614a03846152cb565b60ff166060850152600191505b600101614f3a565b614fe26158f1565b6000614fec6158f1565b614ff461595c565b6150006149d98661523b565b90506000805b61500f836152aa565b15614af7578061503557615025614a46846152cb565b6001600160a01b03168452615123565b806001141561505d5761504a614a46846152cb565b6001600160a01b03166020850152615123565b806002141561507c57615072614a03846152cb565b6040850152615123565b806003141561509b57615091614a03846152cb565b6060850152615123565b80600414156150ba576150b0614a03846152cb565b6080850152615123565b80600514156150dc576150cf614a03846152cb565b60ff1660a0850152615123565b80600614156150fb576150f1614a03846152cb565b60c0850152615123565b8060071415614aea57615110614a03846152cb565b6001600160401b031660e0850152600191505b600101615006565b615133615869565b600061513d615869565b61514561595c565b6151516149d98661523b565b90506000805b615160836152aa565b15614af7578061518657615176614a46846152cb565b6001600160a01b03168452615233565b80600114156151ae5761519b614a46846152cb565b6001600160a01b03166020850152615233565b80600214156151cd576151c3614a03846152cb565b6040850152615233565b80600314156151ec576151e2614a03846152cb565b6060850152615233565b806004141561520b57615201614a03846152cb565b6080850152615233565b8060051415614aea57615220614a03846152cb565b6001600160401b031660a0850152600191505b600101615157565b61524361597c565b506040805180820190915281518152602082810190820152919050565b61526861595c565b61527182615699565b61527a57600080fd5b600061528983602001516156d3565b60208085015160408051808201909152868152920190820152915050919050565b60006152b461597c565b505080518051602091820151919092015191011190565b6152d361597c565b6152dc826152aa565b6152e557600080fd5b602082015160006152f582615736565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061532e57508151602110155b61533757600080fd5b600061534683602001516156d3565b905080836000015110156153a1576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a0e57506020919091036101000a90049392505050565b80516000906015146153df57600080fd5b6113eb82615319565b60608151600114801561541a5750607f60f81b8260008151811061540857fe5b01602001516001600160f81b03191611155b1561542657508061157f565b6113eb6154388351608060ff166155a1565b83615524565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615482575060186154a6565b6fffffffffffffffffffffffffffffffff1984166154a2575060106154a6565b5060005b60208110156154dc578181815181106154bb57fe5b01602001516001600160f81b031916156154d4576154dc565b6001016154a6565b60008160200390506060816040519080825280601f01601f191660200182016040528015615511576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561555557805183526020928301920161553d565b50855184518101855292509050808201602086015b8183101561558257805183526020928301920161556a565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106155f1576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161564b5782840160f81b8160008151811061562d57fe5b60200101906001600160f81b031916908160001a90535090506113eb565b60606156568561543e565b90508381510160370160f81b8260008151811061566f57fe5b60200101906001600160f81b031916908160001a9053506156908282615524565b95945050505050565b80516000906156aa5750600061157f565b6020820151805160001a9060c08210156156c95760009250505061157f565b5060019392505050565b8051600090811a60808110156156ed57600091505061157f565b60b8811080615708575060c08110801590615708575060f881105b1561571757600191505061157f565b60c081101561572b5760b51901905061157f565b60f51901905061157f565b80516000908190811a60808110156157515760019150615862565b60b881101561576657607e1981019150615862565b60c08110156157e057600060b78203600186019550806020036101000a8651049150600181018201935050808310156157da576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615862565b60f88110156157f55760be1981019150615862565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615860576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528061596f61597c565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a2646970667358221220d5a978e7f66cfd1df68dce9198b278a4a761278f29fe7aab4682c9ea36b909d264736f6c63430006040033", + }, + { + ContractAddr: TokenHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610996578063fd6a687914610ce6578063ff9c00271461068657610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a78abc1614610981578063a7c9f02d1461099657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad1461068657806371d30863146107dc57610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e74565b34801561062957600080fd5b506104a8610e79565b34801561063e57600080fd5b5061056b610e84565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8a565b34801561067d57600080fd5b506104a8610ea5565b34801561069257600080fd5b5061059c610eae565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb3565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611388565b3480156107e857600080fd5b506104a861138e565b3480156107fd57600080fd5b5061056b611394565b34801561081257600080fd5b5061059c61139a565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b50909250905061139f565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e8565b3480156108eb57600080fd5b5061059c61156e565b34801561090057600080fd5b506104a8611573565b34801561091557600080fd5b506104a86004803603604081101561092c57600080fd5b506001600160a01b03813516906020013561157f565b34801561094e57600080fd5b5061056b6116bd565b34801561096357600080fd5b5061056b6116c3565b34801561097857600080fd5b5061059c6116c9565b34801561098d57600080fd5b506107b36116ce565b3480156109a257600080fd5b5061059c6116d7565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dc565b3480156109fe57600080fd5b506103806116c9565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9d565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200c565b348015610b1757600080fd5b506104a8612082565b348015610b2c57600080fd5b506104a861208c565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612092565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a4565b348015610ba757600080fd5b5061056b6120bf565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c5565b348015610c4157600080fd5b5061056b612195565b348015610c5657600080fd5b5061036461219b565b348015610c6b57600080fd5b5061059c61223b565b348015610c8057600080fd5b5061059c612240565b348015610c9557600080fd5b5061056b612245565b348015610caa57600080fd5b506104a861224b565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612251565b348015610cf257600080fd5b5061056b612378565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237e92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b606181565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610ef9576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b868514610f375760405162461bcd60e51b815260040180806020018281038252603b81526020018061471b603b913960400191505060405180910390fd5b868314610f755760405162461bcd60e51b815260040180806020018281038252603f8152602001806145ee603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc15760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156110055760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611038578160200160208202803683370190505b50905060005b84811015611113576402540be4008b8b8381811061105857fe5b905060200201358161106657fe5b06156110a35760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6110c88b8b838181106110b257fe5b90506020020135856124a290919063ffffffff16565b93506110f46402540be4008c8c848181106110df57fe5b905060200201356124fc90919063ffffffff16565b82828151811061110057fe5b602090810291909101015260010161103e565b506001546111389061112b908663ffffffff61253e16565b849063ffffffff6124a216565b3410156111765760405162461bcd60e51b81526004018080602001828103825260568152602001806147c86056913960600191505060405180910390fd5b611186348463ffffffff61259716565b9150611190614337565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611254846125d9565b611269876402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c75781810151838201526020016112af565b50505050905090810190601f1680156112f45780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131557600080fd5b505af1158015611329573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b60015481565b61100881565b600b81565b60005460ff166113e4576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33612000146114245760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289492505050565b6114e3565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115285760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c5576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b33611005146116055760405162461bcd60e51b815260040180806020018281038252602f815260200180614451602f913960400191505060405180910390fd5b60004783106116145747611616565b825b9050670de0b6b3a76400008111156116325760009150506116b7565b80156116b4576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166e573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611722576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176e5760405162461bcd60e51b81526004018080602001828103825260248152602001806144de6024913960400191505060405180910390fd5b6402540be4003406156117b25760405162461bcd60e51b815260040180806020018281038252604081526020018061481e6040913960400191505060405180910390fd5b600080806001600160a01b038816611891576001546117d890879063ffffffff6124a216565b3410156118165760405162461bcd60e51b81526004018080602001828103825260618152602001806145686061913960800191505060405180910390fd5b6402540be40086061561185a5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b61186a348763ffffffff61259716565b9050611881866402540be40063ffffffff6124fc16565b6221272160e91b93509150611b34565b6001600160a01b0388166000908152600360205260409020549250826118e85760405162461bcd60e51b81526004018080602001828103825260318152602001806145376031913960400191505060405180910390fd5b6001543410156119295760405162461bcd60e51b815260040180806020018281038252603f81526020018061468a603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197457506008811180156119745750611972876007198301600a0a63ffffffff6128f016565b155b6119af5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462d603c913960400191505060405180910390fd5b6119b98782612932565b92506119c484612972565b15611a0c576305f5e100831015611a0c5760405162461bcd60e51b815260040180806020018281038252603a815260200180614480603a913960400191505060405180910390fd5b600881101580611a265750600881108015611a2657508683115b611a615760405162461bcd60e51b81526004018080602001828103825260258152602001806145c96025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa85760405162461bcd60e51b81526004018080602001828103825260358152602001806145026035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afd57600080fd5b505af1158015611b11573d6000803e3d6000fd5b505050506040513d6020811015611b2757600080fd5b5051611b3257600080fd5b505b611b3c614337565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611bea57fe5b602002602001018181525050878160600151600081518110611c0857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3a57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c65846125d9565b611c7a866402540be40063ffffffff6124fc16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd8578181015183820152602001611cc0565b50505050905090810190601f168015611d055780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611ddd5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146c9602e913960400191505060405180910390fd5b60208114611e32576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3a576020820151670de0b6b3a76400008111801590611ee157506402540be4008106155b611f32576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f77565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204c5760405162461bcd60e51b81526004018080602001828103825260238152602001806147856023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210a576040805162461bcd60e51b815260206004820152601960248201526000805160206147a8833981519152604482015290519081900360640190fd5b336120001461214a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614756602f913960400191505060405180910390fd5b60ff8316600314156114745761146f82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7892505050565b61100381565b60005460ff16156121f3576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e157828160ff16815181106122b557fe5b01602001516001600160f81b031916156122d4576001909101906122d9565b6122e1565b60010161229a565b5060608160ff166040519080825280601f01601f191660200182016040528015612312576020820181803683370190505b50905060005b8260ff168160ff16101561236e57838160ff168151811061233557fe5b602001015160f81c60f81b828260ff168151811061234f57fe5b60200101906001600160f81b031916908160001a905350600101612318565b5095945050505050565b61100481565b6060612388614383565b600061239384612b76565b91509150806123e9576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f483612cb5565b905063ffffffff811615612488576040808401516020808601516001600160a01b0316600090815260029091529182205461242f9190612932565b90506124396143b8565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247c81613002565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130de565b60008261254d575060006116b7565b8282028284828161255a57fe5b04146116b45760405162461bcd60e51b81526004018080602001828103825260218152602001806146696021913960400191505060405180910390fd5b60006116b483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613180565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f45750508351909150612616906131da565b8160008151811061262357fe5b602002602001018190525061264483602001516001600160a01b03166131ed565b8160018151811061265157fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269c57816020015b60608152602001906001900390816126875790505b50905060005b828110156126e9576126ca866040015182815181106126bd57fe5b60200260200101516131da565b8282815181106126d657fe5b60209081029190910101526001016126a2565b506126f381613210565b8360028151811061270057fe5b602002602001018190525060608260405190808252806020026020018201604052801561274157816020015b606081526020019060019003908161272c5790505b50905060005b83811015612797576127788760600151828151811061276257fe5b60200260200101516001600160a01b03166131ed565b82828151811061278457fe5b6020908102919091010152600101612747565b506127a181613210565b846003815181106127ae57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127ef57816020015b60608152602001906001900390816127da5790505b50905060005b8481101561282f576128108860800151828151811061276257fe5b82828151811061281c57fe5b60209081029190910101526001016127f5565b5061283981613210565b8560048151811061284657fe5b60200260200101819052506128688760a0015167ffffffffffffffff166131da565b8560058151811061287557fe5b602002602001018190525061288985613210565b979650505050505050565b61289c6143df565b60006128a78361329a565b91509150806128e75760405162461bcd60e51b81526004018080602001828103825260248152602001806146f76024913960400191505060405180910390fd5b6114e382613465565b60006116b483836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138e9565b6000600882111561295b57612954836007198401600a0a63ffffffff6124fc16565b90506116b7565b6116b4836008849003600a0a63ffffffff61253e16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e857828160ff16815181106129bc57fe5b01602001516001600160f81b031916156129db576001909101906129e0565b6129e8565b6001016129a1565b50600760ff82161015612a0057600092505050610e53565b816005820360ff1681518110612a1257fe5b6020910101516001600160f81b031916602d60f81b14612a3757600092505050610e53565b816001820360ff1681518110612a4957fe5b6020910101516001600160f81b031916604d60f81b14612a6e57600092505050610e53565b5060019392505050565b612a80614337565b6000612a8b8361394b565b9150915080612acb5760405162461bcd60e51b81526004018080602001828103825260248152602001806144ba6024913960400191505060405180910390fd5b612ad36143df565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5457612b3185604001518281518110612b2357fe5b602002602001015183613baf565b85604001518281518110612b4157fe5b6020908102919091010152600101612b03565b506080840151604083015260056060830152612b6f82613465565b5050505050565b612b7e614383565b6000612b88614383565b612b90614416565b612ba1612b9c86613be8565b613c0d565b90506000805b612bb083613c57565b15612ca85780612bd257612bcb612bc684613c78565b613cc6565b8452612ca0565b8060011415612bff57612bec612be784613c78565b613d7d565b6001600160a01b03166020850152612ca0565b8060021415612c1e57612c14612bc684613c78565b6040850152612ca0565b8060031415612c4657612c33612be784613c78565b6001600160a01b03166060850152612ca0565b8060041415612c6e57612c5b612be784613c78565b6001600160a01b03166080850152612ca0565b8060051415612c9b57612c83612bc684613c78565b67ffffffffffffffff1660a085015260019150612ca0565b612ca8565b600101612ba7565b5091935090915050915091565b60208101516000906001600160a01b0316612dec578160a0015167ffffffffffffffff16421115612ce857506001610e53565b8160400151471015612cfc57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d53576040519150601f19603f3d011682016040523d82523d6000602084013e612d58565b606091505b5050905080612d6b575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0a57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3757506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8757600080fd5b5086fa158015612e9b573d6000803e3d6000fd5b50505050506040513d6020811015612eb257600080fd5b50516040840151909150811015612ecd575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3e57600080fd5b5087f1158015612f52573d6000803e3d6000fd5b50505050506040513d6020811015612f6957600080fd5b505190508015612ff6577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301d575050835190915061303f906131da565b8160008151811061304c57fe5b602002602001018190525061306483602001516131da565b8160018151811061307157fe5b602002602001018190525061309283604001516001600160a01b03166131ed565b8160028151811061309f57fe5b60200260200101819052506130bd836060015163ffffffff166131da565b816003815181106130ca57fe5b6020026020010181905250610e2781613210565b6000818361316a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561312f578181015183820152602001613117565b50505050905090810190601f16801561315c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317657fe5b0495945050505050565b600081848411156131d25760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b505050900390565b60606116b76131e883613d97565b613e7d565b60408051600560a21b8318601482015260348101909152606090610e2781613e7d565b60608151600014156132315750604080516000815260208101909152610e53565b60608260008151811061324057fe5b602002602001015190506000600190505b8351811015613281576132778285838151811061326a57fe5b6020026020010151613ecf565b9150600101613251565b50610e27613294825160c060ff16613f4c565b82613ecf565b6132a26143df565b60006132ac6143df565b6132b4614416565b6132c0612b9c86613be8565b90506000805b6132cf83613c57565b15612ca857806132f5576132e5612be784613c78565b6001600160a01b0316845261345d565b806001141561339657606061331161330c85613c78565b614044565b9050805160405190808252806020026020018201604052801561333e578160200160208202803683370190505b50602086015260005b815181101561338f5761336c82828151811061335f57fe5b6020026020010151613cc6565b8660200151828151811061337c57fe5b6020908102919091010152600101613347565b505061345d565b80600214156134385760606133ad61330c85613c78565b905080516040519080825280602002602001820160405280156133da578160200160208202803683370190505b50604086015260005b815181101561338f576134088282815181106133fb57fe5b6020026020010151613d7d565b8660400151828151811061341857fe5b6001600160a01b03909216602092830291909101909101526001016133e3565b8060031415612c9b5761344d612bc684613c78565b63ffffffff166060850152600191505b6001016132c6565b80516001600160a01b031661368f5760005b8160200151518110156136895760008260400151828151811061349657fe5b60200260200101516001600160a01b0316612710846020015184815181106134ba57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613502576040519150601f19603f3d011682016040523d82523d6000602084013e613507565b606091505b50509050806135ca577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354657fe5b60200260200101518560200151858151811061355e57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613680565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360057fe5b60200260200101518560200151858151811061361857fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613477565b506138e6565b60005b8160200151518110156138e457600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c757fe5b6020026020010151866020015186815181106136df57fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373657600080fd5b5087f115801561374a573d6000803e3d6000fd5b50505050506040513d602081101561376157600080fd5b505190508015613825577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a157fe5b6020026020010151856020015185815181106137b957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138db565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385b57fe5b60200260200101518560200151858151811061387357fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613692565b505b50565b600081836139385760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561312f578181015183820152602001613117565b5082848161394257fe5b06949350505050565b613953614337565b600061395d614337565b613965614416565b613971612b9c86613be8565b90506000805b61398083613c57565b15612ca8578061399d57613996612bc684613c78565b8452613ba7565b80600114156139c5576139b2612be784613c78565b6001600160a01b03166020850152613ba7565b8060021415613a545760606139dc61330c85613c78565b90508051604051908082528060200260200182016040528015613a09578160200160208202803683370190505b50604086015260005b8151811015613a4d57613a2a82828151811061335f57fe5b86604001518281518110613a3a57fe5b6020908102919091010152600101613a12565b5050613ba7565b8060031415613ae9576060613a6b61330c85613c78565b90508051604051908082528060200260200182016040528015613a98578160200160208202803683370190505b50606086015260005b8151811015613a4d57613ab98282815181106133fb57fe5b86606001518281518110613ac957fe5b6001600160a01b0390921660209283029190910190910152600101613aa1565b8060041415613b7e576060613b0061330c85613c78565b90508051604051908082528060200260200182016040528015613b2d578160200160208202803683370190505b50608086015260005b8151811015613a4d57613b4e8282815181106133fb57fe5b86608001518281518110613b5e57fe5b6001600160a01b0390921660209283029190910190910152600101613b36565b8060051415612c9b57613b93612bc684613c78565b67ffffffffffffffff1660a0850152600191505b600101613977565b60006008821115613bd157612954836007198401600a0a63ffffffff61253e16565b6116b4836008849003600a0a63ffffffff6124fc16565b613bf0614436565b506040805180820190915281518152602082810190820152919050565b613c15614416565b613c1e82614115565b613c2757600080fd5b6000613c368360200151614145565b60208085015160408051808201909152868152920190820152915050919050565b6000613c61614436565b505080518051602091820151919092015191011190565b613c80614436565b613c8982613c57565b613c9257600080fd5b60208201516000613ca2826141a8565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cdb57508151602110155b613ce457600080fd5b6000613cf38360200151614145565b90508083600001511015613d4e576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d7457826020036101000a820491505b50949350505050565b8051600090601514613d8e57600080fd5b6116b782613cc6565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613ddb57506018613dff565b6fffffffffffffffffffffffffffffffff198416613dfb57506010613dff565b5060005b6020811015613e3557818181518110613e1457fe5b01602001516001600160f81b03191615613e2d57613e35565b600101613dff565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e6a576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613eaf5750607f60f81b82600081518110613e9d57fe5b01602001516001600160f81b03191611155b15613ebb575080610e53565b6116b7613ecd8351608060ff16613f4c565b835b6060806040519050835180825260208201818101602087015b81831015613f00578051835260209283019201613ee8565b50855184518101855292509050808201602086015b81831015613f2d578051835260209283019201613f15565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613f9c576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ff65782840160f81b81600081518110613fd857fe5b60200101906001600160f81b031916908160001a90535090506116b7565b606061400185613d97565b90508381510160370160f81b8260008151811061401a57fe5b60200101906001600160f81b031916908160001a90535061403b8282613ecf565b95945050505050565b606061404f82614115565b61405857600080fd5b6000614063836142db565b90506060816040519080825280602002602001820160405280156140a157816020015b61408e614436565b8152602001906001900390816140865790505b50905060006140b38560200151614145565b60208601510190506000805b8481101561410a576140d0836141a8565b91506040518060400160405280838152602001848152508482815181106140f357fe5b6020908102919091010152918101916001016140bf565b509195945050505050565b805160009061412657506000610e53565b6020820151805160001a9060c0821015612a6e57600092505050610e53565b8051600090811a608081101561415f576000915050610e53565b60b881108061417a575060c0811080159061417a575060f881105b15614189576001915050610e53565b60c081101561419d5760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141c357600191506142d4565b60b88110156141d857607e19810191506142d4565b60c081101561425257600060b78203600186019550806020036101000a86510491506001810182019350508083101561424c576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142d4565b60f88110156142675760be19810191506142d4565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142d2576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906142ec57506000610e53565b600080905060006143008460200151614145565b602085015185519181019250015b8082101561432e5761431f826141a8565b6001909301929091019061430e565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b6040518060400160405280614429614436565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea2646970667358221220835eacc2107a8d1718a0f05e56e1f7d7731256afbbcfccbe6551048c3c72819b64736f6c63430006040033", + }, + { + ContractAddr: RelayerIncentivizeContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "6080604052600436106102815760003560e01c8063930e1b091161014f578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107b5578063e89a3020146107e8578063f9a2bbc714610812578063fc3e590814610827578063fd6a68791461083c578063fdd31fcd1461085157610288565b8063bd4cc83014610722578063c81b16621461074c578063d0ab528a14610761578063dc927faf14610776578063dcae76ab1461078b578063e1c7392a146107a057610288565b8063a78abc1611610113578063a78abc16146105d3578063a7c6a59d146105e8578063ab51bb96146105fd578063ac43175114610612578063ace9fcc2146106e3578063af400681146106f857610288565b8063930e1b091461054c57806396713da91461057f5780639dc0926214610594578063a1a11bf5146105a9578063a3c3c0ad146105be57610288565b806343756e5c116101f35780636f93d2e6116101ac5780636f93d2e61461048457806370fd5bad146104e357806374f2272d146104f857806375d47a0a1461050d5780637942fd05146105225780637e146cc51461053757610288565b806343756e5c146103ef578063493279b1146104045780634bf6c8821461043057806351e8067214610445578063541333071461045a5780636e47b4821461046f57610288565b806312950c461161024557806312950c46146103215780631b20087c146103365780631c6433121461034b5780633a9756121461028d5780633dffc3871461039157806340bb43c0146103bc57610288565b8063081e9d131461028d57806308f2ec06146102b4578063093f2fc4146102c95780630bee7a67146102de57806310e06a761461030c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610884565b60408051918252519081900360200190f35b3480156102c057600080fd5b506102a2610889565b3480156102d557600080fd5b506102a261088e565b3480156102ea57600080fd5b506102f3610893565b6040805163ffffffff9092168252519081900360200190f35b34801561031857600080fd5b506102a2610898565b34801561032d57600080fd5b506102a261089e565b34801561034257600080fd5b506102a26108a4565b34801561035757600080fd5b506103756004803603602081101561036e57600080fd5b50356108aa565b604080516001600160a01b039092168252519081900360200190f35b34801561039d57600080fd5b506103a6610884565b6040805160ff9092168252519081900360200190f35b3480156103c857600080fd5b506102a2600480360360208110156103df57600080fd5b50356001600160a01b03166108d1565b3480156103fb57600080fd5b506103756108e3565b34801561041057600080fd5b506104196108e9565b6040805161ffff9092168252519081900360200190f35b34801561043c57600080fd5b506103a66108ee565b34801561045157600080fd5b506103756108f3565b34801561046657600080fd5b506102a2610893565b34801561047b57600080fd5b506103756108f9565b34801561049057600080fd5b506104cf600480360360808110156104a757600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013515156108ff565b604080519115158252519081900360200190f35b3480156104ef57600080fd5b506103a6610d91565b34801561050457600080fd5b506102a2610d96565b34801561051957600080fd5b50610375610d9c565b34801561052e57600080fd5b506103a6610da2565b34801561054357600080fd5b506102a2610da7565b34801561055857600080fd5b506102a26004803603602081101561056f57600080fd5b50356001600160a01b0316610dac565b34801561058b57600080fd5b506103a6610dbe565b3480156105a057600080fd5b50610375610dc3565b3480156105b557600080fd5b50610375610dc9565b3480156105ca57600080fd5b506102a2610dcf565b3480156105df57600080fd5b506104cf610dd5565b3480156105f457600080fd5b506102a2610dde565b34801561060957600080fd5b506102f3610de4565b34801561061e57600080fd5b506106e16004803603604081101561063557600080fd5b81019060208101813564010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9193909290916020810190356401000000008111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460018302840111640100000000831117156106d657600080fd5b509092509050610de9565b005b3480156106ef57600080fd5b506102a2611537565b34801561070457600080fd5b506102a26004803603602081101561071b57600080fd5b503561153d565b34801561072e57600080fd5b506102a26004803603602081101561074557600080fd5b5035611598565b34801561075857600080fd5b506103756115b1565b34801561076d57600080fd5b506102a26115b7565b34801561078257600080fd5b506103756115bd565b34801561079757600080fd5b506102a26115c3565b3480156107ac57600080fd5b506106e16115c9565b3480156107c157600080fd5b506106e1600480360360208110156107d857600080fd5b50356001600160a01b0316611692565b3480156107f457600080fd5b506103756004803603602081101561080b57600080fd5b50356117eb565b34801561081e57600080fd5b506103756117f8565b34801561083357600080fd5b506103a66117fe565b34801561084857600080fd5b50610375611803565b34801561085d57600080fd5b506102a26004803603602081101561087457600080fd5b50356001600160a01b0316611809565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b600681815481106108b757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b606181565b600881565b61200081565b61100581565b6000805460ff16610957576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109975760405162461bcd60e51b815260040180806020018281038252602f815260200180612377602f913960400191505060405180910390fd5b60008215610a4a576110026001600160a01b0316639a99b4f06110056109c8600e548861181b90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a1757600080fd5b505af1158015610a2b573d6000803e3d6000fd5b505050506040513d6020811015610a4157600080fd5b50519050610b59565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a9457600080fd5b505af1158015610aa8573d6000803e3d6000fd5b505050506040513d6020811015610abe57600080fd5b5051600e5490915015610b5957600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b569161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b1d57600080fd5b505af1158015610b31573d6000803e3d6000fd5b505050506040513d6020811015610b4757600080fd5b5051829063ffffffff61181b16565b90505b600c805460010190556000610b6d8261187e565b600954909150610b83908263ffffffff61181b16565b600955600a54610bab908290610b9f908563ffffffff61181b16565b9063ffffffff6118a716565b600a556001600160a01b038716600090815260056020526040902054610c1757600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610c9557600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610d8457600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d0f6118e9565b90506000610d1b611bcd565b6001600160a01b0389166000908152600d6020526040902054909150610d59908290610d4d908563ffffffff61181b16565b9063ffffffff61181b16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e295760405162461bcd60e51b815260040180806020018281038252602e8152602001806122bc602e913960400191505060405180910390fd5b60005460ff16610e6a5760405162461bcd60e51b81526004018080602001828103825260218152602001806122ea6021913960400191505060405180910390fd5b610ede84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611e4b9050565b15610fab5760208114610f225760405162461bcd60e51b81526004018080602001828103825260328152602001806123a66032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610f6091858580838501838280828437600092019190915250611f3292505050565b9050600254811115610fa35760405162461bcd60e51b81526004018080602001828103825260608152602001806121956060913960600191505060405180910390fd5b6001556114a5565b61100484848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051606081019091526022808252909250905061229a6020830139611e4b565b156110dc57602081146110485760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161108691858580838501838280828437600092019190915250611f3292505050565b9050801580159061109957506001548110155b6110d45760405162461bcd60e51b815260040180806020018281038252606c81526020018061230b606c913960800191505060405180910390fd5b6002556114a5565b61115084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611e4b9050565b1561121d57602081146111945760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111d291858580838501838280828437600092019190915250611f3292505050565b90506004548111156112155760405162461bcd60e51b81526004018080602001828103825260568152602001806121f56056913960600191505060405180910390fd5b6003556114a5565b61129184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611e4b9050565b1561136957602081146112d55760405162461bcd60e51b815260040180806020018281038252602e81526020018061224b602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161131391858580838501838280828437600092019190915250611f3292505050565b9050801580159061132657506003548110155b6113615760405162461bcd60e51b81526004018080602001828103825260618152602001806121066061913960800191505060405180910390fd5b6004556114a5565b6113dd84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611e4b9050565b1561146857602081146114215760405162461bcd60e51b815260040180806020018281038252602e815260200180612167602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161145f91858580838501838280828437600092019190915250611f3292505050565b600e55506114a5565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161154e575080611593565b81602810801561155f575060508211155b1561156c57506028611593565b60508211801561157d5750606e8211155b1561158d57506078819003611593565b50600481045b919050565b6000602882116115a9575080611593565b506028611593565b61100281565b600e5481565b61100381565b60095481565b60005460ff1615611621576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff161561166f576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806116f1576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117a15760405161100290819084156108fc029085906000818181858888f1935050505015801561175b573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506117e8565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108b757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611875576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061187860025461189b60015485611f3790919063ffffffff16565b9063ffffffff611f9016565b600061187583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fd2565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561194557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611927575b5050505050905060608151604051908082528060200260200182016040528015611979578160200160208202803683370190505b50905060005b8251811015611a0657600083828151811061199657fe5b6020026020010151905060006119d060056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611598565b9050808484815181106119df57fe5b60209081029190910101526119fa868263ffffffff61181b16565b9550505060010161197f565b506000611a2460045461189b60035488611f3790919063ffffffff16565b9050611a36858263ffffffff6118a716565b94508460015b8451811015611b0d576000611a718761189b8a888681518110611a5b57fe5b6020026020010151611f3790919063ffffffff16565b9050611abe81600d6000898681518110611a8757fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461181b90919063ffffffff16565b600d6000888581518110611ace57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b02838263ffffffff6118a716565b925050600101611a3c565b50611b2381600d600087600081518110611a8757fe5b600d600086600081518110611b3457fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611bb55760056000868381518110611b8757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611b6e565b50611bc2600660006120ce565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c2957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0b575b5050505050905060608151604051908082528060200260200182016040528015611c5d578160200160208202803683370190505b50905060005b8251811015611cdc576000838281518110611c7a57fe5b602002602001015190506000611cb460076000846001600160a01b03166001600160a01b031681526020019081526020016000205461153d565b905080848481518110611cc357fe5b6020908102919091010152949094019350600101611c63565b506000611cfa60045461189b60035488611f3790919063ffffffff16565b9050611d0c858263ffffffff6118a716565b94508460015b8451811015611d96576000611d318761189b8a888681518110611a5b57fe5b9050611d4781600d6000898681518110611a8757fe5b600d6000888581518110611d5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611d8b838263ffffffff6118a716565b925050600101611d12565b50611dac81600d600087600081518110611a8757fe5b600d600086600081518110611dbd57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e3e5760076000868381518110611e1057fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611df7565b50611bc2600860006120ce565b6000816040516020018082805190602001908083835b60208310611e805780518252601f199092019160209182019101611e61565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611eee5780518252601f199092019160209182019101611ecf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611f4657506000611878565b82820282848281611f5357fe5b04146118755760405162461bcd60e51b81526004018080602001828103825260218152602001806122796021913960400191505060405180910390fd5b600061187583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612069565b600081848411156120615760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561202657818101518382015260200161200e565b50505050905090810190601f1680156120535780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120b85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561202657818101518382015260200161200e565b5060008385816120c457fe5b0495945050505050565b50805460008255906000526020600020908101906117e89190611bca91905b8082111561210157600081556001016120ed565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a2646970667358221220627dba6e536686005f0eaa9f77c130ba330278d37049b690a78442862109871c64736f6c63430006040033", + }, + }, + } + + mirrorUpgrade[rialtoNet] = &Upgrade{ + UpgradeName: "mirror", + Configs: []*UpgradeConfig{ + { + ContractAddr: TokenManagerContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "6080604052600436106103815760003560e01c80637d078e13116101d1578063b795031711610102578063d9e6dae9116100a0578063fa9e91591161006f578063fa9e915914610d38578063fc3e5908146105b2578063fd6a687914610d4d578063fe3a2af514610d6257610381565b8063d9e6dae9146106fc578063dc927faf14610cf9578063e605bca014610d0e578063f9a2bbc714610d2357610381565b8063c8509d81116100dc578063c8509d8114610bdf578063c8e704a4146105b2578063d117a11014610c64578063d7109ce614610ce457610381565b8063b79503171461073b578063bd32d3f9146104d9578063c81b166214610bca57610381565b80639a854bbd1161016f578063a78abc1611610149578063a78abc1614610ad5578063ab51bb9614610aea578063ab67a4851461073b578063ac43175114610aff57610381565b80639a854bbd14610a965780639dc0926214610aab578063a1a11bf514610ac057610381565b8063859180fb116101ab578063859180fb146106e757806394553a4e14610a3757806395b9ad2614610a6c57806396713da914610a8157610381565b80637d078e13146104ee5780637ec816dd1461099b578063831d65d1146109b057610381565b8063493279b1116102b657806366dea52a1161025457806372c4e0861161022357806372c4e0861461081957806375d47a0a146108bd57806377d9dae8146108d25780637942fd051461098657610381565b806366dea52a1461073b5780636b3f1307146107505780636e47b4821461080457806370fd5bad1461073b57610381565b806351e806721161029057806351e80672146107115780635d499b1b146107265780635f558f861461073b57806361368475146106fc57610381565b8063493279b1146106bb5780634bc81c00146106e75780634bf6c882146106fc57610381565b80632e02d77611610323578063401809f9116102fd578063401809f9146105b257806343756e5c146105c7578063445fcefe146105f8578063487c88ac146104ee57610381565b80632e02d7761461054c57806337e6ecda1461057f5780633dffc387146104ee57610381565b80631f91600b1161035f5780631f91600b146104d957806323996b53146104ee57806325c751b7146105035780632d89ac32146104ee57610381565b80630bee7a67146103865780630f212b1b146103b45780631182b875146103df575b600080fd5b34801561039257600080fd5b5061039b610d77565b6040805163ffffffff9092168252519081900360200190f35b3480156103c057600080fd5b506103c9610d7c565b6040805160ff9092168252519081900360200190f35b3480156103eb57600080fd5b506104646004803603604081101561040257600080fd5b60ff8235169190810190604081016020820135600160201b81111561042657600080fd5b82018360208201111561043857600080fd5b803590602001918460018302840111600160201b8311171561045957600080fd5b509092509050610d81565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561049e578181015183820152602001610486565b50505050905090810190601f1680156104cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104e557600080fd5b506103c9610e9b565b3480156104fa57600080fd5b506103c9610ea0565b6105386004803603604081101561051957600080fd5b5080356001600160a01b031690602001356001600160401b0316610ea5565b604080519115158252519081900360200190f35b34801561055857600080fd5b506105386004803603602081101561056f57600080fd5b50356001600160a01b03166113f1565b34801561058b57600080fd5b50610538600480360360208110156105a257600080fd5b50356001600160a01b0316611406565b3480156105be57600080fd5b506103c961141b565b3480156105d357600080fd5b506105dc611420565b604080516001600160a01b039092168252519081900360200190f35b34801561060457600080fd5b506106a96004803603602081101561061b57600080fd5b810190602081018135600160201b81111561063557600080fd5b82018360208201111561064757600080fd5b803590602001918460018302840111600160201b8311171561066857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611426945050505050565b60408051918252519081900360200190f35b3480156106c757600080fd5b506106d0611584565b6040805161ffff9092168252519081900360200190f35b3480156106f357600080fd5b506103c961158a565b34801561070857600080fd5b506103c961158f565b34801561071d57600080fd5b506105dc611594565b34801561073257600080fd5b506106a961159a565b34801561074757600080fd5b506103c96115a3565b6105386004803603604081101561076657600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561079057600080fd5b8201836020820111156107a257600080fd5b803590602001918460018302840111600160201b831117156107c357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115a8945050505050565b34801561081057600080fd5b506105dc611e7e565b6105386004803603602081101561082f57600080fd5b810190602081018135600160201b81111561084957600080fd5b82018360208201111561085b57600080fd5b803590602001918460018302840111600160201b8311171561087c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611e84945050505050565b3480156108c957600080fd5b506105dc6122d0565b610538600480360360408110156108e857600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561091257600080fd5b82018360208201111561092457600080fd5b803590602001918460018302840111600160201b8311171561094557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506122d6945050505050565b34801561099257600080fd5b506103c96127dc565b3480156109a757600080fd5b506106a96127e1565b3480156109bc57600080fd5b50610a35600480360360408110156109d357600080fd5b60ff8235169190810190604081016020820135600160201b8111156109f757600080fd5b820183602082011115610a0957600080fd5b803590602001918460018302840111600160201b83111715610a2a57600080fd5b5090925090506127e7565b005b61053860048036036040811015610a4d57600080fd5b5080356001600160a01b031690602001356001600160401b0316612936565b348015610a7857600080fd5b506103c961332d565b348015610a8d57600080fd5b506103c9613332565b348015610aa257600080fd5b506106a9613337565b348015610ab757600080fd5b506105dc613343565b348015610acc57600080fd5b506105dc613349565b348015610ae157600080fd5b5061053861334f565b348015610af657600080fd5b5061039b613358565b348015610b0b57600080fd5b50610a3560048036036040811015610b2257600080fd5b810190602081018135600160201b811115610b3c57600080fd5b820183602082011115610b4e57600080fd5b803590602001918460018302840111600160201b83111715610b6f57600080fd5b919390929091602081019035600160201b811115610b8c57600080fd5b820183602082011115610b9e57600080fd5b803590602001918460018302840111600160201b83111715610bbf57600080fd5b50909250905061335d565b348015610bd657600080fd5b506105dc613632565b348015610beb57600080fd5b50610a3560048036036040811015610c0257600080fd5b60ff8235169190810190604081016020820135600160201b811115610c2657600080fd5b820183602082011115610c3857600080fd5b803590602001918460018302840111600160201b83111715610c5957600080fd5b509092509050613638565b348015610c7057600080fd5b50610c8e60048036036020811015610c8757600080fd5b503561370e565b6040805160ff988916815260208101979097526001600160a01b03909516868601526060860193909352608085019190915290931660a08301526001600160401b0390921660c082015290519081900360e00190f35b348015610cf057600080fd5b506106a9613765565b348015610d0557600080fd5b506105dc61376a565b348015610d1a57600080fd5b506106a9613770565b348015610d2f57600080fd5b506105dc613776565b348015610d4457600080fd5b506106a961377c565b348015610d5957600080fd5b506105dc613782565b348015610d6e57600080fd5b506103c9613358565b606481565b600681565b60603361200014610dc35760405162461bcd60e51b815260040180806020018281038252602f815260200180615b8a602f913960400191505060405180910390fd5b60ff841660011415610e1557610e0e83838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061378892505050565b9050610e94565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605848484604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1506040805160008152602081019091525b9392505050565b600481565b600181565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b158015610ef257600080fd5b505afa158015610f06573d6000803e3d6000fd5b505050506040513d6020811015610f1c57600080fd5b5051905080610f5e576040805162461bcd60e51b81526020600482015260096024820152681b9bdd08189bdd5b9960ba1b604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16610fc1576040805162461bcd60e51b81526020600482015260136024820152723737ba103137bab73210313c9036b4b93937b960691b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b505190506402540be4003406158015611053575060055461104f908263ffffffff613a1816565b3410155b61108e5760405162461bcd60e51b8152600401808060200182810382526046815260200180615b166046913960600191505060405180910390fd5b42607801846001600160401b0316101580156110b85750426201518001846001600160401b031611155b6110f35760405162461bcd60e51b8152600401808060200182810382526038815260200180615a136038913960400191505060405180910390fd5b6000856001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112e57600080fd5b505afa158015611142573d6000803e3d6000fd5b505050506040513d602081101561115857600080fd5b50516040805163313ce56760e01b815290519192506000916001600160a01b0389169163313ce567916004808301926020929190829003018186803b1580156111a057600080fd5b505afa1580156111b4573d6000803e3d6000fd5b505050506040513d60208110156111ca57600080fd5b50519050677ce66c50e28400006111e48360ff8416613a72565b1115611230576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b600554611004906108fc9061124c90349063ffffffff613b0116565b6040518115909202916000818181858888f19350505050158015611274573d6000803e3d6000fd5b5061127d61586a565b6040518060c00160405280336001600160a01b03168152602001896001600160a01b031681526020018681526020018481526020016112cc6402540be400600554613b4390919063ffffffff16565b81526001600160401b038916602090910152905061200063f7a251d760056112f384613b85565b61131d6402540be40061131160055434613b0190919063ffffffff16565b9063ffffffff613b4316565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561137b578181015183820152602001611363565b50505050905090810190601f1680156113a85780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156113c957600080fd5b505af11580156113dd573d6000803e3d6000fd5b505050506001955050505050505b92915050565b60036020526000908152604090205460ff1681565b60026020526000908152604090205460ff1681565b600381565b61100181565b602081015160009061143661589f565b50600081815260016020818152604092839020835160e081018552815460ff9081168252938201549281019290925260028101546001600160a01b031693820184905260038101546060830152600481015460808301526005015491821660a08201526101009091046001600160401b031660c0820152906114bd5760009250505061157f565b600081604001516001600160a01b03166370a082316110046040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561151b57600080fd5b505afa15801561152f573d6000803e3d6000fd5b505050506040513d602081101561154557600080fd5b5051608083015160608401519192506000916115669163ffffffff613b0116565b9050611578818363ffffffff613b0116565b9450505050505b919050565b61058981565b600581565b600881565b61200081565b6402540be40081565b600281565b6001600160a01b03821660009081526002602052604081205460ff16156116005760405162461bcd60e51b815260040180806020018281038252602b815260200180615bb9602b913960400191505060405180910390fd5b600061160b83613cba565b905061161561589f565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526116da576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b60006116f782608001518360600151613b0190919063ffffffff16565b905081604001516001600160a01b0316866001600160a01b03161461174d5760405162461bcd60e51b8152600401808060200182810382526045815260200180615a826045913960600191505060405180910390fd5b336001600160a01b0316866001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561179057600080fd5b505afa1580156117a4573d6000803e3d6000fd5b505050506040513d60208110156117ba57600080fd5b50516001600160a01b0316146118015760405162461bcd60e51b815260040180806020018281038252602e8152602001806159e5602e913960400191505060405180910390fd5b604080516370a0823160e01b8152611004600482015290516000916001600160a01b038916916370a0823191602480820192602092909190829003018186803b15801561184d57600080fd5b505afa158015611861573d6000803e3d6000fd5b505050506040513d602081101561187757600080fd5b505160408051636eb1769f60e11b8152336004820152306024820152905191925083916119089184916001600160a01b038c169163dd62ed3e916044808301926020929190829003018186803b1580156118d057600080fd5b505afa1580156118e4573d6000803e3d6000fd5b505050506040513d60208110156118fa57600080fd5b50519063ffffffff613a1816565b101561195b576040805162461bcd60e51b815260206004820152601760248201527f616c6c6f77616e6365206973206e6f7420656e6f756768000000000000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561199d57600080fd5b505afa1580156119b1573d6000803e3d6000fd5b505050506040513d60208110156119c757600080fd5b505190508082108015906119e057506402540be4008206155b611a1b5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4b6037913960400191505060405180910390fd5b6000611a27868b613cc1565b905063ffffffff8116611c26576001600160a01b038a166323b872dd33611004611a57898963ffffffff613b0116565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611abf57600080fd5b505af1158015611ad3573d6000803e3d6000fd5b505050506040513d6020811015611ae957600080fd5b5050602086015160408088015160a089015182516323bfccdb60e21b815260048101949094526001600160a01b03909116602484015260ff1660448301525161100491638eff336c91606480830192600092919082900301818387803b158015611b5257600080fd5b505af1158015611b66573d6000803e3d6000fd5b50505050896001600160a01b03167f78e7dd9aefcdbf795c4936a66f7dc6d41bb56637b54f561a6bf7829dca3348a88a8860600151886040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611be5578181015183820152602001611bcd565b50505050905090810190601f168015611c125780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a2611cde565b896001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a1078a8360405180806020018363ffffffff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611ca2578181015183820152602001611c8a565b50505050905090810190601f168015611ccf5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25b60008781526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff19169055611d386158db565b5060408051808201825263ffffffff831681526020810189905290516110049085156108fc029086906000818181858888f19350505050158015611d80573d6000803e3d6000fd5b5061200063f7a251d76001611d948461411b565b611da9886402540be40063ffffffff613b4316565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611e07578181015183820152602001611def565b50505050905090810190601f168015611e345780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611e5557600080fd5b505af1158015611e69573d6000803e3d6000fd5b5060019e9d5050505050505050505050505050565b61100581565b600080611e9083613cba565b9050611e9a61589f565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c0830152611f5f576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b428160c001516001600160401b031610611fc0576040805162461bcd60e51b815260206004820152601b60248201527f62696e642072657175657374206973206e6f7420657870697265640000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561200257600080fd5b505afa158015612016573d6000803e3d6000fd5b505050506040513d602081101561202c57600080fd5b5051905080821080159061204557506402540be4008206155b6120805760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4b6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556120da6158db565b50604080518082018252600181526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561211d573d6000803e3d6000fd5b5061200063f7a251d760016121318461411b565b612146876402540be40063ffffffff613b4316565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156121a457818101518382015260200161218c565b50505050905090810190601f1680156121d15780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156121f257600080fd5b505af1158015612206573d6000803e3d6000fd5b5050505083604001516001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600160405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015612288578181015183820152602001612270565b50505050905090810190601f1680156122b55780820380516001836020036101000a031916815260200191505b50935050505060405180910390a25060019695505050505050565b61100881565b6000806122e283613cba565b90506122ec61589f565b50600081815260016020818152604092839020835160e081018552815460ff90811682529382015492810183905260028201546001600160a01b03169481019490945260038101546060850152600481015460808501526005015491821660a08401526101009091046001600160401b031660c08301526123b1576040805162461bcd60e51b815260206004820152601a602482015279189a5b99081c995c5d595cdd08191bd95cdb89dd08195e1a5cdd60321b604482015290519081900360640190fd5b80604001516001600160a01b0316856001600160a01b0316146124055760405162461bcd60e51b8152600401808060200182810382526045815260200180615a826045913960600191505060405180910390fd5b336001600160a01b0316856001600160a01b031663893d20e86040518163ffffffff1660e01b815260040160206040518083038186803b15801561244857600080fd5b505afa15801561245c573d6000803e3d6000fd5b505050506040513d602081101561247257600080fd5b50516001600160a01b0316146124cf576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206265703230206f776e65722063616e2072656a6563740000000000604482015290519081900360640190fd5b600034905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561251157600080fd5b505afa158015612525573d6000803e3d6000fd5b505050506040513d602081101561253b57600080fd5b5051905080821080159061255457506402540be4008206155b61258f5760405162461bcd60e51b8152600401808060200182810382526037815260200180615a4b6037913960400191505060405180910390fd5b60008481526001602081905260408220805460ff191681559081018290556002810180546001600160a01b0319169055600381018290556004810191909155600501805468ffffffffffffffffff191690556125e96158db565b50604080518082018252600781526020810186905290516110049084156108fc029085906000818181858888f1935050505015801561262c573d6000803e3d6000fd5b5061200063f7a251d760016126408461411b565b612655876402540be40063ffffffff613b4316565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156126b357818101518382015260200161269b565b50505050905090810190601f1680156126e05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561270157600080fd5b505af1158015612715573d6000803e3d6000fd5b50505050876001600160a01b03167f831c0ef4d93bda3bce08b69ae3f29ef1a6e052b833200988554158494405a10788600760405180806020018360ff1663ffffffff168152602001828103825284818151815260200191508051906020019080838360005b8381101561279357818101518382015260200161277b565b50505050905090810190601f1680156127c05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a2506001979650505050505050565b600b81565b60045481565b33612000146128275760405162461bcd60e51b815260040180806020018281038252602f815260200180615b8a602f913960400191505060405180910390fd5b60ff8316600414156128775761287282828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419192505050565b612931565b60ff8316600514156128c25761287282828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061443e92505050565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b6040805163bd46646160e01b81526001600160a01b0384166004820152905160009182916110049163bd466461916024808301926020929190829003018186803b15801561298357600080fd5b505afa158015612997573d6000803e3d6000fd5b505050506040513d60208110156129ad57600080fd5b5051146129f1576040805162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e48189bdd5b99609a1b604482015290519081900360640190fd5b6001600160a01b03831660009081526002602052604090205460ff1615612a50576040805162461bcd60e51b815260206004820152600e60248201526d6d6972726f722070656e64696e6760901b604482015290519081900360640190fd5b60006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b158015612a8d57600080fd5b505afa158015612aa1573d6000803e3d6000fd5b505050506040513d6020811015612ab757600080fd5b505190506402540be4003406158015612ae25750600454612ade908263ffffffff613a1816565b3410155b612b1d5760405162461bcd60e51b815260040180806020018281038252604d815260200180615998604d913960600191505060405180910390fd5b42607801836001600160401b031610158015612b475750426201518001836001600160401b031611155b612b825760405162461bcd60e51b8152600401808060200182810382526038815260200180615a136038913960400191505060405180910390fd5b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bbd57600080fd5b505afa158015612bd1573d6000803e3d6000fd5b505050506040513d6020811015612be757600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b158015612c2f57600080fd5b505afa158015612c43573d6000803e3d6000fd5b505050506040513d6020811015612c5957600080fd5b50519050677ce66c50e2840000612c738260ff8516613a72565b1115612cbf576040805162461bcd60e51b8152602060048201526016602482015275746f6f206c6172676520746f74616c20737570706c7960501b604482015290519081900360640190fd5b6060866001600160a01b03166306fdde036040518163ffffffff1660e01b815260040160006040518083038186803b158015612cfa57600080fd5b505afa158015612d0e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612d3757600080fd5b8101908080516040519392919084600160201b821115612d5657600080fd5b908301906020820185811115612d6b57600080fd5b8251600160201b811182820188101715612d8457600080fd5b82525081516020918201929091019080838360005b83811015612db1578181015183820152602001612d99565b50505050905090810190601f168015612dde5780820380516001836020036101000a031916815260200191505b50604052505050905060608190506001815110158015612e0057506020815111155b612e51576040805162461bcd60e51b815260206004820152601d60248201527f6e616d65206c656e677468206d75737420626520696e205b312c33325d000000604482015290519081900360640190fd5b6060886001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612e8c57600080fd5b505afa158015612ea0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612ec957600080fd5b8101908080516040519392919084600160201b821115612ee857600080fd5b908301906020820185811115612efd57600080fd5b8251600160201b811182820188101715612f1657600080fd5b82525081516020918201929091019080838360005b83811015612f43578181015183820152602001612f2b565b50505050905090810190601f168015612f705780820380516001836020036101000a031916815260200191505b5060405250508151919250829160021180159150612f9057508051600810155b612fe1576040805162461bcd60e51b815260206004820152601e60248201527f73796d626f6c206c656e677468206d75737420626520696e205b322c385d0000604482015290519081900360640190fd5b60005b81518160ff16101561313557604160f81b828260ff168151811061300457fe5b01602001516001600160f81b031916108015906130425750602d60f91b828260ff168151811061303057fe5b01602001516001600160f81b03191611155b8061309a5750606160f81b828260ff168151811061305c57fe5b01602001516001600160f81b0319161080159061309a5750603d60f91b828260ff168151811061308857fe5b01602001516001600160f81b03191611155b806130f25750600360fc1b828260ff16815181106130b457fe5b01602001516001600160f81b031916108015906130f25750603960f81b828260ff16815181106130e057fe5b01602001516001600160f81b03191611155b61312d5760405162461bcd60e51b815260040180806020018281038252602e815260200180615ac7602e913960400191505060405180910390fd5b600101612fe4565b50600454611004906108fc9061315290349063ffffffff613b0116565b6040518115909202916000818181858888f1935050505015801561317a573d6000803e3d6000fd5b506001600160a01b038a166000908152600260209081526040909120805460ff1916600117905584810151908301516131b16158f2565b604051806101000160405280336001600160a01b031681526020018e6001600160a01b031681526020018481526020018381526020018981526020018a60ff1681526020016132106402540be400600454613b4390919063ffffffff16565b81526001600160401b038e16602090910152905061200063f7a251d7600461323784614609565b6132556402540be40061131160045434613b0190919063ffffffff16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156132b357818101518382015260200161329b565b50505050905090810190601f1680156132e05780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561330157600080fd5b505af1158015613315573d6000803e3d6000fd5b5050505060019a505050505050505050505092915050565b600781565b600981565b677ce66c50e284000081565b61100781565b61100681565b60005460ff1681565b600081565b336110071461339d5760405162461bcd60e51b815260040180806020018281038252602e815260200180615b5c602e913960400191505060405180910390fd5b602081146133f2576040805162461bcd60e51b815260206004820152601860248201527f65787065637465642076616c7565206c656e6774682033320000000000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f880181900481028201810190925286815293945060609392508691508590819084018382808284376000920191909152505050506020830151909150686d6972726f7246656560b81b8114156134e75760208201516402540be4008106156134df576040805162461bcd60e51b815260206004820152601a60248201527f6d6972726f72466565206d757374206265204e202a2031653130000000000000604482015290519081900360640190fd5b60045561359d565b6673796e6346656560c81b8114156135605760208201516402540be400810615613558576040805162461bcd60e51b815260206004820152601860248201527f73796e63466565206d757374206265204e202a20316531300000000000000000604482015290519081900360640190fd5b60055561359d565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b61100281565b33612000146136785760405162461bcd60e51b815260040180806020018281038252602f815260200180615b8a602f913960400191505060405180910390fd5b60ff8316600414156136c35761287282828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061477b92505050565b60ff8316600514156128c25761287282828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506148ba92505050565b600160208190526000918252604090912080549181015460028201546003830154600484015460059094015460ff9586169593946001600160a01b039093169391929181169061010090046001600160401b031687565b604d81565b61100381565b60055481565b61100081565b61271081565b61100481565b606061379261589f565b600061379d846149b4565b91509150806137f3576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b815160ff166138a6576020828101805160009081526001928390526040908190208551815460ff1990811660ff928316178355935194820194909455908501516002820180546001600160a01b0319166001600160a01b03909216919091179055606085015160038201556080850151600482015560a08501516005909101805460c08701519316919093161768ffffffffffffffff0019166101006001600160401b03909216919091021790556139fd565b815160ff16600114156139b05760006110046001600160a01b03166359b9278984602001516040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156138ff57600080fd5b505afa158015613913573d6000803e3d6000fd5b505050506040513d602081101561392957600080fd5b505190506001600160a01b038116156139aa5760208301516040805163b99328c560e01b815260048101929092526001600160a01b0383166024830152516110049163b99328c591604480830192600092919082900301818387803b15801561399157600080fd5b505af11580156139a5573d6000803e3d6000fd5b505050505b506139fd565b6040805162461bcd60e51b815260206004820152601960248201527f756e7265636f676e697a65642062696e64207061636b61676500000000000000604482015290519081900360640190fd5b60408051600080825260208201909252905b50949350505050565b600082820183811015610e94576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006008821115613aea57604d60071983011115613acc576040805162461bcd60e51b8152602060048201526012602482015271746f6f206c6172676520646563696d616c7360701b604482015290519081900360640190fd5b613ae3836007198401600a0a63ffffffff613b4316565b90506113eb565b610e94836008849003600a0a63ffffffff614b0516565b6000610e9483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614b5e565b6000610e9483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614bf5565b60408051600680825260e08201909252606091829190816020015b6060815260200190600190039081613ba05750508351909150613bcb906001600160a01b0316614c5a565b81600081518110613bd857fe5b6020026020010181905250613bf983602001516001600160a01b0316614c5a565b81600181518110613c0657fe5b6020026020010181905250613c21836040015160001c614c7d565b81600281518110613c2e57fe5b6020026020010181905250613c468360600151614c7d565b81600381518110613c5357fe5b6020026020010181905250613c6b8360800151614c7d565b81600481518110613c7857fe5b6020026020010181905250613c998360a001516001600160401b0316614c7d565b81600581518110613ca657fe5b6020026020010181905250610e9481614c90565b6020015190565b600080826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015613cfd57600080fd5b505afa158015613d11573d6000803e3d6000fd5b505050506040513d6020811015613d2757600080fd5b5051604080516395d89b4160e01b8152905160ff90921692506060916001600160a01b038616916395d89b41916004808301926000929190829003018186803b158015613d7357600080fd5b505afa158015613d87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015613db057600080fd5b8101908080516040519392919084600160201b821115613dcf57600080fd5b908301906020820185811115613de457600080fd5b8251600160201b811182820188101715613dfd57600080fd5b82525081516020918201929091019080838360005b83811015613e2a578181015183820152602001613e12565b50505050905090810190601f168015613e575780820380516001836020036101000a031916815260200191505b5060408181526370a0823160e01b82526110046004830152519495506000946001600160a01b038a1694506370a08231935060248083019350602092829003018186803b158015613ea757600080fd5b505afa158015613ebb573d6000803e3d6000fd5b505050506040513d6020811015613ed157600080fd5b505160808701516060880151919250600091613ef29163ffffffff613b0116565b9050428760c001516001600160401b03161015613f175750600193506113eb92505050565b613f25838860200151614d1a565b613f375750600293506113eb92505050565b80821115613f4d5750600393506113eb92505050565b866060015187604001516001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f8f57600080fd5b505afa158015613fa3573d6000803e3d6000fd5b505050506040513d6020811015613fb957600080fd5b505114613fce5750600493506113eb92505050565b8660a0015160ff168414613fea5750600593506113eb92505050565b602080880151604080516359b9278960e01b8152600481019290925251600092611004926359b927899260248083019392829003018186803b15801561402f57600080fd5b505afa158015614043573d6000803e3d6000fd5b505050506040513d602081101561405957600080fd5b50516001600160a01b03161415806140fb57506000801b6110046001600160a01b031663bd46646189604001516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156140cc57600080fd5b505afa1580156140e0573d6000803e3d6000fd5b505050506040513d60208110156140f657600080fd5b505114155b1561410e5750600693506113eb92505050565b5060009695505050505050565b6040805160028082526060828101909352829190816020015b6060815260200190600190039081614134575050835190915061415c9063ffffffff16614c7d565b8160008151811061416957fe5b6020026020010181905250614184836020015160001c614c7d565b81600181518110613ca657fe5b61419961586a565b60006141a483614e02565b91509150806141f1576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b03166000908152600290915260409020805460ff1916905560a082015160ff166143525760808201516040516110049180156108fc02916000818181858888f19350505050158015614254573d6000803e3d6000fd5b506110046001600160a01b0316638eff336c8360600151846020015185604001516040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018260ff1681526020019350505050600060405180830381600087803b1580156142ce57600080fd5b505af11580156142e2573d6000803e3d6000fd5b50505050602082810180516001600160a01b03908116600090815260038452604090819020805460ff1916600117905591516060860151835190815292519116927f41787d7db08fc5907641ee8343379f28215727eb123d4b462099afab4300b036928290030190a2505061443b565b815160808301516040516000926001600160a01b0316916127109184818181858888f193505050503d80600081146143a6576040519150601f19603f3d011682016040523d82523d6000602084013e6143ab565b606091505b50509050806143e85760808301516040516110029180156108fc02916000818181858888f193505050501580156143e6573d6000803e3d6000fd5b505b82602001516001600160a01b03167fefe400ad0042ebf81a245de9ae669616105e0ca9fc946352c085da0c2bc524e58460a00151604051808260ff1660ff16815260200191505060405180910390a25050505b50565b614446615936565b600061445183614f0f565b915091508061449e576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b606082015160ff1661451e5760408083015190516110049180156108fc02916000818181858888f193505050501580156144dc573d6000803e3d6000fd5b5081602001516001600160a01b03167fbb7d3a9a559080d8281b0e4fb39dacbe2fdcafd5ef765e9a6ed871c9167dc60f60405160405180910390a2505061443b565b81602001516001600160a01b03167ff1e25fa536da84053644fd788b1d6a27ea6edd1f3af80c7d36ca253c4c82c9c38360600151604051808260ff1660ff16815260200191505060405180910390a2815160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d80600081146145c1576040519150601f19603f3d011682016040523d82523d6000602084013e6145c6565b606091505b50509050806146035760408084015190516110029180156108fc02916000818181858888f19350505050158015614601573d6000803e3d6000fd5b505b50505050565b6040805160088082526101208201909252606091829190816020015b60608152602001906001900390816146255750508351909150614650906001600160a01b0316614c5a565b8160008151811061465d57fe5b602002602001018190525061467e83602001516001600160a01b0316614c5a565b8160018151811061468b57fe5b60200260200101819052506146a6836040015160001c614c7d565b816002815181106146b357fe5b60200260200101819052506146ce836060015160001c614c7d565b816003815181106146db57fe5b60200260200101819052506146f38360800151614c7d565b8160048151811061470057fe5b602002602001018190525061471b8360a0015160ff16614c7d565b8160058151811061472857fe5b60200260200101819052506147408360c00151614c7d565b8160068151811061474d57fe5b602002602001018190525061476e8360e001516001600160401b0316614c7d565b81600781518110613ca657fe5b6147836158f2565b600061478e83614fdb565b91509150806147db576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b6020808301516001600160a01b039081166000908152600290925260408220805460ff19169055835160c085015191169061271090614825906402540be40063ffffffff614b0516565b6040516000818181858888f193505050503d8060008114614862576040519150601f19603f3d011682016040523d82523d6000602084013e614867565b606091505b50509050806146035760c0830151611002906108fc90614892906402540be40063ffffffff614b0516565b6040518115909202916000818181858888f19350505050158015614601573d6000803e3d6000fd5b6148c261586a565b60006148cd8361512c565b915091508061491a576040805162461bcd60e51b8152602060048201526014602482015273756e7265636f676e697a6564207061636b61676560601b604482015290519081900360640190fd5b815160808301516000916001600160a01b03169061271090614947906402540be40063ffffffff614b0516565b6040516000818181858888f193505050503d8060008114614984576040519150601f19603f3d011682016040523d82523d6000602084013e614989565b606091505b5050905080614603576080830151611002906108fc90614892906402540be40063ffffffff614b0516565b6149bc61589f565b60006149c661589f565b6149ce61595d565b6149df6149da8661523c565b615261565b90506000805b6149ee836152ab565b15614af85780614a1357614a09614a04846152cc565b61531a565b60ff168452614af0565b8060011415614a3257614a28614a04846152cc565b6020850152614af0565b8060021415614a5f57614a4c614a47846152cc565b6153cf565b6001600160a01b03166040850152614af0565b8060031415614a7e57614a74614a04846152cc565b6060850152614af0565b8060041415614a9d57614a93614a04846152cc565b6080850152614af0565b8060051415614abf57614ab2614a04846152cc565b60ff1660a0850152614af0565b8060061415614aeb57614ad4614a04846152cc565b6001600160401b031660c085015260019150614af0565b614af8565b6001016149e5565b5091935090915050915091565b600082614b14575060006113eb565b82820282848281614b2157fe5b0414610e945760405162461bcd60e51b8152600401808060200182810382526021815260200180615af56021913960400191505060405180910390fd5b60008184841115614bed5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614bb2578181015183820152602001614b9a565b50505050905090810190601f168015614bdf5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008183614c445760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614bb2578181015183820152602001614b9a565b506000838581614c5057fe5b0495945050505050565b60408051600560a21b8318601482015260348101909152606090610e94816153e9565b60606113eb614c8b8361543f565b6153e9565b6060815160001415614cb1575060408051600081526020810190915261157f565b606082600081518110614cc057fe5b602002602001015190506000600190505b8351811015614d0157614cf782858381518110614cea57fe5b6020026020010151615525565b9150600101614cd1565b50610e94614d14825160c060ff166155a2565b82615525565b8151600090839060081080614d30575080516002115b15614d3f5760009150506113eb565b60408051602080825281830190925260609160208201818036833701905050905083602082015280825181518110614d7357fe5b6020910101516001600160f81b031916602d60f81b14614d98576000925050506113eb565b600160005b8351811015614df857828181518110614db257fe5b602001015160f81c60f81b6001600160f81b031916848281518110614dd357fe5b01602001516001600160f81b03191614614df05760009150614df8565b600101614d9d565b5095945050505050565b614e0a61586a565b6000614e1461586a565b614e1c61595d565b614e286149da8661523c565b90506000805b614e37836152ab565b15614af85780614e5d57614e4d614a47846152cc565b6001600160a01b03168452614f07565b8060011415614e8557614e72614a47846152cc565b6001600160a01b03166020850152614f07565b8060021415614ea757614e9a614a04846152cc565b60ff166040850152614f07565b8060031415614ec657614ebc614a04846152cc565b6060850152614f07565b8060041415614ee557614edb614a04846152cc565b6080850152614f07565b8060051415614aeb57614efa614a04846152cc565b60ff1660a0850152600191505b600101614e2e565b614f17615936565b6000614f21615936565b614f2961595d565b614f356149da8661523c565b90506000805b614f44836152ab565b15614af85780614f6a57614f5a614a47846152cc565b6001600160a01b03168452614fd3565b8060011415614f9257614f7f614a47846152cc565b6001600160a01b03166020850152614fd3565b8060021415614fb157614fa7614a04846152cc565b6040850152614fd3565b8060031415614aeb57614fc6614a04846152cc565b60ff166060850152600191505b600101614f3b565b614fe36158f2565b6000614fed6158f2565b614ff561595d565b6150016149da8661523c565b90506000805b615010836152ab565b15614af8578061503657615026614a47846152cc565b6001600160a01b03168452615124565b806001141561505e5761504b614a47846152cc565b6001600160a01b03166020850152615124565b806002141561507d57615073614a04846152cc565b6040850152615124565b806003141561509c57615092614a04846152cc565b6060850152615124565b80600414156150bb576150b1614a04846152cc565b6080850152615124565b80600514156150dd576150d0614a04846152cc565b60ff1660a0850152615124565b80600614156150fc576150f2614a04846152cc565b60c0850152615124565b8060071415614aeb57615111614a04846152cc565b6001600160401b031660e0850152600191505b600101615007565b61513461586a565b600061513e61586a565b61514661595d565b6151526149da8661523c565b90506000805b615161836152ab565b15614af8578061518757615177614a47846152cc565b6001600160a01b03168452615234565b80600114156151af5761519c614a47846152cc565b6001600160a01b03166020850152615234565b80600214156151ce576151c4614a04846152cc565b6040850152615234565b80600314156151ed576151e3614a04846152cc565b6060850152615234565b806004141561520c57615202614a04846152cc565b6080850152615234565b8060051415614aeb57615221614a04846152cc565b6001600160401b031660a0850152600191505b600101615158565b61524461597d565b506040805180820190915281518152602082810190820152919050565b61526961595d565b6152728261569a565b61527b57600080fd5b600061528a83602001516156d4565b60208085015160408051808201909152868152920190820152915050919050565b60006152b561597d565b505080518051602091820151919092015191011190565b6152d461597d565b6152dd826152ab565b6152e657600080fd5b602082015160006152f682615737565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061532f57508151602110155b61533857600080fd5b600061534783602001516156d4565b905080836000015110156153a2576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613a0f57506020919091036101000a90049392505050565b80516000906015146153e057600080fd5b6113eb8261531a565b60608151600114801561541b5750607f60f81b8260008151811061540957fe5b01602001516001600160f81b03191611155b1561542757508061157f565b6113eb6154398351608060ff166155a2565b83615525565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416615483575060186154a7565b6fffffffffffffffffffffffffffffffff1984166154a3575060106154a7565b5060005b60208110156154dd578181815181106154bc57fe5b01602001516001600160f81b031916156154d5576154dd565b6001016154a7565b60008160200390506060816040519080825280601f01601f191660200182016040528015615512576020820181803683370190505b5080830196909652508452509192915050565b6060806040519050835180825260208201818101602087015b8183101561555657805183526020928301920161553e565b50855184518101855292509050808201602086015b8183101561558357805183526020928301920161556b565b508651929092011591909101601f01601f191660405250905092915050565b60606801000000000000000083106155f2576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161564c5782840160f81b8160008151811061562e57fe5b60200101906001600160f81b031916908160001a90535090506113eb565b60606156578561543f565b90508381510160370160f81b8260008151811061567057fe5b60200101906001600160f81b031916908160001a9053506156918282615525565b95945050505050565b80516000906156ab5750600061157f565b6020820151805160001a9060c08210156156ca5760009250505061157f565b5060019392505050565b8051600090811a60808110156156ee57600091505061157f565b60b8811080615709575060c08110801590615709575060f881105b1561571857600191505061157f565b60c081101561572c5760b51901905061157f565b60f51901905061157f565b80516000908190811a60808110156157525760019150615863565b60b881101561576757607e1981019150615863565b60c08110156157e157600060b78203600186019550806020036101000a8651049150600181018201935050808310156157db576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50615863565b60f88110156157f65760be1981019150615863565b600060f78203600186019550806020036101000a865104915060018101820193505080831015615861576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081019190915290565b604080518082019091526000808252602082015290565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806040016040528061597061597d565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe6d73672e76616c7565206d757374206265204e202a203165313020616e642067726561746572207468616e2073756d206f66206d696e6952656c617946656520616e64206d6972726f724665656f6e6c79206265703230206f776e65722063616e20617070726f766520746869732062696e64207265717565737465787069726554696d65206d7573742062652074776f206d696e75746573206c6174657220616e64206f6e6520646179206561726c69657272656c6179466565206d757374206265204e202a203165313020616e642067726561746572207468616e206d696e6952656c6179466565636f6e74616374206164647265737320646f65736e277420657175616c20746f2074686520636f6e7472616374206164647265737320696e2062696e64207265717565737473796d626f6c2073686f756c64206f6e6c7920636f6e7461696e20616c70686162657420616e64206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d73672e76616c7565206d757374206265204e202a203165313020616e64206e6f206c6573732073756d206f66206d696e6952656c617946656520616e642073796e63466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e747261637474686520626570323020746f6b656e20697320696e206d6972726f722070656e64696e6720737461747573a264697066735822122011643b1904024d40f68eeffb1121551fe6c8ee6c1d494c4463b904655149b5e264736f6c63430006040033", + }, + { + ContractAddr: TokenHubContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "60806040526004361061031e5760003560e01c80639a99b4f0116101ab578063bd466461116100f7578063f014847211610095578063fc1a598f1161006f578063fc1a598f14610cb3578063fc3e590814610996578063fd6a687914610ce6578063ff9c00271461068657610366565b8063f014847214610c74578063f9a2bbc714610c89578063fa9e915914610c9e57610366565b8063d9e6dae9116100d1578063d9e6dae914610608578063dc927faf14610c35578063e1c7392a14610c4a578063ebf71d5314610c5f57610366565b8063bd46646114610b68578063c81b166214610b9b578063c8509d8114610bb057610366565b8063aa7415f511610164578063b99328c51161013e578063b99328c514610ad2578063b9fd21e314610b0b578063ba35ead614610b20578063bbface1f14610b3557610366565b8063aa7415f5146109ab578063ab51bb96146109f2578063ac43175114610a0757610366565b80639a99b4f0146109095780639dc0926214610942578063a1a11bf514610957578063a496fba21461096c578063a78abc1614610981578063a7c9f02d1461099657610366565b8063613684751161026a57806375d47a0a116102235780638b87b21f116101fd5780638b87b21f146105875780638eff336c146108a057806396713da9146108df5780639a854bbd146108f457610366565b806375d47a0a146107f15780637942fd0514610806578063831d65d11461081b57610366565b8063613684751461060857806366dea52a146106865780636e0565201461069b5780636e47b482146107c757806370fd5bad1461068657806371d30863146107dc57610366565b806343a368b9116102d757806350432d32116102b157806350432d321461061d57806351e806721461063257806359b92789146106475780635d499b1b1461067157610366565b806343a368b9146105c7578063493279b1146105dc5780634bf6c8821461060857610366565b80630bee7a671461036b5780631182b87514610399578063149d14d9146104935780633d713223146104ba5780633dffc3871461058757806343756e5c146105b257610366565b36610366573415610364576040805133815234602082015281517f6c98249d85d88c3753a04a22230f595e4dc8d3dc86c34af35deeeedc861b89db929181900390910190a15b005b600080fd5b34801561037757600080fd5b50610380610cfb565b6040805163ffffffff9092168252519081900360200190f35b3480156103a557600080fd5b5061041e600480360360408110156103bc57600080fd5b60ff8235169190810190604081016020820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460018302840111600160201b8311171561041357600080fd5b509092509050610d00565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561049f57600080fd5b506104a8610e2e565b60408051918252519081900360200190f35b3480156104c657600080fd5b5061056b600480360360208110156104dd57600080fd5b810190602081018135600160201b8111156104f757600080fd5b82018360208201111561050957600080fd5b803590602001918460018302840111600160201b8311171561052a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e34945050505050565b604080516001600160a01b039092168252519081900360200190f35b34801561059357600080fd5b5061059c610e58565b6040805160ff9092168252519081900360200190f35b3480156105be57600080fd5b5061056b610e5d565b3480156105d357600080fd5b506104a8610e63565b3480156105e857600080fd5b506105f1610e6f565b6040805161ffff9092168252519081900360200190f35b34801561061457600080fd5b5061059c610e75565b34801561062957600080fd5b506104a8610e7a565b34801561063e57600080fd5b5061056b610e85565b34801561065357600080fd5b5061056b6004803603602081101561066a57600080fd5b5035610e8b565b34801561067d57600080fd5b506104a8610ea6565b34801561069257600080fd5b5061059c610eaf565b6107b3600480360360808110156106b157600080fd5b810190602081018135600160201b8111156106cb57600080fd5b8201836020820111156106dd57600080fd5b803590602001918460208302840111600160201b831117156106fe57600080fd5b919390929091602081019035600160201b81111561071b57600080fd5b82018360208201111561072d57600080fd5b803590602001918460208302840111600160201b8311171561074e57600080fd5b919390929091602081019035600160201b81111561076b57600080fd5b82018360208201111561077d57600080fd5b803590602001918460208302840111600160201b8311171561079e57600080fd5b91935091503567ffffffffffffffff16610eb4565b604080519115158252519081900360200190f35b3480156107d357600080fd5b5061056b611389565b3480156107e857600080fd5b506104a861138f565b3480156107fd57600080fd5b5061056b611395565b34801561081257600080fd5b5061059c61139b565b34801561082757600080fd5b506103646004803603604081101561083e57600080fd5b60ff8235169190810190604081016020820135600160201b81111561086257600080fd5b82018360208201111561087457600080fd5b803590602001918460018302840111600160201b8311171561089557600080fd5b5090925090506113a0565b3480156108ac57600080fd5b50610364600480360360608110156108c357600080fd5b508035906001600160a01b0360208201351690604001356114e9565b3480156108eb57600080fd5b5061059c61156f565b34801561090057600080fd5b506104a8611574565b34801561091557600080fd5b506104a86004803603604081101561092c57600080fd5b506001600160a01b038135169060200135611580565b34801561094e57600080fd5b5061056b6116be565b34801561096357600080fd5b5061056b6116c4565b34801561097857600080fd5b5061059c6116ca565b34801561098d57600080fd5b506107b36116cf565b3480156109a257600080fd5b5061059c6116d8565b6107b3600480360360808110156109c157600080fd5b5080356001600160a01b03908116916020810135909116906040810135906060013567ffffffffffffffff166116dd565b3480156109fe57600080fd5b506103806116ca565b348015610a1357600080fd5b5061036460048036036040811015610a2a57600080fd5b810190602081018135600160201b811115610a4457600080fd5b820183602082011115610a5657600080fd5b803590602001918460018302840111600160201b83111715610a7757600080fd5b919390929091602081019035600160201b811115610a9457600080fd5b820183602082011115610aa657600080fd5b803590602001918460018302840111600160201b83111715610ac757600080fd5b509092509050611d9e565b348015610ade57600080fd5b5061036460048036036040811015610af557600080fd5b50803590602001356001600160a01b031661200d565b348015610b1757600080fd5b506104a8612083565b348015610b2c57600080fd5b506104a861208d565b348015610b4157600080fd5b506104a860048036036020811015610b5857600080fd5b50356001600160a01b0316612093565b348015610b7457600080fd5b506104a860048036036020811015610b8b57600080fd5b50356001600160a01b03166120a5565b348015610ba757600080fd5b5061056b6120c0565b348015610bbc57600080fd5b5061036460048036036040811015610bd357600080fd5b60ff8235169190810190604081016020820135600160201b811115610bf757600080fd5b820183602082011115610c0957600080fd5b803590602001918460018302840111600160201b83111715610c2a57600080fd5b5090925090506120c6565b348015610c4157600080fd5b5061056b612196565b348015610c5657600080fd5b5061036461219c565b348015610c6b57600080fd5b5061059c61223c565b348015610c8057600080fd5b5061059c612241565b348015610c9557600080fd5b5061056b612246565b348015610caa57600080fd5b506104a861224c565b348015610cbf57600080fd5b5061041e60048036036020811015610cd657600080fd5b50356001600160a01b0316612252565b348015610cf257600080fd5b5061056b612379565b606481565b60005460609060ff16610d48576040805162461bcd60e51b815260206004820152601960248201526000805160206147a9833981519152604482015290519081900360640190fd5b3361200014610d885760405162461bcd60e51b815260040180806020018281038252602f815260200180614757602f913960400191505060405180910390fd5b60ff841660021415610dda57610dd383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061237f92505050565b9050610e27565b6040805162461bcd60e51b815260206004820152601860248201527f756e7265636f676e697a65642073796e207061636b6167650000000000000000604482015290519081900360640190fd5b9392505050565b60015490565b6020818101516000908152600490915260409020546001600160a01b03165b919050565b600181565b61100181565b670de0b6b3a764000081565b61058981565b600881565b66071afd498d000081565b61200081565b6000908152600460205260409020546001600160a01b031690565b6402540be40081565b600281565b6000805460ff16610efa576040805162461bcd60e51b815260206004820152601960248201526000805160206147a9833981519152604482015290519081900360640190fd5b868514610f385760405162461bcd60e51b815260040180806020018281038252603b81526020018061471c603b913960400191505060405180910390fd5b868314610f765760405162461bcd60e51b815260040180806020018281038252603f8152602001806145ef603f913960400191505060405180910390fd5b426078018267ffffffffffffffff161015610fc25760405162461bcd60e51b81526004018080602001828103825260248152602001806144df6024913960400191505060405180910390fd5b6402540be4003406156110065760405162461bcd60e51b815260040180806020018281038252604081526020018061481f6040913960400191505060405180910390fd5b60408051868152602080880282010190915285906000908190606090848015611039578160200160208202803683370190505b50905060005b84811015611114576402540be4008b8b8381811061105957fe5b905060200201358161106757fe5b06156110a45760405162461bcd60e51b815260040180806020018281038252603c81526020018061462e603c913960400191505060405180910390fd5b6110c98b8b838181106110b357fe5b90506020020135856124a390919063ffffffff16565b93506110f56402540be4008c8c848181106110e057fe5b905060200201356124fd90919063ffffffff16565b82828151811061110157fe5b602090810291909101015260010161103f565b506001546111399061112c908663ffffffff61253f16565b849063ffffffff6124a316565b3410156111775760405162461bcd60e51b81526004018080602001828103825260568152602001806147c96056913960600191505060405180910390fd5b611187348463ffffffff61259816565b9150611191614338565b6040518060c001604052806221272160e91b60001b815260200160006001600160a01b031681526020018381526020018e8e808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050908252506040805160208c810282810182019093528c82529283019290918d918d91829185019084908082843760009201919091525050509082525067ffffffffffffffff8916602090910152905061200063f7a251d76003611255846125da565b61126a876402540be40063ffffffff6124fd16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156112c85781810151838201526020016112b0565b50505050905090810190601f1680156112f55780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b505060408051600081523360208201528082018890526060810187905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a15060019c9b505050505050505050505050565b61100581565b60015481565b61100881565b600b81565b60005460ff166113e5576040805162461bcd60e51b815260206004820152601960248201526000805160206147a9833981519152604482015290519081900360640190fd5b33612000146114255760405162461bcd60e51b815260040180806020018281038252602f815260200180614757602f913960400191505060405180910390fd5b60ff8316600314156114755761147082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061289592505050565b6114e4565b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a15b505050565b33611008146115295760405162461bcd60e51b81526004018080602001828103825260238152602001806147866023913960400191505060405180910390fd5b600083815260046020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260038152838220949094556002909352912055565b600981565b677ce66c50e284000081565b6000805460ff166115c6576040805162461bcd60e51b815260206004820152601960248201526000805160206147a9833981519152604482015290519081900360640190fd5b33611005146116065760405162461bcd60e51b815260040180806020018281038252602f815260200180614452602f913960400191505060405180910390fd5b60004783106116155747611617565b825b9050670de0b6b3a76400008111156116335760009150506116b8565b80156116b5576040516001600160a01b0385169082156108fc029083906000818181858888f1935050505015801561166f573d6000803e3d6000fd5b50604080516001600160a01b03861681526020810183905281517ff8b71c64315fc33b2ead2adfa487955065152a8ac33d9d5193aafd7f45dc15a0929181900390910190a15b90505b92915050565b61100781565b61100681565b600081565b60005460ff1681565b600381565b6000805460ff16611723576040805162461bcd60e51b815260206004820152601960248201526000805160206147a9833981519152604482015290519081900360640190fd5b426078018267ffffffffffffffff16101561176f5760405162461bcd60e51b81526004018080602001828103825260248152602001806144df6024913960400191505060405180910390fd5b6402540be4003406156117b35760405162461bcd60e51b815260040180806020018281038252604081526020018061481f6040913960400191505060405180910390fd5b600080806001600160a01b038816611892576001546117d990879063ffffffff6124a316565b3410156118175760405162461bcd60e51b81526004018080602001828103825260618152602001806145696061913960800191505060405180910390fd5b6402540be40086061561185b5760405162461bcd60e51b815260040180806020018281038252603c81526020018061462e603c913960400191505060405180910390fd5b61186b348763ffffffff61259816565b9050611882866402540be40063ffffffff6124fd16565b6221272160e91b93509150611b35565b6001600160a01b0388166000908152600360205260409020549250826118e95760405162461bcd60e51b81526004018080602001828103825260318152602001806145386031913960400191505060405180910390fd5b60015434101561192a5760405162461bcd60e51b815260040180806020018281038252603f81526020018061468b603f913960400191505060405180910390fd5b506001600160a01b038716600090815260026020526040902054349060088111158061197557506008811180156119755750611973876007198301600a0a63ffffffff6128f116565b155b6119b05760405162461bcd60e51b815260040180806020018281038252603c81526020018061462e603c913960400191505060405180910390fd5b6119ba8782612933565b92506119c584612973565b15611a0d576305f5e100831015611a0d5760405162461bcd60e51b815260040180806020018281038252603a815260200180614481603a913960400191505060405180910390fd5b600881101580611a275750600881108015611a2757508683115b611a625760405162461bcd60e51b81526004018080602001828103825260258152602001806145ca6025913960400191505060405180910390fd5b677ce66c50e2840000831115611aa95760405162461bcd60e51b81526004018080602001828103825260358152602001806145036035913960400191505060405180910390fd5b604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b038b16916323b872dd9160648083019260209291908290030181600087803b158015611afe57600080fd5b505af1158015611b12573d6000803e3d6000fd5b505050506040513d6020811015611b2857600080fd5b5051611b3357600080fd5b505b611b3d614338565b6040805160c0810182528581526001600160a01b038b166020820152815160018082528184018452919283019181602001602082028036833750505081526040805160018082528183019092526020928301929091908083019080368337505050815260408051600180825281830190925260209283019290919080830190803683370190505081526020018767ffffffffffffffff168152509050828160400151600081518110611beb57fe5b602002602001018181525050878160600151600081518110611c0957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050338160800151600081518110611c3b57fe5b6001600160a01b039092166020928302919091019091015261200063f7a251d76003611c66846125da565b611c7b866402540be40063ffffffff6124fd16565b6040518463ffffffff1660e01b8152600401808460ff1660ff16815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b83811015611cd9578181015183820152602001611cc1565b50505050905090810190601f168015611d065780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611d2757600080fd5b505af1158015611d3b573d6000803e3d6000fd5b5050604080516001600160a01b038d1681523360208201528082018b90526060810186905290517f74eab09b0e53aefc23f2e1b16da593f95c2dd49c6f5a23720463d10d9c330b2a9350908190036080019150a150600198975050505050505050565b3361100714611dde5760405162461bcd60e51b815260040180806020018281038252602e8152602001806146ca602e913960400191505060405180910390fd5b60208114611e33576040805162461bcd60e51b815260206004820152601b60248201527f65787065637465642076616c7565206c656e6774682069732033320000000000604482015290519081900360640190fd5b606084848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8801819004810282018101909252868152939450606093925086915085908190840183828082843760009201919091525050505060208301519091506772656c617946656560c01b811415611f3b576020820151670de0b6b3a76400008111801590611ee257506402540be4008106155b611f33576040805162461bcd60e51b815260206004820152601960248201527f7468652072656c6179466565206f7574206f662072616e676500000000000000604482015290519081900360640190fd5b600155611f78565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a878787876040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050505050565b336110081461204d5760405162461bcd60e51b81526004018080602001828103825260238152602001806147866023913960400191505060405180910390fd5b600091825260046020908152604080842080546001600160a01b03191690556001600160a01b0392909216835260039052812055565b6221272160e91b81565b61c35081565b60026020526000908152604090205481565b6001600160a01b031660009081526003602052604090205490565b61100281565b60005460ff1661210b576040805162461bcd60e51b815260206004820152601960248201526000805160206147a9833981519152604482015290519081900360640190fd5b336120001461214b5760405162461bcd60e51b815260040180806020018281038252602f815260200180614757602f913960400191505060405180910390fd5b60ff8316600314156114755761147082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a7992505050565b61100381565b60005460ff16156121f4576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b66071afd498d000060019081556000808052600260205260127fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b55805460ff19169091179055565b600481565b600581565b61100081565b61271081565b6001600160a01b03811660009081526003602090815260409182902054825182815280840190935260609290918391906020820181803683375050506020810183905290506000805b60208160ff1610156122e257828160ff16815181106122b657fe5b01602001516001600160f81b031916156122d5576001909101906122da565b6122e2565b60010161229b565b5060608160ff166040519080825280601f01601f191660200182016040528015612313576020820181803683370190505b50905060005b8260ff168160ff16101561236f57838160ff168151811061233657fe5b602001015160f81c60f81b828260ff168151811061235057fe5b60200101906001600160f81b031916908160001a905350600101612319565b5095945050505050565b61100481565b6060612389614384565b600061239484612b77565b91509150806123ea576040805162461bcd60e51b815260206004820152601f60248201527f756e7265636f676e697a6564207472616e73666572496e207061636b61676500604482015290519081900360640190fd5b60006123f583612cb6565b905063ffffffff811615612489576040808401516020808601516001600160a01b031660009081526002909152918220546124309190612933565b905061243a6143b9565b60405180608001604052808660000151815260200183815260200186608001516001600160a01b031681526020018463ffffffff16815250905061247d81613003565b95505050505050610e53565b50506040805160008152602081019091529150610e539050565b6000828201838110156116b5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60006116b583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130df565b60008261254e575060006116b8565b8282028284828161255b57fe5b04146116b55760405162461bcd60e51b815260040180806020018281038252602181526020018061466a6021913960400191505060405180910390fd5b60006116b583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613181565b60408051600680825260e08201909252606091829190816020015b60608152602001906001900390816125f55750508351909150612617906131db565b8160008151811061262457fe5b602002602001018190525061264583602001516001600160a01b03166131ee565b8160018151811061265257fe5b60200260200101819052506000836040015151905060608160405190808252806020026020018201604052801561269d57816020015b60608152602001906001900390816126885790505b50905060005b828110156126ea576126cb866040015182815181106126be57fe5b60200260200101516131db565b8282815181106126d757fe5b60209081029190910101526001016126a3565b506126f481613211565b8360028151811061270157fe5b602002602001018190525060608260405190808252806020026020018201604052801561274257816020015b606081526020019060019003908161272d5790505b50905060005b83811015612798576127798760600151828151811061276357fe5b60200260200101516001600160a01b03166131ee565b82828151811061278557fe5b6020908102919091010152600101612748565b506127a281613211565b846003815181106127af57fe5b60200260200101819052506060836040519080825280602002602001820160405280156127f057816020015b60608152602001906001900390816127db5790505b50905060005b84811015612830576128118860800151828151811061276357fe5b82828151811061281d57fe5b60209081029190910101526001016127f6565b5061283a81613211565b8560048151811061284757fe5b60200260200101819052506128698760a0015167ffffffffffffffff166131db565b8560058151811061287657fe5b602002602001018190525061288a85613211565b979650505050505050565b61289d6143e0565b60006128a88361329b565b91509150806128e85760405162461bcd60e51b81526004018080602001828103825260248152602001806146f86024913960400191505060405180910390fd5b6114e482613466565b60006116b583836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f00000000000000008152506138ea565b6000600882111561295c57612955836007198401600a0a63ffffffff6124fd16565b90506116b8565b6116b5836008849003600a0a63ffffffff61253f16565b604080516020808252818301909252600091606091906020820181803683375050506020810184905290506000805b60208160ff1610156129e957828160ff16815181106129bd57fe5b01602001516001600160f81b031916156129dc576001909101906129e1565b6129e9565b6001016129a2565b50600760ff82161015612a0157600092505050610e53565b816005820360ff1681518110612a1357fe5b6020910101516001600160f81b031916602d60f81b14612a3857600092505050610e53565b816001820360ff1681518110612a4a57fe5b6020910101516001600160f81b031916604d60f81b14612a6f57600092505050610e53565b5060019392505050565b612a81614338565b6000612a8c8361394c565b9150915080612acc5760405162461bcd60e51b81526004018080602001828103825260248152602001806144bb6024913960400191505060405180910390fd5b612ad46143e0565b602080840180516001600160a01b0390811684526040808701518585015291511660009081526002909252812054905b846040015151811015612b5557612b3285604001518281518110612b2457fe5b602002602001015183613bb0565b85604001518281518110612b4257fe5b6020908102919091010152600101612b04565b506080840151604083015260056060830152612b7082613466565b5050505050565b612b7f614384565b6000612b89614384565b612b91614417565b612ba2612b9d86613be9565b613c0e565b90506000805b612bb183613c58565b15612ca95780612bd357612bcc612bc784613c79565b613cc7565b8452612ca1565b8060011415612c0057612bed612be884613c79565b613d7e565b6001600160a01b03166020850152612ca1565b8060021415612c1f57612c15612bc784613c79565b6040850152612ca1565b8060031415612c4757612c34612be884613c79565b6001600160a01b03166060850152612ca1565b8060041415612c6f57612c5c612be884613c79565b6001600160a01b03166080850152612ca1565b8060051415612c9c57612c84612bc784613c79565b67ffffffffffffffff1660a085015260019150612ca1565b612ca9565b600101612ba8565b5091935090915050915091565b60208101516000906001600160a01b0316612ded578160a0015167ffffffffffffffff16421115612ce957506001610e53565b8160400151471015612cfd57506003610e53565b606082015160408084015190516000926001600160a01b0316916127109184818181858888f193505050503d8060008114612d54576040519150601f19603f3d011682016040523d82523d6000602084013e612d59565b606091505b5050905080612d6c575060049050610e53565b7f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5983602001518460600151856040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009050610e53565b8160a0015167ffffffffffffffff16421115612e0b57506001610e53565b81516020808401516001600160a01b031660009081526003909152604090205414612e3857506002610e53565b602080830151604080516370a0823160e01b815230600482015290516000936001600160a01b03909316926370a082319261c3509260248083019392829003018187803b158015612e8857600080fd5b5086fa158015612e9c573d6000803e3d6000fd5b50505050506040513d6020811015612eb357600080fd5b50516040840151909150811015612ece575060039050610e53565b600083602001516001600160a01b031663a9059cbb61c350866060015187604001516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b158015612f3f57600080fd5b5087f1158015612f53573d6000803e3d6000fd5b50505050506040513d6020811015612f6a57600080fd5b505190508015612ff7577f471eb9cc1ffe55ffadf15b32595415eb9d80f22e761d24bd6dffc607e1284d5984602001518560600151866040015160405180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b03168152602001828152602001935050505060405180910390a15060009150610e539050565b5060059150610e539050565b60408051600480825260a08201909252606091829190816020015b606081526020019060019003908161301e5750508351909150613040906131db565b8160008151811061304d57fe5b602002602001018190525061306583602001516131db565b8160018151811061307257fe5b602002602001018190525061309383604001516001600160a01b03166131ee565b816002815181106130a057fe5b60200260200101819052506130be836060015163ffffffff166131db565b816003815181106130cb57fe5b6020026020010181905250610e2781613211565b6000818361316b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613130578181015183820152602001613118565b50505050905090810190601f16801561315d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161317757fe5b0495945050505050565b600081848411156131d35760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613130578181015183820152602001613118565b505050900390565b60606116b86131e983613d98565b613e7e565b60408051600560a21b8318601482015260348101909152606090610e2781613e7e565b60608151600014156132325750604080516000815260208101909152610e53565b60608260008151811061324157fe5b602002602001015190506000600190505b8351811015613282576132788285838151811061326b57fe5b6020026020010151613ed0565b9150600101613252565b50610e27613295825160c060ff16613f4d565b82613ed0565b6132a36143e0565b60006132ad6143e0565b6132b5614417565b6132c1612b9d86613be9565b90506000805b6132d083613c58565b15612ca957806132f6576132e6612be884613c79565b6001600160a01b0316845261345e565b806001141561339757606061331261330d85613c79565b614045565b9050805160405190808252806020026020018201604052801561333f578160200160208202803683370190505b50602086015260005b81518110156133905761336d82828151811061336057fe5b6020026020010151613cc7565b8660200151828151811061337d57fe5b6020908102919091010152600101613348565b505061345e565b80600214156134395760606133ae61330d85613c79565b905080516040519080825280602002602001820160405280156133db578160200160208202803683370190505b50604086015260005b8151811015613390576134098282815181106133fc57fe5b6020026020010151613d7e565b8660400151828151811061341957fe5b6001600160a01b03909216602092830291909101909101526001016133e4565b8060031415612c9c5761344e612bc784613c79565b63ffffffff166060850152600191505b6001016132c7565b80516001600160a01b03166136905760005b81602001515181101561368a5760008260400151828151811061349757fe5b60200260200101516001600160a01b0316612710846020015184815181106134bb57fe5b60209081029190910101516040516000818181858888f193505050503d8060008114613503576040519150601f19603f3d011682016040523d82523d6000602084013e613508565b606091505b50509050806135cb577f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061354757fe5b60200260200101518560200151858151811061355f57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a1613681565b7fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a83600001518460400151848151811061360157fe5b60200260200101518560200151858151811061361957fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613478565b506138e7565b60005b8160200151518110156138e557600082600001516001600160a01b031663a9059cbb61c350856040015185815181106136c857fe5b6020026020010151866020015186815181106136e057fe5b60200260200101516040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600088803b15801561373757600080fd5b5087f115801561374b573d6000803e3d6000fd5b50505050506040513d602081101561376257600080fd5b505190508015613826577fd468d4fa5e8fb4adc119b29a983fd0785e04af5cb8b7a3a69a47270c54b6901a8360000151846040015184815181106137a257fe5b6020026020010151856020015185815181106137ba57fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a16138dc565b7f203f9f67a785f4f81be4d48b109aa0c498d1bc8097ecc2627063f480cc5fe73e83600001518460400151848151811061385c57fe5b60200260200101518560200151858151811061387457fe5b6020026020010151866060015160405180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018381526020018263ffffffff1663ffffffff16815260200194505050505060405180910390a15b50600101613693565b505b50565b600081836139395760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613130578181015183820152602001613118565b5082848161394357fe5b06949350505050565b613954614338565b600061395e614338565b613966614417565b613972612b9d86613be9565b90506000805b61398183613c58565b15612ca9578061399e57613997612bc784613c79565b8452613ba8565b80600114156139c6576139b3612be884613c79565b6001600160a01b03166020850152613ba8565b8060021415613a555760606139dd61330d85613c79565b90508051604051908082528060200260200182016040528015613a0a578160200160208202803683370190505b50604086015260005b8151811015613a4e57613a2b82828151811061336057fe5b86604001518281518110613a3b57fe5b6020908102919091010152600101613a13565b5050613ba8565b8060031415613aea576060613a6c61330d85613c79565b90508051604051908082528060200260200182016040528015613a99578160200160208202803683370190505b50606086015260005b8151811015613a4e57613aba8282815181106133fc57fe5b86606001518281518110613aca57fe5b6001600160a01b0390921660209283029190910190910152600101613aa2565b8060041415613b7f576060613b0161330d85613c79565b90508051604051908082528060200260200182016040528015613b2e578160200160208202803683370190505b50608086015260005b8151811015613a4e57613b4f8282815181106133fc57fe5b86608001518281518110613b5f57fe5b6001600160a01b0390921660209283029190910190910152600101613b37565b8060051415612c9c57613b94612bc784613c79565b67ffffffffffffffff1660a0850152600191505b600101613978565b60006008821115613bd257612955836007198401600a0a63ffffffff61253f16565b6116b5836008849003600a0a63ffffffff6124fd16565b613bf1614437565b506040805180820190915281518152602082810190820152919050565b613c16614417565b613c1f82614116565b613c2857600080fd5b6000613c378360200151614146565b60208085015160408051808201909152868152920190820152915050919050565b6000613c62614437565b505080518051602091820151919092015191011190565b613c81614437565b613c8a82613c58565b613c9357600080fd5b60208201516000613ca3826141a9565b80830160209586015260408051808201909152908152938401919091525090919050565b805160009015801590613cdc57508151602110155b613ce557600080fd5b6000613cf48360200151614146565b90508083600001511015613d4f576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b825160208085015183018051928490039291831015613d7557826020036101000a820491505b50949350505050565b8051600090601514613d8f57600080fd5b6116b882613cc7565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613ddc57506018613e00565b6fffffffffffffffffffffffffffffffff198416613dfc57506010613e00565b5060005b6020811015613e3657818181518110613e1557fe5b01602001516001600160f81b03191615613e2e57613e36565b600101613e00565b60008160200390506060816040519080825280601f01601f191660200182016040528015613e6b576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613eb05750607f60f81b82600081518110613e9e57fe5b01602001516001600160f81b03191611155b15613ebc575080610e53565b6116b8613ece8351608060ff16613f4d565b835b6060806040519050835180825260208201818101602087015b81831015613f01578051835260209283019201613ee9565b50855184518101855292509050808201602086015b81831015613f2e578051835260209283019201613f16565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310613f9d576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b60408051600180825281830190925260609160208201818036833701905050905060378411613ff75782840160f81b81600081518110613fd957fe5b60200101906001600160f81b031916908160001a90535090506116b8565b606061400285613d98565b90508381510160370160f81b8260008151811061401b57fe5b60200101906001600160f81b031916908160001a90535061403c8282613ed0565b95945050505050565b606061405082614116565b61405957600080fd5b6000614064836142dc565b90506060816040519080825280602002602001820160405280156140a257816020015b61408f614437565b8152602001906001900390816140875790505b50905060006140b48560200151614146565b60208601510190506000805b8481101561410b576140d1836141a9565b91506040518060400160405280838152602001848152508482815181106140f457fe5b6020908102919091010152918101916001016140c0565b509195945050505050565b805160009061412757506000610e53565b6020820151805160001a9060c0821015612a6f57600092505050610e53565b8051600090811a6080811015614160576000915050610e53565b60b881108061417b575060c0811080159061417b575060f881105b1561418a576001915050610e53565b60c081101561419e5760b519019050610e53565b60f519019050610e53565b80516000908190811a60808110156141c457600191506142d5565b60b88110156141d957607e19810191506142d5565b60c081101561425357600060b78203600186019550806020036101000a86510491506001810182019350508083101561424d576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b506142d5565b60f88110156142685760be19810191506142d5565b600060f78203600186019550806020036101000a8651049150600181018201935050808310156142d3576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b80516000906142ed57506000610e53565b600080905060006143018460200151614146565b602085015185519181019250015b8082101561432f57614320826141a9565b6001909301929091019061430f565b50909392505050565b6040518060c001604052806000801916815260200160006001600160a01b03168152602001606081526020016060815260200160608152602001600067ffffffffffffffff1681525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60408051608081018252600080825260208201819052918101829052606081019190915290565b604051806080016040528060006001600160a01b031681526020016060815260200160608152602001600063ffffffff1681525090565b604051806040016040528061442a614437565b8152602001600081525090565b60405180604001604052806000815260200160008152509056fe746865206d6573736167652073656e646572206d75737420626520696e63656e746976697a6520636f6e7472616374466f72206d696e69546f6b656e2c20746865207472616e7366657220616d6f756e74206d757374206e6f74206265206c657373207468616e2031756e7265636f676e697a6564207472616e736665724f75742073796e207061636b61676565787069726554696d65206d7573742062652074776f206d696e75746573206c61746572616d6f756e7420697320746f6f206c617267652c20657863656564206d6178696d756d206265703220746f6b656e20616d6f756e7474686520636f6e747261637420686173206e6f74206265656e20626f756e6420746f20616e79206265703220746f6b656e726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e736665724f757420424e4220616d6f756e7420616e64206d696e696d756d2072656c6179466565616d6f756e7420697320746f6f206c617267652c2075696e74323536206f766572666c6f774c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620726566756e644164647273696e76616c6964207472616e7366657220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e20746865206d696e696d756d2072656c6179466565746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374756e7265636f676e697a6564207472616e736665724f75742061636b207061636b6167654c656e677468206f6620726563697069656e74416464727320646f65736e277420657175616c20746f206c656e677468206f6620616d6f756e7473746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d73672073656e646572206d75737420626520746f6b656e4d616e6167657274686520636f6e7472616374206e6f7420696e69742079657400000000000000726563656976656420424e4220616d6f756e742073686f756c64206265206e6f206c657373207468616e207468652073756d206f66207472616e7366657220424e4220616d6f756e7420616e642072656c6179466565696e76616c696420726563656976656420424e4220616d6f756e743a20707265636973696f6e206c6f737320696e20616d6f756e7420636f6e76657273696f6ea26469706673582212206bf288411e92c39e8bfa404a8ee503fc38d3755589e06dd625f2e66aefbcbd2264736f6c63430006040033", + }, + { + ContractAddr: RelayerIncentivizeContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/af4f3993303213052222f55c721e661862d19638", + Code: "6080604052600436106102815760003560e01c8063930e1b091161014f578063bd4cc830116100c1578063e75d72c71161007a578063e75d72c7146107b5578063e89a3020146107e8578063f9a2bbc714610812578063fc3e590814610827578063fd6a68791461083c578063fdd31fcd1461085157610288565b8063bd4cc83014610722578063c81b16621461074c578063d0ab528a14610761578063dc927faf14610776578063dcae76ab1461078b578063e1c7392a146107a057610288565b8063a78abc1611610113578063a78abc16146105d3578063a7c6a59d146105e8578063ab51bb96146105fd578063ac43175114610612578063ace9fcc2146106e3578063af400681146106f857610288565b8063930e1b091461054c57806396713da91461057f5780639dc0926214610594578063a1a11bf5146105a9578063a3c3c0ad146105be57610288565b806343756e5c116101f35780636f93d2e6116101ac5780636f93d2e61461048457806370fd5bad146104e357806374f2272d146104f857806375d47a0a1461050d5780637942fd05146105225780637e146cc51461053757610288565b806343756e5c146103ef578063493279b1146104045780634bf6c8821461043057806351e8067214610445578063541333071461045a5780636e47b4821461046f57610288565b806312950c461161024557806312950c46146103215780631b20087c146103365780631c6433121461034b5780633a9756121461028d5780633dffc3871461039157806340bb43c0146103bc57610288565b8063081e9d131461028d57806308f2ec06146102b4578063093f2fc4146102c95780630bee7a67146102de57806310e06a761461030c57610288565b3661028857005b600080fd5b34801561029957600080fd5b506102a2610884565b60408051918252519081900360200190f35b3480156102c057600080fd5b506102a2610889565b3480156102d557600080fd5b506102a261088e565b3480156102ea57600080fd5b506102f3610893565b6040805163ffffffff9092168252519081900360200190f35b34801561031857600080fd5b506102a2610898565b34801561032d57600080fd5b506102a261089e565b34801561034257600080fd5b506102a26108a4565b34801561035757600080fd5b506103756004803603602081101561036e57600080fd5b50356108aa565b604080516001600160a01b039092168252519081900360200190f35b34801561039d57600080fd5b506103a6610884565b6040805160ff9092168252519081900360200190f35b3480156103c857600080fd5b506102a2600480360360208110156103df57600080fd5b50356001600160a01b03166108d1565b3480156103fb57600080fd5b506103756108e3565b34801561041057600080fd5b506104196108e9565b6040805161ffff9092168252519081900360200190f35b34801561043c57600080fd5b506103a66108ef565b34801561045157600080fd5b506103756108f4565b34801561046657600080fd5b506102a2610893565b34801561047b57600080fd5b506103756108fa565b34801561049057600080fd5b506104cf600480360360808110156104a757600080fd5b506001600160a01b038135811691602081013590911690604081013590606001351515610900565b604080519115158252519081900360200190f35b3480156104ef57600080fd5b506103a6610d92565b34801561050457600080fd5b506102a2610d97565b34801561051957600080fd5b50610375610d9d565b34801561052e57600080fd5b506103a6610da3565b34801561054357600080fd5b506102a2610da8565b34801561055857600080fd5b506102a26004803603602081101561056f57600080fd5b50356001600160a01b0316610dad565b34801561058b57600080fd5b506103a6610dbf565b3480156105a057600080fd5b50610375610dc4565b3480156105b557600080fd5b50610375610dca565b3480156105ca57600080fd5b506102a2610dd0565b3480156105df57600080fd5b506104cf610dd6565b3480156105f457600080fd5b506102a2610ddf565b34801561060957600080fd5b506102f3610de5565b34801561061e57600080fd5b506106e16004803603604081101561063557600080fd5b81019060208101813564010000000081111561065057600080fd5b82018360208201111561066257600080fd5b8035906020019184600183028401116401000000008311171561068457600080fd5b9193909290916020810190356401000000008111156106a257600080fd5b8201836020820111156106b457600080fd5b803590602001918460018302840111640100000000831117156106d657600080fd5b509092509050610dea565b005b3480156106ef57600080fd5b506102a2611538565b34801561070457600080fd5b506102a26004803603602081101561071b57600080fd5b503561153e565b34801561072e57600080fd5b506102a26004803603602081101561074557600080fd5b5035611599565b34801561075857600080fd5b506103756115b2565b34801561076d57600080fd5b506102a26115b8565b34801561078257600080fd5b506103756115be565b34801561079757600080fd5b506102a26115c4565b3480156107ac57600080fd5b506106e16115ca565b3480156107c157600080fd5b506106e1600480360360208110156107d857600080fd5b50356001600160a01b0316611693565b3480156107f457600080fd5b506103756004803603602081101561080b57600080fd5b50356117ec565b34801561081e57600080fd5b506103756117f9565b34801561083357600080fd5b506103a66117ff565b34801561084857600080fd5b50610375611804565b34801561085d57600080fd5b506102a26004803603602081101561087457600080fd5b50356001600160a01b031661180a565b600181565b602881565b605081565b606481565b600b5481565b60015481565b600c5481565b600681815481106108b757fe5b6000918252602090912001546001600160a01b0316905081565b60076020526000908152604090205481565b61100181565b61058981565b600881565b61200081565b61100581565b6000805460ff16610958576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e7472616374206e6f7420696e69742079657400000000000000604482015290519081900360640190fd5b33612000146109985760405162461bcd60e51b815260040180806020018281038252602f815260200180612378602f913960400191505060405180910390fd5b60008215610a4b576110026001600160a01b0316639a99b4f06110056109c9600e548861181c90919063ffffffff16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a1857600080fd5b505af1158015610a2c573d6000803e3d6000fd5b505050506040513d6020811015610a4257600080fd5b50519050610b5a565b604080516309a99b4f60e41b8152611005600482015260248101869052905161100491639a99b4f09160448083019260209291908290030181600087803b158015610a9557600080fd5b505af1158015610aa9573d6000803e3d6000fd5b505050506040513d6020811015610abf57600080fd5b5051600e5490915015610b5a57600e54604080516309a99b4f60e41b81526110056004820152602481019290925251610b579161100291639a99b4f0916044808201926020929091908290030181600087803b158015610b1e57600080fd5b505af1158015610b32573d6000803e3d6000fd5b505050506040513d6020811015610b4857600080fd5b5051829063ffffffff61181c16565b90505b600c805460010190556000610b6e8261187f565b600954909150610b84908263ffffffff61181c16565b600955600a54610bac908290610ba0908563ffffffff61181c16565b9063ffffffff6118a816565b600a556001600160a01b038716600090815260056020526040902054610c1857600680546001810182556000919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0389161790555b6001600160a01b038088166000908152600560209081526040808320805460010190559289168252600790522054610c9657600880546001810182556000919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038616600090815260076020526040902080546001019055600c54606411610d8557600b54600954600a5460408051938452602084019290925282820152517f2649b1b772a1a74bd332a67695e285317dd722941166595741c60a00fa65bb759181900360600190a16000610d106118ea565b90506000610d1c611bce565b6001600160a01b0389166000908152600d6020526040902054909150610d5a908290610d4e908563ffffffff61181c16565b9063ffffffff61181c16565b6001600160a01b0389166000908152600d6020526040812091909155600b80546001019055600c5550505b5060019695505050505050565b600281565b60035481565b61100881565b600b81565b600581565b60056020526000908152604090205481565b600981565b61100781565b61100681565b600a5481565b60005460ff1681565b60045481565b600081565b3361100714610e2a5760405162461bcd60e51b815260040180806020018281038252602e8152602001806122bd602e913960400191505060405180910390fd5b60005460ff16610e6b5760405162461bcd60e51b81526004018080602001828103825260218152602001806122eb6021913960400191505060405180910390fd5b610edf84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601f81527f68656164657252656c61796572526577617264526174654d6f6c6563756c650060208201529150611e4c9050565b15610fac5760208114610f235760405162461bcd60e51b81526004018080602001828103825260328152602001806123a76032913960400191505060405180910390fd5b604080516020601f8401819004810282018101909252828152600091610f6191858580838501838280828437600092019190915250611f3392505050565b9050600254811115610fa45760405162461bcd60e51b81526004018080602001828103825260608152602001806121966060913960600191505060405180910390fd5b6001556114a6565b61100584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051606081019091526022808252909250905061229b6020830139611e4c565b156110dd57602081146110495760405162461bcd60e51b815260040180806020018281038252602e81526020018061224c602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161108791858580838501838280828437600092019190915250611f3392505050565b9050801580159061109a57506001548110155b6110d55760405162461bcd60e51b815260040180806020018281038252606c81526020018061230c606c913960800191505060405180910390fd5b6002556114a6565b61115184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601a81527f63616c6c6572436f6d70656e736174696f6e4d6f6c6563756c6500000000000060208201529150611e4c9050565b1561121e57602081146111955760405162461bcd60e51b815260040180806020018281038252602e81526020018061224c602e913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916111d391858580838501838280828437600092019190915250611f3392505050565b90506004548111156112165760405162461bcd60e51b81526004018080602001828103825260568152602001806121f66056913960600191505060405180910390fd5b6003556114a6565b61129284848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601d81527f63616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f7200000060208201529150611e4c9050565b1561136a57602081146112d65760405162461bcd60e51b815260040180806020018281038252602e81526020018061224c602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161131491858580838501838280828437600092019190915250611f3392505050565b9050801580159061132757506003548110155b6113625760405162461bcd60e51b81526004018080602001828103825260618152602001806121076061913960800191505060405180910390fd5b6004556114a6565b6113de84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505060408051808201909152601b81527f64796e616d69634578747261496e63656e74697665416d6f756e74000000000060208201529150611e4c9050565b1561146957602081146114225760405162461bcd60e51b815260040180806020018281038252602e815260200180612168602e913960400191505060405180910390fd5b604080516020601f840181900481028201810190925282815260009161146091858580838501838280828437600092019190915250611f3392505050565b600e55506114a6565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60025481565b60006028821161154f575080611594565b816028108015611560575060508211155b1561156d57506028611594565b60508211801561157e5750606e8211155b1561158e57506078819003611594565b50600481045b919050565b6000602882116115aa575080611594565b506028611594565b61100281565b600e5481565b61100381565b60095481565b60005460ff1615611622576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b60005460ff1615611670576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b60018080556005600255600381905560506004556000805460ff19169091179055565b6001600160a01b0381166000908152600d6020526040902054806116f2576040805162461bcd60e51b81526020600482015260116024820152701b9bc81c995b185e595c881c995dd85c99607a1b604482015290519081900360640190fd5b6001600160a01b0382166000818152600d60205260408082208290555184929184156108fc02918591818181858888f193505050506117a25760405161100290819084156108fc029085906000818181858888f1935050505015801561175c573d6000803e3d6000fd5b506040805161100281526020810185905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a15050506117e9565b604080516001600160a01b03851681526020810184905281517f24502838a334c8f2bb2ee1f8262a4fa7183e4489a717e96cc824e325f8b39e11929181900390910190a150505b50565b600881815481106108b757fe5b61100081565b600381565b61100481565b600d6020526000908152604090205481565b600082820183811015611876576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061187960025461189c60015485611f3890919063ffffffff16565b9063ffffffff611f9116565b600061187683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611fd3565b600954600680546040805160208084028201810190925282815260009493859360609383018282801561194657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611928575b505050505090506060815160405190808252806020026020018201604052801561197a578160200160208202803683370190505b50905060005b8251811015611a0757600083828151811061199757fe5b6020026020010151905060006119d160056000846001600160a01b03166001600160a01b0316815260200190815260200160002054611599565b9050808484815181106119e057fe5b60209081029190910101526119fb868263ffffffff61181c16565b95505050600101611980565b506000611a2560045461189c60035488611f3890919063ffffffff16565b9050611a37858263ffffffff6118a816565b94508460015b8451811015611b0e576000611a728761189c8a888681518110611a5c57fe5b6020026020010151611f3890919063ffffffff16565b9050611abf81600d6000898681518110611a8857fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205461181c90919063ffffffff16565b600d6000888581518110611acf57fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611b03838263ffffffff6118a816565b925050600101611a3d565b50611b2481600d600087600081518110611a8857fe5b600d600086600081518110611b3557fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002081905550600060098190555060008090505b8451811015611bb65760056000868381518110611b8857fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611b6f565b50611bc3600660006120cf565b509450505050505b90565b600a546008805460408051602080840282018101909252828152600094938593606093830182828015611c2a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c0c575b5050505050905060608151604051908082528060200260200182016040528015611c5e578160200160208202803683370190505b50905060005b8251811015611cdd576000838281518110611c7b57fe5b602002602001015190506000611cb560076000846001600160a01b03166001600160a01b031681526020019081526020016000205461153e565b905080848481518110611cc457fe5b6020908102919091010152949094019350600101611c64565b506000611cfb60045461189c60035488611f3890919063ffffffff16565b9050611d0d858263ffffffff6118a816565b94508460015b8451811015611d97576000611d328761189c8a888681518110611a5c57fe5b9050611d4881600d6000898681518110611a8857fe5b600d6000888581518110611d5857fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055611d8c838263ffffffff6118a816565b925050600101611d13565b50611dad81600d600087600081518110611a8857fe5b600d600086600081518110611dbe57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055506000600a8190555060008090505b8451811015611e3f5760076000868381518110611e1157fe5b6020908102919091018101516001600160a01b03168252810191909152604001600090812055600101611df8565b50611bc3600860006120cf565b6000816040516020018082805190602001908083835b60208310611e815780518252601f199092019160209182019101611e62565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310611eef5780518252601f199092019160209182019101611ed0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014905092915050565b015190565b600082611f4757506000611879565b82820282848281611f5457fe5b04146118765760405162461bcd60e51b815260040180806020018281038252602181526020018061227a6021913960400191505060405180910390fd5b600061187683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061206a565b600081848411156120625760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561202757818101518382015260200161200f565b50505050905090810190601f1680156120545780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836120b95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561202757818101518382015260200161200f565b5060008385816120c557fe5b0495945050505050565b50805460008255906000526020600020908101906117e99190611bcb91905b8082111561210257600081556001016120ee565b509056fe746865206e657743616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c656c656e677468206f662064796e616d69634578747261496e63656e74697665416d6f756e74206d69736d617463686e65772068656164657252656c61796572526577617264526174654d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2068656164657252656c617965725265776172645261746544656e6f6d696e61746f726e65772063616c6c6572436f6d70656e736174696f6e4d6f6c6563756c652073686f756c646e27742062652067726561746572207468616e2063616c6c6572436f6d70656e736174696f6e44656e6f6d696e61746f726c656e677468206f6620726577617264466f7256616c696461746f725365744368616e6765206d69736d61746368536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7768656164657252656c617965725265776172645261746544656e6f6d696e61746f72746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374636f6e747261637420686173206e6f74206265656e20696e697469616c697a6564746865206e65772068656164657252656c617965725265776172645261746544656e6f6d696e61746f72206d757374206e6f74206265207a65726f20616e64206e6f206c657373207468616e2068656164657252656c61796572526577617264526174654d6f6c6563756c65746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e74726163746c656e677468206f662068656164657252656c61796572526577617264526174654d6f6c6563756c65206d69736d61746368a26469706673582212207a24978ed859d46a1f36ba9c4c45eceb74a8f17d4d915a392823cce41e2fa19e64736f6c63430006040033", + }, + }, + } + + brunoUpgrade[mainNet] = &Upgrade{ + UpgradeName: "bruno", + Configs: []*UpgradeConfig{ + { + ContractAddr: ValidatorContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/ce622fef469d84ee418fa6181f3ac962412a5f4f", + Code: "6080604052600436106102e45760003560e01c80638624988211610190578063c8509d81116100dc578063eb57e20211610095578063f9a2bbc71161006f578063f9a2bbc714610a54578063fc3e590814610a69578063fccc281314610a7e578063fd6a687914610a93576102e4565b8063eb57e202146109e6578063eda5868c14610a19578063f340fa0114610a2e576102e4565b8063c8509d81146106d8578063d86222d51461097d578063daacdb6614610992578063dc927faf146109a7578063e086c7b1146109bc578063e1c7392a146109d1576102e4565b8063aaf5eb6811610149578063ad3c9da611610123578063ad3c9da6146108d0578063b7ab4db514610903578063bf9f4995146104c0578063c81b166214610968576102e4565b8063aaf5eb68146107db578063ab51bb96146107f0578063ac43175114610805576102e4565b8063862498821461075d57806396713da9146107725780639dc0926214610787578063a1a11bf51461079c578063a5422d5c146107b1578063a78abc16146107c6576102e4565b806351e806721161024f57806370fd5bad116102085780637942fd05116101e25780637942fd05146106ae57806381650b62146106c3578063831d65d1146106d8578063853230aa14610699576102e4565b806370fd5bad1461066f57806375d47a0a1461068457806378dfed4a14610699576102e4565b806351e8067214610572578063565c56b3146105875780635667515a146105ba5780635d77156c146105cf5780636969a25c146105e45780636e47b4821461065a576102e4565b80633de0f0d8116102a15780633de0f0d8146104ab5780633dffc387146104c057806343756e5c146104eb578063493279b11461051c5780634bf6c882146105485780635192c82c1461055d576102e4565b80630bee7a67146102e95780631182b87514610317578063152ad3b8146104115780631ff180691461043a578063219f22d51461046157806335409f7f14610476575b600080fd5b3480156102f557600080fd5b506102fe610aa8565b6040805163ffffffff9092168252519081900360200190f35b34801561032357600080fd5b5061039c6004803603604081101561033a57600080fd5b60ff8235169190810190604081016020820135600160201b81111561035e57600080fd5b82018360208201111561037057600080fd5b803590602001918460018302840111600160201b8311171561039157600080fd5b509092509050610aad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d65781810151838201526020016103be565b50505050905090810190601f1680156104035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041d57600080fd5b50610426610c9a565b604080519115158252519081900360200190f35b34801561044657600080fd5b5061044f610ca3565b60408051918252519081900360200190f35b34801561046d57600080fd5b506102fe610ca9565b34801561048257600080fd5b506104a96004803603602081101561049957600080fd5b50356001600160a01b0316610cae565b005b3480156104b757600080fd5b5061044f610fc2565b3480156104cc57600080fd5b506104d5610fc8565b6040805160ff9092168252519081900360200190f35b3480156104f757600080fd5b50610500610fcd565b604080516001600160a01b039092168252519081900360200190f35b34801561052857600080fd5b50610531610fd3565b6040805161ffff9092168252519081900360200190f35b34801561055457600080fd5b506104d5610fd8565b34801561056957600080fd5b5061044f610fdd565b34801561057e57600080fd5b50610500610fe3565b34801561059357600080fd5b5061044f600480360360208110156105aa57600080fd5b50356001600160a01b0316610fe9565b3480156105c657600080fd5b506104d561103b565b3480156105db57600080fd5b506102fe611040565b3480156105f057600080fd5b5061060e6004803603602081101561060757600080fd5b5035611045565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b34801561066657600080fd5b506105006110a9565b34801561067b57600080fd5b506104d56110af565b34801561069057600080fd5b506105006110b4565b3480156106a557600080fd5b5061044f6110ba565b3480156106ba57600080fd5b506104d56110c0565b3480156106cf57600080fd5b506102fe6110c5565b3480156106e457600080fd5b506104a9600480360360408110156106fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071f57600080fd5b82018360208201111561073157600080fd5b803590602001918460018302840111600160201b8311171561075257600080fd5b5090925090506110ca565b34801561076957600080fd5b5061044f61117d565b34801561077e57600080fd5b506104d5611183565b34801561079357600080fd5b50610500611188565b3480156107a857600080fd5b5061050061118e565b3480156107bd57600080fd5b5061039c611194565b3480156107d257600080fd5b506104266111b3565b3480156107e757600080fd5b5061044f6111bc565b3480156107fc57600080fd5b506102fe61103b565b34801561081157600080fd5b506104a96004803603604081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460018302840111600160201b831117156108c557600080fd5b5090925090506111c5565b3480156108dc57600080fd5b5061044f600480360360208110156108f357600080fd5b50356001600160a01b03166115bc565b34801561090f57600080fd5b506109186115ce565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561095457818101518382015260200161093c565b505050509050019250505060405180910390f35b34801561097457600080fd5b506105006116f4565b34801561098957600080fd5b5061044f6116fa565b34801561099e57600080fd5b5061044f611706565b3480156109b357600080fd5b5061050061170c565b3480156109c857600080fd5b5061044f611712565b3480156109dd57600080fd5b506104a9611717565b3480156109f257600080fd5b506104a960048036036020811015610a0957600080fd5b50356001600160a01b031661191a565b348015610a2557600080fd5b506102fe611ae9565b6104a960048036036020811015610a4457600080fd5b50356001600160a01b0316611aee565b348015610a6057600080fd5b50610500611df3565b348015610a7557600080fd5b506104d5611df9565b348015610a8a57600080fd5b50610500611dfe565b348015610a9f57600080fd5b50610500611e04565b606481565b60005460609060ff16610b03576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610b435760405162461bcd60e51b815260040180806020018281038252602f815260200180614951602f913960400191505060405180910390fd5b610b4b614158565b6000610b8c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0a92505050565b9150915080610ba857610b9f6064611f63565b92505050610c93565b815160009060ff16610bc857610bc18360200151611fc4565b9050610c5f565b825160ff1660011415610c5b57826020015151600114610c35577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260258152602001806142866025913960400191505060405180910390a1506067610c56565b610bc18360200151600081518110610c4957fe5b6020026020010151612dca565b610c5f565b5060655b63ffffffff8116610c845750506040805160008152602081019091529150610c939050565b610c8d81611f63565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b3361100114610cee5760405162461bcd60e51b81526004018080602001828103825260298152602001806149ad6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610d125750610fbf565b600181039050600060018281548110610d2757fe5b60009182526020909120600360049092020101546001549091506000190180610d7657600060018481548110610d5957fe5b906000526020600020906004020160030181905550505050610fbf565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610ef857600180546000198101908110610ded57fe5b906000526020600020906004020160018481548110610e0857fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610ecd57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610f0357fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610f5657fe5b0490508015610fba5760015460005b81811015610fb7578260018281548110610f7b57fe5b9060005260206000209060040201600301540160018281548110610f9b57fe5b6000918252602090912060036004909202010155600101610f65565b50505b505050505b50565b61271081565b600181565b61100181565b603881565b600881565b60065481565b61200081565b6001600160a01b03811660009081526004602052604081205480611011576000915050611036565b60018082038154811061102057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b6001818154811061105257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b606681565b336120001461110a5760405162461bcd60e51b815260040180806020018281038252602f815260200180614951602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600981565b61100781565b61100681565b6040518061062001604052806105ef81526020016143626105ef913981565b60005460ff1681565b6402540be40081565b60005460ff16611218576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146112585760405162461bcd60e51b815260040180806020018281038252602e8152602001806142cc602e913960400191505060405180910390fd5b6112c284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612f419050565b1561139d57602081146113065760405162461bcd60e51b815260040180806020018281038252602681526020018061431b6026913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916113449185858083850183828082843760009201919091525061302992505050565b90506064811015801561135a5750620186a08111155b6113955760405162461bcd60e51b815260040180806020018281038252602781526020018061425f6027913960400191505060405180910390fd5b60025561152a565b6113fd84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150612f419050565b156114ed5760208114611457576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916114959185858083850183828082843760009201919091525061302992505050565b90506127108111156114d85760405162461bcd60e51b815260040180806020018281038252602b815260200180614209602b913960400191505060405180910390fd5b6006556007805460ff1916600117905561152a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561161f57600181815481106115ed57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611617576001909101905b6001016115d8565b5060608160405190808252806020026020018201604052801561164c578160200160208202803683370190505b50600092509050815b838110156116ec576001818154811061166a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116e4576001818154811061169a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106116c557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611655565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561176f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611777614158565b600061179d6040518061062001604052806105ef81526020016143626105ef9139611e0a565b91509150806117dd5760405162461bcd60e51b81526004018080602001828103825260218152602001806143416021913960400191505060405180910390fd5b60005b826020015151811015611902576001836020015182815181106117ff57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106118d557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016117e0565b50506103e8600255506000805460ff19166001179055565b336110011461195a5760405162461bcd60e51b81526004018080602001828103825260298152602001806149ad6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061197e5750610fbf565b60018103905060006001828154811061199357fe5b90600052602060002090600402016003015490506000600183815481106119b657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a280611a2557505050610fbf565b6000818381611a3057fe5b0490508015610fba5760005b84811015611a8e578160018281548110611a5257fe5b9060005260206000209060040201600301540160018281548110611a7257fe5b6000918252602090912060036004909202010155600101611a3c565b50600180549085015b81811015610fb7578260018281548110611aad57fe5b9060005260206000209060040201600301540160018281548110611acd57fe5b6000918252602090912060036004909202010155600101611a97565b606581565b334114611b2c5760405162461bcd60e51b815260040180806020018281038252602d815260200180614980602d913960400191505060405180910390fd5b60005460ff16611b7f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60003411611bcc576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615611bfc57506006545b600083118015611c0c5750600081115b15611cb5576000611c35612710611c29868563ffffffff61302e16565b9063ffffffff61308716565b90508015611cb35760405161dead9082156108fc029083906000818181858888f19350505050158015611c6c573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1611cb0848263ffffffff6130c916565b93505b505b8115611dad576000600180840381548110611ccc57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611d37576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611da7565b600354611d4a908563ffffffff61310b16565b6003908155810154611d62908563ffffffff61310b16565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611ded565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b61100081565b600381565b61dead81565b61100481565b611e12614158565b6000611e1c614158565b611e24614170565b611e35611e3086613165565b61318a565b90506000805b611e44836131d4565b15611f555780611e6957611e5f611e5a846131f5565b613243565b60ff168452611f4d565b8060011415611f48576060611e85611e80856131f5565b6132fa565b90508051604051908082528060200260200182016040528015611ec257816020015b611eaf614190565b815260200190600190039081611ea75790505b50602086015260005b8151811015611f3d57611edc614190565b6000611efa848481518110611eed57fe5b60200260200101516133cb565b9150915080611f1757876000995099505050505050505050611f5e565b8188602001518481518110611f2857fe5b60209081029190910101525050600101611ecb565b506001925050611f4d565b611f55565b600101611e3b565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611f7d579050509050611fa38363ffffffff166134a8565b81600081518110611fb057fe5b6020026020010181905250610c93816134bb565b6000806060611fd284613545565b915091508161207f577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561203a578181015183820152602001612022565b50505050905090810190601f1680156120675780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050611036565b600080805b6001548110156120fc5767016345785d8a0000600182815481106120a457fe5b906000526020600020906004020160030154106120c6576001909201916120f4565b6000600182815481106120d557fe5b90600052602060002090600402016003015411156120f4576001909101905b600101612084565b50606082604051908082528060200260200182016040528015612129578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015612158578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015612187578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156121b6578160200160208202803683370190505b50905060006060866040519080825280602002602001820160405280156121e7578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015612216578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d602081101561228d57600080fd5b5051905067016345785d8a0000811115612302577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260218152602001806142fa6021913960400191505060405180910390a160689d5050505050505050505050505050611036565b60005b6001548110156125755767016345785d8a00006001828154811061232557fe5b906000526020600020906004020160030154106124ab576001818154811061234957fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061237a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106123af57fe5b906000526020600020906004020160030154816123c857fe5b06600183815481106123d657fe5b9060005260206000209060040201600301540390506123fe83826130c990919063ffffffff16565b8a8e8151811061240a57fe5b6020026020010181815250506001828154811061242357fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061245457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061248157fe5b602090810291909101015261249c878263ffffffff61310b16565b6001909d019c965061256d9050565b6000600182815481106124ba57fe5b906000526020600020906004020160030154111561256d57600181815481106124df57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061251057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061253d57fe5b906000526020600020906004020160030154848c8151811061255b57fe5b60209081029190910101526001909a01995b600101612305565b50600085156129b3576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156126075781810151838201526020016125ef565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561264657818101518382015260200161262e565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561268557818101518382015260200161266d565b505050509050019750505050505050506020604051808303818588803b1580156126ae57600080fd5b505af1935050505080156126d457506040513d60208110156126cf57600080fd5b505160015b61290f576040516000815260443d10156126f05750600061278b565b60046000803e60005160e01c6308c379a0811461271157600091505061278b565b60043d036004833e81513d60248201116001600160401b038211171561273c5760009250505061278b565b80830180516001600160401b0381111561275d57600094505050505061278b565b8060208301013d860181111561277b5760009550505050505061278b565b601f01601f191660405250925050505b80612796575061283a565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127fa5781810151838201526020016127e2565b50505050905090810190601f1680156128275780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061290a565b3d808015612864576040519150601f19603f3d011682016040523d82523d6000602084013e612869565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128ce5781810151838201526020016128b6565b50505050905090810190601f1680156128fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6129b3565b801561294d576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16129b1565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015612b695760005b8851811015612b675760008982815181106129d357fe5b602002602001015190506000600182815481106129ec57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110612a1d57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015612ad95760018281548110612a5e57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110612aad57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612b5d565b60018281548110612ae657fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110612b3557fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016129bc565b505b845115612cb35760005b8551811015612cb1576000868281518110612b8a57fe5b60200260200101516001600160a01b03166108fc878481518110612baa57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015612c4057868281518110612be057fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d878481518110612c1e57fe5b60200260200101516040518082815260200191505060405180910390a2612ca8565b868281518110612c4c57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d878481518110612c8a57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101612b73565b505b4715612d1c576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612d1a573d6000803e3d6000fd5b505b60006003819055600555825115612d3657612d3683613627565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d7357600080fd5b505af1158015612d87573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612e1b5750600180820381548110612dfb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612e615782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611036565b600154600554600019820111801590612eb75784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611036565b600580546001908101909155805481906000198601908110612ed557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612f765780518252601f199092019160209182019101612f57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612fe45780518252601f199092019160209182019101612fc5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60008261303d57506000613023565b8282028284828161304a57fe5b0414610c935760405162461bcd60e51b81526004018080602001828103825260218152602001806142ab6021913960400191505060405180910390fd5b6000610c9383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae8565b6000610c9383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8a565b600082820183811015610c93576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61316d6141c5565b506040805180820190915281518152602082810190820152919050565b613192614170565b61319b82613be4565b6131a457600080fd5b60006131b38360200151613c1e565b60208085015160408051808201909152868152920190820152915050919050565b60006131de6141c5565b505080518051602091820151919092015191011190565b6131fd6141c5565b613206826131d4565b61320f57600080fd5b6020820151600061321f82613c81565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061325857508151602110155b61326157600080fd5b60006132708360200151613c1e565b905080836000015110156132cb576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156132f157826020036101000a820491505b50949350505050565b606061330582613be4565b61330e57600080fd5b600061331983613db4565b905060608160405190808252806020026020018201604052801561335757816020015b6133446141c5565b81526020019060019003908161333c5790505b50905060006133698560200151613c1e565b60208601510190506000805b848110156133c05761338683613c81565b91506040518060400160405280838152602001848152508482815181106133a957fe5b602090810291909101015291810191600101613375565b509195945050505050565b6133d3614190565b60006133dd614190565b6133e5614170565b6133ee8561318a565b90506000805b6133fd836131d4565b15611f55578061342857613418613413846131f5565b613e10565b6001600160a01b031684526134a0565b80600114156134505761343d613413846131f5565b6001600160a01b031660208501526134a0565b806002141561347857613465613413846131f5565b6001600160a01b031660408501526134a0565b8060031415611f485761348d611e5a846131f5565b6001600160401b03166060850152600191505b6001016133f4565b60606130236134b683613e2a565b613f10565b60608151600014156134dc5750604080516000815260208101909152611036565b6060826000815181106134eb57fe5b602002602001015190506000600190505b835181101561352c576135228285838151811061351557fe5b6020026020010151613f62565b91506001016134fc565b50610c9361353f825160c060ff16613fdf565b82613f62565b600060606029835111156135775760006040518060600160405280602981526020016141e06029913991509150611f5e565b60005b835181101561360d5760005b818110156136045784818151811061359a57fe5b6020026020010151600001516001600160a01b03168583815181106135bb57fe5b6020026020010151600001516001600160a01b031614156135fc5760006040518060600160405280602b8152602001614234602b9139935093505050611f5e565b600101613586565b5060010161357a565b505060408051602081019091526000815260019150915091565b600154815160005b82811015613744576001613641614190565b6001838154811061364e57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613718578681815181106136de57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156137105760009250613718565b6001016136ca565b50811561373a5780516001600160a01b03166000908152600460205260408120555b505060010161362f565b50808211156137b957805b828110156137b757600180548061376257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b031916905560039091019190915591550161374f565b505b60008183106137c857816137ca565b825b905060005b818110156139c45761387c8582815181106137e657fe5b6020026020010151600183815481106137fb57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526140d7565b61399757806001016004600087848151811061389457fe5b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020819055508481815181106138d057fe5b6020026020010151600182815481106138e557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101556139bc565b6000600182815481106139a657fe5b9060005260206000209060040201600301819055505b6001016137cf565b5082821115611ded57825b82811015610fba5760018582815181106139e557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a09092015160039093019290925587519084019290889085908110613abb57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016139cf565b60008183613b745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b39578181015183820152602001613b21565b50505050905090810190601f168015613b665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8057fe5b0495945050505050565b60008184841115613bdc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b39578181015183820152602001613b21565b505050900390565b8051600090613bf557506000611036565b6020820151805160001a9060c0821015613c1457600092505050611036565b5060019392505050565b8051600090811a6080811015613c38576000915050611036565b60b8811080613c53575060c08110801590613c53575060f881105b15613c62576001915050611036565b60c0811015613c765760b519019050611036565b60f519019050611036565b80516000908190811a6080811015613c9c5760019150613dad565b60b8811015613cb157607e1981019150613dad565b60c0811015613d2b57600060b78203600186019550806020036101000a865104915060018101820193505080831015613d25576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613dad565b60f8811015613d405760be1981019150613dad565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613dab576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090613dc557506000611036565b60008090506000613dd98460200151613c1e565b602085015185519181019250015b80821015613e0757613df882613c81565b60019093019290910190613de7565b50909392505050565b8051600090601514613e2157600080fd5b61302382613243565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613e6e57506018613e92565b6fffffffffffffffffffffffffffffffff198416613e8e57506010613e92565b5060005b6020811015613ec857818181518110613ea757fe5b01602001516001600160f81b03191615613ec057613ec8565b600101613e92565b60008160200390506060816040519080825280601f01601f191660200182016040528015613efd576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613f425750607f60f81b82600081518110613f3057fe5b01602001516001600160f81b03191611155b15613f4e575080611036565b613023613f608351608060ff16613fdf565b835b6060806040519050835180825260208201818101602087015b81831015613f93578051835260209283019201613f7b565b50855184518101855292509050808201602086015b81831015613fc0578051835260209283019201613fa8565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061402f576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116140895782840160f81b8160008151811061406b57fe5b60200101906001600160f81b031916908160001a9053509050613023565b606061409485613e2a565b90508381510160370160f81b826000815181106140ad57fe5b60200101906001600160f81b031916908160001a9053506140ce8282613f62565b95945050505050565b805182516000916001600160a01b039182169116148015614111575081602001516001600160a01b031683602001516001600160a01b0316145b8015614136575081604001516001600160a01b031683604001516001600160a01b0316145b8015610c935750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b60405180604001604052806141836141c5565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220b806ba3d9dd9e078bac9726f79b32c9b62db327924a189cc1a9e4e106ffbe50d64736f6c63430006040033", + }, + }, + } + + brunoUpgrade[chapelNet] = &Upgrade{ + UpgradeName: "bruno", + Configs: []*UpgradeConfig{ + { + ContractAddr: ValidatorContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/ce622fef469d84ee418fa6181f3ac962412a5f4f", + Code: "6080604052600436106102e45760003560e01c80638624988211610190578063c8509d81116100dc578063eb57e20211610095578063f9a2bbc71161006f578063f9a2bbc714610a54578063fc3e590814610a69578063fccc281314610a7e578063fd6a687914610a93576102e4565b8063eb57e202146109e6578063eda5868c14610a19578063f340fa0114610a2e576102e4565b8063c8509d81146106d8578063d86222d51461097d578063daacdb6614610992578063dc927faf146109a7578063e086c7b1146109bc578063e1c7392a146109d1576102e4565b8063aaf5eb6811610149578063ad3c9da611610123578063ad3c9da6146108d0578063b7ab4db514610903578063bf9f4995146104c0578063c81b166214610968576102e4565b8063aaf5eb68146107db578063ab51bb96146107f0578063ac43175114610805576102e4565b8063862498821461075d57806396713da9146107725780639dc0926214610787578063a1a11bf51461079c578063a5422d5c146107b1578063a78abc16146107c6576102e4565b806351e806721161024f57806370fd5bad116102085780637942fd05116101e25780637942fd05146106ae57806381650b62146106c3578063831d65d1146106d8578063853230aa14610699576102e4565b806370fd5bad1461066f57806375d47a0a1461068457806378dfed4a14610699576102e4565b806351e8067214610572578063565c56b3146105875780635667515a146105ba5780635d77156c146105cf5780636969a25c146105e45780636e47b4821461065a576102e4565b80633de0f0d8116102a15780633de0f0d8146104ab5780633dffc387146104c057806343756e5c146104eb578063493279b11461051c5780634bf6c882146105485780635192c82c1461055d576102e4565b80630bee7a67146102e95780631182b87514610317578063152ad3b8146104115780631ff180691461043a578063219f22d51461046157806335409f7f14610476575b600080fd5b3480156102f557600080fd5b506102fe610aa8565b6040805163ffffffff9092168252519081900360200190f35b34801561032357600080fd5b5061039c6004803603604081101561033a57600080fd5b60ff8235169190810190604081016020820135600160201b81111561035e57600080fd5b82018360208201111561037057600080fd5b803590602001918460018302840111600160201b8311171561039157600080fd5b509092509050610aad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d65781810151838201526020016103be565b50505050905090810190601f1680156104035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041d57600080fd5b50610426610c9a565b604080519115158252519081900360200190f35b34801561044657600080fd5b5061044f610ca3565b60408051918252519081900360200190f35b34801561046d57600080fd5b506102fe610ca9565b34801561048257600080fd5b506104a96004803603602081101561049957600080fd5b50356001600160a01b0316610cae565b005b3480156104b757600080fd5b5061044f610fc2565b3480156104cc57600080fd5b506104d5610fc8565b6040805160ff9092168252519081900360200190f35b3480156104f757600080fd5b50610500610fcd565b604080516001600160a01b039092168252519081900360200190f35b34801561052857600080fd5b50610531610fd3565b6040805161ffff9092168252519081900360200190f35b34801561055457600080fd5b506104d5610fd8565b34801561056957600080fd5b5061044f610fdd565b34801561057e57600080fd5b50610500610fe3565b34801561059357600080fd5b5061044f600480360360208110156105aa57600080fd5b50356001600160a01b0316610fe9565b3480156105c657600080fd5b506104d561103b565b3480156105db57600080fd5b506102fe611040565b3480156105f057600080fd5b5061060e6004803603602081101561060757600080fd5b5035611045565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b34801561066657600080fd5b506105006110a9565b34801561067b57600080fd5b506104d56110af565b34801561069057600080fd5b506105006110b4565b3480156106a557600080fd5b5061044f6110ba565b3480156106ba57600080fd5b506104d56110c0565b3480156106cf57600080fd5b506102fe6110c5565b3480156106e457600080fd5b506104a9600480360360408110156106fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071f57600080fd5b82018360208201111561073157600080fd5b803590602001918460018302840111600160201b8311171561075257600080fd5b5090925090506110ca565b34801561076957600080fd5b5061044f61117d565b34801561077e57600080fd5b506104d5611183565b34801561079357600080fd5b50610500611188565b3480156107a857600080fd5b5061050061118e565b3480156107bd57600080fd5b5061039c611194565b3480156107d257600080fd5b506104266111b3565b3480156107e757600080fd5b5061044f6111bc565b3480156107fc57600080fd5b506102fe61103b565b34801561081157600080fd5b506104a96004803603604081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460018302840111600160201b831117156108c557600080fd5b5090925090506111c5565b3480156108dc57600080fd5b5061044f600480360360208110156108f357600080fd5b50356001600160a01b03166115bc565b34801561090f57600080fd5b506109186115ce565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561095457818101518382015260200161093c565b505050509050019250505060405180910390f35b34801561097457600080fd5b506105006116f4565b34801561098957600080fd5b5061044f6116fa565b34801561099e57600080fd5b5061044f611706565b3480156109b357600080fd5b5061050061170c565b3480156109c857600080fd5b5061044f611712565b3480156109dd57600080fd5b506104a9611717565b3480156109f257600080fd5b506104a960048036036020811015610a0957600080fd5b50356001600160a01b031661191a565b348015610a2557600080fd5b506102fe611ae9565b6104a960048036036020811015610a4457600080fd5b50356001600160a01b0316611aee565b348015610a6057600080fd5b50610500611df3565b348015610a7557600080fd5b506104d5611df9565b348015610a8a57600080fd5b50610500611dfe565b348015610a9f57600080fd5b50610500611e04565b606481565b60005460609060ff16610b03576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610b435760405162461bcd60e51b815260040180806020018281038252602f81526020018061450d602f913960400191505060405180910390fd5b610b4b614158565b6000610b8c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0a92505050565b9150915080610ba857610b9f6064611f63565b92505050610c93565b815160009060ff16610bc857610bc18360200151611fc4565b9050610c5f565b825160ff1660011415610c5b57826020015151600114610c35577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260258152602001806144316025913960400191505060405180910390a1506067610c56565b610bc18360200151600081518110610c4957fe5b6020026020010151612dca565b610c5f565b5060655b63ffffffff8116610c845750506040805160008152602081019091529150610c939050565b610c8d81611f63565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b3361100114610cee5760405162461bcd60e51b81526004018080602001828103825260298152602001806145696029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610d125750610fbf565b600181039050600060018281548110610d2757fe5b60009182526020909120600360049092020101546001549091506000190180610d7657600060018481548110610d5957fe5b906000526020600020906004020160030181905550505050610fbf565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610ef857600180546000198101908110610ded57fe5b906000526020600020906004020160018481548110610e0857fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610ecd57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610f0357fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610f5657fe5b0490508015610fba5760015460005b81811015610fb7578260018281548110610f7b57fe5b9060005260206000209060040201600301540160018281548110610f9b57fe5b6000918252602090912060036004909202010155600101610f65565b50505b505050505b50565b61271081565b600181565b61100181565b606181565b600881565b60065481565b61200081565b6001600160a01b03811660009081526004602052604081205480611011576000915050611036565b60018082038154811061102057fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b6001818154811061105257fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b606681565b336120001461110a5760405162461bcd60e51b815260040180806020018281038252602f81526020018061450d602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600981565b61100781565b61100681565b604051806101e001604052806101ab81526020016141e06101ab913981565b60005460ff1681565b6402540be40081565b60005460ff16611218576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146112585760405162461bcd60e51b815260040180806020018281038252602e815260200180614477602e913960400191505060405180910390fd5b6112c284848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612f419050565b1561139d57602081146113065760405162461bcd60e51b81526004018080602001828103825260268152602001806144c66026913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916113449185858083850183828082843760009201919091525061302992505050565b90506064811015801561135a5750620186a08111155b6113955760405162461bcd60e51b815260040180806020018281038252602781526020018061440a6027913960400191505060405180910390fd5b60025561152a565b6113fd84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150612f419050565b156114ed5760208114611457576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916114959185858083850183828082843760009201919091525061302992505050565b90506127108111156114d85760405162461bcd60e51b815260040180806020018281038252602b8152602001806143b4602b913960400191505060405180910390fd5b6006556007805460ff1916600117905561152a565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561161f57600181815481106115ed57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611617576001909101905b6001016115d8565b5060608160405190808252806020026020018201604052801561164c578160200160208202803683370190505b50600092509050815b838110156116ec576001818154811061166a57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116e4576001818154811061169a57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106116c557fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611655565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff161561176f576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611777614158565b600061179d604051806101e001604052806101ab81526020016141e06101ab9139611e0a565b91509150806117dd5760405162461bcd60e51b81526004018080602001828103825260218152602001806144ec6021913960400191505060405180910390fd5b60005b826020015151811015611902576001836020015182815181106117ff57fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106118d557fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016117e0565b50506103e8600255506000805460ff19166001179055565b336110011461195a5760405162461bcd60e51b81526004018080602001828103825260298152602001806145696029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061197e5750610fbf565b60018103905060006001828154811061199357fe5b90600052602060002090600402016003015490506000600183815481106119b657fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a280611a2557505050610fbf565b6000818381611a3057fe5b0490508015610fba5760005b84811015611a8e578160018281548110611a5257fe5b9060005260206000209060040201600301540160018281548110611a7257fe5b6000918252602090912060036004909202010155600101611a3c565b50600180549085015b81811015610fb7578260018281548110611aad57fe5b9060005260206000209060040201600301540160018281548110611acd57fe5b6000918252602090912060036004909202010155600101611a97565b606581565b334114611b2c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061453c602d913960400191505060405180910390fd5b60005460ff16611b7f576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60003411611bcc576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615611bfc57506006545b600083118015611c0c5750600081115b15611cb5576000611c35612710611c29868563ffffffff61302e16565b9063ffffffff61308716565b90508015611cb35760405161dead9082156108fc029083906000818181858888f19350505050158015611c6c573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1611cb0848263ffffffff6130c916565b93505b505b8115611dad576000600180840381548110611ccc57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611d37576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611da7565b600354611d4a908563ffffffff61310b16565b6003908155810154611d62908563ffffffff61310b16565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611ded565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b61100081565b600381565b61dead81565b61100481565b611e12614158565b6000611e1c614158565b611e24614170565b611e35611e3086613165565b61318a565b90506000805b611e44836131d4565b15611f555780611e6957611e5f611e5a846131f5565b613243565b60ff168452611f4d565b8060011415611f48576060611e85611e80856131f5565b6132fa565b90508051604051908082528060200260200182016040528015611ec257816020015b611eaf614190565b815260200190600190039081611ea75790505b50602086015260005b8151811015611f3d57611edc614190565b6000611efa848481518110611eed57fe5b60200260200101516133cb565b9150915080611f1757876000995099505050505050505050611f5e565b8188602001518481518110611f2857fe5b60209081029190910101525050600101611ecb565b506001925050611f4d565b611f55565b600101611e3b565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611f7d579050509050611fa38363ffffffff166134a8565b81600081518110611fb057fe5b6020026020010181905250610c93816134bb565b6000806060611fd284613545565b915091508161207f577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561203a578181015183820152602001612022565b50505050905090810190601f1680156120675780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050611036565b600080805b6001548110156120fc5767016345785d8a0000600182815481106120a457fe5b906000526020600020906004020160030154106120c6576001909201916120f4565b6000600182815481106120d557fe5b90600052602060002090600402016003015411156120f4576001909101905b600101612084565b50606082604051908082528060200260200182016040528015612129578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015612158578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015612187578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156121b6578160200160208202803683370190505b50905060006060866040519080825280602002602001820160405280156121e7578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015612216578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561226357600080fd5b505afa158015612277573d6000803e3d6000fd5b505050506040513d602081101561228d57600080fd5b5051905067016345785d8a0000811115612302577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260218152602001806144a56021913960400191505060405180910390a160689d5050505050505050505050505050611036565b60005b6001548110156125755767016345785d8a00006001828154811061232557fe5b906000526020600020906004020160030154106124ab576001818154811061234957fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061237a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106123af57fe5b906000526020600020906004020160030154816123c857fe5b06600183815481106123d657fe5b9060005260206000209060040201600301540390506123fe83826130c990919063ffffffff16565b8a8e8151811061240a57fe5b6020026020010181815250506001828154811061242357fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061245457fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061248157fe5b602090810291909101015261249c878263ffffffff61310b16565b6001909d019c965061256d9050565b6000600182815481106124ba57fe5b906000526020600020906004020160030154111561256d57600181815481106124df57fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061251057fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061253d57fe5b906000526020600020906004020160030154848c8151811061255b57fe5b60209081029190910101526001909a01995b600101612305565b50600085156129b3576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156126075781810151838201526020016125ef565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561264657818101518382015260200161262e565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561268557818101518382015260200161266d565b505050509050019750505050505050506020604051808303818588803b1580156126ae57600080fd5b505af1935050505080156126d457506040513d60208110156126cf57600080fd5b505160015b61290f576040516000815260443d10156126f05750600061278b565b60046000803e60005160e01c6308c379a0811461271157600091505061278b565b60043d036004833e81513d60248201116001600160401b038211171561273c5760009250505061278b565b80830180516001600160401b0381111561275d57600094505050505061278b565b8060208301013d860181111561277b5760009550505050505061278b565b601f01601f191660405250925050505b80612796575061283a565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127fa5781810151838201526020016127e2565b50505050905090810190601f1680156128275780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061290a565b3d808015612864576040519150601f19603f3d011682016040523d82523d6000602084013e612869565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128ce5781810151838201526020016128b6565b50505050905090810190601f1680156128fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6129b3565b801561294d576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16129b1565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015612b695760005b8851811015612b675760008982815181106129d357fe5b602002602001015190506000600182815481106129ec57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110612a1d57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015612ad95760018281548110612a5e57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110612aad57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612b5d565b60018281548110612ae657fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110612b3557fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016129bc565b505b845115612cb35760005b8551811015612cb1576000868281518110612b8a57fe5b60200260200101516001600160a01b03166108fc878481518110612baa57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015612c4057868281518110612be057fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d878481518110612c1e57fe5b60200260200101516040518082815260200191505060405180910390a2612ca8565b868281518110612c4c57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d878481518110612c8a57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101612b73565b505b4715612d1c576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612d1a573d6000803e3d6000fd5b505b60006003819055600555825115612d3657612d3683613627565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d7357600080fd5b505af1158015612d87573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612e1b5750600180820381548110612dfb57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612e615782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611036565b600154600554600019820111801590612eb75784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611036565b600580546001908101909155805481906000198601908110612ed557fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612f765780518252601f199092019160209182019101612f57565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612fe45780518252601f199092019160209182019101612fc5565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60008261303d57506000613023565b8282028284828161304a57fe5b0414610c935760405162461bcd60e51b81526004018080602001828103825260218152602001806144566021913960400191505060405180910390fd5b6000610c9383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae8565b6000610c9383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8a565b600082820183811015610c93576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61316d6141c5565b506040805180820190915281518152602082810190820152919050565b613192614170565b61319b82613be4565b6131a457600080fd5b60006131b38360200151613c1e565b60208085015160408051808201909152868152920190820152915050919050565b60006131de6141c5565b505080518051602091820151919092015191011190565b6131fd6141c5565b613206826131d4565b61320f57600080fd5b6020820151600061321f82613c81565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061325857508151602110155b61326157600080fd5b60006132708360200151613c1e565b905080836000015110156132cb576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156132f157826020036101000a820491505b50949350505050565b606061330582613be4565b61330e57600080fd5b600061331983613db4565b905060608160405190808252806020026020018201604052801561335757816020015b6133446141c5565b81526020019060019003908161333c5790505b50905060006133698560200151613c1e565b60208601510190506000805b848110156133c05761338683613c81565b91506040518060400160405280838152602001848152508482815181106133a957fe5b602090810291909101015291810191600101613375565b509195945050505050565b6133d3614190565b60006133dd614190565b6133e5614170565b6133ee8561318a565b90506000805b6133fd836131d4565b15611f55578061342857613418613413846131f5565b613e10565b6001600160a01b031684526134a0565b80600114156134505761343d613413846131f5565b6001600160a01b031660208501526134a0565b806002141561347857613465613413846131f5565b6001600160a01b031660408501526134a0565b8060031415611f485761348d611e5a846131f5565b6001600160401b03166060850152600191505b6001016133f4565b60606130236134b683613e2a565b613f10565b60608151600014156134dc5750604080516000815260208101909152611036565b6060826000815181106134eb57fe5b602002602001015190506000600190505b835181101561352c576135228285838151811061351557fe5b6020026020010151613f62565b91506001016134fc565b50610c9361353f825160c060ff16613fdf565b82613f62565b6000606060298351111561357757600060405180606001604052806029815260200161438b6029913991509150611f5e565b60005b835181101561360d5760005b818110156136045784818151811061359a57fe5b6020026020010151600001516001600160a01b03168583815181106135bb57fe5b6020026020010151600001516001600160a01b031614156135fc5760006040518060600160405280602b81526020016143df602b9139935093505050611f5e565b600101613586565b5060010161357a565b505060408051602081019091526000815260019150915091565b600154815160005b82811015613744576001613641614190565b6001838154811061364e57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613718578681815181106136de57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156137105760009250613718565b6001016136ca565b50811561373a5780516001600160a01b03166000908152600460205260408120555b505060010161362f565b50808211156137b957805b828110156137b757600180548061376257fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b031916905560039091019190915591550161374f565b505b60008183106137c857816137ca565b825b905060005b818110156139c45761387c8582815181106137e657fe5b6020026020010151600183815481106137fb57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526140d7565b61399757806001016004600087848151811061389457fe5b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020819055508481815181106138d057fe5b6020026020010151600182815481106138e557fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101556139bc565b6000600182815481106139a657fe5b9060005260206000209060040201600301819055505b6001016137cf565b5082821115611ded57825b82811015610fba5760018582815181106139e557fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a09092015160039093019290925587519084019290889085908110613abb57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016139cf565b60008183613b745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b39578181015183820152602001613b21565b50505050905090810190601f168015613b665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8057fe5b0495945050505050565b60008184841115613bdc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b39578181015183820152602001613b21565b505050900390565b8051600090613bf557506000611036565b6020820151805160001a9060c0821015613c1457600092505050611036565b5060019392505050565b8051600090811a6080811015613c38576000915050611036565b60b8811080613c53575060c08110801590613c53575060f881105b15613c62576001915050611036565b60c0811015613c765760b519019050611036565b60f519019050611036565b80516000908190811a6080811015613c9c5760019150613dad565b60b8811015613cb157607e1981019150613dad565b60c0811015613d2b57600060b78203600186019550806020036101000a865104915060018101820193505080831015613d25576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613dad565b60f8811015613d405760be1981019150613dad565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613dab576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090613dc557506000611036565b60008090506000613dd98460200151613c1e565b602085015185519181019250015b80821015613e0757613df882613c81565b60019093019290910190613de7565b50909392505050565b8051600090601514613e2157600080fd5b61302382613243565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613e6e57506018613e92565b6fffffffffffffffffffffffffffffffff198416613e8e57506010613e92565b5060005b6020811015613ec857818181518110613ea757fe5b01602001516001600160f81b03191615613ec057613ec8565b600101613e92565b60008160200390506060816040519080825280601f01601f191660200182016040528015613efd576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613f425750607f60f81b82600081518110613f3057fe5b01602001516001600160f81b03191611155b15613f4e575080611036565b613023613f608351608060ff16613fdf565b835b6060806040519050835180825260208201818101602087015b81831015613f93578051835260209283019201613f7b565b50855184518101855292509050808201602086015b81831015613fc0578051835260209283019201613fa8565b508651929092011591909101601f01601f191660405250905092915050565b606068010000000000000000831061402f576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b604080516001808252818301909252606091602082018180368337019050509050603784116140895782840160f81b8160008151811061406b57fe5b60200101906001600160f81b031916908160001a9053509050613023565b606061409485613e2a565b90508381510160370160f81b826000815181106140ad57fe5b60200101906001600160f81b031916908160001a9053506140ce8282613f62565b95945050505050565b805182516000916001600160a01b039182169116148015614111575081602001516001600160a01b031683602001516001600160a01b0316145b8015614136575081604001516001600160a01b031683604001516001600160a01b0316145b8015610c935750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b60405180604001604052806141836141c5565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fef901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a78410000000746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a26469706673582212206138cbef6a4ba7db6b97f06990dc0d96f124bc0b841fa4a56690968e7b85982b64736f6c63430006040033", + }, + }, + } + + brunoUpgrade[rialtoNet] = &Upgrade{ + UpgradeName: "bruno", + Configs: []*UpgradeConfig{ + { + ContractAddr: ValidatorContract, + CommitUrl: "https://github.com/binance-chain/bsc-genesis-contract/commit/ce622fef469d84ee418fa6181f3ac962412a5f4f", + Code: "6080604052600436106102e45760003560e01c80638624988211610190578063c8509d81116100dc578063eb57e20211610095578063f9a2bbc71161006f578063f9a2bbc714610a54578063fc3e590814610a69578063fccc281314610a7e578063fd6a687914610a93576102e4565b8063eb57e202146109e6578063eda5868c14610a19578063f340fa0114610a2e576102e4565b8063c8509d81146106d8578063d86222d51461097d578063daacdb6614610992578063dc927faf146109a7578063e086c7b1146109bc578063e1c7392a146109d1576102e4565b8063aaf5eb6811610149578063ad3c9da611610123578063ad3c9da6146108d0578063b7ab4db514610903578063bf9f4995146104c0578063c81b166214610968576102e4565b8063aaf5eb68146107db578063ab51bb96146107f0578063ac43175114610805576102e4565b8063862498821461075d57806396713da9146107725780639dc0926214610787578063a1a11bf51461079c578063a5422d5c146107b1578063a78abc16146107c6576102e4565b806351e806721161024f57806370fd5bad116102085780637942fd05116101e25780637942fd05146106ae57806381650b62146106c3578063831d65d1146106d8578063853230aa14610699576102e4565b806370fd5bad1461066f57806375d47a0a1461068457806378dfed4a14610699576102e4565b806351e8067214610572578063565c56b3146105875780635667515a146105ba5780635d77156c146105cf5780636969a25c146105e45780636e47b4821461065a576102e4565b80633de0f0d8116102a15780633de0f0d8146104ab5780633dffc387146104c057806343756e5c146104eb578063493279b11461051c5780634bf6c882146105485780635192c82c1461055d576102e4565b80630bee7a67146102e95780631182b87514610317578063152ad3b8146104115780631ff180691461043a578063219f22d51461046157806335409f7f14610476575b600080fd5b3480156102f557600080fd5b506102fe610aa8565b6040805163ffffffff9092168252519081900360200190f35b34801561032357600080fd5b5061039c6004803603604081101561033a57600080fd5b60ff8235169190810190604081016020820135600160201b81111561035e57600080fd5b82018360208201111561037057600080fd5b803590602001918460018302840111600160201b8311171561039157600080fd5b509092509050610aad565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103d65781810151838201526020016103be565b50505050905090810190601f1680156104035780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561041d57600080fd5b50610426610c9a565b604080519115158252519081900360200190f35b34801561044657600080fd5b5061044f610ca3565b60408051918252519081900360200190f35b34801561046d57600080fd5b506102fe610ca9565b34801561048257600080fd5b506104a96004803603602081101561049957600080fd5b50356001600160a01b0316610cae565b005b3480156104b757600080fd5b5061044f610fc2565b3480156104cc57600080fd5b506104d5610fc8565b6040805160ff9092168252519081900360200190f35b3480156104f757600080fd5b50610500610fcd565b604080516001600160a01b039092168252519081900360200190f35b34801561052857600080fd5b50610531610fd3565b6040805161ffff9092168252519081900360200190f35b34801561055457600080fd5b506104d5610fd9565b34801561056957600080fd5b5061044f610fde565b34801561057e57600080fd5b50610500610fe4565b34801561059357600080fd5b5061044f600480360360208110156105aa57600080fd5b50356001600160a01b0316610fea565b3480156105c657600080fd5b506104d561103c565b3480156105db57600080fd5b506102fe611041565b3480156105f057600080fd5b5061060e6004803603602081101561060757600080fd5b5035611046565b604080516001600160a01b039788168152958716602087015293909516848401526001600160401b0390911660608401521515608083015260a082019290925290519081900360c00190f35b34801561066657600080fd5b506105006110aa565b34801561067b57600080fd5b506104d56110b0565b34801561069057600080fd5b506105006110b5565b3480156106a557600080fd5b5061044f6110bb565b3480156106ba57600080fd5b506104d56110c1565b3480156106cf57600080fd5b506102fe6110c6565b3480156106e457600080fd5b506104a9600480360360408110156106fb57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071f57600080fd5b82018360208201111561073157600080fd5b803590602001918460018302840111600160201b8311171561075257600080fd5b5090925090506110cb565b34801561076957600080fd5b5061044f61117e565b34801561077e57600080fd5b506104d5611184565b34801561079357600080fd5b50610500611189565b3480156107a857600080fd5b5061050061118f565b3480156107bd57600080fd5b5061039c611195565b3480156107d257600080fd5b506104266111b4565b3480156107e757600080fd5b5061044f6111bd565b3480156107fc57600080fd5b506102fe61103c565b34801561081157600080fd5b506104a96004803603604081101561082857600080fd5b810190602081018135600160201b81111561084257600080fd5b82018360208201111561085457600080fd5b803590602001918460018302840111600160201b8311171561087557600080fd5b919390929091602081019035600160201b81111561089257600080fd5b8201836020820111156108a457600080fd5b803590602001918460018302840111600160201b831117156108c557600080fd5b5090925090506111c6565b3480156108dc57600080fd5b5061044f600480360360208110156108f357600080fd5b50356001600160a01b03166115bd565b34801561090f57600080fd5b506109186115cf565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561095457818101518382015260200161093c565b505050509050019250505060405180910390f35b34801561097457600080fd5b506105006116f5565b34801561098957600080fd5b5061044f6116fb565b34801561099e57600080fd5b5061044f611707565b3480156109b357600080fd5b5061050061170d565b3480156109c857600080fd5b5061044f611713565b3480156109dd57600080fd5b506104a9611718565b3480156109f257600080fd5b506104a960048036036020811015610a0957600080fd5b50356001600160a01b031661191b565b348015610a2557600080fd5b506102fe611aea565b6104a960048036036020811015610a4457600080fd5b50356001600160a01b0316611aef565b348015610a6057600080fd5b50610500611df4565b348015610a7557600080fd5b506104d5611dfa565b348015610a8a57600080fd5b50610500611dff565b348015610a9f57600080fd5b50610500611e05565b606481565b60005460609060ff16610b03576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b3361200014610b435760405162461bcd60e51b815260040180806020018281038252602f815260200180614952602f913960400191505060405180910390fd5b610b4b614159565b6000610b8c85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611e0b92505050565b9150915080610ba857610b9f6064611f64565b92505050610c93565b815160009060ff16610bc857610bc18360200151611fc5565b9050610c5f565b825160ff1660011415610c5b57826020015151600114610c35577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260258152602001806142876025913960400191505060405180910390a1506067610c56565b610bc18360200151600081518110610c4957fe5b6020026020010151612dcb565b610c5f565b5060655b63ffffffff8116610c845750506040805160008152602081019091529150610c939050565b610c8d81611f64565b93505050505b9392505050565b60075460ff1681565b60035481565b606881565b3361100114610cee5760405162461bcd60e51b81526004018080602001828103825260298152602001806149ae6029913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205480610d125750610fbf565b600181039050600060018281548110610d2757fe5b60009182526020909120600360049092020101546001549091506000190180610d7657600060018481548110610d5957fe5b906000526020600020906004020160030181905550505050610fbf565b6040805183815290516001600160a01b038616917f3b6f9ef90462b512a1293ecec018670bf7b7f1876fb727590a8a6d7643130a70919081900360200190a26001600160a01b038416600090815260046020526040812055600154600019018314610ef857600180546000198101908110610ded57fe5b906000526020600020906004020160018481548110610e0857fe5b6000918252602082208354600492830290910180546001600160a01b03199081166001600160a01b0393841617825560018087015481840180548416918616919091179055600280880180549185018054909416919095161780835584546001600160401b03600160a01b91829004160267ffffffffffffffff60a01b1990911617808355935460ff600160e01b918290041615150260ff60e01b199094169390931790556003948501549401939093558254868401939192919087908110610ecd57fe5b600091825260208083206004909202909101546001600160a01b031683528201929092526040019020555b6001805480610f0357fe5b60008281526020812060046000199093019283020180546001600160a01b0319908116825560018201805490911690556002810180546001600160e81b03191690556003018190559155818381610f5657fe5b0490508015610fba5760015460005b81811015610fb7578260018281548110610f7b57fe5b9060005260206000209060040201600301540160018281548110610f9b57fe5b6000918252602090912060036004909202010155600101610f65565b50505b505050505b50565b61271081565b600181565b61100181565b6102ca81565b600881565b60065481565b61200081565b6001600160a01b03811660009081526004602052604081205480611012576000915050611037565b60018082038154811061102157fe5b9060005260206000209060040201600301549150505b919050565b600081565b606781565b6001818154811061105357fe5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831694509082169291821691600160a01b81046001600160401b031691600160e01b90910460ff169086565b61100581565b600281565b61100881565b6103e881565b600b81565b606681565b336120001461110b5760405162461bcd60e51b815260040180806020018281038252602f815260200180614952602f913960400191505060405180910390fd5b7f41ce201247b6ceb957dcdb217d0b8acb50b9ea0e12af9af4f5e7f38902101605838383604051808460ff1660ff168152602001806020018281038252848482818152602001925080828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b60025481565b600981565b61100781565b61100681565b6040518061062001604052806105ef81526020016143636105ef913981565b60005460ff1681565b6402540be40081565b60005460ff16611219576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b33611007146112595760405162461bcd60e51b815260040180806020018281038252602e8152602001806142cd602e913960400191505060405180910390fd5b6112c384848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080518082019091526013815272065787069726554696d655365636f6e6447617606c1b60208201529150612f429050565b1561139e57602081146113075760405162461bcd60e51b815260040180806020018281038252602681526020018061431c6026913960400191505060405180910390fd5b604080516020601f84018190048102820181019092528281526000916113459185858083850183828082843760009201919091525061302a92505050565b90506064811015801561135b5750620186a08111155b6113965760405162461bcd60e51b81526004018080602001828103825260278152602001806142606027913960400191505060405180910390fd5b60025561152b565b6113fe84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805180820190915260098152686275726e526174696f60b81b60208201529150612f429050565b156114ee5760208114611458576040805162461bcd60e51b815260206004820152601c60248201527f6c656e677468206f66206275726e526174696f206d69736d6174636800000000604482015290519081900360640190fd5b604080516020601f84018190048102820181019092528281526000916114969185858083850183828082843760009201919091525061302a92505050565b90506127108111156114d95760405162461bcd60e51b815260040180806020018281038252602b81526020018061420a602b913960400191505060405180910390fd5b6006556007805460ff1916600117905561152b565b6040805162461bcd60e51b815260206004820152600d60248201526c756e6b6e6f776e20706172616d60981b604482015290519081900360640190fd5b7f6cdb0ac70ab7f2e2d035cca5be60d89906f2dede7648ddbd7402189c1eeed17a848484846040518080602001806020018381038352878782818152602001925080828437600083820152601f01601f191690910184810383528581526020019050858580828437600083820152604051601f909101601f19169092018290039850909650505050505050a150505050565b60046020526000908152604090205481565b6001546060906000805b8281101561162057600181815481106115ee57fe5b9060005260206000209060040201600201601c9054906101000a900460ff16611618576001909101905b6001016115d9565b5060608160405190808252806020026020018201604052801561164d578160200160208202803683370190505b50600092509050815b838110156116ed576001818154811061166b57fe5b9060005260206000209060040201600201601c9054906101000a900460ff166116e5576001818154811061169b57fe5b600091825260209091206004909102015482516001600160a01b03909116908390859081106116c657fe5b6001600160a01b03909216602092830291909101909101526001909201915b600101611656565b509250505090565b61100281565b67016345785d8a000081565b60055481565b61100381565b602981565b60005460ff1615611770576040805162461bcd60e51b815260206004820152601960248201527f74686520636f6e747261637420616c726561647920696e697400000000000000604482015290519081900360640190fd5b611778614159565b600061179e6040518061062001604052806105ef81526020016143636105ef9139611e0b565b91509150806117de5760405162461bcd60e51b81526004018080602001828103825260218152602001806143426021913960400191505060405180910390fd5b60005b8260200151518110156119035760018360200151828151811061180057fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782558587015182850180549185169183169190911790556040860151600283018054606089015160808a01511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590981692909516919091179290921694909417161790915560a0909301516003909301929092559186015180519185019391859081106118d657fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016117e1565b50506103e8600255506000805460ff19166001179055565b336110011461195b5760405162461bcd60e51b81526004018080602001828103825260298152602001806149ae6029913960400191505060405180910390fd5b6001600160a01b0381166000908152600460205260409020548061197f5750610fbf565b60018103905060006001828154811061199457fe5b90600052602060002090600402016003015490506000600183815481106119b757fe5b906000526020600020906004020160030181905550600060018080549050039050836001600160a01b03167f8cd4e147d8af98a9e3b6724021b8bf6aed2e5dac71c38f2dce8161b82585b25d836040518082815260200191505060405180910390a280611a2657505050610fbf565b6000818381611a3157fe5b0490508015610fba5760005b84811015611a8f578160018281548110611a5357fe5b9060005260206000209060040201600301540160018281548110611a7357fe5b6000918252602090912060036004909202010155600101611a3d565b50600180549085015b81811015610fb7578260018281548110611aae57fe5b9060005260206000209060040201600301540160018281548110611ace57fe5b6000918252602090912060036004909202010155600101611a98565b606581565b334114611b2d5760405162461bcd60e51b815260040180806020018281038252602d815260200180614981602d913960400191505060405180910390fd5b60005460ff16611b80576040805162461bcd60e51b81526020600482015260196024820152781d1a194818dbdb9d1c9858dd081b9bdd081a5b9a5d081e595d603a1b604482015290519081900360640190fd5b60003411611bcd576040805162461bcd60e51b81526020600482015260156024820152746465706f7369742076616c7565206973207a65726f60581b604482015290519081900360640190fd5b6001600160a01b0381166000908152600460205260409020546007543491906103e89060ff1615611bfd57506006545b600083118015611c0d5750600081115b15611cb6576000611c36612710611c2a868563ffffffff61302f16565b9063ffffffff61308816565b90508015611cb45760405161dead9082156108fc029083906000818181858888f19350505050158015611c6d573d6000803e3d6000fd5b506040805182815290517f627059660ea01c4733a328effb2294d2f86905bf806da763a89cee254de8bee59181900360200190a1611cb1848263ffffffff6130ca16565b93505b505b8115611dae576000600180840381548110611ccd57fe5b9060005260206000209060040201905080600201601c9054906101000a900460ff1615611d38576040805185815290516001600160a01b038716917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a2611da8565b600354611d4b908563ffffffff61310c16565b6003908155810154611d63908563ffffffff61310c16565b60038201556040805185815290516001600160a01b038716917f93a090ecc682c002995fad3c85b30c5651d7fd29b0be5da9d784a3302aedc055919081900360200190a25b50611dee565b6040805184815290516001600160a01b038616917ff177e5d6c5764d79c32883ed824111d9b13f5668cf6ab1cc12dd36791dd955b4919081900360200190a25b50505050565b61100081565b600381565b61dead81565b61100481565b611e13614159565b6000611e1d614159565b611e25614171565b611e36611e3186613166565b61318b565b90506000805b611e45836131d5565b15611f565780611e6a57611e60611e5b846131f6565b613244565b60ff168452611f4e565b8060011415611f49576060611e86611e81856131f6565b6132fb565b90508051604051908082528060200260200182016040528015611ec357816020015b611eb0614191565b815260200190600190039081611ea85790505b50602086015260005b8151811015611f3e57611edd614191565b6000611efb848481518110611eee57fe5b60200260200101516133cc565b9150915080611f1857876000995099505050505050505050611f5f565b8188602001518481518110611f2957fe5b60209081029190910101525050600101611ecc565b506001925050611f4e565b611f56565b600101611e3c565b50919350909150505b915091565b604080516001808252818301909252606091829190816020015b6060815260200190600190039081611f7e579050509050611fa48363ffffffff166134a9565b81600081518110611fb157fe5b6020026020010181905250610c93816134bc565b6000806060611fd384613546565b9150915081612080577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb2816040518080602001828103825283818151815260200191508051906020019080838360005b8381101561203b578181015183820152602001612023565b50505050905090810190601f1680156120685780820380516001836020036101000a031916815260200191505b509250505060405180910390a1606692505050611037565b600080805b6001548110156120fd5767016345785d8a0000600182815481106120a557fe5b906000526020600020906004020160030154106120c7576001909201916120f5565b6000600182815481106120d657fe5b90600052602060002090600402016003015411156120f5576001909101905b600101612085565b5060608260405190808252806020026020018201604052801561212a578160200160208202803683370190505b509050606083604051908082528060200260200182016040528015612159578160200160208202803683370190505b509050606084604051908082528060200260200182016040528015612188578160200160208202803683370190505b5090506060856040519080825280602002602001820160405280156121b7578160200160208202803683370190505b50905060006060866040519080825280602002602001820160405280156121e8578160200160208202803683370190505b509050606087604051908082528060200260200182016040528015612217578160200160208202803683370190505b509050600098506000975060608d905060006110046001600160a01b031663149d14d96040518163ffffffff1660e01b815260040160206040518083038186803b15801561226457600080fd5b505afa158015612278573d6000803e3d6000fd5b505050506040513d602081101561228e57600080fd5b5051905067016345785d8a0000811115612303577f70e72399380dcfb0338abc03dc8d47f9f470ada8e769c9a78d644ea97385ecb26040518080602001828103825260218152602001806142fb6021913960400191505060405180910390a160689d5050505050505050505050505050611037565b60005b6001548110156125765767016345785d8a00006001828154811061232657fe5b906000526020600020906004020160030154106124ac576001818154811061234a57fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b03168a8d8151811061237b57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060006402540be400600183815481106123b057fe5b906000526020600020906004020160030154816123c957fe5b06600183815481106123d757fe5b9060005260206000209060040201600301540390506123ff83826130ca90919063ffffffff16565b8a8e8151811061240b57fe5b6020026020010181815250506001828154811061242457fe5b906000526020600020906004020160020160009054906101000a90046001600160a01b0316888e8151811061245557fe5b60200260200101906001600160a01b031690816001600160a01b03168152505081898e8151811061248257fe5b602090810291909101015261249d878263ffffffff61310c16565b6001909d019c965061256e9050565b6000600182815481106124bb57fe5b906000526020600020906004020160030154111561256e57600181815481106124e057fe5b906000526020600020906004020160010160009054906101000a90046001600160a01b0316858c8151811061251157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506001818154811061253e57fe5b906000526020600020906004020160030154848c8151811061255c57fe5b60209081029190910101526001909a01995b600101612306565b50600085156129b4576110046001600160a01b0316636e056520878c8c8b60025442016040518663ffffffff1660e01b815260040180806020018060200180602001856001600160401b03166001600160401b03168152602001848103845288818151815260200191508051906020019060200280838360005b838110156126085781810151838201526020016125f0565b50505050905001848103835287818151815260200191508051906020019060200280838360005b8381101561264757818101518382015260200161262f565b50505050905001848103825286818151815260200191508051906020019060200280838360005b8381101561268657818101518382015260200161266e565b505050509050019750505050505050506020604051808303818588803b1580156126af57600080fd5b505af1935050505080156126d557506040513d60208110156126d057600080fd5b505160015b612910576040516000815260443d10156126f15750600061278c565b60046000803e60005160e01c6308c379a0811461271257600091505061278c565b60043d036004833e81513d60248201116001600160401b038211171561273d5760009250505061278c565b80830180516001600160401b0381111561275e57600094505050505061278c565b8060208301013d860181111561277c5760009550505050505061278c565b601f01601f191660405250925050505b80612797575061283b565b60019150867fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280826040518080602001828103825283818151815260200191508051906020019080838360005b838110156127fb5781810151838201526020016127e3565b50505050905090810190601f1680156128285780820380516001836020036101000a031916815260200191505b509250505060405180910390a25061290b565b3d808015612865576040519150601f19603f3d011682016040523d82523d6000602084013e61286a565b606091505b5060019150867fbfa884552dd8921b6ce90bfe906952ae5b3b29be0cc1a951d4f62697635a3a45826040518080602001828103825283818151815260200191508051906020019080838360005b838110156128cf5781810151838201526020016128b7565b50505050905090810190601f1680156128fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505b6129b4565b801561294e576040805188815290517fa217d08e65f80c73121cd9db834d81652d544bfbf452f6d04922b16c90a37b709181900360200190a16129b2565b604080516020808252601b908201527f6261746368207472616e736665722072657475726e2066616c7365000000000081830152905188917fa7cdeed7d0db45e3219a6e5d60838824c16f1d39991fcfe3f963029c844bf280919081900360600190a25b505b8015612b6a5760005b8851811015612b685760008982815181106129d457fe5b602002602001015190506000600182815481106129ed57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116916108fc9185908110612a1e57fe5b9060005260206000209060040201600301549081150290604051600060405180830381858888f1935050505090508015612ada5760018281548110612a5f57fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d9185908110612aae57fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a2612b5e565b60018281548110612ae757fe5b60009182526020909120600160049092020181015481546001600160a01b03909116917f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d9185908110612b3657fe5b9060005260206000209060040201600301546040518082815260200191505060405180910390a25b50506001016129bd565b505b845115612cb45760005b8551811015612cb2576000868281518110612b8b57fe5b60200260200101516001600160a01b03166108fc878481518110612bab57fe5b60200260200101519081150290604051600060405180830381858888f1935050505090508015612c4157868281518110612be157fe5b60200260200101516001600160a01b03167f6c61d60f69a7beb3e1c80db7f39f37b208537cbb19da3174511b477812b2fc7d878481518110612c1f57fe5b60200260200101516040518082815260200191505060405180910390a2612ca9565b868281518110612c4d57fe5b60200260200101516001600160a01b03167f25d0ce7d2f0cec669a8c17efe49d195c13455bb8872b65fa610ac7f53fe4ca7d878481518110612c8b57fe5b60200260200101516040518082815260200191505060405180910390a25b50600101612b74565b505b4715612d1d576040805147815290517f6ecc855f9440a9282c90913bbc91619fd44f5ec0b462af28d127b116f130aa4d9181900360200190a1604051611002904780156108fc02916000818181858888f19350505050158015612d1b573d6000803e3d6000fd5b505b60006003819055600555825115612d3757612d3783613628565b6110016001600160a01b031663fc4333cd6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d7457600080fd5b505af1158015612d88573d6000803e3d6000fd5b50506040517fedd8d7296956dd970ab4de3f2fc03be2b0ffc615d20cd4c72c6e44f928630ebf925060009150a15060009f9e505050505050505050505050505050565b80516001600160a01b0316600090815260046020526040812054801580612e1c5750600180820381548110612dfc57fe5b9060005260206000209060040201600201601c9054906101000a900460ff165b15612e625782516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a26000915050611037565b600154600554600019820111801590612eb85784516040516001600160a01b03909116907fe209c46bebf57cf265d5d9009a00870e256d9150f3ed5281ab9d9eb3cec6e4be90600090a260009350505050611037565b600580546001908101909155805481906000198601908110612ed657fe5b6000918252602082206002600490920201018054921515600160e01b0260ff60e01b199093169290921790915585516040516001600160a01b03909116917ff226e7d8f547ff903d9d419cf5f54e0d7d07efa9584135a53a057c5f1f27f49a91a2506000949350505050565b6000816040516020018082805190602001908083835b60208310612f775780518252601f199092019160209182019101612f58565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120836040516020018082805190602001908083835b60208310612fe55780518252601f199092019160209182019101612fc6565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001201490505b92915050565b015190565b60008261303e57506000613024565b8282028284828161304b57fe5b0414610c935760405162461bcd60e51b81526004018080602001828103825260218152602001806142ac6021913960400191505060405180910390fd5b6000610c9383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ae9565b6000610c9383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b8b565b600082820183811015610c93576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61316e6141c6565b506040805180820190915281518152602082810190820152919050565b613193614171565b61319c82613be5565b6131a557600080fd5b60006131b48360200151613c1f565b60208085015160408051808201909152868152920190820152915050919050565b60006131df6141c6565b505080518051602091820151919092015191011190565b6131fe6141c6565b613207826131d5565b61321057600080fd5b6020820151600061322082613c82565b80830160209586015260408051808201909152908152938401919091525090919050565b80516000901580159061325957508151602110155b61326257600080fd5b60006132718360200151613c1f565b905080836000015110156132cc576040805162461bcd60e51b815260206004820152601a60248201527f6c656e677468206973206c657373207468616e206f6666736574000000000000604482015290519081900360640190fd5b8251602080850151830180519284900392918310156132f257826020036101000a820491505b50949350505050565b606061330682613be5565b61330f57600080fd5b600061331a83613db5565b905060608160405190808252806020026020018201604052801561335857816020015b6133456141c6565b81526020019060019003908161333d5790505b509050600061336a8560200151613c1f565b60208601510190506000805b848110156133c15761338783613c82565b91506040518060400160405280838152602001848152508482815181106133aa57fe5b602090810291909101015291810191600101613376565b509195945050505050565b6133d4614191565b60006133de614191565b6133e6614171565b6133ef8561318b565b90506000805b6133fe836131d5565b15611f56578061342957613419613414846131f6565b613e11565b6001600160a01b031684526134a1565b80600114156134515761343e613414846131f6565b6001600160a01b031660208501526134a1565b806002141561347957613466613414846131f6565b6001600160a01b031660408501526134a1565b8060031415611f495761348e611e5b846131f6565b6001600160401b03166060850152600191505b6001016133f5565b60606130246134b783613e2b565b613f11565b60608151600014156134dd5750604080516000815260208101909152611037565b6060826000815181106134ec57fe5b602002602001015190506000600190505b835181101561352d576135238285838151811061351657fe5b6020026020010151613f63565b91506001016134fd565b50610c93613540825160c060ff16613fe0565b82613f63565b600060606029835111156135785760006040518060600160405280602981526020016141e16029913991509150611f5f565b60005b835181101561360e5760005b818110156136055784818151811061359b57fe5b6020026020010151600001516001600160a01b03168583815181106135bc57fe5b6020026020010151600001516001600160a01b031614156135fd5760006040518060600160405280602b8152602001614235602b9139935093505050611f5f565b600101613587565b5060010161357b565b505060408051602081019091526000815260019150915091565b600154815160005b82811015613745576001613642614191565b6001838154811061364f57fe5b600091825260208083206040805160c08101825260049490940290910180546001600160a01b0390811685526001820154811693850193909352600281015492831691840191909152600160a01b82046001600160401b03166060840152600160e01b90910460ff16151560808301526003015460a082015291505b84811015613719578681815181106136df57fe5b6020026020010151600001516001600160a01b031682600001516001600160a01b031614156137115760009250613719565b6001016136cb565b50811561373b5780516001600160a01b03166000908152600460205260408120555b5050600101613630565b50808211156137ba57805b828110156137b857600180548061376357fe5b60008281526020812060046000199093019283020180546001600160a01b03199081168255600182810180549092169091556002820180546001600160e81b0319169055600390910191909155915501613750565b505b60008183106137c957816137cb565b825b905060005b818110156139c55761387d8582815181106137e757fe5b6020026020010151600183815481106137fc57fe5b60009182526020918290206040805160c08101825260049390930290910180546001600160a01b0390811684526001820154811694840194909452600281015493841691830191909152600160a01b83046001600160401b03166060830152600160e01b90920460ff161515608082015260039091015460a08201526140d8565b61399857806001016004600087848151811061389557fe5b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020819055508481815181106138d157fe5b6020026020010151600182815481106138e657fe5b6000918252602091829020835160049092020180546001600160a01b039283166001600160a01b0319918216178255928401516001820180549184169185169190911790556040840151600282018054606087015160808801511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b1995909716929097169190911792909216939093171692909217905560a0909101516003909101556139bd565b6000600182815481106139a757fe5b9060005260206000209060040201600301819055505b6001016137d0565b5082821115611dee57825b82811015610fba5760018582815181106139e657fe5b60209081029190910181015182546001818101855560009485528385208351600493840290910180546001600160a01b039283166001600160a01b03199182161782559585015181840180549184169188169190911790556040850151600282018054606088015160808901511515600160e01b0260ff60e01b196001600160401b03909216600160a01b0267ffffffffffffffff60a01b199590971692909a169190911792909216939093171695909517905560a09092015160039093019290925587519084019290889085908110613abc57fe5b602090810291909101810151516001600160a01b03168252810191909152604001600020556001016139d0565b60008183613b755760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3a578181015183820152602001613b22565b50505050905090810190601f168015613b675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613b8157fe5b0495945050505050565b60008184841115613bdd5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613b3a578181015183820152602001613b22565b505050900390565b8051600090613bf657506000611037565b6020820151805160001a9060c0821015613c1557600092505050611037565b5060019392505050565b8051600090811a6080811015613c39576000915050611037565b60b8811080613c54575060c08110801590613c54575060f881105b15613c63576001915050611037565b60c0811015613c775760b519019050611037565b60f519019050611037565b80516000908190811a6080811015613c9d5760019150613dae565b60b8811015613cb257607e1981019150613dae565b60c0811015613d2c57600060b78203600186019550806020036101000a865104915060018101820193505080831015613d26576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b50613dae565b60f8811015613d415760be1981019150613dae565b600060f78203600186019550806020036101000a865104915060018101820193505080831015613dac576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b505b5092915050565b8051600090613dc657506000611037565b60008090506000613dda8460200151613c1f565b602085015185519181019250015b80821015613e0857613df982613c82565b60019093019290910190613de8565b50909392505050565b8051600090601514613e2257600080fd5b61302482613244565b604080516020808252818301909252606091829190602082018180368337505050602081018490529050600067ffffffffffffffff198416613e6f57506018613e93565b6fffffffffffffffffffffffffffffffff198416613e8f57506010613e93565b5060005b6020811015613ec957818181518110613ea857fe5b01602001516001600160f81b03191615613ec157613ec9565b600101613e93565b60008160200390506060816040519080825280601f01601f191660200182016040528015613efe576020820181803683370190505b5080830196909652508452509192915050565b606081516001148015613f435750607f60f81b82600081518110613f3157fe5b01602001516001600160f81b03191611155b15613f4f575080611037565b613024613f618351608060ff16613fe0565b835b6060806040519050835180825260208201818101602087015b81831015613f94578051835260209283019201613f7c565b50855184518101855292509050808201602086015b81831015613fc1578051835260209283019201613fa9565b508651929092011591909101601f01601f191660405250905092915050565b6060680100000000000000008310614030576040805162461bcd60e51b815260206004820152600e60248201526d696e70757420746f6f206c6f6e6760901b604482015290519081900360640190fd5b6040805160018082528183019092526060916020820181803683370190505090506037841161408a5782840160f81b8160008151811061406c57fe5b60200101906001600160f81b031916908160001a9053509050613024565b606061409585613e2b565b90508381510160370160f81b826000815181106140ae57fe5b60200101906001600160f81b031916908160001a9053506140cf8282613f63565b95945050505050565b805182516000916001600160a01b039182169116148015614112575081602001516001600160a01b031683602001516001600160a01b0316145b8015614137575081604001516001600160a01b031683604001516001600160a01b0316145b8015610c935750506060908101519101516001600160401b0390811691161490565b60408051808201909152600081526060602082015290565b60405180604001604052806141846141c6565b8152602001600081525090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b60405180604001604052806000815260200160008152509056fe746865206e756d626572206f662076616c696461746f72732065786365656420746865206c696d6974746865206275726e526174696f206d757374206265206e6f2067726561746572207468616e2031303030306475706c696361746520636f6e73656e7375732061646472657373206f662076616c696461746f725365747468652065787069726554696d655365636f6e64476170206973206f7574206f662072616e67656c656e677468206f66206a61696c2076616c696461746f7273206d757374206265206f6e65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865206d6573736167652073656e646572206d75737420626520676f7665726e616e636520636f6e7472616374666565206973206c6172676572207468616e2044555354595f494e434f4d494e476c656e677468206f662065787069726554696d655365636f6e64476170206d69736d617463686661696c656420746f20706172736520696e69742076616c696461746f72536574f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000746865206d6573736167652073656e646572206d7573742062652063726f737320636861696e20636f6e7472616374746865206d6573736167652073656e646572206d7573742062652074686520626c6f636b2070726f6475636572746865206d6573736167652073656e646572206d75737420626520736c61736820636f6e7472616374a2646970667358221220b274d764256170addda41fb4f3d964ba036ef5f3a15a0341d0524406e0ac44e864736f6c63430006040033", + }, + }, + } +} + +func UpgradeBuildInSystemContract(config *params.ChainConfig, blockNumber *big.Int, statedb *state.IntraBlockState) { + if config == nil || blockNumber == nil || statedb == nil { + return + } + var network string + switch config.ChainName { + case networkname.BSCChainName: + network = mainNet + case networkname.ChapelChainName: + network = chapelNet + case networkname.RialtoChainName: + network = rialtoNet + default: + network = defaultNet + } + + logger := log.New("system-contract-upgrade", network) + if config.IsOnRamanujan(blockNumber) { + applySystemContractUpgrade(ramanujanUpgrade[network], blockNumber, statedb, logger) + } + + if config.IsOnNiels(blockNumber) { + applySystemContractUpgrade(nielsUpgrade[network], blockNumber, statedb, logger) + } + + if config.IsOnMirrorSync(blockNumber) { + applySystemContractUpgrade(mirrorUpgrade[network], blockNumber, statedb, logger) + } + + if config.IsOnBruno(blockNumber) { + applySystemContractUpgrade(brunoUpgrade[network], blockNumber, statedb, logger) + } + + /* + apply other upgrades + */ +} + +func applySystemContractUpgrade(upgrade *Upgrade, blockNumber *big.Int, statedb *state.IntraBlockState, logger log.Logger) { + if upgrade == nil { + logger.Info("Empty upgrade config", "height", blockNumber.String()) + return + } + + logger.Info(fmt.Sprintf("Apply upgrade %s at height %d", upgrade.UpgradeName, blockNumber.Int64())) + for _, cfg := range upgrade.Configs { + logger.Info(fmt.Sprintf("Upgrade contract %s to commit %s", cfg.ContractAddr.String(), cfg.CommitUrl)) + + if cfg.BeforeUpgrade != nil { + err := cfg.BeforeUpgrade(blockNumber, cfg.ContractAddr, statedb) + if err != nil { + panic(fmt.Errorf("contract address: %s, execute beforeUpgrade error: %s", cfg.ContractAddr.String(), err.Error())) + } + } + + newContractCode, err := hex.DecodeString(cfg.Code) + if err != nil { + panic(fmt.Errorf("failed to decode new contract code: %s", err.Error())) + } + statedb.SetCode(cfg.ContractAddr, newContractCode) + + if cfg.AfterUpgrade != nil { + err := cfg.AfterUpgrade(blockNumber, cfg.ContractAddr, statedb) + if err != nil { + panic(fmt.Errorf("contract address: %s, execute afterUpgrade error: %s", cfg.ContractAddr.String(), err.Error())) + } + } + } +} diff --git a/core/tx_cacher.go b/core/tx_cacher.go index 3ecefa22745..e4c8cf05781 100644 --- a/core/tx_cacher.go +++ b/core/tx_cacher.go @@ -19,7 +19,7 @@ package core import ( "sync" - "github.com/ledgerwatch/erigon/common" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/core/types" ) @@ -70,7 +70,7 @@ func NewTxSenderCacher(threads int) *TxSenderCacher { // data structures. func (cacher *TxSenderCacher) cache() { for task := range cacher.tasks { - if err := common.Stopped(cacher.exitCh); err != nil { + if err := libcommon.Stopped(cacher.exitCh); err != nil { return } @@ -81,7 +81,7 @@ func (cacher *TxSenderCacher) cache() { } func (cacher *TxSenderCacher) Close() { - common.SafeClose(cacher.exitCh) + libcommon.SafeClose(cacher.exitCh) close(cacher.tasks) cacher.wg.Wait() } diff --git a/core/tx_journal.go b/core/tx_journal.go deleted file mode 100644 index 8631058c641..00000000000 --- a/core/tx_journal.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "bufio" - "errors" - "io" - "os" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" -) - -// errNoActiveJournal is returned if a transaction is attempted to be inserted -// into the journal, but no such file is currently open. -var errNoActiveJournal = errors.New("no active journal") - -// devNull is a WriteCloser that just discards anything written into it. Its -// goal is to allow the transaction journal to write into a fake journal when -// loading transactions on startup without printing warnings due to no file -// being read for write. -type devNull struct{} - -func (*devNull) Write(p []byte) (n int, err error) { return len(p), nil } -func (*devNull) Close() error { return nil } - -// txJournal is a rotating log of transactions with the aim of storing locally -// created transactions to allow non-executed ones to survive node restarts. -type txJournal struct { - path string // Filesystem path to store the transactions at - writer io.WriteCloser // Output stream to write new transactions into -} - -// newTxJournal creates a new transaction journal to -func newTxJournal(path string) *txJournal { - return &txJournal{ - path: path, - } -} - -// load parses a transaction journal dump from disk, loading its contents into -// the specified pool. -func (journal *txJournal) load(add func([]types.Transaction) []error) error { - // Skip the parsing if the journal file doesn't exist at all - if _, err := os.Stat(journal.path); os.IsNotExist(err) { - return nil - } - // Open the journal for loading any past transactions - input, err := os.Open(journal.path) - if err != nil { - return err - } - defer input.Close() - - // Temporarily discard any journal additions (don't double add on load) - journal.writer = new(devNull) - defer func() { journal.writer = nil }() - - // Inject all transactions from the journal into the pool - stream := rlp.NewStream(bufio.NewReader(input), 0) - total, dropped := 0, 0 - - // Create a method to load a limited batch of transactions and bump the - // appropriate progress counters. Then use this method to load all the - // journaled transactions in small-ish batches. - loadBatch := func(txs types.Transactions) { - for _, err := range add(txs) { - if err != nil { - log.Debug("Failed to add journaled transaction", "err", err) - dropped++ - } - } - } - var ( - failure error - batch types.Transactions - ) - for { - // Parse the next transaction and terminate on error - tx, decodeErr := types.DecodeTransaction(stream) - if decodeErr != nil { - if !errors.Is(decodeErr, io.EOF) { - failure = decodeErr - } - if batch.Len() > 0 { - loadBatch(batch) - } - break - } - // New transaction parsed, queue up for later, import if threshold is reached - total++ - - if batch = append(batch, tx); batch.Len() > 1024 { - loadBatch(batch) - batch = batch[:0] - } - } - log.Info("Loaded local transaction journal", "transactions", total, "dropped", dropped) - - return failure -} - -// insert adds the specified transaction to the local disk journal. -func (journal *txJournal) insert(tx types.Transaction) error { - if journal.writer == nil { - return errNoActiveJournal - } - if err := rlp.Encode(journal.writer, tx); err != nil { - return err - } - return nil -} - -// rotate regenerates the transaction journal based on the current contents of -// the transaction pool. -func (journal *txJournal) rotate(all map[common.Address]types.Transactions) error { - // Close the current journal (if any is open) - if journal.writer != nil { - if err := journal.writer.Close(); err != nil { - return err - } - journal.writer = nil - } - // Generate a new journal with the contents of the current pool - replacement, err := os.OpenFile(journal.path+".new", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755) - if err != nil { - return err - } - journaled := 0 - for _, txs := range all { - for _, tx := range txs { - if err = rlp.Encode(replacement, tx); err != nil { - replacement.Close() - return err - } - } - journaled += len(txs) - } - replacement.Close() - - // Replace the live journal with the newly generated one - if err = os.Rename(journal.path+".new", journal.path); err != nil { - return err - } - sink, err := os.OpenFile(journal.path, os.O_WRONLY|os.O_APPEND, 0755) - if err != nil { - return err - } - journal.writer = sink - log.Info("Regenerated local transaction journal", "transactions", journaled, "accounts", len(all)) - - return nil -} - -// close flushes the transaction journal contents to disk and closes the file. -func (journal *txJournal) close() error { - var err error - - if journal.writer != nil { - err = journal.writer.Close() - journal.writer = nil - } - return err -} diff --git a/core/tx_list.go b/core/tx_list.go deleted file mode 100644 index ee3591a2b68..00000000000 --- a/core/tx_list.go +++ /dev/null @@ -1,576 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "container/heap" - "math" - "sort" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/types" -) - -// nonceHeap is a heap.Interface implementation over 64bit unsigned integers for -// retrieving sorted transactions from the possibly gapped future queue. -type nonceHeap []uint64 - -func (h nonceHeap) Len() int { return len(h) } -func (h nonceHeap) Less(i, j int) bool { return h[i] < h[j] } -func (h nonceHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } - -func (h *nonceHeap) Push(x interface{}) { - *h = append(*h, x.(uint64)) -} - -func (h *nonceHeap) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - *h = old[0 : n-1] - return x -} - -// txSortedMap is a nonce->transaction hash map with a heap based index to allow -// iterating over the contents in a nonce-incrementing way. -type txSortedMap struct { - items map[uint64]types.Transaction // Hash map storing the transaction data - index *nonceHeap // Heap of nonces of all the stored transactions (non-strict mode) - cache types.Transactions // Cache of the transactions already sorted -} - -// newTxSortedMap creates a new nonce-sorted transaction map. -func newTxSortedMap() *txSortedMap { - return &txSortedMap{ - items: make(map[uint64]types.Transaction), - index: new(nonceHeap), - } -} - -// Get retrieves the current transactions associated with the given nonce. -func (m *txSortedMap) Get(nonce uint64) types.Transaction { - return m.items[nonce] -} - -// Put inserts a new transaction into the map, also updating the map's nonce -// index. If a transaction already exists with the same nonce, it's overwritten. -func (m *txSortedMap) Put(tx types.Transaction) { - nonce := tx.GetNonce() - if m.items[nonce] == nil { - heap.Push(m.index, nonce) - } - m.items[nonce], m.cache = tx, nil -} - -// Forward removes all transactions from the map with a nonce lower than the -// provided threshold. Every removed transaction is returned for any post-removal -// maintenance. -func (m *txSortedMap) Forward(threshold uint64) types.Transactions { - var removed types.Transactions - - // Pop off heap items until the threshold is reached - for m.index.Len() > 0 && (*m.index)[0] < threshold { - nonce := heap.Pop(m.index).(uint64) - removed = append(removed, m.items[nonce]) - delete(m.items, nonce) - } - // If we had a cached order, shift the front - if m.cache != nil { - m.cache = m.cache[len(removed):] - } - return removed -} - -// Filter iterates over the list of transactions and removes all of them for which -// the specified function evaluates to true. -// Filter, as opposed to 'filter', re-initialises the heap after the operation is done. -// If you want to do several consecutive filterings, it's therefore better to first -// do a .filter(func1) followed by .Filter(func2) or reheap() -func (m *txSortedMap) Filter(filter func(types.Transaction) bool) types.Transactions { - removed := m.filter(filter) - // If transactions were removed, the heap and cache are ruined - if len(removed) > 0 { - m.reheap() - } - return removed -} - -func (m *txSortedMap) reheap() { - *m.index = make([]uint64, 0, len(m.items)) - for nonce := range m.items { - *m.index = append(*m.index, nonce) - } - heap.Init(m.index) - m.cache = nil -} - -// filter is identical to Filter, but **does not** regenerate the heap. This method -// should only be used if followed immediately by a call to Filter or reheap() -func (m *txSortedMap) filter(filter func(types.Transaction) bool) types.Transactions { - var removed types.Transactions - - // Collect all the transactions to filter out - for nonce, tx := range m.items { - if filter(tx) { - removed = append(removed, tx) - delete(m.items, nonce) - } - } - if len(removed) > 0 { - m.cache = nil - } - return removed -} - -// Cap places a hard limit on the number of items, returning all transactions -// exceeding that limit. -func (m *txSortedMap) Cap(threshold int) types.Transactions { - // Short circuit if the number of items is under the limit - if len(m.items) <= threshold { - return nil - } - // Otherwise gather and drop the highest nonce'd transactions - var drops types.Transactions - - sort.Sort(*m.index) - for size := len(m.items); size > threshold; size-- { - drops = append(drops, m.items[(*m.index)[size-1]]) - delete(m.items, (*m.index)[size-1]) - } - *m.index = (*m.index)[:threshold] - heap.Init(m.index) - - // If we had a cache, shift the back - if m.cache != nil { - m.cache = m.cache[:len(m.cache)-len(drops)] - } - return drops -} - -// Remove deletes a transaction from the maintained map, returning whether the -// transaction was found. -func (m *txSortedMap) Remove(nonce uint64) bool { - // Short circuit if no transaction is present - _, ok := m.items[nonce] - if !ok { - return false - } - // Otherwise delete the transaction and fix the heap index - for i := 0; i < m.index.Len(); i++ { - if (*m.index)[i] == nonce { - heap.Remove(m.index, i) - break - } - } - delete(m.items, nonce) - m.cache = nil - - return true -} - -// Ready retrieves a sequentially increasing list of transactions starting at the -// provided nonce that is ready for processing. The returned transactions will be -// removed from the list. -// -// Note, all transactions with nonces lower than start will also be returned to -// prevent getting into and invalid state. This is not something that should ever -// happen but better to be self correcting than failing! -func (m *txSortedMap) Ready(start uint64) types.Transactions { - // Short circuit if no transactions are available - if m.index.Len() == 0 || (*m.index)[0] > start { - return nil - } - // Otherwise start accumulating incremental transactions - var ready types.Transactions - for next := (*m.index)[0]; m.index.Len() > 0 && (*m.index)[0] == next; next++ { - ready = append(ready, m.items[next]) - delete(m.items, next) - heap.Pop(m.index) - } - m.cache = nil - - return ready -} - -// Len returns the length of the transaction map. -func (m *txSortedMap) Len() int { - return len(m.items) -} - -func (m *txSortedMap) flatten() types.Transactions { - // If the sorting was not cached yet, create and cache it - if m.cache == nil { - m.cache = make(types.Transactions, 0, len(m.items)) - for _, tx := range m.items { - m.cache = append(m.cache, tx) - } - sort.Sort(types.TxByNonce(m.cache)) - } - return m.cache -} - -// Flatten creates a nonce-sorted slice of transactions based on the loosely -// sorted internal representation. The result of the sorting is cached in case -// it's requested again before any modifications are made to the contents. -func (m *txSortedMap) Flatten() types.Transactions { - // Copy the cache to prevent accidental modifications - cache := m.flatten() - txs := make(types.Transactions, len(cache)) - copy(txs, cache) - return txs -} - -// AppendHashes to given buffer and return it -func (m *txSortedMap) AppendHashes(buf []common.Hash) []common.Hash { - for _, tx := range m.items { - buf = append(buf, tx.Hash()) - } - return buf -} - -// LastElement returns the last element of a flattened list, thus, the -// transaction with the highest nonce -func (m *txSortedMap) LastElement() types.Transaction { - cache := m.flatten() - return cache[len(cache)-1] -} - -// txList is a "list" of transactions belonging to an account, sorted by account -// nonce. The same type can be used both for storing contiguous transactions for -// the executable/pending queue; and for storing gapped transactions for the non- -// executable/future queue, with minor behavioral changes. -type txList struct { - strict bool // Whether nonces are strictly continuous or not - txs *txSortedMap // Heap indexed sorted hash map of the transactions - - costcap *uint256.Int // Price of the highest costing transaction (reset only if exceeds balance) - gascap uint64 // Gas limit of the highest spending transaction (reset only if exceeds block limit) -} - -// newTxList create a new transaction list for maintaining nonce-indexable fast, -// gapped, sortable transaction lists. -func newTxList(strict bool) *txList { - return &txList{ - strict: strict, - txs: newTxSortedMap(), - costcap: new(uint256.Int), - } -} - -// Overlaps returns whether the transaction specified has the same nonce as one -// already contained within the list. -func (l *txList) Overlaps(tx types.Transaction) bool { - return l.txs.Get(tx.GetNonce()) != nil -} - -// Add tries to insert a new transaction into the list, returning whether the -// transaction was accepted, and if yes, any previous transaction it replaced. -// -// If the new transaction is accepted into the list, the lists' cost and gas -// thresholds are also potentially updated. -func (l *txList) Add(tx types.Transaction, priceBump uint64) (bool, types.Transaction) { - // If there's an older better transaction, abort - old := l.txs.Get(tx.GetNonce()) - if old != nil { - // threshold = oldGP * (100 + priceBump) / 100 - a := uint256.NewInt(100 + priceBump) - a = a.Mul(a, old.GetPrice()) - b := uint256.NewInt(100) - threshold := a.Div(a, b) - // Have to ensure that the new gas price is higher than the old gas - // price as well as checking the percentage threshold to ensure that - // this is accurate for low (Wei-level) gas price replacements - if !tx.GetPrice().Gt(old.GetPrice()) || tx.GetPrice().Lt(threshold) { - return false, nil - } - } - // Otherwise overwrite the old transaction with the current one - l.txs.Put(tx) - if cost := tx.Cost(); l.costcap.Cmp(cost) < 0 { - l.costcap = cost - } - if gas := tx.GetGas(); l.gascap < gas { - l.gascap = gas - } - return true, old -} - -// Forward removes all transactions from the list with a nonce lower than the -// provided threshold. Every removed transaction is returned for any post-removal -// maintenance. -func (l *txList) Forward(threshold uint64) types.Transactions { - return l.txs.Forward(threshold) -} - -// Filter removes all transactions from the list with a cost or gas limit higher -// than the provided thresholds. Every removed transaction is returned for any -// post-removal maintenance. Strict-mode invalidated transactions are also -// returned. -// -// This method uses the cached costcap and gascap to quickly decide if there's even -// a point in calculating all the costs or if the balance covers all. If the threshold -// is lower than the costgas cap, the caps will be reset to a new high after removing -// the newly invalidated transactions. -func (l *txList) Filter(costLimit *uint256.Int, gasLimit uint64) (types.Transactions, types.Transactions) { - // If all transactions are below the threshold, short circuit - if l.costcap.Cmp(costLimit) <= 0 && l.gascap <= gasLimit { - return nil, nil - } - l.costcap = new(uint256.Int).Set(costLimit) // Lower the caps to the thresholds - l.gascap = gasLimit - - // Filter out all the transactions above the account's funds - removed := l.txs.Filter(func(tx types.Transaction) bool { - return tx.GetGas() > gasLimit || tx.Cost().Cmp(costLimit) > 0 - }) - - if len(removed) == 0 { - return nil, nil - } - var invalids types.Transactions - // If the list was strict, filter anything above the lowest nonce - if l.strict { - lowest := uint64(math.MaxUint64) - for _, tx := range removed { - if nonce := tx.GetNonce(); lowest > nonce { - lowest = nonce - } - } - invalids = l.txs.filter(func(tx types.Transaction) bool { return tx.GetNonce() > lowest }) - } - l.txs.reheap() - return removed, invalids -} - -// Cap places a hard limit on the number of items, returning all transactions -// exceeding that limit. -func (l *txList) Cap(threshold int) types.Transactions { - return l.txs.Cap(threshold) -} - -// Remove deletes a transaction from the maintained list, returning whether the -// transaction was found, and also returning any transaction invalidated due to -// the deletion (strict mode only). -func (l *txList) Remove(tx types.Transaction) (bool, types.Transactions) { - // Remove the transaction from the set - nonce := tx.GetNonce() - if removed := l.txs.Remove(nonce); !removed { - return false, nil - } - // In strict mode, filter out non-executable transactions - if l.strict { - return true, l.txs.Filter(func(tx types.Transaction) bool { return tx.GetNonce() > nonce }) - } - return true, nil -} - -// Ready retrieves a sequentially increasing list of transactions starting at the -// provided nonce that is ready for processing. The returned transactions will be -// removed from the list. -// -// Note, all transactions with nonces lower than start will also be returned to -// prevent getting into and invalid state. This is not something that should ever -// happen but better to be self correcting than failing! -func (l *txList) Ready(start uint64) types.Transactions { - return l.txs.Ready(start) -} - -// Len returns the length of the transaction list. -func (l *txList) Len() int { - return l.txs.Len() -} - -// Empty returns whether the list of transactions is empty or not. -func (l *txList) Empty() bool { - return l.Len() == 0 -} - -// Flatten creates a nonce-sorted slice of transactions based on the loosely -// sorted internal representation. The result of the sorting is cached in case -// it's requested again before any modifications are made to the contents. -func (l *txList) Flatten() types.Transactions { - return l.txs.Flatten() -} - -// AppendHashes to given buffer and return it -func (l *txList) AppendHashes(buf []common.Hash) []common.Hash { - return l.txs.AppendHashes(buf) -} - -// LastElement returns the last element of a flattened list, thus, the -// transaction with the highest nonce -func (l *txList) LastElement() types.Transaction { - return l.txs.LastElement() -} - -// priceHeap is a heap.Interface implementation over transactions for retrieving -// price-sorted transactions to discard when the pool fills up. -type priceHeap []types.Transaction - -func (h priceHeap) Len() int { return len(h) } -func (h priceHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } - -func (h priceHeap) Less(i, j int) bool { - // Sort primarily by price, returning the cheaper one - switch h[i].GetPrice().Cmp(h[j].GetPrice()) { - case -1: - return true - case 1: - return false - } - // If the prices match, stabilize via nonces (high nonce is worse) - return h[i].GetNonce() > h[j].GetNonce() -} - -func (h *priceHeap) Push(x interface{}) { - *h = append(*h, x.(types.Transaction)) -} - -func (h *priceHeap) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - old[n-1] = nil - *h = old[0 : n-1] - return x -} - -// txPricedList is a price-sorted heap to allow operating on transactions pool -// contents in a price-incrementing way. It's built opon the all transactions -// in txpool but only interested in the remote part. It means only remote transactions -// will be considered for tracking, sorting, eviction, etc. -type txPricedList struct { - all *txLookup // Pointer to the map of all transactions - remotes *priceHeap // Heap of prices of all the stored **remote** transactions - stales int // Number of stale price points to (re-heap trigger) -} - -// newTxPricedList creates a new price-sorted transaction heap. -func newTxPricedList(all *txLookup) *txPricedList { - return &txPricedList{ - all: all, - remotes: new(priceHeap), - } -} - -// Put inserts a new transaction into the heap. -func (l *txPricedList) Put(tx types.Transaction, local bool) { - if local { - return - } - heap.Push(l.remotes, tx) -} - -// Removed notifies the prices transaction list that an old transaction dropped -// from the pool. The list will just keep a counter of stale objects and update -// the heap if a large enough ratio of transactions go stale. -func (l *txPricedList) Removed(count int) { - // Bump the stale counter, but exit if still too low (< 25%) - l.stales += count - if l.stales <= len(*l.remotes)/4 { - return - } - // Seems we've reached a critical number of stale transactions, reheap - l.Reheap() -} - -// Cap finds all the transactions below the given price threshold, drops them -// from the priced list and returns them for further removal from the entire pool. -// -// Note: only remote transactions will be considered for eviction. -func (l *txPricedList) Cap(threshold *uint256.Int) types.Transactions { - drop := make(types.Transactions, 0, 128) // Remote underpriced transactions to drop - for len(*l.remotes) > 0 { - // Discard stale transactions if found during cleanup - cheapest := (*l.remotes)[0] - if l.all.GetRemote(cheapest.Hash()) == nil { // Removed or migrated - heap.Pop(l.remotes) - l.stales-- - continue - } - // Stop the discards if we've reached the threshold - if !cheapest.GetPrice().Lt(threshold) { - break - } - heap.Pop(l.remotes) - drop = append(drop, cheapest) - } - return drop -} - -// Underpriced checks whether a transaction is cheaper than (or as cheap as) the -// lowest priced (remote) transaction currently being tracked. -func (l *txPricedList) Underpriced(tx types.Transaction) bool { - // Discard stale price points if found at the heap start - for len(*l.remotes) > 0 { - head := []types.Transaction(*l.remotes)[0] - if l.all.GetRemote(head.Hash()) == nil { // Removed or migrated - l.stales-- - heap.Pop(l.remotes) - continue - } - break - } - // Check if the transaction is underpriced or not - if len(*l.remotes) == 0 { - return false // There is no remote transaction at all. - } - // If the remote transaction is even cheaper than the - // cheapest one tracked locally, reject it. - cheapest := []types.Transaction(*l.remotes)[0] - return !cheapest.GetPrice().Lt(tx.GetPrice()) -} - -// Discard finds a number of most underpriced transactions, removes them from the -// priced list and returns them for further removal from the entire pool. -// -// Note local transaction won't be considered for eviction. -func (l *txPricedList) Discard(slots int, force bool) (types.Transactions, bool) { - drop := make(types.Transactions, 0, slots) // Remote underpriced transactions to drop - for len(*l.remotes) > 0 && slots > 0 { - // Discard stale transactions if found during cleanup - tx := heap.Pop(l.remotes).(types.Transaction) - if l.all.GetRemote(tx.Hash()) == nil { // Removed or migrated - l.stales-- - continue - } - // Non stale transaction found, discard it - drop = append(drop, tx) - slots -= numSlots(tx) - } - // If we still can't make enough room for the new transaction - if slots > 0 && !force { - for _, tx := range drop { - heap.Push(l.remotes, tx) - } - return nil, false - } - return drop, true -} - -// Reheap forcibly rebuilds the heap based on the current remote transaction set. -func (l *txPricedList) Reheap() { - reheap := make(priceHeap, 0, l.all.RemoteCount()) - - l.stales, l.remotes = 0, &reheap - l.all.Range(func(hash common.Hash, tx types.Transaction, local bool) bool { - *l.remotes = append(*l.remotes, tx) - return true - }, false, true) // Only iterate remotes - heap.Init(l.remotes) -} diff --git a/core/tx_list_test.go b/core/tx_list_test.go deleted file mode 100644 index 7c77bfcb876..00000000000 --- a/core/tx_list_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "math/big" - "math/rand" - "testing" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" -) - -// Tests that transactions can be added to strict lists and list contents and -// nonce boundaries are correctly maintained. -func TestStrictTxListAdd(t *testing.T) { - // Generate a list of transactions to insert - key, _ := crypto.GenerateKey() - - txs := make(types.Transactions, 1024) - for i := 0; i < len(txs); i++ { - txs[i] = transaction(uint64(i), 0, key) - } - // Insert the transactions in a random order - list := newTxList(true) - for _, v := range rand.Perm(len(txs)) { - list.Add(txs[v], DefaultTxPoolConfig.PriceBump) - } - // Verify internal state - if len(list.txs.items) != len(txs) { - t.Errorf("transaction count mismatch: have %d, want %d", len(list.txs.items), len(txs)) - } - for i, tx := range txs { - if list.txs.items[tx.GetNonce()] != tx { - t.Errorf("item %d: transaction mismatch: have %v, want %v", i, list.txs.items[tx.GetNonce()], tx) - } - } -} - -func BenchmarkTxListAdd(t *testing.B) { - // Generate a list of transactions to insert - key, _ := crypto.GenerateKey() - - txs := make(types.Transactions, 100000) - for i := 0; i < len(txs); i++ { - txs[i] = transaction(uint64(i), 0, key) - } - // Insert the transactions in a random order - list := newTxList(true) - priceLimit, _ := uint256.FromBig(big.NewInt(int64(DefaultTxPoolConfig.PriceLimit))) - t.ResetTimer() - for _, v := range rand.Perm(len(txs)) { - list.Add(txs[v], DefaultTxPoolConfig.PriceBump) - list.Filter(priceLimit, DefaultTxPoolConfig.PriceBump) - } -} diff --git a/core/tx_noncer.go b/core/tx_noncer.go deleted file mode 100644 index cdc25ae8bf8..00000000000 --- a/core/tx_noncer.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "sync" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/state" -) - -// txNoncer is a tiny virtual state database to manage the executable nonces of -// accounts in the pool, falling back to reading from a real state database if -// an account is unknown. -type txNoncer struct { - fallback *state.IntraBlockState - nonces map[common.Address]uint64 - lock sync.Mutex -} - -// newTxNoncer creates a new virtual state database to track the pool nonces. -func newTxNoncer(fallback *state.IntraBlockState) *txNoncer { - return &txNoncer{ - fallback: fallback, - nonces: make(map[common.Address]uint64), - } -} - -// get returns the current nonce of an account, falling back to a real state -// database if the account is unknown. -func (txn *txNoncer) get(addr common.Address) uint64 { - // We use mutex for get operation is the underlying - // state will mutate db even for read access. - txn.lock.Lock() - defer txn.lock.Unlock() - - if _, ok := txn.nonces[addr]; !ok { - txn.nonces[addr] = txn.fallback.GetNonce(addr) - } - return txn.nonces[addr] -} - -// set inserts a new virtual nonce into the virtual state database to be returned -// whenever the pool requests it instead of reaching into the real state database. -func (txn *txNoncer) set(addr common.Address, nonce uint64) { - txn.lock.Lock() - defer txn.lock.Unlock() - - txn.nonces[addr] = nonce -} - -// setIfLower updates a new virtual nonce into the virtual state database if the -// the new one is lower. -func (txn *txNoncer) setIfLower(addr common.Address, nonce uint64) { - txn.lock.Lock() - defer txn.lock.Unlock() - - if _, ok := txn.nonces[addr]; !ok { - txn.nonces[addr] = txn.fallback.GetNonce(addr) - } - if txn.nonces[addr] <= nonce { - return - } - txn.nonces[addr] = nonce -} diff --git a/core/tx_pool.go b/core/tx_pool.go index 289df266838..fa9af11024b 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -18,41 +18,10 @@ package core import ( "errors" - "fmt" - "sort" - "sync" "time" - "github.com/VictoriaMetrics/metrics" - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/txpool" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/common/prque" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/olddb" - "github.com/ledgerwatch/erigon/event" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" -) - -const ( - // chainHeadChanSize is the size of channel listening to ChainHeadEvent. - chainHeadChanSize = 10 - - // txSlotSize is used to calculate how many data slots a single transaction - // takes up based on its size. The slots are used as DoS protection, ensuring - // that validating a new transaction remains a constant operation (in reality - // O(maxslots), where max slots are 4 currently). - txSlotSize = 32 * 1024 - - // txMaxSize is the maximum size a single transaction can have. This field has - // non-trivial consequences: larger transactions are significantly harder and - // more expensive to propagate; larger transactions also take more resources - // to validate whether they fit into the pool or not. - txMaxSize = 4 * txSlotSize // 128KB ) var ( @@ -89,54 +58,11 @@ var ( ErrOversizedData = errors.New("oversized data") ) -var ( - evictionInterval = time.Minute // Time interval to check for evictable transactions - statsReportInterval = 8 * time.Second // Time interval to report transaction pool stats -) - -var ( - // Metrics for the pending pool - pendingDiscardMeter = metrics.GetOrCreateCounter("txpool_pending_discard") - pendingReplaceMeter = metrics.GetOrCreateCounter("txpool_pending_replace") - pendingRateLimitMeter = metrics.GetOrCreateCounter("txpool_pending_ratelimit") // Dropped due to rate limiting - pendingNofundsMeter = metrics.GetOrCreateCounter("txpool_pending_nofunds") // Dropped due to out-of-funds - - // Metrics for the queued pool - queuedDiscardMeter = metrics.GetOrCreateCounter("txpool_queued_discard") - queuedReplaceMeter = metrics.GetOrCreateCounter("txpool_queued_replace") - queuedRateLimitMeter = metrics.GetOrCreateCounter("txpool_queued_ratelimit") // Dropped due to rate limiting - queuedNofundsMeter = metrics.GetOrCreateCounter("txpool_queued_nofunds") // Dropped due to out-of-funds - queuedEvictionMeter = metrics.GetOrCreateCounter("txpool_queued_eviction") // Dropped due to lifetime - - // General tx metrics - knownTxMeter = metrics.GetOrCreateCounter("txpool_known") - validTxMeter = metrics.GetOrCreateCounter("txpool_valid") - invalidTxMeter = metrics.GetOrCreateCounter("txpool_invalid") - underpricedTxMeter = metrics.GetOrCreateCounter("txpool_underpriced") - overflowedTxMeter = metrics.GetOrCreateCounter("txpool_overflowed") - - pendingGauge = metrics.GetOrCreateCounter("txpool_pending") - queuedGauge = metrics.GetOrCreateCounter("txpool_queued") - localGauge = metrics.GetOrCreateCounter("txpool_local") - slotsGauge = metrics.GetOrCreateCounter("txpool_slots") -) - -// TxStatus is the current status of a transaction as seen by the pool. -type TxStatus uint - -const ( - TxStatusUnknown TxStatus = iota - TxStatusQueued - TxStatusPending - TxStatusIncluded -) - // TxPoolConfig are the configuration parameters of the transaction pool. type TxPoolConfig struct { - Locals []common.Address // Addresses that should be treated by default as local - NoLocals bool // Whether local transaction handling should be disabled - Journal string // Journal of local transactions to survive node restarts - Rejournal time.Duration // Time interval to regenerate the local transaction journal + Disable bool + Locals []common.Address // Addresses that should be treated by default as local + NoLocals bool // Whether local transaction handling should be disabled PriceLimit uint64 // Minimum gas price to enforce for acceptance into the pool PriceBump uint64 // Minimum price bump percentage to replace an already existing transaction (nonce) @@ -146,1613 +72,38 @@ type TxPoolConfig struct { AccountQueue uint64 // Maximum number of non-executable transaction slots permitted per account GlobalQueue uint64 // Maximum number of non-executable transaction slots for all accounts - Lifetime time.Duration // Maximum amount of time non-executable transaction are queued - StartOnInit bool + GlobalBaseFeeQueue uint64 // Maximum number of non-executable transaction slots for all accounts + + Lifetime time.Duration // Maximum amount of time non-executable transaction are queued + StartOnInit bool + TracedSenders []string // List of senders for which tx pool should print out debugging info } -// DefaultTxPoolConfig contains the default configurations for the transaction +// DeprecatedDefaultTxPoolConfig contains the default configurations for the transaction // pool. -var DefaultTxPoolConfig = TxPoolConfig{ - Journal: "transactions.rlp", - Rejournal: time.Hour, - +var DeprecatedDefaultTxPoolConfig = TxPoolConfig{ PriceLimit: 1, PriceBump: 10, - AccountSlots: 16, - GlobalSlots: 4096, - AccountQueue: 64, - GlobalQueue: 1024, + AccountSlots: 16, + GlobalSlots: 10_000, + GlobalBaseFeeQueue: 30_000, + AccountQueue: 64, + GlobalQueue: 30_000, Lifetime: 3 * time.Hour, } -// sanitize checks the provided user configurations and changes anything that's -// unreasonable or unworkable. -func (config *TxPoolConfig) sanitize() TxPoolConfig { - conf := *config - if conf.Rejournal < time.Second { - log.Warn("Sanitizing invalid txpool journal time", "provided", conf.Rejournal, "updated", time.Second) - conf.Rejournal = time.Second - } - if conf.PriceLimit < 1 { - log.Warn("Sanitizing invalid txpool price limit", "provided", conf.PriceLimit, "updated", DefaultTxPoolConfig.PriceLimit) - conf.PriceLimit = DefaultTxPoolConfig.PriceLimit - } - if conf.PriceBump < 1 { - log.Warn("Sanitizing invalid txpool price bump", "provided", conf.PriceBump, "updated", DefaultTxPoolConfig.PriceBump) - conf.PriceBump = DefaultTxPoolConfig.PriceBump - } - if conf.AccountSlots < 1 { - log.Warn("Sanitizing invalid txpool account slots", "provided", conf.AccountSlots, "updated", DefaultTxPoolConfig.AccountSlots) - conf.AccountSlots = DefaultTxPoolConfig.AccountSlots - } - if conf.GlobalSlots < 1 { - log.Warn("Sanitizing invalid txpool global slots", "provided", conf.GlobalSlots, "updated", DefaultTxPoolConfig.GlobalSlots) - conf.GlobalSlots = DefaultTxPoolConfig.GlobalSlots - } - if conf.AccountQueue < 1 { - log.Warn("Sanitizing invalid txpool account queue", "provided", conf.AccountQueue, "updated", DefaultTxPoolConfig.AccountQueue) - conf.AccountQueue = DefaultTxPoolConfig.AccountQueue - } - if conf.GlobalQueue < 1 { - log.Warn("Sanitizing invalid txpool global queue", "provided", conf.GlobalQueue, "updated", DefaultTxPoolConfig.GlobalQueue) - conf.GlobalQueue = DefaultTxPoolConfig.GlobalQueue - } - if conf.Lifetime < 1 { - log.Warn("Sanitizing invalid txpool lifetime", "provided", conf.Lifetime, "updated", DefaultTxPoolConfig.Lifetime) - conf.Lifetime = DefaultTxPoolConfig.Lifetime - } - return conf -} - -// Backend contains all currently known transactions. Transactions -// enter the pool when they are received from the network or submitted -// locally. They exit the pool when they are included in the blockchain. -// -// The pool separates processable transactions (which can be applied to the -// current state) and future transactions. Transactions move between those -// two states over time as they are received and processed. -type TxPool struct { - config TxPoolConfig - chainconfig *params.ChainConfig - chaindb ethdb.Database - gasPrice *uint256.Int - txFeed event.Feed - scope event.SubscriptionScope - chainHeadCh chan ChainHeadEvent - signer *types.Signer - mu sync.RWMutex - - istanbul bool // Fork indicator whether we are in the istanbul stage. - eip2718 bool // Fork indicator whether we are using EIP-2718 type transactions. - - pendingNonces *txNoncer // Pending state tracking virtual nonces - currentState *state.IntraBlockState // Current state in the blockchain head - currentMaxGas uint64 // Current gas limit for transaction caps - - locals *accountSet // Set of local transaction to exempt from eviction rules - journal *txJournal // Journal of local transaction to back up to disk - - pending map[common.Address]*txList // All currently processable transactions - queue map[common.Address]*txList // Queued but non-processable transactions - beats map[common.Address]time.Time // Last heartbeat from each known account - all *txLookup // All transactions to allow lookups - priced *txPricedList // All transactions sorted by price - - reqResetCh chan *txpoolResetRequest - reqPromoteCh chan *accountSet - queueTxEventCh chan types.Transaction - reorgDoneCh chan chan struct{} - reorgShutdownCh chan struct{} // requests shutdown of scheduleReorgLoop - wg sync.WaitGroup // tracks loop, scheduleReorgLoop - isStarted bool - initFns []func() error - stopFns []func() error - stopCh chan struct{} -} - -type txpoolResetRequest struct { - oldHead, newHead *types.Header -} - -// NewTxPool creates a new transaction pool to gather, sort and filter inbound -// transactions from the network. -func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chaindb kv.RwDB) *TxPool { - // Sanitize the input to ensure no vulnerable gas prices are set - config = (&config).sanitize() - - // Create the transaction pool with its initial settings - pool := &TxPool{ - config: config, - chainconfig: chainconfig, - signer: types.LatestSigner(chainconfig), - pending: make(map[common.Address]*txList), - queue: make(map[common.Address]*txList), - beats: make(map[common.Address]time.Time), - all: newTxLookup(), - chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), - reqResetCh: make(chan *txpoolResetRequest), - reqPromoteCh: make(chan *accountSet), - queueTxEventCh: make(chan types.Transaction), - reorgDoneCh: make(chan chan struct{}), - reorgShutdownCh: make(chan struct{}, 1), - gasPrice: new(uint256.Int).SetUint64(config.PriceLimit), - stopCh: make(chan struct{}), - chaindb: olddb.NewObjectDatabase(chaindb), - } - pool.locals = newAccountSet(pool.signer) - for _, addr := range pool.config.Locals { - pool.locals.add(addr) - } - pool.priced = newTxPricedList(pool.all) - - return pool -} - -func (pool *TxPool) Start(gasLimit uint64, headNumber uint64) error { - pool.reorgShutdownCh = make(chan struct{}, 1) - - pool.locals = newAccountSet(pool.signer) - for _, addr := range pool.config.Locals { - pool.locals.add(addr) - } - - pool.priced = newTxPricedList(pool.all) - pool.resetHead(gasLimit, headNumber) - - // Start the reorg loop early so it can handle requests generated during journal loading. - pool.wg.Add(1) - go pool.scheduleReorgLoop() - - // If local transactions and journaling is enabled, load from disk - if !pool.config.NoLocals && pool.config.Journal != "" { - pool.journal = newTxJournal(pool.config.Journal) - - if err := pool.journal.load(pool.AddLocals); err != nil { - log.Warn("Failed to load transaction journal", "err", err) - } - if err := pool.journal.rotate(pool.local()); err != nil { - log.Warn("Failed to rotate transaction journal", "err", err) - } - } - - pool.wg.Add(1) - go pool.loop() - - pool.isStarted = true - - log.Info("transaction pool started") - return nil -} - -// loop is the transaction pool's main event loop, waiting for and reacting to -// outside blockchain events as well as for various reporting and transaction -// eviction events. -func (pool *TxPool) loop() { - defer debug.LogPanic() - defer pool.wg.Done() - - var ( - prevPending, prevQueued, prevStales int - // Start the stats reporting and transaction eviction tickers - report = time.NewTicker(statsReportInterval) - evict = time.NewTicker(evictionInterval) - journal = time.NewTicker(pool.config.Rejournal) - ) - defer report.Stop() - defer evict.Stop() - defer journal.Stop() - - for { - select { - - // System shutdown. - case <-pool.stopCh: - common.SafeClose(pool.reorgShutdownCh) - return - - // Handle stats reporting ticks - case <-report.C: - pool.mu.RLock() - pending, queued := pool.stats() - stales := pool.priced.stales - pool.mu.RUnlock() - - if pending != prevPending || queued != prevQueued || stales != prevStales { - log.Debug("Transaction pool status report", "executable", pending, "queued", queued, "stales", stales) - prevPending, prevQueued, prevStales = pending, queued, stales - } - - // Handle inactive account transaction eviction - case <-evict.C: - pool.mu.Lock() - for addr := range pool.queue { - // Skip local transactions from the eviction mechanism - if pool.locals.contains(addr) { - continue - } - // Any non-locals old enough should be removed - if time.Since(pool.beats[addr]) > pool.config.Lifetime { - list := pool.queue[addr].Flatten() - for _, tx := range list { - pool.removeTxLocked(tx.Hash(), true) - } - queuedEvictionMeter.Set(uint64(len(list))) - } - } - pool.mu.Unlock() - - // Handle local transaction journal rotation - case <-journal.C: - if pool.journal != nil { - pool.mu.Lock() - if err := pool.journal.rotate(pool.local()); err != nil { - log.Warn("Failed to rotate local tx journal", "err", err) - } - pool.mu.Unlock() - } - } - } -} - -func (pool *TxPool) resetHead(blockGasLimit uint64, blockNumber uint64) { - pool.mu.Lock() - defer pool.mu.Unlock() - pool.currentState = state.New(state.NewPlainStateReader(pool.chaindb)) - pool.pendingNonces = newTxNoncer(pool.currentState) - pool.currentMaxGas = blockGasLimit - - // Update all fork indicator by next pending block number. - next := blockNumber + 1 - pool.istanbul = pool.chainconfig.IsIstanbul(next) - pool.eip2718 = pool.chainconfig.IsBerlin(next) -} - -func (pool *TxPool) ResetHead(blockGasLimit uint64, blockNumber uint64) { - pool.resetHead(blockGasLimit, blockNumber) - <-pool.requestReset(nil, nil) -} - -// Stop terminates the transaction pool. -func (pool *TxPool) Stop() { - // Unsubscribe all subscriptions registered from txpool - if !pool.IsStarted() { - return - } - close(pool.stopCh) - - // Unsubscribe subscriptions registered from blockchain - pool.wg.Wait() - - if pool.journal != nil { - pool.journal.close() - } - - pool.isStarted = false - - log.Info("Transaction pool stopped") -} - -// SubscribeNewTxsEvent registers a subscription of NewTxsEvent and -// starts sending event to the given channel. -func (pool *TxPool) SubscribeNewTxsEvent(ch chan<- NewTxsEvent) event.Subscription { - return pool.scope.Track(pool.txFeed.Subscribe(ch)) -} - -// GasPrice returns the current gas price enforced by the transaction pool. -func (pool *TxPool) GasPrice() *uint256.Int { - pool.mu.RLock() - defer pool.mu.RUnlock() - - return new(uint256.Int).Set(pool.gasPrice) -} - -// SetGasPrice updates the minimum price required by the transaction pool for a -// new transaction, and drops all transactions below this threshold. -func (pool *TxPool) SetGasPrice(price *uint256.Int) { - pool.mu.Lock() - defer pool.mu.Unlock() - - pool.gasPrice = price - for _, tx := range pool.priced.Cap(price) { - pool.RemoveTx(tx.Hash(), false) - } - log.Info("Transaction pool price threshold updated", "price", price) -} - -// Nonce returns the next nonce of an account, with all transactions executable -// by the pool already applied on top. -func (pool *TxPool) Nonce(addr common.Address) uint64 { - pool.mu.RLock() - defer pool.mu.RUnlock() - - return pool.pendingNonces.get(addr) -} - -// Stats retrieves the current pool stats, namely the number of pending and the -// number of queued (non-executable) transactions. -func (pool *TxPool) Stats() (int, int) { - pool.mu.RLock() - defer pool.mu.RUnlock() - - return pool.stats() -} - -// stats retrieves the current pool stats, namely the number of pending and the -// number of queued (non-executable) transactions. -func (pool *TxPool) stats() (int, int) { - pending := 0 - for _, list := range pool.pending { - pending += list.Len() - } - queued := 0 - for _, list := range pool.queue { - queued += list.Len() - } - return pending, queued -} - -// Content retrieves the data content of the transaction pool, returning all the -// pending as well as queued transactions, grouped by account and sorted by nonce. -func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { - pool.mu.Lock() - defer pool.mu.Unlock() - - pending := make(map[common.Address]types.Transactions) - for addr, list := range pool.pending { - pending[addr] = list.Flatten() - } - queued := make(map[common.Address]types.Transactions) - for addr, list := range pool.queue { - queued[addr] = list.Flatten() - } - return pending, queued -} - -// Pending retrieves all currently processable transactions, grouped by origin -// account and sorted by nonce. The returned transaction set is a copy and can be -// freely modified by calling code. -func (pool *TxPool) Pending() (types.TransactionsGroupedBySender, error) { - var pending types.TransactionsGroupedBySender - if !pool.IsStarted() { - return pending, nil - } - pool.mu.Lock() - defer pool.mu.Unlock() - pending = make(types.TransactionsGroupedBySender, len(pool.pending)) - for _, list := range pool.pending { - pending = append(pending, list.Flatten()) - } - return pending, nil -} - -// AppendHashes to given buffer and return it -func (pool *TxPool) AppendHashes(buf []common.Hash) []common.Hash { - if !pool.IsStarted() { - return buf - } - pool.mu.Lock() - defer pool.mu.Unlock() - for _, list := range pool.pending { - buf = list.AppendHashes(buf) - } - return buf -} - -// AppendLocalHashes to given buffer and return it -func (pool *TxPool) AppendLocalHashes(buf []common.Hash) []common.Hash { - if !pool.IsStarted() { - return buf - } - pool.mu.Lock() - defer pool.mu.Unlock() - for txHash := range pool.all.locals { - buf = append(buf, txHash) - } - return buf -} - -// Locals retrieves the accounts currently considered local by the pool. -func (pool *TxPool) Locals() []common.Address { - pool.mu.Lock() - defer pool.mu.Unlock() - - return pool.locals.flatten() -} - -// local retrieves all currently known local transactions, grouped by origin -// account and sorted by nonce. The returned transaction set is a copy and can be -// freely modified by calling code. -func (pool *TxPool) local() map[common.Address]types.Transactions { - txs := make(map[common.Address]types.Transactions) - for addr := range pool.locals.accounts { - if pending := pool.pending[addr]; pending != nil { - txs[addr] = append(txs[addr], pending.Flatten()...) - } - if queued := pool.queue[addr]; queued != nil { - txs[addr] = append(txs[addr], queued.Flatten()...) - } - } - return txs -} - -// validateTx checks whether a transaction is valid according to the consensus -// rules and adheres to some heuristic limits of the local node (price and size). -func (pool *TxPool) validateTx(tx types.Transaction, local bool) error { - // Accept only legacy transactions until EIP-2718/2930 activates. - if !pool.eip2718 && tx.Type() != types.LegacyTxType { - return ErrTxTypeNotSupported - } - // Reject transactions over defined size to prevent DOS attacks - if uint64(tx.Size()) > txMaxSize { - return ErrOversizedData - } - // Transactions can't be negative. This may never happen using RLP decoded - // transactions but may occur if you create a transaction using the RPC. - if tx.GetValue().Sign() < 0 { - return ErrNegativeValue - } - // Ensure the transaction doesn't exceed the current block limit gas. - if pool.currentMaxGas < tx.GetGas() { - return ErrGasLimit - } - // Sanity check for extremely large numbers - if tx.GetFeeCap().BitLen() > 256 { - return ErrFeeCapVeryHigh - } - if tx.GetTip().BitLen() > 256 { - return ErrTipVeryHigh - } - // Make sure the transaction is signed properly. - from, err := tx.Sender(*pool.signer) - if err != nil { - return ErrInvalidSender - } - // Drop non-local transactions under our own minimal accepted gas price - if !local && pool.gasPrice.Gt(tx.GetPrice()) { - return ErrUnderpriced - } - // Ensure the transaction adheres to nonce ordering - if pool.currentState.GetNonce(from) > tx.GetNonce() { - return ErrNonceTooLow - } - // Transactor should have enough funds to cover the costs - // cost == V + GP * GL - if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 { - return ErrInsufficientFunds - } - // Ensure the transaction has more gas than the basic tx fee. - intrGas, err := IntrinsicGas(tx.GetData(), tx.GetAccessList(), tx.GetTo() == nil, true, pool.istanbul) - if err != nil { - return err - } - if tx.GetGas() < intrGas { - return ErrIntrinsicGas - } - return nil -} - -// add validates a transaction and inserts it into the non-executable queue for later -// pending promotion and execution. If the transaction is a replacement for an already -// pending or queued one, it overwrites the previous transaction if its price is higher. -// -// If a newly added transaction is marked as local, its sending account will be -// whitelisted, preventing any associated transaction from being dropped out of the pool -// due to pricing constraints. -func (pool *TxPool) add(tx types.Transaction, local bool) (replaced bool, err error) { - // If the transaction is already known, discard it - hash := tx.Hash() - if pool.all.Get(hash) != nil { - log.Trace("Discarding already known transaction", "hash", hash) - knownTxMeter.Set(1) - return false, ErrAlreadyKnown - } - // Make the local flag. If it's from local source or it's from the network but - // the sender is marked as local previously, treat it as the local transaction. - isLocal := local || pool.locals.containsTx(tx) - - // If the transaction fails basic validation, discard it - if pool.currentState != nil { - if err = pool.validateTx(tx, isLocal); err != nil { - log.Trace("Discarding invalid transaction", "hash", hash, "err", err) - invalidTxMeter.Set(1) - return false, err - } - } - // If the transaction pool is full, discard underpriced transactions - if uint64(pool.all.Count()+numSlots(tx)) > pool.config.GlobalSlots+pool.config.GlobalQueue { - // If the new transaction is underpriced, don't accept it - if !isLocal && pool.priced.Underpriced(tx) { - log.Trace("Discarding underpriced transaction", "hash", hash, "price", tx.GetPrice()) - underpricedTxMeter.Set(1) - return false, ErrUnderpriced - } - // New transaction is better than our worse ones, make room for it. - // If it's a local transaction, forcibly discard all available transactions. - // Otherwise if we can't make enough room for new one, abort the operation. - drop, success := pool.priced.Discard(pool.all.Slots()-int(pool.config.GlobalSlots+pool.config.GlobalQueue)+numSlots(tx), isLocal) - - // Special case, we still can't make the room for the new remote one. - if !isLocal && !success { - log.Trace("Discarding overflown transaction", "hash", hash) - overflowedTxMeter.Set(1) - return false, ErrTxPoolOverflow - } - // Kick out the underpriced remote transactions. - for _, tx := range drop { - log.Trace("Discarding freshly underpriced transaction", "hash", tx.Hash(), "price", tx.GetPrice()) - underpricedTxMeter.Set(1) - pool.removeTxLocked(tx.Hash(), false) - } - } - // Try to replace an existing transaction in the pending pool - from, _ := tx.Sender(*pool.signer) // already validated - if list := pool.pending[from]; list != nil && list.Overlaps(tx) { - // Nonce already pending, check if required price bump is met - inserted, old := list.Add(tx, pool.config.PriceBump) - if !inserted { - pendingDiscardMeter.Set(1) - return false, ErrReplaceUnderpriced - } - // New transaction is better, replace old one - if old != nil { - pool.all.Remove(old.Hash()) - pool.priced.Removed(1) - pendingReplaceMeter.Set(1) - } - pool.all.Add(tx, isLocal) - pool.priced.Put(tx, isLocal) - pool.journalTx(from, tx) - pool.queueTxEvent(tx) - log.Trace("Pooled new executable transaction", "hash", hash, "from", from, "to", tx.GetTo()) - - // Successful promotion, bump the heartbeat - pool.beats[from] = time.Now() - return old != nil, nil - } - // New transaction isn't replacing a pending one, push into queue - replaced, err = pool.enqueueTx(hash, tx, isLocal, true) - if err != nil { - return false, err - } - // Mark local addresses and journal local transactions - if local && !pool.locals.contains(from) { - log.Info("Setting new local account", "address", from) - pool.locals.add(from) - pool.priced.Removed(pool.all.RemoteToLocals(pool.locals)) // Migrate the remotes if it's marked as local first time. - } - if isLocal { - localGauge.Inc() - } - pool.journalTx(from, tx) - - log.Trace("Pooled new future transaction", "hash", hash, "from", from, "to", tx.GetTo()) - return replaced, nil -} - -// enqueueTx inserts a new transaction into the non-executable transaction queue. -// -// Note, this method assumes the pool lock is held! -func (pool *TxPool) enqueueTx(hash common.Hash, tx types.Transaction, local bool, addAll bool) (bool, error) { - // Try to insert the transaction into the future queue - from, _ := tx.Sender(*pool.signer) // already validated - if pool.queue[from] == nil { - pool.queue[from] = newTxList(false) - } - inserted, old := pool.queue[from].Add(tx, pool.config.PriceBump) - if !inserted { - // An older transaction was better, discard this - queuedDiscardMeter.Set(1) - return false, ErrReplaceUnderpriced - } - // Discard any previous transaction and mark this - if old != nil { - pool.all.Remove(old.Hash()) - pool.priced.Removed(1) - queuedReplaceMeter.Set(1) - } else { - // Nothing was replaced, bump the queued counter - queuedGauge.Inc() - } - // If the transaction isn't in lookup set but it's expected to be there, - // show the error log. - if pool.all.Get(hash) == nil && !addAll { - log.Error("Missing transaction in lookup set, please report the issue", "hash", hash) - } - if addAll { - pool.all.Add(tx, local) - pool.priced.Put(tx, local) - } - // If we never record the heartbeat, do it right now. - if _, exist := pool.beats[from]; !exist { - pool.beats[from] = time.Now() - } - return old != nil, nil -} - -// journalTx adds the specified transaction to the local disk journal if it is -// deemed to have been sent from a local account. -func (pool *TxPool) journalTx(from common.Address, tx types.Transaction) { - // Only journal if it's enabled and the transaction is local - if pool.journal == nil || !pool.locals.contains(from) { - return - } - if err := pool.journal.insert(tx); err != nil { - log.Warn("Failed to journal local transaction", "err", err) - } -} - -// promoteTx adds a transaction to the pending (processable) list of transactions -// and returns whether it was inserted or an older was better. -// -// Note, this method assumes the pool lock is held! -func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx types.Transaction) bool { - // Try to insert the transaction into the pending queue - if pool.pending[addr] == nil { - pool.pending[addr] = newTxList(true) - } - list := pool.pending[addr] - - inserted, old := list.Add(tx, pool.config.PriceBump) - if !inserted { - // An older transaction was better, discard this - pool.all.Remove(hash) - pool.priced.Removed(1) - pendingDiscardMeter.Set(1) - return false - } - // Otherwise discard any previous transaction and mark this - if old != nil { - pool.all.Remove(old.Hash()) - pool.priced.Removed(1) - pendingReplaceMeter.Set(1) - } else { - // Nothing was replaced, bump the pending counter - pendingGauge.Inc() - } - // Set the potentially new pending nonce and notify any subsystems of the new tx - pool.pendingNonces.set(addr, tx.GetNonce()+1) - - // Successful promotion, bump the heartbeat - pool.beats[addr] = time.Now() - return true -} - -// AddLocals enqueues a batch of transactions into the pool if they are valid, marking the -// senders as a local ones, ensuring they go around the local pricing constraints. -// -// This method is used to add transactions from the RPC API and performs synchronous pool -// reorganization and event propagation. -func (pool *TxPool) AddLocals(txs []types.Transaction) []error { - return pool.addTxs(txs, !pool.config.NoLocals, true) -} - -func (pool *TxPool) IsLocalTx(txHash common.Hash) bool { - return pool.all.GetLocal(txHash) != nil -} - -// AddLocal enqueues a single local transaction into the pool if it is valid. This is -// a convenience wrapper aroundd AddLocals. -func (pool *TxPool) AddLocal(tx types.Transaction) error { - errs := pool.AddLocals([]types.Transaction{tx}) - return errs[0] -} - -// AddRemotes enqueues a batch of transactions into the pool if they are valid. If the -// senders are not among the locally tracked ones, full pricing constraints will apply. -// -// This method is used to add transactions from the p2p network and does not wait for pool -// reorganization and internal event propagation. -func (pool *TxPool) AddRemotes(txs []types.Transaction) []error { - return pool.addTxs(txs, false, false) -} - -// This is like AddRemotes, but waits for pool reorganization. Tests use this method. -func (pool *TxPool) AddRemotesSync(txs []types.Transaction) []error { - return pool.addTxs(txs, false, true) -} - -// This is like AddRemotes with a single transaction, but waits for pool reorganization. Tests use this method. -func (pool *TxPool) addRemoteSync(tx types.Transaction) error { - errs := pool.AddRemotesSync([]types.Transaction{tx}) - return errs[0] -} - -// AddRemote enqueues a single transaction into the pool if it is valid. This is a convenience -// wrapper around AddRemotes. -// -// Deprecated: use AddRemotes -func (pool *TxPool) AddRemote(tx types.Transaction) error { - errs := pool.AddRemotes([]types.Transaction{tx}) - return errs[0] -} - -// addTxs attempts to queue a batch of transactions if they are valid. -func (pool *TxPool) addTxs(txs []types.Transaction, local, sync bool) []error { - // Filter out known ones without obtaining the pool lock or recovering signatures - var ( - errs = make([]error, len(txs)) - news = make([]types.Transaction, 0, len(txs)) - ) - for i, tx := range txs { - // If the transaction is known, pre-set the error slot - if pool.all.Get(tx.Hash()) != nil { - errs[i] = ErrAlreadyKnown - knownTxMeter.Set(1) - continue - } - // Exclude transactions with invalid signatures as soon as - // possible and cache senders in transactions before - // obtaining lock - _, err := tx.Sender(*pool.signer) - if err != nil { - errs[i] = ErrInvalidSender - invalidTxMeter.Set(1) - continue - } - // Accumulate all unknown transactions for deeper processing - news = append(news, tx) - } - if len(news) == 0 { - return errs - } - - // Process all the new transaction and merge any errors into the original slice - pool.mu.Lock() - newErrs, dirtyAddrs := pool.addTxsLocked(news, local) - pool.mu.Unlock() - var nilSlot = 0 - for _, err := range newErrs { - for errs[nilSlot] != nil { - nilSlot++ - } - errs[nilSlot] = err - nilSlot++ - } - // Reorg the pool internals if needed and return - done := pool.requestPromoteExecutables(dirtyAddrs) - if sync { - <-done - } - return errs -} - -// addTxsLocked attempts to queue a batch of transactions if they are valid. -// The transaction pool lock must be held. -func (pool *TxPool) addTxsLocked(txs []types.Transaction, local bool) ([]error, *accountSet) { - dirty := newAccountSet(pool.signer) - errs := make([]error, len(txs)) - for i, tx := range txs { - replaced, err := pool.add(tx, local) - errs[i] = err - if err == nil && !replaced { - dirty.addTx(tx) - } - } - validTxMeter.Set(uint64(len(dirty.accounts))) - return errs, dirty -} - -// Status returns the status (unknown/pending/queued) of a batch of transactions -// identified by their hashes. -func (pool *TxPool) Status(hashes []common.Hash) []TxStatus { - status := make([]TxStatus, len(hashes)) - for i, hash := range hashes { - tx := pool.Get(hash) - if tx == nil { - continue - } - from, _ := tx.Sender(*pool.signer) // already validated - pool.mu.RLock() - if txList := pool.pending[from]; txList != nil && txList.txs.items[tx.GetNonce()] != nil { - status[i] = TxStatusPending - } else if txList := pool.queue[from]; txList != nil && txList.txs.items[tx.GetNonce()] != nil { - status[i] = TxStatusQueued - } - // implicit else: the tx may have been included into a block between - // checking pool.Get and obtaining the lock. In that case, TxStatusUnknown is correct - pool.mu.RUnlock() - } - return status -} - -// Get returns a transaction if it is contained in the pool and nil otherwise. -func (pool *TxPool) Get(hash common.Hash) types.Transaction { - return pool.all.Get(hash) -} - -// Has returns an indicator whether txpool has a transaction cached with the -// given hash. -func (pool *TxPool) Has(hash common.Hash) bool { - return pool.all.Get(hash) != nil -} - -// removeTx removes a single transaction from the queue, moving all subsequent -// transactions back to the future queue. -func (pool *TxPool) RemoveTx(hash common.Hash, outofbound bool) { - pool.mu.Lock() - defer pool.mu.Unlock() - pool.removeTxLocked(hash, outofbound) -} - -func (pool *TxPool) removeTxLocked(hash common.Hash, outofbound bool) { - // Fetch the transaction we wish to delete - tx := pool.all.Get(hash) - if tx == nil { - return - } - addr, _ := tx.Sender(*pool.signer) // already validated during insertion - - // Remove it from the list of known transactions - pool.all.Remove(hash) - if outofbound { - pool.priced.Removed(1) - } - if pool.locals.contains(addr) { - localGauge.Dec() - } - // Remove the transaction from the pending lists and reset the account nonce - if pending := pool.pending[addr]; pending != nil { - if removed, invalids := pending.Remove(tx); removed { - // If no more pending transactions are left, remove the list - if pending.Empty() { - delete(pool.pending, addr) - } - // Postpone any invalidated transactions - for _, tx := range invalids { - // Internal shuffle shouldn't touch the lookup set. - if _, err := pool.enqueueTx(tx.Hash(), tx, false, false); err != nil { - log.Error("enqueueTx", "error", err) - } - } - // Update the account nonce if needed - pool.pendingNonces.setIfLower(addr, tx.GetNonce()) - // Reduce the pending counter - pendingGauge.Add(-(1 + len(invalids))) - return - } - } - // Transaction is in the future queue - if future := pool.queue[addr]; future != nil { - if removed, _ := future.Remove(tx); removed { - // Reduce the queued counter - queuedGauge.Dec() - } - if future.Empty() { - delete(pool.queue, addr) - delete(pool.beats, addr) - } - } -} - -// requestPromoteExecutables requests a pool reset to the new head block. -// The returned channel is closed when the reset has occurred. -func (pool *TxPool) requestReset(oldHead *types.Header, newHead *types.Header) chan struct{} { - select { - case pool.reqResetCh <- &txpoolResetRequest{oldHead, newHead}: - return <-pool.reorgDoneCh - case <-pool.reorgShutdownCh: - return pool.reorgShutdownCh - } -} - -// requestPromoteExecutables requests transaction promotion checks for the given addresses. -// The returned channel is closed when the promotion checks have occurred. -func (pool *TxPool) requestPromoteExecutables(set *accountSet) chan struct{} { - select { - case pool.reqPromoteCh <- set: - return <-pool.reorgDoneCh - case <-pool.reorgShutdownCh: - return pool.reorgShutdownCh - } -} - -// queueTxEvent enqueues a transaction event to be sent in the next reorg run. -func (pool *TxPool) queueTxEvent(tx types.Transaction) { - select { - case pool.queueTxEventCh <- tx: - case <-pool.reorgShutdownCh: - } -} - -// scheduleReorgLoop schedules runs of reset and promoteExecutables. Code above should not -// call those methods directly, but request them being run using requestReset and -// requestPromoteExecutables instead. -func (pool *TxPool) scheduleReorgLoop() { - defer debug.LogPanic() - defer pool.wg.Done() - - var ( - curDone chan struct{} // non-nil while runReorg is active - nextDone = make(chan struct{}) - launchNextRun bool - dirtyAccounts *accountSet - queuedEvents = make(map[common.Address]*txSortedMap) - reset bool - ) - for { - // Launch next background reorg if needed - if curDone == nil && launchNextRun { - // Run the background reorg and announcements - go pool.runReorg(nextDone, dirtyAccounts, queuedEvents, reset) - - // Prepare everything for the next round of reorg - curDone, nextDone = nextDone, make(chan struct{}) - launchNextRun = false - - dirtyAccounts = nil - reset = false - queuedEvents = make(map[common.Address]*txSortedMap) - } - - select { - - case <-pool.reqResetCh: - // Reset request: update head if request is already pending. - reset = true - launchNextRun = true - pool.reorgDoneCh <- nextDone - case req := <-pool.reqPromoteCh: - // Promote request: update address set if request is already pending. - if dirtyAccounts == nil { - dirtyAccounts = req - } else { - dirtyAccounts.merge(req) - } - launchNextRun = true - pool.reorgDoneCh <- nextDone - - case tx := <-pool.queueTxEventCh: - // Queue up the event, but don't schedule a reorg. It's up to the caller to - // request one later if they want the events sent. - addr, _ := tx.Sender(*pool.signer) - if _, ok := queuedEvents[addr]; !ok { - queuedEvents[addr] = newTxSortedMap() - } - queuedEvents[addr].Put(tx) - - case <-curDone: - curDone = nil - - case <-pool.reorgShutdownCh: - // Wait for current run to finish. - if curDone != nil { - <-curDone - } - close(nextDone) - return - } - } -} - -// runReorg runs reset and promoteExecutables on behalf of scheduleReorgLoop. -func (pool *TxPool) runReorg(done chan struct{}, dirtyAccounts *accountSet, events map[common.Address]*txSortedMap, reset bool) { - defer debug.LogPanic() - defer close(done) - - var promoteAddrs []common.Address - if dirtyAccounts != nil && !reset { - // Only dirty accounts need to be promoted, unless we're resetting. - // For resets, all addresses in the tx queue will be promoted and - // the flatten operation can be avoided. - promoteAddrs = dirtyAccounts.flatten() - } - pool.mu.Lock() - if reset { - // Nonces were reset, discard any events that became stale - for addr := range events { - events[addr].Forward(pool.pendingNonces.get(addr)) - if events[addr].Len() == 0 { - delete(events, addr) - } - } - // Reset needs promote for all addresses - promoteAddrs = make([]common.Address, 0, len(pool.queue)) - for addr := range pool.queue { - promoteAddrs = append(promoteAddrs, addr) - } - } - // Check for pending transactions for every account that sent new ones - promoted := pool.promoteExecutables(promoteAddrs) - // If a new block appeared, validate the pool of pending transactions. This will - // remove any transaction that has been included in the block or was invalidated - // because of another transaction (e.g. higher gas price). - if reset { - pool.demoteUnexecutables() - } - - // Ensure pool.queue and pool.pending sizes stay within the configured limits. - pool.truncatePending() - pool.truncateQueue() - - // Update all accounts to the latest known pending nonce - for addr, list := range pool.pending { - highestPending := list.LastElement() - pool.pendingNonces.set(addr, highestPending.GetNonce()+1) - } - pool.mu.Unlock() - - // Notify subsystems for newly added transactions - for _, tx := range promoted { - addr, _ := tx.Sender(*pool.signer) - if _, ok := events[addr]; !ok { - events[addr] = newTxSortedMap() - } - events[addr].Put(tx) - } - if len(events) > 0 { - var txs []types.Transaction - for _, set := range events { - txs = append(txs, set.Flatten()...) - } - pool.txFeed.Send(NewTxsEvent{txs}) - } -} - -// promoteExecutables moves transactions that have become processable from the -// future queue to the set of pending transactions. During this process, all -// invalidated transactions (low nonce, low balance) are deleted. -func (pool *TxPool) promoteExecutables(accounts []common.Address) []types.Transaction { - // Track the promoted transactions to broadcast them at once - var promoted []types.Transaction - - // Iterate over all accounts and promote any executable transactions - for _, addr := range accounts { - list := pool.queue[addr] - if list == nil { - continue // Just in case someone calls with a non existing account - } - // Drop all transactions that are deemed too old (low nonce) - forwards := list.Forward(pool.currentState.GetNonce(addr)) - for _, tx := range forwards { - hash := tx.Hash() - pool.all.Remove(hash) - } - log.Trace("Removed old queued transactions", "count", len(forwards)) - // Drop all transactions that are too costly (low balance or out of gas) - drops, _ := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) - for _, tx := range drops { - hash := tx.Hash() - pool.all.Remove(hash) - } - log.Trace("Removed unpayable queued transactions", "count", len(drops)) - queuedNofundsMeter.Set(uint64(len(drops))) - - // Gather all executable transactions and promote them - readies := list.Ready(pool.pendingNonces.get(addr)) - for _, tx := range readies { - hash := tx.Hash() - if pool.promoteTx(addr, hash, tx) { - promoted = append(promoted, tx) - } - } - log.Trace("Promoted queued transactions", "count", len(promoted)) - queuedGauge.Add(-len(readies)) - - // Drop all transactions over the allowed limit - var caps types.Transactions - if !pool.locals.contains(addr) { - caps = list.Cap(int(pool.config.AccountQueue)) - for _, tx := range caps { - hash := tx.Hash() - pool.all.Remove(hash) - log.Trace("Removed cap-exceeding queued transaction", "hash", hash) - } - queuedRateLimitMeter.Set(uint64(len(caps))) - } - // Mark all the items dropped as removed - pool.priced.Removed(len(forwards) + len(drops) + len(caps)) - queuedGauge.Add(-int(len(forwards) + len(drops) + len(caps))) - if pool.locals.contains(addr) { - localGauge.Add(-int(len(forwards) + len(drops) + len(caps))) - } - // Delete the entire queue entry if it became empty. - if list.Empty() { - delete(pool.queue, addr) - delete(pool.beats, addr) - } - } - return promoted -} - -// truncatePending removes transactions from the pending queue if the pool is above the -// pending limit. The algorithm tries to reduce transaction counts by an approximately -// equal number for all for accounts with many pending transactions. -func (pool *TxPool) truncatePending() { - pending := uint64(0) - for _, list := range pool.pending { - pending += uint64(list.Len()) - } - if pending <= pool.config.GlobalSlots { - return - } - - pendingBeforeCap := pending - // Assemble a spam order to penalize large transactors first - spammers := prque.New(nil) - for addr, list := range pool.pending { - // Only evict transactions from high rollers - if !pool.locals.contains(addr) && uint64(list.Len()) > pool.config.AccountSlots { - spammers.Push(addr, int64(list.Len())) - } - } - // Gradually drop transactions from offenders - offenders := []common.Address{} - for pending > pool.config.GlobalSlots && !spammers.Empty() { - // Retrieve the next offender if not local address - offender, _ := spammers.Pop() - offenders = append(offenders, offender.(common.Address)) - - // Equalize balances until all the same or below threshold - if len(offenders) > 1 { - // Calculate the equalization threshold for all current offenders - threshold := pool.pending[offender.(common.Address)].Len() - - // Iteratively reduce all offenders until below limit or threshold reached - for pending > pool.config.GlobalSlots && pool.pending[offenders[len(offenders)-2]].Len() > threshold { - for i := 0; i < len(offenders)-1; i++ { - list := pool.pending[offenders[i]] - - caps := list.Cap(list.Len() - 1) - for _, tx := range caps { - // Drop the transaction from the global pools too - hash := tx.Hash() - pool.all.Remove(hash) - - // Update the account nonce to the dropped transaction - pool.pendingNonces.setIfLower(offenders[i], tx.GetNonce()) - log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) - } - pool.priced.Removed(len(caps)) - pendingGauge.Add(-len(caps)) - if pool.locals.contains(offenders[i]) { - localGauge.Add(-len(caps)) - } - pending-- - } - } - } - } - - // If still above threshold, reduce to limit or min allowance - if pending > pool.config.GlobalSlots && len(offenders) > 0 { - for pending > pool.config.GlobalSlots && uint64(pool.pending[offenders[len(offenders)-1]].Len()) > pool.config.AccountSlots { - for _, addr := range offenders { - list := pool.pending[addr] - - caps := list.Cap(list.Len() - 1) - for _, tx := range caps { - // Drop the transaction from the global pools too - hash := tx.Hash() - pool.all.Remove(hash) - - // Update the account nonce to the dropped transaction - pool.pendingNonces.setIfLower(addr, tx.GetNonce()) - log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) - } - pool.priced.Removed(len(caps)) - pendingGauge.Add(-len(caps)) - if pool.locals.contains(addr) { - localGauge.Add(len(caps)) - } - pending-- - } - } - } - pendingRateLimitMeter.Set(pendingBeforeCap - pending) -} - -// truncateQueue drops the oldes transactions in the queue if the pool is above the global queue limit. -func (pool *TxPool) truncateQueue() { - queued := uint64(0) - for _, list := range pool.queue { - queued += uint64(list.Len()) - } - if queued <= pool.config.GlobalQueue { - return - } - - // Sort all accounts with queued transactions by heartbeat - addresses := make(addressesByHeartbeat, 0, len(pool.queue)) - for addr := range pool.queue { - if !pool.locals.contains(addr) { // don't drop locals - addresses = append(addresses, addressByHeartbeat{addr, pool.beats[addr]}) - } - } - sort.Sort(addresses) - - // Drop transactions until the total is below the limit or only locals remain - for drop := queued - pool.config.GlobalQueue; drop > 0 && len(addresses) > 0; { - addr := addresses[len(addresses)-1] - list := pool.queue[addr.address] - - addresses = addresses[:len(addresses)-1] - - // Drop all transactions if they are less than the overflow - if size := uint64(list.Len()); size <= drop { - for _, tx := range list.Flatten() { - pool.removeTxLocked(tx.Hash(), true) - } - drop -= size - queuedRateLimitMeter.Set(uint64(size)) - continue - } - // Otherwise drop only last few transactions - txs := list.Flatten() - for i := len(txs) - 1; i >= 0 && drop > 0; i-- { - pool.removeTxLocked(txs[i].Hash(), true) - drop-- - queuedRateLimitMeter.Set(1) - } - } -} - -// demoteUnexecutables removes invalid and processed transactions from the pools -// executable/pending queue and any subsequent transactions that become unexecutable -// are moved back into the future queue. -func (pool *TxPool) demoteUnexecutables() { - // Iterate over all accounts and demote any non-executable transactions - for addr, list := range pool.pending { - nonce := pool.currentState.GetNonce(addr) - - // Drop all transactions that are deemed too old (low nonce) - olds := list.Forward(nonce) - for _, tx := range olds { - hash := tx.Hash() - pool.all.Remove(hash) - log.Trace("Removed old pending transaction", "hash", hash) - } - // Drop all transactions that are too costly (low balance or out of gas), and queue any invalids back for later - drops, invalids := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) - for _, tx := range drops { - hash := tx.Hash() - log.Trace("Removed unpayable pending transaction", "hash", hash) - pool.all.Remove(hash) - } - pool.priced.Removed(len(olds) + len(drops)) - pendingNofundsMeter.Set(uint64(len(drops))) - - for _, tx := range invalids { - hash := tx.Hash() - log.Trace("Demoting pending transaction", "hash", hash) - - // Internal shuffle shouldn't touch the lookup set. - if _, err := pool.enqueueTx(hash, tx, false, false); err != nil { - log.Error("enqueueTx", "error", err) - } - } - pendingGauge.Add(-(len(olds) + len(drops) + len(invalids))) - if pool.locals.contains(addr) { - localGauge.Add(-(len(olds) + len(drops) + len(invalids))) - } - // If there's a gap in front, alert (should never happen) and postpone all transactions - if list.Len() > 0 && list.txs.Get(nonce) == nil { - gapped := list.Cap(0) - for _, tx := range gapped { - hash := tx.Hash() - log.Error("Demoting invalidated transaction", "hash", hash) - - // Internal shuffle shouldn't touch the lookup set. - if _, err := pool.enqueueTx(hash, tx, false, false); err != nil { - log.Error("enqueueTx", "error", err) - } - } - pendingGauge.Add(-len(gapped)) - // This might happen in a reorg, so log it to the metering - blockReorgInvalidatedTx.Set(uint64(len(gapped))) - } - // Delete the entire pending entry if it became empty. - if list.Empty() { - delete(pool.pending, addr) - } - } -} - -func (pool *TxPool) IsStarted() bool { - if pool == nil { - return false - } - - return pool.isStarted -} - -func (pool *TxPool) AddInit(fns ...func() error) { - if pool == nil { - return - } - - pool.initFns = append(pool.initFns, fns...) -} - -func (pool *TxPool) RunInit() error { - if pool == nil { - return errors.New("can't init a nil transaction pool") - } - - if pool.IsStarted() { - return errors.New("transaction pool is already started") - } - - var err error - for _, fn := range pool.initFns { - if err = fn(); err != nil { - return fmt.Errorf("can't init a transaction pool: %w", err) - } - } - return nil -} - -func (pool *TxPool) AddStop(fns ...func() error) { - if pool == nil { - return - } - - pool.stopFns = append(pool.stopFns, fns...) -} - -func (pool *TxPool) RunStop() error { - if pool == nil { - return errors.New("can't stop a nil transaction pool") - } - - if !pool.IsStarted() { - return errors.New("transaction pool is already stopped") - } - - var err error - for _, fn := range pool.stopFns { - if err = fn(); err != nil { - return fmt.Errorf("can't stop a transaction pool: %w", err) - } - } - return nil -} - -// addressByHeartbeat is an account address tagged with its last activity timestamp. -type addressByHeartbeat struct { - address common.Address - heartbeat time.Time -} - -type addressesByHeartbeat []addressByHeartbeat - -func (a addressesByHeartbeat) Len() int { return len(a) } -func (a addressesByHeartbeat) Less(i, j int) bool { return a[i].heartbeat.Before(a[j].heartbeat) } -func (a addressesByHeartbeat) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// accountSet is simply a set of addresses to check for existence, and a signer -// capable of deriving addresses from transactions. -type accountSet struct { - accounts map[common.Address]struct{} - signer *types.Signer - cache *[]common.Address -} - -// newAccountSet creates a new address set with an associated signer for sender -// derivations. -func newAccountSet(signer *types.Signer, addrs ...common.Address) *accountSet { - as := &accountSet{ - accounts: make(map[common.Address]struct{}), - signer: signer, - } - for _, addr := range addrs { - as.add(addr) - } - return as -} - -// contains checks if a given address is contained within the set. -func (as *accountSet) contains(addr common.Address) bool { - _, exist := as.accounts[addr] - return exist -} - -// containsTx checks if the sender of a given tx is within the set. If the sender -// cannot be derived, this method returns false. -func (as *accountSet) containsTx(tx types.Transaction) bool { - if addr, err := tx.Sender(*as.signer); err == nil { - return as.contains(addr) - } - return false -} - -// add inserts a new address into the set to track. -func (as *accountSet) add(addr common.Address) { - as.accounts[addr] = struct{}{} - as.cache = nil -} - -// addTx adds the sender of tx into the set. -func (as *accountSet) addTx(tx types.Transaction) { - if addr, err := tx.Sender(*as.signer); err == nil { - as.add(addr) - } -} - -// flatten returns the list of addresses within this set, also caching it for later -// reuse. The returned slice should not be changed! -func (as *accountSet) flatten() []common.Address { - if as.cache == nil { - accounts := make([]common.Address, 0, len(as.accounts)) - for account := range as.accounts { - accounts = append(accounts, account) - } - as.cache = &accounts - } - return *as.cache -} - -// merge adds all addresses from the 'other' set into 'as'. -func (as *accountSet) merge(other *accountSet) { - for addr := range other.accounts { - as.accounts[addr] = struct{}{} - } - as.cache = nil -} - -// txLookup is used internally by Backend to track transactions while allowing lookup without -// mutex contention. -// -// Note, although this type is properly protected against concurrent access, it -// is **not** a type that should ever be mutated or even exposed outside of the -// transaction pool, since its internal state is tightly coupled with the pools -// internal mechanisms. The sole purpose of the type is to permit out-of-bound -// peeking into the pool in Backend.Get without having to acquire the widely scoped -// Backend.mu mutex. -// -// This lookup set combines the notion of "local transactions", which is useful -// to build upper-level structure. -type txLookup struct { - slots int - lock sync.RWMutex - locals map[common.Hash]types.Transaction - remotes map[common.Hash]types.Transaction -} - -// newTxLookup returns a new txLookup structure. -func newTxLookup() *txLookup { - return &txLookup{ - locals: make(map[common.Hash]types.Transaction), - remotes: make(map[common.Hash]types.Transaction), - } -} - -// Range calls f on each key and value present in the map. The callback passed -// should return the indicator whether the iteration needs to be continued. -// Callers need to specify which set (or both) to be iterated. -func (t *txLookup) Range(f func(hash common.Hash, tx types.Transaction, local bool) bool, local bool, remote bool) { - t.lock.RLock() - defer t.lock.RUnlock() - - if local { - for key, value := range t.locals { - if !f(key, value, true) { - return - } - } - } - if remote { - for key, value := range t.remotes { - if !f(key, value, false) { - return - } - } - } -} - -// Get returns a transaction if it exists in the lookup, or nil if not found. -func (t *txLookup) Get(hash common.Hash) types.Transaction { - t.lock.RLock() - defer t.lock.RUnlock() - - if tx := t.locals[hash]; tx != nil { - return tx - } - return t.remotes[hash] -} - -// GetLocal returns a transaction if it exists in the lookup, or nil if not found. -func (t *txLookup) GetLocal(hash common.Hash) types.Transaction { - t.lock.RLock() - defer t.lock.RUnlock() - - return t.locals[hash] -} - -// GetRemote returns a transaction if it exists in the lookup, or nil if not found. -func (t *txLookup) GetRemote(hash common.Hash) types.Transaction { - t.lock.RLock() - defer t.lock.RUnlock() - - return t.remotes[hash] -} - -// Count returns the current number of transactions in the lookup. -func (t *txLookup) Count() int { - t.lock.RLock() - defer t.lock.RUnlock() - - return len(t.locals) + len(t.remotes) -} - -// LocalCount returns the current number of local transactions in the lookup. -func (t *txLookup) LocalCount() int { - t.lock.RLock() - defer t.lock.RUnlock() - - return len(t.locals) -} - -// RemoteCount returns the current number of remote transactions in the lookup. -func (t *txLookup) RemoteCount() int { - t.lock.RLock() - defer t.lock.RUnlock() - - return len(t.remotes) -} - -// Slots returns the current number of slots used in the lookup. -func (t *txLookup) Slots() int { - t.lock.RLock() - defer t.lock.RUnlock() - - return t.slots -} - -// Add adds a transaction to the lookup. -func (t *txLookup) Add(tx types.Transaction, local bool) { - t.lock.Lock() - defer t.lock.Unlock() - - t.slots += numSlots(tx) - slotsGauge.Set(uint64(t.slots)) - - if local { - t.locals[tx.Hash()] = tx - } else { - t.remotes[tx.Hash()] = tx - } -} - -// Remove removes a transaction from the lookup. -func (t *txLookup) Remove(hash common.Hash) { - t.lock.Lock() - defer t.lock.Unlock() - - tx, ok := t.locals[hash] - if !ok { - tx, ok = t.remotes[hash] - } - if !ok { - log.Error("No transaction found to be deleted", "hash", hash) - return - } - t.slots -= numSlots(tx) - slotsGauge.Set(uint64(t.slots)) - - delete(t.locals, hash) - delete(t.remotes, hash) -} - -// RemoteToLocals migrates the transactions belongs to the given locals to locals -// set. The assumption is held the locals set is thread-safe to be used. -func (t *txLookup) RemoteToLocals(locals *accountSet) int { - t.lock.Lock() - defer t.lock.Unlock() - - var migrated int - for hash, tx := range t.remotes { - if locals.containsTx(tx) { - t.locals[hash] = tx - delete(t.remotes, hash) - migrated++ - } - } - return migrated -} - -// numSlots calculates the number of slots needed for a single transaction. -func numSlots(tx types.Transaction) int { - return int((tx.Size() + txSlotSize - 1) / txSlotSize) +var DefaultTxPool2Config = func(pool1Cfg TxPoolConfig) txpool.Config { + cfg := txpool.DefaultConfig + cfg.PendingSubPoolLimit = int(pool1Cfg.GlobalSlots) + cfg.BaseFeeSubPoolLimit = int(pool1Cfg.GlobalBaseFeeQueue) + cfg.QueuedSubPoolLimit = int(pool1Cfg.GlobalQueue) + cfg.PriceBump = pool1Cfg.PriceBump + cfg.MinFeeCap = pool1Cfg.PriceLimit + cfg.AccountSlots = pool1Cfg.AccountSlots + cfg.LogEvery = 1 * time.Minute + cfg.CommitEvery = 5 * time.Minute + cfg.TracedSenders = pool1Cfg.TracedSenders + return cfg } diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go deleted file mode 100644 index 84664b211bb..00000000000 --- a/core/tx_pool_test.go +++ /dev/null @@ -1,2042 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "context" - "crypto/ecdsa" - "fmt" - "io/ioutil" - "math/big" - "math/rand" - "os" - "testing" - "time" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/u256" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/params" - "github.com/stretchr/testify/require" -) - -// TestTxPoolConfig is a transaction pool configuration without stateful disk -// sideeffects used during testing. -var TestTxPoolConfig TxPoolConfig - -// eip1559Config is a chain config with EIP-1559 enabled at block 0. -var eip1559Config *params.ChainConfig - -func init() { - TestTxPoolConfig = DefaultTxPoolConfig - TestTxPoolConfig.Journal = "" - TestTxPoolConfig.StartOnInit = true - - cpy := *params.TestChainConfig - eip1559Config = &cpy - eip1559Config.BerlinBlock = common.Big0 - eip1559Config.LondonBlock = common.Big0 -} - -func transaction(nonce uint64, gaslimit uint64, key *ecdsa.PrivateKey) types.Transaction { - return pricedTransaction(nonce, gaslimit, u256.Num1, key) -} - -func pricedTransaction(nonce uint64, gaslimit uint64, gasprice *uint256.Int, key *ecdsa.PrivateKey) types.Transaction { - tx, _ := types.SignTx(types.NewTransaction(nonce, common.Address{}, uint256.NewInt(100), gaslimit, gasprice, nil), *types.LatestSignerForChainID(nil), key) - return tx -} - -func pricedDataTransaction(nonce uint64, gaslimit uint64, gasprice *uint256.Int, key *ecdsa.PrivateKey, bytes uint64) types.Transaction { - data := make([]byte, bytes) - // it is only a test, so insecure random is fine here - rand.Read(data) //nolint:gosec - - tx, _ := types.SignTx(types.NewTransaction(nonce, common.Address{}, uint256.NewInt(0), gaslimit, gasprice, data), *types.LatestSignerForChainID(nil), key) - return tx -} - -func dynamicFeeTx(nonce uint64, gaslimit uint64, gasFee *uint256.Int, tip *uint256.Int, key *ecdsa.PrivateKey) types.Transaction { - chainID, _ := uint256.FromBig(params.TestChainConfig.ChainID) - tx, err := types.SignNewTx(key, *types.LatestSigner(params.TestChainConfig), &types.DynamicFeeTransaction{ - CommonTx: types.CommonTx{ - Nonce: nonce, - Gas: gaslimit, - To: &common.Address{}, - Value: uint256.NewInt(100), - Data: nil, - }, - ChainID: chainID, - Tip: tip, - FeeCap: gasFee, - AccessList: nil, - }) - if err != nil { - panic(err) - } - return tx -} - -func setupTxPool(t testing.TB) (*TxPool, *ecdsa.PrivateKey) { - return setupTxPoolWithConfig(t, params.TestChainConfig) -} - -func setupTxPoolWithConfig(t testing.TB, config *params.ChainConfig) (*TxPool, *ecdsa.PrivateKey) { - db := memdb.NewTestDB(t) - - key, _ := crypto.GenerateKey() - pool := NewTxPool(TestTxPoolConfig, config, db) - //nolint:errcheck - pool.Start(1000000000, 0) - - t.Cleanup(func() { - pool.Stop() - }) - return pool, key -} - -// validateTxPoolInternals checks various consistency invariants within the pool. -func validateTxPoolInternals(pool *TxPool) error { - pool.mu.RLock() - defer pool.mu.RUnlock() - - // Ensure the total transaction set is consistent with pending + queued - pending, queued := pool.stats() - if total := pool.all.Count(); total != pending+queued { - return fmt.Errorf("total transaction count %d != %d pending + %d queued", total, pending, queued) - } - pool.priced.Reheap() - priced, remote := pool.priced.remotes.Len(), pool.all.RemoteCount() - if priced != remote { - return fmt.Errorf("total priced transaction count %d != %d", priced, remote) - } - // Ensure the next nonce to assign is the correct one - for addr, txs := range pool.pending { - // Find the last transaction - var last uint64 - for nonce := range txs.txs.items { - if last < nonce { - last = nonce - } - } - if nonce := pool.pendingNonces.get(addr); nonce != last+1 { - return fmt.Errorf("pending nonce mismatch: have %v, want %v", nonce, last+1) - } - } - return nil -} - -// validateEvents checks that the correct number of transaction addition events -// were fired on the pool's event feed. -func validateEvents(events chan NewTxsEvent, count int) error { - var received []types.Transaction - - for len(received) < count { - select { - case ev := <-events: - received = append(received, ev.Txs...) - case <-time.After(time.Second): - return fmt.Errorf("event #%d not fired", len(received)) - } - } - if len(received) > count { - return fmt.Errorf("more than %d events fired: %v", count, received[count:]) - } - select { - case ev := <-events: - return fmt.Errorf("more than %d events fired: %v", count, ev.Txs) - - case <-time.After(50 * time.Millisecond): - // This branch should be "default", but it's a data race between goroutines, - // reading the event channel and pushing into it, so better wait a bit ensuring - // really nothing gets injected. - } - return nil -} - -func deriveSender(tx types.Transaction) (common.Address, error) { - return tx.Sender(*types.LatestSignerForChainID(nil)) -} - -// This test simulates a scenario where a new block is imported during a -// state reset and tests whether the pending state is in sync with the -// block head event that initiated the resetState(). -func TestStateChangeDuringTransactionPoolReset(t *testing.T) { - db := memdb.NewTestDB(t) - var ( - key, _ = crypto.GenerateKey() - address = crypto.PubkeyToAddress(key.PublicKey) - ) - err := db.Update(context.Background(), func(tx kv.RwTx) error { - stateWriter := state.NewPlainStateWriter(tx, nil, 1) - ibs := state.New(state.NewPlainStateReader(tx)) - - // setup pool with 2 transaction in it - // Using AddBalance instead of SetBalance to make it dirty - ibs.AddBalance(address, new(uint256.Int).SetUint64(params.Ether)) - return ibs.CommitBlock(params.Rules{}, stateWriter) - }) - require.NoError(t, err) - tx0 := transaction(0, 100000, key) - tx1 := transaction(1, 100000, key) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("start tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - nonce := pool.Nonce(address) - if nonce != 0 { - t.Fatalf("Invalid nonce, want 0, got %d", nonce) - } - - pool.AddRemotesSync([]types.Transaction{tx0, tx1}) - - nonce = pool.Nonce(address) - if nonce != 2 { - t.Fatalf("Invalid nonce, want 2, got %d", nonce) - } - - // trigger state change in the background - //<-pool.requestReset(nil, nil) - - if _, err := pool.Pending(); err != nil { - t.Fatalf("Could not fetch pending transactions: %v", err) - } - nonce = pool.Nonce(address) - if nonce != 2 { - t.Fatalf("Invalid nonce, want 2, got %d", nonce) - } -} - -func TestInvalidTransactions(t *testing.T) { - pool, key := setupTxPool(t) - - tx := transaction(0, 100, key) - from, _ := deriveSender(tx) - - pool.currentState.AddBalance(from, u256.Num1) - if err := pool.AddRemote(tx); err != ErrInsufficientFunds { - t.Error("expected", ErrInsufficientFunds) - } - - balance := new(big.Int).Add(tx.GetValue().ToBig(), new(big.Int).Mul(new(big.Int).SetUint64(tx.GetGas()), tx.GetPrice().ToBig())) - x, _ := uint256.FromBig(balance) - pool.currentState.AddBalance(from, x) - if err := pool.AddRemote(tx); err != ErrIntrinsicGas { - t.Error("expected", ErrIntrinsicGas, "got", err) - } - - pool.currentState.SetNonce(from, 1) - pool.currentState.AddBalance(from, uint256.NewInt(0xffffffffffffff)) - tx = transaction(0, 100000, key) - if err := pool.AddRemote(tx); err != ErrNonceTooLow { - t.Error("expected", ErrNonceTooLow) - } - - tx = transaction(1, 100000, key) - pool.gasPrice = newInt(1000) - if err := pool.AddRemote(tx); err != ErrUnderpriced { - t.Error("expected", ErrUnderpriced, "got", err) - } - if err := pool.AddLocal(tx); err != nil { - t.Error("expected", nil, "got", err) - } -} - -func newInt(value int64) *uint256.Int { - v, _ := uint256.FromBig(big.NewInt(value)) - return v -} - -func TestTransactionQueue(t *testing.T) { - pool, key := setupTxPool(t) - - tx := transaction(0, 100, key) - from, _ := deriveSender(tx) - pool.currentState.AddBalance(from, uint256.NewInt(1000)) - - if _, err := pool.enqueueTx(tx.Hash(), tx, false, true); err != nil { - t.Fatal(err) - } - <-pool.requestPromoteExecutables(newAccountSet(pool.signer, from)) - if len(pool.pending) != 1 { - t.Error("expected valid txs to be 1 is", len(pool.pending)) - } - - tx = transaction(1, 100, key) - from, _ = deriveSender(tx) - pool.currentState.SetNonce(from, 2) - if _, err := pool.enqueueTx(tx.Hash(), tx, false, true); err != nil { - t.Fatal(err) - } - - <-pool.requestPromoteExecutables(newAccountSet(pool.signer, from)) - if _, ok := pool.pending[from].txs.items[tx.GetNonce()]; ok { - t.Error("expected transaction to be in tx pool") - } - if len(pool.queue) > 0 { - t.Error("expected transaction queue to be empty. is", len(pool.queue)) - } -} - -func TestTransactionQueue2(t *testing.T) { - pool, key := setupTxPool(t) - - tx1 := transaction(0, 100, key) - tx2 := transaction(10, 100, key) - tx3 := transaction(11, 100, key) - from, _ := deriveSender(tx1) - pool.currentState.AddBalance(from, uint256.NewInt(1000)) - - if _, err := pool.enqueueTx(tx1.Hash(), tx1, false, true); err != nil { - t.Fatal(err) - } - if _, err := pool.enqueueTx(tx2.Hash(), tx2, false, true); err != nil { - t.Fatal(err) - } - if _, err := pool.enqueueTx(tx3.Hash(), tx3, false, true); err != nil { - t.Fatal(err) - } - - pool.promoteExecutables([]common.Address{from}) - if len(pool.pending) != 1 { - t.Error("expected pending length to be 1, got", len(pool.pending)) - } - if pool.queue[from].Len() != 2 { - t.Error("expected len(queue) == 2, got", pool.queue[from].Len()) - } -} - -func TestTransactionVeryHighValues(t *testing.T) { - t.Skip("uint 256 can't encode 1 << 300") - pool, key := setupTxPoolWithConfig(t, eip1559Config) - defer pool.Stop() - - veryBigNumber := uint256.NewInt(1) - veryBigNumber.Lsh(veryBigNumber, 260) - - tx := dynamicFeeTx(0, 100, uint256.NewInt(1), veryBigNumber, key) - if err := pool.AddRemote(tx); err != ErrTipVeryHigh { - t.Error("expected", ErrTipVeryHigh, "got", err) - } - - tx2 := dynamicFeeTx(0, 100, veryBigNumber, uint256.NewInt(1), key) - if err := pool.AddRemote(tx2); err != ErrFeeCapVeryHigh { - t.Error("expected", ErrFeeCapVeryHigh, "got", err) - } -} - -func TestTransactionChainFork(t *testing.T) { - pool, key := setupTxPool(t) - db := pool.chaindb.RwKV() - - addr := crypto.PubkeyToAddress(key.PublicKey) - resetState := func() { - err := db.Update(context.Background(), func(tx kv.RwTx) error { - stateWriter := state.NewPlainStateWriter(tx, nil, 1) - ibs := state.New(state.NewPlainStateReader(tx)) - ibs.AddBalance(addr, uint256.NewInt(100000000000000)) - return ibs.CommitBlock(params.Rules{}, stateWriter) - }) - require.NoError(t, err) - pool.ResetHead(1000000000, 1) - } - resetState() - - tx := transaction(0, 100000, key) - if _, err := pool.add(tx, false); err != nil { - t.Error("didn't expect error", err) - } - pool.RemoveTx(tx.Hash(), true) - - // reset the pool's internal state - resetState() - if _, err := pool.add(tx, false); err != nil { - t.Error("didn't expect error", err) - } -} - -func TestTransactionDoubleNonce(t *testing.T) { - pool, key := setupTxPool(t) - - addr := crypto.PubkeyToAddress(key.PublicKey) - resetState := func() { - stateWriter := state.NewPlainStateWriter(pool.chaindb, nil, 1) - ibs := state.New(state.NewPlainStateReader(pool.chaindb)) - ibs.AddBalance(addr, uint256.NewInt(100000000000000)) - if err := ibs.CommitBlock(params.Rules{}, stateWriter); err != nil { - t.Fatal(err) - } - pool.ResetHead(1000000000, 1) - } - resetState() - - signer := types.LatestSignerForChainID(nil) - tx1, _ := types.SignTx(types.NewTransaction(0, common.Address{}, uint256.NewInt(100), 100000, uint256.NewInt(1), nil), *signer, key) - tx2, _ := types.SignTx(types.NewTransaction(0, common.Address{}, uint256.NewInt(100), 1000000, uint256.NewInt(2), nil), *signer, key) - tx3, _ := types.SignTx(types.NewTransaction(0, common.Address{}, uint256.NewInt(100), 1000000, uint256.NewInt(1), nil), *signer, key) - - // Add the first two transaction, ensure higher priced stays only - if replace, err := pool.add(tx1, false); err != nil || replace { - t.Errorf("first transaction insert failed (%v) or reported replacement (%v)", err, replace) - } - if replace, err := pool.add(tx2, false); err != nil || !replace { - t.Errorf("second transaction insert failed (%v) or not reported replacement (%v)", err, replace) - } - <-pool.requestPromoteExecutables(newAccountSet(signer, addr)) - if pool.pending[addr].Len() != 1 { - t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) - } - if tx := pool.pending[addr].txs.items[0]; tx.Hash() != tx2.Hash() { - t.Errorf("transaction mismatch: have %x, want %x", tx.Hash(), tx2.Hash()) - } - - // Add the third transaction and ensure it's not saved (smaller price) - pool.add(tx3, false) - <-pool.requestPromoteExecutables(newAccountSet(signer, addr)) - if pool.pending[addr].Len() != 1 { - t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) - } - if tx := pool.pending[addr].txs.items[0]; tx.Hash() != tx2.Hash() { - t.Errorf("transaction mismatch: have %x, want %x", tx.Hash(), tx2.Hash()) - } - // Ensure the total transaction count is correct - if pool.all.Count() != 1 { - t.Error("expected 1 total transactions, got", pool.all.Count()) - } -} - -func TestTransactionMissingNonce(t *testing.T) { - pool, key := setupTxPool(t) - - addr := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(addr, uint256.NewInt(100000000000000)) - tx := transaction(1, 100000, key) - if _, err := pool.add(tx, false); err != nil { - t.Error("didn't expect error", err) - } - if len(pool.pending) != 0 { - t.Error("expected 0 pending transactions, got", len(pool.pending)) - } - if pool.queue[addr].Len() != 1 { - t.Error("expected 1 queued transaction, got", pool.queue[addr].Len()) - } - if pool.all.Count() != 1 { - t.Error("expected 1 total transactions, got", pool.all.Count()) - } -} - -func TestTransactionNonceRecovery(t *testing.T) { - t.Skip("fix when refactoring tx pool") - const n = 10 - pool, key := setupTxPool(t) - - addr := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.SetNonce(addr, n) - pool.currentState.AddBalance(addr, uint256.NewInt(100000000000000)) - <-pool.requestReset(nil, nil) - - tx := transaction(n, 100000, key) - if err := pool.AddRemote(tx); err != nil { - t.Error(err) - } - // simulate some weird re-order of transactions and missing nonce(s) - pool.currentState.SetNonce(addr, n-1) - pool.currentState.AddBalance(addr, u256.Num1) - <-pool.requestReset(nil, nil) - if fn := pool.Nonce(addr); fn != n-1 { - t.Errorf("expected nonce to be %d, got %d", n-1, fn) - } -} - -// Tests that if an account runs out of funds, any pending and queued transactions -// are dropped. -func TestTransactionDropping(t *testing.T) { - // Create a test account and fund it - pool, key := setupTxPool(t) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000)) - - // Add some pending and some queued transactions - var ( - tx0 = transaction(0, 100, key) - tx1 = transaction(1, 200, key) - tx2 = transaction(2, 300, key) - tx10 = transaction(10, 100, key) - tx11 = transaction(11, 200, key) - tx12 = transaction(12, 300, key) - ) - pool.all.Add(tx0, false) - pool.priced.Put(tx0, false) - pool.promoteTx(account, tx0.Hash(), tx0) - - pool.all.Add(tx1, false) - pool.priced.Put(tx1, false) - pool.promoteTx(account, tx1.Hash(), tx1) - - pool.all.Add(tx2, false) - pool.priced.Put(tx2, false) - pool.promoteTx(account, tx2.Hash(), tx2) - - if _, err := pool.enqueueTx(tx10.Hash(), tx10, false, true); err != nil { - t.Fatal(err) - } - if _, err := pool.enqueueTx(tx11.Hash(), tx11, false, true); err != nil { - t.Fatal(err) - } - if _, err := pool.enqueueTx(tx12.Hash(), tx12, false, true); err != nil { - t.Fatal(err) - } - - // Check that pre and post validations leave the pool as is - if pool.pending[account].Len() != 3 { - t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) - } - if pool.queue[account].Len() != 3 { - t.Errorf("queued transaction mismatch: have %d, want %d", pool.queue[account].Len(), 3) - } - if pool.all.Count() != 6 { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), 6) - } - <-pool.requestReset(nil, nil) - if pool.pending[account].Len() != 3 { - t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) - } - if pool.queue[account].Len() != 3 { - t.Errorf("queued transaction mismatch: have %d, want %d", pool.queue[account].Len(), 3) - } - if pool.all.Count() != 6 { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), 6) - } - // Reduce the balance of the account, and check that invalidated transactions are dropped - pool.currentState.AddBalance(account, uint256.NewInt(0).Neg(uint256.NewInt(650))) - <-pool.requestReset(nil, nil) - - if _, ok := pool.pending[account].txs.items[tx0.GetNonce()]; !ok { - t.Errorf("funded pending transaction missing: %v", tx0) - } - if _, ok := pool.pending[account].txs.items[tx1.GetNonce()]; !ok { - t.Errorf("funded pending transaction missing: %v", tx1) - } - if _, ok := pool.pending[account].txs.items[tx2.GetNonce()]; ok { - t.Errorf("out-of-fund pending transaction present: %v", tx2) - } - if _, ok := pool.queue[account].txs.items[tx10.GetNonce()]; !ok { - t.Errorf("funded queued transaction missing: %v", tx10) - } - if _, ok := pool.queue[account].txs.items[tx11.GetNonce()]; !ok { - t.Errorf("funded queued transaction missing: %v", tx11) - } - if _, ok := pool.queue[account].txs.items[tx12.GetNonce()]; ok { - t.Errorf("out-of-fund queued transaction present: %v", tx12) - } - if pool.all.Count() != 4 { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), 4) - } - // Reduce the block gas limit, check that invalidated transactions are dropped - pool.currentMaxGas = 100 - <-pool.requestReset(nil, nil) - - if _, ok := pool.pending[account].txs.items[tx0.GetNonce()]; !ok { - t.Errorf("funded pending transaction missing: %v", tx0) - } - if _, ok := pool.pending[account].txs.items[tx1.GetNonce()]; ok { - t.Errorf("over-gased pending transaction present: %v", tx1) - } - if _, ok := pool.queue[account].txs.items[tx10.GetNonce()]; !ok { - t.Errorf("funded queued transaction missing: %v", tx10) - } - if _, ok := pool.queue[account].txs.items[tx11.GetNonce()]; ok { - t.Errorf("over-gased queued transaction present: %v", tx11) - } - if pool.all.Count() != 2 { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), 2) - } -} - -// Tests that if a transaction is dropped from the current pending pool (e.g. out -// of fund), all consecutive (still valid, but not executable) transactions are -// postponed back into the future queue to prevent broadcasting them. -func TestTransactionPostponing(t *testing.T) { - // Create the pool to test the postponing with - db := memdb.NewTestDB(t) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create two test accounts to produce different gap profiles with - keys := make([]*ecdsa.PrivateKey, 2) - accs := make([]common.Address, len(keys)) - - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - accs[i] = crypto.PubkeyToAddress(keys[i].PublicKey) - - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(50100)) - } - // Add a batch consecutive pending transactions for validation - txs := []types.Transaction{} - for i, key := range keys { - - for j := 0; j < 100; j++ { - var tx types.Transaction - if (i+j)%2 == 0 { - tx = transaction(uint64(j), 25000, key) - } else { - tx = transaction(uint64(j), 50000, key) - } - txs = append(txs, tx) - } - } - for i, err := range pool.AddRemotesSync(txs) { - if err != nil { - t.Fatalf("tx %d: failed to add transactions: %v", i, err) - } - } - // Check that pre and post validations leave the pool as is - if pending := pool.pending[accs[0]].Len() + pool.pending[accs[1]].Len(); pending != len(txs) { - t.Errorf("pending transaction mismatch: have %d, want %d", pending, len(txs)) - } - if len(pool.queue) != 0 { - t.Errorf("queued accounts mismatch: have %d, want %d", len(pool.queue), 0) - } - if pool.all.Count() != len(txs) { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), len(txs)) - } - <-pool.requestReset(nil, nil) - if pending := pool.pending[accs[0]].Len() + pool.pending[accs[1]].Len(); pending != len(txs) { - t.Errorf("pending transaction mismatch: have %d, want %d", pending, len(txs)) - } - if len(pool.queue) != 0 { - t.Errorf("queued accounts mismatch: have %d, want %d", len(pool.queue), 0) - } - if pool.all.Count() != len(txs) { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), len(txs)) - } - // Reduce the balance of the account, and check that transactions are reorganised - for _, addr := range accs { - pool.currentState.AddBalance(addr, uint256.NewInt(0).Neg(u256.Num1)) - } - <-pool.requestReset(nil, nil) - - // The first account's first transaction remains valid, check that subsequent - // ones are either filtered out, or queued up for later. - if _, ok := pool.pending[accs[0]].txs.items[txs[0].GetNonce()]; !ok { - t.Errorf("tx %d: valid and funded transaction missing from pending pool: %v", 0, txs[0]) - } - if _, ok := pool.queue[accs[0]].txs.items[txs[0].GetNonce()]; ok { - t.Errorf("tx %d: valid and funded transaction present in future queue: %v", 0, txs[0]) - } - for i, tx := range txs[1:100] { - if i%2 == 1 { - if _, ok := pool.pending[accs[0]].txs.items[tx.GetNonce()]; ok { - t.Errorf("tx %d: valid but future transaction present in pending pool: %v", i+1, tx) - } - if _, ok := pool.queue[accs[0]].txs.items[tx.GetNonce()]; !ok { - t.Errorf("tx %d: valid but future transaction missing from future queue: %v", i+1, tx) - } - } else { - if _, ok := pool.pending[accs[0]].txs.items[tx.GetNonce()]; ok { - t.Errorf("tx %d: out-of-fund transaction present in pending pool: %v", i+1, tx) - } - if _, ok := pool.queue[accs[0]].txs.items[tx.GetNonce()]; ok { - t.Errorf("tx %d: out-of-fund transaction present in future queue: %v", i+1, tx) - } - } - } - // The second account's first transaction got invalid, check that all transactions - // are either filtered out, or queued up for later. - if pool.pending[accs[1]] != nil { - t.Errorf("invalidated account still has pending transactions") - } - for i, tx := range txs[100:] { - if i%2 == 1 { - if _, ok := pool.queue[accs[1]].txs.items[tx.GetNonce()]; !ok { - t.Errorf("tx %d: valid but future transaction missing from future queue: %v", 100+i, tx) - } - } else { - if _, ok := pool.queue[accs[1]].txs.items[tx.GetNonce()]; ok { - t.Errorf("tx %d: out-of-fund transaction present in future queue: %v", 100+i, tx) - } - } - } - if pool.all.Count() != len(txs)/2 { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), len(txs)/2) - } -} - -// Tests that if the transaction pool has both executable and non-executable -// transactions from an origin account, filling the nonce gap moves all queued -// ones into the pending pool. -func TestTransactionGapFilling(t *testing.T) { - // Create a test account and fund it - pool, key := setupTxPool(t) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000)) - - // Keep track of transaction events to ensure all executables get announced - events := make(chan NewTxsEvent, TestTxPoolConfig.AccountQueue+5) - sub := pool.txFeed.Subscribe(events) - defer sub.Unsubscribe() - - // Create a pending and a queued transaction with a nonce-gap in between - pool.AddRemotesSync([]types.Transaction{ - transaction(0, 100000, key), - transaction(2, 100000, key), - }) - pending, queued := pool.Stats() - if pending != 1 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 1) - } - if queued != 1 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) - } - if err := validateEvents(events, 1); err != nil { - t.Fatalf("original event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Fill the nonce gap and ensure all transactions become pending - if err := pool.addRemoteSync(transaction(1, 100000, key)); err != nil { - t.Fatalf("failed to add gapped transaction: %v", err) - } - pending, queued = pool.Stats() - if pending != 3 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) - } - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if err := validateEvents(events, 2); err != nil { - t.Fatalf("gap-filling event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that if the transaction count belonging to a single account goes above -// some threshold, the higher transactions are dropped to prevent DOS attacks. -func TestTransactionQueueAccountLimiting(t *testing.T) { - // Create a test account and fund it - pool, key := setupTxPool(t) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000)) - - // Keep queuing up transactions and make sure all above a limit are dropped - for i := uint64(1); i <= TestTxPoolConfig.AccountQueue+5; i++ { - if err := pool.addRemoteSync(transaction(i, 100000, key)); err != nil { - t.Fatalf("tx %d: failed to add transaction: %v", i, err) - } - if len(pool.pending) != 0 { - t.Errorf("tx %d: pending pool size mismatch: have %d, want %d", i, len(pool.pending), 0) - } - if i <= TestTxPoolConfig.AccountQueue { - if pool.queue[account].Len() != int(i) { - t.Errorf("tx %d: queue size mismatch: have %d, want %d", i, pool.queue[account].Len(), i) - } - } else { - if pool.queue[account].Len() != int(TestTxPoolConfig.AccountQueue) { - t.Errorf("tx %d: queue limit mismatch: have %d, want %d", i, pool.queue[account].Len(), TestTxPoolConfig.AccountQueue) - } - } - } - if pool.all.Count() != int(TestTxPoolConfig.AccountQueue) { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), TestTxPoolConfig.AccountQueue) - } -} - -// Tests that if the transaction count belonging to multiple accounts go above -// some threshold, the higher transactions are dropped to prevent DOS attacks. -// -// This logic should not hold for local transactions, unless the local tracking -// mechanism is disabled. -func TestTransactionQueueGlobalLimiting(t *testing.T) { - testTransactionQueueGlobalLimiting(t, false) -} -func TestTransactionQueueGlobalLimitingNoLocals(t *testing.T) { - testTransactionQueueGlobalLimiting(t, true) -} - -func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { - // Create the pool to test the limit enforcement with - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.NoLocals = nolocals - config.GlobalQueue = config.AccountQueue*3 - 1 // reduce the queue limits to shorten test time (-1 to make it non divisible) - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create a number of test accounts and fund them (last one will be the local) - keys := make([]*ecdsa.PrivateKey, 5) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - local := keys[len(keys)-1] - - // Generate and queue a batch of transactions - nonces := make(map[common.Address]uint64) - - txs := make(types.Transactions, 0, 3*config.GlobalQueue) - for len(txs) < cap(txs) { - key := keys[rand.Intn(len(keys)-1)] // skip adding transactions with the local account - addr := crypto.PubkeyToAddress(key.PublicKey) - - txs = append(txs, transaction(nonces[addr]+1, 100000, key)) - nonces[addr]++ - } - // Import the batch and verify that limits have been enforced - pool.AddRemotesSync(txs) - - queued := 0 - for addr, list := range pool.queue { - if list.Len() > int(config.AccountQueue) { - t.Errorf("addr %x: queued accounts overflown allowance: %d > %d", addr, list.Len(), config.AccountQueue) - } - queued += list.Len() - } - if queued > int(config.GlobalQueue) { - t.Fatalf("total transactions overflow allowance: %d > %d", queued, config.GlobalQueue) - } - // Generate a batch of transactions from the local account and import them - txs = txs[:0] - for i := uint64(0); i < 3*config.GlobalQueue; i++ { - txs = append(txs, transaction(i+1, 100000, local)) - } - pool.AddLocals(txs) - - // If locals are disabled, the previous eviction algorithm should apply here too - if nolocals { - queued := 0 - for addr, list := range pool.queue { - if list.Len() > int(config.AccountQueue) { - t.Errorf("addr %x: queued accounts overflown allowance: %d > %d", addr, list.Len(), config.AccountQueue) - } - queued += list.Len() - } - if queued > int(config.GlobalQueue) { - t.Fatalf("total transactions overflow allowance: %d > %d", queued, config.GlobalQueue) - } - } else { - // Local exemptions are enabled, make sure the local account owned the queue - if len(pool.queue) != 1 { - t.Errorf("multiple accounts in queue: have %v, want %v", len(pool.queue), 1) - } - // Also ensure no local transactions are ever dropped, even if above global limits - if queued := pool.queue[crypto.PubkeyToAddress(local.PublicKey)].Len(); uint64(queued) != 3*config.GlobalQueue { - t.Fatalf("local account queued transaction count mismatch: have %v, want %v", queued, 3*config.GlobalQueue) - } - } -} - -// Tests that if an account remains idle for a prolonged amount of time, any -// non-executable transactions queued up are dropped to prevent wasting resources -// on shuffling them around. -// -// This logic should not hold for local transactions, unless the local tracking -// mechanism is disabled. -func TestTransactionQueueTimeLimiting(t *testing.T) { testTransactionQueueTimeLimiting(t, false) } -func TestTransactionQueueTimeLimitingNoLocals(t *testing.T) { - testTransactionQueueTimeLimiting(t, true) -} - -func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { - // Reduce the eviction interval to a testable amount - defer func(old time.Duration) { evictionInterval = old }(evictionInterval) - evictionInterval = time.Millisecond * 100 - - // Create the pool to test the non-expiration enforcement - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.Lifetime = time.Second - config.NoLocals = nolocals - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create two test accounts to ensure remotes expire but locals do not - local, _ := crypto.GenerateKey() - remote, _ := crypto.GenerateKey() - - pool.currentState.AddBalance(crypto.PubkeyToAddress(local.PublicKey), uint256.NewInt(1000000000)) - pool.currentState.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), uint256.NewInt(1000000000)) - - // Add the two transactions and ensure they both are queued up - if err := pool.AddLocal(pricedTransaction(1, 100000, u256.Num1, local)); err != nil { - t.Fatalf("failed to add local transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(1, 100000, u256.Num1, remote)); err != nil { - t.Fatalf("failed to add remote transaction: %v", err) - } - pending, queued := pool.Stats() - if pending != 0 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) - } - if queued != 2 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - - // Allow the eviction interval to run - time.Sleep(2 * evictionInterval) - - // Transactions should not be evicted from the queue yet since lifetime duration has not passed - pending, queued = pool.Stats() - if pending != 0 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) - } - if queued != 2 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - - // Wait a bit for eviction to run and clean up any leftovers, and ensure only the local remains - time.Sleep(2 * config.Lifetime) - - pending, queued = pool.Stats() - if pending != 0 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) - } - if nolocals { - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - } else { - if queued != 1 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) - } - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that even if the transaction count belonging to a single account goes -// above some threshold, as long as the transactions are executable, they are -// accepted. -func TestTransactionPendingLimiting(t *testing.T) { - // Create a test account and fund it - pool, key := setupTxPool(t) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000)) - - // Keep track of transaction events to ensure all executables get announced - events := make(chan NewTxsEvent, TestTxPoolConfig.AccountQueue+5) - sub := pool.txFeed.Subscribe(events) - defer sub.Unsubscribe() - - // Keep queuing up transactions and make sure all above a limit are dropped - for i := uint64(0); i < TestTxPoolConfig.AccountQueue+5; i++ { - if err := pool.addRemoteSync(transaction(i, 100000, key)); err != nil { - t.Fatalf("tx %d: failed to add transaction: %v", i, err) - } - if pool.pending[account].Len() != int(i)+1 { - t.Errorf("tx %d: pending pool size mismatch: have %d, want %d", i, pool.pending[account].Len(), i+1) - } - if len(pool.queue) != 0 { - t.Errorf("tx %d: queue size mismatch: have %d, want %d", i, pool.queue[account].Len(), 0) - } - } - if pool.all.Count() != int(TestTxPoolConfig.AccountQueue+5) { - t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), TestTxPoolConfig.AccountQueue+5) - } - if err := validateEvents(events, int(TestTxPoolConfig.AccountQueue+5)); err != nil { - t.Fatalf("event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that if the transaction count belonging to multiple accounts go above -// some hard threshold, the higher transactions are dropped to prevent DOS -// attacks. -func TestTransactionPendingGlobalLimiting(t *testing.T) { - // Create the pool to test the limit enforcement with - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.GlobalSlots = config.AccountSlots * 10 - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create a number of test accounts and fund them - keys := make([]*ecdsa.PrivateKey, 5) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - // Generate and queue a batch of transactions - nonces := make(map[common.Address]uint64) - - txs := types.Transactions{} - for _, key := range keys { - addr := crypto.PubkeyToAddress(key.PublicKey) - for j := 0; j < int(config.GlobalSlots)/len(keys)*2; j++ { - txs = append(txs, transaction(nonces[addr], 100000, key)) - nonces[addr]++ - } - } - // Import the batch and verify that limits have been enforced - pool.AddRemotesSync(txs) - - pending := 0 - for _, list := range pool.pending { - pending += list.Len() - } - if pending > int(config.GlobalSlots) { - t.Fatalf("total pending transactions overflow allowance: %d > %d", pending, config.GlobalSlots) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Test the limit on transaction size is enforced correctly. -// This test verifies every transaction having allowed size -// is added to the pool, and longer transactions are rejected. -func TestTransactionAllowedTxSize(t *testing.T) { - // Create a test account and fund it - pool, key := setupTxPool(t) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000000)) - - // Compute maximal data size for transactions (lower bound). - // - // It is assumed the fields in the transaction (except of the data) are: - // - nonce <= 32 bytes - // - gasPrice <= 32 bytes - // - gasLimit <= 32 bytes - // - recipient == 20 bytes - // - value <= 32 bytes - // - signature == 65 bytes - // All those fields are summed up to at most 213 bytes. - baseSize := uint64(213) - dataSize := txMaxSize - baseSize - - // Try adding a transaction with maximal allowed size - tx := pricedDataTransaction(0, pool.currentMaxGas, u256.Num1, key, dataSize) - if err := pool.addRemoteSync(tx); err != nil { - t.Fatalf("failed to add transaction of size %d, close to maximal: %v", int(tx.Size()), err) - } - // Try adding a transaction with random allowed size - if err := pool.addRemoteSync(pricedDataTransaction(1, pool.currentMaxGas, u256.Num1, key, uint64(rand.Intn(int(dataSize))))); err != nil { - t.Fatalf("failed to add transaction of random allowed size: %v", err) - } - // Try adding a transaction of minimal not allowed size - if err := pool.addRemoteSync(pricedDataTransaction(2, pool.currentMaxGas, u256.Num1, key, txMaxSize)); err == nil { - t.Fatalf("expected rejection on slightly oversize transaction") - } - // Try adding a transaction of random not allowed size - if err := pool.addRemoteSync(pricedDataTransaction(2, pool.currentMaxGas, u256.Num1, key, dataSize+1+uint64(rand.Intn(int(10*txMaxSize))))); err == nil { - t.Fatalf("expected rejection on oversize transaction") - } - // Run some sanity checks on the pool internals - pending, queued := pool.Stats() - if pending != 2 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) - } - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that if transactions start being capped, transactions are also removed from 'all' -func TestTransactionCapClearsFromAll(t *testing.T) { - // Create the pool to test the limit enforcement with - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.AccountSlots = 2 - config.AccountQueue = 2 - config.GlobalSlots = 8 - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create a number of test accounts and fund them - key, _ := crypto.GenerateKey() - addr := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(addr, uint256.NewInt(1000000)) - - txs := types.Transactions{} - for j := 0; j < int(config.GlobalSlots)*2; j++ { - txs = append(txs, transaction(uint64(j), 100000, key)) - } - // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that if the transaction count belonging to multiple accounts go above -// some hard threshold, if they are under the minimum guaranteed slot count then -// the transactions are still kept. -func TestTransactionPendingMinimumAllowance(t *testing.T) { - // Create the pool to test the limit enforcement with - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.GlobalSlots = 1 - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create a number of test accounts and fund them - keys := make([]*ecdsa.PrivateKey, 5) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - // Generate and queue a batch of transactions - nonces := make(map[common.Address]uint64) - - txs := types.Transactions{} - for _, key := range keys { - addr := crypto.PubkeyToAddress(key.PublicKey) - for j := 0; j < int(config.AccountSlots)*2; j++ { - txs = append(txs, transaction(nonces[addr], 100000, key)) - nonces[addr]++ - } - } - // Import the batch and verify that limits have been enforced - pool.AddRemotesSync(txs) - - for addr, list := range pool.pending { - if list.Len() != int(config.AccountSlots) { - t.Errorf("addr %x: total pending transactions mismatch: have %d, want %d", addr, list.Len(), config.AccountSlots) - } - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that setting the transaction pool gas price to a higher value correctly -// discards everything cheaper than that and moves any gapped transactions back -// from the pending pool to the queue. -// -// Note, local transactions are never allowed to be dropped. -func TestTransactionPoolRepricing(t *testing.T) { - t.Skip("deadlock") - // Create the pool to test the pricing enforcement with - db := memdb.NewTestDB(t) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Keep track of transaction events to ensure all executables get announced - events := make(chan NewTxsEvent, 32) - sub := pool.txFeed.Subscribe(events) - defer sub.Unsubscribe() - - // Create a number of test accounts and fund them - keys := make([]*ecdsa.PrivateKey, 4) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - // Generate and queue a batch of transactions, both pending and queued - txs := types.Transactions{} - - txs = append(txs, pricedTransaction(0, 100000, u256.Num2, keys[0])) - txs = append(txs, pricedTransaction(1, 100000, u256.Num1, keys[0])) - txs = append(txs, pricedTransaction(2, 100000, u256.Num2, keys[0])) - - txs = append(txs, pricedTransaction(0, 100000, u256.Num1, keys[1])) - txs = append(txs, pricedTransaction(1, 100000, u256.Num2, keys[1])) - txs = append(txs, pricedTransaction(2, 100000, u256.Num2, keys[1])) - - txs = append(txs, pricedTransaction(1, 100000, u256.Num2, keys[2])) - txs = append(txs, pricedTransaction(2, 100000, u256.Num1, keys[2])) - txs = append(txs, pricedTransaction(3, 100000, u256.Num2, keys[2])) - - ltx := pricedTransaction(0, 100000, u256.Num1, keys[3]) - - // Import the batch and that both pending and queued transactions match up - pool.AddRemotesSync(txs) - pool.AddLocal(ltx) - - pending, queued := pool.Stats() - if pending != 7 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 7) - } - if queued != 3 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 3) - } - if err := validateEvents(events, 7); err != nil { - t.Fatalf("original event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Reprice the pool and check that underpriced transactions get dropped - pool.SetGasPrice(newInt(2)) - - pending, queued = pool.Stats() - if pending != 2 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) - } - if queued != 5 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 5) - } - if err := validateEvents(events, 0); err != nil { - t.Fatalf("reprice event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Check that we can't add the old transactions back - if err := pool.AddRemote(pricedTransaction(1, 100000, u256.Num1, keys[0])); err != ErrUnderpriced { - t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced) - } - if err := pool.AddRemote(pricedTransaction(0, 100000, u256.Num1, keys[1])); err != ErrUnderpriced { - t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced) - } - if err := pool.AddRemote(pricedTransaction(2, 100000, u256.Num1, keys[2])); err != ErrUnderpriced { - t.Fatalf("adding underpriced queued transaction error mismatch: have %v, want %v", err, ErrUnderpriced) - } - if err := validateEvents(events, 0); err != nil { - t.Fatalf("post-reprice event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // However we can add local underpriced transactions - tx := pricedTransaction(1, 100000, u256.Num1, keys[3]) - if err := pool.AddLocal(tx); err != nil { - t.Fatalf("failed to add underpriced local transaction: %v", err) - } - if pending, _ = pool.Stats(); pending != 3 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) - } - if err := validateEvents(events, 1); err != nil { - t.Fatalf("post-reprice local event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // And we can fill gaps with properly priced transactions - if err := pool.AddRemote(pricedTransaction(1, 100000, u256.Num2, keys[0])); err != nil { - t.Fatalf("failed to add pending transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(0, 100000, u256.Num2, keys[1])); err != nil { - t.Fatalf("failed to add pending transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(2, 100000, u256.Num2, keys[2])); err != nil { - t.Fatalf("failed to add queued transaction: %v", err) - } - if err := validateEvents(events, 5); err != nil { - t.Fatalf("post-reprice event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that setting the transaction pool gas price to a higher value does not -// remove local transactions. -func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { - // Create the pool to test the pricing enforcement with - db := memdb.NewTestDB(t) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create a number of test accounts and fund them - keys := make([]*ecdsa.PrivateKey, 3) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000*1000000)) - } - // Create transaction (both pending and queued) with a linearly growing gasprice - for i := uint64(0); i < 500; i++ { - // Add pending transaction. - pendingTx := pricedTransaction(i, 100000, uint256.NewInt(i), keys[2]) - if err := pool.AddLocal(pendingTx); err != nil { - t.Fatal(err) - } - // Add queued transaction. - queuedTx := pricedTransaction(i+501, 100000, uint256.NewInt(i), keys[2]) - if err := pool.AddLocal(queuedTx); err != nil { - t.Fatal(err) - } - } - pending, queued := pool.Stats() - expPending, expQueued := 500, 500 - validate := func() { - pending, queued = pool.Stats() - if pending != expPending { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, expPending) - } - if queued != expQueued { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, expQueued) - } - - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - } - validate() - - // Reprice the pool and check that nothing is dropped - pool.SetGasPrice(newInt(2)) - validate() - - pool.SetGasPrice(newInt(2)) - pool.SetGasPrice(newInt(4)) - pool.SetGasPrice(newInt(8)) - pool.SetGasPrice(newInt(100)) - validate() -} - -// Tests that when the pool reaches its global transaction limit, underpriced -// transactions are gradually shifted out for more expensive ones and any gapped -// pending transactions are moved into the queue. -// -// Note, local transactions are never allowed to be dropped. -func TestTransactionPoolUnderpricing(t *testing.T) { - // Create the pool to test the pricing enforcement with - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.GlobalSlots = 2 - config.GlobalQueue = 2 - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Keep track of transaction events to ensure all executables get announced - events := make(chan NewTxsEvent, 32) - sub := pool.txFeed.Subscribe(events) - defer sub.Unsubscribe() - - // Create a number of test accounts and fund them - keys := make([]*ecdsa.PrivateKey, 4) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - // Generate and queue a batch of transactions, both pending and queued - txs := types.Transactions{} - - txs = append(txs, pricedTransaction(0, 100000, u256.Num1, keys[0])) - txs = append(txs, pricedTransaction(1, 100000, u256.Num2, keys[0])) - - txs = append(txs, pricedTransaction(1, 100000, u256.Num1, keys[1])) - - ltx := pricedTransaction(0, 100000, u256.Num1, keys[2]) - - // Import the batch and that both pending and queued transactions match up - pool.AddRemotes(txs) - pool.AddLocal(ltx) - - pending, queued := pool.Stats() - if pending != 3 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) - } - if queued != 1 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) - } - if err := validateEvents(events, 3); err != nil { - t.Fatalf("original event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Ensure that adding an underpriced transaction on block limit fails - if err := pool.AddRemote(pricedTransaction(0, 100000, uint256.NewInt(1), keys[1])); err != ErrUnderpriced { - t.Fatalf("adding underpriced pending transaction error mismatch: have %v, want %v", err, ErrUnderpriced) - } - // Ensure that adding high priced transactions drops cheap ones, but not own - if err := pool.AddRemote(pricedTransaction(0, 100000, uint256.NewInt(3), keys[1])); err != nil { // +K1:0 => -K1:1 => Pend K0:0, K0:1, K1:0, K2:0; Que - - t.Fatalf("failed to add well priced transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(2, 100000, uint256.NewInt(4), keys[1])); err != nil { // +K1:2 => -K0:0 => Pend K1:0, K2:0; Que K0:1 K1:2 - t.Fatalf("failed to add well priced transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(3, 100000, uint256.NewInt(5), keys[1])); err != nil { // +K1:3 => -K0:1 => Pend K1:0, K2:0; Que K1:2 K1:3 - t.Fatalf("failed to add well priced transaction: %v", err) - } - pending, queued = pool.Stats() - if pending != 2 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) - } - if queued != 2 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2) - } - if err := validateEvents(events, 1); err != nil { - t.Fatalf("additional event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Ensure that adding local transactions can push out even higher priced ones - ltx = pricedTransaction(1, 100000, u256.Num0, keys[2]) - if err := pool.AddLocal(ltx); err != nil { - t.Fatalf("failed to append underpriced local transaction: %v", err) - } - ltx = pricedTransaction(0, 100000, u256.Num0, keys[3]) - if err := pool.AddLocal(ltx); err != nil { - t.Fatalf("failed to add new underpriced local transaction: %v", err) - } - pending, queued = pool.Stats() - if pending != 3 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 3) - } - if queued != 1 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) - } - if err := validateEvents(events, 2); err != nil { - t.Fatalf("local event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that more expensive transactions push out cheap ones from the pool, but -// without producing instability by creating gaps that start jumping transactions -// back and forth between queued/pending. -func TestTransactionPoolStableUnderpricing(t *testing.T) { - // Create the pool to test the pricing enforcement with - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.GlobalSlots = 128 - config.GlobalQueue = 0 - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Keep track of transaction events to ensure all executables get announced - events := make(chan NewTxsEvent, 32) - sub := pool.txFeed.Subscribe(events) - defer sub.Unsubscribe() - - // Create a number of test accounts and fund them - keys := make([]*ecdsa.PrivateKey, 2) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - // Fill up the entire queue with the same transaction price points - txs := types.Transactions{} - for i := uint64(0); i < config.GlobalSlots; i++ { - txs = append(txs, pricedTransaction(i, 100000, u256.Num1, keys[0])) - } - pool.AddRemotesSync(txs) - - pending, queued := pool.Stats() - if pending != int(config.GlobalSlots) { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, config.GlobalSlots) - } - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if err := validateEvents(events, int(config.GlobalSlots)); err != nil { - t.Fatalf("original event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Ensure that adding high priced transactions drops a cheap, but doesn't produce a gap - if err := pool.addRemoteSync(pricedTransaction(0, 100000, uint256.NewInt(3), keys[1])); err != nil { - t.Fatalf("failed to add well priced transaction: %v", err) - } - pending, queued = pool.Stats() - if pending != int(config.GlobalSlots) { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, config.GlobalSlots) - } - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if err := validateEvents(events, 1); err != nil { - t.Fatalf("additional event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that the pool rejects duplicate transactions. -func TestTransactionDeduplication(t *testing.T) { - db := memdb.NewTestDB(t) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create a test account to add transactions with - key, _ := crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(key.PublicKey), uint256.NewInt(1000000000)) - - // Create a batch of transactions and add a few of them - txs := make([]types.Transaction, 16) - for i := 0; i < len(txs); i++ { - txs[i] = pricedTransaction(uint64(i), 100000, u256.Num1, key) - } - var firsts []types.Transaction - for i := 0; i < len(txs); i += 2 { - firsts = append(firsts, txs[i]) - } - errs := pool.AddRemotesSync(firsts) - if len(errs) != len(firsts) { - t.Fatalf("first add mismatching result count: have %d, want %d", len(errs), len(firsts)) - } - for i, err := range errs { - if err != nil { - t.Errorf("add %d failed: %v", i, err) - } - } - pending, queued := pool.Stats() - if pending != 1 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 1) - } - if queued != len(txs)/2-1 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, len(txs)/2-1) - } - // Try to add all of them now and ensure previous ones error out as knowns - errs = pool.AddRemotesSync(txs) - if len(errs) != len(txs) { - t.Fatalf("all add mismatching result count: have %d, want %d", len(errs), len(txs)) - } - for i, err := range errs { - if i%2 == 0 && err == nil { - t.Errorf("add %d succeeded, should have failed as known", i) - } - if i%2 == 1 && err != nil { - t.Errorf("add %d failed: %v", i, err) - } - } - pending, queued = pool.Stats() - if pending != len(txs) { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, len(txs)) - } - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that the pool rejects replacement transactions that don't meet the minimum -// price bump required. -func TestTransactionReplacement(t *testing.T) { - // Create the pool to test the pricing enforcement with - db := memdb.NewTestDB(t) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Keep track of transaction events to ensure all executables get announced - events := make(chan NewTxsEvent, 32) - sub := pool.txFeed.Subscribe(events) - defer sub.Unsubscribe() - - // Create a test account to add transactions with - key, _ := crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(key.PublicKey), uint256.NewInt(1000000000)) - - // Add pending transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) - price := uint64(100) - threshold := (price * (100 + TestTxPoolConfig.PriceBump)) / 100 - - if err := pool.addRemoteSync(pricedTransaction(0, 100000, u256.Num1, key)); err != nil { - t.Fatalf("failed to add original cheap pending transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(0, 100001, u256.Num1, key)); err != ErrReplaceUnderpriced { - t.Fatalf("original cheap pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) - } - if err := pool.AddRemote(pricedTransaction(0, 100000, u256.Num2, key)); err != nil { - t.Fatalf("failed to replace original cheap pending transaction: %v", err) - } - if err := validateEvents(events, 2); err != nil { - t.Fatalf("cheap replacement event firing failed: %v", err) - } - - if err := pool.addRemoteSync(pricedTransaction(0, 100000, uint256.NewInt(price), key)); err != nil { - t.Fatalf("failed to add original proper pending transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(0, 100001, uint256.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced { - t.Fatalf("original proper pending transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) - } - if err := pool.AddRemote(pricedTransaction(0, 100000, uint256.NewInt(threshold), key)); err != nil { - t.Fatalf("failed to replace original proper pending transaction: %v", err) - } - if err := validateEvents(events, 2); err != nil { - t.Fatalf("proper replacement event firing failed: %v", err) - } - - // Add queued transactions, ensuring the minimum price bump is enforced for replacement (for ultra low prices too) - if err := pool.AddRemote(pricedTransaction(2, 100000, uint256.NewInt(1), key)); err != nil { - t.Fatalf("failed to add original cheap queued transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(2, 100001, uint256.NewInt(1), key)); err != ErrReplaceUnderpriced { - t.Fatalf("original cheap queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) - } - if err := pool.AddRemote(pricedTransaction(2, 100000, uint256.NewInt(2), key)); err != nil { - t.Fatalf("failed to replace original cheap queued transaction: %v", err) - } - - if err := pool.AddRemote(pricedTransaction(2, 100000, uint256.NewInt(price), key)); err != nil { - t.Fatalf("failed to add original proper queued transaction: %v", err) - } - if err := pool.AddRemote(pricedTransaction(2, 100001, uint256.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced { - t.Fatalf("original proper queued transaction replacement error mismatch: have %v, want %v", err, ErrReplaceUnderpriced) - } - if err := pool.AddRemote(pricedTransaction(2, 100000, uint256.NewInt(threshold), key)); err != nil { - t.Fatalf("failed to replace original proper queued transaction: %v", err) - } - - if err := validateEvents(events, 0); err != nil { - t.Fatalf("queued replacement event firing failed: %v", err) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// Tests that local transactions are journaled to disk, but remote transactions -// get discarded between restarts. -func TestTransactionJournaling(t *testing.T) { testTransactionJournaling(t, false) } -func TestTransactionJournalingNoLocals(t *testing.T) { testTransactionJournaling(t, true) } - -func testTransactionJournaling(t *testing.T, nolocals bool) { - // Create a temporary file for the journal - file, err := ioutil.TempFile("", "") - if err != nil { - t.Fatalf("failed to create temporary journal: %v", err) - } - journal := file.Name() - defer os.Remove(journal) - - // Clean up the temporary file, we only need the path for now - file.Close() - os.Remove(journal) - - // Create the original pool to inject transaction into the journal - db := memdb.NewTestDB(t) - - config := TestTxPoolConfig - config.NoLocals = nolocals - config.Journal = journal - config.Rejournal = time.Second - - pool := NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create two test accounts to ensure remotes expire but locals do not - local, _ := crypto.GenerateKey() - remote, _ := crypto.GenerateKey() - - err = db.Update(context.Background(), func(tx kv.RwTx) error { - stateWriter := state.NewPlainStateWriter(tx, nil, 1) - ibs := state.New(state.NewPlainStateReader(tx)) - ibs.AddBalance(crypto.PubkeyToAddress(local.PublicKey), uint256.NewInt(1000000000)) - ibs.AddBalance(crypto.PubkeyToAddress(remote.PublicKey), uint256.NewInt(1000000000)) - return ibs.CommitBlock(params.Rules{}, stateWriter) - }) - require.NoError(t, err) - - // Add three local and a remote transactions and ensure they are queued up - if err := pool.AddLocal(pricedTransaction(0, 100000, u256.Num1, local)); err != nil { - t.Fatalf("failed to add local transaction: %v", err) - } - if err := pool.AddLocal(pricedTransaction(1, 100000, u256.Num1, local)); err != nil { - t.Fatalf("failed to add local transaction: %v", err) - } - if err := pool.AddLocal(pricedTransaction(2, 100000, u256.Num1, local)); err != nil { - t.Fatalf("failed to add local transaction: %v", err) - } - if err := pool.addRemoteSync(pricedTransaction(0, 100000, u256.Num1, remote)); err != nil { - t.Fatalf("failed to add remote transaction: %v", err) - } - pending, queued := pool.Stats() - if pending != 4 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 4) - } - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - - // Terminate the old pool, bump the local nonce, create a new pool and ensure relevant transaction survive - pool.Stop() - - err = db.Update(context.Background(), func(tx kv.RwTx) error { - stateWriter := state.NewPlainStateWriter(tx, nil, 1) - ibs := state.New(state.NewPlainStateReader(tx)) - ibs.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) - return ibs.CommitBlock(params.Rules{}, stateWriter) - }) - require.NoError(t, err) - pool = NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - - pending, queued = pool.Stats() - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - if nolocals { - if pending != 0 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) - } - } else { - if pending != 2 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) - } - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Bump the nonce temporarily and ensure the newly invalidated transaction is removed - err = db.Update(context.Background(), func(tx kv.RwTx) error { - stateWriter := state.NewPlainStateWriter(tx, nil, 1) - ibs := state.New(state.NewPlainStateReader(tx)) - ibs.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 2) - return ibs.CommitBlock(params.Rules{}, stateWriter) - }) - require.NoError(t, err) - pool.ResetHead(1000000000, 1) - //<-pool.requestReset(nil, nil) - time.Sleep(2 * config.Rejournal) - - pool.Stop() - - err = db.Update(context.Background(), func(tx kv.RwTx) error { - stateWriter := state.NewPlainStateWriter(tx, nil, 1) - ibs := state.New(state.NewPlainStateReader(tx)) - ibs.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 1) - return ibs.CommitBlock(params.Rules{}, stateWriter) - }) - require.NoError(t, err) - - pool = NewTxPool(config, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - - pending, queued = pool.Stats() - if pending != 0 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 0) - } - if nolocals { - if queued != 0 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 0) - } - } else { - if queued != 1 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 1) - } - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } -} - -// TestTransactionStatusCheck tests that the pool can correctly retrieve the -// pending status of individual transactions. -func TestTransactionStatusCheck(t *testing.T) { - // Create the pool to test the status retrievals with - db := memdb.NewTestDB(t) - - pool := NewTxPool(TestTxPoolConfig, params.TestChainConfig, db) - if err := pool.Start(1000000000, 0); err != nil { - t.Fatalf("starting tx pool: %v", err) - } - defer func() { - pool.Stop() - }() - - // Create the test accounts to check various transaction statuses with - keys := make([]*ecdsa.PrivateKey, 3) - for i := 0; i < len(keys); i++ { - keys[i], _ = crypto.GenerateKey() - pool.currentState.AddBalance(crypto.PubkeyToAddress(keys[i].PublicKey), uint256.NewInt(1000000)) - } - // Generate and queue a batch of transactions, both pending and queued - txs := types.Transactions{} - - txs = append(txs, pricedTransaction(0, 100000, u256.Num1, keys[0])) // Pending only - txs = append(txs, pricedTransaction(0, 100000, u256.Num1, keys[1])) // Pending and queued - txs = append(txs, pricedTransaction(2, 100000, u256.Num1, keys[1])) - txs = append(txs, pricedTransaction(2, 100000, u256.Num1, keys[2])) // Queued only - - // Import the transaction and ensure they are correctly added - pool.AddRemotesSync(txs) - - pending, queued := pool.Stats() - if pending != 2 { - t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 2) - } - if queued != 2 { - t.Fatalf("queued transactions mismatched: have %d, want %d", queued, 2) - } - if err := validateTxPoolInternals(pool); err != nil { - t.Fatalf("pool internal state corrupted: %v", err) - } - // Retrieve the status of each transaction and validate them - hashes := make([]common.Hash, len(txs)) - for i, tx := range txs { - hashes[i] = tx.Hash() - } - hashes = append(hashes, common.Hash{}) - - statuses := pool.Status(hashes) - expect := []TxStatus{TxStatusPending, TxStatusPending, TxStatusQueued, TxStatusQueued, TxStatusUnknown} - - for i := 0; i < len(statuses); i++ { - if statuses[i] != expect[i] { - t.Errorf("transaction %d: status mismatch: have %v, want %v", i, statuses[i], expect[i]) - } - } -} - -// Test the transaction slots consumption is computed correctly -func TestTransactionSlotCount(t *testing.T) { - key, _ := crypto.GenerateKey() - - // Check that an empty transaction consumes a single slot - smallTx := pricedDataTransaction(0, 0, u256.Num0, key, 0) - if slots := numSlots(smallTx); slots != 1 { - t.Fatalf("small transactions slot count mismatch: have %d want %d", slots, 1) - } - // Check that a large transaction consumes the correct number of slots - bigTx := pricedDataTransaction(0, 0, u256.Num0, key, uint64(10*txSlotSize)) - if slots := numSlots(bigTx); slots != 11 { - t.Fatalf("big transactions slot count mismatch: have %d want %d", slots, 11) - } -} - -// Benchmarks the speed of validating the contents of the pending queue of the -// transaction pool. -func BenchmarkPendingDemotion100(b *testing.B) { benchmarkPendingDemotion(b, 100) } -func BenchmarkPendingDemotion1000(b *testing.B) { benchmarkPendingDemotion(b, 1000) } -func BenchmarkPendingDemotion10000(b *testing.B) { benchmarkPendingDemotion(b, 10000) } - -func benchmarkPendingDemotion(b *testing.B, size int) { - // Add a batch of transactions to a pool one by one - pool, key := setupTxPool(b) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000)) - - for i := 0; i < size; i++ { - tx := transaction(uint64(i), 100000, key) - pool.promoteTx(account, tx.Hash(), tx) - } - // Benchmark the speed of pool validation - b.ResetTimer() - for i := 0; i < b.N; i++ { - pool.demoteUnexecutables() - } -} - -// Benchmarks the speed of scheduling the contents of the future queue of the -// transaction pool. -func BenchmarkFuturePromotion100(b *testing.B) { benchmarkFuturePromotion(b, 100) } -func BenchmarkFuturePromotion1000(b *testing.B) { benchmarkFuturePromotion(b, 1000) } -func BenchmarkFuturePromotion10000(b *testing.B) { benchmarkFuturePromotion(b, 10000) } - -func benchmarkFuturePromotion(b *testing.B, size int) { - // Add a batch of transactions to a pool one by one - pool, key := setupTxPool(b) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000)) - - for i := 0; i < size; i++ { - tx := transaction(uint64(1+i), 100000, key) - if _, err := pool.enqueueTx(tx.Hash(), tx, false, true); err != nil { - b.Fatal(err) - } - } - // Benchmark the speed of pool validation - b.ResetTimer() - for i := 0; i < b.N; i++ { - pool.promoteExecutables(nil) - } -} - -// Benchmarks the speed of batched transaction insertion. -func BenchmarkPoolBatchInsert100(b *testing.B) { benchmarkPoolBatchInsert(b, 100, false) } -func BenchmarkPoolBatchInsert1000(b *testing.B) { benchmarkPoolBatchInsert(b, 1000, false) } -func BenchmarkPoolBatchInsert10000(b *testing.B) { benchmarkPoolBatchInsert(b, 10000, false) } - -func BenchmarkPoolBatchLocalInsert100(b *testing.B) { benchmarkPoolBatchInsert(b, 100, true) } -func BenchmarkPoolBatchLocalInsert1000(b *testing.B) { benchmarkPoolBatchInsert(b, 1000, true) } -func BenchmarkPoolBatchLocalInsert10000(b *testing.B) { benchmarkPoolBatchInsert(b, 10000, true) } - -func benchmarkPoolBatchInsert(b *testing.B, size int, local bool) { - // Generate a batch of transactions to enqueue into the pool - pool, key := setupTxPool(b) - - account := crypto.PubkeyToAddress(key.PublicKey) - pool.currentState.AddBalance(account, uint256.NewInt(1000000)) - - batches := make([]types.Transactions, b.N) - for i := 0; i < b.N; i++ { - batches[i] = make(types.Transactions, size) - for j := 0; j < size; j++ { - batches[i][j] = transaction(uint64(size*i+j), 100000, key) - } - } - // Benchmark importing the transactions into the queue - b.ResetTimer() - for _, batch := range batches { - if local { - pool.AddLocals(batch) - } else { - pool.AddRemotes(batch) - } - } -} - -func BenchmarkInsertRemoteWithAllLocals(b *testing.B) { - // Allocate keys for testing - key, _ := crypto.GenerateKey() - account := crypto.PubkeyToAddress(key.PublicKey) - - remoteKey, _ := crypto.GenerateKey() - remoteAddr := crypto.PubkeyToAddress(remoteKey.PublicKey) - - locals := make([]types.Transaction, 4096+1024) // Occupy all slots - for i := 0; i < len(locals); i++ { - locals[i] = transaction(uint64(i), 100000, key) - } - remotes := make([]types.Transaction, 1000) - for i := 0; i < len(remotes); i++ { - remotes[i] = pricedTransaction(uint64(i), 100000, newInt(2), remoteKey) // Higher gasprice - } - // Benchmark importing the transactions into the queue - b.ResetTimer() - for i := 0; i < b.N; i++ { - b.StopTimer() - pool, _ := setupTxPool(b) - pool.currentState.AddBalance(account, newInt(100000000)) - for _, local := range locals { - if err := pool.AddLocal(local); err != nil { - b.Fatal(err) - } - } - b.StartTimer() - // Assign a high enough balance for testing - pool.currentState.AddBalance(remoteAddr, newInt(100000000)) - for i := 0; i < len(remotes); i++ { - pool.AddRemotes([]types.Transaction{remotes[i]}) - } - pool.Stop() - } -} diff --git a/core/types/access_list_tx.go b/core/types/access_list_tx.go index 0dd41185445..ed700591cd2 100644 --- a/core/types/access_list_tx.go +++ b/core/types/access_list_tx.go @@ -27,6 +27,7 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" ) @@ -465,22 +466,16 @@ func (tx *AccessListTx) DecodeRLP(s *rlp.Stream) error { return err } var b []byte - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read ChainID: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for ChainID: %d", len(b)) - } tx.ChainID = new(uint256.Int).SetBytes(b) if tx.Nonce, err = s.Uint(); err != nil { return fmt.Errorf("read Nonce: %w", err) } - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read GasPrice: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for GasPrice: %d", len(b)) - } tx.GasPrice = new(uint256.Int).SetBytes(b) if tx.Gas, err = s.Uint(); err != nil { return fmt.Errorf("read Gas: %w", err) @@ -495,12 +490,9 @@ func (tx *AccessListTx) DecodeRLP(s *rlp.Stream) error { tx.To = &common.Address{} copy((*tx.To)[:], b) } - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read Value: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for Value: %d", len(b)) - } tx.Value = new(uint256.Int).SetBytes(b) if tx.Data, err = s.Bytes(); err != nil { return fmt.Errorf("read Data: %w", err) @@ -511,26 +503,17 @@ func (tx *AccessListTx) DecodeRLP(s *rlp.Stream) error { return fmt.Errorf("read AccessList: %w", err) } // decode V - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read V: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for V: %d", len(b)) - } tx.V.SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read R: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for R: %d", len(b)) - } tx.R.SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read S: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for S: %d", len(b)) - } tx.S.SetBytes(b) if err := s.ListEnd(); err != nil { return fmt.Errorf("close AccessListTx: %w", err) @@ -539,7 +522,7 @@ func (tx *AccessListTx) DecodeRLP(s *rlp.Stream) error { } // AsMessage returns the transaction as a core.Message. -func (tx AccessListTx) AsMessage(s Signer, _ *big.Int) (Message, error) { +func (tx AccessListTx) AsMessage(s Signer, _ *big.Int, rules *params.Rules) (Message, error) { msg := Message{ nonce: tx.Nonce, gasLimit: tx.Gas, @@ -553,6 +536,10 @@ func (tx AccessListTx) AsMessage(s Signer, _ *big.Int) (Message, error) { checkNonce: true, } + if !rules.IsBerlin { + return msg, errors.New("eip-2930 transactions require Berlin") + } + var err error msg.from, err = tx.Sender(s) return msg, err @@ -635,14 +622,3 @@ func (tx *AccessListTx) Sender(signer Signer) (common.Address, error) { tx.from.Store(addr) return addr, nil } - -func (tx AccessListTx) GetSender() (common.Address, bool) { - if sc := tx.from.Load(); sc != nil { - return sc.(common.Address), true - } - return common.Address{}, false -} - -func (tx *AccessListTx) SetSender(addr common.Address) { - tx.from.Store(addr) -} diff --git a/core/types/accounts/account.go b/core/types/accounts/account.go index c6fbb06d605..13f1fd19181 100644 --- a/core/types/accounts/account.go +++ b/core/types/accounts/account.go @@ -28,6 +28,8 @@ const ( MimetypeDataWithValidator = "data/validator" MimetypeTypedData = "data/typed" MimetypeClique = "application/x-clique-header" + MimetypeParlia = "application/x-parlia-header" + MimetypeBor = "application/x-bor-header" MimetypeTextPlain = "text/plain" ) @@ -504,6 +506,7 @@ func (a *Account) DecodeForStorage(enc []byte) error { } if fieldSet&8 > 0 { + decodeLength := int(enc[pos]) if decodeLength != 32 { @@ -526,6 +529,53 @@ func (a *Account) DecodeForStorage(enc []byte) error { return nil } +func DecodeIncarnationFromStorage(enc []byte) (uint64, error) { + if len(enc) == 0 { + return 0, nil + } + + var fieldSet = enc[0] + var pos = 1 + + //looks for the position incarnation is at + if fieldSet&1 > 0 { + decodeLength := int(enc[pos]) + if len(enc) < pos+decodeLength+1 { + return 0, fmt.Errorf( + "malformed CBOR for Account.Nonce: %s, Length %d", + enc[pos+1:], decodeLength) + } + pos += decodeLength + 1 + } + + if fieldSet&2 > 0 { + decodeLength := int(enc[pos]) + if len(enc) < pos+decodeLength+1 { + return 0, fmt.Errorf( + "malformed CBOR for Account.Nonce: %s, Length %d", + enc[pos+1:], decodeLength) + } + pos += decodeLength + 1 + } + + if fieldSet&4 > 0 { + decodeLength := int(enc[pos]) + + //checks if the ending position is correct if not returns 0 + if len(enc) < pos+decodeLength+1 { + return 0, fmt.Errorf( + "malformed CBOR for Account.Incarnation: %s, Length %d", + enc[pos+1:], decodeLength) + } + + incarnation := bytesToUint64(enc[pos+1 : pos+decodeLength+1]) + return incarnation, nil + } + + return 0, nil + +} + func (a *Account) SelfCopy() *Account { newAcc := NewAccount() newAcc.Copy(a) diff --git a/core/types/accounts/account_benchmark_test.go b/core/types/accounts/account_benchmark_test.go index 2a5edfe8a89..86a80eade9e 100644 --- a/core/types/accounts/account_benchmark_test.go +++ b/core/types/accounts/account_benchmark_test.go @@ -2,7 +2,7 @@ package accounts import ( "fmt" - "io/ioutil" + "io" "testing" "github.com/holiman/uint256" @@ -59,7 +59,7 @@ func BenchmarkEncodingLengthForStorage(b *testing.B) { b.StopTimer() } - fmt.Fprint(ioutil.Discard, lengths) + fmt.Fprint(io.Discard, lengths) }) } } @@ -112,7 +112,7 @@ func BenchmarkEncodingLengthForHashing(b *testing.B) { bn.StopTimer() } - fmt.Fprint(ioutil.Discard, lengths) + fmt.Fprint(io.Discard, lengths) }) } @@ -170,7 +170,7 @@ func BenchmarkEncodingAccountForStorage(b *testing.B) { b.StopTimer() for _, test := range accountCases { - fmt.Fprint(ioutil.Discard, test.acc) + fmt.Fprint(io.Discard, test.acc) } } @@ -224,7 +224,7 @@ func BenchmarkEncodingAccountForHashing(b *testing.B) { b.StopTimer() for _, test := range accountCases { - fmt.Fprint(ioutil.Discard, test.acc) + fmt.Fprint(io.Discard, test.acc) } } @@ -268,12 +268,12 @@ func BenchmarkDecodingAccount(b *testing.B) { b.ResetTimer() for _, test := range accountCases { test := test - encodedAccount := make([]byte, test.acc.EncodingLengthForStorage()) b.Run(fmt.Sprint(test.name), func(b *testing.B) { for i := 0; i < b.N; i++ { b.StopTimer() test.acc.Nonce = uint64(i) test.acc.Balance.SetUint64(uint64(i)) + encodedAccount := make([]byte, test.acc.EncodingLengthForStorage()) test.acc.EncodeForStorage(encodedAccount) @@ -289,12 +289,85 @@ func BenchmarkDecodingAccount(b *testing.B) { b.StartTimer() } }) + } b.StopTimer() for _, acc := range decodedAccounts { - fmt.Fprint(ioutil.Discard, acc) + fmt.Fprint(io.Discard, acc) + } +} + +func BenchmarkDecodingIncarnation(b *testing.B) { + accountCases := []struct { + name string + acc *Account + }{ + { + name: "EmptyAccount", + acc: &Account{ + Nonce: 0, + Balance: *new(uint256.Int), + Root: emptyRoot, // extAccount doesn't have Root value + CodeHash: emptyCodeHash, // extAccount doesn't have CodeHash value + }, + }, + + { + name: "AccountEncodeWithCode", + acc: &Account{ + Nonce: 2, + Balance: *new(uint256.Int).SetUint64(1000), + Root: common.HexToHash("0000000000000000000000000000000000000000000000000000000000000021"), + CodeHash: common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})), + }, + }, + + { + name: "AccountEncodeWithCodeWithStorageSizeHack", + acc: &Account{ + Nonce: 2, + Balance: *new(uint256.Int).SetUint64(1000), + Root: common.HexToHash("0000000000000000000000000000000000000000000000000000000000000021"), + CodeHash: common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})), + }, + }, } + + var decodedIncarnations []uint64 + b.ResetTimer() + for _, test := range accountCases { + test := test + encodedAccount := make([]byte, test.acc.EncodingLengthForStorage()) + b.Run(fmt.Sprint(test.name), func(b *testing.B) { + for i := 0; i < b.N; i++ { + b.StopTimer() + + test.acc.Nonce = uint64(i) + test.acc.Balance.SetUint64(uint64(i)) + test.acc.EncodeForStorage(encodedAccount) + + b.StartTimer() + + if _, err := DecodeIncarnationFromStorage(encodedAccount); err != nil { + b.Fatal("can't decode the incarnation", err, encodedAccount) + } + + decodedIncarnation, _ := DecodeIncarnationFromStorage(encodedAccount) + + b.StopTimer() + decodedIncarnations = append(decodedIncarnations, decodedIncarnation) + + b.StartTimer() + } + }) + } + + b.StopTimer() + for _, incarnation := range decodedIncarnations { + fmt.Fprint(io.Discard, incarnation) + } + } func BenchmarkRLPEncodingAccount(b *testing.B) { @@ -338,7 +411,7 @@ func BenchmarkRLPEncodingAccount(b *testing.B) { test := test b.Run(fmt.Sprint(test.name), func(b *testing.B) { for i := 0; i < b.N; i++ { - if err := test.acc.EncodeRLP(ioutil.Discard); err != nil { + if err := test.acc.EncodeRLP(io.Discard); err != nil { b.Fatal("cant encode the account", err, test) } } @@ -361,7 +434,7 @@ func BenchmarkIsEmptyCodeHash(b *testing.B) { } b.StopTimer() - fmt.Fprint(ioutil.Discard, isEmpty) + fmt.Fprint(io.Discard, isEmpty) } func BenchmarkIsEmptyRoot(b *testing.B) { @@ -379,5 +452,5 @@ func BenchmarkIsEmptyRoot(b *testing.B) { } b.StopTimer() - fmt.Fprint(ioutil.Discard, isEmpty) + fmt.Fprint(io.Discard, isEmpty) } diff --git a/core/types/accounts/account_test.go b/core/types/accounts/account_test.go index dd726464c5e..5d260f4e5de 100644 --- a/core/types/accounts/account_test.go +++ b/core/types/accounts/account_test.go @@ -189,3 +189,115 @@ func isAccountsEqual(t *testing.T, src, dst Account) { t.Fatal("cant decode the account Version", src.Incarnation, dst.Incarnation) } } + +func TestIncarnationForEmptyAccount(t *testing.T) { + a := Account{ + Initialised: true, + Nonce: 100, + Balance: *new(uint256.Int), + Root: emptyRoot, + CodeHash: emptyCodeHash, + Incarnation: 4, + } + + encodedAccount := make([]byte, a.EncodingLengthForStorage()) + a.EncodeForStorage(encodedAccount) + + if _, err := DecodeIncarnationFromStorage(encodedAccount); err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + decodedIncarnation, err := DecodeIncarnationFromStorage(encodedAccount) + if err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + isIncarnationEqual(t, a.Incarnation, decodedIncarnation) +} + +func TestEmptyIncarnationForEmptyAccount2(t *testing.T) { + a := Account{} + + encodedAccount := make([]byte, a.EncodingLengthForStorage()) + a.EncodeForStorage(encodedAccount) + + if _, err := DecodeIncarnationFromStorage(encodedAccount); err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + decodedIncarnation, err := DecodeIncarnationFromStorage(encodedAccount) + if err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + isIncarnationEqual(t, a.Incarnation, decodedIncarnation) + +} + +func TestIncarnationWithNonEmptyAccount(t *testing.T) { + a := Account{ + Initialised: true, + Nonce: 2, + Balance: *new(uint256.Int).SetUint64(1000), + Root: common.HexToHash("0000000000000000000000000000000000000000000000000000000000000021"), + CodeHash: common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})), + Incarnation: 4, + } + + encodedAccount := make([]byte, a.EncodingLengthForStorage()) + a.EncodeForStorage(encodedAccount) + + if _, err := DecodeIncarnationFromStorage(encodedAccount); err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + decodedIncarnation, err := DecodeIncarnationFromStorage(encodedAccount) + if err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + isIncarnationEqual(t, a.Incarnation, decodedIncarnation) + +} + +func TestIncarnationWithNoIncarnation(t *testing.T) { + a := Account{ + Initialised: true, + Nonce: 2, + Balance: *new(uint256.Int).SetUint64(1000), + Root: common.HexToHash("0000000000000000000000000000000000000000000000000000000000000021"), + CodeHash: common.BytesToHash(crypto.Keccak256([]byte{1, 2, 3})), + Incarnation: 0, + } + + encodedAccount := make([]byte, a.EncodingLengthForStorage()) + a.EncodeForStorage(encodedAccount) + + if _, err := DecodeIncarnationFromStorage(encodedAccount); err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + decodedIncarnation, err := DecodeIncarnationFromStorage(encodedAccount) + if err != nil { + t.Fatal("Can't decode the incarnation", err, encodedAccount) + } + + isIncarnationEqual(t, a.Incarnation, decodedIncarnation) + +} + +func TestIncarnationWithInvalidEncodedAccount(t *testing.T) { + + var failingSlice = []byte{1, 12} + + if incarnation, err := DecodeIncarnationFromStorage(failingSlice); err == nil { + t.Fatal("decoded the incarnation", incarnation, failingSlice) + } + +} + +func isIncarnationEqual(t *testing.T, initialIncarnation uint64, decodedIncarnation uint64) { + if initialIncarnation != decodedIncarnation { + t.Fatal("Can't decode the incarnation", initialIncarnation, decodedIncarnation) + } +} diff --git a/core/types/block.go b/core/types/block.go index f7d592d9552..62d5c8ea054 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -28,8 +28,8 @@ import ( "sync/atomic" "time" + rlp2 "github.com/ledgerwatch/erigon-lib/rlp" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/rlp" ) @@ -37,8 +37,17 @@ import ( var ( EmptyRootHash = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") EmptyUncleHash = rlpHash([]*Header(nil)) + headerWithSeal = false ) +func SetHeaderSealFlag(withSeal bool) { + headerWithSeal = withSeal +} + +func IsHeaderWithSeal() bool { + return headerWithSeal +} + // A BlockNonce is a 64-bit hash which proves (combined with the // mix-hash) that a sufficient amount of computation has been carried // out on a block. @@ -106,15 +115,21 @@ func (h Header) EncodingSize() int { encodingSize += 33 /* MixDigest */ + 9 /* BlockNonce */ } encodingSize++ - var diffLen int - if h.Difficulty != nil && h.Difficulty.BitLen() >= 8 { - diffLen = (h.Difficulty.BitLen() + 7) / 8 + var diffBitLen, diffLen int + if h.Difficulty != nil { + diffBitLen = h.Difficulty.BitLen() + if diffBitLen >= 8 { + diffLen = (diffBitLen + 7) / 8 + } } encodingSize += diffLen encodingSize++ - var numberLen int - if h.Number != nil && h.Number.BitLen() >= 8 { - numberLen = (h.Number.BitLen() + 7) / 8 + var numberBitLen, numberLen int + if h.Number != nil { + numberBitLen = h.Number.BitLen() + if numberBitLen >= 8 { + numberLen = (numberBitLen + 7) / 8 + } } encodingSize += numberLen encodingSize++ @@ -150,11 +165,12 @@ func (h Header) EncodingSize() int { encodingSize += len(h.Extra) } // size of BaseFee - var baseFeeLen int + var baseFeeBitLen, baseFeeLen int if h.Eip1559 { encodingSize++ - if h.BaseFee.BitLen() >= 8 { - baseFeeLen = (h.BaseFee.BitLen() + 7) / 8 + baseFeeBitLen = h.BaseFee.BitLen() + if baseFeeBitLen >= 8 { + baseFeeLen = (baseFeeBitLen + 7) / 8 } encodingSize += baseFeeLen } @@ -178,16 +194,22 @@ func (h Header) EncodeRLP(w io.Writer) error { } encodingSize++ - var diffLen int - if h.Difficulty != nil && h.Difficulty.BitLen() >= 8 { - diffLen = (h.Difficulty.BitLen() + 7) / 8 + var diffBitLen, diffLen int + if h.Difficulty != nil { + diffBitLen = h.Difficulty.BitLen() + if diffBitLen >= 8 { + diffLen = (diffBitLen + 7) / 8 + } } encodingSize += diffLen encodingSize++ - var numberLen int - if h.Number != nil && h.Number.BitLen() >= 8 { - numberLen = (h.Number.BitLen() + 7) / 8 + var numberBitLen, numberLen int + if h.Number != nil { + numberBitLen = h.Number.BitLen() + if numberBitLen >= 8 { + numberLen = (numberBitLen + 7) / 8 + } } encodingSize += numberLen @@ -225,11 +247,12 @@ func (h Header) EncodeRLP(w io.Writer) error { } encodingSize += len(h.Extra) } - var baseFeeLen int + var baseFeeBitLen, baseFeeLen int if h.Eip1559 { encodingSize++ - if h.BaseFee.BitLen() >= 8 { - baseFeeLen = (h.BaseFee.BitLen() + 7) / 8 + baseFeeBitLen = h.BaseFee.BitLen() + if baseFeeBitLen >= 8 { + baseFeeLen = (baseFeeBitLen + 7) / 8 } encodingSize += baseFeeLen } @@ -287,30 +310,34 @@ func (h Header) EncodeRLP(w io.Writer) error { if _, err := w.Write(h.Bloom.Bytes()); err != nil { return err } - if h.Difficulty != nil && h.Difficulty.BitLen() > 0 && h.Difficulty.BitLen() < 8 { - b[0] = byte(h.Difficulty.Uint64()) + if diffBitLen < 8 { + if diffBitLen > 0 { + b[0] = byte(h.Difficulty.Uint64()) + } else { + b[0] = 128 + } if _, err := w.Write(b[:1]); err != nil { return err } } else { b[0] = 128 + byte(diffLen) - if h.Difficulty != nil { - h.Difficulty.FillBytes(b[1 : 1+diffLen]) - } + h.Difficulty.FillBytes(b[1 : 1+diffLen]) if _, err := w.Write(b[:1+diffLen]); err != nil { return err } } - if h.Number != nil && h.Number.BitLen() > 0 && h.Number.BitLen() < 8 { - b[0] = byte(h.Number.Uint64()) + if numberBitLen < 8 { + if numberBitLen > 0 { + b[0] = byte(h.Number.Uint64()) + } else { + b[0] = 128 + } if _, err := w.Write(b[:1]); err != nil { return err } } else { b[0] = 128 + byte(numberLen) - if h.Number != nil { - h.Number.FillBytes(b[1 : 1+numberLen]) - } + h.Number.FillBytes(b[1 : 1+numberLen]) if _, err := w.Write(b[:1+numberLen]); err != nil { return err } @@ -379,8 +406,12 @@ func (h Header) EncodeRLP(w io.Writer) error { } if h.Eip1559 { - if h.BaseFee.BitLen() > 0 && h.BaseFee.BitLen() < 8 { - b[0] = byte(h.BaseFee.Uint64()) + if baseFeeBitLen < 8 { + if baseFeeBitLen > 0 { + b[0] = byte(h.BaseFee.Uint64()) + } else { + b[0] = 128 + } if _, err := w.Write(b[:1]); err != nil { return err } @@ -392,12 +423,13 @@ func (h Header) EncodeRLP(w io.Writer) error { } } } + return nil } func (h *Header) DecodeRLP(s *rlp.Stream) error { if !h.WithSeal { // then tests can enable without env flag - h.WithSeal = debug.HeadersSeal() + h.WithSeal = IsHeaderWithSeal() } _, err := s.List() if err != nil { @@ -454,19 +486,13 @@ func (h *Header) DecodeRLP(s *rlp.Stream) error { return fmt.Errorf("wrong size for Bloom: %d", len(b)) } copy(h.Bloom[:], b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read Difficulty: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for Difficulty: %d", len(b)) - } h.Difficulty = new(big.Int).SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read Number: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for Number: %d", len(b)) - } h.Number = new(big.Int).SetBytes(b) if h.GasLimit, err = s.Uint(); err != nil { return fmt.Errorf("read GasLimit: %w", err) @@ -504,7 +530,7 @@ func (h *Header) DecodeRLP(s *rlp.Stream) error { return fmt.Errorf("wrong size for Nonce: %d", len(b)) } copy(h.Nonce[:], b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { if errors.Is(err, rlp.EOL) { h.BaseFee = nil h.Eip1559 = false @@ -515,9 +541,6 @@ func (h *Header) DecodeRLP(s *rlp.Stream) error { } return fmt.Errorf("read BaseFee: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for BaseFee: %d", len(b)) - } h.Eip1559 = true h.BaseFee = new(big.Int).SetBytes(b) } @@ -588,6 +611,17 @@ func (h *Header) EmptyReceipts() bool { return h.ReceiptHash == EmptyRootHash } +func (h *Header) copySeal() []rlp.RawValue { + seal := h.Seal + if len(seal) > 0 { + seal = make([]rlp.RawValue, len(seal)) + for i, s := range h.Seal { + seal[i] = common.CopyBytes(s) + } + } + return seal +} + // Body is a simple (mutable, non-safe) data container for storing and moving // a block's data contents (transactions and uncles) together. type Body struct { @@ -924,6 +958,7 @@ func NewBlock(header *Header, txs []Transaction, uncles []*Header, receipts []*R if len(receipts) == 0 { b.header.ReceiptHash = EmptyRootHash + b.header.Bloom = Bloom{} } else { b.header.ReceiptHash = DeriveSha(Receipts(receipts)) b.header.Bloom = CreateBloom(receipts) @@ -975,12 +1010,7 @@ func CopyHeader(h *Header) *Header { cpy.Extra = make([]byte, len(h.Extra)) copy(cpy.Extra, h.Extra) } - if len(h.Seal) > 0 { - cpy.Seal = make([]rlp.RawValue, len(h.Seal)) - for i := range h.Seal { - cpy.Seal[i] = common.CopyBytes(h.Seal[i]) - } - } + cpy.Seal = h.copySeal() return &cpy } @@ -1056,6 +1086,8 @@ func (bb Block) payloadSize() (payloadSize int, txsLen, unclesLen int) { txLen = t.EncodingSize() case *DynamicFeeTransaction: txLen = t.EncodingSize() + case *StarknetTransaction: + txLen = t.EncodingSize() } if txLen >= 56 { txsLen += (bits.Len(uint(txLen)) + 7) / 8 @@ -1118,6 +1150,10 @@ func (bb Block) EncodeRLP(w io.Writer) error { if err := t.EncodeRLP(w); err != nil { return err } + case *StarknetTransaction: + if err := t.EncodeRLP(w); err != nil { + return err + } } } // encode Uncles @@ -1162,7 +1198,8 @@ func (b *Block) Time() uint64 { return b.header.Time } func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() } func (b *Block) MixDigest() common.Hash { return b.header.MixDigest } -func (b *Block) Nonce() uint64 { return binary.BigEndian.Uint64(b.header.Nonce[:]) } +func (b *Block) Nonce() BlockNonce { return b.header.Nonce } +func (b *Block) NonceU64() uint64 { return b.header.Nonce.Uint64() } func (b *Block) Bloom() Bloom { return b.header.Bloom } func (b *Block) Coinbase() common.Address { return b.header.Coinbase } func (b *Block) Root() common.Hash { return b.header.Root } @@ -1177,7 +1214,9 @@ func (b *Block) BaseFee() *big.Int { } return new(big.Int).Set(b.header.BaseFee) } +func (b *Block) Seal() (seal []rlp.RawValue) { return b.header.copySeal() } +// Header returns a deep-copy of the entire block header using CopyHeader() func (b *Block) Header() *Header { return CopyHeader(b.header) } // Body returns the non-header content of the block. @@ -1187,7 +1226,7 @@ func (b *Block) Body() *Body { return bd } func (b *Block) SendersToTxs(senders []common.Address) { - if senders == nil { + if len(senders) == 0 { return } for i, tx := range b.transactions { @@ -1241,6 +1280,52 @@ func CalcUncleHash(uncles []*Header) common.Hash { return rlpHash(uncles) } +// Copy creates a deep copy of the Block. +func (b *Block) Copy() *Block { + uncles := make([]*Header, 0, len(b.uncles)) + for _, uncle := range b.uncles { + uncles = append(uncles, CopyHeader(uncle)) + } + + transactionsData, err := MarshalTransactionsBinary(b.transactions) + if err != nil { + panic(fmt.Errorf("MarshalTransactionsBinary failed: %w", err)) + } + transactions, err := DecodeTransactions(transactionsData) + if err != nil { + panic(fmt.Errorf("DecodeTransactions failed: %w", err)) + } + + var hashValue atomic.Value + if value := b.hash.Load(); value != nil { + hash := value.(common.Hash) + hashCopy := common.BytesToHash(hash.Bytes()) + hashValue.Store(hashCopy) + } + + var sizeValue atomic.Value + if size := b.size.Load(); size != nil { + sizeValue.Store(size) + } + + td := big.NewInt(0).Set(b.td) + + if b.ReceivedFrom != nil { + panic("ReceivedFrom deep copy is not supported") + } + + return &Block{ + header: CopyHeader(b.header), + uncles: uncles, + transactions: transactions, + hash: hashValue, + size: sizeValue, + td: td, + ReceivedAt: b.ReceivedAt, + ReceivedFrom: nil, + } +} + // WithSeal returns a new block with the data from b but the header replaced with // the sealed one. func (b *Block) WithSeal(header *Header) *Block { @@ -1279,3 +1364,19 @@ func (b *Block) Hash() common.Hash { } type Blocks []*Block + +func DecodeOnlyTxMetadataFromBody(payload []byte) (baseTxId uint64, txAmount uint32, err error) { + pos, _, err := rlp2.List(payload, 0) + if err != nil { + return baseTxId, txAmount, err + } + pos, baseTxId, err = rlp2.U64(payload, pos) + if err != nil { + return baseTxId, txAmount, err + } + _, txAmount, err = rlp2.U32(payload, pos) + if err != nil { + return baseTxId, txAmount, err + } + return +} diff --git a/core/types/block_test.go b/core/types/block_test.go index fb817ec7fb5..c72ace5fbba 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -52,7 +52,7 @@ func TestBlockEncoding(t *testing.T) { check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498")) check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) check("Hash", block.Hash(), common.HexToHash("0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e")) - check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) + check("Nonce", block.NonceU64(), uint64(0xa13a5a8c8f2bb1c4)) check("Time", block.Time(), uint64(1426516743)) check("Size", block.Size(), common.StorageSize(len(blockEnc))) @@ -89,7 +89,7 @@ func TestEIP1559BlockEncoding(t *testing.T) { check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498")) check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) check("Hash", block.Hash(), common.HexToHash("c7252048cd273fe0dac09650027d07f0e3da4ee0675ebbb26627cea92729c372")) - check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) + check("Nonce", block.NonceU64(), uint64(0xa13a5a8c8f2bb1c4)) check("Time", block.Time(), uint64(1426516743)) check("Size", block.Size(), common.StorageSize(len(blockEnc))) check("BaseFee", block.BaseFee(), new(big.Int).SetUint64(params.InitialBaseFee)) @@ -107,12 +107,12 @@ func TestEIP1559BlockEncoding(t *testing.T) { to := common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87") feeCap, _ := uint256.FromBig(block.BaseFee()) var tx2 Transaction = &DynamicFeeTransaction{ - ChainID: u256.Num1, CommonTx: CommonTx{ - Nonce: 0, - To: &to, - Gas: 123457, - Data: []byte{}, + ChainID: u256.Num1, + Nonce: 0, + To: &to, + Gas: 123457, + Data: []byte{}, }, FeeCap: feeCap, Tip: u256.Num0, @@ -154,7 +154,7 @@ func TestEIP2718BlockEncoding(t *testing.T) { check("Coinbase", block.Coinbase(), common.HexToAddress("8888f1f195afa192cfee860698584c030f4c9db1")) check("MixDigest", block.MixDigest(), common.HexToHash("bd4472abb6659ebe3ee06ee4d7b72a00a9f4d001caca51342001075469aff498")) check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) - check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) + check("Nonce", block.NonceU64(), uint64(0xa13a5a8c8f2bb1c4)) check("Time", block.Time(), uint64(1426516743)) check("Size", block.Size(), common.StorageSize(len(blockEnc))) diff --git a/core/types/bor_receipt.go b/core/types/bor_receipt.go new file mode 100644 index 00000000000..671fc2eb27b --- /dev/null +++ b/core/types/bor_receipt.go @@ -0,0 +1,99 @@ +package types + +import ( + "math/big" + "sort" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/crypto" +) + +// TenToTheFive - To be used while sorting bor logs +// +// Sorted using ( blockNumber * (10 ** 5) + logIndex ) +const TenToTheFive uint64 = 100000 + +var ( + // SystemAddress address for system sender + SystemAddress = common.HexToAddress("0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE") +) + +// BorReceiptKey = num (uint64 big endian) +func BorReceiptKey(number uint64) []byte { + return dbutils.EncodeBlockNumber(number) +} + +// GetDerivedBorTxHash get derived tx hash from receipt key +func GetDerivedBorTxHash(receiptKey []byte) common.Hash { + return common.BytesToHash(crypto.Keccak256(receiptKey)) +} + +// NewBorTransaction create new bor transaction for bor receipt +func NewBorTransaction() *LegacyTx { + return NewTransaction(0, common.Address{}, uint256.NewInt(0), 0, uint256.NewInt(0), make([]byte, 0)) +} + +// DeriveFieldsForBorReceipt fills the receipts with their computed fields based on consensus +// data and contextual infos like containing block and transactions. +func DeriveFieldsForBorReceipt(receipt *Receipt, hash common.Hash, number uint64, receipts Receipts) error { + // get derived tx hash + borPrefix := []byte("matic-bor-receipt-") + // hashing using prefix + number + hash + txHash := GetDerivedBorTxHash((append(borPrefix, append(BorReceiptKey(number), hash.Bytes()...)...))) + txIndex := uint(len(receipts)) + + // set tx hash and tx index + receipt.TxHash = txHash + receipt.TransactionIndex = txIndex + receipt.BlockHash = hash + receipt.BlockNumber = big.NewInt(0).SetUint64(number) + + logIndex := 0 + for i := 0; i < len(receipts); i++ { + logIndex += len(receipts[i].Logs) + } + + // The derived log fields can simply be set from the block and transaction + for j := 0; j < len(receipt.Logs); j++ { + receipt.Logs[j].BlockNumber = number + receipt.Logs[j].BlockHash = hash + receipt.Logs[j].TxHash = txHash + receipt.Logs[j].TxIndex = txIndex + receipt.Logs[j].Index = uint(logIndex) + logIndex++ + } + return nil +} + +// DeriveFieldsForBorLogs fills the receipts with their computed fields based on consensus +// data and contextual infos like containing block and transactions. +func DeriveFieldsForBorLogs(logs []*Log, hash common.Hash, number uint64, txIndex uint, logIndex uint) { + // get derived tx hash + txHash := GetDerivedBorTxHash(BorReceiptKey(number)) + + // the derived log fields can simply be set from the block and transaction + for j := 0; j < len(logs); j++ { + logs[j].BlockNumber = number + logs[j].BlockHash = hash + logs[j].TxHash = txHash + logs[j].TxIndex = txIndex + logs[j].Index = logIndex + logIndex++ + } +} + +// MergeBorLogs merges receipt logs and block receipt logs +func MergeBorLogs(logs []*Log, borLogs []*Log) []*Log { + result := append(logs, borLogs...) + + sort.SliceStable(result, func(i int, j int) bool { + if result[i].BlockNumber == result[j].BlockNumber { + return result[i].Index < result[j].Index + } + return result[i].BlockNumber < result[j].BlockNumber + }) + + return result +} diff --git a/core/types/dynamic_fee_tx.go b/core/types/dynamic_fee_tx.go index 4b040e7e867..aac5967bf8d 100644 --- a/core/types/dynamic_fee_tx.go +++ b/core/types/dynamic_fee_tx.go @@ -18,6 +18,7 @@ package types import ( "encoding/binary" + "errors" "fmt" "io" "math/big" @@ -26,12 +27,12 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" ) type DynamicFeeTransaction struct { CommonTx - ChainID *uint256.Int Tip *uint256.Int FeeCap *uint256.Int AccessList AccessList @@ -49,7 +50,7 @@ func (tx DynamicFeeTransaction) GetEffectiveGasTip(baseFee *uint256.Int) *uint25 if gasFeeCap.Lt(baseFee) { return uint256.NewInt(0) } - effectiveFee := gasFeeCap.Sub(gasFeeCap, baseFee) + effectiveFee := new(uint256.Int).Sub(gasFeeCap, baseFee) if tx.GetTip().Lt(effectiveFee) { return tx.GetTip() } else { @@ -71,15 +72,15 @@ func (tx DynamicFeeTransaction) copy() *DynamicFeeTransaction { TransactionMisc: TransactionMisc{ time: tx.time, }, - Nonce: tx.Nonce, - To: tx.To, // TODO: copy pointed-to address - Data: common.CopyBytes(tx.Data), - Gas: tx.Gas, + ChainID: new(uint256.Int), + Nonce: tx.Nonce, + To: tx.To, // TODO: copy pointed-to address + Data: common.CopyBytes(tx.Data), + Gas: tx.Gas, // These are copied below. Value: new(uint256.Int), }, AccessList: make(AccessList, len(tx.AccessList)), - ChainID: new(uint256.Int), Tip: new(uint256.Int), FeeCap: new(uint256.Int), } @@ -115,10 +116,6 @@ func (tx *DynamicFeeTransaction) Size() common.StorageSize { return common.StorageSize(c) } -func (tx DynamicFeeTransaction) Protected() bool { - return true -} - func (tx DynamicFeeTransaction) EncodingSize() int { payloadSize, _, _, _ := tx.payloadSize() envelopeSize := payloadSize @@ -378,29 +375,20 @@ func (tx *DynamicFeeTransaction) DecodeRLP(s *rlp.Stream) error { return err } var b []byte - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for ChainID: %d", len(b)) - } tx.ChainID = new(uint256.Int).SetBytes(b) if tx.Nonce, err = s.Uint(); err != nil { return err } - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for MaxPriorityFeePerGas: %d", len(b)) - } tx.Tip = new(uint256.Int).SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for MaxFeePerGas: %d", len(b)) - } tx.FeeCap = new(uint256.Int).SetBytes(b) if tx.Gas, err = s.Uint(); err != nil { return err @@ -415,12 +403,9 @@ func (tx *DynamicFeeTransaction) DecodeRLP(s *rlp.Stream) error { tx.To = &common.Address{} copy((*tx.To)[:], b) } - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for Value: %d", len(b)) - } tx.Value = new(uint256.Int).SetBytes(b) if tx.Data, err = s.Bytes(); err != nil { return err @@ -431,33 +416,23 @@ func (tx *DynamicFeeTransaction) DecodeRLP(s *rlp.Stream) error { return err } // decode V - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for V: %d", len(b)) - } tx.V.SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for R: %d", len(b)) - } tx.R.SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return err } - if len(b) > 32 { - return fmt.Errorf("wrong size for S: %d", len(b)) - } tx.S.SetBytes(b) return s.ListEnd() - } // AsMessage returns the transaction as a core.Message. -func (tx DynamicFeeTransaction) AsMessage(s Signer, baseFee *big.Int) (Message, error) { +func (tx DynamicFeeTransaction) AsMessage(s Signer, baseFee *big.Int, rules *params.Rules) (Message, error) { msg := Message{ nonce: tx.Nonce, gasLimit: tx.Gas, @@ -469,9 +444,14 @@ func (tx DynamicFeeTransaction) AsMessage(s Signer, baseFee *big.Int) (Message, accessList: tx.AccessList, checkNonce: true, } - overflow := msg.gasPrice.SetFromBig(baseFee) - if overflow { - return msg, fmt.Errorf("gasPrice higher than 2^256-1") + if !rules.IsLondon { + return msg, errors.New("eip-1559 transactions require London") + } + if baseFee != nil { + overflow := msg.gasPrice.SetFromBig(baseFee) + if overflow { + return msg, fmt.Errorf("gasPrice higher than 2^256-1") + } } msg.gasPrice.Add(&msg.gasPrice, tx.Tip) if msg.gasPrice.Gt(tx.FeeCap) { @@ -527,10 +507,6 @@ func (tx DynamicFeeTransaction) RawSignatureValues() (*uint256.Int, *uint256.Int return &tx.V, &tx.R, &tx.S } -func (tx DynamicFeeTransaction) GetChainID() *uint256.Int { - return tx.ChainID -} - func (tx *DynamicFeeTransaction) Sender(signer Signer) (common.Address, error) { if sc := tx.from.Load(); sc != nil { return sc.(common.Address), nil @@ -543,13 +519,18 @@ func (tx *DynamicFeeTransaction) Sender(signer Signer) (common.Address, error) { return addr, nil } -func (tx DynamicFeeTransaction) GetSender() (common.Address, bool) { - if sc := tx.from.Load(); sc != nil { - return sc.(common.Address), true +// NewTransaction creates an unsigned eip1559 transaction. +func NewEIP1559Transaction(chainID uint256.Int, nonce uint64, to common.Address, amount *uint256.Int, gasLimit uint64, gasPrice *uint256.Int, gasTip *uint256.Int, gasFeeCap *uint256.Int, data []byte) *DynamicFeeTransaction { + return &DynamicFeeTransaction{ + CommonTx: CommonTx{ + ChainID: &chainID, + Nonce: nonce, + To: &to, + Value: amount, + Gas: gasLimit, + Data: data, + }, + Tip: gasTip, + FeeCap: gasFeeCap, } - return common.Address{}, false -} - -func (tx *DynamicFeeTransaction) SetSender(addr common.Address) { - tx.from.Store(addr) } diff --git a/core/types/gen_header_json.go b/core/types/gen_header_json.go index d42ded8f1b4..903ff36fdcb 100644 --- a/core/types/gen_header_json.go +++ b/core/types/gen_header_json.go @@ -31,6 +31,7 @@ func (h Header) MarshalJSON() ([]byte, error) { Extra hexutil.Bytes `json:"extraData" gencodec:"required"` MixDigest common.Hash `json:"mixHash"` Nonce BlockNonce `json:"nonce"` + BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"` Hash common.Hash `json:"hash"` } var enc Header @@ -49,6 +50,7 @@ func (h Header) MarshalJSON() ([]byte, error) { enc.Extra = h.Extra enc.MixDigest = h.MixDigest enc.Nonce = h.Nonce + enc.BaseFee = (*hexutil.Big)(h.BaseFee) enc.Hash = h.Hash() return json.Marshal(&enc) } @@ -71,6 +73,7 @@ func (h *Header) UnmarshalJSON(input []byte) error { Extra *hexutil.Bytes `json:"extraData" gencodec:"required"` MixDigest *common.Hash `json:"mixHash"` Nonce *BlockNonce `json:"nonce"` + BaseFee *hexutil.Big `json:"baseFeePerGas" rlp:"optional"` } var dec Header if err := json.Unmarshal(input, &dec); err != nil { @@ -134,5 +137,9 @@ func (h *Header) UnmarshalJSON(input []byte) error { if dec.Nonce != nil { h.Nonce = *dec.Nonce } + if dec.BaseFee != nil { + h.Eip1559 = true + h.BaseFee = (*big.Int)(dec.BaseFee) + } return nil } diff --git a/core/types/hashing.go b/core/types/hashing.go index d1173e3c50f..8b08629ed7a 100644 --- a/core/types/hashing.go +++ b/core/types/hashing.go @@ -167,6 +167,15 @@ var hasherPool = sync.Pool{ }, } +func RawRlpHash(rawRlpData rlp.RawValue) (h common.Hash) { + sha := hasherPool.Get().(crypto.KeccakState) + defer hasherPool.Put(sha) + sha.Reset() + sha.Write(rawRlpData) //nolint:errcheck + sha.Read(h[:]) //nolint:errcheck + return h +} + func rlpHash(x interface{}) (h common.Hash) { sha := hasherPool.Get().(crypto.KeccakState) defer hasherPool.Put(sha) diff --git a/core/types/legacy_tx.go b/core/types/legacy_tx.go index 9cb478fe06e..01ba4d63d0d 100644 --- a/core/types/legacy_tx.go +++ b/core/types/legacy_tx.go @@ -26,11 +26,14 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" ) type CommonTx struct { TransactionMisc + + ChainID *uint256.Int Nonce uint64 // nonce of sender account Gas uint64 // gas limit To *common.Address `rlp:"nil"` // nil means contract creation @@ -39,6 +42,10 @@ type CommonTx struct { V, R, S uint256.Int // signature values } +func (ct CommonTx) GetChainID() *uint256.Int { + return ct.ChainID +} + func (ct CommonTx) GetNonce() uint64 { return ct.Nonce } @@ -59,6 +66,29 @@ func (ct CommonTx) GetData() []byte { return ct.Data } +func (ct CommonTx) GetSender() (common.Address, bool) { + if sc := ct.from.Load(); sc != nil { + return sc.(common.Address), true + } + return common.Address{}, false +} + +func (ct *CommonTx) SetSender(addr common.Address) { + ct.from.Store(addr) +} + +func (ct CommonTx) Protected() bool { + return true +} + +func (ct CommonTx) IsContractDeploy() bool { + return ct.GetTo() == nil +} + +func (ct CommonTx) IsStarkNet() bool { + return false +} + // LegacyTx is the transaction data of regular Ethereum transactions. type LegacyTx struct { CommonTx @@ -77,7 +107,7 @@ func (tx LegacyTx) GetEffectiveGasTip(baseFee *uint256.Int) *uint256.Int { if gasFeeCap.Lt(baseFee) { return uint256.NewInt(0) } - effectiveFee := gasFeeCap.Sub(gasFeeCap, baseFee) + effectiveFee := new(uint256.Int).Sub(gasFeeCap, baseFee) if tx.GetTip().Lt(effectiveFee) { return tx.GetTip() } else { @@ -369,12 +399,9 @@ func (tx *LegacyTx) DecodeRLP(s *rlp.Stream, encodingSize uint64) error { return fmt.Errorf("read Nonce: %w", err) } var b []byte - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read GasPrice: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for GasPrice: %d", len(b)) - } tx.GasPrice = new(uint256.Int).SetBytes(b) if tx.Gas, err = s.Uint(); err != nil { return fmt.Errorf("read Gas: %w", err) @@ -389,36 +416,24 @@ func (tx *LegacyTx) DecodeRLP(s *rlp.Stream, encodingSize uint64) error { tx.To = &common.Address{} copy((*tx.To)[:], b) } - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read Value: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for Value: %d", len(b)) - } tx.Value = new(uint256.Int).SetBytes(b) if tx.Data, err = s.Bytes(); err != nil { return fmt.Errorf("read Data: %w", err) } - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read V: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for V: %d", len(b)) - } tx.V.SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read R: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for R: %d", len(b)) - } tx.R.SetBytes(b) - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read S: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for S: %d", len(b)) - } tx.S.SetBytes(b) if err = s.ListEnd(); err != nil { return fmt.Errorf("close tx struct: %w", err) @@ -427,7 +442,7 @@ func (tx *LegacyTx) DecodeRLP(s *rlp.Stream, encodingSize uint64) error { } // AsMessage returns the transaction as a core.Message. -func (tx LegacyTx) AsMessage(s Signer, _ *big.Int) (Message, error) { +func (tx LegacyTx) AsMessage(s Signer, _ *big.Int, _ *params.Rules) (Message, error) { msg := Message{ nonce: tx.Nonce, gasLimit: tx.Gas, @@ -528,14 +543,3 @@ func (tx *LegacyTx) Sender(signer Signer) (common.Address, error) { tx.from.Store(addr) return addr, nil } - -func (tx LegacyTx) GetSender() (common.Address, bool) { - if sc := tx.from.Load(); sc != nil { - return sc.(common.Address), true - } - return common.Address{}, false -} - -func (tx *LegacyTx) SetSender(addr common.Address) { - tx.from.Store(addr) -} diff --git a/core/types/log.go b/core/types/log.go index 21c2f2725e4..29ea8dafc46 100644 --- a/core/types/log.go +++ b/core/types/log.go @@ -100,6 +100,30 @@ func (l *Log) DecodeRLP(s *rlp.Stream) error { return err } +// Copy creates a deep copy of the Log. +func (l *Log) Copy() *Log { + topics := make([]common.Hash, 0, len(l.Topics)) + for _, topic := range l.Topics { + topicCopy := common.BytesToHash(topic.Bytes()) + topics = append(topics, topicCopy) + } + + data := make([]byte, len(l.Data)) + copy(data, l.Data) + + return &Log{ + Address: common.BytesToAddress(l.Address.Bytes()), + Topics: topics, + Data: data, + BlockNumber: l.BlockNumber, + TxHash: common.BytesToHash(l.TxHash.Bytes()), + TxIndex: l.TxIndex, + BlockHash: common.BytesToHash(l.BlockHash.Bytes()), + Index: l.Index, + Removed: l.Removed, + } +} + // LogForStorage is a wrapper around a Log that flattens and parses the entire content of // a log including non-consensus fields. type LogForStorage Log diff --git a/core/types/receipt.go b/core/types/receipt.go index 6392dd17077..ae64be28b0c 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -38,8 +38,6 @@ var ( receiptStatusSuccessfulRLP = []byte{0x01} ) -var errEmptyTypedReceipt = errors.New("empty typed receipt bytes") - const ( // ReceiptStatusFailed is the status code of a transaction if execution failed. ReceiptStatusFailed = uint64(0) @@ -244,7 +242,7 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { return fmt.Errorf("read TxType: %w", err) } if len(b) != 1 { - return fmt.Errorf("only 1-byte tx type prefix is supported, got %d bytes: %w", len(b), errEmptyTypedReceipt) + return fmt.Errorf("%w, got %d bytes", rlp.ErrWrongTxTypePrefix, len(b)) } r.Type = b[0] switch r.Type { @@ -299,6 +297,39 @@ func (r *Receipt) Size() common.StorageSize { return size } +// Copy creates a deep copy of the Receipt. +func (r *Receipt) Copy() *Receipt { + postState := make([]byte, len(r.PostState)) + copy(postState, r.PostState) + + bloom := BytesToBloom(r.Bloom.Bytes()) + + logs := make(Logs, 0, len(r.Logs)) + for _, log := range r.Logs { + logs = append(logs, log.Copy()) + } + + txHash := common.BytesToHash(r.TxHash.Bytes()) + contractAddress := common.BytesToAddress(r.ContractAddress.Bytes()) + blockHash := common.BytesToHash(r.BlockHash.Bytes()) + blockNumber := big.NewInt(0).Set(r.BlockNumber) + + return &Receipt{ + Type: r.Type, + PostState: postState, + Status: r.Status, + CumulativeGasUsed: r.CumulativeGasUsed, + Bloom: bloom, + Logs: logs, + TxHash: txHash, + ContractAddress: contractAddress, + GasUsed: r.GasUsed, + BlockHash: blockHash, + BlockNumber: blockNumber, + TransactionIndex: r.TransactionIndex, + } +} + type ReceiptsForStorage []*ReceiptForStorage // ReceiptForStorage is a wrapper around a Receipt that flattens and parses the @@ -434,10 +465,10 @@ func (rs Receipts) EncodeIndex(i int, w *bytes.Buffer) { func (r Receipts) DeriveFields(hash common.Hash, number uint64, txs Transactions, senders []common.Address) error { logIndex := uint(0) // logIdx is unique within the block and starts from 0 if len(txs) != len(r) { - return errors.New("transaction and receipt count mismatch") + return fmt.Errorf("transaction and receipt count mismatch, tx count = %d, receipts count = %d", len(txs), len(r)) } if len(senders) != len(txs) { - return errors.New("transaction and senders count mismatch") + return fmt.Errorf("transaction and senders count mismatch, tx count = %d, senders count = %d", len(txs), len(senders)) } for i := 0; i < len(r); i++ { // The transaction type and hash can be retrieved from the transaction itself diff --git a/core/types/receipt_codecgen_gen.go b/core/types/receipt_codecgen_gen.go index 6d6542a89f3..8bff99a1ae5 100644 --- a/core/types/receipt_codecgen_gen.go +++ b/core/types/receipt_codecgen_gen.go @@ -1,3 +1,4 @@ +//go:build go1.6 // +build go1.6 // Code generated by codecgen - DO NOT EDIT. diff --git a/core/types/starknet_tx.go b/core/types/starknet_tx.go new file mode 100644 index 00000000000..d90805d7254 --- /dev/null +++ b/core/types/starknet_tx.go @@ -0,0 +1,517 @@ +package types + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + "math/bits" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" +) + +type StarknetTransaction struct { + CommonTx + + Salt []byte // cairo contract address salt + Tip *uint256.Int + FeeCap *uint256.Int + AccessList AccessList +} + +func (tx StarknetTransaction) Type() byte { + return StarknetType +} + +func (tx StarknetTransaction) GetSalt() []byte { + return tx.Salt +} + +func (tx StarknetTransaction) IsStarkNet() bool { + return true +} + +func (tx *StarknetTransaction) DecodeRLP(s *rlp.Stream) error { + _, err := s.List() + if err != nil { + return err + } + var b []byte + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.ChainID = new(uint256.Int).SetBytes(b) + if tx.Nonce, err = s.Uint(); err != nil { + return err + } + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.Tip = new(uint256.Int).SetBytes(b) + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.FeeCap = new(uint256.Int).SetBytes(b) + if tx.Gas, err = s.Uint(); err != nil { + return err + } + if b, err = s.Bytes(); err != nil { + return err + } + if len(b) > 0 && len(b) != 20 { + return fmt.Errorf("wrong size for To: %d", len(b)) + } + if len(b) > 0 { + tx.To = &common.Address{} + copy((*tx.To)[:], b) + } + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.Value = new(uint256.Int).SetBytes(b) + if tx.Data, err = s.Bytes(); err != nil { + return err + } + if tx.Salt, err = s.Bytes(); err != nil { + return err + } + // decode AccessList + tx.AccessList = AccessList{} + if err = decodeAccessList(&tx.AccessList, s); err != nil { + return err + } + // decode V + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.V.SetBytes(b) + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.R.SetBytes(b) + if b, err = s.Uint256Bytes(); err != nil { + return err + } + tx.S.SetBytes(b) + return s.ListEnd() +} + +func (tx StarknetTransaction) GetPrice() *uint256.Int { + panic("implement me") +} + +func (tx StarknetTransaction) GetTip() *uint256.Int { + return tx.Tip +} + +func (tx StarknetTransaction) GetEffectiveGasTip(baseFee *uint256.Int) *uint256.Int { + panic("implement me") +} + +func (tx StarknetTransaction) GetFeeCap() *uint256.Int { + return tx.FeeCap +} + +func (tx StarknetTransaction) Cost() *uint256.Int { + panic("implement me") +} + +func (tx StarknetTransaction) AsMessage(s Signer, baseFee *big.Int, rules *params.Rules) (Message, error) { + msg := Message{ + nonce: tx.Nonce, + gasLimit: tx.Gas, + tip: *tx.Tip, + feeCap: *tx.FeeCap, + to: tx.To, + amount: *tx.Value, + data: tx.Data, + accessList: tx.AccessList, + checkNonce: true, + } + + if !rules.IsStarknet { + return msg, errors.New("starknet tx not supported") + } + + if baseFee != nil { + overflow := msg.gasPrice.SetFromBig(baseFee) + if overflow { + return msg, fmt.Errorf("gasPrice higher than 2^256-1") + } + } + msg.gasPrice.Add(&msg.gasPrice, tx.Tip) + if msg.gasPrice.Gt(tx.FeeCap) { + msg.gasPrice.Set(tx.FeeCap) + } + + var err error + msg.from, err = tx.Sender(s) + return msg, err +} + +func (tx *StarknetTransaction) WithSignature(signer Signer, sig []byte) (Transaction, error) { + cpy := tx.copy() + r, s, v, err := signer.SignatureValues(tx, sig) + if err != nil { + return nil, err + } + cpy.R.Set(r) + cpy.S.Set(s) + cpy.V.Set(v) + cpy.ChainID = signer.ChainID() + return cpy, nil +} + +func (tx StarknetTransaction) FakeSign(address common.Address) (Transaction, error) { + panic("implement me") +} + +func (tx StarknetTransaction) Hash() common.Hash { + if hash := tx.hash.Load(); hash != nil { + return *hash.(*common.Hash) + } + hash := prefixedRlpHash(DynamicFeeTxType, []interface{}{ + tx.ChainID, + tx.Nonce, + tx.Tip, + tx.FeeCap, + tx.Gas, + tx.To, + tx.Value, + tx.Data, + tx.AccessList, + tx.V, tx.R, tx.S, + }) + tx.hash.Store(&hash) + return hash +} + +func (tx StarknetTransaction) SigningHash(chainID *big.Int) common.Hash { + return prefixedRlpHash( + StarknetType, + []interface{}{ + chainID, + tx.Nonce, + tx.Tip, + tx.FeeCap, + tx.Gas, + tx.To, + tx.Value, + tx.Data, + tx.Salt, + tx.AccessList, + }) +} + +func (tx StarknetTransaction) Size() common.StorageSize { + panic("implement me") +} + +func (tx StarknetTransaction) GetAccessList() AccessList { + panic("implement me") +} + +func (tx StarknetTransaction) RawSignatureValues() (*uint256.Int, *uint256.Int, *uint256.Int) { + return &tx.V, &tx.R, &tx.S +} + +func (tx StarknetTransaction) MarshalBinary(w io.Writer) error { + payloadSize, nonceLen, gasLen, accessListLen := tx.payloadSize() + var b [33]byte + b[0] = StarknetType + if _, err := w.Write(b[:1]); err != nil { + return err + } + if err := tx.encodePayload(w, b[:], payloadSize, nonceLen, gasLen, accessListLen); err != nil { + return err + } + return nil +} + +func (tx *StarknetTransaction) Sender(signer Signer) (common.Address, error) { + if sc := tx.from.Load(); sc != nil { + return sc.(common.Address), nil + } + addr, err := signer.Sender(tx) + if err != nil { + return common.Address{}, err + } + tx.from.Store(addr) + return addr, nil +} + +func (tx StarknetTransaction) EncodeRLP(w io.Writer) error { + payloadSize, nonceLen, gasLen, accessListLen := tx.payloadSize() + envelopeSize := payloadSize + if payloadSize >= 56 { + envelopeSize += (bits.Len(uint(payloadSize)) + 7) / 8 + } + // size of struct prefix and TxType + envelopeSize += 2 + var b [33]byte + // envelope + if err := EncodeStringSizePrefix(envelopeSize, w, b[:]); err != nil { + return err + } + // encode TxType + b[0] = StarknetType + if _, err := w.Write(b[:1]); err != nil { + return err + } + if err := tx.encodePayload(w, b[:], payloadSize, nonceLen, gasLen, accessListLen); err != nil { + return err + } + return nil +} + +func (tx StarknetTransaction) encodePayload(w io.Writer, b []byte, payloadSize, nonceLen, gasLen, accessListLen int) error { + // prefix + if err := EncodeStructSizePrefix(payloadSize, w, b); err != nil { + return err + } + // encode ChainID + if err := tx.ChainID.EncodeRLP(w); err != nil { + return err + } + // encode Nonce + if tx.Nonce > 0 && tx.Nonce < 128 { + b[0] = byte(tx.Nonce) + if _, err := w.Write(b[:1]); err != nil { + return err + } + } else { + binary.BigEndian.PutUint64(b[1:], tx.Nonce) + b[8-nonceLen] = 128 + byte(nonceLen) + if _, err := w.Write(b[8-nonceLen : 9]); err != nil { + return err + } + } + // encode MaxPriorityFeePerGas + if err := tx.Tip.EncodeRLP(w); err != nil { + return err + } + // encode MaxFeePerGas + if err := tx.FeeCap.EncodeRLP(w); err != nil { + return err + } + // encode Gas + if tx.Gas > 0 && tx.Gas < 128 { + b[0] = byte(tx.Gas) + if _, err := w.Write(b[:1]); err != nil { + return err + } + } else { + binary.BigEndian.PutUint64(b[1:], tx.Gas) + b[8-gasLen] = 128 + byte(gasLen) + if _, err := w.Write(b[8-gasLen : 9]); err != nil { + return err + } + } + // encode To + if tx.To == nil { + b[0] = 128 + } else { + b[0] = 128 + 20 + } + if _, err := w.Write(b[:1]); err != nil { + return err + } + if tx.To != nil { + if _, err := w.Write(tx.To.Bytes()); err != nil { + return err + } + } + // encode Value + if err := tx.Value.EncodeRLP(w); err != nil { + return err + } + // encode Data + if err := EncodeString(tx.Data, w, b); err != nil { + return err + } + // encode cairo contract address salt + if err := EncodeString(tx.Salt, w, b); err != nil { + return err + } + // prefix + if err := EncodeStructSizePrefix(accessListLen, w, b); err != nil { + return err + } + // encode AccessList + if err := encodeAccessList(tx.AccessList, w, b); err != nil { + return err + } + // encode V + if err := tx.V.EncodeRLP(w); err != nil { + return err + } + // encode R + if err := tx.R.EncodeRLP(w); err != nil { + return err + } + // encode S + if err := tx.S.EncodeRLP(w); err != nil { + return err + } + return nil +} + +func (tx StarknetTransaction) payloadSize() (payloadSize int, nonceLen, gasLen, accessListLen int) { + // size of ChainID + payloadSize++ + var chainIdLen int + if tx.ChainID.BitLen() >= 8 { + chainIdLen = (tx.ChainID.BitLen() + 7) / 8 + } + payloadSize += chainIdLen + // size of Nonce + payloadSize++ + if tx.Nonce >= 128 { + nonceLen = (bits.Len64(tx.Nonce) + 7) / 8 + } + payloadSize += nonceLen + // size of MaxPriorityFeePerGas + payloadSize++ + var tipLen int + if tx.Tip.BitLen() >= 8 { + tipLen = (tx.Tip.BitLen() + 7) / 8 + } + payloadSize += tipLen + // size of MaxFeePerGas + payloadSize++ + var feeCapLen int + if tx.FeeCap.BitLen() >= 8 { + feeCapLen = (tx.FeeCap.BitLen() + 7) / 8 + } + payloadSize += feeCapLen + // size of Gas + payloadSize++ + if tx.Gas >= 128 { + gasLen = (bits.Len64(tx.Gas) + 7) / 8 + } + payloadSize += gasLen + // size of To + payloadSize++ + if tx.To != nil { + payloadSize += 20 + } + // size of Value + payloadSize++ + var valueLen int + if tx.Value.BitLen() >= 8 { + valueLen = (tx.Value.BitLen() + 7) / 8 + } + payloadSize += valueLen + + // size of Data + payloadSize++ + switch len(tx.Data) { + case 0: + case 1: + if tx.Data[0] >= 128 { + payloadSize++ + } + default: + if len(tx.Data) >= 56 { + payloadSize += (bits.Len(uint(len(tx.Data))) + 7) / 8 + } + payloadSize += len(tx.Data) + } + + // size of cairo contract address salt + payloadSize++ + switch len(tx.Salt) { + case 0: + case 1: + if tx.Salt[0] >= 128 { + payloadSize++ + } + default: + if len(tx.Salt) >= 56 { + payloadSize += (bits.Len(uint(len(tx.Salt))) + 7) / 8 + } + payloadSize += len(tx.Salt) + } + + // size of AccessList + payloadSize++ + accessListLen = accessListSize(tx.AccessList) + if accessListLen >= 56 { + payloadSize += (bits.Len(uint(accessListLen)) + 7) / 8 + } + payloadSize += accessListLen + // size of V + payloadSize++ + var vLen int + if tx.V.BitLen() >= 8 { + vLen = (tx.V.BitLen() + 7) / 8 + } + payloadSize += vLen + // size of R + payloadSize++ + var rLen int + if tx.R.BitLen() >= 8 { + rLen = (tx.R.BitLen() + 7) / 8 + } + payloadSize += rLen + // size of S + payloadSize++ + var sLen int + if tx.S.BitLen() >= 8 { + sLen = (tx.S.BitLen() + 7) / 8 + } + payloadSize += sLen + return payloadSize, nonceLen, gasLen, accessListLen +} + +func (tx StarknetTransaction) copy() *StarknetTransaction { + cpy := &StarknetTransaction{ + CommonTx: CommonTx{ + TransactionMisc: TransactionMisc{ + time: tx.time, + }, + ChainID: new(uint256.Int), + Nonce: tx.Nonce, + To: tx.To, + Data: common.CopyBytes(tx.Data), + Gas: tx.Gas, + Value: new(uint256.Int), + }, + Salt: common.CopyBytes(tx.Salt), + AccessList: make(AccessList, len(tx.AccessList)), + Tip: new(uint256.Int), + FeeCap: new(uint256.Int), + } + copy(cpy.AccessList, tx.AccessList) + if tx.Value != nil { + cpy.Value.Set(tx.Value) + } + if tx.ChainID != nil { + cpy.ChainID.Set(tx.ChainID) + } + if tx.Tip != nil { + cpy.Tip.Set(tx.Tip) + } + if tx.FeeCap != nil { + cpy.FeeCap.Set(tx.FeeCap) + } + cpy.V.Set(&tx.V) + cpy.R.Set(&tx.R) + cpy.S.Set(&tx.S) + return cpy +} + +func (tx StarknetTransaction) EncodingSize() int { + payloadSize, _, _, _ := tx.payloadSize() + envelopeSize := payloadSize + // Add envelope size and type size + if payloadSize >= 56 { + envelopeSize += (bits.Len(uint(payloadSize)) + 7) / 8 + } + envelopeSize += 2 + return envelopeSize +} diff --git a/core/types/starknet_tx_test.go b/core/types/starknet_tx_test.go new file mode 100644 index 00000000000..a871c00bc8b --- /dev/null +++ b/core/types/starknet_tx_test.go @@ -0,0 +1,131 @@ +package types + +import ( + "bytes" + "encoding/hex" + "math/big" + "testing" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/sha3" +) + +var ( + chainConfig = params.AllEthashProtocolChanges + address = common.HexToAddress("b94f5374fce5edbc8e2a8697c15331677e6ebf0b") +) + +func TestStarknetTxDecodeRLP(t *testing.T) { + require := require.New(t) + + privateKey, _ := crypto.HexToECDSA(generatePrivateKey(t)) + + signature, _ := crypto.Sign(sha3.New256().Sum(nil), privateKey) + signer := MakeSigner(chainConfig, 1) + + cases := []struct { + name string + tx *StarknetTransaction + }{ + {name: "with data, without salt", tx: &StarknetTransaction{ + CommonTx: CommonTx{ + ChainID: uint256.NewInt(chainConfig.ChainID.Uint64()), + Nonce: 1, + Value: uint256.NewInt(20), + Gas: 1, + To: &address, + Data: []byte("{\"abi\": []}"), + }, + Salt: []byte("contract_salt"), + Tip: uint256.NewInt(1), + FeeCap: uint256.NewInt(1), + }}, + {name: "with data and salt", tx: &StarknetTransaction{ + CommonTx: CommonTx{ + ChainID: uint256.NewInt(chainConfig.ChainID.Uint64()), + Nonce: 1, + Value: uint256.NewInt(20), + Gas: 1, + To: &address, + Data: []byte("{\"abi\": []}"), + }, + Salt: []byte{}, + Tip: uint256.NewInt(1), + FeeCap: uint256.NewInt(1), + }}, + } + + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + tx := tt.tx + + st, err := tx.WithSignature(*signer, signature) + require.NoError(err) + + signedTx, ok := st.(*StarknetTransaction) + require.True(ok) + + buf := bytes.NewBuffer(nil) + + err = signedTx.MarshalBinary(buf) + require.NoError(err) + + encodedTx := buf.Bytes() + + txnObj, err := DecodeTransaction(rlp.NewStream(bytes.NewReader(encodedTx), uint64(len(encodedTx)))) + require.NoError(err) + + txn, ok := txnObj.(*StarknetTransaction) + require.True(ok) + + require.Equal(signedTx.GetChainID(), txn.GetChainID()) + require.Equal(signedTx.GetNonce(), txn.GetNonce()) + require.Equal(signedTx.GetTip(), txn.GetTip()) + require.Equal(signedTx.GetFeeCap(), txn.GetFeeCap()) + require.Equal(signedTx.GetGas(), txn.GetGas()) + require.Equal(signedTx.GetTo(), txn.GetTo()) + require.Equal(signedTx.GetValue(), txn.GetValue()) + require.Equal(signedTx.GetData(), txn.GetData()) + require.Equal(signedTx.GetSalt(), txn.GetSalt()) + + txV, txR, txS := signedTx.RawSignatureValues() + txnV, txnR, txnS := txn.RawSignatureValues() + + require.Equal(txV, txnV) + require.Equal(txR, txnR) + require.Equal(txS, txnS) + }) + } +} + +func generatePrivateKey(t testing.TB) string { + t.Helper() + + privateKey, err := crypto.GenerateKey() + if err != nil { + t.Error(err) + } + + return hex.EncodeToString(crypto.FromECDSA(privateKey)) +} + +func starknetTransaction(chainId *big.Int, address common.Address) *StarknetTransaction { + return &StarknetTransaction{ + CommonTx: CommonTx{ + ChainID: uint256.NewInt(chainId.Uint64()), + Nonce: 1, + Value: uint256.NewInt(20), + Gas: 1, + To: &address, + Data: []byte("{\"abi\": []}"), + }, + Salt: []byte("contract_salt"), + Tip: uint256.NewInt(1), + FeeCap: uint256.NewInt(1), + } +} diff --git a/core/types/state_data.go b/core/types/state_data.go new file mode 100644 index 00000000000..3e9471dc897 --- /dev/null +++ b/core/types/state_data.go @@ -0,0 +1,11 @@ +package types + +import "github.com/ledgerwatch/erigon/common" + +// StateSyncData represents state received from Ethereum Blockchain +type StateSyncData struct { + ID uint64 + Contract common.Address + Data string + TxHash common.Hash +} diff --git a/core/types/transaction.go b/core/types/transaction.go index db0a308de3e..1934103b24c 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -29,6 +29,7 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" ) @@ -44,6 +45,7 @@ const ( LegacyTxType = iota AccessListTxType DynamicFeeTxType + StarknetType ) // Transaction is an Ethereum transaction. @@ -60,7 +62,7 @@ type Transaction interface { GetValue() *uint256.Int Time() time.Time GetTo() *common.Address - AsMessage(s Signer, baseFee *big.Int) (Message, error) + AsMessage(s Signer, baseFee *big.Int, rules *params.Rules) (Message, error) WithSignature(signer Signer, sig []byte) (Transaction, error) FakeSign(address common.Address) (Transaction, error) Hash() common.Hash @@ -81,6 +83,8 @@ type Transaction interface { Sender(Signer) (common.Address, error) GetSender() (common.Address, bool) SetSender(common.Address) + IsContractDeploy() bool + IsStarkNet() bool } // TransactionMisc is collection of miscelaneous fields for transaction that is supposed to be embedded into concrete @@ -94,6 +98,16 @@ type TransactionMisc struct { from atomic.Value } +type RawTransactions [][]byte + +func (t RawTransactions) Len() int { + return len(t) +} + +func (t RawTransactions) EncodeIndex(i int, w *bytes.Buffer) { + w.Write(t[i]) +} + func (tm TransactionMisc) Time() time.Time { return tm.time } @@ -107,90 +121,57 @@ func DecodeTransaction(s *rlp.Stream) (Transaction, error) { if err != nil { return nil, err } - switch kind { - case rlp.List: + if rlp.List == kind { tx := &LegacyTx{} if err = tx.DecodeRLP(s, size); err != nil { return nil, err } return tx, nil - case rlp.String: + } + if rlp.String == kind { s.NewList(size) // Hack - convert String (envelope) into List - var b []byte - if b, err = s.Bytes(); err != nil { + } + var b []byte + if b, err = s.Bytes(); err != nil { + return nil, err + } + if len(b) != 1 { + return nil, fmt.Errorf("%w, got %d bytes", rlp.ErrWrongTxTypePrefix, len(b)) + } + var tx Transaction + switch b[0] { + case AccessListTxType: + t := &AccessListTx{} + if err = t.DecodeRLP(s); err != nil { return nil, err } - if len(b) != 1 { - return nil, fmt.Errorf("only 1-byte tx type prefix is supported, got %d bytes", len(b)) + tx = t + case DynamicFeeTxType: + t := &DynamicFeeTransaction{} + if err = t.DecodeRLP(s); err != nil { + return nil, err } - var tx Transaction - switch b[0] { - case AccessListTxType: - t := &AccessListTx{} - if err = t.DecodeRLP(s); err != nil { - return nil, err - } - tx = t - case DynamicFeeTxType: - t := &DynamicFeeTransaction{} - if err = t.DecodeRLP(s); err != nil { - return nil, err - } - tx = t - default: - return nil, fmt.Errorf("unknown tx type prefix: %d", b[0]) + tx = t + case StarknetType: + t := &StarknetTransaction{} + if err = t.DecodeRLP(s); err != nil { + return nil, err } + tx = t + default: + return nil, fmt.Errorf("%w, got: %d", rlp.ErrUnknownTxTypePrefix, b[0]) + } + if kind == rlp.String { if err = s.ListEnd(); err != nil { return nil, err } - return tx, nil - default: - return nil, fmt.Errorf("unexpected RLP kind: %v", kind) } + return tx, nil } func UnmarshalTransactionFromBinary(data []byte) (Transaction, error) { s := rlp.NewStream(bytes.NewReader(data), uint64(len(data))) - kind, size, err := s.Kind() - if err != nil { - return nil, err - } - switch kind { - case rlp.List: - tx := &LegacyTx{} - if err = tx.DecodeRLP(s, size); err != nil { - return nil, err - } - return tx, nil - case rlp.Byte, rlp.String: - var b []byte - if b, err = s.Bytes(); err != nil { - return nil, err - } - if len(b) != 1 { - return nil, fmt.Errorf("only 1-byte tx type prefix is supported, got %d bytes", len(b)) - } - var tx Transaction - switch b[0] { - case AccessListTxType: - t := &AccessListTx{} - if err = t.DecodeRLP(s); err != nil { - return nil, err - } - tx = t - case DynamicFeeTxType: - t := &DynamicFeeTransaction{} - if err = t.DecodeRLP(s); err != nil { - return nil, err - } - tx = t - default: - return nil, fmt.Errorf("unknown tx type prefix: %d", b[0]) - } - return tx, nil - default: - return nil, fmt.Errorf("unexpected RLP kind: %v", kind) - } + return DecodeTransaction(s) } func MarshalTransactionsBinary(txs Transactions) ([][]byte, error) { @@ -212,11 +193,12 @@ func MarshalTransactionsBinary(txs Transactions) ([][]byte, error) { return result, nil } -func UnmarshalTransactionsFromBinary(txs [][]byte) ([]Transaction, error) { +func DecodeTransactions(txs [][]byte) ([]Transaction, error) { result := make([]Transaction, len(txs)) var err error for i := range txs { - result[i], err = UnmarshalTransactionFromBinary(txs[i]) + s := rlp.NewStream(bytes.NewReader(txs[i]), uint64(len(txs[i]))) + result[i], err = DecodeTransaction(s) if err != nil { return nil, err } @@ -224,6 +206,11 @@ func UnmarshalTransactionsFromBinary(txs [][]byte) ([]Transaction, error) { return result, nil } +func TypedTransactionMarshalledAsRlpString(data []byte) bool { + // Unless it's a single byte, serialized RLP strings have their first byte in the [0x80, 0xc0) range + return len(data) > 0 && 0x80 <= data[0] && data[0] < 0xc0 +} + func sanityCheckSignature(v *uint256.Int, r *uint256.Int, s *uint256.Int, maybeProtected bool) error { if isProtectedV(v) && !maybeProtected { return ErrUnexpectedProtection diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index fe04b8d01e1..89faa1c0821 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -56,7 +56,7 @@ func MakeSigner(config *params.ChainConfig, blockNumber uint64) *Signer { signer.accesslist = true signer.chainID.Set(&chainId) signer.chainIDMul.Mul(&chainId, u256.Num2) - case config.IsEIP155(blockNumber): + case config.IsSpuriousDragon(blockNumber): signer.protected = true signer.chainID.Set(&chainId) signer.chainIDMul.Mul(&chainId, u256.Num2) @@ -98,7 +98,7 @@ func LatestSigner(config *params.ChainConfig) *Signer { if config.BerlinBlock != nil { signer.accesslist = true } - if config.EIP155Block != nil { + if config.SpuriousDragonBlock != nil { signer.protected = true } } @@ -106,7 +106,7 @@ func LatestSigner(config *params.ChainConfig) *Signer { } // LatestSignerForChainID returns the 'most permissive' Signer available. Specifically, -// this enables support for EIP-155 replay protection and all implemented EIP-2718 +// this marks support for EIP-155 replay protection, EIP-2718 typed transactions and EIP-1559 dynamic fee // transaction types if chainID is non-nil. // // Use this in transaction-handling code where the current block number and fork @@ -126,6 +126,7 @@ func LatestSignerForChainID(chainID *big.Int) *Signer { signer.chainIDMul.Mul(chainId, u256.Num2) signer.protected = true signer.accesslist = true + signer.dynamicfee = true return &signer } @@ -238,6 +239,21 @@ func (sg Signer) SenderWithContext(context *secp256k1.Context, tx Transaction) ( // id, add 27 to become equivalent to unprotected Homestead signatures. V.Add(&t.V, u256.Num27) R, S = &t.R, &t.S + case *StarknetTransaction: + if !sg.dynamicfee { + return common.Address{}, fmt.Errorf("dynamicfee tx is not supported by signer %s", sg) + } + if t.ChainID == nil { + if !sg.chainID.IsZero() { + return common.Address{}, ErrInvalidChainId + } + } else if !t.ChainID.Eq(&sg.chainID) { + return common.Address{}, ErrInvalidChainId + } + // ACL and DynamicFee txs are defined to use 0 and 1 as their recovery + // id, add 27 to become equivalent to unprotected Homestead signatures. + V.Add(&t.V, u256.Num27) + R, S = &t.R, &t.S default: return common.Address{}, ErrTxTypeNotSupported } @@ -270,6 +286,13 @@ func (sg Signer) SignatureValues(tx Transaction, sig []byte) (R, S, V *uint256.I return nil, nil, nil, ErrInvalidChainId } R, S, V = decodeSignature(sig) + case *StarknetTransaction: + // Check that chain ID of tx matches the signer. We also accept ID zero here, + // because it indicates that the chain ID was not specified in the tx. + if t.ChainID != nil && !t.ChainID.IsZero() && !t.ChainID.Eq(&sg.chainID) { + return nil, nil, nil, ErrInvalidChainId + } + R, S, V = decodeSignature(sig) default: return nil, nil, nil, ErrTxTypeNotSupported } @@ -336,6 +359,6 @@ func DeriveChainId(v *uint256.Int) *uint256.Int { } return new(uint256.Int).SetUint64((v - 35) / 2) } - v = new(uint256.Int).Sub(v, u256.Num35) - return v.Div(v, u256.Num2) + r := new(uint256.Int).Sub(v, u256.Num35) + return r.Div(r, u256.Num2) } diff --git a/core/types/transaction_signing_test.go b/core/types/transaction_signing_test.go index 8b91387217d..15fc5dd7739 100644 --- a/core/types/transaction_signing_test.go +++ b/core/types/transaction_signing_test.go @@ -28,6 +28,26 @@ import ( "github.com/ledgerwatch/erigon/rlp" ) +func TestEIP1559Signing(t *testing.T) { + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + + chainId := uint256.NewInt(18) + signer := LatestSignerForChainID(chainId.ToBig()) + tx, err := SignTx(NewEIP1559Transaction(*chainId, 0, addr, new(uint256.Int), 0, new(uint256.Int), new(uint256.Int), new(uint256.Int), nil), *signer, key) + if err != nil { + t.Fatal(err) + } + + from, err := tx.Sender(*signer) + if err != nil { + t.Fatal(err) + } + if from != addr { + t.Errorf("exected from and address to be equal. Got %x want %x", from, addr) + } +} + func TestEIP155Signing(t *testing.T) { key, _ := crypto.GenerateKey() addr := crypto.PubkeyToAddress(key.PublicKey) @@ -74,7 +94,7 @@ func TestEIP155ChainId(t *testing.T) { t.Error("didn't expect tx to be protected") } - if tx.GetChainID().Sign() != 0 { + if !tx.GetChainID().IsZero() { t.Error("expected chain id to be 0 got", tx.GetChainID()) } } diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index 06e332d69a2..4a1cda425aa 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -22,6 +22,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "math/big" "reflect" "testing" @@ -32,6 +33,7 @@ import ( "github.com/ledgerwatch/erigon/common/u256" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/rlp" + "github.com/stretchr/testify/assert" ) // The values in those tests are from the Transaction Tests @@ -76,8 +78,34 @@ var ( *LatestSignerForChainID(big.NewInt(1)), common.Hex2Bytes("c9519f4f2b30335884581971573fadf60c6204f59a911df35ee8a540456b266032f1e8e2c5dd761f9e4f88f41c8310aeaba26a8bfcdacfedfa12ec3862d3752101"), ) + + dynFeeTx = &DynamicFeeTransaction{ + CommonTx: CommonTx{ + ChainID: u256.Num1, + Nonce: 3, + To: &testAddr, + Value: uint256.NewInt(10), + Gas: 25000, + Data: common.FromHex("5544"), + }, + Tip: uint256.NewInt(1), + FeeCap: uint256.NewInt(1), + } + + signedDynFeeTx, _ = dynFeeTx.WithSignature( + *LatestSignerForChainID(big.NewInt(1)), + common.Hex2Bytes("c9519f4f2b30335884581971573fadf60c6204f59a911df35ee8a540456b266032f1e8e2c5dd761f9e4f88f41c8310aeaba26a8bfcdacfedfa12ec3862d3752101"), + ) ) +func TestDecodeEmptyInput(t *testing.T) { + input := []byte{} + _, err := DecodeTransaction(rlp.NewStream(bytes.NewReader(input), 0)) + if !errors.Is(err, io.EOF) { + t.Fatal("wrong error:", err) + } +} + func TestDecodeEmptyTypedTx(t *testing.T) { input := []byte{0x80} _, err := DecodeTransaction(rlp.NewStream(bytes.NewReader(input), 0)) @@ -104,6 +132,7 @@ func TestTransactionEncode(t *testing.T) { if !bytes.Equal(txb, should) { t.Errorf("encoded RLP mismatch, got %x", txb) } + assert.False(t, TypedTransactionMarshalledAsRlpString(txb)) } func TestEIP2718TransactionSigHash(t *testing.T) { @@ -208,6 +237,7 @@ func TestEIP2718TransactionEncode(t *testing.T) { if !bytes.Equal(have, want) { t.Errorf("encoded RLP mismatch, got %x", have) } + assert.True(t, TypedTransactionMarshalledAsRlpString(have)) } // Binary representation { @@ -220,6 +250,25 @@ func TestEIP2718TransactionEncode(t *testing.T) { if !bytes.Equal(have, want) { t.Errorf("encoded RLP mismatch, got %x", have) } + assert.False(t, TypedTransactionMarshalledAsRlpString(have)) + } +} +func TestEIP1559TransactionEncode(t *testing.T) { + { + var buf bytes.Buffer + if err := signedDynFeeTx.MarshalBinary(&buf); err != nil { + t.Fatalf("encode error: %v", err) + } + have := buf.Bytes() + want := common.FromHex("02f864010301018261a894b94f5374fce5edbc8e2a8697c15331677e6ebf0b0a825544c001a0c9519f4f2b30335884581971573fadf60c6204f59a911df35ee8a540456b2660a032f1e8e2c5dd761f9e4f88f41c8310aeaba26a8bfcdacfedfa12ec3862d37521") + if !bytes.Equal(have, want) { + t.Errorf("encoded RLP mismatch, got %x", have) + } + _, err := DecodeTransaction(rlp.NewStream(bytes.NewReader(buf.Bytes()), 0)) + if err != nil { + t.Fatalf("decode error: %v", err) + } + assert.False(t, TypedTransactionMarshalledAsRlpString(have)) } } @@ -486,11 +535,11 @@ func TestTransactionCoding(t *testing.T) { func encodeDecodeJSON(tx Transaction) (Transaction, error) { data, err := json.Marshal(tx) if err != nil { - return nil, fmt.Errorf("json encoding failed: %v", err) + return nil, fmt.Errorf("json encoding failed: %w", err) } var parsedTx Transaction if parsedTx, err = UnmarshalTransactionFromJSON(data); err != nil { - return nil, fmt.Errorf("json decoding failed: %v", err) + return nil, fmt.Errorf("json decoding failed: %w", err) } return parsedTx, nil } @@ -499,11 +548,11 @@ func encodeDecodeBinary(tx Transaction) (Transaction, error) { var buf bytes.Buffer var err error if err = tx.MarshalBinary(&buf); err != nil { - return nil, fmt.Errorf("rlp encoding failed: %v", err) + return nil, fmt.Errorf("rlp encoding failed: %w", err) } var parsedTx Transaction if parsedTx, err = UnmarshalTransactionFromBinary(buf.Bytes()); err != nil { - return nil, fmt.Errorf("rlp decoding failed: %v", err) + return nil, fmt.Errorf("rlp decoding failed: %w", err) } return parsedTx, nil } diff --git a/core/vm/absint_cfg.go b/core/vm/absint_cfg.go index a6be8b8dc81..65473813f65 100644 --- a/core/vm/absint_cfg.go +++ b/core/vm/absint_cfg.go @@ -5,11 +5,12 @@ import ( "compress/zlib" "encoding/json" "fmt" - "github.com/holiman/uint256" - "io/ioutil" + "io" "log" "strconv" "strings" + + "github.com/holiman/uint256" ) //////////////////////// @@ -349,7 +350,7 @@ func DecompressProof(in []byte) []byte { log.Fatal("cannot read") } - res, err := ioutil.ReadAll(breader) + res, err := io.ReadAll(breader) if err != nil { log.Fatal("cannot read") } diff --git a/core/vm/absint_cfg_proof_gen.go b/core/vm/absint_cfg_proof_gen.go index 3a6dd8ed608..8a2ce1c5f83 100644 --- a/core/vm/absint_cfg_proof_gen.go +++ b/core/vm/absint_cfg_proof_gen.go @@ -5,15 +5,14 @@ import ( "encoding/hex" "errors" "fmt" - "github.com/emicklei/dot" - "github.com/holiman/uint256" - "github.com/logrusorgru/aurora" - "log" "os" "sort" "strconv" "strings" "time" + + "github.com/emicklei/dot" + "github.com/holiman/uint256" ) ////////////////////////////////////////////////// @@ -527,13 +526,13 @@ func (cfg *Cfg) PrintAnlyState() { } if cfg.BadJumps[pc] { - out := fmt.Sprintf("[%5v] (w:%2v) %3v\t %-25v %-10v %v\n", aurora.Blue(cfg.D[pc].anlyCounter), aurora.Cyan(cfg.D[pc].worklistLen), aurora.Yellow(pc), aurora.Red(valueStr), aurora.Magenta(strings.Join(pc0s, ",")), cfg.D[pc].String(false)) + out := fmt.Sprintf("[%5v] (w:%2v) %3v\t %-25v %-10v %v\n", cfg.D[pc].anlyCounter, cfg.D[pc].worklistLen, pc, valueStr, strings.Join(pc0s, ","), cfg.D[pc].String(false)) fmt.Print(out) badJumpList = append(badJumpList, out) } else if cfg.PrevEdgeMap[pc] != nil { - fmt.Printf("[%5v] (w:%2v) %3v\t %-25v %-10v %v\n", aurora.Blue(cfg.D[pc].anlyCounter), aurora.Cyan(cfg.D[pc].worklistLen), aurora.Yellow(pc), aurora.Green(valueStr), aurora.Magenta(strings.Join(pc0s, ",")), cfg.D[pc].String(true)) + fmt.Printf("[%5v] (w:%2v) %3v\t %-25v %-10v %v\n", cfg.D[pc].anlyCounter, cfg.D[pc].worklistLen, pc, valueStr, strings.Join(pc0s, ","), cfg.D[pc].String(true)) } else { - fmt.Printf("[%5v] (w:%2v) %3v\t %-25v\n", aurora.Blue(cfg.D[pc].anlyCounter), aurora.Cyan(cfg.D[pc].worklistLen), aurora.Yellow(pc), valueStr) + fmt.Printf("[%5v] (w:%2v) %3v\t %-25v\n", cfg.D[pc].anlyCounter, cfg.D[pc].worklistLen, pc, valueStr) } } @@ -785,7 +784,7 @@ func (cfg *Cfg) GenerateProof() *CfgProof { pc1 := pc0 for !exits[pc1] { if len(succEdgeMap[pc1]) != 1 { - log.Fatal("Inconsistent successors") + panic("Inconsistent successors") } pc1 = succEdgeMap[pc1][0] } diff --git a/core/vm/access_list_tracer.go b/core/vm/access_list_tracer.go new file mode 100644 index 00000000000..f63d6336ed0 --- /dev/null +++ b/core/vm/access_list_tracer.go @@ -0,0 +1,191 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package vm + +import ( + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "math/big" + "time" +) + +// accessList is an accumulator for the set of accounts and storage slots an EVM +// contract execution touches. +type accessList map[common.Address]accessListSlots + +// accessListSlots is an accumulator for the set of storage slots within a single +// contract that an EVM contract execution touches. +type accessListSlots map[common.Hash]struct{} + +// newAccessList creates a new accessList. +func newAccessList() accessList { + return make(map[common.Address]accessListSlots) +} + +// addAddress adds an address to the accesslist. +func (al accessList) addAddress(address common.Address) { + // Set address if not previously present + if _, present := al[address]; !present { + al[address] = make(map[common.Hash]struct{}) + } +} + +// addSlot adds a storage slot to the accesslist. +func (al accessList) addSlot(address common.Address, slot common.Hash) { + // Set address if not previously present + al.addAddress(address) + + // Set the slot on the surely existent storage set + al[address][slot] = struct{}{} +} + +// equal checks if the content of the current access list is the same as the +// content of the other one. +func (al accessList) equal(other accessList) bool { + // Cross reference the accounts first + if len(al) != len(other) { + return false + } + for addr := range al { + if _, ok := other[addr]; !ok { + return false + } + } + for addr := range other { + if _, ok := al[addr]; !ok { + return false + } + } + // Accounts match, cross reference the storage slots too + for addr, slots := range al { + otherslots := other[addr] + + if len(slots) != len(otherslots) { + return false + } + for hash := range slots { + if _, ok := otherslots[hash]; !ok { + return false + } + } + for hash := range otherslots { + if _, ok := slots[hash]; !ok { + return false + } + } + } + return true +} + +// accesslist converts the accesslist to a types.AccessList. +func (al accessList) accessList() types.AccessList { + acl := make(types.AccessList, 0, len(al)) + for addr, slots := range al { + tuple := types.AccessTuple{Address: addr} + for slot := range slots { + tuple.StorageKeys = append(tuple.StorageKeys, slot) + } + acl = append(acl, tuple) + } + return acl +} + +var _ Tracer = (*AccessListTracer)(nil) + +// AccessListTracer is a tracer that accumulates touched accounts and storage +// slots into an internal set. +type AccessListTracer struct { + excl map[common.Address]struct{} // Set of account to exclude from the list + list accessList // Set of accounts and storage slots touched +} + +func (a *AccessListTracer) CaptureAccountWrite(account common.Address) error { + panic("implement me") +} + +// NewAccessListTracer creates a new tracer that can generate AccessLists. +// An optional AccessList can be specified to occupy slots and addresses in +// the resulting accesslist. +func NewAccessListTracer(acl types.AccessList, from, to common.Address, precompiles []common.Address) *AccessListTracer { + excl := map[common.Address]struct{}{ + from: {}, to: {}, + } + for _, addr := range precompiles { + excl[addr] = struct{}{} + } + list := newAccessList() + for _, al := range acl { + if _, ok := excl[al.Address]; !ok { + list.addAddress(al.Address) + } + for _, slot := range al.StorageKeys { + list.addSlot(al.Address, slot) + } + } + return &AccessListTracer{ + excl: excl, + list: list, + } +} + +// CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist. +func (a *AccessListTracer) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + if (op == SLOAD || op == SSTORE) && stack.Len() >= 1 { + slot := common.Hash(stack.Data[stack.Len()-1].Bytes32()) + a.list.addSlot(scope.Contract.Address(), slot) + } + if (op == EXTCODECOPY || op == EXTCODEHASH || op == EXTCODESIZE || op == BALANCE || op == SELFDESTRUCT) && stack.Len() >= 1 { + addr := common.Address(stack.Data[stack.Len()-1].Bytes20()) + if _, ok := a.excl[addr]; !ok { + a.list.addAddress(addr) + } + } + if (op == DELEGATECALL || op == CALL || op == STATICCALL || op == CALLCODE) && stack.Len() >= 5 { + addr := common.Address(stack.Data[stack.Len()-2].Bytes20()) + if _, ok := a.excl[addr]; !ok { + a.list.addAddress(addr) + } + } +} + +func (*AccessListTracer) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { +} + +func (*AccessListTracer) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { +} + +func (a *AccessListTracer) CaptureStart(env *EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, callType CallType, input []byte, gas uint64, value *big.Int, code []byte) { + panic("implement me") +} + +func (a *AccessListTracer) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { +} + +func (a *AccessListTracer) CaptureAccountRead(account common.Address) error { + return nil +} + +// AccessList returns the current accesslist maintained by the tracer. +func (a *AccessListTracer) AccessList() types.AccessList { + return a.list.accessList() +} + +// Equal returns if the content of two access list traces are equal. +func (a *AccessListTracer) Equal(other *AccessListTracer) bool { + return a.list.equal(other.list) +} diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 4d09ce9df93..404ead71338 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -80,6 +80,21 @@ var PrecompiledContractsIstanbul = map[common.Address]PrecompiledContract{ common.BytesToAddress([]byte{9}): &blake2F{}, } +var PrecompiledContractsIstanbulForBSC = map[common.Address]PrecompiledContract{ + common.BytesToAddress([]byte{1}): &ecrecover{}, + common.BytesToAddress([]byte{2}): &sha256hash{}, + common.BytesToAddress([]byte{3}): &ripemd160hash{}, + common.BytesToAddress([]byte{4}): &dataCopy{}, + common.BytesToAddress([]byte{5}): &bigModExp{}, + common.BytesToAddress([]byte{6}): &bn256AddIstanbul{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, + common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, + common.BytesToAddress([]byte{9}): &blake2F{}, + + common.BytesToAddress([]byte{100}): &tmHeaderValidate{}, + common.BytesToAddress([]byte{101}): &iavlMerkleProofValidate{}, +} + // PrecompiledContractsBerlin contains the default set of pre-compiled Ethereum // contracts used in the Berlin release. var PrecompiledContractsBerlin = map[common.Address]PrecompiledContract{ @@ -109,10 +124,11 @@ var PrecompiledContractsBLS = map[common.Address]PrecompiledContract{ } var ( - PrecompiledAddressesBerlin []common.Address - PrecompiledAddressesIstanbul []common.Address - PrecompiledAddressesByzantium []common.Address - PrecompiledAddressesHomestead []common.Address + PrecompiledAddressesBerlin []common.Address + PrecompiledAddressesIstanbul []common.Address + PrecompiledAddressesIstanbulForBSC []common.Address + PrecompiledAddressesByzantium []common.Address + PrecompiledAddressesHomestead []common.Address ) func init() { @@ -120,22 +136,28 @@ func init() { PrecompiledAddressesHomestead = append(PrecompiledAddressesHomestead, k) } for k := range PrecompiledContractsByzantium { - PrecompiledAddressesHomestead = append(PrecompiledAddressesByzantium, k) + PrecompiledAddressesByzantium = append(PrecompiledAddressesByzantium, k) } for k := range PrecompiledContractsIstanbul { PrecompiledAddressesIstanbul = append(PrecompiledAddressesIstanbul, k) } + for k := range PrecompiledContractsIstanbulForBSC { + PrecompiledAddressesIstanbulForBSC = append(PrecompiledAddressesIstanbulForBSC, k) + } for k := range PrecompiledContractsBerlin { PrecompiledAddressesBerlin = append(PrecompiledAddressesBerlin, k) } } // ActivePrecompiles returns the precompiles enabled with the current configuration. -func ActivePrecompiles(rules params.Rules) []common.Address { +func ActivePrecompiles(rules *params.Rules) []common.Address { switch { case rules.IsBerlin: return PrecompiledAddressesBerlin case rules.IsIstanbul: + if rules.IsParlia { + return PrecompiledAddressesIstanbulForBSC + } return PrecompiledAddressesIstanbul case rules.IsByzantium: return PrecompiledAddressesByzantium @@ -384,7 +406,7 @@ func (c *bigModExp) Run(input []byte) ([]byte, error) { exp = new(big.Int).SetBytes(getData(input, baseLen, expLen)) mod = new(big.Int).SetBytes(getData(input, baseLen+expLen, modLen)) ) - if mod.BitLen() == 0 { + if mod.Sign() == 0 { // Modulo 0 is undefined, return zero return common.LeftPadBytes([]byte{}, int(modLen)), nil } diff --git a/core/vm/contracts_lightclient.go b/core/vm/contracts_lightclient.go new file mode 100644 index 00000000000..409f116112e --- /dev/null +++ b/core/vm/contracts_lightclient.go @@ -0,0 +1,135 @@ +package vm + +import ( + "encoding/binary" + "fmt" + + "github.com/ledgerwatch/erigon/core/vm/lightclient" + "github.com/ledgerwatch/erigon/params" +) + +const ( + uint64TypeLength uint64 = 8 + precompileContractInputMetaDataLength uint64 = 32 + consensusStateLengthBytesLength uint64 = 32 + + tmHeaderValidateResultMetaDataLength uint64 = 32 + merkleProofValidateResultLength uint64 = 32 +) + +// input: +// consensus state length | consensus state | tendermint header | +// 32 bytes | | | +func decodeTendermintHeaderValidationInput(input []byte) (*lightclient.ConsensusState, *lightclient.Header, error) { + csLen := binary.BigEndian.Uint64(input[consensusStateLengthBytesLength-uint64TypeLength : consensusStateLengthBytesLength]) + if uint64(len(input)) <= consensusStateLengthBytesLength+csLen { + return nil, nil, fmt.Errorf("expected payload size %d, actual size: %d", consensusStateLengthBytesLength+csLen, len(input)) + } + + cs, err := lightclient.DecodeConsensusState(input[consensusStateLengthBytesLength : consensusStateLengthBytesLength+csLen]) + if err != nil { + return nil, nil, err + } + header, err := lightclient.DecodeHeader(input[consensusStateLengthBytesLength+csLen:]) + if err != nil { + return nil, nil, err + } + + return &cs, header, nil +} + +// tmHeaderValidate implemented as a native contract. +type tmHeaderValidate struct{} + +func (c *tmHeaderValidate) RequiredGas(input []byte) uint64 { + return params.TendermintHeaderValidateGas +} + +func (c *tmHeaderValidate) Run(input []byte) (result []byte, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("internal error: %v\n", r) + } + }() + + if uint64(len(input)) <= precompileContractInputMetaDataLength { + return nil, fmt.Errorf("invalid input") + } + + payloadLength := binary.BigEndian.Uint64(input[precompileContractInputMetaDataLength-uint64TypeLength : precompileContractInputMetaDataLength]) + if uint64(len(input)) != payloadLength+precompileContractInputMetaDataLength { + return nil, fmt.Errorf("invalid input: input size should be %d, actual the size is %d", payloadLength+precompileContractInputMetaDataLength, len(input)) + } + + cs, header, err := decodeTendermintHeaderValidationInput(input[precompileContractInputMetaDataLength:]) + if err != nil { + return nil, err + } + + validatorSetChanged, err := cs.ApplyHeader(header) + if err != nil { + return nil, err + } + + consensusStateBytes, err := cs.EncodeConsensusState() + if err != nil { + return nil, err + } + + // result + // | validatorSetChanged | empty | consensusStateBytesLength | new consensusState | + // | 1 byte | 23 bytes | 8 bytes | | + lengthBytes := make([]byte, tmHeaderValidateResultMetaDataLength) + if validatorSetChanged { + copy(lengthBytes[:1], []byte{0x01}) + } + consensusStateBytesLength := uint64(len(consensusStateBytes)) + binary.BigEndian.PutUint64(lengthBytes[tmHeaderValidateResultMetaDataLength-uint64TypeLength:], consensusStateBytesLength) + + result = append(lengthBytes, consensusStateBytes...) + + return result, nil +} + +//------------------------------------------------------------------------------------------------------------------------------------------------ + +// tmHeaderValidate implemented as a native contract. +type iavlMerkleProofValidate struct{} + +func (c *iavlMerkleProofValidate) RequiredGas(input []byte) uint64 { + return params.IAVLMerkleProofValidateGas +} + +// input: +// | payload length | payload | +// | 32 bytes | | +func (c *iavlMerkleProofValidate) Run(input []byte) (result []byte, err error) { + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("internal error: %v\n", r) + } + }() + + if uint64(len(input)) <= precompileContractInputMetaDataLength { + return nil, fmt.Errorf("invalid input: input should include %d bytes payload length and payload", precompileContractInputMetaDataLength) + } + + payloadLength := binary.BigEndian.Uint64(input[precompileContractInputMetaDataLength-uint64TypeLength : precompileContractInputMetaDataLength]) + if uint64(len(input)) != payloadLength+precompileContractInputMetaDataLength { + return nil, fmt.Errorf("invalid input: input size should be %d, actual the size is %d", payloadLength+precompileContractInputMetaDataLength, len(input)) + } + + kvmp, err := lightclient.DecodeKeyValueMerkleProof(input[precompileContractInputMetaDataLength:]) + if err != nil { + return nil, err + } + + valid := kvmp.Validate() + if !valid { + return nil, fmt.Errorf("invalid merkle proof") + } + + result = make([]byte, merkleProofValidateResultLength) + binary.BigEndian.PutUint64(result[merkleProofValidateResultLength-uint64TypeLength:], 0x01) + return result, nil +} diff --git a/core/vm/contracts_lightclient_test.go b/core/vm/contracts_lightclient_test.go new file mode 100644 index 00000000000..97a7c4a48b7 --- /dev/null +++ b/core/vm/contracts_lightclient_test.go @@ -0,0 +1,106 @@ +package vm + +import ( + "encoding/binary" + "encoding/hex" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ledgerwatch/erigon/core/vm/lightclient" +) + +const ( + testHeight uint64 = 66848226 +) + +func TestTmHeaderValidateAndMerkleProofValidate(t *testing.T) { + consensusStateBytes, err := hex.DecodeString("42696e616e63652d436861696e2d4e696c650000000000000000000000000000000000000" + + "3fc05e2b7029751d2a6581efc2f79712ec44d8b4981850325a7feadaa58ef4ddaa18a9380d9ab0fc10d18ca0e0832d5f4c063c5489ec1443dfb738" + + "252d038a82131b27ae17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f000000174876e800184e7b103d34c41003f9b" + + "864d5f8c1adda9bd0436b253bb3c844bc739c1e77c9000000174876e8004d420aea843e92a0cfe69d89696dff6827769f9cb52a249af537ce89bf2" + + "a4b74000000174876e800bd03de9f8ab29e2800094e153fac6f696cfa512536c9c2f804dcb2c2c4e4aed6000000174876e8008f4a74a07351895dd" + + "f373057b98fae6dfaf2cd21f37a063e19601078fe470d53000000174876e8004a5d4753eb79f92e80efe22df7aca4f666a4f44bf81c536c4a09d4b" + + "9c5b654b5000000174876e800c80e9abef7ff439c10c68fe8f1303deddfc527718c3b37d8ba6807446e3c827a000000174876e8009142afcc691b7" + + "cc05d26c7b0be0c8b46418294171730e079f384fde2fa50bafc000000174876e80049b288e4ebbb3a281c2d546fc30253d5baf08993b6e5d295fb7" + + "87a5b314a298e000000174876e80004224339688f012e649de48e241880092eaa8f6aa0f4f14bfcf9e0c76917c0b6000000174876e8004034b37ce" + + "da8a0bf13b1abaeee7a8f9383542099a554d219b93d0ce69e3970e8000000174876e800") + require.NoError(t, err) + + cs, err := lightclient.DecodeConsensusState(consensusStateBytes) + require.NoError(t, err) + + headerBytes, err := hex.DecodeString("e3210a92130abb020a02080a121242696e616e63652d436861696e2d4e696c6518e38bf01f220c08e191aef20510f5f4e4c70230dae0c7173a480a20102b54820dd8fb5bc2c4e875ee573fa294d9b7b7ceb362aa8fd21b33dee41b1c12240801122082f341511f3e6b89d6177fd31f8a106013ba09d6e12ef40a7dec885d81b687634220b1b77e6977e0cd0177e3102a78833c9e152aa646ed4fb5a77e8af58c9867eec0522080d9ab0fc10d18ca0e0832d5f4c063c5489ec1443dfb738252d038a82131b27a5a2080d9ab0fc10d18ca0e0832d5f4c063c5489ec1443dfb738252d038a82131b27a6220294d8fbd0b94b767a7eba9840f299a3586da7fe6b5dead3b7eecba193c400f936a20a3e248bc209955054d880e4d89ff3c0419c0cd77681f4b4c6649ead5545054b982011462633d9db7ed78e951f79913fdc8231aa77ec12b12d1100a480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be212b601080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510cebfe23e321406fd60078eb4c2356137dd50036597db267cf61642409276f20ad4b152f91c344bd63ac691bad66e04e228a8b58dca293ff0bd10f8aef6dfbcecae49e32b09d89e10b771a6c01628628596a95e126b04763560c66c0f12b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510a4caa532321418e69cc672973992bb5f76d049a5b2c5ddf77436380142409ed2b74fa835296d552e68c439dd4ee3fa94fb197282edcc1cc815c863ca42a2c9a73475ff6be9064371a61655a3c31d2f0acc89c3a4489ad4c2671aef52360512b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510a69eca2f3214344c39bb8f4512d6cab1f6aafac1811ef9d8afdf38024240de2768ead90011bcbb1914abc1572749ab7b81382eb81cff3b41c56edc12470a7b8a4d61f8b4ca7b2cb7e24706edd219455796b4db74cd36965859f91dc8910312b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510dcdd833b321437ef19af29679b368d2b9e9de3f8769b357866763803424072ddfe0aeb13616b3f17eb60b19a923ec51fcc726625094aa069255c829c8cdd9e242080a1e559b0030fe9a0db19fd34e392bd78df12a9caff9f2b811bc1ac0a12b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510e9f2f859321462633d9db7ed78e951f79913fdc8231aa77ec12b38044240f5f61c640ab2402b44936de0d24e7b439df78bc3ef15467ecb29b92ece4aa0550790d5ce80761f2ac4b0e3283969725c42343749d9b44b179b2d4fced66c5d0412b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510ff90f55532147b343e041ca130000a8bc00c35152bd7e774003738054240df6e298b3efd42eb536e68a0210bc921e8b5dc145fe965f63f4d3490064f239f2a54a6db16c96086e4ae52280c04ad8b32b44f5ff3d41f0c364949ccb628c50312b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510cad7c931321491844d296bd8e591448efc65fd6ad51a888d58fa3806424030298627da1afd28229aac150f553724b594989e59136d6a175d84e45a4dee344ff9e0eeb69fdf29abb6d833adc3e1ccdc87b2a65019ef5fb627c44d9d132c0012b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510c8c296323214b3727172ce6473bc780298a2d66c12f1a14f5b2a38074240918491100730b4523f0c85409f6d1cca9ebc4b8ca6df8d55fe3d85158fa43286608693c50332953e1d3b93e3e78b24e158d6a2275ce8c6c7c07a7a646a19200312b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef2051086f1a2403214b6f20c7faa2b2f6f24518fa02b71cb5f4a09fba338084240ca59c9fc7f6ab660e9970fc03e5ed588ccb8be43fe5a3e8450287b726f29d039e53fe888438f178ac63c3d2ca969cd8c2fbc8606f067634339b6a94a7382960212b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef2051080efbb543214e0dd72609cc106210d1aa13936cb67b93a0aee2138094240e787a21f5cb7052624160759a9d379dd9db144f2b498bca026375c9ce8ecdc2a0936af1c309b3a0f686c92bf5578b595a4ca99036a19c9fc50d3718fd454b30012b801080210e38bf01f22480a207eaabf7df1081377e06e08efe7ad17974049380bdd65a9b053c099ef80ff6e6f122408011220d153cc308d9cb96ca43ffeceaae1ee85794c83d17408ff76cfee92f5e91d0be22a0b08e291aef20510ddf8d85a3214fc3108dc3814888f4187452182bc1baf83b71bc9380a4240d51ea31f6449eed71de22339722af1edbb0b21401037d85882b32a2ed8ae9127f2df4d1da2092729e582812856227ed6cdf98a3f60203d1ff80bd635fb03bb0912a4070a4f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff010a4b0a1418e69cc672973992bb5f76d049a5b2c5ddf7743612251624de6420184e7b103d34c41003f9b864d5f8c1adda9bd0436b253bb3c844bc739c1e77c91880d0dbc3f4022080d0dbc3f4020a4b0a14344c39bb8f4512d6cab1f6aafac1811ef9d8afdf12251624de64204d420aea843e92a0cfe69d89696dff6827769f9cb52a249af537ce89bf2a4b741880d0dbc3f4022080d0dbc3f4020a4b0a1437ef19af29679b368d2b9e9de3f8769b3578667612251624de6420bd03de9f8ab29e2800094e153fac6f696cfa512536c9c2f804dcb2c2c4e4aed61880d0dbc3f4022080d0dbc3f4020a4b0a1462633d9db7ed78e951f79913fdc8231aa77ec12b12251624de64208f4a74a07351895ddf373057b98fae6dfaf2cd21f37a063e19601078fe470d531880d0dbc3f4022080d0dbc3f4020a4b0a147b343e041ca130000a8bc00c35152bd7e774003712251624de64204a5d4753eb79f92e80efe22df7aca4f666a4f44bf81c536c4a09d4b9c5b654b51880d0dbc3f4022080d0dbc3f4020a4b0a1491844d296bd8e591448efc65fd6ad51a888d58fa12251624de6420c80e9abef7ff439c10c68fe8f1303deddfc527718c3b37d8ba6807446e3c827a1880d0dbc3f4022080d0dbc3f4020a4b0a14b3727172ce6473bc780298a2d66c12f1a14f5b2a12251624de64209142afcc691b7cc05d26c7b0be0c8b46418294171730e079f384fde2fa50bafc1880d0dbc3f4022080d0dbc3f4020a4b0a14b6f20c7faa2b2f6f24518fa02b71cb5f4a09fba312251624de642049b288e4ebbb3a281c2d546fc30253d5baf08993b6e5d295fb787a5b314a298e1880d0dbc3f4022080d0dbc3f4020a4b0a14e0dd72609cc106210d1aa13936cb67b93a0aee2112251624de642004224339688f012e649de48e241880092eaa8f6aa0f4f14bfcf9e0c76917c0b61880d0dbc3f4022080d0dbc3f4020a4b0a14fc3108dc3814888f4187452182bc1baf83b71bc912251624de64204034b37ceda8a0bf13b1abaeee7a8f9383542099a554d219b93d0ce69e3970e81880d0dbc3f4022080d0dbc3f402124f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff011aa4070a4f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff010a4b0a1418e69cc672973992bb5f76d049a5b2c5ddf7743612251624de6420184e7b103d34c41003f9b864d5f8c1adda9bd0436b253bb3c844bc739c1e77c91880d0dbc3f4022080d0dbc3f4020a4b0a14344c39bb8f4512d6cab1f6aafac1811ef9d8afdf12251624de64204d420aea843e92a0cfe69d89696dff6827769f9cb52a249af537ce89bf2a4b741880d0dbc3f4022080d0dbc3f4020a4b0a1437ef19af29679b368d2b9e9de3f8769b3578667612251624de6420bd03de9f8ab29e2800094e153fac6f696cfa512536c9c2f804dcb2c2c4e4aed61880d0dbc3f4022080d0dbc3f4020a4b0a1462633d9db7ed78e951f79913fdc8231aa77ec12b12251624de64208f4a74a07351895ddf373057b98fae6dfaf2cd21f37a063e19601078fe470d531880d0dbc3f4022080d0dbc3f4020a4b0a147b343e041ca130000a8bc00c35152bd7e774003712251624de64204a5d4753eb79f92e80efe22df7aca4f666a4f44bf81c536c4a09d4b9c5b654b51880d0dbc3f4022080d0dbc3f4020a4b0a1491844d296bd8e591448efc65fd6ad51a888d58fa12251624de6420c80e9abef7ff439c10c68fe8f1303deddfc527718c3b37d8ba6807446e3c827a1880d0dbc3f4022080d0dbc3f4020a4b0a14b3727172ce6473bc780298a2d66c12f1a14f5b2a12251624de64209142afcc691b7cc05d26c7b0be0c8b46418294171730e079f384fde2fa50bafc1880d0dbc3f4022080d0dbc3f4020a4b0a14b6f20c7faa2b2f6f24518fa02b71cb5f4a09fba312251624de642049b288e4ebbb3a281c2d546fc30253d5baf08993b6e5d295fb787a5b314a298e1880d0dbc3f4022080d0dbc3f4020a4b0a14e0dd72609cc106210d1aa13936cb67b93a0aee2112251624de642004224339688f012e649de48e241880092eaa8f6aa0f4f14bfcf9e0c76917c0b61880d0dbc3f4022080d0dbc3f4020a4b0a14fc3108dc3814888f4187452182bc1baf83b71bc912251624de64204034b37ceda8a0bf13b1abaeee7a8f9383542099a554d219b93d0ce69e3970e81880d0dbc3f4022080d0dbc3f402124f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff01") + require.NoError(t, err) + + parameterInput := make([]byte, 32+len(consensusStateBytes)+len(headerBytes)) + binary.BigEndian.PutUint64(parameterInput[24:32], uint64(len(consensusStateBytes))) + copy(parameterInput[32:32+len(consensusStateBytes)], consensusStateBytes) + copy(parameterInput[32+len(consensusStateBytes):], headerBytes) + + totalLengthPrefix := make([]byte, 32) + binary.BigEndian.PutUint64(totalLengthPrefix[0:8], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[8:16], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[16:24], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[24:], uint64(len(parameterInput))) + input := append(totalLengthPrefix, parameterInput...) + + var tmHeaderValidateContract tmHeaderValidate + syncedConsensusStateBytes, err := tmHeaderValidateContract.Run(input) + require.NoError(t, err) + syncedConsensusState, err := lightclient.DecodeConsensusState(syncedConsensusStateBytes[32:]) + require.NoError(t, err) + require.Equal(t, testHeight+1, syncedConsensusState.Height) + require.Equal(t, cs.ChainID, syncedConsensusState.ChainID) + + headerBytes, err = hex.DecodeString("c11d0af00e0aba020a02080a121242696e616e63652d436861696e2d4e696c65188596a822220b08bd85c2f30510e8f3d65730a986f7173a480a209e4b742cb3d59618c5af9d9b9d8b6a8408802131a968c6d1e3a516c9548cedc01224080112201dd8f3e89b01db52d79f89a87c8abfe9836e8b828ed33d78e202664dfead9c0e422018c8c46d7665a5db717331ff3deebe8f9986352d308c5950cf1a09286439dd9d522080d9ab0fc10d18ca0e0832d5f4c063c5489ec1443dfb738252d038a82131b27a5a2080d9ab0fc10d18ca0e0832d5f4c063c5489ec1443dfb738252d038a82131b27a6220294d8fbd0b94b767a7eba9840f299a3586da7fe6b5dead3b7eecba193c400f936a202c69c314b4de5c8035253c8bc0771d9ca17b1b23a57c0c6d068b57579791cae2820114b3727172ce6473bc780298a2d66c12f1a14f5b2a12b00c0a480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b120012b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f30510cff5c5a102321418e69cc672973992bb5f76d049a5b2c5ddf7743638014240129b1ac9bcf178022f358161f90a0c83d8344be7ad7e1f55c98b4a7f366a95816e80a7e2beac669c73fa5bd6e17693f8a70347ab785c7883a8ef2c9d7464b50a12b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f30510e3f7919d023214344c39bb8f4512d6cab1f6aafac1811ef9d8afdf38024240ad6d56ffd8062b70f6c2bf7345a26fcb0a5de2bc477d21e71d780c7f029098aba7efaa2aae1b945602c22d0d1ccdec1e45e7d14d177677a2ba23feeffa88c103120012b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f305109c88b58202321462633d9db7ed78e951f79913fdc8231aa77ec12b3804424017c205e1eade76097e659a2c3a20bd7fc61e383b5b631499a8bf26ac81c537d7369ddc5be0c4f8a62c6cfb55d5d6cd4ce75aa57c03888aef365d0702032e6d0c12b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f30510bcbda5ff0132147b343e041ca130000a8bc00c35152bd7e7740037380542404c8536a8a2af12e88176699c93ee6c9032240b58b6f92897a7724bd41447f81ae8533e2e3676a44d398296006c1d51d14c9eb2ebca5ac02a5925c549de571b0012b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f30510968bff9c02321491844d296bd8e591448efc65fd6ad51a888d58fa38064240f1b55166334e16b2cf1e6bf35521a17b6fc8699807df66495c14508ed5c75b27bf0ba19f7ad4302166d673f027a37148f6ecf4b87fe60b6f196bfc944df3c90412b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f30510899ab59f023214b3727172ce6473bc780298a2d66c12f1a14f5b2a38074240b90deb286343c378597d36c381b11f720b9994cc4aefb28ebe840240bd68b4e8855b8508f072133e36a92f4160e5172dd4e086cde6799dc957e3d971784a130e120012b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f30510e7c1dffe013214e0dd72609cc106210d1aa13936cb67b93a0aee213809424085424cd5908cc12b9ce35b4891f20af1791f5a7a8f7dfef225a790890a1639badef168a57005ad64d167faf86c97c4bdfeba1d5307182abeb4ef768b4056c00d12b9010802108596a82222480a20c24c5e913fe4b8eec95d473d671c2dfc2cf651118b37e83661a24a1b8ef842251224080112206310a09cbcf41fd71c55e524c7a91f71414bb31ecf6e7b74161e8ec04a3c7b2b2a0c08bd85c2f305108bd8c5ff013214fc3108dc3814888f4187452182bc1baf83b71bc9380a424013382f84fa5d21f6a274159300b5fb20e21705c80b45beff6ca48d84ffa7ab700275e8017bcf69ac70f0c76bd497977c7373e3a9cfdfc09355cf5427272e4d0512a4070a4f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff010a4b0a1418e69cc672973992bb5f76d049a5b2c5ddf7743612251624de6420184e7b103d34c41003f9b864d5f8c1adda9bd0436b253bb3c844bc739c1e77c91880d0dbc3f4022080d0dbc3f4020a4b0a14344c39bb8f4512d6cab1f6aafac1811ef9d8afdf12251624de64204d420aea843e92a0cfe69d89696dff6827769f9cb52a249af537ce89bf2a4b741880d0dbc3f4022080d0dbc3f4020a4b0a1437ef19af29679b368d2b9e9de3f8769b3578667612251624de6420bd03de9f8ab29e2800094e153fac6f696cfa512536c9c2f804dcb2c2c4e4aed61880d0dbc3f4022080d0dbc3f4020a4b0a1462633d9db7ed78e951f79913fdc8231aa77ec12b12251624de64208f4a74a07351895ddf373057b98fae6dfaf2cd21f37a063e19601078fe470d531880d0dbc3f4022080d0dbc3f4020a4b0a147b343e041ca130000a8bc00c35152bd7e774003712251624de64204a5d4753eb79f92e80efe22df7aca4f666a4f44bf81c536c4a09d4b9c5b654b51880d0dbc3f4022080d0dbc3f4020a4b0a1491844d296bd8e591448efc65fd6ad51a888d58fa12251624de6420c80e9abef7ff439c10c68fe8f1303deddfc527718c3b37d8ba6807446e3c827a1880d0dbc3f4022080d0dbc3f4020a4b0a14b3727172ce6473bc780298a2d66c12f1a14f5b2a12251624de64209142afcc691b7cc05d26c7b0be0c8b46418294171730e079f384fde2fa50bafc1880d0dbc3f4022080d0dbc3f4020a4b0a14b6f20c7faa2b2f6f24518fa02b71cb5f4a09fba312251624de642049b288e4ebbb3a281c2d546fc30253d5baf08993b6e5d295fb787a5b314a298e1880d0dbc3f4022080d0dbc3f4020a4b0a14e0dd72609cc106210d1aa13936cb67b93a0aee2112251624de642004224339688f012e649de48e241880092eaa8f6aa0f4f14bfcf9e0c76917c0b61880d0dbc3f4022080d0dbc3f4020a4b0a14fc3108dc3814888f4187452182bc1baf83b71bc912251624de64204034b37ceda8a0bf13b1abaeee7a8f9383542099a554d219b93d0ce69e3970e81880d0dbc3f4022080d0dbc3f402124f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff011aa4070a4f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff010a4b0a1418e69cc672973992bb5f76d049a5b2c5ddf7743612251624de6420184e7b103d34c41003f9b864d5f8c1adda9bd0436b253bb3c844bc739c1e77c91880d0dbc3f4022080d0dbc3f4020a4b0a14344c39bb8f4512d6cab1f6aafac1811ef9d8afdf12251624de64204d420aea843e92a0cfe69d89696dff6827769f9cb52a249af537ce89bf2a4b741880d0dbc3f4022080d0dbc3f4020a4b0a1437ef19af29679b368d2b9e9de3f8769b3578667612251624de6420bd03de9f8ab29e2800094e153fac6f696cfa512536c9c2f804dcb2c2c4e4aed61880d0dbc3f4022080d0dbc3f4020a4b0a1462633d9db7ed78e951f79913fdc8231aa77ec12b12251624de64208f4a74a07351895ddf373057b98fae6dfaf2cd21f37a063e19601078fe470d531880d0dbc3f4022080d0dbc3f4020a4b0a147b343e041ca130000a8bc00c35152bd7e774003712251624de64204a5d4753eb79f92e80efe22df7aca4f666a4f44bf81c536c4a09d4b9c5b654b51880d0dbc3f4022080d0dbc3f4020a4b0a1491844d296bd8e591448efc65fd6ad51a888d58fa12251624de6420c80e9abef7ff439c10c68fe8f1303deddfc527718c3b37d8ba6807446e3c827a1880d0dbc3f4022080d0dbc3f4020a4b0a14b3727172ce6473bc780298a2d66c12f1a14f5b2a12251624de64209142afcc691b7cc05d26c7b0be0c8b46418294171730e079f384fde2fa50bafc1880d0dbc3f4022080d0dbc3f4020a4b0a14b6f20c7faa2b2f6f24518fa02b71cb5f4a09fba312251624de642049b288e4ebbb3a281c2d546fc30253d5baf08993b6e5d295fb787a5b314a298e1880d0dbc3f4022080d0dbc3f4020a4b0a14e0dd72609cc106210d1aa13936cb67b93a0aee2112251624de642004224339688f012e649de48e241880092eaa8f6aa0f4f14bfcf9e0c76917c0b61880d0dbc3f4022080d0dbc3f4020a4b0a14fc3108dc3814888f4187452182bc1baf83b71bc912251624de64204034b37ceda8a0bf13b1abaeee7a8f9383542099a554d219b93d0ce69e3970e81880d0dbc3f4022080d0dbc3f402124f0a1406fd60078eb4c2356137dd50036597db267cf61612251624de6420e17cbe9c20cdcfdf876b3b12978d3264a007fcaaa71c4cdb701d9ebc0323f44f1880d0dbc3f4022080e0ebdaf2e2ffffff01") + require.NoError(t, err) + + syncedConsensusStateBytes = syncedConsensusStateBytes[32:] + parameterInput = make([]byte, 32+len(syncedConsensusStateBytes)+len(headerBytes)) + binary.BigEndian.PutUint64(parameterInput[24:32], uint64(len(syncedConsensusStateBytes))) + copy(parameterInput[32:32+len(syncedConsensusStateBytes)], syncedConsensusStateBytes) + copy(parameterInput[32+len(syncedConsensusStateBytes):], headerBytes) + + totalLengthPrefix = make([]byte, 32) + binary.BigEndian.PutUint64(totalLengthPrefix[24:32], uint64(len(parameterInput))) + input = append(totalLengthPrefix, parameterInput...) + + syncedAgainConsensusStateBytes, err := tmHeaderValidateContract.Run(input) + require.NoError(t, err) + syncedAgainConsensusState, err := lightclient.DecodeConsensusState(syncedAgainConsensusStateBytes[32:]) + require.NoError(t, err) + + newAppHash := syncedAgainConsensusState.AppHash + key, err := hex.DecodeString("6163636f756e743a8a4e2eb018bdf98a8f53ec755740ffc728637a1d") + require.NoError(t, err) + value, err := hex.DecodeString("4bdc4c270a750a148a4e2eb018bdf98a8f53ec755740ffc728637a1d12110a0941544348412d3733301080f69bf321120b0a03424e4210e8baeb8d44120f0a075050432d303041108094ebdc031a26eb5ae98721031c199c92e5b0080967da99be27cf2da53317441b4a663e6d9c6caf02be1fdbdc20d7962b2815") + require.NoError(t, err) + proofBytes, err := hex.DecodeString("0add070a066961766c3a76121c6163636f756e743a8a4e2eb018bdf98a8f53ec755740ffc728637a1d1ab407b2070aaf070a2d081810cdfd2b188096a82222209f223f804e2d94ac51c4321b0687397012e6d95eb9783b03bc790da631004c7c0a2d081710adb31a18f395a8222a20d2a38865de82383ccce0140513b65cec1bf2ae6cd7dfeb22eb6faadb4e26b26f0a2d081510b2990b18f395a82222208a02bbd5a695dfc772627ac8744aa9cf30ae26575bdce8c96a9a0d0999175b430a2d081410e6ff0418f395a8222a20d39619c779be909e67f23499fb74eb2c19afd7f21523401d4ccf7e917db5cd600a2d081210e3fe0118f395a8222a20a10cc73843f889d9e03a463eb135e928bb980e19734344cba0fbf4e8a4c5258b0a2c081010dd6518f395a8222a2007fd15843a2fd3f58d021b0e072a6c70742d7a3d993a922445e3491e1c14ee8e0a2c080f10cc2a18eda6a7222a20088942d7b30abd021d8e9505cc41313fad87c8c10a799f3b51018b7b2cfe4ad90a2c080d10b70d18eda6a7222a2091a37bc44d0c61e3752ddc59eb390355ab65e8a9fb453be4f0acec537f1ca14f0a2c080c10890818eda6a72222201cfc317855a06667c45812fe36efe33af05671dfe0d9b56b02662011af2e79e30a2c080b10ac0318c4b0ee212220aeb454a4b3243b6269a2fd8841dca9a951c53b30f1e27da91063dae7224402c70a2c080910e40118c4b0ee212a20441340a4de6498f861b97b3f3ad9603af055e5af51a0d96fff2ae28e3c5c6c9a0a2c0808108d0118c4b0ee212220ae32ea4b9ab7b53571da320e2815fd8b2c278124961cca4a1849a799842424450a2b0807104d18c4b0ee212220e2804c9b7f045ec0b4ab20920a937b82fda8b7a9ddd12b21637335b915cfda550a2b0806102418a5f4c7192a20ec85f22addedfc82c771af5b4c77544b7c1d7c5bbac33f2712dfba1045ebdbd00a2b0805101118a5f4c7192a2071ade34dcc447a0ba8adc603080633d15c06f3525830c86ebce35eca0a4921fc0a2b0804100c18a5f4c7192a205190bce93993e65b266a3417ed511df8897a812cb4b62569e5afcfbec10b69cd0a2b0803100618a5f4c7192220b76c6884f1d412ac10bfb3987fb7d26f0330b2a85539509ebc5c6bdec2f95d520a2b0802100418a5f4c71922206a285b4a4f9d1c687bbafa1f3649b6a6e32b1a85dd0402421210683e846cf0020a2b0801100218a5f4c7192220033b3f7c6dcb258b6e55545e7a4f51539447cd595eb8a2e373ba0015502da1051a450a1c6163636f756e743a8a4e2eb018bdf98a8f53ec755740ffc728637a1d12201a272295e94cf1d8090bdb019dde48e9dab026ad2c3e43aaa7e61cc954a9245d18a5f4c7190ab6040a0a6d756c746973746f726512036163631aa204a0040a9d040a300a0364657812290a27088496a822122038fc49f49648fec62acc434151a51eaa378c1b20a730a749548e36f1529422500a300a03676f7612290a27088496a8221220a78ce489bdf08b9ee869c184876e1623dc38b3e64a5cf1a0005f97976c64deac0a380a0b61746f6d69635f7377617012290a27088496a8221220544c2fa38f61e10a39ec00b3e724d5834761268bb455cdbf5843bcf1531f8fbc0a300a0376616c12290a27088496a82212201f71082c9f6f45fb456b2c00b41e50d2f662f2dfec3cb6965f19d214bf02f3980a0f0a046d61696e12070a05088496a8220a320a057374616b6512290a27088496a82212200dd467343c718f240e50b4feac42970fc8c1c69a018be955f9c27913ac1f8b3c0a300a0361636312290a27088496a8221220270c19ccc9c40c5176b3dfbd8af734c97a307e0dbd8df9e286dcd5d709f973ed0a330a06746f6b656e7312290a27088496a8221220c4f96eedf50c83964de9df013afec2e545012d92528b643a5166c828774187b60a320a05706169727312290a27088496a8221220351c55cfda84596ecd22ebc77013662aba97f81f19d9ef3d150213bb07c823060a360a0974696d655f6c6f636b12290a27088496a8221220e7adf5bd30ce022decf0e9341bf05c464ed70cdbc97423bd2bab8f3571e5179b0a330a06706172616d7312290a27088496a822122042a9dfc356ca435db131eb41fb1975c8482f2434537918665e530b0b4633b5f9") + require.NoError(t, err) + + merkleProofInput := make([]byte, 32+32+len(key)+32+len(value)+32+len(proofBytes)) + copy(merkleProofInput[:32], "acc") + binary.BigEndian.PutUint64(merkleProofInput[32+24:32+32], uint64(len(key))) + copy(merkleProofInput[32+32:32+32+len(key)], key) + + binary.BigEndian.PutUint64(merkleProofInput[32+32+len(key)+24:32+32+len(key)+32], uint64(len(value))) + copy(merkleProofInput[32+32+len(key)+32:32+32+len(key)+32+len(value)], value) + + copy(merkleProofInput[32+32+len(key)+32+len(value):32+32+len(key)+32+len(value)+32], newAppHash) + copy(merkleProofInput[32+32+len(key)+32+len(value)+32:], proofBytes) + + totalLengthPrefix = make([]byte, 32) + binary.BigEndian.PutUint64(totalLengthPrefix[0:8], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[8:16], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[16:24], 0) + binary.BigEndian.PutUint64(totalLengthPrefix[24:], uint64(len(merkleProofInput))) + input = append(totalLengthPrefix, merkleProofInput...) + + iavlMerkleProofValidateContract := iavlMerkleProofValidate{} + success, err := iavlMerkleProofValidateContract.Run(input) + require.NoError(t, err) + expectedResult := make([]byte, 32) + binary.BigEndian.PutUint64(expectedResult[24:], 0x01) + require.Equal(t, expectedResult, success) +} diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index 8fe0ae8b38b..6b794da453f 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -20,7 +20,7 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "os" "testing" "time" @@ -185,7 +185,7 @@ func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { return } if common.Bytes2Hex(res) != test.Expected { - bench.Error(fmt.Sprintf("Expected %v, got %v", test.Expected, common.Bytes2Hex(res))) + bench.Errorf("Expected %v, got %v", test.Expected, common.Bytes2Hex(res)) return } }) @@ -334,7 +334,7 @@ func TestPrecompiledBLS12381MapG1Fail(t *testing.T) { testJsonFail("blsMapG func TestPrecompiledBLS12381MapG2Fail(t *testing.T) { testJsonFail("blsMapG2", "12", t) } func loadJson(name string) ([]precompiledTest, error) { - data, err := ioutil.ReadFile(fmt.Sprintf("testdata/precompiles/%v.json", name)) + data, err := os.ReadFile(fmt.Sprintf("testdata/precompiles/%v.json", name)) if err != nil { return nil, err } @@ -344,7 +344,7 @@ func loadJson(name string) ([]precompiledTest, error) { } func loadJsonFail(name string) ([]precompiledFailureTest, error) { - data, err := ioutil.ReadFile(fmt.Sprintf("testdata/precompiles/fail-%v.json", name)) + data, err := os.ReadFile(fmt.Sprintf("testdata/precompiles/fail-%v.json", name)) if err != nil { return nil, err } diff --git a/core/vm/cvm.go b/core/vm/cvm.go new file mode 100644 index 00000000000..19c54d56d50 --- /dev/null +++ b/core/vm/cvm.go @@ -0,0 +1,44 @@ +package vm + +import ( + "fmt" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/crypto" +) + +func NewCVM(state IntraBlockState) *CVM { + cvm := &CVM{ + intraBlockState: state, + } + + return cvm +} + +type CVM struct { + config Config + intraBlockState IntraBlockState +} + +func (cvm *CVM) Create(caller ContractRef, code []byte) ([]byte, common.Address, error) { + address := crypto.CreateAddress(caller.Address(), cvm.intraBlockState.GetNonce(caller.Address())) + cvm.intraBlockState.SetCode(address, code) + fmt.Println(">>>> Create Starknet Contract", address.Hex()) + return code, common.Address{}, nil + + //TODO:: execute cairo construct + //ret, err := cvm.run(code) +} + +func (cvm *CVM) Config() Config { + return cvm.config +} + +func (cvm *CVM) IntraBlockState() IntraBlockState { + return cvm.intraBlockState +} + +//func (cvm *CVM) run(code []byte) ([]byte, error) { +// // TODO:: call grpc cairo +// return code, nil +//} diff --git a/core/vm/cvm_adapter.go b/core/vm/cvm_adapter.go new file mode 100644 index 00000000000..1c633d4c9ed --- /dev/null +++ b/core/vm/cvm_adapter.go @@ -0,0 +1,55 @@ +package vm + +import ( + "fmt" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/params" +) + +const CairoNotImplemented = "the method is currently not implemented for cvm: %s" + +type CVMAdapter struct { + Cvm *CVM +} + +func (c *CVMAdapter) Reset(txCtx TxContext, ibs IntraBlockState) { + c.Cvm.intraBlockState = ibs +} + +func (c *CVMAdapter) Create(caller ContractRef, code []byte, gas uint64, value *uint256.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { + leftOverGas = 0 + + ret, contractAddr, err = c.Cvm.Create(caller, code) + + return ret, contractAddr, leftOverGas, err +} + +func (cvm *CVMAdapter) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *uint256.Int, bailout bool) (ret []byte, leftOverGas uint64, err error) { + return nil, 0, fmt.Errorf(CairoNotImplemented, "Call") +} + +func (cvm *CVMAdapter) Config() Config { + return cvm.Cvm.Config() +} + +func (cvm *CVMAdapter) ChainConfig() *params.ChainConfig { + return params.FermionChainConfig +} + +func (cvm *CVMAdapter) ChainRules() *params.Rules { + return ¶ms.Rules{} +} + +func (cvm *CVMAdapter) Context() BlockContext { + return BlockContext{} +} + +func (cvm *CVMAdapter) IntraBlockState() IntraBlockState { + return cvm.Cvm.IntraBlockState() +} + +func (cvm *CVMAdapter) TxContext() TxContext { + return TxContext{} +} diff --git a/core/vm/cvm_test.go b/core/vm/cvm_test.go new file mode 100644 index 00000000000..830a8f69d99 --- /dev/null +++ b/core/vm/cvm_test.go @@ -0,0 +1 @@ +package vm diff --git a/core/vm/eips.go b/core/vm/eips.go index b428a3a823c..dfadd38aa0c 100644 --- a/core/vm/eips.go +++ b/core/vm/eips.go @@ -79,9 +79,9 @@ func enable1884(jt *JumpTable) { } } -func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - balance := interpreter.evm.IntraBlockState.GetBalance(callContext.contract.Address()) - callContext.stack.Push(balance) +func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error) { + balance := interpreter.evm.IntraBlockState().GetBalance(callContext.Contract.Address()) + callContext.Stack.Push(balance) return nil, nil } @@ -98,9 +98,9 @@ func enable1344(jt *JumpTable) { } // opChainID implements CHAINID opcode -func opChainID(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - chainId, _ := uint256.FromBig(interpreter.evm.ChainRules.ChainID) - callContext.stack.Push(chainId) +func opChainID(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error) { + chainId, _ := uint256.FromBig(interpreter.evm.ChainRules().ChainID) + callContext.Stack.Push(chainId) return nil, nil } @@ -166,8 +166,8 @@ func enable3198(jt *JumpTable) { } // opBaseFee implements BASEFEE opcode -func opBaseFee(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - baseFee := interpreter.evm.Context.BaseFee - callContext.stack.Push(baseFee) +func opBaseFee(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error) { + baseFee := interpreter.evm.Context().BaseFee + callContext.Stack.Push(baseFee) return nil, nil } diff --git a/core/vm/errors.go b/core/vm/errors.go index d0606181ac9..a3ac70bd686 100644 --- a/core/vm/errors.go +++ b/core/vm/errors.go @@ -40,6 +40,7 @@ var ( ErrInvalidRetsub = errors.New("invalid retsub") ErrReturnStackExceeded = errors.New("return stack limit reached") ErrInvalidCode = errors.New("invalid code") + ErrNonceUintOverflow = errors.New("nonce uint64 overflow") ) // ErrStackUnderflow wraps an evm error when the items on the stack less diff --git a/core/vm/evm.go b/core/vm/evm.go index 19cdbb23944..c66f9dd38ce 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -23,7 +23,6 @@ import ( "time" "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" "github.com/ledgerwatch/erigon/crypto" @@ -47,11 +46,15 @@ type ( func (evm *EVM) precompile(addr common.Address) (PrecompiledContract, bool) { var precompiles map[common.Address]PrecompiledContract switch { - case evm.ChainRules.IsBerlin: + case evm.chainRules.IsBerlin: precompiles = PrecompiledContractsBerlin - case evm.ChainRules.IsIstanbul: - precompiles = PrecompiledContractsIstanbul - case evm.ChainRules.IsByzantium: + case evm.chainRules.IsIstanbul: + if evm.chainRules.IsParlia { + precompiles = PrecompiledContractsIstanbulForBSC + } else { + precompiles = PrecompiledContractsIstanbul + } + case evm.chainRules.IsByzantium: precompiles = PrecompiledContractsByzantium default: precompiles = PrecompiledContractsHomestead @@ -62,10 +65,21 @@ func (evm *EVM) precompile(addr common.Address) (PrecompiledContract, bool) { // run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter. func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) { + callback, err := selectInterpreter(evm, contract) + if err != nil { + return nil, err + } + + defer callback() + + return evm.interpreter.Run(contract, input, readOnly) +} + +func selectInterpreter(evm *EVM, contract *Contract) (func(), error) { interpreter := evm.interpreter - defer func() { + callback := func() { evm.interpreter = interpreter - }() + } switch contract.vmType { case EVMType: @@ -76,7 +90,7 @@ func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, err return nil, errors.New("no compatible interpreter") } - return evm.interpreter.Run(contract, input, readOnly) + return callback, nil } // BlockContext provides the EVM with auxiliary information. Once provided @@ -89,8 +103,8 @@ type BlockContext struct { Transfer TransferFunc // GetHash returns the hash corresponding to n GetHash GetHashFunc - // checkTEVM returns true if the contract has TEVM code - CheckTEVM func(codeHash common.Hash) (bool, error) + // ContractHasTEVM returns true if the contract has TEVM code + ContractHasTEVM func(codeHash common.Hash) (bool, error) // Block information Coinbase common.Address // Provides information for COINBASE @@ -122,20 +136,20 @@ type TxContext struct { // The EVM should never be reused and is not thread safe. type EVM struct { // Context provides auxiliary blockchain related information - Context BlockContext - TxContext + context BlockContext + txContext TxContext // IntraBlockState gives access to the underlying state - IntraBlockState IntraBlockState + intraBlockState IntraBlockState // Depth is the current call stack depth int // chainConfig contains information about the current chain chainConfig *params.ChainConfig // chain rules contains the chain rules for the current epoch - ChainRules params.Rules + chainRules *params.Rules // virtual machine configuration options used to initialise the // evm. - Config Config + config Config // global (to this context) ethereum virtual machine // used throughout the execution of the tx. interpreters []Interpreter @@ -153,17 +167,18 @@ type EVM struct { // only ever be used *once*. func NewEVM(blockCtx BlockContext, txCtx TxContext, state IntraBlockState, chainConfig *params.ChainConfig, vmConfig Config) *EVM { evm := &EVM{ - Context: blockCtx, - TxContext: txCtx, - IntraBlockState: state, - Config: vmConfig, + context: blockCtx, + txContext: txCtx, + intraBlockState: state, + config: vmConfig, chainConfig: chainConfig, - ChainRules: chainConfig.Rules(blockCtx.BlockNumber), + chainRules: chainConfig.Rules(blockCtx.BlockNumber), } + evmInterp := NewEVMInterpreter(evm, vmConfig) evm.interpreters = []Interpreter{ - EVMType: NewEVMInterpreter(evm, vmConfig), - TEVMType: NewTEVMInterpreter(evm, vmConfig), + EVMType: evmInterp, + TEVMType: NewTEVMInterpreterByVM(evmInterp.VM), } evm.interpreter = evm.interpreters[EVMType] @@ -173,8 +188,8 @@ func NewEVM(blockCtx BlockContext, txCtx TxContext, state IntraBlockState, chain // Reset resets the EVM with a new transaction context.Reset // This is not threadsafe and should only be done very cautiously. func (evm *EVM) Reset(txCtx TxContext, ibs IntraBlockState) { - evm.TxContext = txCtx - evm.IntraBlockState = ibs + evm.txContext = txCtx + evm.intraBlockState = ibs } // Cancel cancels any running EVM operation. This may be called concurrently and @@ -198,7 +213,7 @@ func (evm *EVM) Interpreter() Interpreter { // the necessary steps to create accounts and reverses the state in case of an // execution error or failed value transfer. func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *uint256.Int, bailout bool) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { + if evm.config.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit @@ -206,51 +221,54 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas return nil, gas, ErrDepth } // Fail if we're trying to transfer more than the available balance - if value.Sign() != 0 && !evm.Context.CanTransfer(evm.IntraBlockState, caller.Address(), value) { + if !value.IsZero() && !evm.context.CanTransfer(evm.intraBlockState, caller.Address(), value) { if !bailout { return nil, gas, ErrInsufficientBalance } } p, isPrecompile := evm.precompile(addr) + var code []byte + if !isPrecompile { + code = evm.intraBlockState.GetCode(addr) + } // Capture the tracer start/end events in debug mode - if evm.Config.Debug { - _ = evm.Config.Tracer.CaptureStart(evm.depth, caller.Address(), addr, isPrecompile, false /* create */, CALLT, input, gas, value.ToBig(), common.Hash{}) + if evm.config.Debug { + evm.config.Tracer.CaptureStart(evm, evm.depth, caller.Address(), addr, isPrecompile, false /* create */, CALLT, input, gas, value.ToBig(), code) defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(evm.depth, ret, startGas-gas, time.Since(startTime), err) //nolint:errcheck + evm.config.Tracer.CaptureEnd(evm.depth, ret, startGas, gas, time.Since(startTime), err) }(gas, time.Now()) } var ( to = AccountRef(addr) - snapshot = evm.IntraBlockState.Snapshot() + snapshot = evm.intraBlockState.Snapshot() ) - if !evm.IntraBlockState.Exist(addr) { - if !isPrecompile && evm.ChainRules.IsEIP158 && value.Sign() == 0 { + if !evm.intraBlockState.Exist(addr) { + if !isPrecompile && evm.chainRules.IsSpuriousDragon && value.IsZero() { return nil, gas, nil } - evm.IntraBlockState.CreateAccount(addr, false) + evm.intraBlockState.CreateAccount(addr, false) } - evm.Context.Transfer(evm.IntraBlockState, caller.Address(), to.Address(), value, bailout) + evm.context.Transfer(evm.intraBlockState, caller.Address(), to.Address(), value, bailout) if isPrecompile { ret, gas, err = RunPrecompiledContract(p, input, gas) } else { // Initialise a new contract and set the code that is to be used by the EVM. // The contract is a scoped environment for this execution context only. - code := evm.IntraBlockState.GetCode(addr) if len(code) == 0 { ret, err = nil, nil // gas is unchanged } else { addrCopy := addr // If the account has no code, we can abort here // The depth-check is already done, and precompiles handled above - codehash := evm.IntraBlockState.GetCodeHash(addrCopy) + codehash := evm.intraBlockState.GetCodeHash(addrCopy) - var isTEVM bool - isTEVM, err = evm.Context.CheckTEVM(codehash) + var contractHasTEVM bool + contractHasTEVM, err = evm.context.ContractHasTEVM(codehash) if err == nil { - contract := NewContract(caller, AccountRef(addrCopy), value, gas, evm.Config.SkipAnalysis, isTEVM) + contract := NewContract(caller, AccountRef(addrCopy), value, gas, evm.config.SkipAnalysis, contractHasTEVM) contract.SetCallCode(&addrCopy, codehash, code) ret, err = run(evm, contract, input, false) gas = contract.Gas @@ -261,7 +279,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in homestead this also counts for code storage gas errors. if err != nil { - evm.IntraBlockState.RevertToSnapshot(snapshot) + evm.intraBlockState.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { gas = 0 } @@ -280,7 +298,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas // CallCode differs from Call in the sense that it executes the given address' // code with the caller as context. func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, gas uint64, value *uint256.Int) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { + if evm.config.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit @@ -291,19 +309,23 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, // Note although it's noop to transfer X ether to caller itself. But // if caller doesn't have enough balance, it would be an error to allow // over-charging itself. So the check here is necessary. - if !evm.Context.CanTransfer(evm.IntraBlockState, caller.Address(), value) { + if !evm.context.CanTransfer(evm.intraBlockState, caller.Address(), value) { return nil, gas, ErrInsufficientBalance } p, isPrecompile := evm.precompile(addr) + var code []byte + if !isPrecompile { + code = evm.intraBlockState.GetCode(addr) + } // Capture the tracer start/end events in debug mode - if evm.Config.Debug { - _ = evm.Config.Tracer.CaptureStart(evm.depth, caller.Address(), addr, isPrecompile, false /* create */, CALLCODET, input, gas, value.ToBig(), common.Hash{}) + if evm.config.Debug { + evm.config.Tracer.CaptureStart(evm, evm.depth, caller.Address(), addr, isPrecompile, false /* create */, CALLCODET, input, gas, value.ToBig(), code) defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(evm.depth, ret, startGas-gas, time.Since(startTime), err) //nolint:errcheck + evm.config.Tracer.CaptureEnd(evm.depth, ret, startGas, gas, time.Since(startTime), err) }(gas, time.Now()) } var ( - snapshot = evm.IntraBlockState.Snapshot() + snapshot = evm.intraBlockState.Snapshot() ) // It is allowed to call precompiles, even via delegatecall @@ -315,18 +337,18 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, // The contract is a scoped environment for this execution context only. var isTEVM bool - codeHash := evm.IntraBlockState.GetCodeHash(addrCopy) - isTEVM, err = evm.Context.CheckTEVM(codeHash) + codeHash := evm.intraBlockState.GetCodeHash(addrCopy) + isTEVM, err = evm.context.ContractHasTEVM(codeHash) if err == nil { - contract := NewContract(caller, AccountRef(caller.Address()), value, gas, evm.Config.SkipAnalysis, isTEVM) - contract.SetCallCode(&addrCopy, codeHash, evm.IntraBlockState.GetCode(addrCopy)) + contract := NewContract(caller, AccountRef(caller.Address()), value, gas, evm.config.SkipAnalysis, isTEVM) + contract.SetCallCode(&addrCopy, codeHash, code) ret, err = run(evm, contract, input, false) gas = contract.Gas } } if err != nil { - evm.IntraBlockState.RevertToSnapshot(snapshot) + evm.intraBlockState.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { gas = 0 } @@ -340,7 +362,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, // DelegateCall differs from CallCode in the sense that it executes the given address' // code with the caller as context and the caller is set to the caller of the caller. func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { + if evm.config.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit @@ -348,14 +370,18 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by return nil, gas, ErrDepth } p, isPrecompile := evm.precompile(addr) + var code []byte + if !isPrecompile { + code = evm.intraBlockState.GetCode(addr) + } // Capture the tracer start/end events in debug mode - if evm.Config.Debug { - _ = evm.Config.Tracer.CaptureStart(evm.depth, caller.Address(), addr, isPrecompile, false /* create */, DELEGATECALLT, input, gas, big.NewInt(-1), common.Hash{}) + if evm.config.Debug { + evm.config.Tracer.CaptureStart(evm, evm.depth, caller.Address(), addr, isPrecompile, false /* create */, DELEGATECALLT, input, gas, big.NewInt(-1), code) defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(evm.depth, ret, startGas-gas, time.Since(startTime), err) //nolint:errcheck + evm.config.Tracer.CaptureEnd(evm.depth, ret, startGas, gas, time.Since(startTime), err) }(gas, time.Now()) } - snapshot := evm.IntraBlockState.Snapshot() + snapshot := evm.intraBlockState.Snapshot() // It is allowed to call precompiles, even via delegatecall if isPrecompile { @@ -364,18 +390,18 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by addrCopy := addr // Initialise a new contract and make initialise the delegate values var isTEVM bool - codeHash := evm.IntraBlockState.GetCodeHash(addrCopy) - isTEVM, err = evm.Context.CheckTEVM(codeHash) + codeHash := evm.intraBlockState.GetCodeHash(addrCopy) + isTEVM, err = evm.context.ContractHasTEVM(codeHash) if err == nil { - contract := NewContract(caller, AccountRef(caller.Address()), nil, gas, evm.Config.SkipAnalysis, isTEVM).AsDelegate() - contract.SetCallCode(&addrCopy, evm.IntraBlockState.GetCodeHash(addrCopy), evm.IntraBlockState.GetCode(addrCopy)) + contract := NewContract(caller, AccountRef(caller.Address()), nil, gas, evm.config.SkipAnalysis, isTEVM).AsDelegate() + contract.SetCallCode(&addrCopy, codeHash, code) ret, err = run(evm, contract, input, false) gas = contract.Gas } } if err != nil { - evm.IntraBlockState.RevertToSnapshot(snapshot) + evm.intraBlockState.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { gas = 0 } @@ -388,7 +414,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by // Opcodes that attempt to perform such modifications will result in exceptions // instead of performing the modifications. func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte, gas uint64) (ret []byte, leftOverGas uint64, err error) { - if evm.Config.NoRecursion && evm.depth > 0 { + if evm.config.NoRecursion && evm.depth > 0 { return nil, gas, nil } // Fail if we're trying to execute above the call depth limit @@ -396,11 +422,15 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte return nil, gas, ErrDepth } p, isPrecompile := evm.precompile(addr) + var code []byte + if !isPrecompile { + code = evm.intraBlockState.GetCode(addr) + } // Capture the tracer start/end events in debug mode - if evm.Config.Debug { - _ = evm.Config.Tracer.CaptureStart(evm.depth, caller.Address(), addr, isPrecompile, false, STATICCALLT, input, gas, big.NewInt(-2), common.Hash{}) + if evm.config.Debug { + evm.config.Tracer.CaptureStart(evm, evm.depth, caller.Address(), addr, isPrecompile, false, STATICCALLT, input, gas, big.NewInt(-2), code) defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(evm.depth, ret, startGas-gas, time.Since(startTime), err) //nolint:errcheck + evm.config.Tracer.CaptureEnd(evm.depth, ret, startGas, gas, time.Since(startTime), err) }(gas, time.Now()) } // We take a snapshot here. This is a bit counter-intuitive, and could probably be skipped. @@ -408,13 +438,13 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // after all empty accounts were deleted, so this is not required. However, if we omit this, // then certain tests start failing; stRevertTest/RevertPrecompiledTouchExactOOG.json. // We could change this, but for now it's left for legacy reasons - var snapshot = evm.IntraBlockState.Snapshot() + var snapshot = evm.intraBlockState.Snapshot() // We do an AddBalance of zero here, just in order to trigger a touch. // This doesn't matter on Mainnet, where all empties are gone at the time of Byzantium, // but is the correct thing to do and matters on other networks, in tests, and potential // future scenarios - evm.IntraBlockState.AddBalance(addr, u256.Num0) + evm.intraBlockState.AddBalance(addr, u256.Num0) if isPrecompile { ret, gas, err = RunPrecompiledContract(p, input, gas) @@ -426,12 +456,12 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // Initialise a new contract and set the code that is to be used by the EVM. // The contract is a scoped environment for this execution context only. var isTEVM bool - codeHash := evm.IntraBlockState.GetCodeHash(addrCopy) - isTEVM, err = evm.Context.CheckTEVM(codeHash) + codeHash := evm.intraBlockState.GetCodeHash(addrCopy) + isTEVM, err = evm.context.ContractHasTEVM(codeHash) if err == nil { - contract := NewContract(caller, AccountRef(addrCopy), new(uint256.Int), gas, evm.Config.SkipAnalysis, isTEVM) - contract.SetCallCode(&addrCopy, evm.IntraBlockState.GetCodeHash(addrCopy), evm.IntraBlockState.GetCode(addrCopy)) + contract := NewContract(caller, AccountRef(addrCopy), new(uint256.Int), gas, evm.config.SkipAnalysis, isTEVM) + contract.SetCallCode(&addrCopy, codeHash, code) // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in Homestead this also counts for code storage gas errors. @@ -440,7 +470,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte } } if err != nil { - evm.IntraBlockState.RevertToSnapshot(snapshot) + evm.intraBlockState.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { gas = 0 } @@ -469,53 +499,56 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, if evm.depth > int(params.CallCreateDepth) { return nil, common.Address{}, gas, ErrDepth } - if !evm.Context.CanTransfer(evm.IntraBlockState, caller.Address(), value) { + if !evm.context.CanTransfer(evm.intraBlockState, caller.Address(), value) { return nil, common.Address{}, gas, ErrInsufficientBalance } - if evm.Config.Debug || evm.Config.EnableTEMV { - _ = evm.Config.Tracer.CaptureStart(evm.depth, caller.Address(), address, false /* precompile */, true /* create */, calltype, codeAndHash.code, gas, value.ToBig(), codeAndHash.Hash()) + if evm.config.Debug || evm.config.EnableTEMV { + evm.config.Tracer.CaptureStart(evm, evm.depth, caller.Address(), address, false /* precompile */, true /* create */, calltype, codeAndHash.code, gas, value.ToBig(), nil) defer func(startGas uint64, startTime time.Time) { // Lazy evaluation of the parameters - evm.Config.Tracer.CaptureEnd(evm.depth, ret, startGas-gas, time.Since(startTime), err) //nolint:errcheck + evm.config.Tracer.CaptureEnd(evm.depth, ret, startGas, gas, time.Since(startTime), err) }(gas, time.Now()) } - nonce := evm.IntraBlockState.GetNonce(caller.Address()) - evm.IntraBlockState.SetNonce(caller.Address(), nonce+1) + nonce := evm.intraBlockState.GetNonce(caller.Address()) + if nonce+1 < nonce { + return nil, common.Address{}, gas, ErrNonceUintOverflow + } + evm.intraBlockState.SetNonce(caller.Address(), nonce+1) // We add this to the access list _before_ taking a snapshot. Even if the creation fails, // the access-list change should not be rolled back - if evm.ChainRules.IsBerlin { - evm.IntraBlockState.AddAddressToAccessList(address) + if evm.chainRules.IsBerlin { + evm.intraBlockState.AddAddressToAccessList(address) } // Ensure there's no existing contract already at the designated address - contractHash := evm.IntraBlockState.GetCodeHash(address) - if evm.IntraBlockState.GetNonce(address) != 0 || (contractHash != (common.Hash{}) && contractHash != emptyCodeHash) { + contractHash := evm.intraBlockState.GetCodeHash(address) + if evm.intraBlockState.GetNonce(address) != 0 || (contractHash != (common.Hash{}) && contractHash != emptyCodeHash) { err = ErrContractAddressCollision return nil, common.Address{}, 0, err } // Create a new account on the state - snapshot := evm.IntraBlockState.Snapshot() - evm.IntraBlockState.CreateAccount(address, true) - if evm.ChainRules.IsEIP158 { - evm.IntraBlockState.SetNonce(address, 1) + snapshot := evm.intraBlockState.Snapshot() + evm.intraBlockState.CreateAccount(address, true) + if evm.chainRules.IsSpuriousDragon { + evm.intraBlockState.SetNonce(address, 1) } - evm.Context.Transfer(evm.IntraBlockState, caller.Address(), address, value, false /* bailout */) + evm.context.Transfer(evm.intraBlockState, caller.Address(), address, value, false /* bailout */) // Initialise a new contract and set the code that is to be used by the EVM. // The contract is a scoped environment for this execution context only. - contract := NewContract(caller, AccountRef(address), value, gas, evm.Config.SkipAnalysis, false) + contract := NewContract(caller, AccountRef(address), value, gas, evm.config.SkipAnalysis, false) contract.SetCodeOptionalHash(&address, codeAndHash) - if evm.Config.NoRecursion && evm.depth > 0 { + if evm.config.NoRecursion && evm.depth > 0 { return nil, address, gas, nil } ret, err = run(evm, contract, nil, false) // check whether the max code size has been exceeded - maxCodeSizeExceeded := evm.ChainRules.IsEIP158 && len(ret) > params.MaxCodeSize + maxCodeSizeExceeded := evm.chainRules.IsSpuriousDragon && len(ret) > params.MaxCodeSize // Reject code starting with 0xEF if EIP-3541 is enabled. if err == nil && !maxCodeSizeExceeded { - if evm.ChainRules.IsLondon && len(ret) >= 1 && ret[0] == 0xEF { + if evm.chainRules.IsLondon && len(ret) >= 1 && ret[0] == 0xEF { err = ErrInvalidCode } } @@ -526,8 +559,8 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, if err == nil && !maxCodeSizeExceeded { createDataGas := uint64(len(ret)) * params.CreateDataGas if contract.UseGas(createDataGas) { - evm.IntraBlockState.SetCode(address, ret) - } else { + evm.intraBlockState.SetCode(address, ret) + } else if evm.chainRules.IsHomestead { err = ErrCodeStoreOutOfGas } } @@ -535,8 +568,8 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, // When an error was returned by the EVM or when setting the creation code // above we revert to the snapshot and consume any gas remaining. Additionally // when we're in homestead this also counts for code storage gas errors. - if maxCodeSizeExceeded || (err != nil && (evm.ChainRules.IsHomestead || err != ErrCodeStoreOutOfGas)) { - evm.IntraBlockState.RevertToSnapshot(snapshot) + if maxCodeSizeExceeded || (err != nil && (evm.chainRules.IsHomestead || err != ErrCodeStoreOutOfGas)) { + evm.intraBlockState.RevertToSnapshot(snapshot) if err != ErrExecutionReverted { contract.UseGas(contract.Gas) } @@ -554,7 +587,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, // Create creates a new contract using code as deployment code. // DESCRIBED: docs/programmers_guide/guide.md#nonce func (evm *EVM) Create(caller ContractRef, code []byte, gas uint64, value *uint256.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) { - contractAddr = crypto.CreateAddress(caller.Address(), evm.IntraBlockState.GetNonce(caller.Address())) + contractAddr = crypto.CreateAddress(caller.Address(), evm.intraBlockState.GetNonce(caller.Address())) return evm.create(caller, &codeAndHash{code: code}, gas, value, contractAddr, CREATET) } @@ -570,4 +603,27 @@ func (evm *EVM) Create2(caller ContractRef, code []byte, gas uint64, endowment * } // ChainConfig returns the environment's chain configuration -func (evm *EVM) ChainConfig() *params.ChainConfig { return evm.chainConfig } +func (evm *EVM) Config() Config { + return evm.config +} + +// ChainConfig returns the environment's chain configuration +func (evm *EVM) ChainConfig() *params.ChainConfig { + return evm.chainConfig +} + +func (evm *EVM) ChainRules() *params.Rules { + return evm.chainRules +} + +func (evm *EVM) Context() BlockContext { + return evm.context +} + +func (evm *EVM) TxContext() TxContext { + return evm.txContext +} + +func (evm *EVM) IntraBlockState() IntraBlockState { + return evm.intraBlockState +} diff --git a/core/vm/evm_test.go b/core/vm/evm_test.go new file mode 100644 index 00000000000..9e02dd1784d --- /dev/null +++ b/core/vm/evm_test.go @@ -0,0 +1,446 @@ +package vm + +import ( + "fmt" + "testing" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/params" + + "github.com/holiman/uint256" + "pgregory.net/rapid" +) + +func TestInterpreterReadonly(t *testing.T) { + rapid.Check(t, func(t *rapid.T) { + env := NewEVM(BlockContext{ + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, + }, TxContext{}, &dummyStatedb{}, params.TestChainConfig, Config{EnableTEMV: true}) + + isEVMSliceTest := rapid.SliceOfN(rapid.Bool(), 1, -1).Draw(t, "tevm").([]bool) + readOnlySliceTest := rapid.SliceOfN(rapid.Bool(), len(isEVMSliceTest), len(isEVMSliceTest)).Draw(t, "readonly").([]bool) + + isEVMCalled := make([]bool, len(isEVMSliceTest)) + readOnlies := make([]*readOnlyState, len(readOnlySliceTest)) + currentIdx := new(int) + *currentIdx = -1 + + evmInterpreter := &testVM{ + readonlyGetSetter: env.interpreters[EVMType].(*EVMInterpreter), + isTEMV: false, + + recordedReadOnlies: &readOnlies, + recordedIsEVMCalled: &isEVMCalled, + + env: env, + isEVMSliceTest: isEVMSliceTest, + readOnlySliceTest: readOnlySliceTest, + currentIdx: currentIdx, + } + tevmInterpreter := &testVM{ + readonlyGetSetter: env.interpreters[TEVMType].(*TEVMInterpreter), + isTEMV: true, + + recordedReadOnlies: &readOnlies, + recordedIsEVMCalled: &isEVMCalled, + + env: env, + isEVMSliceTest: isEVMSliceTest, + readOnlySliceTest: readOnlySliceTest, + currentIdx: currentIdx, + } + + env.interpreters[EVMType] = evmInterpreter + env.interpreters[TEVMType] = tevmInterpreter + + dummyContract := NewContract( + &dummyContractRef{}, + &dummyContractRef{}, + new(uint256.Int), + 0, + false, + false, + ) + + newTestSequential(env, currentIdx, readOnlySliceTest, isEVMSliceTest).Run(dummyContract, nil, false) + + var gotReadonly bool + var firstReadOnly int + + // properties-invariants + + if len(readOnlies) != len(readOnlySliceTest) { + t.Fatalf("expected static calls the same stack length as generated. got %d, expected %d", len(readOnlies), len(readOnlySliceTest)) + } + + if len(isEVMCalled) != len(isEVMSliceTest) { + t.Fatalf("expected VM calls the same stack length as generated. got %d, expected %d", len(isEVMCalled), len(isEVMSliceTest)) + } + + if *currentIdx != len(readOnlies) { + t.Fatalf("expected VM calls the same amount of calls as generated calls. got %d, expected %d", *currentIdx, len(readOnlies)) + } + + for i, readOnly := range readOnlies { + if isEVMCalled[i] != isEVMSliceTest[i] { + t.Fatalf("wrong VM was called in %d index, got EVM %t, expected EVM %t", + i, isEVMCalled[i], isEVMSliceTest[i]) + } + + if readOnly.outer != readOnlySliceTest[i] { + t.Fatalf("outer readOnly appeared in %d index, got readOnly %t, expected %t", + i, readOnly.outer, readOnlySliceTest[i]) + } + + if i > 0 { + if readOnly.before != readOnlies[i-1].in { + t.Fatalf("before readOnly appeared in %d index, got readOnly %t, expected %t", + i, readOnly.before, readOnlies[i-1].in) + } + } + + if readOnly.in && !gotReadonly { + gotReadonly = true + firstReadOnly = i + } + + if gotReadonly { + if !readOnly.in { + t.Fatalf("readOnly appeared in %d index, got non-readOnly in %d: %v", + firstReadOnly, i, trace(isEVMCalled, readOnlies)) + } + + switch { + case i < firstReadOnly: + if readOnly.after != false { + t.Fatalf("after readOnly appeared in %d index(first readonly %d, case firstReadOnly: + if readOnly.after != true { + t.Fatalf("after readOnly appeared in %d index(first readonly %d, case >firstReadOnly), got readOnly %t, expected %t", + i, firstReadOnly, readOnly.after, true) + } + } + } else { + if readOnly.after != false { + t.Fatalf("after readOnly didn't appear. %d index, got readOnly %t, expected %t", + i, readOnly.after, false) + } + } + } + }) +} + +func TestReadonlyBasicCases(t *testing.T) { + cases := []struct { + testName string + readonlySliceTest []bool + + expectedReadonlySlice []readOnlyState + }{ + { + "simple non-readonly", + []bool{false}, + + []readOnlyState{ + { + false, + false, + false, + false, + }, + }, + }, + { + "simple readonly", + []bool{true}, + + []readOnlyState{ + { + true, + true, + true, + false, + }, + }, + }, + + { + "2 calls non-readonly", + []bool{false, false}, + + []readOnlyState{ + { + false, + false, + false, + false, + }, + { + false, + false, + false, + false, + }, + }, + }, + + { + "2 calls true,false", + []bool{true, false}, + + []readOnlyState{ + { + true, + true, + true, + false, + }, + { + true, + true, + true, + true, + }, + }, + }, + { + "2 calls false,true", + []bool{false, true}, + + []readOnlyState{ + { + false, + false, + false, + false, + }, + { + true, + true, + true, + false, + }, + }, + }, + { + "2 calls readonly", + []bool{true, true}, + + []readOnlyState{ + { + true, + true, + true, + true, + }, + { + true, + true, + true, + true, + }, + }, + }, + } + + type evmsParamsTest struct { + emvs []bool + suffix string + } + + evmsTest := make([]evmsParamsTest, len(cases)) + + // fill all possible isEVM combinations + for i, testCase := range cases { + isEVMSliceTest := make([]bool, len(testCase.readonlySliceTest)) + + copy(isEVMSliceTest, testCase.readonlySliceTest) + evmsTest[i].emvs = isEVMSliceTest + + suffix := "-isEVMSliceTest" + for _, evmParam := range testCase.readonlySliceTest { + if evmParam { + suffix += "-true" + } else { + suffix += "-false" + } + } + + evmsTest[i].suffix = suffix + } + + for _, testCase := range cases { + for _, evmsParams := range evmsTest { + + testcase := testCase + evmsTestcase := evmsParams + + if len(testcase.readonlySliceTest) != len(evmsTestcase.emvs) { + continue + } + + t.Run(testcase.testName+evmsTestcase.suffix, func(t *testing.T) { + readonlySliceTest := testcase.readonlySliceTest + + env := NewEVM(BlockContext{ + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, + }, TxContext{}, &dummyStatedb{}, params.TestChainConfig, Config{EnableTEMV: true}) + + readonliesGot := make([]*readOnlyState, len(testcase.readonlySliceTest)) + isEVMGot := make([]bool, len(evmsTestcase.emvs)) + + currentIdx := new(int) + *currentIdx = -1 + + evmInterpreter := &testVM{ + readonlyGetSetter: env.interpreters[EVMType].(*EVMInterpreter), + isTEMV: false, + + recordedReadOnlies: &readonliesGot, + recordedIsEVMCalled: &isEVMGot, + + env: env, + isEVMSliceTest: evmsTestcase.emvs, + readOnlySliceTest: testcase.readonlySliceTest, + currentIdx: currentIdx, + } + tevmInterpreter := &testVM{ + readonlyGetSetter: env.interpreters[TEVMType].(*TEVMInterpreter), + isTEMV: true, + + recordedReadOnlies: &readonliesGot, + recordedIsEVMCalled: &isEVMGot, + + env: env, + isEVMSliceTest: evmsTestcase.emvs, + readOnlySliceTest: testcase.readonlySliceTest, + currentIdx: currentIdx, + } + + env.interpreters[EVMType] = evmInterpreter + env.interpreters[TEVMType] = tevmInterpreter + + dummyContract := NewContract( + &dummyContractRef{}, + &dummyContractRef{}, + new(uint256.Int), + 0, + false, + false, + ) + + newTestSequential(env, currentIdx, readonlySliceTest, evmsTestcase.emvs).Run(dummyContract, nil, false) + + if len(readonliesGot) != len(readonlySliceTest) { + t.Fatalf("expected static calls the same stack length as generated. got %d, expected %d - %v", len(readonliesGot), len(readonlySliceTest), readonlySliceTest) + } + + if len(isEVMGot) != len(evmsTestcase.emvs) { + t.Fatalf("expected VM calls the same stack length as generated. got %d, expected %d - %v, readonly %v", len(isEVMGot), len(evmsTestcase.emvs), evmsTestcase.emvs, readonlySliceTest) + } + + if *currentIdx != len(readonlySliceTest) { + t.Fatalf("expected VM calls the same amount of calls as generated calls. got %d, expected %d", *currentIdx, len(readonlySliceTest)) + } + + var gotReadonly bool + var firstReadOnly int + + for callIndex, readOnly := range readonliesGot { + if isEVMGot[callIndex] != evmsTestcase.emvs[callIndex] { + t.Fatalf("wrong VM was called in %d index, got EVM %t, expected EVM %t. Test EVMs %v; test readonly %v", + callIndex, isEVMGot[callIndex], evmsTestcase.emvs[callIndex], evmsTestcase.emvs, readonlySliceTest) + } + + if readOnly.outer != readonlySliceTest[callIndex] { + t.Fatalf("outer readOnly appeared in %d index, got readOnly %t, expected %t. Test EVMs %v; test readonly %v", + callIndex, readOnly.outer, readonlySliceTest[callIndex], evmsTestcase.emvs, readonlySliceTest) + } + + if callIndex > 0 { + if readOnly.before != readonliesGot[callIndex-1].in { + t.Fatalf("before readOnly appeared in %d index, got readOnly %t, expected %t. Test EVMs %v; test readonly %v", + callIndex, readOnly.before, readonliesGot[callIndex-1].in, evmsTestcase.emvs, readonlySliceTest) + } + } + + if readOnly.in && !gotReadonly { + gotReadonly = true + firstReadOnly = callIndex + } + + if gotReadonly { + if !readOnly.in { + t.Fatalf("readOnly appeared in %d index, got non-readOnly in %d: %v. Test EVMs %v; test readonly %v", + firstReadOnly, callIndex, trace(isEVMGot, readonliesGot), evmsTestcase.emvs, readonlySliceTest) + } + + switch { + case callIndex < firstReadOnly: + if readOnly.after != false { + t.Fatalf("after readOnly appeared in %d index(first readonly %d, case firstReadOnly: + if readOnly.after != true { + t.Fatalf("after readOnly appeared in %d index(first readonly %d, case >firstReadOnly), got readOnly %t, expected %t. Test EVMs %v; test readonly %v", + callIndex, firstReadOnly, readOnly.after, true, evmsTestcase.emvs, readonlySliceTest) + } + } + } else { + if readOnly.after != false { + t.Fatalf("after readOnly didn't appear. %d index, got readOnly %t, expected %t. Test EVMs %v; test readonly %v", + callIndex, readOnly.after, false, evmsTestcase.emvs, readonlySliceTest) + } + } + } + }) + } + } +} + +type testSequential struct { + env *EVM + currentIdx *int + readOnlys []bool + isEVMCalled []bool +} + +func newTestSequential(env *EVM, currentIdx *int, readonlies []bool, isEVMCalled []bool) *testSequential { + return &testSequential{env, currentIdx, readonlies, isEVMCalled} +} + +func (st *testSequential) Run(_ *Contract, _ []byte, _ bool) ([]byte, error) { + *st.currentIdx++ + + nextContract := NewContract( + &dummyContractRef{}, + &dummyContractRef{}, + new(uint256.Int), + 0, + false, + !st.isEVMCalled[*st.currentIdx], + ) + + return run(st.env, nextContract, nil, st.readOnlys[*st.currentIdx]) +} + +func trace(isEVMSlice []bool, readOnlySlice []*readOnlyState) string { + res := "trace:\n" + for i := 0; i < len(isEVMSlice); i++ { + res += fmt.Sprintf("%d: EVM %t, readonly %t\n", i, isEVMSlice[i], readOnlySlice[i].in) + } + return res +} diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index efd5fa7c298..fcbe14b47c3 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -100,11 +100,11 @@ func gasSStore(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, me value, x := stack.Back(1), stack.Back(0) key := common.Hash(x.Bytes32()) var current uint256.Int - evm.IntraBlockState.GetState(contract.Address(), &key, ¤t) + evm.IntraBlockState().GetState(contract.Address(), &key, ¤t) // The legacy gas metering only takes into consideration the current state // Legacy rules should be applied if we are in Petersburg (removal of EIP-1283) // OR Constantinople is not active - if evm.ChainRules.IsPetersburg || !evm.ChainRules.IsConstantinople { + if evm.ChainRules().IsPetersburg || !evm.ChainRules().IsConstantinople { // This checks for 3 scenario's and calculates gas accordingly: // // 1. From a zero-value address to a non-zero value (NEW VALUE) @@ -114,7 +114,7 @@ func gasSStore(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, me case current.IsZero() && !value.IsZero(): // 0 => non 0 return params.SstoreSetGas, nil case !current.IsZero() && value.IsZero(): // non 0 => 0 - evm.IntraBlockState.AddRefund(params.SstoreRefundGas) + evm.IntraBlockState().AddRefund(params.SstoreRefundGas) return params.SstoreClearGas, nil default: // non 0 => non 0 (or 0 => 0) return params.SstoreResetGas, nil @@ -138,28 +138,28 @@ func gasSStore(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, me return params.NetSstoreNoopGas, nil } var original uint256.Int - evm.IntraBlockState.GetCommittedState(contract.Address(), &key, &original) + evm.IntraBlockState().GetCommittedState(contract.Address(), &key, &original) if original == current { if original.IsZero() { // create slot (2.1.1) return params.NetSstoreInitGas, nil } if value.IsZero() { // delete slot (2.1.2b) - evm.IntraBlockState.AddRefund(params.NetSstoreClearRefund) + evm.IntraBlockState().AddRefund(params.NetSstoreClearRefund) } return params.NetSstoreCleanGas, nil // write existing slot (2.1.2) } if !original.IsZero() { if current.IsZero() { // recreate slot (2.2.1.1) - evm.IntraBlockState.SubRefund(params.NetSstoreClearRefund) + evm.IntraBlockState().SubRefund(params.NetSstoreClearRefund) } else if value.IsZero() { // delete slot (2.2.1.2) - evm.IntraBlockState.AddRefund(params.NetSstoreClearRefund) + evm.IntraBlockState().AddRefund(params.NetSstoreClearRefund) } } if original.Eq(value) { if original.IsZero() { // reset to original inexistent slot (2.2.2.1) - evm.IntraBlockState.AddRefund(params.NetSstoreResetClearRefund) + evm.IntraBlockState().AddRefund(params.NetSstoreResetClearRefund) } else { // reset to original existing slot (2.2.2.2) - evm.IntraBlockState.AddRefund(params.NetSstoreResetRefund) + evm.IntraBlockState().AddRefund(params.NetSstoreResetRefund) } } @@ -188,35 +188,35 @@ func gasSStoreEIP2200(evm *EVM, contract *Contract, stack *stack.Stack, mem *Mem value, x := stack.Back(1), stack.Back(0) key := common.Hash(x.Bytes32()) var current uint256.Int - evm.IntraBlockState.GetState(contract.Address(), &key, ¤t) + evm.IntraBlockState().GetState(contract.Address(), &key, ¤t) if current.Eq(value) { // noop (1) return params.SloadGasEIP2200, nil } var original uint256.Int - evm.IntraBlockState.GetCommittedState(contract.Address(), &key, &original) + evm.IntraBlockState().GetCommittedState(contract.Address(), &key, &original) if original == current { if original.IsZero() { // create slot (2.1.1) return params.SstoreSetGasEIP2200, nil } if value.IsZero() { // delete slot (2.1.2b) - evm.IntraBlockState.AddRefund(params.SstoreClearsScheduleRefundEIP2200) + evm.IntraBlockState().AddRefund(params.SstoreClearsScheduleRefundEIP2200) } return params.SstoreResetGasEIP2200, nil // write existing slot (2.1.2) } if !original.IsZero() { if current.IsZero() { // recreate slot (2.2.1.1) - evm.IntraBlockState.SubRefund(params.SstoreClearsScheduleRefundEIP2200) + evm.IntraBlockState().SubRefund(params.SstoreClearsScheduleRefundEIP2200) } else if value.IsZero() { // delete slot (2.2.1.2) - evm.IntraBlockState.AddRefund(params.SstoreClearsScheduleRefundEIP2200) + evm.IntraBlockState().AddRefund(params.SstoreClearsScheduleRefundEIP2200) } } if original.Eq(value) { if original.IsZero() { // reset to original inexistent slot (2.2.2.1) - evm.IntraBlockState.AddRefund(params.SstoreSetGasEIP2200 - params.SloadGasEIP2200) + evm.IntraBlockState().AddRefund(params.SstoreSetGasEIP2200 - params.SloadGasEIP2200) } else { // reset to original existing slot (2.2.2.2) - evm.IntraBlockState.AddRefund(params.SstoreResetGasEIP2200 - params.SloadGasEIP2200) + evm.IntraBlockState().AddRefund(params.SstoreResetGasEIP2200 - params.SloadGasEIP2200) } } return params.SloadGasEIP2200, nil // dirty update (2.2) @@ -317,11 +317,11 @@ func gasExpFrontier(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memor return gas, nil } -func gasExpEIP158(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasExpEIP160(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) { expByteLen := uint64((stack.Data[stack.Len()-2].BitLen() + 7) / 8) var ( - gas = expByteLen * params.ExpByteEIP158 // no overflow check required. Max is 256 * ExpByte gas + gas = expByteLen * params.ExpByteEIP160 // no overflow check required. Max is 256 * ExpByte gas overflow bool ) if gas, overflow = math.SafeAdd(gas, params.ExpGas); overflow { @@ -336,11 +336,11 @@ func gasCall(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memo transfersValue = !stack.Back(2).IsZero() address = common.Address(stack.Back(1).Bytes20()) ) - if evm.ChainRules.IsEIP158 { - if transfersValue && evm.IntraBlockState.Empty(address) { + if evm.ChainRules().IsSpuriousDragon { + if transfersValue && evm.IntraBlockState().Empty(address) { gas += params.CallNewAccountGas } - } else if !evm.IntraBlockState.Exist(address) { + } else if !evm.IntraBlockState().Exist(address) { gas += params.CallNewAccountGas } if transfersValue { @@ -355,7 +355,7 @@ func gasCall(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memo return 0, ErrGasUintOverflow } - evm.callGasTemp, err = callGas(evm.ChainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.ChainRules().IsTangerineWhistle, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } @@ -374,13 +374,13 @@ func gasCallCode(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, gas uint64 overflow bool ) - if stack.Back(2).Sign() != 0 { + if !stack.Back(2).IsZero() { gas += params.CallValueTransferGas } if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { return 0, ErrGasUintOverflow } - evm.callGasTemp, err = callGas(evm.ChainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.ChainRules().IsTangerineWhistle, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } @@ -395,7 +395,7 @@ func gasDelegateCall(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memo if err != nil { return 0, err } - evm.callGasTemp, err = callGas(evm.ChainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.ChainRules().IsTangerineWhistle, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } @@ -411,7 +411,7 @@ func gasStaticCall(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory if err != nil { return 0, err } - evm.callGasTemp, err = callGas(evm.ChainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.ChainRules().IsTangerineWhistle, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } @@ -424,23 +424,23 @@ func gasStaticCall(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory func gasSelfdestruct(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) { var gas uint64 - // EIP150 homestead gas reprice fork: - if evm.ChainRules.IsEIP150 { + // TangerineWhistle (EIP150) gas reprice fork: + if evm.ChainRules().IsTangerineWhistle { gas = params.SelfdestructGasEIP150 var address = common.Address(stack.Back(0).Bytes20()) - if evm.ChainRules.IsEIP158 { + if evm.ChainRules().IsSpuriousDragon { // if empty and transfers value - if evm.IntraBlockState.Empty(address) && evm.IntraBlockState.GetBalance(contract.Address()).Sign() != 0 { + if evm.IntraBlockState().Empty(address) && !evm.IntraBlockState().GetBalance(contract.Address()).IsZero() { gas += params.CreateBySelfdestructGas } - } else if !evm.IntraBlockState.Exist(address) { + } else if !evm.IntraBlockState().Exist(address) { gas += params.CreateBySelfdestructGas } } - if !evm.IntraBlockState.HasSuicided(contract.Address()) { - evm.IntraBlockState.AddRefund(params.SelfdestructRefundGas) + if !evm.IntraBlockState().HasSuicided(contract.Address()) { + evm.IntraBlockState().AddRefund(params.SelfdestructRefundGas) } return gas, nil } diff --git a/core/vm/gas_table_test.go b/core/vm/gas_table_test.go index dd26a0b832e..8d6eb2bc955 100644 --- a/core/vm/gas_table_test.go +++ b/core/vm/gas_table_test.go @@ -96,9 +96,9 @@ func TestEIP2200(t *testing.T) { _ = s.CommitBlock(params.AllEthashProtocolChanges.Rules(0), state.NewPlainStateWriter(tx, tx, 0)) vmctx := BlockContext{ - CanTransfer: func(IntraBlockState, common.Address, *uint256.Int) bool { return true }, - Transfer: func(IntraBlockState, common.Address, common.Address, *uint256.Int, bool) {}, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + CanTransfer: func(IntraBlockState, common.Address, *uint256.Int) bool { return true }, + Transfer: func(IntraBlockState, common.Address, common.Address, *uint256.Int, bool) {}, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, } vmenv := NewEVM(vmctx, TxContext{}, s, params.AllEthashProtocolChanges, Config{ExtraEips: []int{2200}}) @@ -109,7 +109,7 @@ func TestEIP2200(t *testing.T) { if used := tt.gaspool - gas; used != tt.used { t.Errorf("test %d: gas used mismatch: have %v, want %v", i, used, tt.used) } - if refund := vmenv.IntraBlockState.GetRefund(); refund != tt.refund { + if refund := vmenv.IntraBlockState().GetRefund(); refund != tt.refund { t.Errorf("test %d: gas refund mismatch: have %v, want %v", i, refund, tt.refund) } }) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index 53f672da6b1..36b52d77b8d 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -28,50 +28,50 @@ import ( "github.com/ledgerwatch/log/v3" ) -func opAdd(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opAdd(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Add(&x, y) return nil, nil } -func opSub(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opSub(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Sub(&x, y) return nil, nil } -func opMul(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opMul(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Mul(&x, y) return nil, nil } -func opDiv(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opDiv(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Div(&x, y) return nil, nil } -func opSdiv(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opSdiv(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.SDiv(&x, y) return nil, nil } -func opMod(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opMod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Mod(&x, y) return nil, nil } -func opSmod(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opSmod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.SMod(&x, y) return nil, nil } -func opExp(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - base, exponent := callContext.stack.Pop(), callContext.stack.Peek() +func opExp(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + base, exponent := scope.Stack.Pop(), scope.Stack.Peek() switch { case exponent.IsZero(): // x ^ 0 == 1 @@ -99,20 +99,20 @@ func opExp(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byt return nil, nil } -func opSignExtend(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - back, num := callContext.stack.Pop(), callContext.stack.Peek() +func opSignExtend(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + back, num := scope.Stack.Pop(), scope.Stack.Peek() num.ExtendSign(num, &back) return nil, nil } -func opNot(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x := callContext.stack.Peek() +func opNot(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x := scope.Stack.Peek() x.Not(x) return nil, nil } -func opLt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opLt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() if x.Lt(y) { y.SetOne() } else { @@ -121,8 +121,8 @@ func opLt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte return nil, nil } -func opGt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opGt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() if x.Gt(y) { y.SetOne() } else { @@ -131,8 +131,8 @@ func opGt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte return nil, nil } -func opSlt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opSlt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() if x.Slt(y) { y.SetOne() } else { @@ -141,8 +141,8 @@ func opSlt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byt return nil, nil } -func opSgt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opSgt(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() if x.Sgt(y) { y.SetOne() } else { @@ -151,8 +151,8 @@ func opSgt(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byt return nil, nil } -func opEq(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opEq(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() if x.Eq(y) { y.SetOne() } else { @@ -161,8 +161,8 @@ func opEq(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte return nil, nil } -func opIszero(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x := callContext.stack.Peek() +func opIszero(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x := scope.Stack.Peek() if x.IsZero() { x.SetOne() } else { @@ -171,32 +171,32 @@ func opIszero(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([] return nil, nil } -func opAnd(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opAnd(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.And(&x, y) return nil, nil } -func opOr(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opOr(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Or(&x, y) return nil, nil } -func opXor(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y := callContext.stack.Pop(), callContext.stack.Peek() +func opXor(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y := scope.Stack.Pop(), scope.Stack.Peek() y.Xor(&x, y) return nil, nil } -func opByte(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - th, val := callContext.stack.Pop(), callContext.stack.Peek() +func opByte(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + th, val := scope.Stack.Pop(), scope.Stack.Peek() val.Byte(&th) return nil, nil } -func opAddmod(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y, z := callContext.stack.Pop(), callContext.stack.Pop(), callContext.stack.Peek() +func opAddmod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y, z := scope.Stack.Pop(), scope.Stack.Pop(), scope.Stack.Peek() if z.IsZero() { z.Clear() } else { @@ -205,8 +205,8 @@ func opAddmod(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([] return nil, nil } -func opMulmod(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x, y, z := callContext.stack.Pop(), callContext.stack.Pop(), callContext.stack.Peek() +func opMulmod(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x, y, z := scope.Stack.Pop(), scope.Stack.Pop(), scope.Stack.Peek() if z.IsZero() { z.Clear() } else { @@ -218,9 +218,9 @@ func opMulmod(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([] // opSHL implements Shift Left // The SHL instruction (shift left) pops 2 values from the stack, first arg1 and then arg2, // and pushes on the stack arg2 shifted to the left by arg1 number of bits. -func opSHL(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opSHL(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { // Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards - shift, value := callContext.stack.Pop(), callContext.stack.Peek() + shift, value := scope.Stack.Pop(), scope.Stack.Peek() if shift.LtUint64(256) { value.Lsh(value, uint(shift.Uint64())) } else { @@ -232,9 +232,9 @@ func opSHL(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byt // opSHR implements Logical Shift Right // The SHR instruction (logical shift right) pops 2 values from the stack, first arg1 and then arg2, // and pushes on the stack arg2 shifted to the right by arg1 number of bits with zero fill. -func opSHR(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opSHR(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { // Note, second operand is left in the stack; accumulate result into it, and no need to push it afterwards - shift, value := callContext.stack.Pop(), callContext.stack.Peek() + shift, value := scope.Stack.Pop(), scope.Stack.Peek() if shift.LtUint64(256) { value.Rsh(value, uint(shift.Uint64())) } else { @@ -246,8 +246,8 @@ func opSHR(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byt // opSAR implements Arithmetic Shift Right // The SAR instruction (arithmetic shift right) pops 2 values from the stack, first arg1 and then arg2, // and pushes on the stack arg2 shifted to the right by arg1 number of bits with sign extension. -func opSAR(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - shift, value := callContext.stack.Pop(), callContext.stack.Peek() +func opSAR(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + shift, value := scope.Stack.Pop(), scope.Stack.Peek() if shift.GtUint64(255) { if value.Sign() >= 0 { value.Clear() @@ -262,9 +262,9 @@ func opSAR(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byt return nil, nil } -func opSha3(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - offset, size := callContext.stack.Pop(), callContext.stack.Peek() - data := callContext.memory.GetPtr(offset.Uint64(), size.Uint64()) +func opSha3(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + offset, size := scope.Stack.Pop(), scope.Stack.Peek() + data := scope.Memory.GetPtr(offset.Uint64(), size.Uint64()) if interpreter.hasher == nil { interpreter.hasher = sha3.NewLegacyKeccak256().(keccakState) @@ -279,36 +279,36 @@ func opSha3(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]by size.SetBytes(interpreter.hasherBuf[:]) return nil, nil } -func opAddress(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetBytes(callContext.contract.Address().Bytes())) +func opAddress(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(scope.Contract.Address().Bytes())) return nil, nil } -func opBalance(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - slot := callContext.stack.Peek() +func opBalance(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + slot := scope.Stack.Peek() address := common.Address(slot.Bytes20()) - slot.Set(interpreter.evm.IntraBlockState.GetBalance(address)) + slot.Set(interpreter.evm.IntraBlockState().GetBalance(address)) return nil, nil } -func opOrigin(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetBytes(interpreter.evm.Origin.Bytes())) +func opOrigin(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(interpreter.evm.TxContext().Origin.Bytes())) return nil, nil } -func opCaller(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetBytes(callContext.contract.Caller().Bytes())) +func opCaller(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(scope.Contract.Caller().Bytes())) return nil, nil } -func opCallValue(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(callContext.contract.value) +func opCallValue(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(scope.Contract.value) return nil, nil } -func opCallDataLoad(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - x := callContext.stack.Peek() +func opCallDataLoad(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + x := scope.Stack.Peek() if offset, overflow := x.Uint64WithOverflow(); !overflow { - data := getData(callContext.contract.Input, offset, 32) + data := getData(scope.Contract.Input, offset, 32) x.SetBytes(data) } else { x.Clear() @@ -316,16 +316,16 @@ func opCallDataLoad(pc *uint64, interpreter *EVMInterpreter, callContext *callCt return nil, nil } -func opCallDataSize(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetUint64(uint64(len(callContext.contract.Input)))) +func opCallDataSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(uint64(len(scope.Contract.Input)))) return nil, nil } -func opCallDataCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opCallDataCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - memOffset = callContext.stack.Pop() - dataOffset = callContext.stack.Pop() - length = callContext.stack.Pop() + memOffset = scope.Stack.Pop() + dataOffset = scope.Stack.Pop() + length = scope.Stack.Pop() ) dataOffset64, overflow := dataOffset.Uint64WithOverflow() if overflow { @@ -334,20 +334,20 @@ func opCallDataCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCt // These values are checked for overflow during gas cost calculation memOffset64 := memOffset.Uint64() length64 := length.Uint64() - callContext.memory.Set(memOffset64, length64, getData(callContext.contract.Input, dataOffset64, length64)) + scope.Memory.Set(memOffset64, length64, getData(scope.Contract.Input, dataOffset64, length64)) return nil, nil } -func opReturnDataSize(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetUint64(uint64(len(interpreter.returnData)))) +func opReturnDataSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(uint64(len(interpreter.returnData)))) return nil, nil } -func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - memOffset = callContext.stack.Pop() - dataOffset = callContext.stack.Pop() - length = callContext.stack.Pop() + memOffset = scope.Stack.Pop() + dataOffset = scope.Stack.Pop() + length = scope.Stack.Pop() ) offset64, overflow := dataOffset.Uint64WithOverflow() @@ -365,41 +365,41 @@ func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, callContext *call if overflow || uint64(len(interpreter.returnData)) < end64 { return nil, ErrReturnDataOutOfBounds } - callContext.memory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[offset64:end64]) + scope.Memory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[offset64:end64]) return nil, nil } -func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - slot := callContext.stack.Peek() - slot.SetUint64(uint64(interpreter.evm.IntraBlockState.GetCodeSize(common.Address(slot.Bytes20())))) +func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + slot := scope.Stack.Peek() + slot.SetUint64(uint64(interpreter.evm.IntraBlockState().GetCodeSize(common.Address(slot.Bytes20())))) return nil, nil } -func opCodeSize(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { l := new(uint256.Int) - l.SetUint64(uint64(len(callContext.contract.Code))) - callContext.stack.Push(l) + l.SetUint64(uint64(len(scope.Contract.Code))) + scope.Stack.Push(l) return nil, nil } -func opCodeCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - memOffset = callContext.stack.Pop() - codeOffset = callContext.stack.Pop() - length = callContext.stack.Pop() + memOffset = scope.Stack.Pop() + codeOffset = scope.Stack.Pop() + length = scope.Stack.Pop() ) uint64CodeOffset, overflow := codeOffset.Uint64WithOverflow() if overflow { uint64CodeOffset = 0xffffffffffffffff } - codeCopy := getData(callContext.contract.Code, uint64CodeOffset, length.Uint64()) - callContext.memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) + codeCopy := getData(scope.Contract.Code, uint64CodeOffset, length.Uint64()) + scope.Memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) return nil, nil } -func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - stack = callContext.stack + stack = scope.Stack a = stack.Pop() memOffset = stack.Pop() codeOffset = stack.Pop() @@ -407,8 +407,8 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx ) addr := common.Address(a.Bytes20()) len64 := length.Uint64() - codeCopy := getDataBig(interpreter.evm.IntraBlockState.GetCode(addr), &codeOffset, len64) - callContext.memory.Set(memOffset.Uint64(), len64, codeCopy) + codeCopy := getDataBig(interpreter.evm.IntraBlockState().GetCode(addr), &codeOffset, len64) + scope.Memory.Set(memOffset.Uint64(), len64, codeCopy) return nil, nil } @@ -438,130 +438,137 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx // // (6) Caller tries to get the code hash for an account which is marked as deleted, // this account should be regarded as a non-existent account and zero should be returned. -func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - slot := callContext.stack.Peek() +func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + slot := scope.Stack.Peek() address := common.Address(slot.Bytes20()) - if interpreter.evm.IntraBlockState.Empty(address) { + if interpreter.evm.IntraBlockState().Empty(address) { slot.Clear() } else { - slot.SetBytes(interpreter.evm.IntraBlockState.GetCodeHash(address).Bytes()) + slot.SetBytes(interpreter.evm.IntraBlockState().GetCodeHash(address).Bytes()) } return nil, nil } -func opGasprice(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - v, overflow := uint256.FromBig(interpreter.evm.GasPrice) +func opGasprice(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, overflow := uint256.FromBig(interpreter.evm.TxContext().GasPrice) if overflow { return nil, fmt.Errorf("interpreter.evm.GasPrice higher than 2^256-1") } - callContext.stack.Push(v) + scope.Stack.Push(v) return nil, nil } -func opBlockhash(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - num := callContext.stack.Peek() +func opBlockhash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + num := scope.Stack.Peek() num64, overflow := num.Uint64WithOverflow() if overflow { num.Clear() return nil, nil } var upper, lower uint64 - upper = interpreter.evm.Context.BlockNumber + upper = interpreter.evm.Context().BlockNumber if upper < 257 { lower = 0 } else { lower = upper - 256 } if num64 >= lower && num64 < upper { - num.SetBytes(interpreter.evm.Context.GetHash(num64).Bytes()) + num.SetBytes(interpreter.evm.Context().GetHash(num64).Bytes()) } else { num.Clear() } return nil, nil } -func opCoinbase(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetBytes(interpreter.evm.Context.Coinbase.Bytes())) +func opCoinbase(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetBytes(interpreter.evm.Context().Coinbase.Bytes())) return nil, nil } -func opTimestamp(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - v := new(uint256.Int).SetUint64(interpreter.evm.Context.Time) - callContext.stack.Push(v) +func opTimestamp(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v := new(uint256.Int).SetUint64(interpreter.evm.Context().Time) + scope.Stack.Push(v) return nil, nil } -func opNumber(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - v := new(uint256.Int).SetUint64(interpreter.evm.Context.BlockNumber) - callContext.stack.Push(v) +func opNumber(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v := new(uint256.Int).SetUint64(interpreter.evm.Context().BlockNumber) + scope.Stack.Push(v) return nil, nil } -func opDifficulty(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - v, overflow := uint256.FromBig(interpreter.evm.Context.Difficulty) +func opDifficulty(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v, overflow := uint256.FromBig(interpreter.evm.Context().Difficulty) if overflow { return nil, fmt.Errorf("interpreter.evm.Context.Difficulty higher than 2^256-1") } - callContext.stack.Push(v) + scope.Stack.Push(v) return nil, nil } -func opGasLimit(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - if interpreter.evm.Context.MaxGasLimit { - callContext.stack.Push(new(uint256.Int).SetAllOne()) +func opGasLimit(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + if interpreter.evm.Context().MaxGasLimit { + scope.Stack.Push(new(uint256.Int).SetAllOne()) } else { - callContext.stack.Push(new(uint256.Int).SetUint64(interpreter.evm.Context.GasLimit)) + scope.Stack.Push(new(uint256.Int).SetUint64(interpreter.evm.Context().GasLimit)) } return nil, nil } -func opPop(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Pop() +func opPop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Pop() return nil, nil } -func opMload(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - v := callContext.stack.Peek() +func opMload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + v := scope.Stack.Peek() offset := v.Uint64() - v.SetBytes(callContext.memory.GetPtr(offset, 32)) + v.SetBytes(scope.Memory.GetPtr(offset, 32)) return nil, nil } -func opMstore(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - mStart, val := callContext.stack.Pop(), callContext.stack.Pop() - callContext.memory.Set32(mStart.Uint64(), &val) +func opMstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + mStart, val := scope.Stack.Pop(), scope.Stack.Pop() + scope.Memory.Set32(mStart.Uint64(), &val) return nil, nil } -func opMstore8(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - off, val := callContext.stack.Pop(), callContext.stack.Pop() - callContext.memory.store[off.Uint64()] = byte(val.Uint64()) +func opMstore8(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + off, val := scope.Stack.Pop(), scope.Stack.Pop() + scope.Memory.store[off.Uint64()] = byte(val.Uint64()) return nil, nil } -func opSload(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - loc := callContext.stack.Peek() +func opSload(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + loc := scope.Stack.Peek() interpreter.hasherBuf = loc.Bytes32() - interpreter.evm.IntraBlockState.GetState(callContext.contract.Address(), &interpreter.hasherBuf, loc) + interpreter.evm.IntraBlockState().GetState(scope.Contract.Address(), &interpreter.hasherBuf, loc) return nil, nil } -func opSstore(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - loc := callContext.stack.Pop() - val := callContext.stack.Pop() +func opSstore(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + loc := scope.Stack.Pop() + val := scope.Stack.Pop() interpreter.hasherBuf = loc.Bytes32() - interpreter.evm.IntraBlockState.SetState(callContext.contract.Address(), &interpreter.hasherBuf, val) + interpreter.evm.IntraBlockState().SetState(scope.Contract.Address(), &interpreter.hasherBuf, val) return nil, nil } -func opJump(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - pos := callContext.stack.Pop() - if valid, usedBitmap := callContext.contract.validJumpdest(&pos); !valid { - if usedBitmap && interpreter.cfg.TraceJumpDest { - log.Warn("Code Bitmap used for detecting invalid jump", - "tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext.TxHash), - "block number", interpreter.evm.Context.BlockNumber, - ) +func opJump(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + pos := scope.Stack.Pop() + if valid, usedBitmap := scope.Contract.validJumpdest(&pos); !valid { + if usedBitmap { + if interpreter.cfg.TraceJumpDest { + log.Warn("Code Bitmap used for detecting invalid jump", + "tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext().TxHash), + "block_num", interpreter.evm.Context().BlockNumber, + ) + } else { + // This is "cheaper" version because it does not require calculation of txHash for each transaction + log.Warn("Code Bitmap used for detecting invalid jump", + "block_num", interpreter.evm.Context().BlockNumber, + ) + } } return nil, ErrInvalidJump } @@ -569,15 +576,22 @@ func opJump(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]by return nil, nil } -func opJumpi(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - pos, cond := callContext.stack.Pop(), callContext.stack.Pop() +func opJumpi(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + pos, cond := scope.Stack.Pop(), scope.Stack.Pop() if !cond.IsZero() { - if valid, usedBitmap := callContext.contract.validJumpdest(&pos); !valid { - if usedBitmap && interpreter.cfg.TraceJumpDest { - log.Warn("Code Bitmap used for detecting invalid jump", - "tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext.TxHash), - "block number", interpreter.evm.Context.BlockNumber, - ) + if valid, usedBitmap := scope.Contract.validJumpdest(&pos); !valid { + if usedBitmap { + if interpreter.cfg.TraceJumpDest { + log.Warn("Code Bitmap used for detecting invalid jump", + "tx", fmt.Sprintf("0x%x", interpreter.evm.TxContext().TxHash), + "block_num", interpreter.evm.Context().BlockNumber, + ) + } else { + // This is "cheaper" version because it does not require calculation of txHash for each transaction + log.Warn("Code Bitmap used for detecting invalid jump", + "block_num", interpreter.evm.Context().BlockNumber, + ) + } } return nil, ErrInvalidJump } @@ -588,55 +602,55 @@ func opJumpi(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]b return nil, nil } -func opJumpdest(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opJumpdest(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { return nil, nil } -func opPc(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetUint64(*pc)) +func opPc(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(*pc)) return nil, nil } -func opMsize(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetUint64(uint64(callContext.memory.Len()))) +func opMsize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(uint64(scope.Memory.Len()))) return nil, nil } -func opGas(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Push(new(uint256.Int).SetUint64(callContext.contract.Gas)) +func opGas(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Push(new(uint256.Int).SetUint64(scope.Contract.Gas)) return nil, nil } -func opCreate(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opCreate(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - value = callContext.stack.Pop() - offset = callContext.stack.Pop() - size = callContext.stack.Peek() - input = callContext.memory.GetCopy(offset.Uint64(), size.Uint64()) - gas = callContext.contract.Gas + value = scope.Stack.Pop() + offset = scope.Stack.Pop() + size = scope.Stack.Peek() + input = scope.Memory.GetCopy(offset.Uint64(), size.Uint64()) + gas = scope.Contract.Gas ) - if interpreter.evm.ChainRules.IsEIP150 { + if interpreter.evm.ChainRules().IsTangerineWhistle { gas -= gas / 64 } // reuse size int for stackvalue stackvalue := size - callContext.contract.UseGas(gas) + scope.Contract.UseGas(gas) - res, addr, returnGas, suberr := interpreter.evm.Create(callContext.contract, input, gas, &value) + res, addr, returnGas, suberr := interpreter.evm.Create(scope.Contract, input, gas, &value) // Push item on the stack based on the returned error. If the ruleset is // homestead we must check for CodeStoreOutOfGasError (homestead only // rule) and treat as an error, if the ruleset is frontier we must // ignore this error and pretend the operation was successful. - if interpreter.evm.ChainRules.IsHomestead && suberr == ErrCodeStoreOutOfGas { + if interpreter.evm.ChainRules().IsHomestead && suberr == ErrCodeStoreOutOfGas { stackvalue.Clear() } else if suberr != nil && suberr != ErrCodeStoreOutOfGas { stackvalue.Clear() } else { stackvalue.SetBytes(addr.Bytes()) } - callContext.contract.Gas += returnGas + scope.Contract.Gas += returnGas if suberr == ErrExecutionReverted { return res, nil @@ -644,21 +658,21 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([] return nil, nil } -func opCreate2(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opCreate2(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - endowment = callContext.stack.Pop() - offset, size = callContext.stack.Pop(), callContext.stack.Pop() - salt = callContext.stack.Pop() - input = callContext.memory.GetCopy(offset.Uint64(), size.Uint64()) - gas = callContext.contract.Gas + endowment = scope.Stack.Pop() + offset, size = scope.Stack.Pop(), scope.Stack.Pop() + salt = scope.Stack.Pop() + input = scope.Memory.GetCopy(offset.Uint64(), size.Uint64()) + gas = scope.Contract.Gas ) // Apply EIP150 gas -= gas / 64 - callContext.contract.UseGas(gas) + scope.Contract.UseGas(gas) // reuse size int for stackvalue stackValue := size - res, addr, returnGas, suberr := interpreter.evm.Create2(callContext.contract, input, gas, &endowment, &salt) + res, addr, returnGas, suberr := interpreter.evm.Create2(scope.Contract, input, gas, &endowment, &salt) // Push item on the stack based on the returned error. if suberr != nil { @@ -667,8 +681,8 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([ stackValue.SetBytes(addr.Bytes()) } - callContext.stack.Push(&stackValue) - callContext.contract.Gas += returnGas + scope.Stack.Push(&stackValue) + scope.Contract.Gas += returnGas if suberr == ErrExecutionReverted { return res, nil @@ -676,8 +690,8 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([ return nil, nil } -func opCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - stack := callContext.stack +func opCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + stack := scope.Stack // Pop gas. The actual gas in interpreter.evm.callGasTemp. // We can use this as a temporary value temp := stack.Pop() @@ -686,13 +700,13 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]by addr, value, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() toAddr := common.Address(addr.Bytes20()) // Get the arguments from the memory. - args := callContext.memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) + args := scope.Memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) if !value.IsZero() { gas += params.CallStipend } - ret, returnGas, err := interpreter.evm.Call(callContext.contract, toAddr, args, gas, &value, false /* bailout */) + ret, returnGas, err := interpreter.evm.Call(scope.Contract, toAddr, args, gas, &value, false /* bailout */) if err != nil { temp.Clear() @@ -701,21 +715,18 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]by } stack.Push(&temp) if err == nil || err == ErrExecutionReverted { - callContext.memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) - } - if err != nil { - retSize.Clear() - } else { - retSize.SetOne() + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } - callContext.contract.Gas += returnGas + + scope.Contract.Gas += returnGas return ret, nil } -func opCallCode(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opCallCode(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { // Pop gas. The actual gas is in interpreter.evm.callGasTemp. - stack := callContext.stack + stack := scope.Stack // We use it as a temporary value temp := stack.Pop() gas := interpreter.evm.callGasTemp @@ -723,14 +734,14 @@ func opCallCode(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ( addr, value, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() toAddr := common.Address(addr.Bytes20()) // Get arguments from the memory. - args := callContext.memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) + args := scope.Memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) //TODO: use uint256.Int instead of converting with toBig() if !value.IsZero() { gas += params.CallStipend } - ret, returnGas, err := interpreter.evm.CallCode(callContext.contract, toAddr, args, gas, &value) + ret, returnGas, err := interpreter.evm.CallCode(scope.Contract, toAddr, args, gas, &value) if err != nil { temp.Clear() } else { @@ -738,20 +749,17 @@ func opCallCode(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ( } stack.Push(&temp) if err == nil || err == ErrExecutionReverted { - callContext.memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } - if err != nil { - retSize.Clear() - } else { - retSize.SetOne() - } - callContext.contract.Gas += returnGas + + scope.Contract.Gas += returnGas return ret, nil } -func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - stack := callContext.stack +func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + stack := scope.Stack // Pop gas. The actual gas is in interpreter.evm.callGasTemp. // We use it as a temporary value temp := stack.Pop() @@ -760,9 +768,9 @@ func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCt addr, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() toAddr := common.Address(addr.Bytes20()) // Get arguments from the memory. - args := callContext.memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) + args := scope.Memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) - ret, returnGas, err := interpreter.evm.DelegateCall(callContext.contract, toAddr, args, gas) + ret, returnGas, err := interpreter.evm.DelegateCall(scope.Contract, toAddr, args, gas) if err != nil { temp.Clear() } else { @@ -770,21 +778,18 @@ func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCt } stack.Push(&temp) if err == nil || err == ErrExecutionReverted { - callContext.memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) - } - if err != nil { - retSize.Clear() - } else { - retSize.SetOne() + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } - callContext.contract.Gas += returnGas + + scope.Contract.Gas += returnGas return ret, nil } -func opStaticCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opStaticCall(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { // Pop gas. The actual gas is in interpreter.evm.callGasTemp. - stack := callContext.stack + stack := scope.Stack // We use it as a temporary value temp := stack.Pop() gas := interpreter.evm.callGasTemp @@ -792,9 +797,9 @@ func opStaticCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) addr, inOffset, inSize, retOffset, retSize := stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop(), stack.Pop() toAddr := common.Address(addr.Bytes20()) // Get arguments from the memory. - args := callContext.memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) + args := scope.Memory.GetPtr(inOffset.Uint64(), inSize.Uint64()) - ret, returnGas, err := interpreter.evm.StaticCall(callContext.contract, toAddr, args, gas) + ret, returnGas, err := interpreter.evm.StaticCall(scope.Contract, toAddr, args, gas) if err != nil { temp.Clear() } else { @@ -802,44 +807,41 @@ func opStaticCall(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) } stack.Push(&temp) if err == nil || err == ErrExecutionReverted { - callContext.memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) + ret = common.CopyBytes(ret) + scope.Memory.Set(retOffset.Uint64(), retSize.Uint64(), ret) } - if err != nil { - retSize.Clear() - } else { - retSize.SetOne() - } - callContext.contract.Gas += returnGas + + scope.Contract.Gas += returnGas return ret, nil } -func opReturn(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - offset, size := callContext.stack.Pop(), callContext.stack.Pop() - ret := callContext.memory.GetPtr(offset.Uint64(), size.Uint64()) +func opReturn(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + offset, size := scope.Stack.Pop(), scope.Stack.Pop() + ret := scope.Memory.GetPtr(offset.Uint64(), size.Uint64()) return ret, nil } -func opRevert(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - offset, size := callContext.stack.Pop(), callContext.stack.Pop() - ret := callContext.memory.GetPtr(offset.Uint64(), size.Uint64()) +func opRevert(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + offset, size := scope.Stack.Pop(), scope.Stack.Pop() + ret := scope.Memory.GetPtr(offset.Uint64(), size.Uint64()) return ret, nil } -func opStop(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opStop(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { return nil, nil } -func opSuicide(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - beneficiary := callContext.stack.Pop() - callerAddr := callContext.contract.Address() +func opSuicide(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + beneficiary := scope.Stack.Pop() + callerAddr := scope.Contract.Address() beneficiaryAddr := common.Address(beneficiary.Bytes20()) - balance := interpreter.evm.IntraBlockState.GetBalance(callerAddr) - interpreter.evm.IntraBlockState.AddBalance(beneficiaryAddr, balance) - if interpreter.evm.Config.Debug { - interpreter.evm.Config.Tracer.CaptureSelfDestruct(callerAddr, beneficiaryAddr, balance.ToBig()) + balance := interpreter.evm.IntraBlockState().GetBalance(callerAddr) + interpreter.evm.IntraBlockState().AddBalance(beneficiaryAddr, balance) + if interpreter.evm.Config().Debug { + interpreter.evm.Config().Tracer.CaptureSelfDestruct(callerAddr, beneficiaryAddr, balance.ToBig()) } - interpreter.evm.IntraBlockState.Suicide(callerAddr) + interpreter.evm.IntraBlockState().Suicide(callerAddr) return nil, nil } @@ -847,23 +849,23 @@ func opSuicide(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([ // make log instruction function func makeLog(size int) executionFunc { - return func(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { topics := make([]common.Hash, size) - stack := callContext.stack + stack := scope.Stack mStart, mSize := stack.Pop(), stack.Pop() for i := 0; i < size; i++ { addr := stack.Pop() topics[i] = common.Hash(addr.Bytes32()) } - d := callContext.memory.GetCopy(mStart.Uint64(), mSize.Uint64()) - interpreter.evm.IntraBlockState.AddLog(&types.Log{ - Address: callContext.contract.Address(), + d := scope.Memory.GetCopy(mStart.Uint64(), mSize.Uint64()) + interpreter.evm.IntraBlockState().AddLog(&types.Log{ + Address: scope.Contract.Address(), Topics: topics, Data: d, // This is a non-consensus field, but assigned here because // core/state doesn't know the current block number. - BlockNumber: interpreter.evm.Context.BlockNumber, + BlockNumber: interpreter.evm.Context().BlockNumber, }) return nil, nil @@ -871,24 +873,24 @@ func makeLog(size int) executionFunc { } // opPush1 is a specialized version of pushN -func opPush1(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { +func opPush1(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { var ( - codeLen = uint64(len(callContext.contract.Code)) + codeLen = uint64(len(scope.Contract.Code)) integer = new(uint256.Int) ) *pc++ if *pc < codeLen { - callContext.stack.Push(integer.SetUint64(uint64(callContext.contract.Code[*pc]))) + scope.Stack.Push(integer.SetUint64(uint64(scope.Contract.Code[*pc]))) } else { - callContext.stack.Push(integer.Clear()) + scope.Stack.Push(integer.Clear()) } return nil, nil } // make push instruction function func makePush(size uint64, pushByteSize int) executionFunc { - return func(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - codeLen := len(callContext.contract.Code) + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + codeLen := len(scope.Contract.Code) startMin := int(*pc + 1) if startMin >= codeLen { @@ -900,9 +902,9 @@ func makePush(size uint64, pushByteSize int) executionFunc { } integer := new(uint256.Int) - callContext.stack.Push(integer.SetBytes(common.RightPadBytes( + scope.Stack.Push(integer.SetBytes(common.RightPadBytes( // So it doesn't matter what we push onto the stack. - callContext.contract.Code[startMin:endMin], pushByteSize))) + scope.Contract.Code[startMin:endMin], pushByteSize))) *pc += size return nil, nil @@ -911,8 +913,8 @@ func makePush(size uint64, pushByteSize int) executionFunc { // make dup instruction function func makeDup(size int64) executionFunc { - return func(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Dup(int(size)) + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Dup(int(size)) return nil, nil } } @@ -921,8 +923,8 @@ func makeDup(size int64) executionFunc { func makeSwap(size int64) executionFunc { // switch n + 1 otherwise n would be swapped with n size++ - return func(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) { - callContext.stack.Swap(int(size)) + return func(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) ([]byte, error) { + scope.Stack.Swap(int(size)) return nil, nil } } diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 33718098973..f8d42aa41af 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -21,7 +21,7 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "os" "testing" "github.com/holiman/uint256" @@ -96,7 +96,7 @@ func init() { func testTwoOperandOp(t *testing.T, tests []TwoOperandTestcase, opFn executionFunc, name string) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, nil, params.TestChainConfig, Config{}) stack = stack.New() pc = uint64(0) @@ -109,7 +109,7 @@ func testTwoOperandOp(t *testing.T, tests []TwoOperandTestcase, opFn executionFu expected := new(uint256.Int).SetBytes(common.Hex2Bytes(test.Expected)) stack.Push(x) stack.Push(y) - opFn(&pc, evmInterpreter, &callCtx{nil, stack, nil}) + opFn(&pc, evmInterpreter, &ScopeContext{nil, stack, nil}) if len(stack.Data) != 1 { t.Errorf("Expected one item on stack after %v, got %d: ", name, len(stack.Data)) } @@ -197,10 +197,10 @@ func TestSAR(t *testing.T) { func TestAddMod(t *testing.T) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, nil, params.TestChainConfig, Config{}) stack = stack.New() - evmInterpreter = NewEVMInterpreter(env, env.Config) + evmInterpreter = NewEVMInterpreter(env, env.Config()) pc = uint64(0) ) tests := []struct { @@ -226,7 +226,7 @@ func TestAddMod(t *testing.T) { stack.Push(z) stack.Push(y) stack.Push(x) - opAddmod(&pc, evmInterpreter, &callCtx{nil, stack, nil}) + opAddmod(&pc, evmInterpreter, &ScopeContext{nil, stack, nil}) actual := stack.Pop() if actual.Cmp(expected) != 0 { t.Errorf("Testcase %d, expected %x, got %x", i, expected, actual) @@ -263,7 +263,7 @@ func TestAddMod(t *testing.T) { // if err != nil { // t.Fatal(err) // } -// _ = ioutil.WriteFile(fmt.Sprintf("testdata/testcases_%v.json", name), data, 0644) +// _ = os.WriteFile(fmt.Sprintf("testdata/testcases_%v.json", name), data, 0644) // if err != nil { // t.Fatal(err) // } @@ -273,7 +273,7 @@ func TestAddMod(t *testing.T) { // TestJsonTestcases runs through all the testcases defined as json-files func TestJsonTestcases(t *testing.T) { for name := range twoOpMethods { - data, err := ioutil.ReadFile(fmt.Sprintf("testdata/testcases_%v.json", name)) + data, err := os.ReadFile(fmt.Sprintf("testdata/testcases_%v.json", name)) if err != nil { t.Fatal("Failed to read file", err) } @@ -286,10 +286,10 @@ func TestJsonTestcases(t *testing.T) { func opBenchmark(bench *testing.B, op executionFunc, args ...string) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, nil, params.TestChainConfig, Config{}) stack = stack.New() - evmInterpreter = NewEVMInterpreter(env, env.Config) + evmInterpreter = NewEVMInterpreter(env, env.Config()) ) env.interpreter = evmInterpreter @@ -306,7 +306,7 @@ func opBenchmark(bench *testing.B, op executionFunc, args ...string) { a.SetBytes(arg) stack.Push(a) } - op(&pc, evmInterpreter, &callCtx{nil, stack, nil}) + op(&pc, evmInterpreter, &ScopeContext{nil, stack, nil}) stack.Pop() } } @@ -522,11 +522,11 @@ func BenchmarkOpIsZero(b *testing.B) { func TestOpMstore(t *testing.T) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, nil, params.TestChainConfig, Config{}) stack = stack.New() mem = NewMemory() - evmInterpreter = NewEVMInterpreter(env, env.Config) + evmInterpreter = NewEVMInterpreter(env, env.Config()) ) env.interpreter = evmInterpreter @@ -534,12 +534,12 @@ func TestOpMstore(t *testing.T) { pc := uint64(0) v := "abcdef00000000000000abba000000000deaf000000c0de00100000000133700" stack.PushN(*new(uint256.Int).SetBytes(common.Hex2Bytes(v)), *new(uint256.Int)) - opMstore(&pc, evmInterpreter, &callCtx{mem, stack, nil}) + opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) if got := common.Bytes2Hex(mem.GetCopy(0, 32)); got != v { t.Fatalf("Mstore fail, got %v, expected %v", got, v) } stack.PushN(*new(uint256.Int).SetOne(), *new(uint256.Int)) - opMstore(&pc, evmInterpreter, &callCtx{mem, stack, nil}) + opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) if common.Bytes2Hex(mem.GetCopy(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { t.Fatalf("Mstore failed to overwrite previous value") } @@ -548,11 +548,11 @@ func TestOpMstore(t *testing.T) { func BenchmarkOpMstore(bench *testing.B) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, nil, params.TestChainConfig, Config{}) stack = stack.New() mem = NewMemory() - evmInterpreter = NewEVMInterpreter(env, env.Config) + evmInterpreter = NewEVMInterpreter(env, env.Config()) ) env.interpreter = evmInterpreter @@ -564,18 +564,18 @@ func BenchmarkOpMstore(bench *testing.B) { bench.ResetTimer() for i := 0; i < bench.N; i++ { stack.PushN(*value, *memStart) - opMstore(&pc, evmInterpreter, &callCtx{mem, stack, nil}) + opMstore(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) } } func BenchmarkOpSHA3(bench *testing.B) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, nil, params.TestChainConfig, Config{}) stack = stack.New() mem = NewMemory() - evmInterpreter = NewEVMInterpreter(env, env.Config) + evmInterpreter = NewEVMInterpreter(env, env.Config()) ) env.interpreter = evmInterpreter mem.Resize(32) @@ -585,7 +585,7 @@ func BenchmarkOpSHA3(bench *testing.B) { bench.ResetTimer() for i := 0; i < bench.N; i++ { stack.PushN(*uint256.NewInt(32), *start) - opSha3(&pc, evmInterpreter, &callCtx{mem, stack, nil}) + opSha3(&pc, evmInterpreter, &ScopeContext{mem, stack, nil}) } } diff --git a/core/vm/interface.go b/core/vm/interface.go index f03fd8220c1..e2c0cc61c66 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -19,6 +19,8 @@ package vm import ( "math/big" + "github.com/ledgerwatch/erigon/params" + "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" @@ -87,3 +89,15 @@ type CallContext interface { // Create a new contract Create(env *EVM, me ContractRef, data []byte, gas, value *big.Int) ([]byte, common.Address, error) } + +type VMInterface interface { + Reset(txCtx TxContext, ibs IntraBlockState) + Create(caller ContractRef, code []byte, gas uint64, value *uint256.Int) (ret []byte, contractAddr common.Address, leftOverGas uint64, err error) + Call(caller ContractRef, addr common.Address, input []byte, gas uint64, value *uint256.Int, bailout bool) (ret []byte, leftOverGas uint64, err error) + Config() Config + ChainConfig() *params.ChainConfig + ChainRules() *params.Rules + Context() BlockContext + IntraBlockState() IntraBlockState + TxContext() TxContext +} diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 78b3e035870..01914913238 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -51,12 +51,12 @@ type Interpreter interface { Run(contract *Contract, input []byte, static bool) ([]byte, error) } -// callCtx contains the things that are per-call, such as stack and memory, +// ScopeContext contains the things that are per-call, such as stack and memory, // but not transients like pc and gas -type callCtx struct { - memory *Memory - stack *stack.Stack - contract *Contract +type ScopeContext struct { + Memory *Memory + Stack *stack.Stack + Contract *Contract } // keccakState wraps sha3.state. In addition to the usual hash methods, it also supports @@ -69,11 +69,16 @@ type keccakState interface { // EVMInterpreter represents an EVM interpreter type EVMInterpreter struct { + *VM + jt *JumpTable // EVM instruction table +} + +//structcheck doesn't see embedding +//nolint:structcheck +type VM struct { evm *EVM cfg Config - jt *JumpTable // EVM instruction table - hasher keccakState // Keccak256 hasher instance shared across opcodes hasherBuf common.Hash // Keccak256 hasher result array shared across opcodes @@ -85,21 +90,21 @@ type EVMInterpreter struct { func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { var jt *JumpTable switch { - case evm.ChainRules.IsLondon: + case evm.ChainRules().IsLondon: jt = &londonInstructionSet - case evm.ChainRules.IsBerlin: + case evm.ChainRules().IsBerlin: jt = &berlinInstructionSet - case evm.ChainRules.IsIstanbul: + case evm.ChainRules().IsIstanbul: jt = &istanbulInstructionSet - case evm.ChainRules.IsConstantinople: + case evm.ChainRules().IsConstantinople: jt = &constantinopleInstructionSet - case evm.ChainRules.IsByzantium: + case evm.ChainRules().IsByzantium: jt = &byzantiumInstructionSet - case evm.ChainRules.IsEIP158: + case evm.ChainRules().IsSpuriousDragon: jt = &spuriousDragonInstructionSet - case evm.ChainRules.IsEIP150: + case evm.ChainRules().IsTangerineWhistle: jt = &tangerineWhistleInstructionSet - case evm.ChainRules.IsHomestead: + case evm.ChainRules().IsHomestead: jt = &homesteadInstructionSet default: jt = &frontierInstructionSet @@ -109,15 +114,55 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { if err := EnableEIP(eip, jt); err != nil { // Disable it, so caller can check if it's activated or not cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...) - log.Error("EIP activation failed", "eip", eip, "error", err) + log.Error("EIP activation failed", "eip", eip, "err", err) } } } return &EVMInterpreter{ - evm: evm, - cfg: cfg, - jt: jt, + VM: &VM{ + evm: evm, + cfg: cfg, + }, + jt: jt, + } +} + +func NewEVMInterpreterByVM(vm *VM) *EVMInterpreter { + var jt *JumpTable + switch { + case vm.evm.ChainRules().IsLondon: + jt = &londonInstructionSet + case vm.evm.ChainRules().IsBerlin: + jt = &berlinInstructionSet + case vm.evm.ChainRules().IsIstanbul: + jt = &istanbulInstructionSet + case vm.evm.ChainRules().IsConstantinople: + jt = &constantinopleInstructionSet + case vm.evm.ChainRules().IsByzantium: + jt = &byzantiumInstructionSet + case vm.evm.ChainRules().IsSpuriousDragon: + jt = &spuriousDragonInstructionSet + case vm.evm.ChainRules().IsTangerineWhistle: + jt = &tangerineWhistleInstructionSet + case vm.evm.ChainRules().IsHomestead: + jt = &homesteadInstructionSet + default: + jt = &frontierInstructionSet + } + if len(vm.cfg.ExtraEips) > 0 { + for i, eip := range vm.cfg.ExtraEips { + if err := EnableEIP(eip, jt); err != nil { + // Disable it, so caller can check if it's activated or not + vm.cfg.ExtraEips = append(vm.cfg.ExtraEips[:i], vm.cfg.ExtraEips[i+1:]...) + log.Error("EIP activation failed", "eip", eip, "err", err) + } + } + } + + return &EVMInterpreter{ + VM: vm, + jt: jt, } } @@ -134,10 +179,10 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( // Make sure the readOnly is only set if we aren't in readOnly yet. // This makes also sure that the readOnly flag isn't removed for child calls. - if readOnly && !in.readOnly { - in.readOnly = true - defer func() { in.readOnly = false }() - } + callback := in.setReadonly(readOnly) + defer func() { + callback() + }() // Reset the previous call's return data. It's unimportant to preserve the old buffer // as every returning call will return new data anyway. @@ -152,10 +197,10 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( op OpCode // current opcode mem = NewMemory() // bound memory locStack = stack.New() - callContext = &callCtx{ - memory: mem, - stack: locStack, - contract: contract, + callContext = &ScopeContext{ + Memory: mem, + Stack: locStack, + Contract: contract, } // For optimisation reason we're using uint64 as the program counter. // It's theoretically possible to go above 2^64. The YP defines the PC @@ -180,9 +225,9 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( defer func() { if err != nil { if !logged { - in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, mem, locStack, in.returnData, contract, in.evm.depth, err) //nolint:errcheck + in.cfg.Tracer.CaptureState(in.evm, pcCopy, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) //nolint:errcheck } else { - _ = in.cfg.Tracer.CaptureFault(in.evm, pcCopy, op, gasCopy, cost, mem, locStack, contract, in.evm.depth, err) + in.cfg.Tracer.CaptureFault(in.evm, pcCopy, op, gasCopy, cost, callContext, in.evm.depth, err) } } }() @@ -217,13 +262,13 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( return nil, &ErrStackOverflow{stackLen: sLen, limit: operation.maxStack} } // If the operation is valid, enforce and write restrictions - if in.readOnly && in.evm.ChainRules.IsByzantium { + if in.readOnly && in.evm.ChainRules().IsByzantium { // If the interpreter is operating in readonly mode, make sure no // state-modifying operation is performed. The 3rd stack item // for a call operation is the value. Transferring value from one // account to the others means the state is modified and should also // return with an error. - if operation.writes || (op == CALL && locStack.Back(2).Sign() != 0) { + if operation.writes || (op == CALL && !locStack.Back(2).IsZero()) { return nil, ErrWriteProtection } } @@ -265,7 +310,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( } if in.cfg.Debug { - in.cfg.Tracer.CaptureState(in.evm, pc, op, gasCopy, cost, mem, locStack, in.returnData, contract, in.evm.depth, err) //nolint:errcheck + in.cfg.Tracer.CaptureState(in.evm, pc, op, gasCopy, cost, callContext, in.returnData, in.evm.depth, err) //nolint:errcheck logged = true } @@ -274,7 +319,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( // if the operation clears the return data (e.g. it has returning data) // set the last return to the result of the operation. if operation.returns { - in.returnData = common.CopyBytes(res) + in.returnData = res } switch { @@ -290,3 +335,17 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( } return nil, nil } + +func (vm *VM) setReadonly(outerReadonly bool) func() { + if outerReadonly && !vm.readOnly { + vm.readOnly = true + return func() { + vm.readOnly = false + } + } + return func() {} +} + +func (vm *VM) getReadonly() bool { + return vm.readOnly +} diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index 17afc897cbb..4f4d514e3ac 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -22,7 +22,7 @@ import ( ) type ( - executionFunc func(pc *uint64, interpreter *EVMInterpreter, callContext *callCtx) ([]byte, error) + executionFunc func(pc *uint64, interpreter *EVMInterpreter, callContext *ScopeContext) ([]byte, error) gasFunc func(*EVM, *Contract, *stack.Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 // memorySizeFunc returns the required size, and whether the operation overflowed a uint64 memorySizeFunc func(*stack.Stack) (size uint64, overflow bool) @@ -200,7 +200,7 @@ func newByzantiumInstructionSet() JumpTable { // EIP 158 a.k.a Spurious Dragon func newSpuriousDragonInstructionSet() JumpTable { instructionSet := newTangerineWhistleInstructionSet() - instructionSet[EXP].dynamicGas = gasExpEIP158 + instructionSet[EXP].dynamicGas = gasExpEIP160 return instructionSet } diff --git a/core/vm/lightclient/iavl/.gitignore b/core/vm/lightclient/iavl/.gitignore new file mode 100644 index 00000000000..dff7e1bb135 --- /dev/null +++ b/core/vm/lightclient/iavl/.gitignore @@ -0,0 +1,14 @@ +vendor +.glide +*.swp +*.swo + +# created in test code +test.db + +# profiling data +*\.test +cpu*.out +mem*.out +cpu*.pdf +mem*.pdf diff --git a/core/vm/lightclient/iavl/CHANGELOG.md b/core/vm/lightclient/iavl/CHANGELOG.md new file mode 100644 index 00000000000..918f98739b7 --- /dev/null +++ b/core/vm/lightclient/iavl/CHANGELOG.md @@ -0,0 +1,150 @@ +# Changelog + +## 0.12.0 (November 26, 2018) + +BREAKING CHANGES + +- Uses new Tendermint ReverseIterator API. See https://github.com/tendermint/tendermint/pull/2913 + +## 0.11.1 (October 29, 2018) + +IMPROVEMENTS + +- Uses GoAmino v0.14 + +## 0.11.0 (September 7, 2018) + +BREAKING CHANGES + +- Changed internal database key format to store int64 key components in a full 8-byte fixed width ([#107]) +- Removed some architecture dependent methods (e.g., use `Get` instead of `Get64` etc) ([#96]) + +IMPROVEMENTS + +- Database key format avoids use of fmt.Sprintf fmt.Sscanf leading to ~10% speedup in benchmark BenchmarkTreeLoadAndDelete ([#107], thanks to [@silasdavis]) + +[#107]: https://github.com/tendermint/iavl/pull/107 +[@silasdavis]: https://github.com/silasdavis +[#96]: https://github.com/tendermint/iavl/pull/96 + +## 0.10.0 + +BREAKING CHANGES + +- refactored API for clean separation of [mutable][1] and [immutable][2] tree (#92, #88); +with possibility to: + - load read-only snapshots at previous versions on demand + - load mutable trees at the most recently saved tree + +[1]: https://github.com/tendermint/iavl/blob/9e62436856efa94c1223043be36ebda01ae0b6fc/mutable_tree.go#L14-L21 +[2]: https://github.com/tendermint/iavl/blob/9e62436856efa94c1223043be36ebda01ae0b6fc/immutable_tree.go#L10-L17 + +BUG FIXES + +- remove memory leaks (#92) + +IMPROVEMENTS + +- Change tendermint dep to ^v0.22.0 (#91) + +## 0.10.0 (July 11, 2018) + +BREAKING CHANGES + +- getRangeProof and Get\[Versioned\]\[Range\]WithProof return nil proof/error if tree is empty. + +## 0.9.2 (July 3, 2018) + +IMPROVEMENTS + +- some minor changes: mainly lints, updated parts of documentation, unexported some helpers (#80) + +## 0.9.1 (July 1, 2018) + +IMPROVEMENTS + +- RangeProof.ComputeRootHash() to compute root rather than provide as in Verify(hash) +- RangeProof.Verify\*() first require .Verify(root), which memoizes + +## 0.9.0 (July 1, 2018) + +BREAKING CHANGES + +- RangeProof.VerifyItem doesn't require an index. +- Only return values in range when getting proof. +- Return keys as well. + +BUG FIXES + +- traversal bugs in traverseRange. + +## 0.8.2 + +* Swap `tmlibs` for `tendermint/libs` +* Remove `sha256truncated` in favour of `tendermint/crypto/tmhash` - same hash + function but technically a breaking change to the API, though unlikely to effect anyone. + +NOTE this means IAVL is now dependent on Tendermint Core for the libs (since it +makes heavy use of the `db` package). Ideally, that dependency would be +abstracted away, and/or this repo will be merged into the Cosmos-SDK, which is +currently is primary consumer. Once it achieves greater stability, we could +consider breaking it out into it's own repo again. + +## 0.8.1 + +*July 1st, 2018* + +BUG FIXES + +- fix bug in iterator going outside its range + +## 0.8.0 (June 24, 2018) + +BREAKING CHANGES + +- Nodes are encoded using proto3/amino style integers and byte slices (ie. varints and + varint prefixed byte slices) +- Unified RangeProof +- Proofs are encoded using Amino +- Hash function changed from RIPEMD160 to the first 20 bytes of SHA256 output + +## 0.7.0 (March 21, 2018) + +BREAKING CHANGES + +- LoadVersion and Load return the loaded version number + - NOTE: this behaviour was lost previously and we failed to document in changelog, + but now it's back :) + +## 0.6.1 (March 2, 2018) + +IMPROVEMENT + +- Remove spurious print statement from LoadVersion + +## 0.6.0 (March 2, 2018) + +BREAKING CHANGES + +- NewTree order of arguments swapped +- int -> int64, uint64 -> int64 +- NewNode takes a version +- Node serialization format changed so version is written right after size +- SaveVersion takes no args (auto increments) +- tree.Get -> tree.Get64 +- nodeDB.SaveBranch does not take a callback +- orphaningTree.SaveVersion -> SaveAs +- proofInnerNode includes Version +- ReadKeyXxxProof consolidated into ReadKeyProof +- KeyAbsentProof doesn't include Version +- KeyRangeProof.Version -> Versions + +FEATURES + +- Implement chunking algorithm to serialize entire tree + +## 0.5.0 (October 27, 2017) + +First versioned release! +(Originally accidentally released as v0.2.0) + diff --git a/core/vm/lightclient/iavl/CONTRIBUTING.md b/core/vm/lightclient/iavl/CONTRIBUTING.md new file mode 100644 index 00000000000..c1cdd5283be --- /dev/null +++ b/core/vm/lightclient/iavl/CONTRIBUTING.md @@ -0,0 +1,8 @@ +# Contributing + +Thank you for considering making contributions to IAVL+! +This repository follows the [contribution guidelines] of tendermint and the corresponding [coding repo]. +Please take a look if you are not already familiar with those. + +[contribution guidelines]: https://github.com/tendermint/tendermint/blob/master/CONTRIBUTING.md +[coding repo]: https://github.com/tendermint/coding diff --git a/core/vm/lightclient/iavl/LICENSE b/core/vm/lightclient/iavl/LICENSE new file mode 100644 index 00000000000..bf0c346e6b7 --- /dev/null +++ b/core/vm/lightclient/iavl/LICENSE @@ -0,0 +1,193 @@ +Tendermint iavl +Copyright (C) 2015 Tendermint + + + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + 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 + + https://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. diff --git a/core/vm/lightclient/iavl/Makefile b/core/vm/lightclient/iavl/Makefile new file mode 100644 index 00000000000..8d4c774b8ae --- /dev/null +++ b/core/vm/lightclient/iavl/Makefile @@ -0,0 +1,54 @@ +GOTOOLS := github.com/golang/dep/cmd/dep + +PDFFLAGS := -pdf --nodefraction=0.1 + +all: get_vendor_deps test + +test: + GOCACHE=off go test -v --race + +tools: + go get -u -v $(GOTOOLS) + +get_vendor_deps: tools + dep ensure + +# bench is the basic tests that shouldn't crash an aws instance +bench: + cd benchmarks && \ + go test -bench=RandomBytes . && \ + go test -bench=Small . && \ + go test -bench=Medium . && \ + go test -bench=BenchmarkMemKeySizes . + +# fullbench is extra tests needing lots of memory and to run locally +fullbench: + cd benchmarks && \ + go test -bench=RandomBytes . && \ + go test -bench=Small . && \ + go test -bench=Medium . && \ + go test -timeout=30m -bench=Large . && \ + go test -bench=Mem . && \ + go test -timeout=60m -bench=LevelDB . + + +# note that this just profiles the in-memory version, not persistence +profile: + cd benchmarks && \ + go test -bench=Mem -cpuprofile=cpu.out -memprofile=mem.out . && \ + go tool pprof ${PDFFLAGS} benchmarks.test cpu.out > cpu.pdf && \ + go tool pprof --alloc_space ${PDFFLAGS} benchmarks.test mem.out > mem_space.pdf && \ + go tool pprof --alloc_objects ${PDFFLAGS} benchmarks.test mem.out > mem_obj.pdf + +explorecpu: + cd benchmarks && \ + go tool pprof benchmarks.test cpu.out + +exploremem: + cd benchmarks && \ + go tool pprof --alloc_objects benchmarks.test mem.out + +delve: + dlv test ./benchmarks -- -test.bench=. + +.PHONY: all test tools diff --git a/core/vm/lightclient/iavl/PERFORMANCE.md b/core/vm/lightclient/iavl/PERFORMANCE.md new file mode 100644 index 00000000000..b1acdd932b5 --- /dev/null +++ b/core/vm/lightclient/iavl/PERFORMANCE.md @@ -0,0 +1,111 @@ +# Performance + +After some discussion with Jae on the usability, it seems performance is a big concern. If every write takes around 1ms, that puts a serious upper limit on the speed of the consensus engine (especially since with the check/tx dichotomy, we need at least two writes (to cache, only one to disk) and likely two or more queries to handle any transaction). + +As Jae notes: for CheckTx, a copy of IAVLTree doesn't need to be saved. During CheckTx it'll load inner nodes into the cache. The cache is shared w/ the AppendTx state IAVLTree, so during AppendTx we should save some time. There would only be 1 set of writes. Also, there's quite a bit of free time in between blocks as provided by Tendermint, during which CheckTx can run priming the cache, so hopefully this helps as well. + +Jae: That said, I'm not sure exactly what the tx throughput would be during normal running times. I'm hoping that we can have e.g. 3 second blocks w/ say over a hundred txs per sec per block w/ 1 million items. That will get us through for some time, but that time is limited. + +Ethan: I agree, and think this works now with goleveldb backing on most host machines. For public chains, maybe it is desired to push 1000 tx every 3 sec to a block, with a db size of 1 billion items. 10x the throughput with 1000x the data. That could be a long-term goal, and would scale to the cosmos and beyond. + +## Plan + +For any goal, we need some clear steps. + +1) Cleanup code, and write some more benchmark cases to capture "realistic" usage +2) Run tests on various hardware to see the best performing backing stores +3) Do profiling on the best performance to see if there are any easy performance gains +4) (Possibly) Write another implementation of merkle.Tree to improve all the memory overhead, consider CPU cache, etc.... +5) (Possibly) Write another backend datastore to persist the tree in a more efficient way + +The rest of this document is the planned or completed actions for the above-listed steps. + +## Cleanup + +Done in branch `cleanup_deps`: + * Fixed up dependeny management (tmlibs/db etc in glide/vendor) + * Updated Makefile (test, bench, get_deps) + * Fixed broken code - `looper.go` and one benchmark didn't run + +Benchmarks should be parameterized on: + 1) storage implementation + 2) initial data size + 3) length of keys + 4) length of data + 5) block size (frequency of copy/hash...) +Thus, we would see the same benchmark run against memdb with 100K items, goleveldb with 100K, leveldb with 100K, memdb with 10K, goleveldb with 10K... + +Scenarios to run after db is set up. + * Pure query time (known/hits, vs. random/misses) + * Write timing (known/updates, vs. random/inserts) + * Delete timing (existing keys only) + * TMSP Usage: + * For each block size: + * 2x copy "last commit" -> check and real + * repeat for each tx: + * (50% update + 50% insert?) + * query + insert/update in check + * query + insert/update in real + * get hash + * save real + * real -> "last commit" + + +## Benchmarks + +After writing the benchmarks, we can run them under various environments and store the results under benchmarks directory. Some useful environments to test: + + * Dev machines + * Digital ocean small/large machine + * Various AWS setups + +Please run the benchmark on more machines and add the result. Just type: `make record` in the directory and wait a (long) while (with little other load on the machine). + +This will require also a quick setup script to install go and run tests in these environments. Maybe some scripts even. Also, this will produce a lot of files and we may have to graph them to see something useful... + +But for starting, my laptop, and one digital ocean and one aws server should be sufficient. At least to find the winner, before profiling. + + +## Profiling + +Once we figure out which current implementation looks fastest, let's profile it to make it even faster. It is great to optimize the memdb code to really speed up the hashing and tree-building logic. And then focus on the backend implementation to optimize the disk storage, which will be the next major pain point. + +Some guides: + + * [Profiling benchmarks locally](https://medium.com/@hackintoshrao/daily-code-optimization-using-benchmarks-and-profiling-in-golang-gophercon-india-2016-talk-874c8b4dc3c5#.jmnd8w2qr) + * [On optimizing memory](https://signalfx.com/blog/a-pattern-for-optimizing-go-2/) + * [Profiling running programs](http://blog.ralch.com/tutorial/golang-performance-and-memory-analysis/) + * [Dave Chenny's profiler pkg](https://github.com/pkg/profile) + +Some ideas for speedups: + + * [Speedup SHA256 100x on ARM](https://blog.minio.io/accelerating-sha256-by-100x-in-golang-on-arm-1517225f5ff4#.pybt7bb3w) + * [Faster SHA256 golang implementation](https://github.com/minio/sha256-simd) + * [Data structure alignment](http://stackoverflow.com/questions/39063530/optimising-datastructure-word-alignment-padding-in-golang) + * [Slice alignment](http://blog.chewxy.com/2016/07/25/on-the-memory-alignment-of-go-slice-values/) + * [Tool to analyze your structs](https://github.com/dominikh/go-structlayout) + +## Tree Re-implementation + +If we want to copy lots of objects, it becomes better to think of using memcpy on large (eg. 4-16KB) buffers than copying individual structs. We also could allocate arrays of structs and align them to remove a lot of memory management and gc overhead. That means going down to some C-level coding... + +Some links for thought: + + * [Array representation of a binary tree](http://www.cse.hut.fi/en/research/SVG/TRAKLA2/tutorials/heap_tutorial/taulukkona.html) + * [Memcpy buffer size timing](http://stackoverflow.com/questions/21038965/why-does-the-speed-of-memcpy-drop-dramatically-every-4kb) + * [Calling memcpy from go](https://github.com/jsgilmore/shm/blob/master/memcpy.go) + * [Unsafe docs](https://godoc.org/unsafe) + * [...and how to use it](https://copyninja.info/blog/workaround-gotypesystems.html) + * [Or maybe just plain copy...](https://godoc.org/builtin#copy) + +## Backend implementation + +Storing each link in the tree in leveldb treats each node as an isolated item. Since we know some usage patterns (when a parent is hit, very likely one child will be hit), we could try to organize the memory and disk location of the nodes ourselves to make it more efficient. Or course, this could be a long, slippery slope. + +Inspired by the [Array representation](http://www.cse.hut.fi/en/research/SVG/TRAKLA2/tutorials/heap_tutorial/taulukkona.html) link above, we could consider other layouts for the nodes. For example, rather than store them alone, or the entire tree in one big array, the nodes could be placed in groups of 15 based on the parent (parent and 3 generations of children). Then we have 4 levels before jumping to another location. Maybe we just store this larger chunk as one leveldb location, or really try to do the mmap ourselves... + +In any case, assuming around 100 bytes for one non-leaf node (3 sha hashes, plus prefix, plus other data), 15 nodes would be a little less than 2K, maybe even go one more level to 31 nodes and 3-4KB, where we could take best advantage of the memory/disk page size. + +Some links for thought: + + * [Memory mapped files](https://github.com/edsrzf/mmap-go) diff --git a/core/vm/lightclient/iavl/POEM b/core/vm/lightclient/iavl/POEM new file mode 100644 index 00000000000..f361067a4da --- /dev/null +++ b/core/vm/lightclient/iavl/POEM @@ -0,0 +1,29 @@ +writing down, my checksum +waiting for the, data to come +no need to pray for integrity +thats cuz I use, a merkle tree + +grab the root, with a quick hash run +if the hash works out, +it must have been done + +theres no need, for trust to arise +thanks to the crypto +now that I can merkleyes + +take that data, merklize +ye, I merklize ... + +then the truth, begins to shine +the inverse of a hash, you will never find +and as I watch, the dataset grow +producing a proof, is never slow + +Where do I find, the will to hash +How do I teach it? +It doesn't pay in cash +Bitcoin, here, I've realized +Thats what I need now, +cuz real currencies merklize + +-EB diff --git a/core/vm/lightclient/iavl/README.md b/core/vm/lightclient/iavl/README.md new file mode 100644 index 00000000000..bb617d9b853 --- /dev/null +++ b/core/vm/lightclient/iavl/README.md @@ -0,0 +1,13 @@ +## IAVL+ Tree + +**Note: Requires Go 1.8+** + +A versioned, snapshottable (immutable) AVL+ tree for persistent data. + +The purpose of this data structure is to provide persistent storage for key-value pairs (say to store account balances) such that a deterministic merkle root hash can be computed. The tree is balanced using a variant of the [AVL algorithm](http://en.wikipedia.org/wiki/AVL_tree) so all operations are O(log(n)). + +Nodes of this tree are immutable and indexed by their hash. Thus any node serves as an immutable snapshot which lets us stage uncommitted transactions from the mempool cheaply, and we can instantly roll back to the last committed state to process transactions of a newly committed block (which may not be the same set of transactions as those from the mempool). + +In an AVL tree, the heights of the two child subtrees of any node differ by at most one. Whenever this condition is violated upon an update, the tree is rebalanced by creating O(log(n)) new nodes that point to unmodified nodes of the old tree. In the original AVL algorithm, inner nodes can also hold key-value pairs. The AVL+ algorithm (note the plus) modifies the AVL algorithm to keep all values on leaf nodes, while only using branch-nodes to store keys. This simplifies the algorithm while keeping the merkle hash trail short. + +In Ethereum, the analog is [Patricia tries](http://en.wikipedia.org/wiki/Radix_tree). There are tradeoffs. Keys do not need to be hashed prior to insertion in IAVL+ trees, so this provides faster iteration in the key space which may benefit some applications. The logic is simpler to implement, requiring only two types of nodes -- inner nodes and leaf nodes. On the other hand, while IAVL+ trees provide a deterministic merkle root hash, it depends on the order of transactions. In practice this shouldn't be a problem, since you can efficiently encode the tree structure when serializing the tree contents. diff --git a/core/vm/lightclient/iavl/doc.go b/core/vm/lightclient/iavl/doc.go new file mode 100644 index 00000000000..7751bccadd2 --- /dev/null +++ b/core/vm/lightclient/iavl/doc.go @@ -0,0 +1,49 @@ +// Package iavl implements a versioned, snapshottable (immutable) AVL+ tree +// for persisting key-value pairs. +// +// +// Basic usage of MutableTree. +// +// import "github.com/tendermint/iavl" +// import "github.com/tendermint/tendermint/libs/db" +// ... +// +// tree := iavl.NewMutableTree(db.NewMemDB(), 128) +// +// tree.IsEmpty() // true +// +// tree.Set([]byte("alice"), []byte("abc")) +// tree.SaveVersion(1) +// +// tree.Set([]byte("alice"), []byte("xyz")) +// tree.Set([]byte("bob"), []byte("xyz")) +// tree.SaveVersion(2) +// +// tree.LatestVersion() // 2 +// +// tree.GetVersioned([]byte("alice"), 1) // "abc" +// tree.GetVersioned([]byte("alice"), 2) // "xyz" +// +// Proof of existence: +// +// root := tree.Hash() +// val, proof, err := tree.GetVersionedWithProof([]byte("bob"), 2) // "xyz", RangeProof, nil +// proof.Verify([]byte("bob"), val, root) // nil +// +// Proof of absence: +// +// _, proof, err = tree.GetVersionedWithProof([]byte("tom"), 2) // nil, RangeProof, nil +// proof.Verify([]byte("tom"), nil, root) // nil +// +// Now we delete an old version: +// +// tree.DeleteVersion(1) +// tree.VersionExists(1) // false +// tree.Get([]byte("alice")) // "xyz" +// tree.GetVersioned([]byte("alice"), 1) // nil +// +// Can't create a proof of absence for a version we no longer have: +// +// _, proof, err = tree.GetVersionedWithProof([]byte("tom"), 1) // nil, nil, error +// +package iavl diff --git a/core/vm/lightclient/iavl/key_format.go b/core/vm/lightclient/iavl/key_format.go new file mode 100644 index 00000000000..b63f9ea7b38 --- /dev/null +++ b/core/vm/lightclient/iavl/key_format.go @@ -0,0 +1,144 @@ +package iavl + +import ( + "encoding/binary" + "fmt" +) + +// Provides a fixed-width lexicographically sortable []byte key format +type KeyFormat struct { + prefix byte + layout []int + length int +} + +// Create a []byte key format based on a single byte prefix and fixed width key segments each of whose length is +// specified by by the corresponding element of layout. +// +// For example, to store keys that could index some objects by a version number and their SHA256 hash using the form: +// 'c' then you would define the KeyFormat with: +// +// var keyFormat = NewKeyFormat('c', 8, 32) +// +// Then you can create a key with: +// +// func ObjectKey(version uint64, objectBytes []byte) []byte { +// hasher := sha256.New() +// hasher.Sum(nil) +// return keyFormat.Key(version, hasher.Sum(nil)) +// } +func NewKeyFormat(prefix byte, layout ...int) *KeyFormat { + // For prefix byte + length := 1 + for _, l := range layout { + length += int(l) + } + return &KeyFormat{ + prefix: prefix, + layout: layout, + length: length, + } +} + +// Format the byte segments into the key format - will panic if the segment lengths do not match the layout. +func (kf *KeyFormat) KeyBytes(segments ...[]byte) []byte { + key := make([]byte, kf.length) + key[0] = kf.prefix + n := 1 + for i, s := range segments { + l := kf.layout[i] + if len(s) > l { + panic(fmt.Errorf("length of segment %X provided to KeyFormat.KeyBytes() is longer than the %d bytes "+ + "required by layout for segment %d", s, l, i)) + } + n += l + // Big endian so pad on left if not given the full width for this segment + copy(key[n-len(s):n], s) + } + return key[:n] +} + +// Format the args passed into the key format - will panic if the arguments passed do not match the length +// of the segment to which they correspond. When called with no arguments returns the raw prefix (useful as a start +// element of the entire keys space when sorted lexicographically). +func (kf *KeyFormat) Key(args ...interface{}) []byte { + if len(args) > len(kf.layout) { + panic(fmt.Errorf("KeyFormat.Key() is provided with %d args but format only has %d segments", + len(args), len(kf.layout))) + } + segments := make([][]byte, len(args)) + for i, a := range args { + segments[i] = format(a) + } + return kf.KeyBytes(segments...) +} + +// Reads out the bytes associated with each segment of the key format from key. +func (kf *KeyFormat) ScanBytes(key []byte) [][]byte { + segments := make([][]byte, len(kf.layout)) + n := 1 + for i, l := range kf.layout { + n += l + if n > len(key) { + return segments[:i] + } + segments[i] = key[n-l : n] + } + return segments +} + +// Extracts the segments into the values pointed to by each of args. Each arg must be a pointer to int64, uint64, or +// []byte, and the width of the args must match layout. +func (kf *KeyFormat) Scan(key []byte, args ...interface{}) { + segments := kf.ScanBytes(key) + if len(args) > len(segments) { + panic(fmt.Errorf("KeyFormat.Scan() is provided with %d args but format only has %d segments in key %X", + len(args), len(segments), key)) + } + for i, a := range args { + scan(a, segments[i]) + } +} + +// Return the prefix as a string. +func (kf *KeyFormat) Prefix() string { + return string([]byte{kf.prefix}) +} + +func scan(a interface{}, value []byte) { + switch v := a.(type) { + case *int64: + // Negative values will be mapped correctly when read in as uint64 and then type converted + *v = int64(binary.BigEndian.Uint64(value)) + case *uint64: + *v = binary.BigEndian.Uint64(value) + case *[]byte: + *v = value + default: + panic(fmt.Errorf("KeyFormat scan() does not support scanning value of type %T: %v", a, a)) + } +} + +func format(a interface{}) []byte { + switch v := a.(type) { + case uint64: + return formatUint64(v) + case int64: + return formatUint64(uint64(v)) + // Provide formatting from int,uint as a convenience to avoid casting arguments + case uint: + return formatUint64(uint64(v)) + case int: + return formatUint64(uint64(v)) + case []byte: + return v + default: + panic(fmt.Errorf("KeyFormat format() does not support formatting value of type %T: %v", a, a)) + } +} + +func formatUint64(v uint64) []byte { + bs := make([]byte, 8) + binary.BigEndian.PutUint64(bs, v) + return bs +} diff --git a/core/vm/lightclient/iavl/key_format_test.go b/core/vm/lightclient/iavl/key_format_test.go new file mode 100644 index 00000000000..b6ea3010d2f --- /dev/null +++ b/core/vm/lightclient/iavl/key_format_test.go @@ -0,0 +1,70 @@ +package iavl + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestKeyFormatBytes(t *testing.T) { + kf := NewKeyFormat(byte('e'), 8, 8, 8) + assert.Equal(t, []byte{'e', 0, 0, 0, 0, 0, 1, 2, 3}, kf.KeyBytes([]byte{1, 2, 3})) + assert.Equal(t, []byte{'e', 1, 2, 3, 4, 5, 6, 7, 8}, kf.KeyBytes([]byte{1, 2, 3, 4, 5, 6, 7, 8})) + assert.Equal(t, []byte{'e', 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 1, 1, 2, 2, 3, 3}, + kf.KeyBytes([]byte{1, 2, 3, 4, 5, 6, 7, 8}, []byte{1, 2, 3, 4, 5, 6, 7, 8}, []byte{1, 1, 2, 2, 3, 3})) + assert.Equal(t, []byte{'e'}, kf.KeyBytes()) +} + +func TestKeyFormat(t *testing.T) { + kf := NewKeyFormat(byte('e'), 8, 8, 8) + key := []byte{'e', 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 1, 144} + var a, b, c int64 = 100, 200, 400 + assert.Equal(t, key, kf.Key(a, b, c)) + + var ao, bo, co = new(int64), new(int64), new(int64) + kf.Scan(key, ao, bo, co) + assert.Equal(t, a, *ao) + assert.Equal(t, b, *bo) + assert.Equal(t, c, *co) + + bs := new([]byte) + kf.Scan(key, ao, bo, bs) + assert.Equal(t, a, *ao) + assert.Equal(t, b, *bo) + assert.Equal(t, []byte{0, 0, 0, 0, 0, 0, 1, 144}, *bs) + + assert.Equal(t, []byte{'e', 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 200}, kf.Key(a, b)) +} + +func TestNegativeKeys(t *testing.T) { + kf := NewKeyFormat(byte('e'), 8, 8) + + var a, b int64 = -100, -200 + // One's complement plus one + key := []byte{'e', + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, byte(0xff + a + 1), + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, byte(0xff + b + 1)} + assert.Equal(t, key, kf.Key(a, b)) + + var ao, bo = new(int64), new(int64) + kf.Scan(key, ao, bo) + assert.Equal(t, a, *ao) + assert.Equal(t, b, *bo) +} + +func TestOverflow(t *testing.T) { + kf := NewKeyFormat(byte('o'), 8, 8) + + var a int64 = 1 << 62 + var b uint64 = 1 << 63 + key := []byte{'o', + 0x40, 0, 0, 0, 0, 0, 0, 0, + 0x80, 0, 0, 0, 0, 0, 0, 0, + } + assert.Equal(t, key, kf.Key(a, b)) + + var ao, bo = new(int64), new(int64) + kf.Scan(key, ao, bo) + assert.Equal(t, a, *ao) + assert.Equal(t, int64(b), *bo) +} diff --git a/core/vm/lightclient/iavl/proof.go b/core/vm/lightclient/iavl/proof.go new file mode 100644 index 00000000000..585c9748823 --- /dev/null +++ b/core/vm/lightclient/iavl/proof.go @@ -0,0 +1,135 @@ +package iavl + +import ( + "bytes" + "fmt" + + "github.com/tendermint/go-amino" + "github.com/tendermint/tendermint/crypto/tmhash" + cmn "github.com/tendermint/tendermint/libs/common" +) + +var ( + // ErrInvalidProof is returned by Verify when a proof cannot be validated. + ErrInvalidProof = fmt.Errorf("invalid proof") + + // ErrInvalidInputs is returned when the inputs passed to the function are invalid. + ErrInvalidInputs = fmt.Errorf("invalid inputs") + + // ErrInvalidRoot is returned when the root passed in does not match the proof's. + ErrInvalidRoot = fmt.Errorf("invalid root") +) + +//---------------------------------------- + +type proofInnerNode struct { + Height int8 `json:"height"` + Size int64 `json:"size"` + Version int64 `json:"version"` + Left []byte `json:"left"` + Right []byte `json:"right"` +} + +func (pin proofInnerNode) String() string { + return pin.stringIndented("") +} + +func (pin proofInnerNode) stringIndented(indent string) string { + return fmt.Sprintf(`proofInnerNode{ +%s Height: %v +%s Size: %v +%s Version: %v +%s Left: %X +%s Right: %X +%s}`, + indent, pin.Height, + indent, pin.Size, + indent, pin.Version, + indent, pin.Left, + indent, pin.Right, + indent) +} + +func (pin proofInnerNode) Hash(childHash []byte) []byte { + hasher := tmhash.New() + buf := new(bytes.Buffer) + + err := amino.EncodeInt8(buf, pin.Height) + if err == nil { + err = amino.EncodeVarint(buf, pin.Size) + } + if err == nil { + err = amino.EncodeVarint(buf, pin.Version) + } + + if len(pin.Left) == 0 { + if err == nil { + err = amino.EncodeByteSlice(buf, childHash) + } + if err == nil { + err = amino.EncodeByteSlice(buf, pin.Right) + } + } else { + if err == nil { + err = amino.EncodeByteSlice(buf, pin.Left) + } + if err == nil { + err = amino.EncodeByteSlice(buf, childHash) + } + } + if err != nil { + panic(fmt.Sprintf("Failed to hash proofInnerNode: %v", err)) + } + + hasher.Write(buf.Bytes()) + return hasher.Sum(nil) +} + +//---------------------------------------- + +type proofLeafNode struct { + Key cmn.HexBytes `json:"key"` + ValueHash cmn.HexBytes `json:"value"` + Version int64 `json:"version"` +} + +func (pln proofLeafNode) String() string { + return pln.stringIndented("") +} + +func (pln proofLeafNode) stringIndented(indent string) string { + return fmt.Sprintf(`proofLeafNode{ +%s Key: %v +%s ValueHash: %X +%s Version: %v +%s}`, + indent, pln.Key, + indent, pln.ValueHash, + indent, pln.Version, + indent) +} + +func (pln proofLeafNode) Hash() []byte { + hasher := tmhash.New() + buf := new(bytes.Buffer) + + err := amino.EncodeInt8(buf, 0) + if err == nil { + err = amino.EncodeVarint(buf, 1) + } + if err == nil { + err = amino.EncodeVarint(buf, pln.Version) + } + if err == nil { + err = amino.EncodeByteSlice(buf, pln.Key) + } + if err == nil { + err = amino.EncodeByteSlice(buf, pln.ValueHash) + } + if err != nil { + panic(fmt.Sprintf("Failed to hash proofLeafNode: %v", err)) + } + hasher.Write(buf.Bytes()) + + return hasher.Sum(nil) +} diff --git a/core/vm/lightclient/iavl/proof_iavl_absence.go b/core/vm/lightclient/iavl/proof_iavl_absence.go new file mode 100644 index 00000000000..88a6587aee3 --- /dev/null +++ b/core/vm/lightclient/iavl/proof_iavl_absence.go @@ -0,0 +1,87 @@ +package iavl + +import ( + "fmt" + + "github.com/tendermint/tendermint/crypto/merkle" + cmn "github.com/tendermint/tendermint/libs/common" +) + +const ProofOpIAVLAbsence = "iavl:a" + +// IAVLAbsenceOp takes a key as its only argument +// +// If the produced root hash matches the expected hash, the proof +// is good. +type IAVLAbsenceOp struct { + // Encoded in ProofOp.Key. + key []byte + + // To encode in ProofOp.Data. + // Proof is nil for an empty tree. + // The hash of an empty tree is nil. + Proof *RangeProof `json:"proof"` +} + +var _ merkle.ProofOperator = IAVLAbsenceOp{} + +func NewIAVLAbsenceOp(key []byte, proof *RangeProof) IAVLAbsenceOp { + return IAVLAbsenceOp{ + key: key, + Proof: proof, + } +} + +func IAVLAbsenceOpDecoder(pop merkle.ProofOp) (merkle.ProofOperator, error) { + if pop.Type != ProofOpIAVLAbsence { + return nil, cmn.NewError("unexpected ProofOp.Type; got %v, want %v", pop.Type, ProofOpIAVLAbsence) + } + var op IAVLAbsenceOp // a bit strange as we'll discard this, but it works. + err := cdc.UnmarshalBinaryLengthPrefixed(pop.Data, &op) + if err != nil { + return nil, cmn.ErrorWrap(err, "decoding ProofOp.Data into IAVLAbsenceOp") + } + return NewIAVLAbsenceOp(pop.Key, op.Proof), nil +} + +func (op IAVLAbsenceOp) ProofOp() merkle.ProofOp { + bz := cdc.MustMarshalBinaryLengthPrefixed(op) + return merkle.ProofOp{ + Type: ProofOpIAVLAbsence, + Key: op.key, + Data: bz, + } +} + +func (op IAVLAbsenceOp) String() string { + return fmt.Sprintf("IAVLAbsenceOp{%v}", op.GetKey()) +} + +func (op IAVLAbsenceOp) Run(args [][]byte) ([][]byte, error) { + if len(args) != 0 { + return nil, cmn.NewError("expected 0 args, got %v", len(args)) + } + // If the tree is nil, the proof is nil, and all keys are absent. + if op.Proof == nil { + return [][]byte{[]byte(nil)}, nil + } + // Compute the root hash and assume it is valid. + // The caller checks the ultimate root later. + root := op.Proof.ComputeRootHash() + err := op.Proof.Verify(root) + if err != nil { + return nil, cmn.ErrorWrap(err, "computing root hash") + } + // XXX What is the encoding for keys? + // We should decode the key depending on whether it's a string or hex, + // maybe based on quotes and 0x prefix? + err = op.Proof.VerifyAbsence([]byte(op.key)) + if err != nil { + return nil, cmn.ErrorWrap(err, "verifying absence") + } + return [][]byte{root}, nil +} + +func (op IAVLAbsenceOp) GetKey() []byte { + return op.key +} diff --git a/core/vm/lightclient/iavl/proof_iavl_value.go b/core/vm/lightclient/iavl/proof_iavl_value.go new file mode 100644 index 00000000000..df3c905ef8d --- /dev/null +++ b/core/vm/lightclient/iavl/proof_iavl_value.go @@ -0,0 +1,86 @@ +package iavl + +import ( + "fmt" + + "github.com/tendermint/tendermint/crypto/merkle" + cmn "github.com/tendermint/tendermint/libs/common" +) + +const ProofOpIAVLValue = "iavl:v" + +// IAVLValueOp takes a key and a single value as argument and +// produces the root hash. +// +// If the produced root hash matches the expected hash, the proof +// is good. +type IAVLValueOp struct { + // Encoded in ProofOp.Key. + key []byte + + // To encode in ProofOp.Data. + // Proof is nil for an empty tree. + // The hash of an empty tree is nil. + Proof *RangeProof `json:"proof"` +} + +var _ merkle.ProofOperator = IAVLValueOp{} + +func NewIAVLValueOp(key []byte, proof *RangeProof) IAVLValueOp { + return IAVLValueOp{ + key: key, + Proof: proof, + } +} + +func IAVLValueOpDecoder(pop merkle.ProofOp) (merkle.ProofOperator, error) { + if pop.Type != ProofOpIAVLValue { + return nil, cmn.NewError("unexpected ProofOp.Type; got %v, want %v", pop.Type, ProofOpIAVLValue) + } + var op IAVLValueOp // a bit strange as we'll discard this, but it works. + err := cdc.UnmarshalBinaryLengthPrefixed(pop.Data, &op) + if err != nil { + return nil, cmn.ErrorWrap(err, "decoding ProofOp.Data into IAVLValueOp") + } + return NewIAVLValueOp(pop.Key, op.Proof), nil +} + +func (op IAVLValueOp) ProofOp() merkle.ProofOp { + bz := cdc.MustMarshalBinaryLengthPrefixed(op) + return merkle.ProofOp{ + Type: ProofOpIAVLValue, + Key: op.key, + Data: bz, + } +} + +func (op IAVLValueOp) String() string { + return fmt.Sprintf("IAVLValueOp{%v}", op.GetKey()) +} + +func (op IAVLValueOp) Run(args [][]byte) ([][]byte, error) { + if len(args) != 1 { + return nil, cmn.NewError("Value size is not 1") + } + value := args[0] + + // Compute the root hash and assume it is valid. + // The caller checks the ultimate root later. + root := op.Proof.ComputeRootHash() + err := op.Proof.Verify(root) + if err != nil { + return nil, cmn.ErrorWrap(err, "computing root hash") + } + // XXX What is the encoding for keys? + // We should decode the key depending on whether it's a string or hex, + // maybe based on quotes and 0x prefix? + err = op.Proof.VerifyItem([]byte(op.key), value) + if err != nil { + return nil, cmn.ErrorWrap(err, "verifying value") + } + return [][]byte{root}, nil +} + +func (op IAVLValueOp) GetKey() []byte { + return op.key +} diff --git a/core/vm/lightclient/iavl/proof_path.go b/core/vm/lightclient/iavl/proof_path.go new file mode 100644 index 00000000000..de366f33813 --- /dev/null +++ b/core/vm/lightclient/iavl/proof_path.go @@ -0,0 +1,167 @@ +package iavl + +import ( + "bytes" + "fmt" + "strings" + + cmn "github.com/tendermint/tendermint/libs/common" +) + +// pathWithLeaf is a path to a leaf node and the leaf node itself. +type pathWithLeaf struct { + Path PathToLeaf `json:"path"` + Leaf proofLeafNode `json:"leaf"` +} + +func (pwl pathWithLeaf) String() string { + return pwl.StringIndented("") +} + +func (pwl pathWithLeaf) StringIndented(indent string) string { + return fmt.Sprintf(`pathWithLeaf{ +%s Path: %v +%s Leaf: %v +%s}`, + indent, pwl.Path.stringIndented(indent+" "), + indent, pwl.Leaf.stringIndented(indent+" "), + indent) +} + +// `verify` checks that the leaf node's hash + the inner nodes merkle-izes to +// the given root. If it returns an error, it means the leafHash or the +// PathToLeaf is incorrect. +func (pwl pathWithLeaf) verify(root []byte) cmn.Error { + leafHash := pwl.Leaf.Hash() + return pwl.Path.verify(leafHash, root) +} + +// `computeRootHash` computes the root hash with leaf node. +// Does not verify the root hash. +func (pwl pathWithLeaf) computeRootHash() []byte { + leafHash := pwl.Leaf.Hash() + return pwl.Path.computeRootHash(leafHash) +} + +//---------------------------------------- + +// PathToLeaf represents an inner path to a leaf node. +// Note that the nodes are ordered such that the last one is closest +// to the root of the tree. +type PathToLeaf []proofInnerNode + +func (pl PathToLeaf) String() string { + return pl.stringIndented("") +} + +func (pl PathToLeaf) stringIndented(indent string) string { + if len(pl) == 0 { + return "empty-PathToLeaf" + } + strs := make([]string, len(pl)) + for i, pin := range pl { + if i == 20 { + strs[i] = fmt.Sprintf("... (%v total)", len(pl)) + break + } + strs[i] = fmt.Sprintf("%v:%v", i, pin.stringIndented(indent+" ")) + } + return fmt.Sprintf(`PathToLeaf{ +%s %v +%s}`, + indent, strings.Join(strs, "\n"+indent+" "), + indent) +} + +// `verify` checks that the leaf node's hash + the inner nodes merkle-izes to +// the given root. If it returns an error, it means the leafHash or the +// PathToLeaf is incorrect. +func (pl PathToLeaf) verify(leafHash []byte, root []byte) cmn.Error { + hash := leafHash + for i := len(pl) - 1; i >= 0; i-- { + pin := pl[i] + hash = pin.Hash(hash) + } + if !bytes.Equal(root, hash) { + return cmn.ErrorWrap(ErrInvalidProof, "") + } + return nil +} + +// `computeRootHash` computes the root hash assuming some leaf hash. +// Does not verify the root hash. +func (pl PathToLeaf) computeRootHash(leafHash []byte) []byte { + hash := leafHash + for i := len(pl) - 1; i >= 0; i-- { + pin := pl[i] + hash = pin.Hash(hash) + } + return hash +} + +func (pl PathToLeaf) isLeftmost() bool { + for _, node := range pl { + if len(node.Left) > 0 { + return false + } + } + return true +} + +func (pl PathToLeaf) isRightmost() bool { + for _, node := range pl { + if len(node.Right) > 0 { + return false + } + } + return true +} + +func (pl PathToLeaf) isEmpty() bool { + return pl == nil || len(pl) == 0 +} + +func (pl PathToLeaf) dropRoot() PathToLeaf { + if pl.isEmpty() { + return pl + } + return PathToLeaf(pl[:len(pl)-1]) +} + +func (pl PathToLeaf) hasCommonRoot(pl2 PathToLeaf) bool { + if pl.isEmpty() || pl2.isEmpty() { + return false + } + leftEnd := pl[len(pl)-1] + rightEnd := pl2[len(pl2)-1] + + return bytes.Equal(leftEnd.Left, rightEnd.Left) && + bytes.Equal(leftEnd.Right, rightEnd.Right) +} + +func (pl PathToLeaf) isLeftAdjacentTo(pl2 PathToLeaf) bool { + for pl.hasCommonRoot(pl2) { + pl, pl2 = pl.dropRoot(), pl2.dropRoot() + } + pl, pl2 = pl.dropRoot(), pl2.dropRoot() + + return pl.isRightmost() && pl2.isLeftmost() +} + +// returns -1 if invalid. +func (pl PathToLeaf) Index() (idx int64) { + for i, node := range pl { + if node.Left == nil { + continue + } else if node.Right == nil { + if i < len(pl)-1 { + idx += node.Size - pl[i+1].Size + } else { + idx += node.Size - 1 + } + } else { + return -1 + } + } + return idx +} diff --git a/core/vm/lightclient/iavl/proof_range.go b/core/vm/lightclient/iavl/proof_range.go new file mode 100644 index 00000000000..caca3fa293a --- /dev/null +++ b/core/vm/lightclient/iavl/proof_range.go @@ -0,0 +1,305 @@ +package iavl + +import ( + "bytes" + "fmt" + "sort" + "strings" + + "github.com/tendermint/tendermint/crypto/tmhash" + cmn "github.com/tendermint/tendermint/libs/common" +) + +type RangeProof struct { + // You don't need the right path because + // it can be derived from what we have. + LeftPath PathToLeaf `json:"left_path"` + InnerNodes []PathToLeaf `json:"inner_nodes"` + Leaves []proofLeafNode `json:"leaves"` + + // memoize + rootVerified bool + rootHash []byte // valid iff rootVerified is true + treeEnd bool // valid iff rootVerified is true + +} + +// Keys returns all the keys in the RangeProof. NOTE: The keys here may +// include more keys than provided by tree.GetRangeWithProof or +// MutableTree.GetVersionedRangeWithProof. The keys returned there are only +// in the provided [startKey,endKey){limit} range. The keys returned here may +// include extra keys, such as: +// - the key before startKey if startKey is provided and doesn't exist; +// - the key after a queried key with tree.GetWithProof, when the key is absent. +func (proof *RangeProof) Keys() (keys [][]byte) { + if proof == nil { + return nil + } + for _, leaf := range proof.Leaves { + keys = append(keys, leaf.Key) + } + return keys +} + +// String returns a string representation of the proof. +func (proof *RangeProof) String() string { + if proof == nil { + return "" + } + return proof.StringIndented("") +} + +func (proof *RangeProof) StringIndented(indent string) string { + istrs := make([]string, 0, len(proof.InnerNodes)) + for _, ptl := range proof.InnerNodes { + istrs = append(istrs, ptl.stringIndented(indent+" ")) + } + lstrs := make([]string, 0, len(proof.Leaves)) + for _, leaf := range proof.Leaves { + lstrs = append(lstrs, leaf.stringIndented(indent+" ")) + } + return fmt.Sprintf(`RangeProof{ +%s LeftPath: %v +%s InnerNodes: +%s %v +%s Leaves: +%s %v +%s (rootVerified): %v +%s (rootHash): %X +%s (treeEnd): %v +%s}`, + indent, proof.LeftPath.stringIndented(indent+" "), + indent, + indent, strings.Join(istrs, "\n"+indent+" "), + indent, + indent, strings.Join(lstrs, "\n"+indent+" "), + indent, proof.rootVerified, + indent, proof.rootHash, + indent, proof.treeEnd, + indent) +} + +// The index of the first leaf (of the whole tree). +// Returns -1 if the proof is nil. +func (proof *RangeProof) LeftIndex() int64 { + if proof == nil { + return -1 + } + return proof.LeftPath.Index() +} + +// Also see LeftIndex(). +// Verify that a key has some value. +// Does not assume that the proof itself is valid, call Verify() first. +func (proof *RangeProof) VerifyItem(key, value []byte) error { + leaves := proof.Leaves + if proof == nil { + return cmn.ErrorWrap(ErrInvalidProof, "proof is nil") + } + if !proof.rootVerified { + return cmn.NewError("must call Verify(root) first.") + } + i := sort.Search(len(leaves), func(i int) bool { + return bytes.Compare(key, leaves[i].Key) <= 0 + }) + if i >= len(leaves) || !bytes.Equal(leaves[i].Key, key) { + return cmn.ErrorWrap(ErrInvalidProof, "leaf key not found in proof") + } + valueHash := tmhash.Sum(value) + if !bytes.Equal(leaves[i].ValueHash, valueHash) { + return cmn.ErrorWrap(ErrInvalidProof, "leaf value hash not same") + } + return nil +} + +// Verify that proof is valid absence proof for key. +// Does not assume that the proof itself is valid. +// For that, use Verify(root). +func (proof *RangeProof) VerifyAbsence(key []byte) error { + if proof == nil { + return cmn.ErrorWrap(ErrInvalidProof, "proof is nil") + } + if !proof.rootVerified { + return cmn.NewError("must call Verify(root) first.") + } + cmp := bytes.Compare(key, proof.Leaves[0].Key) + if cmp < 0 { + if proof.LeftPath.isLeftmost() { + return nil + } else { + return cmn.NewError("absence not proved by left path") + } + } else if cmp == 0 { + return cmn.NewError("absence disproved via first item #0") + } + if len(proof.LeftPath) == 0 { + return nil // proof ok + } + if proof.LeftPath.isRightmost() { + return nil + } + + // See if any of the leaves are greater than key. + for i := 1; i < len(proof.Leaves); i++ { + leaf := proof.Leaves[i] + cmp := bytes.Compare(key, leaf.Key) + if cmp < 0 { + return nil // proof ok + } else if cmp == 0 { + return cmn.NewError("absence disproved via item #%v", i) + } else { + if i == len(proof.Leaves)-1 { + // If last item, check whether + // it's the last item in teh tree. + + } + continue + } + } + + // It's still a valid proof if our last leaf is the rightmost child. + if proof.treeEnd { + return nil // OK! + } + + // It's not a valid absence proof. + if len(proof.Leaves) < 2 { + return cmn.NewError("absence not proved by right leaf (need another leaf?)") + } else { + return cmn.NewError("absence not proved by right leaf") + } +} + +// Verify that proof is valid. +func (proof *RangeProof) Verify(root []byte) error { + if proof == nil { + return cmn.ErrorWrap(ErrInvalidProof, "proof is nil") + } + err := proof.verify(root) + return err +} + +func (proof *RangeProof) verify(root []byte) (err error) { + rootHash := proof.rootHash + if rootHash == nil { + derivedHash, err := proof.computeRootHash() + if err != nil { + return err + } + rootHash = derivedHash + } + if !bytes.Equal(rootHash, root) { + return cmn.ErrorWrap(ErrInvalidRoot, "root hash doesn't match") + } else { + proof.rootVerified = true + } + return nil +} + +// ComputeRootHash computes the root hash with leaves. +// Returns nil if error or proof is nil. +// Does not verify the root hash. +func (proof *RangeProof) ComputeRootHash() []byte { + if proof == nil { + return nil + } + rootHash, _ := proof.computeRootHash() + return rootHash +} + +func (proof *RangeProof) computeRootHash() (rootHash []byte, err error) { + rootHash, treeEnd, err := proof._computeRootHash() + if err == nil { + proof.rootHash = rootHash // memoize + proof.treeEnd = treeEnd // memoize + } + return rootHash, err +} + +func (proof *RangeProof) _computeRootHash() (rootHash []byte, treeEnd bool, err error) { + if len(proof.Leaves) == 0 { + return nil, false, cmn.ErrorWrap(ErrInvalidProof, "no leaves") + } + if len(proof.InnerNodes)+1 != len(proof.Leaves) { + return nil, false, cmn.ErrorWrap(ErrInvalidProof, "InnerNodes vs Leaves length mismatch, leaves should be 1 more.") + } + + // Start from the left path and prove each leaf. + + // shared across recursive calls + var leaves = proof.Leaves + var innersq = proof.InnerNodes + var COMPUTEHASH func(path PathToLeaf, rightmost bool) (hash []byte, treeEnd bool, done bool, err error) + + // rightmost: is the root a rightmost child of the tree? + // treeEnd: true iff the last leaf is the last item of the tree. + // Returns the (possibly intermediate, possibly root) hash. + COMPUTEHASH = func(path PathToLeaf, rightmost bool) (hash []byte, treeEnd bool, done bool, err error) { + + // Pop next leaf. + nleaf, rleaves := leaves[0], leaves[1:] + leaves = rleaves + + // Compute hash. + hash = (pathWithLeaf{ + Path: path, + Leaf: nleaf, + }).computeRootHash() + + // If we don't have any leaves left, we're done. + if len(leaves) == 0 { + rightmost = rightmost && path.isRightmost() + return hash, rightmost, true, nil + } + + // Prove along path (until we run out of leaves). + for len(path) > 0 { + + // Drop the leaf-most (last-most) inner nodes from path + // until we encounter one with a left hash. + // We assume that the left side is already verified. + // rpath: rest of path + // lpath: last path item + rpath, lpath := path[:len(path)-1], path[len(path)-1] + path = rpath + if len(lpath.Right) == 0 { + continue + } + + // Pop next inners, a PathToLeaf (e.g. []proofInnerNode). + inners, rinnersq := innersq[0], innersq[1:] + innersq = rinnersq + + // Recursively verify inners against remaining leaves. + derivedRoot, treeEnd, done, err := COMPUTEHASH(inners, rightmost && rpath.isRightmost()) + if err != nil { + return nil, treeEnd, false, cmn.ErrorWrap(err, "recursive COMPUTEHASH call") + } + if !bytes.Equal(derivedRoot, lpath.Right) { + return nil, treeEnd, false, cmn.ErrorWrap(ErrInvalidRoot, "intermediate root hash %X doesn't match, got %X", lpath.Right, derivedRoot) + } + if done { + return hash, treeEnd, true, nil + } + } + + // We're not done yet (leaves left over). No error, not done either. + // Technically if rightmost, we know there's an error "left over leaves + // -- malformed proof", but we return that at the top level, below. + return hash, false, false, nil + } + + // Verify! + path := proof.LeftPath + rootHash, treeEnd, done, err := COMPUTEHASH(path, true) + if err != nil { + return nil, treeEnd, cmn.ErrorWrap(err, "root COMPUTEHASH call") + } else if !done { + return nil, treeEnd, cmn.ErrorWrap(ErrInvalidProof, "left over leaves -- malformed proof") + } + + // Ok! + return rootHash, treeEnd, nil +} + +/////////////////////////////////////////////////////////////////////////////// diff --git a/core/vm/lightclient/iavl/version.go b/core/vm/lightclient/iavl/version.go new file mode 100644 index 00000000000..5b1eba83dc6 --- /dev/null +++ b/core/vm/lightclient/iavl/version.go @@ -0,0 +1,4 @@ +package iavl + +// Version of iavl. +const Version = "0.12.0" diff --git a/core/vm/lightclient/iavl/wire.go b/core/vm/lightclient/iavl/wire.go new file mode 100644 index 00000000000..8549ae4ab3e --- /dev/null +++ b/core/vm/lightclient/iavl/wire.go @@ -0,0 +1,17 @@ +package iavl + +import ( + "github.com/tendermint/go-amino" +) + +var cdc = amino.NewCodec() + +func init() { + // NOTE: It's important that there be no conflicts here, + // as that would change the canonical representations. + RegisterWire(cdc) +} + +func RegisterWire(cdc *amino.Codec) { + // TODO +} diff --git a/core/vm/lightclient/multistoreproof.go b/core/vm/lightclient/multistoreproof.go new file mode 100644 index 00000000000..fd00c2f1401 --- /dev/null +++ b/core/vm/lightclient/multistoreproof.go @@ -0,0 +1,138 @@ +package lightclient + +import ( + "bytes" + "fmt" + + iavl2 "github.com/ledgerwatch/erigon/core/vm/lightclient/iavl" + "github.com/tendermint/tendermint/crypto/merkle" + cmn "github.com/tendermint/tendermint/libs/common" +) + +// MultiStoreProof defines a collection of store proofs in a multi-store +type MultiStoreProof struct { + StoreInfos []StoreInfo +} + +func NewMultiStoreProof(storeInfos []StoreInfo) *MultiStoreProof { + return &MultiStoreProof{StoreInfos: storeInfos} +} + +// ComputeRootHash returns the root hash for a given multi-store proof. +func (proof *MultiStoreProof) ComputeRootHash() []byte { + ci := CommitInfo{ + Version: -1, // TODO: Not needed; improve code. + StoreInfos: proof.StoreInfos, + } + return ci.Hash() +} + +// RequireProof return whether proof is require for the subpath +func RequireProof(subpath string) bool { + // XXX: create a better convention. + // Currently, only when query subpath is "/store" or "/key", will proof be included in response. + // If there are some changes about proof building in iavlstore.go, we must change code here to keep consistency with iavlstore.go:212 + if subpath == "/store" || subpath == "/key" { + return true + } + return false +} + +//----------------------------------------------------------------------------- + +var _ merkle.ProofOperator = MultiStoreProofOp{} + +// the multi-store proof operation constant value +const ProofOpMultiStore = "multistore" + +// TODO: document +type MultiStoreProofOp struct { + // Encoded in ProofOp.Key + key []byte + + // To encode in ProofOp.Data. + Proof *MultiStoreProof `json:"proof"` +} + +func NewMultiStoreProofOp(key []byte, proof *MultiStoreProof) MultiStoreProofOp { + return MultiStoreProofOp{ + key: key, + Proof: proof, + } +} + +// MultiStoreProofOpDecoder returns a multi-store merkle proof operator from a +// given proof operation. +func MultiStoreProofOpDecoder(pop merkle.ProofOp) (merkle.ProofOperator, error) { + if pop.Type != ProofOpMultiStore { + return nil, cmn.NewError("unexpected ProofOp.Type; got %v, want %v", pop.Type, ProofOpMultiStore) + } + + // XXX: a bit strange as we'll discard this, but it works + var op MultiStoreProofOp + + err := Cdc.UnmarshalBinaryLengthPrefixed(pop.Data, &op) + if err != nil { + return nil, cmn.ErrorWrap(err, "decoding ProofOp.Data into MultiStoreProofOp") + } + + return NewMultiStoreProofOp(pop.Key, op.Proof), nil +} + +// ProofOp return a merkle proof operation from a given multi-store proof +// operation. +func (op MultiStoreProofOp) ProofOp() merkle.ProofOp { + bz := Cdc.MustMarshalBinaryLengthPrefixed(op) + return merkle.ProofOp{ + Type: ProofOpMultiStore, + Key: op.key, + Data: bz, + } +} + +// String implements the Stringer interface for a mult-store proof operation. +func (op MultiStoreProofOp) String() string { + return fmt.Sprintf("MultiStoreProofOp{%v}", op.GetKey()) +} + +// GetKey returns the key for a multi-store proof operation. +func (op MultiStoreProofOp) GetKey() []byte { + return op.key +} + +// Run executes a multi-store proof operation for a given value. It returns +// the root hash if the value matches all the store's commitID's hash or an +// error otherwise. +func (op MultiStoreProofOp) Run(args [][]byte) ([][]byte, error) { + if len(args) != 1 { + return nil, cmn.NewError("Value size is not 1") + } + + value := args[0] + root := op.Proof.ComputeRootHash() + + for _, si := range op.Proof.StoreInfos { + if si.Name == string(op.key) { + if bytes.Equal(value, si.Core.CommitID.Hash) { + return [][]byte{root}, nil + } + + return nil, cmn.NewError("hash mismatch for substore %v: %X vs %X", si.Name, si.Core.CommitID.Hash, value) + } + } + + return nil, cmn.NewError("key %v not found in multistore proof", op.key) +} + +//----------------------------------------------------------------------------- + +// XXX: This should be managed by the rootMultiStore which may want to register +// more proof ops? +func DefaultProofRuntime() (prt *merkle.ProofRuntime) { + prt = merkle.NewProofRuntime() + prt.RegisterOpDecoder(merkle.ProofOpSimpleValue, merkle.SimpleValueOpDecoder) + prt.RegisterOpDecoder(iavl2.ProofOpIAVLValue, iavl2.IAVLValueOpDecoder) + prt.RegisterOpDecoder(iavl2.ProofOpIAVLAbsence, iavl2.IAVLAbsenceOpDecoder) + prt.RegisterOpDecoder(ProofOpMultiStore, MultiStoreProofOpDecoder) + return +} diff --git a/core/vm/lightclient/rootmultistore.go b/core/vm/lightclient/rootmultistore.go new file mode 100644 index 00000000000..d0e016c0e7b --- /dev/null +++ b/core/vm/lightclient/rootmultistore.go @@ -0,0 +1,86 @@ +package lightclient + +import ( + "fmt" + + "github.com/tendermint/tendermint/crypto/merkle" + "github.com/tendermint/tendermint/crypto/tmhash" +) + +//---------------------------------------- +// CommitID + +// CommitID contains the tree version number and its merkle root. +type CommitID struct { + Version int64 + Hash []byte +} + +func (cid CommitID) IsZero() bool { //nolint + return cid.Version == 0 && len(cid.Hash) == 0 +} + +func (cid CommitID) String() string { + return fmt.Sprintf("CommitID{%v:%X}", cid.Hash, cid.Version) +} + +//---------------------------------------- +// CommitInfo + +// NOTE: Keep CommitInfo a simple immutable struct. +type CommitInfo struct { + + // Version + Version int64 + + // Store info for + StoreInfos []StoreInfo +} + +// Hash returns the simple merkle root hash of the stores sorted by name. +func (ci CommitInfo) Hash() []byte { + // TODO cache to ci.hash []byte + m := make(map[string][]byte, len(ci.StoreInfos)) + for _, storeInfo := range ci.StoreInfos { + m[storeInfo.Name] = storeInfo.Hash() + } + return merkle.SimpleHashFromMap(m) +} + +func (ci CommitInfo) CommitID() CommitID { + return CommitID{ + Version: ci.Version, + Hash: ci.Hash(), + } +} + +//---------------------------------------- +// StoreInfo + +// StoreInfo contains the name and core reference for an +// underlying store. It is the leaf of the rootMultiStores top +// level simple merkle tree. +type StoreInfo struct { + Name string + Core StoreCore +} + +type StoreCore struct { + // StoreType StoreType + CommitID CommitID + // ... maybe add more state +} + +// Implements merkle.Hasher. +func (si StoreInfo) Hash() []byte { + // Doesn't write Name, since merkle.SimpleHashFromMap() will + // include them via the keys. + bz, _ := Cdc.MarshalBinaryLengthPrefixed(si.Core) // Does not error + hasher := tmhash.New() + _, err := hasher.Write(bz) + if err != nil { + // TODO: Handle with #870 + panic(err) + } + return hasher.Sum(nil) +} diff --git a/core/vm/lightclient/types.go b/core/vm/lightclient/types.go new file mode 100644 index 00000000000..6006fe04d4c --- /dev/null +++ b/core/vm/lightclient/types.go @@ -0,0 +1,286 @@ +package lightclient + +import ( + "bytes" + "encoding/binary" + "fmt" + + "github.com/tendermint/tendermint/crypto/ed25519" + "github.com/tendermint/tendermint/crypto/merkle" + lerr "github.com/tendermint/tendermint/lite/errors" + tmtypes "github.com/tendermint/tendermint/types" +) + +const ( + chainIDLength uint64 = 32 + heightLength uint64 = 8 + validatorSetHashLength uint64 = 32 + validatorPubkeyLength uint64 = 32 + validatorVotingPowerLength uint64 = 8 + appHashLength uint64 = 32 + storeNameLengthBytesLength uint64 = 32 + keyLengthBytesLength uint64 = 32 + valueLengthBytesLength uint64 = 32 + maxConsensusStateLength uint64 = 32 * (128 - 1) // maximum validator quantity 99 +) + +type ConsensusState struct { + ChainID string + Height uint64 + AppHash []byte + CurValidatorSetHash []byte + NextValidatorSet *tmtypes.ValidatorSet +} + +// input: +// | chainID | height | appHash | curValidatorSetHash | [{validator pubkey, voting power}] | +// | 32 bytes | 8 bytes | 32 bytes | 32 bytes | [{32 bytes, 8 bytes}] | +func DecodeConsensusState(input []byte) (ConsensusState, error) { + + minimumLength := chainIDLength + heightLength + appHashLength + validatorSetHashLength + singleValidatorBytesLength := validatorPubkeyLength + validatorVotingPowerLength + + inputLen := uint64(len(input)) + if inputLen <= minimumLength || (inputLen-minimumLength)%singleValidatorBytesLength != 0 { + return ConsensusState{}, fmt.Errorf("expected input size %d+%d*N, actual input size: %d", minimumLength, singleValidatorBytesLength, inputLen) + } + pos := uint64(0) + + chainID := string(bytes.Trim(input[pos:pos+chainIDLength], "\x00")) + pos += chainIDLength + + height := binary.BigEndian.Uint64(input[pos : pos+heightLength]) + pos += heightLength + + appHash := input[pos : pos+appHashLength] + pos += appHashLength + + curValidatorSetHash := input[pos : pos+validatorSetHashLength] + pos += validatorSetHashLength + + nextValidatorSetLength := (inputLen - minimumLength) / singleValidatorBytesLength + validatorSetBytes := input[pos:] + var validatorSet []*tmtypes.Validator + for index := uint64(0); index < nextValidatorSetLength; index++ { + validatorAndPowerBytes := validatorSetBytes[singleValidatorBytesLength*index : singleValidatorBytesLength*(index+1)] + var pubkey ed25519.PubKeyEd25519 + copy(pubkey[:], validatorAndPowerBytes[:validatorPubkeyLength]) + votingPower := int64(binary.BigEndian.Uint64(validatorAndPowerBytes[validatorPubkeyLength:])) + + validator := tmtypes.NewValidator(pubkey, votingPower) + validatorSet = append(validatorSet, validator) + } + + consensusState := ConsensusState{ + ChainID: chainID, + Height: height, + AppHash: appHash, + CurValidatorSetHash: curValidatorSetHash, + NextValidatorSet: &tmtypes.ValidatorSet{ + Validators: validatorSet, + }, + } + + return consensusState, nil +} + +// output: +// | chainID | height | appHash | curValidatorSetHash | [{validator pubkey, voting power}] | +// | 32 bytes | 8 bytes | 32 bytes | 32 bytes | [{32 bytes, 8 bytes}] | +func (cs ConsensusState) EncodeConsensusState() ([]byte, error) { + validatorSetLength := uint64(len(cs.NextValidatorSet.Validators)) + serializeLength := chainIDLength + heightLength + appHashLength + validatorSetHashLength + validatorSetLength*(validatorPubkeyLength+validatorVotingPowerLength) + if serializeLength > maxConsensusStateLength { + return nil, fmt.Errorf("too many validators %d, consensus state bytes should not exceed %d", len(cs.NextValidatorSet.Validators), maxConsensusStateLength) + } + + encodingBytes := make([]byte, serializeLength) + + pos := uint64(0) + if uint64(len(cs.ChainID)) > chainIDLength { + return nil, fmt.Errorf("chainID length should be no more than 32") + } + copy(encodingBytes[pos:pos+chainIDLength], cs.ChainID) + pos += chainIDLength + + binary.BigEndian.PutUint64(encodingBytes[pos:pos+heightLength], cs.Height) + pos += heightLength + + copy(encodingBytes[pos:pos+appHashLength], cs.AppHash) + pos += appHashLength + + copy(encodingBytes[pos:pos+validatorSetHashLength], cs.CurValidatorSetHash) + pos += validatorSetHashLength + + for index := uint64(0); index < validatorSetLength; index++ { + validator := cs.NextValidatorSet.Validators[index] + pubkey, ok := validator.PubKey.(ed25519.PubKeyEd25519) + if !ok { + return nil, fmt.Errorf("invalid pubkey type") + } + + copy(encodingBytes[pos:pos+validatorPubkeyLength], pubkey[:]) + pos += validatorPubkeyLength + + binary.BigEndian.PutUint64(encodingBytes[pos:pos+validatorVotingPowerLength], uint64(validator.VotingPower)) + pos += validatorVotingPowerLength + } + + return encodingBytes, nil +} + +func (cs *ConsensusState) ApplyHeader(header *Header) (bool, error) { + if uint64(header.Height) < cs.Height { + return false, fmt.Errorf("header height < consensus height (%d < %d)", header.Height, cs.Height) + } + + if err := header.Validate(cs.ChainID); err != nil { + return false, err + } + + trustedNextHash := cs.NextValidatorSet.Hash() + if cs.Height == uint64(header.Height-1) { + if !bytes.Equal(trustedNextHash, header.ValidatorsHash) { + return false, lerr.ErrUnexpectedValidators(header.ValidatorsHash, trustedNextHash) + } + err := cs.NextValidatorSet.VerifyCommit(cs.ChainID, header.Commit.BlockID, header.Height, header.Commit) + if err != nil { + return false, err + } + } else { + err := cs.NextValidatorSet.VerifyFutureCommit(header.ValidatorSet, cs.ChainID, + header.Commit.BlockID, header.Height, header.Commit) + if err != nil { + return false, err + } + } + validatorSetChanged := false + if !bytes.Equal(cs.CurValidatorSetHash, header.ValidatorsHash) || !bytes.Equal(cs.NextValidatorSet.Hash(), header.NextValidatorsHash) { + validatorSetChanged = true + } + // update consensus state + cs.Height = uint64(header.Height) + cs.AppHash = header.AppHash + cs.CurValidatorSetHash = header.ValidatorsHash + cs.NextValidatorSet = header.NextValidatorSet + + return validatorSetChanged, nil +} + +type Header struct { + tmtypes.SignedHeader + ValidatorSet *tmtypes.ValidatorSet `json:"validator_set"` + NextValidatorSet *tmtypes.ValidatorSet `json:"next_validator_set"` +} + +func (h *Header) Validate(chainID string) error { + if err := h.SignedHeader.ValidateBasic(chainID); err != nil { + return err + } + if h.ValidatorSet == nil { + return fmt.Errorf("invalid header: validator set is nil") + } + if h.NextValidatorSet == nil { + return fmt.Errorf("invalid header: next validator set is nil") + } + if !bytes.Equal(h.ValidatorsHash, h.ValidatorSet.Hash()) { + return fmt.Errorf("invalid header: validator set does not match hash") + } + if !bytes.Equal(h.NextValidatorsHash, h.NextValidatorSet.Hash()) { + return fmt.Errorf("invalid header: next validator set does not match hash") + } + return nil +} + +func (h *Header) EncodeHeader() ([]byte, error) { + bz, err := Cdc.MarshalBinaryLengthPrefixed(h) + if err != nil { + return nil, err + } + return bz, nil +} + +func DecodeHeader(input []byte) (*Header, error) { + var header Header + err := Cdc.UnmarshalBinaryLengthPrefixed(input, &header) + if err != nil { + return nil, err + } + return &header, nil +} + +type KeyValueMerkleProof struct { + Key []byte + Value []byte + StoreName string + AppHash []byte + Proof *merkle.Proof +} + +func (kvmp *KeyValueMerkleProof) Validate() bool { + prt := DefaultProofRuntime() + + kp := merkle.KeyPath{} + kp = kp.AppendKey([]byte(kvmp.StoreName), merkle.KeyEncodingURL) + kp = kp.AppendKey(kvmp.Key, merkle.KeyEncodingURL) + + if len(kvmp.Value) == 0 { + err := prt.VerifyAbsence(kvmp.Proof, kvmp.AppHash, kp.String()) + return err == nil + } + + err := prt.VerifyValue(kvmp.Proof, kvmp.AppHash, kp.String(), kvmp.Value) + return err == nil +} + +// input: +// | storeName | key length | key | value length | value | appHash | proof | +// | 32 bytes | 32 bytes | | 32 bytes | | 32 bytes | | +func DecodeKeyValueMerkleProof(input []byte) (*KeyValueMerkleProof, error) { + inputLength := uint64(len(input)) + pos := uint64(0) + + if inputLength <= storeNameLengthBytesLength+keyLengthBytesLength+valueLengthBytesLength+appHashLength { + return nil, fmt.Errorf("input length should be no less than %d", storeNameLengthBytesLength+keyLengthBytesLength+valueLengthBytesLength+appHashLength) + } + storeName := string(bytes.Trim(input[pos:pos+storeNameLengthBytesLength], "\x00")) + pos += storeNameLengthBytesLength + + keyLength := binary.BigEndian.Uint64(input[pos+keyLengthBytesLength-8 : pos+keyLengthBytesLength]) + pos += keyLengthBytesLength + + if inputLength <= storeNameLengthBytesLength+keyLengthBytesLength+keyLength+valueLengthBytesLength { + return nil, fmt.Errorf("invalid input, keyLength %d is too long", keyLength) + } + key := input[pos : pos+keyLength] + pos += keyLength + + valueLength := binary.BigEndian.Uint64(input[pos+valueLengthBytesLength-8 : pos+valueLengthBytesLength]) + pos += valueLengthBytesLength + + if inputLength <= storeNameLengthBytesLength+keyLengthBytesLength+keyLength+valueLengthBytesLength+valueLength+appHashLength { + return nil, fmt.Errorf("invalid input, valueLength %d is too long", valueLength) + } + value := input[pos : pos+valueLength] + pos += valueLength + + appHash := input[pos : pos+appHashLength] + pos += appHashLength + + proofBytes := input[pos:] + var merkleProof merkle.Proof + err := merkleProof.Unmarshal(proofBytes) + if err != nil { + return nil, err + } + + keyValueMerkleProof := &KeyValueMerkleProof{ + Key: key, + Value: value, + StoreName: storeName, + AppHash: appHash, + Proof: &merkleProof, + } + + return keyValueMerkleProof, nil +} diff --git a/core/vm/lightclient/utils.go b/core/vm/lightclient/utils.go new file mode 100644 index 00000000000..20da6a1347b --- /dev/null +++ b/core/vm/lightclient/utils.go @@ -0,0 +1,88 @@ +package lightclient + +/* +import ( + "fmt" + + rpcclient "github.com/tendermint/tendermint/rpc/client" + tmtypes "github.com/tendermint/tendermint/types" +) + +func GetInitConsensusState(node rpcclient.Client, height int64) (*ConsensusState, error) { + status, err := node.Status() + if err != nil { + return nil, err + } + + nextValHeight := height + 1 + nextValidatorSet, err := node.Validators(&nextValHeight) + if err != nil { + return nil, err + } + + header, err := node.Block(&height) + if err != nil { + return nil, err + } + + appHash := header.BlockMeta.Header.AppHash + curValidatorSetHash := header.BlockMeta.Header.ValidatorsHash + + cs := &ConsensusState{ + ChainID: status.NodeInfo.Network, + Height: uint64(height), + AppHash: appHash, + CurValidatorSetHash: curValidatorSetHash, + NextValidatorSet: &tmtypes.ValidatorSet{ + Validators: nextValidatorSet.Validators, + }, + } + return cs, nil +} + +func QueryTendermintHeader(node rpcclient.Client, height int64) (*Header, error) { + nextHeight := height + 1 + + commit, err := node.Commit(&height) + if err != nil { + return nil, err + } + + validators, err := node.Validators(&height) + if err != nil { + return nil, err + } + + nextvalidators, err := node.Validators(&nextHeight) + if err != nil { + return nil, err + } + + header := &Header{ + SignedHeader: commit.SignedHeader, + ValidatorSet: tmtypes.NewValidatorSet(validators.Validators), + NextValidatorSet: tmtypes.NewValidatorSet(nextvalidators.Validators), + } + + return header, nil +} + +func QueryKeyWithProof(node rpcclient.Client, key []byte, storeName string, height int64) ([]byte, []byte, []byte, error) { + opts := rpcclient.ABCIQueryOptions{ + Height: height, + Prove: true, + } + + path := fmt.Sprintf("/store/%s/%s", storeName, "key") + result, err := node.ABCIQueryWithOptions(path, key, opts) + if err != nil { + return nil, nil, nil, err + } + proofBytes, err := result.Response.Proof.Marshal() + if err != nil { + return nil, nil, nil, err + } + + return key, result.Response.Value, proofBytes, nil +} +*/ diff --git a/core/vm/lightclient/wire.go b/core/vm/lightclient/wire.go new file mode 100644 index 00000000000..460dfce1de7 --- /dev/null +++ b/core/vm/lightclient/wire.go @@ -0,0 +1,16 @@ +package lightclient + +import ( + "github.com/tendermint/go-amino" + cryptoAmino "github.com/tendermint/tendermint/crypto/encoding/amino" +) + +type Codec = amino.Codec + +var Cdc *Codec + +func init() { + cdc := amino.NewCodec() + cryptoAmino.RegisterAmino(cdc) + Cdc = cdc.Seal() +} diff --git a/core/vm/logger.go b/core/vm/logger.go index fb30cda10f3..1d50dca6c1b 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -30,7 +30,6 @@ import ( "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/core/vm/stack" "github.com/ledgerwatch/erigon/params" ) @@ -120,10 +119,10 @@ const ( // Note that reference types are actual VM data structures; make copies // if you need to retain them beyond the current call. type Tracer interface { - CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, callType CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error - CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, rData []byte, contract *Contract, depth int, err error) error - CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, contract *Contract, depth int, err error) error - CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error + CaptureStart(env *EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, callType CallType, input []byte, gas uint64, value *big.Int, code []byte) + CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) + CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) + CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) CaptureAccountRead(account common.Address) error CaptureAccountWrite(account common.Address) error @@ -155,17 +154,20 @@ func NewStructLogger(cfg *LogConfig) *StructLogger { } // CaptureStart implements the Tracer interface to initialize the tracing operation. -func (l *StructLogger) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { - return nil +func (l *StructLogger) CaptureStart(evm *EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype CallType, input []byte, gas uint64, value *big.Int, code []byte) { } // CaptureState logs a new structured log message and pushes it out to the environment // // CaptureState also tracks SLOAD/SSTORE ops to track storage change. -func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, rData []byte, contract *Contract, depth int, err error) error { +func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { + memory := scope.Memory + stack := scope.Stack + contract := scope.Contract + // check if already accumulated the specified number of logs if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { - return ErrTraceLimitReached + return } // Copy a snapshot of the current memory state to a new buffer @@ -196,7 +198,7 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui address = common.Hash(stack.Data[stack.Len()-1].Bytes32()) value uint256.Int ) - env.IntraBlockState.GetState(contract.Address(), &address, &value) + env.IntraBlockState().GetState(contract.Address(), &address, &value) l.storage[contract.Address()][address] = common.Hash(value.Bytes32()) } // capture SSTORE opcodes and record the written entry in the local storage. @@ -215,21 +217,19 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui copy(rdata, rData) } // create a new snapshot of the EVM. - log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, env.IntraBlockState.GetRefund(), err} + log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, rdata, storage, depth, env.IntraBlockState().GetRefund(), err} l.logs = append(l.logs, log) - return nil } // CaptureFault implements the Tracer interface to trace an execution fault // while running an opcode. -func (l *StructLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, contract *Contract, depth int, err error) error { - return nil +func (l *StructLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { } // CaptureEnd is called after the call finishes to finalize the tracing. -func (l *StructLogger) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { +func (l *StructLogger) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { if depth != 0 { - return nil + return } l.output = output l.err = err @@ -239,7 +239,6 @@ func (l *StructLogger) CaptureEnd(depth int, output []byte, gasUsed uint64, t ti fmt.Printf(" error: %v\n", err) } } - return nil } func (l *StructLogger) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { @@ -324,7 +323,7 @@ func NewMarkdownLogger(cfg *LogConfig, writer io.Writer) *mdLogger { return l } -func (t *mdLogger) CaptureStart(_ int, from common.Address, to common.Address, preimage bool, create bool, calltype CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { //nolint:interfacer +func (t *mdLogger) CaptureStart(env *EVM, _ int, from common.Address, to common.Address, preimage bool, create bool, calltype CallType, input []byte, gas uint64, value *big.Int, code []byte) { //nolint:interfacer if !create { fmt.Fprintf(t.out, "From: `%v`\nTo: `%v`\nData: `0x%x`\nGas: `%d`\nValue `%v` wei\n", from.String(), to.String(), @@ -339,10 +338,11 @@ func (t *mdLogger) CaptureStart(_ int, from common.Address, to common.Address, p | Pc | Op | Cost | Stack | RStack | Refund | |-------|-------------|------|-----------|-----------|---------| `) - return nil } -func (t *mdLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, rData []byte, contract *Contract, depth int, err error) error { +func (t *mdLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + fmt.Fprintf(t.out, "| %4d | %10v | %3d |", pc, op, cost) if !t.cfg.DisableStack { @@ -354,25 +354,20 @@ func (t *mdLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64 b := fmt.Sprintf("[%v]", strings.Join(a, ",")) fmt.Fprintf(t.out, "%10v |", b) } - fmt.Fprintf(t.out, "%10v |", env.IntraBlockState.GetRefund()) + fmt.Fprintf(t.out, "%10v |", env.IntraBlockState().GetRefund()) fmt.Fprintln(t.out, "") if err != nil { fmt.Fprintf(t.out, "Error: %v\n", err) } - return nil } -func (t *mdLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, contract *Contract, depth int, err error) error { - +func (t *mdLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { fmt.Fprintf(t.out, "\nError: at pc=%d, op=%v: %v\n", pc, op, err) - - return nil } -func (t *mdLogger) CaptureEnd(_ int, output []byte, gasUsed uint64, tm time.Duration, err error) error { +func (t *mdLogger) CaptureEnd(_ int, output []byte, startGas, endGas uint64, tm time.Duration, err error) { fmt.Fprintf(t.out, "\nOutput: `0x%x`\nConsumed gas: `%d`\nError: `%v`\n", - output, gasUsed, err) - return nil + output, startGas-endGas, err) } func (t *mdLogger) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { diff --git a/core/vm/logger_json.go b/core/vm/logger_json.go index ed73bbc4629..20cef915c11 100644 --- a/core/vm/logger_json.go +++ b/core/vm/logger_json.go @@ -24,7 +24,6 @@ import ( "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/math" - "github.com/ledgerwatch/erigon/core/vm/stack" ) type JSONLogger struct { @@ -42,12 +41,14 @@ func NewJSONLogger(cfg *LogConfig, writer io.Writer) *JSONLogger { return l } -func (l *JSONLogger) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { - return nil +func (l *JSONLogger) CaptureStart(env *EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype CallType, input []byte, gas uint64, value *big.Int, code []byte) { } // CaptureState outputs state information on the logger. -func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, rData []byte, contract *Contract, depth int, err error) error { +func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, rData []byte, depth int, err error) { + memory := scope.Memory + stack := scope.Stack + log := StructLog{ Pc: pc, Op: op, @@ -56,7 +57,7 @@ func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint MemorySize: memory.Len(), Storage: nil, Depth: depth, - RefundCounter: env.IntraBlockState.GetRefund(), + RefundCounter: env.IntraBlockState().GetRefund(), Err: err, } if !l.cfg.DisableMemory { @@ -70,16 +71,15 @@ func (l *JSONLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint } log.Stack = logstack } - return l.encoder.Encode(log) + _ = l.encoder.Encode(log) } // CaptureFault outputs state information on the logger. -func (l *JSONLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *stack.Stack, contract *Contract, depth int, err error) error { - return nil +func (l *JSONLogger) CaptureFault(env *EVM, pc uint64, op OpCode, gas, cost uint64, scope *ScopeContext, depth int, err error) { } // CaptureEnd is triggered at end of execution. -func (l *JSONLogger) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { +func (l *JSONLogger) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { type endLog struct { Output string `json:"output"` GasUsed math.HexOrDecimal64 `json:"gasUsed"` @@ -87,13 +87,13 @@ func (l *JSONLogger) CaptureEnd(depth int, output []byte, gasUsed uint64, t time Err string `json:"error,omitempty"` } if depth != 0 { - return nil + return } var errMsg string if err != nil { errMsg = err.Error() } - return l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(gasUsed), t, errMsg}) + _ = l.encoder.Encode(endLog{common.Bytes2Hex(output), math.HexOrDecimal64(startGas - endGas), t, errMsg}) } func (l *JSONLogger) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { diff --git a/core/vm/logger_test.go b/core/vm/logger_test.go index f47c8a92d26..c5a3d554034 100644 --- a/core/vm/logger_test.go +++ b/core/vm/logger_test.go @@ -23,38 +23,14 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/vm/stack" "github.com/ledgerwatch/erigon/params" ) -type dummyContractRef struct { - calledForEach bool -} - -func (dummyContractRef) ReturnGas(*big.Int) {} -func (dummyContractRef) Address() common.Address { return common.Address{} } -func (dummyContractRef) Value() *big.Int { return new(big.Int) } -func (dummyContractRef) SetCode(common.Hash, []byte) {} -func (d *dummyContractRef) ForEachStorage(callback func(key, value common.Hash) bool) { - d.calledForEach = true -} -func (d *dummyContractRef) SubBalance(amount *big.Int) {} -func (d *dummyContractRef) AddBalance(amount *big.Int) {} -func (d *dummyContractRef) SetBalance(*big.Int) {} -func (d *dummyContractRef) SetNonce(uint64) {} -func (d *dummyContractRef) Balance() *big.Int { return new(big.Int) } - -type dummyStatedb struct { - state.IntraBlockState -} - -func (*dummyStatedb) GetRefund() uint64 { return 1337 } - func TestStoreCapture(t *testing.T) { var ( env = NewEVM(BlockContext{ - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, TxContext{}, &dummyStatedb{}, params.TestChainConfig, Config{}) logger = NewStructLogger(nil) mem = NewMemory() @@ -64,9 +40,12 @@ func TestStoreCapture(t *testing.T) { stack.Push(uint256.NewInt(1)) stack.Push(uint256.NewInt(0)) var index common.Hash - if err := logger.CaptureState(env, 0, SSTORE, 0, 0, mem, stack, nil, contract, 0, nil); err != nil { - t.Fatalf("error while caturing state %v", err) - } + logger.CaptureState(env, 0, SSTORE, 0, 0, &ScopeContext{ + Memory: mem, + Stack: stack, + Contract: contract, + }, nil, 0, nil) + if len(logger.storage[contract.Address()]) == 0 { t.Fatalf("expected exactly 1 changed value on address %x, got %d", contract.Address(), len(logger.storage[contract.Address()])) } diff --git a/core/vm/memory.go b/core/vm/memory.go index 2f1689b9ff5..3ce2837957b 100644 --- a/core/vm/memory.go +++ b/core/vm/memory.go @@ -76,7 +76,7 @@ func (m *Memory) GetCopy(offset, size uint64) (cpy []byte) { if uint64(len(m.store)) > offset { cpy = make([]byte, size) - copy(cpy, m.store[offset:offset+size]) + copy(cpy, m.store[offset:]) return } diff --git a/core/vm/mock_vm.go b/core/vm/mock_vm.go new file mode 100644 index 00000000000..6228a307ec4 --- /dev/null +++ b/core/vm/mock_vm.go @@ -0,0 +1,99 @@ +package vm + +import ( + "fmt" + "math/big" + + "github.com/holiman/uint256" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/state" +) + +type readonlyGetSetter interface { + setReadonly(outerReadonly bool) func() + getReadonly() bool +} + +type testVM struct { + readonlyGetSetter + isTEMV bool + + recordedReadOnlies *[]*readOnlyState + recordedIsEVMCalled *[]bool + + env *EVM + isEVMSliceTest []bool + readOnlySliceTest []bool + currentIdx *int +} + +func (evm *testVM) Run(_ *Contract, _ []byte, readOnly bool) (ret []byte, err error) { + currentReadOnly := new(readOnlyState) + + currentReadOnly.outer = readOnly + currentReadOnly.before = evm.getReadonly() + + currentIndex := *evm.currentIdx + + callback := evm.setReadonly(readOnly) + defer func() { + callback() + currentReadOnly.after = evm.getReadonly() + }() + + currentReadOnly.in = evm.getReadonly() + + (*evm.recordedReadOnlies)[currentIndex] = currentReadOnly + (*evm.recordedIsEVMCalled)[currentIndex] = !evm.isTEMV + + *evm.currentIdx++ + + if *evm.currentIdx < len(evm.readOnlySliceTest) { + res, err := run(evm.env, NewContract( + &dummyContractRef{}, + &dummyContractRef{}, + new(uint256.Int), + 0, + false, + !evm.isEVMSliceTest[*evm.currentIdx], + ), nil, evm.readOnlySliceTest[*evm.currentIdx]) + return res, err + } + + return +} + +type readOnlyState struct { + outer bool + before bool + in bool + after bool +} + +func (r *readOnlyState) String() string { + return fmt.Sprintf("READONLY Status: outer %t; before %t; in %t; after %t", r.outer, r.before, r.in, r.after) +} + +type dummyContractRef struct { + calledForEach bool +} + +func (dummyContractRef) ReturnGas(*big.Int) {} +func (dummyContractRef) Address() common.Address { return common.Address{} } +func (dummyContractRef) Value() *big.Int { return new(big.Int) } +func (dummyContractRef) SetCode(common.Hash, []byte) {} +func (d *dummyContractRef) ForEachStorage(callback func(key, value common.Hash) bool) { + d.calledForEach = true +} +func (d *dummyContractRef) SubBalance(amount *big.Int) {} +func (d *dummyContractRef) AddBalance(amount *big.Int) {} +func (d *dummyContractRef) SetBalance(*big.Int) {} +func (d *dummyContractRef) SetNonce(uint64) {} +func (d *dummyContractRef) Balance() *big.Int { return new(big.Int) } + +type dummyStatedb struct { + state.IntraBlockState +} + +func (*dummyStatedb) GetRefund() uint64 { return 1337 } diff --git a/core/vm/operations_acl.go b/core/vm/operations_acl.go index 771727acb2b..4b54daa4a8a 100644 --- a/core/vm/operations_acl.go +++ b/core/vm/operations_acl.go @@ -39,12 +39,12 @@ func makeGasSStoreFunc(clearingRefund uint64) gasFunc { current uint256.Int cost = uint64(0) ) - evm.IntraBlockState.GetState(contract.Address(), &slot, ¤t) + evm.IntraBlockState().GetState(contract.Address(), &slot, ¤t) // Check slot presence in the access list - if addrPresent, slotPresent := evm.IntraBlockState.SlotInAccessList(contract.Address(), slot); !slotPresent { + if addrPresent, slotPresent := evm.IntraBlockState().SlotInAccessList(contract.Address(), slot); !slotPresent { cost = params.ColdSloadCostEIP2929 // If the caller cannot afford the cost, this change will be rolled back - evm.IntraBlockState.AddSlotToAccessList(contract.Address(), slot) + evm.IntraBlockState().AddSlotToAccessList(contract.Address(), slot) if !addrPresent { // Once we're done with YOLOv2 and schedule this for mainnet, might // be good to remove this panic here, which is just really a @@ -62,13 +62,13 @@ func makeGasSStoreFunc(clearingRefund uint64) gasFunc { } var original uint256.Int slotCommited := common.Hash(x.Bytes32()) - evm.IntraBlockState.GetCommittedState(contract.Address(), &slotCommited, &original) + evm.IntraBlockState().GetCommittedState(contract.Address(), &slotCommited, &original) if original.Eq(¤t) { if original.IsZero() { // create slot (2.1.1) return cost + params.SstoreSetGasEIP2200, nil } if value.IsZero() { // delete slot (2.1.2b) - evm.IntraBlockState.AddRefund(clearingRefund) + evm.IntraBlockState().AddRefund(clearingRefund) } // EIP-2200 original clause: // return params.SstoreResetGasEIP2200, nil // write existing slot (2.1.2) @@ -76,23 +76,23 @@ func makeGasSStoreFunc(clearingRefund uint64) gasFunc { } if !original.IsZero() { if current.IsZero() { // recreate slot (2.2.1.1) - evm.IntraBlockState.SubRefund(clearingRefund) + evm.IntraBlockState().SubRefund(clearingRefund) } else if value.IsZero() { // delete slot (2.2.1.2) - evm.IntraBlockState.AddRefund(clearingRefund) + evm.IntraBlockState().AddRefund(clearingRefund) } } if original.Eq(&value) { if original.IsZero() { // reset to original inexistent slot (2.2.2.1) // EIP 2200 Original clause: //evm.StateDB.AddRefund(params.SstoreSetGasEIP2200 - params.SloadGasEIP2200) - evm.IntraBlockState.AddRefund(params.SstoreSetGasEIP2200 - params.WarmStorageReadCostEIP2929) + evm.IntraBlockState().AddRefund(params.SstoreSetGasEIP2200 - params.WarmStorageReadCostEIP2929) } else { // reset to original existing slot (2.2.2.2) // EIP 2200 Original clause: // evm.StateDB.AddRefund(params.SstoreResetGasEIP2200 - params.SloadGasEIP2200) // - SSTORE_RESET_GAS redefined as (5000 - COLD_SLOAD_COST) // - SLOAD_GAS redefined as WARM_STORAGE_READ_COST // Final: (5000 - COLD_SLOAD_COST) - WARM_STORAGE_READ_COST - evm.IntraBlockState.AddRefund((params.SstoreResetGasEIP2200 - params.ColdSloadCostEIP2929) - params.WarmStorageReadCostEIP2929) + evm.IntraBlockState().AddRefund((params.SstoreResetGasEIP2200 - params.ColdSloadCostEIP2929) - params.WarmStorageReadCostEIP2929) } } // EIP-2200 original clause: @@ -110,10 +110,10 @@ func gasSLoadEIP2929(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memo loc := stack.Peek() slot := common.Hash(loc.Bytes32()) // Check slot presence in the access list - if _, slotPresent := evm.IntraBlockState.SlotInAccessList(contract.Address(), slot); !slotPresent { + if _, slotPresent := evm.IntraBlockState().SlotInAccessList(contract.Address(), slot); !slotPresent { // If the caller cannot afford the cost, this change will be rolled back // If he does afford it, we can skip checking the same thing later on, during execution - evm.IntraBlockState.AddSlotToAccessList(contract.Address(), slot) + evm.IntraBlockState().AddSlotToAccessList(contract.Address(), slot) return params.ColdSloadCostEIP2929, nil } return params.WarmStorageReadCostEIP2929, nil @@ -132,8 +132,8 @@ func gasExtCodeCopyEIP2929(evm *EVM, contract *Contract, stack *stack.Stack, mem } addr := common.Address(stack.Peek().Bytes20()) // Check slot presence in the access list - if !evm.IntraBlockState.AddressInAccessList(addr) { - evm.IntraBlockState.AddAddressToAccessList(addr) + if !evm.IntraBlockState().AddressInAccessList(addr) { + evm.IntraBlockState().AddAddressToAccessList(addr) var overflow bool // We charge (cold-warm), since 'warm' is already charged as constantGas if gas, overflow = math.SafeAdd(gas, params.ColdAccountAccessCostEIP2929-params.WarmStorageReadCostEIP2929); overflow { @@ -154,9 +154,9 @@ func gasExtCodeCopyEIP2929(evm *EVM, contract *Contract, stack *stack.Stack, mem func gasEip2929AccountCheck(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) { addr := common.Address(stack.Peek().Bytes20()) // Check slot presence in the access list - if !evm.IntraBlockState.AddressInAccessList(addr) { + if !evm.IntraBlockState().AddressInAccessList(addr) { // If the caller cannot afford the cost, this change will be rolled back - evm.IntraBlockState.AddAddressToAccessList(addr) + evm.IntraBlockState().AddAddressToAccessList(addr) // The warm storage read cost is already charged as constantGas return params.ColdAccountAccessCostEIP2929 - params.WarmStorageReadCostEIP2929, nil } @@ -167,10 +167,15 @@ func makeCallVariantGasCallEIP2929(oldCalculator gasFunc) gasFunc { return func(evm *EVM, contract *Contract, stack *stack.Stack, mem *Memory, memorySize uint64) (uint64, error) { addr := common.Address(stack.Back(1).Bytes20()) // Check slot presence in the access list - if !evm.IntraBlockState.AddressInAccessList(addr) { - evm.IntraBlockState.AddAddressToAccessList(addr) - // The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost - if !contract.UseGas(params.ColdAccountAccessCostEIP2929 - params.WarmStorageReadCostEIP2929) { + warmAccess := evm.IntraBlockState().AddressInAccessList(addr) + // The WarmStorageReadCostEIP2929 (100) is already deducted in the form of a constant cost, so + // the cost to charge for cold access, if any, is Cold - Warm + coldCost := params.ColdAccountAccessCostEIP2929 - params.WarmStorageReadCostEIP2929 + if !warmAccess { + evm.IntraBlockState().AddAddressToAccessList(addr) + // Charge the remaining difference here already, to correctly calculate available + // gas for call + if !contract.UseGas(coldCost) { return 0, ErrOutOfGas } } @@ -179,7 +184,16 @@ func makeCallVariantGasCallEIP2929(oldCalculator gasFunc) gasFunc { // - transfer value // - memory expansion // - 63/64ths rule - return oldCalculator(evm, contract, stack, mem, memorySize) + gas, err := oldCalculator(evm, contract, stack, mem, memorySize) + if warmAccess || err != nil { + return gas, err + } + // In case of a cold access, we temporarily add the cold charge back, and also + // add it to the returned gas. By adding it to the return, it will be charged + // outside of this function, as part of the dynamic gas, and that will make it + // also become correctly reported to tracers. + contract.Gas += coldCost + return gas + coldCost, nil } } @@ -218,17 +232,17 @@ func makeSelfdestructGasFn(refundsEnabled bool) gasFunc { gas uint64 address = common.Address(stack.Peek().Bytes20()) ) - if !evm.IntraBlockState.AddressInAccessList(address) { + if !evm.IntraBlockState().AddressInAccessList(address) { // If the caller cannot afford the cost, this change will be rolled back - evm.IntraBlockState.AddAddressToAccessList(address) + evm.IntraBlockState().AddAddressToAccessList(address) gas = params.ColdAccountAccessCostEIP2929 } // if empty and transfers value - if evm.IntraBlockState.Empty(address) && !evm.IntraBlockState.GetBalance(contract.Address()).IsZero() { + if evm.IntraBlockState().Empty(address) && !evm.IntraBlockState().GetBalance(contract.Address()).IsZero() { gas += params.CreateBySelfdestructGas } - if refundsEnabled && !evm.IntraBlockState.HasSuicided(contract.Address()) { - evm.IntraBlockState.AddRefund(params.SelfdestructRefundGas) + if refundsEnabled && !evm.IntraBlockState().HasSuicided(contract.Address()) { + evm.IntraBlockState().AddRefund(params.SelfdestructRefundGas) } return gas, nil } diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go index fdd2fb31d29..bf514f74e03 100644 --- a/core/vm/runtime/env.go +++ b/core/vm/runtime/env.go @@ -19,6 +19,7 @@ package runtime import ( "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/ethdb" ) func NewEnv(cfg *Config) *vm.EVM { @@ -26,17 +27,18 @@ func NewEnv(cfg *Config) *vm.EVM { Origin: cfg.Origin, GasPrice: cfg.GasPrice, } + blockContext := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - GetHash: cfg.GetHashFn, - CheckTEVM: cfg.CheckTEVM, - Coinbase: cfg.Coinbase, - BlockNumber: cfg.BlockNumber.Uint64(), - Time: cfg.Time.Uint64(), - Difficulty: cfg.Difficulty, - GasLimit: cfg.GasLimit, - BaseFee: cfg.BaseFee, + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + GetHash: cfg.GetHashFn, + ContractHasTEVM: ethdb.GetHasTEVM(cfg.kv), + Coinbase: cfg.Coinbase, + BlockNumber: cfg.BlockNumber.Uint64(), + Time: cfg.Time.Uint64(), + Difficulty: cfg.Difficulty, + GasLimit: cfg.GasLimit, + BaseFee: cfg.BaseFee, } return vm.NewEVM(blockContext, txContext, cfg.State, cfg.ChainConfig, cfg.EVMConfig) diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 799e4927450..75deda37f5d 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -22,6 +22,7 @@ import ( "time" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/ledgerwatch/erigon/ethdb/olddb" @@ -51,29 +52,29 @@ type Config struct { State *state.IntraBlockState r state.StateReader w state.StateWriter + kv kv.Has GetHashFn func(n uint64) common.Hash - CheckTEVM func(common.Hash) (bool, error) } // sets defaults on the config func setDefaults(cfg *Config) { if cfg.ChainConfig == nil { cfg.ChainConfig = ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - DAOForkBlock: new(big.Int), - DAOForkSupport: false, - EIP150Block: new(big.Int), - EIP150Hash: common.Hash{}, - EIP155Block: new(big.Int), - EIP158Block: new(big.Int), - ByzantiumBlock: new(big.Int), - ConstantinopleBlock: new(big.Int), - PetersburgBlock: new(big.Int), - IstanbulBlock: new(big.Int), - MuirGlacierBlock: new(big.Int), - BerlinBlock: new(big.Int), - LondonBlock: new(big.Int), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + DAOForkBlock: new(big.Int), + DAOForkSupport: false, + TangerineWhistleBlock: new(big.Int), + TangerineWhistleHash: common.Hash{}, + SpuriousDragonBlock: new(big.Int), + ByzantiumBlock: new(big.Int), + ConstantinopleBlock: new(big.Int), + PetersburgBlock: new(big.Int), + IstanbulBlock: new(big.Int), + MuirGlacierBlock: new(big.Int), + BerlinBlock: new(big.Int), + LondonBlock: new(big.Int), + ArrowGlacierBlock: new(big.Int), } } @@ -100,9 +101,6 @@ func setDefaults(cfg *Config) { return common.BytesToHash(crypto.Keccak256([]byte(new(big.Int).SetUint64(n).String()))) } } - if cfg.CheckTEVM == nil { - cfg.CheckTEVM = func(common.Hash) (bool, error) { return false, nil } - } } // Execute executes the code using the input as call data during the execution. @@ -121,6 +119,7 @@ func Execute(code, input []byte, cfg *Config, blockNr uint64) ([]byte, *state.In defer db.Close() cfg.r = state.NewDbStateReader(db) cfg.w = state.NewDbStateWriter(db, 0) + cfg.kv = db cfg.State = state.New(cfg.r) } var ( @@ -128,7 +127,7 @@ func Execute(code, input []byte, cfg *Config, blockNr uint64) ([]byte, *state.In vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) - if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber); rules.IsBerlin { + if rules := cfg.ChainConfig.Rules(vmenv.Context().BlockNumber); rules.IsBerlin { cfg.State.PrepareAccessList(cfg.Origin, &address, vm.ActivePrecompiles(rules), nil) } cfg.State.CreateAccount(address, true) @@ -159,13 +158,14 @@ func Create(input []byte, cfg *Config, blockNr uint64) ([]byte, common.Address, defer db.Close() cfg.r = state.NewDbStateReader(db) cfg.w = state.NewDbStateWriter(db, 0) + cfg.kv = db cfg.State = state.New(cfg.r) } var ( vmenv = NewEnv(cfg) sender = vm.AccountRef(cfg.Origin) ) - if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber); rules.IsBerlin { + if rules := cfg.ChainConfig.Rules(vmenv.Context().BlockNumber); rules.IsBerlin { cfg.State.PrepareAccessList(cfg.Origin, nil, vm.ActivePrecompiles(rules), nil) } @@ -191,7 +191,7 @@ func Call(address common.Address, input []byte, cfg *Config) ([]byte, uint64, er sender := cfg.State.GetOrNewStateObject(cfg.Origin) statedb := cfg.State - if rules := cfg.ChainConfig.Rules(vmenv.Context.BlockNumber); rules.IsBerlin { + if rules := cfg.ChainConfig.Rules(vmenv.Context().BlockNumber); rules.IsBerlin { statedb.PrepareAccessList(cfg.Origin, &address, vm.ActivePrecompiles(rules), nil) } diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go index 6dd6e247595..1d756cb6a28 100644 --- a/core/vm/runtime/runtime_test.go +++ b/core/vm/runtime/runtime_test.go @@ -115,7 +115,7 @@ func TestCall(t *testing.T) { byte(vm.RETURN), }) - ret, _, err := Call(address, nil, &Config{State: state}) + ret, _, err := Call(address, nil, &Config{State: state, kv: tx}) if err != nil { t.Fatal("didn't expect error", err) } @@ -161,7 +161,7 @@ func BenchmarkCall(b *testing.B) { func benchmarkEVM_Create(bench *testing.B, code string) { _, tx := memdb.NewTestTx(bench) var ( - statedb = state.New(state.NewPlainState(tx, 0)) + statedb = state.New(state.NewPlainState(tx, 1)) sender = common.BytesToAddress([]byte("sender")) receiver = common.BytesToAddress([]byte("receiver")) ) @@ -177,15 +177,14 @@ func benchmarkEVM_Create(bench *testing.B, code string) { Coinbase: common.Address{}, BlockNumber: new(big.Int).SetUint64(1), ChainConfig: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - ByzantiumBlock: new(big.Int), - ConstantinopleBlock: new(big.Int), - DAOForkBlock: new(big.Int), - DAOForkSupport: false, - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: new(big.Int), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + ByzantiumBlock: new(big.Int), + ConstantinopleBlock: new(big.Int), + DAOForkBlock: new(big.Int), + DAOForkSupport: false, + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: new(big.Int), }, EVMConfig: vm.Config{}, } @@ -310,7 +309,7 @@ func TestBlockhash(t *testing.T) { zero := new(big.Int).SetBytes(ret[0:32]) first := new(big.Int).SetBytes(ret[32:64]) last := new(big.Int).SetBytes(ret[64:96]) - if zero.BitLen() != 0 { + if zero.Sign() != 0 { t.Fatalf("expected zeroes, got %x", ret[0:32]) } if first.Uint64() != 999 { @@ -330,7 +329,7 @@ func benchmarkNonModifyingCode(gas uint64, code []byte, name string, b *testing. cfg := new(Config) setDefaults(cfg) _, tx := memdb.NewTestTx(b) - cfg.State = state.New(state.NewPlainState(tx, 0)) + cfg.State = state.New(state.NewPlainState(tx, 1)) cfg.GasLimit = gas var ( destination = common.BytesToAddress([]byte("contract")) diff --git a/core/vm/tevm_interpreter.go b/core/vm/tevm_interpreter.go index f5c73191e3c..4053ce944b1 100644 --- a/core/vm/tevm_interpreter.go +++ b/core/vm/tevm_interpreter.go @@ -18,3 +18,7 @@ const ( func NewTEVMInterpreter(evm *EVM, cfg Config) *TEVMInterpreter { return &TEVMInterpreter{NewEVMInterpreter(evm, cfg)} } + +func NewTEVMInterpreterByVM(vm *VM) *TEVMInterpreter { + return &TEVMInterpreter{NewEVMInterpreterByVM(vm)} +} diff --git a/crypto/blake2b/blake2bAVX2_amd64.go b/crypto/blake2b/blake2bAVX2_amd64.go index 0d52b186990..bfeee2be9ea 100644 --- a/crypto/blake2b/blake2bAVX2_amd64.go +++ b/crypto/blake2b/blake2bAVX2_amd64.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.7,amd64,!gccgo,!appengine +//go:build go1.7 && amd64 && !gccgo && !appengine package blake2b diff --git a/crypto/blake2b/blake2b_amd64.go b/crypto/blake2b/blake2b_amd64.go index 4dbe90da8f1..7f933ecb92e 100644 --- a/crypto/blake2b/blake2b_amd64.go +++ b/crypto/blake2b/blake2b_amd64.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !go1.7,amd64,!gccgo,!appengine +//go:build !go1.7 && amd64 && !gccgo && !appengine package blake2b diff --git a/crypto/blake2b/blake2b_f_fuzz.go b/crypto/blake2b/blake2b_f_fuzz.go index ab73342803f..5b7eb678d32 100644 --- a/crypto/blake2b/blake2b_f_fuzz.go +++ b/crypto/blake2b/blake2b_f_fuzz.go @@ -1,4 +1,4 @@ -// +build gofuzz +//go:build gofuzz package blake2b diff --git a/crypto/blake2b/blake2b_ref.go b/crypto/blake2b/blake2b_ref.go index 9d0ade473a1..682544100f0 100644 --- a/crypto/blake2b/blake2b_ref.go +++ b/crypto/blake2b/blake2b_ref.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !amd64 appengine gccgo +//go:build !amd64 || appengine || gccgo package blake2b diff --git a/crypto/blake2b/register.go b/crypto/blake2b/register.go index efd689af4b4..d9fcac3a4de 100644 --- a/crypto/blake2b/register.go +++ b/crypto/blake2b/register.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build go1.9 +//go:build go1.9 package blake2b diff --git a/crypto/bls12381/arithmetic_decl.go b/crypto/bls12381/arithmetic_decl.go index ec0b21e8055..aba0233c447 100644 --- a/crypto/bls12381/arithmetic_decl.go +++ b/crypto/bls12381/arithmetic_decl.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build amd64,blsasm amd64,blsadx +//go:build (amd64 && blsasm) || (amd64 && blsadx) package bls12381 diff --git a/crypto/bls12381/arithmetic_fallback.go b/crypto/bls12381/arithmetic_fallback.go index 91cabf4f3dc..b7774bebcb2 100644 --- a/crypto/bls12381/arithmetic_fallback.go +++ b/crypto/bls12381/arithmetic_fallback.go @@ -31,7 +31,7 @@ // Package bls (generated by goff) contains field arithmetics operations -// +build !amd64 !blsasm,!blsadx +//go:build !amd64 || (!blsasm && !blsadx) package bls12381 diff --git a/crypto/bls12381/arithmetic_x86_adx.go b/crypto/bls12381/arithmetic_x86_adx.go index 9c30741e6af..00ef35b33a8 100644 --- a/crypto/bls12381/arithmetic_x86_adx.go +++ b/crypto/bls12381/arithmetic_x86_adx.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build amd64,blsadx +//go:build amd64 && blsadx package bls12381 diff --git a/crypto/bls12381/arithmetic_x86_noadx.go b/crypto/bls12381/arithmetic_x86_noadx.go index eaac4b45d7d..5a0fdf08f51 100644 --- a/crypto/bls12381/arithmetic_x86_noadx.go +++ b/crypto/bls12381/arithmetic_x86_noadx.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build amd64,blsasm +//go:build amd64 && blsasm package bls12381 diff --git a/crypto/bls12381/bls12_381.go b/crypto/bls12381/bls12_381.go index fda37fb20c6..c4b7715447f 100644 --- a/crypto/bls12381/bls12_381.go +++ b/crypto/bls12381/bls12_381.go @@ -120,105 +120,105 @@ var g2One = PointG2{ */ var frobeniusCoeffs61 = [6]fe2{ - fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, }, - fe2{ + { fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, }, - fe2{ + { fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, }, } var frobeniusCoeffs62 = [6]fe2{ - fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x890dc9e4867545c3, 0x2af322533285a5d5, 0x50880866309b7e2c, 0xa20d1b8c7e881024, 0x14e4f04fe2db9068, 0x14e56d3f1564853a}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x43f5fffffffcaaae, 0x32b7fff2ed47fffd, 0x07e83a49a2e99d69, 0xeca8f3318332bb7a, 0xef148d1ea0f4c069, 0x040ab3263eff0206}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0xecfb361b798dba3a, 0xc100ddb891865a2c, 0x0ec08ff1232bda8e, 0xd5c13cc6f1ca4721, 0x47222a47bf7b5c04, 0x0110f184e51c5f59}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, } var frobeniusCoeffs12 = [12]fe2{ - fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x07089552b319d465, 0xc6695f92b50a8313, 0x97e83cccd117228f, 0xa35baecab2dc29ee, 0x1ce393ea5daace4d, 0x08f2220fb0fb66eb}, fe{0xb2f66aad4ce5d646, 0x5842a06bfc497cec, 0xcf4895d42599d394, 0xc11b9cba40a8e8d0, 0x2e3813cbe5a0de89, 0x110eefda88847faf}, }, - fe2{ + { fe{0xecfb361b798dba3a, 0xc100ddb891865a2c, 0x0ec08ff1232bda8e, 0xd5c13cc6f1ca4721, 0x47222a47bf7b5c04, 0x0110f184e51c5f59}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x3e2f585da55c9ad1, 0x4294213d86c18183, 0x382844c88b623732, 0x92ad2afd19103e18, 0x1d794e4fac7cf0b9, 0x0bd592fc7d825ec8}, fe{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}, }, - fe2{ + { fe{0x30f1361b798a64e8, 0xf3b8ddab7ece5a2a, 0x16a8ca3ac61577f7, 0xc26a2ff874fd029b, 0x3636b76660701c6e, 0x051ba4ab241b6160}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x3726c30af242c66c, 0x7c2ac1aad1b6fe70, 0xa04007fbba4b14a2, 0xef517c3266341429, 0x0095ba654ed2226b, 0x02e370eccc86f7dd}, fe{0x82d83cf50dbce43f, 0xa2813e53df9d018f, 0xc6f0caa53c65e181, 0x7525cf528d50fe95, 0x4a85ed50f4798a6b, 0x171da0fd6cf8eebd}, }, - fe2{ + { fe{0x43f5fffffffcaaae, 0x32b7fff2ed47fffd, 0x07e83a49a2e99d69, 0xeca8f3318332bb7a, 0xef148d1ea0f4c069, 0x040ab3263eff0206}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0xb2f66aad4ce5d646, 0x5842a06bfc497cec, 0xcf4895d42599d394, 0xc11b9cba40a8e8d0, 0x2e3813cbe5a0de89, 0x110eefda88847faf}, fe{0x07089552b319d465, 0xc6695f92b50a8313, 0x97e83cccd117228f, 0xa35baecab2dc29ee, 0x1ce393ea5daace4d, 0x08f2220fb0fb66eb}, }, - fe2{ + { fe{0xcd03c9e48671f071, 0x5dab22461fcda5d2, 0x587042afd3851b95, 0x8eb60ebe01bacb9e, 0x03f97d6e83d050d2, 0x18f0206554638741}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x7bcfa7a25aa30fda, 0xdc17dec12a927e7c, 0x2f088dd86b4ebef1, 0xd1ca2087da74d4a7, 0x2da2596696cebc1d, 0x0e2b7eedbbfd87d2}, fe{0x3e2f585da55c9ad1, 0x4294213d86c18183, 0x382844c88b623732, 0x92ad2afd19103e18, 0x1d794e4fac7cf0b9, 0x0bd592fc7d825ec8}, }, - fe2{ + { fe{0x890dc9e4867545c3, 0x2af322533285a5d5, 0x50880866309b7e2c, 0xa20d1b8c7e881024, 0x14e4f04fe2db9068, 0x14e56d3f1564853a}, fe{0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000}, }, - fe2{ + { fe{0x82d83cf50dbce43f, 0xa2813e53df9d018f, 0xc6f0caa53c65e181, 0x7525cf528d50fe95, 0x4a85ed50f4798a6b, 0x171da0fd6cf8eebd}, fe{0x3726c30af242c66c, 0x7c2ac1aad1b6fe70, 0xa04007fbba4b14a2, 0xef517c3266341429, 0x0095ba654ed2226b, 0x02e370eccc86f7dd}, }, diff --git a/crypto/bls12381/isogeny.go b/crypto/bls12381/isogeny.go index edd9f8cb697..c5428f0ff3a 100644 --- a/crypto/bls12381/isogeny.go +++ b/crypto/bls12381/isogeny.go @@ -78,149 +78,149 @@ func isogenyMapG2(e *fp2, x, y *fe2) { } var isogenyConstansG1 = [4][16]*fe{ - [16]*fe{ - &fe{0x4d18b6f3af00131c, 0x19fa219793fee28c, 0x3f2885f1467f19ae, 0x23dcea34f2ffb304, 0xd15b58d2ffc00054, 0x0913be200a20bef4}, - &fe{0x898985385cdbbd8b, 0x3c79e43cc7d966aa, 0x1597e193f4cd233a, 0x8637ef1e4d6623ad, 0x11b22deed20d827b, 0x07097bc5998784ad}, - &fe{0xa542583a480b664b, 0xfc7169c026e568c6, 0x5ba2ef314ed8b5a6, 0x5b5491c05102f0e7, 0xdf6e99707d2a0079, 0x0784151ed7605524}, - &fe{0x494e212870f72741, 0xab9be52fbda43021, 0x26f5577994e34c3d, 0x049dfee82aefbd60, 0x65dadd7828505289, 0x0e93d431ea011aeb}, - &fe{0x90ee774bd6a74d45, 0x7ada1c8a41bfb185, 0x0f1a8953b325f464, 0x104c24211be4805c, 0x169139d319ea7a8f, 0x09f20ead8e532bf6}, - &fe{0x6ddd93e2f43626b7, 0xa5482c9aa1ccd7bd, 0x143245631883f4bd, 0x2e0a94ccf77ec0db, 0xb0282d480e56489f, 0x18f4bfcbb4368929}, - &fe{0x23c5f0c953402dfd, 0x7a43ff6958ce4fe9, 0x2c390d3d2da5df63, 0xd0df5c98e1f9d70f, 0xffd89869a572b297, 0x1277ffc72f25e8fe}, - &fe{0x79f4f0490f06a8a6, 0x85f894a88030fd81, 0x12da3054b18b6410, 0xe2a57f6505880d65, 0xbba074f260e400f1, 0x08b76279f621d028}, - &fe{0xe67245ba78d5b00b, 0x8456ba9a1f186475, 0x7888bff6e6b33bb4, 0xe21585b9a30f86cb, 0x05a69cdcef55feee, 0x09e699dd9adfa5ac}, - &fe{0x0de5c357bff57107, 0x0a0db4ae6b1a10b2, 0xe256bb67b3b3cd8d, 0x8ad456574e9db24f, 0x0443915f50fd4179, 0x098c4bf7de8b6375}, - &fe{0xe6b0617e7dd929c7, 0xfe6e37d442537375, 0x1dafdeda137a489e, 0xe4efd1ad3f767ceb, 0x4a51d8667f0fe1cf, 0x054fdf4bbf1d821c}, - &fe{0x72db2a50658d767b, 0x8abf91faa257b3d5, 0xe969d6833764ab47, 0x464170142a1009eb, 0xb14f01aadb30be2f, 0x18ae6a856f40715d}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, + { + {0x4d18b6f3af00131c, 0x19fa219793fee28c, 0x3f2885f1467f19ae, 0x23dcea34f2ffb304, 0xd15b58d2ffc00054, 0x0913be200a20bef4}, + {0x898985385cdbbd8b, 0x3c79e43cc7d966aa, 0x1597e193f4cd233a, 0x8637ef1e4d6623ad, 0x11b22deed20d827b, 0x07097bc5998784ad}, + {0xa542583a480b664b, 0xfc7169c026e568c6, 0x5ba2ef314ed8b5a6, 0x5b5491c05102f0e7, 0xdf6e99707d2a0079, 0x0784151ed7605524}, + {0x494e212870f72741, 0xab9be52fbda43021, 0x26f5577994e34c3d, 0x049dfee82aefbd60, 0x65dadd7828505289, 0x0e93d431ea011aeb}, + {0x90ee774bd6a74d45, 0x7ada1c8a41bfb185, 0x0f1a8953b325f464, 0x104c24211be4805c, 0x169139d319ea7a8f, 0x09f20ead8e532bf6}, + {0x6ddd93e2f43626b7, 0xa5482c9aa1ccd7bd, 0x143245631883f4bd, 0x2e0a94ccf77ec0db, 0xb0282d480e56489f, 0x18f4bfcbb4368929}, + {0x23c5f0c953402dfd, 0x7a43ff6958ce4fe9, 0x2c390d3d2da5df63, 0xd0df5c98e1f9d70f, 0xffd89869a572b297, 0x1277ffc72f25e8fe}, + {0x79f4f0490f06a8a6, 0x85f894a88030fd81, 0x12da3054b18b6410, 0xe2a57f6505880d65, 0xbba074f260e400f1, 0x08b76279f621d028}, + {0xe67245ba78d5b00b, 0x8456ba9a1f186475, 0x7888bff6e6b33bb4, 0xe21585b9a30f86cb, 0x05a69cdcef55feee, 0x09e699dd9adfa5ac}, + {0x0de5c357bff57107, 0x0a0db4ae6b1a10b2, 0xe256bb67b3b3cd8d, 0x8ad456574e9db24f, 0x0443915f50fd4179, 0x098c4bf7de8b6375}, + {0xe6b0617e7dd929c7, 0xfe6e37d442537375, 0x1dafdeda137a489e, 0xe4efd1ad3f767ceb, 0x4a51d8667f0fe1cf, 0x054fdf4bbf1d821c}, + {0x72db2a50658d767b, 0x8abf91faa257b3d5, 0xe969d6833764ab47, 0x464170142a1009eb, 0xb14f01aadb30be2f, 0x18ae6a856f40715d}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0}, }, - [16]*fe{ - &fe{0xb962a077fdb0f945, 0xa6a9740fefda13a0, 0xc14d568c3ed6c544, 0xb43fc37b908b133e, 0x9c0b3ac929599016, 0x0165aa6c93ad115f}, - &fe{0x23279a3ba506c1d9, 0x92cfca0a9465176a, 0x3b294ab13755f0ff, 0x116dda1c5070ae93, 0xed4530924cec2045, 0x083383d6ed81f1ce}, - &fe{0x9885c2a6449fecfc, 0x4a2b54ccd37733f0, 0x17da9ffd8738c142, 0xa0fba72732b3fafd, 0xff364f36e54b6812, 0x0f29c13c660523e2}, - &fe{0xe349cc118278f041, 0xd487228f2f3204fb, 0xc9d325849ade5150, 0x43a92bd69c15c2df, 0x1c2c7844bc417be4, 0x12025184f407440c}, - &fe{0x587f65ae6acb057b, 0x1444ef325140201f, 0xfbf995e71270da49, 0xccda066072436a42, 0x7408904f0f186bb2, 0x13b93c63edf6c015}, - &fe{0xfb918622cd141920, 0x4a4c64423ecaddb4, 0x0beb232927f7fb26, 0x30f94df6f83a3dc2, 0xaeedd424d780f388, 0x06cc402dd594bbeb}, - &fe{0xd41f761151b23f8f, 0x32a92465435719b3, 0x64f436e888c62cb9, 0xdf70a9a1f757c6e4, 0x6933a38d5b594c81, 0x0c6f7f7237b46606}, - &fe{0x693c08747876c8f7, 0x22c9850bf9cf80f0, 0x8e9071dab950c124, 0x89bc62d61c7baf23, 0xbc6be2d8dad57c23, 0x17916987aa14a122}, - &fe{0x1be3ff439c1316fd, 0x9965243a7571dfa7, 0xc7f7f62962f5cd81, 0x32c6aa9af394361c, 0xbbc2ee18e1c227f4, 0x0c102cbac531bb34}, - &fe{0x997614c97bacbf07, 0x61f86372b99192c0, 0x5b8c95fc14353fc3, 0xca2b066c2a87492f, 0x16178f5bbf698711, 0x12a6dcd7f0f4e0e8}, - &fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, - &fe{0, 0, 0, 0, 0, 0}, + { + {0xb962a077fdb0f945, 0xa6a9740fefda13a0, 0xc14d568c3ed6c544, 0xb43fc37b908b133e, 0x9c0b3ac929599016, 0x0165aa6c93ad115f}, + {0x23279a3ba506c1d9, 0x92cfca0a9465176a, 0x3b294ab13755f0ff, 0x116dda1c5070ae93, 0xed4530924cec2045, 0x083383d6ed81f1ce}, + {0x9885c2a6449fecfc, 0x4a2b54ccd37733f0, 0x17da9ffd8738c142, 0xa0fba72732b3fafd, 0xff364f36e54b6812, 0x0f29c13c660523e2}, + {0xe349cc118278f041, 0xd487228f2f3204fb, 0xc9d325849ade5150, 0x43a92bd69c15c2df, 0x1c2c7844bc417be4, 0x12025184f407440c}, + {0x587f65ae6acb057b, 0x1444ef325140201f, 0xfbf995e71270da49, 0xccda066072436a42, 0x7408904f0f186bb2, 0x13b93c63edf6c015}, + {0xfb918622cd141920, 0x4a4c64423ecaddb4, 0x0beb232927f7fb26, 0x30f94df6f83a3dc2, 0xaeedd424d780f388, 0x06cc402dd594bbeb}, + {0xd41f761151b23f8f, 0x32a92465435719b3, 0x64f436e888c62cb9, 0xdf70a9a1f757c6e4, 0x6933a38d5b594c81, 0x0c6f7f7237b46606}, + {0x693c08747876c8f7, 0x22c9850bf9cf80f0, 0x8e9071dab950c124, 0x89bc62d61c7baf23, 0xbc6be2d8dad57c23, 0x17916987aa14a122}, + {0x1be3ff439c1316fd, 0x9965243a7571dfa7, 0xc7f7f62962f5cd81, 0x32c6aa9af394361c, 0xbbc2ee18e1c227f4, 0x0c102cbac531bb34}, + {0x997614c97bacbf07, 0x61f86372b99192c0, 0x5b8c95fc14353fc3, 0xca2b066c2a87492f, 0x16178f5bbf698711, 0x12a6dcd7f0f4e0e8}, + {0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, + {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}, }, - [16]*fe{ - &fe{0x2b567ff3e2837267, 0x1d4d9e57b958a767, 0xce028fea04bd7373, 0xcc31a30a0b6cd3df, 0x7d7b18a682692693, 0x0d300744d42a0310}, - &fe{0x99c2555fa542493f, 0xfe7f53cc4874f878, 0x5df0608b8f97608a, 0x14e03832052b49c8, 0x706326a6957dd5a4, 0x0a8dadd9c2414555}, - &fe{0x13d942922a5cf63a, 0x357e33e36e261e7d, 0xcf05a27c8456088d, 0x0000bd1de7ba50f0, 0x83d0c7532f8c1fde, 0x13f70bf38bbf2905}, - &fe{0x5c57fd95bfafbdbb, 0x28a359a65e541707, 0x3983ceb4f6360b6d, 0xafe19ff6f97e6d53, 0xb3468f4550192bf7, 0x0bb6cde49d8ba257}, - &fe{0x590b62c7ff8a513f, 0x314b4ce372cacefd, 0x6bef32ce94b8a800, 0x6ddf84a095713d5f, 0x64eace4cb0982191, 0x0386213c651b888d}, - &fe{0xa5310a31111bbcdd, 0xa14ac0f5da148982, 0xf9ad9cc95423d2e9, 0xaa6ec095283ee4a7, 0xcf5b1f022e1c9107, 0x01fddf5aed881793}, - &fe{0x65a572b0d7a7d950, 0xe25c2d8183473a19, 0xc2fcebe7cb877dbd, 0x05b2d36c769a89b0, 0xba12961be86e9efb, 0x07eb1b29c1dfde1f}, - &fe{0x93e09572f7c4cd24, 0x364e929076795091, 0x8569467e68af51b5, 0xa47da89439f5340f, 0xf4fa918082e44d64, 0x0ad52ba3e6695a79}, - &fe{0x911429844e0d5f54, 0xd03f51a3516bb233, 0x3d587e5640536e66, 0xfa86d2a3a9a73482, 0xa90ed5adf1ed5537, 0x149c9c326a5e7393}, - &fe{0x462bbeb03c12921a, 0xdc9af5fa0a274a17, 0x9a558ebde836ebed, 0x649ef8f11a4fae46, 0x8100e1652b3cdc62, 0x1862bd62c291dacb}, - &fe{0x05c9b8ca89f12c26, 0x0194160fa9b9ac4f, 0x6a643d5a6879fa2c, 0x14665bdd8846e19d, 0xbb1d0d53af3ff6bf, 0x12c7e1c3b28962e5}, - &fe{0xb55ebf900b8a3e17, 0xfedc77ec1a9201c4, 0x1f07db10ea1a4df4, 0x0dfbd15dc41a594d, 0x389547f2334a5391, 0x02419f98165871a4}, - &fe{0xb416af000745fc20, 0x8e563e9d1ea6d0f5, 0x7c763e17763a0652, 0x01458ef0159ebbef, 0x8346fe421f96bb13, 0x0d2d7b829ce324d2}, - &fe{0x93096bb538d64615, 0x6f2a2619951d823a, 0x8f66b3ea59514fa4, 0xf563e63704f7092f, 0x724b136c4cf2d9fa, 0x046959cfcfd0bf49}, - &fe{0xea748d4b6e405346, 0x91e9079c2c02d58f, 0x41064965946d9b59, 0xa06731f1d2bbe1ee, 0x07f897e267a33f1b, 0x1017290919210e5f}, - &fe{0x872aa6c17d985097, 0xeecc53161264562a, 0x07afe37afff55002, 0x54759078e5be6838, 0xc4b92d15db8acca8, 0x106d87d1b51d13b9}, + { + {0x2b567ff3e2837267, 0x1d4d9e57b958a767, 0xce028fea04bd7373, 0xcc31a30a0b6cd3df, 0x7d7b18a682692693, 0x0d300744d42a0310}, + {0x99c2555fa542493f, 0xfe7f53cc4874f878, 0x5df0608b8f97608a, 0x14e03832052b49c8, 0x706326a6957dd5a4, 0x0a8dadd9c2414555}, + {0x13d942922a5cf63a, 0x357e33e36e261e7d, 0xcf05a27c8456088d, 0x0000bd1de7ba50f0, 0x83d0c7532f8c1fde, 0x13f70bf38bbf2905}, + {0x5c57fd95bfafbdbb, 0x28a359a65e541707, 0x3983ceb4f6360b6d, 0xafe19ff6f97e6d53, 0xb3468f4550192bf7, 0x0bb6cde49d8ba257}, + {0x590b62c7ff8a513f, 0x314b4ce372cacefd, 0x6bef32ce94b8a800, 0x6ddf84a095713d5f, 0x64eace4cb0982191, 0x0386213c651b888d}, + {0xa5310a31111bbcdd, 0xa14ac0f5da148982, 0xf9ad9cc95423d2e9, 0xaa6ec095283ee4a7, 0xcf5b1f022e1c9107, 0x01fddf5aed881793}, + {0x65a572b0d7a7d950, 0xe25c2d8183473a19, 0xc2fcebe7cb877dbd, 0x05b2d36c769a89b0, 0xba12961be86e9efb, 0x07eb1b29c1dfde1f}, + {0x93e09572f7c4cd24, 0x364e929076795091, 0x8569467e68af51b5, 0xa47da89439f5340f, 0xf4fa918082e44d64, 0x0ad52ba3e6695a79}, + {0x911429844e0d5f54, 0xd03f51a3516bb233, 0x3d587e5640536e66, 0xfa86d2a3a9a73482, 0xa90ed5adf1ed5537, 0x149c9c326a5e7393}, + {0x462bbeb03c12921a, 0xdc9af5fa0a274a17, 0x9a558ebde836ebed, 0x649ef8f11a4fae46, 0x8100e1652b3cdc62, 0x1862bd62c291dacb}, + {0x05c9b8ca89f12c26, 0x0194160fa9b9ac4f, 0x6a643d5a6879fa2c, 0x14665bdd8846e19d, 0xbb1d0d53af3ff6bf, 0x12c7e1c3b28962e5}, + {0xb55ebf900b8a3e17, 0xfedc77ec1a9201c4, 0x1f07db10ea1a4df4, 0x0dfbd15dc41a594d, 0x389547f2334a5391, 0x02419f98165871a4}, + {0xb416af000745fc20, 0x8e563e9d1ea6d0f5, 0x7c763e17763a0652, 0x01458ef0159ebbef, 0x8346fe421f96bb13, 0x0d2d7b829ce324d2}, + {0x93096bb538d64615, 0x6f2a2619951d823a, 0x8f66b3ea59514fa4, 0xf563e63704f7092f, 0x724b136c4cf2d9fa, 0x046959cfcfd0bf49}, + {0xea748d4b6e405346, 0x91e9079c2c02d58f, 0x41064965946d9b59, 0xa06731f1d2bbe1ee, 0x07f897e267a33f1b, 0x1017290919210e5f}, + {0x872aa6c17d985097, 0xeecc53161264562a, 0x07afe37afff55002, 0x54759078e5be6838, 0xc4b92d15db8acca8, 0x106d87d1b51d13b9}, }, - [16]*fe{ - &fe{0xeb6c359d47e52b1c, 0x18ef5f8a10634d60, 0xddfa71a0889d5b7e, 0x723e71dcc5fc1323, 0x52f45700b70d5c69, 0x0a8b981ee47691f1}, - &fe{0x616a3c4f5535b9fb, 0x6f5f037395dbd911, 0xf25f4cc5e35c65da, 0x3e50dffea3c62658, 0x6a33dca523560776, 0x0fadeff77b6bfe3e}, - &fe{0x2be9b66df470059c, 0x24a2c159a3d36742, 0x115dbe7ad10c2a37, 0xb6634a652ee5884d, 0x04fe8bb2b8d81af4, 0x01c2a7a256fe9c41}, - &fe{0xf27bf8ef3b75a386, 0x898b367476c9073f, 0x24482e6b8c2f4e5f, 0xc8e0bbd6fe110806, 0x59b0c17f7631448a, 0x11037cd58b3dbfbd}, - &fe{0x31c7912ea267eec6, 0x1dbf6f1c5fcdb700, 0xd30d4fe3ba86fdb1, 0x3cae528fbee9a2a4, 0xb1cce69b6aa9ad9a, 0x044393bb632d94fb}, - &fe{0xc66ef6efeeb5c7e8, 0x9824c289dd72bb55, 0x71b1a4d2f119981d, 0x104fc1aafb0919cc, 0x0e49df01d942a628, 0x096c3a09773272d4}, - &fe{0x9abc11eb5fadeff4, 0x32dca50a885728f0, 0xfb1fa3721569734c, 0xc4b76271ea6506b3, 0xd466a75599ce728e, 0x0c81d4645f4cb6ed}, - &fe{0x4199f10e5b8be45b, 0xda64e495b1e87930, 0xcb353efe9b33e4ff, 0x9e9efb24aa6424c6, 0xf08d33680a237465, 0x0d3378023e4c7406}, - &fe{0x7eb4ae92ec74d3a5, 0xc341b4aa9fac3497, 0x5be603899e907687, 0x03bfd9cca75cbdeb, 0x564c2935a96bfa93, 0x0ef3c33371e2fdb5}, - &fe{0x7ee91fd449f6ac2e, 0xe5d5bd5cb9357a30, 0x773a8ca5196b1380, 0xd0fda172174ed023, 0x6cb95e0fa776aead, 0x0d22d5a40cec7cff}, - &fe{0xf727e09285fd8519, 0xdc9d55a83017897b, 0x7549d8bd057894ae, 0x178419613d90d8f8, 0xfce95ebdeb5b490a, 0x0467ffaef23fc49e}, - &fe{0xc1769e6a7c385f1b, 0x79bc930deac01c03, 0x5461c75a23ede3b5, 0x6e20829e5c230c45, 0x828e0f1e772a53cd, 0x116aefa749127bff}, - &fe{0x101c10bf2744c10a, 0xbbf18d053a6a3154, 0xa0ecf39ef026f602, 0xfc009d4996dc5153, 0xb9000209d5bd08d3, 0x189e5fe4470cd73c}, - &fe{0x7ebd546ca1575ed2, 0xe47d5a981d081b55, 0x57b2b625b6d4ca21, 0xb0a1ba04228520cc, 0x98738983c2107ff3, 0x13dddbc4799d81d6}, - &fe{0x09319f2e39834935, 0x039e952cbdb05c21, 0x55ba77a9a2f76493, 0xfd04e3dfc6086467, 0xfb95832e7d78742e, 0x0ef9c24eccaf5e0e}, - &fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, + { + {0xeb6c359d47e52b1c, 0x18ef5f8a10634d60, 0xddfa71a0889d5b7e, 0x723e71dcc5fc1323, 0x52f45700b70d5c69, 0x0a8b981ee47691f1}, + {0x616a3c4f5535b9fb, 0x6f5f037395dbd911, 0xf25f4cc5e35c65da, 0x3e50dffea3c62658, 0x6a33dca523560776, 0x0fadeff77b6bfe3e}, + {0x2be9b66df470059c, 0x24a2c159a3d36742, 0x115dbe7ad10c2a37, 0xb6634a652ee5884d, 0x04fe8bb2b8d81af4, 0x01c2a7a256fe9c41}, + {0xf27bf8ef3b75a386, 0x898b367476c9073f, 0x24482e6b8c2f4e5f, 0xc8e0bbd6fe110806, 0x59b0c17f7631448a, 0x11037cd58b3dbfbd}, + {0x31c7912ea267eec6, 0x1dbf6f1c5fcdb700, 0xd30d4fe3ba86fdb1, 0x3cae528fbee9a2a4, 0xb1cce69b6aa9ad9a, 0x044393bb632d94fb}, + {0xc66ef6efeeb5c7e8, 0x9824c289dd72bb55, 0x71b1a4d2f119981d, 0x104fc1aafb0919cc, 0x0e49df01d942a628, 0x096c3a09773272d4}, + {0x9abc11eb5fadeff4, 0x32dca50a885728f0, 0xfb1fa3721569734c, 0xc4b76271ea6506b3, 0xd466a75599ce728e, 0x0c81d4645f4cb6ed}, + {0x4199f10e5b8be45b, 0xda64e495b1e87930, 0xcb353efe9b33e4ff, 0x9e9efb24aa6424c6, 0xf08d33680a237465, 0x0d3378023e4c7406}, + {0x7eb4ae92ec74d3a5, 0xc341b4aa9fac3497, 0x5be603899e907687, 0x03bfd9cca75cbdeb, 0x564c2935a96bfa93, 0x0ef3c33371e2fdb5}, + {0x7ee91fd449f6ac2e, 0xe5d5bd5cb9357a30, 0x773a8ca5196b1380, 0xd0fda172174ed023, 0x6cb95e0fa776aead, 0x0d22d5a40cec7cff}, + {0xf727e09285fd8519, 0xdc9d55a83017897b, 0x7549d8bd057894ae, 0x178419613d90d8f8, 0xfce95ebdeb5b490a, 0x0467ffaef23fc49e}, + {0xc1769e6a7c385f1b, 0x79bc930deac01c03, 0x5461c75a23ede3b5, 0x6e20829e5c230c45, 0x828e0f1e772a53cd, 0x116aefa749127bff}, + {0x101c10bf2744c10a, 0xbbf18d053a6a3154, 0xa0ecf39ef026f602, 0xfc009d4996dc5153, 0xb9000209d5bd08d3, 0x189e5fe4470cd73c}, + {0x7ebd546ca1575ed2, 0xe47d5a981d081b55, 0x57b2b625b6d4ca21, 0xb0a1ba04228520cc, 0x98738983c2107ff3, 0x13dddbc4799d81d6}, + {0x09319f2e39834935, 0x039e952cbdb05c21, 0x55ba77a9a2f76493, 0xfd04e3dfc6086467, 0xfb95832e7d78742e, 0x0ef9c24eccaf5e0e}, + {0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, }, } var isogenyConstantsG2 = [4][4]*fe2{ - [4]*fe2{ - &fe2{ + { + { fe{0x47f671c71ce05e62, 0x06dd57071206393e, 0x7c80cd2af3fd71a2, 0x048103ea9e6cd062, 0xc54516acc8d037f6, 0x13808f550920ea41}, fe{0x47f671c71ce05e62, 0x06dd57071206393e, 0x7c80cd2af3fd71a2, 0x048103ea9e6cd062, 0xc54516acc8d037f6, 0x13808f550920ea41}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0x5fe55555554c71d0, 0x873fffdd236aaaa3, 0x6a6b4619b26ef918, 0x21c2888408874945, 0x2836cda7028cabc5, 0x0ac73310a7fd5abd}, }, - &fe2{ + { fe{0x0a0c5555555971c3, 0xdb0c00101f9eaaae, 0xb1fb2f941d797997, 0xd3960742ef416e1c, 0xb70040e2c20556f4, 0x149d7861e581393b}, fe{0xaff2aaaaaaa638e8, 0x439fffee91b55551, 0xb535a30cd9377c8c, 0x90e144420443a4a2, 0x941b66d3814655e2, 0x0563998853fead5e}, }, - &fe2{ + { fe{0x40aac71c71c725ed, 0x190955557a84e38e, 0xd817050a8f41abc3, 0xd86485d4c87f6fb1, 0x696eb479f885d059, 0x198e1a74328002d2}, fe{0, 0, 0, 0, 0, 0}, }, }, - [4]*fe2{ - &fe2{ + { + { fe{0, 0, 0, 0, 0, 0}, fe{0x1f3affffff13ab97, 0xf25bfc611da3ff3e, 0xca3757cb3819b208, 0x3e6427366f8cec18, 0x03977bc86095b089, 0x04f69db13f39a952}, }, - &fe2{ + { fe{0x447600000027552e, 0xdcb8009a43480020, 0x6f7ee9ce4a6e8b59, 0xb10330b7c0a95bc6, 0x6140b1fcfb1e54b7, 0x0381be097f0bb4e1}, fe{0x7588ffffffd8557d, 0x41f3ff646e0bffdf, 0xf7b1e8d2ac426aca, 0xb3741acd32dbb6f8, 0xe9daf5b9482d581f, 0x167f53e0ba7431b8}, }, - &fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0, 0, 0, 0, 0, 0}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0, 0, 0, 0, 0, 0}, }, }, - [4]*fe2{ - &fe2{ + { + { fe{0x96d8f684bdfc77be, 0xb530e4f43b66d0e2, 0x184a88ff379652fd, 0x57cb23ecfae804e1, 0x0fd2e39eada3eba9, 0x08c8055e31c5d5c3}, fe{0x96d8f684bdfc77be, 0xb530e4f43b66d0e2, 0x184a88ff379652fd, 0x57cb23ecfae804e1, 0x0fd2e39eada3eba9, 0x08c8055e31c5d5c3}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0xbf0a71c71c91b406, 0x4d6d55d28b7638fd, 0x9d82f98e5f205aee, 0xa27aa27b1d1a18d5, 0x02c3b2b2d2938e86, 0x0c7d13420b09807f}, }, - &fe2{ + { fe{0xd7f9555555531c74, 0x21cffff748daaaa8, 0x5a9ad1866c9bbe46, 0x4870a2210221d251, 0x4a0db369c0a32af1, 0x02b1ccc429ff56af}, fe{0xe205aaaaaaac8e37, 0xfcdc000768795556, 0x0c96011a8a1537dd, 0x1c06a963f163406e, 0x010df44c82a881e6, 0x174f45260f808feb}, }, - &fe2{ + { fe{0xa470bda12f67f35c, 0xc0fe38e23327b425, 0xc9d3d0f2c6f0678d, 0x1c55c9935b5a982e, 0x27f6c0e2f0746764, 0x117c5e6e28aa9054}, fe{0, 0, 0, 0, 0, 0}, }, }, - [4]*fe2{ - &fe2{ + { + { fe{0x0162fffffa765adf, 0x8f7bea480083fb75, 0x561b3c2259e93611, 0x11e19fc1a9c875d5, 0xca713efc00367660, 0x03c6a03d41da1151}, fe{0x0162fffffa765adf, 0x8f7bea480083fb75, 0x561b3c2259e93611, 0x11e19fc1a9c875d5, 0xca713efc00367660, 0x03c6a03d41da1151}, }, - &fe2{ + { fe{0, 0, 0, 0, 0, 0}, fe{0x5db0fffffd3b02c5, 0xd713f52358ebfdba, 0x5ea60761a84d161a, 0xbb2c75a34ea6c44a, 0x0ac6735921c1119b, 0x0ee3d913bdacfbf6}, }, - &fe2{ + { fe{0x66b10000003affc5, 0xcb1400e764ec0030, 0xa73e5eb56fa5d106, 0x8984c913a0fe09a9, 0x11e10afb78ad7f13, 0x05429d0e3e918f52}, fe{0x534dffffffc4aae6, 0x5397ff174c67ffcf, 0xbff273eb870b251d, 0xdaf2827152870915, 0x393a9cbaca9e2dc3, 0x14be74dbfaee5748}, }, - &fe2{ + { fe{0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba, 0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493}, fe{0, 0, 0, 0, 0, 0}, }, diff --git a/crypto/bn256/bn256_fast.go b/crypto/bn256/bn256_fast.go index 9e4935d370f..6d27fffd8d3 100644 --- a/crypto/bn256/bn256_fast.go +++ b/crypto/bn256/bn256_fast.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -// +build amd64 arm64 +//go:build amd64 || arm64 // Package bn256 implements the Optimal Ate pairing over a 256-bit Barreto-Naehrig curve. package bn256 diff --git a/crypto/bn256/bn256_slow.go b/crypto/bn256/bn256_slow.go index 32f4fca9282..e8ed4971aff 100644 --- a/crypto/bn256/bn256_slow.go +++ b/crypto/bn256/bn256_slow.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file. -// +build !amd64,!arm64 +//go:build !amd64 && !arm64 // Package bn256 implements the Optimal Ate pairing over a 256-bit Barreto-Naehrig curve. package bn256 diff --git a/crypto/bn256/cloudflare/gfp_decl.go b/crypto/bn256/cloudflare/gfp_decl.go index be1b8090632..072e32b0888 100644 --- a/crypto/bn256/cloudflare/gfp_decl.go +++ b/crypto/bn256/cloudflare/gfp_decl.go @@ -1,4 +1,4 @@ -// +build amd64,!generic arm64,!generic +//go:build (amd64 && !generic) || (arm64 && !generic) package bn256 diff --git a/crypto/bn256/cloudflare/gfp_generic.go b/crypto/bn256/cloudflare/gfp_generic.go index 8e6be959619..944208c67ba 100644 --- a/crypto/bn256/cloudflare/gfp_generic.go +++ b/crypto/bn256/cloudflare/gfp_generic.go @@ -1,4 +1,4 @@ -// +build !amd64,!arm64 generic +//go:build (!amd64 && !arm64) || generic package bn256 diff --git a/crypto/crypto.go b/crypto/crypto.go index 559d2a0c30b..59adaa2370d 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -26,7 +26,6 @@ import ( "fmt" "hash" "io" - "io/ioutil" "math/big" "os" @@ -173,8 +172,10 @@ func FromECDSA(priv *ecdsa.PrivateKey) []byte { return math.PaddedBigBytes(priv.D, priv.Params().BitSize/8) } -// UnmarshalPubkey converts bytes to a secp256k1 public key. -func UnmarshalPubkey(pub []byte) (*ecdsa.PublicKey, error) { +// UnmarshalPubkeyStd parses a public key from the given bytes in the standard "uncompressed" format. +// The input slice must be 65 bytes long and have this format: [4, X..., Y...] +// See MarshalPubkeyStd. +func UnmarshalPubkeyStd(pub []byte) (*ecdsa.PublicKey, error) { x, y := elliptic.Unmarshal(S256(), pub) if x == nil { return nil, errInvalidPubkey @@ -182,13 +183,39 @@ func UnmarshalPubkey(pub []byte) (*ecdsa.PublicKey, error) { return &ecdsa.PublicKey{Curve: S256(), X: x, Y: y}, nil } -func FromECDSAPub(pub *ecdsa.PublicKey) []byte { +// MarshalPubkeyStd converts a public key into the standard "uncompressed" format. +// It returns a 65 bytes long slice that contains: [4, X..., Y...] +// Returns nil if the given public key is not initialized. +// See UnmarshalPubkeyStd. +func MarshalPubkeyStd(pub *ecdsa.PublicKey) []byte { if pub == nil || pub.X == nil || pub.Y == nil { return nil } return elliptic.Marshal(S256(), pub.X, pub.Y) } +// UnmarshalPubkey parses a public key from the given bytes in the 64 bytes "uncompressed" format. +// The input slice must be 64 bytes long and have this format: [X..., Y...] +// See MarshalPubkey. +func UnmarshalPubkey(keyBytes []byte) (*ecdsa.PublicKey, error) { + keyBytes = append([]byte{0x4}, keyBytes...) + return UnmarshalPubkeyStd(keyBytes) +} + +// MarshalPubkey converts a public key into a 64 bytes "uncompressed" format. +// It returns a 64 bytes long slice that contains: [X..., Y...] +// In the standard 65 bytes format the first byte is always constant (equal to 4), +// so it can be cut off and trivially recovered later. +// Returns nil if the given public key is not initialized. +// See UnmarshalPubkey. +func MarshalPubkey(pubkey *ecdsa.PublicKey) []byte { + keyBytes := MarshalPubkeyStd(pubkey) + if keyBytes == nil { + return nil + } + return keyBytes[1:] +} + // HexToECDSA parses a secp256k1 private key. func HexToECDSA(hexkey string) (*ecdsa.PrivateKey, error) { b, err := hex.DecodeString(hexkey) @@ -229,7 +256,7 @@ func readASCII(buf []byte, r *bufio.Reader) (n int, err error) { for ; n < len(buf); n++ { buf[n], err = r.ReadByte() switch { - case err == io.EOF || buf[n] < '!': + case errors.Is(err, io.EOF) || buf[n] < '!': return n, nil case err != nil: return n, err @@ -243,7 +270,7 @@ func checkKeyFileEnd(r *bufio.Reader) error { for i := 0; ; i++ { b, err := r.ReadByte() switch { - case err == io.EOF: + case errors.Is(err, io.EOF): return nil case err != nil: return err @@ -259,7 +286,7 @@ func checkKeyFileEnd(r *bufio.Reader) error { // restrictive permissions. The key data is saved hex-encoded. func SaveECDSA(file string, key *ecdsa.PrivateKey) error { k := hex.EncodeToString(FromECDSA(key)) - return ioutil.WriteFile(file, []byte(k), 0600) + return os.WriteFile(file, []byte(k), 0600) } // GenerateKey generates a new private key. @@ -284,8 +311,8 @@ func ValidateSignatureValues(v byte, r, s *uint256.Int, homestead bool) bool { // DESCRIBED: docs/programmers_guide/guide.md#address---identifier-of-an-account func PubkeyToAddress(p ecdsa.PublicKey) common.Address { - pubBytes := FromECDSAPub(&p) - return common.BytesToAddress(Keccak256(pubBytes[1:])[12:]) + pubBytes := MarshalPubkey(&p) + return common.BytesToAddress(Keccak256(pubBytes)[12:]) } func zeroBytes(bytes []byte) { diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go index 6d48b661903..9ef1d3cc041 100644 --- a/crypto/crypto_test.go +++ b/crypto/crypto_test.go @@ -20,7 +20,6 @@ import ( "bytes" "crypto/ecdsa" "encoding/hex" - "io/ioutil" "os" "reflect" "testing" @@ -78,7 +77,7 @@ func TestUnmarshalPubkey(t *testing.T) { } var ( - enc, _ = hex.DecodeString("04760c4460e5336ac9bbd87952a3c7ec4363fc0a97bd31c86430806e287b437fd1b01abc6e1db640cf3106b520344af1d58b00b57823db3e1407cbc433e1b6d04d") + enc, _ = hex.DecodeString("760c4460e5336ac9bbd87952a3c7ec4363fc0a97bd31c86430806e287b437fd1b01abc6e1db640cf3106b520344af1d58b00b57823db3e1407cbc433e1b6d04d") dec = &ecdsa.PublicKey{ Curve: S256(), X: hexutil.MustDecodeBig("0x760c4460e5336ac9bbd87952a3c7ec4363fc0a97bd31c86430806e287b437fd1"), @@ -107,7 +106,7 @@ func TestSign(t *testing.T) { if err != nil { t.Errorf("ECRecover error: %s", err) } - pubKey, _ := UnmarshalPubkey(recoveredPub) + pubKey, _ := UnmarshalPubkeyStd(recoveredPub) recoveredAddr := PubkeyToAddress(*pubKey) if addr != recoveredAddr { t.Errorf("Address mismatch: want: %x have: %x", addr, recoveredAddr) @@ -184,7 +183,7 @@ func TestLoadECDSA(t *testing.T) { } for _, test := range tests { - f, err := ioutil.TempFile("", "loadecdsa_test.*.txt") + f, err := os.CreateTemp("", "loadecdsa_test.*.txt") if err != nil { t.Fatal(err) } @@ -205,7 +204,7 @@ func TestLoadECDSA(t *testing.T) { } func TestSaveECDSA(t *testing.T) { - f, err := ioutil.TempFile("", "saveecdsa_test.*.txt") + f, err := os.CreateTemp("", "saveecdsa_test.*.txt") if err != nil { t.Fatal(err) } diff --git a/crypto/signature_cgo.go b/crypto/signature_cgo.go index d7d895e4983..0ea11872ad2 100644 --- a/crypto/signature_cgo.go +++ b/crypto/signature_cgo.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build !nacl,!js,cgo,!gofuzz +//go:build !nacl && !js && cgo && !gofuzz package crypto diff --git a/crypto/signature_nocgo.go b/crypto/signature_nocgo.go index 8d38fd8d5d0..338ee4b2482 100644 --- a/crypto/signature_nocgo.go +++ b/crypto/signature_nocgo.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build nacl js !cgo gofuzz +//go:build nacl || js || !cgo || gofuzz package crypto diff --git a/crypto/signature_test.go b/crypto/signature_test.go index 31be947a2b3..2aef1113c14 100644 --- a/crypto/signature_test.go +++ b/crypto/signature_test.go @@ -90,7 +90,7 @@ func TestDecompressPubkey(t *testing.T) { if err != nil { t.Fatal(err) } - if uncompressed := FromECDSAPub(key); !bytes.Equal(uncompressed, testpubkey) { + if uncompressed := MarshalPubkeyStd(key); !bytes.Equal(uncompressed, testpubkey) { t.Errorf("wrong public key result: got %x, want %x", uncompressed, testpubkey) } if _, err := DecompressPubkey(nil); err == nil { diff --git a/docker-compose.yml b/docker-compose.yml index 57643d1ca58..47cd6884f74 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,50 +1,80 @@ +# Erigon by default is "all in one binary" solution, but it's possible start TxPool as separated processes. +# Same true about: JSON RPC layer (RPCDaemon), p2p layer (Sentry), history download layer (Downloader), consensus. +# Don't start services as separated processes unless you have clear reason for it: resource limiting, scale, replace by your own implementation, security. +# This file is an example: how to start Erigon's services as separated processes. + +# Default: --datadir=/home/erigon/.local/share/erigon +# Ports: `9090` execution engine (private api), `9091` sentry, `9092` consensus engine, `9093` snapshot downloader, `9094` TxPool +# Ports: `8545` json rpc, `8551` consensus json rpc, `30303` eth p2p protocol, `42069` bittorrent protocol, + +# Connections: erigon -> (sentries, downloader), rpcdaemon -> (erigon, txpool), txpool -> erigon + version: '2.2' -services: +# Basic erigon's service +x-erigon-service: &default-erigon-servie + image: thorax/erigon:${TAG:-latest} + pid: service:erigon # Use erigon's PID namespace. It's required to open Erigon's DB from another process (RPCDaemon local-mode) + volumes_from: [ erigon ] + restart: unless-stopped + mem_swappiness: 0 +services: erigon: - image: thorax/erigon:latest + image: thorax/erigon:${TAG:-latest} build: . - command: erigon --metrics --metrics.addr=0.0.0.0 --metrics.port=6060 --private.api.addr=0.0.0.0:9090 --pprof --pprof.addr=0.0.0.0 --pprof.port=6061 + command: | + erigon ${ERIGON_FLAGS-} --private.api.addr=0.0.0.0:9090 + --sentry.api.addr=sentry:9091 --downloader.api.addr=downloader:9093 --txpool.disable + --metrics --metrics.addr=0.0.0.0 --metrics.port=6060 --pprof --pprof.addr=0.0.0.0 --pprof.port=6061 volumes: + # It's ok to mount sub-dirs of "datadir" to different drives - ${XDG_DATA_HOME:-~/.local/share}/erigon:/home/erigon/.local/share/erigon - ports: - - "30303:30303/tcp" - - "30303:30303/udp" - - "30304:30304/tcp" - - "30304:30304/udp" restart: unless-stopped + mem_swappiness: 0 + + sentry: + <<: *default-erigon-servie + command: sentry ${SENTRY_FLAGS-} --sentry.api.addr=0.0.0.0:9091 + ports: [ "30303:30303/tcp", "30303:30303/udp" ] + + downloader: + <<: *default-erigon-servie + command: downloader ${DOWNLOADER_FLAGS-} --downloader.api.addr=0.0.0.0:9093 + ports: [ "42069:42069/tcp", "42069:42069/udp" ] + + txpool: + <<: *default-erigon-servie + command: txpool ${TXPOOL_FLAGS-} --private.api.addr=erigon:9090 --txpool.api.addr=0.0.0.0:9094 + + rpcdaemon: + <<: *default-erigon-servie + command: | + rpcdaemon ${RPCDAEMON_FLAGS-} --http.addr=0.0.0.0 --http.vhosts=* --http.corsdomain=* --ws + --private.api.addr=erigon:9090 --txpool.api.addr=txpool:9094 + --authrpc.jwtsecret=/home/erigon/.local/share/erigon/jwt.hex + ports: [ "8545:8545" ] # "8551:8551" + + + prometheus: - image: prom/prometheus:v2.28.1 + image: prom/prometheus:v2.36.0 user: 1000:1000 # Uses erigon user from Dockerfile - command: --log.level=warn --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prometheus/consoles - ports: - - "9090:9090" + command: --log.level=warn --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --storage.tsdb.retention.time=150d --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prometheus/consoles + ports: [ "9090:9090" ] volumes: - ${ERIGON_PROMETHEUS_CONFIG:-./cmd/prometheus/prometheus.yml}:/etc/prometheus/prometheus.yml - ${XDG_DATA_HOME:-~/.local/share}/erigon-prometheus:/prometheus restart: unless-stopped grafana: - image: grafana/grafana:8.0.6 + image: grafana/grafana:8.5.4 user: 1000:1000 # Uses erigon user from Dockerfile - ports: - - "3000:3000" + ports: [ "3000:3000" ] volumes: - ${ERIGON_GRAFANA_CONFIG:-./cmd/prometheus/grafana.ini}:/etc/grafana/grafana.ini - ./cmd/prometheus/datasources:/etc/grafana/provisioning/datasources - ./cmd/prometheus/dashboards:/etc/grafana/provisioning/dashboards - ${XDG_DATA_HOME:-~/.local/share}/erigon-grafana:/var/lib/grafana restart: unless-stopped - - rpcdaemon: - image: thorax/erigon:latest - command: rpcdaemon --datadir=/home/erigon/.local/share/erigon --private.api.addr=erigon:9090 --http.addr=0.0.0.0 --http.vhosts=* --http.corsdomain=* --http.api=eth,debug,net - pid: service:erigon # Use erigon's PID namespace. It's required to open Erigon's DB from another process (RPCDaemon local-mode) - volumes: - - ${XDG_DATA_HOME:-~/.local/share}/erigon:/home/erigon/.local/share/erigon - ports: - - "8545:8545" - restart: unless-stopped - diff --git a/docs/Coherence.png b/docs/Coherence.png new file mode 100644 index 00000000000..791f7229cd6 Binary files /dev/null and b/docs/Coherence.png differ diff --git a/docs/erigon2_profile.png b/docs/erigon2_profile.png new file mode 100644 index 00000000000..a69d9454934 Binary files /dev/null and b/docs/erigon2_profile.png differ diff --git a/docs/evm_semantics.md b/docs/evm_semantics.md index 223d152686a..0556bf22274 100644 --- a/docs/evm_semantics.md +++ b/docs/evm_semantics.md @@ -111,9 +111,8 @@ WHERE prevaccount = select(state, tx.sender) WHEN prevaccount.nonce = tx.nonce AND prevbalance >= cost ``` -We have introduced `WHERE` section to define some variable for convinience, and placed the guard into the `WHEN` section. -Pattern and substitution are on the first line, separated by the arrow `==>`. One needs to notice that the substution +We have introduced `WHERE` section to define some variable for convenience, and placed the guard into the `WHEN` section. +Pattern and substitution are on the first line, separated by the arrow `==>`. One needs to notice that the substitution contains three-element sequence whereas the pattern contains only two elements. If the gas purchase is successful, the "gas" object gets introduced. It will be useful for the subsequent rules, because now we can make all of them simply require the presence of that "gas" object, instead of repeating the guards of the gas purchasing rule. - diff --git a/docs/merry-go-round-sync.md b/docs/merry-go-round-sync.md index 090582b7f99..c4b4cb8ee1a 100644 --- a/docs/merry-go-round-sync.md +++ b/docs/merry-go-round-sync.md @@ -13,7 +13,7 @@ node might like to do in the beginning). The process of syncing happens in cycles. During each cycle, all participants attempt to distribute the entire content of the Ethereum state to each other. Therefore the duration of one cycle for the Ethereum mainnet is likely to be some hours. -Cycle is divided into ticks. For convinience, we can say that each ticks starts after the mining of certain block, and lasts +Cycle is divided into ticks. For convenience, we can say that each ticks starts after the mining of certain block, and lasts for some predetermined amount of time, let's say, 30 seconds. This definition means that the ticks will often overlap, but not always, as shown on the picture below. diff --git a/docs/minimal-perfect.png b/docs/minimal-perfect.png new file mode 100644 index 00000000000..c82dec4b49d Binary files /dev/null and b/docs/minimal-perfect.png differ diff --git a/docs/mining.md b/docs/mining.md index c3252b25740..c85333f857a 100644 --- a/docs/mining.md +++ b/docs/mining.md @@ -2,7 +2,7 @@ Support only remote-miners. -* To enable, add `--mine --miner.etherbase=...` or `--mine --miner.miner.sigkey=...` flags. +* To enable, add `--mine --miner.etherbase=...` or `--mine --miner.sigfile=...` flags. * Other supported options: `--miner.extradata`, `--miner.notify`, `--miner.gaslimit`, `--miner.gasprice` , `--miner.gastarget` * RPCDaemon supports methods: eth_coinbase , eth_hashrate, eth_mining, eth_getWork, eth_submitWork, eth_submitHashrate diff --git a/docs/perfect-hash.png b/docs/perfect-hash.png new file mode 100644 index 00000000000..dd808b38185 Binary files /dev/null and b/docs/perfect-hash.png differ diff --git a/docs/pos_downloader.drawio b/docs/pos_downloader.drawio new file mode 100644 index 00000000000..ffb00578e95 --- /dev/null +++ b/docs/pos_downloader.drawio @@ -0,0 +1 @@ +7V3bdpu6Fv2aPMYDSSDgsYm7m+6T3ZN9kn3pIzGKzYiDHMC1068/EiAbJBljyi0e6UNrxH3NqaW51pLoBbp+2X6JvNXiD+qT5QU0/O0Fml5AaDuY/c0b3rIG4Nowa5lHgZ+37Rvug58kbzTy1nXgk7h0YELpMglW5cYZDUMyS0ptXhTRTfmwJ7os33XlzYnScD/zlmrrP4GfLPJWbJn7HTckmC/ErQF2sz0vnjg6f5V44fl0U2hCny/QdURpkv162V6TJbeeMEx23m8H9u6eLCJhUueEN/i6AtNvP/96umXPgaLkBi4unewqP7zlOn/j/GGTN2GCeBO8LL2QbV3FiRclOUgG21YfIX+qHyRKyLbQlD/SF0JfSBK9sUPEXsPK7ZNTxLTz7U3B3mbetiiYWhzn5RDPd9feG4H9yO1wgk1cxSb3JPRJFLPG+4QTRjYRe1f2UFeL5IXdaArYT28ZzEP2e8YsQyLWwC0SMF59yne8BL7PT7+KSBz89B6XwqYrGoRJ+krW1YU15ddaJzTOjA5SECL6TK7pkrLrTkOaIvMULJdSkwpOJQNqIwbLeEFLhcvQwAW7gku4ihFxeOe+BuMwAIpRrpZ09syabrx4cZZM3hGhPnDWUSqDXqkMh6ayjctMBmhwJiPFJjfEO1t3vKPA+/XH5tAkVvwxMgdnsaX6Y+oH5ExJbJ4KGTzqid1eOYxHx2FsDM5hWzHK5y2ZrZOAhhcQey8r9urhY8z/OUNO41MhHJ1jHjzYc/DoOK0Ge1wfEz/zywk5T/98ctAHjnMZ9sllceHhuGyOjstQjfmuvfS0h8ibcSZ/DX32cufI6B0fjuNXQWEdXN1RePBgD4+Pwmqw9xAF5+mEd/jXxgsdFcl2rwQePNCTffDwuWOoxnk3QZzQ9KnP2P2eHPCNTlAMHvHJZEbIHZrMasB3S+fnTeRfjvI0oPUa5SFVBQ5MZGgMTWSkSq0Hzt9bSp/Xq7MkMjo94zSyYgiqIS8K0OzK69zafhbDZxv1QWPXWPErv2znfDrDJJtBACePJPQ/8d/80tw+Lv/B7caMhq5CmswW4mb8MF6gYNsW5ESga+Yt/fwp/SAiszRhhqYxXXPLlkC+gOjp6QnOZgoj2B4fP2ILt9NJXaPcSYGlSieo66S4M7xV6TQU3l4Ra2OCzR3czgEMixQYBE9guJLXdVRArV7xrKGoPvCsjaepmVPQL56qGvzA8xQ8y+OrpalJ9otnjXLAMHhaAk6YwrUMVjf5Q4wARmncxEDVSToYzc5gVCsYHzAeLUTVQBH3iaK48AeKp+SvR4dijdh7oCFyh6IljZAhjcYxQlrGyAZIU80afKBZH82RyVdTLS19oNkUTWirKb1+0RxxcggUB82q/JDpKvmhYdCVcthA43n1uSC3K3h1uSC85NnYJ8res4gzfl1TseMyS6h+YgdAuNrud7Jfc/5vnujlmd+VuCJ7wuyi2SEKj9Q0cN1cbX1ybRZBQu5XfJoGmm4Yv0rM6GhyN9L0YqAVTKArnNWcwgryhHxIkg2NngVEj5FA50fgsd33zAj57YtIsTsGq7jYWWdLuvYP2LcAKMc/L4IA2I2xLxFGqrV1NU6nK6dp1RA03ZaGLGlS6yV0NEbptTZkqbogXSmzW2Rw1Bu8n6LQjgDvdV62NfiUE9cZH4PVwfIb2eTLvc6JvSdPMhnZhClrPBURRbTae80KnEmlakWqapWGT22Vs5A5klSu7xHnSaty8cwhj08tjT2uPCAjTc/VEcLqjBDjKakohHAm9j6KwVV8gCld6jOCeHGSE+LvIQkhpw8vIdAQQjd5pzuFNp6aTI+EKLqIQRlhK4zQDe5IwwjQWU7ZqlHf2UPFAh4vjoNZeYwvR5IyFGQbJP/yfRnAfPN7fiL/Pd3m56Ubb2KDB2DZWWmOI93+Xty5Py/dEicehImxIJqRKkvkL85E3ZyIT148mf/Yl68xNRN7+2fy5WX2/WY3b5H4pY97qLAfyV6JtogsvST4QUqPqwM6v8MdF0Z7VjmmlF4RC+nEJbI3z8/a00W5kO3CiWEbmF3QNbEtonJBVuaqJq6LMHYt7CALGrh8m8xuym1SVu6M0pyoIt4do+8qqBuIqtVNQ9c1hLtynLK+1SsaMe+gF0WDx1MBqxzAEKrigHHiALYhmaIZggSuPToVg2vkmYYjQSE336YnELWaYTwBapqVaEW4LFbL3/81/vz69/Mdpsnme/R7eHdZwxMUdEueCtjBD8oKhrffeQljQZi2QAPtbCo+zFWebSsUS1Gj5MqmsHlA3LCNOxIFzBCcdrmK8X8LuAXSrTSzpGqutDk/DJRUUkkiTcwjIindkp+guXISafb3ppxcINNaZmtt6SR7STkbd0AcMYi9t8Jhec7r4BPbcoIb5V720IPJldXTTxBF1ton2KXj2Y/sJZuKQW3nV0eALyQ5Ma/+TqtsluyLge5rYAaXpEq/MaXIoDVnfKDIwZquKBsXlTLb5+1s4YWaNTH7Elv/JTUA5N6lNW1XNTWtYWssWuj4QzFg0IqE1ihqnjtlm/ji0dGeP8qaRCX89UsSR9e9Ohqk2ihJaJ9/xAnoM43ZbTlm10wLQLqYvTMXViPnfFqCcS+7G+QTd7K5qNR/NZ9YNSYWRXHl18xGIoqBIRXlgewd6opiJkLKV+pIFAN5tT/K6xydStA634XV8rqbGBRcFANQ+0gAus+uYym9PoFNYsdSvJoPccVgtRzhgl+KNkV/OdqxzHFFmwDKC9ebRptyxv+ys56FpDshF1V3efmE3aPVPwO51Wc4siCVTuiou6v5JhFy1tad7zTiBLKqRCZWNEXfEWedbxl/VALalJYM4TqlAN2Evc60ZZ2PATcVl02q1WV12Zm0tNQRsEqCjmQAlIethmVqR55oJZbetF+I1iaxGxUeDs+WKHdlYgHTMHRd+QoaRmGPUISoikgjAd5V8moiAD05pFBSdNC1e0W/xjKvD/TL6It67R4y1Bb6wHV7RV9Nx17TMCZhvI7VJPet90Yitfkb9dW8t9AWq4jOSBwfz38/erPneUqm/66TZRCKBGQLAz0SXUqslFUHeV0OvI3FeFqjq+nez+GcvzE0Pt19VQ38P/K65joJGrdBnKjdc8ASAzbsesZsQzFpjTmejOyhZaqmcVG5JNW3iOObOifpwEeE+XXYjVhIFiaFfa7tG7bdDooWKHcQTZVIp4LbmBWlVySnSZITVHAxq1R3wmbrErjKKRzPrsJRDYZA/qDjZePsKpQK7wjvIvDGaaDWtfJ43M36YR2F5YXUQA7HzbwmxNCbQnsC5c895eF3RBMvb9GJOMA8lK3zTy62kdfWJ2Zcd+JAd/9HEkaab21jYyImcJbKtBJpWnNLmq9t/6JbOjy1vDwBq27yu5z7Bm04q0on9N4mSGEsVROBYzbzVrbDnJONLBcBnsC1Ufm6JpjYwLJ5+RJayJEetGNRX+dD4+3wFDQg6XAMfQ8pJemjPsp00/prHyr5icr8NFynX4bWGEb7/Y/7tANMZ7OA9EZRJxbc0Xs1HJzSTbikfFagYrN3MjWomhON5wapAOrmBqHO8FNXnmWTNzXTBR9u2YHMTksmxaiK45AhvQOHDunrfJJ92CV87a/gq+wSx2WWe56jmHwhJbjsOjkO+2NiIyLafTHRVZn4HtITjvSVfiDnrGozEciRQ2dMnL661P7rP7PXT/AR/LRw/BltTizSNSFio5Lvjr61yaulR8fuEQ9JQVua3tOYgZ35QrYZUf7Zt/3hPNP0B/UJP+L/ \ No newline at end of file diff --git a/docs/pos_downloader.png b/docs/pos_downloader.png new file mode 100644 index 00000000000..63871821a7f Binary files /dev/null and b/docs/pos_downloader.png differ diff --git a/docs/programmers_guide/db_faq.md b/docs/programmers_guide/db_faq.md index 81ac71f57f8..8a9d79fce4e 100644 --- a/docs/programmers_guide/db_faq.md +++ b/docs/programmers_guide/db_faq.md @@ -27,8 +27,8 @@ We have Go, Rust and C++ implementations of `RoKV` interface. Rationale and Architecture of DB interface: [./../../ethdb/Readme.md](../../ethdb/Readme.md) -MDBX docs: [erthink.github.io/libmdbx/](https://erthink.github.io/libmdbx/) -and [https://github.com/erthink/libmdbx/blob/master/mdbx.h](https://github.com/erthink/libmdbx/blob/master/mdbx.h) +MDBX: [docs](https://libmdbx.website.yandexcloud.net) +and [mdbx.h](https://github.com/torquem-ch/libmdbx/blob/master/mdbx.h) ### How RAM used diff --git a/docs/programmers_guide/db_walkthrough.MD b/docs/programmers_guide/db_walkthrough.MD index d26df39c35b..13d3b99ac2d 100644 --- a/docs/programmers_guide/db_walkthrough.MD +++ b/docs/programmers_guide/db_walkthrough.MD @@ -130,7 +130,7 @@ Table "PlainState" Store together Accounts and Storage. Accounts: key="account address", value="current state of each account". -Storage: key="account address+incarnation+sorage hash", value="current value of storage". +Storage: key="account address+incarnation+storage hash", value="current value of storage". The accounts encoded by function `account.go:EncodeForStorage()` so that the first byte of a field is its length and bytes afterward the field itself. diff --git a/docs/programmers_guide/dupsort.md b/docs/programmers_guide/dupsort.md index 10017ee5aa6..cdab314cfed 100644 --- a/docs/programmers_guide/dupsort.md +++ b/docs/programmers_guide/dupsort.md @@ -145,7 +145,7 @@ feature DupFixed (can add this flag to table configuration). It means in 1 db call you can Get/Put up to 4Kb of sub-table keys. -[mdbx docs](https://github.com/erthink/libmdbx/blob/master/mdbx.h) +[see mdbx.h](https://github.com/torquem-ch/libmdbx/blob/master/mdbx.h) Erigon --------- diff --git a/docs/programmers_guide/guide.md b/docs/programmers_guide/guide.md index 6348f57d72d..43ddef2e6b4 100644 --- a/docs/programmers_guide/guide.md +++ b/docs/programmers_guide/guide.md @@ -7,8 +7,9 @@ On a high level, Ethereum state is a collection of accounts. An account can be e (also known as "Externally Owned Account", or EOA), or a smart contract. ### Content of an account -Type `Account` [core/types/accounts/account.go](../../core/types/accounts/account.go) lists the main components -of an account's content (not identifier): + +Type `Account` [core/types/accounts/account.go](../../core/types/accounts/account.go) lists the main components of an +account's content (not identifier): 1. Nonce 2. Balance @@ -16,81 +17,96 @@ of an account's content (not identifier): 4. Code hash #### Nonce + Number of the type `uint64`. For non-contract accounts, nonce is important in two contexts. Firstly, all transactions signed by an account, have to -appear in the ledger in the order of strictly increasing nonces (without gaps). This check is performed by member function `preCheck` of -type `StateTransition` [core/state_transition.go](../../core/state_transition.go) -Secondly, if a transaction signed by an account is sent to no -particular address (with intention of creating a contract), and it ends up creating a new smart contract account, the address of such newly -created smart contract account is calculated based on the current nonce of the "creator" account. -For smart contract accounts, nonce is important when `CREATE` opcode is executed on behalf of such account. This computation is -performed in the member function `Create` of the type `EVM` [core/vm/evm.go](../../core/vm/evm.go). Note the difference between the -member function `Create2`, where the address of the newly created contract is independent of the nonce. For contract accounts, +appear in the ledger in the order of strictly increasing nonces (without gaps). This check is performed by member +function `preCheck` of type `StateTransition` [core/state_transition.go](../../core/state_transition.go) +Secondly, if a transaction signed by an account is sent to no particular address (with intention of creating a contract) +, and it ends up creating a new smart contract account, the address of such newly created smart contract account is +calculated based on the current nonce of the "creator" account. For smart contract accounts, nonce is important +when `CREATE` opcode is executed on behalf of such account. This computation is performed in the member +function `Create` of the type `EVM` [core/vm/evm.go](../../core/vm/evm.go). Note the difference between the member +function `Create2`, where the address of the newly created contract is independent of the nonce. For contract accounts, the nonce is important in the context of creating new contracts via `CREATE` opcode. #### Balance -Number of the type `*big.Int`. Since balance is denominated in wei, and there 10^18 wei in each Ether, the maximum balance that needs to be -representable is 110'000'000 (roughly amount of mainnet Ether in existence, but can be more for testnets and private networks), -multiplied by 10^18, which exceeds the capacity of `uint64`. + +Number of the type `*big.Int`. Since balance is denominated in wei, and there 10^18 wei in each Ether, the maximum +balance that needs to be representable is 110'000'000 (roughly amount of mainnet Ether in existence, but can be more for +testnets and private networks), multiplied by 10^18, which exceeds the capacity of `uint64`. #### Root + Binary 32-byte (256-bit) string. -By root here one means the Merkle root of the smart contract storage, organised into a tree. Non-contract accounts cannot have storage, -therefore root makes sense only for smart contract accounts. For non-contract accounts, the root field is assumed to be equal to the -Merkle root of an empty tree, which is hard-coded in the variable `EmptyRoot` in -[turbo/trie/trie.go](../../turbo/trie/trie.go). For contract accounts, the root is computed using member function `Hash` of -type `Trie` [turbo/trie/trie.go](../../turbo/trie/trie.go), once the storage of the contract has been organised into the tree by calling member functions +By root here one means the Merkle root of the smart contract storage, organised into a tree. Non-contract accounts +cannot have storage, therefore root makes sense only for smart contract accounts. For non-contract accounts, the root +field is assumed to be equal to the Merkle root of an empty tree, which is hard-coded in the variable `EmptyRoot` in +[turbo/trie/trie.go](../../turbo/trie/trie.go). For contract accounts, the root is computed using member function `Hash` +of type `Trie` [turbo/trie/trie.go](../../turbo/trie/trie.go), once the storage of the contract has been organised into +the tree by calling member functions `Update` and `Delete` on the same type. #### Code hash + Binary 32-byte (256-bit) string. -Hash of the bytecode (deployed code) of a smart contract. The computation of the code hash is performed in the `SetCode` member function -of the type `IntraBlockState` [code/state/intra_block_state.go](../../core/state/intra_block_state.go). Since a non-contract account has no bytecode, code hash only -makes sense for smart contract accounts. For non-contract accounts, the code hash is assumed to be equal to the hash of `nil`, which is -hard-coded in the variable `emptyCode` in [code/state/intra_block_state.go](../../core/state/intra_block_state.go) +Hash of the bytecode (deployed code) of a smart contract. The computation of the code hash is performed in the `SetCode` +member function of the type `IntraBlockState` [code/state/intra_block_state.go](../../core/state/intra_block_state.go). +Since a non-contract account has no bytecode, code hash only makes sense for smart contract accounts. For non-contract +accounts, the code hash is assumed to be equal to the hash of `nil`, which is hard-coded in the variable `emptyCode` +in [code/state/intra_block_state.go](../../core/state/intra_block_state.go) ### Address - identifier of an account -Accounts are identified by their addresses. Address is a 20-byte binary string, which is derived differently for smart contract and -non-contract accounts. -For non-contract accounts, the address is derived from the public key, by hashing it and taking lowest 20 bytes of the 32-byte hash value, -as shown in the function `PubkeyToAddress` in the file [crypto/crypto.go](../../crypto/crypto.go) +Accounts are identified by their addresses. Address is a 20-byte binary string, which is derived differently for smart +contract and non-contract accounts. -For smart contract accounts created by a transaction without destination, or by `CREATE` opcode, the address is derived from the -address and the nonce of the creator, as shown in the function `CreateAddress` in the file [crypto/crypto.go](../../crypto/crypto.go) +For non-contract accounts, the address is derived from the public key, by hashing it and taking lowest 20 bytes of the +32-byte hash value, as shown in the function `PubkeyToAddress` in the file [crypto/crypto.go](../../crypto/crypto.go) -For smart contract accounts created by `CREATE2` opcode, the address is derived from the creator's address, salt (256-bit argument -supplied to the `CREATE2` invocation), and the code hash of the initialisation code (code that is executed to output the actual, -deployed code of the new contract), as shown in the function `CreateAddress2` in the file [crypto/crypto.go](../../crypto/crypto.go) +For smart contract accounts created by a transaction without destination, or by `CREATE` opcode, the address is derived +from the address and the nonce of the creator, as shown in the function `CreateAddress` in the +file [crypto/crypto.go](../../crypto/crypto.go) -In many places in the code, sets of accounts are represented by mappings from account addresses to the objects representing -the accounts themselves, for example, field `stateObjects` in the type `IntraBlockState` [core/state/intra_block_state.go](../../core/state/intra_block_state.go). -Member functions of the type `IntraBlockState` that are for querying and modifying one of the components of an accounts, are all accepting -address as their first argument, see functions `GetBalance`, `GetNonce`, `GetCode`, `GetCodeSize`, `GetCodeHash`, `GetState` (this -one queries an item in the contract storage), `GetCommittedState`, `AddBalance`, `SubBalance`, `SetBalance`, `SetNonce`, -`SetCode`, `SetState` (this one modifies an item in the contract storage) [core/state/intra_block_state.go](../../core/state/intra_block_state.go). +For smart contract accounts created by `CREATE2` opcode, the address is derived from the creator's address, salt ( +256-bit argument supplied to the `CREATE2` invocation), and the code hash of the initialisation code (code that is +executed to output the actual, deployed code of the new contract), as shown in the function `CreateAddress2` in the +file [crypto/crypto.go](../../crypto/crypto.go) + +In many places in the code, sets of accounts are represented by mappings from account addresses to the objects +representing the accounts themselves, for example, field `stateObjects` in the +type `IntraBlockState` [core/state/intra_block_state.go](../../core/state/intra_block_state.go). Member functions of the +type `IntraBlockState` that are for querying and modifying one of the components of an accounts, are all accepting +address as their first argument, see functions `GetBalance`, `GetNonce`, `GetCode`, `GetCodeSize`, `GetCodeHash` +, `GetState` (this one queries an item in the contract storage), `GetCommittedState`, `AddBalance`, `SubBalance` +, `SetBalance`, `SetNonce`, +`SetCode`, `SetState` (this one modifies an item in the contract +storage) [core/state/intra_block_state.go](../../core/state/intra_block_state.go). Organising Ethereum State into a Merkle Tree -------------------------------------------- -Ethereum network produces checkpoints of the Ethereum State after every block. These checkpoints come in a form of 32-byte binary -string, which is the root hash of the Merkle tree constructed out of the accounts in the state. This root hash is often -referred to as "State root". It is part of block header, and is contained in the field `Root` of the type +Ethereum network produces checkpoints of the Ethereum State after every block. These checkpoints come in a form of +32-byte binary string, which is the root hash of the Merkle tree constructed out of the accounts in the state. This root +hash is often referred to as "State root". It is part of block header, and is contained in the field `Root` of the type `Header` [core/types/block.go](../../core/types/block.go) -Prior to Byzantium release, the state root was also part of every transaction receipt, and was contained in the field `PostState` +Prior to Byzantium release, the state root was also part of every transaction receipt, and was contained in the +field `PostState` of the type `Receipt` [core/types/receipt.go](../../core/types/receipt.go). -To keep the Merkle Patricia trie of Ethereum state balanced, all the keys (either addresses of Ethereum accounts and contracts, -or storage positions within contract storage) are converted into their respective hashes using `Keccak256` hash function. -`PlainStateBucket` stores state with keys before hashing, `CurrentStateBucket` store same data but keys are hashed. +To keep the Merkle Patricia trie of Ethereum state balanced, all the keys (either addresses of Ethereum accounts and +contracts, or storage positions within contract storage) are converted into their respective hashes using `Keccak256` +hash function. +`PlainStateBucket` stores state with keys before hashing, `CurrentStateBucket` store same data but keys are hashed. ### Hexary radix "Patricia" tree + Ethereum uses hexary (radix == 16) radix tree to guide the algorithm of computing the state root. For the purposes of -illustrations, we will use trees with radix 4 (because radix 16 requires many more items for "interesting" features -to appear). We start from a set of randomly looking keys, 2 bytes (or 8 quaternary digits) each. +illustrations, we will use trees with radix 4 (because radix 16 requires many more items for "interesting" features to +appear). We start from a set of randomly looking keys, 2 bytes (or 8 quaternary digits) each. ![prefix_groups_1](prefix_groups_1.png) To regenerate this picture, run `go run cmd/pics/pics.go -pic prefix_groups_1` @@ -100,33 +116,35 @@ Next, we sort them in lexicographic order. ![prefix_groups_2](prefix_groups_2.png) To regenerate this picture, run `go run cmd/pics/pics.go -pic prefix_groups_2` -Next, we introduce the notion of a prefix group. Collection of adjacent keys form a prefix group if these keys share -the same prefix, and no other keys share this prefix. Here are the prefix groups for our example: +Next, we introduce the notion of a prefix group. Collection of adjacent keys form a prefix group if these keys share the +same prefix, and no other keys share this prefix. Here are the prefix groups for our example: ![prefix_groups_3](prefix_groups_3.png) To regenerate this picture, run `go run cmd/pics/pics.go -pic prefix_groups_3` The entire collection of keys form one implicit prefix group, with the empty prefix. -Merkle Patricia tree hashing rules first remove redundant parts of each key within groups, making key-value -pairs so-called "leaf nodes". To produce the hash of a leaf node, one applies the hash function to the two-piece RLP (Recursive Length Prefix). -The first piece is the representation of the non-redundant part of the key. And the second piece is the -representation of the leaf value corresponding to the key, as shown in the member function `hashChildren` of the -type `hasher` [turbo/trie/hasher.go](../../turbo/trie/hasher.go), under the `*shortNode` case. +Merkle Patricia tree hashing rules first remove redundant parts of each key within groups, making key-value pairs +so-called "leaf nodes". To produce the hash of a leaf node, one applies the hash function to the two-piece RLP ( +Recursive Length Prefix). The first piece is the representation of the non-redundant part of the key. And the second +piece is the representation of the leaf value corresponding to the key, as shown in the member function `hashChildren` +of the type `hasher` [turbo/trie/hasher.go](../../turbo/trie/hasher.go), under the `*shortNode` case. Hashes of the elements within a prefix group are combined into so-called "branch nodes". They correspond to the -types `duoNode` (for prefix groups with exactly two elements) and `fullNode` in the file [turbo/trie/node.go](../../turbo/trie/node.go). -To produce the hash of a branch node, one represents it as an array of 17 elements (17-th element is for the attached leaf, -if exists). -The positions in the array that do not have corresponding elements in the prefix group are filled with empty strings. This is -shown in the member function `hashChildren` of the type `hasher` [turbo/trie/hasher.go](../../turbo/trie/hasher.go), under the `*duoNode` and +types `duoNode` (for prefix groups with exactly two elements) and `fullNode` in the +file [turbo/trie/node.go](../../turbo/trie/node.go). To produce the hash of a branch node, one represents it as an array +of 17 elements (17-th element is for the attached leaf, if exists). The positions in the array that do not have +corresponding elements in the prefix group are filled with empty strings. This is shown in the member +function `hashChildren` of the type `hasher` [turbo/trie/hasher.go](../../turbo/trie/hasher.go), under the `*duoNode` +and `*fullNode` cases. -Sometimes, nested prefix groups have longer prefixes than 1-digit extension of their encompassing prefix group, as it is the case -in the group of items `12, 13` or in the group of items `29, 30, 31`. Such cases give rise to so-called "extension nodes". - However, the value in an extension node is always the representation of a prefix group, rather than a leaf. To produce the hash of an extension node, -one applies the hash function to the two-piece RLP. The first piece is the representation of the non-redundant part of the key. -The second part is the hash of the branch node representing the prefix group. This shown in the member function `hashChildren` of the +Sometimes, nested prefix groups have longer prefixes than 1-digit extension of their encompassing prefix group, as it is +the case in the group of items `12, 13` or in the group of items `29, 30, 31`. Such cases give rise to so-called " +extension nodes". However, the value in an extension node is always the representation of a prefix group, rather than a +leaf. To produce the hash of an extension node, one applies the hash function to the two-piece RLP. The first piece is +the representation of the non-redundant part of the key. The second part is the hash of the branch node representing the +prefix group. This shown in the member function `hashChildren` of the type `hasher` [turbo/trie/hasher.go](../../turbo/trie/hasher.go), under the `*shortNode` case. This is the illustration of resulting leaf nodes, branch nodes, and extension nodes for our example: @@ -137,17 +155,17 @@ To regenerate this picture, run `go run cmd/pics/pics.go -pic prefix_groups_4` ### Separation of keys and the structure Our goal here will be to construct an algorithm that can produce the hash of the Merkle Patricia Tree of a sorted -sequence of key-value pair, in one simple pass (i.e. without look-aheads and buffering, but with a stack). -Another goal (perhaps more important) +sequence of key-value pair, in one simple pass (i.e. without look-aheads and buffering, but with a stack). Another +goal (perhaps more important) is to be able to split the sequence of key-value pairs into arbitrary chunks of consecutive keys, and reconstruct the root hash from hashes of the individual chunks (note that a chunk might need to have more than one hash). -Let's say that we would like to split the ordered sequence of 32 key-value pairs into 4 chunks, 8 pairs in each. We would then -like to compute the hashes (there might be more than one hash per chunk) of each chunk separately. After that, we would like -to combine the hashes of the chunks into the root hash. +Let's say that we would like to split the ordered sequence of 32 key-value pairs into 4 chunks, 8 pairs in each. We +would then like to compute the hashes (there might be more than one hash per chunk) of each chunk separately. After +that, we would like to combine the hashes of the chunks into the root hash. -Our approach would be to generate some additional information, which we will call "structural information", for each chunk, -as well as for the composition of chunks. This structural information can be a sequence of these "opcodes": +Our approach would be to generate some additional information, which we will call "structural information", for each +chunk, as well as for the composition of chunks. This structural information can be a sequence of these "opcodes": 1. `LEAF length-of-key` 2. `LEAFHASH length-of-key` @@ -157,21 +175,22 @@ as well as for the composition of chunks. This structural information can be a s 6. `BRANCHHASH set-of-digits` 7. `HASH number-of-hashes` -The description of semantics will require the introduction of two stacks, which always have the same length. One -of the stacks (we call it "hash stack") contains hashes produced by opcodes. Another stack (we call it "node stack") -contains leaf nodes, branch nodes, or extension nodes of the trie being built. -In some cases, where the presence of a node is not required, the corresponding entry in the node stack is empty, or `nil`. -As well as the stack, the description requires the introduction of two input sequences (or "tapes"). The first tape contains -key-value pairs, each pair can be viewed as two opaque binary strings of arbitrary length, usually with the requirement -that the whole sequence is sorted by the lexicographic order of the keys, and all the keys are distinct. -The second tape contains hashes, each 32 bytes long. - -N.B. Though there two stacks, we can sometimes just say "the stack", since they are always of the same size and are operated upon in unison. -For example, when we say that XXX pops something from the stack, we mean that XXX pops 1 item from the hash stack and 1 item from the node stack, -but then only one of those two items may be used later and the other may be discarded by XXX. - -`LEAF` opcode consumes the next key-value pair from the first tape, creates a new leaf node and pushes it onto the node stack. It also -pushes the hash of that node onto the hash stack. The operand +The description of semantics will require the introduction of two stacks, which always have the same length. One of the +stacks (we call it "hash stack") contains hashes produced by opcodes. Another stack (we call it "node stack") +contains leaf nodes, branch nodes, or extension nodes of the trie being built. In some cases, where the presence of a +node is not required, the corresponding entry in the node stack is empty, or `nil`. As well as the stack, the +description requires the introduction of two input sequences (or "tapes"). The first tape contains key-value pairs, each +pair can be viewed as two opaque binary strings of arbitrary length, usually with the requirement that the whole +sequence is sorted by the lexicographic order of the keys, and all the keys are distinct. The second tape contains +hashes, each 32 bytes long. + +N.B. Though there two stacks, we can sometimes just say "the stack", since they are always of the same size and are +operated upon in unison. For example, when we say that XXX pops something from the stack, we mean that XXX pops 1 item +from the hash stack and 1 item from the node stack, but then only one of those two items may be used later and the other +may be discarded by XXX. + +`LEAF` opcode consumes the next key-value pair from the first tape, creates a new leaf node and pushes it onto the node +stack. It also pushes the hash of that node onto the hash stack. The operand `length-of-key` specifies how many digits of the key become part of the leaf node. For example, for the leaf `11` in our example, it will be 6 digits, and for the leaf `12`, it will be 4 digits. Special case of `length-of-key` being zero, pushes the value onto the stack and discards the key. @@ -179,33 +198,31 @@ being zero, pushes the value onto the stack and discards the key. `LEAFHASH` has almost the same semantics as `LEAF`, with the difference that it does not need to produce the leaf node, but only its hash (which can be more efficient in terms of allocations). It places `nil` onto the node stack. -`EXTENSION` opcode has a key as its operand. This key is a sequence of digits, which, in our example, can only be -of length 1, but generally, it can be longer. The action of this opcode is to pop one item from the stack, create -an extension node with the key provided in the operand, and the value being the item popped from the stack, and -push this extension node onto the node stack (and push its hash onto the hash stack). +`EXTENSION` opcode has a key as its operand. This key is a sequence of digits, which, in our example, can only be of +length 1, but generally, it can be longer. The action of this opcode is to pop one item from the stack, create an +extension node with the key provided in the operand, and the value being the item popped from the stack, and push this +extension node onto the node stack (and push its hash onto the hash stack). `EXTENSIONHASH` has almost the same semantics as `EXTENSION`, with the difference that it does not need to produce the extension node, but only its hash (which can be more efficient in terms of allocations). It places `nil` onto the node stack. `BRANCH` opcode has a set of hex digits as its operand. This set can be encoded as a bitset, for example. The action of -this opcode is to pop the same -number of items from the stack as the number of digits in the operand's set, create a branch node, and push it -onto the node stack (and push its hash onto the hash stack). Sets of digits can be seen as the horizontal -rectangles on the picture `prefix_groups_4`. -The correspondence between digits in the operand's set and the items popped from the stack is as follows. -The top of the stack (the item being popped off first) +this opcode is to pop the same number of items from the stack as the number of digits in the operand's set, create a +branch node, and push it onto the node stack (and push its hash onto the hash stack). Sets of digits can be seen as the +horizontal rectangles on the picture `prefix_groups_4`. The correspondence between digits in the operand's set and the +items popped from the stack is as follows. The top of the stack (the item being popped off first) corresponds to the highest digit, and the item being popped off last corresponds to the lowest digit in the set. -`BRANCHHASH` opcode is similar to the `BRANCH` with the difference is that instead of constructing the -branch node, it only creates its 32-byte hash. It places hash of the node onto the hash stack, and `nil` onto -the node stack. +`BRANCHHASH` opcode is similar to the `BRANCH` with the difference is that instead of constructing the branch node, it +only creates its 32-byte hash. It places hash of the node onto the hash stack, and `nil` onto the node stack. -`HASH` opcode takes specified number of hashes from the input sequence (tape) of hashes, and places them on -the hash stack. It also places the same number of `nil` entries onto the node stack. The first item consumed ends up -the deepest on the stack, the last item consumed ends up on the top of the stack. +`HASH` opcode takes specified number of hashes from the input sequence (tape) of hashes, and places them on the hash +stack. It also places the same number of `nil` entries onto the node stack. The first item consumed ends up the deepest +on the stack, the last item consumed ends up on the top of the stack. This is the structural information for the chunk containing leaves from `0` to `7` (inclusive): + ``` LEAF 5 LEAF 5 @@ -219,8 +236,9 @@ LEAF 6 BRANCH 0123 LEAF 5 ``` -After executing these opcodes against the chunk, we will have 2 items on the stack, first representing the branch -node (or its hash) for the prefix group of leaves `0` to `6`, and the second representing one leaf node for the leaf + +After executing these opcodes against the chunk, we will have 2 items on the stack, first representing the branch node ( +or its hash) for the prefix group of leaves `0` to `6`, and the second representing one leaf node for the leaf `7`. It can be observed that if we did not see what the next key after the leaf `7` is, we would not know the operand for the last `LEAF` opcode. If the next key started with the prefix `101` instead of `103`, the last opcode could have been `LEAF 4` (because leaves `7` and `8` would have formed a prefix group). @@ -255,20 +273,21 @@ HASH 1 BRANCH 0123 ``` -These opcodes are implemented by the type `HashBuilder` (implements the interface `structInfoReceiver`) in [turbo/trie/hashbuilder.go](../../turbo/trie/hashbuilder.go) +These opcodes are implemented by the type `HashBuilder` (implements the interface `structInfoReceiver`) +in [turbo/trie/hashbuilder.go](../../turbo/trie/hashbuilder.go) ### Multiproofs -Encoding structural information separately from the sequences of key-value pairs and hashes allows -describing so-called "multiproofs". Suppose that we know the root hash of the sequence of key-value pairs for our -example, but we do not know any of the pairs themselves. And we ask someone to reveal keys and value for -the leaves `3`, `8`, `22` and `23`, and enough information to prove to us that the revealed keys and values -indeed belong to the sequence. Here is the picture that gives the idea of which hashes need to be provided -together with the selected key-value pairs. +Encoding structural information separately from the sequences of key-value pairs and hashes allows describing +so-called "multiproofs". Suppose that we know the root hash of the sequence of key-value pairs for our example, but we +do not know any of the pairs themselves. And we ask someone to reveal keys and value for the leaves `3`, `8`, `22` +and `23`, and enough information to prove to us that the revealed keys and values indeed belong to the sequence. Here is +the picture that gives the idea of which hashes need to be provided together with the selected key-value pairs. ![prefix_groups_8](prefix_groups_8.png) To regenerate this picture, run `go run cmd/pics/pics.go -pic prefix_groups_8` And here is the corresponding structural information: + ``` HASH 2 LEAF 5 @@ -302,117 +321,121 @@ In order to devise an algorithm for generating the structural information, we re ![prefix_groups_3](prefix_groups_3.png) To regenerate this picture, run `go run cmd/pics/pics.go -pic prefix_groups_3` -It can then be readily observed that the first item in any prefix group has this property that its common prefix -with the item immediately to the right (or empty string if the item is the very last) is longer than its common -prefix with the item immediately to the left (or empty string if the item is the very first). -Analogously, the last item in any prefix group has the property that its common prefix with the item -immediately to the left is longer than its common prefix with the item immediately to the right. +It can then be readily observed that the first item in any prefix group has this property that its common prefix with +the item immediately to the right (or empty string if the item is the very last) is longer than its common prefix with +the item immediately to the left (or empty string if the item is the very first). Analogously, the last item in any +prefix group has the property that its common prefix with the item immediately to the left is longer than its common +prefix with the item immediately to the right. The algorithm proceeds in steps, one step for each key-value pair, in the lexicographic order of the keys. At each step, -it observes two keys (sequences of digits) - current, and succeeding. Because the algorithm emits -opcodes that manipulate the stack (technically, two stacks, but because they are always of the same lengths, we can -just say "stack"), it keeps track of what is currently on the stack. Each prefix group which is currently being +it observes two keys (sequences of digits) - current, and succeeding. Because the algorithm emits opcodes that +manipulate the stack (technically, two stacks, but because they are always of the same lengths, we can just say "stack") +, it keeps track of what is currently on the stack. Each prefix group which is currently being "assembled" by the algorithm, has some number of items on the stack. This is being tracked by an item in the `groups` slice. The index of the item in the slice is equal to the length of the prefix of the prefix group. And the `uint16` -value of the item is the bitmask, with one bit per digit (and also per item on the stack). Whenever the algorithm -emits an opcode that would push something on the stack, one of the items in the `groups` slice gains one extra bit -to its bitmask. When the algorithm emits an opcode that would pop one or more things from the stack, the corresponding -item gets removed from the `groups` slice. The slice `groups` is started off empty and it is shared between steps. +value of the item is the bitmask, with one bit per digit (and also per item on the stack). Whenever the algorithm emits +an opcode that would push something on the stack, one of the items in the `groups` slice gains one extra bit to its +bitmask. When the algorithm emits an opcode that would pop one or more things from the stack, the corresponding item +gets removed from the `groups` slice. The slice `groups` is started off empty and it is shared between steps. Algorithm's step can also be invoked recursively from another step, with current and preceding keys specified by the caller. -A step starts with computing the prefix of the smallest prefix group that the current key belongs to. It is either -the common prefix of current key and the preceding key or the common prefix of current key and the succeeding key, -whichever is longer (if they are the same length, then they are also equal, so no ambiguity there). -If the common prefix with the succeeding key is longer, then the new prefix group is being created. -If necessary, `groups` slice is expanded (by adding 0 items) so that it has the same length as the common prefix. - -The digit of the current key immediately following the max common prefix is called "extra digit". -The sequence of digits of the current key following that extra digit is the remainder (which could be empty). -The item in the `groups` slice corresponding to the common prefix (basically `groups[len(common prefix)]`) is modified -to include an extra bit corresponding to the "extra digit". -If this step of the algorithm was invoked on a key-value pair (non-recursively), then a `LEAF` (or `LEAFHASH`) -opcode is emitted, with the operand being the length of the remainder (zero if the remainder is empty). -If the step of the algorithm was invoked recursively, and the remainder is not empty, an `EXTENSION` (or `EXTENSIONHASH`) opcode -is emitted instead, with the operand being the remainder. -For example, for leaf `12`, the lengths of the common prefix with neighbours are 1 and 3. Therefore, this key will emit the opcode -`LEAF 4`, where 4 = 8 (original length) - 3 (max common prefix length) - 1 (one digit goes to the branch node for the prefix group). - -The following, optional, part of the step only happens if the common prefix of the current key and the preceding key is longer or equal than -the common prefix of the current key and the succeeding key, in other words, if at least one prefix group needs to be "closed". -Closing a prefix group means first emitting opcode `BRANCH` or `BRANCHHASH`. The value for the operand is taken from the -item in the `groups` slice, which corresponds to the length of the prefix for this group. Once value is taken, `groups` slice is -trimmed to remove the used item. Secondly, closing a prefix groups means invoking the step of the algorithm recursively -(unless the group that was closed was the one with the empty prefix, which encompasses all the keys). For that recursive invocation, -the prefix of the closed group is used as the current key, and the succeeding key simply passed on. Preceding key is found as the -prefix of the current key of the length equal of the highest index of non-zero item in the `groups` (in other words, -the longest prefix of a prefix group which would have something on the stack). During the recursive invocation, the slice `groups` +A step starts with computing the prefix of the smallest prefix group that the current key belongs to. It is either the +common prefix of current key and the preceding key or the common prefix of current key and the succeeding key, whichever +is longer (if they are the same length, then they are also equal, so no ambiguity there). If the common prefix with the +succeeding key is longer, then the new prefix group is being created. If necessary, `groups` slice is expanded (by +adding 0 items) so that it has the same length as the common prefix. + +The digit of the current key immediately following the max common prefix is called "extra digit". The sequence of digits +of the current key following that extra digit is the remainder (which could be empty). The item in the `groups` slice +corresponding to the common prefix (basically `groups[len(common prefix)]`) is modified to include an extra bit +corresponding to the "extra digit". If this step of the algorithm was invoked on a key-value pair (non-recursively), +then a `LEAF` (or `LEAFHASH`) +opcode is emitted, with the operand being the length of the remainder (zero if the remainder is empty). If the step of +the algorithm was invoked recursively, and the remainder is not empty, an `EXTENSION` (or `EXTENSIONHASH`) opcode is +emitted instead, with the operand being the remainder. For example, for leaf `12`, the lengths of the common prefix with +neighbours are 1 and 3. Therefore, this key will emit the opcode +`LEAF 4`, where 4 = 8 (original length) - 3 (max common prefix length) - 1 (one digit goes to the branch node for the +prefix group). + +The following, optional, part of the step only happens if the common prefix of the current key and the preceding key is +longer or equal than the common prefix of the current key and the succeeding key, in other words, if at least one prefix +group needs to be "closed". Closing a prefix group means first emitting opcode `BRANCH` or `BRANCHHASH`. The value for +the operand is taken from the item in the `groups` slice, which corresponds to the length of the prefix for this group. +Once value is taken, `groups` slice is trimmed to remove the used item. Secondly, closing a prefix groups means invoking +the step of the algorithm recursively +(unless the group that was closed was the one with the empty prefix, which encompasses all the keys). For that recursive +invocation, the prefix of the closed group is used as the current key, and the succeeding key simply passed on. +Preceding key is found as the prefix of the current key of the length equal of the highest index of non-zero item in +the `groups` (in other words, the longest prefix of a prefix group which would have something on the stack). During the +recursive invocation, the slice `groups` is trimmed to match the length of the preceding key that was found. -We will walk through the steps of the algorithm for the leaf `30`, and then for the leaf `31`. -For `30`, the key is `33113123`. Its max common prefix with neighbours is `3311`. The common prefix with the preceding key -is longer than with the succeeding key, therefore the prefix group `3311` is being closed. The digit immediately -following this prefix is `3`. Since this is a non-recursive invocation, and the remainder `123` is 3 digits long, -opcode `LEAF 3` is emitted. -The optional part of the step happens, and he opcode `BRANCH 23` (closing the prefix group) is emitted. Slice `groups` contained -the bit for `2` in the item `groups[4]` already, and another bit for `3` has been added, therefore we have `23` as the operand. -Slice `groups` gets trimmed to contain only 4 items. After that, the step gets invoked recursively -with current key being `3311`, and preceding key identified as `3` (there were no prefix group with prefix `33` or `331` yet, -this can be figured out by checking the `groups` slice, where the highest index with non-zero item is 1). - -In the recursive invocation of the step, -max common prefix is `331`. The common prefix with the succeeding key is longer than with the -preceding key, therefore a new prefix group `331` is created. Slice `groups` gets extended to 4 items, and the fourth item +We will walk through the steps of the algorithm for the leaf `30`, and then for the leaf `31`. For `30`, the key +is `33113123`. Its max common prefix with neighbours is `3311`. The common prefix with the preceding key is longer than +with the succeeding key, therefore the prefix group `3311` is being closed. The digit immediately following this prefix +is `3`. Since this is a non-recursive invocation, and the remainder `123` is 3 digits long, opcode `LEAF 3` is emitted. +The optional part of the step happens, and he opcode `BRANCH 23` (closing the prefix group) is emitted. Slice `groups` +contained the bit for `2` in the item `groups[4]` already, and another bit for `3` has been added, therefore we +have `23` as the operand. Slice `groups` gets trimmed to contain only 4 items. After that, the step gets invoked +recursively with current key being `3311`, and preceding key identified as `3` (there were no prefix group with +prefix `33` or `331` yet, this can be figured out by checking the `groups` slice, where the highest index with non-zero +item is 1). + +In the recursive invocation of the step, max common prefix is `331`. The common prefix with the succeeding key is longer +than with the preceding key, therefore a new prefix group `331` is created. Slice `groups` gets extended to 4 items, and +the fourth item (`group[3]`) gets item containing one bit for digit `1`. No more recursion. -For leaf `31` (key `33132002`), max common prefix is `331`. The common prefix with the preceding key is longer than -with the succeeding key, therefore the prefix group `331` is being closed. This is the group that was created during the -step for leaf `30` described above. The digit immediately following this prefix is `3`. Corresponding bit is added to -the item `groups[3]`. Since this is a non-recursive invocation, opcode `LEAF 4` is emitted (4 is the length of the remainder `2002`). -The optional part of the step happens, opcode `BRANCH 13` is emitted, and slice `group` is trimmed to 3 items to remove the item `groups[3]`. -The step gets invoked recursively -with current key being `331`, and preceding key identified as `3` (there were no prefix group with prefix `33`). +For leaf `31` (key `33132002`), max common prefix is `331`. The common prefix with the preceding key is longer than with +the succeeding key, therefore the prefix group `331` is being closed. This is the group that was created during the step +for leaf `30` described above. The digit immediately following this prefix is `3`. Corresponding bit is added to the +item `groups[3]`. Since this is a non-recursive invocation, opcode `LEAF 4` is emitted (4 is the length of the +remainder `2002`). The optional part of the step happens, opcode `BRANCH 13` is emitted, and slice `group` is trimmed to +3 items to remove the item `groups[3]`. The step gets invoked recursively with current key being `331`, and preceding +key identified as `3` (there were no prefix group with prefix `33`). In the recursive step, max common prefix is `3`. The common prefix with the preceding key is longer than with the -succeeding key, therefore the prefix group `3` is being closed. The digit immediately following this prefix is `3`. -The remainder `1` is non-empty, and since this is a recursive invocation, opcode -`EXTENSION 1` is emitted. -The optional part of the step happens, opcode `BRANCH 023` is emitted for the prefix group `3` being closed. Slice `groups` is -trimmed to just 1 item. The step gets invoked recursively again, -with current key being `3`, and preceding key empty. - -In the deeper recursive step, max common prefix is empty. Since the common prefix with the preceding key equals to -the common prefix with the succeeding key (they are both empty). The optional part of the step happens, opcode `BRANCH 0123` +succeeding key, therefore the prefix group `3` is being closed. The digit immediately following this prefix is `3`. The +remainder `1` is non-empty, and since this is a recursive invocation, opcode +`EXTENSION 1` is emitted. The optional part of the step happens, opcode `BRANCH 023` is emitted for the prefix group `3` +being closed. Slice `groups` is trimmed to just 1 item. The step gets invoked recursively again, with current key +being `3`, and preceding key empty. + +In the deeper recursive step, max common prefix is empty. Since the common prefix with the preceding key equals to the +common prefix with the succeeding key (they are both empty). The optional part of the step happens, opcode `BRANCH 0123` is emitted, and `groups` is trimmed to become empty. No recursive invocation follows. -The step of this algorithm is implemented by the function `GenStructStep` in [turbo/trie/gen_struct_step.go](../../turbo/trie/gen_struct_step.go). +The step of this algorithm is implemented by the function `GenStructStep` +in [turbo/trie/gen_struct_step.go](../../turbo/trie/gen_struct_step.go). ### Converting sequence of keys and value into a multiproof -One of the biggest difference between Erigon and go-ethereum is in the way the Ethereum state is persisted in -the database. In go-ethereum, the model for persistence is Merkle Patricia tree. In Erigon, the model for -persistence is sequence of key-value pairs, where keys are either derived from account addresses, or from -storage indices. In this model, computing Merkle Patricia tree from part of data is a very commonly used operation. -This operation is called "Resolution" because it normally arises from a need to look up (resolve) some keys and corresponding -values, and later update them, thus requiring recomputation of the Merkle Patricia tree root. - -We can use the concept of Multiproofs to define the resolution operation. If we have a set of key-value pairs, and we need -to "resolve" them, we effectively need to produce a multiproof for the given set of key-value pairs. -To produce such multiproof, we can use the algorithm for generating the structural information from the sequence of keys. -However, within the algorithm, choices need to be made between emitting `BRANCHHASH` and `BRANCH` opcodes (or, similarly, -between `LEAF` and `LEAFHASH`, and between `EXTENSION` and `EXTENSIONHASH`). Such choices -are conceptually simple to make - if max common prefix is also a prefix of any of the keys we are trying to resolve, -`BRANCH` should be emitted, otherwise, `BRANCHHASH` should be emitted. -However, in order to make these choices efficiently, the set of keys being resolved will be converted into a sorted -list. Then, at each point when the algorithm processes a key, it maintains references to two consecutive keys from -that sorted list - one "LTE" (Less Than or Equal to the currently processed key), and another "GT" (Greater Than the -currently processed key). If max common prefix is also prefix of either LTE or GT, then `BRANCH` opcode is emitted, -otherwise, `BRANCHHASH` opcode is emitted. This is implemented by the type `ResolveSet` in [turbo/trie/resolve_set.go](../../turbo/trie/resolve_set.go) +One of the biggest difference between Erigon and go-ethereum is in the way the Ethereum state is persisted in the +database. In go-ethereum, the model for persistence is Merkle Patricia tree. In Erigon, the model for persistence is +sequence of key-value pairs, where keys are either derived from account addresses, or from storage indices. In this +model, computing Merkle Patricia tree from part of data is a very commonly used operation. This operation is called " +Resolution" because it normally arises from a need to look up (resolve) some keys and corresponding values, and later +update them, thus requiring recomputation of the Merkle Patricia tree root. + +We can use the concept of Multiproofs to define the resolution operation. If we have a set of key-value pairs, and we +need to "resolve" them, we effectively need to produce a multiproof for the given set of key-value pairs. To produce +such multiproof, we can use the algorithm for generating the structural information from the sequence of keys. However, +within the algorithm, choices need to be made between emitting `BRANCHHASH` and `BRANCH` opcodes (or, similarly, +between `LEAF` and `LEAFHASH`, and between `EXTENSION` and `EXTENSIONHASH`). Such choices are conceptually simple to +make - if max common prefix is also a prefix of any of the keys we are trying to resolve, +`BRANCH` should be emitted, otherwise, `BRANCHHASH` should be emitted. However, in order to make these choices +efficiently, the set of keys being resolved will be converted into a sorted list. Then, at each point when the algorithm +processes a key, it maintains references to two consecutive keys from that sorted list - one "LTE" (Less Than or Equal +to the currently processed key), and another "GT" (Greater Than the currently processed key). If max common prefix is +also prefix of either LTE or GT, then `BRANCH` opcode is emitted, otherwise, `BRANCHHASH` opcode is emitted. This is +implemented by the type `ResolveSet` in [turbo/trie/resolve_set.go](../../turbo/trie/resolve_set.go) ### Extension of the structure to support contracts with contract storage -When it is required to construct tries containing accounts as well as contract storage, and contract code, the -set of opcodes making up the structural information need to be extended by four more. Apart from that, a new input -sequence (tape) is added, containing the bytecodes of contracts. + +When it is required to construct tries containing accounts as well as contract storage, and contract code, the set of +opcodes making up the structural information need to be extended by four more. Apart from that, a new input sequence ( +tape) is added, containing the bytecodes of contracts. 8. `CODE` 9. `CODEHASH` @@ -420,61 +443,65 @@ sequence (tape) is added, containing the bytecodes of contracts. 11. `ACCOUNTLEAFHASH length field-set` 12. `EMPTYROOT` -`CODE` opcode consumes the next item in the bytecode sequence, creates a code node and pushes it onto the node stack. -It also pushes the hash of the byte code onto the hash stack. +`CODE` opcode consumes the next item in the bytecode sequence, creates a code node and pushes it onto the node stack. It +also pushes the hash of the byte code onto the hash stack. -`CODEHASH` opcode consumes the next hash from the hash sequence, pushes it onto the hash stack, and pushes `nil` into the -node stack. +`CODEHASH` opcode consumes the next hash from the hash sequence, pushes it onto the hash stack, and pushes `nil` into +the node stack. `ACCOUNTLEAF` opcode is similar to `LEAF`. It consumes the next item from the key tape. The rest of the semantics depends on the value of the `field-set`. Field set can be respresented by a bitmask. In that case, bit 0 would -correspond to field 0, bit 1 (number 2) - to field 1, bit 2 (number 4) - to field 2. Currently, field 0 means -account nonce, field 1 means account balance, field 2 means contract storage, field 3 means contract code. - - * If field 0 is present in the `field-set`, the opcode consumes one item from the nonce tape (tape 0), otherwise -it assumes default nonce (zero). This becomes the nonce of the newly created account/contract node. - * If field 1 is present in the `field-set`, the opcode consumes one item from the balance tape (tape 1), otherwise -it assumes default balance (zero). This becomes the balance of the newly created account/contract node. - * If field 2 is present in the `field-set`, the opcode pops a node from the node stack and a hash from the hash stack. -This node or hash (in this order of preference) becomes the storage of the newly created contract node. -Storage root can be empty (that would introduced by `EMPTYROOT` opcode). - * If field 3 is present in the `field-set`, the opcode pops a code node from the node stack and a hash from the hash stack. -This node or hash (in the order of preference) becomes the code or code hash of the newly created contract node. - -Out of all the information collected through the tapes and the stacks (as directed by the `field-set`), an account leaf node -is constructed and pushed onto the node stack. Its hash is pushed onto the hash stack. -Field set is introduced to make the specification of what is an account extensible in a backwards compatible way. -If a new field is added to the account in the future, it can be introduced without a need to re-encode the pre-existing -structures. +correspond to field 0, bit 1 (number 2) - to field 1, bit 2 (number 4) - to field 2. Currently, field 0 means account +nonce, field 1 means account balance, field 2 means contract storage, field 3 means contract code. + +* If field 0 is present in the `field-set`, the opcode consumes one item from the nonce tape (tape 0), otherwise it + assumes default nonce (zero). This becomes the nonce of the newly created account/contract node. +* If field 1 is present in the `field-set`, the opcode consumes one item from the balance tape (tape 1), otherwise it + assumes default balance (zero). This becomes the balance of the newly created account/contract node. +* If field 2 is present in the `field-set`, the opcode pops a node from the node stack and a hash from the hash stack. + This node or hash (in this order of preference) becomes the storage of the newly created contract node. Storage root + can be empty (that would introduced by `EMPTYROOT` opcode). +* If field 3 is present in the `field-set`, the opcode pops a code node from the node stack and a hash from the hash + stack. This node or hash (in the order of preference) becomes the code or code hash of the newly created contract + node. + +Out of all the information collected through the tapes and the stacks (as directed by the `field-set`), an account leaf +node is constructed and pushed onto the node stack. Its hash is pushed onto the hash stack. Field set is introduced to +make the specification of what is an account extensible in a backwards compatible way. If a new field is added to the +account in the future, it can be introduced without a need to re-encode the pre-existing structures. `ACCOUNTLEAFHASH` opcode's difference from `ACCOUNTLEAF` is that it does not push the leaf node onto the node stack, pushing `nil` instead. The hash of would-be account leaf node is pushed onto the hash stack. `EMPTYROOT` is a way of placing a special value signifying an empty node onto the node stack. It also pushes the -corresponding hash onto the hash stack. This opcode is introduced because there is no way of achieving its semantics -by means of other opcodes. +corresponding hash onto the hash stack. This opcode is introduced because there is no way of achieving its semantics by +means of other opcodes. ### Merkle trie root calculation -**Theoretically:** "Merkle trie root calculation" starts from state, build from state keys - trie, -on each level of trie calculates intermediate hash of underlying data. +**Theoretically:** "Merkle trie root calculation" starts from state, build from state keys - trie, on each level of trie +calculates intermediate hash of underlying data. -**Practically:** It can be implemented as "Preorder trie traversal" (Preorder - visit Root, visit Left, visit Right). +**Practically:** It can be implemented as "Preorder trie traversal" (Preorder - visit Root, visit Left, visit Right). But, let's make couple observations to make traversal over huge state efficient. -**Observation 1:** `CurrentStateBucket` already stores state keys in sorted way. -Iteration over this bucket will retrieve keys in same order as "Preorder trie traversal". +**Observation 1:** `CurrentStateBucket` already stores state keys in sorted way. Iteration over this bucket will +retrieve keys in same order as "Preorder trie traversal". -**Observation 2:** each Eth block - changes not big part of state - it means most of Merkle trie intermediate hashes will not change. -It means we effectively can cache them. `IntermediateTrieHashBucket` stores "Intermediate hashes of all Merkle trie levels". -It also sorted and Iteration over `IntermediateTrieHashBucket` will retrieve keys in same order as "Preorder trie traversal". +**Observation 2:** each Eth block - changes not big part of state - it means most of Merkle trie intermediate hashes +will not change. It means we effectively can cache them. `IntermediateTrieHashBucket` stores "Intermediate hashes of all +Merkle trie levels". It also sorted and Iteration over `IntermediateTrieHashBucket` will retrieve keys in same order +as "Preorder trie traversal". -**Implementation:** by opening 1 Cursor on state and 1 more Cursor on intermediate hashes bucket - we will receive data in - order of "Preorder trie traversal". Cursors will only do "sequential reads" and "jumps forward" - been hardware-friendly. -1 stack keeps all accumulated hashes, when sub-trie traverse ends - all hashes pulled from stack -> hashed -> new hash puts on stack - it's hash of visited sub-trie (it emulates recursive nature of "Preorder trie traversal" algo). +**Implementation:** by opening 1 Cursor on state and 1 more Cursor on intermediate hashes bucket - we will receive data +in order of "Preorder trie traversal". Cursors will only do "sequential reads" and "jumps forward" - been +hardware-friendly. 1 stack keeps all accumulated hashes, when sub-trie traverse ends - all hashes pulled from stack -> +hashed -> new hash puts on stack - it's hash of visited sub-trie (it emulates recursive nature of "Preorder trie +traversal" algo). + +Imagine that account with key 0000....00 (64 zeroes, 32 bytes of zeroes) changed. Here is an example sequence which can +be seen by running 2 Cursors: -Imagine that account with key 0000....00 (64 zeroes, 32 bytes of zeroes) changed. -Here is an example sequence which can be seen by running 2 Cursors: ``` 00 // key which came from cache, can't use it - because account with this prefix changed 0000 // key which came from cache, can't use it - because account with this prefix changed @@ -491,34 +518,45 @@ Here is an example sequence which can be seen by running 2 Cursors: ff // key which came from cache, it is "next sub-trie" (1 byte shorter key), use it, jump to "next sub-trie" nil // db returned nil - means no more keys there, done ``` -On practice Trie is no full - it means after account key `{30 zero bytes}0000` may come `{5 zero bytes}01` and amount of iterations will not be big. + +On practice Trie is no full - it means after account key `{30 zero bytes}0000` may come `{5 zero bytes}01` and amount of +iterations will not be big. ### Attack - by delete account with huge state -It's possible to create Account with very big storage (increase storage size during many blocks). -Then delete this account (SELFDESTRUCT). - Naive storage deletion may take several minutes - depends on Disk speed - means every Eth client - will not process any incoming block that time. To protect against this attack: - PlainState, HashedState and IntermediateTrieHash buckets have "incarnations". Account entity has field "Incarnation" - - just a digit which increasing each SELFDESTRUCT or CREATE2 opcodes. Storage key formed by: - `{account_key}{incarnation}{storage_hash}`. And [turbo/trie/trie_root.go](../../turbo/trie/trie_root.go) has logic - every time - when Account visited - we save it to `accAddrHashWithInc` variable and skip any Storage or IntermediateTrieHashes with another incarnation. +It's possible to create Account with very big storage (increase storage size during many blocks). Then delete this +account (SELFDESTRUCT). Naive storage deletion may take several minutes - depends on Disk speed - means every Eth client +will not process any incoming block that time. To protect against this attack: +PlainState, HashedState and IntermediateTrieHash buckets have "incarnations". Account entity has field "Incarnation" - +just a digit which increasing each SELFDESTRUCT or CREATE2 opcodes. Storage key formed by: +`{account_key}{incarnation}{storage_hash}`. And [turbo/trie/trie_root.go](../../turbo/trie/trie_root.go) has logic - +every time when Account visited - we save it to `accAddrHashWithInc` variable and skip any Storage or +IntermediateTrieHashes with another incarnation. Transaction processing ---------------------- -The main function of Ethereum software is to continuously process blocks and generate some information as the result of this processing. -The diagram below shows schematically the main types of information being processed and generated. +The main function of Ethereum software is to continuously process blocks and generate some information as the result of +this processing. The diagram below shows schematically the main types of information being processed and generated. ![processing](processing_blocks.png) -For an ordinary (non-mining) node, -block headers and block bodies are coming from the outside, via the peer-to-peer network. While processing those, the node maintains -the view of the current state of the Ethereum (bright yellow box), as well as generates the timestamped history of the changes in the state -(this is optional). History of the state is shown as a series of dull yellow boxes. Some transactions also produce log messages, and those -are included into transaction receipts. Receipts are also optionally persisted and are shown as green stacks of sheets. Erigon's -default mode of operation does not persist the receipts, but recalculates them on demand. It looks up the state at the point just before -the transaction in question (for which we would like a receipt), re-executes transaction, and re-generates the receipt. This can only -work if the history of the state is available for the period of time including the transaction. +For an ordinary (non-mining) node, block headers and block bodies are coming from the outside, via the peer-to-peer +network. While processing those, the node maintains the view of the current state of the Ethereum (bright yellow box), +as well as generates the timestamped history of the changes in the state +(this is optional). History of the state is shown as a series of dull yellow boxes. Some transactions also produce log +messages, and those are included into transaction receipts. Receipts are also optionally persisted and are shown as +green stacks of sheets. Erigon's default mode of operation does not persist the receipts, but recalculates them on +demand. It looks up the state at the point just before the transaction in question (for which we would like a receipt), +re-executes transaction, and re-generates the receipt. This can only work if the history of the state is available for +the period of time including the transaction. [See more about blocks and transactions processing here](../../eth/stagedsync/README.md) + +Dev Net with Geth nodes +----------------------- + +- create somewhere file `erigon.dev` with content `26e86e45f6fc45ec6e2ecd128cec80fa1d1505e5507dcd2ae58c3130a7a97b48` +- run: `geth account import ./erigon.dev` +- add to geth flag `--miner.etherbase=67b1d87101671b127f5f8714789c7192f7ad340e` +- follow https://geth.ethereum.org/docs/interface/private-network diff --git a/docs/programmers_guide/header_download.md b/docs/programmers_guide/header_download.md deleted file mode 100644 index c0a77c5e568..00000000000 --- a/docs/programmers_guide/header_download.md +++ /dev/null @@ -1,238 +0,0 @@ -# Block header download process - -This process is a collection of data structures and algorithms to perform the task of obtaining a consistent and verified header chain from peers over the network. - -## Two phases of header downloading - -There are two phases of header downloading. In the first phase, the headers that are known in advance (also known as "hard-coded" headers) are downloaded. -To initiate the first phase, we use a pre-generated list of hard-coded headers, one header for every 100'000-th block, for example. The total number -of such selected headers is relatively small even for the mainnet (120 headers for 12 million blocks), but big enough to take advantage of multiple -peers able to deliver the intermediate headers. This pre-generated list of headers is embedded into the source code of Erigon and is updated for -every release. Since the headers downloaded in the first phase have been seen before, no PoW or PoA verification -if performed on them, they are assumed correct as long as they are part of the correct chain of hashes (which is assumed to be impossible to forge -due to second preimage resistant of hash functions used for producing header hashes). -In the second phase, headers that are not previously seen are downloaded. Because they are not seen before PoW or PoA verification needs to be -performed on them. The most efficient way to perform such verification is to verify the headers in the ascending order of their block heights. -This is especially true for Clique POA, for which the verification of a header may rely on up to 30'000 previous headers, and out-of-order verification -is thus much harder to organised than for EtHash PoW (where only the parent header is required for verification). - - -## Data structures - -All data structures, except for the files, are kept in operating memory (RAM), and do not survive an interruption, a crash, or a powerdown. Therefore, -there is `RECOVER` algorithm described later, which initialises all transitent data structures from the files. - -### The buffer - -It is an append-only collection of headers, without any extra indices. The buffer is of a limited configurable size. -Apart from block headers, the buffer may contain another type of entries that we will call "tombstones". The tombstones mark certain block hashes as -undesirable (usually because they are part of of a fake chain produced for the purpose of frustrating the download process). Like ordinary header entries, -the tombstones contain block height information, so that they can be sorted together with the headers. As will be mentioned later, this sorting is performed -when the buffer is full and needs to be flushed into a file. Presence of tombstones allows skipping all the descendant headers of any tombstone, and not -persisting them into the files. This happens when an undesirable header is detected before its decendants were flushed into a file. -Otherwise, it is possible that some undesirable headers will get into the files, and they will need to be ignored when the files are getting processed and -entries committed to the database. - -### The files - -Once the buffer reaches its maximum size (such that adding anorher header would cause the buffer to exceed its size limit), the entries in the buffer are -sorted by the block height (and in the case of ties, by the block hash), in ascending order. Once sorted, the content of the buffer is flushed into a new -file, and the buffer is cleared. The files are supposed to persist in the event of an interruption, a crash, or a powerdown. The files are deleted once -the block headers have been successfully committed to the database, or they can be deleted manually in case of a corruption. - -### Bad headers - -Set of block hashes that are known to correspond to invalid or prohibited block headers. The bad headers set can be initialised with hard-coded values. -Not every invalid header needs to be added to the bad headers set. If the invalidity of a block header can be found just by examining at the header -itself (for example, malformed structure, excessive size, wrong Proof Of Work), such block header must not be added to the bad headers set. Only if -the evidence of the invalidity is not trivial to obtain, should a block header be added. For example, if a block header has valid Proof Of Work, but -it is a part of a header chain that leads to a wrong genesis block. Another example is a blocl header with correct Proof Of Work, but incorrect -State Root hash. -Newly found bad block headers need to be immediately written to the database, because the cost of discovering their invalidity again needs to be avoided. - -### Tree (anchors) - -At any point in time, the headers that have been downloaded and placed into the buffer or into one of the files, can be viewed as a collection of trees like this: - -![header_download_1](header_download_1.png) - -The reason why we may need to maintain multiple trees instead of just one, is this potential optimisation. If we have some hindsight knowledge -about the header chain that is being downloaded, we can hard-code the hashes of block headers at some intermediate block heights. For example, at every -height which is multiple of 4096. Assuming that the maximum height is on the order of tens of millions, we only need to hard-code around a thousand -32-byte values (block hash), together with total difficulty number (maximum 32 byte), which is trivial. Having these hard-coded anchors, we can -download different trees from different peers to better utilise the network connectivity. Each tree has exactly one anchor (root). -Every anchor maintains an integer attribute `powDepth`, meaning how "deep" after this anchor the ancestral block headers -need their Proof Of Work verified. Value `0` means that there is no need to verify Proof Of Work on any ancestral block headers. All hard-coded anchors come -with `powDepth=0`. Other anchors (created by announced blocks or block hashes), start with `powDepth` equal to some configured value (for example, `65536`, -which is equivalent to rought 16 days of block time), and every time the tree is extended by moving its anchor "down", the `powDepth` is also -decreased by the height of the extension. - -![header_download_2](header_download_2.png) - -Eventually, the growing tree can reach the configured depth, at which point the `powDepth` attribute of its anchor will drop to `0`, and no -further Proof Of Work verification on the ancestors will be performed. Another possibility is that the anchor will match with a tip of another tree, -the trees will merge, and the anchor simply disappears, superseeded by the anchor of another tree. -There is also a potential optimisation, whereby the extension of a tree from the tip shall also decrease the `powDepth` value of its anchor. -However, we currently leave this for future editions. -Another attribute of an anchor is `totalDifficulty`. Total difficulty is the sum of all difficulties of headers starting from this anchor, all the -way to the genesis, including the anchor itself. The total difficulty can only be obtained for the trees that in some ways originated from a -hard-coded anchor. The genesis is also considered a hard-coded anchor. The anchors created from block announcements or block hash -announcements, have their `totalDifficulty` equal to `0`, meaning that it is currently impossible to calculate the total difficulty given the available information. -Since any tree contains exactly one anchor, the anchor hash can be conveniently used as an identifier for the tree. Other important parts -of a tree are its tips. Therefore, an anchor has another attribute, `tips`, which is a collection of block hashes currently belonging to the -tree's tips. This collection allows efficiently iterating over the tips of a certain tree, for example, to update the total -difficulties of the tips when the anchor changes. -When a new header gets appended to an existing anchor, there are a few conditions that need to be met. Firstly, the `parentHash` of the anchor header -needs to match the hash of the attaching header. Secondly, the difficulty calculation formula for the anchor yields the anchor's difficulty. In Ethereum, difficulty of a child block header is calculated from various attributes of that child block header (`timestamp`) and the parent block header -(`timestamp`, `difficulty`, `blockHeight`, `uncleHash`). Therefore, anchors need to have two other attributes, `difficulty` and `timestamp`, so that the correctness of the calculating `difficulty` from its parent header can be verified. For the purpose of further verification (to make sure that -the parent and child block heights agree), anchors have `blockHeight` attribute. -To conclude, the anchors data structure is a mapping of anchor parentHashes (not hashes of -anchors themselves) to a collection of objects with attributes `powDepth`, `totalDifficulty`, `tips`, `difficulty`, `blockHeight`, `hash`, -and `timestamp`. We are talking -about collection of objects rather than objects because there may be multiple anchor headers having the same value of Parent Hash. - -### Tree (tips) - -A tree can contain any number of headers, all connected to one another via the value of their `ParentHash` attribute, and, ultimately, -such tree of headers is connected to the anchor (root) of that tree. Some headers in a tree are selected as the tips of that tree. -Description of how the headers are selected to be the tips requires the definition of cumulative difficulty. Every tip (once selected) -has some attributes associated with it. Firstly, the `anchorParent` attribute, which is the `ParentHash` of the anchor that this tip is (transitively) -connected to (in other words, the tip is in the "progeny", or in the "decendants" of that anchor). The `anchorParent` attribute of a tip can be viewed -as the inverse of the anchor's `tips` attribute, and both need to be updated at the same time, when the anchor or one of the tips of a tree changes. -Secondly, the `cumulativeDifficulty` attribute of a tip stores the sum of difficulties of all headers starting from the tip all the way down -(and including) the anchor. The cumulative difficulty, combined with the anchor's `totalDifficulty` (minus the the `difficulty` of the anchor so -that it is not counted twice), provides a way of calculating the total difficulty of a tip. -A subset of headers in a tree is selected to be the tips of that segment. The necessary (bit not sufficient) requirement for a header -to be a tip is that it has cumulative difficulty no lower than cumulative difficulty of any non-tip in that tree. In other words, tips are -the headers with the largest cumulative difficulties in their trees. -To ensure resilience against potential resource exhaustion due to faults or deliberate attacks, we would like to limit the number of tips being -tracked at any given time, and, by extension, the number of tree being maintained. For this purpose, we place almost all currently -tracked tips from all trees into a sorted mapping, sorted by cumulative difficulty. The tips whose hashes coincide with any of the hard-coded -anchors, are exempt from the limiting, and therefore, are not placed into the sorted mapping. -This sorted mapping is used whenever the number of tracked tips is about to exceed the (configurable) limit. Entries with the lowest cumulative -difficulties are removed from the mapping, as well as from the tips data structure. -The trees that are created from the hard-coded anchors, are only allowed to be extended on the anchor's side, therefore their tips need -to be marked as non-prependable. This is the role of another boolean attribute of a tip, `noPrepend`. -To conclude, the tips data structure is a mapping of tip hashes to objects with the attributes -`anchorParent`, `cumulativeDifficulty`, `timestamp`, `difficulty`, `blockHeight`, `uncleHash`, `noPrepend`. -We will call the sorted mapping of cumulative difficulties to tip hashes "the tip limited data structure. - -### Working trees -The anchors, the tips, and the tip limiter describe a collection of trees. We will this collection "working trees" for the -future reference in the description of the algorithms. - -### Chain segment -Chain segment, like a tree, is also a collection of headers, connected to one another. However, it is a simpler collection than a tree, -without any branching. A tree can be divided into segments like this: - -![header_download_3](header_download_3.png) - -When such decomposition is performed, the resulting segments are usually ordered in a specific (partial) order. If any segment is referenced -by another segment, then the former needs to come before the latter in the ordering, as shown in the illustration. -We will use chain segments instead of trees as much as possible, to simplify the algorithms. - -## Principles and invariants - -### When a new anchor can be created - -A new tree can only be introduced in the following 3 ways and according to specified conditions: -1. Hard-coded anchors -2. Anchors recovered from the files during the restart after an interruption, a crash, or a powerdown -3. Block announced by a peer, or a block header received from a peer, if the Proof Of Work is valid, and if the timestamp of such block or -block header is withing a configured range from the current time measured locally. In other words, with a timestamp not too far in the past -and not too far in the future. - -The condition on the block header timestamp in the point (3) is required to prevent a potential malicious peer from being able to reuse the -same pre-generated fake chain segements again and again over a long period of time. The tips of such pre-generated fake trees would -need large cumulative difficulty to be able to force genuine tips from the tip limiter. But even if they are generated at a cost of significant -work (to pass Proof Of Work verification), they will only be useful for a limited period of time. According to the limitation in the point (3), -we will refuse to create a new anchor and therefore ignore any of its ancestral headers (see the next principle below). - -### When a chain segment can be processed - -A chain segment constructed from a message received from a peer, can be appended to an existing anchor of some working tree. -In other words, it is appending new ancestral chain segements to existing children (or "progeny"). -Part of the chain segment that ends up "above" the attachment point is discarded, as shown on the diagram below. If there is no anchor -to which any header in the new segment can be appended, the entire new segment is discarded. - -![header_download_4](header_download_4.png) - -Note that this restriction is applied even before any Proof Of Work verification is performed on the received headers. The anchor to which the -received chain segment is getting appended, determines whether, and for how many headers in the segment the Proof Of Work verificatin needs to -be done (`powDepth` attribute). As mentioned previously, the new anchor's attribute `powDepth` is calculated from the existing anchor's -`powDepth` and the length of the part of the new chain segment that had been appended. - -### Invariants (TODO) - -## Algorithms -Currently, the algorithms are just listed without much explanation. Detailed explanation will be added after Proof Of Concept. - -### Handle BlockHeadersMsg -**Input**: BlockHeadersMsg + peer handle. **Output**: collection of chain segments, or penalty for the peer handle -Collection of block headers in the a `BlockHeadersMsg` message can be viewed as a specific reprentation of a "rooted forest". In this -representation each header specifies a vertex and a potential outgoing edge (via `ParentHash` attribute, it if points to another header -in the message). Vertices without outgoing edges (because `ParentHash` points to a header which is not contained in the message) are roots, -and they give rise to rooted trees. So rooted forest is a collection of rooted trees. This algorithm needs to transform this -representation into another one, more useful, which groups all headers from the same rooted tree together, and in each group, the -root is clearly identified. -This algorithm also checks that no headers in the message is contained in the bad header set, any child header pointing to its parent header -within the message agree on their numbering and difficulty calculation. It also does not allow a header appearing twice in the message. -If any of these checks fail, the algorithm returns penalty object, which includes peer handle (the same as the one passed as an input), -and type of fault (`BadHeader`, `DuplicateHeader`, etc.). The logic of deciding which fault results in which penalty is outside of this -algorithm. -**Invariant**: headers in the output chain segment must be topologically sorted, with the root being the first - -### Handle NewBlockMsg -**Input**: NewBlockMsg + peer handle. **Output**: chain segment or penalty for the peer handle -The message `NewBlockMsg` contains a block (with header and body), as well as its total difficulty. Since this correctness of this -total difficulty cannot be verified just by looking at the block itself, the only use of it is to potentially penalise the peer -if we find that the total difficulty reported was wrong. But this is of a very marginal use, if we do not trust this number anyway. -Therefore, we will only be looking at the block header part of the message. This algorithm is a degenerate version of the algorithm -"Handle BlockHeadersMsg", because it only creates one chain segment and there is only one header in that segment. - -### FindAnchors -**Input**: chain segment, **Output**: index in the chain segment where the header attaching to an anchor is found, possibly tombstones. -Side-effects are the removal of the trees if their anchors are found to be incompatible with the chain segment (in that case tombsones -are the hashes of such anchors) - -### FindTip - -### Prepend -**Input**: chain segment + peer handle. **Output**: updated structures (modified working chain segments) or "no prepend point found", or penalty for the handle (tombstone creation) -We do not allow prepending to the hard-coded tips (therefore tips need an extra boolean attribute `noPrepend`) -Proof Of Work verification happens only if other conditions have been satisfied. - -### Append -**Input**: chain segment. **Output**: updated structures (modified working chain segments) or "no append point found", or tombstones. -There is an important difference between `Prepend` and `Append` algorithms with regards to error handling. Algorithm `Prepend` attaches -"children" block headers to the existing "parent" block headers. Since "bad child" does not invalidate the parent, any verification errors during -the `Prepend` algorithm does not cause the existing tips to disappear, only the peer who sent the new bad chain segment gets penalised. -On the other hand, algorithm `Append` attaches "parent" block headers to the existng "children" block headers. Since "bad parent" DOES invalidate -the children, any verification errors during `Append` algorithm cause the entire working chain segment to be discarded, as long as the hash chain -points from the bad parents to the existing children. - -**TODO** Added two extra attributes to anchors: `hash` (to be able to return tombstones) and `blockHeight` (to be able to verify the -anchor-parent relationship) - -### Create anchor -**Input**: chain segment + peer handle. **Output**: updated structures (new working chain segment) or one of the penalties: "anchor too far in the future" or "anchor too far in the past" - -### Recover from files -**Input**: the files. **Output**: working chain segments - -### Request more headers -**Input**: working chain segments. **Output**: GetBlockHeadersMsg requests -For this algorithm we will require an extra data structure, which is a priority queue containing achor parent hashes, prioritising by latest request time. -This is to ensure we can easily handle time outs and grow all chain segements evenly (in round-robin fashion). - -### Handle NewBlockHashMsg -**Input**: NewBlockHashMsg + peer handle. **Output**: GetBlockHeadersMsg request. - -### Flush the buffer -**Input**: The buffer. **Output**: the files - -### Initiate staged sync -Detect when to start the staged sync. Whenever a new tip is added, we check that its attribute `anchorParent` is equal to pre-configured value `0x00..00` for sync from genesis, or the hash of the last block header we have processed in the stage 1 of the staged sync. If this condition is satisfied, we take -the attribute `cumulativeDifficulty` of the tip and compare it to a variable `highestTotalDifficulty` (initialised to zero in the beginning). If the tip's -`cumulativeDifficulty` is higher than `highestTotalDifficulty`, then we set `highestTotalDifficulty` to the new value, and initiate the staged sync from -the tip's anchor to the tip diff --git a/docs/readthedocs/source/rpc/index.rst b/docs/readthedocs/source/rpc/index.rst index 0f2ac8de539..1a6c1792b83 100644 --- a/docs/readthedocs/source/rpc/index.rst +++ b/docs/readthedocs/source/rpc/index.rst @@ -153,7 +153,7 @@ Returns the current network id. * - Type - Description * - ``STRING`` - - The current network id. One of |br| ``1``: Ethereum Mainnet |br| ``2``: Morden Testnet (deprecated) |br| ``3``: Ropsten Testnet |br| ``4``: Rinkeby Testnet |br| ``42``: Kovan Testnet |br| + - The current network id. One of |br| ``1``: Ethereum Mainnet |br| ``3``: Ropsten Testnet |br| ``4``: Rinkeby Testnet |br| ``42``: Kovan Testnet |br| -------------- @@ -3078,396 +3078,3 @@ Stores binary data in the local database. - ``true`` if the value was stored, ``false`` otherwise -------------- - -shh_post --------- - -Sends a whisper message. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``OBJECT`` - - An object of type Post - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_post","params":[{"from":"0xc931d93e97ab07fe42d923478ba2465f2..","topics":["0x68656c6c6f20776f726c64"],"payload":"0x68656c6c6f20776f726c64","ttl":"0x64","priority":"0x64"}],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``BOOLEAN`` - - ``true`` if the message was send, ``false`` otherwise - --------------- - -shh_version ------------ - -Returns the current whisper protocol version. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``NONE`` - - - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_version","params":[],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``STRING`` - - The current whisper protocol version - --------------- - -shh_newIdentity ---------------- - -Creates new whisper identity in the client. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``NONE`` - - - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_newIdentity","params":[],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``DATA, 60 BYTES`` - - The address of the new identiy - --------------- - -shh_hasIdentity ---------------- - -Checks if the client hold the private keys for a given identity. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``DATA, 60 BYTES`` - - The identity address to check - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_hasIdentity","params":["0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1"],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``BOOLEAN`` - - ``true`` if the client holds the privatekey for that identity, ``false`` otherwise - --------------- - -shh_newGroup ------------- - -Create a new group. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``NONE`` - - - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_newGroup","params":[],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``DATA, 60 BYTES`` - - The address of the new group - --------------- - -shh_addToGroup --------------- - -Add to a group. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``DATA, 60 BYTES`` - - The identity address to add to a group - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_addToGroup","params":["0x04f96a5e25610293e42a73908e93ccc8c4d4dc0edcfa9fa872f50cb214e08ebf61a03e245533f97284d442460f2998cd41858798ddfd4d661997d3940272b717b1"],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``BOOLEAN`` - - ``true`` if the identity was successfully added to the group, ``false`` otherwise - --------------- - -shh_newFilter -------------- - -Creates filter to notify, when client receives whisper message matching the filter options. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``OBJECT`` - - An object of type Filter - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_newFilter","params":[{"topics":["0x12341234bf4b564f"],"to":"0x2341234bf4b2341234bf4b564f..."}],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``QUANTITY`` - - The newly created filter id - --------------- - -shh_uninstallFilter -------------------- - -Uninstalls a filter with given id. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``QUANTITY`` - - The filter id - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_uninstallFilter","params":["0x7"],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``BOOLEAN`` - - ``true`` if the filter was successfully uninstalled, ``false`` otherwise - --------------- - -shh_getFilterChanges --------------------- - -Polling method for whisper filters. Returns new messages since the last call of this method. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``QUANTITY`` - - The filter id - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_getFilterChanges","params":["0x7"],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -Array - An array of type Message received since last poll - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``ARRAY`` - - An array of type Message received since last poll - --------------- - -shh_getMessages ---------------- - -Get all messages matching a filter. Unlike ``shh_getFilterChanges`` this returns all messages. - -.. warning:: - This function has been deprecated. - -**Parameters** - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``QUANTITY`` - - The filter id - - -**Example** - -:: - - curl -s --data '{"jsonrpc":"2.0","method":"shh_getMessages","params":["0x7"],"id":"1"}' -H "Content-Type: application/json" -X POST http://localhost:8545 - -**Returns** - -Array - An array of type Message received since last poll - -.. list-table:: - :widths: 25 75 - :header-rows: 1 - - * - Type - - Description - * - ``ARRAY`` - - An array of type Message received since last poll - diff --git a/docs/readthedocs/source/rpc/tutorial.rst b/docs/readthedocs/source/rpc/tutorial.rst index 76000f363b6..75f78f28a59 100644 --- a/docs/readthedocs/source/rpc/tutorial.rst +++ b/docs/readthedocs/source/rpc/tutorial.rst @@ -14,30 +14,38 @@ our daemon will only contain one method: `myNamespace_getBlockNumberByHash` whic import ( "context" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/ethdb" ) - // API - implementation of ExampleApi type API struct { - kv ethdb.RwKV - db ethdb.Getter + db kv.RoDB } type ExampleAPI interface { GetBlockNumberByHash(ctx context.Context, hash common.Hash) (uint64, error) } - func NewAPI(kv ethdb.RwKV, db ethdb.Getter) *API { - return &API{kv: kv, db: db} + func NewAPI(db kv.RoDB) *API { + return &API{db} } func (api *API) GetBlockNumberByHash(ctx context.Context, hash common.Hash) (uint64, error) { - return rawdb.ReadBlockByHash(api.db, hash).NumberU64(), nil + tx, err := api.db.BeginRo(ctx) + if err != nil { + return 0, err + } + defer tx.Rollback() + + block, err := rawdb.ReadBlockByHash(tx, hash) + if err != nil { + return 0, err + } + return block.NumberU64(), nil } -The type `Api` is the type that is going to contain the methods for our custom daemon. This type has two members: `kv` and `db` which are objects used to interact with the Erigon node remotely. they behave like normal db objects and can be used alongside with the rawdb package. +The type `Api` is the type that is going to contain the methods for our custom daemon. This type has one member: `db` object used to interact with the Erigon node remotely. Member `db` behave like normal db object and can be used alongside with the rawdb package. In our example we are making an rpcdaemon call that by receiving a certain block hash, it give the block number associated as an output. this is all done in `GetBlockNumberByHash`. @@ -48,42 +56,42 @@ Now we are going to make our `main.go` where we are going to serve the api we ma package main import ( - "context" "os" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/log/v3" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/log/v3" "github.com/spf13/cobra" ) func main() { cmd, cfg := cli.RootCommand() + rootCtx, rootCancel := utils.RootContext() cmd.RunE = func(cmd *cobra.Command, args []string) error { - db, backend, err := cli.OpenDB(*cfg) + logger := log.New() + db, _, _, _, err := cli.RemoteServices(*cfg, logger, rootCancel) if err != nil { - log.Error("Could not connect to remoteDb", "error", err) + log.Error("Could not connect to DB", "error", err) return nil } + defer db.Close() - apiList := APIList(db, backend, cfg) - return cli.StartRpcServer(cmd.Context(), *cfg, apiList) + if err := cli.StartRpcServer(cmd.Context(), *cfg, APIList(db)); err != nil { + log.Error(err.Error()) + return nil + } + return nil } - - if err := cmd.ExecuteContext(utils.RootContext()); err != nil { + if err := cmd.ExecuteContext(rootCtx); err != nil { log.Error(err.Error()) os.Exit(1) } } - func APIList(kv ethdb.RwKV, eth ethdb.Backend, cfg *cli.Flags) []rpc.API { - dbReader := ethdb.NewObjectDatabase(kv) - api := NewAPI(kv, dbReader) - + func APIList(db kv.RoDB) []rpc.API { + api := NewAPI(db) customAPIList := []rpc.API{ { Namespace: "myNamespace", @@ -92,21 +100,19 @@ Now we are going to make our `main.go` where we are going to serve the api we ma Version: "1.0", }, } - - // Add default Erigon api's - return commands.APIList(kv, eth, *cfg, customAPIList) + return customAPIList } -In the main we are just running our rpcdaemon as we defined it in `APIList`, in fact in `APIList` we are configuring our custom rpcdaemon to serve the ExampleAPI's mathods on namespace `myNamespace` meaning that in order to call GetBlockNumberByHash via json rpc we have to call method `myNamespace_getBlockNumberByHash`. +In the main we are just running our rpcdaemon as we defined it in `APIList`, in fact in `APIList` we are configuring our custom rpcdaemon to serve the ExampleAPI's methods on namespace `myNamespace` meaning that in order to call GetBlockNumberByHash via json rpc we have to call method `myNamespace_getBlockNumberByHash`. Let's now try it: .. code-block:: sh $ go build - $ ./hello-tg-daemon --http.api=myNamespace # the flag enables our namespace. + $ ./hello-erigon-daemon --http.api=myNamespace # the flag enables our namespace. -**Note: Remember to run Erigon with --private.api.addr=localhost:9090** +**Note: Remember to run it with --private.api.addr=localhost:9090 and/or --datadir ** now it should be all set and we can test it with: @@ -116,4 +122,4 @@ now it should be all set and we can test it with: another example of custom daemon can be found at https://github.com/torquem-ch/project-1/blob/master/api.go. -Happy Building ~~~. \ No newline at end of file +Happy Building ~~~. diff --git a/docs/regular-hash.png b/docs/regular-hash.png new file mode 100644 index 00000000000..fc8f4f049f6 Binary files /dev/null and b/docs/regular-hash.png differ diff --git a/docs/state_composition.png b/docs/state_composition.png new file mode 100644 index 00000000000..cee02d0bf0e Binary files /dev/null and b/docs/state_composition.png differ diff --git a/eth/api.go b/eth/api.go index fbd0c135408..604f7bea34c 100644 --- a/eth/api.go +++ b/eth/api.go @@ -15,6 +15,3 @@ // along with the go-ethereum library. If not, see . package eth - -// AccountRangeMaxResults is the maximum number of results to be returned per call -const AccountRangeMaxResults = 256 diff --git a/eth/api_backend.go b/eth/api_backend.go index 9ee6f233a29..d1c055c8de3 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -191,7 +191,7 @@ func (b *EthAPIBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*typ } receipts, err := b.GetReceipts(ctx, hash) if err != nil { - return nil, fmt.Errorf("getReceipt error: %v", err) + return nil, fmt.Errorf("getReceipt error: %w", err) } if receipts == nil { return nil, nil diff --git a/eth/backend.go b/eth/backend.go index e80649c6c60..31179b946cd 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -19,29 +19,49 @@ package eth import ( "context" - "crypto/tls" - "crypto/x509" "errors" "fmt" - "io/ioutil" "math/big" "os" - "path" - "reflect" + "path/filepath" + "sort" "strconv" "sync" "time" + "github.com/ledgerwatch/erigon/eth/ethconsensusconfig" + "github.com/ledgerwatch/erigon/turbo/services" + "google.golang.org/protobuf/types/known/emptypb" + "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/direct" + "github.com/ledgerwatch/erigon-lib/etl" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" + txpool_proto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" + prototypes "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/sentry/download" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon-lib/kv/remotedbserver" + txpool2 "github.com/ledgerwatch/erigon-lib/txpool" + "github.com/ledgerwatch/erigon-lib/txpool/txpooluitl" + types2 "github.com/ledgerwatch/erigon-lib/types" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader" + "github.com/ledgerwatch/erigon/cmd/downloader/downloadergrpc" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/commands" + "github.com/ledgerwatch/erigon/cmd/sentry/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/bor" "github.com/ledgerwatch/erigon/consensus/clique" "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/consensus/parlia" + "github.com/ledgerwatch/erigon/consensus/serenity" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" @@ -49,23 +69,20 @@ import ( "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/ethconfig" "github.com/ledgerwatch/erigon/eth/ethutils" - "github.com/ledgerwatch/erigon/eth/fetcher" "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb/privateapi" "github.com/ledgerwatch/erigon/ethdb/prune" - remotedbserver2 "github.com/ledgerwatch/erigon/ethdb/remotedbserver" + "github.com/ledgerwatch/erigon/ethstats" "github.com/ledgerwatch/erigon/node" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rpc" - "github.com/ledgerwatch/erigon/turbo/remote" "github.com/ledgerwatch/erigon/turbo/shards" "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" stages2 "github.com/ledgerwatch/erigon/turbo/stages" - "github.com/ledgerwatch/erigon/turbo/stages/txpropagate" - "github.com/ledgerwatch/erigon/turbo/txpool" "github.com/ledgerwatch/log/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials" @@ -78,13 +95,10 @@ type Config = ethconfig.Config // Ethereum implements the Ethereum full node service. type Ethereum struct { config *ethconfig.Config - logger log.Logger - - // Handlers - txPool *core.TxPool + log log.Logger // DB interfaces - chainKV kv.RwDB + chainDB kv.RwDB privateAPI *grpc.Server engine consensus.Engine @@ -94,8 +108,6 @@ type Ethereum struct { networkID uint64 - torrentClient *snapshotsync.Client - lock sync.RWMutex // Protects the variadic fields (e.g. gas price and etherbase) chainConfig *params.ChainConfig genesisHash common.Hash @@ -105,18 +117,29 @@ type Ethereum struct { minedBlocks chan *types.Block // downloader fields - downloadCtx context.Context - downloadCancel context.CancelFunc - downloadServer *download.ControlServerImpl - sentryServers []*download.SentryServerImpl - txPoolP2PServer *txpool.P2PServer - sentries []remote.SentryClient - stagedSync *stagedsync.Sync + sentryCtx context.Context + sentryCancel context.CancelFunc + sentriesClient *sentry.MultiClient + sentryServers []*sentry.GrpcServer + + stagedSync *stagedsync.Sync + + downloaderClient proto_downloader.DownloaderClient notifications *stagedsync.Notifications waitForStageLoopStop chan struct{} waitForMiningStop chan struct{} + + txPool2DB kv.RwDB + txPool2 *txpool2.TxPool + newTxs2 chan types2.Hashes + txPool2Fetch *txpool2.Fetch + txPool2Send *txpool2.Send + txPool2GrpcServer txpool_proto.TxpoolServer + notifyMiningAboutNewTxs chan struct{} + + downloader *downloader.Downloader } // New creates a new Ethereum object (including the @@ -127,7 +150,7 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere config.Miner.GasPrice = new(big.Int).Set(ethconfig.Defaults.Miner.GasPrice) } - tmpdir := path.Join(stack.Config().DataDir, etl.TmpDirName) + tmpdir := filepath.Join(stack.Config().DataDir, etl.TmpDirName) if err := os.RemoveAll(tmpdir); err != nil { // clean it on startup return nil, fmt.Errorf("clean tmp dir: %s, %w", tmpdir, err) } @@ -138,68 +161,118 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere return nil, err } - var torrentClient *snapshotsync.Client - config.Snapshot.Dir = stack.Config().ResolvePath("snapshots") - if config.Snapshot.Enabled { - var peerID string - if err = chainKv.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, []byte(kv.BittorrentPeerID)) - if err != nil { - return err - } - peerID = string(v) - return nil - }); err != nil { - log.Error("Get bittorrent peer", "err", err) - } - torrentClient, err = snapshotsync.New(config.Snapshot.Dir, config.Snapshot.Seeding, peerID) + // Check if we have an already initialized chain and fall back to + // that if so. Otherwise we need to generate a new genesis spec. + if err := chainKv.View(context.Background(), func(tx kv.Tx) error { + h, err := rawdb.ReadCanonicalHash(tx, 0) if err != nil { - return nil, err + panic(err) } - if len(peerID) == 0 { - log.Info("Generate new bittorent peerID", "id", common.Bytes2Hex(torrentClient.PeerID())) - if err = chainKv.Update(context.Background(), func(tx kv.RwTx) error { - return torrentClient.SavePeerID(tx) - }); err != nil { - log.Error("Bittorrent peerID haven't saved", "err", err) - } - } - - chainKv, err = snapshotsync.WrapSnapshots(chainKv, config.Snapshot.Dir) - if err != nil { - return nil, err - } - err = snapshotsync.SnapshotSeeding(chainKv, torrentClient, "headers", config.Snapshot.Dir) - if err != nil { - return nil, err + if h != (common.Hash{}) { + config.Genesis = nil // fallback to db content } + return nil + }); err != nil { + panic(err) } - chainConfig, genesis, genesisErr := core.CommitGenesisBlock(chainKv, config.Genesis) + chainConfig, genesis, genesisErr := core.CommitGenesisBlockWithOverride(chainKv, config.Genesis, config.OverrideMergeForkBlock, config.OverrideTerminalTotalDifficulty) if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok { return nil, genesisErr } - log.Info("Initialised chain configuration", "config", chainConfig) + config.Snapshot.Enabled = ethconfig.UseSnapshotsByChainName(chainConfig.ChainName) && config.Sync.UseSnapshots + + types.SetHeaderSealFlag(chainConfig.IsHeaderWithSeal()) + log.Info("Initialised chain configuration", "config", chainConfig, "genesis", genesis.Hash()) + + // Apply special hacks for BSC params + if chainConfig.Parlia != nil { + params.ApplyBinanceSmartChainParams() + } + + ctx, ctxCancel := context.WithCancel(context.Background()) + + // kv_remote architecture does blocks on stream.Send - means current architecture require unlimited amount of txs to provide good throughput + //limiter := make(chan struct{}, kv.ReadersLimit) + kvRPC := remotedbserver.NewKvServer(ctx, chainKv) // mdbx.NewMDBX(logger).RoTxsLimiter(limiter).Readonly().Path(filepath.Join(stack.Config().DataDir, "chaindata")).Label(kv.ChainDB).MustOpen()) backend := &Ethereum{ + sentryCtx: ctx, + sentryCancel: ctxCancel, config: config, - logger: logger, - chainKV: chainKv, + log: logger, + chainDB: chainKv, networkID: config.NetworkID, etherbase: config.Miner.Etherbase, - torrentClient: torrentClient, chainConfig: chainConfig, genesisHash: genesis.Hash(), waitForStageLoopStop: make(chan struct{}), waitForMiningStop: make(chan struct{}), - sentries: []remote.SentryClient{}, notifications: &stagedsync.Notifications{ - Events: privateapi.NewEvents(), - Accumulator: &shards.Accumulator{}, + Events: privateapi.NewEvents(), + Accumulator: shards.NewAccumulator(chainConfig), + StateChangesConsumer: kvRPC, }, } backend.gasPrice, _ = uint256.FromBig(config.Miner.GasPrice) + var sentries []direct.SentryClient + if len(stack.Config().P2P.SentryAddr) > 0 { + for _, addr := range stack.Config().P2P.SentryAddr { + sentryClient, err := sentry.GrpcClient(backend.sentryCtx, addr) + if err != nil { + return nil, err + } + sentries = append(sentries, sentryClient) + } + } else { + var readNodeInfo = func() *eth.NodeInfo { + var res *eth.NodeInfo + _ = backend.chainDB.View(context.Background(), func(tx kv.Tx) error { + res = eth.ReadNodeInfo(tx, backend.chainConfig, backend.genesisHash, backend.networkID) + return nil + }) + + return res + } + + d66, err := setupDiscovery(backend.config.EthDiscoveryURLs) + if err != nil { + return nil, err + } + + cfg66 := stack.Config().P2P + cfg66.NodeDatabase = filepath.Join(stack.Config().DataDir, "nodes", "eth66") + server66 := sentry.NewGrpcServer(backend.sentryCtx, d66, readNodeInfo, &cfg66, eth.ETH66) + backend.sentryServers = append(backend.sentryServers, server66) + sentries = []direct.SentryClient{direct.NewSentryClientDirect(eth.ETH66, server66)} + + go func() { + logEvery := time.NewTicker(120 * time.Second) + defer logEvery.Stop() + + var logItems []interface{} + + for { + select { + case <-backend.sentryCtx.Done(): + return + case <-logEvery.C: + logItems = logItems[:0] + for _, srv := range backend.sentryServers { + logItems = append(logItems, eth.ProtocolToString[srv.Protocol.Version], strconv.Itoa(srv.SimplePeerCount())) + } + log.Info("[p2p] GoodPeers", logItems...) + } + } + }() + } + + blockReader, allSnapshots, err := backend.setUpBlockReader(ctx, config.Snapshot.Enabled, config, stack) + if err != nil { + return nil, err + } + var consensusConfig interface{} if chainConfig.Clique != nil { @@ -207,62 +280,84 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere } else if chainConfig.Aura != nil { config.Aura.Etherbase = config.Miner.Etherbase consensusConfig = &config.Aura + } else if chainConfig.Parlia != nil { + consensusConfig = &config.Parlia + } else if chainConfig.Bor != nil { + consensusConfig = &config.Bor } else { consensusConfig = &config.Ethash } - backend.engine = ethconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify) + backend.engine = ethconsensusconfig.CreateConsensusEngine(chainConfig, logger, consensusConfig, config.Miner.Notify, config.Miner.Noverify, config.HeimdallURL, config.WithoutHeimdall, stack.DataDir(), allSnapshots) log.Info("Initialising Ethereum protocol", "network", config.NetworkID) + log.Info("Using snapshots", "on", config.Snapshot.Enabled) if err := chainKv.Update(context.Background(), func(tx kv.RwTx) error { - if err := prune.SetIfNotExist(tx, config.Prune); err != nil { + if err = stagedsync.UpdateMetrics(tx); err != nil { return err } - if err = stagedsync.UpdateMetrics(tx); err != nil { + config.Prune, err = prune.EnsureNotChanged(tx, config.Prune) + if err != nil { return err } - - pm, err := prune.Get(tx) + isCorrectSync, useSnapshots, err := snap.EnsureNotChanged(tx, config.Snapshot) if err != nil { return err } - if config.Prune.Initialised { - // If storage mode is not explicitly specified, we take whatever is in the database - if !reflect.DeepEqual(pm, config.Prune) { - return errors.New("not allowed change of --prune flag, last time you used: " + pm.String()) + // if we are in the incorrect syncmode then we change it to the appropriate one + if !isCorrectSync { + log.Warn("Incorrect snapshot enablement", "got", config.Sync.UseSnapshots, "change_to", useSnapshots) + config.Sync.UseSnapshots = useSnapshots + config.Snapshot.Enabled = ethconfig.UseSnapshotsByChainName(chainConfig.ChainName) && useSnapshots + blockReader, allSnapshots, err = backend.setUpBlockReader(ctx, config.Snapshot.Enabled, config, stack) + if err != nil { + return err } - } else { - config.Prune = pm } - log.Info("Effective", "prune", config.Prune.String()) + log.Info("Effective", "prune_flags", config.Prune.String(), "snapshot_flags", config.Snapshot.String()) return nil }); err != nil { return nil, err } - if config.TxPool.Journal != "" { - config.TxPool.Journal = stack.ResolvePath(config.TxPool.Journal) + backend.sentriesClient, err = sentry.NewMultiClient( + chainKv, + stack.Config().NodeName(), + chainConfig, + genesis.Hash(), + backend.engine, + backend.config.NetworkID, + sentries, + config.Sync, + blockReader, + stack.Config().SentryLogPeerInfo, + ) + if err != nil { + return nil, err } - backend.txPool = core.NewTxPool(config.TxPool, chainConfig, chainKv) - - // setting notifier to support streaming events to rpc daemon - var mg *snapshotsync.SnapshotMigrator - if config.Snapshot.Enabled { - currentSnapshotBlock, currentInfohash, err := snapshotsync.GetSnapshotInfo(chainKv) + var miningRPC txpool_proto.MiningServer + if config.DeprecatedTxPool.Disable { + backend.txPool2GrpcServer = &txpool2.GrpcDisabled{} + } else { + //cacheConfig := kvcache.DefaultCoherentCacheConfig + //cacheConfig.MetricsLabel = "txpool" + + stateDiffClient := direct.NewStateDiffClientDirect(kvRPC) + backend.newTxs2 = make(chan types2.Hashes, 1024) + //defer close(newTxs) + backend.txPool2DB, backend.txPool2, backend.txPool2Fetch, backend.txPool2Send, backend.txPool2GrpcServer, err = txpooluitl.AllComponents( + ctx, config.TxPool, kvcache.NewDummy(), backend.newTxs2, backend.chainDB, backend.sentriesClient.Sentries(), stateDiffClient, + ) if err != nil { return nil, err } - mg = snapshotsync.NewMigrator(config.Snapshot.Dir, currentSnapshotBlock, currentInfohash) - err = mg.RemoveNonCurrentSnapshots() - if err != nil { - log.Error("Remove non current snapshot", "err", err) - } } + backend.notifyMiningAboutNewTxs = make(chan struct{}, 1) backend.quitMining = make(chan struct{}) backend.miningSealingQuit = make(chan struct{}) backend.pendingBlocks = make(chan *types.Block, 1) @@ -272,206 +367,108 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere backend.pendingBlocks = miner.PendingResultCh backend.minedBlocks = miner.MiningResultCh + // proof-of-work mining mining := stagedsync.New( - stagedsync.MiningStages(backend.downloadCtx, - stagedsync.StageMiningCreateBlockCfg(backend.chainKV, miner, *backend.chainConfig, backend.engine, backend.txPool, tmpdir), - stagedsync.StageMiningExecCfg(backend.chainKV, miner, backend.notifications.Events, *backend.chainConfig, backend.engine, &vm.Config{}, tmpdir), - stagedsync.StageHashStateCfg(backend.chainKV, tmpdir), - stagedsync.StageTrieCfg(backend.chainKV, false, true, tmpdir), - stagedsync.StageMiningFinishCfg(backend.chainKV, *backend.chainConfig, backend.engine, miner, backend.miningSealingQuit), + stagedsync.MiningStages(backend.sentryCtx, + stagedsync.StageMiningCreateBlockCfg(backend.chainDB, miner, *backend.chainConfig, backend.engine, backend.txPool2, backend.txPool2DB, nil, tmpdir), + stagedsync.StageMiningExecCfg(backend.chainDB, miner, backend.notifications.Events, *backend.chainConfig, backend.engine, &vm.Config{}, tmpdir), + stagedsync.StageHashStateCfg(backend.chainDB, tmpdir), + stagedsync.StageTrieCfg(backend.chainDB, false, true, tmpdir, blockReader), + stagedsync.StageMiningFinishCfg(backend.chainDB, *backend.chainConfig, backend.engine, miner, backend.miningSealingQuit), ), stagedsync.MiningUnwindOrder, stagedsync.MiningPruneOrder) var ethashApi *ethash.API if casted, ok := backend.engine.(*ethash.Ethash); ok { ethashApi = casted.APIs(nil)[1].Service.(*ethash.API) } - - kvRPC := remotedbserver2.NewKvServer(backend.chainKV) - ethBackendRPC := privateapi.NewEthBackendServer(backend, backend.notifications.Events) - txPoolRPC := privateapi.NewTxPoolServer(context.Background(), backend.txPool) - miningRPC := privateapi.NewMiningServer(context.Background(), backend, ethashApi) - - if stack.Config().PrivateApiAddr != "" { - - if stack.Config().TLSConnection { - // load peer cert/key, ca cert - var creds credentials.TransportCredentials - - if stack.Config().TLSCACert != "" { - var peerCert tls.Certificate - var caCert []byte - peerCert, err = tls.LoadX509KeyPair(stack.Config().TLSCertFile, stack.Config().TLSKeyFile) - if err != nil { - log.Error("load peer cert/key error:%v", err) - return nil, err - } - caCert, err = ioutil.ReadFile(stack.Config().TLSCACert) - if err != nil { - log.Error("read ca cert file error:%v", err) - return nil, err - } - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM(caCert) - creds = credentials.NewTLS(&tls.Config{ - Certificates: []tls.Certificate{peerCert}, - ClientCAs: caCertPool, - ClientAuth: tls.RequireAndVerifyClientCert, - MinVersion: tls.VersionTLS12, - }) - } else { - creds, err = credentials.NewServerTLSFromFile(stack.Config().TLSCertFile, stack.Config().TLSKeyFile) - } - - if err != nil { - return nil, err - } - backend.privateAPI, err = privateapi.StartGrpc( - kvRPC, - ethBackendRPC, - txPoolRPC, - miningRPC, - stack.Config().PrivateApiAddr, - stack.Config().PrivateApiRateLimit, - &creds) - if err != nil { - return nil, err - } - } else { - backend.privateAPI, err = privateapi.StartGrpc( - kvRPC, - ethBackendRPC, - txPoolRPC, - miningRPC, - stack.Config().PrivateApiAddr, - stack.Config().PrivateApiRateLimit, - nil) - if err != nil { - return nil, err - } + // proof-of-stake mining + assembleBlockPOS := func(param *core.BlockProposerParametersPOS) (*types.Block, error) { + miningStatePos := stagedsync.NewMiningState(&config.Miner) + miningStatePos.MiningConfig.Etherbase = param.SuggestedFeeRecipient + proposingSync := stagedsync.New( + stagedsync.MiningStages(backend.sentryCtx, + stagedsync.StageMiningCreateBlockCfg(backend.chainDB, miningStatePos, *backend.chainConfig, backend.engine, backend.txPool2, backend.txPool2DB, param, tmpdir), + stagedsync.StageMiningExecCfg(backend.chainDB, miningStatePos, backend.notifications.Events, *backend.chainConfig, backend.engine, &vm.Config{}, tmpdir), + stagedsync.StageHashStateCfg(backend.chainDB, tmpdir), + stagedsync.StageTrieCfg(backend.chainDB, false, true, tmpdir, blockReader), + stagedsync.StageMiningFinishCfg(backend.chainDB, *backend.chainConfig, backend.engine, miningStatePos, backend.miningSealingQuit), + ), stagedsync.MiningUnwindOrder, stagedsync.MiningPruneOrder) + // We start the mining step + if err := stages2.MiningStep(ctx, backend.chainDB, proposingSync); err != nil { + return nil, err } + block := <-miningStatePos.MiningResultPOSCh + return block, nil } - backend.downloadCtx, backend.downloadCancel = context.WithCancel(context.Background()) - if len(stack.Config().P2P.SentryAddr) > 0 { - for _, addr := range stack.Config().P2P.SentryAddr { - sentry, err := download.GrpcSentryClient(backend.downloadCtx, addr) + // Initialize ethbackend + ethBackendRPC := privateapi.NewEthBackendServer(ctx, backend, backend.chainDB, backend.notifications.Events, + blockReader, chainConfig, backend.sentriesClient.Hd.BeaconRequestList, backend.sentriesClient.Hd.PayloadStatusCh, + assembleBlockPOS, config.Miner.EnabledPOS) + miningRPC = privateapi.NewMiningServer(ctx, backend, ethashApi) + // If we enabled the proposer flag we initiates the block proposing thread + if config.Miner.EnabledPOS && chainConfig.TerminalTotalDifficulty != nil { + ethBackendRPC.StartProposer() + } + if stack.Config().PrivateApiAddr != "" { + var creds credentials.TransportCredentials + if stack.Config().TLSConnection { + creds, err = grpcutil.TLS(stack.Config().TLSCACert, stack.Config().TLSCertFile, stack.Config().TLSKeyFile) if err != nil { return nil, err } - backend.sentries = append(backend.sentries, sentry) - } - } else { - var readNodeInfo = func() *eth.NodeInfo { - var res *eth.NodeInfo - _ = backend.chainKV.View(context.Background(), func(tx kv.Tx) error { - res = eth.ReadNodeInfo(tx, backend.chainConfig, backend.genesisHash, backend.networkID) - return nil - }) - - return res } - - d66, err := setupDiscovery(backend.config.EthDiscoveryURLs) + backend.privateAPI, err = privateapi.StartGrpc( + kvRPC, + ethBackendRPC, + backend.txPool2GrpcServer, + miningRPC, + stack.Config().PrivateApiAddr, + stack.Config().PrivateApiRateLimit, + creds, + stack.Config().HealthCheck) if err != nil { - return nil, err + return nil, fmt.Errorf("private api: %w", err) } + } - cfg66 := stack.Config().P2P - cfg66.NodeDatabase = path.Join(stack.Config().DataDir, "nodes", "eth66") - server66 := download.NewSentryServer(backend.downloadCtx, d66, readNodeInfo, &cfg66, eth.ETH66) - backend.sentryServers = append(backend.sentryServers, server66) - backend.sentries = []remote.SentryClient{remote.NewSentryClientDirect(eth.ETH66, server66)} - cfg65 := stack.Config().P2P - cfg65.NodeDatabase = path.Join(stack.Config().DataDir, "nodes", "eth65") - d65, err := setupDiscovery(backend.config.EthDiscoveryURLs) - if err != nil { - return nil, err + if !config.DeprecatedTxPool.Disable { + backend.txPool2Fetch.ConnectCore() + backend.txPool2Fetch.ConnectSentries() + var newTxsBroadcaster *txpool2.NewSlotsStreams + if casted, ok := backend.txPool2GrpcServer.(*txpool2.GrpcServer); ok { + newTxsBroadcaster = casted.NewSlotsStreams } - cfg65.ListenAddr = cfg65.ListenAddr65 - server65 := download.NewSentryServer(backend.downloadCtx, d65, readNodeInfo, &cfg65, eth.ETH65) - backend.sentryServers = append(backend.sentryServers, server65) - backend.sentries = append(backend.sentries, remote.NewSentryClientDirect(eth.ETH65, server65)) - go func() { - logEvery := time.NewTicker(120 * time.Second) - defer logEvery.Stop() - - var logItems []interface{} - - for { + go txpool2.MainLoop(backend.sentryCtx, + backend.txPool2DB, backend.chainDB, + backend.txPool2, backend.newTxs2, backend.txPool2Send, newTxsBroadcaster, + func() { select { - case <-backend.downloadCtx.Done(): - return - case <-logEvery.C: - logItems = logItems[:0] - for _, srv := range backend.sentryServers { - logItems = append(logItems, eth.ProtocolToString[srv.Protocol.Version], strconv.Itoa(srv.SimplePeerCount())) - } - log.Info("[p2p] GoodPeers", logItems...) + case backend.notifyMiningAboutNewTxs <- struct{}{}: + default: } - } - }() - } - backend.downloadServer, err = download.NewControlServer(chainKv, stack.Config().NodeName(), chainConfig, genesis.Hash(), backend.engine, backend.config.NetworkID, backend.sentries, config.BlockDownloaderWindow) - if err != nil { - return nil, err - } - backend.txPoolP2PServer, err = txpool.NewP2PServer(backend.downloadCtx, backend.sentries, backend.txPool) - if err != nil { - return nil, err - } - - fetchTx := func(peerID string, hashes []common.Hash) error { - backend.txPoolP2PServer.SendTxsRequest(context.TODO(), peerID, hashes) - return nil - } - - backend.txPoolP2PServer.TxFetcher = fetcher.NewTxFetcher(backend.txPool.Has, backend.txPool.AddRemotes, fetchTx) - config.BodyDownloadTimeoutSeconds = 30 - - backend.stagedSync, err = stages2.NewStagedSync( - backend.downloadCtx, - backend.logger, - backend.chainKV, - stack.Config().P2P, - *config, - backend.downloadServer, - tmpdir, - backend.txPool, - backend.txPoolP2PServer, - - torrentClient, mg, backend.notifications.Accumulator, - ) - if err != nil { - return nil, err - } - if config.BadBlock != 0 { - var badHash common.Hash - if err = chainKv.View(context.Background(), func(tx kv.Tx) error { - var hErr error - badHash, hErr = rawdb.ReadCanonicalHash(tx, config.BadBlock) - return hErr - }); err != nil { - return nil, err - } - backend.stagedSync.UnwindTo(config.BadBlock-1, badHash) + }) } - - go txpropagate.BroadcastPendingTxsToNetwork(backend.downloadCtx, backend.txPool, backend.txPoolP2PServer.RecentPeers, backend.downloadServer) - go func() { defer debug.LogPanic() for { select { case b := <-backend.minedBlocks: //p2p - //backend.downloadServer.BroadcastNewBlock(context.Background(), b, b.Difficulty()) + //backend.sentriesClient.BroadcastNewBlock(context.Background(), b, b.Difficulty()) //rpcdaemon - if err := miningRPC.BroadcastMinedBlock(b); err != nil { + if err := miningRPC.(*privateapi.MiningServer).BroadcastMinedBlock(b); err != nil { log.Error("txpool rpc mined block broadcast", "err", err) } + if err := backend.sentriesClient.Hd.AddMinedHeader(b.Header()); err != nil { + log.Error("add mined block to header downloader", "err", err) + } + if err := backend.sentriesClient.Bd.AddMinedBlock(b); err != nil { + log.Error("add mined block to body downloader", "err", err) + } case b := <-backend.pendingBlocks: - if err := miningRPC.BroadcastPendingBlock(b); err != nil { + if err := miningRPC.(*privateapi.MiningServer).BroadcastPendingBlock(b); err != nil { log.Error("txpool rpc pending block broadcast", "err", err) } case <-backend.quitMining: @@ -480,16 +477,75 @@ func New(stack *node.Node, config *ethconfig.Config, logger log.Logger) (*Ethere } }() - if err := backend.StartMining(context.Background(), backend.chainKV, mining, backend.config.Miner, backend.gasPrice, backend.quitMining); err != nil { + if err := backend.StartMining(context.Background(), backend.chainDB, mining, backend.config.Miner, backend.gasPrice, backend.quitMining); err != nil { return nil, err } + var headCh chan *types.Block + if config.Ethstats != "" { + headCh = make(chan *types.Block, 1) + } + + backend.stagedSync, err = stages2.NewStagedSync(backend.sentryCtx, backend.log, backend.chainDB, stack.Config().P2P, *config, backend.sentriesClient, tmpdir, backend.notifications, backend.downloaderClient, allSnapshots, headCh) + if err != nil { + return nil, err + } + + backend.sentriesClient.Hd.StartPoSDownloader(backend.sentryCtx, backend.sentriesClient.SendHeaderRequest, backend.sentriesClient.Penalize) + + emptyBadHash := config.BadBlockHash == common.Hash{} + if !emptyBadHash { + var badBlockHeader *types.Header + if err = chainKv.View(context.Background(), func(tx kv.Tx) error { + header, hErr := rawdb.ReadHeaderByHash(tx, config.BadBlockHash) + badBlockHeader = header + return hErr + }); err != nil { + return nil, err + } + + if badBlockHeader != nil { + unwindPoint := badBlockHeader.Number.Uint64() - 1 + backend.stagedSync.UnwindTo(unwindPoint, config.BadBlockHash) + } + } + //eth.APIBackend = &EthAPIBackend{stack.Config().ExtRPCEnabled(), stack.Config().AllowUnprotectedTxs, eth, nil} gpoParams := config.GPO if gpoParams.Default == nil { gpoParams.Default = config.Miner.GasPrice } //eth.APIBackend.gpo = gasprice.NewOracle(eth.APIBackend, gpoParams) + if config.Ethstats != "" { + if err := ethstats.New(stack, backend.sentryServers, chainKv, backend.engine, config.Ethstats, backend.networkID, ctx.Done(), headCh); err != nil { + return nil, err + } + } + // start HTTP API + httpRpcCfg := stack.Config().Http + if httpRpcCfg.Enabled { + ethRpcClient, txPoolRpcClient, miningRpcClient, starkNetRpcClient, stateCache, ff, err := cli.EmbeddedServices( + ctx, chainKv, httpRpcCfg.StateCache, blockReader, + ethBackendRPC, + backend.txPool2GrpcServer, + miningRPC, + ) + if err != nil { + return nil, err + } + + var borDb kv.RoDB + if casted, ok := backend.engine.(*bor.Bor); ok { + borDb = casted.DB + } + apiList := commands.APIList(chainKv, borDb, ethRpcClient, txPoolRpcClient, miningRpcClient, starkNetRpcClient, ff, stateCache, blockReader, httpRpcCfg) + go func() { + if err := cli.StartRpcServer(ctx, httpRpcCfg, apiList); err != nil { + log.Error(err.Error()) + return + } + }() + } // Register the backend on the node stack.RegisterAPIs(backend.APIs()) @@ -521,7 +577,7 @@ func (s *Ethereum) isLocalBlock(block *types.Block) bool { //nolint s.lock.RLock() etherbase := s.etherbase s.lock.RUnlock() - return ethutils.IsLocalBlock(s.engine, etherbase, s.config.TxPool.Locals, block.Header()) + return ethutils.IsLocalBlock(s.engine, etherbase, s.config.DeprecatedTxPool.Locals, block.Header()) } // shouldPreserve checks whether we should preserve the given block @@ -553,80 +609,111 @@ func (s *Ethereum) shouldPreserve(block *types.Block) bool { //nolint // StartMining starts the miner with the given number of CPU threads. If mining // is already running, this method adjust the number of threads allowed to use // and updates the minimum price required by the transaction pool. -func (s *Ethereum) StartMining(ctx context.Context, kv kv.RwDB, mining *stagedsync.Sync, cfg params.MiningConfig, gasPrice *uint256.Int, quitCh chan struct{}) error { +func (s *Ethereum) StartMining(ctx context.Context, db kv.RwDB, mining *stagedsync.Sync, cfg params.MiningConfig, gasPrice *uint256.Int, quitCh chan struct{}) error { if !cfg.Enabled { return nil } - s.txPool.SetGasPrice(gasPrice) - // Configure the local mining address eb, err := s.Etherbase() if err != nil { log.Error("Cannot start mining without etherbase", "err", err) - return fmt.Errorf("etherbase missing: %v", err) + return fmt.Errorf("etherbase missing: %w", err) } - if clique, ok := s.engine.(*clique.Clique); ok { + + var clq *clique.Clique + if c, ok := s.engine.(*clique.Clique); ok { + clq = c + } else if cl, ok := s.engine.(*serenity.Serenity); ok { + if c, ok := cl.InnerEngine().(*clique.Clique); ok { + clq = c + } + } + if clq != nil { if cfg.SigKey == nil { log.Error("Etherbase account unavailable locally", "err", err) - return fmt.Errorf("signer missing: %v", err) + return fmt.Errorf("signer missing: %w", err) } - clique.Authorize(eb, func(_ common.Address, mimeType string, message []byte) ([]byte, error) { - return crypto.Sign(message, cfg.SigKey) + clq.Authorize(eb, func(_ common.Address, mimeType string, message []byte) ([]byte, error) { + return crypto.Sign(crypto.Keccak256(message), cfg.SigKey) }) } - if s.chainConfig.ChainID.Uint64() != params.MainnetChainConfig.ChainID.Uint64() { - tx, err := kv.BeginRo(context.Background()) - if err != nil { - return err + var prl *parlia.Parlia + if p, ok := s.engine.(*parlia.Parlia); ok { + prl = p + } else if cl, ok := s.engine.(*serenity.Serenity); ok { + if p, ok := cl.InnerEngine().(*parlia.Parlia); ok { + prl = p } - defer tx.Rollback() - execution, _ := stages.GetStageProgress(tx, stages.Execution) - hh := rawdb.ReadCurrentHeader(tx) - tx.Rollback() - if hh != nil { - if err := s.txPool.Start(hh.GasLimit, execution); err != nil { - return err - } + } + if prl != nil { + if cfg.SigKey == nil { + log.Error("Etherbase account unavailable locally", "err", err) + return fmt.Errorf("signer missing: %w", err) } + + prl.Authorize(eb, func(validator common.Address, payload []byte, chainId *big.Int) ([]byte, error) { + return crypto.Sign(payload, cfg.SigKey) + }) } go func() { defer debug.LogPanic() defer close(s.waitForMiningStop) - newTransactions := make(chan core.NewTxsEvent, 128) - sub := s.txPool.SubscribeNewTxsEvent(newTransactions) - defer sub.Unsubscribe() - defer close(newTransactions) + + mineEvery := time.NewTicker(3 * time.Second) + defer mineEvery.Stop() var works bool var hasWork bool errc := make(chan error, 1) + tx, err := s.chainDB.BeginRo(ctx) + if err != nil { + log.Warn("mining", "err", err) + return + } + for { + mineEvery.Reset(3 * time.Second) select { - case <-newTransactions: + case <-s.notifyMiningAboutNewTxs: + hasWork = true + case <-mineEvery.C: hasWork = true case err := <-errc: works = false hasWork = false - if errors.Is(err, common.ErrStopped) { + if errors.Is(err, libcommon.ErrStopped) { return } if err != nil { log.Warn("mining", "err", err) } - case <-sub.Err(): - return case <-quitCh: return } + // Check if we transitioned and if we did halt POW mining + headNumber, err := stages.GetStageProgress(tx, stages.Headers) + if err != nil { + log.Warn("mining", "err", err) + return + } + + isTrans, err := rawdb.Transitioned(tx, headNumber, s.chainConfig.TerminalTotalDifficulty) + if err != nil { + log.Warn("mining", "err", err) + return + } + if isTrans { + return + } if !works && hasWork { works = true - go func() { errc <- stages2.MiningStep(ctx, kv, mining) }() + go func() { errc <- stages2.MiningStep(ctx, db, mining) }() } } }() @@ -636,16 +723,15 @@ func (s *Ethereum) StartMining(ctx context.Context, kv kv.RwDB, mining *stagedsy func (s *Ethereum) IsMining() bool { return s.config.Miner.Enabled } -func (s *Ethereum) TxPool() *core.TxPool { return s.txPool } -func (s *Ethereum) ChainKV() kv.RwDB { return s.chainKV } +func (s *Ethereum) ChainKV() kv.RwDB { return s.chainDB } func (s *Ethereum) NetVersion() (uint64, error) { return s.networkID, nil } func (s *Ethereum) NetPeerCount() (uint64, error) { var sentryPc uint64 = 0 log.Trace("sentry", "peer count", sentryPc) - for _, sc := range s.sentries { + for _, sc := range s.sentriesClient.Sentries() { ctx := context.Background() - reply, err := sc.PeerCount(ctx, &sentry.PeerCountRequest{}) + reply, err := sc.PeerCount(ctx, &proto_sentry.PeerCountRequest{}) if err != nil { log.Warn("sentry", "err", err) return 0, nil @@ -656,6 +742,80 @@ func (s *Ethereum) NetPeerCount() (uint64, error) { return sentryPc, nil } +func (s *Ethereum) NodesInfo(limit int) (*remote.NodesInfoReply, error) { + if limit == 0 || limit > len(s.sentriesClient.Sentries()) { + limit = len(s.sentriesClient.Sentries()) + } + + nodes := make([]*prototypes.NodeInfoReply, 0, limit) + for i := 0; i < limit; i++ { + sc := s.sentriesClient.Sentries()[i] + + nodeInfo, err := sc.NodeInfo(context.Background(), nil) + if err != nil { + log.Error("sentry nodeInfo", "err", err) + } + + nodes = append(nodes, nodeInfo) + } + + nodesInfo := &remote.NodesInfoReply{NodesInfo: nodes} + sort.Sort(nodesInfo) + + return nodesInfo, nil +} + +// sets up blockReader and client downloader +func (s *Ethereum) setUpBlockReader(ctx context.Context, isSnapshotEnabled bool, config *ethconfig.Config, stack *node.Node) (services.FullBlockReader, *snapshotsync.RoSnapshots, error) { + var err error + + if isSnapshotEnabled { + allSnapshots := snapshotsync.NewRoSnapshots(config.Snapshot, config.SnapDir) + if err = allSnapshots.Reopen(); err != nil { + return nil, nil, fmt.Errorf("[Snapshots] Reopen: %w", err) + } + blockReader := snapshotsync.NewBlockReaderWithSnapshots(allSnapshots) + + if len(stack.Config().DownloaderAddr) > 0 { + // connect to external Downloader + s.downloaderClient, err = downloadergrpc.NewClient(ctx, stack.Config().DownloaderAddr) + } else { + // start embedded Downloader + s.downloader, err = downloader.New(config.Torrent) + if err != nil { + return nil, nil, err + } + go downloader.MainLoop(ctx, s.downloader, true) + bittorrentServer, err := downloader.NewGrpcServer(s.downloader) + if err != nil { + return nil, nil, fmt.Errorf("new server: %w", err) + } + + s.downloaderClient = direct.NewDownloaderClient(bittorrentServer) + } + if err != nil { + return nil, nil, err + } + return blockReader, allSnapshots, nil + } else { + blockReader := snapshotsync.NewBlockReader() + return blockReader, nil, nil + } + +} + +func (s *Ethereum) Peers(ctx context.Context) (*remote.PeersReply, error) { + var reply remote.PeersReply + for _, sentryClient := range s.sentriesClient.Sentries() { + peers, err := sentryClient.Peers(ctx, &emptypb.Empty{}) + if err != nil { + return nil, fmt.Errorf("Ethereum backend MultiClient.Peers error: %w", err) + } + reply.Peers = append(reply.Peers, peers.Peers...) + } + return &reply, nil +} + // Protocols returns all the currently configured // network protocols to start. func (s *Ethereum) Protocols() []p2p.Protocol { @@ -669,21 +829,10 @@ func (s *Ethereum) Protocols() []p2p.Protocol { // Start implements node.Lifecycle, starting all internal goroutines needed by the // Ethereum protocol implementation. func (s *Ethereum) Start() error { - for i := range s.sentries { - go func(i int) { - download.RecvMessageLoop(s.downloadCtx, s.sentries[i], s.downloadServer, nil) - }(i) - go func(i int) { - download.RecvUploadMessageLoop(s.downloadCtx, s.sentries[i], s.downloadServer, nil) - }(i) - } - - go stages2.StageLoop( - s.downloadCtx, s.logger, s.chainKV, - s.stagedSync, s.downloadServer.Hd, - s.notifications, s.downloadServer.UpdateHead, s.waitForStageLoopStop, - s.config.SyncLoopThrottle, - ) + s.sentriesClient.StartStreamLoops(s.sentryCtx) + time.Sleep(10 * time.Millisecond) // just to reduce logs order confusion + + go stages2.StageLoop(s.sentryCtx, s.chainDB, s.stagedSync, s.sentriesClient.Hd, s.notifications, s.sentriesClient.UpdateHead, s.waitForStageLoopStop, s.config.Sync.LoopThrottle) return nil } @@ -692,13 +841,10 @@ func (s *Ethereum) Start() error { // Ethereum protocol. func (s *Ethereum) Stop() error { // Stop all the peer-related stuff first. - s.downloadCancel() - s.txPoolP2PServer.TxFetcher.Stop() - s.txPool.Stop() - if s.quitMining != nil { - close(s.quitMining) + s.sentryCancel() + if s.downloader != nil { + s.downloader.Close() } - if s.privateAPI != nil { shutdownDone := make(chan bool) go func() { @@ -711,15 +857,42 @@ func (s *Ethereum) Stop() error { case <-shutdownDone: } } + if s.quitMining != nil { + close(s.quitMining) + } //s.miner.Stop() s.engine.Close() - if s.txPool != nil { - s.txPool.Stop() - } <-s.waitForStageLoopStop if s.config.Miner.Enabled { <-s.waitForMiningStop } + for _, sentryServer := range s.sentryServers { + sentryServer.Close() + } + s.chainDB.Close() + if s.txPool2DB != nil { + s.txPool2DB.Close() + } return nil } + +func (s *Ethereum) ChainDB() kv.RwDB { + return s.chainDB +} + +func (s *Ethereum) StagedSync() *stagedsync.Sync { + return s.stagedSync +} + +func (s *Ethereum) Notifications() *stagedsync.Notifications { + return s.notifications +} + +func (s *Ethereum) SentryCtx() context.Context { + return s.sentryCtx +} + +func (s *Ethereum) SentryControlServer() *sentry.MultiClient { + return s.sentriesClient +} diff --git a/eth/calltracer/calltracer.go b/eth/calltracer/calltracer.go new file mode 100644 index 00000000000..2c697a3f2ab --- /dev/null +++ b/eth/calltracer/calltracer.go @@ -0,0 +1,121 @@ +package calltracer + +import ( + "encoding/binary" + "math/big" + "sort" + "time" + + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/log/v3" +) + +type CallTracer struct { + froms map[common.Address]struct{} + tos map[common.Address]bool // address -> isCreated + hasTEVM func(contractHash common.Hash) (bool, error) +} + +func NewCallTracer(hasTEVM func(contractHash common.Hash) (bool, error)) *CallTracer { + return &CallTracer{ + froms: make(map[common.Address]struct{}), + tos: make(map[common.Address]bool), + hasTEVM: hasTEVM, + } +} + +func (ct *CallTracer) CaptureStart(evm *vm.EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, code []byte) { + ct.froms[from] = struct{}{} + + created, ok := ct.tos[to] + if !ok { + ct.tos[to] = false + } + + if !created && create { + if len(code) > 0 && ct.hasTEVM != nil { + has, err := ct.hasTEVM(common.BytesToHash(crypto.Keccak256(code))) + if !has { + ct.tos[to] = true + } + + if err != nil { + log.Warn("while CaptureStart", "err", err) + } + } + } +} +func (ct *CallTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { +} +func (ct *CallTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} +func (ct *CallTracer) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { +} +func (ct *CallTracer) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { + ct.froms[from] = struct{}{} + ct.tos[to] = false +} +func (ct *CallTracer) CaptureAccountRead(account common.Address) error { + return nil +} +func (ct *CallTracer) CaptureAccountWrite(account common.Address) error { + return nil +} + +func (ct *CallTracer) WriteToDb(tx kv.StatelessWriteTx, block *types.Block, vmConfig vm.Config) error { + ct.tos[block.Coinbase()] = false + for _, uncle := range block.Uncles() { + ct.tos[uncle.Coinbase] = false + } + list := make(common.Addresses, len(ct.froms)+len(ct.tos)) + i := 0 + for addr := range ct.froms { + copy(list[i][:], addr[:]) + i++ + } + for addr := range ct.tos { + copy(list[i][:], addr[:]) + i++ + } + sort.Sort(list) + // List may contain duplicates + var blockNumEnc [8]byte + binary.BigEndian.PutUint64(blockNumEnc[:], block.Number().Uint64()) + var prev common.Address + var created bool + for j, addr := range list { + if j > 0 && prev == addr { + continue + } + var v [length.Addr + 1]byte + copy(v[:], addr[:]) + if _, ok := ct.froms[addr]; ok { + v[length.Addr] |= 1 + } + if _, ok := ct.tos[addr]; ok { + v[length.Addr] |= 2 + } + // TEVM marking still untranslated contracts + if vmConfig.EnableTEMV { + if created = ct.tos[addr]; created { + v[length.Addr] |= 4 + } + } + if j == 0 { + if err := tx.Append(kv.CallTraceSet, blockNumEnc[:], v[:]); err != nil { + return err + } + } else { + if err := tx.AppendDup(kv.CallTraceSet, blockNumEnc[:], v[:]); err != nil { + return err + } + } + copy(prev[:], addr[:]) + } + return nil +} diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index 38a66aebf7e..ab1e1f10984 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -23,45 +23,49 @@ import ( "os/user" "path/filepath" "runtime" + "strings" "time" "github.com/c2h5oh/datasize" - "github.com/davecgh/go-spew/spew" - "github.com/ledgerwatch/erigon/consensus/aura" - "github.com/ledgerwatch/erigon/consensus/aura/consensusconfig" - "github.com/ledgerwatch/erigon/ethdb/prune" - + txpool2 "github.com/ledgerwatch/erigon-lib/txpool" + "github.com/ledgerwatch/erigon/cmd/downloader/downloader/torrentcfg" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/consensus" - "github.com/ledgerwatch/erigon/consensus/clique" - "github.com/ledgerwatch/erigon/consensus/db" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/eth/gasprice" + "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/params/networkname" ) // FullNodeGPO contains default gasprice oracle settings for full node. var FullNodeGPO = gasprice.Config{ - Blocks: 20, - Default: big.NewInt(0), - Percentile: 60, - MaxPrice: gasprice.DefaultMaxPrice, - IgnorePrice: gasprice.DefaultIgnorePrice, + Blocks: 20, + Default: big.NewInt(0), + Percentile: 60, + MaxHeaderHistory: 0, + MaxBlockHistory: 0, + MaxPrice: gasprice.DefaultMaxPrice, + IgnorePrice: gasprice.DefaultIgnorePrice, } // LightClientGPO contains default gasprice oracle settings for light client. var LightClientGPO = gasprice.Config{ - Blocks: 2, - Percentile: 60, - MaxPrice: gasprice.DefaultMaxPrice, - IgnorePrice: gasprice.DefaultIgnorePrice, + Blocks: 2, + Percentile: 60, + MaxHeaderHistory: 300, + MaxBlockHistory: 5, + MaxPrice: gasprice.DefaultMaxPrice, + IgnorePrice: gasprice.DefaultIgnorePrice, } // Defaults contains default settings for use on the Ethereum main net. var Defaults = Config{ + Sync: Sync{ + UseSnapshots: false, + BlockDownloaderWindow: 32768, + BodyDownloadTimeoutSeconds: 30, + }, Ethash: ethash.Config{ CachesInMem: 2, CachesLockMmap: false, @@ -72,17 +76,21 @@ var Defaults = Config{ NetworkID: 1, Prune: prune.DefaultMode, Miner: params.MiningConfig{ - GasFloor: 8000000, - GasCeil: 8000000, + GasLimit: 30_000_000, GasPrice: big.NewInt(params.GWei), Recommit: 3 * time.Second, }, - TxPool: core.DefaultTxPoolConfig, - RPCGasCap: 50000000, - GPO: FullNodeGPO, - RPCTxFeeCap: 1, // 1 ether - - BodyDownloadTimeoutSeconds: 30, + DeprecatedTxPool: core.DeprecatedDefaultTxPoolConfig, + RPCGasCap: 50000000, + GPO: FullNodeGPO, + RPCTxFeeCap: 1, // 1 ether + + ImportMode: false, + Snapshot: Snapshot{ + Enabled: false, + KeepBlocks: false, + Produce: true, + }, } func init() { @@ -109,17 +117,41 @@ func init() { } } -//go:generate gencodec -type Config -formats toml -out gen_config.go +//go:generate gencodec -dir . -type Config -formats toml -out gen_config.go type Snapshot struct { - Enabled bool - Mode snapshotsync.SnapshotMode - Dir string - Seeding bool + Enabled bool + KeepBlocks bool + Produce bool // produce new snapshots +} + +func (s Snapshot) String() string { + var out []string + if s.Enabled { + out = append(out, "--snapshots=true") + } + if s.KeepBlocks { + out = append(out, "--"+FlagSnapKeepBlocks+"=true") + } + if !s.Produce { + out = append(out, "--"+FlagSnapStop+"=true") + } + return strings.Join(out, " ") +} + +var ( + FlagSnapKeepBlocks = "snap.keepblocks" + FlagSnapStop = "snap.stop" +) + +func NewSnapCfg(enabled, keepBlocks, produce bool) Snapshot { + return Snapshot{Enabled: enabled, KeepBlocks: keepBlocks, Produce: produce} } // Config contains configuration options for ETH protocol. type Config struct { + Sync Sync + // The genesis block, which is inserted if the database is empty. // If nil, the Ethereum main net block is used. Genesis *core.Genesis `toml:",omitempty"` @@ -135,11 +167,15 @@ type Config struct { Prune prune.Mode BatchSize datasize.ByteSize // Batch size for execution stage - BadBlock uint64 // Block marked as bad (for forced reorg) + + ImportMode bool + + BadBlockHash common.Hash // hash of the block marked as bad Snapshot Snapshot + Torrent *torrentcfg.Cfg - BlockDownloaderWindow int + SnapDir string // Address to connect to external snapshot downloader // empty if you want to use internal bittorrent snapshot downloader @@ -154,11 +190,14 @@ type Config struct { // Ethash options Ethash ethash.Config - Clique params.SnapshotConfig + Clique params.ConsensusSnapshotConfig Aura params.AuRaConfig + Parlia params.ParliaConfig + Bor params.BorConfig // Transaction pool options - TxPool core.TxPoolConfig + DeprecatedTxPool core.TxPoolConfig + TxPool txpool2.Config // Gas Price Oracle options GPO gasprice.Config @@ -170,56 +209,45 @@ type Config struct { // send-transction variants. The unit is ether. RPCTxFeeCap float64 `toml:",omitempty"` - StateStream bool - BodyDownloadTimeoutSeconds int // TODO change to duration + StateStream bool + + // Enable WatchTheBurn stage + EnabledIssuance bool - // SyncLoopThrottle sets a minimum time between staged loop iterations - SyncLoopThrottle time.Duration + // URL to connect to Heimdall node + HeimdallURL string + + // No heimdall service + WithoutHeimdall bool + // Ethstats service + Ethstats string + + // FORK_NEXT_VALUE (see EIP-3675) block override + OverrideMergeForkBlock *big.Int `toml:",omitempty"` + + OverrideTerminalTotalDifficulty *big.Int `toml:",omitempty"` } -func CreateConsensusEngine(chainConfig *params.ChainConfig, logger log.Logger, config interface{}, notify []string, noverify bool) consensus.Engine { - var eng consensus.Engine - - switch consensusCfg := config.(type) { - case *ethash.Config: - switch consensusCfg.PowMode { - case ethash.ModeFake: - log.Warn("Ethash used in fake mode") - eng = ethash.NewFaker() - case ethash.ModeTest: - log.Warn("Ethash used in test mode") - eng = ethash.NewTester(nil, noverify) - case ethash.ModeShared: - log.Warn("Ethash used in shared mode") - eng = ethash.NewShared() - default: - engine := ethash.New(ethash.Config{ - CachesInMem: consensusCfg.CachesInMem, - CachesLockMmap: consensusCfg.CachesLockMmap, - DatasetDir: consensusCfg.DatasetDir, - DatasetsInMem: consensusCfg.DatasetsInMem, - DatasetsOnDisk: consensusCfg.DatasetsOnDisk, - DatasetsLockMmap: consensusCfg.DatasetsLockMmap, - }, notify, noverify) - eng = engine - } - case *params.SnapshotConfig: - if chainConfig.Clique != nil { - eng = clique.New(chainConfig, consensusCfg, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory)) - } - case *params.AuRaConfig: - if chainConfig.Aura != nil { - var err error - eng, err = aura.NewAuRa(chainConfig.Aura, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory), chainConfig.Aura.Etherbase, consensusconfig.Sokol) - if err != nil { - panic(err) - } - } - } +type Sync struct { + UseSnapshots bool + // LoopThrottle sets a minimum time between staged loop iterations + LoopThrottle time.Duration - if eng == nil { - panic("unknown config" + spew.Sdump(config)) - } + BlockDownloaderWindow int + BodyDownloadTimeoutSeconds int // TODO: change to duration +} + +// Chains where snapshots are enabled by default +var ChainsWithSnapshots map[string]struct{} = map[string]struct{}{ + networkname.MainnetChainName: {}, + networkname.BSCChainName: {}, + networkname.GoerliChainName: {}, + networkname.RopstenChainName: {}, + networkname.MumbaiChainName: {}, + networkname.BorMainnetChainName: {}, +} - return eng +func UseSnapshotsByChainName(chain string) bool { + _, ok := ChainsWithSnapshots[chain] + return ok } diff --git a/eth/ethconfig/gen_config.go b/eth/ethconfig/gen_config.go index 7ef951273be..55a071920bc 100644 --- a/eth/ethconfig/gen_config.go +++ b/eth/ethconfig/gen_config.go @@ -3,6 +3,9 @@ package ethconfig import ( + "time" + + "github.com/c2h5oh/datasize" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus/ethash" "github.com/ledgerwatch/erigon/core" @@ -14,57 +17,83 @@ import ( // MarshalTOML marshals as TOML. func (c Config) MarshalTOML() (interface{}, error) { type Config struct { - Genesis *core.Genesis `toml:",omitempty"` - NetworkID uint64 - EthDiscoveryURLs []string - Whitelist map[uint64]common.Hash `toml:"-"` - StorageMode string - OnlyAnnounce bool - Miner params.MiningConfig - Ethash ethash.Config - TxPool core.TxPoolConfig - GPO gasprice.Config - RPCGasCap uint64 `toml:",omitempty"` - RPCTxFeeCap float64 `toml:",omitempty"` + Genesis *core.Genesis `toml:",omitempty"` + NetworkID uint64 + EthDiscoveryURLs []string + P2PEnabled bool + Prune prune.Mode + BatchSize datasize.ByteSize + ImportMode bool + BadBlockHash common.Hash + Snapshot Snapshot + BlockDownloaderWindow int + ExternalSnapshotDownloaderAddr string + Whitelist map[uint64]common.Hash `toml:"-"` + Miner params.MiningConfig + Ethash ethash.Config + Clique params.ConsensusSnapshotConfig + Aura params.AuRaConfig + Parlia params.ParliaConfig + TxPool core.TxPoolConfig + GPO gasprice.Config + RPCGasCap uint64 `toml:",omitempty"` + RPCTxFeeCap float64 `toml:",omitempty"` + StateStream bool + BodyDownloadTimeoutSeconds int + SyncLoopThrottle time.Duration } var enc Config enc.Genesis = c.Genesis enc.NetworkID = c.NetworkID enc.EthDiscoveryURLs = c.EthDiscoveryURLs + enc.P2PEnabled = c.P2PEnabled + enc.Prune = c.Prune + enc.BatchSize = c.BatchSize + enc.ImportMode = c.ImportMode + enc.BadBlockHash = c.BadBlockHash + enc.Snapshot = c.Snapshot + enc.ExternalSnapshotDownloaderAddr = c.ExternalSnapshotDownloaderAddr enc.Whitelist = c.Whitelist - enc.StorageMode = c.Prune.String() enc.Miner = c.Miner enc.Ethash = c.Ethash - enc.TxPool = c.TxPool + enc.Clique = c.Clique + enc.Aura = c.Aura + enc.Parlia = c.Parlia + enc.TxPool = c.DeprecatedTxPool enc.GPO = c.GPO enc.RPCGasCap = c.RPCGasCap enc.RPCTxFeeCap = c.RPCTxFeeCap + enc.StateStream = c.StateStream return &enc, nil } // UnmarshalTOML unmarshals from TOML. func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { type Config struct { - Genesis *core.Genesis `toml:",omitempty"` - NetworkID *uint64 - EthDiscoveryURLs []string - Whitelist map[uint64]common.Hash `toml:"-"` - Mode *string - PruneH *uint64 - PruneR *uint64 - PruneT *uint64 - PruneC *uint64 - Experiments *[]string - OnlyAnnounce *bool - SkipBcVersionCheck *bool `toml:"-"` - DatabaseHandles *int `toml:"-"` - DatabaseFreezer *string - Miner *params.MiningConfig - Ethash *ethash.Config - TxPool *core.TxPoolConfig - GPO *gasprice.Config - RPCGasCap *uint64 `toml:",omitempty"` - RPCTxFeeCap *float64 `toml:",omitempty"` + Genesis *core.Genesis `toml:",omitempty"` + NetworkID *uint64 + EthDiscoveryURLs []string + P2PEnabled *bool + Prune *prune.Mode + BatchSize *datasize.ByteSize + ImportMode *bool + BadBlockHash *common.Hash + Snapshot *Snapshot + BlockDownloaderWindow *int + ExternalSnapshotDownloaderAddr *string + Whitelist map[uint64]common.Hash `toml:"-"` + Miner *params.MiningConfig + Ethash *ethash.Config + Clique *params.ConsensusSnapshotConfig + Aura *params.AuRaConfig + Parlia *params.ParliaConfig + TxPool *core.TxPoolConfig + GPO *gasprice.Config + RPCGasCap *uint64 `toml:",omitempty"` + RPCTxFeeCap *float64 `toml:",omitempty"` + StateStream *bool + BodyDownloadTimeoutSeconds *int + SyncLoopThrottle *time.Duration } var dec Config if err := unmarshal(&dec); err != nil { @@ -79,24 +108,47 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.EthDiscoveryURLs != nil { c.EthDiscoveryURLs = dec.EthDiscoveryURLs } + if dec.P2PEnabled != nil { + c.P2PEnabled = *dec.P2PEnabled + } + if dec.Prune != nil { + c.Prune = *dec.Prune + } + if dec.BatchSize != nil { + c.BatchSize = *dec.BatchSize + } + if dec.ImportMode != nil { + c.ImportMode = *dec.ImportMode + } + if dec.BadBlockHash != nil { + c.BadBlockHash = *dec.BadBlockHash + } + if dec.Snapshot != nil { + c.Snapshot = *dec.Snapshot + } + if dec.ExternalSnapshotDownloaderAddr != nil { + c.ExternalSnapshotDownloaderAddr = *dec.ExternalSnapshotDownloaderAddr + } if dec.Whitelist != nil { c.Whitelist = dec.Whitelist } - if dec.Mode != nil { - mode, err := prune.FromCli(*dec.Mode, *dec.PruneH, *dec.PruneR, *dec.PruneT, *dec.PruneC, *dec.Experiments) - if err != nil { - return err - } - c.Prune = mode - } if dec.Miner != nil { c.Miner = *dec.Miner } if dec.Ethash != nil { c.Ethash = *dec.Ethash } + if dec.Clique != nil { + c.Clique = *dec.Clique + } + if dec.Aura != nil { + c.Aura = *dec.Aura + } + if dec.Parlia != nil { + c.Parlia = *dec.Parlia + } if dec.TxPool != nil { - c.TxPool = *dec.TxPool + c.DeprecatedTxPool = *dec.TxPool } if dec.GPO != nil { c.GPO = *dec.GPO @@ -107,5 +159,8 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.RPCTxFeeCap != nil { c.RPCTxFeeCap = *dec.RPCTxFeeCap } + if dec.StateStream != nil { + c.StateStream = *dec.StateStream + } return nil } diff --git a/eth/ethconsensusconfig/config.go b/eth/ethconsensusconfig/config.go new file mode 100644 index 00000000000..fadd2ab887a --- /dev/null +++ b/eth/ethconsensusconfig/config.go @@ -0,0 +1,78 @@ +package ethconsensusconfig + +import ( + "path/filepath" + + "github.com/davecgh/go-spew/spew" + "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/consensus/aura" + "github.com/ledgerwatch/erigon/consensus/aura/consensusconfig" + "github.com/ledgerwatch/erigon/consensus/bor" + "github.com/ledgerwatch/erigon/consensus/clique" + "github.com/ledgerwatch/erigon/consensus/db" + "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/consensus/parlia" + "github.com/ledgerwatch/erigon/consensus/serenity" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/log/v3" +) + +func CreateConsensusEngine(chainConfig *params.ChainConfig, logger log.Logger, config interface{}, notify []string, noverify bool, HeimdallURL string, WithoutHeimdall bool, datadir string, snapshots *snapshotsync.RoSnapshots) consensus.Engine { + var eng consensus.Engine + + switch consensusCfg := config.(type) { + case *ethash.Config: + switch consensusCfg.PowMode { + case ethash.ModeFake: + log.Warn("Ethash used in fake mode") + eng = ethash.NewFaker() + case ethash.ModeTest: + log.Warn("Ethash used in test mode") + eng = ethash.NewTester(nil, noverify) + case ethash.ModeShared: + log.Warn("Ethash used in shared mode") + eng = ethash.NewShared() + default: + eng = ethash.New(ethash.Config{ + CachesInMem: consensusCfg.CachesInMem, + CachesLockMmap: consensusCfg.CachesLockMmap, + DatasetDir: consensusCfg.DatasetDir, + DatasetsInMem: consensusCfg.DatasetsInMem, + DatasetsOnDisk: consensusCfg.DatasetsOnDisk, + DatasetsLockMmap: consensusCfg.DatasetsLockMmap, + }, notify, noverify) + } + case *params.ConsensusSnapshotConfig: + if chainConfig.Clique != nil { + eng = clique.New(chainConfig, consensusCfg, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory)) + } + case *params.AuRaConfig: + if chainConfig.Aura != nil { + var err error + eng, err = aura.NewAuRa(chainConfig.Aura, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory), chainConfig.Aura.Etherbase, consensusconfig.GetConfigByChain(chainConfig.ChainName)) + if err != nil { + panic(err) + } + } + case *params.ParliaConfig: + if chainConfig.Parlia != nil { + eng = parlia.New(chainConfig, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory), snapshots) + } + case *params.BorConfig: + if chainConfig.Bor != nil { + borDbPath := filepath.Join(datadir, "bor") // bor consensus path: datadir/bor + eng = bor.New(chainConfig, db.OpenDatabase(borDbPath, logger, false), HeimdallURL, WithoutHeimdall) + } + } + + if eng == nil { + panic("unknown config" + spew.Sdump(config)) + } + + if chainConfig.TerminalTotalDifficulty == nil { + return eng + } else { + return serenity.New(eng) // the Merge + } +} diff --git a/eth/ethutils/utils.go.go b/eth/ethutils/utils.go similarity index 100% rename from eth/ethutils/utils.go.go rename to eth/ethutils/utils.go diff --git a/eth/fetcher/block_fetcher.go b/eth/fetcher/block_fetcher.go deleted file mode 100644 index 4df1f219d91..00000000000 --- a/eth/fetcher/block_fetcher.go +++ /dev/null @@ -1,831 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package fetcher contains the announcement based header, blocks or transaction synchronisation. -package fetcher - -import ( - "errors" - "math/rand" - "time" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/common/prque" - "github.com/ledgerwatch/erigon/consensus" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/log/v3" -) - -const ( - arriveTimeout = 500 * time.Millisecond // Time allowance before an announced block/transaction is explicitly requested - gatherSlack = 100 * time.Millisecond // Interval used to collate almost-expired announces with fetches - fetchTimeout = 5 * time.Second // Maximum allotted time to return an explicitly requested block/transaction -) - -const ( - maxUncleDist = 7 // Maximum allowed backward distance from the chain head - maxQueueDist = 32 // Maximum allowed distance from the chain head to queue - hashLimit = 256 // Maximum number of unique blocks or headers a peer may have announced - blockLimit = 64 // Maximum number of unique blocks a peer may have delivered -) - -//var ( -//blockAnnounceInMeter = metrics.NewRegisteredMeter("eth/fetcher/block/announces/in", nil) -//blockAnnounceOutTimer = metrics.NewRegisteredTimer("eth/fetcher/block/announces/out", nil) -//blockAnnounceDropMeter = metrics.NewRegisteredMeter("eth/fetcher/block/announces/drop", nil) -//blockAnnounceDOSMeter = metrics.NewRegisteredMeter("eth/fetcher/block/announces/dos", nil) - -//blockBroadcastInMeter = metrics.NewRegisteredMeter("eth/fetcher/block/broadcasts/in", nil) -//blockBroadcastOutTimer = metrics.NewRegisteredTimer("eth/fetcher/block/broadcasts/out", nil) -//blockBroadcastDropMeter = metrics.NewRegisteredMeter("eth/fetcher/block/broadcasts/drop", nil) -//blockBroadcastDOSMeter = metrics.NewRegisteredMeter("eth/fetcher/block/broadcasts/dos", nil) - -//headerFetchMeter = metrics.NewRegisteredMeter("eth/fetcher/block/headers", nil) -//bodyFetchMeter = metrics.NewRegisteredMeter("eth/fetcher/block/bodies", nil) - -//headerFilterInMeter = metrics.NewRegisteredMeter("eth/fetcher/block/filter/headers/in", nil) -//headerFilterOutMeter = metrics.NewRegisteredMeter("eth/fetcher/block/filter/headers/out", nil) -//bodyFilterInMeter = metrics.NewRegisteredMeter("eth/fetcher/block/filter/bodies/in", nil) -//bodyFilterOutMeter = metrics.NewRegisteredMeter("eth/fetcher/block/filter/bodies/out", nil) -//) - -var errTerminated = errors.New("terminated") - -// HeaderRetrievalFn is a callback type for retrieving a header from the local chain. -type HeaderRetrievalFn func(common.Hash) *types.Header - -// blockRetrievalFn is a callback type for retrieving a block from the local chain. -type blockRetrievalFn func(common.Hash) *types.Block - -// headerRequesterFn is a callback type for sending a header retrieval request. -type headerRequesterFn func(common.Hash) error - -// bodyRequesterFn is a callback type for sending a body retrieval request. -type bodyRequesterFn func([]common.Hash) error - -// headerVerifierFn is a callback type to verify a block's header for fast propagation. -type headerVerifierFn func(header *types.Header) error - -// blockBroadcasterFn is a callback type for broadcasting a block to connected peers. -type blockBroadcasterFn func(block *types.Block, propagate bool) - -// chainHeightFn is a callback type to retrieve the current chain height. -type chainHeightFn func() uint64 - -// headersInsertFn is a callback type to insert a batch of headers into the local chain. -type headersInsertFn func(headers []*types.Header) (int, error) - -// chainInsertFn is a callback type to insert a batch of blocks into the local chain. -type chainInsertFn func(types.Blocks) (int, error) - -// peerDropFn is a callback type for dropping a peer detected as malicious. -type peerDropFn func(id string) - -// blockAnnounce is the hash notification of the availability of a new block in the -// network. -type blockAnnounce struct { - hash common.Hash // Hash of the block being announced - number uint64 // Number of the block being announced (0 = unknown | old protocol) - header *types.Header // Header of the block partially reassembled (new protocol) - time time.Time // Timestamp of the announcement - - origin string // Identifier of the peer originating the notification - - fetchHeader headerRequesterFn // Fetcher function to retrieve the header of an announced block - fetchBodies bodyRequesterFn // Fetcher function to retrieve the body of an announced block -} - -// headerFilterTask represents a batch of headers needing fetcher filtering. -type headerFilterTask struct { - peer string // The source peer of block headers - headers []*types.Header // Collection of headers to filter - time time.Time // Arrival time of the headers -} - -// bodyFilterTask represents a batch of block bodies (transactions and uncles) -// needing fetcher filtering. -type bodyFilterTask struct { - peer string // The source peer of block bodies - transactions [][]types.Transaction // Collection of transactions per block bodies - uncles [][]*types.Header // Collection of uncles per block bodies - time time.Time // Arrival time of the blocks' contents -} - -// blockOrHeaderInject represents a schedules import operation. -type blockOrHeaderInject struct { - origin string - - header *types.Header // Used for light mode fetcher which only cares about header. - block *types.Block // Used for normal mode fetcher which imports full block. -} - -// number returns the block number of the injected object. -func (inject *blockOrHeaderInject) number() uint64 { - if inject.header != nil { - return inject.header.Number.Uint64() - } - return inject.block.NumberU64() -} - -// number returns the block hash of the injected object. -func (inject *blockOrHeaderInject) hash() common.Hash { - if inject.header != nil { - return inject.header.Hash() - } - return inject.block.Hash() -} - -// BlockFetcher is responsible for accumulating block announcements from various peers -// and scheduling them for retrieval. -type BlockFetcher struct { - // Various event channels - notify chan *blockAnnounce - inject chan *blockOrHeaderInject - - headerFilter chan chan *headerFilterTask - bodyFilter chan chan *bodyFilterTask - - quit chan struct{} - - // Announce states - announces map[string]int // Per peer announce counts to prevent memory exhaustion - announced []*blockAnnounce // Announced blocks, scheduled for fetching - announcedS map[common.Hash]struct{} // Announced blocks, scheduled for fetching (set) - fetching map[common.Hash]*blockAnnounce // Announced blocks, currently fetching - fetched map[common.Hash][]*blockAnnounce // Blocks with headers fetched, scheduled for body retrieval - completing map[common.Hash]*blockAnnounce // Blocks with headers, currently body-completing - - // Block cache - queue *prque.Prque // Queue containing the import operations (block number sorted) - queueCh chan struct{} // Channel to signal that the queue is not yet empty - queues map[string]int // Per peer block counts to prevent memory exhaustion - queued map[common.Hash]*blockOrHeaderInject // Set of already queued blocks (to dedupe imports) - - // Callbacks - getBlock blockRetrievalFn // Retrieves a block from the local chain - verifyHeader headerVerifierFn // Checks if a block's headers have a valid proof of work - broadcastBlock blockBroadcasterFn // Broadcasts a block to connected peers - chainHeight chainHeightFn // Retrieves the current chain's height - insertHeaders headersInsertFn // Injects a batch of headers into the chain - insertChain chainInsertFn // Injects a batch of blocks into the chain - dropPeer peerDropFn // Drops a peer for misbehaving - - // Testing hooks - announceChangeHook func(common.Hash, bool) // Method to call upon adding or deleting a hash from the blockAnnounce list - queueChangeHook func(common.Hash, bool) // Method to call upon adding or deleting a block from the import queue - fetchingHook func([]common.Hash) // Method to call upon starting a block (eth/61) or header (eth/62) fetch - completingHook func([]common.Hash) // Method to call upon starting a block body fetch (eth/62) - importedHook func(*types.Header, *types.Block) // Method to call upon successful header or block import (both eth/61 and eth/62) -} - -// NewBlockFetcher creates a block fetcher to retrieve blocks based on hash announcements. -func NewBlockFetcher(getHeader HeaderRetrievalFn, getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBlock blockBroadcasterFn, chainHeight chainHeightFn, insertHeaders headersInsertFn, insertChain chainInsertFn, dropPeer peerDropFn) *BlockFetcher { - return &BlockFetcher{ - notify: make(chan *blockAnnounce), - inject: make(chan *blockOrHeaderInject), - headerFilter: make(chan chan *headerFilterTask), - bodyFilter: make(chan chan *bodyFilterTask), - quit: make(chan struct{}), - announces: make(map[string]int), - announced: nil, - announcedS: make(map[common.Hash]struct{}), - fetching: make(map[common.Hash]*blockAnnounce), - fetched: make(map[common.Hash][]*blockAnnounce), - completing: make(map[common.Hash]*blockAnnounce), - queue: prque.New(nil), - queues: make(map[string]int), - queued: make(map[common.Hash]*blockOrHeaderInject), - queueCh: make(chan struct{}, 1), - getBlock: getBlock, - verifyHeader: verifyHeader, - broadcastBlock: broadcastBlock, - chainHeight: chainHeight, - insertHeaders: insertHeaders, - insertChain: insertChain, - dropPeer: dropPeer, - } -} - -// Start boots up the announcement based synchroniser, accepting and processing -// hash notifications and block fetches until termination requested. -func (f *BlockFetcher) Start() { - go f.loop() -} - -// Stop terminates the announcement based synchroniser, canceling all pending -// operations. -func (f *BlockFetcher) Stop() { - common.SafeClose(f.quit) -} - -// Notify announces the fetcher of the potential availability of a new block in -// the network. -func (f *BlockFetcher) Notify(peer string, hash common.Hash, number uint64, time time.Time, - headerFetcher headerRequesterFn, bodyFetcher bodyRequesterFn) error { - block := &blockAnnounce{ - hash: hash, - number: number, - time: time, - origin: peer, - fetchHeader: headerFetcher, - fetchBodies: bodyFetcher, - } - select { - case f.notify <- block: - return nil - case <-f.quit: - return errTerminated - } -} - -// Enqueue tries to fill gaps the fetcher's future import queue. -func (f *BlockFetcher) Enqueue(peer string, block *types.Block) error { - op := &blockOrHeaderInject{ - origin: peer, - block: block, - } - select { - case f.inject <- op: - return nil - case <-f.quit: - return errTerminated - } -} - -// FilterHeaders extracts all the headers that were explicitly requested by the fetcher, -// returning those that should be handled differently. -func (f *BlockFetcher) FilterHeaders(peer string, headers []*types.Header, time time.Time) []*types.Header { - log.Trace("Filtering headers", "peer", peer, "headers", len(headers)) - - // Send the filter channel to the fetcher - filter := make(chan *headerFilterTask) - - select { - case f.headerFilter <- filter: - case <-f.quit: - return nil - } - // Request the filtering of the header list - select { - case filter <- &headerFilterTask{peer: peer, headers: headers, time: time}: - case <-f.quit: - return nil - } - // Retrieve the headers remaining after filtering - select { - case task := <-filter: - return task.headers - case <-f.quit: - return nil - } -} - -// FilterBodies extracts all the block bodies that were explicitly requested by -// the fetcher, returning those that should be handled differently. -func (f *BlockFetcher) FilterBodies(peer string, transactions [][]types.Transaction, uncles [][]*types.Header, time time.Time) ([][]types.Transaction, [][]*types.Header) { - log.Trace("Filtering bodies", "peer", peer, "txs", len(transactions), "uncles", len(uncles)) - - // Send the filter channel to the fetcher - filter := make(chan *bodyFilterTask) - - select { - case f.bodyFilter <- filter: - case <-f.quit: - return nil, nil - } - // Request the filtering of the body list - select { - case filter <- &bodyFilterTask{peer: peer, transactions: transactions, uncles: uncles, time: time}: - case <-f.quit: - return nil, nil - } - // Retrieve the bodies remaining after filtering - select { - case task := <-filter: - return task.transactions, task.uncles - case <-f.quit: - return nil, nil - } -} - -// Loop is the main fetcher loop, checking and processing various notification -// events. -func (f *BlockFetcher) loop() { - // Iterate the block fetching until a quit is requested - fetchTimer := time.NewTimer(0) - completeTimer := time.NewTimer(0) - defer debug.LogPanic() - defer fetchTimer.Stop() - defer completeTimer.Stop() - - for { - // Clean up any expired block fetches - for hash, announce := range f.fetching { - if time.Since(announce.time) > fetchTimeout { - f.forgetHash(hash) - } - } - // Import any queued blocks that could potentially fit - height := f.chainHeight() - for !f.queue.Empty() { - select { - case <-f.queueCh: - default: - } - op := f.queue.PopItem().(*blockOrHeaderInject) - hash := op.hash() - if f.queueChangeHook != nil { - f.queueChangeHook(hash, false) - } - // If too high up the chain or phase, continue later - number := op.number() - if number > height+1 { - f.queue.Push(op, -int64(number)) - if f.queueChangeHook != nil { - f.queueChangeHook(hash, true) - } - f.queueCh <- struct{}{} - break - } - // Otherwise if fresh and still unknown, try and import - if (number+maxUncleDist < height) || f.getBlock(hash) != nil { - f.forgetBlock(hash) - continue - } - f.importBlocks(op.origin, op.block) - } - // Wait for an outside event to occur - select { - case <-f.quit: - // BlockFetcher terminating, abort all operations - return - - case notification := <-f.notify: - // A block was announced, make sure the peer isn't DOSing us - //blockAnnounceInMeter.Mark(1) - - count := f.announces[notification.origin] + 1 - if count > hashLimit { - log.Debug("Peer exceeded outstanding announces", "peer", notification.origin, "limit", hashLimit) - //blockAnnounceDOSMeter.Mark(1) - break - } - // If we have a valid block number, check that it's potentially useful - if notification.number > 0 { - if dist := int64(notification.number) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist { - log.Debug("Peer discarded announcement", "peer", notification.origin, "number", notification.number, "hash", notification.hash, "distance", dist) - //blockAnnounceDropMeter.Mark(1) - break - } - } - // All is well, schedule the announce if block's not yet downloading - if _, ok := f.fetching[notification.hash]; ok { - break - } - if _, ok := f.completing[notification.hash]; ok { - break - } - f.announces[notification.origin] = count - if _, ok := f.announcedS[notification.hash]; !ok { - f.announcedS[notification.hash] = struct{}{} - if f.announceChangeHook != nil { - f.announceChangeHook(notification.hash, true) - } - } - f.announced = append(f.announced, notification) - if len(f.announcedS) == 1 { - f.rescheduleFetch(fetchTimer) - } - - case op := <-f.inject: - // A direct block insertion was requested, try and fill any pending gaps - //blockBroadcastInMeter.Mark(1) - f.enqueue(op.origin, nil, op.block) - - case <-fetchTimer.C: - // At least one block's timer ran out, check for needing retrieval - request := make(map[string][]common.Hash) - - toForget := make(map[common.Hash]struct{}) - var toFetch []*blockAnnounce - - for _, announce := range f.announced { - timeout := arriveTimeout - gatherSlack - if time.Since(announce.time) > timeout { - if _, ok := toForget[announce.hash]; !ok { - // Pick a random peer to retrieve from, reset all others - if f.getBlock(announce.hash) == nil { - request[announce.origin] = append(request[announce.origin], announce.hash) - toFetch = append(toFetch, announce) - } - toForget[announce.hash] = struct{}{} - } - } - } - for hash := range toForget { - f.forgetHash(hash) - } - for _, announce := range toFetch { - f.fetching[announce.hash] = announce - } - // Send out all block header requests - for peer, hashes := range request { - log.Trace("Fetching scheduled headers", "peer", peer, "list", hashes) - - // Create a closure of the fetch and schedule in on a new thread - fetchHeader, hashes := f.fetching[hashes[0]].fetchHeader, hashes - go func() { - defer debug.LogPanic() - if f.fetchingHook != nil { - f.fetchingHook(hashes) - } - for _, hash := range hashes { - //headerFetchMeter.Mark(1) - fetchHeader(hash) // Suboptimal, but protocol doesn't allow batch header retrievals - } - }() - } - // Schedule the next fetch if blocks are still pending - f.rescheduleFetch(fetchTimer) - - case <-completeTimer.C: - // At least one header's timer ran out, retrieve everything - request := make(map[string][]common.Hash) - - for hash, announces := range f.fetched { - // Pick a random peer to retrieve from, reset all others - announce := announces[rand.Intn(len(announces))] - f.forgetHash(hash) - - // If the block still didn't arrive, queue for completion - if f.getBlock(hash) == nil { - request[announce.origin] = append(request[announce.origin], hash) - f.completing[hash] = announce - } - } - // Send out all block body requests - for peer, hashes := range request { - log.Trace("Fetching scheduled bodies", "peer", peer, "list", hashes) - - // Create a closure of the fetch and schedule in on a new thread - if f.completingHook != nil { - f.completingHook(hashes) - } - //bodyFetchMeter.Mark(int64(len(hashes))) - go f.completing[hashes[0]].fetchBodies(hashes) - } - // Schedule the next fetch if blocks are still pending - f.rescheduleComplete(completeTimer) - - case filter := <-f.headerFilter: - // Headers arrived from a remote peer. Extract those that were explicitly - // requested by the fetcher, and return everything else so it's delivered - // to other parts of the system. - var task *headerFilterTask - select { - case task = <-filter: - case <-f.quit: - return - } - //headerFilterInMeter.Mark(int64(len(task.headers))) - - // Split the batch of headers into unknown ones (to return to the caller), - // known incomplete ones (requiring body retrievals) and completed blocks. - unknown, incomplete, complete := []*types.Header{}, []*blockAnnounce{}, []*types.Block{} - for _, header := range task.headers { - hash := header.Hash() - - // Filter fetcher-requested headers from other synchronisation algorithms - if announce := f.fetching[hash]; announce != nil && announce.origin == task.peer && f.fetched[hash] == nil && f.completing[hash] == nil && f.queued[hash] == nil { - // If the delivered header does not match the promised number, drop the announcer - if header.Number.Uint64() != announce.number { - log.Trace("Invalid block number fetched", "peer", announce.origin, "hash", header.Hash(), "announced", announce.number, "provided", header.Number) - f.dropPeer(announce.origin) - f.forgetHash(hash) - continue - } - // Only keep if not imported by other means - if f.getBlock(hash) == nil { - announce.header = header - announce.time = task.time - - // If the block is empty (header only), short circuit into the final import queue - if header.TxHash == types.EmptyRootHash && header.UncleHash == types.EmptyUncleHash { - log.Trace("Block empty, skipping body retrieval", "peer", announce.origin, "number", header.Number, "hash", header.Hash()) - - block := types.NewBlockWithHeader(header) - block.ReceivedAt = task.time - - complete = append(complete, block) - f.completing[hash] = announce - continue - } - // Otherwise add to the list of blocks needing completion - incomplete = append(incomplete, announce) - } else { - log.Trace("Block already imported, discarding header", "peer", announce.origin, "number", header.Number, "hash", header.Hash()) - f.forgetHash(hash) - } - } else { - // BlockFetcher doesn't know about it, add to the return list - unknown = append(unknown, header) - } - } - //headerFilterOutMeter.Mark(int64(len(unknown))) - select { - case filter <- &headerFilterTask{headers: unknown, time: task.time}: - case <-f.quit: - return - } - // Schedule the retrieved headers for body completion - for _, announce := range incomplete { - hash := announce.header.Hash() - if _, ok := f.completing[hash]; ok { - continue - } - f.fetched[hash] = append(f.fetched[hash], announce) - if len(f.fetched) == 1 { - f.rescheduleComplete(completeTimer) - } - } - // Schedule the header-only blocks for import - for _, block := range complete { - if announce := f.completing[block.Hash()]; announce != nil { - f.enqueue(announce.origin, nil, block) - } - } - - case filter := <-f.bodyFilter: - // Block bodies arrived, extract any explicitly requested blocks, return the rest - var task *bodyFilterTask - select { - case task = <-filter: - case <-f.quit: - return - } - //bodyFilterInMeter.Mark(int64(len(task.transactions))) - blocks := []*types.Block{} - // abort early if there's nothing explicitly requested - if len(f.completing) > 0 { - for i := 0; i < len(task.transactions) && i < len(task.uncles); i++ { - // Match up a body to any possible completion request - var ( - matched = false - uncleHash common.Hash // calculated lazily and reused - txnHash common.Hash // calculated lazily and reused - ) - for hash, announce := range f.completing { - if f.queued[hash] != nil || announce.origin != task.peer { - continue - } - if uncleHash == (common.Hash{}) { - uncleHash = types.CalcUncleHash(task.uncles[i]) - } - if uncleHash != announce.header.UncleHash { - continue - } - if txnHash == (common.Hash{}) { - txnHash = types.DeriveSha(types.Transactions(task.transactions[i])) - } - if txnHash != announce.header.TxHash { - continue - } - // Mark the body matched, reassemble if still unknown - matched = true - if f.getBlock(hash) == nil { - block := types.NewBlockWithHeader(announce.header).WithBody(task.transactions[i], task.uncles[i]) - block.ReceivedAt = task.time - blocks = append(blocks, block) - } else { - f.forgetHash(hash) - } - - } - if matched { - task.transactions = append(task.transactions[:i], task.transactions[i+1:]...) - task.uncles = append(task.uncles[:i], task.uncles[i+1:]...) - i-- - continue - } - } - } - - //bodyFilterOutMeter.Mark(int64(len(task.transactions))) - select { - case filter <- task: - case <-f.quit: - return - } - // Schedule the retrieved blocks for ordered import - for _, block := range blocks { - if announce := f.completing[block.Hash()]; announce != nil { - f.enqueue(announce.origin, nil, block) - } - } - case <-f.queueCh: - } - } -} - -// rescheduleFetch resets the specified fetch timer to the next blockAnnounce timeout. -func (f *BlockFetcher) rescheduleFetch(fetch *time.Timer) { - // Short circuit if no blocks are announced - if len(f.announcedS) == 0 { - return - } - // Otherwise find the earliest expiring announcement - earliest := time.Now() - for _, announce := range f.announced { - if earliest.After(announce.time) { - earliest = announce.time - } - } - fetch.Reset(arriveTimeout - time.Since(earliest)) -} - -// rescheduleComplete resets the specified completion timer to the next fetch timeout. -func (f *BlockFetcher) rescheduleComplete(complete *time.Timer) { - // Short circuit if no headers are fetched - if len(f.fetched) == 0 { - return - } - // Otherwise find the earliest expiring announcement - earliest := time.Now() - for _, announces := range f.fetched { - if earliest.After(announces[0].time) { - earliest = announces[0].time - } - } - complete.Reset(gatherSlack - time.Since(earliest)) -} - -// enqueue schedules a new header or block import operation, if the component -// to be imported has not yet been seen. -func (f *BlockFetcher) enqueue(peer string, header *types.Header, block *types.Block) { - var ( - hash common.Hash - number uint64 - ) - if header != nil { - hash, number = header.Hash(), header.Number.Uint64() - } else { - hash, number = block.Hash(), block.NumberU64() - } - // Ensure the peer isn't DOSing us - count := f.queues[peer] + 1 - if count > blockLimit { - log.Debug("Discarded delivered header or block, exceeded allowance", "peer", peer, "number", number, "hash", hash, "limit", blockLimit) - //blockBroadcastDOSMeter.Mark(1) - f.forgetHash(hash) - return - } - // Discard any past or too distant blocks - if dist := int64(number) - int64(f.chainHeight()); dist < -maxUncleDist || dist > maxQueueDist { - log.Debug("Discarded delivered header or block, too far away", "peer", peer, "number", number, "hash", hash, "distance", dist) - //blockBroadcastDropMeter.Mark(1) - f.forgetHash(hash) - return - } - // Schedule the block for future importing - if _, ok := f.queued[hash]; !ok { - op := &blockOrHeaderInject{origin: peer} - if header != nil { - op.header = header - } else { - op.block = block - } - f.queues[peer] = count - f.queued[hash] = op - f.queue.Push(op, -int64(number)) - if f.queueChangeHook != nil { - f.queueChangeHook(hash, true) - } - log.Debug("Queued delivered header or block", "peer", peer, "number", number, "hash", hash, "queued", f.queue.Size()) - } -} - -// importBlocks spawns a new goroutine to run a block insertion into the chain. If the -// block's number is at the same height as the current import phase, it updates -// the phase states accordingly. -func (f *BlockFetcher) importBlocks(peer string, block *types.Block) { - hash := block.Hash() - - // Run the import on a new thread - log.Debug("Importing propagated block", "peer", peer, "number", block.Number(), "hash", hash) - defer func() { - f.forgetHash(hash) - f.forgetBlock(hash) - }() - - // If the parent's unknown, abort insertion - parent := f.getBlock(block.ParentHash()) - if parent == nil { - log.Debug("Unknown parent of propagated block", "peer", peer, "number", block.Number(), "hash", hash, "parent", block.ParentHash()) - return - } - // Quickly validate the header and propagate the block if it passes - switch err := f.verifyHeader(block.Header()); err { - case nil: - // All ok, quickly propagate to our peers - //blockBroadcastOutTimer.UpdateSince(block.ReceivedAt) - go f.broadcastBlock(block, true) - - case consensus.ErrFutureBlock: - // Weird future block, don't fail, but neither propagate - - default: - // Something went very wrong, drop the peer - log.Debug("Propagated block verification failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err) - f.dropPeer(peer) - return - } - // Run the actual import and log any issues - if _, err := f.insertChain(types.Blocks{block}); err != nil { - log.Debug("Propagated block import failed", "peer", peer, "number", block.Number(), "hash", hash, "err", err) - return - } - // If import succeeded, broadcast the block - //blockAnnounceOutTimer.UpdateSince(block.ReceivedAt) - go f.broadcastBlock(block, false) - - // Invoke the testing hook if needed - if f.importedHook != nil { - f.importedHook(nil, block) - } -} - -// forgetHash removes all traces of a block announcement from the fetcher's -// internal state. -func (f *BlockFetcher) forgetHash(hash common.Hash) { - // Remove all pending announces and decrement DOS counters - if _, ok := f.announcedS[hash]; ok { - var newAnnounced []*blockAnnounce - for _, announce := range f.announced { - if announce.hash == hash { - f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { - delete(f.announces, announce.origin) - } - } else { - newAnnounced = append(newAnnounced, announce) - } - } - f.announced = newAnnounced - delete(f.announcedS, hash) - } - if f.announceChangeHook != nil { - f.announceChangeHook(hash, false) - } - // Remove any pending fetches and decrement the DOS counters - if announce := f.fetching[hash]; announce != nil { - f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { - delete(f.announces, announce.origin) - } - delete(f.fetching, hash) - } - - // Remove any pending completion requests and decrement the DOS counters - for _, announce := range f.fetched[hash] { - f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { - delete(f.announces, announce.origin) - } - } - delete(f.fetched, hash) - - // Remove any pending completions and decrement the DOS counters - if announce := f.completing[hash]; announce != nil { - f.announces[announce.origin]-- - if f.announces[announce.origin] <= 0 { - delete(f.announces, announce.origin) - } - delete(f.completing, hash) - } -} - -// forgetBlock removes all traces of a queued block from the fetcher's internal -// state. -func (f *BlockFetcher) forgetBlock(hash common.Hash) { - if insert := f.queued[hash]; insert != nil { - f.queues[insert.origin]-- - if f.queues[insert.origin] == 0 { - delete(f.queues, insert.origin) - } - delete(f.queued, hash) - } -} diff --git a/eth/fetcher/block_fetcher_test.go b/eth/fetcher/block_fetcher_test.go deleted file mode 100644 index 402bfe66b51..00000000000 --- a/eth/fetcher/block_fetcher_test.go +++ /dev/null @@ -1,849 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package fetcher - -import ( - "errors" - "math/big" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv/memdb" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/consensus/ethash" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/params" -) - -var ( - testdb = memdb.New() - testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - testAddress = crypto.PubkeyToAddress(testKey.PublicKey) - genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) - unknownBlock = types.NewBlock(&types.Header{GasLimit: params.GenesisGasLimit}, nil, nil, nil) -) - -// makeChain creates a chain of n blocks starting at and including parent. -// the returned hash chain is ordered head->parent. In addition, every 3rd block -// contains a transaction and every 5th an uncle to allow testing correct block -// reassembly. -func makeChain(n int, seed byte, parent *types.Block) ([]common.Hash, map[common.Hash]*types.Block) { - db := memdb.New() - defer db.Close() - core.GenesisBlockForTesting(db, testAddress, big.NewInt(1000000000)) - chain, err := core.GenerateChain(params.TestChainConfig, parent, ethash.NewFaker(), db, n, func(i int, block *core.BlockGen) { - block.SetCoinbase(common.Address{seed}) - - // If the block number is multiple of 3, send a bonus transaction to the miner - if parent == genesis && i%3 == 0 { - signer := types.MakeSigner(params.TestChainConfig, block.Number().Uint64()) - tx, err := types.SignTx(types.NewTransaction(block.TxNonce(testAddress), common.Address{seed}, uint256.NewInt(1000), params.TxGas, nil, nil), *signer, testKey) - if err != nil { - panic(err) - } - block.AddTx(tx) - } - // If the block number is a multiple of 5, add a bonus uncle to the block - if i%5 == 0 { - block.AddUncle(&types.Header{ParentHash: block.PrevBlock(i - 1).Hash(), Number: big.NewInt(int64(i - 1))}) - } - }, false /* intermediateHashes */) - if err != nil { - panic(err) - } - hashes := make([]common.Hash, n+1) - hashes[len(hashes)-1] = parent.Hash() - blockm := make(map[common.Hash]*types.Block, n+1) - blockm[parent.Hash()] = parent - for i, b := range chain.Blocks { - hashes[len(hashes)-i-2] = b.Hash() - blockm[b.Hash()] = b - } - return hashes, blockm -} - -// fetcherTester is a test simulator for mocking out local block chain. -type fetcherTester struct { - fetcher *BlockFetcher - - hashes []common.Hash // Hash chain belonging to the tester - headers map[common.Hash]*types.Header // Headers belonging to the tester - blocks map[common.Hash]*types.Block // Blocks belonging to the tester - drops map[string]bool // Map of peers dropped by the fetcher - - lock sync.RWMutex -} - -// newTester creates a new fetcher test mocker. -func newTester() *fetcherTester { - tester := &fetcherTester{ - hashes: []common.Hash{genesis.Hash()}, - headers: map[common.Hash]*types.Header{genesis.Hash(): genesis.Header()}, - blocks: map[common.Hash]*types.Block{genesis.Hash(): genesis}, - drops: make(map[string]bool), - } - tester.fetcher = NewBlockFetcher(tester.getHeader, tester.getBlock, tester.verifyHeader, tester.broadcastBlock, tester.chainHeight, tester.insertHeaders, tester.insertChain, tester.dropPeer) - tester.fetcher.Start() - - return tester -} - -// getHeader retrieves a header from the tester's block chain. -func (f *fetcherTester) getHeader(hash common.Hash) *types.Header { - f.lock.RLock() - defer f.lock.RUnlock() - - return f.headers[hash] -} - -// getBlock retrieves a block from the tester's block chain. -func (f *fetcherTester) getBlock(hash common.Hash) *types.Block { - f.lock.RLock() - defer f.lock.RUnlock() - - return f.blocks[hash] -} - -// verifyHeader is a nop placeholder for the block header verification. -func (f *fetcherTester) verifyHeader(header *types.Header) error { - return nil -} - -// broadcastBlock is a nop placeholder for the block broadcasting. -func (f *fetcherTester) broadcastBlock(block *types.Block, propagate bool) { -} - -// chainHeight retrieves the current height (block number) of the chain. -func (f *fetcherTester) chainHeight() uint64 { - f.lock.RLock() - defer f.lock.RUnlock() - - return f.blocks[f.hashes[len(f.hashes)-1]].NumberU64() -} - -// insertChain injects a new headers into the simulated chain. -func (f *fetcherTester) insertHeaders(headers []*types.Header) (int, error) { - f.lock.Lock() - defer f.lock.Unlock() - - for i, header := range headers { - // Make sure the parent in known - if _, ok := f.headers[header.ParentHash]; !ok { - return i, errors.New("unknown parent") - } - // Discard any new blocks if the same height already exists - if header.Number.Uint64() <= f.headers[f.hashes[len(f.hashes)-1]].Number.Uint64() { - return i, nil - } - // Otherwise build our current chain - f.hashes = append(f.hashes, header.Hash()) - f.headers[header.Hash()] = header - } - return 0, nil -} - -// insertChain injects a new blocks into the simulated chain. -func (f *fetcherTester) insertChain(blocks types.Blocks) (int, error) { - f.lock.Lock() - defer f.lock.Unlock() - - for i, block := range blocks { - // Make sure the parent in known - if _, ok := f.blocks[block.ParentHash()]; !ok { - return i, errors.New("unknown parent") - } - // Discard any new blocks if the same height already exists - if block.NumberU64() <= f.blocks[f.hashes[len(f.hashes)-1]].NumberU64() { - return i, nil - } - // Otherwise build our current chain - f.hashes = append(f.hashes, block.Hash()) - f.blocks[block.Hash()] = block - } - return 0, nil -} - -// dropPeer is an emulator for the peer removal, simply accumulating the various -// peers dropped by the fetcher. -func (f *fetcherTester) dropPeer(peer string) { - f.lock.Lock() - defer f.lock.Unlock() - - f.drops[peer] = true -} - -// makeHeaderFetcher retrieves a block header fetcher associated with a simulated peer. -func (f *fetcherTester) makeHeaderFetcher(peer string, blocks map[common.Hash]*types.Block, drift time.Duration) headerRequesterFn { - closure := make(map[common.Hash]*types.Block) - for hash, block := range blocks { - closure[hash] = block - } - // Create a function that return a header from the closure - return func(hash common.Hash) error { - // Gather the blocks to return - headers := make([]*types.Header, 0, 1) - if block, ok := closure[hash]; ok { - headers = append(headers, block.Header()) - } - // Return on a new thread - go f.fetcher.FilterHeaders(peer, headers, time.Now().Add(drift)) - - return nil - } -} - -// makeBodyFetcher retrieves a block body fetcher associated with a simulated peer. -func (f *fetcherTester) makeBodyFetcher(peer string, blocks map[common.Hash]*types.Block, drift time.Duration) bodyRequesterFn { - closure := make(map[common.Hash]*types.Block) - for hash, block := range blocks { - closure[hash] = block - } - // Create a function that returns blocks from the closure - return func(hashes []common.Hash) error { - // Gather the block bodies to return - transactions := make([][]types.Transaction, 0, len(hashes)) - uncles := make([][]*types.Header, 0, len(hashes)) - - for _, hash := range hashes { - if block, ok := closure[hash]; ok { - transactions = append(transactions, block.Transactions()) - uncles = append(uncles, block.Uncles()) - } - } - // Return on a new thread - go f.fetcher.FilterBodies(peer, transactions, uncles, time.Now().Add(drift)) - - return nil - } -} - -// verifyFetchingEvent verifies that one single event arrive on a fetching channel. -func verifyFetchingEvent(t *testing.T, fetching chan []common.Hash, arrive bool) { - if arrive { - select { - case <-fetching: - case <-time.After(time.Second): - t.Fatalf("fetching timeout") - } - } else { - select { - case <-fetching: - t.Fatalf("fetching invoked") - case <-time.After(10 * time.Millisecond): - } - } -} - -// verifyCompletingEvent verifies that one single event arrive on an completing channel. -func verifyCompletingEvent(t *testing.T, completing chan []common.Hash, arrive bool) { - if arrive { - select { - case <-completing: - case <-time.After(time.Second): - t.Fatalf("completing timeout") - } - } else { - select { - case <-completing: - t.Fatalf("completing invoked") - case <-time.After(10 * time.Millisecond): - } - } -} - -// verifyImportEvent verifies that one single event arrive on an import channel. -func verifyImportEvent(t *testing.T, imported chan interface{}, arrive bool) { - if arrive { - select { - case <-imported: - case <-time.After(time.Second): - t.Fatalf("import timeout") - } - } else { - select { - case <-imported: - t.Fatalf("import invoked") - case <-time.After(20 * time.Millisecond): - } - } -} - -// verifyImportCount verifies that exactly count number of events arrive on an -// import hook channel. -func verifyImportCount(t *testing.T, imported chan interface{}, count int) { - for i := 0; i < count; i++ { - select { - case <-imported: - case <-time.After(time.Second): - t.Fatalf("block %d: import timeout", i+1) - } - } - verifyImportDone(t, imported) -} - -// verifyImportDone verifies that no more events are arriving on an import channel. -func verifyImportDone(t *testing.T, imported chan interface{}) { - select { - case <-imported: - t.Fatalf("extra block imported") - case <-time.After(50 * time.Millisecond): - } -} - -// verifyChainHeight verifies the chain height is as expected. -func verifyChainHeight(t *testing.T, fetcher *fetcherTester, height uint64) { - if fetcher.chainHeight() != height { - t.Fatalf("chain height mismatch, got %d, want %d", fetcher.chainHeight(), height) - } -} - -// Tests that a fetcher accepts block announcements and initiates retrievals for -// them, successfully importing into the local chain. -func TestSequentialAnnouncements(t *testing.T) { testSequentialAnnouncements(t) } - -func testSequentialAnnouncements(t *testing.T) { - // Create a chain of blocks to import - targetBlocks := 4 * hashLimit - hashes, blocks := makeChain(targetBlocks, 0, genesis) - - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - // Iteratively announce blocks until all are imported - imported := make(chan interface{}) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { - if block == nil { - t.Fatalf("Fetcher try to import empty block") - } - imported <- block - } - for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - verifyImportEvent(t, imported, true) - } - verifyImportDone(t, imported) - verifyChainHeight(t, tester, uint64(len(hashes)-1)) -} - -// Tests that if blocks are announced by multiple peers (or even the same buggy -// peer), they will only get downloaded at most once. -func TestConcurrentAnnouncements(t *testing.T) { testConcurrentAnnouncements(t) } - -func testConcurrentAnnouncements(t *testing.T) { - // Create a chain of blocks to import - targetBlocks := 4 * hashLimit - hashes, blocks := makeChain(targetBlocks, 0, genesis) - - // Assemble a tester with a built in counter for the requests - tester := newTester() - defer tester.fetcher.Stop() - firstHeaderFetcher := tester.makeHeaderFetcher("first", blocks, -gatherSlack) - firstBodyFetcher := tester.makeBodyFetcher("first", blocks, 0) - secondHeaderFetcher := tester.makeHeaderFetcher("second", blocks, -gatherSlack) - secondBodyFetcher := tester.makeBodyFetcher("second", blocks, 0) - - counter := uint32(0) - firstHeaderWrapper := func(hash common.Hash) error { - atomic.AddUint32(&counter, 1) - return firstHeaderFetcher(hash) - } - secondHeaderWrapper := func(hash common.Hash) error { - atomic.AddUint32(&counter, 1) - return secondHeaderFetcher(hash) - } - // Iteratively announce blocks until all are imported - imported := make(chan interface{}, 1) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { - if block == nil { - t.Fatalf("Fetcher try to import empty block") - } - imported <- block - } - - for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("first", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), firstHeaderWrapper, firstBodyFetcher) - tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout+time.Millisecond), secondHeaderWrapper, secondBodyFetcher) - tester.fetcher.Notify("second", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout-time.Millisecond), secondHeaderWrapper, secondBodyFetcher) - verifyImportEvent(t, imported, true) - } - verifyImportDone(t, imported) - - // Make sure no blocks were retrieved twice - if int(counter) != targetBlocks { - t.Fatalf("retrieval count mismatch: have %v, want %v", counter, targetBlocks) - } - verifyChainHeight(t, tester, uint64(len(hashes)-1)) -} - -// Tests that announcements arriving while a previous is being fetched still -// results in a valid import. -func TestOverlappingAnnouncements(t *testing.T) { testOverlappingAnnouncements(t) } - -func testOverlappingAnnouncements(t *testing.T) { - // Create a chain of blocks to import - targetBlocks := 4 * hashLimit - hashes, blocks := makeChain(targetBlocks, 0, genesis) - - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - // Iteratively announce blocks, but overlap them continuously - overlap := 16 - imported := make(chan interface{}, len(hashes)-1) - for i := 0; i < overlap; i++ { - imported <- nil - } - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { - if block == nil { - t.Fatalf("Fetcher try to import empty block") - } - imported <- block - } - - for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - select { - case <-imported: - case <-time.After(time.Second): - t.Fatalf("block %d: import timeout", len(hashes)-i) - } - } - // Wait for all the imports to complete and check count - verifyImportCount(t, imported, overlap) - verifyChainHeight(t, tester, uint64(len(hashes)-1)) -} - -// Tests that announces already being retrieved will not be duplicated. -func TestPendingDeduplication64(t *testing.T) { testPendingDeduplication(t) } - -func testPendingDeduplication(t *testing.T) { - // Create a hash and corresponding block - hashes, blocks := makeChain(1, 0, genesis) - - // Assemble a tester with a built in counter and delayed fetcher - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("repeater", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("repeater", blocks, 0) - - delay := 50 * time.Millisecond - counter := uint32(0) - headerWrapper := func(hash common.Hash) error { - atomic.AddUint32(&counter, 1) - - // Simulate a long running fetch - go func() { - time.Sleep(delay) - headerFetcher(hash) - }() - return nil - } - checkNonExist := func() bool { - return tester.getBlock(hashes[0]) == nil - } - // Announce the same block many times until it's fetched (wait for any pending ops) - for checkNonExist() { - tester.fetcher.Notify("repeater", hashes[0], 1, time.Now().Add(-arriveTimeout), headerWrapper, bodyFetcher) - time.Sleep(time.Millisecond) - } - time.Sleep(delay) - - // Check that all blocks were imported and none fetched twice - if int(counter) != 1 { - t.Fatalf("retrieval count mismatch: have %v, want %v", counter, 1) - } - verifyChainHeight(t, tester, 1) -} - -// Tests that announcements retrieved in a random order are cached and eventually -// imported when all the gaps are filled in. -func TestRandomArrivalImport(t *testing.T) { testRandomArrivalImport(t) } - -func testRandomArrivalImport(t *testing.T) { - // Create a chain of blocks to import, and choose one to delay - targetBlocks := maxQueueDist - hashes, blocks := makeChain(targetBlocks, 0, genesis) - skip := targetBlocks / 2 - - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - // Iteratively announce blocks, skipping one entry - imported := make(chan interface{}, len(hashes)-1) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { - if block == nil { - t.Fatalf("Fetcher try to import empty block") - } - imported <- block - } - for i := len(hashes) - 1; i >= 0; i-- { - if i != skip { - tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - time.Sleep(time.Millisecond) - } - } - // Finally announce the skipped entry and check full import - tester.fetcher.Notify("valid", hashes[skip], uint64(len(hashes)-skip-1), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - verifyImportCount(t, imported, len(hashes)-1) - verifyChainHeight(t, tester, uint64(len(hashes)-1)) -} - -// Tests that direct block enqueues (due to block propagation vs. hash announce) -// are correctly schedule, filling and import queue gaps. -func TestQueueGapFill(t *testing.T) { - // Create a chain of blocks to import, and choose one to not announce at all - targetBlocks := maxQueueDist - hashes, blocks := makeChain(targetBlocks, 0, genesis) - skip := targetBlocks / 2 - - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - // Iteratively announce blocks, skipping one entry - imported := make(chan interface{}, len(hashes)-1) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { imported <- block } - - for i := len(hashes) - 1; i >= 0; i-- { - if i != skip { - tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - time.Sleep(time.Millisecond) - } - } - // Fill the missing block directly as if propagated - tester.fetcher.Enqueue("valid", blocks[hashes[skip]]) - verifyImportCount(t, imported, len(hashes)-1) - verifyChainHeight(t, tester, uint64(len(hashes)-1)) -} - -// Tests that blocks arriving from various sources (multiple propagations, hash -// announces, etc) do not get scheduled for import multiple times. -func TestImportDeduplication(t *testing.T) { - // Create two blocks to import (one for duplication, the other for stalling) - hashes, blocks := makeChain(2, 0, genesis) - - // Create the tester and wrap the importer with a counter - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - counter := uint32(0) - tester.fetcher.insertChain = func(blocks types.Blocks) (int, error) { - atomic.AddUint32(&counter, uint32(len(blocks))) - return tester.insertChain(blocks) - } - // Instrument the fetching and imported events - fetching := make(chan []common.Hash) - imported := make(chan interface{}, len(hashes)-1) - tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- hashes } - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { imported <- block } - - // Announce the duplicating block, wait for retrieval, and also propagate directly - tester.fetcher.Notify("valid", hashes[0], 1, time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - <-fetching - - tester.fetcher.Enqueue("valid", blocks[hashes[0]]) - tester.fetcher.Enqueue("valid", blocks[hashes[0]]) - tester.fetcher.Enqueue("valid", blocks[hashes[0]]) - - // Fill the missing block directly as if propagated, and check import uniqueness - tester.fetcher.Enqueue("valid", blocks[hashes[1]]) - verifyImportCount(t, imported, 2) - - if counter != 2 { - t.Fatalf("import invocation count mismatch: have %v, want %v", counter, 2) - } -} - -// Tests that blocks with numbers much lower or higher than out current head get -// discarded to prevent wasting resources on useless blocks from faulty peers. -func TestDistantPropagationDiscarding(t *testing.T) { - // Create a long chain to import and define the discard boundaries - hashes, blocks := makeChain(3*maxQueueDist, 0, genesis) - head := hashes[len(hashes)/2] - - low, high := len(hashes)/2+maxUncleDist+1, len(hashes)/2-maxQueueDist-1 - - // Create a tester and simulate a head block being the middle of the above chain - tester := newTester() - defer tester.fetcher.Stop() - - tester.lock.Lock() - tester.hashes = []common.Hash{head} - tester.blocks = map[common.Hash]*types.Block{head: blocks[head]} - tester.lock.Unlock() - - // Ensure that a block with a lower number than the threshold is discarded - tester.fetcher.Enqueue("lower", blocks[hashes[low]]) - time.Sleep(10 * time.Millisecond) - if !tester.fetcher.queue.Empty() { - t.Fatalf("fetcher queued stale block") - } - // Ensure that a block with a higher number than the threshold is discarded - tester.fetcher.Enqueue("higher", blocks[hashes[high]]) - time.Sleep(10 * time.Millisecond) - if !tester.fetcher.queue.Empty() { - t.Fatalf("fetcher queued future block") - } -} - -// Tests that announcements with numbers much lower or higher than out current -// head get discarded to prevent wasting resources on useless blocks from faulty -// peers. -func TestDistantAnnouncementDiscarding(t *testing.T) { testDistantAnnouncementDiscarding(t) } - -func testDistantAnnouncementDiscarding(t *testing.T) { - // Create a long chain to import and define the discard boundaries - hashes, blocks := makeChain(3*maxQueueDist, 0, genesis) - head := hashes[len(hashes)/2] - - low, high := len(hashes)/2+maxUncleDist+1, len(hashes)/2-maxQueueDist-1 - - // Create a tester and simulate a head block being the middle of the above chain - tester := newTester() - defer tester.fetcher.Stop() - - tester.lock.Lock() - tester.hashes = []common.Hash{head} - tester.headers = map[common.Hash]*types.Header{head: blocks[head].Header()} - tester.blocks = map[common.Hash]*types.Block{head: blocks[head]} - tester.lock.Unlock() - - headerFetcher := tester.makeHeaderFetcher("lower", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("lower", blocks, 0) - - fetching := make(chan struct{}, 2) - tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- struct{}{} } - - // Ensure that a block with a lower number than the threshold is discarded - tester.fetcher.Notify("lower", hashes[low], blocks[hashes[low]].NumberU64(), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - select { - case <-time.After(50 * time.Millisecond): - case <-fetching: - t.Fatalf("fetcher requested stale header") - } - // Ensure that a block with a higher number than the threshold is discarded - tester.fetcher.Notify("higher", hashes[high], blocks[hashes[high]].NumberU64(), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - select { - case <-time.After(50 * time.Millisecond): - case <-fetching: - t.Fatalf("fetcher requested future header") - } -} - -// Tests that peers announcing blocks with invalid numbers (i.e. not matching -// the headers provided afterwards) get dropped as malicious. -func TestInvalidNumberAnnouncement(t *testing.T) { testInvalidNumberAnnouncement(t) } - -func testInvalidNumberAnnouncement(t *testing.T) { - // Create a single block to import and check numbers against - hashes, blocks := makeChain(1, 0, genesis) - - tester := newTester() - defer tester.fetcher.Stop() - badHeaderFetcher := tester.makeHeaderFetcher("bad", blocks, -gatherSlack) - badBodyFetcher := tester.makeBodyFetcher("bad", blocks, 0) - - imported := make(chan interface{}) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { - if block == nil { - t.Fatalf("Fetcher try to import empty block") - } - imported <- block - } - // Announce a block with a bad number, check for immediate drop - tester.fetcher.Notify("bad", hashes[0], 2, time.Now().Add(-arriveTimeout), badHeaderFetcher, badBodyFetcher) - verifyImportEvent(t, imported, false) - - tester.lock.RLock() - dropped := tester.drops["bad"] - tester.lock.RUnlock() - - if !dropped { - t.Fatalf("peer with invalid numbered announcement not dropped") - } - - goodHeaderFetcher := tester.makeHeaderFetcher("good", blocks, -gatherSlack) - goodBodyFetcher := tester.makeBodyFetcher("good", blocks, 0) - // Make sure a good announcement passes without a drop - tester.fetcher.Notify("good", hashes[0], 1, time.Now().Add(-arriveTimeout), goodHeaderFetcher, goodBodyFetcher) - verifyImportEvent(t, imported, true) - - tester.lock.RLock() - dropped = tester.drops["good"] - tester.lock.RUnlock() - - if dropped { - t.Fatalf("peer with valid numbered announcement dropped") - } - verifyImportDone(t, imported) -} - -// Tests that if a block is empty (i.e. header only), no body request should be -// made, and instead the header should be assembled into a whole block in itself. -func TestEmptyBlockShortCircuit(t *testing.T) { - // Create a chain of blocks to import - hashes, blocks := makeChain(32, 0, genesis) - - tester := newTester() - defer tester.fetcher.Stop() - headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - // Add a monitoring hook for all internal events - fetching := make(chan []common.Hash) - tester.fetcher.fetchingHook = func(hashes []common.Hash) { fetching <- hashes } - - completing := make(chan []common.Hash) - tester.fetcher.completingHook = func(hashes []common.Hash) { completing <- hashes } - - imported := make(chan interface{}) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { - if block == nil { - t.Fatalf("Fetcher try to import empty block") - } - imported <- block - } - // Iteratively announce blocks until all are imported - for i := len(hashes) - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), headerFetcher, bodyFetcher) - - // All announces should fetch the header - verifyFetchingEvent(t, fetching, true) - - // Only blocks with data contents should request bodies - verifyCompletingEvent(t, completing, len(blocks[hashes[i]].Transactions()) > 0 || len(blocks[hashes[i]].Uncles()) > 0) - - // Irrelevant of the construct, import should succeed - verifyImportEvent(t, imported, true) - } - verifyImportDone(t, imported) -} - -// Tests that a peer is unable to use unbounded memory with sending infinite -// block announcements to a node, but that even in the face of such an attack, -// the fetcher remains operational. -func TestHashMemoryExhaustionAttack(t *testing.T) { - // Create a tester with instrumented import hooks - tester := newTester() - defer tester.fetcher.Stop() - - imported, announces := make(chan interface{}), int32(0) - tester.fetcher.importedHook = func(header *types.Header, block *types.Block) { imported <- block } - tester.fetcher.announceChangeHook = func(hash common.Hash, added bool) { - if added { - atomic.AddInt32(&announces, 1) - } else { - atomic.AddInt32(&announces, -1) - } - } - // Create a valid chain and an infinite junk chain - targetBlocks := hashLimit + 2*maxQueueDist - hashes, blocks := makeChain(targetBlocks, 0, genesis) - validHeaderFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack) - validBodyFetcher := tester.makeBodyFetcher("valid", blocks, 0) - - attack, _ := makeChain(targetBlocks, 0, unknownBlock) - attackerHeaderFetcher := tester.makeHeaderFetcher("attacker", nil, -gatherSlack) - attackerBodyFetcher := tester.makeBodyFetcher("attacker", nil, 0) - - // Feed the tester a huge hashset from the attacker, and a limited from the valid peer - for i := 0; i < len(attack); i++ { - if i < maxQueueDist { - tester.fetcher.Notify("valid", hashes[len(hashes)-2-i], uint64(i+1), time.Now(), validHeaderFetcher, validBodyFetcher) - } - tester.fetcher.Notify("attacker", attack[i], 1 /* don't distance drop */, time.Now(), attackerHeaderFetcher, attackerBodyFetcher) - } - if count := atomic.LoadInt32(&announces); count != hashLimit+maxQueueDist { - t.Fatalf("queued announce count mismatch: have %d, want %d", count, hashLimit+maxQueueDist) - } - // Wait for fetches to complete - verifyImportCount(t, imported, maxQueueDist) - - // Feed the remaining valid hashes to ensure DOS protection state remains clean - for i := len(hashes) - maxQueueDist - 2; i >= 0; i-- { - tester.fetcher.Notify("valid", hashes[i], uint64(len(hashes)-i-1), time.Now().Add(-arriveTimeout), validHeaderFetcher, validBodyFetcher) - verifyImportEvent(t, imported, true) - } - verifyImportDone(t, imported) -} - -// Tests that blocks sent to the fetcher (either through propagation or via hash -// announces and retrievals) don't pile up indefinitely, exhausting available -// system memory. -func TestBlockMemoryExhaustionAttack(t *testing.T) { - // Create a tester with instrumented import hooks - tester := newTester() - defer tester.fetcher.Stop() - - imported, enqueued := make(chan interface{}, 1), int32(0) - tester.fetcher.importedHook = func(_ *types.Header, block *types.Block) { imported <- block } - tester.fetcher.queueChangeHook = func(hash common.Hash, added bool) { - if added { - atomic.AddInt32(&enqueued, 1) - } else { - atomic.AddInt32(&enqueued, -1) - } - } - // Create a valid chain and a batch of dangling (but in range) blocks - targetBlocks := hashLimit + 2*maxQueueDist - hashes, blocks := makeChain(targetBlocks, 0, genesis) - attack := make(map[common.Hash]*types.Block) - for i := byte(0); len(attack) < blockLimit+2*maxQueueDist; i++ { - hashes, blocks := makeChain(maxQueueDist-1, i, unknownBlock) - for _, hash := range hashes[:maxQueueDist-2] { - attack[hash] = blocks[hash] - } - } - // Try to feed all the attacker blocks make sure only a limited batch is accepted - for _, block := range attack { - tester.fetcher.Enqueue("attacker", block) - } - if queued := atomic.LoadInt32(&enqueued); queued != blockLimit && queued != blockLimit-1 { - t.Fatalf("queued block count mismatch: have %d, want %d or %d", queued, blockLimit, blockLimit-1) - } - // Queue up a batch of valid blocks, and check that a new peer is allowed to do so - for i := 0; i < maxQueueDist-1; i++ { - tester.fetcher.Enqueue("valid", blocks[hashes[len(hashes)-3-i]]) - } - if queued := atomic.LoadInt32(&enqueued); queued != blockLimit+maxQueueDist-1 && queued != blockLimit+maxQueueDist-2 { - t.Fatalf("queued block count mismatch: have %d, want %d or %d", queued, blockLimit+maxQueueDist-1, blockLimit+maxQueueDist-2) - } - // Insert the missing piece (and sanity check the import) - tester.fetcher.Enqueue("valid", blocks[hashes[len(hashes)-2]]) - verifyImportCount(t, imported, maxQueueDist) - // Insert the remaining blocks in chunks to ensure clean DOS protection - for i := maxQueueDist; i < len(hashes)-1; i++ { - tester.fetcher.Enqueue("valid", blocks[hashes[len(hashes)-2-i]]) - verifyImportEvent(t, imported, true) - } - verifyImportDone(t, imported) -} diff --git a/eth/fetcher/tx_fetcher.go b/eth/fetcher/tx_fetcher.go deleted file mode 100644 index 24095bf3e56..00000000000 --- a/eth/fetcher/tx_fetcher.go +++ /dev/null @@ -1,896 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package fetcher - -import ( - "bytes" - "fmt" - mrand "math/rand" - "sort" - "time" - - mapset "github.com/deckarep/golang-set" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/common/mclock" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/log/v3" - //"github.com/ledgerwatch/erigon/metrics" -) - -const ( - // maxTxAnnounces is the maximum number of unique transaction a peer - // can announce in a short time. - maxTxAnnounces = 4096 - - // maxTxRetrievals is the maximum transaction number can be fetched in one - // request. The rationale to pick 256 is: - // - In eth protocol, the softResponseLimit is 2MB. Nowadays according to - // Etherscan the average transaction size is around 200B, so in theory - // we can include lots of transaction in a single protocol packet. - // - However the maximum size of a single transaction is raised to 128KB, - // so pick a middle value here to ensure we can maximize the efficiency - // of the retrieval and response size overflow won't happen in most cases. - maxTxRetrievals = 256 - - // maxTxUnderpricedSetSize is the size of the underpriced transaction set that - // is used to track recent transactions that have been dropped so we don't - // re-request them. - maxTxUnderpricedSetSize = 32768 - - // txArriveTimeout is the time allowance before an announced transaction is - // explicitly requested. - txArriveTimeout = 500 * time.Millisecond - - // txGatherSlack is the interval used to collate almost-expired announces - // with network fetches. - txGatherSlack = 100 * time.Millisecond -) - -var ( - // txFetchTimeout is the maximum allotted time to return an explicitly - // requested transaction. - txFetchTimeout = 5 * time.Second -) - -var ( -//txAnnounceInMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/announces/in", nil) -//txAnnounceKnownMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/announces/known", nil) -//txAnnounceUnderpricedMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/announces/underpriced", nil) -//txAnnounceDOSMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/announces/dos", nil) - -//txBroadcastInMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/broadcasts/in", nil) -//txBroadcastKnownMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/broadcasts/known", nil) -//txBroadcastUnderpricedMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/broadcasts/underpriced", nil) -//txBroadcastOtherRejectMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/broadcasts/otherreject", nil) - -//txRequestOutMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/request/out", nil) -//txRequestFailMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/request/fail", nil) -//txRequestDoneMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/request/done", nil) -//txRequestTimeoutMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/request/timeout", nil) - -//txReplyInMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/replies/in", nil) -//txReplyKnownMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/replies/known", nil) -//txReplyUnderpricedMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/replies/underpriced", nil) -//txReplyOtherRejectMeter = metrics.NewRegisteredMeter("eth/fetcher/transaction/replies/otherreject", nil) - -//txFetcherWaitingPeers = metrics.NewRegisteredGauge("eth/fetcher/transaction/waiting/peers", nil) -//txFetcherWaitingHashes = metrics.NewRegisteredGauge("eth/fetcher/transaction/waiting/hashes", nil) -//txFetcherQueueingPeers = metrics.NewRegisteredGauge("eth/fetcher/transaction/queueing/peers", nil) -//txFetcherQueueingHashes = metrics.NewRegisteredGauge("eth/fetcher/transaction/queueing/hashes", nil) -//txFetcherFetchingPeers = metrics.NewRegisteredGauge("eth/fetcher/transaction/fetching/peers", nil) -//txFetcherFetchingHashes = metrics.NewRegisteredGauge("eth/fetcher/transaction/fetching/hashes", nil) -) - -// txAnnounce is the notification of the availability of a batch -// of new transactions in the network. -type txAnnounce struct { - origin string // Identifier of the peer originating the notification - hashes []common.Hash // Batch of transaction hashes being announced -} - -// txRequest represents an in-flight transaction retrieval request destined to -// a specific peers. -type txRequest struct { - hashes []common.Hash // Transactions having been requested - stolen map[common.Hash]struct{} // Deliveries by someone else (don't re-request) - time mclock.AbsTime // Timestamp of the request -} - -// txDelivery is the notification that a batch of transactions have been added -// to the pool and should be untracked. -type txDelivery struct { - origin string // Identifier of the peer originating the notification - hashes []common.Hash // Batch of transaction hashes having been delivered - direct bool // Whether this is a direct reply or a broadcast -} - -// txDrop is the notiication that a peer has disconnected. -type txDrop struct { - peer string -} - -// TxFetcher is responsible for retrieving new transaction based on announcements. -// -// The fetcher operates in 3 stages: -// - Transactions that are newly discovered are moved into a wait list. -// - After ~500ms passes, transactions from the wait list that have not been -// broadcast to us in whole are moved into a queueing area. -// - When a connected peer doesn't have in-flight retrieval requests, any -// transaction queued up (and announced by the peer) are allocated to the -// peer and moved into a fetching status until it's fulfilled or fails. -// -// The invariants of the fetcher are: -// - Each tracked transaction (hash) must only be present in one of the -// three stages. This ensures that the fetcher operates akin to a finite -// state automata and there's do data leak. -// - Each peer that announced transactions may be scheduled retrievals, but -// only ever one concurrently. This ensures we can immediately know what is -// missing from a reply and reschedule it. -type TxFetcher struct { - notify chan *txAnnounce - cleanup chan *txDelivery - drop chan *txDrop - quit chan struct{} - - underpriced mapset.Set // Transactions discarded as too cheap (don't re-fetch) - - // ID 1: Waiting lists for newly discovered transactions that might be - // broadcast without needing explicit request/reply round trips. - waitlist map[common.Hash]map[string]struct{} // Transactions waiting for an potential broadcast - waittime map[common.Hash]mclock.AbsTime // Timestamps when transactions were added to the waitlist - waitslots map[string]map[common.Hash]struct{} // Waiting announcement sgroupped by peer (DoS protection) - - // ID 2: Queue of transactions that waiting to be allocated to some peer - // to be retrieved directly. - announces map[string]map[common.Hash]struct{} // Set of announced transactions, grouped by origin peer - announced map[common.Hash]map[string]struct{} // Set of download locations, grouped by transaction hash - - // ID 3: Set of transactions currently being retrieved, some which may be - // fulfilled and some rescheduled. Note, this step shares 'announces' from the - // previous stage to avoid having to duplicate (need it for DoS checks). - fetching map[common.Hash]string // Transaction set currently being retrieved - requests map[string]*txRequest // In-flight transaction retrievals - alternates map[common.Hash]map[string]struct{} // In-flight transaction alternate origins if retrieval fails - - // Callbacks - hasTx func(common.Hash) bool // Retrieves a tx from the local txpool - addTxs func([]types.Transaction) []error // Insert a batch of transactions into local txpool - fetchTxs func(string, []common.Hash) error // Retrieves a set of txs from a remote peer - - step chan struct{} // Notification channel when the fetcher loop iterates - clock mclock.Clock // Time wrapper to simulate in tests - rand *mrand.Rand // Randomizer to use in tests instead of map range loops (soft-random) -} - -// NewTxFetcher creates a transaction fetcher to retrieve transaction -// based on hash announcements. -func NewTxFetcher(hasTx func(common.Hash) bool, addTxs func([]types.Transaction) []error, fetchTxs func(string, []common.Hash) error) *TxFetcher { - return NewTxFetcherForTests(hasTx, addTxs, fetchTxs, mclock.System{}, nil) -} - -// NewTxFetcherForTests is a testing method to mock out the realtime clock with -// a simulated version and the internal randomness with a deterministic one. -func NewTxFetcherForTests( - hasTx func(common.Hash) bool, addTxs func([]types.Transaction) []error, fetchTxs func(string, []common.Hash) error, - clock mclock.Clock, rand *mrand.Rand) *TxFetcher { - return &TxFetcher{ - notify: make(chan *txAnnounce), - cleanup: make(chan *txDelivery), - drop: make(chan *txDrop), - quit: make(chan struct{}), - waitlist: make(map[common.Hash]map[string]struct{}), - waittime: make(map[common.Hash]mclock.AbsTime), - waitslots: make(map[string]map[common.Hash]struct{}), - announces: make(map[string]map[common.Hash]struct{}), - announced: make(map[common.Hash]map[string]struct{}), - fetching: make(map[common.Hash]string), - requests: make(map[string]*txRequest), - alternates: make(map[common.Hash]map[string]struct{}), - underpriced: mapset.NewSet(), - hasTx: hasTx, - addTxs: addTxs, - fetchTxs: fetchTxs, - clock: clock, - rand: rand, - } -} - -// Notify announces the fetcher of the potential availability of a new batch of -// transactions in the network. -func (f *TxFetcher) Notify(peer string, hashes []common.Hash) error { - // Keep track of all the announced transactions - //txAnnounceInMeter.Mark(int64(len(hashes))) - - // Skip any transaction announcements that we already know of, or that we've - // previously marked as cheap and discarded. This check is of course racey, - // because multiple concurrent notifies will still manage to pass it, but it's - // still valuable to check here because it runs concurrent to the internal - // loop, so anything caught here is time saved internally. - var ( - unknowns = make([]common.Hash, 0, len(hashes)) - duplicate, underpriced int64 - ) - for _, hash := range hashes { - switch { - case f.hasTx(hash): - duplicate++ - - case f.underpriced.Contains(hash): - underpriced++ - - default: - unknowns = append(unknowns, hash) - } - } - //txAnnounceKnownMeter.Mark(duplicate) - //txAnnounceUnderpricedMeter.Mark(underpriced) - - // If anything's left to announce, push it into the internal loop - if len(unknowns) == 0 { - return nil - } - announce := &txAnnounce{ - origin: peer, - hashes: unknowns, - } - select { - case f.notify <- announce: - return nil - case <-f.quit: - return errTerminated - } -} - -// Enqueue imports a batch of received transaction into the transaction pool -// and the fetcher. This method may be called by both transaction broadcasts and -// direct request replies. The differentiation is important so the fetcher can -// re-shedule missing transactions as soon as possible. -func (f *TxFetcher) Enqueue(peer string, txs []types.Transaction, direct bool) error { - // Keep track of all the propagated transactions - //if direct { - // txReplyInMeter.Mark(int64(len(txs))) - //} else { - // txBroadcastInMeter.Mark(int64(len(txs))) - //} - // Push all the transactions into the pool, tracking underpriced ones to avoid - // re-requesting them and dropping the peer in case of malicious transfers. - var ( - added = make([]common.Hash, 0, len(txs)) - duplicate int64 - underpriced int64 - otherreject int64 - ) - errs := f.addTxs(txs) - for i, err := range errs { - if err != nil { - // Track the transaction hash if the price is too low for us. - // Avoid re-request this transaction when we receive another - // announcement. - if err == core.ErrUnderpriced || err == core.ErrReplaceUnderpriced { - for f.underpriced.Cardinality() >= maxTxUnderpricedSetSize { - f.underpriced.Pop() - } - f.underpriced.Add(txs[i].Hash()) - } - // Track a few interesting failure types - switch err { - case nil: // Noop, but need to handle to not count these - - case core.ErrAlreadyKnown: - duplicate++ - - case core.ErrUnderpriced, core.ErrReplaceUnderpriced: - underpriced++ - - default: - otherreject++ - } - } - added = append(added, txs[i].Hash()) - } - //if direct { - // txReplyKnownMeter.Mark(duplicate) - // txReplyUnderpricedMeter.Mark(underpriced) - // txReplyOtherRejectMeter.Mark(otherreject) - //} else { - // txBroadcastKnownMeter.Mark(duplicate) - // txBroadcastUnderpricedMeter.Mark(underpriced) - // txBroadcastOtherRejectMeter.Mark(otherreject) - //} - select { - case f.cleanup <- &txDelivery{origin: peer, hashes: added, direct: direct}: - return nil - case <-f.quit: - return errTerminated - } -} - -// Drop should be called when a peer disconnects. It cleans up all the internal -// data structures of the given node. -func (f *TxFetcher) Drop(peer string) error { - select { - case f.drop <- &txDrop{peer: peer}: - return nil - case <-f.quit: - return errTerminated - } -} - -// Start boots up the announcement based synchroniser, accepting and processing -// hash notifications and block fetches until termination requested. -func (f *TxFetcher) Start() { - go f.loop() -} - -// Stop terminates the announcement based synchroniser, canceling all pending -// operations. -func (f *TxFetcher) Stop() { - common.SafeClose(f.quit) -} - -func (f *TxFetcher) loop() { - defer debug.LogPanic() - var ( - waitTimer = new(mclock.Timer) - timeoutTimer = new(mclock.Timer) - - waitTrigger = make(chan struct{}, 1) - timeoutTrigger = make(chan struct{}, 1) - ) - for { - select { - case ann := <-f.notify: - // Drop part of the new announcements if there are too many accumulated. - // Note, we could but do not filter already known transactions here as - // the probability of something arriving between this call and the pre- - // filter outside is essentially zero. - used := len(f.waitslots[ann.origin]) + len(f.announces[ann.origin]) - if used >= maxTxAnnounces { - // This can happen if a set of transactions are requested but not - // all fulfilled, so the remainder are rescheduled without the cap - // check. Should be fine as the limit is in the thousands and the - // request size in the hundreds. - //txAnnounceDOSMeter.Mark(int64(len(ann.hashes))) - break - } - want := used + len(ann.hashes) - if want > maxTxAnnounces { - //txAnnounceDOSMeter.Mark(int64(want - maxTxAnnounces)) - ann.hashes = ann.hashes[:want-maxTxAnnounces] - } - // All is well, schedule the remainder of the transactions - idleWait := len(f.waittime) == 0 - _, oldPeer := f.announces[ann.origin] - - for _, hash := range ann.hashes { - // If the transaction is already downloading, add it to the list - // of possible alternates (in case the current retrieval fails) and - // also account it for the peer. - if f.alternates[hash] != nil { - f.alternates[hash][ann.origin] = struct{}{} - - // ID 2 and 3 share the set of origins per tx - if announces := f.announces[ann.origin]; announces != nil { - announces[hash] = struct{}{} - } else { - f.announces[ann.origin] = map[common.Hash]struct{}{hash: {}} - } - continue - } - // If the transaction is not downloading, but is already queued - // from a different peer, track it for the new peer too. - if f.announced[hash] != nil { - f.announced[hash][ann.origin] = struct{}{} - - // ID 2 and 3 share the set of origins per tx - if announces := f.announces[ann.origin]; announces != nil { - announces[hash] = struct{}{} - } else { - f.announces[ann.origin] = map[common.Hash]struct{}{hash: {}} - } - continue - } - // If the transaction is already known to the fetcher, but not - // yet downloading, add the peer as an alternate origin in the - // waiting list. - if f.waitlist[hash] != nil { - f.waitlist[hash][ann.origin] = struct{}{} - - if waitslots := f.waitslots[ann.origin]; waitslots != nil { - waitslots[hash] = struct{}{} - } else { - f.waitslots[ann.origin] = map[common.Hash]struct{}{hash: {}} - } - continue - } - // Transaction unknown to the fetcher, insert it into the waiting list - f.waitlist[hash] = map[string]struct{}{ann.origin: {}} - f.waittime[hash] = f.clock.Now() - - if waitslots := f.waitslots[ann.origin]; waitslots != nil { - waitslots[hash] = struct{}{} - } else { - f.waitslots[ann.origin] = map[common.Hash]struct{}{hash: {}} - } - } - // If a new item was added to the waitlist, schedule it into the fetcher - if idleWait && len(f.waittime) > 0 { - f.rescheduleWait(waitTimer, waitTrigger) - } - // If this peer is new and announced something already queued, maybe - // request transactions from them - if !oldPeer && len(f.announces[ann.origin]) > 0 { - f.scheduleFetches(timeoutTimer, timeoutTrigger, map[string]struct{}{ann.origin: {}}) - } - - case <-waitTrigger: - // At least one transaction's waiting time ran out, push all expired - // ones into the retrieval queues - actives := make(map[string]struct{}) - for hash, instance := range f.waittime { - if time.Duration(f.clock.Now()-instance)+txGatherSlack > txArriveTimeout { - // Transaction expired without propagation, schedule for retrieval - if f.announced[hash] != nil { - panic("announce tracker already contains waitlist item") - } - f.announced[hash] = f.waitlist[hash] - for peer := range f.waitlist[hash] { - if announces := f.announces[peer]; announces != nil { - announces[hash] = struct{}{} - } else { - f.announces[peer] = map[common.Hash]struct{}{hash: {}} - } - delete(f.waitslots[peer], hash) - if len(f.waitslots[peer]) == 0 { - delete(f.waitslots, peer) - } - actives[peer] = struct{}{} - } - delete(f.waittime, hash) - delete(f.waitlist, hash) - } - } - // If transactions are still waiting for propagation, reschedule the wait timer - if len(f.waittime) > 0 { - f.rescheduleWait(waitTimer, waitTrigger) - } - // If any peers became active and are idle, request transactions from them - if len(actives) > 0 { - f.scheduleFetches(timeoutTimer, timeoutTrigger, actives) - } - - case <-timeoutTrigger: - // Clean up any expired retrievals and avoid re-requesting them from the - // same peer (either overloaded or malicious, useless in both cases). We - // could also penalize (Drop), but there's nothing to gain, and if could - // possibly further increase the load on it. - for peer, req := range f.requests { - if time.Duration(f.clock.Now()-req.time)+txGatherSlack > txFetchTimeout { - //txRequestTimeoutMeter.Mark(int64(len(req.hashes))) - - // Reschedule all the not-yet-delivered fetches to alternate peers - for _, hash := range req.hashes { - // Skip rescheduling hashes already delivered by someone else - if req.stolen != nil { - if _, ok := req.stolen[hash]; ok { - continue - } - } - // Move the delivery back from fetching to queued - if _, ok := f.announced[hash]; ok { - panic("announced tracker already contains alternate item") - } - if f.alternates[hash] != nil { // nil if tx was broadcast during fetch - f.announced[hash] = f.alternates[hash] - } - delete(f.announced[hash], peer) - if len(f.announced[hash]) == 0 { - delete(f.announced, hash) - } - delete(f.announces[peer], hash) - delete(f.alternates, hash) - delete(f.fetching, hash) - } - if len(f.announces[peer]) == 0 { - delete(f.announces, peer) - } - // Keep track of the request as dangling, but never expire - f.requests[peer].hashes = nil - } - } - // Schedule a new transaction retrieval - f.scheduleFetches(timeoutTimer, timeoutTrigger, nil) - - // No idea if we scheduled something or not, trigger the timer if needed - // TODO(karalabe): this is kind of lame, can't we dump it into scheduleFetches somehow? - f.rescheduleTimeout(timeoutTimer, timeoutTrigger) - - case delivery := <-f.cleanup: - // Independent if the delivery was direct or broadcast, remove all - // traces of the hash from internal trackers - for _, hash := range delivery.hashes { - if _, ok := f.waitlist[hash]; ok { - for peer, txset := range f.waitslots { - delete(txset, hash) - if len(txset) == 0 { - delete(f.waitslots, peer) - } - } - delete(f.waitlist, hash) - delete(f.waittime, hash) - } else { - for peer, txset := range f.announces { - delete(txset, hash) - if len(txset) == 0 { - delete(f.announces, peer) - } - } - delete(f.announced, hash) - delete(f.alternates, hash) - - // If a transaction currently being fetched from a different - // origin was delivered (delivery stolen), mark it so the - // actual delivery won't double schedule it. - if origin, ok := f.fetching[hash]; ok && (origin != delivery.origin || !delivery.direct) { - stolen := f.requests[origin].stolen - if stolen == nil { - f.requests[origin].stolen = make(map[common.Hash]struct{}) - stolen = f.requests[origin].stolen - } - stolen[hash] = struct{}{} - } - delete(f.fetching, hash) - } - } - // In case of a direct delivery, also reschedule anything missing - // from the original query - if delivery.direct { - // Mark the reqesting successful (independent of individual status) - //txRequestDoneMeter.Mark(int64(len(delivery.hashes))) - - // Make sure something was pending, nuke it - req := f.requests[delivery.origin] - if req == nil { - log.Warn("Unexpected transaction delivery", "peer", delivery.origin) - break - } - delete(f.requests, delivery.origin) - - // Anything not delivered should be re-scheduled (with or without - // this peer, depending on the response cutoff) - delivered := make(map[common.Hash]struct{}) - for _, hash := range delivery.hashes { - delivered[hash] = struct{}{} - } - cutoff := len(req.hashes) // If nothing is delivered, assume everything is missing, don't retry!!! - for i, hash := range req.hashes { - if _, ok := delivered[hash]; ok { - cutoff = i - } - } - // Reschedule missing hashes from alternates, not-fulfilled from alt+self - for i, hash := range req.hashes { - // Skip rescheduling hashes already delivered by someone else - if req.stolen != nil { - if _, ok := req.stolen[hash]; ok { - continue - } - } - if _, ok := delivered[hash]; !ok { - if i < cutoff { - delete(f.alternates[hash], delivery.origin) - delete(f.announces[delivery.origin], hash) - if len(f.announces[delivery.origin]) == 0 { - delete(f.announces, delivery.origin) - } - } - if len(f.alternates[hash]) > 0 { - if _, ok := f.announced[hash]; ok { - panic(fmt.Sprintf("announced tracker already contains alternate item: %v", f.announced[hash])) - } - f.announced[hash] = f.alternates[hash] - } - } - delete(f.alternates, hash) - delete(f.fetching, hash) - } - // Something was delivered, try to rechedule requests - f.scheduleFetches(timeoutTimer, timeoutTrigger, nil) // Partial delivery may enable others to deliver too - } - - case drop := <-f.drop: - // A peer was dropped, remove all traces of it - if _, ok := f.waitslots[drop.peer]; ok { - for hash := range f.waitslots[drop.peer] { - delete(f.waitlist[hash], drop.peer) - if len(f.waitlist[hash]) == 0 { - delete(f.waitlist, hash) - delete(f.waittime, hash) - } - } - delete(f.waitslots, drop.peer) - if len(f.waitlist) > 0 { - f.rescheduleWait(waitTimer, waitTrigger) - } - } - // Clean up any active requests - var request *txRequest - if request = f.requests[drop.peer]; request != nil { - for _, hash := range request.hashes { - // Skip rescheduling hashes already delivered by someone else - if request.stolen != nil { - if _, ok := request.stolen[hash]; ok { - continue - } - } - // Undelivered hash, reschedule if there's an alternative origin available - delete(f.alternates[hash], drop.peer) - if len(f.alternates[hash]) == 0 { - delete(f.alternates, hash) - } else { - f.announced[hash] = f.alternates[hash] - delete(f.alternates, hash) - } - delete(f.fetching, hash) - } - delete(f.requests, drop.peer) - } - // Clean up general announcement tracking - if _, ok := f.announces[drop.peer]; ok { - for hash := range f.announces[drop.peer] { - delete(f.announced[hash], drop.peer) - if len(f.announced[hash]) == 0 { - delete(f.announced, hash) - } - } - delete(f.announces, drop.peer) - } - // If a request was cancelled, check if anything needs to be rescheduled - if request != nil { - f.scheduleFetches(timeoutTimer, timeoutTrigger, nil) - f.rescheduleTimeout(timeoutTimer, timeoutTrigger) - } - - case <-f.quit: - return - } - // No idea what happened, but bump some sanity metrics - //txFetcherWaitingPeers.Update(int64(len(f.waitslots))) - //txFetcherWaitingHashes.Update(int64(len(f.waitlist))) - //txFetcherQueueingPeers.Update(int64(len(f.announces) - len(f.requests))) - //txFetcherQueueingHashes.Update(int64(len(f.announced))) - //txFetcherFetchingPeers.Update(int64(len(f.requests))) - //txFetcherFetchingHashes.Update(int64(len(f.fetching))) - - // Loop did something, ping the step notifier if needed (tests) - if f.step != nil { - f.step <- struct{}{} - } - } -} - -// rescheduleWait iterates over all the transactions currently in the waitlist -// and schedules the movement into the fetcher for the earliest. -// -// The method has a granularity of 'gatherSlack', since there's not much point in -// spinning over all the transactions just to maybe find one that should trigger -// a few ms earlier. -func (f *TxFetcher) rescheduleWait(timer *mclock.Timer, trigger chan struct{}) { - if *timer != nil { - (*timer).Stop() - } - now := f.clock.Now() - - earliest := now - for _, instance := range f.waittime { - if earliest > instance { - earliest = instance - if txArriveTimeout-time.Duration(now-earliest) < gatherSlack { - break - } - } - } - *timer = f.clock.AfterFunc(txArriveTimeout-time.Duration(now-earliest), func() { - trigger <- struct{}{} - }) -} - -// rescheduleTimeout iterates over all the transactions currently in flight and -// schedules a cleanup run when the first would trigger. -// -// The method has a granularity of 'gatherSlack', since there's not much point in -// spinning over all the transactions just to maybe find one that should trigger -// a few ms earlier. -// -// This method is a bit "flaky" "by design". In theory the timeout timer only ever -// should be rescheduled if some request is pending. In practice, a timeout will -// cause the timer to be rescheduled every 5 secs (until the peer comes through or -// disconnects). This is a limitation of the fetcher code because we don't trac -// pending requests and timed out requests separatey. Without double tracking, if -// we simply didn't reschedule the timer on all-timeout then the timer would never -// be set again since len(request) > 0 => something's running. -func (f *TxFetcher) rescheduleTimeout(timer *mclock.Timer, trigger chan struct{}) { - if *timer != nil { - (*timer).Stop() - } - now := f.clock.Now() - - earliest := now - for _, req := range f.requests { - // If this request already timed out, skip it altogether - if req.hashes == nil { - continue - } - if earliest > req.time { - earliest = req.time - if txFetchTimeout-time.Duration(now-earliest) < gatherSlack { - break - } - } - } - *timer = f.clock.AfterFunc(txFetchTimeout-time.Duration(now-earliest), func() { - trigger <- struct{}{} - }) -} - -// scheduleFetches starts a batch of retrievals for all available idle peers. -func (f *TxFetcher) scheduleFetches(timer *mclock.Timer, timeout chan struct{}, whitelist map[string]struct{}) { - // Gather the set of peers we want to retrieve from (default to all) - actives := whitelist - if actives == nil { - actives = make(map[string]struct{}) - for peer := range f.announces { - actives[peer] = struct{}{} - } - } - if len(actives) == 0 { - return - } - // For each active peer, try to schedule some transaction fetches - idle := len(f.requests) == 0 - - f.forEachPeer(actives, func(peer string) { - if f.requests[peer] != nil { - return // continue in the for-each - } - if len(f.announces[peer]) == 0 { - return // continue in the for-each - } - hashes := make([]common.Hash, 0, maxTxRetrievals) - f.forEachHash(f.announces[peer], func(hash common.Hash) bool { - if _, ok := f.fetching[hash]; !ok { - // Mark the hash as fetching and stash away possible alternates - f.fetching[hash] = peer - - if _, ok := f.alternates[hash]; ok { - panic(fmt.Sprintf("alternate tracker already contains fetching item: %v", f.alternates[hash])) - } - f.alternates[hash] = f.announced[hash] - delete(f.announced, hash) - - // Accumulate the hash and stop if the limit was reached - hashes = append(hashes, hash) - if len(hashes) >= maxTxRetrievals { - return false // break in the for-each - } - } - return true // continue in the for-each - }) - // If any hashes were allocated, request them from the peer - if len(hashes) > 0 { - f.requests[peer] = &txRequest{hashes: hashes, time: f.clock.Now()} - //txRequestOutMeter.Mark(int64(len(hashes))) - - go func(peer string, hashes []common.Hash) { - // Try to fetch the transactions, but in case of a request - // failure (e.g. peer disconnected), reschedule the hashes. - if err := f.fetchTxs(peer, hashes); err != nil { - //txRequestFailMeter.Mark(int64(len(hashes))) - f.Drop(peer) //nolint:errcheck - } - }(peer, hashes) - } - }) - // If a new request was fired, schedule a timeout timer - if idle && len(f.requests) > 0 { - f.rescheduleTimeout(timer, timeout) - } -} - -// forEachPeer does a range loop over a map of peers in production, but during -// testing it does a deterministic sorted random to allow reproducing issues. -func (f *TxFetcher) forEachPeer(peers map[string]struct{}, do func(peer string)) { - // If we're running production, use whatever Go's map gives us - if f.rand == nil { - for peer := range peers { - do(peer) - } - return - } - // We're running the test suite, make iteration deterministic - list := make([]string, 0, len(peers)) - for peer := range peers { - list = append(list, peer) - } - sort.Strings(list) - rotateStrings(list, f.rand.Intn(len(list))) - for _, peer := range list { - do(peer) - } -} - -// forEachHash does a range loop over a map of hashes in production, but during -// testing it does a deterministic sorted random to allow reproducing issues. -func (f *TxFetcher) forEachHash(hashes map[common.Hash]struct{}, do func(hash common.Hash) bool) { - // If we're running production, use whatever Go's map gives us - if f.rand == nil { - for hash := range hashes { - if !do(hash) { - return - } - } - return - } - // We're running the test suite, make iteration deterministic - list := make([]common.Hash, 0, len(hashes)) - for hash := range hashes { - list = append(list, hash) - } - sortHashes(list) - rotateHashes(list, f.rand.Intn(len(list))) - for _, hash := range list { - if !do(hash) { - return - } - } -} - -// rotateStrings rotates the contents of a slice by n steps. This method is only -// used in tests to simulate random map iteration but keep it deterministic. -func rotateStrings(slice []string, n int) { - orig := make([]string, len(slice)) - copy(orig, slice) - - for i := 0; i < len(orig); i++ { - slice[i] = orig[(i+n)%len(orig)] - } -} - -// sortHashes sorts a slice of hashes. This method is only used in tests in order -// to simulate random map iteration but keep it deterministic. -func sortHashes(slice []common.Hash) { - for i := 0; i < len(slice); i++ { - for j := i + 1; j < len(slice); j++ { - if bytes.Compare(slice[i][:], slice[j][:]) > 0 { - slice[i], slice[j] = slice[j], slice[i] - } - } - } -} - -// rotateHashes rotates the contents of a slice by n steps. This method is only -// used in tests to simulate random map iteration but keep it deterministic. -func rotateHashes(slice []common.Hash, n int) { - orig := make([]common.Hash, len(slice)) - copy(orig, slice) - - for i := 0; i < len(orig); i++ { - slice[i] = orig[(i+n)%len(orig)] - } -} diff --git a/eth/fetcher/tx_fetcher_test.go b/eth/fetcher/tx_fetcher_test.go deleted file mode 100644 index 70ff19c245e..00000000000 --- a/eth/fetcher/tx_fetcher_test.go +++ /dev/null @@ -1,1529 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package fetcher - -import ( - "errors" - "math/rand" - "testing" - "time" - - "github.com/holiman/uint256" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/mclock" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/types" -) - -var ( - // testTxs is a set of transactions to use during testing that have meaningful hashes. - testTxs = []types.Transaction{ - types.NewTransaction(5577006791947779410, common.Address{0x0f}, new(uint256.Int), 0, new(uint256.Int), nil), - types.NewTransaction(15352856648520921629, common.Address{0xbb}, new(uint256.Int), 0, new(uint256.Int), nil), - types.NewTransaction(3916589616287113937, common.Address{0x86}, new(uint256.Int), 0, new(uint256.Int), nil), - types.NewTransaction(9828766684487745566, common.Address{0xac}, new(uint256.Int), 0, new(uint256.Int), nil), - } - // testTxsHashes is the hashes of the test transactions above - testTxsHashes = []common.Hash{testTxs[0].Hash(), testTxs[1].Hash(), testTxs[2].Hash(), testTxs[3].Hash()} -) - -type doTxNotify struct { - peer string - hashes []common.Hash -} -type doTxEnqueue struct { - peer string - txs []types.Transaction - direct bool -} -type doWait struct { - time time.Duration - step bool -} -type doDrop string -type doFunc func() - -type isWaiting map[string][]common.Hash -type isScheduled struct { - tracking map[string][]common.Hash - fetching map[string][]common.Hash - dangling map[string][]common.Hash -} -type isUnderpriced int - -// txFetcherTest represents a test scenario that can be executed by the test -// runner. -type txFetcherTest struct { - init func() *TxFetcher - steps []interface{} -} - -// Tests that transaction announcements are added to a waitlist, and none -// of them are scheduled for retrieval until the wait expires. -func TestTransactionFetcherWaiting(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Initial announcement to get something into the waitlist - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}, {0x02}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }), - // Announce from a new peer to check that no overwrite happens - doTxNotify{peer: "B", hashes: []common.Hash{{0x03}, {0x04}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - "B": {{0x03}, {0x04}}, - }), - // Announce clashing hashes but unique new peer - doTxNotify{peer: "C", hashes: []common.Hash{{0x01}, {0x04}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - "B": {{0x03}, {0x04}}, - "C": {{0x01}, {0x04}}, - }), - // Announce existing and clashing hashes from existing peer - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}, {0x03}, {0x05}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}, {0x03}, {0x05}}, - "B": {{0x03}, {0x04}}, - "C": {{0x01}, {0x04}}, - }), - isScheduled{tracking: nil, fetching: nil}, - - // Wait for the arrival timeout which should move all expired items - // from the wait list to the scheduler - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}, {0x03}, {0x05}}, - "B": {{0x03}, {0x04}}, - "C": {{0x01}, {0x04}}, - }, - fetching: map[string][]common.Hash{ // Depends on deterministic test randomizer - "A": {{0x02}, {0x03}, {0x05}}, - "C": {{0x01}, {0x04}}, - }, - }, - // Queue up a non-fetchable transaction and then trigger it with a new - // peer (weird case to test 1 line in the fetcher) - doTxNotify{peer: "C", hashes: []common.Hash{{0x06}, {0x07}}}, - isWaiting(map[string][]common.Hash{ - "C": {{0x06}, {0x07}}, - }), - doWait{time: txArriveTimeout, step: true}, - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}, {0x03}, {0x05}}, - "B": {{0x03}, {0x04}}, - "C": {{0x01}, {0x04}, {0x06}, {0x07}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x02}, {0x03}, {0x05}}, - "C": {{0x01}, {0x04}}, - }, - }, - doTxNotify{peer: "D", hashes: []common.Hash{{0x06}, {0x07}}}, - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}, {0x03}, {0x05}}, - "B": {{0x03}, {0x04}}, - "C": {{0x01}, {0x04}, {0x06}, {0x07}}, - "D": {{0x06}, {0x07}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x02}, {0x03}, {0x05}}, - "C": {{0x01}, {0x04}}, - "D": {{0x06}, {0x07}}, - }, - }, - }, - }) -} - -// Tests that transaction announcements skip the waiting list if they are -// already scheduled. -func TestTransactionFetcherSkipWaiting(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}, {0x02}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - // Announce overlaps from the same peer, ensure the new ones end up - // in stage one, and clashing ones don't get double tracked - doTxNotify{peer: "A", hashes: []common.Hash{{0x02}, {0x03}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x03}}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - // Announce overlaps from a new peer, ensure new transactions end up - // in stage one and clashing ones get tracked for the new peer - doTxNotify{peer: "B", hashes: []common.Hash{{0x02}, {0x03}, {0x04}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x03}}, - "B": {{0x03}, {0x04}}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - "B": {{0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - }, - }) -} - -// Tests that only a single transaction request gets scheduled to a peer -// and subsequent announces block or get allotted to someone else. -func TestTransactionFetcherSingletonRequesting(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}, {0x02}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - // Announce a new set of transactions from the same peer and ensure - // they do not start fetching since the peer is already busy - doTxNotify{peer: "A", hashes: []common.Hash{{0x03}, {0x04}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x03}, {0x04}}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}, {0x03}, {0x04}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - // Announce a duplicate set of transactions from a new peer and ensure - // uniquely new ones start downloading, even if clashing. - doTxNotify{peer: "B", hashes: []common.Hash{{0x02}, {0x03}, {0x05}, {0x06}}}, - isWaiting(map[string][]common.Hash{ - "B": {{0x05}, {0x06}}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}, {0x03}, {0x04}}, - "B": {{0x02}, {0x03}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - "B": {{0x03}}, - }, - }, - }, - }) -} - -// Tests that if a transaction retrieval fails, all the transactions get -// instantly schedule back to someone else or the announcements dropped -// if no alternate source is available. -func TestTransactionFetcherFailedRescheduling(t *testing.T) { - // Create a channel to control when tx requests can fail - proceed := make(chan struct{}) - - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(origin string, hashes []common.Hash) error { - <-proceed - return errors.New("peer disconnected") - }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}, {0x02}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - // While the original peer is stuck in the request, push in an second - // data source. - doTxNotify{peer: "B", hashes: []common.Hash{{0x02}}}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - "B": {{0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - }, - // Wait until the original request fails and check that transactions - // are either rescheduled or dropped - doFunc(func() { - proceed <- struct{}{} // Allow peer A to return the failure - }), - doWait{time: 0, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "B": {{0x02}}, - }, - fetching: map[string][]common.Hash{ - "B": {{0x02}}, - }, - }, - doFunc(func() { - proceed <- struct{}{} // Allow peer B to return the failure - }), - doWait{time: 0, step: true}, - isWaiting(nil), - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that if a transaction retrieval succeeds, all alternate origins -// are cleaned up. -func TestTransactionFetcherCleanup(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - // Request should be delivered - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}, direct: true}, - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that if a transaction retrieval succeeds, but the response is empty (no -// transactions available, then all are nuked instead of being rescheduled (yes, -// this was a bug)). -func TestTransactionFetcherCleanupEmpty(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - // Deliver an empty response and ensure the transaction is cleared, not rescheduled - doTxEnqueue{peer: "A", txs: []types.Transaction{}, direct: true}, - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that non-returned transactions are either re-scheduled from a -// different peer, or self if they are after the cutoff point. -func TestTransactionFetcherMissingRescheduling(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0], testTxsHashes[1], testTxsHashes[2]}}, - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1], testTxsHashes[2]}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1], testTxsHashes[2]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1], testTxsHashes[2]}, - }, - }, - // Deliver the middle transaction requested, the one before which - // should be dropped and the one after re-requested. - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}, direct: true}, // This depends on the deterministic random - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[2]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[2]}, - }, - }, - }, - }) -} - -// Tests that out of two transactions, if one is missing and the last is -// delivered, the peer gets properly cleaned out from the internal state. -func TestTransactionFetcherMissingCleanup(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0], testTxsHashes[1]}}, - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1]}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1]}, - }, - }, - // Deliver the middle transaction requested, the one before which - // should be dropped and the one after re-requested. - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[1]}, direct: true}, // This depends on the deterministic random - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that transaction broadcasts properly clean up announcements. -func TestTransactionFetcherBroadcasts(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Set up three transactions to be in different stats, waiting, queued and fetching - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[1]}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[2]}}, - - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[2]}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - // Broadcast all the transactions and ensure everything gets cleaned - // up, but the dangling request is left alone to avoid doing multiple - // concurrent requests. - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0], testTxs[1], testTxs[2]}, direct: false}, - isWaiting(nil), - isScheduled{ - tracking: nil, - fetching: nil, - dangling: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - // Deliver the requested hashes - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0], testTxs[1], testTxs[2]}, direct: true}, - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that the waiting list timers properly reset and reschedule. -func TestTransactionFetcherWaitTimerResets(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}}, - }), - isScheduled{nil, nil, nil}, - doWait{time: txArriveTimeout / 2, step: false}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}}, - }), - isScheduled{nil, nil, nil}, - - doTxNotify{peer: "A", hashes: []common.Hash{{0x02}}}, - isWaiting(map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }), - isScheduled{nil, nil, nil}, - doWait{time: txArriveTimeout / 2, step: true}, - isWaiting(map[string][]common.Hash{ - "A": {{0x02}}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}}, - }, - }, - - doWait{time: txArriveTimeout / 2, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}}, - }, - }, - }, - }) -} - -// Tests that if a transaction request is not replied to, it will time -// out and be re-scheduled for someone else. -func TestTransactionFetcherTimeoutRescheduling(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Push an initial announcement through to the scheduled stage - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }), - isScheduled{tracking: nil, fetching: nil}, - - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - // Wait until the delivery times out, everything should be cleaned up - doWait{time: txFetchTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: nil, - fetching: nil, - dangling: map[string][]common.Hash{ - "A": {}, - }, - }, - // Ensure that followup announcements don't get scheduled - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[1]}}, - doWait{time: txArriveTimeout, step: true}, - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[1]}, - }, - fetching: nil, - dangling: map[string][]common.Hash{ - "A": {}, - }, - }, - // If the dangling request arrives a bit later, do not choke - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}, direct: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[1]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[1]}, - }, - }, - }, - }) -} - -// Tests that the fetching timeout timers properly reset and reschedule. -func TestTransactionFetcherTimeoutTimerResets(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "B", hashes: []common.Hash{{0x02}}}, - doWait{time: txArriveTimeout, step: true}, - - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}}, - "B": {{0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}}, - "B": {{0x02}}, - }, - }, - doWait{time: txFetchTimeout - txArriveTimeout, step: true}, - isScheduled{ - tracking: map[string][]common.Hash{ - "B": {{0x02}}, - }, - fetching: map[string][]common.Hash{ - "B": {{0x02}}, - }, - dangling: map[string][]common.Hash{ - "A": {}, - }, - }, - doWait{time: txArriveTimeout, step: true}, - isScheduled{ - tracking: nil, - fetching: nil, - dangling: map[string][]common.Hash{ - "A": {}, - "B": {}, - }, - }, - }, - }) -} - -// Tests that if thousands of transactions are announces, only a small -// number of them will be requested at a time. -func TestTransactionFetcherRateLimiting(t *testing.T) { - // Create a slew of transactions and to announce them - var hashes []common.Hash - for i := 0; i < maxTxAnnounces; i++ { - hashes = append(hashes, common.Hash{byte(i / 256), byte(i % 256)}) - } - - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Announce all the transactions, wait a bit and ensure only a small - // percentage gets requested - doTxNotify{peer: "A", hashes: hashes}, - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": hashes, - }, - fetching: map[string][]common.Hash{ - "A": hashes[1643 : 1643+maxTxRetrievals], - }, - }, - }, - }) -} - -// Tests that then number of transactions a peer is allowed to announce and/or -// request at the same time is hard capped. -func TestTransactionFetcherDoSProtection(t *testing.T) { - // Create a slew of transactions and to announce them - var hashesA []common.Hash - for i := 0; i < maxTxAnnounces+1; i++ { - hashesA = append(hashesA, common.Hash{0x01, byte(i / 256), byte(i % 256)}) - } - var hashesB []common.Hash - for i := 0; i < maxTxAnnounces+1; i++ { - hashesB = append(hashesB, common.Hash{0x02, byte(i / 256), byte(i % 256)}) - } - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - nil, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Announce half of the transaction and wait for them to be scheduled - doTxNotify{peer: "A", hashes: hashesA[:maxTxAnnounces/2]}, - doTxNotify{peer: "B", hashes: hashesB[:maxTxAnnounces/2-1]}, - doWait{time: txArriveTimeout, step: true}, - - // Announce the second half and keep them in the wait list - doTxNotify{peer: "A", hashes: hashesA[maxTxAnnounces/2 : maxTxAnnounces]}, - doTxNotify{peer: "B", hashes: hashesB[maxTxAnnounces/2-1 : maxTxAnnounces-1]}, - - // Ensure the hashes are split half and half - isWaiting(map[string][]common.Hash{ - "A": hashesA[maxTxAnnounces/2 : maxTxAnnounces], - "B": hashesB[maxTxAnnounces/2-1 : maxTxAnnounces-1], - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": hashesA[:maxTxAnnounces/2], - "B": hashesB[:maxTxAnnounces/2-1], - }, - fetching: map[string][]common.Hash{ - "A": hashesA[1643 : 1643+maxTxRetrievals], - "B": append(append([]common.Hash{}, hashesB[maxTxAnnounces/2-3:maxTxAnnounces/2-1]...), hashesB[:maxTxRetrievals-2]...), - }, - }, - // Ensure that adding even one more hash results in dropping the hash - doTxNotify{peer: "A", hashes: []common.Hash{hashesA[maxTxAnnounces]}}, - doTxNotify{peer: "B", hashes: hashesB[maxTxAnnounces-1 : maxTxAnnounces+1]}, - - isWaiting(map[string][]common.Hash{ - "A": hashesA[maxTxAnnounces/2 : maxTxAnnounces], - "B": hashesB[maxTxAnnounces/2-1 : maxTxAnnounces], - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": hashesA[:maxTxAnnounces/2], - "B": hashesB[:maxTxAnnounces/2-1], - }, - fetching: map[string][]common.Hash{ - "A": hashesA[1643 : 1643+maxTxRetrievals], - "B": append(append([]common.Hash{}, hashesB[maxTxAnnounces/2-3:maxTxAnnounces/2-1]...), hashesB[:maxTxRetrievals-2]...), - }, - }, - }, - }) -} - -// Tests that underpriced transactions don't get rescheduled after being rejected. -func TestTransactionFetcherUnderpricedDedup(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - errs := make([]error, len(txs)) - for i := 0; i < len(errs); i++ { - if i%2 == 0 { - errs[i] = core.ErrUnderpriced - } else { - errs[i] = core.ErrReplaceUnderpriced - } - } - return errs - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Deliver a transaction through the fetcher, but reject as underpriced - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0], testTxsHashes[1]}}, - doWait{time: txArriveTimeout, step: true}, - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0], testTxs[1]}, direct: true}, - isScheduled{nil, nil, nil}, - - // Try to announce the transaction again, ensure it's not scheduled back - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0], testTxsHashes[1], testTxsHashes[2]}}, // [2] is needed to force a step in the fetcher - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[2]}, - }), - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that underpriced transactions don't get rescheduled after being rejected, -// but at the same time there's a hard cap on the number of transactions that are -// tracked. -func TestTransactionFetcherUnderpricedDoSProtection(t *testing.T) { - // Temporarily disable fetch timeouts as they massively mess up the simulated clock - defer func(timeout time.Duration) { txFetchTimeout = timeout }(txFetchTimeout) - txFetchTimeout = 24 * time.Hour - - // Create a slew of transactions to max out the underpriced set - var txs []types.Transaction - for i := 0; i < maxTxUnderpricedSetSize+1; i++ { - txs = append(txs, types.NewTransaction(rand.Uint64(), common.Address{byte(rand.Intn(256))}, new(uint256.Int), 0, new(uint256.Int), nil)) - } - hashes := make([]common.Hash, len(txs)) - for i, tx := range txs { - hashes[i] = tx.Hash() - } - // Generate a set of steps to announce and deliver the entire set of transactions - var steps []interface{} - for i := 0; i < maxTxUnderpricedSetSize/maxTxRetrievals; i++ { - steps = append(steps, doTxNotify{peer: "A", hashes: hashes[i*maxTxRetrievals : (i+1)*maxTxRetrievals]}) - steps = append(steps, isWaiting(map[string][]common.Hash{ - "A": hashes[i*maxTxRetrievals : (i+1)*maxTxRetrievals], - })) - steps = append(steps, doWait{time: txArriveTimeout, step: true}) - steps = append(steps, isScheduled{ - tracking: map[string][]common.Hash{ - "A": hashes[i*maxTxRetrievals : (i+1)*maxTxRetrievals], - }, - fetching: map[string][]common.Hash{ - "A": hashes[i*maxTxRetrievals : (i+1)*maxTxRetrievals], - }, - }) - steps = append(steps, doTxEnqueue{peer: "A", txs: txs[i*maxTxRetrievals : (i+1)*maxTxRetrievals], direct: true}) - steps = append(steps, isWaiting(nil)) - steps = append(steps, isScheduled{nil, nil, nil}) - steps = append(steps, isUnderpriced((i+1)*maxTxRetrievals)) - } - testTransactionFetcher(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - errs := make([]error, len(txs)) - for i := 0; i < len(errs); i++ { - errs[i] = core.ErrUnderpriced - } - return errs - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: append(steps, []interface{}{ - // The preparation of the test has already been done in `steps`, add the last check - doTxNotify{peer: "A", hashes: []common.Hash{hashes[maxTxUnderpricedSetSize]}}, - doWait{time: txArriveTimeout, step: true}, - doTxEnqueue{peer: "A", txs: []types.Transaction{txs[maxTxUnderpricedSetSize]}, direct: true}, - isUnderpriced(maxTxUnderpricedSetSize), - }...), - }) -} - -// Tests that unexpected deliveries don't corrupt the internal state. -func TestTransactionFetcherOutOfBoundDeliveries(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Deliver something out of the blue - isWaiting(nil), - isScheduled{nil, nil, nil}, - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}, direct: false}, - isWaiting(nil), - isScheduled{nil, nil, nil}, - - // Set up a few hashes into various stages - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[1]}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[2]}}, - - isWaiting(map[string][]common.Hash{ - "A": {testTxsHashes[2]}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0], testTxsHashes[1]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - // Deliver everything and more out of the blue - doTxEnqueue{peer: "B", txs: []types.Transaction{testTxs[0], testTxs[1], testTxs[2], testTxs[3]}, direct: true}, - isWaiting(nil), - isScheduled{ - tracking: nil, - fetching: nil, - dangling: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - }, - }) -} - -// Tests that dropping a peer cleans out all internal data structures in all the -// live or danglng stages. -func TestTransactionFetcherDrop(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Set up a few hashes into various stages - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "A", hashes: []common.Hash{{0x02}}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "A", hashes: []common.Hash{{0x03}}}, - - isWaiting(map[string][]common.Hash{ - "A": {{0x03}}, - }), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}, {0x02}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}}, - }, - }, - // Drop the peer and ensure everything's cleaned out - doDrop("A"), - isWaiting(nil), - isScheduled{nil, nil, nil}, - - // Push the node into a dangling (timeout) state - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - fetching: map[string][]common.Hash{ - "A": {testTxsHashes[0]}, - }, - }, - doWait{time: txFetchTimeout, step: true}, - isWaiting(nil), - isScheduled{ - tracking: nil, - fetching: nil, - dangling: map[string][]common.Hash{ - "A": {}, - }, - }, - // Drop the peer and ensure everything's cleaned out - doDrop("A"), - isWaiting(nil), - isScheduled{nil, nil, nil}, - }, - }) -} - -// Tests that dropping a peer instantly reschedules failed announcements to any -// available peer. -func TestTransactionFetcherDropRescheduling(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Set up a few hashes into various stages - doTxNotify{peer: "A", hashes: []common.Hash{{0x01}}}, - doWait{time: txArriveTimeout, step: true}, - doTxNotify{peer: "B", hashes: []common.Hash{{0x01}}}, - - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "A": {{0x01}}, - "B": {{0x01}}, - }, - fetching: map[string][]common.Hash{ - "A": {{0x01}}, - }, - }, - // Drop the peer and ensure everything's cleaned out - doDrop("A"), - isWaiting(nil), - isScheduled{ - tracking: map[string][]common.Hash{ - "B": {{0x01}}, - }, - fetching: map[string][]common.Hash{ - "B": {{0x01}}, - }, - }, - }, - }) -} - -// This test reproduces a crash caught by the fuzzer. The root cause was a -// dangling transaction timing out and clashing on readd with a concurrently -// announced one. -func TestTransactionFetcherFuzzCrash01(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Get a transaction into fetching mode and make it dangling with a broadcast - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}}, - - // Notify the dangling transaction once more and crash via a timeout - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txFetchTimeout, step: true}, - }, - }) -} - -// This test reproduces a crash caught by the fuzzer. The root cause was a -// dangling transaction getting peer-dropped and clashing on readd with a -// concurrently announced one. -func TestTransactionFetcherFuzzCrash02(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Get a transaction into fetching mode and make it dangling with a broadcast - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}}, - - // Notify the dangling transaction once more, re-fetch, and crash via a drop and timeout - doTxNotify{peer: "B", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doDrop("A"), - doWait{time: txFetchTimeout, step: true}, - }, - }) -} - -// This test reproduces a crash caught by the fuzzer. The root cause was a -// dangling transaction getting rescheduled via a partial delivery, clashing -// with a concurrent notify. -func TestTransactionFetcherFuzzCrash03(t *testing.T) { - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - ) - }, - steps: []interface{}{ - // Get a transaction into fetching mode and make it dangling with a broadcast - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0], testTxsHashes[1]}}, - doWait{time: txFetchTimeout, step: true}, - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0], testTxs[1]}}, - - // Notify the dangling transaction once more, partially deliver, clash&crash with a timeout - doTxNotify{peer: "B", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[1]}, direct: true}, - doWait{time: txFetchTimeout, step: true}, - }, - }) -} - -// This test reproduces a crash caught by the fuzzer. The root cause was a -// dangling transaction getting rescheduled via a disconnect, clashing with -// a concurrent notify. -func TestTransactionFetcherFuzzCrash04(t *testing.T) { - // Create a channel to control when tx requests can fail - proceed := make(chan struct{}) - - testTransactionFetcherParallel(t, txFetcherTest{ - init: func() *TxFetcher { - return NewTxFetcher( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { - <-proceed - return errors.New("peer disconnected") - }, - ) - }, - steps: []interface{}{ - // Get a transaction into fetching mode and make it dangling with a broadcast - doTxNotify{peer: "A", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doTxEnqueue{peer: "A", txs: []types.Transaction{testTxs[0]}}, - - // Notify the dangling transaction once more, re-fetch, and crash via an in-flight disconnect - doTxNotify{peer: "B", hashes: []common.Hash{testTxsHashes[0]}}, - doWait{time: txArriveTimeout, step: true}, - doFunc(func() { - proceed <- struct{}{} // Allow peer A to return the failure - }), - doWait{time: 0, step: true}, - doWait{time: txFetchTimeout, step: true}, - }, - }) -} - -func testTransactionFetcherParallel(t *testing.T, tt txFetcherTest) { - t.Parallel() - testTransactionFetcher(t, tt) -} - -func testTransactionFetcher(t *testing.T, tt txFetcherTest) { - // Create a fetcher and hook into it's simulated fields - clock := new(mclock.Simulated) - wait := make(chan struct{}) - - fetcher := tt.init() - fetcher.clock = clock - fetcher.step = wait - fetcher.rand = rand.New(rand.NewSource(0x3a29)) - - fetcher.Start() - defer fetcher.Stop() - - // Crunch through all the test steps and execute them - for i, step := range tt.steps { - switch step := step.(type) { - case doTxNotify: - if err := fetcher.Notify(step.peer, step.hashes); err != nil { - t.Errorf("step %d: %v", i, err) - } - <-wait // Fetcher needs to process this, wait until it's done - select { - case <-wait: - panic("wtf") - case <-time.After(time.Millisecond): - } - - case doTxEnqueue: - if err := fetcher.Enqueue(step.peer, step.txs, step.direct); err != nil { - t.Errorf("step %d: %v", i, err) - } - <-wait // Fetcher needs to process this, wait until it's done - - case doWait: - clock.Run(step.time) - if step.step { - <-wait // Fetcher supposed to do something, wait until it's done - } - - case doDrop: - if err := fetcher.Drop(string(step)); err != nil { - t.Errorf("step %d: %v", i, err) - } - <-wait // Fetcher needs to process this, wait until it's done - - case doFunc: - step() - - case isWaiting: - // We need to check that the waiting list (stage 1) internals - // match with the expected set. Check the peer->hash mappings - // first. - for peer, hashes := range step { - waiting := fetcher.waitslots[peer] - if waiting == nil { - t.Errorf("step %d: peer %s missing from waitslots", i, peer) - continue - } - for _, hash := range hashes { - if _, ok := waiting[hash]; !ok { - t.Errorf("step %d, peer %s: hash %x missing from waitslots", i, peer, hash) - } - } - for hash := range waiting { - if !containsHash(hashes, hash) { - t.Errorf("step %d, peer %s: hash %x extra in waitslots", i, peer, hash) - } - } - } - for peer := range fetcher.waitslots { - if _, ok := step[peer]; !ok { - t.Errorf("step %d: peer %s extra in waitslots", i, peer) - } - } - // Peer->hash sets correct, check the hash->peer and timeout sets - for peer, hashes := range step { - for _, hash := range hashes { - if _, ok := fetcher.waitlist[hash][peer]; !ok { - t.Errorf("step %d, hash %x: peer %s missing from waitlist", i, hash, peer) - } - if _, ok := fetcher.waittime[hash]; !ok { - t.Errorf("step %d: hash %x missing from waittime", i, hash) - } - } - } - for hash, peers := range fetcher.waitlist { - if len(peers) == 0 { - t.Errorf("step %d, hash %x: empty peerset in waitlist", i, hash) - } - for peer := range peers { - if !containsHash(step[peer], hash) { - t.Errorf("step %d, hash %x: peer %s extra in waitlist", i, hash, peer) - } - } - } - for hash := range fetcher.waittime { - var found bool - for _, hashes := range step { - if containsHash(hashes, hash) { - found = true - break - } - } - if !found { - t.Errorf("step %d,: hash %x extra in waittime", i, hash) - } - } - - case isScheduled: - // Check that all scheduled announces are accounted for and no - // extra ones are present. - for peer, hashes := range step.tracking { - scheduled := fetcher.announces[peer] - if scheduled == nil { - t.Errorf("step %d: peer %s missing from announces", i, peer) - continue - } - for _, hash := range hashes { - if _, ok := scheduled[hash]; !ok { - t.Errorf("step %d, peer %s: hash %x missing from announces", i, peer, hash) - } - } - for hash := range scheduled { - if !containsHash(hashes, hash) { - t.Errorf("step %d, peer %s: hash %x extra in announces", i, peer, hash) - } - } - } - for peer := range fetcher.announces { - if _, ok := step.tracking[peer]; !ok { - t.Errorf("step %d: peer %s extra in announces", i, peer) - } - } - // Check that all announces required to be fetching are in the - // appropriate sets - for peer, hashes := range step.fetching { - request := fetcher.requests[peer] - if request == nil { - t.Errorf("step %d: peer %s missing from requests", i, peer) - continue - } - for _, hash := range hashes { - if !containsHash(request.hashes, hash) { - t.Errorf("step %d, peer %s: hash %x missing from requests", i, peer, hash) - } - } - for _, hash := range request.hashes { - if !containsHash(hashes, hash) { - t.Errorf("step %d, peer %s: hash %x extra in requests", i, peer, hash) - } - } - } - for peer := range fetcher.requests { - if _, ok := step.fetching[peer]; !ok { - if _, ok := step.dangling[peer]; !ok { - t.Errorf("step %d: peer %s extra in requests", i, peer) - } - } - } - for peer, hashes := range step.fetching { - for _, hash := range hashes { - if _, ok := fetcher.fetching[hash]; !ok { - t.Errorf("step %d, peer %s: hash %x missing from fetching", i, peer, hash) - } - } - } - for hash := range fetcher.fetching { - var found bool - for _, req := range fetcher.requests { - if containsHash(req.hashes, hash) { - found = true - break - } - } - if !found { - t.Errorf("step %d: hash %x extra in fetching", i, hash) - } - } - for _, hashes := range step.fetching { - for _, hash := range hashes { - alternates := fetcher.alternates[hash] - if alternates == nil { - t.Errorf("step %d: hash %x missing from alternates", i, hash) - continue - } - for peer := range alternates { - if _, ok := fetcher.announces[peer]; !ok { - t.Errorf("step %d: peer %s extra in alternates", i, peer) - continue - } - if _, ok := fetcher.announces[peer][hash]; !ok { - t.Errorf("step %d, peer %s: hash %x extra in alternates", i, hash, peer) - continue - } - } - for p := range fetcher.announced[hash] { - if _, ok := alternates[p]; !ok { - t.Errorf("step %d, hash %x: peer %s missing from alternates", i, hash, p) - continue - } - } - } - } - for peer, hashes := range step.dangling { - request := fetcher.requests[peer] - if request == nil { - t.Errorf("step %d: peer %s missing from requests", i, peer) - continue - } - for _, hash := range hashes { - if !containsHash(request.hashes, hash) { - t.Errorf("step %d, peer %s: hash %x missing from requests", i, peer, hash) - } - } - for _, hash := range request.hashes { - if !containsHash(hashes, hash) { - t.Errorf("step %d, peer %s: hash %x extra in requests", i, peer, hash) - } - } - } - // Check that all transaction announces that are scheduled for - // retrieval but not actively being downloaded are tracked only - // in the stage 2 `announced` map. - var queued []common.Hash - for _, hashes := range step.tracking { - for _, hash := range hashes { - var found bool - for _, hs := range step.fetching { - if containsHash(hs, hash) { - found = true - break - } - } - if !found { - queued = append(queued, hash) - } - } - } - for _, hash := range queued { - if _, ok := fetcher.announced[hash]; !ok { - t.Errorf("step %d: hash %x missing from announced", i, hash) - } - } - for hash := range fetcher.announced { - if !containsHash(queued, hash) { - t.Errorf("step %d: hash %x extra in announced", i, hash) - } - } - - case isUnderpriced: - if fetcher.underpriced.Cardinality() != int(step) { - t.Errorf("step %d: underpriced set size mismatch: have %d, want %d", i, fetcher.underpriced.Cardinality(), step) - } - - default: - t.Fatalf("step %d: unknown step type %T", i, step) - } - // After every step, cross validate the internal uniqueness invariants - // between stage one and stage two. - for hash := range fetcher.waittime { - if _, ok := fetcher.announced[hash]; ok { - t.Errorf("step %d: hash %s present in both stage 1 and 2", i, hash) - } - } - } -} - -// containsHash returns whether a hash is contained within a hash slice. -func containsHash(slice []common.Hash, hash common.Hash) bool { - for _, have := range slice { - if have == hash { - return true - } - } - return false -} diff --git a/eth/filters/api.go b/eth/filters/api.go index aa5d851dbc0..81325f650e9 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -504,7 +504,7 @@ func (args *FilterCriteria) UnmarshalJSON(data []byte) error { if strAddr, ok := addr.(string); ok { addr, err := decodeAddress(strAddr) if err != nil { - return fmt.Errorf("invalid address at index %d: %v", i, err) + return fmt.Errorf("invalid address at index %d: %w", i, err) } args.Addresses = append(args.Addresses, addr) } else { @@ -514,7 +514,7 @@ func (args *FilterCriteria) UnmarshalJSON(data []byte) error { case string: addr, err := decodeAddress(rawAddr) if err != nil { - return fmt.Errorf("invalid address: %v", err) + return fmt.Errorf("invalid address: %w", err) } args.Addresses = []common.Address{addr} default: diff --git a/eth/filters/filter.go b/eth/filters/filter.go index cd3c382b9bf..df78dffeb29 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -297,7 +297,7 @@ Logs: } // If the to filtered topics is greater than the amount of topics in logs, skip. if len(topics) > len(log.Topics) { - continue Logs + continue } for i, sub := range topics { match := len(sub) == 0 // empty rule set == wildcard diff --git a/eth/gasprice/feehistory.go b/eth/gasprice/feehistory.go new file mode 100644 index 00000000000..673f53bcec5 --- /dev/null +++ b/eth/gasprice/feehistory.go @@ -0,0 +1,297 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package gasprice + +import ( + "context" + "errors" + "fmt" + "math/big" + "sort" + "sync/atomic" + + "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/misc" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/log/v3" +) + +var ( + ErrInvalidPercentile = errors.New("invalid reward percentile") + ErrRequestBeyondHead = errors.New("request beyond head block") +) + +const ( + // maxFeeHistory is the maximum number of blocks that can be retrieved for a + // fee history request. + maxFeeHistory = 1024 +) + +// blockFees represents a single block for processing +type blockFees struct { + // set by the caller + blockNumber uint64 + header *types.Header + block *types.Block // only set if reward percentiles are requested + receipts types.Receipts + // filled by processBlock + reward []*big.Int + baseFee, nextBaseFee *big.Int + gasUsedRatio float64 + err error +} + +// txGasAndReward is sorted in ascending order based on reward +type ( + txGasAndReward struct { + gasUsed uint64 + reward *big.Int + } + sortGasAndReward []txGasAndReward +) + +func (s sortGasAndReward) Len() int { return len(s) } +func (s sortGasAndReward) Swap(i, j int) { + s[i], s[j] = s[j], s[i] +} +func (s sortGasAndReward) Less(i, j int) bool { + return s[i].reward.Cmp(s[j].reward) < 0 +} + +// processBlock takes a blockFees structure with the blockNumber, the header and optionally +// the block field filled in, retrieves the block from the backend if not present yet and +// fills in the rest of the fields. +func (oracle *Oracle) processBlock(bf *blockFees, percentiles []float64) { + chainconfig := oracle.backend.ChainConfig() + if bf.baseFee = bf.header.BaseFee; bf.baseFee == nil { + bf.baseFee = new(big.Int) + } + if chainconfig.IsLondon(uint64(bf.blockNumber + 1)) { + bf.nextBaseFee = misc.CalcBaseFee(chainconfig, bf.header) + } else { + bf.nextBaseFee = new(big.Int) + } + bf.gasUsedRatio = float64(bf.header.GasUsed) / float64(bf.header.GasLimit) + if len(percentiles) == 0 { + // rewards were not requested, return null + return + } + if bf.block == nil || (bf.receipts == nil && len(bf.block.Transactions()) != 0) { + log.Error("Block or receipts are missing while reward percentiles are requested") + return + } + + bf.reward = make([]*big.Int, len(percentiles)) + if len(bf.block.Transactions()) == 0 { + // return an all zero row if there are no transactions to gather data from + for i := range bf.reward { + bf.reward[i] = new(big.Int) + } + return + } + + sorter := make(sortGasAndReward, len(bf.block.Transactions())) + baseFee := uint256.NewInt(0) + if bf.block.BaseFee() != nil { + baseFee.SetFromBig(bf.block.BaseFee()) + } + for i, tx := range bf.block.Transactions() { + reward := tx.GetEffectiveGasTip(baseFee) + sorter[i] = txGasAndReward{gasUsed: bf.receipts[i].GasUsed, reward: reward.ToBig()} + } + sort.Sort(sorter) + + var txIndex int + sumGasUsed := sorter[0].gasUsed + + for i, p := range percentiles { + thresholdGasUsed := uint64(float64(bf.block.GasUsed()) * p / 100) + for sumGasUsed < thresholdGasUsed && txIndex < len(bf.block.Transactions())-1 { + txIndex++ + sumGasUsed += sorter[txIndex].gasUsed + } + bf.reward[i] = sorter[txIndex].reward + } +} + +// resolveBlockRange resolves the specified block range to absolute block numbers while also +// enforcing backend specific limitations. The pending block and corresponding receipts are +// also returned if requested and available. +// Note: an error is only returned if retrieving the head header has failed. If there are no +// retrievable blocks in the specified range then zero block count is returned with no error. +func (oracle *Oracle) resolveBlockRange(ctx context.Context, lastBlock rpc.BlockNumber, blocks, maxHistory int) (*types.Block, []*types.Receipt, uint64, int, error) { + var ( + headBlock rpc.BlockNumber + pendingBlock *types.Block + pendingReceipts types.Receipts + ) + // query either pending block or head header and set headBlock + if lastBlock == rpc.PendingBlockNumber { + if pendingBlock, pendingReceipts = oracle.backend.PendingBlockAndReceipts(); pendingBlock != nil { + lastBlock = rpc.BlockNumber(pendingBlock.NumberU64()) + headBlock = lastBlock - 1 + } else { + // pending block not supported by backend, process until latest block + lastBlock = rpc.LatestBlockNumber + blocks-- + if blocks == 0 { + return nil, nil, 0, 0, nil + } + } + } + if pendingBlock == nil { + // if pending block is not fetched then we retrieve the head header to get the head block number + if latestHeader, err := oracle.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber); err == nil { + headBlock = rpc.BlockNumber(latestHeader.Number.Uint64()) + } else { + return nil, nil, 0, 0, err + } + } + if lastBlock == rpc.LatestBlockNumber { + lastBlock = headBlock + } else if pendingBlock == nil && lastBlock > headBlock { + return nil, nil, 0, 0, fmt.Errorf("%w: requested %d, head %d", ErrRequestBeyondHead, lastBlock, headBlock) + } + if maxHistory != 0 { + // limit retrieval to the given number of latest blocks + if tooOldCount := int64(headBlock) - int64(maxHistory) - int64(lastBlock) + int64(blocks); tooOldCount > 0 { + // tooOldCount is the number of requested blocks that are too old to be served + if int64(blocks) > tooOldCount { + blocks -= int(tooOldCount) + } else { + return nil, nil, 0, 0, nil + } + } + } + // ensure not trying to retrieve before genesis + if rpc.BlockNumber(blocks) > lastBlock+1 { + blocks = int(lastBlock + 1) + } + return pendingBlock, pendingReceipts, uint64(lastBlock), blocks, nil +} + +// FeeHistory returns data relevant for fee estimation based on the specified range of blocks. +// The range can be specified either with absolute block numbers or ending with the latest +// or pending block. Backends may or may not support gathering data from the pending block +// or blocks older than a certain age (specified in maxHistory). The first block of the +// actually processed range is returned to avoid ambiguity when parts of the requested range +// are not available or when the head has changed during processing this request. +// Three arrays are returned based on the processed blocks: +// - reward: the requested percentiles of effective priority fees per gas of transactions in each +// block, sorted in ascending order and weighted by gas used. +// - baseFee: base fee per gas in the given block +// - gasUsedRatio: gasUsed/gasLimit in the given block +// Note: baseFee includes the next block after the newest of the returned range, because this +// value can be derived from the newest block. +func (oracle *Oracle) FeeHistory(ctx context.Context, blocks int, unresolvedLastBlock rpc.BlockNumber, rewardPercentiles []float64) (*big.Int, [][]*big.Int, []*big.Int, []float64, error) { + if blocks < 1 { + return common.Big0, nil, nil, nil, nil // returning with no data and no error means there are no retrievable blocks + } + if blocks > maxFeeHistory { + log.Warn("Sanitizing fee history length", "requested", blocks, "truncated", maxFeeHistory) + blocks = maxFeeHistory + } + for i, p := range rewardPercentiles { + if p < 0 || p > 100 { + return common.Big0, nil, nil, nil, fmt.Errorf("%w: %f", ErrInvalidPercentile, p) + } + if i > 0 && p < rewardPercentiles[i-1] { + return common.Big0, nil, nil, nil, fmt.Errorf("%w: #%d:%f > #%d:%f", ErrInvalidPercentile, i-1, rewardPercentiles[i-1], i, p) + } + } + // Only process blocks if reward percentiles were requested + maxHistory := oracle.maxHeaderHistory + if len(rewardPercentiles) != 0 { + maxHistory = oracle.maxBlockHistory + } + var ( + pendingBlock *types.Block + pendingReceipts []*types.Receipt + err error + ) + pendingBlock, pendingReceipts, lastBlock, blocks, err := oracle.resolveBlockRange(ctx, unresolvedLastBlock, blocks, maxHistory) + if err != nil || blocks == 0 { + return common.Big0, nil, nil, nil, err + } + oldestBlock := lastBlock + 1 - uint64(blocks) + + var ( + next = oldestBlock + ) + var ( + reward = make([][]*big.Int, blocks) + baseFee = make([]*big.Int, blocks+1) + gasUsedRatio = make([]float64, blocks) + firstMissing = blocks + ) + for ; blocks > 0; blocks-- { + if err = libcommon.Stopped(ctx.Done()); err != nil { + return common.Big0, nil, nil, nil, err + } + // Retrieve the next block number to fetch with this goroutine + blockNumber := atomic.AddUint64(&next, 1) - 1 + if blockNumber > lastBlock { + continue + } + + fees := &blockFees{blockNumber: blockNumber} + if pendingBlock != nil && blockNumber >= pendingBlock.NumberU64() { + fees.block, fees.receipts = pendingBlock, pendingReceipts + } else { + if len(rewardPercentiles) != 0 { + fees.block, fees.err = oracle.backend.BlockByNumber(ctx, rpc.BlockNumber(blockNumber)) + if fees.block != nil && fees.err == nil { + fees.receipts, fees.err = oracle.backend.GetReceipts(ctx, fees.block.Hash()) + } + } else { + fees.header, fees.err = oracle.backend.HeaderByNumber(ctx, rpc.BlockNumber(blockNumber)) + } + } + if fees.block != nil { + fees.header = fees.block.Header() + } + if fees.header != nil { + oracle.processBlock(fees, rewardPercentiles) + } + + if fees.err != nil { + return common.Big0, nil, nil, nil, fees.err + } + i := int(fees.blockNumber - oldestBlock) + if fees.header != nil { + reward[i], baseFee[i], baseFee[i+1], gasUsedRatio[i] = fees.reward, fees.baseFee, fees.nextBaseFee, fees.gasUsedRatio + } else { + // getting no block and no error means we are requesting into the future (might happen because of a reorg) + if i < firstMissing { + firstMissing = i + } + } + } + if firstMissing == 0 { + return common.Big0, nil, nil, nil, nil + } + if len(rewardPercentiles) != 0 { + reward = reward[:firstMissing] + } else { + reward = nil + } + baseFee, gasUsedRatio = baseFee[:firstMissing+1], gasUsedRatio[:firstMissing] + return new(big.Int).SetUint64(oldestBlock), reward, baseFee, gasUsedRatio, nil +} diff --git a/eth/gasprice/feehistory_test.go b/eth/gasprice/feehistory_test.go new file mode 100644 index 00000000000..c9b00a6f806 --- /dev/null +++ b/eth/gasprice/feehistory_test.go @@ -0,0 +1,89 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package gasprice_test + +import ( + "context" + "errors" + "testing" + + "github.com/ledgerwatch/erigon/eth/gasprice" + "github.com/ledgerwatch/erigon/rpc" +) + +func TestFeeHistory(t *testing.T) { + var cases = []struct { + pending bool + maxHeader, maxBlock int + count int + last rpc.BlockNumber + percent []float64 + expFirst uint64 + expCount int + expErr error + }{ + {false, 0, 0, 10, 30, nil, 21, 10, nil}, + {false, 0, 0, 10, 30, []float64{0, 10}, 21, 10, nil}, + {false, 0, 0, 10, 30, []float64{20, 10}, 0, 0, gasprice.ErrInvalidPercentile}, + {false, 0, 0, 1000000000, 30, nil, 0, 31, nil}, + {false, 0, 0, 1000000000, rpc.LatestBlockNumber, nil, 0, 33, nil}, + {false, 0, 0, 10, 40, nil, 0, 0, gasprice.ErrRequestBeyondHead}, + //{true, 0, 0, 10, 40, nil, 0, 0, gasprice.ErrRequestBeyondHead}, + {false, 20, 2, 100, rpc.LatestBlockNumber, nil, 13, 20, nil}, + {false, 20, 2, 100, rpc.LatestBlockNumber, []float64{0, 10}, 31, 2, nil}, + {false, 20, 2, 100, 32, []float64{0, 10}, 31, 2, nil}, + {false, 0, 0, 1, rpc.PendingBlockNumber, nil, 0, 0, nil}, + {false, 0, 0, 2, rpc.PendingBlockNumber, nil, 32, 1, nil}, + //{true, 0, 0, 2, rpc.PendingBlockNumber, nil, 32, 2, nil}, + //{true, 0, 0, 2, rpc.PendingBlockNumber, []float64{0, 10}, 32, 2, nil}, + } + for i, c := range cases { + config := gasprice.Config{ + MaxHeaderHistory: c.maxHeader, + MaxBlockHistory: c.maxBlock, + } + backend := newTestBackend(t) //, big.NewInt(16), c.pending) + oracle := gasprice.NewOracle(backend, config) + + first, reward, baseFee, ratio, err := oracle.FeeHistory(context.Background(), c.count, c.last, c.percent) + + expReward := c.expCount + if len(c.percent) == 0 { + expReward = 0 + } + expBaseFee := c.expCount + if expBaseFee != 0 { + expBaseFee++ + } + + if first.Uint64() != c.expFirst { + t.Fatalf("Test case %d: first block mismatch, want %d, got %d", i, c.expFirst, first) + } + if len(reward) != expReward { + t.Fatalf("Test case %d: reward array length mismatch, want %d, got %d", i, expReward, len(reward)) + } + if len(baseFee) != expBaseFee { + t.Fatalf("Test case %d: baseFee array length mismatch, want %d, got %d", i, expBaseFee, len(baseFee)) + } + if len(ratio) != c.expCount { + t.Fatalf("Test case %d: gasUsedRatio array length mismatch, want %d, got %d", i, c.expCount, len(ratio)) + } + if err != c.expErr && !errors.Is(err, c.expErr) { + t.Fatalf("Test case %d: error mismatch, want %v, got %v", i, c.expErr, err) + } + } +} diff --git a/eth/gasprice/gasprice.go b/eth/gasprice/gasprice.go index e102297e98a..168a4846629 100644 --- a/eth/gasprice/gasprice.go +++ b/eth/gasprice/gasprice.go @@ -39,11 +39,13 @@ var ( ) type Config struct { - Blocks int - Percentile int - Default *big.Int `toml:",omitempty"` - MaxPrice *big.Int `toml:",omitempty"` - IgnorePrice *big.Int `toml:",omitempty"` + Blocks int + Percentile int + MaxHeaderHistory int + MaxBlockHistory int + Default *big.Int `toml:",omitempty"` + MaxPrice *big.Int `toml:",omitempty"` + IgnorePrice *big.Int `toml:",omitempty"` } // OracleBackend includes all necessary background APIs for oracle. @@ -51,6 +53,9 @@ type OracleBackend interface { HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) ChainConfig() *params.ChainConfig + + GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) + PendingBlockAndReceipts() (*types.Block, types.Receipts) } // Oracle recommends gas prices based on the content of recent @@ -63,8 +68,9 @@ type Oracle struct { ignorePrice *big.Int cacheLock sync.RWMutex - checkBlocks int - percentile int + checkBlocks int + percentile int + maxHeaderHistory, maxBlockHistory int } // NewOracle returns a new gasprice oracle which can recommend suitable @@ -95,20 +101,22 @@ func NewOracle(backend OracleBackend, params Config) *Oracle { log.Warn("Sanitizing invalid gasprice oracle ignore price", "provided", params.IgnorePrice, "updated", ignorePrice) } return &Oracle{ - backend: backend, - lastPrice: params.Default, - maxPrice: maxPrice, - ignorePrice: ignorePrice, - checkBlocks: blocks, - percentile: percent, + backend: backend, + lastPrice: params.Default, + maxPrice: maxPrice, + ignorePrice: ignorePrice, + checkBlocks: blocks, + percentile: percent, + maxHeaderHistory: params.MaxHeaderHistory, + maxBlockHistory: params.MaxBlockHistory, } } -// SuggestPrice returns a TipCap so that newly created transaction can +// SuggestTipCap returns a TipCap so that newly created transaction can // have a very high chance to be included in the following blocks. // NODE: if caller wants legacy tx SuggestedPrice, we need to add // baseFee to the returned bigInt -func (gpo *Oracle) SuggestPrice(ctx context.Context) (*big.Int, error) { +func (gpo *Oracle) SuggestTipCap(ctx context.Context) (*big.Int, error) { head, _ := gpo.backend.HeaderByNumber(ctx, rpc.LatestBlockNumber) headHash := head.Hash() @@ -206,12 +214,12 @@ func (gpo *Oracle) getBlockPrices(ctx context.Context, blockNum uint64, limit in ignoreUnder, overflow := uint256.FromBig(ingoreUnderBig) if overflow { err := errors.New("overflow in getBlockPrices, gasprice.go: ignoreUnder too large") - log.Error("gasprice.go: getBlockPrices", "error", err) + log.Error("gasprice.go: getBlockPrices", "err", err) return err } block, err := gpo.backend.BlockByNumber(ctx, rpc.BlockNumber(blockNum)) if block == nil { - log.Error("gasprice.go: getBlockPrices", "error", err) + log.Error("gasprice.go: getBlockPrices", "err", err) return err } blockTxs := block.Transactions() @@ -224,7 +232,7 @@ func (gpo *Oracle) getBlockPrices(ctx context.Context, blockNum uint64, limit in baseFee, overflow = uint256.FromBig(block.BaseFee()) if overflow { err := errors.New("overflow in getBlockPrices, gasprice.go: baseFee > 2^256-1") - log.Error("gasprice.go: getBlockPrices", "error", err) + log.Error("gasprice.go: getBlockPrices", "err", err) return err } } diff --git a/eth/gasprice/gasprice_test.go b/eth/gasprice/gasprice_test.go index 05bdc5d0c8b..baeeaf31f24 100644 --- a/eth/gasprice/gasprice_test.go +++ b/eth/gasprice/gasprice_test.go @@ -40,6 +40,22 @@ type testBackend struct { cfg *params.ChainConfig } +func (b *testBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { + tx, err := b.db.BeginRo(context.Background()) + if err != nil { + return nil, err + } + defer tx.Rollback() + return rawdb.ReadReceiptsByHash(tx, hash) +} + +func (b *testBackend) PendingBlockAndReceipts() (*types.Block, types.Receipts) { + return nil, nil + //if b.pending { + // block := b.chain.GetBlockByNumber(testHead + 1) + // return block, b.chain.GetReceiptsByHash(block.Hash()) + //} +} func (b *testBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { tx, err := b.db.BeginRo(context.Background()) if err != nil { @@ -131,7 +147,7 @@ func TestSuggestPrice(t *testing.T) { oracle := gasprice.NewOracle(backend, config) // The gas price sampled is: 32G, 31G, 30G, 29G, 28G, 27G - got, err := oracle.SuggestPrice(context.Background()) + got, err := oracle.SuggestTipCap(context.Background()) if err != nil { t.Fatalf("Failed to retrieve recommended gas price: %v", err) } diff --git a/eth/integrity/trie.go b/eth/integrity/trie.go index 50c9629c98d..d3ff9a6095a 100644 --- a/eth/integrity/trie.go +++ b/eth/integrity/trie.go @@ -11,9 +11,11 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/turbo/trie" "github.com/ledgerwatch/log/v3" + "go.uber.org/atomic" ) // AssertSubset a & b == a - checks whether a is subset of b @@ -23,8 +25,11 @@ func AssertSubset(prefix []byte, a, b uint16) { } } -func Trie(tx kv.Tx, slowChecks bool, ctx context.Context) { +func Trie(db kv.RoDB, tx kv.Tx, slowChecks bool, ctx context.Context) { quit := ctx.Done() + readAheadCtx, cancel := context.WithCancel(ctx) + defer cancel() + logEvery := time.NewTicker(10 * time.Second) defer logEvery.Stop() seek := make([]byte, 256) @@ -36,17 +41,22 @@ func Trie(tx kv.Tx, slowChecks bool, ctx context.Context) { if err != nil { panic(err) } + defer c.Close() + kv.ReadAhead(readAheadCtx, db, atomic.NewBool(false), kv.TrieOfAccounts, nil, math.MaxInt32) + trieAcc2, err := tx.Cursor(kv.TrieOfAccounts) if err != nil { panic(err) } + defer trieAcc2.Close() + accC, err := tx.Cursor(kv.HashedAccounts) if err != nil { panic(err) } - defer c.Close() - defer trieAcc2.Close() defer accC.Close() + kv.ReadAhead(readAheadCtx, db, atomic.NewBool(false), kv.HashedAccounts, nil, math.MaxInt32) + for k, v, errc := c.First(); k != nil; k, v, errc = c.Next() { if errc != nil { panic(errc) @@ -145,17 +155,21 @@ func Trie(tx kv.Tx, slowChecks bool, ctx context.Context) { if err != nil { panic(err) } + defer c.Close() + kv.ReadAhead(readAheadCtx, db, atomic.NewBool(false), kv.TrieOfStorage, nil, math.MaxInt32) + trieStorage, err := tx.Cursor(kv.TrieOfStorage) if err != nil { panic(err) } + defer trieStorage.Close() + storageC, err := tx.Cursor(kv.HashedStorage) if err != nil { panic(err) } - defer c.Close() - defer trieStorage.Close() defer storageC.Close() + kv.ReadAhead(readAheadCtx, db, atomic.NewBool(false), kv.HashedStorage, nil, math.MaxInt32) for k, v, errc := c.First(); k != nil; k, v, errc = c.Next() { if errc != nil { diff --git a/eth/protocols/eth/broadcast.go b/eth/protocols/eth/broadcast.go deleted file mode 100644 index be217445825..00000000000 --- a/eth/protocols/eth/broadcast.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package eth - -import ( - "math/big" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/types" -) - -const ( - // This is the target size for the packs of transactions or announcements. A - // pack can get larger than this if a single transactions exceeds this size. - maxTxPacketSize = 100 * 1024 -) - -// blockPropagation is a block propagation event, waiting for its turn in the -// broadcast queue. -type blockPropagation struct { - block *types.Block - td *big.Int -} - -// broadcastBlocks is a write loop that multiplexes blocks and block accouncements -// to the remote peer. The goal is to have an async writer that does not lock up -// node internals and at the same time rate limits queued data. -func (p *Peer) broadcastBlocks() { - for { - select { - case prop := <-p.queuedBlocks: - if err := p.SendNewBlock(prop.block, prop.td); err != nil { - return - } - p.Log().Trace("Propagated block", "number", prop.block.Number(), "hash", prop.block.Hash(), "td", prop.td) - - case block := <-p.queuedBlockAnns: - if err := p.SendNewBlockHashes([]common.Hash{block.Hash()}, []uint64{block.NumberU64()}); err != nil { - return - } - p.Log().Trace("Announced block", "number", block.Number(), "hash", block.Hash()) - - case <-p.term: - return - } - } -} - -// broadcastTransactions is a write loop that schedules transaction broadcasts -// to the remote peer. The goal is to have an async writer that does not lock up -// node internals and at the same time rate limits queued data. -func (p *Peer) broadcastTransactions() { - var ( - queue []common.Hash // Queue of hashes to broadcast as full transactions - done chan struct{} // Non-nil if background broadcaster is running - fail = make(chan error, 1) // Channel used to receive network error - failed bool // Flag whether a send failed, discard everything onward - ) - for { - // If there's no in-flight broadcast running, check if a new one is needed - if done == nil && len(queue) > 0 { - // Pile transaction until we reach our allowed network limit - var ( - hashes []common.Hash - txs []types.Transaction - size common.StorageSize - ) - for i := 0; i < len(queue) && size < maxTxPacketSize; i++ { - if tx := p.txpool.Get(queue[i]); tx != nil { - txs = append(txs, tx) - size += tx.Size() - } - hashes = append(hashes, queue[i]) - } - queue = queue[:copy(queue, queue[len(hashes):])] - - // If there's anything available to transfer, fire up an async writer - if len(txs) > 0 { - done = make(chan struct{}) - go func() { - if err := p.SendTransactions(txs); err != nil { - fail <- err - return - } - close(done) - p.Log().Trace("Sent transactions", "count", len(txs)) - }() - } - } - // Transfer goroutine may or may not have been started, listen for events - select { - case hashes := <-p.txBroadcast: - // If the connection failed, discard all transaction events - if failed { - continue - } - // New batch of transactions to be broadcast, queue them (with cap) - queue = append(queue, hashes...) - if len(queue) > maxQueuedTxs { - // Fancy copy and resize to ensure buffer doesn't grow indefinitely - queue = queue[:copy(queue, queue[len(queue)-maxQueuedTxs:])] - } - - case <-done: - done = nil - - case <-fail: - failed = true - - case <-p.term: - return - } - } -} - -// announceTransactions is a write loop that schedules transaction broadcasts -// to the remote peer. The goal is to have an async writer that does not lock up -// node internals and at the same time rate limits queued data. -func (p *Peer) announceTransactions() { - var ( - queue []common.Hash // Queue of hashes to announce as transaction stubs - done chan struct{} // Non-nil if background announcer is running - fail = make(chan error, 1) // Channel used to receive network error - failed bool // Flag whether a send failed, discard everything onward - ) - for { - // If there's no in-flight announce running, check if a new one is needed - if done == nil && len(queue) > 0 { - // Pile transaction hashes until we reach our allowed network limit - var ( - count int - pending []common.Hash - size common.StorageSize - ) - for count = 0; count < len(queue) && size < maxTxPacketSize; count++ { - if p.txpool.Get(queue[count]) != nil { - pending = append(pending, queue[count]) - size += common.HashLength - } - } - // Shift and trim queue - queue = queue[:copy(queue, queue[count:])] - - // If there's anything available to transfer, fire up an async writer - if len(pending) > 0 { - done = make(chan struct{}) - go func() { - if err := p.sendPooledTransactionHashes(pending); err != nil { - fail <- err - return - } - close(done) - p.Log().Trace("Sent transaction announcements", "count", len(pending)) - }() - } - } - // Transfer goroutine may or may not have been started, listen for events - select { - case hashes := <-p.txAnnounce: - // If the connection failed, discard all transaction events - if failed { - continue - } - // New batch of transactions to be broadcast, queue them (with cap) - queue = append(queue, hashes...) - if len(queue) > maxQueuedTxAnns { - // Fancy copy and resize to ensure buffer doesn't grow indefinitely - queue = queue[:copy(queue, queue[len(queue)-maxQueuedTxAnns:])] - } - - case <-done: - done = nil - - case <-fail: - failed = true - - case <-p.term: - return - } - } -} diff --git a/eth/protocols/eth/discovery.go b/eth/protocols/eth/discovery.go index d88f2c5199b..4bd009da7e4 100644 --- a/eth/protocols/eth/discovery.go +++ b/eth/protocols/eth/discovery.go @@ -17,12 +17,10 @@ package eth import ( + "fmt" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/ethdb/privateapi" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/p2p/enr" "github.com/ledgerwatch/erigon/rlp" ) @@ -39,25 +37,20 @@ func (e enrEntry) ENRKey() string { return "eth" } -// StartENRUpdater starts the `eth` ENR updater loop, which listens for chain -// head events and updates the requested node record whenever a fork is passed. -func StartENRUpdater(chainConfig *params.ChainConfig, genesisHash common.Hash, events *privateapi.Events, ln *enode.LocalNode) { - events.AddHeaderSubscription(func(h *types.Header) error { - ln.Set(CurrentENREntry(chainConfig, genesisHash, h.Number.Uint64())) - return nil - }) -} - -// CurrentENREntry constructs an `eth` ENR entry based on the current state of the chain. -func CurrentENREntry(chainConfig *params.ChainConfig, genesisHash common.Hash, headHeight uint64) *enrEntry { - return &enrEntry{ - ForkID: forkid.NewID(chainConfig, genesisHash, headHeight), - } -} - // CurrentENREntryFromForks constructs an `eth` ENR entry based on the current state of the chain. func CurrentENREntryFromForks(forks []uint64, genesisHash common.Hash, headHeight uint64) *enrEntry { return &enrEntry{ ForkID: forkid.NewIDFromForks(forks, genesisHash, headHeight), } } + +func LoadENRForkID(r *enr.Record) (*forkid.ID, error) { + var entry enrEntry + if err := r.Load(&entry); err != nil { + if enr.IsNotFound(err) { + return nil, nil + } + return nil, fmt.Errorf("failed to load fork ID from ENR: %w", err) + } + return &entry.ForkID, nil +} diff --git a/eth/protocols/eth/getters_test.go b/eth/protocols/eth/getters_test.go deleted file mode 100644 index 9c4b214a8d6..00000000000 --- a/eth/protocols/eth/getters_test.go +++ /dev/null @@ -1,3 +0,0 @@ -package eth_test - -// Tests that the transaction receipts can be retrieved based on hashes. diff --git a/eth/protocols/eth/handler.go b/eth/protocols/eth/handler.go index 8466099c038..11101ecebd0 100644 --- a/eth/protocols/eth/handler.go +++ b/eth/protocols/eth/handler.go @@ -17,17 +17,11 @@ package eth import ( - "fmt" "math/big" - "time" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/p2p/enr" "github.com/ledgerwatch/erigon/params" ) @@ -54,78 +48,10 @@ const ( maxReceiptsServe = 1024 ) -// Handler is a callback to invoke from an outside runner after the boilerplate -// exchanges have passed. -type Handler func(peer *Peer) error - -// Backend defines the data retrieval methods t,o serve remote requests and the -// callback methods to invoke on remote deliveries. -type Backend interface { - DB() kv.RwDB - - // TxPool retrieves the transaction pool object to serve data. - TxPool() TxPool - - // AcceptTxs retrieves whether transaction processing is enabled on the node - // or if inbound transactions should simply be dropped. - AcceptTxs() bool - - // RunPeer is invoked when a peer joins on the `eth` protocol. The handler - // should do any peer maintenance work, handshakes and validations. If all - // is passed, control should be given back to the `handler` to process the - // inbound messages going forward. - RunPeer(peer *Peer, handler Handler) error - - // PeerInfo retrieves all known `eth` information about a peer. - PeerInfo(id enode.ID) interface{} - - // Handle is a callback to be invoked when a data packet is received from - // the remote peer. Only packets not consumed by the protocol handler will - // be forwarded to the backend. - Handle(peer *Peer, packet Packet) error -} - -// TxPool defines the methods needed by the protocol handler to serve transactions. -type TxPool interface { - // Get retrieves the the transaction from the local txpool with the given hash. - Get(hash common.Hash) types.Transaction -} - -// MakeProtocols constructs the P2P protocol definitions for `eth`. -func MakeProtocols(backend Backend, readNodeInfo func() *NodeInfo, dnsdisc enode.Iterator, chainConfig *params.ChainConfig, genesisHash common.Hash, headHeight uint64) []p2p.Protocol { - protocols := make([]p2p.Protocol, len(ProtocolVersions)) - for i, version := range ProtocolVersions { - version := version // Closure - - protocols[i] = p2p.Protocol{ - Name: ProtocolName, - Version: version, - Length: protocolLengths[version], - Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := NewPeer(version, p, rw, backend.TxPool()) - defer peer.Close() - - return backend.RunPeer(peer, func(peer *Peer) error { - return Handle(backend, peer) - }) - }, - NodeInfo: func() interface{} { - return readNodeInfo() - }, - PeerInfo: func(id enode.ID) interface{} { - return backend.PeerInfo(id) - }, - Attributes: []enr.Entry{CurrentENREntry(chainConfig, genesisHash, headHeight)}, - DialCandidates: dnsdisc, - } - } - return protocols -} - // NodeInfo represents a short summary of the `eth` sub-protocol metadata // known about the host peer. type NodeInfo struct { - Network uint64 `json:"network"` // Ethereum network ID (1=Frontier, 2=Morden, Ropsten=3, Rinkeby=4) + Network uint64 `json:"network"` // Ethereum network ID (1=Frontier, Ropsten=3, Rinkeby=4) Difficulty *big.Int `json:"difficulty"` // Total difficulty of the host's blockchain Genesis common.Hash `json:"genesis"` // SHA3 hash of the host's genesis block Config *params.ChainConfig `json:"config"` // ChainDB configuration for the fork rules @@ -134,94 +60,17 @@ type NodeInfo struct { // ReadNodeInfo retrieves some `eth` protocol metadata about the running host node. func ReadNodeInfo(getter kv.Getter, config *params.ChainConfig, genesisHash common.Hash, network uint64) *NodeInfo { - head := rawdb.ReadCurrentHeader(getter) - td, _ := rawdb.ReadTd(getter, head.Hash(), head.Number.Uint64()) + headHash := rawdb.ReadHeadHeaderHash(getter) + headNumber := rawdb.ReadHeaderNumber(getter, headHash) + var td *big.Int + if headNumber != nil { + td, _ = rawdb.ReadTd(getter, headHash, *headNumber) + } return &NodeInfo{ Network: network, Difficulty: td, Genesis: genesisHash, Config: config, - Head: head.Hash(), - } -} - -// Handle is invoked whenever an `eth` connection is made that successfully passes -// the protocol handshake. This method will keep processing messages until the -// connection is torn down. -func Handle(backend Backend, peer *Peer) error { - for { - if err := handleMessage(backend, peer); err != nil { - peer.Log().Debug("Message handling failed in `eth`", "err", err) - return err - } - } -} - -type msgHandler func(backend Backend, msg Decoder, peer *Peer) error -type Decoder interface { - Decode(val interface{}) error - Time() time.Time -} - -var eth65 = map[uint64]msgHandler{ - // old 64 messages - GetBlockHeadersMsg: handleGetBlockHeaders, - BlockHeadersMsg: handleBlockHeaders, - GetBlockBodiesMsg: handleGetBlockBodies, - BlockBodiesMsg: handleBlockBodies, - GetNodeDataMsg: handleGetNodeData, - NodeDataMsg: handleNodeData, - GetReceiptsMsg: handleGetReceipts, - ReceiptsMsg: handleReceipts, - NewBlockHashesMsg: handleNewBlockhashes, - NewBlockMsg: handleNewBlock, - TransactionsMsg: handleTransactions, - // New eth65 messages - NewPooledTransactionHashesMsg: handleNewPooledTransactionHashes, - GetPooledTransactionsMsg: handleGetPooledTransactions, - PooledTransactionsMsg: handlePooledTransactions, -} - -var eth66 = map[uint64]msgHandler{ - // eth64 announcement messages (no id) - NewBlockHashesMsg: handleNewBlockhashes, - NewBlockMsg: handleNewBlock, - TransactionsMsg: handleTransactions, - // eth65 announcement messages (no id) - NewPooledTransactionHashesMsg: handleNewPooledTransactionHashes, - // eth66 messages with request-id - GetBlockHeadersMsg: handleGetBlockHeaders66, - BlockHeadersMsg: handleBlockHeaders66, - GetBlockBodiesMsg: handleGetBlockBodies66, - BlockBodiesMsg: handleBlockBodies66, - GetNodeDataMsg: handleGetNodeData66, - NodeDataMsg: handleNodeData66, - GetReceiptsMsg: handleGetReceipts66, - ReceiptsMsg: handleReceipts66, - GetPooledTransactionsMsg: handleGetPooledTransactions66, - PooledTransactionsMsg: handlePooledTransactions66, -} - -// handleMessage is invoked whenever an inbound message is received from a remote -// peer. The remote connection is torn down upon returning any error. -func handleMessage(backend Backend, peer *Peer) error { - // Read the next message from the remote peer, and ensure it's fully consumed - msg, err := peer.rw.ReadMsg() - if err != nil { - return err - } - if msg.Size > maxMessageSize { - return fmt.Errorf("%w: %v > %v", errMsgTooLarge, msg.Size, maxMessageSize) - } - defer msg.Discard() - - var handlers = eth65 - if peer.Version() >= ETH66 { - handlers = eth66 - } - - if handler := handlers[msg.Code]; handler != nil { - return handler(backend, msg, peer) + Head: headHash, } - return fmt.Errorf("%w: %v", errInvalidMsgCode, msg.Code) } diff --git a/eth/protocols/eth/handler_test.go b/eth/protocols/eth/handler_test.go index cfcf5a0d66f..76a08335ec0 100644 --- a/eth/protocols/eth/handler_test.go +++ b/eth/protocols/eth/handler_test.go @@ -17,10 +17,7 @@ package eth_test import ( - "context" - "math" "math/big" - "math/rand" "testing" "github.com/holiman/uint256" @@ -32,8 +29,6 @@ import ( "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/erigon/turbo/stages" @@ -48,355 +43,7 @@ var ( testAddr = crypto.PubkeyToAddress(testKey.PublicKey) ) -// testBackend is a mock implementation of the live Ethereum message handler. Its -// purpose is to allow testing the request/reply workflows and wire serialization -// in the `eth` protocol without actually doing any data processing. -type testBackend struct { - db kv.RwDB - txpool *core.TxPool - headBlock *types.Block - genesis *types.Block - chainConfig *params.ChainConfig -} - -// newTestBackend creates an empty chain and wraps it into a mock backend. -func newTestBackend(t *testing.T, blocks int) *testBackend { - return newTestBackendWithGenerator(t, blocks, nil) -} - -// newTestBackend creates a chain with a number of explicitly defined blocks and -// wraps it into a mock backend. -func newTestBackendWithGenerator(t *testing.T, blocks int, generator func(int, *core.BlockGen)) *testBackend { - // Create a database pre-initialize with a genesis block - key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - m := stages.MockWithGenesis(t, &core.Genesis{ - Config: params.TestChainConfig, - Alloc: core.GenesisAlloc{testAddr: {Balance: big.NewInt(1000000)}}, - }, key) - - headBlock := m.Genesis - if blocks > 0 { - chain, _ := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, blocks, generator, true) - if err := m.InsertChain(chain); err != nil { - t.Fatalf("generate chain: %v", err) - } - headBlock = chain.TopBlock - } - txconfig := core.DefaultTxPoolConfig - txconfig.Journal = "" // Don't litter the disk with test journals - - b := &testBackend{ - db: m.DB, - txpool: core.NewTxPool(txconfig, m.ChainConfig, m.DB), - headBlock: headBlock, - genesis: m.Genesis, - chainConfig: params.TestChainConfig, - } - t.Cleanup(func() { - b.txpool.Stop() - }) - return b -} - -func (b *testBackend) DB() kv.RwDB { return b.db } -func (b *testBackend) TxPool() eth.TxPool { return b.txpool } -func (b *testBackend) RunPeer(peer *eth.Peer, handler eth.Handler) error { - // Normally the backend would do peer mainentance and handshakes. All that - // is omitted and we will just give control back to the handler. - return handler(peer) -} -func (b *testBackend) PeerInfo(enode.ID) interface{} { panic("not implemented") } - -func (b *testBackend) AcceptTxs() bool { - panic("data processing tests should be done in the handler package") -} -func (b *testBackend) Handle(*eth.Peer, eth.Packet) error { - panic("data processing tests should be done in the handler package") -} -func (b *testBackend) GetBlockHashesFromHash(tx kv.Tx, hash common.Hash, max uint64) []common.Hash { - // Get the origin header from which to fetch - header, _ := rawdb.ReadHeaderByHash(tx, hash) - if header == nil { - return nil - } - // Iterate the headers until enough is collected or the genesis reached - chain := make([]common.Hash, 0, max) - for i := uint64(0); i < max; i++ { - next := header.ParentHash - if header = rawdb.ReadHeader(tx, next, header.Number.Uint64()-1); header == nil { - break - } - chain = append(chain, next) - if header.Number.Sign() == 0 { - break - } - } - return chain -} - -// Tests that block headers can be retrieved from a remote chain based on user queries. -func TestGetBlockHeaders64(t *testing.T) { testGetBlockHeaders(t, 64) } -func TestGetBlockHeaders65(t *testing.T) { testGetBlockHeaders(t, 65) } - -func testGetBlockHeaders(t *testing.T, protocol uint) { - backend := newTestBackend(t, eth.MaxHeadersServe+15) - tx, err := backend.db.BeginRw(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - - peer, _ := newTestPeer("peer", protocol, backend) - defer peer.close() - - // Create a "random" unknown hash for testing - var unknown common.Hash - for i := range unknown { - unknown[i] = byte(i) - } - getBlockHash := func(n uint64) common.Hash { - h, _ := rawdb.ReadCanonicalHash(tx, n) - return h - - } - // Create a batch of tests for various scenarios - limit := uint64(eth.MaxHeadersServe) - tests := []struct { - query *eth.GetBlockHeadersPacket // The query to execute for header retrieval - expect []common.Hash // The hashes of the block whose headers are expected - }{ - // A single random block should be retrievable by hash and number too - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Hash: getBlockHash(limit / 2)}, Amount: 1}, - []common.Hash{getBlockHash(limit / 2)}, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: limit / 2}, Amount: 1}, - []common.Hash{getBlockHash(limit / 2)}, - }, - // Multiple headers should be retrievable in both directions - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: limit / 2}, Amount: 3}, - []common.Hash{ - getBlockHash(limit / 2), - getBlockHash(limit/2 + 1), - getBlockHash(limit/2 + 2), - }, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: limit / 2}, Amount: 3, Reverse: true}, - []common.Hash{ - getBlockHash(limit / 2), - getBlockHash(limit/2 - 1), - getBlockHash(limit/2 - 2), - }, - }, - // Multiple headers with skip lists should be retrievable - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3}, - []common.Hash{ - getBlockHash(limit / 2), - getBlockHash(limit/2 + 4), - getBlockHash(limit/2 + 8), - }, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: limit / 2}, Skip: 3, Amount: 3, Reverse: true}, - []common.Hash{ - getBlockHash(limit / 2), - getBlockHash(limit/2 - 4), - getBlockHash(limit/2 - 8), - }, - }, - // The chain endpoints should be retrievable - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: 0}, Amount: 1}, - []common.Hash{getBlockHash(0)}, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: rawdb.ReadCurrentHeader(tx).Number.Uint64()}, Amount: 1}, - []common.Hash{rawdb.ReadCurrentHeader(tx).Hash()}, - }, - // Ensure protocol limits are honored - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: rawdb.ReadCurrentHeader(tx).Number.Uint64() - 1}, Amount: limit + 10, Reverse: true}, - backend.GetBlockHashesFromHash(tx, rawdb.ReadCurrentHeader(tx).Hash(), limit), - }, - // Check that requesting more than available is handled gracefully - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: rawdb.ReadCurrentHeader(tx).Number.Uint64() - 4}, Skip: 3, Amount: 3}, - []common.Hash{ - getBlockHash(rawdb.ReadCurrentHeader(tx).Number.Uint64() - 4), - getBlockHash(rawdb.ReadCurrentHeader(tx).Number.Uint64()), - }, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: 4}, Skip: 3, Amount: 3, Reverse: true}, - []common.Hash{ - getBlockHash(4), - getBlockHash(0), - }, - }, - // Check that requesting more than available is handled gracefully, even if mid skip - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: rawdb.ReadCurrentHeader(tx).Number.Uint64() - 4}, Skip: 2, Amount: 3}, - []common.Hash{ - getBlockHash(rawdb.ReadCurrentHeader(tx).Number.Uint64() - 4), - getBlockHash(rawdb.ReadCurrentHeader(tx).Number.Uint64() - 1), - }, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: 4}, Skip: 2, Amount: 3, Reverse: true}, - []common.Hash{ - getBlockHash(4), - getBlockHash(1), - }, - }, - // Check a corner case where requesting more can iterate past the endpoints - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: 2}, Amount: 5, Reverse: true}, - []common.Hash{ - getBlockHash(2), - getBlockHash(1), - getBlockHash(0), - }, - }, - // Check a corner case where skipping overflow loops back into the chain start - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Hash: getBlockHash(3)}, Amount: 2, Reverse: false, Skip: math.MaxUint64 - 1}, - []common.Hash{ - getBlockHash(3), - }, - }, - // Check a corner case where skipping overflow loops back to the same header - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Hash: getBlockHash(1)}, Amount: 2, Reverse: false, Skip: math.MaxUint64}, - []common.Hash{ - getBlockHash(1), - }, - }, - // Check that non existing headers aren't returned - { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Hash: unknown}, Amount: 1}, - []common.Hash{}, - }, { - ð.GetBlockHeadersPacket{Origin: eth.HashOrNumber{Number: rawdb.ReadCurrentHeader(tx).Number.Uint64() + 1}, Amount: 1}, - []common.Hash{}, - }, - } - // Run each of the tests and verify the results against the chain - for i, tt := range tests { - // Collect the headers to expect in the response - var headers []*types.Header - for _, hash := range tt.expect { - h, _ := rawdb.ReadHeaderByHash(tx, hash) - - headers = append(headers, h) - } - // Send the hash request and verify the response - if err := p2p.Send(peer.app, eth.GetBlockHeadersMsg, tt.query); err != nil { - t.Fatal(err) - } - if err := p2p.ExpectMsg(peer.app, eth.BlockHeadersMsg, headers); err != nil { - t.Errorf("test %d: headers mismatch: %v", i, err) - } - // If the test used number origins, repeat with hashes as the too - if tt.query.Origin.Hash == (common.Hash{}) { - if origin := rawdb.ReadHeaderByNumber(tx, tt.query.Origin.Number); origin != nil { - tt.query.Origin.Hash, tt.query.Origin.Number = origin.Hash(), 0 - - if err := p2p.Send(peer.app, eth.GetBlockHeadersMsg, tt.query); err != nil { - t.Fatal(err) - } - if err := p2p.ExpectMsg(peer.app, eth.BlockHeadersMsg, headers); err != nil { - t.Errorf("test %d: headers mismatch: %v", i, err) - } - } - } - } -} - -// Tests that block contents can be retrieved from a remote chain based on their hashes. -func TestGetBlockBodies64(t *testing.T) { testGetBlockBodies(t, 64) } -func TestGetBlockBodies65(t *testing.T) { testGetBlockBodies(t, 65) } - -func testGetBlockBodies(t *testing.T, protocol uint) { - backend := newTestBackend(t, eth.MaxBodiesServe+15) - tx, err := backend.db.BeginRw(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - - peer, _ := newTestPeer("peer", protocol, backend) - defer peer.close() - - block1 := rawdb.ReadHeaderByNumber(tx, 1) - block10 := rawdb.ReadHeaderByNumber(tx, 10) - block100 := rawdb.ReadHeaderByNumber(tx, 100) - - // Create a batch of tests for various scenarios - limit := eth.MaxBodiesServe - tests := []struct { - random int // Number of blocks to fetch randomly from the chain - explicit []common.Hash // Explicitly requested blocks - available []bool // Availability of explicitly requested blocks - expected int // Total number of existing blocks to expect - }{ - {1, nil, nil, 1}, // A single random block should be retrievable - {10, nil, nil, 10}, // Multiple random blocks should be retrievable - {limit, nil, nil, limit}, // The maximum possible blocks should be retrievable - {limit + 1, nil, nil, limit}, // No more than the possible block count should be returned - {0, []common.Hash{backend.genesis.Hash()}, []bool{true}, 1}, // The genesis block should be retrievable - {0, []common.Hash{rawdb.ReadCurrentHeader(tx).Hash()}, []bool{true}, 1}, // The chains head block should be retrievable - {0, []common.Hash{{}}, []bool{false}, 0}, // A non existent block should not be returned - - // Existing and non-existing blocks interleaved should not cause problems - {0, []common.Hash{ - {}, - block1.Hash(), - {}, - block10.Hash(), - {}, - block100.Hash(), - {}, - }, []bool{false, true, false, true, false, true, false}, 3}, - } - // Run each of the tests and verify the results against the chain - for i, tt := range tests { - // Collect the hashes to request, and the response to expectva - var ( - hashes []common.Hash - bodies []*eth.BlockBody - seen = make(map[int64]bool) - ) - for j := 0; j < tt.random; j++ { - for { - num := rand.Int63n(int64(rawdb.ReadCurrentHeader(tx).Number.Uint64())) - if !seen[num] { - seen[num] = true - - block, _ := rawdb.ReadBlockByNumber(tx, uint64(num)) - hashes = append(hashes, block.Hash()) - if len(bodies) < tt.expected { - bodies = append(bodies, ð.BlockBody{Transactions: block.Transactions(), Uncles: block.Uncles()}) - } - break - } - } - } - for j, hash := range tt.explicit { - hashes = append(hashes, hash) - if tt.available[j] && len(bodies) < tt.expected { - block, _ := rawdb.ReadBlockByHash(tx, hash) - bodies = append(bodies, ð.BlockBody{Transactions: block.Transactions(), Uncles: block.Uncles()}) - } - } - // Send the hash request and verify the response - if err := p2p.Send(peer.app, eth.GetBlockBodiesMsg, hashes); err != nil { - t.Fatal(err) - } - if err := p2p.ExpectMsg(peer.app, eth.BlockBodiesMsg, bodies); err != nil { - t.Errorf("test %d: bodies mismatch: %v", i, err) - } - } -} - -// Tests that the transaction receipts can be retrieved based on hashes. -func TestGetBlockReceipts65(t *testing.T) { testGetBlockReceipts(t, 65) } -func TestGetBlockReceipts66(t *testing.T) { testGetBlockReceipts(t, 66) } - -func testGetBlockReceipts(t *testing.T, protocol uint) { +func TestGetBlockReceipts(t *testing.T) { // Define three accounts to simulate transactions with acc1Key, _ := crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") acc2Key, _ := crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") diff --git a/eth/protocols/eth/handlers.go b/eth/protocols/eth/handlers.go index 7ebee75e23c..ee5e2b3e74d 100644 --- a/eth/protocols/eth/handlers.go +++ b/eth/protocols/eth/handlers.go @@ -25,50 +25,11 @@ import ( "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/log/v3" ) -// handleGetBlockHeaders handles Block header query, collect the requested headers and reply -func handleGetBlockHeaders(backend Backend, msg Decoder, peer *Peer) error { - // Decode the complex header query - var query GetBlockHeadersPacket - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - tx, err := backend.DB().BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - response, err := AnswerGetBlockHeadersQuery(tx, &query) - if err != nil { - return err - } - tx.Rollback() - return peer.SendBlockHeaders(response) -} - -// handleGetBlockHeaders66 is the eth/66 version of handleGetBlockHeaders -func handleGetBlockHeaders66(backend Backend, msg Decoder, peer *Peer) error { - // Decode the complex header query - var query GetBlockHeadersPacket66 - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v", err, msg) - } - tx, err := backend.DB().BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - response, err := AnswerGetBlockHeadersQuery(tx, query.GetBlockHeadersPacket) - if err != nil { - return err - } - tx.Rollback() - return peer.ReplyBlockHeaders(query.RequestId, response) -} - -func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]*types.Header, error) { +func AnswerGetBlockHeadersQuery(db kv.Tx, query *GetBlockHeadersPacket, blockReader services.HeaderAndCanonicalReader) ([]*types.Header, error) { hashMode := query.Origin.Hash != (common.Hash{}) first := true maxNonCanonical := uint64(100) @@ -81,6 +42,7 @@ func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]* err error lookups int ) + for !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit && len(headers) < MaxHeadersServe && lookups < 2*MaxHeadersServe { lookups++ @@ -89,7 +51,7 @@ func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]* if hashMode { if first { first = false - origin, err = rawdb.ReadHeaderByHash(db, query.Origin.Hash) + origin, err = blockReader.HeaderByHash(context.Background(), db, query.Origin.Hash) if err != nil { return nil, err } @@ -97,10 +59,16 @@ func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]* query.Origin.Number = origin.Number.Uint64() } } else { - origin = rawdb.ReadHeader(db, query.Origin.Hash, query.Origin.Number) + origin, err = blockReader.Header(context.Background(), db, query.Origin.Hash, query.Origin.Number) + if err != nil { + return nil, err + } } } else { - origin = rawdb.ReadHeaderByNumber(db, query.Origin.Number) + origin, err = blockReader.HeaderByNumber(context.Background(), db, query.Origin.Number) + if err != nil { + return nil, err + } } if origin == nil { break @@ -116,7 +84,7 @@ func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]* if ancestor == 0 { unknown = true } else { - query.Origin.Hash, query.Origin.Number = rawdb.ReadAncestor(db, query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) + query.Origin.Hash, query.Origin.Number = rawdb.ReadAncestor(db, query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical, blockReader) unknown = (query.Origin.Hash == common.Hash{}) } case hashMode && !query.Reverse: @@ -131,9 +99,13 @@ func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]* log.Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next) unknown = true } else { - if header := rawdb.ReadHeaderByNumber(db, next); header != nil { + header, err := blockReader.HeaderByNumber(context.Background(), db, query.Origin.Number) + if err != nil { + return nil, err + } + if header != nil { nextHash := header.Hash() - expOldHash, _ := rawdb.ReadAncestor(db, nextHash, next, query.Skip+1, &maxNonCanonical) + expOldHash, _ := rawdb.ReadAncestor(db, nextHash, next, query.Skip+1, &maxNonCanonical, blockReader) if expOldHash == query.Origin.Hash { query.Origin.Hash, query.Origin.Number = nextHash, next } else { @@ -159,38 +131,6 @@ func AnswerGetBlockHeadersQuery(db kv.Getter, query *GetBlockHeadersPacket) ([]* return headers, nil } -func handleGetBlockBodies(backend Backend, msg Decoder, peer *Peer) error { - // Decode the block body retrieval message - var query GetBlockBodiesPacket - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - tx, err := backend.DB().BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - response := AnswerGetBlockBodiesQuery(tx, query) - tx.Rollback() - return peer.SendBlockBodiesRLP(response) -} - -func handleGetBlockBodies66(backend Backend, msg Decoder, peer *Peer) error { - // Decode the block body retrieval message - var query GetBlockBodiesPacket66 - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - tx, err := backend.DB().BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - response := AnswerGetBlockBodiesQuery(tx, query.GetBlockBodiesPacket) - tx.Rollback() - return peer.ReplyBlockBodiesRLP(query.RequestId, response) -} - func AnswerGetBlockBodiesQuery(db kv.Tx, query GetBlockBodiesPacket) []rlp.RawValue { //nolint:unparam // Gather blocks until the fetch or network limits is reached var ( @@ -206,78 +146,25 @@ func AnswerGetBlockBodiesQuery(db kv.Tx, query GetBlockBodiesPacket) []rlp.RawVa if number == nil { continue } - data := rawdb.ReadBodyRLP(db, hash, *number) - if len(data) == 0 { + canonicalHash, err := rawdb.ReadCanonicalHash(db, *number) + if err != nil { + break + } + var bodyRlP []byte + if canonicalHash == hash { + bodyRlP = rawdb.ReadBodyRLP(db, hash, *number) + } else { + bodyRlP = rawdb.NonCanonicalBodyRLP(db, hash, *number) + } + if len(bodyRlP) == 0 { continue } - bodies = append(bodies, data) - bytes += len(data) + bodies = append(bodies, bodyRlP) + bytes += len(bodyRlP) } return bodies } -func handleGetNodeData(backend Backend, msg Decoder, peer *Peer) error { - // Decode the trie node data retrieval message - var query GetNodeDataPacket - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - response := answerGetNodeDataQuery(backend, query, peer) - return peer.SendNodeData(response) -} - -func handleGetNodeData66(backend Backend, msg Decoder, peer *Peer) error { - // Decode the trie node data retrieval message - var query GetNodeDataPacket66 - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - response := answerGetNodeDataQuery(backend, query.GetNodeDataPacket, peer) - return peer.ReplyNodeData(query.RequestId, response) -} - -func answerGetNodeDataQuery(backend Backend, query GetNodeDataPacket, peer *Peer) [][]byte { - return nil -} - -func handleGetReceipts(backend Backend, msg Decoder, peer *Peer) error { - // Decode the block receipts retrieval message - var query GetReceiptsPacket - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - tx, err := backend.DB().BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - response, err := AnswerGetReceiptsQuery(tx, query) - if err != nil { - return err - } - tx.Rollback() - return peer.SendReceiptsRLP(response) -} - -func handleGetReceipts66(backend Backend, msg Decoder, peer *Peer) error { - // Decode the block receipts retrieval message - var query GetReceiptsPacket66 - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - tx, err := backend.DB().BeginRo(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - response, err := AnswerGetReceiptsQuery(tx, query.GetReceiptsPacket) - if err != nil { - return err - } - tx.Rollback() - return peer.ReplyReceiptsRLP(query.RequestId, response) -} - func AnswerGetReceiptsQuery(db kv.Tx, query GetReceiptsPacket) ([]rlp.RawValue, error) { //nolint:unparam // Gather state data until the fetch or network limits is reached var ( @@ -313,242 +200,3 @@ func AnswerGetReceiptsQuery(db kv.Tx, query GetReceiptsPacket) ([]rlp.RawValue, } return receipts, nil } - -func handleNewBlockhashes(backend Backend, msg Decoder, peer *Peer) error { - // A batch of new block announcements just arrived - ann := new(NewBlockHashesPacket) - if err := msg.Decode(ann); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - // Mark the hashes as present at the remote node - for _, block := range *ann { - peer.markBlock(block.Hash) - } - // Deliver them all to the backend for queuing - return backend.Handle(peer, ann) -} - -func handleNewBlock(backend Backend, msg Decoder, peer *Peer) error { - // Retrieve and decode the propagated block - ann := new(NewBlockPacket) - if err := msg.Decode(ann); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - if hash := types.CalcUncleHash(ann.Block.Uncles()); hash != ann.Block.UncleHash() { - log.Warn("Propagated block has invalid uncles", "have", hash, "exp", ann.Block.UncleHash()) - return nil // TODO(karalabe): return error eventually, but wait a few releases - } - if hash := types.DeriveSha(ann.Block.Transactions()); hash != ann.Block.TxHash() { - log.Warn("Propagated block has invalid body", "have", hash, "exp", ann.Block.TxHash()) - return nil // TODO(karalabe): return error eventually, but wait a few releases - } - if err := ann.sanityCheck(); err != nil { - return err - } - ann.Block.ReceivedAt = msg.Time() - ann.Block.ReceivedFrom = peer - - // Mark the peer as owning the block - peer.markBlock(ann.Block.Hash()) - - return backend.Handle(peer, ann) -} - -func handleBlockHeaders(backend Backend, msg Decoder, peer *Peer) error { - // A batch of headers arrived to one of our previous requests - res := new(BlockHeadersPacket) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, res) -} - -func handleBlockHeaders66(backend Backend, msg Decoder, peer *Peer) error { - // A batch of headers arrived to one of our previous requests - res := new(BlockHeadersPacket66) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, &res.BlockHeadersPacket) -} - -func handleBlockBodies(backend Backend, msg Decoder, peer *Peer) error { - // A batch of block bodies arrived to one of our previous requests - res := new(BlockBodiesPacket) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, res) -} - -func handleBlockBodies66(backend Backend, msg Decoder, peer *Peer) error { - // A batch of block bodies arrived to one of our previous requests - res := new(BlockBodiesPacket66) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, &res.BlockBodiesPacket) -} - -func handleNodeData(backend Backend, msg Decoder, peer *Peer) error { - // A batch of node state data arrived to one of our previous requests - res := new(NodeDataPacket) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, res) -} - -func handleNodeData66(backend Backend, msg Decoder, peer *Peer) error { - // A batch of node state data arrived to one of our previous requests - res := new(NodeDataPacket66) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, &res.NodeDataPacket) -} - -func handleReceipts(backend Backend, msg Decoder, peer *Peer) error { - // A batch of receipts arrived to one of our previous requests - res := new(ReceiptsPacket) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, res) -} - -func handleReceipts66(backend Backend, msg Decoder, peer *Peer) error { - // A batch of receipts arrived to one of our previous requests - res := new(ReceiptsPacket66) - if err := msg.Decode(res); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - return backend.Handle(peer, &res.ReceiptsPacket) -} - -func handleNewPooledTransactionHashes(backend Backend, msg Decoder, peer *Peer) error { - // New transaction announcement arrived, make sure we have - // a valid and fresh chain to handle them - if !backend.AcceptTxs() { - return nil - } - ann := new(NewPooledTransactionHashesPacket) - if err := msg.Decode(ann); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - // Schedule all the unknown hashes for retrieval - for _, hash := range *ann { - peer.markTransaction(hash) - } - return backend.Handle(peer, ann) -} - -func handleGetPooledTransactions(backend Backend, msg Decoder, peer *Peer) error { - // Decode the pooled transactions retrieval message - var query GetPooledTransactionsPacket - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - - hashes, txs := AnswerGetPooledTransactions(backend.TxPool(), query) - return peer.SendPooledTransactionsRLP(hashes, txs) -} - -func handleGetPooledTransactions66(backend Backend, msg Decoder, peer *Peer) error { - // Decode the pooled transactions retrieval message - var query GetPooledTransactionsPacket66 - if err := msg.Decode(&query); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - hashes, txs := AnswerGetPooledTransactions(backend.TxPool(), query.GetPooledTransactionsPacket) - return peer.ReplyPooledTransactionsRLP(query.RequestId, hashes, txs) -} - -func AnswerGetPooledTransactions(txPool TxPool, query GetPooledTransactionsPacket) ([]common.Hash, []rlp.RawValue) { //nolint:unparam - // Gather transactions until the fetch or network limits is reached - var ( - bytes int - hashes []common.Hash - txs []rlp.RawValue - ) - for _, hash := range query { - if bytes >= softResponseLimit { - break - } - // Retrieve the requested transaction, skipping if unknown to us - tx := txPool.Get(hash) - if tx == nil { - continue - } - // If known, encode and queue for response packet - if encoded, err := rlp.EncodeToBytes(tx); err != nil { - log.Error("Failed to encode transaction", "err", err) - } else { - hashes = append(hashes, hash) - txs = append(txs, encoded) - bytes += len(encoded) - } - } - return hashes, txs -} - -func handleTransactions(backend Backend, msg Decoder, peer *Peer) error { - // Transactions arrived, make sure we have a valid and fresh chain to handle them - if !backend.AcceptTxs() { - return nil - } - // Transactions can be processed, parse all of them and deliver to the pool - - var txs TransactionsPacket - if err := msg.Decode(&txs); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - for i, tx := range txs { - // Validate and mark the remote transaction - if tx == nil { - return fmt.Errorf("%w: transaction %d is nil", errDecode, i) - } - peer.markTransaction(tx.Hash()) - } - return backend.Handle(peer, &txs) -} - -func handlePooledTransactions(backend Backend, msg Decoder, peer *Peer) error { - // Transactions arrived, make sure we have a valid and fresh chain to handle them - if !backend.AcceptTxs() { - return nil - } - // Transactions can be processed, parse all of them and deliver to the pool - var txs PooledTransactionsPacket - if err := msg.Decode(&txs); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - for i, tx := range txs { - // Validate and mark the remote transaction - if tx == nil { - return fmt.Errorf("%w: transaction %d is nil", errDecode, i) - } - peer.markTransaction(tx.Hash()) - } - return backend.Handle(peer, &txs) -} - -func handlePooledTransactions66(backend Backend, msg Decoder, peer *Peer) error { - // Transactions arrived, make sure we have a valid and fresh chain to handle them - if !backend.AcceptTxs() { - return nil - } - // Transactions can be processed, parse all of them and deliver to the pool - var txs PooledTransactionsPacket66 - if err := msg.Decode(&txs); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - for i, tx := range txs.PooledTransactionsPacket { - // Validate and mark the remote transaction - if tx == nil { - return fmt.Errorf("%w: transaction %d is nil", errDecode, i) - } - peer.markTransaction(tx.Hash()) - } - return backend.Handle(peer, &txs.PooledTransactionsPacket) -} diff --git a/eth/protocols/eth/handshake.go b/eth/protocols/eth/handshake.go deleted file mode 100644 index d82b9acd5e5..00000000000 --- a/eth/protocols/eth/handshake.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package eth - -import ( - "fmt" - "math/big" - "time" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/p2p" -) - -const ( - // handshakeTimeout is the maximum allowed time for the `eth` handshake to - // complete before dropping the connection.= as malicious. - handshakeTimeout = 5 * time.Second -) - -// Handshake executes the eth protocol handshake, negotiating version number, -// network IDs, difficulties, head and genesis blocks. -func (p *Peer) Handshake(network uint64, td *big.Int, head common.Hash, genesis common.Hash, forkID forkid.ID, forkFilter forkid.Filter) error { - // Send out own handshake in a new thread - errc := make(chan error, 2) - - var status StatusPacket // safe to read after two values have been received from errc - - go func() { - errc <- p2p.Send(p.rw, StatusMsg, &StatusPacket{ - ProtocolVersion: uint32(p.version), - NetworkID: network, - TD: td, - Head: head, - Genesis: genesis, - ForkID: forkID, - }) - }() - go func() { - errc <- p.readStatus(network, &status, genesis, forkFilter) - }() - - timeout := time.NewTimer(handshakeTimeout) - defer timeout.Stop() - - for i := 0; i < 2; i++ { - select { - case err := <-errc: - if err != nil { - return err - } - case <-timeout.C: - return p2p.DiscReadTimeout - } - } - p.headHash = status.Head - - // TD at mainnet block #7753254 is 76 bits. If it becomes 100 million times - // larger, it will still fit within 100 bits - if tdlen := status.TD.BitLen(); tdlen > 100 { - return fmt.Errorf("too large total difficulty: bitlen %d", tdlen) - } - return nil -} - -// readStatus reads the remote handshake message. -func (p *Peer) readStatus(network uint64, status *StatusPacket, genesis common.Hash, forkFilter forkid.Filter) error { - msg, err := p.rw.ReadMsg() - if err != nil { - return err - } - if msg.Code != StatusMsg { - return fmt.Errorf("%w: first msg has code %x (!= %x)", ErrNoStatusMsg, msg.Code, StatusMsg) - } - if msg.Size > maxMessageSize { - return fmt.Errorf("%w: %v > %v", errMsgTooLarge, msg.Size, maxMessageSize) - } - // Decode the handshake and make sure everything matches - if err := msg.Decode(&status); err != nil { - return fmt.Errorf("%w: message %v: %v", errDecode, msg, err) - } - if status.NetworkID != network { - return fmt.Errorf("%w: %d (!= %d)", ErrNetworkIDMismatch, status.NetworkID, network) - } - if uint(status.ProtocolVersion) != p.version { - return fmt.Errorf("%w: %d (!= %d)", ErrProtocolVersionMismatch, status.ProtocolVersion, p.version) - } - if status.Genesis != genesis { - return fmt.Errorf("%w: %x (!= %x)", ErrGenesisMismatch, status.Genesis, genesis) - } - if err := forkFilter(status.ForkID); err != nil { - return fmt.Errorf("%w: %v", ErrForkIDRejected, err) - } - return nil -} diff --git a/eth/protocols/eth/handshake_test.go b/eth/protocols/eth/handshake_test.go deleted file mode 100644 index 357ab4d2a07..00000000000 --- a/eth/protocols/eth/handshake_test.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package eth_test - -import ( - "context" - "errors" - "fmt" - "runtime" - "testing" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/forkid" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/stretchr/testify/require" -) - -// Tests that handshake failures are detected and reported correctly. -func TestHandshake64(t *testing.T) { testHandshake(t, 64) } -func TestHandshake65(t *testing.T) { testHandshake(t, 65) } - -func testHandshake(t *testing.T, protocol uint) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") - } - - t.Parallel() - - // Create a test backend only to have some valid genesis chain - backend := newTestBackend(t, 3) - - tx, err := backend.db.BeginRw(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - var ( - genesis = backend.genesis - head = rawdb.ReadCurrentBlock(tx) - td, _ = rawdb.ReadTd(tx, head.Hash(), head.NumberU64()) - forkID = forkid.NewID(backend.chainConfig, backend.genesis.Hash(), backend.headBlock.NumberU64()) - ) - tests := []struct { - code uint64 - data interface{} - want error - }{ - { - code: eth.TransactionsMsg, data: []interface{}{}, - want: eth.ErrNoStatusMsg, - }, - { - code: eth.StatusMsg, data: eth.StatusPacket{10, 1, td, head.Hash(), genesis.Hash(), forkID}, - want: eth.ErrProtocolVersionMismatch, - }, - { - code: eth.StatusMsg, data: eth.StatusPacket{uint32(protocol), 999, td, head.Hash(), genesis.Hash(), forkID}, - want: eth.ErrNetworkIDMismatch, - }, - { - code: eth.StatusMsg, data: eth.StatusPacket{uint32(protocol), 1, td, head.Hash(), common.Hash{3}, forkID}, - want: eth.ErrGenesisMismatch, - }, - { - code: eth.StatusMsg, data: eth.StatusPacket{uint32(protocol), 1, td, head.Hash(), genesis.Hash(), forkid.ID{Hash: [4]byte{0x00, 0x01, 0x02, 0x03}}}, - want: eth.ErrForkIDRejected, - }, - } - for i, test := range tests { - // Create the two peers to shake with each other - app, net := p2p.MsgPipe() - defer app.Close() - defer net.Close() - - peer := eth.NewPeer(protocol, p2p.NewPeer(enode.ID{}, "peer", nil), net, nil) - defer peer.Close() - - // Send the junk test with one peer, check the handshake failure - go func() { - if err := p2p.Send(app, test.code, test.data); err != nil { - fmt.Printf("Could not send: %v\n", err) - } - }() - - err := peer.Handshake(1, td, head.Hash(), genesis.Hash(), forkID, forkid.NewFilter(backend.chainConfig, backend.genesis.Hash(), func() uint64 { return backend.headBlock.NumberU64() })) - if err == nil { - t.Errorf("test %d: protocol returned nil error, want %q", i, test.want) - } else if !errors.Is(err, test.want) { - t.Errorf("test %d: wrong error: got %q, want %q", i, err, test.want) - } - } -} diff --git a/eth/protocols/eth/peer.go b/eth/protocols/eth/peer.go deleted file mode 100644 index e8c986fa653..00000000000 --- a/eth/protocols/eth/peer.go +++ /dev/null @@ -1,522 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package eth - -import ( - "math/big" - "math/rand" - "sync" - - mapset "github.com/deckarep/golang-set" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/rlp" -) - -const ( - // maxKnownTxs is the maximum transactions hashes to keep in the known list - // before starting to randomly evict them. - maxKnownTxs = 32768 - - // maxKnownBlocks is the maximum block hashes to keep in the known list - // before starting to randomly evict them. - maxKnownBlocks = 1024 - - // maxQueuedTxs is the maximum number of transactions to queue up before dropping - // older broadcasts. - maxQueuedTxs = 4096 - - // maxQueuedTxAnns is the maximum number of transaction announcements to queue up - // before dropping older announcements. - maxQueuedTxAnns = 4096 - - // maxQueuedBlocks is the maximum number of block propagations to queue up before - // dropping broadcasts. There's not much point in queueing stale blocks, so a few - // that might cover uncles should be enough. - maxQueuedBlocks = 4 - - // maxQueuedBlockAnns is the maximum number of block announcements to queue up before - // dropping broadcasts. Similarly to block propagations, there's no point to queue - // above some healthy uncle limit, so use that. - maxQueuedBlockAnns = 4 -) - -// max is a helper function which returns the larger of the two given integers. -func max(a, b int) int { //nolint:unparam - if a > b { - return a - } - return b -} - -// Peer is a collection of relevant information we have about a `eth` peer. -type Peer struct { - id string // Unique ID for the peer, cached - - *p2p.Peer // The embedded P2P package peer - rw p2p.MsgReadWriter // Input/output streams for snap - version uint // Protocol version negotiated - - headHash common.Hash // Latest advertised head block hash - headNumber uint64 // Latest advertised head number - - knownBlocks mapset.Set // Set of block hashes known to be known by this peer - queuedBlocks chan *blockPropagation // Queue of blocks to broadcast to the peer - queuedBlockAnns chan *types.Block // Queue of blocks to announce to the peer - - txpool TxPool // Transaction pool used by the broadcasters for liveness checks - knownTxs mapset.Set // Set of transaction hashes known to be known by this peer - txBroadcast chan []common.Hash // Channel used to queue transaction propagation requests - txAnnounce chan []common.Hash // Channel used to queue transaction announcement requests - - term chan struct{} // Termination channel to stop the broadcasters - lock sync.RWMutex // Mutex protecting the internal fields -} - -// NewPeer create a wrapper for a network connection and negotiated protocol -// version. -func NewPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter, txpool TxPool) *Peer { - peer := &Peer{ - id: p.ID().String(), - Peer: p, - rw: rw, - version: version, - knownTxs: mapset.NewSet(), - knownBlocks: mapset.NewSet(), - queuedBlocks: make(chan *blockPropagation, maxQueuedBlocks), - queuedBlockAnns: make(chan *types.Block, maxQueuedBlockAnns), - txBroadcast: make(chan []common.Hash), - txAnnounce: make(chan []common.Hash), - txpool: txpool, - term: make(chan struct{}), - } - // Start up all the broadcasters - go peer.broadcastBlocks() - go peer.broadcastTransactions() - if version >= ETH65 { - go peer.announceTransactions() - } - return peer -} - -// Close signals the broadcast goroutine to terminate. Only ever call this if -// you created the peer yourself via NewPeer. Otherwise let whoever created it -// clean it up! -func (p *Peer) Close() { - close(p.term) -} - -// ID retrieves the peer's unique identifier. -func (p *Peer) ID() string { - return p.id -} - -// Version retrieves the peer's negoatiated `eth` protocol version. -func (p *Peer) Version() uint { - return p.version -} - -// Head retrieves the current head hash and total difficulty of the peer. -func (p *Peer) Head() (hash common.Hash, number uint64) { - p.lock.RLock() - defer p.lock.RUnlock() - - copy(hash[:], p.headHash[:]) - return hash, p.headNumber -} - -// SetHead updates the head hash and total difficulty of the peer. -func (p *Peer) SetHead(hash common.Hash, number uint64) { - p.lock.Lock() - defer p.lock.Unlock() - - copy(p.headHash[:], hash[:]) - p.headNumber = number -} - -// KnownBlock returns whether peer is known to already have a block. -func (p *Peer) KnownBlock(hash common.Hash) bool { - return p.knownBlocks.Contains(hash) -} - -// KnownTransaction returns whether peer is known to already have a transaction. -func (p *Peer) KnownTransaction(hash common.Hash) bool { - return p.knownTxs.Contains(hash) -} - -// markBlock marks a block as known for the peer, ensuring that the block will -// never be propagated to this particular peer. -func (p *Peer) markBlock(hash common.Hash) { - // If we reached the memory allowance, drop a previously known block hash - for p.knownBlocks.Cardinality() >= maxKnownBlocks { - p.knownBlocks.Pop() - } - p.knownBlocks.Add(hash) -} - -// markTransaction marks a transaction as known for the peer, ensuring that it -// will never be propagated to this particular peer. -func (p *Peer) markTransaction(hash common.Hash) { - // If we reached the memory allowance, drop a previously known transaction hash - for p.knownTxs.Cardinality() >= maxKnownTxs { - p.knownTxs.Pop() - } - p.knownTxs.Add(hash) -} - -// SendTransactions sends transactions to the peer and includes the hashes -// in its transaction hash set for future reference. -// -// This method is a helper used by the async transaction sender. Don't call it -// directly as the queueing (memory) and transmission (bandwidth) costs should -// not be managed directly. -// -// The reasons this is public is to allow packages using this protocol to write -// tests that directly send messages without having to do the asyn queueing. -func (p *Peer) SendTransactions(txs types.Transactions) error { - // Mark all the transactions as known, but ensure we don't overflow our limits - for p.knownTxs.Cardinality() > max(0, maxKnownTxs-len(txs)) { - p.knownTxs.Pop() - } - for _, tx := range txs { - p.knownTxs.Add(tx.Hash()) - } - return p2p.Send(p.rw, TransactionsMsg, txs) -} - -// AsyncSendTransactions queues a list of transactions (by hash) to eventually -// propagate to a remote peer. The number of pending sends are capped (new ones -// will force old sends to be dropped) -func (p *Peer) AsyncSendTransactions(hashes []common.Hash) { - select { - case p.txBroadcast <- hashes: - // Mark all the transactions as known, but ensure we don't overflow our limits - for p.knownTxs.Cardinality() > max(0, maxKnownTxs-len(hashes)) { - p.knownTxs.Pop() - } - for _, hash := range hashes { - p.knownTxs.Add(hash) - } - case <-p.term: - p.Log().Debug("Dropping transaction propagation", "count", len(hashes)) - } -} - -// sendPooledTransactionHashes sends transaction hashes to the peer and includes -// them in its transaction hash set for future reference. -// -// This method is a helper used by the async transaction announcer. Don't call it -// directly as the queueing (memory) and transmission (bandwidth) costs should -// not be managed directly. -func (p *Peer) sendPooledTransactionHashes(hashes []common.Hash) error { - // Mark all the transactions as known, but ensure we don't overflow our limits - for p.knownTxs.Cardinality() > max(0, maxKnownTxs-len(hashes)) { - p.knownTxs.Pop() - } - for _, hash := range hashes { - p.knownTxs.Add(hash) - } - return p2p.Send(p.rw, NewPooledTransactionHashesMsg, NewPooledTransactionHashesPacket(hashes)) -} - -// AsyncSendPooledTransactionHashes queues a list of transactions hashes to eventually -// announce to a remote peer. The number of pending sends are capped (new ones -// will force old sends to be dropped) -func (p *Peer) AsyncSendPooledTransactionHashes(hashes []common.Hash) { - select { - case p.txAnnounce <- hashes: - // Mark all the transactions as known, but ensure we don't overflow our limits - for p.knownTxs.Cardinality() > max(0, maxKnownTxs-len(hashes)) { - p.knownTxs.Pop() - } - for _, hash := range hashes { - p.knownTxs.Add(hash) - } - case <-p.term: - p.Log().Debug("Dropping transaction announcement", "count", len(hashes)) - } -} - -// SendPooledTransactionsRLP sends requested transactions to the peer and adds the -// hashes in its transaction hash set for future reference. -// -// Note, the method assumes the hashes are correct and correspond to the list of -// transactions being sent. -func (p *Peer) SendPooledTransactionsRLP(hashes []common.Hash, txs []rlp.RawValue) error { - // Mark all the transactions as known, but ensure we don't overflow our limits - for p.knownTxs.Cardinality() > max(0, maxKnownTxs-len(hashes)) { - p.knownTxs.Pop() - } - for _, hash := range hashes { - p.knownTxs.Add(hash) - } - return p2p.Send(p.rw, PooledTransactionsMsg, txs) // Not packed into PooledTransactionsPacket to avoid RLP decoding -} - -// ReplyPooledTransactionsRLP is the eth/66 version of SendPooledTransactionsRLP. -func (p *Peer) ReplyPooledTransactionsRLP(id uint64, hashes []common.Hash, txs []rlp.RawValue) error { - // Mark all the transactions as known, but ensure we don't overflow our limits - for p.knownTxs.Cardinality() > max(0, maxKnownTxs-len(hashes)) { - p.knownTxs.Pop() - } - for _, hash := range hashes { - p.knownTxs.Add(hash) - } - // Not packed into PooledTransactionsPacket to avoid RLP decoding - return p2p.Send(p.rw, PooledTransactionsMsg, PooledTransactionsRLPPacket66{ - RequestId: id, - PooledTransactionsRLPPacket: txs, - }) -} - -// SendNewBlockHashes announces the availability of a number of blocks through -// a hash notification. -func (p *Peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error { - // Mark all the block hashes as known, but ensure we don't overflow our limits - for p.knownBlocks.Cardinality() > max(0, maxKnownBlocks-len(hashes)) { - p.knownBlocks.Pop() - } - for _, hash := range hashes { - p.knownBlocks.Add(hash) - } - request := make(NewBlockHashesPacket, len(hashes)) - for i := 0; i < len(hashes); i++ { - request[i].Hash = hashes[i] - request[i].Number = numbers[i] - } - return p2p.Send(p.rw, NewBlockHashesMsg, request) -} - -// AsyncSendNewBlockHash queues the availability of a block for propagation to a -// remote peer. If the peer's broadcast queue is full, the event is silently -// dropped. -func (p *Peer) AsyncSendNewBlockHash(block *types.Block) { - select { - case p.queuedBlockAnns <- block: - // Mark all the block hash as known, but ensure we don't overflow our limits - for p.knownBlocks.Cardinality() >= maxKnownBlocks { - p.knownBlocks.Pop() - } - p.knownBlocks.Add(block.Hash()) - default: - p.Log().Debug("Dropping block announcement", "number", block.NumberU64(), "hash", block.Hash()) - } -} - -// SendNewBlock propagates an entire block to a remote peer. -func (p *Peer) SendNewBlock(block *types.Block, td *big.Int) error { - // Mark all the block hash as known, but ensure we don't overflow our limits - for p.knownBlocks.Cardinality() >= maxKnownBlocks { - p.knownBlocks.Pop() - } - p.knownBlocks.Add(block.Hash()) - return p2p.Send(p.rw, NewBlockMsg, &NewBlockPacket{ - Block: block, - TD: td, - }) -} - -// AsyncSendNewBlock queues an entire block for propagation to a remote peer. If -// the peer's broadcast queue is full, the event is silently dropped. -func (p *Peer) AsyncSendNewBlock(block *types.Block, td *big.Int) { - select { - case p.queuedBlocks <- &blockPropagation{block: block, td: td}: - // Mark all the block hash as known, but ensure we don't overflow our limits - for p.knownBlocks.Cardinality() >= maxKnownBlocks { - p.knownBlocks.Pop() - } - p.knownBlocks.Add(block.Hash()) - default: - p.Log().Debug("Dropping block propagation", "number", block.NumberU64(), "hash", block.Hash()) - } -} - -// SendBlockHeaders sends a batch of block headers to the remote peer. -func (p *Peer) SendBlockHeaders(headers []*types.Header) error { - return p2p.Send(p.rw, BlockHeadersMsg, BlockHeadersPacket(headers)) -} - -// ReplyBlockHeaders is the eth/66 version of SendBlockHeaders. -func (p *Peer) ReplyBlockHeaders(id uint64, headers []*types.Header) error { - return p2p.Send(p.rw, BlockHeadersMsg, BlockHeadersPacket66{ - RequestId: id, - BlockHeadersPacket: headers, - }) -} - -// SendBlockBodiesRLP sends a batch of block contents to the remote peer from -// an already RLP encoded format. -func (p *Peer) SendBlockBodiesRLP(bodies []rlp.RawValue) error { - return p2p.Send(p.rw, BlockBodiesMsg, bodies) // Not packed into BlockBodiesPacket to avoid RLP decoding -} - -// ReplyBlockBodiesRLP is the eth/66 version of SendBlockBodiesRLP. -func (p *Peer) ReplyBlockBodiesRLP(id uint64, bodies []rlp.RawValue) error { - // Not packed into BlockBodiesPacket to avoid RLP decoding - return p2p.Send(p.rw, BlockBodiesMsg, BlockBodiesRLPPacket66{ - RequestId: id, - BlockBodiesRLPPacket: bodies, - }) -} - -// SendNodeDataRLP sends a batch of arbitrary internal data, corresponding to the -// hashes requested. -func (p *Peer) SendNodeData(data [][]byte) error { - return p2p.Send(p.rw, NodeDataMsg, NodeDataPacket(data)) -} - -// ReplyNodeData is the eth/66 response to GetNodeData. -func (p *Peer) ReplyNodeData(id uint64, data [][]byte) error { - return p2p.Send(p.rw, NodeDataMsg, NodeDataPacket66{ - RequestId: id, - NodeDataPacket: data, - }) -} - -// SendReceiptsRLP sends a batch of transaction receipts, corresponding to the -// ones requested from an already RLP encoded format. -func (p *Peer) SendReceiptsRLP(receipts []rlp.RawValue) error { - return p2p.Send(p.rw, ReceiptsMsg, receipts) // Not packed into ReceiptsPacket to avoid RLP decoding -} - -// ReplyReceiptsRLP is the eth/66 response to GetReceipts. -func (p *Peer) ReplyReceiptsRLP(id uint64, receipts []rlp.RawValue) error { - return p2p.Send(p.rw, ReceiptsMsg, ReceiptsRLPPacket66{ - RequestId: id, - ReceiptsRLPPacket: receipts, - }) -} - -// RequestOneHeader is a wrapper around the header query functions to fetch a -// single header. It is used solely by the fetcher. -func (p *Peer) RequestOneHeader(hash common.Hash) error { - p.Log().Debug("Fetching single header", "hash", hash) - query := GetBlockHeadersPacket{ - Origin: HashOrNumber{Hash: hash}, - Amount: uint64(1), - Skip: uint64(0), - Reverse: false, - } - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetBlockHeadersPacket: &query, - }) - } - return p2p.Send(p.rw, GetBlockHeadersMsg, &query) -} - -// RequestHeadersByHash fetches a batch of blocks' headers corresponding to the -// specified header query, based on the hash of an origin block. -func (p *Peer) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { - p.Log().Debug("Fetching batch of headers", "count", amount, "fromhash", origin, "skip", skip, "reverse", reverse) - query := GetBlockHeadersPacket{ - Origin: HashOrNumber{Hash: origin}, - Amount: uint64(amount), - Skip: uint64(skip), - Reverse: reverse, - } - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetBlockHeadersPacket: &query, - }) - } - return p2p.Send(p.rw, GetBlockHeadersMsg, &query) -} - -// RequestHeadersByNumber fetches a batch of blocks' headers corresponding to the -// specified header query, based on the number of an origin block. -func (p *Peer) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { - p.Log().Debug("Fetching batch of headers", "count", amount, "fromnum", origin, "skip", skip, "reverse", reverse) - query := GetBlockHeadersPacket{ - Origin: HashOrNumber{Number: origin}, - Amount: uint64(amount), - Skip: uint64(skip), - Reverse: reverse, - } - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetBlockHeadersMsg, &GetBlockHeadersPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetBlockHeadersPacket: &query, - }) - } - return p2p.Send(p.rw, GetBlockHeadersMsg, &query) -} - -// ExpectRequestHeadersByNumber is a testing method to mirror the recipient side -// of the RequestHeadersByNumber operation. -func (p *Peer) ExpectRequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { - req := &GetBlockHeadersPacket{ - Origin: HashOrNumber{Number: origin}, - Amount: uint64(amount), - Skip: uint64(skip), - Reverse: reverse, - } - return p2p.ExpectMsg(p.rw, GetBlockHeadersMsg, req) -} - -// RequestBodies fetches a batch of blocks' bodies corresponding to the hashes -// specified. -func (p *Peer) RequestBodies(hashes []common.Hash) error { - p.Log().Debug("Fetching batch of block bodies", "count", len(hashes)) - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetBlockBodiesMsg, &GetBlockBodiesPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetBlockBodiesPacket: hashes, - }) - } - return p2p.Send(p.rw, GetBlockBodiesMsg, GetBlockBodiesPacket(hashes)) -} - -// RequestNodeData fetches a batch of arbitrary data from a node's known state -// data, corresponding to the specified hashes. -func (p *Peer) RequestNodeData(hashes []common.Hash) error { - p.Log().Debug("Fetching batch of state data", "count", len(hashes)) - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetNodeDataMsg, &GetNodeDataPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetNodeDataPacket: hashes, - }) - } - return p2p.Send(p.rw, GetNodeDataMsg, GetNodeDataPacket(hashes)) -} - -// RequestReceipts fetches a batch of transaction receipts from a remote node. -func (p *Peer) RequestReceipts(hashes []common.Hash) error { - p.Log().Debug("Fetching batch of receipts", "count", len(hashes)) - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetReceiptsMsg, &GetReceiptsPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetReceiptsPacket: hashes, - }) - } - return p2p.Send(p.rw, GetReceiptsMsg, GetReceiptsPacket(hashes)) -} - -// RequestTxs fetches a batch of transactions from a remote node. -func (p *Peer) RequestTxs(hashes []common.Hash) error { - p.Log().Debug("Fetching batch of transactions", "count", len(hashes)) - if p.Version() >= ETH66 { - return p2p.Send(p.rw, GetPooledTransactionsMsg, &GetPooledTransactionsPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetPooledTransactionsPacket: hashes, - }) - } - return p2p.Send(p.rw, GetPooledTransactionsMsg, GetPooledTransactionsPacket(hashes)) -} diff --git a/eth/protocols/eth/peer_test.go b/eth/protocols/eth/peer_test.go deleted file mode 100644 index b5a9e0ad936..00000000000 --- a/eth/protocols/eth/peer_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// This file contains some shares testing functionality, common to multiple -// different files and modules being tested. - -package eth_test - -import ( - "crypto/rand" - - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/enode" -) - -// testPeer is a simulated peer to allow testing direct network calls. -type testPeer struct { - *eth.Peer - - net p2p.MsgReadWriter // Network layer reader/writer to simulate remote messaging - app *p2p.MsgPipeRW // Application layer reader/writer to simulate the local side -} - -// newTestPeer creates a new peer registered at the given data backend. -func newTestPeer(name string, version uint, backend eth.Backend) (*testPeer, <-chan error) { //nolint:unparam - // Create a message pipe to communicate through - app, net := p2p.MsgPipe() - - // Start the peer on a new thread - var id enode.ID - //nolint:errcheck - rand.Read(id[:]) - - peer := eth.NewPeer(version, p2p.NewPeer(id, name, nil), net, backend.TxPool()) - errc := make(chan error, 1) - go func() { - errc <- backend.RunPeer(peer, func(peer *eth.Peer) error { - return eth.Handle(backend, peer) - }) - }() - return &testPeer{app: app, net: net, Peer: peer}, errc -} - -// close terminates the local side of the peer, notifying the remote protocol -// manager of termination. -func (p *testPeer) close() { - p.Peer.Close() - p.app.Close() -} diff --git a/eth/protocols/eth/protocol.go b/eth/protocols/eth/protocol.go index 5392f2cac4e..37569605b82 100644 --- a/eth/protocols/eth/protocol.go +++ b/eth/protocols/eth/protocol.go @@ -33,12 +33,10 @@ import ( // Constants to match up protocol versions and messages const ( - ETH65 = 65 ETH66 = 66 ) var ProtocolToString = map[uint]string{ - ETH65: "eth65", ETH66: "eth66", } @@ -46,14 +44,6 @@ var ProtocolToString = map[uint]string{ // devp2p capability negotiation. const ProtocolName = "eth" -// ProtocolVersions are the supported versions of the `eth` protocol (first -// is primary). -var ProtocolVersions = []uint{ETH66, ETH65} - -// protocolLengths are the number of implemented message corresponding to -// different protocol versions. -var protocolLengths = map[uint]uint64{ETH66: 17, ETH65: 17} - // maxMessageSize is the maximum cap on the size of a protocol message. const maxMessageSize = 10 * 1024 * 1024 const ProtocolMaxMsgSize = maxMessageSize @@ -79,42 +69,7 @@ const ( PooledTransactionsMsg = 0x0a ) -//nolint -var ToString = map[uint]string{ - StatusMsg: "StatusMsg", - NewBlockHashesMsg: "NewBlockHashesMsg", - TransactionsMsg: "TransactionsMsg", - GetBlockHeadersMsg: "GetBlockHeadersMsg", - BlockHeadersMsg: "BlockHeadersMsg", - GetBlockBodiesMsg: "GetBlockBodiesMsg", - BlockBodiesMsg: "BlockBodiesMsg", - NewBlockMsg: "NewBlockMsg", - GetNodeDataMsg: "GetNodeDataMsg", - NodeDataMsg: "NodeDataMsg", - GetReceiptsMsg: "GetReceiptsMsg", - ReceiptsMsg: "ReceiptsMsg", - NewPooledTransactionHashesMsg: "NewPooledTransactionHashesMsg", - GetPooledTransactionsMsg: "GetPooledTransactionsMsg", - PooledTransactionsMsg: "PooledTransactionsMsg", -} - var ToProto = map[uint]map[uint64]proto_sentry.MessageId{ - ETH65: { - GetBlockHeadersMsg: proto_sentry.MessageId_GET_BLOCK_HEADERS_65, - BlockHeadersMsg: proto_sentry.MessageId_BLOCK_HEADERS_65, - GetBlockBodiesMsg: proto_sentry.MessageId_GET_BLOCK_BODIES_65, - BlockBodiesMsg: proto_sentry.MessageId_BLOCK_BODIES_65, - GetNodeDataMsg: proto_sentry.MessageId_GET_NODE_DATA_65, - NodeDataMsg: proto_sentry.MessageId_NODE_DATA_65, - GetReceiptsMsg: proto_sentry.MessageId_GET_RECEIPTS_65, - ReceiptsMsg: proto_sentry.MessageId_RECEIPTS_65, - NewBlockHashesMsg: proto_sentry.MessageId_NEW_BLOCK_HASHES_65, - NewBlockMsg: proto_sentry.MessageId_NEW_BLOCK_65, - TransactionsMsg: proto_sentry.MessageId_TRANSACTIONS_65, - NewPooledTransactionHashesMsg: proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_65, - GetPooledTransactionsMsg: proto_sentry.MessageId_GET_POOLED_TRANSACTIONS_65, - PooledTransactionsMsg: proto_sentry.MessageId_POOLED_TRANSACTIONS_65, - }, ETH66: { GetBlockHeadersMsg: proto_sentry.MessageId_GET_BLOCK_HEADERS_66, BlockHeadersMsg: proto_sentry.MessageId_BLOCK_HEADERS_66, @@ -134,22 +89,6 @@ var ToProto = map[uint]map[uint64]proto_sentry.MessageId{ } var FromProto = map[uint]map[proto_sentry.MessageId]uint64{ - ETH65: { - proto_sentry.MessageId_GET_BLOCK_HEADERS_65: GetBlockHeadersMsg, - proto_sentry.MessageId_BLOCK_HEADERS_65: BlockHeadersMsg, - proto_sentry.MessageId_GET_BLOCK_BODIES_65: GetBlockBodiesMsg, - proto_sentry.MessageId_BLOCK_BODIES_65: BlockBodiesMsg, - proto_sentry.MessageId_GET_NODE_DATA_65: GetNodeDataMsg, - proto_sentry.MessageId_NODE_DATA_65: NodeDataMsg, - proto_sentry.MessageId_GET_RECEIPTS_65: GetReceiptsMsg, - proto_sentry.MessageId_RECEIPTS_65: ReceiptsMsg, - proto_sentry.MessageId_NEW_BLOCK_HASHES_65: NewBlockHashesMsg, - proto_sentry.MessageId_NEW_BLOCK_65: NewBlockMsg, - proto_sentry.MessageId_TRANSACTIONS_65: TransactionsMsg, - proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_65: NewPooledTransactionHashesMsg, - proto_sentry.MessageId_GET_POOLED_TRANSACTIONS_65: GetPooledTransactionsMsg, - proto_sentry.MessageId_POOLED_TRANSACTIONS_65: PooledTransactionsMsg, - }, ETH66: { proto_sentry.MessageId_GET_BLOCK_HEADERS_66: GetBlockHeadersMsg, proto_sentry.MessageId_BLOCK_HEADERS_66: BlockHeadersMsg, @@ -168,17 +107,6 @@ var FromProto = map[uint]map[proto_sentry.MessageId]uint64{ }, } -var ( - ErrNoStatusMsg = errors.New("no status message") - errMsgTooLarge = errors.New("message too long") - errDecode = errors.New("invalid message") - errInvalidMsgCode = errors.New("invalid message code") - ErrProtocolVersionMismatch = errors.New("protocol version mismatch") - ErrNetworkIDMismatch = errors.New("network ID mismatch") - ErrGenesisMismatch = errors.New("genesis mismatch") - ErrForkIDRejected = errors.New("fork ID rejected") -) - // Packet represents a p2p message in the `eth` protocol. type Packet interface { Name() string // Name returns a string corresponding to the message type. @@ -358,9 +286,12 @@ func (nbp NewBlockPacket) EncodeRLP(w io.Writer) error { encodingSize += blockLen // size of TD encodingSize++ - var tdLen int - if nbp.TD.BitLen() >= 8 { - tdLen = (nbp.TD.BitLen() + 7) / 8 + var tdBitLen, tdLen int + if nbp.TD != nil { + tdBitLen = nbp.TD.BitLen() + if tdBitLen >= 8 { + tdLen = (tdBitLen + 7) / 8 + } } encodingSize += tdLen var b [33]byte @@ -373,16 +304,18 @@ func (nbp NewBlockPacket) EncodeRLP(w io.Writer) error { return err } // encode TD - if nbp.TD != nil && nbp.TD.BitLen() > 0 && nbp.TD.BitLen() < 8 { - b[0] = byte(nbp.TD.Uint64()) + if tdBitLen < 8 { + if tdBitLen > 0 { + b[0] = byte(nbp.TD.Uint64()) + } else { + b[0] = 128 + } if _, err := w.Write(b[:1]); err != nil { return err } } else { b[0] = 128 + byte(tdLen) - if nbp.TD != nil { - nbp.TD.FillBytes(b[1 : 1+tdLen]) - } + nbp.TD.FillBytes(b[1 : 1+tdLen]) if _, err := w.Write(b[:1+tdLen]); err != nil { return err } @@ -402,12 +335,9 @@ func (nbp *NewBlockPacket) DecodeRLP(s *rlp.Stream) error { } // decode TD var b []byte - if b, err = s.Bytes(); err != nil { + if b, err = s.Uint256Bytes(); err != nil { return fmt.Errorf("read TD: %w", err) } - if len(b) > 32 { - return fmt.Errorf("wrong size for TD: %d", len(b)) - } nbp.TD = new(big.Int).SetBytes(b) if err = s.ListEnd(); err != nil { return err @@ -415,15 +345,15 @@ func (nbp *NewBlockPacket) DecodeRLP(s *rlp.Stream) error { return nil } -// sanityCheck verifies that the values are reasonable, as a DoS protection -func (request *NewBlockPacket) sanityCheck() error { +// SanityCheck verifies that the values are reasonable, as a DoS protection +func (request *NewBlockPacket) SanityCheck() error { if err := request.Block.SanityCheck(); err != nil { return err } //TD at mainnet block #7753254 is 76 bits. If it becomes 100 million times // larger, it will still fit within 100 bits - if tdlen := request.TD.BitLen(); tdlen > 100 { - return fmt.Errorf("too large block TD: bitlen %d", tdlen) + if tdLen := request.TD.BitLen(); tdLen > 100 { + return fmt.Errorf("too large block TD: bitlen %d", tdLen) } return nil } @@ -616,7 +546,7 @@ func (rb BlockRawBody) EncodeRLP(w io.Writer) error { var txsLen int for _, tx := range rb.Transactions { txsLen++ - var txLen int = len(tx) + var txLen = len(tx) if txLen >= 56 { txsLen += (bits.Len(uint(txLen)) + 7) / 8 } diff --git a/eth/protocols/eth/protocol_test.go b/eth/protocols/eth/protocol_test.go index b05ebee6b6e..592dcbdf0c0 100644 --- a/eth/protocols/eth/protocol_test.go +++ b/eth/protocols/eth/protocol_test.go @@ -24,6 +24,7 @@ import ( "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/rlp" + "github.com/stretchr/testify/assert" ) // Tests that the custom union field encoder and decoder works correctly. @@ -267,3 +268,16 @@ func TestEth66Messages(t *testing.T) { } } } +func TestDecodePooledTx(t *testing.T) { + in := []string{ + "f90420a0e2c35c05dbb07cf2e0784116966bd5d582846bdb54c928e740492262ccfeb40ca0c4fd5ae5baa1180ff6dd8c4b01cc2d93f8907de27ac2016648c6373478bef503a0b35dca76c30d732374041438c26b9ee8f643744446ab53c7f38fa2074eaac992a08518fdec2a229d82884b323937f4a0f09b02ac746aaf6773d482e40b597c05c7a08f8d9110ea6acca9554e2f80cac3cedbb143fbe4a1ab3e60ed31f4c74d748deca016b0027c133e3372deffb4e86e1bc5e975d1d610a9f2fdea3a74e4d60ef864baa00c6332c83e85ebb9a3a7afd313df4a82c7e5decb5872e264a3f11da610245f00a08bedc14cf929b536e30df8538b870518016096a4870c7c20e5b48da7b03df384a05a9ff87469a5332cbd18520dcdf25c17425de71d9efb56072e023246617145ffa08a165cd6bdc433f6b97e8a6e204ad59cbee4084421aa810a1e2cf9c828e949e8a09521157629d905e3337a9b54522709ccf8890cfd717def560b053926c1862ed3a0284d676704a205a5c932dba13672caafe13a727b3a3cd7dc56bc49a6c6c9a7e8a09f12e7753596116fd9ebe554428f927e8afc99bad30ad28cd9deeeaebe21cd99a09497716972c5f7ff311769f185f64adac8c54f096cab5beb7ad80cfc7e773ccfa00e0036fd7086e15f045b11d7a22df7dc99958124ccc7100d499d182becb7ed59a000d8094ecdee29e6c916360f1594d68cda566d9bd2a17a19312eb0487d46b537a03b1bc9e360c01b2d6cf9ba42a06b91b30692a086daf3ba6db2b661cfd5f1fb61a08cdd05c1605609f1979fd55ff7de0a16e41decb7ab3e340b9b729a88ea8cbb5ca0151bc4c1e0cbd896cabdaf5d08830cb608337ac247347786b2191f79bd367d96a0c9d895b6094195745740ff05e2fd4e55b33ae554843cabc70ad64b71a1a8093ca0ffdf8f28142597911de68d59e7f73209aa2573583bc3c2aaa144e2727153a1aea0535a8ccc5eb9f69005021093017da51b54289e24fb24f8f36ee8d421e3df99b7a0b0428184b221db9f5bd7c2c3ab1b4e21cf961f9218bce2308a1f1be2da40195ba0294f7127f5306e5a5a57127b1300351dac1affef78fb7e822fab1175e021c261a03b2d6b186168a6ec0a364ff65e58b34c1b4d85cf0d30cf3158c68b3ff9987621a0eba6b975d9d964dd2db4f0e562cb16ca1b51d42c659df15f28a84c31e2fb7a9aa00d9b8879c571278d965e847752f9b97b12a965b44bfb1a653fa0b983949bad8da0752d870c51884688996ebe5c561f7b05602fe7939b5f3651fb2a848921d3a88ea0bc73d7980607d967aca0c8b07a44a62fcc6f5813587987cf65d972396e45b448a0c3fc9e18bf84f8dbc72f1e5d106f760055982ceabb0fe9b62c37cb73ee0d04d1a083bcb5e1bf1871154a16c9d50c40656feeca78ba66d5f2851a031952f2e4f96ba085fe3f02e443d6be1ddbe9ea3949045e9787350caa744f9432e92046d2331e86", + "f90252a08300b9b4eafc34783aa73c7cb838a57dfc67297a3b1d8257246bd185a4f93b3aa02f34818121bf0ba43a72b792c082958f3d5f228b21a2eac269817fb3599a84e2a063aa50744b161d468fe18ea34dae296dad9cb12dd379817705381d891fdc5597a0ad9655f53ba172b838cf806abe28c77f3b264403b67ae1542a45fe37b7d4a863a03509363a668176aa2199689909c506996aaef511a41259d8f76768c4bb6d4752a0d1701f189b824587e22751ea6d58a7c5c1f7c80c5b09e3f3f92661ff32acb8f6a014f08af42770974caca620efa32c794d8a36496c873bf1921c12be196d096579a0c7377d2c6550bb5dc4bbffba41cac186c33b2d6252d1e0e24f5b0a0bace59472a02c2ba0c1f3555dc2256e528751f30ccc52112359258a70bb0a8fc18ece48381ca07d614cb5a2b817db6513993c8e7bbd6c1797e8e9bda6682f5e1df513ed2034f2a03b4b85d126965773ceb1786b11f2c5a949a87b0f6fe8d872ad89cccfd1f87ed1a0656647ae904635ff87dbaa5ca911a3be660932170eba4a21d0dbdbe97d20eeeaa0389b40fccf0dbb545062f2191469605c1840adf1f0a0a894813220fcacf64159a00e9fee2d2799359f2f30fdf4730b975a8c2bd88580bcae9ada7207727307dad9a03ba2575ccf8cd5e5cfb3a49ee7e7eca5d848769633eef17555568bcd6f67dfcaa047257e61f349efa356983cafa152f5709b7e98d237aa1e56909f9e68e3c570dda046afb04e1863bee5f4b2295df87345cf2c57634b5009c6c4422a6f0b2585f9fea015f91ab0306be4a339b8d273e574657112543d3414bbcb1541ed087e950c5732", + "f92100a0457dbea9ad7a3ac599afe2918a92588ce4f09a7f0fcad832386e455143d3efc1a0e68ce70766ffa9b0dcb672d5806289c6ac94fbbc86702bd99778bd344c7311c9a0416da3c5b9d7ff5534102eefd90fac19e3501f730be4875496c79690f1250887a0db85964d4463f5c06c86f038b5ef19ee16be469b120e875ba0d1a7e9d2c9914da03a77f75d108289f8318601d27a18e149efee678f5438e48ee0b3242242de9861a04084aca085236dde3b4c21bf2167a44a550d2378d1b157472a3d114c37bf3f74a0f7e3253460b1065766a297e2df2e9ac33f844b3b3512b5b7a8df427d41ce27e2a050f68e46ed07feee900ffeaa670fee83bd4d47bb3deba88178de2ae09b7c8216a0e0a3cdbf78229fa645f7f7b6bf77bb68f4bfc28f2064d8d059f591af1ba0e1f5a05f64e70da5f5c60d38c3cecd908e1adcaf546fd430558fcfc023680e8b4f29c7a0de12e201d4c361d34f5bf6f6d4beebb32fc2494499155a1cb765c9e94a3fb4efa0ca79e282d9b5f78160c2b4bd3ca60554c9d24b778f44cd5462dbbdf2d54b5f01a013d6cddcc76c44e139e815376d7abe6ab641b36f3157e6649cabfec2880414c9a0b886f616f5ff7ee6500a9338968f074df49aa11971660637e3e34492358ee47ea0ee99c6fbdf5662030fef6425efcbfa8078f0f431fde3be1b8aae4aea3ba580bda07f1a853063aa035138b76ed0135110b5a10ea8d0e47ed31bf2a591042a13707da0a72b949c7db6ec8a676f86c7e3d8fa598dce0ce5949db92e5b82cb0151633098a000df9aaf75db347c35895b51f9e066b3fa49950b4a8ef81ed4bf8acbef7f3075a07945ece5f3c656551faf4d1ded4e3c7b392a3b85c662b30544a6a3f04a57643fa0055b598c472aebcf8028244900926e2d94b9caa7f8e67b2a0d88e0cffa9e7cfba0a8083261ec9d81591b2b1837f4bd756e509637191ada6e08fe6b3cd42de08de4a0d0b17671335c7173cc7aafe9fa9af8b7e52ec056d459547ae627957c332b2d0fa08f8fa96861da8464ee1aebc7c106eeaf3630e69d3f3490de77ef415f2472700ea06b370755efc2aa04857953e4697f487cd26c0f85d7b1c1a223b26f0cd186a9d0a00484268c6711b9455ba4b48e1b6f5e88b1dad5e77971ead0f5e68a1c7748c367a07b0a2946456ce64edb7c7361d518ec90b0630884d14bebee345db053781dfa17a01aaf2e5e97053a511044aa31477fbbc22d1f6dee5c0ccc830c4a6240fc4d6484a0540f6302b6900a3403af090b0439a9cc9441d6518a58001ded05693dfddcc7b0a0cd989d5ce499b59cadcbf8c725cc2faf5aa21d66915d505914d7ad0aa6f8de2ea04e49fc458aaf05fe5c017d7c48bd02a246921086ab509dfd66546b1ee51b434fa0df2b1cfe7b2c6ab27c058a55432d60c79f02abe1c9c26e360e5c9819a89e7918a0cf076e52950132ae35163f836c378bded5303ea7e857ece11baf28ac5b1c98aea0f9d36cc0621b69d71e85f48a949f7c388cc3a920760c76705fc70b46c7ec338ea0a72ac1227bacd06bd244249d2b7c58ca96748d6028860849d07cc8a1591d7cb6a0a2d3bc56974ab12c9b26e649b333f6a0e9d6c92a7e9d25eee725f915892f7139a099b67b2e993f1bc2aed218b9a4919e29688ef06a93d0fd1867f065da154eb161a04f74601c3749db0ce93d86b4721b2dacf5a658367aee6cd96a2b748ac5beee83a0891342c798f6f0fd07ac5c39cd9467ebc2c314a2cd2130fb7622f8d68046caaca08825e19c1ff6fd9c67a9ce3c78ddc80dd5b787a70929562701cdbf785b540f0da01e3d5f79156f0f32620a9d9b3fbe4b80e8124786fd73995bad39a8e0c135ae12a0728b79e3b6d77a24051ac98ae5ee961ea7287c4dc727c428ed637bd87a9de051a0e1e5d2f1c040557a81c93ab0d598be7a81badf8d6baeb378dc9a707764fa2334a0525d7ab8fa251a7dae7900ca104e0a7539eb3cdec22a65f2f947b71e5f6c956fa031720eb289af647dabff6f862a28d2e9b8d5f4102164a86e1858fe0efd174bcda0742aa0021a0b75ee7a93997d275f51a3da3b3f74ab6eb16a95ae6e12e23f8416a05233dae563d95d477c30a30ec026eab0ea53634db75593db8624799b3afe626aa0f5d46e0b4ede7515a12b8a01d7673e115616d98760478f5a41bd7820ab484c26a0297f1c66544bf893349f2763fc49fcdd8e4128de69dd3d3dad7dcc2682df0383a0422d0f4fa436234e72d1759ff9d8e6ea40b8cec7fa6ffb5f3980c9ba024afda1a07258445f1348421cf54b444bb7ccf9c98310782fb06b6e8a4e676f500c1ef934a00830a8ec772df28f54eafa2877515fdf7deca28c628214686a02c9dbfdd84e0aa0d99365c88ca5a5a632bbd4bd9bd5669bc741ec11c06c1760613b47b8ac2bff33a0a54c236eb6ea525b27f911f243d22352b007df8b8c06ab887c5873700a91942da08af147c4e085d12cde5878ae562fa91a299bb6a690b281632d58b06fae9663bea068ff2a28ccd20dbaa322f52e316d77cb3656bd7a0f15bd8eac03c318802e668ba09f1e547d55b063db182ab3b91e7e70d9af30610b4c5004d77a5c38a6615cab6da043681701d663cbb8a5ef553fa7e77b25a1deecb7ace737761309dd0d7da490baa092c353ee88ca09089c897550e68300dab326dbcb0f885feee8f443a932b07292a09acfd8cc59962b4a8e80df5c6721104e9612e7b441e26017d4b3a5e5b2fc213aa02745d5cabffecf871a73680f831458d7e5af0ed35348b6d68fab7e820d5ba93da06730f4166cb883480201397b47d431d16206a960a9a5e9735ed9848d3649fd90a010426bef092103c93a7fa8bf13bec68031788f77b7d8140d478d35b33f867437a0ef08ce558e2bb64d694a5e64b8313d6fc66c1b3ffd48bb031cbae5694580dd1fa06ac7933a0e1e01c0b2f0e9f6be3fbad7ee8183bcbd81532b682e71dfd14c7efba06d78df5495c0465163b88637dd9913cba30eec7b7d2466fdccdaf3475220d960a08868dda844d63222530d8f3d8ad0964af9826b19d259ca3043ab37b5c29c898aa056c41fc0eb3da9b31c784d3ba48f01b469f33df93025901f42b3cf2a45801a93a0dab91a6346667d23c4f2dc2ba5fefbf9c69064458bf4d745b9e5df458bc47729a0bf91c7803f7a6f0c40800ad80a355072fad51fb17f036b1c6018b4eac122c366a03ec19d9c9d75ece9dad232037b2ade4e5919f6e7c9a1dfa7d5be10ac6ece13e1a0d6b29ed45e2cc6eee398b64148ff39fbd4399b633f05c08588457c2daa65a139a0aa969bb7524b1dd2705abdb4ccf91ed7302eb6c0cf1af073860ae86ca5c3e06aa004fa852789a7bfec993fc9564e177f80db5dd00a4748c6342b3679a2d0bffc36a01e3dcf24966b08b355bf126a882900b41509e47523bbc77b2e191ca518a0fe15a06fab12009a9d490cc738b14f3b964b020acfa7525197796dd0222a4ee4a203f4a0966b9fc8caec86efaba02e09fe9bf17129c423e40f345156677bc51043e54798a0c5b485ca74898f3e9c025d41f430f8d2ba7d86e59ed248c391671f24c8894434a064bccacb8a84a451c9c1faaacd55896279581ea3f87ba2aba159611d0693a54aa0413d94148abee1deaab41d3db3541c15f09948118415bb586dd2776ceab8c71ba0ba3948b8e4bfe6a9943472296d13bdec9da21e91ad8ed33aca0572d9f60412aea059bb512969957b22ba85dec033fde835ce34b8f1b084684e574684ea413977eca01c8353e15e462fee048ca1c0bc3d7dbb430ee795ca395e582075fcb868113140a07a29ce5466da30a7f13d6d49f72c87c925feb699cc27fca7d2c8791e707ac926a0c2305e480ed70e9a13b0abba33148ad254cfd41a2db1c6a3f8df8a5fa8ab5417a0f60a1b008093a93b29eba15399d6dc5fb813ef07cf4d0c6a1974f0469d15ca50a013ad4bebb81c5b104cd7f39a75e2c0a0b00d57a20d3a0de890b1560bc8616141a0dce2cce7d0ed35b4bbf672296127217cd1385eee4618cc14c99ab293dbc9c3bda091dfee49f4865b4a5eb365ac4bec7d0af28859c3b1f73826bff80835027afbcca01186acb6582e6514c3278a04d5aa923934acb3a28781811e654f313189b326a7a0191a8daccb6f08ef5b8f1cdcaaf7f7d16150c7e616d64fa6a733e30e03c92ec7a0d886ff68ead70ef7857f2578a4d09509072dbc474a2ee49adf58b2a1ddc12101a04d6ed9dae79ab736ef6f377a6d59a4d23dbf6326832eb23d198ad11edde20d81a0fdbdb62324d8fc480f9dd10dbd330fe8a64f7370cc75b473d2ebe178b5ca8319a05ab97c3f8780d72ad46beb1af9472a836a74c9262e3221586cfc90c1839b93baa04bb7692bfc0bd42f0aaecb2faa7fc9322d267b9109c73c83e8651817db82e229a0106e0f1277527b5161d59186a6ed8a3c720d431e863a6308842e3e7c35cdfa95a04e76483b655fa39ddca148b56e2245604db9c732a27f04b7542c9f22c0e3fe98a0fef5f8c2e54e9bbd82b33debb3a985be5733ff5117325f46a703a03423347d75a0901312021016391e31b0b2b669556700795c86799b6e2536521113d74902ac15a0ac33dfff755cee38b0c1f2ed08a87d5d7ee4facdcb631c95e154332a59113e9aa0f689b57325189a547b7051e34e4921466ef2819225026ea6726dfbb38d481ea5a0ca8ed97e53739e3e0cf71d798e94102c2cc66613785885377b919ed0e5918177a06c0682783f6c7851dd0cf20e2807e5d88ce92c2f439e28f9aedf1cee8c2eb55ea07c726e60fba908cf1846af2c36e8c3be732f954129ebe6f38103518ec22ffa85a03012453f04460ccf8ef43be0b2918200e919a030755fe740c00fc0ef447d26a0a005d6e87101ae85a321d03963b4ed7bd9deb2146ac1275d7e6d7662804d456c8fa08d60aac1234b9daf6b8f6606eda5e744066446e95c83fb4f7b316215191d8f53a0b15da00fe1f119b98c328c3bc0932879bebdc5e59d6df9901dac97b383669acaa0f61cb61a050170400e8c176e445e958cfdf6286b82f3156f9a222db38482fe65a045484737f57987bbd2e1ce6e7fc5e6e82b301dd97bd7fc6422d9dd67d1a6d2f3a053d8371cd24ef9db5f238eec50dcf6dab4284ffdd4882a3e1863f196ff4870bda0dd39aa33f267560be1d88c4bd6a1bf2810338097395d52438dd8e4b02cb84978a079586605fd6153de3d1f1c140c528109e0538f5dc5c63c0d04e4f324589df564a0b5834225c7ed87e0e112f89cd79adeb9d44e314d93cb7b4e21ef277bc3acaa43a0de452afb52a5fd9a20d651ee00bbc348d9bfd23fa69df029b98e3cac50a658fea0662f43b6b2dfc870822fb1c7865f54db04b50679089f9f084647477e86c18917a0ed21bac1b980827276827fee6248b2cea6f8c00a71711e1a95af10e395b11112a08303e88de0a4630e30a95054452cde82856b2ff0ede847719acfb5c06bab5a06a0f06a4b2b27de217b48dd082f0154a9d62f528535ba9f0ffc3a4bedbe00a53cfba0155d26a32b2a3e7b171962da6a30f39335e3954caecc16cb99ef7bce209ff2c9a09691c7d7efb6fe112620fe6ef88d7b6fba53980838cb190da738e0912de3af4aa0eb954bdb5d41c66be4bb38101a9e2ba7e8857d8130b2840a5755c0cc21bd8e0ba0d9667f0cfcc923b80348f189e6f6ca81284e9a1ddda64aef5f346eb5846d3dd5a07de91fa272b5233c007842dd9df5bce1b51776ad9d2bb8b2780023f34e039e63a06680b64e290f34bb395542b117fe27e4f66225f2545d11db1bbd0bd92ca9fca1a02e7c285811f50f35185b3a85d5129a17614de21496b7f5aae5dc5eb55207a167a0b3f63e45c4d670a5bf764d41c6430d6c8a99f3c7191a698f33411a94fc4ac638a04551cb007c5e17f3e9514abe5c4795fb435e63a7e78e71e45dbe3c45fc0f9bd2a0175fd2a244cf6e6ff1247650ee1cd951c81e1d842da9429399a795be4b7366d2a05c39878a681f05c3ff2da0c199afbd37659188df97c983b47ec1a1d7efbb598fa022205aff97dceb64b8a9869fd93325098dd1f2947ab9e8deaefe8dd27b2885f1a00072318dbfcb25b92dd6cb8e5e46824cdb4c9c80019b7de74f7c6e7b0ef4e79ca03eb33c156a4f352f44bbb5d180df4f37c757dcb55ef6bc3406cbd06ce93693b8a0e708d9c6742117260a51d5a4a35013711949d73b16a53437482424cf9cb1d285a0d5b034e2c7782eb827d11119246c85e4be9df88a6cd8581ef15a9c31007b7faca0a23bfb8987002339b017beb01ef612fccc0e2be882d3d13b62789d7ee997a0cfa0ec21e67193e8022dceb7fbc4f519c02e04c12c392d73815a9ab76c18147a8906a0a10cf2794edc9a214ec8af0d7a2d19fcb7aae7b922be1354e31012ab12fea91da00e557cf37dabead6ca434ab7b1e14ceb4e00beecebf84f134bc6241dcfea1065a0683eb17abee39938bbb9fdc8a59b84be1d52a6787345ba0f0fc7290f1e125da9a0998a415478c4d3d852b8d6dfe82b6b172ae40e0789f6c6fb20aca859ce62760ba0f3ca748eef38d808616bfb37ae4475bb8c04a4e4783d7cd1a2edf57dfd9f7306a01f7989f763430c1c1ec3b9b775ce9f1cf2014521b5a01d564cbf678a42d051eaa0e94f98c9099a6cfc66ebb116c233b31b70b1b08c753abae139071262f1816116a0e2da38061116fe543adcba3df34c6245f7310c54e994667fe9930c02b1939dbba0a7d65101a127c971c961a7f6705a48870f7215af5930167aa963aa69ff09846ba0ea35e6495b610495e37ab6fbadc6c04992a602a1797556ee52c59e823189c3e8a0ed699bca16703f0d71f09d72b91bda433f8f3a73ee9440ef6972bac7137c98a8a0b07e3af5035e64940a7ae59001cf9dca43a2f570526b69f7325e610a2280303ea07bb35ca599293bea45afccbdc86a3dcbdbcaac814ec1e3a32a32295ecca5b31ca02252d170dd12c70c5ae3abf9c712d16d28f06276e1df770980392da0488e57d8a073881b9be9e9330aa527c1a92f4d519c42c2252634b1cad345d1c39a4c926641a053b13afff7cb2065f7fd7f0629c74bbf44c38454f51bd59c3153d65e6184ea83a05fbd7fcaf9b67925fa5c07bd121fa6f246eedd2ac1cc9156327520a79bdadee2a0c463853e2b359520f75ea1fcb026a1bbecdc6529c1dcab780b25415caa5e133ea05bc3aeef63a0131e375fa9227dd8203d1e0a1d88f89246cca730c2a093b89bb9a093f9065d1c292cfe90187d8316b5d77f63baa8a3cbacb7dab251e52bb2647992a072caa42fa06337e7a40855ba72ab91bc543af6277b55f45752b2df464aa5980ca0aba9dca288fe67c1a4725c3037b949d1bd601ec66fb08b856a0d0bb3d9746bc6a0c8baeed7aad9f3405c3ec9975af506d0716d9d9c81b0f7583cfb0b4ab23c8411a04549aa50e29845b24bcaccdd73c05ea3f9339fc1b36e674d2d26d1cbebd21707a09ad8a2d70f8fe1bd53e2fe41fb3500cdfe96f2a107391a99e87caff10552bc5aa08274abdd8d2f49a67d2b76a05fc98fe1a6fc61deb8b331d8b9bffe6e5f5b418aa0c44067f13f198366426b116f33f4c4986699834d72235642002687050fc7598fa0079219259c4b66570878e61e68f1ba9bd735db772bd37f1f3a070d3080de6dc7a0dd977bb9b2a8b79015a099ca4fbe1cc03e2bad3a2a5fa6a51556e0a234315b20a00dc885f251fe1d9bb83ea7290bdb2afa4eb7859caa8a5a3c1f09acffc046f931a0a72ebe0ce41209d9d11d05f28e624048089600696a39856e9b99fad176eb1944a05b6118efcf9c6df825e2c11ce1253efa092d9ff62f7973fb9174c982a8261adba06810b59888a32a2b86d66efa776f030cc4d7b47dffbcea30cd59edd04df6c3c2a0f92dbbc2411f5cbe13c11bb174f6d52a15582ab867ad047e17c8b8048ef46073a0a6b6ee59bb9c1ca8bf29789c78bb86d95a426cf7e662149babf37ea1ddd94494a0d41d52b7cf14932699f021dc7d12f29629cfd14bf97ffc448e889f111c59eb25a09cd662bf24415538f1e75e99efed323b3a167488e18d1f06b7518c2cfa8f9f5aa075b09e9c4ddc1675cf3500ebcbddf941d256aeeb746fea4180a5d0b972b38368a0b6c7690d32446df1b5ecda799a68b9e2720999af705b96a59c60e8d5a89ea719a0b59d284f9a25e0c869ac8ab36fc5908b7b511d5bf5dfbe8d4822661bfb7d6215a0caf75cf6533d419e703780fc113a9e8f0b7809e0caa575895ec8953b169af610a00e4beb0e2a7fd498343cdb5d235ee5359405bd759ce4829e5f8ad3ec59250d28a00f0cd100400e2d0f353b9990a73669744951a241bbeda58b81c0d62f2192f405a050ed76f92ef11fd357616ba32cc1174dbad0a859b0a138db4edce0766413321ea033a10af3361aa7900353dbc7439c5623ce3ae18c22e78ae20a885bdc35c7f843a0b91f5bdfc38418e2e675065370d02a7a36adc814c35966849c519c216bdb8af1a01ea59f31ee94703624208b3f87422eebc2852940589bc47d0e5c92afa7c48effa09b20ed326c942ac172c747e28b254f41ba45622a267be543bc9a9eda62dc9a2ca0dda7062f933f07806e2cd3353860f26108e0c1dd4b5975e043715470122818f2a03c405ba0d9b38a1387bf80678d2e1c7e50da7e0440449ff31227ca8debad3728a064ab8d1c3a0a2eb45c9ada53781f44711cab49f8796a6bb2d594379ae5d15027a00fc8ca547ed7b1653eecd6a53f0c59769bc72c6441e1352d58b3c76e07adb105a0afef30ffd851bb7e6a2b4676ac08d62687d5e03fa5890efab7c9922dbd5ecb61a00165d066cabf8c19979ef7253a69680ebb04668d6c5b4897d00792d93351c7dfa01f4c644d845e50fd54608e60d685f4c5e749287d4bbbe43452853268a5b47a0da0d91d97a003adeb26b666f6616092b6dd72b656b1acaabcf91d78bd931fb01884a0c8737e15221df6d9fd90087802abdce3fed99c932cac2593cadb17b9229f9f16a0bed33f5452c61b27d6f1c3f14eecd0092df8526ea5bd8a93461ba27d7f9a75efa0c2b3c6c4869664c2420b0b9f0bbd9718eb6532463949b39f6d345be91c5f9d6fa054d2e5a9275d7c7d8328110bf85631ba36f3a7a21927f840e6a889117171cd9ea044242e49d4c21146e7607350c884a0d3e26e5c3097e1758b482314fe0577aec2a00cd8c8c1ed792f9f6dbfc89b09786c7730b2957d17f79611587aed3fda70d2b8a083fe46d767b5d7e394769fd45f41ef882dcbac6ffb38e96c37eaf6597a42d21aa099e4f39264efb9505d3052fc3eafca2907e2fef0c5b85b0ccc6bc88b6a356c4ea0e4b77f82e45643442713b5c8b46e03f6fb76422177389833290d6bf42a26ab6da03074c90c37ee2a2b219ea7d78d98e6c079ef7bb07aeab5147a302f3366155fb8a05f9ed7bca1374783e7bad9c82a0c353c479ca7e09895d51fed2f5629bcc6abf5a01581b664d619d7627d55862022e4036a76eb2f9cf8a882a40a62f216b990afaca00c3d6f4af686377fd7fcb8c40ac5bc30495f04fe164ee4ee852b9d48425983d7a0c4070b1bd6de7be5e1ea3cb95382f983686b23f4da6f6fd95aa761df6bb90730a02f4725e56a14701a8e1dfef58dad20dca92b4a61a7317789157a388aaf7e6ae5a0f678b9006f0087e46777d82a5b25e11e59ee309925feb9a1d62ac4393082ffcba07460dc419cb17232afb654322ef234f73f8074b819e4c4a6fbdbfc8492392a3da0a5b7291d1afd426b40a99736507c2694865c192f4b436d3d4301fb707a9d5d11a042b9801c4f2615d58ffddf13f716ce02a0650b4f4e40e38d4c6026c0f94ea77fa0fd50fda4772dfee606321698eda27aecd44d3e7bfa130b8e0d6864e305b67ec4a03144dae304be1734ca992969d08316cd0789b55584520c1adca76cf7cab8bceba0d69a4b3e8e8e95f3b8b71aa5b41bd0449c2dad2d46a731a8d347da1127d423cea0babaf47cb6c5d4689316a40c4dd8b382c38191e9a176dc71cea669e9f9cde68ba003cbc12b1c051c2c2c7adfb55cf89e5e32e00f32693736313b1a84bd092b535aa004cce849d28a52d72ba2e4823c51ae543dfed021265c55cb347fbd6f423d8b3ba0126605dee90587eb8e65649f5baa87b826f793df6ff1bcfd91a571c7e81b9838a066fab64e8d0625ede7728e12c42cb56f549caca5b5df21b9fe616b717cda384aa0db8c15c88061ea97e7ae2975c6283011ab2e40396ec8270fba673a2d93da33b8a03b21aae10523f4f023af58b48613d69d103217a9f5a325bb26718c3549d49185a0f5db6576ade94e11674cca382098499d195d70abcd947c63bbcf4efc8ff1b5c8a081995a3a0fbe5b4a60d2f91389b9d49c43501f9107f112c59230d766f1a6e714a09f6bc642a71dfba44745420fd4ffa7af1f8bebbd9c63464bf526757595915f2ea006363434244dde18d1a84dc7e74261534ef4384bd2957a94ad1196788ae1a6a8a09bb434fc8b655cdc080bc47f01de0e0f9bf37c728532e3453dd374af3edc042ea067aa2fd972ef541d3d2401b9be7118bd90e22b3b46682657fc437d6529036fe0a09bba08016ba641e78b95735ead1fa8f470b69fe316a5e2e355eefdb59f0ff6a1a0fc1b26d7ed19e8e4723f1450ad019da802297dd54c446934bb1c1ff971458540a0906ca50e73f23f4647987e0194aec2d0113562af2754219efbfc8cab5bb8d52ea063e21ef62f649f03705954ae8a6a763c7a1083495d74e0152bf6ca7f10e7e059a0177a17caba5d8e38b88dc64aec4766cce2f51f3a8f86c1190ea3400b4148c5a0a0b9d0fea8852f96d3a2b1c21b947be44bd3e8e69d0cc452a38bd0c50036f9236ba0748f73cec222e79796d9a051b3247a648b70174746116ccf2c6d44b7c5ca92dda0581393bfaa60b5ce83b2c08969b94197d8ce70900ee03d1944366ee9353236aba05bd17ccc2f8f82b53db52190ceb8e3938962411d02aac797a817d66366c214a6a0730033ce8b0c0da4eae4f9848e1a362f3f4dbe735a09e062ea5a115c4561cf9ca006b589e2210092bace9e9fcc63f6a7f564458049b4c0f0bfe06d10d1652710c6a0b2b3f246c4b195ddbc314f8844b501e50afd103b8b7568044a521e6f36f9a8eba0f91c990673b78bf5abc5538328089cf89c8302bf1904056f839dec7371a30c3ca0d1dd1ffed2a0b770bd03bd212b1bc20c6fd2eb2059c6e90d4dff6626730a27c3a08cb427dedc8ba43453ee3d4164ae1a155a9543c4c08db060d400b2158b999e34a06316d1af10873beb39a908e7c2766178f3cc431a9208e3f5f846f2b2fc20a760a0d81786e90402d275b01e281d522d140fda5b88a2f0786347e1b7aadafa03347fa0e93df0dfb320fd493a8f9ae3eb1083748fa7cd18e503b4d80f1e48a7a8d6611ea078165a0ea0547cd56dde852729cfdc14c8bddc3800304eb591ae5123e7b87de8a07af0fdb8183c5e3603b52038bf44f85677658f07bb7b99f9584f8d8596671ecba0daba8b73ce81af08b267bfe2d4319079f782dd5c7a58b727c800abeb1564c884a0eb8a0f0c09f3672f7840b08bf889bef596e2f55a63a365545d2d91ebd9b752f9a02dc9a3c2796ec2c87f65064f22d7f75ecaceb3a4a629f785cf1d62342b3392c8a0cf3a3fca53a0831c8fb90601d1ec6907299d8627d4b5debd3fd71ee795e11704a0beb3fc6f07969a7a0c72c8238607188ee4df3fb8b76123cd018bf64f976d38d4a085504c2f09cd7a8e080a20ca2e94b0c6c264b751170e7ec61b1b44a643e29186a0cd46e49571a79e8b76d48cafe0ecaba5e7ecbe82a1aca06a0623e9e8a21374c2a031c3934e927c3130fa162842ecdc82290e10cccddd93365b9b5065e7296f2e2d", + } + + for i := range in { + p := &PooledTransactionsRLPPacket{} + err := rlp.DecodeBytes(common.FromHex(in[i]), p) + assert.NoError(t, err) + } +} diff --git a/eth/stagedsync/README.md b/eth/stagedsync/README.md index d726586ece0..79d216cdf0e 100644 --- a/eth/stagedsync/README.md +++ b/eth/stagedsync/README.md @@ -20,7 +20,7 @@ After the last stage is finished, the process starts from the beginning, by look If the app is restarted in between stages, it restarts from the first stage. -If the app is restared in the middle of the stage execution, it restarts from that stage, giving it the opportunity to complete. +If the app is restarted in the middle of the stage execution, it restarts from that stage, giving it the opportunity to complete. ### How long do the stages take? @@ -58,11 +58,18 @@ So, when we are generating indexes or hashed state, we do a multi-step process. This optimization sometimes leads to dramatic (orders of magnitude) write speed improvements. -## Stages (for the up to date list see [`stagedsync.go`](/eth/stagedsync/stagedsync.go) and [`stagebuilder.go`](/eth/stagedsync/stagebuilder.go)): +## What happens after the Merge? + +In the Proof-of-Stake world staged sync becomes somewhat more complicated, as the following diagram shows. +![](/docs/pos_downloader.png) + +## Stages (for the up to date list see [`stages.go`](/eth/stagedsync/stages/stages.go) and [`stagebuilder.go`](/eth/stagedsync/stagebuilder.go)): Each stage consists of 2 functions `ExecFunc` that progesses the stage forward and `UnwindFunc` that unwinds the stage backwards. -Some of the stages can theoretically work offline though it isn't implemented in the current version. +Most of the stages can work offline though it isn't implemented in the current version. + +We can add/remove stages, so exact stage numbers may change - but order and names stay the same. ### Stage 1: [Download Headers Stage](/eth/stagedsync/stage_headers.go) @@ -78,13 +85,13 @@ This stage promotes local HEAD pointer. Creates an index of blockHash -> blockNumber extracted from the headers for faster lookups and making the sync friendlier for HDDs. -### Stage 3: [Download Block Bodies Stage](/eth/stagedsync/stage_bodies.go) +### Stage 4: [Download Block Bodies Stage](/eth/stagedsync/stage_bodies.go) At that stage, we download bodies for block headers that we already downloaded. That is the most intensive stage for the network connection, the vast majority of data is downloaded here. -### Stage 4: [Recover Senders Stage](/eth/stagedsync/stage_senders.go) +### Stage 6: [Recover Senders Stage](/eth/stagedsync/stage_senders.go) This stage recovers and stores senders for each transaction in each downloaded block. @@ -92,7 +99,7 @@ This is also a CPU intensive stage and also benefits from multi-core CPUs. This stage doesn't use any network connection. -### Stage 5: [Execute Blocks Stage](/eth/stagedsync/stage_execute.go) +### Stage 7: [Execute Blocks Stage](/eth/stagedsync/stage_execute.go) During this stage, we execute block-by-block everything that we downloaded before. @@ -106,7 +113,11 @@ This stage is disk intensive. This stage can spawn unwinds if the block execution fails. -### Stage 6: [Generate Hashed State Stage](/eth/stagedsync/stage_hashstate.go) +### Stage 8: [Transpile marked VM contracts to TEVM](/eth/stagedsync/stage_tevm.go) + +[TODO] + +### Stage 10: [Generate Hashed State Stage](/eth/stagedsync/stage_hashstate.go) Erigon during execution uses Plain state storage. @@ -118,13 +129,13 @@ If the hashed state is not empty, then we are looking at the History ChangeSets This stage doesn't use a network connection. -### Stage 7: [Compute State Root Stage](/eth/stagedsync/stage_interhashes.go) +### Stage 11: [Compute State Root Stage](/eth/stagedsync/stage_interhashes.go) This stage build the Merkle trie and checks the root hash for the current state. It also builds Intermediate Hashes along the way and stores them into the database. -If there were no intermediate hashes stored before (that could happend during the first inital sync), it builds the full Merkle Trie and its root hash. +If there were no intermediate hashes stored before (that could happend during the first initial sync), it builds the full Merkle Trie and its root hash. If there are intermediate hashes in the database, it uses the block history to figure out which ones are outdated and which ones are still up to date. Then it builds a partial Merkle trie using the up-to-date hashes and only rebuilding the outdated ones. @@ -132,7 +143,11 @@ If the root hash doesn't match, it initiates an unwind one block backwards. This stage doesn't use a network connection. -### Stages 8, 9, 10, 11: Generate Indexes Stages [8, 9](/eth/stagedsync/stage_indexes.go), [10](/eth/stagedsync/stage_log_index.go), and [11](/eth/stagedsync/stage_txlookup.go) +### Stage 12: [Generate call traces index](/eth/stagedsync/stage_call_traces.go) + +[TODO] + +### Stages 13, 14, 15, 16: Generate Indexes Stages [8, 9](/eth/stagedsync/stage_indexes.go), [10](/eth/stagedsync/stage_log_index.go), and [11](/eth/stagedsync/stage_txlookup.go) There are 4 indexes that are generated during sync. @@ -156,7 +171,7 @@ This index sets up a link from the [TODO] to [TODO]. This index sets up a link from the transaction hash to the block number. -### Stage 12: [Transaction Pool Stage](/eth/stagedsync/stage_txpool.go) +### Stage 17: [Transaction Pool Stage](/eth/stagedsync/stage_txpool.go) During this stage we start the transaction pool or update its state. For instance, we remove the transactions from the blocks we have downloaded from the pool. @@ -164,6 +179,6 @@ On unwinds, we add the transactions from the blocks we unwind, back to the pool. This stage doesn't use a network connection. -### Stage 13: Finish +### Stage 18: Finish This stage sets the current block number that is then used by [RPC calls](../../cmd/rpcdaemon/Readme.md), such as [`eth_blockNumber`](../../README.md). diff --git a/eth/stagedsync/all_stages.go b/eth/stagedsync/all_stages.go index 1ff3dffbfea..37f08abfa36 100644 --- a/eth/stagedsync/all_stages.go +++ b/eth/stagedsync/all_stages.go @@ -1,26 +1,26 @@ package stagedsync import ( + "github.com/VictoriaMetrics/metrics" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" ) +var syncMetrics = map[stages.SyncStage]*metrics.Counter{ + stages.Headers: metrics.GetOrCreateCounter(`sync{stage="headers"}`), + stages.Execution: metrics.GetOrCreateCounter(`sync{stage="execution"}`), + stages.Finish: metrics.GetOrCreateCounter(`sync{stage="finish"}`), +} + // UpdateMetrics - need update metrics manually because current "metrics" package doesn't support labels // need to fix it in future func UpdateMetrics(tx kv.Tx) error { - var progress uint64 - var err error - progress, err = stages.GetStageProgress(tx, stages.Headers) - if err != nil { - return err + for id, m := range syncMetrics { + progress, err := stages.GetStageProgress(tx, id) + if err != nil { + return err + } + m.Set(progress) } - stageHeadersGauge.Set(progress) - - progress, err = stages.GetStageProgress(tx, stages.Execution) - if err != nil { - return err - } - stageExecutionGauge.Set(progress) - return nil } diff --git a/eth/stagedsync/chain_reader.go b/eth/stagedsync/chain_reader.go index ba3c5738fe4..954aaeb52ad 100644 --- a/eth/stagedsync/chain_reader.go +++ b/eth/stagedsync/chain_reader.go @@ -1,6 +1,8 @@ package stagedsync import ( + "math/big" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" @@ -12,7 +14,8 @@ import ( // Implements consensus.ChainReader type ChainReader struct { Cfg params.ChainConfig - Db kv.Getter + + Db kv.Getter } // Config retrieves the blockchain's chain configuration. @@ -57,3 +60,13 @@ func (cr ChainReader) GetBlock(hash common.Hash, number uint64) *types.Block { func (cr ChainReader) HasBlock(hash common.Hash, number uint64) bool { return rawdb.HasBlock(cr.Db, hash, number) } + +// GetTd retrieves the total difficulty from the database by hash and number. +func (cr ChainReader) GetTd(hash common.Hash, number uint64) *big.Int { + td, err := rawdb.ReadTd(cr.Db, hash, number) + if err != nil { + log.Error("ReadTd failed", "err", err) + return nil + } + return td +} diff --git a/eth/stagedsync/default_stages.go b/eth/stagedsync/default_stages.go index ce8876d75df..9abfb7e36d0 100644 --- a/eth/stagedsync/default_stages.go +++ b/eth/stagedsync/default_stages.go @@ -8,74 +8,55 @@ import ( "github.com/ledgerwatch/erigon/ethdb/prune" ) -func DefaultStages(ctx context.Context, - sm prune.Mode, - headers HeadersCfg, - blockHashCfg BlockHashesCfg, - snapshotHeaders SnapshotHeadersCfg, - bodies BodiesCfg, - snapshotBodies SnapshotBodiesCfg, - senders SendersCfg, - exec ExecuteBlockCfg, - trans TranspileCfg, - snapshotState SnapshotStateCfg, - hashState HashStateCfg, - trieCfg TrieCfg, - history HistoryCfg, - logIndex LogIndexCfg, - callTraces CallTracesCfg, - txLookup TxLookupCfg, - txPool TxPoolCfg, - finish FinishCfg, - test bool, -) []*Stage { +func DefaultStages(ctx context.Context, sm prune.Mode, headers HeadersCfg, cumulativeIndex CumulativeIndexCfg, blockHashCfg BlockHashesCfg, bodies BodiesCfg, issuance IssuanceCfg, senders SendersCfg, exec ExecuteBlockCfg, trans TranspileCfg, hashState HashStateCfg, trieCfg TrieCfg, history HistoryCfg, logIndex LogIndexCfg, callTraces CallTracesCfg, txLookup TxLookupCfg, finish FinishCfg, test bool) []*Stage { return []*Stage{ { ID: stages.Headers, Description: "Download headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return HeadersForward(s, u, ctx, tx, headers, firstCycle, test) + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { + if badBlockUnwind { + return nil + } + return SpawnStageHeaders(s, u, ctx, tx, headers, firstCycle, test) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { - return HeadersUnwind(u, s, tx, headers) + return HeadersUnwind(u, s, tx, headers, test) }, Prune: func(firstCycle bool, p *PruneState, tx kv.RwTx) error { return HeadersPrune(p, tx, headers, ctx) }, }, { - ID: stages.BlockHashes, - Description: "Write block hashes", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return SpawnBlockHashStage(s, tx, blockHashCfg, ctx) + ID: stages.CumulativeIndex, + Description: "Write Cumulative Index", + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { + return SpawnStageCumulativeIndex(cumulativeIndex, s, tx, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { - return UnwindBlockHashStage(u, tx, blockHashCfg, ctx) + return UnwindCumulativeIndexStage(u, cumulativeIndex, tx, ctx) }, Prune: func(firstCycle bool, p *PruneState, tx kv.RwTx) error { - return PruneBlockHashStage(p, tx, blockHashCfg, ctx) + return PruneCumulativeIndexStage(p, tx, ctx) }, }, { - ID: stages.CreateHeadersSnapshot, - Description: "Create headers snapshot", - Disabled: true, - DisabledDescription: "Enable by --snapshot.layout", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return SpawnHeadersSnapshotGenerationStage(s, tx, snapshotHeaders, firstCycle, ctx) + ID: stages.BlockHashes, + Description: "Write block hashes", + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { + return SpawnBlockHashStage(s, tx, blockHashCfg, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { - return UnwindHeadersSnapshotGenerationStage(u, tx, snapshotHeaders, ctx) + return UnwindBlockHashStage(u, tx, blockHashCfg, ctx) }, Prune: func(firstCycle bool, p *PruneState, tx kv.RwTx) error { - return PruneHeadersSnapshotGenerationStage(p, tx, snapshotHeaders, ctx) + return PruneBlockHashStage(p, tx, blockHashCfg, ctx) }, }, { ID: stages.Bodies, Description: "Download block bodies", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return BodiesForward(s, u, ctx, tx, bodies, test) + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { + return BodiesForward(s, u, ctx, tx, bodies, test, firstCycle) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return UnwindBodiesStage(u, tx, bodies, ctx) @@ -84,25 +65,10 @@ func DefaultStages(ctx context.Context, return PruneBodiesStage(p, tx, bodies, ctx) }, }, - { - ID: stages.CreateBodiesSnapshot, - Description: "Create bodies snapshot", - Disabled: true, - DisabledDescription: "Enable by --snapshot.layout", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return SpawnBodiesSnapshotGenerationStage(s, tx, snapshotBodies, ctx) - }, - Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { - return UnwindBodiesSnapshotGenerationStage(u, tx, snapshotBodies, ctx) - }, - Prune: func(firstCycle bool, p *PruneState, tx kv.RwTx) error { - return PruneBodiesSnapshotGenerationStage(p, tx, snapshotBodies, ctx) - }, - }, { ID: stages.Senders, Description: "Recover senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnRecoverSendersStage(senders, s, u, tx, 0, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -115,7 +81,7 @@ func DefaultStages(ctx context.Context, { ID: stages.Execution, Description: "Execute blocks w/o hash checks", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnExecuteBlocksStage(s, u, tx, 0, ctx, exec, firstCycle) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -130,7 +96,7 @@ func DefaultStages(ctx context.Context, Description: "Transpile marked EVM contracts to TEVM", Disabled: !sm.Experiments.TEVM, DisabledDescription: "Enable by adding `tevm` to --experiments", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnTranspileStage(s, tx, 0, trans, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -140,25 +106,10 @@ func DefaultStages(ctx context.Context, return PruneTranspileStage(p, tx, trans, firstCycle, ctx) }, }, - { - ID: stages.CreateStateSnapshot, - Description: "Create state snapshot", - Disabled: true, - DisabledDescription: "Enable by --snapshot.layout", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return SpawnStateSnapshotGenerationStage(s, tx, snapshotState, ctx) - }, - Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { - return UnwindStateSnapshotGenerationStage(u, tx, snapshotState, ctx) - }, - Prune: func(firstCycle bool, p *PruneState, tx kv.RwTx) error { - return PruneStateSnapshotGenerationStage(p, tx, snapshotState, ctx) - }, - }, { ID: stages.HashState, Description: "Hash the key in the state", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnHashStateStage(s, tx, hashState, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -171,7 +122,7 @@ func DefaultStages(ctx context.Context, { ID: stages.IntermediateHashes, Description: "Generate intermediate hashes and computing state root", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { _, err := SpawnIntermediateHashesStage(s, u, tx, trieCfg, ctx) return err }, @@ -186,7 +137,7 @@ func DefaultStages(ctx context.Context, ID: stages.CallTraces, Description: "Generate call traces index", DisabledDescription: "Work In Progress", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnCallTraces(s, tx, callTraces, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -199,7 +150,7 @@ func DefaultStages(ctx context.Context, { ID: stages.AccountHistoryIndex, Description: "Generate account history index", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnAccountHistoryIndex(s, tx, history, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -212,7 +163,7 @@ func DefaultStages(ctx context.Context, { ID: stages.StorageHistoryIndex, Description: "Generate storage history index", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnStorageHistoryIndex(s, tx, history, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -225,7 +176,7 @@ func DefaultStages(ctx context.Context, { ID: stages.LogIndex, Description: "Generate receipt logs index", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnLogIndex(s, tx, logIndex, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { @@ -238,8 +189,8 @@ func DefaultStages(ctx context.Context, { ID: stages.TxLookup, Description: "Generate tx lookup index", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { - return SpawnTxLookup(s, tx, txLookup, ctx) + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { + return SpawnTxLookup(s, tx, 0 /* toBlock */, txLookup, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return UnwindTxLookup(u, s, tx, txLookup, ctx) @@ -249,23 +200,23 @@ func DefaultStages(ctx context.Context, }, }, { - ID: stages.TxPool, - Description: "Update transaction pool", - Forward: func(firstCycle bool, s *StageState, _ Unwinder, tx kv.RwTx) error { - return SpawnTxPool(s, tx, txPool, ctx) + ID: stages.Issuance, + Description: "Issuance computation", + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { + return SpawnStageIssuance(issuance, s, tx, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { - return UnwindTxPool(u, s, tx, txPool, ctx) + return UnwindIssuanceStage(u, issuance, tx, ctx) }, Prune: func(firstCycle bool, p *PruneState, tx kv.RwTx) error { - return PruneTxPool(p, tx, txPool, ctx) + return PruneIssuanceStage(p, issuance, tx, ctx) }, }, { ID: stages.Finish, Description: "Final: update current block for the RPC API", - Forward: func(firstCycle bool, s *StageState, _ Unwinder, tx kv.RwTx) error { - return FinishForward(s, tx, finish) + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, _ Unwinder, tx kv.RwTx) error { + return FinishForward(s, tx, finish, firstCycle) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return UnwindFinish(u, tx, finish, ctx) @@ -280,15 +231,12 @@ func DefaultStages(ctx context.Context, var DefaultForwardOrder = UnwindOrder{ stages.Headers, stages.BlockHashes, - stages.CreateHeadersSnapshot, stages.Bodies, - stages.CreateBodiesSnapshot, // Stages below don't use Internet stages.Senders, stages.Execution, stages.Translation, - stages.CreateStateSnapshot, stages.HashState, stages.IntermediateHashes, stages.CallTraces, @@ -296,7 +244,6 @@ var DefaultForwardOrder = UnwindOrder{ stages.StorageHistoryIndex, stages.LogIndex, stages.TxLookup, - stages.TxPool, stages.Finish, } @@ -319,18 +266,11 @@ var DefaultUnwindOrder = UnwindOrder{ stages.HashState, stages.IntermediateHashes, - stages.CreateStateSnapshot, stages.Translation, stages.Execution, stages.Senders, - // Unwinding of tx pool (re-injecting transactions into the pool needs to happen after unwinding execution) - // also tx pool is before senders because senders unwind is inside cycle transaction - stages.TxPool, - - stages.CreateBodiesSnapshot, stages.Bodies, - stages.CreateHeadersSnapshot, stages.BlockHashes, stages.Headers, } @@ -347,18 +287,11 @@ var DefaultPruneOrder = PruneOrder{ stages.HashState, stages.IntermediateHashes, - stages.CreateStateSnapshot, stages.Translation, stages.Execution, stages.Senders, - // Unwinding of tx pool (reinjecting transactions into the pool needs to happen after unwinding execution) - // also tx pool is before senders because senders unwind is inside cycle transaction - stages.TxPool, - - stages.CreateBodiesSnapshot, stages.Bodies, - stages.CreateHeadersSnapshot, stages.BlockHashes, stages.Headers, } diff --git a/eth/stagedsync/stage.go b/eth/stagedsync/stage.go index 1b6af649471..5224e3c80c5 100644 --- a/eth/stagedsync/stage.go +++ b/eth/stagedsync/stage.go @@ -1,15 +1,22 @@ package stagedsync import ( + "context" + "encoding/binary" + "fmt" + "time" + + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/log/v3" ) // ExecFunc is the execution function for the stage to move forward. // * state - is the current state of the stage and contains stage data. // * unwinder - if the stage needs to cause unwinding, `unwinder` methods can be used. -type ExecFunc func(firstCycle bool, s *StageState, unwinder Unwinder, tx kv.RwTx) error +type ExecFunc func(firstCycle bool, badBlockUnwind bool, s *StageState, unwinder Unwinder, tx kv.RwTx) error // UnwindFunc is the unwinding logic of the stage. // * unwindState - contains information about the unwind itself. @@ -48,8 +55,14 @@ func (s *StageState) LogPrefix() string { return s.state.LogPrefix() } // Update updates the stage state (current block number) in the database. Can be called multiple times during stage execution. func (s *StageState) Update(db kv.Putter, newBlockNum uint64) error { + if m, ok := syncMetrics[s.ID]; ok { + m.Set(newBlockNum) + } return stages.SaveStageProgress(db, s.ID, newBlockNum) } +func (s *StageState) UpdatePrune(db kv.Putter, blockNum uint64) error { + return stages.SaveStagePruneProgress(db, s.ID, blockNum) +} // ExecutionAt gets the current state of the "Execution" stage, which block is currently executed. func (s *StageState) ExecutionAt(db kv.Getter) (uint64, error) { @@ -88,7 +101,74 @@ type PruneState struct { state *Sync } -func (s *PruneState) LogPrefix() string { return s.state.LogPrefix() } +func (s *PruneState) LogPrefix() string { return s.state.LogPrefix() + " Prune" } func (s *PruneState) Done(db kv.Putter) error { return stages.SaveStagePruneProgress(db, s.ID, s.ForwardProgress) } +func (s *PruneState) DoneAt(db kv.Putter, blockNum uint64) error { + return stages.SaveStagePruneProgress(db, s.ID, blockNum) +} + +// PruneTable has `limit` parameter to avoid too large data deletes per one sync cycle - better delete by small portions to reduce db.FreeList size +func PruneTable(tx kv.RwTx, table string, pruneTo uint64, ctx context.Context, limit int) error { + c, err := tx.RwCursor(table) + + if err != nil { + return fmt.Errorf("failed to create cursor for pruning %w", err) + } + defer c.Close() + + i := 0 + for k, _, err := c.First(); k != nil; k, _, err = c.Next() { + if err != nil { + return err + } + i++ + if i > limit { + break + } + + blockNum := binary.BigEndian.Uint64(k) + if blockNum >= pruneTo { + break + } + select { + case <-ctx.Done(): + return libcommon.ErrStopped + default: + } + if err = c.DeleteCurrent(); err != nil { + return fmt.Errorf("failed to remove for block %d: %w", blockNum, err) + } + } + return nil +} + +func PruneTableDupSort(tx kv.RwTx, table string, logPrefix string, pruneTo uint64, logEvery *time.Ticker, ctx context.Context) error { + c, err := tx.RwCursorDupSort(table) + if err != nil { + return fmt.Errorf("failed to create cursor for pruning %w", err) + } + defer c.Close() + + for k, _, err := c.First(); k != nil; k, _, err = c.NextNoDup() { + if err != nil { + return fmt.Errorf("failed to move %s cleanup cursor: %w", table, err) + } + blockNum := binary.BigEndian.Uint64(k) + if blockNum >= pruneTo { + break + } + select { + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", table, "block", blockNum) + case <-ctx.Done(): + return libcommon.ErrStopped + default: + } + if err = c.DeleteCurrentDuplicates(); err != nil { + return fmt.Errorf("failed to remove for block %d: %w", blockNum, err) + } + } + return nil +} diff --git a/eth/stagedsync/stage_blockhashes.go b/eth/stagedsync/stage_blockhashes.go index 886fdbb7a24..b28e1743626 100644 --- a/eth/stagedsync/stage_blockhashes.go +++ b/eth/stagedsync/stage_blockhashes.go @@ -5,12 +5,13 @@ import ( "encoding/binary" "fmt" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" - "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/params" ) func extractHeaders(k []byte, v []byte, next etl.ExtractNextFunc) error { @@ -18,18 +19,20 @@ func extractHeaders(k []byte, v []byte, next etl.ExtractNextFunc) error { if len(k) != 40 { return nil } - return next(k, common.CopyBytes(k[8:]), common.CopyBytes(k[:8])) + return next(k, libcommon.Copy(k[8:]), libcommon.Copy(k[:8])) } type BlockHashesCfg struct { db kv.RwDB tmpDir string + cc *params.ChainConfig } -func StageBlockHashesCfg(db kv.RwDB, tmpDir string) BlockHashesCfg { +func StageBlockHashesCfg(db kv.RwDB, tmpDir string, cc *params.ChainConfig) BlockHashesCfg { return BlockHashesCfg{ db: db, tmpDir: tmpDir, + cc: cc, } } @@ -47,14 +50,13 @@ func SpawnBlockHashStage(s *StageState, tx kv.RwTx, cfg BlockHashesCfg, ctx cont if err != nil { return fmt.Errorf("getting headers progress: %w", err) } - headHash := rawdb.ReadHeaderByNumber(tx, headNumber).Hash() if s.BlockNumber == headNumber { return nil } startKey := make([]byte, 8) binary.BigEndian.PutUint64(startKey, s.BlockNumber) - endKey := dbutils.HeaderKey(headNumber, headHash) // Make sure we stop at head + endKey := dbutils.HeaderKey(headNumber+1, common.Hash{}) // etl.Tranform uses ExractEndKey as exclusive bound, therefore +1 //todo do we need non canonical headers ? logPrefix := s.LogPrefix() @@ -96,7 +98,7 @@ func UnwindBlockHashStage(u *UnwindState, tx kv.RwTx, cfg BlockHashesCfg, ctx co } if err = u.Done(tx); err != nil { - return fmt.Errorf(" reset: %v", err) + return fmt.Errorf(" reset: %w", err) } if !useExternalTx { if err = tx.Commit(); err != nil { diff --git a/eth/stagedsync/stage_bodies.go b/eth/stagedsync/stage_bodies.go index b5abe7ecfd7..4da5e990913 100644 --- a/eth/stagedsync/stage_bodies.go +++ b/eth/stagedsync/stage_bodies.go @@ -7,12 +7,14 @@ import ( "time" "github.com/c2h5oh/datasize" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/turbo/adapter" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages/bodydownload" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" "github.com/ledgerwatch/log/v3" @@ -21,25 +23,29 @@ import ( type BodiesCfg struct { db kv.RwDB bd *bodydownload.BodyDownload - bodyReqSend func(context.Context, *bodydownload.BodyRequest) []byte + bodyReqSend func(context.Context, *bodydownload.BodyRequest) ([64]byte, bool) penalise func(context.Context, []headerdownload.PenaltyItem) blockPropagator adapter.BlockPropagator timeout int chanConfig params.ChainConfig batchSize datasize.ByteSize + snapshots *snapshotsync.RoSnapshots + blockReader services.FullBlockReader } func StageBodiesCfg( db kv.RwDB, bd *bodydownload.BodyDownload, - bodyReqSend func(context.Context, *bodydownload.BodyRequest) []byte, + bodyReqSend func(context.Context, *bodydownload.BodyRequest) ([64]byte, bool), penalise func(context.Context, []headerdownload.PenaltyItem), blockPropagator adapter.BlockPropagator, timeout int, chanConfig params.ChainConfig, batchSize datasize.ByteSize, + snapshots *snapshotsync.RoSnapshots, + blockReader services.FullBlockReader, ) BodiesCfg { - return BodiesCfg{db: db, bd: bd, bodyReqSend: bodyReqSend, penalise: penalise, blockPropagator: blockPropagator, timeout: timeout, chanConfig: chanConfig, batchSize: batchSize} + return BodiesCfg{db: db, bd: bd, bodyReqSend: bodyReqSend, penalise: penalise, blockPropagator: blockPropagator, timeout: timeout, chanConfig: chanConfig, batchSize: batchSize, snapshots: snapshots, blockReader: blockReader} } // BodiesForward progresses Bodies stage in the forward direction @@ -50,10 +56,10 @@ func BodiesForward( tx kv.RwTx, cfg BodiesCfg, test bool, // Set to true in tests, allows the stage to fail rather than wait indefinitely + firstCycle bool, ) error { var d1, d2, d3, d4, d5, d6 time.Duration - var err error useExternalTx := tx != nil if !useExternalTx { @@ -64,6 +70,15 @@ func BodiesForward( defer tx.Rollback() } timeout := cfg.timeout + + if cfg.snapshots != nil { + if s.BlockNumber < cfg.snapshots.BlocksAvailable() { + if err := s.Update(tx, cfg.snapshots.BlocksAvailable()); err != nil { + return err + } + s.BlockNumber = cfg.snapshots.BlocksAvailable() + } + } // This will update bd.maxProgress if _, _, _, err = cfg.bd.UpdateFromDb(tx); err != nil { return err @@ -77,6 +92,7 @@ func BodiesForward( if bodyProgress == headerProgress { return nil } + logPrefix := s.LogPrefix() if headerProgress <= bodyProgress+16 { // When processing small number of blocks, we can afford wasting more bandwidth but get blocks quicker @@ -87,52 +103,65 @@ func BodiesForward( } logEvery := time.NewTicker(logInterval) defer logEvery.Stop() + + // Property of blockchain: same block in different forks will have different hashes. + // Means - can mark all canonical blocks as non-canonical on unwind, and + // do opposite here - without storing any meta-info. + if err := rawdb.MakeBodiesCanonical(tx, s.BlockNumber+1, ctx, logPrefix, logEvery); err != nil { + return fmt.Errorf("make block canonical: %w", err) + } + var prevDeliveredCount float64 = 0 var prevWastedCount float64 = 0 timer := time.NewTimer(1 * time.Second) // Check periodically even in the abseence of incoming messages var blockNum uint64 var req *bodydownload.BodyRequest - var peer []byte + var peer [64]byte + var sentToPeer bool stopped := false + prevProgress := bodyProgress + noProgressCount := 0 // How many time the progress was printed without actual progress Loop: for !stopped { // TODO: this is incorrect use if req == nil { start := time.Now() currentTime := uint64(time.Now().Unix()) - req, blockNum, err = cfg.bd.RequestMoreBodies(tx, blockNum, currentTime, cfg.blockPropagator) + req, blockNum, err = cfg.bd.RequestMoreBodies(tx, cfg.blockReader, blockNum, currentTime, cfg.blockPropagator) if err != nil { return fmt.Errorf("request more bodies: %w", err) } d1 += time.Since(start) } - peer = nil + peer = [64]byte{} + sentToPeer = false if req != nil { start := time.Now() - peer = cfg.bodyReqSend(ctx, req) + peer, sentToPeer = cfg.bodyReqSend(ctx, req) d2 += time.Since(start) } - if req != nil && peer != nil { + if req != nil && sentToPeer { start := time.Now() currentTime := uint64(time.Now().Unix()) cfg.bd.RequestSent(req, currentTime+uint64(timeout), peer) d3 += time.Since(start) } - for req != nil && peer != nil { + for req != nil && sentToPeer { start := time.Now() currentTime := uint64(time.Now().Unix()) - req, blockNum, err = cfg.bd.RequestMoreBodies(tx, blockNum, currentTime, cfg.blockPropagator) + req, blockNum, err = cfg.bd.RequestMoreBodies(tx, cfg.blockReader, blockNum, currentTime, cfg.blockPropagator) if err != nil { return fmt.Errorf("request more bodies: %w", err) } d1 += time.Since(start) - peer = nil + peer = [64]byte{} + sentToPeer = false if req != nil { start = time.Now() - peer = cfg.bodyReqSend(ctx, req) + peer, sentToPeer = cfg.bodyReqSend(ctx, req) d2 += time.Since(start) } - if req != nil && peer != nil { + if req != nil && sentToPeer { start = time.Now() cfg.bd.RequestSent(req, currentTime+uint64(timeout), peer) d3 += time.Since(start) @@ -151,16 +180,19 @@ Loop: blockHeight := header.Number.Uint64() _, err := cfg.bd.VerifyUncles(header, rawBody.Uncles, cr) if err != nil { - log.Error(fmt.Sprintf("[%s] Uncle verification failed", logPrefix), "number", blockHeight, "hash", header.Hash().String(), "error", err) + log.Error(fmt.Sprintf("[%s] Uncle verification failed", logPrefix), "number", blockHeight, "hash", header.Hash().String(), "err", err) u.UnwindTo(blockHeight-1, header.Hash()) break Loop } - if err = rawdb.WriteRawBody(tx, header.Hash(), blockHeight, rawBody); err != nil { - return fmt.Errorf("writing block body: %w", err) + + // Check existence before write - because WriteRawBody isn't idempotent (it allocates new sequence range for transactions on every call) + if err = rawdb.WriteRawBodyIfNotExists(tx, header.Hash(), blockHeight, rawBody); err != nil { + return fmt.Errorf("WriteRawBodyIfNotExists: %w", err) } + if blockHeight > bodyProgress { bodyProgress = blockHeight - if err = stages.SaveStageProgress(tx, stages.Bodies, blockHeight); err != nil { + if err = s.Update(tx, blockHeight); err != nil { return fmt.Errorf("saving Bodies progress: %w", err) } } @@ -174,6 +206,9 @@ Loop: stopped = true break } + if !firstCycle && s.BlockNumber > 0 && noProgressCount >= 5 { + break + } timer.Stop() timer = time.NewTimer(1 * time.Second) select { @@ -181,14 +216,20 @@ Loop: stopped = true case <-logEvery.C: deliveredCount, wastedCount := cfg.bd.DeliveryCounts() + if prevProgress == bodyProgress { + noProgressCount++ + } else { + noProgressCount = 0 // Reset, there was progress + } logProgressBodies(logPrefix, bodyProgress, prevDeliveredCount, deliveredCount, prevWastedCount, wastedCount) + prevProgress = bodyProgress prevDeliveredCount = deliveredCount prevWastedCount = wastedCount //log.Info("Timings", "d1", d1, "d2", d2, "d3", d3, "d4", d4, "d5", d5, "d6", d6) case <-timer.C: log.Trace("RequestQueueTime (bodies) ticked") case <-cfg.bd.DeliveryNotify: - log.Debug("bodyLoop woken up by the incoming request") + log.Trace("bodyLoop woken up by the incoming request") } d6 += time.Since(start) } @@ -201,9 +242,11 @@ Loop: } } if stopped { - return common.ErrStopped + return libcommon.ErrStopped + } + if bodyProgress > s.BlockNumber+16 { + log.Info(fmt.Sprintf("[%s] Processed", logPrefix), "highest", bodyProgress) } - log.Info(fmt.Sprintf("[%s] Processed", logPrefix), "highest", bodyProgress) return nil } @@ -211,13 +254,14 @@ func logProgressBodies(logPrefix string, committed uint64, prevDeliveredCount, d speed := (deliveredCount - prevDeliveredCount) / float64(logInterval/time.Second) wastedSpeed := (wastedCount - prevWastedCount) / float64(logInterval/time.Second) var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info(fmt.Sprintf("[%s] Wrote block bodies", logPrefix), - "number committed", committed, - "delivery /second", common.StorageSize(speed), - "wasted /second", common.StorageSize(wastedSpeed), - "alloc", common.StorageSize(m.Alloc), - "sys", common.StorageSize(m.Sys)) + "block_num", committed, + "delivery/sec", libcommon.ByteCount(uint64(speed)), + "wasted/sec", libcommon.ByteCount(uint64(wastedSpeed)), + "alloc", libcommon.ByteCount(m.Alloc), + "sys", libcommon.ByteCount(m.Sys), + ) } func UnwindBodiesStage(u *UnwindState, tx kv.RwTx, cfg BodiesCfg, ctx context.Context) (err error) { @@ -230,6 +274,13 @@ func UnwindBodiesStage(u *UnwindState, tx kv.RwTx, cfg BodiesCfg, ctx context.Co defer tx.Rollback() } + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + if err := rawdb.MakeBodiesNonCanonical(tx, u.UnwindPoint+1, ctx, u.LogPrefix(), logEvery); err != nil { + return err + } + if err = u.Done(tx); err != nil { return err } diff --git a/eth/stagedsync/stage_bodies_snapshot.go b/eth/stagedsync/stage_bodies_snapshot.go deleted file mode 100644 index 09800f67e47..00000000000 --- a/eth/stagedsync/stage_bodies_snapshot.go +++ /dev/null @@ -1,70 +0,0 @@ -package stagedsync - -import ( - "context" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/eth/ethconfig" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" -) - -type SnapshotBodiesCfg struct { - db kv.RwDB - snapshotDir string - tmpDir string - client *snapshotsync.Client - snapshotMigrator *snapshotsync.SnapshotMigrator -} - -func StageSnapshotBodiesCfg(db kv.RwDB, snapshot ethconfig.Snapshot, client *snapshotsync.Client, snapshotMigrator *snapshotsync.SnapshotMigrator, tmpDir string) SnapshotBodiesCfg { - return SnapshotBodiesCfg{ - db: db, - snapshotDir: snapshot.Dir, - client: client, - snapshotMigrator: snapshotMigrator, - tmpDir: tmpDir, - } -} - -func SpawnBodiesSnapshotGenerationStage(s *StageState, tx kv.RwTx, cfg SnapshotBodiesCfg, ctx context.Context) error { - return nil -} - -func UnwindBodiesSnapshotGenerationStage(s *UnwindState, tx kv.RwTx, cfg SnapshotBodiesCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if err := s.Done(tx); err != nil { - return err - } - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} - -func PruneBodiesSnapshotGenerationStage(s *PruneState, tx kv.RwTx, cfg SnapshotBodiesCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} diff --git a/eth/stagedsync/stage_bodies_test.go b/eth/stagedsync/stage_bodies_test.go new file mode 100644 index 00000000000..9580d322dad --- /dev/null +++ b/eth/stagedsync/stage_bodies_test.go @@ -0,0 +1,77 @@ +package stagedsync + +import ( + "bytes" + "context" + "testing" + "time" + + "github.com/ledgerwatch/erigon-lib/common/u256" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/stretchr/testify/require" +) + +func TestBodiesUnwind(t *testing.T) { + require, ctx := require.New(t), context.Background() + _, tx := memdb.NewTestTx(t) + txn := &types.DynamicFeeTransaction{Tip: u256.N1, FeeCap: u256.N1, CommonTx: types.CommonTx{ChainID: u256.N1, Value: u256.N1, Gas: 1, Nonce: 1}} + buf := bytes.NewBuffer(nil) + err := txn.MarshalBinary(buf) + require.NoError(err) + rlpTxn := buf.Bytes() + + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + b := &types.RawBody{Transactions: [][]byte{rlpTxn, rlpTxn, rlpTxn}} + for i := uint64(1); i <= 10; i++ { + err = rawdb.WriteRawBody(tx, common.Hash{byte(i)}, i, b) + require.NoError(err) + err = rawdb.WriteCanonicalHash(tx, common.Hash{byte(i)}, i) + require.NoError(err) + } + { + err = rawdb.MakeBodiesNonCanonical(tx, 5+1, ctx, "test", logEvery) // block 5 already canonical, start from next one + require.NoError(err) + + n, err := tx.ReadSequence(kv.EthTx) + require.NoError(err) + require.Equal(5*(3+2), int(n)) // from 0, 5 block with 3 txn in each + } + { + err = rawdb.MakeBodiesCanonical(tx, 5+1, ctx, "test", logEvery) // block 5 already canonical, start from next one + require.NoError(err) + n, err := tx.ReadSequence(kv.EthTx) + require.NoError(err) + require.Equal(10*(3+2), int(n)) + + err = rawdb.WriteRawBody(tx, common.Hash{11}, 11, b) + require.NoError(err) + err = rawdb.WriteCanonicalHash(tx, common.Hash{11}, 11) + require.NoError(err) + + n, err = tx.ReadSequence(kv.EthTx) + require.NoError(err) + require.Equal(11*(3+2), int(n)) + } + + { + // unwind to block 5, means mark blocks >= 6 as non-canonical + err = rawdb.MakeBodiesNonCanonical(tx, 5+1, ctx, "test", logEvery) + require.NoError(err) + + n, err := tx.ReadSequence(kv.EthTx) + require.NoError(err) + require.Equal(5*(3+2), int(n)) // from 0, 5 block with 3 txn in each + + err = rawdb.MakeBodiesCanonical(tx, 5+1, ctx, "test", logEvery) // block 5 already canonical, start from next one + require.NoError(err) + n, err = tx.ReadSequence(kv.EthTx) + require.NoError(err) + require.Equal(11*(3+2), int(n)) + } +} diff --git a/eth/stagedsync/stage_call_traces.go b/eth/stagedsync/stage_call_traces.go index a5952da98f8..e1256b0177e 100644 --- a/eth/stagedsync/stage_call_traces.go +++ b/eth/stagedsync/stage_call_traces.go @@ -5,21 +5,17 @@ import ( "context" "encoding/binary" "fmt" - "math" - "math/big" "runtime" - "sort" "time" "github.com/RoaringBitmap/roaring/roaring64" "github.com/c2h5oh/datasize" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" - "github.com/ledgerwatch/erigon/core/types/accounts" - "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/core/vm/stack" + "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/ethdb/bitmapdb" "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/erigon/params" @@ -71,7 +67,7 @@ func SpawnCallTraces(s *StageState, tx kv.RwTx, cfg CallTracesCfg, ctx context.C return nil } - if err := promoteCallTraces(logPrefix, tx, s.BlockNumber+1, endBlock, bitmapsBufLimit, bitmapsFlushEvery, quit, cfg); err != nil { + if err := promoteCallTraces(logPrefix, tx, s.BlockNumber+1, endBlock, bitmapsBufLimit, bitmapsFlushEvery, quit, cfg.tmpdir); err != nil { return err } @@ -87,16 +83,16 @@ func SpawnCallTraces(s *StageState, tx kv.RwTx, cfg CallTracesCfg, ctx context.C return nil } -func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64, bufLimit datasize.ByteSize, flushEvery time.Duration, quit <-chan struct{}, cfg CallTracesCfg) error { +func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64, bufLimit datasize.ByteSize, flushEvery time.Duration, quit <-chan struct{}, tmpdir string) error { logEvery := time.NewTicker(logInterval) defer logEvery.Stop() froms := map[string]*roaring64.Bitmap{} tos := map[string]*roaring64.Bitmap{} - collectorFrom := etl.NewCollector(cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer collectorFrom.Close(logPrefix) - collectorTo := etl.NewCollector(cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer collectorTo.Close(logPrefix) + collectorFrom := etl.NewCollector(logPrefix, tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collectorFrom.Close() + collectorTo := etl.NewCollector(logPrefix, tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collectorTo.Close() checkFlushEvery := time.NewTicker(flushEvery) defer checkFlushEvery.Stop() @@ -116,11 +112,11 @@ func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64 if blockNum > endBlock { break } - if len(v) != common.AddressLength+1 { + if len(v) != length.Addr+1 { return fmt.Errorf(" wrong size of value in CallTraceSet: %x (size %d)", v, len(v)) } - mapKey := string(v[:common.AddressLength]) - if v[common.AddressLength]&1 > 0 { + mapKey := string(v[:length.Addr]) + if v[length.Addr]&1 > 0 { m, ok := froms[mapKey] if !ok { m = roaring64.New() @@ -128,7 +124,7 @@ func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64 } m.Add(blockNum) } - if v[common.AddressLength]&2 > 0 { + if v[length.Addr]&2 > 0 { m, ok := tos[mapKey] if !ok { m = roaring64.New() @@ -140,14 +136,14 @@ func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64 default: case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) speed := float64(blockNum-prev) / float64(logInterval/time.Second) prev = blockNum log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockNum, "blk/second", speed, - "alloc", common.StorageSize(m.Alloc), - "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), + "sys", libcommon.ByteCount(m.Sys)) case <-checkFlushEvery.C: if needFlush64(froms, bufLimit) { if err := flushBitmaps64(collectorFrom, froms); err != nil { @@ -181,17 +177,16 @@ func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64 return err } blockNum := binary.BigEndian.Uint64(k) - if blockNum+params.FullImmutabilityThreshold <= endBlock { + if blockNum+params.FullImmutabilityThreshold >= endBlock { break } select { default: case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info(fmt.Sprintf("[%s] Pruning call trace intermediate table", logPrefix), "number", blockNum, - "alloc", common.StorageSize(m.Alloc), - "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) } if err = traceCursor.DeleteCurrentDuplicates(); err != nil { return fmt.Errorf("remove trace call set for block %d: %w", blockNum, err) @@ -206,20 +201,22 @@ func promoteCallTraces(logPrefix string, tx kv.RwTx, startBlock, endBlock uint64 if prunedMax != 0 && prunedMax > prunedMin+16 { log.Info(fmt.Sprintf("[%s] Pruned call trace intermediate table", logPrefix), "from", prunedMin, "to", prunedMax) } + if err := finaliseCallTraces(collectorFrom, collectorTo, logPrefix, tx, quit); err != nil { return err } + return nil } func finaliseCallTraces(collectorFrom, collectorTo *etl.Collector, logPrefix string, tx kv.RwTx, quit <-chan struct{}) error { - var currentBitmap = roaring64.New() var buf = bytes.NewBuffer(nil) lastChunkKey := make([]byte, 128) reader := bytes.NewReader(nil) reader2 := bytes.NewReader(nil) var loaderFunc = func(k []byte, v []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { reader.Reset(v) + currentBitmap := roaring64.New() if _, err := currentBitmap.ReadFrom(reader); err != nil { return err } @@ -249,13 +246,12 @@ func finaliseCallTraces(collectorFrom, collectorTo *etl.Collector, logPrefix str }); err != nil { return err } - currentBitmap.Clear() return nil } - if err := collectorFrom.Load(logPrefix, tx, kv.CallFromIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := collectorFrom.Load(tx, kv.CallFromIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } - if err := collectorTo.Load(logPrefix, tx, kv.CallToIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := collectorTo.Load(tx, kv.CallToIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } return nil @@ -275,7 +271,10 @@ func UnwindCallTraces(u *UnwindState, s *StageState, tx kv.RwTx, cfg CallTracesC } logPrefix := u.LogPrefix() - if err := DoUnwindCallTraces(logPrefix, tx, s.BlockNumber, u.UnwindPoint, ctx, cfg); err != nil { + if s.BlockNumber-u.UnwindPoint > 16 { + log.Info(fmt.Sprintf("[%s] Unwind", logPrefix), "from", s.BlockNumber, "to", u.UnwindPoint) + } + if err := DoUnwindCallTraces(logPrefix, tx, s.BlockNumber, u.UnwindPoint, ctx, cfg.tmpdir); err != nil { return err } @@ -292,9 +291,11 @@ func UnwindCallTraces(u *UnwindState, s *StageState, tx kv.RwTx, cfg CallTracesC return nil } -func DoUnwindCallTraces(logPrefix string, db kv.RwTx, from, to uint64, ctx context.Context, cfg CallTracesCfg) error { - froms := map[string]struct{}{} - tos := map[string]struct{}{} +func DoUnwindCallTraces(logPrefix string, db kv.RwTx, from, to uint64, ctx context.Context, tmpdir string) error { + froms := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) + defer froms.Close() + tos := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) + defer tos.Close() logEvery := time.NewTicker(30 * time.Second) defer logEvery.Stop() @@ -315,97 +316,50 @@ func DoUnwindCallTraces(logPrefix string, db kv.RwTx, from, to uint64, ctx conte if blockNum >= from { break } - if len(v) != common.AddressLength+1 { + if len(v) != length.Addr+1 { return fmt.Errorf("wrong size of value in CallTraceSet: %x (size %d)", v, len(v)) } - mapKey := string(v[:common.AddressLength]) - if v[common.AddressLength]&1 > 0 { - froms[mapKey] = struct{}{} + mapKey := v[:length.Addr] + if v[length.Addr]&1 > 0 { + if err = froms.Collect(mapKey, nil); err != nil { + return nil + } } - if v[common.AddressLength]&2 > 0 { - tos[mapKey] = struct{}{} + if v[length.Addr]&2 > 0 { + if err = tos.Collect(mapKey, nil); err != nil { + return nil + } } select { case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) speed := float64(blockNum-prev) / float64(logInterval/time.Second) prev = blockNum log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockNum, "blk/second", speed, - "alloc", common.StorageSize(m.Alloc), - "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), + "sys", libcommon.ByteCount(m.Sys)) case <-ctx.Done(): - return common.ErrStopped + return libcommon.ErrStopped default: } } - if err := truncateBitmaps64(db, kv.CallFromIndex, froms, to); err != nil { - return err - } - if err := truncateBitmaps64(db, kv.CallToIndex, tos, to); err != nil { - return err - } - return nil -} - -type CallTracer struct { - froms map[common.Address]struct{} - tos map[common.Address]bool // address -> isCreated - hasTEVM func(contractHash common.Hash) (bool, error) -} - -func NewCallTracer(hasTEVM func(contractHash common.Hash) (bool, error)) *CallTracer { - return &CallTracer{ - froms: make(map[common.Address]struct{}), - tos: make(map[common.Address]bool), - hasTEVM: hasTEVM, - } -} - -func (ct *CallTracer) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { - ct.froms[from] = struct{}{} - - created, ok := ct.tos[to] - if !ok { - ct.tos[to] = false + if err = froms.Load(db, "", func(k, v []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { + return bitmapdb.TruncateRange64(db, kv.CallFromIndex, k, to+1) + }, etl.TransformArgs{}); err != nil { + return fmt.Errorf("TruncateRange: bucket=%s, %w", kv.CallFromIndex, err) } - if !created && create { - if !accounts.IsEmptyCodeHash(codeHash) && ct.hasTEVM != nil { - has, err := ct.hasTEVM(codeHash) - if !has { - ct.tos[to] = true - } - - if err != nil { - log.Warn("while CaptureStart", "error", err) - } - } + if err = tos.Load(db, "", func(k, v []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { + return bitmapdb.TruncateRange64(db, kv.CallToIndex, k, to+1) + }, etl.TransformArgs{}); err != nil { + return fmt.Errorf("TruncateRange: bucket=%s, %w", kv.CallFromIndex, err) } return nil } -func (ct *CallTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, rData []byte, contract *vm.Contract, depth int, err error) error { - return nil -} -func (ct *CallTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, contract *vm.Contract, depth int, err error) error { - return nil -} -func (ct *CallTracer) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { - return nil -} -func (ct *CallTracer) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { - ct.froms[from] = struct{}{} - ct.tos[to] = false -} -func (ct *CallTracer) CaptureAccountRead(account common.Address) error { - return nil -} -func (ct *CallTracer) CaptureAccountWrite(account common.Address) error { - return nil -} func PruneCallTraces(s *PruneState, tx kv.RwTx, cfg CallTracesCfg, ctx context.Context) (err error) { logPrefix := s.LogPrefix() @@ -420,7 +374,7 @@ func PruneCallTraces(s *PruneState, tx kv.RwTx, cfg CallTracesCfg, ctx context.C } if cfg.prune.CallTraces.Enabled() { - if err = pruneCallTraces(tx, logPrefix, cfg.tmpdir, cfg.prune.History.PruneTo(s.ForwardProgress), ctx); err != nil { + if err = pruneCallTraces(tx, logPrefix, cfg.prune.CallTraces.PruneTo(s.ForwardProgress), ctx, cfg.tmpdir); err != nil { return err } } @@ -436,12 +390,14 @@ func PruneCallTraces(s *PruneState, tx kv.RwTx, cfg CallTracesCfg, ctx context.C return nil } -func pruneCallTraces(tx kv.RwTx, logPrefix, tmpDir string, pruneTo uint64, ctx context.Context) error { +func pruneCallTraces(tx kv.RwTx, logPrefix string, pruneTo uint64, ctx context.Context, tmpdir string) error { logEvery := time.NewTicker(logInterval) defer logEvery.Stop() - froms := map[string]struct{}{} - tos := map[string]struct{}{} + froms := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) + defer froms.Close() + tos := etl.NewCollector(logPrefix, tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) + defer tos.Close() { traceCursor, err := tx.CursorDupSort(kv.CallTraceSet) @@ -459,97 +415,94 @@ func pruneCallTraces(tx kv.RwTx, logPrefix, tmpDir string, pruneTo uint64, ctx c if blockNum >= pruneTo { break } - if len(v) != common.AddressLength+1 { + if len(v) != length.Addr+1 { return fmt.Errorf("wrong size of value in CallTraceSet: %x (size %d)", v, len(v)) } - mapKey := string(v[:common.AddressLength]) - if v[common.AddressLength]&1 > 0 { - froms[mapKey] = struct{}{} + mapKey := v[:length.Addr] + if v[length.Addr]&1 > 0 { + if err := froms.Collect(mapKey, nil); err != nil { + return err + } } - if v[common.AddressLength]&2 > 0 { - tos[mapKey] = struct{}{} + if v[length.Addr]&2 > 0 { + if err := tos.Collect(mapKey, nil); err != nil { + return err + } } select { case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockNum, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + libcommon.ReadMemStats(&m) + log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockNum, "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) case <-ctx.Done(): - return common.ErrStopped + return libcommon.ErrStopped default: } } - } { - sorted := make([]string, 0, len(froms)) - for k := range froms { - sorted = append(sorted, k) - } - sort.Strings(sorted) c, err := tx.RwCursor(kv.CallFromIndex) if err != nil { return err } defer c.Close() - for _, fromS := range sorted { - from := []byte(fromS) + if err := froms.Load(tx, "", func(from, _ []byte, _ etl.CurrentTableReader, _ etl.LoadNextFunc) error { for k, _, err := c.Seek(from); k != nil; k, _, err = c.Next() { if err != nil { return err } - blockNum := binary.BigEndian.Uint64(k[common.AddressLength:]) + blockNum := binary.BigEndian.Uint64(k[length.Addr:]) if !bytes.HasPrefix(k, from) || blockNum >= pruneTo { break } - select { - case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.CallFromIndex, "block", blockNum) - case <-ctx.Done(): - return common.ErrStopped - default: - } if err = c.DeleteCurrent(); err != nil { return fmt.Errorf("failed delete, block=%d: %w", blockNum, err) } } + select { + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", kv.CallFromIndex, "key", fmt.Sprintf("%x", from)) + case <-ctx.Done(): + return libcommon.ErrStopped + default: + } + return nil + }, etl.TransformArgs{}); err != nil { + return err } } { - sorted := make([]string, 0, len(tos)) - for k := range tos { - sorted = append(sorted, k) - } - sort.Strings(sorted) c, err := tx.RwCursor(kv.CallToIndex) if err != nil { return err } defer c.Close() - for _, toS := range sorted { - to := []byte(toS) + if err := tos.Load(tx, "", func(to, _ []byte, _ etl.CurrentTableReader, _ etl.LoadNextFunc) error { for k, _, err := c.Seek(to); k != nil; k, _, err = c.Next() { if err != nil { return err } - blockNum := binary.BigEndian.Uint64(k[common.AddressLength:]) + blockNum := binary.BigEndian.Uint64(k[length.Addr:]) if !bytes.HasPrefix(k, to) || blockNum >= pruneTo { break } - select { - case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.CallToIndex, "block", blockNum) - case <-ctx.Done(): - return common.ErrStopped - default: - } if err = c.DeleteCurrent(); err != nil { return fmt.Errorf("failed delete, block=%d: %w", blockNum, err) } } + select { + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", kv.CallToIndex, "key", fmt.Sprintf("%x", to)) + case <-ctx.Done(): + return libcommon.ErrStopped + default: + } + return nil + }, etl.TransformArgs{}); err != nil { + return err } } return nil diff --git a/eth/stagedsync/stage_call_traces_test.go b/eth/stagedsync/stage_call_traces_test.go new file mode 100644 index 00000000000..4995c6b626f --- /dev/null +++ b/eth/stagedsync/stage_call_traces_test.go @@ -0,0 +1,74 @@ +package stagedsync + +import ( + "context" + "testing" + "time" + + "github.com/RoaringBitmap/roaring/roaring64" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/ethdb/bitmapdb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func genTestCallTraceSet(t *testing.T, tx kv.RwTx, to uint64) { + v := [21]byte{} + for i := uint64(0); i < to; i++ { + v[19] = byte(i % 5) + if i%2 == 0 { + v[20] = 1 + } + if i%2 == 1 { + v[20] = 2 + } + err := tx.Put(kv.CallTraceSet, dbutils.EncodeBlockNumber(i), v[:]) + require.NoError(t, err) + } +} + +func TestCallTrace(t *testing.T) { + ctx, assert := context.Background(), assert.New(t) + _, tx := memdb.NewTestTx(t) + genTestCallTraceSet(t, tx, 30) + addr := [20]byte{} + addr[19] = byte(1) + froms := func() *roaring64.Bitmap { + b, err := bitmapdb.Get64(tx, kv.CallFromIndex, addr[:], 0, 30) + assert.NoError(err) + return b + } + tos := func() *roaring64.Bitmap { + b, err := bitmapdb.Get64(tx, kv.CallToIndex, addr[:], 0, 30) + assert.NoError(err) + return b + } + + err := stages.SaveStageProgress(tx, stages.Execution, 30) + assert.NoError(err) + + // forward 0->20 + err = promoteCallTraces("test", tx, 0, 20, 0, time.Nanosecond, ctx.Done(), "") + assert.NoError(err) + assert.Equal([]uint64{6, 16}, froms().ToArray()) + assert.Equal([]uint64{1, 11}, tos().ToArray()) + + // unwind 20->10 + err = DoUnwindCallTraces("test", tx, 20, 10, ctx, "") + assert.NoError(err) + assert.Equal([]uint64{6}, froms().ToArray()) + assert.Equal([]uint64{1}, tos().ToArray()) + + // forward 10->30 + err = promoteCallTraces("test", tx, 10, 30, 0, time.Nanosecond, ctx.Done(), "") + assert.NoError(err) + assert.Equal([]uint64{6, 16, 26}, froms().ToArray()) + assert.Equal([]uint64{1, 11, 21}, tos().ToArray()) + + // prune 0 -> 10 + err = pruneCallTraces(tx, "test", 10, ctx, "") + assert.NoError(err) +} diff --git a/eth/stagedsync/stage_cumulative_index.go b/eth/stagedsync/stage_cumulative_index.go new file mode 100644 index 00000000000..4a6495e9595 --- /dev/null +++ b/eth/stagedsync/stage_cumulative_index.go @@ -0,0 +1,155 @@ +package stagedsync + +import ( + "bytes" + "context" + "fmt" + "math/big" + "time" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" +) + +type CumulativeIndexCfg struct { + db kv.RwDB +} + +func StageCumulativeIndexCfg(db kv.RwDB) CumulativeIndexCfg { + return CumulativeIndexCfg{ + db: db, + } +} + +func SpawnStageCumulativeIndex(cfg CumulativeIndexCfg, s *StageState, tx kv.RwTx, ctx context.Context) error { + useExternalTx := tx != nil + + if !useExternalTx { + var err error + tx, err = cfg.db.BeginRw(context.Background()) + if err != nil { + return err + } + defer tx.Rollback() + } + // Log timer + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + headNumber, err := stages.GetStageProgress(tx, stages.Headers) + if err != nil { + return fmt.Errorf("getting bodies progress: %w", err) + } + // If we are done already, we can exit the stage + if s.BlockNumber == headNumber { + return nil + } + + cumulativeGasUsed, err := rawdb.ReadCumulativeGasUsed(tx, s.BlockNumber) + if err != nil { + return err + } + + prevProgress := s.BlockNumber + headerC, err := tx.Cursor(kv.Headers) + if err != nil { + return err + } + + currentBlockNumber := s.BlockNumber + 1 + for k, v, err := headerC.Seek(dbutils.EncodeBlockNumber(s.BlockNumber)); k != nil; k, v, err = headerC.Next() { + if err != nil { + return err + } + + if len(k) != 40 { + continue + } + + blockNumber, err := dbutils.DecodeBlockNumber(k[:8]) + if err != nil { + return err + } + + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockNumber) + if err != nil { + return err + } + + if canonicalHash != common.BytesToHash(k[8:]) { + continue + } + + currentBlockNumber = blockNumber + + var header types.Header + if err := rlp.Decode(bytes.NewReader(v), &header); err != nil { + return err + } + cumulativeGasUsed.Add(cumulativeGasUsed, big.NewInt(int64(header.GasUsed))) + + if err := rawdb.WriteCumulativeGasUsed(tx, currentBlockNumber, cumulativeGasUsed); err != nil { + return err + } + + // Check for logs + select { + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Wrote Cumulative Index", s.LogPrefix()), + "gasUsed", cumulativeGasUsed.String(), "now", currentBlockNumber, "blk/sec", float64(currentBlockNumber-prevProgress)/float64(logInterval/time.Second)) + prevProgress = currentBlockNumber + default: + log.Trace("RequestQueueTime (header) ticked") + } + // Cleanup timer + } + if err = s.Update(tx, currentBlockNumber); err != nil { + return err + } + if !useExternalTx { + if err = tx.Commit(); err != nil { + return err + } + } + return nil +} + +func UnwindCumulativeIndexStage(u *UnwindState, cfg CumulativeIndexCfg, tx kv.RwTx, ctx context.Context) (err error) { + useExternalTx := tx != nil + if !useExternalTx { + tx, err = cfg.db.BeginRw(ctx) + if err != nil { + return err + } + defer tx.Rollback() + } + + if err = u.Done(tx); err != nil { + return fmt.Errorf(" reset: %w", err) + } + + if !useExternalTx { + if err = tx.Commit(); err != nil { + return fmt.Errorf("failed to write db commit: %w", err) + } + } + + return nil +} + +func PruneCumulativeIndexStage(p *PruneState, tx kv.RwTx, ctx context.Context) (err error) { + useExternalTx := tx != nil + + if !useExternalTx { + if err = tx.Commit(); err != nil { + return err + } + } + return nil +} diff --git a/eth/stagedsync/stage_execute.go b/eth/stagedsync/stage_execute.go index cf2284d552e..aeae1dc7725 100644 --- a/eth/stagedsync/stage_execute.go +++ b/eth/stagedsync/stage_execute.go @@ -4,20 +4,21 @@ import ( "context" "encoding/binary" "fmt" + "math/big" "runtime" - "sort" "time" - metrics2 "github.com/VictoriaMetrics/metrics" "github.com/c2h5oh/datasize" + lru "github.com/hashicorp/golang-lru" + "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/ethdb/olddb" - "github.com/ledgerwatch/erigon/ethdb/prune" - - "github.com/ledgerwatch/erigon/common" + commonold "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" + "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" @@ -25,17 +26,20 @@ import ( "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/eth/calltracer" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb" + "github.com/ledgerwatch/erigon/ethdb/olddb" + "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/erigon/turbo/shards" "github.com/ledgerwatch/log/v3" ) -var stageExecutionGauge = metrics2.GetOrCreateCounter("stage_execution") - const ( - logInterval = 30 * time.Second + logInterval = 20 * time.Second + lruDefaultSize = 1_000_000 // 56 MB ) type HasChangeSetWriter interface { @@ -55,6 +59,7 @@ type ExecuteBlockCfg struct { tmpdir string stateStream bool accumulator *shards.Accumulator + blockReader services.FullBlockReader } func StageExecuteBlocksCfg( @@ -68,6 +73,7 @@ func StageExecuteBlocksCfg( accumulator *shards.Accumulator, stateStream bool, tmpdir string, + blockReader services.FullBlockReader, ) ExecuteBlockCfg { return ExecuteBlockCfg{ db: kv, @@ -80,18 +86,10 @@ func StageExecuteBlocksCfg( tmpdir: tmpdir, accumulator: accumulator, stateStream: stateStream, + blockReader: blockReader, } } -func readBlock(blockNum uint64, tx kv.Tx) (*types.Block, error) { - blockHash, err := rawdb.ReadCanonicalHash(tx, blockNum) - if err != nil { - return nil, err - } - b, _, err := rawdb.ReadBlockWithSenders(tx, blockHash, blockNum) - return b, err -} - func executeBlock( block *types.Block, tx kv.RwTx, @@ -101,19 +99,33 @@ func executeBlock( writeChangesets bool, writeReceipts bool, writeCallTraces bool, - checkTEVM func(contractHash common.Hash) (bool, error), + contractHasTEVM func(contractHash commonold.Hash) (bool, error), initialCycle bool, ) error { blockNum := block.NumberU64() - stateReader, stateWriter := newStateReaderWriter(batch, tx, blockNum, block.Hash(), writeChangesets, cfg.accumulator, initialCycle, cfg.stateStream) + stateReader, stateWriter, err := newStateReaderWriter(batch, tx, block, writeChangesets, cfg.accumulator, initialCycle, cfg.stateStream) + if err != nil { + return err + } // where the magic happens - getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } + getHeader := func(hash commonold.Hash, number uint64) *types.Header { + h, _ := cfg.blockReader.Header(context.Background(), tx, hash, number) + return h + } - callTracer := NewCallTracer(checkTEVM) + callTracer := calltracer.NewCallTracer(contractHasTEVM) vmConfig.Debug = true vmConfig.Tracer = callTracer - receipts, err := core.ExecuteBlockEphemerally(cfg.chainConfig, &vmConfig, getHeader, cfg.engine, block, stateReader, stateWriter, epochReader{tx: tx}, chainReader{config: cfg.chainConfig, tx: tx}, checkTEVM) + + var receipts types.Receipts + var stateSyncReceipt *types.ReceiptForStorage + _, isPoSa := cfg.engine.(consensus.PoSA) + if isPoSa { + receipts, err = core.ExecuteBlockEphemerallyForBSC(cfg.chainConfig, &vmConfig, getHeader, cfg.engine, block, stateReader, stateWriter, epochReader{tx: tx}, chainReader{config: cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}, contractHasTEVM) + } else { + receipts, stateSyncReceipt, err = core.ExecuteBlockEphemerally(cfg.chainConfig, &vmConfig, getHeader, cfg.engine, block, stateReader, stateWriter, epochReader{tx: tx}, chainReader{config: cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}, contractHasTEVM) + } if err != nil { return err } @@ -122,6 +134,13 @@ func executeBlock( if err = rawdb.AppendReceipts(tx, blockNum, receipts); err != nil { return err } + + if stateSyncReceipt != nil { + if err := rawdb.WriteBorReceipt(tx, block.Hash(), block.NumberU64(), stateSyncReceipt); err != nil { + return err + } + } + } if cfg.changeSetHook != nil { @@ -129,72 +148,21 @@ func executeBlock( cfg.changeSetHook(blockNum, hasChangeSet.ChangeSetWriter()) } } - if writeCallTraces { - callTracer.tos[block.Coinbase()] = false - for _, uncle := range block.Uncles() { - callTracer.tos[uncle.Coinbase] = false - } - list := make(common.Addresses, len(callTracer.froms)+len(callTracer.tos)) - i := 0 - for addr := range callTracer.froms { - copy(list[i][:], addr[:]) - i++ - } - for addr := range callTracer.tos { - copy(list[i][:], addr[:]) - i++ - } - sort.Sort(list) - // List may contain duplicates - var blockNumEnc [8]byte - binary.BigEndian.PutUint64(blockNumEnc[:], blockNum) - var prev common.Address - var created bool - for j, addr := range list { - if j > 0 && prev == addr { - continue - } - var v [common.AddressLength + 1]byte - copy(v[:], addr[:]) - if _, ok := callTracer.froms[addr]; ok { - v[common.AddressLength] |= 1 - } - if _, ok := callTracer.tos[addr]; ok { - v[common.AddressLength] |= 2 - } - // TEVM marking still untranslated contracts - if vmConfig.EnableTEMV { - if created = callTracer.tos[addr]; created { - v[common.AddressLength] |= 4 - } - } - if j == 0 { - if err = tx.Append(kv.CallTraceSet, blockNumEnc[:], v[:]); err != nil { - return err - } - } else { - if err = tx.AppendDup(kv.CallTraceSet, blockNumEnc[:], v[:]); err != nil { - return err - } - } - copy(prev[:], addr[:]) - } + return callTracer.WriteToDb(tx, block, *cfg.vmConfig) } - return nil } func newStateReaderWriter( batch ethdb.Database, tx kv.RwTx, - blockNum uint64, - blockHash common.Hash, + block *types.Block, writeChangesets bool, accumulator *shards.Accumulator, initialCycle bool, stateStream bool, -) (state.StateReader, state.WriterWithChangeSets) { +) (state.StateReader, state.WriterWithChangeSets, error) { var stateReader state.StateReader var stateWriter state.WriterWithChangeSets @@ -202,17 +170,21 @@ func newStateReaderWriter( stateReader = state.NewPlainStateReader(batch) if !initialCycle && stateStream { - accumulator.StartChange(blockNum, blockHash, false) + txs, err := rawdb.RawTransactionsRange(tx, block.NumberU64(), block.NumberU64()) + if err != nil { + return nil, nil, err + } + accumulator.StartChange(block.NumberU64(), block.Hash(), txs, false) } else { accumulator = nil } if writeChangesets { - stateWriter = state.NewPlainStateWriter(batch, tx, blockNum).SetAccumulator(accumulator) + stateWriter = state.NewPlainStateWriter(batch, tx, block.NumberU64()).SetAccumulator(accumulator) } else { stateWriter = state.NewPlainStateWriterNoHistory(batch).SetAccumulator(accumulator) } - return stateReader, stateWriter + return stateReader, stateWriter, nil } func SpawnExecuteBlocksStage(s *StageState, u Unwinder, tx kv.RwTx, toBlock uint64, ctx context.Context, cfg ExecuteBlockCfg, initialCycle bool) (err error) { @@ -239,7 +211,7 @@ func SpawnExecuteBlocksStage(s *StageState, u Unwinder, tx kv.RwTx, toBlock uint logPrefix := s.LogPrefix() var to = prevStageProgress if toBlock > 0 { - to = min(prevStageProgress, toBlock) + to = cmp.Min(prevStageProgress, toBlock) } if to <= s.BlockNumber { return nil @@ -248,27 +220,53 @@ func SpawnExecuteBlocksStage(s *StageState, u Unwinder, tx kv.RwTx, toBlock uint log.Info(fmt.Sprintf("[%s] Blocks execution", logPrefix), "from", s.BlockNumber, "to", to) } + startTime := time.Now() + + whitelistedTables := []string{kv.Code, kv.ContractCode} var batch ethdb.DbWithPendingMutations - batch = olddb.NewBatch(tx, quit) - defer batch.Rollback() + // Contract code is unlikely to change too much, so let's keep it cached + contractCodeCache, err := lru.New(lruDefaultSize) + if err != nil { + return err + } + // state is stored through ethdb batches + batch = olddb.NewHashBatch(tx, quit, cfg.tmpdir, whitelistedTables, contractCodeCache) + defer batch.Rollback() + // changes are stored through memory buffer logEvery := time.NewTicker(logInterval) defer logEvery.Stop() stageProgress := s.BlockNumber logBlock := stageProgress logTx, lastLogTx := uint64(0), uint64(0) logTime := time.Now() - var gas uint64 + var gas uint64 // used for logs + var currentStateGas uint64 // used for batch commits of state + // Transform batch_size limit into Ggas + gasState := uint64(cfg.batchSize) * uint64(datasize.KB) * 2 + + startGasUsed, err := rawdb.ReadCumulativeGasUsed(tx, s.BlockNumber) + if err != nil { + return err + } + totalGasUsed, err := rawdb.ReadCumulativeGasUsed(tx, to) + if err != nil { + return err + } var stoppedErr error Loop: for blockNum := stageProgress + 1; blockNum <= to; blockNum++ { if stoppedErr = common.Stopped(quit); stoppedErr != nil { break } - var err error - var block *types.Block - if block, err = readBlock(blockNum, tx); err != nil { + + blockHash, err := rawdb.ReadCanonicalHash(tx, blockNum) + if err != nil { + return err + } + block, _, err := cfg.blockReader.BlockWithSenders(ctx, tx, blockHash, blockNum) + if err != nil { return err } if block == nil { @@ -278,25 +276,26 @@ Loop: lastLogTx += uint64(block.Transactions().Len()) - var checkTEVMCode func(contractHash common.Hash) (bool, error) + var contractHasTEVM func(contractHash commonold.Hash) (bool, error) if cfg.vmConfig.EnableTEMV { - checkTEVMCode = ethdb.GetCheckTEVM(tx) + contractHasTEVM = ethdb.GetHasTEVM(tx) } // Incremental move of next stages depend on fully written ChangeSets, Receipts, CallTraceSet writeChangeSets := nextStagesExpectData || blockNum > cfg.prune.History.PruneTo(to) writeReceipts := nextStagesExpectData || blockNum > cfg.prune.Receipts.PruneTo(to) writeCallTraces := nextStagesExpectData || blockNum > cfg.prune.CallTraces.PruneTo(to) - if err = executeBlock(block, tx, batch, cfg, *cfg.vmConfig, writeChangeSets, writeReceipts, writeCallTraces, checkTEVMCode, initialCycle); err != nil { - log.Error(fmt.Sprintf("[%s] Execution failed", logPrefix), "block", blockNum, "hash", block.Hash().String(), "error", err) + if err = executeBlock(block, tx, batch, cfg, *cfg.vmConfig, writeChangeSets, writeReceipts, writeCallTraces, contractHasTEVM, initialCycle); err != nil { + log.Warn(fmt.Sprintf("[%s] Execution failed", logPrefix), "block", blockNum, "hash", block.Hash().String(), "err", err) u.UnwindTo(blockNum-1, block.Hash()) break Loop } stageProgress = blockNum - updateProgress := batch.BatchSize() >= int(cfg.batchSize) - if updateProgress { + if currentStateGas >= gasState { + log.Info("Committed State", "gas reached", currentStateGas, "gasTarget", gasState) + currentStateGas = 0 if err = batch.Commit(); err != nil { return err } @@ -314,20 +313,31 @@ Loop: // TODO: This creates stacked up deferrals defer tx.Rollback() } - batch = olddb.NewBatch(tx, quit) + batch = olddb.NewHashBatch(tx, quit, cfg.tmpdir, whitelistedTables, contractCodeCache) // TODO: This creates stacked up deferrals defer batch.Rollback() } gas = gas + block.GasUsed() - + currentStateGas = currentStateGas + block.GasUsed() select { default: case <-logEvery.C: - logBlock, logTx, logTime = logProgress(logPrefix, logBlock, logTime, blockNum, logTx, lastLogTx, gas, batch) + cumulativeGas, err := rawdb.ReadCumulativeGasUsed(tx, blockNum) + if err != nil { + return err + } + totalGasTmp := new(big.Int).Set(totalGasUsed) + elapsed := time.Since(startTime) + estimateRatio := float64(cumulativeGas.Sub(cumulativeGas, startGasUsed).Uint64()) / float64(totalGasTmp.Sub(totalGasTmp, startGasUsed).Uint64()) + var estimatedTime commonold.PrettyDuration + if estimateRatio != 0 { + estimatedTime = commonold.PrettyDuration((elapsed.Seconds() / estimateRatio) * float64(time.Second)) + } + logBlock, logTx, logTime = logProgress(logPrefix, logBlock, logTime, blockNum, logTx, lastLogTx, gas, float64(currentStateGas)/float64(gasState), estimatedTime, batch) gas = 0 tx.CollectMetrics() - stageExecutionGauge.Set(blockNum) + syncMetrics[stages.Execution].Set(blockNum) } } @@ -348,53 +358,29 @@ Loop: return stoppedErr } -func pruneChangeSets(tx kv.RwTx, logPrefix string, table string, pruneTo uint64, logEvery *time.Ticker, ctx context.Context) error { - c, err := tx.RwCursorDupSort(table) - if err != nil { - return fmt.Errorf("failed to create cursor for pruning %w", err) - } - defer c.Close() - - for k, _, err := c.First(); k != nil; k, _, err = c.NextNoDup() { - if err != nil { - return fmt.Errorf("failed to move %s cleanup cursor: %w", table, err) - } - blockNum := binary.BigEndian.Uint64(k) - if blockNum >= pruneTo { - break - } - select { - case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", table, "block", blockNum) - case <-ctx.Done(): - return common.ErrStopped - default: - } - if err = c.DeleteCurrentDuplicates(); err != nil { - return fmt.Errorf("failed to remove for block %d: %w", blockNum, err) - } - } - return nil -} - -func logProgress(logPrefix string, prevBlock uint64, prevTime time.Time, currentBlock uint64, prevTx, currentTx uint64, gas uint64, batch ethdb.DbWithPendingMutations) (uint64, uint64, time.Time) { +func logProgress(logPrefix string, prevBlock uint64, prevTime time.Time, currentBlock uint64, prevTx, currentTx uint64, gas uint64, gasState float64, estimatedTime commonold.PrettyDuration, batch ethdb.DbWithPendingMutations) (uint64, uint64, time.Time) { currentTime := time.Now() interval := currentTime.Sub(prevTime) speed := float64(currentBlock-prevBlock) / (float64(interval) / float64(time.Second)) speedTx := float64(currentTx-prevTx) / (float64(interval) / float64(time.Second)) speedMgas := float64(gas) / 1_000_000 / (float64(interval) / float64(time.Second)) + var m runtime.MemStats - runtime.ReadMemStats(&m) + common.ReadMemStats(&m) var logpairs = []interface{}{ "number", currentBlock, - "blk/s", speed, - "tx/s", speedTx, - "Mgas/s", speedMgas, + "blk/s", fmt.Sprintf("%.1f", speed), + "tx/s", fmt.Sprintf("%.1f", speedTx), + "Mgas/s", fmt.Sprintf("%.1f", speedMgas), + "gasState", fmt.Sprintf("%.2f", gasState), + } + if estimatedTime > 0 { + logpairs = append(logpairs, "estimated duration", estimatedTime) } if batch != nil { - logpairs = append(logpairs, "batch", common.StorageSize(batch.BatchSize())) + logpairs = append(logpairs, "batch", common.ByteCount(uint64(batch.BatchSize()))) } - logpairs = append(logpairs, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + logpairs = append(logpairs, "alloc", common.ByteCount(m.Alloc), "sys", common.ByteCount(m.Sys)) log.Info(fmt.Sprintf("[%s] Executed blocks", logPrefix), logpairs...) return currentBlock, currentTx, currentTime @@ -434,25 +420,31 @@ func UnwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, ctx context func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan struct{}, cfg ExecuteBlockCfg, initialCycle bool) error { logPrefix := s.LogPrefix() stateBucket := kv.PlainState - storageKeyLength := common.AddressLength + common.IncarnationLength + common.HashLength + storageKeyLength := length.Addr + length.Incarnation + length.Hash var accumulator *shards.Accumulator if !initialCycle && cfg.stateStream { + accumulator = cfg.accumulator + hash, err := rawdb.ReadCanonicalHash(tx, u.UnwindPoint) if err != nil { return fmt.Errorf("read canonical hash of unwind point: %w", err) } - accumulator.StartChange(u.UnwindPoint, hash, true /* unwind */) + txs, err := rawdb.RawTransactionsRange(tx, u.UnwindPoint, s.BlockNumber) + if err != nil { + return err + } + accumulator.StartChange(u.UnwindPoint, hash, txs, true) } - changes := etl.NewCollector(cfg.tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) - defer changes.Close(logPrefix) + changes := etl.NewCollector(logPrefix, cfg.tmpdir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) + defer changes.Close() errRewind := changeset.RewindData(tx, s.BlockNumber, u.UnwindPoint, changes, quit) if errRewind != nil { return fmt.Errorf("getting rewind data: %w", errRewind) } - if err := changes.Load(logPrefix, tx, stateBucket, func(k, v []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { + if err := changes.Load(tx, stateBucket, func(k, v []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { if len(k) == 20 { if len(v) > 0 { var acc accounts.Account @@ -462,7 +454,7 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan // Fetch the code hash recoverCodeHashPlain(&acc, tx, k) - var address common.Address + var address commonold.Address copy(address[:], k) // cleanup contract code bucket @@ -483,14 +475,14 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan newV := make([]byte, acc.EncodingLengthForStorage()) acc.EncodeForStorage(newV) if accumulator != nil { - accumulator.ChangeAccount(address, newV) + accumulator.ChangeAccount(address, acc.Incarnation, newV) } if err := next(k, k, newV); err != nil { return err } } else { if accumulator != nil { - var address common.Address + var address commonold.Address copy(address[:], k) accumulator.DeleteAccount(address) } @@ -501,13 +493,13 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan return nil } if accumulator != nil { - var address common.Address + var address commonold.Address var incarnation uint64 - var location common.Hash - copy(address[:], k[:common.AddressLength]) - incarnation = binary.BigEndian.Uint64(k[common.AddressLength:]) - copy(location[:], k[common.AddressLength+common.IncarnationLength:]) - accumulator.ChangeStorage(address, incarnation, location, common.CopyBytes(v)) + var location commonold.Hash + copy(address[:], k[:length.Addr]) + incarnation = binary.BigEndian.Uint64(k[length.Addr:]) + copy(location[:], k[length.Addr+length.Incarnation:]) + accumulator.ChangeStorage(address, incarnation, location, common.Copy(v)) } if len(v) > 0 { if err := next(k, k[:storageKeyLength], v); err != nil { @@ -528,11 +520,14 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan return err } - if err := rawdb.DeleteNewerReceipts(tx, u.UnwindPoint+1); err != nil { - return fmt.Errorf("walking receipts: %w", err) + if err := rawdb.TruncateReceipts(tx, u.UnwindPoint+1); err != nil { + return fmt.Errorf("truncate receipts: %w", err) + } + if err := rawdb.TruncateBorReceipts(tx, u.UnwindPoint+1); err != nil { + return fmt.Errorf("truncate bor receipts: %w", err) } if err := rawdb.DeleteNewerEpochs(tx, u.UnwindPoint+1); err != nil { - return fmt.Errorf("walking epoch: %w", err) + return fmt.Errorf("delete newer epochs: %w", err) } // Truncate CallTraceSet @@ -556,7 +551,7 @@ func unwindExecutionStage(u *UnwindState, s *StageState, tx kv.RwTx, quit <-chan } func recoverCodeHashPlain(acc *accounts.Account, db kv.Tx, key []byte) { - var address common.Address + var address commonold.Address copy(address[:], key) if acc.Incarnation > 0 && acc.IsEmptyCodeHash() { if codeHash, err2 := db.GetOne(kv.PlainContractCode, dbutils.PlainGenerateStoragePrefix(address[:], acc.Incarnation)); err2 == nil { @@ -565,13 +560,6 @@ func recoverCodeHashPlain(acc *accounts.Account, db kv.Tx, key []byte) { } } -func min(a, b uint64) uint64 { - if a <= b { - return a - } - return b -} - func PruneExecutionStage(s *PruneState, tx kv.RwTx, cfg ExecuteBlockCfg, ctx context.Context, initialCycle bool) (err error) { logPrefix := s.LogPrefix() useExternalTx := tx != nil @@ -587,21 +575,25 @@ func PruneExecutionStage(s *PruneState, tx kv.RwTx, cfg ExecuteBlockCfg, ctx con defer logEvery.Stop() if cfg.prune.History.Enabled() { - if err = pruneChangeSets(tx, logPrefix, kv.AccountChangeSet, cfg.prune.History.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { + if err = PruneTableDupSort(tx, kv.AccountChangeSet, logPrefix, cfg.prune.History.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { return err } - if err = pruneChangeSets(tx, logPrefix, kv.StorageChangeSet, cfg.prune.History.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { + if err = PruneTableDupSort(tx, kv.StorageChangeSet, logPrefix, cfg.prune.History.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { return err } } if cfg.prune.Receipts.Enabled() { - if err = pruneReceipts(tx, logPrefix, cfg.prune.Receipts.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { + if err = PruneTable(tx, kv.Receipts, cfg.prune.Receipts.PruneTo(s.ForwardProgress), ctx, math.MaxInt32); err != nil { + return err + } + // LogIndex.Prune will read everything what not pruned here + if err = PruneTable(tx, kv.Log, cfg.prune.Receipts.PruneTo(s.ForwardProgress), ctx, math.MaxInt32); err != nil { return err } } if cfg.prune.CallTraces.Enabled() { - if err = pruneCallTracesSet(tx, logPrefix, cfg.prune.CallTraces.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { + if err = PruneTableDupSort(tx, kv.CallTraceSet, logPrefix, cfg.prune.CallTraces.PruneTo(s.ForwardProgress), logEvery, ctx); err != nil { return err } } @@ -616,88 +608,3 @@ func PruneExecutionStage(s *PruneState, tx kv.RwTx, cfg ExecuteBlockCfg, ctx con } return nil } - -func pruneReceipts(tx kv.RwTx, logPrefix string, pruneTo uint64, logEvery *time.Ticker, ctx context.Context) error { - c, err := tx.RwCursor(kv.Receipts) - if err != nil { - return fmt.Errorf("failed to create cursor for pruning %w", err) - } - defer c.Close() - - for k, _, err := c.First(); k != nil; k, _, err = c.Next() { - if err != nil { - return err - } - - blockNum := binary.BigEndian.Uint64(k) - if blockNum >= pruneTo { - break - } - select { - case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.Receipts, "block", blockNum) - case <-ctx.Done(): - return common.ErrStopped - default: - } - if err = c.DeleteCurrent(); err != nil { - return fmt.Errorf("failed to remove for block %d: %w", blockNum, err) - } - } - - c, err = tx.RwCursor(kv.Log) - if err != nil { - return fmt.Errorf("failed to create cursor for pruning %w", err) - } - defer c.Close() - - for k, _, err := c.First(); k != nil; k, _, err = c.Next() { - if err != nil { - return err - } - blockNum := binary.BigEndian.Uint64(k) - if blockNum >= pruneTo { - break - } - select { - case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.Log, "block", blockNum) - case <-ctx.Done(): - return common.ErrStopped - default: - } - if err = c.DeleteCurrent(); err != nil { - return fmt.Errorf("failed to remove for block %d: %w", blockNum, err) - } - } - return nil -} - -func pruneCallTracesSet(tx kv.RwTx, logPrefix string, pruneTo uint64, logEvery *time.Ticker, ctx context.Context) error { - c, err := tx.RwCursorDupSort(kv.CallTraceSet) - if err != nil { - return fmt.Errorf("failed to create cursor for pruning %w", err) - } - defer c.Close() - - for k, _, err := c.First(); k != nil; k, _, err = c.NextNoDup() { - if err != nil { - return err - } - blockNum := binary.BigEndian.Uint64(k) - if blockNum >= pruneTo { - break - } - select { - case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.CallTraceSet, "block", blockNum) - case <-ctx.Done(): - return common.ErrStopped - default: - } - if err = c.DeleteCurrentDuplicates(); err != nil { - return fmt.Errorf("failed to remove for block %d: %w", blockNum, err) - } - } - return nil -} diff --git a/eth/stagedsync/stage_execute_test.go b/eth/stagedsync/stage_execute_test.go index b50cfb15716..c74444114d3 100644 --- a/eth/stagedsync/stage_execute_test.go +++ b/eth/stagedsync/stage_execute_test.go @@ -17,14 +17,14 @@ func TestUnwindExecutionStagePlainStatic(t *testing.T) { _, tx1 := memdb.NewTestTx(t) _, tx2 := memdb.NewTestTx(t) - generateBlocks(t, 1, 50, plainWriterGen(tx1), staticCodeStaticIncarnations) - generateBlocks(t, 1, 100, plainWriterGen(tx2), staticCodeStaticIncarnations) + generateBlocks(t, 1, 25, plainWriterGen(tx1), staticCodeStaticIncarnations) + generateBlocks(t, 1, 50, plainWriterGen(tx2), staticCodeStaticIncarnations) - err := stages.SaveStageProgress(tx2, stages.Execution, 100) + err := stages.SaveStageProgress(tx2, stages.Execution, 50) assert.NoError(err) - u := &UnwindState{ID: stages.Execution, UnwindPoint: 50} - s := &StageState{ID: stages.Execution, BlockNumber: 100} + u := &UnwindState{ID: stages.Execution, UnwindPoint: 25} + s := &StageState{ID: stages.Execution, BlockNumber: 50} err = UnwindExecutionStage(u, s, tx2, ctx, ExecuteBlockCfg{}, false) assert.NoError(err) @@ -36,14 +36,14 @@ func TestUnwindExecutionStagePlainWithIncarnationChanges(t *testing.T) { _, tx1 := memdb.NewTestTx(t) _, tx2 := memdb.NewTestTx(t) - generateBlocks(t, 1, 50, plainWriterGen(tx1), changeCodeWithIncarnations) - generateBlocks(t, 1, 100, plainWriterGen(tx2), changeCodeWithIncarnations) + generateBlocks(t, 1, 25, plainWriterGen(tx1), changeCodeWithIncarnations) + generateBlocks(t, 1, 50, plainWriterGen(tx2), changeCodeWithIncarnations) - err := stages.SaveStageProgress(tx2, stages.Execution, 100) + err := stages.SaveStageProgress(tx2, stages.Execution, 50) assert.NoError(err) - u := &UnwindState{ID: stages.Execution, UnwindPoint: 50} - s := &StageState{ID: stages.Execution, BlockNumber: 100} + u := &UnwindState{ID: stages.Execution, UnwindPoint: 25} + s := &StageState{ID: stages.Execution, BlockNumber: 50} err = UnwindExecutionStage(u, s, tx2, ctx, ExecuteBlockCfg{}, false) assert.NoError(err) @@ -56,15 +56,15 @@ func TestUnwindExecutionStagePlainWithCodeChanges(t *testing.T) { _, tx1 := memdb.NewTestTx(t) _, tx2 := memdb.NewTestTx(t) - generateBlocks(t, 1, 50, plainWriterGen(tx1), changeCodeIndepenentlyOfIncarnations) - generateBlocks(t, 1, 100, plainWriterGen(tx2), changeCodeIndepenentlyOfIncarnations) + generateBlocks(t, 1, 25, plainWriterGen(tx1), changeCodeIndepenentlyOfIncarnations) + generateBlocks(t, 1, 50, plainWriterGen(tx2), changeCodeIndepenentlyOfIncarnations) - err := stages.SaveStageProgress(tx2, stages.Execution, 100) + err := stages.SaveStageProgress(tx2, stages.Execution, 50) if err != nil { t.Errorf("error while saving progress: %v", err) } - u := &UnwindState{ID: stages.Execution, UnwindPoint: 50} - s := &StageState{ID: stages.Execution, BlockNumber: 100} + u := &UnwindState{ID: stages.Execution, UnwindPoint: 25} + s := &StageState{ID: stages.Execution, BlockNumber: 50} err = UnwindExecutionStage(u, s, tx2, ctx, ExecuteBlockCfg{}, false) if err != nil { t.Errorf("error while unwinding state: %v", err) @@ -77,17 +77,17 @@ func TestPruneExecution(t *testing.T) { ctx, assert := context.Background(), assert.New(t) _, tx := memdb.NewTestTx(t) - generateBlocks(t, 1, 50, plainWriterGen(tx), changeCodeIndepenentlyOfIncarnations) - err := stages.SaveStageProgress(tx, stages.Execution, 50) + generateBlocks(t, 1, 20, plainWriterGen(tx), changeCodeIndepenentlyOfIncarnations) + err := stages.SaveStageProgress(tx, stages.Execution, 20) assert.NoError(err) available, err := changeset.AvailableFrom(tx) assert.NoError(err) assert.Equal(uint64(1), available) - s := &PruneState{ID: stages.Execution, ForwardProgress: 50} + s := &PruneState{ID: stages.Execution, ForwardProgress: 20} // check pruning distance > than current stage progress - err = PruneExecutionStage(s, tx, ExecuteBlockCfg{prune: prune.Mode{History: 100, Receipts: 101, CallTraces: 200}}, ctx, false) + err = PruneExecutionStage(s, tx, ExecuteBlockCfg{prune: prune.Mode{History: prune.Distance(100), Receipts: prune.Distance(101), CallTraces: prune.Distance(200)}}, ctx, false) assert.NoError(err) available, err = changeset.AvailableFrom(tx) @@ -98,24 +98,26 @@ func TestPruneExecution(t *testing.T) { assert.Equal(uint64(1), available) // pruning distance, first run - err = PruneExecutionStage(s, tx, ExecuteBlockCfg{prune: prune.Mode{History: 5, Receipts: 15, CallTraces: 25}}, ctx, false) + err = PruneExecutionStage(s, tx, ExecuteBlockCfg{prune: prune.Mode{History: prune.Distance(5), + Receipts: prune.Distance(10), CallTraces: prune.Distance(15)}}, ctx, false) assert.NoError(err) available, err = changeset.AvailableFrom(tx) assert.NoError(err) - assert.Equal(uint64(45), available) + assert.Equal(uint64(15), available) available, err = changeset.AvailableStorageFrom(tx) assert.NoError(err) - assert.Equal(uint64(45), available) + assert.Equal(uint64(15), available) // pruning distance, second run - err = PruneExecutionStage(s, tx, ExecuteBlockCfg{prune: prune.Mode{History: 5, Receipts: 15, CallTraces: 25}}, ctx, false) + err = PruneExecutionStage(s, tx, ExecuteBlockCfg{prune: prune.Mode{History: prune.Distance(5), + Receipts: prune.Distance(15), CallTraces: prune.Distance(25)}}, ctx, false) assert.NoError(err) available, err = changeset.AvailableFrom(tx) assert.NoError(err) - assert.Equal(uint64(45), available) + assert.Equal(uint64(15), available) available, err = changeset.AvailableStorageFrom(tx) assert.NoError(err) - assert.Equal(uint64(45), available) + assert.Equal(uint64(15), available) } diff --git a/eth/stagedsync/stage_finish.go b/eth/stagedsync/stage_finish.go index c7c37ab0aa6..b9e3bc174b9 100644 --- a/eth/stagedsync/stage_finish.go +++ b/eth/stagedsync/stage_finish.go @@ -1,35 +1,43 @@ package stagedsync import ( + "bytes" "context" + "encoding/binary" "fmt" + "time" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon-lib/kv" + common2 "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/ethdb/cbor" + "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/log/v3" ) type FinishCfg struct { - db kv.RwDB - tmpDir string - btClient *snapshotsync.Client - snBuilder *snapshotsync.SnapshotMigrator - log log.Logger + db kv.RwDB + tmpDir string + log log.Logger + headCh chan *types.Block } -func StageFinishCfg(db kv.RwDB, tmpDir string, btClient *snapshotsync.Client, snBuilder *snapshotsync.SnapshotMigrator, logger log.Logger) FinishCfg { +func StageFinishCfg(db kv.RwDB, tmpDir string, logger log.Logger, headCh chan *types.Block) FinishCfg { return FinishCfg{ - db: db, - log: logger, - tmpDir: tmpDir, - btClient: btClient, - snBuilder: snBuilder, + db: db, + log: logger, + tmpDir: tmpDir, + headCh: headCh, } } -func FinishForward(s *StageState, tx kv.RwTx, cfg FinishCfg) error { +func FinishForward(s *StageState, tx kv.RwTx, cfg FinishCfg, initialCycle bool) error { useExternalTx := tx != nil if !useExternalTx { var err error @@ -49,29 +57,32 @@ func FinishForward(s *StageState, tx kv.RwTx, cfg FinishCfg) error { return nil } - if cfg.snBuilder != nil && useExternalTx { - snBlock := snapshotsync.CalculateEpoch(executionAt, snapshotsync.EpochSize) - err = cfg.snBuilder.AsyncStages(snBlock, cfg.log, cfg.db, tx, cfg.btClient, true) - if err != nil { - return err - } - if cfg.snBuilder.Replaced() { - err = cfg.snBuilder.SyncStages(snBlock, cfg.db, tx) - if err != nil { - return err - } - } - } rawdb.WriteHeadBlockHash(tx, rawdb.ReadHeadHeaderHash(tx)) err = s.Update(tx, executionAt) if err != nil { return err } + + if initialCycle { + if err := params.SetErigonVersion(tx, params.VersionKeyFinished); err != nil { + return err + } + } + + if cfg.headCh != nil { + select { + case cfg.headCh <- rawdb.ReadCurrentBlock(tx): + default: + } + + } + if !useExternalTx { if err := tx.Commit(); err != nil { return err } } + return nil } @@ -114,31 +125,105 @@ func PruneFinish(u *PruneState, tx kv.RwTx, cfg FinishCfg, ctx context.Context) return nil } -func NotifyNewHeaders(ctx context.Context, finishStageBeforeSync uint64, unwindTo *uint64, notifier ChainEventNotifier, db kv.RwDB) error { - tx, err := db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - notifyTo, err := stages.GetStageProgress(tx, stages.Finish) // because later stages can be disabled - if err != nil { - return err +func NotifyNewHeaders(ctx context.Context, finishStageBeforeSync uint64, finishStageAfterSync uint64, unwindTo *uint64, notifier ChainEventNotifier, tx kv.Tx) error { + t := time.Now() + if notifier == nil { + log.Trace("RPC Daemon notification channel not set. No headers notifications will be sent") + return nil } - notifyFrom := finishStageBeforeSync + 1 + // Notify all headers we have (either canonical or not) in a maximum range span of 1024 + var notifyFrom uint64 + var isUnwind bool if unwindTo != nil && *unwindTo != 0 && (*unwindTo) < finishStageBeforeSync { - notifyFrom = *unwindTo + 1 + notifyFrom = *unwindTo + isUnwind = true + } else { + heightSpan := finishStageAfterSync - finishStageBeforeSync + if heightSpan > 1024 { + heightSpan = 1024 + } + notifyFrom = finishStageAfterSync - heightSpan } - if notifier == nil { - log.Warn("rpc notifier is not set, rpc daemon won't be updated about headers") - return nil + notifyFrom++ + + var notifyTo uint64 + var headersRlp [][]byte + if err := tx.ForEach(kv.Headers, dbutils.EncodeBlockNumber(notifyFrom), func(k, headerRLP []byte) error { + if len(headerRLP) == 0 { + return nil + } + notifyTo = binary.BigEndian.Uint64(k) + headersRlp = append(headersRlp, common2.CopyBytes(headerRLP)) + return libcommon.Stopped(ctx.Done()) + }); err != nil { + log.Error("RPC Daemon notification failed", "err", err) + return err } - log.Info("Update current block for the RPC API", "from", notifyFrom, "to", notifyTo) - for i := notifyFrom; i <= notifyTo; i++ { - header := rawdb.ReadHeaderByNumber(tx, i) - if header == nil { - return fmt.Errorf("could not find canonical header for number: %d", i) + notifier.OnNewHeader(headersRlp) + headerTiming := time.Since(t) + t = time.Now() + if notifier.HasLogSubsriptions() { + logs, err := ReadLogs(tx, notifyFrom, isUnwind) + if err != nil { + return err } - notifier.OnNewHeader(header) + notifier.OnLogs(logs) } + logTiming := time.Since(t) + log.Info("RPC Daemon notified of new headers", "from", notifyFrom-1, "to", notifyTo, "header sending", headerTiming, "log sending", logTiming) return nil } + +func ReadLogs(tx kv.Tx, from uint64, isUnwind bool) ([]*remote.SubscribeLogsReply, error) { + logs, err := tx.Cursor(kv.Log) + if err != nil { + return nil, err + } + defer logs.Close() + reply := make([]*remote.SubscribeLogsReply, 0) + reader := bytes.NewReader(nil) + + var prevBlockNum uint64 + var block *types.Block + var logIndex uint64 + for k, v, err := logs.Seek(dbutils.LogKey(from, 0)); k != nil; k, v, err = logs.Next() { + if err != nil { + return nil, err + } + blockNum := binary.BigEndian.Uint64(k[:8]) + if block == nil || blockNum != prevBlockNum { + logIndex = 0 + prevBlockNum = blockNum + if block, err = rawdb.ReadBlockByNumber(tx, blockNum); err != nil { + return nil, err + } + } + txIndex := uint64(binary.BigEndian.Uint32(k[8:])) + txHash := block.Transactions()[txIndex].Hash() + var ll types.Logs + reader.Reset(v) + if err := cbor.Unmarshal(&ll, reader); err != nil { + return nil, fmt.Errorf("receipt unmarshal failed: %w, blocl=%d", err, blockNum) + } + for _, l := range ll { + r := &remote.SubscribeLogsReply{ + Address: gointerfaces.ConvertAddressToH160(l.Address), + BlockHash: gointerfaces.ConvertHashToH256(block.Hash()), + BlockNumber: blockNum, + Data: l.Data, + LogIndex: logIndex, + Topics: make([]*types2.H256, 0, len(l.Topics)), + TransactionHash: gointerfaces.ConvertHashToH256(txHash), + TransactionIndex: txIndex, + Removed: isUnwind, + } + logIndex++ + for _, topic := range l.Topics { + r.Topics = append(r.Topics, gointerfaces.ConvertHashToH256(topic)) + } + reply = append(reply, r) + } + } + + return reply, nil +} diff --git a/eth/stagedsync/stage_hashstate.go b/eth/stagedsync/stage_hashstate.go index 2421aee645f..3a6d7f1f6c2 100644 --- a/eth/stagedsync/stage_hashstate.go +++ b/eth/stagedsync/stage_hashstate.go @@ -6,12 +6,16 @@ import ( "encoding/binary" "fmt" "os" + "runtime" + "time" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/log/v3" ) @@ -105,7 +109,7 @@ func UnwindHashStateStage(u *UnwindState, s *StageState, tx kv.RwTx, cfg HashSta } func unwindHashStateStageImpl(logPrefix string, u *UnwindState, s *StageState, tx kv.RwTx, cfg HashStateCfg, quit <-chan struct{}) error { - // Currently it does not require unwinding because it does not create any Intemediate Hash records + // Currently it does not require unwinding because it does not create any Intermediate Hash records // and recomputes the state root from scratch prom := NewPromoter(tx, quit) prom.TempDir = cfg.tmpDir @@ -122,35 +126,13 @@ func unwindHashStateStageImpl(logPrefix string, u *UnwindState, s *StageState, t } func PromoteHashedStateCleanly(logPrefix string, db kv.RwTx, cfg HashStateCfg, quit <-chan struct{}) error { - err := etl.Transform( + if err := readPlainStateOnce( logPrefix, db, - kv.PlainState, - kv.HashedAccounts, cfg.tmpDir, - keyTransformExtractAcc(transformPlainStateKey), etl.IdentityLoadFunc, - etl.TransformArgs{ - Quit: quit, - }, - ) - if err != nil { - return err - } - - err = etl.Transform( - logPrefix, - db, - kv.PlainState, - kv.HashedStorage, - cfg.tmpDir, - keyTransformExtractStorage(transformPlainStateKey), - etl.IdentityLoadFunc, - etl.TransformArgs{ - Quit: quit, - }, - ) - if err != nil { + quit, + ); err != nil { return err } @@ -168,34 +150,109 @@ func PromoteHashedStateCleanly(logPrefix string, db kv.RwTx, cfg HashStateCfg, q ) } -func keyTransformExtractFunc(transformKey func([]byte) ([]byte, error)) etl.ExtractFunc { - return func(k, v []byte, next etl.ExtractNextFunc) error { - newK, err := transformKey(k) +func readPlainStateOnce( + logPrefix string, + db kv.RwTx, + tmpdir string, + loadFunc etl.LoadFunc, + quit <-chan struct{}, +) error { + bufferSize := etl.BufferOptimalSize + + accCollector := etl.NewCollector(logPrefix, tmpdir, etl.NewSortableBuffer(bufferSize)) + defer accCollector.Close() + storageCollector := etl.NewCollector(logPrefix, tmpdir, etl.NewSortableBuffer(bufferSize)) + defer storageCollector.Close() + + t := time.Now() + logEvery := time.NewTicker(30 * time.Second) + defer logEvery.Stop() + var m runtime.MemStats + + c, err := db.Cursor(kv.PlainState) + if err != nil { + return err + } + defer c.Close() + + convertAccFunc := func(key []byte) ([]byte, error) { + hash, err := common.HashData(key) + return hash[:], err + } + + convertStorageFunc := func(key []byte) ([]byte, error) { + addrHash, err := common.HashData(key[:length.Addr]) if err != nil { - return err + return nil, err } - return next(k, newK, v) + inc := binary.BigEndian.Uint64(key[length.Addr:]) + secKey, err := common.HashData(key[length.Addr+length.Incarnation:]) + if err != nil { + return nil, err + } + compositeKey := dbutils.GenerateCompositeStorageKey(addrHash, inc, secKey) + return compositeKey, nil } -} -func keyTransformExtractAcc(transformKey func([]byte) ([]byte, error)) etl.ExtractFunc { - return func(k, v []byte, next etl.ExtractNextFunc) error { - if len(k) != 20 { - return nil + var startkey []byte + + // reading kv.PlainState + for k, v, e := c.Seek(startkey); k != nil; k, v, e = c.Next() { + if e != nil { + return e } - newK, err := transformKey(k) - if err != nil { + if err := libcommon.Stopped(quit); err != nil { return err } - return next(k, newK, v) + + if len(k) == 20 { + newK, err := convertAccFunc(k) + if err != nil { + return err + } + if err := accCollector.Collect(newK, v); err != nil { + return err + } + } else { + newK, err := convertStorageFunc(k) + if err != nil { + return err + } + if err := storageCollector.Collect(newK, v); err != nil { + return err + } + } + + select { + default: + case <-logEvery.C: + libcommon.ReadMemStats(&m) + log.Info(fmt.Sprintf("[%s] ETL [1/2] Extracting", logPrefix), "current key", fmt.Sprintf("%x...", k[:6]), "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) + } + } + + log.Trace(fmt.Sprintf("[%s] Extraction finished", logPrefix), "took", time.Since(t)) + defer func(t time.Time) { + log.Trace(fmt.Sprintf("[%s] Load finished", logPrefix), "took", time.Since(t)) + }(time.Now()) + + args := etl.TransformArgs{ + Quit: quit, } + + if err := accCollector.Load(db, kv.HashedAccounts, loadFunc, args); err != nil { + return err + } + + if err := storageCollector.Load(db, kv.HashedStorage, loadFunc, args); err != nil { + return err + } + + return nil } -func keyTransformExtractStorage(transformKey func([]byte) ([]byte, error)) etl.ExtractFunc { +func keyTransformExtractFunc(transformKey func([]byte) ([]byte, error)) etl.ExtractFunc { return func(k, v []byte, next etl.ExtractNextFunc) error { - if len(k) == 20 { - return nil - } newK, err := transformKey(k) if err != nil { return err @@ -206,18 +263,18 @@ func keyTransformExtractStorage(transformKey func([]byte) ([]byte, error)) etl.E func transformPlainStateKey(key []byte) ([]byte, error) { switch len(key) { - case common.AddressLength: + case length.Addr: // account hash, err := common.HashData(key) return hash[:], err - case common.AddressLength + common.IncarnationLength + common.HashLength: + case length.Addr + length.Incarnation + length.Hash: // storage - addrHash, err := common.HashData(key[:common.AddressLength]) + addrHash, err := common.HashData(key[:length.Addr]) if err != nil { return nil, err } - inc := binary.BigEndian.Uint64(key[common.AddressLength:]) - secKey, err := common.HashData(key[common.AddressLength+common.IncarnationLength:]) + inc := binary.BigEndian.Uint64(key[length.Addr:]) + secKey, err := common.HashData(key[length.Addr+length.Incarnation:]) if err != nil { return nil, err } @@ -230,7 +287,7 @@ func transformPlainStateKey(key []byte) ([]byte, error) { } func transformContractCodeKey(key []byte) ([]byte, error) { - if len(key) != common.AddressLength+common.IncarnationLength { + if len(key) != length.Addr+length.Incarnation { return nil, fmt.Errorf("could not convert code key from plain to hashed, unexpected len: %d", len(key)) } address, incarnation := dbutils.PlainParseStoragePrefix(key) @@ -278,7 +335,10 @@ type Promoter struct { func getExtractFunc(db kv.Tx, changeSetBucket string) etl.ExtractFunc { decode := changeset.Mapper[changeSetBucket].Decode return func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, _ := decode(dbKey, dbValue) + _, k, _, err := decode(dbKey, dbValue) + if err != nil { + return err + } // ignoring value un purpose, we want the latest one and it is in PlainState value, err := db.GetOne(kv.PlainState, k) if err != nil { @@ -296,7 +356,10 @@ func getExtractFunc(db kv.Tx, changeSetBucket string) etl.ExtractFunc { func getExtractCode(db kv.Tx, changeSetBucket string) etl.ExtractFunc { decode := changeset.Mapper[changeSetBucket].Decode return func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, _ := decode(dbKey, dbValue) + _, k, _, err := decode(dbKey, dbValue) + if err != nil { + return err + } value, err := db.GetOne(kv.PlainState, k) if err != nil { return err @@ -304,18 +367,19 @@ func getExtractCode(db kv.Tx, changeSetBucket string) etl.ExtractFunc { if len(value) == 0 { return nil } - var a accounts.Account - if err = a.DecodeForStorage(value); err != nil { + + incarnation, err := accounts.DecodeIncarnationFromStorage(value) + if err != nil { return err } - if a.Incarnation == 0 { + if incarnation == 0 { return nil } - plainKey := dbutils.PlainGenerateStoragePrefix(k, a.Incarnation) + plainKey := dbutils.PlainGenerateStoragePrefix(k, incarnation) var codeHash []byte codeHash, err = db.GetOne(kv.PlainContractCode, plainKey) if err != nil { - return fmt.Errorf("getFromPlainCodesAndLoad for %x, inc %d: %w", plainKey, a.Incarnation, err) + return fmt.Errorf("getFromPlainCodesAndLoad for %x, inc %d: %w", plainKey, incarnation, err) } if codeHash == nil { return nil @@ -331,7 +395,10 @@ func getExtractCode(db kv.Tx, changeSetBucket string) etl.ExtractFunc { func getUnwindExtractStorage(changeSetBucket string) etl.ExtractFunc { decode := changeset.Mapper[changeSetBucket].Decode return func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, v := decode(dbKey, dbValue) + _, k, v, err := decode(dbKey, dbValue) + if err != nil { + return err + } newK, err := transformPlainStateKey(k) if err != nil { return err @@ -343,7 +410,10 @@ func getUnwindExtractStorage(changeSetBucket string) etl.ExtractFunc { func getUnwindExtractAccounts(db kv.Tx, changeSetBucket string) etl.ExtractFunc { decode := changeset.Mapper[changeSetBucket].Decode return func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, v := decode(dbKey, dbValue) + _, k, v, err := decode(dbKey, dbValue) + if err != nil { + return err + } newK, err := transformPlainStateKey(k) if err != nil { return err @@ -374,23 +444,25 @@ func getUnwindExtractAccounts(db kv.Tx, changeSetBucket string) etl.ExtractFunc func getCodeUnwindExtractFunc(db kv.Tx, changeSetBucket string) etl.ExtractFunc { decode := changeset.Mapper[changeSetBucket].Decode return func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, v := decode(dbKey, dbValue) + _, k, v, err := decode(dbKey, dbValue) + if err != nil { + return err + } if len(v) == 0 { return nil } var ( - a accounts.Account newK []byte codeHash []byte - err error ) - if err = a.DecodeForStorage(v); err != nil { + incarnation, err := accounts.DecodeIncarnationFromStorage(v) + if err != nil { return err } - if a.Incarnation == 0 { + if incarnation == 0 { return nil } - plainKey := dbutils.PlainGenerateStoragePrefix(k, a.Incarnation) + plainKey := dbutils.PlainGenerateStoragePrefix(k, incarnation) codeHash, err = db.GetOne(kv.PlainContractCode, plainKey) if err != nil { return fmt.Errorf("getCodeUnwindExtractFunc: %w, key=%x", err, plainKey) diff --git a/eth/stagedsync/stage_hashstate_test.go b/eth/stagedsync/stage_hashstate_test.go index 5e18d4f86e1..8c0534c9332 100644 --- a/eth/stagedsync/stage_hashstate_test.go +++ b/eth/stagedsync/stage_hashstate_test.go @@ -9,7 +9,7 @@ import ( "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/stretchr/testify/require" - "github.com/ledgerwatch/erigon/common" + libcommon "github.com/ledgerwatch/erigon-lib/common" ) func TestPromoteHashedStateClearState(t *testing.T) { @@ -94,7 +94,7 @@ func TestPromoteIncrementallyShutdown(t *testing.T) { cancelFuncExec bool errExp error }{ - {"cancel", true, common.ErrStopped}, + {"cancel", true, libcommon.ErrStopped}, {"no cancel", false, nil}, } @@ -124,7 +124,7 @@ func TestPromoteHashedStateCleanlyShutdown(t *testing.T) { cancelFuncExec bool errExp error }{ - {"cancel", true, common.ErrStopped}, + {"cancel", true, libcommon.ErrStopped}, {"no cancel", false, nil}, } @@ -157,7 +157,7 @@ func TestUnwindHashStateShutdown(t *testing.T) { cancelFuncExec bool errExp error }{ - {"cancel", true, common.ErrStopped}, + {"cancel", true, libcommon.ErrStopped}, {"no cancel", false, nil}, } diff --git a/eth/stagedsync/stage_headers.go b/eth/stagedsync/stage_headers.go index dff92690a46..df5927a17d1 100644 --- a/eth/stagedsync/stage_headers.go +++ b/eth/stagedsync/stage_headers.go @@ -3,62 +3,93 @@ package stagedsync import ( "context" "encoding/binary" + "errors" "fmt" "math/big" "runtime" "time" - "github.com/VictoriaMetrics/metrics" "github.com/c2h5oh/datasize" + "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/etl" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/downloader/downloadergrpc" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/ethdb/privateapi" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/engineapi" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snapshothashes" + "github.com/ledgerwatch/erigon/turbo/stages/bodydownload" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" "github.com/ledgerwatch/log/v3" ) -var stageHeadersGauge = metrics.GetOrCreateCounter("stage_headers") +// The number of blocks we should be able to re-org sub-second on commodity hardware. +// See https://hackmd.io/TdJtNs0dS56q-In8h-ShSg +const ShortPoSReorgThresholdBlocks = 10 type HeadersCfg struct { db kv.RwDB hd *headerdownload.HeaderDownload + bodyDownload *bodydownload.BodyDownload chainConfig params.ChainConfig - headerReqSend func(context.Context, *headerdownload.HeaderRequest) []byte + headerReqSend func(context.Context, *headerdownload.HeaderRequest) ([64]byte, bool) announceNewHashes func(context.Context, []headerdownload.Announce) penalize func(context.Context, []headerdownload.PenaltyItem) batchSize datasize.ByteSize noP2PDiscovery bool + tmpdir string + + snapshots *snapshotsync.RoSnapshots + snapshotDownloader proto_downloader.DownloaderClient + blockReader services.FullBlockReader + dbEventNotifier snapshotsync.DBEventNotifier } func StageHeadersCfg( db kv.RwDB, headerDownload *headerdownload.HeaderDownload, + bodyDownload *bodydownload.BodyDownload, chainConfig params.ChainConfig, - headerReqSend func(context.Context, *headerdownload.HeaderRequest) []byte, + headerReqSend func(context.Context, *headerdownload.HeaderRequest) ([64]byte, bool), announceNewHashes func(context.Context, []headerdownload.Announce), penalize func(context.Context, []headerdownload.PenaltyItem), batchSize datasize.ByteSize, noP2PDiscovery bool, -) HeadersCfg { + snapshots *snapshotsync.RoSnapshots, + snapshotDownloader proto_downloader.DownloaderClient, + blockReader services.FullBlockReader, + tmpdir string, + dbEventNotifier snapshotsync.DBEventNotifier) HeadersCfg { return HeadersCfg{ - db: db, - hd: headerDownload, - chainConfig: chainConfig, - headerReqSend: headerReqSend, - announceNewHashes: announceNewHashes, - penalize: penalize, - batchSize: batchSize, - noP2PDiscovery: noP2PDiscovery, + db: db, + hd: headerDownload, + bodyDownload: bodyDownload, + chainConfig: chainConfig, + headerReqSend: headerReqSend, + announceNewHashes: announceNewHashes, + penalize: penalize, + batchSize: batchSize, + tmpdir: tmpdir, + noP2PDiscovery: noP2PDiscovery, + snapshots: snapshots, + snapshotDownloader: snapshotDownloader, + blockReader: blockReader, + dbEventNotifier: dbEventNotifier, } } -// HeadersForward progresses Headers stage in the forward direction -func HeadersForward( +func SpawnStageHeaders( s *StageState, u Unwinder, ctx context.Context, @@ -67,21 +98,576 @@ func HeadersForward( initialCycle bool, test bool, // Set to true in tests, allows the stage to fail rather than wait indefinitely ) error { - var headerProgress uint64 - var err error useExternalTx := tx != nil if !useExternalTx { + var err error tx, err = cfg.db.BeginRw(ctx) if err != nil { return err } defer tx.Rollback() } + if err := DownloadAndIndexSnapshotsIfNeed(s, ctx, tx, cfg, initialCycle); err != nil { + return err + } + + var blockNumber uint64 + if s == nil { + blockNumber = 0 + } else { + blockNumber = s.BlockNumber + } + + unsettledForkChoice, headHeight := cfg.hd.GetUnsettledForkChoice() + if unsettledForkChoice != nil { // some work left to do after unwind + return finishHandlingForkChoice(unsettledForkChoice, headHeight, s, tx, cfg, useExternalTx) + } + + isTrans, err := rawdb.Transitioned(tx, blockNumber, cfg.chainConfig.TerminalTotalDifficulty) + if err != nil { + return err + } + + if isTrans { + return HeadersPOS(s, u, ctx, tx, cfg, useExternalTx) + } else { + return HeadersPOW(s, u, ctx, tx, cfg, initialCycle, test, useExternalTx) + } +} + +// HeadersPOS processes Proof-of-Stake requests (newPayload, forkchoiceUpdated). +// It also saves PoS headers downloaded by (*HeaderDownload)StartPoSDownloader into the DB. +func HeadersPOS( + s *StageState, + u Unwinder, + ctx context.Context, + tx kv.RwTx, + cfg HeadersCfg, + useExternalTx bool, +) error { + log.Info(fmt.Sprintf("[%s] Waiting for Beacon Chain...", s.LogPrefix())) + + onlyNewRequests := cfg.hd.PosStatus() == headerdownload.Syncing + interrupt, requestId, requestWithStatus := cfg.hd.BeaconRequestList.WaitForRequest(onlyNewRequests) + + cfg.hd.SetPOSSync(true) + cfg.hd.SetHeaderReader(&chainReader{config: &cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}) + headerInserter := headerdownload.NewHeaderInserter(s.LogPrefix(), nil, s.BlockNumber, cfg.blockReader) + + if interrupt != engineapi.None { + if interrupt == engineapi.Stopping { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: errors.New("server is stopping")} + } + if interrupt == engineapi.Synced { + verifyAndSaveDownloadedPoSHeaders(tx, cfg, headerInserter) + } + if !useExternalTx { + return tx.Commit() + } + return nil + } + + request := requestWithStatus.Message + status := requestWithStatus.Status + + // Decide what kind of action we need to take place + var payloadMessage *engineapi.PayloadMessage + forkChoiceMessage, forkChoiceInsteadOfNewPayload := request.(*engineapi.ForkChoiceMessage) + if !forkChoiceInsteadOfNewPayload { + payloadMessage = request.(*engineapi.PayloadMessage) + } + + cfg.hd.ClearPendingPayloadStatus() + + if forkChoiceInsteadOfNewPayload { + if err := startHandlingForkChoice(forkChoiceMessage, status, requestId, s, u, ctx, tx, cfg, headerInserter, cfg.blockReader); err != nil { + return err + } + } else { + if err := handleNewPayload(payloadMessage, status, requestId, s, ctx, tx, cfg, headerInserter); err != nil { + return err + } + } + + if !useExternalTx { + return tx.Commit() + } + return nil +} + +func safeAndFinalizedBlocksAreCanonical( + forkChoice *engineapi.ForkChoiceMessage, + s *StageState, + tx kv.RwTx, + cfg HeadersCfg, + sendErrResponse bool, +) (bool, error) { + if forkChoice.SafeBlockHash != (common.Hash{}) { + safeIsCanonical, err := rawdb.IsCanonicalHash(tx, forkChoice.SafeBlockHash) + if err != nil { + return false, err + } + if !safeIsCanonical { + log.Warn(fmt.Sprintf("[%s] Non-canonical SafeBlockHash", s.LogPrefix()), "forkChoice", forkChoice) + if sendErrResponse { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + CriticalError: &privateapi.InvalidForkchoiceStateErr, + } + } + return false, nil + } + } + + if forkChoice.FinalizedBlockHash != (common.Hash{}) { + finalizedIsCanonical, err := rawdb.IsCanonicalHash(tx, forkChoice.FinalizedBlockHash) + if err != nil { + return false, err + } + if !finalizedIsCanonical { + log.Warn(fmt.Sprintf("[%s] Non-canonical FinalizedBlockHash", s.LogPrefix()), "forkChoice", forkChoice) + if sendErrResponse { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + CriticalError: &privateapi.InvalidForkchoiceStateErr, + } + } + return false, nil + } + } + + return true, nil +} + +func startHandlingForkChoice( + forkChoice *engineapi.ForkChoiceMessage, + requestStatus engineapi.RequestStatus, + requestId int, + s *StageState, + u Unwinder, + ctx context.Context, + tx kv.RwTx, + cfg HeadersCfg, + headerInserter *headerdownload.HeaderInserter, + headerReader services.HeaderReader, +) error { + headerHash := forkChoice.HeadBlockHash + log.Info(fmt.Sprintf("[%s] Handling fork choice", s.LogPrefix()), "headerHash", headerHash) + + currentHeadHash := rawdb.ReadHeadHeaderHash(tx) + if currentHeadHash == headerHash { // no-op + log.Info(fmt.Sprintf("[%s] Fork choice no-op", s.LogPrefix())) + cfg.hd.BeaconRequestList.Remove(requestId) + canonical, err := safeAndFinalizedBlocksAreCanonical(forkChoice, s, tx, cfg, requestStatus == engineapi.New) + if err != nil { + log.Warn(fmt.Sprintf("[%s] Fork choice err", s.LogPrefix()), "err", err) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: err} + } + return err + } + if canonical && requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_VALID, + LatestValidHash: currentHeadHash, + } + } + return nil + } + + bad, lastValidHash := cfg.hd.IsBadHeaderPoS(headerHash) + if bad { + log.Info(fmt.Sprintf("[%s] Fork choice bad head block", s.LogPrefix()), "headerHash", headerHash) + cfg.hd.BeaconRequestList.Remove(requestId) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_INVALID, + LatestValidHash: lastValidHash, + } + } else { + cfg.hd.ReportBadHeaderPoS(headerHash, lastValidHash) + } + return nil + } + + header, err := rawdb.ReadHeaderByHash(tx, headerHash) + if err != nil { + log.Warn(fmt.Sprintf("[%s] Fork choice err", s.LogPrefix()), "err", err) + cfg.hd.BeaconRequestList.Remove(requestId) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: err} + } + return err + } + + if header == nil { + log.Info(fmt.Sprintf("[%s] Fork choice missing header", s.LogPrefix())) + hashToDownload := headerHash + cfg.hd.SetPoSDownloaderTip(headerHash) + schedulePoSDownload(requestStatus, requestId, hashToDownload, 0 /* header height is unknown, setting to 0 */, s, cfg) + return nil + } + + cfg.hd.BeaconRequestList.Remove(requestId) + + headerNumber := header.Number.Uint64() + cfg.hd.UpdateTopSeenHeightPoS(headerNumber) + + forkingPoint := uint64(0) + if headerNumber > 0 { + parent, err := headerReader.Header(ctx, tx, header.ParentHash, headerNumber-1) + if err != nil { + return err + } + forkingPoint, err = headerInserter.ForkingPoint(tx, header, parent) + if err != nil { + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: err} + } + return err + } + } + + if requestStatus == engineapi.New { + if headerNumber-forkingPoint <= ShortPoSReorgThresholdBlocks { + log.Info(fmt.Sprintf("[%s] Short range re-org", s.LogPrefix()), "headerNumber", headerNumber, "forkingPoint", forkingPoint) + // TODO(yperbasis): what if some bodies are missing and we have to download them? + cfg.hd.SetPendingPayloadStatus(headerHash) + } else { + log.Info(fmt.Sprintf("[%s] Long range re-org", s.LogPrefix()), "headerNumber", headerNumber, "forkingPoint", forkingPoint) + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{Status: remote.EngineStatus_SYNCING} + } + } + + log.Trace(fmt.Sprintf("[%s] Fork choice beginning unwind", s.LogPrefix())) + u.UnwindTo(forkingPoint, common.Hash{}) + log.Trace(fmt.Sprintf("[%s] Fork choice unwind finished", s.LogPrefix())) + + cfg.hd.SetUnsettledForkChoice(forkChoice, headerNumber) + + return nil +} + +func finishHandlingForkChoice( + forkChoice *engineapi.ForkChoiceMessage, + headHeight uint64, + s *StageState, + tx kv.RwTx, + cfg HeadersCfg, + useExternalTx bool, +) error { + log.Info(fmt.Sprintf("[%s] Unsettled forkchoice after unwind", s.LogPrefix()), "height", headHeight, "forkchoice", forkChoice) + + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + if err := fixCanonicalChain(s.LogPrefix(), logEvery, headHeight, forkChoice.HeadBlockHash, tx, cfg.blockReader); err != nil { + return err + } + + if err := rawdb.WriteHeadHeaderHash(tx, forkChoice.HeadBlockHash); err != nil { + return err + } + + sendErrResponse := cfg.hd.GetPendingPayloadStatus() != (common.Hash{}) + canonical, err := safeAndFinalizedBlocksAreCanonical(forkChoice, s, tx, cfg, sendErrResponse) + if err != nil { + return err + } + if !canonical { + cfg.hd.ClearPendingPayloadStatus() + } + + if err := s.Update(tx, headHeight); err != nil { + return err + } + + if !useExternalTx { + if err := tx.Commit(); err != nil { + return err + } + } + + cfg.hd.ClearUnsettledForkChoice() + return nil +} + +func handleNewPayload( + payloadMessage *engineapi.PayloadMessage, + requestStatus engineapi.RequestStatus, + requestId int, + s *StageState, + ctx context.Context, + tx kv.RwTx, + cfg HeadersCfg, + headerInserter *headerdownload.HeaderInserter, +) error { + header := payloadMessage.Header + headerNumber := header.Number.Uint64() + headerHash := header.Hash() + + log.Trace(fmt.Sprintf("[%s] Handling new payload", s.LogPrefix()), "height", headerNumber, "hash", headerHash) + + cfg.hd.UpdateTopSeenHeightPoS(headerNumber) + + existingCanonicalHash, err := rawdb.ReadCanonicalHash(tx, headerNumber) + if err != nil { + log.Warn(fmt.Sprintf("[%s] New payload err", s.LogPrefix()), "err", err) + cfg.hd.BeaconRequestList.Remove(requestId) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: err} + } + return err + } + + if existingCanonicalHash != (common.Hash{}) && headerHash == existingCanonicalHash { + log.Info(fmt.Sprintf("[%s] New payload: previously received valid header", s.LogPrefix())) + cfg.hd.BeaconRequestList.Remove(requestId) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_VALID, + LatestValidHash: headerHash, + } + } + return nil + } + + bad, lastValidHash := cfg.hd.IsBadHeaderPoS(headerHash) + if !bad { + bad, lastValidHash = cfg.hd.IsBadHeaderPoS(header.ParentHash) + } + if bad { + log.Info(fmt.Sprintf("[%s] Previously known bad block", s.LogPrefix()), "height", headerNumber, "hash", headerHash) + cfg.hd.BeaconRequestList.Remove(requestId) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_INVALID, + LatestValidHash: lastValidHash, + } + } else { + cfg.hd.ReportBadHeaderPoS(headerHash, lastValidHash) + } + return nil + } + + parent, err := cfg.blockReader.Header(ctx, tx, header.ParentHash, headerNumber-1) + if err != nil { + return err + } + if parent == nil { + log.Info(fmt.Sprintf("[%s] New payload missing parent", s.LogPrefix())) + hashToDownload := header.ParentHash + heightToDownload := headerNumber - 1 + cfg.hd.SetPoSDownloaderTip(headerHash) + schedulePoSDownload(requestStatus, requestId, hashToDownload, heightToDownload, s, cfg) + return nil + } + + cfg.hd.BeaconRequestList.Remove(requestId) + + for _, tx := range payloadMessage.Body.Transactions { + if types.TypedTransactionMarshalledAsRlpString(tx) { + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_INVALID, + LatestValidHash: header.ParentHash, + ValidationError: errors.New("typed txn marshalled as RLP string"), + } + } else { + cfg.hd.ReportBadHeaderPoS(headerHash, header.ParentHash) + } + return nil + } + } + + transactions, err := types.DecodeTransactions(payloadMessage.Body.Transactions) + if err != nil { + log.Warn("Error during Beacon transaction decoding", "err", err.Error()) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_INVALID, + LatestValidHash: header.ParentHash, + ValidationError: err, + } + } else { + cfg.hd.ReportBadHeaderPoS(headerHash, header.ParentHash) + } + return nil + } + + log.Trace(fmt.Sprintf("[%s] New payload begin verification", s.LogPrefix())) + success, err := verifyAndSaveNewPoSHeader(requestStatus, s, tx, cfg, header, headerInserter) + log.Trace(fmt.Sprintf("[%s] New payload verification ended", s.LogPrefix()), "success", success, "err", err) + if err != nil || !success { + return err + } + + if cfg.bodyDownload != nil { + block := types.NewBlockFromStorage(headerHash, header, transactions, nil) + cfg.bodyDownload.AddToPrefetch(block) + } + + return nil +} + +func verifyAndSaveNewPoSHeader( + requestStatus engineapi.RequestStatus, + s *StageState, + tx kv.RwTx, + cfg HeadersCfg, + header *types.Header, + headerInserter *headerdownload.HeaderInserter, +) (success bool, err error) { + headerNumber := header.Number.Uint64() + headerHash := header.Hash() + + if verificationErr := cfg.hd.VerifyHeader(header); verificationErr != nil { + log.Warn("Verification failed for header", "hash", headerHash, "height", headerNumber, "err", verificationErr) + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: remote.EngineStatus_INVALID, + LatestValidHash: header.ParentHash, + ValidationError: verificationErr, + } + } else { + cfg.hd.ReportBadHeaderPoS(headerHash, header.ParentHash) + } + return + } + + err = headerInserter.FeedHeaderPoS(tx, header, headerHash) + if err != nil { + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: err} + } + return + } + + currentHeadHash := rawdb.ReadHeadHeaderHash(tx) + if currentHeadHash == header.ParentHash { + // OK, we're on the canonical chain + if requestStatus == engineapi.New { + cfg.hd.SetPendingPayloadStatus(headerHash) + } + + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + // Extend canonical chain by the new header + err = fixCanonicalChain(s.LogPrefix(), logEvery, headerInserter.GetHighest(), headerInserter.GetHighestHash(), tx, cfg.blockReader) + if err != nil { + return + } + + err = rawdb.WriteHeadHeaderHash(tx, headerHash) + if err != nil { + return + } + + err = s.Update(tx, headerNumber) + if err != nil { + return + } + } else { + // Side chain or something weird + // TODO(yperbasis): considered non-canonical because some missing headers were donloaded but not canonized + // Or it's not a problem because forkChoice is updated frequently? + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{Status: remote.EngineStatus_ACCEPTED} + } + // No canonization, HeadHeaderHash & StageProgress are not updated + } + + success = true + return +} + +func schedulePoSDownload( + requestStatus engineapi.RequestStatus, + requestId int, + hashToDownload common.Hash, + heightToDownload uint64, + s *StageState, + cfg HeadersCfg, +) { + if requestStatus == engineapi.New { + cfg.hd.PayloadStatusCh <- privateapi.PayloadStatus{Status: remote.EngineStatus_SYNCING} + } + cfg.hd.BeaconRequestList.SetStatus(requestId, engineapi.DataWasMissing) + + if cfg.hd.PosStatus() != headerdownload.Idle { + log.Trace(fmt.Sprintf("[%s] Postponing PoS download since another one is in progress", s.LogPrefix()), "height", heightToDownload, "hash", hashToDownload) + return + } + + log.Info(fmt.Sprintf("[%s] Downloading PoS headers...", s.LogPrefix()), "height", heightToDownload, "hash", hashToDownload, "requestId", requestId) + + cfg.hd.SetRequestId(requestId) + cfg.hd.SetHeaderToDownloadPoS(hashToDownload, heightToDownload) + cfg.hd.SetPOSSync(true) // This needs to be called afrer SetHeaderToDownloadPOS because SetHeaderToDownloadPOS sets `posAnchor` member field which is used by ProcessHeadersPOS + + //nolint + headerCollector := etl.NewCollector(s.LogPrefix(), cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + // headerCollector is closed in verifyAndSaveDownloadedPoSHeaders, thus nolint + + cfg.hd.SetHeadersCollector(headerCollector) + + cfg.hd.SetPosStatus(headerdownload.Syncing) +} + +func verifyAndSaveDownloadedPoSHeaders(tx kv.RwTx, cfg HeadersCfg, headerInserter *headerdownload.HeaderInserter) { + var lastValidHash common.Hash + + headerLoadFunc := func(key, value []byte, _ etl.CurrentTableReader, _ etl.LoadNextFunc) error { + var h types.Header + if err := rlp.DecodeBytes(value, &h); err != nil { + return err + } + lastValidHash = h.ParentHash + if err := cfg.hd.VerifyHeader(&h); err != nil { + log.Warn("Verification failed for header", "hash", h.Hash(), "height", h.Number.Uint64(), "err", err) + return err + } + return headerInserter.FeedHeaderPoS(tx, &h, h.Hash()) + } + + err := cfg.hd.HeadersCollector().Load(tx, kv.Headers, headerLoadFunc, etl.TransformArgs{ + LogDetailsLoad: func(k, v []byte) (additionalLogArguments []interface{}) { + return []interface{}{"block", binary.BigEndian.Uint64(k)} + }, + }) + + if err != nil { + log.Warn("Removing beacon request due to", "err", err, "requestId", cfg.hd.RequestId()) + cfg.hd.BeaconRequestList.Remove(cfg.hd.RequestId()) + cfg.hd.ReportBadHeaderPoS(cfg.hd.PoSDownloaderTip(), lastValidHash) + } else { + log.Info("PoS headers verified and saved", "requestId", cfg.hd.RequestId()) + } + + cfg.hd.HeadersCollector().Close() + cfg.hd.SetHeadersCollector(nil) + cfg.hd.SetPosStatus(headerdownload.Idle) +} + +// HeadersPOW progresses Headers stage for Proof-of-Work headers +func HeadersPOW( + s *StageState, + u Unwinder, + ctx context.Context, + tx kv.RwTx, + cfg HeadersCfg, + initialCycle bool, + test bool, // Set to true in tests, allows the stage to fail rather than wait indefinitely + useExternalTx bool, +) error { + var headerProgress uint64 + var err error + if err = cfg.hd.ReadProgressFromDb(tx); err != nil { return err } - cfg.hd.SetFetching(true) - defer cfg.hd.SetFetching(false) + cfg.hd.SetPOSSync(false) + cfg.hd.SetFetchingNew(true) + defer cfg.hd.SetFetchingNew(false) headerProgress = cfg.hd.Progress() logPrefix := s.LogPrefix() // Check if this is called straight after the unwinds, which means we need to create new canonical markings @@ -93,7 +679,7 @@ func HeadersForward( defer logEvery.Stop() if hash == (common.Hash{}) { headHash := rawdb.ReadHeadHeaderHash(tx) - if err = fixCanonicalChain(logPrefix, logEvery, headerProgress, headHash, tx); err != nil { + if err = fixCanonicalChain(logPrefix, logEvery, headerProgress, headHash, tx, cfg.blockReader); err != nil { return err } if !useExternalTx { @@ -115,55 +701,89 @@ func HeadersForward( if err != nil { return err } - headerInserter := headerdownload.NewHeaderInserter(logPrefix, localTd, headerProgress) - cfg.hd.SetHeaderReader(&chainReader{config: &cfg.chainConfig, tx: tx}) + if localTd == nil { + return fmt.Errorf("localTD is nil: %d, %x", headerProgress, hash) + } + headerInserter := headerdownload.NewHeaderInserter(logPrefix, localTd, headerProgress, cfg.blockReader) + cfg.hd.SetHeaderReader(&chainReader{config: &cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}) - var peer []byte + var sentToPeer bool stopped := false prevProgress := headerProgress + var noProgressCounter int + var wasProgress bool + var lastSkeletonTime time.Time +Loop: for !stopped { + + isTrans, err := rawdb.Transitioned(tx, headerProgress, cfg.chainConfig.TerminalTotalDifficulty) + if err != nil { + return err + } + + if isTrans { + if err := s.Update(tx, headerProgress); err != nil { + return err + } + break + } currentTime := uint64(time.Now().Unix()) req, penalties := cfg.hd.RequestMoreHeaders(currentTime) if req != nil { - peer = cfg.headerReqSend(ctx, req) - if peer != nil { - cfg.hd.SentRequest(req, currentTime, 5 /* timeout */) - log.Debug("Sent request", "height", req.Number) + _, sentToPeer = cfg.headerReqSend(ctx, req) + if sentToPeer { + // If request was actually sent to a peer, we update retry time to be 5 seconds in the future + cfg.hd.UpdateRetryTime(req, currentTime, 5 /* timeout */) + log.Trace("Sent request", "height", req.Number) } } - cfg.penalize(ctx, penalties) + if len(penalties) > 0 { + cfg.penalize(ctx, penalties) + } maxRequests := 64 // Limit number of requests sent per round to let some headers to be inserted into the database - for req != nil && peer != nil && maxRequests > 0 { + for req != nil && sentToPeer && maxRequests > 0 { req, penalties = cfg.hd.RequestMoreHeaders(currentTime) if req != nil { - peer = cfg.headerReqSend(ctx, req) - if peer != nil { - cfg.hd.SentRequest(req, currentTime, 5 /*timeout */) - log.Debug("Sent request", "height", req.Number) + _, sentToPeer = cfg.headerReqSend(ctx, req) + if sentToPeer { + // If request was actually sent to a peer, we update retry time to be 5 seconds in the future + cfg.hd.UpdateRetryTime(req, currentTime, 5 /*timeout */) + log.Trace("Sent request", "height", req.Number) + cfg.hd.UpdateStats(req, false /* skeleton */) + } } - cfg.penalize(ctx, penalties) + if len(penalties) > 0 { + cfg.penalize(ctx, penalties) + } maxRequests-- } // Send skeleton request if required - req = cfg.hd.RequestSkeleton() - if req != nil { - peer = cfg.headerReqSend(ctx, req) - if peer != nil { - log.Debug("Sent skeleton request", "height", req.Number) + if time.Since(lastSkeletonTime) > 1*time.Second { + req = cfg.hd.RequestSkeleton() + if req != nil { + _, sentToPeer = cfg.headerReqSend(ctx, req) + if sentToPeer { + log.Trace("Sent skeleton request", "height", req.Number) + cfg.hd.UpdateStats(req, true /* skeleton */) + lastSkeletonTime = time.Now() + } } } // Load headers into the database var inSync bool - if inSync, err = cfg.hd.InsertHeaders(headerInserter.FeedHeaderFunc(tx), logPrefix, logEvery.C); err != nil { + if inSync, err = cfg.hd.InsertHeaders(headerInserter.NewFeedHeaderFunc(tx, cfg.blockReader), cfg.chainConfig.TerminalTotalDifficulty, logPrefix, logEvery.C); err != nil { return err } + announces := cfg.hd.GrabAnnounces() if len(announces) > 0 { cfg.announceNewHashes(ctx, announces) } if headerInserter.BestHeaderChanged() { // We do not break unless there best header changed + noProgressCounter = 0 + wasProgress = true if !initialCycle { // if this is not an initial cycle, we need to react quickly when new headers are coming in break @@ -183,19 +803,42 @@ func HeadersForward( case <-logEvery.C: progress := cfg.hd.Progress() logProgressHeaders(logPrefix, prevProgress, progress) + stats := cfg.hd.ExtractStats() + if prevProgress == progress { + noProgressCounter++ + if noProgressCounter >= 5 { + log.Info("Req/resp stats", "req", stats.Requests, "reqMin", stats.ReqMinBlock, "reqMax", stats.ReqMaxBlock, + "skel", stats.SkeletonRequests, "skelMin", stats.SkeletonReqMinBlock, "skelMax", stats.SkeletonReqMaxBlock, + "resp", stats.Responses, "respMin", stats.RespMinBlock, "respMax", stats.RespMaxBlock, "dups", stats.Duplicates) + cfg.hd.LogAnchorState() + if wasProgress { + log.Warn("Looks like chain is not progressing, moving to the next stage") + break Loop + } + } + } prevProgress = progress case <-timer.C: log.Trace("RequestQueueTime (header) ticked") case <-cfg.hd.DeliveryNotify: - log.Debug("headerLoop woken up by the incoming request") + log.Trace("headerLoop woken up by the incoming request") } timer.Stop() } if headerInserter.Unwind() { u.UnwindTo(headerInserter.UnwindPoint(), common.Hash{}) - } else if headerInserter.GetHighest() != 0 { - if err := fixCanonicalChain(logPrefix, logEvery, headerInserter.GetHighest(), headerInserter.GetHighestHash(), tx); err != nil { - return fmt.Errorf("fix canonical chain: %w", err) + } + if headerInserter.GetHighest() != 0 { + if !headerInserter.Unwind() { + if err := fixCanonicalChain(logPrefix, logEvery, headerInserter.GetHighest(), headerInserter.GetHighestHash(), tx, cfg.blockReader); err != nil { + return fmt.Errorf("fix canonical chain: %w", err) + } + } + if err = rawdb.WriteHeadHeaderHash(tx, headerInserter.GetHighestHash()); err != nil { + return fmt.Errorf("[%s] marking head header hash as %x: %w", logPrefix, headerInserter.GetHighestHash(), err) + } + if err = s.Update(tx, headerInserter.GetHighest()); err != nil { + return fmt.Errorf("[%s] saving Headers progress: %w", logPrefix, err) } } if !useExternalTx { @@ -204,15 +847,15 @@ func HeadersForward( } } if stopped { - return common.ErrStopped + return libcommon.ErrStopped } - // We do not print the followin line if the stage was interrupted + // We do not print the following line if the stage was interrupted log.Info(fmt.Sprintf("[%s] Processed", logPrefix), "highest inserted", headerInserter.GetHighest(), "age", common.PrettyAge(time.Unix(int64(headerInserter.GetHighestTimestamp()), 0))) - stageHeadersGauge.Set(cfg.hd.Progress()) + return nil } -func fixCanonicalChain(logPrefix string, logEvery *time.Ticker, height uint64, hash common.Hash, tx kv.StatelessRwTx) error { +func fixCanonicalChain(logPrefix string, logEvery *time.Ticker, height uint64, hash common.Hash, tx kv.StatelessRwTx, headerReader services.FullBlockReader) error { if height == 0 { return nil } @@ -221,18 +864,22 @@ func fixCanonicalChain(logPrefix string, logEvery *time.Ticker, height uint64, h var ch common.Hash var err error - for ch, err = rawdb.ReadCanonicalHash(tx, ancestorHeight); err == nil && ch != ancestorHash; ch, err = rawdb.ReadCanonicalHash(tx, ancestorHeight) { + for ch, err = headerReader.CanonicalHash(context.Background(), tx, ancestorHeight); err == nil && ch != ancestorHash; ch, err = headerReader.CanonicalHash(context.Background(), tx, ancestorHeight) { if err = rawdb.WriteCanonicalHash(tx, ancestorHash, ancestorHeight); err != nil { return fmt.Errorf("marking canonical header %d %x: %w", ancestorHeight, ancestorHash, err) } - ancestor := rawdb.ReadHeader(tx, ancestorHash, ancestorHeight) + + ancestor, err := headerReader.Header(context.Background(), tx, ancestorHash, ancestorHeight) + if err != nil { + return err + } if ancestor == nil { return fmt.Errorf("ancestor is nil. height %d, hash %x", ancestorHeight, ancestorHash) } select { case <-logEvery.C: - log.Info("fix canonical", "ancestor", ancestorHeight, "hash", ancestorHash) + log.Info(fmt.Sprintf("[%s] write canonical markers", logPrefix), "ancestor", ancestorHeight, "hash", ancestorHash) default: } ancestorHash = ancestor.ParentHash @@ -241,10 +888,11 @@ func fixCanonicalChain(logPrefix string, logEvery *time.Ticker, height uint64, h if err != nil { return fmt.Errorf("reading canonical hash for %d: %w", ancestorHeight, err) } + return nil } -func HeadersUnwind(u *UnwindState, s *StageState, tx kv.RwTx, cfg HeadersCfg) (err error) { +func HeadersUnwind(u *UnwindState, s *StageState, tx kv.RwTx, cfg HeadersCfg, test bool) (err error) { useExternalTx := tx != nil if !useExternalTx { tx, err = cfg.db.BeginRw(context.Background()) @@ -254,11 +902,6 @@ func HeadersUnwind(u *UnwindState, s *StageState, tx kv.RwTx, cfg HeadersCfg) (e defer tx.Rollback() } // Delete canonical hashes that are being unwound - var headerProgress uint64 - headerProgress, err = stages.GetStageProgress(tx, stages.Headers) - if err != nil { - return err - } badBlock := u.BadBlock != (common.Hash{}) if badBlock { cfg.hd.ReportBadHeader(u.BadBlock) @@ -282,47 +925,48 @@ func HeadersUnwind(u *UnwindState, s *StageState, tx kv.RwTx, cfg HeadersCfg) (e return fmt.Errorf("iterate over headers to mark bad headers: %w", err) } } - for blockHeight := headerProgress; blockHeight > u.UnwindPoint; blockHeight-- { - if err = rawdb.DeleteCanonicalHash(tx, blockHeight); err != nil { - return err - } + if err := rawdb.TruncateCanonicalHash(tx, u.UnwindPoint+1); err != nil { + return err } if badBlock { - // Find header with biggest TD - tdCursor, cErr := tx.Cursor(kv.HeaderTD) - if cErr != nil { - return cErr - } - defer tdCursor.Close() - var k, v []byte - k, v, err = tdCursor.Last() - if err != nil { - return err - } var maxTd big.Int var maxHash common.Hash var maxNum uint64 = 0 - for ; err == nil && k != nil; k, v, err = tdCursor.Prev() { - if len(k) != 40 { - return fmt.Errorf("key in TD table has to be 40 bytes long: %x", k) - } - var hash common.Hash - copy(hash[:], k[8:]) - if cfg.hd.IsBadHeader(hash) { - continue + + if test { // If we are not in the test, we can do searching for the heaviest chain in the next cycle + // Find header with biggest TD + tdCursor, cErr := tx.Cursor(kv.HeaderTD) + if cErr != nil { + return cErr } - var td big.Int - if err = rlp.DecodeBytes(v, &td); err != nil { + defer tdCursor.Close() + var k, v []byte + k, v, err = tdCursor.Last() + if err != nil { return err } - if td.Cmp(&maxTd) > 0 { - maxTd.Set(&td) - copy(maxHash[:], k[8:]) - maxNum = binary.BigEndian.Uint64(k[:8]) + for ; err == nil && k != nil; k, v, err = tdCursor.Prev() { + if len(k) != 40 { + return fmt.Errorf("key in TD table has to be 40 bytes long: %x", k) + } + var hash common.Hash + copy(hash[:], k[8:]) + if cfg.hd.IsBadHeader(hash) { + continue + } + var td big.Int + if err = rlp.DecodeBytes(v, &td); err != nil { + return err + } + if td.Cmp(&maxTd) > 0 { + maxTd.Set(&td) + copy(maxHash[:], k[8:]) + maxNum = binary.BigEndian.Uint64(k[:8]) + } + } + if err != nil { + return err } - } - if err != nil { - return err } if maxNum == 0 { maxNum = u.UnwindPoint @@ -351,33 +995,58 @@ func HeadersUnwind(u *UnwindState, s *StageState, tx kv.RwTx, cfg HeadersCfg) (e func logProgressHeaders(logPrefix string, prev, now uint64) uint64 { speed := float64(now-prev) / float64(logInterval/time.Second) var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) log.Info(fmt.Sprintf("[%s] Wrote block headers", logPrefix), "number", now, "blk/second", speed, - "alloc", common.StorageSize(m.Alloc), - "sys", common.StorageSize(m.Sys)) + "alloc", libcommon.ByteCount(m.Alloc), + "sys", libcommon.ByteCount(m.Sys)) return now } type chainReader struct { - config *params.ChainConfig - tx kv.RwTx + config *params.ChainConfig + tx kv.RwTx + blockReader services.FullBlockReader } func (cr chainReader) Config() *params.ChainConfig { return cr.config } func (cr chainReader) CurrentHeader() *types.Header { panic("") } func (cr chainReader) GetHeader(hash common.Hash, number uint64) *types.Header { + if cr.blockReader != nil { + h, _ := cr.blockReader.Header(context.Background(), cr.tx, hash, number) + return h + } return rawdb.ReadHeader(cr.tx, hash, number) } func (cr chainReader) GetHeaderByNumber(number uint64) *types.Header { + if cr.blockReader != nil { + h, _ := cr.blockReader.HeaderByNumber(context.Background(), cr.tx, number) + return h + } return rawdb.ReadHeaderByNumber(cr.tx, number) + } func (cr chainReader) GetHeaderByHash(hash common.Hash) *types.Header { + if cr.blockReader != nil { + number := rawdb.ReadHeaderNumber(cr.tx, hash) + if number == nil { + return nil + } + return cr.GetHeader(hash, *number) + } h, _ := rawdb.ReadHeaderByHash(cr.tx, hash) return h } +func (cr chainReader) GetTd(hash common.Hash, number uint64) *big.Int { + td, err := rawdb.ReadTd(cr.tx, hash, number) + if err != nil { + log.Error("ReadTd failed", "err", err) + return nil + } + return td +} type epochReader struct { tx kv.RwTx @@ -416,3 +1085,201 @@ func HeadersPrune(p *PruneState, tx kv.RwTx, cfg HeadersCfg, ctx context.Context } return nil } + +func DownloadAndIndexSnapshotsIfNeed(s *StageState, ctx context.Context, tx kv.RwTx, cfg HeadersCfg, initialCycle bool) error { + if cfg.snapshots == nil || !cfg.snapshots.Cfg().Enabled || !initialCycle { + return nil + } + + if err := WaitForDownloader(ctx, cfg); err != nil { + return err + } + if err := cfg.snapshots.Reopen(); err != nil { + return fmt.Errorf("ReopenSegments: %w", err) + } + expect := snapshothashes.KnownConfig(cfg.chainConfig.ChainName).ExpectBlocks + if cfg.snapshots.SegmentsMax() < expect { + k, err := rawdb.SecondKey(tx, kv.Headers) // genesis always first + if err != nil { + return err + } + var hasInDB uint64 = 1 + if k != nil { + hasInDB = binary.BigEndian.Uint64(k) + } + if cfg.snapshots.SegmentsMax() < hasInDB { + return fmt.Errorf("not enough snapshots available: snapshots=%d, blockInDB=%d, expect=%d", cfg.snapshots.SegmentsMax(), hasInDB, expect) + } else { + log.Warn(fmt.Sprintf("not enough snapshots available: %d < %d, but we can re-generate them because DB has historical blocks up to: %d", cfg.snapshots.SegmentsMax(), expect, hasInDB)) + } + } + + var m runtime.MemStats + libcommon.ReadMemStats(&m) + log.Info("[Snapshots] Stat", "blocks", cfg.snapshots.BlocksAvailable(), "segments", cfg.snapshots.SegmentsMax(), "indices", cfg.snapshots.IndicesMax(), "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) + + // Create .idx files + if cfg.snapshots.Cfg().Produce && cfg.snapshots.IndicesMax() < cfg.snapshots.SegmentsMax() { + if !cfg.snapshots.SegmentsReady() { + return fmt.Errorf("not all snapshot segments are available") + } + + // wait for Downloader service to download all expected snapshots + if cfg.snapshots.IndicesMax() < cfg.snapshots.SegmentsMax() { + chainID, _ := uint256.FromBig(cfg.chainConfig.ChainID) + workers := cmp.InRange(1, 2, runtime.GOMAXPROCS(-1)-1) + if err := snapshotsync.BuildIndices(ctx, cfg.snapshots, *chainID, cfg.tmpdir, cfg.snapshots.IndicesMax(), workers, log.LvlInfo); err != nil { + return fmt.Errorf("BuildIndices: %w", err) + } + } + + if err := cfg.snapshots.Reopen(); err != nil { + return fmt.Errorf("ReopenIndices: %w", err) + } + } + if cfg.dbEventNotifier != nil { + cfg.dbEventNotifier.OnNewSnapshot() + } + + if s.BlockNumber < cfg.snapshots.BlocksAvailable() { // allow genesis + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + h2n := etl.NewCollector("Snapshots", cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer h2n.Close() + h2n.LogLvl(log.LvlDebug) + + // fill some small tables from snapshots, in future we may store this data in snapshots also, but + // for now easier just store them in db + td := big.NewInt(0) + if err := snapshotsync.ForEachHeader(ctx, cfg.snapshots, func(header *types.Header) error { + blockNum, blockHash := header.Number.Uint64(), header.Hash() + td.Add(td, header.Difficulty) + if err := rawdb.WriteTd(tx, blockHash, blockNum, td); err != nil { + return err + } + if err := rawdb.WriteCanonicalHash(tx, blockHash, blockNum); err != nil { + return err + } + if err := h2n.Collect(blockHash[:], dbutils.EncodeBlockNumber(blockNum)); err != nil { + return err + } + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Writing total difficulty index for snapshots", s.LogPrefix()), "block_num", header.Number.Uint64()) + default: + } + return nil + }); err != nil { + return err + } + if err := h2n.Load(tx, kv.HeaderNumber, etl.IdentityLoadFunc, etl.TransformArgs{}); err != nil { + return err + } + // ResetSequence - allow set arbitrary value to sequence (for example to decrement it to exact value) + ok, err := cfg.snapshots.ViewTxs(cfg.snapshots.BlocksAvailable(), func(sn *snapshotsync.TxnSegment) error { + lastTxnID := sn.IdxTxnHash.BaseDataID() + uint64(sn.Seg.Count()) + if err := rawdb.ResetSequence(tx, kv.EthTx, lastTxnID+1); err != nil { + return err + } + return nil + }) + if err != nil { + return err + } + if !ok { + return fmt.Errorf("snapshot not found for block: %d", cfg.snapshots.BlocksAvailable()) + } + if err := s.Update(tx, cfg.snapshots.BlocksAvailable()); err != nil { + return err + } + canonicalHash, err := cfg.blockReader.CanonicalHash(ctx, tx, cfg.snapshots.BlocksAvailable()) + if err != nil { + return err + } + if err = rawdb.WriteHeadHeaderHash(tx, canonicalHash); err != nil { + return err + } + if err := s.Update(tx, cfg.snapshots.BlocksAvailable()); err != nil { + return err + } + s.BlockNumber = cfg.snapshots.BlocksAvailable() + } + + if err := cfg.hd.AddHeadersFromSnapshot(tx, cfg.snapshots.BlocksAvailable(), cfg.blockReader); err != nil { + return err + } + + return nil +} + +// WaitForDownloader - wait for Downloader service to download all expected snapshots +// for MVP we sync with Downloader only once, in future will send new snapshots also +func WaitForDownloader(ctx context.Context, cfg HeadersCfg) error { + // send all hashes to the Downloader service + preverified := snapshothashes.KnownConfig(cfg.chainConfig.ChainName).Preverified + req := &proto_downloader.DownloadRequest{Items: make([]*proto_downloader.DownloadItem, 0, len(preverified))} + i := 0 + for _, p := range preverified { + req.Items = append(req.Items, &proto_downloader.DownloadItem{ + TorrentHash: downloadergrpc.String2Proto(p.Hash), + Path: p.Name, + }) + i++ + } + log.Info("[Snapshots] Fetching torrent files metadata") + for { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + if _, err := cfg.snapshotDownloader.Download(ctx, req); err != nil { + log.Error("[Snapshots] call downloader", "err", err) + time.Sleep(10 * time.Second) + continue + } + break + } + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + // Check once without delay, for faster erigon re-start + if stats, err := cfg.snapshotDownloader.Stats(ctx, &proto_downloader.StatsRequest{}); err == nil && stats.Completed { + return nil + } + + var m runtime.MemStats + // Print download progress until all segments are available +Loop: + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + if stats, err := cfg.snapshotDownloader.Stats(ctx, &proto_downloader.StatsRequest{}); err != nil { + log.Warn("Error while waiting for snapshots progress", "err", err) + } else if stats.Completed { + break Loop + } else { + if stats.MetadataReady < stats.FilesTotal { + log.Info(fmt.Sprintf("[Snapshots] Waiting for torrents metadata: %d/%d", stats.MetadataReady, stats.FilesTotal)) + continue + } + libcommon.ReadMemStats(&m) + log.Info("[Snapshots] download", + "progress", fmt.Sprintf("%.2f%% %s/%s", stats.Progress, libcommon.ByteCount(stats.BytesCompleted), libcommon.ByteCount(stats.BytesTotal)), + "download", libcommon.ByteCount(stats.DownloadRate)+"/s", + "upload", libcommon.ByteCount(stats.UploadRate)+"/s", + "peers", stats.PeersUnique, + "connections", stats.ConnectionsTotal, + "files", stats.FilesTotal, + "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys), + ) + } + } + } + return nil +} diff --git a/eth/stagedsync/stage_headers_snapshot.go b/eth/stagedsync/stage_headers_snapshot.go deleted file mode 100644 index aab81d5f72f..00000000000 --- a/eth/stagedsync/stage_headers_snapshot.go +++ /dev/null @@ -1,161 +0,0 @@ -package stagedsync - -import ( - "context" - "fmt" - "sync/atomic" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/eth/ethconfig" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" - "github.com/ledgerwatch/log/v3" -) - -type SnapshotHeadersCfg struct { - db kv.RwDB - snapshotDir string - client *snapshotsync.Client - snapshotMigrator *snapshotsync.SnapshotMigrator - log log.Logger -} - -func StageSnapshotHeadersCfg(db kv.RwDB, snapshot ethconfig.Snapshot, client *snapshotsync.Client, snapshotMigrator *snapshotsync.SnapshotMigrator, logger log.Logger) SnapshotHeadersCfg { - return SnapshotHeadersCfg{ - db: db, - snapshotDir: snapshot.Dir, - client: client, - snapshotMigrator: snapshotMigrator, - log: logger, - } -} - -func SpawnHeadersSnapshotGenerationStage(s *StageState, tx kv.RwTx, cfg SnapshotHeadersCfg, initial bool, ctx context.Context) error { - //generate snapshot only on initial mode - if !initial { - return nil - } - - readTX, err := cfg.db.BeginRo(ctx) - if err != nil { - return err - } - defer readTX.Rollback() - - to, err := stages.GetStageProgress(readTX, stages.Headers) - if err != nil { - return fmt.Errorf("%w", err) - } - - //it's too early for snapshot - if to < snapshotsync.EpochSize { - return nil - } - - currentSnapshotBlock, err := stages.GetStageProgress(readTX, stages.CreateHeadersSnapshot) - if err != nil { - return fmt.Errorf("%w", err) - } - snapshotBlock := snapshotsync.CalculateEpoch(to, snapshotsync.EpochSize) - - //Problem: we must inject this stage, because it's not possible to do compact mdbx after sync. - //So we have to move headers to snapshot right after headers stage. - //but we don't want to block not initial sync - if snapshotBlock <= currentSnapshotBlock { - return nil - } - - err = cfg.snapshotMigrator.AsyncStages(snapshotBlock, cfg.log, cfg.db, readTX, cfg.client, false) - if err != nil { - return err - } - readTX.Rollback() - - for !cfg.snapshotMigrator.Replaced() { - time.Sleep(time.Minute) - log.Info("Wait old snapshot to close") - } - - writeTX, err := cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer writeTX.Rollback() - - err = cfg.snapshotMigrator.SyncStages(snapshotBlock, cfg.db, writeTX) - if err != nil { - return err - } - err = s.Update(tx, snapshotBlock) - if err != nil { - return err - } - - err = writeTX.Commit() - if err != nil { - return err - } - - final := func() (bool, error) { - readTX, err = cfg.db.BeginRw(ctx) - if err != nil { - return false, err - } - defer readTX.Rollback() - err = cfg.snapshotMigrator.Final(readTX) - - return atomic.LoadUint64(&cfg.snapshotMigrator.HeadersCurrentSnapshot) == snapshotBlock, err - } - - for { - ok, err := final() - if err != nil { - return err - } - if ok { - break - } - time.Sleep(time.Second) - } - return nil -} - -func UnwindHeadersSnapshotGenerationStage(u *UnwindState, tx kv.RwTx, cfg SnapshotHeadersCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if err := u.Done(tx); err != nil { - return err - } - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} - -func PruneHeadersSnapshotGenerationStage(u *PruneState, tx kv.RwTx, cfg SnapshotHeadersCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} diff --git a/eth/stagedsync/stage_indexes.go b/eth/stagedsync/stage_indexes.go index 25e53b9ce3b..2d6ae93fa73 100644 --- a/eth/stagedsync/stage_indexes.go +++ b/eth/stagedsync/stage_indexes.go @@ -7,20 +7,21 @@ import ( "errors" "fmt" "runtime" - "sort" "time" "github.com/RoaringBitmap/roaring/roaring64" "github.com/c2h5oh/datasize" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/ethdb/bitmapdb" "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/log/v3" + "golang.org/x/exp/slices" ) type HistoryCfg struct { @@ -139,15 +140,12 @@ func promoteHistory(logPrefix string, tx kv.RwTx, changesetBucket string, start, checkFlushEvery := time.NewTicker(cfg.flushEvery) defer checkFlushEvery.Stop() - collectorUpdates := etl.NewCollector(cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer collectorUpdates.Close(logPrefix) + collectorUpdates := etl.NewCollector(logPrefix, cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collectorUpdates.Close() - if err := changeset.Walk(tx, changesetBucket, dbutils.EncodeBlockNumber(start), 0, func(blockN uint64, k, v []byte) (bool, error) { - if blockN >= stop { - return false, nil - } - if err := common.Stopped(quit); err != nil { - return false, err + if err := changeset.ForRange(tx, changesetBucket, start, stop, func(blockN uint64, k, v []byte) error { + if err := libcommon.Stopped(quit); err != nil { + return err } k = dbutils.CompositeKeyWithoutIncarnation(k) @@ -156,26 +154,25 @@ func promoteHistory(logPrefix string, tx kv.RwTx, changesetBucket string, start, default: case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockN, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + libcommon.ReadMemStats(&m) + log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockN, "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) case <-checkFlushEvery.C: if needFlush64(updates, cfg.bufLimit) { if err := flushBitmaps64(collectorUpdates, updates); err != nil { - return false, err + return err } updates = map[string]*roaring64.Bitmap{} } } - kStr := string(k) - m, ok := updates[kStr] + m, ok := updates[string(k)] if !ok { m = roaring64.New() - updates[kStr] = m + updates[string(k)] = m } m.Add(blockN) - return true, nil + return nil }); err != nil { return err } @@ -222,7 +219,7 @@ func promoteHistory(logPrefix string, tx kv.RwTx, changesetBucket string, start, return nil } - if err := collectorUpdates.Load(logPrefix, tx, changeset.Mapper[changesetBucket].IndexBucket, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := collectorUpdates.Load(tx, changeset.Mapper[changesetBucket].IndexBucket, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } return nil @@ -290,19 +287,19 @@ func unwindHistory(logPrefix string, db kv.RwTx, csBucket string, to uint64, cfg defer logEvery.Stop() updates := map[string]struct{}{} - if err := changeset.Walk(db, csBucket, dbutils.EncodeBlockNumber(to), 0, func(blockN uint64, k, v []byte) (bool, error) { + if err := changeset.ForEach(db, csBucket, dbutils.EncodeBlockNumber(to), func(blockN uint64, k, v []byte) error { select { case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockN, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + libcommon.ReadMemStats(&m) + log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockN, "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) case <-quitCh: - return false, common.ErrStopped + return libcommon.ErrStopped default: } k = dbutils.CompositeKeyWithoutIncarnation(k) updates[string(k)] = struct{}{} - return true, nil + return nil }); err != nil { return err } @@ -316,9 +313,9 @@ func unwindHistory(logPrefix string, db kv.RwTx, csBucket string, to uint64, cfg func needFlush64(bitmaps map[string]*roaring64.Bitmap, memLimit datasize.ByteSize) bool { sz := uint64(0) for _, m := range bitmaps { - sz += m.GetSizeInBytes() + sz += m.GetSizeInBytes() * 2 // for golang's overhead } - const memoryNeedsForKey = 32 * 2 // each key stored in RAM: as string ang slice of bytes + const memoryNeedsForKey = 32 * 2 * 2 // len(key) * (string and bytes) overhead * go's map overhead return uint64(len(bitmaps)*memoryNeedsForKey)+sz > uint64(memLimit) } @@ -344,7 +341,7 @@ func truncateBitmaps64(tx kv.RwTx, bucket string, inMem map[string]struct{}, to for k := range inMem { keys = append(keys, k) } - sort.Strings(keys) + slices.Sort(keys) for _, k := range keys { if err := bitmapdb.TruncateRange64(tx, bucket, []byte(k), to+1); err != nil { return fmt.Errorf("fail TruncateRange: bucket=%s, %w", bucket, err) @@ -419,17 +416,19 @@ func pruneHistoryIndex(tx kv.RwTx, csTable, logPrefix, tmpDir string, pruneTo ui logEvery := time.NewTicker(logInterval) defer logEvery.Stop() - collector := etl.NewCollector(tmpDir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) - defer collector.Close(logPrefix) + collector := etl.NewCollector(logPrefix, tmpDir, etl.NewOldestEntryBuffer(etl.BufferOptimalSize)) + defer collector.Close() - if err := changeset.Walk(tx, csTable, nil, 0, func(blockNum uint64, k, _ []byte) (bool, error) { - if blockNum >= pruneTo { - return false, nil - } - if err := collector.Collect(k, nil); err != nil { - return false, err + if err := changeset.ForRange(tx, csTable, 0, pruneTo, func(blockNum uint64, k, _ []byte) error { + select { + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", csTable, "block_num", blockNum) + case <-ctx.Done(): + return libcommon.ErrStopped + default: } - return true, nil + + return collector.Collect(k, nil) }); err != nil { return err } @@ -439,16 +438,16 @@ func pruneHistoryIndex(tx kv.RwTx, csTable, logPrefix, tmpDir string, pruneTo ui return fmt.Errorf("failed to create cursor for pruning %w", err) } defer c.Close() - prefixLen := common.AddressLength + prefixLen := length.Addr if csTable == kv.StorageChangeSet { - prefixLen = common.HashLength + prefixLen = length.Hash } - if err := collector.Load(logPrefix, tx, "", func(addr, _ []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { + if err := collector.Load(tx, "", func(addr, _ []byte, table etl.CurrentTableReader, next etl.LoadNextFunc) error { select { case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", changeset.Mapper[csTable].IndexBucket, "key", fmt.Sprintf("%x", addr)) + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", changeset.Mapper[csTable].IndexBucket, "key", fmt.Sprintf("%x", addr)) case <-ctx.Done(): - return common.ErrStopped + return libcommon.ErrStopped default: } for k, _, err := c.Seek(addr); k != nil; k, _, err = c.Next() { diff --git a/eth/stagedsync/stage_indexes_test.go b/eth/stagedsync/stage_indexes_test.go index cfb077dc044..3f3815797db 100644 --- a/eth/stagedsync/stage_indexes_test.go +++ b/eth/stagedsync/stage_indexes_test.go @@ -10,6 +10,8 @@ import ( "testing" "time" + "github.com/RoaringBitmap/roaring/roaring64" + "github.com/ledgerwatch/erigon-lib/common/length" "github.com/ledgerwatch/erigon-lib/kv" kv2 "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/ledgerwatch/erigon/common" @@ -171,9 +173,9 @@ func TestIndexGenerator_Truncate(t *testing.T) { } func expectNoHistoryBefore(t *testing.T, tx kv.Tx, csbucket string, prunedTo uint64) { - prefixLen := common.AddressLength + prefixLen := length.Addr if csbucket == kv.StorageChangeSet { - prefixLen = common.HashLength + prefixLen = length.Hash } afterPrune := 0 err := tx.ForEach(changeset.Mapper[csbucket].IndexBucket, nil, func(k, _ []byte) error { @@ -286,3 +288,14 @@ func generateAddrs(numOfAddrs int, isPlain bool) ([][]byte, error) { } return addrs, nil } + +func TestRoaringCanParseRealDBValue(t *testing.T) { + v := common.FromHex("0100000000000000000000003a30000001000000c700c00310000000c02c092e162e55315a315b315c310932103214321d321f32223226322d323c325a325b326132623267326c327332753278327f32853287329932ab32af32bb32c332c732c832cf32d232d732d832db32e232e532e932f032f632fe320f331333173325332e3333333433363344334e33583369336e337d338a3391339933a733ab33b033b533c133cb33d133ff3301340c34143421342e3434343a345f346734733476347d348734893497349a34a134a534b834ce34d534dc34df34eb34ed34f334f634023505350c3513353e3546354a354f355a356235713576357a358d35913598359e35a535bf3501361c362036243625362c3634363c36453648365636643665366b367036713679367c3682369f36a336b336be36cc36d436db3609370f37433759375d3766378337983799379c37a837a937af37b137b837bb37c037c337c737d537db37e037f3371c38263828382d3832383c383e3846384d3852386f3875387b388138843889388b389038b438c038c338ce38d738de38e638f8380e39273933393d394d39793981398639a839b639c039c339e039f239043a0f3a1f3a243a273a2a3a2b3a453a563a663a693a793a7d3a833a8b3ac43add3af63a033b0e3b283b2f3b413b443b5c3b803b8e3ba03bae3bc73bd03be03b0c3c133c1d3c1e3c333c3c3c3f3c4f3c693c7c3c933cbe3cca3cd93cdd3ce13ce93cf53c063d0b3d173d1d3d233d283d3d3d423d453d4d3d513d563d5e3d6a3d6e3d943dc43dd63de03df43df73d273e7c3ea13ea63edd3ee33ef23e423f4f3fcf40d340d940e440ed40f24000410b4116411a414f41694172417f4188418a41a041aa41c541cc41d241d841e541f341fc410e4214421e4224422a423042454258427f4281429042b742bf42c642d742e642eb42f042f642024310431443184323432b433043354338433e4343434f4355435943614366436e43704373437a437d438143854387438f4392439e43a843b843c643ce43d343dd43f043fb430d44124419441e44214425442e442f4433443b44584460446844744478447a448c449244a444a844b744c344cf44d944e744ec4407451145264541454c4576458545a045ad45b345bd45e145ea45f34505460c46114614461946494654465d4668466f4675467a467e4687469446ae46ba46c146c646c846d446da46de46ec46fb4602470b4716471f4727472a473147384771479e47c147d347d947ff487449824987498949c049c449d949eb49ff49094a0b4a0d4a8a4b934b974bb54bbc4bc04bc14bc64bc74bca4bd14bd54bdf4be24be34be74bee4bf04bf54b014c064c0a4c174c1e4c224c294c354c394c3e4c404c454c504c554c5b4c5d4c5e4c754c7f4c814c844c894c904c9b4ca44cab4cae4cb24cb44cc64cc84ccb4ccd4cd14cd64ceb4ced4cf84cfe4c054d0c4d124d154d194d224d2b4d334d3c4d4d4d574d5d4d604d674d704d734d794d804d864d954d984d9e4da14dac4dbb4dc14dc44dcc4dcf4dd54ddd4deb4dec4df04df74d094e114e144e294e2f4e364e394e404e484e514e594e5d4e684e6c4e704e754e774e814e8d4e954ea34ea94eaa4ead4eb34eb54ebb4ec54ec94ed14ed74ee04ee44ee94eeb4ef44efe4e014f054f124f1e4f304f334f374f394f3a4f4a4f5a4f604f674f6b4f754f774f7f4f8f4f954f9a4f9c4fa34fbf4fc84fe64ff04ffe4f06501f502d50305036503f504750525056505c50645068506a506e5073507b5088508a5094509a50a050a250af50b250b650cf50d650eb50f650f750fd50035105511451175119511c5125512a512c5135513d514351455153515a515f517651775178517b518051835186518b519151a251ad51b851bc51ca51cc51df51e251e651e851ed51ee51ef51fc51075224522952335234523d5248524c524f52505255525c526c5273527c528552aa52bb52c952d552db52e152e852f1520d533f5343534a535a5363536d5374537a53835386538b5396539e53a453ad539e54fe5448566656a558f6583f597f599b59b559dd59055a1e5a9b5afa5a045b0e5b175b2c5b315b335b395bf65b145c465c525c5d5c615c6b5c875c8d5cb45cba5cec5cf25cf75c055d585ea15ee55ebc5fee5f016019603a60426059605b609760a860d36015613c617061bc61c661d461e561ed61f36152626762a262bc62c162c562d462de62076330633c635f638063826388638d63cf63f363fa6311642e64cb64ea641765216538653e655365ba65bd65c965cf65d465d865d965dc65de65e565ea65ed65f465f965fc6500660c660f661a662b66366645664b664d6655667066776682668b66906692669366ad66b366b766b966d266d566fb66ff6604670867186723673767436749674d67526757676467af67e56716681e6825682c6835683c683e684e6855685c685d6867686f6873687a68e068236b4c6b8a6bcc6bdc6bde6bed6c1d6f236f596f6e6fbc6f8c708f7093709b70a27021714b71eb731b75377548755c7581759d75a575ab75b175237648764c765b76697682769376c176d6762c7740775f776d778777c977d477ef77f277ff7707780e78207821782e7833783b783f784d784f7853785a78717872787f7883788d7894789d78a078a378c578c978d078d378d778e678e878ea78f278f77809790c79") + m := roaring64.New() + err := m.UnmarshalBinary(v) + require.NoError(t, err) + require.Equal(t, uint64(961), m.GetCardinality()) + encoded, err := m.MarshalBinary() + require.NoError(t, err) + require.Equal(t, encoded, v) +} diff --git a/eth/stagedsync/stage_interhashes.go b/eth/stagedsync/stage_interhashes.go index 236dd6ca33a..950d204be0b 100644 --- a/eth/stagedsync/stage_interhashes.go +++ b/eth/stagedsync/stage_interhashes.go @@ -6,18 +6,19 @@ import ( "fmt" "math/bits" "os" - "sort" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/changeset" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" - "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/erigon/turbo/trie" "github.com/ledgerwatch/log/v3" + "golang.org/x/exp/slices" ) type TrieCfg struct { @@ -25,14 +26,16 @@ type TrieCfg struct { checkRoot bool tmpDir string saveNewHashesToDB bool // no reason to save changes when calculating root for mining + blockReader services.FullBlockReader } -func StageTrieCfg(db kv.RwDB, checkRoot, saveNewHashesToDB bool, tmpDir string) TrieCfg { +func StageTrieCfg(db kv.RwDB, checkRoot, saveNewHashesToDB bool, tmpDir string, blockReader services.FullBlockReader) TrieCfg { return TrieCfg{ db: db, checkRoot: checkRoot, tmpDir: tmpDir, saveNewHashesToDB: saveNewHashesToDB, + blockReader: blockReader, } } @@ -62,22 +65,20 @@ func SpawnIntermediateHashesStage(s *StageState, u Unwinder, tx kv.RwTx, cfg Tri var expectedRootHash common.Hash var headerHash common.Hash if cfg.checkRoot { - var hash common.Hash - hash, err = rawdb.ReadCanonicalHash(tx, to) + syncHeadHeader, err := cfg.blockReader.HeaderByNumber(ctx, tx, to) if err != nil { return trie.EmptyRoot, err } - syncHeadHeader := rawdb.ReadHeader(tx, hash, to) expectedRootHash = syncHeadHeader.Root headerHash = syncHeadHeader.Hash() } - logPrefix := s.LogPrefix() if to > s.BlockNumber+16 { log.Info(fmt.Sprintf("[%s] Generating intermediate hashes", logPrefix), "from", s.BlockNumber, "to", to) } var root common.Hash - if s.BlockNumber == 0 { + tooBigJump := to > s.BlockNumber && to-s.BlockNumber > 100_000 // RetainList is in-memory structure and it will OOM if jump is too big, such big jump anyway invalidate most of existing Intermediate hashes + if s.BlockNumber == 0 || tooBigJump { if root, err = RegenerateIntermediateHashes(logPrefix, tx, cfg, expectedRootHash, quit); err != nil { return trie.EmptyRoot, err } @@ -91,8 +92,9 @@ func SpawnIntermediateHashesStage(s *StageState, u Unwinder, tx kv.RwTx, cfg Tri if cfg.checkRoot && root != expectedRootHash { log.Error(fmt.Sprintf("[%s] Wrong trie root of block %d: %x, expected (from header): %x. Block hash: %x", logPrefix, to, root, expectedRootHash, headerHash)) if to > s.BlockNumber { - log.Warn("Unwinding due to incorrect root hash", "to", to-1) - u.UnwindTo(to-1, headerHash) + unwindTo := (to + s.BlockNumber) / 2 // Binary search for the correct block, biased to the lower numbers + log.Warn("Unwinding due to incorrect root hash", "to", unwindTo) + u.UnwindTo(unwindTo, headerHash) } } else if err = s.Update(tx, to); err != nil { return trie.EmptyRoot, err @@ -116,12 +118,12 @@ func RegenerateIntermediateHashes(logPrefix string, db kv.RwTx, cfg TrieCfg, exp _ = db.ClearBucket(kv.TrieOfAccounts) _ = db.ClearBucket(kv.TrieOfStorage) - accTrieCollector := etl.NewCollector(cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer accTrieCollector.Close(logPrefix) + accTrieCollector := etl.NewCollector(logPrefix, cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer accTrieCollector.Close() accTrieCollectorFunc := accountTrieCollector(accTrieCollector) - stTrieCollector := etl.NewCollector(cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer stTrieCollector.Close(logPrefix) + stTrieCollector := etl.NewCollector(logPrefix, cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer stTrieCollector.Close() stTrieCollectorFunc := storageTrieCollector(stTrieCollector) loader := trie.NewFlatDBTrieLoader(logPrefix) @@ -138,10 +140,10 @@ func RegenerateIntermediateHashes(logPrefix string, db kv.RwTx, cfg TrieCfg, exp } log.Info(fmt.Sprintf("[%s] Trie root", logPrefix), "hash", hash.Hex()) - if err := accTrieCollector.Load(logPrefix, db, kv.TrieOfAccounts, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := accTrieCollector.Load(db, kv.TrieOfAccounts, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { return trie.EmptyRoot, err } - if err := stTrieCollector.Load(logPrefix, db, kv.TrieOfStorage, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := stTrieCollector.Load(db, kv.TrieOfStorage, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { return trie.EmptyRoot, err } return hash, nil @@ -170,42 +172,48 @@ func (p *HashPromoter) Promote(logPrefix string, s *StageState, from, to uint64, } else { changeSetBucket = kv.AccountChangeSet } - log.Debug(fmt.Sprintf("[%s] Incremental state promotion of intermediate hashes", logPrefix), "from", from, "to", to, "csbucket", changeSetBucket) + log.Trace(fmt.Sprintf("[%s] Incremental state promotion of intermediate hashes", logPrefix), "from", from, "to", to, "csbucket", changeSetBucket) startkey := dbutils.EncodeBlockNumber(from + 1) decode := changeset.Mapper[changeSetBucket].Decode var deletedAccounts [][]byte extract := func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, v := decode(dbKey, dbValue) + _, k, v, err := decode(dbKey, dbValue) + if err != nil { + return err + } newK, err := transformPlainStateKey(k) if err != nil { return err } - if !storage { - newValue, err := p.db.GetOne(kv.PlainState, k) - if err != nil { + if !storage && len(v) > 0 { + + var oldAccount accounts.Account + if err := oldAccount.DecodeForStorage(v); err != nil { return err } - if len(v) > 0 { - var oldAccount accounts.Account - if err := oldAccount.DecodeForStorage(v); err != nil { + + if oldAccount.Incarnation > 0 { + + newValue, err := p.db.GetOne(kv.PlainState, k) + if err != nil { return err } - if oldAccount.Incarnation > 0 { - if len(newValue) == 0 { // self-destructed + + if len(newValue) == 0 { // self-destructed + deletedAccounts = append(deletedAccounts, newK) + } else { // turns incarnation to zero + var newAccount accounts.Account + if err := newAccount.DecodeForStorage(newValue); err != nil { + return err + } + if newAccount.Incarnation < oldAccount.Incarnation { deletedAccounts = append(deletedAccounts, newK) - } else { // turns incarnation to zero - var newAccount accounts.Account - if err := newAccount.DecodeForStorage(newValue); err != nil { - return err - } - if newAccount.Incarnation < oldAccount.Incarnation { - deletedAccounts = append(deletedAccounts, newK) - } } } } + } return next(dbKey, newK, v) @@ -232,7 +240,7 @@ func (p *HashPromoter) Promote(logPrefix string, s *StageState, from, to uint64, } if !storage { // delete Intermediate hashes of deleted accounts - sort.Slice(deletedAccounts, func(i, j int) bool { return bytes.Compare(deletedAccounts[i], deletedAccounts[j]) < 0 }) + slices.SortFunc(deletedAccounts, func(a, b []byte) bool { return bytes.Compare(a, b) < 0 }) for _, k := range deletedAccounts { if err := p.db.ForPrefix(kv.TrieOfStorage, k, func(k, v []byte) error { if err := p.db.Delete(kv.TrieOfStorage, k, v); err != nil { @@ -264,7 +272,10 @@ func (p *HashPromoter) Unwind(logPrefix string, s *StageState, u *UnwindState, s decode := changeset.Mapper[changeSetBucket].Decode var deletedAccounts [][]byte extract := func(dbKey, dbValue []byte, next etl.ExtractNextFunc) error { - _, k, v := decode(dbKey, dbValue) + _, k, v, err := decode(dbKey, dbValue) + if err != nil { + return err + } newK, err := transformPlainStateKey(k) if err != nil { return err @@ -318,7 +329,7 @@ func (p *HashPromoter) Unwind(logPrefix string, s *StageState, u *UnwindState, s } if !storage { // delete Intermediate hashes of deleted accounts - sort.Slice(deletedAccounts, func(i, j int) bool { return bytes.Compare(deletedAccounts[i], deletedAccounts[j]) < 0 }) + slices.SortFunc(deletedAccounts, func(a, b []byte) bool { return bytes.Compare(a, b) < 0 }) for _, k := range deletedAccounts { if err := p.db.ForPrefix(kv.TrieOfStorage, k, func(k, v []byte) error { if err := p.db.Delete(kv.TrieOfStorage, k, v); err != nil { @@ -350,12 +361,12 @@ func incrementIntermediateHashes(logPrefix string, s *StageState, db kv.RwTx, to return trie.EmptyRoot, err } - accTrieCollector := etl.NewCollector(cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer accTrieCollector.Close(logPrefix) + accTrieCollector := etl.NewCollector(logPrefix, cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer accTrieCollector.Close() accTrieCollectorFunc := accountTrieCollector(accTrieCollector) - stTrieCollector := etl.NewCollector(cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer stTrieCollector.Close(logPrefix) + stTrieCollector := etl.NewCollector(logPrefix, cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer stTrieCollector.Close() stTrieCollectorFunc := storageTrieCollector(stTrieCollector) loader := trie.NewFlatDBTrieLoader(logPrefix) @@ -370,13 +381,11 @@ func incrementIntermediateHashes(logPrefix string, s *StageState, db kv.RwTx, to if cfg.checkRoot && hash != expectedRootHash { return hash, nil } - log.Info(fmt.Sprintf("[%s] Trie root", logPrefix), - " hash", hash.Hex()) - if err := accTrieCollector.Load(logPrefix, db, kv.TrieOfAccounts, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := accTrieCollector.Load(db, kv.TrieOfAccounts, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { return trie.EmptyRoot, err } - if err := stTrieCollector.Load(logPrefix, db, kv.TrieOfStorage, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := stTrieCollector.Load(db, kv.TrieOfStorage, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { return trie.EmptyRoot, err } return hash, nil @@ -393,19 +402,14 @@ func UnwindIntermediateHashesStage(u *UnwindState, s *StageState, tx kv.RwTx, cf defer tx.Rollback() } - hash, err := rawdb.ReadCanonicalHash(tx, u.UnwindPoint) + syncHeadHeader, err := cfg.blockReader.HeaderByNumber(ctx, tx, u.UnwindPoint) if err != nil { - return fmt.Errorf("read canonical hash: %w", err) + return err + } + if syncHeadHeader == nil { + return fmt.Errorf("header not found for block number %d", u.UnwindPoint) } - syncHeadHeader := rawdb.ReadHeader(tx, hash, u.UnwindPoint) expectedRootHash := syncHeadHeader.Root - //fmt.Printf("\n\nu: %d->%d\n", s.BlockNumber, u.UnwindPoint) - - // if cache != nil { - // if err = cacheWarmUpIfNeed(tx, cache); err != nil { - // return err - // } - // } logPrefix := s.LogPrefix() if err := unwindIntermediateHashesStageImpl(logPrefix, u, s, tx, cfg, expectedRootHash, quit); err != nil { @@ -437,12 +441,12 @@ func unwindIntermediateHashesStageImpl(logPrefix string, u *UnwindState, s *Stag return err } - accTrieCollector := etl.NewCollector(cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer accTrieCollector.Close(logPrefix) + accTrieCollector := etl.NewCollector(logPrefix, cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer accTrieCollector.Close() accTrieCollectorFunc := accountTrieCollector(accTrieCollector) - stTrieCollector := etl.NewCollector(cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer stTrieCollector.Close(logPrefix) + stTrieCollector := etl.NewCollector(logPrefix, cfg.tmpDir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer stTrieCollector.Close() stTrieCollectorFunc := storageTrieCollector(stTrieCollector) loader := trie.NewFlatDBTrieLoader(logPrefix) @@ -457,10 +461,10 @@ func unwindIntermediateHashesStageImpl(logPrefix string, u *UnwindState, s *Stag return fmt.Errorf("wrong trie root: %x, expected (from header): %x", hash, expectedRootHash) } log.Info(fmt.Sprintf("[%s] Trie root", logPrefix), "hash", hash.Hex()) - if err := accTrieCollector.Load(logPrefix, db, kv.TrieOfAccounts, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := accTrieCollector.Load(db, kv.TrieOfAccounts, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } - if err := stTrieCollector.Load(logPrefix, db, kv.TrieOfStorage, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := stTrieCollector.Load(db, kv.TrieOfStorage, etl.IdentityLoadFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } return nil @@ -517,8 +521,8 @@ func accountTrieCollector(collector *etl.Collector) trie.HashCollector2 { if hasState == 0 { return collector.Collect(keyHex, nil) } - if bits.OnesCount16(hasHash) != len(hashes)/common.HashLength { - panic(fmt.Errorf("invariant bits.OnesCount16(hasHash) == len(hashes) failed: %d, %d", bits.OnesCount16(hasHash), len(hashes)/common.HashLength)) + if bits.OnesCount16(hasHash) != len(hashes)/length.Hash { + panic(fmt.Errorf("invariant bits.OnesCount16(hasHash) == len(hashes) failed: %d, %d", bits.OnesCount16(hasHash), len(hashes)/length.Hash)) } assertSubset(hasTree, hasState) assertSubset(hasHash, hasState) @@ -538,8 +542,8 @@ func storageTrieCollector(collector *etl.Collector) trie.StorageHashCollector2 { if len(keyHex) > 0 && hasHash == 0 && hasTree == 0 { return nil } - if bits.OnesCount16(hasHash) != len(hashes)/common.HashLength { - panic(fmt.Errorf("invariant bits.OnesCount16(hasHash) == len(hashes) failed: %d, %d", bits.OnesCount16(hasHash), len(hashes)/common.HashLength)) + if bits.OnesCount16(hasHash) != len(hashes)/length.Hash { + panic(fmt.Errorf("invariant bits.OnesCount16(hasHash) == len(hashes) failed: %d, %d", bits.OnesCount16(hasHash), len(hashes)/length.Hash)) } assertSubset(hasTree, hasState) assertSubset(hasHash, hasState) diff --git a/eth/stagedsync/stage_interhashes_test.go b/eth/stagedsync/stage_interhashes_test.go index 555212f3c08..ee2f4b375af 100644 --- a/eth/stagedsync/stage_interhashes_test.go +++ b/eth/stagedsync/stage_interhashes_test.go @@ -4,12 +4,14 @@ import ( "encoding/binary" "testing" + "github.com/ledgerwatch/erigon-lib/common/length" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/trie" "github.com/stretchr/testify/assert" @@ -55,8 +57,8 @@ func TestAccountAndStorageTrie(t *testing.T) { assert.Nil(t, tx.Put(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hash3, incarnation, loc3), val3)) assert.Nil(t, tx.Put(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hash3, incarnation, loc4), val4)) - hash4 := common.HexToHash("0xB100000000000000000000000000000000000000000000000000000000000000") - assert.Nil(t, addTestAccount(tx, hash4, 4*params.Ether, 0)) + hash4a := common.HexToHash("0xB1A0000000000000000000000000000000000000000000000000000000000000") + assert.Nil(t, addTestAccount(tx, hash4a, 4*params.Ether, 0)) hash5 := common.HexToHash("0xB310000000000000000000000000000000000000000000000000000000000000") assert.Nil(t, addTestAccount(tx, hash5, 8*params.Ether, 0)) @@ -64,51 +66,102 @@ func TestAccountAndStorageTrie(t *testing.T) { hash6 := common.HexToHash("0xB340000000000000000000000000000000000000000000000000000000000000") assert.Nil(t, addTestAccount(tx, hash6, 1*params.Ether, 0)) - _, err := RegenerateIntermediateHashes("IH", tx, StageTrieCfg(nil, false, true, t.TempDir()), common.Hash{} /* expectedRootHash */, nil /* quit */) + // ---------------------------------------------------------------- + // Populate account & storage trie DB tables + // ---------------------------------------------------------------- + + blockReader := snapshotsync.NewBlockReader() + cfg := StageTrieCfg(nil, false, true, t.TempDir(), blockReader) + _, err := RegenerateIntermediateHashes("IH", tx, cfg, common.Hash{} /* expectedRootHash */, nil /* quit */) assert.Nil(t, err) - accountTrie := make(map[string][]byte) + // ---------------------------------------------------------------- + // Check account trie + // ---------------------------------------------------------------- + + accountTrieA := make(map[string][]byte) err = tx.ForEach(kv.TrieOfAccounts, nil, func(k, v []byte) error { - accountTrie[string(k)] = v + accountTrieA[string(k)] = common.CopyBytes(v) return nil }) assert.Nil(t, err) - assert.Equal(t, 2, len(accountTrie)) + assert.Equal(t, 2, len(accountTrieA)) - hasState1, hasTree1, hasHash1, hashes1, rootHash1 := trie.UnmarshalTrieNode(accountTrie[string(common.FromHex("0B"))]) - assert.Equal(t, uint16(0b1011), hasState1) - assert.Equal(t, uint16(0b0001), hasTree1) - assert.Equal(t, uint16(0b1001), hasHash1) - assert.Equal(t, 2*common.HashLength, len(hashes1)) - assert.Equal(t, 0, len(rootHash1)) + hasState1a, hasTree1a, hasHash1a, hashes1a, rootHash1a := trie.UnmarshalTrieNode(accountTrieA[string(common.FromHex("0B"))]) + assert.Equal(t, uint16(0b1011), hasState1a) + assert.Equal(t, uint16(0b0001), hasTree1a) + assert.Equal(t, uint16(0b1001), hasHash1a) + assert.Equal(t, 2*length.Hash, len(hashes1a)) + assert.Equal(t, 0, len(rootHash1a)) - hasState2, hasTree2, hasHash2, hashes2, rootHash2 := trie.UnmarshalTrieNode(accountTrie[string(common.FromHex("0B00"))]) - assert.Equal(t, uint16(0b10001), hasState2) - assert.Equal(t, uint16(0b00000), hasTree2) - assert.Equal(t, uint16(0b10000), hasHash2) - assert.Equal(t, 1*common.HashLength, len(hashes2)) - assert.Equal(t, 0, len(rootHash2)) + hasState2a, hasTree2a, hasHash2a, hashes2a, rootHash2a := trie.UnmarshalTrieNode(accountTrieA[string(common.FromHex("0B00"))]) + assert.Equal(t, uint16(0b10001), hasState2a) + assert.Equal(t, uint16(0b00000), hasTree2a) + assert.Equal(t, uint16(0b10000), hasHash2a) + assert.Equal(t, 1*length.Hash, len(hashes2a)) + assert.Equal(t, 0, len(rootHash2a)) + + // ---------------------------------------------------------------- + // Check storage trie + // ---------------------------------------------------------------- storageTrie := make(map[string][]byte) err = tx.ForEach(kv.TrieOfStorage, nil, func(k, v []byte) error { - storageTrie[string(k)] = v + storageTrie[string(k)] = common.CopyBytes(v) return nil }) assert.Nil(t, err) assert.Equal(t, 1, len(storageTrie)) - storageKey := make([]byte, common.HashLength+8) + storageKey := make([]byte, length.Hash+8) copy(storageKey, hash3.Bytes()) - binary.BigEndian.PutUint64(storageKey[common.HashLength:], incarnation) + binary.BigEndian.PutUint64(storageKey[length.Hash:], incarnation) hasState3, hasTree3, hasHash3, hashes3, rootHash3 := trie.UnmarshalTrieNode(storageTrie[string(storageKey)]) assert.Equal(t, uint16(0b1010), hasState3) assert.Equal(t, uint16(0b0000), hasTree3) assert.Equal(t, uint16(0b0010), hasHash3) - assert.Equal(t, 1*common.HashLength, len(hashes3)) - assert.Equal(t, common.HashLength, len(rootHash3)) + assert.Equal(t, 1*length.Hash, len(hashes3)) + assert.Equal(t, length.Hash, len(rootHash3)) + + // ---------------------------------------------------------------- + // Incremental trie + // ---------------------------------------------------------------- + + newAddress := common.HexToAddress("0x4f61f2d5ebd991b85aa1677db97307caf5215c91") + hash4b, err := common.HashData(newAddress[:]) + assert.Nil(t, err) + assert.Equal(t, hash4a[0], hash4b[0]) + + assert.Nil(t, addTestAccount(tx, hash4b, 5*params.Ether, 0)) + + err = tx.Put(kv.AccountChangeSet, dbutils.EncodeBlockNumber(1), newAddress[:]) + assert.Nil(t, err) + + var s StageState + s.BlockNumber = 0 + _, err = incrementIntermediateHashes("IH", &s, tx, 1 /* to */, cfg, common.Hash{} /* expectedRootHash */, nil /* quit */) + assert.Nil(t, err) + + accountTrieB := make(map[string][]byte) + err = tx.ForEach(kv.TrieOfAccounts, nil, func(k, v []byte) error { + accountTrieB[string(k)] = common.CopyBytes(v) + return nil + }) + assert.Nil(t, err) + + assert.Equal(t, 2, len(accountTrieB)) + + hasState1b, hasTree1b, hasHash1b, hashes1b, rootHash1b := trie.UnmarshalTrieNode(accountTrieB[string(common.FromHex("0B"))]) + assert.Equal(t, hasState1a, hasState1b) + assert.Equal(t, hasTree1a, hasTree1b) + assert.Equal(t, uint16(0b1011), hasHash1b) + assert.Equal(t, 3*length.Hash, len(hashes1b)) + assert.Equal(t, rootHash1a, rootHash1b) + + assert.Equal(t, accountTrieA[string(common.FromHex("0B00"))], accountTrieB[string(common.FromHex("0B00"))]) } func TestAccountTrieAroundExtensionNode(t *testing.T) { @@ -137,7 +190,8 @@ func TestAccountTrieAroundExtensionNode(t *testing.T) { hash6 := common.HexToHash("0x3100000000000000000000000000000000000000000000000000000000000000") assert.Nil(t, tx.Put(kv.HashedAccounts, hash6[:], encoded)) - _, err := RegenerateIntermediateHashes("IH", tx, StageTrieCfg(nil, false, true, t.TempDir()), common.Hash{} /* expectedRootHash */, nil /* quit */) + blockReader := snapshotsync.NewBlockReader() + _, err := RegenerateIntermediateHashes("IH", tx, StageTrieCfg(nil, false, true, t.TempDir(), blockReader), common.Hash{} /* expectedRootHash */, nil /* quit */) assert.Nil(t, err) accountTrie := make(map[string][]byte) @@ -160,6 +214,90 @@ func TestAccountTrieAroundExtensionNode(t *testing.T) { assert.Equal(t, uint16(0b101100000), hasState2) assert.Equal(t, uint16(0b000000000), hasTree2) assert.Equal(t, uint16(0b001000000), hasHash2) - assert.Equal(t, common.HashLength, len(hashes2)) + assert.Equal(t, length.Hash, len(hashes2)) assert.Equal(t, 0, len(rootHash2)) } + +func TestStorageDeletion(t *testing.T) { + _, tx := memdb.NewTestTx(t) + + address := common.HexToAddress("0x1000000000000000000000000000000000000000") + hashedAddress, err := common.HashData(address[:]) + assert.Nil(t, err) + incarnation := uint64(1) + assert.Nil(t, addTestAccount(tx, hashedAddress, params.Ether, incarnation)) + + plainLocation1 := common.HexToHash("0x1000000000000000000000000000000000000000000000000000000000000000") + hashedLocation1, err := common.HashData(plainLocation1[:]) + assert.Nil(t, err) + + plainLocation2 := common.HexToHash("0x1A00000000000000000000000000000000000000000000000000000000000000") + hashedLocation2, err := common.HashData(plainLocation2[:]) + assert.Nil(t, err) + + plainLocation3 := common.HexToHash("0x1E00000000000000000000000000000000000000000000000000000000000000") + hashedLocation3, err := common.HashData(plainLocation3[:]) + assert.Nil(t, err) + + value1 := common.FromHex("0xABCD") + assert.Nil(t, tx.Put(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hashedAddress, incarnation, hashedLocation1), value1)) + + value2 := common.FromHex("0x4321") + assert.Nil(t, tx.Put(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hashedAddress, incarnation, hashedLocation2), value2)) + + value3 := common.FromHex("0x4444") + assert.Nil(t, tx.Put(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hashedAddress, incarnation, hashedLocation3), value3)) + + // ---------------------------------------------------------------- + // Populate account & storage trie DB tables + // ---------------------------------------------------------------- + + blockReader := snapshotsync.NewBlockReader() + cfg := StageTrieCfg(nil, false, true, t.TempDir(), blockReader) + _, err = RegenerateIntermediateHashes("IH", tx, cfg, common.Hash{} /* expectedRootHash */, nil /* quit */) + assert.Nil(t, err) + + // ---------------------------------------------------------------- + // Check storage trie + // ---------------------------------------------------------------- + + storageTrieA := make(map[string][]byte) + err = tx.ForEach(kv.TrieOfStorage, nil, func(k, v []byte) error { + storageTrieA[string(k)] = common.CopyBytes(v) + return nil + }) + assert.Nil(t, err) + + assert.Equal(t, 1, len(storageTrieA)) + + // ---------------------------------------------------------------- + // Delete storage and increment the trie + // ---------------------------------------------------------------- + + assert.Nil(t, tx.Delete(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hashedAddress, incarnation, hashedLocation1), value1)) + assert.Nil(t, tx.Delete(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hashedAddress, incarnation, hashedLocation2), value2)) + assert.Nil(t, tx.Delete(kv.HashedStorage, dbutils.GenerateCompositeStorageKey(hashedAddress, incarnation, hashedLocation3), value3)) + + err = tx.Put(kv.StorageChangeSet, append(dbutils.EncodeBlockNumber(1), dbutils.PlainGenerateStoragePrefix(address[:], incarnation)...), plainLocation1[:]) + assert.Nil(t, err) + + err = tx.Put(kv.StorageChangeSet, append(dbutils.EncodeBlockNumber(1), dbutils.PlainGenerateStoragePrefix(address[:], incarnation)...), plainLocation2[:]) + assert.Nil(t, err) + + err = tx.Put(kv.StorageChangeSet, append(dbutils.EncodeBlockNumber(1), dbutils.PlainGenerateStoragePrefix(address[:], incarnation)...), plainLocation3[:]) + assert.Nil(t, err) + + var s StageState + s.BlockNumber = 0 + _, err = incrementIntermediateHashes("IH", &s, tx, 1 /* to */, cfg, common.Hash{} /* expectedRootHash */, nil /* quit */) + assert.Nil(t, err) + + storageTrieB := make(map[string][]byte) + err = tx.ForEach(kv.TrieOfStorage, nil, func(k, v []byte) error { + storageTrieB[string(k)] = common.CopyBytes(v) + return nil + }) + assert.Nil(t, err) + + assert.Equal(t, 0, len(storageTrieB)) +} diff --git a/eth/stagedsync/stage_issuance.go b/eth/stagedsync/stage_issuance.go new file mode 100644 index 00000000000..38429ddca78 --- /dev/null +++ b/eth/stagedsync/stage_issuance.go @@ -0,0 +1,218 @@ +package stagedsync + +import ( + "bytes" + "context" + "fmt" + "math/big" + "time" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/consensus/ethash" + "github.com/ledgerwatch/erigon/consensus/serenity" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/log/v3" +) + +type IssuanceCfg struct { + db kv.RwDB + chainConfig *params.ChainConfig + blockReader services.FullBlockReader + enabledIssuance bool +} + +func StageIssuanceCfg(db kv.RwDB, chainConfig *params.ChainConfig, blockReader services.FullBlockReader, enabledIssuance bool) IssuanceCfg { + return IssuanceCfg{ + db: db, + chainConfig: chainConfig, + blockReader: blockReader, + enabledIssuance: enabledIssuance, + } +} + +func SpawnStageIssuance(cfg IssuanceCfg, s *StageState, tx kv.RwTx, ctx context.Context) error { + useExternalTx := tx != nil + + if !useExternalTx { + var err error + tx, err = cfg.db.BeginRw(context.Background()) + if err != nil { + return err + } + defer tx.Rollback() + } + + headNumber, err := stages.GetStageProgress(tx, stages.Bodies) + if err != nil { + return fmt.Errorf("getting headers progress: %w", err) + } + + if cfg.chainConfig.Consensus != params.EtHashConsensus || !cfg.enabledIssuance || headNumber == s.BlockNumber { + if !useExternalTx { + if err = tx.Commit(); err != nil { + return err + } + } + return nil + } + + // Log timer + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + // Read previous issuance + totalIssued, err := rawdb.ReadTotalIssued(tx, s.BlockNumber) + if err != nil { + return err + } + + totalBurnt, err := rawdb.ReadTotalBurnt(tx, s.BlockNumber) + if err != nil { + return err + } + + stopped := false + prevProgress := s.BlockNumber + currentBlockNumber := s.BlockNumber + 1 + headerC, err := tx.Cursor(kv.Headers) + if err != nil { + return err + } + for k, v, err := headerC.Seek(dbutils.EncodeBlockNumber(currentBlockNumber)); k != nil && !stopped; k, v, err = headerC.Next() { + if err != nil { + return err + } + + if len(k) != 40 { + continue + } + + currentBlockNumber, err = dbutils.DecodeBlockNumber(k[:8]) + if err != nil { + return err + } + if currentBlockNumber > headNumber { + currentBlockNumber = headNumber + break + } + // read body without transactions + hash, err := rawdb.ReadCanonicalHash(tx, currentBlockNumber) + if err != nil { + return err + } + + if hash != common.BytesToHash(k[8:]) { + continue + } + var header types.Header + if err := rlp.Decode(bytes.NewReader(v), &header); err != nil { + log.Error("Invalid block header RLP", "hash", hash, "err", err) + return nil + } + + burnt := big.NewInt(0) + // burnt: len(Transactions) * baseFee * gasUsed + if header.BaseFee != nil { + burnt.Set(header.BaseFee) + burnt.Mul(burnt, big.NewInt(int64(header.GasUsed))) + } + // TotalIssued, BlockReward and UncleReward, depends on consensus engine + if header.Difficulty.Cmp(serenity.SerenityDifficulty) == 0 { + // Proof-of-stake is 0.3 ether per block + totalIssued.Add(totalIssued, serenity.RewardSerenity) + } else { + var blockReward uint256.Int + var uncleRewards []uint256.Int + if header.UncleHash == types.EmptyUncleHash { + blockReward, uncleRewards = ethash.AccumulateRewards(cfg.chainConfig, &header, nil) + } else { + body, err := cfg.blockReader.Body(ctx, tx, hash, currentBlockNumber) + if err != nil { + return err + } + blockReward, uncleRewards = ethash.AccumulateRewards(cfg.chainConfig, &header, body.Uncles) + } + // Set BlockReward + totalIssued.Add(totalIssued, blockReward.ToBig()) + // Compute uncleRewards + for _, uncleReward := range uncleRewards { + totalIssued.Add(totalIssued, uncleReward.ToBig()) + } + } + totalBurnt.Add(totalBurnt, burnt) + // Write to database + if err := rawdb.WriteTotalIssued(tx, currentBlockNumber, totalIssued); err != nil { + return err + } + if err := rawdb.WriteTotalBurnt(tx, currentBlockNumber, totalBurnt); err != nil { + return err + } + // Sleep and check for logs + select { + case <-ctx.Done(): + stopped = true + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Wrote Block Issuance", s.LogPrefix()), + "now", currentBlockNumber, "blk/sec", float64(currentBlockNumber-prevProgress)/float64(logInterval/time.Second)) + prevProgress = currentBlockNumber + default: + log.Trace("RequestQueueTime (header) ticked") + } + // Cleanup timer + } + if err = s.Update(tx, currentBlockNumber); err != nil { + return err + } + if !useExternalTx { + if err = tx.Commit(); err != nil { + return err + } + } + return nil +} + +func UnwindIssuanceStage(u *UnwindState, cfg IssuanceCfg, tx kv.RwTx, ctx context.Context) (err error) { + useExternalTx := tx != nil + if !useExternalTx { + tx, err = cfg.db.BeginRw(ctx) + if err != nil { + return err + } + defer tx.Rollback() + } + + if err = u.Done(tx); err != nil { + return fmt.Errorf(" reset: %w", err) + } + if !useExternalTx { + if err = tx.Commit(); err != nil { + return fmt.Errorf("failed to write db commit: %w", err) + } + } + return nil +} + +func PruneIssuanceStage(p *PruneState, cfg IssuanceCfg, tx kv.RwTx, ctx context.Context) (err error) { + useExternalTx := tx != nil + if !useExternalTx { + tx, err = cfg.db.BeginRw(ctx) + if err != nil { + return err + } + defer tx.Rollback() + } + + if !useExternalTx { + if err = tx.Commit(); err != nil { + return err + } + } + return nil +} diff --git a/eth/stagedsync/stage_issuance_test.go b/eth/stagedsync/stage_issuance_test.go new file mode 100644 index 00000000000..32254e8025a --- /dev/null +++ b/eth/stagedsync/stage_issuance_test.go @@ -0,0 +1,66 @@ +package stagedsync + +import ( + "context" + "math/big" + "testing" + + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/stretchr/testify/assert" +) + +func TestIssuanceStage(t *testing.T) { + ctx, assert := context.Background(), assert.New(t) + db, tx := memdb.NewTestTx(t) + + header1 := &types.Header{ + BaseFee: big.NewInt(10), + GasUsed: 1000, + Number: big.NewInt(1), + Eip1559: true, + } + + header2 := &types.Header{ + BaseFee: big.NewInt(30), + GasUsed: 1000, + Number: big.NewInt(2), + Eip1559: true, + } + + header3 := &types.Header{ + BaseFee: big.NewInt(100), + GasUsed: 1000, + Number: big.NewInt(3), + Eip1559: true, + } + // Write Headers + rawdb.WriteHeader(tx, header1) + rawdb.WriteHeader(tx, header2) + rawdb.WriteHeader(tx, header3) + + stages.SaveStageProgress(tx, stages.Bodies, 3) + // Canonicals + rawdb.WriteCanonicalHash(tx, header1.Hash(), header1.Number.Uint64()) + rawdb.WriteCanonicalHash(tx, header2.Hash(), header2.Number.Uint64()) + rawdb.WriteCanonicalHash(tx, header3.Hash(), header3.Number.Uint64()) + // Execute stage issuance + err := SpawnStageIssuance(StageIssuanceCfg(db, ¶ms.ChainConfig{ + Consensus: params.EtHashConsensus, + }, snapshotsync.NewBlockReader(), true), &StageState{ + ID: stages.Issuance, + }, tx, ctx) + assert.NoError(err) + + tb, err := rawdb.ReadTotalBurnt(tx, 3) + assert.NoError(err) + assert.Equal(tb, big.NewInt(140000)) + + ti, err := rawdb.ReadTotalIssued(tx, 3) + assert.NoError(err) + assert.Equal(ti, big.NewInt(900000000000000000)) +} diff --git a/eth/stagedsync/stage_log_index.go b/eth/stagedsync/stage_log_index.go index 3b4b9487c6e..3febf9d97a4 100644 --- a/eth/stagedsync/stage_log_index.go +++ b/eth/stagedsync/stage_log_index.go @@ -6,20 +6,20 @@ import ( "encoding/binary" "fmt" "runtime" - "sort" "time" "github.com/RoaringBitmap/roaring" "github.com/c2h5oh/datasize" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/ethdb/bitmapdb" "github.com/ledgerwatch/erigon/ethdb/cbor" "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/log/v3" + "golang.org/x/exp/slices" ) const ( @@ -105,10 +105,10 @@ func promoteLogIndex(logPrefix string, tx kv.RwTx, start uint64, cfg LogIndexCfg checkFlushEvery := time.NewTicker(cfg.flushEvery) defer checkFlushEvery.Stop() - collectorTopics := etl.NewCollector(cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer collectorTopics.Close(logPrefix) - collectorAddrs := etl.NewCollector(cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer collectorAddrs.Close(logPrefix) + collectorTopics := etl.NewCollector(logPrefix, cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collectorTopics.Close() + collectorAddrs := etl.NewCollector(logPrefix, cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collectorAddrs.Close() reader := bytes.NewReader(nil) @@ -117,7 +117,7 @@ func promoteLogIndex(logPrefix string, tx kv.RwTx, start uint64, cfg LogIndexCfg return err } - if err := common.Stopped(quit); err != nil { + if err := libcommon.Stopped(quit); err != nil { return err } blockNum := binary.BigEndian.Uint64(k[:8]) @@ -126,8 +126,8 @@ func promoteLogIndex(logPrefix string, tx kv.RwTx, start uint64, cfg LogIndexCfg default: case <-logEvery.C: var m runtime.MemStats - runtime.ReadMemStats(&m) - log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockNum, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + libcommon.ReadMemStats(&m) + log.Info(fmt.Sprintf("[%s] Progress", logPrefix), "number", blockNum, "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) case <-checkFlushEvery.C: if needFlush(topics, cfg.bufLimit) { if err := flushBitmaps(collectorTopics, topics); err != nil { @@ -212,11 +212,11 @@ func promoteLogIndex(logPrefix string, tx kv.RwTx, start uint64, cfg LogIndexCfg }) } - if err := collectorTopics.Load(logPrefix, tx, kv.LogTopicIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := collectorTopics.Load(tx, kv.LogTopicIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } - if err := collectorAddrs.Load(logPrefix, tx, kv.LogAddressIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { + if err := collectorAddrs.Load(tx, kv.LogAddressIndex, loaderFunc, etl.TransformArgs{Quit: quit}); err != nil { return err } @@ -265,7 +265,7 @@ func unwindLogIndex(logPrefix string, db kv.RwTx, to uint64, cfg LogIndexCfg, qu return err } - if err := common.Stopped(quitCh); err != nil { + if err := libcommon.Stopped(quitCh); err != nil { return err } var logs types.Logs @@ -294,9 +294,9 @@ func unwindLogIndex(logPrefix string, db kv.RwTx, to uint64, cfg LogIndexCfg, qu func needFlush(bitmaps map[string]*roaring.Bitmap, memLimit datasize.ByteSize) bool { sz := uint64(0) for _, m := range bitmaps { - sz += m.GetSizeInBytes() + sz += m.GetSizeInBytes() * 2 // for golang's overhead } - const memoryNeedsForKey = 32 * 2 // each key stored in RAM: as string ang slice of bytes + const memoryNeedsForKey = 32 * 2 * 2 // len(key) * (string and bytes) overhead * go's map overhead return uint64(len(bitmaps)*memoryNeedsForKey)+sz > uint64(memLimit) } @@ -322,7 +322,7 @@ func truncateBitmaps(tx kv.RwTx, bucket string, inMem map[string]struct{}, to ui for k := range inMem { keys = append(keys, k) } - sort.Strings(keys) + slices.Sort(keys) for _, k := range keys { if err := bitmapdb.TruncateRange(tx, bucket, []byte(k), uint32(to+1)); err != nil { return fmt.Errorf("fail TruncateRange: bucket=%s, %w", bucket, err) @@ -339,7 +339,7 @@ func pruneOldLogChunks(tx kv.RwTx, bucket string, inMem map[string]struct{}, pru for k := range inMem { keys = append(keys, k) } - sort.Strings(keys) + slices.Sort(keys) c, err := tx.RwCursor(bucket) if err != nil { return err @@ -357,9 +357,9 @@ func pruneOldLogChunks(tx kv.RwTx, bucket string, inMem map[string]struct{}, pru } select { case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.AccountsHistory, "block", blockNum) + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", kv.AccountsHistory, "block", blockNum) case <-ctx.Done(): - return common.ErrStopped + return libcommon.ErrStopped default: } if err = c.DeleteCurrent(); err != nil { @@ -426,9 +426,9 @@ func pruneLogIndex(logPrefix string, tx kv.RwTx, tmpDir string, pruneTo uint64, } select { case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Mode", logPrefix), "table", kv.Log, "block", blockNum) + log.Info(fmt.Sprintf("[%s]", logPrefix), "table", kv.Log, "block", blockNum) case <-ctx.Done(): - return common.ErrStopped + return libcommon.ErrStopped default: } diff --git a/eth/stagedsync/stage_log_index_test.go b/eth/stagedsync/stage_log_index_test.go index edc63c60fb0..e43732944cd 100644 --- a/eth/stagedsync/stage_log_index_test.go +++ b/eth/stagedsync/stage_log_index_test.go @@ -6,6 +6,7 @@ import ( "testing" "time" + "github.com/ledgerwatch/erigon-lib/common/length" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/ledgerwatch/erigon/common" @@ -93,7 +94,7 @@ func TestLogIndex(t *testing.T) { require, tmpDir, ctx := require.New(t), t.TempDir(), context.Background() _, tx := memdb.NewTestTx(t) - expectAddrs, expectTopics := genReceipts(t, tx, 10000) + expectAddrs, expectTopics := genReceipts(t, tx, 100) cfg := StageLogIndexCfg(nil, prune.DefaultMode, "") cfgCopy := cfg @@ -115,13 +116,13 @@ func TestLogIndex(t *testing.T) { } // Mode test - err = pruneLogIndex("", tx, tmpDir, 500, ctx) + err = pruneLogIndex("", tx, tmpDir, 50, ctx) require.NoError(err) { total := 0 err = tx.ForEach(kv.LogAddressIndex, nil, func(k, v []byte) error { - require.True(binary.BigEndian.Uint32(k[common.AddressLength:]) >= 500) + require.True(binary.BigEndian.Uint32(k[length.Addr:]) >= 50) total++ return nil }) @@ -131,7 +132,7 @@ func TestLogIndex(t *testing.T) { { total := 0 err = tx.ForEach(kv.LogTopicIndex, nil, func(k, v []byte) error { - require.True(binary.BigEndian.Uint32(k[common.HashLength:]) >= 500) + require.True(binary.BigEndian.Uint32(k[length.Hash:]) >= 50) total++ return nil }) @@ -140,7 +141,7 @@ func TestLogIndex(t *testing.T) { } // Unwind test - err = unwindLogIndex("logPrefix", tx, 700, cfg, nil) + err = unwindLogIndex("logPrefix", tx, 70, cfg, nil) require.NoError(err) for addr := range expectAddrs { diff --git a/eth/stagedsync/stage_mining_create_block.go b/eth/stagedsync/stage_mining_create_block.go index 0483807f5fb..db87a2137ac 100644 --- a/eth/stagedsync/stage_mining_create_block.go +++ b/eth/stagedsync/stage_mining_create_block.go @@ -2,18 +2,24 @@ package stagedsync import ( "bytes" + "context" "errors" "fmt" + "io" "math/big" "time" mapset "github.com/deckarep/golang-set" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/txpool" + types2 "github.com/ledgerwatch/erigon-lib/types" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/ethutils" "github.com/ledgerwatch/erigon/params" @@ -23,7 +29,7 @@ import ( type MiningBlock struct { Header *types.Header Uncles []*types.Header - Txs []types.Transaction + Txs types.Transactions Receipts types.Receipts LocalTxs types.TransactionsStream @@ -31,59 +37,53 @@ type MiningBlock struct { } type MiningState struct { - MiningConfig *params.MiningConfig - PendingResultCh chan *types.Block - MiningResultCh chan *types.Block - MiningBlock *MiningBlock + MiningConfig *params.MiningConfig + PendingResultCh chan *types.Block + MiningResultCh chan *types.Block + MiningResultPOSCh chan *types.Block + MiningBlock *MiningBlock } func NewMiningState(cfg *params.MiningConfig) MiningState { return MiningState{ - MiningConfig: cfg, - PendingResultCh: make(chan *types.Block, 1), - MiningResultCh: make(chan *types.Block, 1), - MiningBlock: &MiningBlock{}, + MiningConfig: cfg, + PendingResultCh: make(chan *types.Block, 1), + MiningResultCh: make(chan *types.Block, 1), + MiningResultPOSCh: make(chan *types.Block, 1), + MiningBlock: &MiningBlock{}, } } type MiningCreateBlockCfg struct { - db kv.RwDB - miner MiningState - chainConfig params.ChainConfig - engine consensus.Engine - txPool *core.TxPool - tmpdir string + db kv.RwDB + miner MiningState + chainConfig params.ChainConfig + engine consensus.Engine + txPool2 *txpool.TxPool + txPool2DB kv.RoDB + tmpdir string + blockProposerParameters *core.BlockProposerParametersPOS } -func StageMiningCreateBlockCfg( - db kv.RwDB, - miner MiningState, - chainConfig params.ChainConfig, - engine consensus.Engine, - txPool *core.TxPool, - tmpdir string, -) MiningCreateBlockCfg { +func StageMiningCreateBlockCfg(db kv.RwDB, miner MiningState, chainConfig params.ChainConfig, engine consensus.Engine, txPool2 *txpool.TxPool, txPool2DB kv.RoDB, blockProposerParameters *core.BlockProposerParametersPOS, tmpdir string) MiningCreateBlockCfg { return MiningCreateBlockCfg{ - db: db, - miner: miner, - chainConfig: chainConfig, - engine: engine, - txPool: txPool, - tmpdir: tmpdir, + db: db, + miner: miner, + chainConfig: chainConfig, + engine: engine, + txPool2: txPool2, + txPool2DB: txPool2DB, + tmpdir: tmpdir, + blockProposerParameters: blockProposerParameters, } } // SpawnMiningCreateBlockStage //TODO: // - resubmitAdjustCh - variable is not implemented -func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBlockCfg, quit <-chan struct{}) error { - txPoolLocals := cfg.txPool.Locals() - pendingTxs, err := cfg.txPool.Pending() - if err != nil { - return err - } - +func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBlockCfg, quit <-chan struct{}) (err error) { current := cfg.miner.MiningBlock + txPoolLocals := []common.Address{} //txPoolV2 has no concept of local addresses (yet?) coinbase := cfg.miner.MiningConfig.Etherbase const ( @@ -91,10 +91,6 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc staleThreshold = 7 ) - if cfg.miner.MiningConfig.Etherbase == (common.Address{}) { - return fmt.Errorf("refusing to mine without etherbase") - } - logPrefix := s.LogPrefix() executionAt, err := s.ExecutionAt(tx) if err != nil { @@ -102,12 +98,56 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc } parent := rawdb.ReadHeaderByNumber(tx, executionAt) if parent == nil { // todo: how to return error and don't stop Erigon? - return fmt.Errorf(fmt.Sprintf("[%s] Empty block", logPrefix), "blocknum", executionAt) + return fmt.Errorf("empty block %d", executionAt) + } + + if cfg.blockProposerParameters != nil && cfg.blockProposerParameters.ParentHash != parent.Hash() { + return fmt.Errorf("wrong head block: %x (current) vs %x (requested)", parent.Hash(), cfg.blockProposerParameters.ParentHash) + } + + isTrans, err := rawdb.Transitioned(tx, executionAt, cfg.chainConfig.TerminalTotalDifficulty) + if err != nil { + return err + } + + if cfg.miner.MiningConfig.Etherbase == (common.Address{}) { + if !isTrans { + return fmt.Errorf("refusing to mine without etherbase") + } + // If we do not have an etherbase, let's use the suggested one + coinbase = cfg.blockProposerParameters.SuggestedFeeRecipient } blockNum := executionAt + 1 - signer := types.MakeSigner(&cfg.chainConfig, blockNum) + var txs []types.Transaction + if err = cfg.txPool2DB.View(context.Background(), func(tx kv.Tx) error { + txSlots := types2.TxsRlp{} + if err := cfg.txPool2.Best(200, &txSlots, tx); err != nil { + return err + } + + txs, err = types.DecodeTransactions(txSlots.Txs) + if errors.Is(err, io.EOF) { + return nil + } + + if err != nil { + return fmt.Errorf("decode rlp of pending txs: %w", err) + } + var sender common.Address + for i := range txs { + copy(sender[:], txSlots.Senders.At(i)) + txs[i].SetSender(sender) + } + return nil + }); err != nil { + return err + } + current.RemoteTxs = types.NewTransactionsFixedOrder(txs) + // txpool v2 - doesn't prioritise local txs over remote + current.LocalTxs = types.NewTransactionsFixedOrder(nil) + log.Debug(fmt.Sprintf("[%s] Candidate txs", logPrefix), "amount", len(txs)) localUncles, remoteUncles, err := readNonCanonicalHeaders(tx, blockNum, cfg.engine, coinbase, txPoolLocals) if err != nil { return err @@ -144,25 +184,27 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc } // re-written miner/worker.go:commitNewWork - timestamp := time.Now().Unix() - if parent.Time >= uint64(timestamp) { - timestamp = int64(parent.Time + 1) - } - num := parent.Number - header := &types.Header{ - ParentHash: parent.Hash(), - Number: num.Add(num, common.Big1), - GasLimit: core.CalcGasLimit(parent.GasUsed, parent.GasLimit, cfg.miner.MiningConfig.GasFloor, cfg.miner.MiningConfig.GasCeil), - Extra: cfg.miner.MiningConfig.ExtraData, - Time: uint64(timestamp), + var timestamp uint64 + if !isTrans { + timestamp = uint64(time.Now().Unix()) + if parent.Time >= timestamp { + timestamp = parent.Time + 1 + } + } else { + // If we are on proof-of-stake timestamp should be already set for us + timestamp = cfg.blockProposerParameters.Timestamp } - // Only set the coinbase if our consensus engine is running (avoid spurious block rewards) - //if w.isRunning() { + header := core.MakeEmptyHeader(parent, &cfg.chainConfig, timestamp, &cfg.miner.MiningConfig.GasLimit) header.Coinbase = coinbase - //} + header.Extra = cfg.miner.MiningConfig.ExtraData - if err = cfg.engine.Prepare(chain, header); err != nil { + log.Info(fmt.Sprintf("[%s] Start mine", logPrefix), "block", executionAt+1, "baseFee", header.BaseFee, "gasLimit", header.GasLimit) + + stateReader := state.NewPlainStateReader(tx) + ibs := state.New(stateReader) + + if err = cfg.engine.Prepare(chain, header, ibs); err != nil { log.Error("Failed to prepare header for mining", "err", err, "headerNumber", header.Number.Uint64(), @@ -174,6 +216,14 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc return err } + if isTrans { + header.MixDigest = cfg.blockProposerParameters.PrevRandao + + current.Header = header + current.Uncles = nil + return nil + } + // If we are care about TheDAO hard-fork check whether to override the extra-data or not if daoBlock := cfg.chainConfig.DAOForkBlock; daoBlock != nil { // Check whether the block is among the fork extra-override range @@ -181,7 +231,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc if header.Number.Cmp(daoBlock) >= 0 && header.Number.Cmp(limit) < 0 { // Depending whether we support or oppose the fork, override differently if cfg.chainConfig.DAOForkSupport { - header.Extra = common.CopyBytes(params.DAOForkBlockExtra) + header.Extra = libcommon.Copy(params.DAOForkBlockExtra) } else if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { header.Extra = []byte{} // If miner opposes, don't let it use the reserved extra-data } @@ -209,6 +259,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc }) return uncles } + // when 08 is processed ancestors contain 07 (quick block) for _, ancestor := range GetBlocksFromHash(parent.Hash(), 7) { for _, uncle := range ancestor.Uncles() { @@ -252,7 +303,7 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc if err = commitUncle(env, uncle); err != nil { log.Trace("Possible uncle rejected", "hash", hash, "reason", err) } else { - log.Debug("Committing new uncle to block", "hash", hash) + log.Trace("Committing new uncle to block", "hash", hash) uncles = append(uncles, uncle) } } @@ -260,32 +311,6 @@ func SpawnMiningCreateBlockStage(s *StageState, tx kv.RwTx, cfg MiningCreateBloc current.Header = header current.Uncles = makeUncles(env.uncles) - - // Split the pending transactions into locals and remotes - localTxs, remoteTxs := types.TransactionsGroupedBySender{}, types.TransactionsGroupedBySender{} - for _, txs := range pendingTxs { - if len(txs) == 0 { - continue - } - from, _ := txs[0].Sender(*signer) - isLocal := false - for _, local := range txPoolLocals { - if local == from { - isLocal = true - break - } - } - - if isLocal { - localTxs = append(localTxs, txs) - } else { - remoteTxs = append(remoteTxs, txs) - } - } - - current.LocalTxs = types.NewTransactionsByPriceAndNonce(*signer, localTxs) - current.RemoteTxs = types.NewTransactionsByPriceAndNonce(*signer, remoteTxs) - fmt.Printf("aa: %t, %t,%t\n", current == nil, cfg.miner.MiningBlock == nil, current.Header == nil) return nil } diff --git a/eth/stagedsync/stage_mining_exec.go b/eth/stagedsync/stage_mining_exec.go index 5ba6050bd8a..96e1a4e610c 100644 --- a/eth/stagedsync/stage_mining_exec.go +++ b/eth/stagedsync/stage_mining_exec.go @@ -3,19 +3,24 @@ package stagedsync import ( "fmt" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/consensus/misc" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/state" + "github.com/ledgerwatch/erigon/core/systemcontracts" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" ) type MiningExecCfg struct { @@ -24,6 +29,7 @@ type MiningExecCfg struct { notifier ChainEventNotifier chainConfig params.ChainConfig engine consensus.Engine + blockReader services.FullBlockReader vmConfig *vm.Config tmpdir string } @@ -43,6 +49,7 @@ func StageMiningExecCfg( notifier: notifier, chainConfig: chainConfig, engine: engine, + blockReader: snapshotsync.NewBlockReader(), vmConfig: vmConfig, tmpdir: tmpdir, } @@ -65,6 +72,7 @@ func SpawnMiningExecStage(s *StageState, tx kv.RwTx, cfg MiningExecCfg, quit <-c if cfg.chainConfig.DAOForkSupport && cfg.chainConfig.DAOForkBlock != nil && cfg.chainConfig.DAOForkBlock.Cmp(current.Header.Number) == 0 { misc.ApplyDAOHardFork(ibs) } + systemcontracts.UpgradeBuildInSystemContract(&cfg.chainConfig, current.Header.Number, ibs) // Create an empty block based on temporary copied state for // sealing in advance without waiting block execution finished. @@ -74,14 +82,14 @@ func SpawnMiningExecStage(s *StageState, tx kv.RwTx, cfg MiningExecCfg, quit <-c } getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } - checkTEVM := ethdb.GetCheckTEVM(tx) + contractHasTEVM := ethdb.GetHasTEVM(tx) // Short circuit if there is no available pending transactions. // But if we disable empty precommit already, ignore it. Since // empty block is necessary to keep the liveness of the network. if noempty { if !localTxs.Empty() { - logs, err := addTransactionsToMiningBlock(current, cfg.chainConfig, cfg.vmConfig, getHeader, checkTEVM, cfg.engine, localTxs, cfg.miningState.MiningConfig.Etherbase, ibs, quit) + logs, err := addTransactionsToMiningBlock(logPrefix, current, cfg.chainConfig, cfg.vmConfig, getHeader, contractHasTEVM, cfg.engine, localTxs, cfg.miningState.MiningConfig.Etherbase, ibs, quit) if err != nil { return err } @@ -93,7 +101,7 @@ func SpawnMiningExecStage(s *StageState, tx kv.RwTx, cfg MiningExecCfg, quit <-c //} } if !remoteTxs.Empty() { - logs, err := addTransactionsToMiningBlock(current, cfg.chainConfig, cfg.vmConfig, getHeader, checkTEVM, cfg.engine, remoteTxs, cfg.miningState.MiningConfig.Etherbase, ibs, quit) + logs, err := addTransactionsToMiningBlock(logPrefix, current, cfg.chainConfig, cfg.vmConfig, getHeader, contractHasTEVM, cfg.engine, remoteTxs, cfg.miningState.MiningConfig.Etherbase, ibs, quit) if err != nil { return err } @@ -106,7 +114,19 @@ func SpawnMiningExecStage(s *StageState, tx kv.RwTx, cfg MiningExecCfg, quit <-c } } - if err := core.FinalizeBlockExecution(cfg.engine, stateReader, current.Header, current.Txs, current.Uncles, stateWriter, &cfg.chainConfig, ibs, nil, nil, nil); err != nil { + if current.Uncles == nil { + current.Uncles = []*types.Header{} + } + if current.Txs == nil { + current.Txs = []types.Transaction{} + } + if current.Receipts == nil { + current.Receipts = types.Receipts{} + } + + _, err := core.FinalizeBlockExecution(cfg.engine, stateReader, current.Header, current.Txs, current.Uncles, stateWriter, + &cfg.chainConfig, ibs, current.Receipts, epochReader{tx: tx}, chainReader{config: &cfg.chainConfig, tx: tx, blockReader: cfg.blockReader}, true) + if err != nil { return err } @@ -145,7 +165,7 @@ func SpawnMiningExecStage(s *StageState, tx kv.RwTx, cfg MiningExecCfg, quit <-c return nil } -func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.ChainConfig, vmConfig *vm.Config, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), engine consensus.Engine, txs types.TransactionsStream, coinbase common.Address, ibs *state.IntraBlockState, quit <-chan struct{}) (types.Logs, error) { +func addTransactionsToMiningBlock(logPrefix string, current *MiningBlock, chainConfig params.ChainConfig, vmConfig *vm.Config, getHeader func(hash common.Hash, number uint64) *types.Header, contractHasTEVM func(common.Hash) (bool, error), engine consensus.Engine, txs types.TransactionsStream, coinbase common.Address, ibs *state.IntraBlockState, quit <-chan struct{}) (types.Logs, error) { header := current.Header tcount := 0 gasPool := new(core.GasPool).AddGas(current.Header.GasLimit) @@ -156,7 +176,7 @@ func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.Chain var miningCommitTx = func(txn types.Transaction, coinbase common.Address, vmConfig *vm.Config, chainConfig params.ChainConfig, ibs *state.IntraBlockState, current *MiningBlock) ([]*types.Log, error) { snap := ibs.Snapshot() - receipt, _, err := core.ApplyTransaction(&chainConfig, getHeader, engine, &coinbase, gasPool, ibs, noop, header, txn, &header.GasUsed, *vmConfig, checkTEVM) + receipt, _, err := core.ApplyTransaction(&chainConfig, getHeader, engine, &coinbase, gasPool, ibs, noop, header, txn, &header.GasUsed, *vmConfig, contractHasTEVM) if err != nil { ibs.RevertToSnapshot(snap) return nil, err @@ -173,7 +193,7 @@ func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.Chain } for { - if err := common.Stopped(quit); err != nil { + if err := libcommon.Stopped(quit); err != nil { return nil, err } @@ -199,7 +219,7 @@ func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.Chain //} // If we don't have enough gas for any further transactions then we're done if gasPool.Gas() < params.TxGas { - log.Trace("Not enough gas for further transactions", "have", gasPool, "want", params.TxGas) + log.Debug(fmt.Sprintf("[%s] Not enough gas for further transactions", logPrefix), "have", gasPool, "want", params.TxGas) break } // Retrieve the next transaction and abort if all done @@ -212,10 +232,10 @@ func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.Chain // // We use the eip155 signer regardless of the env hf. from, _ := txn.Sender(*signer) - // Check whether the txn is replay protected. If we're not in the EIP155 hf + // Check whether the txn is replay protected. If we're not in the EIP155 (Spurious Dragon) hf // phase, start ignoring the sender until we do. - if txn.Protected() && !chainConfig.IsEIP155(header.Number.Uint64()) { - log.Trace("Ignoring replay protected transaction", "hash", txn.Hash(), "eip155", chainConfig.EIP155Block) + if txn.Protected() && !chainConfig.IsSpuriousDragon(header.Number.Uint64()) { + log.Debug(fmt.Sprintf("[%s] Ignoring replay protected transaction", logPrefix), "hash", txn.Hash(), "eip155", chainConfig.SpuriousDragonBlock) txs.Pop() continue @@ -228,17 +248,17 @@ func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.Chain switch err { case core.ErrGasLimitReached: // Pop the env out-of-gas transaction without shifting in the next from the account - log.Trace("Gas limit exceeded for env block", "sender", from) + log.Debug(fmt.Sprintf("[%s] Gas limit exceeded for env block", logPrefix), "sender", from) txs.Pop() case core.ErrNonceTooLow: // New head notification data race between the transaction pool and miner, shift - log.Trace("Skipping transaction with low nonce", "sender", from, "nonce", txn.GetNonce()) + log.Debug(fmt.Sprintf("[%s] Skipping transaction with low nonce", logPrefix), "sender", from, "nonce", txn.GetNonce()) txs.Shift() case core.ErrNonceTooHigh: // Reorg notification data race between the transaction pool and miner, skip account = - log.Trace("Skipping account with hight nonce", "sender", from, "nonce", txn.GetNonce()) + log.Debug(fmt.Sprintf("[%s] Skipping account with hight nonce", logPrefix), "sender", from, "nonce", txn.GetNonce()) txs.Pop() case nil: @@ -250,7 +270,7 @@ func addTransactionsToMiningBlock(current *MiningBlock, chainConfig params.Chain default: // Strange error, discard the transaction and get the next in line (note, the // nonce-too-high clause will prevent us from executing in vain). - log.Debug("Transaction failed, account skipped", "hash", txn.Hash(), "err", err) + log.Debug(fmt.Sprintf("[%s] Transaction failed, account skipped", logPrefix), "hash", txn.Hash(), "err", err) txs.Shift() } } diff --git a/eth/stagedsync/stage_mining_finish.go b/eth/stagedsync/stage_mining_finish.go index a7b67c711d5..eab6752c864 100644 --- a/eth/stagedsync/stage_mining_finish.go +++ b/eth/stagedsync/stage_mining_finish.go @@ -5,6 +5,7 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/consensus" + "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/log/v3" @@ -54,21 +55,33 @@ func SpawnMiningFinishStage(s *StageState, tx kv.RwTx, cfg MiningFinishCfg, quit //} //prev = sealHash + // If we are on POS, we will send the result on the POS channel + isTrans, err := rawdb.Transitioned(tx, block.Header().Number.Uint64(), cfg.chainConfig.TerminalTotalDifficulty) + if err != nil { + return err + } + + if isTrans { + cfg.miningState.MiningResultPOSCh <- block + return nil + } // Tests may set pre-calculated nonce - if block.Header().Nonce.Uint64() != 0 { + if block.NonceU64() != 0 { cfg.miningState.MiningResultCh <- block return nil } cfg.miningState.PendingResultCh <- block - log.Info(fmt.Sprintf("[%s] block ready for seal", logPrefix), - "number", block.NumberU64(), - "transactions", block.Transactions().Len(), - "gas_used", block.GasUsed(), - "gas_limit", block.GasLimit(), - "difficulty", block.Difficulty(), - ) + if block.Transactions().Len() > 0 { + log.Info(fmt.Sprintf("[%s] block ready for seal", logPrefix), + "blocn_num", block.NumberU64(), + "transactions", block.Transactions().Len(), + "gas_used", block.GasUsed(), + "gas_limit", block.GasLimit(), + "difficulty", block.Difficulty(), + ) + } chain := ChainReader{Cfg: cfg.chainConfig, Db: tx} if err := cfg.engine.Seal(chain, block, cfg.miningState.MiningResultCh, cfg.sealCancel); err != nil { diff --git a/eth/stagedsync/stage_postexec.go b/eth/stagedsync/stage_postexec.go new file mode 100644 index 00000000000..5a119e56de6 --- /dev/null +++ b/eth/stagedsync/stage_postexec.go @@ -0,0 +1,84 @@ +package stagedsync + +import ( + "context" + "fmt" + + "github.com/ledgerwatch/erigon-lib/kv" +) + +// PostExec stage is run after execution stage to peform extra verifications that are only possible when state is available. +// It is used for consensus engines which keep validators inside smart contracts (Bor, AuRa) + +type PostExecCfg struct { + db kv.RwDB + borDb kv.RwDB +} + +func StagePostExecCfg(db kv.RwDB, borDb kv.RwDB) PostExecCfg { + return PostExecCfg{ + db: db, + borDb: borDb, + } +} + +func SpawnPostExecStage(s *StageState, tx kv.RwTx, cfg PostExecCfg, ctx context.Context) error { + useExternalTx := tx != nil + if !useExternalTx { + var err error + tx, err = cfg.db.BeginRw(context.Background()) + if err != nil { + return err + } + defer tx.Rollback() + } + + //logPrefix := s.LogPrefix() + to, err := s.ExecutionAt(tx) + if err != nil { + return err + } + + if s.BlockNumber == to { + // we already did hash check for this block + // we don't do the obvious `if s.BlockNumber > to` to support reorgs more naturally + return nil + } + if s.BlockNumber > to { + return fmt.Errorf("hashstate: promotion backwards from %d to %d", s.BlockNumber, to) + } + + if err = s.Update(tx, to); err != nil { + return err + } + + if !useExternalTx { + if err := tx.Commit(); err != nil { + return err + } + } + return nil +} + +func UnwindPostExecStage(u *UnwindState, s *StageState, tx kv.RwTx, cfg PostExecCfg, ctx context.Context) (err error) { + useExternalTx := tx != nil + if !useExternalTx { + tx, err = cfg.db.BeginRw(ctx) + if err != nil { + return err + } + defer tx.Rollback() + } + + //logPrefix := u.LogPrefix() + + if err = u.Done(tx); err != nil { + return err + } + if !useExternalTx { + if err = tx.Commit(); err != nil { + return err + } + } + return nil +} diff --git a/eth/stagedsync/stage_senders.go b/eth/stagedsync/stage_senders.go index b75cb171d4f..3ea0f86afb8 100644 --- a/eth/stagedsync/stage_senders.go +++ b/eth/stagedsync/stage_senders.go @@ -9,44 +9,56 @@ import ( "sync" "time" + "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/common/length" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snapshothashes" "github.com/ledgerwatch/log/v3" "github.com/ledgerwatch/secp256k1" ) type SendersCfg struct { - db kv.RwDB - batchSize int - blockSize int - bufferSize int - numOfGoroutines int - readChLen int - tmpdir string - - chainConfig *params.ChainConfig + db kv.RwDB + batchSize int + blockSize int + bufferSize int + numOfGoroutines int + readChLen int + tmpdir string + prune prune.Mode + chainConfig *params.ChainConfig + blockRetire *snapshotsync.BlockRetire + snapshotHashesCfg *snapshothashes.Config } -func StageSendersCfg(db kv.RwDB, chainCfg *params.ChainConfig, tmpdir string) SendersCfg { +func StageSendersCfg(db kv.RwDB, chainCfg *params.ChainConfig, tmpdir string, prune prune.Mode, br *snapshotsync.BlockRetire) SendersCfg { const sendersBatchSize = 10000 const sendersBlockSize = 4096 return SendersCfg{ - db: db, - batchSize: sendersBatchSize, - blockSize: sendersBlockSize, - bufferSize: (sendersBlockSize * 10 / 20) * 10000, // 20*4096 - numOfGoroutines: secp256k1.NumOfContexts(), // we can only be as parallels as our crypto library supports, - readChLen: 4, - tmpdir: tmpdir, - chainConfig: chainCfg, + db: db, + batchSize: sendersBatchSize, + blockSize: sendersBlockSize, + bufferSize: (sendersBlockSize * 10 / 20) * 10000, // 20*4096 + numOfGoroutines: secp256k1.NumOfContexts(), // we can only be as parallels as our crypto library supports, + readChLen: 4, + tmpdir: tmpdir, + chainConfig: chainCfg, + prune: prune, + blockRetire: br, + snapshotHashesCfg: snapshothashes.KnownConfig(chainCfg.ChainName), } } @@ -69,7 +81,7 @@ func SpawnRecoverSendersStage(cfg SendersCfg, s *StageState, u Unwinder, tx kv.R var to = prevStageProgress if toBlock > 0 { - to = min(prevStageProgress, toBlock) + to = cmp.Min(prevStageProgress, toBlock) } if to <= s.BlockNumber { return nil @@ -91,11 +103,16 @@ func SpawnRecoverSendersStage(cfg SendersCfg, s *StageState, u Unwinder, tx kv.R } defer canonicalC.Close() - for k, v, err := canonicalC.Seek(dbutils.EncodeBlockNumber(s.BlockNumber + 1)); k != nil; k, v, err = canonicalC.Next() { + startFrom := s.BlockNumber + 1 + if cfg.blockRetire != nil && cfg.blockRetire.Snapshots() != nil && startFrom < cfg.blockRetire.Snapshots().BlocksAvailable() { + startFrom = cfg.blockRetire.Snapshots().BlocksAvailable() + } + + for k, v, err := canonicalC.Seek(dbutils.EncodeBlockNumber(startFrom)); k != nil; k, v, err = canonicalC.Next() { if err != nil { return err } - if err := common.Stopped(quitCh); err != nil { + if err := libcommon.Stopped(quitCh); err != nil { return err } @@ -109,10 +126,10 @@ func SpawnRecoverSendersStage(cfg SendersCfg, s *StageState, u Unwinder, tx kv.R select { default: case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Preload headedrs", logPrefix), "block_number", binary.BigEndian.Uint64(k)) + log.Info(fmt.Sprintf("[%s] Preload headers", logPrefix), "block_number", binary.BigEndian.Uint64(k)) } } - log.Debug(fmt.Sprintf("[%s] Read canonical hashes", logPrefix), "amount", len(canonical)) + log.Trace(fmt.Sprintf("[%s] Read canonical hashes", logPrefix), "amount", len(canonical)) jobs := make(chan *senderRecoveryJob, cfg.batchSize) out := make(chan *senderRecoveryJob, cfg.batchSize) @@ -129,8 +146,8 @@ func SpawnRecoverSendersStage(cfg SendersCfg, s *StageState, u Unwinder, tx kv.R }(i) } - collectorSenders := etl.NewCollector(cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer collectorSenders.Close(logPrefix) + collectorSenders := etl.NewCollector(logPrefix, cfg.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collectorSenders.Close() errCh := make(chan senderRecoveryError) go func() { @@ -144,7 +161,11 @@ func SpawnRecoverSendersStage(cfg SendersCfg, s *StageState, u Unwinder, tx kv.R case <-quitCh: return case <-logEvery.C: - log.Info(fmt.Sprintf("[%s] Recovery", logPrefix), "block_number", s.BlockNumber+uint64(j.index)) + n := s.BlockNumber + if j != nil { + n += uint64(j.index) + } + log.Info(fmt.Sprintf("[%s] Recovery", logPrefix), "block_number", n) case j, ok = <-out: if !ok { return @@ -192,7 +213,7 @@ Loop: if err != nil { return err } - if err := common.Stopped(quitCh); err != nil { + if err := libcommon.Stopped(quitCh); err != nil { return err } @@ -206,7 +227,7 @@ Loop: // non-canonical case continue } - body := rawdb.ReadBody(tx, blockHash, blockNumber) + body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blockNumber) select { case recoveryErr := <-errCh: @@ -238,16 +259,12 @@ Loop: u.UnwindTo(minBlockNum-1, minBlockHash) } } else { - if err := collectorSenders.Load(logPrefix, tx, - kv.Senders, - etl.IdentityLoadFunc, - etl.TransformArgs{ - Quit: quitCh, - LogDetailsLoad: func(k, v []byte) (additionalLogArguments []interface{}) { - return []interface{}{"block", binary.BigEndian.Uint64(k)} - }, + if err := collectorSenders.Load(tx, kv.Senders, etl.IdentityLoadFunc, etl.TransformArgs{ + Quit: quitCh, + LogDetailsLoad: func(k, v []byte) (additionalLogArguments []interface{}) { + return []interface{}{"block", binary.BigEndian.Uint64(k)} }, - ); err != nil { + }); err != nil { return err } if err = s.Update(tx, to); err != nil { @@ -299,25 +316,25 @@ func recoverSenders(ctx context.Context, logPrefix string, cryptoContext *secp25 body := job.body signer := types.MakeSigner(config, job.blockNumber) - job.senders = make([]byte, len(body.Transactions)*common.AddressLength) + job.senders = make([]byte, len(body.Transactions)*length.Addr) for i, tx := range body.Transactions { from, err := signer.SenderWithContext(cryptoContext, tx) if err != nil { job.err = fmt.Errorf("%s: error recovering sender for tx=%x, %w", logPrefix, tx.Hash(), err) break } - copy(job.senders[i*common.AddressLength:], from[:]) + copy(job.senders[i*length.Addr:], from[:]) } // prevent sending to close channel - if err := common.Stopped(quit); err != nil { + if err := libcommon.Stopped(quit); err != nil { job.err = err - } else if err = common.Stopped(ctx.Done()); err != nil { + } else if err = libcommon.Stopped(ctx.Done()); err != nil { job.err = err } out <- job - if errors.Is(job.err, common.ErrStopped) { + if errors.Is(job.err, libcommon.ErrStopped) { return } } @@ -345,6 +362,9 @@ func UnwindSendersStage(s *UnwindState, tx kv.RwTx, cfg SendersCfg, ctx context. } func PruneSendersStage(s *PruneState, tx kv.RwTx, cfg SendersCfg, ctx context.Context) (err error) { + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + to := cfg.prune.TxIndex.PruneTo(s.ForwardProgress) useExternalTx := tx != nil if !useExternalTx { tx, err = cfg.db.BeginRw(ctx) @@ -354,6 +374,29 @@ func PruneSendersStage(s *PruneState, tx kv.RwTx, cfg SendersCfg, ctx context.Co defer tx.Rollback() } + // With snapsync - can prune old data only after snapshot for this data created: CanDeleteTo() + if cfg.blockRetire.Snapshots() != nil && cfg.blockRetire.Snapshots().Cfg().Enabled { + if cfg.blockRetire.Snapshots().Cfg().Produce { + if !cfg.blockRetire.Snapshots().Cfg().KeepBlocks { + canDeleteTo := snapshotsync.CanDeleteTo(s.ForwardProgress, cfg.blockRetire.Snapshots()) + if _, _, err := rawdb.DeleteAncientBlocks(tx, canDeleteTo, 100); err != nil { + return nil + } + if err = PruneTable(tx, kv.Senders, canDeleteTo, ctx, 100); err != nil { + return err + } + } + + if err := retireBlocksInSingleBackgroundThread(s, cfg, ctx); err != nil { + return fmt.Errorf("retireBlocksInSingleBackgroundThread: %w", err) + } + } + } else if cfg.prune.TxIndex.Enabled() { + if err = PruneTable(tx, kv.Senders, to, ctx, 1_000); err != nil { + return err + } + } + if !useExternalTx { if err = tx.Commit(); err != nil { return err @@ -361,3 +404,20 @@ func PruneSendersStage(s *PruneState, tx kv.RwTx, cfg SendersCfg, ctx context.Co } return nil } + +func retireBlocksInSingleBackgroundThread(s *PruneState, cfg SendersCfg, ctx context.Context) (err error) { + // if something already happens in background - noop + if cfg.blockRetire.Working() { + return nil + } + if res := cfg.blockRetire.Result(); res != nil { + if res.Err != nil { + return fmt.Errorf("[%s] retire blocks last error: %w, fromBlock=%d, toBlock=%d", s.LogPrefix(), res.Err, res.BlockFrom, res.BlockTo) + } + } + + chainID, _ := uint256.FromBig(cfg.chainConfig.ChainID) + cfg.blockRetire.RetireBlocksInBackground(ctx, s.ForwardProgress, *chainID, log.LvlInfo) + + return nil +} diff --git a/eth/stagedsync/stage_senders_test.go b/eth/stagedsync/stage_senders_test.go index 7dde79ebc9d..c6384bc871d 100644 --- a/eth/stagedsync/stage_senders_test.go +++ b/eth/stagedsync/stage_senders_test.go @@ -11,7 +11,9 @@ import ( "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -107,18 +109,18 @@ func TestSenders(t *testing.T) { require.NoError(stages.SaveStageProgress(tx, stages.Bodies, 3)) - cfg := StageSendersCfg(db, params.TestChainConfig, "") + cfg := StageSendersCfg(db, params.TestChainConfig, "", prune.Mode{}, snapshotsync.NewBlockRetire(1, "", nil, db, nil, nil)) err := SpawnRecoverSendersStage(cfg, &StageState{ID: stages.Senders}, nil, tx, 3, ctx) assert.NoError(t, err) { - found := rawdb.ReadBody(tx, common.HexToHash("01"), 1) + found := rawdb.ReadCanonicalBodyWithTransactions(tx, common.HexToHash("01"), 1) assert.NotNil(t, found) assert.Equal(t, 2, len(found.Transactions)) - found = rawdb.ReadBody(tx, common.HexToHash("02"), 2) + found = rawdb.ReadCanonicalBodyWithTransactions(tx, common.HexToHash("02"), 2) assert.NotNil(t, found) assert.NotNil(t, 3, len(found.Transactions)) - found = rawdb.ReadBody(tx, common.HexToHash("03"), 3) + found = rawdb.ReadCanonicalBodyWithTransactions(tx, common.HexToHash("03"), 3) assert.NotNil(t, found) assert.NotNil(t, 0, len(found.Transactions)) assert.NotNil(t, 2, len(found.Uncles)) @@ -136,15 +138,14 @@ func TestSenders(t *testing.T) { assert.Equal(t, 0, len(senders)) } { - txs, err := rawdb.ReadTransactions(tx, 0, 2) + txs, err := rawdb.CanonicalTransactions(tx, 1, 2) assert.NoError(t, err) assert.Equal(t, 2, len(txs)) - txs, err = rawdb.ReadTransactions(tx, 2, 3) + txs, err = rawdb.CanonicalTransactions(tx, 5, 3) assert.NoError(t, err) assert.Equal(t, 3, len(txs)) - txs, err = rawdb.ReadTransactions(tx, 0, 1024) + txs, err = rawdb.CanonicalTransactions(tx, 5, 1024) assert.NoError(t, err) - assert.Equal(t, 5, len(txs)) + assert.Equal(t, 3, len(txs)) } - } diff --git a/eth/stagedsync/stage_state_snapshot.go b/eth/stagedsync/stage_state_snapshot.go deleted file mode 100644 index b308775b0c8..00000000000 --- a/eth/stagedsync/stage_state_snapshot.go +++ /dev/null @@ -1,87 +0,0 @@ -package stagedsync - -import ( - "context" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/eth/ethconfig" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" -) - -type SnapshotStateCfg struct { - db kv.RwDB - snapshotDir string - tmpDir string - client *snapshotsync.Client - snapshotMigrator *snapshotsync.SnapshotMigrator -} - -func StageSnapshotStateCfg(db kv.RwDB, snapshot ethconfig.Snapshot, tmpDir string, client *snapshotsync.Client, snapshotMigrator *snapshotsync.SnapshotMigrator) SnapshotStateCfg { - return SnapshotStateCfg{ - db: db, - snapshotDir: snapshot.Dir, - client: client, - snapshotMigrator: snapshotMigrator, - tmpDir: tmpDir, - } -} - -func SpawnStateSnapshotGenerationStage(s *StageState, tx kv.RwTx, cfg SnapshotStateCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if err = s.Update(tx, 0); err != nil { - return err - } - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} - -func UnwindStateSnapshotGenerationStage(s *UnwindState, tx kv.RwTx, cfg SnapshotStateCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if err = s.Done(tx); err != nil { - return err - } - if !useExternalTx { - if err = tx.Commit(); err != nil { - return err - } - } - return nil -} - -func PruneStateSnapshotGenerationStage(s *PruneState, tx kv.RwTx, cfg SnapshotStateCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if !useExternalTx { - if err = tx.Commit(); err != nil { - return err - } - } - return nil -} diff --git a/eth/stagedsync/stage_tevm.go b/eth/stagedsync/stage_tevm.go index 1e337e23ae6..5e981366bc8 100644 --- a/eth/stagedsync/stage_tevm.go +++ b/eth/stagedsync/stage_tevm.go @@ -8,6 +8,8 @@ import ( "time" "github.com/c2h5oh/datasize" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" @@ -57,7 +59,7 @@ func SpawnTranspileStage(s *StageState, tx kv.RwTx, toBlock uint64, cfg Transpil var to = prevStageProgress if toBlock > 0 { - to = min(prevStageProgress, toBlock) + to = cmp.Min(prevStageProgress, toBlock) } if to <= s.BlockNumber { @@ -141,7 +143,7 @@ func transpileBatch(logPrefix string, stageProgress, toBlock uint64, cfg Transpi select { case <-quitCh: - return 0, common.ErrStopped + return 0, libcommon.ErrStopped case <-logEvery.C: prevContract, logTime = logTEVMProgress(logPrefix, prevContract, logTime, stageProgress) tx.CollectMetrics() @@ -254,12 +256,12 @@ func logTEVMProgress(logPrefix string, prevContract uint64, prevTime time.Time, interval := currentTime.Sub(prevTime) speed := float64(currentContract-prevContract) / float64(interval/time.Second) var m runtime.MemStats - runtime.ReadMemStats(&m) + libcommon.ReadMemStats(&m) var logpairs = []interface{}{ "number", currentContract, "contracts/s", speed, } - logpairs = append(logpairs, "alloc", common.StorageSize(m.Alloc), "sys", common.StorageSize(m.Sys)) + logpairs = append(logpairs, "alloc", libcommon.ByteCount(m.Alloc), "sys", libcommon.ByteCount(m.Sys)) log.Info(fmt.Sprintf("[%s] Translated contracts", logPrefix), logpairs...) return currentContract, currentTime diff --git a/eth/stagedsync/stage_txlookup.go b/eth/stagedsync/stage_txlookup.go index 5070654c2c7..73ed1a1795b 100644 --- a/eth/stagedsync/stage_txlookup.go +++ b/eth/stagedsync/stage_txlookup.go @@ -1,41 +1,48 @@ package stagedsync import ( - "bytes" "context" "encoding/binary" "fmt" "math/big" + libcommon "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/ethdb/prune" - "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/log/v3" ) type TxLookupCfg struct { - db kv.RwDB - prune prune.Mode - tmpdir string + db kv.RwDB + prune prune.Mode + tmpdir string + snapshots *snapshotsync.RoSnapshots + isBor bool } func StageTxLookupCfg( db kv.RwDB, prune prune.Mode, tmpdir string, + snapshots *snapshotsync.RoSnapshots, + isBor bool, ) TxLookupCfg { return TxLookupCfg{ - db: db, - prune: prune, - tmpdir: tmpdir, + db: db, + prune: prune, + tmpdir: tmpdir, + snapshots: snapshots, + isBor: isBor, } } -func SpawnTxLookup(s *StageState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Context) (err error) { +func SpawnTxLookup(s *StageState, tx kv.RwTx, toBlock uint64, cfg TxLookupCfg, ctx context.Context) (err error) { quitCh := ctx.Done() useExternalTx := tx != nil if !useExternalTx { @@ -50,17 +57,35 @@ func SpawnTxLookup(s *StageState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Conte if err != nil { return err } + if toBlock > 0 { + endBlock = libcommon.Min(endBlock, toBlock) + } startBlock := s.BlockNumber - pruneTo := cfg.prune.TxIndex.PruneTo(endBlock) - if startBlock < pruneTo { - startBlock = pruneTo + if cfg.prune.TxIndex.Enabled() { + pruneTo := cfg.prune.TxIndex.PruneTo(endBlock) + if startBlock < pruneTo { + startBlock = pruneTo + if err = s.UpdatePrune(tx, pruneTo); err != nil { // prune func of this stage will use this value to prevent all ancient blocks traversal + return err + } + } } + if cfg.snapshots != nil && cfg.snapshots.Cfg().Enabled { + if cfg.snapshots.BlocksAvailable() > startBlock { + // Snapshot .idx files already have TxLookup index - then no reason iterate over them here + startBlock = cfg.snapshots.BlocksAvailable() + if err = s.UpdatePrune(tx, startBlock); err != nil { // prune func of this stage will use this value to prevent all ancient blocks traversal + return err + } + } + } + if startBlock > 0 { startBlock++ } - startKey := dbutils.EncodeBlockNumber(startBlock) - if err = TxLookupTransform(logPrefix, tx, startKey, dbutils.EncodeBlockNumber(endBlock), quitCh, cfg); err != nil { + // etl.Transform uses ExtractEndKey as exclusive bound, therefore endBlock + 1 + if err = txnLookupTransform(logPrefix, tx, startBlock, endBlock+1, quitCh, cfg); err != nil { return err } if err = s.Update(tx, endBlock); err != nil { @@ -75,26 +100,35 @@ func SpawnTxLookup(s *StageState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Conte return nil } -func TxLookupTransform(logPrefix string, tx kv.RwTx, startKey, endKey []byte, quitCh <-chan struct{}, cfg TxLookupCfg) error { +// txnLookupTransform - [startKey, endKey) +func txnLookupTransform(logPrefix string, tx kv.RwTx, blockFrom, blockTo uint64, quitCh <-chan struct{}, cfg TxLookupCfg) error { bigNum := new(big.Int) - return etl.Transform(logPrefix, tx, kv.HeaderCanonical, kv.TxLookup, cfg.tmpdir, func(k []byte, v []byte, next etl.ExtractNextFunc) error { - blocknum := binary.BigEndian.Uint64(k) - blockHash := common.BytesToHash(v) - body := rawdb.ReadBody(tx, blockHash, blocknum) + return etl.Transform(logPrefix, tx, kv.HeaderCanonical, kv.TxLookup, cfg.tmpdir, func(k, v []byte, next etl.ExtractNextFunc) error { + blocknum, blockHash := binary.BigEndian.Uint64(k), common.CastToHash(v) + body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blocknum) if body == nil { - return fmt.Errorf("empty block body %d, hash %x", blocknum, v) + return fmt.Errorf("transform: empty block body %d, hash %x", blocknum, v) } + blockNumBytes := bigNum.SetUint64(blocknum).Bytes() for _, txn := range body.Transactions { - if err := next(k, txn.Hash().Bytes(), bigNum.SetUint64(blocknum).Bytes()); err != nil { + if err := next(k, txn.Hash().Bytes(), blockNumBytes); err != nil { + return err + } + } + + if cfg.isBor { + borPrefix := []byte("matic-bor-receipt-") + if err := next(k, crypto.Keccak256(append(append(borPrefix, k...), v...)), blockNumBytes); err != nil { return err } } + return nil }, etl.IdentityLoadFunc, etl.TransformArgs{ Quit: quitCh, - ExtractStartKey: startKey, - ExtractEndKey: endKey, + ExtractStartKey: dbutils.EncodeBlockNumber(blockFrom), + ExtractEndKey: dbutils.EncodeBlockNumber(blockTo), LogDetailsExtract: func(k, v []byte) (additionalLogArguments []interface{}) { return []interface{}{"block", binary.BigEndian.Uint64(k)} }, @@ -102,7 +136,6 @@ func TxLookupTransform(logPrefix string, tx kv.RwTx, startKey, endKey []byte, qu } func UnwindTxLookup(u *UnwindState, s *StageState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Context) (err error) { - quitCh := ctx.Done() if s.BlockNumber <= u.UnwindPoint { return nil } @@ -115,8 +148,16 @@ func UnwindTxLookup(u *UnwindState, s *StageState, tx kv.RwTx, cfg TxLookupCfg, defer tx.Rollback() } - if err := unwindTxLookup(u, s, tx, cfg, quitCh); err != nil { - return err + // end key needs to be s.BlockNumber + 1 and not s.BlockNumber, because + // the keys in BlockBody table always have hash after the block number + blockFrom, blockTo := u.UnwindPoint+1, s.BlockNumber+1 + if cfg.snapshots != nil && cfg.snapshots.Cfg().Enabled { + smallestInDB := cfg.snapshots.BlocksAvailable() + blockFrom, blockTo = libcommon.Max(blockFrom, smallestInDB), libcommon.Max(blockTo, smallestInDB) + } + // etl.Transform uses ExtractEndKey as exclusive bound, therefore blockTo + 1 + if err := deleteTxLookupRange(tx, s.LogPrefix(), blockFrom, blockTo+1, ctx, cfg); err != nil { + return fmt.Errorf("unwind: %w", err) } if err := u.Done(tx); err != nil { return err @@ -129,40 +170,7 @@ func UnwindTxLookup(u *UnwindState, s *StageState, tx kv.RwTx, cfg TxLookupCfg, return nil } -func unwindTxLookup(u *UnwindState, s *StageState, tx kv.RwTx, cfg TxLookupCfg, quitCh <-chan struct{}) error { - reader := bytes.NewReader(nil) - logPrefix := s.LogPrefix() - return etl.Transform(logPrefix, tx, kv.BlockBody, kv.TxLookup, cfg.tmpdir, func(k, v []byte, next etl.ExtractNextFunc) error { - body := new(types.BodyForStorage) - reader.Reset(v) - if err := rlp.Decode(reader, body); err != nil { - return fmt.Errorf("rlp decode err: %w", err) - } - - txs, err := rawdb.ReadTransactions(tx, body.BaseTxId, body.TxAmount) - if err != nil { - return err - } - for _, txn := range txs { - if err = next(k, txn.Hash().Bytes(), nil); err != nil { - return err - } - } - return nil - }, etl.IdentityLoadFunc, etl.TransformArgs{ - Quit: quitCh, - ExtractStartKey: dbutils.EncodeBlockNumber(u.UnwindPoint + 1), - ExtractEndKey: dbutils.EncodeBlockNumber(s.BlockNumber), - LogDetailsExtract: func(k, v []byte) (additionalLogArguments []interface{}) { - return []interface{}{"block", binary.BigEndian.Uint64(k)} - }, - }) -} - func PruneTxLookup(s *PruneState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Context) (err error) { - if !cfg.prune.TxIndex.Enabled() { - return nil - } logPrefix := s.LogPrefix() useExternalTx := tx != nil if !useExternalTx { @@ -172,18 +180,22 @@ func PruneTxLookup(s *PruneState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Conte } defer tx.Rollback() } + blockFrom, blockTo := s.PruneProgress, uint64(0) - to := cfg.prune.TxIndex.PruneTo(s.ForwardProgress) // Forward stage doesn't write anything before PruneTo point - // TODO: maybe need do binary search of values in db in this case - if s.PruneProgress != 0 { - if err = pruneTxLookup(tx, logPrefix, cfg.tmpdir, s, to, ctx); err != nil { + if cfg.prune.TxIndex.Enabled() { + blockTo = cfg.prune.TxIndex.PruneTo(s.ForwardProgress) + } else if cfg.snapshots != nil && cfg.snapshots.Cfg().Enabled { + blockTo = snapshotsync.CanDeleteTo(s.ForwardProgress, cfg.snapshots) + } + if blockFrom < blockTo { + if err = deleteTxLookupRange(tx, logPrefix, blockFrom, blockTo, ctx, cfg); err != nil { + return fmt.Errorf("prune: %w", err) + } + if err = s.DoneAt(tx, blockTo); err != nil { return err } } - if err = s.Done(tx); err != nil { - return err - } if !useExternalTx { if err = tx.Commit(); err != nil { @@ -193,29 +205,36 @@ func PruneTxLookup(s *PruneState, tx kv.RwTx, cfg TxLookupCfg, ctx context.Conte return nil } -func pruneTxLookup(tx kv.RwTx, logPrefix, tmpDir string, s *PruneState, pruneTo uint64, ctx context.Context) error { - reader := bytes.NewReader(nil) - return etl.Transform(logPrefix, tx, kv.BlockBody, kv.TxLookup, tmpDir, func(k, v []byte, next etl.ExtractNextFunc) error { - body := new(types.BodyForStorage) - reader.Reset(v) - if err := rlp.Decode(reader, body); err != nil { - return fmt.Errorf("rlp decode: %w", err) +// deleteTxLookupRange - [blockFrom, blockTo) +func deleteTxLookupRange(tx kv.RwTx, logPrefix string, blockFrom, blockTo uint64, ctx context.Context, cfg TxLookupCfg) error { + return etl.Transform(logPrefix, tx, kv.HeaderCanonical, kv.TxLookup, cfg.tmpdir, func(k, v []byte, next etl.ExtractNextFunc) error { + blocknum, blockHash := binary.BigEndian.Uint64(k), common.CastToHash(v) + body := rawdb.ReadCanonicalBodyWithTransactions(tx, blockHash, blocknum) + if body == nil { + if cfg.snapshots != nil && cfg.snapshots.Cfg().Enabled && blocknum <= cfg.snapshots.BlocksAvailable() { + log.Warn("TxLookup pruning, empty block body", "height", blocknum) + return nil + } + return fmt.Errorf("empty block body %d, hash %x", blocknum, v) } - txs, err := rawdb.ReadTransactions(tx, body.BaseTxId, body.TxAmount) - if err != nil { - return err - } - for _, txn := range txs { + for _, txn := range body.Transactions { if err := next(k, txn.Hash().Bytes(), nil); err != nil { return err } } + if cfg.isBor { + borPrefix := []byte("matic-bor-receipt-") + if err := next(k, crypto.Keccak256(append(append(borPrefix, k...), v...)), nil); err != nil { + return err + } + } + return nil }, etl.IdentityLoadFunc, etl.TransformArgs{ Quit: ctx.Done(), - ExtractStartKey: dbutils.EncodeBlockNumber(s.ForwardProgress), - ExtractEndKey: dbutils.EncodeBlockNumber(pruneTo), + ExtractStartKey: dbutils.EncodeBlockNumber(blockFrom), + ExtractEndKey: dbutils.EncodeBlockNumber(blockTo), LogDetailsExtract: func(k, v []byte) (additionalLogArguments []interface{}) { return []interface{}{"block", binary.BigEndian.Uint64(k)} }, diff --git a/eth/stagedsync/stage_txpool.go b/eth/stagedsync/stage_txpool.go deleted file mode 100644 index e9ac5d7eec1..00000000000 --- a/eth/stagedsync/stage_txpool.go +++ /dev/null @@ -1,297 +0,0 @@ -package stagedsync - -import ( - "context" - "encoding/binary" - "fmt" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/log/v3" -) - -type TxPoolCfg struct { - db kv.RwDB - pool *core.TxPool - startFunc func() -} - -func StageTxPoolCfg(db kv.RwDB, pool *core.TxPool, startFunc func()) TxPoolCfg { - return TxPoolCfg{ - db: db, - pool: pool, - startFunc: startFunc, - } -} - -func SpawnTxPool(s *StageState, tx kv.RwTx, cfg TxPoolCfg, ctx context.Context) error { - quitCh := ctx.Done() - useExternalTx := tx != nil - if !useExternalTx { - var err error - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - to, err := s.ExecutionAt(tx) - if err != nil { - return err - } - if to == s.BlockNumber { - return nil - } - - logPrefix := s.LogPrefix() - if to < s.BlockNumber { - return fmt.Errorf("to (%d) < from (%d)", to, s.BlockNumber) - } - if cfg.pool != nil && !cfg.pool.IsStarted() { - log.Info(fmt.Sprintf("[%s] Starting tx pool after sync", logPrefix), "from", s.BlockNumber, "to", to) - headHash, err := rawdb.ReadCanonicalHash(tx, to) - if err != nil { - return err - } - headHeader := rawdb.ReadHeader(tx, headHash, to) - if err := cfg.pool.Start(headHeader.GasLimit, to); err != nil { - return fmt.Errorf(" start pool phase 1: %w", err) - } - if cfg.startFunc != nil { - cfg.startFunc() - } - } - if cfg.pool != nil && cfg.pool.IsStarted() && s.BlockNumber > 0 { - if err := incrementalTxPoolUpdate(logPrefix, s.BlockNumber, to, cfg.pool, tx, quitCh); err != nil { - return err - } - pending, queued := cfg.pool.Stats() - log.Info(fmt.Sprintf("[%s] Transaction stats", logPrefix), "pending", pending, "queued", queued) - } - if err := s.Update(tx, to); err != nil { - return err - } - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} - -func incrementalTxPoolUpdate(logPrefix string, from, to uint64, pool *core.TxPool, tx kv.RwTx, quitCh <-chan struct{}) error { - headHash, err := rawdb.ReadCanonicalHash(tx, to) - if err != nil { - return err - } - - headHeader := rawdb.ReadHeader(tx, headHash, to) - pool.ResetHead(headHeader.GasLimit, to) - canonical := make([]common.Hash, to-from) - currentHeaderIdx := uint64(0) - - canonicals, err := tx.Cursor(kv.HeaderCanonical) - if err != nil { - return err - } - defer canonicals.Close() - for k, v, err := canonicals.Seek(dbutils.EncodeBlockNumber(from + 1)); k != nil; k, v, err = canonicals.Next() { - if err != nil { - return err - } - if err := common.Stopped(quitCh); err != nil { - return err - } - - if currentHeaderIdx >= to-from { // if header stage is ahead of body stage - break - } - - copy(canonical[currentHeaderIdx][:], v) - currentHeaderIdx++ - } - - log.Debug(fmt.Sprintf("[%s] Read canonical hashes", logPrefix), "hashes", len(canonical)) - bodies, err := tx.Cursor(kv.BlockBody) - if err != nil { - return err - } - defer bodies.Close() - for k, _, err := bodies.Seek(dbutils.EncodeBlockNumber(from + 1)); k != nil; k, _, err = bodies.Next() { - if err != nil { - return err - } - if err := common.Stopped(quitCh); err != nil { - return err - } - - blockNumber := binary.BigEndian.Uint64(k[:8]) - blockHash := common.BytesToHash(k[8:]) - if blockNumber > to { - break - } - - if canonical[blockNumber-from-1] != blockHash { - // non-canonical case - continue - } - - body := rawdb.ReadBody(tx, blockHash, blockNumber) - for _, tx := range body.Transactions { - pool.RemoveTx(tx.Hash(), true /* outofbound */) - } - } - return nil -} - -func UnwindTxPool(u *UnwindState, s *StageState, tx kv.RwTx, cfg TxPoolCfg, ctx context.Context) (err error) { - if u.UnwindPoint >= s.BlockNumber { - return nil - } - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - quitCh := ctx.Done() - - logPrefix := s.LogPrefix() - if cfg.pool != nil && cfg.pool.IsStarted() { - if err := unwindTxPoolUpdate(logPrefix, u.UnwindPoint, s.BlockNumber, cfg.pool, tx, quitCh); err != nil { - return err - } - pending, queued := cfg.pool.Stats() - log.Info(fmt.Sprintf("[%s] Transaction stats", logPrefix), "pending", pending, "queued", queued) - } - if err := u.Done(tx); err != nil { - return err - } - if !useExternalTx { - if err := tx.Commit(); err != nil { - return err - } - } - return nil -} - -func unwindTxPoolUpdate(logPrefix string, from, to uint64, pool *core.TxPool, tx kv.RwTx, quitCh <-chan struct{}) error { - headHash, err := rawdb.ReadCanonicalHash(tx, from) - if err != nil { - return err - } - headHeader := rawdb.ReadHeader(tx, headHash, from) - pool.ResetHead(headHeader.GasLimit, from) - canonical := make([]common.Hash, to-from) - - canonicals, err := tx.Cursor(kv.HeaderCanonical) - if err != nil { - return err - } - defer canonicals.Close() - for k, v, err := canonicals.Seek(dbutils.EncodeBlockNumber(from + 1)); k != nil; k, v, err = canonicals.Next() { - if err != nil { - return err - } - if err := common.Stopped(quitCh); err != nil { - return err - } - blockNumber := binary.BigEndian.Uint64(k[:8]) - - if blockNumber > to { - break - } - - copy(canonical[blockNumber-from-1][:], v) - } - log.Debug(fmt.Sprintf("[%s] Read canonical hashes", logPrefix), "hashes", len(canonical)) - senders := make([][]common.Address, to-from+1) - sendersC, err := tx.Cursor(kv.Senders) - if err != nil { - return err - } - defer sendersC.Close() - for k, v, err := sendersC.Seek(dbutils.EncodeBlockNumber(from + 1)); k != nil; k, v, err = sendersC.Next() { - if err != nil { - return err - } - if err := common.Stopped(quitCh); err != nil { - return err - } - - blockNumber := binary.BigEndian.Uint64(k[:8]) - blockHash := common.BytesToHash(k[8:]) - if blockNumber > to { - break - } - - if canonical[blockNumber-from-1] != blockHash { - // non-canonical case - continue - } - sendersArray := make([]common.Address, len(v)/common.AddressLength) - for i := 0; i < len(sendersArray); i++ { - copy(sendersArray[i][:], v[i*common.AddressLength:]) - } - senders[blockNumber-from-1] = sendersArray - } - - var txsToInject []types.Transaction - bodies, err := tx.Cursor(kv.BlockBody) - if err != nil { - return err - } - defer bodies.Close() - for k, _, err := bodies.Seek(dbutils.EncodeBlockNumber(from + 1)); k != nil; k, _, err = bodies.Next() { - if err != nil { - return err - } - if err := common.Stopped(quitCh); err != nil { - return err - } - - blockNumber := binary.BigEndian.Uint64(k[:8]) - blockHash := common.BytesToHash(k[8:]) - if blockNumber > to { - break - } - - if canonical[blockNumber-from-1] != blockHash { - // non-canonical case - continue - } - - body := rawdb.ReadBody(tx, blockHash, blockNumber) - body.SendersToTxs(senders[blockNumber-from-1]) - txsToInject = append(txsToInject, body.Transactions...) - } - //nolint:errcheck - log.Info(fmt.Sprintf("[%s] Injecting txs into the pool", logPrefix), "number", len(txsToInject)) - pool.AddRemotesSync(txsToInject) - log.Info(fmt.Sprintf("[%s] Injection complete", logPrefix)) - return nil -} - -func PruneTxPool(s *PruneState, tx kv.RwTx, cfg TxPoolCfg, ctx context.Context) (err error) { - useExternalTx := tx != nil - if !useExternalTx { - tx, err = cfg.db.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - } - - if !useExternalTx { - if err = tx.Commit(); err != nil { - return err - } - } - return nil -} diff --git a/eth/stagedsync/stagebuilder.go b/eth/stagedsync/stagebuilder.go index a197feba9f1..408f1af8042 100644 --- a/eth/stagedsync/stagebuilder.go +++ b/eth/stagedsync/stagebuilder.go @@ -3,6 +3,7 @@ package stagedsync import ( "context" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" @@ -11,13 +12,16 @@ import ( ) type ChainEventNotifier interface { - OnNewHeader(*types.Header) + OnNewHeader(newHeadersRlp [][]byte) OnNewPendingLogs(types.Logs) + OnLogs([]*remote.SubscribeLogsReply) + HasLogSubsriptions() bool } type Notifications struct { - Events *privateapi.Events - Accumulator *shards.Accumulator + Events *privateapi.Events + Accumulator *shards.Accumulator + StateChangesConsumer shards.StateChangeConsumer } func MiningStages( @@ -32,7 +36,7 @@ func MiningStages( { ID: stages.MiningCreateBlock, Description: "Mining: construct new block from tx pool", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnMiningCreateBlockStage(s, tx, createBlockCfg, ctx.Done()) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return nil }, @@ -41,7 +45,7 @@ func MiningStages( { ID: stages.MiningExecution, Description: "Mining: construct new block from tx pool", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnMiningExecStage(s, tx, execCfg, ctx.Done()) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return nil }, @@ -50,7 +54,7 @@ func MiningStages( { ID: stages.HashState, Description: "Hash the key in the state", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnHashStateStage(s, tx, hashStateCfg, ctx) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return nil }, @@ -59,7 +63,7 @@ func MiningStages( { ID: stages.IntermediateHashes, Description: "Generate intermediate hashes and computing state root", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { stateRoot, err := SpawnIntermediateHashesStage(s, u, tx, trieCfg, ctx) if err != nil { return err @@ -73,7 +77,7 @@ func MiningStages( { ID: stages.MiningFinish, Description: "Mining: create and propagate valid block", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { return SpawnMiningFinishStage(s, tx, finish, ctx.Done()) }, Unwind: func(firstCycle bool, u *UnwindState, s *StageState, tx kv.RwTx) error { return nil }, diff --git a/eth/stagedsync/stages/stages.go b/eth/stagedsync/stages/stages.go index 8da1d31d9f1..750d18c27e3 100644 --- a/eth/stagedsync/stages/stages.go +++ b/eth/stagedsync/stages/stages.go @@ -23,13 +23,14 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" ) -// SyncStage represents the stages of syncronisation in the SyncMode.StagedSync mode +// SyncStage represents the stages of syncronisation in the Mode.StagedSync mode // It is used to persist the information about the stage state into the database. // It should not be empty and should be unique. type SyncStage string var ( Headers SyncStage = "Headers" // Headers are downloaded, their Proof-Of-Work validity and chaining is verified + CumulativeIndex SyncStage = "CumulativeIndex" // Calculate how much gas has been used up to each block. BlockHashes SyncStage = "BlockHashes" // Headers Number are written, fills blockHash => number bucket Bodies SyncStage = "Bodies" // Block bodies are downloaded, TxHash and UncleHash are getting verified Senders SyncStage = "Senders" // "From" recovered from signatures, bodies re-written @@ -42,16 +43,12 @@ var ( LogIndex SyncStage = "LogIndex" // Generating logs index (from receipts) CallTraces SyncStage = "CallTraces" // Generating call traces index TxLookup SyncStage = "TxLookup" // Generating transactions lookup index - TxPool SyncStage = "TxPoolDB" // Starts Backend + Issuance SyncStage = "WatchTheBurn" // Compute ether issuance for each block Finish SyncStage = "Finish" // Nominal stage after all other stages MiningCreateBlock SyncStage = "MiningCreateBlock" MiningExecution SyncStage = "MiningExecution" MiningFinish SyncStage = "MiningFinish" - - CreateHeadersSnapshot SyncStage = "CreateHeadersSnapshot" - CreateBodiesSnapshot SyncStage = "CreateBodiesSnapshot" - CreateStateSnapshot SyncStage = "CreateStateSnapshot" ) var AllStages = []SyncStage{ @@ -68,7 +65,6 @@ var AllStages = []SyncStage{ LogIndex, CallTraces, TxLookup, - TxPool, Finish, } diff --git a/eth/stagedsync/sync.go b/eth/stagedsync/sync.go index fd20796a1e7..3ea16cf4f36 100644 --- a/eth/stagedsync/sync.go +++ b/eth/stagedsync/sync.go @@ -6,6 +6,7 @@ import ( "os" "time" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" @@ -23,7 +24,9 @@ type Sync struct { pruningOrder []*Stage currentStage uint timings []Timing + logPrefixes []string } + type Timing struct { isUnwind bool isPrune bool @@ -117,7 +120,7 @@ func (s *Sync) LogPrefix() string { if s == nil { return "" } - return fmt.Sprintf("%d/%d %s", s.currentStage+1, s.Len(), s.stages[s.currentStage].ID) + return s.logPrefixes[s.currentStage] } func (s *Sync) SetCurrentStage(id stages.SyncStage) error { @@ -149,12 +152,17 @@ func New(stagesList []*Stage, unwindOrder UnwindOrder, pruneOrder PruneOrder) *S } } } + logPrefixes := make([]string, len(stagesList)) + for i := range stagesList { + logPrefixes[i] = fmt.Sprintf("%d/%d %s", i+1, len(stagesList), stagesList[i].ID) + } return &Sync{ stages: stagesList, currentStage: 0, unwindOrder: unwindStages, pruningOrder: pruneStages, + logPrefixes: logPrefixes, } } @@ -185,7 +193,9 @@ func (s *Sync) StageState(stage stages.SyncStage, tx kv.Tx, db kv.RoDB) (*StageS func (s *Sync) Run(db kv.RwDB, tx kv.RwTx, firstCycle bool) error { s.prevUnwindPoint = nil s.timings = s.timings[:0] + for !s.IsDone() { + var badBlockUnwind bool if s.unwindPoint != nil { for j := 0; j < len(s.unwindOrder); j++ { if s.unwindOrder[j] == nil || s.unwindOrder[j].Disabled || s.unwindOrder[j].Unwind == nil { @@ -197,6 +207,9 @@ func (s *Sync) Run(db kv.RwDB, tx kv.RwTx, firstCycle bool) error { } s.prevUnwindPoint = s.unwindPoint s.unwindPoint = nil + if s.badBlock != (common.Hash{}) { + badBlockUnwind = true + } s.badBlock = common.Hash{} if err := s.SetCurrentStage(s.stages[0].ID); err != nil { return err @@ -209,18 +222,18 @@ func (s *Sync) Run(db kv.RwDB, tx kv.RwTx, firstCycle bool) error { stage := s.stages[s.currentStage] if string(stage.ID) == debug.StopBeforeStage() { // stop process for debugging reasons - log.Error("STOP_BEFORE_STAGE env flag forced to stop app") + log.Warn("STOP_BEFORE_STAGE env flag forced to stop app") os.Exit(1) } if stage.Disabled || stage.Forward == nil { - log.Debug(fmt.Sprintf("%s disabled. %s", stage.ID, stage.DisabledDescription)) + log.Trace(fmt.Sprintf("%s disabled. %s", stage.ID, stage.DisabledDescription)) s.NextStage() continue } - if err := s.runStage(stage, db, tx, firstCycle); err != nil { + if err := s.runStage(stage, db, tx, firstCycle, badBlockUnwind); err != nil { return err } @@ -250,7 +263,7 @@ func printLogs(tx kv.RwTx, timings []Timing) error { var logCtx []interface{} count := 0 for i := range timings { - if timings[i].took < 10*time.Millisecond { + if timings[i].took < 50*time.Millisecond { continue } count++ @@ -266,7 +279,7 @@ func printLogs(tx kv.RwTx, timings []Timing) error { } } if len(logCtx) > 0 { - log.Info("Timings (slower than 10ms)", logCtx...) + log.Info("Timings (slower than 50ms)", logCtx...) } if tx == nil { @@ -288,7 +301,7 @@ func printLogs(tx kv.RwTx, timings []Timing) error { if err1 != nil { return err1 } - bucketSizes = append(bucketSizes, bucket, common.StorageSize(sz)) + bucketSizes = append(bucketSizes, bucket, libcommon.ByteCount(sz)) } log.Info("Tables", bucketSizes...) } @@ -296,28 +309,29 @@ func printLogs(tx kv.RwTx, timings []Timing) error { return nil } -func (s *Sync) runStage(stage *Stage, db kv.RwDB, tx kv.RwTx, firstCycle bool) (err error) { +func (s *Sync) runStage(stage *Stage, db kv.RwDB, tx kv.RwTx, firstCycle bool, badBlockUnwind bool) (err error) { start := time.Now() stageState, err := s.StageState(stage.ID, tx, db) if err != nil { return err } - if err = stage.Forward(firstCycle, stageState, s, tx); err != nil { + if err = stage.Forward(firstCycle, badBlockUnwind, stageState, s, tx); err != nil { return fmt.Errorf("[%s] %w", s.LogPrefix(), err) } - t := time.Since(start) - if t > 60*time.Second { + took := time.Since(start) + if took > 60*time.Second { logPrefix := s.LogPrefix() - log.Info(fmt.Sprintf("[%s] DONE", logPrefix), "in", t) + log.Info(fmt.Sprintf("[%s] DONE", logPrefix), "in", took) } + s.timings = append(s.timings, Timing{stage: stage.ID, took: took}) return nil } func (s *Sync) unwindStage(firstCycle bool, stage *Stage, db kv.RwDB, tx kv.RwTx) error { - t := time.Now() - log.Debug("Unwind...", "stage", stage.ID) + start := time.Now() + log.Trace("Unwind...", "stage", stage.ID) stageState, err := s.StageState(stage.ID, tx, db) if err != nil { return err @@ -339,18 +353,18 @@ func (s *Sync) unwindStage(firstCycle bool, stage *Stage, db kv.RwDB, tx kv.RwTx return fmt.Errorf("[%s] %w", s.LogPrefix(), err) } - took := time.Since(t) + took := time.Since(start) if took > 60*time.Second { logPrefix := s.LogPrefix() - log.Info(fmt.Sprintf("[%s] Unwind done", logPrefix), "in", t) + log.Info(fmt.Sprintf("[%s] Unwind done", logPrefix), "in", took) } - s.timings = append(s.timings, Timing{isUnwind: true, stage: stage.ID, took: time.Since(t)}) + s.timings = append(s.timings, Timing{isUnwind: true, stage: stage.ID, took: took}) return nil } func (s *Sync) pruneStage(firstCycle bool, stage *Stage, db kv.RwDB, tx kv.RwTx) error { - t := time.Now() - log.Debug("Prune...", "stage", stage.ID) + start := time.Now() + log.Trace("Prune...", "stage", stage.ID) stageState, err := s.StageState(stage.ID, tx, db) if err != nil { @@ -370,19 +384,27 @@ func (s *Sync) pruneStage(firstCycle bool, stage *Stage, db kv.RwDB, tx kv.RwTx) return fmt.Errorf("[%s] %w", s.LogPrefix(), err) } - took := time.Since(t) + took := time.Since(start) if took > 60*time.Second { logPrefix := s.LogPrefix() - log.Info(fmt.Sprintf("[%s] Prune done", logPrefix), "in", t) + log.Info(fmt.Sprintf("[%s] Prune done", logPrefix), "in", took) } - s.timings = append(s.timings, Timing{isPrune: true, stage: stage.ID, took: time.Since(t)}) + s.timings = append(s.timings, Timing{isPrune: true, stage: stage.ID, took: took}) return nil } -func (s *Sync) DisableAllStages() { +// DisableAllStages - including their unwinds +func (s *Sync) DisableAllStages() []stages.SyncStage { + var backupEnabledIds []stages.SyncStage + for i := range s.stages { + if !s.stages[i].Disabled { + backupEnabledIds = append(backupEnabledIds, s.stages[i].ID) + } + } for i := range s.stages { s.stages[i].Disabled = true } + return backupEnabledIds } func (s *Sync) DisableStages(ids ...stages.SyncStage) { diff --git a/eth/stagedsync/sync_test.go b/eth/stagedsync/sync_test.go index 0b9f1e3481b..2e5358d9fbc 100644 --- a/eth/stagedsync/sync_test.go +++ b/eth/stagedsync/sync_test.go @@ -18,7 +18,7 @@ func TestStagesSuccess(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) return nil }, @@ -26,7 +26,7 @@ func TestStagesSuccess(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) return nil }, @@ -34,7 +34,7 @@ func TestStagesSuccess(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) return nil }, @@ -57,7 +57,7 @@ func TestDisabledStages(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) return nil }, @@ -65,7 +65,7 @@ func TestDisabledStages(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) return nil }, @@ -74,7 +74,7 @@ func TestDisabledStages(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) return nil }, @@ -98,7 +98,7 @@ func TestErroredStage(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) return nil }, @@ -106,7 +106,7 @@ func TestErroredStage(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) return expectedErr }, @@ -114,7 +114,7 @@ func TestErroredStage(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) return nil }, @@ -138,7 +138,7 @@ func TestUnwindSomeStagesBehindUnwindPoint(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -153,7 +153,7 @@ func TestUnwindSomeStagesBehindUnwindPoint(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) if s.BlockNumber == 0 { return s.Update(tx, 1000) @@ -168,7 +168,7 @@ func TestUnwindSomeStagesBehindUnwindPoint(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { if s.BlockNumber == 0 { if err := s.Update(tx, 1700); err != nil { return err @@ -190,7 +190,7 @@ func TestUnwindSomeStagesBehindUnwindPoint(t *testing.T) { { ID: stages.IntermediateHashes, Disabled: true, - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.IntermediateHashes) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -236,7 +236,7 @@ func TestUnwind(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -251,7 +251,7 @@ func TestUnwind(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -266,7 +266,7 @@ func TestUnwind(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) if !unwound { unwound = true @@ -283,7 +283,7 @@ func TestUnwind(t *testing.T) { { ID: stages.IntermediateHashes, Disabled: true, - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.IntermediateHashes) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -344,7 +344,7 @@ func TestUnwindEmptyUnwinder(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -359,7 +359,7 @@ func TestUnwindEmptyUnwinder(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -370,7 +370,7 @@ func TestUnwindEmptyUnwinder(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) if !unwound { unwound = true @@ -418,7 +418,7 @@ func TestSyncDoTwice(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) return s.Update(tx, s.BlockNumber+100) }, @@ -426,7 +426,7 @@ func TestSyncDoTwice(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) return s.Update(tx, s.BlockNumber+200) }, @@ -434,7 +434,7 @@ func TestSyncDoTwice(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) return s.Update(tx, s.BlockNumber+300) }, @@ -476,7 +476,7 @@ func TestStateSyncInterruptRestart(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) return nil }, @@ -484,7 +484,7 @@ func TestStateSyncInterruptRestart(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) return expectedErr }, @@ -492,7 +492,7 @@ func TestStateSyncInterruptRestart(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) return nil }, @@ -528,7 +528,7 @@ func TestSyncInterruptLongUnwind(t *testing.T) { { ID: stages.Headers, Description: "Downloading headers", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Headers) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -543,7 +543,7 @@ func TestSyncInterruptLongUnwind(t *testing.T) { { ID: stages.Bodies, Description: "Downloading block bodiess", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Bodies) if s.BlockNumber == 0 { return s.Update(tx, 2000) @@ -558,7 +558,7 @@ func TestSyncInterruptLongUnwind(t *testing.T) { { ID: stages.Senders, Description: "Recovering senders from tx signatures", - Forward: func(firstCycle bool, s *StageState, u Unwinder, tx kv.RwTx) error { + Forward: func(firstCycle bool, badBlockUnwind bool, s *StageState, u Unwinder, tx kv.RwTx) error { flow = append(flow, stages.Senders) if !unwound { unwound = true diff --git a/eth/tracers/api.go b/eth/tracers/api.go index c006b7319be..6187022f30c 100644 --- a/eth/tracers/api.go +++ b/eth/tracers/api.go @@ -1,12 +1,16 @@ package tracers -import "github.com/ledgerwatch/erigon/core/vm" +import ( + "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/erigon/internal/ethapi" +) // TraceConfig holds extra parameters to trace functions. type TraceConfig struct { *vm.LogConfig - Tracer *string - Timeout *string - Reexec *uint64 - NoRefunds *bool // Turns off gas refunds when tracing + Tracer *string + Timeout *string + Reexec *uint64 + NoRefunds *bool // Turns off gas refunds when tracing + StateOverrides *ethapi.StateOverrides } diff --git a/eth/tracers/internal/tracers/assets.go b/eth/tracers/internal/tracers/assets.go index 7f45ab286e7..fa4e2df9433 100644 --- a/eth/tracers/internal/tracers/assets.go +++ b/eth/tracers/internal/tracers/assets.go @@ -265,7 +265,7 @@ func Asset(name string) ([]byte, error) { if f, ok := _bindata[canonicalName]; ok { a, err := f() if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) + return nil, fmt.Errorf("Asset %s can't read by error: %w", name, err) } return a.bytes, nil } @@ -303,7 +303,7 @@ func AssetInfo(name string) (os.FileInfo, error) { if f, ok := _bindata[canonicalName]; ok { a, err := f() if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) + return nil, fmt.Errorf("AssetInfo %s can't read by error: %w", name, err) } return a.info, nil } @@ -317,7 +317,7 @@ func AssetDigest(name string) ([sha256.Size]byte, error) { if f, ok := _bindata[canonicalName]; ok { a, err := f() if err != nil { - return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %w", name, err) } return a.digest, nil } diff --git a/eth/tracers/jsvm.go b/eth/tracers/jsvm.go new file mode 100644 index 00000000000..073900b968d --- /dev/null +++ b/eth/tracers/jsvm.go @@ -0,0 +1,238 @@ +package tracers + +import ( + "github.com/dop251/goja" + "unsafe" +) + +type JSVM struct { + vm *goja.Runtime + stack []goja.Value +} + +func JSVMNew() *JSVM { + return &JSVM{ + vm: goja.New(), + stack: make([]goja.Value, 0, 100), + } +} + +func (vm *JSVM) Pop() { + vm.stack = vm.stack[:len(vm.stack)-1] +} + +func (vm *JSVM) Swap(index1 int, index2 int) { + t := vm.stack[len(vm.stack)+index1] + vm.stack[len(vm.stack)+index1] = vm.stack[len(vm.stack)+index2] + vm.stack[len(vm.stack)+index2] = t +} + +func (vm *JSVM) pushAny(val interface{}) { + vm.stack = append(vm.stack, vm.vm.ToValue(val)) +} + +func (vm *JSVM) PushBoolean(val bool) { + vm.pushAny(val) +} + +func (vm *JSVM) PushInt(val int) { + vm.pushAny(val) +} + +func (vm *JSVM) PushUint(val uint) { + vm.pushAny(val) +} + +func (vm *JSVM) PushString(val string) string { + vm.pushAny(val) + return val +} + +func (vm *JSVM) PushFixedBuffer(size int) unsafe.Pointer { + buf := make([]byte, size) + vm.pushAny(buf) + if size == 0 { + return unsafe.Pointer(nil) + } + return unsafe.Pointer(&buf[0]) +} + +func (vm *JSVM) PushGoFunction(fn0 func(*JSVM) int) { + fn := func(this goja.Value, args ...goja.Value) (goja.Value, error) { + vm.stack = append(vm.stack, this) + vm.stack = append(vm.stack, args...) + _ = fn0(vm) + result := vm.stack[len(vm.stack)-1] + vm.Pop() + return result, nil + } + vm.pushAny(fn) +} + +func (vm *JSVM) PushObject() int { + vm.stack = append(vm.stack, vm.vm.ToValue(vm.vm.NewObject())) + return len(vm.stack) - 1 +} + +func (vm *JSVM) PushUndefined() { + vm.stack = append(vm.stack, goja.Undefined()) +} + +func (vm *JSVM) GetInt(index int) int { + return int(vm.stack[len(vm.stack)+index].Export().(int64)) +} + +func (vm *JSVM) GetString(index int) string { + return vm.stack[len(vm.stack)+index].Export().(string) +} + +func (vm *JSVM) GetBuffer(index int) (rawPtr unsafe.Pointer, outSize uint) { + v := vm.stack[len(vm.stack)+index] + expValue := v.Export() + + // toAddress() and some others are passed a string, but try to parse it with GetBuffer + if _, ok := expValue.(string); ok { + return nil, 0 + } + + buf := expValue.([]byte) + if len(buf) == 0 { + return unsafe.Pointer(nil), 0 + } + return unsafe.Pointer(&buf[0]), uint(len(buf)) +} + +func (vm *JSVM) GetPropString(objIndex int, key string) bool { + obj := vm.stack[objIndex].ToObject(vm.vm) + v := obj.Get(key) + vm.stack = append(vm.stack, v) + return !goja.IsUndefined(v) +} + +func (vm *JSVM) PutPropString(objIndex int, key string) { + v := vm.stack[len(vm.stack)-1] + vm.Pop() + + obj := vm.stack[objIndex].ToObject(vm.vm) + err := obj.Set(key, v) + if err != nil { + panic(err) + } +} + +func (vm *JSVM) GetGlobalString(key string) bool { + v := vm.vm.GlobalObject().Get(key) + vm.stack = append(vm.stack, v) + return !goja.IsUndefined(v) +} + +func (vm *JSVM) PutGlobalString(key string) { + v := vm.stack[len(vm.stack)-1] + vm.Pop() + + obj := vm.vm.GlobalObject() + err := obj.Set(key, v) + if err != nil { + panic(err) + } +} + +func (vm *JSVM) PushGlobalGoFunction(name string, fn0 func(*JSVM) int) { + fn := func(this goja.Value, args ...goja.Value) (goja.Value, error) { + vm.stack = append(vm.stack, this) + vm.stack = append(vm.stack, args...) + _ = fn0(vm) + result := vm.stack[len(vm.stack)-1] + vm.Pop() + return result, nil + } + err := vm.vm.GlobalObject().Set(name, goja.Callable(fn)) + if err != nil { + panic(err) + } +} + +func (vm *JSVM) PushGlobalObject() int { + vm.stack = append(vm.stack, vm.vm.GlobalObject()) + return len(vm.stack) - 1 +} + +func (vm *JSVM) Call(numArgs int) { + if vm.Pcall(numArgs) != 0 { + err := vm.stack[len(vm.stack)-1] + vm.Pop() + panic(err) + } +} + +func (vm *JSVM) Pcall(numArgs int) int { + fnValue := vm.stack[len(vm.stack)-numArgs-1] + args := vm.stack[len(vm.stack)-numArgs:] + vm.stack = vm.stack[:len(vm.stack)-numArgs-1] + + fn, ok := goja.AssertFunction(fnValue) + if !ok { + panic("AssertFunction") + } + + v, err := fn(goja.Undefined(), args...) + if err != nil { + vm.stack = append(vm.stack, vm.vm.ToValue(err)) + return 1 + } else { + vm.stack = append(vm.stack, v) + return 0 + } +} + +func (vm *JSVM) PcallProp(objIndex int, numArgs int) int { + key := vm.stack[len(vm.stack)-numArgs-1].String() + args := vm.stack[len(vm.stack)-numArgs:] + vm.stack = vm.stack[:len(vm.stack)-numArgs-1] + + obj := vm.stack[objIndex].ToObject(vm.vm) + fnValue := obj.Get(key) + + fn, ok := goja.AssertFunction(fnValue) + if !ok { + panic("AssertFunction") + } + + v, err := fn(obj, args...) + if err != nil { + vm.stack = append(vm.stack, vm.vm.ToValue(err)) + return 1 + } else { + vm.stack = append(vm.stack, v) + return 0 + } +} + +func (vm *JSVM) SafeToString(index int) string { + v := vm.stack[len(vm.stack)+index] + return v.ToString().String() +} + +func (vm *JSVM) Eval() { + src := vm.GetString(-1) + vm.Pop() + vm.EvalString(src) +} + +func (vm *JSVM) EvalString(src string) { + v, err := vm.vm.RunString(src) + if err != nil { + panic(err) + } + vm.stack = append(vm.stack, v) +} + +func (vm *JSVM) PevalString(src string) error { + v, err := vm.vm.RunString(src) + if err != nil { + vm.stack = append(vm.stack, vm.vm.ToValue(err)) + } else { + vm.stack = append(vm.stack, v) + } + return err +} diff --git a/eth/tracers/jsvm_test.go b/eth/tracers/jsvm_test.go new file mode 100644 index 00000000000..00b7d881b6b --- /dev/null +++ b/eth/tracers/jsvm_test.go @@ -0,0 +1,177 @@ +package tracers + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSwap(t *testing.T) { + vm := JSVMNew() + vm.PushInt(1) + vm.PushInt(2) + vm.Swap(-1, -2) + assert.Equal(t, 1, vm.GetInt(-1)) + vm.Pop() + assert.Equal(t, 2, vm.GetInt(-1)) +} + +func TestPushAndGetInt(t *testing.T) { + vm := JSVMNew() + vm.PushInt(123) + assert.Equal(t, 123, vm.GetInt(-1)) +} + +func TestPushAndGetString(t *testing.T) { + vm := JSVMNew() + vm.PushString("hello") + assert.Equal(t, "hello", vm.GetString(-1)) +} + +func TestPushAndGetBuffer(t *testing.T) { + vm := JSVMNew() + vm.PushFixedBuffer(1) + p, s := vm.GetBuffer(-1) + assert.Equal(t, uint(1), s) + assert.Equal(t, byte(0), *(*byte)(p)) +} + +func TestPutAndGetPropString(t *testing.T) { + vm := JSVMNew() + objIndex := vm.PushObject() + vm.PushString("hello") + vm.PutPropString(objIndex, "x") + exists := vm.GetPropString(objIndex, "x") + assert.Equal(t, true, exists) + x := vm.GetString(-1) + assert.Equal(t, "hello", x) +} + +func TestGetGlobalString(t *testing.T) { + vm := JSVMNew() + vm.EvalString("x = 'hello'") + exists := vm.GetGlobalString("x") + assert.Equal(t, true, exists) + x := vm.GetString(-1) + assert.Equal(t, "hello", x) +} + +func TestPutGlobalString(t *testing.T) { + vm := JSVMNew() + vm.PushString("hello") + vm.PutGlobalString("x") + exists := vm.GetGlobalString("x") + assert.Equal(t, true, exists) + x := vm.GetString(-1) + assert.Equal(t, "hello", x) +} + +func TestCall0(t *testing.T) { + vm := JSVMNew() + vm.PushGoFunction(func(ctx *JSVM) int { + ctx.PushInt(123) + return 1 + }) + vm.Call(0) + x := vm.GetInt(-1) + assert.Equal(t, 123, x) +} + +func TestCall1(t *testing.T) { + vm := JSVMNew() + vm.PushGoFunction(func(ctx *JSVM) int { + arg := ctx.GetInt(-1) + ctx.Pop() + ctx.PushInt(arg + 120) + return 1 + }) + vm.PushInt(3) + vm.Call(1) + x := vm.GetInt(-1) + assert.Equal(t, 123, x) +} + +func TestCallPropWithGoFunction(t *testing.T) { + vm := JSVMNew() + vm.PushGlobalGoFunction("f", func(ctx *JSVM) int { + ctx.PushInt(123) + return 1 + }) + objIndex := vm.PushGlobalObject() + vm.PushString("f") + errCode := vm.PcallProp(objIndex, 0) + assert.Equal(t, 0, errCode) + x := vm.GetInt(-1) + assert.Equal(t, 123, x) +} + +func TestCallProp0(t *testing.T) { + vm := JSVMNew() + vm.EvalString("function f() { return 'hello' }") + objIndex := vm.PushGlobalObject() + vm.PushString("f") + errCode := vm.PcallProp(objIndex, 0) + assert.Equal(t, 0, errCode) + x := vm.GetString(-1) + assert.Equal(t, "hello", x) +} + +func TestCallProp1(t *testing.T) { + vm := JSVMNew() + vm.EvalString("function f(s) { return s + '123' }") + objIndex := vm.PushGlobalObject() + vm.PushString("f") + vm.PushString("hello") + errCode := vm.PcallProp(objIndex, 1) + assert.Equal(t, 0, errCode) + x := vm.GetString(-1) + assert.Equal(t, "hello123", x) +} + +func TestCallPropWithObj(t *testing.T) { + vm := JSVMNew() + vm.EvalString("function f(opts) { return opts.name + '123' }") + globalIndex := vm.PushGlobalObject() + vm.PushString("f") + optsIndex := vm.PushObject() + vm.PushString("hello") + vm.PutPropString(optsIndex, "name") + errCode := vm.PcallProp(globalIndex, 1) + assert.Equal(t, 0, errCode) + x := vm.GetString(-1) + assert.Equal(t, "hello123", x) +} + +func TestCallPropWithJSObj(t *testing.T) { + vm := JSVMNew() + vm.EvalString(` +function Options() { } +Options.prototype.name = function () { return 'hello' } +function makeOptions() { return new Options() } +function f(opts) { return opts.name() + '123' } +`) + globalIndex := vm.PushGlobalObject() + vm.PushString("f") + + vm.PushString("makeOptions") + errCode := vm.PcallProp(globalIndex, 0) + assert.Equal(t, 0, errCode) + + errCode = vm.PcallProp(globalIndex, 1) + assert.Equal(t, 0, errCode) + x := vm.GetString(-1) + assert.Equal(t, "hello123", x) +} + +func TestSafeToString(t *testing.T) { + vm := JSVMNew() + vm.PushInt(5) + assert.Equal(t, "5", vm.SafeToString(-1)) +} + +func TestEval(t *testing.T) { + vm := JSVMNew() + vm.PushString("2 + 3") + vm.Eval() + x := vm.GetInt(-1) + assert.Equal(t, 5, x) +} diff --git a/eth/tracers/logger/access_list_tracer.go b/eth/tracers/logger/access_list_tracer.go new file mode 100644 index 00000000000..02300267d62 --- /dev/null +++ b/eth/tracers/logger/access_list_tracer.go @@ -0,0 +1,190 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package logger + +import ( + "math/big" + "time" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/core/vm" +) + +// accessList is an accumulator for the set of accounts and storage slots an EVM +// contract execution touches. +type accessList map[common.Address]accessListSlots + +// accessListSlots is an accumulator for the set of storage slots within a single +// contract that an EVM contract execution touches. +type accessListSlots map[common.Hash]struct{} + +// newAccessList creates a new accessList. +func newAccessList() accessList { + return make(map[common.Address]accessListSlots) +} + +// addAddress adds an address to the accesslist. +func (al accessList) addAddress(address common.Address) { + // Set address if not previously present + if _, present := al[address]; !present { + al[address] = make(map[common.Hash]struct{}) + } +} + +// addSlot adds a storage slot to the accesslist. +func (al accessList) addSlot(address common.Address, slot common.Hash) { + // Set address if not previously present + al.addAddress(address) + + // Set the slot on the surely existent storage set + al[address][slot] = struct{}{} +} + +// equal checks if the content of the current access list is the same as the +// content of the other one. +func (al accessList) equal(other accessList) bool { + // Cross reference the accounts first + if len(al) != len(other) { + return false + } + for addr := range al { + if _, ok := other[addr]; !ok { + return false + } + } + for addr := range other { + if _, ok := al[addr]; !ok { + return false + } + } + // Accounts match, cross reference the storage slots too + for addr, slots := range al { + otherslots := other[addr] + + if len(slots) != len(otherslots) { + return false + } + for hash := range slots { + if _, ok := otherslots[hash]; !ok { + return false + } + } + for hash := range otherslots { + if _, ok := slots[hash]; !ok { + return false + } + } + } + return true +} + +// accesslist converts the accesslist to a types.AccessList. +func (al accessList) accessList() types.AccessList { + acl := make(types.AccessList, 0, len(al)) + for addr, slots := range al { + tuple := types.AccessTuple{Address: addr, StorageKeys: []common.Hash{}} + for slot := range slots { + tuple.StorageKeys = append(tuple.StorageKeys, slot) + } + acl = append(acl, tuple) + } + return acl +} + +// AccessListTracer is a tracer that accumulates touched accounts and storage +// slots into an internal set. +type AccessListTracer struct { + excl map[common.Address]struct{} // Set of account to exclude from the list + list accessList // Set of accounts and storage slots touched +} + +// NewAccessListTracer creates a new tracer that can generate AccessLists. +// An optional AccessList can be specified to occupy slots and addresses in +// the resulting accesslist. +func NewAccessListTracer(acl types.AccessList, from, to common.Address, precompiles []common.Address) *AccessListTracer { + excl := map[common.Address]struct{}{ + from: {}, to: {}, + } + for _, addr := range precompiles { + excl[addr] = struct{}{} + } + list := newAccessList() + for _, al := range acl { + if _, ok := excl[al.Address]; !ok { + list.addAddress(al.Address) + } + for _, slot := range al.StorageKeys { + list.addSlot(al.Address, slot) + } + } + return &AccessListTracer{ + excl: excl, + list: list, + } +} + +func (a *AccessListTracer) CaptureStart(env *vm.EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, callType vm.CallType, input []byte, gas uint64, value *big.Int, code []byte) { +} + +// CaptureState captures all opcodes that touch storage or addresses and adds them to the accesslist. +func (a *AccessListTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + stack := scope.Stack + contract := scope.Contract + + stackData := stack.Data + stackLen := len(stackData) + if (op == vm.SLOAD || op == vm.SSTORE) && stackLen >= 1 { + slot := common.Hash(stackData[stackLen-1].Bytes32()) + a.list.addSlot(contract.Address(), slot) + } + if (op == vm.EXTCODECOPY || op == vm.EXTCODEHASH || op == vm.EXTCODESIZE || op == vm.BALANCE || op == vm.SELFDESTRUCT) && stackLen >= 1 { + addr := common.Address(stackData[stackLen-1].Bytes20()) + if _, ok := a.excl[addr]; !ok { + a.list.addAddress(addr) + } + } + if (op == vm.DELEGATECALL || op == vm.CALL || op == vm.STATICCALL || op == vm.CALLCODE) && stackLen >= 5 { + addr := common.Address(stackData[stackLen-2].Bytes20()) + if _, ok := a.excl[addr]; !ok { + a.list.addAddress(addr) + } + } +} + +func (*AccessListTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { +} +func (*AccessListTracer) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { +} +func (*AccessListTracer) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { +} +func (*AccessListTracer) CaptureAccountRead(account common.Address) error { + return nil +} +func (*AccessListTracer) CaptureAccountWrite(account common.Address) error { + return nil +} + +// AccessList returns the current accesslist maintained by the tracer. +func (a *AccessListTracer) AccessList() types.AccessList { + return a.list.accessList() +} + +// Equal returns if the content of two access list traces are equal. +func (a *AccessListTracer) Equal(other *AccessListTracer) bool { + return a.list.equal(other.list) +} diff --git a/eth/tracers/tracer.go b/eth/tracers/tracer.go index 4e109413b67..21a1e823a36 100644 --- a/eth/tracers/tracer.go +++ b/eth/tracers/tracer.go @@ -20,17 +20,16 @@ import ( "encoding/json" "errors" "fmt" + "github.com/ledgerwatch/erigon/core" "math/big" "sync/atomic" "time" "unsafe" "github.com/holiman/uint256" - "gopkg.in/olebedev/go-duktape.v3" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" - "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/core/vm/stack" "github.com/ledgerwatch/erigon/crypto" @@ -57,14 +56,14 @@ func makeSlice(ptr unsafe.Pointer, size uint) []byte { } // popSlice pops a buffer off the JavaScript stack and returns it as a slice. -func popSlice(ctx *duktape.Context) []byte { +func popSlice(ctx *JSVM) []byte { blob := common.CopyBytes(makeSlice(ctx.GetBuffer(-1))) ctx.Pop() return blob } // pushBigInt create a JavaScript BigInteger in the VM. -func pushBigInt(n *big.Int, ctx *duktape.Context) { +func pushBigInt(n *big.Int, ctx *JSVM) { ctx.GetGlobalString("bigInt") ctx.PushString(n.String()) ctx.Call(1) @@ -77,16 +76,16 @@ type opWrapper struct { // pushObject assembles a JSVM object wrapping a swappable opcode and pushes it // onto the VM stack. -func (ow *opWrapper) pushObject(vm *duktape.Context) { +func (ow *opWrapper) pushObject(vm *JSVM) { obj := vm.PushObject() - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(int(ow.op)); return 1 }) + vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushInt(int(ow.op)); return 1 }) vm.PutPropString(obj, "toNumber") - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushString(ow.op.String()); return 1 }) + vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushString(ow.op.String()); return 1 }) vm.PutPropString(obj, "toString") - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushBoolean(ow.op.IsPush()); return 1 }) + vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushBoolean(ow.op.IsPush()); return 1 }) vm.PutPropString(obj, "isPush") } @@ -128,13 +127,14 @@ func (mw *memoryWrapper) getUint(addr int64) *big.Int { // pushObject assembles a JSVM object wrapping a swappable memory and pushes it // onto the VM stack. -func (mw *memoryWrapper) pushObject(vm *duktape.Context) { +func (mw *memoryWrapper) pushObject(vm *JSVM) { obj := vm.PushObject() // Generate the `slice` method which takes two ints and returns a buffer - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { blob := mw.slice(int64(ctx.GetInt(-2)), int64(ctx.GetInt(-1))) - ctx.Pop2() + ctx.Pop() + ctx.Pop() ptr := ctx.PushFixedBuffer(len(blob)) copy(makeSlice(ptr, uint(len(blob))), blob) @@ -143,7 +143,7 @@ func (mw *memoryWrapper) pushObject(vm *duktape.Context) { vm.PutPropString(obj, "slice") // Generate the `getUint` method which takes an int and returns a bigint - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { offset := int64(ctx.GetInt(-1)) ctx.Pop() @@ -171,14 +171,14 @@ func (sw *stackWrapper) peek(idx int) *big.Int { // pushObject assembles a JSVM object wrapping a swappable stack and pushes it // onto the VM stack. -func (sw *stackWrapper) pushObject(vm *duktape.Context) { +func (sw *stackWrapper) pushObject(vm *JSVM) { obj := vm.PushObject() - vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushInt(sw.stack.Len()); return 1 }) + vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushInt(sw.stack.Len()); return 1 }) vm.PutPropString(obj, "length") // Generate the `peek` method which takes an int and returns a bigint - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { offset := ctx.GetInt(-1) ctx.Pop() @@ -195,25 +195,25 @@ type dbWrapper struct { // pushObject assembles a JSVM object wrapping a swappable database and pushes it // onto the VM stack. -func (dw *dbWrapper) pushObject(vm *duktape.Context) { +func (dw *dbWrapper) pushObject(vm *JSVM) { obj := vm.PushObject() // Push the wrapper for statedb.GetBalance - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { pushBigInt(dw.db.GetBalance(common.BytesToAddress(popSlice(ctx))).ToBig(), ctx) return 1 }) vm.PutPropString(obj, "getBalance") // Push the wrapper for statedb.GetNonce - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushInt(int(dw.db.GetNonce(common.BytesToAddress(popSlice(ctx))))) return 1 }) vm.PutPropString(obj, "getNonce") // Push the wrapper for statedb.GetCode - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { code := dw.db.GetCode(common.BytesToAddress(popSlice(ctx))) ptr := ctx.PushFixedBuffer(len(code)) @@ -223,7 +223,7 @@ func (dw *dbWrapper) pushObject(vm *duktape.Context) { vm.PutPropString(obj, "getCode") // Push the wrapper for statedb.GetState - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { hash := popSlice(ctx) addr := popSlice(ctx) @@ -238,7 +238,7 @@ func (dw *dbWrapper) pushObject(vm *duktape.Context) { vm.PutPropString(obj, "getState") // Push the wrapper for statedb.Exists - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushBoolean(dw.db.Exist(common.BytesToAddress(popSlice(ctx)))) return 1 }) @@ -252,11 +252,11 @@ type contractWrapper struct { // pushObject assembles a JSVM object wrapping a swappable contract and pushes it // onto the VM stack. -func (cw *contractWrapper) pushObject(vm *duktape.Context) { +func (cw *contractWrapper) pushObject(vm *JSVM) { obj := vm.PushObject() // Push the wrapper for contract.Caller - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { ptr := ctx.PushFixedBuffer(20) copy(makeSlice(ptr, 20), cw.contract.Caller().Bytes()) return 1 @@ -264,7 +264,7 @@ func (cw *contractWrapper) pushObject(vm *duktape.Context) { vm.PutPropString(obj, "getCaller") // Push the wrapper for contract.Address - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { ptr := ctx.PushFixedBuffer(20) copy(makeSlice(ptr, 20), cw.contract.Address().Bytes()) return 1 @@ -272,14 +272,14 @@ func (cw *contractWrapper) pushObject(vm *duktape.Context) { vm.PutPropString(obj, "getAddress") // Push the wrapper for contract.Value - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { pushBigInt(cw.contract.Value().ToBig(), ctx) return 1 }) vm.PutPropString(obj, "getValue") // Push the wrapper for contract.Input - vm.PushGoFunction(func(ctx *duktape.Context) int { + vm.PushGoFunction(func(ctx *JSVM) int { blob := cw.contract.Input ptr := ctx.PushFixedBuffer(len(blob)) @@ -292,9 +292,7 @@ func (cw *contractWrapper) pushObject(vm *duktape.Context) { // Tracer provides an implementation of Tracer that evaluates a Javascript // function for each VM execution step. type Tracer struct { - inited bool // Flag whether the context was already inited from the EVM - - vm *duktape.Context // Javascript VM instance + vm *JSVM // Javascript VM instance tracerObject int // Stack index of the tracer JavaScript object stateObject int // Stack index of the global state to pull arguments from @@ -321,16 +319,24 @@ type Tracer struct { activePrecompiles []common.Address // Updated on CaptureStart based on given rules } +// Context contains some contextual infos for a transaction execution that is not +// available from within the EVM object. +type Context struct { + BlockHash common.Hash // Hash of the block the tx is contained within (zero if dangling tx or call) + TxIndex int // Index of the transaction within a block (zero if dangling tx or call) + TxHash common.Hash // Hash of the transaction being traced (zero if dangling call) +} + // New instantiates a new tracer instance. code specifies a Javascript snippet, // which must evaluate to an expression returning an object with 'step', 'fault' // and 'result' functions. -func New(code string, txCtx vm.TxContext) (*Tracer, error) { +func New(code string, ctx *Context) (*Tracer, error) { // Resolve any tracers by name and assemble the tracer object if tracer, ok := tracer(code); ok { code = tracer } tracer := &Tracer{ - vm: duktape.New(), + vm: JSVMNew(), ctx: make(map[string]interface{}), opWrapper: new(opWrapper), stackWrapper: new(stackWrapper), @@ -343,14 +349,21 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { depthValue: new(uint), refundValue: new(uint), } - tracer.ctx["gasPrice"] = txCtx.GasPrice + if ctx.BlockHash != (common.Hash{}) { + tracer.ctx["blockHash"] = ctx.BlockHash + + if ctx.TxHash != (common.Hash{}) { + tracer.ctx["txIndex"] = ctx.TxIndex + tracer.ctx["txHash"] = ctx.TxHash + } + } // Set up builtins for this environment - tracer.vm.PushGlobalGoFunction("toHex", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("toHex", func(ctx *JSVM) int { ctx.PushString(hexutil.Encode(popSlice(ctx))) return 1 }) - tracer.vm.PushGlobalGoFunction("toWord", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("toWord", func(ctx *JSVM) int { var word common.Hash if ptr, size := ctx.GetBuffer(-1); ptr != nil { word = common.BytesToHash(makeSlice(ptr, size)) @@ -361,7 +374,7 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { copy(makeSlice(ctx.PushFixedBuffer(32), 32), word[:]) return 1 }) - tracer.vm.PushGlobalGoFunction("toAddress", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("toAddress", func(ctx *JSVM) int { var addr common.Address if ptr, size := ctx.GetBuffer(-1); ptr != nil { addr = common.BytesToAddress(makeSlice(ptr, size)) @@ -372,7 +385,7 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { copy(makeSlice(ctx.PushFixedBuffer(20), 20), addr[:]) return 1 }) - tracer.vm.PushGlobalGoFunction("toContract", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("toContract", func(ctx *JSVM) int { var from common.Address if ptr, size := ctx.GetBuffer(-2); ptr != nil { from = common.BytesToAddress(makeSlice(ptr, size)) @@ -380,13 +393,14 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { from = common.HexToAddress(ctx.GetString(-2)) } nonce := uint64(ctx.GetInt(-1)) - ctx.Pop2() + ctx.Pop() + ctx.Pop() contract := crypto.CreateAddress(from, nonce) copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) return 1 }) - tracer.vm.PushGlobalGoFunction("toContract2", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("toContract2", func(ctx *JSVM) int { var from common.Address if ptr, size := ctx.GetBuffer(-3); ptr != nil { from = common.BytesToAddress(makeSlice(ptr, size)) @@ -403,12 +417,14 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { code = common.FromHex(ctx.GetString(-1)) } codeHash := crypto.Keccak256(code) - ctx.Pop3() + ctx.Pop() + ctx.Pop() + ctx.Pop() contract := crypto.CreateAddress2(from, salt, codeHash) copy(makeSlice(ctx.PushFixedBuffer(20), 20), contract[:]) return 1 }) - tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *JSVM) int { addr := common.BytesToAddress(popSlice(ctx)) for _, p := range tracer.activePrecompiles { if p == addr { @@ -416,15 +432,19 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { return 1 } } - ctx.PushBoolean(false) - _, ok := vm.PrecompiledContractsIstanbul[common.BytesToAddress(popSlice(ctx))] - ctx.PushBoolean(ok) + if _, ok := vm.PrecompiledContractsIstanbul[addr]; ok { + ctx.PushBoolean(true) + return 1 + } + + ctx.PushBoolean(false) return 1 }) - tracer.vm.PushGlobalGoFunction("slice", func(ctx *duktape.Context) int { + tracer.vm.PushGlobalGoFunction("slice", func(ctx *JSVM) int { start, end := ctx.GetInt(-2), ctx.GetInt(-1) - ctx.Pop2() + ctx.Pop() + ctx.Pop() blob := popSlice(ctx) size := end - start @@ -482,22 +502,22 @@ func New(code string, txCtx vm.TxContext) (*Tracer, error) { tracer.contractWrapper.pushObject(tracer.vm) tracer.vm.PutPropString(logObject, "contract") - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.pcValue); return 1 }) + tracer.vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushUint(*tracer.pcValue); return 1 }) tracer.vm.PutPropString(logObject, "getPC") - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.gasValue); return 1 }) + tracer.vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushUint(*tracer.gasValue); return 1 }) tracer.vm.PutPropString(logObject, "getGas") - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.costValue); return 1 }) + tracer.vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushUint(*tracer.costValue); return 1 }) tracer.vm.PutPropString(logObject, "getCost") - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.depthValue); return 1 }) + tracer.vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushUint(*tracer.depthValue); return 1 }) tracer.vm.PutPropString(logObject, "getDepth") - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { ctx.PushUint(*tracer.refundValue); return 1 }) + tracer.vm.PushGoFunction(func(ctx *JSVM) int { ctx.PushUint(*tracer.refundValue); return 1 }) tracer.vm.PutPropString(logObject, "getRefund") - tracer.vm.PushGoFunction(func(ctx *duktape.Context) int { + tracer.vm.PushGoFunction(func(ctx *JSVM) int { if tracer.errorValue != nil { ctx.PushString(*tracer.errorValue) } else { @@ -523,7 +543,7 @@ func (jst *Tracer) Stop(err error) { // call executes a method on a JS object, catching any errors, formatting and // returning them as error objects. -func (jst *Tracer) call(method string, args ...string) (json.RawMessage, error) { +func (jst *Tracer) call(noret bool, method string, args ...string) (json.RawMessage, error) { // Execute the JavaScript call and return any error jst.vm.PushString(method) for _, arg := range args { @@ -536,8 +556,21 @@ func (jst *Tracer) call(method string, args ...string) (json.RawMessage, error) err := jst.vm.SafeToString(-1) return nil, errors.New(err) } - // No error occurred, extract return value and return - return json.RawMessage(jst.vm.JsonEncode(-1)), nil + if noret { + return nil, nil + } + // Push a JSON marshaller onto the stack. We can't marshal from the out- + // side because duktape can crash on large nestings and we can't catch + // C++ exceptions ourselves from Go. TODO(karalabe): Yuck, why wrap?! + jst.vm.PushString("(JSON.stringify)") + jst.vm.Eval() + + jst.vm.Swap(-1, -2) + if code = jst.vm.Pcall(1); code != 0 { + err := jst.vm.SafeToString(-1) + return nil, errors.New(err) + } + return json.RawMessage(jst.vm.SafeToString(-1)), nil } func wrapError(context string, err error) error { @@ -545,9 +578,9 @@ func wrapError(context string, err error) error { } // CaptureStart implements the Tracer interface to initialize the tracing operation. -func (jst *Tracer) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { +func (jst *Tracer) CaptureStart(env *vm.EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, code []byte) { if depth != 0 { - return nil + return } jst.ctx["type"] = "CALL" if create { @@ -557,94 +590,80 @@ func (jst *Tracer) CaptureStart(depth int, from common.Address, to common.Addres jst.ctx["to"] = to jst.ctx["input"] = input jst.ctx["gas"] = gas + jst.ctx["gasPrice"] = env.TxContext().GasPrice jst.ctx["value"] = value - return nil + // Initialize the context + jst.ctx["block"] = env.Context().BlockNumber + jst.dbWrapper.db = env.IntraBlockState() + // Compute intrinsic gas + isHomestead := env.ChainConfig().IsHomestead(env.Context().BlockNumber) + isIstanbul := env.ChainConfig().IsIstanbul(env.Context().BlockNumber) + intrinsicGas, err := core.IntrinsicGas(input, nil, jst.ctx["type"] == "CREATE", isHomestead, isIstanbul) + if err != nil { + return + } + jst.ctx["intrinsicGas"] = intrinsicGas } // CaptureState implements the Tracer interface to trace a single step of VM execution. -func (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, rdata []byte, contract *vm.Contract, depth int, err error) error { - if jst.err == nil { - // Initialize the context if it wasn't done yet - if !jst.inited { - // Update list of precompiles based on current block - rules := env.ChainConfig().Rules(env.Context.BlockNumber) - jst.activePrecompiles = vm.ActivePrecompiles(rules) - - jst.ctx["block"] = env.Context.BlockNumber - // Compute intrinsic gas - isHomestead := env.ChainRules.IsHomestead - isIstanbul := env.ChainRules.IsIstanbul - var input []byte - if data, ok := jst.ctx["input"].([]byte); ok { - input = data - } - intrinsicGas, err1 := core.IntrinsicGas(input, nil, jst.ctx["type"] == "CREATE", isHomestead, isIstanbul) - if err1 != nil { - return err1 - } - jst.ctx["intrinsicGas"] = intrinsicGas - jst.inited = true - } - // If tracing was interrupted, set the error and stop - if atomic.LoadUint32(&jst.interrupt) > 0 { - jst.err = jst.reason - return nil - } - jst.opWrapper.op = op - jst.stackWrapper.stack = stack - jst.memoryWrapper.memory = memory - jst.contractWrapper.contract = contract - jst.dbWrapper.db = env.IntraBlockState - - *jst.pcValue = uint(pc) - *jst.gasValue = uint(gas) - *jst.costValue = uint(cost) - *jst.depthValue = uint(depth) - *jst.refundValue = uint(env.IntraBlockState.GetRefund()) - - jst.errorValue = nil - if err != nil { - jst.errorValue = new(string) - *jst.errorValue = err.Error() - } - _, err := jst.call("step", "log", "db") - if err != nil { - jst.err = wrapError("step", err) - } +func (jst *Tracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rdata []byte, depth int, err error) { + if jst.err != nil { + return + } + // If tracing was interrupted, set the error and stop + if atomic.LoadUint32(&jst.interrupt) > 0 { + jst.err = jst.reason + return + } + jst.opWrapper.op = op + jst.stackWrapper.stack = scope.Stack + jst.memoryWrapper.memory = scope.Memory + jst.contractWrapper.contract = scope.Contract + + *jst.pcValue = uint(pc) + *jst.gasValue = uint(gas) + *jst.costValue = uint(cost) + *jst.depthValue = uint(depth) + *jst.refundValue = uint(env.IntraBlockState().GetRefund()) + + jst.errorValue = nil + if err != nil { + jst.errorValue = new(string) + *jst.errorValue = err.Error() + } + + if _, err := jst.call(true, "step", "log", "db"); err != nil { + jst.err = wrapError("step", err) } - return nil } // CaptureFault implements the Tracer interface to trace an execution fault // while running an opcode. -func (jst *Tracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, contract *vm.Contract, depth int, err error) error { - if jst.err == nil { - // Apart from the error, everything matches the previous invocation - jst.errorValue = new(string) - *jst.errorValue = err.Error() - - _, err := jst.call("fault", "log", "db") - if err != nil { - jst.err = wrapError("fault", err) - } +func (jst *Tracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { + if jst.err != nil { + return + } + // Apart from the error, everything matches the previous invocation + jst.errorValue = new(string) + *jst.errorValue = err.Error() + if _, err := jst.call(true, "fault", "log", "db"); err != nil { + jst.err = wrapError("fault", err) } - return nil } // CaptureEnd is called after the call finishes to finalize the tracing. -func (jst *Tracer) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { +func (jst *Tracer) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { if depth != 0 { - return nil + return } jst.ctx["output"] = output jst.ctx["time"] = t.String() - jst.ctx["gasUsed"] = gasUsed + jst.ctx["gasUsed"] = startGas - endGas if err != nil { jst.ctx["error"] = err.Error() } - return nil } func (jst *Tracer) CaptureSelfDestruct(from, to common.Address, value *big.Int) { @@ -697,13 +716,10 @@ func (jst *Tracer) GetResult() (json.RawMessage, error) { jst.vm.PutPropString(jst.stateObject, "ctx") // Finalize the trace and return the results - result, err := jst.call("result", "ctx", "db") + result, err := jst.call(false, "result", "ctx", "db") if err != nil { jst.err = wrapError("result", err) } - // Clean up the JavaScript environment - jst.vm.DestroyHeap() - jst.vm.Destroy() return result, jst.err } diff --git a/eth/tracers/tracer_test.go b/eth/tracers/tracer_test.go index 44e509f4e29..1365b257a8a 100644 --- a/eth/tracers/tracer_test.go +++ b/eth/tracers/tracer_test.go @@ -48,7 +48,8 @@ type dummyStatedb struct { state.IntraBlockState } -func (*dummyStatedb) GetRefund() uint64 { return 1337 } +func (*dummyStatedb) GetRefund() uint64 { return 1337 } +func (*dummyStatedb) GetBalance(addr common.Address) *uint256.Int { return uint256.NewInt(0) } type vmContext struct { blockCtx vm.BlockContext @@ -57,8 +58,8 @@ type vmContext struct { func testCtx() *vmContext { return &vmContext{blockCtx: vm.BlockContext{ - BlockNumber: 1, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + BlockNumber: 1, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}} } @@ -71,13 +72,9 @@ func runTrace(tracer *Tracer, vmctx *vmContext) (json.RawMessage, error) { contract := vm.NewContract(account{}, account{}, value, startGas, false, false) contract.Code = []byte{byte(vm.PUSH1), 0x1, byte(vm.PUSH1), 0x1, 0x0} - if err := tracer.CaptureStart(0, contract.Caller(), contract.Address(), false, false, vm.CallType(0), []byte{}, startGas, big.NewInt(int64(value.Uint64())), contract.CodeHash); err != nil { - return nil, err - } + tracer.CaptureStart(env, 0, contract.Caller(), contract.Address(), false, false, vm.CallType(0), []byte{}, startGas, big.NewInt(int64(value.Uint64())), contract.Code) ret, err := env.Interpreter().Run(contract, []byte{}, false) - if err1 := tracer.CaptureEnd(0, ret, startGas-contract.Gas, 1, err); err1 != nil { - return nil, err1 - } + tracer.CaptureEnd(0, ret, startGas, contract.Gas, 1, err) if err != nil { return nil, err } @@ -85,29 +82,30 @@ func runTrace(tracer *Tracer, vmctx *vmContext) (json.RawMessage, error) { } func TestTracer(t *testing.T) { - execTracer := func(code string) []byte { + execTracer := func(code string) ([]byte, string) { t.Helper() ctx := &vmContext{blockCtx: vm.BlockContext{ - BlockNumber: 1, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + BlockNumber: 1, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}} - tracer, err := New(code, ctx.txCtx) + tracer, err := New(code, new(Context)) if err != nil { t.Fatal(err) } ret, err := runTrace(tracer, ctx) if err != nil { - t.Fatal(err) + return nil, err.Error() } - return ret + return ret, "" } for i, tt := range []struct { code string want string + fail string }{ { // tests that we don't panic on bad arguments to memory access code: "{depths: [], step: function(log) { this.depths.push(log.memory.slice(-1,-2)); }, fault: function() {}, result: function() { return this.depths; }}", - want: `[{},{},{}]`, + want: `[[],[],[]]`, }, { // tests that we don't panic on bad arguments to stack peeks code: "{depths: [], step: function(log) { this.depths.push(log.stack.peek(-1)); }, fault: function() {}, result: function() { return this.depths; }}", want: `["0","0","0"]`, @@ -128,8 +126,8 @@ func TestTracer(t *testing.T) { want: `"100000.6.21000"`, }, } { - if have := execTracer(tt.code); tt.want != string(have) { - t.Errorf("testcase %d: expected return value to be %s got %s\n\tcode: %v", i, tt.want, string(have), tt.code) + if have, err := execTracer(tt.code); tt.want != string(have) || tt.fail != err { + t.Errorf("testcase %d: expected return value to be '%s' got '%s', error to be '%s' got '%s'\n\tcode: %v", i, tt.want, string(have), tt.fail, err, tt.code) } } } @@ -139,7 +137,7 @@ func TestHalt(t *testing.T) { timeout := errors.New("stahp") vmctx := testCtx() - tracer, err := New("{step: function() { while(1); }, result: function() { return null; }}", vmctx.txCtx) + tracer, err := New("{step: function() { while(1); }, result: function() { return null; }}", new(Context)) if err != nil { t.Fatal(err) } @@ -155,23 +153,61 @@ func TestHalt(t *testing.T) { } func TestHaltBetweenSteps(t *testing.T) { - vmctx := testCtx() - tracer, err := New("{step: function() {}, fault: function() {}, result: function() { return null; }}", vmctx.txCtx) + tracer, err := New("{step: function() {}, fault: function() {}, result: function() { return null; }}", new(Context)) if err != nil { t.Fatal(err) } env := vm.NewEVM(vm.BlockContext{ - BlockNumber: 1, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + BlockNumber: 1, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, }, vm.TxContext{}, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) contract := vm.NewContract(&account{}, &account{}, uint256.NewInt(0), 0, false, false) - tracer.CaptureState(env, 0, 0, 0, 0, nil, nil, nil, contract, 0, nil) //nolint:errcheck + tracer.CaptureState(env, 0, 0, 0, 0, &vm.ScopeContext{Contract: contract}, nil, 0, nil) //nolint:errcheck timeout := errors.New("stahp") tracer.Stop(timeout) - tracer.CaptureState(env, 0, 0, 0, 0, nil, nil, nil, contract, 0, nil) //nolint:errcheck + tracer.CaptureState(env, 0, 0, 0, 0, &vm.ScopeContext{Contract: contract}, nil, 0, nil) //nolint:errcheck if _, err := tracer.GetResult(); err.Error() != timeout.Error() { t.Errorf("Expected timeout error, got %v", err) } } + +// TestNoStepExec tests a regular value transfer (no exec), and accessing the statedb +// in 'result' +func TestNoStepExec(t *testing.T) { + runEmptyTrace := func(tracer *Tracer, vmctx *vmContext) (json.RawMessage, error) { + env := vm.NewEVM(vmctx.blockCtx, vmctx.txCtx, &dummyStatedb{}, params.TestChainConfig, vm.Config{Debug: true, Tracer: tracer}) + startGas := uint64(10000) + contract := vm.NewContract(account{}, account{}, uint256.NewInt(1), startGas, true, false) + tracer.CaptureStart(env, 0, contract.Caller(), contract.Address(), false, false, vm.CALLT, nil, 0, big.NewInt(0), nil) + tracer.CaptureEnd(0, nil, startGas-contract.Gas, 1, 0, nil) + return tracer.GetResult() + } + execTracer := func(code string) []byte { + t.Helper() + ctx := &vmContext{blockCtx: vm.BlockContext{BlockNumber: 1}, txCtx: vm.TxContext{GasPrice: big.NewInt(100000)}} + tracer, err := New(code, new(Context)) + if err != nil { + t.Fatal(err) + } + ret, err := runEmptyTrace(tracer, ctx) + if err != nil { + t.Fatal(err) + } + return ret + } + for i, tt := range []struct { + code string + want string + }{ + { // tests that we don't panic on accessing the db methods + code: "{depths: [], step: function() {}, fault: function() {}, result: function(ctx, db){ return db.getBalance(ctx.to)} }", + want: `"0"`, + }, + } { + if have := execTracer(tt.code); tt.want != string(have) { + t.Errorf("testcase %d: expected return value to be %s got %s\n\tcode: %v", i, tt.want, string(have), tt.code) + } + } +} diff --git a/eth/tracers/tracers_test.go b/eth/tracers/tracers_test.go index 65dfac255fa..36b31c447c3 100644 --- a/eth/tracers/tracers_test.go +++ b/eth/tracers/tracers_test.go @@ -21,8 +21,8 @@ import ( "crypto/ecdsa" "crypto/rand" "encoding/json" - "io/ioutil" "math/big" + "os" "path/filepath" "reflect" "strings" @@ -152,14 +152,14 @@ func TestPrestateTracerCreate2(t *testing.T) { GasPrice: big.NewInt(1), } context := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - Coinbase: common.Address{}, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, - BlockNumber: 8000000, - Time: 5, - Difficulty: big.NewInt(0x30000), - GasLimit: uint64(6000000), + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Coinbase: common.Address{}, + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, + BlockNumber: 8000000, + Time: 5, + Difficulty: big.NewInt(0x30000), + GasLimit: uint64(6000000), } alloc := core.GenesisAlloc{} @@ -177,16 +177,17 @@ func TestPrestateTracerCreate2(t *testing.T) { } _, tx := memdb.NewTestTx(t) - statedb, _ := tests.MakePreState(params.Rules{}, tx, alloc, context.BlockNumber) + rules := ¶ms.Rules{} + statedb, _ := tests.MakePreState(rules, tx, alloc, context.BlockNumber) // Create the tracer, the EVM environment and run it - tracer, err := New("prestateTracer", txContext) + tracer, err := New("prestateTracer", new(Context)) if err != nil { t.Fatalf("failed to create call tracer: %v", err) } evm := vm.NewEVM(context, txContext, statedb, params.MainnetChainConfig, vm.Config{Debug: true, Tracer: tracer}) - msg, err := txn.AsMessage(*signer, nil) + msg, err := txn.AsMessage(*signer, nil, rules) if err != nil { t.Fatalf("failed to prepare transaction for tracing: %v", err) } @@ -211,7 +212,7 @@ func TestPrestateTracerCreate2(t *testing.T) { // Iterates over all the input-output datasets in the tracer test harness and // runs the JavaScript tracers against them. func TestCallTracer(t *testing.T) { - files, filesErr := ioutil.ReadDir("testdata") + files, filesErr := os.ReadDir("testdata") if filesErr != nil { t.Fatalf("failed to retrieve tracer test suite: %v", filesErr) } @@ -224,7 +225,7 @@ func TestCallTracer(t *testing.T) { t.Parallel() // Call tracer test found, read if from disk - blob, blobErr := ioutil.ReadFile(filepath.Join("testdata", file.Name())) + blob, blobErr := os.ReadFile(filepath.Join("testdata", file.Name())) if blobErr != nil { t.Fatalf("failed to read testcase: %v", blobErr) } @@ -244,28 +245,29 @@ func TestCallTracer(t *testing.T) { GasPrice: big.NewInt(int64(txn.GetPrice().Uint64())), } context := vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - Coinbase: test.Context.Miner, - BlockNumber: uint64(test.Context.Number), - Time: uint64(test.Context.Time), - Difficulty: (*big.Int)(test.Context.Difficulty), - GasLimit: uint64(test.Context.GasLimit), - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + Coinbase: test.Context.Miner, + BlockNumber: uint64(test.Context.Number), + Time: uint64(test.Context.Time), + Difficulty: (*big.Int)(test.Context.Difficulty), + GasLimit: uint64(test.Context.GasLimit), + ContractHasTEVM: func(common.Hash) (bool, error) { return false, nil }, } _, tx := memdb.NewTestTx(t) - statedb, err := tests.MakePreState(params.Rules{}, tx, test.Genesis.Alloc, uint64(test.Context.Number)) + rules := ¶ms.Rules{} + statedb, err := tests.MakePreState(rules, tx, test.Genesis.Alloc, uint64(test.Context.Number)) require.NoError(t, err) // Create the tracer, the EVM environment and run it - tracer, err := New("callTracer", txContext) + tracer, err := New("callTracer", new(Context)) if err != nil { t.Fatalf("failed to create call tracer: %v", err) } evm := vm.NewEVM(context, txContext, statedb, test.Genesis.Config, vm.Config{Debug: true, Tracer: tracer}) - msg, err := txn.AsMessage(*signer, nil) + msg, err := txn.AsMessage(*signer, nil, rules) if err != nil { t.Fatalf("failed to prepare transaction for tracing: %v", err) } diff --git a/ethdb/bitmapdb/dbutils.go b/ethdb/bitmapdb/dbutils.go index 0e2fae7e542..b8810d8ebef 100644 --- a/ethdb/bitmapdb/dbutils.go +++ b/ethdb/bitmapdb/dbutils.go @@ -8,8 +8,8 @@ import ( "github.com/RoaringBitmap/roaring" "github.com/RoaringBitmap/roaring/roaring64" "github.com/c2h5oh/datasize" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/ethdb" ) @@ -113,7 +113,7 @@ func TruncateRange(db kv.RwTx, bucket string, key []byte, to uint32) error { if _, err := chunk.WriteTo(buf); err != nil { return err } - return db.Put(bucket, chunkKey, common.CopyBytes(buf.Bytes())) + return db.Put(bucket, chunkKey, libcommon.Copy(buf.Bytes())) }) } @@ -130,19 +130,21 @@ func Get(db kv.Tx, bucket string, key []byte, from, to uint32) (*roaring.Bitmap, return nil, err } defer c.Close() - if err := ethdb.Walk(c, fromKey, len(key)*8, func(k, v []byte) (bool, error) { - bm := roaring.New() - _, err := bm.ReadFrom(bytes.NewReader(v)) + for k, v, err := c.Seek(fromKey); k != nil; k, v, err = c.Next() { if err != nil { - return false, err + return nil, err + } + if !bytes.HasPrefix(k, key) { + break + } + bm := roaring.New() + if _, err := bm.ReadFrom(bytes.NewReader(v)); err != nil { + return nil, err } chunks = append(chunks, bm) if binary.BigEndian.Uint32(k[len(k)-4:]) >= to { - return false, nil + break } - return true, nil - }); err != nil { - return nil, err } if len(chunks) == 0 { @@ -265,7 +267,7 @@ func TruncateRange64(db kv.RwTx, bucket string, key []byte, to uint64) error { if _, err := chunk.WriteTo(buf); err != nil { return err } - return db.Put(bucket, chunkKey, common.CopyBytes(buf.Bytes())) + return db.Put(bucket, chunkKey, libcommon.Copy(buf.Bytes())) }) } @@ -283,19 +285,22 @@ func Get64(db kv.Tx, bucket string, key []byte, from, to uint64) (*roaring64.Bit return nil, err } defer c.Close() - if err := ethdb.Walk(c, fromKey, len(key)*8, func(k, v []byte) (bool, error) { + for k, v, err := c.Seek(fromKey); k != nil; k, v, err = c.Next() { + if err != nil { + return nil, err + } + if !bytes.HasPrefix(k, key) { + break + } bm := roaring64.New() _, err := bm.ReadFrom(bytes.NewReader(v)) if err != nil { - return false, err + return nil, err } chunks = append(chunks, bm) if binary.BigEndian.Uint64(k[len(k)-8:]) >= to { - return false, nil + break } - return true, nil - }); err != nil { - return nil, err } if len(chunks) == 0 { @@ -306,11 +311,16 @@ func Get64(db kv.Tx, bucket string, key []byte, from, to uint64) (*roaring64.Bit // SeekInBitmap - returns value in bitmap which is >= n func SeekInBitmap64(m *roaring64.Bitmap, n uint64) (found uint64, ok bool) { - i := m.Iterator() - i.AdvanceIfNeeded(n) - ok = i.HasNext() - if ok { - found = i.Next() + if m.IsEmpty() { + return 0, false } - return found, ok + if n == 0 { + return m.Minimum(), true + } + searchRank := m.Rank(n - 1) + if searchRank >= m.GetCardinality() { + return 0, false + } + found, _ = m.Select(searchRank) + return found, true } diff --git a/ethdb/kv_util.go b/ethdb/kv_util.go index 586d294e076..c64656521ce 100644 --- a/ethdb/kv_util.go +++ b/ethdb/kv_util.go @@ -32,16 +32,16 @@ func Walk(c kv.Cursor, startkey []byte, fixedbits int, walker func(k, v []byte) } // todo: return TEVM code and use it -func GetCheckTEVM(db kv.Getter) func(contractHash common.Hash) (bool, error) { - checked := map[common.Hash]struct{}{} +func GetHasTEVM(db kv.Has) func(contractHash common.Hash) (bool, error) { + contractsWithTEVM := map[common.Hash]struct{}{} var ok bool return func(contractHash common.Hash) (bool, error) { if contractHash == (common.Hash{}) { - return true, nil + return false, nil } - if _, ok = checked[contractHash]; ok { + if _, ok = contractsWithTEVM[contractHash]; ok { return true, nil } @@ -51,11 +51,15 @@ func GetCheckTEVM(db kv.Getter) func(contractHash common.Hash) (bool, error) { contractHash.String(), err) } - if !ok { - checked[contractHash] = struct{}{} + if errors.Is(err, ErrKeyNotFound) { + return false, nil + } + + if ok { + contractsWithTEVM[contractHash] = struct{}{} } - return ok, nil + return true, nil } } diff --git a/ethdb/olddb/database_test.go b/ethdb/olddb/database_test.go index 3294936571a..ef34aa8efee 100644 --- a/ethdb/olddb/database_test.go +++ b/ethdb/olddb/database_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build !js +//go:build !js package olddb diff --git a/ethdb/olddb/mapmutation.go b/ethdb/olddb/mapmutation.go new file mode 100644 index 00000000000..f7bd4c19ae2 --- /dev/null +++ b/ethdb/olddb/mapmutation.go @@ -0,0 +1,322 @@ +package olddb + +import ( + "context" + "encoding/binary" + "fmt" + "sync" + "time" + "unsafe" + + lru "github.com/hashicorp/golang-lru" + "github.com/ledgerwatch/erigon-lib/etl" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/ethdb" + "github.com/ledgerwatch/log/v3" +) + +type mapmutation struct { + puts map[string]map[string][]byte + whitelistedTables map[string]byte + whitelistCache *lru.Cache + db kv.RwTx + quit <-chan struct{} + clean func() + mu sync.RWMutex + size int + count uint64 + tmpdir string +} + +// NewBatch - starts in-mem batch +// +// Common pattern: +// +// batch := db.NewBatch() +// defer batch.Rollback() +// ... some calculations on `batch` +// batch.Commit() +func NewHashBatch(tx kv.RwTx, quit <-chan struct{}, tmpdir string, whitelistedTables []string, whitelistCache *lru.Cache) *mapmutation { + clean := func() {} + if quit == nil { + ch := make(chan struct{}) + clean = func() { close(ch) } + quit = ch + } + + whitelistedTablesMap := make(map[string]byte) + for idx, table := range whitelistedTables { + whitelistedTablesMap[table] = byte(idx) + } + return &mapmutation{ + db: tx, + puts: make(map[string]map[string][]byte), + whitelistCache: whitelistCache, + quit: quit, + clean: clean, + tmpdir: tmpdir, + whitelistedTables: make(map[string]byte), + } +} + +func (m *mapmutation) makeCacheKey(table string, key []byte) string { + return string(append(key, m.whitelistedTables[table])) +} + +func (m *mapmutation) RwKV() kv.RwDB { + if casted, ok := m.db.(ethdb.HasRwKV); ok { + return casted.RwKV() + } + return nil +} + +func (m *mapmutation) isWhitelisted(table string) bool { + _, ok := m.whitelistedTables[table] + return ok +} + +func (m *mapmutation) getMem(table string, key []byte) ([]byte, bool) { + m.mu.RLock() + defer m.mu.RUnlock() + if _, ok := m.puts[table]; !ok { + return nil, false + } + if value, ok := m.puts[table][*(*string)(unsafe.Pointer(&key))]; ok { + return value, ok + } + + if m.whitelistCache != nil && m.isWhitelisted(table) { + if value, ok := m.whitelistCache.Get(m.makeCacheKey(table, key)); ok { + return value.([]byte), ok + } + } + return nil, false +} + +func (m *mapmutation) IncrementSequence(bucket string, amount uint64) (res uint64, err error) { + v, ok := m.getMem(kv.Sequence, []byte(bucket)) + if !ok && m.db != nil { + v, err = m.db.GetOne(kv.Sequence, []byte(bucket)) + if err != nil { + return 0, err + } + } + + var currentV uint64 = 0 + if len(v) > 0 { + currentV = binary.BigEndian.Uint64(v) + } + + newVBytes := make([]byte, 8) + binary.BigEndian.PutUint64(newVBytes, currentV+amount) + if err = m.Put(kv.Sequence, []byte(bucket), newVBytes); err != nil { + return 0, err + } + + return currentV, nil +} +func (m *mapmutation) ReadSequence(bucket string) (res uint64, err error) { + v, ok := m.getMem(kv.Sequence, []byte(bucket)) + if !ok && m.db != nil { + v, err = m.db.GetOne(kv.Sequence, []byte(bucket)) + if err != nil { + return 0, err + } + } + var currentV uint64 = 0 + if len(v) > 0 { + currentV = binary.BigEndian.Uint64(v) + } + + return currentV, nil +} + +// Can only be called from the worker thread +func (m *mapmutation) GetOne(table string, key []byte) ([]byte, error) { + if value, ok := m.getMem(table, key); ok { + if value == nil { + return nil, nil + } + return value, nil + } + if m.db != nil { + // TODO: simplify when tx can no longer be parent of mutation + value, err := m.db.GetOne(table, key) + if err != nil { + return nil, err + } + if m.whitelistCache != nil && m.isWhitelisted(table) { + m.whitelistCache.Add(m.makeCacheKey(table, key), value) + } + + return value, nil + } + return nil, nil +} + +// Can only be called from the worker thread +func (m *mapmutation) Get(table string, key []byte) ([]byte, error) { + value, err := m.GetOne(table, key) + if err != nil { + return nil, err + } + + if value == nil { + return nil, ethdb.ErrKeyNotFound + } + + return value, nil +} + +func (m *mapmutation) Last(table string) ([]byte, []byte, error) { + c, err := m.db.Cursor(table) + if err != nil { + return nil, nil, err + } + defer c.Close() + return c.Last() +} + +func (m *mapmutation) Has(table string, key []byte) (bool, error) { + if _, ok := m.getMem(table, key); ok { + return ok, nil + } + if m.db != nil { + return m.db.Has(table, key) + } + return false, nil +} + +func (m *mapmutation) Put(table string, key []byte, value []byte) error { + m.mu.Lock() + defer m.mu.Unlock() + if _, ok := m.puts[table]; !ok { + m.puts[table] = make(map[string][]byte) + } + + stringKey := *(*string)(unsafe.Pointer(&key)) + + var ok bool + if _, ok = m.puts[table][stringKey]; !ok { + m.size += len(value) - len(m.puts[table][stringKey]) + m.puts[table][stringKey] = value + return nil + } + m.puts[table][stringKey] = value + m.size += len(key) + len(value) + m.count++ + return nil +} + +func (m *mapmutation) Append(table string, key []byte, value []byte) error { + return m.Put(table, key, value) +} + +func (m *mapmutation) AppendDup(table string, key []byte, value []byte) error { + return m.Put(table, key, value) +} + +func (m *mapmutation) BatchSize() int { + m.mu.RLock() + defer m.mu.RUnlock() + return m.size +} + +func (m *mapmutation) ForEach(bucket string, fromPrefix []byte, walker func(k, v []byte) error) error { + m.panicOnEmptyDB() + return m.db.ForEach(bucket, fromPrefix, walker) +} + +func (m *mapmutation) ForPrefix(bucket string, prefix []byte, walker func(k, v []byte) error) error { + m.panicOnEmptyDB() + return m.db.ForPrefix(bucket, prefix, walker) +} + +func (m *mapmutation) ForAmount(bucket string, prefix []byte, amount uint32, walker func(k, v []byte) error) error { + m.panicOnEmptyDB() + return m.db.ForAmount(bucket, prefix, amount, walker) +} + +func (m *mapmutation) Delete(table string, k, v []byte) error { + if v != nil { + return m.db.Delete(table, k, v) // TODO: mutation to support DupSort deletes + } + return m.Put(table, k, nil) +} + +func (m *mapmutation) doCommit(tx kv.RwTx) error { + logEvery := time.NewTicker(30 * time.Second) + defer logEvery.Stop() + count := 0 + total := float64(m.count) + for table, bucket := range m.puts { + collector := etl.NewCollector("", m.tmpdir, etl.NewSortableBuffer(etl.BufferOptimalSize)) + defer collector.Close() + for key, value := range bucket { + collector.Collect([]byte(key), value) + // Update cache on commits + if m.isWhitelisted(table) { + m.whitelistCache.Add(m.makeCacheKey(table, []byte(key)), value) + } + count++ + select { + default: + case <-logEvery.C: + progress := fmt.Sprintf("%.1fM/%.1fM", float64(count)/1_000_000, total/1_000_000) + log.Info("Write to db", "progress", progress, "current table", table) + tx.CollectMetrics() + } + } + if err := collector.Load(m.db, table, etl.IdentityLoadFunc, etl.TransformArgs{Quit: m.quit}); err != nil { + return err + } + } + + tx.CollectMetrics() + return nil +} + +func (m *mapmutation) Commit() error { + if m.db == nil { + return nil + } + m.mu.Lock() + defer m.mu.Unlock() + if err := m.doCommit(m.db); err != nil { + return err + } + + m.puts = map[string]map[string][]byte{} + m.size = 0 + m.count = 0 + m.clean() + return nil +} + +func (m *mapmutation) Rollback() { + m.mu.Lock() + defer m.mu.Unlock() + m.puts = map[string]map[string][]byte{} + m.size = 0 + m.count = 0 + m.size = 0 + m.clean() +} + +func (m *mapmutation) Close() { + m.Rollback() +} + +func (m *mapmutation) Begin(ctx context.Context, flags ethdb.TxFlags) (ethdb.DbWithPendingMutations, error) { + panic("mutation can't start transaction, because doesn't own it") +} + +func (m *mapmutation) panicOnEmptyDB() { + if m.db == nil { + panic("Not implemented") + } +} + +func (m *mapmutation) SetRwKV(kv kv.RwDB) { + m.db.(ethdb.HasRwKV).SetRwKV(kv) +} diff --git a/ethdb/olddb/miningmutation.go b/ethdb/olddb/miningmutation.go new file mode 100644 index 00000000000..7581ac1f797 --- /dev/null +++ b/ethdb/olddb/miningmutation.go @@ -0,0 +1,318 @@ +package olddb + +import ( + "context" + "encoding/binary" + + "github.com/ledgerwatch/log/v3" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/ethdb" +) + +type miningmutation struct { + // Bucket => Key => Value + memTx kv.RwTx + memDb kv.RwDB + deletedEntries map[string]map[string]struct{} + clearedTables map[string]struct{} + dupsortTables map[string]struct{} + db kv.Tx +} + +// NewBatch - starts in-mem batch +// +// Common pattern: +// +// batch := db.NewBatch() +// defer batch.Rollback() +// ... some calculations on `batch` +// batch.Commit() +func NewMiningBatch(tx kv.Tx) *miningmutation { + tmpDB := mdbx.NewMDBX(log.New()).InMem().MustOpen() + memTx, err := tmpDB.BeginRw(context.Background()) + if err != nil { + panic(err) + } + return &miningmutation{ + db: tx, + memDb: tmpDB, + memTx: memTx, + deletedEntries: make(map[string]map[string]struct{}), + clearedTables: make(map[string]struct{}), + dupsortTables: map[string]struct{}{ + kv.AccountChangeSet: {}, + kv.StorageChangeSet: {}, + kv.HashedStorage: {}, + }, + } +} + +func (m *miningmutation) RwKV() kv.RwDB { + if casted, ok := m.db.(ethdb.HasRwKV); ok { + return casted.RwKV() + } + return nil +} + +func (m *miningmutation) isTableCleared(table string) bool { + _, ok := m.clearedTables[table] + return ok +} + +func (m *miningmutation) isEntryDeleted(table string, key []byte) bool { + _, ok := m.deletedEntries[table] + if !ok { + return ok + } + _, ok = m.deletedEntries[table][string(key)] + return ok +} + +// getMem Retrieve database entry from memory (hashed storage will be left out for now because it is the only non auto-DupSorted table) +func (m *miningmutation) getMem(table string, key []byte) ([]byte, bool) { + val, err := m.memTx.GetOne(table, key) + if err != nil { + panic(err) + } + return val, val != nil +} + +func (m *miningmutation) IncrementSequence(bucket string, amount uint64) (res uint64, err error) { + v, ok := m.getMem(kv.Sequence, []byte(bucket)) + if !ok && m.db != nil { + v, err = m.db.GetOne(kv.Sequence, []byte(bucket)) + if err != nil { + return 0, err + } + } + + var currentV uint64 = 0 + if len(v) > 0 { + currentV = binary.BigEndian.Uint64(v) + } + + newVBytes := make([]byte, 8) + binary.BigEndian.PutUint64(newVBytes, currentV+amount) + if err = m.Put(kv.Sequence, []byte(bucket), newVBytes); err != nil { + return 0, err + } + + return currentV, nil +} + +func (m *miningmutation) ReadSequence(bucket string) (res uint64, err error) { + v, ok := m.getMem(kv.Sequence, []byte(bucket)) + if !ok && m.db != nil { + v, err = m.db.GetOne(kv.Sequence, []byte(bucket)) + if err != nil { + return 0, err + } + } + var currentV uint64 = 0 + if len(v) > 0 { + currentV = binary.BigEndian.Uint64(v) + } + + return currentV, nil +} + +// Can only be called from the worker thread +func (m *miningmutation) GetOne(table string, key []byte) ([]byte, error) { + if value, ok := m.getMem(table, key); ok { + if value == nil { + return nil, nil + } + return value, nil + } + if m.db != nil && !m.isTableCleared(table) && !m.isEntryDeleted(table, key) { + // TODO: simplify when tx can no longer be parent of mutation + value, err := m.db.GetOne(table, key) + if err != nil { + return nil, err + } + return value, nil + } + return nil, nil +} + +// Can only be called from the worker thread +func (m *miningmutation) Get(table string, key []byte) ([]byte, error) { + value, err := m.GetOne(table, key) + if err != nil { + return nil, err + } + + if value == nil { + return nil, ethdb.ErrKeyNotFound + } + + return value, nil +} + +func (m *miningmutation) Last(table string) ([]byte, []byte, error) { + panic("not implemented. (miningmutation.Last)") +} + +// Has return whether a key is present in a certain table. +func (m *miningmutation) Has(table string, key []byte) (bool, error) { + if _, ok := m.getMem(table, key); ok { + return ok, nil + } + if m.db != nil { + return m.db.Has(table, key) + } + return false, nil +} + +// Put insert a new entry in the database, if it is hashed storage it will add it to a slice instead of a map. +func (m *miningmutation) Put(table string, key []byte, value []byte) error { + return m.memTx.Put(table, key, value) +} + +func (m *miningmutation) Append(table string, key []byte, value []byte) error { + return m.Put(table, key, value) +} + +func (m *miningmutation) AppendDup(table string, key []byte, value []byte) error { + return m.Put(table, key, value) +} + +func (m *miningmutation) BatchSize() int { + return 0 +} + +func (m *miningmutation) ForEach(bucket string, fromPrefix []byte, walker func(k, v []byte) error) error { + m.panicOnEmptyDB() + return m.db.ForEach(bucket, fromPrefix, walker) +} + +func (m *miningmutation) ForPrefix(bucket string, prefix []byte, walker func(k, v []byte) error) error { + m.panicOnEmptyDB() + return m.db.ForPrefix(bucket, prefix, walker) +} + +func (m *miningmutation) ForAmount(bucket string, prefix []byte, amount uint32, walker func(k, v []byte) error) error { + m.panicOnEmptyDB() + return m.db.ForAmount(bucket, prefix, amount, walker) +} + +func (m *miningmutation) Delete(table string, k, v []byte) error { + if _, ok := m.deletedEntries[table]; !ok { + m.deletedEntries[table] = make(map[string]struct{}) + } + m.deletedEntries[table][string(k)] = struct{}{} + return m.memTx.Delete(table, k, v) +} + +func (m *miningmutation) Commit() error { + return nil +} + +func (m *miningmutation) Rollback() { + m.memTx.Rollback() + m.memDb.Close() + return +} + +func (m *miningmutation) Close() { + m.Rollback() +} + +func (m *miningmutation) Begin(ctx context.Context, flags ethdb.TxFlags) (ethdb.DbWithPendingMutations, error) { + panic("mutation can't start transaction, because doesn't own it") +} + +func (m *miningmutation) panicOnEmptyDB() { + if m.db == nil { + panic("Not implemented") + } +} + +func (m *miningmutation) SetRwKV(kv kv.RwDB) { + m.db.(ethdb.HasRwKV).SetRwKV(kv) +} + +func (m *miningmutation) BucketSize(bucket string) (uint64, error) { + return 0, nil +} + +func (m *miningmutation) DropBucket(bucket string) error { + panic("Not implemented") +} + +func (m *miningmutation) ExistsBucket(bucket string) (bool, error) { + panic("Not implemented") +} + +func (m *miningmutation) ListBuckets() ([]string, error) { + panic("Not implemented") +} + +func (m *miningmutation) ClearBucket(bucket string) error { + m.clearedTables[bucket] = struct{}{} + return m.memTx.ClearBucket(bucket) +} + +func (m *miningmutation) isBucketCleared(bucket string) bool { + _, ok := m.clearedTables[bucket] + return ok +} + +func (m *miningmutation) CollectMetrics() { +} + +func (m *miningmutation) CreateBucket(bucket string) error { + panic("Not implemented") +} + +// Cursor creates a new cursor (the real fun begins here) +func (m *miningmutation) makeCursor(bucket string) (kv.RwCursorDupSort, error) { + c := &miningmutationcursor{} + // We can filter duplicates in dup sorted table + c.table = bucket + + var err error + // Initialize db cursors + c.dupCursor, err = m.db.CursorDupSort(bucket) + if err != nil { + return nil, err + } + c.cursor = c.dupCursor + // Initialize memory cursors + c.memDupCursor, err = m.memTx.RwCursorDupSort(bucket) + if err != nil { + return nil, err + } + _, isDupsort := m.dupsortTables[bucket] + c.isDupsort = isDupsort + c.memCursor = c.memDupCursor + c.mutation = m + return c, err +} + +// Cursor creates a new cursor (the real fun begins here) +func (m *miningmutation) RwCursorDupSort(bucket string) (kv.RwCursorDupSort, error) { + return m.makeCursor(bucket) +} + +// Cursor creates a new cursor (the real fun begins here) +func (m *miningmutation) RwCursor(bucket string) (kv.RwCursor, error) { + return m.makeCursor(bucket) +} + +// Cursor creates a new cursor (the real fun begins here) +func (m *miningmutation) CursorDupSort(bucket string) (kv.CursorDupSort, error) { + return m.makeCursor(bucket) +} + +// Cursor creates a new cursor (the real fun begins here) +func (m *miningmutation) Cursor(bucket string) (kv.Cursor, error) { + return m.makeCursor(bucket) +} + +// ViewID creates a new cursor (the real fun begins here) +func (m *miningmutation) ViewID() uint64 { + panic("ViewID Not implemented") +} diff --git a/ethdb/olddb/miningmutationcursor.go b/ethdb/olddb/miningmutationcursor.go new file mode 100644 index 00000000000..2d1db38c8f8 --- /dev/null +++ b/ethdb/olddb/miningmutationcursor.go @@ -0,0 +1,284 @@ +package olddb + +import ( + "bytes" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" +) + +// entry for the cursor +type cursorentry struct { + key []byte + value []byte +} + +// cursor +type miningmutationcursor struct { + // we can keep one cursor type if we store 2 of each kind. + cursor kv.Cursor + dupCursor kv.CursorDupSort + // Mem cursors + memCursor kv.RwCursor + memDupCursor kv.RwCursorDupSort + // we keep the index in the slice of pairs we are at. + isPrevFromDb bool + // Flag for dupsort mode + isDupsort bool + // entry history + currentPair cursorentry + currentDbEntry cursorentry + currentMemEntry cursorentry + // we keep the mining mutation so that we can insert new elements in db + mutation *miningmutation + table string +} + +// First move cursor to first position and return key and value accordingly. +func (m *miningmutationcursor) First() ([]byte, []byte, error) { + memKey, memValue, err := m.memCursor.First() + if err != nil { + return nil, nil, err + } + + dbKey, dbValue, err := m.cursor.First() + if err != nil { + return nil, nil, err + } + + return m.goForward(memKey, memValue, dbKey, dbValue) +} + +// Current return the current key and values the cursor is on. +func (m *miningmutationcursor) Current() ([]byte, []byte, error) { + return common.CopyBytes(m.currentPair.key), common.CopyBytes(m.currentPair.value), nil +} + +func (m *miningmutationcursor) goForward(memKey, memValue, dbKey, dbValue []byte) ([]byte, []byte, error) { + var err error + if memValue == nil && dbValue == nil { + return nil, nil, nil + } + // Check for duplicates + if bytes.Compare(memKey, dbKey) == 0 { + if !m.isDupsort { + if dbKey, dbValue, err = m.cursor.Next(); err != nil { + return nil, nil, err + } + } else if bytes.Compare(memValue, dbValue) == 0 { + if dbKey, dbValue, err = m.dupCursor.NextDup(); err != nil { + return nil, nil, err + } + } else if len(memValue) >= 32 && len(dbValue) >= 32 && m.table == kv.HashedStorage && bytes.Compare(memValue[:32], dbValue[:32]) == 0 { + if dbKey, dbValue, err = m.dupCursor.NextDup(); err != nil { + return nil, nil, err + } + } + } + m.currentDbEntry = cursorentry{dbKey, dbValue} + m.currentMemEntry = cursorentry{memKey, memValue} + // compare entries + if bytes.Compare(memKey, dbKey) == 0 { + m.isPrevFromDb = dbValue != nil && (memValue == nil || bytes.Compare(memValue, dbValue) > 0) + } else { + m.isPrevFromDb = dbValue != nil && (memKey == nil || bytes.Compare(memKey, dbKey) > 0) + } + if dbValue == nil { + m.currentDbEntry = cursorentry{} + } + if memValue == nil { + m.currentMemEntry = cursorentry{} + } + if m.isPrevFromDb { + m.currentPair = cursorentry{dbKey, dbValue} + return dbKey, dbValue, nil + } + + m.currentPair = cursorentry{memKey, memValue} + return memKey, memValue, nil +} + +// Next returns the next element of the mutation. +func (m *miningmutationcursor) Next() ([]byte, []byte, error) { + if m.isPrevFromDb { + k, v, err := m.cursor.Next() + if err != nil { + return nil, nil, err + } + return m.goForward(m.currentMemEntry.key, m.currentMemEntry.value, k, v) + } + + memK, memV, err := m.memCursor.Next() + if err != nil { + return nil, nil, err + } + + return m.goForward(memK, memV, m.currentDbEntry.key, m.currentDbEntry.value) +} + +// NextDup returns the next element of the mutation. +func (m *miningmutationcursor) NextDup() ([]byte, []byte, error) { + if m.isPrevFromDb { + k, v, err := m.dupCursor.NextDup() + + if err != nil { + return nil, nil, err + } + return m.goForward(m.currentMemEntry.key, m.currentMemEntry.value, k, v) + } + + memK, memV, err := m.memDupCursor.NextDup() + if err != nil { + return nil, nil, err + } + + return m.goForward(memK, memV, m.currentDbEntry.key, m.currentDbEntry.value) +} + +// Seek move pointer to a key at a certain position. +func (m *miningmutationcursor) Seek(seek []byte) ([]byte, []byte, error) { + dbKey, dbValue, err := m.cursor.Seek(seek) + if err != nil { + return nil, nil, err + } + + memKey, memValue, err := m.memCursor.Seek(seek) + if err != nil { + return nil, nil, err + } + return m.goForward(memKey, memValue, dbKey, dbValue) +} + +// Seek move pointer to a key at a certain position. +func (m *miningmutationcursor) SeekExact(seek []byte) ([]byte, []byte, error) { + memKey, memValue, err := m.memCursor.SeekExact(seek) + if err != nil { + return nil, nil, err + } + + if memKey != nil { + m.currentMemEntry.key = memKey + m.currentMemEntry.value = memValue + m.currentDbEntry.key, m.currentDbEntry.value, err = m.cursor.Seek(seek) + m.isPrevFromDb = false + m.currentPair = cursorentry{memKey, memValue} + return memKey, memValue, err + } + + dbKey, dbValue, err := m.cursor.SeekExact(seek) + if err != nil { + return nil, nil, err + } + + if dbKey != nil { + m.currentDbEntry.key = dbKey + m.currentDbEntry.value = dbValue + m.currentMemEntry.key, m.currentMemEntry.value, err = m.memCursor.Seek(seek) + m.isPrevFromDb = true + m.currentPair = cursorentry{dbKey, dbValue} + return dbKey, dbValue, err + } + return nil, nil, nil +} + +func (m *miningmutationcursor) Put(k, v []byte) error { + return m.mutation.Put(m.table, common.CopyBytes(k), common.CopyBytes(v)) +} + +func (m *miningmutationcursor) Append(k []byte, v []byte) error { + return m.mutation.Put(m.table, common.CopyBytes(k), common.CopyBytes(v)) + +} + +func (m *miningmutationcursor) AppendDup(k []byte, v []byte) error { + return m.memDupCursor.AppendDup(common.CopyBytes(k), common.CopyBytes(v)) +} + +func (m *miningmutationcursor) PutNoDupData(key, value []byte) error { + panic("DeleteCurrentDuplicates Not implemented") +} + +func (m *miningmutationcursor) Delete(k, v []byte) error { + return m.mutation.Delete(m.table, k, v) +} + +func (m *miningmutationcursor) DeleteCurrent() error { + panic("DeleteCurrent Not implemented") +} + +func (m *miningmutationcursor) DeleteCurrentDuplicates() error { + panic("DeleteCurrentDuplicates Not implemented") +} + +// Seek move pointer to a key at a certain position. +func (m *miningmutationcursor) SeekBothRange(key, value []byte) ([]byte, error) { + if value == nil { + _, v, err := m.SeekExact(key) + return v, err + } + + dbValue, err := m.dupCursor.SeekBothRange(key, value) + if err != nil { + return nil, err + } + + memValue, err := m.memDupCursor.SeekBothRange(key, value) + if err != nil { + return nil, err + } + _, retValue, err := m.goForward(key, memValue, key, dbValue) + return retValue, err +} + +func (m *miningmutationcursor) Last() ([]byte, []byte, error) { + // TODO(Giulio2002): make fixes. + memKey, memValue, err := m.memCursor.Last() + if err != nil { + return nil, nil, err + } + + dbKey, dbValue, err := m.cursor.Last() + if err != nil { + return nil, nil, err + } + + return m.goForward(memKey, memValue, dbKey, dbValue) +} + +func (m *miningmutationcursor) Prev() ([]byte, []byte, error) { + panic("Prev is not implemented!") +} + +func (m *miningmutationcursor) Close() { + if m.cursor != nil { + m.cursor.Close() + } + if m.memCursor != nil { + m.memCursor.Close() + } + return +} + +func (m *miningmutationcursor) Count() (uint64, error) { + panic("Not implemented") +} + +func (m *miningmutationcursor) FirstDup() ([]byte, error) { + panic("Not implemented") +} + +func (m *miningmutationcursor) NextNoDup() ([]byte, []byte, error) { + panic("Not implemented") +} + +func (m *miningmutationcursor) LastDup() ([]byte, error) { + panic("Not implemented") +} + +func (m *miningmutationcursor) CountDuplicates() (uint64, error) { + panic("Not implemented") +} + +func (m *miningmutationcursor) SeekBothExact(key, value []byte) ([]byte, []byte, error) { + panic("SeekBothExact Not implemented") +} diff --git a/ethdb/olddb/mutation.go b/ethdb/olddb/mutation.go index 128277985b0..179e3921639 100644 --- a/ethdb/olddb/mutation.go +++ b/ethdb/olddb/mutation.go @@ -11,8 +11,8 @@ import ( "unsafe" "github.com/google/btree" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/ethdb" "github.com/ledgerwatch/log/v3" ) diff --git a/ethdb/olddb/object_db.go b/ethdb/olddb/object_db.go index 37a5abc01f2..63d84d11eb7 100644 --- a/ethdb/olddb/object_db.go +++ b/ethdb/olddb/object_db.go @@ -143,17 +143,6 @@ func (db *ObjectDatabase) Last(bucket string) ([]byte, []byte, error) { return key, value, nil } -func (db *ObjectDatabase) Walk(bucket string, startkey []byte, fixedbits int, walker func(k, v []byte) (bool, error)) error { - err := db.kv.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(bucket) - if err != nil { - return err - } - return ethdb.Walk(c, startkey, fixedbits, walker) - }) - return err -} - func (db *ObjectDatabase) ForEach(bucket string, fromPrefix []byte, walker func(k, v []byte) error) error { return db.kv.View(context.Background(), func(tx kv.Tx) error { return tx.ForEach(bucket, fromPrefix, walker) diff --git a/ethdb/olddb/tx_db.go b/ethdb/olddb/tx_db.go index b8cb58d6b32..737e1668628 100644 --- a/ethdb/olddb/tx_db.go +++ b/ethdb/olddb/tx_db.go @@ -159,27 +159,6 @@ func (m *TxDb) BatchSize() int { return int(m.len) } -func (m *TxDb) Walk(bucket string, startkey []byte, fixedbits int, walker func([]byte, []byte) (bool, error)) error { - // get cursor out of pool, then calls txDb.Put/Get/Delete on same bucket inside Walk callback - will not affect state of Walk - c, ok := m.cursors[bucket] - if ok { - delete(m.cursors, bucket) - } else { - var err error - c, err = m.tx.Cursor(bucket) - if err != nil { - return err - } - } - defer func() { // put cursor back to pool if can - if _, ok = m.cursors[bucket]; ok { - c.Close() - } else { - m.cursors[bucket] = c - } - }() - return ethdb.Walk(c, startkey, fixedbits, walker) -} func (m *TxDb) ForEach(bucket string, fromPrefix []byte, walker func(k, v []byte) error) error { return m.tx.ForEach(bucket, fromPrefix, walker) } diff --git a/ethdb/privateapi/all.go b/ethdb/privateapi/all.go index 13b60ab4b86..f3720c508be 100644 --- a/ethdb/privateapi/all.go +++ b/ethdb/privateapi/all.go @@ -3,72 +3,47 @@ package privateapi import ( "fmt" "net" - "time" - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" - grpc_recovery "github.com/grpc-ecosystem/go-grpc-middleware/recovery" - grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" + "github.com/ledgerwatch/erigon-lib/gointerfaces/grpcutil" + "github.com/ledgerwatch/erigon-lib/kv/remotedbserver" + //grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus" "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" - "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - "github.com/ledgerwatch/erigon/ethdb/remotedbserver" - "github.com/ledgerwatch/erigon/metrics" + txpool_proto "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" "github.com/ledgerwatch/log/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/health" + "google.golang.org/grpc/health/grpc_health_v1" ) -func StartGrpc(kv *remotedbserver.KvServer, ethBackendSrv *EthBackendServer, txPoolServer *TxPoolServer, miningServer *MiningServer, addr string, rateLimit uint32, creds *credentials.TransportCredentials) (*grpc.Server, error) { +func StartGrpc(kv *remotedbserver.KvServer, ethBackendSrv *EthBackendServer, txPoolServer txpool_proto.TxpoolServer, + miningServer txpool_proto.MiningServer, addr string, rateLimit uint32, creds credentials.TransportCredentials, + healthCheck bool) (*grpc.Server, error) { log.Info("Starting private RPC server", "on", addr) lis, err := net.Listen("tcp", addr) if err != nil { return nil, fmt.Errorf("could not create listener: %w, addr=%s", err, addr) } - var ( - streamInterceptors []grpc.StreamServerInterceptor - unaryInterceptors []grpc.UnaryServerInterceptor - ) - streamInterceptors = append(streamInterceptors, grpc_recovery.StreamServerInterceptor()) - unaryInterceptors = append(unaryInterceptors, grpc_recovery.UnaryServerInterceptor()) - - if metrics.Enabled { - streamInterceptors = append(streamInterceptors, grpc_prometheus.StreamServerInterceptor) - unaryInterceptors = append(unaryInterceptors, grpc_prometheus.UnaryServerInterceptor) - } - - var grpcServer *grpc.Server - //cpus := uint32(runtime.GOMAXPROCS(-1)) - opts := []grpc.ServerOption{ - //grpc.NumStreamWorkers(cpus), // reduce amount of goroutines - grpc.WriteBufferSize(1024), // reduce buffers to save mem - grpc.ReadBufferSize(1024), - grpc.MaxConcurrentStreams(rateLimit), // to force clients reduce concurrency level - // Don't drop the connection, settings accordign to this comment on GitHub - // https://github.com/grpc/grpc-go/issues/3171#issuecomment-552796779 - grpc.KeepaliveEnforcementPolicy(keepalive.EnforcementPolicy{ - MinTime: 10 * time.Second, - PermitWithoutStream: true, - }), - grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(streamInterceptors...)), - grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(unaryInterceptors...)), + grpcServer := grpcutil.NewServer(rateLimit, creds) + remote.RegisterETHBACKENDServer(grpcServer, ethBackendSrv) + if txPoolServer != nil { + txpool_proto.RegisterTxpoolServer(grpcServer, txPoolServer) } - if creds == nil { - // no specific opts - } else { - opts = append(opts, grpc.Creds(*creds)) + if miningServer != nil { + txpool_proto.RegisterMiningServer(grpcServer, miningServer) } - grpcServer = grpc.NewServer(opts...) - remote.RegisterETHBACKENDServer(grpcServer, ethBackendSrv) - txpool.RegisterTxpoolServer(grpcServer, txPoolServer) - txpool.RegisterMiningServer(grpcServer, miningServer) remote.RegisterKVServer(grpcServer, kv) - - if metrics.Enabled { - grpc_prometheus.Register(grpcServer) + var healthServer *health.Server + if healthCheck { + healthServer = health.NewServer() + grpc_health_v1.RegisterHealthServer(grpcServer, healthServer) } - go func() { + if healthCheck { + defer healthServer.Shutdown() + } + defer ethBackendSrv.StopProposer() if err := grpcServer.Serve(lis); err != nil { log.Error("private RPC server fail", "err", err) } diff --git a/ethdb/privateapi/engine_test.go b/ethdb/privateapi/engine_test.go new file mode 100644 index 00000000000..42903819ad9 --- /dev/null +++ b/ethdb/privateapi/engine_test.go @@ -0,0 +1,256 @@ +package privateapi + +import ( + "context" + "testing" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/engineapi" + "github.com/stretchr/testify/require" +) + +// Hashes +var ( + startingHeadHash = common.HexToHash("0x1") + payload1Hash = common.HexToHash("2afc6f4132be8d1fded51aa7f914fd831d2939a100f61322842ab41d7898255b") + payload2Hash = common.HexToHash("219bb787708f832e40b734ab925e67e33f91f2c2a2a01b8f5f5f6284410982a6") + payload3Hash = common.HexToHash("a2dd4fc599747c1ce2176a4abae13afbc7ccb4a240f8f4cf22252767bab52f12") +) + +// Payloads +var ( + mockPayload1 *types2.ExecutionPayload = &types2.ExecutionPayload{ + ParentHash: gointerfaces.ConvertHashToH256(common.HexToHash("0x2")), + BlockHash: gointerfaces.ConvertHashToH256(payload1Hash), + ReceiptRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x3")), + StateRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x4")), + PrevRandao: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + LogsBloom: gointerfaces.ConvertBytesToH2048(make([]byte, 256)), + ExtraData: make([]byte, 0), + BaseFeePerGas: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + BlockNumber: 100, + GasLimit: 52, + GasUsed: 4, + Timestamp: 4, + Coinbase: gointerfaces.ConvertAddressToH160(common.HexToAddress("0x1")), + Transactions: make([][]byte, 0), + } + mockPayload2 *types2.ExecutionPayload = &types2.ExecutionPayload{ + ParentHash: gointerfaces.ConvertHashToH256(payload1Hash), + BlockHash: gointerfaces.ConvertHashToH256(payload2Hash), + ReceiptRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x3")), + StateRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x4")), + PrevRandao: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + LogsBloom: gointerfaces.ConvertBytesToH2048(make([]byte, 256)), + ExtraData: make([]byte, 0), + BaseFeePerGas: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + BlockNumber: 101, + GasLimit: 52, + GasUsed: 4, + Timestamp: 4, + Coinbase: gointerfaces.ConvertAddressToH160(common.HexToAddress("0x1")), + Transactions: make([][]byte, 0), + } + mockPayload3 = &types2.ExecutionPayload{ + ParentHash: gointerfaces.ConvertHashToH256(startingHeadHash), + BlockHash: gointerfaces.ConvertHashToH256(payload3Hash), + ReceiptRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x3")), + StateRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x4")), + PrevRandao: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + LogsBloom: gointerfaces.ConvertBytesToH2048(make([]byte, 256)), + ExtraData: make([]byte, 0), + BaseFeePerGas: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + BlockNumber: 51, + GasLimit: 52, + GasUsed: 4, + Timestamp: 4, + Coinbase: gointerfaces.ConvertAddressToH160(common.HexToAddress("0x1")), + Transactions: make([][]byte, 0), + } +) + +func makeTestDb(ctx context.Context, db kv.RwDB) { + tx, _ := db.BeginRw(ctx) + rawdb.WriteHeadBlockHash(tx, startingHeadHash) + rawdb.WriteHeaderNumber(tx, startingHeadHash, 50) + _ = tx.Commit() +} + +func TestMockDownloadRequest(t *testing.T) { + db := memdb.New() + ctx := context.Background() + require := require.New(t) + + makeTestDb(ctx, db) + beaconRequestList := engineapi.NewRequestList() + statusCh := make(chan PayloadStatus) + + events := NewEvents() + backend := NewEthBackendServer(ctx, nil, db, events, nil, ¶ms.ChainConfig{TerminalTotalDifficulty: common.Big1}, beaconRequestList, statusCh, nil, false) + + var err error + var reply *remote.EnginePayloadStatus + done := make(chan bool) + + go func() { + reply, err = backend.EngineNewPayloadV1(ctx, mockPayload1) + done <- true + }() + + beaconRequestList.WaitForRequest(true) + statusCh <- PayloadStatus{Status: remote.EngineStatus_SYNCING} + <-done + require.NoError(err) + require.Equal(reply.Status, remote.EngineStatus_SYNCING) + require.Nil(reply.LatestValidHash) + + // If we get another request we don't need to process it with processDownloadCh and ignore it and return Syncing status + go func() { + reply, err = backend.EngineNewPayloadV1(ctx, mockPayload2) + done <- true + }() + + <-done + // Same result as before + require.NoError(err) + require.Equal(reply.Status, remote.EngineStatus_SYNCING) + require.Nil(reply.LatestValidHash) + + // However if we simulate that we finish reverse downloading the chain by updating the head, we just execute 1:1 + tx, _ := db.BeginRw(ctx) + rawdb.WriteHeadBlockHash(tx, payload1Hash) + rawdb.WriteHeaderNumber(tx, payload1Hash, 100) + _ = tx.Commit() + // Now we try to sync the next payload again + go func() { + reply, err = backend.EngineNewPayloadV1(ctx, mockPayload2) + done <- true + }() + + <-done + + require.NoError(err) + require.Equal(reply.Status, remote.EngineStatus_SYNCING) + require.Nil(reply.LatestValidHash) +} + +func TestMockValidExecution(t *testing.T) { + db := memdb.New() + ctx := context.Background() + require := require.New(t) + + makeTestDb(ctx, db) + + beaconRequestList := engineapi.NewRequestList() + statusCh := make(chan PayloadStatus) + + events := NewEvents() + backend := NewEthBackendServer(ctx, nil, db, events, nil, ¶ms.ChainConfig{TerminalTotalDifficulty: common.Big1}, beaconRequestList, statusCh, nil, false) + + var err error + var reply *remote.EnginePayloadStatus + done := make(chan bool) + + go func() { + reply, err = backend.EngineNewPayloadV1(ctx, mockPayload3) + done <- true + }() + + beaconRequestList.WaitForRequest(true) + + statusCh <- PayloadStatus{ + Status: remote.EngineStatus_VALID, + LatestValidHash: payload3Hash, + } + <-done + + require.NoError(err) + require.Equal(reply.Status, remote.EngineStatus_VALID) + replyHash := gointerfaces.ConvertH256ToHash(reply.LatestValidHash) + require.Equal(replyHash[:], payload3Hash[:]) +} + +func TestMockInvalidExecution(t *testing.T) { + db := memdb.New() + ctx := context.Background() + require := require.New(t) + + makeTestDb(ctx, db) + + beaconRequestList := engineapi.NewRequestList() + statusCh := make(chan PayloadStatus) + + events := NewEvents() + backend := NewEthBackendServer(ctx, nil, db, events, nil, ¶ms.ChainConfig{TerminalTotalDifficulty: common.Big1}, beaconRequestList, statusCh, nil, false) + + var err error + var reply *remote.EnginePayloadStatus + done := make(chan bool) + + go func() { + reply, err = backend.EngineNewPayloadV1(ctx, mockPayload3) + done <- true + }() + + beaconRequestList.WaitForRequest(true) + // Simulate invalid status + statusCh <- PayloadStatus{ + Status: remote.EngineStatus_INVALID, + LatestValidHash: startingHeadHash, + } + <-done + + require.NoError(err) + require.Equal(reply.Status, remote.EngineStatus_INVALID) + replyHash := gointerfaces.ConvertH256ToHash(reply.LatestValidHash) + require.Equal(replyHash[:], startingHeadHash[:]) +} + +func TestNoTTD(t *testing.T) { + db := memdb.New() + ctx := context.Background() + require := require.New(t) + + makeTestDb(ctx, db) + + beaconRequestList := engineapi.NewRequestList() + statusCh := make(chan PayloadStatus) + + events := NewEvents() + backend := NewEthBackendServer(ctx, nil, db, events, nil, ¶ms.ChainConfig{}, beaconRequestList, statusCh, nil, false) + + var err error + + done := make(chan bool) + + go func() { + _, err = backend.EngineNewPayloadV1(ctx, &types2.ExecutionPayload{ + ParentHash: gointerfaces.ConvertHashToH256(common.HexToHash("0x2")), + BlockHash: gointerfaces.ConvertHashToH256(common.HexToHash("0x3")), + ReceiptRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x4")), + StateRoot: gointerfaces.ConvertHashToH256(common.HexToHash("0x4")), + PrevRandao: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + LogsBloom: gointerfaces.ConvertBytesToH2048(make([]byte, 256)), + ExtraData: make([]byte, 0), + BaseFeePerGas: gointerfaces.ConvertHashToH256(common.HexToHash("0x0b3")), + BlockNumber: 51, + GasLimit: 52, + GasUsed: 4, + Timestamp: 4, + Coinbase: gointerfaces.ConvertAddressToH160(common.HexToAddress("0x1")), + Transactions: make([][]byte, 0), + }) + done <- true + }() + + <-done + + require.Equal(err.Error(), "not a proof-of-stake chain") +} diff --git a/ethdb/privateapi/ethbackend.go b/ethdb/privateapi/ethbackend.go index c49c4acf150..cf6d230dcf9 100644 --- a/ethdb/privateapi/ethbackend.go +++ b/ethdb/privateapi/ethbackend.go @@ -1,40 +1,130 @@ package privateapi import ( - "bytes" "context" + "errors" + "fmt" + "math/big" + "sync" + "time" + "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/gointerfaces" "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/consensus/serenity" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/turbo/engineapi" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/log/v3" + "golang.org/x/exp/slices" "google.golang.org/protobuf/types/known/emptypb" ) +type assemblePayloadPOSFunc func(param *core.BlockProposerParametersPOS) (*types.Block, error) + // EthBackendAPIVersion // 2.0.0 - move all mining-related methods to 'txpool/mining' server // 2.1.0 - add NetPeerCount function -var EthBackendAPIVersion = &types2.VersionReply{Major: 2, Minor: 1, Patch: 0} +// 2.2.0 - add NodesInfo function +// 3.0.0 - adding PoS interfaces +// 3.1.0 - add Subscribe to logs +var EthBackendAPIVersion = &types2.VersionReply{Major: 3, Minor: 1, Patch: 0} + +const MaxPendingPayloads = 128 + +var UnknownPayloadErr = rpc.CustomError{Code: -38001, Message: "Unknown payload"} +var InvalidForkchoiceStateErr = rpc.CustomError{Code: -38002, Message: "Invalid forkchoice state"} +var InvalidPayloadAttributesErr = rpc.CustomError{Code: -38003, Message: "Invalid payload attributes"} type EthBackendServer struct { remote.UnimplementedETHBACKENDServer // must be embedded to have forward compatible implementations. - eth EthBackend - events *Events + ctx context.Context + eth EthBackend + events *Events + db kv.RoDB + blockReader services.BlockAndTxnReader + config *params.ChainConfig + // Block proposing for proof-of-stake + payloadId uint64 + pendingPayloads map[uint64]*pendingPayload + // Send Beacon Chain requests to staged sync + requestList *engineapi.RequestList + // Replies to newPayload & forkchoice requests + statusCh <-chan PayloadStatus + assemblePayloadPOS assemblePayloadPOSFunc + proposing bool + syncCond *sync.Cond // Engine API is asynchronous, we want to avoid CL to call different APIs at the same time + shutdown bool + logsFilter *LogsFilterAggregator } type EthBackend interface { Etherbase() (common.Address, error) NetVersion() (uint64, error) NetPeerCount() (uint64, error) + NodesInfo(limit int) (*remote.NodesInfoReply, error) + Peers(ctx context.Context) (*remote.PeersReply, error) +} + +// This is the status of a newly execute block. +// Hash: Block hash +// Status: block's status +type PayloadStatus struct { + Status remote.EngineStatus + LatestValidHash common.Hash + ValidationError error + CriticalError error } -func NewEthBackendServer(eth EthBackend, events *Events) *EthBackendServer { - return &EthBackendServer{eth: eth, events: events} +type pendingPayload struct { + block *types.Block + built bool +} + +func NewEthBackendServer(ctx context.Context, eth EthBackend, db kv.RwDB, events *Events, blockReader services.BlockAndTxnReader, + config *params.ChainConfig, requestList *engineapi.RequestList, statusCh <-chan PayloadStatus, + assemblePayloadPOS assemblePayloadPOSFunc, proposing bool, +) *EthBackendServer { + s := &EthBackendServer{ctx: ctx, eth: eth, events: events, db: db, blockReader: blockReader, config: config, + requestList: requestList, statusCh: statusCh, pendingPayloads: make(map[uint64]*pendingPayload), + assemblePayloadPOS: assemblePayloadPOS, proposing: proposing, syncCond: sync.NewCond(&sync.Mutex{}), + logsFilter: NewLogsFilterAggregator(events), + } + + ch, clean := s.events.AddLogsSubscription() + go func() { + var err error + defer clean() + log.Info("new subscription to logs established") + defer func() { + if err != nil { + if !errors.Is(err, context.Canceled) { + log.Warn("subscription to logs closed", "reason", err) + } + } else { + log.Warn("subscription to logs closed") + } + }() + for { + select { + case <-s.ctx.Done(): + err = s.ctx.Err() + return + case logs := <-ch: + s.logsFilter.distributeLogs(logs) + } + } + }() + return s } func (s *EthBackendServer) Version(context.Context, *emptypb.Empty) (*types2.VersionReply, error) { @@ -69,42 +159,48 @@ func (s *EthBackendServer) NetPeerCount(_ context.Context, _ *remote.NetPeerCoun return &remote.NetPeerCountReply{Count: id}, nil } -func (s *EthBackendServer) Subscribe(r *remote.SubscribeRequest, subscribeServer remote.ETHBACKEND_SubscribeServer) error { - log.Debug("establishing event subscription channel with the RPC daemon") - s.events.AddHeaderSubscription(func(h *types.Header) error { - select { - case <-subscribeServer.Context().Done(): - return subscribeServer.Context().Err() - default: +func (s *EthBackendServer) Subscribe(r *remote.SubscribeRequest, subscribeServer remote.ETHBACKEND_SubscribeServer) (err error) { + log.Trace("Establishing event subscription channel with the RPC daemon ...") + ch, clean := s.events.AddHeaderSubscription() + defer clean() + newSnCh, newSnClean := s.events.AddNewSnapshotSubscription() + defer newSnClean() + log.Info("new subscription to newHeaders established") + defer func() { + if err != nil { + if !errors.Is(err, context.Canceled) { + log.Warn("subscription to newHeaders closed", "reason", err) + } + } else { + log.Warn("subscription to newHeaders closed") } - - var buf bytes.Buffer - if err := rlp.Encode(&buf, h); err != nil { - log.Warn("error while marshaling a header", "err", err) + }() + if s.events.OnNewSnapshotHappened() { + if err = subscribeServer.Send(&remote.SubscribeReply{Type: remote.Event_NEW_SNAPSHOT}); err != nil { return err } - payload := buf.Bytes() - - err := subscribeServer.Send(&remote.SubscribeReply{ - Type: remote.Event_HEADER, - Data: payload, - }) - - // we only close the wg on error because if we successfully sent an event, - // that means that the channel wasn't closed and is ready to - // receive more events. - // if rpcdaemon disconnects, we will receive an error here - // next time we try to send an event - if err != nil { - log.Info("event subscription channel was closed", "reason", err) + } + for { + select { + case <-s.ctx.Done(): + return s.ctx.Err() + case <-subscribeServer.Context().Done(): + return subscribeServer.Context().Err() + case headersRlp := <-ch: + for _, headerRlp := range headersRlp { + if err = subscribeServer.Send(&remote.SubscribeReply{ + Type: remote.Event_HEADER, + Data: headerRlp, + }); err != nil { + return err + } + } + case <-newSnCh: + if err = subscribeServer.Send(&remote.SubscribeReply{Type: remote.Event_NEW_SNAPSHOT}); err != nil { + return err + } } - return err - }) - - log.Info("event subscription channel established with the RPC daemon") - <-subscribeServer.Context().Done() - log.Info("event subscription channel closed with the RPC daemon") - return nil + } } func (s *EthBackendServer) ProtocolVersion(_ context.Context, _ *remote.ProtocolVersionRequest) (*remote.ProtocolVersionReply, error) { @@ -115,3 +211,431 @@ func (s *EthBackendServer) ProtocolVersion(_ context.Context, _ *remote.Protocol func (s *EthBackendServer) ClientVersion(_ context.Context, _ *remote.ClientVersionRequest) (*remote.ClientVersionReply, error) { return &remote.ClientVersionReply{NodeName: common.MakeName("erigon", params.Version)}, nil } + +func (s *EthBackendServer) TxnLookup(ctx context.Context, req *remote.TxnLookupRequest) (*remote.TxnLookupReply, error) { + tx, err := s.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + blockNum, ok, err := s.blockReader.TxnLookup(ctx, tx, gointerfaces.ConvertH256ToHash(req.TxnHash)) + if err != nil { + return nil, err + } + if !ok { + // Not a perfect solution, assumes there are no transactions in block 0 + return &remote.TxnLookupReply{BlockNumber: 0}, nil + } + return &remote.TxnLookupReply{BlockNumber: blockNum}, nil +} + +func (s *EthBackendServer) Block(ctx context.Context, req *remote.BlockRequest) (*remote.BlockReply, error) { + tx, err := s.db.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + block, senders, err := s.blockReader.BlockWithSenders(ctx, tx, gointerfaces.ConvertH256ToHash(req.BlockHash), req.BlockHeight) + if err != nil { + return nil, err + } + blockRlp, err := rlp.EncodeToBytes(block) + if err != nil { + return nil, err + } + sendersBytes := make([]byte, 20*len(senders)) + for i, sender := range senders { + copy(sendersBytes[i*20:], sender[:]) + } + return &remote.BlockReply{BlockRlp: blockRlp, Senders: sendersBytes}, nil +} + +func convertPayloadStatus(payloadStatus *PayloadStatus) *remote.EnginePayloadStatus { + reply := remote.EnginePayloadStatus{Status: payloadStatus.Status} + if payloadStatus.LatestValidHash != (common.Hash{}) { + reply.LatestValidHash = gointerfaces.ConvertHashToH256(payloadStatus.LatestValidHash) + } + if payloadStatus.ValidationError != nil { + reply.ValidationError = payloadStatus.ValidationError.Error() + } + return &reply +} + +func (s *EthBackendServer) stageLoopIsBusy() bool { + for i := 0; i < 20; i++ { + if !s.requestList.IsWaiting() { + // This might happen, for example, in the following scenario: + // 1) CL sends NewPayload and immediately after that ForkChoiceUpdated. + // 2) We happily process NewPayload and stage loop is at the end. + // 3) We start processing ForkChoiceUpdated, + // but the stage loop hasn't moved yet from the end to the beginning of HeadersPOS + // and thus requestList.WaitForRequest() is not called yet. + + // TODO(yperbasis): find a more elegant solution + time.Sleep(5 * time.Millisecond) + } + } + return !s.requestList.IsWaiting() +} + +// EngineNewPayloadV1 validates and possibly executes payload +func (s *EthBackendServer) EngineNewPayloadV1(ctx context.Context, req *types2.ExecutionPayload) (*remote.EnginePayloadStatus, error) { + log.Trace("[NewPayload] acquiring lock") + s.syncCond.L.Lock() + defer s.syncCond.L.Unlock() + log.Trace("[NewPayload] lock acquired") + + if s.config.TerminalTotalDifficulty == nil { + log.Error("[NewPayload] not a proof-of-stake chain") + return nil, fmt.Errorf("not a proof-of-stake chain") + } + + var baseFee *big.Int + eip1559 := false + + if req.BaseFeePerGas != nil { + baseFee = gointerfaces.ConvertH256ToUint256Int(req.BaseFeePerGas).ToBig() + eip1559 = true + } + + header := types.Header{ + ParentHash: gointerfaces.ConvertH256ToHash(req.ParentHash), + Coinbase: gointerfaces.ConvertH160toAddress(req.Coinbase), + Root: gointerfaces.ConvertH256ToHash(req.StateRoot), + Bloom: gointerfaces.ConvertH2048ToBloom(req.LogsBloom), + Eip1559: eip1559, + BaseFee: baseFee, + Extra: req.ExtraData, + Number: big.NewInt(int64(req.BlockNumber)), + GasUsed: req.GasUsed, + GasLimit: req.GasLimit, + Time: req.Timestamp, + MixDigest: gointerfaces.ConvertH256ToHash(req.PrevRandao), + UncleHash: types.EmptyUncleHash, + Difficulty: serenity.SerenityDifficulty, + Nonce: serenity.SerenityNonce, + ReceiptHash: gointerfaces.ConvertH256ToHash(req.ReceiptRoot), + TxHash: types.DeriveSha(types.RawTransactions(req.Transactions)), + } + + blockHash := gointerfaces.ConvertH256ToHash(req.BlockHash) + if header.Hash() != blockHash { + log.Error("[NewPayload] invalid block hash", "stated", common.Hash(blockHash), "actual", header.Hash()) + return &remote.EnginePayloadStatus{Status: remote.EngineStatus_INVALID_BLOCK_HASH}, nil + } + + tx, err := s.db.BeginRo(ctx) + if err != nil { + return nil, err + } + parentTd, err := rawdb.ReadTd(tx, header.ParentHash, req.BlockNumber-1) + if err != nil { + return nil, err + } + if parentTd != nil && parentTd.Cmp(s.config.TerminalTotalDifficulty) < 0 { + log.Warn("[NewPayload] TTD not reached yet", "height", header.Number, "hash", common.Hash(blockHash)) + return &remote.EnginePayloadStatus{Status: remote.EngineStatus_INVALID, LatestValidHash: gointerfaces.ConvertHashToH256(common.Hash{})}, nil + } + tx.Rollback() + + // If another payload is already commissioned then we just reply with syncing + if s.stageLoopIsBusy() { + // We are still syncing a commissioned payload + // TODO(yperbasis): not entirely correct since per the spec: + // The process of validating a payload on the canonical chain MUST NOT be affected by an active sync process on a side branch of the block tree. + // For example, if side branch B is SYNCING but the requisite data for validating a payload from canonical branch A is available, client software MUST initiate the validation process. + // https://github.com/ethereum/execution-apis/blob/v1.0.0-alpha.6/src/engine/specification.md#payload-validation + log.Trace("[NewPayload] stage loop is busy") + return &remote.EnginePayloadStatus{Status: remote.EngineStatus_SYNCING}, nil + } + + log.Trace("[NewPayload] sending block", "height", header.Number, "hash", common.Hash(blockHash)) + s.requestList.AddPayloadRequest(&engineapi.PayloadMessage{ + Header: &header, + Body: &types.RawBody{ + Transactions: req.Transactions, + Uncles: nil, + }, + }) + + payloadStatus := <-s.statusCh + log.Trace("[NewPayload] got reply", "payloadStatus", payloadStatus) + + if payloadStatus.CriticalError != nil { + return nil, payloadStatus.CriticalError + } + + return convertPayloadStatus(&payloadStatus), nil +} + +// EngineGetPayloadV1 retrieves previously assembled payload (Validators only) +func (s *EthBackendServer) EngineGetPayloadV1(ctx context.Context, req *remote.EngineGetPayloadRequest) (*types2.ExecutionPayload, error) { + // TODO(yperbasis): getPayload should stop block assembly if that's currently in fly + + log.Trace("[GetPayload] acquiring lock") + s.syncCond.L.Lock() + defer s.syncCond.L.Unlock() + log.Trace("[GetPayload] lock acquired") + + if !s.proposing { + return nil, fmt.Errorf("execution layer not running as a proposer. enable proposer by taking out the --proposer.disable flag on startup") + } + + if s.config.TerminalTotalDifficulty == nil { + return nil, fmt.Errorf("not a proof-of-stake chain") + } + + payload, ok := s.pendingPayloads[req.PayloadId] + if !ok { + return nil, &UnknownPayloadErr + } + + // getPayload should stop the build process + // https://github.com/ethereum/execution-apis/blob/v1.0.0-alpha.7/src/engine/specification.md#payload-building + payload.built = true + + block := payload.block + + var baseFeeReply *types2.H256 + if block.Header().BaseFee != nil { + var baseFee uint256.Int + baseFee.SetFromBig(block.Header().BaseFee) + baseFeeReply = gointerfaces.ConvertUint256IntToH256(&baseFee) + } + + encodedTransactions, err := types.MarshalTransactionsBinary(block.Transactions()) + if err != nil { + return nil, err + } + + return &types2.ExecutionPayload{ + ParentHash: gointerfaces.ConvertHashToH256(block.Header().ParentHash), + Coinbase: gointerfaces.ConvertAddressToH160(block.Header().Coinbase), + Timestamp: block.Header().Time, + PrevRandao: gointerfaces.ConvertHashToH256(block.Header().MixDigest), + StateRoot: gointerfaces.ConvertHashToH256(block.Root()), + ReceiptRoot: gointerfaces.ConvertHashToH256(block.ReceiptHash()), + LogsBloom: gointerfaces.ConvertBytesToH2048(block.Bloom().Bytes()), + GasLimit: block.GasLimit(), + GasUsed: block.GasUsed(), + BlockNumber: block.NumberU64(), + ExtraData: block.Extra(), + BaseFeePerGas: baseFeeReply, + BlockHash: gointerfaces.ConvertHashToH256(block.Header().Hash()), + Transactions: encodedTransactions, + }, nil +} + +// EngineForkChoiceUpdatedV1 either states new block head or request the assembling of a new block +func (s *EthBackendServer) EngineForkChoiceUpdatedV1(ctx context.Context, req *remote.EngineForkChoiceUpdatedRequest) (*remote.EngineForkChoiceUpdatedReply, error) { + log.Trace("[ForkChoiceUpdated] acquiring lock") + s.syncCond.L.Lock() + defer s.syncCond.L.Unlock() + log.Trace("[ForkChoiceUpdated] lock acquired") + + if s.config.TerminalTotalDifficulty == nil { + return nil, fmt.Errorf("not a proof-of-stake chain") + } + + forkChoice := engineapi.ForkChoiceMessage{ + HeadBlockHash: gointerfaces.ConvertH256ToHash(req.ForkchoiceState.HeadBlockHash), + SafeBlockHash: gointerfaces.ConvertH256ToHash(req.ForkchoiceState.SafeBlockHash), + FinalizedBlockHash: gointerfaces.ConvertH256ToHash(req.ForkchoiceState.FinalizedBlockHash), + } + + tx1, err := s.db.BeginRo(ctx) + if err != nil { + return nil, err + } + td, err := rawdb.ReadTdByHash(tx1, forkChoice.HeadBlockHash) + if err != nil { + return nil, err + } + if td != nil && td.Cmp(s.config.TerminalTotalDifficulty) < 0 { + log.Warn("[ForkChoiceUpdated] TTD not reached yet", "forkChoice", forkChoice) + return &remote.EngineForkChoiceUpdatedReply{ + PayloadStatus: &remote.EnginePayloadStatus{Status: remote.EngineStatus_INVALID, LatestValidHash: gointerfaces.ConvertHashToH256(common.Hash{})}, + }, nil + } + + // TODO(yperbasis): Client software MAY skip an update of the forkchoice state and + // MUST NOT begin a payload build process if forkchoiceState.headBlockHash doesn't reference a leaf of the block tree + // (i.e. it references an old block). + // https://github.com/ethereum/execution-apis/blob/v1.0.0-alpha.6/src/engine/specification.md#specification-1 + tx1.Rollback() + + if s.stageLoopIsBusy() { + log.Trace("[ForkChoiceUpdated] stage loop is busy") + return &remote.EngineForkChoiceUpdatedReply{ + PayloadStatus: &remote.EnginePayloadStatus{Status: remote.EngineStatus_SYNCING}, + }, nil + } + + log.Trace("[ForkChoiceUpdated] sending forkChoiceMessage", "head", forkChoice.HeadBlockHash) + s.requestList.AddForkChoiceRequest(&forkChoice) + + payloadStatus := <-s.statusCh + log.Trace("[ForkChoiceUpdated] got reply", "payloadStatus", payloadStatus) + + if payloadStatus.CriticalError != nil { + return nil, payloadStatus.CriticalError + } + + // No need for payload building + if req.PayloadAttributes == nil || payloadStatus.Status != remote.EngineStatus_VALID { + return &remote.EngineForkChoiceUpdatedReply{PayloadStatus: convertPayloadStatus(&payloadStatus)}, nil + } + + if !s.proposing { + return nil, fmt.Errorf("execution layer not running as a proposer. enable proposer by taking out the --proposer.disable flag on startup") + } + + s.evictOldPendingPayloads() + + // payload IDs start from 1 (0 signifies null) + s.payloadId++ + + tx2, err := s.db.BeginRo(ctx) + if err != nil { + return nil, err + } + headHash := rawdb.ReadHeadBlockHash(tx2) + headNumber := rawdb.ReadHeaderNumber(tx2, headHash) + headHeader := rawdb.ReadHeader(tx2, headHash, *headNumber) + tx2.Rollback() + + if headHeader.Hash() != forkChoice.HeadBlockHash { + return nil, fmt.Errorf("unexpected head hash: %x vs %x", headHeader.Hash(), forkChoice.HeadBlockHash) + } + + if headHeader.Time >= req.PayloadAttributes.Timestamp { + return nil, &InvalidPayloadAttributesErr + } + + emptyHeader := core.MakeEmptyHeader(headHeader, s.config, req.PayloadAttributes.Timestamp, nil) + emptyHeader.Coinbase = gointerfaces.ConvertH160toAddress(req.PayloadAttributes.SuggestedFeeRecipient) + emptyHeader.MixDigest = gointerfaces.ConvertH256ToHash(req.PayloadAttributes.PrevRandao) + + s.pendingPayloads[s.payloadId] = &pendingPayload{block: types.NewBlock(emptyHeader, nil, nil, nil)} + + log.Trace("[ForkChoiceUpdated] unpause assemble process") + s.syncCond.Broadcast() + + // successfully assembled the payload and assigned the correct id + return &remote.EngineForkChoiceUpdatedReply{ + PayloadStatus: &remote.EnginePayloadStatus{ + Status: remote.EngineStatus_VALID, + LatestValidHash: gointerfaces.ConvertHashToH256(headHash), + }, + PayloadId: s.payloadId, + }, nil +} + +func (s *EthBackendServer) evictOldPendingPayloads() { + // sort payload IDs in ascending order + ids := make([]uint64, 0, len(s.pendingPayloads)) + for id := range s.pendingPayloads { + ids = append(ids, id) + } + slices.Sort(ids) + + // remove old payloads so that at most MaxPendingPayloads - 1 remain + for i := 0; i <= len(s.pendingPayloads)-MaxPendingPayloads; i++ { + delete(s.pendingPayloads, ids[i]) + } +} + +func (s *EthBackendServer) StartProposer() { + go func() { + log.Trace("[Proposer] acquiring lock") + s.syncCond.L.Lock() + defer s.syncCond.L.Unlock() + log.Trace("[Proposer] lock acquired") + + for { + var blockToBuild *types.Block + var payloadId uint64 + + FindPayloadToBuild: + for { + if s.shutdown { + return + } + + tx, err := s.db.BeginRo(s.ctx) + if err != nil { + log.Error("Error while opening txn in block proposer", "err", err.Error()) + return + } + headHash := rawdb.ReadHeadBlockHash(tx) + tx.Rollback() + + for id, payload := range s.pendingPayloads { + if !payload.built && payload.block.ParentHash() == headHash { + blockToBuild = payload.block + payloadId = id + break FindPayloadToBuild + } + } + + log.Trace("[Proposer] Wait until we have to process new payloads") + s.syncCond.Wait() + log.Trace("[Proposer] Wait finished") + } + + param := core.BlockProposerParametersPOS{ + ParentHash: blockToBuild.ParentHash(), + Timestamp: blockToBuild.Header().Time, + PrevRandao: blockToBuild.MixDigest(), + SuggestedFeeRecipient: blockToBuild.Header().Coinbase, + } + + log.Trace("[Proposer] starting assembling...") + s.syncCond.L.Unlock() + block, err := s.assemblePayloadPOS(¶m) + s.syncCond.L.Lock() + log.Trace("[Proposer] payload assembled") + + if err != nil { + log.Warn("Error during block assembling", "err", err.Error()) + } else { + payload, ok := s.pendingPayloads[payloadId] + if ok && !payload.built { // don't update after engine_getPayload was called + payload.block = block + payload.built = true + } + } + } + }() +} + +func (s *EthBackendServer) StopProposer() { + log.Trace("[StopProposer] acquiring lock") + s.syncCond.L.Lock() + defer s.syncCond.L.Unlock() + log.Trace("[StopProposer] lock acquired") + + s.shutdown = true + s.syncCond.Broadcast() +} + +func (s *EthBackendServer) NodeInfo(_ context.Context, r *remote.NodesInfoRequest) (*remote.NodesInfoReply, error) { + nodesInfo, err := s.eth.NodesInfo(int(r.Limit)) + if err != nil { + return nil, err + } + return nodesInfo, nil +} + +func (s *EthBackendServer) Peers(ctx context.Context, _ *emptypb.Empty) (*remote.PeersReply, error) { + return s.eth.Peers(ctx) +} + +func (s *EthBackendServer) SubscribeLogs(server remote.ETHBACKEND_SubscribeLogsServer) (err error) { + if s.logsFilter != nil { + return s.logsFilter.subscribeLogs(server) + } + return fmt.Errorf("no logs filter available") +} diff --git a/ethdb/privateapi/events.go b/ethdb/privateapi/events.go index 8d6cdaec7f7..63eee69ed1d 100644 --- a/ethdb/privateapi/events.go +++ b/ethdb/privateapi/events.go @@ -3,38 +3,93 @@ package privateapi import ( "sync" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon/core/types" ) type RpcEventType uint64 -type HeaderSubscription func(*types.Header) error +type NewSnapshotSubscription func() error +type HeaderSubscription func(headerRLP []byte) error type PendingLogsSubscription func(types.Logs) error type PendingBlockSubscription func(*types.Block) error type PendingTxsSubscription func([]types.Transaction) error +type LogsSubscription func([]*remote.SubscribeLogsReply) error // Events manages event subscriptions and dissimination. Thread-safe type Events struct { - headerSubscriptions map[int]HeaderSubscription + id int + headerSubscriptions map[int]chan [][]byte + newSnapshotSubscription map[int]chan struct{} pendingLogsSubscriptions map[int]PendingLogsSubscription pendingBlockSubscriptions map[int]PendingBlockSubscription pendingTxsSubscriptions map[int]PendingTxsSubscription + logsSubscriptions map[int]chan []*remote.SubscribeLogsReply + hasLogSubscriptions bool lock sync.RWMutex + onNewSnapshotsHappened bool } func NewEvents() *Events { return &Events{ - headerSubscriptions: map[int]HeaderSubscription{}, + headerSubscriptions: map[int]chan [][]byte{}, pendingLogsSubscriptions: map[int]PendingLogsSubscription{}, pendingBlockSubscriptions: map[int]PendingBlockSubscription{}, pendingTxsSubscriptions: map[int]PendingTxsSubscription{}, + logsSubscriptions: map[int]chan []*remote.SubscribeLogsReply{}, + newSnapshotSubscription: map[int]chan struct{}{}, } } -func (e *Events) AddHeaderSubscription(s HeaderSubscription) { +func (e *Events) AddHeaderSubscription() (chan [][]byte, func()) { e.lock.Lock() defer e.lock.Unlock() - e.headerSubscriptions[len(e.headerSubscriptions)] = s + ch := make(chan [][]byte, 8) + e.id++ + id := e.id + e.headerSubscriptions[id] = ch + return ch, func() { + delete(e.headerSubscriptions, id) + close(ch) + } +} + +func (e *Events) AddNewSnapshotSubscription() (chan struct{}, func()) { + e.lock.Lock() + defer e.lock.Unlock() + ch := make(chan struct{}, 8) + e.id++ + id := e.id + e.newSnapshotSubscription[id] = ch + return ch, func() { + delete(e.newSnapshotSubscription, id) + close(ch) + } +} + +func (e *Events) AddLogsSubscription() (chan []*remote.SubscribeLogsReply, func()) { + e.lock.Lock() + defer e.lock.Unlock() + ch := make(chan []*remote.SubscribeLogsReply, 8) + e.id++ + id := e.id + e.logsSubscriptions[id] = ch + return ch, func() { + delete(e.logsSubscriptions, id) + close(ch) + } +} + +func (e *Events) EmptyLogSubsctiption(empty bool) { + e.lock.Lock() + defer e.lock.Unlock() + e.hasLogSubscriptions = !empty +} + +func (e *Events) HasLogSubsriptions() bool { + e.lock.RLock() + defer e.lock.RUnlock() + return e.hasLogSubscriptions } func (e *Events) AddPendingLogsSubscription(s PendingLogsSubscription) { @@ -49,12 +104,45 @@ func (e *Events) AddPendingBlockSubscription(s PendingBlockSubscription) { e.pendingBlockSubscriptions[len(e.pendingBlockSubscriptions)] = s } -func (e *Events) OnNewHeader(newHeader *types.Header) { +func (e *Events) OnNewSnapshotHappened() bool { + e.lock.RLock() + defer e.lock.RUnlock() + return e.onNewSnapshotsHappened +} + +func (e *Events) OnNewSnapshot() { e.lock.Lock() defer e.lock.Unlock() - for i, sub := range e.headerSubscriptions { - if err := sub(newHeader); err != nil { - delete(e.headerSubscriptions, i) + e.onNewSnapshotsHappened = true + for _, ch := range e.newSnapshotSubscription { + select { + case ch <- struct{}{}: + default: //if channel is full (slow consumer), drop old messages + for i := 0; i < cap(ch)/2; i++ { + select { + case <-ch: + default: + } + } + ch <- struct{}{} + } + } +} + +func (e *Events) OnNewHeader(newHeadersRlp [][]byte) { + e.lock.Lock() + defer e.lock.Unlock() + for _, ch := range e.headerSubscriptions { + select { + case ch <- newHeadersRlp: + default: //if channel is full (slow consumer), drop old messages + for i := 0; i < cap(ch)/2; i++ { + select { + case <-ch: + default: + } + } + ch <- newHeadersRlp } } } @@ -68,3 +156,21 @@ func (e *Events) OnNewPendingLogs(logs types.Logs) { } } } + +func (e *Events) OnLogs(logs []*remote.SubscribeLogsReply) { + e.lock.Lock() + defer e.lock.Unlock() + for _, ch := range e.logsSubscriptions { + select { + case ch <- logs: + default: //if channel is full (slow consumer), drop old messages + for i := 0; i < cap(ch)/2; i++ { + select { + case <-ch: + default: + } + } + ch <- logs + } + } +} diff --git a/ethdb/privateapi/logsfilter.go b/ethdb/privateapi/logsfilter.go new file mode 100644 index 00000000000..93b6a09a730 --- /dev/null +++ b/ethdb/privateapi/logsfilter.go @@ -0,0 +1,191 @@ +package privateapi + +import ( + "fmt" + "io" + "sync" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/gointerfaces/types" + "github.com/ledgerwatch/erigon/common" +) + +type LogsFilterAggregator struct { + aggLogsFilter LogsFilter // Aggregation of all current log filters + logsFilters map[uint64]*LogsFilter // Filter for each subscriber, keyed by filterID + logsFilterLock sync.Mutex + nextFilterId uint64 + events *Events +} + +// LogsFilter is used for both representing log filter for a specific subscriber (RPC daemon usually) +// and "aggregated" log filter representing a union of all subscribers. Therefore, the values in +// the mappings are counters (of type int) and they get deleted when counter goes back to 0 +// Also, addAddr and allTopic are int instead of bool because they are also counter, counting +// how many subscribers have this set on +type LogsFilter struct { + allAddrs int + addrs map[common.Address]int + allTopics int + topics map[common.Hash]int + sender remote.ETHBACKEND_SubscribeLogsServer // nil for aggregate subscriber, for appropriate stream server otherwise +} + +func NewLogsFilterAggregator(events *Events) *LogsFilterAggregator { + return &LogsFilterAggregator{ + aggLogsFilter: LogsFilter{ + addrs: make(map[common.Address]int), + topics: make(map[common.Hash]int), + }, + logsFilters: make(map[uint64]*LogsFilter), + nextFilterId: 0, + events: events, + } +} + +func (a *LogsFilterAggregator) insertLogsFilter(sender remote.ETHBACKEND_SubscribeLogsServer) (uint64, *LogsFilter) { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + filterId := a.nextFilterId + a.nextFilterId++ + filter := &LogsFilter{addrs: make(map[common.Address]int), topics: make(map[common.Hash]int), sender: sender} + a.logsFilters[filterId] = filter + return filterId, filter +} + +func (a *LogsFilterAggregator) checkEmpty() { + a.events.EmptyLogSubsctiption(a.aggLogsFilter.allAddrs == 0 && len(a.aggLogsFilter.addrs) == 0 && a.aggLogsFilter.allTopics == 0 && len(a.aggLogsFilter.topics) == 0) +} + +func (a *LogsFilterAggregator) removeLogsFilter(filterId uint64, filter *LogsFilter) { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + a.subtractLogFilters(filter) + delete(a.logsFilters, filterId) + a.checkEmpty() +} + +func (a *LogsFilterAggregator) updateLogsFilter(filter *LogsFilter, filterReq *remote.LogsFilterRequest) { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + a.subtractLogFilters(filter) + filter.addrs = make(map[common.Address]int) + if filterReq.GetAllAddresses() { + filter.allAddrs = 1 + } else { + filter.allAddrs = 0 + for _, addr := range filterReq.GetAddresses() { + filter.addrs[gointerfaces.ConvertH160toAddress(addr)] = 1 + } + } + filter.topics = make(map[common.Hash]int) + if filterReq.GetAllTopics() { + filter.allTopics = 1 + } else { + filter.allTopics = 0 + for _, topic := range filterReq.GetTopics() { + filter.topics[gointerfaces.ConvertH256ToHash(topic)] = 1 + } + } + a.addLogsFilters(filter) + a.checkEmpty() +} + +func (a *LogsFilterAggregator) subtractLogFilters(f *LogsFilter) { + a.aggLogsFilter.allAddrs -= f.allAddrs + for addr, count := range f.addrs { + a.aggLogsFilter.addrs[addr] -= count + if a.aggLogsFilter.addrs[addr] == 0 { + delete(a.aggLogsFilter.addrs, addr) + } + } + a.aggLogsFilter.allTopics -= f.allTopics + for topic, count := range f.topics { + a.aggLogsFilter.topics[topic] -= count + if a.aggLogsFilter.topics[topic] == 0 { + delete(a.aggLogsFilter.topics, topic) + } + } +} + +func (a *LogsFilterAggregator) addLogsFilters(f *LogsFilter) { + a.aggLogsFilter.allAddrs += f.allAddrs + for addr, count := range f.addrs { + a.aggLogsFilter.addrs[addr] += count + } + a.aggLogsFilter.allTopics += f.allTopics + for topic, count := range f.topics { + a.aggLogsFilter.topics[topic] += count + } +} + +// SubscribeLogs +// Only one subscription is needed to serve all the users, LogsFilterRequest allows to dynamically modifying the subscription +func (a *LogsFilterAggregator) subscribeLogs(server remote.ETHBACKEND_SubscribeLogsServer) error { + filterId, filter := a.insertLogsFilter(server) + defer a.removeLogsFilter(filterId, filter) + // Listen to filter updates and modify the filters, until terminated + var filterReq *remote.LogsFilterRequest + var recvErr error + for filterReq, recvErr = server.Recv(); recvErr == nil; filterReq, recvErr = server.Recv() { + a.updateLogsFilter(filter, filterReq) + } + if recvErr != nil && recvErr != io.EOF { // termination + return fmt.Errorf("receiving log filter request: %w", recvErr) + } + return nil +} + +func (a *LogsFilterAggregator) distributeLogs(logs []*remote.SubscribeLogsReply) error { + a.logsFilterLock.Lock() + defer a.logsFilterLock.Unlock() + + filtersToDelete := make(map[uint64]*LogsFilter) +outerLoop: + for _, log := range logs { + // Use aggregate filter first + if a.aggLogsFilter.allAddrs == 0 { + if _, addrOk := a.aggLogsFilter.addrs[gointerfaces.ConvertH160toAddress(log.Address)]; !addrOk { + continue + } + } + if a.aggLogsFilter.allTopics == 0 { + if !a.chooseTopics(a.aggLogsFilter.topics, log.GetTopics()) { + continue + } + } + for filterId, filter := range a.logsFilters { + if filter.allAddrs == 0 { + if _, addrOk := filter.addrs[gointerfaces.ConvertH160toAddress(log.Address)]; !addrOk { + continue + } + } + if filter.allTopics == 0 { + if !a.chooseTopics(filter.topics, log.GetTopics()) { + continue + } + } + if err := filter.sender.Send(log); err != nil { + filtersToDelete[filterId] = filter + continue outerLoop + } + } + } + // remove malfunctioned filters + for filterId, filter := range filtersToDelete { + a.subtractLogFilters(filter) + delete(a.logsFilters, filterId) + } + + return nil +} + +func (a *LogsFilterAggregator) chooseTopics(filterTopics map[common.Hash]int, logTopics []*types.H256) bool { + for _, logTopic := range logTopics { + if _, ok := filterTopics[gointerfaces.ConvertH256ToHash(logTopic)]; ok { + return true + } + } + return false +} diff --git a/ethdb/privateapi/mining.go b/ethdb/privateapi/mining.go index a0f34875393..883673a44f0 100644 --- a/ethdb/privateapi/mining.go +++ b/ethdb/privateapi/mining.go @@ -17,7 +17,7 @@ import ( "google.golang.org/protobuf/types/known/emptypb" ) -// EthBackendServiceAPIVersion +// MiningAPIVersion // 2.0.0 - move all mining-related methods to 'txpool/mining' server var MiningAPIVersion = &types2.VersionReply{Major: 1, Minor: 0, Patch: 0} @@ -166,7 +166,7 @@ func (s *MinedBlockStreams) Broadcast(reply *proto_txpool.OnMinedBlockReply) { for id, stream := range s.chans { err := stream.Send(reply) if err != nil { - log.Debug("failed send to mined block stream", "err", err) + log.Trace("failed send to mined block stream", "err", err) select { case <-stream.Context().Done(): delete(s.chans, id) @@ -211,7 +211,7 @@ func (s *PendingBlockStreams) Broadcast(reply *proto_txpool.OnPendingBlockReply) for id, stream := range s.chans { err := stream.Send(reply) if err != nil { - log.Debug("failed send to mined block stream", "err", err) + log.Trace("failed send to mined block stream", "err", err) select { case <-stream.Context().Done(): delete(s.chans, id) @@ -256,7 +256,7 @@ func (s *PendingLogsStreams) Broadcast(reply *proto_txpool.OnPendingLogsReply) { for id, stream := range s.chans { err := stream.Send(reply) if err != nil { - log.Debug("failed send to mined block stream", "err", err) + log.Trace("failed send to mined block stream", "err", err) select { case <-stream.Context().Done(): delete(s.chans, id) diff --git a/ethdb/privateapi/txpool.go b/ethdb/privateapi/txpool.go deleted file mode 100644 index 85c49a35fdb..00000000000 --- a/ethdb/privateapi/txpool.go +++ /dev/null @@ -1,174 +0,0 @@ -package privateapi - -import ( - "bytes" - "context" - "fmt" - - "github.com/ledgerwatch/erigon-lib/gointerfaces" - proto_txpool "github.com/ledgerwatch/erigon-lib/gointerfaces/txpool" - types2 "github.com/ledgerwatch/erigon-lib/gointerfaces/types" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/event" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" - "google.golang.org/protobuf/types/known/emptypb" -) - -// TxPoolAPIVersion -var TxPoolAPIVersion = &types2.VersionReply{Major: 1, Minor: 0, Patch: 0} - -type txPool interface { - Get(hash common.Hash) types.Transaction - AddLocals(txs []types.Transaction) []error - Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) - SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription -} - -type TxPoolServer struct { - proto_txpool.UnimplementedTxpoolServer - ctx context.Context - txPool txPool -} - -func NewTxPoolServer(ctx context.Context, txPool txPool) *TxPoolServer { - return &TxPoolServer{ctx: ctx, txPool: txPool} -} - -func (s *TxPoolServer) Version(context.Context, *emptypb.Empty) (*types2.VersionReply, error) { - return MiningAPIVersion, nil -} -func (s *TxPoolServer) All(context.Context, *proto_txpool.AllRequest) (*proto_txpool.AllReply, error) { - pending, queued := s.txPool.Content() - reply := &proto_txpool.AllReply{} - reply.Txs = make([]*proto_txpool.AllReply_Tx, 0, 32) - for addr, list := range pending { - addrBytes := addr.Bytes() - for i := range list { - b, err := rlp.EncodeToBytes(list[i]) - if err != nil { - return nil, err - } - reply.Txs = append(reply.Txs, &proto_txpool.AllReply_Tx{ - Sender: addrBytes, - Type: proto_txpool.AllReply_PENDING, - RlpTx: b, - }) - } - } - - for addr, list := range queued { - addrBytes := addr.Bytes() - for i := range list { - b, err := rlp.EncodeToBytes(list[i]) - if err != nil { - return nil, err - } - reply.Txs = append(reply.Txs, &proto_txpool.AllReply_Tx{ - Sender: addrBytes, - Type: proto_txpool.AllReply_QUEUED, - RlpTx: b, - }) - } - } - - return reply, nil -} - -func (s *TxPoolServer) FindUnknown(ctx context.Context, in *proto_txpool.TxHashes) (*proto_txpool.TxHashes, error) { - return nil, fmt.Errorf("unimplemented") - /* - var underpriced int - for i := range in.Hashes { - h := gointerfaces.ConvertH256ToHash(in.Hashes[i]) - if s.txPool.Has(h) { - continue - } - if s.underpriced.Contains(h) { - underpriced++ - continue - } - reply.Hashes = append(reply.Hashes, in.Hashes[i]) - } - txAnnounceInMeter.Mark(int64(len(in.Hashes))) - txAnnounceKnownMeter.Mark(int64(len(in.Hashes) - len(reply.Hashes))) - txAnnounceUnderpricedMeter.Mark(int64(underpriced)) - */ -} - -func (s *TxPoolServer) Add(ctx context.Context, in *proto_txpool.AddRequest) (*proto_txpool.AddReply, error) { - reply := &proto_txpool.AddReply{Imported: make([]proto_txpool.ImportResult, len(in.RlpTxs)), Errors: make([]string, len(in.RlpTxs))} - txs, err := types.UnmarshalTransactionsFromBinary(in.RlpTxs) - if err != nil { - return nil, err - } - errs := s.txPool.AddLocals(txs) - for i, err := range errs { - if err == nil { - continue - } - - reply.Errors[i] = err.Error() - - // Track a few interesting failure types - switch err { - case nil: // Noop, but need to handle to not count these - - case core.ErrAlreadyKnown: - reply.Imported[i] = proto_txpool.ImportResult_ALREADY_EXISTS - case core.ErrUnderpriced, core.ErrReplaceUnderpriced: - reply.Imported[i] = proto_txpool.ImportResult_FEE_TOO_LOW - case core.ErrInvalidSender, core.ErrGasLimit, core.ErrNegativeValue, core.ErrOversizedData: - reply.Imported[i] = proto_txpool.ImportResult_INVALID - default: - reply.Imported[i] = proto_txpool.ImportResult_INTERNAL_ERROR - } - } - return reply, nil -} - -func (s *TxPoolServer) OnAdd(req *proto_txpool.OnAddRequest, stream proto_txpool.Txpool_OnAddServer) error { - txsCh := make(chan core.NewTxsEvent, 1024) - defer close(txsCh) - sub := s.txPool.SubscribeNewTxsEvent(txsCh) - defer sub.Unsubscribe() - - var buf bytes.Buffer - var rplTxs [][]byte - for txs := range txsCh { - rplTxs = rplTxs[:0] - for _, tx := range txs.Txs { - buf.Reset() - if err := tx.MarshalBinary(&buf); err != nil { - log.Warn("error while marshaling a pending transaction", "err", err) - return err - } - rplTxs = append(rplTxs, common.CopyBytes(buf.Bytes())) - } - if err := stream.Send(&proto_txpool.OnAddReply{RplTxs: rplTxs}); err != nil { - return err - } - } - return nil -} - -func (s *TxPoolServer) Transactions(ctx context.Context, in *proto_txpool.TransactionsRequest) (*proto_txpool.TransactionsReply, error) { - buf := bytes.NewBuffer(nil) - reply := &proto_txpool.TransactionsReply{RlpTxs: make([][]byte, len(in.Hashes))} - for i := range in.Hashes { - txn := s.txPool.Get(gointerfaces.ConvertH256ToHash(in.Hashes[i])) - if txn == nil { - reply.RlpTxs[i] = nil - continue - } - buf.Reset() - if err := txn.MarshalBinary(buf); err != nil { - return nil, err - } - reply.RlpTxs[i] = common.CopyBytes(buf.Bytes()) - } - - return reply, nil -} diff --git a/ethdb/prune/storage_mode.go b/ethdb/prune/storage_mode.go index 2ab2930c6a3..29607850046 100644 --- a/ethdb/prune/storage_mode.go +++ b/ethdb/prune/storage_mode.go @@ -2,8 +2,11 @@ package prune import ( "encoding/binary" + "errors" "fmt" "math" + "reflect" + "strings" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/params" @@ -11,10 +14,10 @@ import ( var DefaultMode = Mode{ Initialised: true, - History: math.MaxUint64, // all off - Receipts: math.MaxUint64, - TxIndex: math.MaxUint64, - CallTraces: math.MaxUint64, + History: Distance(math.MaxUint64), // all off + Receipts: Distance(math.MaxUint64), + TxIndex: Distance(math.MaxUint64), + CallTraces: Distance(math.MaxUint64), Experiments: Experiments{}, // all off } @@ -22,43 +25,65 @@ type Experiments struct { TEVM bool } -func FromCli(flags string, exactHistory, exactReceipts, exactTxIndex, exactCallTraces uint64, experiments []string) (Mode, error) { +func FromCli(flags string, exactHistory, exactReceipts, exactTxIndex, exactCallTraces, + beforeH, beforeR, beforeT, beforeC uint64, experiments []string) (Mode, error) { mode := DefaultMode - if flags == "default" || flags == "disabled" { - return DefaultMode, nil - } - mode.Initialised = true - for _, flag := range flags { - switch flag { - case 'h': - mode.History = params.FullImmutabilityThreshold - case 'r': - mode.Receipts = params.FullImmutabilityThreshold - case 't': - mode.TxIndex = params.FullImmutabilityThreshold - case 'c': - mode.CallTraces = params.FullImmutabilityThreshold - default: - return DefaultMode, fmt.Errorf("unexpected flag found: %c", flag) + if flags != "default" && flags != "disabled" { + mode.Initialised = true + for _, flag := range flags { + switch flag { + case 'h': + mode.History = Distance(params.FullImmutabilityThreshold) + case 'r': + mode.Receipts = Distance(params.FullImmutabilityThreshold) + case 't': + mode.TxIndex = Distance(params.FullImmutabilityThreshold) + case 'c': + mode.CallTraces = Distance(params.FullImmutabilityThreshold) + default: + return DefaultMode, fmt.Errorf("unexpected flag found: %c", flag) + } } } if exactHistory > 0 { + mode.Initialised = true mode.History = Distance(exactHistory) } if exactReceipts > 0 { + mode.Initialised = true mode.Receipts = Distance(exactReceipts) } if exactTxIndex > 0 { + mode.Initialised = true mode.TxIndex = Distance(exactTxIndex) } if exactCallTraces > 0 { + mode.Initialised = true mode.CallTraces = Distance(exactCallTraces) } + if beforeH > 0 { + mode.Initialised = true + mode.History = Before(beforeH) + } + if beforeR > 0 { + mode.Initialised = true + mode.Receipts = Before(beforeR) + } + if beforeT > 0 { + mode.Initialised = true + mode.TxIndex = Before(beforeT) + } + if beforeC > 0 { + mode.Initialised = true + mode.CallTraces = Before(beforeC) + } + for _, ex := range experiments { switch ex { case "tevm": + mode.Initialised = true mode.Experiments.TEVM = true case "": // skip @@ -74,61 +99,64 @@ func Get(db kv.Getter) (Mode, error) { prune := DefaultMode prune.Initialised = true - v, err := db.GetOne(kv.DatabaseInfo, kv.PruneDistanceHistory) + blockAmount, err := get(db, kv.PruneHistory) if err != nil { return prune, err } - if v != nil { - prune.History = Distance(binary.BigEndian.Uint64(v)) - } else { - prune.History = math.MaxUint64 + if blockAmount != nil { + prune.History = blockAmount } - v, err = db.GetOne(kv.DatabaseInfo, kv.PruneDistanceReceipts) + + blockAmount, err = get(db, kv.PruneReceipts) if err != nil { return prune, err } - if v != nil { - prune.Receipts = Distance(binary.BigEndian.Uint64(v)) - } else { - prune.Receipts = math.MaxUint64 + if blockAmount != nil { + prune.Receipts = blockAmount } - v, err = db.GetOne(kv.DatabaseInfo, kv.PruneDistanceTxIndex) + + blockAmount, err = get(db, kv.PruneTxIndex) if err != nil { return prune, err } - if v != nil { - prune.TxIndex = Distance(binary.BigEndian.Uint64(v)) - } else { - prune.TxIndex = math.MaxUint64 + if blockAmount != nil { + prune.TxIndex = blockAmount } - v, err = db.GetOne(kv.DatabaseInfo, kv.PruneDistanceCallTraces) + blockAmount, err = get(db, kv.PruneCallTraces) if err != nil { return prune, err } - if v != nil { - prune.CallTraces = Distance(binary.BigEndian.Uint64(v)) - } else { - prune.CallTraces = math.MaxUint64 + if blockAmount != nil { + prune.CallTraces = blockAmount } - v, err = db.GetOne(kv.DatabaseInfo, kv.StorageModeTEVM) + v, err := db.GetOne(kv.DatabaseInfo, kv.StorageModeTEVM) if err != nil { return prune, err } prune.Experiments.TEVM = len(v) == 1 && v[0] == 1 + return prune, nil } type Mode struct { Initialised bool // Set when the values are initialised (not default) - History Distance - Receipts Distance - TxIndex Distance - CallTraces Distance + History BlockAmount + Receipts BlockAmount + TxIndex BlockAmount + CallTraces BlockAmount Experiments Experiments } +type BlockAmount interface { + PruneTo(stageHead uint64) uint64 + Enabled() bool + toValue() uint64 + dbType() []byte + useDefaultValue() bool +} + // Distance amount of blocks to keep in DB // but manual manipulation with such distance is very unsafe // for example: @@ -136,7 +164,10 @@ type Mode struct { // may delete whole db - because of uint64 underflow when pruningDistance > currentStageProgress type Distance uint64 -func (p Distance) Enabled() bool { return p != math.MaxUint64 } +func (p Distance) Enabled() bool { return p != math.MaxUint64 } +func (p Distance) toValue() uint64 { return uint64(p) } +func (p Distance) useDefaultValue() bool { return uint64(p) == params.FullImmutabilityThreshold } +func (p Distance) dbType() []byte { return kv.PruneTypeOlder } func (p Distance) PruneTo(stageHead uint64) uint64 { if p == 0 { @@ -148,44 +179,62 @@ func (p Distance) PruneTo(stageHead uint64) uint64 { return stageHead - uint64(p) } +// Before number after which keep in DB +type Before uint64 + +func (b Before) Enabled() bool { return b > 0 } +func (b Before) toValue() uint64 { return uint64(b) } +func (b Before) useDefaultValue() bool { return uint64(b) == 0 } +func (b Before) dbType() []byte { return kv.PruneTypeBefore } + +func (b Before) PruneTo(uint64) uint64 { + if b == 0 { + return uint64(b) + } + + return uint64(b) - 1 +} + func (m Mode) String() string { if !m.Initialised { return "default" } + const defaultVal uint64 = params.FullImmutabilityThreshold long := "" - short := "--prune=" + short := "" if m.History.Enabled() { - if m.History == params.FullImmutabilityThreshold { - short += "h" + if m.History.useDefaultValue() { + short += fmt.Sprintf(" --prune.h.older=%d", defaultVal) } else { - long += fmt.Sprintf(" --prune.h.older=%d", m.History) + long += fmt.Sprintf(" --prune.h.%s=%d", m.History.dbType(), m.History.toValue()) } } if m.Receipts.Enabled() { - if m.Receipts == params.FullImmutabilityThreshold { - short += "r" + if m.Receipts.useDefaultValue() { + short += fmt.Sprintf(" --prune.r.older=%d", defaultVal) } else { - long += fmt.Sprintf(" --prune.r.older=%d", m.Receipts) + long += fmt.Sprintf(" --prune.r.%s=%d", m.Receipts.dbType(), m.Receipts.toValue()) } } if m.TxIndex.Enabled() { - if m.TxIndex == params.FullImmutabilityThreshold { - short += "t" + if m.TxIndex.useDefaultValue() { + short += fmt.Sprintf(" --prune.t.older=%d", defaultVal) } else { - long += fmt.Sprintf(" --prune.t.older=%d", m.TxIndex) + long += fmt.Sprintf(" --prune.t.%s=%d", m.TxIndex.dbType(), m.TxIndex.toValue()) } } if m.CallTraces.Enabled() { - if m.CallTraces == params.FullImmutabilityThreshold { - short += "c" + if m.CallTraces.useDefaultValue() { + short += fmt.Sprintf(" --prune.c.older=%d", defaultVal) } else { - long += fmt.Sprintf(" --prune.c.older=%d", m.CallTraces) + long += fmt.Sprintf(" --prune.c.%s=%d", m.CallTraces.dbType(), m.CallTraces.toValue()) } } if m.Experiments.TEVM { long += " --experiments.tevm=enabled" } - return short + long + + return strings.TrimLeft(short+long, " ") } func Override(db kv.RwTx, sm Mode) error { @@ -193,22 +242,22 @@ func Override(db kv.RwTx, sm Mode) error { err error ) - err = setDistance(db, kv.PruneDistanceHistory, sm.History) + err = set(db, kv.PruneHistory, sm.History) if err != nil { return err } - err = setDistance(db, kv.PruneDistanceReceipts, sm.Receipts) + err = set(db, kv.PruneReceipts, sm.Receipts) if err != nil { return err } - err = setDistance(db, kv.PruneDistanceTxIndex, sm.TxIndex) + err = set(db, kv.PruneTxIndex, sm.TxIndex) if err != nil { return err } - err = setDistance(db, kv.PruneDistanceCallTraces, sm.CallTraces) + err = set(db, kv.PruneCallTraces, sm.CallTraces) if err != nil { return err } @@ -221,7 +270,28 @@ func Override(db kv.RwTx, sm Mode) error { return nil } -func SetIfNotExist(db kv.GetPut, pm Mode) error { +// EnsureNotChanged - prohibit change some configs after node creation. prohibit from human mistakes +func EnsureNotChanged(tx kv.GetPut, pruneMode Mode) (Mode, error) { + err := setIfNotExist(tx, pruneMode) + if err != nil { + return pruneMode, err + } + + pm, err := Get(tx) + if err != nil { + return pruneMode, err + } + + if pruneMode.Initialised { + // If storage mode is not explicitly specified, we take whatever is in the database + if !reflect.DeepEqual(pm, pruneMode) { + return pm, errors.New("not allowed change of --prune flag, last time you used: " + pm.String()) + } + } + return pm, nil +} + +func setIfNotExist(db kv.GetPut, pm Mode) error { var ( err error ) @@ -229,54 +299,99 @@ func SetIfNotExist(db kv.GetPut, pm Mode) error { pm = DefaultMode } - err = setDistanceOnEmpty(db, kv.PruneDistanceHistory, pm.History) - if err != nil { - return err + pruneDBData := map[string]BlockAmount{ + string(kv.PruneHistory): pm.History, + string(kv.PruneReceipts): pm.Receipts, + string(kv.PruneTxIndex): pm.TxIndex, + string(kv.PruneCallTraces): pm.CallTraces, } - err = setDistanceOnEmpty(db, kv.PruneDistanceReceipts, pm.Receipts) - if err != nil { - return err + for key, value := range pruneDBData { + err = setOnEmpty(db, []byte(key), value) + if err != nil { + return err + } } - err = setDistanceOnEmpty(db, kv.PruneDistanceTxIndex, pm.TxIndex) + err = setModeOnEmpty(db, kv.StorageModeTEVM, pm.Experiments.TEVM) if err != nil { return err } - err = setDistanceOnEmpty(db, kv.PruneDistanceCallTraces, pm.CallTraces) + return nil +} + +func createBlockAmount(pruneType []byte, v []byte) (BlockAmount, error) { + var blockAmount BlockAmount + + switch string(pruneType) { + case string(kv.PruneTypeOlder): + blockAmount = Distance(binary.BigEndian.Uint64(v)) + case string(kv.PruneTypeBefore): + blockAmount = Before(binary.BigEndian.Uint64(v)) + default: + return nil, fmt.Errorf("unexpected block amount type: %s", string(pruneType)) + } + + return blockAmount, nil +} + +func get(db kv.Getter, key []byte) (BlockAmount, error) { + v, err := db.GetOne(kv.DatabaseInfo, key) if err != nil { - return err + return nil, err } - err = setModeOnEmpty(db, kv.StorageModeTEVM, pm.Experiments.TEVM) + vType, err := db.GetOne(kv.DatabaseInfo, keyType(key)) if err != nil { - return err + return nil, err } - return nil + if v != nil { + blockAmount, err := createBlockAmount(vType, v) + if err != nil { + return nil, err + } + return blockAmount, nil + } + + return nil, nil } -func setDistance(db kv.Putter, key []byte, distance Distance) error { +func set(db kv.Putter, key []byte, blockAmount BlockAmount) error { v := make([]byte, 8) - binary.BigEndian.PutUint64(v, uint64(distance)) + binary.BigEndian.PutUint64(v, blockAmount.toValue()) if err := db.Put(kv.DatabaseInfo, key, v); err != nil { return err } + + keyType := keyType(key) + + if err := db.Put(kv.DatabaseInfo, keyType, blockAmount.dbType()); err != nil { + return err + } + return nil } -func setDistanceOnEmpty(db kv.GetPut, key []byte, distance Distance) error { +func keyType(name []byte) []byte { + return append(name, []byte("Type")...) +} + +func setOnEmpty(db kv.GetPut, key []byte, blockAmount BlockAmount) error { mode, err := db.GetOne(kv.DatabaseInfo, key) if err != nil { return err } - if len(mode) == 0 || binary.BigEndian.Uint64(mode) == math.MaxUint64 { + if len(mode) == 0 { v := make([]byte, 8) - binary.BigEndian.PutUint64(v, uint64(distance)) + binary.BigEndian.PutUint64(v, blockAmount.toValue()) if err = db.Put(kv.DatabaseInfo, key, v); err != nil { return err } + if err = db.Put(kv.DatabaseInfo, keyType(key), blockAmount.dbType()); err != nil { + return err + } } return nil diff --git a/ethdb/prune/storage_mode_test.go b/ethdb/prune/storage_mode_test.go index d5fad13310e..7afc5c81c5c 100644 --- a/ethdb/prune/storage_mode_test.go +++ b/ethdb/prune/storage_mode_test.go @@ -1,6 +1,8 @@ package prune import ( + "math/rand" + "strconv" "testing" "github.com/ledgerwatch/erigon-lib/kv/memdb" @@ -12,12 +14,62 @@ func TestSetStorageModeIfNotExist(t *testing.T) { _, tx := memdb.NewTestTx(t) prune, err := Get(tx) assert.NoError(t, err) - assert.Equal(t, Mode{true, math.MaxUint64, math.MaxUint64, math.MaxUint64, math.MaxUint64, Experiments{TEVM: false}}, prune) + assert.Equal(t, Mode{true, Distance(math.MaxUint64), Distance(math.MaxUint64), + Distance(math.MaxUint64), Distance(math.MaxUint64), Experiments{TEVM: false}}, prune) - err = SetIfNotExist(tx, Mode{true, 1, 2, 3, 4, Experiments{TEVM: false}}) + err = setIfNotExist(tx, Mode{true, Distance(1), Distance(2), + Before(3), Before(4), Experiments{TEVM: false}}) assert.NoError(t, err) prune, err = Get(tx) assert.NoError(t, err) - assert.Equal(t, Mode{true, 1, 2, 3, 4, Experiments{TEVM: false}}, prune) + assert.Equal(t, Mode{true, Distance(1), Distance(2), + Before(3), Before(4), Experiments{TEVM: false}}, prune) +} + +var distanceTests = []struct { + stageHead uint64 + pruneTo uint64 + expected uint64 +}{ + {3_000_000, 1, 2_999_999}, + {3_000_000, 4_000_000, 0}, + {3_000_000, math.MaxUint64, 0}, + {3_000_000, 1_000_000, 2_000_000}, +} + +func TestDistancePruneTo(t *testing.T) { + for _, tt := range distanceTests { + t.Run(strconv.FormatUint(tt.pruneTo, 10), func(t *testing.T) { + stageHead := tt.stageHead + d := Distance(tt.pruneTo) + pruneTo := d.PruneTo(stageHead) + + if pruneTo != tt.expected { + t.Errorf("got %d, want %d", pruneTo, tt.expected) + } + }) + } +} + +var beforeTests = []struct { + pruneTo uint64 + expected uint64 +}{ + {0, 0}, + {1_000_000, 999_999}, +} + +func TestBeforePruneTo(t *testing.T) { + for _, tt := range beforeTests { + t.Run(strconv.FormatUint(tt.pruneTo, 10), func(t *testing.T) { + stageHead := uint64(rand.Int63n(10_000_000)) + b := Before(tt.pruneTo) + pruneTo := b.PruneTo(stageHead) + + if pruneTo != tt.expected { + t.Errorf("got %d, want %d", pruneTo, tt.expected) + } + }) + } } diff --git a/ethdb/remotedb/kv_remote.go b/ethdb/remotedb/kv_remote.go deleted file mode 100644 index 2fe57348be7..00000000000 --- a/ethdb/remotedb/kv_remote.go +++ /dev/null @@ -1,648 +0,0 @@ -package remotedb - -import ( - "bytes" - "context" - "crypto/tls" - "crypto/x509" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "time" - - "github.com/c2h5oh/datasize" - "github.com/ledgerwatch/erigon-lib/gointerfaces" - "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/log/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/backoff" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/test/bufconn" - "google.golang.org/protobuf/types/known/emptypb" -) - -// generate the messages and services -type remoteOpts struct { - bucketsCfg mdbx.TableCfgFunc - inMemConn *bufconn.Listener // for tests - DialAddress string - version gointerfaces.Version - log log.Logger -} - -type RemoteKV struct { - conn *grpc.ClientConn - remoteKV remote.KVClient - log log.Logger - buckets kv.TableCfg - opts remoteOpts -} - -type remoteTx struct { - stream remote.KV_TxClient - ctx context.Context - streamCancelFn context.CancelFunc - db *RemoteKV - cursors []*remoteCursor - statelessCursors map[string]kv.Cursor - streamingRequested bool -} - -type remoteCursor struct { - ctx context.Context - stream remote.KV_TxClient - tx *remoteTx - bucketName string - bucketCfg kv.TableCfgItem - id uint32 -} - -type remoteCursorDupSort struct { - *remoteCursor -} - -func (opts remoteOpts) ReadOnly() remoteOpts { - return opts -} - -func (opts remoteOpts) Path(path string) remoteOpts { - opts.DialAddress = path - return opts -} - -func (opts remoteOpts) WithBucketsConfig(f mdbx.TableCfgFunc) remoteOpts { - opts.bucketsCfg = f - return opts -} - -func (opts remoteOpts) InMem(listener *bufconn.Listener) remoteOpts { - opts.inMemConn = listener - return opts -} - -func (opts remoteOpts) Open(certFile, keyFile, caCert string) (*RemoteKV, error) { - var dialOpts []grpc.DialOption - - backoffCfg := backoff.DefaultConfig - backoffCfg.BaseDelay = 500 * time.Millisecond - backoffCfg.MaxDelay = 10 * time.Second - dialOpts = []grpc.DialOption{ - grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoffCfg, MinConnectTimeout: 10 * time.Minute}), - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(int(15 * datasize.MB))), - grpc.WithKeepaliveParams(keepalive.ClientParameters{}), - } - if certFile == "" { - dialOpts = append(dialOpts, grpc.WithInsecure()) - } else { - var creds credentials.TransportCredentials - var err error - if caCert == "" { - creds, err = credentials.NewClientTLSFromFile(certFile, "") - - if err != nil { - return nil, err - } - } else { - // load peer cert/key, ca cert - peerCert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - log.Error("load peer cert/key error:%v", err) - return nil, err - } - caCert, err := ioutil.ReadFile(caCert) - if err != nil { - log.Error("read ca cert file error:%v", err) - return nil, err - } - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM(caCert) - creds = credentials.NewTLS(&tls.Config{ - Certificates: []tls.Certificate{peerCert}, - ClientCAs: caCertPool, - ClientAuth: tls.RequireAndVerifyClientCert, - //nolint:gosec - InsecureSkipVerify: true, // This is to make it work when Common Name does not match - remove when procedure is updated for common name - }) - } - - dialOpts = append(dialOpts, grpc.WithTransportCredentials(creds)) - } - - if opts.inMemConn != nil { - dialOpts = append(dialOpts, grpc.WithContextDialer(func(ctx context.Context, url string) (net.Conn, error) { - return opts.inMemConn.Dial() - })) - } - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - conn, err := grpc.DialContext(ctx, opts.DialAddress, dialOpts...) - if err != nil { - return nil, err - } - - kvClient := remote.NewKVClient(conn) - db := &RemoteKV{ - opts: opts, - conn: conn, - remoteKV: kvClient, - log: log.New("remote_db", opts.DialAddress), - buckets: kv.TableCfg{}, - } - customBuckets := opts.bucketsCfg(kv.ChaindataTablesCfg) - for name, cfg := range customBuckets { // copy map to avoid changing global variable - db.buckets[name] = cfg - } - - return db, nil -} - -func (opts remoteOpts) MustOpen() kv.RwDB { - db, err := opts.Open("", "", "") - if err != nil { - panic(err) - } - return db -} - -// NewRemote defines new remove KV connection (without actually opening it) -// version parameters represent the version the KV client is expecting, -// compatibility check will be performed when the KV connection opens -func NewRemote(v gointerfaces.Version, logger log.Logger) remoteOpts { - return remoteOpts{bucketsCfg: mdbx.WithChaindataTables, version: v, log: logger} -} - -func (db *RemoteKV) AllBuckets() kv.TableCfg { - return db.buckets -} - -func (db *RemoteKV) GrpcConn() *grpc.ClientConn { - return db.conn -} - -func (db *RemoteKV) EnsureVersionCompatibility() bool { - versionReply, err := db.remoteKV.Version(context.Background(), &emptypb.Empty{}, grpc.WaitForReady(true)) - if err != nil { - db.log.Error("getting Version", "error", err) - return false - } - if !gointerfaces.EnsureVersion(db.opts.version, versionReply) { - db.log.Error("incompatible interface versions", "client", db.opts.version.String(), - "server", fmt.Sprintf("%d.%d.%d", versionReply.Major, versionReply.Minor, versionReply.Patch)) - return false - } - db.log.Info("interfaces compatible", "client", db.opts.version.String(), - "server", fmt.Sprintf("%d.%d.%d", versionReply.Major, versionReply.Minor, versionReply.Patch)) - return true -} - -func (db *RemoteKV) Close() { - if db.conn != nil { - if err := db.conn.Close(); err != nil { - db.log.Warn("failed to close remote DB", "err", err) - } else { - db.log.Info("remote database closed") - } - db.conn = nil - } -} - -func (db *RemoteKV) BeginRo(ctx context.Context) (kv.Tx, error) { - streamCtx, streamCancelFn := context.WithCancel(ctx) // We create child context for the stream so we can cancel it to prevent leak - stream, err := db.remoteKV.Tx(streamCtx) - if err != nil { - streamCancelFn() - return nil, err - } - return &remoteTx{ctx: ctx, db: db, stream: stream, streamCancelFn: streamCancelFn}, nil -} - -func (db *RemoteKV) BeginRw(ctx context.Context) (kv.RwTx, error) { - return nil, fmt.Errorf("remote db provider doesn't support .BeginRw method") -} - -func (db *RemoteKV) View(ctx context.Context, f func(tx kv.Tx) error) (err error) { - tx, err := db.BeginRo(ctx) - if err != nil { - return err - } - defer tx.Rollback() - - return f(tx) -} - -func (db *RemoteKV) Update(ctx context.Context, f func(tx kv.RwTx) error) (err error) { - return fmt.Errorf("remote db provider doesn't support .Update method") -} - -func (tx *remoteTx) CollectMetrics() {} -func (tx *remoteTx) IncrementSequence(bucket string, amount uint64) (uint64, error) { - panic("not implemented yet") -} -func (tx *remoteTx) ReadSequence(bucket string) (uint64, error) { - panic("not implemented yet") -} -func (tx *remoteTx) Append(bucket string, k, v []byte) error { panic("no write methods") } -func (tx *remoteTx) AppendDup(bucket string, k, v []byte) error { panic("no write methods") } - -func (tx *remoteTx) Commit() error { - panic("remote db is read-only") -} - -func (tx *remoteTx) Rollback() { - for _, c := range tx.cursors { - c.Close() - } - tx.closeGrpcStream() -} - -func (tx *remoteTx) statelessCursor(bucket string) (kv.Cursor, error) { - if tx.statelessCursors == nil { - tx.statelessCursors = make(map[string]kv.Cursor) - } - c, ok := tx.statelessCursors[bucket] - if !ok { - var err error - c, err = tx.Cursor(bucket) - if err != nil { - return nil, err - } - tx.statelessCursors[bucket] = c - } - return c, nil -} - -func (tx *remoteTx) BucketSize(name string) (uint64, error) { panic("not implemented") } - -// TODO: this must be optimized - and implemented as single command on server, with server-side buffered streaming -func (tx *remoteTx) ForEach(bucket string, fromPrefix []byte, walker func(k, v []byte) error) error { - c, err := tx.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - - for k, v, err := c.Seek(fromPrefix); k != nil; k, v, err = c.Next() { - if err != nil { - return err - } - if err := walker(k, v); err != nil { - return err - } - } - return nil -} - -// TODO: this must be optimized - and implemented as single command on server, with server-side buffered streaming -func (tx *remoteTx) ForPrefix(bucket string, prefix []byte, walker func(k, v []byte) error) error { - c, err := tx.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - - for k, v, err := c.Seek(prefix); k != nil; k, v, err = c.Next() { - if err != nil { - return err - } - if !bytes.HasPrefix(k, prefix) { - break - } - if err := walker(k, v); err != nil { - return err - } - } - return nil -} - -func (tx *remoteTx) ForAmount(bucket string, fromPrefix []byte, amount uint32, walker func(k, v []byte) error) error { - c, err := tx.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - - for k, v, err := c.Seek(fromPrefix); k != nil && amount > 0; k, v, err = c.Next() { - if err != nil { - return err - } - if err := walker(k, v); err != nil { - return err - } - amount-- - } - return nil -} - -func (tx *remoteTx) GetOne(bucket string, key []byte) (val []byte, err error) { - c, err := tx.statelessCursor(bucket) - if err != nil { - return nil, err - } - _, val, err = c.SeekExact(key) - return val, err -} - -func (tx *remoteTx) Has(bucket string, key []byte) (bool, error) { - c, err := tx.statelessCursor(bucket) - if err != nil { - return false, err - } - k, _, err := c.Seek(key) - if err != nil { - return false, err - } - return bytes.Equal(key, k), nil -} - -func (c *remoteCursor) SeekExact(key []byte) (k, val []byte, err error) { - return c.seekExact(key) -} - -func (c *remoteCursor) Prev() ([]byte, []byte, error) { - return c.prev() -} - -func (tx *remoteTx) Cursor(bucket string) (kv.Cursor, error) { - b := tx.db.buckets[bucket] - c := &remoteCursor{tx: tx, ctx: tx.ctx, bucketName: bucket, bucketCfg: b, stream: tx.stream} - tx.cursors = append(tx.cursors, c) - if err := c.stream.Send(&remote.Cursor{Op: remote.Op_OPEN, BucketName: c.bucketName}); err != nil { - return nil, err - } - msg, err := c.stream.Recv() - if err != nil { - return nil, err - } - c.id = msg.CursorID - return c, nil -} - -func (c *remoteCursor) Put(key []byte, value []byte) error { panic("not supported") } -func (c *remoteCursor) PutNoOverwrite(key []byte, value []byte) error { panic("not supported") } -func (c *remoteCursor) Append(key []byte, value []byte) error { panic("not supported") } -func (c *remoteCursor) Delete(k, v []byte) error { panic("not supported") } -func (c *remoteCursor) DeleteCurrent() error { panic("not supported") } -func (c *remoteCursor) Count() (uint64, error) { panic("not supported") } - -func (c *remoteCursor) first() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_FIRST}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} - -func (c *remoteCursor) next() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_NEXT}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) nextDup() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_NEXT_DUP}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) nextNoDup() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_NEXT_NO_DUP}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) prev() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_PREV}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) prevDup() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_PREV_DUP}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) prevNoDup() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_PREV_NO_DUP}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) last() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_LAST}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) setRange(k []byte) ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_SEEK, K: k}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) seekExact(k []byte) ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_SEEK_EXACT, K: k}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) getBothRange(k, v []byte) ([]byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_SEEK_BOTH, K: k, V: v}); err != nil { - return nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return nil, err - } - return pair.V, nil -} -func (c *remoteCursor) seekBothExact(k, v []byte) ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_SEEK_BOTH_EXACT, K: k, V: v}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} -func (c *remoteCursor) firstDup() ([]byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_FIRST_DUP}); err != nil { - return nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return nil, err - } - return pair.V, nil -} -func (c *remoteCursor) lastDup() ([]byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_LAST_DUP}); err != nil { - return nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return nil, err - } - return pair.V, nil -} -func (c *remoteCursor) getCurrent() ([]byte, []byte, error) { - if err := c.stream.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_CURRENT}); err != nil { - return []byte{}, nil, err - } - pair, err := c.stream.Recv() - if err != nil { - return []byte{}, nil, err - } - return pair.K, pair.V, nil -} - -func (c *remoteCursor) Current() ([]byte, []byte, error) { - return c.getCurrent() -} - -// Seek - doesn't start streaming (because much of code does only several .Seek calls without reading sequence of data) -// .Next() - does request streaming (if configured by user) -func (c *remoteCursor) Seek(seek []byte) ([]byte, []byte, error) { - return c.setRange(seek) -} - -func (c *remoteCursor) First() ([]byte, []byte, error) { - return c.first() -} - -// Next - returns next data element from server, request streaming (if configured by user) -func (c *remoteCursor) Next() ([]byte, []byte, error) { - return c.next() -} - -func (c *remoteCursor) Last() ([]byte, []byte, error) { - return c.last() -} - -func (tx *remoteTx) closeGrpcStream() { - if tx.stream == nil { - return - } - defer tx.streamCancelFn() // hard cancel stream if graceful wasn't successful - - if tx.streamingRequested { - // if streaming is in progress, can't use `CloseSend` - because - // server will not read it right not - it busy with streaming data - // TODO: set flag 'tx.streamingRequested' to false when got terminator from server (nil key or os.EOF) - tx.streamCancelFn() - } else { - // try graceful close stream - err := tx.stream.CloseSend() - if err != nil { - if !errors.Is(err, io.EOF) && !errors.Is(err, context.Canceled) { - log.Warn("couldn't send msg CloseSend to server", "err", err) - } - } else { - _, err = tx.stream.Recv() - if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, context.Canceled) { - log.Warn("received unexpected error from server after CloseSend", "err", err) - } - } - } - tx.stream = nil - tx.streamingRequested = false -} - -func (c *remoteCursor) Close() { - if c.stream == nil { - return - } - st := c.stream - c.stream = nil - if err := st.Send(&remote.Cursor{Cursor: c.id, Op: remote.Op_CLOSE}); err == nil { - _, _ = st.Recv() - } -} - -func (tx *remoteTx) CursorDupSort(bucket string) (kv.CursorDupSort, error) { - c, err := tx.Cursor(bucket) - if err != nil { - return nil, err - } - return &remoteCursorDupSort{remoteCursor: c.(*remoteCursor)}, nil -} - -func (c *remoteCursorDupSort) SeekBothExact(key, value []byte) ([]byte, []byte, error) { - return c.seekBothExact(key, value) -} - -func (c *remoteCursorDupSort) SeekBothRange(key, value []byte) ([]byte, error) { - return c.getBothRange(key, value) -} - -func (c *remoteCursorDupSort) DeleteExact(k1, k2 []byte) error { panic("not supported") } -func (c *remoteCursorDupSort) AppendDup(k []byte, v []byte) error { panic("not supported") } -func (c *remoteCursorDupSort) PutNoDupData(key, value []byte) error { panic("not supported") } -func (c *remoteCursorDupSort) DeleteCurrentDuplicates() error { panic("not supported") } -func (c *remoteCursorDupSort) CountDuplicates() (uint64, error) { panic("not supported") } - -func (c *remoteCursorDupSort) FirstDup() ([]byte, error) { - return c.firstDup() -} -func (c *remoteCursorDupSort) NextDup() ([]byte, []byte, error) { - return c.nextDup() -} -func (c *remoteCursorDupSort) NextNoDup() ([]byte, []byte, error) { - return c.nextNoDup() -} -func (c *remoteCursorDupSort) PrevDup() ([]byte, []byte, error) { - return c.prevDup() -} -func (c *remoteCursorDupSort) PrevNoDup() ([]byte, []byte, error) { - return c.prevNoDup() -} -func (c *remoteCursorDupSort) LastDup() ([]byte, error) { - return c.lastDup() -} diff --git a/ethdb/remotedbserver/server.go b/ethdb/remotedbserver/server.go deleted file mode 100644 index 0a43d00eebd..00000000000 --- a/ethdb/remotedbserver/server.go +++ /dev/null @@ -1,225 +0,0 @@ -package remotedbserver - -import ( - "context" - "fmt" - "io" - "time" - - "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" - "github.com/ledgerwatch/erigon-lib/gointerfaces/types" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "google.golang.org/protobuf/types/known/emptypb" -) - -const MaxTxTTL = 30 * time.Second - -// KvServiceAPIVersion - use it to track changes in API -// 1.1.0 - added pending transactions, add methods eth_getRawTransactionByHash, eth_retRawTransactionByBlockHashAndIndex, eth_retRawTransactionByBlockNumberAndIndex| Yes | | -// 1.2.0 - Added separated services for mining and txpool methods -// 2.0.0 - Rename all buckets -var KvServiceAPIVersion = &types.VersionReply{Major: 3, Minor: 0, Patch: 0} - -type KvServer struct { - remote.UnimplementedKVServer // must be embedded to have forward compatible implementations. - - kv kv.RwDB -} - -func NewKvServer(kv kv.RwDB) *KvServer { - return &KvServer{kv: kv} -} - -// Version returns the service-side interface version number -func (s *KvServer) Version(context.Context, *emptypb.Empty) (*types.VersionReply, error) { - dbSchemaVersion := &kv.DBSchemaVersion - if KvServiceAPIVersion.Major > dbSchemaVersion.Major { - return KvServiceAPIVersion, nil - } - if dbSchemaVersion.Major > KvServiceAPIVersion.Major { - return dbSchemaVersion, nil - } - if KvServiceAPIVersion.Minor > dbSchemaVersion.Minor { - return KvServiceAPIVersion, nil - } - if dbSchemaVersion.Minor > KvServiceAPIVersion.Minor { - return dbSchemaVersion, nil - } - return dbSchemaVersion, nil -} - -func (s *KvServer) Tx(stream remote.KV_TxServer) error { - tx, errBegin := s.kv.BeginRo(stream.Context()) - if errBegin != nil { - return fmt.Errorf("server-side error: %w", errBegin) - } - rollback := func() { - tx.Rollback() - } - defer rollback() - - var CursorID uint32 - type CursorInfo struct { - bucket string - c kv.Cursor - k, v []byte //fields to save current position of cursor - used when Tx reopen - } - cursors := map[uint32]*CursorInfo{} - - txTicker := time.NewTicker(MaxTxTTL) - defer txTicker.Stop() - - // send all items to client, if k==nil - still send it to client and break loop - for { - in, recvErr := stream.Recv() - if recvErr != nil { - if recvErr == io.EOF { // termination - return nil - } - return fmt.Errorf("server-side error: %w", recvErr) - } - - //TODO: protect against client - which doesn't send any requests - select { - default: - case <-txTicker.C: - for _, c := range cursors { // save positions of cursor, will restore after Tx reopening - k, v, err := c.c.Current() - if err != nil { - return err - } - c.k = common.CopyBytes(k) - c.v = common.CopyBytes(v) - } - - tx.Rollback() - tx, errBegin = s.kv.BeginRo(stream.Context()) - if errBegin != nil { - return fmt.Errorf("server-side error, BeginRo: %w", errBegin) - } - - for _, c := range cursors { // restore all cursors position - var err error - c.c, err = tx.Cursor(c.bucket) - if err != nil { - return err - } - switch casted := c.c.(type) { - case kv.CursorDupSort: - v, err := casted.SeekBothRange(c.k, c.v) - if err != nil { - return fmt.Errorf("server-side error: %w", err) - } - if v == nil { // it may happen that key where we stopped disappeared after transaction reopen, then just move to next key - _, _, err = casted.Next() - if err != nil { - return fmt.Errorf("server-side error: %w", err) - } - } - case kv.Cursor: - if _, _, err := c.c.Seek(c.k); err != nil { - return fmt.Errorf("server-side error: %w", err) - } - } - } - } - - var c kv.Cursor - if in.BucketName == "" { - cInfo, ok := cursors[in.Cursor] - if !ok { - return fmt.Errorf("server-side error: unknown Cursor=%d, Op=%s", in.Cursor, in.Op) - } - c = cInfo.c - } - - switch in.Op { - case remote.Op_OPEN: - CursorID++ - var err error - c, err = tx.Cursor(in.BucketName) - if err != nil { - return err - } - cursors[CursorID] = &CursorInfo{ - bucket: in.BucketName, - c: c, - } - if err := stream.Send(&remote.Pair{CursorID: CursorID}); err != nil { - return fmt.Errorf("server-side error: %w", err) - } - continue - case remote.Op_CLOSE: - cInfo, ok := cursors[in.Cursor] - if !ok { - return fmt.Errorf("server-side error: unknown Cursor=%d, Op=%s", in.Cursor, in.Op) - } - cInfo.c.Close() - delete(cursors, in.Cursor) - if err := stream.Send(&remote.Pair{}); err != nil { - return fmt.Errorf("server-side error: %w", err) - } - continue - default: - } - - if err := handleOp(c, stream, in); err != nil { - return fmt.Errorf("server-side error: %w", err) - } - } -} - -func handleOp(c kv.Cursor, stream remote.KV_TxServer, in *remote.Cursor) error { - var k, v []byte - var err error - switch in.Op { - case remote.Op_FIRST: - k, v, err = c.First() - case remote.Op_FIRST_DUP: - v, err = c.(kv.CursorDupSort).FirstDup() - case remote.Op_SEEK: - k, v, err = c.Seek(in.K) - case remote.Op_SEEK_BOTH: - v, err = c.(kv.CursorDupSort).SeekBothRange(in.K, in.V) - case remote.Op_CURRENT: - k, v, err = c.Current() - case remote.Op_LAST: - k, v, err = c.Last() - case remote.Op_LAST_DUP: - v, err = c.(kv.CursorDupSort).LastDup() - case remote.Op_NEXT: - k, v, err = c.Next() - case remote.Op_NEXT_DUP: - k, v, err = c.(kv.CursorDupSort).NextDup() - case remote.Op_NEXT_NO_DUP: - k, v, err = c.(kv.CursorDupSort).NextNoDup() - case remote.Op_PREV: - k, v, err = c.Prev() - //case remote.Op_PREV_DUP: - // k, v, err = c.(ethdb.CursorDupSort).Prev() - // if err != nil { - // return err - // } - //case remote.Op_PREV_NO_DUP: - // k, v, err = c.Prev() - // if err != nil { - // return err - // } - case remote.Op_SEEK_EXACT: - k, v, err = c.SeekExact(in.K) - case remote.Op_SEEK_BOTH_EXACT: - k, v, err = c.(kv.CursorDupSort).SeekBothExact(in.K, in.V) - default: - return fmt.Errorf("unknown operation: %s", in.Op) - } - if err != nil { - return err - } - - if err := stream.Send(&remote.Pair{K: k, V: v}); err != nil { - return err - } - - return nil -} diff --git a/ethdb/snapshotdb/kv_snapshot.go b/ethdb/snapshotdb/kv_snapshot.go deleted file mode 100644 index a66a3e00f53..00000000000 --- a/ethdb/snapshotdb/kv_snapshot.go +++ /dev/null @@ -1,1032 +0,0 @@ -package snapshotdb - -import ( - "bytes" - "context" - "errors" - "fmt" - "sync" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/log/v3" -) - -var ( - _ kv.RwDB = &SnapshotKV{} - _ kv.RoDB = &SnapshotKV{} - _ kv.Tx = &snTX{} - _ kv.BucketMigrator = &snTX{} - _ kv.RwCursor = &snCursor{} - _ kv.Cursor = &snCursor{} -) - -type SnapshotUpdater interface { - UpdateSnapshots(tp string, snapshotKV kv.RoDB, done chan struct{}) - HeadersSnapshot() kv.RoDB - BodiesSnapshot() kv.RoDB - StateSnapshot() kv.RoDB -} - -type WriteDB interface { - WriteDB() kv.RwDB -} - -func NewSnapshotKV() snapshotOpts { - - return snapshotOpts{} -} - -type snapshotOpts struct { - db kv.RwDB - headersSnapshot kv.RoDB - bodiesSnapshot kv.RoDB - stateSnapshot kv.RoDB -} - -func (opts snapshotOpts) HeadersSnapshot(kv kv.RoDB) snapshotOpts { - opts.headersSnapshot = kv - return opts -} -func (opts snapshotOpts) BodiesSnapshot(kv kv.RoDB) snapshotOpts { - opts.bodiesSnapshot = kv - return opts -} -func (opts snapshotOpts) StateSnapshot(kv kv.RoDB) snapshotOpts { - opts.stateSnapshot = kv - return opts -} - -func (opts snapshotOpts) DB(db kv.RwDB) snapshotOpts { - opts.db = db - return opts -} - -func (opts snapshotOpts) Open() *SnapshotKV { - return &SnapshotKV{ - headersSnapshot: opts.headersSnapshot, - bodiesSnapshot: opts.bodiesSnapshot, - stateSnapshot: opts.stateSnapshot, - db: opts.db, - } -} - -type SnapshotKV struct { - db kv.RwDB - headersSnapshot kv.RoDB - bodiesSnapshot kv.RoDB - stateSnapshot kv.RoDB - mtx sync.RWMutex - - tmpDB kv.RwDB - tmpDBBuckets map[string]struct{} -} - -func (s *SnapshotKV) View(ctx context.Context, f func(tx kv.Tx) error) error { - snTX, err := s.BeginRo(ctx) - if err != nil { - return err - } - defer snTX.Rollback() - return f(snTX) -} - -func (s *SnapshotKV) Update(ctx context.Context, f func(tx kv.RwTx) error) error { - tx, err := s.BeginRw(ctx) - if err != nil { - return err - } - defer tx.Rollback() - - err = f(tx) - if err == nil { - return tx.Commit() - } - return err -} - -func (s *SnapshotKV) Close() { - defer s.db.Close() - s.mtx.Lock() - defer s.mtx.Unlock() - if s.headersSnapshot != nil { - defer s.headersSnapshot.Close() - } - if s.bodiesSnapshot != nil { - defer s.bodiesSnapshot.Close() - } - if s.stateSnapshot != nil { - defer s.stateSnapshot.Close() - } -} - -func (s *SnapshotKV) UpdateSnapshots(tp string, snapshotKV kv.RoDB, done chan struct{}) { - var toClose kv.RoDB - s.mtx.Lock() - defer s.mtx.Unlock() - switch { - case tp == "headers": - toClose = s.headersSnapshot - s.headersSnapshot = snapshotKV - case tp == "bodies": - toClose = s.bodiesSnapshot - s.bodiesSnapshot = snapshotKV - case tp == "state": - toClose = s.stateSnapshot - s.stateSnapshot = snapshotKV - default: - log.Error("incorrect type", "tp", tp) - } - - go func() { - if toClose != nil { - toClose.Close() - } - done <- struct{}{} - log.Info("old snapshot closed", "tp", tp) - }() -} - -func (s *SnapshotKV) WriteDB() kv.RwDB { - return s.db -} - -func (s *SnapshotKV) TempDB() kv.RwDB { - return s.tmpDB -} - -func (s *SnapshotKV) SetTempDB(kv kv.RwDB, buckets []string) { - bucketsMap := make(map[string]struct{}, len(buckets)) - for _, bucket := range buckets { - bucketsMap[bucket] = struct{}{} - } - s.tmpDB = kv - s.tmpDBBuckets = bucketsMap -} - -//todo -func (s *SnapshotKV) HeadersSnapshot() kv.RoDB { - return s.headersSnapshot -} -func (s *SnapshotKV) BodiesSnapshot() kv.RoDB { - return s.bodiesSnapshot -} -func (s *SnapshotKV) StateSnapshot() kv.RoDB { - return s.stateSnapshot -} - -func (s *SnapshotKV) snapsthotsTx(ctx context.Context) (kv.Tx, kv.Tx, kv.Tx, error) { - var headersTX, bodiesTX, stateTX kv.Tx - var err error - defer func() { - if err != nil { - if headersTX != nil { - headersTX.Rollback() - } - if bodiesTX != nil { - bodiesTX.Rollback() - } - if stateTX != nil { - stateTX.Rollback() - } - } - }() - if s.headersSnapshot != nil { - headersTX, err = s.headersSnapshot.BeginRo(ctx) - if err != nil { - return nil, nil, nil, err - } - } - if s.bodiesSnapshot != nil { - bodiesTX, err = s.bodiesSnapshot.BeginRo(ctx) - if err != nil { - return nil, nil, nil, err - } - } - if s.stateSnapshot != nil { - stateTX, err = s.stateSnapshot.BeginRo(ctx) - if err != nil { - return nil, nil, nil, err - } - } - return headersTX, bodiesTX, stateTX, nil -} -func (s *SnapshotKV) BeginRo(ctx context.Context) (kv.Tx, error) { - dbTx, err := s.db.BeginRo(ctx) - if err != nil { - return nil, err - } - var tmpTX kv.Tx - if s.tmpDB != nil { - tmpTX, err = s.tmpDB.BeginRo(context.Background()) - if err != nil { - return nil, err - } - } - headersTX, bodiesTX, stateTX, err := s.snapsthotsTx(ctx) - if err != nil { - return nil, err - } - return &snTX{ - dbTX: dbTx, - headersTX: headersTX, - bodiesTX: bodiesTX, - stateTX: stateTX, - tmpTX: tmpTX, - buckets: s.tmpDBBuckets, - }, nil -} - -func (s *SnapshotKV) BeginRw(ctx context.Context) (kv.RwTx, error) { - dbTx, err := s.db.BeginRw(ctx) //nolint - if err != nil { - return nil, err - } - - var tmpTX kv.Tx - if s.tmpDB != nil { - tmpTX, err = s.tmpDB.BeginRw(context.Background()) - if err != nil { - return nil, err - } - } - - headersTX, bodiesTX, stateTX, err := s.snapsthotsTx(ctx) - if err != nil { - return nil, err - } - - return &snTX{ - dbTX: dbTx, - headersTX: headersTX, - bodiesTX: bodiesTX, - stateTX: stateTX, - tmpTX: tmpTX, - buckets: s.tmpDBBuckets, - }, nil -} - -func (s *SnapshotKV) AllBuckets() kv.TableCfg { - return s.db.AllBuckets() -} - -var ErrUnavailableSnapshot = errors.New("unavailable snapshot") - -type snTX struct { - dbTX kv.Tx - headersTX kv.Tx - bodiesTX kv.Tx - stateTX kv.Tx - - //just an experiment with temp db for state snapshot migration. - tmpTX kv.Tx - buckets map[string]struct{} -} - -type DBTX interface { - DBTX() kv.RwTx -} - -func (s *snTX) DBTX() kv.RwTx { - return s.dbTX.(kv.RwTx) -} -func (s *snTX) RwCursor(bucket string) (kv.RwCursor, error) { - if !IsSnapshotBucket(bucket) { - return s.dbTX.(kv.RwTx).RwCursor(bucket) - } - tx, err := s.getSnapshotTX(bucket) - if err != nil && !errors.Is(err, ErrUnavailableSnapshot) { - panic(err.Error()) - } - //process only db buckets - if errors.Is(err, ErrUnavailableSnapshot) { - return s.dbTX.(kv.RwTx).RwCursor(bucket) - } - - snCursor2, err := tx.Cursor(bucket) - if err != nil { - return nil, err - } - - if IsStateSnapshotSnapshotBucket(bucket) && s.tmpTX != nil { - mainDBCursor, err := s.dbTX.Cursor(bucket) - if err != nil { - return nil, err - } - tmpDBCursor, err := s.tmpTX.(kv.RwTx).RwCursor(bucket) - if err != nil { - return nil, err - } - - return &snCursor{ - dbCursor: &snCursor{ - dbCursor: tmpDBCursor, - snCursor: mainDBCursor, - }, - snCursor: snCursor2, - }, nil - } - dbCursor, err := s.dbTX.(kv.RwTx).RwCursor(bucket) - if err != nil { - return nil, err - } - - return &snCursor{ - dbCursor: dbCursor, - snCursor: snCursor2, - }, nil - -} - -func (s *snTX) DropBucket(bucket string) error { - return s.dbTX.(kv.BucketMigrator).DropBucket(bucket) -} - -func (s *snTX) CreateBucket(bucket string) error { - return s.dbTX.(kv.BucketMigrator).CreateBucket(bucket) -} - -func (s *snTX) ExistsBucket(bucket string) (bool, error) { - return s.dbTX.(kv.BucketMigrator).ExistsBucket(bucket) -} - -func (s *snTX) ClearBucket(bucket string) error { - return s.dbTX.(kv.BucketMigrator).ClearBucket(bucket) -} - -func (s *snTX) ListBuckets() ([]string, error) { - return s.dbTX.(kv.BucketMigrator).ListBuckets() -} - -func (s *snTX) Cursor(bucket string) (kv.Cursor, error) { - if !IsSnapshotBucket(bucket) { - return s.dbTX.Cursor(bucket) - } - - tx, err := s.getSnapshotTX(bucket) - if err != nil && !errors.Is(err, ErrUnavailableSnapshot) { - panic(err.Error()) - } - //process only db buckets - if errors.Is(err, ErrUnavailableSnapshot) { - return s.dbTX.Cursor(bucket) - } - dbCursor, err := s.dbTX.Cursor(bucket) - if err != nil { - return nil, err - } - snCursor2, err := tx.Cursor(bucket) - if err != nil { - return nil, err - } - if IsStateSnapshotSnapshotBucket(bucket) && s.tmpTX != nil { - tmpDBCursor, err := s.tmpTX.Cursor(bucket) - if err != nil { - return nil, err - } - - return &snCursor{ - dbCursor: &snCursor{ - dbCursor: tmpDBCursor, - snCursor: dbCursor, - }, - snCursor: snCursor2, - }, nil - } - return &snCursor{ - dbCursor: dbCursor, - snCursor: snCursor2, - }, nil -} - -func (s *snTX) CursorDupSort(bucket string) (kv.CursorDupSort, error) { - tx, err := s.getSnapshotTX(bucket) - if err != nil && !errors.Is(err, ErrUnavailableSnapshot) { - panic(err.Error()) - } - //process only db buckets - if errors.Is(err, ErrUnavailableSnapshot) { - return s.dbTX.CursorDupSort(bucket) - } - dbc, err := s.dbTX.CursorDupSort(bucket) - if err != nil { - return nil, err - } - sncbc, err := tx.CursorDupSort(bucket) - if err != nil { - return nil, err - } - return &snCursorDup{ - dbc, - sncbc, - snCursor{ - dbCursor: dbc, - snCursor: sncbc, - }, - }, nil -} - -func (s *snTX) RwCursorDupSort(bucket string) (kv.RwCursorDupSort, error) { - c, err := s.CursorDupSort(bucket) - if err != nil { - return nil, err - } - return c.(kv.RwCursorDupSort), nil -} -func (s *snTX) GetOne(bucket string, key []byte) (val []byte, err error) { - v, err := s.dbTX.GetOne(bucket, key) - if err != nil { - return nil, err - } - if len(v) == 0 { - snTx, innerErr := s.getSnapshotTX(bucket) - if innerErr != nil && !errors.Is(innerErr, ErrUnavailableSnapshot) { - return nil, innerErr - } - //process only db buckets - if errors.Is(innerErr, ErrUnavailableSnapshot) { - return v, nil - } - v, err = snTx.GetOne(bucket, key) - if err != nil { - return nil, err - } - if bytes.Equal(v, DeletedValue) { - return nil, nil - } - return v, nil - } - return v, nil -} - -func (s *snTX) Put(bucket string, k, v []byte) error { - if s.tmpTX != nil && IsStateSnapshotSnapshotBucket(bucket) { - return s.tmpTX.(kv.RwTx).Put(bucket, k, v) - } - return s.dbTX.(kv.RwTx).Put(bucket, k, v) -} -func (s *snTX) Append(bucket string, k, v []byte) error { - if s.tmpTX != nil && IsStateSnapshotSnapshotBucket(bucket) { - return s.tmpTX.(kv.RwTx).Put(bucket, k, v) - } - return s.dbTX.(kv.RwTx).Append(bucket, k, v) -} -func (s *snTX) AppendDup(bucket string, k, v []byte) error { - if s.tmpTX != nil && IsStateSnapshotSnapshotBucket(bucket) { - return s.tmpTX.(kv.RwTx).Put(bucket, k, v) - } - return s.dbTX.(kv.RwTx).AppendDup(bucket, k, v) -} -func (s *snTX) Delete(bucket string, k, v []byte) error { - //note we can't use Delete here, because we can't change snapshots - //if we delete in main database we can find the value in snapshot - //so we are just marking that this value is deleted. - //this value will be removed on snapshot merging - if s.tmpTX != nil && IsStateSnapshotSnapshotBucket(bucket) { - return s.tmpTX.(kv.RwTx).Put(bucket, k, DeletedValue) - } - - return s.dbTX.(kv.RwTx).Put(bucket, k, DeletedValue) -} - -func (s *snTX) CollectMetrics() { - if rw, ok := s.dbTX.(kv.RwTx); ok { - rw.CollectMetrics() - } -} - -func (s *snTX) getSnapshotTX(bucket string) (kv.Tx, error) { - var tx kv.Tx - switch bucket { - case kv.Headers: - tx = s.headersTX - case kv.BlockBody, kv.EthTx: - tx = s.bodiesTX - case kv.PlainState, kv.PlainContractCode, kv.Code: - tx = s.stateTX - } - if tx == nil { - return nil, fmt.Errorf("%s %w", bucket, ErrUnavailableSnapshot) - } - return tx, nil -} - -func (s *snTX) Has(bucket string, key []byte) (bool, error) { - v, err := s.dbTX.Has(bucket, key) - if err != nil { - return false, err - } - if !v { - snTx, err := s.getSnapshotTX(bucket) - if err != nil && !errors.Is(err, ErrUnavailableSnapshot) { - return false, err - } - //process only db buckets - if errors.Is(err, ErrUnavailableSnapshot) { - return v, nil - } - - v, err := snTx.GetOne(bucket, key) - if err != nil { - return false, err - } - if bytes.Equal(v, DeletedValue) { - return false, nil - } - - return true, nil - } - return v, nil -} - -func (s *snTX) ForEach(bucket string, fromPrefix []byte, walker func(k, v []byte) error) error { - c, err := s.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - - for k, v, err := c.Seek(fromPrefix); k != nil; k, v, err = c.Next() { - if err != nil { - return err - } - if err := walker(k, v); err != nil { - return err - } - } - return nil -} - -func (s *snTX) ForPrefix(bucket string, prefix []byte, walker func(k, v []byte) error) error { - c, err := s.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - - for k, v, err := c.Seek(prefix); k != nil; k, v, err = c.Next() { - if err != nil { - return err - } - if !bytes.HasPrefix(k, prefix) { - break - } - if err := walker(k, v); err != nil { - return err - } - } - return nil -} -func (s *snTX) ForAmount(bucket string, fromPrefix []byte, amount uint32, walker func(k, v []byte) error) error { - c, err := s.Cursor(bucket) - if err != nil { - return err - } - defer c.Close() - - for k, v, err := c.Seek(fromPrefix); k != nil && amount > 0; k, v, err = c.Next() { - if err != nil { - return err - } - if err := walker(k, v); err != nil { - return err - } - amount-- - } - return nil -} - -func (s *snTX) Commit() error { - defer s.snapshotsRollback() - if s.tmpTX != nil { - err := s.tmpTX.Commit() - if err != nil { - s.dbTX.Rollback() - return err - } - } - return s.dbTX.Commit() -} -func (s *snTX) snapshotsRollback() { - if s.headersTX != nil { - defer s.headersTX.Rollback() - } - if s.bodiesTX != nil { - defer s.bodiesTX.Rollback() - } - if s.stateTX != nil { - defer s.stateTX.Rollback() - } -} -func (s *snTX) Rollback() { - defer s.snapshotsRollback() - defer func() { - if s.tmpTX != nil { - s.tmpTX.Rollback() - } - }() - s.dbTX.Rollback() -} - -func (s *snTX) BucketSize(bucket string) (uint64, error) { - return s.dbTX.BucketSize(bucket) -} - -func (s *snTX) IncrementSequence(bucket string, amount uint64) (uint64, error) { - return s.dbTX.(kv.RwTx).IncrementSequence(bucket, amount) -} - -func (s *snTX) ReadSequence(bucket string) (uint64, error) { - return s.dbTX.ReadSequence(bucket) -} - -func (s *snTX) BucketExists(bucket string) (bool, error) { - return s.dbTX.(ethdb.BucketsMigrator).BucketExists(bucket) -} - -func (s *snTX) ClearBuckets(buckets ...string) error { - return s.dbTX.(ethdb.BucketsMigrator).ClearBuckets(buckets...) -} - -func (s *snTX) DropBuckets(buckets ...string) error { - return s.dbTX.(ethdb.BucketsMigrator).DropBuckets(buckets...) -} - -var DeletedValue = []byte{0} - -type snCursor struct { - dbCursor kv.Cursor - snCursor kv.Cursor - - currentKey []byte -} - -func (s *snCursor) First() ([]byte, []byte, error) { - var err error - lastDBKey, lastDBVal, err := s.dbCursor.First() - if err != nil { - return nil, nil, err - } - - for bytes.Equal(lastDBVal, DeletedValue) { - lastDBKey, lastDBVal, err = s.dbCursor.Next() - if err != nil { - return nil, nil, err - } - - } - - lastSNDBKey, lastSNDBVal, err := s.snCursor.First() - if err != nil { - return nil, nil, err - } - cmp, br := common.KeyCmp(lastDBKey, lastSNDBKey) - if br { - return nil, nil, nil - } - - if cmp <= 0 { - s.saveCurrent(lastDBKey) - return lastDBKey, lastDBVal, nil - } - s.saveCurrent(lastSNDBKey) - return lastSNDBKey, lastSNDBVal, nil -} - -func (s *snCursor) Seek(seek []byte) ([]byte, []byte, error) { - dbKey, dbVal, err := s.dbCursor.Seek(seek) - if err != nil && !errors.Is(err, ethdb.ErrKeyNotFound) { - return nil, nil, err - } - - for bytes.Equal(dbVal, DeletedValue) { - dbKey, dbVal, err = s.dbCursor.Next() - if err != nil { - return nil, nil, err - } - } - - sndbKey, sndbVal, err := s.snCursor.Seek(seek) - if err != nil && !errors.Is(err, ethdb.ErrKeyNotFound) { - return nil, nil, err - } - - if bytes.Equal(dbKey, seek) && dbVal != nil { - return dbKey, dbVal, err - } - if bytes.Equal(sndbKey, seek) && sndbVal != nil { - return sndbKey, sndbVal, err - } - cmp, _ := common.KeyCmp(dbKey, sndbKey) - if cmp <= 0 { - s.saveCurrent(dbKey) - return dbKey, dbVal, nil - } - s.saveCurrent(sndbKey) - return sndbKey, sndbVal, nil -} - -func (s *snCursor) SeekExact(key []byte) ([]byte, []byte, error) { - k, v, err := s.dbCursor.SeekExact(key) - if err != nil { - return nil, nil, err - } - if bytes.Equal(v, DeletedValue) { - return nil, nil, nil - } - if v == nil { - k, v, err = s.snCursor.SeekExact(key) - s.saveCurrent(k) - return k, v, err - } - s.saveCurrent(k) - return k, v, err -} - -func (s *snCursor) iteration(dbNextElement func() ([]byte, []byte, error), sndbNextElement func() ([]byte, []byte, error), cmpFunc func(kdb, ksndb []byte) (int, bool)) ([]byte, []byte, error) { - var err error - var noDBNext, noSnDBNext bool - //current returns error on empty bucket - lastDBKey, lastDBVal, err := s.dbCursor.Current() - if err != nil { - var innerErr error - lastDBKey, lastDBVal, innerErr = dbNextElement() - if innerErr != nil { - return nil, nil, fmt.Errorf("get current from db %w inner %v", err, innerErr) - } - noDBNext = true - } - - lastSNDBKey, lastSNDBVal, err := s.snCursor.Current() - if err != nil { - var innerErr error - lastSNDBKey, lastSNDBVal, innerErr = sndbNextElement() - if innerErr != nil { - return nil, nil, fmt.Errorf("get current from snapshot %w inner %v", err, innerErr) - } - noSnDBNext = true - } - - cmp, br := cmpFunc(lastDBKey, lastSNDBKey) - if br { - return nil, nil, nil - } - - //todo Seek fastpath - if cmp > 0 { - if !noSnDBNext { - lastSNDBKey, lastSNDBVal, err = sndbNextElement() - if err != nil { - return nil, nil, err - } - - if currentKeyCmp, _ := common.KeyCmp(s.currentKey, lastDBKey); len(lastSNDBKey) == 0 && currentKeyCmp >= 0 && len(s.currentKey) > 0 { - lastDBKey, lastDBVal, err = dbNextElement() - } - if err != nil { - return nil, nil, err - } - } - } - - //current receives last acceptable key. If it is empty - if cmp < 0 { - if !noDBNext { - lastDBKey, lastDBVal, err = dbNextElement() - if err != nil { - return nil, nil, err - } - if currentKeyCmp, _ := common.KeyCmp(s.currentKey, lastSNDBKey); len(lastDBKey) == 0 && currentKeyCmp >= 0 && len(s.currentKey) > 0 { - lastSNDBKey, lastSNDBVal, err = sndbNextElement() - } - if err != nil { - return nil, nil, err - } - } - } - if cmp == 0 { - if !noDBNext { - lastDBKey, lastDBVal, err = dbNextElement() - if err != nil { - return nil, nil, err - } - } - if !noSnDBNext { - lastSNDBKey, lastSNDBVal, err = sndbNextElement() - if err != nil { - return nil, nil, err - } - } - } - - cmp, br = cmpFunc(lastDBKey, lastSNDBKey) - if br { - return nil, nil, nil - } - if cmp <= 0 { - return lastDBKey, lastDBVal, nil - } - - return lastSNDBKey, lastSNDBVal, nil -} - -func (s *snCursor) Next() ([]byte, []byte, error) { - k, v, err := s.iteration(s.dbCursor.Next, s.snCursor.Next, common.KeyCmp) //f(s.dbCursor.Next, s.snCursor.Next) - if err != nil { - return nil, nil, err - } - for bytes.Equal(v, DeletedValue) { - k, v, err = s.iteration(s.dbCursor.Next, s.snCursor.Next, common.KeyCmp) // f(s.dbCursor.Next, s.snCursor.Next) - if err != nil { - return nil, nil, err - } - - } - s.saveCurrent(k) - return k, v, nil -} - -func (s *snCursor) Prev() ([]byte, []byte, error) { - k, v, err := s.iteration(s.dbCursor.Prev, s.snCursor.Prev, func(kdb, ksndb []byte) (int, bool) { - cmp, br := KeyCmpBackward(kdb, ksndb) - return -1 * cmp, br - }) - if err != nil { - return nil, nil, err - } - for cmp, _ := KeyCmpBackward(k, s.currentKey); bytes.Equal(v, DeletedValue) || cmp >= 0; cmp, _ = KeyCmpBackward(k, s.currentKey) { - k, v, err = s.iteration(s.dbCursor.Prev, s.snCursor.Prev, func(kdb, ksndb []byte) (int, bool) { - cmp, br := KeyCmpBackward(kdb, ksndb) - return -1 * cmp, br - }) - if err != nil { - return nil, nil, err - } - } - s.saveCurrent(k) - return k, v, nil -} - -func (s *snCursor) Last() ([]byte, []byte, error) { - var err error - lastSNDBKey, lastSNDBVal, err := s.snCursor.Last() - if err != nil { - return nil, nil, err - } - lastDBKey, lastDBVal, err := s.dbCursor.Last() - if err != nil { - return nil, nil, err - } - - for bytes.Equal(lastDBVal, DeletedValue) { - lastDBKey, lastDBVal, err = s.dbCursor.Prev() - if err != nil { - return nil, nil, err - } - } - - cmp, br := KeyCmpBackward(lastDBKey, lastSNDBKey) - if br { - return nil, nil, nil - } - - if cmp >= 0 { - s.saveCurrent(lastDBKey) - return lastDBKey, lastDBVal, nil - } - s.saveCurrent(lastSNDBKey) - return lastSNDBKey, lastSNDBVal, nil -} - -func (s *snCursor) Current() ([]byte, []byte, error) { - k, v, err := s.dbCursor.Current() - if bytes.Equal(k, s.currentKey) { - return k, v, err - } - return s.snCursor.Current() -} - -func (s *snCursor) Put(k, v []byte) error { - return s.dbCursor.(kv.RwCursor).Put(k, v) -} - -func (s *snCursor) Append(k []byte, v []byte) error { - return s.dbCursor.(kv.RwCursor).Append(k, v) -} - -func (s *snCursor) Delete(k, v []byte) error { - return s.dbCursor.(kv.RwCursor).Put(k, DeletedValue) -} - -func (s *snCursor) DeleteCurrent() error { - panic("implement me") -} - -func (s *snCursor) Count() (uint64, error) { - panic("implement me") -} - -func (s *snCursor) Close() { - s.dbCursor.Close() - s.snCursor.Close() -} - -type snCursorDup struct { - dbCursorDup kv.CursorDupSort - sndbCursorDup kv.CursorDupSort - snCursor -} - -func (c *snCursorDup) SeekBothExact(key, value []byte) ([]byte, []byte, error) { - k, v, err := c.dbCursorDup.SeekBothExact(key, value) - if err != nil { - return nil, nil, err - } - if v == nil { - k, v, err = c.sndbCursorDup.SeekBothExact(key, value) - c.saveCurrent(k) - return k, v, err - } - c.saveCurrent(k) - return k, v, err - -} - -func (c *snCursorDup) SeekBothRange(key, value []byte) ([]byte, error) { - dbVal, err := c.dbCursorDup.SeekBothRange(key, value) - if err != nil { - return nil, err - } - snDBVal, err := c.sndbCursorDup.SeekBothRange(key, value) - if err != nil { - return nil, err - } - - if dbVal == nil { - c.saveCurrent(key) - return dbVal, nil - } - - return snDBVal, nil -} - -func (c *snCursorDup) FirstDup() ([]byte, error) { - panic("implement me") -} - -func (c *snCursorDup) NextDup() ([]byte, []byte, error) { - panic("implement me") -} - -func (c *snCursorDup) NextNoDup() ([]byte, []byte, error) { - panic("implement me") -} - -func (c *snCursorDup) LastDup() ([]byte, error) { - panic("implement me") -} - -func (c *snCursorDup) CountDuplicates() (uint64, error) { - panic("implement me") -} - -func (c *snCursorDup) DeleteCurrentDuplicates() error { - panic("implement me") -} - -func (c *snCursorDup) AppendDup(key, value []byte) error { - panic("implement me") -} - -func (s *snCursor) saveCurrent(k []byte) { - if k != nil { - s.currentKey = common.CopyBytes(k) - } -} - -func KeyCmpBackward(key1, key2 []byte) (int, bool) { - switch { - case len(key1) == 0 && len(key2) == 0: - return 0, true - case len(key1) == 0 && len(key2) != 0: - return -1, false - case len(key1) != 0 && len(key2) == 0: - return 1, false - default: - return bytes.Compare(key1, key2), false - } -} - -func IsSnapshotBucket(bucket string) bool { - return IsStateSnapshotSnapshotBucket(bucket) || IsHeaderSnapshotSnapshotBucket(bucket) || IsBodiesSnapshotSnapshotBucket(bucket) -} -func IsHeaderSnapshotSnapshotBucket(bucket string) bool { - return bucket == kv.Headers -} -func IsBodiesSnapshotSnapshotBucket(bucket string) bool { - return bucket == kv.BlockBody || bucket == kv.EthTx -} -func IsStateSnapshotSnapshotBucket(bucket string) bool { - return bucket == kv.PlainState || bucket == kv.PlainContractCode || bucket == kv.Code -} diff --git a/ethdb/snapshotdb/kv_snapshot_property_test.go b/ethdb/snapshotdb/kv_snapshot_property_test.go deleted file mode 100644 index 6a0723377b6..00000000000 --- a/ethdb/snapshotdb/kv_snapshot_property_test.go +++ /dev/null @@ -1,466 +0,0 @@ -package snapshotdb - -import ( - "context" - "testing" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/common" - "github.com/stretchr/testify/require" - "pgregory.net/rapid" -) - -func TestGetAndPut(t *testing.T) { - t.Skip("remove when it become stable for 200 rounds") - rapid.Check(t, rapid.Run(&getPutkvMachine{})) -} - -type getPutkvMachine struct { - bucket string - snKV kv.RwDB - modelKV kv.RwDB - snapshotKeys [][20]byte - newKeys [][20]byte - allKeys [][20]byte - - snTX kv.RwTx - modelTX kv.RwTx -} - -func (m *getPutkvMachine) Init(t *rapid.T) { - m.bucket = kv.PlainState - m.snKV = memdb.New() - m.modelKV = memdb.New() - m.snapshotKeys = rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate keys").([][20]byte) - m.newKeys = rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate new keys").([][20]byte) - notExistingKeys := rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate not excisting keys").([][20]byte) - m.allKeys = append(m.snapshotKeys, notExistingKeys...) - - txSn, err := m.snKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txSn.Rollback() - - txModel, err := m.modelKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txModel.Rollback() - for _, key := range m.snapshotKeys { - innerErr := txSn.Put(m.bucket, key[:], []byte("sn_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - innerErr = txModel.Put(m.bucket, key[:], []byte("sn_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - } - - //save snapshot and wrap new write db - err = txSn.Commit() - require.NoError(t, err) - err = txModel.Commit() - require.NoError(t, err) - m.snKV = NewSnapshotKV().StateSnapshot(m.snKV).DB(memdb.New()).Open() -} - -func (m *getPutkvMachine) Cleanup() { - if m.snTX != nil { - m.snTX.Rollback() - } - if m.modelTX != nil { - m.modelTX.Rollback() - } - m.snKV.Close() - m.modelKV.Close() -} - -func (m *getPutkvMachine) Check(t *rapid.T) { -} - -func (m *getPutkvMachine) Get(t *rapid.T) { - if m.snTX == nil && m.modelTX == nil { - return - } - key := rapid.SampledFrom(m.allKeys).Draw(t, "get a key").([20]byte) - var ( - v1, v2 []byte - err1, err2 error - ) - - v1, err1 = m.snTX.GetOne(m.bucket, key[:]) - v2, err2 = m.modelTX.GetOne(m.bucket, key[:]) - - require.Equal(t, err1, err2) - require.Equal(t, v1, v2) -} - -func (m *getPutkvMachine) Put(t *rapid.T) { - if len(m.newKeys) == 0 { - return - } - if m.snTX == nil && m.modelTX == nil { - return - } - key := rapid.SampledFrom(m.newKeys).Draw(t, "put a key").([20]byte) - m.allKeys = append(m.allKeys, key) - for i, v := range m.newKeys { - if v == key { - m.newKeys = append(m.newKeys[:i], m.newKeys[i+1:]...) - } - } - err := m.snTX.Put(m.bucket, key[:], []byte("put"+common.Bytes2Hex(key[:]))) - require.NoError(t, err) - - err = m.modelTX.Put(m.bucket, key[:], []byte("put"+common.Bytes2Hex(key[:]))) - require.NoError(t, err) -} - -func (m *getPutkvMachine) Delete(t *rapid.T) { - if m.snTX == nil && m.modelTX == nil { - return - } - key := rapid.SampledFrom(m.allKeys).Draw(t, "delete a key").([20]byte) - - err := m.snTX.Delete(m.bucket, key[:], nil) - require.NoError(t, err) - - err = m.modelTX.Put(m.bucket, key[:], nil) - require.NoError(t, err) -} - -func (m *getPutkvMachine) Begin(t *rapid.T) { - if m.modelTX != nil && m.snTX != nil { - return - } - mtx, err := m.modelKV.BeginRw(context.Background()) //nolint - require.NoError(t, err) - sntx, err := m.snKV.BeginRw(context.Background()) //nolint - require.NoError(t, err) - m.modelTX = mtx - m.snTX = sntx -} - -func (m *getPutkvMachine) Rollback(t *rapid.T) { - if m.modelTX == nil && m.snTX == nil { - return - } - m.snTX.Rollback() - m.modelTX.Rollback() - m.snTX = nil - m.modelTX = nil -} - -func (m *getPutkvMachine) Commit(t *rapid.T) { - if m.modelTX == nil && m.snTX == nil { - return - } - err := m.modelTX.Commit() - require.NoError(t, err) - err = m.snTX.Commit() - require.NoError(t, err) - m.snTX = nil - m.modelTX = nil -} - -type getKVMachine struct { - bucket string - snKV kv.RwDB - modelKV kv.RwDB - overWriteKeys [][20]byte - snKeys [][20]byte - newKeys [][20]byte - allKeys [][20]byte -} - -func (m *getKVMachine) Init(t *rapid.T) { - m.bucket = kv.PlainState - m.snKV = memdb.New() - m.modelKV = memdb.New() - m.snKeys = rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate keys").([][20]byte) - m.overWriteKeys = rapid.SliceOf(rapid.SampledFrom(m.snKeys)).Draw(t, "get snKeys").([][20]byte) - m.newKeys = rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Draw(t, "generate new keys").([][20]byte) - m.allKeys = append(m.snKeys, m.overWriteKeys...) - m.allKeys = append(m.allKeys, m.newKeys...) - notExistingKeys := rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Draw(t, "generate not excisting keys").([][20]byte) - m.allKeys = append(m.allKeys, notExistingKeys...) - - txSn, err := m.snKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txSn.Rollback() - - txModel, err := m.modelKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txModel.Rollback() - for _, key := range m.snKeys { - innerErr := txSn.Put(m.bucket, key[:], []byte("sn_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - innerErr = txModel.Put(m.bucket, key[:], []byte("sn_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - } - - //save snapshot and wrap new write db - err = txSn.Commit() - require.NoError(t, err) - m.snKV = NewSnapshotKV().StateSnapshot(m.snKV).DB(memdb.New()).Open() - txSn, err = m.snKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txSn.Rollback() - - for _, key := range m.overWriteKeys { - innerErr := txSn.Put(m.bucket, key[:], []byte("overwrite_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - innerErr = txModel.Put(m.bucket, key[:], []byte("overwrite_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - } - for _, key := range m.newKeys { - innerErr := txSn.Put(m.bucket, key[:], []byte("new_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - innerErr = txModel.Put(m.bucket, key[:], []byte("new_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - } - err = txSn.Commit() - require.NoError(t, err) - err = txModel.Commit() - require.NoError(t, err) -} - -func (m *getKVMachine) Cleanup() { - m.snKV.Close() - m.modelKV.Close() -} - -func (m *getKVMachine) Check(t *rapid.T) { -} - -func (m *getKVMachine) Get(t *rapid.T) { - key := rapid.SampledFrom(m.allKeys).Draw(t, "get a key").([20]byte) - var ( - v1, v2 []byte - err1, err2 error - ) - err := m.snKV.View(context.Background(), func(tx kv.Tx) error { - v1, err1 = tx.GetOne(m.bucket, key[:]) - return nil - }) - require.NoError(t, err) - err = m.modelKV.View(context.Background(), func(tx kv.Tx) error { - v2, err2 = tx.GetOne(m.bucket, key[:]) - return nil - }) - require.NoError(t, err) - require.Equal(t, err1, err2) - require.Equal(t, v1, v2) -} - -func TestGet(t *testing.T) { - t.Skip("remove when it become stable for 200 rounds") - rapid.Check(t, rapid.Run(&getKVMachine{})) -} - -func TestCursorWithTX(t *testing.T) { - t.Skip("remove when it become stable for 200 rounds") - rapid.Check(t, rapid.Run(&cursorKVMachine{})) -} - -type cursorKVMachine struct { - bucket string - snKV kv.RwDB - modelKV kv.RwDB - - snTX kv.RwTx - modelTX kv.RwTx - - snCursor kv.RwCursor - modelCursor kv.RwCursor - - snapshotKeys [][20]byte - newKeys [][20]byte - allKeys [][20]byte -} - -func (m *cursorKVMachine) Init(t *rapid.T) { - m.bucket = kv.PlainState - m.snKV = memdb.New() - m.modelKV = memdb.New() - m.snapshotKeys = rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate keys").([][20]byte) - m.newKeys = rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate new keys").([][20]byte) - notExistingKeys := rapid.SliceOf(rapid.ArrayOf(20, rapid.Byte())).Filter(func(_v [][20]byte) bool { - return len(_v) > 0 - }).Draw(t, "generate not excisting keys").([][20]byte) - m.allKeys = append(m.snapshotKeys, notExistingKeys...) - - defer func() { - m.snTX = nil - m.modelTX = nil - }() - txSn, err := m.snKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txSn.Rollback() - - txModel, err := m.modelKV.BeginRw(context.Background()) - require.NoError(t, err) - defer txModel.Rollback() - for _, key := range m.snapshotKeys { - innerErr := txSn.Put(m.bucket, key[:], []byte("sn_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - innerErr = txModel.Put(m.bucket, key[:], []byte("sn_"+common.Bytes2Hex(key[:]))) - require.NoError(t, innerErr) - } - - //save snapshot and wrap new write db - err = txSn.Commit() - require.NoError(t, err) - err = txModel.Commit() - require.NoError(t, err) - m.snKV = NewSnapshotKV().StateSnapshot(m.snKV).DB(memdb.New()).Open() -} - -func (m *cursorKVMachine) Check(t *rapid.T) { -} - -func (m *cursorKVMachine) Cleanup() { - if m.snTX != nil { - m.snTX.Rollback() - } - if m.modelTX != nil { - m.modelTX.Rollback() - } - - m.snKV.Close() - m.snKV = nil - m.modelKV.Close() - m.modelKV = nil -} - -func (m *cursorKVMachine) Begin(t *rapid.T) { - if m.modelTX != nil && m.snTX != nil { - return - } - - mtx, err := m.modelKV.BeginRw(context.Background()) //nolint - require.NoError(t, err) - sntx, err := m.snKV.BeginRw(context.Background()) //nolint - require.NoError(t, err) - m.modelTX = mtx - m.snTX = sntx -} - -func (m *cursorKVMachine) Rollback(t *rapid.T) { - if m.modelTX == nil && m.snTX == nil { - return - } - m.snTX.Rollback() - m.modelTX.Rollback() - m.snTX = nil - m.modelTX = nil - m.snCursor = nil - m.modelCursor = nil -} - -func (m *cursorKVMachine) Commit(t *rapid.T) { - if m.modelTX == nil && m.snTX == nil { - return - } - err := m.modelTX.Commit() - require.NoError(t, err) - err = m.snTX.Commit() - require.NoError(t, err) - m.snTX = nil - m.modelTX = nil - m.snCursor = nil - m.modelCursor = nil -} - -func (m *cursorKVMachine) Cursor(t *rapid.T) { - if m.modelTX == nil && m.snTX == nil { - return - } - if m.modelCursor != nil && m.snCursor != nil { - return - } - var err error - m.modelCursor, err = m.modelTX.RwCursor(m.bucket) - require.NoError(t, err) - m.snCursor, err = m.snTX.RwCursor(m.bucket) - require.NoError(t, err) -} - -func (m *cursorKVMachine) CloseCursor(t *rapid.T) { - if m.modelTX == nil && m.snTX == nil { - return - } - if m.modelCursor == nil && m.snCursor == nil { - return - } - m.modelCursor.Close() - m.snCursor.Close() - m.modelCursor = nil - m.snCursor = nil -} - -func (m *cursorKVMachine) First(t *rapid.T) { - if m.modelCursor == nil && m.snCursor == nil { - return - } - k1, v1, err1 := m.modelCursor.First() - k2, v2, err2 := m.snCursor.First() - require.Equal(t, k1, k2) - require.Equal(t, v1, v2) - require.Equal(t, err1, err2) -} - -func (m *cursorKVMachine) Last(t *rapid.T) { - if m.modelCursor == nil && m.snCursor == nil { - return - } - k1, v1, err1 := m.modelCursor.Last() - k2, v2, err2 := m.snCursor.Last() - require.Equal(t, k1, k2) - require.Equal(t, v1, v2) - require.Equal(t, err1, err2) -} - -func (m *cursorKVMachine) Seek(t *rapid.T) { - if m.modelCursor == nil && m.snCursor == nil { - return - } - key := rapid.SampledFrom(m.allKeys).Draw(t, "get random key").([20]byte) - k1, v1, err1 := m.modelCursor.Seek(key[:]) - k2, v2, err2 := m.snCursor.Seek(key[:]) - require.Equal(t, k1, k2) - require.Equal(t, v1, v2) - require.Equal(t, err1, err2) -} - -func (m *cursorKVMachine) SeekExact(t *rapid.T) { - if m.modelCursor == nil && m.snCursor == nil { - return - } - - key := rapid.SampledFrom(m.allKeys).Draw(t, "get random key").([20]byte) - k1, v1, err1 := m.modelCursor.SeekExact(key[:]) - k2, v2, err2 := m.snCursor.SeekExact(key[:]) - require.Equal(t, k1, k2) - require.Equal(t, v1, v2) - require.Equal(t, err1, err2) -} - -func (m *cursorKVMachine) Next(t *rapid.T) { - if m.modelCursor == nil && m.snCursor == nil { - return - } - k1, v1, err1 := m.modelCursor.Next() - k2, v2, err2 := m.snCursor.Next() - - require.Equal(t, k1, k2) - require.Equal(t, v1, v2) - require.Equal(t, err1, err2) -} diff --git a/ethdb/snapshotdb/kv_snapshot_test.go b/ethdb/snapshotdb/kv_snapshot_test.go deleted file mode 100644 index ce39dee72bc..00000000000 --- a/ethdb/snapshotdb/kv_snapshot_test.go +++ /dev/null @@ -1,1305 +0,0 @@ -package snapshotdb - -import ( - "bytes" - "context" - "fmt" - "testing" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - kv2 "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/log/v3" - "github.com/stretchr/testify/require" -) - -func TestSnapshot2Get(t *testing.T) { - logger := log.New() - sn1 := mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.Headers: kv.TableCfgItem{}, - } - }).InMem().MustOpen() - defer sn1.Close() - err := sn1.Update(context.Background(), func(tx kv.RwTx) error { - bucket, err := tx.RwCursor(kv.Headers) - if err != nil { - return err - } - innerErr := bucket.Put(dbutils.HeaderKey(1, common.Hash{1}), []byte{1}) - if innerErr != nil { - return innerErr - } - innerErr = bucket.Put(dbutils.HeaderKey(2, common.Hash{2}), []byte{2}) - if innerErr != nil { - return innerErr - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - - sn2 := mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.BlockBody: kv.TableCfgItem{}, - } - }).InMem().MustOpen() - defer sn2.Close() - err = sn2.Update(context.Background(), func(tx kv.RwTx) error { - bucket, err := tx.RwCursor(kv.BlockBody) - require.NoError(t, err) - innerErr := bucket.Put(dbutils.BlockBodyKey(1, common.Hash{1}), []byte{1}) - if innerErr != nil { - return innerErr - } - innerErr = bucket.Put(dbutils.BlockBodyKey(2, common.Hash{2}), []byte{2}) - if innerErr != nil { - return innerErr - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - err = mainDB.Update(context.Background(), func(tx kv.RwTx) error { - bucket, err := tx.RwCursor(kv.Headers) - if err != nil { - return err - } - innerErr := bucket.Put(dbutils.HeaderKey(2, common.Hash{2}), []byte{22}) - if innerErr != nil { - return innerErr - } - innerErr = bucket.Put(dbutils.HeaderKey(3, common.Hash{3}), []byte{33}) - if innerErr != nil { - return innerErr - } - - bucket, err = tx.RwCursor(kv.BlockBody) - if err != nil { - return err - } - - innerErr = bucket.Put(dbutils.BlockBodyKey(2, common.Hash{2}), []byte{22}) - if innerErr != nil { - return innerErr - } - innerErr = bucket.Put(dbutils.BlockBodyKey(3, common.Hash{3}), []byte{33}) - if innerErr != nil { - return innerErr - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - - db := NewSnapshotKV().DB(mainDB).HeadersSnapshot(sn1). - BodiesSnapshot(sn2).Open() - - tx, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - v, err := tx.GetOne(kv.Headers, dbutils.HeaderKey(1, common.Hash{1})) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, []byte{1}) { - t.Fatal(v) - } - - v, err = tx.GetOne(kv.Headers, dbutils.HeaderKey(2, common.Hash{2})) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, []byte{22}) { - t.Fatal(v) - } - - v, err = tx.GetOne(kv.Headers, dbutils.HeaderKey(3, common.Hash{3})) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, []byte{33}) { - t.Fatal(v) - } - - v, err = tx.GetOne(kv.BlockBody, dbutils.BlockBodyKey(1, common.Hash{1})) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, []byte{1}) { - t.Fatal(v) - } - - v, err = tx.GetOne(kv.BlockBody, dbutils.BlockBodyKey(2, common.Hash{2})) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, []byte{22}) { - t.Fatal(v) - } - - v, err = tx.GetOne(kv.BlockBody, dbutils.BlockBodyKey(3, common.Hash{3})) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, []byte{33}) { - t.Fatal(v) - } - - headerCursor, err := tx.Cursor(kv.Headers) - require.NoError(t, err) - k, v, err := headerCursor.Last() - require.NoError(t, err) - if !(bytes.Equal(dbutils.HeaderKey(3, common.Hash{3}), k) && bytes.Equal(v, []byte{33})) { - t.Fatal(k, v) - } - k, v, err = headerCursor.First() - require.NoError(t, err) - if !(bytes.Equal(dbutils.HeaderKey(1, common.Hash{1}), k) && bytes.Equal(v, []byte{1})) { - t.Fatal(k, v) - } - - k, v, err = headerCursor.Next() - require.NoError(t, err) - - if !(bytes.Equal(dbutils.HeaderKey(2, common.Hash{2}), k) && bytes.Equal(v, []byte{22})) { - t.Fatal(k, v) - } - - k, v, err = headerCursor.Next() - require.NoError(t, err) - - if !(bytes.Equal(dbutils.HeaderKey(3, common.Hash{3}), k) && bytes.Equal(v, []byte{33})) { - t.Fatal(k, v) - } - - k, v, err = headerCursor.Next() - require.NoError(t, err) - - if !(bytes.Equal([]byte{}, k) && bytes.Equal(v, []byte{})) { - t.Fatal(k, v) - } -} - -func TestSnapshot2WritableTxAndGet(t *testing.T) { - logger := log.New() - sn1 := mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.Headers: kv.TableCfgItem{}, - } - }).InMem().MustOpen() - defer sn1.Close() - - { - err := sn1.Update(context.Background(), func(tx kv.RwTx) error { - bucket, err := tx.RwCursor(kv.Headers) - require.NoError(t, err) - innerErr := bucket.Put(dbutils.HeaderKey(1, common.Hash{1}), []byte{1}) - if innerErr != nil { - return innerErr - } - innerErr = bucket.Put(dbutils.HeaderKey(2, common.Hash{2}), []byte{2}) - if innerErr != nil { - return innerErr - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - } - - sn2 := mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.BlockBody: kv.TableCfgItem{}, - } - }).InMem().MustOpen() - defer sn2.Close() - { - err := sn2.Update(context.Background(), func(tx kv.RwTx) error { - bucket, err := tx.RwCursor(kv.BlockBody) - require.NoError(t, err) - innerErr := bucket.Put(dbutils.BlockBodyKey(1, common.Hash{1}), []byte{1}) - if innerErr != nil { - return innerErr - } - innerErr = bucket.Put(dbutils.BlockBodyKey(2, common.Hash{2}), []byte{2}) - if innerErr != nil { - return innerErr - } - - return nil - }) - require.NoError(t, err) - } - - mainDB := kv2.NewTestDB(t) - - db := NewSnapshotKV().DB(mainDB).HeadersSnapshot(sn1).BodiesSnapshot(sn2).Open() - { - tx, err := db.BeginRw(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - - v, err := tx.GetOne(kv.Headers, dbutils.HeaderKey(1, common.Hash{1})) - require.NoError(t, err) - if !bytes.Equal(v, []byte{1}) { - t.Fatal(v) - } - - v, err = tx.GetOne(kv.BlockBody, dbutils.BlockBodyKey(1, common.Hash{1})) - require.NoError(t, err) - if !bytes.Equal(v, []byte{1}) { - t.Fatal(v) - } - - err = tx.Put(kv.BlockBody, dbutils.BlockBodyKey(4, common.Hash{4}), []byte{4}) - require.NoError(t, err) - err = tx.Put(kv.Headers, dbutils.HeaderKey(4, common.Hash{4}), []byte{4}) - require.NoError(t, err) - err = tx.Commit() - require.NoError(t, err) - } - tx, err := db.BeginRo(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - c, err := tx.Cursor(kv.Headers) - require.NoError(t, err) - k, v, err := c.First() - require.NoError(t, err) - if !bytes.Equal(k, dbutils.HeaderKey(1, common.Hash{1})) { - t.Fatal(k, v) - } - - k, v, err = c.Next() - require.NoError(t, err) - if !bytes.Equal(k, dbutils.HeaderKey(2, common.Hash{2})) { - t.Fatal(common.Bytes2Hex(k)) - } - if !bytes.Equal(v, []byte{2}) { - t.Fatal(common.Bytes2Hex(k)) - } - - k, v, err = c.Next() - require.NoError(t, err) - if !bytes.Equal(k, dbutils.HeaderKey(4, common.Hash{4})) { - t.Fatal("invalid key", common.Bytes2Hex(k)) - } - if !bytes.Equal(v, []byte{4}) { - t.Fatal(common.Bytes2Hex(k), common.Bytes2Hex(v)) - } - - k, v, err = c.Next() - if k != nil || v != nil || err != nil { - t.Fatal(k, v, err) - } - - c, err = tx.Cursor(kv.BlockBody) - require.NoError(t, err) - k, v, err = c.First() - require.NoError(t, err) - if !bytes.Equal(k, dbutils.BlockBodyKey(1, common.Hash{1})) { - t.Fatal(k, v) - } - - k, v, err = c.Next() - require.NoError(t, err) - if !bytes.Equal(k, dbutils.BlockBodyKey(2, common.Hash{2})) { - t.Fatal() - } - if !bytes.Equal(v, []byte{2}) { - t.Fatal(common.Bytes2Hex(k), common.Bytes2Hex(v)) - } - - k, v, err = c.Next() - require.NoError(t, err) - if !bytes.Equal(k, dbutils.BlockBodyKey(4, common.Hash{4})) { - t.Fatal() - } - if !bytes.Equal(v, []byte{4}) { - t.Fatal(common.Bytes2Hex(k), common.Bytes2Hex(v)) - } - - k, v, err = c.Next() - if k != nil || v != nil || err != nil { - t.Fatal(k, v, err) - } -} - -func TestSnapshot2WritableTxWalkReplaceAndCreateNewKey(t *testing.T) { - data := []KvData{} - for i := 1; i < 3; i++ { - for j := 1; j < 3; j++ { - data = append(data, KvData{ - K: dbutils.PlainGenerateCompositeStorageKey([]byte{uint8(i) * 2}, 1, []byte{uint8(j) * 2}), - V: []byte{uint8(i) * 2, uint8(j) * 2}, - }) - } - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - mainDB := kv2.NewTestDB(t) - - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - defer db.Close() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - c, err := tx.RwCursor(kv.PlainState) - require.NoError(t, err) - replaceKey := dbutils.PlainGenerateCompositeStorageKey([]byte{2}, 1, []byte{4}) - replaceValue := []byte{2, 4, 4} - newKey := dbutils.PlainGenerateCompositeStorageKey([]byte{2}, 1, []byte{5}) - newValue := []byte{2, 5} - - //get first correct k&v - k, v, err := c.First() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - if !(bytes.Equal(k, data[0].K) || bytes.Equal(v, data[0].V)) { - t.Fatal(k, data[0].K, v, data[0].V) - } - err = c.Put(replaceKey, replaceValue) - if err != nil { - t.Fatal(err) - } - - // check the key that we've replaced value - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, replaceKey, replaceValue) - - err = c.Put(newKey, newValue) - if err != nil { - t.Fatal(err) - } - // check the key that we've inserted - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, newKey, newValue) - - //check the rest keys - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[2].K, data[2].V) -} - -func TestSnapshot2WritableTxWalkAndDeleteKey(t *testing.T) { - data := []KvData{ - {K: []byte{1}, V: []byte{1}}, - {K: []byte{2}, V: []byte{2}}, - {K: []byte{3}, V: []byte{3}}, - {K: []byte{4}, V: []byte{4}}, - {K: []byte{5}, V: []byte{5}}, - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - deleteCursor, err := tx.RwCursor(kv.PlainState) - require.NoError(t, err) - - //get first correct k&v - k, v, err := c.First() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - - //remove value - err = deleteCursor.Delete(data[1].K, nil) - if err != nil { - t.Fatal(err) - } - err = deleteCursor.Delete(data[2].K, nil) - if err != nil { - t.Fatal(err) - } - err = deleteCursor.Delete(data[4].K, nil) - if err != nil { - t.Fatal(err) - } - - // check the key that we've replaced value - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[3].K, data[3].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, nil, nil) - - //2,3,5 removed. Current 4. Prev - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, nil, nil) -} - -func TestSnapshot2WritableTxNextAndPrevAndDeleteKey(t *testing.T) { - data := []KvData{ - {K: []byte{1}, V: []byte{1}}, //to remove - {K: []byte{2}, V: []byte{2}}, - {K: []byte{3}, V: []byte{3}}, - {K: []byte{4}, V: []byte{4}}, //to remove - {K: []byte{5}, V: []byte{5}}, - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - deleteCursor, err := tx.RwCursor(kv.PlainState) - require.NoError(t, err) - - //get first correct k&v - k, v, err := c.Last() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[len(data)-1].K, data[len(data)-1].V) - - for i := len(data) - 2; i >= 0; i-- { - k, v, err = c.Prev() - if err != nil { - t.Fatal(i, err) - } - checkKV(t, k, v, data[i].K, data[i].V) - - k, v, err = c.Current() - if err != nil { - t.Fatal(i, err) - } - checkKV(t, k, v, data[i].K, data[i].V) - } - - k, v, err = c.Last() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[4].K, data[4].V) - - //remove 4. Current on 5 - err = deleteCursor.Delete(data[3].K, nil) - if err != nil { - t.Fatal(err) - } - - //cursor on 3 after it - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[2].K, data[2].V) - - err = deleteCursor.Delete(data[0].K, nil) - if err != nil { - t.Fatal(err) - } - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[1].K, data[1].V) - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, nil, nil) - -} -func TestSnapshot2WritableTxWalkLastElementIsSnapshot(t *testing.T) { - snapshotData := []KvData{ - { - K: []byte{0, 1}, - V: []byte{1}, - }, - { - K: []byte{0, 4}, - V: []byte{4}, - }, - } - replacedValue := []byte{1, 1} - mainData := []KvData{ - { - K: []byte{0, 1}, - V: replacedValue, - }, - { - K: []byte{0, 2}, - V: []byte{2}, - }, - { - K: []byte{0, 3}, - V: []byte{3}, - }, - } - snapshotDB, err := GenStateData(snapshotData) - if err != nil { - t.Fatal(err) - } - mainDB, err := GenStateData(mainData) - if err != nil { - t.Fatal(err) - } - - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - //get first correct k&v - k, v, err := c.First() - if err != nil { - t.Fatal(err) - } - - checkKV(t, k, v, mainData[0].K, mainData[0].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, mainData[1].K, mainData[1].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, mainData[2].K, mainData[2].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, snapshotData[1].K, snapshotData[1].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, nil, nil) -} - -func TestSnapshot2WritableTxWalkForwardAndBackward(t *testing.T) { - snapshotData := []KvData{ - { - K: []byte{0, 1}, - V: []byte{1}, - }, - { - K: []byte{0, 4}, - V: []byte{4}, - }, - } - replacedValue := []byte{1, 1} - mainData := []KvData{ - { - K: []byte{0, 1}, - V: replacedValue, - }, - { - K: []byte{0, 2}, - V: []byte{2}, - }, - { - K: []byte{0, 3}, - V: []byte{3}, - }, - } - data := []KvData{ - mainData[0], - mainData[1], - mainData[2], - snapshotData[1], - } - snapshotDB, err := GenStateData(snapshotData) - if err != nil { - t.Fatal(err) - } - mainDB, err := GenStateData(mainData) - if err != nil { - t.Fatal(err) - } - - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - //get first correct k&v - k, v, err := c.First() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - - for i := 1; i < len(data); i++ { - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - - k, v, err = c.Current() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - } - - for i := len(data) - 2; i > 0; i-- { - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - - k, v, err = c.Current() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - } - - k, v, err = c.Last() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[len(data)-1].K, data[len(data)-1].V) - k, v, err = c.Current() - if err != nil { - t.Fatal(err) - } - - checkKV(t, k, v, data[len(data)-1].K, data[len(data)-1].V) - - for i := len(data) - 2; i > 0; i-- { - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - - k, v, err = c.Current() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - } - - i := 0 - err = ethdb.Walk(c, []byte{}, 0, func(k, v []byte) (bool, error) { - checkKV(t, k, v, data[i].K, data[i].V) - i++ - return true, nil - }) - if err != nil { - t.Fatal(err) - } -} - -func TestSnapshot2WalkByEmptyDB(t *testing.T) { - data := []KvData{ - {K: []byte{1}, V: []byte{1}}, - {K: []byte{2}, V: []byte{2}}, - {K: []byte{3}, V: []byte{3}}, - {K: []byte{4}, V: []byte{4}}, - {K: []byte{5}, V: []byte{5}}, - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - - i := 0 - err = ethdb.Walk(c, []byte{}, 0, func(k, v []byte) (bool, error) { - checkKV(t, k, v, data[i].K, data[i].V) - i++ - return true, nil - }) - if err != nil { - t.Fatal(err) - } - -} - -func TestSnapshot2WritablePrevAndDeleteKey(t *testing.T) { - data := []KvData{ - {K: []byte{1}, V: []byte{1}}, - {K: []byte{2}, V: []byte{2}}, - {K: []byte{3}, V: []byte{3}}, - {K: []byte{4}, V: []byte{4}}, - {K: []byte{5}, V: []byte{5}}, - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - - //get first correct k&v - k, v, err := c.First() - if err != nil { - printBucket(db, kv.PlainState) - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - - for i := 1; i < len(data); i++ { - k, v, err = c.Next() - require.NoError(t, err) - checkKV(t, k, v, data[i].K, data[i].V) - - k, v, err = c.Current() - require.NoError(t, err) - checkKV(t, k, v, data[i].K, data[i].V) - } - - // check the key that we've replaced value - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, nil, nil) - - for i := len(data) - 2; i >= 0; i-- { - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - - k, v, err = c.Current() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[i].K, data[i].V) - } -} - -func TestSnapshot2WritableTxNextAndPrevWithDeleteAndPutKeys(t *testing.T) { - data := []KvData{ - {K: []byte{1}, V: []byte{1}}, - {K: []byte{2}, V: []byte{2}}, - {K: []byte{3}, V: []byte{3}}, - {K: []byte{4}, V: []byte{4}}, - {K: []byte{5}, V: []byte{5}}, - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRw(context.Background()) - require.NoError(t, err) - defer tx.Rollback() - c, err := tx.Cursor(kv.PlainState) - require.NoError(t, err) - deleteCursor, err := tx.RwCursor(kv.PlainState) - require.NoError(t, err) - - //get first correct k&v - k, v, err := c.First() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[1].K, data[1].V) - - err = deleteCursor.Delete(data[2].K, nil) - if err != nil { - t.Fatal(err) - } - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[3].K, data[3].V) - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[1].K, data[1].V) - - err = deleteCursor.Put(data[2].K, data[2].V) - if err != nil { - t.Fatal(err) - } - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[2].K, data[2].V) - - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[3].K, data[3].V) - - err = deleteCursor.Delete(data[2].K, nil) - if err != nil { - t.Fatal(err) - } - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[1].K, data[1].V) - - k, v, err = c.Prev() - if err != nil { - t.Fatal(err) - } - checkKV(t, k, v, data[0].K, data[0].V) - -} - -func TestSnapshotUpdateSnapshot(t *testing.T) { - data := []KvData{ - {K: []byte{1}, V: []byte{1}}, - {K: []byte{2}, V: []byte{2}}, - {K: []byte{3}, V: []byte{3}}, - {K: []byte{4}, V: []byte{4}}, - {K: []byte{5}, V: []byte{5}}, - } - snapshotDB, err := GenStateData(data) - if err != nil { - t.Fatal(err) - } - - data2 := append(data, []KvData{ - {K: []byte{6}, V: []byte{6}}, - {K: []byte{7}, V: []byte{7}}, - }...) - snapshotDB2, err := GenStateData(data2) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - - tx, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - c, err := tx.Cursor(kv.PlainState) - if err != nil { - t.Fatal(err) - } - - k, v, err := c.First() - if err != nil { - t.Fatal(err) - } - checkKVErr(t, k, v, err, []byte{1}, []byte{1}) - - done := make(chan struct{}) - db.UpdateSnapshots("state", snapshotDB2, done) - - tx2, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx2.Rollback() - - c2, err := tx2.Cursor(kv.PlainState) - if err != nil { - t.Fatal(err) - } - - k2, v2, err2 := c2.First() - if err2 != nil { - t.Fatal(err2) - } - checkKVErr(t, k2, v2, err2, []byte{1}, []byte{1}) - - i := 2 - for { - k, v, err = c.Next() - if err != nil { - t.Fatal(err) - } - if k == nil { - break - } - checkKVErr(t, k, v, err, []byte{uint8(i)}, []byte{uint8(i)}) - i++ - } - //data[maxK]+1 - if i != 6 { - t.Fatal("incorrect last key", i) - } - tx.Rollback() - - i = 2 - for { - k2, v2, err2 = c2.Next() - if err2 != nil { - t.Fatal(err2) - } - if k2 == nil { - break - } - checkKVErr(t, k2, v2, err2, []byte{uint8(i)}, []byte{uint8(i)}) - i++ - } - //data2[maxK]+1 - if i != 8 { - t.Fatal("incorrect last key", i) - } - - //a short delay to close - time.Sleep(time.Second) - select { - case <-done: - default: - t.Fatal("Hasn't closed database") - - } -} -func TestPlainStateProxy(t *testing.T) { - snapshotData := []KvData{ - {K: []byte{1}, V: []byte{1}}, - {K: []byte{2}, V: []byte{2}}, - } - - writeDBData := []KvData{ - {K: []byte{3}, V: []byte{3}}, - } - - tmpDBData := []KvData{ - {K: []byte{4}, V: []byte{4}}, - } - - snapshotDB, err := GenStateData(snapshotData) - if err != nil { - t.Fatal(err) - } - - mainDB := kv2.NewTestDB(t) - db := NewSnapshotKV().DB(mainDB).StateSnapshot(snapshotDB). - Open() - err = db.Update(context.Background(), func(tx kv.RwTx) error { - c, err := tx.RwCursor(kv.PlainState) - if err != nil { - return err - } - for i := range writeDBData { - innerErr := c.Put(writeDBData[i].K, writeDBData[i].V) - if innerErr != nil { - return innerErr - } - } - return nil - }) - if err != nil { - t.Fatal(err) - } - - tmpDB := kv2.NewTestDB(t) - db.SetTempDB(tmpDB, []string{kv.PlainState}) - - nonStateKey := []byte{11} - nonStateValue := []byte{99} - - err = db.Update(context.Background(), func(tx kv.RwTx) error { - err = tx.Put(kv.BlockBody, nonStateKey, nonStateValue) - if err != nil { - return err - } - - c, err := tx.RwCursor(kv.PlainState) - if err != nil { - return err - } - for i := range tmpDBData { - innerErr := c.Put(tmpDBData[i].K, tmpDBData[i].V) - if innerErr != nil { - return innerErr - } - } - return nil - - }) - if err != nil { - t.Fatal(err) - } - - fullStateResult := []KvData{} - err = db.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BlockBody, nonStateKey) - if err != nil { - t.Error(err) - } - if !bytes.Equal(v, nonStateValue) { - t.Error(v, nonStateValue) - } - - return tx.ForEach(kv.PlainState, []byte{}, func(k, v []byte) error { - fullStateResult = append(fullStateResult, KvData{ - K: k, - V: v, - }) - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - fullStateExpected := append(append(snapshotData, writeDBData...), tmpDBData...) - require.Equal(t, fullStateExpected, fullStateResult) - - tmpDBResult := []KvData{} - err = db.tmpDB.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BlockBody, nonStateKey) - if err != nil { - t.Error(err) - } - if len(v) != 0 { - t.Error(v) - } - - return tx.ForEach(kv.PlainState, []byte{}, func(k, v []byte) error { - tmpDBResult = append(tmpDBResult, KvData{ - K: k, - V: v, - }) - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - require.Equal(t, tmpDBData, tmpDBData) - - writeDBResult := []KvData{} - err = db.WriteDB().View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BlockBody, nonStateKey) - if err != nil { - t.Error(err) - } - if !bytes.Equal(v, nonStateValue) { - t.Error(v, nonStateValue) - } - - return tx.ForEach(kv.PlainState, []byte{}, func(k, v []byte) error { - writeDBResult = append(writeDBResult, KvData{ - K: k, - V: v, - }) - - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - - require.Equal(t, writeDBData, writeDBResult) - -} - -func printBucket(db kv.RoDB, bucket string) { - fmt.Println("+Print bucket", bucket) - defer func() { - fmt.Println("-Print bucket", bucket) - }() - err := db.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(bucket) - if err != nil { - return err - } - k, v, err := c.First() - if err != nil { - panic(fmt.Errorf("first err: %w", err)) - } - for k != nil && v != nil { - fmt.Println("k:=", common.Bytes2Hex(k), "v:=", common.Bytes2Hex(v)) - k, v, err = c.Next() - if err != nil { - panic(fmt.Errorf("next err: %w", err)) - } - } - return nil - }) - fmt.Println("Print err", err) -} - -func checkKVErr(t *testing.T, k, v []byte, err error, expectedK, expectedV []byte) { - t.Helper() - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(k, expectedK) { - t.Error("k!= expected", k, expectedK) - } - if !bytes.Equal(v, expectedV) { - t.Error("v!= expected", v, expectedV) - } -} - -func checkKV(t *testing.T, key, val, expectedKey, expectedVal []byte) { - t.Helper() - if !bytes.Equal(key, expectedKey) { - t.Log("+", common.Bytes2Hex(expectedKey)) - t.Log("-", common.Bytes2Hex(key)) - t.Fatal("wrong key") - } - if !bytes.Equal(val, expectedVal) { - t.Log("+", common.Bytes2Hex(expectedVal)) - t.Log("-", common.Bytes2Hex(val)) - t.Fatal("wrong value for key", common.Bytes2Hex(key)) - } -} - -type KvData struct { - K []byte - V []byte -} - -func GenStateData(data []KvData) (kv.RwDB, error) { - snapshot := mdbx.NewMDBX(log.New()).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.PlainState: kv.TableCfgItem{}, - } - }).InMem().MustOpen() - - err := snapshot.Update(context.Background(), func(tx kv.RwTx) error { - c, err := tx.RwCursor(kv.PlainState) - if err != nil { - return err - } - for i := range data { - innerErr := c.Put(data[i].K, data[i].V) - if innerErr != nil { - return innerErr - } - } - return nil - }) - if err != nil { - return nil, err - } - return snapshot, nil -} diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index b8c32fd8afb..bc440e34238 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -17,7 +17,6 @@ // Package ethstats implements the network stats reporting service. package ethstats -/* import ( "context" "encoding/json" @@ -33,65 +32,38 @@ import ( "time" "github.com/gorilla/websocket" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/sentry/sentry" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/mclock" "github.com/ledgerwatch/erigon/consensus" - "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth" - "github.com/ledgerwatch/erigon/eth/downloader" - "github.com/ledgerwatch/erigon/event" - "github.com/ledgerwatch/log/v3" - "github.com/ledgerwatch/erigon/miner" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/node" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/log/v3" ) const ( // historyUpdateRange is the number of blocks a node should report upon login or // history request. historyUpdateRange = 50 - - // txChanSize is the size of channel listening to NewTxsEvent. - // The number is referenced from the size of tx pool. - txChanSize = 4096 - // chainHeadChanSize is the size of channel listening to ChainHeadEvent. - chainHeadChanSize = 10 ) -// backend encompasses the bare-minimum functionality needed for ethstats reporting -type backend interface { - SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription - SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription - CurrentHeader() *types.Header - HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) - GetTd(ctx context.Context, hash common.Hash) *big.Int - Stats() (pending int, queued int) - Downloader() *downloader.Downloader -} - -// fullNodeBackend encompasses the functionality necessary for a full node -// reporting to ethstats -type fullNodeBackend interface { - backend - Miner() *miner.Miner - BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) - CurrentBlock() *types.Block - SuggestPrice(ctx context.Context) (*big.Int, error) -} - // Service implements an Ethereum netstats reporting daemon that pushes local // chain statistics up to a monitoring server. type Service struct { - server *p2p.Server // Peer-to-peer server to retrieve networking infos - backend backend - engine consensus.Engine // Consensus engine to retrieve variadic block fields + servers []*sentry.GrpcServer // Peer-to-peer server to retrieve networking infos + chaindb kv.RoDB + networkid uint64 + engine consensus.Engine // Consensus engine to retrieve variadic block fields node string // Name of the node to display on the monitoring page pass string // Password to authorize access to the monitoring page host string // Remote address of the monitoring service + quitCh <-chan struct{} + headCh <-chan *types.Block + pongCh chan struct{} // Pong notifications are fed into this channel histCh chan []uint64 // History request block numbers are fed into this channel @@ -121,6 +93,9 @@ func newConnectionWrapper(conn *websocket.Conn) *connWrapper { // WriteJSON wraps corresponding method on the websocket but is safe for concurrent calling func (w *connWrapper) WriteJSON(v interface{}) error { + if w.conn == nil { + return nil + } w.wlock.Lock() defer w.wlock.Unlock() @@ -143,7 +118,7 @@ func (w *connWrapper) Close() error { } // New returns a monitoring service ready for stats reporting. -func New(node *node.Node, backend backend, engine consensus.Engine, url string) error { +func New(node *node.Node, servers []*sentry.GrpcServer, chainDB kv.RoDB, engine consensus.Engine, url string, networkid uint64, quitCh <-chan struct{}, headCh chan *types.Block) error { // Parse the netstats connection url re := regexp.MustCompile("([^:@]*)(:([^@]*))?@(.+)") parts := re.FindStringSubmatch(url) @@ -151,14 +126,17 @@ func New(node *node.Node, backend backend, engine consensus.Engine, url string) return fmt.Errorf("invalid netstats url: \"%s\", should be nodename:secret@host:port", url) } ethstats := &Service{ - backend: backend, - engine: engine, - server: node.Server(), - node: parts[1], - pass: parts[3], - host: parts[4], - pongCh: make(chan struct{}), - histCh: make(chan []uint64, 1), + engine: engine, + servers: servers, + node: parts[1], + pass: parts[3], + host: parts[4], + pongCh: make(chan struct{}), + histCh: make(chan []uint64, 1), + networkid: networkid, + chaindb: chainDB, + headCh: headCh, + quitCh: quitCh, } node.RegisterLifecycle(ethstats) @@ -182,56 +160,6 @@ func (s *Service) Stop() error { // loop keeps trying to connect to the netstats server, reporting chain events // until termination. func (s *Service) loop() { - // Subscribe to chain events to execute updates on - chainHeadCh := make(chan core.ChainHeadEvent, chainHeadChanSize) - headSub := s.backend.SubscribeChainHeadEvent(chainHeadCh) - defer headSub.Unsubscribe() - - txEventCh := make(chan core.NewTxsEvent, txChanSize) - txSub := s.backend.SubscribeNewTxsEvent(txEventCh) - defer txSub.Unsubscribe() - - // Start a goroutine that exhausts the subscriptions to avoid events piling up - var ( - quitCh = make(chan struct{}) - headCh = make(chan *types.Block, 1) - txCh = make(chan struct{}, 1) - ) - go func() { - var lastTx mclock.AbsTime - - HandleLoop: - for { - select { - // Notify of chain head events, but drop if too frequent - case head := <-chainHeadCh: - select { - case headCh <- head.Block: - default: - } - - // Notify of new transaction events, but drop if too frequent - case <-txEventCh: - if time.Duration(mclock.Now()-lastTx) < time.Second { - continue - } - lastTx = mclock.Now() - - select { - case txCh <- struct{}{}: - default: - } - - // node stopped - case <-txSub.Err(): - break HandleLoop - case <-headSub.Err(): - break HandleLoop - } - } - close(quitCh) - }() - // Resolve the URL, defaulting to TLS, but falling back to none too path := fmt.Sprintf("%s/api", s.host) urls := []string{path} @@ -246,7 +174,7 @@ func (s *Service) loop() { // Loop reporting until termination for { select { - case <-quitCh: + case <-s.quitCh: return case <-errTimer.C: // Establish a websocket connection to the server on any supported URL @@ -258,15 +186,15 @@ func (s *Service) loop() { header := make(http.Header) header.Set("origin", "http://localhost") for _, url := range urls { - c, _, e := dialer.Dial(url, header) - err = e + //nolint + c, _, err := dialer.Dial(url, header) if err == nil { conn = newConnectionWrapper(c) break } } - if err != nil { - log.Warn("Stats server unreachable", "err", err) + if err != nil || conn == nil { + log.Warn("Stats server unreachable") errTimer.Reset(10 * time.Second) continue } @@ -279,19 +207,12 @@ func (s *Service) loop() { } go s.readLoop(conn) - // Send the initial stats so our node looks decent from the get go - if err = s.report(conn); err != nil { - log.Warn("Initial stats report failed", "err", err) - conn.Close() - errTimer.Reset(0) - continue - } // Keep sending status updates until the connection breaks fullReport := time.NewTicker(15 * time.Second) for err == nil { select { - case <-quitCh: + case <-s.quitCh: fullReport.Stop() // Make sure the connection is closed conn.Close() @@ -305,17 +226,11 @@ func (s *Service) loop() { if err = s.reportHistory(conn, list); err != nil { log.Warn("Requested history report failed", "err", err) } - case head := <-headCh: + case head := <-s.headCh: if err = s.reportBlock(conn, head); err != nil { log.Warn("Block stats report failed", "err", err) } - if err = s.reportPending(conn); err != nil { - log.Warn("Post-block transaction stats report failed", "err", err) - } - case <-txCh: - if err = s.reportPending(conn); err != nil { - log.Warn("Transaction stats report failed", "err", err) - } + } } fullReport.Stop() @@ -345,7 +260,7 @@ func (s *Service) readLoop(conn *connWrapper) { // If the network packet is a system ping, respond to it directly var ping string if err := json.Unmarshal(blob, &ping); err == nil && strings.HasPrefix(ping, "primus::ping::") { - if err := conn.WriteJSON(strings.Replace(ping, "ping", "pong", -1)); err != nil { + if err := conn.WriteJSON(strings.ReplaceAll(ping, "ping", "pong")); err != nil { log.Warn("Failed to respond to system ping message", "err", err) return } @@ -442,23 +357,28 @@ type authMsg struct { // login tries to authorize the client at the remote server. func (s *Service) login(conn *connWrapper) error { // Construct and send the login authentication - infos := s.server.NodeInfo() + // infos := s.server.NodeInfo() var protocols []string - for _, proto := range s.server.Protocols { - protocols = append(protocols, fmt.Sprintf("%s/%d", proto.Name, proto.Version)) - } - var network string - if info := infos.Protocols["eth"]; info != nil { - network = fmt.Sprintf("%d", info.(*ethproto.NodeInfo).Network) + for _, srv := range s.servers { + protocols = append(protocols, fmt.Sprintf("%s/%d", srv.Protocol.Name, srv.Protocol.Version)) + } + nodeName := "Erigon" + if len(s.servers) > 0 { + nodeInfo, err := s.servers[0].NodeInfo(context.TODO(), nil) + if err != nil { + return err + } + nodeName = nodeInfo.Name } + auth := &authMsg{ ID: s.node, Info: nodeInfo{ Name: s.node, - Node: infos.Name, - Port: infos.Ports.Listener, - Network: network, + Node: nodeName, + Port: 0, + Network: fmt.Sprintf("%d", s.networkid), Protocol: strings.Join(protocols, ", "), API: "No", Os: runtime.GOOS, @@ -573,8 +493,28 @@ func (s uncleStats) MarshalJSON() ([]byte, error) { // reportBlock retrieves the current chain head and reports it to the stats server. func (s *Service) reportBlock(conn *connWrapper, block *types.Block) error { + roTx, err := s.chaindb.BeginRo(context.Background()) + if err != nil { + return err + } + defer roTx.Rollback() + if block == nil { + block, err = rawdb.ReadLastBlockSynced(roTx) + if err != nil { + return err + } + if block == nil { + return nil + } + } + + td, err := rawdb.ReadTd(roTx, block.Hash(), block.NumberU64()) + if err != nil { + return err + } + // Gather the block details from the header or block chain - details := s.assembleBlockStats(block) + details := s.assembleBlockStats(block, td) // Assemble the block report and send it to the server log.Trace("Sending new block to ethstats", "number", details.Number, "hash", details.Hash) @@ -591,54 +531,44 @@ func (s *Service) reportBlock(conn *connWrapper, block *types.Block) error { // assembleBlockStats retrieves any required metadata to report a single block // and assembles the block stats. If block is nil, the current head is processed. -func (s *Service) assembleBlockStats(block *types.Block) *blockStats { +func (s *Service) assembleBlockStats(block *types.Block, td *big.Int) *blockStats { + if td == nil { + td = common.Big0 + } // Gather the block infos from the local blockchain var ( - header *types.Header - td *big.Int - txs []txStats - uncles []*types.Header + txs []txStats ) - - // check if backend is a full node - fullBackend, ok := s.backend.(fullNodeBackend) - if ok { - if block == nil { - block = fullBackend.CurrentBlock() - } - header = block.Header() - td = fullBackend.GetTd(context.Background(), header.Hash()) - - txs = make([]txStats, len(block.Transactions())) - for i, tx := range block.Transactions() { - txs[i].Hash = tx.Hash() - } - uncles = block.Uncles() + for _, tx := range block.Transactions() { + txs = append(txs, txStats{tx.Hash()}) } - // Assemble and return the block stats - author, _ := s.engine.Author(header) - return &blockStats{ - Number: header.Number, - Hash: header.Hash(), - ParentHash: header.ParentHash, - Timestamp: new(big.Int).SetUint64(header.Time), - Miner: author, - GasUsed: header.GasUsed, - GasLimit: header.GasLimit, - Diff: header.Difficulty.String(), + Number: block.Header().Number, + Hash: block.Hash(), + ParentHash: block.Header().ParentHash, + Timestamp: new(big.Int).SetUint64(block.Header().Time), + Miner: block.Header().Coinbase, + GasUsed: block.Header().GasUsed, + GasLimit: block.Header().GasLimit, + Diff: block.Header().Difficulty.String(), TotalDiff: td.String(), Txs: txs, - TxHash: header.TxHash, - Root: header.Root, - Uncles: uncles, + TxHash: block.Header().TxHash, + Root: block.Header().Root, + Uncles: block.Uncles(), } } // reportHistory retrieves the most recent batch of blocks and reports it to the // stats server. func (s *Service) reportHistory(conn *connWrapper, list []uint64) error { + roTx, err := s.chaindb.BeginRo(context.Background()) + if err != nil { + return err + } + defer roTx.Rollback() + // Figure out the indexes that need reporting indexes := make([]uint64, 0, historyUpdateRange) if len(list) > 0 { @@ -646,31 +576,34 @@ func (s *Service) reportHistory(conn *connWrapper, list []uint64) error { indexes = append(indexes, list...) } else { // No indexes requested, send back the top ones - head := s.backend.CurrentHeader().Number.Int64() - start := head - historyUpdateRange + 1 + headHash := rawdb.ReadHeadBlockHash(roTx) + headNumber := rawdb.ReadHeaderNumber(roTx, headHash) + if headNumber == nil { + return nil + } + start := int(*headNumber - historyUpdateRange + 1) if start < 0 { start = 0 } - for i := uint64(start); i <= uint64(head); i++ { + for i := uint64(start); i <= *headNumber; i++ { indexes = append(indexes, i) } } // Gather the batch of blocks to report history := make([]*blockStats, len(indexes)) for i, number := range indexes { - fullBackend, ok := s.backend.(fullNodeBackend) // Retrieve the next block if it's known to us - var block *types.Block - if ok { - block, _ = fullBackend.BlockByNumber(context.Background(), rpc.BlockNumber(number)) // TODO ignore error here ? - } else { - if header, _ := s.backend.HeaderByNumber(context.Background(), rpc.BlockNumber(number)); header != nil { - block = types.NewBlockWithHeader(header) - } + block, err := rawdb.ReadBlockByNumber(roTx, number) + if err != nil { + return err + } + td, err := rawdb.ReadTd(roTx, block.Hash(), number) + if err != nil { + return err } // If we do have the block, add to the history and continue if block != nil { - history[len(history)-1-i] = s.assembleBlockStats(block) + history[len(history)-1-i] = s.assembleBlockStats(block, td) continue } // Ran out of blocks, cut the report short and send @@ -693,77 +626,69 @@ func (s *Service) reportHistory(conn *connWrapper, list []uint64) error { return conn.WriteJSON(report) } -// pendStats is the information to report about pending transactions. -type pendStats struct { - Pending int `json:"pending"` -} - // reportPending retrieves the current number of pending transactions and reports // it to the stats server. func (s *Service) reportPending(conn *connWrapper) error { - // Retrieve the pending count from the local blockchain - pending, _ := s.backend.Stats() - // Assemble the transaction stats and send it to the server - log.Trace("Sending pending transactions to ethstats", "count", pending) - - stats := map[string]interface{}{ - "id": s.node, - "stats": &pendStats{ - Pending: pending, - }, - } - report := map[string][]interface{}{ - "emit": {"pending", stats}, - } - return conn.WriteJSON(report) + /* // Retrieve the pending count from the local blockchain + pending, _ := s.backend.Stats() + // Assemble the transaction stats and send it to the server + log.Trace("Sending pending transactions to ethstats", "count", pending) + + stats := map[string]interface{}{ + "id": s.node, + "stats": &pendStats{ + Pending: pending, + }, + } + report := map[string][]interface{}{ + "emit": {"pending", stats}, + } + return conn.WriteJSON(report)*/ + return nil } // nodeStats is the information to report about the local node. type nodeStats struct { - Active bool `json:"active"` - Syncing bool `json:"syncing"` - Mining bool `json:"mining"` - Hashrate int `json:"hashrate"` - GoodPeers int `json:"peers"` - GasPrice int `json:"gasPrice"` - Uptime int `json:"uptime"` + Active bool `json:"active"` + Syncing bool `json:"syncing"` + Mining bool `json:"mining"` + Hashrate int `json:"hashrate"` + GoodPeers int `json:"peers"` + GasPrice int `json:"gasPrice"` + Uptime int `json:"uptime"` } // reportStats retrieves various stats about the node at the networking and // mining layer and reports it to the stats server. func (s *Service) reportStats(conn *connWrapper) error { - // Gather the syncing and mining infos from the local miner instance - var ( - mining bool - hashrate int - syncing bool - gasprice int - ) - // check if backend is a full node - fullBackend, ok := s.backend.(fullNodeBackend) - if ok { - mining = fullBackend.Miner().Mining() - hashrate = int(fullBackend.Miner().HashRate()) - - sync := fullBackend.Downloader().Progress() - syncing = fullBackend.CurrentHeader().Number.Uint64() >= sync.HighestBlock - - price, _ := fullBackend.SuggestPrice(context.Background()) - gasprice = int(price.Uint64()) + roTx, err := s.chaindb.BeginRo(context.Background()) + if err != nil { + return err + } + defer roTx.Rollback() + sync, err := stages.GetStageProgress(roTx, stages.Execution) + if err != nil { + return err + } + finishSync, err := stages.GetStageProgress(roTx, stages.Finish) + if err != nil { + return err + } + // TODO(Giulio2002): peer tracking + peerCount := 0 + for _, srv := range s.servers { + peerCount += srv.SimplePeerCount() } - // Assemble the node stats and send it to the server - log.Trace("Sending node details to ethstats") - stats := map[string]interface{}{ "id": s.node, "stats": &nodeStats{ - Active: true, - Mining: mining, - Hashrate: hashrate, - GoodPeers: s.server.PeerCount(), - GasPrice: gasprice, - Syncing: syncing, - Uptime: 100, + Active: true, + Mining: false, + Hashrate: 0, + GoodPeers: peerCount, + GasPrice: 0, + Syncing: sync != finishSync, + Uptime: 100, }, } report := map[string][]interface{}{ @@ -771,4 +696,3 @@ func (s *Service) reportStats(conn *connWrapper) error { } return conn.WriteJSON(report) } -*/ diff --git a/go.mod b/go.mod index 7f8deff3dfa..b186dd0b4cc 100644 --- a/go.mod +++ b/go.mod @@ -1,74 +1,164 @@ module github.com/ledgerwatch/erigon -go 1.16 +go 1.18 require ( - github.com/RoaringBitmap/roaring v0.6.0 - github.com/VictoriaMetrics/fastcache v1.6.0 - github.com/VictoriaMetrics/metrics v1.17.3 - github.com/anacrolix/log v0.8.0 - github.com/anacrolix/torrent v1.25.1 - github.com/aws/aws-sdk-go v1.34.21 - github.com/blend/go-sdk v1.20210428.4 // indirect - github.com/btcsuite/btcd v0.21.0-beta + github.com/RoaringBitmap/roaring v1.1.0 + github.com/VictoriaMetrics/fastcache v1.10.0 + github.com/VictoriaMetrics/metrics v1.18.1 + github.com/anacrolix/go-libutp v1.2.0 + github.com/anacrolix/log v0.13.1 + github.com/anacrolix/torrent v1.43.1 + github.com/btcsuite/btcd v0.22.0-beta github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2 - github.com/cloudflare/cloudflare-go v0.13.2 - github.com/consensys/gurvy v0.3.8 + github.com/consensys/gnark-crypto v0.4.0 github.com/davecgh/go-spew v1.1.1 github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea - github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf - github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498 + github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48 github.com/edsrzf/mmap-go v1.0.0 - github.com/emicklei/dot v0.11.0 - github.com/fatih/color v1.7.0 + github.com/emicklei/dot v0.16.0 + github.com/emirpasic/gods v1.18.1 github.com/fjl/gencodec v0.0.0-20191126094850-e283372f291f - github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect - github.com/goccy/go-json v0.4.11 - github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/protobuf v1.5.2 - github.com/golang/snappy v0.0.3 + github.com/goccy/go-json v0.9.7 + github.com/gofrs/flock v0.8.1 + github.com/golang-jwt/jwt/v4 v4.3.0 + github.com/golang/snappy v0.0.4 github.com/google/btree v1.0.1 github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa - github.com/gorilla/websocket v1.4.2 + github.com/gorilla/websocket v1.5.0 github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/holiman/uint256 v1.2.0 - github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda + github.com/huin/goupnp v1.0.3 github.com/jackpal/go-nat-pmp v1.0.2 - github.com/json-iterator/go v1.1.11 + github.com/json-iterator/go v1.1.12 github.com/julienschmidt/httprouter v1.3.0 github.com/kevinburke/go-bindata v3.21.0+incompatible - github.com/ledgerwatch/erigon-lib v0.0.0-20210730030258-1f46e8166b35 - github.com/ledgerwatch/log/v3 v3.2.0 - github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d - github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/pelletier/go-toml v1.9.3 - github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99 - github.com/prometheus/client_golang v1.9.0 // indirect - github.com/prometheus/tsdb v0.10.0 - github.com/quasilyte/go-ruleguard/dsl v0.3.6 - github.com/rs/cors v1.8.0 - github.com/shirou/gopsutil/v3 v3.21.6 - github.com/spf13/cobra v1.1.3 + github.com/ledgerwatch/erigon-lib v0.0.0-20220605213234-a77e6425eb24 + github.com/ledgerwatch/log/v3 v3.4.1 + github.com/ledgerwatch/secp256k1 v1.0.0 + github.com/nxadm/tail v1.4.9-0.20211216163028-4472660a31a6 + github.com/pelletier/go-toml v1.9.5 + github.com/pelletier/go-toml/v2 v2.0.1 + github.com/pion/stun v0.3.5 + github.com/quasilyte/go-ruleguard/dsl v0.3.21 + github.com/rs/cors v1.8.2 + github.com/spf13/cobra v1.4.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.7.0 - github.com/torquem-ch/mdbx-go v0.17.0 + github.com/stretchr/testify v1.7.1 + github.com/tendermint/go-amino v0.14.1 + github.com/tendermint/tendermint v0.31.11 + github.com/torquem-ch/mdbx-go v0.24.2 github.com/ugorji/go/codec v1.1.13 github.com/ugorji/go/codec/codecgen v1.1.13 - github.com/urfave/cli v1.22.5 + github.com/urfave/cli v1.22.8 github.com/valyala/fastjson v1.6.3 - github.com/wcharczuk/go-chart v2.0.1+incompatible + github.com/wcharczuk/go-chart/v2 v2.1.0 + github.com/xsleonard/go-merkle v1.1.0 go.uber.org/atomic v1.9.0 - golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e + golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 + golang.org/x/exp v0.0.0-20220428152302-39d4317da171 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 - golang.org/x/tools v0.1.1 - google.golang.org/grpc v1.39.0 - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/protobuf v1.27.1 - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 - gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 - pgregory.net/rapid v0.4.6 + golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 + golang.org/x/time v0.0.0-20220411224347-583f2d630306 + google.golang.org/grpc v1.46.2 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 + google.golang.org/protobuf v1.28.0 + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c + modernc.org/sqlite v1.17.3 + pgregory.net/rapid v0.4.7 +) + +require ( + crawshaw.io/sqlite v0.3.3-0.20210127221821-98b1f83c5508 // indirect + github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0 // indirect + github.com/anacrolix/chansync v0.3.0 // indirect + github.com/anacrolix/dht/v2 v2.16.2-0.20220311024416-dd658f18fd51 // indirect + github.com/anacrolix/envpprof v1.2.1 // indirect + github.com/anacrolix/generics v0.0.0-20220510042907-b50562b436ec // indirect + github.com/anacrolix/missinggo v1.3.0 // indirect + github.com/anacrolix/missinggo/perf v1.0.0 // indirect + github.com/anacrolix/missinggo/v2 v2.7.0 // indirect + github.com/anacrolix/mmsg v1.0.0 // indirect + github.com/anacrolix/multiless v0.2.1-0.20211218050420-533661eef5dc // indirect + github.com/anacrolix/stm v0.3.0 // indirect + github.com/anacrolix/sync v0.4.0 // indirect + github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96 // indirect + github.com/anacrolix/utp v0.1.0 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/benbjohnson/immutable v0.3.0 // indirect + github.com/bits-and-blooms/bitset v1.2.0 // indirect + github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect + github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/flanglet/kanzi-go v1.9.1-0.20211212184056-72dda96261ee // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 // indirect + github.com/go-kit/kit v0.10.0 // indirect + github.com/go-logfmt/logfmt v0.5.0 // indirect + github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/huandu/xstrings v1.3.2 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/kr/pretty v0.3.0 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/lispad/go-generics-tools v1.0.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.11 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mschoch/smat v0.2.0 // indirect + github.com/pion/datachannel v1.5.2 // indirect + github.com/pion/dtls/v2 v2.1.2 // indirect + github.com/pion/ice/v2 v2.1.20 // indirect + github.com/pion/interceptor v0.1.7 // indirect + github.com/pion/logging v0.2.2 // indirect + github.com/pion/mdns v0.0.5 // indirect + github.com/pion/randutil v0.1.0 // indirect + github.com/pion/rtcp v1.2.9 // indirect + github.com/pion/rtp v1.7.4 // indirect + github.com/pion/sctp v1.8.2 // indirect + github.com/pion/sdp/v3 v3.0.4 // indirect + github.com/pion/srtp/v2 v2.0.5 // indirect + github.com/pion/transport v0.13.0 // indirect + github.com/pion/turn/v2 v2.0.6 // indirect + github.com/pion/udp v0.1.1 // indirect + github.com/pion/webrtc/v3 v3.1.24-0.20220208053747-94262c1b2b38 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect + github.com/rogpeppe/go-internal v1.8.0 // indirect + github.com/rs/dnscache v0.0.0-20210201191234-295bba877686 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/tidwall/btree v0.7.2-0.20211211132910-4215444137fc // indirect + github.com/valyala/fastrand v1.1.0 // indirect + github.com/valyala/histogram v1.2.0 // indirect + go.etcd.io/bbolt v1.3.6 // indirect + golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/tools v0.1.10 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + lukechampine.com/uint128 v1.1.1 // indirect + modernc.org/cc/v3 v3.36.0 // indirect + modernc.org/ccgo/v3 v3.16.6 // indirect + modernc.org/libc v1.16.7 // indirect + modernc.org/mathutil v1.4.1 // indirect + modernc.org/memory v1.1.1 // indirect + modernc.org/opt v0.1.1 // indirect + modernc.org/strutil v1.1.1 // indirect + modernc.org/token v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index 8c3f395e61b..b21016665e4 100644 --- a/go.sum +++ b/go.sum @@ -1,224 +1,122 @@ -bazil.org/fuse v0.0.0-20180421153158-65cc252bf669/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= crawshaw.io/iox v0.0.0-20181124134642-c51c3df30797 h1:yDf7ARQc637HoxDho7xjqdvO5ZA2Yb+xzv/fOnnvZzw= crawshaw.io/iox v0.0.0-20181124134642-c51c3df30797/go.mod h1:sXBiorCo8c46JlQV3oXPKINnZ8mcqnye1EkVkqsectk= +crawshaw.io/sqlite v0.3.2/go.mod h1:igAO5JulrQ1DbdZdtVq48mnZUBAPOeFzer7VhDWNtW4= crawshaw.io/sqlite v0.3.3-0.20210127221821-98b1f83c5508 h1:fILCBBFnjnrQ0whVJlGhfv1E/QiaFDNtGFBObEVRnYg= crawshaw.io/sqlite v0.3.3-0.20210127221821-98b1f83c5508/go.mod h1:igAO5JulrQ1DbdZdtVq48mnZUBAPOeFzer7VhDWNtW4= -dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/datadog-go v4.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/RoaringBitmap/roaring v0.4.7/go.mod h1:8khRDP4HmeXns4xIj9oGrKSz7XTQiJx2zgh7AcNke4w= github.com/RoaringBitmap/roaring v0.4.17/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= -github.com/RoaringBitmap/roaring v0.4.18/go.mod h1:D3qVegWTmfCaX4Bl5CrBE9hfrSrrXIr8KVNvRsDi1NI= -github.com/RoaringBitmap/roaring v0.4.21/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= github.com/RoaringBitmap/roaring v0.4.23/go.mod h1:D0gp8kJQgE1A4LQ5wFLggQEyvDi06Mq5mKs52e1TwOo= -github.com/RoaringBitmap/roaring v0.5.5/go.mod h1:puNo5VdzwbaIQxSiDIwfXl4Hnc+fbovcX4IW/dSTtUk= -github.com/RoaringBitmap/roaring v0.6.0 h1:tZcn2nJpUrZf+xQY8x+9QY7BxSETMjkdNG4Ts5zahyU= -github.com/RoaringBitmap/roaring v0.6.0/go.mod h1:WZ83fjBF/7uBHi6QoFyfGL4+xuV4Qn+xFkm4+vSzrhE= +github.com/RoaringBitmap/roaring v1.1.0 h1:b10lZrZXaY6Q6EKIRrmOF519FIyQQ5anPgGr3niw2yY= +github.com/RoaringBitmap/roaring v1.1.0/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/VictoriaMetrics/metrics v1.17.3 h1:QPUakR6JRy8BhL2C2kOgYKLuoPDwtJQ+7iKIZSjt1A4= -github.com/VictoriaMetrics/metrics v1.17.3/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE= +github.com/VictoriaMetrics/fastcache v1.10.0 h1:5hDJnLsKLpnUEToub7ETuRu8RCkb40woBZAUiKonXzY= +github.com/VictoriaMetrics/fastcache v1.10.0/go.mod h1:tjiYeEfYXCqacuvYw/7UoDIeJaNxq6132xHICNP77w8= +github.com/VictoriaMetrics/metrics v1.18.1 h1:OZ0+kTTto8oPfHnVAnTOoyl0XlRhRkoQrD2n2cOuRw0= +github.com/VictoriaMetrics/metrics v1.18.1/go.mod h1:ArjwVz7WpgpegX/JpB0zpNF2h2232kErkEnzH1sxMmA= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75/go.mod h1:uAXEEpARkRhCZfEvy/y0Jcc888f9tHCc1W7/UeEtreE= +github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0 h1:byYvvbfSo3+9efR4IeReh77gVs4PnNDR3AMOE9NJ7a0= +github.com/ajwerner/btree v0.0.0-20211221152037-f427b3e689c0/go.mod h1:q37NoqncT41qKc048STsifIt69LfUJ8SrWWcz/yam5k= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-arg v1.1.0/go.mod h1:3Rj4baqzWaGGmZA2+bVTV8zQOZEjBQAPBnL5xLT+ftY= -github.com/alexflint/go-arg v1.2.0/go.mod h1:3Rj4baqzWaGGmZA2+bVTV8zQOZEjBQAPBnL5xLT+ftY= -github.com/alexflint/go-arg v1.3.0/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= -github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/anacrolix/dht v0.0.0-20180412060941-24cbf25b72a4 h1:0yHJvFiGQhJ1gSHJOR8xzmnx45orEt7uiIB6guf0+zc= -github.com/anacrolix/dht v0.0.0-20180412060941-24cbf25b72a4/go.mod h1:hQfX2BrtuQsLQMYQwsypFAab/GvHg8qxwVi4OJdR1WI= -github.com/anacrolix/dht/v2 v2.0.1/go.mod h1:GbTT8BaEtfqab/LPd5tY41f3GvYeii3mmDUK300Ycyo= -github.com/anacrolix/dht/v2 v2.2.1-0.20191103020011-1dba080fb358/go.mod h1:d7ARx3WpELh9uOEEr0+8wvQeVTOkPse4UU6dKpv4q0E= -github.com/anacrolix/dht/v2 v2.3.2-0.20200103043204-8dce00767ebd/go.mod h1:cgjKyErDnKS6Mej5D1fEqBKg3KwFF2kpFZJp3L6/fGI= -github.com/anacrolix/dht/v2 v2.5.1-0.20200317023935-129f05e9b752/go.mod h1:7RLvyOjm+ZPA7vgFRP+1eRjFzrh27p/nF0VCk5LcjoU= -github.com/anacrolix/dht/v2 v2.8.0 h1:u7NpANhFfAb+TKOSqI08YJtH7mavPPXQ9ePJyuqkWR0= -github.com/anacrolix/dht/v2 v2.8.0/go.mod h1:RjeKbveVwjnaVj5os4y/NQwqEoDWHigo5rdge9MP52k= +github.com/anacrolix/chansync v0.3.0 h1:lRu9tbeuw3wl+PhMu/r+JJCRu5ArFXIluOgdF0ao6/U= +github.com/anacrolix/chansync v0.3.0/go.mod h1:DZsatdsdXxD0WiwcGl0nJVwyjCKMDv+knl1q2iBjA2k= +github.com/anacrolix/dht/v2 v2.16.2-0.20220311024416-dd658f18fd51 h1:issCwqC43gQ7n0gg9rn0EeVYXnQMI7vlnWub4oidtlU= +github.com/anacrolix/dht/v2 v2.16.2-0.20220311024416-dd658f18fd51/go.mod h1:osiyaNrMLG9dw7wUtVMaII/NdCjlXeHjUcYzXnmop68= github.com/anacrolix/envpprof v0.0.0-20180404065416-323002cec2fa/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c= github.com/anacrolix/envpprof v1.0.0/go.mod h1:KgHhUaQMc8cC0+cEflSgCFNFbKwi5h54gqtVn8yhP7c= -github.com/anacrolix/envpprof v1.0.1/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= github.com/anacrolix/envpprof v1.1.0/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= -github.com/anacrolix/envpprof v1.1.1 h1:sHQCyj7HtiSfaZAzL2rJrQdyS7odLqlwO6nhk/tG/j8= -github.com/anacrolix/envpprof v1.1.1/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= -github.com/anacrolix/go-libutp v0.0.0-20180522111405-6baeb806518d/go.mod h1:beQSaSxwH2d9Eeu5ijrEnHei5Qhk+J6cDm1QkWFru4E= -github.com/anacrolix/go-libutp v1.0.2/go.mod h1:uIH0A72V++j0D1nnmTjjZUiH/ujPkFxYWkxQ02+7S0U= -github.com/anacrolix/go-libutp v1.0.4 h1:95sv09MoNQbgEJqJLrotglFnVBAiMx1tyl6xMAmnAgg= -github.com/anacrolix/go-libutp v1.0.4/go.mod h1:8vSGX5g0b4eebsDBNVQHUXSCwYaN18Lnkse0hUW8/5w= -github.com/anacrolix/log v0.0.0-20180412014343-2323884b361d/go.mod h1:sf/7c2aTldL6sRQj/4UKyjgVZBu2+M2z9wf7MmwPiew= +github.com/anacrolix/envpprof v1.2.1 h1:25TJe6t/i0AfzzldiGFKCpD+s+dk8lONBcacJZB2rdE= +github.com/anacrolix/envpprof v1.2.1/go.mod h1:My7T5oSqVfEn4MD4Meczkw/f5lSIndGAKu/0SM/rkf4= +github.com/anacrolix/generics v0.0.0-20220510042907-b50562b436ec h1:OnHX2MpnlLBBee06jcpL6eBppz766BnquXnZKH6iGgI= +github.com/anacrolix/generics v0.0.0-20220510042907-b50562b436ec/go.mod h1:ff2rHB/joTV03aMSSn/AZNnaIpUw0h3njetGsaXcMy8= +github.com/anacrolix/go-libutp v1.2.0 h1:sjxoB+/ARiKUR7IK/6wLWyADIBqGmu1fm0xo+8Yy7u0= +github.com/anacrolix/go-libutp v1.2.0/go.mod h1:RrJ3KcaDcf9Jqp33YL5V/5CBEc6xMc7aJL8wXfuWL50= github.com/anacrolix/log v0.3.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= -github.com/anacrolix/log v0.3.1-0.20190913000754-831e4ffe0174/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= -github.com/anacrolix/log v0.3.1-0.20191001111012-13cede988bcd/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= -github.com/anacrolix/log v0.4.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= -github.com/anacrolix/log v0.5.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= github.com/anacrolix/log v0.6.0/go.mod h1:lWvLTqzAnCWPJA08T2HCstZi0L1y2Wyvm3FJgwU9jwU= -github.com/anacrolix/log v0.6.1-0.20200416071330-f58a030e6149/go.mod h1:s5yBP/j046fm9odtUTbHOfDUq/zh1W8OkPpJtnX0oQI= -github.com/anacrolix/log v0.8.0 h1:C/fErGvLyoTbCk44F5HW2izl9cCkeO3mVTL1+ya0HT0= -github.com/anacrolix/log v0.8.0/go.mod h1:s5yBP/j046fm9odtUTbHOfDUq/zh1W8OkPpJtnX0oQI= -github.com/anacrolix/missinggo v0.0.0-20180522035225-b4a5853e62ff/go.mod h1:b0p+7cn+rWMIphK1gDH2hrDuwGOcbB6V4VXeSsEfHVk= +github.com/anacrolix/log v0.10.0/go.mod h1:s5yBP/j046fm9odtUTbHOfDUq/zh1W8OkPpJtnX0oQI= +github.com/anacrolix/log v0.10.1-0.20220123034749-3920702c17f8/go.mod h1:GmnE2c0nvz8pOIPUSC9Rawgefy1sDXqposC2wgtBZE4= +github.com/anacrolix/log v0.13.1 h1:BmVwTdxHd5VcNrLylgKwph4P4wf+5VvPgOK4yi91fTY= +github.com/anacrolix/log v0.13.1/go.mod h1:D4+CvN8SnruK6zIFS/xPoRJmtvtnxs+CSfDQ+BFxZ68= +github.com/anacrolix/lsan v0.0.0-20211126052245-807000409a62 h1:P04VG6Td13FHMgS5ZBcJX23NPC/fiC4cp9bXwYujdYM= +github.com/anacrolix/lsan v0.0.0-20211126052245-807000409a62/go.mod h1:66cFKPCO7Sl4vbFnAaSq7e4OXtdMhRSBagJGWgmpJbM= github.com/anacrolix/missinggo v0.0.0-20180725070939-60ef2fbf63df/go.mod h1:kwGiTUTZ0+p4vAz3VbAI5a30t2YbvemcmspjKwrAz5s= -github.com/anacrolix/missinggo v0.2.1-0.20190310234110-9fbdc9f242a8/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo= github.com/anacrolix/missinggo v1.1.0/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo= github.com/anacrolix/missinggo v1.1.2-0.20190815015349-b888af804467/go.mod h1:MBJu3Sk/k3ZfGYcS7z18gwfu72Ey/xopPFJJbTi5yIo= -github.com/anacrolix/missinggo v1.2.1 h1:0IE3TqX5y5D0IxeMwTyIgqdDew4QrzcXaaEnJQyjHvw= github.com/anacrolix/missinggo v1.2.1/go.mod h1:J5cMhif8jPmFoC3+Uvob3OXXNIhOUikzMt+uUjeM21Y= +github.com/anacrolix/missinggo v1.3.0 h1:06HlMsudotL7BAELRZs0yDZ4yVXsHXGi323QBjAVASw= +github.com/anacrolix/missinggo v1.3.0/go.mod h1:bqHm8cE8xr+15uVfMG3BFui/TxyB6//H5fwlq/TeqMc= github.com/anacrolix/missinggo/perf v1.0.0 h1:7ZOGYziGEBytW49+KmYGTaNfnwUqP1HBsy6BqESAJVw= github.com/anacrolix/missinggo/perf v1.0.0/go.mod h1:ljAFWkBuzkO12MQclXzZrosP5urunoLS0Cbvb4V0uMQ= github.com/anacrolix/missinggo/v2 v2.2.0/go.mod h1:o0jgJoYOyaoYQ4E2ZMISVa9c88BbUBVQQW4QeRkNCGY= -github.com/anacrolix/missinggo/v2 v2.2.1-0.20191103010835-12360f38ced0/go.mod h1:ZzG3/cc3t+5zcYWAgYrJW0MBsSwNwOkTlNquBbP51Bc= -github.com/anacrolix/missinggo/v2 v2.3.0/go.mod h1:ZzG3/cc3t+5zcYWAgYrJW0MBsSwNwOkTlNquBbP51Bc= -github.com/anacrolix/missinggo/v2 v2.3.1/go.mod h1:3XNH0OEmyMUZuvXmYdl+FDfXd0vvSZhvOLy8CFx8tLg= -github.com/anacrolix/missinggo/v2 v2.4.1-0.20200227072623-f02f6484f997/go.mod h1:KY+ij+mWvwGuqSuecLjjPv5LFw5ICUc1UvRems3VAZE= -github.com/anacrolix/missinggo/v2 v2.5.0 h1:75aciOVrzVV1bTH9rl8tYLbXO9A7HXFtHexTChawe/U= -github.com/anacrolix/missinggo/v2 v2.5.0/go.mod h1:HYuCbwvJXY3XbcmcIcTgZXHleoDXawxPWx/YiPzFzV0= +github.com/anacrolix/missinggo/v2 v2.5.1/go.mod h1:WEjqh2rmKECd0t1VhQkLGTdIWXO6f6NLjp5GlMZ+6FA= +github.com/anacrolix/missinggo/v2 v2.5.2/go.mod h1:yNvsLrtZYRYCOI+KRH/JM8TodHjtIE/bjOGhQaLOWIE= +github.com/anacrolix/missinggo/v2 v2.7.0 h1:4fzOAAn/VCvfWGviLmh64MPMttrlYew81JdPO7nSHvI= +github.com/anacrolix/missinggo/v2 v2.7.0/go.mod h1:2IZIvmRTizALNYFYXsPR7ofXPzJgyBpKZ4kMqMEICkI= github.com/anacrolix/mmsg v0.0.0-20180515031531-a4a3ba1fc8bb/go.mod h1:x2/ErsYUmT77kezS63+wzZp8E3byYB0gzirM/WMBLfw= github.com/anacrolix/mmsg v1.0.0 h1:btC7YLjOn29aTUAExJiVUhQOuf/8rhm+/nWCMAnL3Hg= github.com/anacrolix/mmsg v1.0.0/go.mod h1:x8kRaJY/dCrY9Al0PEcj1mb/uFHwP6GCJ9fLl4thEPc= -github.com/anacrolix/multiless v0.0.0-20191223025854-070b7994e841/go.mod h1:TrCLEZfIDbMVfLoQt5tOoiBS/uq4y8+ojuEVVvTNPX4= -github.com/anacrolix/multiless v0.0.0-20200413040533-acfd16f65d5d h1:Vg2zfJt8ZRyaOSXfDmgwqAuFTj0zQ8UF1hTw7X12WmY= -github.com/anacrolix/multiless v0.0.0-20200413040533-acfd16f65d5d/go.mod h1:TrCLEZfIDbMVfLoQt5tOoiBS/uq4y8+ojuEVVvTNPX4= -github.com/anacrolix/stm v0.1.0/go.mod h1:ZKz7e7ERWvP0KgL7WXfRjBXHNRhlVRlbBQecqFtPq+A= -github.com/anacrolix/stm v0.1.1-0.20191106051447-e749ba3531cf/go.mod h1:zoVQRvSiGjGoTmbM0vSLIiaKjWtNPeTvXUSdJQA4hsg= +github.com/anacrolix/multiless v0.2.1-0.20211218050420-533661eef5dc h1:K047jUtd0Xv4SEpv/5DoBgDvj4ZNpT1SOVtMlFpRrh0= +github.com/anacrolix/multiless v0.2.1-0.20211218050420-533661eef5dc/go.mod h1:TrCLEZfIDbMVfLoQt5tOoiBS/uq4y8+ojuEVVvTNPX4= github.com/anacrolix/stm v0.2.0/go.mod h1:zoVQRvSiGjGoTmbM0vSLIiaKjWtNPeTvXUSdJQA4hsg= -github.com/anacrolix/stm v0.2.1-0.20201002073511-c35a2c748c6a h1:iFheJfoyyo9PS30gHOJ88DRfpFOaM9U+emmJlH7xUhc= -github.com/anacrolix/stm v0.2.1-0.20201002073511-c35a2c748c6a/go.mod h1:spImf/rXwiAUoYYJK1YCZeWkpaHZ3kzjGFjwK5OStfU= -github.com/anacrolix/sync v0.0.0-20171108081538-eee974e4f8c1/go.mod h1:+u91KiUuf0lyILI6x3n/XrW7iFROCZCG+TjgK8nW52w= -github.com/anacrolix/sync v0.0.0-20180611022320-3c4cb11f5a01/go.mod h1:+u91KiUuf0lyILI6x3n/XrW7iFROCZCG+TjgK8nW52w= +github.com/anacrolix/stm v0.3.0 h1:peQncJSNJtk1YBrFbW0DLKYqll+sa0kOk8EvXRcO+wA= +github.com/anacrolix/stm v0.3.0/go.mod h1:spImf/rXwiAUoYYJK1YCZeWkpaHZ3kzjGFjwK5OStfU= github.com/anacrolix/sync v0.0.0-20180808010631-44578de4e778/go.mod h1:s735Etp3joe/voe2sdaXLcqDdJSay1O0OPnM0ystjqk= -github.com/anacrolix/sync v0.2.0 h1:oRe22/ZB+v7v/5Mbc4d2zE0AXEZy0trKyKLjqYOt6tY= -github.com/anacrolix/sync v0.2.0/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g= +github.com/anacrolix/sync v0.3.0/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g= +github.com/anacrolix/sync v0.4.0 h1:T+MdO/u87ir/ijWsTFsPYw5jVm0SMm4kVpg8t4KF38o= +github.com/anacrolix/sync v0.4.0/go.mod h1:BbecHL6jDSExojhNtgTFSBcdGerzNc64tz3DCOj/I0g= github.com/anacrolix/tagflag v0.0.0-20180109131632-2146c8d41bf0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= -github.com/anacrolix/tagflag v0.0.0-20180605133421-f477c8c2f14c/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= -github.com/anacrolix/tagflag v0.0.0-20180803105420-3a8ff5428f76/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= github.com/anacrolix/tagflag v1.0.0/go.mod h1:1m2U/K6ZT+JZG0+bdMK6qauP49QT4wE5pmhJXOKKCHw= -github.com/anacrolix/tagflag v1.0.1/go.mod h1:gb0fiMQ02qU1djCSqaxGmruMvZGrMwSReidMB0zjdxo= github.com/anacrolix/tagflag v1.1.0/go.mod h1:Scxs9CV10NQatSmbyjqmqmeQNwGzlNe0CMUMIxqHIG8= -github.com/anacrolix/tagflag v1.1.1-0.20200411025953-9bb5209d56c2/go.mod h1:Scxs9CV10NQatSmbyjqmqmeQNwGzlNe0CMUMIxqHIG8= -github.com/anacrolix/torrent v0.0.0-20180622074351-fefeef4ee9eb/go.mod h1:3vcFVxgOASslNXHdivT8spyMRBanMCenHRpe0u5vpBs= -github.com/anacrolix/torrent v1.7.1/go.mod h1:uvOcdpOjjrAq3uMP/u1Ide35f6MJ/o8kMnFG8LV3y6g= -github.com/anacrolix/torrent v1.9.0/go.mod h1:jJJ6lsd2LD1eLHkUwFOhy7I0FcLYH0tHKw2K7ZYMHCs= -github.com/anacrolix/torrent v1.11.0/go.mod h1:FwBai7SyOFlflvfEOaM88ag/jjcBWxTOqD6dVU/lKKA= -github.com/anacrolix/torrent v1.15.0/go.mod h1:MFc6KcbpAyfwGqOyRkdarUK9QnKA/FkVg0usFk1OQxU= -github.com/anacrolix/torrent v1.25.1 h1:CWw5Kd1VGY3UUM82/xdn+JQBVfJZ8rDT29laKwRUIcI= -github.com/anacrolix/torrent v1.25.1/go.mod h1:737rU+al1LBWEs3IHBystZvsbg24iSP+8Gb25Vc/s5U= -github.com/anacrolix/upnp v0.1.1/go.mod h1:LXsbsp5h+WGN7YR+0A7iVXm5BL1LYryDev1zuJMWYQo= -github.com/anacrolix/upnp v0.1.2-0.20200416075019-5e9378ed1425 h1:/Wi6l2ONI1FUFWN4cBwHOO90V4ylp4ud/eov6GUcVFk= -github.com/anacrolix/upnp v0.1.2-0.20200416075019-5e9378ed1425/go.mod h1:Pz94W3kl8rf+wxH3IbCa9Sq+DTJr8OSbV2Q3/y51vYs= -github.com/anacrolix/utp v0.0.0-20180219060659-9e0e1d1d0572/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk= +github.com/anacrolix/torrent v1.43.1 h1:oM9bOaEdOHJuXM8aaEbAHG5C1T0npyB4v5OflrmRNgY= +github.com/anacrolix/torrent v1.43.1/go.mod h1:SsvA8hlN3q1gC1Pf+fJ7QrfWI+5DumO6tEl4bqf+D2U= +github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96 h1:QAVZ3pN/J4/UziniAhJR2OZ9Ox5kOY2053tBbbqUPYA= +github.com/anacrolix/upnp v0.1.3-0.20220123035249-922794e51c96/go.mod h1:Wa6n8cYIdaG35x15aH3Zy6d03f7P728QfdcDeD/IEOs= github.com/anacrolix/utp v0.1.0 h1:FOpQOmIwYsnENnz7tAGohA+r6iXpRjrq8ssKSre2Cp4= github.com/anacrolix/utp v0.1.0/go.mod h1:MDwc+vsGEq7RMw6lr2GKOEqjWny5hO5OZXRVNaBJ2Dk= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.34.21 h1:M97FXuiJgDHwD4mXhrIZ7RJ4xXV6uZVPvIC2qb+HfYE= -github.com/aws/aws-sdk-go v1.34.21/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/benbjohnson/immutable v0.2.0/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/benbjohnson/immutable v0.3.0 h1:TVRhuZx2wG9SZ0LRdqlbs9S5BZ6Y24hJEHTCgWHZEIw= github.com/benbjohnson/immutable v0.3.0/go.mod h1:uc6OHo6PN2++n98KHLxW8ef4W42ylHiQSENghE1ezxI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blend/go-sdk v1.20210428.4 h1:WdLJ3Xk7qroFtuPhG4NFojp6dQ/rrH+tgufWuqFZAhQ= -github.com/blend/go-sdk v1.20210428.4/go.mod h1:e2rYe3SPuSiQLdcLy8LW4jA4UBXbHtoe2X8Orqw67FQ= -github.com/blend/sentry-go v1.0.0/go.mod h1:hgyX3WXen2YBiA0NitlfsXsvS+9ly2YlEBmmmYDgrWY= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bradfitz/iter v0.0.0-20140124041915-454541ec3da2/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo= github.com/bradfitz/iter v0.0.0-20190303215204-33e6a9893b0c/go.mod h1:PyRFw1Lt2wKX4ZVSQ2mk+PeDa1rxyObEDlApuIsUKuo= github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 h1:GKTyiRCL6zVf5wWaqKnf+7Qs6GbEPfd4iMOitWzXJx8= github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67NmW1aVLEgtA8Yy1elc+X8y5SRW1sFW4Og= -github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= -github.com/btcsuite/btcd v0.21.0-beta/go.mod h1:ZSWyehm27aAuS9bvkATT+Xte3hjHZ+MRgMY/8NJ7K94= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= +github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/btcutil v1.0.2/go.mod h1:j9HUFwoQRsZL3V4n+qG+CUnEGHOarIxfC3Le2Yhbcts= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ= +github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= @@ -226,52 +124,35 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2 h1:t8KYCwSKsOEZBFELI4Pn/phbp38iJ1RRAkDFNin1aak= github.com/c2h5oh/datasize v0.0.0-20200825124411-48ed595a09d2/go.mod h1:S/7n9copUssQ56c7aAgHqftWO4LTf4xY6CGWt8Bc+3M= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= -github.com/cloudflare/cloudflare-go v0.13.2 h1:bhMGoNhAg21DuqJjU9jQepRRft6vYfo6pejT3NN4V6A= -github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/consensys/bavard v0.1.8-0.20210105233146-c16790d2aa8b/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= -github.com/consensys/goff v0.3.10/go.mod h1:xTldOBEHmFiYS0gPXd3NsaEqZWlnmeWcRLWgD3ba3xc= -github.com/consensys/gurvy v0.3.8 h1:H2hvjvT2OFMgdMn5ZbhXqHt+F8DJ2clZW7Vmc0kFFxc= -github.com/consensys/gurvy v0.3.8/go.mod h1:sN75xnsiD593XnhbhvG2PkOy194pZBzqShWF/kwuW/g= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/consensys/bavard v0.1.8-0.20210329205436-c3e862ba4e5f/go.mod h1:Bpd0/3mZuaj6Sj+PqrmIquiOKy397AKGThQPaGzNXAQ= +github.com/consensys/gnark-crypto v0.4.0 h1:KHf7Ta876Ys6L8+i0DLRRKOAa3PfJ8oobAX1CEeIa4A= +github.com/consensys/gnark-crypto v0.4.0/go.mod h1:wK/gpXP9B06qTzTVML71GhKD1ygP9xOzukbI68NJqsQ= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -280,78 +161,56 @@ github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= -github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf h1:sh8rkQZavChcmakYiSlqu2425CHyFXLZZnvm7PDpU8M= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 h1:Izz0+t1Z5nI16/II7vuEo/nHjodOg0p7+OiDpjX5t1E= +github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498 h1:Y9vTBSsV4hSwPSj4bacAU/eSnV3dAxVpepaghAdhGoQ= -github.com/dop251/goja v0.0.0-20200721192441-a695b0cdd498/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48 h1:iZOop7pqsg+56twTopWgwCGxdB5SI2yDO8Ti7eTRliQ= +github.com/dop251/goja v0.0.0-20211011172007-d99e4b8cbf48/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20200318091601-be3528f3a813/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0 h1:CEBF7HpRnUCSJgGUb5h1Gm7e3VkmVDrR8lvWVLtrOFw= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elliotchance/orderedmap v1.2.0/go.mod h1:8hdSl6jmveQw8ScByd3AaNHNk51RhbTazdqtTty+NFw= -github.com/elliotchance/orderedmap v1.3.0 h1:k6m77/d0zCXTjsk12nX40TkEBkSICq8T4s6R6bpCqU0= -github.com/elliotchance/orderedmap v1.3.0/go.mod h1:8hdSl6jmveQw8ScByd3AaNHNk51RhbTazdqtTty+NFw= -github.com/emicklei/dot v0.11.0 h1:Ase39UD9T9fRBOb5ptgpixrxfx8abVzNWZi2+lr53PI= -github.com/emicklei/dot v0.11.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/dot v0.16.0 h1:7PseyizTgeQ/aSF1eo4LcEfWlQSlzamFZpzY/nMB9EY= +github.com/emicklei/dot v0.16.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fjl/gencodec v0.0.0-20191126094850-e283372f291f h1:Y/gg/utVetS+WS6htAKCTDralkm/8hLIIUAtLFdbdQ8= github.com/fjl/gencodec v0.0.0-20191126094850-e283372f291f/go.mod h1:q+7Z5oyy8cvKF3TakcuihvQvBHFTnXjB+7UP1e2Q+1o= -github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= +github.com/flanglet/kanzi-go v1.9.1-0.20211212184056-72dda96261ee h1:CaVlPeoz5kJQ+cAOV+ZDdlr3J2FmKyNkGu9LY+x7cDM= +github.com/flanglet/kanzi-go v1.9.1-0.20211212184056-72dda96261ee/go.mod h1:/sUSVgDcbjsisuW42GPDgaMqvJ0McZERNICnD7b1nRA= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.9.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= -github.com/glycerine/go-unsnap-stream v0.0.0-20210130063903-47dfef350d96/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/glycerine/goconvey v0.0.0-20190315024820-982ee783a72e/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= @@ -360,50 +219,36 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0 h1:TrB8swr/68K7m9CcGut2g3UOihhbcbiMAYiuTXdEih4= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-sourcemap/sourcemap v2.1.2+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/goccy/go-json v0.4.11 h1:92nyX606ZN/cUFwctfxwDWm8YWSA38Zlv9s7taFeLyo= -github.com/goccy/go-json v0.4.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM= +github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -417,10 +262,8 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -430,37 +273,19 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190309154008-847fc94819f9/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -470,28 +295,15 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosuri/uilive v0.0.0-20170323041506-ac356e6e42cd/go.mod h1:qkLSc0A5EXSP6B04TrN4oQoxqFI7A8XvoXSlJi8cwk8= -github.com/gosuri/uilive v0.0.3/go.mod h1:qkLSc0A5EXSP6B04TrN4oQoxqFI7A8XvoXSlJi8cwk8= -github.com/gosuri/uiprogress v0.0.0-20170224063937-d0567a9d84a1/go.mod h1:C1RTYn4Sc7iEyf6j8ft5dyoZ4212h8G1ol9QQluh5+0= -github.com/gosuri/uiprogress v0.0.1/go.mod h1:C1RTYn4Sc7iEyf6j8ft5dyoZ4212h8G1ol9QQluh5+0= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -507,202 +319,98 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09 github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/holiman/uint256 v1.2.0 h1:gpSYcPLWGv4sG43I2mVLiDZCNDh/EpGjSk8tmtxitHM= github.com/holiman/uint256 v1.2.0/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.2.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= -github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda h1:Vofqyy/Ysqit++X33unU0Gr08b6P35hKm3juytDrBVI= -github.com/huin/goupnp v1.0.1-0.20210626160114-33cdcbb30dda/go.mod h1:0dxJBVBHqTMjIUMkESDTNgOOx/Mw5wYIfyFmdzSamkM= +github.com/huin/goupnp v1.0.3 h1:N8No57ls+MnjlB+JPiCVSOyy/ot7MJTqlo7rn+NYSqQ= +github.com/huin/goupnp v1.0.3/go.mod h1:ZxNlw5WqJj6wSsRK5+YfflQGXYfccj5VgQsMNixHM7Y= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.2.0/go.mod h1:5m2OfMh1wTK7x+Fk952IDmI4nw3nPrvtQdM0ZT4WpC0= -github.com/jackc/pgtype v1.3.1-0.20200510190516-8cd94a14c75a/go.mod h1:vaogEUkALtxZMCH411K+tKzNpwzCKU+AnPzBKZ+I+Po= -github.com/jackc/pgtype v1.3.1-0.20200606141011-f6355165a91c/go.mod h1:cvk9Bgu/VzJ9/lxTO5R5sf80p0DiucVtN7ZxvaC4GmQ= -github.com/jackc/pgtype v1.6.2/go.mod h1:JCULISAZBFGrHaOXIIFiyfzW5VY0GRitRr8NeJsrdig= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.5.0/go.mod h1:EpAKPLdnTorwmPUUsqrPxy5fphV18j9q3wrfRXgo+kA= -github.com/jackc/pgx/v4 v4.6.1-0.20200510190926-94ba730bb1e9/go.mod h1:t3/cdRQl6fOLDxqtlyhe9UWgfIi9R8+8v8GKV5TRA/o= -github.com/jackc/pgx/v4 v4.6.1-0.20200606145419-4e5062306904/go.mod h1:ZDaNWkt9sW1JMiNn0kdYBaLelIhw7Pg4qd+Vk6tw7Hg= -github.com/jackc/pgx/v4 v4.10.0/go.mod h1:QlrWebbs3kqEZPHCTGyxecvzG6tvIsYu+A5b1raylkA= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/go-bindata v3.21.0+incompatible h1:baK7hwFJDlAHrOqmE9U3u8tow1Uc5ihN9E/b7djcK2g= github.com/kevinburke/go-bindata v3.21.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= -github.com/kilic/bls12-381 v0.0.0-20201226121925-69dacb279461/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758 h1:0D5M2HQSGD3PYPwICLl+/9oulQauOuETfgFvhBDffs0= github.com/kylelemons/godebug v0.0.0-20170224010052-a616ab194758/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/leanovate/gopter v0.2.8/go.mod h1:gNcbPWNEWRe4lm+bycKqxUYoH5uoVje5SkOJ3uoLer8= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/ledgerwatch/erigon-lib v0.0.0-20210730030258-1f46e8166b35 h1:rdgmC6OA/iFrSfdu4ZJEpgCAwsWCCtagwVGQKNu6qSY= -github.com/ledgerwatch/erigon-lib v0.0.0-20210730030258-1f46e8166b35/go.mod h1:WcCPcXxQzQJxEuN8l1+pqGYR59l7FWvmctEV2UOOc28= -github.com/ledgerwatch/log/v3 v3.1.2/go.mod h1:J58eOHHrIYHxl7LKkRsb/0YibKwtLfauUryl5SLRGm0= -github.com/ledgerwatch/log/v3 v3.2.0 h1:g0lVx5/hDQs+t+l7xzLTXDDlx+7W2JeTcoWQJQXhXJk= -github.com/ledgerwatch/log/v3 v3.2.0/go.mod h1:J58eOHHrIYHxl7LKkRsb/0YibKwtLfauUryl5SLRGm0= -github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d h1:/IKMrJdfRsoYNc36PXqP4xMH3vhW/8IQyBKGQbKZUno= -github.com/ledgerwatch/secp256k1 v0.0.0-20210626115225-cd5cd00ed72d/go.mod h1:SPmqJFciiF/Q0mPt2jVs2dTr/1TZBTIA+kPMmKgBAak= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/ledgerwatch/erigon-lib v0.0.0-20220605213234-a77e6425eb24 h1:Ny8a+KpK6oOVLQTbGFnIppYmXgx6wDpHUz/8/3sKfK0= +github.com/ledgerwatch/erigon-lib v0.0.0-20220605213234-a77e6425eb24/go.mod h1:jNDE6PRPIA8wUdikJs8BvKtrFv101qOijIXA3HnDW8E= +github.com/ledgerwatch/log/v3 v3.4.1 h1:/xGwlVulXnsO9Uq+tzaExc8OWmXXHU0dnLalpbnY5Bc= +github.com/ledgerwatch/log/v3 v3.4.1/go.mod h1:VXcz6Ssn6XEeU92dCMc39/g1F0OYAjw1Mt+dGP5DjXY= +github.com/ledgerwatch/secp256k1 v1.0.0 h1:Usvz87YoTG0uePIV8woOof5cQnLXGYa162rFf3YnwaQ= +github.com/ledgerwatch/secp256k1 v1.0.0/go.mod h1:SPmqJFciiF/Q0mPt2jVs2dTr/1TZBTIA+kPMmKgBAak= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/lucas-clemente/quic-go v0.7.1-0.20190401152353-907071221cf9/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.18.0/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= -github.com/lucas-clemente/quic-go v0.19.3 h1:eCDQqvGBB+kCTkA0XrAFtNe81FMa0/fn4QSoeAbmiF4= -github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lukechampine/stm v0.0.0-20191022212748-05486c32d236/go.mod h1:wTLsd5FC9rts7GkMpsPGk64CIuea+03yaLAp19Jmlg8= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lispad/go-generics-tools v1.0.0 h1:pPtt9QERE5sGQfwvLakKe2sjhcNKKsDSnr3939ofj1E= +github.com/lispad/go-generics-tools v1.0.0/go.mod h1:stn7X24ZIyFvaSyttafq3VlJzGJJJkUtLYdbgi/gopM= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= -github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= -github.com/marten-seemann/qtls-go1-15 v0.1.0/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.1 h1:LIH6K34bPVttyXnUWixk0bzH6/N07VxbSabxn5A5gZQ= -github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/matryer/moq v0.2.3/go.mod h1:9RtPYjTnH1bSBIkpvtHkFN7nbWAnO7oRpdJkEIn6UtE= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.7.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.13.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v2.0.2+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mattn/go-sqlite3 v1.14.12 h1:TJ1bhYJPV44phC+IMu1u2K/i5RriLTPe+yc68XDJ1Z0= +github.com/mattn/go-sqlite3 v1.14.12/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mediocregopher/radix/v4 v4.0.0-beta.1/go.mod h1:Z74pilm773ghbGV4EEoPvi6XWgkAfr0VCNkfa8gI1PU= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -712,15 +420,13 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM= github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -728,105 +434,87 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.9-0.20211216163028-4472660a31a6 h1:iZ5rEHU561k2tdi/atkIsrP5/3AX3BjyhYtC96nJ260= +github.com/nxadm/tail v1.4.9-0.20211216163028-4472660a31a6/go.mod h1:A+9rV4WFp4DKg1Ym1v6YtCrJ2vvlt1ZA/iml0CNuu2A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.1 h1:8e3L2cCQzLFi2CR4g7vGFuFxX7Jl1kKX8gW+iV0GUKU= +github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99 h1:KcEvVBAvyHkUdFAygKAzwB6LAcZ6LS32WHmRD2VyXMI= -github.com/petar/GoLLRB v0.0.0-20190514000832-33fb24c13b99/go.mod h1:HUpKUBZnpzkdx0kD/+Yfuft+uD3zHGtXF/XJB14TUr4= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pion/datachannel v1.4.21 h1:3ZvhNyfmxsAqltQrApLPQMhSFNA+aT87RqyCq4OXmf0= -github.com/pion/datachannel v1.4.21/go.mod h1:oiNyP4gHx2DIwRzX/MFyH0Rz/Gz05OgBlayAI2hAWjg= -github.com/pion/dtls/v2 v2.0.1/go.mod h1:uMQkz2W0cSqY00xav7WByQ4Hb+18xeQh2oH2fRezr5U= -github.com/pion/dtls/v2 v2.0.2/go.mod h1:27PEO3MDdaCfo21heT59/vsdmZc0zMt9wQPcSlLu/1I= -github.com/pion/dtls/v2 v2.0.4 h1:WuUcqi6oYMu/noNTz92QrF1DaFj4eXbhQ6dzaaAwOiI= -github.com/pion/dtls/v2 v2.0.4/go.mod h1:qAkFscX0ZHoI1E07RfYPoRw3manThveu+mlTDdOxoGI= -github.com/pion/ice v0.7.18 h1:KbAWlzWRUdX9SmehBh3gYpIFsirjhSQsCw6K2MjYMK0= -github.com/pion/ice v0.7.18/go.mod h1:+Bvnm3nYC6Nnp7VV6glUkuOfToB/AtMRZpOU8ihuf4c= +github.com/pion/datachannel v1.5.2 h1:piB93s8LGmbECrpO84DnkIVWasRMk3IimbcXkTQLE6E= +github.com/pion/datachannel v1.5.2/go.mod h1:FTGQWaHrdCwIJ1rw6xBIfZVkslikjShim5yr05XFuCQ= +github.com/pion/dtls/v2 v2.1.1/go.mod h1:qG3gA7ZPZemBqpEFqRKyURYdKEwFZQCGb7gv9T3ON3Y= +github.com/pion/dtls/v2 v2.1.2 h1:22Q1Jk9L++Yo7BIf9130MonNPfPVb+YgdYLeyQotuAA= +github.com/pion/dtls/v2 v2.1.2/go.mod h1:o6+WvyLDAlXF7YiPB/RlskRoeK+/JtuaZa5emwQcWus= +github.com/pion/ice/v2 v2.1.20 h1:xpxXyX5b4WjCh/D905gzBeW/hbJxMEPx2ptVfrhVE6M= +github.com/pion/ice/v2 v2.1.20/go.mod h1:hEAldRzBhTtAfvlU1V/2/nLCMvveQWFKPNCop+63/Iw= +github.com/pion/interceptor v0.1.7 h1:HThW0tIIKT9RRoDWGURe8rlZVOx0fJHxBHpA0ej0+bo= +github.com/pion/interceptor v0.1.7/go.mod h1:Lh3JSl/cbJ2wP8I3ccrjh1K/deRGRn3UlSPuOTiHb6U= github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/mdns v0.0.4 h1:O4vvVqr4DGX63vzmO6Fw9vpy3lfztVWHGCQfyw0ZLSY= -github.com/pion/mdns v0.0.4/go.mod h1:R1sL0p50l42S5lJs91oNdUL58nm0QHrhxnSegr++qC0= -github.com/pion/quic v0.1.1/go.mod h1:zEU51v7ru8Mp4AUBJvj6psrSth5eEFNnVQK5K48oV3k= -github.com/pion/quic v0.1.4 h1:bNz9sCJjlM3GqMdq7Fne57FiWfdyiJ++yHVbuqeoD3Y= -github.com/pion/quic v0.1.4/go.mod h1:dBhNvkLoQqRwfi6h3Vqj3IcPLgiW7rkZxBbRdp7Vzvk= -github.com/pion/randutil v0.0.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= +github.com/pion/mdns v0.0.5 h1:Q2oj/JB3NqfzY9xGZ1fPzZzK7sDSD8rZPOvcIQ10BCw= +github.com/pion/mdns v0.0.5/go.mod h1:UgssrvdD3mxpi8tMxAXbsppL3vJ4Jipw1mTCW+al01g= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.3/go.mod h1:zGhIv0RPRF0Z1Wiij22pUt5W/c9fevqSzT4jje/oK7I= -github.com/pion/rtcp v1.2.4/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0= -github.com/pion/rtcp v1.2.6 h1:1zvwBbyd0TeEuuWftrd/4d++m+/kZSeiguxU61LFWpo= github.com/pion/rtcp v1.2.6/go.mod h1:52rMNPWFsjr39z9B9MhnkqhPLoeHTv1aN63o/42bWE0= -github.com/pion/rtp v1.6.0/go.mod h1:QgfogHsMBVE/RFNno467U/KBqfUywEH+HK+0rtnwsdI= -github.com/pion/rtp v1.6.1/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= -github.com/pion/rtp v1.6.2 h1:iGBerLX6JiDjB9NXuaPzHyxHFG9JsIEdgwTC0lp5n/U= -github.com/pion/rtp v1.6.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= -github.com/pion/sctp v1.7.10/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0= -github.com/pion/sctp v1.7.11 h1:UCnj7MsobLKLuP/Hh+JMiI/6W5Bs/VF45lWKgHFjSIE= -github.com/pion/sctp v1.7.11/go.mod h1:EhpTUQu1/lcK3xI+eriS6/96fWetHGCvBi9MSsnaBN0= -github.com/pion/sdp/v2 v2.4.0 h1:luUtaETR5x2KNNpvEMv/r4Y+/kzImzbz4Lm1z8eQNQI= -github.com/pion/sdp/v2 v2.4.0/go.mod h1:L2LxrOpSTJbAns244vfPChbciR/ReU1KWfG04OpkR7E= -github.com/pion/srtp v1.5.1/go.mod h1:B+QgX5xPeQTNc1CJStJPHzOlHK66ViMDWTT0HZTCkcA= -github.com/pion/srtp v1.5.2 h1:25DmvH+fqKZDqvX64vTwnycVwL9ooJxHF/gkX16bDBY= -github.com/pion/srtp v1.5.2/go.mod h1:NiBff/MSxUwMUwx/fRNyD/xGE+dVvf8BOCeXhjCXZ9U= +github.com/pion/rtcp v1.2.9 h1:1ujStwg++IOLIEoOiIQ2s+qBuJ1VN81KW+9pMPsif+U= +github.com/pion/rtcp v1.2.9/go.mod h1:qVPhiCzAm4D/rxb6XzKeyZiQK69yJpbUDJSF7TgrqNo= +github.com/pion/rtp v1.7.0/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= +github.com/pion/rtp v1.7.4 h1:4dMbjb1SuynU5OpA3kz1zHK+u+eOCQjW3MAeVHf1ODA= +github.com/pion/rtp v1.7.4/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= +github.com/pion/sctp v1.8.0/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= +github.com/pion/sctp v1.8.2 h1:yBBCIrUMJ4yFICL3RIvR4eh/H2BTTvlligmSTy+3kiA= +github.com/pion/sctp v1.8.2/go.mod h1:xFe9cLMZ5Vj6eOzpyiKjT9SwGM4KpK/8Jbw5//jc+0s= +github.com/pion/sdp/v3 v3.0.4 h1:2Kf+dgrzJflNCSw3TV5v2VLeI0s/qkzy2r5jlR0wzf8= +github.com/pion/sdp/v3 v3.0.4/go.mod h1:bNiSknmJE0HYBprTHXKPQ3+JjacTv5uap92ueJZKsRk= +github.com/pion/srtp/v2 v2.0.5 h1:ks3wcTvIUE/GHndO3FAvROQ9opy0uLELpwHJaQ1yqhQ= +github.com/pion/srtp/v2 v2.0.5/go.mod h1:8k6AJlal740mrZ6WYxc4Dg6qDqqhxoRG2GSjlUhDF0A= github.com/pion/stun v0.3.5 h1:uLUCBCkQby4S1cf6CGuR9QrVOKcvUwFeemaC865QHDg= github.com/pion/stun v0.3.5/go.mod h1:gDMim+47EeEtfWogA37n6qXZS88L5V6LqFcf+DZA2UA= -github.com/pion/transport v0.6.0/go.mod h1:iWZ07doqOosSLMhZ+FXUTq+TamDoXSllxpbGcfkCmbE= -github.com/pion/transport v0.8.10/go.mod h1:tBmha/UCjpum5hqTWhfAEs3CO4/tHSg0MYRhSzR+CZ8= -github.com/pion/transport v0.10.0/go.mod h1:BnHnUipd0rZQyTVB2SBGojFHT9CBt5C5TcsJSQGkvSE= -github.com/pion/transport v0.10.1/go.mod h1:PBis1stIILMiis0PewDw91WJeLJkyIMcEk+DwKOzf4A= -github.com/pion/transport v0.12.2 h1:WYEjhloRHt1R86LhUKjC5y+P52Y11/QqEUalvtzVoys= github.com/pion/transport v0.12.2/go.mod h1:N3+vZQD9HlDP5GWkZ85LohxNsDcNgofQmyL6ojX5d8Q= -github.com/pion/turn/v2 v2.0.4/go.mod h1:1812p4DcGVbYVBTiraUmP50XoKye++AMkbfp+N27mog= -github.com/pion/turn/v2 v2.0.5 h1:iwMHqDfPEDEOFzwWKT56eFmh6DYC6o/+xnLAEzgISbA= -github.com/pion/turn/v2 v2.0.5/go.mod h1:APg43CFyt/14Uy7heYUOGWdkem/Wu4PhCO/bjyrTqMw= -github.com/pion/udp v0.1.0 h1:uGxQsNyrqG3GLINv36Ff60covYmfrLoxzwnCsIYspXI= -github.com/pion/udp v0.1.0/go.mod h1:BPELIjbwE9PRbd/zxI/KYBnbo7B6+oA6YuEaNE8lths= -github.com/pion/webrtc/v2 v2.2.26 h1:01hWE26pL3LgqfxvQ1fr6O4ZtyRFFJmQEZK39pHWfFc= -github.com/pion/webrtc/v2 v2.2.26/go.mod h1:XMZbZRNHyPDe1gzTIHFcQu02283YO45CbiwFgKvXnmc= +github.com/pion/transport v0.12.3/go.mod h1:OViWW9SP2peE/HbwBvARicmAVnesphkNkCVZIWJ6q9A= +github.com/pion/transport v0.13.0 h1:KWTA5ZrQogizzYwPEciGtHPLwpAjE91FgXnyu+Hv2uY= +github.com/pion/transport v0.13.0/go.mod h1:yxm9uXpK9bpBBWkITk13cLo1y5/ur5VQpG22ny6EP7g= +github.com/pion/turn/v2 v2.0.6 h1:AsXjSPR6Im15DMTB39NlfdTY9BQfieANPBjdg/aVNwY= +github.com/pion/turn/v2 v2.0.6/go.mod h1:+y7xl719J8bAEVpSXBXvTxStjJv3hbz9YFflvkpcGPw= +github.com/pion/udp v0.1.1 h1:8UAPvyqmsxK8oOjloDk4wUt63TzFe9WEJkg5lChlj7o= +github.com/pion/udp v0.1.1/go.mod h1:6AFo+CMdKQm7UiA0eUPA8/eVCTx8jBIITLZHc9DWX5M= +github.com/pion/webrtc/v3 v3.1.24-0.20220208053747-94262c1b2b38 h1:+IEql+S+YAj3S5e7Ftl/u4xPcZGG0WwLFsyFj6NRTz4= +github.com/pion/webrtc/v3 v3.1.24-0.20220208053747-94262c1b2b38/go.mod h1:L5S/oAhL0Fzt/rnftVQRrP80/j5jygY7XRZzWwFx6P4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -835,110 +523,53 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= -github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/quasilyte/go-ruleguard/dsl v0.3.6 h1:W2wnISJifyda0x/RXq15Qjrsu9iOhX2gy4+Ku+owylw= -github.com/quasilyte/go-ruleguard/dsl v0.3.6/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/go-ruleguard/dsl v0.3.21 h1:vNkC6fC6qMLzCOGbnIHOd5ixUGgTbp3Z4fGnUgULlDA= +github.com/quasilyte/go-ruleguard/dsl v0.3.21/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= -github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= -github.com/rs/dnscache v0.0.0-20190621150935-06bb5526f76b/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= +github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/dnscache v0.0.0-20210201191234-295bba877686 h1:IJ6Df0uxPDtNoByV0KkzVKNseWvZFCNM/S9UoyOMCSI= github.com/rs/dnscache v0.0.0-20210201191234-295bba877686/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46 h1:GHRpF1pTW19a8tTFrMLUcfWwyC0pnifVo2ClaLq+hP8= github.com/ryszard/goskiplist v0.0.0-20150312221310-2dfbae5fcf46/go.mod h1:uAQ5PCi+MFsC7HjREoAz1BU+Mq60+05gifQSsHSDG/8= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v2.20.5+incompatible h1:tYH07UPoQt0OCQdgWWMgYHy3/a9bcxNpBIysykNIP7I= -github.com/shirou/gopsutil v2.20.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/gopsutil/v3 v3.21.6 h1:vU7jrp1Ic/2sHB7w6UNs7MIkn7ebVtTb5D9j45o9VYE= -github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+LwHTKj0ST88= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v0.0.0-20190215210624-980c5ac6f3ac/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= @@ -946,203 +577,120 @@ github.com/smartystreets/goconvey v0.0.0-20190306220146-200a235640ff/go.mod h1:K github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syncthing/syncthing v0.14.48-rc.4/go.mod h1:nw3siZwHPA6M8iSfjDCWQ402eqvEIasMQOE8nFOxy7M= -github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tilinna/clock v1.0.2/go.mod h1:ZsP7BcY7sEEz7ktc0IVy8Us6boDrK8VradlKRUGfOao= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tendermint/go-amino v0.14.1 h1:o2WudxNfdLNBwMyl2dqOJxiro5rfrEaU0Ugs6offJMk= +github.com/tendermint/go-amino v0.14.1/go.mod h1:i/UKE5Uocn+argJJBb12qTZsCDBcAYMbR92AaJVmKso= +github.com/tendermint/tendermint v0.31.11 h1:TIs//4WfEAG4TOZc2eUfJPI3T8KrywXQCCPnGAaM1Wo= +github.com/tendermint/tendermint v0.31.11/go.mod h1:ymcPyWblXCplCPQjbOYbrF1fWnpslATMVqiGgWbZrlc= +github.com/tidwall/btree v0.7.2-0.20211211132910-4215444137fc h1:THtJVe/QBctKEe8kjnXwt7RAlvHNtUjFJOEmgZkN05w= +github.com/tidwall/btree v0.7.2-0.20211211132910-4215444137fc/go.mod h1:LGm8L/DZjPLmeWGjv5kFrY8dL4uVhMmzmmLYmsObdKE= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.1/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= -github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= -github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4= -github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= -github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= -github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/torquem-ch/mdbx-go v0.17.0 h1:X8le6dDqWkkJf/T3H2H+Y/kmsmhBD72ds0fP3vchJgg= -github.com/torquem-ch/mdbx-go v0.17.0/go.mod h1:T2fsoJDVppxfAPTLd1svUgH1kpPmeXdPESmroSHcL1E= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.1.13 h1:nB3O5kBSQGjEQAcfe1aLUYuxmXdFKmYgBZhY32rQb6Q= +github.com/torquem-ch/mdbx-go v0.24.2 h1:FS1feDGgt1fmhiDXkaqOyOSWMt8X+d2wVvOTuc37PtI= +github.com/torquem-ch/mdbx-go v0.24.2/go.mod h1:T2fsoJDVppxfAPTLd1svUgH1kpPmeXdPESmroSHcL1E= github.com/ugorji/go v1.1.13/go.mod h1:jxau1n+/wyTGLQoCkjok9r5zFa/FxT6eI5HiHKQszjc= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.1.13 h1:013LbFhocBoIqgHeIHKlV4JWYhqogATYWZhIcH0WHn4= github.com/ugorji/go/codec v1.1.13/go.mod h1:oNVt3Dq+FO91WNQ/9JnHKQP2QJxTzoN7wCBFCq1OeuU= github.com/ugorji/go/codec/codecgen v1.1.13 h1:rGpZ4Q63VcWA3DMBbIHvg+SQweUkfXBBa/f9X0W+tFg= github.com/ugorji/go/codec/codecgen v1.1.13/go.mod h1:EhCxlc7Crov+HLygD4+hBCitXNrrGKRrRWj+pRsyJGg= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= -github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.8 h1:9ic0a+f2TCJ5tSbVRX/FSSCIHJacFLYxcuNexNMJF8Q= +github.com/urfave/cli v1.22.8/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/fastjson v1.6.3 h1:tAKFnnwmeMGPbwJ7IwxcTPCNr3uIzoIj3/Fh90ra4xc= github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= -github.com/valyala/fastrand v1.0.0 h1:LUKT9aKer2dVQNUi3waewTbKV+7H17kvWFNKs2ObdkI= -github.com/valyala/fastrand v1.0.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ= -github.com/valyala/histogram v1.1.2 h1:vOk5VrGjMBIoPR5k6wA8vBaC8toeJ8XO0yfRjFEc1h8= -github.com/valyala/histogram v1.1.2/go.mod h1:CZAr6gK9dbD7hYx2s8WSPh0p5x5wETjC+2b3PJVtEdg= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/wcharczuk/go-chart v2.0.1+incompatible h1:0pz39ZAycJFF7ju/1mepnk26RLVLBCWz1STcD3doU0A= -github.com/wcharczuk/go-chart v2.0.1+incompatible/go.mod h1:PF5tmL4EIx/7Wf+hEkpCqYi5He4u90sw+0+6FhrryuE= -github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8= +github.com/valyala/fastrand v1.1.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ= +github.com/valyala/histogram v1.2.0 h1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ= +github.com/valyala/histogram v1.2.0/go.mod h1:Hb4kBwb4UxsaNbbbh+RRz8ZR6pdodR57tzWUS3BUzXY= +github.com/wcharczuk/go-chart/v2 v2.1.0 h1:tY2slqVQ6bN+yHSnDYwZebLQFkphK4WNrVwnt7CJZ2I= +github.com/wcharczuk/go-chart/v2 v2.1.0/go.mod h1:yx7MvAVNcP/kN9lKXM/NTce4au4DFN99j6i1OwDclNA= github.com/willf/bitset v1.1.9/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.10/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/willf/bloom v0.0.0-20170505221640-54e3b963ee16/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= -github.com/willf/bloom v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX8Wdm2/JPA= -github.com/willf/bloom v2.0.3+incompatible/go.mod h1:MmAltL9pDMNTrvUkxdg0k0q5I0suxmuwp3KbyrZLOZ8= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/xsleonard/go-merkle v1.1.0 h1:fHe1fuhJjGH22ZzVTAH0jqHLhTGhOq3wQjJN+8P0jQg= +github.com/xsleonard/go-merkle v1.1.0/go.mod h1:cW4z+UZ/4f2n9IJgIiyDCdYguchoDyDAPmpuOWGxdGg= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e h1:gsTQYXdTw2Gq7RBsWvlQ91b+aEQ6bXFUngBGuR8sPpI= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122 h1:NvGWuYG8dkDHFSKksI1P9faiVJ9rayE6l0+ouWVIDs8= +golang.org/x/crypto v0.0.0-20220507011949-2cf3adece122/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171 h1:TfdoLivD44QwvssI9Sv1xwa5DcL5XQr4au4sZ2F2NV4= +golang.org/x/exp v0.0.0-20220428152302-39d4317da171/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5 h1:QelT11PB4FXiDEXucrfNckHoFxwt8USGY1ajP1ZF5lM= +golang.org/x/image v0.0.0-20200927104501-e162460cd6b5/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20200801112145-973feb4309de/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20180524181706-dfa909b99c79/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1150,63 +698,35 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190318221613-d196dffd7c2b/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191125084936-ffdde1057850/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201201195509-5d6afe98e0b7/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211201190559-0a0e4e1bb54c/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20201203001011-0b49973bad19/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1214,247 +734,110 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190910064555-bbd175535a8b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191126131656-8a8471f7e56d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200824131525-c12d262b63d8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210105210732-16f7687f5001/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210326220804-49726bf1d181/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211030160813-b3129d9d1021/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220405052023-b1e9470b6e64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220411224347-583f2d630306 h1:+gHMid33q6pen7kv9xvT+JRinntgeXO2AeZVd0AWD3w= +golang.org/x/time v0.0.0-20220411224347-583f2d630306/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191126055441-b0650ceb63d9/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200815165600-90abf76919f3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200928182047-19e03678916f/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201204162204-73cf035baebf/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.1.10 h1:QjFRCZxdOhBJ/UNgnBZLbNV13DlbnK0quyivTnXJM20= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ= +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1467,30 +850,22 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/DataDog/dd-trace-go.v1 v1.27.1/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 h1:a6cXbcDDUkSBlpnkWV1bJ+vv3mOgQEltEJ2rPxroVu0= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1498,32 +873,51 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -pgregory.net/rapid v0.4.6 h1:0z4eYXX8FaxgeFLAaPce6zMAiQYKLMN9dqKzZgtpv4w= -pgregory.net/rapid v0.4.6/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +lukechampine.com/uint128 v1.1.1 h1:pnxCASz787iMf+02ssImqk6OLt+Z5QHMoZyUXR4z6JU= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0 h1:0kmRkTmqNidmu3c7BNDSdVHCxXCkWLmWmCIVX4LUboo= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6 h1:3l18poV+iUemQ98O3X5OMr97LOqlzis+ytivU4NqGhA= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.7 h1:qzQtHhsZNpVPpeCu+aMIQldXeV1P0vRhSqCL0nOIJOA= +modernc.org/libc v1.16.7/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1 h1:bDOL0DIDLQv7bWhP3gMvIrnoFw+Eo6F7a2QK9HPDiFU= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.17.3 h1:iE+coC5g17LtByDYDWKpR6m2Z9022YrSh3bumwOnIrI= +modernc.org/sqlite v1.17.3/go.mod h1:10hPVYar9C0kfXuTWGz8s0XtB8uAGymUy51ZzStYe3k= +modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/tcl v1.13.1 h1:npxzTwFTZYM8ghWicVIX1cRWzj7Nd8i6AqqX2p+IYao= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0 h1:a0jaWiNMDhDUtqOj09wvjWWAqd3q7WpBulmL9H2egsk= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1 h1:RTNHdsrOpeoSeOF4FbzTo8gBYByaJ5xT7NgZ9ZqRiJM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= diff --git a/hooks/build b/hooks/build new file mode 100755 index 00000000000..b5a49356f13 --- /dev/null +++ b/hooks/build @@ -0,0 +1,8 @@ +#!/bin/bash + +# This is needed to pass build ARGs to Dockerfile. +# see https://docs.docker.com/docker-hub/builds/advanced/ + +DOCKER_FLAGS="-t $IMAGE_NAME" \ +GIT_TAG=$(git describe --tags '--match=v*' --dirty) \ + make docker diff --git a/hooks/post_checkout b/hooks/post_checkout old mode 100644 new mode 100755 index 1c6f495cf05..3c6f0f2df9f --- a/hooks/post_checkout +++ b/hooks/post_checkout @@ -1,4 +1,6 @@ #!/bin/bash # Docker hub does a recursive clone, then checks the branch out, # so when a PR adds a submodule (or updates it), it fails. -git submodule update --init +git submodule update --init --recursive + +git fetch --tags diff --git a/interfaces.go b/interfaces.go index fcc74c33404..4b96275bcd3 100644 --- a/interfaces.go +++ b/interfaces.go @@ -23,7 +23,6 @@ import ( "math/big" "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/types" ) diff --git a/internal/build/archive.go b/internal/build/archive.go deleted file mode 100644 index 8b3ac23d1d8..00000000000 --- a/internal/build/archive.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package build - -import ( - "archive/tar" - "archive/zip" - "compress/gzip" - "fmt" - "io" - "os" - "path/filepath" - "strings" -) - -type Archive interface { - // Directory adds a new directory entry to the archive and sets the - // directory for subsequent calls to Header. - Directory(name string) error - - // Header adds a new file to the archive. The file is added to the directory - // set by Directory. The content of the file must be written to the returned - // writer. - Header(os.FileInfo) (io.Writer, error) - - // Close flushes the archive and closes the underlying file. - Close() error -} - -func NewArchive(file *os.File) (Archive, string) { - switch { - case strings.HasSuffix(file.Name(), ".zip"): - return NewZipArchive(file), strings.TrimSuffix(file.Name(), ".zip") - case strings.HasSuffix(file.Name(), ".tar.gz"): - return NewTarballArchive(file), strings.TrimSuffix(file.Name(), ".tar.gz") - default: - return nil, "" - } -} - -// AddFile appends an existing file to an archive. -func AddFile(a Archive, file string) error { - fd, err := os.Open(file) - if err != nil { - return err - } - defer fd.Close() - fi, err := fd.Stat() - if err != nil { - return err - } - w, err := a.Header(fi) - if err != nil { - return err - } - if _, err := io.Copy(w, fd); err != nil { - return err - } - return nil -} - -// WriteArchive creates an archive containing the given files. -func WriteArchive(name string, files []string) (err error) { - archfd, err := os.Create(name) - if err != nil { - return err - } - - defer func() { - archfd.Close() - // Remove the half-written archive on failure. - if err != nil { - os.Remove(name) - } - }() - archive, basename := NewArchive(archfd) - if archive == nil { - return fmt.Errorf("unknown archive extension") - } - fmt.Println(name) - if err := archive.Directory(basename); err != nil { - return err - } - for _, file := range files { - fmt.Println(" +", filepath.Base(file)) - if err := AddFile(archive, file); err != nil { - return err - } - } - return archive.Close() -} - -type ZipArchive struct { - dir string - zipw *zip.Writer - file io.Closer -} - -func NewZipArchive(w io.WriteCloser) Archive { - return &ZipArchive{"", zip.NewWriter(w), w} -} - -func (a *ZipArchive) Directory(name string) error { - a.dir = name + "/" - return nil -} - -func (a *ZipArchive) Header(fi os.FileInfo) (io.Writer, error) { - head, err := zip.FileInfoHeader(fi) - if err != nil { - return nil, fmt.Errorf("can't make zip header: %v", err) - } - head.Name = a.dir + head.Name - head.Method = zip.Deflate - w, err := a.zipw.CreateHeader(head) - if err != nil { - return nil, fmt.Errorf("can't add zip header: %v", err) - } - return w, nil -} - -func (a *ZipArchive) Close() error { - if err := a.zipw.Close(); err != nil { - return err - } - return a.file.Close() -} - -type TarballArchive struct { - dir string - tarw *tar.Writer - gzw *gzip.Writer - file io.Closer -} - -func NewTarballArchive(w io.WriteCloser) Archive { - gzw := gzip.NewWriter(w) - tarw := tar.NewWriter(gzw) - return &TarballArchive{"", tarw, gzw, w} -} - -func (a *TarballArchive) Directory(name string) error { - a.dir = name + "/" - return a.tarw.WriteHeader(&tar.Header{ - Name: a.dir, - Mode: 0755, - Typeflag: tar.TypeDir, - }) -} - -func (a *TarballArchive) Header(fi os.FileInfo) (io.Writer, error) { - head, err := tar.FileInfoHeader(fi, "") - if err != nil { - return nil, fmt.Errorf("can't make tar header: %v", err) - } - head.Name = a.dir + head.Name - if err := a.tarw.WriteHeader(head); err != nil { - return nil, fmt.Errorf("can't add tar header: %v", err) - } - return a.tarw, nil -} - -func (a *TarballArchive) Close() error { - if err := a.tarw.Close(); err != nil { - return err - } - if err := a.gzw.Close(); err != nil { - return err - } - return a.file.Close() -} - -// ExtractArchive unpacks a .zip or .tar.gz archive to the destination directory. -func ExtractArchive(archive string, dest string) error { - ar, err := os.Open(archive) - if err != nil { - return err - } - defer ar.Close() - - switch { - case strings.HasSuffix(archive, ".tar.gz"): - return extractTarball(ar, dest) - case strings.HasSuffix(archive, ".zip"): - return extractZip(ar, dest) - default: - return fmt.Errorf("unhandled archive type %s", archive) - } -} - -// extractTarball unpacks a .tar.gz file. -func extractTarball(ar io.Reader, dest string) error { - gzr, err := gzip.NewReader(ar) - if err != nil { - return err - } - defer gzr.Close() - - tr := tar.NewReader(gzr) - for { - // Move to the next file header. - header, err := tr.Next() - if err != nil { - if err == io.EOF { - return nil - } - return err - } - // We only care about regular files, directory modes - // and special file types are not supported. - if header.Typeflag == tar.TypeReg { - armode := header.FileInfo().Mode() - err := extractFile(header.Name, armode, tr, dest) - if err != nil { - return fmt.Errorf("extract %s: %v", header.Name, err) - } - } - } -} - -// extractZip unpacks the given .zip file. -func extractZip(ar *os.File, dest string) error { - info, err := ar.Stat() - if err != nil { - return err - } - zr, err := zip.NewReader(ar, info.Size()) - if err != nil { - return err - } - - for _, zf := range zr.File { - if !zf.Mode().IsRegular() { - continue - } - - data, err := zf.Open() - if err != nil { - return err - } - err = extractFile(zf.Name, zf.Mode(), data, dest) - data.Close() - if err != nil { - return fmt.Errorf("extract %s: %v", zf.Name, err) - } - } - return nil -} - -// extractFile extracts a single file from an archive. -func extractFile(arpath string, armode os.FileMode, data io.Reader, dest string) error { - // Check that path is inside destination directory. - target := filepath.Join(dest, filepath.FromSlash(arpath)) - if !strings.HasPrefix(target, filepath.Clean(dest)+string(os.PathSeparator)) { - return fmt.Errorf("path %q escapes archive destination", target) - } - - // Ensure the destination directory exists. - if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil { - return err - } - - // Copy file data. - file, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, armode) - if err != nil { - return err - } - if _, err := io.Copy(file, data); err != nil { - file.Close() - os.Remove(target) - return err - } - return file.Close() -} diff --git a/internal/build/download.go b/internal/build/download.go deleted file mode 100644 index abdc60b2401..00000000000 --- a/internal/build/download.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package build - -import ( - "bufio" - "crypto/sha256" - "encoding/hex" - "fmt" - "io" - "io/ioutil" - "log" - "net/http" - "os" - "path/filepath" - "strings" -) - -// ChecksumDB keeps file checksums. -type ChecksumDB struct { - allChecksums []string -} - -// MustLoadChecksums loads a file containing checksums. -func MustLoadChecksums(file string) *ChecksumDB { - content, err := ioutil.ReadFile(file) - if err != nil { - log.Fatal("can't load checksum file: " + err.Error()) - } - return &ChecksumDB{strings.Split(string(content), "\n")} -} - -// Verify checks whether the given file is valid according to the checksum database. -func (db *ChecksumDB) Verify(path string) error { - fd, err := os.Open(path) - if err != nil { - return err - } - defer fd.Close() - - h := sha256.New() - if _, err := io.Copy(h, bufio.NewReader(fd)); err != nil { - return err - } - fileHash := hex.EncodeToString(h.Sum(nil)) - if !db.findHash(filepath.Base(path), fileHash) { - return fmt.Errorf("invalid file hash %s", fileHash) - } - return nil -} - -func (db *ChecksumDB) findHash(basename, hash string) bool { - want := hash + " " + basename - for _, line := range db.allChecksums { - if strings.TrimSpace(line) == want { - return true - } - } - return false -} - -// DownloadFile downloads a file and verifies its checksum. -func (db *ChecksumDB) DownloadFile(url, dstPath string) error { - if err := db.Verify(dstPath); err == nil { - fmt.Printf("%s is up-to-date\n", dstPath) - return nil - } - fmt.Printf("%s is stale\n", dstPath) - fmt.Printf("downloading from %s\n", url) - - resp, respErr := http.Get(url) - if respErr != nil { - return fmt.Errorf("download error: %v", respErr) - } else if resp.StatusCode != http.StatusOK { - return fmt.Errorf("download error: status %d", resp.StatusCode) - } - defer resp.Body.Close() - if err := os.MkdirAll(filepath.Dir(dstPath), 0755); err != nil { - return err - } - fd, fdErr := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) - if fdErr != nil { - return fdErr - } - dst := newDownloadWriter(fd, resp.ContentLength) - _, cpErr := io.Copy(dst, resp.Body) - dst.Close() - if cpErr != nil { - return cpErr - } - - return db.Verify(dstPath) -} - -type downloadWriter struct { - file *os.File - dstBuf *bufio.Writer - size int64 - written int64 - lastpct int64 -} - -func newDownloadWriter(dst *os.File, size int64) *downloadWriter { - return &downloadWriter{ - file: dst, - dstBuf: bufio.NewWriter(dst), - size: size, - } -} - -func (w *downloadWriter) Write(buf []byte) (int, error) { - n, err := w.dstBuf.Write(buf) - - // Report progress. - w.written += int64(n) - pct := w.written * 10 / w.size * 10 - if pct != w.lastpct { - if w.lastpct != 0 { - fmt.Print("...") - } - fmt.Print(pct, "%") - w.lastpct = pct - } - return n, err -} - -func (w *downloadWriter) Close() error { - if w.lastpct > 0 { - fmt.Println() // Finish the progress line. - } - flushErr := w.dstBuf.Flush() - closeErr := w.file.Close() - if flushErr != nil { - return flushErr - } - return closeErr -} diff --git a/internal/build/env.go b/internal/build/env.go deleted file mode 100644 index a3017182e3c..00000000000 --- a/internal/build/env.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package build - -import ( - "flag" - "fmt" - "os" - "regexp" - "strconv" - "strings" - "time" -) - -var ( - // These flags override values in build env. - GitCommitFlag = flag.String("git-commit", "", `Overrides git commit hash embedded into executables`) - GitBranchFlag = flag.String("git-branch", "", `Overrides git branch being built`) - GitTagFlag = flag.String("git-tag", "", `Overrides git tag being built`) - BuildnumFlag = flag.String("buildnum", "", `Overrides CI build number`) - PullRequestFlag = flag.Bool("pull-request", false, `Overrides pull request status of the build`) - CronJobFlag = flag.Bool("cron-job", false, `Overrides cron job status of the build`) -) - -// Environment contains metadata provided by the build environment. -type Environment struct { - Name string // name of the environment - Repo string // name of GitHub repo - Commit, Date, Branch, Tag string // Git info - Buildnum string - IsPullRequest bool - IsCronJob bool -} - -func (env Environment) String() string { - return fmt.Sprintf("%s env (commit:%s date:%s branch:%s tag:%s buildnum:%s pr:%t)", - env.Name, env.Commit, env.Date, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest) -} - -// Env returns metadata about the current CI environment, falling back to LocalEnv -// if not running on CI. -func Env() Environment { - switch { - case os.Getenv("CI") == "true" && os.Getenv("TRAVIS") == "true": - commit := os.Getenv("TRAVIS_PULL_REQUEST_SHA") - if commit == "" { - commit = os.Getenv("TRAVIS_COMMIT") - } - return Environment{ - Name: "travis", - Repo: os.Getenv("TRAVIS_REPO_SLUG"), - Commit: commit, - Date: getDate(commit), - Branch: os.Getenv("TRAVIS_BRANCH"), - Tag: os.Getenv("TRAVIS_TAG"), - Buildnum: os.Getenv("TRAVIS_BUILD_NUMBER"), - IsPullRequest: os.Getenv("TRAVIS_PULL_REQUEST") != "false", - IsCronJob: os.Getenv("TRAVIS_EVENT_TYPE") == "cron", - } - case os.Getenv("CI") == "True" && os.Getenv("APPVEYOR") == "True": - commit := os.Getenv("APPVEYOR_PULL_REQUEST_HEAD_COMMIT") - if commit == "" { - commit = os.Getenv("APPVEYOR_REPO_COMMIT") - } - return Environment{ - Name: "appveyor", - Repo: os.Getenv("APPVEYOR_REPO_NAME"), - Commit: commit, - Date: getDate(commit), - Branch: os.Getenv("APPVEYOR_REPO_BRANCH"), - Tag: os.Getenv("APPVEYOR_REPO_TAG_NAME"), - Buildnum: os.Getenv("APPVEYOR_BUILD_NUMBER"), - IsPullRequest: os.Getenv("APPVEYOR_PULL_REQUEST_NUMBER") != "", - IsCronJob: os.Getenv("APPVEYOR_SCHEDULED_BUILD") == "True", - } - default: - return LocalEnv() - } -} - -// LocalEnv returns build environment metadata gathered from git. -func LocalEnv() Environment { - env := applyEnvFlags(Environment{Name: "local", Repo: "ethereum/go-ethereum"}) - - head := readGitFile("HEAD") - if fields := strings.Fields(head); len(fields) == 2 { - head = fields[1] - } else { - // In this case we are in "detached head" state - // see: https://git-scm.com/docs/git-checkout#_detached_head - // Additional check required to verify, that file contains commit hash - commitRe, _ := regexp.Compile("^([0-9a-f]{40})$") - if commit := commitRe.FindString(head); commit != "" && env.Commit == "" { - env.Commit = commit - } - return env - } - if env.Commit == "" { - env.Commit = readGitFile(head) - } - env.Date = getDate(env.Commit) - if env.Branch == "" { - if head != "HEAD" { - env.Branch = strings.TrimPrefix(head, "refs/heads/") - } - } - if info, err := os.Stat(".git/objects"); err == nil && info.IsDir() && env.Tag == "" { - env.Tag = firstLine(RunGit("tag", "-l", "--points-at", "HEAD")) - } - return env -} - -func firstLine(s string) string { - return strings.Split(s, "\n")[0] -} - -func getDate(commit string) string { - if commit == "" { - return "" - } - out := RunGit("show", "-s", "--format=%ct", commit) - if out == "" { - return "" - } - date, err := strconv.ParseInt(strings.TrimSpace(out), 10, 64) - if err != nil { - panic(fmt.Sprintf("failed to parse git commit date: %v", err)) - } - return time.Unix(date, 0).Format("20060102") -} - -func applyEnvFlags(env Environment) Environment { - if !flag.Parsed() { - panic("you need to call flag.Parse before Env or LocalEnv") - } - if *GitCommitFlag != "" { - env.Commit = *GitCommitFlag - } - if *GitBranchFlag != "" { - env.Branch = *GitBranchFlag - } - if *GitTagFlag != "" { - env.Tag = *GitTagFlag - } - if *BuildnumFlag != "" { - env.Buildnum = *BuildnumFlag - } - if *PullRequestFlag { - env.IsPullRequest = true - } - if *CronJobFlag { - env.IsCronJob = true - } - return env -} diff --git a/internal/build/pgp.go b/internal/build/pgp.go deleted file mode 100644 index c7d0d233974..00000000000 --- a/internal/build/pgp.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// signFile reads the contents of an input file and signs it (in armored format) -// with the key provided, placing the signature into the output file. - -package build - -import ( - "bytes" - "fmt" - "os" - - "golang.org/x/crypto/openpgp" -) - -// PGPSignFile parses a PGP private key from the specified string and creates a -// signature file into the output parameter of the input file. -// -// Note, this method assumes a single key will be container in the pgpkey arg, -// furthermore that it is in armored format. -func PGPSignFile(input string, output string, pgpkey string) error { - // Parse the keyring and make sure we only have a single private key in it - keys, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(pgpkey)) - if err != nil { - return err - } - if len(keys) != 1 { - return fmt.Errorf("key count mismatch: have %d, want %d", len(keys), 1) - } - // Create the input and output streams for signing - in, err := os.Open(input) - if err != nil { - return err - } - defer in.Close() - - out, err := os.Create(output) - if err != nil { - return err - } - defer out.Close() - - // Generate the signature and return - return openpgp.ArmoredDetachSign(out, keys[0], in, nil) -} - -// PGPKeyID parses an armored key and returns the key ID. -func PGPKeyID(pgpkey string) (string, error) { - keys, err := openpgp.ReadArmoredKeyRing(bytes.NewBufferString(pgpkey)) - if err != nil { - return "", err - } - if len(keys) != 1 { - return "", fmt.Errorf("key count mismatch: have %d, want %d", len(keys), 1) - } - return keys[0].PrimaryKey.KeyIdString(), nil -} diff --git a/internal/build/util.go b/internal/build/util.go deleted file mode 100644 index 1f8d3a0d1ed..00000000000 --- a/internal/build/util.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package build - -import ( - "bytes" - "flag" - "fmt" - "go/build" - "go/parser" - "go/token" - "io" - "io/ioutil" - "log" - "os" - "os/exec" - "path" - "path/filepath" - "runtime" - "strings" - "text/template" -) - -var DryRunFlag = flag.Bool("n", false, "dry run, don't execute commands") - -// MustRun executes the given command and exits the host process for -// any error. -func MustRun(cmd *exec.Cmd) { - fmt.Println(">>>", strings.Join(cmd.Args, " ")) - if !*DryRunFlag { - cmd.Stderr = os.Stderr - cmd.Stdout = os.Stdout - if err := cmd.Run(); err != nil { - log.Fatal(err) - } - } -} - -func MustRunCommand(cmd string, args ...string) { - MustRun(exec.Command(cmd, args...)) -} - -// GOPATH returns the value that the GOPATH environment -// variable should be set to. -func GOPATH() string { - if os.Getenv("GOPATH") == "" { - // Starting with go 1.8 this variable contains the default GOPATH if - // no env variable is set. - return build.Default.GOPATH - } - return os.Getenv("GOPATH") -} - -var warnedAboutGit bool - -// RunGit runs a git subcommand and returns its output. -// The command must complete successfully. -func RunGit(args ...string) string { - cmd := exec.Command("git", args...) - var stdout, stderr bytes.Buffer - cmd.Stdout, cmd.Stderr = &stdout, &stderr - if err := cmd.Run(); err != nil { - if e, ok := err.(*exec.Error); ok && e.Err == exec.ErrNotFound { - if !warnedAboutGit { - log.Println("Warning: can't find 'git' in PATH") - warnedAboutGit = true - } - return "" - } - log.Fatal(strings.Join(cmd.Args, " "), ": ", err, "\n", stderr.String()) - } - return strings.TrimSpace(stdout.String()) -} - -// readGitFile returns content of file in .git directory. -func readGitFile(file string) string { - content, err := ioutil.ReadFile(path.Join(".git", file)) - if err != nil { - return "" - } - return strings.TrimSpace(string(content)) -} - -// Render renders the given template file into outputFile. -func Render(templateFile, outputFile string, outputPerm os.FileMode, x interface{}) { - tpl := template.Must(template.ParseFiles(templateFile)) - render(tpl, outputFile, outputPerm, x) -} - -// RenderString renders the given template string into outputFile. -func RenderString(templateContent, outputFile string, outputPerm os.FileMode, x interface{}) { - tpl := template.Must(template.New("").Parse(templateContent)) - render(tpl, outputFile, outputPerm, x) -} - -func render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x interface{}) { - if err := os.MkdirAll(filepath.Dir(outputFile), 0755); err != nil { - log.Fatal(err) - } - out, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY|os.O_EXCL, outputPerm) - if err != nil { - log.Fatal(err) - } - if err := tpl.Execute(out, x); err != nil { - log.Fatal(err) - } - if err := out.Close(); err != nil { - log.Fatal(err) - } -} - -// GoTool returns the command that runs a go tool. This uses go from GOROOT instead of PATH -// so that go commands executed by build use the same version of Go as the 'host' that runs -// build code. e.g. -// -// /usr/lib/go-1.12.1/bin/go run build/ci.go ... -// -// runs using go 1.12.1 and invokes go 1.12.1 tools from the same GOROOT. This is also important -// because runtime.Version checks on the host should match the tools that are run. -func GoTool(tool string, args ...string) *exec.Cmd { - args = append([]string{tool}, args...) - return exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) -} - -// UploadSFTP uploads files to a remote host using the sftp command line tool. -// The destination host may be specified either as [user@]host[: or as a URI in -// the form sftp://[user@]host[:port]. -func UploadSFTP(identityFile, host, dir string, files []string) error { - sftp := exec.Command("sftp") - sftp.Stdout = nil - sftp.Stderr = os.Stderr - if identityFile != "" { - sftp.Args = append(sftp.Args, "-i", identityFile) - } - sftp.Args = append(sftp.Args, host) - fmt.Println(">>>", strings.Join(sftp.Args, " ")) - if *DryRunFlag { - return nil - } - - stdin, err := sftp.StdinPipe() - if err != nil { - return fmt.Errorf("can't create stdin pipe for sftp: %v", err) - } - if err := sftp.Start(); err != nil { - return err - } - in := io.MultiWriter(stdin, os.Stdout) - for _, f := range files { - fmt.Fprintln(in, "put", f, path.Join(dir, filepath.Base(f))) - } - stdin.Close() - return sftp.Wait() -} - -// FindMainPackages finds all 'main' packages in the given directory and returns their -// package paths. -func FindMainPackages(dir string) []string { - var commands []string - cmds, err := ioutil.ReadDir(dir) - if err != nil { - log.Fatal(err) - } - for _, cmd := range cmds { - pkgdir := filepath.Join(dir, cmd.Name()) - pkgs, err := parser.ParseDir(token.NewFileSet(), pkgdir, nil, parser.PackageClauseOnly) - if err != nil { - log.Fatal(err) - } - for name := range pkgs { - if name == "main" { - path := "./" + filepath.ToSlash(pkgdir) - commands = append(commands, path) - break - } - } - } - return commands -} diff --git a/internal/debug/api.go b/internal/debug/api.go index 25cda01c381..95d0213b220 100644 --- a/internal/debug/api.go +++ b/internal/debug/api.go @@ -34,6 +34,7 @@ import ( "sync" "time" + "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/log/v3" ) @@ -74,7 +75,7 @@ func (*HandlerT) BacktraceAt(location string) error { // MemStats returns detailed runtime memory statistics. func (*HandlerT) MemStats() *runtime.MemStats { s := new(runtime.MemStats) - runtime.ReadMemStats(s) + common.ReadMemStats(s) return s } diff --git a/internal/debug/flags.go b/internal/debug/flags.go index b99d1cd0ee4..3eab6e518dd 100644 --- a/internal/debug/flags.go +++ b/internal/debug/flags.go @@ -19,13 +19,11 @@ package debug import ( "fmt" "net/http" - _ "net/http/pprof" + _ "net/http/pprof" //nolint:gosec "os" - "os/signal" - "runtime" - "syscall" metrics2 "github.com/VictoriaMetrics/metrics" + "github.com/ledgerwatch/erigon/common/fdlimit" "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/erigon/metrics/exp" "github.com/ledgerwatch/log/v3" @@ -43,16 +41,12 @@ var ( Name: "log.json", Usage: "Format logs with JSON", } + //nolint vmoduleFlag = cli.StringFlag{ Name: "vmodule", Usage: "Per-module verbosity: comma-separated list of = (e.g. eth/*=5,p2p=4)", Value: "", } - backtraceAtFlag = cli.StringFlag{ - Name: "backtrace", - Usage: "Request a stack trace at a specific logging statement (e.g. \"block.go:271\")", - Value: "", - } metricsAddrFlag = cli.StringFlag{ Name: "metrics.addr", } @@ -60,10 +54,6 @@ var ( Name: "metrics.port", Value: 6060, } - debugFlag = cli.BoolFlag{ - Name: "debug", - Usage: "Prepends log messages with call-site location (file and line number)", - } pprofFlag = cli.BoolFlag{ Name: "pprof", Usage: "Enable the pprof HTTP server", @@ -78,15 +68,6 @@ var ( Usage: "pprof HTTP server listening interface", Value: "127.0.0.1", } - memprofilerateFlag = cli.IntFlag{ - Name: "pprof.memprofilerate", - Usage: "Turn on memory profiling with the given rate", - Value: runtime.MemProfileRate, - } - blockprofilerateFlag = cli.IntFlag{ - Name: "pprof.blockprofilerate", - Usage: "Turn on block profiling with the given rate", - } cpuprofileFlag = cli.StringFlag{ Name: "pprof.cpuprofile", Usage: "Write CPU profile to the given file", @@ -99,21 +80,22 @@ var ( // Flags holds all command-line flags required for debugging. var Flags = []cli.Flag{ - verbosityFlag, logjsonFlag, vmoduleFlag, backtraceAtFlag, debugFlag, - pprofFlag, pprofAddrFlag, pprofPortFlag, memprofilerateFlag, - blockprofilerateFlag, cpuprofileFlag, traceFlag, + verbosityFlag, logjsonFlag, //backtraceAtFlag, vmoduleFlag, debugFlag, + pprofFlag, pprofAddrFlag, pprofPortFlag, + cpuprofileFlag, traceFlag, } //var glogger *log.GlogHandler func init() { - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) + //log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) //glogger = log.NewGlogHandler(log.StreamHandler(os.Stderr, log.TerminalFormat(false))) //glogger.Verbosity(log.LvlInfo) //log.Root().SetHandler(glogger) } func SetupCobra(cmd *cobra.Command) error { + RaiseFdLimit() flags := cmd.Flags() lvl, err := flags.GetInt(verbosityFlag.Name) if err != nil { @@ -139,14 +121,6 @@ func SetupCobra(cmd *cobra.Command) error { */ log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(lvl), log.StderrHandler)) - memprofilerate, err := flags.GetInt(memprofilerateFlag.Name) - if err != nil { - return err - } - blockprofilerate, err := flags.GetInt(blockprofilerateFlag.Name) - if err != nil { - return err - } traceFile, err := flags.GetString(traceFlag.Name) if err != nil { return err @@ -157,8 +131,6 @@ func SetupCobra(cmd *cobra.Command) error { } // profiling, tracing - runtime.MemProfileRate = memprofilerate - Handler.SetBlockProfileRate(blockprofilerate) if traceFile != "" { if err2 := Handler.StartGoTrace(traceFile); err2 != nil { return err2 @@ -170,12 +142,7 @@ func SetupCobra(cmd *cobra.Command) error { } } - go func() { - c := make(chan os.Signal, 1) - signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) - <-c - Exit() - }() + go ListenSignals(nil) pprof, err := flags.GetBool(pprofFlag.Name) if err != nil { return err @@ -214,13 +181,14 @@ func SetupCobra(cmd *cobra.Command) error { // Setup initializes profiling and logging based on the CLI flags. // It should be called as early as possible in the program. func Setup(ctx *cli.Context) error { + RaiseFdLimit() //var ostream log.Handler //output := io.Writer(os.Stderr) - if ctx.GlobalBool(logjsonFlag.Name) { - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.GlobalInt(verbosityFlag.Name)), log.StreamHandler(os.Stderr, log.JsonFormat()))) + if ctx.Bool(logjsonFlag.Name) { + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.Int(verbosityFlag.Name)), log.StreamHandler(os.Stderr, log.JsonFormat()))) //ostream = log.StreamHandler(output, log.JsonFormat()) } else { - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.GlobalInt(verbosityFlag.Name)), log.StderrHandler)) + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(ctx.Int(verbosityFlag.Name)), log.StderrHandler)) } //log.Root().SetHandler(ostream) @@ -235,35 +203,30 @@ func Setup(ctx *cli.Context) error { ) */ - // profiling, tracing - runtime.MemProfileRate = ctx.GlobalInt(memprofilerateFlag.Name) - - Handler.SetBlockProfileRate(ctx.GlobalInt(blockprofilerateFlag.Name)) - - if traceFile := ctx.GlobalString(traceFlag.Name); traceFile != "" { + if traceFile := ctx.String(traceFlag.Name); traceFile != "" { if err := Handler.StartGoTrace(traceFile); err != nil { return err } } - if cpuFile := ctx.GlobalString(cpuprofileFlag.Name); cpuFile != "" { + if cpuFile := ctx.String(cpuprofileFlag.Name); cpuFile != "" { if err := Handler.StartCPUProfile(cpuFile); err != nil { return err } } - pprofEnabled := ctx.GlobalBool(pprofFlag.Name) - metricsAddr := ctx.GlobalString(metricsAddrFlag.Name) + pprofEnabled := ctx.Bool(pprofFlag.Name) + metricsAddr := ctx.String(metricsAddrFlag.Name) if metrics.Enabled && (!pprofEnabled || metricsAddr != "") { - metricsPort := ctx.GlobalInt(metricsPortFlag.Name) + metricsPort := ctx.Int(metricsPortFlag.Name) address := fmt.Sprintf("%s:%d", metricsAddr, metricsPort) exp.Setup(address) } // pprof server if pprofEnabled { - pprofHost := ctx.GlobalString(pprofAddrFlag.Name) - pprofPort := ctx.GlobalInt(pprofPortFlag.Name) + pprofHost := ctx.String(pprofAddrFlag.Name) + pprofPort := ctx.Int(pprofPortFlag.Name) address := fmt.Sprintf("%s:%d", pprofHost, pprofPort) // This context value ("metrics.addr") represents the utils.MetricsHTTPFlag.Name. // It cannot be imported because it will cause a cyclical dependency. @@ -278,6 +241,7 @@ func StartPProf(address string, withMetrics bool) { // from the registry into expvar, and execute regular expvar handler. if withMetrics { http.HandleFunc("/debug/metrics/prometheus", func(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") metrics2.WritePrometheus(w, true) }) } @@ -297,3 +261,15 @@ func Exit() { _ = Handler.StopCPUProfile() _ = Handler.StopGoTrace() } + +// RaiseFdLimit raises out the number of allowed file handles per process +func RaiseFdLimit() { + limit, err := fdlimit.Maximum() + if err != nil { + log.Error("Failed to retrieve file descriptor allowance", "err", err) + return + } + if _, err = fdlimit.Raise(uint64(limit)); err != nil { + log.Error("Failed to raise file descriptor allowance", "err", err) + } +} diff --git a/internal/debug/loudpanic.go b/internal/debug/loudpanic.go index 572ebcefa14..3412d872eee 100644 --- a/internal/debug/loudpanic.go +++ b/internal/debug/loudpanic.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build go1.6 +//go:build go1.6 package debug diff --git a/internal/debug/loudpanic_fallback.go b/internal/debug/loudpanic_fallback.go index 4ce4985da7c..a909f9dffc8 100644 --- a/internal/debug/loudpanic_fallback.go +++ b/internal/debug/loudpanic_fallback.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build !go1.6 +//go:build !go1.6 package debug diff --git a/internal/debug/signal.go b/internal/debug/signal.go new file mode 100644 index 00000000000..ed1e7bd28e8 --- /dev/null +++ b/internal/debug/signal.go @@ -0,0 +1,43 @@ +//go:build !windows + +package debug + +import ( + "io" + "os" + "os/signal" + "runtime/pprof" + + _debug "github.com/ledgerwatch/erigon/common/debug" + "github.com/ledgerwatch/log/v3" + "golang.org/x/sys/unix" +) + +func ListenSignals(stack io.Closer) { + sigc := make(chan os.Signal, 1) + signal.Notify(sigc, unix.SIGINT, unix.SIGTERM) + _debug.GetSigC(&sigc) + defer signal.Stop(sigc) + + usr1 := make(chan os.Signal, 1) + signal.Notify(usr1, unix.SIGUSR1) + for { + select { + case <-sigc: + log.Info("Got interrupt, shutting down...") + if stack != nil { + go stack.Close() + } + for i := 10; i > 0; i-- { + <-sigc + if i > 1 { + log.Warn("Already shutting down, interrupt more to panic.", "times", i-1) + } + } + Exit() // ensure trace and CPU profile data is flushed. + LoudPanic("boom") + case <-usr1: + pprof.Lookup("goroutine").WriteTo(os.Stdout, 2) + } + } +} diff --git a/internal/debug/signal_windows.go b/internal/debug/signal_windows.go new file mode 100644 index 00000000000..ea731be74ee --- /dev/null +++ b/internal/debug/signal_windows.go @@ -0,0 +1,33 @@ +//go:build windows + +package debug + +import ( + "io" + "os" + "os/signal" + + _debug "github.com/ledgerwatch/erigon/common/debug" + "github.com/ledgerwatch/log/v3" +) + +func ListenSignals(stack io.Closer) { + sigc := make(chan os.Signal, 1) + signal.Notify(sigc, os.Interrupt) + _debug.GetSigC(&sigc) + defer signal.Stop(sigc) + + <-sigc + log.Info("Got interrupt, shutting down...") + if stack != nil { + go stack.Close() + } + for i := 10; i > 0; i-- { + <-sigc + if i > 1 { + log.Warn("Already shutting down, interrupt more to panic.", "times", i-1) + } + } + Exit() // ensure trace and CPU profile data is flushed. + LoudPanic("boom") +} diff --git a/internal/debug/trace.go b/internal/debug/trace.go index 35d791ec257..b9902e71cf1 100644 --- a/internal/debug/trace.go +++ b/internal/debug/trace.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -//+build go1.5 +//go:build go1.5 package debug diff --git a/internal/debug/trace_fallback.go b/internal/debug/trace_fallback.go index 4118ff4087e..ffe506ebf22 100644 --- a/internal/debug/trace_fallback.go +++ b/internal/debug/trace_fallback.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -//+build !go1.5 +//go:build !go1.5 // no-op implementation of tracing methods for Go < 1.5. diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 16b9227ff36..29fe64aac4b 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -17,11 +17,9 @@ package ethapi import ( - "context" "errors" "fmt" "math/big" - "time" "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/accounts/abi" @@ -31,298 +29,9 @@ import ( "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/log/v3" ) -/* -// PublicEthereumAPI provides an API to access Ethereum related information. -// It offers only methods that operate on public data that is freely available to anyone. -type PublicEthereumAPI struct { - b Backend -} - -// NewPublicEthereumAPI creates a new Ethereum protocol API. -func NewPublicEthereumAPI(b Backend) *PublicEthereumAPI { - return &PublicEthereumAPI{b} -} - -// GasPrice returns a suggestion for a gas price. -func (s *PublicEthereumAPI) GasPrice(ctx context.Context) (*hexutil.Big, error) { - price, err := s.b.SuggestPrice(ctx) - return (*hexutil.Big)(price), err -} - -// Syncing returns false in case the node is currently not syncing with the network. It can be up to date or has not -// yet received the latest block headers from its pears. In case it is synchronizing: -// - startingBlock: block number this node started to synchronise from -// - currentBlock: block number this node is currently importing -// - highestBlock: block number of the highest block header this node has received from peers -// - pulledStates: number of state entries processed until now -// - knownStates: number of known state entries that still need to be pulled -//func (s *PublicEthereumAPI) Syncing() (interface{}, error) { -// progress := s.b.Downloader().Progress() -// -// // Return not syncing if the synchronisation already completed -// if progress.CurrentBlock >= progress.HighestBlock { -// return false, nil -// } -// // Otherwise gather the block sync stats -// return map[string]hexutil.Uint64{ -// "startingBlock": hexutil.Uint64(progress.StartingBlock), -// "currentBlock": hexutil.Uint64(progress.CurrentBlock), -// "highestBlock": hexutil.Uint64(progress.HighestBlock), -// "pulledStates": hexutil.Uint64(progress.PulledStates), -// "knownStates": hexutil.Uint64(progress.KnownStates), -// }, nil -//} - -// PublicTxPoolAPI offers and API for the transaction pool. It only operates on data that is non confidential. -type PublicTxPoolAPI struct { - b Backend -} - -// NewPublicTxPoolAPI creates a new tx pool service that gives information about the transaction pool. -func NewPublicTxPoolAPI(b Backend) *PublicTxPoolAPI { - return &PublicTxPoolAPI{b} -} - -// Content returns the transactions contained within the transaction pool. -func (s *PublicTxPoolAPI) Content() map[string]map[string]map[string]*RPCTransaction { - content := map[string]map[string]map[string]*RPCTransaction{ - "pending": make(map[string]map[string]*RPCTransaction), - "queued": make(map[string]map[string]*RPCTransaction), - } - pending, queue := s.b.TxPoolContent() - - // Flatten the pending transactions - for account, txs := range pending { - dump := make(map[string]*RPCTransaction) - for _, tx := range txs { - dump[fmt.Sprintf("%d", tx.GetNonce())] = newRPCPendingTransaction(tx) - } - content["pending"][account.Hex()] = dump - } - // Flatten the queued transactions - for account, txs := range queue { - dump := make(map[string]*RPCTransaction) - for _, tx := range txs { - dump[fmt.Sprintf("%d", tx.GetNonce())] = newRPCPendingTransaction(tx) - } - content["queued"][account.Hex()] = dump - } - return content -} - -// Status returns the number of pending and queued transaction in the pool. -func (s *PublicTxPoolAPI) Status() map[string]hexutil.Uint { - pending, queue := s.b.Stats() - return map[string]hexutil.Uint{ - "pending": hexutil.Uint(pending), - "queued": hexutil.Uint(queue), - } -} - -// Inspect retrieves the content of the transaction pool and flattens it into an -// easily inspectable list. -func (s *PublicTxPoolAPI) Inspect() map[string]map[string]map[string]string { - content := map[string]map[string]map[string]string{ - "pending": make(map[string]map[string]string), - "queued": make(map[string]map[string]string), - } - pending, queue := s.b.TxPoolContent() - - // Define a formatter to flatten a transaction into a string - var format = func(tx types.Transaction) string { - if to := tx.GetTo(); to != nil { - return fmt.Sprintf("%s: %v wei + %v gas × %v wei", tx.GetTo().Hex(), tx.GetValue(), tx.GetGas(), tx.GetPrice()) - } - return fmt.Sprintf("contract creation: %v wei + %v gas × %v wei", tx.GetValue(), tx.GetGas(), tx.GetPrice()) - } - // Flatten the pending transactions - for account, txs := range pending { - dump := make(map[string]string) - for _, tx := range txs { - dump[fmt.Sprintf("%d", tx.GetNonce())] = format(tx) - } - content["pending"][account.Hex()] = dump - } - // Flatten the queued transactions - for account, txs := range queue { - dump := make(map[string]string) - for _, tx := range txs { - dump[fmt.Sprintf("%d", tx.GetNonce())] = format(tx) - } - content["queued"][account.Hex()] = dump - } - return content -} - -// PublicBlockChainAPI provides an API to access the Ethereum blockchain. -// It offers only methods that operate on public data that is freely available to anyone. -type PublicBlockChainAPI struct { - b Backend -} - -// NewPublicBlockChainAPI creates a new Ethereum blockchain API. -func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI { - return &PublicBlockChainAPI{b} -} - -// ChainId returns the chainID value for transaction replay protection. -func (s *PublicBlockChainAPI) ChainId() *hexutil.Big { - return (*hexutil.Big)(s.b.ChainConfig().ChainID) -} - -// BlockNumber returns the block number of the chain head. -func (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 { - header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available - return hexutil.Uint64(header.Number.Uint64()) -} - -// GetBalance returns the amount of wei for the given address in the state of the -// given block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta -// block numbers are also allowed. -func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { - state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) - if state == nil || err != nil { - return nil, err - } - return (*hexutil.Big)(state.GetBalance(address).ToBig()), state.Error() -} - -// GetHeaderByNumber returns the requested canonical block header. -// * When blockNr is -1 the chain head is returned. -// * When blockNr is -2 the pending chain head is returned. -func (s *PublicBlockChainAPI) GetHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (map[string]interface{}, error) { - header, err := s.b.HeaderByNumber(ctx, number) - if header != nil && err == nil { - response := s.rpcMarshalHeader(ctx, header) - if number == rpc.PendingBlockNumber { - // Pending header need to nil out a few fields - for _, field := range []string{"hash", "nonce", "miner"} { - response[field] = nil - } - } - return response, err - } - return nil, err -} - -// GetHeaderByHash returns the requested header by hash. -func (s *PublicBlockChainAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) map[string]interface{} { - header, _ := s.b.HeaderByHash(ctx, hash) - if header != nil { - return s.rpcMarshalHeader(ctx, header) - } - return nil -} - -// GetBlockByNumber returns the requested canonical block. -// * When blockNr is -1 the chain head is returned. -// * When blockNr is -2 the pending chain head is returned. -// * When fullTx is true all transactions in the block are returned, otherwise -// only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { - block, err := s.b.BlockByNumber(ctx, number) - if block != nil && err == nil { - response, err1 := s.rpcMarshalBlock(ctx, block, true, fullTx) - if err1 == nil && number == rpc.PendingBlockNumber { - // Pending blocks need to nil out a few fields - for _, field := range []string{"hash", "nonce", "miner"} { - response[field] = nil - } - } - return response, err1 - } - return nil, err -} - -// GetBlockByHash returns the requested block. When fullTx is true all transactions in the block are returned in full -// detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, hash common.Hash, fullTx bool) (map[string]interface{}, error) { - block, err := s.b.BlockByHash(ctx, hash) - if block != nil { - return s.rpcMarshalBlock(ctx, block, true, fullTx) - } - return nil, err -} - -// GetUncleByBlockNumberAndIndex returns the uncle block for the given block hash and index. When fullTx is true -// all transactions in the block are returned in full detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, blockNr rpc.BlockNumber, index hexutil.Uint) (map[string]interface{}, error) { - block, err := s.b.BlockByNumber(ctx, blockNr) - if block != nil { - uncles := block.Uncles() - if index >= hexutil.Uint(len(uncles)) { - log.Debug("Requested uncle not found", "number", blockNr, "hash", block.Hash(), "index", index) - return nil, nil - } - block = types.NewBlockWithHeader(uncles[index]) - return s.rpcMarshalBlock(ctx, block, false, false) - } - return nil, err -} - -// GetUncleByBlockHashAndIndex returns the uncle block for the given block hash and index. When fullTx is true -// all transactions in the block are returned in full detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetUncleByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (map[string]interface{}, error) { - block, err := s.b.BlockByHash(ctx, blockHash) - if block != nil { - uncles := block.Uncles() - if index >= hexutil.Uint(len(uncles)) { - log.Debug("Requested uncle not found", "number", block.Number(), "hash", blockHash, "index", index) - return nil, nil - } - block = types.NewBlockWithHeader(uncles[index]) - return s.rpcMarshalBlock(ctx, block, false, false) - } - return nil, err -} - -// GetUncleCountByBlockNumber returns number of uncles in the block for the given block number -func (s *PublicBlockChainAPI) GetUncleCountByBlockNumber(ctx context.Context, blockNr rpc.BlockNumber) *hexutil.Uint { - if block, _ := s.b.BlockByNumber(ctx, blockNr); block != nil { - n := hexutil.Uint(len(block.Uncles())) - return &n - } - return nil -} - -// GetUncleCountByBlockHash returns number of uncles in the block for the given block hash -func (s *PublicBlockChainAPI) GetUncleCountByBlockHash(ctx context.Context, blockHash common.Hash) *hexutil.Uint { - if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil { - n := hexutil.Uint(len(block.Uncles())) - return &n - } - return nil -} - -// GetCode returns the code stored at the given address in the state for the given block number. -func (s *PublicBlockChainAPI) GetCode(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) { - state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) - if state == nil || err != nil { - return nil, err - } - code := state.GetCode(address) - return code, state.Error() -} - -// GetStorageAt returns the storage from the state at the given address, key and -// block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta block -// numbers are also allowed. -func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.Address, key string, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) { - state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) - if state == nil || err != nil { - return nil, err - } - keyHash := common.HexToHash(key) - var res uint256.Int - state.GetState(address, &keyHash, &res) - return res.Bytes(), state.Error() -} -*/ - // CallArgs represents the arguments for a call. type CallArgs struct { From *common.Address `json:"from"` @@ -332,6 +41,7 @@ type CallArgs struct { MaxPriorityFeePerGas *hexutil.Big `json:"maxPriorityFeePerGas"` MaxFeePerGas *hexutil.Big `json:"maxFeePerGas"` Value *hexutil.Big `json:"value"` + Nonce *hexutil.Uint64 `json:"nonce"` Data *hexutil.Bytes `json:"data"` AccessList *types.AccessList `json:"accessList"` ChainID *hexutil.Big `json:"chainId,omitempty"` @@ -386,7 +96,8 @@ func (args *CallArgs) ToMessage(globalGasCap uint64, baseFee *uint256.Int) (type // A basefee is provided, necessitating 1559-type execution if args.GasPrice != nil { // User specified the legacy gas field, convert to 1559 gas typing - gasPrice, overflow := uint256.FromBig(args.GasPrice.ToInt()) + gasPrice = new(uint256.Int) + overflow := gasPrice.SetFromBig(args.GasPrice.ToInt()) if overflow { return types.Message{}, fmt.Errorf("args.GasPrice higher than 2^256-1") } @@ -409,7 +120,7 @@ func (args *CallArgs) ToMessage(globalGasCap uint64, baseFee *uint256.Int) (type } // Backfill the legacy gasPrice for EVM execution, unless we're all zeroes gasPrice = new(uint256.Int) - if gasFeeCap.BitLen() > 0 || gasTipCap.BitLen() > 0 { + if !gasFeeCap.IsZero() || !gasTipCap.IsZero() { gasPrice = math.U256Min(new(uint256.Int).Add(gasTipCap, baseFee), gasFeeCap) } } @@ -419,7 +130,7 @@ func (args *CallArgs) ToMessage(globalGasCap uint64, baseFee *uint256.Int) (type if args.Value != nil { overflow := value.SetFromBig(args.Value.ToInt()) if overflow { - panic(fmt.Errorf("args.GasPrice higher than 2^256-1")) + return types.Message{}, fmt.Errorf("args.Value higher than 2^256-1") } } var data []byte @@ -449,99 +160,6 @@ type Account struct { StateDiff *map[common.Hash]uint256.Int `json:"stateDiff"` } -func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides map[common.Address]Account, vmCfg vm.Config, timeout time.Duration, globalGasCap uint64) (*core.ExecutionResult, error) { - defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) - - state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) - if state == nil || err != nil { - return nil, err - } - // Override the fields of specified contracts before execution. - for addr, account := range overrides { - // Override account nonce. - if account.Nonce != nil { - state.SetNonce(addr, uint64(*account.Nonce)) - } - // Override account(contract) code. - if account.Code != nil { - state.SetCode(addr, *account.Code) - } - // Override account balance. - if account.Balance != nil { - balance, overflow := uint256.FromBig((*big.Int)(*account.Balance)) - if overflow { - panic(fmt.Errorf("account.Balance higher than 2^256-1")) - } - state.SetBalance(addr, balance) - } - if account.State != nil && account.StateDiff != nil { - return nil, fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex()) - } - // Replace entire state if caller requires. - if account.State != nil { - state.SetStorage(addr, *account.State) - } - // Apply state diff into specified accounts. - if account.StateDiff != nil { - for key, value := range *account.StateDiff { - key := key - state.SetState(addr, &key, value) - } - } - } - // Setup context so it may be cancelled the call has completed - // or, in case of unmetered gas, setup a context with a timeout. - var cancel context.CancelFunc - if timeout > 0 { - ctx, cancel = context.WithTimeout(ctx, timeout) - } else { - ctx, cancel = context.WithCancel(ctx) - } - // Make sure the context is cancelled when the call has completed - // this makes sure resources are cleaned up. - defer cancel() - - // Get a new instance of the EVM. - var baseFee *uint256.Int - if header != nil && header.BaseFee != nil { - var overflow bool - baseFee, overflow = uint256.FromBig(header.BaseFee) - if overflow { - return nil, fmt.Errorf("header.BaseFee uint256 overflow") - } - } - msg, err := args.ToMessage(globalGasCap, baseFee) - if err != nil { - return nil, err - } - evm, vmError, err := b.GetEVM(ctx, msg, state, header) - if err != nil { - return nil, err - } - // Wait for the context to be done and cancel the evm. Even if the - // EVM has finished, cancelling may be done (repeatedly) - go func() { - <-ctx.Done() - evm.Cancel() - }() - - // Execute the message. - gp := new(core.GasPool).AddGas(math.MaxUint64) - result, err := core.ApplyMessage(evm, msg, gp, true, false) - if err := vmError(); err != nil { - return nil, err - } - - // If the timer caused an abort, return an appropriate error message - if evm.Cancelled() { - return nil, fmt.Errorf("execution aborted (timeout = %v)", timeout) - } - if err != nil { - return result, fmt.Errorf("err: %w (supplied gas %d)", err, msg.Gas()) - } - return result, nil -} - func NewRevertError(result *core.ExecutionResult) *RevertError { reason, errUnpack := abi.UnpackRevert(result.Revert()) err := errors.New("execution reverted") @@ -572,149 +190,6 @@ func (e *RevertError) ErrorData() interface{} { return e.reason } -/* -// Call executes the given transaction on the state for the given block number. -// -// Additionally, the caller can specify a batch of contract for fields overriding. -// -// Note, this function doesn't make and changes in the state/blockchain and is -// useful to execute and retrieve values. -func (s *PublicBlockChainAPI) Call(ctx context.Context, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides *map[common.Address]Account) (hexutil.Bytes, error) { - var accounts map[common.Address]Account - if overrides != nil { - accounts = *overrides - } - result, err := DoCall(ctx, s.b, args, blockNrOrHash, accounts, vm.Config{}, 5*time.Second, s.b.RPCGasCap()) - if err != nil { - return nil, err - } - // If the result contains a revert reason, try to unpack and return it. - if len(result.Revert()) > 0 { - return nil, NewRevertError(result) - } - return result.Return(), result.Err -} - -func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap uint64) (hexutil.Uint64, error) { - // Binary search the gas requirement, as it may be higher than the amount used - var ( - lo uint64 = params.TxGas - 1 - hi uint64 - cap uint64 - ) - // Use zero address if sender unspecified. - if args.From == nil { - args.From = new(common.Address) - } - // Determine the highest gas limit can be used during the estimation. - if args.Gas != nil && uint64(*args.Gas) >= params.TxGas { - hi = uint64(*args.Gas) - } else { - // Retrieve the block to act as the gas ceiling - block, err := b.BlockByNumberOrHash(ctx, blockNrOrHash) - if err != nil { - return 0, err - } - if block == nil { - return 0, errors.New("block not found") - } - hi = block.GasLimit() - } - // Recap the highest gas limit with account's available balance. - if args.GasPrice != nil && args.GasPrice.ToInt().BitLen() != 0 { - state, _, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) - if err != nil { - return 0, err - } - balance := state.GetBalance(*args.From) // from can't be nil - available := balance.ToBig() - if args.Value != nil { - if args.Value.ToInt().Cmp(available) >= 0 { - return 0, errors.New("insufficient funds for transfer") - } - available.Sub(available, args.Value.ToInt()) - } - allowance := new(big.Int).Div(available, args.GasPrice.ToInt()) - - // If the allowance is larger than maximum uint64, skip checking - if allowance.IsUint64() && hi > allowance.Uint64() { - transfer := args.Value - if transfer == nil { - transfer = new(hexutil.Big) - } - log.Warn("Gas estimation capped by limited funds", "original", hi, "balance", balance, - "sent", transfer.ToInt(), "gasprice", args.GasPrice.ToInt(), "fundable", allowance) - hi = allowance.Uint64() - } - } - // Recap the highest gas allowance with specified gascap. - if gasCap != 0 && hi > gasCap { - log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap) - hi = gasCap - } - cap = hi - - // Create a helper to check if a gas allowance results in an executable transaction - executable := func(gas uint64) (bool, *core.ExecutionResult, error) { - args.Gas = (*hexutil.Uint64)(&gas) - - result, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap) - if err != nil { - if errors.Is(err, core.ErrIntrinsicGas) { - return true, nil, nil // Special case, raise gas limit - } - return true, nil, err // Bail out - } - return result.Failed(), result, nil - } - // Execute the binary search and hone in on an executable gas limit - for lo+1 < hi { - mid := (hi + lo) / 2 - failed, _, err := executable(mid) - - // If the error is not nil(consensus error), it means the provided message - // call or transaction will never be accepted no matter how much gas it is - // assigned. Return the error directly, don't struggle any more. - if err != nil { - return 0, err - } - if failed { - lo = mid - } else { - hi = mid - } - } - // Reject the transaction as invalid if it still fails at the highest allowance - if hi == cap { - failed, result, err := executable(hi) - if err != nil { - return 0, err - } - if failed { - if result != nil && result.Err != vm.ErrOutOfGas { - if len(result.Revert()) > 0 { - return 0, NewRevertError(result) - } - return 0, result.Err - } - // Otherwise, the specified gas cap is too low - return 0, fmt.Errorf("gas required exceeds allowance (%d)", cap) - } - } - return hexutil.Uint64(hi), nil -} - -// EstimateGas returns an estimate of the amount of gas needed to execute the -// given transaction against the current pending block. -func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs, blockNrOrHash *rpc.BlockNumberOrHash) (hexutil.Uint64, error) { - bNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) - if blockNrOrHash != nil { - bNrOrHash = *blockNrOrHash - } - return DoEstimateGas(ctx, s.b, args, bNrOrHash, s.b.RPCGasCap()) -} -*/ - // ExecutionResult groups all structured logs emitted by the EVM // while replaying a transaction in debug mode as well as transaction // execution status, the amount of gas used and the return value @@ -943,7 +418,11 @@ func newRPCTransaction(tx types.Transaction, blockHash common.Hash, blockNumber } } signer := types.LatestSignerForChainID(chainId.ToBig()) - result.From, _ = tx.Sender(*signer) + var err error + result.From, err = tx.Sender(*signer) + if err != nil { + log.Warn("sender recovery", "err", err) + } if blockHash != (common.Hash{}) { result.BlockHash = &blockHash result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber)) diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index c9c64546c61..cef737cac4c 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -17,79 +17,6 @@ // Package ethapi implements the general Ethereum API functions. package ethapi -import ( - "context" - "math/big" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/consensus" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/bloombits" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/event" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rpc" -) - -// Backend interface provides the common API services (that are provided by -// both full and light clients) with access to necessary functions. -type Backend interface { - // General Ethereum API - SuggestPrice(ctx context.Context) (*big.Int, error) - ChainDb() ethdb.Database - ExtRPCEnabled() bool - RPCGasCap() uint64 // global gas cap for eth_call over rpc: DoS protection - RPCTxFeeCap() float64 // global tx fee cap for all transaction related APIs - UnprotectedAllowed() bool // allows only for EIP155 transactions. - - // Blockchain API - SetHead(number uint64) - HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) - HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) - HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) - CurrentHeader() *types.Header - CurrentBlock() *types.Block - BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) - BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) - BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) - StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.IntraBlockState, *types.Header, error) - StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*state.IntraBlockState, *types.Header, error) - GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) - GetTd(ctx context.Context, hash common.Hash) *big.Int - GetEVM(ctx context.Context, msg core.Message, state *state.IntraBlockState, header *types.Header) (*vm.EVM, func() error, error) - SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription - SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription - SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription - - // Transaction pool API - SendTx(ctx context.Context, signedTx types.Transaction) error - GetTransaction(ctx context.Context, txHash common.Hash) (types.Transaction, common.Hash, uint64, uint64, error) - GetPoolTransactions() (types.Transactions, error) - GetPoolTransaction(txHash common.Hash) types.Transaction - GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) - Stats() (pending int, queued int) - TxPool() *core.TxPool - TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) - SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription - - // Filter API - BloomStatus() (uint64, uint64) - GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) - ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) - SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription - SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription - - ChainConfig() *params.ChainConfig - Engine() consensus.Engine -} - -func GetAPIs(apiBackend Backend) []rpc.API { - return []rpc.API{} -} - /* func GetAPIs(apiBackend Backend) []rpc.API { nonceLock := new(AddrLocker) diff --git a/internal/ethapi/state_overrides.go b/internal/ethapi/state_overrides.go new file mode 100644 index 00000000000..d3159f351b5 --- /dev/null +++ b/internal/ethapi/state_overrides.go @@ -0,0 +1,50 @@ +package ethapi + +import ( + "fmt" + "math/big" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/state" +) + +type StateOverrides map[common.Address]Account + +func (overrides *StateOverrides) Override(state *state.IntraBlockState) error { + + for addr, account := range *overrides { + // Override account nonce. + if account.Nonce != nil { + state.SetNonce(addr, uint64(*account.Nonce)) + } + // Override account(contract) code. + if account.Code != nil { + state.SetCode(addr, *account.Code) + } + // Override account balance. + if account.Balance != nil { + balance, overflow := uint256.FromBig((*big.Int)(*account.Balance)) + if overflow { + return fmt.Errorf("account.Balance higher than 2^256-1") + } + state.SetBalance(addr, balance) + } + if account.State != nil && account.StateDiff != nil { + return fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex()) + } + // Replace entire state if caller requires. + if account.State != nil { + state.SetStorage(addr, *account.State) + } + // Apply state diff into specified accounts. + if account.StateDiff != nil { + for key, value := range *account.StateDiff { + key := key + state.SetState(addr, &key, value) + } + } + } + + return nil +} diff --git a/internal/flags/helpers.go b/internal/flags/helpers.go index 25e808b4ea9..55fe72fc272 100644 --- a/internal/flags/helpers.go +++ b/internal/flags/helpers.go @@ -21,81 +21,9 @@ import ( "path/filepath" "github.com/ledgerwatch/erigon/params" - "github.com/urfave/cli" ) -var ( - CommandHelpTemplate = `{{.cmd.Name}}{{if .cmd.Subcommands}} command{{end}}{{if .cmd.Flags}} [command options]{{end}} {{.cmd.ArgsUsage}} -{{if .cmd.Description}}{{.cmd.Description}} -{{end}}{{if .cmd.Subcommands}} -SUBCOMMANDS: - {{range .cmd.Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} - {{end}}{{end}}{{if .categorizedFlags}} -{{range $idx, $categorized := .categorizedFlags}}{{$categorized.Name}} OPTIONS: -{{range $categorized.Flags}}{{"\t"}}{{.}} -{{end}} -{{end}}{{end}}` - - OriginCommandHelpTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} {{.ArgsUsage}} -{{if .Description}}{{.Description}} -{{end}}{{if .Subcommands}} -SUBCOMMANDS: - {{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} - {{end}}{{end}}{{if .Flags}} -OPTIONS: -{{range $.Flags}} {{.}} -{{end}} -{{end}}` - - // AppHelpTemplate is the test template for the default, global app help topic. - AppHelpTemplate = `NAME: - {{.App.Name}} - {{.App.Usage}} - - Copyright 2013-2021 The go-ethereum Authors - -USAGE: - {{.App.HelpName}} [options]{{if .App.Commands}} [command] [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} - {{if .App.Version}} -VERSION: - {{.App.Version}} - {{end}}{{if len .App.Authors}} -AUTHOR(S): - {{range .App.Authors}}{{ . }}{{end}} - {{end}}{{if .App.Commands}} -COMMANDS: - {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} - {{end}}{{end}}{{if .FlagGroups}} -{{range .FlagGroups}}{{.Name}} OPTIONS: - {{range .Flags}}{{.}} - {{end}} -{{end}}{{end}}{{if .App.Copyright }} -COPYRIGHT: - {{.App.Copyright}} - {{end}} -` - // ClefAppHelpTemplate is the template for the default, global app help topic. - ClefAppHelpTemplate = `NAME: - {{.App.Name}} - {{.App.Usage}} - - Copyright 2013-2021 The go-ethereum Authors - -USAGE: - {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} - {{if .App.Version}} -COMMANDS: - {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}} - {{end}}{{end}}{{if .FlagGroups}} -{{range .FlagGroups}}{{.Name}} OPTIONS: - {{range .Flags}}{{.}} - {{end}} -{{end}}{{end}}{{if .App.Copyright }} -COPYRIGHT: - {{.App.Copyright}} - {{end}} -` -) - // HelpData is a one shot struct to pass to the usage template type HelpData struct { App interface{} diff --git a/internal/jsre/completion.go b/internal/jsre/completion.go deleted file mode 100644 index ba2decae456..00000000000 --- a/internal/jsre/completion.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package jsre - -import ( - "sort" - "strings" - - "github.com/dop251/goja" -) - -// CompleteKeywords returns potential continuations for the given line. Since line is -// evaluated, callers need to make sure that evaluating line does not have side effects. -func (re *JSRE) CompleteKeywords(line string) []string { - var results []string - re.Do(func(vm *goja.Runtime) { - results = getCompletions(vm, line) - }) - return results -} - -func getCompletions(vm *goja.Runtime, line string) (results []string) { - parts := strings.Split(line, ".") - if len(parts) == 0 { - return nil - } - - // Find the right-most fully named object in the line. e.g. if line = "x.y.z" - // and "x.y" is an object, obj will reference "x.y". - obj := vm.GlobalObject() - for i := 0; i < len(parts)-1; i++ { - v := obj.Get(parts[i]) - if v == nil { - return nil // No object was found - } - obj = v.ToObject(vm) - } - - // Go over the keys of the object and retain the keys matching prefix. - // Example: if line = "x.y.z" and "x.y" exists and has keys "zebu", "zebra" - // and "platypus", then "x.y.zebu" and "x.y.zebra" will be added to results. - prefix := parts[len(parts)-1] - iterOwnAndConstructorKeys(vm, obj, func(k string) { - if strings.HasPrefix(k, prefix) { - if len(parts) == 1 { - results = append(results, k) - } else { - results = append(results, strings.Join(parts[:len(parts)-1], ".")+"."+k) - } - } - }) - - // Append opening parenthesis (for functions) or dot (for objects) - // if the line itself is the only completion. - if len(results) == 1 && results[0] == line { - obj := obj.Get(parts[len(parts)-1]) - if obj != nil { - if _, isfunc := goja.AssertFunction(obj); isfunc { - results[0] += "(" - } else { - results[0] += "." - } - } - } - - sort.Strings(results) - return results -} diff --git a/internal/jsre/completion_test.go b/internal/jsre/completion_test.go deleted file mode 100644 index 2d05547d12e..00000000000 --- a/internal/jsre/completion_test.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package jsre - -import ( - "os" - "reflect" - "testing" -) - -func TestCompleteKeywords(t *testing.T) { - re := New("", os.Stdout) - re.Run(` - function theClass() { - this.foo = 3; - this.gazonk = {xyz: 4}; - } - theClass.prototype.someMethod = function () {}; - var x = new theClass(); - var y = new theClass(); - y.someMethod = function override() {}; - `) - - var tests = []struct { - input string - want []string - }{ - { - input: "St", - want: []string{"String"}, - }, - { - input: "x", - want: []string{"x."}, - }, - { - input: "x.someMethod", - want: []string{"x.someMethod("}, - }, - { - input: "x.", - want: []string{ - "x.constructor", - "x.foo", - "x.gazonk", - "x.someMethod", - }, - }, - { - input: "y.", - want: []string{ - "y.constructor", - "y.foo", - "y.gazonk", - "y.someMethod", - }, - }, - { - input: "x.gazonk.", - want: []string{ - "x.gazonk.constructor", - "x.gazonk.hasOwnProperty", - "x.gazonk.isPrototypeOf", - "x.gazonk.propertyIsEnumerable", - "x.gazonk.toLocaleString", - "x.gazonk.toString", - "x.gazonk.valueOf", - "x.gazonk.xyz", - }, - }, - } - for _, test := range tests { - cs := re.CompleteKeywords(test.input) - if !reflect.DeepEqual(cs, test.want) { - t.Errorf("wrong completions for %q\ngot %v\nwant %v", test.input, cs, test.want) - } - } -} diff --git a/internal/jsre/deps/bignumber.js b/internal/jsre/deps/bignumber.js deleted file mode 100644 index 17c8851e24e..00000000000 --- a/internal/jsre/deps/bignumber.js +++ /dev/null @@ -1,4 +0,0 @@ -/* bignumber.js v2.0.3 https://github.com/MikeMcl/bignumber.js/LICENCE */ -/* modified by zelig to fix https://github.com/robertkrimen/otto#regular-expression-incompatibility */ -!function(e){"use strict";function n(e){function a(e,n){var t,r,i,o,u,s,f=this;if(!(f instanceof a))return j&&L(26,"constructor call without new",e),new a(e,n);if(null!=n&&H(n,2,64,M,"base")){if(n=0|n,s=e+"",10==n)return f=new a(e instanceof a?e:s),U(f,P+f.e+1,k);if((o="number"==typeof e)&&0*e!=0||!new RegExp("^-?"+(t="["+O.slice(0,n)+"]+")+"(?:\\."+t+")?$",37>n?"i":"").test(s))return g(f,s,o,n);o?(f.s=0>1/e?(s=s.slice(1),-1):1,j&&s.replace(/^0\.0*|\./,"").length>15&&L(M,b,e),o=!1):f.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1,s=D(s,10,n,f.s)}else{if(e instanceof a)return f.s=e.s,f.e=e.e,f.c=(e=e.c)?e.slice():e,void(M=0);if((o="number"==typeof e)&&0*e==0){if(f.s=0>1/e?(e=-e,-1):1,e===~~e){for(r=0,i=e;i>=10;i/=10,r++);return f.e=r,f.c=[e],void(M=0)}s=e+""}else{if(!p.test(s=e+""))return g(f,s,o);f.s=45===s.charCodeAt(0)?(s=s.slice(1),-1):1}}for((r=s.indexOf("."))>-1&&(s=s.replace(".","")),(i=s.search(/e/i))>0?(0>r&&(r=i),r+=+s.slice(i+1),s=s.substring(0,i)):0>r&&(r=s.length),i=0;48===s.charCodeAt(i);i++);for(u=s.length;48===s.charCodeAt(--u););if(s=s.slice(i,u+1))if(u=s.length,o&&j&&u>15&&L(M,b,f.s*e),r=r-i-1,r>z)f.c=f.e=null;else if(G>r)f.c=[f.e=0];else{if(f.e=r,f.c=[],i=(r+1)%y,0>r&&(i+=y),u>i){for(i&&f.c.push(+s.slice(0,i)),u-=y;u>i;)f.c.push(+s.slice(i,i+=y));s=s.slice(i),i=y-s.length}else i-=u;for(;i--;s+="0");f.c.push(+s)}else f.c=[f.e=0];M=0}function D(e,n,t,i){var o,u,f,c,h,g,p,d=e.indexOf("."),m=P,w=k;for(37>t&&(e=e.toLowerCase()),d>=0&&(f=J,J=0,e=e.replace(".",""),p=new a(t),h=p.pow(e.length-d),J=f,p.c=s(l(r(h.c),h.e),10,n),p.e=p.c.length),g=s(e,t,n),u=f=g.length;0==g[--f];g.pop());if(!g[0])return"0";if(0>d?--u:(h.c=g,h.e=u,h.s=i,h=C(h,p,m,w,n),g=h.c,c=h.r,u=h.e),o=u+m+1,d=g[o],f=n/2,c=c||0>o||null!=g[o+1],c=4>w?(null!=d||c)&&(0==w||w==(h.s<0?3:2)):d>f||d==f&&(4==w||c||6==w&&1&g[o-1]||w==(h.s<0?8:7)),1>o||!g[0])e=c?l("1",-m):"0";else{if(g.length=o,c)for(--n;++g[--o]>n;)g[o]=0,o||(++u,g.unshift(1));for(f=g.length;!g[--f];);for(d=0,e="";f>=d;e+=O.charAt(g[d++]));e=l(e,u)}return e}function _(e,n,t,i){var o,u,s,c,h;if(t=null!=t&&H(t,0,8,i,v)?0|t:k,!e.c)return e.toString();if(o=e.c[0],s=e.e,null==n)h=r(e.c),h=19==i||24==i&&B>=s?f(h,s):l(h,s);else if(e=U(new a(e),n,t),u=e.e,h=r(e.c),c=h.length,19==i||24==i&&(u>=n||B>=u)){for(;n>c;h+="0",c++);h=f(h,u)}else if(n-=s,h=l(h,u),u+1>c){if(--n>0)for(h+=".";n--;h+="0");}else if(n+=u-c,n>0)for(u+1==c&&(h+=".");n--;h+="0");return e.s<0&&o?"-"+h:h}function x(e,n){var t,r,i=0;for(u(e[0])&&(e=e[0]),t=new a(e[0]);++ie||e>t||e!=c(e))&&L(r,(i||"decimal places")+(n>e||e>t?" out of range":" not an integer"),e),!0}function I(e,n,t){for(var r=1,i=n.length;!n[--i];n.pop());for(i=n[0];i>=10;i/=10,r++);return(t=r+t*y-1)>z?e.c=e.e=null:G>t?e.c=[e.e=0]:(e.e=t,e.c=n),e}function L(e,n,t){var r=new Error(["new BigNumber","cmp","config","div","divToInt","eq","gt","gte","lt","lte","minus","mod","plus","precision","random","round","shift","times","toDigits","toExponential","toFixed","toFormat","toFraction","pow","toPrecision","toString","BigNumber"][e]+"() "+n+": "+t);throw r.name="BigNumber Error",M=0,r}function U(e,n,t,r){var i,o,u,s,f,l,c,a=e.c,h=R;if(a){e:{for(i=1,s=a[0];s>=10;s/=10,i++);if(o=n-i,0>o)o+=y,u=n,f=a[l=0],c=f/h[i-u-1]%10|0;else if(l=d((o+1)/y),l>=a.length){if(!r)break e;for(;a.length<=l;a.push(0));f=c=0,i=1,o%=y,u=o-y+1}else{for(f=s=a[l],i=1;s>=10;s/=10,i++);o%=y,u=o-y+i,c=0>u?0:f/h[i-u-1]%10|0}if(r=r||0>n||null!=a[l+1]||(0>u?f:f%h[i-u-1]),r=4>t?(c||r)&&(0==t||t==(e.s<0?3:2)):c>5||5==c&&(4==t||r||6==t&&(o>0?u>0?f/h[i-u]:0:a[l-1])%10&1||t==(e.s<0?8:7)),1>n||!a[0])return a.length=0,r?(n-=e.e+1,a[0]=h[n%y],e.e=-n||0):a[0]=e.e=0,e;if(0==o?(a.length=l,s=1,l--):(a.length=l+1,s=h[y-o],a[l]=u>0?m(f/h[i-u]%h[u])*s:0),r)for(;;){if(0==l){for(o=1,u=a[0];u>=10;u/=10,o++);for(u=a[0]+=s,s=1;u>=10;u/=10,s++);o!=s&&(e.e++,a[0]==N&&(a[0]=1));break}if(a[l]+=s,a[l]!=N)break;a[l--]=0,s=1}for(o=a.length;0===a[--o];a.pop());}e.e>z?e.c=e.e=null:e.et?null!=(e=i[t++]):void 0};return f(n="DECIMAL_PLACES")&&H(e,0,E,2,n)&&(P=0|e),r[n]=P,f(n="ROUNDING_MODE")&&H(e,0,8,2,n)&&(k=0|e),r[n]=k,f(n="EXPONENTIAL_AT")&&(u(e)?H(e[0],-E,0,2,n)&&H(e[1],0,E,2,n)&&(B=0|e[0],$=0|e[1]):H(e,-E,E,2,n)&&(B=-($=0|(0>e?-e:e)))),r[n]=[B,$],f(n="RANGE")&&(u(e)?H(e[0],-E,-1,2,n)&&H(e[1],1,E,2,n)&&(G=0|e[0],z=0|e[1]):H(e,-E,E,2,n)&&(0|e?G=-(z=0|(0>e?-e:e)):j&&L(2,n+" cannot be zero",e))),r[n]=[G,z],f(n="ERRORS")&&(e===!!e||1===e||0===e?(M=0,H=(j=!!e)?F:o):j&&L(2,n+w,e)),r[n]=j,f(n="CRYPTO")&&(e===!!e||1===e||0===e?(V=!(!e||!h||"object"!=typeof h),e&&!V&&j&&L(2,"crypto unavailable",h)):j&&L(2,n+w,e)),r[n]=V,f(n="MODULO_MODE")&&H(e,0,9,2,n)&&(W=0|e),r[n]=W,f(n="POW_PRECISION")&&H(e,0,E,2,n)&&(J=0|e),r[n]=J,f(n="FORMAT")&&("object"==typeof e?X=e:j&&L(2,n+" not an object",e)),r[n]=X,r},a.max=function(){return x(arguments,T.lt)},a.min=function(){return x(arguments,T.gt)},a.random=function(){var e=9007199254740992,n=Math.random()*e&2097151?function(){return m(Math.random()*e)}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(e){var t,r,i,o,u,s=0,f=[],l=new a(q);if(e=null!=e&&H(e,0,E,14)?0|e:P,o=d(e/y),V)if(h&&h.getRandomValues){for(t=h.getRandomValues(new Uint32Array(o*=2));o>s;)u=131072*t[s]+(t[s+1]>>>11),u>=9e15?(r=h.getRandomValues(new Uint32Array(2)),t[s]=r[0],t[s+1]=r[1]):(f.push(u%1e14),s+=2);s=o/2}else if(h&&h.randomBytes){for(t=h.randomBytes(o*=7);o>s;)u=281474976710656*(31&t[s])+1099511627776*t[s+1]+4294967296*t[s+2]+16777216*t[s+3]+(t[s+4]<<16)+(t[s+5]<<8)+t[s+6],u>=9e15?h.randomBytes(7).copy(t,s):(f.push(u%1e14),s+=7);s=o/7}else j&&L(14,"crypto unavailable",h);if(!s)for(;o>s;)u=n(),9e15>u&&(f[s++]=u%1e14);for(o=f[--s],e%=y,o&&e&&(u=R[y-e],f[s]=m(o/u)*u);0===f[s];f.pop(),s--);if(0>s)f=[i=0];else{for(i=-1;0===f[0];f.shift(),i-=y);for(s=1,u=f[0];u>=10;u/=10,s++);y>s&&(i-=y-s)}return l.e=i,l.c=f,l}}(),C=function(){function e(e,n,t){var r,i,o,u,s=0,f=e.length,l=n%A,c=n/A|0;for(e=e.slice();f--;)o=e[f]%A,u=e[f]/A|0,r=c*o+u*l,i=l*o+r%A*A+s,s=(i/t|0)+(r/A|0)+c*u,e[f]=i%t;return s&&e.unshift(s),e}function n(e,n,t,r){var i,o;if(t!=r)o=t>r?1:-1;else for(i=o=0;t>i;i++)if(e[i]!=n[i]){o=e[i]>n[i]?1:-1;break}return o}function r(e,n,t,r){for(var i=0;t--;)e[t]-=i,i=e[t]1;e.shift());}return function(i,o,u,s,f){var l,c,h,g,p,d,w,v,b,O,S,R,A,E,D,_,x,F=i.s==o.s?1:-1,I=i.c,L=o.c;if(!(I&&I[0]&&L&&L[0]))return new a(i.s&&o.s&&(I?!L||I[0]!=L[0]:L)?I&&0==I[0]||!L?0*F:F/0:0/0);for(v=new a(F),b=v.c=[],c=i.e-o.e,F=u+c+1,f||(f=N,c=t(i.e/y)-t(o.e/y),F=F/y|0),h=0;L[h]==(I[h]||0);h++);if(L[h]>(I[h]||0)&&c--,0>F)b.push(1),g=!0;else{for(E=I.length,_=L.length,h=0,F+=2,p=m(f/(L[0]+1)),p>1&&(L=e(L,p,f),I=e(I,p,f),_=L.length,E=I.length),A=_,O=I.slice(0,_),S=O.length;_>S;O[S++]=0);x=L.slice(),x.unshift(0),D=L[0],L[1]>=f/2&&D++;do p=0,l=n(L,O,_,S),0>l?(R=O[0],_!=S&&(R=R*f+(O[1]||0)),p=m(R/D),p>1?(p>=f&&(p=f-1),d=e(L,p,f),w=d.length,S=O.length,l=n(d,O,w,S),1==l&&(p--,r(d,w>_?x:L,w,f))):(0==p&&(l=p=1),d=L.slice()),w=d.length,S>w&&d.unshift(0),r(O,d,S,f),-1==l&&(S=O.length,l=n(L,O,_,S),1>l&&(p++,r(O,S>_?x:L,S,f))),S=O.length):0===l&&(p++,O=[0]),b[h++]=p,l&&O[0]?O[S++]=I[A]||0:(O=[I[A]],S=1);while((A++=10;F/=10,h++);U(v,u+(v.e=h+c*y-1)+1,s,g)}else v.e=c,v.r=+g;return v}}(),g=function(){var e=/^(-?)0([xbo])(\w[\w.]*$)/i,n=/^([^.]+)\.$/,t=/^\.([^.]+)$/,r=/^-?(Infinity|NaN)$/,i=/^\s*\+([\w.])|^\s+|\s+$/g;return function(o,u,s,f){var l,c=s?u:u.replace(i,"$1");if(r.test(c))o.s=isNaN(c)?null:0>c?-1:1;else{if(!s&&(c=c.replace(e,function(e,n,t){return l="x"==(t=t.toLowerCase())?16:"b"==t?2:8,f&&f!=l?e:n}),f&&(l=f,c=c.replace(n,"$1").replace(t,"0.$1")),u!=c))return new a(c,l);j&&L(M,"not a"+(f?" base "+f:"")+" number",u),o.s=null}o.c=o.e=null,M=0}}(),T.absoluteValue=T.abs=function(){var e=new a(this);return e.s<0&&(e.s=1),e},T.ceil=function(){return U(new a(this),this.e+1,2)},T.comparedTo=T.cmp=function(e,n){return M=1,i(this,new a(e,n))},T.decimalPlaces=T.dp=function(){var e,n,r=this.c;if(!r)return null;if(e=((n=r.length-1)-t(this.e/y))*y,n=r[n])for(;n%10==0;n/=10,e--);return 0>e&&(e=0),e},T.dividedBy=T.div=function(e,n){return M=3,C(this,new a(e,n),P,k)},T.dividedToIntegerBy=T.divToInt=function(e,n){return M=4,C(this,new a(e,n),0,1)},T.equals=T.eq=function(e,n){return M=5,0===i(this,new a(e,n))},T.floor=function(){return U(new a(this),this.e+1,3)},T.greaterThan=T.gt=function(e,n){return M=6,i(this,new a(e,n))>0},T.greaterThanOrEqualTo=T.gte=function(e,n){return M=7,1===(n=i(this,new a(e,n)))||0===n},T.isFinite=function(){return!!this.c},T.isInteger=T.isInt=function(){return!!this.c&&t(this.e/y)>this.c.length-2},T.isNaN=function(){return!this.s},T.isNegative=T.isNeg=function(){return this.s<0},T.isZero=function(){return!!this.c&&0==this.c[0]},T.lessThan=T.lt=function(e,n){return M=8,i(this,new a(e,n))<0},T.lessThanOrEqualTo=T.lte=function(e,n){return M=9,-1===(n=i(this,new a(e,n)))||0===n},T.minus=T.sub=function(e,n){var r,i,o,u,s=this,f=s.s;if(M=10,e=new a(e,n),n=e.s,!f||!n)return new a(0/0);if(f!=n)return e.s=-n,s.plus(e);var l=s.e/y,c=e.e/y,h=s.c,g=e.c;if(!l||!c){if(!h||!g)return h?(e.s=-n,e):new a(g?s:0/0);if(!h[0]||!g[0])return g[0]?(e.s=-n,e):new a(h[0]?s:3==k?-0:0)}if(l=t(l),c=t(c),h=h.slice(),f=l-c){for((u=0>f)?(f=-f,o=h):(c=l,o=g),o.reverse(),n=f;n--;o.push(0));o.reverse()}else for(i=(u=(f=h.length)<(n=g.length))?f:n,f=n=0;i>n;n++)if(h[n]!=g[n]){u=h[n]0)for(;n--;h[r++]=0);for(n=N-1;i>f;){if(h[--i]0?(s=u,r=l):(o=-o,r=f),r.reverse();o--;r.push(0));r.reverse()}for(o=f.length,n=l.length,0>o-n&&(r=l,l=f,f=r,n=o),o=0;n;)o=(f[--n]=f[n]+l[n]+o)/N|0,f[n]%=N;return o&&(f.unshift(o),++s),I(e,f,s)},T.precision=T.sd=function(e){var n,t,r=this,i=r.c;if(null!=e&&e!==!!e&&1!==e&&0!==e&&(j&&L(13,"argument"+w,e),e!=!!e&&(e=null)),!i)return null;if(t=i.length-1,n=t*y+1,t=i[t]){for(;t%10==0;t/=10,n--);for(t=i[0];t>=10;t/=10,n++);}return e&&r.e+1>n&&(n=r.e+1),n},T.round=function(e,n){var t=new a(this);return(null==e||H(e,0,E,15))&&U(t,~~e+this.e+1,null!=n&&H(n,0,8,15,v)?0|n:k),t},T.shift=function(e){var n=this;return H(e,-S,S,16,"argument")?n.times("1e"+c(e)):new a(n.c&&n.c[0]&&(-S>e||e>S)?n.s*(0>e?0:1/0):n)},T.squareRoot=T.sqrt=function(){var e,n,i,o,u,s=this,f=s.c,l=s.s,c=s.e,h=P+4,g=new a("0.5");if(1!==l||!f||!f[0])return new a(!l||0>l&&(!f||f[0])?0/0:f?s:1/0);if(l=Math.sqrt(+s),0==l||l==1/0?(n=r(f),(n.length+c)%2==0&&(n+="0"),l=Math.sqrt(n),c=t((c+1)/2)-(0>c||c%2),l==1/0?n="1e"+c:(n=l.toExponential(),n=n.slice(0,n.indexOf("e")+1)+c),i=new a(n)):i=new a(l+""),i.c[0])for(c=i.e,l=c+h,3>l&&(l=0);;)if(u=i,i=g.times(u.plus(C(s,u,h,1))),r(u.c).slice(0,l)===(n=r(i.c)).slice(0,l)){if(i.el&&(m=O,O=S,S=m,o=l,l=g,g=o),o=l+g,m=[];o--;m.push(0));for(w=N,v=A,o=g;--o>=0;){for(r=0,p=S[o]%v,d=S[o]/v|0,s=l,u=o+s;u>o;)c=O[--s]%v,h=O[s]/v|0,f=d*c+h*p,c=p*c+f%v*v+m[u]+r,r=(c/w|0)+(f/v|0)+d*h,m[u--]=c%w;m[u]=r}return r?++i:m.shift(),I(e,m,i)},T.toDigits=function(e,n){var t=new a(this);return e=null!=e&&H(e,1,E,18,"precision")?0|e:null,n=null!=n&&H(n,0,8,18,v)?0|n:k,e?U(t,e,n):t},T.toExponential=function(e,n){return _(this,null!=e&&H(e,0,E,19)?~~e+1:null,n,19)},T.toFixed=function(e,n){return _(this,null!=e&&H(e,0,E,20)?~~e+this.e+1:null,n,20)},T.toFormat=function(e,n){var t=_(this,null!=e&&H(e,0,E,21)?~~e+this.e+1:null,n,21);if(this.c){var r,i=t.split("."),o=+X.groupSize,u=+X.secondaryGroupSize,s=X.groupSeparator,f=i[0],l=i[1],c=this.s<0,a=c?f.slice(1):f,h=a.length;if(u&&(r=o,o=u,u=r,h-=r),o>0&&h>0){for(r=h%o||o,f=a.substr(0,r);h>r;r+=o)f+=s+a.substr(r,o);u>0&&(f+=s+a.slice(r)),c&&(f="-"+f)}t=l?f+X.decimalSeparator+((u=+X.fractionGroupSize)?l.replace(new RegExp("\\d{"+u+"}\\B","g"),"$&"+X.fractionGroupSeparator):l):f}return t},T.toFraction=function(e){var n,t,i,o,u,s,f,l,c,h=j,g=this,p=g.c,d=new a(q),m=t=new a(q),w=f=new a(q);if(null!=e&&(j=!1,s=new a(e),j=h,(!(h=s.isInt())||s.lt(q))&&(j&&L(22,"max denominator "+(h?"out of range":"not an integer"),e),e=!h&&s.c&&U(s,s.e+1,1).gte(q)?s:null)),!p)return g.toString();for(c=r(p),o=d.e=c.length-g.e-1,d.c[0]=R[(u=o%y)<0?y+u:u],e=!e||s.cmp(d)>0?o>0?d:m:s,u=z,z=1/0,s=new a(c),f.c[0]=0;l=C(s,d,0,1),i=t.plus(l.times(w)),1!=i.cmp(e);)t=w,w=i,m=f.plus(l.times(i=m)),f=i,d=s.minus(l.times(i=d)),s=i;return i=C(e.minus(t),w,0,1),f=f.plus(i.times(m)),t=t.plus(i.times(w)),f.s=m.s=g.s,o*=2,n=C(m,w,o,k).minus(g).abs().cmp(C(f,t,o,k).minus(g).abs())<1?[m.toString(),w.toString()]:[f.toString(),t.toString()],z=u,n},T.toNumber=function(){var e=this;return+e||(e.s?0*e.s:0/0)},T.toPower=T.pow=function(e){var n,t,r=m(0>e?-e:+e),i=this;if(!H(e,-S,S,23,"exponent")&&(!isFinite(e)||r>S&&(e/=0)||parseFloat(e)!=e&&!(e=0/0)))return new a(Math.pow(+i,e));for(n=J?d(J/y+2):0,t=new a(q);;){if(r%2){if(t=t.times(i),!t.c)break;n&&t.c.length>n&&(t.c.length=n)}if(r=m(r/2),!r)break;i=i.times(i),n&&i.c&&i.c.length>n&&(i.c.length=n)}return 0>e&&(t=q.div(t)),n?U(t,J,k):t},T.toPrecision=function(e,n){return _(this,null!=e&&H(e,1,E,24,"precision")?0|e:null,n,24)},T.toString=function(e){var n,t=this,i=t.s,o=t.e;return null===o?i?(n="Infinity",0>i&&(n="-"+n)):n="NaN":(n=r(t.c),n=null!=e&&H(e,2,64,25,"base")?D(l(n,o),0|e,10,i):B>=o||o>=$?f(n,o):l(n,o),0>i&&t.c[0]&&(n="-"+n)),n},T.truncated=T.trunc=function(){return U(new a(this),this.e+1,1)},T.valueOf=T.toJSON=function(){return this.toString()},null!=e&&a.config(e),a}function t(e){var n=0|e;return e>0||e===n?n:n-1}function r(e){for(var n,t,r=1,i=e.length,o=e[0]+"";i>r;){for(n=e[r++]+"",t=y-n.length;t--;n="0"+n);o+=n}for(i=o.length;48===o.charCodeAt(--i););return o.slice(0,i+1||1)}function i(e,n){var t,r,i=e.c,o=n.c,u=e.s,s=n.s,f=e.e,l=n.e;if(!u||!s)return null;if(t=i&&!i[0],r=o&&!o[0],t||r)return t?r?0:-s:u;if(u!=s)return u;if(t=0>u,r=f==l,!i||!o)return r?0:!i^t?1:-1;if(!r)return f>l^t?1:-1;for(s=(f=i.length)<(l=o.length)?f:l,u=0;s>u;u++)if(i[u]!=o[u])return i[u]>o[u]^t?1:-1;return f==l?0:f>l^t?1:-1}function o(e,n,t){return(e=c(e))>=n&&t>=e}function u(e){return"[object Array]"==Object.prototype.toString.call(e)}function s(e,n,t){for(var r,i,o=[0],u=0,s=e.length;s>u;){for(i=o.length;i--;o[i]*=n);for(o[r=0]+=O.indexOf(e.charAt(u++));rt-1&&(null==o[r+1]&&(o[r+1]=0),o[r+1]+=o[r]/t|0,o[r]%=t)}return o.reverse()}function f(e,n){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(0>n?"e":"e+")+n}function l(e,n){var t,r;if(0>n){for(r="0.";++n;r+="0");e=r+e}else if(t=e.length,++n>t){for(r="0",n-=t;--n;r+="0");e+=r}else t>n&&(e=e.slice(0,n)+"."+e.slice(n));return e}function c(e){return e=parseFloat(e),0>e?d(e):m(e)}var a,h,g,p=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,d=Math.ceil,m=Math.floor,w=" not a boolean or binary digit",v="rounding mode",b="number type has more than 15 significant digits",O="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_",N=1e14,y=14,S=9007199254740991,R=[1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13],A=1e7,E=1e9;if(a=n(),"function"==typeof define&&define.amd)define(function(){return a});else if("undefined"!=typeof module&&module.exports){if(module.exports=a,!h)try{h=require("crypto")}catch(D){}}else e.BigNumber=a}(this); -//# sourceMappingURL=doc/bignumber.js.map diff --git a/internal/jsre/deps/bindata.go b/internal/jsre/deps/bindata.go deleted file mode 100644 index a6545b7140d..00000000000 --- a/internal/jsre/deps/bindata.go +++ /dev/null @@ -1,267 +0,0 @@ -// Package deps Code generated by go-bindata. (@generated) DO NOT EDIT. -// sources: -// bignumber.js -// web3.js -package deps - -import ( - "bytes" - "compress/gzip" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -func bindataRead(data []byte, name string) ([]byte, error) { - gz, err := gzip.NewReader(bytes.NewBuffer(data)) - if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) - } - - var buf bytes.Buffer - _, err = io.Copy(&buf, gz) - clErr := gz.Close() - - if err != nil { - return nil, fmt.Errorf("read %q: %v", name, err) - } - if clErr != nil { - return nil, err - } - - return buf.Bytes(), nil -} - -type asset struct { - bytes []byte - info os.FileInfo -} - -type bindataFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -// Name return file name -func (fi bindataFileInfo) Name() string { - return fi.name -} - -// Size return file size -func (fi bindataFileInfo) Size() int64 { - return fi.size -} - -// Mode return file mode -func (fi bindataFileInfo) Mode() os.FileMode { - return fi.mode -} - -// ModTime return file modify time -func (fi bindataFileInfo) ModTime() time.Time { - return fi.modTime -} - -// IsDir return file whether a directory -func (fi bindataFileInfo) IsDir() bool { - return fi.mode&os.ModeDir != 0 -} - -// Sys return file is sys mode -func (fi bindataFileInfo) Sys() interface{} { - return nil -} - -var _bignumberJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\xbc\x6b\x77\x9b\xc8\x93\x38\xfc\x7e\x3f\x85\xc4\xc6\x9c\x6e\x53\x20\x90\x9d\x38\x86\x14\x9c\x4c\x62\xe7\xe7\x79\x1c\x3b\x4f\x9c\xcc\xcc\xae\xa2\xc9\x91\x51\x23\x75\x82\x40\xe1\x62\xc7\x09\xfe\x7d\xf6\xff\xa9\x6e\x40\xf2\x25\xbb\xb3\x6f\x2c\xe8\x4b\x75\x75\x75\xdd\xbb\xf0\x68\x77\x70\x29\x17\x59\xbd\xba\x14\x85\xf3\xa5\x1c\x5c\x8d\x1d\xd7\xd9\x1b\x2c\xab\x6a\x5d\xfa\xa3\xd1\x42\x56\xcb\xfa\xd2\x89\xf3\xd5\xe8\xad\xfc\x2a\xde\xc6\xe9\x68\x7b\xf8\xe8\xf4\xe4\xd5\xd1\xd9\xab\xa3\xc1\xee\xe8\x3f\x46\xbb\x83\x55\x3e\x97\x89\x14\xf3\xc1\xe5\xcd\xe0\x87\x48\xe5\x62\x50\xe5\x83\x44\x7e\x7f\x0c\x5c\x91\x5f\x8a\xa2\xfa\x5a\xc8\x95\xc8\x46\x79\x55\xe5\xff\x59\x88\x45\x9d\xce\x0a\x5b\x7c\x5f\x17\xa2\x2c\x65\x9e\xd9\x32\x8b\xf3\xd5\x7a\x56\xc9\x4b\x99\xca\xea\x86\x96\x19\x26\x75\x16\x57\x32\xcf\x98\xe0\x3f\x8d\xba\x14\x83\xb2\x2a\x64\x5c\x19\x41\xd7\x31\x50\x5d\xfd\xdb\x8c\x09\xc8\xf8\xcf\xab\x59\x31\xa8\xa0\x00\x09\x39\xd4\x50\x42\x82\xd5\x52\x96\x81\x4c\xd8\x90\x25\x03\x99\x95\xd5\x2c\x8b\x45\x9e\x0c\x66\x9c\x17\xa2\xaa\x8b\x6c\xf0\xc5\x34\x4f\xd9\xf8\x19\x18\x71\x9e\x95\x55\x51\xc7\x55\x5e\x0c\xe2\x59\x9a\x0e\xae\x65\xb5\xcc\xeb\x6a\x90\x89\x6b\x03\x04\x87\x4c\x5c\xb7\xeb\x10\xc0\xac\x4e\xd3\x21\x66\xa6\xf9\x2f\x96\xc1\x18\x9e\xed\xc3\x5b\x30\x2e\x67\xa5\x30\x38\xff\x49\xfd\xe8\x36\x19\x94\x28\x2c\xc3\x00\xcf\x45\xcc\xba\x15\x13\x6c\x21\xdd\x41\x28\x12\x7e\xc9\xe1\x23\x4b\xe0\x9d\x95\x38\xc2\xf2\xe0\xab\x5a\x87\xe5\x68\xe8\xa3\x30\x10\xab\x9b\x35\x0d\x16\xdc\x34\xdd\x5d\x31\x44\xb7\x69\x86\x04\xec\xbd\x58\x1c\x7d\x5f\x33\xe3\x6f\x3b\x32\x2c\x56\xa1\x31\x31\xac\x73\xa7\x4c\x65\x2c\x98\x0b\x19\xb7\x8c\xa9\x65\x70\xcb\x60\x91\xff\xe9\x93\x63\x58\x95\x65\xf0\xe8\x89\x01\x7b\x07\x61\x16\x19\xd2\xf0\x0d\x83\x3b\x95\x28\x2b\x56\xf6\x84\x59\xb0\x04\x4a\xc8\x69\xbb\x79\xc4\x12\xa7\x44\x37\xf4\x46\x22\x62\x25\x96\x2d\x68\x8f\x83\xed\x71\xdf\x83\x2f\xa6\x59\x3a\x85\x58\xa7\xb3\x58\xb0\xd1\xdf\xee\x27\xc7\xdd\x6d\x3e\x39\x23\x20\xb8\xa9\xc8\x16\xd5\x32\xf4\x9e\x12\xa5\xdf\xc2\x25\xd1\x32\xc7\xa1\xc7\x7d\x02\xba\xff\x14\x11\x4b\x27\x5e\xce\x8a\x57\xf9\x5c\xbc\xac\x98\xcb\x1f\x5d\xa3\xc4\xd7\xac\x04\xcf\x85\x0c\x12\xa7\xe4\xb7\x22\x2d\x05\x11\xfa\x2e\x19\x7b\x22\x3b\x25\x0a\xa7\x84\xc4\x11\x28\x1c\x01\x89\x13\x23\xa3\xc7\x98\x47\xa2\x05\xcd\x7d\x01\x57\xb9\x9c\xb3\xb7\xe8\xfe\x6f\xb4\x46\x74\xd5\xb1\x6e\xd1\x41\xa0\x2d\x5a\xdc\x04\x22\xfe\xfb\xdf\xc4\x90\x79\xc1\x0a\x74\x41\xa2\x08\x64\x88\x9e\x1b\xc8\x11\x7a\x2e\x14\x96\xc5\x83\x1e\x35\x81\x85\x42\x68\x22\xa6\x1b\x04\x6e\x35\xaf\xf4\xfb\x1a\xae\xdb\x13\x51\xcd\xf7\x8f\x85\x07\xff\x17\xe2\xdd\xde\x12\x62\xac\xc0\xd2\x91\xd9\x5c\x7c\x3f\x4f\x98\xe1\x18\x9c\x87\xb6\x67\x9a\x6a\x7c\x77\x78\x86\x63\xd0\xa1\x71\x60\x92\xa0\x88\x59\x11\x2f\xd9\x48\x8c\x24\xe7\xa1\x1b\x31\x37\x2c\x4c\x93\x15\x28\x39\x14\x16\x5a\xdd\x3a\xd2\xf2\x38\xa8\x65\xeb\x4b\x92\xd4\x6c\xc1\x5c\x90\x9c\xfb\xdd\xf8\xb2\xe5\x02\x0e\x12\xdd\x60\xff\xf9\x7d\xb4\x25\x0f\x24\x91\x88\xd0\xac\xfb\xd1\x8f\x0c\xb4\xed\x9a\x07\xea\xb0\x36\xbb\x94\x50\x5b\x1e\xe7\x32\xd9\x9a\x0a\xb9\x69\x7e\x31\xcd\x7a\x8b\xed\x12\xa7\xdc\x15\x1c\x0a\x2c\x6c\x69\x7b\x50\x84\x3f\x38\x1d\x02\x1d\x07\x09\x73\x40\x84\x1f\xc8\x84\xbd\x09\x0b\xd5\x31\xa1\x1e\x77\x1a\x74\x07\xb2\x75\x6e\x53\x90\xc8\x0a\xcb\xe3\x3b\x37\xa0\xb7\x28\x2d\xbc\xe1\x50\x87\x52\xf3\x80\x34\xcd\xc4\x89\x9d\x75\x5d\x2e\x59\x4f\x25\x45\x12\xa8\x6d\xbc\x09\xea\x50\x06\xfc\xe1\x08\x09\x0a\x0e\x0f\xb6\x36\x47\x24\xbb\xb1\xbb\x7d\xdd\x6a\x2c\x6d\xac\x15\xad\x02\x69\xdb\x41\x69\xa1\xe1\x1a\xc4\x11\x3d\x3c\x2d\x1e\x83\xed\x6d\xbc\x45\xf7\xb6\xd7\x97\xaf\x49\x8f\x41\x05\x52\xeb\x4c\xd2\x96\x09\xc4\xb0\x84\x05\xac\x61\x8e\xe2\x0e\x9b\xc0\x0a\xdf\xc1\x35\x7e\x55\x2b\xee\x1d\x84\x95\x69\x2a\x51\xaa\xf2\xd3\xfc\x5a\x14\xaf\x66\xa5\x60\x9c\xc3\x3c\x44\xd7\x34\x59\x82\xbf\xc3\xef\xe8\x02\x8d\xb8\xc7\x55\xb0\x6e\x55\x5f\xc5\x61\x89\x6b\x67\x9d\x5f\x33\xd1\x6e\xcc\x9e\x73\xf8\x1d\x13\x58\x3b\x31\x96\x2c\x65\x05\x5b\x3a\x31\x87\xa5\x23\xb8\x12\x7a\x0e\x6b\x47\xe0\xda\x89\x7b\x4e\x5a\x60\xc9\x04\x54\xd4\x55\x63\x82\x8b\x8e\x69\x5c\xc4\xc5\xc4\xb6\x93\x69\xb0\x70\xd6\xf9\x9a\x71\xc5\x2e\xc3\xc5\xc4\x9d\xb6\x42\x64\xb8\x06\x35\xb9\xe1\x3c\xb2\xed\xda\xa7\x95\x70\x41\x4b\x61\x0d\x4b\xa7\x44\x09\x4b\x7c\xc5\x96\xb0\x86\x15\x5c\x13\xfc\x05\x2e\x9d\x18\x62\x5c\x3a\x05\xd4\xa8\x70\xca\xb1\xb6\x56\x96\x07\x73\x5c\x4c\xf2\x29\x24\x98\x8d\xc6\x10\x63\xdc\x34\x6e\x98\x37\x8d\x36\x0f\x8b\x49\x6e\x79\x53\x88\x71\x3f\xbc\x8e\x5a\x93\x31\x6f\x9a\x98\x9b\x26\x73\x11\xaf\x9b\xe6\x1a\x91\x2d\x9d\xf2\x85\x1b\xed\xf9\x63\xce\xfd\x79\x98\x34\xcd\x1c\x31\x31\x4d\xb6\xaf\x46\xc4\x4d\xf3\x0c\xf1\xda\x34\x3d\x73\x31\xc9\x6d\x6f\xba\x3d\xe9\xb9\x7f\xc0\x39\x78\xb4\xa2\xde\xa0\xc0\x38\x4a\x99\xe1\x19\x60\xaf\xb8\x4f\x1b\xed\xd8\xb7\xa3\x0f\xe6\x10\x73\x3a\x49\xdb\xce\x02\xcb\x22\x52\xe5\xd3\x30\x0b\x38\xed\x03\x5d\xc8\x9b\x86\x59\x56\x0d\x0b\xa7\xce\xca\xa5\x4c\x2a\xe6\x71\x2d\x98\x5b\x34\x1e\xb6\x14\xd6\x1d\x73\x75\xdc\x86\x11\x24\x21\xce\x03\x61\xe1\xb9\x12\xd9\x97\x15\x5b\x4c\xe6\x96\x35\xe5\x3c\x10\x98\x32\x01\x35\xbf\x6d\xd5\x98\xd8\xf0\xe2\xe7\x87\xbc\x58\x12\x2f\xd2\x11\x55\xa8\x89\x56\x91\x9d\xad\xc0\x85\xe7\x20\xe1\x8a\x47\x6e\x53\xf9\x5f\x61\x48\xea\xbc\x03\xe8\x54\xf9\x85\x56\x3d\xea\xbc\x73\xd2\xf5\x13\x77\x4a\x26\xd8\x11\x40\x60\xc8\x06\x2f\xb1\x60\x42\x31\x16\x7a\x87\x88\xb2\x69\xc6\xfb\x88\xd2\x34\x7f\x0b\xb1\x8c\x12\xb6\x84\x92\xfb\xa9\xfa\xe9\x15\x82\xc0\x8f\xac\x35\xd9\x9c\x30\x25\x7e\x23\x98\x3d\x2c\x62\x8c\x56\xed\xdc\x05\xca\xea\x10\xb3\xa6\xf9\x2d\xc4\x9a\x6b\xc5\x10\x64\x61\x1c\x2c\x95\xc0\x42\x4c\x1a\x6f\x89\xb4\x68\xdd\x0a\x2c\x39\x0e\x36\x96\xb0\xc4\x54\xb5\x92\x66\x0b\x63\x65\x79\x6c\x3b\x0b\x5d\x75\x70\x34\xdd\x31\x82\xcc\xb6\x5b\x48\x3c\xd8\xcc\xb6\xb0\xb6\x63\xe8\x86\xd6\x96\x87\x18\x9b\x66\x3b\x87\xdf\x99\xd4\x53\xae\x7c\xe1\x9a\x66\x1e\x19\xb6\x61\x2d\xfd\xe5\xe6\x64\xbe\xdf\xf3\xaa\xd0\xd5\x0a\x9a\x09\x62\x35\xad\x05\xe8\x09\xaa\xce\xa5\xa1\xb7\xc0\xb2\xe4\x8b\x4e\xac\x03\x85\x7b\xd1\xf7\xcb\x29\x87\x61\xe1\x94\xfc\x67\x85\x45\x70\x59\x88\xd9\xd7\xdb\xcc\x21\x7f\x8b\x55\x50\x10\xcc\x0a\x8b\x9e\x4b\xaa\x0d\x2e\xc7\x2d\x97\x14\xc4\x27\xba\x9b\x65\xa1\x68\x1a\x11\x56\x4d\x23\x86\x18\x33\xc1\x39\xe9\xfa\x02\x98\x6c\x1a\x63\x2e\x62\xb9\x9a\xa5\x03\xa5\x81\x4a\x83\x5b\xfd\xf0\xc8\x18\x90\x5f\x97\x27\x83\x62\x96\x2d\x84\xe1\x1b\x83\x2c\xaf\x06\xb3\x6c\x20\xb3\x4a\x2c\x44\x61\x70\xf2\x51\x86\x5b\xfa\xf2\x44\xaf\xae\xcf\x90\xe8\x51\xa0\x07\x12\xb3\x5e\x1e\xb2\x89\x6d\xcb\x69\x90\x75\x1a\x47\x19\x01\xcc\x26\xee\xf4\x57\x7e\x00\x6d\xd4\xaa\x76\x6f\x6c\x8f\x87\x3f\x22\xe1\xc4\xc4\x53\x8a\xdd\xfd\x37\x61\xa5\x1a\x26\x42\xa9\x6e\x9f\xd1\x6f\x05\xd4\x94\x71\xd8\x12\x9d\xd3\x0e\x2d\x8d\x12\x11\xf9\xa8\x28\xf2\x82\x4d\x0c\x7a\xfe\x4d\x2e\xce\xb4\x3b\x03\x46\xbc\x5a\x1b\xca\xc9\x4d\xe4\xc2\x00\x63\x2e\xaf\xf4\xdf\x0f\xf9\x49\x56\x19\x60\x88\x6f\x06\x18\x8b\x4a\xfd\x11\x06\x18\x69\xa5\xfe\xd0\xe3\x4a\x66\x75\x49\xbf\xf9\xdc\x00\x63\x9d\xaa\x97\x75\x21\x62\x49\xfe\xbb\x01\x46\x31\xcb\xe6\xf9\x8a\x1e\xf2\x3a\xa3\x31\x4a\x6f\x18\x60\x54\x72\x25\x68\x70\x95\xbf\x96\x0b\x59\xe9\xc7\xa3\xef\xeb\x3c\x13\x59\x25\x67\xa9\x7a\x3f\x96\xdf\xc5\x5c\x3f\xe5\xc5\x6a\x56\xe9\xc7\x62\xa6\xb6\x48\x2b\xe5\xd7\xaa\xe9\xdd\xd6\x8a\x9d\xac\x1b\x60\x6c\x36\x39\x9d\x88\xa9\x65\x30\x3e\x30\xac\xcc\x32\xfc\x81\x61\x55\x3c\xa8\x96\x45\x7e\x3d\x28\x9c\x6c\xb6\x12\xb8\x19\xac\xe9\x64\xc0\x5b\x74\xa1\xd8\x10\xf4\x63\xc7\x65\x9a\xa4\x7d\x1c\x01\x29\xc4\x30\x23\x95\x02\x4b\x7c\x4f\xfa\x65\xc6\x7f\x0a\x5f\xdb\x7a\x24\xe7\x74\x46\x47\x5d\xaa\xa3\x2e\xd5\x51\x2b\x7f\x46\x29\xa2\xcc\x96\xe0\x86\x39\xcf\x2d\xbc\x81\x1a\x33\x48\x70\x36\x49\xd1\x25\xc3\x90\x8c\x96\x13\x69\xd7\xb6\x37\xdd\xf1\xdc\xc6\xed\x75\x4e\x8a\x73\xc6\x72\xcb\xe3\xa3\x1b\x0e\x69\x88\xb3\xce\xec\x29\xd7\xb0\xe0\x4a\x72\x06\x42\x3b\x01\x5d\xe7\x0b\x4c\x83\x99\x76\x01\x5c\xe2\x41\x8c\x95\x2b\xea\x41\xbe\xa3\x56\xce\xed\x1b\xcb\xd3\x0e\xa6\xd6\xe7\x84\x76\x4a\xce\x8c\xf7\x10\xf5\xad\x39\x12\x62\x74\xc3\x3a\x72\xfd\x7b\xe8\xde\x2a\xd9\x2e\xc8\xe6\x65\x9d\xcd\x9b\x4d\x52\x8b\x8c\x14\xa3\x19\x89\x9f\xec\x74\x33\xc8\xf5\xda\x0f\xab\x88\xc5\x4d\x53\xb4\x16\xb0\x6a\x9a\x0a\x91\x89\x2d\x0b\x18\x87\x4f\x9b\xe6\xa9\xd6\x5a\xfb\x6a\x44\xa1\x2c\x20\x79\x1d\x79\xe8\x46\x75\xe8\x46\x2d\x1a\x53\xdf\xf5\x67\x93\x94\x60\xef\x78\xae\xe9\x6d\x03\xeb\x2c\x63\xd6\x34\xc3\xd9\xc6\xf4\x0f\x3a\x5a\xd1\xb9\x47\xa4\x6c\x85\x0a\xb6\x68\x08\x2e\x27\xd9\xce\xcd\x14\x48\xda\xec\xac\x69\x5c\xee\xab\x66\x25\x85\x20\x94\xcb\x80\x98\x47\xac\x87\x91\x42\x89\x1e\xa4\xb6\xcd\xfd\xad\x46\x8b\xf8\x61\x39\xb9\xb1\xf3\x29\x10\x7d\x91\x50\x5e\xb1\x0e\xe9\x9d\xe5\xa4\x9e\xf2\xdd\xd2\x77\x39\x14\x4a\x4b\x07\x5a\x4b\xba\x88\xa9\xd6\x30\x39\x7a\x50\x6b\x96\xaa\xd5\xb9\xd4\xea\x5c\xf2\x8d\x8b\x4c\x7d\x16\x96\xb4\xfe\x9d\x21\xa5\x3a\xba\x21\x96\xa4\x9d\x1d\x61\x59\x7a\x67\x78\x66\x9a\x4c\x3d\x91\x31\xd7\x6a\x97\x98\x78\x92\x2a\x28\xf4\x3b\xc4\x33\xcd\x55\x01\x91\xd4\x26\x57\xa0\x44\xef\x56\xa3\x33\xdb\x72\xae\x70\xa6\x5c\x06\xe2\x34\xad\xeb\x6e\x85\x23\xee\xab\x30\xe1\x88\x17\x6f\x14\x0e\xbd\x1a\xdb\xb2\xfd\x24\x5b\xaf\x94\xec\x7d\xc0\x99\xb3\x2e\xf2\x2a\xa7\x70\x0b\xbe\xb5\x76\xc2\xe3\xf0\x0e\xc7\x2e\x7c\xc5\x7d\xf8\x0d\xed\x03\x78\x82\x63\x0f\xde\xa0\xed\x89\x03\xf8\x81\xf4\xf7\x0b\x0e\x5d\xf8\x17\x1e\xc3\x1f\x38\xf4\xe0\x4f\xf4\xe0\x77\xf4\x5c\x17\xfe\xc2\x9f\xad\xe6\xbf\x10\xeb\x59\x31\xab\xf2\xc2\x27\xf7\x73\x51\xe4\xf5\x7a\xab\x09\xba\x26\xf9\x43\xf8\x7b\x50\x8a\x38\xcf\xe6\xb3\xe2\xe6\x4d\xdf\xe8\x42\xd2\x2a\xa1\x37\xf7\xe6\x0e\x8c\x7b\x5d\x6a\xf8\x6d\xd0\xb3\xd8\x2c\xcb\xab\xa5\x28\x30\x83\x99\xf3\xfe\xfc\xe3\xd9\xeb\xcf\x1f\xdf\xa1\xdb\xbf\xbc\x3e\xff\xf3\x0c\xbd\xfe\xf5\xd5\xd1\xc9\x29\x8e\xfb\xd7\xe3\xd3\xf3\xf3\xf7\xb8\xd7\xbf\xff\xeb\xe5\xe9\x31\xcd\xdf\xbf\xdb\xa2\x80\x3c\xbd\xdb\x76\xf4\xc7\xd1\x19\x3e\xbb\xdb\xa6\xa0\x1f\xdc\x6d\xd3\x4b\x3c\x87\x99\x73\xf4\xf1\xd5\xe9\xc9\x6b\x3c\x84\x99\xa3\x6d\x03\xf6\xa9\x17\xad\x02\x95\x3e\x24\x61\xc1\x9f\xb7\x20\x71\x56\x2c\xea\x95\xc8\x2a\xe2\x3c\x49\xee\x55\x42\xac\x66\xe4\x97\x5f\x44\x5c\x6d\xa2\xe6\x32\xda\x02\xd3\x92\xa5\x74\x96\xb3\xf2\xfc\x3a\x7b\x57\xe4\x6b\x51\x54\x37\x2c\xe3\x91\x56\x19\x4c\x60\x39\xc9\xa6\xdc\xa7\x60\x78\xe0\xde\xfa\x0f\x27\xcb\x2e\x8d\x50\x6d\xe6\xc8\x49\x45\xce\x65\x37\xab\x8f\xaf\x59\x86\xc6\xeb\xa3\x57\x27\x6f\x5f\x9e\x7e\x7e\x77\xfa\xf2\xd5\xd1\x85\xc1\xc9\x7f\x14\xe0\xc2\x11\x8c\x21\x23\xe5\xf3\x0e\xdd\x86\xa2\xc1\x49\x36\xc5\x77\xa0\xe6\x28\x02\x9d\x9c\xbd\xf9\xfc\xf6\xfc\xf5\xd1\x66\xca\xf3\x6e\xca\xd7\xad\x29\x5f\xf5\x94\xa3\xbf\xde\x9d\x9f\x1d\x9d\x7d\x38\x79\x79\xfa\xf9\xe5\x07\x9a\x43\xde\x11\x8f\xfe\xa5\x5c\x21\xb0\x8f\xc0\x6d\x67\x53\x8b\x37\xdd\xc6\xe0\x37\x02\x47\xa3\x9e\xa8\x07\x6f\xca\x7d\x5a\xd0\x3e\xda\x1e\x62\x33\xea\x65\x6e\x28\x22\x5b\xf8\x82\x73\xde\x22\x30\xf9\x0d\x9e\x4c\x5b\xbc\x5f\x9e\xbd\x39\x7a\x6c\x6d\xdb\xbb\xbb\xb8\xb7\x81\xfc\xa6\x5b\xfc\xc7\x2f\x17\x77\x1b\x11\xbd\x41\x9b\xfd\xb8\x8b\x80\xaf\x33\x66\x90\x59\xc6\x20\x9e\x65\xe4\x39\x5d\x8a\xc1\x0f\x51\xe4\x06\x88\x0d\x7a\x6f\xe0\x47\x8b\xde\xd1\xfb\xf7\xe7\xef\xd5\x11\x30\x81\x88\xc3\xa1\x68\x1a\x0f\x11\x45\xd3\x90\x36\x11\x11\x23\x45\xf0\x2f\x64\x5f\xa8\x8f\x47\xc7\x7e\xbe\xb5\xc8\x35\x01\xd5\x30\xbf\x68\x78\xaf\xde\xff\xd7\xbb\x0f\xe7\xff\x13\xbc\x3f\x70\xc8\xa8\x75\xb8\x6c\x9a\x8e\x35\x87\x1d\x6b\x2e\x39\x08\xd3\x1c\xfe\xa1\xf2\x03\xb4\x86\x11\x17\x37\xeb\x2a\x1f\xd4\xd9\xec\x6a\x26\xd3\xd9\x65\x2a\x0c\x58\xf2\xc7\x71\xf8\x43\xe3\xf0\xf6\xfc\xf5\xc7\xd3\xf3\x7b\x8c\x72\xd8\x51\xee\xcf\x2d\x46\xf9\x53\x4f\x78\x77\xfe\xe7\xe7\x77\xef\x8f\x5e\x9d\x5c\x9c\x9c\x9f\x3d\xc2\x8e\xbf\x6f\x4d\xf9\x5d\x4f\x39\x3e\x7f\xff\xb6\xe5\xa9\x07\xf2\x25\xa2\xbf\x50\x6c\x9f\x44\xeb\xc0\xb6\xe3\x36\xf8\xfe\x05\xc5\x2d\xcc\x9c\xd5\xec\x3b\x3e\x14\xaa\xef\x6c\x23\xce\x1f\x9c\xb4\xe2\x6a\xa8\xcc\xfe\xd7\xa1\x0b\x3d\x54\xfb\x7d\x0f\x34\x06\x1e\xba\xee\x81\x77\x78\x38\x7e\xba\x7f\xb0\xef\x1e\x1e\x8e\x21\xc3\xb7\xb3\x6a\xd9\x8e\x67\x7c\x57\x98\x63\xf7\xf0\xc0\x7b\xea\x3d\xa2\x26\x56\xec\xde\x58\xfe\x98\x3e\x78\xbe\xf7\xfc\xf9\x33\xf7\xf9\x2e\xf3\xdc\x83\xbd\x83\x7d\xef\xf9\x78\x7f\xf7\xce\xbc\xc6\xe5\x16\xeb\x46\xdd\xef\xd9\xe8\x8a\xad\x3c\xf3\xbd\xe4\x31\xba\x90\xe0\x64\x0a\x69\x6b\x93\xbe\x29\x6f\x4e\xb4\x01\xa9\xd8\x9c\xa0\xb7\x4f\xf1\xa8\xf0\xdf\x41\x8e\x73\x26\xc8\x61\xfb\x83\xcb\x84\x2d\x4d\x73\xe9\x2c\x44\xf5\x5e\xad\xfb\xc7\x2c\xad\x45\xa9\xcd\x7b\x85\x0f\x3a\x54\x80\xf9\x51\x66\xd5\xde\xf8\x65\x51\xcc\x6e\x58\xbe\x8b\x63\xce\x83\x3c\x2c\x03\x5e\xa3\xb7\xe7\xb9\x07\xe3\xdd\x6a\x52\x4e\x2d\x56\x4d\x4a\xcb\x9b\x86\x61\xe8\x79\x1c\xea\x10\x0f\x85\xf7\x34\x62\xc5\x3f\x00\x3a\xe6\x1c\x08\x06\x16\x24\xfa\x1a\x0e\x16\x4a\xfa\x59\xa2\x1d\xc7\x7a\xc7\x13\xde\x3e\x87\xd2\xc2\x31\x0f\x4a\xcc\x47\xe3\x3e\xb8\x54\x3b\xd2\x64\xfc\xed\xa6\xda\xde\xcd\x56\x23\x61\x7e\xd0\x23\x3e\x7e\xee\xed\x1f\xec\x1f\x1e\x3c\x3b\xf0\xdc\x67\x4f\x9f\xed\xb2\x3d\xcf\x24\x0c\xb8\xe5\xb9\x87\x87\x4f\x3d\xef\xd9\xf8\xe0\xe0\xe0\xd9\xae\xc6\xc5\xda\x1f\x1f\xee\x1f\x3e\x3b\x18\x1f\xea\x96\xf1\xd4\xf2\x9e\x1d\x1c\x1c\x8c\x3d\xfd\xbe\xd7\xee\x7e\x7f\xfa\xe2\x85\xf7\x8c\xeb\x97\xa7\xd3\x17\x2f\x9e\x73\x8b\x1e\x9f\x4d\x7b\x7a\xdc\xc5\xe9\x80\x3b\x71\xbe\xbe\x61\x15\x85\xf7\x8f\x6c\xf5\x40\x6f\xf5\x40\x6f\x55\xc9\x95\xb7\xff\x2b\xcd\xa0\xd2\x49\xa5\xf6\xdc\xda\x6d\x66\x8c\x03\x2d\x1b\xd6\xa6\xc9\x92\x49\x69\x59\x53\x6c\xc1\x07\xda\x83\x4a\x26\xb6\x5d\x4e\x41\x90\x57\x9d\x9b\xa6\x20\x6d\x8d\xef\x27\x37\xb6\x98\x42\x42\x47\xb2\x62\xf9\xa8\xe6\xbb\x35\x57\x3e\x16\x35\x05\x89\xf6\xb0\xa0\xb4\x6d\xae\x13\x56\x25\x4f\x70\x22\xfb\xac\xa4\x0e\x3f\x6c\xaf\x9d\xe2\xd2\x14\x9d\xb3\xe1\x20\x6d\xbc\xd1\x8b\x97\xca\x9b\x4c\xee\x7b\x93\xca\x55\xbc\x09\xc9\x53\xa4\xb1\x76\xd9\x3b\x68\xa9\x23\x50\x42\xea\xc4\x98\x40\x7a\x7b\xcb\x38\xbc\xda\x16\xf2\x3e\x5a\x12\x77\xc2\xcf\x3b\x82\xd3\xc5\xff\x24\x3e\x3b\x2f\x21\xc6\x6c\xf4\xb2\xd1\xe9\x03\x81\x7d\x02\x3e\x48\x6c\x3b\xe0\x39\x8a\x49\x32\xdd\x79\x09\xb5\x7a\xa0\x81\x50\x60\xbc\x9b\x5b\xf5\x6e\x0a\x12\xd3\xdd\xdc\x2a\x76\x5e\xee\xbe\xb4\xc8\xeb\x60\x72\x54\x29\xe1\x2e\x68\x20\xb7\xe2\xdd\x1a\x68\x1a\xca\x9d\xaa\x13\xeb\xd2\x34\x45\x9f\xbe\x2a\xef\x84\xcc\xd9\x83\x08\x4f\xe5\x99\x86\x58\xf0\x1c\xab\xb0\x88\x3c\xdf\xf6\x74\x18\xa6\xa9\x9b\xa3\x1b\x54\xa1\x54\xf9\x69\x52\x00\x13\x39\x1d\x62\x36\x91\x53\xfe\x93\x10\x97\xd3\x90\x5e\xf4\x34\xed\x58\xb7\x48\xe4\x9b\x45\x8b\xcd\xa2\x5d\x02\x41\x12\x58\xda\xbd\x98\x54\x53\x1b\x25\x48\xa4\xa7\x17\xd9\xa4\x22\x60\x2e\xd0\x1b\xca\xdd\xc2\x52\x03\xa8\x59\x07\x7b\x43\x32\xdb\xb4\xbf\xee\x5e\x25\x10\xdd\x99\xf3\xe0\xf6\xbe\x5e\xeb\x23\x58\xbd\xdd\x74\x93\xe4\x85\x6b\xb8\x82\x4b\x38\x87\x0b\x78\x0f\x2f\xe1\x08\x5e\xc3\x67\xf8\x0e\xc7\x28\x9d\x12\x31\x77\x4a\xb5\x25\x38\x41\xe9\xc4\x70\x8a\xb9\x13\xeb\x7b\xb4\x13\xd3\x3c\x51\x18\x9c\x9a\xe6\x29\x05\x56\x5d\x64\xa5\xd5\xa4\x74\x4a\xd3\xcc\xe9\x0f\x3b\x89\x86\xa7\x4d\x43\x83\x87\x48\x23\xfd\x53\x1e\x9d\x98\xa6\x8b\x48\x6d\x4d\x33\x3c\x8d\xdc\xdd\x63\xff\x78\xe4\xfa\xee\xc8\xd5\xbc\x7a\xd5\x6a\xdb\x63\x0e\x97\x78\xa5\x73\xed\x31\x4a\x47\xd8\xb9\x23\xe0\x18\x6b\x2b\xb6\x3c\x48\x9a\x86\x25\x78\x06\x31\x56\x4c\x3a\xa4\x72\xed\x8a\xe5\xea\x01\x8e\xf1\x78\x74\xd3\xb8\x1c\x96\xe8\x06\xa7\x93\xe5\x14\x91\x9d\x4c\x96\x53\x8a\xe7\x82\x65\x1b\x94\x53\x7b\xd8\x37\x9b\x66\x6c\xdb\xe0\x86\xc7\xfc\x52\x6b\x06\x8f\xc3\x02\x87\xee\x46\xc8\x8e\xf0\xa4\x63\xe8\xcf\x78\xda\x3d\x52\x10\x79\x6c\xe1\x18\xd6\x48\xe1\x1d\xa3\x4d\x5a\x1e\xe7\xb0\x0e\x3d\xd3\x64\xa7\x28\xd8\x29\xac\x21\xe1\x70\x82\x82\x9d\xe8\xc7\xad\xf9\x1b\xa8\x1c\x5e\xe2\x67\x38\xc7\x93\xfe\xaa\xe0\x33\x87\x0b\x3c\xef\xc2\xae\xcf\xe1\x45\x70\x3e\xb9\x20\xb5\xe2\xf2\xe0\x3b\x9e\x76\x12\x04\xdf\x7b\x3e\x77\x39\xbc\x56\x74\x86\xd3\x89\x37\x0d\x31\x19\x8d\x4d\xf3\xb5\x65\x05\xf3\x7c\xb0\x46\x97\x24\x91\x9d\xc2\x39\x7c\x86\x0b\x0e\x6e\x98\x46\xec\x3d\x9e\xd3\xf0\xcf\x43\xbc\x30\x4d\xf6\x1e\xdf\xef\x26\x16\x3b\x9f\x78\x8a\x28\x5c\xed\xea\xfd\xe8\xb5\xda\x4e\xc4\xd6\xa1\x4a\x4a\xaf\x31\xb1\x3d\x0e\xf3\xcd\xde\xae\x71\xde\x6d\x68\x83\xb1\x5a\x6d\x0e\xe7\x70\x4d\xab\x79\x88\x29\xcd\xb5\x6d\x28\xd8\x1c\xae\xc3\xcf\xd1\x77\xff\x14\xae\x21\xe1\x9c\xfb\x14\xf8\xae\x4d\x93\xa5\xb8\x46\x05\xba\xdf\xdd\x5d\xe0\xe1\xb5\x69\xce\xb7\xb7\x5b\xb0\x73\x98\xc3\x05\x21\x61\xb7\x4b\xdc\xc3\xa0\xdf\xaf\x17\x2a\x04\x2c\x4b\x4d\xba\x68\x11\xb8\x50\x08\x6c\xa1\xcd\x7d\xd2\xa4\xdd\xd0\x73\x54\xd9\xcd\xcb\xc9\x92\x08\xbf\x86\xd4\x34\x89\x60\x51\x7b\x12\x27\x93\x97\x44\x29\x9f\x9d\xe3\x84\x9e\xa7\x70\x81\x1e\x0f\xae\x97\x32\x15\x8c\xbd\xb4\xac\x17\x47\x5d\x52\xe4\x5c\x27\x4c\x8f\x49\x91\x2f\x70\xd3\x06\x97\x4a\x12\x2e\x3b\x09\xa6\xa0\x3c\x41\x3c\xd3\x7a\x62\x89\x1e\x1c\x23\x0d\x09\x8e\x95\xe2\x3e\x56\x8a\x5b\x31\xf1\x47\x76\x05\xb5\xc5\xae\x1c\x81\x4b\x2b\x56\x69\x44\xcb\x83\x12\x16\x6d\x26\x99\x3a\x62\xb8\x72\x0a\xb4\x16\x9d\x5a\xbc\x52\xba\xfc\x61\x88\x87\xa3\xbf\x99\x1d\x71\x97\x4d\xbe\x5f\xe6\x53\xce\x3e\x5d\x4f\x3e\x5d\x3b\xd3\xdd\x27\x7c\x24\x21\xa3\xde\xc9\xdf\xce\xd4\xe2\x9f\x9c\x27\x23\xa8\x70\xf4\xf7\x27\xa7\x6d\x79\x32\x82\x02\x47\x7f\xdb\x11\x3b\xc9\x12\x99\xc9\xea\xa6\x39\x9b\x9d\x51\xb3\xa4\x61\xe5\xee\x27\x8b\x29\x58\xbc\xf9\xfb\x53\x69\x35\x9f\x4a\xeb\xc9\x68\xf1\xc0\xfb\xba\xaf\xa3\xb0\x8c\x6a\xbf\xee\xaf\x8f\x24\x18\x4f\x3c\x43\x09\x6e\xa1\x2f\x45\x63\xce\x73\xa7\x44\x59\x9e\xcd\xce\x58\xac\xe3\x48\xdf\x0d\xe3\xc8\xf6\x7c\xaf\xbf\xf2\x18\x92\x16\x8a\x31\xee\x01\x09\xd8\x38\x7c\xda\x72\x75\x16\x0f\x8d\xef\x06\x22\xab\xb0\xba\x77\xad\x15\x79\xcf\x7c\xe3\x92\x3c\xef\x68\xec\x3f\x87\xc4\x34\x93\x21\xa6\x91\xf0\xb3\x5b\x4e\x6f\x2c\xc5\x04\xb6\xd7\xc8\x34\xb2\xfd\x7b\x05\x86\xeb\x50\x0b\x87\x7a\x88\xf1\x3d\x75\x19\x43\xca\x83\x2f\xfa\x8a\xd2\x50\x4e\xbc\x61\xb1\x24\x32\x06\x97\xb3\x52\x0c\x0c\x2b\xf1\x0d\x83\x93\x7f\xdf\xe6\x71\x6b\x0e\xb4\x71\xda\xef\x6d\xee\xc4\x98\xb7\x09\x17\x78\x8b\xae\x3a\xdd\x0f\xce\xec\xb2\xcc\xd3\xba\x12\xca\x07\x44\xf5\xfe\xf0\xc4\xdb\x7b\xb8\xa5\x2c\xef\xdf\x03\x30\xe1\x94\x24\x86\xe2\x16\x3e\x38\xb1\x90\xe9\x23\xd1\x40\x77\x1f\xa2\xe6\x03\xfd\x55\x49\xb4\x31\x57\x73\xf2\xd5\x7a\x56\x88\xf9\x87\x1c\x3f\x38\xf1\x6a\x8d\xdb\x34\xef\x41\xbc\x45\x0f\xa4\x02\xb0\x55\x58\xa1\xe6\xb7\xe9\x9b\x77\x2a\x6f\x8f\x1f\x9c\xf9\xfa\xb1\x9c\x44\xa1\x4a\x3b\x5a\xa3\x54\xf4\x44\xad\xd3\x54\xbb\xe9\x8c\x65\x58\x74\x77\x8b\x1e\xd9\x07\x8d\xe6\xe8\x86\xf3\xdd\x1b\xc8\x90\xc2\x23\xed\xc3\x65\x3b\x9e\x8b\xe8\x06\x99\x92\x2e\x41\x32\xda\x82\x73\x43\xa1\xa2\x4c\xb7\x25\xc7\x5c\x5e\xc9\xb9\x98\xff\x76\x83\xea\xf9\x57\x3b\xdb\x83\x57\xf7\x77\x06\xef\xe0\x2b\xdf\x02\xa1\xd2\xee\x62\x21\x8a\x0e\x96\x6a\xf8\x15\xc0\xfd\x47\x00\xba\xe0\x29\x80\xe2\x5b\x3d\x4b\x89\x4e\xe2\xdb\xaf\xa6\x3f\x05\xd2\x6a\x8f\x53\x3b\x49\xf3\xbc\xf8\xe7\x47\xbc\xa7\x26\x2d\x0a\x31\xab\x44\xf1\x61\x39\xcb\x90\xa2\xc1\x5f\x2d\xfc\xec\x91\x23\x0e\xdd\x7b\x10\xce\x8b\x23\xda\x82\x62\x97\x45\x25\x7e\x05\xeb\x80\xac\x08\xb2\xec\x91\x7d\x70\x1d\xf9\x67\x04\x58\x96\xc7\xa4\x87\xc4\xc3\x2d\x0d\x87\x9a\x63\xf4\xa8\x96\xfc\xd8\x3e\xff\x7a\xb8\x69\x6e\xb1\x4e\xa8\xdb\x3a\xbe\x1a\x6b\x58\x67\xb3\xb3\x47\xe6\xab\xa1\x65\x3b\x42\x2c\x66\x95\xbc\x12\xd8\xbe\x3c\x42\x70\x3d\xfc\x85\xab\x27\xfc\xb7\x28\xf2\xff\x09\x27\x17\x5b\xfe\x9f\xb8\x53\x9a\x91\x8a\xb2\x6c\x8f\x23\xfd\xe5\x71\x3c\x7f\xe4\x38\xf4\x82\xdd\xf4\xed\xb3\x48\x7f\x7d\x16\x87\xca\xde\xfe\xef\x87\xa1\x6e\x8e\xf0\x83\x53\xd6\x97\xf7\x40\xdd\x8d\x18\x14\x8c\x04\x4b\x47\xd5\x6a\xbd\x55\x62\x88\x5b\xbc\x9e\xa9\x5a\x9e\x61\xd2\x34\xc3\xec\xae\xfe\x54\x8e\x23\x19\xcd\xe1\xa6\xc0\x8a\x14\x98\x9d\x41\xe9\xac\xd3\xba\x64\x82\x07\xca\xaa\xa0\x3a\x41\x50\x39\xea\xd1\x0d\x2c\xb1\x74\x62\x58\xa0\x68\x55\x48\xda\x34\x43\x7d\xd1\x3a\x5c\x36\xcd\x70\xd1\x01\x5b\x46\xac\x85\x27\xb8\xaf\xd7\x5c\x44\xa5\xdf\xad\x3b\x5c\x6a\x57\x76\xab\xba\x60\x40\xcf\x0f\x67\xd1\xc0\xa8\xf4\xf7\x10\xbf\x46\xb6\xeb\xbb\xca\xd6\xa7\x58\xb1\x94\x2b\x3f\x56\xdd\x49\x2f\x7b\xbf\x2e\xc1\xd4\x8e\xb5\x1b\xc0\x6a\x74\xc3\x84\x47\x2c\x41\x3b\x81\x1c\x97\xdc\x67\x31\xa6\x90\xe3\x82\xac\x41\x21\xae\x44\x41\xb6\x0a\x32\x4c\xd4\x05\x6f\xbe\xb9\x03\xda\xea\xbe\xdd\x0a\x6a\x58\x8d\x2c\xe9\x6f\xad\xf9\x0b\x96\xf5\x77\xfb\x9c\x47\x89\x9f\x41\x82\x19\xba\x81\x0c\xb3\x20\xd3\x81\xcf\x72\x92\x4d\x87\xb8\x20\xad\xf9\xb3\x46\x7a\x7b\x41\x2f\x9b\xcb\x04\x0a\x7d\x73\x24\xaf\x78\x01\x0b\xcc\x41\x11\x40\x38\x25\xe1\xc5\xe4\x06\xbe\xad\x52\x15\x9d\xdf\xdb\xdd\x54\xeb\x9b\xe9\x49\xd1\xba\xb8\xd4\x94\xe1\x99\xed\x05\x32\x4c\xf4\xf5\xc8\x52\x5d\xb1\xbe\x58\xa8\xd0\x4b\x17\x5a\xc9\xa0\x30\xcd\x21\x75\x14\x53\x9a\x3c\xc5\x8c\x07\xb6\x4d\x4f\xb0\x9c\xc8\xa9\x85\x67\xb7\xf4\x6b\x23\xcd\x52\x77\x19\x14\x2a\xd3\x51\x04\xcb\x3e\x52\xb6\xed\xb8\xd7\xf8\xea\x94\x4e\x98\x80\x25\xc4\xdc\x57\x87\xa8\x4f\xcc\xf3\x3d\xd8\xba\xcc\x00\xa1\x14\xe1\x2a\x9f\xd7\x29\x09\xcb\x2a\x9f\x3f\xc2\xe1\xfa\xd6\x5c\xd5\x20\x6e\xcc\x9e\x77\x97\xb7\x87\xd2\x89\x9b\x66\x28\x9c\xb2\x69\x04\x89\xf6\x50\x17\x2e\x44\x1b\x06\xf7\xa9\xa9\x69\xa4\xea\x95\xdb\xbd\x92\xfb\xec\x10\xf1\xcf\x88\x15\x4a\x44\x94\xed\x86\x0a\x5f\x31\x09\x02\x5c\xd8\xe3\xaa\xa9\x80\xca\x29\x77\xb1\xe0\xfe\xa6\xeb\x4f\x0e\x52\x0b\x28\xab\x1c\x75\x51\xcb\x04\xd7\x36\x21\x23\x6d\x25\xe6\xa8\x9e\xfe\xa9\xef\xa0\xce\x5a\xfb\xbb\xda\x58\x92\xf4\x91\xfb\x31\x7f\x8c\x32\x1d\x5d\x20\xa7\x78\xb3\x95\xfa\xf1\xa3\x52\x9f\xff\x5a\xea\xf3\x87\x52\xdf\xed\xa9\x15\xfb\x1a\x55\x7c\xa8\xab\x40\x46\x37\x90\xa8\x70\x36\xed\xc5\xbe\x6e\x9a\x61\xa9\xc5\x9e\xb4\x4b\x7a\x77\x9d\xbc\x93\xf2\x44\x4b\x79\xba\x25\xe5\xf4\x4c\x6e\xa0\x1a\x48\xfd\x91\xf4\xdd\xdd\x5c\x89\x75\x8d\x15\xab\x39\x29\x36\x56\x92\x28\x27\xbd\x58\xe7\x58\xdb\x6d\xde\x2c\x0f\xdd\x88\x95\x58\x43\x81\x29\xf7\x59\x8e\x76\x0e\x05\x26\x1c\x8a\x8d\xcc\x06\xb9\x6d\x07\xc5\x46\x9c\xb7\xba\xda\x9b\xb9\xa4\x0b\x77\x32\x4c\xbb\x47\x37\xcc\xed\x4c\xd5\xdd\xa5\x40\xee\x69\x82\x05\x64\x98\xd3\xea\x6e\x90\x05\x3c\x47\x96\x4c\x6c\x3b\x9b\x62\x32\xc9\xa6\x56\x4a\x7f\x72\x3e\x3a\x6b\x5c\xa0\x86\x1d\x3c\xeb\xce\x35\x37\x4d\x96\xf4\x21\x57\xce\xc1\xb2\x4a\x0e\x24\x1f\x09\x94\x8a\x57\xfa\x3a\x00\x52\xf3\xdb\x27\xad\xcf\x59\x65\x3d\xf4\x49\x4b\x2c\x34\xd1\xfb\x0c\xaa\x18\xaa\xf4\xbd\x69\x7a\x43\xa4\x77\x57\xff\x30\x9d\x7f\xdb\x03\xa3\xcb\x39\x1b\x2a\x05\x0f\x62\xa8\x87\xb7\x59\x58\x4e\xc2\x73\xdf\xf3\xab\x50\xf6\x5e\x1f\x64\x58\xed\xde\x58\x24\x10\x72\x52\xb5\x5a\x23\xa8\x5a\x77\xaf\x52\xee\x5e\x46\xee\x9e\x4e\x63\x4a\x52\x0b\x95\x0a\xb4\xda\x3e\x0a\xb4\xfa\x5b\x4b\xd3\x2c\xc8\x05\x0a\x89\xb2\xe4\x5b\x0a\xcb\xe3\xa0\xcc\x9c\x2a\x7b\x78\x4c\xfc\x1f\x11\x15\xa6\x2b\x91\x44\xd3\xf4\xf9\xe3\xa7\x9c\x9b\xe6\x47\x56\xc1\xbf\xff\x2d\xac\xde\xd3\xba\x53\x60\xec\xc2\x73\xf0\x9e\xea\xca\xa7\xcc\xff\xca\xa1\xa2\x75\xd5\xa9\x3c\x24\xf9\x1d\x85\xa3\x6e\x75\x2e\xe0\x02\xbc\x67\x5b\xf4\xe4\x51\xd6\xca\xbc\xe1\x09\xc3\x52\xb5\x33\x2d\x2b\x67\xa4\x65\x32\xa5\x64\x4c\x93\xd9\x17\xba\x68\xe6\x82\x66\x94\xbb\xea\x1e\xc8\xf5\x3d\x52\x4a\x99\x3a\xff\xf2\x5b\x3d\x2b\xc4\xfb\x3c\xaf\x88\x01\xbe\x15\xd5\x63\xce\xfa\x03\x3b\x4f\x22\x58\x3a\x25\x45\x7a\xaa\x90\xea\x9d\xb5\x0f\x8b\x96\x5a\x86\xeb\x3c\xd5\xc1\x1e\xb1\x05\xd9\x65\x92\xcc\x64\x4b\xf4\xf4\x38\x32\xd9\xae\x0a\xeb\x69\x80\xea\x8f\xdc\x91\xeb\x27\x51\xa9\x10\x0c\x94\x7d\x55\xa9\x7f\xc2\x8b\x11\xe7\xba\x0a\x60\x8a\xe8\x8d\xdc\x88\x4e\x91\x25\x1c\x58\x57\xc6\x63\xc5\x7c\x67\x8c\xaa\x8a\x31\xd3\x35\x52\xb0\x0d\x20\xd3\x86\x9a\xc5\x96\xc7\x47\x63\x6e\x33\x37\x8c\x9b\x26\xde\x19\xd3\x30\x05\x31\x43\x4d\x4e\x9f\x91\x34\xde\x29\x75\x51\xe6\x39\xdb\xd4\x64\x6f\x2a\x2c\x85\xc1\x2d\x8f\x5b\x31\x07\xd9\x52\x20\xe3\xdc\xef\x9e\x53\xcb\x30\x48\x53\xd3\x79\x28\x43\xa9\xb2\x61\x90\x62\x6c\x2d\x61\x4f\x6d\x3f\x25\x83\x19\xe8\xfa\x57\x09\x64\x69\xf5\xd1\xd6\xda\x01\x7a\xc5\x4a\xa8\x61\x09\x9e\xba\x9c\x63\xb5\x13\xf3\x1e\x8d\x94\x6b\x37\xae\x60\xd2\x89\xf9\x76\xbb\xd2\x89\xd2\x11\x2f\x62\xd3\xb4\xed\x74\x0b\xf9\xd4\xde\x83\x94\x78\xdf\x38\x3c\x3c\x3c\x34\x14\x8f\xb2\xbc\x69\x8c\xfd\xf6\x95\xf3\x9f\x6c\x68\x65\x4d\x33\xb4\xb2\xbe\x10\xd9\x34\x8d\xa7\x06\x62\xd6\x55\x06\xba\xc4\xf4\xec\x23\x93\x20\x1d\x61\xbd\xb3\xc6\x40\x31\x27\x0e\x65\x8b\xbc\xe4\x8e\xf8\xc6\xca\xed\x6a\x85\x61\xae\x66\xd4\x50\xb7\x33\x5c\x0e\x75\xb7\xd7\x6e\x38\xff\x29\xb1\x6e\xe7\x2c\x2d\xdc\x87\x94\xfe\xe4\xe8\xdd\xf6\x81\x4d\xb7\xa4\x07\x5f\x5b\x33\xae\x60\x90\x15\xaf\xd3\xff\xc9\x4f\x6d\xeb\x80\xba\x04\xea\x4a\xa7\x50\x35\x57\x9f\xe3\xa5\x13\xc3\x05\x92\x1d\x3b\xb8\x63\xc7\x78\x97\x39\x3d\x37\xcd\x0b\x9d\x41\x32\xcd\x8b\xad\xcc\xe9\xf0\x92\x0c\xa7\xf6\x00\xce\x4d\x73\xa8\x47\x0c\x2f\x9a\xe6\x82\x7e\xf4\xdb\x79\x5f\x5f\x21\xda\xf8\x5f\x79\x27\xbb\x78\xe9\x94\x40\x90\x23\x5d\x6b\xe1\xea\xfa\x15\x97\xfb\xdb\xf5\x18\x1c\x44\x5b\x92\x56\xb1\x4b\x15\xc9\x58\x15\x13\x3a\x61\xda\x43\x49\x37\xb9\xb3\x05\x5e\xf4\x8f\x8a\xc7\x56\x78\x0e\xe7\x78\x01\x17\xb8\x82\x5c\x99\x15\xe5\xe4\x91\x49\x49\xad\x05\xac\x70\x32\x55\xb6\x6a\xb5\x55\x7e\x94\x17\xec\x1a\xcf\xe0\x0a\x5f\x92\xab\x1a\xd8\x76\x1e\xa2\x1b\x6c\x8a\xe4\xd7\x78\x31\xc9\xa7\x3b\x57\x30\x57\x0f\xa3\xab\xc6\x85\x12\x53\xa8\x31\xb7\xca\xa0\x0e\xf3\x80\xc7\x78\xae\xee\x4d\x76\xae\x60\x89\xe7\x93\x52\x0f\x4a\x70\xbe\x1b\x5b\xcb\xdd\x35\xc4\xb8\xde\x8d\xad\x64\xe7\x6a\xf7\xca\x5a\x4d\xea\xa9\x55\x40\x81\x2c\x1e\x5d\xab\x1b\x82\x84\x46\x73\x6b\xbe\xbb\x84\xd5\xa4\xb6\xed\x29\xc6\x3b\xd7\x01\x8d\xc3\xa2\x63\x87\x22\xb2\x2c\xe9\xaf\x7a\x67\x90\x6c\xdb\x0a\xa4\x66\x8b\xb6\x6c\xed\x1f\xaa\xf6\xc1\xbd\xcb\x41\x8f\x94\xfb\xf3\xed\x52\x39\x7d\x51\xa8\x5c\xa4\x0c\x1f\x2a\xf8\xe7\xbd\x82\x07\x11\x91\x41\xa0\xe5\xfc\x4a\xa3\xb2\xa5\x4b\x1e\x0f\xcb\x3e\xb7\xa1\xd8\x83\xfb\xc9\x43\x1e\x91\x65\xf1\xda\x85\xa9\x41\x83\x54\x95\x77\xff\x37\x60\x63\x57\x03\xeb\xcc\x54\x07\x73\xec\x76\x30\x55\x0d\xdf\xa3\x14\xfb\x25\x4c\xef\x17\x30\x3d\xa5\xc3\x75\x9c\xbb\xe5\x36\x3a\xe5\x3a\x95\x95\x2e\x4d\xcf\xd1\xfa\xcb\xe9\x0b\x79\xa0\xa6\xd7\x87\xb5\x3c\x50\x62\x37\xaa\xab\xe2\x21\x4f\x90\x84\x25\x45\x39\x51\x25\xda\x5d\xfc\x0d\x33\x8c\xa3\xa4\xd7\x5b\x7e\x02\xcb\x4d\xf9\x53\x1b\xe6\x14\x98\x93\x27\x07\x35\x16\xb0\xb4\xb1\xe0\x90\x87\xae\x69\x2e\x43\xb7\xe3\xee\xe5\x4e\xde\x34\x39\x24\x38\x6b\xbf\x89\x60\x2e\x14\x3c\x58\x86\x45\x50\x58\x98\xf3\xc4\xc2\xd2\xea\xfb\x0a\xc8\x79\x50\x87\xaa\x7c\xbe\xed\x50\xcb\x17\x9c\x43\xac\x6a\xea\x0d\xdb\xb0\x12\x7e\x5b\x61\x1a\x25\xd6\x5f\xce\xfd\x12\x27\x8b\x82\x44\xeb\x2f\xe7\x41\x59\x12\x8f\xd2\x4d\x66\x72\xeb\x4b\xa1\x4f\x9f\xe6\x3f\x0d\xab\xb6\x8c\xdb\x4f\x9f\x7e\x33\xc0\x58\x18\x1c\x8c\x27\xa6\xf1\x00\x46\xb7\x02\xf7\x53\xee\x27\x9b\xc2\x5c\x7d\xd8\xed\xd0\x47\xdd\xbe\x7b\x4a\x13\xbf\xc0\x42\xab\xca\x35\x2e\x9c\x18\xe6\xfd\xbd\x3a\xac\xb0\xda\xbc\x5c\x63\x72\xe7\xc6\xbd\x67\x17\xf6\x05\x87\x1e\x94\xd8\x97\x62\x7f\xc1\x25\xb0\x21\xa3\x48\x5e\xe5\x70\x18\xe7\x4d\x53\x3a\x69\xc5\xbe\x29\xe3\xa2\xcb\x23\xc6\x60\xac\x66\xdf\x07\x73\x91\xe5\x2b\x99\xd1\x56\x06\x86\xc5\x96\x91\x71\xaf\x06\xf8\xb1\x12\x60\x81\xc3\xa5\x69\xaa\x84\xcb\x47\x56\x82\x76\xcc\x3c\xee\x2c\x2a\xc1\xbe\xf1\xa8\xf4\x3b\x37\x74\xdd\xc7\xfe\xdb\x65\xe8\xda\x5c\x17\x6c\x4d\x7c\x3a\x77\x04\xf6\x89\xa3\x85\x23\x6c\x0f\xe6\xca\xaa\xe3\xfb\x09\xab\x31\xdf\xb9\xe1\x2f\xdc\xe8\xc6\xaa\xfd\x7a\x4a\x0b\x0b\xda\x4b\xbc\x5a\xb3\x39\x0f\xdd\x88\x82\x85\xb9\xbf\xf2\x4b\xa8\xf1\x07\xfc\x20\x6f\xa3\x27\x45\xcc\x21\xd1\x90\xdc\x20\x45\x32\xf7\x73\x95\x1d\x54\xb2\xa2\x5c\x80\xb4\xb5\x92\xd7\x9c\x83\x37\xa4\x10\x68\xb5\xa6\x08\x89\x57\x78\x0d\xd7\x28\x61\x85\xc9\xdd\x91\x12\x57\x9c\x22\x17\x09\x73\x2c\xdb\x90\x6a\xd3\x37\xe7\x14\xdc\xc8\x4e\xef\x49\x7c\xc5\x44\x17\x4b\x72\xb8\xd6\xab\x27\x1d\xcc\xce\xa4\x13\xc4\xaa\x43\x49\x6e\xa1\x94\x38\x25\xae\x9c\x12\x17\x4e\x09\xf9\x2e\x8e\x21\xc3\x57\x8c\xac\x6b\x0e\x5f\x79\x0b\x77\xc1\x9d\xd9\x65\xc9\xb8\x42\xfd\x15\x4b\xa0\x7a\xac\x97\xbf\xf0\xa2\xc9\x6a\xeb\x0c\xe0\x7a\xeb\x65\xea\x4f\x92\xed\xbe\x6a\xbb\x0f\x7e\x60\xad\xdd\xf9\x2a\xd7\x35\xc2\x0f\x23\xdf\x2d\xc7\xda\x12\x4d\x43\x06\x38\x72\x77\x85\xa3\xf3\x41\x7a\xee\xbb\xfc\x5a\xa5\x15\xd7\xf9\xf5\x2f\xa2\xa1\x55\x57\x4d\x65\x09\xde\xa5\x07\xc8\x41\xe8\x5d\xf5\xf1\x1e\x18\xa2\x55\xf7\xaa\xfe\x67\xd8\x65\x35\x99\xe0\x4d\x53\x84\x17\x14\x03\x8d\xd0\xe5\x4d\xb3\x9e\x15\xa5\x38\x4e\xf3\x59\xc5\x04\x57\x72\x32\x64\x02\x09\x9d\x7b\x37\x0d\xca\x8f\x5d\xe7\xd7\xcc\x92\x20\x78\x97\x61\xf9\x3d\x9a\xb3\xdf\x47\x37\xd6\x98\xfb\x2e\x6c\xa4\xb0\xad\x48\x2d\x76\xc6\xea\x57\x5d\x8b\xb4\x6e\x19\x0c\x2b\x27\x6e\x2b\x45\x33\xd3\xac\xfa\x6c\xa8\x0a\x8c\x36\xaf\x98\x71\x5d\x1e\xbc\x62\xc5\x68\xcc\xa1\x2b\x5a\x0e\x24\x6e\x7c\x3c\xc8\x4c\x53\xa5\x35\xe4\x5d\x30\xf2\x0e\x98\x3b\xd9\xf8\x0a\xbf\x39\x73\x79\xc5\x2a\xce\x21\x53\x56\xf2\x77\xf8\xda\x5b\xc9\xbe\x48\xfc\x9f\x9b\x35\x55\x15\xb7\xff\x2b\x33\x0d\xe3\xfd\xf6\x60\x35\xa7\x3c\x76\xa6\x5d\x7c\x5b\x11\xff\x62\xe5\x88\x60\x2b\x28\x45\xc4\x3c\x92\x14\x6c\x18\xdd\x1d\x99\x01\x6e\x28\x55\x14\x49\x6a\x9d\xbc\xfd\x0c\x8d\xb3\xd9\x99\xe1\x2b\x57\x9c\xe8\xdb\xfb\x07\x2d\x92\xea\x0b\xd3\xf1\xd3\xee\x13\xd3\xe8\x35\x4b\x59\x06\x39\x07\xb7\x11\xe0\xb9\x20\xb9\xff\x5b\x88\x64\x73\x42\x7c\x12\x25\xaa\xcf\xef\x86\xd0\x62\x55\x17\xd1\xf5\x8b\xb6\xcc\x5e\xd4\x59\xdc\x66\x7b\xd4\xf3\x3f\xbf\x0b\xd0\xf7\x0f\x57\xb3\xb4\x16\xe7\x09\x4d\xcf\x7f\xbf\x38\x7f\x24\x13\xae\x53\xdb\x1b\x51\xbb\xdd\xd0\xbf\xab\x3a\x25\x75\x3e\xdb\xd4\x4b\x54\x9b\x58\xd6\x6d\x7a\x6a\x8a\xd0\x6d\x1a\x81\x88\x59\x94\xf9\x99\xed\xdd\xa9\xaf\xd8\x54\x56\x68\x21\xf3\x40\x6e\x8a\x50\x72\xf5\x9d\x8a\x65\x18\x81\x0c\x8b\xd6\x03\xcd\x50\xa8\x6c\xa3\x65\x18\x50\xe1\x8d\xdd\x7f\xcb\x51\xd9\x76\x90\x51\xf4\x67\x65\x3c\xc8\x2d\xcc\x6e\xdb\x42\x90\x3b\x5f\x25\xe6\x77\xbf\x4a\x94\x3c\xe8\xdd\xc0\x7c\xf3\xbd\x9f\xe5\x35\x8d\xc7\x37\x88\xca\xfb\xb9\x41\xe1\xc4\x90\x53\x54\xa4\xbe\x29\x2a\x49\xa7\x3b\xa5\xaa\x9f\xa1\x18\x2f\x73\xc4\x56\x96\xea\x61\xa6\xc3\x34\x87\xca\x89\x29\x30\x37\xcd\x61\xae\x8a\xba\x9a\xa6\xbf\x0d\xab\xa2\x22\x72\x7d\xbb\xf4\x6b\xe5\xb8\x0c\xb1\x87\x51\x6b\x00\x6e\x58\x43\x81\x09\x62\x0a\x43\xd9\x34\xc3\x9c\xf7\x5e\xb1\xeb\x0f\xe5\xdf\x95\x2e\x6b\xb9\x73\xc5\x96\x84\x69\xd7\xae\x8b\x8b\x58\xd2\xa7\x5c\xf8\x0b\x96\xf6\x74\xe2\x51\xe2\x93\x33\xef\x06\x65\x58\x07\xb5\xce\x22\xcb\x49\x3d\x1d\x62\x3e\xa9\xfb\x60\x9e\x5a\x42\x6a\xe8\xa0\xf6\x9f\x49\x63\x1a\xb9\xfe\x66\xb9\x0d\x15\xf3\xbb\xb7\xb7\x4c\xe8\x8f\x7f\x42\x72\xa6\xab\x10\xb7\xaa\x7d\x6a\x62\x8c\xf6\xa3\xbf\x89\x2e\x8e\x1c\xa8\x52\xb8\xa9\x81\x78\xae\xde\x37\xe5\xe7\x3d\x8b\xea\xef\x91\xc4\xd6\xb9\x95\x0f\xbe\xff\x21\xf7\x46\x45\x5b\xb5\x2a\x94\xef\xbf\x77\xa2\xbd\xb6\xdf\x80\x6e\x38\x46\xda\x76\x90\x4f\xe4\x74\x17\xb3\xb6\x1e\x6c\x52\xa0\x3b\xb5\xf0\xbc\x4f\x03\x88\x2e\x30\x26\x42\xf1\xa0\x78\xd1\x4f\x2e\x2c\x8b\xe7\x93\x62\x1a\x56\xea\x6b\x5d\xad\x53\xf2\x49\x61\x79\x24\xce\xfa\x01\x5d\x0e\xfa\xc9\xa2\xae\xe9\xa8\x6a\x5c\x6a\x98\xee\x60\xd5\xeb\xcf\xed\xbb\x80\x7e\x67\xc9\xb6\x7e\x64\x9b\xaa\xa2\x48\x6c\x22\x75\xcb\x70\x0c\x4b\x6c\x5c\x62\xc1\x2d\xe6\x86\x59\x64\x90\xdf\x24\x2c\x83\x5b\xd9\x06\x60\x7a\x87\xc5\x75\xd9\x5a\xd6\xb9\xc5\x86\xeb\x18\x81\x65\x65\xe4\x04\xab\x6f\xd0\x04\x16\x96\xe8\x0b\x0c\xab\x8d\xc8\x5a\x56\x16\x56\x9b\x69\x06\x64\x36\x56\x81\x6d\x6f\x4d\xb5\xb0\xd0\x33\x2b\x65\x33\x36\x75\x65\xfa\x93\xf7\x2d\x9c\x33\xbe\x89\xd1\x36\x98\xc6\x1b\xe6\x18\x08\xbc\x63\x48\x81\x2c\xf4\x9c\x09\xee\xaf\x88\x0f\x68\x33\x33\x1d\xf7\xeb\x6a\x87\x4f\x73\x8b\x7d\x72\x3e\xcd\x77\x79\xd4\xd0\xaf\xc5\x99\x98\x58\xf6\x34\xa2\xc7\xe8\xc9\x88\xdc\x26\x65\x70\x63\x21\x53\x58\xe9\x67\x75\xd5\x0a\xd7\xd8\x56\xeb\x0e\x2e\xf3\x3c\x15\xb3\x6c\x90\x17\x83\x4b\x99\xcd\x8a\x9b\xc1\x9c\xc2\x4d\x03\xae\x50\x7f\x49\x25\xb3\xc5\x60\x95\xcf\x85\x01\x97\xdd\x87\xe9\x03\x62\xd4\xc1\x72\x56\x0e\x56\x79\x21\x06\xd5\x72\x96\x0d\xbc\xa7\x83\x52\x2e\x32\x99\xc8\x78\x96\x55\x1a\x48\x69\xc0\x39\x1a\xae\x37\xde\xdb\x7f\xfa\xec\xe0\xf9\xe1\xec\x32\x9e\x8b\x64\xb1\x94\x5f\xbe\xa6\xab\x2c\x5f\x7f\x2b\xca\xaa\xbe\xba\xfe\x7e\xf3\xe3\xe5\x6f\xaf\x5e\x1f\x1d\xbf\xf9\xd7\xc9\xef\xff\xdf\xe9\xdb\xb3\xf3\x77\xff\xff\xfb\x8b\x0f\x1f\xff\xf8\xf3\xaf\xff\xfa\xef\x27\x9f\x0d\x38\x43\x4f\x78\xfb\x70\x83\xde\x3e\x5c\xdc\x2f\xec\xf5\xe0\x3d\x4e\x3c\x32\x3f\x9e\xeb\x82\x27\xf6\xc0\x13\xfb\xe0\x89\xa7\xe0\x89\x67\xe0\x89\x03\xf0\xc4\x73\xf0\xc4\x21\x78\x82\x06\x09\xcf\xa3\x3f\x63\xfa\xb3\x37\x85\x97\xea\x43\x8e\x23\xf4\xc4\xa1\xfa\xa2\x4a\x55\x51\x1a\xdd\xf1\x6c\x8a\x9d\xe7\x22\x91\x99\x30\x4d\xfd\xeb\xcc\x56\x73\xae\x1f\xd9\x43\x53\x33\xbb\xdd\x7c\xb7\x69\xd4\x99\x1e\x37\xdf\x54\x7f\xab\x0b\x1b\x61\x9a\xfa\xd7\x21\x2f\xab\xa8\xf4\x05\xc0\xdd\x26\x9c\xc1\x70\xc9\xab\xe2\xe6\xe7\x12\x0b\xf1\xad\x96\x85\x60\x6d\x3d\xa8\xc1\x6f\xe3\x59\x15\x2f\xd9\x6b\xfe\xf3\x56\x73\xa0\x70\xfa\x2f\xcb\x70\x76\xdb\x66\x05\xfe\x63\x34\xfa\xcf\x41\x99\xd7\x45\x2c\xde\xce\xd6\x6b\x99\x2d\x3e\xbe\x3f\xc5\x79\x1e\xdf\xf9\xf7\x1a\xce\x6a\xb6\xfe\x8f\xff\x17\x00\x00\xff\xff\x2f\x88\x72\xca\xa2\x43\x00\x00") - -func bignumberJsBytes() ([]byte, error) { - return bindataRead( - _bignumberJs, - "bignumber.js", - ) -} - -func bignumberJs() (*asset, error) { - bytes, err := bignumberJsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "bignumber.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -var _web3Js = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x6b\x7b\x13\x39\xd2\x38\x0e\xbf\xcf\xa7\x50\xfc\xdc\x0f\xb6\x49\x63\xe7\x34\x0c\xd3\x99\x0c\x1b\x02\x33\x64\x6f\x20\x5c\x40\x76\x76\xef\x6c\x96\xab\xed\x96\x6d\x0d\xed\x6e\xff\xba\xdb\x09\x19\x92\xef\xfe\xbf\x54\x3a\x1f\xfa\xe0\x24\xcc\x69\x93\x17\xe0\x96\x4a\xa7\x52\xa9\x54\x2a\x95\xaa\x72\xfc\xff\x96\x24\xc7\xfb\xbd\xc9\x32\x1d\x97\x24\x4b\x11\xee\x95\x41\x1a\xe4\xfd\x2f\x32\xa5\xe8\x65\xc1\xb2\xff\x85\x4c\x7a\xeb\xe9\x69\x76\xc6\x7e\x95\xf0\xeb\x3c\xca\x51\xb4\x5f\x5e\x2e\x70\x36\x41\xa2\xae\xfd\x8e\x28\xda\x79\xf0\x80\x27\xee\xd1\x32\xcb\x07\x0f\xa2\x7e\x8e\xcb\x65\x9e\xa2\xa8\x97\x05\xeb\x9b\x7d\x9a\x4e\x44\x1a\xe1\x69\xb4\xd6\xc9\x7e\x8a\x2f\xd0\x8b\x3c\xcf\xf2\x5e\xe7\x30\x4a\xd3\xac\x44\x13\x92\xc6\x68\x9e\xc5\xcb\x04\xa3\x6e\x67\x23\xdb\xe8\x74\x3b\xfd\xbd\x72\x96\x67\x17\x68\x32\x18\x67\x31\xde\xef\xbc\x3e\x7e\x7e\xf2\xea\xc5\xc7\x37\xc7\x1f\x3e\xfe\x78\x7c\xf2\xe6\x79\x27\x98\x5c\xd3\xfa\x92\x7d\xda\xf7\xfd\x2f\xf8\xf3\x22\xcb\xcb\x22\xfc\x72\x7d\xbd\x47\xc7\x70\xba\x79\x36\x18\x47\x49\xd2\x4b\x06\x3c\x2b\x10\xbd\xef\x61\x36\xc0\x74\x1f\x00\xb7\xce\x4e\xf1\xd9\x1e\xef\x6a\xd1\x4b\x9f\xa6\x21\xee\x5f\x07\x49\xa0\x4a\xe2\x80\xe1\xee\x9a\x43\xd1\x26\x45\x26\xf4\x82\xb4\xc2\xd5\x24\xcb\x7b\x14\x3a\xdb\xdf\xdc\xcb\xbe\xcf\x07\x09\x4e\xa7\xe5\x6c\x2f\xdb\xd8\xe8\x17\xbd\x9c\x22\x5e\x76\xe3\xba\xdf\xfb\xb2\x15\x9e\xca\x2e\xf3\x2a\x02\x86\xa5\x80\xb7\xdd\xff\xb2\xc6\x12\x44\x67\xf6\x4f\xd7\x10\xfa\xb2\x86\x10\x42\x9d\x71\x96\x16\x65\x94\x96\x9d\x10\x95\xf9\x12\x07\x2c\x95\xa4\x8b\x65\x59\x74\x42\x74\x0a\xdf\x02\x1a\xf2\xd2\x68\x8e\x3b\x21\xea\x7c\xcc\x2e\x52\x9c\x77\x02\x95\x43\x47\x47\x73\xa2\x38\xce\x71\x51\x74\x78\xce\x35\xfc\x7f\xc6\xab\x16\xc5\xe1\x7f\x9e\x96\x2d\xcb\xe6\xf6\xb2\x8f\x5a\x11\xa3\xbd\xd1\x65\x89\x8b\x9d\x6d\x7f\x7b\x02\x48\x62\x7a\x0d\xa1\xeb\xe0\x4e\x10\x70\xa3\xfe\xc8\xe1\x68\xd8\x6b\x87\x80\x95\x51\xfd\x47\x1d\xfa\x38\x4b\x4b\x9c\x96\xb7\x1e\xfc\x9f\x72\xde\xe9\x8c\xfd\x61\xa6\x7d\x12\x25\xc5\x6f\x37\xf4\x1c\x17\x38\x3f\xf7\xad\xfa\x3f\xfa\xa4\x15\xcb\xd1\x3b\x3c\x25\x45\x99\x47\xff\x05\x93\x17\xd4\xd5\x81\x2f\x8e\x6f\xc5\xf7\xcb\x3c\x4a\x8b\x89\x97\xf5\xfd\x59\x70\x90\x5b\xa4\xb0\x3a\x12\x0a\x5c\xbe\xaf\x27\xa9\x3b\xc3\x85\xdd\xf4\x6f\xd2\xe8\x57\x9e\x80\xa8\x0d\xe2\xeb\x2a\x58\xe4\x64\x1e\xe5\x97\xde\x7e\x64\x59\xd2\x38\x79\x07\xbc\xad\x3f\x2f\x0a\xcd\x3d\xb8\xb6\x9a\x2a\x24\x1c\x56\x6e\xe3\x7f\x24\x24\x78\x7b\x1f\x93\x22\xbb\x48\x6f\xd1\xf3\x28\xcd\xd2\xcb\x79\xb6\x2c\x56\xe8\x3a\x49\x63\xfc\x19\xc7\xc6\xde\x75\x67\x13\xab\x2a\xd7\xba\x63\xd6\x7e\x41\xd2\xdb\x30\xee\x83\x25\x60\xe2\x45\x1a\xe3\xb8\x63\xa1\x09\x9f\x53\x42\xf8\x0b\xe0\x68\x44\xe2\xb8\x1d\x8e\x6e\x56\xff\x79\x94\x2c\xbd\xdd\x5f\x92\xb4\xdc\xfe\xe6\x71\xfd\x14\xbc\xc1\x17\xcf\xc8\xef\x88\xfc\x5b\xad\xb9\xc3\x59\x94\x4e\x7f\x4f\xd2\xb9\x13\xca\xa9\xa8\x5b\x93\xea\x6b\xa9\xc6\x8b\x99\xb7\x6c\x37\x6a\x44\xd0\xda\xd9\xda\xda\x75\xf0\xe5\xfa\x2c\xd8\xfe\xdd\x0e\xfd\x7f\xa1\x33\xef\xef\x24\x3b\x4e\x96\x69\x7c\x63\x52\xb9\xf5\xc6\x75\x7f\xec\xfd\x73\x1f\x7b\xef\x0f\x7d\x7f\xe4\x33\x87\x77\xf0\xfc\xbc\xf0\x47\x93\x36\xbf\xee\x66\xae\xf6\xaa\x9d\x3b\xdb\xab\x56\x9d\xf7\x49\x9e\xcd\x6f\x39\xed\x65\x76\xcb\xa3\xe6\xed\x04\xbe\xdf\x77\xdd\xfc\x11\xf0\x47\xd2\x98\xe4\x78\x5c\x1e\x79\xf7\xcc\x15\x7a\x72\xbb\x89\x20\xe3\x68\xf1\xe1\x77\x9d\x0c\x3f\x26\xdb\x9d\x76\xf1\x22\x2b\x48\xdd\x41\x7d\x11\x5d\x46\xa3\x04\x9b\x42\xc1\xef\xc2\x95\xaa\x68\xee\x4e\x8e\x5f\xb7\xa3\x81\x03\x31\xde\xe7\x26\x3e\x7f\xfb\x93\xcc\x9d\x20\xa9\xa2\xee\x76\x74\xf6\x3b\xa0\xff\x0f\x8b\xf5\xbb\x38\x3f\xde\x98\x4f\x7e\x6d\xac\xdb\x4c\xef\x1e\xed\x2d\xd1\x7e\xeb\x8d\xeb\x6b\xcf\xec\x91\x67\x4b\xab\x93\xe3\x76\xdb\xc8\x71\x60\xbc\x81\xf6\x85\x85\x43\xaf\x3b\x18\x4e\xb2\x7c\x1e\x95\x25\xce\x8b\x6e\x7f\x0f\x00\xde\x67\x09\x89\x49\x79\xf9\xe1\x72\x81\x4d\x58\xda\x3e\x85\x5a\x1b\x3e\x7c\xb8\x86\x1e\x1a\x90\x5c\xe7\x8e\x48\x81\x22\xb4\xc8\xb3\x8c\x02\xa3\x72\x16\x95\x28\xc7\x0b\x7a\xc8\x4a\xcb\x02\xf1\xb9\x43\x34\x93\xd6\x70\x54\xa2\x79\x54\x8e\x67\xb8\x08\xe9\x27\xcf\xd6\x7e\x9e\x9e\xe9\x1f\xbb\xc6\xd7\x99\x99\xb9\x63\x7d\x9f\x9d\x3e\x3e\x3b\x3d\x0b\xd0\x60\x30\x58\x43\x0f\x87\xce\xd8\x44\x8f\xf7\x91\xb4\xa6\xe9\xf5\xf9\x14\x97\x33\x52\x0c\x3e\xc2\xc2\xf8\x51\x20\x88\x02\x0e\x18\xba\x8e\x68\xc6\x51\x5a\xee\x69\xc0\x6c\xdf\xf6\x41\x1f\x43\x0e\x6f\x6e\x6f\xed\x7a\x6f\x6d\xcd\xd3\x8f\xc1\x22\xcf\x4a\x86\xb5\x7d\x94\xe2\x0b\xa3\xaf\xbd\x2f\xd7\xfd\xbd\xfa\x52\x03\x90\x5e\xf2\xe5\xb8\xcc\x68\xe3\x1e\xd8\xa6\x76\x07\xa4\xe0\x73\xae\x10\x42\xc9\x51\x20\x85\xdb\xb5\xac\xaf\xd3\xc4\x01\xcc\x5b\x6f\xc8\xb1\xdd\xfb\xf7\x69\xef\x74\xf3\xd1\x77\x67\x0f\xfb\xff\x3e\xeb\x3f\x1d\xf6\xd9\x38\xcd\x83\x43\x65\xb7\xae\x83\x2f\x1d\x9d\x14\x3b\xe1\x77\x41\x87\xd1\x5b\x27\xdc\xda\xbd\x3e\x0b\xbe\xf9\x9d\xc9\xfb\x59\x96\x25\x0d\xb4\x3d\xa2\x20\x15\x84\x4d\xf3\xc4\xff\x8c\x4a\xe1\xd7\xae\xfa\x79\xa6\x25\xef\xe8\x1f\x4d\x64\x0c\x3d\xbb\x29\x0d\xd3\xc2\xab\x10\x31\x83\xb7\x29\x98\xa6\xae\x48\xbe\x66\x91\x1a\xda\x65\x2d\xd6\x95\xbd\x09\xd5\xfe\x87\xa2\xd6\xa4\xd9\x87\xff\xd3\x8a\x68\x79\x7f\x9a\x29\xf6\xf1\xef\x4d\xb1\x74\x0f\x93\x24\x5b\xfa\x69\xb6\x9c\x61\x04\x9b\x1d\x10\xee\xc0\x47\xb9\x34\x57\xfe\xe0\x74\x09\x3f\x77\xb5\xdf\x67\x7a\xc6\x8e\xf1\x65\xd2\x2f\xe2\x5b\xab\xfc\xf9\xc4\xa8\x87\x17\xf5\x50\x39\x74\xf2\xc6\x64\x4e\x4b\xaf\x44\xe7\xac\x80\x43\xe8\x34\x79\x55\x4a\x37\xcb\xd4\x91\x3a\x6b\xb4\xb6\xf4\xcd\x88\x9d\x56\xc2\x48\xfd\xcb\x56\x70\xdd\xbf\x19\xe1\xf3\xde\x35\x53\xfe\xb7\x6d\x28\x7f\xf8\x10\x3a\xfc\x61\x46\x0a\x34\x21\x09\xa6\x94\xba\x88\xf2\x12\x65\x13\x74\x81\x47\x3b\x83\x5f\x8a\xc1\x1a\x80\xf0\x2f\x0a\x30\xc9\x31\x46\x45\x36\x29\x2f\xa2\x1c\x87\xe8\x32\x5b\xa2\x71\x94\xa2\x1c\xc7\xa4\x28\x73\x32\x5a\x96\x18\x91\x12\x45\x69\x3c\xcc\x72\x34\xcf\x62\x32\xb9\x84\x3a\x48\x89\x96\x69\x8c\x73\x20\xf8\x12\xe7\xf3\x82\xb6\x43\x3f\x7e\x7a\x73\x82\x5e\xe1\xa2\xc0\x39\xfa\x09\xa7\x38\x8f\x12\xf4\x76\x39\x4a\xc8\x18\xbd\x22\x63\x9c\x16\x18\x45\x05\x5a\xd0\x94\x62\x86\x63\x34\xba\xe4\x54\x84\xd1\x8f\xb4\x33\xef\x79\x67\xd0\x8f\xd9\x32\x8d\x23\x3a\xe6\x00\x61\x52\xce\x70\x8e\xce\x71\x5e\xd0\x19\xda\x11\x6d\xf1\x1a\x03\x94\xe5\x50\x4b\x2f\x2a\xe9\x18\x72\x94\x2d\x68\xc1\x3e\x8a\xd2\x4b\x94\x44\xa5\x2a\xeb\xa2\x40\x8d\x34\x46\x24\x85\x6a\x67\x99\x58\xd9\xa4\x44\x17\x24\x49\xd0\x08\xa3\x65\x81\x27\xcb\x84\x09\x8e\xa3\x65\x89\x7e\x3e\xfa\xf0\xf2\xf8\xe4\x03\x3a\x78\xf3\x2f\xf4\xf3\xc1\xbb\x77\x07\x6f\x3e\xfc\x6b\x0f\x5d\x90\x72\x96\x2d\x4b\x44\x25\x4a\xa8\x8b\xcc\x17\x09\xc1\x31\xba\x88\xf2\x3c\x4a\xcb\x4b\x94\x4d\xa0\x8a\xd7\x2f\xde\x1d\xbe\x3c\x78\xf3\xe1\xe0\xd9\xd1\xab\xa3\x0f\xff\x42\x59\x8e\x7e\x3c\xfa\xf0\xe6\xc5\xfb\xf7\xe8\xc7\xe3\x77\xe8\x00\xbd\x3d\x78\xf7\xe1\xe8\xf0\xe4\xd5\xc1\x3b\xf4\xf6\xe4\xdd\xdb\xe3\xf7\x2f\x06\x08\xbd\xc7\xb4\x63\x18\x6a\x68\x46\xf4\x04\xe6\x2c\xc7\x28\xc6\x65\x44\x12\x31\xff\xff\xca\x96\xa8\x98\x65\xcb\x24\x46\xb3\xe8\x1c\xa3\x1c\x8f\x31\x39\xc7\x31\x8a\xd0\x38\x5b\x5c\xb6\x9e\x48\xa8\x2c\x4a\xb2\x74\x0a\xc3\x96\x54\x86\xd0\xd1\x04\xa5\x59\x19\xa0\x02\x63\xf4\xfd\xac\x2c\x17\xe1\x70\x78\x71\x71\x31\x98\xa6\xcb\x41\x96\x4f\x87\x09\xab\xa0\x18\xfe\x30\x58\x7b\x38\x14\xcc\xf6\x6f\x40\xb6\xe3\x2c\xc6\xf9\xe0\x17\x60\x91\x7f\x8b\x96\xe5\x2c\xcb\xd1\xeb\x28\xc7\x9f\xd0\xff\x66\x25\xbe\x20\xe3\x5f\xd1\xf7\x73\xfa\xfd\x37\x5c\xce\x62\x7c\x3e\x18\x67\xf3\x1f\x00\x38\x8e\x4a\x8c\xb6\x37\xb7\xbe\x01\x86\xd7\xbc\x15\xd4\x08\xb0\x5a\x19\x2e\x8f\xf9\xf6\x0e\x2e\x29\x68\xc0\x74\x17\xf4\x41\x1e\xa5\xa5\x09\x48\xd2\xd2\x07\x77\xe2\x00\x2e\x2b\x20\x9f\x5f\xa6\xd1\x9c\x8c\x05\x1b\xd7\x4a\xc4\x2c\x07\x78\x94\xaf\xe4\xfb\x32\x27\xe9\xd4\x2c\x53\x40\x9a\x0f\xfa\x1d\x8e\xac\x31\xe6\x38\xf2\x8e\xf1\xc4\x05\x5d\x56\xc1\x7a\xba\x2d\xfb\x0b\xc0\xa4\xe0\x03\x34\x38\x73\xa1\x55\x11\xc0\x0e\xcb\xf9\xb4\xb0\x10\xd7\xf2\x07\xb2\x0a\xd8\x46\x18\xf0\xd5\x95\x3c\x3d\xa2\x0a\xe8\x83\x3c\x8f\x2e\x19\x38\x63\xe2\x96\x28\x70\x48\xe9\x53\x93\x00\xf8\x4a\x62\x1c\x22\x46\x65\x86\x70\x4a\x69\x78\x18\x63\xfa\x9f\x6c\x85\x32\xe3\x88\xb1\x49\xca\x95\xb8\x5c\x6b\x6e\xcc\xac\x6e\x7d\xc4\x14\xac\x30\x77\x66\x48\x42\xfb\x50\x43\x61\x74\x11\x78\xff\x1c\x97\xb3\x2c\xf6\x74\x8b\x29\xd7\xb3\x7c\x8e\x98\xe4\x92\x19\x33\xb2\x86\xd8\x1a\xe4\xc5\x3f\xf2\x99\xe1\x59\xe8\x6f\xd0\x7b\xf4\x85\x11\xcf\xb5\x14\xcb\xff\xc6\x30\x5f\xa0\x2f\x7a\x65\xd7\x90\x05\x6f\x15\x0a\xf4\x05\xde\x35\x5c\x23\xfe\x49\x28\x6f\x60\x12\x11\x25\x43\xe8\x0b\xdd\x89\x28\xbb\x07\x84\x18\xc8\xd0\x76\x6a\xbd\x4b\x0e\x8e\x04\x8a\x28\x36\x0b\x53\xbc\xd3\xb0\x36\x98\x90\xa4\xc4\x79\x4f\x2b\xdb\xd7\x74\x10\x9c\x8a\x4a\x2e\x14\x08\x22\x00\x9d\x42\xff\x74\xf3\x6c\x8f\xf1\x4f\x32\x41\xbd\x75\xbd\x11\xbd\x0e\xf6\x40\x83\x3d\xe5\xe8\x92\xf4\x3c\x4a\x48\xac\x68\x80\xd6\xb8\x1e\xa2\x2e\xda\x40\x7a\xe5\x6b\xba\xac\xa1\xd7\x6c\x52\x60\x05\xa5\xa1\x45\x12\x91\x94\xd1\x97\x35\x8d\x0c\xe0\x2d\xcf\xa9\x9e\x45\x9e\x7e\x3c\xfa\x05\x8f\xcb\x6b\xab\x42\x31\xc9\xaa\x1c\xab\x36\xb6\xe0\xaa\xa7\x4e\xeb\x86\x33\x73\x01\x2b\x6f\x09\x5c\x30\x69\x5a\xb1\xa2\x77\x4a\x81\xcf\x02\x74\x0a\xe0\x67\xfd\x76\xa8\x49\x48\x01\x12\x10\x5b\x7c\xd5\xd8\x29\x74\x34\x00\x0b\x60\xd8\xf1\xa5\x2f\x54\x81\x2a\xc4\x38\xcd\xb6\xc2\x4d\xe1\x2e\x7d\x8e\x9d\xa2\x8a\xbe\x0b\x41\xe0\x53\x5c\xea\x2b\xb0\xe0\x9c\x83\x93\x2c\x2d\xc6\xfb\x46\x4b\x18\x35\x0c\xe6\xd1\xa2\x57\xc5\x63\x41\x2b\xe7\x59\x23\x06\xef\x64\x35\xf7\x58\x4f\x4f\xa1\xc8\x19\x63\xcf\xe2\x4b\xae\x22\xad\x3f\x7c\x9f\x3a\x9e\x4c\x0a\x5c\x3a\x9d\xca\x71\xbc\x1c\x63\xad\x5f\xd1\x78\x1c\xa0\x86\xce\x01\x76\xca\xa8\x24\xe3\xb7\x51\x5e\xbe\x82\x97\x44\x56\xcd\x03\x3b\xbf\xe7\xe9\xa7\xa8\x2b\xa7\x4c\x09\xc7\xef\xdd\x2a\x5f\x47\xe5\x6c\x30\x49\xb2\x2c\xef\xf5\x9c\x16\x37\xd0\xce\x56\x1f\x0d\xd1\xce\x76\x1f\x3d\x44\x3b\xdb\x7c\xd0\x1a\xfa\xa2\xf1\x18\x6d\xa0\x9e\xdc\x74\x0c\xac\x57\xa0\x10\x3d\xd5\xf6\x2e\x84\x76\xb6\x51\x68\x24\x54\x74\x56\xa0\x3e\x40\x9b\x3a\xf6\x73\x5c\x2c\x93\x52\x50\x0f\x9b\xc1\xd7\xcb\xa4\x24\x3f\x93\x72\xc6\xe6\x44\x50\xa0\xd1\xb7\x40\xd2\x51\x60\xce\xa0\xa8\x9c\x8f\x90\xd5\x6f\x9e\xf8\xfc\xa4\x6f\xb5\xea\x5b\x03\x2d\x7b\xa0\xad\x11\x39\xbc\x4e\x67\x4f\x2d\x1c\x9c\x4c\xf8\x88\x79\x67\xf9\xae\x90\xe5\x2f\xa2\xf1\xac\x67\x33\x26\xa2\xd3\x16\xe5\xfa\x95\xf3\xa5\xe6\xea\xac\xaf\x17\x62\x08\x81\xae\x6c\xb8\xda\xce\x9e\xd9\x7d\xb1\x8e\x34\x22\x94\x6b\x97\x52\x31\x4e\x26\x1c\xc4\x9e\x23\xe8\x80\xdb\x25\x81\x27\xf8\xb0\x27\x4b\x6f\xc2\x5c\x8a\x1b\xfb\x08\xf3\x67\x78\x68\x88\xb6\x15\xe8\x35\xc2\x49\x81\xad\xe1\x0d\x87\x28\xce\xd2\x6e\x89\xa2\x38\x46\xbc\x54\x99\x99\x55\x0e\x10\x29\xbb\x05\x8a\x92\x1c\x47\xf1\x25\x1a\x67\xcb\xb4\xc4\x71\x05\x96\xbe\xd2\x38\xaf\xd5\x22\x1c\x0e\xd1\x87\xe3\xe7\xc7\x21\x9a\x90\xe9\x32\xc7\x88\x1e\xd8\x52\x5c\xd0\x13\x20\x3d\xa5\x5d\x16\x26\xb3\xfa\x2d\x88\xe4\x8f\x33\xc9\xe6\x64\x60\x1d\x81\x02\x2b\x15\xcb\x5c\xa2\x35\xc7\x93\x08\xd4\x31\x17\xb3\x2c\xc1\xac\x87\x24\x9d\xae\x37\x30\x82\x1a\x1e\x60\x73\x7e\x3e\xe8\x00\x65\xce\xca\x37\x16\xb9\x98\x93\x46\x51\xdf\xb3\xc5\xf5\x5c\xd5\x98\x46\x40\xac\x61\x74\x11\x29\xb2\x2e\x70\xe9\xcc\x29\x23\xab\x37\xd1\x1c\xdb\xfb\x90\xca\xd1\xe5\x4c\xb7\xac\x67\xf3\xa9\xdf\xcf\x54\xc5\x9e\x3a\x25\x5f\xe4\x18\x54\x52\xad\xf8\xab\x19\xb6\xa8\x64\x91\xe3\x73\x92\x2d\x0b\xd9\xa1\xed\x3d\x8a\x12\x92\x22\x92\x96\x4e\x89\x26\xfc\x6b\xfd\xf5\x35\x48\xff\x26\x59\x8e\xe0\x91\x30\x41\xfb\x68\x6b\x0f\x11\xf4\xbd\x18\x80\x78\x2f\x8c\xc8\xc6\x46\x55\x71\xfa\x67\xf5\x79\x63\x1f\x6d\xf4\x04\x0e\x08\x7a\x84\xb6\xce\xa8\x84\x8f\xae\xae\xd0\xe6\x5e\x65\x25\x35\xac\x9c\xd3\xc3\x06\x22\xe8\x61\xd5\xcc\x6d\xd8\xbd\xa0\xc2\x41\x15\xdb\x17\x7f\xd7\x4e\xaa\x99\x72\xdd\xef\xf5\xad\x29\x1c\x0e\xd1\x84\xe4\x45\x89\x70\x82\xe7\x38\x2d\xe9\xf9\x8a\xa1\x29\x40\xc5\x27\xb2\x40\xa4\x5c\x65\xca\x0d\xec\x6f\xfa\xb0\x4f\xf1\x57\x3b\x03\xf0\x74\x3e\x8e\x09\x6d\x24\x4a\xe4\x22\xe7\xf8\x74\xf8\x8f\x8b\x6f\x3f\x5f\x54\xa4\x53\xc1\x20\x4e\x09\xda\x40\x5b\x67\x82\x4f\xa0\x0d\xe4\x74\xc3\x83\xf6\x46\x04\x5b\xcc\xcf\x03\xc9\xb7\x4a\x0f\xed\x33\xaa\xb8\x31\xeb\xf9\x43\x33\x15\x2a\x6c\x99\x98\xba\xe5\xe2\x6f\xa0\x4c\x54\xc5\x90\x36\xeb\x18\x12\x6a\x45\xd3\x8d\x1c\x65\x38\x44\xe3\x28\x19\x2f\x93\xa8\xc4\x42\xf0\xa1\x47\x3e\xde\x17\x44\x4a\x3c\xbf\x05\x3b\xa2\xac\xe8\xf4\x4f\xc4\x94\xfa\x36\xec\xf5\x4a\xfb\xca\x2d\x27\xe4\xf7\x63\x30\x3a\x73\xf9\xea\xbc\x05\x39\xda\x22\xde\x8f\x06\x6d\x08\xd7\x45\xf2\x9b\xc9\xac\x46\x63\xc4\x20\x5b\x6b\x8c\x44\xba\xbc\xd5\x94\x2a\x11\xbf\x2e\xa9\x5a\x0f\xa2\x35\xec\x11\xff\xa0\x7e\x9f\x8e\x48\x2b\xa6\x74\x44\x0c\x1a\x64\x9b\x36\x68\xa9\x55\x12\x55\x20\xa4\x4a\x47\x54\x8d\x10\x5e\x02\x4e\x18\xd0\x9a\x42\x4c\xbd\x86\x48\x1f\xa2\xef\x74\x6c\xe0\x66\x75\x05\x91\x28\xc5\xa8\x58\x87\x67\x44\x5c\x78\x4f\xe1\xd6\x71\xff\x8e\x35\x4a\x6c\xc8\x3d\x18\x99\x58\x5f\x4a\x2d\x62\xe8\x45\x44\x8d\x4a\xc3\x54\xa7\x72\x50\xa3\x6a\xd4\x33\xe8\x18\x65\x1c\x88\x96\xb9\xeb\x91\xb6\x51\x47\xc9\x93\xa8\x4f\x0e\xe6\x5d\xab\x64\x92\xc3\x21\x2a\x96\x73\x76\x43\xe7\xd9\xa5\xb8\x88\x28\xe1\x79\x75\xa7\xe4\x8c\x72\x45\xf9\x05\x5b\x92\x8f\xff\x88\xe6\x4d\x44\x08\x69\xd3\x41\xc1\x70\x88\x72\x3c\xcf\xce\xe1\x1a\x13\x8d\x97\x79\x4e\xe5\x53\x29\x9c\x66\x90\xcc\xbb\x49\x0a\xe8\xb9\xa7\xb7\xc5\x2a\x1a\x3f\x81\xcc\xd6\x9a\x3f\x63\x64\xe8\x91\x53\x7f\x6b\x4a\x7b\x6f\xad\xc3\x8a\x6b\x1d\xef\xa9\x55\xf0\x38\x0f\x95\x95\xd6\x95\x83\x20\x2b\xba\x83\xe9\x97\x24\xe6\xfd\x05\xeb\x2d\x6d\x6b\xcc\x6f\x99\x74\x53\x0b\xe8\x7d\x8f\xd9\xab\xda\x26\x18\xfc\x5a\xb4\xd7\x0f\xbc\xd9\xcf\xb2\x2c\xa9\xca\xa3\x42\x48\x45\xd6\x49\x4d\x9e\x7e\xb9\x59\xd9\x6c\x5d\x26\xe3\xc2\x55\xb9\xef\x70\x54\xd9\xe3\x13\x96\xb9\x46\x09\xc2\xb5\xdf\x00\xd4\x49\x9b\x0d\x61\x38\x1b\xee\x06\x1d\x76\xf7\xdb\x09\xbf\x81\x9f\xb4\x6f\x9d\xf0\x31\xfd\xad\x5f\xc7\x76\xc2\x27\x81\xcf\xd6\x83\xa4\x65\x27\xdc\xda\xa4\x3f\x73\x1c\x25\x9d\x70\x6b\x9b\xfe\x66\xb7\xb2\x9d\x70\x6b\x87\x7e\x2d\x19\x14\x34\xb0\xe4\x60\x8f\xaf\xcf\x82\x27\xbf\xa5\x5d\x54\xc3\x35\xf4\xcd\xac\x89\xf4\x4a\x56\x31\x2a\x32\xcb\xd9\xb6\x45\x7a\xee\x8a\x26\x46\xfe\xa2\x35\x96\x46\x66\x4f\xda\xd4\x75\x0b\xbb\xa3\x0a\x63\xa3\x56\x8d\x6a\x57\xe2\xde\xe9\x12\x6c\x27\x5f\xe2\x16\x26\x4c\xd6\xb0\x9b\x2d\x99\xbe\xbb\xb7\x64\xba\xb7\x64\xfa\x6f\xb1\x64\x52\x0b\xe1\xae\xcc\x99\x9e\x91\xe9\x9b\xe5\x7c\x04\xac\x50\x72\xe7\x11\x99\xa6\x90\x38\xf8\x45\x72\xf2\x65\x49\x12\xd3\xbe\x66\x30\x84\x34\xf6\xaf\x00\x1b\x7b\x41\xc6\x59\x3a\x21\x8e\x31\x90\x38\x99\x69\xbb\x02\x9c\x5d\x60\x5b\x10\x03\x67\xbc\xba\x40\xc0\xef\x11\x3c\xd8\xa0\xe7\x2c\xca\xb7\x94\x95\x2c\x2c\x05\x3a\x37\xa0\x9c\x79\x48\x71\xcc\x20\x49\x81\x52\x3c\x8d\x4a\x72\x8e\x03\xc1\x89\xe0\xe2\xa8\xbc\xc8\xba\x05\x1a\x67\xf3\x85\x90\x56\xa1\x14\x9d\x5b\x59\x72\x92\x64\x51\x49\xd2\x29\x5a\x64\x24\x2d\x03\x76\x1d\x4a\xc9\x3e\xce\x2e\x52\xeb\x4c\x67\xaa\x49\xdc\xe3\xdb\x15\xc3\xf2\x95\xc4\xf7\xb5\x18\x0b\x5d\x4a\x29\xc6\x31\x9c\xa2\x47\x6a\x8e\x63\xbf\x31\x0c\x20\xed\x5a\xda\xf9\x98\xed\x1a\x0c\x18\xea\x17\x5c\x58\xb6\x3b\x60\x73\xd1\x1b\x0f\x5e\x7c\x78\xf9\xf1\xd9\xd1\x4f\x6f\x4e\x5e\x3f\x7b\xf1\xee\xe3\xbb\xe3\x93\x37\xcf\x8f\xde\xfc\xf4\xf1\xf5\xf1\xf3\x17\xda\x19\x4e\x6a\xe2\x60\x26\x07\x8b\x28\x7e\x85\x27\x65\x8f\x7d\x95\xd9\x87\x8b\xac\x38\x94\x58\xe4\x6d\x0e\xca\x8c\x8b\x4b\x5b\x8f\xfb\x01\x7a\xbc\x6b\xde\xf0\xe8\xbb\x25\x0c\xa7\xc7\x1a\x31\x0d\x30\xcc\x89\x17\x87\xdf\x0a\x9c\x3f\x93\x67\x63\xf3\xd0\xbc\x2a\x0e\x5d\xa9\xc3\xc0\xa2\x07\x21\x65\xf6\x12\x7f\x16\xe3\x2e\x96\xa3\xa2\xcc\x7b\xdb\x1a\xfe\x12\xeb\x6a\x9f\x15\x17\x5a\xee\x0d\xf4\x78\xa7\x8f\x86\x3a\x8a\x6c\x74\xbf\x23\xd3\x59\xc9\x8b\x05\x28\x41\x0f\xbf\x32\x3e\xf9\x0e\x7c\xa7\x68\xad\x94\xe9\x6e\x8d\x5d\x71\x3c\x33\xd1\x2a\xb5\x73\xbf\xdb\x0c\x58\x6a\x53\xd6\x58\x7f\xc0\xd6\xfc\x06\x6a\x9e\xa0\x26\x4e\xc7\x24\xf9\xea\x15\xf1\x5e\xe4\xdf\x76\xee\xa4\x71\x67\xfb\x59\x9b\xe4\xd9\xfc\xa4\x9c\x3c\xb9\x9f\x38\xcf\xc4\xf1\x77\x46\x55\x8c\x8c\xbf\x42\x12\x93\x46\xbf\x71\x94\xae\xce\xc8\xec\x27\x47\xd5\x73\xd6\xdd\xbc\xdd\x5f\x17\x6d\xf0\xea\xd1\x53\x84\xba\x5b\x5d\x14\xa2\xee\x66\xf7\xf6\x3c\xaa\x09\x93\xf4\xc4\x4a\x4b\xfd\x83\xc2\x15\x88\x0a\xc6\xf3\x65\x52\x12\x26\x54\x8e\x2e\xd1\xf6\x7f\xe6\x54\x3c\x97\x36\x74\x11\xad\xb9\xc4\x53\x9c\xd7\x6c\x25\xef\x78\xad\x4d\xfb\xf7\xaa\x33\xc2\x6d\x99\x2b\x66\x84\xa3\xc9\xa2\x3e\x8a\x35\xd9\xa2\xdc\x5c\xc9\x1c\x17\x56\xd6\x76\x7f\xb0\xc8\x2e\x7a\x5b\xdb\x4f\xfa\x7d\x13\xa5\x87\x33\x3c\xfe\x84\xc8\xc4\xc0\xa9\x26\x16\x59\x88\x28\xc8\x34\xc5\xf1\x51\xf1\x46\x65\x3b\x8a\x68\x59\xc7\x0c\x7f\xe6\x3d\x36\x91\x21\x88\x16\x0e\x7d\xd0\x76\x69\x4a\x62\x19\x3d\xb2\x5c\x10\x2a\x86\x47\x49\xa1\xac\x96\xed\xd6\x1b\xf1\xe5\xc3\x90\x60\x37\x9b\x01\xda\xea\x07\x68\xeb\xb1\x26\x8f\x6c\xf7\x8d\xdc\x3e\xda\xdf\xdf\xa7\x24\xeb\xa5\xc2\x9c\xb2\x8f\x47\x51\x02\x9d\x42\x4c\x75\xa0\x2e\x3c\x98\xa8\xe9\x12\x11\x53\x24\xd8\x42\xa0\x41\x1e\x8e\x1d\x2c\xc5\x99\x12\x0c\x6b\xda\x95\xc2\x21\x2c\x0b\x32\x45\x4c\x4e\xb7\xe8\x4d\x76\xc1\xc0\x9f\x61\x14\x4b\x81\xd9\x3c\xee\xb3\xde\x68\xba\xcc\x5e\x1f\x5d\x5d\xa1\xce\x66\x87\xeb\x88\x87\x43\x34\x96\x54\x44\x85\x67\x31\x91\xb2\x75\x06\x44\x4a\x36\xd1\x52\xd2\x76\x85\x6c\x71\x7f\x6b\xcd\x33\x9f\x5b\x8f\x0a\xd2\x33\xbf\x6c\x4a\xe7\x24\x5d\xda\xab\xa0\x3b\xb9\xe5\x5f\x17\xea\x16\x95\x6f\xc9\xeb\xb1\x16\x1d\xba\x01\x05\x2d\xeb\x49\xe8\xa4\x96\x86\x7c\xd4\x83\x57\x22\x1f\xde\xbc\x4b\x38\x27\x77\x41\x39\x5f\x07\x65\x9c\xe5\x57\xa1\xcc\xe1\xdd\x8d\x28\x03\x8c\x69\x22\xb1\x89\x22\xde\x9c\x8b\x22\x87\x99\xfb\x2c\xce\xad\xc5\xc8\x61\x06\x31\x39\x27\x31\x8e\x9f\x5d\xd6\xf0\xf0\x9b\x50\x53\x03\x6e\x4e\xee\x1a\x39\xcb\x4a\xec\x9c\xac\x8c\x9e\x93\xdb\xe0\xc7\xbd\x85\x65\x55\x4b\x14\x55\x49\x5c\xea\xc1\x74\x6b\xbc\x88\x9d\xcd\x9c\x8b\x4a\x1c\xf1\xa6\x5d\x14\x39\xf2\x99\x0f\x43\x9e\xe5\x05\xfb\xd5\x2d\x05\xb6\xad\x2e\x7a\xca\xb6\x66\xee\x19\x63\x35\x6c\x56\x9e\x1c\xb5\x77\xb9\x35\x7b\x5f\x82\x27\x0a\x71\x54\x82\xa8\x39\xdb\x38\xa2\x47\x1a\xcd\x31\x7b\xe0\x43\x7f\x59\x22\x18\x87\xa1\x75\xca\x1a\x3c\x98\x77\x0e\xa1\xd0\x46\x80\x74\x65\x39\x2d\xc4\x9f\x58\xa3\x7d\x54\xf5\x52\xf7\x61\x7f\xa8\x1d\x69\x0a\xf2\x2b\xe7\x89\x05\xdc\x52\xf1\xf2\xa7\x5b\x67\xa6\x28\xdc\xdd\xfc\x4c\x45\x66\x77\x72\x07\x45\x42\xc6\x98\x4a\x26\xdb\xe8\x21\x54\xb7\x22\x9d\x37\xcc\x8c\x7e\x0a\xbf\xb3\x09\x5a\x15\xfd\x95\xaa\x00\x67\x93\x91\x47\x44\x8b\x0f\x30\xc4\xf1\x4b\x30\x1b\x73\x8f\x77\xfb\x7c\x0f\x2f\x33\x0e\xdf\x47\x0f\xc5\xa9\xd2\x37\x03\x56\x45\x4c\x3a\x7c\xbc\x1b\xf0\xf6\x57\x9b\x82\x9a\x53\x39\x1b\xbe\xe7\x58\x7e\xa7\xd8\x8f\x8a\x31\x21\x75\xf8\xf7\x1c\xe7\x7f\x43\xcc\x0b\xad\x0e\x68\x07\xda\xe1\x7f\xb5\x09\x50\xee\x69\xaa\x66\xe0\x40\x39\xb0\xa9\x98\x82\x4a\xde\x5e\x81\x72\x59\xa1\x8b\x6d\x9f\x03\x9b\x15\xa4\x29\x03\x77\x9d\xcd\xcf\x1d\xb4\x81\xf8\x19\x07\xd0\xce\x7e\x4b\xb3\x82\xdd\xcd\x00\xe9\x49\x55\x3e\x03\xbe\x08\xd3\x0f\xed\xac\x19\x5a\xdf\x81\x0d\x03\x2b\x36\x74\x52\x1c\x38\x7d\x81\x87\x55\x19\x4e\x29\x86\xcc\xd0\x4d\x72\xfb\x91\x65\x49\x68\x27\x38\x50\x54\x02\x09\xed\x04\x1d\x4a\x8a\x65\xa1\x9d\xe0\x42\x9d\x38\x60\x27\x5e\x38\xbd\x51\x95\xe2\xa9\xcf\x05\x3c\xf1\x43\xea\x83\x55\x29\x1e\x38\x1d\xdb\x5a\x92\x0b\xe9\x9b\x1e\x37\xc7\x2d\x67\x4e\x90\x9e\xe6\xc2\x72\xaa\x0f\xbd\xeb\xee\x5a\x5c\xeb\x9a\x97\x43\x9d\x70\xeb\x49\xd0\x31\x2f\x95\x3a\xe1\x36\x58\x30\xc0\xc2\xe8\x84\x5b\x5b\x41\x47\xbf\x9a\xea\x84\xe6\xe7\xf5\x59\xb0\xb5\xf9\x3b\xbb\x74\x39\x62\xb6\xf1\x35\x3e\x88\x48\x5a\x56\xb9\x20\xe2\xb7\x57\x24\x2d\x99\x77\x16\xfa\x63\x57\xfe\x3a\x53\x89\x3b\xda\x6f\xcb\x79\x0b\x49\x4b\xe6\xba\x85\xa4\xe5\xe3\x5d\x09\xf6\x44\x55\xb4\xfd\xcd\xe3\x8a\xba\x28\x7c\x83\x2b\x23\xfb\x68\xf8\x15\xbd\x71\x01\xb8\x6d\x86\x70\x94\x96\x2b\x5a\x5e\x18\x25\x6a\x0c\x2e\xa0\xb9\x9a\x92\x37\x32\xaf\x20\x69\x29\x44\xc5\xa7\x37\x72\xe9\xc2\x7a\xd5\x6c\x06\xb1\xd5\x2a\x8a\xdd\xbd\x1d\xc4\xbd\x1d\xc4\x9f\xd7\x0e\x02\x29\x43\x08\x26\x2a\xdd\x91\x0d\x44\x0b\xd3\x06\x9b\xd5\x33\xd3\x85\x0c\x0c\xd2\x95\xe7\x8e\x81\x47\x42\xbd\x98\xe1\x54\xbe\x57\x0c\x98\xed\x37\x15\xc0\xa5\x03\x07\x21\x59\x0e\xbd\xb6\x11\x96\xfa\xdb\x7e\x9e\x08\x9c\x54\xc8\x8f\xec\xff\xab\x2b\xd4\xed\x6a\x7c\x36\x13\x2f\x17\xd8\x8f\x3d\xed\xa9\x21\x49\x79\xeb\xad\x3d\x7e\x4c\x71\xa9\x9b\xfc\x82\x01\x79\xb7\x10\x0f\x41\x81\x97\xd0\x4a\x0c\x6b\x77\x25\xdf\x33\x63\x57\x53\x8a\x16\x6a\x26\x55\xab\x5e\x19\xea\x89\x3e\xf6\x0d\x83\x76\x40\x8f\x6e\xd0\x6e\x37\x52\x6b\x8a\x06\x56\xfe\xc6\xb1\x43\xbf\x7e\x6c\x8d\x8c\x71\x8e\x29\x31\x89\xf5\x60\xba\x65\x61\xe4\x1e\x93\xc9\x04\x83\x41\x32\x43\xb9\x75\x2e\xb9\x90\xef\x42\xf4\xe3\x88\x40\x09\x9f\x25\x61\xbb\x9c\x7a\x0f\x21\xe6\xd1\x85\x6e\x87\xbe\x7e\x44\x0b\xc6\x61\x64\x2f\xaa\x51\x79\xe1\x7f\x33\x6b\xd2\x5d\xe5\xad\x9e\x22\x48\x49\xaa\xab\x60\x34\x9b\x8f\x48\xea\x7a\xb8\x29\xb3\x29\xa6\xdc\x9d\xd6\x80\xa7\x03\xb6\xa8\xa2\xc5\x02\xa7\xb0\x96\xa2\x94\xbd\x81\xb0\xb0\xcb\x6b\x6b\xba\x87\xe1\x8c\x69\x46\xc6\x94\x3d\x89\x5e\x35\x17\xe6\x17\xa8\xd9\x84\xc3\xc2\x3e\x54\x8b\x5a\x31\xbc\x26\xbd\x5f\x1d\x5a\xa5\xde\x82\x5d\x99\xec\xa1\x66\xec\x8e\xa3\x24\xe1\xf8\x15\xd7\x38\x6c\x44\xb3\x48\x2d\xdd\x82\xfc\xca\x9d\x0b\xc2\x75\xdd\x2c\x2a\x02\xfa\xbf\x20\x34\x70\xff\xeb\xb9\xb7\xd3\xf1\x2d\x6d\x41\xfd\x3a\xd3\x5a\xd4\xf8\xbd\x33\xf9\x16\x2e\x5f\x15\xeb\xfb\xfb\x20\x5d\x4c\x48\x6a\xbd\x55\x6a\x42\x82\xf2\x5a\xc4\xab\xe2\x37\xcc\xb6\xd2\x80\xe5\x1e\x14\xcf\xaa\x8f\xfe\x4c\xe3\xeb\x6a\x68\x5a\x2c\x33\xa3\xf6\xba\x41\xaf\xc3\xa8\x95\x0b\x80\x3e\x7a\x8a\xba\x5d\x14\xb6\x33\xc8\xd2\x50\xe6\x35\xcb\x5a\x01\x6f\x94\xf7\x33\xe5\x84\x94\x19\x7d\xcf\xbd\x94\xfe\xc2\x8f\x33\xb1\xf7\x88\x5b\xe1\x48\x67\xf8\xd1\x5c\x27\x32\x20\xf1\x5a\x2c\xaa\xc6\xbc\x28\x04\xbf\x4a\x36\xfe\x7c\xfe\x99\xe4\xf2\xda\x43\xec\xca\x0f\x55\xd0\x1d\x9f\xb0\xde\xea\xa8\x33\xb6\xb5\x0a\xdc\x69\x9b\x92\x1f\x79\x22\x21\x12\x97\xf0\x2d\xb0\x88\xe7\x8b\xf2\x52\x57\x09\xb6\xd8\x44\x1b\x57\xa1\x49\x8f\x1a\x7b\x0a\x41\xfa\x58\x01\x37\xc2\xe3\x54\xa5\xaf\x29\x2f\x26\x6a\x07\xc2\xab\x6c\x1a\x83\x71\xb1\xb2\xe1\x11\x0b\x6e\x32\x0e\xf5\x18\xaf\xda\x3f\xd4\x2b\x52\x94\xce\xcb\xbf\x53\x63\x34\x67\x1e\xa7\x50\xb5\xa3\x57\x35\xbb\xdb\x8b\x7c\x17\x24\x6e\xea\x97\x8b\x98\x59\xb6\xf2\x77\x70\x52\x15\x59\x66\xa5\xf6\xd6\x95\x15\x16\xc2\x11\xf3\x3b\x84\x8c\xb7\x7d\xf2\x09\x21\x07\x35\x9f\x15\x19\x7b\x9b\x5c\x8f\x6c\xfb\xaa\x58\x90\xf6\xed\x97\xed\x2c\xc4\x6c\x1e\xed\xeb\x3d\x56\xb0\xfa\x30\x36\xf6\x5d\x45\x3f\x7f\xad\xe5\xbe\xd0\x62\x90\x4a\x04\xea\x65\xfa\xab\x5b\xf9\x6a\x6e\x38\x14\xd3\x8d\xcf\x71\x7e\x59\xce\xc0\x17\x89\x56\x8f\x8e\x1d\xd7\xf1\x94\xb0\x48\x73\xf0\x63\xbc\xd4\xf5\xdf\x50\x48\xdf\x4b\x77\xda\x84\xab\x74\xbe\x0e\x50\xb7\x2b\x94\xef\x35\x4a\x8a\xb7\x6c\x96\x2c\x9d\x9e\x54\xdf\x5d\x9f\x05\x5b\xad\x62\xed\x7d\x45\x9d\x1c\xdc\x46\xd7\x2b\xe5\x72\x0a\x52\xa1\x95\x13\x66\x66\xf4\x7f\xa6\x2a\x83\x5f\xbb\xea\xe7\x99\x96\xbc\xa3\x7f\x58\xba\x39\x9a\xc6\x94\x73\xf4\x97\xd0\xce\xd1\xdf\x4f\xb4\xea\x34\xfd\x9c\x53\x63\x0b\x0d\x9d\x73\xf7\xbe\x8a\x8a\x8e\x16\x5e\x45\x47\xc7\xe0\x6d\x25\x1d\x4d\x5d\x51\x4b\x67\x16\xa9\x51\xd3\xb1\x16\xeb\xca\xde\x44\x51\x47\x71\x5b\xa1\xa8\x6b\xe7\x28\x9f\x77\xab\x85\xa2\xae\x55\x34\xaf\xaf\xf5\xb8\xce\x73\xfb\xb7\x0a\x79\xb0\xe2\xab\x10\x88\x28\x61\x93\x08\x4b\x5f\x91\x48\xec\x42\x35\x64\x22\xda\xad\x2f\x7f\x23\x9d\x2e\x93\xa4\xda\xbc\x99\xf3\xb4\x77\xb7\xaf\xe5\xe4\x28\x5b\xd0\xdd\xdd\x47\x1f\xa9\x7d\xbf\xe3\xe1\xc3\x9a\x8b\x5b\x52\xb4\xf7\x6d\x3b\xc6\x79\x19\x91\xd4\xef\xdf\xd6\x41\x24\xbb\x4d\x6a\x20\x6a\x06\x34\x30\xd3\xeb\xc9\x9a\x17\xb1\x32\x1a\xbd\x41\x94\x38\x9f\xd3\x23\x3f\x99\x40\xcd\x66\xbf\x63\xee\xb5\x16\x4d\xc9\x39\x4e\x85\x49\x8b\x79\xa4\xae\x72\x97\x6b\xd9\xbf\xb0\x63\xb6\xb2\xb8\x05\x2c\xb3\xca\x9d\x76\xfd\xf6\xb7\x3a\x44\xfb\x25\xc2\x9c\xd3\x76\x4a\xaf\x70\x9c\x9d\xe3\x3c\xbf\xc8\x49\x59\x62\x30\xf7\x62\xbd\xea\xa0\x0d\xe8\x7d\x6b\xdc\x5d\x80\x96\xbd\xd0\x1f\xf2\x83\x15\x84\x3a\x8a\x92\x94\xa3\xb0\x74\xfd\x0e\xdb\x6f\xed\x5b\x21\xd3\xd5\x4a\x5a\xcd\x29\xad\x6d\x05\xde\x3c\x2e\x04\xfc\x18\x1c\x0e\x41\x15\x1e\xcd\xe9\xaa\x00\xaf\x87\x5c\x9b\x45\xc7\x4b\x39\x01\x66\x77\x0c\x09\xf9\x84\x51\x84\x0a\x92\x4e\x13\x2c\xfd\x70\x01\xe4\xc0\x30\x89\x06\x0a\x66\x6e\x66\x98\x5b\x0e\xd6\xda\xd5\x15\x3a\xed\x9e\x6e\x9d\x75\xcf\xfa\x52\x18\x6c\x70\x03\xc0\xbb\x67\xe2\x9d\x7e\xe9\xae\x0d\x2b\x44\x77\x66\x03\xc5\x50\x01\xb6\x0a\x5b\x01\x7a\x04\xf6\xd8\x9b\xd0\x97\x2d\xdd\x11\x8d\xea\x90\x23\xc8\x0a\x47\x0d\x81\x70\xed\x50\x75\x5a\x10\x0e\x1d\x1e\x0a\x40\xd5\xc0\x70\x88\xa2\x24\x41\xa3\xa8\x20\x63\xe6\xff\x00\x1e\x0b\xec\x6c\x73\x05\x4e\x92\xd1\x93\xb1\xe8\x4d\x80\x76\xb6\x9b\x8c\x4e\xcc\x85\xcd\x39\x9a\x38\x81\x0b\x5d\x24\xc2\x53\x10\x20\x21\x28\xd4\xe9\x59\x07\xed\xff\x00\xeb\x53\xa5\xed\xb2\xc4\x5a\x65\xda\x81\xa8\x6d\x55\x0e\x30\xc3\x95\x3d\xab\x59\xed\x7a\xab\x95\x34\xab\xdc\x7e\x19\x0e\x61\x1c\xa2\xdb\xb3\xb6\x51\xad\xc8\x83\x07\x48\xff\x3e\xd5\x7e\x6b\x2e\xe0\xce\xc4\xae\x2b\x23\x63\x0c\xa7\x37\x9a\x1b\xbe\x7c\xeb\xa6\x46\xcc\x82\x39\x37\x7c\xc2\xcc\xa9\xd1\x3c\xae\xdd\x72\x66\xac\x7e\xd5\x4c\x8c\xd6\xe6\xd7\x9e\x97\xbb\x9c\x18\xd3\xf5\x89\x62\xa4\xda\x4c\xc0\xd9\xa8\x03\xb6\x08\xdb\x0c\xe9\xec\x90\xd4\xe1\xc6\x0a\x5b\x7c\x2a\xb6\x76\x25\xe0\xf6\xd9\xe9\x0e\x07\x15\x69\x0c\x44\x42\x6c\x9d\x59\x09\xea\xdb\xdd\x1d\x00\xab\x37\xd8\x1e\xf4\xb1\xf0\x21\x36\xef\x09\x5a\x63\x77\x34\x91\x64\x82\x7a\x5a\x96\xc6\x21\x6d\x7e\x7c\xc3\x89\x05\x86\xed\x7b\x0d\xb1\x55\x33\xe5\x7c\x93\x10\xa7\x6a\xdf\x3c\xc3\xbc\xf9\xa6\xba\x23\xe3\xef\x39\x13\xce\x3f\x3b\xc6\xbc\x1b\x15\x9d\x9a\x95\xeb\xd3\xad\xbc\xaf\xb5\x9a\x67\x99\xc1\x86\xc2\xf3\x2b\xe7\xd7\xf0\xa2\x58\xb9\xdb\x73\x6f\x45\x49\x54\x94\xe8\xf4\x8c\x0a\x13\xac\xde\x1b\x4d\xfb\xba\x7f\xde\xe5\x1c\x80\x9c\x85\x1c\x1f\x4b\x70\xa0\x51\x2f\xa1\xe0\x53\xd2\x40\x1b\x22\xa9\x31\x8e\xd5\x8e\x30\x92\x03\xdb\x37\x4d\x68\x74\x89\x62\x3c\x89\x96\x09\x28\x42\x8b\x25\x95\x53\xe5\xc6\xdc\xe1\x6e\x6a\x02\x1e\xe6\xd1\x9e\x45\xe3\x18\x75\x03\x06\xac\x76\xc4\x15\x45\xe1\x96\xa7\xb7\x4a\xa3\x7a\xe1\xab\x5d\xe8\x88\xb5\x25\x52\xd8\x6b\x04\x28\x9e\x93\xf2\x69\x87\x52\x7c\x80\x3a\x74\x11\xd0\xff\xce\x3a\x67\x8a\xda\x39\x84\x96\x06\x85\xd2\x65\x62\x3f\x7b\xd0\x66\xb3\x15\xda\x6c\x07\x73\x56\x7f\x1b\x16\x82\xeb\xa4\xca\x59\x09\x6c\x6f\xe0\xce\xf2\xd8\xac\x17\x70\xc3\x4b\x87\x63\x8c\x97\xfe\x0b\xab\xde\x22\x62\xce\xad\x7a\xff\x3e\x65\xa7\xf1\x7f\x9f\xf5\x9b\x45\x04\xae\xbc\x95\xde\x1e\xaa\xef\x1d\xac\x30\x16\x02\xba\x3d\xeb\x10\x6f\x4f\xdd\xbb\x2c\x0b\x67\x9e\x4b\x0b\x7e\x8f\x6e\x6f\x0c\x5e\x7f\xd4\xe6\xad\x0c\x77\x85\x2a\x9c\xa0\xda\x6c\xa1\xc1\x1b\xac\xb4\xff\xd6\x8d\x89\xf7\x50\xe5\x9f\xdf\x31\xaa\xeb\x57\x16\x27\x13\xdd\x9f\x2c\x67\x65\x4e\x21\xf9\x32\xf9\xf4\xcc\xe7\x44\x7c\xb0\x58\x16\xb3\x9e\xe3\x99\x54\xbc\xd4\x16\x6e\x46\xdd\x9a\xe9\x58\x5c\x9f\xeb\xe7\x3e\x07\xa0\x7a\x4b\x9a\x1f\xcf\xde\x79\x80\x74\xff\xb2\x96\x7b\xd2\x5b\x39\xf5\xe5\x13\xa8\x3b\xf3\xbd\xf5\xfc\x41\xd7\x1d\xa9\x83\x23\xfe\xb7\x9f\x3f\x9f\x47\xd6\x06\x4f\xac\x95\x13\x41\x67\x13\x5c\xa5\xd6\xcc\xc7\xca\xb3\xb1\xe6\xdc\x11\x5a\xba\x23\x63\x49\x6a\x1e\x6d\xdb\xf8\x04\x65\xf7\xa3\x93\x3c\x9b\x7b\xcd\x0d\x18\x94\x8f\xb7\x8c\xec\x07\x3b\x96\x81\x90\x61\x19\xb4\xc2\x83\x29\xc1\xd4\x58\xcb\x2d\x58\x14\x1f\x88\xce\xa2\x0c\x7f\x9a\x0d\xac\xea\xab\xf0\x2a\xd8\x9b\xf4\x1b\x4b\x26\xe8\xf2\x27\x3e\xd0\x3d\x21\xe8\x70\x74\x3d\x44\xdb\x60\xfc\xd0\x17\x1e\x9d\x39\xf2\xaa\x16\x51\x6d\x9d\x7a\xf3\x4e\xc5\xbe\x15\x05\x05\xde\x97\xec\x8e\x5d\x2f\xbd\x81\x76\x98\xd3\x7b\xb6\xdb\x16\x14\xa4\x40\xd1\xa4\xc4\xb9\x5c\x24\x7a\x7f\x6f\xb4\x56\xfd\x65\x7c\xbe\xbb\x15\xe7\xa8\xf0\xd9\x8d\x6a\xb1\xc7\x43\xc7\xbc\xa9\xaa\x5f\xf7\xeb\x51\xe9\x46\xda\x8e\x79\x53\xcb\x68\x5a\x72\x1a\xf4\xb0\xbe\x6f\x14\x76\x63\xbf\x1e\xa6\x15\xa3\x32\x1d\xce\x6a\xd3\xbe\x81\xc8\xdd\x72\xad\x3f\xc4\x1e\xa2\xff\xb5\xa4\x7e\x61\x90\xda\xf2\xef\x0f\x45\xfc\xf7\xb4\xaf\xfd\xfd\x2e\xb4\x8f\xbc\xa4\xaf\x07\x68\xbc\x29\xe9\xdb\x61\xc4\x56\xdc\x54\x1c\x62\xb5\xeb\x6f\xb7\xb3\x98\xbd\x58\xa5\x7e\x3e\x7f\x5e\x7a\x4b\x1c\xfa\xf2\xaf\xbf\xea\x25\xbc\xe0\xb7\x7e\xae\x91\x6a\x53\xf7\x7b\x68\x0b\x6d\x98\xbd\xeb\x33\x9f\x4c\x2c\x92\x98\x67\xea\x99\x07\x62\xeb\xd2\xcd\x78\xb0\x5d\xe3\xcf\xde\xc0\xb5\x65\xf1\x65\x70\xb1\xb5\x15\xc7\xa6\xcf\xb9\x5c\x59\xdb\x7d\x53\xad\xea\xbd\x48\xb4\xba\xde\x78\xc1\x5b\x7d\xb5\x2b\xdf\xc4\x5d\x9f\x05\x5b\xbf\x77\xe8\xfd\x93\xe6\x67\x6f\xcb\x9a\x77\x6f\xdc\x13\x09\xfc\xcf\x6c\x5d\x96\xea\xe9\xdb\x52\x7b\xfb\xb6\xd4\x1f\xac\x2d\x3d\xaf\xdf\x96\xf2\xf9\xdb\x52\x7b\xff\xb6\xd4\x1e\xc0\x2d\xcd\x17\x70\x4e\x8d\x2d\x2c\x6c\x1c\xff\x28\x5f\xf1\x11\xdc\x89\xf7\x15\xdc\xc9\xea\xcf\xe0\x4e\xda\xbe\x83\x3b\x71\x1f\xc2\x9d\xdc\xc1\x4b\xb8\xe5\xad\x9f\xc2\x9d\xb4\x7e\x0b\xf7\x7b\xc7\xf5\x3f\x69\x61\x71\xb6\xac\x33\x39\x13\xae\x55\xd8\x0f\x4e\x9c\x9a\xd5\xd9\x52\x37\x3b\x5b\x1a\x56\x62\x4b\x9f\xe1\xd9\x52\x59\x9e\x2d\x75\xd3\xb3\xa5\x6e\x7b\xb6\xb4\x8c\xcf\x3c\xf5\xb6\x59\x1c\xbf\xa9\xfd\xd9\x89\xdf\x00\xed\xe4\x06\x16\x68\x27\xad\x4d\xd0\x4e\x3c\x36\x68\x76\xe9\x9b\xad\x91\x1a\x33\xb4\xb6\x8b\xa4\xbd\x21\xda\xb7\x6d\x56\x49\x77\x59\x60\x50\xcc\x8e\xcb\x2e\x0b\xc8\x37\xcd\x10\x4e\xcf\x51\x9c\x61\xb0\x56\x80\xd7\x81\x51\x1a\x83\x0f\x5b\xf4\xcf\xd7\xaf\x5e\x96\xe5\xe2\x1d\xfe\x7f\x4b\x5c\x94\x6b\x20\x98\x5d\x2e\x70\x36\xb1\x72\x98\x1f\x1b\xf9\x7e\xa3\x2b\xf0\xc2\x1b\x1e\xd8\xd0\xe8\xcb\xf5\xde\x9a\x11\x2c\xb2\x12\xd2\x4c\x00\x49\xfd\x97\x62\x46\x77\x1f\x32\x4d\xb3\x1c\x87\x09\x49\xf1\xda\x35\xb3\x58\xa5\x78\x68\xe5\xed\xfe\xfe\xe5\xec\xfd\xcb\xd9\x3f\xf1\xcb\x59\xf6\x6a\x96\xdb\xb0\x19\xcf\x66\xd9\x86\x83\x6e\xf6\x7a\x96\xef\x7d\x27\x25\x49\xa0\x4e\xa6\xcf\x84\xb5\xc3\x9e\x27\x39\x60\xa4\xbc\x94\x2c\x51\x15\x19\x27\x51\x51\xa0\x53\x28\x72\xc6\xbb\xc9\x32\x14\x13\x66\x55\xad\x0d\xe1\xde\x08\x56\x29\x57\xae\x52\x0e\x82\x6a\x9c\x59\xb7\xf7\x73\x0e\x90\xb4\xa6\x93\x37\x47\x1f\xde\xd3\xb3\x35\x4c\x42\xf7\x02\x93\x2e\x23\xcd\xee\x27\xed\xf7\x6b\xed\xf7\x4f\xda\xef\xe2\xd7\x68\x94\x89\x8f\x09\x49\x53\x7c\x29\xbf\xf0\xbc\xcc\xe0\x29\xa3\x48\x59\x90\xb1\x99\x90\x46\xa9\x99\x30\x27\xe3\xdc\x4e\x49\x12\xe2\x14\x32\xe0\x0d\x50\xf1\x61\x14\x99\xe6\x51\x1a\xcb\xa1\x18\x59\x3f\x19\x5f\x1f\x8c\xaf\xb7\xc6\xd7\x0b\xe3\xeb\xff\x8c\xaf\x7f\x19\x5f\x6f\x8c\xaf\xe7\xc6\xd7\x3f\x8c\xaf\x13\xf6\xb5\x76\x56\xed\xba\x86\xce\xd1\xdb\x83\xe7\x74\x8a\x43\xb4\xb3\x1d\xc8\xc4\xf7\x47\x3f\xbd\x39\xf8\x70\xf2\xee\xc5\xc7\x57\x2f\xde\xfc\xf4\xe1\x65\x88\x76\x55\x26\xcc\x6a\xa8\x7e\xaa\x9c\x0a\xca\x09\xd1\x17\x64\x25\x28\x3f\xea\x90\xf1\xf1\xf9\xf1\xcf\x6f\xd0\xb5\xaa\xe9\xed\xf1\xab\x57\x14\xfa\xc3\xd1\xeb\x17\xc7\x27\x1f\x42\xb4\xb5\xb9\xb9\x39\xe4\x3d\xe4\x37\xde\xcf\x92\x6c\xfc\x29\x44\x5d\xca\x3a\x8b\xb2\x6b\xe4\x1d\x8c\x21\x94\x71\xa8\xde\x36\xb2\x07\x18\x74\x3f\x6f\xf2\x7d\x72\x1f\x0a\xe3\x7e\x23\xfb\xab\x6f\x64\x6b\xd2\x05\x44\x31\x8b\x76\xee\xca\x03\xc4\x61\x7e\xb9\x28\xb3\xbf\xbf\xd7\x37\x87\x31\xa4\x3d\x52\x11\x30\x68\x83\x5e\x80\x21\xcd\xe9\x7a\xa3\x3b\xb9\xee\x1b\x80\xe2\x0a\xfd\x81\x2a\x4f\x42\x0f\x1e\x88\xdc\x81\xf0\x17\xc1\xc4\xe4\x19\xfe\xdc\xb5\x5f\xd1\x19\x9e\xbf\x7e\x40\xdb\xb4\xb4\xed\xfd\x78\x5b\xb8\x8b\x34\x8b\x23\x71\x19\x2e\x2f\xf8\x2d\xff\xec\xc8\x7a\x6d\xc7\x40\x05\x8e\x68\xe7\x06\x2f\xf1\xe7\x01\x68\x2f\xb9\xe7\x5e\x9f\x8d\x11\xc5\x8a\x18\xb6\x6a\x9d\x9d\xe8\x98\xfa\x2d\x44\xdb\xdf\x3c\x66\x25\xb5\xc7\xc9\xe2\xcd\x19\x65\x79\x12\xc7\x9d\xf0\x9b\xef\x82\x8e\x89\xf2\x4e\xf8\x64\xf3\xfa\x2c\xd8\x6e\xe5\xf3\xe9\x9e\xef\xdd\xf3\xbd\x3f\x2f\xdf\x53\x6c\x8f\xbd\xf3\xbf\x03\xbe\x67\xc9\xee\xab\x8b\xee\x1e\xc9\x5d\x14\xf4\x09\xee\x2b\x45\x1b\xb2\x79\xed\x60\xc8\xd9\xbd\x0a\x47\x34\x79\xa2\x03\xd0\x6f\x29\xc2\x2f\x53\x52\xbe\x8e\x16\x52\x5c\xec\x0a\x89\x3a\x64\x3c\xa8\xbb\x29\x64\x4d\x2a\xb5\x87\x8a\x2d\x76\xb7\x0c\x39\x3f\xd4\x32\x36\x37\x65\xa1\xff\xad\xc9\x1b\x45\xa3\x51\x34\xc5\xb2\x25\x3d\x4f\x13\xfe\x43\x3b\x6f\xee\xa9\x53\xcb\x7e\x5d\x9f\x9d\x64\xe7\x38\x89\xc6\xa2\x59\x3b\x5b\x9d\x31\x42\x5f\xf6\xd4\x5f\xb9\x06\xf1\x53\x23\x44\x31\x8b\xd2\x34\x4b\x8d\x71\x9b\x10\xea\x5c\x13\xd6\x40\x34\xb4\x02\x27\xab\xd0\x03\xa1\xa3\x52\x9d\x97\xc2\x7a\xa0\xa6\x9a\xf8\xd9\x2d\xf4\x02\x19\x95\xc9\xf3\x98\x3d\x36\x0f\xa0\x7f\x88\x26\xa0\x41\xae\x1e\x38\x0d\xf4\x93\x09\xeb\x03\xd5\xe7\x1a\x4e\x7d\xb5\x15\xeb\xfd\x6d\x55\xb7\x5e\x7d\xdb\x02\x5a\x99\x72\x85\x32\xb4\x98\xdf\xd8\x4a\x39\x62\x58\x44\x31\x37\x25\x05\x53\xcf\xcf\x0b\x3c\xa6\x9b\x97\x34\xcf\xd7\x8d\xae\xb8\xf7\x14\x9f\xe5\x94\xaa\x62\x84\x29\x5c\xcc\x23\x72\x59\x36\x58\xe3\x59\x94\x47\xe3\x12\xe7\x85\x50\xf1\xc3\xbd\x3c\x2f\xad\xed\x23\xde\x36\xc8\x34\x0d\x34\x5b\x68\xb4\xb9\xe6\x77\xfb\x41\xa6\xb3\x12\x09\x8f\xb4\x96\x77\x5f\x3e\x06\x43\xda\x64\x20\x01\xf4\xae\x08\xa0\x1d\x8f\x8f\x21\x66\x21\x02\x30\x10\x94\x16\x5e\xab\xca\x1b\xe2\xad\xfe\xe0\x97\x8c\xa4\x10\xac\x01\x3d\x85\x3a\x50\x88\x3a\x9b\x9d\x3e\xda\xe0\xc0\x15\x86\x6f\x37\x9e\x0b\x08\xd8\xf3\x67\x9f\x0c\x18\xc4\x8a\xb3\xc1\x7b\xb8\xc1\x3c\x2e\xdf\x74\x5e\xaa\x0c\x11\x4d\x47\x34\xb0\x75\x82\x19\x22\x04\xf3\x70\x7d\x4c\x5b\xf3\xc2\xbc\x35\xd7\xcc\x0a\x49\x69\x25\x7e\x64\xe9\xfe\xa8\x3d\x8e\x92\x68\xe3\xca\xec\x90\x79\x20\x39\x61\x5b\xbb\x14\xe9\x67\x2c\xde\xf3\x70\x88\x7e\x24\x69\x8c\xd8\xe3\x2e\xde\x51\x19\xaf\x99\x4a\x14\x9d\x8e\xba\xc9\x07\xdb\x97\x00\x42\x48\xcd\xf0\x67\x61\xc2\x2c\xcf\x5c\x34\x8d\x9d\x7a\xe8\x89\xa3\xfa\xac\x44\xab\xd9\xd6\xdf\xbd\x80\x71\x0d\xb7\xa9\xd9\x43\x64\x63\x7f\x5b\x07\x17\xb1\x90\x75\xdb\x0e\xd5\x54\x8f\xd0\x76\x78\xe8\x0b\xd9\xc2\x04\xf5\x58\x91\xfd\x7d\xb4\xd9\x37\x4e\x69\xa3\x1c\x47\x9f\x14\x28\x1d\xe5\xc6\x3e\xe2\xaf\xca\xe9\x0c\x1e\xce\xa2\xfc\x30\x8b\x31\xd4\xe0\x3d\x84\xd1\xc9\x16\xe6\x38\x45\x99\xb7\xa3\x10\x36\x69\x2b\x91\xc8\x01\x2d\xf2\xdb\xd1\x08\x34\xf7\xdf\x43\x24\x37\x99\xf9\xa2\xac\x7a\x9d\x6e\x4e\xb6\xc7\xc7\x7c\x6f\x91\xe3\x09\xf9\xcc\x82\x68\x6d\x7e\xee\xd3\x59\x00\xae\xe1\x77\x6f\xcf\xa3\xbd\x55\xcf\xbe\xd7\x76\x19\x8e\xa0\x51\x02\xdc\xbc\x36\x98\x80\x2f\xca\xa7\xe1\x6b\x9f\xbb\x5d\xe7\xdd\xd0\xa9\x82\x52\x3c\xc7\x3c\x9b\x7d\x58\x0e\xdc\x6c\x9b\x2d\x07\x31\x23\xb4\x25\x45\x1d\x93\x2c\xb7\x4d\xe8\x8a\x32\xaf\x8a\x88\xaf\xcd\x28\x85\x1a\xf3\xb9\x39\x28\x7b\xe4\x66\x2b\x1d\xac\x13\x79\x70\x70\xc3\x6b\x9b\x02\xa1\xfd\xdd\xd8\x47\xa9\xd8\x17\xbe\x47\xdb\xe8\x29\x3d\xd9\xa0\x0d\x44\xf7\x83\xd4\x47\x13\xdc\x85\xfc\x0c\x7f\xbe\x4b\xd2\xb0\x62\x0e\xd8\xb4\xd1\xc0\x1a\x7e\x33\xe2\x70\x78\x86\x46\x1d\xbf\x0d\x05\xfc\x6e\xd3\x6a\x79\x2c\x9d\x2c\x93\x44\xa2\x61\x88\xcf\x71\x5a\xb2\x87\x02\xc0\xf2\x7f\x29\xb2\x14\x45\x23\x62\xf3\x78\xe1\x36\xf1\x43\xf6\xe3\x32\x49\xec\x37\x94\xe2\x31\x01\x2d\xfd\x88\x95\x76\x1f\x43\xb1\x86\x9d\x76\x15\x63\x77\xdb\x30\x04\x29\x5a\xb9\xae\x3a\xa5\xdf\x03\x30\xa1\x20\x69\x8c\x3f\x1f\x4f\x7a\xdd\x5e\xb7\x0f\xbe\x21\x1f\x6d\x79\x9e\x43\x4a\x78\xc7\x4e\xb0\xbc\x5c\x60\xde\x1c\x00\x01\x15\x99\xfe\xcc\x7a\xa4\xff\x45\x84\x10\x1e\x50\xf8\x3d\x74\xcd\x45\x31\xd3\xf2\x4f\xb6\x82\x36\x50\xb7\x47\x67\x4e\xd6\xbe\x81\xba\xfd\x6e\xab\xb5\x17\x93\x62\x91\x44\x97\x6c\x5e\xc0\xc7\x68\x5a\x52\xd9\x56\x62\xc3\x7e\xb3\xf6\x19\xb2\x9f\xb3\x62\x75\x2f\x5c\x69\x6d\xe6\xe4\xfb\x97\x97\xd1\x03\xba\xa5\x59\x14\x83\xa7\x03\x11\x6f\xf1\xb2\xc7\xcd\xea\xfa\xe8\xd1\x0f\x32\x51\x4e\xab\xdb\xb7\xda\x87\xcf\xd2\x66\xd3\x99\x59\x03\xcd\x1c\x8c\x4d\x36\x7a\x6a\xbf\x69\xe5\xef\xc1\xe8\x9a\x51\xce\x46\x86\x43\x35\xd0\xec\x1c\xe7\x49\x16\xc5\x38\x96\x8a\x60\xcf\x9a\xd0\x07\xf0\x41\x11\x49\xd5\x9b\xc6\x21\xfa\x70\xfc\xfc\x38\x44\xf3\xe8\x13\xa8\x86\x49\x7a\xbe\x4c\x52\x9c\x47\xa3\x04\xdf\xe5\x00\xd5\x69\xc0\x7e\xbd\xbb\x85\x1e\x21\x2d\xbb\xdf\x1f\xe4\x78\x91\x44\x63\xdc\xeb\xa2\x2e\x38\x75\xa3\xa7\x85\x8e\x19\x24\x32\x4b\xcf\x71\x5e\x16\x2a\xe4\x26\xc8\x7d\x31\x1e\x93\x79\x94\xd8\x4c\x96\xa4\x7e\x66\x5f\x66\xcf\x59\x01\x97\xf2\x6a\xc3\x67\x9a\x6e\x0d\x99\x80\xc7\x6b\x6a\x0c\x00\x59\x66\x6e\x7c\x4c\x19\x7e\xa6\xcd\x18\x1b\x65\x5b\xca\x13\xef\x6a\x5c\x5a\x5d\xf5\xc1\x59\x53\xa1\x25\x75\xc7\xe7\x09\xcd\xcd\xd5\xa7\xe6\x8e\x62\x1c\xf6\x19\x40\x82\x8b\xe2\xc3\x2c\x4a\x7b\x9b\xe0\x44\xf6\x11\xb3\x3a\xe7\xd6\xfb\x9c\xb0\xb6\xfa\x10\xbe\x55\xcb\x31\xb0\x78\xb0\x04\x37\xcd\x1c\x95\x51\x7a\xc9\x1d\xef\x70\x77\xa4\x69\x35\x5a\x07\x1c\xaf\x07\x69\xcc\xd4\xff\x8c\x86\xc8\xe4\xb2\xe0\x8e\xd4\x0b\x34\xc2\x93\x2c\xc7\x03\x87\xae\x5e\xf2\xa3\x43\x3d\xee\xaf\xf8\x1e\xd4\x40\x5a\x2f\x61\x9f\x37\x90\x2f\xd7\xef\x43\x6e\x2a\x36\x8f\x3e\xb3\xb0\x95\x9f\x49\x79\x19\xa2\x27\xa0\xc2\x16\xbb\x0e\x29\xb8\x4b\x63\x28\xda\xb7\x37\x19\x6d\x92\x7b\x1b\x14\x62\xcf\x28\xaa\x4f\x67\x7d\x61\xab\x2c\x37\xa4\x3b\xa7\xb4\x43\x4f\x21\x0c\x69\x5d\x6f\x15\x10\x5f\xe9\xef\xef\x8f\xdf\x0c\x24\x96\x59\x7b\xca\x81\x25\xb8\x8e\x2d\x50\x64\x47\xf3\x0c\xd0\x22\x2a\x0a\xca\xbb\xca\x59\x9e\x2d\xa7\x33\x73\x05\xc8\x81\x70\x5a\x83\x5a\xdd\xcb\x49\xc5\xd5\x1e\xc1\x69\xc9\x23\xf3\x56\x8e\x58\x00\xf0\xb7\x1d\x66\x75\x0d\xb5\x9d\x0b\xfb\x51\xad\x02\xd4\x5b\x27\xc5\x8f\x24\x25\x25\xb6\x90\x6e\x75\x03\x24\x44\xad\x13\xa6\x94\xe5\x76\x54\x5b\x17\xef\xf8\xa6\xc2\xd6\x01\x3d\x2f\xa5\xc0\xfd\xd1\xcf\xd8\x16\xa4\xa6\xb8\x84\x88\xc5\xc7\x93\x93\x94\x78\xb5\x5d\x50\xb6\x9c\x61\xfe\x43\x2e\x38\x54\x66\x81\xd4\x4e\x49\x87\xe8\xde\xa8\x8d\xb2\x1f\xb2\x9a\x1e\xeb\x4c\x1f\x8a\x80\xdb\xae\x02\xe1\x3c\xcf\x72\xe1\x92\x86\xf5\xb8\x40\x69\x56\xa2\x71\x96\xe7\x78\x5c\x86\x17\x72\xdd\x98\xbd\x36\x16\x10\x2d\x28\x48\x60\xc9\x32\xe1\xbf\xa7\xf0\xdf\xa0\xcc\x5e\x65\x17\x38\x3f\x8c\x0a\xdc\x03\xe6\xc2\xf4\xbd\x8a\x8f\x51\xa8\x7f\xf0\x5b\x66\x7e\x75\x73\x4a\xff\x3f\x53\x47\x71\x0d\x44\xf7\xfb\xad\x13\x1e\xf3\x44\x96\xe2\x0b\xf4\x82\x8e\xaa\xd7\x85\xab\x5e\xe8\x08\xd8\xaa\xfe\xbb\x5b\x22\xfc\x99\x14\x65\x11\xa0\x45\x82\xa3\x02\xc4\x62\x18\x79\x96\x4a\x54\x4d\xb2\x24\xc9\x2e\x48\x3a\x85\x92\x05\xe5\x82\xd6\x32\xe2\x3d\x0c\xc0\xbf\x42\xa0\x9e\x7d\xd4\x44\x89\x95\xbd\x07\xef\x57\xa6\x57\xe1\xe8\x13\x86\x45\xc8\x18\x3e\x5c\x46\x13\xb0\xa7\x95\x4c\x96\x91\x00\x65\xb5\xe0\xab\x82\x4d\x3c\x43\x2d\xa7\xac\xb7\x59\x51\x90\x51\xc2\xa6\x10\x5c\x68\x70\xa3\xbe\xf7\x47\x54\xbe\xcc\x4b\xf6\x93\x8a\xd4\x02\x5b\x2f\x26\x13\x32\xbd\xe4\x1f\xc7\x82\x94\x1e\xa1\x4f\xb4\x79\xf6\xa7\xae\xab\xe0\x93\xdf\x6c\x31\xb0\xb9\x02\x93\x97\x4b\xec\x53\x5c\x45\x31\xb8\xa9\x82\x93\xf7\x3f\xec\x93\x5f\x18\xa9\x3c\x56\xe0\xd1\x23\xb9\x30\xd5\x3d\x0e\x2b\xf0\x6b\x34\xca\x8c\x3c\x4f\x09\x71\x0f\xc3\x06\x00\xd7\x37\x7a\x1e\x2b\xa1\xf5\x42\x2b\xcc\x3e\x39\x16\x34\x10\x64\x41\x68\x1f\x70\x99\xc2\x11\x82\x15\x0e\xa7\xda\xef\x52\xfc\xb6\x45\x0a\xc6\x17\xac\x93\xef\x95\x94\xd3\x19\x39\x8c\xa3\x94\x9e\x0c\x22\xc9\x9a\x79\x3a\xd7\x95\x65\x39\x8a\xd0\xcb\x17\xff\x84\x43\xb8\x90\xd6\xee\x8c\xa1\xc8\x7d\x56\x1c\xed\x7e\x9e\x61\xe1\x67\x2f\xd2\xae\x72\x79\x14\x14\x2d\x58\x00\x5d\x4f\x51\x81\x2e\x30\x5d\x20\xca\xc1\x8a\x18\xc6\x9a\x26\x0d\xfd\x8c\x8d\x23\xb9\x18\xa7\xce\x52\x98\xa8\x43\x6b\x16\x4c\x42\x17\x8a\x58\x09\x3d\x6a\xac\xc9\xa9\x18\x77\xb2\xe4\x21\x7d\x1b\xe6\x15\xa0\xa7\x46\x23\xa1\xfe\xa5\x49\x56\x8d\xcb\x37\x62\x38\xf6\xac\xe0\x0b\x4c\xee\x17\xec\x7f\xcb\x12\x2f\xb3\xba\x05\xae\x9d\x17\x7e\xb3\xa5\x4e\x57\xdb\xef\xb8\xd8\x01\x21\x77\xb3\xd4\x4b\x32\xc7\xc5\xef\xb1\xcc\x53\xae\x5c\xa4\x8b\x5b\xaa\xaa\x0a\x76\xcc\x87\x2d\x1a\x49\x5b\x16\x87\x1c\x64\x4f\x5a\x11\x85\x22\x03\x71\x77\x48\xe7\x5e\xd1\x82\x59\x9b\xf4\x72\xa5\x2a\x50\x00\x12\xff\xba\xf1\x8d\x35\x0b\x0d\xe7\x9f\x6f\xa8\x10\x08\xcb\x5e\x94\xe7\x3f\xae\xae\xd0\xe6\x9e\xf7\x70\xc3\xeb\x75\x0e\x27\x2c\xdd\x38\x11\x71\x9c\x8b\x9e\x3c\x78\x80\xf8\x6f\x9f\xd0\x4f\x9b\xb4\x73\xf5\x13\x86\xcf\x07\x9a\x21\x8b\xf1\xc2\x52\x27\xb2\xf9\xb9\x1b\x74\xbb\xfa\x85\x8b\xe5\x29\xcd\x57\x5a\x27\x94\x4a\x99\x2e\x15\xb1\x63\x3d\xa4\x22\xe9\x84\x81\x89\x28\x1e\xf2\x28\xc6\xcd\x26\x01\xb6\xbc\xc8\xba\x05\x1a\xcb\x98\x2e\x0e\x69\x99\x21\x5f\xda\xd0\x57\x05\xd5\x68\x87\x64\xb3\x4e\x53\xe1\x65\x90\x0c\x05\x1f\x69\x94\xe5\x5b\xb0\xf0\xe4\xbb\xa7\x79\xad\x93\x05\x74\x95\x44\xe3\xd4\x75\x26\xb7\xfc\xeb\xc0\x2c\x0f\x16\xc9\xb2\x50\x5d\xe0\xdf\x5e\xf7\x86\x12\xc8\xd4\x24\xcd\xf0\xf8\x53\x21\x8e\x4d\x8c\x47\x8a\x6b\xce\x82\x3f\x96\x4b\x2e\xc1\x8f\xaf\x37\x1a\x31\x23\xf9\xb1\x37\x12\xb1\x19\x53\x58\x6b\x80\xae\xff\x48\xc1\xeb\x8e\xed\x20\xb8\x12\x9f\x39\xab\x6e\x63\xe2\x78\xa5\x96\x06\x6d\xf8\x9f\xcd\xcf\xa7\x9b\x8f\xbe\x8b\x1e\x4d\xce\xbe\xec\x6e\x5e\xff\xcf\x90\x0c\x4a\x5c\x94\x12\x7c\x85\xb1\xd7\x0c\xf9\xeb\x0c\xb6\xc5\x30\xe1\xfc\x3f\xfc\x4f\x6f\xf3\x73\xff\x69\xed\x38\x75\xfa\x1b\x0e\x55\xac\x2c\x16\x0d\x0b\x7a\xc7\x3c\x08\x73\xa3\xc3\x39\xbc\xe3\xa5\xfb\xb1\x36\x6a\x93\x7e\xb9\x23\x40\x64\xba\xaa\xf0\x76\xc6\xec\x0b\x65\x73\x1a\xd8\xc1\xa3\x1f\xbd\x60\x56\x97\x21\x74\x57\xb7\x00\x67\xc7\xc5\x9c\xfe\x3b\x8e\x16\x05\xc8\x0e\x49\x82\xc4\x77\xa0\x7b\x68\xb4\x7b\xcc\x1c\xcf\x6b\x1d\x36\x1a\x38\x96\xdb\x3b\xc3\x0e\x8e\xc6\x33\x34\x8e\x0a\xa7\x1a\x52\x30\x42\x59\xce\xf9\x0c\x69\xd4\xc4\x56\x59\x7b\x9a\x62\x6d\x15\xcb\xf9\x1c\xc7\x95\xe4\x65\x35\x77\xc7\x64\x66\xd5\x5e\x47\x6e\xc3\x21\x1b\x8f\x85\x9b\x48\x96\xe4\xbf\x9c\x1d\x48\xe9\x43\x38\xc4\xcb\xa8\x00\x67\x34\xb3\x68\x47\x34\x62\xea\x52\x84\xb4\xe3\x73\xf8\xb2\xbb\x09\x77\x94\xc8\xa2\x10\x70\xde\x5d\xce\x50\x82\xe1\x39\xb5\x16\x81\x6f\xb1\xc0\x39\xed\xad\x98\x86\x14\xa2\x17\x4e\x09\x0b\x70\x17\x15\x78\x1e\x2d\xe8\x74\x6c\x19\x9a\xbe\x9e\xb4\x60\xd0\x3a\x0d\x6e\xd9\xb6\x1e\xf7\xd1\x0f\xe8\x5b\xba\x9d\xf3\xac\x53\x72\x36\x28\xb3\x13\xda\x10\xd7\x05\xad\xef\xef\x6b\x99\x40\xf4\xf5\x15\x7e\xbf\xef\xa9\x51\xd7\x2e\x59\x35\x56\xf8\x0a\xd7\x96\xa5\x62\xf9\x06\xe3\x57\xf1\x17\x24\x95\xbe\xe6\x47\x3d\x41\x8d\x15\xa4\x58\x66\x77\x49\x8a\x42\x7b\x2d\xf7\xe5\x15\x28\x51\xd3\x19\x4b\xea\xb3\x5f\x5d\xf3\x76\xba\x5d\x4e\x4a\x2e\x99\x1a\xf8\xbd\x11\xd1\x6a\x40\x63\xa7\xf7\xb4\xa2\x1a\x32\x16\xbd\xd0\xae\xdd\x6d\x92\x06\xa6\x37\x53\xa6\x7f\x94\x48\xbf\xa3\x07\x9f\x09\x73\xa0\x2f\x6e\xe2\x24\x85\x1b\x04\xdc\x44\xbf\x26\x05\xd9\xfd\xdf\xd8\xaf\x24\x6e\x8d\xbc\x6c\x46\xda\x58\x53\x2d\x69\x5a\x25\x4d\xc9\x53\x49\x9a\x06\x1b\x2d\x33\x2a\x51\x92\x18\x6d\x6f\x32\x9f\x41\x8f\xf8\x05\x21\x6b\x93\xbd\x4f\xd8\xfc\x8c\x98\x71\x87\x6b\xdc\xd5\x48\xc9\xfe\xdb\x7e\xee\x7d\x40\xe7\xda\xd2\x80\xab\x1d\xfd\x5a\xe2\x8c\x77\xe3\x13\x4e\x75\x05\x3e\x34\x19\x9e\xed\xb6\x75\x1b\xad\xa7\x22\x7e\xf9\xe5\xab\xcf\x84\x10\xa1\x17\xe1\x4a\x49\xd6\xa8\x5e\x53\x05\x68\x77\xd3\x7f\x4b\x20\x1c\x11\x8b\xd3\x74\xa1\xa4\xdc\xe6\x20\x9b\xde\x93\xa4\xef\xea\xcb\x08\xbc\xc9\x36\x32\xdf\x19\x10\xf5\x58\x37\x2c\xb9\x50\xf4\x2d\x2d\xca\x28\x1d\x53\x2e\xa2\x0a\x5f\x5d\x49\xa4\xf1\xc2\xf0\x7a\x0d\x7e\x19\x8e\x33\xbc\xa9\xcc\x36\x02\x78\x91\xac\xb2\xdb\x16\x51\xe2\x3c\xdc\x84\xa5\xf7\x8e\x71\x51\x4b\x14\x79\x42\x24\x79\xf1\xc3\x59\x2b\xef\x19\x8c\x86\xf5\xad\x7b\x77\xe8\x61\x7d\x69\x8d\x1b\xd1\xe3\x66\xec\xfc\xa8\x8c\x48\x56\xc5\x8f\x28\x7a\x23\x0c\x89\x12\xdd\x96\x23\xa2\x7d\x2a\x9b\x87\xc3\xba\x7e\x83\xc1\x1c\xf3\xbe\xb5\x5c\x0c\x54\xbc\x48\x97\x49\x02\x51\x12\x7a\xee\x0a\x01\xc3\x6d\x50\x61\x78\xc6\xce\xef\x6b\x5b\x8e\x7c\xc4\x3a\xdb\x82\x1d\x30\xc0\x9b\x30\x03\x96\x74\xa3\x89\xe4\xdd\x6b\x3b\x1a\x70\x01\xd8\x3c\x16\x27\xa2\x46\xcb\x91\xb8\x51\x31\x5a\xb2\x34\x28\x58\x3b\x06\xfb\x38\xc2\xf6\x51\xb0\x91\xcb\x04\xd5\x99\x83\xf8\x7b\x61\xae\x2b\x65\x81\x50\x3b\x06\x5a\xcc\x7e\x35\x20\x5d\x27\xe5\x97\xee\x3e\xb5\xbe\x0e\x37\x93\xec\x19\xae\x32\x66\xbd\x46\x63\x08\xfb\xd4\xc3\x9e\xbd\x4d\x3f\x90\xae\x32\xea\x88\x8f\xfb\x05\x9d\x40\xbc\x9c\xa3\x51\x92\x8d\x3f\xa1\x19\x8e\x62\x9c\xd3\x8f\x6c\x6e\x5b\x6d\x90\xe2\x19\x4d\xf6\x09\x0d\x33\xfc\x59\xfa\x45\x87\xb2\x68\x42\x92\xd2\x56\x66\x7a\x08\x16\x60\x0d\xf7\xc3\x34\xa5\xf6\xa4\xff\xcd\xd6\xb6\x3a\xea\x33\xf0\x06\xbc\x54\x1f\xd4\x59\x5d\x7a\x55\xbe\x73\xba\x0b\xe5\x8b\x38\xac\xce\xd9\x6b\x6e\x3f\x6e\x30\x33\x49\x46\xc5\xbc\x05\x19\xbb\xf3\xf0\x81\x26\x37\xcd\x43\x29\x81\x6a\x26\x00\x6a\x32\x26\x00\x8a\xd5\x4e\xc0\xe3\x5d\x85\x7f\x06\x7d\x63\xfc\x43\x55\x7a\x4d\x3e\xf4\x3b\x40\x37\xc2\x7e\x85\xe3\x11\x2e\xf2\x85\xe2\x47\x20\x52\xe1\xd1\x4f\x28\x7f\xb1\x74\x10\x0c\x43\xf6\x9f\x48\xe1\x16\x24\xa1\xfa\xc9\x72\x34\xeb\x92\x50\xff\x10\xe5\x4e\xca\xc9\x93\x90\xff\x2f\xd2\xc0\x5e\x25\x14\x3f\x54\x3d\x0c\x56\xfc\x52\xe9\x1c\x5e\xfe\xe4\xf5\xb8\x46\xb7\xa1\x2f\x91\x41\xbb\xb6\x9c\xa1\x27\xcd\x80\x15\x66\x93\xa1\x9d\x20\xc6\xf1\x33\x86\x51\xfc\x8c\xb5\x31\x40\x1a\xff\x21\xe0\xa4\xb4\x18\xea\x1f\x22\xd7\x54\x59\x87\x4e\x8a\xc4\x1a\x13\xd4\x43\xf5\x93\xe5\x68\xd2\x71\xa8\x7f\x88\x5c\xe3\x24\x12\xda\x09\x02\x4a\xcb\xb7\x72\xac\xa3\x7b\xe8\x26\x89\x1e\x3a\x90\x4e\x92\xa8\x53\x08\x63\xa1\xf6\x5b\xef\x6f\x3a\x0d\xe5\x2f\x91\xce\xf6\xd4\x50\xfe\x92\xa3\x67\xeb\x3d\x54\x3f\xe5\x98\xe8\x2e\x19\x8a\x1f\x22\x95\x6e\x58\x21\xff\x5f\xd6\x41\xf9\x5d\x28\x7e\x88\x54\x60\x1b\xa1\xf8\x11\xc0\x02\x63\x0e\xea\xf8\xab\xee\x4e\xb8\xf5\x5d\x50\xeb\xdf\x26\xe8\x2c\xcb\xc9\x93\x4e\xf8\xe4\x9b\xeb\xb3\x60\x7b\xab\x8d\xc7\x07\x73\x09\xef\xb3\x05\xdc\xe1\x8e\x0e\x3a\x21\xea\x6c\x0e\xb6\x37\x07\x5b\x9d\xb5\x6b\xe1\x0a\x6e\xbb\x55\xa4\xe2\x7b\x4f\x12\xf7\x9e\x24\xfe\x0a\x9e\x24\x78\x2d\x6b\xae\x2f\xb8\xbf\xe3\xc9\x24\xc7\x97\xe8\x67\x92\x8c\x3f\x61\xf4\xfd\x2f\x78\x32\xb1\xdd\x49\xb4\xf4\x18\x07\x60\x24\x4a\xd1\x31\x95\xb8\x23\x80\x22\x51\xea\x82\xfd\x18\x8d\x28\xd8\x3f\xb2\x29\x4e\x8a\x12\x27\x09\xce\xd1\xf7\x13\x48\x74\x81\x7f\x8a\xce\xd1\xcf\x59\x16\xa3\xef\xa7\x95\x6e\x2e\x76\x95\x7b\x1f\xee\x0b\xf2\x75\x94\x46\x53\xd3\xf7\xc4\x60\x48\xb1\x30\xcc\x19\xc0\x9c\x01\x08\x1f\x13\x47\x23\x38\x1c\xd9\xc0\x64\x14\xa5\x02\xe4\x05\x98\xf1\xdb\x10\x4c\xf2\x2a\x86\xb8\x9c\x09\xc0\xe7\xcf\x6a\xe0\xe2\x91\xf4\x37\x3b\xab\xab\xaf\x98\xc9\xfa\xde\x80\x67\xf2\x2a\xc0\x14\x97\x02\xf0\x2d\xce\x0b\x78\x4a\x55\x0d\xbd\xe0\x20\xb2\x13\x17\x51\x3e\xaf\xeb\x06\xcd\x97\xc0\xb8\x2c\x21\x6a\x93\x0b\x5f\xf0\x2c\x01\x2a\xb8\x8a\x01\x29\xd8\x05\x3d\x51\x29\xe7\x1e\x24\xb1\x2a\xd4\xc2\xca\x57\xfb\x08\x61\x40\xc2\x1b\x13\x7f\xb8\x81\xd3\xd8\xd3\x37\x96\x21\xc0\x9e\xc1\x89\xc9\x85\x1a\xd1\x74\x89\xc9\x3c\x5b\xe0\xbc\xbc\xf4\xc0\x2d\x78\x96\x00\x7d\x59\x96\x8b\xb7\x79\x76\x4e\x62\x2f\xb9\xd1\x85\xba\xe0\xd9\x92\xd8\x16\xe3\x9a\x12\x64\x31\xb6\x0b\xb4\xf3\x68\xb8\xb6\x26\x65\xf5\x9f\xf1\x68\x07\xf5\x44\x35\xa6\x57\xde\xdc\x5e\x21\x29\xbe\xb0\x96\x8d\x2a\xa9\x39\xe8\xe5\xa1\x56\xb5\x9e\x0b\x28\x0d\x08\xb3\xb7\x2e\xf8\x82\x2e\x17\x70\xd4\xaf\x57\x11\x8f\x78\xe6\xf3\x67\x4e\x5e\x31\x13\x25\xdf\xcf\xdc\x92\x29\xac\x01\x9a\xfb\x06\x97\x4e\xee\x42\x11\x3e\x05\x11\xeb\xc0\x81\x1b\xfd\xfa\xab\x68\x83\xd2\xb5\xdb\x07\x45\xe0\x00\xc4\x3f\x7b\x3a\x8c\xa2\x6c\x75\xd4\x88\x16\x24\x94\x9b\x21\xff\x9f\x1d\x39\xf4\x4e\x72\x6c\x15\x46\x51\x9d\x7c\x42\xe3\x2b\x90\x30\x1a\xbd\x84\xfa\x87\xd3\xc4\x47\xb9\x06\xd8\x0f\x67\x80\x1c\xa0\xa7\xda\xe7\xe4\x4c\x70\x11\x6a\xbf\x7b\xcc\x98\xe7\xba\xbf\x47\x25\xa6\xe1\x10\x5c\xf0\x16\x18\xa9\x31\x64\x6c\x27\x06\x9f\x40\x6b\x94\xdc\x3c\xe3\x6b\x1a\x5b\xe5\xb8\xa8\xd0\x28\xea\x14\xf1\x34\xb1\x4e\x79\x7a\xcc\xe0\x66\x1a\xd7\x0b\xaf\x4c\xda\x9e\xbe\xe4\x98\x05\x8b\x50\xbd\xf8\x84\xf1\xe2\xa8\x78\x7f\x99\x8e\x49\x3a\xad\xed\x0a\x94\xb5\xe0\xdb\x51\xa0\xa7\x23\x3a\x5f\x78\xa6\xec\x57\x2c\x28\xf1\x0c\x86\xb9\x93\x82\x2f\x0f\x8c\x78\x32\x2b\xa0\xe0\xdb\x03\xc7\xdf\x5d\x0b\x30\xfa\xe9\x40\xe9\x4f\x70\x19\xa0\x4c\xf1\xc2\x1a\x75\x8a\x04\x4f\xdb\xea\x3d\x95\x68\x9e\xa7\x78\x6b\xb5\xa1\xb5\x34\x4f\xdd\x3a\x2e\x45\xed\x75\x38\x65\x26\x8e\x02\xf2\x67\xec\x1f\x99\x0e\xc5\xbf\x1d\x38\xdd\xb4\x85\x41\xca\x14\x0f\xac\x7b\x2b\x2c\xca\x1c\xda\xb7\x85\x4e\x9f\xab\xca\x3a\x39\x9e\x76\x8f\x9e\x1d\xbc\xd1\x1a\xa3\x9f\x0e\x94\x72\x4f\xc3\xc0\xf8\xb7\x0f\x4e\x78\x4e\x91\x80\x90\x40\x77\x31\x7b\xe1\xb3\xad\x5f\x7f\xc9\xcd\x2e\x85\x4c\xef\x8a\xe6\x75\x1d\xdc\x49\xdb\x90\x55\xd7\xa7\x31\xc9\x41\x55\x3c\x8e\x16\xf0\xfa\x42\xbb\xc0\xf4\xcc\xe8\xd1\xe1\xc1\x5b\x63\xed\xd3\x72\xba\x85\x1c\x61\xa2\x24\x5d\xbe\x54\xaa\x64\xf9\xc6\x63\x4f\x0a\x31\xe0\xcd\x88\x95\x0d\x0e\x65\x24\xff\xad\x8b\x38\x7a\x2a\x79\x37\xec\x75\x5c\x1c\xe9\x99\x77\xce\x29\xe8\x60\xba\x62\x4f\x4a\xb3\x18\x77\x03\x03\x62\x0a\x66\x21\x21\xea\x52\xa1\xe3\xe3\x38\x21\x38\x2d\xff\xc1\xc0\xbb\xea\x4e\xba\x1f\xdc\xa4\x35\x5c\x5e\x64\xf9\xa7\xaa\x06\x53\x5c\x7e\xe4\xa0\x16\x88\x19\x30\x20\xb4\x57\xf9\x2d\xbb\x85\xb9\x42\xbb\xaa\x5f\xb8\x9c\x7d\x84\xb9\x1e\x67\xc9\x3f\x7e\x87\xfe\x5d\xcc\x48\xb1\x90\xbe\x91\x9d\xee\x15\xb3\xd9\xad\xd1\x06\x3f\xcf\xbc\x7b\x09\x29\x0e\xb3\x34\x65\x3e\x9b\xb4\xe5\xd6\x37\x68\xaf\xe7\xdd\x2e\x1f\x3c\xf0\x6e\xa3\x7a\x95\xbd\xbe\x7f\x07\x63\x5e\x0a\x84\x4c\x5e\x49\xf3\x60\x1c\x0a\x91\x13\xb8\x44\xe3\xd5\xdb\xd2\xba\x85\x37\x51\xfd\x84\xc0\x54\x4e\xc6\xc1\xa2\x13\x6e\x6f\xd2\x24\xfd\x48\xd2\x09\xb7\xb7\x68\x9a\x3a\x0e\x74\xc2\xed\x5d\x99\xc2\x44\xa7\x4e\xb8\xfd\x44\x26\xe9\xc2\x7d\x27\xdc\xd9\x96\x19\x74\x85\x77\xc2\x9d\x1d\x95\xa0\x84\xfa\x4e\xb8\xa3\x2a\x55\xc7\xc2\x4e\xb8\xf3\xad\x93\x8c\xcb\x59\x27\xdc\x79\xe2\xa4\xa7\xb8\xec\x84\x3b\xdf\x39\xe9\x42\x10\xee\x84\xbb\x9b\x4e\x66\x31\x9b\x75\xc2\xdd\x2d\x37\x9d\xca\xc2\x9d\x70\x57\x75\x5f\x9c\x71\x3a\xe1\xee\x37\x32\xd1\x3c\x38\x77\xc2\xdd\xc7\x32\x4b\x48\x2d\x9d\x70\xf7\xdb\x7a\xdd\xde\xf5\x59\xb0\xbd\x73\xaf\x79\xbb\xd7\xbc\xfd\xb7\x68\xde\xa2\x24\x01\x07\x13\xb7\xf3\xe3\xaa\x29\xb8\x1c\x55\x88\x4f\x17\x22\xc2\xc4\xbc\x38\x67\x16\xfd\x9a\x8e\x01\x7a\x23\xe0\x54\xd0\x98\xa6\xe8\x48\xae\x9e\xc6\xab\xa8\xf9\x11\x2e\x77\xad\xca\x20\x4d\x40\x5c\xb0\xd8\x47\x26\x88\x60\x45\x3c\x53\x7a\x77\x3d\x48\x12\x63\x28\xa6\x60\x64\x1e\xad\x02\xb8\xa9\x0f\x90\x65\x5a\x56\xa1\xf4\x30\x13\xf4\x23\xf2\x2f\xec\x72\x9e\xfe\xa7\x27\x3b\xe6\x92\x6c\x13\x72\x7a\x58\x1f\xe6\xdb\x92\x5a\x85\x3f\xf0\x7d\xf9\xeb\xea\x0a\xe2\xdf\x20\xdb\xef\x03\x4d\x84\xd4\xd3\x2e\x95\x42\x21\xae\x40\x37\x40\xdd\x32\x63\x3f\xcf\x06\x0c\xcd\x5a\xbc\xc3\x89\xe7\x36\x94\x37\x73\x3a\x39\x03\x03\x17\x69\x1f\xca\x6f\x48\xfb\x9e\xa0\xd9\x56\x35\xb4\x3f\xb4\xf8\xbe\x46\x3c\xcc\x85\x0e\x74\x84\x9d\x97\x54\x10\x3c\xd5\xa0\xb0\x59\x50\x0f\xb7\xc0\x17\x85\xc2\xab\x81\x67\xf3\x75\x97\xee\x9d\xa2\x0e\xe3\x9e\xa8\xc5\x71\x54\x46\x62\x04\xf4\xf7\x80\xfe\x83\xf6\xb5\xdf\x57\x57\x60\x14\x2b\x01\xe0\x2a\xb9\x10\x20\xfc\xeb\xea\x4a\x45\xdf\x04\x6d\x23\x6d\x5a\xdc\x91\x6b\x80\xa7\x9b\x67\x83\x82\x32\x04\xe9\x62\x9d\x42\xcf\xb9\x80\xa3\x28\xcc\x9d\xae\x5f\x3c\xd3\xa5\xb7\xb2\xcf\x4d\x6d\xb9\x74\xe7\x5e\xda\xf6\x7e\x91\xef\xd3\xfb\xa7\x9b\x67\xda\xc3\xab\x75\x68\xbf\x8f\xbe\xc0\x63\x87\x28\x4d\xb3\x12\x4d\x48\x1a\xb3\x7e\x91\x74\xca\x1a\x7a\x2a\x9b\x1f\x67\x69\x91\x25\x78\x70\x11\xe5\x69\xaf\xab\x97\x60\xde\x72\x28\x2b\x4e\xb2\x69\x57\x33\x7d\xe5\x3d\xa6\xa8\x70\x3c\x2e\x61\xce\x86\xf4\xc8\x5c\x30\x77\x3d\xdf\xea\x0c\x58\xb7\x02\x93\x20\xcc\x23\x14\xd4\x28\x9c\x1d\xc2\x14\xb7\x58\x8e\x9f\xf1\x98\x4a\x00\x9e\xf5\x18\x80\x47\xa6\x51\x34\xfe\x24\x63\x88\x82\x2b\x02\x7e\xd8\x15\xd7\xad\xbd\x28\x9f\x2e\xe1\x2d\xc8\xa9\xfc\xa5\x79\xe3\x31\x8d\xd0\x45\x8d\x10\xfb\xb9\xb6\x98\xee\x37\xae\xe7\x40\xd0\x89\xdf\x32\xfd\x58\x28\xb6\x91\x2e\x93\xc4\x41\x77\x26\x28\x8d\x7b\xbf\x53\x07\x60\x01\x31\xd1\xa2\xac\x31\xcd\x2c\x60\x72\x30\x22\xa6\xd2\x50\x13\xbf\x19\x67\xef\x65\x01\x1c\x94\xba\x81\x97\xb1\x06\x82\xbd\xd3\xc3\x56\xaf\x1f\xa8\x86\x34\x0c\x37\xcf\x54\x54\x96\xd1\x78\xf6\x21\x3b\x14\x8e\xb0\xf4\x29\x13\xde\xb1\xf4\x33\xb7\x9a\x5a\x36\x6e\xf6\xe9\x0c\x47\x14\x1d\x44\x49\x22\xf7\x13\x0e\x5c\x71\xa6\x70\xba\x29\x0f\x18\x9e\x13\x86\xf7\x88\x01\xa4\xda\x09\xb7\x41\xba\x67\xab\xbe\x13\x6e\x83\xec\xae\xc7\x6c\xdb\x01\x60\x6b\x23\xec\x84\xbb\x3b\x54\x64\xde\xbd\x17\x99\xef\x45\xe6\xbf\xb6\xc8\xac\x85\x7b\x81\xb3\xf7\x5d\xc5\x7b\xf9\x7b\x91\xa5\xf9\x62\x6c\xca\x9b\xbf\xb0\x44\x79\x75\x98\xe7\x99\x2d\x02\xb3\x34\x29\x89\xba\x2a\x0a\x3a\x58\x43\xc8\x74\x64\x4c\x40\xc7\xc7\x4a\x49\x93\x67\x14\x3c\xb0\x77\x83\xa3\xc0\x28\x8e\x85\x4f\x47\xca\x8e\x79\x61\x70\x93\x0d\x5d\xe3\x09\x96\x45\x60\x14\xc7\x1e\x1b\x5b\xc4\xc7\xcf\x0a\x95\xca\xba\x75\xb8\x06\xe3\xd4\x59\x71\x1c\xfb\x64\x6e\xdf\xc0\x0b\x16\x15\x5c\x40\x34\x8e\x48\x30\xed\xba\xfe\x73\x18\x6f\xd7\x7c\xfb\xb9\xe9\x5d\x40\xe2\xd7\xe8\xa6\x3b\x05\xea\x9e\x28\x8d\x99\x9a\x49\xc0\x06\x5a\xdd\x38\xcf\x03\x2e\x89\x16\xae\x4c\xcc\xc8\x87\xfd\xe2\xc2\xa2\x02\xe0\xf8\xd1\x5d\x4c\x4a\x54\x06\x08\x5e\xb7\x57\xbc\x5f\xe3\x55\x9e\x02\xcc\x99\x7e\x3c\xa8\x14\xd8\x59\x91\x8a\x6a\xa9\x58\x23\xfa\xc3\x2b\x1d\x38\xb2\x8f\x5d\x60\x9d\x2f\xa2\x01\x29\xfe\x11\x25\x24\x7e\x87\x8b\x45\x96\x16\x98\x37\xe5\xbc\xbd\x73\xc6\xe0\x6f\xaf\xc7\xd6\xd8\xe0\x28\x3d\xf7\xd6\xba\xe7\x54\x7a\xed\xf6\xaf\xb2\x72\xe6\xb3\xc9\x19\x2c\xdb\x73\xc1\x37\x84\x2f\x83\x37\x3e\xe0\x7d\x00\xaf\x11\x7a\x82\x13\xc5\x5e\x4d\x85\x3c\xdf\x20\xbf\x28\x01\x94\xa5\xf4\x93\x6c\xf0\x9d\x70\x1b\xf4\x68\x7c\x45\x76\xc2\x1d\xb0\x7a\x6b\x15\xe5\xfb\x7e\xc3\xbf\xdf\xf0\xff\xbc\x1b\xbe\xda\xef\xa5\x58\x7e\x47\x2a\xb2\x96\xba\x2a\x7a\xe2\xc9\x2d\xb0\x82\xcb\xfa\x43\xc8\x5c\x55\x9d\x26\xe0\xb4\x77\x53\xba\x1e\x4c\x3c\x88\xe2\xd0\x07\xda\x21\x44\x03\x93\x1a\x43\x23\xe4\xb8\x6f\xff\x64\xea\x25\xfd\x91\x19\x6c\xf3\xf6\x33\x65\x06\x77\xa8\xc0\xde\x0a\x28\x29\x17\x80\xb1\xef\x35\x12\xbe\x9c\xcd\x54\x6f\x03\xdc\xdb\xaf\xbf\x6a\xf3\xa9\xe7\x88\x04\xbc\x9c\x75\xab\x13\x8d\x88\x47\x0d\xa2\xf9\x7d\x46\x96\xa3\x65\x16\xe0\x7b\x7f\x1f\x75\xb5\x3e\x75\xd1\x83\x07\x86\x23\x67\xed\xdc\xcc\x9a\x35\xbc\xfd\x5f\xf7\xad\x6d\xb8\xae\x41\x8f\x6b\x68\xd4\x83\xc4\x8a\xed\x1a\xf2\x98\xc7\x68\xcf\xce\x60\x55\x44\xc1\x0a\x4f\xd3\x40\x7b\xfc\xf0\xce\x10\xca\x40\x25\x1a\x35\x2d\x8f\xd0\x5e\xb5\x90\x1e\x65\x40\x2f\xee\x2a\x8a\x1d\xad\xbd\x2f\x9b\xa2\x38\x16\x34\x5c\xa8\x63\xb8\x4e\x1b\x22\xed\x5a\xd6\x54\x49\x4f\x8c\x54\xfc\x55\xd6\x9e\xec\xd5\x71\xfd\xe6\x84\xa2\xbd\x42\x5c\x65\xf6\x75\x4d\x95\xd4\xfe\xc8\xfe\x7c\xc4\xe5\x4c\xa8\x9b\x55\x27\x4d\xaf\x17\x8d\xaa\xd4\x89\xa3\xe6\x50\x08\x50\xaa\xd2\x16\xf3\xca\xb8\x45\xab\x49\x65\xfc\xe6\xee\x66\xd4\xae\xaf\x59\x51\x23\x18\xde\x5d\xcc\x2d\xe3\xbd\x96\x5a\x99\x73\x56\xae\x6d\x94\x3c\xd6\x9c\x3c\x57\x6f\xc5\x3a\x56\x39\x9d\x07\x49\x52\x3b\x5d\x00\xc4\x2f\x7a\x56\x26\x30\xa6\x0a\x6d\xe8\xe0\xea\xd4\x66\x3c\x0a\x74\x95\x6a\x55\xd4\x56\x47\x6e\xd2\x51\x0e\xd8\xfe\x89\x49\x9f\xe2\xb2\xe0\xc6\x2b\xc9\x25\x8a\xf1\x22\xc9\x2e\x71\x2c\x4c\x04\xe1\xf9\xe0\x78\x16\x91\xd4\x7e\xae\x06\xb5\xfd\x98\xe5\xa2\x47\x1e\xdf\x03\xe2\xc0\xea\x23\x49\xb1\x2e\xaf\xa5\x6a\x71\xcd\x70\x91\x7b\x22\x2e\x37\xd4\xb3\xb6\x8a\x16\x75\x83\x07\xd1\x92\xa6\xb0\x54\xe4\x0b\x01\x9b\x21\x92\x8c\xa3\xe6\xfd\x11\xa2\x94\xef\x8b\x87\x65\x90\x3f\x1c\xa2\x8b\x88\x30\x75\x39\x88\x5c\x8b\x52\xa9\x60\xc5\x4d\x99\x39\xef\x7c\x29\xc8\x80\xd1\xaa\x63\xb8\x6f\x7a\x5e\x5e\xc7\xf0\x34\xd9\x68\xdf\xde\x95\xa0\xbf\x1b\x1b\x7b\xe6\xb1\x69\x38\x44\x45\x99\x2d\x98\xae\x96\xa4\x53\x14\x4d\x68\x57\xbe\xd9\x64\x73\x55\xa0\x5e\x49\xe6\x38\x5b\x96\x7d\xe7\xe8\xc8\x10\xf0\x03\xfa\x66\xd3\x7b\x58\x64\xbd\x1f\xd0\xda\x7f\xe6\x95\xab\x98\x0a\x7d\xf4\xe5\xda\x73\xa6\xb3\x11\xc8\x1e\xec\x79\xcf\xa1\x72\x46\xbc\xa7\x4d\x75\xf2\x53\x8e\x81\x25\x63\x82\xfb\x92\x88\xad\x8c\x31\x25\x6c\x70\x12\x3c\xa2\x12\xf3\x32\x8d\x6d\x0c\x74\x7d\x87\x4f\x9c\x68\x0e\x45\xf4\x3f\xc7\x1d\xf1\x8d\x5b\xa5\xcb\x4f\xaf\x59\xfa\x13\x71\xb1\x66\x50\xcd\x14\x97\x1f\x54\x53\xef\x18\xa9\x29\x8e\xa2\x75\xe3\x65\x54\xcc\x74\xa2\x0a\x04\x61\xf6\xfd\x47\x78\x32\xe9\x71\x00\x3f\xb5\x79\x0b\x79\x3b\x08\x21\x8c\x78\x5d\x83\xb1\xb9\x00\xcd\x1e\x41\x9c\x23\x7f\x77\xc4\x5f\x95\xf7\xf6\xc7\xd2\x7b\x7b\xd5\x1f\x99\xf4\x4c\x8a\xbb\xba\x42\xeb\xd0\x62\x6d\x31\x24\x59\xb7\x87\x36\xf5\xbf\x9b\x2c\x01\xfd\xaf\xe5\x72\xb0\x87\x94\xc5\x5a\x88\xe8\x9d\xda\x99\x11\x7f\xc3\xa1\xbc\xe7\x4b\xb2\xa9\x46\xb5\x70\xac\x10\x6c\x7c\xbd\xdb\x6f\x68\x1e\x19\xa2\x9a\xe4\xa8\x15\x53\xdd\xa2\xb2\xe1\x10\xb1\xcd\x4a\x88\x0b\x51\x1a\x23\x7e\x33\x82\xa2\x69\x44\x52\xbe\x72\x2e\x30\x8f\xf0\xd7\xf0\xe7\x97\x3d\xed\x0d\xb0\xa1\x06\x5b\xd6\x71\xb6\xff\x86\x21\x8d\x99\x53\x36\x7e\x29\x48\xb7\x04\xba\x3b\x16\x78\x9c\xa5\x31\xa2\x0c\xb7\xb1\x12\x8d\x74\x9b\x89\x15\x19\x1c\x11\x74\x61\x6d\x3b\xec\xf5\x62\x74\xc7\x1d\xd2\x7d\xb7\x6b\xa2\x04\x3f\xd1\x6a\x9c\xb2\x28\xb3\x1c\xc7\xd2\x8f\x3b\x93\x40\x40\xe3\x33\x8d\x0a\x14\xcd\xe9\x86\x34\xf0\xf2\x6b\xfb\xaf\x92\x7f\xdb\x7f\x1e\xf7\xf2\x77\xd1\xc5\xfa\x1e\x5e\x57\xe6\x56\x71\x0c\xb7\x84\x0d\xa9\x69\x27\xdb\x1e\x28\xb4\x2b\x06\x41\xe8\x3f\x46\xf4\x98\x7d\x29\x7d\x69\x58\x52\x9c\x05\xd6\x70\x68\xb0\x2b\xd5\x0f\x0c\x70\xaa\x8a\x46\xc4\xb8\x5c\x60\x2f\x8a\xb0\x38\xbe\x43\x5a\x34\x22\x68\x9f\x42\x0a\x39\xeb\x21\xd3\x84\x36\x8f\x49\x9d\x90\x52\x14\x69\xa2\x29\x2f\x2e\x6a\x11\x63\x4b\xf1\x85\x4c\x12\x63\x4a\x2f\xaf\x75\x62\xb0\x74\x23\x5b\xc2\xa6\x20\x4a\xfa\x2b\x16\xdd\xae\x29\x6a\xcb\xc1\x86\x64\xc1\x7d\x9d\x08\x45\x71\xec\x94\xf6\x49\xca\x1c\x42\x4a\xcb\xea\xf8\x27\x92\x64\x5b\x6a\xe2\xa1\xd0\x50\x4d\x04\x45\xa9\xef\xfa\x05\xd5\x6c\xd1\xdf\x8a\x1a\xe8\x9f\xfc\xc1\xa4\x6b\x79\x8a\xd4\xe9\xaf\x27\xe8\x20\x90\xb3\xaf\x73\xb0\xe1\x90\xc5\x56\x54\x56\x16\x46\xa5\xca\x56\xe2\xcb\xf5\x1e\x05\x16\x58\x5a\x37\xdb\xe6\x88\xd1\x2a\x86\x33\x6e\x0e\x6f\x71\x80\x90\xf5\x47\x09\x09\x19\x63\xb8\x6a\x50\xf6\x1a\x56\xf8\x3f\x9f\xed\x08\xd8\x7f\x54\x5b\x8c\x20\xc7\x6a\xa4\x18\x2c\xb2\x85\xe1\x60\xce\xec\x5e\x12\x15\x25\x87\x74\xaa\xf6\x77\x87\x11\x52\x8f\x16\x04\xe7\x45\xeb\xf2\xc5\x09\x04\xa2\x85\x74\xbb\x4f\x0a\x85\x0d\x5d\xa2\x0d\x71\xe0\x01\x8b\x4a\xf2\x03\xda\xb4\x6b\xe3\x33\x2d\x68\xff\x40\xac\xe5\x66\x2d\x80\xf8\xbb\x95\x4a\x50\x43\x93\xc5\x2c\x85\x3a\x4d\x9a\xda\xe9\xc3\x5a\x37\xbb\x3c\x58\x44\x97\xd1\x28\xc1\xbe\xee\xb9\xc7\x01\x66\x3f\x55\xe0\x34\x56\x11\xa9\xd2\x2c\x7d\xc4\x2b\xd1\xd1\x61\x6f\x13\xd7\x55\x53\x0f\xbe\xfd\x28\x67\xf4\xab\x60\x7b\x62\xa9\x04\x30\x62\xad\x56\x31\x41\x60\xfb\xb6\xb1\xcf\x2a\xda\x33\x27\xb1\xf2\x46\x50\x3f\xd1\x1a\x3a\x00\x21\xf7\x45\x71\x6a\x6b\x09\x62\x8c\x2e\xa2\x42\x0a\x94\x6b\x26\xae\xd8\xd2\x86\xab\x57\xed\x08\xa3\x0c\xb3\xac\xfb\xd7\x59\x54\xcc\x7c\x48\xa7\xbd\xc6\x79\x5e\x75\x13\xa9\x5f\x39\xfa\xee\x15\xeb\x24\x1e\x2a\x8e\xc6\x31\xbb\xf6\xd2\xb8\x2e\xed\x89\xbf\xad\x8a\x63\x17\xda\x87\x32\x15\xc2\x57\xa5\x84\x38\x21\x79\x51\x56\x0b\x88\x2b\xca\x78\x15\x1a\x10\x9f\xda\xc3\x77\xfd\x6a\x7c\x35\x39\xbe\x84\x48\x9b\x6c\xe0\x4d\xf3\x6c\x35\xd6\x16\xe5\x8d\xa8\x5e\x65\xe8\x7e\x9e\x26\x75\xf2\x0c\x88\xeb\xca\x38\x76\xc5\x26\x48\xcf\xb7\xcf\x99\x5d\x29\x24\xf1\x4f\xc3\x00\xed\xc6\x82\x97\xad\x35\x6b\xd2\xce\x7a\x36\x75\x5e\xd3\xb5\x29\x03\x4d\x64\xfd\xc3\xb5\xe1\xd0\xda\x81\x8d\x0b\x1c\xe5\xf1\x58\x53\x5f\x5a\x95\xf7\xd8\xbe\x3c\x1c\x1a\xae\x74\x2b\xe3\x4e\x8f\xc7\xe0\x15\x37\x63\x81\x9a\x48\x3a\xad\x91\xcd\x4c\x35\xb6\x39\x72\x36\x89\xd7\x2e\x27\xd2\xc5\xa1\x3a\x51\x08\x7d\xd1\xa4\xae\xb6\x12\xd1\x04\xa5\x99\xaa\x81\xb2\xb7\x45\x54\x14\x38\x0e\x68\x15\xca\xf5\x1d\x85\x28\xb4\x25\x6d\xf2\x32\x49\x78\x30\x03\x16\x3a\x0d\x73\x48\x9f\xef\x54\xd3\x66\x15\xad\x2c\x43\x29\x4b\x79\xa5\xad\x2c\x67\x9a\x6b\x49\x08\x56\x03\x21\xc2\x84\x51\x81\xec\x52\x20\x0a\x8c\xf0\x38\x5a\x16\x98\x9e\xc4\xe3\x2c\x2d\xd1\x45\x94\x82\x4d\x52\xb1\xc8\x48\xc2\x6e\xc3\xd3\x12\xe7\x93\x68\x2c\x7d\x63\xb7\x38\x89\xb7\x39\x6d\xdb\xdb\x54\x33\x3f\x44\x8e\x7b\x5d\xb9\xa6\xb5\xb5\xf9\x13\x2e\x99\xb3\x66\xba\x3f\x06\xe8\x62\x46\xc6\x33\x30\x1a\xa0\xcb\xbb\xcc\xf8\x36\x86\x16\xc9\xb2\x68\xbe\x7a\xe5\x7c\xa0\x61\x7e\x15\xf3\xf0\x1b\x32\x35\x88\xb0\xab\xcb\xa9\xb2\x58\xb3\xfc\x78\x1b\xd9\xb1\x5a\x6e\xd4\x8c\x95\x6f\x24\xc7\xd4\xc9\x30\xe6\x4b\x87\x01\x33\x48\x6f\xcf\x7c\x3d\xa7\x1e\xef\x71\xb7\xc5\xf5\x79\x15\x6b\x72\x0e\xc3\xde\x53\x70\xc5\x4b\x16\xdf\x79\xd8\xdd\xfd\x94\x5d\x38\xc3\x9f\xfb\x78\x05\x79\x0e\xd3\x5e\xb3\x25\x8b\x6e\xf7\xa4\xf9\xb3\x69\x2b\xd1\x09\xbf\xad\xb2\x80\x96\x16\x0d\x9d\x70\x7b\xc7\x35\x89\xe6\x23\xef\x84\x3b\x5b\xd7\x67\xc1\xf6\xe3\x7b\xd3\xa7\x7b\xd3\xa7\xbf\xb6\xe9\x93\x66\xeb\xcc\x4d\x20\xef\xc0\xd8\xb9\xc2\x8d\x25\x37\xae\x64\xef\xb2\x8e\x27\xe2\xce\xf9\x20\x9f\x16\x61\x85\xe6\x46\x93\xf1\xf8\x09\x96\x57\xa2\xc7\xbe\x13\xdb\x09\x65\x9f\xa2\x52\xa4\x9b\x38\x01\x9f\x0f\x7c\x7d\x78\xf7\xf6\x90\x31\xf7\xdb\x74\x80\xc5\x5b\x02\x56\x8b\xe1\x01\x63\x99\xa1\x77\x6f\x0f\xf9\x3d\x81\xbf\x03\xfc\x39\x3a\x38\x51\x54\x2d\xcf\xb2\x42\xbf\xfd\x72\x1b\x3f\x3c\x7e\xf3\xe6\xc5\xe1\x87\xa3\xe3\x37\xe8\xc5\xbb\x77\xc7\xef\x42\x74\x28\xd5\xbf\x63\x56\x25\x3b\xd1\xc7\x18\x75\x37\x10\xad\x0f\x6d\x74\x07\xfe\x3e\x28\x8f\x37\x6d\xc7\x2e\xdf\xd9\x33\x25\x42\x49\x57\x0f\x61\x95\xf9\x9b\x10\x86\xb4\x21\xb2\x8d\x82\xb5\x61\xc2\xb3\x34\x5c\x14\xd1\x14\xa3\x7d\xb4\xbe\xce\x5f\x1a\xd2\x6d\x9d\xff\x1e\xb0\x90\xb1\x4e\xca\x40\x14\x7b\x8a\xbc\xc9\x21\x92\xd3\xf5\xf7\xf7\xc7\x6f\x60\x56\x72\xd9\x25\x4f\x98\x55\xde\x37\xe7\x2d\x99\xc2\x01\xaf\xda\x1c\xad\x9a\xcd\x0f\xec\xba\x5a\x1f\xef\xbc\x68\x3b\xa5\x1f\x8e\x5e\xbf\x38\x3e\xf9\x10\x22\x7e\xe9\x4d\x89\x8b\x76\x72\x5e\xa0\x0d\xd4\xa5\xff\x45\xe3\x19\xe5\x18\x5d\x23\xa0\x0d\x77\x23\xf9\xed\xfd\x6e\x75\xbf\x5b\xfd\xb5\x77\x2b\x6d\xb3\x82\x57\x97\x7f\x54\x2b\xdd\xf6\x8f\xd9\x5b\xbd\xa1\xbf\xc3\xa7\xec\xc2\xe7\x10\x5d\xff\xf2\x70\xa6\x47\x64\x2a\x8c\x63\x08\x7f\x63\x0b\x6d\xa9\xc3\x82\x6d\x84\xfc\xb5\xdf\xc1\x2f\x84\x29\xaf\xa6\x48\xd7\xf3\x59\xe8\x0a\x54\xf3\x1c\xb9\xc8\xd2\x7e\xc3\x13\x7a\x2d\x33\xcd\xd2\xcb\x79\xb6\x94\x2d\xca\x84\x8a\xd3\x9b\x40\xda\x14\x0b\x5c\xe1\x98\xc9\x03\x10\xc4\xc0\x09\xd6\xc4\xd3\xe4\xf1\xec\x59\x96\x25\xd7\x10\x5e\x35\x06\x17\xe4\x6c\x93\xc0\x0c\x32\xd6\x66\x07\xde\x87\xe0\xd8\x70\x98\x2e\x4e\x7c\x10\x8c\x80\x2e\x4a\x5e\xfb\x70\xcd\x98\x26\xdd\xfb\x16\x85\x30\x1d\x47\xb1\x7a\xed\x00\x0c\x1a\xf2\xdd\x2b\x11\xe2\x11\x15\xc8\x80\xd7\x04\xf7\x1b\xfc\x77\x85\xb9\xab\xbf\xbc\xb2\x57\xae\xbc\x21\xd6\xb1\xcd\xe8\x33\x66\x2e\xc0\xc1\x8b\x91\x85\xeb\x58\x79\x07\xf7\x46\x0b\xf2\x56\x50\x8d\x3a\xad\xba\x3a\x27\x41\x8c\x12\x5d\x07\xe5\x3d\x45\xaf\xed\x47\x07\x2b\xd4\x33\xb4\x92\xfb\x33\xaf\x19\x97\x5e\xb4\x9e\x1e\x56\x1a\x91\xf0\xa4\x7e\xa3\xe1\x14\x64\x9a\x46\xe5\x32\xb7\x87\xa3\xa7\x57\x8d\x47\x87\xa9\x1e\x8f\x84\xaa\x1b\x10\x38\x30\x68\xdf\x7f\xfe\xc2\x41\x90\x37\xe7\x48\x51\x1a\x4b\xd5\x52\x99\x41\x50\xe2\x09\x49\xa3\xc4\x6f\xf5\xcc\xea\xf0\xd9\x94\xea\xeb\xda\xca\xe2\xd5\x1b\x48\x11\x79\xf8\x1c\xe7\x97\xe5\x8c\x69\xac\xe7\x23\x02\x2c\x23\x63\x51\xa2\xa1\x6f\x3c\xcc\x42\x2d\xb6\x3c\xae\x41\x78\x77\x1c\xcf\x76\x72\x71\xcb\x5f\xda\x23\xc0\x7b\x07\x22\xca\x5d\x87\xf4\xcf\xd1\xe4\x59\x44\xe8\x35\xd7\xad\x9d\xc7\xed\x27\xaf\x9c\x3d\x6c\xe5\xbe\x05\x99\x9f\x4e\x41\xed\xbd\xbe\xab\xd2\xe4\xf3\xf4\x41\x74\xec\xb6\x2c\x5d\x0b\x61\x51\xcb\xcf\xc1\xf1\x32\x0f\xa6\xcd\xcb\x9f\x12\x08\x31\x65\x19\x03\x70\x20\x7d\xfe\x28\xdd\xa8\xe4\x74\x99\x24\x15\x2f\x5c\x94\x66\x11\xb9\x97\xff\xa6\x42\x18\xea\xab\x0a\xcc\x08\x99\xd6\x68\xce\x6b\x6e\xfb\x39\xf6\x9d\xb7\x31\x3d\xb6\x7d\x05\xe8\xdc\xbe\x39\xef\xdb\xb1\xf5\x56\xaa\x0d\xfa\xde\x40\x71\x26\x91\x8c\xb3\x74\x1c\x95\x3d\x63\xf6\xfb\xd5\x7e\x6c\x2a\xb9\x1e\x77\x62\x53\xcd\xf5\xec\xdd\x16\x57\x71\xb8\x98\xdd\x3d\xb8\x3c\x8c\x73\x05\x6e\x38\x04\x27\x04\x56\x4b\x2c\x9b\x7d\xf0\x00\xf4\x0d\x66\x2f\xea\xb7\xe9\x6a\xe7\x3b\x80\x83\x3b\xf4\xbe\x13\xe5\x53\x6b\x75\x29\xf1\xf1\xa9\x51\x32\xd4\xbf\xb8\x67\x9e\x2d\xcd\x13\x0a\x1f\x1f\xbf\x7f\x91\xf5\xda\x2f\xb5\xd8\x64\xa2\x2f\x52\x4a\xd3\xeb\xdb\xee\xef\xd1\x95\xf9\x4b\x46\xd2\x5e\xa7\xe3\x56\x2e\x1f\xc5\x31\x72\x63\x78\xd2\xaf\x37\x40\x36\xec\xd1\x65\xde\x0f\xf4\x1e\xe9\x57\x35\x69\x56\x1e\x19\x7d\x95\x28\xf4\xf8\x1b\x52\xc0\x2d\xdb\x86\x57\x0b\xfd\xc0\x6a\x45\x6f\x5f\x6e\x24\x1a\xd7\xce\x96\xe5\x62\x59\xbe\xca\xa6\x8a\x5d\x73\x5f\x3c\xda\x6a\x11\xce\x7f\x98\x9f\x19\x4d\x2c\x33\xc1\x14\xb7\x86\x31\xd9\x6e\xa0\x18\x0c\xbb\xe5\x32\xf8\x69\x8e\xe3\xe5\x18\x6b\x73\x15\x8d\xc7\x01\xe2\xae\x28\x75\x7e\x12\x8d\xc7\xa7\x3c\x99\xf1\x44\x8a\x14\xfe\x2d\xa8\xfc\xa9\x39\x65\x83\x62\x46\x26\x65\xaf\x8f\x42\x07\xa3\x22\xcb\x51\x5a\x45\xe3\xb1\xd0\x52\x31\x63\x6f\x46\xda\x38\xc1\x25\x16\xe3\x50\x4e\x92\xcc\x74\x46\x55\x37\x60\x19\xda\xfd\x15\x7f\x57\xc2\x97\x36\xdd\xea\x99\x18\x57\xe9\x58\xe1\xae\xe4\x22\xa3\xe1\x7a\xe1\xc7\xe3\xb8\xc1\x96\x7e\xfe\xe8\x1e\x99\xb6\x9b\x3d\x32\xd5\x15\xdf\xaa\xb6\xb1\x33\x2b\x40\x86\x04\x68\xf8\x7e\xb0\xc5\x0e\xdb\xed\x93\x23\x50\xfe\xa1\xfc\x3f\x55\xd2\xb2\x6e\xfa\xdf\xe2\x51\xa3\xf5\xaa\xcd\xfb\xa2\xb1\x96\x1a\xbf\x96\xb3\x29\x0a\x6a\x9e\x5c\xab\x38\xa0\xb0\x2f\x84\x96\x4e\x35\x80\x33\x83\x7a\x7d\x00\xba\xff\x2a\x45\x14\x5e\xd0\x53\xc9\xee\x59\xdb\x67\x95\x03\x30\xac\x26\xbc\x77\xc2\x06\x2e\x35\x8f\x58\x75\x57\xc2\x4d\x7e\xb2\x6e\xe8\x1a\xeb\x49\x1b\x05\xfc\x6d\x7d\x5d\x0e\xfd\xba\xc9\xd7\x8c\x06\x3d\xfa\xbf\xfa\x40\x22\x7a\x0c\x91\xb5\xe1\x10\x7d\x38\x7e\x7e\x1c\xa2\x1c\x33\x83\xac\x00\x15\x19\x37\x9d\x91\x57\x5c\xca\x16\x27\x62\x9a\xae\x01\x2d\x47\xca\x6e\x81\x52\x3c\xc6\x45\x11\xe5\x97\x74\xb1\x40\x04\xec\x82\x92\x5b\x17\xfc\x15\x83\xb7\x68\x74\x91\xe5\x9f\x98\x94\x37\x5f\x26\x25\x59\x24\x5a\x24\x07\x33\x76\x8a\xdf\xbd\xd1\xf0\x21\xf2\xda\x72\x7f\x23\x4c\xb9\x59\x1d\xa6\x19\x83\x68\xde\xb0\x21\x55\x8d\xe1\x98\x6d\x1c\xe6\xc9\x44\x96\x1a\x08\x1c\xf9\x1c\xd8\xac\xd3\xce\x9d\xba\xb0\x67\xbe\xf3\x43\x15\xac\xc5\x4e\x91\x63\xdf\x68\xf6\x93\xfb\x73\xf2\xd5\xd4\x60\x06\xe9\xad\xa7\xf2\x08\xa5\xea\xe7\x04\x6f\x8f\xc9\x01\xf0\x1c\xb9\x59\x8e\x0f\x1b\x2c\x47\x32\x3d\x6e\xd2\x63\x76\xd1\x63\xf9\xc9\x8b\x15\xb8\xb4\x22\xc5\xf8\x7c\x5c\xd5\x1e\xc4\xea\xa7\x9b\xe0\x9a\xf1\x2a\x18\xcf\x90\xab\xe8\x05\xa9\x20\x27\x97\x2b\x0f\x5b\x16\xbc\x83\x81\x23\xcd\x6e\x14\x7f\x1e\x18\xec\x48\x7d\xec\x21\x01\x20\xb8\x10\xfc\xbf\x27\x52\x25\xcb\x61\x3f\x64\xba\xc6\x68\xc4\x4f\x53\x8e\xc4\x9f\xf9\xf3\x6e\x97\x9b\x33\x34\x28\xcf\x44\x15\xfc\xb9\x82\x23\x77\xc2\x1d\xf0\x60\xa4\x3b\x0d\xa7\x8c\xf9\xbb\xfb\x9b\xd1\xfb\x9b\xd1\xbf\xf6\xcd\x28\xbf\x16\xe5\x4f\x7e\xff\x2b\xe2\xeb\xdd\xa9\xc7\x70\x38\x04\x3c\x44\x87\x59\x7a\x8e\x29\x2b\x8a\x78\xc8\x63\x38\x07\xc3\x59\x00\xe2\x16\x8b\x40\x2e\x94\x80\xa3\xa4\xc8\x50\x94\x24\xd9\x45\xc1\xc2\xb3\x83\xa2\xae\x18\xac\xd1\x8a\x84\xe0\xff\x9a\x7c\xc6\xf1\x35\xcb\x5a\x73\xef\x35\xd6\xf8\x8d\x6a\x99\xd9\x41\x8e\xb9\xca\x52\x1e\x38\x7b\xa6\x4a\x14\x5d\x5d\x89\x00\xe9\x2a\xa3\x2b\x75\xa8\xdd\xbe\xad\x0c\x60\x67\x39\x2e\x22\x31\xc5\x2c\xeb\x43\x4f\xe8\x17\x8d\x86\x98\x1e\xe2\x78\x02\xaa\xe6\x3e\xd4\xbe\xe9\xd4\x09\x90\x9c\xef\xeb\x2f\x5a\x8d\x3b\x23\x11\x44\x49\xb6\x03\x47\x2e\x2a\x6a\x52\x4e\x2b\x2e\x7f\x6c\x4b\xd8\x4c\xea\xf7\xf9\x61\x2b\xa0\x93\x70\x8e\x73\x32\x01\xbf\x1e\x39\x1e\x47\x94\xe3\x68\x81\x6a\x1e\x3c\x40\x49\xf4\xeb\x25\x4a\xb2\x28\x46\xf1\x65\x1a\xcd\xc9\x18\x65\x29\x2e\xa0\x35\x3e\x21\xaa\x21\x1e\xcc\x3a\x93\x7a\x02\x80\x12\xf6\xf5\xa2\x71\x07\x8a\xce\xd6\x14\x97\xc7\xf2\x90\xec\xf1\xe0\x4c\x27\x46\x09\xac\x4d\xee\x01\x74\x65\x02\x9f\x12\x71\x4c\xae\xbe\xf5\x30\x34\xfd\x95\x57\x2f\x2c\xbb\xb8\x20\x10\xaf\x44\xeb\x15\x02\x1d\x44\x81\xd9\x09\x3a\x74\x5e\x56\x31\xe1\x7d\x99\x63\xae\x5e\x0c\xe0\x02\x6f\xcc\x56\x07\x3b\x1c\xcf\xf0\x67\x9f\xda\x40\x69\x4d\xad\x04\xcb\x13\x65\x8b\x22\x86\xe6\x93\x87\xd5\xae\x54\xca\x5b\x0a\x7f\x11\x84\xfb\x29\x0f\x4f\x4e\xab\xe2\x8b\xac\x8f\x42\xb1\xde\x38\x98\x2b\x2b\xf9\xae\x09\x3c\xcf\xeb\xa0\x9b\xa1\xd5\xed\xc0\x81\xa3\x4b\x40\x41\xd1\x2f\x17\xa6\xcc\xf4\x7a\xdc\xfc\x48\x44\x65\x16\x40\x91\x1e\x93\xd9\x6e\x0d\xee\xaf\xc2\x95\xae\xb5\x06\xb2\x5c\xdf\xd7\xbb\x9b\xd4\xc8\x4b\x99\xfa\x29\xed\xa0\xc3\x28\xb0\x98\x51\x0a\xf4\x20\xdc\x22\x75\xa1\xaa\x39\x88\x63\xf6\x2c\x42\x2a\xd1\xa2\x34\x46\x05\x2e\x0b\xb4\x5c\x40\x06\x3f\x8d\x00\xcb\x20\x25\xce\xe9\xde\x91\x9d\x73\x61\x8b\xbb\x31\x1d\xac\xad\x69\x4f\x23\x5e\x65\xd3\xe2\xa0\x7c\x5f\x46\x79\xb9\x66\x6b\x1a\x0b\x9c\x4c\x64\xe2\xc4\x7d\xbf\xcc\x59\xb8\x59\x8b\x11\x27\x0c\x27\x13\xc7\x87\x8f\x78\x64\x37\xc5\x25\xd3\x67\xd1\xc2\xd6\x4b\x3b\xd0\x2f\xa8\x61\x16\xd0\x3d\x24\x4e\x9e\x16\xcf\xa0\xad\x0c\x7c\x8c\x03\x32\xa6\xb8\xec\x59\x6f\x7e\xb8\x25\xa3\x73\xca\x19\x0e\x51\x9c\xa5\x5d\xfe\x4a\x94\xf6\x91\xa3\x0d\xcc\x26\xe1\xa2\x5b\x24\x0a\xb3\x23\xf0\x84\x31\x18\x0c\xd0\x2f\x4b\xe6\x08\x98\xb6\x49\x79\xaf\x73\x5e\xae\x78\x18\x59\xf3\x28\xf2\xda\x7e\x01\x6b\xad\x74\x39\x0c\xff\x19\x93\x65\x7a\x0f\xa6\xcc\x90\xb3\xe9\x99\x26\x7b\xbc\x63\x9a\x7d\x1a\xfd\x6b\xf6\xc3\xfa\xf5\x48\x77\x91\x25\x09\x23\x1f\x3f\xd9\x72\xda\x54\x60\x36\x5d\x4a\x95\x08\xa8\x6d\xd3\xd7\xd2\x0c\xd7\x20\x96\xac\x82\x5c\xf8\x8c\x66\xce\x9c\x0a\x23\x0b\x4a\x7a\x62\xac\xbe\x49\xf0\x3d\x9b\xf2\xd1\x44\xd6\xfa\x24\xdf\x96\x3a\x6e\x46\x19\xca\x4c\x19\x86\xa6\x94\xd7\x4f\xad\x04\x55\x49\x28\x0a\xb9\xa4\x73\x2b\xf4\xdc\x8e\x48\x2b\xf5\x01\xd0\x27\xdb\x19\x35\x65\x3c\x6f\xb3\x24\xa1\x7c\x46\xf5\x84\xd1\x60\xc8\x8a\xd0\x73\x1a\x9e\xe3\xb4\x84\x23\xe7\x80\x52\x1c\x0c\x4d\xed\x25\x0b\x6e\x68\x7f\xca\x30\x05\xe4\x78\x14\x9f\x05\xe2\x8a\xca\x48\x0e\x14\x31\xf2\x1c\xdd\x8d\x11\x53\x10\x03\xfd\xd2\xcd\x5a\x44\x2d\x74\x48\xdc\x92\xc9\x02\xe4\x84\xf7\x10\xcb\xcd\x73\x3b\x10\xf0\xd3\xd4\x61\x8e\x61\x4c\x60\xaf\x7d\xe8\x79\xe8\x08\xcc\x8e\x69\xb0\xb5\x0b\x57\x03\x1f\x9a\x86\x6f\x15\x55\x59\xa5\xae\xab\x52\xd9\xe3\x57\xaa\x99\x9d\xd1\x6c\x09\x50\xa5\xc7\xf8\x4a\x6b\x4c\x25\x6c\x2a\x31\xd8\x12\x7d\x35\x68\x07\x0d\x66\x82\x06\x29\x66\xde\x7d\x32\x26\x57\x08\xb7\xac\x91\x19\x7c\xcb\x3d\xac\xca\x57\x6c\xcf\xc9\xd2\xaf\x9d\xe4\xef\xca\x7e\x0f\x52\x7c\xc1\x6f\x9d\x74\x1c\xe8\xbe\xc2\x18\x93\x24\xb1\xe1\x1a\xcf\xcf\x1c\x1b\x96\x7d\x6f\x3c\xf2\x88\xb9\xe3\x51\x23\x1f\x44\x9c\x23\xf3\x73\x61\x0d\xf5\x5a\x0e\x49\x5d\xf6\x52\x53\xd6\xdf\x8d\x7a\xbd\xb3\xb1\xb4\x29\x11\xc4\xae\x1f\x40\xdd\x55\x43\x8e\xe1\x92\x81\x9e\x39\x16\x38\x8d\xc1\xc0\x4d\x4e\x72\x54\x80\xa2\x25\x2d\x28\x85\x4a\x5f\x30\xaa\xa2\x6c\x02\xc0\xb4\x10\x95\x7a\xfa\x4c\xb9\x22\x5b\x5f\xa6\x51\x51\x90\x69\x8a\xe3\x81\xdb\x47\x9b\xa2\x7c\x3c\xd9\x37\x3b\x52\xc6\x1a\x8f\x1a\x26\xc8\xdb\x8c\x6e\x32\xa6\x8d\x44\xd9\x13\xa3\x44\x97\x0e\xa3\x24\xc7\x51\x7c\xa9\xde\xab\x2b\x41\xb1\xb8\x3d\xa5\x99\x82\xac\x90\x5e\x9b\xc6\x45\x26\x3d\xab\x35\xe9\x03\x6e\xd3\xf5\xc8\xa5\x56\x26\xe3\xe2\x3e\xb7\x90\x54\x8a\x2e\x33\x3e\x36\x32\x9f\xe3\x98\x44\x25\x4e\x2e\xed\x66\x39\xb9\x8f\xdb\xd2\xb6\x29\x9d\x40\xf5\xbd\x0a\x4f\x13\x3e\xaf\x55\xba\x26\x9b\xb1\x7c\xba\xfd\xb0\xc1\x68\x77\xb9\x17\x4e\x94\x0e\x7b\x33\x37\x79\x1b\x33\xec\xd3\xfa\x21\xd4\x31\x06\x73\xd4\x47\x63\xcd\x13\xbf\x2e\x75\x07\xa2\xe1\x5a\xbb\x13\xbe\x6e\x3b\x10\x7d\xdf\x6d\x1e\x8f\x23\x39\x64\x0b\x21\x38\x98\x03\x69\xe0\xef\xf0\xb4\x7c\x9e\x9d\x0b\x95\x26\x8a\x8a\xcb\x74\x2c\x0f\x3f\x3e\xc1\xc8\xc7\xb7\x97\x29\xbc\x9d\x36\x10\xa0\xc9\x18\x16\xb6\x1c\xde\xa5\x1b\xc2\xaf\x52\xb3\x21\xf8\x3b\x18\x9d\x5a\x21\xdb\x7d\xce\x13\x1c\x99\xc2\x6b\x72\x22\x4b\xda\x42\xb9\xb5\xa3\x56\xd8\x51\x0e\x87\xe8\x68\xa2\x38\x23\x29\xe4\xbb\xbe\x4b\xcc\xdd\xaf\x20\x52\x22\xe5\xa5\x4b\x95\xbb\x98\x61\x30\xc6\xe0\xa3\xef\x23\xc6\x54\x0b\x44\x4a\x93\xad\x7a\x37\x6a\x87\xd8\xe5\x32\xf3\xed\x1e\x3e\xf4\xf3\x1a\xed\x09\xd5\xf7\x63\x88\x90\xe2\xe1\x6f\x5f\xd1\x3f\x8f\x25\x8f\xe7\xd8\xb6\xde\x4b\xb2\x69\x55\xbb\xc8\x62\x4c\x35\x67\x0b\xa8\x25\xa4\x7b\x42\x85\x3b\x3e\x7f\xc0\x12\x13\xc4\x39\x00\xd8\x03\x6b\x4f\x47\x8e\x9b\x29\x2e\x88\x1f\x3d\x67\x09\x21\xa7\xb1\x5e\x7f\xc0\x76\xe4\x71\x24\x1c\x16\x82\x5b\x15\x1c\x23\xba\xba\x67\x79\x96\x66\xcb\x42\x7a\x2f\xe4\x86\x01\x74\xb7\xb7\x3d\x11\xb1\x6a\xb8\xb0\xdb\xf5\x9a\xd7\x82\x53\x89\x4c\x59\xe9\xb5\x21\x20\xd7\x86\x8e\xd6\xd0\x3c\x87\xb7\x98\xb7\xeb\x06\x7e\xec\x5c\x91\x32\xdc\x3a\xb1\xdf\x6a\x2e\x48\xaf\xcf\x82\x9d\xcd\x36\x57\xa0\xdd\x65\xc1\xf4\xe2\xe3\xb2\xbb\x76\x7f\x21\x7a\x7f\x21\xfa\x27\xbe\x10\x55\x4f\x45\x35\x95\xf5\x4d\xde\x8b\x72\xe0\x15\x6e\x32\x7d\xb1\xdf\x5a\x3f\x31\x4d\x27\x64\xea\x85\x63\x59\x02\xf0\x68\x14\x59\x31\x5d\xc8\x28\x4a\x3d\x71\x5a\x40\x9b\xcc\x02\x4d\x31\x1b\x69\x76\x99\x39\x22\x53\xee\xc1\xc0\xb2\x62\x64\x40\xcf\xc8\xd4\x52\xea\xeb\xd6\x8c\x4c\xe3\x7c\xc5\x20\xae\x24\xec\xb5\xe9\xb4\x4a\xa5\xeb\x96\xb8\xa0\x67\xac\x68\xc3\x90\x8a\x58\xef\xbc\xcf\xd0\xca\x4c\x96\x15\x60\x7b\x52\x09\x44\x8a\xb7\x39\xe6\xd7\xa0\xda\xed\x84\x51\xf7\x48\xa5\x5b\x0d\x8c\xf4\x12\xf4\x20\xc1\xbd\xdf\xa3\xab\x2b\x37\x8f\x9f\x4d\xfd\x99\x38\xca\x13\x42\x8b\x6a\x5d\x4b\x17\xcb\xf2\x39\x9e\x44\xcb\xc4\x7b\x71\xd2\xd4\x47\xba\x23\xdb\xed\xc8\x2b\x5f\x6f\xf4\x16\x4a\x32\x83\x58\x6b\xd1\xe3\x7b\xaa\xfa\x1e\x47\xef\x82\x35\x8a\xdf\xa2\xfb\xf6\x8b\x2e\x26\xa0\xd0\x5a\x2a\xe6\xd8\x68\xd4\x53\xa1\x96\xed\xc1\x83\xa0\xad\x97\xf8\xb3\x67\xe4\x7c\x55\xb1\xc1\x16\x9a\x51\x64\x36\x41\x91\xe1\x1a\x30\x4a\x63\x71\x53\x5a\xc0\x4d\x09\xb3\x0b\xa0\xeb\xee\xe5\x8b\x7f\x5a\xcb\x0d\xea\xa0\x72\xb1\x77\xa1\x09\x5d\xbe\xe1\x62\xd7\x31\x7c\x17\x57\xe4\x42\xdb\xef\xd6\xe9\x0d\xfc\xfd\xc5\xb8\x3c\x86\xeb\x3f\xed\x0a\x16\x3e\xaf\xae\x2c\x1a\x3a\x18\x43\xd8\x05\xcd\xf1\x99\x0e\xef\xf1\xb8\x25\xaa\x85\x3e\x71\x37\x54\xfe\xab\x47\x53\x0e\xd2\xab\x2e\x33\x1e\x2f\x9a\x94\x68\x4e\xa6\x33\x26\x38\x4a\xe7\xc5\x5c\x49\xe5\xb4\x5c\x66\x8d\xed\x96\x99\xd9\xea\x69\x77\x1a\x15\x6f\x73\x32\xc6\xdd\x00\xd1\xdf\xf4\x3f\x98\x3e\xfa\x23\xcd\xd2\x31\xf6\xbd\x4e\xfc\x84\x2f\x6b\xde\x27\x7e\xc2\x97\x6d\x5f\x28\x42\x4d\x0e\x0e\x59\x0d\xfb\x9a\x3d\xc5\x73\x3c\x26\xf3\x28\xe9\xe9\x00\xee\x0b\x31\xf3\x12\xf5\x6b\x13\xb1\xe6\x4a\xf3\xae\x69\xd9\x57\xf5\xdd\x93\xf4\x4d\xa9\xf6\x9e\x5e\x7f\x4b\x7a\xe5\x42\x8c\x43\xb0\x70\x5f\x2a\x62\xff\x70\x6a\xf5\x8a\x36\xad\xe9\xf4\xb3\x29\xce\xf0\xf4\x35\x43\x86\x69\xa4\xcc\xf2\x73\xff\x8b\xd4\xe4\x7d\x1e\xe8\xdb\xdf\xba\x38\x4d\x2b\x0d\x96\x09\x20\x3d\x5a\x64\x02\x7f\x26\x80\x7c\xb3\x41\xd3\x35\x5c\xc0\xeb\x30\x7f\xf5\x0e\x94\xb7\x0d\x1b\x4a\x28\xeb\x3e\x0f\x80\xa4\xfc\x85\x20\x4b\x41\x4e\xa3\xc2\x0f\x37\x8d\x0a\x03\x0a\xc8\x57\x03\x55\xa2\x9d\x96\xaf\x4a\x08\xe3\x35\x2f\xb8\xfe\x54\x56\x9c\xa4\x3f\xaf\x4c\x4a\x22\xca\xcc\x4d\x48\x8a\x07\xbc\xa9\xa5\x2c\x19\x7f\x69\x15\xf2\xb2\x2b\xb6\xdc\xae\xe8\x81\x73\x54\xa0\x9c\x06\x7a\xf3\x41\xb9\x73\xe6\x81\x52\x94\x27\x32\x5b\x90\x5f\x25\x68\x75\x93\x15\x84\x28\xe3\xb9\x2c\xe7\xcb\x24\x2a\xc9\x39\xfe\x29\x2a\x4e\x0a\x78\x97\x56\x55\x95\x03\x6b\xd5\x35\x6d\xac\x61\x2a\xcb\x89\xc1\x9b\xa6\x06\x02\x2e\xc9\xa6\xb6\xe5\x9e\xca\xd0\xa2\xd1\x38\xaa\x25\xd0\x0f\x79\x15\x4b\x9e\xd7\xad\x14\xb6\x49\x8b\xc4\x5b\x6a\xb5\x00\x60\x76\xdb\x93\x3c\x48\xdd\xb5\x54\x0e\x15\xb6\xa0\x71\xb3\x26\xdd\x3e\x05\x6a\x90\x06\x2a\xc3\x21\x92\xae\x7d\xc0\xc7\x1d\x3f\xbd\x22\xc4\x9a\xa2\xf3\xf3\x8a\xcc\x49\xe9\x99\x42\x13\x80\xe3\x4a\x26\x56\xcc\xbb\x91\x6f\x94\x29\xc8\xaf\x3e\x26\xa8\x32\x0d\xe8\x92\xcc\x71\x51\x46\xf3\x45\x65\x11\x09\xa1\xd6\x15\xcb\x48\xab\x56\xae\x91\x5d\x55\xad\x3c\x1a\x6b\x9d\x89\xc9\x64\x42\xc6\xcb\x04\x9e\x67\xb8\x3c\xd4\x06\x32\x07\x92\x95\x51\xf2\xbc\x4d\x05\x16\xa4\x2e\x24\x99\x6b\x86\x83\xab\x65\x6e\xae\x1c\x37\xdb\x15\x41\x48\x89\xe7\x7d\xfb\x61\x96\x63\x1d\x07\x50\xee\x3d\xa4\xb1\xbe\x7c\x9b\x39\x2b\xd8\xb4\xd0\x46\xec\x68\xdd\x62\x99\x25\xd9\xd4\xbb\x9e\xf4\xb5\xed\x5b\x4d\x49\x36\x55\x5a\x14\x77\x49\x41\xbd\xc6\xb2\xd2\x2b\xd4\x17\x95\xa6\xbd\x26\x13\xfa\x65\xf0\x75\x39\x4e\x2b\xc3\x43\x63\x76\xd1\x3d\xbd\x4e\x87\x71\x1b\x15\xb7\xd8\x01\xbc\x95\x18\x4d\x24\xd9\xd4\x53\xb5\x48\xad\xa8\x52\x16\x32\x85\x4e\xd0\xc8\x37\x1f\x90\x2e\x66\xa4\xa0\x7c\x71\x91\x15\xe5\x0d\x4e\x48\x6f\xb3\xa2\x5e\x30\x70\x23\xe9\xd4\xf2\x4f\xb7\x52\x7d\xa2\x69\x27\x75\xe6\x49\xbf\x07\x8b\xe8\x12\xcc\xe3\xf7\x0d\x6d\x87\x9e\xc5\x91\x0c\x49\x65\x99\x78\xc5\x78\x91\xa9\xc3\x5e\x64\xf9\xa7\x0f\xd9\xdb\x3c\x3b\xc7\xd5\x65\x34\x20\xbd\xec\x22\x27\x59\x4e\x34\x8e\xe2\x14\x14\x10\x9a\x83\xf8\x89\x1e\x3f\xc8\x30\x88\x65\xac\x85\x75\x92\x79\xcb\xd0\x79\x8a\x96\x8e\xf6\x8d\xaf\xa7\xe8\x54\xfb\x3c\x43\xa1\xbc\x8d\xbe\x56\xad\x32\x55\x2a\xd3\xaa\x26\x49\x76\x01\xaf\x03\xc4\x31\xb6\xae\xfa\x7a\x6b\x76\x16\x01\x8f\x12\x13\xca\xd2\xe4\x92\xb9\xf5\x2f\x0d\x23\x7b\x61\xe8\xce\x0c\xda\x7d\xef\x33\x84\xb5\x3b\x0a\xed\xb7\x17\xba\x9d\xbb\x7d\xe2\xa2\x7d\x6c\xc5\xbb\xa4\x5a\x1f\xe8\x9f\x1b\x1b\x7a\xb9\x59\x13\xa5\xfb\xc9\xda\x54\x0f\xd7\x13\x36\xa7\x6b\xc0\x2f\xfe\xbc\x20\xf9\xa5\x67\xc5\x6b\xb9\x3a\xb9\x15\xcc\x0b\x88\x17\x9a\xe6\x55\x2d\x01\x0b\xd4\xb3\x00\x80\xb2\x7d\xb2\x84\x05\xd1\xdf\xf3\xad\xca\x77\xd1\x85\x20\x19\x9e\xe2\x05\xd3\xaa\x3f\x28\xc6\x84\xd8\xcb\x57\x94\xd1\x77\xdb\xbf\x17\x1c\x71\x12\x4e\xc5\xd1\x50\xab\x42\x35\x00\x6e\x71\x21\x96\x95\x8f\x39\x0c\x87\xab\xac\x08\x58\x9b\xfa\x6a\xac\x5c\x8c\x6a\xb9\xdd\x62\x25\x59\xda\x5c\x86\xa2\x76\xf4\x2f\x99\xaa\xad\x80\xf1\x05\xbd\xd0\xad\x35\x08\xbb\x8d\x49\xf1\x05\x5c\xcc\xf4\xcc\x90\xc8\xa0\xb1\x1e\x45\xe9\x80\x14\xff\x88\x12\x12\xf7\x20\x64\x01\x4f\x79\x4e\x72\x3c\x2e\x7b\x3e\x75\x35\xf7\x0c\x05\x80\xbc\xc6\x5e\xdf\xd1\x85\xeb\x82\x8e\x8a\x24\x23\x7a\xe0\xa9\xd6\x70\x3e\xe6\xa9\xa8\x45\x15\xbc\x67\x66\x4d\xfc\xda\xd5\x32\x05\xe0\xee\xa1\x05\x6c\x57\x84\x76\x56\x0b\xfd\xfd\x65\x3a\x26\xa9\x5f\x5a\xe1\xfe\x98\xb5\x0b\x84\x75\x33\x09\xb9\xee\x69\x0c\xf1\x0c\x9c\xd9\x80\x2d\x19\x49\xa7\x70\xd4\xf0\x9e\xf0\x5c\x30\xd3\x25\x10\xf7\xce\xd3\x50\x81\x0e\x65\x96\x9f\x91\xe9\x0c\x17\x4d\xe5\x75\x28\x8d\x76\x78\xee\xa7\x34\xbb\x48\xdf\x97\x51\x69\x47\xea\xb7\x73\xab\x1b\xd0\xab\xd8\xb3\x6b\x58\x2c\x93\x04\xc7\x4d\x55\xe8\x50\x15\x87\x4e\xe5\x25\xa8\xc2\x11\x7c\xd3\x3d\x58\xd8\x08\x11\xa8\x7a\x6a\x2a\x68\x28\x69\x5c\x91\x84\x9e\x34\x0d\xd6\x77\x36\x08\xab\xb3\xb4\x92\x36\x2f\x09\xfd\xc9\x5a\x09\x63\xe7\x0b\x3d\x69\x0c\xb6\xea\x16\x35\xac\xcc\xd1\xcb\xf9\x07\x54\x9d\x57\x51\xd6\x56\x4b\x79\xaa\xb0\x41\x8c\xde\x1b\x87\xff\xd0\x9b\xaa\xc3\xeb\xa7\x9a\xd0\x93\xa6\xc3\x5a\x68\xf4\x24\xea\xd0\x36\x17\x0a\x2b\xd2\x19\xf7\x32\x4c\x6f\xd8\x7d\x42\x27\xdc\x7a\x52\xe5\x50\x86\xb2\xf0\x4e\xb8\xb3\x73\x7d\x16\xec\x6c\xdd\x3b\x23\xb8\xb7\xbd\xf9\xaf\xb1\xbd\xe1\x94\x7e\x17\x51\x45\x56\x73\xc1\xde\xd2\xe0\x86\x05\x3d\x31\x2d\x69\x58\xda\x57\xf0\xe5\xde\xde\xfb\x7a\x94\x24\x43\x2b\x3e\x21\x3c\xab\xb4\xa3\x9b\xb8\x3e\xd9\x85\x6d\xb0\x1b\xc8\xa9\xc6\x17\xbb\x2f\x92\xd3\x47\xb6\xb9\x71\x5f\xe1\x7a\x08\xd3\xd5\xfd\x78\xab\x4a\xf9\xee\xa0\xd7\xca\x92\x6e\x57\x2d\x84\x3f\x8b\xe0\x58\x07\x75\x8a\x6f\x1d\x46\x84\x38\xe5\x20\xfc\x53\x87\xb8\x13\x3f\xf2\x74\x7f\xb0\x27\xc3\xf0\x38\x08\xd7\xc0\xea\x25\x8e\x7e\xb2\xc8\xa7\x85\x2e\xeb\xde\x20\x70\xaf\x90\xf1\x55\x94\x33\x78\xce\x0f\xbc\x9e\xbd\x1d\xc9\xa7\x05\x73\x16\xbf\xce\x85\xb7\x76\x1d\xd6\x85\xb1\xda\x4e\xeb\xdd\xfb\xc1\x21\x25\x91\xa3\xc7\x6c\xe3\x8f\xd4\xdc\xc1\xf9\xc7\x66\x3f\x41\xaf\x11\x13\x7b\x0a\x0f\x2d\x11\x51\x17\x99\x4d\x8f\x25\xeb\x0b\x3f\x44\x0a\x34\xce\xf2\xdc\xf5\x0c\x08\x27\xa0\xa8\xc4\x07\xf9\xb4\xf0\x05\x6b\x53\xd1\xa2\x1f\xa2\xbf\xc1\x09\xaa\x40\x5f\xe0\xfc\x74\x4d\xdb\x23\x25\x37\xcd\x37\x9c\x07\x7a\xa6\x4a\x6f\xa7\x72\x8e\xd4\x21\x97\x41\x01\x8a\x1c\x13\x81\x48\x21\x9e\x9e\xf1\x99\x3d\x37\x28\x84\x0c\xaf\x1c\xb0\x79\x82\x2f\x38\x15\x84\x89\x6e\xb5\x11\xbc\xe0\xca\xa3\x4b\xf1\x1e\x89\xcf\xdd\x7a\xcf\x89\xe1\x17\xf5\xa5\x67\x69\x7a\x2e\x76\x54\xf4\xd6\x8d\x01\x07\x67\x5e\x62\x6b\xe1\xd5\xa5\x84\x51\xc6\x2a\x60\x3d\x86\x84\xb3\xba\xc0\x8e\x20\xc4\xf5\xfd\xfd\x2a\x42\x36\x1f\xa0\xd0\xb3\x2f\x0f\xa3\x55\x13\xec\xaa\xe7\xbc\x0b\xaf\xf3\xa4\x2a\x94\x32\x60\x92\xa2\x93\x8a\x11\x0b\x20\x7b\xcb\xc0\x3c\xe4\xe5\x6c\x1a\xca\x83\x72\x85\x57\xd5\x28\x91\xad\x2a\x0b\x9d\x5a\xca\x93\xed\xd7\x92\x9d\x11\x3d\x72\x75\x86\xb1\x2a\xbf\x30\x83\x3e\x56\x44\x95\xbc\x56\xdc\x5c\x5f\x3e\x3d\x4f\x88\xc7\x32\xf3\x3b\x70\x37\x42\x40\xee\xa3\x0a\xe7\xec\x3e\x1f\xdf\xfc\xf9\x81\x36\x5c\x23\xb6\x64\x8d\x49\x4c\x45\xf0\x11\x81\xfa\x9b\x05\x59\xf0\x16\xaf\x9d\xf7\x1b\x85\x5a\xe0\x5e\xa2\x37\x03\xf4\x44\x68\x83\x6a\x9a\x58\xa6\x8b\x68\xfc\xe9\x98\xe9\xa1\x0d\xa3\x2f\x48\x32\x74\x43\x66\x92\xea\x82\xe9\x2d\x47\x54\xc5\x7e\x48\xd2\xdb\x47\xdb\xe8\xa9\x48\x14\x8e\xac\x91\x38\x07\xaa\x97\xdd\xd2\xfd\x74\x95\x1f\x6b\x5d\xc8\x09\x78\x71\x73\x46\xb9\x2e\x45\xf7\xc2\x2b\x43\x98\x9d\x6e\x9e\xa1\xd0\xe7\x6b\xf9\x10\x22\xf8\x46\x5a\xd0\x64\x81\x2c\x3b\x2c\x73\x94\x24\xfa\xe2\x1e\x0c\x06\x62\x7d\x1f\xda\x65\xad\xcd\xc7\xf1\x72\x72\xc4\xb6\x3b\x88\xce\x2a\x40\xe9\x6e\x14\xc9\x1a\x02\x33\xfa\xba\x48\x66\x2e\xbd\xe0\x09\x99\x38\x74\x45\xc6\x23\x9f\x28\x8d\x4d\x57\x18\x02\x8c\x85\x2f\x66\x27\x23\x5a\x07\x8b\xfd\x46\xc1\x39\xda\xbc\xb4\xcb\x67\x15\xc2\xaf\x36\x51\x2d\xf4\xaa\x2a\xc4\xed\x2a\xf1\x6b\xfd\xfb\xa6\x90\xc1\x2c\x23\x3a\xb9\xc7\xc0\x41\x46\xc9\x7f\xdc\xf3\xad\x21\x16\xea\xec\x07\xbc\xf7\x9a\xd2\x97\x5e\x44\x17\x7f\xec\x62\x4a\xa1\xcf\x3c\xee\x0a\x2e\x2d\xe0\xd4\xb5\xfc\xba\xef\x45\xa5\xd2\xd1\x4a\xc6\x87\xcb\x19\x43\x02\xaf\x3a\x30\xba\xe6\xbe\x9f\x82\x52\xfa\x12\xee\x19\xeb\x41\xf3\x19\xed\xbc\x78\x6c\xd3\x60\xe0\xfa\x29\x71\x79\x80\xe6\xa5\x44\x18\xc6\x1b\x6f\xd9\x03\x66\x5c\xb1\x67\xfa\x86\x65\x9d\xc6\xb1\xe3\x07\xbb\xcc\x2f\xad\xe7\x5f\x1a\x28\xbc\xf8\xaa\x1e\x2f\x32\x9e\xa8\x8d\xe1\x8d\x70\xcf\xf1\x34\xc2\x28\x7e\x1f\x61\xaf\x8f\x13\xbb\xf3\xa2\x75\x4d\x92\xa9\xdd\x28\xda\x9c\x2b\xed\x6d\xc3\x2c\xd2\xb8\x2b\x58\x2d\xfc\xa9\x96\x5a\xe3\x9a\x11\x24\xc5\x01\xb9\x45\xe2\x0f\x68\x13\x0e\x35\xc6\x59\xd3\x95\x0e\xf5\xc0\x8f\x51\xca\x9e\xdb\xa6\x31\x77\xc9\x07\x91\x3b\xd3\x47\xe2\xa0\xea\x84\x30\x6d\x58\xae\x46\xd8\x2e\xba\x6e\xac\x79\xe8\x99\xb7\x78\xbc\xba\x46\xf0\xf6\xfe\xd2\x71\x51\x92\x79\x54\xe2\x9f\x22\x50\x20\x36\x51\x95\x06\xde\x44\x51\x7a\xcd\x77\x41\x4d\x5f\x9f\x3a\xda\xcd\x90\x36\xae\xa6\xd9\xf1\x80\x56\xcd\xcc\x3b\xd1\x0c\x16\x11\xa0\x58\xcc\x78\xae\x0b\xe4\xf2\x81\x3f\x3a\xbc\xbb\xb3\xda\xd5\x34\xcd\x55\x53\x0c\xf9\x9b\xcd\x53\x2b\xc4\x8b\x1b\x5d\xbe\x32\x6b\x02\xae\x7b\xa5\xe6\x5b\xc4\x91\xd3\x8b\x0a\x3c\x6b\x64\x5f\x8b\xb0\xdf\x36\xa8\x9c\xac\xff\x46\x71\xe5\x64\xa1\x55\x07\xf9\x35\x83\xcc\x29\x1d\x0d\x1d\x60\xbe\x18\x0b\xef\x45\x05\x3b\x35\x37\x31\x22\x0e\x5d\x6d\x95\x52\x33\x2e\x5e\xf6\x8f\xcd\x95\x90\x11\x6c\x43\x80\xe9\x62\x8a\x11\x33\x42\x9f\x13\xd7\xdd\x97\xa5\x71\x7d\x0a\x3e\x44\x3f\xd2\x1e\x77\x51\xc8\x3e\xac\x9d\xa4\x1b\x38\xc2\x4b\xa8\xdc\x6c\xc9\x3c\xe9\x20\x8c\x0f\xe7\x4c\x65\xb1\x8e\x0b\xf7\x93\x8c\x41\x36\x12\x83\x88\x8e\x51\xb5\xfd\xc8\xb8\x33\xf5\x5b\x8f\x27\x44\x8c\x3e\xc1\xa5\x21\xe8\xac\x9b\xd8\x51\xd6\x38\xb0\xcd\x97\xba\x0c\x25\x5c\x2c\xa8\xb4\xaa\xad\xc2\x42\xe7\x20\x5a\x2c\x92\x4b\xee\xf0\xa5\x15\x61\xf5\x6d\x33\x36\xb6\x05\x58\xcd\xd0\xc4\x1b\xd5\xdd\x30\x0f\x3c\x8c\x8a\x62\x3c\x2a\x92\xca\xad\x43\xa8\x78\x26\xec\x6b\x45\x51\x11\xe9\x6a\xc5\xeb\x1e\x6f\x2a\xc1\xf9\x61\x53\x61\xb8\x0a\xd0\x95\x9a\xbd\x93\x5f\x55\xdc\x14\x91\xd8\x48\x54\x52\x65\x31\xb5\x5b\x0b\x4f\x2d\xf4\xf3\x4f\x19\x42\x46\x94\x05\x02\x27\xf9\x78\x99\x44\xf9\xfa\xfa\xfa\x7a\x7d\xe0\x18\x41\x41\x7b\x77\x12\x3a\x86\x69\x7f\x3b\xe1\xf6\x63\xbf\x1f\x8e\xed\xfb\xdb\xff\xfb\xdb\xff\xbf\xf6\xed\x3f\xbf\xfa\xa7\xb0\x22\xb4\x8f\x3f\x20\xc1\xef\x16\x6a\xc0\x67\x59\x50\x6f\x08\xb0\x36\x1c\x42\xe8\xa2\x28\xa7\xa4\x4c\x77\xb0\x65\x61\x0e\x91\x12\x5c\x4c\x26\x13\x9c\xe3\xb4\x44\x38\x3d\x2f\xa0\xd0\x28\xcf\x2e\x0a\x9c\xaf\x69\x7e\x19\x2f\x48\x1a\x67\x17\xa0\xb1\xd0\x1c\xf6\xa3\x07\x0f\x78\xce\xe0\x9f\xaf\x5f\xbd\x2c\xcb\x05\x77\xf9\xc9\xb8\xa6\x99\x86\xf6\xfd\xb0\xc0\xfa\xb8\xbf\x79\x32\x4d\x33\xca\x08\x12\x92\x62\xda\x93\x34\x8b\xf1\x9a\xe6\xe4\xc9\xa9\x51\x0e\xfc\xf3\x3c\xa1\x23\xe3\x1b\x5b\xb7\xdf\xb6\x91\x6b\x86\xc9\x7f\xbe\x7c\xb7\x6d\x54\x37\xcb\xb7\xbb\xfd\xca\x52\x42\x72\xa0\x2d\xbc\x15\xc8\x74\x4d\x22\x40\x7e\xa2\xa2\x3d\x78\x39\x64\x3e\x91\x69\x2f\xa5\x01\x84\x51\x5e\xdf\xf2\x67\x59\x51\x06\xa8\x24\x73\x9c\x2d\xcb\x80\x56\x98\x07\xa0\x64\xbe\xc8\x72\xee\x76\x02\x36\x13\x0a\x87\xf6\x11\xfc\x77\x75\x85\xba\x9c\xd8\x93\x6c\x1c\x25\x34\x31\x7c\xf2\xcd\xee\x37\x10\x1f\x94\xed\x3d\xac\x42\xba\x13\xf2\x5f\x57\x57\x68\x53\x66\xd3\x66\xd0\x3e\xb4\x26\xd3\x44\xa3\x68\x5f\xb6\xdf\x28\x3c\x2d\x72\xbc\x80\x80\x5b\xf8\xc2\x9a\x32\x4b\x76\xe2\x80\xef\xb4\xb3\x8c\x16\x5e\x1e\x47\xe9\x35\xdc\xb1\xb2\xf8\xf2\x6c\xce\x15\x96\xb9\x77\x3d\xed\xc0\x67\xb6\x65\xb8\x70\xd1\x31\xad\xc9\x5d\x66\x07\xcc\x8b\x40\x5a\x3d\x43\x35\xbb\x41\x61\x84\x44\x79\x18\xdc\x00\xaa\x6c\x84\x94\x78\x05\x43\x7e\xf9\x6e\x5b\x85\xe7\x64\x92\x96\x86\x79\x6d\x22\x28\x8c\xe1\xc3\xcc\xaa\xc8\x18\x0f\xab\x12\xe4\x61\x51\x6b\xb6\xc0\x69\xaf\xfb\xf6\xf8\xfd\x07\x11\x51\x90\x11\x0e\xeb\xdc\xde\x9a\xe6\x10\x0d\xe6\xf6\xc1\x03\x73\x52\x8d\x43\xdf\x12\x0c\x6a\xba\xcf\xa2\x82\x8c\x51\x17\x6d\x40\x17\x9e\x2d\x29\x7b\xd0\xaa\xd8\x40\xdd\x50\x5e\x15\xca\x7a\x06\x65\xc6\x1f\xad\x75\x47\x51\x81\x1f\xef\x76\xad\xf1\x2b\x77\xc0\x2f\x71\x14\xe3\xbc\xd7\x3d\x00\xbe\x4a\x7e\x8d\xd8\x69\x0b\xda\x67\x23\xac\x29\x44\xe5\x63\x9c\x96\x8f\xe8\x41\xbb\x1b\xa0\x2e\x95\xfc\xc9\x18\xaa\x18\xfe\x52\x08\xb5\xa3\xbc\xb1\xe2\x53\xd6\x40\xae\x2c\x70\xc4\x65\x3a\xd6\x0e\xd5\xb6\x26\xd9\x77\xf1\xbc\xd0\xae\xaf\xfd\x21\x82\xeb\x48\xaf\xb0\x43\xc6\x09\x5d\x9a\x4d\x72\x82\x66\x4c\x5a\xe5\x31\x67\x81\x1e\x95\x76\x5f\x61\x2e\x8d\x7b\xf0\x20\x82\x05\x03\x21\x93\x4b\x59\x3f\x47\xb2\x50\xe4\xeb\xde\x7e\x7d\xd6\x00\x87\x59\x9a\x62\xfe\x6c\x41\x50\x98\xa2\x44\xe3\x72\x51\xb4\x2e\xfc\xee\x7f\xc0\x9f\x4b\xa7\x83\x1c\x56\x7b\xad\xc1\xad\xe3\xcd\x6e\xd5\x75\xe9\x1d\xaf\xbf\xe7\x6b\x50\x5f\x25\xed\x43\xc0\x02\x0d\x44\x0d\x44\x70\x20\x39\x4e\x0d\x25\xf0\xac\x1f\x9d\xa0\x0b\xa8\xcc\xc9\x74\x8a\x73\x16\x29\x86\xce\x3e\x88\x2d\xd2\xed\x23\xc5\x41\x13\xc1\x40\x0f\x7c\x54\x63\x06\x7c\x6d\x43\x3f\x60\xbc\xb2\x67\x70\x93\x14\x5c\xf4\x16\x65\x54\xe2\xf1\x2c\x4a\xa7\x7e\x05\x02\x33\xef\x17\x88\x8f\xe2\x4b\x30\xac\x87\x1b\xe1\x5d\xca\x61\x6c\x96\xb7\x6e\x06\x6c\x6d\x41\x31\x0a\x50\xdc\x2a\x69\x91\x80\xec\xcb\xac\x06\x8a\x82\x33\x99\xf7\xd6\x4a\xde\x58\xad\x48\x5b\x48\xbf\xda\xb2\x2f\xb6\x8c\x96\xe9\x59\xf0\xda\x42\xb1\xda\x08\x5c\xcc\x9a\x95\x15\x03\xb5\xf4\x3e\xb0\x52\x3d\x7d\xf3\xe0\x0b\xf9\x6e\x39\x80\xdd\x85\x3a\x26\xc0\x57\x9a\xbe\xae\xd4\x65\x79\x72\x49\xe9\x9d\xbd\x2d\x85\xc5\x45\xa9\xba\x62\x6d\x91\x82\xd7\x8f\x4d\x66\x2a\x85\x00\xa1\xe0\xb4\x85\x01\x7a\x7e\x48\xbb\x25\x9a\x44\x24\xc1\xf1\x00\x1d\xd3\x73\xda\x05\xa1\x67\x8f\x08\x82\x3b\x55\xaf\x26\xad\x4d\xcf\x5c\x28\x7c\x4a\x7d\x86\x0c\x22\x40\xe2\x10\x7d\x27\xff\x84\xbe\x8f\xee\x3e\xf9\x62\x1c\xa2\xee\xf6\x60\x53\x2a\x0f\x85\xfe\xb1\x9b\xe2\xf2\x63\x42\x8a\x12\xa7\x24\x9d\xca\x6c\xa9\x3d\x3c\x33\x0c\xba\x84\x82\x2b\x67\x91\xaa\x5c\xf2\x15\x56\x85\x74\x90\x6a\x12\x1c\x75\x81\x3e\x74\xa1\x2a\x30\x4e\xfb\x54\xcc\xed\x84\x4f\xe8\x2f\x43\x7e\xee\x84\x5b\xdf\xd2\x93\xff\xce\xfd\xc9\xff\xfe\xe4\xff\x17\x3f\xf9\x2b\xc3\x7f\x78\xb4\x78\x47\x46\xff\xd2\x90\x53\x3f\x55\x8e\xc8\x94\xd9\xe0\x0e\x7e\x61\x27\x74\x76\x0f\x12\xbf\xc2\x13\x73\x43\x90\x21\xfb\x2e\xb5\x87\x73\xc6\xc6\xc9\x20\x18\xbb\xb8\x98\xd1\xde\xf7\x4c\x03\xad\xef\x59\x61\xf4\x10\x6d\xbb\x2f\xef\xc0\xe2\x8f\x4a\xf1\xe6\xfb\x43\x54\x1b\x37\xff\x2d\x3f\xd5\x45\x29\x3a\x7a\x76\xf0\x86\x4f\x72\x8c\xbe\xfb\x16\x8d\xb3\xf9\x62\xc9\xc3\x65\x8c\x2e\xd1\x3c\x3b\x27\xe9\x54\x0b\x0a\xb5\x8b\xc6\xb3\x28\x87\xbd\x80\xdd\xcc\xc6\xcc\x94\x4a\x98\xab\x0b\xe8\x04\xb3\x47\x0b\x65\x46\x1b\x64\xb8\x2a\x50\xef\x00\xed\xa3\xad\xcd\x00\x3d\xa3\xff\x6f\x05\x68\x30\x18\x04\xe8\xff\xd0\x3e\xda\xf9\xa6\x4f\x0f\x3b\xa8\x58\xe0\x31\x99\x10\xb6\x90\x8e\xde\x1f\x6f\xed\x3c\xde\x7a\x6c\x9b\x98\x91\x22\x83\x74\x3e\x0e\xd7\x39\xe8\x35\x7b\x13\x4b\x3b\x42\x07\x68\x5e\xad\xe9\x37\xcb\x5c\x92\x8a\x05\x18\x77\x6d\x60\xd6\x6f\xc6\xe7\x1f\x45\xa9\x3e\x8f\x74\x44\xdd\x83\xee\x80\xa2\xe5\x30\x8b\xf1\x41\xd9\xdb\xd4\xb4\xd6\x74\x6c\xdd\xff\x73\xb2\x19\x03\x64\xef\x76\x81\x58\xcb\xec\x64\xb1\xc0\xf9\x61\x54\x28\x55\xb6\x96\x5d\x2c\x47\x45\x99\xf7\x76\xfb\xe2\x45\x2e\x4f\xd8\x0c\x76\xad\x1b\x33\x96\xbb\x48\x48\xd9\xeb\x76\xfb\xe6\x63\xe5\xb4\x6f\x5a\x57\x8d\xb3\x98\x0e\x2e\xf5\x75\x5e\xc8\x87\x00\xf3\xc3\x3e\x3a\xa0\x02\x21\x7c\x7c\xbf\x8f\xfe\xaf\xef\xb8\x72\xf7\xcc\x2c\x9f\x58\x03\x52\xfa\x06\x8d\x31\x7a\x84\x0e\xd0\x06\xda\xda\xd4\xec\x8c\x7c\xee\xcd\x45\x08\x49\xdb\x86\xe9\xba\x3f\xf8\x25\x23\x29\x1d\xa6\x6d\xa9\x38\x5e\x82\xe3\x54\x98\xe2\xd7\xc7\xcf\x29\x61\x6f\x6d\x0a\xa6\xc4\x2d\xfc\x80\xf2\x3d\x14\xf7\xed\xe6\xe3\x5d\x9b\xe0\xe6\x59\xfc\xdd\xb7\x5b\x9b\x55\x84\x66\xd2\x97\x72\x47\xcb\xa8\x89\x17\xae\xa5\xa2\x1c\xcf\x23\x92\x32\xdd\x11\xcd\x53\x77\x8f\xdc\xb9\x8b\xc9\x1e\x38\xb0\xb2\x5b\xde\xee\x5b\x6e\x6b\x80\x59\x09\x30\x69\xf1\xfa\x9d\x61\x22\xa7\x9a\x04\x59\xfb\x28\x2d\x99\x47\x9c\x00\x6d\x6d\xf6\xd1\xff\x9f\x62\x6d\xc3\xa9\x85\x39\xc5\xe1\xe6\xe7\xbe\x17\xb8\xb2\x2e\x59\x52\xd5\x67\xcc\x53\xf3\x3b\x24\x66\x82\x0e\xeb\x80\x1b\xfc\xc3\x85\x3a\x24\xf0\xb7\x0e\x9c\x7d\x8a\xf9\xf2\x4f\xce\x50\x77\x5a\xec\x9f\x04\x6e\x09\xad\x96\x9c\xdb\x55\x27\x58\x68\x53\x3f\x31\xc4\x92\x59\xce\xc5\xeb\x1c\x8b\xa8\x28\xcc\x81\xcc\x71\xfa\x1e\x69\x59\x42\x8c\xa6\x43\xb8\x96\x6c\x4d\xd7\x8a\xd1\x9c\x81\x56\x63\x93\xcf\x80\xa8\x78\x26\x7c\x06\x68\x2f\x15\x78\x50\x47\xb4\xf5\x58\x63\x61\xa3\xa8\xc0\x3b\x8f\xd1\x3e\x94\x51\xea\xa1\x9d\xc7\x86\x09\x40\x1c\x63\xa6\x59\x84\x3d\xb0\xc7\x0a\x05\x68\xeb\x1b\x53\x12\x96\xfd\x7c\x36\x8a\xd2\x1e\x2b\x66\x32\x3f\x6b\x31\x73\xb7\x24\xda\xc2\x7d\x46\x87\x5e\x66\xc6\xee\x45\xa7\x0f\x81\x27\xcd\xfc\x52\xac\x68\xa6\x4c\x02\x7b\xdd\xb7\xcc\xa5\x7f\x9a\x95\x5c\x28\xfb\x9e\xfc\xd0\x99\x82\x44\xc2\xdc\xdd\x4c\x14\x52\x8b\x59\xc4\xa4\x35\xd8\xdf\x3e\x8f\x93\x65\x41\xce\x65\x04\x42\x32\x22\x09\x29\xa5\x80\x33\x8a\xd2\x4f\xc3\x51\x1e\xa5\xe3\x19\x2a\x70\x7e\x4e\xc6\x62\x03\x8c\x98\x63\xcf\xce\xf7\x43\xf2\xc3\xc0\xa6\x21\x19\x0d\xa0\x10\xbb\xd0\x04\xe7\x74\x1b\x8a\x92\x69\x96\x93\x72\x36\x47\x31\x2e\xc6\x39\x19\x31\xb6\xc4\xe5\x1f\x9c\x0e\x2e\xc8\x27\xb2\xc0\x31\x89\x40\x08\xa2\x5f\xc3\xa3\xb4\xc4\x79\x1a\xb1\xa7\x13\x1f\x9f\x45\xe9\xa7\x8f\xdc\xab\xe8\x47\x36\xaf\xff\xbf\x9f\xf8\x48\xd3\xe9\x47\x3a\xc4\x8f\xf0\x96\xe8\x63\x4c\xa6\xc4\x79\xca\x21\xa6\xc6\x47\x91\x23\xb1\xa7\x8a\x19\x10\x3e\x63\xca\xcc\xb3\xcd\xb6\xa0\xd5\x67\xf6\x8a\x1c\x59\x6c\x91\xcf\xe8\x21\xdb\xa7\xba\xff\x7c\xd1\xdd\x5b\xf3\xf2\x4c\xce\x63\x7b\xd6\xce\xdd\xd3\x2b\xd8\x40\xdd\x4d\x10\x95\xa0\x15\xdd\xdc\x85\xa2\xe3\x39\xc5\x06\xda\x47\x3d\x26\x4e\xf5\xbe\x7b\x82\x1e\xa9\x26\xfa\xe2\xd9\xc0\xa3\x6d\x6b\xbf\x95\x5e\x37\xcc\xa6\xb4\x3a\x79\x83\x0d\x6a\x2b\xce\x44\x34\x5c\x01\x61\xb3\x38\xd0\x24\x2d\x4a\x52\x2e\x4b\xe1\x1b\x97\xc4\x38\x2d\xe9\xa6\x65\xfb\x4f\x67\xb5\x1c\xa5\x31\xc9\xb1\x69\xc0\x60\xbe\xb1\x29\x02\x21\xcb\xca\x47\x36\xf0\x6a\xaa\xa3\xb5\xd4\x81\xa6\x3a\xaa\xad\xce\x2a\xbc\xc8\xec\x89\xd7\x5f\xae\x79\x04\x36\x39\x43\xf7\xc5\x87\x97\x74\x1e\xc4\xeb\x16\x1d\x03\x5a\xaa\xec\x5b\xdf\xe2\xd7\x59\x1d\xbf\x16\x4f\xe9\x18\x72\x79\x90\x65\x52\xb0\x97\x72\x3a\x1f\x77\xe4\x4e\xf0\xa0\x52\x29\x6f\xca\xbd\xc8\xa3\xf8\x10\x0a\x0f\xf6\x9c\x8e\xb5\x24\x85\xce\x23\xcd\x3f\x4b\xad\x9c\x40\x74\x3f\x2f\x84\x91\x95\x2e\xfc\x29\x27\x2f\x8d\xba\x72\x89\x05\xe8\x7a\xe5\xeb\x41\x7d\xcc\xca\xb9\xbe\x77\x54\x01\xca\x3c\x5a\x1b\x18\x9b\xae\xad\x71\x47\x69\x51\xc2\xf0\x3f\xff\x7c\x71\xba\xf9\xe8\xbb\xb3\x2f\xdb\xd7\xbd\x17\x1f\x5e\xd2\xdf\x07\x8f\xfe\xef\xec\xcb\xd6\xce\xf5\x95\xfc\xd8\xd9\x0c\x76\xb6\xae\xfb\xff\x33\x1c\x94\xa0\x04\x95\x1b\xb8\xf1\x2e\xaf\x8a\x31\x68\xe0\xec\x79\xde\xd6\x8a\x08\xe3\x4f\x30\xe1\xf4\xef\x45\xdb\x73\xb5\x04\xef\x06\x6f\xcf\xdd\x95\x64\x21\x4e\x0d\x4a\x7f\xdc\xb3\xb3\x0b\xe1\xda\xfd\x79\xdf\xdc\x70\xd8\x13\x44\xd2\x8a\x81\x1b\xdc\xe7\x6e\x86\xee\x65\x23\xad\x06\xbf\xbd\xd9\xca\x6a\x93\x89\x94\x74\xa4\xc5\x72\x4e\x01\x4f\x0a\x7e\x7c\x98\x67\xf1\xa3\xef\xbe\x7d\xb4\xb5\x29\xb3\xe1\x8c\x0b\xbd\x1b\x67\x09\xea\x1d\xbd\x3f\x1e\x1e\xbd\x38\x44\xf4\xdc\x10\x6e\x6f\x6e\xee\xf4\x6d\x9e\xac\x55\xeb\x9e\x42\xb5\x5c\x67\xe0\x22\xaf\xe5\xb0\xf9\x99\x70\x3b\x40\xdb\xed\x6c\x55\x75\xa6\x6a\x6c\x29\x08\x4f\x07\xe8\x9f\xef\x5e\xfc\xe4\x38\x12\x94\x05\xfc\xa3\xa9\xac\xd1\x9d\x54\x0d\xb2\x69\x78\x8a\x00\x7a\xe0\x65\xce\x19\xf2\xb7\x01\xda\xed\xa3\x10\x75\xbb\xad\xc6\x3d\x4e\x08\x3c\x24\x93\x1d\x04\xe5\x13\x49\xed\xf1\x51\x2c\xfc\x74\xf0\x8f\xe3\x1f\xff\x75\xfc\xee\x7f\xed\x59\x85\x3a\x2a\xe6\xd4\xae\xdf\x3b\xb9\x0c\xe8\xd6\x63\xdf\xda\x5a\x7d\xe4\x7c\x35\xf9\xcf\x25\xee\xc1\xc3\x1d\x9a\x53\x81\x33\xbc\xc8\x73\x0e\xd1\xef\x9d\xf8\xe0\x7c\x0e\xc8\x8c\x43\x87\x3b\xe0\x5d\xed\x10\x5b\x79\x94\x11\xe7\x0f\x79\x4a\x31\x4e\xa8\xec\x8c\x62\x9e\x67\xb6\x1e\xf7\x03\xb4\xbd\x29\x5d\x9c\x19\x52\x9e\x40\xaf\x35\x48\x51\xb8\xdd\x02\xad\xf0\x4a\x75\x04\x59\x4c\xa9\xaf\xeb\x15\x3b\xa1\xf9\x79\x7d\x16\xec\xec\xde\xab\xf1\xef\xd5\xf8\x7f\x71\x35\x3e\x57\xe1\x2f\xc6\xf5\xf6\x7b\xb7\xb0\xb8\xeb\xa8\x48\x73\x9d\xbd\x95\x22\x64\x35\xd8\xe9\x31\x3d\xd3\x62\xec\xb5\x04\x5b\x44\xe5\x2c\x40\x29\x36\xac\xbf\x3f\x82\xe6\xc2\x79\x78\x2a\xae\xaa\xf5\x18\xbd\xc2\x6b\x01\xb7\xd7\x01\x1b\x1f\xfa\x1f\x4b\x55\x59\x63\x79\xc3\x0b\x5c\xb1\x14\x09\xbd\x2f\x14\x3a\x54\xe5\xa5\x2b\x4a\xab\xd8\x20\x4b\x7b\x5d\x18\x55\x57\x8f\x69\xd9\x37\xec\xa7\x8b\x8c\x32\x31\xf6\x96\xf0\xe8\xed\x21\x52\xf7\xca\xec\x85\x61\x37\x40\x7a\x28\xf8\x8f\x8c\x0d\xf2\x0b\xef\x9e\xed\x0c\xd3\xdb\x83\x34\xd6\xdb\xd7\x9a\xaf\xac\x0c\xad\xc9\x37\x06\xaf\x8e\xde\x7f\x78\xf1\x06\x56\xd0\xe1\xf1\x9b\x37\x2f\x0e\x3f\x1c\x1d\xbf\x41\xef\x5e\xbc\x7f\x7b\xfc\xe6\xfd\x8b\xf7\x95\xad\xc6\x51\x19\xe9\xcd\xd2\x6f\x7d\x73\x1a\x3e\xe4\x66\x84\xf3\xe8\xf3\x38\x9b\x2f\x12\xfc\x99\x94\x97\x21\x7a\x0c\x94\x65\xf5\x10\x74\xa1\xd2\x0e\x81\x56\xa5\xf6\x9b\xbe\x27\xa0\x09\xb7\x39\xf8\x62\xc6\x23\x86\x83\x5f\x6c\xdb\x4e\xf0\xee\xb0\x38\xcd\xc0\x5f\x62\x74\x31\x23\xe3\x19\x9a\x47\xe5\x78\xc6\xc5\x57\xb6\x09\x51\x86\x16\x1b\xe5\x3c\xf1\x03\xa0\x69\x7f\xc0\x62\xb8\x8e\x72\x7a\x0b\x16\x08\xfe\x70\xa2\x64\xd2\xfb\xe8\x27\xe4\x53\x78\x1b\x47\xe2\x33\xd7\x1d\xba\x2c\x4c\xc7\xca\xc1\xf6\x1c\x28\x3b\xf4\x73\x65\x48\x54\xa8\x86\xf7\xdd\xae\xe8\xda\xc1\xe2\x84\xe4\xd8\xf0\x08\x60\xa3\xab\x6a\x3c\x74\x28\x9e\xd6\x6b\xc0\x55\x7c\x56\xdd\xb4\x45\xfd\xc5\x38\xc1\x25\xae\xab\xc1\x1e\x8c\x8d\x1b\xfd\x15\xf6\xcf\x74\xd7\x02\x42\xe4\x04\xc1\xea\x03\xe5\x0e\xb3\x95\x4a\x99\xb3\x1c\x94\x31\x57\xcb\xa4\x1c\xac\xad\x09\x61\xd0\x24\xe1\x35\x5b\xed\x01\x2f\x32\xa9\xf0\xa7\x78\x9e\x26\x1e\x99\x85\x75\xcf\xaa\xfa\xaa\xb2\xd9\x60\x60\xc9\x6b\xff\x60\x9e\xcd\x95\x83\x5e\xb1\xc4\x9f\xbf\x78\x74\xf8\xf2\xe4\xcd\xff\xbe\x78\x27\xeb\x89\xf1\x78\xb6\x4c\x3f\xe1\x98\xbf\x2a\x61\x2f\x46\xf9\xdf\x20\xc7\x8b\x24\x1a\xe3\xde\xf0\xdf\xd7\xa7\xff\x4e\xff\x9d\x9f\x3d\xfd\xf7\x97\xe1\x34\xe8\x5e\x5f\x3d\x7a\x74\xf5\xa5\xdb\x07\xd7\xc2\x5f\xbc\xf0\xff\x3e\x13\x25\x4e\x79\x99\x33\x5a\xe8\x54\x94\x3a\x3b\xf5\x97\xb3\x4b\x19\x85\x2a\xca\xa8\xb6\xb4\x96\x64\x43\x5a\x19\x7e\xcd\x47\xb3\xbb\x82\x93\x1a\x18\x70\xd7\x2c\x20\x5e\xe3\x2f\xc3\x21\xdc\x81\x62\xee\x0e\x03\x3c\x6d\x40\x05\x6b\x0e\xe9\xd3\xbc\x43\x9a\x65\xae\x5c\xee\x77\xc6\x82\x41\x1b\x88\xbd\x7f\x35\x44\x75\x79\x67\x6d\x71\x32\xd7\xa9\x81\xcf\x16\x0c\xfa\xae\x95\xe2\xd6\x34\xcc\x98\x66\xcd\x5d\x7c\xaa\x33\xfb\x76\x67\x90\x11\xe6\x9d\x1b\x72\x81\xeb\xbb\x74\x8c\x13\x70\xa8\x2f\x1e\x71\x1a\x65\xc6\x09\x8e\x72\x61\xc2\x65\xb5\xc2\x93\xad\x05\xed\x07\x02\x5f\x0d\xa5\xa8\xc8\xb7\xc7\x99\xe5\xed\xbd\x4e\xff\xab\xb5\xab\xe4\x38\xd3\xe1\xaf\x03\xb4\xb5\xb9\xb9\x89\x1e\xb2\xcb\x19\xcf\x5d\xab\xd7\xf1\x03\xbc\xdb\x03\xec\x08\x7c\x51\x0e\x52\x60\x4e\x2f\x2c\x28\x0a\x7f\xd7\xb7\x3a\xaa\xdc\x19\xb3\x48\x04\xa2\xfd\x70\xcb\x4a\xa7\xc3\x8c\x45\xb0\xb8\xde\xa6\xdd\x9e\xa5\xad\xd7\xc1\xb9\xf3\x1f\xca\x23\x7f\xe2\x5b\x68\x14\xc7\x85\x1e\xf0\x99\x5b\x39\xb8\xd2\x18\x53\x0f\x07\x6b\x6c\xc3\x15\x07\x03\x7e\xd6\x26\xcc\x5d\x3d\xe7\x7a\x73\x11\xbd\xde\xe0\xbe\x47\x31\x2b\x15\xe5\x39\x39\xc7\x3a\xc3\x8d\x62\x39\x7b\xa2\xbd\x1a\x0e\xeb\x81\x36\xbc\xd5\xfb\x6d\x4a\x35\x99\x42\xbc\x56\x27\x31\xba\xba\x12\x5f\xa7\x9b\x67\x72\xcb\x84\x2b\x6c\xd6\x37\x05\xcd\x13\xcc\x12\x2c\x51\x97\xe8\xbc\x9b\x17\xda\x97\xbd\xa9\x93\x78\x29\xe8\x40\x36\x2c\xea\x16\xbb\x9a\x58\x47\xfa\x4a\x65\x61\xe1\xb9\x59\x0a\x13\xcb\xe1\xf4\x05\x1a\x77\xba\xbf\xc7\x1a\x9a\x39\x11\xd7\xa0\xd6\xb5\xef\x94\x47\xfb\x49\x96\xf7\x28\x5e\x3e\xe1\x4b\x76\x52\xf4\x0d\xc0\x74\x02\xd3\xf3\x03\x0d\x66\x51\x71\x7c\x91\xbe\x85\x90\x47\xe5\x25\x84\xb4\xb3\xb8\x40\x05\x7a\x3e\xe1\xcb\xb3\x6a\xdb\xce\x6e\x96\xa2\xa3\xb7\x87\x5d\x3b\x16\x3b\x97\x2d\x6a\xea\x74\xcc\x2c\xd4\x32\x39\xd4\x7d\x10\x72\x77\xe3\x48\x3b\x6e\x90\x02\x15\x25\x61\xc1\x48\x48\xac\x11\xb5\x6e\x16\x5a\x89\x70\xbf\x1d\x67\xaf\xfa\xb4\x24\xe4\x00\xba\x7b\xe4\x98\xf7\x23\x60\x54\x60\xf6\x6a\x9a\xa5\x98\x6b\x9e\x7a\xeb\x1f\x6d\xb1\xff\x22\x27\x25\xf8\x4b\xb1\xb8\x91\x06\x62\x1d\xa1\x3e\xba\x67\x28\xe1\x62\x70\xbd\xaa\x76\xae\x40\xf2\x0e\xbd\xee\x05\xc1\x9a\x4e\x3f\x56\xbd\xf8\xbd\xf6\x74\x05\x19\x9b\xec\x9e\xc1\xb9\x57\x40\x91\x40\x53\x33\x96\x90\xe7\x08\xd5\x78\xd6\x14\xbd\x8c\xb5\x67\xbf\xbe\x51\xd5\x58\x3c\xdf\x4c\x6c\x90\x54\xad\x4b\x0d\xe6\x50\x1a\xf7\x51\x64\xfd\xf9\xf6\x49\xcb\xec\x8e\x6b\x13\xad\x33\x8a\xe3\x8e\xe7\x5f\xd9\x12\xac\xac\xd5\x6b\xb3\x4e\x77\xc3\x66\xb7\x1b\xdd\x0e\x2a\x74\xc3\xec\x81\x6e\xa7\xad\xf8\x20\xbc\xd8\xca\x4a\x54\x2c\x17\x8b\x2c\x2f\x41\xb7\xc6\x6e\x6a\xdf\x1e\x22\xa9\x55\xe9\x1a\x8e\x20\xab\x09\xb3\xf5\x4b\x85\x9b\x2c\xc6\x66\x2a\x5b\x89\xc2\xbc\xc7\x7a\xa0\xa9\x5a\x0b\x7a\xcd\xa1\xae\xbd\x9b\x56\x7a\xbb\x71\xf5\xb8\x0a\x83\x8e\x93\xf6\x8a\x57\xda\xd7\x67\xc1\xce\x37\xf7\x2a\xdd\x7b\x95\xee\x7f\x85\x4a\x97\x3f\xac\xb8\xd5\x73\xec\x83\x28\xcf\x52\xf4\xbf\xcb\x79\x74\x4e\x0a\xf4\x7d\x44\x3f\xff\xf6\x89\x7d\x0e\xe6\xd8\xab\xee\x1d\x0e\xd1\x51\x4a\x4a\x12\x25\xe4\x57\x8c\xfe\xce\x7a\x41\x09\x35\x42\x05\x58\x62\x09\x83\x1b\x18\x28\x5d\xaa\x86\x93\xf3\x01\x68\x75\x45\x31\x11\x45\x84\x07\xa0\x3a\x8a\x43\xb4\xd9\x74\xf3\xc6\xac\x3d\xe8\xf0\x6d\xb7\xba\x5e\x33\x13\xaf\x3b\x5d\xf5\x0a\x4d\xc4\xba\x9a\x08\x84\x42\x4b\xca\xa0\xc7\xe3\x84\x97\xbd\x4e\x09\x34\x55\xcf\x44\x54\x23\xb2\x84\xef\x5d\xaf\x1b\x22\x6d\x04\xb4\x3d\xa7\xf7\xc3\x35\x8e\x9e\x0a\x57\xbc\xac\xad\x80\x37\x66\x38\x4d\x65\x59\xfd\x2a\xd5\xb2\x68\xd2\x31\xe6\x91\x66\xbb\xeb\x5d\x2d\xea\x54\x14\x9f\xd3\x33\xaa\x98\x1d\x74\xf4\x1c\x72\x44\xef\xe4\xa4\x6d\x6c\x54\xf9\x19\xf2\xbf\xfe\x61\x6f\x85\x9c\x6a\x54\xb6\x78\x1e\xc4\x47\x2a\xd3\xc5\xbb\x20\xf6\x3f\x3d\x30\x89\x17\x42\xed\x0d\x2f\x04\x0e\xe4\xe1\x51\x18\x10\xf9\x4d\x75\xa4\xb2\xae\x29\xf2\x99\xe7\x65\xb6\xd5\x80\xdf\x3c\x43\xa0\xc1\x6a\xcf\x8a\x09\xcc\x12\xad\xcb\x50\xe6\xd3\x47\xd3\x39\x73\xa0\xa7\xb2\xed\x01\x3e\xc7\xf9\x65\x4f\x78\x43\x7e\x4f\xd2\x69\x82\x5f\x33\x84\xf7\x51\x88\xbc\x19\xaa\x26\x3e\xad\xb2\x23\x7e\x70\x3e\x81\xf2\xa0\x25\x85\x77\x41\x37\x9a\x05\x91\x48\x63\x14\x69\xd8\x16\xf1\x0c\x31\x3f\xfb\xfb\xfb\x8c\x6a\x74\x20\xee\x76\x41\xc0\xd2\x33\x37\x05\x63\xd7\xba\x5d\x5f\x75\x5c\x86\xb5\x7c\x4a\x0e\x87\x2c\x34\x9f\x4c\xe2\x5e\xd9\x75\xe6\x22\xd6\x63\x2b\x7f\xf2\x8c\x11\x8d\xe0\x3d\x5a\x03\x3b\x7a\x46\x81\xaa\x5d\x7c\xf3\x8e\x5b\xfc\x85\xd5\x55\x30\xa6\xca\xab\x12\x02\x4e\xdc\x07\xe5\x11\x5f\x14\x3d\xc1\x7b\xfa\x68\x42\x70\x12\x5b\xa6\x07\xbc\x15\xa3\xa7\x16\xcf\xd1\x3b\x68\x31\x1e\xd6\x35\x8b\x0c\x45\xb2\x15\xf5\x41\x90\x85\xeb\x08\xcb\x61\x6f\x02\x76\x20\x58\x9b\xf8\xe6\x2c\xce\xd4\xc3\x3b\xb2\x22\xaf\x8f\xcb\x89\x54\x0c\x7c\x7c\x2f\x06\xde\x8b\x81\x7f\x6d\x31\x50\xbd\xcf\x63\x8b\xe6\xae\x5e\xe8\xdd\xcd\xdd\x3d\x05\x79\x2d\xd4\x8d\x95\xc6\xca\x70\x4e\xe4\x91\x5a\x84\x15\x32\xfd\xd4\x4e\x91\xdc\xe5\x9a\xc8\xa5\x9f\xc6\xc5\x3d\xf0\x3c\x95\xaf\x24\x83\x4d\x0d\x0c\x7c\xf2\xeb\x41\x09\x95\x21\xb4\x9e\xa1\x95\x60\x9e\x9e\x7d\x45\xac\x1c\x43\xe9\x0a\x1a\x83\xd7\x51\x1a\x4d\xb1\x7a\x9d\x4f\x59\x16\x43\x85\xa1\x0a\x10\x2e\x3c\x14\xb8\xb6\xdf\xcf\x0d\x0c\x39\x15\xe7\xf3\x06\xfb\xf7\x18\x53\x0e\x43\x52\xd3\xbf\xa7\x25\xfe\x8d\xa2\x82\xf9\x5c\xa8\x8a\x44\x31\xc5\xe0\xa5\xd2\xb3\x49\x99\x9e\xe6\x6d\xc7\xa2\xa2\x4d\xb3\x3d\x20\x31\x07\x11\xbc\x8d\xca\x58\x13\x86\x3b\x51\x2d\x7c\x8e\x24\x0e\x69\xc7\x27\x7c\x19\x16\x54\xb0\x91\x29\x4d\x6e\x8e\x99\x33\x4e\x75\x49\xc1\x43\x73\xf0\x6d\x57\x8e\x73\x80\x5e\x53\x56\x4e\x70\xc1\x83\x48\x03\x3e\x1c\x2f\x94\x86\x67\xcf\xd6\x78\x13\x83\xba\x7a\xb3\x4c\x12\xe5\x18\x23\xa0\x52\x24\xfe\x4c\xe0\xda\xcc\x87\xbb\x3f\x66\xfc\xa1\x3b\x0b\xbb\x83\xd6\xbe\x56\xdc\x1d\x07\x93\xad\xa2\xed\xd8\x01\x4e\x64\x28\x19\xf3\x20\x86\x1a\xc2\xc7\xbc\x7b\x7b\xc8\x23\x4c\xd4\xc7\x8e\x51\x68\xe3\xae\x5e\x19\xe1\x01\xd2\xe5\x89\xd3\x46\x13\x03\x3d\xa2\x90\x2e\x96\x0c\xa2\x93\x49\x1e\x74\x68\xb5\xd4\x62\x63\xdd\xc3\x5d\x2b\x28\xc8\xf7\xb8\xd1\x53\xda\x92\x21\xa5\xd3\xc5\x00\x41\x90\xec\xba\x10\x52\xe8\xa9\xfa\xcd\xa8\x1b\x8a\x9c\x51\x76\xa0\x7d\x36\x78\xd6\x77\xb0\xce\xf8\xbd\x8c\x5e\xab\x63\xde\x45\x3c\x73\xc0\x5b\x7f\x56\x34\xdd\x11\x57\xe0\xde\x13\x23\xc5\x0c\x96\xab\xa3\xd0\xde\xac\xc0\xd9\x0c\x1c\x7b\x9e\x7a\x01\x64\x55\xde\xd8\x24\x1c\x17\xbe\x90\x45\xe2\xfd\x94\xa0\xc3\x15\x22\x17\x45\x62\xdd\xb6\x42\x42\xbb\x18\x44\xba\x3b\x56\xbe\x8f\xd8\x5e\x92\x57\x76\xbe\xcc\xe5\x09\x00\xd6\x96\x81\x0e\x08\x79\x46\x80\x21\x79\x4c\xf1\x6b\x41\x84\x3a\x03\x34\x4b\x15\xca\x8c\x3a\xb7\xca\xba\x8a\xc3\x41\x95\x70\x91\xcb\xf0\x69\x4a\x5b\xa3\x5f\x74\x74\xd1\x0c\x31\xb4\xd1\x92\x24\x31\x20\x8c\x0f\x8a\x66\x3a\xfe\x6d\x81\xe1\x7f\x38\x7e\x7e\xbc\xbe\xbe\x0e\xe2\x7d\xb7\x40\xcb\x69\x72\x39\xe0\x51\xc4\xe8\x81\x60\x59\xd0\x3d\xb1\x94\xad\xa4\x9a\x4b\x59\xfa\x5b\xd8\xd5\xc8\x1b\x12\xca\x38\x20\x43\xbe\xb7\xde\x32\x22\x3d\x8d\x7e\x39\xa5\xd9\xa7\x9b\x67\x67\x54\xec\xd2\x3f\xaf\xae\xa4\xdd\xa6\x0d\xca\x7e\x6c\x41\x19\x3a\x96\x3d\xff\x55\x91\x55\x3b\x40\x22\x8d\x0b\x3b\xe8\x95\x88\xaa\xba\x45\x95\x97\xea\xca\xe8\x94\x85\x40\x49\xfd\xcf\xb2\x90\xe3\xe7\x9b\xcb\xef\xea\x34\xbc\x8a\x1f\x68\x64\x45\xb0\xf0\x85\x2a\x30\xce\xea\xd0\x96\x29\x51\xaa\x8b\x29\x75\x3f\x63\xc4\x62\x91\xe6\x75\x1e\xd3\x3c\xbb\x61\x06\xcf\xdb\xd1\x99\x99\x34\x8a\xb4\x0c\x68\xbc\xe1\x54\xcc\xee\x1a\xd5\x54\x0f\xc1\xbe\x86\xe2\xa4\x42\xb3\xda\x7a\x7a\x16\x61\xae\x70\xda\xec\xce\x51\x70\xc8\x65\x8e\xe1\x86\xf4\xdd\xdb\x43\xe9\x81\x89\x99\xb2\x8c\xa3\x54\x0a\x9b\x24\xe5\x4a\x17\xbf\xaf\xa7\xdc\xf5\xf5\x38\x18\x0c\xae\xf5\xf8\x6e\xb6\x2f\x3d\xa5\xc9\x14\x45\x3d\x9c\xb4\xc9\xa7\x7d\xa5\xbb\xf9\x55\x88\x50\xd0\x80\xe9\x93\x5e\x9f\xb5\x2a\x44\xf3\x92\x15\x8a\x9d\xd7\xc2\x06\xa6\xed\xf5\xdf\xb7\xf7\x7a\x9f\x7b\xbd\xcf\x5f\x5b\xef\xc3\x95\x3e\xf1\xe8\x16\x37\x7f\x3e\xbd\x8f\xd4\xd6\xe8\x8a\x1f\xc6\x9c\xa4\x46\xe7\xf9\x33\x83\x8f\xd0\x61\x98\x2e\x3f\x1c\x4d\x05\x8c\xd4\x4a\xde\xab\x09\x14\xb6\xa6\xe4\xa5\xa2\xe7\xb1\xe9\xe7\x17\x5c\xe8\x0b\xb2\xa4\x2b\x4b\x0e\xea\xd1\x9a\xb5\x9d\x85\x03\x39\x6a\x97\x9e\xaf\x83\x96\xbe\x59\xed\xf2\xd5\x01\x8b\x16\xcb\x52\x3e\x5e\x4b\xf1\x05\xc7\x66\x4f\x6d\x97\x54\xe8\x08\x51\x57\xc2\x59\x71\x34\x42\xd4\x8d\x47\x1f\x7d\xb9\x42\x4c\xdc\x91\x7d\x92\x8d\x4e\x71\xbb\x46\x25\x9c\xb7\x51\x5f\xae\x68\x74\xdb\x6d\x74\xb1\x2c\x5f\xe2\xcf\xcd\xc3\x7c\x89\x3f\x57\x8d\xd1\xcc\xaa\x1f\x60\x73\x5b\x0c\xa8\x6a\x68\xfe\xb6\xac\x71\xf1\xcd\xe8\x54\xc1\x89\x89\x08\x14\x92\x03\x3e\xf4\x80\x77\x0b\x80\xcf\x2a\x76\xae\xe7\xcf\xd4\xae\xc5\x68\xa7\x13\xee\xc0\x16\xf5\xe4\x7e\x8b\xba\xdf\xa2\xfe\xda\x5b\x94\xba\x9a\xc0\xe5\xec\x46\xf7\x12\x1c\xf8\x6e\x5f\x25\x56\x44\xff\xf7\x85\xff\xf7\x5d\x82\xf8\xef\x41\x1a\xb6\x4d\x0a\x22\xcc\x91\x2d\xa0\x05\x4f\x16\x60\xe3\xaa\xf6\xc6\x59\x3a\x21\x53\x01\xa6\x85\xc2\xd1\xa1\x45\x64\x15\x01\x76\xc1\x9f\xad\x19\x17\x34\x3c\x51\xc0\xfc\xc8\x42\x81\x5b\xc8\x80\x44\x01\x72\x54\xbc\xbf\x4c\xc7\x6c\x8b\xd1\xa1\x0a\x96\x2a\xc0\x28\x2b\xce\xb1\x0d\xc4\x53\x65\x5d\xcc\x41\x91\x0e\x41\x46\x51\x2a\xb2\x99\xd7\x43\xa7\x3f\x22\x59\x0a\x21\xe0\x33\xad\xcd\x9d\x81\xd4\x79\xf3\x37\x82\xa0\x04\xdc\x3c\xeb\xa3\x07\x0f\x10\xff\x3d\x00\x9d\xe0\xf1\xa4\xd7\xdd\xfc\xdc\x65\xae\x4b\x36\xfb\xe8\x29\xea\xe0\x72\x46\x77\x0f\x08\x4c\xfa\xec\xf2\x65\x54\xcc\x3a\x28\xb4\x93\x99\x46\xb7\xa3\xa4\x04\x2d\xfe\xd3\x8f\x79\x36\x7f\xf6\x1b\xf4\xb4\xcb\xbb\xa4\x85\x15\x7a\x76\x09\x0d\xd3\x4e\x1f\xa4\xf1\x11\x2d\x27\xa3\x79\x79\x21\xd9\x38\x24\xac\x1a\xcf\x32\x1d\x27\xf8\x37\x1a\xc0\x09\x6d\xab\xa1\xeb\x3a\x4c\x65\xa7\xc5\xfc\x68\xe3\x3c\xcc\x96\x69\xab\x6b\xa6\x3b\x18\x87\xb7\x6d\x46\x42\xfa\x50\x2a\xc0\xd8\xa8\x9c\x29\xf8\x0d\xfb\x7f\x22\x1b\xd4\x26\xc3\x99\x04\x1d\xc0\xe8\xb3\xec\xde\x8b\x72\x76\xd7\x07\x84\xd6\x87\x83\x3b\x3a\x1b\x40\x00\xe0\xea\xb3\x01\x53\x7d\x30\x2e\x4e\xb0\xb7\x47\x0b\xbd\x33\x8b\x86\x7e\x2c\x6e\xd0\x05\xed\x8e\x9b\x71\x57\xe6\xff\x02\xe9\x1e\xba\x8f\x9e\x1d\xbc\xb1\x82\x91\x71\x9e\xca\xb4\x32\xec\x01\x2d\xd7\xcd\x5c\xaf\xad\xb1\xde\x0d\x98\x65\x94\x7c\x4b\xf3\xa2\x9c\x29\x6d\x50\x80\xba\x7a\xe8\xe6\x6e\xc0\x87\x39\xc5\x65\x58\xa1\xf3\x14\xbe\x4a\x07\x7a\x41\x3e\x92\x80\xeb\xe9\x8c\xc2\xe7\x51\x62\x44\x19\x1b\x58\x81\xb3\xcf\xa3\xc4\x71\x46\x22\xd3\xae\xd7\x00\x3d\x2b\x0d\x85\xfb\xf9\xbb\xc9\x60\x78\xd1\x9b\x0c\x87\x17\x6d\x39\xa0\x36\x67\x51\xca\x5d\xa2\x04\x2c\x37\x1b\x4f\x4e\x1c\xd0\x3d\x3d\x09\x36\xe5\xe4\xcb\x23\x94\x66\xcd\x69\x5c\xe1\x85\xe8\x54\x09\x54\xec\x7a\x8f\xbb\xd1\xfc\x51\xdd\xe6\xd9\x10\x7a\xe4\x73\xc6\x4f\x24\xb0\x16\x3a\xd2\xba\xc7\x0a\xf5\x6a\x58\x9e\xf4\x59\x23\x81\x2a\x8e\xcd\x59\x1e\x4d\xf1\x41\xd9\xe6\xe4\xcc\x41\x2b\x71\xe4\x83\x90\x87\xda\x1a\x2c\xb1\x75\xc7\x38\x76\x99\xc1\xc9\x72\x15\xb4\x78\x07\xc6\x9d\x3b\x36\x8c\x89\x42\x55\x0e\xc7\xca\xfc\xed\xe7\xdb\x3b\x30\xb1\xea\x9b\xe8\x99\xb1\x23\x6b\x68\x52\x64\xbc\xdd\xb0\x7c\xbd\x0d\x9c\x25\xae\xec\x5f\xe9\xe2\x45\xd7\xab\xd1\x2f\x6d\xa2\x9e\x76\x61\xff\x6d\xc6\x04\x80\x39\x98\x90\x12\xdd\xd7\xc0\x84\x46\xca\xb7\x18\x74\xb0\x56\x41\xd9\xf3\x05\x49\xd8\xe1\xad\x91\xbc\x39\x68\x0d\x8d\xbb\x10\x02\x0f\x9b\xd5\xf4\x67\xcb\x6b\x2d\xe9\xd1\x2e\xe6\x74\xab\x4e\x64\x75\x3b\xb8\x75\xcb\x89\xaa\x9b\x1b\x31\x85\xcf\xf1\x98\xcc\xa3\xa4\x1a\x15\x4a\x0a\x6c\x89\x04\x55\xa0\x82\x28\xff\xb8\x03\x36\x85\xa7\x86\xc1\x56\xc7\x4a\xae\x38\x82\x81\x7c\x5d\x3b\xe8\xe6\x15\xa4\x55\x58\xcf\x3c\x3e\x78\x4e\xa8\x2b\x8d\x49\x96\x72\x06\x57\x75\xf8\xfd\x23\x71\x9a\x9b\xe0\xe9\x1d\x1e\x63\xb2\x68\x41\xe6\x6e\x99\x36\x04\xe0\x82\xde\x96\x02\x78\x8d\xad\x07\xd8\x72\x15\x37\x72\x31\xcf\xe0\x6c\xc0\x36\x14\xc0\xc4\xa2\x3b\x12\x10\x1b\x97\x37\x3d\x20\xbd\x8b\x2e\xda\x2f\x71\xb7\x80\x1f\x11\xb5\x70\x6d\x38\x1b\xc5\x83\x47\x16\x72\x43\x4b\x37\xf5\xb6\x55\x57\x6f\xde\x4f\x7b\xa6\x7c\x6b\xcc\x37\x0e\x32\x4d\x57\x18\x87\x09\x5d\x31\x8e\x4a\xa0\xaf\x3c\x8e\x16\x9d\xaf\xee\xf1\x9d\xcb\xda\x15\x84\xc3\x8d\xbb\xea\x3a\x0a\x81\xff\xbd\x1d\xb5\x72\x6e\xd2\x51\xba\x17\xdc\xd9\x89\xc0\x8c\x90\x5e\x37\x26\x0d\xd2\x3f\x34\x3f\xc0\x4d\x28\xc6\x18\xe1\xad\xb8\xd2\x98\xc9\xa7\x22\xae\x79\xd3\xb4\x31\xe8\x81\x08\x76\x5e\x31\x85\x66\x9d\xbe\xb1\x56\x76\xe4\xd5\xab\x57\x2d\xfb\x90\x54\x52\x90\xac\x69\xa5\x96\xdf\xe3\x7c\x81\x1b\xb7\x27\x89\x01\x06\x5d\x8f\x00\x07\xa6\xa6\x17\xc5\x72\x34\x27\xe5\xcf\x59\xde\x24\x25\x29\xc0\x8a\x95\xee\xcb\xaf\xbf\xfa\x6e\xd1\x2a\x87\xaa\xdc\x8a\x2b\xda\xb3\x8e\x38\xce\xf5\xb7\x52\xfc\x04\x7a\x9a\x54\x74\x18\xa9\x87\x59\x6c\x82\xc1\x12\x36\x52\x40\xf6\xb7\x0a\xf1\x03\x98\x5b\xd2\x16\x1f\x5c\x08\x75\x94\x30\xf2\xb4\x82\x55\xe9\x52\x30\xad\x02\xe0\xb2\x53\x55\xb6\xd5\xa8\x69\xd0\xab\x31\x12\x95\xe8\x8a\x01\x5a\x9e\xb9\x5f\x99\x85\x2a\x4b\x68\xcd\x9b\x2b\xda\xc9\x78\xf5\xea\x95\x0b\xcc\xa8\x5f\xab\x52\x12\xa6\x31\x68\x9a\x00\xdf\xdc\xc2\x81\xc5\x64\x93\xca\xee\x3a\x1f\xcd\x8a\x8e\x28\xe9\x4a\xad\xab\x69\x3a\x2a\x17\x2e\x49\x47\x51\xa1\x2b\x2a\x78\x07\x80\x51\xf2\x75\xcb\x61\x24\xc8\x75\x3f\x58\xa1\x8d\x39\x49\x4d\xeb\x16\xa7\x05\x0e\x71\xc3\xfa\x67\x51\x31\xcb\xa3\xb2\x76\x0c\x15\x30\xad\x76\x86\xd5\x7b\x24\x6e\x67\x6b\x3a\xe4\x07\x69\x3e\x67\xf0\xeb\x60\xf3\x70\xb1\x7a\x0f\xa7\x51\xf1\x36\x27\xe3\x5a\x9c\x55\xc0\xdc\x58\x09\xbc\x7a\x2f\x79\xd8\xa1\xa2\xae\x97\x12\xe6\x86\x6d\x8c\xb4\x2b\xb4\x9a\x66\xaa\xc1\xbe\x12\x0d\x89\x98\x0c\xff\x60\xb6\x36\x75\x7d\xb3\x41\xb5\x16\x75\x16\x62\x5c\xbb\x0c\xc6\xca\x8e\x41\xbb\xd2\x1c\x11\xe3\xc5\x42\x34\x2e\xb3\x5c\x88\x3f\xc2\xf2\x01\xcc\x88\x03\x44\x61\x0d\x5b\x62\x0e\xed\x6b\x6c\x22\x2c\x1d\x9c\xa7\xa8\x81\xf6\xdc\x8e\x41\x1d\xe6\x18\x2c\x95\xe0\xf1\xd8\xa1\x65\x4e\xaf\xc5\x29\x62\xd6\x13\xaa\x1e\x8a\x0a\x11\x6e\xde\xba\xb1\x0b\x84\x39\xc6\x00\x97\xb3\x5e\x3f\x70\x49\xf6\x55\x36\xd5\x64\xe3\x76\x5d\xf2\x0d\x54\x19\x62\xd4\xbb\xd0\x17\xd8\xef\xf1\x02\x83\x69\x92\x8d\xa2\x64\x40\x91\x3a\x88\xdc\x64\x1e\xf3\xcc\xd7\x24\x19\x47\x8b\x37\x37\x6d\x96\x16\x76\x1a\x65\x89\x75\x4d\x6a\x56\x29\xaa\x41\xfb\xe9\x83\x1e\x53\x4a\x14\xe8\xf9\xa7\xa7\xc9\x1b\xd5\x8b\x72\xa6\xec\xf9\x2c\xc3\x9c\x4e\xb8\xf5\x24\xe8\x38\x06\x42\xdc\x40\x5d\x59\xe6\x74\xc2\xed\x6f\x20\x81\xcd\x69\x27\xdc\xfe\x8e\x7d\x4a\x5a\xe8\x84\x3b\xac\x08\x19\x45\x69\x27\xdc\xd9\x09\x4c\xf3\x41\xf8\xe4\x48\xea\x84\xbb\xbb\xf0\x2d\xcc\x88\x3a\xe1\x2e\xab\x9e\x73\xf6\x4e\xb8\xcb\xba\x25\x2e\x7b\x3b\xe1\x2e\x6d\x50\x18\x01\x75\xc2\xdd\x9d\xeb\xb3\x60\xe7\xbb\x7b\x7b\xc4\x7b\x7b\xc4\xbf\xb6\x3d\x62\x95\x31\xe2\xad\x6d\xe6\xdb\x9b\x09\xb6\xb0\x01\x04\xb8\x37\xb8\xfc\x9a\x26\xf6\x90\xda\x6c\xb2\xa2\x8c\xeb\x6f\x62\xb3\xd2\xc2\xa4\x7e\x38\x1c\x2a\x9f\x34\x3e\x3f\x37\x3c\x60\x23\x65\xf1\x50\x1d\xfe\xff\xd8\x7b\xf7\xb5\xb6\x91\x65\x71\xf4\xef\xe4\x29\x7a\xe6\x77\xd6\xc4\x0e\x02\x7c\x87\x90\x30\x7b\x13\x03\x81\x95\x10\xf8\x01\x99\x99\xb5\xf9\x98\x7c\xb2\xd5\xc6\x4a\x6c\xc9\x5b\x92\xc1\x64\xc2\x7a\x9f\xf3\x1c\xe7\xc5\xce\xd7\xd5\x17\xf5\x55\x96\xb9\x64\x32\xb3\x60\xed\x9d\xb1\xa4\xee\xea\xea\xee\xea\xea\xea\xea\xba\x64\x43\xe4\x4f\x42\x09\xf7\x07\x3a\x90\x98\xc9\xe8\x35\x81\x47\xcd\x58\x7f\x5b\xe1\x0a\xe3\x44\xd7\x8d\x1b\xad\xb8\x0a\x2d\x20\xf0\xc9\xe2\x97\xb1\xa9\xbd\xc7\x99\x65\x53\x53\x37\x2f\x79\x77\xb9\x39\xf7\x5a\xb5\xc7\xdd\xe2\x71\xb7\xf8\x7b\xef\x16\xdf\xa9\xf5\xfa\xfd\x19\x9a\x97\xb4\x83\xcf\x4d\x39\x8f\x70\x92\xc6\x91\x3f\x7a\xb4\xe7\x7c\x68\x7b\xce\x9b\x72\x16\x7e\x11\xbe\xca\xcd\x06\x8b\xf4\xc3\x79\x41\x53\x45\x3c\x61\xb3\xfa\xd1\x5a\xe8\x0e\x37\x94\xe1\x98\x6c\x04\xc7\xfe\xd5\x5b\x3c\xef\xe6\x42\x2e\xfa\xcc\x7b\xfa\xe4\x89\x8e\x9b\x51\xa0\xc0\x33\xad\xfc\x4d\x9c\xd9\x8e\xf8\x20\x19\xee\x3d\x79\x52\xf2\x6e\xba\xf4\x15\x1c\xee\x1f\xe3\x7e\x7c\x49\x83\x43\x15\xdd\x59\xf1\x72\x56\x5c\xd5\xaf\x05\x03\x32\x8d\x46\x71\xff\x73\x39\x4a\x51\xca\x16\x10\x8b\xab\x5c\x19\x83\xc7\x72\xe3\xe6\x1c\xbd\x7b\xbe\xf9\xce\xe7\x7e\xee\xf5\xf7\x22\xd7\x9c\xb6\x6b\x63\x67\x97\xca\xcf\x4f\xb9\xd9\x29\x9e\x9b\x45\xee\x32\xf5\xb9\xd1\x90\xb7\x49\xd6\xac\x61\xa9\x11\x69\xf1\xe6\x6f\x15\x0a\x92\x6e\x4f\x38\x55\xbb\x6e\x3b\x9c\x97\x22\x12\x38\x59\xde\x7d\xb8\xf3\xc1\xd6\x1c\xb5\x70\x3e\x1d\x72\x61\x87\x58\x6e\xca\xe5\x7c\xbb\xcd\x85\x73\x8b\x8a\x48\xd3\x0a\xe9\x72\x7a\xfd\x51\x4e\x7f\x94\xd3\xff\xde\x72\x3a\x13\xd2\xd3\xa1\x43\xab\x33\x47\xfc\xc6\x09\x9e\x8e\x09\xe8\x9f\xe7\x28\x81\xfa\x71\x82\x57\xc2\x58\x95\xd3\xd7\x4a\x07\x4e\x28\xe9\x68\x39\xcf\x5f\x13\x0a\x9d\x0c\x87\x0f\xae\x1d\xfa\x7e\xe4\x71\xc2\x1d\x4f\x86\xca\xed\x06\xbe\x62\x41\xa7\x77\xbf\xc5\x85\x4e\x3a\x9c\x7f\xa1\x93\x0e\xe1\x42\x87\x0a\x2e\x8b\xdc\xdb\x14\xc9\xf9\xee\xcd\xc9\x10\x0f\xa4\xad\xe9\xd2\x7a\x53\xc7\x44\x84\x74\x38\xfc\x68\x2f\xa0\x1a\x85\x20\x8b\x2e\xab\xa8\xd1\x30\x1a\xc4\xee\x16\x2d\x5f\xef\xd6\x5c\x8a\xb3\x03\x7f\xc6\x88\xe0\x24\xfc\xa2\x5f\x0e\x4b\x6d\xcf\x2b\xaa\x5a\xfd\xdc\x06\x91\x30\x3a\x8a\x7f\x2d\x46\xc0\x56\xe4\x6e\x0d\x8f\xfd\xe4\xf3\x69\x32\x4d\x33\x1c\x1c\x61\xe3\x32\x58\x6a\xbe\xb8\xe0\xdd\x90\x88\x30\x91\xe9\x8e\xfc\xb0\xa0\x7d\x67\x99\xbb\x51\x80\x1f\x04\x47\x49\x78\xe9\x67\x98\x1e\x09\x1d\xad\x17\x15\xbb\x5b\xdf\x69\xd2\xaf\xb9\xdd\x2f\x2a\x76\x37\x04\x86\x7e\x3a\xb7\x75\x67\x99\xbb\x35\x7d\x81\x33\xba\xa1\x17\x8e\x7d\x41\xa9\xbb\x37\x5f\x62\xee\x8b\x8a\xdd\x99\xee\x4f\xae\xc7\x85\x8d\xbb\x8a\xdc\x99\xea\xe7\x35\xec\x2a\x72\xd7\x21\x27\x72\x5c\x86\x29\xe8\xdd\x24\x1e\x1f\xf9\x69\x7a\x15\x27\x41\xd1\xf8\x97\xac\x73\xe7\x75\x30\x6f\x4c\x5c\x45\xee\x4c\x86\xf3\x1a\x76\x15\xb9\x0f\xd6\x33\xaf\xed\x82\x52\xf6\xe6\xc5\xc3\xea\x2a\x4a\xa7\x3d\xb8\x79\xa3\x29\x8d\xa7\x51\xfe\x3c\x0e\xd3\x34\x8c\x2e\x9e\x96\xc6\x76\x12\xa7\xfa\xd5\x95\x84\xa5\xe5\xab\x45\x4f\x81\x8a\xf5\x8e\x68\xfe\x2d\xd7\xc9\x70\x28\x25\x10\xd3\x6c\x2f\x94\x53\xb4\x66\x19\xd1\x6a\x3c\x9e\xa1\x1f\xcf\xd0\x7f\xef\x33\x74\x7e\xd7\xd5\xfb\xf2\x45\xbb\xeb\xda\x1a\xe1\x19\x7a\x8d\x13\x7c\x91\x7e\xf1\xd3\x2f\x21\x7a\xe5\x8f\xf0\xec\xbf\x93\x6c\x90\xae\x0c\xa7\xea\x71\xb8\xc3\xa2\x99\x1e\xe3\x01\x4e\x70\xd4\xc7\x1b\x88\xb4\x9f\x6e\xac\xae\x5e\x84\xd9\x70\xda\x5b\xe9\xc7\xe3\x55\x7e\xea\x5e\xbd\x88\x97\xc5\xef\xde\x28\xee\xad\xa6\x57\x7e\x32\x5e\x0d\xa3\x0c\x27\x91\x3f\x5a\x25\x5d\xc2\xb3\x8c\xff\x77\xe5\x22\xfe\x3f\xef\x9a\xcd\x07\xbe\x1a\xcb\xef\xbb\x4e\x08\x36\x7f\xf3\xc3\x35\xfc\xf8\x4b\x5c\x76\x51\xcb\x57\x9c\x5d\xc5\xc9\xe7\x63\x0c\xa1\x6a\x8b\x14\xe5\x7a\x71\x53\x5b\xde\xfb\xf2\xe5\x63\x41\xa9\xbb\xf8\xe6\x5d\x47\xfd\x9d\xc8\xef\x8d\xf0\x3c\x2c\xa5\x92\x76\x04\xed\x05\xee\x82\xdb\x95\x3f\x29\x89\x5b\x5e\xd2\x81\x9b\xb5\xc0\x1d\x70\x0b\xe2\xab\x88\x45\x21\x2e\x42\x8c\x17\xb3\x63\x65\xf9\x5a\xde\xdd\xd4\x81\xd8\x74\x52\x02\x2d\x5a\xc8\x8e\x94\xf1\xed\xce\x28\x25\x38\x4b\x42\x7c\x39\x2f\x02\x04\x2f\x66\x47\xcb\xf2\xf5\x2e\xa4\x95\x91\xdd\x6e\x0e\x51\x91\x32\x0e\x72\xd2\x3e\xdd\x79\x88\x2e\x70\x09\x77\x66\x3b\x2e\xea\x87\x3b\x8c\x09\xcd\xde\x30\x27\x46\xaa\x1d\x07\xf5\xc3\x9d\x47\x83\x25\x6c\x29\x46\x86\x16\xb2\xe3\x63\x7c\xe3\x28\xb5\x4a\xa1\x54\x70\xab\x6b\xa8\x38\x75\xb6\x2c\xdd\xfe\xe5\xfc\x50\x7a\x99\x33\xa2\xfc\x25\xe7\x03\xd2\x8d\xe3\x44\x7d\xe6\xd4\x2f\x01\x22\x24\x98\x3f\x5e\x60\xe9\x62\x72\x32\x95\x1e\x24\x59\xfc\x41\xaf\x19\x87\xe1\xa5\xd3\x37\x86\xcc\x09\x7c\x77\x9e\x21\x8b\x61\x5b\x94\xb2\x0a\x6c\xf8\xee\x38\x5e\x59\xce\x57\x44\x58\xb2\x05\xbb\xb5\xde\x4b\x36\x1f\xcf\x54\x8f\x67\xaa\xbf\xf7\x99\x8a\x1d\xa8\xf8\x05\xd1\xb7\x8d\xd2\x7e\x1b\xc3\x6a\xee\x1d\xe5\x4f\x42\x2e\x8c\xd3\x14\x7f\xd9\xb0\xc8\x02\x8d\x5e\x97\x15\x46\xa5\xe4\xa5\xb3\xeb\x09\x91\x0f\x58\x04\xca\x97\x4f\x25\x06\x1e\x66\xfd\x61\x85\x7c\xd7\x73\x8b\xf4\xfd\x14\xa3\x67\x84\xe2\xd3\xec\xd9\x86\xf2\x09\x26\x2b\xb9\x48\x57\xd2\x61\x38\xc8\x2a\x5a\x42\x11\x64\x24\x07\xac\x99\x05\x18\x4b\x06\xf7\xb5\x08\x5f\xd1\x08\x54\xf4\x42\xf6\xa5\x05\x8d\x09\x8e\x82\x30\xba\x78\x70\x3c\x8e\x68\x3b\xb2\x0d\x91\x0d\x29\x16\x3a\xd0\xc4\x46\x03\x67\x54\xa6\x09\x56\x6e\x24\xe9\x40\x94\x9a\x6f\x49\xc8\xa0\xe9\x32\x82\x42\x0a\x16\xd9\xc9\x22\x55\x47\x61\x94\x66\xfe\x68\x54\xaa\x65\xad\xb4\xdd\xd7\xdd\x5d\xa8\x00\x8f\x0b\x9c\xbd\x8b\x2f\x4a\x04\x14\x23\xa5\x9c\x3e\xf6\xb4\x45\xad\x48\x41\xab\x93\x78\x6e\x1c\x0e\x52\x64\x4e\x7b\xdd\xa1\x1f\x5d\xe0\x12\x4d\xda\x84\x0f\x0a\x42\x36\xc9\x52\x46\x4f\x11\x84\x48\xc7\xa4\x46\xe2\xd1\x48\x96\x07\x16\xe6\x37\xe9\x70\xb8\x02\xac\xd1\x60\x37\xe9\xd0\x64\x37\x6e\xf1\x69\xce\x2d\x8d\x41\x06\xc8\xb8\xa5\x51\x2c\x09\xee\x55\x4d\xef\x26\x46\x64\xd3\xd4\x3f\x1c\x22\x26\xe9\x22\xe3\x9a\x82\x36\xcb\x70\xd0\x8b\xde\xad\x79\x8d\x8c\xef\xa1\x6d\x99\xf4\x0c\x49\x94\xe2\x80\xb3\xe1\x06\xf9\x87\x02\x4b\x87\xc3\x0d\xf2\x0f\x15\x5e\x6d\x09\x19\x5a\xad\x47\x91\xf4\x51\x24\xfd\x9b\x8b\xa4\xb9\x9e\x9f\xfb\x58\xdf\x53\xb6\x68\xea\x1f\x7e\x8c\x2f\xc8\x3c\xfb\xc9\x56\x2f\x74\xe4\x25\x48\x57\xdf\xa8\x45\x21\xd1\x3f\x57\xcf\x87\x7d\x7f\x22\x03\x71\xc1\xd8\xef\x6e\x1d\x99\x10\x24\x4c\x98\x23\x3a\xb3\x5e\x46\x9b\xe8\x59\x6d\xd6\xef\x04\x2f\x82\x46\x3f\x68\xb5\x5e\xf8\x6b\xed\x56\xbf\xf5\xa2\xd5\xe8\xb4\x70\x7d\xbd\xf6\xa2\xdf\xae\xe1\x66\x2b\xe8\xb4\xda\x9d\x46\xef\x59\x8e\x8b\x0d\x8c\x5f\xf7\xeb\xf5\x7a\xaf\x5f\x5b\x6b\xf5\x5f\xf4\x07\xfe\xda\x7a\x7d\x50\xeb\x37\xd7\x71\xa7\xd9\x0b\xda\xf5\xfe\x8b\x7a\x6f\xdd\x1f\xd4\x6a\xcf\xdc\xbc\x89\xe2\xb8\x21\x49\xba\x7e\x2f\xdc\xb0\x0c\x62\xce\x09\x99\x1b\xfc\x86\xb5\x7f\x74\xa7\xa7\x85\x09\xda\x06\x64\x7d\x5c\x2d\x70\xcd\xee\x52\xa8\x0a\xc7\x2c\x9e\xc5\x1f\x37\xea\xde\x8f\x73\xe6\xe9\xc7\x8d\x06\x61\xb6\xed\x47\x66\xfb\xc8\x6c\xff\xde\xcc\x36\xe7\xb5\x5c\xf9\xa5\x31\xdb\x22\xc3\xe4\x41\x12\x7f\xc1\x63\x3f\x5a\x09\xf0\xcf\xdf\x2a\x9d\xbf\x7e\x41\x7a\x97\x74\xfd\x54\x91\x28\x7d\xa7\x2f\x94\x8c\x04\x5a\x89\x54\x2f\x71\x9b\xdc\xfb\x8b\x67\xf8\x2f\xc8\xd6\xcf\xc7\xe2\xe1\xf3\xf5\x97\xcd\xf1\x7d\xe7\x14\xdf\x96\x2e\x15\x24\xf9\xb6\x85\x6e\xd1\x46\xf8\xbf\x6c\x6f\x69\x5d\x48\xb7\xfd\x9d\xa4\xd7\x76\xf6\xfb\x9e\x12\x6c\xff\xb0\x49\x09\x47\x7b\x45\x36\x94\x41\x18\xe1\xe0\x2e\x19\xb8\x79\xe6\xd8\x2c\x46\x2c\x6d\x75\x9e\xce\x1a\xd2\x71\x8b\xc3\xb6\x48\xc8\xba\x82\x0e\xc8\xc6\x16\xe2\x94\x51\x12\x0c\x93\x36\x96\x5a\x0e\xec\xb9\xd9\xf4\xf9\xb8\xee\xb2\x91\xfa\xfa\x7e\x3a\x1a\xdd\x48\xc6\xee\xe1\x00\xe1\x59\x98\x42\x71\xeb\x90\x6b\x2d\x16\xe6\x94\xe7\x19\x6c\x78\x6b\x34\x87\x8d\x9c\x77\x7f\x19\xd5\xcf\xab\x8e\x34\xf3\x2b\x93\x78\x52\xa9\x42\xde\x6a\x76\xef\x45\xf8\x3f\xac\x27\x18\xad\x1f\x64\xe1\x46\x1d\x6e\x6a\xdf\x90\x63\x96\xc5\x76\x52\x54\xed\x20\x5c\xc4\xc8\x5e\xf1\x5e\x38\xa9\xb1\x7c\xfa\x6e\xa8\x23\x44\x49\xc4\x13\x94\xe4\xe9\xbc\xdf\xe0\xac\x22\x9d\xce\x71\x34\x1d\xe3\xc4\xef\x8d\xf0\x06\xca\x92\x29\x36\x55\x7f\xfe\x18\xa7\x85\xa9\xba\xa5\x7c\xde\x50\x18\x94\xb7\x48\xca\xe1\x9d\xce\x49\xe2\x9d\x6a\x59\xbc\x53\x47\x1a\x6f\xbd\xc8\x4b\x45\x23\x26\x9a\xaf\xf3\xec\xfd\xb4\x13\xf6\xec\x2e\x71\xef\x93\x07\xe5\x3d\x3a\x64\xac\x2f\x04\xbe\x9f\x5e\x47\xfd\x37\xb0\xdf\x10\x91\x17\xba\x50\x3d\x57\x72\xa2\x6f\xb1\x22\x15\xc9\x4d\x43\xab\xa6\x4c\x12\x80\x50\x59\x06\xdc\x2e\xa3\x25\xc0\x61\xa5\x3f\xf4\x93\xad\xac\x52\xab\xae\x64\xf1\x87\xc9\x04\x27\x5d\x3f\xc5\x95\x2a\xff\x0c\x59\x95\x2b\xf5\xaa\x73\xe3\xe1\x33\xeb\xce\x3c\x9a\x6f\xdc\x79\x1a\x55\x1e\x11\x8d\xd7\xb8\x20\x1d\x32\x57\x8c\x10\x50\x94\x04\xdb\xe2\xad\x2d\xc5\xb6\xaa\xe8\xe1\x99\xed\x45\x15\xba\xdd\x4b\x1a\x9b\x3c\x15\x77\x51\x07\xf9\xa8\x2f\xd6\xcb\xfc\xae\xdf\x1d\x04\x0c\xe5\x66\x4e\xd6\x0e\xd1\xb4\xe7\x0b\xf6\xaa\x64\x7a\x74\x35\x25\xba\x7d\xb0\xcd\xa4\xe8\x37\x6a\xf6\xf2\x0b\x9c\x2d\x98\xbc\xfc\x02\xbb\xb6\x93\xef\x3b\x77\xb9\x85\x38\xca\x67\x2f\xd7\xcd\xe6\x36\x64\x79\xd4\x54\x92\x9f\x9d\xab\xea\x75\x32\x4d\xac\x8a\xb6\x59\x95\x4c\x84\x2e\x4f\xd9\x43\xa5\x43\xe7\x03\x24\x1d\xcc\xb5\x98\x3d\xe4\x88\xdd\x79\x3c\x62\x3f\x1e\xb1\xff\xde\x47\x6c\x49\x9f\xc9\x38\xc4\x98\xb1\x74\xf5\xa4\xfd\x4f\x3c\x18\x24\xf8\x1a\xfd\x1a\x8e\xfa\x9f\x31\x7a\xf5\x09\x0f\x06\xae\x68\x3d\x0b\x85\xf6\x39\xf0\x13\x72\x84\x3f\xf4\xa3\x3e\xf6\xa1\xac\x2d\xa8\xcf\x2d\xe2\x00\xb1\x2a\x6f\xfc\x4b\xf4\x6b\x1c\x07\xe8\xd5\x85\xf3\x90\xdf\xca\x0f\xf9\xff\x64\xdc\x54\x71\x1e\x66\x2c\xb6\x28\xa5\xad\x25\x50\x9d\x9e\x85\xd6\x96\x82\x16\x27\x49\xac\x05\x0f\x5a\xa5\xef\xa8\x0d\x02\xdd\x76\xf6\xb3\x67\x29\xd9\x18\x27\x71\x94\x86\xbd\x11\x25\xb0\x89\x0f\x4e\x24\x68\xcc\xee\x7c\xc8\x5e\x34\x49\xe2\xcb\x30\xc0\x49\x2a\x6a\xf9\xa3\x34\x36\xab\xc6\xa3\x11\xa9\x4a\xa8\x8d\x5b\x8f\xa3\x28\x0e\xe8\xd7\x30\xea\xc7\x63\x19\x32\x01\xc6\x72\x0a\xd0\x2b\xd7\x2c\x1c\x63\xb2\xd8\xc2\x14\xd5\x51\x8a\xfb\x71\x14\xc0\xee\x18\x46\x17\x23\x9c\xc5\x11\x0c\x27\xe9\x5e\xc1\x41\x9f\xa3\xaa\x1c\xf7\xf9\x4b\xb4\x29\xba\x22\xe9\x19\x48\xdb\xa0\x01\xbe\x91\x5e\x72\x5c\x64\xad\x83\xf3\xf0\x47\x24\x94\x61\x12\x47\xf1\x34\x1d\x5d\x43\x18\x0c\xc7\x3e\x4c\x3e\x59\xce\x23\x28\xf0\x33\xdf\x79\x42\x56\x7b\xab\xa8\x3c\xa2\x40\xe9\x3c\x01\x23\x9f\xd4\x7e\x50\x7a\xaf\x24\x37\x8c\xa3\x34\x26\x5b\x17\x21\x8a\x0a\x25\x8d\x95\xfd\xe8\xd2\x1f\x85\xc1\x11\x2b\x5f\x91\x65\x1e\xee\x85\x0d\x83\x21\x49\xf8\xea\x1e\xcf\xc8\x7c\x25\x8b\x8f\xe8\x3b\x40\x69\x85\xf6\xde\x83\x6e\x32\x63\x0b\xe9\xfc\xc2\x4e\xe5\x9b\xea\x5c\x51\x61\x96\x81\xe6\x57\xe5\xd0\x29\xde\x48\x98\xfe\x42\xd0\x3d\xa6\x54\x88\x85\xa0\x26\x75\x33\x1b\x26\xf1\x15\x52\xbb\xa7\x97\x57\xba\xc3\xba\x49\x3f\xad\x94\x3a\xf9\xfb\x0b\xcd\x3e\x48\xb3\x85\x24\xa0\x9f\x4b\x85\xf4\x33\x9f\x18\x00\xb8\x41\x11\x52\xf0\xdc\x52\xb4\xc1\x53\x67\x4a\xb2\x71\x11\x75\xdc\x0f\x21\x98\x73\x4f\xe5\x7e\x06\xb2\x84\x3c\x4f\x3a\x85\x93\x44\x17\xf1\x2d\xbd\xa9\xea\xe6\x36\xe4\x4f\x81\xb3\x08\x8d\xcd\x1f\x32\xa3\xb6\xdc\xbe\x21\xe4\xb2\x6c\xaf\x0a\x09\xea\xc1\x39\xdd\xc7\x06\x1b\x35\x16\x9d\x0c\x48\x81\xd7\xe4\xbb\x45\xc9\x44\xeb\xdd\x07\x61\x42\x0b\xdf\x19\x61\x02\x4e\x32\x75\x72\x26\x73\x3b\x52\x4c\xef\x81\x16\x55\x1a\xe4\x7a\x36\x98\x8d\x0a\x6f\xe5\x4e\xa4\x97\xce\xa3\x3d\xa5\x43\x82\xe8\xd0\x9c\xed\x0f\x67\x62\x5f\x25\xd2\x26\x3f\x13\x32\x91\xcf\xa0\xb8\x8c\x4f\x95\x5d\x35\x57\x48\x4b\xa2\xae\xba\xeb\x3b\xb7\xfb\x79\x3b\x77\x46\x8e\x54\x4c\x70\xd1\x11\x25\xdf\x8e\xc4\xa7\xb9\x1c\x9b\xc6\xfe\xbf\x01\x68\xfb\xc1\xdc\x25\x63\xf9\x2a\xcc\x92\x38\x26\x59\x1c\xc4\xa8\x3f\xc2\x7e\x34\x9d\xa0\x08\xe0\x93\x01\x16\xc7\xf6\xa2\xa1\x92\xb0\xb7\xac\x3c\x8a\xa4\x1c\x10\x45\x34\xae\x8e\x25\x11\x8e\xce\x68\xe9\x73\x22\x24\x91\xea\x1b\x88\x02\x09\x83\x0d\x03\xd0\x86\x0d\xe4\x46\xfe\xf3\x86\xe7\xc4\x5e\x5d\xd5\x47\x5f\x61\x00\x4c\x00\x53\x77\x73\x86\x50\x45\xac\xf0\x39\x93\x1b\x4f\x84\x50\x4a\x44\x50\x66\x46\x0b\xa7\x9b\x8b\x90\x1c\xe9\x42\x5d\x77\x4c\xea\x58\xe6\xdc\x98\xdb\xc2\x91\x17\x20\x54\x22\x85\xba\xbc\x43\xd4\xb2\xcc\x32\xc8\x2f\xa5\xe1\xc9\xf1\x67\xa3\x53\x61\x1a\xd5\xcf\xf8\x3a\xad\xe4\x75\xab\x5c\xcb\x0b\xc9\xe2\xd1\x4f\x3f\x21\xd7\x18\x12\x62\x4a\x4e\xe9\xfb\x8a\x52\xe8\xa5\x3a\xce\xba\x00\x5c\x30\xde\xf9\xee\x93\x60\xc2\x0b\x88\xfc\xcf\x87\x7d\x8c\xfb\x43\x3f\x0a\xd3\x31\x3f\x86\x16\x33\x07\x00\x50\x3c\xbc\xb4\x0d\x79\x60\x3f\x63\x3c\x11\xf9\x03\x78\x67\x57\x9f\x7f\x4a\x87\x61\x44\x1a\x9a\xf5\xe3\xf1\x64\x84\x67\x61\x76\xbd\xd1\x86\x23\x19\x29\x40\x08\xa2\x42\x36\x87\xcf\xf8\x9a\x6a\x0a\xc4\x68\x4a\xe3\xb5\xba\x8a\x12\x3c\x8e\x2f\x31\xf2\x47\x23\xe8\x55\xea\x21\x3c\xeb\xe3\x49\x06\x62\x3f\x7b\x25\x97\xcf\x86\xf8\x1a\x45\x98\x8e\x48\x0f\xb3\xfa\x01\xe9\xf1\xd4\x1f\x8d\xae\x51\xef\x1a\x86\x8c\x0c\x0f\x4b\x05\x00\x34\xf3\x2b\xd9\x90\xc2\xe8\xa2\x52\x95\xf6\x81\xca\x0f\x4a\xef\xd0\xd7\xaf\x04\xdf\x95\x30\x0a\xf0\xec\x70\x50\x01\x37\x45\x42\x6c\x1f\x9f\x55\x61\xf2\x97\xeb\xfa\x06\x21\x51\xd8\x67\x7c\x7d\xbe\x22\x56\xa2\x6e\x0e\x6d\x52\x24\x29\x6f\x98\x26\xff\x85\xc9\x13\x4e\x99\x64\xde\xfb\xd4\x36\x17\xc5\x51\x19\x9e\x40\x4d\x6a\x8b\x68\x92\x59\x0c\x9b\x2a\x50\x07\x15\xa2\x0e\x01\x67\xe9\x4c\x8a\x33\xa5\xf7\x04\xb0\xa4\x8a\xf4\x50\x7f\x65\xe7\x74\xef\xe3\xd1\xe1\xbb\x77\xfb\xef\xdf\x7c\x3c\xdd\x3f\xd8\x39\xfc\x70\x2a\x1f\x8f\xca\xcc\x80\x29\x54\x29\x12\xd3\x83\x1c\x1d\x4d\x99\x8c\xe0\xb5\xed\x67\x3e\xda\x44\x67\xe7\x2f\xd5\xf7\xfb\xe0\x6e\xcc\x5f\x97\x5b\xaa\x02\xe0\xca\x64\x9a\x0e\x2b\x3a\xdd\x33\x11\x4f\x29\xbd\x1f\xa4\xb4\xf0\x67\x7c\x5d\x35\xc6\x20\x07\xb8\xc0\xe0\x95\x12\x37\x05\x64\xd6\x28\x5f\x52\x63\x7f\xa2\x30\xc9\x10\xc8\x16\x18\x0a\x90\x18\x21\x4d\x75\x98\x0e\xfc\x89\xa4\xba\x90\xf4\xda\xaa\xa7\x38\x15\x5c\x81\x6b\x54\xff\xd0\xc7\xe0\xc0\x9f\x9c\x41\xb5\x10\xb6\x78\x3e\x32\x67\x50\xfc\x5c\xf2\x48\x17\x8d\x2b\x7e\xf3\x68\x61\x99\x39\x56\xa5\x66\x25\xbc\xc9\xe9\xe1\xf6\xe1\x06\x27\x32\x34\x8a\x2f\xfe\x4b\x97\xaa\x63\x87\x5c\x7d\x57\x49\xba\x84\xb2\x20\xb5\x1e\x1d\xd9\xb7\x95\xb1\x3f\xa9\xb8\x8c\x15\xf8\x1f\xd8\x2f\x06\xf9\x28\x93\xb1\x67\x47\xbd\x30\x90\x1d\x6f\x04\x45\x7c\xc6\x28\x9d\x26\xa0\x27\xe6\xcc\x2a\x4c\x51\x9a\x85\x84\x1e\x28\x27\xc7\x01\xf2\x07\xe0\x20\x94\x24\xe1\xa5\x3f\xd2\xf6\x5a\x05\x26\x19\x10\x70\xfb\xa7\x4b\x23\x0c\xce\x75\x14\xf3\x2e\xad\xf4\x73\x7b\x00\xb5\x8e\xf8\xe2\x74\x98\xe1\xba\x13\xf9\xd3\x0d\xc2\x23\xa6\x67\xb6\xd4\x18\xf8\xa3\x14\xcb\xb7\x6c\xcc\xed\x69\xee\x98\x8a\x74\xfe\xac\x4d\x74\x0b\x18\x64\x5e\x60\xc6\xa5\x45\xeb\x38\xfc\xbf\x34\xc6\xf3\x07\xa8\x59\x62\x1c\xcb\x2b\x06\x90\x42\x61\x52\x2f\xa1\xa2\x3a\x4a\xda\x62\x77\x0f\x93\x8a\x8b\x5b\xcf\x80\xe4\x4b\x4e\x57\xc6\xa5\x63\x3d\xa8\x86\x7a\xe3\xa5\xa5\x5e\x32\x53\x57\x30\x85\xf4\x8f\x1b\x0d\x08\xed\xc3\x94\xe1\x3f\x6e\x34\xc1\x0d\x75\xad\xcc\x1d\x19\x8b\xb9\x89\xb3\x2c\x8c\x2e\xec\x9e\xbd\xc0\x98\x02\x29\x73\x2d\xda\x14\x3e\x6b\x2f\x8d\x12\x79\xa4\x67\x61\x1f\xe4\x0a\x5a\xc4\x1a\x65\xfd\x26\x28\xaf\x3f\x5e\xeb\x3d\x5e\xeb\xfd\xcd\xaf\xf5\x58\x44\x5f\x76\x6a\xb9\x4d\x54\xdf\x79\xe6\xb0\x8e\xdc\x17\x5a\xea\x8b\x45\x0c\x67\xf9\x92\xae\xb3\xc3\xc1\x56\x10\xa4\x30\x74\x62\x77\xf3\x23\x50\x4b\xa5\x68\x4a\xc5\x2f\xe6\xf4\xe6\x11\xe1\x2b\xcc\x20\x52\x1e\x82\xa4\x00\x74\x53\xa5\xbb\xfd\xd3\xa7\xf2\xf9\x80\x9d\xcf\x9e\xea\x4a\x22\xb2\x6d\x3e\x65\xd7\x56\x52\x39\x89\x57\xd1\x38\x3d\xdc\x95\x8e\x94\x8b\x23\xe6\x70\xa5\x70\x34\x26\x37\x91\xb1\xb7\xa8\x1a\x5d\x42\x11\xdd\xb7\x79\x4f\x53\xcb\x66\x61\xb3\xc7\xe1\x7f\xea\xbe\xa5\x6f\x4f\x2e\xdd\xa5\xb0\x10\xe4\x81\x88\x00\xe5\x9f\x7e\x02\xdc\xa9\x62\x2a\x8c\x2e\x80\x1b\x57\x15\x88\xfc\xfa\x62\x5e\x4a\x53\x0a\x51\xf6\x52\xbe\x6d\x27\x85\x34\x34\xf2\x53\x68\xe6\x24\x23\x93\xfd\xc3\xe6\xa6\x31\xd0\xfc\xcf\x78\xb1\xba\x4a\x33\xb7\x2b\x24\x05\x4b\x2d\x4b\xa6\x44\x66\x4b\xd2\x0c\xa5\x31\xb5\x73\x9c\x4c\x80\x75\xc3\xd9\xd9\x8f\xae\x33\x72\xe0\xf7\x50\x0f\x0f\x08\x03\xa0\x4b\x9c\x5f\xa1\xc2\x68\x50\x25\xa3\xf6\x17\x0e\x2a\x3f\x58\xb0\xfe\xe9\x27\x64\x1b\xf9\xaa\x51\x1f\x99\xd7\x0d\x04\x55\x8b\x7b\xb4\xb3\xb3\x31\xe5\x9b\x11\x9e\x65\xa8\x7b\xf4\x01\xf5\xaf\xfb\x23\xec\x89\x6e\xc2\xb0\x8b\xcd\x06\x7a\x02\x5d\x66\x36\x4b\x93\x24\xee\x13\x9e\x95\xd2\xd1\x31\x5a\x91\x8e\xc1\x62\x99\xd8\xe6\xc2\xd2\x11\x46\x1a\x7a\xa9\x1b\x0f\xd5\xca\xf4\xcf\x32\xac\x94\x14\x5c\xa2\x99\x64\x0c\xf6\x54\x00\xd0\xcd\xd8\x24\x5d\x6c\xc5\xb4\x83\x72\xa4\xfb\xd5\x2d\xa1\x6e\xbc\x5c\x08\xdf\x0f\xbc\x9c\x4d\xb0\xf7\xb2\x0e\x89\xea\x0c\x80\xb3\x90\x75\xc2\xed\x24\xf7\xad\x69\x39\x9d\xb9\x36\x8b\x4d\xe6\x35\xf9\x0f\xc9\xba\xa6\x7d\x22\x47\x4b\xca\xa9\x25\xca\x85\x97\x96\xa4\x72\x62\xbd\x4a\x27\x7d\xf8\xe0\x07\x81\xb0\xed\x92\xf2\x7e\x8a\xef\xfa\xf4\x48\x07\x07\x89\xc5\x72\xe3\x2d\x78\x2f\xd9\x8a\x53\x81\x4e\x8c\x84\x6c\xe9\x9b\xb7\x5b\x68\xb1\x18\x0e\xf2\x57\xaa\x56\x2a\x67\x41\xa0\x55\xd0\x90\x2f\x85\x84\x3c\x8b\x6e\x89\xd6\x20\x30\xa1\x72\xae\x48\x73\x50\x2d\x18\x6d\xab\x54\x2b\x10\x72\x1b\xb0\x11\x59\x5d\xcd\x76\x41\x64\xdf\xc7\x1c\xa5\x8f\xb2\xef\xdf\x5d\xf6\xcd\x4d\xda\x78\xc2\xde\xfb\xf2\xd1\xdd\xef\xf9\x91\x2a\xed\x86\x3d\x5f\xb8\xde\xe2\x19\x55\x57\x17\xb9\xee\x9e\x8c\xfd\x24\xdb\x61\x05\x73\xb7\x5b\xe7\xd5\x18\xa8\x95\xa0\x59\xde\x17\x4d\xe7\x2d\xbd\x16\x97\x60\x27\x59\x12\x46\x17\x37\xe0\xda\x62\x7b\x4f\xa4\xe5\x9e\x1f\xc9\x9f\x7e\xf1\x47\x53\x7c\x83\x2e\xc9\x7f\xd8\x75\x08\x81\x3c\xc0\x09\x9e\x73\x43\xea\xa9\xe6\x05\x10\xa4\x86\xe1\xa4\x8a\xc5\xd9\xd0\x03\x8c\x88\xb4\xee\xd1\x96\xcc\x2d\x0c\xd4\x6e\x74\x94\x21\xdb\x74\xcf\x8f\x2a\x59\x5c\x65\xaa\x22\xd0\xe1\x90\xcf\x5c\xe5\x53\xb1\x58\x11\x91\x7a\x90\x26\xa2\xf2\x2c\xa4\xea\x1b\x0a\x91\xf9\xe9\x3e\x33\xf5\xc7\x0c\xe2\x76\x98\x10\x59\xcc\xe6\x10\xc3\x7b\x74\x1a\x33\xcf\x5e\xb9\x3b\x50\x9d\x41\xaf\x54\xcd\xae\xf1\xf6\x84\x1c\x03\xdd\xb0\x49\xba\xe0\x22\x21\x3c\xa5\x71\x36\x94\x53\x82\x57\xaa\xd0\x08\xc3\x36\x4a\xb3\x30\x9b\x52\x81\xcb\x34\xff\x0a\xf0\x24\x4e\xc3\x4c\xc6\x92\xc1\x15\xe8\x01\x98\xfe\x28\xc4\x51\xa6\x5b\x62\x94\x6e\xd8\x30\xb1\xe0\xa9\xc6\xcd\x11\x5c\x14\x23\x73\xfc\xb8\x0a\xbe\xf0\x2a\x59\x90\xde\x60\x1a\x05\x60\x13\xd9\xc7\x49\xe6\x87\x62\xfa\x1d\xcb\x47\x4c\xec\x62\xeb\xe8\xc1\x97\x90\xc0\xeb\x16\x6b\x89\x8d\x3c\x99\x4d\x2d\xe3\x97\x24\xdb\x0a\xef\xf5\x2c\xce\x25\x5a\x02\x7a\x83\x36\x20\xd1\xe6\x68\x8a\x37\xe8\x7f\xb8\x98\xab\x25\x7b\x77\xce\x0a\x9b\xfc\x7c\x52\x20\xae\x7d\xd8\x47\x9c\x13\x22\xce\x21\x51\x65\x3c\x4d\x33\xd8\xea\xf0\x18\x47\x99\xa0\x9b\xde\x75\x86\xd3\x66\xa3\xca\x84\xf1\x1f\xaa\xda\x44\xb2\x72\xf7\x3e\x7d\xa9\x31\x7f\xbc\x3a\xa5\x54\x34\x8d\xc2\xff\x9d\x62\x14\x06\x38\xca\xc2\x41\xa8\x72\xe2\x52\x73\xcd\x47\xa7\xc4\x0c\x43\x93\x76\xae\xe9\xc3\xae\x23\xed\x41\x2f\x75\x22\xe0\x63\x5c\xf1\x7b\x61\x75\xc5\xcf\x08\x63\x5d\xe1\xe3\xcb\x41\xff\x71\x57\x22\x30\x64\x55\x3e\x8a\xd6\x20\x08\xe6\x7e\xf8\xe3\x46\x93\x88\xae\x3c\x71\xff\xcd\xb9\xd7\x2e\x95\x2a\x99\x69\x77\xdb\xa5\xf2\xb5\xbd\x94\x95\xf0\x31\x91\x2f\x06\x7e\x3f\x8b\x93\x6b\x8f\x2a\x94\xc9\xc0\x3e\x21\x6c\x9a\x88\xfa\xf1\x00\x89\xde\x6c\x6e\xa2\x1f\x69\x40\xa6\x1f\xa1\xcc\x93\xd5\x55\xd4\x8d\xc7\xe3\x38\xfa\xe7\xc9\xd3\x27\x4f\x8c\xce\xe7\xbf\x58\x03\x1c\xa7\xca\x8f\x64\x18\x12\xfc\x63\xd5\x43\xd2\x2b\x1c\xf5\x97\x7b\x7e\x8a\x3b\x2d\xed\xc3\x38\x68\xeb\x45\x2f\x27\x9f\x83\x81\xf6\xb2\x1f\x4e\x86\x38\x59\xa6\x90\xab\x2f\x9f\x3e\xb9\x79\xfa\x04\x8f\x52\x8c\xa4\xce\x50\x85\x39\xed\x0b\x1f\x86\x1f\xd1\x4f\x3f\xb1\x0f\x2b\xfe\x38\x10\x7d\xdb\x3a\xd8\x7e\xfa\xe4\x09\xfd\x50\x39\xe3\x38\x7b\x48\x45\x15\x9e\x09\x86\xf4\x03\x45\x0c\x7e\xcb\xf8\x9c\x8b\x51\x96\x11\x63\x0d\xd1\x68\x18\xa8\xd2\x4b\xe2\xab\x14\x27\xd5\xa7\x4f\x9e\x88\x11\x8b\xe3\x6c\xa5\x9b\x5c\x4f\xb2\xf8\x9f\x27\xb4\xea\x0d\x9c\x9e\xe4\xed\x47\x7c\x47\x7f\x3c\x7d\xfa\xa4\xa2\x1e\xc7\x9e\x20\xaa\x11\x39\x19\xc6\x49\xd6\x9f\x66\x29\x7d\x43\x96\x4d\x17\x6d\x22\x5e\xf7\xa5\xf4\xfa\xe3\x28\xec\x91\x4f\x2b\xa3\xb0\x27\xbd\x07\x65\x58\x17\x3a\x45\xbe\x92\x52\x2b\xd2\x3b\x05\x82\x3f\xba\x88\x01\x04\xf9\xf1\xf2\xa9\xc0\xe2\x5d\x1c\x7f\x9e\x4e\x50\xe6\xf7\x46\x58\xc2\xe4\xe4\xf5\xe1\x6f\xec\xcc\x27\xde\xed\xbf\xff\xe5\xa3\xed\xfd\xc9\x87\xd7\x1f\x0f\xf6\x7f\xfb\x58\x73\x7d\xa8\xbb\x3e\x34\x5c\x1f\x9a\xd6\xb6\x5d\xed\xc8\x1f\x8d\xb6\xe4\x8f\x46\x7b\xf2\x47\xde\xa6\x18\x9a\x6e\x3c\x9e\x90\x83\xe2\xc8\x1c\x22\xdb\x94\x6a\xb5\x82\x78\xda\x23\x52\x3f\xa9\x95\x17\x00\x16\x2b\x63\x81\x64\x4b\x85\x10\xa2\x09\xa2\x10\xbd\x42\x8d\x76\xe7\x25\x0a\x97\x96\x14\xf0\x42\x46\x44\xaf\x50\xbd\xb1\x6e\x7c\x23\x7f\xc1\x59\x78\x8e\x36\x09\x8c\x57\xa8\xfe\x52\xfd\x4e\xaf\x52\x0b\x6a\x55\x68\xb5\x2a\xfa\x1d\xd5\x66\xf5\x7a\x4f\xaf\x9f\x3f\xde\x3c\x55\x7a\xfd\xab\x3f\xfa\x8c\xde\xec\x56\x1a\xbf\xaf\x57\xd5\xde\xce\x68\x84\x44\xf5\x5d\xa8\xbd\x5c\x68\x04\xa4\x41\x4e\x7b\xf1\x4c\xfd\x08\x86\x06\xa4\xcd\x59\x88\x7e\x47\x95\x59\xde\x21\xf6\xbb\x21\xfd\x6e\x4a\xbf\x5b\x55\xad\xb3\x00\xa5\x92\xce\xd0\xcf\x3f\xff\x8c\xd6\xa1\x64\x3a\x43\x3f\xa1\xda\x6c\x30\xa0\x03\xd4\x69\x6a\x55\xc8\xea\x38\x9b\x91\x81\x4c\x67\xda\x27\xbe\x78\xce\x52\xf8\x3e\x7b\xf9\xd4\xd9\xa9\xf1\x74\x94\x85\x93\x51\xd8\x07\x2d\x81\xd9\xbd\x19\x21\xe3\xe0\x6c\x76\xfe\xd2\xf2\xad\x45\xbf\x35\xac\x1f\xd7\xe9\xc7\xd6\x79\x41\xeb\xe9\xb4\x87\x40\xbe\xf1\xd0\x38\x9c\xa1\x7e\x3c\x9a\x8e\xa3\x54\xa1\x7e\x19\x26\x91\x14\x2a\x01\xf4\xea\x39\xa1\x99\x5a\x9d\x8f\x14\x7b\xac\xd5\x6b\x35\x7d\x68\xc5\x4a\xa6\x83\x55\xc9\x60\x62\x5a\x55\xf4\x95\xfc\xa6\xe3\xed\xa8\x52\x97\xab\xd4\x3b\x52\x95\x7a\xc7\x55\xa7\x21\xd7\x59\xaf\xa2\xbc\x4e\xc3\x98\x75\xc1\x0d\x68\x9d\xac\x60\xa4\xc2\xe8\x52\x1e\x2d\xf2\x58\x7a\xc4\x66\xeb\xd2\xf8\x30\xf2\x6c\xb1\x57\x35\xfe\xa2\xa1\x0c\x69\xe1\x88\x2a\xfc\x91\xd1\x58\x99\x61\x55\x58\xa7\x52\x6f\xce\xd8\x2a\x6c\x55\xa9\x38\x67\x80\x15\x96\xcb\x2a\x16\x8d\x32\x5c\x16\x80\x1e\x18\x27\x26\x27\xfc\x61\x66\x65\x82\x8c\x01\x6c\x2e\xc0\x01\xa1\x4a\x03\xfd\x8e\x82\x33\xf2\xbf\xd9\x3a\xfa\x1d\xcd\x1a\xe7\xe7\xfa\x42\x82\xb2\x21\xfa\x7d\x13\x0a\xce\x42\xa3\x80\xc2\x24\xe1\xe7\x0d\x9c\x69\xc5\xbe\x72\x94\xe0\x3e\xed\x5c\x80\x8e\xfb\x71\xc4\x36\x98\x7c\x57\x3a\xee\x1e\xbe\x27\x7b\x44\x6d\x56\xab\x79\xa8\x36\xab\xd5\xe1\xdf\x06\xfc\xdb\x82\x7f\xd7\x3d\xa0\x05\xf2\x6f\x03\xfe\x6d\xc1\xbf\xeb\xf0\x6f\xbd\x47\xfe\x6d\x76\xf2\xcd\xec\xf9\x73\x86\xd4\x73\xb4\xb5\x73\x42\xe3\xb1\x23\x2a\x0e\x21\x22\x10\x24\x61\x36\x1c\xaf\xf0\x32\xab\x39\x2a\xa4\xf4\x26\x13\x1f\x56\xe8\x83\x24\x61\xac\xe0\x59\x46\xa3\x07\x88\x2e\x7f\x0c\xe2\x63\x9c\xe2\x6c\x03\x39\xb6\x48\x36\x08\x27\x9f\xc3\x09\xb3\xfc\x8d\x07\x28\x3a\x8e\xe1\x34\x36\xf4\x53\xd4\xc3\x38\x02\xef\x00\x76\xbf\xe5\x47\x01\x98\xf0\x05\x61\x80\xa2\x38\x63\x66\x98\x26\x29\xd0\x64\x2e\x1c\x12\x37\x17\xfd\xf8\x19\x5f\x1f\x25\x61\x9c\x1c\x53\x0b\xe0\xcd\xcd\xfc\xbd\x95\x74\xb8\x59\x98\x36\xa7\x66\x07\x54\xf1\x8d\xff\x71\x83\xc3\x4d\x7b\xf3\xf9\x5b\x0b\x7f\xfe\x8c\xaf\x7f\x8d\x13\x30\x62\xfc\x8c\xaf\x57\xae\xc8\x6f\x7b\xb1\x93\xf0\x0b\x66\xa5\xd2\xf0\xe2\x35\x61\x40\x68\x15\xb5\x8a\x96\x91\xf0\x03\x48\x60\x80\x4c\xb0\x7c\xe4\x38\x8e\xf9\x33\x6f\x70\x09\x75\x4a\xb5\x40\xfa\x9f\xf6\x87\x98\x1c\x3f\x10\x11\xa1\x2d\x7d\x48\x8f\xe3\x2b\x02\xbb\xc2\x9b\x59\x22\xbb\xf4\xf3\xc2\x3e\xc8\x70\xed\xc3\xc2\x1b\x95\xc6\x59\x7a\x77\xa6\x2f\xd5\xdc\x44\x94\xa0\x43\x45\x0f\xfa\xf3\x15\xc3\x90\x3d\x5b\xa4\x10\xc4\xc8\x4e\x94\xa7\x83\x64\x2d\x47\xfe\x24\x54\xce\xa0\xce\x39\x1d\x59\x98\x71\xf6\xc6\xc2\x6a\xdc\x0c\x0b\x49\xfb\x89\x01\x1c\xa2\xe9\xe8\x43\x29\xa3\xfd\x03\x43\xfc\x1f\x02\x71\x27\xe6\x6c\x16\x8e\xe3\x0c\x11\x92\x74\x17\xca\xe4\x3d\x40\xdd\x02\x0a\x21\x9f\x4c\x7b\x65\x20\x83\xf8\xc4\x61\x9e\x4b\x7b\x1b\x7c\xc8\x77\x2a\x26\xa3\x9d\x4b\xbb\x98\x5c\x62\x5d\x29\x00\x98\x32\xc8\xec\xf5\x1c\x6c\x0f\xc2\x19\xb0\xed\x22\x6c\x7f\xdf\x04\x26\x7e\xc6\x06\x79\x35\xa7\x8e\xaf\xa8\xc6\x50\xb7\x4c\x36\xca\x27\x1c\x48\x8b\xad\xbb\x9f\x51\x87\xf0\x33\x6d\xc2\xd0\xe6\x26\x6a\xcd\x9b\xb4\xef\x6e\x68\xed\x7d\x76\x8c\xb8\x6b\xcd\x18\xb4\xce\x86\xe4\x1c\xfd\x4e\x64\x09\x73\x11\xcd\xe5\xe6\xb2\x4c\x57\xcc\x66\xc2\xe8\xf2\xad\x85\xd3\x18\xaf\xdd\xcc\x86\x14\xcd\xf9\x8d\x78\xca\x59\x0e\x7f\xe5\xe0\x3a\x32\xc3\x62\x7c\x74\x59\xd4\xb1\x11\x2f\x1c\x19\x79\x33\xff\x28\x20\x1a\x27\x3b\xb9\x5f\xce\xd4\xb2\x82\x9b\x87\xf8\x2b\xd4\x02\x47\x16\xfa\x50\x44\xfb\xea\x5c\x9c\x71\x08\x4c\xd2\x5c\xb0\x23\x05\xc0\x54\xa1\x5b\x5d\x43\x84\x14\x55\xe1\xda\xb1\x94\xce\xd1\xef\xee\xc5\xe9\xf8\x53\x85\x6f\xfb\x0a\xd4\x11\x68\x9e\xa9\x4b\xd1\x3e\x07\x4e\x49\xd6\x93\xa6\x07\x47\xfd\xe4\x7a\x42\x2d\x63\x65\x39\xef\xc0\x43\xf1\x60\x90\xe2\xcc\x98\x19\xba\x46\x82\xb8\x2b\xea\xe5\x85\x3d\x73\xaf\xf6\xf2\x13\x62\xfe\xb3\x9e\xff\x6c\xe4\x3f\x9b\x1e\xb0\x18\xf9\x94\xa1\xe0\x1a\xe0\x45\x71\x25\x5c\xf3\xca\x9f\xa0\x46\x14\x80\xec\xd9\xca\x86\x0e\x21\x86\xd0\xf7\xc1\x19\x05\x43\xe4\x17\x7d\x48\x95\x6f\x6a\xd9\x66\x41\xd9\xa6\xf5\x48\x54\x66\x08\x55\x5a\xf5\x54\x02\x55\x1f\xeb\xea\x63\x43\x7d\x6c\x7a\x42\x61\x61\x6c\xde\xab\xab\x68\x9f\x9c\x7c\xbf\x8b\x31\xb2\x4f\xba\x32\x4c\xd6\x59\xf7\xd0\xdd\xc8\xcd\x46\x34\xec\x40\x50\x5a\xb2\xb6\x0c\xec\x1b\xcc\x62\x85\xc2\x85\x24\x15\xd5\x09\xa6\x16\x1d\x57\x4d\x1a\xac\x73\x78\xfd\xbb\xc2\x6c\x6b\x36\x0d\x50\x5a\xd7\xa7\x43\xab\x65\xcc\x0f\xd4\x6a\xa8\xb5\x1a\x7a\x2d\xab\xb6\x29\x6d\xea\xd3\xa9\xd5\x6a\xda\xd4\x50\x6f\xb5\xb3\x83\xfd\xe8\x2f\x6f\x81\xb6\x13\xc3\xb1\xe5\x8c\x23\xf6\x5f\x3a\xaa\x9b\xa8\xfe\x92\xfd\x7c\xc5\x67\x88\xbd\x70\xec\xbb\x30\xc7\xe1\x20\x03\x4a\xf7\x1c\x8a\xb2\xc2\x89\xe3\xa8\x67\x64\xf2\x24\x75\x4d\x4d\x48\x5e\xbf\x4b\x8a\xae\x4a\x5a\x37\xe4\xae\xdf\x25\xa5\x56\x25\x6d\xe8\x52\xd7\xef\x92\xfe\x2a\x6d\x4a\xaf\x8d\x6d\x78\x69\xc9\xb6\x01\x00\x72\x75\x15\xb9\xba\x03\xb9\xc6\x1c\xe4\x9a\x85\xc8\xd5\x6e\x89\x5c\x43\x45\xae\xe1\x40\xae\x39\x07\xb9\x5a\x21\x72\xf5\x5b\x22\xd7\x54\x91\x6b\x3a\x90\xab\xcd\x41\xae\x5e\x88\x5c\x63\x2e\x72\x56\xd2\xfd\x30\x01\x1b\xa2\x34\xf3\x33\x6c\x16\x00\x76\x92\xd5\x2c\x1d\x03\x96\x91\xe9\x7a\x34\xf8\x42\xe6\x22\x6b\xd8\xbe\x90\x81\xc8\x74\xed\xb8\x55\x89\x62\x5d\x4f\x73\x78\x1f\x2c\x9f\x0a\x3d\x79\x48\x6b\x47\x3f\xb5\x58\x96\x8f\x7e\x6c\x31\x57\x90\x72\x6e\xc9\x97\x50\xb5\x1c\x25\x88\xf5\xc3\xb1\xab\xbb\xb1\x33\xd7\x8f\x81\x9d\xb1\x84\x54\xec\x6a\xb7\xc1\xae\x21\x61\xd7\x70\x63\x67\x2e\x20\x03\x3b\x63\x0d\xa9\xd8\xd5\x6f\x83\x5d\x53\xc2\xae\xe9\xc6\xce\x5c\x41\x06\x76\xc6\x22\x52\xb1\x6b\xcc\xc7\xce\xa4\x56\xcc\x03\x5b\xdb\xe5\x12\xba\x0d\x5b\xd6\x91\x2e\xe4\x18\xcb\x49\xdd\x5c\x2d\xab\xca\x10\x7d\x9a\x2e\xd9\x87\x1d\x85\x37\x50\xa3\xdd\x59\x6d\x36\x98\x06\xba\x6a\x53\x05\x73\x89\x45\x08\x48\x29\x73\x1c\x66\xaa\xe1\x67\x29\xcb\xf7\x84\x20\x85\xf7\xc0\xef\x63\xa1\x23\x16\x40\xfe\x1b\xcf\xfc\xf1\x44\x9c\x94\xf3\x0f\x7c\x4e\x29\xac\x0c\xcf\x32\xe9\x76\x7b\x65\x6b\xe7\x64\x85\x9d\x23\x2a\x63\x6e\x91\xfe\x19\x5f\x7b\xa8\x3f\xb8\x10\xd2\x7c\x0e\x65\x32\xf2\x09\x12\xb3\x0c\xe9\x50\x98\x84\x5f\xc9\xdb\xb1\x01\x62\x3a\xed\xae\x45\x89\xfd\x91\x46\x4d\xdd\xc3\xa3\x09\x4e\x2a\x5b\x3b\xf4\x5a\x9f\xea\xec\x9f\x3e\x61\x36\x2b\x72\x93\x2f\x9f\x3e\x85\x08\xb8\x60\x40\xa2\x58\x15\x6c\xb4\x1b\x1e\xb7\x4b\xd8\x68\x83\xed\x88\x64\x99\xb0\xd1\x6e\x79\xb9\x49\xc2\x46\x1b\x5c\x18\xc7\x41\xfb\xc7\x8d\x4e\xfd\xe6\xdc\x6b\x37\xee\x64\x2d\xf2\x2d\xcd\x44\x1e\xcc\x98\xe3\x1b\x9a\x65\xd0\x95\xf0\x1c\x31\x03\x0a\xd2\x3c\xea\xc7\xe3\x49\x1c\x41\xc8\x75\xf2\x6d\xf5\xe9\x13\x31\xef\xa3\xb0\xb7\xc2\x8a\x7e\xfd\x2a\x1b\x00\x08\xa7\xcf\x7b\x36\xee\xf0\x53\x9c\x5b\x75\xf8\x29\x96\xbe\xfd\x1a\x27\x01\xb8\xa5\x8b\x02\xe2\x8d\x0c\x61\x3a\x00\x7b\x31\xa0\xf5\x2d\x7e\xcb\x93\xc3\xb4\x7e\x56\x30\xc3\xe0\x59\xd5\x25\x0b\x55\x7a\xff\x21\x1b\xac\x03\x14\x1c\xf5\x57\xc8\x83\x86\x75\xa7\x25\xbe\xd2\xc7\x22\x43\x14\xf1\x65\xe7\x72\xf2\x76\x7b\x37\xbf\x6c\xa2\xcf\xd6\x1b\xac\x5e\x4a\xcd\xf3\xc8\xb2\xe2\xb7\x58\x19\x1e\x4f\x46\x7e\x66\x63\x50\x22\xc8\xf4\x1f\x11\x0b\xc8\xc3\x35\xa8\xe0\x54\x20\x78\x1d\xe8\xfd\xc2\x2f\x78\x85\x07\x98\xdc\x40\x2d\x54\xa9\x37\xd6\x51\x2f\xcc\xd2\x6a\x11\xc0\xf0\xd2\x02\x6f\xff\x97\xdb\x82\xfb\xb8\xf3\xbe\xfb\xf1\xb7\xdd\xc3\xe3\x83\x8f\x07\x87\xdb\x3b\x68\x0b\x42\x1b\x64\x7e\x94\xa1\x04\x4f\x12\x9c\xe2\x28\x0b\xa3\x0b\xae\x88\x21\x64\x38\x8e\x83\xbc\xef\x56\x98\xdb\x3b\xa5\x60\x32\x76\x6a\xc0\x94\x2e\x05\x35\x93\x23\xf1\x68\xa7\x28\xcb\x25\x61\x3e\x9b\x14\xdd\x2e\xb8\x7d\x4f\x13\x30\x78\x10\x39\x3e\xe4\x22\x4a\x71\xa9\x77\x82\xee\xc9\x1c\xa0\xd3\x21\x26\xa3\x9e\xc5\x68\xca\xdc\x04\x08\x0b\x40\xa4\x30\x80\x56\x40\xae\xe6\x0f\xfd\xc1\xc5\x06\x90\x2e\xc7\xb5\x2a\xef\xa8\x06\xb6\xb0\x5d\xa4\x14\x36\x23\xbf\x30\x72\x4d\x86\x0d\x7d\x6a\x8f\x29\xe1\x4e\x48\x8f\x20\xff\x19\x5f\xaf\x58\xcb\x72\xcf\xd0\xfe\xe0\x02\x55\x0e\xa1\x15\x7f\x54\x85\x3a\x7d\xdb\xe0\x95\x1c\x03\xb5\x2d\x1e\x47\x94\x4e\xe8\x0d\x21\x11\xde\x3b\x42\x28\xfd\xa2\x3e\x91\x73\x45\xd8\x77\x7f\x57\xa5\x04\xb3\x00\x52\xa4\x05\x79\x8f\xe7\x57\xcf\x2b\x74\x9b\xde\xa1\xc3\x1c\x27\x15\x76\x79\x06\x43\xe8\xa1\x3f\x50\x78\xb9\x81\xc2\xcb\x9c\x37\xde\x28\xa6\x07\xca\x7c\xab\x90\x36\x94\xb0\x50\x4c\x72\xd0\x35\x00\x72\xe2\x10\x5a\x9f\xdd\x38\xab\x6b\xd5\x22\x7b\xe8\x12\x5a\x49\x7a\x72\x2c\xc4\x47\x7a\xba\x5f\x7a\xda\xc6\xf7\x45\x4f\x02\xd2\xdd\xe8\x49\xe5\xd3\xb7\xa0\xa7\xfd\x28\xcc\x42\x7f\x14\x7e\xc1\x29\xf2\x51\x84\xaf\x46\xd7\x0c\xc3\x80\x0d\xc7\x7c\x5a\xe2\xbb\xc6\x6c\x10\x27\xe3\x83\x38\xc0\x68\x87\xfa\xaa\x41\x98\xe6\x9c\xd3\xc5\x89\x4c\xa7\x60\x5d\x0d\x6e\x7e\x9c\x6a\xc5\x26\x63\x27\xc3\xef\x8e\x64\xef\x8d\xac\x2a\xe6\x07\x1b\xa7\xb8\x25\xc1\x85\x51\xa8\x58\xd8\x88\x69\x92\xc8\xc5\xa2\xa2\xde\x9a\x4c\x08\x2d\xc0\x68\xf1\x6c\xd3\xa9\xe5\x9a\x81\x0c\xf1\xa6\xf8\xc9\x37\x45\x4a\x83\xe6\xa9\x38\x23\x92\x33\x35\xac\x8f\x93\x31\x9d\x76\xdf\xa6\xbb\xa1\xf4\x9d\x93\xd4\x66\x4e\x5e\x2f\x6d\x25\xa9\x1d\x0d\xd8\xca\x58\xcf\xe2\x21\x25\x74\xea\x01\x60\xeb\x07\xd8\x17\x55\x4a\x2f\x1c\xb0\xd1\x51\xf9\x30\xc4\x72\x48\x45\x4b\xa0\x3d\xbb\x23\xf9\xb0\x25\x68\xe2\xa6\xcc\x70\x52\xc6\x88\x8a\x1a\x15\x05\x7e\xe6\xa3\x1e\xc8\x5e\x6a\x09\x87\x3c\x06\xa0\x69\xa6\x0b\xee\xed\xac\x03\x3e\xc2\x09\xcc\x65\x3f\x8e\xfa\x09\xce\xf0\x32\x1b\x8e\x51\x7c\xa1\x30\x65\xe9\x5e\xea\x78\xb1\xb1\x86\x78\x1a\x80\x39\x75\x6f\x61\x3c\x05\x07\x12\x4b\xc1\xc1\x02\x9b\xde\xd7\x94\xb9\xc2\x10\xa0\x4c\xd9\x49\x78\x03\x6f\x83\x35\x20\x81\x2f\xb1\x73\x49\xfc\x49\xc0\xa2\x41\xb3\x58\x30\x82\x30\xba\xb8\x07\x6e\x92\x77\x7e\x93\x93\x07\x83\x5f\x79\x46\xda\x7c\xa6\x92\x49\x99\x7a\x57\x1c\x73\x27\x85\xb1\x92\x1b\x5a\x94\x57\x3a\x74\x0e\xee\x81\xa3\xc0\x36\xfb\x3e\x7c\x91\xab\xdb\x68\x8a\xb6\x87\xfc\x4b\x3f\x1c\xf9\xbd\x11\xa6\x66\x88\xa9\x7b\x5b\xfc\xc8\x3b\x53\x9a\xaa\x76\xc3\x88\x6d\x7c\x85\xfb\x14\x83\xab\xee\x33\xef\xe3\x8c\x79\x47\xd3\xa0\x69\x14\x52\xbe\x6b\xa0\x30\x45\x78\x30\xc0\xfd\x2c\xbc\xc4\xa3\x6b\xe4\xa3\x00\xa7\x59\x32\x85\x67\x0f\x25\xd8\x0f\x96\xe3\xa8\x8f\x4b\xed\x33\x65\xa9\x17\xd0\x78\x28\x1a\xa6\xc0\x1f\x9a\x92\xf9\x48\x56\xca\x13\xb1\xa8\xb2\x28\xf5\x8b\x8a\xf3\xc9\x9f\x17\x2d\x4f\xff\xbb\xf9\x5c\x4c\xa1\x90\x5a\x22\x1c\x14\x02\x40\x85\xab\x45\x29\x6a\xb9\x28\x59\x80\x21\x43\x3c\x24\x82\x2a\x5b\x70\x38\x60\xf1\x32\x39\xa7\xde\x95\x26\xc4\xba\xf8\xcc\xda\x73\x95\xcd\xf5\xc6\xfa\x6a\xb3\x21\x7f\xa2\x2a\x11\xdb\x17\x4d\x0e\xda\x40\x75\xe5\xab\x2a\xff\x6e\xa0\x46\x99\xb3\x53\x6a\x55\x65\xfb\xf3\x15\xd9\xc8\xb9\x36\xf9\xa9\x85\x8d\xf4\xe9\x10\x4b\x42\x01\x4b\xb4\xe5\xa3\x21\x68\x8d\x89\x90\x59\x62\x29\x72\x11\x76\x2b\xe2\xf8\x40\x80\x01\xbe\xac\x89\xd0\xc4\xd6\xb5\xa5\x43\xdf\xe0\xb0\xc4\xac\xbd\x4d\x95\xa7\xa6\x23\x37\x64\x5b\xe7\x2a\x53\xea\x6d\x38\xfd\xa6\xc8\x9f\xf8\x94\xe2\x11\xee\x67\xb4\xe1\x93\x2c\xf1\x33\x7c\x71\x5d\x71\x99\x6b\x4b\xda\x67\x10\x17\x37\xd1\x33\xca\x4a\x9f\x39\xcd\xc3\xd8\x6c\x1c\xf9\x69\x4a\xd8\xc4\x6b\x3f\xc5\x81\xe2\x31\x27\xff\x15\x1b\x87\x31\x50\x27\x38\x81\x03\x17\xd9\xd5\xdc\x90\x8a\x17\xb9\x9e\xdb\x8f\xdd\x67\x14\xd8\xa8\xbb\x90\x62\xe4\x24\x33\x36\xf3\x86\xa5\xc8\x6e\x34\x0f\x02\x66\x9f\x07\x71\x71\x43\x51\xf4\x90\xfb\x02\x47\x1f\x03\xcf\x61\xe9\xc9\xc8\x7e\xc3\xe8\xbf\x76\x9f\x73\x27\xb4\xd5\x9b\x22\x0f\x15\xde\x18\xe9\x98\x5b\x26\x54\x67\xdb\x32\x97\xac\x54\x99\x86\xd7\x7e\xf5\xa6\xea\xb0\xd3\x2c\xc1\xfe\xf8\x56\xaa\x6c\x90\xa1\x98\xf2\x59\xb6\xc1\x6f\x36\x96\x7b\x21\x35\xd8\x56\x4f\x34\x54\x3a\x81\x30\xd6\x92\x66\xba\x8e\x2a\xcd\x86\xaa\x98\x96\x14\xbe\x27\x80\x9f\xa6\xf6\xd5\x5f\x16\x78\x84\xec\x5a\xf6\x5a\xdb\x0e\xcb\x45\xc4\x89\x9f\xc0\x71\xcb\x26\x20\x9a\xdb\x1b\x1c\x6f\x72\xeb\x2a\x2e\x34\xfe\xf0\xc3\xb3\xc1\x68\x9a\x0e\x9f\x95\xdb\xe6\x28\x14\xd7\x46\x27\x86\x79\x03\xd5\x8b\xe6\x15\xce\xb5\x90\xd5\x74\x22\xdf\x96\xca\xca\xf3\x8f\x63\x7a\xf6\xed\xae\xb0\x1f\x7f\xdc\xcc\xa7\x10\xc5\x63\x07\xea\x19\x54\x22\xb5\x21\xdd\x6e\xb2\x83\xb6\xe1\x1c\xcc\xde\xcb\x4a\xef\x22\x05\xbd\xac\xa2\x1c\xf3\xe4\x5c\xb9\x7c\xbd\xf0\x6e\xba\xa5\xf6\xc8\xaa\x10\xd4\x33\xcb\xe4\x0a\x7e\xa0\xea\x6f\xb0\x1f\xf2\x99\xe2\xdb\x1d\xe8\x61\xbb\xaf\xbb\x86\x2a\x9a\x73\x94\xf0\x92\x7a\xed\xdc\x46\xf3\x9c\xc3\x28\xd4\x15\x8a\xba\x5c\xd1\x24\xd5\xbb\x95\xc6\x59\x4c\x67\x7e\x40\xfa\xcf\x9c\xce\x5c\x13\xbc\xe0\x74\x5a\x15\xbf\x25\xa7\x53\xd4\xbd\xc3\x74\x16\x29\x7c\xcb\x5d\x1d\x7c\xd3\xe9\xbc\xf3\x74\x15\x2c\x81\x39\xf3\xa5\xeb\x4d\x0b\x26\x89\x6e\x26\x42\xcf\xdb\xb7\x89\x75\xcc\xea\xfa\x12\x6d\xa2\xf0\x52\x9e\xad\xa2\x2d\x82\xed\x98\x34\xae\x74\x77\xe8\x87\x11\xa4\x3c\x71\xdd\xb5\xbe\x06\xbb\x81\x8f\xbc\xf3\x68\xd3\x1d\x7c\x40\x57\xb1\x29\x3b\x08\xa9\x6b\x10\x83\x34\x34\x79\x63\xda\x2e\x21\xee\x44\x5f\x16\x71\x94\xd7\x5d\xbe\x1d\x68\x27\x21\xa9\x09\x65\xee\x48\xaf\x5e\x77\x2d\x7b\x8f\x09\x9e\x36\x71\x24\xc2\x7f\x66\x5c\x8d\x41\xa9\xd4\xcf\x98\x51\xf7\x8a\x5e\xc7\x80\xa1\xd1\x2c\x95\x8e\x84\x56\x84\x09\x4b\x31\x97\x91\x90\xca\x09\x91\xf5\x86\x84\xd9\x65\x11\x20\xec\xe7\xd5\x10\xb3\xc8\xfb\x14\x3f\x08\xe4\x99\x96\x40\xce\x5c\x18\xf6\x82\xe4\x0f\xa6\x92\x89\x3a\xd4\x1b\x00\xd2\xe3\x41\x17\x84\x6b\x83\x2e\xcb\xca\x93\x81\x72\x15\xa0\x61\x26\xaf\x42\x71\xda\x42\x5b\x1d\x60\x91\x7e\x43\x22\x2f\x24\x87\xe1\x6c\x2e\xc4\x0a\x4d\x8e\x78\xe5\x30\x67\xfd\xed\xf0\x18\xce\xcb\x8c\xe8\xcc\x32\xb3\x38\x81\x7e\xe5\x8a\x6e\x0f\x29\xfd\xf2\xf2\x66\x6d\x42\x3f\xc3\x43\xf6\x75\xa9\xe8\xa3\x6b\xc5\xec\x18\x8f\x31\x48\xe1\xb0\xbb\x52\x12\x60\x57\x51\x70\xda\x07\x87\x76\x78\x6d\x56\xe7\x12\x2c\xbe\xe4\x61\xe7\x29\x33\xa5\xf9\xe4\x39\xde\xc2\x14\xd0\xd9\x01\xd9\x73\x67\xee\xba\x0d\x70\x89\x75\x2b\xf6\xa9\xc7\x75\xfb\xb8\x6e\xd1\xed\xd7\xed\x5d\x56\x07\x58\x08\x0f\xc3\x74\xe1\xb5\x61\xc5\x84\x51\x34\x70\x91\xdf\x0e\x8f\x9d\x1c\x40\xf6\x20\x33\x38\xc0\x5d\xd9\x8e\x15\xb3\xd3\x7c\x68\x7a\xb8\x1f\x8f\xd9\xd2\x21\x6c\x21\x8c\xa7\x69\x79\xe6\x21\x06\xab\x2c\x7b\x10\xa4\xc4\xbb\x51\x71\xe2\xbe\x90\x07\x14\x88\x48\x5c\x5a\xb2\x79\xf8\x0f\xe3\x38\xc5\x68\x1c\xce\x88\x2c\x64\xe9\x1f\x78\x82\x9a\x42\x1a\x92\x09\x91\x49\x61\x2e\xb2\x8b\x2f\x41\x3a\x25\x27\x9d\x74\xda\x4b\xf1\xff\x4e\x71\x94\x59\x55\x0c\x48\x15\xed\xa4\xac\x1e\xea\x28\x3a\x55\x83\x32\x4a\xda\xac\xcc\x57\xf5\x93\x9d\xcd\x86\x95\x2d\x46\x52\xbe\xda\xac\x91\x92\xc8\x1f\x4c\x60\x6e\x3d\x1e\x9e\xa3\xdf\x37\x69\xbd\xb3\xb0\x30\x74\x49\xfe\x9b\x9b\x40\xbf\xee\xb2\xf2\x4a\x40\x13\x49\xb4\x3d\xf2\x83\x80\x4c\xe0\x1c\x05\xc8\x04\xb2\x5c\x75\x57\xe8\x7f\xed\xea\x8f\xa3\xb7\xdd\x13\xf4\x7f\xda\xab\x6b\x68\xc2\x80\xa6\x4c\x97\x67\x83\x79\xf4\xb9\x9f\xae\x81\x9c\x3c\xf1\x83\x15\xfe\x54\x20\x1b\x1f\xf9\xfc\xfa\x79\x9a\xf2\xd0\xf9\x22\x10\x0a\x33\x57\x86\xb8\xc9\x02\x8f\x85\xec\xaf\x00\xb2\x7c\xfb\x4c\xd0\xb2\x56\xb2\xeb\xf1\x58\x08\x28\xe9\x3e\x12\x00\xa5\x22\x98\x25\x19\x14\x08\x67\xf9\xc0\xc7\x66\x71\xf8\x12\xe3\x4a\x7e\xe5\xd7\x6b\x9e\x16\x37\x4b\xb9\x60\xf6\x03\xfd\x72\xed\xd6\x0c\x44\x54\xa3\xb1\x4e\x36\xa5\xf1\x72\xc5\x0c\x99\x46\x99\xa0\x1d\xf0\x2b\x32\xa1\x46\x8c\x60\x0d\xa0\xf4\xc5\x32\x4d\x39\x2d\x22\xac\xfc\x43\x2b\x60\x6b\x96\xde\x0b\xf1\x76\xcd\xd0\x0b\x34\xd3\x1b\x7c\x25\xf4\x02\x11\x50\x14\x2c\x72\x5f\x17\xe3\x3d\x73\x70\x31\xde\x83\x5b\x8b\xf2\x76\x2e\x66\x85\x48\xa5\xc5\xe1\x0b\x72\xf6\xa3\xb6\x89\x42\xb4\xe4\x72\xcb\x97\xa1\xd3\x30\xf7\xd2\x9b\x02\xe9\x55\xc3\x0e\x6d\xe6\xb6\xef\xfc\xf0\x2f\x83\xf6\x54\x94\x6c\x66\x08\x5b\x41\x60\x1f\x04\x98\xeb\x7e\x1c\xf5\xfd\x8c\xc3\x2c\xad\x81\xf9\x10\x4d\x04\x43\x81\x25\x3b\xf4\x03\x1a\xc8\x88\x2d\xd4\x6f\xc3\x65\xa6\x91\xce\x67\xbe\x09\x47\x80\x66\x4b\x5c\xb9\x43\x39\x9d\x25\xd8\xf8\xc0\x1b\x9c\x29\x89\x8b\xa5\x45\x0c\x31\x60\xd1\xc8\x4f\x33\x78\x9e\xbf\xa6\x73\xf1\xfa\xac\xa2\x2e\xe7\x65\x54\xaf\x52\x17\xb3\x73\xe6\x0c\x66\xf3\x24\xa6\x82\x83\x9b\x62\x72\x70\x9b\xfa\x1a\x94\x36\x53\xba\x6d\x2e\xa8\xe7\xff\x33\x2e\x82\x6c\x2e\x0a\xf6\x9b\x05\xdb\xad\x42\xd1\x3d\xd0\xfd\x19\xfd\x1f\xc4\x01\xbe\xa1\xea\xc1\x53\x71\x5a\xa3\x97\x22\x70\x92\x90\xba\xd3\x7d\xdd\x75\x41\x61\x73\x75\x23\xe8\x8b\xc0\xd2\x85\x0d\x13\x22\x90\xbc\x83\xc0\xc1\x8f\x80\x0d\x80\x64\x38\xa9\x11\x38\xc1\x14\x30\xf3\xb4\x53\x1d\x6d\xdb\x68\xe2\x46\xf1\x46\x58\xc0\x30\x90\x4e\xb4\xfa\xb1\x2b\x59\x1f\x16\xdb\x00\x16\x04\x38\x53\xed\x43\x2d\x7e\x9c\x20\x37\x93\x11\x50\xd4\xa2\x48\x55\xec\x92\xef\x63\xb0\xfd\x74\xe0\x9f\x4f\xac\x79\x18\x30\x6c\x49\xb9\xa4\xad\x1a\x97\x38\x4f\x0c\x04\x2a\x6c\x89\xa0\xd1\x80\x53\xb9\x76\x37\x63\x97\xf6\x57\x9f\x17\x37\xaf\x5a\xaf\x54\xd1\xf3\xd5\x85\x31\x10\xaa\x16\xc7\x59\xe6\x2d\xc6\x13\xe4\x67\x68\x84\x09\x17\x8c\x23\xbe\x02\x58\x96\x0f\x6a\x09\x0a\xfb\x35\x30\x5c\x93\x6f\x21\x71\xbe\x19\x87\x11\x35\x12\x65\x87\x78\x23\x5c\xa2\xfa\xc8\x2a\xd1\xe9\x93\xf0\xa7\x84\x34\x06\xfb\x63\x7a\xe4\x0d\x2f\xd1\x4f\x3f\x59\xf5\xf1\x7a\xa0\x8e\xa3\x5b\xe9\x32\x72\x4c\x54\x65\x8a\xf3\x7c\xae\x37\x5b\xf6\x4a\xda\x2d\x92\xe6\x22\x89\x30\x94\x66\xaf\x2c\x04\xcd\x9b\xbb\x5f\x42\x5e\x5d\x25\x07\x19\x9a\xee\xcb\x25\x72\x81\xbc\xce\x4c\xbf\x40\x02\x87\xdf\x73\x75\x10\xfc\x2a\x9e\xda\x08\xba\x4e\xc9\xb7\xba\x8c\x7f\xb8\x65\xf5\xb0\x78\x5b\xdb\x03\xc9\x6f\xce\x0c\x50\xf9\xc8\xd6\xde\x3c\xcb\xbf\x3b\x5a\x2a\x80\xe9\x1d\x93\x3d\xec\x66\x28\xa8\x1f\x8f\x46\x98\xd2\x7f\x3c\xe0\xa2\x01\x88\x9a\x18\x72\xe9\x15\x89\x1e\x92\x28\x2a\x39\x79\x93\x6d\x34\xf1\xaf\xa4\x57\x56\xbf\x44\xbb\xeb\x07\x75\x40\x17\x42\x4a\x99\xda\xf9\xc5\x23\x64\x78\x60\x5c\x90\xd6\x27\xeb\xd3\x30\xc7\x75\x01\x4a\xfd\x11\xc5\x1e\x7e\x00\x30\x50\x49\xfa\x34\xfc\x28\x4e\xc2\x4b\x2a\xab\x70\x8e\x61\x05\xc8\xaf\x52\x73\x39\x5f\xb2\x1c\x34\x63\xad\x96\x93\x6b\x6e\xd3\xb3\x62\xf9\xa6\x3f\xc4\xe3\xdb\xc1\xb5\x0b\x9c\x4c\x65\x0e\x16\xd3\x03\x09\x9e\x15\x04\xcd\xc9\x78\x93\xe7\x6c\xa4\xa7\x18\x2a\x62\xf1\xb7\xba\x18\xd6\x8f\xa3\x4b\x9c\x64\x8a\x0c\x4b\xb3\xdd\x71\x63\x4a\xb0\xf8\xa4\xd6\x7f\x6e\xb7\xd5\x23\x5a\x45\x75\x5e\x15\x2f\x4b\xda\xc3\xcc\x77\xb1\x52\x51\x9b\x7f\xac\x13\xde\x4d\x32\x3e\x9a\x9d\xa8\x1f\x89\x24\x56\x93\x38\x4d\xc3\xde\x08\xbb\x57\xac\xa5\xa9\xc5\x9c\x9b\xf2\x81\x32\xed\x41\xe9\x37\x7e\x02\xff\xc3\x80\x82\x84\xfa\x9c\xac\xe0\x0d\xe9\x77\xee\xf0\x64\xad\xf4\x19\x5f\x6f\xa8\x7e\x51\xd6\x62\x9a\xa7\x94\xbd\x10\x59\xc6\x1b\xf0\xef\x9c\x82\x62\x55\x6e\x98\xee\x5c\xf6\x1a\x4c\x84\xd7\x2d\x13\xec\x85\x85\x5c\xaf\x1e\x9d\xdf\x76\x4f\xd6\xec\x15\x24\x16\xde\xb2\x97\x10\x0b\x47\x02\x4a\xdf\xad\x1c\x4e\x70\x74\x72\xf2\xce\xa8\x56\xde\x99\x4c\x9e\x7e\xbb\xe0\x35\x0e\x67\xfb\x91\x5a\xae\xb4\xe9\x11\x5d\xc5\xe9\x62\xcb\x18\x39\xd7\x8d\xc9\x4a\x34\xdf\x40\x07\x37\x21\x87\x3a\x37\x70\x6e\x60\xcb\xbd\x32\x60\x57\x80\xdf\xe1\x20\xd4\xd7\x78\x01\x1c\x48\x02\x96\xd2\x0c\x60\x90\x3d\x0e\xe7\x5e\x94\x39\xc6\x51\x4c\xdf\x68\x0c\x90\xe5\xec\xc7\x45\xdc\xa3\xec\x92\xa6\xc8\x8b\x6b\x3a\xb6\xb6\x97\xd0\xb3\x67\x76\xdf\x0a\x6b\xf9\x95\x2c\xa6\xf9\x86\x5c\xae\x1c\x73\x6a\x39\x48\xd5\x49\x98\xbc\xa2\x4c\x9c\x62\x6c\x5c\x56\x55\x79\x09\xf4\xf5\x2b\x25\xd7\xbc\xce\x0a\x9f\xc4\x6b\x7e\xec\x35\x74\x34\x56\x39\x89\x52\xd9\xbc\x7b\x0d\xda\x0e\x5c\x6d\x88\x9f\xf6\xdb\x0d\xd6\x73\x1b\x71\xda\x40\xb3\xe2\x22\x95\x31\xec\x5e\xea\x20\x16\x5f\x77\x88\x55\xe7\xbb\x97\x5c\xc4\x9b\x59\xee\xc7\xe3\x89\x9f\xc1\xf6\x52\x76\x19\xca\xdb\x82\xb6\x89\x49\xe2\x4f\xd9\x3d\xd1\xb6\xfc\x6e\x83\xdc\x7d\x19\x0e\xc6\xb4\xed\x13\x4e\xde\x0e\x42\x96\xa8\xcb\xc5\x1b\x15\xfa\x16\xc5\x4b\x73\xdf\x39\x6a\x19\x39\xd2\x92\xb2\x04\xf3\x2f\xb6\x40\x8d\x44\xdc\xd5\x2a\x90\x77\xb6\x63\x2c\xf4\xd7\x3c\xc4\x92\xe2\x4e\x55\xcb\x95\x14\xad\xc6\xd0\xde\x9f\xd5\x66\xed\x66\xa7\xde\xe9\xaf\x41\x62\x83\x4e\xbb\xd3\x6a\x0f\xda\x83\xf3\x2a\x57\xc5\x03\x68\xfe\x90\xf7\xc3\x71\x8e\x2c\x81\x82\x73\x2c\x1c\x87\x2f\x51\x37\x67\x64\x34\xac\xcd\xe2\x7b\x5e\xd1\x1a\x93\xfd\x95\x16\x15\x1e\xf9\x3a\xc9\xe9\xf4\xd6\x4b\x46\x8d\xd9\xc0\x17\xf4\x2d\xd6\xf0\xfd\x06\x70\x30\x85\x51\x6d\xe9\x4d\xfc\x24\xc5\x15\x65\xa1\x16\x5c\x4c\x26\xa9\xa2\xf8\xc9\xab\x59\xbd\x12\x48\x71\x44\x63\x78\xcd\x59\x74\x94\x30\x0c\x64\x8a\xd4\xab\x45\x10\xf9\x65\x9c\x74\x18\x66\x49\x21\x0c\x70\xa7\x38\xcd\xa8\x6d\x83\x3f\xb2\x2c\x50\x0d\xe6\x59\xed\x1c\x6d\x6e\xa2\x7c\xed\xa1\x9f\x7e\xd2\xdb\x3d\xab\xb3\x32\x7c\x4d\xba\x54\x50\x3b\x33\x7a\x81\x61\xb6\x8c\x54\x0e\x63\x2c\x7e\xad\x45\x66\xca\xd3\xf0\x50\xab\x5a\x60\x5d\x17\x5f\xb2\x23\x3a\x5c\x05\xe5\x30\xcc\xf2\x06\xfc\x09\x34\x50\xd3\x6f\xad\x8d\xe2\xca\xad\x4e\xbd\x53\x8e\x51\x58\x8f\x46\x8e\x63\x90\x27\x9d\x4e\x54\xd1\xbc\xf0\xae\x88\x2f\xc2\xab\xc4\x9f\x4c\x40\x8e\xf4\x33\xd6\xbc\xac\x32\x41\x3e\xd9\xe9\x53\xc9\x2b\xad\x70\xf5\x2a\xae\x3e\x86\x2b\x5b\xee\xf0\x63\xfb\x54\xd6\x81\xe4\xd6\x97\x3d\x42\xe8\xe1\x32\x7e\x91\x54\xcf\x75\x04\x72\x6f\x59\x67\xa9\x43\x68\x14\x50\xaa\x11\x07\x8c\xfc\x62\xc7\x72\x70\x2a\x0a\x11\xa5\x7b\x2f\x02\x42\x1b\x86\xa8\x26\x4d\x6c\x61\x50\x29\x76\xed\x40\xe6\x8d\x79\xd3\xdd\xc5\x43\x35\x57\x3e\x59\x8e\x3a\x05\xde\xe7\xac\x69\x6a\x83\xc2\x7e\xe7\x7e\xe7\x7f\x91\x18\x2e\xf6\x2d\x6c\xeb\xcf\xdd\xc0\xc8\xb2\xb4\x6b\x54\xcc\x65\x25\xfc\x2b\x4d\x6d\x84\xe2\x6a\xe9\x38\x85\x3d\x5c\x83\x79\x90\x1a\x5d\x9d\xf0\x4d\x1b\xf7\xc4\x6a\x73\x48\x03\x05\xca\x0e\x8b\x73\xac\xdb\x8b\xf5\x76\x21\x74\x16\x8a\x9e\xb3\x63\xb3\x5f\x97\xa2\x1b\xc4\xb9\xf3\x89\x2d\x00\x9a\xd5\x67\xd5\x10\x4b\x72\xcf\x0c\x11\x20\x81\x75\xf6\x36\x92\x49\x17\xfa\x97\xc3\x84\x2b\x60\x03\x0a\xb3\x37\x22\x1c\x57\x38\xe6\xba\xf6\xa3\xf2\xdb\x69\xd1\xa6\xad\xec\xaf\x66\x41\xae\x5a\xb4\x7c\x22\x64\x25\xfa\xb6\x12\x5e\x5a\x8a\x48\x3a\x42\x46\x2f\x66\x19\xaa\x15\xcc\x01\xc1\x85\xa8\x59\x4c\xe8\x03\xf3\x92\xec\x95\xa5\xb0\xa4\x0b\xd4\x2d\xac\x2d\xa5\x25\xbd\x20\x21\xbd\x81\xe5\xb8\x76\x53\xfa\xd8\xc2\xee\xa1\x53\x31\x71\x42\xf1\x25\x5f\xcb\xa0\x07\xdb\x9e\x64\x02\x10\x3b\x94\x76\xd1\x24\x3d\x42\x6a\xef\xbf\xe2\x3e\xa5\x05\x68\x11\x91\x8e\xbf\xc1\xde\x94\x47\x55\x9e\xcf\xa6\xb9\xf7\xbc\x85\x4d\x73\xb2\x63\x61\x14\x24\x8f\xfa\x5b\xb3\xec\xfb\x46\x51\xdf\x97\xee\x71\x4b\x71\xc6\x2e\x70\x44\x18\xf8\x06\xbb\x0a\xd3\x38\x48\xaa\x05\x79\x31\x69\x80\xe5\x9d\x82\xdd\x7e\xc3\xf9\x55\x46\x3e\xe7\x26\xb6\xe6\x18\xa7\x30\x37\x0c\x79\xf2\x94\x4d\x4c\x89\xba\x48\x87\x25\xdf\x9b\x24\x26\xa3\x28\x7c\xac\xdb\x84\x68\x62\x61\x6d\x8c\x95\xad\xe9\x63\xa5\xde\xbf\x80\x8e\xc9\x4f\xd3\xe9\x18\x07\xea\x7d\xa2\x3f\x4a\xb0\x1f\x5c\x4b\xfb\x9d\x72\x20\x9b\x46\x34\x6d\x65\x89\x88\x66\x8b\xb1\x3d\x3b\xff\x5a\xe8\xd0\x44\x18\x17\x98\xa8\x27\x29\x5e\x98\xd7\xbb\xf5\x45\xd3\x68\x51\x58\x7f\xa2\xc4\x6d\x90\x3c\x55\x21\x1d\x72\x2a\x40\x82\xf8\xed\x3c\xe0\xa3\xa1\x53\x92\x57\x0f\xab\x6c\x4b\xe5\xcd\x62\xd7\xc8\x8b\x70\x4e\x08\x1b\x6e\x13\x42\xd9\x93\xb9\x54\xf5\x8b\x0d\x54\xa8\x1d\x65\xd0\x0a\x94\xa2\x86\x66\xc2\x7a\x43\xf2\xd6\x6e\x22\x31\xef\xca\xe4\x73\x30\x80\xfb\x12\xfa\xdf\xe2\xcb\x92\x79\x56\x18\xe6\x85\xc9\x5b\x0a\x9d\xb4\x52\xee\x9e\x64\x9b\x80\x87\x3b\x7d\xd2\x18\x59\xcb\xfb\xbf\x70\x85\xc1\x84\xc5\x0b\x2a\xaf\x8e\xe5\x35\x98\xe5\x05\x7b\x00\x39\x85\x34\x03\x80\x8b\xbd\x42\xf2\x40\xe5\x98\xda\x56\x84\x11\xb3\xe4\x65\x76\x00\xcc\x64\xe6\x02\x47\x60\xcc\x5b\x0c\x4d\x44\x29\x77\x00\xa3\xa1\xb3\x8b\x61\x99\x3a\x03\x50\x61\x49\x42\xd2\x16\xea\xb4\xc0\xe4\x18\x3e\x70\xfb\xd9\xfd\x01\x8a\xc7\x21\x91\x11\x3c\xe4\xd3\x4f\x57\xe1\x68\x84\x7a\x58\x34\x18\xa0\xc4\x8f\x82\x78\x3c\xba\xbe\xa7\xc3\x3d\xb5\x9a\x60\xc3\xe4\xa1\xfd\x5f\x3c\x98\x52\xd2\xf8\x37\xe0\x42\x74\x92\x03\x93\x05\x49\xd4\xb8\x82\x67\xb8\x3f\xcd\x70\xe5\x19\x8f\x46\xf5\xcc\x63\x89\x3b\x3c\x66\xbe\xe5\x10\x8b\xee\x09\xba\x87\x9e\x91\xe1\x20\xff\xff\xcc\x7d\x66\xa6\x60\x64\xee\xc6\xa9\xd9\xe3\x24\xea\x31\xea\xa2\x8a\x4d\xbb\x51\x3f\x9d\x66\x36\xcb\x0e\x45\xf5\x0f\xce\xab\x24\x43\x89\x4c\xe1\x54\x3a\xad\x55\x23\xad\xb9\xc5\xad\x8e\x2e\x6d\x69\x5d\x9b\xd2\x0a\x8d\x37\x4b\x13\x0f\xe4\x0a\x5c\x11\xe3\x2e\x4f\x83\xcc\x16\xd2\x4d\x75\x85\x25\xf2\x96\xc6\x03\xf0\xb7\x06\xac\x25\xb4\x99\x15\x63\x00\x76\xd3\x86\x9a\x5c\x24\x83\x66\x0a\x72\x9e\x4c\x96\x8f\x39\x7a\x6e\xea\xb3\x95\xd4\xd0\x79\x0a\x67\xbb\xb3\xd4\x31\x13\xa5\x16\x3c\x8c\xe7\x47\x6a\x21\x45\xdf\x4e\xab\x6d\xd3\x0c\x28\x2a\xee\x80\xf1\x65\xce\xf2\x34\x96\xec\x09\x58\x0e\xf1\xeb\xf6\xfa\x70\x4b\x94\x38\xa1\x10\xb7\x7f\xb3\x69\xb8\x1e\x50\x3f\xfe\x76\x7b\xf7\x06\x91\xed\x93\x5b\x50\xda\x76\xe1\x5c\xca\xe3\xcc\xb6\x78\x8b\x5b\x48\x2b\x6e\xe9\xb0\xdb\xf9\xe1\x73\x30\xd8\x90\xb6\x67\x89\x42\x16\x54\x8f\x33\x97\xaa\x45\xf6\xe5\xef\x43\x5f\x5e\x28\x1d\x7c\x07\xea\x88\xbf\x88\xda\xdc\xb2\xf8\x4a\x69\x92\x9f\xf1\xa1\x76\x85\x95\x7d\xf8\x86\x3d\xf4\xc7\x03\x6b\xb0\xf3\xed\xe8\x1b\x29\x1c\xb4\xdd\x35\xce\x5c\xca\x5d\x9b\xec\x42\xc0\x13\xb1\x85\x8b\x2b\x12\xf6\x74\x78\x85\x8c\xc1\x9e\xe9\xb6\xe7\xf2\xee\xa4\x62\x2c\xed\x9b\xd1\xa5\x15\xd8\x62\x15\x0c\x56\xac\x21\x09\x9c\x8a\x79\x45\x5f\xe2\xbe\xce\x90\x03\x40\x18\xf3\xa3\xb6\x2f\xe9\xf1\x0d\x34\x0e\xc2\x19\x4d\x06\x02\x15\xac\x43\x2a\x9d\xad\xa9\x61\xa6\x02\xdd\xa5\x37\xb1\x9e\xf8\xee\xa0\x0f\xfe\x13\xf8\xf1\x3d\x2b\x88\xbf\x77\xc6\xfc\x3d\xea\x89\x6d\xcc\x70\x51\x45\xf1\x9d\x18\xe3\xbd\xa3\x68\x2a\x8a\xef\x8b\x71\x97\xd4\x13\x7f\x73\xde\xfd\xcd\x95\xc5\xdf\x7e\xab\xf0\x14\xdb\x1e\xc7\x09\xed\xfe\xf6\x8e\x52\xfa\x70\xf7\xfd\x85\x6d\xeb\x90\xc7\xb7\xe4\xee\x51\xa4\x20\xcf\x55\x79\x22\xd3\xa5\x9c\xd2\x92\xe5\xaf\xbc\x39\xf7\xda\xcd\xef\x35\x29\xe5\xbd\xe7\xa0\x5c\x34\xf7\xa4\x92\x73\xd2\x40\xcc\x4c\x3f\xa9\xa5\x9d\xe4\x15\x1d\x89\x27\x41\x3f\x9a\x03\x17\x3f\xd5\xe4\x93\x07\x7e\x36\xf4\x90\x25\x05\x65\x7e\xbc\x7e\x17\xf7\xfd\x11\x9a\xc4\xa3\xeb\x41\x38\x42\xf1\x00\xd1\x4d\x8b\x9d\xe2\x2d\x47\x5e\x16\xdb\x7e\x53\x2d\xa8\x35\xac\x30\x26\xf1\x7a\x97\xbc\xbf\x79\x69\xc6\x0e\x92\x6c\x2d\x7b\x9f\x0c\xa6\x06\x36\x82\xd3\x1e\x99\x41\x9d\x88\x77\x57\x26\x49\x9c\xc5\xe4\x13\xda\x24\xa7\x0f\xbd\x00\xab\x87\x36\x51\x84\xaf\x08\x02\xc5\x10\xa2\xe9\x68\xe4\x58\x28\x02\x83\x7c\x99\x48\xf1\x8e\x6c\x91\x3c\xf9\x9c\x14\x2b\xb9\x9d\x8a\xed\x77\x61\x2f\xf1\x93\xeb\x79\x3a\x72\x29\x3f\xa8\x13\x14\x64\x0b\x65\x5a\x4f\x22\x5c\xf0\x2e\xfb\x23\x14\x46\x43\x9c\x84\x4a\x00\x57\x25\xa2\x83\x9e\x67\xd4\x8c\x30\x6a\x4e\x67\x89\xb0\x7f\x3c\xc6\x30\xb8\xc7\x09\x3f\x83\xa1\x9f\x71\x84\x58\x28\x0f\x2a\x06\x19\xa7\x4a\x84\x8a\xe2\x00\x72\xb9\x2b\xbe\xc4\x49\x12\x06\x38\x45\x47\x54\x21\x12\xe2\x94\x32\xf0\xc9\x35\x0a\x23\x96\xcd\x38\x47\xa0\x44\x0b\x7a\xae\x86\xd3\x45\x01\x18\x32\x97\xa3\xdc\x22\x51\x03\xc9\x44\x1d\x5c\x9f\x52\x12\x56\xa4\x9b\x02\x93\x44\xd9\x5f\x2c\xc4\xa3\x60\x03\x3d\x83\x4c\x59\xcf\x74\xc3\x11\x7b\x9b\xe4\x6f\x8c\xb3\x61\x1c\x14\xfa\xc8\x4b\xa5\xf5\x18\xf9\x36\xc7\x33\x84\xcc\x70\x86\x14\x7d\xc5\x20\x9b\xcf\xab\x33\x88\xe1\xc4\xbf\x8a\xcc\x2f\x12\x23\x21\xc2\x42\x9e\x56\xcf\x65\x4e\xbc\x35\xbd\x18\xe3\xc8\x62\x3a\x4c\x76\x94\x62\x2c\x50\xce\x7c\xd8\xb9\x2b\x2f\x6f\x4d\xff\x60\x45\x80\x99\x49\x71\xd7\xaf\x50\x38\x96\x26\x76\x9c\x7e\xe0\x4d\x0e\xfd\xf4\xf0\x2a\x62\x64\x7f\x5d\x79\x46\x6a\x3e\xab\x0a\x9f\x27\xf2\x08\x9b\x20\x2f\x4f\x5e\xcc\xed\x07\xad\x55\x38\xdd\x96\x5a\xff\x4f\x3a\x9d\x10\x51\x2b\x0a\xb3\x15\x9f\x08\xa7\x6c\xeb\xf3\x93\x8b\x29\x19\x5d\xeb\x78\x20\x4b\x06\x85\x82\x71\xca\x3d\x6e\x93\x67\x29\xca\x39\x7a\x48\x95\xc2\x7c\xd2\xe9\x2a\x35\x21\xc8\x1d\x54\xf6\x03\xc7\xb6\x83\xb8\x62\x7c\x80\x13\x1c\xf5\x49\x03\x30\xce\x13\x7d\xbd\x1a\xc3\xc0\xe4\x62\x1b\x40\xe7\x3e\x83\x6c\xa9\x31\x6c\x4c\x75\x07\x56\x4a\x2a\x33\x4d\xaa\xf2\x9e\x46\x74\x1c\x60\x02\xe9\xaa\x35\x43\xa0\x6e\xf1\xf9\xc8\x33\xd8\x54\xaa\xe2\x1a\x8e\x88\xd2\x10\x52\x0e\x80\x54\xaa\x7f\x65\x5e\xc9\x23\x96\xa3\x4d\xc6\x36\xf9\x9d\xc5\x5c\x5e\x44\xcb\x15\x73\x3c\xb3\x11\x58\x72\x79\x9c\x6c\x73\xe5\xf2\x08\xea\xd2\x1a\xe1\xef\xd4\x75\xe2\xa4\x1a\x5e\xfc\x36\x64\x53\xe4\xae\xee\x98\x2b\x74\xc8\x98\x19\x4b\x12\x00\x24\x05\x26\xf4\x41\x80\xd2\x78\x8c\x69\xea\x29\x74\x35\xc4\x11\xba\x8e\xa7\x89\x30\xb3\xf7\x89\x38\x4b\x81\xdf\x73\xec\xdc\xbb\xee\x82\xba\xa3\x73\xd1\x5e\x86\x28\x03\x58\x59\x31\x47\x46\x0c\xfd\x2d\xb7\xbb\xb9\x68\x94\x9a\xd3\x6e\x3c\x21\xc2\xce\x24\x97\x7b\x98\xbc\x73\x07\x71\x4a\x02\x06\x1a\x26\x45\xa6\x1a\x83\x26\xf2\x9e\xa7\x94\xad\x4e\xba\x7f\x96\x95\x5f\x6e\x39\xee\xd0\x88\x72\x89\x2d\xfa\x67\x5d\xe3\x22\xe2\x21\xbf\x6c\x7b\xef\x8f\xc1\x68\x62\x4e\x3d\xc4\xb6\xea\xbc\x98\xbe\x59\xcb\x00\xab\x85\x5b\x2c\x99\xce\x33\xb9\xf8\x39\xda\x94\xda\x57\x3f\x2d\x90\xba\xc8\xb1\xc9\xee\xa0\xab\x38\x7a\x96\x51\xf9\x99\xbb\x3b\x4a\xc1\x0b\x47\x71\x3c\x41\x7e\x2f\xbe\xb4\x6c\x83\xc5\x5d\x7e\xc6\xa1\x3d\x73\x77\x18\xb8\xa8\x68\x55\xee\xa7\x78\x5b\x22\xaf\x56\xa9\xc5\x23\x0e\x27\xd0\x53\xb0\x7f\x59\x64\xdd\xd8\x36\xbe\xfe\x28\x8e\xf0\x03\x70\x3c\x80\x8b\x36\xf3\x3d\x04\x5e\x94\xd8\xc9\x48\xb1\xb9\x1b\x99\x9c\x8b\x44\x15\x8e\x38\x3f\xb5\xda\x93\xd9\xcf\xc8\xd6\xdb\xfd\x08\xf9\xe0\x79\xab\xc5\x22\x2c\x8c\x2c\x64\xc4\x79\x2f\x06\x61\x0b\x4f\x23\x8c\x1f\xd4\x70\x88\x69\x78\x11\x85\x83\xb0\xef\x47\x19\x0b\x28\x19\xd2\xde\x03\x48\xda\x8e\xed\x98\xfc\xab\xe4\x41\x4c\xcf\xca\xf2\x9b\x7b\x08\x1b\x63\x36\xaf\x93\x85\x23\x0c\xbe\x6c\x7a\x35\x67\xac\x91\xd5\x2c\x4c\x8c\x94\x76\x83\x31\x77\xd0\xf0\xbd\xa5\x7a\x91\xfd\xb3\x95\x8d\xdd\xb0\x85\x71\x68\xff\xcb\x03\x38\xab\xcd\x6a\xb5\x5a\xbd\xd6\xa8\x35\x3d\x54\x9b\xd5\x5a\xb5\x76\xad\x53\x5b\x3b\x7f\x30\xc0\x1e\xea\x94\x0e\xbd\xc2\xc2\xd7\xf1\x19\x31\x56\xec\x15\x73\x08\x86\xe5\xca\x1f\xe8\x7f\xbf\x7e\x85\x98\xbd\x9a\xa8\x31\x40\x15\x31\xbd\x3f\x6c\x5a\x14\x85\xf2\x1f\x40\x95\x8c\x86\xf8\xcf\xd2\xc6\xa4\x3a\x00\x4a\x1e\x23\x1c\x5d\x64\x43\x6a\x7a\xe4\xe4\x22\xe5\x63\xc6\xe4\x0b\x65\xb1\x48\x31\x3b\x51\x3f\x0e\x08\xbd\x63\xfa\x43\x27\x77\x78\x5d\x1c\xfb\x53\x10\x00\x8e\xfa\x2b\x7b\x78\xe6\x6e\x73\x5e\x00\x99\x52\xab\x7d\xe1\xe0\x2e\x39\xb1\x96\x88\xec\x62\x89\x6b\x30\x2f\xac\x8b\xa5\x8a\x32\x24\x1f\xb2\xc1\xfa\x42\xd1\x5c\xd8\x54\x38\x63\xb9\xf0\xa9\xfa\xfa\x15\xed\xe1\x59\x61\xf8\x96\x39\x04\xd4\xf7\x33\x1c\xb1\x3d\x5f\xa5\x20\x07\xf3\x77\x13\x92\x74\x0f\x9b\x0f\xf8\x29\xe3\x86\x12\x65\x42\x9a\xdf\x45\xef\x75\xcb\xe2\x52\x86\x36\x04\x76\x75\x1e\x3f\x43\xbc\x69\xb8\x53\x9a\x41\x49\x9d\x29\xd1\xc0\xce\x8b\x85\x23\x21\x03\xfb\xab\xc1\xb0\x2c\xbe\x8a\xd9\xd0\x17\xa1\x0e\x72\x12\x73\x97\x0e\xd3\x93\x9c\xc7\x28\x3c\xc7\x01\xfc\x44\x65\x49\x14\x7e\x5e\xc7\xe8\x54\x77\xe4\x8f\x27\x08\xcf\x20\x92\x64\x2f\xd4\x3b\x47\xef\x55\x49\x19\xf3\xb6\x81\xde\xa7\xf6\x6d\x41\x52\x14\xc4\xff\xe1\x08\x94\x0e\xf5\x89\x48\x1a\x61\xd8\x6a\x91\x9f\x21\x1f\x65\xe1\xd8\x22\x71\xdb\x42\xb2\xcb\xdd\x75\x27\x85\x90\x07\x87\x14\x45\x9b\x04\x3d\x36\x0b\x67\x21\x8f\x8a\x4d\xfe\x53\x69\xb4\xd0\x32\xaa\x84\x14\xe3\xe7\x68\xbd\x5a\x15\xd1\xb2\x9d\x52\x3c\x85\xa3\xf6\x78\x09\x85\x22\xdc\xf6\xd7\xcd\xbc\xe9\x57\xaf\x78\x1b\x96\xf2\xa2\xd1\x12\x82\xbf\x73\x5b\x92\xc7\x94\x2e\xae\x3b\x8d\xa9\x3b\xca\x7d\xd9\xee\x6f\x22\x73\xb0\xcb\x64\x0c\x36\xa9\x50\x6c\xb6\x4b\x9b\x2a\x9a\xb6\x1c\x2b\x7e\x18\xf9\x3d\xfd\xe4\x21\x1d\x00\xca\xb2\x53\x1a\x83\x83\x08\x81\x8a\x60\x18\x66\x77\x15\x05\xf3\xc5\x29\x56\x97\x83\x49\x91\xcf\x65\x43\xf7\x5a\x58\x93\x29\x47\xd9\xe2\x22\x39\x99\x8c\x9d\x61\x58\x44\xb5\x33\x01\x83\xc7\x99\xdf\x84\xa5\x43\xff\x80\xf4\x9b\x0d\x42\xfa\xa9\xc2\x17\x2c\x04\xaf\x88\x52\x9b\xe8\xc0\xcf\x86\x2b\x7d\x1c\x8e\xf2\x9a\xab\x68\x81\x88\x44\xf6\xf3\x6f\xa9\x9d\xc7\x61\x8e\x64\x1c\x7f\x6f\x6b\xf7\xc9\x8e\xbb\x32\x2d\x18\xe7\x5d\x95\x16\xe6\x9d\x73\x65\xb0\x70\x52\xa3\xb8\xca\xd1\xcf\xcd\x93\xf3\x8a\x49\x23\xcc\xfc\xbe\xe6\x34\xa9\x23\xf5\x16\x9f\x02\x49\x6c\x18\x84\xa3\x11\x0f\x3b\xcb\xdc\x24\xe0\xbc\x35\x5f\x28\xe1\x87\xb9\xc8\x76\xe8\x95\x41\x39\x5d\x7c\x4a\xcd\x32\x83\x54\x8a\x50\xee\xcb\xf8\xac\xc4\x11\x8c\xb9\x82\xd4\xdd\x27\x2d\x5a\x42\x26\x93\xc8\x7e\xc4\x92\xd9\x83\x79\xa0\x22\x5f\x13\xf5\x86\x7c\xfc\xf1\xca\x1d\x65\xfe\xe3\x15\xda\x24\xff\x3a\x12\xa8\x8d\x3f\x7e\x21\xdb\xcc\xac\xe9\x07\xb8\xb3\xde\xd3\xc3\xaf\x8b\x62\x7e\xfa\x19\xc9\x9c\xa3\xe0\x9e\xa0\xc4\xdd\x1d\x6d\xb5\x52\x9b\xbd\xa8\x75\x5e\xa0\xe7\xa4\x0b\x5f\x60\x4f\xdf\xdd\xdd\xdd\xad\xa2\x25\xfa\xe2\xe7\x9f\x51\x6d\x56\xaf\xc1\x76\x4f\x10\x70\x6c\xf7\xb4\x8b\x95\xda\xac\xd5\x69\xd7\x28\xb0\x2b\x1d\xd8\x55\x59\x60\x30\xbc\x38\x9d\x82\xa7\x4f\x05\xd0\x78\xf5\x8a\xd6\x44\x4b\x08\x46\xba\xb0\x3e\xab\xbb\xba\x09\x75\xd8\x5f\x71\xd9\xa5\x4d\x54\x5b\x69\x3b\xcb\xc0\x98\xb2\xa2\xcf\xa9\xbd\x0d\xa7\xb6\x2a\xfa\x19\xad\xb4\xd1\x7f\xa1\x3a\xda\x40\xcb\xf5\x32\x22\x8a\xc1\x39\x54\x71\xc3\x43\x49\xdf\xef\x0f\x31\xcb\xae\x33\x5f\xe0\x20\x35\x3f\x12\x7a\x4c\x2a\x15\x5a\x95\x1c\x95\x14\x24\xc9\x6e\x22\x0d\x86\xfd\x8a\x89\x56\xdd\x44\x1f\x93\x0a\x2d\x0f\x04\xb9\xd6\x5b\xb3\xf4\xe9\x2a\xcf\xe1\x53\x11\xe5\x73\xf8\xe8\x2b\xaa\x95\x0c\x6b\x1e\xe1\x2b\xc9\xd9\x09\x6e\x1d\x99\x02\x24\xe2\xe9\x7b\x9e\x68\x23\x69\x77\x3e\x65\x47\xfb\x79\x86\x34\x38\xea\x83\x21\x0d\xfd\xaf\xdd\x90\x66\x0f\xcf\x4c\x4d\x80\x0d\x1c\x29\xb8\x49\x81\xae\xd0\xdf\xe5\xe2\x6f\xea\xea\x8b\x21\x9e\x95\x56\x61\x94\x38\x79\x2e\x18\x55\xb3\x54\xeb\xf7\xc5\xc8\x87\x78\x66\x86\xd0\x64\xe3\x27\x1d\xed\xe7\x27\x12\xb2\x06\xce\xbc\xed\x31\xf5\xaa\xf4\xc9\x33\x5d\xf4\x18\x49\x67\xdd\x04\x34\xc4\xb3\xee\xd0\x4f\x4a\xe7\xd9\x4a\xe7\x1e\xe8\x20\x47\x5a\x48\x0f\x72\x57\x77\x3c\xc4\x71\xec\xd8\x1a\x07\xb0\x04\x48\xab\x9a\xab\x7d\xea\x9d\xaa\x8d\xdf\xd9\xaa\x92\x76\x6a\x83\xe2\xba\x0e\x06\x21\xc0\x7d\x8a\xc3\xa8\xf2\xec\xd9\x2d\x22\x6e\x4a\x14\x4e\xd7\xdb\x22\x9a\x1e\xbe\x52\x28\xe1\x96\x5f\x30\x0e\xe1\xe9\xcf\x97\x9a\xf8\x62\xa3\x36\xdb\x62\x3d\x96\x8f\x94\x49\xab\x2c\x96\x28\x85\xd6\x79\xc7\x8f\x2e\xf4\x91\x1d\x65\x16\x59\x35\x57\x8b\xa4\xa6\x93\x1b\x65\x5b\x68\xa3\x20\x3f\x26\x5d\x2d\x4d\xd0\x4c\x40\xa7\xf7\xa3\x8c\x75\x76\x25\x9d\xf6\xd2\x2c\xa9\x84\x1e\x6a\x54\x3d\x48\xc2\x97\xab\x2c\xc8\x8a\x5a\xaf\xda\x1c\x70\x17\xde\xf3\x94\x61\x5a\x45\x8d\xb2\xee\xb3\xef\xfc\x2c\x8c\xea\xe5\x36\x2d\x56\x96\xef\x5b\xe2\xf1\x76\x5b\x17\xab\xfe\xe7\xed\x5e\x65\x11\xb8\xaf\x35\x35\x82\xf6\xec\x7b\x18\xc5\xe5\x3f\x6a\x1b\xa3\xc3\xf1\x1d\xef\x64\x12\x82\x74\x47\xa2\x53\xb7\x32\x48\xe2\x31\x79\xdb\x8d\x03\x0c\x9b\x54\xd9\x0d\x49\x06\x78\x87\x3d\x49\xa1\xdb\xdb\x6f\x4b\x82\x1c\x17\x5a\x0c\xdf\xf5\xe6\xc4\x56\x11\xdd\x9f\xe4\xe5\x56\x7e\x8b\x12\xb5\x16\xdb\xa5\x44\x35\xb1\x51\x89\x37\x0f\xbd\x57\x69\x4d\xcf\xcb\xe5\x1c\x4a\x5a\xf4\xbc\xb7\x2b\x7d\x46\xd0\x5b\x59\x25\xe4\x6b\x42\xdf\xaa\xec\xba\xc5\x85\xb7\x2a\x0d\xe1\xb2\x3b\xd5\x87\xd3\xdd\xe5\xf5\x72\x1b\xd5\x87\x6c\xb0\x2e\xb6\x29\xf6\x70\xbb\x4d\x8a\x36\xfa\xe7\xed\x51\x25\xdb\xbf\xaf\x95\x35\xcd\x06\xeb\xf6\x0d\x8a\x8c\xe2\x43\x6e\x4f\x59\x72\x5d\x60\x60\x14\x60\x72\x44\xff\x70\xbc\xdf\xe5\x9e\x4e\x15\x9c\xf6\xfd\x09\xae\x14\x6c\x9c\x26\x5b\x46\x7d\x3f\xeb\x0f\x51\xc5\x4c\x1f\x0d\x28\x0c\x93\xf8\x0a\xe8\x16\x32\xae\x54\x9e\x1d\xf8\xa3\x41\x9c\x8c\x71\xc0\xa6\x21\xf0\x33\xdf\x4c\x41\xb7\x38\x03\x97\x27\xf5\xf6\xfc\x9b\xcd\xd5\x22\x64\xf2\x5d\x33\x6f\xa0\x30\xca\xba\x73\x32\x2c\xcf\xb8\x59\x1d\x97\x31\x80\xb2\x35\x4c\x23\x46\x3d\xd4\x42\x40\xa1\x2b\x0e\xa7\x5a\x3a\x00\x8d\x48\xc1\x0b\xb9\x30\x71\xc0\xb2\x99\x49\x5e\xe8\xce\x4c\xbc\x92\x9d\xec\xb5\x94\x12\x6d\x3c\x4d\x33\xd4\xc3\x28\x24\x23\x3a\xc6\x51\x46\xf3\xac\xf9\x70\xbd\x9e\xe0\x4c\x78\x2c\x94\xca\xed\xab\xe5\xe9\x54\x95\xfb\x34\xc7\x21\x75\xad\xca\x13\xc4\x7f\xc6\x93\x0c\x4d\xa3\x09\x4f\x1a\xa8\x66\x07\x95\x6c\x5a\x6a\x16\xee\xfb\x9a\x8d\x03\x64\x1a\xdc\x12\xa3\x20\xbc\xc4\x5c\x9f\x4b\x9a\xc1\x41\x76\x57\x66\xcd\xa3\x8d\xf4\x33\x96\x44\x9b\x25\x31\xcd\x62\x14\x66\x29\xf7\x8a\x41\x84\x82\xef\x7a\xc7\xd4\xb3\x22\x4f\x13\xe2\xba\x2f\x99\x4a\x65\xdd\x65\xe6\x7d\x08\xac\x94\x6d\x36\x03\x90\x81\x93\x79\x2a\x6a\x3b\xab\xce\x94\x68\xf9\x68\xdb\xcf\x7c\x2e\xac\xd7\xca\x4a\x9a\x5b\x41\x90\x42\x1b\x3c\x2f\xb8\x63\xa4\x19\x2d\x94\xdf\x14\x45\x90\x05\x23\xf3\x38\x33\x76\x41\x74\xcd\x33\x27\x00\xca\x2f\xa9\x4f\x89\x2f\x59\x50\x52\x7b\x62\xe0\x78\x0f\x33\x99\x1f\x29\x3a\x95\x67\x26\xbf\x2f\x55\x6f\xfe\xde\xc8\x4a\x96\x49\x66\x6e\xba\xd7\xe7\xe9\xe8\xe4\x80\xa2\xd2\x00\xb1\x60\xa2\x2a\x28\xd9\xc7\x19\xc8\x68\x4e\x9c\x48\x46\x6b\x12\x53\x06\x0c\xe7\x47\x4a\xdb\x82\xae\xb9\xc8\x97\x9b\x12\xd9\x80\x19\x44\xbb\xb4\xa9\x26\x49\x2f\x4b\xc1\x3c\xd7\x69\x8a\xfc\x4b\x3f\x1c\x41\xc4\x2e\xca\x17\x80\xd9\xb9\xa9\xe6\x54\x72\x56\x09\xa3\xcb\xf8\x33\x4e\xf5\x24\xc3\x15\x96\x1c\xd8\x43\x57\xc3\xb0\x3f\xb4\xb2\xea\xde\x75\x01\xab\x36\x5b\xe5\x0b\xa5\x17\xc7\x23\xec\x47\x37\x28\x88\x77\x47\xd3\x74\x88\x7e\x1d\xe2\x8c\xc6\x33\xe1\xb9\x68\xc1\x5d\x6b\xe2\x27\xc0\x28\xd8\xab\x9c\x6b\x0b\x76\x7d\x8b\x70\x20\x82\xd3\xc3\x88\xdf\x7d\x9b\x17\x00\xb7\x29\x21\xb9\xd6\x0c\x4f\x95\xeb\x8a\xcb\xb1\x20\x18\x7b\xa6\x60\x35\xd6\x2a\x2d\xaa\x2c\x3e\x3a\xe0\x0b\xea\x4c\xd8\x12\xc9\x89\xdb\xa2\x2d\x21\xaf\xb9\x71\x1a\x8c\xac\x4b\xad\x42\x3e\x4a\x86\x66\x2e\xba\xe7\xc5\x73\x59\x61\x53\x4b\xc9\x5c\x54\x98\x43\xcf\x6b\xdb\x23\xfa\x75\xe3\x69\x94\x71\xfa\xb2\x30\x13\x02\x34\xa2\x89\x84\x8f\x21\x6e\xf1\xa6\x8a\xff\xaa\xd6\xe4\x4b\x93\x17\xb9\x86\x9c\x61\x70\x1c\x4f\xa3\x00\x4d\x27\xd4\xa1\xb0\x3f\x9a\x06\x58\xa3\x7b\xb3\x9a\x86\x51\x6e\xe4\x22\x7f\x28\x1f\xdb\x56\x60\x11\xc4\x57\x91\x8c\x47\x1c\x8d\xae\xd1\x60\x2a\x16\xa5\x25\x92\xfe\xea\x2a\x1a\xe1\x94\x3a\x55\xda\x65\x2d\xe0\x1b\x09\x1e\xfb\x61\xa4\x0a\x57\xe5\xfa\x35\xf6\x67\x15\xa5\x5f\x70\x71\x8a\x96\x6d\x99\xd9\xbd\xf9\x57\xaa\x62\xce\xa9\xe6\xc1\x35\xe5\x40\xc9\x1c\x0f\xa5\xf5\xe7\x48\x22\x40\x17\x3d\x01\x6d\x38\xc9\x89\x7c\x55\xfb\x18\x46\x15\xb9\xc9\xe7\xa8\xe5\x29\x74\x66\x33\x9f\xe4\x19\xbc\x6d\x44\x42\xe8\x4e\x02\x58\xec\xb6\x45\xf9\x3c\x55\xb3\xb0\xdf\xaf\xe4\x11\x10\x6f\x97\xa4\xf5\xe4\x34\x9a\x20\x98\xe1\x84\x9c\x26\xc5\xc6\xb0\x9c\x1f\x10\xc0\x19\xd2\x5e\x91\x71\x17\x75\x0f\x12\x5c\xc5\x96\xab\xde\x35\xc7\x48\x49\x81\x95\x33\x7c\x98\x72\xb3\xa8\xc2\x7d\x65\x16\xa6\x27\xc3\x92\x47\xd4\x82\x86\xc2\xc9\xd0\xf2\xa6\x3c\xd3\xf3\xa9\x92\xc7\x16\x2d\xc2\xd6\xad\x70\x52\xf1\xf7\xe4\xa6\xef\x6a\xec\x56\x3a\x0b\x65\xa1\x93\xd7\x1d\xad\xdc\x1c\xbb\xe1\x9f\x64\xf2\xf6\xd1\xd8\x10\x73\x4c\xac\x33\x56\x68\xf1\xa6\xf2\x30\x71\xd2\x74\x64\xa2\xe7\x67\xf0\xa1\x9f\x42\x86\x5c\xe7\x89\x7b\x6e\x2a\xf2\x9c\x5d\xcb\x3e\x50\x74\xd2\x19\x74\x1a\x76\x0d\xa7\x28\x8e\xa4\xa3\x70\xbd\x83\x2a\xed\x7a\x03\x2c\x59\xab\x96\x63\xf1\x1e\xad\xcc\x8f\xc1\xe2\xd1\x7e\x1e\xbe\x97\xa8\xaf\x45\x19\xc8\x0a\x03\xa6\x16\xb9\x9a\xd1\x41\x58\x20\x27\xf9\x6d\xa3\xdb\x91\x86\x10\x0d\x91\x3c\x2f\xc8\x5d\x69\x1b\x12\x31\x07\x4a\xe8\xb6\x93\xbd\xad\x46\xbb\x63\x77\x12\x2b\x4a\x75\x7d\xeb\x08\x6b\x3c\xb6\x5a\xf9\x30\x6b\x27\x58\x84\xf7\x70\x6b\x08\x4c\x35\xc4\x1c\x4b\xec\x5c\x93\xc2\x17\xce\xfd\xab\x4c\x18\xbd\xdc\x87\x8a\x04\x10\x96\x55\x3c\x6a\x09\xc7\x4a\x02\xd0\x0a\xf3\x32\xa5\x06\x7d\x6f\x66\xc3\x61\xd9\x98\xf9\x86\x7c\xbc\xd8\x58\x7f\x98\x04\xc0\x32\xe4\xc1\xa6\x69\xf9\xcb\x67\xec\x73\x46\x10\xa6\xc0\xf5\x38\xc2\xa5\x5d\x88\x28\x2b\x62\xfe\x43\x73\x97\xf7\x02\x73\x3e\x05\xbc\x2a\xcf\x18\x52\x36\x5d\x8a\x5a\x72\xbe\xea\x84\x16\x94\x09\x45\x19\x03\xc7\x7a\x74\x68\x24\x98\xc2\x46\x85\x60\x21\x0f\x36\xbe\x44\x48\x27\xf8\xda\x40\x49\xe7\x58\x53\xfc\xbd\x37\xdf\x89\x5d\x96\xe4\x26\x15\xb8\x38\x19\x24\x7a\x1f\x03\xca\x7e\x46\xf3\xc5\xb3\x9a\x79\xcc\x50\x14\xa6\x08\x0f\x06\xb8\x9f\x85\x97\x78\x74\x8d\x7c\x14\xe0\x34\x4b\xa6\xf0\xec\x81\x9c\xbe\x1c\x47\x7d\x5c\x2a\xca\x68\x49\x0a\x55\x12\x3d\x00\x4a\x79\x40\x6e\x28\xb1\xb8\xe6\x82\x0c\xc2\x3d\xed\x0c\x68\x93\x93\xa3\x48\x26\xe4\x50\x4b\x38\x4a\x17\x11\x7a\x41\xb5\xf9\x54\xcf\x8b\x2e\x44\xf7\xbb\x96\xf1\x35\x0f\x44\xc5\x60\xd0\xbc\xb5\x32\x4f\x80\x5f\x80\xb3\x4a\x23\xc4\x99\xec\xae\x34\x0f\xd6\xc5\x43\xca\xbb\x16\x8f\x94\xfc\xae\x5d\x6f\xac\x36\x1b\xe5\xc4\xfc\x94\x69\x7c\x94\xf8\xf7\x3e\x9b\xb4\x67\x22\x70\x52\x18\x65\x38\x19\x48\xd6\xc2\xc8\xb9\x2a\x38\x7f\x65\x5d\xe7\x54\x4b\xb7\x5b\x16\x1f\xd1\x47\x43\x3c\x9a\xe0\x84\x88\x3f\x25\x16\xc1\x2e\xc3\x8d\xf9\x06\xeb\x28\x7f\x83\x7b\x3c\x2a\x33\xe9\x4e\x15\xb4\xab\x2b\x1f\x69\xaf\xf6\xa0\x4b\x15\x9b\xb0\xe5\xd6\xcf\xc9\x55\x15\xe3\x41\x00\xed\xba\xdf\x33\xd6\x85\x3d\x00\x2e\x52\xcf\x8b\x6c\x25\xc2\x61\x51\xcd\x22\x96\x67\xb8\x54\x29\x7c\xf1\x63\xa3\x95\x9e\x08\x4b\xde\x3b\xd8\xea\xde\x3f\x3d\x11\x11\x9a\x07\xa5\x20\x2d\x30\xba\xfa\x4b\xd0\xd4\xde\xd8\xef\x97\xa2\xab\xb1\xdf\xbf\x0b\x6d\x89\xea\x77\xa2\xaf\xcf\xd8\xae\x42\x92\xe8\xab\xfb\x11\xd0\x22\xf3\x40\x89\x8c\x36\x42\xeb\x2e\x46\x6c\x85\xc7\x5f\xa1\x49\x9a\xe3\xc3\x40\xb0\x01\x27\x06\xf6\x23\xf7\x62\xe0\x99\x5a\x20\xa4\xef\x81\x9f\x0d\x69\x58\xdf\x27\xfc\x3d\x1b\xe6\x97\x79\xa4\xdf\x9b\x73\xaf\xdd\xfa\x5e\xc3\xfb\x32\x64\x2a\x3c\x1c\x71\xf5\xde\xe3\xfd\x72\xc8\x8b\xc6\xfd\x15\x18\xca\xf1\x7f\x5d\x41\x7f\xc5\x77\x08\xfe\x6b\x0b\xa0\x6b\x5e\x51\xf0\xa8\xb1\xf9\x94\x49\x04\x20\x45\x83\x95\xde\x17\x84\xa7\x51\x6a\x4b\x2e\x30\xae\x30\xb2\x9d\x56\x39\x13\x2d\x56\x96\x1b\x69\x89\xc7\xdb\x99\x69\xb1\xea\x7f\x9e\x9d\x56\x59\x04\xee\x8b\x53\xf6\xa0\x3d\xbb\xa9\x16\xc5\xe5\x6f\x60\x4b\x6c\x94\x1f\xfb\x13\x21\x1c\x8e\xfd\xc9\xe2\xb1\x17\x2c\x2e\xe2\x26\x08\x97\x55\x26\x1d\xf3\xdb\x1a\x2c\xa3\xa5\x4d\xd4\x74\xdb\x2c\x5f\x67\xb8\x6e\x31\x5a\xa6\x7f\x2e\xd3\x65\xfa\xe7\x34\x60\xe6\x80\x1b\x39\xe0\x4a\x88\x96\x50\xbd\x6a\xb1\x89\xe6\x5f\xca\x58\x46\x73\xc0\x4d\x0d\x70\xc3\x09\xb8\x61\x05\x6c\x87\x9c\x25\xe1\x64\x04\x57\x2f\x15\x3a\x2c\xaf\x5e\x81\xdf\xc4\x57\xfa\xdc\x20\xcf\xeb\xe4\x11\x50\xb0\x41\x11\x53\xf1\x89\x4e\x45\xe5\x13\x7a\x45\x5a\xff\xe9\x27\x04\xd8\x7c\x42\xcf\x51\x6d\x65\xad\x2d\xcd\x50\xf5\x25\xfa\x54\x10\xee\x42\x9a\x7b\x6a\x0b\x3e\xf6\x27\x60\x33\xbb\x95\x55\x2a\x1c\x61\xe8\x74\x07\x3d\x47\x95\x26\x5a\x46\x9f\xaa\xac\xa7\xcd\x81\xd5\xdb\xc9\x88\xcf\x60\x2a\x2e\x82\x80\xa7\xfb\x36\xa9\x91\x7d\x20\x28\xa1\x4d\x24\xa1\xd3\x31\x9c\x49\x20\xb6\x5e\x5e\xdc\x6e\x1c\x3c\x0c\x47\x18\x55\xe4\x7e\xb2\x70\x01\xae\x58\x23\xd6\x61\x91\x9b\x59\xbc\xcf\x8c\xb3\xca\x50\xef\x60\x27\xaf\xf0\xe4\xdb\xdb\x59\x0a\x56\xbb\x10\xa3\xff\xae\x4d\x2d\xd9\x0e\x41\xed\x7a\xe4\xad\xa4\xbc\xb9\xa5\xa8\xb5\xe0\xe6\x20\xea\x09\x43\x79\xf1\x46\x18\xca\xcf\xe7\xfb\x46\x89\x04\x5f\xe2\x24\xc5\x07\x52\xc1\xfc\x95\x2d\xae\xd9\x0f\xf9\x67\x27\x75\x17\x02\xb5\x6d\x01\xfc\x4f\xe7\x3f\x84\xfd\x90\x15\xca\x3a\x58\xc8\x69\xd4\x86\xcf\xf8\xc2\x66\xb6\xf9\x9f\xaa\xe7\x68\x13\x7d\x2a\x17\xab\xd3\xc2\x52\xf6\x2f\xa2\x38\xc1\xdf\x8c\xab\x48\x20\xf7\xa3\x00\xfc\x9c\xf3\xe9\x0e\xc9\x9b\xc3\xc1\x3c\x9e\x21\xb5\x43\x61\xfc\xb0\xb9\x89\x96\xeb\x73\x78\x92\x4c\x61\x72\xed\x5b\x31\x62\xab\x48\x90\x88\xb4\x97\x29\x7e\x17\xc7\x93\x7c\x49\x78\x3a\x0e\x9e\x34\xa3\x8a\xc8\xa1\xdd\x78\xfa\x93\x0d\xf4\x6c\xeb\x75\x77\x7b\x67\xf7\xcd\xde\xfe\x3f\xdf\xbe\x3b\x78\x7f\x78\xf4\x7f\x8f\x4f\x4e\x3f\xfc\xf2\xeb\x6f\xff\xfa\x1f\xbf\xd7\x0f\xf0\xe0\x62\x18\x7e\xfa\x3c\x1a\x47\xf1\xe4\x7f\x93\x34\x9b\x5e\x5e\xcd\xae\xbf\xd4\xea\x8d\x66\xab\xdd\x59\x5b\x7f\xb1\xb4\xba\xc9\x22\xdc\x8a\xa3\x9d\x58\xb4\x0b\xa3\x9a\x0f\xb1\xc3\x2b\x25\xb7\xdc\x50\x2c\x4c\x6d\xa2\x90\xd6\x8e\xcd\x4d\x85\xcc\x74\xe8\xd8\x6f\x98\x63\x57\x4a\x84\x24\x69\x79\xe4\xd4\x24\x3b\xb0\xa0\x65\x54\xaf\x9e\x83\xf7\x4a\x2e\x30\x35\x4c\xe2\xe2\x40\x1b\x65\x80\x56\xcf\xf9\x06\x2f\x8b\x61\x16\xa8\x54\x20\x8a\x94\xc8\x3d\x5f\x89\x30\x03\xe8\x7f\xa5\x2d\xca\xbe\x35\x51\x71\xf0\x1e\xc4\x86\x78\x69\x49\xf9\x20\xc8\x56\xfc\x60\x14\x69\xc4\x96\xb4\x86\x45\xb8\xc9\x73\xf7\xe8\x87\x7c\x69\x8f\x78\xe9\xcc\xec\xd3\x7e\x3c\xfa\x3f\x1e\xfd\xc5\xd1\xff\xc3\xe9\xee\x72\xbd\x83\x5e\xef\x94\x76\xd0\xaa\x77\x5e\xef\xc8\x3e\x5a\xf5\x8e\xfa\x04\x5f\x6f\xef\xb4\x45\x91\xf9\x73\x1d\xb7\x4a\xe2\x70\x8f\xce\x5b\xf5\x8e\xd3\x7b\xab\xde\xf9\x1b\x68\x04\xca\x1f\xd6\x61\x30\xee\x72\x56\xb7\xfb\xfb\x83\x65\x54\x1c\xe0\xa3\x38\x8c\x32\x97\x93\x71\xbd\xe3\x70\x32\xb6\x1e\xa6\x73\x4c\xdd\x5e\xc6\xa2\xc9\xb2\xae\xc6\x12\xd0\x3b\x9c\xa0\x74\x22\xbe\x93\xb3\x1a\xd0\xe6\xa2\x6b\xe3\xbb\x3e\x46\xd1\x55\x25\x5c\xd6\xf8\xe2\x5b\xc8\x67\x0d\x2a\x2d\xe6\x6b\xcc\x6b\x09\xf9\x96\xbf\x78\x68\x4f\x63\xb5\xe1\x72\x8e\xc6\x75\x90\x7d\x04\x86\xaa\x9b\x31\x11\x81\xf2\xc5\xd2\x20\x8b\x45\x0b\xc2\xe6\xa6\x70\x97\x94\xa3\x8d\xce\xf3\xf2\xa1\x30\x18\x59\xbe\x2b\xb1\x87\x49\xfb\xd4\xbb\x3b\xef\x53\xef\xbe\x83\x7d\xaa\x0c\x0e\xf7\xbd\x4f\x59\x97\xd3\xbb\x9d\xc7\x6d\x4a\xfc\xdd\xdb\x36\x95\x5e\xf9\x93\x9d\x28\x08\xfd\xa8\xb2\xe8\x8e\x65\x3b\x92\x7f\xff\x5b\xd6\xbb\x87\xd9\xb2\xca\x2c\x93\xef\x7f\xcb\x7a\xb7\xa3\x6d\x5a\x8f\x3b\x96\xb1\x63\x49\x2b\x66\xa1\xcd\xeb\x9b\xee\x5e\x62\x5e\x24\x6c\x09\x20\xa5\x8f\x3c\x1a\x3e\x7c\x61\x77\x27\x74\x71\xd7\x6a\xe4\xff\xe1\x62\x85\x7e\x24\xdd\x67\x5f\xe9\xb7\x7c\xf9\xcf\x53\x17\x00\x61\xb9\xb5\x05\x9d\x3b\x69\x0b\x58\x8e\xda\x6f\xa9\x34\xf0\x90\xf4\x2a\x1d\xfa\x75\xed\xd5\x70\xec\xf7\x1f\x50\xb5\xe0\x21\xde\x2c\xfc\x82\xd6\xfe\x0e\xea\x06\x23\x5f\xec\x2d\x54\x11\x8a\x11\x8b\xf4\xe5\x60\xbb\x0d\x35\xc1\xe4\xe6\x60\xbb\x6d\x93\xf1\xc0\xc4\xf9\x33\xbe\xa6\x59\xb0\xa9\x1d\xac\xe8\x2b\x38\xff\xfa\x51\xc6\x93\x78\xc7\xc9\x98\xda\x68\xef\xfc\x72\xf4\x11\x36\xdd\xd3\xf8\x2d\xce\x85\x41\x74\x75\x75\xb5\x12\x4f\x70\x94\xa6\xa3\x95\x38\xb9\x58\x0d\xe2\x7e\xba\x0a\x49\xb8\xe3\x55\xad\xce\x30\x1b\x8f\x2c\x8a\x90\x9d\xcb\xc9\xdb\xed\xdd\x1c\x6d\xf1\x5c\x32\x18\xc2\x7c\x1f\x10\x6d\x8f\x33\xbc\x5f\x58\xca\x73\xd8\xa3\xc8\xc0\xa4\xe4\x21\x8c\xb8\xdb\x8b\x14\xee\x39\x77\x75\x69\xa1\x4a\xbd\xb1\xae\x78\xba\x18\xf0\x1d\x46\x6a\x72\x58\x0c\x3d\x41\xca\xc1\x76\x7b\x1e\xb6\x61\xc6\x6c\x91\xf5\x20\xd5\xd2\x87\x2c\x46\x13\x6a\x75\x2a\x7b\xe7\x38\x76\x38\xc3\x2f\x46\xdb\x1d\xd8\xf0\x6c\xa0\x7a\x63\x1d\x4c\x48\x95\xaf\xb4\x73\x80\xb9\xf6\x25\xc7\x47\x69\xfb\xe6\xd6\x6e\x37\x0e\xa2\x7d\x68\x3f\x1c\x2c\x35\x7a\x0f\x66\xd6\x9f\x83\x81\xe1\x7d\x43\x69\x7e\x4e\x8a\xa6\xf9\x15\xff\xc8\xe7\x6a\x5d\xcb\xe7\x77\x5b\x30\x9e\x3a\x8d\xb5\x5a\x4d\x07\xbc\xa0\x77\xd0\x5c\xbf\x9f\x72\xf2\xee\x36\xa4\xf0\x27\x34\x42\xa8\x02\x12\x61\xfb\x90\x81\x95\x2c\xda\xdb\x58\xe9\xf3\xba\x34\x16\x80\x0d\x50\x41\xe5\xd4\x1f\x65\x68\x0b\xfe\xb3\xb8\x58\x0c\xd4\x45\xc9\xfb\x3e\xc8\x0b\x93\xcd\xe3\x73\x30\x58\xa1\x6e\x11\xb8\xc2\x3b\xe3\x01\x7e\x05\x79\x6b\xa0\xb8\x92\xdf\x51\xad\xb9\x90\xc0\xab\x4e\xb1\x45\xbc\x25\x2b\x9d\x71\x0f\xb3\xb6\xf0\x52\x23\xe4\xc1\x4c\x94\xf3\xd5\x61\x85\xe5\x72\x0b\x83\xd0\x02\x74\x88\xdf\xc2\xd8\xd8\x52\xa2\x2d\x72\x46\xce\x81\x09\x9f\x60\xf1\xc6\x79\x5c\xe6\x7b\x0c\xed\x11\x7b\xb2\x94\x93\x98\x38\x2d\x9a\xbf\xb0\x60\xf9\x86\x6d\x4c\x04\xbc\xfa\x91\x19\xb3\x68\xb8\x72\x83\x96\x57\x1c\x1f\xeb\x51\x80\x88\x71\xe0\x39\xe0\xbc\x60\x56\x5d\x96\x68\xd9\xf9\xd7\xca\x48\x0e\xc6\x90\x3b\x81\x30\x28\x9c\xd8\x24\xa3\x60\x83\x5e\xd5\xe6\x85\x3f\x9d\x59\x82\xd0\x84\x18\x38\xf3\xb3\x72\x50\xaa\xd3\x83\x92\x34\xd0\x85\x69\x7f\x34\xec\x05\xb2\xce\x51\xb0\x61\x6c\x19\x2a\xf3\x9d\x44\x56\x2c\x66\x8c\xb5\x0d\x6d\x94\xa5\x5a\x92\x8e\x86\xd3\x9f\x25\xda\x85\x08\x30\xc7\xeb\x95\xb5\xb9\x2e\xc5\x83\x65\xbf\xe3\x5b\xf1\xde\x05\xf9\xee\x3d\x7a\xdf\x5a\xfc\xca\xa4\xde\x94\xe7\xe6\x52\x25\x45\xbb\x21\xbd\x57\xb9\x7b\xfe\x01\x29\x5c\x5d\x6c\xda\x74\xbf\x76\x71\xf6\xc5\xaa\x79\xc8\x21\x36\xdc\x05\x4c\xa1\xd8\x20\x54\xc8\xb9\xac\xef\xda\x73\x4c\x17\x16\x36\xec\xaa\xc4\x02\x8e\x2b\xc5\xfb\xdd\xcd\xcb\x82\xe3\x3b\x85\x66\x3f\xbb\x7b\xfc\xf0\xb9\xd1\x5e\xf7\xf8\x91\x74\x63\x6d\x8d\x9c\xe9\xd7\xfe\xd2\x67\xfa\x7e\x38\x19\xe2\x64\xf9\x81\x4d\x04\xe0\xf4\x2e\x37\xf5\xe7\x1c\xe2\xcd\xcc\x9d\xf7\x72\x9a\xef\x42\xc7\x8e\x08\xc7\x49\xc5\xa1\x5d\x7e\xe9\x36\x21\x10\xef\xb5\x4c\x18\x4a\x0d\x72\x86\xf3\x33\xa8\x44\x7f\x72\x46\xcc\x2a\xee\xc2\xcb\x8c\x45\x55\xa0\x45\x16\x48\xa7\x41\x4e\x37\x74\x6e\x32\x3c\xcb\xc8\x29\xd2\x67\xcf\x68\x42\xfb\xc4\x7c\xb3\x78\xaa\x0d\x3f\xc0\xfd\x70\xec\x8f\x46\xd7\x2c\x0d\x68\x50\xfa\xe6\x46\x1e\x95\x1b\xd6\x0a\x1b\xb8\x53\x81\x86\xda\xec\xe2\xc9\x38\x6e\x83\xdf\x83\xa6\xe7\xc8\xa7\x44\xba\xd5\x91\x3b\xbf\xd8\xc5\x8e\x52\xd3\xe1\xa8\x25\x97\x59\xc9\x67\x37\x4f\x20\xb1\x87\x67\xb7\xcc\x04\x61\x19\x5e\x89\x7c\xe4\xfb\x86\x05\xa7\x53\xbb\x79\x08\xa3\xc9\x34\xbb\xcb\x9c\x72\xf2\x50\x89\xee\x16\x74\x76\x5f\xc4\xd1\xd7\x18\x85\x85\x3e\x6e\x9d\x54\x02\x46\xcb\x1e\xc2\x26\x9f\x9c\x4d\x94\xb7\x41\x2b\xbc\xb4\x52\x4f\x57\xa1\x1e\xae\x11\xc8\x01\x6d\xc8\x40\x6f\xec\xba\x79\xf7\x4e\x9b\x77\x57\xdb\x6d\xa5\x0d\x62\xa3\xdd\xf0\x34\xe5\xf9\xfa\xa3\xa9\xdd\xdf\x5d\xf7\xed\xda\x1d\x8d\x48\xe6\x45\x9a\x70\xf3\x90\x02\x0e\xc0\x42\xe3\x6a\x4d\x44\x45\x4a\x6c\xca\x8e\xaa\xf7\x93\x90\x1e\x5c\x5e\xe7\x72\xbc\xd2\x4a\xe2\x92\xaa\x28\x22\xab\x83\xf3\x32\xee\x27\x38\xbb\x27\xa5\x12\x91\x7f\xf7\xec\x81\x83\xa0\x97\x8c\x4d\xd8\x3c\x91\xa9\xa3\x6f\x59\x8d\xa1\xec\x1c\xec\x08\x10\x6c\xd5\x19\x09\x7d\x11\xf5\x51\x10\x8f\xba\x87\x7b\x81\xb7\xdb\x7d\xc6\x97\x85\x03\xd3\x9c\xf0\xb2\xf4\x50\x25\x45\x97\xd5\xc7\xc9\x6e\x88\x5f\xa0\x98\xa2\x1d\x7d\x2d\xc5\xc5\x64\x5d\x2f\x8a\x8c\xa9\x55\xe2\xfa\x02\x1d\x96\x3d\x4a\xe6\xd6\x68\x14\x5f\x21\x3f\xe9\x85\x59\xe2\x27\xd7\x88\xa9\x97\x3e\xe3\x6b\x4b\xdc\xc1\xcf\xb2\x46\xe2\x67\x6b\xc3\x05\x03\xa5\xab\x5b\xca\x8d\xd6\x1c\x67\x48\x82\x52\x81\x1b\x24\xc4\x7f\x03\xdd\x46\x9c\xa0\x30\x8a\x70\x02\xd1\x67\xe3\x69\x06\x02\x84\x1e\x85\x0f\x62\x26\x52\x1d\x23\x25\x43\xf6\x40\x5b\x31\x02\xd2\x71\x8d\x9f\x5c\x23\xb4\xd4\x58\x84\x04\x62\x49\x2b\x19\x17\xe9\x23\x43\xa9\x60\x28\x15\x34\x1a\xfb\xed\xf0\x18\xe6\x93\x5e\x03\x4e\xfc\x00\xf5\xe3\x28\xcd\xfc\x48\x6f\xde\x9a\x44\x4a\x9d\x63\xb7\x62\x4d\xe0\x7d\x16\x9e\xa3\xdf\x37\x51\x6d\xd6\xee\xd3\xff\xd9\xdc\x61\x8c\xc2\xcd\x0e\xfd\x5f\xb1\x66\x2c\xd6\x74\x62\xa1\xf6\x6c\xa3\xc8\x3f\x21\x0e\x19\xec\x40\x0f\x11\x85\x4c\x30\xf1\x7b\x89\x44\x56\x90\xaf\xcc\xc6\x8c\x2d\x03\x09\x9d\xb6\xf1\x71\x87\x9e\x54\xd5\x17\xe7\x0b\xe6\x76\x11\xc8\x60\x98\xbf\x9b\xf8\x63\x07\x5b\x5d\x16\x7d\x0c\xf0\x0a\x61\x89\x15\x46\x42\x59\x70\xca\xcb\x04\x22\x33\x4a\xdf\x7f\x30\x32\x99\x24\x78\x2b\x73\x83\x8f\x3d\x54\xf4\x30\x18\xea\xff\xf4\xe8\x61\x73\xc4\xd4\x45\x44\x44\xc2\x43\x73\x1a\x9a\x1b\x41\xcc\x5d\x63\x6e\x14\x31\x77\xd5\x07\x8a\x24\x76\x77\x6e\xd7\xa5\xea\x69\x18\x6f\xcb\x7e\x4c\xa4\x8b\x3d\x7b\x70\xb4\xc2\x80\x63\x85\x1c\x53\x1e\x2b\x0d\x68\x2e\xa1\x70\x49\x83\x5f\x32\x09\x54\xaa\xce\x90\x63\x63\xbf\x6f\xbf\x24\x12\x07\x7f\x87\x11\xdc\x8b\xbf\xb4\xc2\x7c\xd6\x69\x2d\x5b\x5e\x8f\xc2\xde\x32\x41\x25\x00\xdb\xd6\x54\xfb\x8a\xa3\xfe\x32\xd8\x34\x5a\xde\x53\x37\x4b\xed\xc3\x38\x68\xcf\x37\xbe\x4b\x87\x7e\xa3\xad\x83\x24\x2f\x1b\x3a\xb8\x74\xe8\xb7\xeb\x0d\xf3\x65\x73\xdd\x52\xb2\xa9\xbd\x4a\xc2\x09\x1e\x07\xf5\x4e\xcd\x6a\xfb\xa7\xbc\x9a\xf4\x3e\x07\x03\xbd\x1d\x7c\x39\xf9\x1c\x0c\x8a\xee\x1d\xd4\xae\xc7\x01\x5e\xee\x0f\x7a\xd6\xd7\x59\xe2\x78\xbd\x7c\x31\xf2\x83\xb1\x1f\xd9\x3e\xc7\x76\x60\xb8\xaf\xbf\x9e\xf8\xc1\xb2\x1f\xa5\xe1\xec\x45\x43\x1f\x04\xf2\x29\x4c\xe3\x7a\xad\xde\xd0\x47\x9c\x7d\x7a\xb1\xf6\x62\x4d\x9f\x21\xf2\xe9\x0b\x4e\x62\xe6\x7a\x6d\xf9\x1a\x39\xbe\x51\x1d\xd9\xf2\x10\xcf\xb4\x0f\x3e\xd6\x89\x8b\xc6\xdd\x08\x8c\xf7\x49\x5f\x9f\xdc\xc4\xef\xf5\xc2\xcc\xfa\x72\x79\x84\x2f\xfc\xfe\xf5\x43\xdf\x01\x89\xd5\x03\x4f\xfa\xa2\x81\x97\xf9\x5a\x11\x8f\x6c\x89\xc0\x33\x59\x19\x9a\x59\x28\x5b\x07\xe2\x77\xa3\x25\x7e\x13\xaa\xe7\xbf\x09\xb1\x8b\xdf\xf4\x57\x4e\xda\xb9\x7d\x29\xfc\x62\x84\x4c\x31\xa0\xf4\x6b\xdc\x61\x51\x74\x38\xb5\x4a\x4f\x59\xa2\x3e\x09\xda\xcc\xdf\xc6\x4a\x0d\x42\x89\xb4\x59\x99\x00\xc5\x1b\x41\x77\xf2\x1b\x4a\x6e\xe2\x8d\x4c\x65\xe2\x65\xa4\xbe\x92\x68\x0a\x9e\x09\x29\xc1\x8f\x9c\x82\xe8\xa8\xf4\xd9\x40\x31\x7a\x91\x7e\x73\x32\x59\x54\x11\xa9\x28\x20\x65\x5e\xbb\xb8\x62\xd2\x1d\x8a\x8d\x75\x69\xa3\x5d\xf7\x8a\xb5\xc9\x9e\x4a\x57\x1b\xed\x96\xa7\x10\xde\x46\xbb\xed\xe5\x13\xbf\xd1\xee\x78\xea\xe8\x6d\xb4\xd7\xf4\x1b\x61\x9d\x94\x37\x3a\x35\x8f\x51\xeb\x46\x07\xf0\x11\x94\xb2\xd1\x69\x78\x32\xad\x6c\x74\x5a\x9e\x8d\x5a\x36\x3a\x4d\x4f\xa6\x90\x8d\x4e\xdb\x93\xe9\x67\xa3\x03\x78\x29\x34\xb3\xd1\x59\xf3\x74\xaa\xd9\xe8\xac\x7b\x3a\xdd\x6c\x74\x5e\x78\x06\x91\x6c\xac\xd5\x3c\x0b\x39\x6d\xac\x01\xfe\x6c\x49\x6c\xac\x01\xf6\x8c\x34\x36\xd6\x5a\x9e\x41\x1c\x1b\x6b\x80\x38\x21\xa3\x8d\x35\xc0\x39\x5f\x67\x1b\x6b\x1d\xf9\x02\xdd\xcb\x97\xec\xc6\x1a\xbf\x5a\x27\x8b\x79\x63\xed\x85\xc7\x97\xea\xc6\x7a\xcd\xcb\x97\xf0\xc6\x7a\xdd\xcb\x17\xf7\xc6\x3a\xa0\x93\x53\xf0\xc6\x3a\x34\x2e\x18\xcd\xc6\x7a\xeb\xe6\xdc\xeb\xd4\x1e\x2f\x0f\xfe\xfc\xcb\x83\xee\x10\xf7\x3f\x93\x4e\xc1\x4a\xa1\x6e\x40\x34\xcd\x59\x3a\x9d\x90\x81\xc1\x2c\x3e\xb5\xd4\x6f\x90\xe3\x69\x48\x73\xf4\xc3\x26\x7a\xc6\x21\x3f\xb3\x58\x84\x08\x27\x8d\x7b\xbc\xae\x28\x34\xc7\x17\xed\x1c\xe3\x01\x4e\x30\x1c\xf4\x92\xf0\x02\xce\x64\x61\x14\x66\x39\x98\x74\x3a\xc1\x09\xa8\xae\x37\xb5\xf4\x1c\x12\x94\xad\xe9\xc5\x18\x47\x99\x56\x00\x65\x31\x1a\xfa\x51\x30\xc2\xca\xb8\xc9\xb0\x7b\x56\xc8\x8a\x4d\x0d\x54\x35\xdd\x01\x25\xdd\x37\x8d\x25\x4f\x4d\xa0\xc2\x28\x5b\x97\x34\xf4\x03\xb9\xbe\x50\x4c\xa8\xb3\x63\x1e\xf3\xf3\x1a\x54\x09\xff\x81\x40\x85\x17\x32\x36\xca\x21\xc2\x8a\x58\x4c\xd3\x7f\x01\xa4\xcb\x10\x5f\xb9\x50\x74\x36\x2f\x21\xbc\xcf\x51\x40\x5f\xbf\xaa\xe5\x39\xc1\x01\x96\xa0\x33\xe6\xd5\x7f\x20\x6b\x4e\xd8\x8e\xc0\xa2\xb3\x03\x37\xaa\x56\x8d\x56\x9c\x58\xd5\x3b\x76\xb4\xdc\x2d\x2d\x56\x63\x3f\xca\x9a\x8d\x45\x9b\x58\xac\xc6\xee\x28\xf6\x6f\x53\xa5\xd3\x82\xf7\x79\xf9\x5b\x92\xd2\x0a\xa5\x60\x0f\xc9\xaf\xae\x33\x7c\x08\xc9\x81\x8c\xd7\xb6\xbc\xcb\x0a\xfd\xed\xd1\x45\x97\xb7\x55\x66\x45\xe4\xa5\x17\x53\x21\xe4\xd0\x5e\x0b\xdc\xd0\xa6\x1d\x67\x8b\x66\x61\x67\xc6\xb2\xaf\x5e\x67\x36\xe3\xe7\x85\xdc\x05\x6d\xa8\x2c\x92\x4f\x3b\xaf\x7f\x16\x9e\xdf\x2a\x79\x76\x6e\xce\x1d\x7e\xc1\x54\x55\x9b\x3b\x8e\xaa\x45\x05\x63\xcd\x53\x5b\x78\x88\xb9\x11\xda\x3a\xa2\xcc\xb7\x35\xeb\x19\x19\x4d\xf2\x9a\xc0\x43\x11\x91\xfa\x64\x66\x6e\xb6\xeb\x4f\x26\xa3\x6b\xd6\xb0\x9f\x5c\x4c\x09\x0b\x4f\x8b\xfc\x15\x19\xbf\x5e\x99\x24\x71\x16\x13\x1c\x65\xce\x5d\x64\x38\xa1\xef\x3e\x76\x05\x4b\xa7\xfe\x28\xeb\xfc\x39\xb2\x0e\x04\x8c\xfe\x13\xe2\x12\x59\x73\x2a\x95\x30\x91\x80\x2d\x96\xde\xe3\xa1\x2c\xd7\xad\x93\x2a\xa7\x8c\x59\x48\x25\xa9\xea\x52\xbb\xf9\xb3\x49\x7a\x2e\xbe\xd2\x69\xd9\xb9\xc8\x29\x61\x13\x9b\x74\xf8\x56\xfc\x5e\x4a\x7f\xa4\x61\xc4\x82\xb1\x12\x96\x51\x9b\xd5\x6b\xec\xaf\x8a\xbe\xaa\x69\x7c\xd9\xf2\xaa\x54\xad\x16\xea\x07\xdb\x6d\xcd\x9a\xc2\x66\x00\xa2\x7b\x4d\xa2\x4d\x36\xaa\x16\x03\x10\x9e\xf6\xa6\xf0\x76\x2c\xd7\x04\xdb\x73\x15\x9f\x99\x9c\xb4\x36\xeb\xac\xb5\xda\x8d\x66\xad\xee\xa1\xda\x0c\x0f\xfa\x81\xdf\x5b\x7f\x61\xc9\xab\x58\x9b\xbd\x58\xef\xf9\x41\x7f\x80\x3d\x18\x98\x66\xa3\xdd\x5a\xeb\xa8\xe5\xce\x9d\x37\x62\x5a\x1a\x3d\xb9\x17\x07\x22\x93\x9e\x6d\xef\xba\xf2\x27\x08\x83\x7b\xf5\xfc\x3d\xa4\xde\x71\xef\x18\xee\xeb\x6b\x3e\x1b\x14\x89\x8f\x04\x1e\x4f\x2f\x88\x42\x47\x04\xde\x83\x8f\x52\xe9\x83\x33\xfe\x70\x6e\x73\x09\x91\x3e\x13\x82\x33\x0b\x90\xbf\x4a\xa5\x22\xc1\xa4\x9e\xe2\xe8\x2b\x92\x5f\xc2\x5e\xd7\xaa\x6a\x3e\xe2\xe8\x6b\x49\x80\x8d\x56\xd5\x02\x10\x42\x19\x2b\x2e\xe9\x26\xb8\xbb\x19\x87\xec\x29\x37\x14\xf6\xeb\x7e\x65\x48\x6b\x48\x1a\x53\xb4\x84\x6a\xba\xf8\xa0\x94\xae\x6b\xa5\xeb\x85\xa5\x1b\x5a\xe9\x46\x61\xe9\xa6\x56\xba\x59\x58\xba\xa5\x95\x6e\x15\x96\x6e\x6b\xa5\xdb\x85\xa5\x3b\x5a\xe9\x4e\x61\xe9\x35\xad\xf4\x5a\x61\xe9\x75\xad\xf4\x7a\x61\xe9\x17\x5a\xe9\x17\xc5\xb3\x53\xd3\x66\x67\xce\x64\xd6\xb5\xe2\xc5\xb3\x59\x6f\x68\xc5\x8b\xa7\xb3\xde\xd4\x8a\x17\xcf\x67\xbd\xa5\x15\x2f\x9e\xd0\x7a\x5b\x2b\xde\x36\xb8\xc1\xea\x2a\x61\xc8\x9f\xc3\xe8\x82\x54\x0d\xfd\x51\xcf\x26\x36\xfb\x64\x1b\x38\xb3\x0e\x54\x0f\x3e\x59\x07\xa5\x0f\x9f\xac\x03\x10\xc0\xa7\xa6\x0d\x9d\x6e\x7e\x07\xad\x7e\x23\x48\xec\xee\x56\x7c\x0f\xf5\x3c\xd4\xf7\x50\xe0\x49\x0b\xd4\x43\x68\xcd\x23\x5b\x68\xed\x5c\xe7\x0d\x01\xad\x17\x78\x48\x54\xcd\x47\xc8\x43\xa8\xde\xf0\xd0\xe9\x59\xdd\xa8\xd7\xa7\xf5\x68\x4b\xb4\x6a\xbe\x68\x49\xbd\x35\x52\xaf\x61\xd4\xeb\xd1\x7a\x02\x49\x5f\xaa\xd7\xf4\x10\x6a\x40\x7b\x4d\xa3\x5e\x51\xff\x5a\xa2\x7f\xad\x85\xfa\xd7\x16\xfd\x6b\x2f\xd4\xbf\x8e\xe8\x5f\x67\xa1\xfe\xad\x89\xfe\xad\x2d\xd4\xbf\x75\xd1\xbf\xf5\x85\xfa\xf7\x42\xf4\xef\xc5\x42\xfd\xab\xd7\x3c\xd6\xbf\xba\x49\x30\x45\x1d\xac\xd7\x3d\xd6\xc1\xba\x49\x31\x45\x3d\x24\x58\xd2\x1e\xd6\x4d\x92\x29\x24\xd1\xa6\xc7\x49\xd4\xa4\x99\xc2\x3e\xb6\x44\x1f\x4d\xa2\x29\xec\x63\x5b\xf4\x11\xa8\xc6\xec\xe4\x9b\x37\x8e\x4e\x7a\x08\xb5\x69\x27\x4d\xba\x09\x68\x45\x6b\x27\x09\xbd\xbd\xa0\x15\x4d\xc2\xe9\xd3\x8a\xf6\x4e\xd6\x3d\x44\x3a\x7a\x7a\x56\x37\x29\xa7\x47\x2b\x5a\x3b\x49\x38\x46\xa3\x06\x15\x4d\xd2\x29\xea\x63\x5b\xf4\xb1\x61\xe7\x35\xae\x3e\x12\x9a\xa3\x7d\x6c\xd8\x99\x8d\xb3\x8f\x6d\xde\xc7\x86\x9d\xdb\xb8\xfa\xd8\x12\x7d\x6c\xd8\xd9\x8d\xab\x8f\x2f\xf2\x3e\xda\xf9\x8d\xb3\x8f\x2d\xd1\x47\x3b\xc3\x71\xf5\x91\x30\x46\xd6\x47\x3b\xc7\x71\xf5\x71\x3d\xef\xa3\x9d\xe5\x38\x69\xb5\xe9\xf1\x3e\xda\x79\x8e\xab\x8f\x0d\x41\xab\x0d\x3b\xd3\x71\xf5\x71\x4d\xf4\xb1\x69\x67\x3a\xae\x3e\x92\xe5\x4f\xfb\xd8\xac\xdb\x17\xe4\xde\x9e\x9b\x58\x5b\x80\x6b\xd3\xce\x75\xf6\xf6\xec\x9d\x24\xc3\x4a\xd6\xd6\xe9\x59\xd3\xce\x75\xf6\xf6\x0a\x16\x64\x07\x2a\xda\xb9\xce\xde\x9e\xa3\x93\x2d\x0f\x35\x9a\x50\xd1\x24\x9d\xa2\x3e\xd6\xf3\x3e\xda\x99\x8e\xab\x8f\xad\xbc\x8f\x76\xa6\xe3\xea\x23\x4c\x24\xed\xa3\x9d\xe9\x38\xfb\x58\x13\x7d\xb4\x33\x1d\x67\x1f\x9b\x1e\xeb\x63\xcb\xce\x74\x5c\x7d\xac\x89\x3e\xb6\xec\x4c\xc7\xd5\xc7\xa6\xe8\x63\xcb\xce\x74\x5c\x7d\x24\xac\x9c\xf6\xb1\x65\x67\x3a\xae\x3e\xbe\x10\xf3\xd8\xb2\x33\x1d\x57\x1f\xc9\xf2\x60\x7d\xb4\x33\x1d\x27\xad\xb6\x39\xad\xb6\xec\x4c\xc7\xd5\xc7\x46\xde\xc7\x35\xfb\x82\xdc\xdf\x77\x0b\xaa\x1d\xda\x49\x3b\xd7\xd9\xdf\xb7\x77\x12\x68\x0e\x78\x40\xcb\xce\x75\xf6\xf7\x0b\xc4\x80\x36\x88\x80\x76\xae\xb3\xbf\x6f\xef\x24\xe1\x1d\x0d\x18\xd6\xb6\x5d\xd4\x71\xf5\x91\xcc\x07\xed\x63\xdb\xce\x74\x5c\x7d\x6c\x8a\x3e\xb6\xed\x4c\xc7\xd9\xc7\x9a\xe8\xa3\x9d\xe9\xb8\xfa\x58\xcf\xfb\x68\x67\x3a\xae\x3e\xae\x8b\x79\x6c\xdb\x99\x8e\xab\x8f\x40\x73\xb4\x8f\x76\xa6\xe3\xea\x23\x88\xe4\xb4\x8f\x76\xa6\xe3\xec\x63\xd3\xe3\x7d\xb4\x33\x1d\x57\x1f\x5b\xa2\x8f\x1d\x3b\xd3\x71\xf6\xb1\xce\xfb\xd8\xb1\x33\x1d\x57\x1f\x1b\xa2\x8f\x1d\x3b\xd3\x71\xf5\xf1\x85\x98\xc7\x4e\xd3\x5c\x90\x70\x8d\x92\xe1\x64\x8c\x83\xd0\xcf\x98\x53\x19\xb8\x2b\xa8\xe5\xc8\x11\x17\x6d\xa2\x0a\xfc\x77\x09\xf9\xba\x86\x95\x96\xa9\xb3\x32\x75\x52\xa6\x67\x2f\xd3\x60\x65\x1a\xa4\x4c\xdf\x5e\xa6\xc9\xca\x34\x49\x99\xc0\xd0\xe6\x6a\xaa\xca\x5d\x8b\xa5\xee\x82\x01\x6d\x21\x53\xba\xc8\xa6\xeb\x67\xbe\xed\x60\xee\x67\xbe\x08\xe5\xe3\x67\xbe\x5b\x39\x16\xbd\x0e\xb3\xf4\x34\xce\xfc\x91\x80\x19\x6d\xfb\x99\x4f\x3d\x48\x9e\xa3\x75\x0b\x74\xa8\xf3\x0e\x0f\x32\x0e\x5d\x78\x9c\x40\x79\xa3\x33\xce\x94\x57\x02\xcd\xb3\x1c\xe4\xcf\x3f\xff\x8c\xda\x70\xf1\x56\x9b\xad\xd7\xf2\xfb\xb6\xbc\xc4\x3f\x50\xb3\x61\x10\x87\xda\x97\x3d\xb4\x89\x40\xed\x3e\x18\xc5\x71\x52\x91\x3a\xb9\xaa\xe8\xde\x5d\x9d\x83\xb2\xef\xd0\xa6\xf4\xa4\x2f\x1c\x81\x7a\xa5\x52\xc9\x71\x5b\x42\x9d\x16\xcd\x97\xf6\x02\x82\x89\xb6\xaa\x54\x61\x63\xd7\xcf\xf2\xaa\x0c\xe7\x5c\x39\x2b\xbf\x2d\xaf\x9d\x35\xc1\x31\xd5\xac\x0e\x6e\x9e\x6e\xd6\xe0\x12\x8b\x74\xb6\x55\xa6\xb3\xef\xac\x9d\x7d\x77\xdb\xce\xbe\xb3\x76\xf6\x5d\xd9\xce\x9a\xbd\x95\x9d\xa8\x2a\xa2\xfb\x3c\xd8\x14\xe4\xd4\xb3\xfb\x0f\x82\xc1\x3b\x75\x63\x00\x1f\x45\x9b\x27\x55\x61\x5e\xf9\x39\xde\x90\x8a\xce\xdb\x42\xbe\x7b\xcc\x30\xde\xe9\xfd\xb6\xd0\xbd\x87\xe3\x8a\x0b\x15\x5d\xff\x0b\x4c\xe0\x0a\x63\xef\xcc\x7e\x77\xb1\xc7\x6e\xc9\x2a\x95\x3d\xe5\x5a\x62\x6f\xe1\xfb\x08\x4a\x0b\x7b\xca\x5d\xc4\x9e\xf3\x12\x62\xfe\x8d\xc3\x31\xcb\x0d\x0c\x73\xc8\x22\xf0\x04\x30\xa6\x6a\xd1\x12\xc9\xca\xc1\x0d\xa1\x90\xd5\x83\x82\x15\x9c\x32\xc5\x0d\x1d\x3c\xe6\xd7\xff\xc6\xc6\x0b\x9f\x3f\x1a\xb4\xe0\xf2\xae\xe4\x11\x34\xc8\x57\xbb\x87\x03\xfd\x25\x90\xd4\x54\x5f\x33\x0f\xa5\x1e\x52\xaf\xd0\x80\x4f\xa2\x4d\xe4\xa3\x25\x54\xa9\xf4\xd0\x4f\x74\x73\xac\xfc\x9b\xfc\x0c\xaa\x84\x0d\xcc\xd0\x12\xca\xa4\xf6\x44\xc0\xe2\x88\x4c\x53\x4a\x57\x2a\x8d\x53\xde\x6c\xa0\x65\x94\x56\xa1\x5a\x4f\x33\x7a\x13\x58\x69\xe7\xff\x72\x58\xc1\x76\x5c\xe9\xa3\x9f\xd0\xbf\x1f\x06\x2b\xed\x10\x34\x17\xab\x1e\xfa\x1d\xf5\xd1\xef\x04\xb1\xfb\x47\x46\x13\x00\xe7\x22\x43\x10\xa9\xf4\xd0\xd7\x7b\x1e\x1c\xf9\xb6\xfa\xc4\x95\x26\x7d\x6e\xe2\xfd\x32\x41\xd6\xb8\x9f\x98\xe6\xa2\x08\xab\xc1\x04\xe3\x70\x16\x73\x94\xbe\x6d\x58\x33\xb6\x2e\x85\x91\xcb\xc1\x76\xdb\xe2\xfb\x55\x5c\xde\x74\xf8\xca\xe3\x8b\x29\x97\xf9\x6a\x46\xfe\x83\xed\xb6\xd5\x64\xc0\x39\x09\x73\x72\xd5\xdf\xd7\x14\xdc\x2a\xb4\xc3\xfc\x89\x93\xbd\xfc\xee\x63\xe2\xa8\x53\x99\x98\x88\xbd\xb1\xdf\x27\x93\xa1\x64\x86\x37\xe7\x83\x15\x33\xe7\x24\xcf\x66\x4f\xe7\xa5\x30\x03\x3b\x8b\x6c\xed\xb0\x80\x6a\xfc\xa5\x5d\xcc\xfe\xfe\x31\xd9\xe8\x62\x7b\xce\xe2\x0c\xa1\x5d\x8c\x83\x9e\xdf\xff\xcc\xe2\x6a\x8e\xe3\x00\x96\x14\xa1\x19\x31\xdf\xf0\xb2\xbb\xfb\x9a\x88\x40\x16\xf1\x00\xcc\x9c\xe0\xab\x62\x2d\x07\x16\x2e\xb4\x95\x03\x02\x80\x19\xf3\x88\x55\xdf\xdd\x7d\xbd\xb2\x13\xd1\x58\xe5\x60\x40\xb5\xfb\xda\x62\xf0\x33\x71\x98\xcb\x30\x33\xc3\x02\x93\x19\xb7\x68\xca\x42\x50\x71\x81\x84\x3e\xda\xee\x99\xa5\x50\x1e\xb4\x90\x1c\xca\x43\x2d\xcf\x63\x94\xbf\xc5\xd7\x69\x96\x60\x7f\xbc\x15\x05\xac\x77\x16\xeb\xc8\x98\x99\xc5\x0a\x70\x1e\x6b\xc0\x26\x64\x1f\xe3\x31\x86\x20\xe3\x60\x8c\x49\xe7\x89\xc5\xca\x04\xff\xf9\x08\xcf\x32\xfa\xda\x2e\xbe\xe3\xcb\xd7\x2c\x66\x2a\xb4\xbe\x92\x8e\xc2\x3e\xae\x70\x14\xc4\x4d\xbd\xc0\xc5\x66\x3f\xa9\xcc\xda\x36\xfe\xbb\xcc\xda\x1d\x46\x17\x0c\x87\x87\x61\xba\xf0\xd8\x7e\x33\xba\x39\xcd\x3b\xd4\xc3\xfd\x78\xcc\xbc\xee\x09\x41\x84\xf1\x34\x2d\x47\x32\xa2\x8b\xa5\xc4\xf1\x82\xde\x54\xe6\x76\x41\xf3\x8d\x30\x0f\x6c\x70\xde\xbb\xcc\x83\xb5\x5c\xbe\x54\x8d\xc6\xe5\x70\xcc\xb4\xf9\xfc\x33\x64\x76\xbd\xb4\x1e\x69\x44\x69\xb4\x89\xc2\x4b\x36\x85\x35\xc7\x4a\x8c\x2f\x31\xda\xff\x05\xce\x9f\xe9\xb4\x97\xe2\xff\x9d\xe2\x28\x2b\x38\x3d\x03\xbe\xc2\x81\x61\xae\x01\xb4\x8e\x8f\x36\x21\xe6\x24\x90\x3f\x46\xe5\x98\x0e\x34\x14\xac\x08\x20\x1e\x52\xbb\xb2\xba\x8a\xd8\x8c\xe4\xef\xac\xd9\x72\x8b\xa3\xc6\x50\xd3\xf3\xdc\x42\x10\x22\xc1\x88\x46\xe1\x1c\x6d\xd0\x0b\xc3\x82\x8b\x13\xbb\xaf\x8b\x0c\xae\xf9\xa6\xb3\x48\x9c\xba\x4e\xf3\x51\xf8\xf8\xde\x85\x0f\xf4\xdf\x93\x04\xa7\x38\xb9\xc4\x54\x0c\x89\xa7\x44\x94\x97\xc4\x0f\x50\x63\xf8\x59\xd8\x1b\x31\x0e\x8c\xb6\x13\xf4\x3a\x09\xfd\x08\xbd\xa1\xee\x99\x68\x10\x8e\x30\x8e\xfa\x2b\x7d\x00\xc1\x43\x3e\x43\x04\x6c\x8d\x7e\x4e\x8f\xa1\xc8\x3f\xfd\x08\xed\x25\xd3\xde\x35\xfa\x34\x24\xff\x59\xb9\xc2\xbd\xff\xbe\x18\xfb\xe1\x68\xa5\x1f\x8f\xed\xf2\xce\xe9\x31\x6f\xae\x40\xec\x91\x0b\x95\x96\x7e\x9e\xe4\xf9\x5e\xa2\x3e\x39\x28\xd0\x94\x49\x4f\x9f\x3c\x21\x83\x0e\xa4\x27\xd2\x21\x81\x92\x88\x2a\x85\xaa\x30\xeb\xf4\xd7\x1f\x68\x75\x35\xbe\xc4\xc9\x60\x14\x5f\x91\x3a\xb0\xf1\xd5\x79\x3a\x50\x52\xaf\xde\xa9\xfe\x44\xca\xbe\x14\x9f\x1b\xf2\xe7\x75\xfd\x6b\x93\xed\x61\xac\x31\xc0\x13\x50\x21\x60\x45\xbb\xab\xab\x88\x37\x8b\x7a\x75\x52\x04\x50\x86\xa6\x6b\x2f\x45\x95\x46\x5e\x45\x94\x79\x02\x08\xd0\x42\xb4\x54\x53\x2d\xc5\x8a\x3d\x01\x54\x58\xb9\x1b\xf8\x97\x10\xa4\x5c\x62\x69\xa9\xd7\x94\xbe\xc3\x3f\xbc\x0c\x2d\xb2\xb4\xd4\x6b\xbc\x7c\xea\x2e\xb0\xb4\xd4\xab\xb3\xef\xe4\x5f\xe8\x38\x6f\x14\x1e\x96\x36\xa1\xe7\xaf\x5e\xb1\x7c\x90\xf2\xeb\x06\x55\x01\x2a\x6f\x19\x42\x66\x4b\xa2\x5a\x6d\x56\xab\x33\xad\x5f\x5e\x94\x71\x3d\x52\x88\xbc\xbc\xd1\xa9\x83\x2d\x8f\x4a\x9f\xfe\x57\xa5\x11\xf6\x92\xde\x20\x71\x52\xca\x5f\x56\x19\xc1\x48\x53\xb0\xba\x8a\xc8\x2e\x01\x37\x31\x28\x94\x16\x12\x5d\x3c\xc6\x4a\x7b\x96\x22\x80\x97\xa2\x38\x1a\x5d\xd3\xe5\xb8\xfd\xeb\xe1\xf1\x36\xfa\x84\x5e\xa1\x75\x80\xc9\x1b\xac\xdb\xb0\xa0\x77\x71\x6a\x67\xd9\x37\xde\x5f\xbe\x96\x94\xb3\x80\x58\x57\x2b\x8e\xd7\x7f\xa2\xcc\xb9\xa8\xc8\x69\x14\xd7\x64\x18\xb3\x55\xc6\x13\x45\xb3\x7c\xc0\x0c\xd4\x8b\x24\x1e\xe4\x96\x7a\x40\x68\xb0\x37\x52\x2c\x03\xa1\x5b\xc8\x41\x68\xbe\x2c\xc4\xa5\x03\x42\xd8\x26\xcd\x53\x56\xf4\x44\x17\x8d\xd8\x67\x09\x57\x55\xf5\xbc\x88\x50\x84\x1c\x82\x11\xba\x9d\x70\x84\x16\x14\x90\x90\x2a\xcf\x99\x87\xae\x9c\xee\xe5\xb3\x97\x58\x1a\x2f\x35\xc9\x4a\x14\x97\x04\x2c\xa7\x88\x25\x15\x5e\x40\xd2\x6a\x3d\x4a\x5a\xdf\xbb\xa4\xe5\x90\xaf\x1c\xea\x9d\xd3\xe3\x62\x39\x67\x51\xf5\x8e\x85\xa5\xeb\xbc\xfc\x91\x89\xff\xfd\x98\x78\xe1\x69\xf6\x01\x58\xf6\x7e\xd4\x4f\x30\x44\x6e\x60\xc0\x35\x90\x4c\x0e\xc9\x27\x77\x19\x51\x63\x1a\xc7\x17\xb8\x2d\xff\x8a\x6a\x7f\xa9\xcd\xa1\xec\xae\x30\xff\xbc\x4d\xca\x2c\xb0\x0b\xb4\x1f\x77\x81\xbf\xc4\x2e\xb0\x33\xc2\xfd\x2c\x89\xa3\xb0\x8f\xba\x71\x80\x7b\x71\x3c\x5f\xe1\xbf\xd3\x2d\x52\xf8\xd3\xaf\x0b\xed\x08\x3b\x5d\x55\xe1\x4f\x9e\xef\x6b\x07\x90\x59\xbb\xca\x40\xd4\x7a\x45\x5a\x4c\x82\x8f\xb2\x90\x1e\x0a\xbf\x00\xdf\x0a\x3f\x9e\x7a\xa9\x3b\x5f\x6f\x06\x65\x16\x58\xc7\x7f\xed\xe4\xc8\xff\x39\xeb\xf8\x70\x9a\x4d\xa6\x59\xf9\x4b\xbb\xc3\xc2\x4b\xbb\xc3\xc5\x2f\xed\x74\xa9\xee\x50\xbb\xc4\x3b\xfc\x73\xaf\x83\x1e\x5c\xaa\x33\x75\xf3\xe2\xcd\xfd\x4a\x76\x05\x0d\x7d\x2f\xd2\xdd\xdf\xe9\x84\x7d\xa8\x5d\x6b\xba\x84\xa8\xc3\x12\x97\x16\x87\x0b\x5e\x5a\x3c\x66\xb1\xfb\x6b\x30\xdf\xad\xf7\x27\xfb\xe8\xb7\x95\x17\x8d\x26\x37\x10\x47\x69\x46\x96\xf7\xc5\xb5\xc1\x7d\x27\x7e\xb0\xb2\x15\xa5\xe1\x6f\xa4\xb4\xc8\x05\x37\xf1\x03\x99\xfd\x05\x7e\xe6\x4b\x17\xa1\xae\x0b\xd0\x54\xbd\x01\x25\xb5\x4e\x72\x83\x5f\xc5\x00\xf8\xa5\x5a\xb4\xa7\xa7\x15\xe9\xb9\x12\x8a\x00\x51\x4c\xa3\x4c\xf4\x4c\x0b\x66\x05\xb6\x78\x47\xf4\x9b\x01\x8c\xbe\x58\x56\x31\xfb\x87\xf6\xdd\x68\x8d\xc6\xb4\x19\xf9\x29\x8d\x9c\x85\x26\x71\x1a\xaa\x1e\xf8\xa4\x51\xf2\x9d\xd4\x3f\x8a\x79\x67\x45\x0b\x4b\x1a\x46\xcb\xa8\xae\x35\x72\xe4\x07\xf9\x33\x0c\x94\xc8\x36\xa2\xbe\xa6\xac\x44\x6e\x2b\x0f\xa9\xa5\x36\x92\x87\xd4\x92\x4b\xdb\x82\x6b\xa9\x96\xd9\x4b\x1a\x20\x6e\x87\xc8\x2d\x70\xa7\x91\x85\x38\x74\x8a\x78\x83\x33\x29\xe1\xbc\x32\x55\x54\x81\x2f\x46\xb3\x78\xe6\xa4\x3e\x57\x54\x34\x97\xc9\xf1\x97\xf5\x3d\xbf\x08\x92\x50\x60\xfb\x8a\xe1\x21\xa1\x81\x71\xf4\xf6\xe9\x93\x1b\x2b\xdf\xe4\xcb\x65\xf6\xa2\xd1\x5c\x88\x77\xde\x2d\x31\xd9\x23\xef\xfc\x56\xbc\x73\xff\xe4\x10\x41\x48\xdc\x72\xac\x73\x9f\x05\xd0\xbd\x2b\xeb\xfc\xd3\xd9\x61\xbe\x24\xe6\xf0\x43\x0b\xab\xa2\xe9\x00\xec\x11\xe8\x56\x12\x3f\x0a\xe2\x71\xc5\xe0\x80\xd5\xea\x8a\x26\x29\x15\xc3\x61\xa9\xc3\xce\x0c\x2e\xd7\x68\x9d\x7b\x04\xdc\x23\xa3\xd2\x19\x15\x27\xce\x85\x18\xd5\x5f\x3b\xf3\xc2\x7f\x14\xa3\x5a\xdd\xdf\xe9\xa2\x17\x6b\x2f\xd6\x96\xeb\x88\xd1\x06\x3a\xc0\xd9\x30\x0e\x50\xc3\xc5\xad\x20\xb4\xf7\x6d\xb9\xd5\x56\x10\x50\xff\x41\x75\x41\x94\xe0\x02\x7c\xf5\x92\xda\xf4\x8f\x2f\x5a\xa5\x81\xff\xc1\x49\x0c\xb9\xc3\xb2\x21\x46\x09\x4e\x25\xbe\xa8\x74\x84\x94\x63\x3d\x26\xcf\x06\xde\xb7\xe2\x05\x6c\x21\x7e\x61\x38\xa8\xab\xd1\xd9\x3c\x80\xa6\xf0\xec\x0b\x3b\x8e\x30\x1a\xc7\x09\xa6\xc2\xe3\xf2\x32\xf4\xcd\x35\x8a\x7c\xbd\x2f\x2f\x97\x5c\xe0\x30\x9f\x8b\x2c\xf0\xb5\xbb\x45\x39\x7f\x5c\xe0\xdf\xec\x14\x87\xa2\x38\x9e\x94\x13\x43\xde\x73\x72\x74\xae\x6c\x41\xec\xee\x35\x91\x17\x29\xa2\x39\xd1\xd4\x42\x44\x77\xb7\x70\xb3\x8f\x44\xf7\xad\x88\xee\x7f\x24\xe6\x57\x4c\x72\x12\x0f\xfc\x13\x85\xdf\xd2\x07\x67\xf9\x7c\x6b\x08\xc0\x95\x4a\xb1\x08\x5c\x45\x5f\xbf\xea\xaf\x6e\xb5\xc5\xd8\x7b\x3c\x3f\xae\xc0\xea\x2a\xfa\x40\xe0\xab\xf5\x42\x23\x52\x00\x68\x16\x44\x99\xab\x61\x38\xc2\xa8\xf2\x43\x25\xf7\xb5\xce\x63\x70\x83\xc7\xa1\x11\x73\x5b\x98\x70\x1a\x8a\xcc\x50\x6c\x49\x48\x55\x51\xea\x8e\xdd\x10\x8f\xb7\xcc\xee\x25\x51\xd0\x42\xbc\xe4\xaf\xed\xb8\x65\xc9\xd1\x45\x93\x64\x3d\x2c\x5f\xc9\x33\x21\x41\x6b\x7f\x7e\x9e\x8f\x87\x4d\x12\x5e\x2e\x26\xb6\x11\xf3\x5a\x7c\x39\xd9\xdb\xaa\xe7\xb1\x9e\xc9\x93\xf4\xd1\x4c\x04\x6e\x73\x10\x3d\xf2\xd3\x94\x2c\xe4\x65\x82\x5a\x80\xde\xe2\x6b\xb4\x8d\x93\xf0\x92\xe6\x84\xdc\xe5\x83\xd2\x28\x8e\x39\x7d\xf4\xfa\xed\xf6\x6e\x23\x6f\x4d\x3c\x97\x4c\x3c\xde\x8d\xa3\x41\x78\x31\x65\x99\x28\x63\xc8\x0a\x99\x16\xe5\x97\x4c\xe2\x09\x4e\xb2\x6b\xf4\x07\x3d\x16\x83\x37\x29\x30\xdf\xd3\x21\xcd\x71\x9c\x92\x87\x30\x62\xe9\x02\xb2\x58\xf8\xd2\xac\xa0\x6d\x3c\xf0\xa7\xa3\x6c\x03\xb5\x50\xa5\xde\x58\x87\x44\xca\x55\x17\x7c\x47\x42\x73\x9c\xf0\x44\xe6\x39\x38\x32\xfe\xf3\xd0\x0c\x33\x96\x3c\x33\x05\x50\xf9\xa1\x5e\xfa\x90\xc5\x68\x82\x93\x41\x9c\x8c\x25\xe0\x0a\x64\x29\xfd\x63\x7f\x70\xb1\xe1\x1a\x65\x44\x2f\xbe\x4e\x20\xe6\x4c\xbd\xb1\xbe\xda\x6c\x68\x21\xb8\x69\x57\x28\xea\xda\xa7\x1c\x21\xa5\xf1\x9b\x6a\x51\x42\xd2\xa2\x04\xf2\x64\x56\x82\x9c\xb4\xf8\x7a\x9b\x9f\x45\xf4\x10\xf8\xdc\x0d\xe9\xaa\x9c\x31\x94\x8c\x5f\xdf\x46\x37\xdc\xdf\x6c\x10\x27\x70\x8a\xc9\x1b\xbd\x87\xc4\xa0\x9f\x83\x81\x91\x34\x9e\x52\x3b\x3f\x3d\x2a\x66\x58\x8b\x54\xfc\x23\x9f\xac\x75\x9a\x7e\xf2\xce\x60\x3c\x75\x1a\x6b\xb5\x9a\x0e\xb8\x20\x7b\x7d\x7f\x70\x61\x37\xbc\x20\x13\xb1\x29\x7e\x72\xc2\x23\xc5\x5d\xc1\x30\xcc\xf5\x0e\xd7\x15\xd4\x83\xae\x2c\x0b\xba\x4d\xbe\xd9\x09\x83\x0d\xd4\xc2\x1f\x56\x4a\x56\x4e\xfd\x51\x86\xb6\xe0\x3f\x8b\x27\xa2\xe5\x6e\x34\x92\x5f\xfb\x5d\xc8\x8e\x26\x52\x0f\x06\x2b\x2c\x2a\x49\x85\x77\xc6\x03\xfc\x9c\x93\xca\x8a\xcb\xf3\xaa\xd5\x5c\x28\xb7\x8b\x3a\xf5\x56\x03\xc2\x30\x73\x24\x85\x65\x5e\xf6\xe0\xbb\xcf\x68\x95\x90\x0f\xe5\x41\x9e\x98\x1d\xbb\x59\xa2\x3b\x41\x39\xc8\xa6\x74\xb0\x69\xba\x79\x43\x9f\x63\x0b\xf5\x04\x72\xf2\x7e\x14\xe0\x99\xad\xc6\x59\x6d\xc6\x14\x40\x96\x68\x9d\x73\x42\x74\x09\x54\x84\xb0\x2c\xde\x38\xf3\xd7\xe7\xd8\xf0\x4a\xf9\x1b\x67\x25\xbe\xe5\x6d\x92\x59\x59\x61\x4f\x36\x23\x8c\x7c\x6b\xa1\x45\xf3\x17\x73\x8c\x2c\xd4\x8f\x4c\x50\xd7\x3a\xc8\xe3\x22\xbd\xe2\xf8\x58\x8d\x0b\x44\x27\x59\x9e\x63\x9e\x2c\x1b\x28\x30\x4f\xe3\x9b\xf7\x5a\x9f\x33\xc4\x32\x7a\xe7\xa9\x81\xcd\xef\xf3\xb3\x31\x00\x7c\x65\x88\xad\xa3\x6b\x16\x17\x59\x8c\xf2\x57\xac\xe3\x0e\x44\xf6\xc5\x18\xdb\x41\x87\x72\x34\x3b\x06\xd6\x82\x85\x62\xcb\x51\xa7\xb6\x1c\xd2\xf4\x39\x8d\x39\x10\xf0\x73\xa5\x09\x18\x3d\x31\xd2\xf2\x47\xdb\x58\x97\x19\x6f\x34\x2f\x14\x94\xad\xb3\x7c\xf4\xe5\x77\xf6\x80\x55\x52\x13\xbf\x1d\x1e\xab\xdd\x01\xd7\x29\x8b\xc7\xb5\x31\x6e\x9f\xa8\x0d\xcc\x27\x6e\x03\x23\xcd\xe6\x4b\xf4\xa9\x60\xf4\xc8\x5f\x5e\xe3\xec\x13\x98\xc3\x18\x1d\x39\xfb\xa4\x9b\xc5\xf0\xbf\x1b\xf3\xb5\x1e\x70\x8a\xfc\x49\xcc\x81\xe9\xa6\xa1\x51\xdb\x94\x68\x4c\xe2\xac\x76\xbe\xb4\x54\x6c\x52\x24\x01\x97\x8e\xbe\x9c\x6f\x58\x82\x98\xb1\xbd\x2c\xaf\x57\x64\x40\x29\x1f\x23\xee\xb4\xa1\x97\x09\x36\x53\xb8\x91\x2f\xb8\x89\xdf\x97\x68\x19\xa6\xb6\x74\xfb\xf3\xa3\xd7\x58\x44\x83\x7b\x08\x62\x43\x45\x04\x21\x19\x52\xa1\xd0\x25\x26\x2c\x56\xcd\x43\x0e\xd9\xf4\x2e\x60\x0a\x65\xd3\x3c\xc8\x8e\x38\x4a\xba\x04\x18\x0f\xe9\x82\x2a\x1b\x76\x55\x2c\x26\x85\xe6\x08\x4f\x37\x45\xb6\x68\x14\x9a\x3d\x50\x8f\x9e\x42\x97\xe7\x84\xbd\x39\xf7\xd6\xfe\xda\x3e\xf4\x0b\xa4\x75\x9f\x9f\x1c\xfd\x61\x75\x47\xce\xf4\xda\xae\xac\xd7\x7f\x07\xed\xd2\x09\x18\x67\x76\xb9\xf1\x2e\x55\x22\xc9\x2f\x8b\xf4\x48\x02\x8f\x63\x3c\x4d\xfd\xde\x08\xb3\x70\x60\x12\x3a\x27\x48\x4e\xb5\x48\xa1\xe8\x6f\xde\x20\x35\xc3\x9a\xb4\x2d\x1c\x43\x36\x65\xc4\x0c\x6d\x99\x8d\xb1\xa9\x49\x12\xe5\x21\xc6\x4a\x98\x22\x1f\xd1\x04\xcc\xe8\x12\x27\x29\x44\x2d\x1b\xfa\x19\x8a\xf0\xc5\x08\xf7\x33\x1c\x10\x36\xdc\x67\x29\x55\x33\xa6\xf0\xc9\x62\x34\x0a\xb3\x6c\x84\x97\x69\x80\xcb\x15\x15\x28\x4e\x92\x38\x41\x41\x8c\xd3\xe8\x59\x86\xfc\xc1\x00\xf7\x69\x5d\x8a\xd4\xb3\x14\xa5\xb8\x3f\x4d\xc2\xec\xda\x13\x15\x7b\xd3\x0c\x85\x19\x54\xe2\x35\xc2\x2c\x15\x01\x15\xc2\x51\x98\x31\x27\x6e\x9a\xd7\x35\x24\xfc\x79\x8c\x23\xba\x1f\xa4\x36\x45\x19\x1d\x90\x77\xb4\x73\x42\x5d\xa6\xbd\x95\xe7\xef\xb6\x49\xdb\x8a\x0f\x29\x6f\x65\x33\x68\xe7\x01\x23\xb7\xde\x86\x53\xc3\x65\xd1\x69\x21\x64\x27\x34\xb2\x7b\x61\xe7\x39\xed\x37\xd1\x2e\xf9\x65\x49\x1c\xf7\xf6\xac\x76\xee\xa1\xca\xdb\xb3\xe6\x39\x0b\x16\x80\xbe\x92\x47\x76\x15\x50\xef\x54\x2d\x49\xe4\xde\x9e\xd5\x69\xa5\x9a\x5a\xa9\x59\x5c\xa9\x41\x2b\xd5\xd5\x4a\xb5\xe2\x4a\x4d\x5a\xa9\xa1\x56\xaa\x8b\x4a\x6a\x1d\x5b\x76\x24\x63\xc8\xb8\x97\xa1\x6b\xd0\xba\x62\xd0\xba\xf6\x41\x33\xf1\x91\x86\x8b\xf5\x89\x5e\x98\x0c\x06\x3c\xed\x20\x45\x9a\x06\x59\xad\xd5\xc8\x17\x5b\x7f\xcd\x89\x68\xaa\x90\xeb\x56\xc8\x8d\x52\x90\x6b\xce\x81\x97\x60\x68\x90\x9b\xa5\x20\xd7\x5d\xb3\xe3\x49\x30\x34\xc8\x35\x0d\xf2\xfc\x89\xec\xfa\x49\x72\x8d\x7a\x7a\x3a\x55\x3a\x55\x3d\x1a\xff\xc2\xd4\x64\x64\x74\xf2\x09\xeb\x49\xaf\xd3\x0c\x8f\xd1\x20\x9e\x26\x28\x0b\xc7\xfa\xdc\x2f\x18\x94\x37\xc2\xb3\xec\x84\xac\x3e\x77\xfc\x58\x4b\xc4\xdb\x83\x38\x08\x07\xd7\x94\x13\x52\x3a\x2c\x81\xc5\xba\x1b\x8b\xee\x19\x75\x1c\xf8\xed\x0c\x52\x5e\x42\xb4\x15\x23\x53\x9c\x2d\x49\xee\x2f\x28\xc5\xd9\x74\xa2\x7e\x28\xf0\xe8\x98\x7f\xd8\xdf\xff\x85\xba\x76\x14\x9d\xf0\xf7\x7f\xf9\x58\x43\x9b\x68\xff\x17\x33\x35\x9a\x54\xa4\x4e\x8b\xd4\xad\xd1\x8c\xe5\x25\x0d\x53\x99\x4e\x7b\x97\x98\x88\x0a\xae\xa3\x7f\x8d\x06\x3f\x86\xb6\x69\xf4\xe3\xaf\x88\x3e\xb9\xa2\x1f\xcb\xc5\x59\x98\x63\x51\x3e\xbf\x0e\xb5\x87\x39\x16\xcd\x36\x44\xb3\x75\xa5\xd9\xfa\xbc\x66\xeb\x6a\xb3\xf5\xc5\x9a\x85\x30\x3a\x61\x8d\x2f\x41\x02\x24\x6c\xa8\x2b\xd0\x55\xb5\x09\x55\x1b\x7c\x31\x43\xd5\x9a\xba\x4c\x1d\x33\xc2\xc8\xba\x88\xb5\x22\xa0\xd6\x1a\x3d\xd7\xeb\xb1\xfd\xe9\xc7\x3a\xfd\x58\xb7\x7e\x6c\xd0\x8f\x0d\xeb\xc7\x26\xfd\xd8\xb4\x7e\x6c\x15\xb5\xd9\x2e\x6a\xb3\x53\xd4\xe6\x9a\x68\xb3\x40\x23\x55\x8a\xf3\xa0\xc5\xb9\x0f\x2a\xc7\x81\x90\xa9\xa4\x90\xfd\x88\xee\x25\xb9\xab\x53\x79\x2d\x49\x1f\xa5\x38\xb3\x5a\xc4\xde\x3b\xf7\xf6\x0e\x83\x9b\x7b\x99\x01\x17\x52\x4b\x9f\xd0\x50\x43\xbf\x01\x11\xa2\xca\x6f\x64\xee\xf9\x2a\x81\x67\xb1\xf7\xbe\xd4\x2b\xd6\x69\xc5\x06\xab\xb8\xa6\x55\x6c\x3b\x2b\x36\x68\xc5\x16\xab\x58\xd7\x2a\xae\x39\x2b\x36\x69\xc5\xce\xb9\x40\x4d\xa9\x58\xcf\x2b\xde\x69\x17\x2b\x8a\x52\x4f\x11\xe1\xb1\xe3\x4f\x58\x4a\x76\x16\x3c\x1e\x1e\x6f\x13\x3d\x9e\xc3\x61\x0c\x4e\xc0\xb1\xc5\x8f\xb7\xe2\x6b\x75\xc2\x43\x52\x8e\x5e\xe1\x4d\x77\x52\xec\x45\x27\x53\xbf\xb0\xe3\xc9\x6f\x6e\xf3\x8f\xe1\x25\xfd\xd2\x69\xad\x36\x1b\xba\x5a\x4e\x2c\x13\x41\xb0\x95\x92\xae\x50\xca\xfa\x50\xbe\x48\x22\xa8\x66\xf0\x73\xe2\x5f\x62\x14\x8f\x02\x27\xab\x5d\x40\x7e\xe8\x7e\xa4\x93\xdb\xd5\xe3\x1d\x2a\x2d\x76\xfd\x51\x7f\x3a\x22\x2b\x2c\xc2\x57\xce\x66\xbb\x2c\x11\x4c\x97\x26\x82\xa9\xcd\x5a\x41\x13\xfe\x0f\x2d\x71\x09\x4d\xcf\xd7\xd2\x65\x79\x61\xba\x34\x2f\x4c\x6d\xc6\x6a\x34\x21\xa6\x7c\x97\x0b\xa8\xb5\x2a\x7a\x85\x2a\xdd\x8f\xd2\xf3\x7f\xa1\x3a\xda\x40\xb5\xaa\x09\xb1\xc1\x20\x36\x28\x44\x06\xb0\xc5\x20\xd6\x35\x88\xf5\x12\x10\x9b\x0c\x62\xd3\xe8\x56\x85\xb6\xa3\x40\x6c\x94\x80\xd8\x62\x10\x5b\xd6\x5e\x37\x35\x88\xcd\x12\x10\xdb\x0c\x62\xdb\xda\xeb\x96\x06\xb1\x55\x02\x62\x87\x41\xec\x58\x7b\xdd\xd6\x20\xb6\x4b\x40\x5c\x63\x10\xd7\xac\xbd\xee\x68\x10\x3b\x73\x21\xe6\x62\x3f\x05\xaa\x54\x5f\xd3\xab\xeb\xde\x31\x82\xa6\xc9\xee\x73\xb1\x7c\x87\x45\x44\x4a\x5d\xcc\x80\x57\x87\xa4\x6b\x5d\x4b\x12\x0e\x9e\x2e\x3f\x99\xf6\x33\x34\x0c\x2f\x86\xc8\x8f\x02\x34\x8a\xaf\x90\x9f\x5c\x4c\x21\xfc\x0b\xb8\x39\xff\xef\xd4\x4f\x8c\xc4\x3d\xd0\x80\x8f\x36\x49\x2b\x5c\x8a\xb3\x28\x0f\x2e\x7a\xb4\x08\xdd\x25\xac\xc7\x27\xde\x67\x05\x83\x04\xa7\xd3\x51\x86\xe2\x41\x51\xf3\x43\xba\x05\x54\x2e\x7c\xf4\x1c\x5d\xf8\xd4\x75\xa5\xbe\x56\x45\x4b\x88\xbe\xea\xb1\x57\x6d\x78\xd5\x83\x57\x36\x24\x47\x14\x90\xd4\x15\x7a\x24\x7c\x8e\x2e\x66\x30\xc3\x55\x20\x08\x5e\x40\x88\x9d\x52\x01\x5b\x22\x18\xd2\xa1\xdf\x0e\x8f\x11\x84\x93\x94\x3f\xbe\xa1\x1c\xee\x62\x88\x7e\x47\x17\xa3\xb2\x4c\xce\xae\x54\xf9\x8d\xb1\xb8\x37\x94\xc5\x55\x2a\x6f\xf2\xed\x9b\xec\x64\x6f\x24\xb1\xa0\xca\x0a\x74\xd4\x02\x9d\xbc\x80\x4e\xcf\xbf\x31\x6e\xf8\x86\x72\xc3\x0a\x6d\x26\xdf\x6f\xdf\x70\xfe\x07\xfb\xed\x12\x22\xad\x99\x30\x1a\x0c\x46\x83\xc3\xa8\xab\x08\xd4\x0d\x0c\x6b\x6a\x81\x5a\x11\x86\x4d\x06\xbd\xc9\xa1\x37\x54\x0c\x1b\x1a\x86\x75\x0b\x86\x2d\x06\xa3\xc5\x61\x34\x55\x04\x9a\x06\x86\x0d\xb5\x40\xa3\x08\xc3\x36\x83\xde\xe6\xd0\x5b\x2a\x86\x2d\x0d\xc3\xa6\x05\xc3\x0e\x83\xd1\xe1\x30\xda\x2a\x02\x6d\x03\xc3\x96\x5a\xa0\x55\x84\xe1\x1a\x83\xbe\x76\xae\x90\x88\xc0\xb0\xa3\x61\xd8\x56\x30\x2c\x95\xf8\x23\xe5\x49\x27\x84\xae\xb5\x44\xda\x89\x79\xd7\x5d\x14\x56\x86\x67\x99\x7c\xef\x24\x6b\x52\x79\x28\x05\x25\x8d\x03\xbd\x2d\x32\xef\xaf\x26\x23\x9f\x60\x33\xcb\x90\x13\x1c\x8b\x33\x53\xc9\x5b\xb6\x41\x14\x17\x57\x45\x4a\x5d\x35\x79\x87\x5c\xb2\x5a\x74\x07\x25\x17\x2c\x6d\x8c\xec\xa9\x77\x23\x1b\xed\x96\x97\x5f\x8a\x6c\xb4\x3b\x1e\xbb\x2b\xd9\xe8\xd4\x6f\xce\xbd\xb5\xbf\x76\x24\xc2\xc7\xfb\xaa\xc7\xfb\xaa\x07\xbb\xaf\xd2\x96\x78\x7e\x9f\xa3\xdf\xe4\xfc\xb5\xee\x70\xee\x2b\x2b\xdc\x5b\x71\x34\x7f\xab\x1e\xcd\xdf\xde\xf6\x68\xfe\x56\x3d\x9a\xbf\x2d\x3a\x9a\xcf\x53\x30\x3f\xde\x54\x3d\xde\x54\x3d\xde\x54\x29\x5f\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\xf2\x66\x1f\x6f\xaa\xf4\x8f\x8f\x37\x55\x8e\xc7\xc7\x9b\xaa\xc7\x9b\xaa\xc7\x9b\x2a\xf8\x7b\xbc\xa9\x2a\xa7\xc4\x7d\xbc\xa9\x7a\xbc\xa9\x7a\xbc\xa9\x92\xfe\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\x1e\x6f\xaa\xfe\x93\x6f\xaa\xee\xed\x8e\xea\x76\xb7\x53\x65\xee\xa5\x4a\xdc\x48\x3d\xd4\x5d\xd4\x5f\x3b\x1f\xca\xe3\x5d\xd4\xdf\xff\x2e\x4a\xbe\x3b\xea\xb6\xe6\x3a\x3a\xc9\x37\x47\xdd\x96\x74\x6d\x04\x0f\x0f\x7f\x67\x44\xbd\x34\xc5\xad\x91\x3d\xa8\x00\xf7\xd0\x2e\xba\x56\x02\x37\x4e\xd9\xa3\x58\x8a\x99\x6e\xea\x2b\xa2\x30\x43\x69\x2f\x9e\x99\x70\x4e\x04\x3a\x27\xf2\x35\x1d\xff\xb3\x49\x93\x8d\x76\xc7\x7d\x28\x67\x87\xee\x70\xbe\x1a\xf7\x2d\xbe\xb6\xe9\x71\xd5\x16\x3d\xee\x3f\x3e\xb7\x61\x36\x28\x64\x08\x78\x54\x89\x10\xfd\x43\x1e\x27\x87\xea\x90\x55\x22\x5b\x1b\x1f\xfb\x33\x05\x90\x19\x09\x4d\xf9\x6c\x04\x45\xb3\x9d\xfd\x49\x2f\x2a\x9f\xd0\x12\x1d\x9f\x25\xde\x68\x15\xfd\x03\x7a\xe5\x88\xa5\x70\xe5\x4f\xec\x38\xc3\xbe\x61\x6a\x08\xa4\x09\x38\xb1\x3b\xc6\x93\xd7\x64\xc6\xe7\x4f\x4f\xd7\xaa\xe2\x67\x59\x35\x04\xd1\x7c\x62\x59\x66\x05\xa0\x3b\xab\xe5\xb8\x26\x04\xb4\x20\x46\xfe\x75\x32\x3d\x76\x95\xa1\xd2\xb2\x70\x72\x6e\xb4\x3b\x0e\x85\x48\xcd\xa9\x0c\xb1\x36\x5a\x56\x31\x22\xad\x27\x4d\x31\x92\x0f\x5a\xa8\x7d\xf9\x94\x0f\xe7\xdc\x0c\xf0\xa0\x1c\x54\xab\x7f\x96\xf1\xd4\xe6\x43\xac\xa6\x88\x2e\xa3\x88\xaa\xd4\x22\xcb\x22\x0a\x41\x83\x4e\x13\xc6\x31\xaa\x54\xbe\x2b\x24\xec\x20\x5c\x2b\xd1\x16\x10\xac\x9b\x58\x73\x42\x55\xdf\xab\x9d\xfd\x4a\xea\x56\xd8\x9a\x22\x55\x18\x5e\xe7\x79\x5e\x83\x48\xcf\x63\xa0\x1d\x9f\x3e\x40\x1c\x14\xcb\x8d\x56\x4e\xea\xa1\x71\x76\x27\x63\xa1\xcc\x15\x13\xcb\x14\xec\xbe\x57\xb9\xb7\xdb\xba\x0f\xa1\xb7\xdb\x5a\x58\xe2\x35\xf7\x58\x4d\xdc\xed\xb6\xac\xb1\x2d\xe0\x86\x26\xc4\xc1\x2d\x76\xf8\xed\x24\x9e\x28\xbb\x3c\x7b\x01\x83\xf0\x0d\xa2\xe2\x05\xa4\x39\x35\xd0\x9c\xa6\xe7\x27\x13\x4f\x4a\x89\x50\x73\xa8\xfe\xa2\x21\x83\xd5\x63\xcd\x11\xd4\xa5\xa8\x5f\xda\x2a\x26\xa0\x36\x54\x10\x6a\xc4\xb8\x52\x42\x0c\x69\x83\x17\x2c\xbe\xc3\x20\xe3\x59\xb0\x81\x0b\xc3\x17\x82\x17\xd9\xc5\x7f\x86\xcd\x7c\x79\xd9\xba\x87\x2f\xc0\xee\xd1\x9c\x04\x48\xdf\xd1\x6a\x23\x43\x74\x3f\x2b\x0e\x20\x2d\xbe\xea\x18\xcd\x17\xaf\x3c\x52\xa8\xf8\xa4\xd9\x6d\x3d\xd4\x31\xf3\x6e\xe9\xfa\xbe\xe5\xf9\xf2\xc1\x4e\x81\xdf\x36\x88\x33\x61\x55\x38\xc5\xc9\x25\x7e\xfa\xa4\xd2\xaf\xa2\x46\xad\xde\x40\xbd\x6b\xd4\xfd\xff\xfe\xdf\x20\x09\xfb\xe8\x00\xa7\x51\x38\x5a\x41\x5b\xa3\x11\x4a\xc2\x8b\x61\x96\x22\x56\x3e\x58\x79\xfa\xf4\xc9\x31\x0e\xc2\x34\x4b\xc2\xde\x14\xe0\xfb\x51\x00\x41\x79\xc2\x08\xa5\xf1\x34\xe9\x63\x78\xd3\x0b\x23\x3f\xb9\x26\xec\x60\x9c\x7a\x2c\x4a\x43\x02\xff\x8d\xa7\x19\x1a\x03\x4f\xef\x03\x67\xf5\x90\x9f\x60\x34\xc1\xc9\x38\xcc\x32\x1c\xa0\x49\x12\x5f\x86\x01\x0e\x68\xd0\x09\xb2\x4e\x07\xf1\x68\x14\x5f\x85\xd1\x05\xea\xc7\x51\x10\xd2\x35\x4c\x2a\x8d\x71\xb6\xc1\x56\xfc\x32\x52\xd1\x4a\x41\x31\x4c\xf1\xe9\xc7\x01\x46\xe3\x69\x9a\x91\x8d\xda\x0f\x23\x00\xea\xf7\xe2\x4b\xf2\x69\x72\x0d\x5d\x44\x51\x9c\x85\x7d\xec\xd1\xb8\x42\xa3\x30\x05\xcd\xb2\xdc\x5e\x14\x68\xc8\x04\x61\xda\x1f\xf9\xe1\x18\x27\x2b\x2e\x1c\xc2\x48\x1e\x08\x8e\xc3\x24\x89\x83\x69\x1f\xdf\x3b\x1a\x88\x75\x2d\x88\xfb\x53\x11\x07\x83\xd4\x58\x8d\x13\x16\x23\x63\xec\x67\x38\x09\xfd\x51\x9a\x0f\x33\xcc\x0d\x54\x93\x50\x27\xf3\x7c\xba\xb7\x7f\x82\x4e\x0e\x77\x4f\x7f\xdd\x3a\xde\x41\xfb\x27\xe8\xe8\xf8\xf0\x97\xfd\xed\x9d\x6d\xf4\xfa\x5f\xe8\x74\x6f\x07\x75\x0f\x8f\xfe\x75\xbc\xff\x66\xef\x14\xed\x1d\xbe\xdb\xde\x39\x3e\x41\x5b\xef\xb7\x51\xf7\xf0\xfd\xe9\xf1\xfe\xeb\x0f\xa7\x87\xc7\x27\xe8\xc7\xad\x13\xb4\x7f\xf2\x23\x7c\xd8\x7a\xff\x2f\xb4\xf3\xdb\xd1\xf1\xce\xc9\x09\x3a\x3c\x46\xfb\x07\x47\xef\xf6\x77\xb6\xd1\xaf\x5b\xc7\xc7\x5b\xef\x4f\xf7\x77\x4e\x3c\xb4\xff\xbe\xfb\xee\xc3\xf6\xfe\xfb\x37\x1e\x7a\xfd\xe1\x14\xbd\x3f\x3c\x45\xef\xf6\x0f\xf6\x4f\x77\xb6\xd1\xe9\xa1\x07\x8d\x9a\xd5\xd0\xe1\x2e\x3a\xd8\x39\xee\xee\x6d\xbd\x3f\xdd\x7a\xbd\xff\x6e\xff\xf4\x5f\xd0\xde\xee\xfe\xe9\x7b\xd2\xd6\xee\xe1\x31\xda\x42\x47\x5b\xc7\xa7\xfb\xdd\x0f\xef\xb6\x8e\xd1\xd1\x87\xe3\xa3\xc3\x93\x1d\x44\xba\xb5\xbd\x7f\xd2\x7d\xb7\xb5\x7f\xb0\xb3\xbd\x82\xf6\xdf\xa3\xf7\x87\x68\xe7\x97\x9d\xf7\xa7\xe8\x64\x6f\xeb\xdd\x3b\x6b\x2f\x09\xee\x4a\x1f\x5f\xef\xa0\x77\xfb\x5b\xaf\xdf\xed\xd0\x96\xde\xff\x0b\x6d\xef\x1f\xef\x74\x4f\x49\x77\xf2\x5f\xdd\xfd\xed\x9d\xf7\xa7\x5b\xef\x3c\x74\x72\xb4\xd3\xdd\x27\x3f\x76\x7e\xdb\x39\x38\x7a\xb7\x75\xfc\x2f\x8f\xc1\x3c\xd9\xf9\xbf\x1f\x76\xde\x9f\xee\x6f\xbd\x43\xdb\x5b\x07\x5b\x6f\x76\x4e\x50\x65\xce\x90\x1c\x1d\x1f\x76\x3f\x1c\xef\x1c\x10\x9c\x0f\x77\xd1\xc9\x87\xd7\x27\xa7\xfb\xa7\x1f\x4e\x77\xd0\x9b\xc3\xc3\x6d\x18\xe8\x93\x9d\xe3\x5f\xf6\xbb\x3b\x27\x2f\xd1\xbb\xc3\x13\x18\xad\x0f\x27\x3b\x1e\xda\xde\x3a\xdd\x82\x86\x8f\x8e\x0f\x77\xf7\x4f\x4f\x5e\x92\xdf\xaf\x3f\x9c\xec\xc3\xa0\xed\xbf\x3f\xdd\x39\x3e\xfe\x70\x74\xba\x7f\xf8\xbe\x8a\xf6\x0e\x7f\xdd\xf9\x65\xe7\x18\x75\xb7\x3e\x9c\xec\x6c\xc3\xe8\x1e\xbe\x87\xae\x9e\xee\xed\x1c\x1e\xff\x8b\x00\x25\x63\x00\x83\xef\xa1\x5f\xf7\x76\x4e\xf7\x76\x8e\xc9\x80\xc2\x48\x6d\x91\x21\x38\x39\x3d\xde\xef\x9e\xca\xc5\x0e\x8f\xd1\xe9\xe1\xf1\xa9\xd4\x47\xf4\x7e\xe7\xcd\xbb\xfd\x37\x3b\xef\xbb\x3b\xe4\xeb\x21\x81\xf2\xeb\xfe\xc9\x4e\x15\x6d\x1d\xef\x9f\x90\x02\xfb\xb4\xd9\x5f\xb7\xfe\x85\x0e\x3f\x40\x97\xc9\x1c\x7d\x38\xd9\xa1\x3f\x25\x8a\xf5\x60\x26\xd1\xfe\x2e\xda\xda\xfe\x65\x9f\xa0\xcd\x0a\x1f\x1d\x9e\x9c\xec\x33\x3a\x81\x21\xeb\xee\xb1\xe1\x5e\x79\xfa\xe4\xf9\xaa\xaa\xf3\x3a\xf0\xb3\xe1\xfd\xea\xbd\xca\x45\x9d\xa6\x81\x8f\x45\x11\xfa\x58\xca\x3a\x1b\x2e\xec\xfc\x28\x4b\x51\xe6\xf7\xb8\xc4\x42\xaa\x7c\xfc\x32\xb2\x06\xdb\xcc\xe5\xa8\x9a\x87\x50\xdd\x43\xa8\xe1\x21\xd4\xf4\x10\x6a\x79\x08\xb5\x3d\x84\x3a\x1e\x42\x6b\x1e\x42\xeb\x1e\x42\x2f\x3c\x54\xaf\x79\xa8\x5e\xf7\x50\xbd\xe1\xa1\x7a\xd3\x43\xf5\x96\x87\xea\x6d\xc9\xc2\x72\x8d\xd6\x25\xdf\x08\x3c\x52\x9e\xc0\xa8\xb7\x29\x5c\x52\x0f\xda\x7a\xc1\xe0\x37\x18\x8c\x3a\xb4\x91\xc3\x69\xb2\xb6\x5a\x0c\x97\x17\x0c\xc6\xba\x84\xe7\x1a\x83\xd5\x61\xb8\xd4\x29\xcc\xba\x1c\x6b\xb9\xce\xea\x72\x5c\x6a\x14\x06\xe0\xc1\xf1\x6c\x52\x58\x04\x7e\x5d\xee\xb7\x0c\xa7\xc5\xea\xb6\x19\xee\x6b\x0c\x46\x43\xc2\xb3\xce\x60\xad\x33\x5c\x58\xbf\xeb\xcd\xf3\xea\x4b\x79\x2e\x92\x39\x73\xc1\xf1\x58\x93\xc6\xaa\xc1\x60\x72\x9c\x3b\xea\x78\x40\xdf\x9a\x5a\xdf\x3b\xac\x4e\x33\x87\x05\x75\xdb\x39\xce\x1c\x06\x1f\x0f\x68\xab\xae\xf5\x1d\x0a\xb5\xa5\x0e\xae\x31\x04\x3b\xf9\xe0\x0a\x20\x0d\x69\xa0\x29\xb2\x39\xa0\x75\x56\x47\x1a\x2c\x98\x98\x76\x3e\xb8\x02\x46\x53\x1a\x68\x8a\xac\x84\x50\x83\x8d\x6c\x4d\x02\xc6\x47\x63\x4d\xcc\x9e\xa0\x50\xc4\x46\x87\x22\xab\xce\x46\x3a\x6f\x65\x50\x14\xd9\x58\x01\x7a\x72\x4b\x9c\xb6\x9a\xd2\x78\x76\xf2\x6f\x0a\x4d\xaf\x79\xf0\x09\x86\x8a\xd3\xeb\x8b\x9c\xf6\x38\x4d\xd5\xdb\xd2\xb0\xae\xb1\xb2\xca\x7c\xd4\x73\x22\x10\x73\xf1\x82\x15\xe4\xc4\xb3\x2e\x95\xe1\x88\xaf\xc1\x6f\xf9\x2c\x25\xd6\x72\x2b\xaf\xca\xdb\x17\x6b\x5e\x5e\x13\xeb\x0a\xc8\x1c\x14\x5f\x9f\xed\x9c\xf6\x45\x3f\x1b\x39\x0a\x62\x9c\x18\xc9\x50\xb8\x48\x9b\x92\x79\x0b\x84\x21\xa6\x0c\x7e\x3b\x47\x00\xfa\xb9\x96\x2f\x44\x68\xb0\xc5\x10\xe9\x68\x48\x37\xd5\xc1\x17\x9d\xae\xe7\x70\xc4\xd8\x89\x05\x0d\xdf\x15\x38\x82\x81\xd4\xa5\x41\xea\xe4\xed\x8a\x85\xc7\x16\x70\xbd\x69\x99\x0f\xd1\x01\x0d\x71\x0e\x48\x2c\xb8\x86\xf4\xdf\xb6\x58\xc5\xea\x00\xb5\x2d\xe5\x5a\xea\xcc\x88\x99\xcc\x3b\x85\xea\x75\x74\xae\x64\xc9\xfe\x38\x24\x2b\xc4\x32\x1f\x48\x84\x6a\xae\x79\xa8\x36\x6b\x6f\xad\x37\xd6\x5e\xbc\x78\x41\x7e\x77\x76\xb6\x5f\xec\xbc\xde\xaa\x93\xdf\xeb\xbb\xf5\xd7\xaf\xbb\xdb\x5d\xf2\x7b\xeb\x45\xbb\xb9\xbb\xdd\xda\x51\xe7\x7b\x98\x38\x1b\x68\xd7\xb6\x1a\xeb\xaf\x77\x3a\xd0\x40\xb7\xb5\xbd\x5d\x6f\xb4\xa0\x81\xed\xb5\x5a\x73\x67\xb7\x49\x7e\xaf\x6d\x75\xb6\xd7\x3a\x3b\xd0\x30\x47\xe8\xdc\xaa\x0f\x38\xde\x3f\xda\x39\xd8\xae\x77\x6a\x10\x7e\x7f\x8e\x0e\x49\x94\xcd\xb5\x48\xd2\x2b\xba\x2b\xdf\xf6\xae\x88\x2a\x13\x01\x09\x47\x10\xec\xce\x5a\xab\xdd\x68\xd6\x60\x04\x77\x76\xbb\xdb\x5b\xaf\xd7\xa1\x83\x2f\xd6\x5f\x6f\x6d\x77\x77\x77\xc8\xef\x7a\xad\xd9\x68\xb7\xd6\x60\x70\xba\xcd\xed\xc6\x4e\x7d\xb7\x76\xee\x54\x8d\x97\x55\xca\x5b\x15\xbb\xa5\xbd\x94\xea\x05\x37\x35\xf3\xcd\xf1\x29\x16\xa0\x7b\xcd\xcd\x22\x1d\xd7\x37\x07\x1f\xa5\xd2\xfc\xf2\xe0\xa3\x69\xc8\x84\x8a\xee\x54\xa4\x7a\x68\x13\x55\xcc\x02\x88\x1a\x80\x4a\x8d\xe5\x86\x0f\xd2\xcb\xc5\x8c\x4a\x0d\x80\xcc\xae\x54\x03\x68\x5a\x97\x9a\xe0\x0a\x54\x63\x68\x9e\xad\xf3\x1e\x12\xf7\x0f\x84\x14\x9d\x57\x8e\xc0\x00\x3e\x0e\x47\xee\x02\x09\x14\x48\x9c\x05\x40\xfc\xfc\xf8\xc5\x0d\x01\x64\xa2\x8f\x5f\xdc\x10\x60\x9b\xfe\x98\xba\x21\xc0\xa6\xf1\x31\x4d\xec\x11\xad\x57\x57\xc9\x2a\xfb\x4c\x0e\xcd\x97\x7e\x12\x12\xe9\xd8\x72\x49\xeb\x8f\x3c\xd4\x1b\x79\xa8\x3f\xf2\x50\x30\xf2\x10\x1e\x59\x1a\xf2\x13\x0f\xf5\x12\x0f\xf5\x13\x0f\x05\x89\x87\x70\xa2\x37\xe6\x13\x54\x7c\x82\xf0\x9e\xe9\x32\xd2\x4b\x20\xe8\x38\x7c\xac\xeb\x1f\xfb\xe4\x63\x9f\x7e\x6c\xe8\x1f\x03\xf2\x31\xa0\x1f\x9b\xfa\x47\x38\x30\x60\xfa\xb1\xa5\x7f\x14\x69\xaa\x7d\x35\x2f\x35\xef\x92\x7e\x2b\x68\x35\x25\x84\xff\x2e\x6d\xa2\xba\x75\x6d\x67\x64\xf9\xf8\x23\xb4\x94\xaf\xa9\xa5\x2f\xa3\xb3\xf0\xfc\xbc\xfa\xd5\xe6\xc4\x00\x5e\x3b\xaf\xea\x9d\xea\x1f\x4f\x9f\xa8\xac\x91\xb4\x81\x06\xf5\x4a\x6f\xe4\xf5\x47\x5e\x30\xaa\xa2\x25\x34\x1c\xd9\x7d\x6f\x6e\x90\x50\xc8\x85\xaf\x9a\x0d\xaa\x6a\xb3\x40\x6b\xe8\xd0\x8c\x91\x37\xa0\xb5\xd6\x9d\xd0\x9a\x3a\x34\x63\xaa\x0c\x68\x9d\x96\x13\x5a\x4b\x87\x66\xcc\xad\x04\xed\x8f\xd5\x55\x06\x71\xbd\xe6\x84\xd8\xd6\x21\x1a\x04\x81\xec\x61\xd2\xc9\x24\x66\xd6\xe9\x22\x5f\x50\x12\x67\xa3\x4a\xe6\xa5\x64\x5a\x6d\x4e\x1b\x40\x03\xd9\x12\x1e\xd9\xa7\x1c\x56\x84\xb1\xa4\xc8\x1f\xd0\x6d\x60\xfb\x02\xe4\x0e\xed\x92\x35\x59\xb7\xba\x01\xc1\x7a\xe9\xd9\x6a\xc3\x32\x33\x6e\x12\x05\xaa\x7e\x82\x96\x24\x6a\x4d\x6e\x4f\xad\xed\x4a\x2f\xf1\xfa\x89\x17\x24\x30\xe2\xc9\xdd\xa8\xb5\xa5\x43\xbb\x2b\xb5\xaa\xd0\xee\x44\xad\x0d\x1d\xda\x9d\xa9\xb5\xae\x43\xbc\x67\x6a\x4d\xe0\xd6\xba\x80\x5c\x13\x07\xb9\x02\x47\x4d\x6c\xe4\x0a\x8c\xd8\xf6\x05\x58\x34\x25\xd7\xc4\x49\xae\xb0\x01\xd8\x6a\xc3\xd6\x60\x5a\x68\xe8\xac\x7c\x5f\x4e\xc7\x00\x32\x24\x58\xfd\x6a\x12\x26\xf9\x67\x13\x55\xf6\xa8\x69\x6e\x9f\x70\xe6\xc0\xd2\xd3\x3d\x66\xc2\xbb\x47\xcd\x6f\x03\x52\xce\x36\x22\x7b\xcc\x4c\x77\x8f\x1a\xd2\x62\x52\xce\xb7\x96\x6b\xb2\x72\x60\x2c\x0b\x3b\x42\xcf\x5a\xae\xc5\xca\x81\x61\x72\x8f\x94\xeb\x5b\xcb\x81\x01\xb3\x32\x2c\xba\x58\xbb\xcb\x52\x6b\xdc\xc1\x3c\x2b\xf0\x33\x5f\x08\x43\xe4\xc1\xb2\xf1\xcf\x4f\xc3\xc8\x4b\x46\xaf\xc3\x2c\x3d\x8d\x33\xe0\x78\x14\x66\xb4\xed\x67\x3e\xb5\xda\x7a\x8e\xd6\x2d\xd0\xa1\xce\x3b\x3c\xc8\x8c\xa4\x8d\x50\xde\xe8\xcc\x56\x10\x98\x59\x88\x11\xcb\xb7\x48\x8d\x99\x72\x90\x44\x9a\x6c\x9f\xa3\xaf\x9b\x34\xb1\x70\x6e\x23\x21\x4a\xfc\x03\x35\x1b\x3a\xb5\xe6\x90\x2a\x95\x4a\x5e\x74\x09\x11\xfe\x40\x40\xbe\xa8\x12\x50\x2d\xb2\x6e\xeb\x2d\x87\x00\xcd\xab\xd2\xe1\xc8\x85\x67\xe9\x65\x79\xe1\xd9\x00\xc6\x04\x67\x0d\xd8\x3c\xc1\xd9\xd6\x51\x39\x4f\x47\x9e\x0f\x93\xe7\xd8\x01\xe3\x18\x4b\xda\x8e\xd5\x55\x38\x09\x22\xc8\xee\x42\x1d\xb2\xac\x86\x53\x13\x7a\xf2\x32\xb3\xb9\x14\x93\x25\xac\x6e\x59\x46\xb7\x10\xce\x1e\xda\x44\xb2\xf8\x7e\xb7\xf3\x5b\xbb\xd4\xf1\xcd\x7e\x22\xdb\x83\xa3\xd8\x9e\xc5\x99\x04\x15\x9d\xc1\xf6\x84\xbb\xde\x9e\x72\xbc\xda\x5b\xf8\x5c\x45\x29\x64\x4f\x39\x53\xed\x39\x0f\x53\xf3\x4d\xe1\x8e\xe9\x4d\x38\x9d\x5c\x96\xc1\x22\x80\xc1\x56\x8b\xb2\x1b\x73\x6d\x82\x14\x36\xd5\x1f\xc5\x51\x31\x83\x02\x53\x02\x52\x2a\xd7\x2e\xc0\xa3\xdb\x0c\x82\x7e\xfe\x68\x10\x09\xad\x67\xd2\x1a\x43\x13\xbe\x2a\x76\x51\xf0\xf3\x86\xde\xfe\x23\xd9\x22\x6e\x50\xaf\xcc\x3c\x74\xed\xa1\x2f\xb6\x34\x1f\x95\xca\x0c\x3c\x3b\xaf\xe1\xdf\x2f\x79\xb6\xf6\x1b\x03\x4e\xa3\x18\x4e\x65\x56\xfd\xa9\x72\x5d\xa5\xee\xe4\xff\x26\x0f\x5f\xaa\xd5\xea\x4b\x17\xb4\xe6\x5c\x68\x04\xd0\xbf\x09\xc4\x1c\x35\x07\xac\xd6\x7c\x58\x3f\x01\x04\xc0\xed\xba\xfa\x53\xe5\xdf\x80\x9c\x1b\x62\xbb\xcc\x98\x91\x41\xfb\x9a\x83\x72\xc0\x02\x51\x62\xe6\x45\x56\x48\xb3\x57\xaf\x22\xc0\x6a\xf6\xf3\xcf\x3f\x57\x9a\x8d\xe5\x48\x46\x8a\xfe\x28\xb4\x86\xe1\xc6\x30\x34\x0f\x5c\x39\x63\x18\x67\xb6\x1f\x66\xdf\x02\x36\x4f\xfc\x77\x16\xff\xff\xec\xbd\x7d\x77\xd4\x38\xd2\x28\xfe\xf7\xf0\x29\xb4\xfb\x3b\x0b\x1d\xd2\x49\x2c\xf9\x4d\x06\x32\xbf\xcb\x64\xe0\x61\xee\xc0\xc0\x81\xcc\x85\xe7\x70\x60\x56\xb6\xe5\xb4\x87\x4e\x77\x9e\x6e\x87\x24\xbb\xc3\x9e\xfb\x35\xee\xd7\xbb\x9f\xe4\x1e\x95\x64\x5b\xb6\x25\xb9\x3b\x84\x79\x76\x76\xc9\x9e\x65\xba\xdb\xa5\xaa\x52\xbd\xa9\xac\x97\x92\x8c\x4c\x43\x34\x96\xfb\x79\x2c\xd0\xd7\xbd\x98\x47\x79\x46\xbb\x93\xa5\x9e\xc0\x9b\xdc\x51\x2c\xde\x31\xec\xc2\xb1\xb7\xba\xa8\xb9\x35\x6d\xb7\x19\x4e\x0e\xf6\xb6\xda\xd4\x00\x9b\x6d\x55\xaa\x95\xf3\xe4\xd9\xc3\xa3\xdf\x41\x35\x8e\xe6\x1f\xf8\x15\x34\x5d\xf3\x6c\xc5\x2b\xcb\xdd\x49\x16\x85\xc2\x95\x83\x37\xa8\x50\x79\x91\x61\xa3\x9a\x27\xa7\x2c\x6b\xd5\xa3\x6f\xb1\x32\x68\xa8\x03\x3c\xd4\xd2\x29\xcb\x0c\x9a\xfa\xe6\x93\x5c\x07\xb6\x6c\x8d\xaa\x21\xcd\xb7\x13\x7d\x7a\x37\x8d\xe3\xaf\x5b\x9c\xfe\x15\x8e\xac\x7c\xe9\xa5\xfb\x5e\x61\x35\x8d\xb0\xb5\x64\xda\xab\x27\x0f\xf7\xf0\x06\x2b\x19\xc3\xbb\xaa\x6f\x72\xfd\xe2\x10\x4e\x9f\xb6\x4b\x18\xe5\xa2\xac\x26\x86\x02\x54\xdd\x25\x0d\x5e\x64\x39\x4b\x69\x62\xa8\xcd\xe4\x5d\x26\x34\x65\x79\x56\xf0\xce\x1a\x87\x09\x30\xf3\x73\xc2\x71\xe1\x75\x9f\x7d\xfe\x12\x88\x2d\x43\x37\x27\xdf\xc3\x19\xf4\x01\x82\x4d\xe6\x9e\xcd\xd3\xc5\xe2\x51\x6a\x9e\x2c\x86\x84\xd1\x3c\x55\x0c\xaf\xab\xe6\x89\x62\xf1\x88\x37\xd3\xc4\x03\x4e\xad\xf3\xc4\xd6\x39\x61\xcb\xdb\x02\xcc\xfb\x20\x79\xc2\xd4\x52\x0b\xe6\xb5\x4c\xfc\xbb\x25\x30\xba\x67\x4f\xeb\xbf\x7a\x42\xc9\x8c\xa8\x3e\xe7\xf0\xfa\x6d\x89\xf6\x90\xff\x0e\xbd\x57\x1f\x69\xfb\x11\x07\xda\xe7\xc8\x76\x77\xa4\x62\x69\xb2\x80\xc3\xb1\xf2\xdd\x12\x5e\x1f\x7c\x6c\x2e\x53\x63\x7e\x13\x82\xa9\xa5\x09\x13\x48\x42\x40\xc2\xe4\x9b\x4c\x0c\x07\x64\x39\xda\x05\x42\xb6\x89\x46\xf4\x00\x11\xcf\x2a\x35\x98\x36\x9b\x4c\x52\x74\x1b\x65\x32\xcf\x15\x1f\x73\xc0\xec\x5d\x86\x4c\xae\xc2\x8e\x4c\xf1\xa1\x07\x28\x18\x23\x91\xa2\xf7\x28\x43\xef\x51\x2e\x31\x47\x3c\x4f\x78\xca\x4c\x45\x87\x7a\x98\xa3\x2d\x98\x97\xbc\x8b\x4f\x99\xea\xc5\x1e\xf2\x2e\x63\x8f\x07\x81\x4f\x02\x3b\xad\x83\xbb\x0d\x39\xea\xed\xa0\xbb\x07\x1b\xf7\x45\xe0\xf7\xc3\x24\xf7\x39\xe9\xcf\xf2\x20\x8b\x4a\x85\xbf\xe4\xa6\xe9\x3e\x74\x88\x32\xd3\x14\x1f\x02\x92\x0f\x1e\x20\xdf\x53\xbd\x04\xf5\x1b\xef\x16\x45\x87\xc8\xc4\x07\xdb\xec\xb4\xd6\x46\x93\x81\x6a\x12\xad\x9e\x6c\x63\xfd\x13\xde\xa8\x33\x11\x08\x13\x86\x83\xca\x27\xa8\x33\x09\x08\x93\x85\x99\x19\xc6\xd7\x27\x0a\x73\x33\x4c\xa0\x4f\x12\xf2\x3e\xcc\xd7\x09\xbe\x7f\xd6\x09\x3e\x91\x0b\xef\x17\xf3\xe5\x72\xa5\xcf\xb9\x1d\xc0\x40\xad\xfe\x3e\x8b\x08\xd4\x42\x68\x31\x8f\xcc\xd3\x0d\xa6\xe9\xbe\xd0\x0c\xdd\x96\xf3\x40\xc6\xe9\xba\x3f\xe2\x6c\xd0\xd7\x29\x84\xc1\x64\x80\x48\x9f\xb7\x9a\x3d\x80\x06\xae\x89\x83\x6e\x42\xde\x9d\x33\x10\xcf\xbe\x4e\x17\xdc\xe8\x74\x01\xe8\x63\x83\x99\x02\xb3\x5a\xda\x49\x02\xa5\x1a\xfb\xb1\x29\x01\x60\x9f\x16\xa0\x7f\xe8\x02\x1b\xeb\x19\x23\x61\xf4\xa5\x6b\x63\x28\x2a\xff\x3e\xd3\x07\x83\xe9\x01\xfd\x1d\x9e\x84\x51\xe7\x2d\x5e\x3b\x85\xdd\x9f\x15\x20\x24\xd8\x6c\x5e\x40\x00\x76\x70\xc2\x77\x89\xfc\x77\x9d\x1b\xc8\xb0\x17\x26\x3c\xa7\xe2\x95\xdf\x8f\xe2\x2c\x0f\xbd\x18\x3e\x7b\xb1\x97\xe7\x18\x3e\x17\xb1\xc7\xc3\xc4\x37\xcf\x19\x14\x45\xe6\x79\xa9\x0f\x93\x0b\x11\x0d\x29\x0e\xb1\xfc\x1c\x14\x09\x2d\x18\x20\x48\x79\xc1\x82\x82\x05\x5b\x4c\x17\x6c\x94\x79\x6a\x61\x5f\x89\x4e\x6b\xe9\x38\x45\x0b\x11\xb5\x49\x67\xf6\x0e\x87\xc9\x8b\x65\x61\xe9\xeb\x10\x3d\x32\xe2\x12\x12\x6c\x3b\x48\x8b\x26\x23\xc3\x74\xc7\x3b\x06\x03\x35\x21\xe6\x43\xec\x5f\x87\xea\xcf\x18\xaa\x85\x56\x36\x1b\xac\x8d\xca\xe9\x0c\xd7\x52\x41\xce\x01\x9b\x90\xfe\x51\x67\xed\x5c\xb3\x1a\x8e\xee\xc5\x89\x18\xc0\x93\xaf\xf3\xfa\xff\x3d\x03\xf3\x1f\xef\x58\xde\x0f\xf2\x12\x87\xf2\x6f\xcd\xa9\x5c\xb4\x5a\x9e\x2f\x72\x94\x75\xcf\xeb\x69\x3d\x78\xd2\xbf\x3a\xe5\xc7\xee\x32\x40\x3d\x51\xcb\x5b\x1c\xf2\x89\x29\x83\x41\xfa\x92\x72\xb9\x7e\xb1\x2a\x4f\xf9\x64\x61\x1c\xc6\xd6\xff\xb5\xaa\x7e\xaa\xdf\xf3\xc5\x97\xc9\xa2\xff\x9e\xd9\x4c\x04\x4b\x75\xa2\x43\x44\xee\xd7\x9f\x1f\x1c\x4a\x0c\xf5\x0f\x8e\xb9\xe1\x3f\x4d\x16\xe8\x2f\x0a\x6c\xc7\x3a\x5f\xa8\x7c\xb4\x60\xf3\x35\x1f\xdf\x15\xd8\x9f\x1f\xab\xdf\xc7\x57\xe7\xdd\x37\x5c\x83\x58\x4e\x78\xf5\x78\xc5\xe0\x33\x9b\x7f\x57\x56\x6b\x83\x80\x9a\x25\xfc\x05\xda\x43\x93\x05\x54\xf6\xdc\x41\x77\x3b\x93\x1f\xfd\x99\x2c\x8d\x56\x3d\x4b\xad\x57\x66\x87\xdf\x40\x21\xbd\xfa\x3d\x17\xb3\x72\xce\xd1\x44\x3d\x7b\x80\xd4\x96\xcc\xbe\x14\x5b\x6d\x5a\x05\xdd\xa0\xa0\x56\x29\x3f\x79\x2b\x81\xa0\xec\xe8\x40\x10\x60\x0b\x67\xcb\x8b\xc9\x62\x8a\x30\x3a\x40\x64\x67\x83\x8a\xed\x08\x6e\x42\xd9\x06\xad\xbf\x63\x2c\x9e\x2d\x51\xec\xee\x8e\x4c\x85\x2e\x3a\x10\x75\x86\x34\x69\x71\x5e\x7f\x8d\x4d\x24\xde\x9b\x65\xd3\xc3\x0c\xfd\x8b\xaf\xb4\x3d\xd9\x5f\xcf\xcb\x8c\x4f\xbc\x9d\xaf\xab\x5e\x1b\xaf\x7a\x0d\x1e\x15\xf0\x28\x34\x3d\x3a\x81\x47\x83\x05\x23\xc8\x59\xe0\x51\xfc\xd9\xcb\x68\x91\xa3\xd6\xfd\xef\xbd\x8c\x76\xc2\x4e\x4f\x99\x77\xd9\x2c\xa6\xe1\x81\x50\x86\xd0\xb0\xd1\x78\x52\xb7\x7c\xf0\x00\x11\xb9\xe8\x55\xff\xf2\xed\xb7\xdf\xa2\x78\x67\x07\xa1\xf7\x66\x4c\xdd\xbf\x0e\x26\x1c\x0c\x30\x61\xba\xb3\xb3\x19\xa6\x6e\x3b\xdf\x18\x5e\x3a\x3d\xc1\x6d\xbf\x8d\x9b\xe4\xbb\xc0\x5a\xb7\xb1\x64\x56\xeb\x36\xbe\xac\xeb\x4d\x6f\xc8\x6c\x17\x93\x3f\xc4\x94\x6c\xd9\xed\xba\x9d\xf9\x4e\x02\xd4\x1a\x8e\x52\xe2\xae\xea\x39\x14\xf9\x55\x3d\xdc\x75\x2e\x98\xda\x56\x3f\x33\x38\xd5\x38\xe1\xe8\x36\x2a\x60\xb3\xdb\x3f\xc4\xc7\x13\xdb\x15\x2e\xa7\x0c\x2a\xcc\x31\x74\x1b\xa5\x00\xce\xe4\xea\xe0\x7b\xa4\xd6\x09\x4d\xfc\x43\xb2\x52\x9e\x08\xc6\x9b\xa5\x56\xb5\xd8\xa6\xd6\x5a\xe5\xd6\x3f\xf9\x04\x27\xda\x13\xec\x77\x1e\x75\x1a\x99\xc7\xb6\x86\x18\xdc\x53\x33\xe1\x60\xe3\xb2\x72\x32\x87\x76\x91\xc2\x28\x9f\x60\xed\x09\xc6\xfa\xa3\x58\xee\x6c\x95\x8f\x48\x68\x1e\xf1\x60\x01\x59\x50\x9a\xa1\xdd\x9a\xec\xae\x10\xea\xae\xbc\xe8\xcd\xba\x78\x0c\x0d\x09\x3a\xac\x05\xb3\x2b\x44\x6b\xa2\x20\x02\xd7\x89\x01\x81\x88\x75\xfd\x3a\xed\xe2\x4f\x84\x47\x53\xfa\x05\xb5\x33\xe1\xb6\x04\x6c\x5a\xe6\x43\x23\x4b\xa4\xfd\x6a\xeb\x68\x64\x39\x74\x52\x09\x41\x54\xc4\x44\xeb\xdf\x65\x69\x54\xc2\x84\x0a\x06\x4a\x86\x17\x66\x98\x48\xc1\x40\x49\xf0\x13\x33\x4c\xac\x60\xc0\xe7\x67\x5f\x97\x61\xbf\x2e\xc3\x7e\x5d\x86\x1d\x66\x9b\x5f\x97\x61\xff\x29\xe7\x78\xc3\x68\xeb\x39\xde\x30\x1a\x9d\xe3\xd5\xdf\xd9\x86\x73\xbc\x61\xf4\x75\x8e\xf7\xc6\xe7\x78\xc3\x68\xd3\x39\x5e\x93\x72\xba\x73\xbc\xa0\x20\xf7\xa6\xed\x66\xed\xcc\xbc\x34\x4b\xbd\x3f\xf4\xd2\xec\x65\x14\xfc\x2e\x17\x17\x34\x74\xbe\xce\x02\x77\x67\x81\x2f\x23\x58\x53\xdd\xbf\x8c\x02\xed\xf7\x37\x51\xa0\xaa\x74\x03\xc4\xbe\x56\x27\x7a\xab\x9a\x6e\x5a\xff\x5e\x3e\x79\xfe\xcb\xf3\xc7\x8f\x5f\x3d\x3a\x7e\xd5\x9f\x2d\x7e\xf1\xc3\x2f\x3f\xfc\xf4\xfd\xa3\x37\x8f\x86\xb7\x72\xbf\x7c\xfe\xf3\x4f\xdf\xff\x72\xf4\xfc\xa7\x57\xc7\x0f\x7f\x6a\x5a\x6a\xe4\xe4\xb4\xf2\xd1\x66\xd3\xca\x5a\x8b\xd5\x6c\x59\x17\x6d\xe9\xcd\x49\xd7\xa4\xc5\xdb\x35\x9e\xa2\x2b\x5b\xa9\xf2\x4a\x4e\x89\x54\xe8\x01\x22\xc1\x7d\x54\x19\xa6\x44\xb4\x3e\xbf\xbd\x44\xbb\x28\x44\x77\xd1\x95\x3c\x3d\x58\xd5\x87\x34\xe1\x13\xd9\x81\x99\x4a\xf4\x17\x14\x0d\x72\x11\x48\x03\xf9\xc5\x1b\x74\x88\xae\xd0\x5f\x50\x68\xca\x12\xf9\xc5\x7f\x0a\xac\x04\xdd\x45\x82\x8e\x2f\xe8\xec\x18\x80\x2f\xe5\xb4\xdc\x9b\xde\xcf\x57\xf2\xe7\xff\xb4\x4c\x05\x6b\x62\x3b\x2b\x51\x09\xd7\x09\x18\x84\xd6\x48\xe6\x52\x4a\xe6\x52\x1e\xd0\xbc\x34\x08\xa6\x01\x95\xd2\x45\x57\x12\xf4\xca\x32\xad\xd4\x1a\x48\x57\x8c\x57\x70\xc1\xcf\xb0\xd7\x42\xae\xfd\xae\x7f\x1a\xed\x5b\x6f\x95\xa3\x6b\x0d\x4f\x1f\xbf\x7a\x29\x78\xbd\xf4\xb0\xc9\x18\xf4\x7b\x27\x2c\xf3\x63\x02\x0c\x48\xd4\xc6\xfa\x6c\x7d\xd1\xb3\x2d\x23\xd8\xd3\x1a\xcc\x22\x42\x75\xf3\xc4\xaf\xe8\x01\x8a\xef\xa3\x5f\x1d\x33\x73\xd0\x07\x38\x9a\x6a\xae\x8a\x52\x93\x4f\xcb\xea\xc5\x72\x0d\x75\x5c\x85\x55\xc1\x65\xb9\xbf\xee\xa0\x3d\x64\xda\x4d\x5d\x23\xd7\x1b\x3d\x40\xaa\x5e\x84\x09\x58\xfc\x0d\x3a\xf8\xfe\x10\x01\x19\x0d\x8b\x85\x56\x77\x47\xb5\x4e\xf5\xdb\x43\x20\x6b\xdf\x5c\x3d\xa0\xfc\x4c\xa3\xdc\x41\xb5\x67\x78\xef\x69\x18\xd8\x6c\x6a\x49\x33\xac\x05\xbf\xac\xc0\x80\x46\xd4\x42\xed\x3b\xd1\x0f\x0e\xd0\x8b\x55\x79\x5a\x56\xe5\x47\x8e\xce\x96\xf3\xab\xc5\xf2\xb4\x64\x73\xb4\xfc\xc8\x57\xe8\x3f\x1e\x4f\xc8\xce\x3d\x74\xf9\x9e\xa2\x5d\x74\xf9\x3e\x82\x7f\x43\xf8\x37\x10\x61\xc6\x8c\x52\x59\xb4\x24\x2f\xcf\x0f\xbc\x47\xde\x65\xec\xd8\x32\x6f\x61\x4e\x61\x38\x34\xda\xc7\xc8\xa2\x57\x2f\xc0\xcb\x39\x3e\x35\xfc\xd4\x05\xc6\xfa\x3a\x9b\x0e\xec\x67\x67\xdb\xd5\x94\x35\xf8\x4f\xc5\x4f\xcf\x96\x2b\xb6\xba\xea\xdc\x44\x27\x5c\xe0\x58\x1f\x88\xac\xab\x94\xc6\x5b\x67\xcc\xde\x7f\x6c\xec\xd9\x18\xdf\xbd\xb5\x1d\x7f\xb3\x95\x1d\xbf\xb3\xae\xe3\xbb\x56\x75\x6e\xfe\x2a\x81\xe5\x79\x75\x76\x5e\x3d\x85\x57\xeb\x0e\x2c\x82\x24\x3d\xe7\xeb\x72\xc5\x73\xed\xa2\x81\xb4\xac\xd6\x75\x41\x68\xd9\xb8\xf3\xb6\x50\x37\x7e\xbe\x98\xd7\x6a\xd2\x6a\x70\xb3\x15\xbf\x87\x08\x09\xa6\x88\x84\xd1\x14\xf9\x34\x98\xa2\x10\x93\x7e\x63\x75\x67\xc1\x3d\xf1\x4c\x7f\xd4\xbf\xb4\xa0\x7e\x69\xb6\xde\x5b\xa0\xf7\xae\x87\xed\x1a\xf7\x17\xc0\x4c\x2d\xdc\x84\x58\xbf\x7b\xd7\xdf\xde\xbe\xb3\x44\xfb\x0d\x4c\x4d\xfc\x01\x1e\x69\x72\x0b\x7e\xd1\x98\x1d\x2c\xc2\x8d\x95\x12\x00\x4e\x9a\xdb\x7a\x61\x04\x88\x3c\x0f\xed\x21\x31\xd0\x36\x37\x25\xe8\x92\x10\xd9\x8b\x4f\xbe\xd4\x8a\x9e\x61\x62\xce\x20\x34\xe3\xe4\x59\xdd\x89\xa7\x6c\x01\x73\x3f\xbd\xae\x1d\x20\x62\x9a\x43\x4b\xd7\xcb\x55\x3a\x2e\xff\x1e\xfa\xcf\xa9\x24\xf8\x8c\x94\xa8\xbb\x28\x26\x64\x6d\x9d\x36\x7f\x46\xe0\x0e\xfa\x3e\xb8\x88\xf5\xae\x62\x16\xd6\x2b\xa8\x05\x79\x67\x3d\x41\xd2\x29\x24\x48\xae\x53\x41\x90\x74\x4a\x07\x92\xeb\xd7\x0c\x54\x0c\xe3\x31\x8e\x71\x97\x65\x7c\x2d\x9e\x71\x97\x69\xbc\x0d\xd7\x46\x3d\x48\xe3\x6a\xa6\x46\xca\x45\xb5\x94\xd6\x6c\xd6\xf4\x9c\xc1\x64\x5e\xed\xce\x06\x51\x08\x88\x7d\xb8\x6f\xf6\xfd\x21\xc8\xc5\x06\x33\x5f\x5e\x20\x05\x33\xbe\x1a\xf1\x52\x0c\xb0\x6b\x8b\x0f\xc8\x44\x19\xfc\x40\x7e\x94\x49\x2f\x7c\xb6\xbb\xc0\xf1\x8c\x57\x6c\xf8\x64\x8b\xb7\x06\x0d\xd9\xb3\x52\xbc\x82\xcc\xcf\x4f\x17\xd0\x39\x83\x5b\xd5\x12\xac\xd3\xec\x29\x6a\x33\x69\x23\xf0\x96\xef\x24\x3a\x8d\x8e\x96\xda\x37\x14\x0b\x21\xf1\x57\xa7\x9e\x8d\xf6\x5c\xb0\x4f\x35\xd8\xf9\xf2\xc2\x9a\x97\x5a\xa5\x75\x6c\xcc\x73\x4c\x3d\x39\x16\x5a\x38\x7e\x7b\x69\xe3\xfd\xf8\x52\xda\xda\x21\xf4\xc0\x0e\x04\xc6\x76\x08\xac\x6f\xb6\xfb\xe6\x7a\x66\xe0\x08\xab\x6d\x8f\x02\xe8\xd2\x44\xe8\x25\x80\xd7\x43\xd7\x62\xf9\xf1\x25\x6e\xc1\xf1\x26\xe0\xd2\xbe\x8e\x2f\xb1\x4b\x8f\x0a\xf6\x69\x03\x0b\x7a\x74\x9a\xf7\xfa\x7c\x05\x1e\x25\xaf\x13\x11\xa6\x3e\x6e\xe5\xc7\x97\x81\x8a\x05\x68\x32\x51\xbc\x35\x47\x83\x15\x7d\x75\x3e\xd8\xf6\x7a\x03\xd8\x9e\x36\xd8\x64\xd4\x90\xd8\x9e\xf6\xb0\x3d\x1b\xc7\xf6\xbb\x3a\x55\x27\x14\x3a\xec\x13\xf5\x43\xa2\xc5\x4c\xd1\x56\x6f\x7b\x2f\x67\x4b\xf4\xa2\x74\x58\xb6\x20\x59\xdf\xf9\x88\xef\x6b\x5f\x65\x2a\xd7\x7c\xff\x6c\x93\xef\x48\xae\x41\xeb\x32\x63\x01\x24\x2d\x68\x2c\x20\xd5\xd0\x4f\x5b\x68\x7b\x48\x82\xc1\x62\xb6\x7c\x2e\xb3\x94\xc3\xce\x7c\x98\xce\x97\xb5\xb3\x2f\x97\x90\xe8\x39\x42\xbc\x78\x81\x6e\x49\x8c\x4e\x3c\x68\xbe\x32\xa9\x3b\xfd\xe0\x41\xcb\x24\x98\x76\xdd\x3f\xb8\x4a\xd3\x27\x68\x4f\x7b\x6e\x33\x74\xd4\x75\x9d\x06\x87\x11\xf9\xb3\x2d\x91\x77\xe7\x3c\xda\xee\x6e\x34\xe3\xd1\xef\xb2\xe2\x4a\x43\x03\xb3\x1d\x43\xe6\xa2\xe0\xda\x3d\x7f\x36\x42\xe3\xe9\x96\x34\x5c\x63\xdb\x8a\x2d\xd6\x67\xcb\xb5\xd3\x4a\x20\xfc\xbe\x28\x9f\x4a\xc7\x38\x7e\xab\x4d\x28\xb6\x76\x68\x1d\xf3\x64\xc3\x4d\x06\x3e\x05\x39\x36\xfa\x59\xe3\xc7\x59\x89\x58\x05\x43\x20\xc4\x4b\x73\x4e\x78\xec\x41\x1f\x8c\x45\x5b\x9b\x97\x23\xaf\x09\x00\x46\xb8\x63\xaf\xee\x8e\x84\xb6\xb9\xfc\xb1\x57\x77\x46\xc1\x59\xc6\xad\x83\x03\x74\x34\x73\x05\xbf\xcd\x87\xf5\x6b\x0e\x19\xe3\xa1\x11\x69\xe1\xab\x8e\xc3\xcd\xb8\x32\x62\xdc\xdb\x85\xd4\xba\xd5\x71\x63\x70\x9b\x37\xb9\xc4\x4d\xa3\x89\x96\x84\xec\x6c\x32\x00\x4a\x04\xa4\x87\x80\x0c\x10\x38\xa5\x28\x72\x8f\xd5\xf2\xc2\x21\xc4\xb9\xe6\x0d\xc7\xad\x6b\xbc\x47\x93\x7f\x28\xf6\xe5\x0f\xb7\x6b\x66\xe0\xab\x2b\x7e\xcc\x35\xaf\x39\x6e\x5d\x48\xc7\x08\x3f\xb4\x18\xe7\xcb\x8b\xcf\x9f\xa0\xfd\x61\x69\x7a\x23\x19\xe8\xdb\xea\x69\x9d\x69\x48\x31\xbe\xf5\x26\x33\xe1\xf9\xe8\x4b\x5b\x07\x8b\xcd\x11\x3b\xf9\x4a\xb7\x85\x70\x49\xc7\x62\xc7\x3f\xd7\xb6\x28\xc3\x24\xcd\x8d\xef\x8a\x1a\xc0\x37\x33\x3e\xa2\xdd\x70\x1a\xe8\x2e\x4c\x5e\x0d\xe7\x81\xae\xbb\x97\x0a\x5f\x67\x2b\x15\x6c\x92\xca\x78\x39\xef\xee\x77\xc2\x3b\xe8\xa0\xcb\xff\x0e\xba\xdb\xff\x01\x88\xc3\x02\x4d\xb3\x9b\xeb\x9f\x64\x13\xd4\x67\xcf\xe1\xe9\xd3\x8c\x35\xf3\xc6\x39\x48\x74\x60\x54\xbd\x0e\x52\xcf\x02\x0e\x71\x1e\x18\x37\xd3\xbd\xfa\xaf\x73\xce\xff\xc6\x87\x48\x67\x6c\x3d\xab\x8d\x7b\xa3\xbb\xe8\x07\x5c\x7c\xce\x64\xe1\xf8\x9c\xd0\xe6\x29\xbd\x2d\x9d\xdf\x7e\x0e\xb1\xa5\x67\x9f\x95\xd3\x52\x43\x35\x31\xa7\x27\x9c\x5b\xcd\xcd\x69\xa8\xd4\xf4\x9c\x8e\xea\xba\xf3\x8a\xad\x28\xdc\x9d\x78\x3a\xe8\xc4\xd3\xeb\x76\xe2\xe9\xa0\x13\x4f\xb7\xeb\x84\x59\x55\xd2\x74\x95\x93\x55\x4b\xb4\xe2\xd5\xaa\xe4\x1f\xb9\x61\x03\x22\x52\x87\xbb\x65\x3c\x38\x3b\x5f\xcf\x6a\x36\x4c\x22\x32\x40\x3e\x1b\x42\x7e\x7e\x79\x62\xc3\xe9\xa1\x86\xf4\x74\xe8\xc2\xd6\xf3\x44\x37\xb4\x6b\xd2\x1e\xbf\xd4\x16\x4a\x43\x38\x6b\x0e\x3b\x6d\x10\x21\x36\x5c\xcc\xa9\x3f\xb6\xfb\x33\x9d\x62\xff\xba\x5d\xf3\x9a\xdb\x35\xfd\x6d\x37\x6b\xfa\x63\x5b\x35\x7d\xc7\x46\x4d\xff\xeb\x36\xcd\x9b\xde\xa6\xe9\x6f\xb8\x49\xd3\xa0\x96\xce\x16\x4d\x7f\x93\x0d\x9a\xbe\xfd\x18\x7e\xb3\xf1\xf0\x1e\x0d\x3e\xbd\x9b\x52\xfc\x2f\xb2\x5d\xb3\x5f\x60\x27\xc4\xe4\x77\xdb\xc3\x59\x97\xdb\x11\x34\xff\x58\xe5\x76\xae\xb5\xdb\x52\x3d\x6e\x77\x7b\xd6\x30\x5b\x15\xe4\x09\x31\xe9\x6c\x0b\x09\x31\xb1\x6e\x33\xa1\x1b\x16\xe4\x11\x80\x9d\xad\x26\x54\x55\xb5\x08\x31\xb9\xb1\x23\xc4\x7a\xf7\xad\x35\x79\x06\x9b\x1c\xbc\xcb\x2c\x4d\xd3\x24\x0f\xf3\xa9\x56\xb0\x67\x67\x6a\x82\x8c\x48\xc2\x48\x42\x98\x5e\xce\x67\xc7\x50\xb7\xc7\xd0\x34\xc1\x61\xe2\xe1\x90\xe9\xd5\x7f\xcc\x44\x70\x48\x0a\x9e\xc9\x9a\x41\x75\x6d\xa0\x0d\x89\x44\xb1\xef\x93\x28\x92\x65\x85\x54\xe5\x20\x33\x11\xca\xd3\x20\x60\x34\xd6\xeb\x0a\x6d\x48\x24\x4f\xbd\x8c\x70\x2f\xd7\xcb\x10\x99\x89\x04\x71\x1a\x06\x14\xe7\x7a\x91\xa2\x5e\x6a\x7a\xd3\x55\x8a\x84\x3d\x5d\xb3\x4a\x11\x8e\xbe\x96\x29\xba\xa1\x9c\x88\x6e\x5d\xa6\x48\x34\x19\xcb\x8b\xf4\x98\x31\xcc\x8c\xe8\xd7\x32\x45\x37\x9f\x1b\xd1\x4d\xcb\x14\x19\x95\xd3\xcd\x8f\xe8\x68\x99\x22\x9f\xba\xcb\x14\x89\x61\xfc\x1e\x25\xa6\x6c\x89\xfc\x8b\x64\x4b\xff\xd2\x87\x5b\x6e\xf6\x60\xcb\x17\x3a\xb2\x72\xfd\x24\x4a\x3e\x6a\xba\xab\x10\xfd\x52\xef\xe0\x35\xdc\x75\xd3\xdd\xe4\xbb\xcf\xce\xce\xe6\x57\x13\xf5\xe3\x14\xb1\xd5\xc9\xf9\x29\x5f\x54\xeb\xfe\x9d\x3c\xfa\xf1\x99\x96\x1f\x28\xa5\xd4\x92\xe8\x91\xf7\x2e\x03\x42\x19\x29\x12\xc8\x2b\xf2\x98\x50\xc6\x09\xd9\x99\x0e\xe1\x62\xec\xc7\x41\x90\x40\x99\x41\xe2\xf3\x22\x0a\xb3\x5c\x4f\x0d\x06\x0d\xd2\x30\xf3\x8a\x34\x2b\xe0\x02\x84\x2c\xc8\xfd\x94\x14\x26\xc4\x3c\x49\xc3\x3c\x65\x21\xdc\x9e\x8d\x69\x92\xa7\x69\xe6\x44\xec\x27\x61\x94\x91\x30\x85\x74\xc6\x0f\x68\x1a\xfa\xd4\x84\x38\x4c\x0a\x8c\x71\x01\x1c\xa7\x91\x17\xe6\x1e\x4e\x9c\x88\x13\xe2\x17\x94\x30\xb8\x72\x9b\x15\x38\x09\x8a\x24\x35\x21\x66\x29\xce\x42\x9e\x03\xc7\x39\x8b\x72\x8a\x31\x75\x22\xce\xa9\x17\x33\x26\x65\xcc\x7c\xcf\xf7\x48\x60\x94\x31\x26\xd4\x0f\x53\x79\x67\x44\x10\xc6\x5e\x54\xa4\xdc\x89\x98\x04\x3e\xa6\x61\x0a\x77\x47\x04\x9c\x07\x29\xa1\x99\x51\x14\xa1\x97\xc5\x79\x06\x17\x88\xe7\x61\x51\xa4\x01\x27\x4e\xc4\x31\x49\x79\x98\xc7\x20\x8a\x82\xc4\x29\x4d\x22\xa3\xf2\xa8\x97\xf3\x14\xcb\xcb\x2b\xfc\x14\x47\x49\x94\x62\xb7\x8c\xd3\x3c\xf3\x22\x59\xa1\x92\x84\x59\x8c\x89\x1f\x9a\x10\x67\x38\x49\x0b\x2c\x19\xc8\x8a\x28\x21\x51\x12\x38\x11\xf3\x20\x49\xa3\x24\x03\xd9\x25\xbc\xc0\x01\xcb\x8d\x32\xe6\x45\xca\x83\x98\xc2\x35\xe2\x3e\x0d\x0a\x12\x72\xdf\x89\xd8\x2b\x32\x9c\xe4\x19\x34\xa0\x29\xcd\xf2\x30\x35\x72\x4c\x02\x2f\x63\x38\xcb\xe0\x92\xf6\x98\x65\x49\x16\x85\x6e\xe5\xe5\x3c\x21\x59\x04\x0e\x12\x26\x24\xf5\x48\x6c\x44\x1c\xb0\x38\xa0\x01\x83\x77\x84\x88\xb3\x88\x07\xd4\xcd\x71\x98\xa5\x1e\x4b\x72\xe0\x24\xcd\x03\x5c\xa4\x79\x60\x74\xe9\xa8\x48\x28\xcd\x01\x31\xf5\x31\x0e\xfd\xd4\xcd\x71\x42\x7d\x1e\xe2\x90\x80\x4b\xf3\x28\xca\x0b\x66\x76\x10\xea\xe3\x2c\x8a\x20\xc3\x27\x79\x1a\xf8\x04\x7b\xee\x58\xe1\x79\x3e\x89\x33\x2a\xef\x7c\x2f\x52\x82\x7d\xa3\xb9\xa5\x45\x98\xc4\x45\xa6\xea\x9b\xf2\xc2\xe3\xdc\x6d\x15\x59\xc4\x3d\x2f\x2d\xc0\xf0\xfd\x9c\x51\x5a\x64\x46\xab\xc8\x43\x16\x27\x38\x00\xc4\x89\xef\x31\x16\x13\xb7\x28\xbc\x28\x63\x91\x1f\xca\xeb\x5d\x3c\xcf\xa7\xc4\xec\x20\x38\x20\x09\x49\xe4\xbb\x97\xc7\x3c\x1e\xf1\xd8\x2d\x0a\x12\xa7\xb1\xc7\x28\x04\x97\x20\xca\x09\x29\x0a\xa3\x4b\x13\x8e\x85\x98\x40\x64\x61\x46\xa2\x2c\x21\x91\x13\x71\x90\x93\x2c\xca\x0b\xb0\x8a\x90\x65\x01\x61\x3c\x37\xc6\x0a\xdf\xa7\x5e\x8e\x41\x64\x49\x9e\x84\xa9\x9f\x17\x4e\xc4\x51\xe8\xb1\xd8\x0f\x03\xe9\x20\xac\x88\xfc\x9c\x9b\xcd\x2d\x62\x1e\x4b\x21\x6e\xfb\x59\x1c\xa7\x84\xb9\xc3\x26\xc5\x19\xc9\x12\x22\xa3\x5b\xcc\x73\xc6\x79\x64\x42\x9c\x90\x98\x90\x4c\x8a\x0c\x07\x94\xf8\xa1\x9f\x3a\x11\x33\x92\x16\x9c\x32\x19\x67\xb3\x02\x7b\x7e\x64\x74\x10\x46\x31\x8b\xa2\x00\x38\x4e\xb3\x80\xf8\x9e\xe7\x8e\x6e\x19\x09\x52\x9a\xc6\x1e\xc4\x59\xaf\xa0\x49\x9c\x60\x63\x74\x8b\xa3\x2c\xc4\x0c\x64\xec\x45\x61\x90\x72\xdf\x6d\x15\x39\x4e\x08\xa7\x38\x01\xc4\x11\x2f\x42\x82\x8d\x63\x5e\x1e\x25\x89\x17\x11\xd0\x45\x18\x46\x21\x4b\x46\x3c\xaf\x08\x3c\xee\x87\x52\x76\x61\x1c\x63\xe2\x11\x66\xb4\x63\x2f\x62\xcc\x93\x3d\xf3\x49\x9a\xe6\x38\x75\x2b\x0f\x27\x2c\xc8\x30\x86\xb0\x99\xd2\x9c\xe4\x5e\x66\xe4\x18\x73\x3f\x8e\x32\x4f\xda\x31\x0e\x30\x4b\x43\x77\x74\x23\x71\x40\xe3\x38\x00\x3b\xce\x0b\xca\x79\x9a\x24\x26\xc4\x7e\x90\x7a\x69\x96\x42\xcf\x38\x4e\xd2\x80\x8e\x98\x9b\x9f\xe0\xcc\xcb\x52\x50\x4a\x16\x66\x49\xc8\x22\xdf\x18\x8f\x79\x4e\x19\x0b\x20\x6c\x72\x3f\xc0\x94\x65\x6e\x73\x0b\xd3\x24\xcb\x58\x50\xc8\x91\x21\xf2\xb9\x1f\x1b\x11\x47\x94\xf0\xa8\x90\xc1\x2a\x8f\x52\x92\x52\xe6\x16\x45\x1c\xd0\x82\x12\x0e\x0e\x12\xe6\xbc\x48\x89\x39\x56\xc4\x94\x85\x91\x2f\x47\x9a\xc0\xc7\x31\x29\x22\xb7\x55\xd0\x20\xa3\x31\xc5\x32\x13\xc2\x85\xc7\xd2\xd8\x18\x36\x69\x96\xc5\x1e\x91\xca\xc3\x2c\x0a\xfc\x84\xbb\x73\xb7\xc4\x4b\x79\x51\x14\x4c\x66\x91\x91\x8f\x39\x31\x5a\x05\x0b\x42\x2f\xca\x38\x78\x5e\xce\x29\x49\x73\xee\xce\xdd\x52\x5e\x24\xcc\x2f\xe4\xc8\x40\xb2\x28\x4e\xb0\x39\xaf\x88\x62\x1c\xd3\x42\x0e\x61\x7e\x4c\x42\x9f\xb8\x95\x97\x31\x12\xfb\x3c\x03\x19\x73\x46\xa2\x08\x27\x46\x19\xe7\x98\x46\x29\x95\x43\x13\x11\x86\x44\xba\x93\x80\xc3\x44\x84\xe5\x2c\xce\x73\x70\x90\x2c\xe7\x1e\x4f\xb1\x31\x6c\x16\x61\x9c\x07\x45\x5c\xa8\x41\x97\xe7\x38\x76\xdb\xb1\x17\x15\x5e\x14\xcb\x7c\x21\x26\x38\x8e\x8a\xd4\xe8\xd2\x1e\x8b\xfc\x38\xcf\xc0\x41\x18\xc9\x68\x42\x99\x7b\x04\xc1\xd8\x2f\x12\xea\x05\x6a\xe2\x2e\xf1\x72\x66\xe4\x18\xa7\x31\xf6\x52\x5f\xc6\x63\x1f\x67\x41\x8c\xdd\x32\x26\x34\x4f\xe3\xb8\x08\xa5\x55\x78\x41\x9c\x53\x63\x3c\xf6\x49\xc6\x58\x1a\x83\x55\x04\x5e\x16\x93\x20\x71\x3b\x88\x9f\x25\x3c\xe5\x1e\x88\x02\x87\x59\x92\xf2\xd4\xa8\xbc\xc0\xc7\x79\x14\x67\xd0\xb3\x24\xc3\x9e\x97\x07\x6e\x3b\x0e\xb2\x2c\xcc\x03\x99\x78\x67\xa9\xcf\x03\x92\x1a\x87\x26\x91\xae\x90\x24\x81\x60\x55\x64\x51\x18\x73\x11\x5e\x5d\xb1\xa2\xc8\xd2\xa8\x60\x72\x90\x64\x79\x54\x30\x6e\xe4\x38\xca\x82\x00\x27\x14\x10\x07\x2c\x88\x43\x8a\x63\x35\x89\xfa\xce\x71\x6c\xb5\x7d\x2f\x7c\x7d\xdd\x13\xaa\xb6\x6b\xd0\x5e\x77\x4e\xa8\xfe\x72\xbd\x13\xaa\x21\x26\x9b\x2d\x1d\x18\x96\x23\x6e\xbe\xfa\xe8\x75\x97\x0e\x22\xe6\x25\xbc\x9e\x70\xf7\xd3\x2c\x4b\x3c\xcb\xd2\x41\x9a\x46\x31\xe3\x72\xf8\xa5\x41\xc6\x58\xdc\x4d\x5d\x1c\x44\xfc\x2c\xe2\x85\x1f\x43\x24\x2b\x78\x12\x14\x54\x44\x32\x13\x24\x0b\x83\xa2\x08\x7d\xf0\x82\xb0\xc0\xb9\x1f\x15\x9b\xce\xea\x87\xd8\xe3\x21\x91\xc1\x87\xe5\x3c\xa2\x24\xb7\x2c\x1d\x24\xa9\x17\x46\x54\x1a\x24\x49\x7d\x1e\x65\xb8\xd8\x90\x08\x2e\xa8\x9f\x27\xd2\xe6\x8b\x34\xc0\x69\x1e\x59\x7a\x12\xa6\xdc\xcb\x72\x99\x06\x61\x3f\xe6\x04\xc7\xc9\x36\x4b\x07\x37\x7d\x8e\x74\x93\xd2\xb0\x00\xe7\xd9\x2b\xbf\x3e\xc1\xf6\xd2\xaf\x4f\x88\xbd\xf6\xeb\x13\xdf\x5e\xfc\xf5\x49\x60\xaf\xfe\xfa\x24\xb4\x97\x7f\x7d\x12\xd9\xeb\xbf\x3e\x89\x2d\x05\x60\x65\x07\xa1\x3c\xac\x71\x1f\xb8\x7c\x3e\x97\xcf\x87\x87\x3d\xa4\x0c\xa0\xb9\xf1\x08\x94\x7c\x3e\x97\xcf\x2d\xcd\x09\x34\x27\xd6\xe6\x64\x2e\x9f\x5b\x9a\xfb\xd0\xdc\xb7\x36\xf7\xe7\xf2\xb9\xa5\x79\x00\xcd\x03\x6b\xf3\x60\x2e\x9f\x5b\x9a\x87\xd0\x3c\xb4\x36\x0f\xe7\xf2\xb9\xa5\x79\x04\xcd\x23\x6b\xf3\x68\x2e\x9f\x5b\x9a\xc7\xd0\x3c\xb6\x36\x8f\xe7\xf2\xb9\x61\x5b\xdf\x86\x45\x8f\xa5\x65\x98\x90\x33\x69\x14\xfd\x8a\x7b\xb0\xe5\x56\x1a\x84\xa9\x55\x2a\x6d\xc1\xd4\x2a\x93\x76\x60\x6a\x95\x49\x13\x30\xb5\xca\xa5\xfa\x4d\xad\x72\xa9\x79\x53\x2b\x2e\xb5\x6e\x6a\xc5\xa5\xc2\x4d\xad\x0a\xa9\x6c\x53\xab\x42\xea\xd9\xd4\xea\x44\xea\xd8\xd4\xea\x44\xaa\xd7\xd4\x6a\x26\x55\x6b\x6a\x35\x93\x5a\x9d\x9b\xea\x0e\xba\x8e\xee\x6e\x78\x1d\xaa\xb5\x9e\x76\x4d\xff\x75\x29\x6b\x0f\xdb\x8e\x9b\x3f\x82\x11\xbc\x5e\x3e\x1b\x82\x6c\x50\x28\x5a\x92\x11\x22\x78\x5d\xd6\xa7\x0d\xf4\xaa\xd1\xe8\x2e\x22\xef\x00\xd2\x5c\xcb\xb5\xc5\x31\x97\x38\xd4\xf9\x82\x3e\x0e\x38\x35\x7f\xad\x0a\xd4\x07\x07\xe8\x3f\xa0\x1a\xb1\x9d\x78\x5d\xd2\x79\xab\x0a\xd5\x97\xb3\xa6\xce\xf1\xe5\xd8\x59\x3c\x05\x36\xd7\x5a\xb8\xcf\xe3\x49\xa8\x59\xa7\x0a\xf6\x4c\x16\xff\xd5\x8b\x57\xcf\xa1\x44\x71\x5d\x0e\xb8\x03\x47\x07\x70\xb0\xe9\xf5\x3d\xea\x82\xc5\xae\x13\xa6\x12\x72\xde\xe1\x62\x3e\xe4\x62\x66\xe2\x62\x3e\xe4\x62\xa6\x73\xd1\x85\x8b\x87\x70\x96\x4a\xc6\xba\x4a\x2d\x35\x73\x3e\x6a\xb5\xb7\xb7\x29\xbe\xdd\x6a\x14\x6f\xa6\x51\xdc\x6a\x14\x6f\xa4\x51\x3c\xeb\x14\xf8\x9e\xd5\x55\xb8\xb5\xc2\xdc\x73\x55\xab\x5b\x13\x12\x56\x12\xee\x82\xc1\x3e\xe6\x44\x53\x69\x8d\x2f\x1a\x55\x29\x9e\x77\xd8\x98\x1b\xd8\x98\x99\xd8\x98\x0f\xd8\x98\x75\xd8\xe8\x22\x8c\x06\xf8\x48\xe4\xd4\xe9\x56\xb5\xc3\x5d\xa1\x24\x6e\xd5\x1e\xbb\xd4\xfe\xba\x8c\x65\xe4\x32\x0e\xcc\x3d\xc8\xb9\x82\x74\x9c\x09\x97\x90\x38\xd2\x02\x89\xf5\x56\xe8\x1a\x56\x32\x80\x8d\x99\x45\x1f\x76\x5e\xc3\x8e\xf2\xd0\x46\x9a\xb9\x10\x5a\x19\xf7\x47\xae\x2e\x78\x1b\xca\x66\x12\x7c\x06\x35\xdb\x04\x1e\xa1\x49\x6f\x07\x3d\xa8\xbd\xb3\xf9\xe5\xff\x47\x18\xdd\x43\x83\x6d\xd3\x43\x3e\xc4\xbf\xb5\x06\xc7\xd9\x10\xff\xee\x36\xde\x62\xe1\x02\x5f\x97\x0b\x90\xe2\x86\x3c\x48\xed\x0c\x39\x90\x9a\x18\xd0\x37\x23\x6d\x47\xc5\xd7\xa5\x4d\xbd\xed\xa8\xf7\xba\x34\x31\x67\xaf\x89\xaf\x8a\xe2\xcf\xd0\x6d\x54\xcc\x54\x59\x7c\xf1\xc5\x7c\x8e\x4f\xb6\x91\xbe\xcf\xe7\xa2\xcd\x5c\xb5\x11\x5f\x4e\xe6\x8e\x62\xfa\x33\xa8\xa6\x2f\x50\xa7\x92\x0e\x7c\xce\xe4\xe7\x54\x7d\xb6\x37\x9f\x43\x73\x41\x25\x95\x24\xe1\x73\x26\x3f\xa7\xea\xb3\xbb\x24\xff\x4c\xd6\xe4\x57\x01\x47\x8e\x2b\x6c\x2e\xcb\x4b\xef\xc8\xe2\x07\x6c\x56\x57\xec\x57\x0f\x3b\x35\xfb\x67\xda\x2d\x12\xac\x1e\x75\x9c\x95\xf9\xe1\x6d\x6a\xd2\x20\x52\x34\x67\x5d\x9a\xf3\x0e\xcd\x59\x97\xe6\x5c\xa7\x39\xdb\x84\x26\x96\xfd\xe4\x6a\x68\x90\xe7\x4d\xb8\x1c\x14\x68\x5d\xf6\x7f\x56\x5f\x5a\xa1\x3d\x0c\xda\x87\x82\xa6\x5f\x3f\x93\x65\xb8\xdd\x34\x65\x3f\x15\x70\x4d\x73\xd6\xa5\x39\xef\xd0\x9c\x75\x69\xce\x75\x9a\xb3\x96\xa6\x31\xeb\x1c\xbf\x87\xc0\xcc\xeb\x8f\x50\x7d\xe9\x47\xfb\x61\xaa\x1f\xc1\x79\x7f\x2c\x5d\xc7\xa8\x7e\x84\x60\xf0\x63\x69\x0b\xa1\x1f\xe1\xa2\x04\x01\x33\x9b\x37\x2c\x9a\x9c\x52\x02\x0a\x82\xb3\xb6\x2f\x32\x5c\x54\x58\x0f\x17\xb3\x4d\x62\x55\x4b\x56\xfc\x2b\x24\xe2\xa6\x59\x01\xa9\x6c\x66\x22\x98\x5d\x8b\xe2\x8f\xc6\xd0\xd3\xa7\xf8\x63\x69\xa2\xf8\x63\x79\x1d\x8a\xe6\x60\xd7\xa7\xf8\xda\x48\xf1\xb5\x89\xa2\xd9\xda\xfa\x97\x57\x58\x48\xc2\xe4\x45\xed\xf6\x00\x68\xe5\x0e\xe6\x41\xea\xa8\xb4\x2b\xc3\x23\xb0\x48\x74\x16\x6b\x5c\x9b\xb1\xf9\xf3\x59\xce\x2a\x8e\x2e\xdc\x6f\xfa\xe2\x0f\xde\x37\x8d\xf6\x0d\xaf\x9b\x27\x26\xb6\x61\x00\x2a\x4c\x6d\xe0\xc5\xb6\x30\xb5\x81\x77\x68\x6e\x6a\x03\xaf\xd0\xdc\xd4\x06\x5e\xc9\x27\xf9\x1c\xae\xef\x98\xdb\xee\xef\x80\x77\xfa\x49\x3e\x03\x28\x29\x3a\xae\x4b\x2e\x1f\x08\xcd\x7a\x13\x88\xc0\x94\x99\x78\x84\x29\x85\xcc\xc4\x23\xcc\x5e\xa4\xa6\x36\x30\x79\x91\x9a\xda\xc0\x3c\x09\x33\xb5\x81\x69\x92\xc1\x6d\x06\xe2\x0f\xa6\x5d\x26\xd2\xd4\x2b\x62\x15\x06\x4c\xdc\x4c\xa4\x1c\x84\x65\xed\xb6\x23\x8e\x94\x46\x35\x4c\x76\x6e\xf4\xb2\x12\x6d\xce\x10\x32\x83\x27\x60\xff\x6c\x90\x0d\x3c\x69\x8a\x51\x4c\x9e\x80\xdd\x33\xc9\xec\x13\x4f\xe7\x96\x0d\x99\xed\xe3\xd1\x66\x19\x25\x41\x10\x51\x3a\x24\x88\x5b\x82\x20\x9e\x54\x11\xec\x44\x82\x74\x9c\xa0\x36\x2f\x29\x09\x12\x08\xb1\x43\x82\xa4\x25\x48\x66\xf5\xb8\x34\x01\x78\x2d\xbc\x8e\x13\xd4\x66\x32\x25\x41\x5f\x10\xcc\x87\x04\xfd\x96\xa0\x2f\x68\xe5\x8a\xa0\x3f\xe2\x0e\x7d\x3c\xda\xdc\xa7\x24\x18\x08\x82\x7c\x48\x30\x68\x09\x06\x82\x16\x57\x04\x03\x9d\x20\x1f\x27\xa8\xcd\x96\x4a\x82\xa1\x20\x58\x0c\x09\x86\x2d\xc1\x50\xd0\x2a\x14\xc1\x50\x27\x58\x8c\x13\xd4\xe6\x57\x25\xc1\x08\x5e\x2a\x86\x04\xa3\x96\x20\x64\xef\x27\x8a\x60\xd4\x79\x89\x18\x27\xa8\xcd\xc8\x4a\x82\xb1\x20\x38\x1b\x12\x8c\x5b\x82\xf0\xda\xa4\xc6\x64\x01\xef\x4a\x02\x3e\xfb\xec\xc5\xd7\x4b\x71\x6e\xee\x52\x1c\x2c\x92\x7b\x75\xb3\x99\x40\x06\x75\x58\x7c\xef\xa6\xaf\xc5\x31\x93\xc1\xff\x94\x17\xe3\x1c\x2d\x17\x1f\xf9\x4a\x56\xf9\x45\xd5\x12\xf9\x64\x2f\x2d\x2b\x91\xa0\xe4\x88\xc1\xfe\xec\x94\x17\xcb\x15\x57\xdb\xa9\x07\x5a\xd3\xce\x9a\x68\x6b\x77\xd5\xf2\x8d\x4f\x6e\xe2\x22\x9e\x3f\xea\x15\x3c\x3a\x9f\x4d\x7d\x90\x7b\x08\x7b\x24\x38\xf0\x55\x9d\xe2\xaf\xa7\x9b\xac\x47\x95\x42\x4c\xb6\x3d\xdd\x24\x9a\x8c\x9c\x6e\xea\x6c\x6b\x18\x9c\x6e\x0a\x31\xf9\x7a\xba\xe9\xa6\x4f\x37\x09\xad\x6c\x76\xba\xc9\xa8\x9c\xce\xe9\x26\xa9\x20\xe7\xe9\x26\x79\x8e\x76\xc3\xd3\xdf\xfe\x1f\xfa\x3c\x13\x5f\x64\x7b\x29\x5b\xf3\x28\xe8\x3d\x38\xcd\xc3\x3e\xe8\xc7\xb3\x0f\x79\xd1\xfb\x31\x2b\xcf\x66\x7c\xf5\xbb\x1c\x89\xd2\x58\x85\xef\x82\x43\xf9\x40\x32\x06\x9f\x75\x7e\xfe\x15\x8e\x4e\xbd\xde\xe8\x4e\x20\xd8\x3c\x73\x04\x5d\x6f\xe0\xb4\xdf\xc6\x8f\x42\x1d\x1c\xa0\x17\x7c\x75\x0a\xa3\xe8\xd1\x6c\x59\x66\x1c\xe1\xfe\xb5\x29\xa2\xf9\x8b\x23\xdc\x3d\xbb\x14\xc6\x53\x14\x24\x53\x14\xe0\x29\xf2\xfd\x29\x22\xe1\x14\xe1\x78\x8a\x92\x29\x42\x58\xdb\x6a\x14\xd2\x29\x0a\xbd\x29\x0a\xc8\x14\xf9\xc1\x14\x91\x68\x8a\x30\x9d\x22\xec\x4d\x11\xd1\xe1\x92\x29\x0a\xf1\x14\x05\xfe\x14\xf9\xe1\x14\x91\x78\x8a\x70\x32\x45\x58\xe0\xd7\xe0\x22\x6f\x8a\x42\x32\x45\x41\x30\x45\x7e\x34\x45\x91\x3f\x45\x61\x38\x45\x41\x3c\x45\x7e\xa2\x01\xfa\x78\x8a\x88\x3f\x45\x38\x9c\xa2\x78\x8a\x50\x44\xa6\x28\x0c\xa6\x28\x80\xab\x05\x74\x40\xc1\x09\x99\x22\x1c\x4c\x51\x24\x00\xf1\x14\x85\xfe\x14\x05\xe1\x14\xf9\xb1\x06\x48\x92\x29\x22\x78\x8a\xb0\x20\x39\x45\x88\xd0\x29\x22\xde\x14\x61\xc1\x8e\x04\x7b\xe7\x90\x2b\x31\xcb\x95\x74\xe5\x2a\xb8\x10\x72\x14\xfd\x26\xe2\xf3\x14\xa1\x50\xe7\x56\x11\x16\xdd\x12\xdc\x02\x43\x9e\xce\xa5\xaf\x04\x27\xb8\x12\x00\xd1\x14\xe9\xdd\xc5\x91\x94\x87\x10\x30\x70\xef\x77\x15\x21\x14\x2a\x04\x2c\xe4\xe7\xc7\x52\xb0\x61\xd8\x93\x57\xe0\x29\x6d\x85\x52\xfb\x81\x4e\x41\xa8\x46\x98\x86\x2f\x54\x1a\x49\xb5\x87\xba\x0e\x85\x0a\x84\x3d\x08\xbb\x10\x3a\x14\x82\xad\xb3\x9a\xce\x8d\x50\xe7\xa7\xe7\x73\x06\xd7\xa4\x88\xa4\x72\x3d\x2b\x8b\xc1\x0d\x4f\xe0\x05\x3f\x1c\xff\xf2\xea\xc9\x0f\x8f\xe5\x9d\x52\x42\x62\x64\x8a\xa0\xf3\x42\x42\x54\x58\xa4\x52\x13\x48\x57\x59\x2a\x56\xea\x24\xca\x7a\x41\x20\x54\xa7\xff\xea\xbb\xe7\x6f\xf8\x1a\xb1\x45\xae\x6a\xa3\x9f\x81\x4a\xe5\x7d\x1a\x06\x3e\x04\xfc\x2f\x2f\xba\xfa\xec\xa5\x94\xde\xa5\x77\x0f\x5e\x46\x28\xf1\xbc\x69\xff\x59\xfd\xae\x20\x41\x0c\x00\xa4\x03\x40\x3d\x8f\x0c\x40\x7c\x0d\x64\xf8\x34\xd0\x9f\x1a\x08\x84\x5d\x02\xc4\x40\x20\xea\x32\x69\x02\x89\x7b\xfd\x30\x10\xa2\x1d\x46\x86\x28\x92\x3e\x95\x21\x0a\xa6\x83\x98\x00\xd2\xbe\xb4\x86\x20\x59\x8f\xcc\x00\x20\xef\x77\x65\x08\xc2\x35\x90\x21\x85\xa2\xcb\xe5\xb0\x39\x75\xb5\xc6\x74\x54\x1f\x84\x8e\x10\xf0\xe9\x88\x55\x05\x7d\x22\x06\xbb\xa0\x6e\xbb\x89\xe8\xa8\x61\xc6\xd4\x65\x98\x94\x8e\xea\x3b\xa1\x23\xfa\x66\x7d\x26\x0c\x26\xd1\x27\x33\xe4\x24\xa3\xa3\x1a\xcf\xe9\x88\xd5\x70\xea\xb6\xee\xa2\x4f\xc3\xa0\x79\xab\xba\x54\x94\xc0\x66\x41\x12\xed\xa9\x45\x99\x7e\x07\xc4\x48\x3d\xe8\x62\x31\xf5\x31\xd4\x41\x8c\x36\xa1\xf3\x69\x78\x1e\x77\xd9\x70\xf8\x06\x76\x98\x7f\xd2\xe7\xd4\x1a\x28\xb0\x43\xa3\x69\xb7\x33\x06\xab\xe8\x74\xc6\x1a\x27\xb0\xc3\x7e\x79\x0f\xc4\x16\x2a\xb0\x39\x14\xd0\x51\x51\x60\x3a\x2a\x0a\x42\x47\x55\xef\x53\xb7\xda\x82\x1e\x0a\x5b\xac\x70\x89\x3b\xa2\x2e\x13\x8e\xe9\x88\x32\x28\x1d\x91\x64\x42\x47\x4d\x8b\x51\xb7\x42\xd3\xbe\xbc\x0d\x83\x47\x9f\xca\x10\x24\xa7\x2e\x95\x72\x3a\xe2\x42\x45\x5f\xa3\xfa\x1d\x55\xd3\xb1\x2c\x23\xf0\x3c\x1a\x78\xd8\x1a\x41\x14\x8c\x35\xcd\x68\x14\x68\x8b\x20\x35\x11\xcf\x44\x24\xe8\x12\x31\xc2\x84\x5d\x3c\x46\x66\xa2\x2e\x1e\x23\x4c\xdc\xc2\x18\xa8\xe8\xc1\xd6\xd8\x3c\xe9\x93\x30\x20\x61\xfd\xee\xd8\x13\x0e\x45\xc8\x80\x24\xeb\x08\xd6\x00\x90\xb7\x00\xd6\x00\x22\x59\x30\x34\x2e\xfa\x5a\xb1\xe6\x5d\x4e\x61\x62\x3a\xd2\x0b\x42\x5d\xd2\xf6\xfb\x24\x4c\xb6\x41\x7b\x7a\x37\xd9\x06\x1d\x17\x78\x44\x47\x0c\x35\xa6\xe3\x86\x4a\xe9\x88\x52\x12\xea\x50\x0a\xa3\x6e\x5f\x4a\xfb\x1c\xd8\x03\x89\xd3\x55\x72\x3a\x62\xc4\xbc\x2f\x53\x7b\x3c\xb1\x5a\x90\xfe\x02\x62\x78\x8a\x37\x70\x7b\x4c\x36\x70\x26\xec\x6f\xe0\xf8\x38\xd8\xc0\x9e\x71\xe8\x74\x7d\x1c\x8d\xb9\x24\x8e\x47\x82\xa1\x9e\x82\x9b\x31\x24\x63\xe1\x12\xb3\x31\xbf\xc7\xe9\x06\xd1\x12\x67\x63\x81\x0c\xe7\x1b\x04\x4b\xcc\x37\x08\x65\xb8\xe8\x6b\xc8\x68\x2e\x63\xa1\x02\xe3\x31\x0f\xc5\x64\x03\x07\xc1\xfe\x88\x97\xe1\x60\x93\xc0\x16\x6e\x10\x76\x70\xe4\x8c\x6e\x38\xde\x20\x2c\x61\xba\x81\x2f\xe2\x64\x03\xaf\xc7\x6c\x83\x68\x8a\xd3\xb1\x08\x86\x33\x57\x08\xc3\xf9\x58\x58\xe0\x1b\x84\x51\x5c\xf4\x22\xd4\x36\xa9\x0a\xf6\x02\x4b\x30\x32\xb3\x4c\x3a\x52\xc1\xd6\x14\x45\xe2\x36\x61\x0f\xb4\xe7\x9e\xe1\x79\xd8\x53\xce\x10\x22\xea\x08\xcd\x44\x23\xee\x40\x8c\x0f\xc7\xf6\xdc\xa4\xa5\x62\xcb\x4c\xea\x9e\xda\xb2\x92\x96\x8b\x21\x9f\x59\x4f\x9a\x43\x88\xbc\x23\x2d\x5b\x6a\x02\x18\x2c\x69\x89\x6a\x6b\x96\x80\xab\x7b\x98\x8e\xb1\x4f\xa8\xdd\x50\x7c\x3a\x66\x28\x01\x1d\x53\x74\x48\xdd\x9d\x8f\xa8\xdb\x94\x62\xed\xf9\xf0\x29\xa5\x76\xd1\x25\xd4\x25\x3a\x46\xc7\xcc\x2b\xa5\x6e\x27\xc8\xa8\xdb\x74\x72\x3a\x66\x18\x9c\x8e\x39\x41\x41\xc7\x4c\xbc\x93\x56\x58\x8c\x00\x8f\xb8\x2b\x26\x23\x16\x8a\xfd\xd1\x90\x81\x03\xa7\xa5\xe2\x70\xd4\xe1\x71\x34\x1a\x35\x70\xec\x8a\xc4\x74\xd4\x13\x71\x32\x1a\x32\x30\x73\x78\x23\x4e\x47\xc2\x05\xce\x46\xa3\x16\xd6\xc3\x81\x81\x04\x1f\x89\xbd\xb8\x18\x0d\x49\x2a\xb5\x70\x76\x13\x3b\xfd\x0a\x93\xf1\xd0\xe2\x3b\x22\x07\x0e\x46\xdc\x1a\x87\xa3\xb1\x05\x47\x4e\x07\xc6\xf1\x68\x6c\xc3\x74\x24\xf8\xe0\x64\xd4\x03\x31\x1b\x09\x03\x38\x1d\x8d\x81\x38\x1b\x0d\x05\x38\x1f\x8d\x47\x98\x3b\x82\x1d\x2e\xba\xd1\x68\x9b\xfc\x81\x7a\x92\xa4\x39\xb6\xd4\xd9\x27\xf6\x02\x4b\x2a\x51\x33\x6d\x78\xee\xb7\x18\x02\xb3\x21\x06\x76\x23\x0a\xbb\x12\x31\xe7\x10\x4d\x72\x6c\x22\x1f\x7b\x9d\xf4\xcf\x3e\x7e\xd6\x2b\x2a\xe6\x0c\xa2\xd5\xad\x39\x7f\x90\xcf\xcd\xb9\x43\x2b\x3e\xdb\x0a\x4a\x2b\x1e\x03\x8e\x5c\xf3\x52\x4b\xe6\x50\x9b\xb7\x39\x77\x68\x15\x6c\xe9\xbf\x53\xbf\x98\xda\xbb\x47\xe8\x18\xf3\x3e\x1d\x13\x40\x40\xdd\x2a\x0e\xe9\x58\x17\x22\x6a\xb5\x9f\x98\x8e\x19\x1f\xa5\x2e\xf9\x25\x5d\xe2\xb6\x24\xc2\x61\x1d\x29\x75\x69\x2f\xa3\x63\xd6\x97\x53\xb7\xfd\x72\xea\x76\xbf\x82\x8e\x79\x08\xf6\x46\x5c\x04\xe3\x11\x2f\xc4\x64\xd4\x0d\xb1\xef\x1a\x29\x9c\x16\x8e\xc3\x51\x17\xc1\x91\x37\xa6\x27\x1c\x8f\x46\x32\x4c\x47\xbd\x05\x27\xa3\xe1\x02\xb3\xd1\x80\x87\xd3\x91\x98\x89\xb3\xd1\xb8\x81\xf3\x91\xb0\x84\xb9\x23\x2e\xe1\xc2\x19\x36\x64\xf6\xe0\xee\x03\x1e\xf5\x4b\x4c\xec\x8e\x89\xfd\x11\xb7\xc7\xc1\x88\xe1\xe3\x70\xd4\x77\x70\x34\x1e\xdd\x62\x47\x78\xc3\x74\xdc\x79\x12\x67\xfc\xc0\x6c\x34\xfe\xe1\x74\x34\x88\xe2\xcc\x19\x44\x70\x3e\x1a\xa5\x30\x1f\x09\x53\xb8\xe8\xc6\x91\xed\x92\x07\x63\x4c\xa9\xf9\xb5\xad\x90\x34\xdc\x18\x53\x86\x7b\xda\x76\x0d\x63\xc6\xa0\x00\x60\x3e\xc5\x98\x37\x34\x39\x9f\xe1\x79\x54\x23\xb0\x01\xc4\x2d\x83\x86\xa7\xba\xce\x6d\x29\x43\xcb\x9f\x25\x67\x68\x7b\x68\xa0\x90\xb6\x0c\x9a\x59\xc8\x3a\x00\xa6\x81\xc3\xea\x7b\x5c\x57\x8e\x01\x75\xd1\x11\x8e\x79\xce\xc1\xd5\x1e\xd3\x11\xe1\x12\xea\xd9\x0c\xc7\xa7\x6e\xc3\x09\xa8\xcb\x70\x42\x3a\x62\x17\x11\x1d\x91\x5a\x4c\x47\x4c\x8f\xd2\x11\xd5\x26\xd4\x26\x77\x46\x47\x74\x9a\x52\xb7\xd5\x66\x74\xc4\x6a\x72\x3a\xa2\x39\x4e\xdd\x86\x5b\x50\x97\xd9\x63\xcf\xe9\xb6\x18\x7b\x56\xbd\x62\x32\xe6\xd3\xd8\x1f\xf3\x49\x1c\x8c\x78\x35\x0e\xc7\x9c\x02\x47\x63\x91\x03\xc7\x23\xbe\xdd\x8c\x7b\x56\x35\xe2\x64\xcc\x81\x30\x1b\x89\x8f\x38\x1d\x8b\x20\x38\x73\x46\x28\x9c\x8f\x45\x18\xcc\xed\x83\x73\x31\x12\x21\x20\x3f\x70\xeb\x0a\x8f\x58\x1a\x26\x23\x9e\x8e\xfd\x31\x67\xc6\xc1\x98\xb3\xe2\x70\x2c\x54\x45\xf6\x50\x84\xe3\xb1\x60\x81\xa9\xdb\x5d\x92\x31\x87\xc7\xcc\x1a\x2c\x70\x3a\xe6\xcb\x38\x1b\x09\x17\x38\x77\x06\x4b\xcc\xc7\x42\x19\x2e\x7a\x01\x67\x9b\xac\x40\xb1\x4d\x4d\x51\xa4\xc6\x69\xca\x0b\x64\x5b\x62\xee\xb3\xdf\x3e\x27\x26\xdc\x41\x2b\x11\x23\xfe\x50\xef\x8f\x29\x2b\x68\x9e\x0e\x71\xc7\x1d\x83\xb6\x8e\x8a\xc6\x6c\x40\x63\x6a\x88\x98\xd5\x64\x8d\x2c\xa7\xca\x40\x4d\x19\x80\x26\xab\xe1\xf3\x5c\x43\x3b\x7c\xca\x9b\xbe\x0e\x9f\x15\x1d\x29\x9b\x7a\xea\x54\x12\xa6\x6e\x25\x11\x6a\xe9\x91\x4f\x5d\xda\x09\xa8\xab\x3f\x21\x75\x5b\x5d\x44\xdd\x96\x11\x53\xbb\x3c\x28\x75\xd9\x45\x42\xed\xf6\xcc\xa8\x5b\xf5\x29\x75\xeb\x30\xa3\x16\x9b\xca\xa9\x5b\x45\x9c\xba\x6c\xaa\xa0\x6e\x53\xc6\xde\x88\x1f\x61\x3c\x62\x7c\x98\x8c\x78\x2a\xf6\x1d\x06\x88\x03\xa7\x9f\xe2\x70\xc4\x15\x71\xe4\x8d\xc4\xa0\xd8\xe9\x73\x4d\x06\x6b\xe1\x3d\xb1\x46\x6d\x66\xf3\x56\x9c\x8e\x84\x36\x9c\x39\xe2\x22\xce\x47\x62\x08\xe6\x23\x3e\x8b\x0b\x67\x70\x13\x23\xba\x85\x71\xec\x34\x25\x4c\x9c\x4e\x8b\xfd\x11\xbf\xc4\xc1\x88\x63\xe2\xd0\xe1\x99\x38\x1a\x89\x35\x38\x1e\x0d\x56\x23\x9e\x84\x93\x11\x1f\xc5\xcc\x11\x00\x70\xea\x8c\x5a\x38\x73\x86\x16\x9c\xdb\xfc\x1f\xf3\x31\x17\x2e\xba\xa1\x67\xfb\xa1\xdb\x60\x23\x35\xab\x81\x87\x0d\x43\xb7\x4a\x35\x0c\x83\xb6\x42\x6a\x6a\x16\x34\x49\x8e\xe9\x69\x68\xe9\x7e\x24\x51\x1a\xc6\xe8\x36\x65\x1a\x3e\xa5\x5a\x07\x4c\xc3\x74\xd3\xf7\x61\x53\xa6\x19\xf9\xf0\x69\xaa\x75\xc2\xf4\xaa\xae\xe5\x71\x86\x61\x5a\xca\x6d\x88\x95\xb7\x72\x33\xbd\xa4\x6b\x99\xef\xb0\xa7\x2e\x31\x60\x6a\x16\x2a\xa1\x2e\xfd\xfa\xd4\xd5\xc7\x80\x3a\x0c\x27\xa4\x2e\xe1\x45\xd4\xd5\x93\x98\xda\xc4\x43\xa9\xc3\xac\x12\xea\x52\x35\xa3\x2e\x8d\xa4\xd4\x61\x08\x19\xb5\x99\x79\x4e\x5d\x96\xcc\xa9\xd9\x62\x0b\xea\x50\x32\xf6\x9c\x5a\xc6\xd8\xe9\xae\xc4\xe9\xaf\xd8\x77\xfa\x0a\x0e\x5c\xee\x80\x43\xa7\x2b\xe1\xc8\xe9\x10\x38\x76\x45\x04\x35\xde\x18\x1f\x25\xce\x68\x81\x99\xcb\x63\x70\x6a\x09\x1a\x38\xb3\x05\xd9\xdc\xe9\xb9\x98\x3b\x83\x02\x2e\xac\x11\x11\x7b\x4e\xad\x63\xa7\x23\x62\xe2\xf6\x6e\xdf\x62\x69\x38\x70\x3a\x1a\x0e\x5d\x2e\x8c\x23\xab\x1f\xe2\xd8\x19\x19\x30\x75\x7a\x3f\x4e\x9c\xbe\x88\x99\x25\x58\xe1\xd4\xe9\x6e\x38\x73\x45\x07\x9c\x5b\xbd\x18\x73\x67\xe4\xc0\x85\x16\x1c\xb6\x19\x53\xa9\x18\xe0\x89\x01\x61\x23\x9c\x61\x3c\xbe\xd7\x2e\x6e\x0c\xc3\xb1\x6c\x37\x0c\xc4\x0a\x9f\xe1\x51\x28\xf1\x11\x23\x1f\x51\xf3\xd0\x14\x84\x15\x27\xe6\x71\x86\x7a\x66\xfe\x93\xa6\xdf\xa6\x10\x2c\xf9\x34\x3d\x4a\x1b\xa4\x06\x3e\xb3\x7b\xf2\xb0\xc7\x30\xfc\x9a\xed\x84\x37\x42\x34\xb4\x29\x14\x13\x86\x47\xf5\xa2\x92\xb5\xe7\xf2\x31\x76\xc9\x54\xc1\x10\x97\xfe\x15\x8c\xef\xd2\xb5\xfa\x3d\x70\x09\x5b\xc1\x84\x76\xb1\x2a\x88\x68\xb4\xcf\xb1\xc5\xb4\xd4\x63\xea\x92\xa8\x82\x49\x6c\x5a\x52\xcf\x99\xdd\x4a\x15\x44\xea\xb2\x47\x05\x93\x99\x55\xae\x9e\xe6\x2e\x33\x52\x30\xdc\x65\xa2\x0a\xa6\xb0\x7b\x68\x9d\x11\x1b\x1d\x1b\xbb\x7a\x80\x89\x45\xc8\xd8\xb7\x59\x1c\x0e\x5c\xcc\xe2\xd0\xa5\x16\x1c\xb9\x84\x81\x63\x47\x17\x6d\xf1\x37\xb1\xab\x10\x33\x97\xa5\xe2\xd4\x19\x0f\x33\x97\x47\xe1\xdc\x6e\xdf\x98\xdb\x8c\x0e\x17\xe3\xde\xd5\xbe\xdc\x58\x21\xb0\x3b\x16\x60\x32\x6e\x70\xd8\x1f\xf3\x3e\x1c\x38\xbd\x0f\x87\xe3\x41\xa0\x56\xb6\xb3\xbb\xf1\x78\x50\xc2\x74\x3c\xb8\xe1\x64\x3c\x1a\xd4\xe6\xe0\xf2\x32\x69\x14\xd6\xa7\xd9\x58\x58\x93\x86\xe1\xe0\x93\x8f\x45\x9c\xda\x48\x80\x8a\x36\xb2\xcb\x8f\x7a\x5d\x83\x67\x6c\xfd\x61\x8d\xaa\x19\xab\xd0\x9a\xcf\x79\x56\x41\x3d\xa2\x57\xdf\x3d\x7f\x83\xca\xc5\x59\x7d\x4d\x44\x53\xd1\xe0\xd9\xc3\x57\xbd\x8b\x8b\xdb\x83\x89\x53\xd4\x6e\xfc\x87\x0b\x14\xd5\x17\xf8\xac\xbe\x4c\xf5\x86\x9e\xfa\x55\x02\xc8\x2f\xf5\x67\xf1\x65\xaa\xf5\xa7\xcf\xb9\x56\x55\xe9\xfb\x47\xaf\x64\x61\x2c\x24\x0b\xbf\xb8\xef\xa8\x12\xd0\xcd\x05\x55\xf2\x8b\x56\x25\xe5\xba\x57\x54\xb9\x4b\xeb\x7d\xe0\x57\x4d\x09\xb0\x0f\xfc\xca\x50\xfa\xee\x03\xbf\xaa\xeb\xea\x7d\xe0\x57\xe6\xb2\x7a\x82\x86\x54\x51\x18\xa1\xb4\xac\xd6\x88\x65\xd9\x72\x95\x97\x8b\x13\x54\x2d\xd1\x8b\x23\x6c\xc4\xfb\x5d\x09\xa5\x80\xde\xf6\x6b\x20\x9b\xee\x0e\x09\x23\xfb\xdd\x21\x2d\xba\x17\x4b\x81\xf0\xc5\x11\x7e\x5b\xbe\x43\x7b\x08\x1b\x6a\x94\x2a\xba\xb2\x3c\xff\xa4\xee\xdd\xdb\xb6\xbd\x2a\xc7\x27\xfe\x33\xf1\x31\xda\xd3\x50\x43\x1d\xbe\x1d\x74\x7b\x80\xd8\x50\xb0\xf4\xe1\x7a\xcd\x4f\xd3\x39\x47\x38\x42\xeb\xf3\xf4\x03\xbf\x32\x88\x7f\x7d\x9e\xfe\xc8\xaf\xd6\x8d\x0a\xda\xef\x76\xa1\x2c\x5e\x01\x90\x14\x4d\xfd\xe5\x01\xc2\x51\xf3\xcd\x7e\xc5\xca\x11\x54\x9c\x52\xfc\x98\x05\xb9\xae\xb1\x2b\x5e\xde\x2a\xa4\xef\x14\x53\x46\xbc\xee\xab\x5b\xd2\xb2\x7a\x05\x55\x51\x0e\xb5\x22\x28\x0d\x5e\x1b\x4a\x69\x50\x01\x35\x1a\x14\x19\xb6\x31\x59\x0d\x09\xec\x56\xd3\xa5\x53\xac\x96\xa7\x10\x60\xe6\xbc\xa8\x10\xa1\xe0\x19\x82\xb2\xb9\xa1\x14\xce\xdb\x49\x89\x0e\xe4\xdd\x10\x1e\x14\x70\xac\x8d\x6b\x32\x79\x71\x44\x94\x0d\xee\xa0\xdd\x46\x02\x3b\xe8\x2f\x88\xd0\x77\x50\xe3\x11\x6c\xab\x44\x7f\x81\x3b\x2e\x36\x66\x6f\x55\x9e\xcc\x36\xe7\x2f\x80\xf2\x9d\x2d\x93\x3b\x1d\x2e\x09\x85\xc7\x92\x57\xb4\x8b\x48\x60\x61\x78\xc7\xc0\xf1\x80\xac\xa9\xb2\xbf\xe8\x40\xb9\xc8\x38\xe2\x2c\x9b\x29\xb3\x43\xe5\x1a\xb1\xb3\xb3\x79\xc9\x73\xa1\x4b\xb6\x40\xfc\xf2\x8c\x2d\x72\x9e\xd7\x75\x19\x21\xbc\x4f\x8d\xd8\x84\x08\x14\x9a\x8c\x2d\x50\xca\x51\xba\x5a\x7e\xe0\x0b\x54\x2e\xaa\x25\xa2\xb2\x28\xf0\x1a\xad\x33\x36\x97\xe8\x25\xca\xb5\x19\xdb\xc5\xac\xcc\x66\x88\xcd\xe7\xcb\x8b\x35\xa0\x16\x78\xab\xa5\x40\x7b\xbe\xe6\x39\xba\x28\xab\xd9\xf2\xbc\x92\x0c\xae\xcb\xe5\x62\x88\x45\x09\x1a\xca\x6b\x4e\xda\x2f\x0f\x1e\xa8\x6b\x65\xda\x9f\x44\x40\xf1\xb1\x49\x72\x1d\xcb\xc5\xd2\x72\x63\xb7\xe1\x2a\xb4\x10\xc4\xda\xcf\x10\xb3\x26\xa5\x54\xe2\x5d\x24\xb4\xef\x9b\x55\x65\xeb\x47\xac\xf7\x23\x7e\xa7\x0a\x7b\xfe\xa6\xff\x04\x97\x02\x0c\xae\xda\x31\x44\xc0\x23\x59\xf8\x12\x95\x8b\x8f\x7c\xb5\xe6\xf6\x28\x58\x2e\x3e\xbe\xea\x05\xc2\xce\x4f\x1b\x0d\x10\xd8\x31\x40\xb4\xd8\x74\x89\xad\xdf\xe2\x50\x18\x74\x1f\xfb\xa7\xce\x84\x43\xfb\x85\x2f\xb2\xd5\xd5\x59\xb5\xc5\x55\x80\xaa\x62\xed\xf2\xa8\x69\xd7\x02\x4f\xbb\x21\xdf\x5a\x42\x37\xe7\x5f\x82\x6a\x2b\x11\x57\xed\xde\x23\x37\xe5\x69\x2d\x48\x53\xd2\xf1\x1f\xbc\xd2\xf3\xb4\x2e\x73\x73\x40\xaa\x5d\x8d\xd5\xd7\x81\x04\x5b\xf5\xc1\xe0\xe6\x2c\x43\xf6\xf1\xc3\xa2\xac\x4a\x36\xd7\x4b\x5f\x75\x61\xf8\x65\x36\x63\x8b\x13\xfe\xf4\x65\x5b\x16\x55\x56\x1e\xf3\x2e\xbd\x42\xfe\xaf\x6f\xd2\xe6\x36\xf2\x7e\x6a\x78\x63\x2d\x0a\x6b\x9b\x97\x4f\xf5\x36\x04\xe8\xf8\xea\x6f\xb3\x36\x54\xf2\xe6\x15\x85\xf8\xff\x86\xbc\x41\x9b\x50\xfd\x19\x2b\xd3\xba\xae\x6a\x93\xe5\xc3\xc0\xa3\xe4\x47\xe9\x55\xf0\x79\xfc\xda\x36\xc3\x48\x64\xcc\x27\x00\x9d\xed\xda\x8b\xc6\x30\x74\x3b\xb1\xc0\xae\xba\xb0\x2b\x05\x6b\x64\xf2\x31\x2f\xd7\x15\x9f\x37\x56\x6c\xc6\x58\x40\xe7\x37\x4b\x2d\xa8\x3b\x40\x17\x62\xa0\x95\xa5\xd6\xde\x96\xef\xde\x4e\x26\x8a\xdb\xf7\x6d\xb8\x16\x89\x64\xf3\xea\x02\xdf\xa1\xac\xb6\x49\x34\x86\x80\xdd\x73\xa4\x95\x4d\x52\x3d\x4f\x9a\xd7\x6c\x14\xe3\x01\xfc\xe7\x45\xbe\x44\xeb\x0b\x76\x26\xd3\x8f\x39\x5b\x57\xd2\x18\x86\x21\xbc\x72\xab\xac\xc7\x6c\x57\x61\x2e\xc7\xaf\x0c\x36\x0c\x15\xc5\xb7\x75\xf5\x81\x6b\xdc\x98\x0b\x5e\xc7\xd5\xaf\x13\x52\x46\x42\x97\xe1\x8d\xac\x42\xcb\xf3\x6a\x10\x81\x9b\x90\xeb\x56\x59\x27\xe4\xda\x75\xd6\x19\x32\x3e\xf0\x2b\x59\x02\x3a\x0a\x0e\x7c\xa2\x3f\x29\x3f\x5a\x1e\x68\x75\xa3\x23\x63\xd5\xe8\x03\xf4\x4a\x58\xa0\x7a\x09\x58\x2d\xd7\xeb\x36\x4d\x87\x9a\x87\x90\x10\xc3\x6b\xa9\x6c\xd1\x0c\x54\xad\xe0\x26\xf5\x78\x75\xca\xd6\x1f\x3a\x2e\x5b\xdb\xee\x64\xd2\x31\x51\xe1\x88\xf5\xe8\xfa\xbe\xd3\x75\xe1\xb4\x02\x8b\x26\x82\x8e\xc9\xbe\x07\x9b\xfd\xc6\x68\xf8\xe2\x99\xc8\xa8\x24\x66\x05\x55\xfb\xdd\x80\xed\x97\x4f\x37\x67\x7b\x65\x67\x7b\xee\x66\x7b\xee\x60\x7b\xb5\x01\xdb\xce\x22\xd2\xeb\xba\x8a\xb4\x9c\xfe\xd8\xac\x8e\xf4\x58\x11\x66\x89\xab\xe2\x97\x95\x5e\x8a\xf9\xfb\x47\xaf\xf6\x55\x82\xd6\xa9\xc5\x3c\x45\x59\x71\x62\x28\xae\x7d\x36\x67\x82\x89\xcb\x0a\xf5\xb1\xa8\x84\x6b\xd2\xd2\x31\x21\x6a\x2a\x3b\x0f\x27\x6a\xba\x45\xb7\xbf\x7f\xf4\xca\x58\x71\xfb\x78\x55\x9e\xcd\xf9\xde\x76\x53\x44\xb2\x51\x67\xa2\x48\xff\xe9\x8f\x33\x5d\xa4\x26\x22\x04\xdb\x25\x54\x28\xcd\xfa\xd7\x03\xa9\x2c\x96\xaf\x31\x3a\x14\x70\xfb\x52\xaa\x8f\xa4\x8e\x97\xab\x49\x7b\xcf\xba\xba\x38\xbe\x26\xbd\xbf\x9e\x97\x19\x9f\x78\x53\x44\x76\x06\x77\x61\x34\x68\xc9\x35\xd1\x92\x29\x0a\x1c\x68\xfd\x6b\xa2\x0d\xa6\x28\xda\xb1\x5f\xa4\x71\xed\x77\x0f\xbe\xc6\xfb\x7a\x63\xad\x85\x55\x32\xfb\xfa\x3b\xc7\x06\x0d\xfc\x0d\x28\xdc\xcc\x3b\x8d\xa0\xb5\x25\x73\x64\xdb\xee\xe3\x0d\x28\x98\x47\x3d\x9c\x90\x1b\x1b\xf6\xfe\x49\xc2\x6a\x13\x5d\x6e\x20\xb8\xb6\xb8\xb6\x0c\xb1\xb6\x10\xd7\x0d\xb4\x0d\x94\xb3\x7e\x7e\x03\xd5\x2b\xa1\xaf\x15\x66\xbf\x17\x92\x69\xaf\xaa\xbe\x56\xdc\xfd\x5e\x18\x4c\xdb\xaa\xee\xf7\xc2\x68\xaa\x8a\xbd\xdf\x8b\xf0\xa7\x77\x53\x1a\x7c\x56\xc1\xfd\xdf\xb3\xd2\xfe\x17\xab\x87\xff\xdf\x53\xd9\x1e\x6e\x2a\x28\x17\x3c\xbf\xd9\x12\xf7\xdf\xb1\x35\x6f\xab\xd6\xb3\x35\xd7\x9e\xbd\xf1\x89\xb3\x02\xfe\xd0\x97\x2f\xa3\x00\x2d\xd8\x29\x5f\x9f\xe9\x5e\x7a\xa0\xb3\x21\x40\x04\x1b\xf2\xbf\x7f\xff\x64\x42\xf3\x10\x45\x41\x73\x85\x8d\x09\xcd\x9b\x28\x10\x7c\x00\x53\x97\x51\xb0\xaf\xbe\x08\xfe\x0d\x99\x41\x8b\x5a\xa2\x57\xd3\x29\xe5\xdf\xf8\x1a\x31\xb4\xe0\x17\xf3\x2b\x24\x7d\x2d\x37\x11\xd6\x03\x0a\xea\xdc\xe6\xb1\x38\x3f\x4d\xf9\xea\x13\x82\x5b\xa5\xe0\x56\x15\xf1\xc1\x27\x90\xce\xef\x3b\x9b\xcc\x97\x17\xd0\x42\xfc\xd7\xd4\xa0\xdb\xb8\x1b\xdd\x86\x00\xb5\x5c\x2e\x5b\xb9\xd4\x11\xa1\x16\x4f\x3d\x30\xcb\xd5\x3f\x8f\x78\x3e\xbc\x95\x05\x5e\xe8\x45\x5e\x77\xbe\xb3\x96\x34\x84\xf8\x45\xd9\xc9\xa8\x44\x0f\xa7\x82\x6b\xf3\x18\xa6\xee\xd7\x32\xdc\xea\x09\x8f\x45\x6f\x0f\x51\xf7\xf6\x6d\xfd\xcd\xbc\xaf\xa9\xef\xca\xea\xa2\x5c\x73\xf4\xd3\xf3\xe3\x35\x60\x18\x53\x4c\x7d\x51\x8a\x32\x90\x4f\xe8\xa1\xd0\xaf\x90\xcb\x1e\x08\x46\x8d\x24\xac\xa8\xf8\x0a\x2d\xf8\x09\xab\xca\xc5\xc9\x0d\x08\x1e\x50\x71\x21\x78\xa5\x82\xfd\xc5\xb2\x9a\x58\xa5\x7a\x70\x80\x16\xcb\xd1\x4c\x15\xee\x64\x91\x02\xfd\x47\x23\xdd\xfb\x46\x30\x29\xd8\x7f\xd4\x42\x36\xa4\xa4\x4a\x32\x4a\x30\xb5\x35\xb4\xea\xbc\xdf\xe1\xae\x93\x01\xd8\xb4\xf2\xf0\xa7\xef\x35\xad\xc0\x72\x02\x8c\xdb\x67\x6c\x0d\xcb\x0b\x1b\xf9\x50\xa3\x29\xc0\x21\x5c\xa2\x51\x56\xb5\x14\x24\x6a\xbc\x37\xac\xfc\x87\x3f\x7d\x7f\x33\xaa\x97\x6b\x3b\xad\xe2\xd9\x22\x9f\xb0\xc5\xb2\x9a\xf1\x95\x62\xc4\x65\x06\x6c\x91\xeb\x66\x20\x7a\x38\x62\x0a\xad\x9f\xdd\x96\x02\x19\xb3\x8a\xc6\xf3\x14\xfc\xef\x66\x1f\xcf\x5f\x7e\x69\xf3\x78\xfe\xf2\x0b\x59\xc7\xf3\x97\x37\x63\x1c\xcb\x55\xc7\x36\x96\xab\x2d\x4c\x63\xb9\xba\xb6\x65\xfc\xb6\xa5\x65\xfc\xf6\x3b\x5b\xc6\x9b\x2f\x6f\x1a\x6f\xbe\x98\x6d\xbc\xb9\x29\xe3\xb8\xec\x59\xc7\xe5\x56\xe6\x71\xf9\x19\xf6\xf1\x7e\x4b\xfb\x78\xff\x3b\xd9\x07\x2c\xca\xeb\x96\xb1\x90\x33\xa3\xea\x85\x70\xce\x8b\x6a\xf3\xac\x6c\x01\x36\x21\xbf\xa1\x65\xd1\x60\x82\x2b\x6c\x6e\xca\x18\x00\xd9\xcd\x98\x03\xa0\xea\x18\x04\xfc\xf2\x74\x42\x42\x97\x1d\x48\x20\xdd\x14\x16\x26\x3b\x10\xaf\x40\x0b\xf4\x00\xf9\xc4\xb6\xd2\xa5\x59\xca\xa4\x35\x95\x07\x0f\xd0\x02\x96\xc8\x1b\x63\x90\x5b\x87\x08\xda\x43\x0b\xe3\x65\xf5\x66\x13\x12\x78\x86\xb6\xf6\x09\xd5\x2f\x4f\x6e\x86\x74\x34\x93\x05\xda\x33\xdc\x18\x3a\x20\xdd\x5f\xea\x12\xe4\xfe\x3b\xad\x17\xa6\xf2\xff\xed\xcc\xf7\xe5\xc4\xfe\x72\x51\x5b\xef\xcb\x1b\xb2\x5e\xa9\xf7\xae\xa5\x6a\xc6\x5b\xdb\xf3\x06\xc6\x3b\x88\x98\x80\xea\x1a\xf6\xab\x79\x41\x83\x67\xdc\x80\x15\xf9\xdf\xdd\x82\x5f\x2e\x2b\x56\xf1\x2f\x1d\x80\x57\x40\xe5\xa6\x4c\x18\xb0\xdd\x8c\x09\x4b\xc6\x74\x13\x5e\x2d\x47\xe3\xaf\x00\x19\xb5\x5f\xd5\x23\xb0\x03\x15\xd5\x17\x3b\x22\x1d\x6c\x7f\x79\x39\x89\x82\x81\x59\x7e\xae\xc2\x6e\x28\xe6\xfc\xb1\x34\x36\x12\x72\x04\xc4\xf6\x0a\x7b\x39\x50\xd8\xd3\xeb\x28\xec\x61\x9e\x7f\xe9\xcc\x97\xe5\xf9\x17\xca\x7c\xe5\x95\xdf\x37\xf1\xce\x9c\xf7\xde\x99\xf3\xad\xde\x99\xf3\x8d\xdf\x99\xfb\x23\xc2\x6e\x93\xc8\xc2\x86\x51\x73\xf2\x9b\xb1\xd5\xea\x4a\x34\xab\xc7\x10\x79\x31\x7c\x67\x58\x69\xaf\x87\x37\xe3\x18\x26\x52\xbb\x6d\xce\x8d\x76\x25\x0d\xc5\xc3\xe7\x46\x74\xf9\xcd\xbc\xba\xf2\x70\xa1\xae\x00\x5f\x16\xfa\xdc\xe6\xda\x74\xc3\xf1\x6a\x79\xc6\x57\xd5\x15\xfa\xbb\xba\x62\x18\x00\xc1\xbc\x1a\x14\x83\x69\x45\x65\x20\xeb\x7d\x13\x9e\x3a\xac\x34\x77\xa2\x77\xa3\xcb\xba\x3c\x59\x94\x45\x99\xb1\x45\x85\x52\x78\x5e\x2e\x34\xdf\x00\xa2\x8e\xd9\xdf\x76\x5e\xba\x66\xa6\xfe\xe5\x06\xe6\x81\x87\x1c\xd8\xdd\xb1\x23\xae\xc9\xf3\x33\x61\x96\x6c\xbe\xd3\x91\xfd\xa8\xe0\x90\x31\x20\x37\x92\xd3\xd0\x6e\x24\x44\xde\x55\xf3\x67\xf8\xea\x85\x2e\xea\x7e\x2f\x3a\x6b\xbe\x5d\x9f\xfd\x4c\x64\x6f\x07\xed\xc5\xdf\xb6\xd3\xda\xd3\x6d\xb1\x60\x8a\x13\xcc\x70\x0a\x67\x6a\x32\x9c\x63\x8e\x8b\x9d\x01\x92\x77\xff\x46\x5d\x9d\x22\xec\x6d\xbc\x3c\x00\x46\x37\x6d\xcc\x76\x10\x96\x2f\xd4\xe6\x09\x08\x8b\xf5\x17\xf9\xdf\xdf\x7e\x33\x1c\xc0\x10\x79\x7f\xe3\x03\x7f\x3a\x44\xc3\x55\x30\xfd\x4f\x8e\xcd\x35\xf8\x61\xc3\x46\x7f\x2f\xa0\x35\x69\xef\x23\x90\x3e\x34\xe7\x8b\x93\x6a\x86\xee\x22\xba\xe1\x56\xea\x7e\xa0\x39\x5a\x2e\x3e\xf2\x55\xfd\x6a\xa8\x85\x61\x15\x1f\xc4\xa0\x5d\x9f\x0e\xd8\x28\xf0\xd4\xa3\x76\xa3\xdd\xce\xca\xdc\x27\x74\xdc\x0d\xa2\x77\xd6\x28\x67\x15\x43\x6c\xbd\x25\x9d\x8d\x67\xb2\xba\x2b\x85\x97\x5a\x80\xde\xaf\x96\x6f\x7c\x62\x5f\x0a\x81\xc7\x9f\xb1\x67\x47\xd1\xea\x1a\x95\x61\xe7\x4e\x0d\xf7\x54\x2a\xb3\x61\xb2\x56\xaf\x69\x17\x8f\x54\x9b\x01\x97\xec\xee\xc6\x9b\xf7\xbb\xb4\xdd\x27\xbd\xda\x25\xbc\xba\xd5\xdb\xc1\x16\x7e\xf1\x57\xf3\xb0\x7f\x76\xbe\x9e\x4d\xea\x44\x4a\xe4\x08\xa6\xf7\x4a\x33\x74\x2f\x97\x40\x86\x7d\xb2\x75\x2a\xa2\x29\xb8\x8e\x20\x35\xce\x69\xd7\x6d\xac\x1b\x49\x06\x5e\x01\x68\x84\x49\x66\xcb\x33\x18\x24\x2d\x63\x3f\x1a\x4d\x5b\x1b\xb3\xe7\x28\x9b\x2f\x17\xae\x37\x95\x4d\x4d\x1a\xf0\xf4\x6d\x19\x7e\xb4\xdb\x32\x3c\x76\xda\xb2\x8e\x19\xb2\x14\xc9\x6e\xb3\xf3\xd5\xb4\xd3\xf5\x08\xe0\xff\x0c\x86\xfd\x67\x29\x99\x21\xd2\x3a\x96\x4a\x7c\xc3\x30\x5b\xef\x1a\xb3\x13\x80\x33\x4c\xf5\xc2\xba\x4c\x4e\x2c\x64\x1a\x17\xba\xe8\xf8\xcf\xa8\x1b\x5c\x6c\xe2\x03\x17\xca\xe4\x6b\xf4\x6f\xcb\x77\x26\xb1\xdb\x4d\x15\x80\x3b\xeb\xcb\x4d\x7a\x6c\xdd\x37\xd3\xdb\x2d\xa3\xb6\xc6\x7c\x7a\x37\xa5\xe1\x26\xfb\x5d\x0e\xee\xfe\x09\xcd\xaa\xea\x6c\x7d\xef\xe0\xe0\xb4\x9a\xad\xf7\x53\x7e\x70\x5e\x15\xf4\xd7\x35\xfa\x48\xf6\xf1\x3e\x41\xe9\x15\xfa\x1f\xa7\xac\x9a\x95\x6c\x2d\x2c\xa6\xdd\x20\x03\xbb\x42\xe4\x66\x8f\x83\x03\xf4\x3d\xaf\xe4\x71\x38\xce\x85\xb8\x4b\x96\xce\xf9\x1a\xfd\x55\x51\xfa\xeb\xad\x6f\x60\x1b\xff\x8a\xf3\x47\xcd\xfe\x97\xc1\x4e\x1a\x74\x47\x2a\xef\x0e\xba\x7d\xbb\xfe\xf9\xbe\x1d\x3d\xfa\xab\xec\x8e\x86\xfc\x19\xfc\xd0\xe2\x3e\x55\xdf\xbb\xa8\xd5\xaf\xb7\x6f\x1b\xf6\xe7\x1c\x76\x98\x6c\x80\x9d\x6c\x9c\xc0\xce\x99\xbf\x4e\xe5\x6e\xfc\x9f\x96\x39\xdf\xff\x75\x8d\x96\x2b\xf4\x9d\xdc\x4a\x53\x16\x25\xcf\x51\xb6\xcc\xf9\x14\xb0\xb0\x45\x8e\xce\xd7\x1c\x95\x95\x18\xd7\xfe\x2a\xe4\xa8\xf5\x41\xed\xc3\x69\xfa\x70\xa2\xbe\x77\xfb\x20\x7f\xbd\x2f\xf7\x24\xb5\xcd\xf6\x1b\xe8\x43\x1d\xd9\x6f\xbf\x69\xdf\xf6\x2f\xca\x45\x2e\xde\x2e\x3b\x30\x72\xeb\x90\xe0\x05\xe9\x3f\xc3\x66\x9f\x5b\xdf\x1c\xdc\xdd\xbb\xb1\xbf\xbb\x07\xb7\x64\x6f\xd7\xd5\xaa\x5c\x9c\x3c\x5e\x2d\x4f\x8f\x66\x6c\x75\xb4\xcc\x85\xe6\x5e\xc1\x8f\xfb\x85\xf6\xab\x12\xfe\x31\xfb\xc0\x17\x52\xc6\x7d\x93\x3d\x3b\x5f\x5c\x09\xf9\xde\xfa\xa6\x89\x60\xe7\xd9\x9a\xe4\x5c\xfc\x38\x91\x74\x64\x07\x61\x69\x13\x36\xdf\xd7\x43\x20\xfc\x94\x2d\xcf\x17\x15\x5f\xa9\x99\x4b\xf8\x69\x5e\xc7\x0a\xd9\xbc\x0d\x16\xf0\x14\xce\x33\xd6\x5f\xf8\x65\xb5\x62\xe2\xcb\xc5\xac\x9c\x73\x34\xa9\xb1\x3d\x50\x48\x24\xe9\x6f\xa0\x4d\x8b\x30\x53\xdd\x7b\x58\xd5\x0d\x76\x77\x85\xab\x7f\x03\x3a\x95\xc0\xdf\x1e\x22\xef\xf2\x7b\xea\x79\x42\xe7\xf2\xa7\x07\xf0\xd3\x77\x8f\x1f\x8b\x9f\x2c\x94\x84\xb8\xe0\x75\x7d\x7d\xbe\x5a\x2d\x4f\x58\xc5\xa7\x60\x75\xd5\x8c\xaf\x38\x9c\xf3\x44\x0b\x7e\x59\x21\xc1\x02\xcb\x2a\xbe\x82\x46\xd0\x8d\x4d\xf8\x03\x06\x27\x12\xfc\x36\xf2\x2e\x1f\x1f\x79\xde\x8e\xb0\x50\xef\xf2\x7b\xf8\xf8\x77\x11\x9c\xe7\xcb\x8b\x96\x3e\x34\xfb\x46\x4a\x5e\x0e\xe5\x13\xd5\x45\x81\xc0\x7f\xfc\x78\x07\x8e\x66\x7a\x3b\x68\x17\x69\x98\xe1\xc1\x6e\x5d\x71\x48\x51\x6f\xb3\x60\xd5\xd5\xf3\xc5\x29\xab\xb2\x19\xcf\x5b\x7a\xf7\xd1\x72\x31\xbf\x42\xec\xec\x8c\x43\xbf\xcb\x35\x38\x20\x3a\x5f\x94\xd5\x54\xbc\x68\x66\x6c\xcd\xe1\x6d\x53\x08\xa2\xc1\xd4\xc0\x08\x21\x55\xf5\xbe\xa8\x06\xab\x18\xea\x99\xf6\xf5\x8c\x95\xab\x61\xcf\xa0\x5f\x8a\xd7\x6f\x94\xe8\xf6\xf6\x14\xef\xb7\xfa\x1d\xb0\xb4\x14\x80\xe2\xff\x2a\xde\x4b\xa8\xda\x1b\xaf\xe3\x0c\x7c\x01\xce\x00\xa3\x70\xeb\x0b\x8d\x95\xcb\xbc\xa5\x6b\xe4\xe5\x22\xe7\x97\xe8\x10\xed\x61\xa3\xd9\x37\x7e\x74\xe7\x8e\x66\xfc\xbb\xbb\xb2\x99\xc5\xf8\x81\xce\x5b\x00\x79\xd7\x37\x76\x61\x4a\x8f\x85\xc6\xa5\x64\xe4\xaf\x7b\x87\xb5\xfa\xef\x6b\xf2\x42\xbb\x87\x86\xf8\x51\x23\xfa\xf6\x5b\x84\xbd\xda\x80\xd0\x6f\xca\x87\x94\x4a\x6a\x4e\xa4\xb1\xa2\xdf\x50\xc7\x0e\x1b\xe1\x6f\x40\x08\x10\xda\x94\xd4\x08\x3f\x9b\xf1\xec\xc3\xab\x8c\xcd\xd9\xea\x7f\x89\x56\x13\xa1\x87\x17\xcb\x72\x21\x77\x53\x83\x00\x9a\x9f\xba\x1e\xdf\xfe\x2c\xbd\xbe\x15\x4e\x35\x5b\x2d\x2f\xd0\xa3\xd5\x6a\xb9\x9a\x40\xaf\xee\x3c\x15\xa9\x50\x6b\x9a\x3f\xef\xde\x41\xbb\x2d\x82\xfd\x6a\x29\x23\xeb\x04\x47\x3b\xfb\xd5\xf2\xe7\xb3\x33\xbe\x3a\x62\x6b\x3e\xd9\x41\xbb\x12\x81\x30\xf9\xc5\xb2\x12\x06\x0e\xcc\x4a\xb9\xdc\x11\x0f\xeb\x8e\x7e\xfa\x02\x23\x41\x2b\x27\xc8\xaa\x45\x26\xde\x8a\x63\x2a\x97\xd9\xd4\xe0\x24\xa5\x6c\xd0\xc6\x44\x17\xe0\xb7\x75\x1b\xa9\x51\x98\xaa\xbc\xa4\xde\x4e\x5f\x2f\xd2\x21\x8e\xea\x86\x26\xb5\x68\x68\x6f\x2b\xe3\x7c\xfc\x98\xaa\x58\xa7\xc2\x1c\xde\x4b\xaf\x2a\x8e\xd6\xfc\xbf\xce\xf9\x22\x83\x40\x67\x67\xb4\xa5\x51\x9b\x0e\x0c\x84\x57\xa7\xe9\x72\xde\x38\x92\x8d\x32\xf5\xba\x94\xc9\x90\x72\x83\x69\x5c\x48\x91\x14\x10\x56\x02\x3a\xf2\x1a\x96\x9a\x8d\xc7\x06\x26\x20\x0c\xeb\x4c\xf8\x43\x26\x1c\x06\x7f\x7f\x4b\x26\x31\x91\x5c\x7a\x8a\xcb\x47\x5e\x07\xc5\xee\xa1\xc5\x6a\xa2\x0d\x3a\xf3\xc8\x1b\x74\x26\xf8\x2c\x89\x62\xaa\x98\x8d\x25\xb3\x8f\x37\x64\x16\x93\x6d\x3b\xd5\x42\x9a\xb8\xea\x76\xb4\xeb\x01\x8d\x6d\x02\x86\xbe\x4b\x88\xd4\x5f\x8d\x13\xfd\xa4\xa9\x41\x2a\x52\xf7\x61\x72\x35\xc8\x9a\x5a\xf8\xd1\x41\xa5\x01\xad\x7f\x10\x4a\x90\xd1\x6a\xc3\xc1\xa5\xed\xb1\x4e\x58\x1f\x65\x34\x94\xbb\x87\x0e\xd7\xef\x45\xf4\xb6\xd9\x97\x4a\x84\x1b\xd9\xaf\x38\xcb\x8f\x96\x8b\xaa\x5c\x9c\xc3\xe1\x59\xd0\x7e\x1b\x8a\x04\x27\x3f\x40\xdf\xbf\x3d\x04\xb6\x8e\x44\x62\x61\x18\x0d\xee\xfc\xb0\xf8\xc8\xe6\x65\x0e\x40\x52\xda\x77\x54\xb7\x1a\x79\x77\xa9\x20\x89\x10\x26\x0a\xde\x36\x74\xde\x29\x37\x11\x4d\x9b\x1f\x77\x77\x45\x32\x5e\x47\xa8\x1e\x9a\xdb\x32\x8c\xc8\x44\x50\x44\xc9\xbf\x6b\xc1\xd0\x08\xed\x3f\x6e\x18\x3b\x38\x40\x3f\x14\xe8\x82\x23\x91\xaf\x9d\x9f\x21\x91\xa9\x4e\x51\x59\xfd\xdf\xff\xfd\x7f\xea\x61\x49\x47\x01\x1c\xdf\xb2\xf4\x7c\x00\x78\x67\x10\xfc\xa5\xf5\xbe\x02\x2f\x98\xb4\x56\x2e\x80\xb1\x6e\x86\x44\xff\xe2\xeb\x5f\x02\x83\xf9\x0e\x75\xf5\x19\xaa\xea\x62\x3a\x1c\x6a\x5d\x49\xb6\x60\x73\x38\xfc\xd0\xc8\xf1\x25\x67\x39\x2a\xca\xd5\xba\xaa\xa5\x04\xdd\xda\x5e\xcd\xc3\xd1\x0d\x4d\x16\xcb\xa1\x78\xd7\x3b\xb5\x4d\x48\x42\xb7\x95\xfe\x55\x64\xd5\x78\x6d\xe4\x5b\xf3\x3a\x1c\xc3\x7a\x78\x1e\xd5\x06\x75\x54\xa3\x02\xb5\xa0\x43\x8b\xc3\xdc\xef\xc7\x03\x1d\x19\x96\xaf\x19\x50\x73\xa7\xd1\xae\x29\x01\x6b\xac\xb7\x35\x5f\x2d\x46\x75\x13\xf8\x2d\x4c\xb0\x4e\xeb\x65\xdf\xfd\xbe\x6c\x4f\xd9\x15\x2a\x17\xd9\xfc\x1c\x5e\x42\xc4\xcb\x85\xfe\x4a\x63\x92\xf2\xe3\x5a\x3a\x8f\xb6\x90\x0e\x98\xf2\xf5\x04\xe8\xa9\xf7\x34\x02\x7b\x93\x24\x2d\x5d\xa0\xbe\x4d\xa0\x1e\x24\x2f\x52\x60\x63\xf9\xc1\x97\x94\xf9\x70\x84\xef\x4b\x94\x2a\x89\x3e\xbe\x59\x89\x42\xc8\xb8\xa6\xd0\x63\x10\xba\x77\xd9\x17\xbb\x77\xe9\x1d\xed\xa0\xdf\x40\x22\x13\xc9\x83\xfc\xb5\xd1\x47\x60\xd5\x07\xbc\x51\x19\xde\x31\xb0\xa7\xbf\x82\x99\x35\x51\xcb\xd3\xa8\x85\x9f\x8f\x1f\xef\x51\x94\xc3\x4c\x19\xcf\x9b\xc8\x5b\x87\x4d\x75\x02\xab\xf9\x0e\x01\x4d\xfb\x0e\xf1\xe7\x7e\x2f\x27\x51\xb9\x46\x3b\x1a\x4b\xfe\x1a\x7c\xdd\x94\x44\x03\xab\xa3\x1a\x50\xd1\x03\xa0\x96\x94\x68\x31\xb6\x9d\xfd\xe9\xa4\x3b\xed\x3c\x51\x75\x7a\xa6\x65\x23\x93\xea\xf4\x0c\x1d\xf6\xc6\x92\x1d\xf4\xa7\xc3\x43\x19\x94\xfb\xd9\x89\x5a\xc4\xa8\x4e\xcf\xfa\x79\x86\xf6\x82\xde\x42\xef\x7c\xc9\xc9\x37\x21\x56\x74\x08\x0c\xde\xf9\xc8\x57\xeb\x72\xb9\xb8\x73\x0f\xdd\x81\x49\xdf\x3b\x53\xf1\xab\xe4\xe7\xce\x3d\x2d\x2b\x84\xdf\x65\x77\xd5\xef\xf2\xcb\xad\x6f\x3e\xa9\x49\xba\x57\xcb\x53\x8e\x1e\x3e\xfb\x1e\xa5\xe7\xe5\x3c\x47\xcb\xb3\xaa\x3c\x2d\xff\xc6\x57\xeb\x29\x9a\x97\x1f\x38\x5a\xed\xff\xba\x9e\xca\x57\x62\x98\x69\x5f\x9f\xf1\xac\x2c\xca\x4c\x38\x6f\x5e\x82\xc2\xcf\x58\x55\xf1\xd5\x62\x0d\xf8\xa0\x51\x35\xe3\xa8\x58\xce\xe7\xcb\x8b\x72\x71\x72\x4f\xce\x79\x0a\xf3\xeb\x9d\x8b\x44\x77\x6a\xa3\xb9\x23\x27\x77\x3b\x00\xfb\xec\x34\xef\xcd\xa2\x36\x47\x24\xc5\xb3\x5b\xdf\x48\x75\xa9\x43\x93\xcd\x34\x77\x77\x00\x13\x7d\x06\xdd\x81\x72\xda\xb7\x8b\xde\xac\xf1\x9f\xb4\xef\xfb\x8b\x65\xce\x8f\xaf\xce\x78\x9b\xcc\xb5\x73\xd5\xea\xc5\xa3\x5c\xe8\xf3\xc6\x2f\xcb\xc5\xc9\xf2\x7f\xbe\x42\x1f\xbd\x7d\xba\xef\xc1\xeb\x79\xdb\x42\x3b\x4b\xda\x30\xa3\x42\x63\x8d\x89\xad\x2e\x66\x6c\xde\xc3\x14\xef\x7b\x7b\x72\x22\x66\x55\xef\x8d\x92\xa7\x18\xd5\x6f\x33\xb6\x7e\x7e\xb1\x78\x51\x6f\x81\x39\x54\x40\xfb\xdd\xdf\x01\xbc\x59\x22\x81\xaa\x71\x52\x28\x75\xc4\xe8\x82\xcb\xf5\x21\xf1\x1c\x0e\x12\xef\x08\xd9\xe8\xb2\x7a\xfb\x41\x16\x30\x14\x10\xf0\xb9\x33\xf9\xd5\xeb\xd7\xcb\x59\xb9\x58\x8a\x5e\x31\x74\xc1\x53\xa4\x0e\xaa\xaa\x59\xeb\x7d\x65\xd0\x4a\x26\x9f\x6e\xa9\x23\xaa\xb0\x6c\xf2\x69\xfa\xf7\x4f\xef\xa6\x34\xda\x64\x49\x64\x70\x62\xf7\xcd\xb3\xa7\x4f\xaa\xea\xec\xa5\x18\x32\xd6\x55\x83\xed\xcf\x69\x79\x22\x37\xb3\xec\xff\xba\xfe\xf3\x26\x98\xef\x9c\xaf\x39\xbc\xb0\x65\xd5\x9d\xfb\xb7\x86\x84\xbe\x2b\x4f\x7e\x02\x84\xf7\x45\x87\x7f\x5d\xcf\x44\x50\x2e\x4f\x16\xcb\x15\xbf\x37\x2f\x17\xfc\x56\x43\xfa\x82\xa7\xfe\x46\x24\x85\x92\x5e\xf3\x54\x8e\x4d\xf2\x98\xf1\x9d\xfd\x83\x79\x99\x1e\x08\x14\x22\x38\xdf\x3a\x38\x40\xf9\x72\x51\xa1\xe5\x47\xbe\x5a\x95\x39\xaf\x17\x1c\xea\xf5\x8d\x5b\xda\x11\x64\xb5\x72\x20\x02\xdc\x9d\x66\x43\x03\xac\x47\x74\x00\xf6\x25\xc9\x2e\x94\x30\x10\x58\x26\xd3\x41\x80\xb9\xfb\xb7\x3e\x19\xa4\x21\x9f\xa8\x85\xad\x9a\xe3\x3f\xdf\x23\xe4\xd3\x3b\x21\x85\xe9\x5b\x29\x85\x77\x3b\xb7\x0e\x0e\xfe\x3f\xb4\x5e\x9e\xaf\x32\xfe\x8c\x9d\x9d\x95\x8b\x93\x9f\x5f\x3e\x3d\x14\x0f\xf7\xe6\xb0\x89\xf4\xd7\xf5\xfe\x29\x3b\xbb\xf5\xff\x02\x00\x00\xff\xff\x64\xb1\xb4\x44\x52\x1f\x06\x00") - -func web3JsBytes() ([]byte, error) { - return bindataRead( - _web3Js, - "web3.js", - ) -} - -func web3Js() (*asset, error) { - bytes, err := web3JsBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "web3.js", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} - return a, nil -} - -// Asset loads and returns the asset for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func Asset(name string) ([]byte, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) - } - return a.bytes, nil - } - return nil, fmt.Errorf("Asset %s not found", name) -} - -// MustAsset is like Asset but panics when Asset would return an error. -// It simplifies safe initialization of global variables. -func MustAsset(name string) []byte { - a, err := Asset(name) - if err != nil { - panic("asset: Asset(" + name + "): " + err.Error()) - } - - return a -} - -// AssetInfo loads and returns the asset info for the given name. -// It returns an error if the asset could not be found or -// could not be loaded. -func AssetInfo(name string) (os.FileInfo, error) { - canonicalName := strings.Replace(name, "\\", "/", -1) - if f, ok := _bindata[canonicalName]; ok { - a, err := f() - if err != nil { - return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) - } - return a.info, nil - } - return nil, fmt.Errorf("AssetInfo %s not found", name) -} - -// AssetNames returns the names of the assets. -func AssetNames() []string { - names := make([]string, 0, len(_bindata)) - for name := range _bindata { - names = append(names, name) - } - return names -} - -// _bindata is a table, holding each asset generator, mapped to its name. -var _bindata = map[string]func() (*asset, error){ - "bignumber.js": bignumberJs, - "web3.js": web3Js, -} - -// AssetDir returns the file names below a certain -// directory embedded in the file by go-bindata. -// For example if you run go-bindata on data/... and data contains the -// following hierarchy: -// data/ -// foo.txt -// img/ -// a.png -// b.png -// then AssetDir("data") would return []string{"foo.txt", "img"} -// AssetDir("data/img") would return []string{"a.png", "b.png"} -// AssetDir("foo.txt") and AssetDir("notexist") would return an error -// AssetDir("") will return []string{"data"}. -func AssetDir(name string) ([]string, error) { - node := _bintree - if len(name) != 0 { - canonicalName := strings.Replace(name, "\\", "/", -1) - pathList := strings.Split(canonicalName, "/") - for _, p := range pathList { - node = node.Children[p] - if node == nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - } - } - if node.Func != nil { - return nil, fmt.Errorf("Asset %s not found", name) - } - rv := make([]string, 0, len(node.Children)) - for childName := range node.Children { - rv = append(rv, childName) - } - return rv, nil -} - -type bintree struct { - Func func() (*asset, error) - Children map[string]*bintree -} - -var _bintree = &bintree{nil, map[string]*bintree{ - "bignumber.js": {bignumberJs, map[string]*bintree{}}, - "web3.js": {web3Js, map[string]*bintree{}}, -}} - -// RestoreAsset restores an asset under the given directory -func RestoreAsset(dir, name string) error { - data, err := Asset(name) - if err != nil { - return err - } - info, err := AssetInfo(name) - if err != nil { - return err - } - err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755)) - if err != nil { - return err - } - err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) - if err != nil { - return err - } - err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) - if err != nil { - return err - } - return nil -} - -// RestoreAssets restores an asset under the given directory recursively -func RestoreAssets(dir, name string) error { - children, err := AssetDir(name) - // File - if err != nil { - return RestoreAsset(dir, name) - } - // Dir - for _, child := range children { - err = RestoreAssets(dir, filepath.Join(name, child)) - if err != nil { - return err - } - } - return nil -} - -func _filePath(dir, name string) string { - canonicalName := strings.Replace(name, "\\", "/", -1) - return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) -} diff --git a/internal/jsre/deps/deps.go b/internal/jsre/deps/deps.go deleted file mode 100644 index fe2e6f2fadf..00000000000 --- a/internal/jsre/deps/deps.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package deps contains the console JavaScript dependencies Go embedded. -package deps - -//go:generate go-bindata -nometadata -pkg deps -o bindata.go bignumber.js web3.js -//go:generate gofmt -w -s bindata.go diff --git a/internal/jsre/deps/web3.js b/internal/jsre/deps/web3.js deleted file mode 100644 index 6ae0c496502..00000000000 --- a/internal/jsre/deps/web3.js +++ /dev/null @@ -1,13628 +0,0 @@ -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o. -*/ -/** - * @file coder.js - * @author Marek Kotewicz - * @date 2015 - */ - -var f = require('./formatters'); - -var SolidityTypeAddress = require('./address'); -var SolidityTypeBool = require('./bool'); -var SolidityTypeInt = require('./int'); -var SolidityTypeUInt = require('./uint'); -var SolidityTypeDynamicBytes = require('./dynamicbytes'); -var SolidityTypeString = require('./string'); -var SolidityTypeReal = require('./real'); -var SolidityTypeUReal = require('./ureal'); -var SolidityTypeBytes = require('./bytes'); - -var isDynamic = function (solidityType, type) { - return solidityType.isDynamicType(type) || - solidityType.isDynamicArray(type); -}; - -/** - * SolidityCoder prototype should be used to encode/decode solidity params of any type - */ -var SolidityCoder = function (types) { - this._types = types; -}; - -/** - * This method should be used to transform type to SolidityType - * - * @method _requireType - * @param {String} type - * @returns {SolidityType} - * @throws {Error} throws if no matching type is found - */ -SolidityCoder.prototype._requireType = function (type) { - var solidityType = this._types.filter(function (t) { - return t.isType(type); - })[0]; - - if (!solidityType) { - throw Error('invalid solidity type!: ' + type); - } - - return solidityType; -}; - -/** - * Should be used to encode plain param - * - * @method encodeParam - * @param {String} type - * @param {Object} plain param - * @return {String} encoded plain param - */ -SolidityCoder.prototype.encodeParam = function (type, param) { - return this.encodeParams([type], [param]); -}; - -/** - * Should be used to encode list of params - * - * @method encodeParams - * @param {Array} types - * @param {Array} params - * @return {String} encoded list of params - */ -SolidityCoder.prototype.encodeParams = function (types, params) { - var solidityTypes = this.getSolidityTypes(types); - - var encodeds = solidityTypes.map(function (solidityType, index) { - return solidityType.encode(params[index], types[index]); - }); - - var dynamicOffset = solidityTypes.reduce(function (acc, solidityType, index) { - var staticPartLength = solidityType.staticPartLength(types[index]); - var roundedStaticPartLength = Math.floor((staticPartLength + 31) / 32) * 32; - - return acc + (isDynamic(solidityTypes[index], types[index]) ? - 32 : - roundedStaticPartLength); - }, 0); - - var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset); - - return result; -}; - -SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, encodeds, dynamicOffset) { - var result = ""; - var self = this; - - types.forEach(function (type, i) { - if (isDynamic(solidityTypes[i], types[i])) { - result += f.formatInputInt(dynamicOffset).encode(); - var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); - dynamicOffset += e.length / 2; - } else { - // don't add length to dynamicOffset. it's already counted - result += self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); - } - - // TODO: figure out nested arrays - }); - - types.forEach(function (type, i) { - if (isDynamic(solidityTypes[i], types[i])) { - var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset); - dynamicOffset += e.length / 2; - result += e; - } - }); - return result; -}; - -// TODO: refactor whole encoding! -SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded, offset) { - var self = this; - if (solidityType.isDynamicArray(type)) { - return (function () { - // offset was already set - var nestedName = solidityType.nestedName(type); - var nestedStaticPartLength = solidityType.staticPartLength(nestedName); - var result = encoded[0]; - - (function () { - var previousLength = 2; // in int - if (solidityType.isDynamicArray(nestedName)) { - for (var i = 1; i < encoded.length; i++) { - previousLength += +(encoded[i - 1])[0] || 0; - result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode(); - } - } - })(); - - // first element is length, skip it - (function () { - for (var i = 0; i < encoded.length - 1; i++) { - var additionalOffset = result / 2; - result += self.encodeWithOffset(nestedName, solidityType, encoded[i + 1], offset + additionalOffset); - } - })(); - - return result; - })(); - - } else if (solidityType.isStaticArray(type)) { - return (function () { - var nestedName = solidityType.nestedName(type); - var nestedStaticPartLength = solidityType.staticPartLength(nestedName); - var result = ""; - - - if (solidityType.isDynamicArray(nestedName)) { - (function () { - var previousLength = 0; // in int - for (var i = 0; i < encoded.length; i++) { - // calculate length of previous item - previousLength += +(encoded[i - 1] || [])[0] || 0; - result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode(); - } - })(); - } - - (function () { - for (var i = 0; i < encoded.length; i++) { - var additionalOffset = result / 2; - result += self.encodeWithOffset(nestedName, solidityType, encoded[i], offset + additionalOffset); - } - })(); - - return result; - })(); - } - - return encoded; -}; - -/** - * Should be used to decode bytes to plain param - * - * @method decodeParam - * @param {String} type - * @param {String} bytes - * @return {Object} plain param - */ -SolidityCoder.prototype.decodeParam = function (type, bytes) { - return this.decodeParams([type], bytes)[0]; -}; - -/** - * Should be used to decode list of params - * - * @method decodeParam - * @param {Array} types - * @param {String} bytes - * @return {Array} array of plain params - */ -SolidityCoder.prototype.decodeParams = function (types, bytes) { - var solidityTypes = this.getSolidityTypes(types); - var offsets = this.getOffsets(types, solidityTypes); - - return solidityTypes.map(function (solidityType, index) { - return solidityType.decode(bytes, offsets[index], types[index], index); - }); -}; - -SolidityCoder.prototype.getOffsets = function (types, solidityTypes) { - var lengths = solidityTypes.map(function (solidityType, index) { - return solidityType.staticPartLength(types[index]); - }); - - for (var i = 1; i < lengths.length; i++) { - // sum with length of previous element - lengths[i] += lengths[i - 1]; - } - - return lengths.map(function (length, index) { - // remove the current length, so the length is sum of previous elements - var staticPartLength = solidityTypes[index].staticPartLength(types[index]); - return length - staticPartLength; - }); -}; - -SolidityCoder.prototype.getSolidityTypes = function (types) { - var self = this; - return types.map(function (type) { - return self._requireType(type); - }); -}; - -var coder = new SolidityCoder([ - new SolidityTypeAddress(), - new SolidityTypeBool(), - new SolidityTypeInt(), - new SolidityTypeUInt(), - new SolidityTypeDynamicBytes(), - new SolidityTypeBytes(), - new SolidityTypeString(), - new SolidityTypeReal(), - new SolidityTypeUReal() -]); - -module.exports = coder; - -},{"./address":4,"./bool":5,"./bytes":6,"./dynamicbytes":8,"./formatters":9,"./int":10,"./real":12,"./string":13,"./uint":15,"./ureal":16}],8:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityType = require('./type'); - -var SolidityTypeDynamicBytes = function () { - this._inputFormatter = f.formatInputDynamicBytes; - this._outputFormatter = f.formatOutputDynamicBytes; -}; - -SolidityTypeDynamicBytes.prototype = new SolidityType({}); -SolidityTypeDynamicBytes.prototype.constructor = SolidityTypeDynamicBytes; - -SolidityTypeDynamicBytes.prototype.isType = function (name) { - return !!name.match(/^bytes(\[([0-9]*)\])*$/); -}; - -SolidityTypeDynamicBytes.prototype.isDynamicType = function () { - return true; -}; - -module.exports = SolidityTypeDynamicBytes; - -},{"./formatters":9,"./type":14}],9:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file formatters.js - * @author Marek Kotewicz - * @date 2015 - */ - -var BigNumber = require('bignumber.js'); -var utils = require('../utils/utils'); -var c = require('../utils/config'); -var SolidityParam = require('./param'); - - -/** - * Formats input value to byte representation of int - * If value is negative, return it's two's complement - * If the value is floating point, round it down - * - * @method formatInputInt - * @param {String|Number|BigNumber} value that needs to be formatted - * @returns {SolidityParam} - */ -var formatInputInt = function (value) { - BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE); - var result = utils.padLeft(utils.toTwosComplement(value).toString(16), 64); - return new SolidityParam(result); -}; - -/** - * Formats input bytes - * - * @method formatInputBytes - * @param {String} - * @returns {SolidityParam} - */ -var formatInputBytes = function (value) { - var result = utils.toHex(value).substr(2); - var l = Math.floor((result.length + 63) / 64); - result = utils.padRight(result, l * 64); - return new SolidityParam(result); -}; - -/** - * Formats input bytes - * - * @method formatDynamicInputBytes - * @param {String} - * @returns {SolidityParam} - */ -var formatInputDynamicBytes = function (value) { - var result = utils.toHex(value).substr(2); - var length = result.length / 2; - var l = Math.floor((result.length + 63) / 64); - result = utils.padRight(result, l * 64); - return new SolidityParam(formatInputInt(length).value + result); -}; - -/** - * Formats input value to byte representation of string - * - * @method formatInputString - * @param {String} - * @returns {SolidityParam} - */ -var formatInputString = function (value) { - var result = utils.fromUtf8(value).substr(2); - var length = result.length / 2; - var l = Math.floor((result.length + 63) / 64); - result = utils.padRight(result, l * 64); - return new SolidityParam(formatInputInt(length).value + result); -}; - -/** - * Formats input value to byte representation of bool - * - * @method formatInputBool - * @param {Boolean} - * @returns {SolidityParam} - */ -var formatInputBool = function (value) { - var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0'); - return new SolidityParam(result); -}; - -/** - * Formats input value to byte representation of real - * Values are multiplied by 2^m and encoded as integers - * - * @method formatInputReal - * @param {String|Number|BigNumber} - * @returns {SolidityParam} - */ -var formatInputReal = function (value) { - return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128))); -}; - -/** - * Check if input value is negative - * - * @method signedIsNegative - * @param {String} value is hex format - * @returns {Boolean} true if it is negative, otherwise false - */ -var signedIsNegative = function (value) { - return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1'; -}; - -/** - * Formats right-aligned output bytes to int - * - * @method formatOutputInt - * @param {SolidityParam} param - * @returns {BigNumber} right-aligned output bytes formatted to big number - */ -var formatOutputInt = function (param) { - var value = param.staticPart() || "0"; - - // check if it's negative number - // it is, return two's complement - if (signedIsNegative(value)) { - return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1); - } - return new BigNumber(value, 16); -}; - -/** - * Formats right-aligned output bytes to uint - * - * @method formatOutputUInt - * @param {SolidityParam} - * @returns {BigNumeber} right-aligned output bytes formatted to uint - */ -var formatOutputUInt = function (param) { - var value = param.staticPart() || "0"; - return new BigNumber(value, 16); -}; - -/** - * Formats right-aligned output bytes to real - * - * @method formatOutputReal - * @param {SolidityParam} - * @returns {BigNumber} input bytes formatted to real - */ -var formatOutputReal = function (param) { - return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128)); -}; - -/** - * Formats right-aligned output bytes to ureal - * - * @method formatOutputUReal - * @param {SolidityParam} - * @returns {BigNumber} input bytes formatted to ureal - */ -var formatOutputUReal = function (param) { - return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128)); -}; - -/** - * Should be used to format output bool - * - * @method formatOutputBool - * @param {SolidityParam} - * @returns {Boolean} right-aligned input bytes formatted to bool - */ -var formatOutputBool = function (param) { - return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; -}; - -/** - * Should be used to format output bytes - * - * @method formatOutputBytes - * @param {SolidityParam} left-aligned hex representation of string - * @param {String} name type name - * @returns {String} hex string - */ -var formatOutputBytes = function (param, name) { - var matches = name.match(/^bytes([0-9]*)/); - var size = parseInt(matches[1]); - return '0x' + param.staticPart().slice(0, 2 * size); -}; - -/** - * Should be used to format output bytes - * - * @method formatOutputDynamicBytes - * @param {SolidityParam} left-aligned hex representation of string - * @returns {String} hex string - */ -var formatOutputDynamicBytes = function (param) { - var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2; - return '0x' + param.dynamicPart().substr(64, length); -}; - -/** - * Should be used to format output string - * - * @method formatOutputString - * @param {SolidityParam} left-aligned hex representation of string - * @returns {String} ascii string - */ -var formatOutputString = function (param) { - var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2; - return utils.toUtf8(param.dynamicPart().substr(64, length)); -}; - -/** - * Should be used to format output address - * - * @method formatOutputAddress - * @param {SolidityParam} right-aligned input bytes - * @returns {String} address - */ -var formatOutputAddress = function (param) { - var value = param.staticPart(); - return "0x" + value.slice(value.length - 40, value.length); -}; - -module.exports = { - formatInputInt: formatInputInt, - formatInputBytes: formatInputBytes, - formatInputDynamicBytes: formatInputDynamicBytes, - formatInputString: formatInputString, - formatInputBool: formatInputBool, - formatInputReal: formatInputReal, - formatOutputInt: formatOutputInt, - formatOutputUInt: formatOutputUInt, - formatOutputReal: formatOutputReal, - formatOutputUReal: formatOutputUReal, - formatOutputBool: formatOutputBool, - formatOutputBytes: formatOutputBytes, - formatOutputDynamicBytes: formatOutputDynamicBytes, - formatOutputString: formatOutputString, - formatOutputAddress: formatOutputAddress -}; - -},{"../utils/config":18,"../utils/utils":20,"./param":11,"bignumber.js":"bignumber.js"}],10:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityType = require('./type'); - -/** - * SolidityTypeInt is a prootype that represents int type - * It matches: - * int - * int[] - * int[4] - * int[][] - * int[3][] - * int[][6][], ... - * int32 - * int64[] - * int8[4] - * int256[][] - * int[3][] - * int64[][6][], ... - */ -var SolidityTypeInt = function () { - this._inputFormatter = f.formatInputInt; - this._outputFormatter = f.formatOutputInt; -}; - -SolidityTypeInt.prototype = new SolidityType({}); -SolidityTypeInt.prototype.constructor = SolidityTypeInt; - -SolidityTypeInt.prototype.isType = function (name) { - return !!name.match(/^int([0-9]*)?(\[([0-9]*)\])*$/); -}; - -module.exports = SolidityTypeInt; - -},{"./formatters":9,"./type":14}],11:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file param.js - * @author Marek Kotewicz - * @date 2015 - */ - -var utils = require('../utils/utils'); - -/** - * SolidityParam object prototype. - * Should be used when encoding, decoding solidity bytes - */ -var SolidityParam = function (value, offset) { - this.value = value || ''; - this.offset = offset; // offset in bytes -}; - -/** - * This method should be used to get length of params's dynamic part - * - * @method dynamicPartLength - * @returns {Number} length of dynamic part (in bytes) - */ -SolidityParam.prototype.dynamicPartLength = function () { - return this.dynamicPart().length / 2; -}; - -/** - * This method should be used to create copy of solidity param with different offset - * - * @method withOffset - * @param {Number} offset length in bytes - * @returns {SolidityParam} new solidity param with applied offset - */ -SolidityParam.prototype.withOffset = function (offset) { - return new SolidityParam(this.value, offset); -}; - -/** - * This method should be used to combine solidity params together - * eg. when appending an array - * - * @method combine - * @param {SolidityParam} param with which we should combine - * @param {SolidityParam} result of combination - */ -SolidityParam.prototype.combine = function (param) { - return new SolidityParam(this.value + param.value); -}; - -/** - * This method should be called to check if param has dynamic size. - * If it has, it returns true, otherwise false - * - * @method isDynamic - * @returns {Boolean} - */ -SolidityParam.prototype.isDynamic = function () { - return this.offset !== undefined; -}; - -/** - * This method should be called to transform offset to bytes - * - * @method offsetAsBytes - * @returns {String} bytes representation of offset - */ -SolidityParam.prototype.offsetAsBytes = function () { - return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64); -}; - -/** - * This method should be called to get static part of param - * - * @method staticPart - * @returns {String} offset if it is a dynamic param, otherwise value - */ -SolidityParam.prototype.staticPart = function () { - if (!this.isDynamic()) { - return this.value; - } - return this.offsetAsBytes(); -}; - -/** - * This method should be called to get dynamic part of param - * - * @method dynamicPart - * @returns {String} returns a value if it is a dynamic param, otherwise empty string - */ -SolidityParam.prototype.dynamicPart = function () { - return this.isDynamic() ? this.value : ''; -}; - -/** - * This method should be called to encode param - * - * @method encode - * @returns {String} - */ -SolidityParam.prototype.encode = function () { - return this.staticPart() + this.dynamicPart(); -}; - -/** - * This method should be called to encode array of params - * - * @method encodeList - * @param {Array[SolidityParam]} params - * @returns {String} - */ -SolidityParam.encodeList = function (params) { - - // updating offsets - var totalOffset = params.length * 32; - var offsetParams = params.map(function (param) { - if (!param.isDynamic()) { - return param; - } - var offset = totalOffset; - totalOffset += param.dynamicPartLength(); - return param.withOffset(offset); - }); - - // encode everything! - return offsetParams.reduce(function (result, param) { - return result + param.dynamicPart(); - }, offsetParams.reduce(function (result, param) { - return result + param.staticPart(); - }, '')); -}; - - - -module.exports = SolidityParam; - - -},{"../utils/utils":20}],12:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityType = require('./type'); - -/** - * SolidityTypeReal is a prootype that represents real type - * It matches: - * real - * real[] - * real[4] - * real[][] - * real[3][] - * real[][6][], ... - * real32 - * real64[] - * real8[4] - * real256[][] - * real[3][] - * real64[][6][], ... - */ -var SolidityTypeReal = function () { - this._inputFormatter = f.formatInputReal; - this._outputFormatter = f.formatOutputReal; -}; - -SolidityTypeReal.prototype = new SolidityType({}); -SolidityTypeReal.prototype.constructor = SolidityTypeReal; - -SolidityTypeReal.prototype.isType = function (name) { - return !!name.match(/real([0-9]*)?(\[([0-9]*)\])?/); -}; - -module.exports = SolidityTypeReal; - -},{"./formatters":9,"./type":14}],13:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityType = require('./type'); - -var SolidityTypeString = function () { - this._inputFormatter = f.formatInputString; - this._outputFormatter = f.formatOutputString; -}; - -SolidityTypeString.prototype = new SolidityType({}); -SolidityTypeString.prototype.constructor = SolidityTypeString; - -SolidityTypeString.prototype.isType = function (name) { - return !!name.match(/^string(\[([0-9]*)\])*$/); -}; - -SolidityTypeString.prototype.isDynamicType = function () { - return true; -}; - -module.exports = SolidityTypeString; - -},{"./formatters":9,"./type":14}],14:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityParam = require('./param'); - -/** - * SolidityType prototype is used to encode/decode solidity params of certain type - */ -var SolidityType = function (config) { - this._inputFormatter = config.inputFormatter; - this._outputFormatter = config.outputFormatter; -}; - -/** - * Should be used to determine if this SolidityType do match given name - * - * @method isType - * @param {String} name - * @return {Bool} true if type match this SolidityType, otherwise false - */ -SolidityType.prototype.isType = function (name) { - throw "this method should be overrwritten for type " + name; -}; - -/** - * Should be used to determine what is the length of static part in given type - * - * @method staticPartLength - * @param {String} name - * @return {Number} length of static part in bytes - */ -SolidityType.prototype.staticPartLength = function (name) { - // If name isn't an array then treat it like a single element array. - return (this.nestedTypes(name) || ['[1]']) - .map(function (type) { - // the length of the nested array - return parseInt(type.slice(1, -1), 10) || 1; - }) - .reduce(function (previous, current) { - return previous * current; - // all basic types are 32 bytes long - }, 32); -}; - -/** - * Should be used to determine if type is dynamic array - * eg: - * "type[]" => true - * "type[4]" => false - * - * @method isDynamicArray - * @param {String} name - * @return {Bool} true if the type is dynamic array - */ -SolidityType.prototype.isDynamicArray = function (name) { - var nestedTypes = this.nestedTypes(name); - return !!nestedTypes && !nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g); -}; - -/** - * Should be used to determine if type is static array - * eg: - * "type[]" => false - * "type[4]" => true - * - * @method isStaticArray - * @param {String} name - * @return {Bool} true if the type is static array - */ -SolidityType.prototype.isStaticArray = function (name) { - var nestedTypes = this.nestedTypes(name); - return !!nestedTypes && !!nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g); -}; - -/** - * Should return length of static array - * eg. - * "int[32]" => 32 - * "int256[14]" => 14 - * "int[2][3]" => 3 - * "int" => 1 - * "int[1]" => 1 - * "int[]" => 1 - * - * @method staticArrayLength - * @param {String} name - * @return {Number} static array length - */ -SolidityType.prototype.staticArrayLength = function (name) { - var nestedTypes = this.nestedTypes(name); - if (nestedTypes) { - return parseInt(nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g) || 1); - } - return 1; -}; - -/** - * Should return nested type - * eg. - * "int[32]" => "int" - * "int256[14]" => "int256" - * "int[2][3]" => "int[2]" - * "int" => "int" - * "int[]" => "int" - * - * @method nestedName - * @param {String} name - * @return {String} nested name - */ -SolidityType.prototype.nestedName = function (name) { - // remove last [] in name - var nestedTypes = this.nestedTypes(name); - if (!nestedTypes) { - return name; - } - - return name.substr(0, name.length - nestedTypes[nestedTypes.length - 1].length); -}; - -/** - * Should return true if type has dynamic size by default - * such types are "string", "bytes" - * - * @method isDynamicType - * @param {String} name - * @return {Bool} true if is dynamic, otherwise false - */ -SolidityType.prototype.isDynamicType = function () { - return false; -}; - -/** - * Should return array of nested types - * eg. - * "int[2][3][]" => ["[2]", "[3]", "[]"] - * "int[] => ["[]"] - * "int" => null - * - * @method nestedTypes - * @param {String} name - * @return {Array} array of nested types - */ -SolidityType.prototype.nestedTypes = function (name) { - // return list of strings eg. "[]", "[3]", "[]", "[2]" - return name.match(/(\[[0-9]*\])/g); -}; - -/** - * Should be used to encode the value - * - * @method encode - * @param {Object} value - * @param {String} name - * @return {String} encoded value - */ -SolidityType.prototype.encode = function (value, name) { - var self = this; - if (this.isDynamicArray(name)) { - - return (function () { - var length = value.length; // in int - var nestedName = self.nestedName(name); - - var result = []; - result.push(f.formatInputInt(length).encode()); - - value.forEach(function (v) { - result.push(self.encode(v, nestedName)); - }); - - return result; - })(); - - } else if (this.isStaticArray(name)) { - - return (function () { - var length = self.staticArrayLength(name); // in int - var nestedName = self.nestedName(name); - - var result = []; - for (var i = 0; i < length; i++) { - result.push(self.encode(value[i], nestedName)); - } - - return result; - })(); - - } - - return this._inputFormatter(value, name).encode(); -}; - -/** - * Should be used to decode value from bytes - * - * @method decode - * @param {String} bytes - * @param {Number} offset in bytes - * @param {String} name type name - * @returns {Object} decoded value - */ -SolidityType.prototype.decode = function (bytes, offset, name) { - var self = this; - - if (this.isDynamicArray(name)) { - - return (function () { - var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes - var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int - var arrayStart = arrayOffset + 32; // array starts after length; // in bytes - - var nestedName = self.nestedName(name); - var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes - var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32; - var result = []; - - for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) { - result.push(self.decode(bytes, arrayStart + i, nestedName)); - } - - return result; - })(); - - } else if (this.isStaticArray(name)) { - - return (function () { - var length = self.staticArrayLength(name); // in int - var arrayStart = offset; // in bytes - - var nestedName = self.nestedName(name); - var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes - var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32; - var result = []; - - for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) { - result.push(self.decode(bytes, arrayStart + i, nestedName)); - } - - return result; - })(); - } else if (this.isDynamicType(name)) { - - return (function () { - var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes - var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64)); // in bytes - var roundedLength = Math.floor((length + 31) / 32); // in int - var param = new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0); - return self._outputFormatter(param, name); - })(); - } - - var length = this.staticPartLength(name); - var param = new SolidityParam(bytes.substr(offset * 2, length * 2)); - return this._outputFormatter(param, name); -}; - -module.exports = SolidityType; - -},{"./formatters":9,"./param":11}],15:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityType = require('./type'); - -/** - * SolidityTypeUInt is a prootype that represents uint type - * It matches: - * uint - * uint[] - * uint[4] - * uint[][] - * uint[3][] - * uint[][6][], ... - * uint32 - * uint64[] - * uint8[4] - * uint256[][] - * uint[3][] - * uint64[][6][], ... - */ -var SolidityTypeUInt = function () { - this._inputFormatter = f.formatInputInt; - this._outputFormatter = f.formatOutputUInt; -}; - -SolidityTypeUInt.prototype = new SolidityType({}); -SolidityTypeUInt.prototype.constructor = SolidityTypeUInt; - -SolidityTypeUInt.prototype.isType = function (name) { - return !!name.match(/^uint([0-9]*)?(\[([0-9]*)\])*$/); -}; - -module.exports = SolidityTypeUInt; - -},{"./formatters":9,"./type":14}],16:[function(require,module,exports){ -var f = require('./formatters'); -var SolidityType = require('./type'); - -/** - * SolidityTypeUReal is a prootype that represents ureal type - * It matches: - * ureal - * ureal[] - * ureal[4] - * ureal[][] - * ureal[3][] - * ureal[][6][], ... - * ureal32 - * ureal64[] - * ureal8[4] - * ureal256[][] - * ureal[3][] - * ureal64[][6][], ... - */ -var SolidityTypeUReal = function () { - this._inputFormatter = f.formatInputReal; - this._outputFormatter = f.formatOutputUReal; -}; - -SolidityTypeUReal.prototype = new SolidityType({}); -SolidityTypeUReal.prototype.constructor = SolidityTypeUReal; - -SolidityTypeUReal.prototype.isType = function (name) { - return !!name.match(/^ureal([0-9]*)?(\[([0-9]*)\])*$/); -}; - -module.exports = SolidityTypeUReal; - -},{"./formatters":9,"./type":14}],17:[function(require,module,exports){ -'use strict'; - -// go env doesn't have and need XMLHttpRequest -if (typeof XMLHttpRequest === 'undefined') { - exports.XMLHttpRequest = {}; -} else { - exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line -} - - -},{}],18:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file config.js - * @authors: - * Marek Kotewicz - * @date 2015 - */ - -/** - * Utils - * - * @module utils - */ - -/** - * Utility functions - * - * @class [utils] config - * @constructor - */ - - -/// required to define ETH_BIGNUMBER_ROUNDING_MODE -var BigNumber = require('bignumber.js'); - -var ETH_UNITS = [ - 'wei', - 'kwei', - 'Mwei', - 'Gwei', - 'szabo', - 'finney', - 'femtoether', - 'picoether', - 'nanoether', - 'microether', - 'milliether', - 'nano', - 'micro', - 'milli', - 'ether', - 'grand', - 'Mether', - 'Gether', - 'Tether', - 'Pether', - 'Eether', - 'Zether', - 'Yether', - 'Nether', - 'Dether', - 'Vether', - 'Uether' -]; - -module.exports = { - ETH_PADDING: 32, - ETH_SIGNATURE_LENGTH: 4, - ETH_UNITS: ETH_UNITS, - ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN }, - ETH_POLLING_TIMEOUT: 1000/2, - defaultBlock: 'latest', - defaultAccount: undefined -}; - - -},{"bignumber.js":"bignumber.js"}],19:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file sha3.js - * @author Marek Kotewicz - * @date 2015 - */ - -var CryptoJS = require('crypto-js'); -var sha3 = require('crypto-js/sha3'); - -module.exports = function (value, options) { - if (options && options.encoding === 'hex') { - if (value.length > 2 && value.substr(0, 2) === '0x') { - value = value.substr(2); - } - value = CryptoJS.enc.Hex.parse(value); - } - - return sha3(value, { - outputLength: 256 - }).toString(); -}; - - -},{"crypto-js":59,"crypto-js/sha3":80}],20:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file utils.js - * @author Marek Kotewicz - * @date 2015 - */ - -/** - * Utils - * - * @module utils - */ - -/** - * Utility functions - * - * @class [utils] utils - * @constructor - */ - - -var BigNumber = require('bignumber.js'); -var sha3 = require('./sha3.js'); -var utf8 = require('utf8'); - -var unitMap = { - 'noether': '0', - 'wei': '1', - 'kwei': '1000', - 'Kwei': '1000', - 'babbage': '1000', - 'femtoether': '1000', - 'mwei': '1000000', - 'Mwei': '1000000', - 'lovelace': '1000000', - 'picoether': '1000000', - 'gwei': '1000000000', - 'Gwei': '1000000000', - 'shannon': '1000000000', - 'nanoether': '1000000000', - 'nano': '1000000000', - 'szabo': '1000000000000', - 'microether': '1000000000000', - 'micro': '1000000000000', - 'finney': '1000000000000000', - 'milliether': '1000000000000000', - 'milli': '1000000000000000', - 'ether': '1000000000000000000', - 'kether': '1000000000000000000000', - 'grand': '1000000000000000000000', - 'mether': '1000000000000000000000000', - 'gether': '1000000000000000000000000000', - 'tether': '1000000000000000000000000000000' -}; - -/** - * Should be called to pad string to expected length - * - * @method padLeft - * @param {String} string to be padded - * @param {Number} characters that result string should have - * @param {String} sign, by default 0 - * @returns {String} right aligned string - */ -var padLeft = function (string, chars, sign) { - return new Array(chars - string.length + 1).join(sign ? sign : "0") + string; -}; - -/** - * Should be called to pad string to expected length - * - * @method padRight - * @param {String} string to be padded - * @param {Number} characters that result string should have - * @param {String} sign, by default 0 - * @returns {String} right aligned string - */ -var padRight = function (string, chars, sign) { - return string + (new Array(chars - string.length + 1).join(sign ? sign : "0")); -}; - -/** - * Should be called to get utf8 from it's hex representation - * - * @method toUtf8 - * @param {String} string in hex - * @returns {String} ascii string representation of hex value - */ -var toUtf8 = function(hex) { -// Find termination - var str = ""; - var i = 0, l = hex.length; - if (hex.substring(0, 2) === '0x') { - i = 2; - } - for (; i < l; i+=2) { - var code = parseInt(hex.substr(i, 2), 16); - if (code === 0) - break; - str += String.fromCharCode(code); - } - - return utf8.decode(str); -}; - -/** - * Should be called to get ascii from it's hex representation - * - * @method toAscii - * @param {String} string in hex - * @returns {String} ascii string representation of hex value - */ -var toAscii = function(hex) { -// Find termination - var str = ""; - var i = 0, l = hex.length; - if (hex.substring(0, 2) === '0x') { - i = 2; - } - for (; i < l; i+=2) { - var code = parseInt(hex.substr(i, 2), 16); - str += String.fromCharCode(code); - } - - return str; -}; - -/** - * Should be called to get hex representation (prefixed by 0x) of utf8 string - * - * @method fromUtf8 - * @param {String} string - * @param {Number} optional padding - * @returns {String} hex representation of input string - */ -var fromUtf8 = function(str) { - str = utf8.encode(str); - var hex = ""; - for(var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); - if (code === 0) - break; - var n = code.toString(16); - hex += n.length < 2 ? '0' + n : n; - } - - return "0x" + hex; -}; - -/** - * Should be called to get hex representation (prefixed by 0x) of ascii string - * - * @method fromAscii - * @param {String} string - * @param {Number} optional padding - * @returns {String} hex representation of input string - */ -var fromAscii = function(str) { - var hex = ""; - for(var i = 0; i < str.length; i++) { - var code = str.charCodeAt(i); - var n = code.toString(16); - hex += n.length < 2 ? '0' + n : n; - } - - return "0x" + hex; -}; - -/** - * Should be used to create full function/event name from json abi - * - * @method transformToFullName - * @param {Object} json-abi - * @return {String} full fnction/event name - */ -var transformToFullName = function (json) { - if (json.name.indexOf('(') !== -1) { - return json.name; - } - - var typeName = json.inputs.map(function(i){return i.type; }).join(); - return json.name + '(' + typeName + ')'; -}; - -/** - * Should be called to get display name of contract function - * - * @method extractDisplayName - * @param {String} name of function/event - * @returns {String} display name for function/event eg. multiply(uint256) -> multiply - */ -var extractDisplayName = function (name) { - var length = name.indexOf('('); - return length !== -1 ? name.substr(0, length) : name; -}; - -/// @returns overloaded part of function/event name -var extractTypeName = function (name) { - /// TODO: make it invulnerable - var length = name.indexOf('('); - return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : ""; -}; - -/** - * Converts value to it's decimal representation in string - * - * @method toDecimal - * @param {String|Number|BigNumber} - * @return {String} - */ -var toDecimal = function (value) { - return toBigNumber(value).toNumber(); -}; - -/** - * Converts value to it's hex representation - * - * @method fromDecimal - * @param {String|Number|BigNumber} - * @return {String} - */ -var fromDecimal = function (value) { - var number = toBigNumber(value); - var result = number.toString(16); - - return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result; -}; - -/** - * Auto converts any given value into it's hex representation. - * - * And even stringifys objects before. - * - * @method toHex - * @param {String|Number|BigNumber|Object} - * @return {String} - */ -var toHex = function (val) { - /*jshint maxcomplexity: 8 */ - - if (isBoolean(val)) - return fromDecimal(+val); - - if (isBigNumber(val)) - return fromDecimal(val); - - if (typeof val === 'object') - return fromUtf8(JSON.stringify(val)); - - // if its a negative number, pass it through fromDecimal - if (isString(val)) { - if (val.indexOf('-0x') === 0) - return fromDecimal(val); - else if(val.indexOf('0x') === 0) - return val; - else if (!isFinite(val)) - return fromAscii(val); - } - - return fromDecimal(val); -}; - -/** - * Returns value of unit in Wei - * - * @method getValueOfUnit - * @param {String} unit the unit to convert to, default ether - * @returns {BigNumber} value of the unit (in Wei) - * @throws error if the unit is not correct:w - */ -var getValueOfUnit = function (unit) { - unit = unit ? unit.toLowerCase() : 'ether'; - var unitValue = unitMap[unit]; - if (unitValue === undefined) { - throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2)); - } - return new BigNumber(unitValue, 10); -}; - -/** - * Takes a number of wei and converts it to any other ether unit. - * - * Possible units are: - * SI Short SI Full Effigy Other - * - kwei femtoether babbage - * - mwei picoether lovelace - * - gwei nanoether shannon nano - * - -- microether szabo micro - * - -- milliether finney milli - * - ether -- -- - * - kether -- grand - * - mether - * - gether - * - tether - * - * @method fromWei - * @param {Number|String} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert to, default ether - * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number -*/ -var fromWei = function(number, unit) { - var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit)); - - return isBigNumber(number) ? returnValue : returnValue.toString(10); -}; - -/** - * Takes a number of a unit and converts it to wei. - * - * Possible units are: - * SI Short SI Full Effigy Other - * - kwei femtoether babbage - * - mwei picoether lovelace - * - gwei nanoether shannon nano - * - -- microether szabo micro - * - -- microether szabo micro - * - -- milliether finney milli - * - ether -- -- - * - kether -- grand - * - mether - * - gether - * - tether - * - * @method toWei - * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal - * @param {String} unit the unit to convert from, default ether - * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number -*/ -var toWei = function(number, unit) { - var returnValue = toBigNumber(number).times(getValueOfUnit(unit)); - - return isBigNumber(number) ? returnValue : returnValue.toString(10); -}; - -/** - * Takes an input and transforms it into a bignumber - * - * @method toBigNumber - * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber - * @return {BigNumber} BigNumber -*/ -var toBigNumber = function(number) { - /*jshint maxcomplexity:5 */ - number = number || 0; - if (isBigNumber(number)) - return number; - - if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) { - return new BigNumber(number.replace('0x',''), 16); - } - - return new BigNumber(number.toString(10), 10); -}; - -/** - * Takes and input transforms it into bignumber and if it is negative value, into two's complement - * - * @method toTwosComplement - * @param {Number|String|BigNumber} - * @return {BigNumber} - */ -var toTwosComplement = function (number) { - var bigNumber = toBigNumber(number).round(); - if (bigNumber.lessThan(0)) { - return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1); - } - return bigNumber; -}; - -/** - * Checks if the given string is strictly an address - * - * @method isStrictAddress - * @param {String} address the given HEX address - * @return {Boolean} -*/ -var isStrictAddress = function (address) { - return /^0x[0-9a-f]{40}$/i.test(address); -}; - -/** - * Checks if the given string is an address - * - * @method isAddress - * @param {String} address the given HEX address - * @return {Boolean} -*/ -var isAddress = function (address) { - if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { - // check if it has the basic requirements of an address - return false; - } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { - // If it's all small caps or all caps, return true - return true; - } else { - // Otherwise check each case - return isChecksumAddress(address); - } -}; - -/** - * Checks if the given string is a checksummed address - * - * @method isChecksumAddress - * @param {String} address the given HEX address - * @return {Boolean} -*/ -var isChecksumAddress = function (address) { - // Check each case - address = address.replace('0x',''); - var addressHash = sha3(address.toLowerCase()); - - for (var i = 0; i < 40; i++ ) { - // the nth letter should be uppercase if the nth digit of casemap is 1 - if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) { - return false; - } - } - return true; -}; - - - -/** - * Makes a checksum address - * - * @method toChecksumAddress - * @param {String} address the given HEX address - * @return {String} -*/ -var toChecksumAddress = function (address) { - if (typeof address === 'undefined') return ''; - - address = address.toLowerCase().replace('0x',''); - var addressHash = sha3(address); - var checksumAddress = '0x'; - - for (var i = 0; i < address.length; i++ ) { - // If ith character is 9 to f then make it uppercase - if (parseInt(addressHash[i], 16) > 7) { - checksumAddress += address[i].toUpperCase(); - } else { - checksumAddress += address[i]; - } - } - return checksumAddress; -}; - -/** - * Transforms given string to valid 20 bytes-length addres with 0x prefix - * - * @method toAddress - * @param {String} address - * @return {String} formatted address - */ -var toAddress = function (address) { - if (isStrictAddress(address)) { - return address; - } - - if (/^[0-9a-f]{40}$/.test(address)) { - return '0x' + address; - } - - return '0x' + padLeft(toHex(address).substr(2), 40); -}; - -/** - * Returns true if object is BigNumber, otherwise false - * - * @method isBigNumber - * @param {Object} - * @return {Boolean} - */ -var isBigNumber = function (object) { - return object instanceof BigNumber || - (object && object.constructor && object.constructor.name === 'BigNumber'); -}; - -/** - * Returns true if object is string, otherwise false - * - * @method isString - * @param {Object} - * @return {Boolean} - */ -var isString = function (object) { - return typeof object === 'string' || - (object && object.constructor && object.constructor.name === 'String'); -}; - -/** - * Returns true if object is function, otherwise false - * - * @method isFunction - * @param {Object} - * @return {Boolean} - */ -var isFunction = function (object) { - return typeof object === 'function'; -}; - -/** - * Returns true if object is Objet, otherwise false - * - * @method isObject - * @param {Object} - * @return {Boolean} - */ -var isObject = function (object) { - return object !== null && !(object instanceof Array) && typeof object === 'object'; -}; - -/** - * Returns true if object is boolean, otherwise false - * - * @method isBoolean - * @param {Object} - * @return {Boolean} - */ -var isBoolean = function (object) { - return typeof object === 'boolean'; -}; - -/** - * Returns true if object is array, otherwise false - * - * @method isArray - * @param {Object} - * @return {Boolean} - */ -var isArray = function (object) { - return object instanceof Array; -}; - -/** - * Returns true if given string is valid json object - * - * @method isJson - * @param {String} - * @return {Boolean} - */ -var isJson = function (str) { - try { - return !!JSON.parse(str); - } catch (e) { - return false; - } -}; - -/** - * Returns true if given string is a valid Ethereum block header bloom. - * - * @method isBloom - * @param {String} hex encoded bloom filter - * @return {Boolean} - */ -var isBloom = function (bloom) { - if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) { - return false; - } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) { - return true; - } - return false; -}; - -/** - * Returns true if given string is a valid log topic. - * - * @method isTopic - * @param {String} hex encoded topic - * @return {Boolean} - */ -var isTopic = function (topic) { - if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) { - return false; - } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) { - return true; - } - return false; -}; - -module.exports = { - padLeft: padLeft, - padRight: padRight, - toHex: toHex, - toDecimal: toDecimal, - fromDecimal: fromDecimal, - toUtf8: toUtf8, - toAscii: toAscii, - fromUtf8: fromUtf8, - fromAscii: fromAscii, - transformToFullName: transformToFullName, - extractDisplayName: extractDisplayName, - extractTypeName: extractTypeName, - toWei: toWei, - fromWei: fromWei, - toBigNumber: toBigNumber, - toTwosComplement: toTwosComplement, - toAddress: toAddress, - isBigNumber: isBigNumber, - isStrictAddress: isStrictAddress, - isAddress: isAddress, - isChecksumAddress: isChecksumAddress, - toChecksumAddress: toChecksumAddress, - isFunction: isFunction, - isString: isString, - isObject: isObject, - isBoolean: isBoolean, - isArray: isArray, - isJson: isJson, - isBloom: isBloom, - isTopic: isTopic, -}; - -},{"./sha3.js":19,"bignumber.js":"bignumber.js","utf8":85}],21:[function(require,module,exports){ -module.exports={ - "version": "0.20.1" -} - -},{}],22:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file web3.js - * @authors: - * Jeffrey Wilcke - * Marek Kotewicz - * Marian Oancea - * Fabian Vogelsteller - * Gav Wood - * @date 2014 - */ - -var RequestManager = require('./web3/requestmanager'); -var Iban = require('./web3/iban'); -var Eth = require('./web3/methods/eth'); -var DB = require('./web3/methods/db'); -var Shh = require('./web3/methods/shh'); -var Net = require('./web3/methods/net'); -var Personal = require('./web3/methods/personal'); -var Swarm = require('./web3/methods/swarm'); -var Settings = require('./web3/settings'); -var version = require('./version.json'); -var utils = require('./utils/utils'); -var sha3 = require('./utils/sha3'); -var extend = require('./web3/extend'); -var Batch = require('./web3/batch'); -var Property = require('./web3/property'); -var HttpProvider = require('./web3/httpprovider'); -var IpcProvider = require('./web3/ipcprovider'); -var BigNumber = require('bignumber.js'); - - - -function Web3 (provider) { - this._requestManager = new RequestManager(provider); - this.currentProvider = provider; - this.eth = new Eth(this); - this.db = new DB(this); - this.shh = new Shh(this); - this.net = new Net(this); - this.personal = new Personal(this); - this.bzz = new Swarm(this); - this.settings = new Settings(); - this.version = { - api: version.version - }; - this.providers = { - HttpProvider: HttpProvider, - IpcProvider: IpcProvider - }; - this._extend = extend(this); - this._extend({ - properties: properties() - }); -} - -// expose providers on the class -Web3.providers = { - HttpProvider: HttpProvider, - IpcProvider: IpcProvider -}; - -Web3.prototype.setProvider = function (provider) { - this._requestManager.setProvider(provider); - this.currentProvider = provider; -}; - -Web3.prototype.reset = function (keepIsSyncing) { - this._requestManager.reset(keepIsSyncing); - this.settings = new Settings(); -}; - -Web3.prototype.BigNumber = BigNumber; -Web3.prototype.toHex = utils.toHex; -Web3.prototype.toAscii = utils.toAscii; -Web3.prototype.toUtf8 = utils.toUtf8; -Web3.prototype.fromAscii = utils.fromAscii; -Web3.prototype.fromUtf8 = utils.fromUtf8; -Web3.prototype.toDecimal = utils.toDecimal; -Web3.prototype.fromDecimal = utils.fromDecimal; -Web3.prototype.toBigNumber = utils.toBigNumber; -Web3.prototype.toWei = utils.toWei; -Web3.prototype.fromWei = utils.fromWei; -Web3.prototype.isAddress = utils.isAddress; -Web3.prototype.isChecksumAddress = utils.isChecksumAddress; -Web3.prototype.toChecksumAddress = utils.toChecksumAddress; -Web3.prototype.isIBAN = utils.isIBAN; -Web3.prototype.padLeft = utils.padLeft; -Web3.prototype.padRight = utils.padRight; - - -Web3.prototype.sha3 = function(string, options) { - return '0x' + sha3(string, options); -}; - -/** - * Transforms direct icap to address - */ -Web3.prototype.fromICAP = function (icap) { - var iban = new Iban(icap); - return iban.address(); -}; - -var properties = function () { - return [ - new Property({ - name: 'version.node', - getter: 'web3_clientVersion' - }), - new Property({ - name: 'version.network', - getter: 'net_version', - inputFormatter: utils.toDecimal - }), - new Property({ - name: 'version.ethereum', - getter: 'eth_protocolVersion', - inputFormatter: utils.toDecimal - }), - new Property({ - name: 'version.whisper', - getter: 'shh_version', - inputFormatter: utils.toDecimal - }) - ]; -}; - -Web3.prototype.isConnected = function(){ - return (this.currentProvider && this.currentProvider.isConnected()); -}; - -Web3.prototype.createBatch = function () { - return new Batch(this); -}; - -module.exports = Web3; - - -},{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/eth":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/methods/swarm":42,"./web3/property":45,"./web3/requestmanager":46,"./web3/settings":47,"bignumber.js":"bignumber.js"}],23:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file allevents.js - * @author Marek Kotewicz - * @date 2014 - */ - -var sha3 = require('../utils/sha3'); -var SolidityEvent = require('./event'); -var formatters = require('./formatters'); -var utils = require('../utils/utils'); -var Filter = require('./filter'); -var watches = require('./methods/watches'); - -var AllSolidityEvents = function (requestManager, json, address) { - this._requestManager = requestManager; - this._json = json; - this._address = address; -}; - -AllSolidityEvents.prototype.encode = function (options) { - options = options || {}; - var result = {}; - - ['fromBlock', 'toBlock'].filter(function (f) { - return options[f] !== undefined; - }).forEach(function (f) { - result[f] = formatters.inputBlockNumberFormatter(options[f]); - }); - - result.address = this._address; - - return result; -}; - -AllSolidityEvents.prototype.decode = function (data) { - data.data = data.data || ''; - data.topics = data.topics || []; - - var eventTopic = data.topics[0].slice(2); - var match = this._json.filter(function (j) { - return eventTopic === sha3(utils.transformToFullName(j)); - })[0]; - - if (!match) { // cannot find matching event? - console.warn('cannot find event for log'); - return data; - } - - var event = new SolidityEvent(this._requestManager, match, this._address); - return event.decode(data); -}; - -AllSolidityEvents.prototype.execute = function (options, callback) { - - if (utils.isFunction(arguments[arguments.length - 1])) { - callback = arguments[arguments.length - 1]; - if(arguments.length === 1) - options = null; - } - - var o = this.encode(options); - var formatter = this.decode.bind(this); - return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback); -}; - -AllSolidityEvents.prototype.attachToContract = function (contract) { - var execute = this.execute.bind(this); - contract.allEvents = execute; -}; - -module.exports = AllSolidityEvents; - - -},{"../utils/sha3":19,"../utils/utils":20,"./event":27,"./filter":29,"./formatters":30,"./methods/watches":43}],24:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file batch.js - * @author Marek Kotewicz - * @date 2015 - */ - -var Jsonrpc = require('./jsonrpc'); -var errors = require('./errors'); - -var Batch = function (web3) { - this.requestManager = web3._requestManager; - this.requests = []; -}; - -/** - * Should be called to add create new request to batch request - * - * @method add - * @param {Object} jsonrpc requet object - */ -Batch.prototype.add = function (request) { - this.requests.push(request); -}; - -/** - * Should be called to execute batch request - * - * @method execute - */ -Batch.prototype.execute = function () { - var requests = this.requests; - this.requestManager.sendBatch(requests, function (err, results) { - results = results || []; - requests.map(function (request, index) { - return results[index] || {}; - }).forEach(function (result, index) { - if (requests[index].callback) { - - if (!Jsonrpc.isValidResponse(result)) { - return requests[index].callback(errors.InvalidResponse(result)); - } - - requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result)); - } - }); - }); -}; - -module.exports = Batch; - - -},{"./errors":26,"./jsonrpc":35}],25:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file contract.js - * @author Marek Kotewicz - * @date 2014 - */ - -var utils = require('../utils/utils'); -var coder = require('../solidity/coder'); -var SolidityEvent = require('./event'); -var SolidityFunction = require('./function'); -var AllEvents = require('./allevents'); - -/** - * Should be called to encode constructor params - * - * @method encodeConstructorParams - * @param {Array} abi - * @param {Array} constructor params - */ -var encodeConstructorParams = function (abi, params) { - return abi.filter(function (json) { - return json.type === 'constructor' && json.inputs.length === params.length; - }).map(function (json) { - return json.inputs.map(function (input) { - return input.type; - }); - }).map(function (types) { - return coder.encodeParams(types, params); - })[0] || ''; -}; - -/** - * Should be called to add functions to contract object - * - * @method addFunctionsToContract - * @param {Contract} contract - * @param {Array} abi - */ -var addFunctionsToContract = function (contract) { - contract.abi.filter(function (json) { - return json.type === 'function'; - }).map(function (json) { - return new SolidityFunction(contract._eth, json, contract.address); - }).forEach(function (f) { - f.attachToContract(contract); - }); -}; - -/** - * Should be called to add events to contract object - * - * @method addEventsToContract - * @param {Contract} contract - * @param {Array} abi - */ -var addEventsToContract = function (contract) { - var events = contract.abi.filter(function (json) { - return json.type === 'event'; - }); - - var All = new AllEvents(contract._eth._requestManager, events, contract.address); - All.attachToContract(contract); - - events.map(function (json) { - return new SolidityEvent(contract._eth._requestManager, json, contract.address); - }).forEach(function (e) { - e.attachToContract(contract); - }); -}; - - -/** - * Should be called to check if the contract gets properly deployed on the blockchain. - * - * @method checkForContractAddress - * @param {Object} contract - * @param {Function} callback - * @returns {Undefined} - */ -var checkForContractAddress = function(contract, callback){ - var count = 0, - callbackFired = false; - - // wait for receipt - var filter = contract._eth.filter('latest', function(e){ - if (!e && !callbackFired) { - count++; - - // stop watching after 50 blocks (timeout) - if (count > 50) { - - filter.stopWatching(function() {}); - callbackFired = true; - - if (callback) - callback(new Error('Contract transaction couldn\'t be found after 50 blocks')); - else - throw new Error('Contract transaction couldn\'t be found after 50 blocks'); - - - } else { - - contract._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){ - if(receipt && !callbackFired) { - - contract._eth.getCode(receipt.contractAddress, function(e, code){ - /*jshint maxcomplexity: 6 */ - - if(callbackFired || !code) - return; - - filter.stopWatching(function() {}); - callbackFired = true; - - if(code.length > 3) { - - // console.log('Contract code deployed!'); - - contract.address = receipt.contractAddress; - - // attach events and methods again after we have - addFunctionsToContract(contract); - addEventsToContract(contract); - - // call callback for the second time - if(callback) - callback(null, contract); - - } else { - if(callback) - callback(new Error('The contract code couldn\'t be stored, please check your gas amount.')); - else - throw new Error('The contract code couldn\'t be stored, please check your gas amount.'); - } - }); - } - }); - } - } - }); -}; - -/** - * Should be called to create new ContractFactory instance - * - * @method ContractFactory - * @param {Array} abi - */ -var ContractFactory = function (eth, abi) { - this.eth = eth; - this.abi = abi; - - /** - * Should be called to create new contract on a blockchain - * - * @method new - * @param {Any} contract constructor param1 (optional) - * @param {Any} contract constructor param2 (optional) - * @param {Object} contract transaction object (required) - * @param {Function} callback - * @returns {Contract} returns contract instance - */ - this.new = function () { - /*jshint maxcomplexity: 7 */ - - var contract = new Contract(this.eth, this.abi); - - // parse arguments - var options = {}; // required! - var callback; - - var args = Array.prototype.slice.call(arguments); - if (utils.isFunction(args[args.length - 1])) { - callback = args.pop(); - } - - var last = args[args.length - 1]; - if (utils.isObject(last) && !utils.isArray(last)) { - options = args.pop(); - } - - if (options.value > 0) { - var constructorAbi = abi.filter(function (json) { - return json.type === 'constructor' && json.inputs.length === args.length; - })[0] || {}; - - if (!constructorAbi.payable) { - throw new Error('Cannot send value to non-payable constructor'); - } - } - - var bytes = encodeConstructorParams(this.abi, args); - options.data += bytes; - - if (callback) { - - // wait for the contract address and check if the code was deployed - this.eth.sendTransaction(options, function (err, hash) { - if (err) { - callback(err); - } else { - // add the transaction hash - contract.transactionHash = hash; - - // call callback for the first time - callback(null, contract); - - checkForContractAddress(contract, callback); - } - }); - } else { - var hash = this.eth.sendTransaction(options); - // add the transaction hash - contract.transactionHash = hash; - checkForContractAddress(contract); - } - - return contract; - }; - - this.new.getData = this.getData.bind(this); -}; - -/** - * Should be called to create new ContractFactory - * - * @method contract - * @param {Array} abi - * @returns {ContractFactory} new contract factory - */ -//var contract = function (abi) { - //return new ContractFactory(abi); -//}; - - - -/** - * Should be called to get access to existing contract on a blockchain - * - * @method at - * @param {Address} contract address (required) - * @param {Function} callback {optional) - * @returns {Contract} returns contract if no callback was passed, - * otherwise calls callback function (err, contract) - */ -ContractFactory.prototype.at = function (address, callback) { - var contract = new Contract(this.eth, this.abi, address); - - // this functions are not part of prototype, - // because we don't want to spoil the interface - addFunctionsToContract(contract); - addEventsToContract(contract); - - if (callback) { - callback(null, contract); - } - return contract; -}; - -/** - * Gets the data, which is data to deploy plus constructor params - * - * @method getData - */ -ContractFactory.prototype.getData = function () { - var options = {}; // required! - var args = Array.prototype.slice.call(arguments); - - var last = args[args.length - 1]; - if (utils.isObject(last) && !utils.isArray(last)) { - options = args.pop(); - } - - var bytes = encodeConstructorParams(this.abi, args); - options.data += bytes; - - return options.data; -}; - -/** - * Should be called to create new contract instance - * - * @method Contract - * @param {Array} abi - * @param {Address} contract address - */ -var Contract = function (eth, abi, address) { - this._eth = eth; - this.transactionHash = null; - this.address = address; - this.abi = abi; -}; - -module.exports = ContractFactory; - -},{"../solidity/coder":7,"../utils/utils":20,"./allevents":23,"./event":27,"./function":31}],26:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file errors.js - * @author Marek Kotewicz - * @date 2015 - */ - -module.exports = { - InvalidNumberOfSolidityArgs: function () { - return new Error('Invalid number of arguments to Solidity function'); - }, - InvalidNumberOfRPCParams: function () { - return new Error('Invalid number of input parameters to RPC method'); - }, - InvalidConnection: function (host){ - return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.'); - }, - InvalidProvider: function () { - return new Error('Provider not set or invalid'); - }, - InvalidResponse: function (result){ - var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result); - return new Error(message); - }, - ConnectionTimeout: function (ms){ - return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived'); - } -}; - -},{}],27:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file event.js - * @author Marek Kotewicz - * @date 2014 - */ - -var utils = require('../utils/utils'); -var coder = require('../solidity/coder'); -var formatters = require('./formatters'); -var sha3 = require('../utils/sha3'); -var Filter = require('./filter'); -var watches = require('./methods/watches'); - -/** - * This prototype should be used to create event filters - */ -var SolidityEvent = function (requestManager, json, address) { - this._requestManager = requestManager; - this._params = json.inputs; - this._name = utils.transformToFullName(json); - this._address = address; - this._anonymous = json.anonymous; -}; - -/** - * Should be used to get filtered param types - * - * @method types - * @param {Bool} decide if returned typed should be indexed - * @return {Array} array of types - */ -SolidityEvent.prototype.types = function (indexed) { - return this._params.filter(function (i) { - return i.indexed === indexed; - }).map(function (i) { - return i.type; - }); -}; - -/** - * Should be used to get event display name - * - * @method displayName - * @return {String} event display name - */ -SolidityEvent.prototype.displayName = function () { - return utils.extractDisplayName(this._name); -}; - -/** - * Should be used to get event type name - * - * @method typeName - * @return {String} event type name - */ -SolidityEvent.prototype.typeName = function () { - return utils.extractTypeName(this._name); -}; - -/** - * Should be used to get event signature - * - * @method signature - * @return {String} event signature - */ -SolidityEvent.prototype.signature = function () { - return sha3(this._name); -}; - -/** - * Should be used to encode indexed params and options to one final object - * - * @method encode - * @param {Object} indexed - * @param {Object} options - * @return {Object} everything combined together and encoded - */ -SolidityEvent.prototype.encode = function (indexed, options) { - indexed = indexed || {}; - options = options || {}; - var result = {}; - - ['fromBlock', 'toBlock'].filter(function (f) { - return options[f] !== undefined; - }).forEach(function (f) { - result[f] = formatters.inputBlockNumberFormatter(options[f]); - }); - - result.topics = []; - - result.address = this._address; - if (!this._anonymous) { - result.topics.push('0x' + this.signature()); - } - - var indexedTopics = this._params.filter(function (i) { - return i.indexed === true; - }).map(function (i) { - var value = indexed[i.name]; - if (value === undefined || value === null) { - return null; - } - - if (utils.isArray(value)) { - return value.map(function (v) { - return '0x' + coder.encodeParam(i.type, v); - }); - } - return '0x' + coder.encodeParam(i.type, value); - }); - - result.topics = result.topics.concat(indexedTopics); - - return result; -}; - -/** - * Should be used to decode indexed params and options - * - * @method decode - * @param {Object} data - * @return {Object} result object with decoded indexed && not indexed params - */ -SolidityEvent.prototype.decode = function (data) { - - data.data = data.data || ''; - data.topics = data.topics || []; - - var argTopics = this._anonymous ? data.topics : data.topics.slice(1); - var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join(""); - var indexedParams = coder.decodeParams(this.types(true), indexedData); - - var notIndexedData = data.data.slice(2); - var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData); - - var result = formatters.outputLogFormatter(data); - result.event = this.displayName(); - result.address = data.address; - - result.args = this._params.reduce(function (acc, current) { - acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift(); - return acc; - }, {}); - - delete result.data; - delete result.topics; - - return result; -}; - -/** - * Should be used to create new filter object from event - * - * @method execute - * @param {Object} indexed - * @param {Object} options - * @return {Object} filter object - */ -SolidityEvent.prototype.execute = function (indexed, options, callback) { - - if (utils.isFunction(arguments[arguments.length - 1])) { - callback = arguments[arguments.length - 1]; - if(arguments.length === 2) - options = null; - if(arguments.length === 1) { - options = null; - indexed = {}; - } - } - - var o = this.encode(indexed, options); - var formatter = this.decode.bind(this); - return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback); -}; - -/** - * Should be used to attach event to contract object - * - * @method attachToContract - * @param {Contract} - */ -SolidityEvent.prototype.attachToContract = function (contract) { - var execute = this.execute.bind(this); - var displayName = this.displayName(); - if (!contract[displayName]) { - contract[displayName] = execute; - } - contract[displayName][this.typeName()] = this.execute.bind(this, contract); -}; - -module.exports = SolidityEvent; - - -},{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./filter":29,"./formatters":30,"./methods/watches":43}],28:[function(require,module,exports){ -var formatters = require('./formatters'); -var utils = require('./../utils/utils'); -var Method = require('./method'); -var Property = require('./property'); - -// TODO: refactor, so the input params are not altered. -// it's necessary to make same 'extension' work with multiple providers -var extend = function (web3) { - /* jshint maxcomplexity:5 */ - var ex = function (extension) { - - var extendedObject; - if (extension.property) { - if (!web3[extension.property]) { - web3[extension.property] = {}; - } - extendedObject = web3[extension.property]; - } else { - extendedObject = web3; - } - - if (extension.methods) { - extension.methods.forEach(function (method) { - method.attachToObject(extendedObject); - method.setRequestManager(web3._requestManager); - }); - } - - if (extension.properties) { - extension.properties.forEach(function (property) { - property.attachToObject(extendedObject); - property.setRequestManager(web3._requestManager); - }); - } - }; - - ex.formatters = formatters; - ex.utils = utils; - ex.Method = Method; - ex.Property = Property; - - return ex; -}; - - - -module.exports = extend; - - -},{"./../utils/utils":20,"./formatters":30,"./method":36,"./property":45}],29:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file filter.js - * @authors: - * Jeffrey Wilcke - * Marek Kotewicz - * Marian Oancea - * Fabian Vogelsteller - * Gav Wood - * @date 2014 - */ - -var formatters = require('./formatters'); -var utils = require('../utils/utils'); - -/** -* Converts a given topic to a hex string, but also allows null values. -* -* @param {Mixed} value -* @return {String} -*/ -var toTopic = function(value){ - - if(value === null || typeof value === 'undefined') - return null; - - value = String(value); - - if(value.indexOf('0x') === 0) - return value; - else - return utils.fromUtf8(value); -}; - -/// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones -/// @param should be string or object -/// @returns options string or object -var getOptions = function (options, type) { - /*jshint maxcomplexity: 6 */ - - if (utils.isString(options)) { - return options; - } - - options = options || {}; - - - switch(type) { - case 'eth': - - // make sure topics, get converted to hex - options.topics = options.topics || []; - options.topics = options.topics.map(function(topic){ - return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic); - }); - - return { - topics: options.topics, - from: options.from, - to: options.to, - address: options.address, - fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock), - toBlock: formatters.inputBlockNumberFormatter(options.toBlock) - }; - case 'shh': - return options; - } -}; - -/** -Adds the callback and sets up the methods, to iterate over the results. - -@method getLogsAtStart -@param {Object} self -@param {function} callback -*/ -var getLogsAtStart = function(self, callback){ - // call getFilterLogs for the first watch callback start - if (!utils.isString(self.options)) { - self.get(function (err, messages) { - // don't send all the responses to all the watches again... just to self one - if (err) { - callback(err); - } - - if(utils.isArray(messages)) { - messages.forEach(function (message) { - callback(null, message); - }); - } - }); - } -}; - -/** -Adds the callback and sets up the methods, to iterate over the results. - -@method pollFilter -@param {Object} self -*/ -var pollFilter = function(self) { - - var onMessage = function (error, messages) { - if (error) { - return self.callbacks.forEach(function (callback) { - callback(error); - }); - } - - if(utils.isArray(messages)) { - messages.forEach(function (message) { - message = self.formatter ? self.formatter(message) : message; - self.callbacks.forEach(function (callback) { - callback(null, message); - }); - }); - } - }; - - self.requestManager.startPolling({ - method: self.implementation.poll.call, - params: [self.filterId], - }, self.filterId, onMessage, self.stopWatching.bind(self)); - -}; - -var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) { - var self = this; - var implementation = {}; - methods.forEach(function (method) { - method.setRequestManager(requestManager); - method.attachToObject(implementation); - }); - this.requestManager = requestManager; - this.options = getOptions(options, type); - this.implementation = implementation; - this.filterId = null; - this.callbacks = []; - this.getLogsCallbacks = []; - this.pollFilters = []; - this.formatter = formatter; - this.implementation.newFilter(this.options, function(error, id){ - if(error) { - self.callbacks.forEach(function(cb){ - cb(error); - }); - if (typeof filterCreationErrorCallback === 'function') { - filterCreationErrorCallback(error); - } - } else { - self.filterId = id; - - // check if there are get pending callbacks as a consequence - // of calling get() with filterId unassigned. - self.getLogsCallbacks.forEach(function (cb){ - self.get(cb); - }); - self.getLogsCallbacks = []; - - // get filter logs for the already existing watch calls - self.callbacks.forEach(function(cb){ - getLogsAtStart(self, cb); - }); - if(self.callbacks.length > 0) - pollFilter(self); - - // start to watch immediately - if(typeof callback === 'function') { - return self.watch(callback); - } - } - }); - - return this; -}; - -Filter.prototype.watch = function (callback) { - this.callbacks.push(callback); - - if(this.filterId) { - getLogsAtStart(this, callback); - pollFilter(this); - } - - return this; -}; - -Filter.prototype.stopWatching = function (callback) { - this.requestManager.stopPolling(this.filterId); - this.callbacks = []; - // remove filter async - if (callback) { - this.implementation.uninstallFilter(this.filterId, callback); - } else { - return this.implementation.uninstallFilter(this.filterId); - } -}; - -Filter.prototype.get = function (callback) { - var self = this; - if (utils.isFunction(callback)) { - if (this.filterId === null) { - // If filterId is not set yet, call it back - // when newFilter() assigns it. - this.getLogsCallbacks.push(callback); - } else { - this.implementation.getLogs(this.filterId, function(err, res){ - if (err) { - callback(err); - } else { - callback(null, res.map(function (log) { - return self.formatter ? self.formatter(log) : log; - })); - } - }); - } - } else { - if (this.filterId === null) { - throw new Error('Filter ID Error: filter().get() can\'t be chained synchronous, please provide a callback for the get() method.'); - } - var logs = this.implementation.getLogs(this.filterId); - return logs.map(function (log) { - return self.formatter ? self.formatter(log) : log; - }); - } - - return this; -}; - -module.exports = Filter; - - -},{"../utils/utils":20,"./formatters":30}],30:[function(require,module,exports){ -'use strict' - -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file formatters.js - * @author Marek Kotewicz - * @author Fabian Vogelsteller - * @date 2015 - */ - -var utils = require('../utils/utils'); -var config = require('../utils/config'); -var Iban = require('./iban'); - -/** - * Should the format output to a big number - * - * @method outputBigNumberFormatter - * @param {String|Number|BigNumber} - * @returns {BigNumber} object - */ -var outputBigNumberFormatter = function (number) { - return utils.toBigNumber(number); -}; - -var isPredefinedBlockNumber = function (blockNumber) { - return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest'; -}; - -var inputDefaultBlockNumberFormatter = function (blockNumber) { - if (blockNumber === undefined) { - return config.defaultBlock; - } - return inputBlockNumberFormatter(blockNumber); -}; - -var inputBlockNumberFormatter = function (blockNumber) { - if (blockNumber === undefined) { - return undefined; - } else if (isPredefinedBlockNumber(blockNumber)) { - return blockNumber; - } - return utils.toHex(blockNumber); -}; - -/** - * Formats the input of a transaction and converts all values to HEX - * - * @method inputCallFormatter - * @param {Object} transaction options - * @returns object -*/ -var inputCallFormatter = function (options){ - - options.from = options.from || config.defaultAccount; - - if (options.from) { - options.from = inputAddressFormatter(options.from); - } - - if (options.to) { // it might be contract creation - options.to = inputAddressFormatter(options.to); - } - - ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { - return options[key] !== undefined; - }).forEach(function(key){ - options[key] = utils.fromDecimal(options[key]); - }); - - return options; -}; - -/** - * Formats the input of a transaction and converts all values to HEX - * - * @method inputTransactionFormatter - * @param {Object} transaction options - * @returns object -*/ -var inputTransactionFormatter = function (options){ - - options.from = options.from || config.defaultAccount; - options.from = inputAddressFormatter(options.from); - - if (options.to) { // it might be contract creation - options.to = inputAddressFormatter(options.to); - } - - ['gasPrice', 'gas', 'value', 'nonce'].filter(function (key) { - return options[key] !== undefined; - }).forEach(function(key){ - options[key] = utils.fromDecimal(options[key]); - }); - - return options; -}; - -/** - * Formats the output of a transaction to its proper values - * - * @method outputTransactionFormatter - * @param {Object} tx - * @returns {Object} -*/ -var outputTransactionFormatter = function (tx){ - if(tx.blockNumber !== null) - tx.blockNumber = utils.toDecimal(tx.blockNumber); - if(tx.transactionIndex !== null) - tx.transactionIndex = utils.toDecimal(tx.transactionIndex); - tx.nonce = utils.toDecimal(tx.nonce); - tx.gas = utils.toDecimal(tx.gas); - tx.gasPrice = utils.toBigNumber(tx.gasPrice); - tx.value = utils.toBigNumber(tx.value); - return tx; -}; - -/** - * Formats the output of a transaction receipt to its proper values - * - * @method outputTransactionReceiptFormatter - * @param {Object} receipt - * @returns {Object} -*/ -var outputTransactionReceiptFormatter = function (receipt){ - if(receipt.blockNumber !== null) - receipt.blockNumber = utils.toDecimal(receipt.blockNumber); - if(receipt.transactionIndex !== null) - receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex); - receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed); - receipt.gasUsed = utils.toDecimal(receipt.gasUsed); - - if(utils.isArray(receipt.logs)) { - receipt.logs = receipt.logs.map(function(log){ - return outputLogFormatter(log); - }); - } - - return receipt; -}; - -/** - * Formats the output of a block to its proper values - * - * @method outputBlockFormatter - * @param {Object} block - * @returns {Object} -*/ -var outputBlockFormatter = function(block) { - - // transform to number - block.gasLimit = utils.toDecimal(block.gasLimit); - block.gasUsed = utils.toDecimal(block.gasUsed); - block.size = utils.toDecimal(block.size); - block.timestamp = utils.toDecimal(block.timestamp); - if(block.number !== null) - block.number = utils.toDecimal(block.number); - - block.difficulty = utils.toBigNumber(block.difficulty); - block.totalDifficulty = utils.toBigNumber(block.totalDifficulty); - - if (utils.isArray(block.transactions)) { - block.transactions.forEach(function(item){ - if(!utils.isString(item)) - return outputTransactionFormatter(item); - }); - } - - return block; -}; - -/** - * Formats the output of a log - * - * @method outputLogFormatter - * @param {Object} log object - * @returns {Object} log -*/ -var outputLogFormatter = function(log) { - if(log.blockNumber) - log.blockNumber = utils.toDecimal(log.blockNumber); - if(log.transactionIndex) - log.transactionIndex = utils.toDecimal(log.transactionIndex); - if(log.logIndex) - log.logIndex = utils.toDecimal(log.logIndex); - - return log; -}; - -/** - * Formats the input of a whisper post and converts all values to HEX - * - * @method inputPostFormatter - * @param {Object} transaction object - * @returns {Object} -*/ -var inputPostFormatter = function(post) { - - // post.payload = utils.toHex(post.payload); - post.ttl = utils.fromDecimal(post.ttl); - post.workToProve = utils.fromDecimal(post.workToProve); - post.priority = utils.fromDecimal(post.priority); - - // fallback - if (!utils.isArray(post.topics)) { - post.topics = post.topics ? [post.topics] : []; - } - - // format the following options - post.topics = post.topics.map(function(topic){ - // convert only if not hex - return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic); - }); - - return post; -}; - -/** - * Formats the output of a received post message - * - * @method outputPostFormatter - * @param {Object} - * @returns {Object} - */ -var outputPostFormatter = function(post){ - - post.expiry = utils.toDecimal(post.expiry); - post.sent = utils.toDecimal(post.sent); - post.ttl = utils.toDecimal(post.ttl); - post.workProved = utils.toDecimal(post.workProved); - // post.payloadRaw = post.payload; - // post.payload = utils.toAscii(post.payload); - - // if (utils.isJson(post.payload)) { - // post.payload = JSON.parse(post.payload); - // } - - // format the following options - if (!post.topics) { - post.topics = []; - } - post.topics = post.topics.map(function(topic){ - return utils.toAscii(topic); - }); - - return post; -}; - -var inputAddressFormatter = function (address) { - var iban = new Iban(address); - if (iban.isValid() && iban.isDirect()) { - return '0x' + iban.address(); - } else if (utils.isStrictAddress(address)) { - return address; - } else if (utils.isAddress(address)) { - return '0x' + address; - } - throw new Error('invalid address'); -}; - - -var outputSyncingFormatter = function(result) { - if (!result) { - return result; - } - - result.startingBlock = utils.toDecimal(result.startingBlock); - result.currentBlock = utils.toDecimal(result.currentBlock); - result.highestBlock = utils.toDecimal(result.highestBlock); - if (result.knownStates) { - result.knownStates = utils.toDecimal(result.knownStates); - result.pulledStates = utils.toDecimal(result.pulledStates); - } - - return result; -}; - -module.exports = { - inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter, - inputBlockNumberFormatter: inputBlockNumberFormatter, - inputCallFormatter: inputCallFormatter, - inputTransactionFormatter: inputTransactionFormatter, - inputAddressFormatter: inputAddressFormatter, - inputPostFormatter: inputPostFormatter, - outputBigNumberFormatter: outputBigNumberFormatter, - outputTransactionFormatter: outputTransactionFormatter, - outputTransactionReceiptFormatter: outputTransactionReceiptFormatter, - outputBlockFormatter: outputBlockFormatter, - outputLogFormatter: outputLogFormatter, - outputPostFormatter: outputPostFormatter, - outputSyncingFormatter: outputSyncingFormatter -}; - - -},{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file function.js - * @author Marek Kotewicz - * @date 2015 - */ - -var coder = require('../solidity/coder'); -var utils = require('../utils/utils'); -var errors = require('./errors'); -var formatters = require('./formatters'); -var sha3 = require('../utils/sha3'); - -/** - * This prototype should be used to call/sendTransaction to solidity functions - */ -var SolidityFunction = function (eth, json, address) { - this._eth = eth; - this._inputTypes = json.inputs.map(function (i) { - return i.type; - }); - this._outputTypes = json.outputs.map(function (i) { - return i.type; - }); - this._constant = json.constant; - this._payable = json.payable; - this._name = utils.transformToFullName(json); - this._address = address; -}; - -SolidityFunction.prototype.extractCallback = function (args) { - if (utils.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } -}; - -SolidityFunction.prototype.extractDefaultBlock = function (args) { - if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) { - return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array! - } -}; - -/** - * Should be called to check if the number of arguments is correct - * - * @method validateArgs - * @param {Array} arguments - * @throws {Error} if it is not - */ -SolidityFunction.prototype.validateArgs = function (args) { - var inputArgs = args.filter(function (a) { - // filter the options object but not arguments that are arrays - return !( (utils.isObject(a) === true) && - (utils.isArray(a) === false) && - (utils.isBigNumber(a) === false) - ); - }); - if (inputArgs.length !== this._inputTypes.length) { - throw errors.InvalidNumberOfSolidityArgs(); - } -}; - -/** - * Should be used to create payload from arguments - * - * @method toPayload - * @param {Array} solidity function params - * @param {Object} optional payload options - */ -SolidityFunction.prototype.toPayload = function (args) { - var options = {}; - if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) { - options = args[args.length - 1]; - } - this.validateArgs(args); - options.to = this._address; - options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args); - return options; -}; - -/** - * Should be used to get function signature - * - * @method signature - * @return {String} function signature - */ -SolidityFunction.prototype.signature = function () { - return sha3(this._name).slice(0, 8); -}; - - -SolidityFunction.prototype.unpackOutput = function (output) { - if (!output) { - return; - } - - output = output.length >= 2 ? output.slice(2) : output; - var result = coder.decodeParams(this._outputTypes, output); - return result.length === 1 ? result[0] : result; -}; - -/** - * Calls a contract function. - * - * @method call - * @param {...Object} Contract function arguments - * @param {function} If the last argument is a function, the contract function - * call will be asynchronous, and the callback will be passed the - * error and result. - * @return {String} output bytes - */ -SolidityFunction.prototype.call = function () { - var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); - var callback = this.extractCallback(args); - var defaultBlock = this.extractDefaultBlock(args); - var payload = this.toPayload(args); - - - if (!callback) { - var output = this._eth.call(payload, defaultBlock); - return this.unpackOutput(output); - } - - var self = this; - this._eth.call(payload, defaultBlock, function (error, output) { - if (error) return callback(error, null); - - var unpacked = null; - try { - unpacked = self.unpackOutput(output); - } - catch (e) { - error = e; - } - - callback(error, unpacked); - }); -}; - -/** - * Should be used to sendTransaction to solidity function - * - * @method sendTransaction - */ -SolidityFunction.prototype.sendTransaction = function () { - var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; }); - var callback = this.extractCallback(args); - var payload = this.toPayload(args); - - if (payload.value > 0 && !this._payable) { - throw new Error('Cannot send value to non-payable function'); - } - - if (!callback) { - return this._eth.sendTransaction(payload); - } - - this._eth.sendTransaction(payload, callback); -}; - -/** - * Should be used to estimateGas of solidity function - * - * @method estimateGas - */ -SolidityFunction.prototype.estimateGas = function () { - var args = Array.prototype.slice.call(arguments); - var callback = this.extractCallback(args); - var payload = this.toPayload(args); - - if (!callback) { - return this._eth.estimateGas(payload); - } - - this._eth.estimateGas(payload, callback); -}; - -/** - * Return the encoded data of the call - * - * @method getData - * @return {String} the encoded data - */ -SolidityFunction.prototype.getData = function () { - var args = Array.prototype.slice.call(arguments); - var payload = this.toPayload(args); - - return payload.data; -}; - -/** - * Should be used to get function display name - * - * @method displayName - * @return {String} display name of the function - */ -SolidityFunction.prototype.displayName = function () { - return utils.extractDisplayName(this._name); -}; - -/** - * Should be used to get function type name - * - * @method typeName - * @return {String} type name of the function - */ -SolidityFunction.prototype.typeName = function () { - return utils.extractTypeName(this._name); -}; - -/** - * Should be called to get rpc requests from solidity function - * - * @method request - * @returns {Object} - */ -SolidityFunction.prototype.request = function () { - var args = Array.prototype.slice.call(arguments); - var callback = this.extractCallback(args); - var payload = this.toPayload(args); - var format = this.unpackOutput.bind(this); - - return { - method: this._constant ? 'eth_call' : 'eth_sendTransaction', - callback: callback, - params: [payload], - format: format - }; -}; - -/** - * Should be called to execute function - * - * @method execute - */ -SolidityFunction.prototype.execute = function () { - var transaction = !this._constant; - - // send transaction - if (transaction) { - return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments)); - } - - // call - return this.call.apply(this, Array.prototype.slice.call(arguments)); -}; - -/** - * Should be called to attach function to contract - * - * @method attachToContract - * @param {Contract} - */ -SolidityFunction.prototype.attachToContract = function (contract) { - var execute = this.execute.bind(this); - execute.request = this.request.bind(this); - execute.call = this.call.bind(this); - execute.sendTransaction = this.sendTransaction.bind(this); - execute.estimateGas = this.estimateGas.bind(this); - execute.getData = this.getData.bind(this); - var displayName = this.displayName(); - if (!contract[displayName]) { - contract[displayName] = execute; - } - contract[displayName][this.typeName()] = execute; // circular!!!! -}; - -module.exports = SolidityFunction; - -},{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file httpprovider.js - * @authors: - * Marek Kotewicz - * Marian Oancea - * Fabian Vogelsteller - * @date 2015 - */ - -var errors = require('./errors'); - -// workaround to use httpprovider in different envs - -// browser -if (typeof window !== 'undefined' && window.XMLHttpRequest) { - XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line -// node -} else { - XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line -} - -var XHR2 = require('xhr2'); // jshint ignore: line - -/** - * HttpProvider should be used to send rpc calls over http - */ -var HttpProvider = function (host, timeout, user, password) { - this.host = host || 'http://localhost:8545'; - this.timeout = timeout || 0; - this.user = user; - this.password = password; -}; - -/** - * Should be called to prepare new XMLHttpRequest - * - * @method prepareRequest - * @param {Boolean} true if request should be async - * @return {XMLHttpRequest} object - */ -HttpProvider.prototype.prepareRequest = function (async) { - var request; - - if (async) { - request = new XHR2(); - request.timeout = this.timeout; - } else { - request = new XMLHttpRequest(); - } - - request.open('POST', this.host, async); - if (this.user && this.password) { - var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64'); - request.setRequestHeader('Authorization', auth); - } request.setRequestHeader('Content-Type', 'application/json'); - return request; -}; - -/** - * Should be called to make sync request - * - * @method send - * @param {Object} payload - * @return {Object} result - */ -HttpProvider.prototype.send = function (payload) { - var request = this.prepareRequest(false); - - try { - request.send(JSON.stringify(payload)); - } catch (error) { - throw errors.InvalidConnection(this.host); - } - - var result = request.responseText; - - try { - result = JSON.parse(result); - } catch (e) { - throw errors.InvalidResponse(request.responseText); - } - - return result; -}; - -/** - * Should be used to make async request - * - * @method sendAsync - * @param {Object} payload - * @param {Function} callback triggered on end with (err, result) - */ -HttpProvider.prototype.sendAsync = function (payload, callback) { - var request = this.prepareRequest(true); - - request.onreadystatechange = function () { - if (request.readyState === 4 && request.timeout !== 1) { - var result = request.responseText; - var error = null; - - try { - result = JSON.parse(result); - } catch (e) { - error = errors.InvalidResponse(request.responseText); - } - - callback(error, result); - } - }; - - request.ontimeout = function () { - callback(errors.ConnectionTimeout(this.timeout)); - }; - - try { - request.send(JSON.stringify(payload)); - } catch (error) { - callback(errors.InvalidConnection(this.host)); - } -}; - -/** - * Synchronously tries to make Http request - * - * @method isConnected - * @return {Boolean} returns true if request haven't failed. Otherwise false - */ -HttpProvider.prototype.isConnected = function () { - try { - this.send({ - id: 9999999999, - jsonrpc: '2.0', - method: 'net_listening', - params: [] - }); - return true; - } catch (e) { - return false; - } -}; - -module.exports = HttpProvider; - -},{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file iban.js - * @author Marek Kotewicz - * @date 2015 - */ - -var BigNumber = require('bignumber.js'); - -var padLeft = function (string, bytes) { - var result = string; - while (result.length < bytes * 2) { - result = '0' + result; - } - return result; -}; - -/** - * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to - * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616. - * - * @method iso13616Prepare - * @param {String} iban the IBAN - * @returns {String} the prepared IBAN - */ -var iso13616Prepare = function (iban) { - var A = 'A'.charCodeAt(0); - var Z = 'Z'.charCodeAt(0); - - iban = iban.toUpperCase(); - iban = iban.substr(4) + iban.substr(0,4); - - return iban.split('').map(function(n){ - var code = n.charCodeAt(0); - if (code >= A && code <= Z){ - // A = 10, B = 11, ... Z = 35 - return code - A + 10; - } else { - return n; - } - }).join(''); -}; - -/** - * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. - * - * @method mod9710 - * @param {String} iban - * @returns {Number} - */ -var mod9710 = function (iban) { - var remainder = iban, - block; - - while (remainder.length > 2){ - block = remainder.slice(0, 9); - remainder = parseInt(block, 10) % 97 + remainder.slice(block.length); - } - - return parseInt(remainder, 10) % 97; -}; - -/** - * This prototype should be used to create iban object from iban correct string - * - * @param {String} iban - */ -var Iban = function (iban) { - this._iban = iban; -}; - -/** - * This method should be used to create iban object from ethereum address - * - * @method fromAddress - * @param {String} address - * @return {Iban} the IBAN object - */ -Iban.fromAddress = function (address) { - var asBn = new BigNumber(address, 16); - var base36 = asBn.toString(36); - var padded = padLeft(base36, 15); - return Iban.fromBban(padded.toUpperCase()); -}; - -/** - * Convert the passed BBAN to an IBAN for this country specification. - * Please note that "generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account". - * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits - * - * @method fromBban - * @param {String} bban the BBAN to convert to IBAN - * @returns {Iban} the IBAN object - */ -Iban.fromBban = function (bban) { - var countryCode = 'XE'; - - var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban)); - var checkDigit = ('0' + (98 - remainder)).slice(-2); - - return new Iban(countryCode + checkDigit + bban); -}; - -/** - * Should be used to create IBAN object for given institution and identifier - * - * @method createIndirect - * @param {Object} options, required options are "institution" and "identifier" - * @return {Iban} the IBAN object - */ -Iban.createIndirect = function (options) { - return Iban.fromBban('ETH' + options.institution + options.identifier); -}; - -/** - * Thos method should be used to check if given string is valid iban object - * - * @method isValid - * @param {String} iban string - * @return {Boolean} true if it is valid IBAN - */ -Iban.isValid = function (iban) { - var i = new Iban(iban); - return i.isValid(); -}; - -/** - * Should be called to check if iban is correct - * - * @method isValid - * @returns {Boolean} true if it is, otherwise false - */ -Iban.prototype.isValid = function () { - return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) && - mod9710(iso13616Prepare(this._iban)) === 1; -}; - -/** - * Should be called to check if iban number is direct - * - * @method isDirect - * @returns {Boolean} true if it is, otherwise false - */ -Iban.prototype.isDirect = function () { - return this._iban.length === 34 || this._iban.length === 35; -}; - -/** - * Should be called to check if iban number if indirect - * - * @method isIndirect - * @returns {Boolean} true if it is, otherwise false - */ -Iban.prototype.isIndirect = function () { - return this._iban.length === 20; -}; - -/** - * Should be called to get iban checksum - * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003) - * - * @method checksum - * @returns {String} checksum - */ -Iban.prototype.checksum = function () { - return this._iban.substr(2, 2); -}; - -/** - * Should be called to get institution identifier - * eg. XREG - * - * @method institution - * @returns {String} institution identifier - */ -Iban.prototype.institution = function () { - return this.isIndirect() ? this._iban.substr(7, 4) : ''; -}; - -/** - * Should be called to get client identifier within institution - * eg. GAVOFYORK - * - * @method client - * @returns {String} client identifier - */ -Iban.prototype.client = function () { - return this.isIndirect() ? this._iban.substr(11) : ''; -}; - -/** - * Should be called to get client direct address - * - * @method address - * @returns {String} client direct address - */ -Iban.prototype.address = function () { - if (this.isDirect()) { - var base36 = this._iban.substr(4); - var asBn = new BigNumber(base36, 36); - return padLeft(asBn.toString(16), 20); - } - - return ''; -}; - -Iban.prototype.toString = function () { - return this._iban; -}; - -module.exports = Iban; - - -},{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file ipcprovider.js - * @authors: - * Fabian Vogelsteller - * @date 2015 - */ - -"use strict"; - -var utils = require('../utils/utils'); -var errors = require('./errors'); - - -var IpcProvider = function (path, net) { - var _this = this; - this.responseCallbacks = {}; - this.path = path; - - this.connection = net.connect({path: this.path}); - - this.connection.on('error', function(e){ - console.error('IPC Connection Error', e); - _this._timeout(); - }); - - this.connection.on('end', function(){ - _this._timeout(); - }); - - - // LISTEN FOR CONNECTION RESPONSES - this.connection.on('data', function(data) { - /*jshint maxcomplexity: 6 */ - - _this._parseResponse(data.toString()).forEach(function(result){ - - var id = null; - - // get the id which matches the returned id - if(utils.isArray(result)) { - result.forEach(function(load){ - if(_this.responseCallbacks[load.id]) - id = load.id; - }); - } else { - id = result.id; - } - - // fire the callback - if(_this.responseCallbacks[id]) { - _this.responseCallbacks[id](null, result); - delete _this.responseCallbacks[id]; - } - }); - }); -}; - -/** -Will parse the response and make an array out of it. - -@method _parseResponse -@param {String} data -*/ -IpcProvider.prototype._parseResponse = function(data) { - var _this = this, - returnValues = []; - - // DE-CHUNKER - var dechunkedData = data - .replace(/\}[\n\r]?\{/g,'}|--|{') // }{ - .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{ - .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{ - .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{ - .split('|--|'); - - dechunkedData.forEach(function(data){ - - // prepend the last chunk - if(_this.lastChunk) - data = _this.lastChunk + data; - - var result = null; - - try { - result = JSON.parse(data); - - } catch(e) { - - _this.lastChunk = data; - - // start timeout to cancel all requests - clearTimeout(_this.lastChunkTimeout); - _this.lastChunkTimeout = setTimeout(function(){ - _this._timeout(); - throw errors.InvalidResponse(data); - }, 1000 * 15); - - return; - } - - // cancel timeout and set chunk to null - clearTimeout(_this.lastChunkTimeout); - _this.lastChunk = null; - - if(result) - returnValues.push(result); - }); - - return returnValues; -}; - - -/** -Get the adds a callback to the responseCallbacks object, -which will be called if a response matching the response Id will arrive. - -@method _addResponseCallback -*/ -IpcProvider.prototype._addResponseCallback = function(payload, callback) { - var id = payload.id || payload[0].id; - var method = payload.method || payload[0].method; - - this.responseCallbacks[id] = callback; - this.responseCallbacks[id].method = method; -}; - -/** -Timeout all requests when the end/error event is fired - -@method _timeout -*/ -IpcProvider.prototype._timeout = function() { - for(var key in this.responseCallbacks) { - if(this.responseCallbacks.hasOwnProperty(key)){ - this.responseCallbacks[key](errors.InvalidConnection('on IPC')); - delete this.responseCallbacks[key]; - } - } -}; - - -/** -Check if the current connection is still valid. - -@method isConnected -*/ -IpcProvider.prototype.isConnected = function() { - var _this = this; - - // try reconnect, when connection is gone - if(!_this.connection.writable) - _this.connection.connect({path: _this.path}); - - return !!this.connection.writable; -}; - -IpcProvider.prototype.send = function (payload) { - - if(this.connection.writeSync) { - var result; - - // try reconnect, when connection is gone - if(!this.connection.writable) - this.connection.connect({path: this.path}); - - var data = this.connection.writeSync(JSON.stringify(payload)); - - try { - result = JSON.parse(data); - } catch(e) { - throw errors.InvalidResponse(data); - } - - return result; - - } else { - throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.'); - } -}; - -IpcProvider.prototype.sendAsync = function (payload, callback) { - // try reconnect, when connection is gone - if(!this.connection.writable) - this.connection.connect({path: this.path}); - - - this.connection.write(JSON.stringify(payload)); - this._addResponseCallback(payload, callback); -}; - -module.exports = IpcProvider; - - -},{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file jsonrpc.js - * @authors: - * Marek Kotewicz - * Aaron Kumavis - * @date 2015 - */ - -// Initialize Jsonrpc as a simple object with utility functions. -var Jsonrpc = { - messageId: 0 -}; - -/** - * Should be called to valid json create payload object - * - * @method toPayload - * @param {Function} method of jsonrpc call, required - * @param {Array} params, an array of method params, optional - * @returns {Object} valid jsonrpc payload object - */ -Jsonrpc.toPayload = function (method, params) { - if (!method) - console.error('jsonrpc method should be specified!'); - - // advance message ID - Jsonrpc.messageId++; - - return { - jsonrpc: '2.0', - id: Jsonrpc.messageId, - method: method, - params: params || [] - }; -}; - -/** - * Should be called to check if jsonrpc response is valid - * - * @method isValidResponse - * @param {Object} - * @returns {Boolean} true if response is valid, otherwise false - */ -Jsonrpc.isValidResponse = function (response) { - return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response); - - function validateSingleMessage(message){ - return !!message && - !message.error && - message.jsonrpc === '2.0' && - typeof message.id === 'number' && - message.result !== undefined; // only undefined is not valid json object - } -}; - -/** - * Should be called to create batch payload object - * - * @method toBatchPayload - * @param {Array} messages, an array of objects with method (required) and params (optional) fields - * @returns {Array} batch payload - */ -Jsonrpc.toBatchPayload = function (messages) { - return messages.map(function (message) { - return Jsonrpc.toPayload(message.method, message.params); - }); -}; - -module.exports = Jsonrpc; - - -},{}],36:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file method.js - * @author Marek Kotewicz - * @date 2015 - */ - -var utils = require('../utils/utils'); -var errors = require('./errors'); - -var Method = function (options) { - this.name = options.name; - this.call = options.call; - this.params = options.params || 0; - this.inputFormatter = options.inputFormatter; - this.outputFormatter = options.outputFormatter; - this.requestManager = null; -}; - -Method.prototype.setRequestManager = function (rm) { - this.requestManager = rm; -}; - -/** - * Should be used to determine name of the jsonrpc method based on arguments - * - * @method getCall - * @param {Array} arguments - * @return {String} name of jsonrpc method - */ -Method.prototype.getCall = function (args) { - return utils.isFunction(this.call) ? this.call(args) : this.call; -}; - -/** - * Should be used to extract callback from array of arguments. Modifies input param - * - * @method extractCallback - * @param {Array} arguments - * @return {Function|Null} callback, if exists - */ -Method.prototype.extractCallback = function (args) { - if (utils.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } -}; - -/** - * Should be called to check if the number of arguments is correct - * - * @method validateArgs - * @param {Array} arguments - * @throws {Error} if it is not - */ -Method.prototype.validateArgs = function (args) { - if (args.length !== this.params) { - throw errors.InvalidNumberOfRPCParams(); - } -}; - -/** - * Should be called to format input args of method - * - * @method formatInput - * @param {Array} - * @return {Array} - */ -Method.prototype.formatInput = function (args) { - if (!this.inputFormatter) { - return args; - } - - return this.inputFormatter.map(function (formatter, index) { - return formatter ? formatter(args[index]) : args[index]; - }); -}; - -/** - * Should be called to format output(result) of method - * - * @method formatOutput - * @param {Object} - * @return {Object} - */ -Method.prototype.formatOutput = function (result) { - return this.outputFormatter && result ? this.outputFormatter(result) : result; -}; - -/** - * Should create payload from given input args - * - * @method toPayload - * @param {Array} args - * @return {Object} - */ -Method.prototype.toPayload = function (args) { - var call = this.getCall(args); - var callback = this.extractCallback(args); - var params = this.formatInput(args); - this.validateArgs(params); - - return { - method: call, - params: params, - callback: callback - }; -}; - -Method.prototype.attachToObject = function (obj) { - var func = this.buildCall(); - func.call = this.call; // TODO!!! that's ugly. filter.js uses it - var name = this.name.split('.'); - if (name.length > 1) { - obj[name[0]] = obj[name[0]] || {}; - obj[name[0]][name[1]] = func; - } else { - obj[name[0]] = func; - } -}; - -Method.prototype.buildCall = function() { - var method = this; - var send = function () { - var payload = method.toPayload(Array.prototype.slice.call(arguments)); - if (payload.callback) { - return method.requestManager.sendAsync(payload, function (err, result) { - payload.callback(err, method.formatOutput(result)); - }); - } - return method.formatOutput(method.requestManager.send(payload)); - }; - send.request = this.request.bind(this); - return send; -}; - -/** - * Should be called to create pure JSONRPC request which can be used in batch request - * - * @method request - * @param {...} params - * @return {Object} jsonrpc request - */ -Method.prototype.request = function () { - var payload = this.toPayload(Array.prototype.slice.call(arguments)); - payload.format = this.formatOutput.bind(this); - return payload; -}; - -module.exports = Method; - -},{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file db.js - * @authors: - * Marek Kotewicz - * @date 2015 - */ - -var Method = require('../method'); - -var DB = function (web3) { - this._requestManager = web3._requestManager; - - var self = this; - - methods().forEach(function(method) { - method.attachToObject(self); - method.setRequestManager(web3._requestManager); - }); -}; - -var methods = function () { - var putString = new Method({ - name: 'putString', - call: 'db_putString', - params: 3 - }); - - var getString = new Method({ - name: 'getString', - call: 'db_getString', - params: 2 - }); - - var putHex = new Method({ - name: 'putHex', - call: 'db_putHex', - params: 3 - }); - - var getHex = new Method({ - name: 'getHex', - call: 'db_getHex', - params: 2 - }); - - return [ - putString, getString, putHex, getHex - ]; -}; - -module.exports = DB; - -},{"../method":36}],38:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file eth.js - * @author Marek Kotewicz - * @author Fabian Vogelsteller - * @date 2015 - */ - -"use strict"; - -var formatters = require('../formatters'); -var utils = require('../../utils/utils'); -var Method = require('../method'); -var Property = require('../property'); -var c = require('../../utils/config'); -var Contract = require('../contract'); -var watches = require('./watches'); -var Filter = require('../filter'); -var IsSyncing = require('../syncing'); -var namereg = require('../namereg'); -var Iban = require('../iban'); -var transfer = require('../transfer'); - -var blockCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber"; -}; - -var transactionFromBlockCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex'; -}; - -var uncleCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex'; -}; - -var getBlockTransactionCountCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber'; -}; - -var uncleCountCall = function (args) { - return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber'; -}; - -function Eth(web3) { - this._requestManager = web3._requestManager; - - var self = this; - - methods().forEach(function(method) { - method.attachToObject(self); - method.setRequestManager(self._requestManager); - }); - - properties().forEach(function(p) { - p.attachToObject(self); - p.setRequestManager(self._requestManager); - }); - - - this.iban = Iban; - this.sendIBANTransaction = transfer.bind(null, this); -} - -Object.defineProperty(Eth.prototype, 'defaultBlock', { - get: function () { - return c.defaultBlock; - }, - set: function (val) { - c.defaultBlock = val; - return val; - } -}); - -Object.defineProperty(Eth.prototype, 'defaultAccount', { - get: function () { - return c.defaultAccount; - }, - set: function (val) { - c.defaultAccount = val; - return val; - } -}); - -var methods = function () { - var getBalance = new Method({ - name: 'getBalance', - call: 'eth_getBalance', - params: 2, - inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter], - outputFormatter: formatters.outputBigNumberFormatter - }); - - var getStorageAt = new Method({ - name: 'getStorageAt', - call: 'eth_getStorageAt', - params: 3, - inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter] - }); - - var getCode = new Method({ - name: 'getCode', - call: 'eth_getCode', - params: 2, - inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter] - }); - - var getBlock = new Method({ - name: 'getBlock', - call: blockCall, - params: 2, - inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }], - outputFormatter: formatters.outputBlockFormatter - }); - - var getUncle = new Method({ - name: 'getUncle', - call: uncleCall, - params: 2, - inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex], - outputFormatter: formatters.outputBlockFormatter, - - }); - - var getCompilers = new Method({ - name: 'getCompilers', - call: 'eth_getCompilers', - params: 0 - }); - - var getBlockTransactionCount = new Method({ - name: 'getBlockTransactionCount', - call: getBlockTransactionCountCall, - params: 1, - inputFormatter: [formatters.inputBlockNumberFormatter], - outputFormatter: utils.toDecimal - }); - - var getBlockUncleCount = new Method({ - name: 'getBlockUncleCount', - call: uncleCountCall, - params: 1, - inputFormatter: [formatters.inputBlockNumberFormatter], - outputFormatter: utils.toDecimal - }); - - var getTransaction = new Method({ - name: 'getTransaction', - call: 'eth_getTransactionByHash', - params: 1, - outputFormatter: formatters.outputTransactionFormatter - }); - - var getTransactionFromBlock = new Method({ - name: 'getTransactionFromBlock', - call: transactionFromBlockCall, - params: 2, - inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex], - outputFormatter: formatters.outputTransactionFormatter - }); - - var getTransactionReceipt = new Method({ - name: 'getTransactionReceipt', - call: 'eth_getTransactionReceipt', - params: 1, - outputFormatter: formatters.outputTransactionReceiptFormatter - }); - - var getTransactionCount = new Method({ - name: 'getTransactionCount', - call: 'eth_getTransactionCount', - params: 2, - inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter], - outputFormatter: utils.toDecimal - }); - - var sendRawTransaction = new Method({ - name: 'sendRawTransaction', - call: 'eth_sendRawTransaction', - params: 1, - inputFormatter: [null] - }); - - var sendTransaction = new Method({ - name: 'sendTransaction', - call: 'eth_sendTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - - var signTransaction = new Method({ - name: 'signTransaction', - call: 'eth_signTransaction', - params: 1, - inputFormatter: [formatters.inputTransactionFormatter] - }); - - var sign = new Method({ - name: 'sign', - call: 'eth_sign', - params: 2, - inputFormatter: [formatters.inputAddressFormatter, null] - }); - - var call = new Method({ - name: 'call', - call: 'eth_call', - params: 2, - inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter] - }); - - var estimateGas = new Method({ - name: 'estimateGas', - call: 'eth_estimateGas', - params: 1, - inputFormatter: [formatters.inputCallFormatter], - outputFormatter: utils.toDecimal - }); - - var compileSolidity = new Method({ - name: 'compile.solidity', - call: 'eth_compileSolidity', - params: 1 - }); - - var compileLLL = new Method({ - name: 'compile.lll', - call: 'eth_compileLLL', - params: 1 - }); - - var compileSerpent = new Method({ - name: 'compile.serpent', - call: 'eth_compileSerpent', - params: 1 - }); - - var submitWork = new Method({ - name: 'submitWork', - call: 'eth_submitWork', - params: 3 - }); - - var getWork = new Method({ - name: 'getWork', - call: 'eth_getWork', - params: 0 - }); - - return [ - getBalance, - getStorageAt, - getCode, - getBlock, - getUncle, - getCompilers, - getBlockTransactionCount, - getBlockUncleCount, - getTransaction, - getTransactionFromBlock, - getTransactionReceipt, - getTransactionCount, - call, - estimateGas, - sendRawTransaction, - signTransaction, - sendTransaction, - sign, - compileSolidity, - compileLLL, - compileSerpent, - submitWork, - getWork - ]; -}; - - -var properties = function () { - return [ - new Property({ - name: 'coinbase', - getter: 'eth_coinbase' - }), - new Property({ - name: 'mining', - getter: 'eth_mining' - }), - new Property({ - name: 'hashrate', - getter: 'eth_hashrate', - outputFormatter: utils.toDecimal - }), - new Property({ - name: 'syncing', - getter: 'eth_syncing', - outputFormatter: formatters.outputSyncingFormatter - }), - new Property({ - name: 'gasPrice', - getter: 'eth_gasPrice', - outputFormatter: formatters.outputBigNumberFormatter - }), - new Property({ - name: 'accounts', - getter: 'eth_accounts' - }), - new Property({ - name: 'blockNumber', - getter: 'eth_blockNumber', - outputFormatter: utils.toDecimal - }), - new Property({ - name: 'protocolVersion', - getter: 'eth_protocolVersion' - }) - ]; -}; - -Eth.prototype.contract = function (abi) { - var factory = new Contract(this, abi); - return factory; -}; - -Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) { - return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback); -}; - -Eth.prototype.namereg = function () { - return this.contract(namereg.global.abi).at(namereg.global.address); -}; - -Eth.prototype.icapNamereg = function () { - return this.contract(namereg.icap.abi).at(namereg.icap.address); -}; - -Eth.prototype.isSyncing = function (callback) { - return new IsSyncing(this._requestManager, callback); -}; - -module.exports = Eth; - -},{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":44,"../property":45,"../syncing":48,"../transfer":49,"./watches":43}],39:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file eth.js - * @authors: - * Marek Kotewicz - * @date 2015 - */ - -var utils = require('../../utils/utils'); -var Property = require('../property'); - -var Net = function (web3) { - this._requestManager = web3._requestManager; - - var self = this; - - properties().forEach(function(p) { - p.attachToObject(self); - p.setRequestManager(web3._requestManager); - }); -}; - -/// @returns an array of objects describing web3.eth api properties -var properties = function () { - return [ - new Property({ - name: 'listening', - getter: 'net_listening' - }), - new Property({ - name: 'peerCount', - getter: 'net_peerCount', - outputFormatter: utils.toDecimal - }) - ]; -}; - -module.exports = Net; - -},{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file eth.js - * @author Marek Kotewicz - * @author Fabian Vogelsteller - * @date 2015 - */ - -"use strict"; - -var Method = require('../method'); -var Property = require('../property'); -var formatters = require('../formatters'); - -function Personal(web3) { - this._requestManager = web3._requestManager; - - var self = this; - - methods().forEach(function(method) { - method.attachToObject(self); - method.setRequestManager(self._requestManager); - }); - - properties().forEach(function(p) { - p.attachToObject(self); - p.setRequestManager(self._requestManager); - }); -} - -var methods = function () { - var newAccount = new Method({ - name: 'newAccount', - call: 'personal_newAccount', - params: 1, - inputFormatter: [null] - }); - - var importRawKey = new Method({ - name: 'importRawKey', - call: 'personal_importRawKey', - params: 2 - }); - - var sign = new Method({ - name: 'sign', - call: 'personal_sign', - params: 3, - inputFormatter: [null, formatters.inputAddressFormatter, null] - }); - - var ecRecover = new Method({ - name: 'ecRecover', - call: 'personal_ecRecover', - params: 2 - }); - - var unlockAccount = new Method({ - name: 'unlockAccount', - call: 'personal_unlockAccount', - params: 3, - inputFormatter: [formatters.inputAddressFormatter, null, null] - }); - - var sendTransaction = new Method({ - name: 'sendTransaction', - call: 'personal_sendTransaction', - params: 2, - inputFormatter: [formatters.inputTransactionFormatter, null] - }); - - var lockAccount = new Method({ - name: 'lockAccount', - call: 'personal_lockAccount', - params: 1, - inputFormatter: [formatters.inputAddressFormatter] - }); - - return [ - newAccount, - importRawKey, - unlockAccount, - ecRecover, - sign, - sendTransaction, - lockAccount - ]; -}; - -var properties = function () { - return [ - new Property({ - name: 'listAccounts', - getter: 'personal_listAccounts' - }) - ]; -}; - - -module.exports = Personal; - -},{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file shh.js - * @authors: - * Fabian Vogelsteller - * Marek Kotewicz - * @date 2017 - */ - -var Method = require('../method'); -var Filter = require('../filter'); -var watches = require('./watches'); - -var Shh = function (web3) { - this._requestManager = web3._requestManager; - - var self = this; - - methods().forEach(function(method) { - method.attachToObject(self); - method.setRequestManager(self._requestManager); - }); -}; - -Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) { - return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback); -}; - -var methods = function () { - - return [ - new Method({ - name: 'version', - call: 'shh_version', - params: 0 - }), - new Method({ - name: 'info', - call: 'shh_info', - params: 0 - }), - new Method({ - name: 'setMaxMessageSize', - call: 'shh_setMaxMessageSize', - params: 1 - }), - new Method({ - name: 'setMinPoW', - call: 'shh_setMinPoW', - params: 1 - }), - new Method({ - name: 'markTrustedPeer', - call: 'shh_markTrustedPeer', - params: 1 - }), - new Method({ - name: 'newKeyPair', - call: 'shh_newKeyPair', - params: 0 - }), - new Method({ - name: 'addPrivateKey', - call: 'shh_addPrivateKey', - params: 1 - }), - new Method({ - name: 'deleteKeyPair', - call: 'shh_deleteKeyPair', - params: 1 - }), - new Method({ - name: 'hasKeyPair', - call: 'shh_hasKeyPair', - params: 1 - }), - new Method({ - name: 'getPublicKey', - call: 'shh_getPublicKey', - params: 1 - }), - new Method({ - name: 'getPrivateKey', - call: 'shh_getPrivateKey', - params: 1 - }), - new Method({ - name: 'newSymKey', - call: 'shh_newSymKey', - params: 0 - }), - new Method({ - name: 'addSymKey', - call: 'shh_addSymKey', - params: 1 - }), - new Method({ - name: 'generateSymKeyFromPassword', - call: 'shh_generateSymKeyFromPassword', - params: 1 - }), - new Method({ - name: 'hasSymKey', - call: 'shh_hasSymKey', - params: 1 - }), - new Method({ - name: 'getSymKey', - call: 'shh_getSymKey', - params: 1 - }), - new Method({ - name: 'deleteSymKey', - call: 'shh_deleteSymKey', - params: 1 - }), - - // subscribe and unsubscribe missing - - new Method({ - name: 'post', - call: 'shh_post', - params: 1, - inputFormatter: [null] - }) - ]; -}; - -module.exports = Shh; - - -},{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file bzz.js - * @author Alex Beregszaszi - * @date 2016 - * - * Reference: https://github.com/ledgerwatch/erigon/blob/swarm/internal/web3ext/web3ext.go#L33 - */ - -"use strict"; - -var Method = require('../method'); -var Property = require('../property'); - -function Swarm(web3) { - this._requestManager = web3._requestManager; - - var self = this; - - methods().forEach(function(method) { - method.attachToObject(self); - method.setRequestManager(self._requestManager); - }); - - properties().forEach(function(p) { - p.attachToObject(self); - p.setRequestManager(self._requestManager); - }); -} - -var methods = function () { - var blockNetworkRead = new Method({ - name: 'blockNetworkRead', - call: 'bzz_blockNetworkRead', - params: 1, - inputFormatter: [null] - }); - - var syncEnabled = new Method({ - name: 'syncEnabled', - call: 'bzz_syncEnabled', - params: 1, - inputFormatter: [null] - }); - - var swapEnabled = new Method({ - name: 'swapEnabled', - call: 'bzz_swapEnabled', - params: 1, - inputFormatter: [null] - }); - - var download = new Method({ - name: 'download', - call: 'bzz_download', - params: 2, - inputFormatter: [null, null] - }); - - var upload = new Method({ - name: 'upload', - call: 'bzz_upload', - params: 2, - inputFormatter: [null, null] - }); - - var retrieve = new Method({ - name: 'retrieve', - call: 'bzz_retrieve', - params: 1, - inputFormatter: [null] - }); - - var store = new Method({ - name: 'store', - call: 'bzz_store', - params: 2, - inputFormatter: [null, null] - }); - - var get = new Method({ - name: 'get', - call: 'bzz_get', - params: 1, - inputFormatter: [null] - }); - - var put = new Method({ - name: 'put', - call: 'bzz_put', - params: 2, - inputFormatter: [null, null] - }); - - var modify = new Method({ - name: 'modify', - call: 'bzz_modify', - params: 4, - inputFormatter: [null, null, null, null] - }); - - return [ - blockNetworkRead, - syncEnabled, - swapEnabled, - download, - upload, - retrieve, - store, - get, - put, - modify - ]; -}; - -var properties = function () { - return [ - new Property({ - name: 'hive', - getter: 'bzz_hive' - }), - new Property({ - name: 'info', - getter: 'bzz_info' - }) - ]; -}; - - -module.exports = Swarm; - -},{"../method":36,"../property":45}],43:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file watches.js - * @authors: - * Marek Kotewicz - * @date 2015 - */ - -var Method = require('../method'); - -/// @returns an array of objects describing web3.eth.filter api methods -var eth = function () { - var newFilterCall = function (args) { - var type = args[0]; - - switch(type) { - case 'latest': - args.shift(); - this.params = 0; - return 'eth_newBlockFilter'; - case 'pending': - args.shift(); - this.params = 0; - return 'eth_newPendingTransactionFilter'; - default: - return 'eth_newFilter'; - } - }; - - var newFilter = new Method({ - name: 'newFilter', - call: newFilterCall, - params: 1 - }); - - var uninstallFilter = new Method({ - name: 'uninstallFilter', - call: 'eth_uninstallFilter', - params: 1 - }); - - var getLogs = new Method({ - name: 'getLogs', - call: 'eth_getFilterLogs', - params: 1 - }); - - var poll = new Method({ - name: 'poll', - call: 'eth_getFilterChanges', - params: 1 - }); - - return [ - newFilter, - uninstallFilter, - getLogs, - poll - ]; -}; - -/// @returns an array of objects describing web3.shh.watch api methods -var shh = function () { - - return [ - new Method({ - name: 'newFilter', - call: 'shh_newMessageFilter', - params: 1 - }), - new Method({ - name: 'uninstallFilter', - call: 'shh_deleteMessageFilter', - params: 1 - }), - new Method({ - name: 'getLogs', - call: 'shh_getFilterMessages', - params: 1 - }), - new Method({ - name: 'poll', - call: 'shh_getFilterMessages', - params: 1 - }) - ]; -}; - -module.exports = { - eth: eth, - shh: shh -}; - - -},{"../method":36}],44:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file namereg.js - * @author Marek Kotewicz - * @date 2015 - */ - -var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json'); -var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json'); - -var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b'; -var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00'; - -module.exports = { - global: { - abi: globalRegistrarAbi, - address: globalNameregAddress - }, - icap: { - abi: icapRegistrarAbi, - address: icapNameregAddress - } -}; - - -},{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file property.js - * @author Fabian Vogelsteller - * @author Marek Kotewicz - * @date 2015 - */ - -var utils = require('../utils/utils'); - -var Property = function (options) { - this.name = options.name; - this.getter = options.getter; - this.setter = options.setter; - this.outputFormatter = options.outputFormatter; - this.inputFormatter = options.inputFormatter; - this.requestManager = null; -}; - -Property.prototype.setRequestManager = function (rm) { - this.requestManager = rm; -}; - -/** - * Should be called to format input args of method - * - * @method formatInput - * @param {Array} - * @return {Array} - */ -Property.prototype.formatInput = function (arg) { - return this.inputFormatter ? this.inputFormatter(arg) : arg; -}; - -/** - * Should be called to format output(result) of method - * - * @method formatOutput - * @param {Object} - * @return {Object} - */ -Property.prototype.formatOutput = function (result) { - return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result; -}; - -/** - * Should be used to extract callback from array of arguments. Modifies input param - * - * @method extractCallback - * @param {Array} arguments - * @return {Function|Null} callback, if exists - */ -Property.prototype.extractCallback = function (args) { - if (utils.isFunction(args[args.length - 1])) { - return args.pop(); // modify the args array! - } -}; - - -/** - * Should attach function to method - * - * @method attachToObject - * @param {Object} - * @param {Function} - */ -Property.prototype.attachToObject = function (obj) { - var proto = { - get: this.buildGet(), - enumerable: true - }; - - var names = this.name.split('.'); - var name = names[0]; - if (names.length > 1) { - obj[names[0]] = obj[names[0]] || {}; - obj = obj[names[0]]; - name = names[1]; - } - - Object.defineProperty(obj, name, proto); - obj[asyncGetterName(name)] = this.buildAsyncGet(); -}; - -var asyncGetterName = function (name) { - return 'get' + name.charAt(0).toUpperCase() + name.slice(1); -}; - -Property.prototype.buildGet = function () { - var property = this; - return function get() { - return property.formatOutput(property.requestManager.send({ - method: property.getter - })); - }; -}; - -Property.prototype.buildAsyncGet = function () { - var property = this; - var get = function (callback) { - property.requestManager.sendAsync({ - method: property.getter - }, function (err, result) { - callback(err, property.formatOutput(result)); - }); - }; - get.request = this.request.bind(this); - return get; -}; - -/** - * Should be called to create pure JSONRPC request which can be used in batch request - * - * @method request - * @param {...} params - * @return {Object} jsonrpc request - */ -Property.prototype.request = function () { - var payload = { - method: this.getter, - params: [], - callback: this.extractCallback(Array.prototype.slice.call(arguments)) - }; - payload.format = this.formatOutput.bind(this); - return payload; -}; - -module.exports = Property; - - -},{"../utils/utils":20}],46:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file requestmanager.js - * @author Jeffrey Wilcke - * @author Marek Kotewicz - * @author Marian Oancea - * @author Fabian Vogelsteller - * @author Gav Wood - * @date 2014 - */ - -var Jsonrpc = require('./jsonrpc'); -var utils = require('../utils/utils'); -var c = require('../utils/config'); -var errors = require('./errors'); - -/** - * It's responsible for passing messages to providers - * It's also responsible for polling the ethereum node for incoming messages - * Default poll timeout is 1 second - * Singleton - */ -var RequestManager = function (provider) { - this.provider = provider; - this.polls = {}; - this.timeout = null; -}; - -/** - * Should be used to synchronously send request - * - * @method send - * @param {Object} data - * @return {Object} - */ -RequestManager.prototype.send = function (data) { - if (!this.provider) { - console.error(errors.InvalidProvider()); - return null; - } - - var payload = Jsonrpc.toPayload(data.method, data.params); - var result = this.provider.send(payload); - - if (!Jsonrpc.isValidResponse(result)) { - throw errors.InvalidResponse(result); - } - - return result.result; -}; - -/** - * Should be used to asynchronously send request - * - * @method sendAsync - * @param {Object} data - * @param {Function} callback - */ -RequestManager.prototype.sendAsync = function (data, callback) { - if (!this.provider) { - return callback(errors.InvalidProvider()); - } - - var payload = Jsonrpc.toPayload(data.method, data.params); - this.provider.sendAsync(payload, function (err, result) { - if (err) { - return callback(err); - } - - if (!Jsonrpc.isValidResponse(result)) { - return callback(errors.InvalidResponse(result)); - } - - callback(null, result.result); - }); -}; - -/** - * Should be called to asynchronously send batch request - * - * @method sendBatch - * @param {Array} batch data - * @param {Function} callback - */ -RequestManager.prototype.sendBatch = function (data, callback) { - if (!this.provider) { - return callback(errors.InvalidProvider()); - } - - var payload = Jsonrpc.toBatchPayload(data); - - this.provider.sendAsync(payload, function (err, results) { - if (err) { - return callback(err); - } - - if (!utils.isArray(results)) { - return callback(errors.InvalidResponse(results)); - } - - callback(err, results); - }); -}; - -/** - * Should be used to set provider of request manager - * - * @method setProvider - * @param {Object} - */ -RequestManager.prototype.setProvider = function (p) { - this.provider = p; -}; - -/** - * Should be used to start polling - * - * @method startPolling - * @param {Object} data - * @param {Number} pollId - * @param {Function} callback - * @param {Function} uninstall - * - * @todo cleanup number of params - */ -RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) { - this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall}; - - - // start polling - if (!this.timeout) { - this.poll(); - } -}; - -/** - * Should be used to stop polling for filter with given id - * - * @method stopPolling - * @param {Number} pollId - */ -RequestManager.prototype.stopPolling = function (pollId) { - delete this.polls[pollId]; - - // stop polling - if(Object.keys(this.polls).length === 0 && this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } -}; - -/** - * Should be called to reset the polling mechanism of the request manager - * - * @method reset - */ -RequestManager.prototype.reset = function (keepIsSyncing) { - /*jshint maxcomplexity:5 */ - - for (var key in this.polls) { - // remove all polls, except sync polls, - // they need to be removed manually by calling syncing.stopWatching() - if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) { - this.polls[key].uninstall(); - delete this.polls[key]; - } - } - - // stop polling - if(Object.keys(this.polls).length === 0 && this.timeout) { - clearTimeout(this.timeout); - this.timeout = null; - } -}; - -/** - * Should be called to poll for changes on filter with given id - * - * @method poll - */ -RequestManager.prototype.poll = function () { - /*jshint maxcomplexity: 6 */ - this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT); - - if (Object.keys(this.polls).length === 0) { - return; - } - - if (!this.provider) { - console.error(errors.InvalidProvider()); - return; - } - - var pollsData = []; - var pollsIds = []; - for (var key in this.polls) { - pollsData.push(this.polls[key].data); - pollsIds.push(key); - } - - if (pollsData.length === 0) { - return; - } - - var payload = Jsonrpc.toBatchPayload(pollsData); - - // map the request id to they poll id - var pollsIdMap = {}; - payload.forEach(function(load, index){ - pollsIdMap[load.id] = pollsIds[index]; - }); - - - var self = this; - this.provider.sendAsync(payload, function (error, results) { - - - // TODO: console log? - if (error) { - return; - } - - if (!utils.isArray(results)) { - throw errors.InvalidResponse(results); - } - results.map(function (result) { - var id = pollsIdMap[result.id]; - - // make sure the filter is still installed after arrival of the request - if (self.polls[id]) { - result.callback = self.polls[id].callback; - return result; - } else - return false; - }).filter(function (result) { - return !!result; - }).filter(function (result) { - var valid = Jsonrpc.isValidResponse(result); - if (!valid) { - result.callback(errors.InvalidResponse(result)); - } - return valid; - }).forEach(function (result) { - result.callback(null, result.result); - }); - }); -}; - -module.exports = RequestManager; - - -},{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){ - - -var Settings = function () { - this.defaultBlock = 'latest'; - this.defaultAccount = undefined; -}; - -module.exports = Settings; - - -},{}],48:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** @file syncing.js - * @authors: - * Fabian Vogelsteller - * @date 2015 - */ - -var formatters = require('./formatters'); -var utils = require('../utils/utils'); - -var count = 1; - -/** -Adds the callback and sets up the methods, to iterate over the results. - -@method pollSyncing -@param {Object} self -*/ -var pollSyncing = function(self) { - - var onMessage = function (error, sync) { - if (error) { - return self.callbacks.forEach(function (callback) { - callback(error); - }); - } - - if(utils.isObject(sync) && sync.startingBlock) - sync = formatters.outputSyncingFormatter(sync); - - self.callbacks.forEach(function (callback) { - if (self.lastSyncState !== sync) { - - // call the callback with true first so the app can stop anything, before receiving the sync data - if(!self.lastSyncState && utils.isObject(sync)) - callback(null, true); - - // call on the next CPU cycle, so the actions of the sync stop can be processes first - setTimeout(function() { - callback(null, sync); - }, 0); - - self.lastSyncState = sync; - } - }); - }; - - self.requestManager.startPolling({ - method: 'eth_syncing', - params: [], - }, self.pollId, onMessage, self.stopWatching.bind(self)); - -}; - -var IsSyncing = function (requestManager, callback) { - this.requestManager = requestManager; - this.pollId = 'syncPoll_'+ count++; - this.callbacks = []; - this.addCallback(callback); - this.lastSyncState = false; - pollSyncing(this); - - return this; -}; - -IsSyncing.prototype.addCallback = function (callback) { - if(callback) - this.callbacks.push(callback); - return this; -}; - -IsSyncing.prototype.stopWatching = function () { - this.requestManager.stopPolling(this.pollId); - this.callbacks = []; -}; - -module.exports = IsSyncing; - - -},{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){ -/* - This file is part of web3.js. - - web3.js is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - web3.js 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 Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with web3.js. If not, see . -*/ -/** - * @file transfer.js - * @author Marek Kotewicz - * @date 2015 - */ - -var Iban = require('./iban'); -var exchangeAbi = require('../contracts/SmartExchange.json'); - -/** - * Should be used to make Iban transfer - * - * @method transfer - * @param {String} from - * @param {String} to iban - * @param {Value} value to be tranfered - * @param {Function} callback, callback - */ -var transfer = function (eth, from, to, value, callback) { - var iban = new Iban(to); - if (!iban.isValid()) { - throw new Error('invalid iban address'); - } - - if (iban.isDirect()) { - return transferToAddress(eth, from, iban.address(), value, callback); - } - - if (!callback) { - var address = eth.icapNamereg().addr(iban.institution()); - return deposit(eth, from, address, value, iban.client()); - } - - eth.icapNamereg().addr(iban.institution(), function (err, address) { - return deposit(eth, from, address, value, iban.client(), callback); - }); - -}; - -/** - * Should be used to transfer funds to certain address - * - * @method transferToAddress - * @param {String} from - * @param {String} to - * @param {Value} value to be tranfered - * @param {Function} callback, callback - */ -var transferToAddress = function (eth, from, to, value, callback) { - return eth.sendTransaction({ - address: to, - from: from, - value: value - }, callback); -}; - -/** - * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!) - * - * @method deposit - * @param {String} from - * @param {String} to - * @param {Value} value to be transferred - * @param {String} client unique identifier - * @param {Function} callback, callback - */ -var deposit = function (eth, from, to, value, client, callback) { - var abi = exchangeAbi; - return eth.contract(abi).at(to).deposit(client, { - from: from, - value: value - }, callback); -}; - -module.exports = transfer; - - -},{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){ - -},{}],51:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var BlockCipher = C_lib.BlockCipher; - var C_algo = C.algo; - - // Lookup tables - var SBOX = []; - var INV_SBOX = []; - var SUB_MIX_0 = []; - var SUB_MIX_1 = []; - var SUB_MIX_2 = []; - var SUB_MIX_3 = []; - var INV_SUB_MIX_0 = []; - var INV_SUB_MIX_1 = []; - var INV_SUB_MIX_2 = []; - var INV_SUB_MIX_3 = []; - - // Compute lookup tables - (function () { - // Compute double table - var d = []; - for (var i = 0; i < 256; i++) { - if (i < 128) { - d[i] = i << 1; - } else { - d[i] = (i << 1) ^ 0x11b; - } - } - - // Walk GF(2^8) - var x = 0; - var xi = 0; - for (var i = 0; i < 256; i++) { - // Compute sbox - var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); - sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; - SBOX[x] = sx; - INV_SBOX[sx] = x; - - // Compute multiplication - var x2 = d[x]; - var x4 = d[x2]; - var x8 = d[x4]; - - // Compute sub bytes, mix columns tables - var t = (d[sx] * 0x101) ^ (sx * 0x1010100); - SUB_MIX_0[x] = (t << 24) | (t >>> 8); - SUB_MIX_1[x] = (t << 16) | (t >>> 16); - SUB_MIX_2[x] = (t << 8) | (t >>> 24); - SUB_MIX_3[x] = t; - - // Compute inv sub bytes, inv mix columns tables - var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); - INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); - INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); - INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); - INV_SUB_MIX_3[sx] = t; - - // Compute next counter - if (!x) { - x = xi = 1; - } else { - x = x2 ^ d[d[d[x8 ^ x2]]]; - xi ^= d[d[xi]]; - } - } - }()); - - // Precomputed Rcon lookup - var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; - - /** - * AES block cipher algorithm. - */ - var AES = C_algo.AES = BlockCipher.extend({ - _doReset: function () { - // Skip reset of nRounds has been set before and key did not change - if (this._nRounds && this._keyPriorReset === this._key) { - return; - } - - // Shortcuts - var key = this._keyPriorReset = this._key; - var keyWords = key.words; - var keySize = key.sigBytes / 4; - - // Compute number of rounds - var nRounds = this._nRounds = keySize + 6; - - // Compute number of key schedule rows - var ksRows = (nRounds + 1) * 4; - - // Compute key schedule - var keySchedule = this._keySchedule = []; - for (var ksRow = 0; ksRow < ksRows; ksRow++) { - if (ksRow < keySize) { - keySchedule[ksRow] = keyWords[ksRow]; - } else { - var t = keySchedule[ksRow - 1]; - - if (!(ksRow % keySize)) { - // Rot word - t = (t << 8) | (t >>> 24); - - // Sub word - t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; - - // Mix Rcon - t ^= RCON[(ksRow / keySize) | 0] << 24; - } else if (keySize > 6 && ksRow % keySize == 4) { - // Sub word - t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; - } - - keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; - } - } - - // Compute inv key schedule - var invKeySchedule = this._invKeySchedule = []; - for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { - var ksRow = ksRows - invKsRow; - - if (invKsRow % 4) { - var t = keySchedule[ksRow]; - } else { - var t = keySchedule[ksRow - 4]; - } - - if (invKsRow < 4 || ksRow <= 4) { - invKeySchedule[invKsRow] = t; - } else { - invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ - INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; - } - } - }, - - encryptBlock: function (M, offset) { - this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); - }, - - decryptBlock: function (M, offset) { - // Swap 2nd and 4th rows - var t = M[offset + 1]; - M[offset + 1] = M[offset + 3]; - M[offset + 3] = t; - - this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); - - // Inv swap 2nd and 4th rows - var t = M[offset + 1]; - M[offset + 1] = M[offset + 3]; - M[offset + 3] = t; - }, - - _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { - // Shortcut - var nRounds = this._nRounds; - - // Get input, add round key - var s0 = M[offset] ^ keySchedule[0]; - var s1 = M[offset + 1] ^ keySchedule[1]; - var s2 = M[offset + 2] ^ keySchedule[2]; - var s3 = M[offset + 3] ^ keySchedule[3]; - - // Key schedule row counter - var ksRow = 4; - - // Rounds - for (var round = 1; round < nRounds; round++) { - // Shift rows, sub bytes, mix columns, add round key - var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; - var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; - var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; - var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; - - // Update state - s0 = t0; - s1 = t1; - s2 = t2; - s3 = t3; - } - - // Shift rows, sub bytes, add round key - var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; - var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; - var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; - var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; - - // Set output - M[offset] = t0; - M[offset + 1] = t1; - M[offset + 2] = t2; - M[offset + 3] = t3; - }, - - keySize: 256/32 - }); - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); - * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); - */ - C.AES = BlockCipher._createHelper(AES); - }()); - - - return CryptoJS.AES; - -})); -},{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * Cipher core components. - */ - CryptoJS.lib.Cipher || (function (undefined) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var Base = C_lib.Base; - var WordArray = C_lib.WordArray; - var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; - var C_enc = C.enc; - var Utf8 = C_enc.Utf8; - var Base64 = C_enc.Base64; - var C_algo = C.algo; - var EvpKDF = C_algo.EvpKDF; - - /** - * Abstract base cipher template. - * - * @property {number} keySize This cipher's key size. Default: 4 (128 bits) - * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) - * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. - * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. - */ - var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ - /** - * Configuration options. - * - * @property {WordArray} iv The IV to use for this operation. - */ - cfg: Base.extend(), - - /** - * Creates this cipher in encryption mode. - * - * @param {WordArray} key The key. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @return {Cipher} A cipher instance. - * - * @static - * - * @example - * - * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); - */ - createEncryptor: function (key, cfg) { - return this.create(this._ENC_XFORM_MODE, key, cfg); - }, - - /** - * Creates this cipher in decryption mode. - * - * @param {WordArray} key The key. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @return {Cipher} A cipher instance. - * - * @static - * - * @example - * - * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); - */ - createDecryptor: function (key, cfg) { - return this.create(this._DEC_XFORM_MODE, key, cfg); - }, - - /** - * Initializes a newly created cipher. - * - * @param {number} xformMode Either the encryption or decryption transormation mode constant. - * @param {WordArray} key The key. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @example - * - * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); - */ - init: function (xformMode, key, cfg) { - // Apply config defaults - this.cfg = this.cfg.extend(cfg); - - // Store transform mode and key - this._xformMode = xformMode; - this._key = key; - - // Set initial values - this.reset(); - }, - - /** - * Resets this cipher to its initial state. - * - * @example - * - * cipher.reset(); - */ - reset: function () { - // Reset data buffer - BufferedBlockAlgorithm.reset.call(this); - - // Perform concrete-cipher logic - this._doReset(); - }, - - /** - * Adds data to be encrypted or decrypted. - * - * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. - * - * @return {WordArray} The data after processing. - * - * @example - * - * var encrypted = cipher.process('data'); - * var encrypted = cipher.process(wordArray); - */ - process: function (dataUpdate) { - // Append - this._append(dataUpdate); - - // Process available blocks - return this._process(); - }, - - /** - * Finalizes the encryption or decryption process. - * Note that the finalize operation is effectively a destructive, read-once operation. - * - * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. - * - * @return {WordArray} The data after final processing. - * - * @example - * - * var encrypted = cipher.finalize(); - * var encrypted = cipher.finalize('data'); - * var encrypted = cipher.finalize(wordArray); - */ - finalize: function (dataUpdate) { - // Final data update - if (dataUpdate) { - this._append(dataUpdate); - } - - // Perform concrete-cipher logic - var finalProcessedData = this._doFinalize(); - - return finalProcessedData; - }, - - keySize: 128/32, - - ivSize: 128/32, - - _ENC_XFORM_MODE: 1, - - _DEC_XFORM_MODE: 2, - - /** - * Creates shortcut functions to a cipher's object interface. - * - * @param {Cipher} cipher The cipher to create a helper for. - * - * @return {Object} An object with encrypt and decrypt shortcut functions. - * - * @static - * - * @example - * - * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); - */ - _createHelper: (function () { - function selectCipherStrategy(key) { - if (typeof key == 'string') { - return PasswordBasedCipher; - } else { - return SerializableCipher; - } - } - - return function (cipher) { - return { - encrypt: function (message, key, cfg) { - return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); - }, - - decrypt: function (ciphertext, key, cfg) { - return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); - } - }; - }; - }()) - }); - - /** - * Abstract base stream cipher template. - * - * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) - */ - var StreamCipher = C_lib.StreamCipher = Cipher.extend({ - _doFinalize: function () { - // Process partial blocks - var finalProcessedBlocks = this._process(!!'flush'); - - return finalProcessedBlocks; - }, - - blockSize: 1 - }); - - /** - * Mode namespace. - */ - var C_mode = C.mode = {}; - - /** - * Abstract base block cipher mode template. - */ - var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ - /** - * Creates this mode for encryption. - * - * @param {Cipher} cipher A block cipher instance. - * @param {Array} iv The IV words. - * - * @static - * - * @example - * - * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); - */ - createEncryptor: function (cipher, iv) { - return this.Encryptor.create(cipher, iv); - }, - - /** - * Creates this mode for decryption. - * - * @param {Cipher} cipher A block cipher instance. - * @param {Array} iv The IV words. - * - * @static - * - * @example - * - * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); - */ - createDecryptor: function (cipher, iv) { - return this.Decryptor.create(cipher, iv); - }, - - /** - * Initializes a newly created mode. - * - * @param {Cipher} cipher A block cipher instance. - * @param {Array} iv The IV words. - * - * @example - * - * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); - */ - init: function (cipher, iv) { - this._cipher = cipher; - this._iv = iv; - } - }); - - /** - * Cipher Block Chaining mode. - */ - var CBC = C_mode.CBC = (function () { - /** - * Abstract base CBC mode. - */ - var CBC = BlockCipherMode.extend(); - - /** - * CBC encryptor. - */ - CBC.Encryptor = CBC.extend({ - /** - * Processes the data block at offset. - * - * @param {Array} words The data words to operate on. - * @param {number} offset The offset where the block starts. - * - * @example - * - * mode.processBlock(data.words, offset); - */ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher; - var blockSize = cipher.blockSize; - - // XOR and encrypt - xorBlock.call(this, words, offset, blockSize); - cipher.encryptBlock(words, offset); - - // Remember this block to use with next block - this._prevBlock = words.slice(offset, offset + blockSize); - } - }); - - /** - * CBC decryptor. - */ - CBC.Decryptor = CBC.extend({ - /** - * Processes the data block at offset. - * - * @param {Array} words The data words to operate on. - * @param {number} offset The offset where the block starts. - * - * @example - * - * mode.processBlock(data.words, offset); - */ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher; - var blockSize = cipher.blockSize; - - // Remember this block to use with next block - var thisBlock = words.slice(offset, offset + blockSize); - - // Decrypt and XOR - cipher.decryptBlock(words, offset); - xorBlock.call(this, words, offset, blockSize); - - // This block becomes the previous block - this._prevBlock = thisBlock; - } - }); - - function xorBlock(words, offset, blockSize) { - // Shortcut - var iv = this._iv; - - // Choose mixing block - if (iv) { - var block = iv; - - // Remove IV for subsequent blocks - this._iv = undefined; - } else { - var block = this._prevBlock; - } - - // XOR blocks - for (var i = 0; i < blockSize; i++) { - words[offset + i] ^= block[i]; - } - } - - return CBC; - }()); - - /** - * Padding namespace. - */ - var C_pad = C.pad = {}; - - /** - * PKCS #5/7 padding strategy. - */ - var Pkcs7 = C_pad.Pkcs7 = { - /** - * Pads data using the algorithm defined in PKCS #5/7. - * - * @param {WordArray} data The data to pad. - * @param {number} blockSize The multiple that the data should be padded to. - * - * @static - * - * @example - * - * CryptoJS.pad.Pkcs7.pad(wordArray, 4); - */ - pad: function (data, blockSize) { - // Shortcut - var blockSizeBytes = blockSize * 4; - - // Count padding bytes - var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; - - // Create padding word - var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; - - // Create padding - var paddingWords = []; - for (var i = 0; i < nPaddingBytes; i += 4) { - paddingWords.push(paddingWord); - } - var padding = WordArray.create(paddingWords, nPaddingBytes); - - // Add padding - data.concat(padding); - }, - - /** - * Unpads data that had been padded using the algorithm defined in PKCS #5/7. - * - * @param {WordArray} data The data to unpad. - * - * @static - * - * @example - * - * CryptoJS.pad.Pkcs7.unpad(wordArray); - */ - unpad: function (data) { - // Get number of padding bytes from last byte - var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; - - // Remove padding - data.sigBytes -= nPaddingBytes; - } - }; - - /** - * Abstract base block cipher template. - * - * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) - */ - var BlockCipher = C_lib.BlockCipher = Cipher.extend({ - /** - * Configuration options. - * - * @property {Mode} mode The block mode to use. Default: CBC - * @property {Padding} padding The padding strategy to use. Default: Pkcs7 - */ - cfg: Cipher.cfg.extend({ - mode: CBC, - padding: Pkcs7 - }), - - reset: function () { - // Reset cipher - Cipher.reset.call(this); - - // Shortcuts - var cfg = this.cfg; - var iv = cfg.iv; - var mode = cfg.mode; - - // Reset block mode - if (this._xformMode == this._ENC_XFORM_MODE) { - var modeCreator = mode.createEncryptor; - } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { - var modeCreator = mode.createDecryptor; - - // Keep at least one block in the buffer for unpadding - this._minBufferSize = 1; - } - this._mode = modeCreator.call(mode, this, iv && iv.words); - }, - - _doProcessBlock: function (words, offset) { - this._mode.processBlock(words, offset); - }, - - _doFinalize: function () { - // Shortcut - var padding = this.cfg.padding; - - // Finalize - if (this._xformMode == this._ENC_XFORM_MODE) { - // Pad data - padding.pad(this._data, this.blockSize); - - // Process final blocks - var finalProcessedBlocks = this._process(!!'flush'); - } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { - // Process final blocks - var finalProcessedBlocks = this._process(!!'flush'); - - // Unpad data - padding.unpad(finalProcessedBlocks); - } - - return finalProcessedBlocks; - }, - - blockSize: 128/32 - }); - - /** - * A collection of cipher parameters. - * - * @property {WordArray} ciphertext The raw ciphertext. - * @property {WordArray} key The key to this ciphertext. - * @property {WordArray} iv The IV used in the ciphering operation. - * @property {WordArray} salt The salt used with a key derivation function. - * @property {Cipher} algorithm The cipher algorithm. - * @property {Mode} mode The block mode used in the ciphering operation. - * @property {Padding} padding The padding scheme used in the ciphering operation. - * @property {number} blockSize The block size of the cipher. - * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. - */ - var CipherParams = C_lib.CipherParams = Base.extend({ - /** - * Initializes a newly created cipher params object. - * - * @param {Object} cipherParams An object with any of the possible cipher parameters. - * - * @example - * - * var cipherParams = CryptoJS.lib.CipherParams.create({ - * ciphertext: ciphertextWordArray, - * key: keyWordArray, - * iv: ivWordArray, - * salt: saltWordArray, - * algorithm: CryptoJS.algo.AES, - * mode: CryptoJS.mode.CBC, - * padding: CryptoJS.pad.PKCS7, - * blockSize: 4, - * formatter: CryptoJS.format.OpenSSL - * }); - */ - init: function (cipherParams) { - this.mixIn(cipherParams); - }, - - /** - * Converts this cipher params object to a string. - * - * @param {Format} formatter (Optional) The formatting strategy to use. - * - * @return {string} The stringified cipher params. - * - * @throws Error If neither the formatter nor the default formatter is set. - * - * @example - * - * var string = cipherParams + ''; - * var string = cipherParams.toString(); - * var string = cipherParams.toString(CryptoJS.format.OpenSSL); - */ - toString: function (formatter) { - return (formatter || this.formatter).stringify(this); - } - }); - - /** - * Format namespace. - */ - var C_format = C.format = {}; - - /** - * OpenSSL formatting strategy. - */ - var OpenSSLFormatter = C_format.OpenSSL = { - /** - * Converts a cipher params object to an OpenSSL-compatible string. - * - * @param {CipherParams} cipherParams The cipher params object. - * - * @return {string} The OpenSSL-compatible string. - * - * @static - * - * @example - * - * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); - */ - stringify: function (cipherParams) { - // Shortcuts - var ciphertext = cipherParams.ciphertext; - var salt = cipherParams.salt; - - // Format - if (salt) { - var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); - } else { - var wordArray = ciphertext; - } - - return wordArray.toString(Base64); - }, - - /** - * Converts an OpenSSL-compatible string to a cipher params object. - * - * @param {string} openSSLStr The OpenSSL-compatible string. - * - * @return {CipherParams} The cipher params object. - * - * @static - * - * @example - * - * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); - */ - parse: function (openSSLStr) { - // Parse base64 - var ciphertext = Base64.parse(openSSLStr); - - // Shortcut - var ciphertextWords = ciphertext.words; - - // Test for salt - if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { - // Extract salt - var salt = WordArray.create(ciphertextWords.slice(2, 4)); - - // Remove salt from ciphertext - ciphertextWords.splice(0, 4); - ciphertext.sigBytes -= 16; - } - - return CipherParams.create({ ciphertext: ciphertext, salt: salt }); - } - }; - - /** - * A cipher wrapper that returns ciphertext as a serializable cipher params object. - */ - var SerializableCipher = C_lib.SerializableCipher = Base.extend({ - /** - * Configuration options. - * - * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL - */ - cfg: Base.extend({ - format: OpenSSLFormatter - }), - - /** - * Encrypts a message. - * - * @param {Cipher} cipher The cipher algorithm to use. - * @param {WordArray|string} message The message to encrypt. - * @param {WordArray} key The key. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @return {CipherParams} A cipher params object. - * - * @static - * - * @example - * - * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); - * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); - * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); - */ - encrypt: function (cipher, message, key, cfg) { - // Apply config defaults - cfg = this.cfg.extend(cfg); - - // Encrypt - var encryptor = cipher.createEncryptor(key, cfg); - var ciphertext = encryptor.finalize(message); - - // Shortcut - var cipherCfg = encryptor.cfg; - - // Create and return serializable cipher params - return CipherParams.create({ - ciphertext: ciphertext, - key: key, - iv: cipherCfg.iv, - algorithm: cipher, - mode: cipherCfg.mode, - padding: cipherCfg.padding, - blockSize: cipher.blockSize, - formatter: cfg.format - }); - }, - - /** - * Decrypts serialized ciphertext. - * - * @param {Cipher} cipher The cipher algorithm to use. - * @param {CipherParams|string} ciphertext The ciphertext to decrypt. - * @param {WordArray} key The key. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @return {WordArray} The plaintext. - * - * @static - * - * @example - * - * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); - * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); - */ - decrypt: function (cipher, ciphertext, key, cfg) { - // Apply config defaults - cfg = this.cfg.extend(cfg); - - // Convert string to CipherParams - ciphertext = this._parse(ciphertext, cfg.format); - - // Decrypt - var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); - - return plaintext; - }, - - /** - * Converts serialized ciphertext to CipherParams, - * else assumed CipherParams already and returns ciphertext unchanged. - * - * @param {CipherParams|string} ciphertext The ciphertext. - * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. - * - * @return {CipherParams} The unserialized ciphertext. - * - * @static - * - * @example - * - * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); - */ - _parse: function (ciphertext, format) { - if (typeof ciphertext == 'string') { - return format.parse(ciphertext, this); - } else { - return ciphertext; - } - } - }); - - /** - * Key derivation function namespace. - */ - var C_kdf = C.kdf = {}; - - /** - * OpenSSL key derivation function. - */ - var OpenSSLKdf = C_kdf.OpenSSL = { - /** - * Derives a key and IV from a password. - * - * @param {string} password The password to derive from. - * @param {number} keySize The size in words of the key to generate. - * @param {number} ivSize The size in words of the IV to generate. - * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. - * - * @return {CipherParams} A cipher params object with the key, IV, and salt. - * - * @static - * - * @example - * - * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); - * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); - */ - execute: function (password, keySize, ivSize, salt) { - // Generate random salt - if (!salt) { - salt = WordArray.random(64/8); - } - - // Derive key and IV - var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); - - // Separate key and IV - var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); - key.sigBytes = keySize * 4; - - // Return params - return CipherParams.create({ key: key, iv: iv, salt: salt }); - } - }; - - /** - * A serializable cipher wrapper that derives the key from a password, - * and returns ciphertext as a serializable cipher params object. - */ - var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ - /** - * Configuration options. - * - * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL - */ - cfg: SerializableCipher.cfg.extend({ - kdf: OpenSSLKdf - }), - - /** - * Encrypts a message using a password. - * - * @param {Cipher} cipher The cipher algorithm to use. - * @param {WordArray|string} message The message to encrypt. - * @param {string} password The password. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @return {CipherParams} A cipher params object. - * - * @static - * - * @example - * - * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); - * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); - */ - encrypt: function (cipher, message, password, cfg) { - // Apply config defaults - cfg = this.cfg.extend(cfg); - - // Derive key and other params - var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); - - // Add IV to config - cfg.iv = derivedParams.iv; - - // Encrypt - var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); - - // Mix in derived params - ciphertext.mixIn(derivedParams); - - return ciphertext; - }, - - /** - * Decrypts serialized ciphertext using a password. - * - * @param {Cipher} cipher The cipher algorithm to use. - * @param {CipherParams|string} ciphertext The ciphertext to decrypt. - * @param {string} password The password. - * @param {Object} cfg (Optional) The configuration options to use for this operation. - * - * @return {WordArray} The plaintext. - * - * @static - * - * @example - * - * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); - * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); - */ - decrypt: function (cipher, ciphertext, password, cfg) { - // Apply config defaults - cfg = this.cfg.extend(cfg); - - // Convert string to CipherParams - ciphertext = this._parse(ciphertext, cfg.format); - - // Derive key and other params - var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); - - // Add IV to config - cfg.iv = derivedParams.iv; - - // Decrypt - var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); - - return plaintext; - } - }); - }()); - - -})); -},{"./core":53}],53:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(); - } - else if (typeof define === "function" && define.amd) { - // AMD - define([], factory); - } - else { - // Global (browser) - root.CryptoJS = factory(); - } -}(this, function () { - - /** - * CryptoJS core components. - */ - var CryptoJS = CryptoJS || (function (Math, undefined) { - /* - * Local polyfil of Object.create - */ - var create = Object.create || (function () { - function F() {}; - - return function (obj) { - var subtype; - - F.prototype = obj; - - subtype = new F(); - - F.prototype = null; - - return subtype; - }; - }()) - - /** - * CryptoJS namespace. - */ - var C = {}; - - /** - * Library namespace. - */ - var C_lib = C.lib = {}; - - /** - * Base object for prototypal inheritance. - */ - var Base = C_lib.Base = (function () { - - - return { - /** - * Creates a new object that inherits from this object. - * - * @param {Object} overrides Properties to copy into the new object. - * - * @return {Object} The new object. - * - * @static - * - * @example - * - * var MyType = CryptoJS.lib.Base.extend({ - * field: 'value', - * - * method: function () { - * } - * }); - */ - extend: function (overrides) { - // Spawn - var subtype = create(this); - - // Augment - if (overrides) { - subtype.mixIn(overrides); - } - - // Create default initializer - if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { - subtype.init = function () { - subtype.$super.init.apply(this, arguments); - }; - } - - // Initializer's prototype is the subtype object - subtype.init.prototype = subtype; - - // Reference supertype - subtype.$super = this; - - return subtype; - }, - - /** - * Extends this object and runs the init method. - * Arguments to create() will be passed to init(). - * - * @return {Object} The new object. - * - * @static - * - * @example - * - * var instance = MyType.create(); - */ - create: function () { - var instance = this.extend(); - instance.init.apply(instance, arguments); - - return instance; - }, - - /** - * Initializes a newly created object. - * Override this method to add some logic when your objects are created. - * - * @example - * - * var MyType = CryptoJS.lib.Base.extend({ - * init: function () { - * // ... - * } - * }); - */ - init: function () { - }, - - /** - * Copies properties into this object. - * - * @param {Object} properties The properties to mix in. - * - * @example - * - * MyType.mixIn({ - * field: 'value' - * }); - */ - mixIn: function (properties) { - for (var propertyName in properties) { - if (properties.hasOwnProperty(propertyName)) { - this[propertyName] = properties[propertyName]; - } - } - - // IE won't copy toString using the loop above - if (properties.hasOwnProperty('toString')) { - this.toString = properties.toString; - } - }, - - /** - * Creates a copy of this object. - * - * @return {Object} The clone. - * - * @example - * - * var clone = instance.clone(); - */ - clone: function () { - return this.init.prototype.extend(this); - } - }; - }()); - - /** - * An array of 32-bit words. - * - * @property {Array} words The array of 32-bit words. - * @property {number} sigBytes The number of significant bytes in this word array. - */ - var WordArray = C_lib.WordArray = Base.extend({ - /** - * Initializes a newly created word array. - * - * @param {Array} words (Optional) An array of 32-bit words. - * @param {number} sigBytes (Optional) The number of significant bytes in the words. - * - * @example - * - * var wordArray = CryptoJS.lib.WordArray.create(); - * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); - * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); - */ - init: function (words, sigBytes) { - words = this.words = words || []; - - if (sigBytes != undefined) { - this.sigBytes = sigBytes; - } else { - this.sigBytes = words.length * 4; - } - }, - - /** - * Converts this word array to a string. - * - * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex - * - * @return {string} The stringified word array. - * - * @example - * - * var string = wordArray + ''; - * var string = wordArray.toString(); - * var string = wordArray.toString(CryptoJS.enc.Utf8); - */ - toString: function (encoder) { - return (encoder || Hex).stringify(this); - }, - - /** - * Concatenates a word array to this word array. - * - * @param {WordArray} wordArray The word array to append. - * - * @return {WordArray} This word array. - * - * @example - * - * wordArray1.concat(wordArray2); - */ - concat: function (wordArray) { - // Shortcuts - var thisWords = this.words; - var thatWords = wordArray.words; - var thisSigBytes = this.sigBytes; - var thatSigBytes = wordArray.sigBytes; - - // Clamp excess bits - this.clamp(); - - // Concat - if (thisSigBytes % 4) { - // Copy one byte at a time - for (var i = 0; i < thatSigBytes; i++) { - var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); - } - } else { - // Copy one word at a time - for (var i = 0; i < thatSigBytes; i += 4) { - thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; - } - } - this.sigBytes += thatSigBytes; - - // Chainable - return this; - }, - - /** - * Removes insignificant bits. - * - * @example - * - * wordArray.clamp(); - */ - clamp: function () { - // Shortcuts - var words = this.words; - var sigBytes = this.sigBytes; - - // Clamp - words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); - words.length = Math.ceil(sigBytes / 4); - }, - - /** - * Creates a copy of this word array. - * - * @return {WordArray} The clone. - * - * @example - * - * var clone = wordArray.clone(); - */ - clone: function () { - var clone = Base.clone.call(this); - clone.words = this.words.slice(0); - - return clone; - }, - - /** - * Creates a word array filled with random bytes. - * - * @param {number} nBytes The number of random bytes to generate. - * - * @return {WordArray} The random word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.lib.WordArray.random(16); - */ - random: function (nBytes) { - var words = []; - - var r = (function (m_w) { - var m_w = m_w; - var m_z = 0x3ade68b1; - var mask = 0xffffffff; - - return function () { - m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; - m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; - var result = ((m_z << 0x10) + m_w) & mask; - result /= 0x100000000; - result += 0.5; - return result * (Math.random() > .5 ? 1 : -1); - } - }); - - for (var i = 0, rcache; i < nBytes; i += 4) { - var _r = r((rcache || Math.random()) * 0x100000000); - - rcache = _r() * 0x3ade67b7; - words.push((_r() * 0x100000000) | 0); - } - - return new WordArray.init(words, nBytes); - } - }); - - /** - * Encoder namespace. - */ - var C_enc = C.enc = {}; - - /** - * Hex encoding strategy. - */ - var Hex = C_enc.Hex = { - /** - * Converts a word array to a hex string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The hex string. - * - * @static - * - * @example - * - * var hexString = CryptoJS.enc.Hex.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - - // Convert - var hexChars = []; - for (var i = 0; i < sigBytes; i++) { - var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - hexChars.push((bite >>> 4).toString(16)); - hexChars.push((bite & 0x0f).toString(16)); - } - - return hexChars.join(''); - }, - - /** - * Converts a hex string to a word array. - * - * @param {string} hexStr The hex string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Hex.parse(hexString); - */ - parse: function (hexStr) { - // Shortcut - var hexStrLength = hexStr.length; - - // Convert - var words = []; - for (var i = 0; i < hexStrLength; i += 2) { - words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); - } - - return new WordArray.init(words, hexStrLength / 2); - } - }; - - /** - * Latin1 encoding strategy. - */ - var Latin1 = C_enc.Latin1 = { - /** - * Converts a word array to a Latin1 string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The Latin1 string. - * - * @static - * - * @example - * - * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - - // Convert - var latin1Chars = []; - for (var i = 0; i < sigBytes; i++) { - var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - latin1Chars.push(String.fromCharCode(bite)); - } - - return latin1Chars.join(''); - }, - - /** - * Converts a Latin1 string to a word array. - * - * @param {string} latin1Str The Latin1 string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); - */ - parse: function (latin1Str) { - // Shortcut - var latin1StrLength = latin1Str.length; - - // Convert - var words = []; - for (var i = 0; i < latin1StrLength; i++) { - words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); - } - - return new WordArray.init(words, latin1StrLength); - } - }; - - /** - * UTF-8 encoding strategy. - */ - var Utf8 = C_enc.Utf8 = { - /** - * Converts a word array to a UTF-8 string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The UTF-8 string. - * - * @static - * - * @example - * - * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); - */ - stringify: function (wordArray) { - try { - return decodeURIComponent(escape(Latin1.stringify(wordArray))); - } catch (e) { - throw new Error('Malformed UTF-8 data'); - } - }, - - /** - * Converts a UTF-8 string to a word array. - * - * @param {string} utf8Str The UTF-8 string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); - */ - parse: function (utf8Str) { - return Latin1.parse(unescape(encodeURIComponent(utf8Str))); - } - }; - - /** - * Abstract buffered block algorithm template. - * - * The property blockSize must be implemented in a concrete subtype. - * - * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 - */ - var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ - /** - * Resets this block algorithm's data buffer to its initial state. - * - * @example - * - * bufferedBlockAlgorithm.reset(); - */ - reset: function () { - // Initial values - this._data = new WordArray.init(); - this._nDataBytes = 0; - }, - - /** - * Adds new data to this block algorithm's buffer. - * - * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. - * - * @example - * - * bufferedBlockAlgorithm._append('data'); - * bufferedBlockAlgorithm._append(wordArray); - */ - _append: function (data) { - // Convert string to WordArray, else assume WordArray already - if (typeof data == 'string') { - data = Utf8.parse(data); - } - - // Append - this._data.concat(data); - this._nDataBytes += data.sigBytes; - }, - - /** - * Processes available data blocks. - * - * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. - * - * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. - * - * @return {WordArray} The processed data. - * - * @example - * - * var processedData = bufferedBlockAlgorithm._process(); - * var processedData = bufferedBlockAlgorithm._process(!!'flush'); - */ - _process: function (doFlush) { - // Shortcuts - var data = this._data; - var dataWords = data.words; - var dataSigBytes = data.sigBytes; - var blockSize = this.blockSize; - var blockSizeBytes = blockSize * 4; - - // Count blocks ready - var nBlocksReady = dataSigBytes / blockSizeBytes; - if (doFlush) { - // Round up to include partial blocks - nBlocksReady = Math.ceil(nBlocksReady); - } else { - // Round down to include only full blocks, - // less the number of blocks that must remain in the buffer - nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); - } - - // Count words ready - var nWordsReady = nBlocksReady * blockSize; - - // Count bytes ready - var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); - - // Process blocks - if (nWordsReady) { - for (var offset = 0; offset < nWordsReady; offset += blockSize) { - // Perform concrete-algorithm logic - this._doProcessBlock(dataWords, offset); - } - - // Remove processed words - var processedWords = dataWords.splice(0, nWordsReady); - data.sigBytes -= nBytesReady; - } - - // Return processed words - return new WordArray.init(processedWords, nBytesReady); - }, - - /** - * Creates a copy of this object. - * - * @return {Object} The clone. - * - * @example - * - * var clone = bufferedBlockAlgorithm.clone(); - */ - clone: function () { - var clone = Base.clone.call(this); - clone._data = this._data.clone(); - - return clone; - }, - - _minBufferSize: 0 - }); - - /** - * Abstract hasher template. - * - * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) - */ - var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ - /** - * Configuration options. - */ - cfg: Base.extend(), - - /** - * Initializes a newly created hasher. - * - * @param {Object} cfg (Optional) The configuration options to use for this hash computation. - * - * @example - * - * var hasher = CryptoJS.algo.SHA256.create(); - */ - init: function (cfg) { - // Apply config defaults - this.cfg = this.cfg.extend(cfg); - - // Set initial values - this.reset(); - }, - - /** - * Resets this hasher to its initial state. - * - * @example - * - * hasher.reset(); - */ - reset: function () { - // Reset data buffer - BufferedBlockAlgorithm.reset.call(this); - - // Perform concrete-hasher logic - this._doReset(); - }, - - /** - * Updates this hasher with a message. - * - * @param {WordArray|string} messageUpdate The message to append. - * - * @return {Hasher} This hasher. - * - * @example - * - * hasher.update('message'); - * hasher.update(wordArray); - */ - update: function (messageUpdate) { - // Append - this._append(messageUpdate); - - // Update the hash - this._process(); - - // Chainable - return this; - }, - - /** - * Finalizes the hash computation. - * Note that the finalize operation is effectively a destructive, read-once operation. - * - * @param {WordArray|string} messageUpdate (Optional) A final message update. - * - * @return {WordArray} The hash. - * - * @example - * - * var hash = hasher.finalize(); - * var hash = hasher.finalize('message'); - * var hash = hasher.finalize(wordArray); - */ - finalize: function (messageUpdate) { - // Final message update - if (messageUpdate) { - this._append(messageUpdate); - } - - // Perform concrete-hasher logic - var hash = this._doFinalize(); - - return hash; - }, - - blockSize: 512/32, - - /** - * Creates a shortcut function to a hasher's object interface. - * - * @param {Hasher} hasher The hasher to create a helper for. - * - * @return {Function} The shortcut function. - * - * @static - * - * @example - * - * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); - */ - _createHelper: function (hasher) { - return function (message, cfg) { - return new hasher.init(cfg).finalize(message); - }; - }, - - /** - * Creates a shortcut function to the HMAC's object interface. - * - * @param {Hasher} hasher The hasher to use in this HMAC helper. - * - * @return {Function} The shortcut function. - * - * @static - * - * @example - * - * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); - */ - _createHmacHelper: function (hasher) { - return function (message, key) { - return new C_algo.HMAC.init(hasher, key).finalize(message); - }; - } - }); - - /** - * Algorithm namespace. - */ - var C_algo = C.algo = {}; - - return C; - }(Math)); - - - return CryptoJS; - -})); -},{}],54:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var C_enc = C.enc; - - /** - * Base64 encoding strategy. - */ - var Base64 = C_enc.Base64 = { - /** - * Converts a word array to a Base64 string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The Base64 string. - * - * @static - * - * @example - * - * var base64String = CryptoJS.enc.Base64.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - var map = this._map; - - // Clamp excess bits - wordArray.clamp(); - - // Convert - var base64Chars = []; - for (var i = 0; i < sigBytes; i += 3) { - var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; - var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; - var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; - - var triplet = (byte1 << 16) | (byte2 << 8) | byte3; - - for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { - base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); - } - } - - // Add padding - var paddingChar = map.charAt(64); - if (paddingChar) { - while (base64Chars.length % 4) { - base64Chars.push(paddingChar); - } - } - - return base64Chars.join(''); - }, - - /** - * Converts a Base64 string to a word array. - * - * @param {string} base64Str The Base64 string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Base64.parse(base64String); - */ - parse: function (base64Str) { - // Shortcuts - var base64StrLength = base64Str.length; - var map = this._map; - var reverseMap = this._reverseMap; - - if (!reverseMap) { - reverseMap = this._reverseMap = []; - for (var j = 0; j < map.length; j++) { - reverseMap[map.charCodeAt(j)] = j; - } - } - - // Ignore padding - var paddingChar = map.charAt(64); - if (paddingChar) { - var paddingIndex = base64Str.indexOf(paddingChar); - if (paddingIndex !== -1) { - base64StrLength = paddingIndex; - } - } - - // Convert - return parseLoop(base64Str, base64StrLength, reverseMap); - - }, - - _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' - }; - - function parseLoop(base64Str, base64StrLength, reverseMap) { - var words = []; - var nBytes = 0; - for (var i = 0; i < base64StrLength; i++) { - if (i % 4) { - var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); - var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); - words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); - nBytes++; - } - } - return WordArray.create(words, nBytes); - } - }()); - - - return CryptoJS.enc.Base64; - -})); -},{"./core":53}],55:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var C_enc = C.enc; - - /** - * UTF-16 BE encoding strategy. - */ - var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { - /** - * Converts a word array to a UTF-16 BE string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The UTF-16 BE string. - * - * @static - * - * @example - * - * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - - // Convert - var utf16Chars = []; - for (var i = 0; i < sigBytes; i += 2) { - var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; - utf16Chars.push(String.fromCharCode(codePoint)); - } - - return utf16Chars.join(''); - }, - - /** - * Converts a UTF-16 BE string to a word array. - * - * @param {string} utf16Str The UTF-16 BE string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); - */ - parse: function (utf16Str) { - // Shortcut - var utf16StrLength = utf16Str.length; - - // Convert - var words = []; - for (var i = 0; i < utf16StrLength; i++) { - words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); - } - - return WordArray.create(words, utf16StrLength * 2); - } - }; - - /** - * UTF-16 LE encoding strategy. - */ - C_enc.Utf16LE = { - /** - * Converts a word array to a UTF-16 LE string. - * - * @param {WordArray} wordArray The word array. - * - * @return {string} The UTF-16 LE string. - * - * @static - * - * @example - * - * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); - */ - stringify: function (wordArray) { - // Shortcuts - var words = wordArray.words; - var sigBytes = wordArray.sigBytes; - - // Convert - var utf16Chars = []; - for (var i = 0; i < sigBytes; i += 2) { - var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); - utf16Chars.push(String.fromCharCode(codePoint)); - } - - return utf16Chars.join(''); - }, - - /** - * Converts a UTF-16 LE string to a word array. - * - * @param {string} utf16Str The UTF-16 LE string. - * - * @return {WordArray} The word array. - * - * @static - * - * @example - * - * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); - */ - parse: function (utf16Str) { - // Shortcut - var utf16StrLength = utf16Str.length; - - // Convert - var words = []; - for (var i = 0; i < utf16StrLength; i++) { - words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); - } - - return WordArray.create(words, utf16StrLength * 2); - } - }; - - function swapEndian(word) { - return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); - } - }()); - - - return CryptoJS.enc.Utf16; - -})); -},{"./core":53}],56:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./sha1", "./hmac"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var Base = C_lib.Base; - var WordArray = C_lib.WordArray; - var C_algo = C.algo; - var MD5 = C_algo.MD5; - - /** - * This key derivation function is meant to conform with EVP_BytesToKey. - * www.openssl.org/docs/crypto/EVP_BytesToKey.html - */ - var EvpKDF = C_algo.EvpKDF = Base.extend({ - /** - * Configuration options. - * - * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) - * @property {Hasher} hasher The hash algorithm to use. Default: MD5 - * @property {number} iterations The number of iterations to perform. Default: 1 - */ - cfg: Base.extend({ - keySize: 128/32, - hasher: MD5, - iterations: 1 - }), - - /** - * Initializes a newly created key derivation function. - * - * @param {Object} cfg (Optional) The configuration options to use for the derivation. - * - * @example - * - * var kdf = CryptoJS.algo.EvpKDF.create(); - * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); - * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); - */ - init: function (cfg) { - this.cfg = this.cfg.extend(cfg); - }, - - /** - * Derives a key from a password. - * - * @param {WordArray|string} password The password. - * @param {WordArray|string} salt A salt. - * - * @return {WordArray} The derived key. - * - * @example - * - * var key = kdf.compute(password, salt); - */ - compute: function (password, salt) { - // Shortcut - var cfg = this.cfg; - - // Init hasher - var hasher = cfg.hasher.create(); - - // Initial values - var derivedKey = WordArray.create(); - - // Shortcuts - var derivedKeyWords = derivedKey.words; - var keySize = cfg.keySize; - var iterations = cfg.iterations; - - // Generate key - while (derivedKeyWords.length < keySize) { - if (block) { - hasher.update(block); - } - var block = hasher.update(password).finalize(salt); - hasher.reset(); - - // Iterations - for (var i = 1; i < iterations; i++) { - block = hasher.finalize(block); - hasher.reset(); - } - - derivedKey.concat(block); - } - derivedKey.sigBytes = keySize * 4; - - return derivedKey; - } - }); - - /** - * Derives a key from a password. - * - * @param {WordArray|string} password The password. - * @param {WordArray|string} salt A salt. - * @param {Object} cfg (Optional) The configuration options to use for this computation. - * - * @return {WordArray} The derived key. - * - * @static - * - * @example - * - * var key = CryptoJS.EvpKDF(password, salt); - * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); - * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); - */ - C.EvpKDF = function (password, salt, cfg) { - return EvpKDF.create(cfg).compute(password, salt); - }; - }()); - - - return CryptoJS.EvpKDF; - -})); -},{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function (undefined) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var CipherParams = C_lib.CipherParams; - var C_enc = C.enc; - var Hex = C_enc.Hex; - var C_format = C.format; - - var HexFormatter = C_format.Hex = { - /** - * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. - * - * @param {CipherParams} cipherParams The cipher params object. - * - * @return {string} The hexadecimally encoded string. - * - * @static - * - * @example - * - * var hexString = CryptoJS.format.Hex.stringify(cipherParams); - */ - stringify: function (cipherParams) { - return cipherParams.ciphertext.toString(Hex); - }, - - /** - * Converts a hexadecimally encoded ciphertext string to a cipher params object. - * - * @param {string} input The hexadecimally encoded string. - * - * @return {CipherParams} The cipher params object. - * - * @static - * - * @example - * - * var cipherParams = CryptoJS.format.Hex.parse(hexString); - */ - parse: function (input) { - var ciphertext = Hex.parse(input); - return CipherParams.create({ ciphertext: ciphertext }); - } - }; - }()); - - - return CryptoJS.format.Hex; - -})); -},{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var Base = C_lib.Base; - var C_enc = C.enc; - var Utf8 = C_enc.Utf8; - var C_algo = C.algo; - - /** - * HMAC algorithm. - */ - var HMAC = C_algo.HMAC = Base.extend({ - /** - * Initializes a newly created HMAC. - * - * @param {Hasher} hasher The hash algorithm to use. - * @param {WordArray|string} key The secret key. - * - * @example - * - * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); - */ - init: function (hasher, key) { - // Init hasher - hasher = this._hasher = new hasher.init(); - - // Convert string to WordArray, else assume WordArray already - if (typeof key == 'string') { - key = Utf8.parse(key); - } - - // Shortcuts - var hasherBlockSize = hasher.blockSize; - var hasherBlockSizeBytes = hasherBlockSize * 4; - - // Allow arbitrary length keys - if (key.sigBytes > hasherBlockSizeBytes) { - key = hasher.finalize(key); - } - - // Clamp excess bits - key.clamp(); - - // Clone key for inner and outer pads - var oKey = this._oKey = key.clone(); - var iKey = this._iKey = key.clone(); - - // Shortcuts - var oKeyWords = oKey.words; - var iKeyWords = iKey.words; - - // XOR keys with pad constants - for (var i = 0; i < hasherBlockSize; i++) { - oKeyWords[i] ^= 0x5c5c5c5c; - iKeyWords[i] ^= 0x36363636; - } - oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; - - // Set initial values - this.reset(); - }, - - /** - * Resets this HMAC to its initial state. - * - * @example - * - * hmacHasher.reset(); - */ - reset: function () { - // Shortcut - var hasher = this._hasher; - - // Reset - hasher.reset(); - hasher.update(this._iKey); - }, - - /** - * Updates this HMAC with a message. - * - * @param {WordArray|string} messageUpdate The message to append. - * - * @return {HMAC} This HMAC instance. - * - * @example - * - * hmacHasher.update('message'); - * hmacHasher.update(wordArray); - */ - update: function (messageUpdate) { - this._hasher.update(messageUpdate); - - // Chainable - return this; - }, - - /** - * Finalizes the HMAC computation. - * Note that the finalize operation is effectively a destructive, read-once operation. - * - * @param {WordArray|string} messageUpdate (Optional) A final message update. - * - * @return {WordArray} The HMAC. - * - * @example - * - * var hmac = hmacHasher.finalize(); - * var hmac = hmacHasher.finalize('message'); - * var hmac = hmacHasher.finalize(wordArray); - */ - finalize: function (messageUpdate) { - // Shortcut - var hasher = this._hasher; - - // Compute HMAC - var innerHash = hasher.finalize(messageUpdate); - hasher.reset(); - var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); - - return hmac; - } - }); - }()); - - -})); -},{"./core":53}],59:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory); - } - else { - // Global (browser) - root.CryptoJS = factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - return CryptoJS; - -})); -},{"./aes":51,"./cipher-core":52,"./core":53,"./enc-base64":54,"./enc-utf16":55,"./evpkdf":56,"./format-hex":57,"./hmac":58,"./lib-typedarrays":60,"./md5":61,"./mode-cfb":62,"./mode-ctr":64,"./mode-ctr-gladman":63,"./mode-ecb":65,"./mode-ofb":66,"./pad-ansix923":67,"./pad-iso10126":68,"./pad-iso97971":69,"./pad-nopadding":70,"./pad-zeropadding":71,"./pbkdf2":72,"./rabbit":74,"./rabbit-legacy":73,"./rc4":75,"./ripemd160":76,"./sha1":77,"./sha224":78,"./sha256":79,"./sha3":80,"./sha384":81,"./sha512":82,"./tripledes":83,"./x64-core":84}],60:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Check if typed arrays are supported - if (typeof ArrayBuffer != 'function') { - return; - } - - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - - // Reference original init - var superInit = WordArray.init; - - // Augment WordArray.init to handle typed arrays - var subInit = WordArray.init = function (typedArray) { - // Convert buffers to uint8 - if (typedArray instanceof ArrayBuffer) { - typedArray = new Uint8Array(typedArray); - } - - // Convert other array views to uint8 - if ( - typedArray instanceof Int8Array || - (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || - typedArray instanceof Int16Array || - typedArray instanceof Uint16Array || - typedArray instanceof Int32Array || - typedArray instanceof Uint32Array || - typedArray instanceof Float32Array || - typedArray instanceof Float64Array - ) { - typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); - } - - // Handle Uint8Array - if (typedArray instanceof Uint8Array) { - // Shortcut - var typedArrayByteLength = typedArray.byteLength; - - // Extract bytes - var words = []; - for (var i = 0; i < typedArrayByteLength; i++) { - words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); - } - - // Initialize this word array - superInit.call(this, words, typedArrayByteLength); - } else { - // Else call normal init - superInit.apply(this, arguments); - } - }; - - subInit.prototype = WordArray; - }()); - - - return CryptoJS.lib.WordArray; - -})); -},{"./core":53}],61:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function (Math) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_algo = C.algo; - - // Constants table - var T = []; - - // Compute constants - (function () { - for (var i = 0; i < 64; i++) { - T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; - } - }()); - - /** - * MD5 hash algorithm. - */ - var MD5 = C_algo.MD5 = Hasher.extend({ - _doReset: function () { - this._hash = new WordArray.init([ - 0x67452301, 0xefcdab89, - 0x98badcfe, 0x10325476 - ]); - }, - - _doProcessBlock: function (M, offset) { - // Swap endian - for (var i = 0; i < 16; i++) { - // Shortcuts - var offset_i = offset + i; - var M_offset_i = M[offset_i]; - - M[offset_i] = ( - (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | - (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) - ); - } - - // Shortcuts - var H = this._hash.words; - - var M_offset_0 = M[offset + 0]; - var M_offset_1 = M[offset + 1]; - var M_offset_2 = M[offset + 2]; - var M_offset_3 = M[offset + 3]; - var M_offset_4 = M[offset + 4]; - var M_offset_5 = M[offset + 5]; - var M_offset_6 = M[offset + 6]; - var M_offset_7 = M[offset + 7]; - var M_offset_8 = M[offset + 8]; - var M_offset_9 = M[offset + 9]; - var M_offset_10 = M[offset + 10]; - var M_offset_11 = M[offset + 11]; - var M_offset_12 = M[offset + 12]; - var M_offset_13 = M[offset + 13]; - var M_offset_14 = M[offset + 14]; - var M_offset_15 = M[offset + 15]; - - // Working varialbes - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - - // Computation - a = FF(a, b, c, d, M_offset_0, 7, T[0]); - d = FF(d, a, b, c, M_offset_1, 12, T[1]); - c = FF(c, d, a, b, M_offset_2, 17, T[2]); - b = FF(b, c, d, a, M_offset_3, 22, T[3]); - a = FF(a, b, c, d, M_offset_4, 7, T[4]); - d = FF(d, a, b, c, M_offset_5, 12, T[5]); - c = FF(c, d, a, b, M_offset_6, 17, T[6]); - b = FF(b, c, d, a, M_offset_7, 22, T[7]); - a = FF(a, b, c, d, M_offset_8, 7, T[8]); - d = FF(d, a, b, c, M_offset_9, 12, T[9]); - c = FF(c, d, a, b, M_offset_10, 17, T[10]); - b = FF(b, c, d, a, M_offset_11, 22, T[11]); - a = FF(a, b, c, d, M_offset_12, 7, T[12]); - d = FF(d, a, b, c, M_offset_13, 12, T[13]); - c = FF(c, d, a, b, M_offset_14, 17, T[14]); - b = FF(b, c, d, a, M_offset_15, 22, T[15]); - - a = GG(a, b, c, d, M_offset_1, 5, T[16]); - d = GG(d, a, b, c, M_offset_6, 9, T[17]); - c = GG(c, d, a, b, M_offset_11, 14, T[18]); - b = GG(b, c, d, a, M_offset_0, 20, T[19]); - a = GG(a, b, c, d, M_offset_5, 5, T[20]); - d = GG(d, a, b, c, M_offset_10, 9, T[21]); - c = GG(c, d, a, b, M_offset_15, 14, T[22]); - b = GG(b, c, d, a, M_offset_4, 20, T[23]); - a = GG(a, b, c, d, M_offset_9, 5, T[24]); - d = GG(d, a, b, c, M_offset_14, 9, T[25]); - c = GG(c, d, a, b, M_offset_3, 14, T[26]); - b = GG(b, c, d, a, M_offset_8, 20, T[27]); - a = GG(a, b, c, d, M_offset_13, 5, T[28]); - d = GG(d, a, b, c, M_offset_2, 9, T[29]); - c = GG(c, d, a, b, M_offset_7, 14, T[30]); - b = GG(b, c, d, a, M_offset_12, 20, T[31]); - - a = HH(a, b, c, d, M_offset_5, 4, T[32]); - d = HH(d, a, b, c, M_offset_8, 11, T[33]); - c = HH(c, d, a, b, M_offset_11, 16, T[34]); - b = HH(b, c, d, a, M_offset_14, 23, T[35]); - a = HH(a, b, c, d, M_offset_1, 4, T[36]); - d = HH(d, a, b, c, M_offset_4, 11, T[37]); - c = HH(c, d, a, b, M_offset_7, 16, T[38]); - b = HH(b, c, d, a, M_offset_10, 23, T[39]); - a = HH(a, b, c, d, M_offset_13, 4, T[40]); - d = HH(d, a, b, c, M_offset_0, 11, T[41]); - c = HH(c, d, a, b, M_offset_3, 16, T[42]); - b = HH(b, c, d, a, M_offset_6, 23, T[43]); - a = HH(a, b, c, d, M_offset_9, 4, T[44]); - d = HH(d, a, b, c, M_offset_12, 11, T[45]); - c = HH(c, d, a, b, M_offset_15, 16, T[46]); - b = HH(b, c, d, a, M_offset_2, 23, T[47]); - - a = II(a, b, c, d, M_offset_0, 6, T[48]); - d = II(d, a, b, c, M_offset_7, 10, T[49]); - c = II(c, d, a, b, M_offset_14, 15, T[50]); - b = II(b, c, d, a, M_offset_5, 21, T[51]); - a = II(a, b, c, d, M_offset_12, 6, T[52]); - d = II(d, a, b, c, M_offset_3, 10, T[53]); - c = II(c, d, a, b, M_offset_10, 15, T[54]); - b = II(b, c, d, a, M_offset_1, 21, T[55]); - a = II(a, b, c, d, M_offset_8, 6, T[56]); - d = II(d, a, b, c, M_offset_15, 10, T[57]); - c = II(c, d, a, b, M_offset_6, 15, T[58]); - b = II(b, c, d, a, M_offset_13, 21, T[59]); - a = II(a, b, c, d, M_offset_4, 6, T[60]); - d = II(d, a, b, c, M_offset_11, 10, T[61]); - c = II(c, d, a, b, M_offset_2, 15, T[62]); - b = II(b, c, d, a, M_offset_9, 21, T[63]); - - // Intermediate hash value - H[0] = (H[0] + a) | 0; - H[1] = (H[1] + b) | 0; - H[2] = (H[2] + c) | 0; - H[3] = (H[3] + d) | 0; - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - - var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); - var nBitsTotalL = nBitsTotal; - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( - (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | - (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) - ); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( - (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | - (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) - ); - - data.sigBytes = (dataWords.length + 1) * 4; - - // Hash final blocks - this._process(); - - // Shortcuts - var hash = this._hash; - var H = hash.words; - - // Swap endian - for (var i = 0; i < 4; i++) { - // Shortcut - var H_i = H[i]; - - H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | - (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); - } - - // Return final computed hash - return hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - } - }); - - function FF(a, b, c, d, x, s, t) { - var n = a + ((b & c) | (~b & d)) + x + t; - return ((n << s) | (n >>> (32 - s))) + b; - } - - function GG(a, b, c, d, x, s, t) { - var n = a + ((b & d) | (c & ~d)) + x + t; - return ((n << s) | (n >>> (32 - s))) + b; - } - - function HH(a, b, c, d, x, s, t) { - var n = a + (b ^ c ^ d) + x + t; - return ((n << s) | (n >>> (32 - s))) + b; - } - - function II(a, b, c, d, x, s, t) { - var n = a + (c ^ (b | ~d)) + x + t; - return ((n << s) | (n >>> (32 - s))) + b; - } - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.MD5('message'); - * var hash = CryptoJS.MD5(wordArray); - */ - C.MD5 = Hasher._createHelper(MD5); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacMD5(message, key); - */ - C.HmacMD5 = Hasher._createHmacHelper(MD5); - }(Math)); - - - return CryptoJS.MD5; - -})); -},{"./core":53}],62:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * Cipher Feedback block mode. - */ - CryptoJS.mode.CFB = (function () { - var CFB = CryptoJS.lib.BlockCipherMode.extend(); - - CFB.Encryptor = CFB.extend({ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher; - var blockSize = cipher.blockSize; - - generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); - - // Remember this block to use with next block - this._prevBlock = words.slice(offset, offset + blockSize); - } - }); - - CFB.Decryptor = CFB.extend({ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher; - var blockSize = cipher.blockSize; - - // Remember this block to use with next block - var thisBlock = words.slice(offset, offset + blockSize); - - generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); - - // This block becomes the previous block - this._prevBlock = thisBlock; - } - }); - - function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { - // Shortcut - var iv = this._iv; - - // Generate keystream - if (iv) { - var keystream = iv.slice(0); - - // Remove IV for subsequent blocks - this._iv = undefined; - } else { - var keystream = this._prevBlock; - } - cipher.encryptBlock(keystream, 0); - - // Encrypt - for (var i = 0; i < blockSize; i++) { - words[offset + i] ^= keystream[i]; - } - } - - return CFB; - }()); - - - return CryptoJS.mode.CFB; - -})); -},{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** @preserve - * Counter block mode compatible with Dr Brian Gladman fileenc.c - * derived from CryptoJS.mode.CTR - * Jan Hruby jhruby.web@gmail.com - */ - CryptoJS.mode.CTRGladman = (function () { - var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); - - function incWord(word) - { - if (((word >> 24) & 0xff) === 0xff) { //overflow - var b1 = (word >> 16)&0xff; - var b2 = (word >> 8)&0xff; - var b3 = word & 0xff; - - if (b1 === 0xff) // overflow b1 - { - b1 = 0; - if (b2 === 0xff) - { - b2 = 0; - if (b3 === 0xff) - { - b3 = 0; - } - else - { - ++b3; - } - } - else - { - ++b2; - } - } - else - { - ++b1; - } - - word = 0; - word += (b1 << 16); - word += (b2 << 8); - word += b3; - } - else - { - word += (0x01 << 24); - } - return word; - } - - function incCounter(counter) - { - if ((counter[0] = incWord(counter[0])) === 0) - { - // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 - counter[1] = incWord(counter[1]); - } - return counter; - } - - var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher - var blockSize = cipher.blockSize; - var iv = this._iv; - var counter = this._counter; - - // Generate keystream - if (iv) { - counter = this._counter = iv.slice(0); - - // Remove IV for subsequent blocks - this._iv = undefined; - } - - incCounter(counter); - - var keystream = counter.slice(0); - cipher.encryptBlock(keystream, 0); - - // Encrypt - for (var i = 0; i < blockSize; i++) { - words[offset + i] ^= keystream[i]; - } - } - }); - - CTRGladman.Decryptor = Encryptor; - - return CTRGladman; - }()); - - - - - return CryptoJS.mode.CTRGladman; - -})); -},{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * Counter block mode. - */ - CryptoJS.mode.CTR = (function () { - var CTR = CryptoJS.lib.BlockCipherMode.extend(); - - var Encryptor = CTR.Encryptor = CTR.extend({ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher - var blockSize = cipher.blockSize; - var iv = this._iv; - var counter = this._counter; - - // Generate keystream - if (iv) { - counter = this._counter = iv.slice(0); - - // Remove IV for subsequent blocks - this._iv = undefined; - } - var keystream = counter.slice(0); - cipher.encryptBlock(keystream, 0); - - // Increment counter - counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 - - // Encrypt - for (var i = 0; i < blockSize; i++) { - words[offset + i] ^= keystream[i]; - } - } - }); - - CTR.Decryptor = Encryptor; - - return CTR; - }()); - - - return CryptoJS.mode.CTR; - -})); -},{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * Electronic Codebook block mode. - */ - CryptoJS.mode.ECB = (function () { - var ECB = CryptoJS.lib.BlockCipherMode.extend(); - - ECB.Encryptor = ECB.extend({ - processBlock: function (words, offset) { - this._cipher.encryptBlock(words, offset); - } - }); - - ECB.Decryptor = ECB.extend({ - processBlock: function (words, offset) { - this._cipher.decryptBlock(words, offset); - } - }); - - return ECB; - }()); - - - return CryptoJS.mode.ECB; - -})); -},{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * Output Feedback block mode. - */ - CryptoJS.mode.OFB = (function () { - var OFB = CryptoJS.lib.BlockCipherMode.extend(); - - var Encryptor = OFB.Encryptor = OFB.extend({ - processBlock: function (words, offset) { - // Shortcuts - var cipher = this._cipher - var blockSize = cipher.blockSize; - var iv = this._iv; - var keystream = this._keystream; - - // Generate keystream - if (iv) { - keystream = this._keystream = iv.slice(0); - - // Remove IV for subsequent blocks - this._iv = undefined; - } - cipher.encryptBlock(keystream, 0); - - // Encrypt - for (var i = 0; i < blockSize; i++) { - words[offset + i] ^= keystream[i]; - } - } - }); - - OFB.Decryptor = Encryptor; - - return OFB; - }()); - - - return CryptoJS.mode.OFB; - -})); -},{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * ANSI X.923 padding strategy. - */ - CryptoJS.pad.AnsiX923 = { - pad: function (data, blockSize) { - // Shortcuts - var dataSigBytes = data.sigBytes; - var blockSizeBytes = blockSize * 4; - - // Count padding bytes - var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; - - // Compute last byte position - var lastBytePos = dataSigBytes + nPaddingBytes - 1; - - // Pad - data.clamp(); - data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); - data.sigBytes += nPaddingBytes; - }, - - unpad: function (data) { - // Get number of padding bytes from last byte - var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; - - // Remove padding - data.sigBytes -= nPaddingBytes; - } - }; - - - return CryptoJS.pad.Ansix923; - -})); -},{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * ISO 10126 padding strategy. - */ - CryptoJS.pad.Iso10126 = { - pad: function (data, blockSize) { - // Shortcut - var blockSizeBytes = blockSize * 4; - - // Count padding bytes - var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; - - // Pad - data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). - concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); - }, - - unpad: function (data) { - // Get number of padding bytes from last byte - var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; - - // Remove padding - data.sigBytes -= nPaddingBytes; - } - }; - - - return CryptoJS.pad.Iso10126; - -})); -},{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * ISO/IEC 9797-1 Padding Method 2. - */ - CryptoJS.pad.Iso97971 = { - pad: function (data, blockSize) { - // Add 0x80 byte - data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); - - // Zero pad the rest - CryptoJS.pad.ZeroPadding.pad(data, blockSize); - }, - - unpad: function (data) { - // Remove zero padding - CryptoJS.pad.ZeroPadding.unpad(data); - - // Remove one more byte -- the 0x80 byte - data.sigBytes--; - } - }; - - - return CryptoJS.pad.Iso97971; - -})); -},{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * A noop padding strategy. - */ - CryptoJS.pad.NoPadding = { - pad: function () { - }, - - unpad: function () { - } - }; - - - return CryptoJS.pad.NoPadding; - -})); -},{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** - * Zero padding strategy. - */ - CryptoJS.pad.ZeroPadding = { - pad: function (data, blockSize) { - // Shortcut - var blockSizeBytes = blockSize * 4; - - // Pad - data.clamp(); - data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); - }, - - unpad: function (data) { - // Shortcut - var dataWords = data.words; - - // Unpad - var i = data.sigBytes - 1; - while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { - i--; - } - data.sigBytes = i + 1; - } - }; - - - return CryptoJS.pad.ZeroPadding; - -})); -},{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./sha1", "./hmac"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var Base = C_lib.Base; - var WordArray = C_lib.WordArray; - var C_algo = C.algo; - var SHA1 = C_algo.SHA1; - var HMAC = C_algo.HMAC; - - /** - * Password-Based Key Derivation Function 2 algorithm. - */ - var PBKDF2 = C_algo.PBKDF2 = Base.extend({ - /** - * Configuration options. - * - * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) - * @property {Hasher} hasher The hasher to use. Default: SHA1 - * @property {number} iterations The number of iterations to perform. Default: 1 - */ - cfg: Base.extend({ - keySize: 128/32, - hasher: SHA1, - iterations: 1 - }), - - /** - * Initializes a newly created key derivation function. - * - * @param {Object} cfg (Optional) The configuration options to use for the derivation. - * - * @example - * - * var kdf = CryptoJS.algo.PBKDF2.create(); - * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); - * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); - */ - init: function (cfg) { - this.cfg = this.cfg.extend(cfg); - }, - - /** - * Computes the Password-Based Key Derivation Function 2. - * - * @param {WordArray|string} password The password. - * @param {WordArray|string} salt A salt. - * - * @return {WordArray} The derived key. - * - * @example - * - * var key = kdf.compute(password, salt); - */ - compute: function (password, salt) { - // Shortcut - var cfg = this.cfg; - - // Init HMAC - var hmac = HMAC.create(cfg.hasher, password); - - // Initial values - var derivedKey = WordArray.create(); - var blockIndex = WordArray.create([0x00000001]); - - // Shortcuts - var derivedKeyWords = derivedKey.words; - var blockIndexWords = blockIndex.words; - var keySize = cfg.keySize; - var iterations = cfg.iterations; - - // Generate key - while (derivedKeyWords.length < keySize) { - var block = hmac.update(salt).finalize(blockIndex); - hmac.reset(); - - // Shortcuts - var blockWords = block.words; - var blockWordsLength = blockWords.length; - - // Iterations - var intermediate = block; - for (var i = 1; i < iterations; i++) { - intermediate = hmac.finalize(intermediate); - hmac.reset(); - - // Shortcut - var intermediateWords = intermediate.words; - - // XOR intermediate with block - for (var j = 0; j < blockWordsLength; j++) { - blockWords[j] ^= intermediateWords[j]; - } - } - - derivedKey.concat(block); - blockIndexWords[0]++; - } - derivedKey.sigBytes = keySize * 4; - - return derivedKey; - } - }); - - /** - * Computes the Password-Based Key Derivation Function 2. - * - * @param {WordArray|string} password The password. - * @param {WordArray|string} salt A salt. - * @param {Object} cfg (Optional) The configuration options to use for this computation. - * - * @return {WordArray} The derived key. - * - * @static - * - * @example - * - * var key = CryptoJS.PBKDF2(password, salt); - * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); - * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); - */ - C.PBKDF2 = function (password, salt, cfg) { - return PBKDF2.create(cfg).compute(password, salt); - }; - }()); - - - return CryptoJS.PBKDF2; - -})); -},{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var StreamCipher = C_lib.StreamCipher; - var C_algo = C.algo; - - // Reusable objects - var S = []; - var C_ = []; - var G = []; - - /** - * Rabbit stream cipher algorithm. - * - * This is a legacy version that neglected to convert the key to little-endian. - * This error doesn't affect the cipher's security, - * but it does affect its compatibility with other implementations. - */ - var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ - _doReset: function () { - // Shortcuts - var K = this._key.words; - var iv = this.cfg.iv; - - // Generate initial state values - var X = this._X = [ - K[0], (K[3] << 16) | (K[2] >>> 16), - K[1], (K[0] << 16) | (K[3] >>> 16), - K[2], (K[1] << 16) | (K[0] >>> 16), - K[3], (K[2] << 16) | (K[1] >>> 16) - ]; - - // Generate initial counter values - var C = this._C = [ - (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), - (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), - (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), - (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) - ]; - - // Carry bit - this._b = 0; - - // Iterate the system four times - for (var i = 0; i < 4; i++) { - nextState.call(this); - } - - // Modify the counters - for (var i = 0; i < 8; i++) { - C[i] ^= X[(i + 4) & 7]; - } - - // IV setup - if (iv) { - // Shortcuts - var IV = iv.words; - var IV_0 = IV[0]; - var IV_1 = IV[1]; - - // Generate four subvectors - var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); - var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); - var i1 = (i0 >>> 16) | (i2 & 0xffff0000); - var i3 = (i2 << 16) | (i0 & 0x0000ffff); - - // Modify counter values - C[0] ^= i0; - C[1] ^= i1; - C[2] ^= i2; - C[3] ^= i3; - C[4] ^= i0; - C[5] ^= i1; - C[6] ^= i2; - C[7] ^= i3; - - // Iterate the system four times - for (var i = 0; i < 4; i++) { - nextState.call(this); - } - } - }, - - _doProcessBlock: function (M, offset) { - // Shortcut - var X = this._X; - - // Iterate the system - nextState.call(this); - - // Generate four keystream words - S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); - S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); - S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); - S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); - - for (var i = 0; i < 4; i++) { - // Swap endian - S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | - (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); - - // Encrypt - M[offset + i] ^= S[i]; - } - }, - - blockSize: 128/32, - - ivSize: 64/32 - }); - - function nextState() { - // Shortcuts - var X = this._X; - var C = this._C; - - // Save old counter values - for (var i = 0; i < 8; i++) { - C_[i] = C[i]; - } - - // Calculate new counter values - C[0] = (C[0] + 0x4d34d34d + this._b) | 0; - C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; - C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; - C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; - C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; - C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; - C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; - C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; - this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; - - // Calculate the g-values - for (var i = 0; i < 8; i++) { - var gx = X[i] + C[i]; - - // Construct high and low argument for squaring - var ga = gx & 0xffff; - var gb = gx >>> 16; - - // Calculate high and low result of squaring - var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; - var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); - - // High XOR low - G[i] = gh ^ gl; - } - - // Calculate new state values - X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; - X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; - X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; - X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; - X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; - X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; - X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; - X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; - } - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); - * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); - */ - C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); - }()); - - - return CryptoJS.RabbitLegacy; - -})); -},{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var StreamCipher = C_lib.StreamCipher; - var C_algo = C.algo; - - // Reusable objects - var S = []; - var C_ = []; - var G = []; - - /** - * Rabbit stream cipher algorithm - */ - var Rabbit = C_algo.Rabbit = StreamCipher.extend({ - _doReset: function () { - // Shortcuts - var K = this._key.words; - var iv = this.cfg.iv; - - // Swap endian - for (var i = 0; i < 4; i++) { - K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | - (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); - } - - // Generate initial state values - var X = this._X = [ - K[0], (K[3] << 16) | (K[2] >>> 16), - K[1], (K[0] << 16) | (K[3] >>> 16), - K[2], (K[1] << 16) | (K[0] >>> 16), - K[3], (K[2] << 16) | (K[1] >>> 16) - ]; - - // Generate initial counter values - var C = this._C = [ - (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), - (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), - (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), - (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) - ]; - - // Carry bit - this._b = 0; - - // Iterate the system four times - for (var i = 0; i < 4; i++) { - nextState.call(this); - } - - // Modify the counters - for (var i = 0; i < 8; i++) { - C[i] ^= X[(i + 4) & 7]; - } - - // IV setup - if (iv) { - // Shortcuts - var IV = iv.words; - var IV_0 = IV[0]; - var IV_1 = IV[1]; - - // Generate four subvectors - var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); - var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); - var i1 = (i0 >>> 16) | (i2 & 0xffff0000); - var i3 = (i2 << 16) | (i0 & 0x0000ffff); - - // Modify counter values - C[0] ^= i0; - C[1] ^= i1; - C[2] ^= i2; - C[3] ^= i3; - C[4] ^= i0; - C[5] ^= i1; - C[6] ^= i2; - C[7] ^= i3; - - // Iterate the system four times - for (var i = 0; i < 4; i++) { - nextState.call(this); - } - } - }, - - _doProcessBlock: function (M, offset) { - // Shortcut - var X = this._X; - - // Iterate the system - nextState.call(this); - - // Generate four keystream words - S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); - S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); - S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); - S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); - - for (var i = 0; i < 4; i++) { - // Swap endian - S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | - (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); - - // Encrypt - M[offset + i] ^= S[i]; - } - }, - - blockSize: 128/32, - - ivSize: 64/32 - }); - - function nextState() { - // Shortcuts - var X = this._X; - var C = this._C; - - // Save old counter values - for (var i = 0; i < 8; i++) { - C_[i] = C[i]; - } - - // Calculate new counter values - C[0] = (C[0] + 0x4d34d34d + this._b) | 0; - C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; - C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; - C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; - C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; - C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; - C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; - C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; - this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; - - // Calculate the g-values - for (var i = 0; i < 8; i++) { - var gx = X[i] + C[i]; - - // Construct high and low argument for squaring - var ga = gx & 0xffff; - var gb = gx >>> 16; - - // Calculate high and low result of squaring - var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; - var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); - - // High XOR low - G[i] = gh ^ gl; - } - - // Calculate new state values - X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; - X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; - X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; - X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; - X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; - X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; - X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; - X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; - } - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); - * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); - */ - C.Rabbit = StreamCipher._createHelper(Rabbit); - }()); - - - return CryptoJS.Rabbit; - -})); -},{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var StreamCipher = C_lib.StreamCipher; - var C_algo = C.algo; - - /** - * RC4 stream cipher algorithm. - */ - var RC4 = C_algo.RC4 = StreamCipher.extend({ - _doReset: function () { - // Shortcuts - var key = this._key; - var keyWords = key.words; - var keySigBytes = key.sigBytes; - - // Init sbox - var S = this._S = []; - for (var i = 0; i < 256; i++) { - S[i] = i; - } - - // Key setup - for (var i = 0, j = 0; i < 256; i++) { - var keyByteIndex = i % keySigBytes; - var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; - - j = (j + S[i] + keyByte) % 256; - - // Swap - var t = S[i]; - S[i] = S[j]; - S[j] = t; - } - - // Counters - this._i = this._j = 0; - }, - - _doProcessBlock: function (M, offset) { - M[offset] ^= generateKeystreamWord.call(this); - }, - - keySize: 256/32, - - ivSize: 0 - }); - - function generateKeystreamWord() { - // Shortcuts - var S = this._S; - var i = this._i; - var j = this._j; - - // Generate keystream word - var keystreamWord = 0; - for (var n = 0; n < 4; n++) { - i = (i + 1) % 256; - j = (j + S[i]) % 256; - - // Swap - var t = S[i]; - S[i] = S[j]; - S[j] = t; - - keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); - } - - // Update counters - this._i = i; - this._j = j; - - return keystreamWord; - } - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); - * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); - */ - C.RC4 = StreamCipher._createHelper(RC4); - - /** - * Modified RC4 stream cipher algorithm. - */ - var RC4Drop = C_algo.RC4Drop = RC4.extend({ - /** - * Configuration options. - * - * @property {number} drop The number of keystream words to drop. Default 192 - */ - cfg: RC4.cfg.extend({ - drop: 192 - }), - - _doReset: function () { - RC4._doReset.call(this); - - // Drop - for (var i = this.cfg.drop; i > 0; i--) { - generateKeystreamWord.call(this); - } - } - }); - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); - * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); - */ - C.RC4Drop = StreamCipher._createHelper(RC4Drop); - }()); - - - return CryptoJS.RC4; - -})); -},{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - /** @preserve - (c) 2012 by Cédric Mesnil. All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - (function (Math) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_algo = C.algo; - - // Constants table - var _zl = WordArray.create([ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); - var _zr = WordArray.create([ - 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); - var _sl = WordArray.create([ - 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); - var _sr = WordArray.create([ - 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); - - var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); - var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); - - /** - * RIPEMD160 hash algorithm. - */ - var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ - _doReset: function () { - this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); - }, - - _doProcessBlock: function (M, offset) { - - // Swap endian - for (var i = 0; i < 16; i++) { - // Shortcuts - var offset_i = offset + i; - var M_offset_i = M[offset_i]; - - // Swap - M[offset_i] = ( - (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | - (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) - ); - } - // Shortcut - var H = this._hash.words; - var hl = _hl.words; - var hr = _hr.words; - var zl = _zl.words; - var zr = _zr.words; - var sl = _sl.words; - var sr = _sr.words; - - // Working variables - var al, bl, cl, dl, el; - var ar, br, cr, dr, er; - - ar = al = H[0]; - br = bl = H[1]; - cr = cl = H[2]; - dr = dl = H[3]; - er = el = H[4]; - // Computation - var t; - for (var i = 0; i < 80; i += 1) { - t = (al + M[offset+zl[i]])|0; - if (i<16){ - t += f1(bl,cl,dl) + hl[0]; - } else if (i<32) { - t += f2(bl,cl,dl) + hl[1]; - } else if (i<48) { - t += f3(bl,cl,dl) + hl[2]; - } else if (i<64) { - t += f4(bl,cl,dl) + hl[3]; - } else {// if (i<80) { - t += f5(bl,cl,dl) + hl[4]; - } - t = t|0; - t = rotl(t,sl[i]); - t = (t+el)|0; - al = el; - el = dl; - dl = rotl(cl, 10); - cl = bl; - bl = t; - - t = (ar + M[offset+zr[i]])|0; - if (i<16){ - t += f5(br,cr,dr) + hr[0]; - } else if (i<32) { - t += f4(br,cr,dr) + hr[1]; - } else if (i<48) { - t += f3(br,cr,dr) + hr[2]; - } else if (i<64) { - t += f2(br,cr,dr) + hr[3]; - } else {// if (i<80) { - t += f1(br,cr,dr) + hr[4]; - } - t = t|0; - t = rotl(t,sr[i]) ; - t = (t+er)|0; - ar = er; - er = dr; - dr = rotl(cr, 10); - cr = br; - br = t; - } - // Intermediate hash value - t = (H[1] + cl + dr)|0; - H[1] = (H[2] + dl + er)|0; - H[2] = (H[3] + el + ar)|0; - H[3] = (H[4] + al + br)|0; - H[4] = (H[0] + bl + cr)|0; - H[0] = t; - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( - (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | - (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) - ); - data.sigBytes = (dataWords.length + 1) * 4; - - // Hash final blocks - this._process(); - - // Shortcuts - var hash = this._hash; - var H = hash.words; - - // Swap endian - for (var i = 0; i < 5; i++) { - // Shortcut - var H_i = H[i]; - - // Swap - H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | - (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); - } - - // Return final computed hash - return hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - } - }); - - - function f1(x, y, z) { - return ((x) ^ (y) ^ (z)); - - } - - function f2(x, y, z) { - return (((x)&(y)) | ((~x)&(z))); - } - - function f3(x, y, z) { - return (((x) | (~(y))) ^ (z)); - } - - function f4(x, y, z) { - return (((x) & (z)) | ((y)&(~(z)))); - } - - function f5(x, y, z) { - return ((x) ^ ((y) |(~(z)))); - - } - - function rotl(x,n) { - return (x<>>(32-n)); - } - - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.RIPEMD160('message'); - * var hash = CryptoJS.RIPEMD160(wordArray); - */ - C.RIPEMD160 = Hasher._createHelper(RIPEMD160); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacRIPEMD160(message, key); - */ - C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); - }(Math)); - - - return CryptoJS.RIPEMD160; - -})); -},{"./core":53}],77:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_algo = C.algo; - - // Reusable object - var W = []; - - /** - * SHA-1 hash algorithm. - */ - var SHA1 = C_algo.SHA1 = Hasher.extend({ - _doReset: function () { - this._hash = new WordArray.init([ - 0x67452301, 0xefcdab89, - 0x98badcfe, 0x10325476, - 0xc3d2e1f0 - ]); - }, - - _doProcessBlock: function (M, offset) { - // Shortcut - var H = this._hash.words; - - // Working variables - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - var e = H[4]; - - // Computation - for (var i = 0; i < 80; i++) { - if (i < 16) { - W[i] = M[offset + i] | 0; - } else { - var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; - W[i] = (n << 1) | (n >>> 31); - } - - var t = ((a << 5) | (a >>> 27)) + e + W[i]; - if (i < 20) { - t += ((b & c) | (~b & d)) + 0x5a827999; - } else if (i < 40) { - t += (b ^ c ^ d) + 0x6ed9eba1; - } else if (i < 60) { - t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; - } else /* if (i < 80) */ { - t += (b ^ c ^ d) - 0x359d3e2a; - } - - e = d; - d = c; - c = (b << 30) | (b >>> 2); - b = a; - a = t; - } - - // Intermediate hash value - H[0] = (H[0] + a) | 0; - H[1] = (H[1] + b) | 0; - H[2] = (H[2] + c) | 0; - H[3] = (H[3] + d) | 0; - H[4] = (H[4] + e) | 0; - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; - data.sigBytes = dataWords.length * 4; - - // Hash final blocks - this._process(); - - // Return final computed hash - return this._hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA1('message'); - * var hash = CryptoJS.SHA1(wordArray); - */ - C.SHA1 = Hasher._createHelper(SHA1); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA1(message, key); - */ - C.HmacSHA1 = Hasher._createHmacHelper(SHA1); - }()); - - - return CryptoJS.SHA1; - -})); -},{"./core":53}],78:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./sha256")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./sha256"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var C_algo = C.algo; - var SHA256 = C_algo.SHA256; - - /** - * SHA-224 hash algorithm. - */ - var SHA224 = C_algo.SHA224 = SHA256.extend({ - _doReset: function () { - this._hash = new WordArray.init([ - 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, - 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 - ]); - }, - - _doFinalize: function () { - var hash = SHA256._doFinalize.call(this); - - hash.sigBytes -= 4; - - return hash; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA224('message'); - * var hash = CryptoJS.SHA224(wordArray); - */ - C.SHA224 = SHA256._createHelper(SHA224); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA224(message, key); - */ - C.HmacSHA224 = SHA256._createHmacHelper(SHA224); - }()); - - - return CryptoJS.SHA224; - -})); -},{"./core":53,"./sha256":79}],79:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function (Math) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_algo = C.algo; - - // Initialization and round constants tables - var H = []; - var K = []; - - // Compute constants - (function () { - function isPrime(n) { - var sqrtN = Math.sqrt(n); - for (var factor = 2; factor <= sqrtN; factor++) { - if (!(n % factor)) { - return false; - } - } - - return true; - } - - function getFractionalBits(n) { - return ((n - (n | 0)) * 0x100000000) | 0; - } - - var n = 2; - var nPrime = 0; - while (nPrime < 64) { - if (isPrime(n)) { - if (nPrime < 8) { - H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); - } - K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); - - nPrime++; - } - - n++; - } - }()); - - // Reusable object - var W = []; - - /** - * SHA-256 hash algorithm. - */ - var SHA256 = C_algo.SHA256 = Hasher.extend({ - _doReset: function () { - this._hash = new WordArray.init(H.slice(0)); - }, - - _doProcessBlock: function (M, offset) { - // Shortcut - var H = this._hash.words; - - // Working variables - var a = H[0]; - var b = H[1]; - var c = H[2]; - var d = H[3]; - var e = H[4]; - var f = H[5]; - var g = H[6]; - var h = H[7]; - - // Computation - for (var i = 0; i < 64; i++) { - if (i < 16) { - W[i] = M[offset + i] | 0; - } else { - var gamma0x = W[i - 15]; - var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ - ((gamma0x << 14) | (gamma0x >>> 18)) ^ - (gamma0x >>> 3); - - var gamma1x = W[i - 2]; - var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ - ((gamma1x << 13) | (gamma1x >>> 19)) ^ - (gamma1x >>> 10); - - W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; - } - - var ch = (e & f) ^ (~e & g); - var maj = (a & b) ^ (a & c) ^ (b & c); - - var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); - var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); - - var t1 = h + sigma1 + ch + K[i] + W[i]; - var t2 = sigma0 + maj; - - h = g; - g = f; - f = e; - e = (d + t1) | 0; - d = c; - c = b; - b = a; - a = (t1 + t2) | 0; - } - - // Intermediate hash value - H[0] = (H[0] + a) | 0; - H[1] = (H[1] + b) | 0; - H[2] = (H[2] + c) | 0; - H[3] = (H[3] + d) | 0; - H[4] = (H[4] + e) | 0; - H[5] = (H[5] + f) | 0; - H[6] = (H[6] + g) | 0; - H[7] = (H[7] + h) | 0; - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); - dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; - data.sigBytes = dataWords.length * 4; - - // Hash final blocks - this._process(); - - // Return final computed hash - return this._hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA256('message'); - * var hash = CryptoJS.SHA256(wordArray); - */ - C.SHA256 = Hasher._createHelper(SHA256); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA256(message, key); - */ - C.HmacSHA256 = Hasher._createHmacHelper(SHA256); - }(Math)); - - - return CryptoJS.SHA256; - -})); -},{"./core":53}],80:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./x64-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./x64-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function (Math) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var Hasher = C_lib.Hasher; - var C_x64 = C.x64; - var X64Word = C_x64.Word; - var C_algo = C.algo; - - // Constants tables - var RHO_OFFSETS = []; - var PI_INDEXES = []; - var ROUND_CONSTANTS = []; - - // Compute Constants - (function () { - // Compute rho offset constants - var x = 1, y = 0; - for (var t = 0; t < 24; t++) { - RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; - - var newX = y % 5; - var newY = (2 * x + 3 * y) % 5; - x = newX; - y = newY; - } - - // Compute pi index constants - for (var x = 0; x < 5; x++) { - for (var y = 0; y < 5; y++) { - PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; - } - } - - // Compute round constants - var LFSR = 0x01; - for (var i = 0; i < 24; i++) { - var roundConstantMsw = 0; - var roundConstantLsw = 0; - - for (var j = 0; j < 7; j++) { - if (LFSR & 0x01) { - var bitPosition = (1 << j) - 1; - if (bitPosition < 32) { - roundConstantLsw ^= 1 << bitPosition; - } else /* if (bitPosition >= 32) */ { - roundConstantMsw ^= 1 << (bitPosition - 32); - } - } - - // Compute next LFSR - if (LFSR & 0x80) { - // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 - LFSR = (LFSR << 1) ^ 0x71; - } else { - LFSR <<= 1; - } - } - - ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); - } - }()); - - // Reusable objects for temporary values - var T = []; - (function () { - for (var i = 0; i < 25; i++) { - T[i] = X64Word.create(); - } - }()); - - /** - * SHA-3 hash algorithm. - */ - var SHA3 = C_algo.SHA3 = Hasher.extend({ - /** - * Configuration options. - * - * @property {number} outputLength - * The desired number of bits in the output hash. - * Only values permitted are: 224, 256, 384, 512. - * Default: 512 - */ - cfg: Hasher.cfg.extend({ - outputLength: 512 - }), - - _doReset: function () { - var state = this._state = [] - for (var i = 0; i < 25; i++) { - state[i] = new X64Word.init(); - } - - this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; - }, - - _doProcessBlock: function (M, offset) { - // Shortcuts - var state = this._state; - var nBlockSizeLanes = this.blockSize / 2; - - // Absorb - for (var i = 0; i < nBlockSizeLanes; i++) { - // Shortcuts - var M2i = M[offset + 2 * i]; - var M2i1 = M[offset + 2 * i + 1]; - - // Swap endian - M2i = ( - (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | - (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) - ); - M2i1 = ( - (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | - (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) - ); - - // Absorb message into state - var lane = state[i]; - lane.high ^= M2i1; - lane.low ^= M2i; - } - - // Rounds - for (var round = 0; round < 24; round++) { - // Theta - for (var x = 0; x < 5; x++) { - // Mix column lanes - var tMsw = 0, tLsw = 0; - for (var y = 0; y < 5; y++) { - var lane = state[x + 5 * y]; - tMsw ^= lane.high; - tLsw ^= lane.low; - } - - // Temporary values - var Tx = T[x]; - Tx.high = tMsw; - Tx.low = tLsw; - } - for (var x = 0; x < 5; x++) { - // Shortcuts - var Tx4 = T[(x + 4) % 5]; - var Tx1 = T[(x + 1) % 5]; - var Tx1Msw = Tx1.high; - var Tx1Lsw = Tx1.low; - - // Mix surrounding columns - var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); - var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); - for (var y = 0; y < 5; y++) { - var lane = state[x + 5 * y]; - lane.high ^= tMsw; - lane.low ^= tLsw; - } - } - - // Rho Pi - for (var laneIndex = 1; laneIndex < 25; laneIndex++) { - // Shortcuts - var lane = state[laneIndex]; - var laneMsw = lane.high; - var laneLsw = lane.low; - var rhoOffset = RHO_OFFSETS[laneIndex]; - - // Rotate lanes - if (rhoOffset < 32) { - var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); - var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); - } else /* if (rhoOffset >= 32) */ { - var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); - var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); - } - - // Transpose lanes - var TPiLane = T[PI_INDEXES[laneIndex]]; - TPiLane.high = tMsw; - TPiLane.low = tLsw; - } - - // Rho pi at x = y = 0 - var T0 = T[0]; - var state0 = state[0]; - T0.high = state0.high; - T0.low = state0.low; - - // Chi - for (var x = 0; x < 5; x++) { - for (var y = 0; y < 5; y++) { - // Shortcuts - var laneIndex = x + 5 * y; - var lane = state[laneIndex]; - var TLane = T[laneIndex]; - var Tx1Lane = T[((x + 1) % 5) + 5 * y]; - var Tx2Lane = T[((x + 2) % 5) + 5 * y]; - - // Mix rows - lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); - lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); - } - } - - // Iota - var lane = state[0]; - var roundConstant = ROUND_CONSTANTS[round]; - lane.high ^= roundConstant.high; - lane.low ^= roundConstant.low;; - } - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - var blockSizeBits = this.blockSize * 32; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); - dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; - data.sigBytes = dataWords.length * 4; - - // Hash final blocks - this._process(); - - // Shortcuts - var state = this._state; - var outputLengthBytes = this.cfg.outputLength / 8; - var outputLengthLanes = outputLengthBytes / 8; - - // Squeeze - var hashWords = []; - for (var i = 0; i < outputLengthLanes; i++) { - // Shortcuts - var lane = state[i]; - var laneMsw = lane.high; - var laneLsw = lane.low; - - // Swap endian - laneMsw = ( - (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | - (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) - ); - laneLsw = ( - (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | - (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) - ); - - // Squeeze state to retrieve hash - hashWords.push(laneLsw); - hashWords.push(laneMsw); - } - - // Return final computed hash - return new WordArray.init(hashWords, outputLengthBytes); - }, - - clone: function () { - var clone = Hasher.clone.call(this); - - var state = clone._state = this._state.slice(0); - for (var i = 0; i < 25; i++) { - state[i] = state[i].clone(); - } - - return clone; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA3('message'); - * var hash = CryptoJS.SHA3(wordArray); - */ - C.SHA3 = Hasher._createHelper(SHA3); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA3(message, key); - */ - C.HmacSHA3 = Hasher._createHmacHelper(SHA3); - }(Math)); - - - return CryptoJS.SHA3; - -})); -},{"./core":53,"./x64-core":84}],81:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./x64-core", "./sha512"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_x64 = C.x64; - var X64Word = C_x64.Word; - var X64WordArray = C_x64.WordArray; - var C_algo = C.algo; - var SHA512 = C_algo.SHA512; - - /** - * SHA-384 hash algorithm. - */ - var SHA384 = C_algo.SHA384 = SHA512.extend({ - _doReset: function () { - this._hash = new X64WordArray.init([ - new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), - new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), - new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), - new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) - ]); - }, - - _doFinalize: function () { - var hash = SHA512._doFinalize.call(this); - - hash.sigBytes -= 16; - - return hash; - } - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA384('message'); - * var hash = CryptoJS.SHA384(wordArray); - */ - C.SHA384 = SHA512._createHelper(SHA384); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA384(message, key); - */ - C.HmacSHA384 = SHA512._createHmacHelper(SHA384); - }()); - - - return CryptoJS.SHA384; - -})); -},{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./x64-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./x64-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var Hasher = C_lib.Hasher; - var C_x64 = C.x64; - var X64Word = C_x64.Word; - var X64WordArray = C_x64.WordArray; - var C_algo = C.algo; - - function X64Word_create() { - return X64Word.create.apply(X64Word, arguments); - } - - // Constants - var K = [ - X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), - X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), - X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), - X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), - X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), - X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), - X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), - X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), - X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), - X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), - X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), - X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), - X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), - X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), - X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), - X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), - X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), - X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), - X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), - X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), - X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), - X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), - X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), - X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), - X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), - X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), - X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), - X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), - X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), - X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), - X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), - X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), - X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), - X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), - X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), - X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), - X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), - X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), - X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), - X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) - ]; - - // Reusable objects - var W = []; - (function () { - for (var i = 0; i < 80; i++) { - W[i] = X64Word_create(); - } - }()); - - /** - * SHA-512 hash algorithm. - */ - var SHA512 = C_algo.SHA512 = Hasher.extend({ - _doReset: function () { - this._hash = new X64WordArray.init([ - new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), - new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), - new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), - new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) - ]); - }, - - _doProcessBlock: function (M, offset) { - // Shortcuts - var H = this._hash.words; - - var H0 = H[0]; - var H1 = H[1]; - var H2 = H[2]; - var H3 = H[3]; - var H4 = H[4]; - var H5 = H[5]; - var H6 = H[6]; - var H7 = H[7]; - - var H0h = H0.high; - var H0l = H0.low; - var H1h = H1.high; - var H1l = H1.low; - var H2h = H2.high; - var H2l = H2.low; - var H3h = H3.high; - var H3l = H3.low; - var H4h = H4.high; - var H4l = H4.low; - var H5h = H5.high; - var H5l = H5.low; - var H6h = H6.high; - var H6l = H6.low; - var H7h = H7.high; - var H7l = H7.low; - - // Working variables - var ah = H0h; - var al = H0l; - var bh = H1h; - var bl = H1l; - var ch = H2h; - var cl = H2l; - var dh = H3h; - var dl = H3l; - var eh = H4h; - var el = H4l; - var fh = H5h; - var fl = H5l; - var gh = H6h; - var gl = H6l; - var hh = H7h; - var hl = H7l; - - // Rounds - for (var i = 0; i < 80; i++) { - // Shortcut - var Wi = W[i]; - - // Extend message - if (i < 16) { - var Wih = Wi.high = M[offset + i * 2] | 0; - var Wil = Wi.low = M[offset + i * 2 + 1] | 0; - } else { - // Gamma0 - var gamma0x = W[i - 15]; - var gamma0xh = gamma0x.high; - var gamma0xl = gamma0x.low; - var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); - var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); - - // Gamma1 - var gamma1x = W[i - 2]; - var gamma1xh = gamma1x.high; - var gamma1xl = gamma1x.low; - var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); - var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); - - // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] - var Wi7 = W[i - 7]; - var Wi7h = Wi7.high; - var Wi7l = Wi7.low; - - var Wi16 = W[i - 16]; - var Wi16h = Wi16.high; - var Wi16l = Wi16.low; - - var Wil = gamma0l + Wi7l; - var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); - var Wil = Wil + gamma1l; - var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); - var Wil = Wil + Wi16l; - var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); - - Wi.high = Wih; - Wi.low = Wil; - } - - var chh = (eh & fh) ^ (~eh & gh); - var chl = (el & fl) ^ (~el & gl); - var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); - var majl = (al & bl) ^ (al & cl) ^ (bl & cl); - - var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); - var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); - var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); - var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); - - // t1 = h + sigma1 + ch + K[i] + W[i] - var Ki = K[i]; - var Kih = Ki.high; - var Kil = Ki.low; - - var t1l = hl + sigma1l; - var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); - var t1l = t1l + chl; - var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); - var t1l = t1l + Kil; - var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); - var t1l = t1l + Wil; - var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); - - // t2 = sigma0 + maj - var t2l = sigma0l + majl; - var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); - - // Update working variables - hh = gh; - hl = gl; - gh = fh; - gl = fl; - fh = eh; - fl = el; - el = (dl + t1l) | 0; - eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; - dh = ch; - dl = cl; - ch = bh; - cl = bl; - bh = ah; - bl = al; - al = (t1l + t2l) | 0; - ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; - } - - // Intermediate hash value - H0l = H0.low = (H0l + al); - H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); - H1l = H1.low = (H1l + bl); - H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); - H2l = H2.low = (H2l + cl); - H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); - H3l = H3.low = (H3l + dl); - H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); - H4l = H4.low = (H4l + el); - H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); - H5l = H5.low = (H5l + fl); - H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); - H6l = H6.low = (H6l + gl); - H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); - H7l = H7.low = (H7l + hl); - H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); - }, - - _doFinalize: function () { - // Shortcuts - var data = this._data; - var dataWords = data.words; - - var nBitsTotal = this._nDataBytes * 8; - var nBitsLeft = data.sigBytes * 8; - - // Add padding - dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); - dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); - dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; - data.sigBytes = dataWords.length * 4; - - // Hash final blocks - this._process(); - - // Convert hash to 32-bit word array before returning - var hash = this._hash.toX32(); - - // Return final computed hash - return hash; - }, - - clone: function () { - var clone = Hasher.clone.call(this); - clone._hash = this._hash.clone(); - - return clone; - }, - - blockSize: 1024/32 - }); - - /** - * Shortcut function to the hasher's object interface. - * - * @param {WordArray|string} message The message to hash. - * - * @return {WordArray} The hash. - * - * @static - * - * @example - * - * var hash = CryptoJS.SHA512('message'); - * var hash = CryptoJS.SHA512(wordArray); - */ - C.SHA512 = Hasher._createHelper(SHA512); - - /** - * Shortcut function to the HMAC's object interface. - * - * @param {WordArray|string} message The message to hash. - * @param {WordArray|string} key The secret key. - * - * @return {WordArray} The HMAC. - * - * @static - * - * @example - * - * var hmac = CryptoJS.HmacSHA512(message, key); - */ - C.HmacSHA512 = Hasher._createHmacHelper(SHA512); - }()); - - - return CryptoJS.SHA512; - -})); -},{"./core":53,"./x64-core":84}],83:[function(require,module,exports){ -;(function (root, factory, undef) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function () { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var WordArray = C_lib.WordArray; - var BlockCipher = C_lib.BlockCipher; - var C_algo = C.algo; - - // Permuted Choice 1 constants - var PC1 = [ - 57, 49, 41, 33, 25, 17, 9, 1, - 58, 50, 42, 34, 26, 18, 10, 2, - 59, 51, 43, 35, 27, 19, 11, 3, - 60, 52, 44, 36, 63, 55, 47, 39, - 31, 23, 15, 7, 62, 54, 46, 38, - 30, 22, 14, 6, 61, 53, 45, 37, - 29, 21, 13, 5, 28, 20, 12, 4 - ]; - - // Permuted Choice 2 constants - var PC2 = [ - 14, 17, 11, 24, 1, 5, - 3, 28, 15, 6, 21, 10, - 23, 19, 12, 4, 26, 8, - 16, 7, 27, 20, 13, 2, - 41, 52, 31, 37, 47, 55, - 30, 40, 51, 45, 33, 48, - 44, 49, 39, 56, 34, 53, - 46, 42, 50, 36, 29, 32 - ]; - - // Cumulative bit shift constants - var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; - - // SBOXes and round permutation constants - var SBOX_P = [ - { - 0x0: 0x808200, - 0x10000000: 0x8000, - 0x20000000: 0x808002, - 0x30000000: 0x2, - 0x40000000: 0x200, - 0x50000000: 0x808202, - 0x60000000: 0x800202, - 0x70000000: 0x800000, - 0x80000000: 0x202, - 0x90000000: 0x800200, - 0xa0000000: 0x8200, - 0xb0000000: 0x808000, - 0xc0000000: 0x8002, - 0xd0000000: 0x800002, - 0xe0000000: 0x0, - 0xf0000000: 0x8202, - 0x8000000: 0x0, - 0x18000000: 0x808202, - 0x28000000: 0x8202, - 0x38000000: 0x8000, - 0x48000000: 0x808200, - 0x58000000: 0x200, - 0x68000000: 0x808002, - 0x78000000: 0x2, - 0x88000000: 0x800200, - 0x98000000: 0x8200, - 0xa8000000: 0x808000, - 0xb8000000: 0x800202, - 0xc8000000: 0x800002, - 0xd8000000: 0x8002, - 0xe8000000: 0x202, - 0xf8000000: 0x800000, - 0x1: 0x8000, - 0x10000001: 0x2, - 0x20000001: 0x808200, - 0x30000001: 0x800000, - 0x40000001: 0x808002, - 0x50000001: 0x8200, - 0x60000001: 0x200, - 0x70000001: 0x800202, - 0x80000001: 0x808202, - 0x90000001: 0x808000, - 0xa0000001: 0x800002, - 0xb0000001: 0x8202, - 0xc0000001: 0x202, - 0xd0000001: 0x800200, - 0xe0000001: 0x8002, - 0xf0000001: 0x0, - 0x8000001: 0x808202, - 0x18000001: 0x808000, - 0x28000001: 0x800000, - 0x38000001: 0x200, - 0x48000001: 0x8000, - 0x58000001: 0x800002, - 0x68000001: 0x2, - 0x78000001: 0x8202, - 0x88000001: 0x8002, - 0x98000001: 0x800202, - 0xa8000001: 0x202, - 0xb8000001: 0x808200, - 0xc8000001: 0x800200, - 0xd8000001: 0x0, - 0xe8000001: 0x8200, - 0xf8000001: 0x808002 - }, - { - 0x0: 0x40084010, - 0x1000000: 0x4000, - 0x2000000: 0x80000, - 0x3000000: 0x40080010, - 0x4000000: 0x40000010, - 0x5000000: 0x40084000, - 0x6000000: 0x40004000, - 0x7000000: 0x10, - 0x8000000: 0x84000, - 0x9000000: 0x40004010, - 0xa000000: 0x40000000, - 0xb000000: 0x84010, - 0xc000000: 0x80010, - 0xd000000: 0x0, - 0xe000000: 0x4010, - 0xf000000: 0x40080000, - 0x800000: 0x40004000, - 0x1800000: 0x84010, - 0x2800000: 0x10, - 0x3800000: 0x40004010, - 0x4800000: 0x40084010, - 0x5800000: 0x40000000, - 0x6800000: 0x80000, - 0x7800000: 0x40080010, - 0x8800000: 0x80010, - 0x9800000: 0x0, - 0xa800000: 0x4000, - 0xb800000: 0x40080000, - 0xc800000: 0x40000010, - 0xd800000: 0x84000, - 0xe800000: 0x40084000, - 0xf800000: 0x4010, - 0x10000000: 0x0, - 0x11000000: 0x40080010, - 0x12000000: 0x40004010, - 0x13000000: 0x40084000, - 0x14000000: 0x40080000, - 0x15000000: 0x10, - 0x16000000: 0x84010, - 0x17000000: 0x4000, - 0x18000000: 0x4010, - 0x19000000: 0x80000, - 0x1a000000: 0x80010, - 0x1b000000: 0x40000010, - 0x1c000000: 0x84000, - 0x1d000000: 0x40004000, - 0x1e000000: 0x40000000, - 0x1f000000: 0x40084010, - 0x10800000: 0x84010, - 0x11800000: 0x80000, - 0x12800000: 0x40080000, - 0x13800000: 0x4000, - 0x14800000: 0x40004000, - 0x15800000: 0x40084010, - 0x16800000: 0x10, - 0x17800000: 0x40000000, - 0x18800000: 0x40084000, - 0x19800000: 0x40000010, - 0x1a800000: 0x40004010, - 0x1b800000: 0x80010, - 0x1c800000: 0x0, - 0x1d800000: 0x4010, - 0x1e800000: 0x40080010, - 0x1f800000: 0x84000 - }, - { - 0x0: 0x104, - 0x100000: 0x0, - 0x200000: 0x4000100, - 0x300000: 0x10104, - 0x400000: 0x10004, - 0x500000: 0x4000004, - 0x600000: 0x4010104, - 0x700000: 0x4010000, - 0x800000: 0x4000000, - 0x900000: 0x4010100, - 0xa00000: 0x10100, - 0xb00000: 0x4010004, - 0xc00000: 0x4000104, - 0xd00000: 0x10000, - 0xe00000: 0x4, - 0xf00000: 0x100, - 0x80000: 0x4010100, - 0x180000: 0x4010004, - 0x280000: 0x0, - 0x380000: 0x4000100, - 0x480000: 0x4000004, - 0x580000: 0x10000, - 0x680000: 0x10004, - 0x780000: 0x104, - 0x880000: 0x4, - 0x980000: 0x100, - 0xa80000: 0x4010000, - 0xb80000: 0x10104, - 0xc80000: 0x10100, - 0xd80000: 0x4000104, - 0xe80000: 0x4010104, - 0xf80000: 0x4000000, - 0x1000000: 0x4010100, - 0x1100000: 0x10004, - 0x1200000: 0x10000, - 0x1300000: 0x4000100, - 0x1400000: 0x100, - 0x1500000: 0x4010104, - 0x1600000: 0x4000004, - 0x1700000: 0x0, - 0x1800000: 0x4000104, - 0x1900000: 0x4000000, - 0x1a00000: 0x4, - 0x1b00000: 0x10100, - 0x1c00000: 0x4010000, - 0x1d00000: 0x104, - 0x1e00000: 0x10104, - 0x1f00000: 0x4010004, - 0x1080000: 0x4000000, - 0x1180000: 0x104, - 0x1280000: 0x4010100, - 0x1380000: 0x0, - 0x1480000: 0x10004, - 0x1580000: 0x4000100, - 0x1680000: 0x100, - 0x1780000: 0x4010004, - 0x1880000: 0x10000, - 0x1980000: 0x4010104, - 0x1a80000: 0x10104, - 0x1b80000: 0x4000004, - 0x1c80000: 0x4000104, - 0x1d80000: 0x4010000, - 0x1e80000: 0x4, - 0x1f80000: 0x10100 - }, - { - 0x0: 0x80401000, - 0x10000: 0x80001040, - 0x20000: 0x401040, - 0x30000: 0x80400000, - 0x40000: 0x0, - 0x50000: 0x401000, - 0x60000: 0x80000040, - 0x70000: 0x400040, - 0x80000: 0x80000000, - 0x90000: 0x400000, - 0xa0000: 0x40, - 0xb0000: 0x80001000, - 0xc0000: 0x80400040, - 0xd0000: 0x1040, - 0xe0000: 0x1000, - 0xf0000: 0x80401040, - 0x8000: 0x80001040, - 0x18000: 0x40, - 0x28000: 0x80400040, - 0x38000: 0x80001000, - 0x48000: 0x401000, - 0x58000: 0x80401040, - 0x68000: 0x0, - 0x78000: 0x80400000, - 0x88000: 0x1000, - 0x98000: 0x80401000, - 0xa8000: 0x400000, - 0xb8000: 0x1040, - 0xc8000: 0x80000000, - 0xd8000: 0x400040, - 0xe8000: 0x401040, - 0xf8000: 0x80000040, - 0x100000: 0x400040, - 0x110000: 0x401000, - 0x120000: 0x80000040, - 0x130000: 0x0, - 0x140000: 0x1040, - 0x150000: 0x80400040, - 0x160000: 0x80401000, - 0x170000: 0x80001040, - 0x180000: 0x80401040, - 0x190000: 0x80000000, - 0x1a0000: 0x80400000, - 0x1b0000: 0x401040, - 0x1c0000: 0x80001000, - 0x1d0000: 0x400000, - 0x1e0000: 0x40, - 0x1f0000: 0x1000, - 0x108000: 0x80400000, - 0x118000: 0x80401040, - 0x128000: 0x0, - 0x138000: 0x401000, - 0x148000: 0x400040, - 0x158000: 0x80000000, - 0x168000: 0x80001040, - 0x178000: 0x40, - 0x188000: 0x80000040, - 0x198000: 0x1000, - 0x1a8000: 0x80001000, - 0x1b8000: 0x80400040, - 0x1c8000: 0x1040, - 0x1d8000: 0x80401000, - 0x1e8000: 0x400000, - 0x1f8000: 0x401040 - }, - { - 0x0: 0x80, - 0x1000: 0x1040000, - 0x2000: 0x40000, - 0x3000: 0x20000000, - 0x4000: 0x20040080, - 0x5000: 0x1000080, - 0x6000: 0x21000080, - 0x7000: 0x40080, - 0x8000: 0x1000000, - 0x9000: 0x20040000, - 0xa000: 0x20000080, - 0xb000: 0x21040080, - 0xc000: 0x21040000, - 0xd000: 0x0, - 0xe000: 0x1040080, - 0xf000: 0x21000000, - 0x800: 0x1040080, - 0x1800: 0x21000080, - 0x2800: 0x80, - 0x3800: 0x1040000, - 0x4800: 0x40000, - 0x5800: 0x20040080, - 0x6800: 0x21040000, - 0x7800: 0x20000000, - 0x8800: 0x20040000, - 0x9800: 0x0, - 0xa800: 0x21040080, - 0xb800: 0x1000080, - 0xc800: 0x20000080, - 0xd800: 0x21000000, - 0xe800: 0x1000000, - 0xf800: 0x40080, - 0x10000: 0x40000, - 0x11000: 0x80, - 0x12000: 0x20000000, - 0x13000: 0x21000080, - 0x14000: 0x1000080, - 0x15000: 0x21040000, - 0x16000: 0x20040080, - 0x17000: 0x1000000, - 0x18000: 0x21040080, - 0x19000: 0x21000000, - 0x1a000: 0x1040000, - 0x1b000: 0x20040000, - 0x1c000: 0x40080, - 0x1d000: 0x20000080, - 0x1e000: 0x0, - 0x1f000: 0x1040080, - 0x10800: 0x21000080, - 0x11800: 0x1000000, - 0x12800: 0x1040000, - 0x13800: 0x20040080, - 0x14800: 0x20000000, - 0x15800: 0x1040080, - 0x16800: 0x80, - 0x17800: 0x21040000, - 0x18800: 0x40080, - 0x19800: 0x21040080, - 0x1a800: 0x0, - 0x1b800: 0x21000000, - 0x1c800: 0x1000080, - 0x1d800: 0x40000, - 0x1e800: 0x20040000, - 0x1f800: 0x20000080 - }, - { - 0x0: 0x10000008, - 0x100: 0x2000, - 0x200: 0x10200000, - 0x300: 0x10202008, - 0x400: 0x10002000, - 0x500: 0x200000, - 0x600: 0x200008, - 0x700: 0x10000000, - 0x800: 0x0, - 0x900: 0x10002008, - 0xa00: 0x202000, - 0xb00: 0x8, - 0xc00: 0x10200008, - 0xd00: 0x202008, - 0xe00: 0x2008, - 0xf00: 0x10202000, - 0x80: 0x10200000, - 0x180: 0x10202008, - 0x280: 0x8, - 0x380: 0x200000, - 0x480: 0x202008, - 0x580: 0x10000008, - 0x680: 0x10002000, - 0x780: 0x2008, - 0x880: 0x200008, - 0x980: 0x2000, - 0xa80: 0x10002008, - 0xb80: 0x10200008, - 0xc80: 0x0, - 0xd80: 0x10202000, - 0xe80: 0x202000, - 0xf80: 0x10000000, - 0x1000: 0x10002000, - 0x1100: 0x10200008, - 0x1200: 0x10202008, - 0x1300: 0x2008, - 0x1400: 0x200000, - 0x1500: 0x10000000, - 0x1600: 0x10000008, - 0x1700: 0x202000, - 0x1800: 0x202008, - 0x1900: 0x0, - 0x1a00: 0x8, - 0x1b00: 0x10200000, - 0x1c00: 0x2000, - 0x1d00: 0x10002008, - 0x1e00: 0x10202000, - 0x1f00: 0x200008, - 0x1080: 0x8, - 0x1180: 0x202000, - 0x1280: 0x200000, - 0x1380: 0x10000008, - 0x1480: 0x10002000, - 0x1580: 0x2008, - 0x1680: 0x10202008, - 0x1780: 0x10200000, - 0x1880: 0x10202000, - 0x1980: 0x10200008, - 0x1a80: 0x2000, - 0x1b80: 0x202008, - 0x1c80: 0x200008, - 0x1d80: 0x0, - 0x1e80: 0x10000000, - 0x1f80: 0x10002008 - }, - { - 0x0: 0x100000, - 0x10: 0x2000401, - 0x20: 0x400, - 0x30: 0x100401, - 0x40: 0x2100401, - 0x50: 0x0, - 0x60: 0x1, - 0x70: 0x2100001, - 0x80: 0x2000400, - 0x90: 0x100001, - 0xa0: 0x2000001, - 0xb0: 0x2100400, - 0xc0: 0x2100000, - 0xd0: 0x401, - 0xe0: 0x100400, - 0xf0: 0x2000000, - 0x8: 0x2100001, - 0x18: 0x0, - 0x28: 0x2000401, - 0x38: 0x2100400, - 0x48: 0x100000, - 0x58: 0x2000001, - 0x68: 0x2000000, - 0x78: 0x401, - 0x88: 0x100401, - 0x98: 0x2000400, - 0xa8: 0x2100000, - 0xb8: 0x100001, - 0xc8: 0x400, - 0xd8: 0x2100401, - 0xe8: 0x1, - 0xf8: 0x100400, - 0x100: 0x2000000, - 0x110: 0x100000, - 0x120: 0x2000401, - 0x130: 0x2100001, - 0x140: 0x100001, - 0x150: 0x2000400, - 0x160: 0x2100400, - 0x170: 0x100401, - 0x180: 0x401, - 0x190: 0x2100401, - 0x1a0: 0x100400, - 0x1b0: 0x1, - 0x1c0: 0x0, - 0x1d0: 0x2100000, - 0x1e0: 0x2000001, - 0x1f0: 0x400, - 0x108: 0x100400, - 0x118: 0x2000401, - 0x128: 0x2100001, - 0x138: 0x1, - 0x148: 0x2000000, - 0x158: 0x100000, - 0x168: 0x401, - 0x178: 0x2100400, - 0x188: 0x2000001, - 0x198: 0x2100000, - 0x1a8: 0x0, - 0x1b8: 0x2100401, - 0x1c8: 0x100401, - 0x1d8: 0x400, - 0x1e8: 0x2000400, - 0x1f8: 0x100001 - }, - { - 0x0: 0x8000820, - 0x1: 0x20000, - 0x2: 0x8000000, - 0x3: 0x20, - 0x4: 0x20020, - 0x5: 0x8020820, - 0x6: 0x8020800, - 0x7: 0x800, - 0x8: 0x8020000, - 0x9: 0x8000800, - 0xa: 0x20800, - 0xb: 0x8020020, - 0xc: 0x820, - 0xd: 0x0, - 0xe: 0x8000020, - 0xf: 0x20820, - 0x80000000: 0x800, - 0x80000001: 0x8020820, - 0x80000002: 0x8000820, - 0x80000003: 0x8000000, - 0x80000004: 0x8020000, - 0x80000005: 0x20800, - 0x80000006: 0x20820, - 0x80000007: 0x20, - 0x80000008: 0x8000020, - 0x80000009: 0x820, - 0x8000000a: 0x20020, - 0x8000000b: 0x8020800, - 0x8000000c: 0x0, - 0x8000000d: 0x8020020, - 0x8000000e: 0x8000800, - 0x8000000f: 0x20000, - 0x10: 0x20820, - 0x11: 0x8020800, - 0x12: 0x20, - 0x13: 0x800, - 0x14: 0x8000800, - 0x15: 0x8000020, - 0x16: 0x8020020, - 0x17: 0x20000, - 0x18: 0x0, - 0x19: 0x20020, - 0x1a: 0x8020000, - 0x1b: 0x8000820, - 0x1c: 0x8020820, - 0x1d: 0x20800, - 0x1e: 0x820, - 0x1f: 0x8000000, - 0x80000010: 0x20000, - 0x80000011: 0x800, - 0x80000012: 0x8020020, - 0x80000013: 0x20820, - 0x80000014: 0x20, - 0x80000015: 0x8020000, - 0x80000016: 0x8000000, - 0x80000017: 0x8000820, - 0x80000018: 0x8020820, - 0x80000019: 0x8000020, - 0x8000001a: 0x8000800, - 0x8000001b: 0x0, - 0x8000001c: 0x20800, - 0x8000001d: 0x820, - 0x8000001e: 0x20020, - 0x8000001f: 0x8020800 - } - ]; - - // Masks that select the SBOX input - var SBOX_MASK = [ - 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, - 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f - ]; - - /** - * DES block cipher algorithm. - */ - var DES = C_algo.DES = BlockCipher.extend({ - _doReset: function () { - // Shortcuts - var key = this._key; - var keyWords = key.words; - - // Select 56 bits according to PC1 - var keyBits = []; - for (var i = 0; i < 56; i++) { - var keyBitPos = PC1[i] - 1; - keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; - } - - // Assemble 16 subkeys - var subKeys = this._subKeys = []; - for (var nSubKey = 0; nSubKey < 16; nSubKey++) { - // Create subkey - var subKey = subKeys[nSubKey] = []; - - // Shortcut - var bitShift = BIT_SHIFTS[nSubKey]; - - // Select 48 bits according to PC2 - for (var i = 0; i < 24; i++) { - // Select from the left 28 key bits - subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); - - // Select from the right 28 key bits - subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); - } - - // Since each subkey is applied to an expanded 32-bit input, - // the subkey can be broken into 8 values scaled to 32-bits, - // which allows the key to be used without expansion - subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); - for (var i = 1; i < 7; i++) { - subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); - } - subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); - } - - // Compute inverse subkeys - var invSubKeys = this._invSubKeys = []; - for (var i = 0; i < 16; i++) { - invSubKeys[i] = subKeys[15 - i]; - } - }, - - encryptBlock: function (M, offset) { - this._doCryptBlock(M, offset, this._subKeys); - }, - - decryptBlock: function (M, offset) { - this._doCryptBlock(M, offset, this._invSubKeys); - }, - - _doCryptBlock: function (M, offset, subKeys) { - // Get input - this._lBlock = M[offset]; - this._rBlock = M[offset + 1]; - - // Initial permutation - exchangeLR.call(this, 4, 0x0f0f0f0f); - exchangeLR.call(this, 16, 0x0000ffff); - exchangeRL.call(this, 2, 0x33333333); - exchangeRL.call(this, 8, 0x00ff00ff); - exchangeLR.call(this, 1, 0x55555555); - - // Rounds - for (var round = 0; round < 16; round++) { - // Shortcuts - var subKey = subKeys[round]; - var lBlock = this._lBlock; - var rBlock = this._rBlock; - - // Feistel function - var f = 0; - for (var i = 0; i < 8; i++) { - f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; - } - this._lBlock = rBlock; - this._rBlock = lBlock ^ f; - } - - // Undo swap from last round - var t = this._lBlock; - this._lBlock = this._rBlock; - this._rBlock = t; - - // Final permutation - exchangeLR.call(this, 1, 0x55555555); - exchangeRL.call(this, 8, 0x00ff00ff); - exchangeRL.call(this, 2, 0x33333333); - exchangeLR.call(this, 16, 0x0000ffff); - exchangeLR.call(this, 4, 0x0f0f0f0f); - - // Set output - M[offset] = this._lBlock; - M[offset + 1] = this._rBlock; - }, - - keySize: 64/32, - - ivSize: 64/32, - - blockSize: 64/32 - }); - - // Swap bits across the left and right words - function exchangeLR(offset, mask) { - var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; - this._rBlock ^= t; - this._lBlock ^= t << offset; - } - - function exchangeRL(offset, mask) { - var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; - this._lBlock ^= t; - this._rBlock ^= t << offset; - } - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); - * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); - */ - C.DES = BlockCipher._createHelper(DES); - - /** - * Triple-DES block cipher algorithm. - */ - var TripleDES = C_algo.TripleDES = BlockCipher.extend({ - _doReset: function () { - // Shortcuts - var key = this._key; - var keyWords = key.words; - - // Create DES instances - this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); - this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); - this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); - }, - - encryptBlock: function (M, offset) { - this._des1.encryptBlock(M, offset); - this._des2.decryptBlock(M, offset); - this._des3.encryptBlock(M, offset); - }, - - decryptBlock: function (M, offset) { - this._des3.decryptBlock(M, offset); - this._des2.encryptBlock(M, offset); - this._des1.decryptBlock(M, offset); - }, - - keySize: 192/32, - - ivSize: 64/32, - - blockSize: 64/32 - }); - - /** - * Shortcut functions to the cipher's object interface. - * - * @example - * - * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); - * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); - */ - C.TripleDES = BlockCipher._createHelper(TripleDES); - }()); - - - return CryptoJS.TripleDES; - -})); -},{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){ -;(function (root, factory) { - if (typeof exports === "object") { - // CommonJS - module.exports = exports = factory(require("./core")); - } - else if (typeof define === "function" && define.amd) { - // AMD - define(["./core"], factory); - } - else { - // Global (browser) - factory(root.CryptoJS); - } -}(this, function (CryptoJS) { - - (function (undefined) { - // Shortcuts - var C = CryptoJS; - var C_lib = C.lib; - var Base = C_lib.Base; - var X32WordArray = C_lib.WordArray; - - /** - * x64 namespace. - */ - var C_x64 = C.x64 = {}; - - /** - * A 64-bit word. - */ - var X64Word = C_x64.Word = Base.extend({ - /** - * Initializes a newly created 64-bit word. - * - * @param {number} high The high 32 bits. - * @param {number} low The low 32 bits. - * - * @example - * - * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); - */ - init: function (high, low) { - this.high = high; - this.low = low; - } - - /** - * Bitwise NOTs this word. - * - * @return {X64Word} A new x64-Word object after negating. - * - * @example - * - * var negated = x64Word.not(); - */ - // not: function () { - // var high = ~this.high; - // var low = ~this.low; - - // return X64Word.create(high, low); - // }, - - /** - * Bitwise ANDs this word with the passed word. - * - * @param {X64Word} word The x64-Word to AND with this word. - * - * @return {X64Word} A new x64-Word object after ANDing. - * - * @example - * - * var anded = x64Word.and(anotherX64Word); - */ - // and: function (word) { - // var high = this.high & word.high; - // var low = this.low & word.low; - - // return X64Word.create(high, low); - // }, - - /** - * Bitwise ORs this word with the passed word. - * - * @param {X64Word} word The x64-Word to OR with this word. - * - * @return {X64Word} A new x64-Word object after ORing. - * - * @example - * - * var ored = x64Word.or(anotherX64Word); - */ - // or: function (word) { - // var high = this.high | word.high; - // var low = this.low | word.low; - - // return X64Word.create(high, low); - // }, - - /** - * Bitwise XORs this word with the passed word. - * - * @param {X64Word} word The x64-Word to XOR with this word. - * - * @return {X64Word} A new x64-Word object after XORing. - * - * @example - * - * var xored = x64Word.xor(anotherX64Word); - */ - // xor: function (word) { - // var high = this.high ^ word.high; - // var low = this.low ^ word.low; - - // return X64Word.create(high, low); - // }, - - /** - * Shifts this word n bits to the left. - * - * @param {number} n The number of bits to shift. - * - * @return {X64Word} A new x64-Word object after shifting. - * - * @example - * - * var shifted = x64Word.shiftL(25); - */ - // shiftL: function (n) { - // if (n < 32) { - // var high = (this.high << n) | (this.low >>> (32 - n)); - // var low = this.low << n; - // } else { - // var high = this.low << (n - 32); - // var low = 0; - // } - - // return X64Word.create(high, low); - // }, - - /** - * Shifts this word n bits to the right. - * - * @param {number} n The number of bits to shift. - * - * @return {X64Word} A new x64-Word object after shifting. - * - * @example - * - * var shifted = x64Word.shiftR(7); - */ - // shiftR: function (n) { - // if (n < 32) { - // var low = (this.low >>> n) | (this.high << (32 - n)); - // var high = this.high >>> n; - // } else { - // var low = this.high >>> (n - 32); - // var high = 0; - // } - - // return X64Word.create(high, low); - // }, - - /** - * Rotates this word n bits to the left. - * - * @param {number} n The number of bits to rotate. - * - * @return {X64Word} A new x64-Word object after rotating. - * - * @example - * - * var rotated = x64Word.rotL(25); - */ - // rotL: function (n) { - // return this.shiftL(n).or(this.shiftR(64 - n)); - // }, - - /** - * Rotates this word n bits to the right. - * - * @param {number} n The number of bits to rotate. - * - * @return {X64Word} A new x64-Word object after rotating. - * - * @example - * - * var rotated = x64Word.rotR(7); - */ - // rotR: function (n) { - // return this.shiftR(n).or(this.shiftL(64 - n)); - // }, - - /** - * Adds this word with the passed word. - * - * @param {X64Word} word The x64-Word to add with this word. - * - * @return {X64Word} A new x64-Word object after adding. - * - * @example - * - * var added = x64Word.add(anotherX64Word); - */ - // add: function (word) { - // var low = (this.low + word.low) | 0; - // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; - // var high = (this.high + word.high + carry) | 0; - - // return X64Word.create(high, low); - // } - }); - - /** - * An array of 64-bit words. - * - * @property {Array} words The array of CryptoJS.x64.Word objects. - * @property {number} sigBytes The number of significant bytes in this word array. - */ - var X64WordArray = C_x64.WordArray = Base.extend({ - /** - * Initializes a newly created word array. - * - * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. - * @param {number} sigBytes (Optional) The number of significant bytes in the words. - * - * @example - * - * var wordArray = CryptoJS.x64.WordArray.create(); - * - * var wordArray = CryptoJS.x64.WordArray.create([ - * CryptoJS.x64.Word.create(0x00010203, 0x04050607), - * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) - * ]); - * - * var wordArray = CryptoJS.x64.WordArray.create([ - * CryptoJS.x64.Word.create(0x00010203, 0x04050607), - * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) - * ], 10); - */ - init: function (words, sigBytes) { - words = this.words = words || []; - - if (sigBytes != undefined) { - this.sigBytes = sigBytes; - } else { - this.sigBytes = words.length * 8; - } - }, - - /** - * Converts this 64-bit word array to a 32-bit word array. - * - * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. - * - * @example - * - * var x32WordArray = x64WordArray.toX32(); - */ - toX32: function () { - // Shortcuts - var x64Words = this.words; - var x64WordsLength = x64Words.length; - - // Convert - var x32Words = []; - for (var i = 0; i < x64WordsLength; i++) { - var x64Word = x64Words[i]; - x32Words.push(x64Word.high); - x32Words.push(x64Word.low); - } - - return X32WordArray.create(x32Words, this.sigBytes); - }, - - /** - * Creates a copy of this word array. - * - * @return {X64WordArray} The clone. - * - * @example - * - * var clone = x64WordArray.clone(); - */ - clone: function () { - var clone = Base.clone.call(this); - - // Clone "words" array - var words = clone.words = this.words.slice(0); - - // Clone each X64Word object - var wordsLength = words.length; - for (var i = 0; i < wordsLength; i++) { - words[i] = words[i].clone(); - } - - return clone; - } - }); - }()); - - - return CryptoJS; - -})); -},{"./core":53}],85:[function(require,module,exports){ -/*! https://mths.be/utf8js v2.1.2 by @mathias */ -;(function(root) { - - // Detect free variables `exports` - var freeExports = typeof exports == 'object' && exports; - - // Detect free variable `module` - var freeModule = typeof module == 'object' && module && - module.exports == freeExports && module; - - // Detect free variable `global`, from Node.js or Browserified code, - // and use it as `root` - var freeGlobal = typeof global == 'object' && global; - if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { - root = freeGlobal; - } - - /*--------------------------------------------------------------------------*/ - - var stringFromCharCode = String.fromCharCode; - - // Taken from https://mths.be/punycode - function ucs2decode(string) { - var output = []; - var counter = 0; - var length = string.length; - var value; - var extra; - while (counter < length) { - value = string.charCodeAt(counter++); - if (value >= 0xD800 && value <= 0xDBFF && counter < length) { - // high surrogate, and there is a next character - extra = string.charCodeAt(counter++); - if ((extra & 0xFC00) == 0xDC00) { // low surrogate - output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); - } else { - // unmatched surrogate; only append this code unit, in case the next - // code unit is the high surrogate of a surrogate pair - output.push(value); - counter--; - } - } else { - output.push(value); - } - } - return output; - } - - // Taken from https://mths.be/punycode - function ucs2encode(array) { - var length = array.length; - var index = -1; - var value; - var output = ''; - while (++index < length) { - value = array[index]; - if (value > 0xFFFF) { - value -= 0x10000; - output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); - value = 0xDC00 | value & 0x3FF; - } - output += stringFromCharCode(value); - } - return output; - } - - function checkScalarValue(codePoint) { - if (codePoint >= 0xD800 && codePoint <= 0xDFFF) { - throw Error( - 'Lone surrogate U+' + codePoint.toString(16).toUpperCase() + - ' is not a scalar value' - ); - } - } - /*--------------------------------------------------------------------------*/ - - function createByte(codePoint, shift) { - return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80); - } - - function encodeCodePoint(codePoint) { - if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence - return stringFromCharCode(codePoint); - } - var symbol = ''; - if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence - symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0); - } - else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence - checkScalarValue(codePoint); - symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0); - symbol += createByte(codePoint, 6); - } - else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence - symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0); - symbol += createByte(codePoint, 12); - symbol += createByte(codePoint, 6); - } - symbol += stringFromCharCode((codePoint & 0x3F) | 0x80); - return symbol; - } - - function utf8encode(string) { - var codePoints = ucs2decode(string); - var length = codePoints.length; - var index = -1; - var codePoint; - var byteString = ''; - while (++index < length) { - codePoint = codePoints[index]; - byteString += encodeCodePoint(codePoint); - } - return byteString; - } - - /*--------------------------------------------------------------------------*/ - - function readContinuationByte() { - if (byteIndex >= byteCount) { - throw Error('Invalid byte index'); - } - - var continuationByte = byteArray[byteIndex] & 0xFF; - byteIndex++; - - if ((continuationByte & 0xC0) == 0x80) { - return continuationByte & 0x3F; - } - - // If we end up here, it’s not a continuation byte - throw Error('Invalid continuation byte'); - } - - function decodeSymbol() { - var byte1; - var byte2; - var byte3; - var byte4; - var codePoint; - - if (byteIndex > byteCount) { - throw Error('Invalid byte index'); - } - - if (byteIndex == byteCount) { - return false; - } - - // Read first byte - byte1 = byteArray[byteIndex] & 0xFF; - byteIndex++; - - // 1-byte sequence (no continuation bytes) - if ((byte1 & 0x80) == 0) { - return byte1; - } - - // 2-byte sequence - if ((byte1 & 0xE0) == 0xC0) { - byte2 = readContinuationByte(); - codePoint = ((byte1 & 0x1F) << 6) | byte2; - if (codePoint >= 0x80) { - return codePoint; - } else { - throw Error('Invalid continuation byte'); - } - } - - // 3-byte sequence (may include unpaired surrogates) - if ((byte1 & 0xF0) == 0xE0) { - byte2 = readContinuationByte(); - byte3 = readContinuationByte(); - codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3; - if (codePoint >= 0x0800) { - checkScalarValue(codePoint); - return codePoint; - } else { - throw Error('Invalid continuation byte'); - } - } - - // 4-byte sequence - if ((byte1 & 0xF8) == 0xF0) { - byte2 = readContinuationByte(); - byte3 = readContinuationByte(); - byte4 = readContinuationByte(); - codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) | - (byte3 << 0x06) | byte4; - if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) { - return codePoint; - } - } - - throw Error('Invalid UTF-8 detected'); - } - - var byteArray; - var byteCount; - var byteIndex; - function utf8decode(byteString) { - byteArray = ucs2decode(byteString); - byteCount = byteArray.length; - byteIndex = 0; - var codePoints = []; - var tmp; - while ((tmp = decodeSymbol()) !== false) { - codePoints.push(tmp); - } - return ucs2encode(codePoints); - } - - /*--------------------------------------------------------------------------*/ - - var utf8 = { - 'version': '2.1.2', - 'encode': utf8encode, - 'decode': utf8decode - }; - - // Some AMD build optimizers, like r.js, check for specific condition patterns - // like the following: - if ( - typeof define == 'function' && - typeof define.amd == 'object' && - define.amd - ) { - define(function() { - return utf8; - }); - } else if (freeExports && !freeExports.nodeType) { - if (freeModule) { // in Node.js or RingoJS v0.8.0+ - freeModule.exports = utf8; - } else { // in Narwhal or RingoJS v0.7.0- - var object = {}; - var hasOwnProperty = object.hasOwnProperty; - for (var key in utf8) { - hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]); - } - } - } else { // in Rhino or a web browser - root.utf8 = utf8; - } - -}(this)); - -},{}],86:[function(require,module,exports){ -module.exports = XMLHttpRequest; - -},{}],"bignumber.js":[function(require,module,exports){ -'use strict'; - -module.exports = BigNumber; // jshint ignore:line - - -},{}],"web3":[function(require,module,exports){ -var Web3 = require('./lib/web3'); - -// don't override global variable -if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') { - window.Web3 = Web3; -} - -module.exports = Web3; - -},{"./lib/web3":22}]},{},["web3"]) -//# sourceMappingURL=web3-light.js.map diff --git a/internal/jsre/jsre.go b/internal/jsre/jsre.go deleted file mode 100644 index 67319521f2e..00000000000 --- a/internal/jsre/jsre.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package jsre provides execution environment for JavaScript. -// nolint:errcheck -package jsre - -import ( - crand "crypto/rand" - "encoding/binary" - "fmt" - "io" - "io/ioutil" - "math/rand" - "time" - - "github.com/dop251/goja" - "github.com/ledgerwatch/erigon/common" -) - -// JSRE is a JS runtime environment embedding the goja interpreter. -// It provides helper functions to load code from files, run code snippets -// and bind native go objects to JS. -// -// The runtime runs all code on a dedicated event loop and does not expose the underlying -// goja runtime directly. To use the runtime, call JSRE.Do. When binding a Go function, -// use the Call type to gain access to the runtime. -type JSRE struct { - assetPath string - output io.Writer - evalQueue chan *evalReq - stopEventLoop chan bool - closed chan struct{} - vm *goja.Runtime -} - -// Call is the argument type of Go functions which are callable from JS. -type Call struct { - goja.FunctionCall - VM *goja.Runtime -} - -// jsTimer is a single timer instance with a callback function -type jsTimer struct { - timer *time.Timer - duration time.Duration - interval bool - call goja.FunctionCall -} - -// evalReq is a serialized vm execution request processed by runEventLoop. -type evalReq struct { - fn func(vm *goja.Runtime) - done chan bool -} - -// runtime must be stopped with Stop() after use and cannot be used after stopping -func New(assetPath string, output io.Writer) *JSRE { - re := &JSRE{ - assetPath: assetPath, - output: output, - closed: make(chan struct{}), - evalQueue: make(chan *evalReq), - stopEventLoop: make(chan bool), - vm: goja.New(), - } - go re.runEventLoop() - re.Set("loadScript", MakeCallback(re.vm, re.loadScript)) - re.Set("inspect", re.prettyPrintJS) - return re -} - -// randomSource returns a pseudo random value generator. -func randomSource() *rand.Rand { - bytes := make([]byte, 8) - seed := time.Now().UnixNano() - if _, err := crand.Read(bytes); err == nil { - seed = int64(binary.LittleEndian.Uint64(bytes)) - } - - src := rand.NewSource(seed) - return rand.New(src) -} - -// This function runs the main event loop from a goroutine that is started -// when JSRE is created. Use Stop() before exiting to properly stop it. -// The event loop processes vm access requests from the evalQueue in a -// serialized way and calls timer callback functions at the appropriate time. - -// Exported functions always access the vm through the event queue. You can -// call the functions of the goja vm directly to circumvent the queue. These -// functions should be used if and only if running a routine that was already -// called from JS through an RPC call. -func (re *JSRE) runEventLoop() { - defer close(re.closed) - - r := randomSource() - re.vm.SetRandSource(r.Float64) - - registry := map[*jsTimer]*jsTimer{} - ready := make(chan *jsTimer) - - newTimer := func(call goja.FunctionCall, interval bool) (*jsTimer, goja.Value) { - delay := call.Argument(1).ToInteger() - if 0 >= delay { - delay = 1 - } - timer := &jsTimer{ - duration: time.Duration(delay) * time.Millisecond, - call: call, - interval: interval, - } - registry[timer] = timer - - timer.timer = time.AfterFunc(timer.duration, func() { - ready <- timer - }) - - return timer, re.vm.ToValue(timer) - } - - setTimeout := func(call goja.FunctionCall) goja.Value { - _, value := newTimer(call, false) - return value - } - - setInterval := func(call goja.FunctionCall) goja.Value { - _, value := newTimer(call, true) - return value - } - - clearTimeout := func(call goja.FunctionCall) goja.Value { - timer := call.Argument(0).Export() - if timer, ok := timer.(*jsTimer); ok { - timer.timer.Stop() - delete(registry, timer) - } - return goja.Undefined() - } - re.vm.Set("_setTimeout", setTimeout) - re.vm.Set("_setInterval", setInterval) - re.vm.RunString(`var setTimeout = function(args) { - if (arguments.length < 1) { - throw TypeError("Failed to execute 'setTimeout': 1 argument required, but only 0 present."); - } - return _setTimeout.apply(this, arguments); - }`) - re.vm.RunString(`var setInterval = function(args) { - if (arguments.length < 1) { - throw TypeError("Failed to execute 'setInterval': 1 argument required, but only 0 present."); - } - return _setInterval.apply(this, arguments); - }`) - re.vm.Set("clearTimeout", clearTimeout) - re.vm.Set("clearInterval", clearTimeout) - - var waitForCallbacks bool - -loop: - for { - select { - case timer := <-ready: - // execute callback, remove/reschedule the timer - var arguments []interface{} - if len(timer.call.Arguments) > 2 { - tmp := timer.call.Arguments[2:] - arguments = make([]interface{}, 2+len(tmp)) - for i, value := range tmp { - arguments[i+2] = value - } - } else { - arguments = make([]interface{}, 1) - } - arguments[0] = timer.call.Arguments[0] - call, isFunc := goja.AssertFunction(timer.call.Arguments[0]) - if !isFunc { - panic(re.vm.ToValue("js error: timer/timeout callback is not a function")) - } - call(goja.Null(), timer.call.Arguments...) - - _, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it - if timer.interval && inreg { - timer.timer.Reset(timer.duration) - } else { - delete(registry, timer) - if waitForCallbacks && (len(registry) == 0) { - break loop - } - } - case req := <-re.evalQueue: - // run the code, send the result back - req.fn(re.vm) - close(req.done) - if waitForCallbacks && (len(registry) == 0) { - break loop - } - case waitForCallbacks = <-re.stopEventLoop: - if !waitForCallbacks || (len(registry) == 0) { - break loop - } - } - } - - for _, timer := range registry { - timer.timer.Stop() - delete(registry, timer) - } -} - -// Do executes the given function on the JS event loop. -func (re *JSRE) Do(fn func(*goja.Runtime)) { - done := make(chan bool) - req := &evalReq{fn, done} - re.evalQueue <- req - <-done -} - -// stops the event loop before exit, optionally waits for all timers to expire -func (re *JSRE) Stop(waitForCallbacks bool) { - select { - case <-re.closed: - case re.stopEventLoop <- waitForCallbacks: - <-re.closed - } -} - -// Exec(file) loads and runs the contents of a file -// if a relative path is given, the jsre's assetPath is used -func (re *JSRE) Exec(file string) error { - code, err := ioutil.ReadFile(common.AbsolutePath(re.assetPath, file)) - if err != nil { - return err - } - return re.Compile(file, string(code)) -} - -// Run runs a piece of JS code. -func (re *JSRE) Run(code string) (v goja.Value, err error) { - re.Do(func(vm *goja.Runtime) { v, err = vm.RunString(code) }) - return v, err -} - -// Set assigns value v to a variable in the JS environment. -func (re *JSRE) Set(ns string, v interface{}) (err error) { - re.Do(func(vm *goja.Runtime) { vm.Set(ns, v) }) - return err -} - -// MakeCallback turns the given function into a function that's callable by JS. -func MakeCallback(vm *goja.Runtime, fn func(Call) (goja.Value, error)) goja.Value { - return vm.ToValue(func(call goja.FunctionCall) goja.Value { - result, err := fn(Call{call, vm}) - if err != nil { - panic(vm.NewGoError(err)) - } - return result - }) -} - -// Evaluate executes code and pretty prints the result to the specified output stream. -func (re *JSRE) Evaluate(code string, w io.Writer) { - re.Do(func(vm *goja.Runtime) { - val, err := vm.RunString(code) - if err != nil { - prettyError(vm, err, w) - } else { - prettyPrint(vm, val, w) - } - fmt.Fprintln(w) - }) -} - -// Compile compiles and then runs a piece of JS code. -func (re *JSRE) Compile(filename string, src string) (err error) { - re.Do(func(vm *goja.Runtime) { _, err = compileAndRun(vm, filename, src) }) - return err -} - -// loadScript loads and executes a JS file. -func (re *JSRE) loadScript(call Call) (goja.Value, error) { - file := call.Argument(0).ToString().String() - file = common.AbsolutePath(re.assetPath, file) - source, err := ioutil.ReadFile(file) - if err != nil { - return nil, fmt.Errorf("could not read file %s: %v", file, err) - } - value, err := compileAndRun(re.vm, file, string(source)) - if err != nil { - return nil, fmt.Errorf("error while compiling or running script: %v", err) - } - return value, nil -} - -func compileAndRun(vm *goja.Runtime, filename string, src string) (goja.Value, error) { - script, err := goja.Compile(filename, src, false) - if err != nil { - return goja.Null(), err - } - return vm.RunProgram(script) -} diff --git a/internal/jsre/jsre_test.go b/internal/jsre/jsre_test.go deleted file mode 100644 index a67746f5abd..00000000000 --- a/internal/jsre/jsre_test.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package jsre - -import ( - "io/ioutil" - "os" - "path" - "reflect" - "testing" - "time" - - "github.com/dop251/goja" -) - -type testNativeObjectBinding struct { - vm *goja.Runtime -} - -type msg struct { - Msg string -} - -func (no *testNativeObjectBinding) TestMethod(call goja.FunctionCall) goja.Value { - m := call.Argument(0).ToString().String() - return no.vm.ToValue(&msg{m}) -} - -func newWithTestJS(t *testing.T, testjs string) (*JSRE, string) { - dir := t.TempDir() - if testjs != "" { - if err := ioutil.WriteFile(path.Join(dir, "test.js"), []byte(testjs), os.ModePerm); err != nil { - t.Fatal("cannot create test.js:", err) - } - } - jsre := New(dir, os.Stdout) - return jsre, dir -} - -func TestExec(t *testing.T) { - jsre, dir := newWithTestJS(t, `msg = "testMsg"`) - defer os.RemoveAll(dir) - - err := jsre.Exec("test.js") - if err != nil { - t.Errorf("expected no error, got %v", err) - } - val, err := jsre.Run("msg") - if err != nil { - t.Errorf("expected no error, got %v", err) - } - if val.ExportType().Kind() != reflect.String { - t.Errorf("expected string value, got %v", val) - } - exp := "testMsg" - got := val.ToString().String() - if exp != got { - t.Errorf("expected '%v', got '%v'", exp, got) - } - jsre.Stop(false) -} - -func TestNatto(t *testing.T) { - jsre, dir := newWithTestJS(t, `setTimeout(function(){msg = "testMsg"}, 1);`) - defer os.RemoveAll(dir) - - err := jsre.Exec("test.js") - if err != nil { - t.Errorf("expected no error, got %v", err) - } - time.Sleep(100 * time.Millisecond) - val, err := jsre.Run("msg") - if err != nil { - t.Errorf("expected no error, got %v", err) - } - if val.ExportType().Kind() != reflect.String { - t.Errorf("expected string value, got %v", val) - } - exp := "testMsg" - got := val.ToString().String() - if exp != got { - t.Errorf("expected '%v', got '%v'", exp, got) - } - jsre.Stop(false) -} - -func TestBind(t *testing.T) { - jsre := New("", os.Stdout) - defer jsre.Stop(false) - - if err := jsre.Set("no", &testNativeObjectBinding{vm: jsre.vm}); err != nil { - t.Errorf("error=%v", err) - } - - _, err := jsre.Run(`no.TestMethod("testMsg")`) - if err != nil { - t.Errorf("expected no error, got %v", err) - } -} - -func TestLoadScript(t *testing.T) { - jsre, dir := newWithTestJS(t, `msg = "testMsg"`) - defer os.RemoveAll(dir) - - _, err := jsre.Run(`loadScript("test.js")`) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - val, err := jsre.Run("msg") - if err != nil { - t.Errorf("expected no error, got %v", err) - } - if val.ExportType().Kind() != reflect.String { - t.Errorf("expected string value, got %v", val) - } - exp := "testMsg" - got := val.ToString().String() - if exp != got { - t.Errorf("expected '%v', got '%v'", exp, got) - } - jsre.Stop(false) -} diff --git a/internal/jsre/pretty.go b/internal/jsre/pretty.go deleted file mode 100644 index bcb42169c74..00000000000 --- a/internal/jsre/pretty.go +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package jsre - -import ( - "fmt" - "io" - "reflect" - "sort" - "strconv" - "strings" - - "github.com/dop251/goja" - "github.com/fatih/color" -) - -const ( - maxPrettyPrintLevel = 3 - indentString = " " -) - -var ( - FunctionColor = color.New(color.FgMagenta).SprintfFunc() - SpecialColor = color.New(color.Bold).SprintfFunc() - NumberColor = color.New(color.FgRed).SprintfFunc() - StringColor = color.New(color.FgGreen).SprintfFunc() - ErrorColor = color.New(color.FgHiRed).SprintfFunc() -) - -// these fields are hidden when printing objects. -var boringKeys = map[string]bool{ - "valueOf": true, - "toString": true, - "toLocaleString": true, - "hasOwnProperty": true, - "isPrototypeOf": true, - "propertyIsEnumerable": true, - "constructor": true, -} - -// prettyPrint writes value to standard output. -func prettyPrint(vm *goja.Runtime, value goja.Value, w io.Writer) { - ppctx{vm: vm, w: w}.printValue(value, 0, false) -} - -// prettyError writes err to standard output. -func prettyError(_ *goja.Runtime, err error, w io.Writer) { - failure := err.Error() - if gojaErr, ok := err.(*goja.Exception); ok { - failure = gojaErr.String() - } - fmt.Fprint(w, ErrorColor("%s", failure)) -} - -func (re *JSRE) prettyPrintJS(call goja.FunctionCall) goja.Value { - for _, v := range call.Arguments { - prettyPrint(re.vm, v, re.output) - fmt.Fprintln(re.output) - } - return goja.Undefined() -} - -type ppctx struct { - vm *goja.Runtime - w io.Writer -} - -func (ctx ppctx) indent(level int) string { - return strings.Repeat(indentString, level) -} - -func (ctx ppctx) printValue(v goja.Value, level int, inArray bool) { - if goja.IsNull(v) || goja.IsUndefined(v) { - fmt.Fprint(ctx.w, SpecialColor(v.String())) - return - } - kind := v.ExportType().Kind() - switch { - case kind == reflect.Bool: - fmt.Fprint(ctx.w, SpecialColor("%t", v.ToBoolean())) - case kind == reflect.String: - fmt.Fprint(ctx.w, StringColor("%q", v.String())) - case kind >= reflect.Int && kind <= reflect.Complex128: - fmt.Fprint(ctx.w, NumberColor("%s", v.String())) - default: - if obj, ok := v.(*goja.Object); ok { - ctx.printObject(obj, level, inArray) - } else { - fmt.Fprintf(ctx.w, "", v) - } - } -} - -// SafeGet attempt to get the value associated to `key`, and -// catches the panic that goja creates if an error occurs in -// key. -func SafeGet(obj *goja.Object, key string) (ret goja.Value) { - defer func() { - if r := recover(); r != nil { - ret = goja.Undefined() - } - }() - ret = obj.Get(key) - - return ret -} - -func (ctx ppctx) printObject(obj *goja.Object, level int, inArray bool) { - switch obj.ClassName() { - case "Array", "GoArray": - lv := obj.Get("length") - len := lv.ToInteger() - if len == 0 { - fmt.Fprintf(ctx.w, "[]") - return - } - if level > maxPrettyPrintLevel { - fmt.Fprint(ctx.w, "[...]") - return - } - fmt.Fprint(ctx.w, "[") - for i := int64(0); i < len; i++ { - el := obj.Get(strconv.FormatInt(i, 10)) - if el != nil { - ctx.printValue(el, level+1, true) - } - if i < len-1 { - fmt.Fprintf(ctx.w, ", ") - } - } - fmt.Fprint(ctx.w, "]") - - case "Object": - // Print values from bignumber.js as regular numbers. - if ctx.isBigNumber(obj) { - fmt.Fprint(ctx.w, NumberColor("%s", toString(obj))) - return - } - // Otherwise, print all fields indented, but stop if we're too deep. - keys := ctx.fields(obj) - if len(keys) == 0 { - fmt.Fprint(ctx.w, "{}") - return - } - if level > maxPrettyPrintLevel { - fmt.Fprint(ctx.w, "{...}") - return - } - fmt.Fprintln(ctx.w, "{") - for i, k := range keys { - v := SafeGet(obj, k) - fmt.Fprintf(ctx.w, "%s%s: ", ctx.indent(level+1), k) - ctx.printValue(v, level+1, false) - if i < len(keys)-1 { - fmt.Fprintf(ctx.w, ",") - } - fmt.Fprintln(ctx.w) - } - if inArray { - level-- - } - fmt.Fprintf(ctx.w, "%s}", ctx.indent(level)) - - case "Function": - robj := obj.ToString() - desc := strings.Trim(strings.Split(robj.String(), "{")[0], " \t\n") - desc = strings.Replace(desc, " (", "(", 1) - fmt.Fprint(ctx.w, FunctionColor("%s", desc)) - - case "RegExp": - fmt.Fprint(ctx.w, StringColor("%s", toString(obj))) - - default: - if level <= maxPrettyPrintLevel { - s := obj.ToString().String() - fmt.Fprintf(ctx.w, "<%s %s>", obj.ClassName(), s) - } else { - fmt.Fprintf(ctx.w, "<%s>", obj.ClassName()) - } - } -} - -func (ctx ppctx) fields(obj *goja.Object) []string { - var ( - vals, methods []string - seen = make(map[string]bool) - ) - add := func(k string) { - if seen[k] || boringKeys[k] || strings.HasPrefix(k, "_") { - return - } - seen[k] = true - - key := SafeGet(obj, k) - if key == nil { - // The value corresponding to that key could not be found - // (typically because it is backed by an RPC call that is - // not supported by this instance. Add it to the list of - // values so that it appears as `undefined` to the user. - vals = append(vals, k) - } else { - if _, callable := goja.AssertFunction(key); callable { - methods = append(methods, k) - } else { - vals = append(vals, k) - } - } - - } - iterOwnAndConstructorKeys(ctx.vm, obj, add) - sort.Strings(vals) - sort.Strings(methods) - return append(vals, methods...) -} - -func iterOwnAndConstructorKeys(vm *goja.Runtime, obj *goja.Object, f func(string)) { - seen := make(map[string]bool) - iterOwnKeys(vm, obj, func(prop string) { - seen[prop] = true - f(prop) - }) - if cp := constructorPrototype(vm, obj); cp != nil { - iterOwnKeys(vm, cp, func(prop string) { - if !seen[prop] { - f(prop) - } - }) - } -} - -func iterOwnKeys(vm *goja.Runtime, obj *goja.Object, f func(string)) { - Object := vm.Get("Object").ToObject(vm) - getOwnPropertyNames, isFunc := goja.AssertFunction(Object.Get("getOwnPropertyNames")) - if !isFunc { - panic(vm.ToValue("Object.getOwnPropertyNames isn't a function")) - } - rv, err := getOwnPropertyNames(goja.Null(), obj) - if err != nil { - panic(vm.ToValue(fmt.Sprintf("Error getting object properties: %v", err))) - } - gv := rv.Export() - switch gv := gv.(type) { - case []interface{}: - for _, v := range gv { - f(v.(string)) - } - case []string: - for _, v := range gv { - f(v) - } - default: - panic(fmt.Errorf("Object.getOwnPropertyNames returned unexpected type %T", gv)) - } -} - -func (ctx ppctx) isBigNumber(v *goja.Object) bool { - // Handle numbers with custom constructor. - if obj := v.Get("constructor").ToObject(ctx.vm); obj != nil { - if strings.HasPrefix(toString(obj), "function BigNumber") { - return true - } - } - // Handle default constructor. - BigNumber := ctx.vm.Get("BigNumber").ToObject(ctx.vm) - if BigNumber == nil { - return false - } - prototype := BigNumber.Get("prototype").ToObject(ctx.vm) - isPrototypeOf, callable := goja.AssertFunction(prototype.Get("isPrototypeOf")) - if !callable { - return false - } - bv, _ := isPrototypeOf(prototype, v) - return bv.ToBoolean() -} - -func toString(obj *goja.Object) string { - return obj.ToString().String() -} - -func constructorPrototype(vm *goja.Runtime, obj *goja.Object) *goja.Object { - if v := obj.Get("constructor"); v != nil { - if v := v.ToObject(vm).Get("prototype"); v != nil { //nolint:govet - return v.ToObject(vm) - } - } - return nil -} diff --git a/internal/testlog/testlog.go b/internal/testlog/testlog.go index ca2032fc33f..bdf41bad789 100644 --- a/internal/testlog/testlog.go +++ b/internal/testlog/testlog.go @@ -44,10 +44,10 @@ func (h *handler) Log(r *log.Record) error { // helpers, so the file and line number in unit test output correspond to the call site // which emitted the log message. type logger struct { - t *testing.T - l log.Logger - mu *sync.Mutex - h *bufHandler + t *testing.T + log log.Logger + mu *sync.Mutex + h *bufHandler } type bufHandler struct { @@ -63,12 +63,12 @@ func (h *bufHandler) Log(r *log.Record) error { // Logger returns a logger which logs to the unit test log of t. func Logger(t *testing.T, level log.Lvl) log.Logger { l := &logger{ - t: t, - l: log.New(), - mu: new(sync.Mutex), - h: &bufHandler{fmt: log.TerminalFormat()}, + t: t, + log: log.New(), + mu: new(sync.Mutex), + h: &bufHandler{fmt: log.TerminalFormat()}, } - l.l.SetHandler(log.LvlFilterHandler(level, l.h)) + l.log.SetHandler(log.LvlFilterHandler(level, l.h)) return l } @@ -76,7 +76,7 @@ func (l *logger) Trace(msg string, ctx ...interface{}) { l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Trace(msg, ctx...) + l.log.Trace(msg, ctx...) l.flush() } @@ -84,7 +84,7 @@ func (l *logger) Debug(msg string, ctx ...interface{}) { l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Debug(msg, ctx...) + l.log.Debug(msg, ctx...) l.flush() } @@ -92,7 +92,7 @@ func (l *logger) Info(msg string, ctx ...interface{}) { l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Info(msg, ctx...) + l.log.Info(msg, ctx...) l.flush() } @@ -100,7 +100,7 @@ func (l *logger) Warn(msg string, ctx ...interface{}) { l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Warn(msg, ctx...) + l.log.Warn(msg, ctx...) l.flush() } @@ -108,7 +108,7 @@ func (l *logger) Error(msg string, ctx ...interface{}) { l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Error(msg, ctx...) + l.log.Error(msg, ctx...) l.flush() } @@ -116,20 +116,20 @@ func (l *logger) Crit(msg string, ctx ...interface{}) { l.t.Helper() l.mu.Lock() defer l.mu.Unlock() - l.l.Crit(msg, ctx...) + l.log.Crit(msg, ctx...) l.flush() } func (l *logger) New(ctx ...interface{}) log.Logger { - return &logger{l.t, l.l.New(ctx...), l.mu, l.h} + return &logger{l.t, l.log.New(ctx...), l.mu, l.h} } func (l *logger) GetHandler() log.Handler { - return l.l.GetHandler() + return l.log.GetHandler() } func (l *logger) SetHandler(h log.Handler) { - l.l.SetHandler(h) + l.log.SetHandler(h) } // flush writes all buffered messages and clears the buffer. diff --git a/internal/utesting/utesting.go b/internal/utesting/utesting.go deleted file mode 100644 index 89bc511ec10..00000000000 --- a/internal/utesting/utesting.go +++ /dev/null @@ -1,339 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package utesting provides a standalone replacement for package testing. -// -// This package exists because package testing cannot easily be embedded into a -// standalone go program. It provides an API that mirrors the standard library -// testing API. -package utesting - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "regexp" - "runtime" - "sync" - "time" -) - -// Test represents a single test. -type Test struct { - Name string - Fn func(*T) -} - -// Result is the result of a test execution. -type Result struct { - Name string - Failed bool - Output string - Duration time.Duration -} - -// MatchTests returns the tests whose name matches a regular expression. -func MatchTests(tests []Test, expr string) []Test { - var results []Test - re, err := regexp.Compile(expr) - if err != nil { - return nil - } - for _, test := range tests { - if re.MatchString(test.Name) { - results = append(results, test) - } - } - return results -} - -// RunTests executes all given tests in order and returns their results. -// If the report writer is non-nil, a test report is written to it in real time. -func RunTests(tests []Test, report io.Writer) []Result { - if report == nil { - report = ioutil.Discard - } - results := run(tests, newConsoleOutput(report)) - fails := CountFailures(results) - fmt.Fprintf(report, "%v/%v tests passed.\n", len(tests)-fails, len(tests)) - return results -} - -// RunTAP runs the given tests and writes Test Anything Protocol output -// to the report writer. -func RunTAP(tests []Test, report io.Writer) []Result { - return run(tests, newTAP(report, len(tests))) -} - -func run(tests []Test, output testOutput) []Result { - var results = make([]Result, len(tests)) - for i, test := range tests { - buffer := new(bytes.Buffer) - logOutput := io.MultiWriter(buffer, output) - - output.testStart(test.Name) - start := time.Now() - results[i].Name = test.Name - results[i].Failed = runTest(test, logOutput) - results[i].Duration = time.Since(start) - results[i].Output = buffer.String() - output.testResult(results[i]) - } - return results -} - -// testOutput is implemented by output formats. -type testOutput interface { - testStart(name string) - Write([]byte) (int, error) - testResult(Result) -} - -// consoleOutput prints test results similarly to go test. -type consoleOutput struct { - out io.Writer - indented *indentWriter - curTest string - wroteHeader bool -} - -func newConsoleOutput(w io.Writer) *consoleOutput { - return &consoleOutput{ - out: w, - indented: newIndentWriter(" ", w), - } -} - -// testStart signals the start of a new test. -func (c *consoleOutput) testStart(name string) { - c.curTest = name - c.wroteHeader = false -} - -// Write handles test log output. -func (c *consoleOutput) Write(b []byte) (int, error) { - if !c.wroteHeader { - // This is the first output line from the test. Print a "-- RUN" header. - fmt.Fprintln(c.out, "-- RUN", c.curTest) - c.wroteHeader = true - } - return c.indented.Write(b) -} - -// testResult prints the final test result line. -func (c *consoleOutput) testResult(r Result) { - c.indented.flush() - pd := r.Duration.Truncate(100 * time.Microsecond) - if r.Failed { - fmt.Fprintf(c.out, "-- FAIL %s (%v)\n", r.Name, pd) - } else { - fmt.Fprintf(c.out, "-- OK %s (%v)\n", r.Name, pd) - } -} - -// tapOutput produces Test Anything Protocol v13 output. -type tapOutput struct { - out io.Writer - indented *indentWriter - counter int -} - -func newTAP(out io.Writer, numTests int) *tapOutput { - fmt.Fprintf(out, "1..%d\n", numTests) - return &tapOutput{ - out: out, - indented: newIndentWriter("# ", out), - } -} - -func (t *tapOutput) testStart(name string) { - t.counter++ -} - -// Write does nothing for TAP because there is no real-time output of test logs. -func (t *tapOutput) Write(b []byte) (int, error) { - return len(b), nil -} - -func (t *tapOutput) testResult(r Result) { - status := "ok" - if r.Failed { - status = "not ok" - } - fmt.Fprintln(t.out, status, t.counter, r.Name) - t.indented.Write([]byte(r.Output)) //nolint:errcheck - t.indented.flush() -} - -// indentWriter indents all written text. -type indentWriter struct { - out io.Writer - indent string - inLine bool -} - -func newIndentWriter(indent string, out io.Writer) *indentWriter { - return &indentWriter{out: out, indent: indent} -} - -func (w *indentWriter) Write(b []byte) (n int, err error) { - for len(b) > 0 { - if !w.inLine { - if _, err = io.WriteString(w.out, w.indent); err != nil { - return n, err - } - w.inLine = true - } - - end := bytes.IndexByte(b, '\n') - if end == -1 { - nn, err1 := w.out.Write(b) - n += nn - return n, err1 - } - - line := b[:end+1] - nn, err1 := w.out.Write(line) - n += nn - if err != nil { - return n, err1 - } - b = b[end+1:] - w.inLine = false - } - return n, err -} - -// flush ensures the current line is terminated. -func (w *indentWriter) flush() { - if w.inLine { - fmt.Println(w.out) - w.inLine = false - } -} - -// CountFailures returns the number of failed tests in the result slice. -func CountFailures(rr []Result) int { - count := 0 - for _, r := range rr { - if r.Failed { - count++ - } - } - return count -} - -// Run executes a single test. -func Run(test Test) (bool, string) { - output := new(bytes.Buffer) - failed := runTest(test, output) - return failed, output.String() -} - -func runTest(test Test, output io.Writer) bool { - t := &T{output: output} - done := make(chan struct{}) - go func() { - defer close(done) - defer func() { - if err := recover(); err != nil { - buf := make([]byte, 4096) - i := runtime.Stack(buf, false) - t.Logf("panic: %v\n\n%s", err, buf[:i]) - t.Fail() - } - }() - test.Fn(t) - }() - <-done - return t.failed -} - -// T is the value given to the test function. The test can signal failures -// and log output by calling methods on this object. -type T struct { - mu sync.Mutex - failed bool - output io.Writer -} - -// Helper exists for compatibility with testing.T. -func (t *T) Helper() {} - -// FailNow marks the test as having failed and stops its execution by calling -// runtime.Goexit (which then runs all deferred calls in the current goroutine). -func (t *T) FailNow() { - t.Fail() - runtime.Goexit() -} - -// Fail marks the test as having failed but continues execution. -func (t *T) Fail() { - t.mu.Lock() - defer t.mu.Unlock() - t.failed = true -} - -// Failed reports whether the test has failed. -func (t *T) Failed() bool { - t.mu.Lock() - defer t.mu.Unlock() - return t.failed -} - -// Log formats its arguments using default formatting, analogous to Println, and records -// the text in the error log. -func (t *T) Log(vs ...interface{}) { - t.mu.Lock() - defer t.mu.Unlock() - fmt.Fprintln(t.output, vs...) -} - -// Logf formats its arguments according to the format, analogous to Printf, and records -// the text in the error log. A final newline is added if not provided. -func (t *T) Logf(format string, vs ...interface{}) { - t.mu.Lock() - defer t.mu.Unlock() - if len(format) == 0 || format[len(format)-1] != '\n' { - format += "\n" - } - fmt.Fprintf(t.output, format, vs...) -} - -// Error is equivalent to Log followed by Fail. -func (t *T) Error(vs ...interface{}) { - t.Log(vs...) - t.Fail() -} - -// Errorf is equivalent to Logf followed by Fail. -func (t *T) Errorf(format string, vs ...interface{}) { - t.Logf(format, vs...) - t.Fail() -} - -// Fatal is equivalent to Log followed by FailNow. -func (t *T) Fatal(vs ...interface{}) { - t.Log(vs...) - t.FailNow() -} - -// Fatalf is equivalent to Logf followed by FailNow. -func (t *T) Fatalf(format string, vs ...interface{}) { - t.Logf(format, vs...) - t.FailNow() -} diff --git a/internal/utesting/utesting_test.go b/internal/utesting/utesting_test.go deleted file mode 100644 index 31c7911c52f..00000000000 --- a/internal/utesting/utesting_test.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package utesting - -import ( - "bytes" - "regexp" - "strings" - "testing" -) - -func TestTest(t *testing.T) { - tests := []Test{ - { - Name: "successful test", - Fn: func(t *T) {}, - }, - { - Name: "failing test", - Fn: func(t *T) { - t.Log("output") - t.Error("failed") - }, - }, - { - Name: "panicking test", - Fn: func(t *T) { - panic("oh no") - }, - }, - } - results := RunTests(tests, nil) - - if results[0].Failed || results[0].Output != "" { - t.Fatalf("wrong result for successful test: %#v", results[0]) - } - if !results[1].Failed || results[1].Output != "output\nfailed\n" { - t.Fatalf("wrong result for failing test: %#v", results[1]) - } - if !results[2].Failed || !strings.HasPrefix(results[2].Output, "panic: oh no\n") { - t.Fatalf("wrong result for panicking test: %#v", results[2]) - } -} - -var outputTests = []Test{ - { - Name: "TestWithLogs", - Fn: func(t *T) { - t.Log("output line 1") - t.Log("output line 2\noutput line 3") - }, - }, - { - Name: "TestNoLogs", - Fn: func(t *T) {}, - }, - { - Name: "FailWithLogs", - Fn: func(t *T) { - t.Log("output line 1") - t.Error("failed 1") - }, - }, - { - Name: "FailMessage", - Fn: func(t *T) { - t.Error("failed 2") - }, - }, - { - Name: "FailNoOutput", - Fn: func(t *T) { - t.Fail() - }, - }, -} - -func TestOutput(t *testing.T) { - var buf bytes.Buffer - RunTests(outputTests, &buf) - - want := regexp.MustCompile(` -^-- RUN TestWithLogs - output line 1 - output line 2 - output line 3 --- OK TestWithLogs \([^)]+\) --- OK TestNoLogs \([^)]+\) --- RUN FailWithLogs - output line 1 - failed 1 --- FAIL FailWithLogs \([^)]+\) --- RUN FailMessage - failed 2 --- FAIL FailMessage \([^)]+\) --- FAIL FailNoOutput \([^)]+\) -2/5 tests passed. -$`[1:]) - if !want.MatchString(buf.String()) { - t.Fatalf("output does not match: %q", buf.String()) - } -} - -func TestOutputTAP(t *testing.T) { - var buf bytes.Buffer - RunTAP(outputTests, &buf) - - want := ` -1..5 -ok 1 TestWithLogs -# output line 1 -# output line 2 -# output line 3 -ok 2 TestNoLogs -not ok 3 FailWithLogs -# output line 1 -# failed 1 -not ok 4 FailMessage -# failed 2 -not ok 5 FailNoOutput -` - if buf.String() != want[1:] { - t.Fatalf("output does not match: %q", buf.String()) - } -} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go deleted file mode 100644 index 6fcf4b83805..00000000000 --- a/internal/web3ext/web3ext.go +++ /dev/null @@ -1,909 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// package web3ext contains geth specific web3.js extensions. -package web3ext - -var Modules = map[string]string{ - "accounting": AccountingJs, - "admin": AdminJs, - "chequebook": ChequebookJs, - "clique": CliqueJs, - "ethash": EthashJs, - "debug": DebugJs, - "eth": EthJs, - "miner": MinerJs, - "net": NetJs, - "personal": PersonalJs, - "rpc": RpcJs, - "shh": ShhJs, - "swarmfs": SwarmfsJs, - "txpool": TxpoolJs, - "les": LESJs, - "vflux": VfluxJs, -} - -const ChequebookJs = ` -web3._extend({ - property: 'chequebook', - methods: [ - new web3._extend.Method({ - name: 'deposit', - call: 'chequebook_deposit', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Property({ - name: 'balance', - getter: 'chequebook_balance', - outputFormatter: web3._extend.utils.toDecimal - }), - new web3._extend.Method({ - name: 'cash', - call: 'chequebook_cash', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Method({ - name: 'issue', - call: 'chequebook_issue', - params: 2, - inputFormatter: [null, null] - }), - ] -}); -` - -const CliqueJs = ` -web3._extend({ - property: 'clique', - methods: [ - new web3._extend.Method({ - name: 'getSnapshot', - call: 'clique_getSnapshot', - params: 1, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter] - }), - new web3._extend.Method({ - name: 'getSnapshotAtHash', - call: 'clique_getSnapshotAtHash', - params: 1 - }), - new web3._extend.Method({ - name: 'getSigners', - call: 'clique_getSigners', - params: 1, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter] - }), - new web3._extend.Method({ - name: 'getSignersAtHash', - call: 'clique_getSignersAtHash', - params: 1 - }), - new web3._extend.Method({ - name: 'propose', - call: 'clique_propose', - params: 2 - }), - new web3._extend.Method({ - name: 'discard', - call: 'clique_discard', - params: 1 - }), - new web3._extend.Method({ - name: 'status', - call: 'clique_status', - params: 0 - }), - ], - properties: [ - new web3._extend.Property({ - name: 'proposals', - getter: 'clique_proposals' - }), - ] -}); -` - -const EthashJs = ` -web3._extend({ - property: 'ethash', - methods: [ - new web3._extend.Method({ - name: 'getWork', - call: 'ethash_getWork', - params: 0 - }), - new web3._extend.Method({ - name: 'getHashrate', - call: 'ethash_getHashrate', - params: 0 - }), - new web3._extend.Method({ - name: 'submitWork', - call: 'ethash_submitWork', - params: 3, - }), - new web3._extend.Method({ - name: 'submitHashRate', - call: 'ethash_submitHashRate', - params: 2, - }), - ] -}); -` - -const AdminJs = ` -web3._extend({ - property: 'admin', - methods: [ - new web3._extend.Method({ - name: 'addPeer', - call: 'admin_addPeer', - params: 1 - }), - new web3._extend.Method({ - name: 'removePeer', - call: 'admin_removePeer', - params: 1 - }), - new web3._extend.Method({ - name: 'addTrustedPeer', - call: 'admin_addTrustedPeer', - params: 1 - }), - new web3._extend.Method({ - name: 'removeTrustedPeer', - call: 'admin_removeTrustedPeer', - params: 1 - }), - new web3._extend.Method({ - name: 'exportChain', - call: 'admin_exportChain', - params: 3, - inputFormatter: [null, null, null] - }), - new web3._extend.Method({ - name: 'importChain', - call: 'admin_importChain', - params: 1 - }), - new web3._extend.Method({ - name: 'sleepBlocks', - call: 'admin_sleepBlocks', - params: 2 - }), - new web3._extend.Method({ - name: 'startRPC', - call: 'admin_startRPC', - params: 4, - inputFormatter: [null, null, null, null] - }), - new web3._extend.Method({ - name: 'stopRPC', - call: 'admin_stopRPC' - }), - new web3._extend.Method({ - name: 'startWS', - call: 'admin_startWS', - params: 4, - inputFormatter: [null, null, null, null] - }), - new web3._extend.Method({ - name: 'stopWS', - call: 'admin_stopWS' - }), - ], - properties: [ - new web3._extend.Property({ - name: 'nodeInfo', - getter: 'admin_nodeInfo' - }), - new web3._extend.Property({ - name: 'peers', - getter: 'admin_peers' - }), - new web3._extend.Property({ - name: 'datadir', - getter: 'admin_datadir' - }), - ] -}); -` - -const DebugJs = ` -web3._extend({ - property: 'debug', - methods: [ - new web3._extend.Method({ - name: 'accountRange', - call: 'debug_accountRange', - params: 6, - inputFormatter: [web3._extend.formatters.inputDefaultBlockNumberFormatter, null, null, null, null, null], - }), - new web3._extend.Method({ - name: 'printBlock', - call: 'debug_printBlock', - params: 1, - outputFormatter: console.log - }), - new web3._extend.Method({ - name: 'getBlockRlp', - call: 'debug_getBlockRlp', - params: 1 - }), - new web3._extend.Method({ - name: 'testSignCliqueBlock', - call: 'debug_testSignCliqueBlock', - params: 2, - inputFormatter: [web3._extend.formatters.inputAddressFormatter, null], - }), - new web3._extend.Method({ - name: 'setHead', - call: 'debug_setHead', - params: 1 - }), - new web3._extend.Method({ - name: 'seedHash', - call: 'debug_seedHash', - params: 1 - }), - new web3._extend.Method({ - name: 'dumpBlock', - call: 'debug_dumpBlock', - params: 1, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter] - }), - new web3._extend.Method({ - name: 'chaindbProperty', - call: 'debug_chaindbProperty', - params: 1, - outputFormatter: console.log - }), - new web3._extend.Method({ - name: 'chaindbCompact', - call: 'debug_chaindbCompact', - }), - new web3._extend.Method({ - name: 'verbosity', - call: 'debug_verbosity', - params: 1 - }), - new web3._extend.Method({ - name: 'vmodule', - call: 'debug_vmodule', - params: 1 - }), - new web3._extend.Method({ - name: 'backtraceAt', - call: 'debug_backtraceAt', - params: 1, - }), - new web3._extend.Method({ - name: 'stacks', - call: 'debug_stacks', - params: 0, - outputFormatter: console.log - }), - new web3._extend.Method({ - name: 'freeOSMemory', - call: 'debug_freeOSMemory', - params: 0, - }), - new web3._extend.Method({ - name: 'setGCPercent', - call: 'debug_setGCPercent', - params: 1, - }), - new web3._extend.Method({ - name: 'memStats', - call: 'debug_memStats', - params: 0, - }), - new web3._extend.Method({ - name: 'gcStats', - call: 'debug_gcStats', - params: 0, - }), - new web3._extend.Method({ - name: 'cpuProfile', - call: 'debug_cpuProfile', - params: 2 - }), - new web3._extend.Method({ - name: 'startCPUProfile', - call: 'debug_startCPUProfile', - params: 1 - }), - new web3._extend.Method({ - name: 'stopCPUProfile', - call: 'debug_stopCPUProfile', - params: 0 - }), - new web3._extend.Method({ - name: 'goTrace', - call: 'debug_goTrace', - params: 2 - }), - new web3._extend.Method({ - name: 'startGoTrace', - call: 'debug_startGoTrace', - params: 1 - }), - new web3._extend.Method({ - name: 'stopGoTrace', - call: 'debug_stopGoTrace', - params: 0 - }), - new web3._extend.Method({ - name: 'blockProfile', - call: 'debug_blockProfile', - params: 2 - }), - new web3._extend.Method({ - name: 'setBlockProfileRate', - call: 'debug_setBlockProfileRate', - params: 1 - }), - new web3._extend.Method({ - name: 'writeBlockProfile', - call: 'debug_writeBlockProfile', - params: 1 - }), - new web3._extend.Method({ - name: 'mutexProfile', - call: 'debug_mutexProfile', - params: 2 - }), - new web3._extend.Method({ - name: 'setMutexProfileFraction', - call: 'debug_setMutexProfileFraction', - params: 1 - }), - new web3._extend.Method({ - name: 'writeMutexProfile', - call: 'debug_writeMutexProfile', - params: 1 - }), - new web3._extend.Method({ - name: 'writeMemProfile', - call: 'debug_writeMemProfile', - params: 1 - }), - new web3._extend.Method({ - name: 'traceBlock', - call: 'debug_traceBlock', - params: 2, - inputFormatter: [null, null] - }), - new web3._extend.Method({ - name: 'traceBlockFromFile', - call: 'debug_traceBlockFromFile', - params: 2, - inputFormatter: [null, null] - }), - new web3._extend.Method({ - name: 'traceBadBlock', - call: 'debug_traceBadBlock', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Method({ - name: 'standardTraceBadBlockToFile', - call: 'debug_standardTraceBadBlockToFile', - params: 2, - inputFormatter: [null, null] - }), - new web3._extend.Method({ - name: 'standardTraceBlockToFile', - call: 'debug_standardTraceBlockToFile', - params: 2, - inputFormatter: [null, null] - }), - new web3._extend.Method({ - name: 'traceBlockByNumber', - call: 'debug_traceBlockByNumber', - params: 2, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, null] - }), - new web3._extend.Method({ - name: 'traceBlockByHash', - call: 'debug_traceBlockByHash', - params: 2, - inputFormatter: [null, null] - }), - new web3._extend.Method({ - name: 'traceTransaction', - call: 'debug_traceTransaction', - params: 2, - inputFormatter: [null, null] - }), - new web3._extend.Method({ - name: 'traceCall', - call: 'debug_traceCall', - params: 3, - inputFormatter: [null, null, null] - }), - new web3._extend.Method({ - name: 'preimage', - call: 'debug_preimage', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Method({ - name: 'getBadBlocks', - call: 'debug_getBadBlocks', - params: 0, - }), - new web3._extend.Method({ - name: 'storageRangeAt', - call: 'debug_storageRangeAt', - params: 5, - }), - new web3._extend.Method({ - name: 'getModifiedAccountsByNumber', - call: 'debug_getModifiedAccountsByNumber', - params: 2, - inputFormatter: [null, null], - }), - new web3._extend.Method({ - name: 'getModifiedAccountsByHash', - call: 'debug_getModifiedAccountsByHash', - params: 2, - inputFormatter:[null, null], - }), - new web3._extend.Method({ - name: 'freezeClient', - call: 'debug_freezeClient', - params: 1, - }), - ], - properties: [] -}); -` - -const EthJs = ` -web3._extend({ - property: 'eth', - methods: [ - new web3._extend.Method({ - name: 'chainId', - call: 'eth_chainId', - params: 0 - }), - new web3._extend.Method({ - name: 'sign', - call: 'eth_sign', - params: 2, - inputFormatter: [web3._extend.formatters.inputAddressFormatter, null] - }), - new web3._extend.Method({ - name: 'resend', - call: 'eth_resend', - params: 3, - inputFormatter: [web3._extend.formatters.inputTransactionFormatter, web3._extend.utils.fromDecimal, web3._extend.utils.fromDecimal] - }), - new web3._extend.Method({ - name: 'signTransaction', - call: 'eth_signTransaction', - params: 1, - inputFormatter: [web3._extend.formatters.inputTransactionFormatter] - }), - new web3._extend.Method({ - name: 'estimateGas', - call: 'eth_estimateGas', - params: 2, - inputFormatter: [web3._extend.formatters.inputCallFormatter, web3._extend.formatters.inputBlockNumberFormatter], - outputFormatter: web3._extend.utils.toDecimal - }), - new web3._extend.Method({ - name: 'submitTransaction', - call: 'eth_submitTransaction', - params: 1, - inputFormatter: [web3._extend.formatters.inputTransactionFormatter] - }), - new web3._extend.Method({ - name: 'fillTransaction', - call: 'eth_fillTransaction', - params: 1, - inputFormatter: [web3._extend.formatters.inputTransactionFormatter] - }), - new web3._extend.Method({ - name: 'getHeaderByNumber', - call: 'eth_getHeaderByNumber', - params: 1, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter] - }), - new web3._extend.Method({ - name: 'getHeaderByHash', - call: 'eth_getHeaderByHash', - params: 1 - }), - new web3._extend.Method({ - name: 'getBlockByNumber', - call: 'eth_getBlockByNumber', - params: 2, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, function (val) { return !!val; }] - }), - new web3._extend.Method({ - name: 'getBlockByHash', - call: 'eth_getBlockByHash', - params: 2, - inputFormatter: [null, function (val) { return !!val; }] - }), - new web3._extend.Method({ - name: 'getRawTransaction', - call: 'eth_getRawTransactionByHash', - params: 1 - }), - new web3._extend.Method({ - name: 'getRawTransactionFromBlock', - call: function(args) { - return (web3._extend.utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getRawTransactionByBlockHashAndIndex' : 'eth_getRawTransactionByBlockNumberAndIndex'; - }, - params: 2, - inputFormatter: [web3._extend.formatters.inputBlockNumberFormatter, web3._extend.utils.toHex] - }), - new web3._extend.Method({ - name: 'getProof', - call: 'eth_getProof', - params: 3, - inputFormatter: [web3._extend.formatters.inputAddressFormatter, null, web3._extend.formatters.inputBlockNumberFormatter] - }), - ], - properties: [ - new web3._extend.Property({ - name: 'pendingTransactions', - getter: 'eth_pendingTransactions', - outputFormatter: function(txs) { - var formatted = []; - for (var i = 0; i < txs.length; i++) { - formatted.push(web3._extend.formatters.outputTransactionFormatter(txs[i])); - formatted[i].blockHash = null; - } - return formatted; - } - }), - ] -}); -` - -const MinerJs = ` -web3._extend({ - property: 'miner', - methods: [ - new web3._extend.Method({ - name: 'start', - call: 'miner_start', - params: 1, - inputFormatter: [null] - }), - new web3._extend.Method({ - name: 'stop', - call: 'miner_stop' - }), - new web3._extend.Method({ - name: 'setEtherbase', - call: 'miner_setEtherbase', - params: 1, - inputFormatter: [web3._extend.formatters.inputAddressFormatter] - }), - new web3._extend.Method({ - name: 'setExtra', - call: 'miner_setExtra', - params: 1 - }), - new web3._extend.Method({ - name: 'setGasPrice', - call: 'miner_setGasPrice', - params: 1, - inputFormatter: [web3._extend.utils.fromDecimal] - }), - new web3._extend.Method({ - name: 'setRecommitInterval', - call: 'miner_setRecommitInterval', - params: 1, - }), - new web3._extend.Method({ - name: 'getHashrate', - call: 'miner_getHashrate' - }), - ], - properties: [] -}); -` - -const NetJs = ` -web3._extend({ - property: 'net', - methods: [], - properties: [ - new web3._extend.Property({ - name: 'version', - getter: 'net_version' - }), - ] -}); -` - -const PersonalJs = ` -web3._extend({ - property: 'personal', - methods: [ - new web3._extend.Method({ - name: 'importRawKey', - call: 'personal_importRawKey', - params: 2 - }), - new web3._extend.Method({ - name: 'sign', - call: 'personal_sign', - params: 3, - inputFormatter: [null, web3._extend.formatters.inputAddressFormatter, null] - }), - new web3._extend.Method({ - name: 'ecRecover', - call: 'personal_ecRecover', - params: 2 - }), - new web3._extend.Method({ - name: 'openWallet', - call: 'personal_openWallet', - params: 2 - }), - new web3._extend.Method({ - name: 'deriveAccount', - call: 'personal_deriveAccount', - params: 3 - }), - new web3._extend.Method({ - name: 'signTransaction', - call: 'personal_signTransaction', - params: 2, - inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null] - }), - new web3._extend.Method({ - name: 'unpair', - call: 'personal_unpair', - params: 2 - }), - new web3._extend.Method({ - name: 'initializeWallet', - call: 'personal_initializeWallet', - params: 1 - }) - ], - properties: [ - new web3._extend.Property({ - name: 'listWallets', - getter: 'personal_listWallets' - }), - ] -}) -` - -const RpcJs = ` -web3._extend({ - property: 'rpc', - methods: [], - properties: [ - new web3._extend.Property({ - name: 'modules', - getter: 'rpc_modules' - }), - ] -}); -` - -const ShhJs = ` -web3._extend({ - property: 'shh', - methods: [ - ], - properties: - [ - new web3._extend.Property({ - name: 'version', - getter: 'shh_version', - outputFormatter: web3._extend.utils.toDecimal - }), - new web3._extend.Property({ - name: 'info', - getter: 'shh_info' - }), - ] -}); -` - -const SwarmfsJs = ` -web3._extend({ - property: 'swarmfs', - methods: - [ - new web3._extend.Method({ - name: 'mount', - call: 'swarmfs_mount', - params: 2 - }), - new web3._extend.Method({ - name: 'unmount', - call: 'swarmfs_unmount', - params: 1 - }), - new web3._extend.Method({ - name: 'listmounts', - call: 'swarmfs_listmounts', - params: 0 - }), - ] -}); -` - -const TxpoolJs = ` -web3._extend({ - property: 'txpool', - methods: [], - properties: - [ - new web3._extend.Property({ - name: 'content', - getter: 'txpool_content' - }), - new web3._extend.Property({ - name: 'inspect', - getter: 'txpool_inspect' - }), - new web3._extend.Property({ - name: 'status', - getter: 'txpool_status', - outputFormatter: function(status) { - status.pending = web3._extend.utils.toDecimal(status.pending); - status.queued = web3._extend.utils.toDecimal(status.queued); - return status; - } - }), - ] -}); -` - -const AccountingJs = ` -web3._extend({ - property: 'accounting', - methods: [ - new web3._extend.Property({ - name: 'balance', - getter: 'account_balance' - }), - new web3._extend.Property({ - name: 'balanceCredit', - getter: 'account_balanceCredit' - }), - new web3._extend.Property({ - name: 'balanceDebit', - getter: 'account_balanceDebit' - }), - new web3._extend.Property({ - name: 'bytesCredit', - getter: 'account_bytesCredit' - }), - new web3._extend.Property({ - name: 'bytesDebit', - getter: 'account_bytesDebit' - }), - new web3._extend.Property({ - name: 'msgCredit', - getter: 'account_msgCredit' - }), - new web3._extend.Property({ - name: 'msgDebit', - getter: 'account_msgDebit' - }), - new web3._extend.Property({ - name: 'peerDrops', - getter: 'account_peerDrops' - }), - new web3._extend.Property({ - name: 'selfDrops', - getter: 'account_selfDrops' - }), - ] -}); -` - -const LESJs = ` -web3._extend({ - property: 'les', - methods: - [ - new web3._extend.Method({ - name: 'getCheckpoint', - call: 'les_getCheckpoint', - params: 1 - }), - new web3._extend.Method({ - name: 'clientInfo', - call: 'les_clientInfo', - params: 1 - }), - new web3._extend.Method({ - name: 'priorityClientInfo', - call: 'les_priorityClientInfo', - params: 3 - }), - new web3._extend.Method({ - name: 'setClientParams', - call: 'les_setClientParams', - params: 2 - }), - new web3._extend.Method({ - name: 'setDefaultParams', - call: 'les_setDefaultParams', - params: 1 - }), - new web3._extend.Method({ - name: 'addBalance', - call: 'les_addBalance', - params: 2 - }), - ], - properties: - [ - new web3._extend.Property({ - name: 'latestCheckpoint', - getter: 'les_latestCheckpoint' - }), - new web3._extend.Property({ - name: 'checkpointContractAddress', - getter: 'les_getCheckpointContractAddress' - }), - new web3._extend.Property({ - name: 'serverInfo', - getter: 'les_serverInfo' - }), - ] -}); -` - -const VfluxJs = ` -web3._extend({ - property: 'vflux', - methods: - [ - new web3._extend.Method({ - name: 'distribution', - call: 'vflux_distribution', - params: 2 - }), - new web3._extend.Method({ - name: 'timeout', - call: 'vflux_timeout', - params: 2 - }), - new web3._extend.Method({ - name: 'value', - call: 'vflux_value', - params: 2 - }), - ], - properties: - [ - new web3._extend.Property({ - name: 'requestStats', - getter: 'vflux_requestStats' - }), - ] -}); -` diff --git a/libmdbx b/libmdbx index 63e7276c7da..5d2eb580fdd 160000 --- a/libmdbx +++ b/libmdbx @@ -1 +1 @@ -Subproject commit 63e7276c7da864d47c004cc959dd8c6b1731c247 +Subproject commit 5d2eb580fdd61ccacf00aa93d7ee42e8e53afc8e diff --git a/metrics/counter.go b/metrics/counter.go index 2f78c90d5c6..f2f079fe576 100644 --- a/metrics/counter.go +++ b/metrics/counter.go @@ -1,9 +1,5 @@ package metrics -import ( - "sync/atomic" -) - // Counters hold an int64 value that can be incremented and decremented. type Counter interface { Clear() @@ -12,133 +8,3 @@ type Counter interface { Inc(int64) Snapshot() Counter } - -// GetOrRegisterCounter returns an existing Counter or constructs and registers -// a new StandardCounter. -func GetOrRegisterCounter(name string, r Registry) Counter { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewCounter).(Counter) -} - -// GetOrRegisterCounterForced returns an existing Counter or constructs and registers a -// new Counter no matter the global switch is enabled or not. -// Be sure to unregister the counter from the registry once it is of no use to -// allow for garbage collection. -func GetOrRegisterCounterForced(name string, r Registry) Counter { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewCounterForced).(Counter) -} - -// NewCounter constructs a new StandardCounter. -func NewCounter() Counter { - if !Enabled { - return NilCounter{} - } - return &StandardCounter{0} -} - -// NewCounterForced constructs a new StandardCounter and returns it no matter if -// the global switch is enabled or not. -func NewCounterForced() Counter { - return &StandardCounter{0} -} - -// NewRegisteredCounter constructs and registers a new StandardCounter. -func NewRegisteredCounter(name string, r Registry) Counter { - c := NewCounter() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewRegisteredCounterForced constructs and registers a new StandardCounter -// and launches a goroutine no matter the global switch is enabled or not. -// Be sure to unregister the counter from the registry once it is of no use to -// allow for garbage collection. -func NewRegisteredCounterForced(name string, r Registry) Counter { - c := NewCounterForced() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// CounterSnapshot is a read-only copy of another Counter. -type CounterSnapshot int64 - -// Clear panics. -func (CounterSnapshot) Clear() { - panic("Clear called on a CounterSnapshot") -} - -// Count returns the count at the time the snapshot was taken. -func (c CounterSnapshot) Count() int64 { return int64(c) } - -// Dec panics. -func (CounterSnapshot) Dec(int64) { - panic("Dec called on a CounterSnapshot") -} - -// Inc panics. -func (CounterSnapshot) Inc(int64) { - panic("Inc called on a CounterSnapshot") -} - -// Snapshot returns the snapshot. -func (c CounterSnapshot) Snapshot() Counter { return c } - -// NilCounter is a no-op Counter. -type NilCounter struct{} - -// Clear is a no-op. -func (NilCounter) Clear() {} - -// Count is a no-op. -func (NilCounter) Count() int64 { return 0 } - -// Dec is a no-op. -func (NilCounter) Dec(i int64) {} - -// Inc is a no-op. -func (NilCounter) Inc(i int64) {} - -// Snapshot is a no-op. -func (NilCounter) Snapshot() Counter { return NilCounter{} } - -// StandardCounter is the standard implementation of a Counter and uses the -// sync/atomic package to manage a single int64 value. -type StandardCounter struct { - count int64 -} - -// Clear sets the counter to zero. -func (c *StandardCounter) Clear() { - atomic.StoreInt64(&c.count, 0) -} - -// Count returns the current count. -func (c *StandardCounter) Count() int64 { - return atomic.LoadInt64(&c.count) -} - -// Dec decrements the counter by the given amount. -func (c *StandardCounter) Dec(i int64) { - atomic.AddInt64(&c.count, -i) -} - -// Inc increments the counter by the given amount. -func (c *StandardCounter) Inc(i int64) { - atomic.AddInt64(&c.count, i) -} - -// Snapshot returns a read-only copy of the counter. -func (c *StandardCounter) Snapshot() Counter { - return CounterSnapshot(c.Count()) -} diff --git a/metrics/counter_test.go b/metrics/counter_test.go deleted file mode 100644 index af26ef1548f..00000000000 --- a/metrics/counter_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package metrics - -import "testing" - -func BenchmarkCounter(b *testing.B) { - c := NewCounter() - b.ResetTimer() - for i := 0; i < b.N; i++ { - c.Inc(1) - } -} - -func TestCounterClear(t *testing.T) { - c := NewCounter() - c.Inc(1) - c.Clear() - if count := c.Count(); count != 0 { - t.Errorf("c.Count(): 0 != %v\n", count) - } -} - -func TestCounterDec1(t *testing.T) { - c := NewCounter() - c.Dec(1) - if count := c.Count(); count != -1 { - t.Errorf("c.Count(): -1 != %v\n", count) - } -} - -func TestCounterDec2(t *testing.T) { - c := NewCounter() - c.Dec(2) - if count := c.Count(); count != -2 { - t.Errorf("c.Count(): -2 != %v\n", count) - } -} - -func TestCounterInc1(t *testing.T) { - c := NewCounter() - c.Inc(1) - if count := c.Count(); count != 1 { - t.Errorf("c.Count(): 1 != %v\n", count) - } -} - -func TestCounterInc2(t *testing.T) { - c := NewCounter() - c.Inc(2) - if count := c.Count(); count != 2 { - t.Errorf("c.Count(): 2 != %v\n", count) - } -} - -func TestCounterSnapshot(t *testing.T) { - c := NewCounter() - c.Inc(1) - snapshot := c.Snapshot() - c.Inc(1) - if count := snapshot.Count(); count != 1 { - t.Errorf("c.Count(): 1 != %v\n", count) - } -} - -func TestCounterZero(t *testing.T) { - c := NewCounter() - if count := c.Count(); count != 0 { - t.Errorf("c.Count(): 0 != %v\n", count) - } -} - -func TestGetOrRegisterCounter(t *testing.T) { - r := NewRegistry() - NewRegisteredCounter("foo", r).Inc(47) - if c := GetOrRegisterCounter("foo", r); c.Count() != 47 { - t.Fatal(c) - } -} diff --git a/metrics/cpu.go b/metrics/cpu.go deleted file mode 100644 index 72ece16e076..00000000000 --- a/metrics/cpu.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package metrics - -// CPUStats is the system and process CPU stats. -type CPUStats struct { - GlobalTime int64 // Time spent by the CPU working on all processes - GlobalWait int64 // Time spent by waiting on disk for all processes - LocalTime int64 // Time spent by the CPU working on this process -} diff --git a/metrics/cpu_disabled.go b/metrics/cpu_disabled.go deleted file mode 100644 index 1b28a0207bd..00000000000 --- a/metrics/cpu_disabled.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build ios - -package metrics - -// ReadCPUStats retrieves the current CPU stats. Internally this uses `gosigar`, -// which is not supported on the platforms in this file. -func ReadCPUStats(p *process.Process, stats *CPUStats) {} diff --git a/metrics/cpu_enabled.go b/metrics/cpu_enabled.go deleted file mode 100644 index f4e01cc67cc..00000000000 --- a/metrics/cpu_enabled.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !ios - -package metrics - -import ( - "github.com/ledgerwatch/log/v3" - "github.com/shirou/gopsutil/v3/cpu" - "github.com/shirou/gopsutil/v3/process" -) - -func ReadCPUStats(p *process.Process, stats *CPUStats) { - // passing false to request all cpu times - timeStats, err := cpu.Times(false) - if err != nil { - log.Error("Could not read cpu stats", "err", err) - return - } - if len(timeStats) == 0 { - log.Error("Empty cpu stats") - return - } - // requesting all cpu times will always return an array with only one time stats entry - timeStat := timeStats[0] - stats.GlobalTime = int64((timeStat.User + timeStat.Nice + timeStat.System) * cpu.ClocksPerSec) - stats.GlobalWait = int64((timeStat.Iowait) * cpu.ClocksPerSec) - stats.LocalTime = getProcessCPUTime() -} diff --git a/metrics/cpu_syscall.go b/metrics/cpu_syscall.go deleted file mode 100644 index 4ec9c896715..00000000000 --- a/metrics/cpu_syscall.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !windows - -package metrics - -import ( - "syscall" - - "github.com/ledgerwatch/log/v3" - "github.com/shirou/gopsutil/v3/process" -) - -func getRUsage(p *process.Process) (inBlock, outBlocks, nvcsw, nivcsw int64) { - var ru syscall.Rusage - if err := syscall.Getrusage(syscall.RUSAGE_SELF, &ru); err != nil { - log.Warn("Failed to retrieve CPU time", "err", err) - return - } - return ru.Inblock, ru.Oublock, ru.Nvcsw, ru.Nivcsw -} - -// getProcessCPUTime retrieves the process' CPU time since program startup. -func getProcessCPUTime() int64 { - var usage syscall.Rusage - if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil { - log.Warn("Failed to retrieve CPU time", "err", err) - return 0 - } - return int64(usage.Utime.Sec+usage.Stime.Sec)*100 + int64(usage.Utime.Usec+usage.Stime.Usec)/10000 //nolint:unconvert -} diff --git a/metrics/cpu_windows.go b/metrics/cpu_windows.go deleted file mode 100644 index 793e6968097..00000000000 --- a/metrics/cpu_windows.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package metrics - -import ( - "github.com/shirou/gopsutil/v3/process" -) - -func getRUsage(p *process.Process) (inBlock, outBlocks, nvcsw, nivcsw int64) { - return 0, 0, 0, 0 -} - -// getProcessCPUTime retrieves the process' CPU time since program startup. -func getProcessCPUTime() int64 { - return 0 -} diff --git a/metrics/disk.go b/metrics/disk.go deleted file mode 100644 index 25142d2ad1e..00000000000 --- a/metrics/disk.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package metrics - -// DiskStats is the per process disk io stats. -type DiskStats struct { - ReadCount int64 // Number of read operations executed - ReadBytes int64 // Total number of bytes read - WriteCount int64 // Number of write operations executed - WriteBytes int64 // Total number of byte written -} diff --git a/metrics/doc.go b/metrics/doc.go index 13f429c1689..d9f37f4dc0c 100644 --- a/metrics/doc.go +++ b/metrics/doc.go @@ -1,4 +1,3 @@ package metrics const epsilon = 0.0000000000000001 -const epsilonPercentile = .00000000001 diff --git a/metrics/exp/exp.go b/metrics/exp/exp.go index c894dd6ae05..6a2ebf7ae62 100644 --- a/metrics/exp/exp.go +++ b/metrics/exp/exp.go @@ -3,49 +3,18 @@ package exp import ( - "expvar" "fmt" "net/http" - "sync" metrics2 "github.com/VictoriaMetrics/metrics" - "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/log/v3" ) -type exp struct { - expvarLock sync.Mutex // expvar panics if you try to register the same var twice, so we must probe it safely - registry metrics.Registry -} - -func (exp *exp) expHandler(w http.ResponseWriter, r *http.Request) { - // load our variables into expvar - exp.syncToExpvar() - - // now just run the official expvar handler code (which is not publicly callable, so pasted inline) - w.Header().Set("Content-Type", "application/json; charset=utf-8") - fmt.Fprintf(w, "{\n") - first := true - expvar.Do(func(kv expvar.KeyValue) { - if !first { - fmt.Fprintf(w, ",\n") - } - first = false - fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value) - }) - fmt.Fprintf(w, "\n}\n") -} - -// ExpHandler will return an expvar powered metrics handler. -func ExpHandler(r metrics.Registry) http.Handler { - e := exp{sync.Mutex{}, r} - return http.HandlerFunc(e.expHandler) -} - // Setup starts a dedicated metrics server at the given address. // This function enables metrics reporting separate from pprof. func Setup(address string) { http.HandleFunc("/debug/metrics/prometheus", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") metrics2.WritePrometheus(w, true) }) //m.Handle("/debug/metrics", ExpHandler(metrics.DefaultRegistry)) @@ -59,121 +28,3 @@ func Setup(address string) { } }() } - -func (exp *exp) getInt(name string) *expvar.Int { - var v *expvar.Int - exp.expvarLock.Lock() - p := expvar.Get(name) - if p != nil { - v = p.(*expvar.Int) - } else { - v = new(expvar.Int) - expvar.Publish(name, v) - } - exp.expvarLock.Unlock() - return v -} - -func (exp *exp) getFloat(name string) *expvar.Float { - var v *expvar.Float - exp.expvarLock.Lock() - p := expvar.Get(name) - if p != nil { - v = p.(*expvar.Float) - } else { - v = new(expvar.Float) - expvar.Publish(name, v) - } - exp.expvarLock.Unlock() - return v -} - -func (exp *exp) publishCounter(name string, metric metrics.Counter) { - v := exp.getInt(name) - v.Set(metric.Count()) -} - -func (exp *exp) publishGauge(name string, metric metrics.Gauge) { - v := exp.getInt(name) - v.Set(metric.Value()) -} -func (exp *exp) publishGaugeFloat64(name string, metric metrics.GaugeFloat64) { - exp.getFloat(name).Set(metric.Value()) -} - -func (exp *exp) publishHistogram(name string, metric metrics.Histogram) { - h := metric.Snapshot() - ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - exp.getInt(name + ".count").Set(h.Count()) - exp.getFloat(name + ".min").Set(float64(h.Min())) - exp.getFloat(name + ".max").Set(float64(h.Max())) - exp.getFloat(name + ".mean").Set(h.Mean()) - exp.getFloat(name + ".std-dev").Set(h.StdDev()) - exp.getFloat(name + ".50-percentile").Set(ps[0]) - exp.getFloat(name + ".75-percentile").Set(ps[1]) - exp.getFloat(name + ".95-percentile").Set(ps[2]) - exp.getFloat(name + ".99-percentile").Set(ps[3]) - exp.getFloat(name + ".999-percentile").Set(ps[4]) -} - -func (exp *exp) publishMeter(name string, metric metrics.Meter) { - m := metric.Snapshot() - exp.getInt(name + ".count").Set(m.Count()) - exp.getFloat(name + ".one-minute").Set(m.Rate1()) - exp.getFloat(name + ".five-minute").Set(m.Rate5()) - exp.getFloat(name + ".fifteen-minute").Set(m.Rate15()) - exp.getFloat(name + ".mean").Set(m.RateMean()) -} - -func (exp *exp) publishTimer(name string, metric metrics.Timer) { - t := metric.Snapshot() - ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - exp.getInt(name + ".count").Set(t.Count()) - exp.getFloat(name + ".min").Set(float64(t.Min())) - exp.getFloat(name + ".max").Set(float64(t.Max())) - exp.getFloat(name + ".mean").Set(t.Mean()) - exp.getFloat(name + ".std-dev").Set(t.StdDev()) - exp.getFloat(name + ".50-percentile").Set(ps[0]) - exp.getFloat(name + ".75-percentile").Set(ps[1]) - exp.getFloat(name + ".95-percentile").Set(ps[2]) - exp.getFloat(name + ".99-percentile").Set(ps[3]) - exp.getFloat(name + ".999-percentile").Set(ps[4]) - exp.getFloat(name + ".one-minute").Set(t.Rate1()) - exp.getFloat(name + ".five-minute").Set(t.Rate5()) - exp.getFloat(name + ".fifteen-minute").Set(t.Rate15()) - exp.getFloat(name + ".mean-rate").Set(t.RateMean()) -} - -func (exp *exp) publishResettingTimer(name string, metric metrics.ResettingTimer) { - t := metric.Snapshot() - ps := t.Percentiles([]float64{50, 75, 95, 99}) - exp.getInt(name + ".count").Set(int64(len(t.Values()))) - exp.getFloat(name + ".mean").Set(t.Mean()) - exp.getInt(name + ".50-percentile").Set(ps[0]) - exp.getInt(name + ".75-percentile").Set(ps[1]) - exp.getInt(name + ".95-percentile").Set(ps[2]) - exp.getInt(name + ".99-percentile").Set(ps[3]) -} - -func (exp *exp) syncToExpvar() { - exp.registry.Each(func(name string, i interface{}) { - switch i := i.(type) { - case metrics.Counter: - exp.publishCounter(name, i) - case metrics.Gauge: - exp.publishGauge(name, i) - case metrics.GaugeFloat64: - exp.publishGaugeFloat64(name, i) - case metrics.Histogram: - exp.publishHistogram(name, i) - case metrics.Meter: - exp.publishMeter(name, i) - case metrics.Timer: - exp.publishTimer(name, i) - case metrics.ResettingTimer: - exp.publishResettingTimer(name, i) - default: - panic(fmt.Sprintf("unsupported type for '%s': %T", name, i)) - } - }) -} diff --git a/metrics/gauge.go b/metrics/gauge.go index b6b2758b0d1..f45f9557718 100644 --- a/metrics/gauge.go +++ b/metrics/gauge.go @@ -1,7 +1,5 @@ package metrics -import "sync/atomic" - // Gauges hold an int64 value that can be set arbitrarily. type Gauge interface { Snapshot() Gauge @@ -10,149 +8,3 @@ type Gauge interface { Inc(int64) Value() int64 } - -// GetOrRegisterGauge returns an existing Gauge or constructs and registers a -// new StandardGauge. -func GetOrRegisterGauge(name string, r Registry) Gauge { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewGauge).(Gauge) -} - -// NewGauge constructs a new StandardGauge. -func NewGauge() Gauge { - if !Enabled { - return NilGauge{} - } - return &StandardGauge{0} -} - -// NewRegisteredGauge constructs and registers a new StandardGauge. -func NewRegisteredGauge(name string, r Registry) Gauge { - c := NewGauge() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewFunctionalGauge constructs a new FunctionalGauge. -func NewFunctionalGauge(f func() int64) Gauge { - if !Enabled { - return NilGauge{} - } - return &FunctionalGauge{value: f} -} - -// NewRegisteredFunctionalGauge constructs and registers a new StandardGauge. -func NewRegisteredFunctionalGauge(name string, r Registry, f func() int64) Gauge { - c := NewFunctionalGauge(f) - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// GaugeSnapshot is a read-only copy of another Gauge. -type GaugeSnapshot int64 - -// Snapshot returns the snapshot. -func (g GaugeSnapshot) Snapshot() Gauge { return g } - -// Update panics. -func (GaugeSnapshot) Update(int64) { - panic("Update called on a GaugeSnapshot") -} - -// Dec panics. -func (GaugeSnapshot) Dec(int64) { - panic("Dec called on a GaugeSnapshot") -} - -// Inc panics. -func (GaugeSnapshot) Inc(int64) { - panic("Inc called on a GaugeSnapshot") -} - -// Value returns the value at the time the snapshot was taken. -func (g GaugeSnapshot) Value() int64 { return int64(g) } - -// NilGauge is a no-op Gauge. -type NilGauge struct{} - -// Snapshot is a no-op. -func (NilGauge) Snapshot() Gauge { return NilGauge{} } - -// Update is a no-op. -func (NilGauge) Update(v int64) {} - -// Dec is a no-op. -func (NilGauge) Dec(i int64) {} - -// Inc is a no-op. -func (NilGauge) Inc(i int64) {} - -// Value is a no-op. -func (NilGauge) Value() int64 { return 0 } - -// StandardGauge is the standard implementation of a Gauge and uses the -// sync/atomic package to manage a single int64 value. -type StandardGauge struct { - value int64 -} - -// Snapshot returns a read-only copy of the gauge. -func (g *StandardGauge) Snapshot() Gauge { - return GaugeSnapshot(g.Value()) -} - -// Update updates the gauge's value. -func (g *StandardGauge) Update(v int64) { - atomic.StoreInt64(&g.value, v) -} - -// Value returns the gauge's current value. -func (g *StandardGauge) Value() int64 { - return atomic.LoadInt64(&g.value) -} - -// Dec decrements the gauge's current value by the given amount. -func (g *StandardGauge) Dec(i int64) { - atomic.AddInt64(&g.value, -i) -} - -// Inc increments the gauge's current value by the given amount. -func (g *StandardGauge) Inc(i int64) { - atomic.AddInt64(&g.value, i) -} - -// FunctionalGauge returns value from given function -type FunctionalGauge struct { - value func() int64 -} - -// Value returns the gauge's current value. -func (g FunctionalGauge) Value() int64 { - return g.value() -} - -// Snapshot returns the snapshot. -func (g FunctionalGauge) Snapshot() Gauge { return GaugeSnapshot(g.Value()) } - -// Update panics. -func (FunctionalGauge) Update(int64) { - panic("Update called on a FunctionalGauge") -} - -// Dec panics. -func (FunctionalGauge) Dec(int64) { - panic("Dec called on a FunctionalGauge") -} - -// Inc panics. -func (FunctionalGauge) Inc(int64) { - panic("Inc called on a FunctionalGauge") -} diff --git a/metrics/gauge_float64.go b/metrics/gauge_float64.go index 66819c95777..4873eaa7f8a 100644 --- a/metrics/gauge_float64.go +++ b/metrics/gauge_float64.go @@ -1,127 +1,8 @@ package metrics -import "sync" - // GaugeFloat64s hold a float64 value that can be set arbitrarily. type GaugeFloat64 interface { Snapshot() GaugeFloat64 Update(float64) Value() float64 } - -// GetOrRegisterGaugeFloat64 returns an existing GaugeFloat64 or constructs and registers a -// new StandardGaugeFloat64. -func GetOrRegisterGaugeFloat64(name string, r Registry) GaugeFloat64 { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewGaugeFloat64()).(GaugeFloat64) -} - -// NewGaugeFloat64 constructs a new StandardGaugeFloat64. -func NewGaugeFloat64() GaugeFloat64 { - if !Enabled { - return NilGaugeFloat64{} - } - return &StandardGaugeFloat64{ - value: 0.0, - } -} - -// NewRegisteredGaugeFloat64 constructs and registers a new StandardGaugeFloat64. -func NewRegisteredGaugeFloat64(name string, r Registry) GaugeFloat64 { - c := NewGaugeFloat64() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewFunctionalGauge constructs a new FunctionalGauge. -func NewFunctionalGaugeFloat64(f func() float64) GaugeFloat64 { - if !Enabled { - return NilGaugeFloat64{} - } - return &FunctionalGaugeFloat64{value: f} -} - -// NewRegisteredFunctionalGauge constructs and registers a new StandardGauge. -func NewRegisteredFunctionalGaugeFloat64(name string, r Registry, f func() float64) GaugeFloat64 { - c := NewFunctionalGaugeFloat64(f) - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// GaugeFloat64Snapshot is a read-only copy of another GaugeFloat64. -type GaugeFloat64Snapshot float64 - -// Snapshot returns the snapshot. -func (g GaugeFloat64Snapshot) Snapshot() GaugeFloat64 { return g } - -// Update panics. -func (GaugeFloat64Snapshot) Update(float64) { - panic("Update called on a GaugeFloat64Snapshot") -} - -// Value returns the value at the time the snapshot was taken. -func (g GaugeFloat64Snapshot) Value() float64 { return float64(g) } - -// NilGauge is a no-op Gauge. -type NilGaugeFloat64 struct{} - -// Snapshot is a no-op. -func (NilGaugeFloat64) Snapshot() GaugeFloat64 { return NilGaugeFloat64{} } - -// Update is a no-op. -func (NilGaugeFloat64) Update(v float64) {} - -// Value is a no-op. -func (NilGaugeFloat64) Value() float64 { return 0.0 } - -// StandardGaugeFloat64 is the standard implementation of a GaugeFloat64 and uses -// sync.Mutex to manage a single float64 value. -type StandardGaugeFloat64 struct { - mutex sync.Mutex - value float64 -} - -// Snapshot returns a read-only copy of the gauge. -func (g *StandardGaugeFloat64) Snapshot() GaugeFloat64 { - return GaugeFloat64Snapshot(g.Value()) -} - -// Update updates the gauge's value. -func (g *StandardGaugeFloat64) Update(v float64) { - g.mutex.Lock() - defer g.mutex.Unlock() - g.value = v -} - -// Value returns the gauge's current value. -func (g *StandardGaugeFloat64) Value() float64 { - g.mutex.Lock() - defer g.mutex.Unlock() - return g.value -} - -// FunctionalGaugeFloat64 returns value from given function -type FunctionalGaugeFloat64 struct { - value func() float64 -} - -// Value returns the gauge's current value. -func (g FunctionalGaugeFloat64) Value() float64 { - return g.value() -} - -// Snapshot returns the snapshot. -func (g FunctionalGaugeFloat64) Snapshot() GaugeFloat64 { return GaugeFloat64Snapshot(g.Value()) } - -// Update panics. -func (FunctionalGaugeFloat64) Update(float64) { - panic("Update called on a FunctionalGaugeFloat64") -} diff --git a/metrics/gauge_float64_test.go b/metrics/gauge_float64_test.go deleted file mode 100644 index 84e06489784..00000000000 --- a/metrics/gauge_float64_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package metrics - -import "testing" - -func BenchmarkGuageFloat64(b *testing.B) { - g := NewGaugeFloat64() - b.ResetTimer() - for i := 0; i < b.N; i++ { - g.Update(float64(i)) - } -} - -func TestGaugeFloat64(t *testing.T) { - g := NewGaugeFloat64() - g.Update(47.0) - if v := g.Value(); 47.0 != v { //nolint:stylecheck - t.Errorf("g.Value(): 47.0 != %v\n", v) - } -} - -func TestGaugeFloat64Snapshot(t *testing.T) { - g := NewGaugeFloat64() - g.Update(47.0) - snapshot := g.Snapshot() - g.Update(float64(0)) - if v := snapshot.Value(); 47.0 != v { //nolint:stylecheck - - t.Errorf("g.Value(): 47.0 != %v\n", v) - } -} - -func TestGetOrRegisterGaugeFloat64(t *testing.T) { - r := NewRegistry() - NewRegisteredGaugeFloat64("foo", r).Update(47.0) - t.Logf("registry: %v", r) - if g := GetOrRegisterGaugeFloat64("foo", r); 47.0 != g.Value() { //nolint:stylecheck - - t.Fatal(g) - } -} - -func TestFunctionalGaugeFloat64(t *testing.T) { - var counter float64 - fg := NewFunctionalGaugeFloat64(func() float64 { - counter++ - return counter - }) - fg.Value() - fg.Value() - if counter != 2 { - t.Error("counter != 2") - } -} - -func TestGetOrRegisterFunctionalGaugeFloat64(t *testing.T) { - r := NewRegistry() - NewRegisteredFunctionalGaugeFloat64("foo", r, func() float64 { return 47 }) - if g := GetOrRegisterGaugeFloat64("foo", r); g.Value() != 47 { - t.Fatal(g) - } -} diff --git a/metrics/gauge_test.go b/metrics/gauge_test.go deleted file mode 100644 index 3aee143455c..00000000000 --- a/metrics/gauge_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package metrics - -import ( - "fmt" - "testing" -) - -func BenchmarkGuage(b *testing.B) { - g := NewGauge() - b.ResetTimer() - for i := 0; i < b.N; i++ { - g.Update(int64(i)) - } -} - -func TestGauge(t *testing.T) { - g := NewGauge() - g.Update(int64(47)) - if v := g.Value(); v != 47 { - t.Errorf("g.Value(): 47 != %v\n", v) - } -} - -func TestGaugeSnapshot(t *testing.T) { - g := NewGauge() - g.Update(int64(47)) - snapshot := g.Snapshot() - g.Update(int64(0)) - if v := snapshot.Value(); v != 47 { - t.Errorf("g.Value(): 47 != %v\n", v) - } -} - -func TestGetOrRegisterGauge(t *testing.T) { - r := NewRegistry() - NewRegisteredGauge("foo", r).Update(47) - if g := GetOrRegisterGauge("foo", r); g.Value() != 47 { - t.Fatal(g) - } -} - -func TestFunctionalGauge(t *testing.T) { - var counter int64 - fg := NewFunctionalGauge(func() int64 { - counter++ - return counter - }) - fg.Value() - fg.Value() - if counter != 2 { - t.Error("counter != 2") - } -} - -func TestGetOrRegisterFunctionalGauge(t *testing.T) { - r := NewRegistry() - NewRegisteredFunctionalGauge("foo", r, func() int64 { return 47 }) - if g := GetOrRegisterGauge("foo", r); g.Value() != 47 { - t.Fatal(g) - } -} - -func ExampleGetOrRegisterGauge() { - m := "server.bytes_sent" - g := GetOrRegisterGauge(m, nil) - g.Update(47) - fmt.Println(g.Value()) // Output: 47 -} diff --git a/metrics/graphite.go b/metrics/graphite.go deleted file mode 100644 index 142eec86beb..00000000000 --- a/metrics/graphite.go +++ /dev/null @@ -1,113 +0,0 @@ -package metrics - -import ( - "bufio" - "fmt" - "log" - "net" - "strconv" - "strings" - "time" -) - -// GraphiteConfig provides a container with configuration parameters for -// the Graphite exporter -type GraphiteConfig struct { - Addr *net.TCPAddr // Network address to connect to - Registry Registry // Registry to be exported - FlushInterval time.Duration // Flush interval - DurationUnit time.Duration // Time conversion unit for durations - Prefix string // Prefix to be prepended to metric names - Percentiles []float64 // Percentiles to export from timers and histograms -} - -// Graphite is a blocking exporter function which reports metrics in r -// to a graphite server located at addr, flushing them every d duration -// and prepending metric names with prefix. -func Graphite(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) { - GraphiteWithConfig(GraphiteConfig{ - Addr: addr, - Registry: r, - FlushInterval: d, - DurationUnit: time.Nanosecond, - Prefix: prefix, - Percentiles: []float64{0.5, 0.75, 0.95, 0.99, 0.999}, - }) -} - -// GraphiteWithConfig is a blocking exporter function just like Graphite, -// but it takes a GraphiteConfig instead. -func GraphiteWithConfig(c GraphiteConfig) { - log.Printf("WARNING: This go-metrics client has been DEPRECATED! It has been moved to https://github.com/cyberdelia/go-metrics-graphite and will be removed from rcrowley/go-metrics on August 12th 2015") - for range time.Tick(c.FlushInterval) { - if err := graphite(&c); nil != err { - log.Println(err) - } - } -} - -// GraphiteOnce performs a single submission to Graphite, returning a -// non-nil error on failed connections. This can be used in a loop -// similar to GraphiteWithConfig for custom error handling. -func GraphiteOnce(c GraphiteConfig) error { - log.Printf("WARNING: This go-metrics client has been DEPRECATED! It has been moved to https://github.com/cyberdelia/go-metrics-graphite and will be removed from rcrowley/go-metrics on August 12th 2015") - return graphite(&c) -} - -func graphite(c *GraphiteConfig) error { - now := time.Now().Unix() - du := float64(c.DurationUnit) - conn, err := net.DialTCP("tcp", nil, c.Addr) - if nil != err { - return err - } - defer conn.Close() - w := bufio.NewWriter(conn) - c.Registry.Each(func(name string, i interface{}) { - switch metric := i.(type) { - case Counter: - fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, metric.Count(), now) - case Gauge: - fmt.Fprintf(w, "%s.%s.value %d %d\n", c.Prefix, name, metric.Value(), now) - case GaugeFloat64: - fmt.Fprintf(w, "%s.%s.value %f %d\n", c.Prefix, name, metric.Value(), now) - case Histogram: - h := metric.Snapshot() - ps := h.Percentiles(c.Percentiles) - fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, h.Count(), now) - fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, h.Min(), now) - fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, h.Max(), now) - fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, h.Mean(), now) - fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, h.StdDev(), now) - for psIdx, psKey := range c.Percentiles { - key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1) - fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now) - } - case Meter: - m := metric.Snapshot() - fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, m.Count(), now) - fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, m.Rate1(), now) - fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, m.Rate5(), now) - fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, m.Rate15(), now) - fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, m.RateMean(), now) - case Timer: - t := metric.Snapshot() - ps := t.Percentiles(c.Percentiles) - fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, t.Count(), now) - fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, t.Min()/int64(du), now) - fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, t.Max()/int64(du), now) - fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, t.Mean()/du, now) - fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, t.StdDev()/du, now) - for psIdx, psKey := range c.Percentiles { - key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1) - fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now) - } - fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, t.Rate1(), now) - fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, t.Rate5(), now) - fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, t.Rate15(), now) - fmt.Fprintf(w, "%s.%s.mean-rate %.2f %d\n", c.Prefix, name, t.RateMean(), now) - } - w.Flush() - }) - return nil -} diff --git a/metrics/graphite_test.go b/metrics/graphite_test.go deleted file mode 100644 index c797c781df6..00000000000 --- a/metrics/graphite_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package metrics - -import ( - "net" - "time" -) - -func ExampleGraphite() { - addr, _ := net.ResolveTCPAddr("net", ":2003") - go Graphite(DefaultRegistry, 1*time.Second, "some.prefix", addr) -} - -func ExampleGraphiteWithConfig() { - addr, _ := net.ResolveTCPAddr("net", ":2003") - go GraphiteWithConfig(GraphiteConfig{ - Addr: addr, - Registry: DefaultRegistry, - FlushInterval: 1 * time.Second, - DurationUnit: time.Millisecond, - Percentiles: []float64{0.5, 0.75, 0.99, 0.999}, - }) -} diff --git a/metrics/healthcheck.go b/metrics/healthcheck.go index f1ae31e34ae..09cf7482bdb 100644 --- a/metrics/healthcheck.go +++ b/metrics/healthcheck.go @@ -7,55 +7,3 @@ type Healthcheck interface { Healthy() Unhealthy(error) } - -// NewHealthcheck constructs a new Healthcheck which will use the given -// function to update its status. -func NewHealthcheck(f func(Healthcheck)) Healthcheck { - if !Enabled { - return NilHealthcheck{} - } - return &StandardHealthcheck{nil, f} -} - -// NilHealthcheck is a no-op. -type NilHealthcheck struct{} - -// Check is a no-op. -func (NilHealthcheck) Check() {} - -// Error is a no-op. -func (NilHealthcheck) Error() error { return nil } - -// Healthy is a no-op. -func (NilHealthcheck) Healthy() {} - -// Unhealthy is a no-op. -func (NilHealthcheck) Unhealthy(error) {} - -// StandardHealthcheck is the standard implementation of a Healthcheck and -// stores the status and a function to call to update the status. -type StandardHealthcheck struct { - err error - f func(Healthcheck) -} - -// Check runs the healthcheck function to update the healthcheck's status. -func (h *StandardHealthcheck) Check() { - h.f(h) -} - -// Error returns the healthcheck's status, which will be nil if it is healthy. -func (h *StandardHealthcheck) Error() error { - return h.err -} - -// Healthy marks the healthcheck as healthy. -func (h *StandardHealthcheck) Healthy() { - h.err = nil -} - -// Unhealthy marks the healthcheck as unhealthy. The error is stored and -// may be retrieved by the Error method. -func (h *StandardHealthcheck) Unhealthy(err error) { - h.err = err -} diff --git a/metrics/histogram.go b/metrics/histogram.go index 46f3bbd2f13..6cfaa7cd2b8 100644 --- a/metrics/histogram.go +++ b/metrics/histogram.go @@ -16,187 +16,3 @@ type Histogram interface { Update(int64) Variance() float64 } - -// GetOrRegisterHistogram returns an existing Histogram or constructs and -// registers a new StandardHistogram. -func GetOrRegisterHistogram(name string, r Registry, s Sample) Histogram { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, func() Histogram { return NewHistogram(s) }).(Histogram) -} - -// NewHistogram constructs a new StandardHistogram from a Sample. -func NewHistogram(s Sample) Histogram { - if !Enabled { - return NilHistogram{} - } - return &StandardHistogram{sample: s} -} - -// NewRegisteredHistogram constructs and registers a new StandardHistogram from -// a Sample. -func NewRegisteredHistogram(name string, r Registry, s Sample) Histogram { - c := NewHistogram(s) - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// HistogramSnapshot is a read-only copy of another Histogram. -type HistogramSnapshot struct { - sample *SampleSnapshot -} - -// Clear panics. -func (*HistogramSnapshot) Clear() { - panic("Clear called on a HistogramSnapshot") -} - -// Count returns the number of samples recorded at the time the snapshot was -// taken. -func (h *HistogramSnapshot) Count() int64 { return h.sample.Count() } - -// Max returns the maximum value in the sample at the time the snapshot was -// taken. -func (h *HistogramSnapshot) Max() int64 { return h.sample.Max() } - -// Mean returns the mean of the values in the sample at the time the snapshot -// was taken. -func (h *HistogramSnapshot) Mean() float64 { return h.sample.Mean() } - -// Min returns the minimum value in the sample at the time the snapshot was -// taken. -func (h *HistogramSnapshot) Min() int64 { return h.sample.Min() } - -// Percentile returns an arbitrary percentile of values in the sample at the -// time the snapshot was taken. -func (h *HistogramSnapshot) Percentile(p float64) float64 { - return h.sample.Percentile(p) -} - -// Percentiles returns a slice of arbitrary percentiles of values in the sample -// at the time the snapshot was taken. -func (h *HistogramSnapshot) Percentiles(ps []float64) []float64 { - return h.sample.Percentiles(ps) -} - -// Sample returns the Sample underlying the histogram. -func (h *HistogramSnapshot) Sample() Sample { return h.sample } - -// Snapshot returns the snapshot. -func (h *HistogramSnapshot) Snapshot() Histogram { return h } - -// StdDev returns the standard deviation of the values in the sample at the -// time the snapshot was taken. -func (h *HistogramSnapshot) StdDev() float64 { return h.sample.StdDev() } - -// Sum returns the sum in the sample at the time the snapshot was taken. -func (h *HistogramSnapshot) Sum() int64 { return h.sample.Sum() } - -// Update panics. -func (*HistogramSnapshot) Update(int64) { - panic("Update called on a HistogramSnapshot") -} - -// Variance returns the variance of inputs at the time the snapshot was taken. -func (h *HistogramSnapshot) Variance() float64 { return h.sample.Variance() } - -// NilHistogram is a no-op Histogram. -type NilHistogram struct{} - -// Clear is a no-op. -func (NilHistogram) Clear() {} - -// Count is a no-op. -func (NilHistogram) Count() int64 { return 0 } - -// Max is a no-op. -func (NilHistogram) Max() int64 { return 0 } - -// Mean is a no-op. -func (NilHistogram) Mean() float64 { return 0.0 } - -// Min is a no-op. -func (NilHistogram) Min() int64 { return 0 } - -// Percentile is a no-op. -func (NilHistogram) Percentile(p float64) float64 { return 0.0 } - -// Percentiles is a no-op. -func (NilHistogram) Percentiles(ps []float64) []float64 { - return make([]float64, len(ps)) -} - -// Sample is a no-op. -func (NilHistogram) Sample() Sample { return NilSample{} } - -// Snapshot is a no-op. -func (NilHistogram) Snapshot() Histogram { return NilHistogram{} } - -// StdDev is a no-op. -func (NilHistogram) StdDev() float64 { return 0.0 } - -// Sum is a no-op. -func (NilHistogram) Sum() int64 { return 0 } - -// Update is a no-op. -func (NilHistogram) Update(v int64) {} - -// Variance is a no-op. -func (NilHistogram) Variance() float64 { return 0.0 } - -// StandardHistogram is the standard implementation of a Histogram and uses a -// Sample to bound its memory use. -type StandardHistogram struct { - sample Sample -} - -// Clear clears the histogram and its sample. -func (h *StandardHistogram) Clear() { h.sample.Clear() } - -// Count returns the number of samples recorded since the histogram was last -// cleared. -func (h *StandardHistogram) Count() int64 { return h.sample.Count() } - -// Max returns the maximum value in the sample. -func (h *StandardHistogram) Max() int64 { return h.sample.Max() } - -// Mean returns the mean of the values in the sample. -func (h *StandardHistogram) Mean() float64 { return h.sample.Mean() } - -// Min returns the minimum value in the sample. -func (h *StandardHistogram) Min() int64 { return h.sample.Min() } - -// Percentile returns an arbitrary percentile of the values in the sample. -func (h *StandardHistogram) Percentile(p float64) float64 { - return h.sample.Percentile(p) -} - -// Percentiles returns a slice of arbitrary percentiles of the values in the -// sample. -func (h *StandardHistogram) Percentiles(ps []float64) []float64 { - return h.sample.Percentiles(ps) -} - -// Sample returns the Sample underlying the histogram. -func (h *StandardHistogram) Sample() Sample { return h.sample } - -// Snapshot returns a read-only copy of the histogram. -func (h *StandardHistogram) Snapshot() Histogram { - return &HistogramSnapshot{sample: h.sample.Snapshot().(*SampleSnapshot)} -} - -// StdDev returns the standard deviation of the values in the sample. -func (h *StandardHistogram) StdDev() float64 { return h.sample.StdDev() } - -// Sum returns the sum in the sample. -func (h *StandardHistogram) Sum() int64 { return h.sample.Sum() } - -// Update samples a new value. -func (h *StandardHistogram) Update(v int64) { h.sample.Update(v) } - -// Variance returns the variance of the values in the sample. -func (h *StandardHistogram) Variance() float64 { return h.sample.Variance() } diff --git a/metrics/histogram_test.go b/metrics/histogram_test.go deleted file mode 100644 index 7c9f42fcec9..00000000000 --- a/metrics/histogram_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package metrics - -import "testing" - -func BenchmarkHistogram(b *testing.B) { - h := NewHistogram(NewUniformSample(100)) - b.ResetTimer() - for i := 0; i < b.N; i++ { - h.Update(int64(i)) - } -} - -func TestGetOrRegisterHistogram(t *testing.T) { - r := NewRegistry() - s := NewUniformSample(100) - NewRegisteredHistogram("foo", r, s).Update(47) - if h := GetOrRegisterHistogram("foo", r, s); h.Count() != 1 { - t.Fatal(h) - } -} - -func TestHistogram10000(t *testing.T) { - h := NewHistogram(NewUniformSample(100000)) - for i := 1; i <= 10000; i++ { - h.Update(int64(i)) - } - testHistogram10000(t, h) -} - -func TestHistogramEmpty(t *testing.T) { - h := NewHistogram(NewUniformSample(100)) - if count := h.Count(); count != 0 { - t.Errorf("h.Count(): 0 != %v\n", count) - } - if min := h.Min(); min != 0 { - t.Errorf("h.Min(): 0 != %v\n", min) - } - if max := h.Max(); max != 0 { - t.Errorf("h.Max(): 0 != %v\n", max) - } - if mean := h.Mean(); mean != 0.0 { - t.Errorf("h.Mean(): 0.0 != %v\n", mean) - } - if stdDev := h.StdDev(); stdDev != 0.0 { - t.Errorf("h.StdDev(): 0.0 != %v\n", stdDev) - } - ps := h.Percentiles([]float64{0.5, 0.75, 0.99}) - if ps[0] != 0.0 { - t.Errorf("median: 0.0 != %v\n", ps[0]) - } - if ps[1] != 0.0 { - t.Errorf("75th percentile: 0.0 != %v\n", ps[1]) - } - if ps[2] != 0.0 { - t.Errorf("99th percentile: 0.0 != %v\n", ps[2]) - } -} - -func TestHistogramSnapshot(t *testing.T) { - h := NewHistogram(NewUniformSample(100000)) - for i := 1; i <= 10000; i++ { - h.Update(int64(i)) - } - snapshot := h.Snapshot() - h.Update(0) - testHistogram10000(t, snapshot) -} - -func testHistogram10000(t *testing.T, h Histogram) { - if count := h.Count(); count != 10000 { - t.Errorf("h.Count(): 10000 != %v\n", count) - } - if min := h.Min(); min != 1 { - t.Errorf("h.Min(): 1 != %v\n", min) - } - if max := h.Max(); max != 10000 { - t.Errorf("h.Max(): 10000 != %v\n", max) - } - if mean := h.Mean(); mean != 5000.5 { - t.Errorf("h.Mean(): 5000.5 != %v\n", mean) - } - if stdDev := h.StdDev(); stdDev != 2886.751331514372 { - t.Errorf("h.StdDev(): 2886.751331514372 != %v\n", stdDev) - } - ps := h.Percentiles([]float64{0.5, 0.75, 0.99}) - if ps[0] != 5000.5 { - t.Errorf("median: 5000.5 != %v\n", ps[0]) - } - if ps[1] != 7500.75 { - t.Errorf("75th percentile: 7500.75 != %v\n", ps[1]) - } - if ps[2] != 9900.99 { - t.Errorf("99th percentile: 9900.99 != %v\n", ps[2]) - } -} diff --git a/metrics/json.go b/metrics/json.go index 2087d8211eb..8c368010744 100644 --- a/metrics/json.go +++ b/metrics/json.go @@ -2,8 +2,6 @@ package metrics import ( "encoding/json" - "io" - "time" ) // MarshalJSON returns a byte slice containing a JSON representation of all @@ -11,21 +9,3 @@ import ( func (r *StandardRegistry) MarshalJSON() ([]byte, error) { return json.Marshal(r.GetAll()) } - -// WriteJSON writes metrics from the given registry periodically to the -// specified io.Writer as JSON. -func WriteJSON(r Registry, d time.Duration, w io.Writer) { - for range time.Tick(d) { - WriteJSONOnce(r, w) - } -} - -// WriteJSONOnce writes metrics from the given registry to the specified -// io.Writer as JSON. -func WriteJSONOnce(r Registry, w io.Writer) { - json.NewEncoder(w).Encode(r) -} - -func (p *PrefixedRegistry) MarshalJSON() ([]byte, error) { - return json.Marshal(p.GetAll()) -} diff --git a/metrics/json_test.go b/metrics/json_test.go deleted file mode 100644 index f91fe8cfa54..00000000000 --- a/metrics/json_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package metrics - -import ( - "bytes" - "encoding/json" - "testing" -) - -func TestRegistryMarshallJSON(t *testing.T) { - b := &bytes.Buffer{} - enc := json.NewEncoder(b) - r := NewRegistry() - r.Register("counter", NewCounter()) - enc.Encode(r) - if s := b.String(); s != "{\"counter\":{\"count\":0}}\n" { - t.Fatalf(s) - } -} - -func TestRegistryWriteJSONOnce(t *testing.T) { - r := NewRegistry() - r.Register("counter", NewCounter()) - b := &bytes.Buffer{} - WriteJSONOnce(r, b) - if s := b.String(); s != "{\"counter\":{\"count\":0}}\n" { - t.Fail() - } -} diff --git a/metrics/librato/client.go b/metrics/librato/client.go deleted file mode 100644 index f7aed3e4ef9..00000000000 --- a/metrics/librato/client.go +++ /dev/null @@ -1,102 +0,0 @@ -package librato - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" -) - -const Operations = "operations" -const OperationsShort = "ops" - -type LibratoClient struct { - Email, Token string -} - -// property strings -const ( - // display attributes - Color = "color" - DisplayMax = "display_max" - DisplayMin = "display_min" - DisplayUnitsLong = "display_units_long" - DisplayUnitsShort = "display_units_short" - DisplayStacked = "display_stacked" - DisplayTransform = "display_transform" - // special gauge display attributes - SummarizeFunction = "summarize_function" - Aggregate = "aggregate" - - // metric keys - Name = "name" - Period = "period" - Description = "description" - DisplayName = "display_name" - Attributes = "attributes" - - // measurement keys - MeasureTime = "measure_time" - Source = "source" - Value = "value" - - // special gauge keys - Count = "count" - Sum = "sum" - Max = "max" - Min = "min" - SumSquares = "sum_squares" - - // batch keys - Counters = "counters" - Gauges = "gauges" - - MetricsPostUrl = "https://metrics-api.librato.com/v1/metrics" -) - -type Measurement map[string]interface{} -type Metric map[string]interface{} - -type Batch struct { - Gauges []Measurement `json:"gauges,omitempty"` - Counters []Measurement `json:"counters,omitempty"` - MeasureTime int64 `json:"measure_time"` - Source string `json:"source"` -} - -func (c *LibratoClient) PostMetrics(batch Batch) (err error) { - var ( - js []byte - req *http.Request - resp *http.Response - ) - - if len(batch.Counters) == 0 && len(batch.Gauges) == 0 { - return nil - } - - if js, err = json.Marshal(batch); err != nil { - return - } - - if req, err = http.NewRequest("POST", MetricsPostUrl, bytes.NewBuffer(js)); err != nil { - return - } - - req.Header.Set("Content-Type", "application/json") - req.SetBasicAuth(c.Email, c.Token) - - if resp, err = http.DefaultClient.Do(req); err != nil { - return - } - - if resp.StatusCode != http.StatusOK { - var body []byte - if body, err = ioutil.ReadAll(resp.Body); err != nil { - body = []byte(fmt.Sprintf("(could not fetch response body for error: %s)", err)) - } - err = fmt.Errorf("unable to post to Librato: %d %s %s", resp.StatusCode, resp.Status, string(body)) - } - return -} diff --git a/metrics/librato/librato.go b/metrics/librato/librato.go deleted file mode 100644 index fdab6da48c7..00000000000 --- a/metrics/librato/librato.go +++ /dev/null @@ -1,236 +0,0 @@ -package librato - -import ( - "fmt" - "log" - "math" - "regexp" - "time" - - "github.com/ledgerwatch/erigon/metrics" -) - -// a regexp for extracting the unit from time.Duration.String -var unitRegexp = regexp.MustCompile(`[^\\d]+$`) - -// a helper that turns a time.Duration into librato display attributes for timer metrics -func translateTimerAttributes(d time.Duration) (attrs map[string]interface{}) { - attrs = make(map[string]interface{}) - attrs[DisplayTransform] = fmt.Sprintf("x/%d", int64(d)) - attrs[DisplayUnitsShort] = string(unitRegexp.Find([]byte(d.String()))) - return -} - -type Reporter struct { - Email, Token string - Namespace string - Source string - Interval time.Duration - Registry metrics.Registry - Percentiles []float64 // percentiles to report on histogram metrics - TimerAttributes map[string]interface{} // units in which timers will be displayed - intervalSec int64 -} - -func NewReporter(r metrics.Registry, d time.Duration, e string, t string, s string, p []float64, u time.Duration) *Reporter { - return &Reporter{e, t, "", s, d, r, p, translateTimerAttributes(u), int64(d / time.Second)} -} - -func Librato(r metrics.Registry, d time.Duration, e string, t string, s string, p []float64, u time.Duration) { - NewReporter(r, d, e, t, s, p, u).Run() -} - -func (rep *Reporter) Run() { - log.Printf("WARNING: This client has been DEPRECATED! It has been moved to https://github.com/mihasya/go-metrics-librato and will be removed from rcrowley/go-metrics on August 5th 2015") - ticker := time.NewTicker(rep.Interval) - defer ticker.Stop() - metricsApi := &LibratoClient{rep.Email, rep.Token} - for now := range ticker.C { - var metrics Batch - var err error - if metrics, err = rep.BuildRequest(now, rep.Registry); err != nil { - log.Printf("ERROR constructing librato request body %s", err) - continue - } - if err := metricsApi.PostMetrics(metrics); err != nil { - log.Printf("ERROR sending metrics to librato %s", err) - continue - } - } -} - -// calculate sum of squares from data provided by metrics.Histogram -// see http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods -func sumSquares(s metrics.Sample) float64 { - count := float64(s.Count()) - sumSquared := math.Pow(count*s.Mean(), 2) - sumSquares := math.Pow(count*s.StdDev(), 2) + sumSquared/count - if math.IsNaN(sumSquares) { - return 0.0 - } - return sumSquares -} -func sumSquaresTimer(t metrics.Timer) float64 { - count := float64(t.Count()) - sumSquared := math.Pow(count*t.Mean(), 2) - sumSquares := math.Pow(count*t.StdDev(), 2) + sumSquared/count - if math.IsNaN(sumSquares) { - return 0.0 - } - return sumSquares -} - -func (rep *Reporter) BuildRequest(now time.Time, r metrics.Registry) (snapshot Batch, err error) { - snapshot = Batch{ - // coerce timestamps to a stepping fn so that they line up in Librato graphs - MeasureTime: (now.Unix() / rep.intervalSec) * rep.intervalSec, - Source: rep.Source, - } - snapshot.Gauges = make([]Measurement, 0) - snapshot.Counters = make([]Measurement, 0) - histogramGaugeCount := 1 + len(rep.Percentiles) - r.Each(func(name string, metric interface{}) { - if rep.Namespace != "" { - name = fmt.Sprintf("%s.%s", rep.Namespace, name) - } - measurement := Measurement{} - measurement[Period] = rep.Interval.Seconds() - switch m := metric.(type) { - case metrics.Counter: - if m.Count() > 0 { - measurement[Name] = fmt.Sprintf("%s.%s", name, "count") - measurement[Value] = float64(m.Count()) - measurement[Attributes] = map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - } - snapshot.Counters = append(snapshot.Counters, measurement) - } - case metrics.Gauge: - measurement[Name] = name - measurement[Value] = float64(m.Value()) - snapshot.Gauges = append(snapshot.Gauges, measurement) - case metrics.GaugeFloat64: - measurement[Name] = name - measurement[Value] = m.Value() - snapshot.Gauges = append(snapshot.Gauges, measurement) - case metrics.Histogram: - if m.Count() > 0 { - gauges := make([]Measurement, histogramGaugeCount) - s := m.Sample() - measurement[Name] = fmt.Sprintf("%s.%s", name, "hist") - measurement[Count] = uint64(s.Count()) - measurement[Max] = float64(s.Max()) - measurement[Min] = float64(s.Min()) - measurement[Sum] = float64(s.Sum()) - measurement[SumSquares] = sumSquares(s) - gauges[0] = measurement - for i, p := range rep.Percentiles { - gauges[i+1] = Measurement{ - Name: fmt.Sprintf("%s.%.2f", measurement[Name], p), - Value: s.Percentile(p), - Period: measurement[Period], - } - } - snapshot.Gauges = append(snapshot.Gauges, gauges...) - } - case metrics.Meter: - measurement[Name] = name - measurement[Value] = float64(m.Count()) - snapshot.Counters = append(snapshot.Counters, measurement) - snapshot.Gauges = append(snapshot.Gauges, - Measurement{ - Name: fmt.Sprintf("%s.%s", name, "1min"), - Value: m.Rate1(), - Period: int64(rep.Interval.Seconds()), - Attributes: map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - }, - }, - Measurement{ - Name: fmt.Sprintf("%s.%s", name, "5min"), - Value: m.Rate5(), - Period: int64(rep.Interval.Seconds()), - Attributes: map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - }, - }, - Measurement{ - Name: fmt.Sprintf("%s.%s", name, "15min"), - Value: m.Rate15(), - Period: int64(rep.Interval.Seconds()), - Attributes: map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - }, - }, - ) - case metrics.Timer: - measurement[Name] = name - measurement[Value] = float64(m.Count()) - snapshot.Counters = append(snapshot.Counters, measurement) - if m.Count() > 0 { - libratoName := fmt.Sprintf("%s.%s", name, "timer.mean") - gauges := make([]Measurement, histogramGaugeCount) - gauges[0] = Measurement{ - Name: libratoName, - Count: uint64(m.Count()), - Sum: m.Mean() * float64(m.Count()), - Max: float64(m.Max()), - Min: float64(m.Min()), - SumSquares: sumSquaresTimer(m), - Period: int64(rep.Interval.Seconds()), - Attributes: rep.TimerAttributes, - } - for i, p := range rep.Percentiles { - gauges[i+1] = Measurement{ - Name: fmt.Sprintf("%s.timer.%2.0f", name, p*100), - Value: m.Percentile(p), - Period: int64(rep.Interval.Seconds()), - Attributes: rep.TimerAttributes, - } - } - snapshot.Gauges = append(snapshot.Gauges, gauges...) - snapshot.Gauges = append(snapshot.Gauges, - Measurement{ - Name: fmt.Sprintf("%s.%s", name, "rate.1min"), - Value: m.Rate1(), - Period: int64(rep.Interval.Seconds()), - Attributes: map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - }, - }, - Measurement{ - Name: fmt.Sprintf("%s.%s", name, "rate.5min"), - Value: m.Rate5(), - Period: int64(rep.Interval.Seconds()), - Attributes: map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - }, - }, - Measurement{ - Name: fmt.Sprintf("%s.%s", name, "rate.15min"), - Value: m.Rate15(), - Period: int64(rep.Interval.Seconds()), - Attributes: map[string]interface{}{ - DisplayUnitsLong: Operations, - DisplayUnitsShort: OperationsShort, - DisplayMin: "0", - }, - }, - ) - } - } - }) - return -} diff --git a/metrics/log.go b/metrics/log.go deleted file mode 100644 index 0c8ea7c9712..00000000000 --- a/metrics/log.go +++ /dev/null @@ -1,80 +0,0 @@ -package metrics - -import ( - "time" -) - -type Logger interface { - Printf(format string, v ...interface{}) -} - -func Log(r Registry, freq time.Duration, l Logger) { - LogScaled(r, freq, time.Nanosecond, l) -} - -// Output each metric in the given registry periodically using the given -// logger. Print timings in `scale` units (eg time.Millisecond) rather than nanos. -func LogScaled(r Registry, freq time.Duration, scale time.Duration, l Logger) { - du := float64(scale) - duSuffix := scale.String()[1:] - - for range time.Tick(freq) { - r.Each(func(name string, i interface{}) { - switch metric := i.(type) { - case Counter: - l.Printf("counter %s\n", name) - l.Printf(" count: %9d\n", metric.Count()) - case Gauge: - l.Printf("gauge %s\n", name) - l.Printf(" value: %9d\n", metric.Value()) - case GaugeFloat64: - l.Printf("gauge %s\n", name) - l.Printf(" value: %f\n", metric.Value()) - case Healthcheck: - metric.Check() - l.Printf("healthcheck %s\n", name) - l.Printf(" error: %v\n", metric.Error()) - case Histogram: - h := metric.Snapshot() - ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - l.Printf("histogram %s\n", name) - l.Printf(" count: %9d\n", h.Count()) - l.Printf(" min: %9d\n", h.Min()) - l.Printf(" max: %9d\n", h.Max()) - l.Printf(" mean: %12.2f\n", h.Mean()) - l.Printf(" stddev: %12.2f\n", h.StdDev()) - l.Printf(" median: %12.2f\n", ps[0]) - l.Printf(" 75%%: %12.2f\n", ps[1]) - l.Printf(" 95%%: %12.2f\n", ps[2]) - l.Printf(" 99%%: %12.2f\n", ps[3]) - l.Printf(" 99.9%%: %12.2f\n", ps[4]) - case Meter: - m := metric.Snapshot() - l.Printf("meter %s\n", name) - l.Printf(" count: %9d\n", m.Count()) - l.Printf(" 1-min rate: %12.2f\n", m.Rate1()) - l.Printf(" 5-min rate: %12.2f\n", m.Rate5()) - l.Printf(" 15-min rate: %12.2f\n", m.Rate15()) - l.Printf(" mean rate: %12.2f\n", m.RateMean()) - case Timer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - l.Printf("timer %s\n", name) - l.Printf(" count: %9d\n", t.Count()) - l.Printf(" min: %12.2f%s\n", float64(t.Min())/du, duSuffix) - l.Printf(" max: %12.2f%s\n", float64(t.Max())/du, duSuffix) - l.Printf(" mean: %12.2f%s\n", t.Mean()/du, duSuffix) - l.Printf(" stddev: %12.2f%s\n", t.StdDev()/du, duSuffix) - l.Printf(" median: %12.2f%s\n", ps[0]/du, duSuffix) - l.Printf(" 75%%: %12.2f%s\n", ps[1]/du, duSuffix) - l.Printf(" 95%%: %12.2f%s\n", ps[2]/du, duSuffix) - l.Printf(" 99%%: %12.2f%s\n", ps[3]/du, duSuffix) - l.Printf(" 99.9%%: %12.2f%s\n", ps[4]/du, duSuffix) - l.Printf(" 1-min rate: %12.2f\n", t.Rate1()) - l.Printf(" 5-min rate: %12.2f\n", t.Rate5()) - l.Printf(" 15-min rate: %12.2f\n", t.Rate15()) - l.Printf(" mean rate: %12.2f\n", t.RateMean()) - } - }) - } -} diff --git a/metrics/meter.go b/metrics/meter.go index 87a5a91dc2a..64517cdd884 100644 --- a/metrics/meter.go +++ b/metrics/meter.go @@ -21,45 +21,6 @@ type Meter interface { Stop() } -// GetOrRegisterMeter returns an existing Meter or constructs and registers a -// new StandardMeter. -// Be sure to unregister the meter from the registry once it is of no use to -// allow for garbage collection. -func GetOrRegisterMeter(name string, r Registry) Meter { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewMeter).(Meter) -} - -// GetOrRegisterMeterForced returns an existing Meter or constructs and registers a -// new StandardMeter no matter the global switch is enabled or not. -// Be sure to unregister the meter from the registry once it is of no use to -// allow for garbage collection. -func GetOrRegisterMeterForced(name string, r Registry) Meter { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewMeterForced).(Meter) -} - -// NewMeter constructs a new StandardMeter and launches a goroutine. -// Be sure to call Stop() once the meter is of no use to allow for garbage collection. -func NewMeter() Meter { - if !Enabled { - return NilMeter{} - } - m := newStandardMeter() - arbiter.mu.Lock() - defer arbiter.mu.Unlock() - arbiter.meters[m] = struct{}{} - if !arbiter.started { - arbiter.started = true - go arbiter.tick() - } - return m -} - // NewMeterForced constructs a new StandardMeter and launches a goroutine no matter // the global switch is enabled or not. // Be sure to call Stop() once the meter is of no use to allow for garbage collection. @@ -75,32 +36,6 @@ func NewMeterForced() Meter { return m } -// NewRegisteredMeter constructs and registers a new StandardMeter -// and launches a goroutine. -// Be sure to unregister the meter from the registry once it is of no use to -// allow for garbage collection. -func NewRegisteredMeter(name string, r Registry) Meter { - c := NewMeter() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewRegisteredMeterForced constructs and registers a new StandardMeter -// and launches a goroutine no matter the global switch is enabled or not. -// Be sure to unregister the meter from the registry once it is of no use to -// allow for garbage collection. -func NewRegisteredMeterForced(name string, r Registry) Meter { - c := NewMeterForced() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - // MeterSnapshot is a read-only copy of another Meter. type MeterSnapshot struct { // WARNING: The `temp` field is accessed atomically. diff --git a/metrics/meter_test.go b/metrics/meter_test.go index 4b3ef21188c..75322314c69 100644 --- a/metrics/meter_test.go +++ b/metrics/meter_test.go @@ -5,22 +5,6 @@ import ( "time" ) -func BenchmarkMeter(b *testing.B) { - m := NewMeter() - b.ResetTimer() - for i := 0; i < b.N; i++ { - m.Mark(1) - } -} - -func TestGetOrRegisterMeter(t *testing.T) { - r := NewRegistry() - NewRegisteredMeter("foo", r).Mark(47) - if m := GetOrRegisterMeter("foo", r); m.Count() != 47 { - t.Fatal(m.Count()) - } -} - func TestMeterDecay(t *testing.T) { ma := meterArbiter{ ticker: time.NewTicker(time.Millisecond), @@ -38,55 +22,3 @@ func TestMeterDecay(t *testing.T) { t.Error("m.RateMean() didn't decrease") } } - -func TestMeterNonzero(t *testing.T) { - m := NewMeter() - m.Mark(3) - if count := m.Count(); count != 3 { - t.Errorf("m.Count(): 3 != %v\n", count) - } -} - -func TestMeterStop(t *testing.T) { - l := len(arbiter.meters) - m := NewMeter() - if l+1 != len(arbiter.meters) { - t.Errorf("arbiter.meters: %d != %d\n", l+1, len(arbiter.meters)) - } - m.Stop() - if l != len(arbiter.meters) { - t.Errorf("arbiter.meters: %d != %d\n", l, len(arbiter.meters)) - } -} - -func TestMeterSnapshot(t *testing.T) { - m := NewMeter() - m.Mark(1) - if snapshot := m.Snapshot(); m.RateMean() != snapshot.RateMean() { - t.Fatal(snapshot) - } -} - -func TestMeterZero(t *testing.T) { - m := NewMeter() - if count := m.Count(); count != 0 { - t.Errorf("m.Count(): 0 != %v\n", count) - } -} - -func TestMeterRepeat(t *testing.T) { - t.Skip("./pull/1220 breaks this test") - m := NewMeter() - for i := 0; i < 101; i++ { - m.Mark(int64(i)) - } - if count := m.Count(); count != 5050 { - t.Errorf("m.Count(): 5050 != %v\n", count) - } - for i := 0; i < 101; i++ { - m.Mark(int64(i)) - } - if count := m.Count(); count != 10100 { - t.Errorf("m.Count(): 10100 != %v\n", count) - } -} diff --git a/metrics/metrics.go b/metrics/metrics.go index cf8fbc6e00a..20369fa3bf7 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -7,15 +7,9 @@ package metrics import ( "os" - "runtime" "runtime/metrics" "strings" "sync/atomic" - "time" - - "github.com/ledgerwatch/erigon/common/debug" - "github.com/shirou/gopsutil/v3/mem" - "github.com/shirou/gopsutil/v3/process" ) // Enabled is checked by the constructor functions for all of the @@ -33,15 +27,6 @@ func init() { metrics.All() callbacks.Store([]func(){}) } -func AddCallback(collect func()) { - list := callbacks.Load().([]func()) - list = append(list, collect) - callbacks.Store(list) -} - -func getCallbacks() []func() { - return callbacks.Load().([]func()) -} // Calling Load method @@ -75,146 +60,3 @@ func init() { } } } - -// CollectProcessMetrics periodically collects various metrics about the running -// process. -func CollectProcessMetrics(refresh time.Duration) { - // Short circuit if the metrics system is disabled - if !Enabled { - return - } - defer debug.LogPanic() - refreshFreq := int64(refresh / time.Second) - - // Create the various data collectors - cpuStats := make([]*CPUStats, 2) - memstats := make([]*runtime.MemStats, 2) - diskstats := make([]*DiskStats, 2) - for i := 0; i < len(cpuStats); i++ { - cpuStats[i] = new(CPUStats) - memstats[i] = new(runtime.MemStats) - diskstats[i] = new(DiskStats) - } - // Define the various metrics to collect - var ( - cpuSysLoad = GetOrRegisterGauge("system/cpu/sysload", DefaultRegistry) - cpuSysWait = GetOrRegisterGauge("system/cpu/syswait", DefaultRegistry) - - // disabled because of performance impact and because this info exists in logs - memPauses = GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) - memAllocs = GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) - memFrees = GetOrRegisterMeter("system/memory/frees", DefaultRegistry) - memHeld = GetOrRegisterGauge("system/memory/held", DefaultRegistry) - memUsed = GetOrRegisterGauge("system/memory/used", DefaultRegistry) - - diskReadBytes = GetOrRegisterMeter("system/disk/readbytes", DefaultRegistry) - diskWriteBytes = GetOrRegisterMeter("system/disk/writebytes", DefaultRegistry) - - // copy from prometheus client - goGoroutines = GetOrRegisterGauge("go/goroutines", DefaultRegistry) - goThreads = GetOrRegisterGauge("go/threads", DefaultRegistry) - cgoCalls = GetOrRegisterGauge("go/cgo", DefaultRegistry) - - ruMinflt = GetOrRegisterGauge("ru/minflt", DefaultRegistry) - ruMajflt = GetOrRegisterGauge("ru/majflt", DefaultRegistry) - ruInblock = GetOrRegisterGauge("ru/inblock", DefaultRegistry) - ruOutblock = GetOrRegisterGauge("ru/outblock", DefaultRegistry) - ruNvcsw = GetOrRegisterGauge("ru/nvcsw", DefaultRegistry) - ruNivcsw = GetOrRegisterGauge("ru/nivcsw", DefaultRegistry) - - memRSS = GetOrRegisterGauge("mem/rss", DefaultRegistry) - memVMS = GetOrRegisterGauge("mem/vms", DefaultRegistry) - memHVM = GetOrRegisterGauge("mem/hvm", DefaultRegistry) - memData = GetOrRegisterGauge("mem/data", DefaultRegistry) - memStack = GetOrRegisterGauge("mem/stack", DefaultRegistry) - memLocked = GetOrRegisterGauge("mem/locked", DefaultRegistry) - memSwap = GetOrRegisterGauge("mem/swap", DefaultRegistry) - - vmemTotal = GetOrRegisterGauge("vmem/total", DefaultRegistry) - vmemAvailable = GetOrRegisterGauge("vmem/available", DefaultRegistry) - vmemUsed = GetOrRegisterGauge("vmem/used", DefaultRegistry) - vmemBuffers = GetOrRegisterGauge("vmem/buffers", DefaultRegistry) - vmemCached = GetOrRegisterGauge("vmem/cached", DefaultRegistry) - vmemWriteBack = GetOrRegisterGauge("vmem/writeback", DefaultRegistry) - vmemDirty = GetOrRegisterGauge("vmem/dirty", DefaultRegistry) - vmemShared = GetOrRegisterGauge("vmem/shared", DefaultRegistry) - vmemMapped = GetOrRegisterGauge("vmem/mapped", DefaultRegistry) - vmemSwapped = GetOrRegisterGauge("vmem/swapped", DefaultRegistry) - vmemVmallocUsed = GetOrRegisterGauge("vmem/vmalloc/used", DefaultRegistry) - vmemVmallocChunk = GetOrRegisterGauge("vmem/vmalloc/chunk", DefaultRegistry) - ) - - p, _ := process.NewProcess(int32(os.Getpid())) - if p == nil { - return - } - - // Iterate loading the different stats and updating the meters - for i := 1; ; i++ { - time.Sleep(refresh) - location1 := i % 2 - location2 := (i - 1) % 2 - - ReadCPUStats(p, cpuStats[location1]) - cpuSysLoad.Update((cpuStats[location1].GlobalTime - cpuStats[location2].GlobalTime) / refreshFreq) - cpuSysWait.Update((cpuStats[location1].GlobalWait - cpuStats[location2].GlobalWait) / refreshFreq) - - inblock, outblokc, nvcsw, nivcsw := getRUsage(p) - ruInblock.Update(inblock) - ruOutblock.Update(outblokc) - ruNvcsw.Update(nvcsw) - ruNivcsw.Update(nivcsw) - - cgoCalls.Update(numCgoCall()) - - if m, _ := mem.VirtualMemory(); m != nil { - vmemTotal.Update(int64(m.Total)) - vmemAvailable.Update(int64(m.Available)) - vmemUsed.Update(int64(m.Used)) - vmemBuffers.Update(int64(m.Buffers)) - vmemCached.Update(int64(m.Cached)) - vmemWriteBack.Update(int64(m.WriteBack)) - vmemDirty.Update(int64(m.Dirty)) - vmemShared.Update(int64(m.Shared)) - vmemMapped.Update(int64(m.Mapped)) - vmemSwapped.Update(int64(m.SwapCached)) - vmemVmallocUsed.Update(int64(m.VmallocUsed)) - vmemVmallocChunk.Update(int64(m.VmallocChunk)) - } - if m, _ := p.MemoryInfo(); m != nil { - memRSS.Update(int64(m.RSS)) - memVMS.Update(int64(m.VMS)) - memHVM.Update(int64(m.HWM)) - memData.Update(int64(m.Data)) - memStack.Update(int64(m.Stack)) - memLocked.Update(int64(m.Locked)) - memSwap.Update(int64(m.Swap)) - } - - if pf, _ := p.PageFaults(); pf != nil { - ruMinflt.Update(int64(pf.MinorFaults)) - ruMajflt.Update(int64(pf.MajorFaults)) - } - - runtime.ReadMemStats(memstats[location1]) - memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) - memAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs)) - memFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees)) - memHeld.Update(int64(memstats[location1].HeapSys - memstats[location1].HeapReleased)) - memUsed.Update(int64(memstats[location1].Alloc)) - - if io, _ := p.IOCounters(); io != nil { - diskstats[location1].ReadBytes = int64(io.ReadBytes) - diskstats[location1].WriteBytes = int64(io.WriteBytes) - diskReadBytes.Mark(diskstats[location1].ReadBytes - diskstats[location2].ReadBytes) - diskWriteBytes.Mark(diskstats[location1].WriteBytes - diskstats[location2].WriteBytes) - } - goGoroutines.Update(int64(runtime.NumGoroutine())) - n, _ := runtime.ThreadCreateProfile(nil) - goThreads.Update(int64(n)) - - for _, cb := range getCallbacks() { - cb() - } - } -} diff --git a/metrics/metrics_test.go b/metrics/metrics_test.go deleted file mode 100644 index 1743f0c6d9f..00000000000 --- a/metrics/metrics_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package metrics - -import ( - "fmt" - "io/ioutil" - "log" - "time" -) - -// Stop the compiler from complaining during debugging. -var ( - _ = ioutil.Discard - _ = log.LstdFlags -) - -func Example() { - c := NewCounter() - Register("money", c) - c.Inc(17) - - // Threadsafe registration - t := GetOrRegisterTimer("db.get.latency", nil) - t.Time(func() { time.Sleep(10 * time.Millisecond) }) - t.Update(1) - - fmt.Println(c.Count()) - fmt.Println(t.Min()) - // Output: 17 - // 1 -} diff --git a/metrics/opentsdb.go b/metrics/opentsdb.go deleted file mode 100644 index 3fde55454ba..00000000000 --- a/metrics/opentsdb.go +++ /dev/null @@ -1,119 +0,0 @@ -package metrics - -import ( - "bufio" - "fmt" - "log" - "net" - "os" - "strings" - "time" -) - -var shortHostName = "" - -// OpenTSDBConfig provides a container with configuration parameters for -// the OpenTSDB exporter -type OpenTSDBConfig struct { - Addr *net.TCPAddr // Network address to connect to - Registry Registry // Registry to be exported - FlushInterval time.Duration // Flush interval - DurationUnit time.Duration // Time conversion unit for durations - Prefix string // Prefix to be prepended to metric names -} - -// OpenTSDB is a blocking exporter function which reports metrics in r -// to a TSDB server located at addr, flushing them every d duration -// and prepending metric names with prefix. -func OpenTSDB(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) { - OpenTSDBWithConfig(OpenTSDBConfig{ - Addr: addr, - Registry: r, - FlushInterval: d, - DurationUnit: time.Nanosecond, - Prefix: prefix, - }) -} - -// OpenTSDBWithConfig is a blocking exporter function just like OpenTSDB, -// but it takes a OpenTSDBConfig instead. -func OpenTSDBWithConfig(c OpenTSDBConfig) { - for range time.Tick(c.FlushInterval) { - if err := openTSDB(&c); nil != err { - log.Println(err) - } - } -} - -func getShortHostname() string { - if shortHostName == "" { - host, _ := os.Hostname() - if index := strings.Index(host, "."); index > 0 { - shortHostName = host[:index] - } else { - shortHostName = host - } - } - return shortHostName -} - -func openTSDB(c *OpenTSDBConfig) error { - shortHostname := getShortHostname() - now := time.Now().Unix() - du := float64(c.DurationUnit) - conn, err := net.DialTCP("tcp", nil, c.Addr) - if nil != err { - return err - } - defer conn.Close() - w := bufio.NewWriter(conn) - c.Registry.Each(func(name string, i interface{}) { - switch metric := i.(type) { - case Counter: - fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, metric.Count(), shortHostname) - case Gauge: - fmt.Fprintf(w, "put %s.%s.value %d %d host=%s\n", c.Prefix, name, now, metric.Value(), shortHostname) - case GaugeFloat64: - fmt.Fprintf(w, "put %s.%s.value %d %f host=%s\n", c.Prefix, name, now, metric.Value(), shortHostname) - case Histogram: - h := metric.Snapshot() - ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, h.Count(), shortHostname) - fmt.Fprintf(w, "put %s.%s.min %d %d host=%s\n", c.Prefix, name, now, h.Min(), shortHostname) - fmt.Fprintf(w, "put %s.%s.max %d %d host=%s\n", c.Prefix, name, now, h.Max(), shortHostname) - fmt.Fprintf(w, "put %s.%s.mean %d %.2f host=%s\n", c.Prefix, name, now, h.Mean(), shortHostname) - fmt.Fprintf(w, "put %s.%s.std-dev %d %.2f host=%s\n", c.Prefix, name, now, h.StdDev(), shortHostname) - fmt.Fprintf(w, "put %s.%s.50-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[0], shortHostname) - fmt.Fprintf(w, "put %s.%s.75-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[1], shortHostname) - fmt.Fprintf(w, "put %s.%s.95-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[2], shortHostname) - fmt.Fprintf(w, "put %s.%s.99-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[3], shortHostname) - fmt.Fprintf(w, "put %s.%s.999-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[4], shortHostname) - case Meter: - m := metric.Snapshot() - fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, m.Count(), shortHostname) - fmt.Fprintf(w, "put %s.%s.one-minute %d %.2f host=%s\n", c.Prefix, name, now, m.Rate1(), shortHostname) - fmt.Fprintf(w, "put %s.%s.five-minute %d %.2f host=%s\n", c.Prefix, name, now, m.Rate5(), shortHostname) - fmt.Fprintf(w, "put %s.%s.fifteen-minute %d %.2f host=%s\n", c.Prefix, name, now, m.Rate15(), shortHostname) - fmt.Fprintf(w, "put %s.%s.mean %d %.2f host=%s\n", c.Prefix, name, now, m.RateMean(), shortHostname) - case Timer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, t.Count(), shortHostname) - fmt.Fprintf(w, "put %s.%s.min %d %d host=%s\n", c.Prefix, name, now, t.Min()/int64(du), shortHostname) - fmt.Fprintf(w, "put %s.%s.max %d %d host=%s\n", c.Prefix, name, now, t.Max()/int64(du), shortHostname) - fmt.Fprintf(w, "put %s.%s.mean %d %.2f host=%s\n", c.Prefix, name, now, t.Mean()/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.std-dev %d %.2f host=%s\n", c.Prefix, name, now, t.StdDev()/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.50-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[0]/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.75-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[1]/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.95-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[2]/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.99-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[3]/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.999-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[4]/du, shortHostname) - fmt.Fprintf(w, "put %s.%s.one-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate1(), shortHostname) - fmt.Fprintf(w, "put %s.%s.five-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate5(), shortHostname) - fmt.Fprintf(w, "put %s.%s.fifteen-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate15(), shortHostname) - fmt.Fprintf(w, "put %s.%s.mean-rate %d %.2f host=%s\n", c.Prefix, name, now, t.RateMean(), shortHostname) - } - w.Flush() - }) - return nil -} diff --git a/metrics/opentsdb_test.go b/metrics/opentsdb_test.go deleted file mode 100644 index c43728960ed..00000000000 --- a/metrics/opentsdb_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package metrics - -import ( - "net" - "time" -) - -func ExampleOpenTSDB() { - addr, _ := net.ResolveTCPAddr("net", ":2003") - go OpenTSDB(DefaultRegistry, 1*time.Second, "some.prefix", addr) -} - -func ExampleOpenTSDBWithConfig() { - addr, _ := net.ResolveTCPAddr("net", ":2003") - go OpenTSDBWithConfig(OpenTSDBConfig{ - Addr: addr, - Registry: DefaultRegistry, - FlushInterval: 1 * time.Second, - DurationUnit: time.Millisecond, - }) -} diff --git a/metrics/prometheus/collector.go b/metrics/prometheus/collector.go deleted file mode 100644 index cbe33033a1f..00000000000 --- a/metrics/prometheus/collector.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package prometheus - -import ( - "bytes" - "fmt" - "strconv" - "strings" - - "github.com/ledgerwatch/erigon/metrics" -) - -var ( - typeGaugeTpl = "# TYPE %s gauge\n" - typeCounterTpl = "# TYPE %s counter\n" - typeSummaryTpl = "# TYPE %s summary\n" - keyValueTpl = "%s %v\n\n" - keyQuantileTagValueTpl = "%s {quantile=\"%s\"} %v\n" -) - -// collector is a collection of byte buffers that aggregate Prometheus reports -// for different metric types. -type collector struct { - buff *bytes.Buffer -} - -// newCollector creates a new Prometheus metric aggregator. -func newCollector() *collector { - return &collector{ - buff: &bytes.Buffer{}, - } -} - -func (c *collector) addCounter(name string, m metrics.Counter) { - c.writeGaugeCounter(name, m.Count()) -} - -func (c *collector) addGauge(name string, m metrics.Gauge) { - c.writeGaugeCounter(name, m.Value()) -} - -func (c *collector) addGaugeFloat64(name string, m metrics.GaugeFloat64) { - c.writeGaugeCounter(name, m.Value()) -} - -func (c *collector) addHistogram(name string, m metrics.Histogram) { - pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} - ps := m.Percentiles(pv) - c.writeSummaryCounter(name, m.Count()) - c.buff.WriteString(fmt.Sprintf(typeSummaryTpl, mutateKey(name))) - for i := range pv { - c.writeSummaryPercentile(name, strconv.FormatFloat(pv[i], 'f', -1, 64), ps[i]) - } - c.buff.WriteRune('\n') -} - -func (c *collector) addMeter(name string, m metrics.Meter) { - c.writeGaugeCounter(name, m.Count()) -} - -func (c *collector) addTimer(name string, m metrics.Timer) { - pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} - ps := m.Percentiles(pv) - c.writeSummaryCounter(name, m.Count()) - c.buff.WriteString(fmt.Sprintf(typeSummaryTpl, mutateKey(name))) - for i := range pv { - c.writeSummaryPercentile(name, strconv.FormatFloat(pv[i], 'f', -1, 64), ps[i]) - } - c.buff.WriteRune('\n') -} - -func (c *collector) addResettingTimer(name string, m metrics.ResettingTimer) { - if len(m.Values()) == 0 { - return - } - ps := m.Percentiles([]float64{50, 95, 99}) - val := m.Values() - c.writeSummaryCounter(name, len(val)) - c.buff.WriteString(fmt.Sprintf(typeSummaryTpl, mutateKey(name))) - c.writeSummaryPercentile(name, "0.50", ps[0]) - c.writeSummaryPercentile(name, "0.95", ps[1]) - c.writeSummaryPercentile(name, "0.99", ps[2]) - c.buff.WriteRune('\n') -} - -func (c *collector) writeGaugeCounter(name string, value interface{}) { - name = mutateKey(name) - c.buff.WriteString(fmt.Sprintf(typeGaugeTpl, name)) - c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) -} - -func (c *collector) writeSummaryCounter(name string, value interface{}) { - name = mutateKey(name + "_count") - c.buff.WriteString(fmt.Sprintf(typeCounterTpl, name)) - c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) -} - -func (c *collector) writeSummaryPercentile(name, p string, value interface{}) { - name = mutateKey(name) - c.buff.WriteString(fmt.Sprintf(keyQuantileTagValueTpl, name, p, value)) -} - -func mutateKey(key string) string { - return strings.ReplaceAll(key, "/", "_") -} diff --git a/metrics/prometheus/collector_test.go b/metrics/prometheus/collector_test.go deleted file mode 100644 index bfb0752871e..00000000000 --- a/metrics/prometheus/collector_test.go +++ /dev/null @@ -1,110 +0,0 @@ -package prometheus - -import ( - "os" - "testing" - "time" - - "github.com/ledgerwatch/erigon/metrics" -) - -func TestMain(m *testing.M) { - metrics.Enabled = true - os.Exit(m.Run()) -} - -func TestCollector(t *testing.T) { - c := newCollector() - - counter := metrics.NewCounter() - counter.Inc(12345) - c.addCounter("test/counter", counter) - - gauge := metrics.NewGauge() - gauge.Update(23456) - c.addGauge("test/gauge", gauge) - - gaugeFloat64 := metrics.NewGaugeFloat64() - gaugeFloat64.Update(34567.89) - c.addGaugeFloat64("test/gauge_float64", gaugeFloat64) - - histogram := metrics.NewHistogram(&metrics.NilSample{}) - c.addHistogram("test/histogram", histogram) - - meter := metrics.NewMeter() - defer meter.Stop() - meter.Mark(9999999) - c.addMeter("test/meter", meter) - - timer := metrics.NewTimer() - defer timer.Stop() - timer.Update(20 * time.Millisecond) - timer.Update(21 * time.Millisecond) - timer.Update(22 * time.Millisecond) - timer.Update(120 * time.Millisecond) - timer.Update(23 * time.Millisecond) - timer.Update(24 * time.Millisecond) - c.addTimer("test/timer", timer) - - resettingTimer := metrics.NewResettingTimer() - resettingTimer.Update(10 * time.Millisecond) - resettingTimer.Update(11 * time.Millisecond) - resettingTimer.Update(12 * time.Millisecond) - resettingTimer.Update(120 * time.Millisecond) - resettingTimer.Update(13 * time.Millisecond) - resettingTimer.Update(14 * time.Millisecond) - c.addResettingTimer("test/resetting_timer", resettingTimer.Snapshot()) - - emptyResettingTimer := metrics.NewResettingTimer().Snapshot() - c.addResettingTimer("test/empty_resetting_timer", emptyResettingTimer) - - const expectedOutput = `# TYPE test_counter gauge -test_counter 12345 - -# TYPE test_gauge gauge -test_gauge 23456 - -# TYPE test_gauge_float64 gauge -test_gauge_float64 34567.89 - -# TYPE test_histogram_count counter -test_histogram_count 0 - -# TYPE test_histogram summary -test_histogram {quantile="0.5"} 0 -test_histogram {quantile="0.75"} 0 -test_histogram {quantile="0.95"} 0 -test_histogram {quantile="0.99"} 0 -test_histogram {quantile="0.999"} 0 -test_histogram {quantile="0.9999"} 0 - -# TYPE test_meter gauge -test_meter 9999999 - -# TYPE test_timer_count counter -test_timer_count 6 - -# TYPE test_timer summary -test_timer {quantile="0.5"} 2.25e+07 -test_timer {quantile="0.75"} 4.8e+07 -test_timer {quantile="0.95"} 1.2e+08 -test_timer {quantile="0.99"} 1.2e+08 -test_timer {quantile="0.999"} 1.2e+08 -test_timer {quantile="0.9999"} 1.2e+08 - -# TYPE test_resetting_timer_count counter -test_resetting_timer_count 6 - -# TYPE test_resetting_timer summary -test_resetting_timer {quantile="0.50"} 12000000 -test_resetting_timer {quantile="0.95"} 120000000 -test_resetting_timer {quantile="0.99"} 120000000 - -` - exp := c.buff.String() - if exp != expectedOutput { - t.Log("Expected Output:\n", expectedOutput) - t.Log("Actual Output:\n", exp) - t.Fatal("unexpected collector output") - } -} diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go deleted file mode 100644 index 6717d6f015f..00000000000 --- a/metrics/prometheus/prometheus.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2019 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package prometheus exposes go-metrics into a Prometheus format. -package prometheus - -import ( - "fmt" - "net/http" - "sort" - - "github.com/ledgerwatch/erigon/metrics" - "github.com/ledgerwatch/log/v3" -) - -// Handler returns an HTTP handler which dump metrics in Prometheus format. -func Handler(reg metrics.Registry) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - // Gather and pre-sort the metrics to avoid random listings - var names []string - reg.Each(func(name string, i interface{}) { - names = append(names, name) - }) - sort.Strings(names) - - // Aggregate all the metris into a Prometheus collector - c := newCollector() - - for _, name := range names { - i := reg.Get(name) - - switch m := i.(type) { - case metrics.Counter: - c.addCounter(name, m.Snapshot()) - case metrics.Gauge: - c.addGauge(name, m.Snapshot()) - case metrics.GaugeFloat64: - c.addGaugeFloat64(name, m.Snapshot()) - case metrics.Histogram: - c.addHistogram(name, m.Snapshot()) - case metrics.Meter: - c.addMeter(name, m.Snapshot()) - case metrics.Timer: - c.addTimer(name, m.Snapshot()) - case metrics.ResettingTimer: - c.addResettingTimer(name, m.Snapshot()) - default: - log.Warn("Unknown Prometheus metric type", "type", fmt.Sprintf("%T", i)) - } - } - w.Header().Add("Content-Type", "text/plain") - w.Header().Add("Content-Length", fmt.Sprint(c.buff.Len())) - w.Write(c.buff.Bytes()) - }) -} diff --git a/metrics/registry.go b/metrics/registry.go index c5435adf240..c5887e7bf54 100644 --- a/metrics/registry.go +++ b/metrics/registry.go @@ -3,7 +3,6 @@ package metrics import ( "fmt" "reflect" - "strings" "sync" ) @@ -225,134 +224,13 @@ type Stoppable interface { Stop() } -type PrefixedRegistry struct { - underlying Registry - prefix string -} - -func NewPrefixedRegistry(prefix string) Registry { - return &PrefixedRegistry{ - underlying: NewRegistry(), - prefix: prefix, - } -} - -func NewPrefixedChildRegistry(parent Registry, prefix string) Registry { - return &PrefixedRegistry{ - underlying: parent, - prefix: prefix, - } -} - -// Call the given function for each registered metric. -func (r *PrefixedRegistry) Each(fn func(string, interface{})) { - wrappedFn := func(prefix string) func(string, interface{}) { - return func(name string, iface interface{}) { - if strings.HasPrefix(name, prefix) { - fn(name, iface) - } else { - return - } - } - } - - baseRegistry, prefix := findPrefix(r, "") - baseRegistry.Each(wrappedFn(prefix)) -} - -func findPrefix(registry Registry, prefix string) (Registry, string) { - switch r := registry.(type) { - case *PrefixedRegistry: - return findPrefix(r.underlying, r.prefix+prefix) - case *StandardRegistry: - return r, prefix - } - return nil, "" -} - -// Get the metric by the given name or nil if none is registered. -func (r *PrefixedRegistry) Get(name string) interface{} { - realName := r.prefix + name - return r.underlying.Get(realName) -} - -// Gets an existing metric or registers the given one. -// The interface can be the metric to register if not found in registry, -// or a function returning the metric for lazy instantiation. -func (r *PrefixedRegistry) GetOrRegister(name string, metric interface{}) interface{} { - realName := r.prefix + name - return r.underlying.GetOrRegister(realName, metric) -} - -// Register the given metric under the given name. The name will be prefixed. -func (r *PrefixedRegistry) Register(name string, metric interface{}) error { - realName := r.prefix + name - return r.underlying.Register(realName, metric) -} - -// Run all registered healthchecks. -func (r *PrefixedRegistry) RunHealthchecks() { - r.underlying.RunHealthchecks() -} - -// GetAll metrics in the Registry -func (r *PrefixedRegistry) GetAll() map[string]map[string]interface{} { - return r.underlying.GetAll() -} - -// Unregister the metric with the given name. The name will be prefixed. -func (r *PrefixedRegistry) Unregister(name string) { - realName := r.prefix + name - r.underlying.Unregister(realName) -} - -// Unregister all metrics. (Mostly for testing.) -func (r *PrefixedRegistry) UnregisterAll() { - r.underlying.UnregisterAll() -} - var ( DefaultRegistry = NewRegistry() EphemeralRegistry = NewRegistry() AccountingRegistry = NewRegistry() // registry used in swarm ) -// Call the given function for each registered metric. -func Each(f func(string, interface{})) { - DefaultRegistry.Each(f) -} - // Get the metric by the given name or nil if none is registered. func Get(name string) interface{} { return DefaultRegistry.Get(name) } - -// Gets an existing metric or creates and registers a new one. Threadsafe -// alternative to calling Get and Register on failure. -func GetOrRegister(name string, i interface{}) interface{} { - return DefaultRegistry.GetOrRegister(name, i) -} - -// Register the given metric under the given name. Returns a DuplicateMetric -// if a metric by the given name is already registered. -func Register(name string, i interface{}) error { - return DefaultRegistry.Register(name, i) -} - -// Register the given metric under the given name. Panics if a metric by the -// given name is already registered. -func MustRegister(name string, i interface{}) { - if err := Register(name, i); err != nil { - panic(err) - } -} - -// Run all registered healthchecks. -func RunHealthchecks() { - DefaultRegistry.RunHealthchecks() -} - -// Unregister the metric with the given name. -func Unregister(name string) { - DefaultRegistry.Unregister(name) -} diff --git a/metrics/registry_test.go b/metrics/registry_test.go deleted file mode 100644 index 6cfedfd88f0..00000000000 --- a/metrics/registry_test.go +++ /dev/null @@ -1,311 +0,0 @@ -package metrics - -import ( - "testing" -) - -func BenchmarkRegistry(b *testing.B) { - r := NewRegistry() - r.Register("foo", NewCounter()) - b.ResetTimer() - for i := 0; i < b.N; i++ { - r.Each(func(string, interface{}) {}) - } -} - -func TestRegistry(t *testing.T) { - r := NewRegistry() - r.Register("foo", NewCounter()) - i := 0 - r.Each(func(name string, iface interface{}) { - i++ - if name != "foo" { - t.Fatal(name) - } - if _, ok := iface.(Counter); !ok { - t.Fatal(iface) - } - }) - if i != 1 { - t.Fatal(i) - } - r.Unregister("foo") - i = 0 - r.Each(func(string, interface{}) { i++ }) - if i != 0 { - t.Fatal(i) - } -} - -func TestRegistryDuplicate(t *testing.T) { - r := NewRegistry() - if err := r.Register("foo", NewCounter()); nil != err { - t.Fatal(err) - } - if err := r.Register("foo", NewGauge()); nil == err { - t.Fatal(err) - } - i := 0 - r.Each(func(name string, iface interface{}) { - i++ - if _, ok := iface.(Counter); !ok { - t.Fatal(iface) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestRegistryGet(t *testing.T) { - r := NewRegistry() - r.Register("foo", NewCounter()) - if count := r.Get("foo").(Counter).Count(); count != 0 { - t.Fatal(count) - } - r.Get("foo").(Counter).Inc(1) - if count := r.Get("foo").(Counter).Count(); count != 1 { - t.Fatal(count) - } -} - -func TestRegistryGetOrRegister(t *testing.T) { - r := NewRegistry() - - // First metric wins with GetOrRegister - _ = r.GetOrRegister("foo", NewCounter()) - m := r.GetOrRegister("foo", NewGauge()) - if _, ok := m.(Counter); !ok { - t.Fatal(m) - } - - i := 0 - r.Each(func(name string, iface interface{}) { - i++ - if name != "foo" { - t.Fatal(name) - } - if _, ok := iface.(Counter); !ok { - t.Fatal(iface) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestRegistryGetOrRegisterWithLazyInstantiation(t *testing.T) { - r := NewRegistry() - - // First metric wins with GetOrRegister - _ = r.GetOrRegister("foo", NewCounter) - m := r.GetOrRegister("foo", NewGauge) - if _, ok := m.(Counter); !ok { - t.Fatal(m) - } - - i := 0 - r.Each(func(name string, iface interface{}) { - i++ - if name != "foo" { - t.Fatal(name) - } - if _, ok := iface.(Counter); !ok { - t.Fatal(iface) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestRegistryUnregister(t *testing.T) { - l := len(arbiter.meters) - r := NewRegistry() - r.Register("foo", NewCounter()) - r.Register("bar", NewMeter()) - r.Register("baz", NewTimer()) - if len(arbiter.meters) != l+2 { - t.Errorf("arbiter.meters: %d != %d\n", l+2, len(arbiter.meters)) - } - r.Unregister("foo") - r.Unregister("bar") - r.Unregister("baz") - if len(arbiter.meters) != l { - t.Errorf("arbiter.meters: %d != %d\n", l+2, len(arbiter.meters)) - } -} - -func TestPrefixedChildRegistryGetOrRegister(t *testing.T) { - r := NewRegistry() - pr := NewPrefixedChildRegistry(r, "prefix.") - - _ = pr.GetOrRegister("foo", NewCounter()) - - i := 0 - r.Each(func(name string, m interface{}) { - i++ - if name != "prefix.foo" { - t.Fatal(name) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestPrefixedRegistryGetOrRegister(t *testing.T) { - r := NewPrefixedRegistry("prefix.") - - _ = r.GetOrRegister("foo", NewCounter()) - - i := 0 - r.Each(func(name string, m interface{}) { - i++ - if name != "prefix.foo" { - t.Fatal(name) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestPrefixedRegistryRegister(t *testing.T) { - r := NewPrefixedRegistry("prefix.") - err := r.Register("foo", NewCounter()) - c := NewCounter() - Register("bar", c) - if err != nil { - t.Fatal(err.Error()) - } - - i := 0 - r.Each(func(name string, m interface{}) { - i++ - if name != "prefix.foo" { - t.Fatal(name) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestPrefixedRegistryUnregister(t *testing.T) { - r := NewPrefixedRegistry("prefix.") - - _ = r.Register("foo", NewCounter()) - - i := 0 - r.Each(func(name string, m interface{}) { - i++ - if name != "prefix.foo" { - t.Fatal(name) - } - }) - if i != 1 { - t.Fatal(i) - } - - r.Unregister("foo") - - i = 0 - r.Each(func(name string, m interface{}) { - i++ - }) - - if i != 0 { - t.Fatal(i) - } -} - -func TestPrefixedRegistryGet(t *testing.T) { - pr := NewPrefixedRegistry("prefix.") - name := "foo" - pr.Register(name, NewCounter()) - - fooCounter := pr.Get(name) - if fooCounter == nil { - t.Fatal(name) - } -} - -func TestPrefixedChildRegistryGet(t *testing.T) { - r := NewRegistry() - pr := NewPrefixedChildRegistry(r, "prefix.") - name := "foo" - pr.Register(name, NewCounter()) - fooCounter := pr.Get(name) - if fooCounter == nil { - t.Fatal(name) - } -} - -func TestChildPrefixedRegistryRegister(t *testing.T) { - r := NewPrefixedChildRegistry(DefaultRegistry, "prefix.") - err := r.Register("foo", NewCounter()) - c := NewCounter() - Register("bar", c) - if err != nil { - t.Fatal(err.Error()) - } - - i := 0 - r.Each(func(name string, m interface{}) { - i++ - if name != "prefix.foo" { - t.Fatal(name) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestChildPrefixedRegistryOfChildRegister(t *testing.T) { - r := NewPrefixedChildRegistry(NewRegistry(), "prefix.") - r2 := NewPrefixedChildRegistry(r, "prefix2.") - err := r.Register("foo2", NewCounter()) - if err != nil { - t.Fatal(err.Error()) - } - err = r2.Register("baz", NewCounter()) - if err != nil { - t.Fatal(err.Error()) - } - c := NewCounter() - Register("bars", c) - - i := 0 - r2.Each(func(name string, m interface{}) { - i++ - if name != "prefix.prefix2.baz" { - t.Fatal(name) - } - }) - if i != 1 { - t.Fatal(i) - } -} - -func TestWalkRegistries(t *testing.T) { - r := NewPrefixedChildRegistry(NewRegistry(), "prefix.") - r2 := NewPrefixedChildRegistry(r, "prefix2.") - err := r.Register("foo2", NewCounter()) - if err != nil { - t.Fatal(err.Error()) - } - err = r2.Register("baz", NewCounter()) - if err != nil { - t.Fatal(err.Error()) - } - c := NewCounter() - Register("bars", c) - - _, prefix := findPrefix(r2, "") - if prefix != "prefix.prefix2." { - t.Fatal(prefix) - } - -} diff --git a/metrics/resetting_timer.go b/metrics/resetting_timer.go index e5327d3bd33..d5e5f49c97b 100644 --- a/metrics/resetting_timer.go +++ b/metrics/resetting_timer.go @@ -1,15 +1,9 @@ package metrics import ( - "math" - "sort" - "sync" "time" ) -// Initial slice capacity for the values stored in a ResettingTimer -const InitialResettingTimerSliceCap = 10 - // ResettingTimer is used for storing aggregated values for timers, which are reset on every flush interval. type ResettingTimer interface { Values() []int64 @@ -20,222 +14,3 @@ type ResettingTimer interface { Update(time.Duration) UpdateSince(time.Time) } - -// GetOrRegisterResettingTimer returns an existing ResettingTimer or constructs and registers a -// new StandardResettingTimer. -func GetOrRegisterResettingTimer(name string, r Registry) ResettingTimer { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewResettingTimer).(ResettingTimer) -} - -// NewRegisteredResettingTimer constructs and registers a new StandardResettingTimer. -func NewRegisteredResettingTimer(name string, r Registry) ResettingTimer { - c := NewResettingTimer() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewResettingTimer constructs a new StandardResettingTimer -func NewResettingTimer() ResettingTimer { - if !Enabled { - return NilResettingTimer{} - } - return &StandardResettingTimer{ - values: make([]int64, 0, InitialResettingTimerSliceCap), - } -} - -// NilResettingTimer is a no-op ResettingTimer. -type NilResettingTimer struct { -} - -// Values is a no-op. -func (NilResettingTimer) Values() []int64 { return nil } - -// Snapshot is a no-op. -func (NilResettingTimer) Snapshot() ResettingTimer { - return &ResettingTimerSnapshot{ - values: []int64{}, - } -} - -// Time is a no-op. -func (NilResettingTimer) Time(func()) {} - -// Update is a no-op. -func (NilResettingTimer) Update(time.Duration) {} - -// Percentiles panics. -func (NilResettingTimer) Percentiles([]float64) []int64 { - panic("Percentiles called on a NilResettingTimer") -} - -// Mean panics. -func (NilResettingTimer) Mean() float64 { - panic("Mean called on a NilResettingTimer") -} - -// UpdateSince is a no-op. -func (NilResettingTimer) UpdateSince(time.Time) {} - -// StandardResettingTimer is the standard implementation of a ResettingTimer. -// and Meter. -type StandardResettingTimer struct { - values []int64 - mutex sync.Mutex -} - -// Values returns a slice with all measurements. -func (t *StandardResettingTimer) Values() []int64 { - return t.values -} - -// Snapshot resets the timer and returns a read-only copy of its contents. -func (t *StandardResettingTimer) Snapshot() ResettingTimer { - t.mutex.Lock() - defer t.mutex.Unlock() - currentValues := t.values - t.values = make([]int64, 0, InitialResettingTimerSliceCap) - - return &ResettingTimerSnapshot{ - values: currentValues, - } -} - -// Percentiles panics. -func (t *StandardResettingTimer) Percentiles([]float64) []int64 { - panic("Percentiles called on a StandardResettingTimer") -} - -// Mean panics. -func (t *StandardResettingTimer) Mean() float64 { - panic("Mean called on a StandardResettingTimer") -} - -// Record the duration of the execution of the given function. -func (t *StandardResettingTimer) Time(f func()) { - ts := time.Now() - f() - t.Update(time.Since(ts)) -} - -// Record the duration of an event. -func (t *StandardResettingTimer) Update(d time.Duration) { - t.mutex.Lock() - defer t.mutex.Unlock() - t.values = append(t.values, int64(d)) -} - -// Record the duration of an event that started at a time and ends now. -func (t *StandardResettingTimer) UpdateSince(ts time.Time) { - t.mutex.Lock() - defer t.mutex.Unlock() - t.values = append(t.values, int64(time.Since(ts))) -} - -// ResettingTimerSnapshot is a point-in-time copy of another ResettingTimer. -type ResettingTimerSnapshot struct { - values []int64 - mean float64 - thresholdBoundaries []int64 - calculated bool -} - -// Snapshot returns the snapshot. -func (t *ResettingTimerSnapshot) Snapshot() ResettingTimer { return t } - -// Time panics. -func (*ResettingTimerSnapshot) Time(func()) { - panic("Time called on a ResettingTimerSnapshot") -} - -// Update panics. -func (*ResettingTimerSnapshot) Update(time.Duration) { - panic("Update called on a ResettingTimerSnapshot") -} - -// UpdateSince panics. -func (*ResettingTimerSnapshot) UpdateSince(time.Time) { - panic("UpdateSince called on a ResettingTimerSnapshot") -} - -// Values returns all values from snapshot. -func (t *ResettingTimerSnapshot) Values() []int64 { - return t.values -} - -// Percentiles returns the boundaries for the input percentiles. -func (t *ResettingTimerSnapshot) Percentiles(percentiles []float64) []int64 { - t.calc(percentiles) - - return t.thresholdBoundaries -} - -// Mean returns the mean of the snapshotted values -func (t *ResettingTimerSnapshot) Mean() float64 { - if !t.calculated { - t.calc([]float64{}) - } - - return t.mean -} - -func (t *ResettingTimerSnapshot) calc(percentiles []float64) { - sort.Sort(Int64Slice(t.values)) - - count := len(t.values) - if count > 0 { - min := t.values[0] - max := t.values[count-1] - - cumulativeValues := make([]int64, count) - cumulativeValues[0] = min - for i := 1; i < count; i++ { - cumulativeValues[i] = t.values[i] + cumulativeValues[i-1] - } - - t.thresholdBoundaries = make([]int64, len(percentiles)) - - thresholdBoundary := max - - for i, pct := range percentiles { - if count > 1 { - var abs float64 - if pct >= 0 { - abs = pct - } else { - abs = 100 + pct - } - // poor man's math.Round(x): - // math.Floor(x + 0.5) - indexOfPerc := int(math.Floor(((abs / 100.0) * float64(count)) + 0.5)) - if pct >= 0 && indexOfPerc > 0 { - indexOfPerc -= 1 // index offset=0 - } - thresholdBoundary = t.values[indexOfPerc] - } - - t.thresholdBoundaries[i] = thresholdBoundary - } - - sum := cumulativeValues[count-1] - t.mean = float64(sum) / float64(count) - } else { - t.thresholdBoundaries = make([]int64, len(percentiles)) - t.mean = 0 - } - - t.calculated = true -} - -// Int64Slice attaches the methods of sort.Interface to []int64, sorting in increasing order. -type Int64Slice []int64 - -func (s Int64Slice) Len() int { return len(s) } -func (s Int64Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s Int64Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } diff --git a/metrics/resetting_timer_test.go b/metrics/resetting_timer_test.go deleted file mode 100644 index 77c49dc3866..00000000000 --- a/metrics/resetting_timer_test.go +++ /dev/null @@ -1,216 +0,0 @@ -package metrics - -import ( - "testing" - "time" -) - -func TestResettingTimer(t *testing.T) { - tests := []struct { - values []int64 - start int - end int - wantP50 int64 - wantP95 int64 - wantP99 int64 - wantMean float64 - wantMin int64 - wantMax int64 - }{ - { - values: []int64{}, - start: 1, - end: 11, - wantP50: 5, wantP95: 10, wantP99: 10, - wantMin: 1, wantMax: 10, wantMean: 5.5, - }, - { - values: []int64{}, - start: 1, - end: 101, - wantP50: 50, wantP95: 95, wantP99: 99, - wantMin: 1, wantMax: 100, wantMean: 50.5, - }, - { - values: []int64{1}, - start: 0, - end: 0, - wantP50: 1, wantP95: 1, wantP99: 1, - wantMin: 1, wantMax: 1, wantMean: 1, - }, - { - values: []int64{0}, - start: 0, - end: 0, - wantP50: 0, wantP95: 0, wantP99: 0, - wantMin: 0, wantMax: 0, wantMean: 0, - }, - { - values: []int64{}, - start: 0, - end: 0, - wantP50: 0, wantP95: 0, wantP99: 0, - wantMin: 0, wantMax: 0, wantMean: 0, - }, - { - values: []int64{1, 10}, - start: 0, - end: 0, - wantP50: 1, wantP95: 10, wantP99: 10, - wantMin: 1, wantMax: 10, wantMean: 5.5, - }, - } - for ind, tt := range tests { - timer := NewResettingTimer() - - for i := tt.start; i < tt.end; i++ { - tt.values = append(tt.values, int64(i)) - } - - for _, v := range tt.values { - timer.Update(time.Duration(v)) - } - - snap := timer.Snapshot() - - ps := snap.Percentiles([]float64{50, 95, 99}) - - val := snap.Values() - - if len(val) > 0 { - if tt.wantMin != val[0] { - t.Fatalf("%d: min: got %d, want %d", ind, val[0], tt.wantMin) - } - - if tt.wantMax != val[len(val)-1] { - t.Fatalf("%d: max: got %d, want %d", ind, val[len(val)-1], tt.wantMax) - } - } - - if tt.wantMean != snap.Mean() { - t.Fatalf("%d: mean: got %.2f, want %.2f", ind, snap.Mean(), tt.wantMean) - } - - if tt.wantP50 != ps[0] { - t.Fatalf("%d: p50: got %d, want %d", ind, ps[0], tt.wantP50) - } - - if tt.wantP95 != ps[1] { - t.Fatalf("%d: p95: got %d, want %d", ind, ps[1], tt.wantP95) - } - - if tt.wantP99 != ps[2] { - t.Fatalf("%d: p99: got %d, want %d", ind, ps[2], tt.wantP99) - } - } -} - -func TestResettingTimerWithFivePercentiles(t *testing.T) { - tests := []struct { - values []int64 - start int - end int - wantP05 int64 - wantP20 int64 - wantP50 int64 - wantP95 int64 - wantP99 int64 - wantMean float64 - wantMin int64 - wantMax int64 - }{ - { - values: []int64{}, - start: 1, - end: 11, - wantP05: 1, wantP20: 2, wantP50: 5, wantP95: 10, wantP99: 10, - wantMin: 1, wantMax: 10, wantMean: 5.5, - }, - { - values: []int64{}, - start: 1, - end: 101, - wantP05: 5, wantP20: 20, wantP50: 50, wantP95: 95, wantP99: 99, - wantMin: 1, wantMax: 100, wantMean: 50.5, - }, - { - values: []int64{1}, - start: 0, - end: 0, - wantP05: 1, wantP20: 1, wantP50: 1, wantP95: 1, wantP99: 1, - wantMin: 1, wantMax: 1, wantMean: 1, - }, - { - values: []int64{0}, - start: 0, - end: 0, - wantP05: 0, wantP20: 0, wantP50: 0, wantP95: 0, wantP99: 0, - wantMin: 0, wantMax: 0, wantMean: 0, - }, - { - values: []int64{}, - start: 0, - end: 0, - wantP05: 0, wantP20: 0, wantP50: 0, wantP95: 0, wantP99: 0, - wantMin: 0, wantMax: 0, wantMean: 0, - }, - { - values: []int64{1, 10}, - start: 0, - end: 0, - wantP05: 1, wantP20: 1, wantP50: 1, wantP95: 10, wantP99: 10, - wantMin: 1, wantMax: 10, wantMean: 5.5, - }, - } - for ind, tt := range tests { - timer := NewResettingTimer() - - for i := tt.start; i < tt.end; i++ { - tt.values = append(tt.values, int64(i)) - } - - for _, v := range tt.values { - timer.Update(time.Duration(v)) - } - - snap := timer.Snapshot() - - ps := snap.Percentiles([]float64{5, 20, 50, 95, 99}) - - val := snap.Values() - - if len(val) > 0 { - if tt.wantMin != val[0] { - t.Fatalf("%d: min: got %d, want %d", ind, val[0], tt.wantMin) - } - - if tt.wantMax != val[len(val)-1] { - t.Fatalf("%d: max: got %d, want %d", ind, val[len(val)-1], tt.wantMax) - } - } - - if tt.wantMean != snap.Mean() { - t.Fatalf("%d: mean: got %.2f, want %.2f", ind, snap.Mean(), tt.wantMean) - } - - if tt.wantP05 != ps[0] { - t.Fatalf("%d: p05: got %d, want %d", ind, ps[0], tt.wantP05) - } - - if tt.wantP20 != ps[1] { - t.Fatalf("%d: p20: got %d, want %d", ind, ps[1], tt.wantP20) - } - - if tt.wantP50 != ps[2] { - t.Fatalf("%d: p50: got %d, want %d", ind, ps[2], tt.wantP50) - } - - if tt.wantP95 != ps[3] { - t.Fatalf("%d: p95: got %d, want %d", ind, ps[3], tt.wantP95) - } - - if tt.wantP99 != ps[4] { - t.Fatalf("%d: p99: got %d, want %d", ind, ps[4], tt.wantP99) - } - } -} diff --git a/metrics/runtime_cgo.go b/metrics/runtime_cgo.go deleted file mode 100644 index e3391f4e89f..00000000000 --- a/metrics/runtime_cgo.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build cgo -// +build !appengine - -package metrics - -import "runtime" - -func numCgoCall() int64 { - return runtime.NumCgoCall() -} diff --git a/metrics/runtime_no_cgo.go b/metrics/runtime_no_cgo.go deleted file mode 100644 index 616a3b4751b..00000000000 --- a/metrics/runtime_no_cgo.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !cgo appengine - -package metrics - -func numCgoCall() int64 { - return 0 -} diff --git a/metrics/runtime_test.go b/metrics/runtime_test.go index c8aae60dcb4..f5339b40804 100644 --- a/metrics/runtime_test.go +++ b/metrics/runtime_test.go @@ -4,6 +4,8 @@ import ( "runtime" "testing" "time" + + "github.com/ledgerwatch/erigon-lib/common" ) func TestRuntimeMemStatsBlocking(t *testing.T) { @@ -14,7 +16,7 @@ func TestRuntimeMemStatsBlocking(t *testing.T) { go testRuntimeMemStatsBlocking(ch) var memStats runtime.MemStats t0 := time.Now() - runtime.ReadMemStats(&memStats) + common.ReadMemStats(&memStats) t1 := time.Now() t.Log("i++ during runtime.ReadMemStats:", <-ch) go testRuntimeMemStatsBlocking(ch) diff --git a/metrics/sample.go b/metrics/sample.go index fa2bfb274e3..d9263d89e18 100644 --- a/metrics/sample.go +++ b/metrics/sample.go @@ -1,15 +1,5 @@ package metrics -import ( - "math" - "math/rand" - "sort" - "sync" - "time" -) - -const rescaleThreshold = time.Hour - // Samples maintain a statistically-significant selection of values from // a stream. type Sample interface { @@ -28,589 +18,3 @@ type Sample interface { Values() []int64 Variance() float64 } - -// ExpDecaySample is an exponentially-decaying sample using a forward-decaying -// priority reservoir. See Cormode et al's "Forward Decay: A Practical Time -// Decay Model for Streaming Systems". -// -// -type ExpDecaySample struct { - alpha float64 - count int64 - mutex sync.Mutex - reservoirSize int - t0, t1 time.Time - values *expDecaySampleHeap -} - -// NewExpDecaySample constructs a new exponentially-decaying sample with the -// given reservoir size and alpha. -func NewExpDecaySample(reservoirSize int, alpha float64) Sample { - if !Enabled { - return NilSample{} - } - s := &ExpDecaySample{ - alpha: alpha, - reservoirSize: reservoirSize, - t0: time.Now(), - values: newExpDecaySampleHeap(reservoirSize), - } - s.t1 = s.t0.Add(rescaleThreshold) - return s -} - -// Clear clears all samples. -func (s *ExpDecaySample) Clear() { - s.mutex.Lock() - defer s.mutex.Unlock() - s.count = 0 - s.t0 = time.Now() - s.t1 = s.t0.Add(rescaleThreshold) - s.values.Clear() -} - -// Count returns the number of samples recorded, which may exceed the -// reservoir size. -func (s *ExpDecaySample) Count() int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return s.count -} - -// Max returns the maximum value in the sample, which may not be the maximum -// value ever to be part of the sample. -func (s *ExpDecaySample) Max() int64 { - return SampleMax(s.Values()) -} - -// Mean returns the mean of the values in the sample. -func (s *ExpDecaySample) Mean() float64 { - return SampleMean(s.Values()) -} - -// Min returns the minimum value in the sample, which may not be the minimum -// value ever to be part of the sample. -func (s *ExpDecaySample) Min() int64 { - return SampleMin(s.Values()) -} - -// Percentile returns an arbitrary percentile of values in the sample. -func (s *ExpDecaySample) Percentile(p float64) float64 { - return SamplePercentile(s.Values(), p) -} - -// Percentiles returns a slice of arbitrary percentiles of values in the -// sample. -func (s *ExpDecaySample) Percentiles(ps []float64) []float64 { - return SamplePercentiles(s.Values(), ps) -} - -// Size returns the size of the sample, which is at most the reservoir size. -func (s *ExpDecaySample) Size() int { - s.mutex.Lock() - defer s.mutex.Unlock() - return s.values.Size() -} - -// Snapshot returns a read-only copy of the sample. -func (s *ExpDecaySample) Snapshot() Sample { - s.mutex.Lock() - defer s.mutex.Unlock() - vals := s.values.Values() - values := make([]int64, len(vals)) - for i, v := range vals { - values[i] = v.v - } - return &SampleSnapshot{ - count: s.count, - values: values, - } -} - -// StdDev returns the standard deviation of the values in the sample. -func (s *ExpDecaySample) StdDev() float64 { - return SampleStdDev(s.Values()) -} - -// Sum returns the sum of the values in the sample. -func (s *ExpDecaySample) Sum() int64 { - return SampleSum(s.Values()) -} - -// Update samples a new value. -func (s *ExpDecaySample) Update(v int64) { - s.update(time.Now(), v) -} - -// Values returns a copy of the values in the sample. -func (s *ExpDecaySample) Values() []int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - vals := s.values.Values() - values := make([]int64, len(vals)) - for i, v := range vals { - values[i] = v.v - } - return values -} - -// Variance returns the variance of the values in the sample. -func (s *ExpDecaySample) Variance() float64 { - return SampleVariance(s.Values()) -} - -// update samples a new value at a particular timestamp. This is a method all -// its own to facilitate testing. -func (s *ExpDecaySample) update(t time.Time, v int64) { - s.mutex.Lock() - defer s.mutex.Unlock() - s.count++ - if s.values.Size() == s.reservoirSize { - s.values.Pop() - } - s.values.Push(expDecaySample{ - k: math.Exp(t.Sub(s.t0).Seconds()*s.alpha) / rand.Float64(), - v: v, - }) - if t.After(s.t1) { - values := s.values.Values() - t0 := s.t0 - s.values.Clear() - s.t0 = t - s.t1 = s.t0.Add(rescaleThreshold) - for _, v := range values { - v.k = v.k * math.Exp(-s.alpha*s.t0.Sub(t0).Seconds()) - s.values.Push(v) - } - } -} - -// NilSample is a no-op Sample. -type NilSample struct{} - -// Clear is a no-op. -func (NilSample) Clear() {} - -// Count is a no-op. -func (NilSample) Count() int64 { return 0 } - -// Max is a no-op. -func (NilSample) Max() int64 { return 0 } - -// Mean is a no-op. -func (NilSample) Mean() float64 { return 0.0 } - -// Min is a no-op. -func (NilSample) Min() int64 { return 0 } - -// Percentile is a no-op. -func (NilSample) Percentile(p float64) float64 { return 0.0 } - -// Percentiles is a no-op. -func (NilSample) Percentiles(ps []float64) []float64 { - return make([]float64, len(ps)) -} - -// Size is a no-op. -func (NilSample) Size() int { return 0 } - -// Sample is a no-op. -func (NilSample) Snapshot() Sample { return NilSample{} } - -// StdDev is a no-op. -func (NilSample) StdDev() float64 { return 0.0 } - -// Sum is a no-op. -func (NilSample) Sum() int64 { return 0 } - -// Update is a no-op. -func (NilSample) Update(v int64) {} - -// Values is a no-op. -func (NilSample) Values() []int64 { return []int64{} } - -// Variance is a no-op. -func (NilSample) Variance() float64 { return 0.0 } - -// SampleMax returns the maximum value of the slice of int64. -func SampleMax(values []int64) int64 { - if len(values) == 0 { - return 0 - } - var max int64 = math.MinInt64 - for _, v := range values { - if max < v { - max = v - } - } - return max -} - -// SampleMean returns the mean value of the slice of int64. -func SampleMean(values []int64) float64 { - if len(values) == 0 { - return 0.0 - } - return float64(SampleSum(values)) / float64(len(values)) -} - -// SampleMin returns the minimum value of the slice of int64. -func SampleMin(values []int64) int64 { - if len(values) == 0 { - return 0 - } - var min int64 = math.MaxInt64 - for _, v := range values { - if min > v { - min = v - } - } - return min -} - -// SamplePercentiles returns an arbitrary percentile of the slice of int64. -func SamplePercentile(values int64Slice, p float64) float64 { - return SamplePercentiles(values, []float64{p})[0] -} - -// SamplePercentiles returns a slice of arbitrary percentiles of the slice of -// int64. -func SamplePercentiles(values int64Slice, ps []float64) []float64 { - scores := make([]float64, len(ps)) - size := len(values) - if size > 0 { - sort.Sort(values) - for i, p := range ps { - pos := p * float64(size+1) - if pos < 1.0 { - scores[i] = float64(values[0]) - } else if pos >= float64(size) { - scores[i] = float64(values[size-1]) - } else { - lower := float64(values[int(pos)-1]) - upper := float64(values[int(pos)]) - scores[i] = lower + (pos-math.Floor(pos))*(upper-lower) - } - } - } - return scores -} - -// SampleSnapshot is a read-only copy of another Sample. -type SampleSnapshot struct { - count int64 - values []int64 -} - -func NewSampleSnapshot(count int64, values []int64) *SampleSnapshot { - return &SampleSnapshot{ - count: count, - values: values, - } -} - -// Clear panics. -func (*SampleSnapshot) Clear() { - panic("Clear called on a SampleSnapshot") -} - -// Count returns the count of inputs at the time the snapshot was taken. -func (s *SampleSnapshot) Count() int64 { return s.count } - -// Max returns the maximal value at the time the snapshot was taken. -func (s *SampleSnapshot) Max() int64 { return SampleMax(s.values) } - -// Mean returns the mean value at the time the snapshot was taken. -func (s *SampleSnapshot) Mean() float64 { return SampleMean(s.values) } - -// Min returns the minimal value at the time the snapshot was taken. -func (s *SampleSnapshot) Min() int64 { return SampleMin(s.values) } - -// Percentile returns an arbitrary percentile of values at the time the -// snapshot was taken. -func (s *SampleSnapshot) Percentile(p float64) float64 { - return SamplePercentile(s.values, p) -} - -// Percentiles returns a slice of arbitrary percentiles of values at the time -// the snapshot was taken. -func (s *SampleSnapshot) Percentiles(ps []float64) []float64 { - return SamplePercentiles(s.values, ps) -} - -// Size returns the size of the sample at the time the snapshot was taken. -func (s *SampleSnapshot) Size() int { return len(s.values) } - -// Snapshot returns the snapshot. -func (s *SampleSnapshot) Snapshot() Sample { return s } - -// StdDev returns the standard deviation of values at the time the snapshot was -// taken. -func (s *SampleSnapshot) StdDev() float64 { return SampleStdDev(s.values) } - -// Sum returns the sum of values at the time the snapshot was taken. -func (s *SampleSnapshot) Sum() int64 { return SampleSum(s.values) } - -// Update panics. -func (*SampleSnapshot) Update(int64) { - panic("Update called on a SampleSnapshot") -} - -// Values returns a copy of the values in the sample. -func (s *SampleSnapshot) Values() []int64 { - values := make([]int64, len(s.values)) - copy(values, s.values) - return values -} - -// Variance returns the variance of values at the time the snapshot was taken. -func (s *SampleSnapshot) Variance() float64 { return SampleVariance(s.values) } - -// SampleStdDev returns the standard deviation of the slice of int64. -func SampleStdDev(values []int64) float64 { - return math.Sqrt(SampleVariance(values)) -} - -// SampleSum returns the sum of the slice of int64. -func SampleSum(values []int64) int64 { - var sum int64 - for _, v := range values { - sum += v - } - return sum -} - -// SampleVariance returns the variance of the slice of int64. -func SampleVariance(values []int64) float64 { - if len(values) == 0 { - return 0.0 - } - m := SampleMean(values) - var sum float64 - for _, v := range values { - d := float64(v) - m - sum += d * d - } - return sum / float64(len(values)) -} - -// A uniform sample using Vitter's Algorithm R. -// -// -type UniformSample struct { - count int64 - mutex sync.Mutex - reservoirSize int - values []int64 -} - -// NewUniformSample constructs a new uniform sample with the given reservoir -// size. -func NewUniformSample(reservoirSize int) Sample { - if !Enabled { - return NilSample{} - } - return &UniformSample{ - reservoirSize: reservoirSize, - values: make([]int64, 0, reservoirSize), - } -} - -// Clear clears all samples. -func (s *UniformSample) Clear() { - s.mutex.Lock() - defer s.mutex.Unlock() - s.count = 0 - s.values = make([]int64, 0, s.reservoirSize) -} - -// Count returns the number of samples recorded, which may exceed the -// reservoir size. -func (s *UniformSample) Count() int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return s.count -} - -// Max returns the maximum value in the sample, which may not be the maximum -// value ever to be part of the sample. -func (s *UniformSample) Max() int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SampleMax(s.values) -} - -// Mean returns the mean of the values in the sample. -func (s *UniformSample) Mean() float64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SampleMean(s.values) -} - -// Min returns the minimum value in the sample, which may not be the minimum -// value ever to be part of the sample. -func (s *UniformSample) Min() int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SampleMin(s.values) -} - -// Percentile returns an arbitrary percentile of values in the sample. -func (s *UniformSample) Percentile(p float64) float64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SamplePercentile(s.values, p) -} - -// Percentiles returns a slice of arbitrary percentiles of values in the -// sample. -func (s *UniformSample) Percentiles(ps []float64) []float64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SamplePercentiles(s.values, ps) -} - -// Size returns the size of the sample, which is at most the reservoir size. -func (s *UniformSample) Size() int { - s.mutex.Lock() - defer s.mutex.Unlock() - return len(s.values) -} - -// Snapshot returns a read-only copy of the sample. -func (s *UniformSample) Snapshot() Sample { - s.mutex.Lock() - defer s.mutex.Unlock() - values := make([]int64, len(s.values)) - copy(values, s.values) - return &SampleSnapshot{ - count: s.count, - values: values, - } -} - -// StdDev returns the standard deviation of the values in the sample. -func (s *UniformSample) StdDev() float64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SampleStdDev(s.values) -} - -// Sum returns the sum of the values in the sample. -func (s *UniformSample) Sum() int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SampleSum(s.values) -} - -// Update samples a new value. -func (s *UniformSample) Update(v int64) { - s.mutex.Lock() - defer s.mutex.Unlock() - s.count++ - if len(s.values) < s.reservoirSize { - s.values = append(s.values, v) - } else { - r := rand.Int63n(s.count) - if r < int64(len(s.values)) { - s.values[int(r)] = v - } - } -} - -// Values returns a copy of the values in the sample. -func (s *UniformSample) Values() []int64 { - s.mutex.Lock() - defer s.mutex.Unlock() - values := make([]int64, len(s.values)) - copy(values, s.values) - return values -} - -// Variance returns the variance of the values in the sample. -func (s *UniformSample) Variance() float64 { - s.mutex.Lock() - defer s.mutex.Unlock() - return SampleVariance(s.values) -} - -// expDecaySample represents an individual sample in a heap. -type expDecaySample struct { - k float64 - v int64 -} - -func newExpDecaySampleHeap(reservoirSize int) *expDecaySampleHeap { - return &expDecaySampleHeap{make([]expDecaySample, 0, reservoirSize)} -} - -// expDecaySampleHeap is a min-heap of expDecaySamples. -// The internal implementation is copied from the standard library's container/heap -type expDecaySampleHeap struct { - s []expDecaySample -} - -func (h *expDecaySampleHeap) Clear() { - h.s = h.s[:0] -} - -func (h *expDecaySampleHeap) Push(s expDecaySample) { - n := len(h.s) - h.s = h.s[0 : n+1] - h.s[n] = s - h.up(n) -} - -func (h *expDecaySampleHeap) Pop() expDecaySample { - n := len(h.s) - 1 - h.s[0], h.s[n] = h.s[n], h.s[0] - h.down(0, n) - - n = len(h.s) - s := h.s[n-1] - h.s = h.s[0 : n-1] - return s -} - -func (h *expDecaySampleHeap) Size() int { - return len(h.s) -} - -func (h *expDecaySampleHeap) Values() []expDecaySample { - return h.s -} - -func (h *expDecaySampleHeap) up(j int) { - for { - i := (j - 1) / 2 // parent - if i == j || !(h.s[j].k < h.s[i].k) { - break - } - h.s[i], h.s[j] = h.s[j], h.s[i] - j = i - } -} - -func (h *expDecaySampleHeap) down(i, n int) { - for { - j1 := 2*i + 1 - if j1 >= n || j1 < 0 { // j1 < 0 after int overflow - break - } - j := j1 // left child - if j2 := j1 + 1; j2 < n && !(h.s[j1].k < h.s[j2].k) { - j = j2 // = 2*i + 2 // right child - } - if !(h.s[j].k < h.s[i].k) { - break - } - h.s[i], h.s[j] = h.s[j], h.s[i] - i = j - } -} - -type int64Slice []int64 - -func (p int64Slice) Len() int { return len(p) } -func (p int64Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/metrics/sample_test.go b/metrics/sample_test.go deleted file mode 100644 index c9168d3e820..00000000000 --- a/metrics/sample_test.go +++ /dev/null @@ -1,365 +0,0 @@ -package metrics - -import ( - "math" - "math/rand" - "runtime" - "testing" - "time" -) - -// Benchmark{Compute,Copy}{1000,1000000} demonstrate that, even for relatively -// expensive computations like Variance, the cost of copying the Sample, as -// approximated by a make and copy, is much greater than the cost of the -// computation for small samples and only slightly less for large samples. -func BenchmarkCompute1000(b *testing.B) { - s := make([]int64, 1000) - for i := 0; i < len(s); i++ { - s[i] = int64(i) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - SampleVariance(s) - } -} -func BenchmarkCompute1000000(b *testing.B) { - s := make([]int64, 1000000) - for i := 0; i < len(s); i++ { - s[i] = int64(i) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - SampleVariance(s) - } -} -func BenchmarkCopy1000(b *testing.B) { - s := make([]int64, 1000) - for i := 0; i < len(s); i++ { - s[i] = int64(i) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - sCopy := make([]int64, len(s)) - copy(sCopy, s) - } -} -func BenchmarkCopy1000000(b *testing.B) { - s := make([]int64, 1000000) - for i := 0; i < len(s); i++ { - s[i] = int64(i) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - sCopy := make([]int64, len(s)) - copy(sCopy, s) - } -} - -func BenchmarkExpDecaySample257(b *testing.B) { - benchmarkSample(b, NewExpDecaySample(257, 0.015)) -} - -func BenchmarkExpDecaySample514(b *testing.B) { - benchmarkSample(b, NewExpDecaySample(514, 0.015)) -} - -func BenchmarkExpDecaySample1028(b *testing.B) { - benchmarkSample(b, NewExpDecaySample(1028, 0.015)) -} - -func BenchmarkUniformSample257(b *testing.B) { - benchmarkSample(b, NewUniformSample(257)) -} - -func BenchmarkUniformSample514(b *testing.B) { - benchmarkSample(b, NewUniformSample(514)) -} - -func BenchmarkUniformSample1028(b *testing.B) { - benchmarkSample(b, NewUniformSample(1028)) -} - -func TestExpDecaySample10(t *testing.T) { - rand.Seed(1) - s := NewExpDecaySample(100, 0.99) - for i := 0; i < 10; i++ { - s.Update(int64(i)) - } - if size := s.Count(); size != 10 { - t.Errorf("s.Count(): 10 != %v\n", size) - } - if size := s.Size(); size != 10 { - t.Errorf("s.Size(): 10 != %v\n", size) - } - if l := len(s.Values()); l != 10 { - t.Errorf("len(s.Values()): 10 != %v\n", l) - } - for _, v := range s.Values() { - if v > 10 || v < 0 { - t.Errorf("out of range [0, 10): %v\n", v) - } - } -} - -func TestExpDecaySample100(t *testing.T) { - rand.Seed(1) - s := NewExpDecaySample(1000, 0.01) - for i := 0; i < 100; i++ { - s.Update(int64(i)) - } - if size := s.Count(); size != 100 { - t.Errorf("s.Count(): 100 != %v\n", size) - } - if size := s.Size(); size != 100 { - t.Errorf("s.Size(): 100 != %v\n", size) - } - if l := len(s.Values()); l != 100 { - t.Errorf("len(s.Values()): 100 != %v\n", l) - } - for _, v := range s.Values() { - if v > 100 || v < 0 { - t.Errorf("out of range [0, 100): %v\n", v) - } - } -} - -func TestExpDecaySample1000(t *testing.T) { - rand.Seed(1) - s := NewExpDecaySample(100, 0.99) - for i := 0; i < 1000; i++ { - s.Update(int64(i)) - } - if size := s.Count(); size != 1000 { - t.Errorf("s.Count(): 1000 != %v\n", size) - } - if size := s.Size(); size != 100 { - t.Errorf("s.Size(): 100 != %v\n", size) - } - if l := len(s.Values()); l != 100 { - t.Errorf("len(s.Values()): 100 != %v\n", l) - } - for _, v := range s.Values() { - if v > 1000 || v < 0 { - t.Errorf("out of range [0, 1000): %v\n", v) - } - } -} - -// This test makes sure that the sample's priority is not amplified by using -// nanosecond duration since start rather than second duration since start. -// The priority becomes +Inf quickly after starting if this is done, -// effectively freezing the set of samples until a rescale step happens. -func TestExpDecaySampleNanosecondRegression(t *testing.T) { - rand.Seed(1) - s := NewExpDecaySample(100, 0.99) - for i := 0; i < 100; i++ { - s.Update(10) - } - time.Sleep(1 * time.Millisecond) - for i := 0; i < 100; i++ { - s.Update(20) - } - v := s.Values() - avg := float64(0) - for i := 0; i < len(v); i++ { - avg += float64(v[i]) - } - avg /= float64(len(v)) - if avg > 16 || avg < 14 { - t.Errorf("out of range [14, 16]: %v\n", avg) - } -} - -func TestExpDecaySampleRescale(t *testing.T) { - s := NewExpDecaySample(2, 0.001).(*ExpDecaySample) - s.update(time.Now(), 1) - s.update(time.Now().Add(time.Hour+time.Microsecond), 1) - for _, v := range s.values.Values() { - if v.k == 0.0 { - t.Fatal("v.k == 0.0") - } - } -} - -func TestExpDecaySampleSnapshot(t *testing.T) { - now := time.Now() - rand.Seed(1) - s := NewExpDecaySample(100, 0.99) - for i := 1; i <= 10000; i++ { - s.(*ExpDecaySample).update(now.Add(time.Duration(i)), int64(i)) - } - snapshot := s.Snapshot() - s.Update(1) - testExpDecaySampleStatistics(t, snapshot) -} - -func TestExpDecaySampleStatistics(t *testing.T) { - now := time.Now() - rand.Seed(1) - s := NewExpDecaySample(100, 0.99) - for i := 1; i <= 10000; i++ { - s.(*ExpDecaySample).update(now.Add(time.Duration(i)), int64(i)) - } - testExpDecaySampleStatistics(t, s) -} - -func TestUniformSample(t *testing.T) { - rand.Seed(1) - s := NewUniformSample(100) - for i := 0; i < 1000; i++ { - s.Update(int64(i)) - } - if size := s.Count(); size != 1000 { - t.Errorf("s.Count(): 1000 != %v\n", size) - } - if size := s.Size(); size != 100 { - t.Errorf("s.Size(): 100 != %v\n", size) - } - if l := len(s.Values()); l != 100 { - t.Errorf("len(s.Values()): 100 != %v\n", l) - } - for _, v := range s.Values() { - if v > 1000 || v < 0 { - t.Errorf("out of range [0, 100): %v\n", v) - } - } -} - -func TestUniformSampleIncludesTail(t *testing.T) { - rand.Seed(1) - s := NewUniformSample(100) - max := 100 - for i := 0; i < max; i++ { - s.Update(int64(i)) - } - v := s.Values() - sum := 0 - exp := (max - 1) * max / 2 - for i := 0; i < len(v); i++ { - sum += int(v[i]) - } - if exp != sum { - t.Errorf("sum: %v != %v\n", exp, sum) - } -} - -func TestUniformSampleSnapshot(t *testing.T) { - s := NewUniformSample(100) - for i := 1; i <= 10000; i++ { - s.Update(int64(i)) - } - snapshot := s.Snapshot() - s.Update(1) - testUniformSampleStatistics(t, snapshot) -} - -func TestUniformSampleStatistics(t *testing.T) { - rand.Seed(1) - s := NewUniformSample(100) - for i := 1; i <= 10000; i++ { - s.Update(int64(i)) - } - testUniformSampleStatistics(t, s) -} - -func benchmarkSample(b *testing.B, s Sample) { - var memStats runtime.MemStats - runtime.ReadMemStats(&memStats) - pauseTotalNs := memStats.PauseTotalNs - b.ResetTimer() - for i := 0; i < b.N; i++ { - s.Update(1) - } - b.StopTimer() - runtime.GC() - runtime.ReadMemStats(&memStats) - b.Logf("GC cost: %d ns/op", int(memStats.PauseTotalNs-pauseTotalNs)/b.N) -} - -func testExpDecaySampleStatistics(t *testing.T, s Sample) { - if count := s.Count(); count != 10000 { - t.Errorf("s.Count(): 10000 != %v\n", count) - } - if min := s.Min(); min != 107 { - t.Errorf("s.Min(): 107 != %v\n", min) - } - if max := s.Max(); max != 10000 { - t.Errorf("s.Max(): 10000 != %v\n", max) - } - if mean := s.Mean(); mean != 4965.98 { - t.Errorf("s.Mean(): 4965.98 != %v\n", mean) - } - if stdDev := s.StdDev(); stdDev != 2959.825156930727 { - t.Errorf("s.StdDev(): 2959.825156930727 != %v\n", stdDev) - } - ps := s.Percentiles([]float64{0.5, 0.75, 0.99}) - if ps[0] != 4615 { - t.Errorf("median: 4615 != %v\n", ps[0]) - } - if ps[1] != 7672 { - t.Errorf("75th percentile: 7672 != %v\n", ps[1]) - } - if ps[2] != 9998.99 { - t.Errorf("99th percentile: 9998.99 != %v\n", ps[2]) - } -} - -func testUniformSampleStatistics(t *testing.T, s Sample) { - if count := s.Count(); count != 10000 { - t.Errorf("s.Count(): 10000 != %v\n", count) - } - if min := s.Min(); min != 37 { - t.Errorf("s.Min(): 37 != %v\n", min) - } - if max := s.Max(); max != 9989 { - t.Errorf("s.Max(): 9989 != %v\n", max) - } - if mean := s.Mean(); mean != 4748.14 { - t.Errorf("s.Mean(): 4748.14 != %v\n", mean) - } - if stdDev := s.StdDev(); stdDev != 2826.684117548333 { - t.Errorf("s.StdDev(): 2826.684117548333 != %v\n", stdDev) - } - ps := s.Percentiles([]float64{0.5, 0.75, 0.99}) - if ps[0] != 4599 { - t.Errorf("median: 4599 != %v\n", ps[0]) - } - if ps[1] != 7380.5 { - t.Errorf("75th percentile: 7380.5 != %v\n", ps[1]) - } - if math.Abs(9986.429999999998-ps[2]) > epsilonPercentile { - t.Errorf("99th percentile: 9986.429999999998 != %v\n", ps[2]) - } -} - -// TestUniformSampleConcurrentUpdateCount would expose data race problems with -// concurrent Update and Count calls on Sample when test is called with -race -// argument -func TestUniformSampleConcurrentUpdateCount(t *testing.T) { - if testing.Short() { - t.Skip("skipping in short mode") - } - s := NewUniformSample(100) - for i := 0; i < 100; i++ { - s.Update(int64(i)) - } - quit := make(chan struct{}) - go func() { - t := time.NewTicker(10 * time.Millisecond) - defer t.Stop() - for { - select { - case <-t.C: - s.Update(rand.Int63()) - case <-quit: - t.Stop() - return - } - } - }() - for i := 0; i < 1000; i++ { - s.Count() - time.Sleep(5 * time.Millisecond) - } - quit <- struct{}{} -} diff --git a/metrics/syslog.go b/metrics/syslog.go deleted file mode 100644 index a0ed4b1b236..00000000000 --- a/metrics/syslog.go +++ /dev/null @@ -1,78 +0,0 @@ -// +build !windows - -package metrics - -import ( - "fmt" - "log/syslog" - "time" -) - -// Output each metric in the given registry to syslog periodically using -// the given syslogger. -func Syslog(r Registry, d time.Duration, w *syslog.Writer) { - for range time.Tick(d) { - r.Each(func(name string, i interface{}) { - switch metric := i.(type) { - case Counter: - w.Info(fmt.Sprintf("counter %s: count: %d", name, metric.Count())) - case Gauge: - w.Info(fmt.Sprintf("gauge %s: value: %d", name, metric.Value())) - case GaugeFloat64: - w.Info(fmt.Sprintf("gauge %s: value: %f", name, metric.Value())) - case Healthcheck: - metric.Check() - w.Info(fmt.Sprintf("healthcheck %s: error: %v", name, metric.Error())) - case Histogram: - h := metric.Snapshot() - ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - w.Info(fmt.Sprintf( - "histogram %s: count: %d min: %d max: %d mean: %.2f stddev: %.2f median: %.2f 75%%: %.2f 95%%: %.2f 99%%: %.2f 99.9%%: %.2f", - name, - h.Count(), - h.Min(), - h.Max(), - h.Mean(), - h.StdDev(), - ps[0], - ps[1], - ps[2], - ps[3], - ps[4], - )) - case Meter: - m := metric.Snapshot() - w.Info(fmt.Sprintf( - "meter %s: count: %d 1-min: %.2f 5-min: %.2f 15-min: %.2f mean: %.2f", - name, - m.Count(), - m.Rate1(), - m.Rate5(), - m.Rate15(), - m.RateMean(), - )) - case Timer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - w.Info(fmt.Sprintf( - "timer %s: count: %d min: %d max: %d mean: %.2f stddev: %.2f median: %.2f 75%%: %.2f 95%%: %.2f 99%%: %.2f 99.9%%: %.2f 1-min: %.2f 5-min: %.2f 15-min: %.2f mean-rate: %.2f", - name, - t.Count(), - t.Min(), - t.Max(), - t.Mean(), - t.StdDev(), - ps[0], - ps[1], - ps[2], - ps[3], - ps[4], - t.Rate1(), - t.Rate5(), - t.Rate15(), - t.RateMean(), - )) - } - }) - } -} diff --git a/metrics/timer.go b/metrics/timer.go index a63c9dfb6c2..2f4a9aa2a9e 100644 --- a/metrics/timer.go +++ b/metrics/timer.go @@ -1,7 +1,6 @@ package metrics import ( - "sync" "time" ) @@ -26,301 +25,3 @@ type Timer interface { UpdateSince(time.Time) Variance() float64 } - -// GetOrRegisterTimer returns an existing Timer or constructs and registers a -// new StandardTimer. -// Be sure to unregister the meter from the registry once it is of no use to -// allow for garbage collection. -func GetOrRegisterTimer(name string, r Registry) Timer { - if nil == r { - r = DefaultRegistry - } - return r.GetOrRegister(name, NewTimer).(Timer) -} - -// NewCustomTimer constructs a new StandardTimer from a Histogram and a Meter. -// Be sure to call Stop() once the timer is of no use to allow for garbage collection. -func NewCustomTimer(h Histogram, m Meter) Timer { - if !Enabled { - return NilTimer{} - } - return &StandardTimer{ - histogram: h, - meter: m, - } -} - -// NewRegisteredTimer constructs and registers a new StandardTimer. -// Be sure to unregister the meter from the registry once it is of no use to -// allow for garbage collection. -func NewRegisteredTimer(name string, r Registry) Timer { - c := NewTimer() - if nil == r { - r = DefaultRegistry - } - r.Register(name, c) - return c -} - -// NewTimer constructs a new StandardTimer using an exponentially-decaying -// sample with the same reservoir size and alpha as UNIX load averages. -// Be sure to call Stop() once the timer is of no use to allow for garbage collection. -func NewTimer() Timer { - if !Enabled { - return NilTimer{} - } - return &StandardTimer{ - histogram: NewHistogram(NewExpDecaySample(1028, 0.015)), - meter: NewMeter(), - } -} - -// NilTimer is a no-op Timer. -type NilTimer struct{} - -// Count is a no-op. -func (NilTimer) Count() int64 { return 0 } - -// Max is a no-op. -func (NilTimer) Max() int64 { return 0 } - -// Mean is a no-op. -func (NilTimer) Mean() float64 { return 0.0 } - -// Min is a no-op. -func (NilTimer) Min() int64 { return 0 } - -// Percentile is a no-op. -func (NilTimer) Percentile(p float64) float64 { return 0.0 } - -// Percentiles is a no-op. -func (NilTimer) Percentiles(ps []float64) []float64 { - return make([]float64, len(ps)) -} - -// Rate1 is a no-op. -func (NilTimer) Rate1() float64 { return 0.0 } - -// Rate5 is a no-op. -func (NilTimer) Rate5() float64 { return 0.0 } - -// Rate15 is a no-op. -func (NilTimer) Rate15() float64 { return 0.0 } - -// RateMean is a no-op. -func (NilTimer) RateMean() float64 { return 0.0 } - -// Snapshot is a no-op. -func (NilTimer) Snapshot() Timer { return NilTimer{} } - -// StdDev is a no-op. -func (NilTimer) StdDev() float64 { return 0.0 } - -// Stop is a no-op. -func (NilTimer) Stop() {} - -// Sum is a no-op. -func (NilTimer) Sum() int64 { return 0 } - -// Time is a no-op. -func (NilTimer) Time(func()) {} - -// Update is a no-op. -func (NilTimer) Update(time.Duration) {} - -// UpdateSince is a no-op. -func (NilTimer) UpdateSince(time.Time) {} - -// Variance is a no-op. -func (NilTimer) Variance() float64 { return 0.0 } - -// StandardTimer is the standard implementation of a Timer and uses a Histogram -// and Meter. -type StandardTimer struct { - histogram Histogram - meter Meter - mutex sync.Mutex -} - -// Count returns the number of events recorded. -func (t *StandardTimer) Count() int64 { - return t.histogram.Count() -} - -// Max returns the maximum value in the sample. -func (t *StandardTimer) Max() int64 { - return t.histogram.Max() -} - -// Mean returns the mean of the values in the sample. -func (t *StandardTimer) Mean() float64 { - return t.histogram.Mean() -} - -// Min returns the minimum value in the sample. -func (t *StandardTimer) Min() int64 { - return t.histogram.Min() -} - -// Percentile returns an arbitrary percentile of the values in the sample. -func (t *StandardTimer) Percentile(p float64) float64 { - return t.histogram.Percentile(p) -} - -// Percentiles returns a slice of arbitrary percentiles of the values in the -// sample. -func (t *StandardTimer) Percentiles(ps []float64) []float64 { - return t.histogram.Percentiles(ps) -} - -// Rate1 returns the one-minute moving average rate of events per second. -func (t *StandardTimer) Rate1() float64 { - return t.meter.Rate1() -} - -// Rate5 returns the five-minute moving average rate of events per second. -func (t *StandardTimer) Rate5() float64 { - return t.meter.Rate5() -} - -// Rate15 returns the fifteen-minute moving average rate of events per second. -func (t *StandardTimer) Rate15() float64 { - return t.meter.Rate15() -} - -// RateMean returns the meter's mean rate of events per second. -func (t *StandardTimer) RateMean() float64 { - return t.meter.RateMean() -} - -// Snapshot returns a read-only copy of the timer. -func (t *StandardTimer) Snapshot() Timer { - t.mutex.Lock() - defer t.mutex.Unlock() - return &TimerSnapshot{ - histogram: t.histogram.Snapshot().(*HistogramSnapshot), - meter: t.meter.Snapshot().(*MeterSnapshot), - } -} - -// StdDev returns the standard deviation of the values in the sample. -func (t *StandardTimer) StdDev() float64 { - return t.histogram.StdDev() -} - -// Stop stops the meter. -func (t *StandardTimer) Stop() { - t.meter.Stop() -} - -// Sum returns the sum in the sample. -func (t *StandardTimer) Sum() int64 { - return t.histogram.Sum() -} - -// Record the duration of the execution of the given function. -func (t *StandardTimer) Time(f func()) { - ts := time.Now() - f() - t.Update(time.Since(ts)) -} - -// Record the duration of an event. -func (t *StandardTimer) Update(d time.Duration) { - t.mutex.Lock() - defer t.mutex.Unlock() - t.histogram.Update(int64(d)) - t.meter.Mark(1) -} - -// Record the duration of an event that started at a time and ends now. -func (t *StandardTimer) UpdateSince(ts time.Time) { - t.mutex.Lock() - defer t.mutex.Unlock() - t.histogram.Update(int64(time.Since(ts))) - t.meter.Mark(1) -} - -// Variance returns the variance of the values in the sample. -func (t *StandardTimer) Variance() float64 { - return t.histogram.Variance() -} - -// TimerSnapshot is a read-only copy of another Timer. -type TimerSnapshot struct { - histogram *HistogramSnapshot - meter *MeterSnapshot -} - -// Count returns the number of events recorded at the time the snapshot was -// taken. -func (t *TimerSnapshot) Count() int64 { return t.histogram.Count() } - -// Max returns the maximum value at the time the snapshot was taken. -func (t *TimerSnapshot) Max() int64 { return t.histogram.Max() } - -// Mean returns the mean value at the time the snapshot was taken. -func (t *TimerSnapshot) Mean() float64 { return t.histogram.Mean() } - -// Min returns the minimum value at the time the snapshot was taken. -func (t *TimerSnapshot) Min() int64 { return t.histogram.Min() } - -// Percentile returns an arbitrary percentile of sampled values at the time the -// snapshot was taken. -func (t *TimerSnapshot) Percentile(p float64) float64 { - return t.histogram.Percentile(p) -} - -// Percentiles returns a slice of arbitrary percentiles of sampled values at -// the time the snapshot was taken. -func (t *TimerSnapshot) Percentiles(ps []float64) []float64 { - return t.histogram.Percentiles(ps) -} - -// Rate1 returns the one-minute moving average rate of events per second at the -// time the snapshot was taken. -func (t *TimerSnapshot) Rate1() float64 { return t.meter.Rate1() } - -// Rate5 returns the five-minute moving average rate of events per second at -// the time the snapshot was taken. -func (t *TimerSnapshot) Rate5() float64 { return t.meter.Rate5() } - -// Rate15 returns the fifteen-minute moving average rate of events per second -// at the time the snapshot was taken. -func (t *TimerSnapshot) Rate15() float64 { return t.meter.Rate15() } - -// RateMean returns the meter's mean rate of events per second at the time the -// snapshot was taken. -func (t *TimerSnapshot) RateMean() float64 { return t.meter.RateMean() } - -// Snapshot returns the snapshot. -func (t *TimerSnapshot) Snapshot() Timer { return t } - -// StdDev returns the standard deviation of the values at the time the snapshot -// was taken. -func (t *TimerSnapshot) StdDev() float64 { return t.histogram.StdDev() } - -// Stop is a no-op. -func (t *TimerSnapshot) Stop() {} - -// Sum returns the sum at the time the snapshot was taken. -func (t *TimerSnapshot) Sum() int64 { return t.histogram.Sum() } - -// Time panics. -func (*TimerSnapshot) Time(func()) { - panic("Time called on a TimerSnapshot") -} - -// Update panics. -func (*TimerSnapshot) Update(time.Duration) { - panic("Update called on a TimerSnapshot") -} - -// UpdateSince panics. -func (*TimerSnapshot) UpdateSince(time.Time) { - panic("UpdateSince called on a TimerSnapshot") -} - -// Variance returns the variance of the values at the time the snapshot was -// taken. -func (t *TimerSnapshot) Variance() float64 { return t.histogram.Variance() } diff --git a/metrics/timer_test.go b/metrics/timer_test.go deleted file mode 100644 index 903e8e8d496..00000000000 --- a/metrics/timer_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package metrics - -import ( - "fmt" - "math" - "testing" - "time" -) - -func BenchmarkTimer(b *testing.B) { - tm := NewTimer() - b.ResetTimer() - for i := 0; i < b.N; i++ { - tm.Update(1) - } -} - -func TestGetOrRegisterTimer(t *testing.T) { - r := NewRegistry() - NewRegisteredTimer("foo", r).Update(47) - if tm := GetOrRegisterTimer("foo", r); tm.Count() != 1 { - t.Fatal(tm) - } -} - -func TestTimerExtremes(t *testing.T) { - tm := NewTimer() - tm.Update(math.MaxInt64) - tm.Update(0) - if stdDev := tm.StdDev(); stdDev != 4.611686018427388e+18 { - t.Errorf("tm.StdDev(): 4.611686018427388e+18 != %v\n", stdDev) - } -} - -func TestTimerStop(t *testing.T) { - l := len(arbiter.meters) - tm := NewTimer() - if l+1 != len(arbiter.meters) { - t.Errorf("arbiter.meters: %d != %d\n", l+1, len(arbiter.meters)) - } - tm.Stop() - if l != len(arbiter.meters) { - t.Errorf("arbiter.meters: %d != %d\n", l, len(arbiter.meters)) - } -} - -func TestTimerFunc(t *testing.T) { - var ( - tm = NewTimer() - testStart = time.Now() - actualTime time.Duration - ) - tm.Time(func() { - time.Sleep(50 * time.Millisecond) - actualTime = time.Since(testStart) - }) - var ( - drift = time.Millisecond * 2 - measured = time.Duration(tm.Max()) - ceil = actualTime + drift - floor = actualTime - drift - ) - if measured > ceil || measured < floor { - t.Errorf("tm.Max(): %v > %v || %v > %v\n", measured, ceil, measured, floor) - } -} - -func TestTimerZero(t *testing.T) { - tm := NewTimer() - if count := tm.Count(); count != 0 { - t.Errorf("tm.Count(): 0 != %v\n", count) - } - if min := tm.Min(); min != 0 { - t.Errorf("tm.Min(): 0 != %v\n", min) - } - if max := tm.Max(); max != 0 { - t.Errorf("tm.Max(): 0 != %v\n", max) - } - if mean := tm.Mean(); mean != 0.0 { - t.Errorf("tm.Mean(): 0.0 != %v\n", mean) - } - if stdDev := tm.StdDev(); stdDev != 0.0 { - t.Errorf("tm.StdDev(): 0.0 != %v\n", stdDev) - } - ps := tm.Percentiles([]float64{0.5, 0.75, 0.99}) - if ps[0] != 0.0 { - t.Errorf("median: 0.0 != %v\n", ps[0]) - } - if ps[1] != 0.0 { - t.Errorf("75th percentile: 0.0 != %v\n", ps[1]) - } - if ps[2] != 0.0 { - t.Errorf("99th percentile: 0.0 != %v\n", ps[2]) - } - if rate1 := tm.Rate1(); rate1 != 0.0 { - t.Errorf("tm.Rate1(): 0.0 != %v\n", rate1) - } - if rate5 := tm.Rate5(); rate5 != 0.0 { - t.Errorf("tm.Rate5(): 0.0 != %v\n", rate5) - } - if rate15 := tm.Rate15(); rate15 != 0.0 { - t.Errorf("tm.Rate15(): 0.0 != %v\n", rate15) - } - if rateMean := tm.RateMean(); rateMean != 0.0 { - t.Errorf("tm.RateMean(): 0.0 != %v\n", rateMean) - } -} - -func ExampleGetOrRegisterTimer() { - m := "account.create.latency" - t := GetOrRegisterTimer(m, nil) - t.Update(47) - fmt.Println(t.Max()) // Output: 47 -} diff --git a/metrics/writer.go b/metrics/writer.go deleted file mode 100644 index 88521a80d9d..00000000000 --- a/metrics/writer.go +++ /dev/null @@ -1,100 +0,0 @@ -package metrics - -import ( - "fmt" - "io" - "sort" - "time" -) - -// Write sorts writes each metric in the given registry periodically to the -// given io.Writer. -func Write(r Registry, d time.Duration, w io.Writer) { - for range time.Tick(d) { - WriteOnce(r, w) - } -} - -// WriteOnce sorts and writes metrics in the given registry to the given -// io.Writer. -func WriteOnce(r Registry, w io.Writer) { - var namedMetrics namedMetricSlice - r.Each(func(name string, i interface{}) { - namedMetrics = append(namedMetrics, namedMetric{name, i}) - }) - - sort.Sort(namedMetrics) - for _, namedMetric := range namedMetrics { - switch metric := namedMetric.m.(type) { - case Counter: - fmt.Fprintf(w, "counter %s\n", namedMetric.name) - fmt.Fprintf(w, " count: %9d\n", metric.Count()) - case Gauge: - fmt.Fprintf(w, "gauge %s\n", namedMetric.name) - fmt.Fprintf(w, " value: %9d\n", metric.Value()) - case GaugeFloat64: - fmt.Fprintf(w, "gauge %s\n", namedMetric.name) - fmt.Fprintf(w, " value: %f\n", metric.Value()) - case Healthcheck: - metric.Check() - fmt.Fprintf(w, "healthcheck %s\n", namedMetric.name) - fmt.Fprintf(w, " error: %v\n", metric.Error()) - case Histogram: - h := metric.Snapshot() - ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - fmt.Fprintf(w, "histogram %s\n", namedMetric.name) - fmt.Fprintf(w, " count: %9d\n", h.Count()) - fmt.Fprintf(w, " min: %9d\n", h.Min()) - fmt.Fprintf(w, " max: %9d\n", h.Max()) - fmt.Fprintf(w, " mean: %12.2f\n", h.Mean()) - fmt.Fprintf(w, " stddev: %12.2f\n", h.StdDev()) - fmt.Fprintf(w, " median: %12.2f\n", ps[0]) - fmt.Fprintf(w, " 75%%: %12.2f\n", ps[1]) - fmt.Fprintf(w, " 95%%: %12.2f\n", ps[2]) - fmt.Fprintf(w, " 99%%: %12.2f\n", ps[3]) - fmt.Fprintf(w, " 99.9%%: %12.2f\n", ps[4]) - case Meter: - m := metric.Snapshot() - fmt.Fprintf(w, "meter %s\n", namedMetric.name) - fmt.Fprintf(w, " count: %9d\n", m.Count()) - fmt.Fprintf(w, " 1-min rate: %12.2f\n", m.Rate1()) - fmt.Fprintf(w, " 5-min rate: %12.2f\n", m.Rate5()) - fmt.Fprintf(w, " 15-min rate: %12.2f\n", m.Rate15()) - fmt.Fprintf(w, " mean rate: %12.2f\n", m.RateMean()) - case Timer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) - fmt.Fprintf(w, "timer %s\n", namedMetric.name) - fmt.Fprintf(w, " count: %9d\n", t.Count()) - fmt.Fprintf(w, " min: %9d\n", t.Min()) - fmt.Fprintf(w, " max: %9d\n", t.Max()) - fmt.Fprintf(w, " mean: %12.2f\n", t.Mean()) - fmt.Fprintf(w, " stddev: %12.2f\n", t.StdDev()) - fmt.Fprintf(w, " median: %12.2f\n", ps[0]) - fmt.Fprintf(w, " 75%%: %12.2f\n", ps[1]) - fmt.Fprintf(w, " 95%%: %12.2f\n", ps[2]) - fmt.Fprintf(w, " 99%%: %12.2f\n", ps[3]) - fmt.Fprintf(w, " 99.9%%: %12.2f\n", ps[4]) - fmt.Fprintf(w, " 1-min rate: %12.2f\n", t.Rate1()) - fmt.Fprintf(w, " 5-min rate: %12.2f\n", t.Rate5()) - fmt.Fprintf(w, " 15-min rate: %12.2f\n", t.Rate15()) - fmt.Fprintf(w, " mean rate: %12.2f\n", t.RateMean()) - } - } -} - -type namedMetric struct { - name string - m interface{} -} - -// namedMetricSlice is a slice of namedMetrics that implements sort.Interface. -type namedMetricSlice []namedMetric - -func (nms namedMetricSlice) Len() int { return len(nms) } - -func (nms namedMetricSlice) Swap(i, j int) { nms[i], nms[j] = nms[j], nms[i] } - -func (nms namedMetricSlice) Less(i, j int) bool { - return nms[i].name < nms[j].name -} diff --git a/metrics/writer_test.go b/metrics/writer_test.go deleted file mode 100644 index 1aacc287121..00000000000 --- a/metrics/writer_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package metrics - -import ( - "sort" - "testing" -) - -func TestMetricsSorting(t *testing.T) { - var namedMetrics = namedMetricSlice{ - {name: "zzz"}, - {name: "bbb"}, - {name: "fff"}, - {name: "ggg"}, - } - - sort.Sort(namedMetrics) - for i, name := range []string{"bbb", "fff", "ggg", "zzz"} { - if namedMetrics[i].name != name { - t.Fail() - } - } -} diff --git a/migrations/call_trace_index.go b/migrations/call_trace_index.go deleted file mode 100644 index 8f0654b2f1d..00000000000 --- a/migrations/call_trace_index.go +++ /dev/null @@ -1,62 +0,0 @@ -package migrations - -import ( - "context" - "encoding/binary" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/eth/stagedsync" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/ethdb/prune" - "github.com/ledgerwatch/log/v3" -) - -var rebuilCallTraceIndex = Migration{ - Name: "rebuild_call_trace_index", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - // Find the lowest key in the TraceCallSet table - c, err := tx.CursorDupSort(kv.CallTraceSet) - if err != nil { - return err - } - defer c.Close() - var k []byte - k, _, err = c.First() - if err != nil { - return err - } - if k == nil { - log.Warn("Nothing to rebuild, CallTraceSet table is empty") - return BeforeCommit(tx, nil, true) - } - blockNum := binary.BigEndian.Uint64(k) - if blockNum == 0 { - log.Warn("Nothing to rebuild, CallTraceSet's first record", "number", blockNum) - return BeforeCommit(tx, nil, true) - } - logPrefix := "db migration rebuild_call_trace_index" - - pm, err := prune.Get(tx) - if err != nil { - return err - } - if err = stagedsync.DoUnwindCallTraces(logPrefix, tx, 999_999_999, blockNum-1, context.Background(), stagedsync.StageCallTracesCfg(nil, pm, 0, tmpdir)); err != nil { - return err - } - - log.Info("First record in CallTraceTable", "number", blockNum) - if err = stages.SaveStageProgress(tx, stages.CallTraces, blockNum-1); err != nil { - return err - } - if err = BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} diff --git a/migrations/db_schema_version.go b/migrations/db_schema_version.go index a4ee3416e98..cf2ce83f321 100644 --- a/migrations/db_schema_version.go +++ b/migrations/db_schema_version.go @@ -6,8 +6,8 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" ) -var dbSchemaVersion = Migration{ - Name: "db_schema_version", +var dbSchemaVersion5 = Migration{ + Name: "db_schema_version5", Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { tx, err := db.BeginRw(context.Background()) if err != nil { diff --git a/migrations/fix_sequences.go b/migrations/fix_sequences.go deleted file mode 100644 index a890c045b60..00000000000 --- a/migrations/fix_sequences.go +++ /dev/null @@ -1,41 +0,0 @@ -package migrations - -import ( - "context" - - "github.com/ledgerwatch/erigon-lib/kv" -) - -var oldSequences = map[string]string{ - kv.EthTx: "eth_tx", -} - -var fixSequences = Migration{ - Name: "fix_sequences", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - for bkt, oldbkt := range oldSequences { - seq, getErr := tx.GetOne(kv.Sequence, []byte(oldbkt)) - if getErr != nil { - return getErr - } - - if seq != nil { - putErr := tx.Put(kv.Sequence, []byte(bkt), seq) - if putErr != nil { - return putErr - } - } - } - - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} diff --git a/migrations/header_prefix.go b/migrations/header_prefix.go deleted file mode 100644 index 240b19a0d9c..00000000000 --- a/migrations/header_prefix.go +++ /dev/null @@ -1,177 +0,0 @@ -package migrations - -import ( - "bytes" - "context" - "fmt" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" -) - -var headerPrefixToSeparateBuckets = Migration{ - Name: "header_prefix_to_separate_buckets", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - exists, err := tx.ExistsBucket(kv.HeaderPrefixOld) - if err != nil { - return err - } - if !exists { - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - } - - if err = tx.ClearBucket(kv.HeaderCanonical); err != nil { - return err - } - if err = tx.ClearBucket(kv.HeaderTD); err != nil { - return err - } - logPrefix := "split_header_prefix_bucket" - const loadStep = "load" - - canonicalCollector, err := etl.NewCollectorFromFiles(tmpdir + "canonical") - if err != nil { - return err - } - tdCollector, err := etl.NewCollectorFromFiles(tmpdir + "td") - if err != nil { - return err - } - headersCollector, err := etl.NewCollectorFromFiles(tmpdir + "headers") - if err != nil { - return err - } - - switch string(progress) { - case "": - // can't use files if progress field not set, clear them - if canonicalCollector != nil { - canonicalCollector.Close(logPrefix) - canonicalCollector = nil - } - - if tdCollector != nil { - tdCollector.Close(logPrefix) - tdCollector = nil - } - if headersCollector != nil { - headersCollector.Close(logPrefix) - headersCollector = nil - } - case loadStep: - if headersCollector == nil || canonicalCollector == nil || tdCollector == nil { - return ErrMigrationETLFilesDeleted - } - defer func() { - // don't clean if error or panic happened - if err != nil { - return - } - if rec := recover(); rec != nil { - panic(rec) - } - canonicalCollector.Close(logPrefix) - tdCollector.Close(logPrefix) - headersCollector.Close(logPrefix) - }() - goto LoadStep - } - - canonicalCollector = etl.NewCriticalCollector(tmpdir+"canonical", etl.NewSortableBuffer(etl.BufferOptimalSize*4)) - tdCollector = etl.NewCriticalCollector(tmpdir+"td", etl.NewSortableBuffer(etl.BufferOptimalSize*4)) - headersCollector = etl.NewCriticalCollector(tmpdir+"headers", etl.NewSortableBuffer(etl.BufferOptimalSize*4)) - defer func() { - // don't clean if error or panic happened - if err != nil { - return - } - if rec := recover(); rec != nil { - panic(rec) - } - canonicalCollector.Close(logPrefix) - tdCollector.Close(logPrefix) - headersCollector.Close(logPrefix) - }() - - err = tx.ForEach(kv.HeaderPrefixOld, []byte{}, func(k, v []byte) error { - var innerErr error - switch { - case IsHeaderKey(k): - innerErr = headersCollector.Collect(k, v) - case IsHeaderTDKey(k): - innerErr = tdCollector.Collect(bytes.TrimSuffix(k, HeaderTDSuffix), v) - case IsHeaderHashKey(k): - innerErr = canonicalCollector.Collect(bytes.TrimSuffix(k, HeaderHashSuffix), v) - default: - return fmt.Errorf("incorrect header prefix key: %v", common.Bytes2Hex(k)) - } - if innerErr != nil { - return innerErr - } - return nil - }) - if err = tx.DropBucket(kv.HeaderPrefixOld); err != nil { - return err - } - - LoadStep: - // Now transaction would have been re-opened, and we should be re-using the space - if err = canonicalCollector.Load(logPrefix, tx, kv.HeaderCanonical, etl.IdentityLoadFunc, etl.TransformArgs{}); err != nil { - return fmt.Errorf("loading the transformed data back into the storage table: %w", err) - } - if err = tdCollector.Load(logPrefix, tx, kv.HeaderTD, etl.IdentityLoadFunc, etl.TransformArgs{}); err != nil { - return fmt.Errorf("loading the transformed data back into the acc table: %w", err) - } - if err = headersCollector.Load(logPrefix, tx, kv.Headers, etl.IdentityLoadFunc, etl.TransformArgs{}); err != nil { - return fmt.Errorf("loading the transformed data back into the acc table: %w", err) - } - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} - -func IsHeaderKey(k []byte) bool { - l := common.BlockNumberLength + common.HashLength - if len(k) != l { - return false - } - - return !IsHeaderHashKey(k) && !IsHeaderTDKey(k) -} - -func IsHeaderTDKey(k []byte) bool { - l := common.BlockNumberLength + common.HashLength + 1 - return len(k) == l && bytes.Equal(k[l-1:], HeaderTDSuffix) -} - -// headerHashKey = headerPrefix + num (uint64 big endian) + headerHashSuffix -func HeaderHashKey(number uint64) []byte { - return append(dbutils.EncodeBlockNumber(number), HeaderHashSuffix...) -} - -func CheckCanonicalKey(k []byte) bool { - return len(k) == 8+len(HeaderHashSuffix) && bytes.Equal(k[8:], HeaderHashSuffix) -} - -func IsHeaderHashKey(k []byte) bool { - l := common.BlockNumberLength + 1 - return len(k) == l && bytes.Equal(k[l-1:], HeaderHashSuffix) -} - -var ( - HeaderTDSuffix = []byte("t") // block_num_u64 + hash + headerTDSuffix -> td - HeaderHashSuffix = []byte("n") // block_num_u64 + headerHashSuffix -> hash -) diff --git a/migrations/header_prefix_test.go b/migrations/header_prefix_test.go deleted file mode 100644 index c9c06b5af9d..00000000000 --- a/migrations/header_prefix_test.go +++ /dev/null @@ -1,116 +0,0 @@ -package migrations - -import ( - "bytes" - "context" - "encoding/binary" - "strconv" - "testing" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestHeaderPrefix(t *testing.T) { - require := require.New(t) - db := memdb.NewTestDB(t) - - err := db.Update(context.Background(), func(tx kv.RwTx) error { - err := tx.CreateBucket(kv.HeaderPrefixOld) - if err != nil { - return err - } - for i := uint64(0); i < 10; i++ { - //header - err = tx.Put(kv.HeaderPrefixOld, dbutils.HeaderKey(i, common.Hash{uint8(i)}), []byte("header "+strconv.Itoa(int(i)))) - require.NoError(err) - //canonical - err = tx.Put(kv.HeaderPrefixOld, HeaderHashKey(i), common.Hash{uint8(i)}.Bytes()) - require.NoError(err) - err = tx.Put(kv.HeaderPrefixOld, append(dbutils.HeaderKey(i, common.Hash{uint8(i)}), HeaderTDSuffix...), []byte{uint8(i)}) - require.NoError(err) - } - return nil - }) - require.NoError(err) - - migrator := NewMigrator(kv.ChainDB) - migrator.Migrations = []Migration{headerPrefixToSeparateBuckets} - err = migrator.Apply(db, t.TempDir()) - require.NoError(err) - - num := 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.HeaderCanonical, []byte{}, func(k, v []byte) error { - require.Len(k, 8) - bytes.Equal(v, common.Hash{uint8(binary.BigEndian.Uint64(k))}.Bytes()) - num++ - return nil - }) - }) - require.NoError(err) - require.Equal(num, 10) - - num = 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.HeaderTD, []byte{}, func(k, v []byte) error { - require.Len(k, 40) - bytes.Equal(v, []byte{uint8(binary.BigEndian.Uint64(k))}) - num++ - return nil - }) - }) - require.NoError(err) - require.Equal(num, 10) - - num = 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.Headers, []byte{}, func(k, v []byte) error { - require.Len(k, 40) - bytes.Equal(v, []byte("header "+strconv.Itoa(int(binary.BigEndian.Uint64(k))))) - num++ - return nil - }) - }) - require.NoError(err) - require.Equal(num, 10) - -} - -func TestHeaderTypeDetection(t *testing.T) { - // good input - headerHashKey := common.Hex2Bytes("00000000000000006e") - assert.False(t, IsHeaderKey(headerHashKey)) - assert.False(t, IsHeaderTDKey(headerHashKey)) - assert.True(t, IsHeaderHashKey(headerHashKey)) - - headerKey := common.Hex2Bytes("0000000000004321ed7240d411782ae438adfd85f7edad373cea722318c6e7f5f5b30f9abc9b36fd") - assert.True(t, IsHeaderKey(headerKey)) - assert.False(t, IsHeaderTDKey(headerKey)) - assert.False(t, IsHeaderHashKey(headerKey)) - - headerTdKey := common.Hex2Bytes("0000000000004321ed7240d411782ae438adfd85f7edad373cea722318c6e7f5f5b30f9abc9b36fd74") - assert.False(t, IsHeaderKey(headerTdKey)) - assert.True(t, IsHeaderTDKey(headerTdKey)) - assert.False(t, IsHeaderHashKey(headerTdKey)) - - // bad input - emptyKey := common.Hex2Bytes("") - assert.False(t, IsHeaderKey(emptyKey)) - assert.False(t, IsHeaderTDKey(emptyKey)) - assert.False(t, IsHeaderHashKey(emptyKey)) - - tooLongKey := common.Hex2Bytes("0000000000004321ed7240d411782ae438adfd85f7edad373cea722318c6e7f5f5b30f9abc9b36fd0000000000004321ed7240d411782ae438adfd85f7edad373cea722318c6e7f5f5b30f9abc9b36fd0000000000004321ed7240d411782ae438adfd85f7edad373cea722318c6e7f5f5b30f9abc9b36fd0000000000004321ed7240d411782ae438adfd85f7edad373cea722318c6e7f5f5b30f9abc9b36fd") - assert.False(t, IsHeaderKey(tooLongKey)) - assert.False(t, IsHeaderTDKey(tooLongKey)) - assert.False(t, IsHeaderHashKey(tooLongKey)) - - notRelatedInput := common.Hex2Bytes("alex") - assert.False(t, IsHeaderKey(notRelatedInput)) - assert.False(t, IsHeaderTDKey(notRelatedInput)) - assert.False(t, IsHeaderHashKey(notRelatedInput)) -} diff --git a/migrations/migrations.go b/migrations/migrations.go index 356c7b4f1de..501805a4b66 100644 --- a/migrations/migrations.go +++ b/migrations/migrations.go @@ -5,7 +5,7 @@ import ( "context" "encoding/binary" "fmt" - "path" + "path/filepath" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" @@ -27,39 +27,12 @@ import ( // + SyncStageProgress = []byte("SSP2") // - in the beginning of migration: check that old bucket exists, clear new bucket // - in the end:drop old bucket (not in defer!). -// Example: -// Up: func(db ethdb.Database, tmpdir string, OnLoadCommit etl.LoadCommitHandler) error { -// if exists, err := db.(ethdb.BucketsMigrator).BucketExists(dbutils.SyncStageProgressOld1); err != nil { -// return err -// } else if !exists { -// return OnLoadCommit(db, nil, true) -// } -// -// if err := db.(ethdb.BucketsMigrator).ClearBuckets(dbutils.SyncStageProgress); err != nil { -// return err -// } -// -// extractFunc := func(k []byte, v []byte, next etl.ExtractNextFunc) error { -// ... // migration logic -// } -// if err := etl.Transform(...); err != nil { -// return err -// } -// -// if err := db.(ethdb.BucketsMigrator).DropBuckets(dbutils.SyncStageProgressOld1); err != nil { // clear old bucket -// return err -// } -// }, // - if you need migrate multiple buckets - create separate migration for each bucket -// - write test where apply migration twice +// - write test - and check that it's safe to apply same migration twice var migrations = map[kv.Label][]Migration{ kv.ChainDB: { - headerPrefixToSeparateBuckets, - removeCliqueBucket, - dbSchemaVersion, - rebuilCallTraceIndex, - fixSequences, - storageMode, + dbSchemaVersion5, + txsBeginEnd, }, kv.TxPoolDB: {}, kv.SentryDB: {}, @@ -73,7 +46,7 @@ type Migration struct { var ( ErrMigrationNonUniqueName = fmt.Errorf("please provide unique migration name") - ErrMigrationCommitNotCalled = fmt.Errorf("migration commit function was not called") + ErrMigrationCommitNotCalled = fmt.Errorf("migration before-commit function was not called") ErrMigrationETLFilesDeleted = fmt.Errorf("db migration progress was interrupted after extraction step and ETL files was deleted, please contact development team for help or re-sync from scratch") ) @@ -144,6 +117,40 @@ func (m *Migrator) PendingMigrations(tx kv.Tx) ([]Migration, error) { return pending, nil } +func (m *Migrator) VerifyVersion(db kv.RwDB) error { + if err := db.View(context.Background(), func(tx kv.Tx) error { + var err error + existingVersion, err := tx.GetOne(kv.DatabaseInfo, kv.DBSchemaVersionKey) + if err != nil { + return fmt.Errorf("reading DB schema version: %w", err) + } + if len(existingVersion) != 0 && len(existingVersion) != 12 { + return fmt.Errorf("incorrect length of DB schema version: %d", len(existingVersion)) + } + if len(existingVersion) == 12 { + major := binary.BigEndian.Uint32(existingVersion) + minor := binary.BigEndian.Uint32(existingVersion[4:]) + if major > kv.DBSchemaVersion.Major { + return fmt.Errorf("cannot downgrade major DB version from %d to %d", major, kv.DBSchemaVersion.Major) + } else if major == kv.DBSchemaVersion.Major { + if minor > kv.DBSchemaVersion.Minor { + return fmt.Errorf("cannot downgrade minor DB version from %d.%d to %d.%d", major, minor, kv.DBSchemaVersion.Major, kv.DBSchemaVersion.Major) + } + } else { + // major < kv.DBSchemaVersion.Major + if kv.DBSchemaVersion.Major-major > 1 { + return fmt.Errorf("cannot upgrade major DB version for more than 1 version from %d to %d, use integration tool if you know what you are doing", major, kv.DBSchemaVersion.Major) + } + } + } + return nil + }); err != nil { + return fmt.Errorf("migrator.VerifyVersion: %w", err) + } + + return nil +} + func (m *Migrator) Apply(db kv.RwDB, datadir string) error { if len(m.Migrations) == 0 { return nil @@ -153,10 +160,16 @@ func (m *Migrator) Apply(db kv.RwDB, datadir string) error { if err := db.View(context.Background(), func(tx kv.Tx) error { var err error applied, err = AppliedMigrations(tx, false) - return err + if err != nil { + return fmt.Errorf("reading applied migrations: %w", err) + } + return nil }); err != nil { return err } + if err := m.VerifyVersion(db); err != nil { + return fmt.Errorf("migrator.Apply: %w", err) + } // migration names must be unique, protection against people's mistake uniqueNameCheck := map[string]bool{} @@ -182,10 +195,10 @@ func (m *Migrator) Apply(db kv.RwDB, datadir string) error { progress, err = tx.GetOne(kv.Migrations, []byte("_progress_"+v.Name)) return err }); err != nil { - return err + return fmt.Errorf("migrator.Apply: %w", err) } - if err := v.Up(db, path.Join(datadir, "migrations", v.Name), progress, func(tx kv.RwTx, key []byte, isDone bool) error { + if err := v.Up(db, filepath.Join(datadir, "migrations", v.Name), progress, func(tx kv.RwTx, key []byte, isDone bool) error { if !isDone { if key != nil { if err := tx.Put(kv.Migrations, []byte("_progress_"+v.Name), key); err != nil { @@ -212,7 +225,7 @@ func (m *Migrator) Apply(db kv.RwDB, datadir string) error { return nil }); err != nil { - return err + return fmt.Errorf("migrator.Apply.Up: %s, %w", v.Name, err) } if !callbackCalled { @@ -231,7 +244,7 @@ func (m *Migrator) Apply(db kv.RwDB, datadir string) error { } return nil }); err != nil { - return err + return fmt.Errorf("migrator.Apply: %w", err) } log.Info("Updated DB schema to", "version", fmt.Sprintf("%d.%d.%d", kv.DBSchemaVersion.Major, kv.DBSchemaVersion.Minor, kv.DBSchemaVersion.Patch)) return nil diff --git a/migrations/prune.go b/migrations/prune.go deleted file mode 100644 index 9d00eda7411..00000000000 --- a/migrations/prune.go +++ /dev/null @@ -1,84 +0,0 @@ -package migrations - -import ( - "context" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common/math" - "github.com/ledgerwatch/erigon/ethdb/prune" - "github.com/ledgerwatch/erigon/params" -) - -var storageMode = Migration{ - Name: "storage_mode", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - var ( // old db keys - //StorageModeHistory - does node save history. - StorageModeHistory = []byte("smHistory") - //StorageModeReceipts - does node save receipts. - StorageModeReceipts = []byte("smReceipts") - //StorageModeTxIndex - does node save transactions index. - StorageModeTxIndex = []byte("smTxIndex") - //StorageModeCallTraces - does not build index of call traces - StorageModeCallTraces = []byte("smCallTraces") - ) - pm := prune.Mode{Initialised: true} - castToPruneDistance := func(v []byte) prune.Distance { - if len(v) == 1 && v[0] == 2 { - return params.FullImmutabilityThreshold // means, prune enabled - } - return math.MaxUint64 // means, prune disabled - } - { - v, err := tx.GetOne(kv.DatabaseInfo, StorageModeHistory) - if err != nil { - return err - } - pm.History = castToPruneDistance(v) - - } - { - v, err := tx.GetOne(kv.DatabaseInfo, StorageModeReceipts) - if err != nil { - return err - } - pm.Receipts = castToPruneDistance(v) - } - { - v, err := tx.GetOne(kv.DatabaseInfo, StorageModeTxIndex) - if err != nil { - return err - } - pm.TxIndex = castToPruneDistance(v) - } - { - v, err := tx.GetOne(kv.DatabaseInfo, StorageModeCallTraces) - if err != nil { - return err - } - pm.CallTraces = castToPruneDistance(v) - } - { - v, err := tx.GetOne(kv.DatabaseInfo, kv.StorageModeTEVM) - if err != nil { - return err - } - pm.Experiments.TEVM = len(v) == 1 && v[0] == 1 - } - - err = prune.SetIfNotExist(tx, pm) - if err != nil { - return err - } - - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} diff --git a/migrations/receipt_cbor.go b/migrations/receipt_cbor.go deleted file mode 100644 index 5982016085e..00000000000 --- a/migrations/receipt_cbor.go +++ /dev/null @@ -1,409 +0,0 @@ -package migrations - -import ( - "bytes" - "context" - "encoding/binary" - "errors" - pkg2_big "math/big" - "runtime" - "strconv" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/ethdb/cbor" - "github.com/ledgerwatch/log/v3" - - pkg1_common "github.com/ledgerwatch/erigon/common" - codec1978 "github.com/ugorji/go/codec" -) - -// OldReceipt is receipt structure before introduction of Type field -// to be able to read old records -type OldReceipt struct { - // Consensus fields: These fields are defined by the Yellow Paper - PostState []byte `json:"root" codec:"1"` - Status uint64 `json:"status" codec:"2"` - CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required" codec:"3"` -} - -type OldReceipts []*OldReceipt - -var ReceiptCbor = Migration{ - Name: "receipt_cbor", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - genesisBlock, err := rawdb.ReadBlockByNumber(tx, 0) - if err != nil { - return err - } - if genesisBlock == nil { - // Empty database check - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - } - chainConfig, cerr := rawdb.ReadChainConfig(tx, genesisBlock.Hash()) - if cerr != nil { - return cerr - } - logInterval := 30 * time.Second - logEvery := time.NewTicker(logInterval) - defer logEvery.Stop() - var buf bytes.Buffer - var key [8]byte - var v []byte - var to uint64 - if to, err = stages.GetStageProgress(tx, stages.Execution); err != nil { - return err - } - for blockNum := uint64(1); blockNum <= to; blockNum++ { - binary.BigEndian.PutUint64(key[:], blockNum) - if v, err = tx.GetOne(kv.Receipts, key[:]); err != nil { - return err - } - if v == nil { - continue - } - select { - default: - case <-logEvery.C: - log.Info("Scanned receipts up to", "block", blockNum) - } - var receipts types.Receipts - var oldReceipts OldReceipts - if err = cbor.Unmarshal(&oldReceipts, bytes.NewReader(v)); err != nil { - continue - } - - var blockHash common.Hash - if blockHash, err = rawdb.ReadCanonicalHash(tx, blockNum); err != nil { - return err - } - var body *types.Body - if chainConfig.IsBerlin(blockNum) { - body = rawdb.ReadBody(tx, blockHash, blockNum) - } - receipts = make(types.Receipts, len(oldReceipts)) - for i, oldReceipt := range oldReceipts { - receipts[i] = new(types.Receipt) - receipts[i].PostState = oldReceipt.PostState - receipts[i].Status = oldReceipt.Status - receipts[i].CumulativeGasUsed = oldReceipt.CumulativeGasUsed - if body != nil { - receipts[i].Type = body.Transactions[i].Type() - } - } - buf.Reset() - if err = cbor.Marshal(&buf, receipts); err != nil { - return err - } - if err = tx.Put(kv.Receipts, common.CopyBytes(key[:]), common.CopyBytes(buf.Bytes())); err != nil { - return err - } - } - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} - -const ( - // ----- value types used ---- - codecSelferValueTypeArray2 = 10 - codecSelferValueTypeMap2 = 9 - codecSelferValueTypeNil2 = 1 -) - -var ( - errCodecSelferOnlyMapOrArrayEncodeToStruct2 = errors.New(`only encoded map or array can be decoded into a struct`) -) - -type codecSelfer2 struct{} - -func init() { - if codec1978.GenVersion != 19 { - _, file, _, _ := runtime.Caller(0) - ver := strconv.FormatInt(int64(codec1978.GenVersion), 10) - panic(errors.New("codecgen version mismatch: current: 19, need " + ver + ". Re-generate file: " + file)) - } - if false { // reference the types, but skip this branch at build/run time - var _ pkg1_common.Address - var _ pkg2_big.Int - } -} - -func (x *OldReceipt) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - yy2arr2 := z.EncBasicHandle().StructToArray - _ = yy2arr2 - z.EncWriteArrayStart(3) - z.EncWriteArrayElem() - if x.PostState == nil { - r.EncodeNil() - } else { - r.EncodeStringBytesRaw([]byte(x.PostState)) - } // end block: if x.PostState slice == nil - z.EncWriteArrayElem() - r.EncodeUint(uint64(x.Status)) - z.EncWriteArrayElem() - r.EncodeUint(uint64(x.CumulativeGasUsed)) - z.EncWriteArrayEnd() - } -} - -func (x *OldReceipt) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - yyct2 := r.ContainerType() - if yyct2 == codecSelferValueTypeNil2 { - *(x) = OldReceipt{} - } else if yyct2 == codecSelferValueTypeMap2 { - yyl2 := z.DecReadMapStart() - if yyl2 == 0 { - } else { - x.codecDecodeSelfFromMap(yyl2, d) - } - z.DecReadMapEnd() - } else if yyct2 == codecSelferValueTypeArray2 { - yyl2 := z.DecReadArrayStart() - if yyl2 != 0 { - x.codecDecodeSelfFromArray(yyl2, d) - } - z.DecReadArrayEnd() - } else { - panic(errCodecSelferOnlyMapOrArrayEncodeToStruct2) - } -} - -func (x *OldReceipt) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyhl3 bool = l >= 0 - for yyj3 := 0; ; yyj3++ { - if yyhl3 { - if yyj3 >= l { - break - } - } else { - if z.DecCheckBreak() { - break - } - } - z.DecReadMapElemKey() - yys3 := z.StringView(r.DecodeStringAsBytes()) - z.DecReadMapElemValue() - switch yys3 { - case "1": - x.PostState = r.DecodeBytes(([]byte)(x.PostState), false) - case "2": - x.Status = (uint64)(r.DecodeUint64()) - case "3": - x.CumulativeGasUsed = (uint64)(r.DecodeUint64()) - default: - z.DecStructFieldNotFound(-1, yys3) - } // end switch yys3 - } // end for yyj3 -} - -func (x *OldReceipt) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = z.DecCheckBreak() - } - if yyb8 { - z.DecReadArrayEnd() - return - } - z.DecReadArrayElem() - x.PostState = r.DecodeBytes(([]byte)(x.PostState), false) - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = z.DecCheckBreak() - } - if yyb8 { - z.DecReadArrayEnd() - return - } - z.DecReadArrayElem() - x.Status = (uint64)(r.DecodeUint64()) - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = z.DecCheckBreak() - } - if yyb8 { - z.DecReadArrayEnd() - return - } - z.DecReadArrayElem() - x.CumulativeGasUsed = (uint64)(r.DecodeUint64()) - for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l - } else { - yyb8 = z.DecCheckBreak() - } - if yyb8 { - break - } - z.DecReadArrayElem() - z.DecStructFieldNotFound(yyj8-1, "") - } -} - -func (x *OldReceipt) IsCodecEmpty() bool { - return !(len(x.PostState) != 0 && x.Status != 0 && x.CumulativeGasUsed != 0 && true) -} - -func (x OldReceipts) CodecEncodeSelf(e *codec1978.Encoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if x == nil { - r.EncodeNil() - } else { - h.encReceipts((OldReceipts)(x), e) - } // end block: if x slice == nil -} - -func (x *OldReceipts) CodecDecodeSelf(d *codec1978.Decoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - h.decReceipts((*OldReceipts)(x), d) -} - -func (x codecSelfer2) encReceipts(v OldReceipts, e *codec1978.Encoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperEncoder(e) - _, _, _ = h, z, r - if v == nil { - r.EncodeNil() - return - } - z.EncWriteArrayStart(len(v)) - for _, yyv1 := range v { - z.EncWriteArrayElem() - if yyv1 == nil { - r.EncodeNil() - } else { - yyv1.CodecEncodeSelf(e) - } - } - z.EncWriteArrayEnd() -} - -func (x codecSelfer2) decReceipts(v *OldReceipts, d *codec1978.Decoder) { - var h codecSelfer2 - z, r := codec1978.GenHelperDecoder(d) - _, _, _ = h, z, r - - yyv1 := *v - yyh1, yyl1 := z.DecSliceHelperStart() - var yyc1 bool - _ = yyc1 - if yyh1.IsNil { - if yyv1 != nil { - yyv1 = nil - yyc1 = true - } - } else if yyl1 == 0 { - if yyv1 == nil { - yyv1 = []*OldReceipt{} - yyc1 = true - } else if len(yyv1) != 0 { - yyv1 = yyv1[:0] - yyc1 = true - } - } else { - yyhl1 := yyl1 > 0 - var yyrl1 int - _ = yyrl1 - if yyhl1 { - if yyl1 > cap(yyv1) { - yyrl1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 8) - if yyrl1 <= cap(yyv1) { - yyv1 = yyv1[:yyrl1] - } else { - yyv1 = make([]*OldReceipt, yyrl1) - } - yyc1 = true - } else if yyl1 != len(yyv1) { - yyv1 = yyv1[:yyl1] - yyc1 = true - } - } - var yyj1 int - for yyj1 = 0; (yyhl1 && yyj1 < yyl1) || !(yyhl1 || z.DecCheckBreak()); yyj1++ { // bounds-check-elimination - if yyj1 == 0 && yyv1 == nil { - if yyhl1 { - yyrl1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 8) - } else { - yyrl1 = 8 - } - yyv1 = make([]*OldReceipt, yyrl1) - yyc1 = true - } - yyh1.ElemContainerState(yyj1) - var yydb1 bool - if yyj1 >= len(yyv1) { - yyv1 = append(yyv1, nil) - yyc1 = true - } - if yydb1 { - z.DecSwallow() - } else { - if r.TryNil() { - yyv1[yyj1] = nil - } else { - if yyv1[yyj1] == nil { - yyv1[yyj1] = new(OldReceipt) - } - yyv1[yyj1].CodecDecodeSelf(d) - } - } - } - if yyj1 < len(yyv1) { - yyv1 = yyv1[:yyj1] - yyc1 = true - } else if yyj1 == 0 && yyv1 == nil { - yyv1 = make([]*OldReceipt, 0) - yyc1 = true - } - } - yyh1.End() - if yyc1 { - *v = yyv1 - } -} diff --git a/migrations/receipt_repair.go b/migrations/receipt_repair.go deleted file mode 100644 index 41cc0684a5a..00000000000 --- a/migrations/receipt_repair.go +++ /dev/null @@ -1,181 +0,0 @@ -package migrations - -import ( - "bytes" - "context" - "encoding/binary" - "fmt" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/changeset" - "github.com/ledgerwatch/erigon/consensus/ethash" - "github.com/ledgerwatch/erigon/consensus/misc" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/ethdb/cbor" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" -) - -func availableReceiptFrom(tx kv.Tx) (uint64, error) { - c, err := tx.Cursor(kv.Receipts) - if err != nil { - return 0, err - } - defer c.Close() - k, _, err := c.First() - if err != nil { - return 0, err - } - if len(k) == 0 { - return 0, nil - } - return binary.BigEndian.Uint64(k), nil -} - -var ReceiptRepair = Migration{ - Name: "receipt_repair", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - blockNum, err := changeset.AvailableFrom(tx) - if err != nil { - return err - } - receiptsFrom, err := availableReceiptFrom(tx) - if err != nil { - return err - } - if receiptsFrom > blockNum { - blockNum = receiptsFrom - } - - genesisBlock, err := rawdb.ReadBlockByNumber(tx, 0) - if err != nil { - return err - } - chainConfig, cerr := rawdb.ReadChainConfig(tx, genesisBlock.Hash()) - if cerr != nil { - return cerr - } - vmConfig := vm.Config{} - noOpWriter := state.NewNoopWriter() - var buf bytes.Buffer - fixedCount := 0 - logInterval := 30 * time.Second - logEvery := time.NewTicker(logInterval) - var key [8]byte - var v []byte - for ; true; blockNum++ { - select { - default: - case <-logEvery.C: - log.Info("Progress", "block", blockNum, "fixed", fixedCount) - } - var hash common.Hash - if hash, err = rawdb.ReadCanonicalHash(tx, blockNum); err != nil { - return err - } - if hash == (common.Hash{}) { - break - } - binary.BigEndian.PutUint64(key[:], blockNum) - if v, err = tx.GetOne(kv.Receipts, key[:]); err != nil { - return err - } - var receipts types.Receipts - if err = cbor.Unmarshal(&receipts, bytes.NewReader(v)); err == nil { - broken := false - for _, receipt := range receipts { - if receipt.CumulativeGasUsed < 10000 { - broken = true - break - } - } - if !broken { - continue - } - } - var block *types.Block - if block, _, err = rawdb.ReadBlockWithSenders(tx, hash, blockNum); err != nil { - return err - } - - dbstate := state.NewPlainState(tx, block.NumberU64()-1) - intraBlockState := state.New(dbstate) - - getHeader := func(hash common.Hash, number uint64) *types.Header { return rawdb.ReadHeader(tx, hash, number) } - receipts1, err1 := runBlock(intraBlockState, noOpWriter, noOpWriter, chainConfig, getHeader, nil /* checkTEVM */, block, vmConfig) - if err1 != nil { - return err1 - } - fix := true - if chainConfig.IsByzantium(block.Number().Uint64()) { - receiptSha := types.DeriveSha(receipts1) - if receiptSha != block.Header().ReceiptHash { - fmt.Printf("(retrace) mismatched receipt headers for block %d: %x, %x\n", block.NumberU64(), receiptSha, block.Header().ReceiptHash) - fix = false - } - } - if fix { - // All good, we can fix receipt record - buf.Reset() - err := cbor.Marshal(&buf, receipts1) - if err != nil { - return fmt.Errorf("encode block receipts for block %d: %v", blockNum, err) - } - if err = tx.Put(kv.Receipts, key[:], buf.Bytes()); err != nil { - return fmt.Errorf("writing receipts for block %d: %v", blockNum, err) - } - fixedCount++ - } - } - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} - -func runBlock(ibs *state.IntraBlockState, txnWriter state.StateWriter, blockWriter state.StateWriter, - chainConfig *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), block *types.Block, vmConfig vm.Config) (types.Receipts, error) { - header := block.Header() - vmConfig.TraceJumpDest = true - engine := ethash.NewFullFaker() - gp := new(core.GasPool).AddGas(block.GasLimit()) - usedGas := new(uint64) - var receipts types.Receipts - if chainConfig.DAOForkSupport && chainConfig.DAOForkBlock != nil && chainConfig.DAOForkBlock.Cmp(block.Number()) == 0 { - misc.ApplyDAOHardFork(ibs) - } - for i, tx := range block.Transactions() { - ibs.Prepare(tx.Hash(), block.Hash(), i) - receipt, _, err := core.ApplyTransaction(chainConfig, getHeader, engine, nil, gp, ibs, txnWriter, header, tx, usedGas, vmConfig, checkTEVM) - if err != nil { - return nil, fmt.Errorf("could not apply tx %d [%x] failed: %v", i, tx.Hash(), err) - } - receipts = append(receipts, receipt) - } - - if !vmConfig.ReadOnly { - // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) - if _, err := engine.FinalizeAndAssemble(chainConfig, header, ibs, block.Transactions(), block.Uncles(), receipts, nil, nil, nil, nil); err != nil { - return nil, fmt.Errorf("finalize of block %d failed: %v", block.NumberU64(), err) - } - - if err := ibs.CommitBlock(chainConfig.Rules(header.Number.Uint64()), blockWriter); err != nil { - return nil, fmt.Errorf("committing block %d failed: %v", block.NumberU64(), err) - } - } - - return receipts, nil -} diff --git a/migrations/remove_clique.go b/migrations/remove_clique.go deleted file mode 100644 index 2675c112cf9..00000000000 --- a/migrations/remove_clique.go +++ /dev/null @@ -1,36 +0,0 @@ -package migrations - -import ( - "context" - - "github.com/ledgerwatch/erigon-lib/kv" -) - -var removeCliqueBucket = Migration{ - Name: "remove_clique_bucket", - Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { - tx, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - if exists, err := tx.ExistsBucket(kv.Clique); err != nil { - return err - } else if !exists { - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - } - - if err := tx.DropBucket(kv.Clique); err != nil { - return err - } - - if err := BeforeCommit(tx, nil, true); err != nil { - return err - } - return tx.Commit() - }, -} diff --git a/migrations/txs_begin_end.go b/migrations/txs_begin_end.go new file mode 100644 index 00000000000..c90a71b4fa4 --- /dev/null +++ b/migrations/txs_begin_end.go @@ -0,0 +1,354 @@ +package migrations + +import ( + "bytes" + "context" + "encoding/binary" + "fmt" + "runtime" + "time" + + common2 "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/log/v3" +) + +const ASSERT = false + +var ErrTxsBeginEndNoMigration = fmt.Errorf("in this Erigon version DB format was changed: added additional first/last system-txs to blocks. There is no DB migration for this change. Please re-sync or switch to earlier version") + +var txsBeginEnd = Migration{ + Name: "txs_begin_end", + Up: func(db kv.RwDB, tmpdir string, progress []byte, BeforeCommit Callback) (err error) { + logEvery := time.NewTicker(10 * time.Second) + defer logEvery.Stop() + + var latestBlock uint64 + if err := db.View(context.Background(), func(tx kv.Tx) error { + bodiesProgress, err := stages.GetStageProgress(tx, stages.Bodies) + if err != nil { + return err + } + if progress != nil { + latestBlock = binary.BigEndian.Uint64(progress) + log.Info("[database version migration] Continue migration", "from_block", latestBlock) + } else { + latestBlock = bodiesProgress + 1 // include block 0 + } + return nil + }); err != nil { + return err + } + + tx, err := db.BeginRw(context.Background()) + if err != nil { + return err + } + defer tx.Rollback() + + numBuf := make([]byte, 8) + numHashBuf := make([]byte, 8+32) + for i := int(latestBlock); i >= 0; i-- { + blockNum := uint64(i) + + select { + case <-logEvery.C: + var m runtime.MemStats + common2.ReadMemStats(&m) + log.Info("[database version migration] Adding system-txs", + "progress", fmt.Sprintf("%.2f%%", 100-100*float64(blockNum)/float64(latestBlock)), "block_num", blockNum, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys)) + default: + } + + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockNum) + if err != nil { + return err + } + + var oldBlock *types.Body + if ASSERT { + oldBlock = readCanonicalBodyWithTransactionsDeprecated(tx, canonicalHash, blockNum) + } + + binary.BigEndian.PutUint64(numHashBuf[:8], blockNum) + copy(numHashBuf[8:], canonicalHash[:]) + b, err := rawdb.ReadBodyForStorageByKey(tx, numHashBuf) + if err != nil { + return err + } + if b == nil { + continue + } + + txs, err := rawdb.CanonicalTransactions(tx, b.BaseTxId, b.TxAmount) + if err != nil { + return err + } + + b.BaseTxId += (blockNum) * 2 + b.TxAmount += 2 + if err := rawdb.WriteBodyForStorage(tx, canonicalHash, blockNum, b); err != nil { + return fmt.Errorf("failed to write body: %w", err) + } + + // del first tx in block + if err = tx.Delete(kv.EthTx, dbutils.EncodeBlockNumber(b.BaseTxId), nil); err != nil { + return err + } + if err := writeTransactionsNewDeprecated(tx, txs, b.BaseTxId+1); err != nil { + return fmt.Errorf("failed to write body txs: %w", err) + } + // del last tx in block + if err = tx.Delete(kv.EthTx, dbutils.EncodeBlockNumber(b.BaseTxId+uint64(b.TxAmount)-1), nil); err != nil { + return err + } + + if ASSERT { + newBlock, baseTxId, txAmount := rawdb.ReadBody(tx, canonicalHash, blockNum) + newBlock.Transactions, err = rawdb.CanonicalTransactions(tx, baseTxId, txAmount) + for i, oldTx := range oldBlock.Transactions { + newTx := newBlock.Transactions[i] + if oldTx.GetNonce() != newTx.GetNonce() { + panic(blockNum) + } + } + } + + if err = tx.ForPrefix(kv.BlockBody, numHashBuf[:8], func(k, v []byte) error { + if bytes.Equal(k, numHashBuf) { // don't delete canonical blocks + return nil + } + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(v, bodyForStorage); err != nil { + return err + } + + for i := bodyForStorage.BaseTxId; i < bodyForStorage.BaseTxId+uint64(bodyForStorage.TxAmount); i++ { + binary.BigEndian.PutUint64(numBuf, i) + if err = tx.Delete(kv.NonCanonicalTxs, numBuf, nil); err != nil { + return err + } + } + + if err = tx.Delete(kv.BlockBody, k, nil); err != nil { + return err + } + if err = tx.Delete(kv.Headers, k, nil); err != nil { + return err + } + if err = tx.Delete(kv.HeaderTD, k, nil); err != nil { + return err + } + if err = tx.Delete(kv.HeaderNumber, k[8:], nil); err != nil { + return err + } + if err = tx.Delete(kv.HeaderNumber, k[8:], nil); err != nil { + return err + } + + return nil + }); err != nil { + return err + } + + binary.BigEndian.PutUint64(numBuf, blockNum) + if err := BeforeCommit(tx, numBuf, false); err != nil { + return err + } + if blockNum%10_000 == 0 { + if err := tx.Commit(); err != nil { + return err + } + tx, err = db.BeginRw(context.Background()) + if err != nil { + return err + } + } + } + + if err := tx.Commit(); err != nil { + return err + } + + return db.Update(context.Background(), func(tx kv.RwTx) error { + // reset non-canonical sequence to 0 + v, err := tx.ReadSequence(kv.NonCanonicalTxs) + if err != nil { + return err + } + if _, err := tx.IncrementSequence(kv.NonCanonicalTxs, -v); err != nil { + return err + } + + { + c, err := tx.Cursor(kv.HeaderCanonical) + if err != nil { + return err + } + k, v, err := c.Last() + if err != nil { + return err + } + data, err := tx.GetOne(kv.BlockBody, append(k, v...)) + if err != nil { + return err + } + var newSeqValue uint64 + if len(data) > 0 { + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(data, bodyForStorage); err != nil { + return fmt.Errorf("rlp.DecodeBytes(bodyForStorage): %w", err) + } + currentSeq, err := tx.ReadSequence(kv.EthTx) + if err != nil { + return err + } + newSeqValue = bodyForStorage.BaseTxId + uint64(bodyForStorage.TxAmount) - currentSeq + } + + if _, err := tx.IncrementSequence(kv.EthTx, newSeqValue); err != nil { + return err + } + } + + // This migration is no-op, but it forces the migration mechanism to apply it and thus write the DB schema version info + return BeforeCommit(tx, nil, true) + }) + }, +} + +func writeRawBodyDeprecated(db kv.RwTx, hash common.Hash, number uint64, body *types.RawBody) error { + baseTxId, err := db.IncrementSequence(kv.EthTx, uint64(len(body.Transactions))) + if err != nil { + return err + } + data := types.BodyForStorage{ + BaseTxId: baseTxId, + TxAmount: uint32(len(body.Transactions)), + Uncles: body.Uncles, + } + if err = rawdb.WriteBodyForStorage(db, hash, number, &data); err != nil { + return fmt.Errorf("failed to write body: %w", err) + } + if err = rawdb.WriteRawTransactions(db, body.Transactions, baseTxId); err != nil { + return fmt.Errorf("failed to WriteRawTransactions: %w, blockNum=%d", err, number) + } + return nil +} +func writeTransactionsNewDeprecated(db kv.RwTx, txs []types.Transaction, baseTxId uint64) error { + txId := baseTxId + buf := bytes.NewBuffer(nil) + for _, tx := range txs { + txIdKey := make([]byte, 8) + binary.BigEndian.PutUint64(txIdKey, txId) + + buf.Reset() + if err := rlp.Encode(buf, tx); err != nil { + return fmt.Errorf("broken tx rlp: %w", err) + } + // If next Append returns KeyExists error - it means you need to open transaction in App code before calling this func. Batch is also fine. + if err := db.Put(kv.EthTx, txIdKey, common.CopyBytes(buf.Bytes())); err != nil { + return err + } + txId++ + } + return nil +} + +func readCanonicalBodyWithTransactionsDeprecated(db kv.Getter, hash common.Hash, number uint64) *types.Body { + data := rawdb.ReadStorageBodyRLP(db, hash, number) + if len(data) == 0 { + return nil + } + bodyForStorage := new(types.BodyForStorage) + err := rlp.DecodeBytes(data, bodyForStorage) + if err != nil { + log.Error("Invalid block body RLP", "hash", hash, "err", err) + return nil + } + body := new(types.Body) + body.Uncles = bodyForStorage.Uncles + body.Transactions, err = rawdb.CanonicalTransactions(db, bodyForStorage.BaseTxId, bodyForStorage.TxAmount) + if err != nil { + log.Error("failed ReadTransactionByHash", "hash", hash, "block", number, "err", err) + return nil + } + return body +} + +func makeBodiesNonCanonicalDeprecated(tx kv.RwTx, from uint64, ctx context.Context, logPrefix string, logEvery *time.Ticker) error { + for blockNum := from; ; blockNum++ { + h, err := rawdb.ReadCanonicalHash(tx, blockNum) + if err != nil { + return err + } + if h == (common.Hash{}) { + break + } + data := rawdb.ReadStorageBodyRLP(tx, h, blockNum) + if len(data) == 0 { + break + } + + bodyForStorage := new(types.BodyForStorage) + if err := rlp.DecodeBytes(data, bodyForStorage); err != nil { + return err + } + + // move txs to NonCanonical bucket, it has own sequence + newBaseId, err := tx.IncrementSequence(kv.NonCanonicalTxs, uint64(bodyForStorage.TxAmount)) + if err != nil { + return err + } + id := newBaseId + if err := tx.ForAmount(kv.EthTx, dbutils.EncodeBlockNumber(bodyForStorage.BaseTxId), bodyForStorage.TxAmount, func(k, v []byte) error { + if err := tx.Put(kv.NonCanonicalTxs, dbutils.EncodeBlockNumber(id), v); err != nil { + return err + } + id++ + return tx.Delete(kv.EthTx, k, nil) + }); err != nil { + return err + } + + bodyForStorage.BaseTxId = newBaseId + if err := rawdb.WriteBodyForStorage(tx, h, blockNum, bodyForStorage); err != nil { + return err + } + + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Unwinding transactions...", logPrefix), "current block", blockNum) + default: + } + } + + // EthTx must have canonical id's - means need decrement it's sequence on unwind + c, err := tx.Cursor(kv.EthTx) + if err != nil { + return err + } + defer c.Close() + k, _, err := c.Last() + if err != nil { + return err + } + var nextTxID uint64 + if k != nil { + nextTxID = binary.BigEndian.Uint64(k) + 1 + } + if err := rawdb.ResetSequence(tx, kv.EthTx, nextTxID); err != nil { + return err + } + + return nil +} diff --git a/migrations/txs_begin_end_test.go b/migrations/txs_begin_end_test.go new file mode 100644 index 00000000000..148c4bcc4ae --- /dev/null +++ b/migrations/txs_begin_end_test.go @@ -0,0 +1,103 @@ +package migrations + +import ( + "bytes" + "context" + "encoding/binary" + "testing" + "time" + + "github.com/ledgerwatch/erigon-lib/common/u256" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/memdb" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/stretchr/testify/require" +) + +func TestTxsBeginEnd(t *testing.T) { + require, tmpDir, db := require.New(t), t.TempDir(), memdb.NewTestDB(t) + txn := &types.DynamicFeeTransaction{Tip: u256.N1, FeeCap: u256.N1, CommonTx: types.CommonTx{ChainID: u256.N1, Value: u256.N1, Gas: 1, Nonce: 1}} + buf := bytes.NewBuffer(nil) + err := txn.MarshalBinary(buf) + require.NoError(err) + rlpTxn := buf.Bytes() + logEvery := time.NewTicker(10 * time.Second) + defer logEvery.Stop() + + b := &types.RawBody{Transactions: [][]byte{rlpTxn, rlpTxn, rlpTxn}} + err = db.Update(context.Background(), func(tx kv.RwTx) error { + for i := uint64(0); i < 10; i++ { + hash := common.Hash{byte(i)} + err = writeRawBodyDeprecated(tx, hash, i, b) + require.NoError(err) + err = rawdb.WriteCanonicalHash(tx, hash, i) + require.NoError(err) + } + if err := makeBodiesNonCanonicalDeprecated(tx, 7, context.Background(), "", logEvery); err != nil { + return err + } + + err = rawdb.TruncateCanonicalHash(tx, 7) + for i := uint64(7); i < 10; i++ { + require.NoError(err) + hash := common.Hash{0xa, byte(i)} + err = writeRawBodyDeprecated(tx, hash, i, b) + require.NoError(err) + err = rawdb.WriteCanonicalHash(tx, hash, i) + require.NoError(err) + } + if err := stages.SaveStageProgress(tx, stages.Bodies, 9); err != nil { + return err + } + return nil + }) + require.NoError(err) + + migrator := NewMigrator(kv.ChainDB) + migrator.Migrations = []Migration{txsBeginEnd} + err = migrator.Apply(db, tmpDir) + require.NoError(err) + + err = db.View(context.Background(), func(tx kv.Tx) error { + v, err := tx.ReadSequence(kv.EthTx) + require.NoError(err) + require.Equal(uint64(3*10+2*10), v) + return nil + }) + require.NoError(err) + + err = db.View(context.Background(), func(tx kv.Tx) error { + for i := uint64(7); i < 10; i++ { + hash := common.Hash{byte(i)} + k := make([]byte, 8+32) + binary.BigEndian.PutUint64(k, 7) + copy(k[8:], hash[:]) + + has, err := tx.Has(kv.BlockBody, k) + require.NoError(err) + require.False(has) + } + + c, err := tx.Cursor(kv.NonCanonicalTxs) + require.NoError(err) + cnt, err := c.Count() + require.NoError(err) + require.Zero(cnt) + + v, err := tx.ReadSequence(kv.NonCanonicalTxs) + require.NoError(err) + require.Zero(v) + + has, err := tx.Has(kv.EthTx, dbutils.EncodeBlockNumber(0)) + require.NoError(err) + require.False(has) + + return nil + }) + require.NoError(err) + +} diff --git a/node/api.go b/node/api.go index 46241c8abee..cefa9f59963 100644 --- a/node/api.go +++ b/node/api.go @@ -25,6 +25,7 @@ import ( "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/node/nodecfg" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/rpc" @@ -72,7 +73,7 @@ func (api *privateAdminAPI) AddPeer(url string) (bool, error) { // Try to add the url as a static peer and return node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { - return false, fmt.Errorf("invalid enode: %v", err) + return false, fmt.Errorf("invalid enode: %w", err) } server.AddPeer(node) return true, nil @@ -88,7 +89,7 @@ func (api *privateAdminAPI) RemovePeer(url string) (bool, error) { // Try to remove the url as a static peer and return node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { - return false, fmt.Errorf("invalid enode: %v", err) + return false, fmt.Errorf("invalid enode: %w", err) } server.RemovePeer(node) return true, nil @@ -103,7 +104,7 @@ func (api *privateAdminAPI) AddTrustedPeer(url string) (bool, error) { } node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { - return false, fmt.Errorf("invalid enode: %v", err) + return false, fmt.Errorf("invalid enode: %w", err) } server.AddTrustedPeer(node) return true, nil @@ -119,7 +120,7 @@ func (api *privateAdminAPI) RemoveTrustedPeer(url string) (bool, error) { } node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { - return false, fmt.Errorf("invalid enode: %v", err) + return false, fmt.Errorf("invalid enode: %w", err) } server.RemoveTrustedPeer(node) return true, nil @@ -171,7 +172,7 @@ func (api *privateAdminAPI) StartRPC(host *string, port *int, cors *string, apis // Determine host and port. if host == nil { - h := DefaultHTTPHost + h := nodecfg.DefaultHTTPHost if api.node.config.HTTPHost != "" { h = api.node.config.HTTPHost } @@ -231,7 +232,7 @@ func (api *privateAdminAPI) StartWS(host *string, port *int, allowedOrigins *str // Determine host and port. if host == nil { - h := DefaultWSHost + h := nodecfg.DefaultWSHost if api.node.config.WSHost != "" { h = api.node.config.WSHost } diff --git a/node/api_test.go b/node/api_test.go index ec04b027352..99ccc2e9fa9 100644 --- a/node/api_test.go +++ b/node/api_test.go @@ -26,6 +26,7 @@ import ( "strings" "testing" + "github.com/ledgerwatch/erigon/node/nodecfg" "github.com/ledgerwatch/erigon/rpc" "github.com/stretchr/testify/assert" ) @@ -38,7 +39,7 @@ func TestStartRPC(t *testing.T) { } type test struct { name string - cfg Config + cfg nodecfg.Config fn func(*testing.T, *Node, *privateAdminAPI) // Checks. These run after the node is configured and all API calls have been made. @@ -51,7 +52,7 @@ func TestStartRPC(t *testing.T) { tests := []test{ { name: "all off", - cfg: Config{}, + cfg: nodecfg.Config{}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { }, wantReachable: false, @@ -61,7 +62,7 @@ func TestStartRPC(t *testing.T) { }, { name: "rpc enabled through config", - cfg: Config{HTTPHost: "127.0.0.1"}, + cfg: nodecfg.Config{HTTPHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { }, wantReachable: true, @@ -71,7 +72,7 @@ func TestStartRPC(t *testing.T) { }, { name: "rpc enabled through API", - cfg: Config{}, + cfg: nodecfg.Config{}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { _, err := api.StartRPC(sp("127.0.0.1"), ip(0), nil, nil, nil) assert.NoError(t, err) @@ -83,7 +84,7 @@ func TestStartRPC(t *testing.T) { }, { name: "rpc start again after failure", - cfg: Config{}, + cfg: nodecfg.Config{}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { // Listen on a random port. listener, err := net.Listen("tcp", "127.0.0.1:0") @@ -111,7 +112,7 @@ func TestStartRPC(t *testing.T) { }, { name: "rpc stopped through API", - cfg: Config{HTTPHost: "127.0.0.1"}, + cfg: nodecfg.Config{HTTPHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { _, err := api.StopRPC() assert.NoError(t, err) @@ -123,7 +124,7 @@ func TestStartRPC(t *testing.T) { }, { name: "rpc stopped twice", - cfg: Config{HTTPHost: "127.0.0.1"}, + cfg: nodecfg.Config{HTTPHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { _, err := api.StopRPC() assert.NoError(t, err) @@ -138,7 +139,7 @@ func TestStartRPC(t *testing.T) { }, { name: "ws enabled through config", - cfg: Config{WSHost: "127.0.0.1"}, + cfg: nodecfg.Config{WSHost: "127.0.0.1"}, wantReachable: true, wantHandlers: false, wantRPC: false, @@ -146,7 +147,7 @@ func TestStartRPC(t *testing.T) { }, { name: "ws enabled through API", - cfg: Config{}, + cfg: nodecfg.Config{}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { _, err := api.StartWS(sp("127.0.0.1"), ip(0), nil, nil) assert.NoError(t, err) @@ -158,7 +159,7 @@ func TestStartRPC(t *testing.T) { }, { name: "ws stopped through API", - cfg: Config{WSHost: "127.0.0.1"}, + cfg: nodecfg.Config{WSHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { _, err := api.StopWS() assert.NoError(t, err) @@ -170,7 +171,7 @@ func TestStartRPC(t *testing.T) { }, { name: "ws stopped twice", - cfg: Config{WSHost: "127.0.0.1"}, + cfg: nodecfg.Config{WSHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { _, err := api.StopWS() assert.NoError(t, err) @@ -185,7 +186,7 @@ func TestStartRPC(t *testing.T) { }, { name: "ws enabled after RPC", - cfg: Config{HTTPHost: "127.0.0.1"}, + cfg: nodecfg.Config{HTTPHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { wsport := n.http.port _, err := api.StartWS(sp("127.0.0.1"), ip(wsport), nil, nil) @@ -198,7 +199,7 @@ func TestStartRPC(t *testing.T) { }, { name: "ws enabled after RPC then stopped", - cfg: Config{HTTPHost: "127.0.0.1"}, + cfg: nodecfg.Config{HTTPHost: "127.0.0.1"}, fn: func(t *testing.T, n *Node, api *privateAdminAPI) { wsport := n.http.port _, err := api.StartWS(sp("127.0.0.1"), ip(wsport), nil, nil) @@ -254,7 +255,7 @@ func TestStartRPC(t *testing.T) { // Apply some sane defaults. config := test.cfg //nolint:scopelint - // config.Logger = testlog.Logger(t, log.LvlDebug) + // config.Log = testlog.Log(t, log.LvlDebug) config.P2P.NoDiscovery = true // Create Node. diff --git a/node/endpoints.go b/node/endpoints.go index 1bda5a7776b..61f8a139bec 100644 --- a/node/endpoints.go +++ b/node/endpoints.go @@ -22,11 +22,12 @@ import ( "time" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/rpc/rpccfg" "github.com/ledgerwatch/log/v3" ) // StartHTTPEndpoint starts the HTTP RPC endpoint. -func StartHTTPEndpoint(endpoint string, timeouts rpc.HTTPTimeouts, handler http.Handler) (*http.Server, net.Addr, error) { +func StartHTTPEndpoint(endpoint string, timeouts rpccfg.HTTPTimeouts, handler http.Handler) (*http.Server, net.Addr, error) { // start the HTTP listener var ( listener net.Listener @@ -68,17 +69,17 @@ func checkModuleAvailability(modules []string, apis []rpc.API) (bad, available [ } // CheckTimeouts ensures that timeout values are meaningful -func CheckTimeouts(timeouts *rpc.HTTPTimeouts) { +func CheckTimeouts(timeouts *rpccfg.HTTPTimeouts) { if timeouts.ReadTimeout < time.Second { - log.Warn("Sanitizing invalid HTTP read timeout", "provided", timeouts.ReadTimeout, "updated", rpc.DefaultHTTPTimeouts.ReadTimeout) - timeouts.ReadTimeout = rpc.DefaultHTTPTimeouts.ReadTimeout + log.Warn("Sanitizing invalid HTTP read timeout", "provided", timeouts.ReadTimeout, "updated", rpccfg.DefaultHTTPTimeouts.ReadTimeout) + timeouts.ReadTimeout = rpccfg.DefaultHTTPTimeouts.ReadTimeout } if timeouts.WriteTimeout < time.Second { - log.Warn("Sanitizing invalid HTTP write timeout", "provided", timeouts.WriteTimeout, "updated", rpc.DefaultHTTPTimeouts.WriteTimeout) - timeouts.WriteTimeout = rpc.DefaultHTTPTimeouts.WriteTimeout + log.Warn("Sanitizing invalid HTTP write timeout", "provided", timeouts.WriteTimeout, "updated", rpccfg.DefaultHTTPTimeouts.WriteTimeout) + timeouts.WriteTimeout = rpccfg.DefaultHTTPTimeouts.WriteTimeout } if timeouts.IdleTimeout < time.Second { - log.Warn("Sanitizing invalid HTTP idle timeout", "provided", timeouts.IdleTimeout, "updated", rpc.DefaultHTTPTimeouts.IdleTimeout) - timeouts.IdleTimeout = rpc.DefaultHTTPTimeouts.IdleTimeout + log.Warn("Sanitizing invalid HTTP idle timeout", "provided", timeouts.IdleTimeout, "updated", rpccfg.DefaultHTTPTimeouts.IdleTimeout) + timeouts.IdleTimeout = rpccfg.DefaultHTTPTimeouts.IdleTimeout } } diff --git a/node/errors.go b/node/errors.go index 67547bf691f..3e9910a2fb2 100644 --- a/node/errors.go +++ b/node/errors.go @@ -24,7 +24,7 @@ import ( ) var ( - ErrDatadirUsed = errors.New("datadir already used by another process") + ErrDataDirUsed = errors.New("datadir already used by another process") ErrNodeStopped = errors.New("node not started") ErrNodeRunning = errors.New("node already running") ErrServiceUnknown = errors.New("unknown service") @@ -34,7 +34,7 @@ var ( func convertFileLockError(err error) error { if errno, ok := err.(syscall.Errno); ok && datadirInUseErrnos[uint(errno)] { - return ErrDatadirUsed + return ErrDataDirUsed } return err } diff --git a/node/node.go b/node/node.go index 6a9aac82a8d..5261177aa84 100644 --- a/node/node.go +++ b/node/node.go @@ -17,6 +17,7 @@ package node import ( + "context" "errors" "fmt" "net" @@ -27,6 +28,12 @@ import ( "strings" "sync" + "github.com/c2h5oh/datasize" + "github.com/ledgerwatch/erigon/node/nodecfg" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rpc/rpccfg" + + "github.com/gofrs/flock" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/mdbx" "github.com/ledgerwatch/erigon-lib/kv/memdb" @@ -34,18 +41,17 @@ import ( "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/log/v3" - "github.com/prometheus/tsdb/fileutil" ) // Node is a container on which services can be registered. type Node struct { - config *Config + config *nodecfg.Config log log.Logger - dirLock fileutil.Releaser // prevents concurrent use of instance directory - stop chan struct{} // Channel to wait for termination notifications - server *p2p.Server // Currently running P2P networking layer - startStopLock sync.Mutex // Start/Stop are protected by an additional lock - state int // Tracks state of node lifecycle + dirLock *flock.Flock // prevents concurrent use of instance directory + stop chan struct{} // Channel to wait for termination notifications + server *p2p.Server // Currently running P2P networking layer + startStopLock sync.Mutex // Start/Stop are protected by an additional lock + state int // Tracks state of node lifecycle lock sync.Mutex lifecycles []Lifecycle // All registered backends, services, and auxiliary services that have a lifecycle @@ -66,7 +72,7 @@ const ( ) // New creates a new P2P node, ready for protocol registration. -func New(conf *Config) (*Node, error) { +func New(conf *nodecfg.Config) (*Node, error) { // Copy config and resolve the datadir so future changes to the current // working directory don't affect the node. confCopy := *conf @@ -78,8 +84,8 @@ func New(conf *Config) (*Node, error) { } conf.DataDir = absdatadir } - if conf.Logger == nil { - conf.Logger = log.New() + if conf.Log == nil { + conf.Log = log.New() } // Ensure that the instance name doesn't cause weird conflicts with @@ -94,7 +100,7 @@ func New(conf *Config) (*Node, error) { node := &Node{ config: conf, inprocHandler: rpc.NewServer(50), - log: conf.Logger, + log: conf.Log, stop: make(chan struct{}), databases: make([]kv.Closer, 0), } @@ -119,7 +125,7 @@ func New(conf *Config) (*Node, error) { // Configure RPC servers. node.http = newHTTPServer(node.log, conf.HTTPTimeouts) - node.ws = newHTTPServer(node.log, rpc.DefaultHTTPTimeouts) + node.ws = newHTTPServer(node.log, rpccfg.DefaultHTTPTimeouts) // Check for uncaught crashes from the previous boot and notify the user if // there are any //debug.CheckForCrashes(conf.DataDir) @@ -273,24 +279,28 @@ func (n *Node) openDataDir() error { return nil // ephemeral } - instdir := n.config.instanceDir() + instdir := n.config.DataDir if err := os.MkdirAll(instdir, 0700); err != nil { return err } // Lock the instance directory to prevent concurrent use by another instance as well as // accidental use of the instance directory as a database. - release, _, err := fileutil.Flock(filepath.Join(instdir, "LOCK")) + l := flock.New(filepath.Join(instdir, "LOCK")) + locked, err := l.TryLock() if err != nil { return convertFileLockError(err) } - n.dirLock = release + if !locked { + return fmt.Errorf("%w: %s\n", ErrDataDirUsed, instdir) + } + n.dirLock = l return nil } func (n *Node) closeDataDir() { // Release instance directory lock. if n.dirLock != nil { - if err := n.dirLock.Release(); err != nil { + if err := n.dirLock.Unlock(); err != nil { n.log.Error("Can't release datadir lock", "err", err) } n.dirLock = nil @@ -449,7 +459,7 @@ func (n *Node) RPCHandler() (*rpc.Server, error) { } // Config returns the configuration of node. -func (n *Node) Config() *Config { +func (n *Node) Config() *nodecfg.Config { return n.config } @@ -464,16 +474,10 @@ func (n *Node) Server() *p2p.Server { } // DataDir retrieves the current datadir used by the protocol stack. -// Deprecated: No files should be stored in this directory, use InstanceDir instead. func (n *Node) DataDir() string { return n.config.DataDir } -// InstanceDir retrieves the instance directory used by the protocol stack. -func (n *Node) InstanceDir() string { - return n.config.instanceDir() -} - // HTTPEndpoint returns the URL of the HTTP server. Note that this URL does not // contain the JSON-RPC path prefix set by HTTPPathPrefix. func (n *Node) HTTPEndpoint() string { @@ -488,7 +492,7 @@ func (n *Node) WSEndpoint() string { return "ws://" + n.ws.listenAddr() + n.ws.wsConfig.prefix } -func OpenDatabase(config *Config, logger log.Logger, label kv.Label) (kv.RwDB, error) { +func OpenDatabase(config *nodecfg.Config, logger log.Logger, label kv.Label) (kv.RwDB, error) { var name string switch label { case kv.ChainDB: @@ -503,15 +507,24 @@ func OpenDatabase(config *Config, logger log.Logger, label kv.Label) (kv.RwDB, e db = memdb.New() return db, nil } - dbPath := config.ResolvePath(name) + + oldDbPath := filepath.Join(config.DataDir, "erigon", name) + dbPath := filepath.Join(config.DataDir, name) + if _, err := os.Stat(oldDbPath); err == nil { + log.Error("Old directory location found", "path", oldDbPath, "please move to new path", dbPath) + return nil, fmt.Errorf("safety error, see log message") + } var openFunc func(exclusive bool) (kv.RwDB, error) - log.Info("Opening Database", "label", name) + log.Info("Opening Database", "label", name, "path", dbPath) openFunc = func(exclusive bool) (kv.RwDB, error) { opts := mdbx.NewMDBX(logger).Path(dbPath).Label(label).DBVerbosity(config.DatabaseVerbosity) if exclusive { opts = opts.Exclusive() } + if label == kv.ChainDB { + opts = opts.PageSize(config.MdbxPageSize.Bytes()).MapSize(8 * datasize.TB) + } return opts.Open() } var err error @@ -520,6 +533,10 @@ func OpenDatabase(config *Config, logger log.Logger, label kv.Label) (kv.RwDB, e return nil, err } migrator := migrations.NewMigrator(label) + if err := migrator.VerifyVersion(db); err != nil { + return nil, err + } + has, err := migrator.HasPendingMigrations(db) if err != nil { return nil, err @@ -541,6 +558,12 @@ func OpenDatabase(config *Config, logger log.Logger, label kv.Label) (kv.RwDB, e } } + if err := db.Update(context.Background(), func(tx kv.RwTx) (err error) { + return params.SetErigonVersion(tx, params.VersionKeyCreated) + }); err != nil { + return nil, err + } + return db, nil } diff --git a/node/node_example_test.go b/node/node_example_test.go index cdb7363ae30..43ffc8cb56a 100644 --- a/node/node_example_test.go +++ b/node/node_example_test.go @@ -21,6 +21,7 @@ import ( "log" "github.com/ledgerwatch/erigon/node" + "github.com/ledgerwatch/erigon/node/nodecfg" ) // SampleLifecycle is a trivial network service that can be attached to a node for @@ -36,7 +37,7 @@ func (s *SampleLifecycle) Stop() error { fmt.Println("Service stopping..."); re func ExampleLifecycle() { // Create a network node to run protocols with the default values. - stack, err := node.New(&node.Config{}) + stack, err := node.New(&nodecfg.Config{}) if err != nil { log.Fatalf("Failed to create network node: %v", err) } diff --git a/node/node_test.go b/node/node_test.go index 920e24b18a2..bc0c198d897 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -30,9 +30,11 @@ import ( "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/node/nodecfg" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/rpc" "github.com/ledgerwatch/log/v3" + "github.com/stretchr/testify/require" "github.com/stretchr/testify/assert" ) @@ -41,8 +43,8 @@ var ( testNodeKey, _ = crypto.GenerateKey() ) -func testNodeConfig(t *testing.T) *Config { - return &Config{ +func testNodeConfig(t *testing.T) *nodecfg.Config { + return &nodecfg.Config{ Name: "test node", P2P: p2p.Config{PrivateKey: testNodeKey}, DataDir: t.TempDir(), @@ -105,7 +107,7 @@ func TestNodeUsedDataDir(t *testing.T) { dir := t.TempDir() // Create a new node based on the data directory - original, originalErr := New(&Config{DataDir: dir}) + original, originalErr := New(&nodecfg.Config{DataDir: dir}) if originalErr != nil { t.Fatalf("failed to create original protocol stack: %v", originalErr) } @@ -115,8 +117,8 @@ func TestNodeUsedDataDir(t *testing.T) { } // Create a second node based on the same data directory and ensure failure - if _, err := New(&Config{DataDir: dir}); !errors.Is(err, ErrDatadirUsed) { - t.Fatalf("duplicate datadir failure mismatch: have %v, want %v", err, ErrDatadirUsed) + if _, err := New(&nodecfg.Config{DataDir: dir}); !errors.Is(err, ErrDataDirUsed) { + t.Fatalf("duplicate datadir failure mismatch: have %v, want %v", err, ErrDataDirUsed) } } @@ -172,7 +174,7 @@ func TestNodeCloseClosesDB(t *testing.T) { stack, _ := New(testNodeConfig(t)) defer stack.Close() - db, err := OpenDatabase(stack.Config(), log.New(), kv.ChainDB) + db, err := OpenDatabase(stack.Config(), log.New(), kv.SentryDB) if err != nil { t.Fatal("can't open DB:", err) } @@ -196,14 +198,14 @@ func TestNodeOpenDatabaseFromLifecycleStart(t *testing.T) { t.Skip("fix me on win please") } - stack, _ := New(testNodeConfig(t)) + stack, err := New(testNodeConfig(t)) + require.NoError(t, err) defer stack.Close() var db kv.RwDB - var err error stack.RegisterLifecycle(&InstrumentedService{ startHook: func() { - db, err = OpenDatabase(stack.Config(), log.New(), kv.ChainDB) + db, err = OpenDatabase(stack.Config(), log.New(), kv.SentryDB) if err != nil { t.Fatal("can't open DB:", err) } @@ -447,6 +449,7 @@ func TestRegisterHandler_Successful(t *testing.T) { // check response resp := doHTTPRequest(t, httpReq) + defer resp.Body.Close() buf := make([]byte, 7) _, err = io.ReadFull(resp.Body, buf) if err != nil { @@ -462,7 +465,7 @@ func TestRegisterHandler_Unsuccessful(t *testing.T) { t.Skip("fix me on win please") } - node, err := New(&DefaultConfig) + node, err := New(&nodecfg.DefaultConfig) if err != nil { t.Fatalf("could not create new node: %v", err) } @@ -574,7 +577,7 @@ func TestNodeRPCPrefix(t *testing.T) { test := test name := fmt.Sprintf("http=%s ws=%s", test.httpPrefix, test.wsPrefix) t.Run(name, func(t *testing.T) { - cfg := &Config{ + cfg := &nodecfg.Config{ HTTPHost: "127.0.0.1", HTTPPathPrefix: test.httpPrefix, WSHost: "127.0.0.1", @@ -607,12 +610,14 @@ func (test rpcPrefixTest) check(t *testing.T, node *Node) { if resp.StatusCode != 200 { t.Errorf("Error: %s: bad status code %d, want 200", path, resp.StatusCode) } + resp.Body.Close() } for _, path := range test.wantNoHTTP { resp := rpcRequest(t, httpBase+path) if resp.StatusCode != 404 { t.Errorf("Error: %s: bad status code %d, want 404", path, resp.StatusCode) } + resp.Body.Close() } for _, path := range test.wantWS { err := wsRequest(t, wsBase+path, "") @@ -630,7 +635,7 @@ func (test rpcPrefixTest) check(t *testing.T, node *Node) { } func createNode(t *testing.T, httpPort, wsPort int) *Node { - conf := &Config{ + conf := &nodecfg.Config{ HTTPHost: "127.0.0.1", HTTPPort: httpPort, WSHost: "127.0.0.1", diff --git a/node/config.go b/node/nodecfg/config.go similarity index 85% rename from node/config.go rename to node/nodecfg/config.go index 133770a345f..048e16cb3af 100644 --- a/node/config.go +++ b/node/nodecfg/config.go @@ -14,10 +14,9 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package node +package nodecfg import ( - "crypto/ecdsa" "fmt" "os" "path/filepath" @@ -25,19 +24,18 @@ import ( "strings" "sync" + "github.com/c2h5oh/datasize" "github.com/ledgerwatch/erigon-lib/kv" - + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/paths" - "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/rpc/rpccfg" "github.com/ledgerwatch/log/v3" ) const ( - datadirPrivateKey = "nodekey" // Path within the datadir to the node's private key datadirStaticNodes = "static-nodes.json" // Path within the datadir to the static node list datadirTrustedNodes = "trusted-nodes.json" // Path within the datadir to the trusted node list datadirNodeDatabase = "nodes" // Path within the datadir to store the node infos @@ -69,6 +67,8 @@ type Config struct { // Configuration of peer-to-peer networking. P2P p2p.Config + DownloaderAddr string + // IPCPath is the requested location to place the IPC endpoint. If the path is // a simple file name, it is placed inside the data directory (or on the root // pipe path on Windows), whereas if it's a resolvable path name (absolute or @@ -105,7 +105,7 @@ type Config struct { // HTTPTimeouts allows for customization of the timeout values used by the HTTP RPC // interface. - HTTPTimeouts rpc.HTTPTimeouts + HTTPTimeouts rpccfg.HTTPTimeouts // HTTPPathPrefix specifies a path prefix on which http-rpc is to be served. HTTPPathPrefix string `toml:",omitempty"` @@ -139,8 +139,8 @@ type Config struct { // private APIs to untrusted users is a major security risk. WSExposeAll bool `toml:",omitempty"` - // Logger is a custom logger to use with the p2p.Server. - Logger log.Logger `toml:",omitempty"` + // Log is a custom logger to use with the p2p.Server. + Log log.Logger `toml:",omitempty"` DatabaseVerbosity kv.DBVerbosityLvl @@ -152,12 +152,21 @@ type Config struct { staticNodesWarning bool trustedNodesWarning bool + SentryLogPeerInfo bool + TLSConnection bool TLSCertFile string // AllowUnprotectedTxs allows non EIP-155 protected transactions to be send over RPC. AllowUnprotectedTxs bool `toml:",omitempty"` TLSKeyFile string TLSCACert string + + MdbxPageSize datasize.ByteSize + + // HealthCheck enables standard grpc health check + HealthCheck bool + + Http httpcfg.HttpCfg } // IPCEndpoint resolves an IPC endpoint based on a configured value, taking into @@ -271,56 +280,7 @@ func (c *Config) ResolvePath(path string) string { if c.DataDir == "" { return "" } - return filepath.Join(c.instanceDir(), path) -} - -func (c *Config) instanceDir() string { - if c.DataDir == "" { - return "" - } - if c.name() == "turbo-geth" { - // backwards compatibility - return filepath.Join(c.DataDir, "tg") - } - return filepath.Join(c.DataDir, c.name()) -} - -// NodeKey retrieves the currently configured private key of the node, checking -// first any manually set key, falling back to the one found in the configured -// data folder. If no key can be found, a new one is generated. -func (c *Config) NodeKey() (*ecdsa.PrivateKey, error) { - // Use any specifically configured key. - if c.P2P.PrivateKey != nil { - return c.P2P.PrivateKey, nil - } - // Generate ephemeral key if no datadir is being used. - if c.DataDir == "" { - key, err := crypto.GenerateKey() - if err != nil { - return key, fmt.Errorf("failed to generate ephemeral node key: %w", err) - } - return key, nil - } - - keyfile := c.ResolvePath(datadirPrivateKey) - if key, err := crypto.LoadECDSA(keyfile); err == nil { - return key, nil - } - // No persistent key found, generate and store a new one. - key, err := crypto.GenerateKey() - if err != nil { - log.Crit(fmt.Sprintf("Failed to generate node key: %v", err)) - } - instanceDir := c.instanceDir() - if err := os.MkdirAll(instanceDir, 0700); err != nil { - log.Error(fmt.Sprintf("Failed to persist node key: %v", err)) - return key, nil - } - keyfile = filepath.Join(instanceDir, datadirPrivateKey) - if err := crypto.SaveECDSA(keyfile, key); err != nil { - log.Error(fmt.Sprintf("Failed to persist node key: %v", err)) - } - return key, nil + return filepath.Join(c.DataDir, path) } // StaticNodes returns a list of node enode URLs configured as static nodes. @@ -378,7 +338,7 @@ func (c *Config) warnOnce(w *bool, format string, args ...interface{}) { if *w { return } - l := c.Logger + l := c.Log if l == nil { l = log.Root() } diff --git a/node/config_test.go b/node/nodecfg/config_test.go similarity index 57% rename from node/config_test.go rename to node/nodecfg/config_test.go index 04a8a8693fb..5b703ddfee4 100644 --- a/node/config_test.go +++ b/node/nodecfg/config_test.go @@ -14,29 +14,27 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package node +package nodecfg_test import ( - "bytes" - "io/ioutil" "os" "path/filepath" "runtime" "testing" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p" + node2 "github.com/ledgerwatch/erigon/node" + "github.com/ledgerwatch/erigon/node/nodecfg" ) // Tests that datadirs can be successfully created, be them manually configured // ones or automatically generated temporary ones. -func TestDatadirCreation(t *testing.T) { +func TestDataDirCreation(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("fix me on win please") } // Create a temporary data dir and check that it can be used by a node dir := t.TempDir() - node, err := New(&Config{DataDir: dir}) + node, err := node2.New(&nodecfg.Config{DataDir: dir}) if err != nil { t.Fatalf("failed to create stack with existing datadir: %v", err) } @@ -45,7 +43,7 @@ func TestDatadirCreation(t *testing.T) { } // Generate a long non-existing datadir path and check that it gets created by a node dir = filepath.Join(dir, "a", "b", "c", "d", "e", "f") - node, err = New(&Config{DataDir: dir}) + node, err = node2.New(&nodecfg.Config{DataDir: dir}) if err != nil { t.Fatalf("failed to create stack with creatable datadir: %v", err) } @@ -56,14 +54,14 @@ func TestDatadirCreation(t *testing.T) { t.Fatalf("freshly created datadir not accessible: %v", err) } // Verify that an impossible datadir fails creation - file, err := ioutil.TempFile("", "") + file, err := os.CreateTemp("", "") if err != nil { t.Fatalf("failed to create temporary file: %v", err) } defer os.Remove(file.Name()) dir = filepath.Join(file.Name(), "invalid/path") - node, err = New(&Config{DataDir: dir}) + node, err = node2.New(&nodecfg.Config{DataDir: dir}) if err == nil { t.Fatalf("protocol stack created with an invalid datadir") if err := node.Close(); err != nil { @@ -97,61 +95,9 @@ func TestIPCPathResolution(t *testing.T) { for i, test := range tests { // Only run when platform/test match if (runtime.GOOS == "windows") == test.Windows { - if endpoint := (&Config{DataDir: test.DataDir, IPCPath: test.IPCPath}).IPCEndpoint(); endpoint != test.Endpoint { + if endpoint := (&nodecfg.Config{DataDir: test.DataDir, IPCPath: test.IPCPath}).IPCEndpoint(); endpoint != test.Endpoint { t.Errorf("test %d: IPC endpoint mismatch: have %s, want %s", i, endpoint, test.Endpoint) } } } } - -// Tests that node keys can be correctly created, persisted, loaded and/or made -// ephemeral. -func TestNodeKeyPersistency(t *testing.T) { - // Create a temporary folder and make sure no key is present - dir := t.TempDir() - - keyfile := filepath.Join(dir, "unit-test", datadirPrivateKey) - - // Configure a node with a preset key and ensure it's not persisted - key, err := crypto.GenerateKey() - if err != nil { - t.Fatalf("failed to generate one-shot node key: %v", err) - } - config := &Config{Name: "unit-test", DataDir: dir, P2P: p2p.Config{PrivateKey: key}} - config.NodeKey() - if _, err := os.Stat(filepath.Join(keyfile)); err == nil { - t.Fatalf("one-shot node key persisted to data directory") - } - - // Configure a node with no preset key and ensure it is persisted this time - config = &Config{Name: "unit-test", DataDir: dir} - config.NodeKey() - if _, err := os.Stat(keyfile); err != nil { - t.Fatalf("node key not persisted to data directory: %v", err) - } - if _, err = crypto.LoadECDSA(keyfile); err != nil { - t.Fatalf("failed to load freshly persisted node key: %v", err) - } - blob1, err := ioutil.ReadFile(keyfile) - if err != nil { - t.Fatalf("failed to read freshly persisted node key: %v", err) - } - - // Configure a new node and ensure the previously persisted key is loaded - config = &Config{Name: "unit-test", DataDir: dir} - config.NodeKey() - blob2, err := ioutil.ReadFile(filepath.Join(keyfile)) - if err != nil { - t.Fatalf("failed to read previously persisted node key: %v", err) - } - if !bytes.Equal(blob1, blob2) { - t.Fatalf("persisted node key mismatch: have %x, want %x", blob2, blob1) - } - - // Configure ephemeral node and ensure no key is dumped locally - config = &Config{Name: "unit-test", DataDir: ""} - config.NodeKey() - if _, err := os.Stat(filepath.Join(".", "unit-test", datadirPrivateKey)); err == nil { - t.Fatalf("ephemeral node key persisted to disk") - } -} diff --git a/node/defaults.go b/node/nodecfg/defaults.go similarity index 62% rename from node/defaults.go rename to node/nodecfg/defaults.go index f465de20fa8..4f3185994cb 100644 --- a/node/defaults.go +++ b/node/nodecfg/defaults.go @@ -14,20 +14,23 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package node +package nodecfg import ( "github.com/ledgerwatch/erigon/common/paths" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/p2p/nat" - "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/rpc/rpccfg" ) const ( - DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server - DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server - DefaultWSHost = "localhost" // Default host interface for the websocket RPC server - DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server + DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server + DefaultEngineHTTPPort = 8551 // Default TCP port for the engineApi HTTP RPC server + DefaultWSHost = "localhost" // Default host interface for the websocket RPC server + DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultGRPCHost = "localhost" // Default host interface for the GRPC server + DefaultGRPCPort = 8547 // Default TCP port for the GRPC server ) // DefaultConfig contains reasonable default settings. @@ -36,13 +39,14 @@ var DefaultConfig = Config{ HTTPPort: DefaultHTTPPort, HTTPModules: []string{"net", "web3"}, HTTPVirtualHosts: []string{"localhost"}, - HTTPTimeouts: rpc.DefaultHTTPTimeouts, + HTTPTimeouts: rpccfg.DefaultHTTPTimeouts, WSPort: DefaultWSPort, WSModules: []string{"net", "web3"}, P2P: p2p.Config{ - ListenAddr: ":30303", - ListenAddr65: ":30304", - MaxPeers: 100, - NAT: nat.Any(), + ListenAddr: ":30303", + ListenAddr65: ":30304", + MaxPeers: 100, + MaxPendingPeers: 1000, + NAT: nat.Any(), }, } diff --git a/node/rpcstack.go b/node/rpcstack.go index 125631cdb76..90865448c04 100644 --- a/node/rpcstack.go +++ b/node/rpcstack.go @@ -21,7 +21,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "net" "net/http" "sort" @@ -30,6 +29,7 @@ import ( "sync/atomic" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/rpc/rpccfg" "github.com/ledgerwatch/log/v3" "github.com/rs/cors" ) @@ -57,7 +57,7 @@ type rpcHandler struct { type httpServer struct { log log.Logger - timeouts rpc.HTTPTimeouts + timeouts rpccfg.HTTPTimeouts mux http.ServeMux // registered handlers go here mu sync.Mutex @@ -81,8 +81,8 @@ type httpServer struct { handlerNames map[string]string } -func newHTTPServer(log log.Logger, timeouts rpc.HTTPTimeouts) *httpServer { - h := &httpServer{log: log, timeouts: timeouts, handlerNames: make(map[string]string)} +func newHTTPServer(logger log.Logger, timeouts rpccfg.HTTPTimeouts) *httpServer { + h := &httpServer{log: logger, timeouts: timeouts, handlerNames: make(map[string]string)} h.httpHandler.Store((*rpcHandler)(nil)) h.wsHandler.Store((*rpcHandler)(nil)) @@ -126,7 +126,7 @@ func (h *httpServer) start() error { // Initialize the server. h.server = &http.Server{Handler: h} - if h.timeouts != (rpc.HTTPTimeouts{}) { + if h.timeouts != (rpccfg.HTTPTimeouts{}) { CheckTimeouts(&h.timeouts) h.server.ReadTimeout = h.timeouts.ReadTimeout h.server.WriteTimeout = h.timeouts.WriteTimeout @@ -322,7 +322,7 @@ func (h *httpServer) enableWS(apis []rpc.API, config wsConfig, allowList rpc.All } h.wsConfig = config h.wsHandler.Store(&rpcHandler{ - Handler: srv.WebsocketHandler(config.Origins, false), + Handler: srv.WebsocketHandler(config.Origins, nil, false), server: srv, }) return nil @@ -440,7 +440,7 @@ func (h *virtualHostHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { var gzPool = sync.Pool{ New: func() interface{} { - w := gzip.NewWriter(ioutil.Discard) + w := gzip.NewWriter(io.Discard) return w }, } diff --git a/node/rpcstack_test.go b/node/rpcstack_test.go index babe047a260..7ce9be3b76e 100644 --- a/node/rpcstack_test.go +++ b/node/rpcstack_test.go @@ -19,7 +19,7 @@ package node import ( "bytes" "fmt" - "io/ioutil" + "io" "net/http" "net/url" "strconv" @@ -29,6 +29,7 @@ import ( "github.com/gorilla/websocket" "github.com/ledgerwatch/erigon/internal/testlog" "github.com/ledgerwatch/erigon/rpc" + "github.com/ledgerwatch/erigon/rpc/rpccfg" "github.com/ledgerwatch/log/v3" "github.com/stretchr/testify/assert" @@ -41,9 +42,11 @@ func TestCorsHandler(t *testing.T) { url := "http://" + srv.listenAddr() resp := rpcRequest(t, url, "origin", "test.com") + defer resp.Body.Close() assert.Equal(t, "test.com", resp.Header.Get("Access-Control-Allow-Origin")) resp2 := rpcRequest(t, url, "origin", "bad") + defer resp2.Body.Close() assert.Equal(t, "", resp2.Header.Get("Access-Control-Allow-Origin")) } @@ -54,9 +57,11 @@ func TestVhosts(t *testing.T) { url := "http://" + srv.listenAddr() resp := rpcRequest(t, url, "host", "test") + defer resp.Body.Close() assert.Equal(t, resp.StatusCode, http.StatusOK) resp2 := rpcRequest(t, url, "host", "bad") + defer resp2.Body.Close() assert.Equal(t, resp2.StatusCode, http.StatusForbidden) } @@ -234,7 +239,7 @@ func Test_checkPath(t *testing.T) { func createAndStartServer(t *testing.T, conf *httpConfig, ws bool, wsConf *wsConfig) *httpServer { t.Helper() - srv := newHTTPServer(testlog.Logger(t, log.LvlDebug), rpc.DefaultHTTPTimeouts) + srv := newHTTPServer(testlog.Logger(t, log.LvlError), rpccfg.DefaultHTTPTimeouts) assert.NoError(t, srv.enableRPC(nil, *conf, nil)) if ws { assert.NoError(t, srv.enableWS(nil, *wsConf, nil)) @@ -247,7 +252,7 @@ func createAndStartServer(t *testing.T, conf *httpConfig, ws bool, wsConf *wsCon func createAndStartServerWithAllowList(t *testing.T, conf httpConfig, ws bool, wsConf wsConfig) *httpServer { t.Helper() - srv := newHTTPServer(testlog.Logger(t, log.LvlDebug), rpc.DefaultHTTPTimeouts) + srv := newHTTPServer(testlog.Logger(t, log.LvlError), rpccfg.DefaultHTTPTimeouts) allowList := rpc.AllowList(map[string]struct{}{"net_version": {}}) //don't allow RPC modules @@ -269,6 +274,7 @@ func wsRequest(t *testing.T, url, browserOrigin string) error { if browserOrigin != "" { headers.Set("Origin", browserOrigin) } + //nolint conn, _, err := websocket.DefaultDialer.Dial(url, headers) if conn != nil { conn.Close() @@ -293,7 +299,8 @@ func testCustomRequest(t *testing.T, srv *httpServer, method string) bool { if err != nil { return false } - respBody, err := ioutil.ReadAll(resp.Body) + defer resp.Body.Close() + respBody, err := io.ReadAll(resp.Body) assert.NoError(t, err) return !strings.Contains(string(respBody), "error") diff --git a/oss-fuzz.sh b/oss-fuzz.sh index ff3bec09943..a21aaf0db10 100755 --- a/oss-fuzz.sh +++ b/oss-fuzz.sh @@ -101,6 +101,7 @@ compile_fuzzer tests/fuzzers/stacktrie Fuzz fuzzStackTrie compile_fuzzer tests/fuzzers/difficulty Fuzz fuzzDifficulty compile_fuzzer tests/fuzzers/abi Fuzz fuzzAbi compile_fuzzer tests/fuzzers/les Fuzz fuzzLes +compile_fuzzer tests/fuzzers/secp256k1 Fuzz fuzzSecp256k1 compile_fuzzer tests/fuzzers/bls12381 FuzzG1Add fuzz_g1_add compile_fuzzer tests/fuzzers/bls12381 FuzzG1Mul fuzz_g1_mul diff --git a/p2p/dial.go b/p2p/dial.go index cf40c7ed0ad..d1ce4d57d6d 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -146,9 +146,6 @@ type dialConfig struct { } func (cfg dialConfig) withDefaults() dialConfig { - if cfg.maxActiveDials == 0 { - cfg.maxActiveDials = defaultMaxPendingPeers - } if cfg.log == nil { cfg.log = log.Root() } @@ -240,7 +237,7 @@ loop: for { // Launch new dials if slots are available. slots := d.freeDialSlots() - slots -= d.startStaticDials(slots) + d.startStaticDials() if slots > 0 { nodesCh = d.nodesIn } else { @@ -421,14 +418,13 @@ func (d *dialScheduler) checkDial(n *enode.Node) error { } // startStaticDials starts n static dial tasks. -func (d *dialScheduler) startStaticDials(n int) (started int) { - for started = 0; started < n && len(d.staticPool) > 0; started++ { +func (d *dialScheduler) startStaticDials() { + for len(d.staticPool) > 0 { idx := d.rand.Intn(len(d.staticPool)) task := d.staticPool[idx] d.startDial(task) d.removeFromStaticPool(idx) } - return started } // updateStaticPool attempts to move the given static dial back into staticPool. @@ -534,13 +530,13 @@ func (t *dialTask) resolve(d *dialScheduler) bool { if t.resolveDelay > maxResolveDelay { t.resolveDelay = maxResolveDelay } - d.log.Debug("Resolving node failed", "id", t.dest.ID(), "newdelay", t.resolveDelay) + d.log.Warn("Resolving node failed", "id", t.dest.ID(), "newdelay", t.resolveDelay) return false } // The node was found. t.resolveDelay = initialResolveDelay t.dest = resolved - d.log.Debug("Resolved node", "id", t.dest.ID(), "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}) + d.log.Trace("Resolved node", "id", t.dest.ID(), "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}) return true } diff --git a/p2p/dial_integration_test.go b/p2p/dial_integration_test.go new file mode 100644 index 00000000000..cee24df0561 --- /dev/null +++ b/p2p/dial_integration_test.go @@ -0,0 +1,9 @@ +//go:build integration + +package p2p + +import "time" + +func init() { + dialTestDialerUnexpectedDialTimeout = 150 * time.Millisecond +} diff --git a/p2p/dial_test.go b/p2p/dial_test.go index dc21d1a471f..9bafb293fc7 100644 --- a/p2p/dial_test.go +++ b/p2p/dial_test.go @@ -179,19 +179,22 @@ func TestDialSchedStaticDial(t *testing.T) { d.addStatic(newNode(uintID(0x05), "127.0.0.5:30303")) d.addStatic(newNode(uintID(0x06), "127.0.0.6:30303")) d.addStatic(newNode(uintID(0x07), "127.0.0.7:30303")) - d.addStatic(newNode(uintID(0x08), "127.0.0.8:30303")) - d.addStatic(newNode(uintID(0x09), "127.0.0.9:30303")) }, wantNewDials: []*enode.Node{ newNode(uintID(0x03), "127.0.0.3:30303"), newNode(uintID(0x04), "127.0.0.4:30303"), newNode(uintID(0x05), "127.0.0.5:30303"), newNode(uintID(0x06), "127.0.0.6:30303"), + newNode(uintID(0x07), "127.0.0.7:30303"), }, }, // Dial to 0x03 completes, filling a peer slot. One slot remains, // two dials are launched to attempt to fill it. { + update: func(d *dialScheduler) { + d.addStatic(newNode(uintID(0x08), "127.0.0.8:30303")) + d.addStatic(newNode(uintID(0x09), "127.0.0.9:30303")) + }, succeeded: []enode.ID{ uintID(0x03), }, @@ -235,7 +238,7 @@ func TestDialSchedRemoveStatic(t *testing.T) { maxDialPeers: 1, } runDialTest(t, config, []dialTestRound{ - // Add static nodes. + // Add static nodes. Ignore maxActiveDials config { update: func(d *dialScheduler) { d.addStatic(newNode(uintID(0x01), "127.0.0.1:30303")) @@ -244,10 +247,15 @@ func TestDialSchedRemoveStatic(t *testing.T) { }, wantNewDials: []*enode.Node{ newNode(uintID(0x01), "127.0.0.1:30303"), + newNode(uintID(0x02), "127.0.0.2:30303"), + newNode(uintID(0x03), "127.0.0.3:30303"), }, }, // Dial to 0x01 fails. { + update: func(d *dialScheduler) { + d.addStatic(newNode(uintID(0x04), "127.0.0.4:30303")) + }, failed: []enode.ID{ uintID(0x01), }, @@ -255,7 +263,7 @@ func TestDialSchedRemoveStatic(t *testing.T) { uintID(0x01): nil, }, wantNewDials: []*enode.Node{ - newNode(uintID(0x02), "127.0.0.2:30303"), + newNode(uintID(0x04), "127.0.0.4:30303"), }, }, // All static nodes are removed. 0x01 is in history, 0x02 is being @@ -265,6 +273,7 @@ func TestDialSchedRemoveStatic(t *testing.T) { d.removeStatic(newNode(uintID(0x01), "127.0.0.1:30303")) d.removeStatic(newNode(uintID(0x02), "127.0.0.2:30303")) d.removeStatic(newNode(uintID(0x03), "127.0.0.3:30303")) + d.removeStatic(newNode(uintID(0x04), "127.0.0.4:30303")) }, failed: []enode.ID{ uintID(0x02), @@ -278,39 +287,6 @@ func TestDialSchedRemoveStatic(t *testing.T) { }) } -// This test checks that static dials are selected at random. -func TestDialSchedManyStaticNodes(t *testing.T) { - t.Parallel() - - config := dialConfig{maxDialPeers: 2} - runDialTest(t, config, []dialTestRound{ - { - peersAdded: []*conn{ - {flags: dynDialedConn, node: newNode(uintID(0xFFFE), "")}, - {flags: dynDialedConn, node: newNode(uintID(0xFFFF), "")}, - }, - update: func(d *dialScheduler) { - for id := uint16(0); id < 2000; id++ { - n := newNode(uintID(id), "127.0.0.1:30303") - d.addStatic(n) - } - }, - }, - { - peersRemoved: []enode.ID{ - uintID(0xFFFE), - uintID(0xFFFF), - }, - wantNewDials: []*enode.Node{ - newNode(uintID(0x0085), "127.0.0.1:30303"), - newNode(uintID(0x02dc), "127.0.0.1:30303"), - newNode(uintID(0x0285), "127.0.0.1:30303"), - newNode(uintID(0x00cb), "127.0.0.1:30303"), - }, - }, - }) -} - // This test checks that past dials are not retried for some time. func TestDialSchedHistory(t *testing.T) { t.Parallel() @@ -422,7 +398,7 @@ func runDialTest(t *testing.T, config dialConfig, rounds []dialTestRound) { config.clock = clock config.dialer = dialer config.resolver = resolver - config.log = testlog.Logger(t, log.LvlTrace) + config.log = testlog.Logger(t, log.LvlError) config.rand = rand.New(rand.NewSource(0x1111)) // Set up the dialer. The setup function below runs on the dialTask @@ -615,11 +591,13 @@ func (d *dialTestDialer) waitForDials(nodes []*enode.Node) error { return d.checkUnexpectedDial() } +var dialTestDialerUnexpectedDialTimeout = time.Millisecond + func (d *dialTestDialer) checkUnexpectedDial() error { select { case req := <-d.init: return fmt.Errorf("attempt to dial unexpected node %v", req.n.ID()) - case <-time.After(150 * time.Millisecond): + case <-time.After(dialTestDialerUnexpectedDialTimeout): return nil } } diff --git a/p2p/discover/common.go b/p2p/discover/common.go index 642d79016ef..6ee5c4c0bd1 100644 --- a/p2p/discover/common.go +++ b/p2p/discover/common.go @@ -17,8 +17,12 @@ package discover import ( + "context" "crypto/ecdsa" "net" + "time" + + "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/common/mclock" "github.com/ledgerwatch/erigon/p2p/enode" @@ -47,9 +51,16 @@ type Config struct { Log log.Logger // if set, log messages go here ValidSchemes enr.IdentityScheme // allowed identity schemes Clock mclock.Clock + ReplyTimeout time.Duration + + PingBackDelay time.Duration + + PrivateKeyGenerator func() (*ecdsa.PrivateKey, error) + + TableRevalidateInterval time.Duration } -func (cfg Config) withDefaults() Config { +func (cfg Config) withDefaults(defaultReplyTimeout time.Duration) Config { if cfg.Log == nil { cfg.Log = log.Root() } @@ -59,12 +70,24 @@ func (cfg Config) withDefaults() Config { if cfg.Clock == nil { cfg.Clock = mclock.System{} } + if cfg.ReplyTimeout == 0 { + cfg.ReplyTimeout = defaultReplyTimeout + } + if cfg.PingBackDelay == 0 { + cfg.PingBackDelay = respTimeout + } + if cfg.PrivateKeyGenerator == nil { + cfg.PrivateKeyGenerator = crypto.GenerateKey + } + if cfg.TableRevalidateInterval == 0 { + cfg.TableRevalidateInterval = revalidateInterval + } return cfg } // ListenUDP starts listening for discovery packets on the given UDP socket. -func ListenUDP(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { - return ListenV4(c, ln, cfg) +func ListenUDP(ctx context.Context, c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { + return ListenV4(ctx, c, ln, cfg) } // ReadPacket is a packet that couldn't be handled. Those packets are sent to the unhandled @@ -73,10 +96,3 @@ type ReadPacket struct { Data []byte Addr *net.UDPAddr } - -func min(x, y int) int { - if x > y { - return y - } - return x -} diff --git a/p2p/discover/lookup.go b/p2p/discover/lookup.go index ec11aad89a2..0e03daa30f2 100644 --- a/p2p/discover/lookup.go +++ b/p2p/discover/lookup.go @@ -35,6 +35,7 @@ type lookup struct { result nodesByDistance replyBuffer []*node queries int + noSlowdown bool } type queryFunc func(*node) ([]*node, error) @@ -50,6 +51,8 @@ func newLookup(ctx context.Context, tab *Table, target enode.ID, q queryFunc) *l cancelCh: ctx.Done(), queries: -1, } + it.noSlowdown = isDisabledLookupSlowdown(ctx) + // Don't query further if we hit ourself. // Unlikely to happen often in practice. it.asked[tab.self().ID()] = true @@ -129,7 +132,18 @@ func (it *lookup) startQueries() bool { return it.queries > 0 } +func disableLookupSlowdown(ctx context.Context) context.Context { + return context.WithValue(ctx, "p2p.discover.lookup.noSlowdown", true) +} + +func isDisabledLookupSlowdown(ctx context.Context) bool { + return ctx.Value("p2p.discover.lookup.noSlowdown") != nil +} + func (it *lookup) slowdown() { + if it.noSlowdown { + return + } sleep := time.NewTimer(1 * time.Second) defer sleep.Stop() select { diff --git a/p2p/discover/lookup_util_test.go b/p2p/discover/lookup_util_test.go new file mode 100644 index 00000000000..2aebde2be0f --- /dev/null +++ b/p2p/discover/lookup_util_test.go @@ -0,0 +1,218 @@ +package discover + +import ( + "crypto/ecdsa" + "fmt" + "net" + "sort" + "testing" + + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/p2p/discover/v4wire" + "github.com/ledgerwatch/erigon/p2p/enode" + "github.com/ledgerwatch/erigon/p2p/enr" +) + +// This is the test network for the Lookup test. +// The nodes were obtained by running lookupTestnet.mine with a random NodeID as target. +var lookupTestnet = &preminedTestnet{ + target: hexEncPubkey("5d485bdcbe9bc89314a10ae9231e429d33853e3a8fa2af39f5f827370a2e4185e344ace5d16237491dad41f278f1d3785210d29ace76cd627b9147ee340b1125"), + dists: [257][]*ecdsa.PrivateKey{ + 251: { + hexEncPrivkey("29738ba0c1a4397d6a65f292eee07f02df8e58d41594ba2be3cf84ce0fc58169"), + hexEncPrivkey("511b1686e4e58a917f7f848e9bf5539d206a68f5ad6b54b552c2399fe7d174ae"), + hexEncPrivkey("d09e5eaeec0fd596236faed210e55ef45112409a5aa7f3276d26646080dcfaeb"), + hexEncPrivkey("c1e20dbbf0d530e50573bd0a260b32ec15eb9190032b4633d44834afc8afe578"), + hexEncPrivkey("ed5f38f5702d92d306143e5d9154fb21819777da39af325ea359f453d179e80b"), + }, + 252: { + hexEncPrivkey("1c9b1cafbec00848d2c174b858219914b42a7d5c9359b1ca03fd650e8239ae94"), + hexEncPrivkey("e0e1e8db4a6f13c1ffdd3e96b72fa7012293ced187c9dcdcb9ba2af37a46fa10"), + hexEncPrivkey("3d53823e0a0295cb09f3e11d16c1b44d07dd37cec6f739b8df3a590189fe9fb9"), + }, + 253: { + hexEncPrivkey("2d0511ae9bf590166597eeab86b6f27b1ab761761eaea8965487b162f8703847"), + hexEncPrivkey("6cfbd7b8503073fc3dbdb746a7c672571648d3bd15197ccf7f7fef3d904f53a2"), + hexEncPrivkey("a30599b12827b69120633f15b98a7f6bc9fc2e9a0fd6ae2ebb767c0e64d743ab"), + hexEncPrivkey("14a98db9b46a831d67eff29f3b85b1b485bb12ae9796aea98d91be3dc78d8a91"), + hexEncPrivkey("2369ff1fc1ff8ca7d20b17e2673adc3365c3674377f21c5d9dafaff21fe12e24"), + hexEncPrivkey("9ae91101d6b5048607f41ec0f690ef5d09507928aded2410aabd9237aa2727d7"), + hexEncPrivkey("05e3c59090a3fd1ae697c09c574a36fcf9bedd0afa8fe3946f21117319ca4973"), + hexEncPrivkey("06f31c5ea632658f718a91a1b1b9ae4b7549d7b3bc61cbc2be5f4a439039f3ad"), + }, + 254: { + hexEncPrivkey("dec742079ec00ff4ec1284d7905bc3de2366f67a0769431fd16f80fd68c58a7c"), + hexEncPrivkey("ff02c8861fa12fbd129d2a95ea663492ef9c1e51de19dcfbbfe1c59894a28d2b"), + hexEncPrivkey("4dded9e4eefcbce4262be4fd9e8a773670ab0b5f448f286ec97dfc8cf681444a"), + hexEncPrivkey("750d931e2a8baa2c9268cb46b7cd851f4198018bed22f4dceb09dd334a2395f6"), + hexEncPrivkey("ce1435a956a98ffec484cd11489c4f165cf1606819ab6b521cee440f0c677e9e"), + hexEncPrivkey("996e7f8d1638be92d7328b4770f47e5420fc4bafecb4324fd33b1f5d9f403a75"), + hexEncPrivkey("ebdc44e77a6cc0eb622e58cf3bb903c3da4c91ca75b447b0168505d8fc308b9c"), + hexEncPrivkey("46bd1eddcf6431bea66fc19ebc45df191c1c7d6ed552dcdc7392885009c322f0"), + }, + 255: { + hexEncPrivkey("da8645f90826e57228d9ea72aff84500060ad111a5d62e4af831ed8e4b5acfb8"), + hexEncPrivkey("3c944c5d9af51d4c1d43f5d0f3a1a7ef65d5e82744d669b58b5fed242941a566"), + hexEncPrivkey("5ebcde76f1d579eebf6e43b0ffe9157e65ffaa391175d5b9aa988f47df3e33da"), + hexEncPrivkey("97f78253a7d1d796e4eaabce721febcc4550dd68fb11cc818378ba807a2cb7de"), + hexEncPrivkey("a38cd7dc9b4079d1c0406afd0fdb1165c285f2c44f946eca96fc67772c988c7d"), + hexEncPrivkey("d64cbb3ffdf712c372b7a22a176308ef8f91861398d5dbaf326fd89c6eaeef1c"), + hexEncPrivkey("d269609743ef29d6446e3355ec647e38d919c82a4eb5837e442efd7f4218944f"), + hexEncPrivkey("d8f7bcc4a530efde1d143717007179e0d9ace405ddaaf151c4d863753b7fd64c"), + }, + 256: { + hexEncPrivkey("8c5b422155d33ea8e9d46f71d1ad3e7b24cb40051413ffa1a81cff613d243ba9"), + hexEncPrivkey("937b1af801def4e8f5a3a8bd225a8bcff1db764e41d3e177f2e9376e8dd87233"), + hexEncPrivkey("120260dce739b6f71f171da6f65bc361b5fad51db74cf02d3e973347819a6518"), + hexEncPrivkey("1fa56cf25d4b46c2bf94e82355aa631717b63190785ac6bae545a88aadc304a9"), + hexEncPrivkey("3c38c503c0376f9b4adcbe935d5f4b890391741c764f61b03cd4d0d42deae002"), + hexEncPrivkey("3a54af3e9fa162bc8623cdf3e5d9b70bf30ade1d54cc3abea8659aba6cff471f"), + hexEncPrivkey("6799a02ea1999aefdcbcc4d3ff9544478be7365a328d0d0f37c26bd95ade0cda"), + hexEncPrivkey("e24a7bc9051058f918646b0f6e3d16884b2a55a15553b89bab910d55ebc36116"), + }, + }, +} + +type preminedTestnet struct { + target enode.PubkeyEncoded + dists [hashBits + 1][]*ecdsa.PrivateKey +} + +func (tn *preminedTestnet) len() int { + n := 0 + for _, keys := range tn.dists { + n += len(keys) + } + return n +} + +func (tn *preminedTestnet) nodes() []*enode.Node { + result := make([]*enode.Node, 0, tn.len()) + for dist, keys := range tn.dists { + for index := range keys { + result = append(result, tn.node(dist, index)) + } + } + sortByID(result) + return result +} + +func (tn *preminedTestnet) node(dist, index int) *enode.Node { + key := tn.dists[dist][index] + rec := new(enr.Record) + rec.Set(enr.IP{127, byte(dist >> 8), byte(dist), byte(index)}) + rec.Set(enr.UDP(5000)) + enode.SignV4(rec, key) + n, _ := enode.New(enode.ValidSchemes, rec) + return n +} + +func (tn *preminedTestnet) nodeByAddr(addr *net.UDPAddr) (*enode.Node, *ecdsa.PrivateKey) { + dist := int(addr.IP[1])<<8 + int(addr.IP[2]) + index := int(addr.IP[3]) + key := tn.dists[dist][index] + return tn.node(dist, index), key +} + +func (tn *preminedTestnet) nodesAtDistance(dist int) []v4wire.Node { + result := make([]v4wire.Node, len(tn.dists[dist])) + for i := range result { + result[i] = nodeToRPC(wrapNode(tn.node(dist, i))) + } + return result +} + +func (tn *preminedTestnet) neighborsAtDistances(base *enode.Node, distances []uint, elems int) []*enode.Node { + var result []*enode.Node + for d := range lookupTestnet.dists { + for i := range lookupTestnet.dists[d] { + n := lookupTestnet.node(d, i) + d := enode.LogDist(base.ID(), n.ID()) + if containsUint(uint(d), distances) { + result = append(result, n) + if len(result) >= elems { + return result + } + } + } + } + return result +} + +func (tn *preminedTestnet) closest(n int) (nodes []*enode.Node) { + for d := range tn.dists { + for i := range tn.dists[d] { + nodes = append(nodes, tn.node(d, i)) + } + } + sort.Slice(nodes, func(i, j int) bool { + return enode.DistCmp(tn.target.ID(), nodes[i].ID(), nodes[j].ID()) < 0 + }) + return nodes[:n] +} + +func (tn *preminedTestnet) privateKeys() []*ecdsa.PrivateKey { + var keys []*ecdsa.PrivateKey + for d := range tn.dists { + keys = append(keys, tn.dists[d]...) + } + return keys +} + +var _ = (*preminedTestnet).mine // avoid linter warning about mine being dead code. + +// mine generates a testnet struct literal with nodes at +// various distances to the network's target. +func (tn *preminedTestnet) mine() { + // Clear existing slices first (useful when re-mining). + for i := range tn.dists { + tn.dists[i] = nil + } + + targetSha := tn.target.ID() + found, need := 0, 40 + for found < need { + k := newkey() + ld := enode.LogDist(targetSha, enode.PubkeyToIDV4(&k.PublicKey)) + if len(tn.dists[ld]) < 8 { + tn.dists[ld] = append(tn.dists[ld], k) + found++ + fmt.Printf("found ID with ld %d (%d/%d)\n", ld, found, need) + } + } + fmt.Printf("&preminedTestnet{\n") + fmt.Printf(" target: hexEncPubkey(\"%x\"),\n", tn.target[:]) + fmt.Printf(" dists: [%d][]*ecdsa.PrivateKey{\n", len(tn.dists)) + for ld, ns := range tn.dists { + if len(ns) == 0 { + continue + } + fmt.Printf(" %d: {\n", ld) + for _, key := range ns { + fmt.Printf(" hexEncPrivkey(\"%x\"),\n", crypto.FromECDSA(key)) + } + fmt.Printf(" },\n") + } + fmt.Printf(" },\n") + fmt.Printf("}\n") +} + +// checkLookupResults verifies that the results of a lookup are the closest nodes to +// the testnet's target. +func checkLookupResults(t *testing.T, tn *preminedTestnet, results []*enode.Node) { + t.Helper() + t.Logf("results:") + for _, e := range results { + t.Logf(" ld=%d, %x", enode.LogDist(tn.target.ID(), e.ID()), e.ID().Bytes()) + } + if hasDuplicates(wrapNodes(results)) { + t.Errorf("result set contains duplicate entries") + } + if !sortedByDistanceTo(tn.target.ID(), wrapNodes(results)) { + t.Errorf("result set not sorted by distance to target") + } + wantNodes := tn.closest(len(results)) + if err := checkNodesEqual(results, wantNodes); err != nil { + t.Error(err) + } +} diff --git a/p2p/discover/node.go b/p2p/discover/node.go index f2dd30e136a..59c20b1bdb3 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -17,15 +17,9 @@ package discover import ( - "crypto/ecdsa" - "crypto/elliptic" - "errors" - "math/big" "net" "time" - "github.com/ledgerwatch/erigon/common/math" - "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/p2p/enode" ) @@ -37,33 +31,6 @@ type node struct { livenessChecks uint // how often liveness was checked } -type encPubkey [64]byte - -func encodePubkey(key *ecdsa.PublicKey) encPubkey { - var e encPubkey - math.ReadBits(key.X, e[:len(e)/2]) - math.ReadBits(key.Y, e[len(e)/2:]) - return e -} - -func decodePubkey(curve elliptic.Curve, e []byte) (*ecdsa.PublicKey, error) { - if len(e) != len(encPubkey{}) { - return nil, errors.New("wrong size public key data") - } - p := &ecdsa.PublicKey{Curve: curve, X: new(big.Int), Y: new(big.Int)} - half := len(e) / 2 - p.X.SetBytes(e[:half]) - p.Y.SetBytes(e[half:]) - if !p.Curve.IsOnCurve(p.X, p.Y) { - return nil, errors.New("invalid curve point") - } - return p, nil -} - -func (e encPubkey) id() enode.ID { - return enode.ID(crypto.Keccak256Hash(e[:])) -} - func wrapNode(n *enode.Node) *node { return &node{Node: *n} } diff --git a/p2p/discover/ntp.go b/p2p/discover/ntp.go index 1615313f27c..dbcd1108c96 100644 --- a/p2p/discover/ntp.go +++ b/p2p/discover/ntp.go @@ -54,7 +54,7 @@ func checkClockDrift() { log.Warn(fmt.Sprintf("System clock seems off by %v, which can prevent network connectivity", drift)) log.Warn("Please enable network time synchronisation in system settings.") } else { - log.Debug("NTP sanity check done", "drift", drift) + log.Trace("NTP sanity check done", "drift", drift) } } diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 549daa373b9..77e36a4c8cc 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -55,7 +55,7 @@ const ( tableIPLimit, tableSubnet = 10, 24 refreshInterval = 30 * time.Minute - revalidateInterval = 10 * time.Second + revalidateInterval = 5 * time.Second copyNodesInterval = 30 * time.Second seedMinTableTime = 5 * time.Minute seedCount = 30 @@ -72,6 +72,8 @@ type Table struct { rand *mrand.Rand // source of randomness, periodically reseeded ips netutil.DistinctNetSet + revalidateInterval time.Duration + log log.Logger db *enode.DB // database of known nodes net transport @@ -100,7 +102,13 @@ type bucket struct { ips netutil.DistinctNetSet } -func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger) (*Table, error) { +func newTable( + t transport, + db *enode.DB, + bootnodes []*enode.Node, + revalidateInterval time.Duration, + logger log.Logger, +) (*Table, error) { tab := &Table{ net: t, db: db, @@ -110,7 +118,10 @@ func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger closed: make(chan struct{}), rand: mrand.New(mrand.NewSource(0)), ips: netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit}, - log: log, + + revalidateInterval: revalidateInterval, + + log: logger, } if err := tab.setFallbackNodes(bootnodes); err != nil { return nil, err @@ -188,7 +199,7 @@ func (tab *Table) close() { func (tab *Table) setFallbackNodes(nodes []*enode.Node) error { for _, n := range nodes { if err := n.ValidateComplete(); err != nil { - return fmt.Errorf("bad bootstrap node %q: %v", n, err) + return fmt.Errorf("bad bootstrap node %q: %w", n, err) } } tab.nursery = wrapNodes(nodes) @@ -218,7 +229,7 @@ func (tab *Table) refresh() <-chan struct{} { // loop schedules runs of doRefresh, doRevalidate and copyLiveNodes. func (tab *Table) loop() { var ( - revalidate = time.NewTimer(tab.nextRevalidateTime()) + revalidate = time.NewTimer(tab.revalidateInterval) refresh = time.NewTicker(refreshInterval) copyNodes = time.NewTicker(copyNodesInterval) refreshDone = make(chan struct{}) // where doRefresh reports completion @@ -257,7 +268,7 @@ loop: revalidateDone = make(chan struct{}) go tab.doRevalidate(revalidateDone) case <-revalidateDone: - revalidate.Reset(tab.nextRevalidateTime()) + revalidate.Reset(tab.revalidateInterval) revalidateDone = nil case <-copyNodes.C: go tab.copyLiveNodes() @@ -305,6 +316,7 @@ func (tab *Table) doRefresh(done chan struct{}) { func (tab *Table) loadSeedNodes() { seeds := wrapNodes(tab.db.QuerySeeds(seedCount, seedMaxAge)) + tab.log.Debug("QuerySeeds read nodes from the node DB", "count", len(seeds)) seeds = append(seeds, tab.nursery...) for i := range seeds { seed := seeds[i] @@ -332,7 +344,7 @@ func (tab *Table) doRevalidate(done chan<- struct{}) { // Also fetch record if the node replied and returned a higher sequence number. if last.Seq() < remoteSeq { if n, err := tab.net.RequestENR(unwrapNode(last)); err != nil { - tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err) + tab.log.Trace("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err) } else { last = &node{Node: *n, addedAt: last.addedAt, livenessChecks: last.livenessChecks} } @@ -344,16 +356,16 @@ func (tab *Table) doRevalidate(done chan<- struct{}) { if rErr == nil { // The node responded, move it to the front. last.livenessChecks++ - tab.log.Debug("Revalidated node", "b", bi, "id", last.ID(), "checks", last.livenessChecks) + tab.log.Trace("Revalidated node", "b", bi, "id", last.ID(), "checks", last.livenessChecks) tab.bumpInBucket(b, last) return } // No reply received, pick a replacement or delete the node if there aren't // any replacements. if r := tab.replace(b, last); r != nil { - tab.log.Debug("Replaced dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks, "r", r.ID(), "rip", r.IP()) + tab.log.Trace("Replaced dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks, "r", r.ID(), "rip", r.IP()) } else { - tab.log.Debug("Removed dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks) + tab.log.Trace("Removed dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks) } } @@ -372,13 +384,6 @@ func (tab *Table) nodeToRevalidate() (n *node, bi int) { return nil, 0 } -func (tab *Table) nextRevalidateTime() time.Duration { - tab.mutex.Lock() - defer tab.mutex.Unlock() - - return time.Duration(tab.rand.Int63n(int64(revalidateInterval))) -} - // copyLiveNodes adds nodes from the table to the database if they have been in the table // longer than seedMinTableTime. func (tab *Table) copyLiveNodes() { @@ -552,11 +557,11 @@ func (tab *Table) addIP(b *bucket, ip net.IP) bool { return true } if !tab.ips.Add(ip) { - tab.log.Debug("IP exceeds table limit", "ip", ip) + tab.log.Trace("IP exceeds table limit", "ip", ip) return false } if !b.ips.Add(ip) { - tab.log.Debug("IP exceeds bucket limit", "ip", ip) + tab.log.Trace("IP exceeds bucket limit", "ip", ip) tab.ips.Remove(ip) return false } diff --git a/p2p/discover/table_integration_test.go b/p2p/discover/table_integration_test.go new file mode 100644 index 00000000000..241350358f3 --- /dev/null +++ b/p2p/discover/table_integration_test.go @@ -0,0 +1,61 @@ +//go:build integration + +package discover + +import ( + "math/rand" + "testing" + "testing/quick" + "time" +) + +func TestTable_bumpNoDuplicates_quickCheck(t *testing.T) { + t.Parallel() + + config := quick.Config{ + MaxCount: 200, + Rand: rand.New(rand.NewSource(time.Now().Unix())), + } + + test := func(bucketCountGen byte, bumpCountGen byte) bool { + return testTableBumpNoDuplicatesRun(t, bucketCountGen, bumpCountGen, config.Rand) + } + + if err := quick.Check(test, &config); err != nil { + t.Error(err) + } +} + +func TestTable_findNodeByID_quickCheck(t *testing.T) { + t.Parallel() + + config := quick.Config{ + MaxCount: 1000, + Rand: rand.New(rand.NewSource(time.Now().Unix())), + } + + test := func(nodesCount uint16, resultsCount byte) bool { + return testTableFindNodeByIDRun(t, nodesCount, resultsCount, config.Rand) + } + + if err := quick.Check(test, &config); err != nil { + t.Error(err) + } +} + +func TestTable_ReadRandomNodesGetAll_quickCheck(t *testing.T) { + t.Parallel() + + config := quick.Config{ + MaxCount: 200, + Rand: rand.New(rand.NewSource(time.Now().Unix())), + } + + test := func(nodesCount uint16) bool { + return testTableReadRandomNodesGetAllRun(t, nodesCount, config.Rand) + } + + if err := quick.Check(test, &config); err != nil { + t.Error(err) + } +} diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index 750b962ccd6..dc53ac66717 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -20,11 +20,9 @@ import ( "crypto/ecdsa" "fmt" "math/rand" - "net" "reflect" "testing" - "testing/quick" "time" "github.com/ledgerwatch/erigon/crypto" @@ -92,35 +90,39 @@ func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding } } -func TestBucket_bumpNoDuplicates(t *testing.T) { - t.Parallel() - cfg := &quick.Config{ - MaxCount: 1000, - Rand: rand.New(rand.NewSource(time.Now().Unix())), - Values: func(args []reflect.Value, rand *rand.Rand) { - // generate a random list of nodes. this will be the content of the bucket. - n := rand.Intn(bucketSize-1) + 1 - nodes := make([]*node, n) - for i := range nodes { - nodes[i] = nodeAtDistance(enode.ID{}, 200, intIP(200)) - } - args[0] = reflect.ValueOf(nodes) - // generate random bump positions. - bumps := make([]int, rand.Intn(100)) - for i := range bumps { - bumps[i] = rand.Intn(len(nodes)) - } - args[1] = reflect.ValueOf(bumps) - }, +func testTableBumpNoDuplicatesRun(t *testing.T, bucketCountGen byte, bumpCountGen byte, randGen *rand.Rand) bool { + generateBucketNodes := func(bucketCountGen byte) []*node { + bucketCount := bucketCountGen % (bucketSize + 1) // [0...bucketSize] + nodes := make([]*node, bucketCount) + for i := range nodes { + nodes[i] = nodeAtDistance(enode.ID{}, 200, intIP(200)) + } + return nodes + } + + generateRandomBumpPositions := func(bumpCountGen byte, bucketCount int, randGen *rand.Rand) []int { + bumpCount := bumpCountGen % 100 + bumps := make([]int, bumpCount) + for i := range bumps { + bumps[i] = randGen.Intn(bucketCount) + } + return bumps + } + + nodes := generateBucketNodes(bucketCountGen) + if len(nodes) == 0 { + return true } + bumps := generateRandomBumpPositions(bumpCountGen, len(nodes), randGen) - prop := func(nodes []*node, bumps []int) (ok bool) { + if len(bumps) > 0 { tab, db := newTestTable(newPingRecorder()) defer db.Close() defer tab.close() b := &bucket{entries: make([]*node, len(nodes))} copy(b.entries, nodes) + for i, pos := range bumps { tab.bumpInBucket(b, b.entries[pos]) if hasDuplicates(b.entries) { @@ -134,9 +136,32 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { checkIPLimitInvariant(t, tab) return true } - if err := quick.Check(prop, cfg); err != nil { - t.Error(err) - } + return true +} + +func TestTable_bumpNoDuplicates_examples(t *testing.T) { + t.Parallel() + + randGen := rand.New(rand.NewSource(time.Now().Unix())) + + t.Run("n1b1", func(t *testing.T) { + testTableBumpNoDuplicatesRun(t, 1, 1, randGen) + }) + t.Run("n1b5", func(t *testing.T) { + testTableBumpNoDuplicatesRun(t, 1, 5, randGen) + }) + t.Run("n5b1", func(t *testing.T) { + testTableBumpNoDuplicatesRun(t, 5, 1, randGen) + }) + t.Run("n5b10", func(t *testing.T) { + testTableBumpNoDuplicatesRun(t, 5, 10, randGen) + }) + t.Run("n16b10", func(t *testing.T) { + testTableBumpNoDuplicatesRun(t, 16, 10, randGen) + }) + t.Run("n16b90", func(t *testing.T) { + testTableBumpNoDuplicatesRun(t, 16, 90, randGen) + }) } // This checks that the table-wide IP limit is applied correctly. @@ -190,31 +215,35 @@ func checkIPLimitInvariant(t *testing.T, tab *Table) { } } -func TestTable_findnodeByID(t *testing.T) { - t.Parallel() - - test := func(test *closeTest) bool { +func testTableFindNodeByIDRun(t *testing.T, nodesCountGen uint16, resultsCountGen byte, rand *rand.Rand) bool { + if !t.Skipped() { // for any node table, Target and N transport := newPingRecorder() tab, db := newTestTable(transport) defer db.Close() defer tab.close() - fillTable(tab, test.All) + + nodesCount := int(nodesCountGen) % (bucketSize*nBuckets + 1) + testNodes := generateNodes(rand, nodesCount) + fillTable(tab, testNodes) + + target := enode.ID{} + resultsCount := int(resultsCountGen) % (bucketSize + 1) // check that closest(Target, N) returns nodes - result := tab.findnodeByID(test.Target, test.N, false).entries + result := tab.findnodeByID(target, resultsCount, false).entries if hasDuplicates(result) { t.Errorf("result contains duplicates") return false } - if !sortedByDistanceTo(test.Target, result) { + if !sortedByDistanceTo(target, result) { t.Errorf("result is not sorted by distance to target") return false } // check that the number of results is min(N, tablen) - wantN := test.N - if tlen := tab.len(); tlen < test.N { + wantN := resultsCount + if tlen := tab.len(); tlen < resultsCount { wantN = tlen } if len(result) != wantN { @@ -231,9 +260,9 @@ func TestTable_findnodeByID(t *testing.T) { continue // don't run the check below for nodes in result } farthestResult := result[len(result)-1].ID() - if enode.DistCmp(test.Target, n.ID(), farthestResult) < 0 { + if enode.DistCmp(target, n.ID(), farthestResult) < 0 { t.Errorf("table contains node that is closer to target but it's not in result") - t.Logf(" Target: %v", test.Target) + t.Logf(" Target: %v", target) t.Logf(" Farthest Result: %v", farthestResult) t.Logf(" ID: %v", n.ID()) return false @@ -242,20 +271,56 @@ func TestTable_findnodeByID(t *testing.T) { } return true } - if err := quick.Check(test, quickcfg()); err != nil { - t.Error(err) - } + return true } -func TestTable_ReadRandomNodesGetAll(t *testing.T) { - cfg := &quick.Config{ - MaxCount: 200, - Rand: rand.New(rand.NewSource(time.Now().Unix())), - Values: func(args []reflect.Value, rand *rand.Rand) { - args[0] = reflect.ValueOf(make([]*enode.Node, rand.Intn(1000))) - }, - } - test := func(buf []*enode.Node) bool { +func TestTable_findNodeByID_examples(t *testing.T) { + t.Parallel() + + randGen := rand.New(rand.NewSource(time.Now().Unix())) + + t.Run("n0r1", func(t *testing.T) { + testTableFindNodeByIDRun(t, 0, 1, randGen) + }) + t.Run("n1r1", func(t *testing.T) { + testTableFindNodeByIDRun(t, 1, 1, randGen) + }) + t.Run("n16r1", func(t *testing.T) { + testTableFindNodeByIDRun(t, bucketSize, 1, randGen) + }) + t.Run("nMr1", func(t *testing.T) { + testTableFindNodeByIDRun(t, uint16(bucketSize*nBuckets), 1, randGen) + }) + t.Run("n0r2", func(t *testing.T) { + testTableFindNodeByIDRun(t, 0, 2, randGen) + }) + t.Run("n1r2", func(t *testing.T) { + testTableFindNodeByIDRun(t, 1, 2, randGen) + }) + t.Run("n16r2", func(t *testing.T) { + testTableFindNodeByIDRun(t, bucketSize, 2, randGen) + }) + t.Run("nMr2", func(t *testing.T) { + testTableFindNodeByIDRun(t, uint16(bucketSize*nBuckets), 2, randGen) + }) + t.Run("n0rM", func(t *testing.T) { + testTableFindNodeByIDRun(t, 0, bucketSize, randGen) + }) + t.Run("n1rM", func(t *testing.T) { + testTableFindNodeByIDRun(t, 1, bucketSize, randGen) + }) + t.Run("n16rM", func(t *testing.T) { + testTableFindNodeByIDRun(t, bucketSize, bucketSize, randGen) + }) + t.Run("nMrM", func(t *testing.T) { + testTableFindNodeByIDRun(t, uint16(bucketSize*nBuckets), bucketSize, randGen) + }) +} + +func testTableReadRandomNodesGetAllRun(t *testing.T, nodesCountGen uint16, rand *rand.Rand) bool { + nodesCount := nodesCountGen % 1000 + if nodesCount > 0 { + buf := make([]*enode.Node, nodesCount) transport := newPingRecorder() tab, db := newTestTable(transport) defer db.Close() @@ -263,7 +328,7 @@ func TestTable_ReadRandomNodesGetAll(t *testing.T) { <-tab.initDone for i := 0; i < len(buf); i++ { - ld := cfg.Rand.Intn(len(tab.buckets)) + ld := rand.Intn(len(tab.buckets)) fillTable(tab, []*node{nodeAtDistance(tab.self().ID(), ld, intIP(ld))}) } gotN := tab.ReadRandomNodes(buf) @@ -277,32 +342,46 @@ func TestTable_ReadRandomNodesGetAll(t *testing.T) { } return true } - if err := quick.Check(test, cfg); err != nil { - t.Error(err) - } + return true } -type closeTest struct { - Self enode.ID - Target enode.ID - All []*node - N int +func TestTable_ReadRandomNodesGetAll_examples(t *testing.T) { + t.Parallel() + + randGen := rand.New(rand.NewSource(time.Now().Unix())) + + t.Run("n1", func(t *testing.T) { + testTableReadRandomNodesGetAllRun(t, 1, randGen) + }) + t.Run("n2", func(t *testing.T) { + testTableReadRandomNodesGetAllRun(t, 2, randGen) + }) + t.Run("n20", func(t *testing.T) { + testTableReadRandomNodesGetAllRun(t, 20, randGen) + }) + t.Run("n200", func(t *testing.T) { + testTableReadRandomNodesGetAllRun(t, 200, randGen) + }) } -func (*closeTest) Generate(rand *rand.Rand, size int) reflect.Value { - t := &closeTest{ - Self: gen(enode.ID{}, rand).(enode.ID), - Target: gen(enode.ID{}, rand).(enode.ID), - N: rand.Intn(bucketSize), - } - for _, id := range gen([]enode.ID{}, rand).([]enode.ID) { - r := new(enr.Record) - r.Set(enr.IP(genIP(rand))) - n := wrapNode(enode.SignNull(r, id)) - n.livenessChecks = 1 - t.All = append(t.All, n) +func generateNodes(rand *rand.Rand, count int) []*node { + nodes := make([]*node, 0, count) + for i := 0; i < count; i++ { + nodes = append(nodes, generateNode(rand)) } - return reflect.ValueOf(t) + return nodes +} + +func generateNode(rand *rand.Rand) *node { + var id enode.ID + rand.Read(id[:]) + + r := new(enr.Record) + r.Set(enr.IP(genIP(rand))) + + n := wrapNode(enode.SignNull(r, id)) + n.livenessChecks = 1 + return n } func TestTable_addVerifiedNode(t *testing.T) { @@ -396,29 +475,12 @@ func TestTable_revalidateSyncRecord(t *testing.T) { } } -// gen wraps quick.Value so it's easier to use. -// it generates a random value of the given value's type. -func gen(typ interface{}, rand *rand.Rand) interface{} { - v, ok := quick.Value(reflect.TypeOf(typ), rand) - if !ok { - panic(fmt.Sprintf("couldn't generate random value of type %T", typ)) - } - return v.Interface() -} - func genIP(rand *rand.Rand) net.IP { ip := make(net.IP, 4) rand.Read(ip) return ip } -func quickcfg() *quick.Config { - return &quick.Config{ - MaxCount: 5000, - Rand: rand.New(rand.NewSource(time.Now().Unix())), - } -} - func newkey() *ecdsa.PrivateKey { key, err := crypto.GenerateKey() if err != nil { diff --git a/p2p/discover/table_util_test.go b/p2p/discover/table_util_test.go index 26097aea8ec..c618f04de85 100644 --- a/p2p/discover/table_util_test.go +++ b/p2p/discover/table_util_test.go @@ -26,6 +26,7 @@ import ( "net" "sort" "sync" + "time" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/p2p/enode" @@ -46,7 +47,7 @@ func newTestTable(t transport) (*Table, *enode.DB) { if err != nil { panic(err) } - tab, _ := newTable(t, db, nil, log.Root()) + tab, _ := newTable(t, db, nil, time.Hour, log.Root()) go tab.loop() return tab, db } @@ -60,9 +61,16 @@ func nodeAtDistance(base enode.ID, ld int, ip net.IP) *node { // nodesAtDistance creates n nodes for which enode.LogDist(base, node.ID()) == ld. func nodesAtDistance(base enode.ID, ld int, n int) []*enode.Node { - results := make([]*enode.Node, n) - for i := range results { - results[i] = unwrapNode(nodeAtDistance(base, ld, intIP(i))) + results := make([]*enode.Node, 0, n) + nodeSet := make(map[enode.ID]bool, n) + for len(results) < n { + node := unwrapNode(nodeAtDistance(base, ld, intIP(len(results)+1))) + // idAtDistance might return an ID that's already generated + // make sure that the node has a unique ID, otherwise regenerate + if !nodeSet[node.ID()] { + nodeSet[node.ID()] = true + results = append(results, node) + } } return results } @@ -244,7 +252,7 @@ func hexEncPrivkey(h string) *ecdsa.PrivateKey { } // hexEncPubkey decodes h as a public key. -func hexEncPubkey(h string) (ret encPubkey) { +func hexEncPubkey(h string) (ret enode.PubkeyEncoded) { b, err := hex.DecodeString(h) if err != nil { panic(err) diff --git a/p2p/discover/v4_lookup_test.go b/p2p/discover/v4_lookup_test.go index a3905dc941e..bd1fb591c2f 100644 --- a/p2p/discover/v4_lookup_test.go +++ b/p2p/discover/v4_lookup_test.go @@ -14,32 +14,37 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package discover import ( + "context" "crypto/ecdsa" - "fmt" "net" "runtime" - "sort" "testing" + "time" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/p2p/discover/v4wire" "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/p2p/enr" ) func TestUDPv4_Lookup(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("fix me on win please") } - t.Parallel() - test := newUDPTest(t) + + ctx := context.Background() + ctx = contextWithReplyTimeout(ctx, time.Second) + + test := newUDPTestContext(ctx, t) + defer test.close() // Lookup on empty table returns no nodes. - targetKey, _ := decodePubkey(crypto.S256(), lookupTestnet.target[:]) + targetKey, _ := v4wire.DecodePubkey(crypto.S256(), v4wire.Pubkey(lookupTestnet.target)) if results := test.udp.LookupPubkey(targetKey); len(results) > 0 { t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) } @@ -47,21 +52,16 @@ func TestUDPv4_Lookup(t *testing.T) { // Seed table with initial node. fillTable(test.table, []*node{wrapNode(lookupTestnet.node(256, 0))}) - // Start the lookup. - resultC := make(chan []*enode.Node, 1) - go func() { - resultC <- test.udp.LookupPubkey(targetKey) - test.close() - }() - // Answer lookup packets. - serveTestnet(test, lookupTestnet) + go serveTestnet(test, lookupTestnet) + + // Start the lookup. + results := test.udp.LookupPubkey(targetKey) // Verify result nodes. - results := <-resultC t.Logf("results:") for _, e := range results { - t.Logf(" ld=%d, %x", enode.LogDist(lookupTestnet.target.id(), e.ID()), e.ID().Bytes()) + t.Logf(" ld=%d, %x", enode.LogDist(lookupTestnet.target.ID(), e.ID()), e.ID().Bytes()) } if len(results) != bucketSize { t.Errorf("wrong number of results: got %d, want %d", len(results), bucketSize) @@ -74,7 +74,19 @@ func TestUDPv4_LookupIterator(t *testing.T) { t.Skip("fix me on win please") } t.Parallel() - test := newUDPTest(t) + + // Set up RandomNodes() to use expected keys instead of generating random ones. + testNetPrivateKeys := lookupTestnet.privateKeys() + testNetPrivateKeyIndex := -1 + privateKeyGenerator := func() (*ecdsa.PrivateKey, error) { + testNetPrivateKeyIndex = (testNetPrivateKeyIndex + 1) % len(testNetPrivateKeys) + return testNetPrivateKeys[testNetPrivateKeyIndex], nil + } + ctx := context.Background() + ctx = contextWithReplyTimeout(ctx, time.Second) + ctx = contextWithPrivateKeyGenerator(ctx, privateKeyGenerator) + + test := newUDPTestContext(ctx, t) defer test.close() // Seed table with initial nodes. @@ -150,206 +162,10 @@ func serveTestnet(test *udpTest, testnet *preminedTestnet) { case *v4wire.Ping: test.packetInFrom(nil, key, to, &v4wire.Pong{Expiration: futureExp, ReplyTok: hash}) case *v4wire.Findnode: - dist := enode.LogDist(n.ID(), testnet.target.id()) + dist := enode.LogDist(n.ID(), testnet.target.ID()) nodes := testnet.nodesAtDistance(dist - 1) test.packetInFrom(nil, key, to, &v4wire.Neighbors{Expiration: futureExp, Nodes: nodes}) } }) } } - -// checkLookupResults verifies that the results of a lookup are the closest nodes to -// the testnet's target. -func checkLookupResults(t *testing.T, tn *preminedTestnet, results []*enode.Node) { - t.Helper() - t.Logf("results:") - for _, e := range results { - t.Logf(" ld=%d, %x", enode.LogDist(tn.target.id(), e.ID()), e.ID().Bytes()) - } - if hasDuplicates(wrapNodes(results)) { - t.Errorf("result set contains duplicate entries") - } - if !sortedByDistanceTo(tn.target.id(), wrapNodes(results)) { - t.Errorf("result set not sorted by distance to target") - } - wantNodes := tn.closest(len(results)) - if err := checkNodesEqual(results, wantNodes); err != nil { - t.Error(err) - } -} - -// This is the test network for the Lookup test. -// The nodes were obtained by running lookupTestnet.mine with a random NodeID as target. -var lookupTestnet = &preminedTestnet{ - target: hexEncPubkey("5d485bdcbe9bc89314a10ae9231e429d33853e3a8fa2af39f5f827370a2e4185e344ace5d16237491dad41f278f1d3785210d29ace76cd627b9147ee340b1125"), - dists: [257][]*ecdsa.PrivateKey{ - 251: { - hexEncPrivkey("29738ba0c1a4397d6a65f292eee07f02df8e58d41594ba2be3cf84ce0fc58169"), - hexEncPrivkey("511b1686e4e58a917f7f848e9bf5539d206a68f5ad6b54b552c2399fe7d174ae"), - hexEncPrivkey("d09e5eaeec0fd596236faed210e55ef45112409a5aa7f3276d26646080dcfaeb"), - hexEncPrivkey("c1e20dbbf0d530e50573bd0a260b32ec15eb9190032b4633d44834afc8afe578"), - hexEncPrivkey("ed5f38f5702d92d306143e5d9154fb21819777da39af325ea359f453d179e80b"), - }, - 252: { - hexEncPrivkey("1c9b1cafbec00848d2c174b858219914b42a7d5c9359b1ca03fd650e8239ae94"), - hexEncPrivkey("e0e1e8db4a6f13c1ffdd3e96b72fa7012293ced187c9dcdcb9ba2af37a46fa10"), - hexEncPrivkey("3d53823e0a0295cb09f3e11d16c1b44d07dd37cec6f739b8df3a590189fe9fb9"), - }, - 253: { - hexEncPrivkey("2d0511ae9bf590166597eeab86b6f27b1ab761761eaea8965487b162f8703847"), - hexEncPrivkey("6cfbd7b8503073fc3dbdb746a7c672571648d3bd15197ccf7f7fef3d904f53a2"), - hexEncPrivkey("a30599b12827b69120633f15b98a7f6bc9fc2e9a0fd6ae2ebb767c0e64d743ab"), - hexEncPrivkey("14a98db9b46a831d67eff29f3b85b1b485bb12ae9796aea98d91be3dc78d8a91"), - hexEncPrivkey("2369ff1fc1ff8ca7d20b17e2673adc3365c3674377f21c5d9dafaff21fe12e24"), - hexEncPrivkey("9ae91101d6b5048607f41ec0f690ef5d09507928aded2410aabd9237aa2727d7"), - hexEncPrivkey("05e3c59090a3fd1ae697c09c574a36fcf9bedd0afa8fe3946f21117319ca4973"), - hexEncPrivkey("06f31c5ea632658f718a91a1b1b9ae4b7549d7b3bc61cbc2be5f4a439039f3ad"), - }, - 254: { - hexEncPrivkey("dec742079ec00ff4ec1284d7905bc3de2366f67a0769431fd16f80fd68c58a7c"), - hexEncPrivkey("ff02c8861fa12fbd129d2a95ea663492ef9c1e51de19dcfbbfe1c59894a28d2b"), - hexEncPrivkey("4dded9e4eefcbce4262be4fd9e8a773670ab0b5f448f286ec97dfc8cf681444a"), - hexEncPrivkey("750d931e2a8baa2c9268cb46b7cd851f4198018bed22f4dceb09dd334a2395f6"), - hexEncPrivkey("ce1435a956a98ffec484cd11489c4f165cf1606819ab6b521cee440f0c677e9e"), - hexEncPrivkey("996e7f8d1638be92d7328b4770f47e5420fc4bafecb4324fd33b1f5d9f403a75"), - hexEncPrivkey("ebdc44e77a6cc0eb622e58cf3bb903c3da4c91ca75b447b0168505d8fc308b9c"), - hexEncPrivkey("46bd1eddcf6431bea66fc19ebc45df191c1c7d6ed552dcdc7392885009c322f0"), - }, - 255: { - hexEncPrivkey("da8645f90826e57228d9ea72aff84500060ad111a5d62e4af831ed8e4b5acfb8"), - hexEncPrivkey("3c944c5d9af51d4c1d43f5d0f3a1a7ef65d5e82744d669b58b5fed242941a566"), - hexEncPrivkey("5ebcde76f1d579eebf6e43b0ffe9157e65ffaa391175d5b9aa988f47df3e33da"), - hexEncPrivkey("97f78253a7d1d796e4eaabce721febcc4550dd68fb11cc818378ba807a2cb7de"), - hexEncPrivkey("a38cd7dc9b4079d1c0406afd0fdb1165c285f2c44f946eca96fc67772c988c7d"), - hexEncPrivkey("d64cbb3ffdf712c372b7a22a176308ef8f91861398d5dbaf326fd89c6eaeef1c"), - hexEncPrivkey("d269609743ef29d6446e3355ec647e38d919c82a4eb5837e442efd7f4218944f"), - hexEncPrivkey("d8f7bcc4a530efde1d143717007179e0d9ace405ddaaf151c4d863753b7fd64c"), - }, - 256: { - hexEncPrivkey("8c5b422155d33ea8e9d46f71d1ad3e7b24cb40051413ffa1a81cff613d243ba9"), - hexEncPrivkey("937b1af801def4e8f5a3a8bd225a8bcff1db764e41d3e177f2e9376e8dd87233"), - hexEncPrivkey("120260dce739b6f71f171da6f65bc361b5fad51db74cf02d3e973347819a6518"), - hexEncPrivkey("1fa56cf25d4b46c2bf94e82355aa631717b63190785ac6bae545a88aadc304a9"), - hexEncPrivkey("3c38c503c0376f9b4adcbe935d5f4b890391741c764f61b03cd4d0d42deae002"), - hexEncPrivkey("3a54af3e9fa162bc8623cdf3e5d9b70bf30ade1d54cc3abea8659aba6cff471f"), - hexEncPrivkey("6799a02ea1999aefdcbcc4d3ff9544478be7365a328d0d0f37c26bd95ade0cda"), - hexEncPrivkey("e24a7bc9051058f918646b0f6e3d16884b2a55a15553b89bab910d55ebc36116"), - }, - }, -} - -type preminedTestnet struct { - target encPubkey - dists [hashBits + 1][]*ecdsa.PrivateKey -} - -func (tn *preminedTestnet) len() int { - n := 0 - for _, keys := range tn.dists { - n += len(keys) - } - return n -} - -func (tn *preminedTestnet) nodes() []*enode.Node { - result := make([]*enode.Node, 0, tn.len()) - for dist, keys := range tn.dists { - for index := range keys { - result = append(result, tn.node(dist, index)) - } - } - sortByID(result) - return result -} - -func (tn *preminedTestnet) node(dist, index int) *enode.Node { - key := tn.dists[dist][index] - rec := new(enr.Record) - rec.Set(enr.IP{127, byte(dist >> 8), byte(dist), byte(index)}) - rec.Set(enr.UDP(5000)) - enode.SignV4(rec, key) - n, _ := enode.New(enode.ValidSchemes, rec) - return n -} - -func (tn *preminedTestnet) nodeByAddr(addr *net.UDPAddr) (*enode.Node, *ecdsa.PrivateKey) { - dist := int(addr.IP[1])<<8 + int(addr.IP[2]) - index := int(addr.IP[3]) - key := tn.dists[dist][index] - return tn.node(dist, index), key -} - -func (tn *preminedTestnet) nodesAtDistance(dist int) []v4wire.Node { - result := make([]v4wire.Node, len(tn.dists[dist])) - for i := range result { - result[i] = nodeToRPC(wrapNode(tn.node(dist, i))) - } - return result -} - -func (tn *preminedTestnet) neighborsAtDistances(base *enode.Node, distances []uint, elems int) []*enode.Node { - var result []*enode.Node - for d := range lookupTestnet.dists { - for i := range lookupTestnet.dists[d] { - n := lookupTestnet.node(d, i) - d := enode.LogDist(base.ID(), n.ID()) - if containsUint(uint(d), distances) { - result = append(result, n) - if len(result) >= elems { - return result - } - } - } - } - return result -} - -func (tn *preminedTestnet) closest(n int) (nodes []*enode.Node) { - for d := range tn.dists { - for i := range tn.dists[d] { - nodes = append(nodes, tn.node(d, i)) - } - } - sort.Slice(nodes, func(i, j int) bool { - return enode.DistCmp(tn.target.id(), nodes[i].ID(), nodes[j].ID()) < 0 - }) - return nodes[:n] -} - -var _ = (*preminedTestnet).mine // avoid linter warning about mine being dead code. - -// mine generates a testnet struct literal with nodes at -// various distances to the network's target. -func (tn *preminedTestnet) mine() { - // Clear existing slices first (useful when re-mining). - for i := range tn.dists { - tn.dists[i] = nil - } - - targetSha := tn.target.id() - found, need := 0, 40 - for found < need { - k := newkey() - ld := enode.LogDist(targetSha, encodePubkey(&k.PublicKey).id()) - if len(tn.dists[ld]) < 8 { - tn.dists[ld] = append(tn.dists[ld], k) - found++ - fmt.Printf("found ID with ld %d (%d/%d)\n", ld, found, need) - } - } - fmt.Printf("&preminedTestnet{\n") - fmt.Printf(" target: hexEncPubkey(\"%x\"),\n", tn.target[:]) - fmt.Printf(" dists: [%d][]*ecdsa.PrivateKey{\n", len(tn.dists)) - for ld, ns := range tn.dists { - if len(ns) == 0 { - continue - } - fmt.Printf(" %d: {\n", ld) - for _, key := range ns { - fmt.Printf(" hexEncPrivkey(\"%x\"),\n", crypto.FromECDSA(key)) - } - fmt.Printf(" },\n") - } - fmt.Printf(" },\n") - fmt.Printf("}\n") -} diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go index e084e9064f6..38687292d3f 100644 --- a/p2p/discover/v4_udp.go +++ b/p2p/discover/v4_udp.go @@ -21,7 +21,6 @@ import ( "container/list" "context" "crypto/ecdsa" - crand "crypto/rand" "errors" "fmt" "io" @@ -34,7 +33,6 @@ import ( "github.com/ledgerwatch/erigon/p2p/discover/v4wire" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/p2p/netutil" - "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/log/v3" ) @@ -79,8 +77,12 @@ type UDPv4 struct { addReplyMatcher chan *replyMatcher gotreply chan reply + replyTimeout time.Duration + pingBackDelay time.Duration closeCtx context.Context cancelCloseCtx context.CancelFunc + + privateKeyGenerator func() (*ecdsa.PrivateKey, error) } // replyMatcher represents a pending reply. @@ -128,9 +130,9 @@ type reply struct { matched chan<- bool } -func ListenV4(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { - cfg = cfg.withDefaults() - closeCtx, cancel := context.WithCancel(context.Background()) +func ListenV4(ctx context.Context, c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { + cfg = cfg.withDefaults(respTimeout) + closeCtx, cancel := context.WithCancel(ctx) t := &UDPv4{ conn: c, priv: cfg.PrivateKey, @@ -139,12 +141,16 @@ func ListenV4(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { db: ln.Database(), gotreply: make(chan reply), addReplyMatcher: make(chan *replyMatcher), + replyTimeout: cfg.ReplyTimeout, + pingBackDelay: cfg.PingBackDelay, closeCtx: closeCtx, cancelCloseCtx: cancel, log: cfg.Log, + + privateKeyGenerator: cfg.PrivateKeyGenerator, } - tab, err := newTable(t, ln.Database(), cfg.Bootnodes, t.log) + tab, err := newTable(t, ln.Database(), cfg.Bootnodes, cfg.TableRevalidateInterval, cfg.Log) if err != nil { return nil, err } @@ -218,7 +224,7 @@ func (t *UDPv4) Ping(n *enode.Node) error { func (t *UDPv4) ping(n *enode.Node) (seq uint64, err error) { rm := t.sendPing(n.ID(), &net.UDPAddr{IP: n.IP(), Port: n.UDP()}, nil) if err = <-rm.errc; err == nil { - seq = rm.reply.(*v4wire.Pong).ENRSeq() + seq = rm.reply.(*v4wire.Pong).ENRSeq } return seq, err } @@ -249,13 +255,12 @@ func (t *UDPv4) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) *r } func (t *UDPv4) makePing(toaddr *net.UDPAddr) *v4wire.Ping { - seq, _ := rlp.EncodeToBytes(t.localNode.Node().Seq()) return &v4wire.Ping{ Version: 4, From: t.ourEndpoint(), To: v4wire.NewEndpoint(toaddr, 0), Expiration: uint64(time.Now().Add(expiration).Unix()), - Rest: []rlp.RawValue{seq}, + ENRSeq: t.localNode.Node().Seq(), } } @@ -266,7 +271,7 @@ func (t *UDPv4) LookupPubkey(key *ecdsa.PublicKey) []*enode.Node { // case and run the bootstrapping logic. <-t.tab.refresh() } - return t.newLookup(t.closeCtx, encodePubkey(key)).run() + return t.newLookup(t.closeCtx, key).run() } // RandomNodes is an iterator yielding nodes from a random walk of the DHT. @@ -281,26 +286,35 @@ func (t *UDPv4) lookupRandom() []*enode.Node { // lookupSelf implements transport. func (t *UDPv4) lookupSelf() []*enode.Node { - return t.newLookup(t.closeCtx, encodePubkey(&t.priv.PublicKey)).run() + return t.newLookup(t.closeCtx, &t.priv.PublicKey).run() } func (t *UDPv4) newRandomLookup(ctx context.Context) *lookup { - var target encPubkey - crand.Read(target[:]) - return t.newLookup(ctx, target) + key, err := t.privateKeyGenerator() + if err != nil { + t.log.Warn("Failed to generate a random node key for newRandomLookup", "err", err) + key = t.priv + } + return t.newLookup(ctx, &key.PublicKey) } -func (t *UDPv4) newLookup(ctx context.Context, targetKey encPubkey) *lookup { - target := enode.ID(crypto.Keccak256Hash(targetKey[:])) - ekey := v4wire.Pubkey(targetKey) +func (t *UDPv4) newLookup(ctx context.Context, targetKey *ecdsa.PublicKey) *lookup { + targetKeyEnc := v4wire.EncodePubkey(targetKey) + target := enode.PubkeyEncoded(targetKeyEnc).ID() it := newLookup(ctx, t.tab, target, func(n *node) ([]*node, error) { - return t.findnode(n.ID(), n.addr(), ekey) + return t.findnode(n.ID(), n.addr(), targetKeyEnc) }) return it } -// findnode sends a findnode request to the given node and waits until -// the node has sent up to k neighbors. +// FindNode sends a "FindNode" request to the given node and waits until +// the node has sent up to bucketSize neighbors or a respTimeout has passed. +func (t *UDPv4) FindNode(toNode *enode.Node, targetKey *ecdsa.PublicKey) ([]*enode.Node, error) { + targetKeyEnc := v4wire.EncodePubkey(targetKey) + nodes, err := t.findnode(toNode.ID(), wrapNode(toNode).addr(), targetKeyEnc) + return unwrapNodes(nodes), err +} + func (t *UDPv4) findnode(toid enode.ID, toaddr *net.UDPAddr, target v4wire.Pubkey) ([]*node, error) { t.ensureBond(toid, toaddr) @@ -385,7 +399,7 @@ func (t *UDPv4) RequestENR(n *enode.Node) (*enode.Node, error) { return n, nil // response record is older } if err := netutil.CheckRelayIP(addr.IP, respN.IP()); err != nil { - return nil, fmt.Errorf("invalid IP in response record: %v", err) + return nil, fmt.Errorf("invalid IP in response record: %w", err) } return respN, nil } @@ -441,7 +455,7 @@ func (t *UDPv4) loop() { now := time.Now() for el := plist.Front(); el != nil; el = el.Next() { nextTimeout = el.Value.(*replyMatcher) - if dist := nextTimeout.deadline.Sub(now); dist < 2*respTimeout { + if dist := nextTimeout.deadline.Sub(now); dist < 2*t.replyTimeout { timeout.Reset(dist) return } @@ -466,7 +480,7 @@ func (t *UDPv4) loop() { return case p := <-t.addReplyMatcher: - p.deadline = time.Now().Add(respTimeout) + p.deadline = time.Now().Add(t.replyTimeout) plist.PushBack(p) case r := <-t.gotreply: @@ -540,12 +554,12 @@ func (t *UDPv4) readLoop(unhandled chan<- ReadPacket) { nbytes, from, err := t.conn.ReadFromUDP(buf) if netutil.IsTemporaryError(err) { // Ignore temporary read errors. - t.log.Debug("Temporary UDP read error", "err", err) + t.log.Trace("Temporary UDP read error", "err", err) continue } else if err != nil { // Shut down the loop for permament errors. if err != io.EOF { - t.log.Debug("UDP read error", "err", err) + t.log.Trace("UDP read error", "err", err) } return } @@ -561,11 +575,11 @@ func (t *UDPv4) readLoop(unhandled chan<- ReadPacket) { func (t *UDPv4) handlePacket(from *net.UDPAddr, buf []byte) error { rawpacket, fromKey, hash, err := v4wire.Decode(buf) if err != nil { - t.log.Debug("Bad discv4 packet", "addr", from, "err", err) + t.log.Trace("Bad discv4 packet", "addr", from, "err", err) return err } packet := t.wrapPacket(rawpacket) - fromID := fromKey.ID() + fromID := enode.PubkeyEncoded(fromKey).ID() if packet.preverify != nil { err = packet.preverify(packet, from, fromID, fromKey) } @@ -589,7 +603,7 @@ func (t *UDPv4) ensureBond(toid enode.ID, toaddr *net.UDPAddr) { rm := t.sendPing(toid, toaddr, nil) <-rm.errc // Wait for them to ping back and process our pong. - time.Sleep(respTimeout) + time.Sleep(t.pingBackDelay) } } @@ -676,14 +690,12 @@ func (t *UDPv4) handlePing(h *packetHandlerV4, from *net.UDPAddr, fromID enode.I req := h.Packet.(*v4wire.Ping) // Reply. - seq, _ := rlp.EncodeToBytes(t.localNode.Node().Seq()) - //nolint:errcheck t.send(from, fromID, &v4wire.Pong{ To: v4wire.NewEndpoint(from, req.From.TCP), ReplyTok: mac, Expiration: uint64(time.Now().Add(expiration).Unix()), - Rest: []rlp.RawValue{seq}, + ENRSeq: t.localNode.Node().Seq(), }) // Ping back if our last pong on file is too far in the past. @@ -741,7 +753,7 @@ func (t *UDPv4) handleFindnode(h *packetHandlerV4, from *net.UDPAddr, fromID eno req := h.Packet.(*v4wire.Findnode) // Determine closest nodes. - target := enode.ID(crypto.Keccak256Hash(req.Target[:])) + target := enode.PubkeyEncoded(req.Target).ID() closest := t.tab.findnodeByID(target, bucketSize, true).entries // Send neighbors in chunks with at most maxNeighbors per packet diff --git a/p2p/discover/v4_udp_test.go b/p2p/discover/v4_udp_test.go index d9ee8396cfe..6199b9a9ef7 100644 --- a/p2p/discover/v4_udp_test.go +++ b/p2p/discover/v4_udp_test.go @@ -18,6 +18,7 @@ package discover import ( "bytes" + "context" "crypto/ecdsa" crand "crypto/rand" "encoding/binary" @@ -28,15 +29,15 @@ import ( "net" "reflect" "runtime" - "sync" "testing" "time" + "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/internal/testlog" "github.com/ledgerwatch/erigon/p2p/discover/v4wire" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/p2p/enr" - "github.com/ledgerwatch/log/v3" ) // shared test variables @@ -60,6 +61,17 @@ type udpTest struct { } func newUDPTest(t *testing.T) *udpTest { + return newUDPTestContext(context.Background(), t) +} + +func newUDPTestContext(ctx context.Context, t *testing.T) *udpTest { + ctx = disableLookupSlowdown(ctx) + + replyTimeout := contextGetReplyTimeout(ctx) + if replyTimeout == 0 { + replyTimeout = 50 * time.Millisecond + } + test := &udpTest{ t: t, pipe: newpipe(), @@ -74,10 +86,21 @@ func newUDPTest(t *testing.T) *udpTest { panic(err) } ln := enode.NewLocalNode(test.db, test.localkey) - test.udp, _ = ListenV4(test.pipe, ln, Config{ + test.udp, err = ListenV4(ctx, test.pipe, ln, Config{ PrivateKey: test.localkey, - Log: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), + + ReplyTimeout: replyTimeout, + + PingBackDelay: time.Nanosecond, + + PrivateKeyGenerator: contextGetPrivateKeyGenerator(ctx), + + TableRevalidateInterval: time.Hour, }) + if err != nil { + panic(err) + } test.table = test.udp.tab // Wait for initial refresh so the table doesn't send unexpected findnode. <-test.table.initDone @@ -105,7 +128,11 @@ func (test *udpTest) packetInFrom(wantError error, key *ecdsa.PrivateKey, addr * test.t.Errorf("%s encode error: %v", data.Name(), err) } test.sent = append(test.sent, enc) - if err = test.udp.handlePacket(addr, enc); err != wantError { + + err = test.udp.handlePacket(addr, enc) + if (wantError == nil) && (err != nil) { + test.t.Errorf("handlePacket error: %q", err) + } else if (wantError != nil) && (err != wantError) { test.t.Errorf("error mismatch: got %q, want %q", err, wantError) } } @@ -166,8 +193,15 @@ func (req testPacket) Kind() byte { return byte(req) } func (req testPacket) Name() string { return "" } func TestUDPv4_responseTimeouts(t *testing.T) { + if runtime.GOOS == `darwin` { + t.Skip("unstable test on darwin") + } t.Parallel() - test := newUDPTest(t) + + ctx := context.Background() + ctx = contextWithReplyTimeout(ctx, respTimeout) + + test := newUDPTestContext(ctx, t) defer test.close() rand.Seed(time.Now().UnixNano()) @@ -261,7 +295,8 @@ func TestUDPv4_findnode(t *testing.T) { // put a few nodes into the table. their exact // distribution shouldn't matter much, although we need to // take care not to overflow any bucket. - nodes := &nodesByDistance{target: testTarget.ID()} + testTargetID := enode.PubkeyEncoded(testTarget).ID() + nodes := &nodesByDistance{target: testTargetID} live := make(map[enode.ID]bool) numCandidates := 2 * bucketSize for i := 0; i < numCandidates; i++ { @@ -279,11 +314,11 @@ func TestUDPv4_findnode(t *testing.T) { // ensure there's a bond with the test node, // findnode won't be accepted otherwise. - remoteID := v4wire.EncodePubkey(&test.remotekey.PublicKey).ID() + remoteID := enode.PubkeyToIDV4(&test.remotekey.PublicKey) test.table.db.UpdateLastPongReceived(remoteID, test.remoteaddr.IP, time.Now()) // check that closest neighbors are returned. - expected := test.table.findnodeByID(testTarget.ID(), bucketSize, true) + expected := test.table.findnodeByID(testTargetID, bucketSize, true) test.packetIn(nil, &v4wire.Findnode{Target: testTarget, Expiration: futureExp}) waitNeighbors := func(want []*node) { test.waitPacketOut(func(p *v4wire.Neighbors, to *net.UDPAddr, hash []byte) { @@ -291,11 +326,12 @@ func TestUDPv4_findnode(t *testing.T) { t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) } for i, n := range p.Nodes { - if n.ID.ID() != want[i].ID() { + nodeID := enode.PubkeyEncoded(n.ID).ID() + if nodeID != want[i].ID() { t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, n, expected.entries[i]) } - if !live[n.ID.ID()] { - t.Errorf("result includes dead node %v", n.ID.ID()) + if !live[nodeID] { + t.Errorf("result includes dead node %v", nodeID) } } }) @@ -319,7 +355,7 @@ func TestUDPv4_findnodeMultiReply(t *testing.T) { // queue a pending findnode request resultc, errc := make(chan []*node), make(chan error) go func() { - rid := encodePubkey(&test.remotekey.PublicKey).id() + rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey) ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget) if err != nil && len(ns) == 0 { errc <- err @@ -443,7 +479,7 @@ func TestUDPv4_successfulPing(t *testing.T) { // pong packet. select { case n := <-added: - rid := encodePubkey(&test.remotekey.PublicKey).id() + rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey) if n.ID() != rid { t.Errorf("node has wrong ID: got %v, want %v", n.ID(), rid) } @@ -475,13 +511,13 @@ func TestUDPv4_EIP868(t *testing.T) { // Perform endpoint proof and check for sequence number in packet tail. test.packetIn(nil, &v4wire.Ping{Expiration: futureExp}) test.waitPacketOut(func(p *v4wire.Pong, addr *net.UDPAddr, hash []byte) { - if p.ENRSeq() != wantNode.Seq() { - t.Errorf("wrong sequence number in pong: %d, want %d", p.ENRSeq(), wantNode.Seq()) + if p.ENRSeq != wantNode.Seq() { + t.Errorf("wrong sequence number in pong: %d, want %d", p.ENRSeq, wantNode.Seq()) } }) test.waitPacketOut(func(p *v4wire.Ping, addr *net.UDPAddr, hash []byte) { - if p.ENRSeq() != wantNode.Seq() { - t.Errorf("wrong sequence number in ping: %d, want %d", p.ENRSeq(), wantNode.Seq()) + if p.ENRSeq != wantNode.Seq() { + t.Errorf("wrong sequence number in ping: %d, want %d", p.ENRSeq, wantNode.Seq()) } test.packetIn(nil, &v4wire.Pong{Expiration: futureExp, ReplyTok: hash}) }) @@ -506,6 +542,9 @@ func TestUDPv4_smallNetConvergence(t *testing.T) { } t.Parallel() + ctx := context.Background() + ctx = disableLookupSlowdown(ctx) + // Start the network. nodes := make([]*UDPv4, 4) for i := range nodes { @@ -514,10 +553,19 @@ func TestUDPv4_smallNetConvergence(t *testing.T) { bn := nodes[0].Self() cfg.Bootnodes = []*enode.Node{bn} } - nodes[i] = startLocalhostV4(t, cfg) - defer nodes[i].Close() + cfg.ReplyTimeout = 50 * time.Millisecond + cfg.PingBackDelay = time.Nanosecond + cfg.TableRevalidateInterval = time.Hour + + nodes[i] = startLocalhostV4(ctx, t, cfg) } + defer func() { + for _, node := range nodes { + node.Close() + } + }() + // Run through the iterator on all nodes until // they have all found each other. status := make(chan error, len(nodes)) @@ -538,14 +586,13 @@ func TestUDPv4_smallNetConvergence(t *testing.T) { } // Wait for all status reports. - timeout := time.NewTimer(30 * time.Second) + timeout := time.NewTimer(5 * time.Second) defer timeout.Stop() for received := 0; received < len(nodes); { select { case <-timeout.C: - for _, node := range nodes { - node.Close() - } + t.Fatalf("Failed to converge within timeout") + return case err := <-status: received++ if err != nil { @@ -556,7 +603,7 @@ func TestUDPv4_smallNetConvergence(t *testing.T) { } } -func startLocalhostV4(t *testing.T, cfg Config) *UDPv4 { +func startLocalhostV4(ctx context.Context, t *testing.T, cfg Config) *UDPv4 { t.Helper() cfg.PrivateKey = newkey() @@ -569,7 +616,7 @@ func startLocalhostV4(t *testing.T, cfg Config) *UDPv4 { // Prefix logs with node ID. lprefix := fmt.Sprintf("(%s)", ln.ID().TerminalString()) lfmt := log.TerminalFormat() - cfg.Log = testlog.Logger(t, log.LvlTrace) + cfg.Log = testlog.Logger(t, log.LvlError) cfg.Log.SetHandler(log.FuncHandler(func(r *log.Record) error { t.Logf("%s %s", lprefix, lfmt.Format(r)) return nil @@ -583,20 +630,35 @@ func startLocalhostV4(t *testing.T, cfg Config) *UDPv4 { realaddr := socket.LocalAddr().(*net.UDPAddr) ln.SetStaticIP(realaddr.IP) ln.SetFallbackUDP(realaddr.Port) - udp, err := ListenV4(socket, ln, cfg) + udp, err := ListenV4(ctx, socket, ln, cfg) if err != nil { t.Fatal(err) } return udp } +func contextWithReplyTimeout(ctx context.Context, value time.Duration) context.Context { + return context.WithValue(ctx, "p2p.discover.Config.ReplyTimeout", value) +} + +func contextGetReplyTimeout(ctx context.Context) time.Duration { + value, _ := ctx.Value("p2p.discover.Config.ReplyTimeout").(time.Duration) + return value +} + +func contextWithPrivateKeyGenerator(ctx context.Context, value func() (*ecdsa.PrivateKey, error)) context.Context { + return context.WithValue(ctx, "p2p.discover.Config.PrivateKeyGenerator", value) +} + +func contextGetPrivateKeyGenerator(ctx context.Context) func() (*ecdsa.PrivateKey, error) { + value, _ := ctx.Value("p2p.discover.Config.PrivateKeyGenerator").(func() (*ecdsa.PrivateKey, error)) + return value +} + // dgramPipe is a fake UDP socket. It queues all sent datagrams. type dgramPipe struct { - mu *sync.Mutex - cond *sync.Cond - closing chan struct{} - closed bool - queue []dgram + queue chan dgram + closed chan struct{} } type dgram struct { @@ -605,11 +667,9 @@ type dgram struct { } func newpipe() *dgramPipe { - mu := new(sync.Mutex) return &dgramPipe{ - closing: make(chan struct{}), - cond: &sync.Cond{L: mu}, - mu: mu, + make(chan dgram, 1000), + make(chan struct{}), } } @@ -617,30 +677,24 @@ func newpipe() *dgramPipe { func (c *dgramPipe) WriteToUDP(b []byte, to *net.UDPAddr) (n int, err error) { msg := make([]byte, len(b)) copy(msg, b) - c.mu.Lock() - defer c.mu.Unlock() - if c.closed { - return 0, errors.New("closed") - } - c.queue = append(c.queue, dgram{*to, b}) - c.cond.Signal() + + n = 0 + err = errors.New("closed") + defer recover() + + c.queue <- dgram{*to, b} return len(b), nil } // ReadFromUDP just hangs until the pipe is closed. func (c *dgramPipe) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { - <-c.closing + <-c.closed return 0, nil, io.EOF } func (c *dgramPipe) Close() error { - c.mu.Lock() - defer c.mu.Unlock() - if !c.closed { - close(c.closing) - c.closed = true - } - c.cond.Broadcast() + close(c.queue) + close(c.closed) return nil } @@ -649,29 +703,16 @@ func (c *dgramPipe) LocalAddr() net.Addr { } func (c *dgramPipe) receive() (dgram, error) { - c.mu.Lock() - defer c.mu.Unlock() - - var timedOut bool - timer := time.AfterFunc(3*time.Second, func() { - c.mu.Lock() - timedOut = true - c.mu.Unlock() - c.cond.Broadcast() - }) - defer timer.Stop() + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() - for len(c.queue) == 0 && !c.closed && !timedOut { - c.cond.Wait() - } - if c.closed { + select { + case p, isOpen := <-c.queue: + if isOpen { + return p, nil + } return dgram{}, errClosed - } - if timedOut { + case <-ctx.Done(): return dgram{}, errTimeout } - p := c.queue[0] - copy(c.queue, c.queue[1:]) - c.queue = c.queue[:len(c.queue)-1] - return p, nil } diff --git a/p2p/discover/v4wire/v4wire.go b/p2p/discover/v4wire/v4wire.go index 8b678964399..bca303f0bd6 100644 --- a/p2p/discover/v4wire/v4wire.go +++ b/p2p/discover/v4wire/v4wire.go @@ -29,7 +29,6 @@ import ( "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/p2p/enr" "github.com/ledgerwatch/erigon/rlp" ) @@ -50,6 +49,8 @@ type ( Version uint From, To Endpoint Expiration uint64 + ENRSeq uint64 `rlp:"optional"` // Sequence number of local record, added by EIP-868. + // Ignore additional fields (for forward compatibility). Rest []rlp.RawValue `rlp:"tail"` } @@ -62,6 +63,8 @@ type ( To Endpoint ReplyTok []byte // This contains the hash of the ping packet. Expiration uint64 // Absolute timestamp at which the packet becomes invalid. + ENRSeq uint64 `rlp:"optional"` // Sequence number of local record, added by EIP-868. + // Ignore additional fields (for forward compatibility). Rest []rlp.RawValue `rlp:"tail"` } @@ -125,11 +128,6 @@ const MaxNeighbors = 12 // Pubkey represents an encoded 64-byte secp256k1 public key. type Pubkey [64]byte -// ID returns the node ID corresponding to the public key. -func (e Pubkey) ID() enode.ID { - return enode.ID(crypto.Keccak256Hash(e[:])) -} - // Node represents information about a node. type Node struct { IP net.IP // len 4 for IPv4 or 16 for IPv6 @@ -162,13 +160,11 @@ type Packet interface { Kind() byte } -func (req *Ping) Name() string { return "PING/v4" } -func (req *Ping) Kind() byte { return PingPacket } -func (req *Ping) ENRSeq() uint64 { return seqFromTail(req.Rest) } +func (req *Ping) Name() string { return "PING/v4" } +func (req *Ping) Kind() byte { return PingPacket } -func (req *Pong) Name() string { return "PONG/v4" } -func (req *Pong) Kind() byte { return PongPacket } -func (req *Pong) ENRSeq() uint64 { return seqFromTail(req.Rest) } +func (req *Pong) Name() string { return "PONG/v4" } +func (req *Pong) Kind() byte { return PongPacket } func (req *Findnode) Name() string { return "FINDNODE/v4" } func (req *Findnode) Kind() byte { return FindnodePacket } @@ -187,15 +183,6 @@ func Expired(ts uint64) bool { return time.Unix(int64(ts), 0).Before(time.Now()) } -func seqFromTail(tail []rlp.RawValue) uint64 { - if len(tail) == 0 { - return 0 - } - var seq uint64 - rlp.DecodeBytes(tail[0], &seq) //nolint:errcheck - return seq -} - // Encoder/decoder. const ( @@ -279,7 +266,8 @@ func recoverNodeKey(hash, sig []byte) (key Pubkey, err error) { return key, nil } -// EncodePubkey encodes a secp256k1 public key. +// EncodePubkey converts a public key into a binary format. +// The logic matches DecodePubkey. func EncodePubkey(key *ecdsa.PublicKey) Pubkey { var e Pubkey math.ReadBits(key.X, e[:len(e)/2]) diff --git a/p2p/discover/v4wire/v4wire_test.go b/p2p/discover/v4wire/v4wire_test.go index 764451cef97..ba2824a8bd0 100644 --- a/p2p/discover/v4wire/v4wire_test.go +++ b/p2p/discover/v4wire/v4wire_test.go @@ -23,7 +23,6 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/rlp" ) @@ -40,7 +39,6 @@ var testPackets = []struct { From: Endpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, To: Endpoint{net.ParseIP("::1"), 2222, 3333}, Expiration: 1136239445, - Rest: []rlp.RawValue{}, }, }, { @@ -50,26 +48,8 @@ var testPackets = []struct { From: Endpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, To: Endpoint{net.ParseIP("::1"), 2222, 3333}, Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}}, - }, - }, - { - input: "577be4349c4dd26768081f58de4c6f375a7a22f3f7adda654d1428637412c3d7fe917cadc56d4e5e7ffae1dbe3efffb9849feb71b262de37977e7c7a44e677295680e9e38ab26bee2fcbae207fba3ff3d74069a50b902a82c9903ed37cc993c50001f83e82022bd79020010db83c4d001500000000abcdef12820cfa8215a8d79020010db885a308d313198a2e037073488208ae82823a8443b9a355c5010203040531b9019afde696e582a78fa8d95ea13ce3297d4afb8ba6433e4154caa5ac6431af1b80ba76023fa4090c408f6b4bc3701562c031041d4702971d102c9ab7fa5eed4cd6bab8f7af956f7d565ee1917084a95398b6a21eac920fe3dd1345ec0a7ef39367ee69ddf092cbfe5b93e5e568ebc491983c09c76d922dc3", - wantPacket: &Ping{ - Version: 555, - From: Endpoint{net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), 3322, 5544}, - To: Endpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC5, 0x01, 0x02, 0x03, 0x04, 0x05}}, - }, - }, - { - input: "09b2428d83348d27cdf7064ad9024f526cebc19e4958f0fdad87c15eb598dd61d08423e0bf66b2069869e1724125f820d851c136684082774f870e614d95a2855d000f05d1648b2d5945470bc187c2d2216fbe870f43ed0909009882e176a46b0102f846d79020010db885a308d313198a2e037073488208ae82823aa0fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c9548443b9a355c6010203c2040506a0c969a58f6f9095004c0177a6b47f451530cab38966a25cca5cb58f055542124e", - wantPacket: &Pong{ - To: Endpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - ReplyTok: common.Hex2Bytes("fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c954"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC6, 0x01, 0x02, 0x03, 0xC2, 0x04, 0x05}, {0x06}}, + ENRSeq: 1, + Rest: []rlp.RawValue{{0x02}}, }, }, { diff --git a/p2p/discover/v5_lookup_test.go b/p2p/discover/v5_lookup_test.go new file mode 100644 index 00000000000..f8b26aaa0aa --- /dev/null +++ b/p2p/discover/v5_lookup_test.go @@ -0,0 +1,119 @@ +//go:build integration + +package discover + +import ( + "math/rand" + "net" + "runtime" + "sort" + "testing" + + "github.com/ledgerwatch/erigon/p2p/discover/v5wire" + "github.com/ledgerwatch/erigon/p2p/enode" +) + +// This test checks that lookup works. +func TestUDPv5_lookup(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("fix me on win please") + } + t.Parallel() + test := newUDPV5Test(t) + t.Cleanup(test.close) + + // Lookup on empty table returns no nodes. + if results := test.udp.Lookup(lookupTestnet.target.ID()); len(results) > 0 { + t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) + } + + // Ensure the tester knows all nodes in lookupTestnet by IP. + for d, nn := range lookupTestnet.dists { + for i, key := range nn { + n := lookupTestnet.node(d, i) + test.getNode(key, &net.UDPAddr{IP: n.IP(), Port: n.UDP()}) + } + } + + // Seed table with initial node. + initialNode := lookupTestnet.node(256, 0) + fillTable(test.table, []*node{wrapNode(initialNode)}) + + // Start the lookup. + resultC := make(chan []*enode.Node, 1) + go func() { + resultC <- test.udp.Lookup(lookupTestnet.target.ID()) + test.close() + }() + + // Answer lookup packets. + asked := make(map[enode.ID]bool) + for done := false; !done; { + done = test.waitPacketOut(func(p v5wire.Packet, to *net.UDPAddr, _ v5wire.Nonce) { + recipient, key := lookupTestnet.nodeByAddr(to) + switch p := p.(type) { + case *v5wire.Ping: + test.packetInFrom(key, to, &v5wire.Pong{ReqID: p.ReqID}) + case *v5wire.Findnode: + if asked[recipient.ID()] { + t.Error("Asked node", recipient.ID(), "twice") + } + asked[recipient.ID()] = true + nodes := lookupTestnet.neighborsAtDistances(recipient, p.Distances, 16) + t.Logf("Got FINDNODE for %v, returning %d nodes", p.Distances, len(nodes)) + for _, resp := range packNodes(p.ReqID, nodes) { + test.packetInFrom(key, to, resp) + } + } + }) + } + + // Verify result nodes. + results := <-resultC + checkLookupResults(t, lookupTestnet, results) +} + +// Real sockets, real crypto: this test checks end-to-end connectivity for UDPv5. +func TestUDPv5_lookupE2E(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("fix me on win please") + } + t.Parallel() + + bootNode := startLocalhostV5(t, Config{}) + bootNodeRec := bootNode.Self() + + const N = 5 + nodes := []*UDPv5{bootNode} + for len(nodes) < N { + cfg := Config{ + Bootnodes: []*enode.Node{bootNodeRec}, + } + node := startLocalhostV5(t, cfg) + nodes = append(nodes, node) + } + + defer func() { + for _, node := range nodes { + node.Close() + } + }() + + last := nodes[N-1] + target := nodes[rand.Intn(N-2)].Self() + + // It is expected that all nodes can be found. + expectedResult := make([]*enode.Node, len(nodes)) + for i := range nodes { + expectedResult[i] = nodes[i].Self() + } + sort.Slice(expectedResult, func(i, j int) bool { + return enode.DistCmp(target.ID(), expectedResult[i].ID(), expectedResult[j].ID()) < 0 + }) + + // Do the lookup. + results := last.Lookup(target.ID()) + if err := checkNodesEqual(results, expectedResult); err != nil { + t.Fatalf("lookup returned wrong results: %v", err) + } +} diff --git a/p2p/discover/v5_udp.go b/p2p/discover/v5_udp.go index 5f11efa03a3..f27a075dc7d 100644 --- a/p2p/discover/v5_udp.go +++ b/p2p/discover/v5_udp.go @@ -29,6 +29,7 @@ import ( "sync" "time" + common2 "github.com/ledgerwatch/erigon-lib/common/cmp" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/common/mclock" "github.com/ledgerwatch/erigon/p2p/discover/v5wire" @@ -83,6 +84,7 @@ type UDPv5 struct { callCh chan *callV5 callDoneCh chan *callV5 respTimeoutCh chan *callTimeout + replyTimeout time.Duration // state of dispatch codec codecV5 @@ -123,8 +125,8 @@ type callTimeout struct { } // ListenV5 listens on the given connection. -func ListenV5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { - t, err := newUDPv5(conn, ln, cfg) +func ListenV5(ctx context.Context, conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { + t, err := newUDPv5(ctx, conn, ln, cfg) if err != nil { return nil, err } @@ -136,9 +138,9 @@ func ListenV5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { } // newUDPv5 creates a UDPv5 transport, but doesn't start any goroutines. -func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { - closeCtx, cancelCloseCtx := context.WithCancel(context.Background()) - cfg = cfg.withDefaults() +func newUDPv5(ctx context.Context, conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { + closeCtx, cancelCloseCtx := context.WithCancel(ctx) + cfg = cfg.withDefaults(respTimeoutV5) t := &UDPv5{ // static fields conn: conn, @@ -156,6 +158,7 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { callCh: make(chan *callV5), callDoneCh: make(chan *callV5), respTimeoutCh: make(chan *callTimeout), + replyTimeout: cfg.ReplyTimeout, // state of dispatch codec: v5wire.NewCodec(ln, cfg.PrivateKey, cfg.Clock), activeCallByNode: make(map[enode.ID]*callV5), @@ -165,7 +168,7 @@ func newUDPv5(conn UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv5, error) { closeCtx: closeCtx, cancelCloseCtx: cancelCloseCtx, } - tab, err := newTable(t, t.db, cfg.Bootnodes, cfg.Log) + tab, err := newTable(t, t.db, cfg.Bootnodes, cfg.TableRevalidateInterval, cfg.Log) if err != nil { return nil, err } @@ -382,13 +385,13 @@ func (t *UDPv5) waitForNodes(c *callV5, distances []uint) ([]*enode.Node, error) for _, record := range response.Nodes { node, err := t.verifyResponseNode(c, record, distances, seen) if err != nil { - t.log.Debug("Invalid record in "+response.Name(), "id", c.node.ID(), "err", err) + t.log.Trace("Invalid record in "+response.Name(), "id", c.node.ID(), "err", err) continue } nodes = append(nodes, node) } if total == -1 { - total = min(int(response.Total), totalNodesResponseLimit) + total = common2.Min(int(response.Total), totalNodesResponseLimit) } if received++; received == total { return nodes, nil @@ -549,7 +552,7 @@ func (t *UDPv5) startResponseTimeout(c *callV5) { timer mclock.Timer done = make(chan struct{}) ) - timer = t.clock.AfterFunc(respTimeoutV5, func() { + timer = t.clock.AfterFunc(t.replyTimeout, func() { <-done select { case t.respTimeoutCh <- &callTimeout{c, timer}: @@ -622,12 +625,12 @@ func (t *UDPv5) readLoop() { nbytes, from, err := t.conn.ReadFromUDP(buf) if netutil.IsTemporaryError(err) { // Ignore temporary read errors. - t.log.Debug("Temporary UDP read error", "err", err) + t.log.Trace("Temporary UDP read error", "err", err) continue } else if err != nil { // Shut down the loop for permament errors. if err != io.EOF { - t.log.Debug("UDP read error", "err", err) + t.log.Trace("UDP read error", "err", err) } return } @@ -650,7 +653,7 @@ func (t *UDPv5) handlePacket(rawpacket []byte, fromAddr *net.UDPAddr) error { addr := fromAddr.String() fromID, fromNode, packet, err := t.codec.Decode(rawpacket, addr) if err != nil { - t.log.Debug("Bad discv5 packet", "id", fromID, "addr", addr, "err", err) + t.log.Trace("Bad discv5 packet", "id", fromID, "addr", addr, "err", err) return err } if fromNode != nil { @@ -669,15 +672,15 @@ func (t *UDPv5) handlePacket(rawpacket []byte, fromAddr *net.UDPAddr) error { func (t *UDPv5) handleCallResponse(fromID enode.ID, fromAddr *net.UDPAddr, p v5wire.Packet) bool { ac := t.activeCallByNode[fromID] if ac == nil || !bytes.Equal(p.RequestID(), ac.reqid) { - t.log.Debug(fmt.Sprintf("Unsolicited/late %s response", p.Name()), "id", fromID, "addr", fromAddr) + t.log.Trace(fmt.Sprintf("Unsolicited/late %s response", p.Name()), "id", fromID, "addr", fromAddr) return false } if !fromAddr.IP.Equal(ac.node.IP()) || fromAddr.Port != ac.node.UDP() { - t.log.Debug(fmt.Sprintf("%s from wrong endpoint", p.Name()), "id", fromID, "addr", fromAddr) + t.log.Trace(fmt.Sprintf("%s from wrong endpoint", p.Name()), "id", fromID, "addr", fromAddr) return false } if p.Kind() != ac.responseType { - t.log.Debug(fmt.Sprintf("Wrong discv5 response type %s", p.Name()), "id", fromID, "addr", fromAddr) + t.log.Trace(fmt.Sprintf("Wrong discv5 response type %s", p.Name()), "id", fromID, "addr", fromAddr) return false } t.startResponseTimeout(ac) @@ -827,11 +830,11 @@ func packNodes(reqid []byte, nodes []*enode.Node) []*v5wire.Nodes { return []*v5wire.Nodes{{ReqID: reqid, Total: 1}} } - total := uint8(math.Ceil(float64(len(nodes)) / 3)) + total := uint8(math.Ceil(float64(len(nodes)) / nodesResponseItemLimit)) var resp []*v5wire.Nodes for len(nodes) > 0 { p := &v5wire.Nodes{ReqID: reqid, Total: total} - items := min(nodesResponseItemLimit, len(nodes)) + items := common2.Min(nodesResponseItemLimit, len(nodes)) for i := 0; i < items; i++ { p.Nodes = append(p.Nodes, nodes[i].Record()) } diff --git a/p2p/discover/v5_udp_integration_test.go b/p2p/discover/v5_udp_integration_test.go new file mode 100644 index 00000000000..58d432bbc62 --- /dev/null +++ b/p2p/discover/v5_udp_integration_test.go @@ -0,0 +1,63 @@ +//go:build integration + +package discover + +import ( + "context" + "github.com/ledgerwatch/erigon/p2p/discover/v5wire" + "net" + "runtime" + "testing" + "time" +) + +// This test checks that calls with n replies may take up to n * respTimeout. +func TestUDPv5_callTimeoutReset(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("fix me on win please") + } + t.Parallel() + + replyTimeout := respTimeoutV5 + // This must be significantly lower than replyTimeout to not get "RPC timeout" error. + singleReplyDelay := replyTimeout / (totalNodesResponseLimit - 1) + if singleReplyDelay*totalNodesResponseLimit < replyTimeout { + t.Fatalf("The total delay of all replies must exceed an individual reply timeout.") + } + if replyTimeout-singleReplyDelay < 50*time.Millisecond { + t.Errorf("50ms is sometimes not enough on a slow CI to process a reply.") + } + + ctx := context.Background() + ctx = contextWithReplyTimeout(ctx, replyTimeout) + + test := newUDPV5TestContext(ctx, t) + t.Cleanup(test.close) + + // Launch the request: + var ( + distance = uint(230) + remote = test.getNode(test.remotekey, test.remoteaddr).Node() + nodes = nodesAtDistance(remote.ID(), int(distance), totalNodesResponseLimit) + done = make(chan error, 1) + ) + go func() { + _, err := test.udp.findnode(remote, []uint{distance}) + done <- err + }() + + // Serve two responses, slowly. + test.waitPacketOut(func(p *v5wire.Findnode, addr *net.UDPAddr, _ v5wire.Nonce) { + for i := 0; i < totalNodesResponseLimit; i++ { + time.Sleep(singleReplyDelay) + test.packetIn(&v5wire.Nodes{ + ReqID: p.ReqID, + Total: totalNodesResponseLimit, + Nodes: nodesToRecords(nodes[i : i+1]), + }) + } + }) + if err := <-done; err != nil { + t.Fatalf("unexpected error: %q", err) + } +} diff --git a/p2p/discover/v5_udp_test.go b/p2p/discover/v5_udp_test.go index 402928e2374..a94f1f91e9c 100644 --- a/p2p/discover/v5_udp_test.go +++ b/p2p/discover/v5_udp_test.go @@ -18,66 +18,29 @@ package discover import ( "bytes" + "context" "crypto/ecdsa" "encoding/binary" "errors" "fmt" - "math/rand" "net" "reflect" "runtime" - "sort" "testing" "time" + "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/internal/testlog" "github.com/ledgerwatch/erigon/p2p/discover/v5wire" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/p2p/enr" "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" ) -// Real sockets, real crypto: this test checks end-to-end connectivity for UDPv5. -func TestUDPv5_lookupE2E(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") - } - t.Parallel() - const N = 5 - var nodes []*UDPv5 - for i := 0; i < N; i++ { - var cfg Config - if len(nodes) > 0 { - bn := nodes[0].Self() - cfg.Bootnodes = []*enode.Node{bn} - } - node := startLocalhostV5(t, cfg) - nodes = append(nodes, node) - defer node.Close() - } - last := nodes[N-1] - target := nodes[rand.Intn(N-2)].Self() - - // It is expected that all nodes can be found. - expectedResult := make([]*enode.Node, len(nodes)) - for i := range nodes { - expectedResult[i] = nodes[i].Self() - } - sort.Slice(expectedResult, func(i, j int) bool { - return enode.DistCmp(target.ID(), expectedResult[i].ID(), expectedResult[j].ID()) < 0 - }) - - // Do the lookup. - results := last.Lookup(target.ID()) - if err := checkNodesEqual(results, expectedResult); err != nil { - t.Fatalf("lookup returned wrong results: %v", err) - } -} - func startLocalhostV5(t *testing.T, cfg Config) *UDPv5 { cfg.PrivateKey = newkey() - db, err := enode.OpenDB(t.TempDir()) + db, err := enode.OpenDB("") if err != nil { panic(err) } @@ -87,7 +50,7 @@ func startLocalhostV5(t *testing.T, cfg Config) *UDPv5 { // Prefix logs with node ID. lprefix := fmt.Sprintf("(%s)", ln.ID().TerminalString()) lfmt := log.TerminalFormat() - cfg.Log = testlog.Logger(t, log.LvlTrace) + cfg.Log = testlog.Logger(t, log.LvlError) cfg.Log.SetHandler(log.FuncHandler(func(r *log.Record) error { t.Logf("%s %s", lprefix, lfmt.Format(r)) return nil @@ -100,8 +63,10 @@ func startLocalhostV5(t *testing.T, cfg Config) *UDPv5 { } realaddr := socket.LocalAddr().(*net.UDPAddr) ln.SetStaticIP(realaddr.IP) - ln.Set(enr.UDP(realaddr.Port)) - udp, err := ListenV5(socket, ln, cfg) + ln.SetFallbackUDP(realaddr.Port) + ctx := context.Background() + ctx = disableLookupSlowdown(ctx) + udp, err := ListenV5(ctx, socket, ln, cfg) if err != nil { t.Fatal(err) } @@ -115,6 +80,7 @@ func TestUDPv5_pingHandling(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) test.packetIn(&v5wire.Ping{ReqID: []byte("foo")}) test.waitPacketOut(func(p *v5wire.Pong, addr *net.UDPAddr, _ v5wire.Nonce) { @@ -134,6 +100,7 @@ func TestUDPv5_unknownPacket(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) nonce := v5wire.Nonce{1, 2, 3} check := func(p *v5wire.Whoareyou, wantSeq uint64) { @@ -172,6 +139,7 @@ func TestUDPv5_findnodeHandling(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) // Create test nodes and insert them into the table. nodes253 := nodesAtDistance(test.table.self().ID(), 253, 10) @@ -258,6 +226,7 @@ func TestUDPv5_pingCall(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) remote := test.getNode(test.remotekey, test.remoteaddr).Node() done := make(chan error, 1) @@ -306,6 +275,7 @@ func TestUDPv5_findnodeCall(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) // Launch the request: var ( @@ -357,6 +327,7 @@ func TestUDPv5_callResend(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) remote := test.getNode(test.remotekey, test.remoteaddr).Node() done := make(chan error, 2) @@ -396,6 +367,7 @@ func TestUDPv5_multipleHandshakeRounds(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) remote := test.getNode(test.remotekey, test.remoteaddr).Node() done := make(chan error, 1) @@ -417,47 +389,6 @@ func TestUDPv5_multipleHandshakeRounds(t *testing.T) { } } -// This test checks that calls with n replies may take up to n * respTimeout. -func TestUDPv5_callTimeoutReset(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") - } - t.Parallel() - test := newUDPV5Test(t) - - // Launch the request: - var ( - distance = uint(230) - remote = test.getNode(test.remotekey, test.remoteaddr).Node() - nodes = nodesAtDistance(remote.ID(), int(distance), 8) - done = make(chan error, 1) - ) - go func() { - _, err := test.udp.findnode(remote, []uint{distance}) - done <- err - }() - - // Serve two responses, slowly. - test.waitPacketOut(func(p *v5wire.Findnode, addr *net.UDPAddr, _ v5wire.Nonce) { - time.Sleep(respTimeout - 50*time.Millisecond) - test.packetIn(&v5wire.Nodes{ - ReqID: p.ReqID, - Total: 2, - Nodes: nodesToRecords(nodes[:4]), - }) - - time.Sleep(respTimeout - 50*time.Millisecond) - test.packetIn(&v5wire.Nodes{ - ReqID: p.ReqID, - Total: 2, - Nodes: nodesToRecords(nodes[4:]), - }) - }) - if err := <-done; err != nil { - t.Fatalf("unexpected error: %q", err) - } -} - // This test checks that TALKREQ calls the registered handler function. func TestUDPv5_talkHandling(t *testing.T) { if runtime.GOOS == "windows" { @@ -465,6 +396,7 @@ func TestUDPv5_talkHandling(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) var recvMessage []byte test.udp.RegisterTalkHandler("test", func(id enode.ID, addr *net.UDPAddr, message []byte) []byte { @@ -517,6 +449,7 @@ func TestUDPv5_talkRequest(t *testing.T) { } t.Parallel() test := newUDPV5Test(t) + t.Cleanup(test.close) remote := test.getNode(test.remotekey, test.remoteaddr).Node() done := make(chan error, 1) @@ -553,65 +486,6 @@ func TestUDPv5_talkRequest(t *testing.T) { } } -// This test checks that lookup works. -func TestUDPv5_lookup(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") - } - t.Parallel() - test := newUDPV5Test(t) - - // Lookup on empty table returns no nodes. - if results := test.udp.Lookup(lookupTestnet.target.id()); len(results) > 0 { - t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) - } - - // Ensure the tester knows all nodes in lookupTestnet by IP. - for d, nn := range lookupTestnet.dists { - for i, key := range nn { - n := lookupTestnet.node(d, i) - test.getNode(key, &net.UDPAddr{IP: n.IP(), Port: n.UDP()}) - } - } - - // Seed table with initial node. - initialNode := lookupTestnet.node(256, 0) - fillTable(test.table, []*node{wrapNode(initialNode)}) - - // Start the lookup. - resultC := make(chan []*enode.Node, 1) - go func() { - resultC <- test.udp.Lookup(lookupTestnet.target.id()) - test.close() - }() - - // Answer lookup packets. - asked := make(map[enode.ID]bool) - for done := false; !done; { - done = test.waitPacketOut(func(p v5wire.Packet, to *net.UDPAddr, _ v5wire.Nonce) { - recipient, key := lookupTestnet.nodeByAddr(to) - switch p := p.(type) { - case *v5wire.Ping: - test.packetInFrom(key, to, &v5wire.Pong{ReqID: p.ReqID}) - case *v5wire.Findnode: - if asked[recipient.ID()] { - t.Error("Asked node", recipient.ID(), "twice") - } - asked[recipient.ID()] = true - nodes := lookupTestnet.neighborsAtDistances(recipient, p.Distances, 16) - t.Logf("Got FINDNODE for %v, returning %d nodes", p.Distances, len(nodes)) - for _, resp := range packNodes(p.ReqID, nodes) { - test.packetInFrom(key, to, resp) - } - } - }) - } - - // Verify result nodes. - results := <-resultC - checkLookupResults(t, lookupTestnet, results) -} - // This test checks the local node can be utilised to set key-values. func TestUDPv5_LocalNode(t *testing.T) { if runtime.GOOS == "windows" { @@ -688,7 +562,7 @@ func (c *testCodec) Decode(input []byte, addr string) (enode.ID, *enode.Node, v5 func (c *testCodec) decodeFrame(input []byte) (frame testCodecFrame, p v5wire.Packet, err error) { if err = rlp.DecodeBytes(input, &frame); err != nil { - return frame, nil, fmt.Errorf("invalid frame: %v", err) + return frame, nil, fmt.Errorf("invalid frame: %w", err) } switch frame.Ptype { case v5wire.UnknownPacket: @@ -706,6 +580,17 @@ func (c *testCodec) decodeFrame(input []byte) (frame testCodecFrame, p v5wire.Pa } func newUDPV5Test(t *testing.T) *udpV5Test { + return newUDPV5TestContext(context.Background(), t) +} + +func newUDPV5TestContext(ctx context.Context, t *testing.T) *udpV5Test { + ctx = disableLookupSlowdown(ctx) + + replyTimeout := contextGetReplyTimeout(ctx) + if replyTimeout == 0 { + replyTimeout = 50 * time.Millisecond + } + test := &udpV5Test{ t: t, pipe: newpipe(), @@ -717,7 +602,7 @@ func newUDPV5Test(t *testing.T) *udpV5Test { } t.Cleanup(test.close) var err error - test.db, err = enode.OpenDB(test.t.TempDir()) + test.db, err = enode.OpenDB("") if err != nil { panic(err) } @@ -725,10 +610,13 @@ func newUDPV5Test(t *testing.T) *udpV5Test { ln := enode.NewLocalNode(test.db, test.localkey) ln.SetStaticIP(net.IP{10, 0, 0, 1}) ln.Set(enr.UDP(30303)) - test.udp, err = ListenV5(test.pipe, ln, Config{ + test.udp, err = ListenV5(ctx, test.pipe, ln, Config{ PrivateKey: test.localkey, - Log: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), ValidSchemes: enode.ValidSchemesForTesting, + ReplyTimeout: replyTimeout, + + TableRevalidateInterval: time.Hour, }) if err != nil { panic(err) @@ -764,10 +652,10 @@ func (test *udpV5Test) packetInFrom(key *ecdsa.PrivateKey, addr *net.UDPAddr, pa // getNode ensures the test knows about a node at the given endpoint. func (test *udpV5Test) getNode(key *ecdsa.PrivateKey, addr *net.UDPAddr) *enode.LocalNode { - id := encodePubkey(&key.PublicKey).id() + id := enode.PubkeyToIDV4(&key.PublicKey) ln := test.nodesByID[id] if ln == nil { - db, err := enode.OpenDB(test.t.TempDir()) + db, err := enode.OpenDB("") if err != nil { panic(err) } @@ -801,6 +689,12 @@ func (test *udpV5Test) waitPacketOut(validate interface{}) (closed bool) { } ln := test.nodesByIP[string(dgram.to.IP)] if ln == nil { + _, _, packet, err := test.udp.codec.Decode(dgram.data, test.pipe.LocalAddr().String()) + if err != nil { + test.t.Errorf("failed to decode a UDP packet: %v", err) + } else { + test.t.Errorf("attempt to send UDP packet: %v", packet.Name()) + } test.t.Fatalf("attempt to send to non-existing node %v", &dgram.to) return false } @@ -828,7 +722,23 @@ func (test *udpV5Test) close() { n.Database().Close() } } - if len(test.pipe.queue) != 0 { - test.t.Fatalf("%d unmatched UDP packets in queue", len(test.pipe.queue)) + + unmatchedCount := len(test.pipe.queue) + if (unmatchedCount > 0) && !test.t.Failed() { + test.t.Errorf("%d unmatched UDP packets in queue", unmatchedCount) + + for len(test.pipe.queue) > 0 { + dgram, err := test.pipe.receive() + if err != nil { + test.t.Errorf("Failed to receive remaining UDP packets: %v", err) + break + } + _, _, packet, err := test.udp.codec.Decode(dgram.data, test.pipe.LocalAddr().String()) + if err != nil { + test.t.Errorf("Failed to decode a remaining UDP packet: %v", err) + } else { + test.t.Errorf("Remaining UDP packet: %v", packet.Name()) + } + } } } diff --git a/p2p/discover/v5wire/crypto.go b/p2p/discover/v5wire/crypto.go index 18c68fab183..bb3bbefa21a 100644 --- a/p2p/discover/v5wire/crypto.go +++ b/p2p/discover/v5wire/crypto.go @@ -154,11 +154,11 @@ func ecdh(privkey *ecdsa.PrivateKey, pubkey *ecdsa.PublicKey) []byte { func encryptGCM(dest, key, nonce, plaintext, authData []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { - panic(fmt.Errorf("can't create block cipher: %v", err)) + panic(fmt.Errorf("can't create block cipher: %w", err)) } aesgcm, err := cipher.NewGCMWithNonceSize(block, gcmNonceSize) if err != nil { - panic(fmt.Errorf("can't create GCM: %v", err)) + panic(fmt.Errorf("can't create GCM: %w", err)) } return aesgcm.Seal(dest, nonce, plaintext, authData), nil } diff --git a/p2p/discover/v5wire/encoding.go b/p2p/discover/v5wire/encoding.go index 9ba8c69b894..5e983d0b9a3 100644 --- a/p2p/discover/v5wire/encoding.go +++ b/p2p/discover/v5wire/encoding.go @@ -188,7 +188,7 @@ func (c *Codec) Encode(id enode.ID, addr string, packet Packet, challenge *Whoar // Generate masking IV. if err = c.sc.maskingIVGen(head.IV[:]); err != nil { - return nil, Nonce{}, fmt.Errorf("can't generate masking IV: %v", err) + return nil, Nonce{}, fmt.Errorf("can't generate masking IV: %w", err) } // Encode header data. @@ -266,7 +266,7 @@ func (c *Codec) encodeRandom(toID enode.ID) (Header, []byte, error) { // Encode auth data. auth := messageAuthData{SrcID: c.localnode.ID()} if _, err := crand.Read(head.Nonce[:]); err != nil { - return head, nil, fmt.Errorf("can't get random data: %v", err) + return head, nil, fmt.Errorf("can't get random data: %w", err) } c.headbuf.Reset() binary.Write(&c.headbuf, binary.BigEndian, auth) //nolint:errcheck @@ -318,7 +318,7 @@ func (c *Codec) encodeHandshakeHeader(toID enode.ID, addr string, challenge *Who // Generate nonce for message. nonce, err := c.sc.nextNonce(session) if err != nil { - return Header{}, nil, fmt.Errorf("can't generate nonce: %v", err) + return Header{}, nil, fmt.Errorf("can't generate nonce: %w", err) } // TODO: this should happen when the first authenticated message is received @@ -363,7 +363,7 @@ func (c *Codec) makeHandshakeAuth(toID enode.ID, addr string, challenge *Whoarey cdata := challenge.ChallengeData idsig, err := makeIDSignature(c.sha256, c.privkey, cdata, ephpubkey, toID) if err != nil { - return nil, nil, fmt.Errorf("can't sign: %v", err) + return nil, nil, fmt.Errorf("can't sign: %w", err) } auth.signature = idsig auth.h.SigSize = byte(len(auth.signature)) @@ -389,7 +389,7 @@ func (c *Codec) encodeMessageHeader(toID enode.ID, s *session) (Header, error) { // Create the header. nonce, err := c.sc.nextNonce(s) if err != nil { - return Header{}, fmt.Errorf("can't generate nonce: %v", err) + return Header{}, fmt.Errorf("can't generate nonce: %w", err) } auth := messageAuthData{SrcID: c.localnode.ID()} c.buf.Reset() @@ -572,7 +572,7 @@ func (c *Codec) decodeHandshakeRecord(local *enode.Node, wantID enode.ID, remote if local == nil || local.Seq() < record.Seq() { n, err := enode.New(enode.ValidSchemes, &record) if err != nil { - return nil, fmt.Errorf("invalid node record: %v", err) + return nil, fmt.Errorf("invalid node record: %w", err) } if n.ID() != wantID { return nil, fmt.Errorf("record in handshake has wrong ID: %v", n.ID()) diff --git a/p2p/discover/v5wire/encoding_test.go b/p2p/discover/v5wire/encoding_test.go index 26b9293dc1e..0fcc1bc86cb 100644 --- a/p2p/discover/v5wire/encoding_test.go +++ b/p2p/discover/v5wire/encoding_test.go @@ -22,7 +22,6 @@ import ( "encoding/hex" "flag" "fmt" - "io/ioutil" "net" "os" "path/filepath" @@ -546,7 +545,7 @@ func (n *handshakeTestNode) encodeWithChallenge(t testing.TB, to handshakeTestNo // Encode to destination. enc, nonce, err := n.c.Encode(to.id(), to.addr(), p, challenge) if err != nil { - t.Fatal(fmt.Errorf("(%s) %v", n.ln.ID().TerminalString(), err)) + t.Fatal(fmt.Errorf("(%s) %w", n.ln.ID().TerminalString(), err)) } t.Logf("(%s) -> (%s) %s\n%s", n.ln.ID().TerminalString(), to.id().TerminalString(), p.Name(), hex.Dump(enc)) return enc, nonce @@ -557,7 +556,7 @@ func (n *handshakeTestNode) expectDecode(t *testing.T, ptype byte, p []byte) Pac dec, err := n.decode(p) if err != nil { - t.Fatal(fmt.Errorf("(%s) %v", n.ln.ID().TerminalString(), err)) + t.Fatal(fmt.Errorf("(%s) %w", n.ln.ID().TerminalString(), err)) } t.Logf("(%s) %#v", n.ln.ID().TerminalString(), pp.NewFormatter(dec)) if dec.Kind() != ptype { @@ -593,7 +592,7 @@ func (n *handshakeTestNode) id() enode.ID { // hexFile reads the given file and decodes the hex data contained in it. // Whitespace and any lines beginning with the # character are ignored. func hexFile(file string) []byte { - fileContent, err := ioutil.ReadFile(file) + fileContent, err := os.ReadFile(file) if err != nil { panic(err) } diff --git a/p2p/dnsdisc/client.go b/p2p/dnsdisc/client.go index 1005980e2de..e42fac07d0f 100644 --- a/p2p/dnsdisc/client.go +++ b/p2p/dnsdisc/client.go @@ -50,7 +50,7 @@ type Config struct { RateLimit float64 // maximum DNS requests / second (default 3) ValidSchemes enr.IdentityScheme // acceptable ENR identity schemes (default enode.ValidSchemes) Resolver Resolver // the DNS resolver to use (defaults to system DNS) - Logger log.Logger // destination of client log messages (defaults to root logger) + Log log.Logger // destination of client log messages (defaults to root logger) } // Resolver is a DNS resolver that can query TXT records. @@ -83,8 +83,8 @@ func (cfg Config) withDefaults() Config { if cfg.Resolver == nil { cfg.Resolver = new(net.Resolver) } - if cfg.Logger == nil { - cfg.Logger = log.Root() + if cfg.Log == nil { + cfg.Log = log.Root() } return cfg } @@ -105,7 +105,7 @@ func NewClient(cfg Config) *Client { func (c *Client) SyncTree(url string) (*Tree, error) { le, err := parseLink(url) if err != nil { - return nil, fmt.Errorf("invalid enrtree URL: %v", err) + return nil, fmt.Errorf("invalid enrtree URL: %w", err) } ct := newClientTree(c, new(linkCache), le) t := &Tree{entries: make(map[string]entry)} @@ -131,7 +131,7 @@ func (c *Client) NewIterator(urls ...string) (enode.Iterator, error) { // resolveRoot retrieves a root entry via DNS. func (c *Client) resolveRoot(ctx context.Context, loc *linkEntry) (rootEntry, error) { txts, err := c.cfg.Resolver.LookupTXT(ctx, loc.domain) - c.cfg.Logger.Trace("Updating DNS discovery root", "tree", loc.domain, "err", err) + c.cfg.Log.Trace("Updating DNS discovery root", "tree", loc.domain, "err", err) if err != nil { return rootEntry{}, err } @@ -177,7 +177,7 @@ func (c *Client) doResolveEntry(ctx context.Context, domain, hash string) (entry } name := hash + "." + domain txts, err := c.cfg.Resolver.LookupTXT(ctx, hash+"."+domain) - c.cfg.Logger.Trace("DNS discovery lookup", "name", name, "err", err) + c.cfg.Log.Trace("DNS discovery lookup", "name", name, "err", err) if err != nil { return nil, err } @@ -258,7 +258,7 @@ func (it *randomIterator) Next() bool { func (it *randomIterator) addTree(url string) error { le, err := parseLink(url) if err != nil { - return fmt.Errorf("invalid enrtree URL: %v", err) + return fmt.Errorf("invalid enrtree URL: %w", err) } it.lc.addLink("", le.str) return nil @@ -276,7 +276,7 @@ func (it *randomIterator) nextNode() *enode.Node { if err == it.ctx.Err() { return nil // context canceled. } - it.c.cfg.Logger.Debug("Error in DNS random node sync", "tree", ct.loc.domain, "err", err) + it.c.cfg.Log.Trace("Error in DNS random node sync", "tree", ct.loc.domain, "err", err) continue } if n != nil { @@ -349,7 +349,7 @@ func (it *randomIterator) waitForRootUpdates(trees []*clientTree) bool { } sleep := nextCheck.Sub(it.c.clock.Now()) - it.c.cfg.Logger.Debug("DNS iterator waiting for root updates", "sleep", sleep, "tree", minTree.loc.domain) + it.c.cfg.Log.Trace("DNS iterator waiting for root updates", "sleep", sleep, "tree", minTree.loc.domain) timeout := it.c.clock.NewTimer(sleep) defer timeout.Stop() select { diff --git a/p2p/dnsdisc/client_test.go b/p2p/dnsdisc/client_test.go index d44198d01b9..a98a1e06a84 100644 --- a/p2p/dnsdisc/client_test.go +++ b/p2p/dnsdisc/client_test.go @@ -55,7 +55,7 @@ func TestClientSyncTree(t *testing.T) { wantSeq = uint(1) ) - c := NewClient(Config{Resolver: r, Logger: testlog.Logger(t, log.LvlTrace)}) + c := NewClient(Config{Resolver: r, Log: testlog.Logger(t, log.LvlError)}) stree, err := c.SyncTree("enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@n") if err != nil { t.Fatal("sync error:", err) @@ -89,7 +89,7 @@ func TestClientSyncTreeBadNode(t *testing.T) { "C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org", "INDMVBZEEQ4ESVYAKGIYU74EAA.n": "enr:-----", } - c := NewClient(Config{Resolver: r, Logger: testlog.Logger(t, log.LvlTrace)}) + c := NewClient(Config{Resolver: r, Log: testlog.Logger(t, log.LvlError)}) _, err := c.SyncTree("enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@n") wantErr := nameError{name: "INDMVBZEEQ4ESVYAKGIYU74EAA.n", err: entryError{typ: "enr", err: errInvalidENR}} if err != wantErr { @@ -104,7 +104,7 @@ func TestIterator(t *testing.T) { r := mapResolver(tree.ToTXT("n")) c := NewClient(Config{ Resolver: r, - Logger: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), RateLimit: 500, }) it, err := c.NewIterator(url) @@ -145,7 +145,7 @@ func TestIteratorLinks(t *testing.T) { tree2, url2 := makeTestTree("t2", nodes[10:], []string{url1}) c := NewClient(Config{ Resolver: newMapResolver(tree1.ToTXT("t1"), tree2.ToTXT("t2")), - Logger: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), RateLimit: 500, }) it, err := c.NewIterator(url2) @@ -165,7 +165,7 @@ func TestIteratorNodeUpdates(t *testing.T) { resolver = newMapResolver() c = NewClient(Config{ Resolver: resolver, - Logger: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), RecheckInterval: 20 * time.Minute, RateLimit: 500, }) @@ -202,7 +202,7 @@ func TestIteratorRootRecheckOnFail(t *testing.T) { resolver = newMapResolver() c = NewClient(Config{ Resolver: resolver, - Logger: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), RecheckInterval: 20 * time.Minute, RateLimit: 500, // Disabling the cache is required for this test because the client doesn't @@ -239,7 +239,7 @@ func TestIteratorEmptyTree(t *testing.T) { resolver = newMapResolver() c = NewClient(Config{ Resolver: resolver, - Logger: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), RecheckInterval: 20 * time.Minute, RateLimit: 500, }) @@ -300,7 +300,7 @@ func TestIteratorLinkUpdates(t *testing.T) { resolver = newMapResolver() c = NewClient(Config{ Resolver: resolver, - Logger: testlog.Logger(t, log.LvlTrace), + Log: testlog.Logger(t, log.LvlError), RecheckInterval: 20 * time.Minute, RateLimit: 500, }) diff --git a/p2p/dnsdisc/sync.go b/p2p/dnsdisc/sync.go index 68f3748abf1..c58e31bcbf3 100644 --- a/p2p/dnsdisc/sync.go +++ b/p2p/dnsdisc/sync.go @@ -131,7 +131,7 @@ func (ct *clientTree) syncNextLink(ctx context.Context) error { } func (ct *clientTree) syncNextRandomENR(ctx context.Context) (*enode.Node, error) { - index := rand.Intn(len(ct.enrs.missing)) + index := rand.Intn(len(ct.enrs.missing)) //nolint:gosec hash := ct.enrs.missing[index] e, err := ct.enrs.resolveNext(ctx, hash) if err != nil { diff --git a/p2p/dnsdisc/tree.go b/p2p/dnsdisc/tree.go index 60b8d8554fc..1da6858f1e4 100644 --- a/p2p/dnsdisc/tree.go +++ b/p2p/dnsdisc/tree.go @@ -23,7 +23,6 @@ import ( "encoding/base64" "fmt" "io" - "sort" "strings" "github.com/ledgerwatch/erigon/crypto" @@ -31,6 +30,7 @@ import ( "github.com/ledgerwatch/erigon/p2p/enr" "github.com/ledgerwatch/erigon/rlp" "golang.org/x/crypto/sha3" + "golang.org/x/exp/slices" ) // Tree is a merkle tree of node records. @@ -183,9 +183,7 @@ func (t *Tree) build(entries []entry) entry { } func sortByID(nodes []*enode.Node) []*enode.Node { - sort.Slice(nodes, func(i, j int) bool { - return bytes.Compare(nodes[i].ID().Bytes(), nodes[j].ID().Bytes()) < 0 - }) + slices.SortFunc(nodes, func(i, j *enode.Node) bool { return bytes.Compare(i.ID().Bytes(), j.ID().Bytes()) < 0 }) return nodes } @@ -247,7 +245,7 @@ func (e *rootEntry) sigHash() []byte { func (e *rootEntry) verifySignature(pubkey *ecdsa.PublicKey) bool { sig := e.sig[:crypto.RecoveryIDOffset] // remove recovery id - enckey := crypto.FromECDSAPub(pubkey) + enckey := crypto.MarshalPubkeyStd(pubkey) return crypto.VerifySignature(enckey, e.sigHash(), sig) } diff --git a/p2p/enode/idscheme.go b/p2p/enode/idscheme.go index 0d7bcf19221..d07ef769c3a 100644 --- a/p2p/enode/idscheme.go +++ b/p2p/enode/idscheme.go @@ -21,8 +21,8 @@ import ( "fmt" "io" - "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/p2p/discover/v4wire" "github.com/ledgerwatch/erigon/p2p/enr" "github.com/ledgerwatch/erigon/rlp" "golang.org/x/crypto/sha3" @@ -83,10 +83,20 @@ func (V4ID) NodeAddr(r *enr.Record) []byte { if err != nil { return nil } - buf := make([]byte, 64) - math.ReadBits(pubkey.X, buf[:32]) - math.ReadBits(pubkey.Y, buf[32:]) - return crypto.Keccak256(buf) + id := PubkeyToIDV4((*ecdsa.PublicKey)(&pubkey)) + return id[:] +} + +// PubkeyToIDV4 derives the v4 node address from the given public key. +func PubkeyToIDV4(key *ecdsa.PublicKey) ID { + return PubkeyEncoded(v4wire.EncodePubkey(key)).ID() +} + +type PubkeyEncoded v4wire.Pubkey + +// ID returns the node ID corresponding to the public key. +func (e PubkeyEncoded) ID() ID { + return ID(crypto.Keccak256Hash(e[:])) } // Secp256k1 is the "secp256k1" key, which holds a public key. diff --git a/p2p/enode/iter_integration_test.go b/p2p/enode/iter_integration_test.go new file mode 100644 index 00000000000..939efcaba0d --- /dev/null +++ b/p2p/enode/iter_integration_test.go @@ -0,0 +1,13 @@ +//go:build integration + +package enode + +import "testing" + +// This test checks fairness of FairMix in the happy case where all sources return nodes +// within the context's deadline. +func TestFairMix(t *testing.T) { + for i := 0; i < 500; i++ { + testMixerFairness(t) + } +} diff --git a/p2p/enode/iter_test.go b/p2p/enode/iter_test.go index 3e64df703a5..27cb41dc8d5 100644 --- a/p2p/enode/iter_test.go +++ b/p2p/enode/iter_test.go @@ -91,8 +91,9 @@ func checkNodes(t *testing.T, nodes []*Node, wantLen int) { // This test checks fairness of FairMix in the happy case where all sources return nodes // within the context's deadline. -func TestFairMix(t *testing.T) { - for i := 0; i < 500; i++ { +// see: iter_integration_test.go +func TestFairMixOnce(t *testing.T) { + for i := 0; i < 10; i++ { testMixerFairness(t) } } diff --git a/p2p/enode/localnode.go b/p2p/enode/localnode.go index 187d47f3cd0..d5faf8b47fb 100644 --- a/p2p/enode/localnode.go +++ b/p2p/enode/localnode.go @@ -274,14 +274,14 @@ func (ln *LocalNode) sign() { ln.bumpSeq() r.SetSeq(ln.seq) if err := SignV4(&r, ln.key); err != nil { - panic(fmt.Errorf("enode: can't sign record: %v", err)) + panic(fmt.Errorf("enode: can't sign record: %w", err)) } n, err := New(ValidSchemes, &r) if err != nil { - panic(fmt.Errorf("enode: can't verify local record: %v", err)) + panic(fmt.Errorf("enode: can't verify local record: %w", err)) } ln.cur.Store(n) - log.Debug("New local node record", "seq", ln.seq, "id", n.ID(), "ip", n.IP(), "udp", n.UDP(), "tcp", n.TCP()) + log.Trace("New local node record", "seq", ln.seq, "id", n.ID(), "ip", n.IP(), "udp", n.UDP(), "tcp", n.TCP()) } func (ln *LocalNode) bumpSeq() { diff --git a/p2p/enode/nodedb.go b/p2p/enode/nodedb.go index 56f2ea506c0..61c3836e094 100644 --- a/p2p/enode/nodedb.go +++ b/p2p/enode/nodedb.go @@ -35,6 +35,8 @@ import ( "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/rlp" "github.com/ledgerwatch/log/v3" + + mdbx1 "github.com/torquem-ch/mdbx-go/mdbx" ) // Keys in the node database. @@ -61,7 +63,7 @@ const ( const ( dbNodeExpiration = 24 * time.Hour // Time after which an unseen node should be dropped. dbCleanupCycle = time.Hour // Time period for running the expiration task. - dbVersion = 9 + dbVersion = 10 ) var ( @@ -88,9 +90,10 @@ func OpenDB(path string) (*DB, error) { return newPersistentDB(logger, path) } -var bucketsConfig = func(defaultBuckets kv.TableCfg) kv.TableCfg { +func bucketsConfig(_ kv.TableCfg) kv.TableCfg { return kv.TableCfg{ - kv.Inodes: {}, + kv.Inodes: {}, + kv.NodeRecords: {}, } } @@ -110,7 +113,14 @@ func newMemoryDB(logger log.Logger) (*DB, error) { func newPersistentDB(logger log.Logger, path string) (*DB, error) { var db kv.RwDB var err error - db, err = mdbx.NewMDBX(logger).Path(path).Label(kv.SentryDB).MapSize(64 * datasize.MB).WithTablessCfg(bucketsConfig).Open() + db, err = mdbx.NewMDBX(logger). + Path(path). + Label(kv.SentryDB). + WithTablessCfg(bucketsConfig). + MapSize(1024 * datasize.MB). + Flags(func(f uint) uint { return f ^ mdbx1.Durable | mdbx1.SafeNoSync }). + SyncPeriod(2 * time.Second). + Open() if err != nil { return nil, err } @@ -141,7 +151,7 @@ func newPersistentDB(logger log.Logger, path string) (*DB, error) { } if blob != nil && !bytes.Equal(blob, currentVer) { db.Close() - if err := os.Remove(path); err != nil { + if err := os.RemoveAll(path); err != nil { return nil, err } return newPersistentDB(logger, path) @@ -274,7 +284,7 @@ func (db *DB) storeUint64(key []byte, n uint64) error { func (db *DB) Node(id ID) *Node { var blob []byte if err := db.kv.View(context.Background(), func(tx kv.Tx) error { - v, errGet := tx.GetOne(kv.Inodes, nodeKey(id)) + v, errGet := tx.GetOne(kv.NodeRecords, nodeKey(id)) if errGet != nil { return errGet } @@ -295,7 +305,7 @@ func (db *DB) Node(id ID) *Node { func mustDecodeNode(id, data []byte) *Node { node := new(Node) if err := rlp.DecodeBytes(data, &node.r); err != nil { - panic(fmt.Errorf("p2p/enode: can't decode node %x in DB: %v", id, err)) + panic(fmt.Errorf("p2p/enode: can't decode node %x in DB: %w", id, err)) } // Restore node id cache. copy(node.id[:], id) @@ -312,7 +322,7 @@ func (db *DB) UpdateNode(node *Node) error { return err } if err := db.kv.Update(context.Background(), func(tx kv.RwTx) error { - return tx.Put(kv.Inodes, nodeKey(node.ID()), blob) + return tx.Put(kv.NodeRecords, nodeKey(node.ID()), blob) }); err != nil { return err } @@ -340,17 +350,10 @@ func (db *DB) DeleteNode(id ID) { func deleteRange(db kv.RwDB, prefix []byte) { if err := db.Update(context.Background(), func(tx kv.RwTx) error { - c, err := tx.RwCursor(kv.Inodes) - if err != nil { - return err - } - for k, _, err := c.Seek(prefix); bytes.HasPrefix(k, prefix); k, _, err = c.Next() { - if err != nil { + for bucket := range bucketsConfig(nil) { + if err := deleteRangeInBucket(tx, prefix, bucket); err != nil { return err } - if err := c.Delete(k, nil); err != nil { - return nil - } } return nil }); err != nil { @@ -358,6 +361,20 @@ func deleteRange(db kv.RwDB, prefix []byte) { } } +func deleteRangeInBucket(tx kv.RwTx, prefix []byte, bucket string) error { + c, err := tx.RwCursor(bucket) + if err != nil { + return err + } + var k []byte + for k, _, err = c.Seek(prefix); (err == nil) && (k != nil) && bytes.HasPrefix(k, prefix); k, _, err = c.Next() { + if err = c.DeleteCurrent(); err != nil { + break + } + } + return err +} + // ensureExpirer is a small helper method ensuring that the data expiration // mechanism is running. If the expiration goroutine is already running, this // method simply returns. @@ -528,7 +545,7 @@ func (db *DB) QuerySeeds(n int, maxAge time.Duration) []*Node { ) if err := db.kv.View(context.Background(), func(tx kv.Tx) error { - c, err := tx.Cursor(kv.Inodes) + c, err := tx.Cursor(kv.NodeRecords) if err != nil { return err } @@ -585,10 +602,14 @@ func (db *DB) QuerySeeds(n int, maxAge time.Duration) []*Node { // close flushes and closes the database files. func (db *DB) Close() { + select { + case <-db.quit: + return // means closed already + default: + } if db.quit == nil { return } close(db.quit) - db.quit = nil db.kv.Close() } diff --git a/p2p/enode/nodedb_test.go b/p2p/enode/nodedb_test.go index e76729e5a3d..89b2d91d2c7 100644 --- a/p2p/enode/nodedb_test.go +++ b/p2p/enode/nodedb_test.go @@ -273,10 +273,10 @@ func testSeedQuery() error { // Insert a batch of nodes for querying for i, seed := range nodeDBSeedQueryNodes { if err := db.UpdateNode(seed.node); err != nil { - return fmt.Errorf("node %d: failed to insert: %v", i, err) + return fmt.Errorf("node %d: failed to insert: %w", i, err) } if err := db.UpdateLastPongReceived(seed.node.ID(), seed.node.IP(), seed.pong); err != nil { - return fmt.Errorf("node %d: failed to insert bondTime: %v", i, err) + return fmt.Errorf("node %d: failed to insert bondTime: %w", i, err) } } @@ -323,7 +323,7 @@ func TestDBPersistency(t *testing.T) { } db.Close() - // Reopen the database and check the value + // ReopenSegments the database and check the value db, err = OpenDB(filepath.Join(root, "database")) if err != nil { t.Fatalf("failed to open persistent database: %v", err) diff --git a/p2p/enode/urlv4.go b/p2p/enode/urlv4.go index a2231ed577c..724806e7ca7 100644 --- a/p2p/enode/urlv4.go +++ b/p2p/enode/urlv4.go @@ -26,7 +26,6 @@ import ( "regexp" "strconv" - "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/p2p/enr" ) @@ -73,7 +72,7 @@ func ParseV4(rawurl string) (*Node, error) { if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil { id, err := parsePubkey(m[1]) if err != nil { - return nil, fmt.Errorf("invalid public key (%v)", err) + return nil, fmt.Errorf("invalid public key (%w)", err) } return NewV4(id, nil, 0, 0), nil } @@ -124,7 +123,7 @@ func parseComplete(rawurl string) (*Node, error) { return nil, errors.New("does not contain node ID") } if id, err = parsePubkey(u.User.String()); err != nil { - return nil, fmt.Errorf("invalid public key (%v)", err) + return nil, fmt.Errorf("invalid public key (%w)", err) } // Parse the IP address. ip := net.ParseIP(u.Hostname()) @@ -162,7 +161,6 @@ func parsePubkey(in string) (*ecdsa.PublicKey, error) { } else if len(b) != 64 { return nil, fmt.Errorf("wrong length, want %d hex chars", 128) } - b = append([]byte{0x4}, b...) return crypto.UnmarshalPubkey(b) } @@ -176,7 +174,7 @@ func (n *Node) URLv4() string { n.Load((*Secp256k1)(&key)) switch { case scheme == "v4" || key != ecdsa.PublicKey{}: - nodeid = fmt.Sprintf("%x", crypto.FromECDSAPub(&key)[1:]) + nodeid = fmt.Sprintf("%x", crypto.MarshalPubkey(&key)) default: nodeid = fmt.Sprintf("%s.%x", scheme, n.id[:]) } @@ -193,11 +191,3 @@ func (n *Node) URLv4() string { } return u.String() } - -// PubkeyToIDV4 derives the v4 node address from the given public key. -func PubkeyToIDV4(key *ecdsa.PublicKey) ID { - e := make([]byte, 64) - math.ReadBits(key.X, e[:len(e)/2]) - math.ReadBits(key.Y, e[len(e)/2:]) - return ID(crypto.Keccak256Hash(e)) -} diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go index 5c005209a09..10f2f79c528 100644 --- a/p2p/enr/enr.go +++ b/p2p/enr/enr.go @@ -131,7 +131,7 @@ func (r *Record) Load(e Entry) error { func (r *Record) Set(e Entry) { blob, err := rlp.EncodeToBytes(e) if err != nil { - panic(fmt.Errorf("enr: can't encode %s: %v", e.ENRKey(), err)) + panic(fmt.Errorf("enr: can't encode %s: %w", e.ENRKey(), err)) } r.invalidate() diff --git a/p2p/message.go b/p2p/message.go index 09e0509c985..b277ce39dac 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -21,7 +21,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "log" "sync/atomic" "time" @@ -68,7 +67,7 @@ func (msg Msg) String() string { // Discard reads any remaining payload data into a black hole. func (msg Msg) Discard() { - _, err := io.Copy(ioutil.Discard, msg.Payload) + _, err := io.Copy(io.Discard, msg.Payload) if err != nil { log.Fatal(err) } @@ -251,7 +250,7 @@ func ExpectMsg(r MsgReader, code uint64, content interface{}) error { if int(msg.Size) != len(contentEnc) { return fmt.Errorf("message size mismatch: got %d, want %d", msg.Size, len(contentEnc)) } - actualContent, err := ioutil.ReadAll(msg.Payload) + actualContent, err := io.ReadAll(msg.Payload) if err != nil { return err } diff --git a/p2p/nat/nat.go b/p2p/nat/nat.go index 19daacfa48b..05aaacdb209 100644 --- a/p2p/nat/nat.go +++ b/p2p/nat/nat.go @@ -41,6 +41,7 @@ type Interface interface { // the gateway when its lifetime ends. AddMapping(protocol string, extport, intport int, name string, lifetime time.Duration) error DeleteMapping(protocol string, extport, intport int) error + SupportsMapping() bool // This method should return the external (Internet-facing) // address of the gateway device. @@ -60,32 +61,44 @@ type Interface interface { // "upnp" uses the Universal Plug and Play protocol // "pmp" uses NAT-PMP with an auto-detected gateway address // "pmp:192.168.0.1" uses NAT-PMP with the given gateway address +// "stun" uses STUN to detect an external IP using a default server +// "stun:" uses STUN to detect an external IP using the given server (host:port) func Parse(spec string) (Interface, error) { var ( parts = strings.SplitN(spec, ":", 2) mech = strings.ToLower(parts[0]) - ip net.IP ) - if len(parts) > 1 { - ip = net.ParseIP(parts[1]) - if ip == nil { - return nil, errors.New("invalid IP address") - } - } switch mech { case "", "none", "off": return nil, nil case "any", "auto", "on": return Any(), nil case "extip", "ip": - if ip == nil { + if len(parts) < 2 { return nil, errors.New("missing IP address") } + ip := net.ParseIP(parts[1]) + if ip == nil { + return nil, errors.New("invalid IP address") + } return ExtIP(ip), nil case "upnp": return UPnP(), nil case "pmp", "natpmp", "nat-pmp": + var ip net.IP + if len(parts) > 1 { + ip = net.ParseIP(parts[1]) + if ip == nil { + return nil, errors.New("invalid IP address") + } + } return PMP(ip), nil + case "stun": + var addr string + if len(parts) > 1 { + addr = parts[1] + } + return NewSTUN(addr), nil default: return nil, fmt.Errorf("unknown mechanism %q", parts[0]) } @@ -98,17 +111,21 @@ const ( // Map adds a port mapping on m and keeps it alive until c is closed. // This function is typically invoked in its own goroutine. func Map(m Interface, c <-chan struct{}, protocol string, extport, intport int, name string) { - log := log.New("proto", protocol, "extport", extport, "intport", intport, "interface", m) + if !m.SupportsMapping() { + panic("Port mapping is not supported") + } + + logger := log.New("proto", protocol, "extport", extport, "intport", intport, "interface", m) refresh := time.NewTimer(mapTimeout) defer func() { refresh.Stop() - log.Debug("Deleting port mapping") + logger.Trace("Deleting port mapping") m.DeleteMapping(protocol, extport, intport) }() if err := m.AddMapping(protocol, extport, intport, name, mapTimeout); err != nil { - log.Debug("Couldn't add port mapping", "err", err) + logger.Debug("Couldn't add port mapping", "err", err) } else { - log.Info("Mapped network port") + logger.Info("Mapped network port") } for { select { @@ -117,9 +134,9 @@ func Map(m Interface, c <-chan struct{}, protocol string, extport, intport int, return } case <-refresh.C: - log.Trace("Refreshing port mapping") + logger.Trace("Refreshing port mapping") if err := m.AddMapping(protocol, extport, intport, name, mapTimeout); err != nil { - log.Debug("Couldn't add port mapping", "err", err) + logger.Debug("Couldn't add port mapping", "err", err) } refresh.Reset(mapTimeout) } @@ -138,6 +155,7 @@ func (n ExtIP) String() string { return fmt.Sprintf("ExtIP(%v)", ne func (ExtIP) AddMapping(string, int, int, string, time.Duration) error { return nil } func (ExtIP) DeleteMapping(string, int, int) error { return nil } +func (ExtIP) SupportsMapping() bool { return false } // Any returns a port mapper that tries to discover any supported // mechanism on the local network. @@ -208,6 +226,10 @@ func (n *autodisc) DeleteMapping(protocol string, extport, intport int) error { return n.found.DeleteMapping(protocol, extport, intport) } +func (n *autodisc) SupportsMapping() bool { + return true +} + func (n *autodisc) ExternalIP() (net.IP, error) { if err := n.wait(); err != nil { return nil, err diff --git a/p2p/nat/nat_stun.go b/p2p/nat/nat_stun.go new file mode 100644 index 00000000000..03e4a5e5ccb --- /dev/null +++ b/p2p/nat/nat_stun.go @@ -0,0 +1,66 @@ +package nat + +import ( + "fmt" + "github.com/pion/stun" + "net" + "time" +) + +const STUNDefaultServerAddr = "stun.l.google.com:19302" + +type STUN struct { + serverAddr string +} + +func NewSTUN(serverAddr string) STUN { + if serverAddr == "" { + serverAddr = STUNDefaultServerAddr + } + return STUN{serverAddr: serverAddr} +} + +func (s STUN) String() string { + return fmt.Sprintf("STUN(%s)", s.serverAddr) +} + +func (STUN) SupportsMapping() bool { + return false +} + +func (STUN) AddMapping(string, int, int, string, time.Duration) error { + return nil +} + +func (STUN) DeleteMapping(string, int, int) error { + return nil +} + +func (s STUN) ExternalIP() (net.IP, error) { + conn, err := stun.Dial("udp4", s.serverAddr) + if err != nil { + return nil, err + } + defer func() { + _ = conn.Close() + }() + + message := stun.MustBuild(stun.TransactionID, stun.BindingRequest) + var response *stun.Event + err = conn.Do(message, func(event stun.Event) { + response = &event + }) + if err != nil { + return nil, err + } + if response.Error != nil { + return nil, response.Error + } + + var mappedAddr stun.XORMappedAddress + if err := mappedAddr.GetFrom(response.Message); err != nil { + return nil, err + } + + return mappedAddr.IP, nil +} diff --git a/p2p/nat/natpmp.go b/p2p/nat/natpmp.go index 8bafdac9fbe..278e07cc5fa 100644 --- a/p2p/nat/natpmp.go +++ b/p2p/nat/natpmp.go @@ -63,6 +63,10 @@ func (n *pmp) DeleteMapping(protocol string, extport, intport int) (err error) { return err } +func (n *pmp) SupportsMapping() bool { + return true +} + func discoverPMP() Interface { // run external address lookups on all potential gateways gws := potentialGateways() diff --git a/p2p/nat/natupnp.go b/p2p/nat/natupnp.go index 837c83c8c98..083ab90f606 100644 --- a/p2p/nat/natupnp.go +++ b/p2p/nat/natupnp.go @@ -123,6 +123,10 @@ func (n *upnp) DeleteMapping(protocol string, extport, intport int) error { }) } +func (n *upnp) SupportsMapping() bool { + return true +} + func (n *upnp) String() string { return "UPNP " + n.service } diff --git a/p2p/nat/natupnp_test.go b/p2p/nat/natupnp_test.go index 79f6d25ae87..e468f910ed5 100644 --- a/p2p/nat/natupnp_test.go +++ b/p2p/nat/natupnp_test.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package nat import ( diff --git a/p2p/netutil/toobig_notwindows.go b/p2p/netutil/toobig_notwindows.go index 47b64385723..a9c5601c7c3 100644 --- a/p2p/netutil/toobig_notwindows.go +++ b/p2p/netutil/toobig_notwindows.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -//+build !windows +//go:build !windows package netutil diff --git a/p2p/netutil/toobig_windows.go b/p2p/netutil/toobig_windows.go index dfbb6d44f0a..13a1ace051c 100644 --- a/p2p/netutil/toobig_windows.go +++ b/p2p/netutil/toobig_windows.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -//+build windows +//go:build windows package netutil diff --git a/p2p/node_key_config.go b/p2p/node_key_config.go new file mode 100644 index 00000000000..dd46aee8f7d --- /dev/null +++ b/p2p/node_key_config.go @@ -0,0 +1,81 @@ +package p2p + +import ( + "crypto/ecdsa" + "fmt" + "github.com/ledgerwatch/erigon/crypto" + "os" + "path" +) + +type NodeKeyConfig struct { +} + +func (config NodeKeyConfig) DefaultPath(datadir string) string { + return path.Join(datadir, "nodekey") +} + +func (config NodeKeyConfig) generateKey() (*ecdsa.PrivateKey, error) { + key, err := crypto.GenerateKey() + if err != nil { + err = fmt.Errorf("failed to generate node key: %w", err) + } + return key, err +} + +func (config NodeKeyConfig) parseHex(hex string) (*ecdsa.PrivateKey, error) { + key, err := crypto.HexToECDSA(hex) + if err != nil { + err = fmt.Errorf("failed to parse node key from %s: %w", hex, err) + } + return key, err +} + +func (config NodeKeyConfig) load(keyfile string) (*ecdsa.PrivateKey, error) { + key, err := crypto.LoadECDSA(keyfile) + if err != nil { + err = fmt.Errorf("failed to load node key from %s: %w", keyfile, err) + } + return key, err +} + +func (config NodeKeyConfig) save(keyfile string, key *ecdsa.PrivateKey) error { + err := os.MkdirAll(path.Dir(keyfile), 0755) + if err == nil { + err = crypto.SaveECDSA(keyfile, key) + } + if err != nil { + return fmt.Errorf("failed to save node key to %s: %w", keyfile, err) + } + return nil +} + +func (config NodeKeyConfig) LoadOrGenerateAndSave(keyfile string) (*ecdsa.PrivateKey, error) { + // If file exists, try to load it. + if _, err := os.Stat(keyfile); err == nil { + return config.load(keyfile) + } + + // No persistent key found, generate and store a new one. + key, err := config.generateKey() + if err != nil { + return nil, err + } + if err := config.save(keyfile, key); err != nil { + return nil, err + } + return key, nil +} + +func (config NodeKeyConfig) LoadOrParseOrGenerateAndSave(file, hex, datadir string) (*ecdsa.PrivateKey, error) { + switch { + case file != "" && hex != "": + return nil, fmt.Errorf("P2P node key is set as both file and hex string - these options are mutually exclusive") + case file != "": + return config.load(file) + case hex != "": + return config.parseHex(hex) + default: + return config.LoadOrGenerateAndSave(config.DefaultPath(datadir)) + } +} diff --git a/p2p/peer.go b/p2p/peer.go index 5eae9296956..93222940e26 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -64,7 +64,7 @@ type protoHandshake struct { Name string Caps []Cap ListenPort uint64 - ID []byte // secp256k1 public key + Pubkey []byte // secp256k1 public key // Ignore additional fields (for forward compatibility). Rest []rlp.RawValue `rlp:"tail"` @@ -118,23 +118,28 @@ type Peer struct { // events receives message send / receive events if set events *event.Feed + pubkey [64]byte } // NewPeer returns a peer for testing purposes. -func NewPeer(id enode.ID, name string, caps []Cap) *Peer { +func NewPeer(id enode.ID, pubkey [64]byte, name string, caps []Cap) *Peer { pipe, _ := net.Pipe() node := enode.SignNull(new(enr.Record), id) conn := &conn{fd: pipe, transport: nil, node: node, caps: caps, name: name} - peer := newPeer(log.Root(), conn, nil) + peer := newPeer(log.Root(), conn, nil, pubkey) close(peer.closed) // ensures Disconnect doesn't block return peer } -// ID returns the node's public key. +// ID returns the node's unique identifier. func (p *Peer) ID() enode.ID { return p.rw.node.ID() } +func (p *Peer) Pubkey() [64]byte { + return p.pubkey +} + // Node returns the peer's node descriptor. func (p *Peer) Node() *enode.Node { return p.rw.node @@ -204,7 +209,7 @@ func (p *Peer) Inbound() bool { return p.rw.is(inboundConn) } -func newPeer(log log.Logger, conn *conn, protocols []Protocol) *Peer { +func newPeer(logger log.Logger, conn *conn, protocols []Protocol, pubkey [64]byte) *Peer { protomap := matchProtocols(protocols, conn.caps, conn) p := &Peer{ rw: conn, @@ -213,7 +218,8 @@ func newPeer(log log.Logger, conn *conn, protocols []Protocol) *Peer { disc: make(chan DiscReason), protoErr: make(chan error, len(protomap)+1), // protocols + pingLoop closed: make(chan struct{}), - log: log.New("id", conn.node.ID(), "conn", conn.flags), + log: logger.New("id", conn.node.ID(), "conn", conn.flags), + pubkey: pubkey, } return p } @@ -314,11 +320,11 @@ func (p *Peer) handle(msg Msg) error { msg.Discard() go SendItems(p.rw, pongMsg) case msg.Code == discMsg: - var reason [1]DiscReason // This is the last message. We don't need to discard or // check errors because, the connection will be closed after it. - _ = rlp.Decode(msg.Payload, &reason) - return fmt.Errorf("peer has: %w", reason[0]) + var m struct{ R DiscReason } + rlp.Decode(msg.Payload, &m) + return m.R case msg.Code < baseProtocolLength: // ignore other base protocol messages msg.Discard() @@ -509,7 +515,7 @@ func (p *Peer) Info() *PeerInfo { for _, proto := range p.running { protoInfo := interface{}("unknown") if query := proto.Protocol.PeerInfo; query != nil { - if metadata := query(p.ID()); metadata != nil { + if metadata := query(p.Pubkey()); metadata != nil { protoInfo = metadata } else { protoInfo = "handshake" diff --git a/p2p/peer_error.go b/p2p/peer_error.go index 393cc86b097..aad1a65c7ac 100644 --- a/p2p/peer_error.go +++ b/p2p/peer_error.go @@ -54,7 +54,7 @@ func (pe *peerError) Error() string { var errProtocolReturned = errors.New("protocol returned") -type DiscReason uint +type DiscReason uint8 const ( DiscRequested DiscReason = iota diff --git a/p2p/peer_test.go b/p2p/peer_test.go index 21e0a47921f..637a3f19ca3 100644 --- a/p2p/peer_test.go +++ b/p2p/peer_test.go @@ -98,7 +98,7 @@ func testPeer(protos []Protocol) (func(), *conn, *Peer, <-chan error) { c2.caps = append(c2.caps, p.cap()) } - peer := newPeer(log.Root(), c1, protos) + peer := newPeer(log.Root(), c1, protos, [64]byte{1}) errc := make(chan error, 1) go func() { _, err := peer.run() @@ -250,7 +250,7 @@ func TestNewPeer(t *testing.T) { name := "nodename" caps := []Cap{{"foo", 2}, {"bar", 3}} id := randomID() - p := NewPeer(id, name, caps) + p := NewPeer(id, [64]byte{1}, name, caps) if p.ID() != id { t.Errorf("ID mismatch: got %v, expected %v", p.ID(), id) } diff --git a/p2p/protocol.go b/p2p/protocol.go index 44c8c7555e1..8195262282d 100644 --- a/p2p/protocol.go +++ b/p2p/protocol.go @@ -52,7 +52,7 @@ type Protocol struct { // PeerInfo is an optional helper method to retrieve protocol specific metadata // about a certain peer in the network. If an info retrieval function is set, // but returns nil, it is assumed that the protocol handshake is still running. - PeerInfo func(id enode.ID) interface{} + PeerInfo func(peerID [64]byte) interface{} // DialCandidates, if non-nil, is a way to tell Server about protocol-specific nodes // that should be dialed. The server continuously reads nodes from the iterator and diff --git a/p2p/rlpx/rlpx.go b/p2p/rlpx/rlpx.go index f83e36332bb..ae253e1a785 100644 --- a/p2p/rlpx/rlpx.go +++ b/p2p/rlpx/rlpx.go @@ -139,7 +139,7 @@ func (c *Conn) Read() (code uint64, data []byte, wireSize int, err error) { } code, data, err = rlp.SplitUint64(frame) if err != nil { - return 0, nil, 0, fmt.Errorf("invalid message code: %v", err) + return 0, nil, 0, fmt.Errorf("invalid message code: %w", err) } wireSize = len(data) @@ -567,7 +567,7 @@ func (h *handshakeState) makeAuthMsg(prv *ecdsa.PrivateKey) (*authMsgV4, error) msg := new(authMsgV4) copy(msg.Signature[:], signature) - copy(msg.InitiatorPubkey[:], crypto.FromECDSAPub(&prv.PublicKey)[1:]) + copy(msg.InitiatorPubkey[:], crypto.MarshalPubkey(&prv.PublicKey)) copy(msg.Nonce[:], h.initNonce) msg.Version = 4 return msg, nil @@ -631,7 +631,7 @@ func (h *handshakeState) sealEIP8(msg interface{}) ([]byte, error) { } // Pad with random amount of data. the amount needs to be at least 100 bytes to make // the message distinguishable from pre-EIP-8 handshakes. - h.wbuf.appendZero(mrand.Intn(100) + 100) + h.wbuf.appendZero(mrand.Intn(100) + 100) //nolint:gosec prefix := make([]byte, 2) binary.BigEndian.PutUint16(prefix, uint16(len(h.wbuf.data)+eciesOverhead)) @@ -640,20 +640,18 @@ func (h *handshakeState) sealEIP8(msg interface{}) ([]byte, error) { return append(prefix, enc...), err } -// importPublicKey unmarshals 512 bit public keys. +// importPublicKey unmarshals 64 or 65 bytes long public keys. func importPublicKey(pubKey []byte) (*ecies.PublicKey, error) { - var pubKey65 []byte + var pub *ecdsa.PublicKey + var err error switch len(pubKey) { case 64: - // add 'uncompressed key' flag - pubKey65 = append([]byte{0x04}, pubKey...) + pub, err = crypto.UnmarshalPubkey(pubKey) case 65: - pubKey65 = pubKey + pub, err = crypto.UnmarshalPubkeyStd(pubKey) default: return nil, fmt.Errorf("invalid public key length %v (expect 64/65)", len(pubKey)) } - // TODO: fewer pointless conversions - pub, err := crypto.UnmarshalPubkey(pubKey65) if err != nil { return nil, err } diff --git a/p2p/rlpx/rlpx_test.go b/p2p/rlpx/rlpx_test.go index 03102dc2245..3353fd39365 100644 --- a/p2p/rlpx/rlpx_test.go +++ b/p2p/rlpx/rlpx_test.go @@ -268,12 +268,12 @@ var ( func TestHandshakeForwardCompatibility(t *testing.T) { var ( - pubA = crypto.FromECDSAPub(&keyA.PublicKey)[1:] - pubB = crypto.FromECDSAPub(&keyB.PublicKey)[1:] + pubA = crypto.MarshalPubkey(&keyA.PublicKey) + pubB = crypto.MarshalPubkey(&keyB.PublicKey) ephA, _ = crypto.HexToECDSA("869d6ecf5211f1cc60418a13b9d870b22959d0c16f02bec714c960dd2298a32d") ephB, _ = crypto.HexToECDSA("e238eb8e04fee6511ab04c6dd3c89ce097b11f25d584863ac2b6d5b35b1847e4") - ephPubA = crypto.FromECDSAPub(&ephA.PublicKey)[1:] - ephPubB = crypto.FromECDSAPub(&ephB.PublicKey)[1:] + ephPubA = crypto.MarshalPubkey(&ephA.PublicKey) + ephPubB = crypto.MarshalPubkey(&ephB.PublicKey) nonceA = unhex("7e968bba13b6c50e2c4cd7f241cc0d64d1ac25c7f5952df231ac6a2bda8ee5d6") nonceB = unhex("559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd") _, _, _, _ = pubA, pubB, ephPubA, ephPubB diff --git a/p2p/server.go b/p2p/server.go index c6723b90501..b7b152b8547 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -19,14 +19,13 @@ package p2p import ( "bytes" + "context" "crypto/ecdsa" "encoding/hex" "errors" "fmt" - "io/ioutil" + "golang.org/x/sync/semaphore" "net" - "os" - "path" "sort" "sync" "sync/atomic" @@ -54,8 +53,7 @@ const ( discmixTimeout = 5 * time.Second // Connectivity defaults. - defaultMaxPendingPeers = 50 - defaultDialRatio = 3 + defaultDialRatio = 3 // This time limits inbound connection attempts per source IP. inboundThrottleTime = 30 * time.Second @@ -68,8 +66,6 @@ const ( frameWriteTimeout = 20 * time.Second ) -var EnodeAddressFileName = path.Join(os.TempDir(), "enode_address.tmp") - var errServerStopped = errors.New("server stopped") // Config holds Server options. @@ -83,7 +79,7 @@ type Config struct { // MaxPendingPeers is the maximum number of peers that can be pending in the // handshake phase, counted separately for inbound and outbound connections. - // Zero defaults to preset values. + // It must be greater than zero. MaxPendingPeers int `toml:",omitempty"` // DialRatio controls the ratio of inbound to dialed connections. @@ -160,8 +156,8 @@ type Config struct { // whenever a message is sent to or received from a peer EnableMsgEvents bool - // Logger is a custom logger to use with the p2p.Server. - Logger log.Logger `toml:",omitempty"` + // Log is a custom logger to use with the p2p.Server. + Log log.Logger `toml:",omitempty"` // it is actually used but a linter got confused clock mclock.Clock //nolint:structcheck @@ -195,7 +191,9 @@ type Server struct { dialsched *dialScheduler // Channels into the run loop. - quit chan struct{} + quitCtx context.Context + quitFunc context.CancelFunc + quit <-chan struct{} addtrusted chan *enode.Node removetrusted chan *enode.Node peerOp chan peerOpFunc @@ -230,11 +228,12 @@ const ( type conn struct { fd net.Conn transport - node *enode.Node - flags connFlag - cont chan error // The run loop uses cont to signal errors to SetupConn. - caps []Cap // valid after the protocol handshake - name string // valid after the protocol handshake + node *enode.Node + flags connFlag + cont chan error // The run loop uses cont to signal errors to SetupConn. + caps []Cap // valid after the protocol handshake + name string // valid after the protocol handshake + pubkey [64]byte } type transport interface { @@ -245,8 +244,8 @@ type transport interface { // handshake has completed. The code uses conn.id to track this // by setting it to a non-nil value after the encryption handshake. MsgReadWriter - // transports must provide Close because we use MsgPipe in some of - // the tests. Closing the actual network connection doesn't do + // transports must provide Close because we use MsgPipe in some + // tests. Closing the actual network connection doesn't do // anything in those tests because MsgPipe doesn't use it. close(err error) } @@ -383,7 +382,7 @@ func (srv *Server) RemoveTrustedPeer(node *enode.Node) { } } -// SubscribePeers subscribes the given channel to peer events +// SubscribeEvents subscribes the given channel to peer events. func (srv *Server) SubscribeEvents(ch chan *PeerEvent) event.Subscription { return srv.peerFeed.Subscribe(ch) } @@ -405,14 +404,20 @@ func (srv *Server) Self() *enode.Node { func (srv *Server) Stop() { srv.lock.Lock() if !srv.running { + if srv.nodedb != nil { + srv.nodedb.Close() + } srv.lock.Unlock() return } srv.running = false - close(srv.quit) + srv.quitFunc() if srv.listener != nil { // this unblocks listener Accept - srv.listener.Close() + _ = srv.listener.Close() + } + if srv.nodedb != nil { + srv.nodedb.Close() } srv.lock.Unlock() srv.loopWG.Wait() @@ -451,14 +456,14 @@ func (srv *Server) Running() bool { // Start starts running the server. // Servers can not be re-used after stopping. -func (srv *Server) Start() (err error) { +func (srv *Server) Start(ctx context.Context) error { srv.lock.Lock() defer srv.lock.Unlock() if srv.running { return errors.New("server already running") } - srv.running = true - srv.log = srv.Config.Logger + + srv.log = srv.Config.Log if srv.log == nil { srv.log = log.Root() } @@ -473,13 +478,17 @@ func (srv *Server) Start() (err error) { if srv.PrivateKey == nil { return errors.New("Server.PrivateKey must be set to a non-nil key") } + if srv.MaxPendingPeers <= 0 { + return errors.New("MaxPendingPeers must be greater than zero") + } if srv.newTransport == nil { srv.newTransport = newRLPX } if srv.listenFunc == nil { srv.listenFunc = net.Listen } - srv.quit = make(chan struct{}) + srv.quitCtx, srv.quitFunc = context.WithCancel(ctx) + srv.quit = srv.quitCtx.Done() srv.delpeer = make(chan peerDrop) srv.checkpointPostHandshake = make(chan *conn) srv.checkpointAddPeer = make(chan *conn) @@ -492,15 +501,16 @@ func (srv *Server) Start() (err error) { return err } if srv.ListenAddr != "" { - if err := srv.setupListening(); err != nil { + if err := srv.setupListening(srv.quitCtx); err != nil { return err } } - if err := srv.setupDiscovery(); err != nil { + if err := srv.setupDiscovery(srv.quitCtx); err != nil { return err } srv.setupDialScheduler() + srv.running = true srv.loopWG.Add(1) go srv.run() return nil @@ -508,8 +518,8 @@ func (srv *Server) Start() (err error) { func (srv *Server) setupLocalNode() error { // Create the devp2p handshake. - pubkey := crypto.FromECDSAPub(&srv.PrivateKey.PublicKey) - srv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, ID: pubkey[1:]} + pubkey := crypto.MarshalPubkey(&srv.PrivateKey.PublicKey) + srv.ourHandshake = &protoHandshake{Version: baseProtocolVersion, Name: srv.Name, Pubkey: pubkey} for _, p := range srv.Protocols { srv.ourHandshake.Caps = append(srv.ourHandshake.Caps, p.cap()) } @@ -550,7 +560,7 @@ func (srv *Server) setupLocalNode() error { return nil } -func (srv *Server) setupDiscovery() error { +func (srv *Server) setupDiscovery(ctx context.Context) error { srv.discmix = enode.NewFairMix(discmixTimeout) // Add protocol-specific discovery sources. @@ -576,14 +586,14 @@ func (srv *Server) setupDiscovery() error { return err } realaddr := conn.LocalAddr().(*net.UDPAddr) - srv.log.Debug("UDP listener up", "addr", realaddr) + srv.log.Trace("UDP listener up", "addr", realaddr) if srv.NAT != nil { - if !realaddr.IP.IsLoopback() { + if !realaddr.IP.IsLoopback() && srv.NAT.SupportsMapping() { srv.loopWG.Add(1) go func() { defer debug.LogPanic() + defer srv.loopWG.Done() nat.Map(srv.NAT, srv.quit, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") - srv.loopWG.Done() }() } } @@ -604,7 +614,7 @@ func (srv *Server) setupDiscovery() error { Unhandled: unhandled, Log: srv.log, } - ntab, err := discover.ListenV4(conn, srv.localnode, cfg) + ntab, err := discover.ListenV4(ctx, conn, srv.localnode, cfg) if err != nil { return err } @@ -622,9 +632,9 @@ func (srv *Server) setupDiscovery() error { } var err error if sconn != nil { - srv.DiscV5, err = discover.ListenV5(sconn, srv.localnode, cfg) + srv.DiscV5, err = discover.ListenV5(ctx, sconn, srv.localnode, cfg) } else { - srv.DiscV5, err = discover.ListenV5(conn, srv.localnode, cfg) + srv.DiscV5, err = discover.ListenV5(ctx, conn, srv.localnode, cfg) } if err != nil { return err @@ -638,7 +648,7 @@ func (srv *Server) setupDialScheduler() { self: srv.localnode.ID(), maxDialPeers: srv.maxDialedConns(), maxActiveDials: srv.MaxPendingPeers, - log: srv.Logger, + log: srv.Log, netRestrict: srv.NetRestrict, dialer: srv.Dialer, clock: srv.clock, @@ -678,7 +688,7 @@ func (srv *Server) maxDialedConns() (limit int) { return limit } -func (srv *Server) setupListening() error { +func (srv *Server) setupListening(ctx context.Context) error { // Launch the listener. listener, err := srv.listenFunc("tcp", srv.ListenAddr) if err != nil { @@ -690,18 +700,22 @@ func (srv *Server) setupListening() error { // Update the local node record and map the TCP listening port if NAT is configured. if tcp, ok := listener.Addr().(*net.TCPAddr); ok { srv.localnode.Set(enr.TCP(tcp.Port)) - if !tcp.IP.IsLoopback() && srv.NAT != nil { + if !tcp.IP.IsLoopback() && (srv.NAT != nil) && srv.NAT.SupportsMapping() { srv.loopWG.Add(1) go func() { defer debug.LogPanic() + defer srv.loopWG.Done() nat.Map(srv.NAT, srv.quit, "tcp", tcp.Port, tcp.Port, "ethereum p2p") - srv.loopWG.Done() }() } } srv.loopWG.Add(1) - go srv.listenLoop() + go func() { + defer debug.LogPanic() + defer srv.loopWG.Done() + srv.listenLoop(ctx) + }() return nil } @@ -717,12 +731,6 @@ func (srv *Server) doPeerOp(fn peerOpFunc) { // run is the main loop of the server. func (srv *Server) run() { defer debug.LogPanic() - if srv.localnode.Node().TCP() > 0 { - err := ioutil.WriteFile(EnodeAddressFileName, []byte(srv.localnode.Node().URLv4()), 0600) - if err != nil { - srv.log.Error("Write enode to file failed", "self", srv.localnode.Node().URLv4()) - } - } if len(srv.Config.Protocols) > 0 { srv.log.Info("Started P2P networking", "version", srv.Config.Protocols[0].Version, "self", srv.localnode.Node().URLv4(), "name", srv.Name) } @@ -778,18 +786,17 @@ running: // Ensure that the trusted flag is set before checking against MaxPeers. c.flags |= trustedConn } - // TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them. - c.cont <- srv.postHandshakeChecks(peers, inboundCount, c) + c.cont <- nil case c := <-srv.checkpointAddPeer: // At this point the connection is past the protocol handshake. // Its capabilities are known and the remote identity is verified. - err := srv.addPeerChecks(peers, inboundCount, c) + err := srv.postHandshakeChecks(peers, inboundCount, c) if err == nil { // The handshakes are done and it passed all checks. - p := srv.launchPeer(c) + p := srv.launchPeer(c, c.pubkey) peers[c.node.ID()] = p - srv.log.Debug("Adding p2p peer", "peercount", len(peers), "id", p.ID(), "conn", c.flags, "addr", p.RemoteAddr(), "name", p.Name()) + srv.log.Trace("Adding p2p peer", "peercount", len(peers), "id", p.ID(), "conn", c.flags, "addr", p.RemoteAddr(), "name", p.Name()) srv.dialsched.peerAdded(c) if p.Inbound() { inboundCount++ @@ -801,7 +808,7 @@ running: // A peer disconnected. d := common.PrettyDuration(mclock.Now() - pd.created) delete(peers, pd.ID()) - srv.log.Debug("Removing p2p peer", "peercount", len(peers), "id", pd.ID(), "duration", d, "req", pd.requested, "err", pd.err) + srv.log.Trace("Removing p2p peer", "peercount", len(peers), "id", pd.ID(), "duration", d, "req", pd.requested, "err", pd.err) srv.dialsched.peerRemoved(pd.rw) if pd.Inbound() { inboundCount-- @@ -842,49 +849,35 @@ func (srv *Server) postHandshakeChecks(peers map[enode.ID]*Peer, inboundCount in return DiscAlreadyConnected case c.node.ID() == srv.localnode.ID(): return DiscSelf + case (len(srv.Protocols) > 0) && (countMatchingProtocols(srv.Protocols, c.caps) == 0): + return DiscUselessPeer default: return nil } } -func (srv *Server) addPeerChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { - // Drop connections with no matching protocols. - if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 { - return DiscUselessPeer - } - // Repeat the post-handshake checks because the - // peer set might have changed since those checks were performed. - return srv.postHandshakeChecks(peers, inboundCount, c) -} - // listenLoop runs in its own goroutine and accepts // inbound connections. -func (srv *Server) listenLoop() { - defer debug.LogPanic() - srv.log.Debug("TCP listener up", "addr", srv.listener.Addr()) +func (srv *Server) listenLoop(ctx context.Context) { + srv.log.Trace("TCP listener up", "addr", srv.listener.Addr()) - // The slots channel limits accepts of new connections. - tokens := defaultMaxPendingPeers - if srv.MaxPendingPeers > 0 { - tokens = srv.MaxPendingPeers - } - slots := make(chan struct{}, tokens) - for i := 0; i < tokens; i++ { - slots <- struct{}{} - } + // The slots limit accepts of new connections. + slots := semaphore.NewWeighted(int64(srv.MaxPendingPeers)) // Wait for slots to be returned on exit. This ensures all connection goroutines // are down before listenLoop returns. - defer srv.loopWG.Done() defer func() { - for i := 0; i < cap(slots); i++ { - <-slots - } + _ = slots.Acquire(ctx, int64(srv.MaxPendingPeers)) }() for { // Wait for a free slot before accepting. - <-slots + if slotErr := slots.Acquire(ctx, 1); slotErr != nil { + if !errors.Is(slotErr, context.Canceled) { + srv.log.Error("Failed to get a peer connection slot", "err", slotErr) + } + return + } var ( fd net.Conn @@ -895,14 +888,19 @@ func (srv *Server) listenLoop() { fd, err = srv.listener.Accept() if netutil.IsTemporaryError(err) { if time.Since(lastLog) > 1*time.Second { - srv.log.Debug("Temporary read error", "err", err) + srv.log.Trace("Temporary read error", "err", err) lastLog = time.Now() } time.Sleep(time.Millisecond * 200) continue } else if err != nil { - srv.log.Debug("Read error", "err", err) - slots <- struct{}{} + // Log the error unless the server is shutting down. + select { + case <-srv.quit: + default: + srv.log.Error("Server listener failed to accept a connection", "err", err) + } + slots.Release(1) return } break @@ -910,9 +908,9 @@ func (srv *Server) listenLoop() { remoteIP := netutil.AddrIP(fd.RemoteAddr()) if err := srv.checkInboundConn(fd, remoteIP); err != nil { - srv.log.Debug("Rejected inbound connnection", "addr", fd.RemoteAddr(), "err", err) - fd.Close() - slots <- struct{}{} + srv.log.Trace("Rejected inbound connection", "addr", fd.RemoteAddr(), "err", err) + _ = fd.Close() + slots.Release(1) continue } if remoteIP != nil { @@ -925,8 +923,9 @@ func (srv *Server) listenLoop() { } go func() { defer debug.LogPanic() - srv.SetupConn(fd, inboundConn, nil) - slots <- struct{}{} + defer slots.Release(1) + // The error is logged in Server.setupConn(). + _ = srv.SetupConn(fd, inboundConn, nil) }() } } @@ -993,6 +992,7 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro srv.log.Trace("Failed RLPx handshake", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err) return err } + copy(c.pubkey[:], crypto.MarshalPubkey(remotePubkey)[1:]) if dialDest != nil { c.node = dialDest } else { @@ -1011,8 +1011,8 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro clog.Trace("Failed p2p handshake", "err", err) return err } - if id := c.node.ID(); !bytes.Equal(crypto.Keccak256(phs.ID), id[:]) { - clog.Trace("Wrong devp2p handshake identity", "phsid", hex.EncodeToString(phs.ID)) + if id := c.node.ID(); !bytes.Equal(crypto.Keccak256(phs.Pubkey), id[:]) { + clog.Trace("Wrong devp2p handshake identity", "phsid", hex.EncodeToString(phs.Pubkey)) return DiscUnexpectedIdentity } c.caps, c.name = phs.Caps, phs.Name @@ -1046,8 +1046,8 @@ func (srv *Server) checkpoint(c *conn, stage chan<- *conn) error { return <-c.cont } -func (srv *Server) launchPeer(c *conn) *Peer { - p := newPeer(srv.log, c, srv.Protocols) +func (srv *Server) launchPeer(c *conn, pubkey [64]byte) *Peer { + p := newPeer(srv.log, c, srv.Protocols, pubkey) if srv.EnableMsgEvents { // If message events are enabled, pass the peerFeed // to the peer. @@ -1093,7 +1093,7 @@ func (srv *Server) runPeer(p *Peer) { // NodeInfo represents a short summary of the information known about the host. type NodeInfo struct { - ID string `json:"id"` // Unique node identifier (also the encryption key) + ID string `json:"id"` // Unique node identifier Name string `json:"name"` // Name of the node, including client type, version, OS, custom data Enode string `json:"enode"` // Enode URL for adding this peer from remote peers ENR string `json:"enr"` // Ethereum Node Record diff --git a/p2p/server_test.go b/p2p/server_test.go index 0e89966a228..40ef5c2c631 100644 --- a/p2p/server_test.go +++ b/p2p/server_test.go @@ -17,6 +17,7 @@ package p2p import ( + "context" "crypto/ecdsa" "crypto/sha256" "errors" @@ -57,8 +58,8 @@ func (c *testTransport) doEncHandshake(prv *ecdsa.PrivateKey) (*ecdsa.PublicKey, } func (c *testTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, error) { - pubkey := crypto.FromECDSAPub(c.rpub)[1:] - return &protoHandshake{ID: pubkey, Name: "test"}, nil + pubkey := crypto.MarshalPubkey(c.rpub) + return &protoHandshake{Pubkey: pubkey, Name: "test"}, nil } func (c *testTransport) close(err error) { @@ -68,12 +69,13 @@ func (c *testTransport) close(err error) { func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) *Server { config := Config{ - Name: "test", - MaxPeers: 10, - ListenAddr: "127.0.0.1:0", - NoDiscovery: true, - PrivateKey: newkey(), - Logger: testlog.Logger(t, log.LvlTrace), + Name: "test", + MaxPeers: 10, + MaxPendingPeers: 10, + ListenAddr: "127.0.0.1:0", + NoDiscovery: true, + PrivateKey: newkey(), + Log: testlog.Logger(t, log.LvlError), } server := &Server{ Config: config, @@ -82,12 +84,16 @@ func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) * return newTestTransport(remoteKey, fd, dialDest) }, } - if err := server.Start(); err != nil { + if err := server.TestStart(); err != nil { t.Fatalf("Could not start server: %v", err) } return server } +func (srv *Server) TestStart() error { + return srv.Start(context.Background()) +} + func TestServerListen(t *testing.T) { // start the test server connected := make(chan *Peer) @@ -206,24 +212,26 @@ func TestServerDial(t *testing.T) { // This test checks that RemovePeer disconnects the peer if it is connected. func TestServerRemovePeerDisconnect(t *testing.T) { srv1 := &Server{Config: Config{ - PrivateKey: newkey(), - MaxPeers: 1, - NoDiscovery: true, - Logger: testlog.Logger(t, log.LvlTrace).New("server", "1"), + PrivateKey: newkey(), + MaxPeers: 1, + MaxPendingPeers: 1, + NoDiscovery: true, + Log: testlog.Logger(t, log.LvlTrace).New("server", "1"), }} srv2 := &Server{Config: Config{ - PrivateKey: newkey(), - MaxPeers: 1, - NoDiscovery: true, - NoDial: true, - ListenAddr: "127.0.0.1:0", - Logger: testlog.Logger(t, log.LvlTrace).New("server", "2"), + PrivateKey: newkey(), + MaxPeers: 1, + MaxPendingPeers: 1, + NoDiscovery: true, + NoDial: true, + ListenAddr: "127.0.0.1:0", + Log: testlog.Logger(t, log.LvlTrace).New("server", "2"), }} - if err := srv1.Start(); err != nil { + if err := srv1.TestStart(); err != nil { t.Fatal("cant start srv1") } defer srv1.Stop() - if err := srv2.Start(); err != nil { + if err := srv2.TestStart(); err != nil { t.Fatal("cant start srv2") } defer srv2.Stop() @@ -244,15 +252,16 @@ func TestServerAtCap(t *testing.T) { trustedID := enode.PubkeyToIDV4(&trustedNode.PublicKey) srv := &Server{ Config: Config{ - PrivateKey: newkey(), - MaxPeers: 10, - NoDial: true, - NoDiscovery: true, - TrustedNodes: []*enode.Node{newNode(trustedID, "")}, - Logger: testlog.Logger(t, log.LvlTrace), + PrivateKey: newkey(), + MaxPeers: 10, + MaxPendingPeers: 10, + NoDial: true, + NoDiscovery: true, + TrustedNodes: []*enode.Node{newNode(trustedID, "")}, + Log: testlog.Logger(t, log.LvlTrace), }, } - if err := srv.Start(); err != nil { + if err := srv.TestStart(); err != nil { t.Fatalf("could not start: %v", err) } defer srv.Stop() @@ -265,22 +274,30 @@ func TestServerAtCap(t *testing.T) { } // Inject a few connections to fill up the peer set. - for i := 0; i < 10; i++ { + for i := 0; i < srv.Config.MaxPeers; i++ { c := newconn(randomID()) if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil { t.Fatalf("could not add conn %d: %v", i, err) } } + // Try inserting a non-trusted connection. anotherID := randomID() c := newconn(anotherID) - if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { + t.Error("unexpected error @ checkpointPostHandshake:", err) + } + if err := srv.checkpoint(c, srv.checkpointAddPeer); err != DiscTooManyPeers { t.Error("wrong error for insert:", err) } + // Try inserting a trusted connection. c = newconn(trustedID) if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { - t.Error("unexpected error for trusted conn @posthandshake:", err) + t.Error("unexpected error @ checkpointPostHandshake:", err) + } + if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil { + t.Error("unexpected error for trusted conn:", err) } if !c.is(trustedConn) { t.Error("Server did not set trusted flag") @@ -289,7 +306,10 @@ func TestServerAtCap(t *testing.T) { // Remove from trusted set and try again srv.RemoveTrustedPeer(newNode(trustedID, "")) c = newconn(trustedID) - if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { + t.Error("unexpected error @ checkpointPostHandshake:", err) + } + if err := srv.checkpoint(c, srv.checkpointAddPeer); err != DiscTooManyPeers { t.Error("wrong error for insert:", err) } @@ -297,7 +317,10 @@ func TestServerAtCap(t *testing.T) { srv.AddTrustedPeer(newNode(anotherID, "")) c = newconn(anotherID) if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { - t.Error("unexpected error for trusted conn @posthandshake:", err) + t.Error("unexpected error @ checkpointPostHandshake:", err) + } + if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil { + t.Error("unexpected error for trusted conn:", err) } if !c.is(trustedConn) { t.Error("Server did not set trusted flag") @@ -312,24 +335,24 @@ func TestServerPeerLimits(t *testing.T) { var tp = &setupTransport{ pubkey: &clientkey.PublicKey, phs: protoHandshake{ - ID: crypto.FromECDSAPub(&clientkey.PublicKey)[1:], - // Force "DiscUselessPeer" due to unmatching caps - // Caps: []Cap{discard.cap()}, + Pubkey: crypto.MarshalPubkey(&clientkey.PublicKey), + Caps: []Cap{discard.cap()}, }, } srv := &Server{ Config: Config{ - PrivateKey: srvkey, - MaxPeers: 0, - NoDial: true, - NoDiscovery: true, - Protocols: []Protocol{discard}, - Logger: testlog.Logger(t, log.LvlTrace), + PrivateKey: srvkey, + MaxPeers: 0, + MaxPendingPeers: 50, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Log: testlog.Logger(t, log.LvlTrace), }, newTransport: func(fd net.Conn, dialDest *ecdsa.PublicKey) transport { return tp }, } - if err := srv.Start(); err != nil { + if err := srv.TestStart(); err != nil { t.Fatalf("couldn't start server: %v", err) } defer srv.Stop() @@ -338,35 +361,31 @@ func TestServerPeerLimits(t *testing.T) { flags := dynDialedConn dialDest := clientnode conn, _ := net.Pipe() - srv.SetupConn(conn, flags, dialDest) - if tp.closeErr != DiscTooManyPeers { - t.Errorf("unexpected close error: %q", tp.closeErr) + err := srv.SetupConn(conn, flags, dialDest) + _ = conn.Close() + if !errors.Is(err, DiscTooManyPeers) { + t.Fatalf("expected DiscTooManyPeers, but got error: %q", err) } - conn.Close() srv.AddTrustedPeer(clientnode) // Check that server allows a trusted peer despite being full. conn, _ = net.Pipe() - srv.SetupConn(conn, flags, dialDest) - if tp.closeErr == DiscTooManyPeers { - t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr) - } - - if tp.closeErr != DiscUselessPeer { - t.Errorf("unexpected close error: %q", tp.closeErr) + err = srv.SetupConn(conn, flags, dialDest) + _ = conn.Close() + if err != nil { + t.Fatalf("failed to bypass MaxPeers with trusted node: %q", err) } - conn.Close() srv.RemoveTrustedPeer(clientnode) // Check that server is full again. conn, _ = net.Pipe() - srv.SetupConn(conn, flags, dialDest) - if tp.closeErr != DiscTooManyPeers { - t.Errorf("unexpected close error: %q", tp.closeErr) + err = srv.SetupConn(conn, flags, dialDest) + _ = conn.Close() + if !errors.Is(err, DiscTooManyPeers) { + t.Fatalf("expected DiscTooManyPeers, but got error: %q", err) } - conn.Close() } func TestServerSetupConn(t *testing.T) { @@ -397,7 +416,7 @@ func TestServerSetupConn(t *testing.T) { wantCloseErr: errors.New("read error"), }, { - tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: randomID().Bytes()}}, + tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{Pubkey: randomID().Bytes()}}, dialDest: enode.NewV4(clientpub, nil, 0, 0), flags: dynDialedConn, wantCalls: "doEncHandshake,doProtoHandshake,close,", @@ -411,13 +430,13 @@ func TestServerSetupConn(t *testing.T) { wantCloseErr: errors.New("foo"), }, { - tt: &setupTransport{pubkey: srvpub, phs: protoHandshake{ID: crypto.FromECDSAPub(srvpub)[1:]}}, + tt: &setupTransport{pubkey: srvpub, phs: protoHandshake{Pubkey: crypto.MarshalPubkey(srvpub)}}, flags: inboundConn, - wantCalls: "doEncHandshake,close,", + wantCalls: "doEncHandshake,doProtoHandshake,close,", wantCloseErr: DiscSelf, }, { - tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{ID: crypto.FromECDSAPub(clientpub)[1:]}}, + tt: &setupTransport{pubkey: clientpub, phs: protoHandshake{Pubkey: crypto.MarshalPubkey(clientpub)}}, flags: inboundConn, wantCalls: "doEncHandshake,doProtoHandshake,close,", wantCloseErr: DiscUselessPeer, @@ -427,20 +446,21 @@ func TestServerSetupConn(t *testing.T) { for i, test := range tests { t.Run(test.wantCalls, func(t *testing.T) { cfg := Config{ - PrivateKey: srvkey, - MaxPeers: 10, - NoDial: true, - NoDiscovery: true, - Protocols: []Protocol{discard}, - Logger: testlog.Logger(t, log.LvlTrace), + PrivateKey: srvkey, + MaxPeers: 10, + MaxPendingPeers: 10, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Log: testlog.Logger(t, log.LvlTrace), } srv := &Server{ Config: cfg, newTransport: func(fd net.Conn, dialDest *ecdsa.PublicKey) transport { return test.tt }, //nolint:scopelint - log: cfg.Logger, + log: cfg.Log, } if !test.dontstart { - if err := srv.Start(); err != nil { + if err := srv.TestStart(); err != nil { t.Fatalf("couldn't start server: %v", err) } defer srv.Stop() @@ -479,6 +499,7 @@ func (c *setupTransport) doProtoHandshake(our *protoHandshake) (*protoHandshake, } return &c.phs, nil } + func (c *setupTransport) close(err error) { c.calls += "close," c.closeErr = err @@ -486,10 +507,11 @@ func (c *setupTransport) close(err error) { // setupConn shouldn't write to/read from the connection. func (c *setupTransport) WriteMsg(Msg) error { - panic("WriteMsg called on setupTransport") + return errors.New("WriteMsg called on setupTransport") } + func (c *setupTransport) ReadMsg() (Msg, error) { - panic("ReadMsg called on setupTransport") + return Msg{}, errors.New("ReadMsg called on setupTransport") } func newkey() *ecdsa.PrivateKey { @@ -513,13 +535,14 @@ func TestServerInboundThrottle(t *testing.T) { newTransportCalled := make(chan struct{}) srv := &Server{ Config: Config{ - PrivateKey: newkey(), - ListenAddr: "127.0.0.1:0", - MaxPeers: 10, - NoDial: true, - NoDiscovery: true, - Protocols: []Protocol{discard}, - Logger: testlog.Logger(t, log.LvlTrace), + PrivateKey: newkey(), + ListenAddr: "127.0.0.1:0", + MaxPeers: 10, + MaxPendingPeers: 10, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Log: testlog.Logger(t, log.LvlTrace), }, newTransport: func(fd net.Conn, dialDest *ecdsa.PublicKey) transport { newTransportCalled <- struct{}{} @@ -530,7 +553,7 @@ func TestServerInboundThrottle(t *testing.T) { return listenFakeAddr(network, laddr, fakeAddr) }, } - if err := srv.Start(); err != nil { + if err := srv.TestStart(); err != nil { t.Fatal("can't start: ", err) } defer srv.Stop() diff --git a/p2p/simulations/adapters/exec.go b/p2p/simulations/adapters/exec.go deleted file mode 100644 index 8533dc140eb..00000000000 --- a/p2p/simulations/adapters/exec.go +++ /dev/null @@ -1,569 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package adapters - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net" - "net/http" - "os" - "os/exec" - "os/signal" - "path/filepath" - "strings" - "sync" - "syscall" - "time" - - "github.com/docker/docker/pkg/reexec" - - "github.com/ledgerwatch/erigon/node" - "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/p2p/enode" - "github.com/ledgerwatch/erigon/rpc" - "github.com/ledgerwatch/log/v3" - - "github.com/gorilla/websocket" -) - -func init() { - // Register a reexec function to start a simulation node when the current binary is - // executed as "p2p-node" (rather than whatever the main() function would normally do). - reexec.Register("p2p-node", execP2PNode) -} - -// ExecAdapter is a NodeAdapter which runs simulation nodes by executing the current binary -// as a child process. -type ExecAdapter struct { - // BaseDir is the directory under which the data directories for each - // simulation node are created. - BaseDir string - - nodes map[enode.ID]*ExecNode -} - -// NewExecAdapter returns an ExecAdapter which stores node data in -// subdirectories of the given base directory -func NewExecAdapter(baseDir string) *ExecAdapter { - return &ExecAdapter{ - BaseDir: baseDir, - nodes: make(map[enode.ID]*ExecNode), - } -} - -// Name returns the name of the adapter for logging purposes -func (e *ExecAdapter) Name() string { - return "exec-adapter" -} - -// NewNode returns a new ExecNode using the given config -func (e *ExecAdapter) NewNode(config *NodeConfig) (Node, error) { - if len(config.Lifecycles) == 0 { - return nil, errors.New("node must have at least one service lifecycle") - } - for _, service := range config.Lifecycles { - if _, exists := lifecycleConstructorFuncs[service]; !exists { - return nil, fmt.Errorf("unknown node service %q", service) - } - } - - // create the node directory using the first 12 characters of the ID - // as Unix socket paths cannot be longer than 256 characters - dir := filepath.Join(e.BaseDir, config.ID.String()[:12]) - if err := os.MkdirAll(dir, 0755); err != nil { - return nil, fmt.Errorf("error creating node directory: %s", err) - } - - err := config.initDummyEnode() - if err != nil { - return nil, err - } - - // generate the config - conf := &execNodeConfig{ - Stack: node.DefaultConfig, - Node: config, - } - if config.DataDir != "" { - conf.Stack.DataDir = config.DataDir - } else { - conf.Stack.DataDir = filepath.Join(dir, "data") - } - - // these parameters are crucial for execadapter node to run correctly - conf.Stack.WSHost = "127.0.0.1" - conf.Stack.WSPort = 0 - conf.Stack.WSOrigins = []string{"*"} - conf.Stack.WSExposeAll = true - conf.Stack.P2P.EnableMsgEvents = config.EnableMsgEvents - conf.Stack.P2P.NoDiscovery = true - conf.Stack.P2P.NAT = nil - - // Listen on a localhost port, which we set when we - // initialise NodeConfig (usually a random port) - conf.Stack.P2P.ListenAddr = fmt.Sprintf(":%d", config.Port) - - node := &ExecNode{ - ID: config.ID, - Dir: dir, - Config: conf, - adapter: e, - } - node.newCmd = node.execCommand - e.nodes[node.ID] = node - return node, nil -} - -// ExecNode starts a simulation node by exec'ing the current binary and -// running the configured services -type ExecNode struct { - ID enode.ID - Dir string - Config *execNodeConfig - Cmd *exec.Cmd - Info *p2p.NodeInfo - - adapter *ExecAdapter - client *rpc.Client - wsAddr string - newCmd func() *exec.Cmd -} - -// Addr returns the node's enode URL -func (n *ExecNode) Addr() []byte { - if n.Info == nil { - return nil - } - return []byte(n.Info.Enode) -} - -// Client returns an rpc.Client which can be used to communicate with the -// underlying services (it is set once the node has started) -func (n *ExecNode) Client() (*rpc.Client, error) { - return n.client, nil -} - -// Start exec's the node passing the ID and service as command line arguments -// and the node config encoded as JSON in an environment variable. -func (n *ExecNode) Start(snapshots map[string][]byte) error { - if n.Cmd != nil { - return errors.New("already started") - } - var started bool - defer func() { - if !started { - _ = n.Stop() - } - }() - - // encode a copy of the config containing the snapshot - confCopy := *n.Config - confCopy.Snapshots = snapshots - confCopy.PeerAddrs = make(map[string]string) - for id, node := range n.adapter.nodes { - confCopy.PeerAddrs[id.String()] = node.wsAddr - } - confData, confDataErr := json.Marshal(confCopy) - if confDataErr != nil { - return fmt.Errorf("error generating node config: %s", confDataErr) - } - // expose the admin namespace via websocket if it's not enabled - exposed := confCopy.Stack.WSExposeAll - if !exposed { - for _, api := range confCopy.Stack.WSModules { - if api == "admin" { - exposed = true - break - } - } - } - if !exposed { - confCopy.Stack.WSModules = append(confCopy.Stack.WSModules, "admin") - } - // start the one-shot server that waits for startup information - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - statusURL, statusC := n.waitForStartupJSON(ctx) - - // start the node - cmd := n.newCmd() - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - cmd.Env = append(os.Environ(), - envStatusURL+"="+statusURL, - envNodeConfig+"="+string(confData), - ) - if err := cmd.Start(); err != nil { - return fmt.Errorf("error starting node: %s", err) - } - n.Cmd = cmd - - // Wait for the node to start. - status := <-statusC - if status.Err != "" { - return errors.New(status.Err) - } - client, err := rpc.DialWebsocket(ctx, status.WSEndpoint, "") - if err != nil { - return fmt.Errorf("can't connect to RPC server: %v", err) - } - - // Node ready :) - n.client = client - n.wsAddr = status.WSEndpoint - n.Info = status.NodeInfo - - started = true - return nil -} - -// waitForStartupJSON runs a one-shot HTTP server to receive a startup report. -func (n *ExecNode) waitForStartupJSON(ctx context.Context) (string, chan nodeStartupJSON) { - var ( - ch = make(chan nodeStartupJSON, 1) - quitOnce sync.Once - srv http.Server - ) - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - ch <- nodeStartupJSON{Err: err.Error()} - return "", ch - } - quit := func(status nodeStartupJSON) { - quitOnce.Do(func() { - l.Close() - ch <- status - }) - } - srv.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - var status nodeStartupJSON - if err := json.NewDecoder(r.Body).Decode(&status); err != nil { - status.Err = fmt.Sprintf("can't decode startup report: %v", err) - } - quit(status) - }) - // Run the HTTP server, but don't wait forever and shut it down - // if the context is canceled. - go func() { - _ = srv.Serve(l) - }() - go func() { - <-ctx.Done() - quit(nodeStartupJSON{Err: "didn't get startup report"}) - }() - - url := "http://" + l.Addr().String() - return url, ch -} - -// execCommand returns a command which runs the node locally by exec'ing -// the current binary but setting argv[0] to "p2p-node" so that the child -// runs execP2PNode -func (n *ExecNode) execCommand() *exec.Cmd { - return &exec.Cmd{ - Path: reexec.Self(), - Args: []string{"p2p-node", strings.Join(n.Config.Node.Lifecycles, ","), n.ID.String()}, - } -} - -// Stop stops the node by first sending SIGTERM and then SIGKILL if the node -// doesn't stop within 5s -func (n *ExecNode) Stop() error { - if n.Cmd == nil { - return nil - } - defer func() { - n.Cmd = nil - }() - - if n.client != nil { - n.client.Close() - n.client = nil - n.wsAddr = "" - n.Info = nil - } - - if err := n.Cmd.Process.Signal(syscall.SIGTERM); err != nil { - return n.Cmd.Process.Kill() - } - waitErr := make(chan error, 1) - go func() { - waitErr <- n.Cmd.Wait() - }() - select { - case err := <-waitErr: - return err - case <-time.After(5 * time.Second): - return n.Cmd.Process.Kill() - } -} - -// NodeInfo returns information about the node -func (n *ExecNode) NodeInfo() *p2p.NodeInfo { - info := &p2p.NodeInfo{ - ID: n.ID.String(), - } - if n.client != nil { - _ = n.client.Call(&info, "admin_nodeInfo") - } - return info -} - -// ServeRPC serves RPC requests over the given connection by dialling the -// node's WebSocket address and joining the two connections -func (n *ExecNode) ServeRPC(clientConn *websocket.Conn) error { - conn, _, err := websocket.DefaultDialer.Dial(n.wsAddr, nil) - if err != nil { - return err - } - var wg sync.WaitGroup - wg.Add(2) - go wsCopy(&wg, conn, clientConn) - go wsCopy(&wg, clientConn, conn) - wg.Wait() - conn.Close() - return nil -} - -func wsCopy(wg *sync.WaitGroup, src, dst *websocket.Conn) { - defer wg.Done() - for { - msgType, r, err := src.NextReader() - if err != nil { - return - } - w, err := dst.NextWriter(msgType) - if err != nil { - return - } - if _, err = io.Copy(w, r); err != nil { - return - } - } -} - -// Snapshots creates snapshots of the services by calling the -// simulation_snapshot RPC method -func (n *ExecNode) Snapshots() (map[string][]byte, error) { - if n.client == nil { - return nil, errors.New("RPC not started") - } - var snapshots map[string][]byte - return snapshots, n.client.Call(&snapshots, "simulation_snapshot") -} - -// execNodeConfig is used to serialize the node configuration so it can be -// passed to the child process as a JSON encoded environment variable -type execNodeConfig struct { - Stack node.Config `json:"stack"` - Node *NodeConfig `json:"node"` - Snapshots map[string][]byte `json:"snapshots,omitempty"` - PeerAddrs map[string]string `json:"peer_addrs,omitempty"` -} - -func initLogging() { - // Initialize the logging by default first. - //glogger := log.NewGlogHandler(log.StreamHandler(os.Stderr, log.LogfmtFormat())) - //glogger.Verbosity(log.LvlInfo) - //log.Root().SetHandler(glogger) - - confEnv := os.Getenv(envNodeConfig) - if confEnv == "" { - return - } - var conf execNodeConfig - if err := json.Unmarshal([]byte(confEnv), &conf); err != nil { - return - } - //var writer = os.Stderr - //if conf.Node.LogFile != "" { - //logWriter, err := os.Create(conf.Node.LogFile) - //if err != nil { - // return - //} - //writer = logWriter - //} - var verbosity = log.LvlInfo - if conf.Node.LogVerbosity <= log.LvlTrace && conf.Node.LogVerbosity >= log.LvlCrit { - verbosity = conf.Node.LogVerbosity - } - - log.Root().SetHandler(log.LvlFilterHandler(verbosity, log.StderrHandler)) - - // Reinitialize the logger - //glogger = log.NewGlogHandler(log.StreamHandler(writer, log.TerminalFormat())) - //glogger.Verbosity(verbosity) - //log.Root().SetHandler(glogger) -} - -// execP2PNode starts a simulation node when the current binary is executed with -// argv[0] being "p2p-node", reading the service / ID from argv[1] / argv[2] -// and the node config from an environment variable. -func execP2PNode() { - initLogging() - - statusURL := os.Getenv(envStatusURL) - if statusURL == "" { - log.Crit("missing " + envStatusURL) - } - - // Start the node and gather startup report. - var status nodeStartupJSON - stack, stackErr := startExecNodeStack() - if stackErr != nil { - status.Err = stackErr.Error() - } else { - status.WSEndpoint = stack.WSEndpoint() - status.NodeInfo = stack.Server().NodeInfo() - } - - // Send status to the host. - statusJSON, _ := json.Marshal(status) - if _, err := http.Post(statusURL, "application/json", bytes.NewReader(statusJSON)); err != nil { - log.Crit("Can't post startup info", "url", statusURL, "err", err) - } - if stackErr != nil { - os.Exit(1) - } - - // Stop the stack if we get a SIGTERM signal. - go func() { - sigc := make(chan os.Signal, 1) - signal.Notify(sigc, syscall.SIGTERM) - defer signal.Stop(sigc) - <-sigc - log.Info("Received SIGTERM, shutting down...") - stack.Close() - }() - stack.Wait() // Wait for the stack to exit. -} - -func startExecNodeStack() (*node.Node, error) { - // read the services from argv - serviceNames := strings.Split(os.Args[1], ",") - - // decode the config - confEnv := os.Getenv(envNodeConfig) - if confEnv == "" { - return nil, fmt.Errorf("missing " + envNodeConfig) - } - var conf execNodeConfig - if err := json.Unmarshal([]byte(confEnv), &conf); err != nil { - return nil, fmt.Errorf("error decoding %s: %v", envNodeConfig, err) - } - - // create enode record - nodeTcpConn, _ := net.ResolveTCPAddr("tcp", conf.Stack.P2P.ListenAddr) - if nodeTcpConn.IP == nil { - nodeTcpConn.IP = net.IPv4(127, 0, 0, 1) - } - _ = conf.Node.initEnode(nodeTcpConn.IP, nodeTcpConn.Port, nodeTcpConn.Port) - conf.Stack.P2P.PrivateKey = conf.Node.PrivateKey - conf.Stack.Logger = log.New("node.id", conf.Node.ID.String()) - - // initialize the devp2p stack - stack, err := node.New(&conf.Stack) - if err != nil { - return nil, fmt.Errorf("error creating node stack: %v", err) - } - - // Register the services, collecting them into a map so they can - // be accessed by the snapshot API. - services := make(map[string]node.Lifecycle, len(serviceNames)) - for _, name := range serviceNames { - lifecycleFunc, exists := lifecycleConstructorFuncs[name] - if !exists { - return nil, fmt.Errorf("unknown node service %q", err) - } - ctx := &ServiceContext{ - RPCDialer: &wsRPCDialer{addrs: conf.PeerAddrs}, - Config: conf.Node, - } - if conf.Snapshots != nil { - ctx.Snapshot = conf.Snapshots[name] - } - service, err1 := lifecycleFunc(ctx, stack) - if err1 != nil { - return nil, err1 - } - services[name] = service - } - - // Add the snapshot API. - stack.RegisterAPIs([]rpc.API{{ - Namespace: "simulation", - Version: "1.0", - Service: SnapshotAPI{services}, - }}) - - if err = stack.Start(); err != nil { - err = fmt.Errorf("error starting stack: %v", err) - } - return stack, err -} - -const ( - envStatusURL = "_P2P_STATUS_URL" - envNodeConfig = "_P2P_NODE_CONFIG" -) - -// nodeStartupJSON is sent to the simulation host after startup. -type nodeStartupJSON struct { - Err string - WSEndpoint string - NodeInfo *p2p.NodeInfo -} - -// SnapshotAPI provides an RPC method to create snapshots of services -type SnapshotAPI struct { - services map[string]node.Lifecycle -} - -func (api SnapshotAPI) Snapshot() (map[string][]byte, error) { - snapshots := make(map[string][]byte) - for name, service := range api.services { - if s, ok := service.(interface { - Snapshot() ([]byte, error) - }); ok { - snap, err := s.Snapshot() - if err != nil { - return nil, err - } - snapshots[name] = snap - } - } - return snapshots, nil -} - -type wsRPCDialer struct { - addrs map[string]string -} - -// DialRPC implements the RPCDialer interface by creating a WebSocket RPC -// client of the given node -func (w *wsRPCDialer) DialRPC(id enode.ID) (*rpc.Client, error) { - addr, ok := w.addrs[id.String()] - if !ok { - return nil, fmt.Errorf("unknown node: %s", id) - } - return rpc.DialWebsocket(context.Background(), addr, "http://localhost") -} diff --git a/p2p/simulations/adapters/inproc.go b/p2p/simulations/adapters/inproc.go index d51cc7451d1..9b539701e5b 100644 --- a/p2p/simulations/adapters/inproc.go +++ b/p2p/simulations/adapters/inproc.go @@ -26,6 +26,7 @@ import ( "github.com/ledgerwatch/erigon/event" "github.com/ledgerwatch/erigon/node" + "github.com/ledgerwatch/erigon/node/nodecfg" "github.com/ledgerwatch/erigon/p2p" "github.com/ledgerwatch/erigon/p2p/enode" "github.com/ledgerwatch/erigon/p2p/simulations/pipes" @@ -92,15 +93,17 @@ func (s *SimAdapter) NewNode(config *NodeConfig) (Node, error) { return nil, err } - n, err := node.New(&node.Config{ + n, err := node.New(&nodecfg.Config{ P2P: p2p.Config{ PrivateKey: config.PrivateKey, MaxPeers: math.MaxInt32, + MaxPendingPeers: 50, NoDiscovery: true, Dialer: s, EnableMsgEvents: config.EnableMsgEvents, }, - Logger: log.New("node.id", id.String()), + // Convert node ID to string once, rather than for every log line + Log: log.New("node.id", id.String()), }) if err != nil { return nil, err diff --git a/p2p/simulations/adapters/types.go b/p2p/simulations/adapters/types.go index 30478ded291..d6b59c22d77 100644 --- a/p2p/simulations/adapters/types.go +++ b/p2p/simulations/adapters/types.go @@ -22,11 +22,8 @@ import ( "encoding/json" "fmt" "net" - "os" "strconv" - "github.com/docker/docker/pkg/reexec" - "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/node" "github.com/ledgerwatch/erigon/p2p" @@ -220,11 +217,11 @@ func RandomNodeConfig() *NodeConfig { panic("unable to assign tcp port") } - enodId := enode.PubkeyToIDV4(&prvkey.PublicKey) + enodeId := enode.PubkeyToIDV4(&prvkey.PublicKey) return &NodeConfig{ PrivateKey: prvkey, - ID: enodId, - Name: fmt.Sprintf("node_%s", enodId.String()), + ID: enodeId, + Name: "node_" + enodeId.String(), Port: port, EnableMsgEvents: true, LogVerbosity: log.LvlInfo, @@ -288,13 +285,6 @@ func RegisterLifecycles(lifecycles LifecycleConstructors) { } lifecycleConstructorFuncs[name] = f } - - // now we have registered the services, run reexec.Init() which will - // potentially start one of the services if the current binary has - // been exec'd with argv[0] set to "p2p-node" - if reexec.Init() { - os.Exit(0) - } } // adds the host part to the configuration's ENR, signs it diff --git a/p2p/simulations/examples/ping-pong.go b/p2p/simulations/examples/ping-pong.go index d21dad22810..5210ec76d5b 100644 --- a/p2p/simulations/examples/ping-pong.go +++ b/p2p/simulations/examples/ping-pong.go @@ -19,9 +19,8 @@ package main import ( "flag" "fmt" - "io/ioutil" + "io" "net/http" - "os" "sync/atomic" "time" @@ -62,15 +61,6 @@ func main() { log.Info("using sim adapter") adapter = adapters.NewSimAdapter(services) - case "exec": - tmpdir, err := ioutil.TempDir("", "p2p-example") - if err != nil { - log.Crit("error creating temp dir", "err", err) - } - defer os.RemoveAll(tmpdir) - log.Info("using exec adapter", "tmpdir", tmpdir) - adapter = adapters.NewExecAdapter(tmpdir) - default: log.Crit(fmt.Sprintf("unknown node adapter %q", *adapterType)) } @@ -156,7 +146,7 @@ func (p *pingPongService) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error { errC <- err return } - payload, err := ioutil.ReadAll(msg.Payload) + payload, err := io.ReadAll(msg.Payload) if err != nil { errC <- err return diff --git a/p2p/simulations/http.go b/p2p/simulations/http.go index 4cf67a1ec9b..25321e0f902 100644 --- a/p2p/simulations/http.go +++ b/p2p/simulations/http.go @@ -23,7 +23,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "strconv" "strings" @@ -112,7 +111,7 @@ func (c *Client) SubscribeNetwork(events chan *Event, opts SubscribeOpts) (event return nil, err } if res.StatusCode != http.StatusOK { - response, _ := ioutil.ReadAll(res.Body) + response, _ := io.ReadAll(res.Body) res.Body.Close() return nil, fmt.Errorf("unexpected HTTP status: %s: %s", res.Status, response) } @@ -252,7 +251,7 @@ func (c *Client) Send(method, path string, in, out interface{}) error { } defer res.Body.Close() if res.StatusCode != http.StatusOK && res.StatusCode != http.StatusCreated { - response, _ := ioutil.ReadAll(res.Body) + response, _ := io.ReadAll(res.Body) return fmt.Errorf("unexpected HTTP status: %s: %s", res.Status, response) } if out != nil { diff --git a/p2p/simulations/mocker.go b/p2p/simulations/mocker.go index a3328e0cb55..9c3f76d2e28 100644 --- a/p2p/simulations/mocker.go +++ b/p2p/simulations/mocker.go @@ -76,18 +76,18 @@ func startStop(net *Network, quit chan struct{}, nodeCount int) { id := nodes[rand.Intn(len(nodes))] log.Info("stopping node", "id", id) if err := net.Stop(id); err != nil { - log.Error("error stopping node", "id", id, "err", err) + log.Error("Error stopping node", "id", id, "err", err) return } select { case <-quit: - log.Info("Terminating simulation loop") + log.Info("Terminating simulation loop ...") return case <-time.After(3 * time.Second): } - log.Debug("starting node", "id", id) + log.Trace("Starting node ...", "id", id) if err := net.Start(id); err != nil { log.Error("error starting node", "id", id, "err", err) return @@ -147,7 +147,7 @@ func probabilistic(net *Network, quit chan struct{}, nodeCount int) { return case <-time.After(randWait): } - log.Debug(fmt.Sprintf("node %v shutting down", nodes[i])) + log.Trace(fmt.Sprintf("Node %v shutting down ...", nodes[i])) err := net.Stop(nodes[i]) if err != nil { log.Error("Error stopping node", "node", nodes[i]) @@ -186,7 +186,7 @@ func connectNodesInRing(net *Network, nodeCount int) ([]enode.ID, error) { log.Error("Error starting a node!", "err", err) return nil, err } - log.Debug(fmt.Sprintf("node %v starting up", id)) + log.Trace(fmt.Sprintf("Node %v starting up", id)) } for i, id := range ids { peerID := ids[(i+1)%len(ids)] diff --git a/p2p/simulations/mocker_test.go b/p2p/simulations/mocker_test.go index 706613416be..34b02223a69 100644 --- a/p2p/simulations/mocker_test.go +++ b/p2p/simulations/mocker_test.go @@ -125,6 +125,8 @@ func TestMocker(t *testing.T) { if err != nil { t.Fatalf("Could not start mocker: %s", err) } + defer resp.Body.Close() + if resp.StatusCode != 200 { t.Fatalf("Invalid Status Code received for starting mocker, expected 200, got %d", resp.StatusCode) } @@ -146,15 +148,17 @@ func TestMocker(t *testing.T) { if err != nil { t.Fatalf("Could not stop mocker: %s", err) } + defer resp.Body.Close() if resp.StatusCode != 200 { t.Fatalf("Invalid Status Code received for stopping mocker, expected 200, got %d", resp.StatusCode) } //reset the network - _, err = http.Post(s.URL+"/reset", "", nil) + r, err := http.Post(s.URL+"/reset", "", nil) if err != nil { t.Fatalf("Could not reset network: %s", err) } + r.Body.Close() //now the number of nodes in the network should be zero nodesInfo, err = client.GetNodes() diff --git a/p2p/simulations/network.go b/p2p/simulations/network.go index 47458664fc9..68e3c40bb00 100644 --- a/p2p/simulations/network.go +++ b/p2p/simulations/network.go @@ -199,12 +199,12 @@ func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) // subscribe to peer events client, err := node.Client() if err != nil { - return fmt.Errorf("error getting rpc client for node %v: %s", id, err) + return fmt.Errorf("error getting rpc client for node %v: %w", id, err) } events := make(chan *p2p.PeerEvent) sub, err := client.Subscribe(context.Background(), "admin", events, "peerEvents") if err != nil { - return fmt.Errorf("error getting peer events for node %v: %s", id, err) + return fmt.Errorf("error getting peer events for node %v: %w", id, err) } go net.watchPeerEvents(id, events, sub) return nil @@ -311,7 +311,7 @@ func (net *Network) Connect(oneID, otherID enode.ID) error { } func (net *Network) connect(oneID, otherID enode.ID) error { - log.Debug("Connecting nodes with addPeer", "id", oneID, "other", otherID) + log.Trace("Connecting nodes with addPeer", "id", oneID, "other", otherID) conn, err := net.initConn(oneID, otherID) if err != nil { return err @@ -683,7 +683,7 @@ func (net *Network) initConn(oneID, otherID enode.ID) (*Conn, error) { log.Trace("Nodes not up", "err", err) return nil, fmt.Errorf("nodes not up: %v", err) } - log.Debug("Connection initiated", "id", oneID, "other", otherID) + log.Trace("Connection initiated", "id", oneID, "other", otherID) conn.initiated = time.Now() return conn, nil } @@ -691,7 +691,7 @@ func (net *Network) initConn(oneID, otherID enode.ID) (*Conn, error) { // Shutdown stops all nodes in the network and closes the quit channel func (net *Network) Shutdown() { for _, node := range net.Nodes { - log.Debug("Stopping node", "id", node.ID()) + log.Trace("Stopping node", "id", node.ID()) if err := node.Stop(); err != nil { log.Warn("Can't stop node", "id", node.ID(), "err", err) } diff --git a/p2p/simulations/network_test.go b/p2p/simulations/network_test.go index b780226cc9d..f2cb9eab2b1 100644 --- a/p2p/simulations/network_test.go +++ b/p2p/simulations/network_test.go @@ -118,7 +118,7 @@ OUTER: checkIds[ev.Conn.One] = append(checkIds[ev.Conn.One], ev.Conn.Other) checkIds[ev.Conn.Other] = append(checkIds[ev.Conn.Other], ev.Conn.One) connEventCount-- - log.Debug("ev", "count", connEventCount) + log.Trace("ev", "count", connEventCount) if connEventCount == 0 { break OUTER } @@ -135,7 +135,7 @@ OUTER: if err != nil { t.Fatal(err) } - log.Debug("snapshot taken", "nodes", len(snap.Nodes), "conns", len(snap.Conns), "json", string(j)) + log.Trace("snapshot taken", "nodes", len(snap.Nodes), "conns", len(snap.Conns), "json", string(j)) // verify that the snap element numbers check out if len(checkIds) != len(snap.Conns) || len(checkIds) != len(snap.Nodes) { @@ -214,11 +214,11 @@ OuterTwo: if !ev.Conn.Up { t.Fatalf("unexpected disconnect: %v -> %v", ev.Conn.One, ev.Conn.Other) } - log.Debug("conn", "on", ev.Conn.One, "other", ev.Conn.Other) + log.Trace("conn", "on", ev.Conn.One, "other", ev.Conn.Other) checkIds[ev.Conn.One] = append(checkIds[ev.Conn.One], ev.Conn.Other) checkIds[ev.Conn.Other] = append(checkIds[ev.Conn.Other], ev.Conn.One) connEventCount-- - log.Debug("ev", "count", connEventCount) + log.Trace("ev", "count", connEventCount) if connEventCount == 0 { break OuterTwo } @@ -473,7 +473,7 @@ func TestGetNodeIDs(t *testing.T) { } if !match { - t.Fatalf("A created node was not returned by GetNodes(), ID: %s", node1.ID().String()) + t.Fatalf("A created node was not returned by GetNodes(), ID: %s", node1.ID()) } } @@ -484,7 +484,7 @@ func TestGetNodeIDs(t *testing.T) { } for _, nodeID := range gotNodeIDsExcl { if bytes.Equal(excludeNodeID.Bytes(), nodeID.Bytes()) { - t.Fatalf("GetNodeIDs returned the node ID we excluded, ID: %s", nodeID.String()) + t.Fatalf("GetNodeIDs returned the node ID we excluded, ID: %s", nodeID) } } } @@ -523,7 +523,7 @@ func TestGetNodes(t *testing.T) { } if !match { - t.Fatalf("A created node was not returned by GetNodes(), ID: %s", node1.ID().String()) + t.Fatalf("A created node was not returned by GetNodes(), ID: %s", node1.ID()) } } @@ -534,7 +534,7 @@ func TestGetNodes(t *testing.T) { } for _, node := range gotNodesExcl { if bytes.Equal(excludeNodeID.Bytes(), node.ID().Bytes()) { - t.Fatalf("GetNodes returned the node we excluded, ID: %s", node.ID().String()) + t.Fatalf("GetNodes returned the node we excluded, ID: %s", node.ID()) } } } @@ -579,7 +579,7 @@ func TestGetNodesByID(t *testing.T) { } if !match { - t.Fatalf("A created node was not returned by GetNodesByID(), ID: %s", node1.ID().String()) + t.Fatalf("A created node was not returned by GetNodesByID(), ID: %s", node1.ID()) } } } @@ -625,7 +625,7 @@ func TestGetNodesByProperty(t *testing.T) { } if !match { - t.Fatalf("A created node with property was not returned by GetNodesByProperty(), ID: %s", node1.ID().String()) + t.Fatalf("A created node with property was not returned by GetNodesByProperty(), ID: %s", node1.ID()) } } } @@ -672,7 +672,7 @@ func TestGetNodeIDsByProperty(t *testing.T) { } if !match { - t.Fatalf("Not all nodes IDs were returned by GetNodeIDsByProperty(), ID: %s", id1.String()) + t.Fatalf("Not all nodes IDs were returned by GetNodeIDsByProperty(), ID: %s", id1) } } } @@ -760,7 +760,7 @@ func benchmarkMinimalServiceTmp(b *testing.B) { defer cancel() for nodid, peers := range protoCMap { for peerid, peerC := range peers { - log.Debug("getting ", "node", nodid, "peer", peerid) + log.Trace("getting ", "node", nodid, "peer", peerid) select { case <-ctx.Done(): b.Fatal(ctx.Err()) diff --git a/p2p/simulations/test.go b/p2p/simulations/test.go index e2160a3cf32..0b5d44c8a32 100644 --- a/p2p/simulations/test.go +++ b/p2p/simulations/test.go @@ -54,7 +54,7 @@ func (t *NoopService) Protocols() []p2p.Protocol { NodeInfo: func() interface{} { return struct{}{} }, - PeerInfo: func(id enode.ID) interface{} { + PeerInfo: func(peerID [64]byte) interface{} { return struct{}{} }, Attributes: []enr.Entry{}, diff --git a/p2p/transport.go b/p2p/transport.go index 30dca9417a5..c98e667934e 100644 --- a/p2p/transport.go +++ b/p2p/transport.go @@ -27,7 +27,6 @@ import ( "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/bitutil" - "github.com/ledgerwatch/erigon/metrics" "github.com/ledgerwatch/erigon/p2p/rlpx" "github.com/ledgerwatch/erigon/rlp" ) @@ -102,11 +101,12 @@ func (t *rlpxTransport) WriteMsg(msg Msg) error { // Set metrics. msg.meterSize = size - if metrics.Enabled && msg.meterCap.Name != "" { // don't meter non-subprotocol messages - m := fmt.Sprintf("%s/%s/%d/%#02x", egressMeterName, msg.meterCap.Name, msg.meterCap.Version, msg.meterCode) - metrics.GetOrRegisterMeter(m, nil).Mark(int64(msg.meterSize)) - metrics.GetOrRegisterMeter(m+"/packets", nil).Mark(1) - } + // TODO: use "github.com/VictoriaMetrics/metrics" + //if metrics.Enabled && msg.meterCap.Name != "" { // don't meter non-subprotocol messages + // m := fmt.Sprintf("%s/%s/%d/%#02x", egressMeterName, msg.meterCap.Name, msg.meterCap.Version, msg.meterCode) + // metrics.GetOrRegisterMeter(m, nil).Mark(int64(msg.meterSize)) + // metrics.GetOrRegisterMeter(m+"/packets", nil).Mark(1) + //} return nil } @@ -150,7 +150,7 @@ func (t *rlpxTransport) doProtoHandshake(our *protoHandshake) (their *protoHands return nil, err } if err := <-werr; err != nil { - return nil, fmt.Errorf("write error: %v", err) + return nil, fmt.Errorf("write error: %w", err) } // If the protocol version supports Snappy encoding, upgrade immediately t.conn.SetSnappy(their.Version >= snappyProtocolVersion) @@ -184,7 +184,7 @@ func readProtocolHandshake(rw MsgReader) (*protoHandshake, error) { if err := msg.Decode(&hs); err != nil { return nil, err } - if len(hs.ID) != 64 || !bitutil.TestBytes(hs.ID) { + if len(hs.Pubkey) != 64 || !bitutil.TestBytes(hs.Pubkey) { return nil, DiscInvalidIdentity } return &hs, nil diff --git a/p2p/transport_test.go b/p2p/transport_test.go index 136a74ba2b6..c1138dabd5c 100644 --- a/p2p/transport_test.go +++ b/p2p/transport_test.go @@ -30,12 +30,12 @@ import ( func TestProtocolHandshake(t *testing.T) { var ( prv0, _ = crypto.GenerateKey() - pub0 = crypto.FromECDSAPub(&prv0.PublicKey)[1:] - hs0 = &protoHandshake{Version: 3, ID: pub0, Caps: []Cap{{"a", 0}, {"b", 2}}} + pub0 = crypto.MarshalPubkey(&prv0.PublicKey) + hs0 = &protoHandshake{Version: 3, Pubkey: pub0, Caps: []Cap{{"a", 0}, {"b", 2}}} prv1, _ = crypto.GenerateKey() - pub1 = crypto.FromECDSAPub(&prv1.PublicKey)[1:] - hs1 = &protoHandshake{Version: 3, ID: pub1, Caps: []Cap{{"c", 1}, {"d", 3}}} + pub1 = crypto.MarshalPubkey(&prv1.PublicKey) + hs1 = &protoHandshake{Version: 3, Pubkey: pub1, Caps: []Cap{{"c", 1}, {"d", 3}}} wg sync.WaitGroup ) diff --git a/params/bootnodes.go b/params/bootnodes.go index 3dcdad3cda1..c11a73ae409 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -16,7 +16,10 @@ package params -import "github.com/ledgerwatch/erigon/common" +import ( + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/params/networkname" +) // MainnetBootnodes are the enode URLs of the P2P bootstrap nodes running on // the main Ethereum network. @@ -24,12 +27,19 @@ var MainnetBootnodes = []string{ // Ethereum Foundation Go Bootnodes "enode://d860a01f9722d78051619d1e2351aba3f43f943f6f00718d1b9baa4101932a1f5011f16bb2b1bb35db20d6fe28fa0bf09636d26a87d31de9ec6203eeedb1f666@18.138.108.67:30303", // bootnode-aws-ap-southeast-1-001 "enode://22a8232c3abc76a16ae9d6c3b164f98775fe226f0917b0ca871128a74a8e9630b458460865bab457221f1d448dd9791d24c4e5d88786180ac185df813a68d4de@3.209.45.79:30303", // bootnode-aws-us-east-1-001 - "enode://ca6de62fce278f96aea6ec5a2daadb877e51651247cb96ee310a318def462913b653963c155a0ef6c7d50048bba6e6cea881130857413d9f50a621546b590758@34.255.23.113:30303", // bootnode-aws-eu-west-1-001 - "enode://279944d8dcd428dffaa7436f25ca0ca43ae19e7bcf94a8fb7d1641651f92d121e972ac2e8f381414b80cc8e5555811c2ec6e1a99bb009b3f53c4c69923e11bd8@35.158.244.151:30303", // bootnode-aws-eu-central-1-001 "enode://8499da03c47d637b20eee24eec3c356c9a2e6148d6fe25ca195c7949ab8ec2c03e3556126b0d7ed644675e78c4318b08691b7b57de10e5f0d40d05b09238fa0a@52.187.207.27:30303", // bootnode-azure-australiaeast-001 "enode://103858bdb88756c71f15e9b5e09b56dc1be52f0a5021d46301dbbfb7e130029cc9d0d6f73f693bc29b665770fff7da4d34f3c6379fe12721b5d7a0bcb5ca1fc1@191.234.162.198:30303", // bootnode-azure-brazilsouth-001 "enode://715171f50508aba88aecd1250af392a45a330af91d7b90701c436b618c86aaa1589c9184561907bebbb56439b8f8787bc01f49a7c77276c58c1b09822d75e8e8@52.231.165.108:30303", // bootnode-azure-koreasouth-001 "enode://5d6d7cd20d6da4bb83a1d28cadb5d409b64edf314c0335df658c1a54e32c7c4a7ab7823d57c39b6a757556e68ff1df17c748b698544a55cb488b52479a92b60f@104.42.217.25:30303", // bootnode-azure-westus-001 + "enode://2b252ab6a1d0f971d9722cb839a42cb81db019ba44c08754628ab4a823487071b5695317c8ccd085219c3a03af063495b2f1da8d18218da2d6a82981b45e6ffc@65.108.70.101:30303", // bootnode-hetzner-hel + "enode://4aeb4ab6c14b23e2c4cfdce879c04b0748a20d8e9b59e25ded2a08143e265c6c25936e74cbc8e641e3312ca288673d91f2f93f8e277de3cfa444ecdaaf982052@157.90.35.166:30303", // bootnode-hetzner-fsn +} + +// SepoliaBootnodes are the enode URLs of the P2P bootstrap nodes running on the +// Sepolia test network. +var SepoliaBootnodes = []string{ + "enode://9246d00bc8fd1742e5ad2428b80fc4dc45d786283e05ef6edbd9002cbc335d40998444732fbe921cb88e1d2c73d1b1de53bae6a2237996e9bfe14f871baf7066@18.168.182.86:30303", + "enode://ec66ddcf1a974950bd4c782789a7e04f8aa7110a72569b6e65fcd51e937e74eed303b1ea734e4d19cfaec9fbff9b6ee65bf31dcb50ba79acce9dd63a6aca61c7@52.14.151.177:30303", } // RopstenBootnodes are the enode URLs of the P2P bootstrap nodes running on the @@ -62,20 +72,106 @@ var GoerliBootnodes = []string{ "enode://a61215641fb8714a373c80edbfa0ea8878243193f57c96eeb44d0bc019ef295abd4e044fd619bfc4c59731a73fb79afe84e9ab6da0c743ceb479cbb6d263fa91@3.11.147.67:30303", // Goerli Initiative bootnodes - "enode://a869b02cec167211fb4815a82941db2e7ed2936fd90e78619c53eb17753fcf0207463e3419c264e2a1dd8786de0df7e68cf99571ab8aeb7c4e51367ef186b1dd@51.15.116.226:30303", - "enode://807b37ee4816ecf407e9112224494b74dd5933625f655962d892f2f0f02d7fbbb3e2a94cf87a96609526f30c998fd71e93e2f53015c558ffc8b03eceaf30ee33@51.15.119.157:30303", - "enode://a59e33ccd2b3e52d578f1fbd70c6f9babda2650f0760d6ff3b37742fdcdfdb3defba5d56d315b40c46b70198c7621e63ffa3f987389c7118634b0fefbbdfa7fd@51.15.119.157:40303", + "enode://d4f764a48ec2a8ecf883735776fdefe0a3949eb0ca476bd7bc8d0954a9defe8fea15ae5da7d40b5d2d59ce9524a99daedadf6da6283fca492cc80b53689fb3b3@46.4.99.122:32109", + "enode://d2b720352e8216c9efc470091aa91ddafc53e222b32780f505c817ceef69e01d5b0b0797b69db254c586f493872352f5a022b4d8479a00fc92ec55f9ad46a27e@88.99.70.182:30303", +} + +var KilnDevNetBootNodes = []string{ + "enode://c354db99124f0faf677ff0e75c3cbbd568b2febc186af664e0c51ac435609badedc67a18a63adb64dacc1780a28dcefebfc29b83fd1a3f4aa3c0eb161364cf94@164.92.130.5:30303", + "enode://d41af1662434cad0a88fe3c7c92375ec5719f4516ab6d8cb9695e0e2e815382c767038e72c224e04040885157da47422f756c040a9072676c6e35c5b1a383cce@138.68.66.103:30303", + "enode://91a745c3fb069f6b99cad10b75c463d527711b106b622756e9ef9f12d2631b6cb885f831d1c8731b9bc7177cae5e1ea1f1be087f86d7d30b590a91f22bc041b0@165.232.180.230:30303", + "enode://b74bd2e8a9f0c53f0c93bcce80818f2f19439fd807af5c7fbc3efb10130c6ee08be8f3aaec7dc0a057ad7b2a809c8f34dc62431e9b6954b07a6548cc59867884@164.92.140.200:30303", } -// ErigonBootnodes are the enode URLs of the P2P bootstrap nodes running on the ErigonNodes devnet -var ErigonBootnodes = []string{} +var BscBootnodes = []string{ + "enode://1cc4534b14cfe351ab740a1418ab944a234ca2f702915eadb7e558a02010cb7c5a8c295a3b56bcefa7701c07752acd5539cb13df2aab8ae2d98934d712611443@52.71.43.172:30311", + "enode://28b1d16562dac280dacaaf45d54516b85bc6c994252a9825c5cc4e080d3e53446d05f63ba495ea7d44d6c316b54cd92b245c5c328c37da24605c4a93a0d099c4@34.246.65.14:30311", + "enode://5a7b996048d1b0a07683a949662c87c09b55247ce774aeee10bb886892e586e3c604564393292e38ef43c023ee9981e1f8b335766ec4f0f256e57f8640b079d5@35.73.137.11:30311", +} +var BscStaticPeers = []string{ + "enode://c688c9a868374ec4fd99f3bf668bff6f1b3c4f7ef6ffa3e908897e4fdc7be99f239d9d3e698db9bc12ae41291b6d32eeaef1d5665662d84b4cf09756e54e4052@3.226.45.227:30311", + "enode://d61a31410c365e7fcd50e24d56a77d2d9741d4a57b295cc5070189ad90d0ec749d113b4b0432c6d795eb36597efce88d12ca45e645ec51b3a2144e1c1c41b66a@34.204.129.242:30311", + "enode://c753758ca72c55dd389c270d4f94dbb5ef6141649f0e3dabe515498378dde9c0363deb8614ad2568a8f020eb02de5eea41f9116eed735972be9ffa452a1ff242@54.81.254.21:30311", + "enode://cfbdc91fe451b4ec95b3b96a379a4b3464ca7d33fe5f0d6783c45dcfaf4431a22a176d2d8aeea6f6309d7c3153e4b307de06aac52b76e39c4146840bc4956bfb@54.236.113.206:30311", + "enode://bf081097931e2a5e092d6df2e903dab87551d4a6ce3b3da1b3df5c1ee705fc3e3191266e6227fea058ce4e1299cf7092f7dee80df2eadced92fd8263406b0b64@34.237.238.206:30311", + "enode://1cc4534b14cfe351ab740a1418ab944a234ca2f702915eadb7e558a02010cb7c5a8c295a3b56bcefa7701c07752acd5539cb13df2aab8ae2d98934d712611443@100.24.179.110:30311", + "enode://c09132e0ac4875c1b0ac2856e032875f174debc76c779b125ec2dc44e94ae42b6db4412b970f15a6e618a48a6ffff6f42230222d6e61e30fd4426a1af82b154b@54.85.57.23:30311", + "enode://c6ffd994c4ef130f90f8ee2fc08c1b0f02a6e9b12152092bf5a03dd7af9fd33597d4b2e2000a271cc0648d5e55242aeadd6d5061bb2e596372655ba0722cc704@54.147.151.108:30311", + "enode://786acbdf5a3cf91b99047a0fd8305e11e54d96ea3a72b1527050d3d6f8c9fc0278ff9ef56f3e56b3b70a283d97c309065506ea2fc3eb9b62477fd014a3ec1a96@107.23.90.162:30311", + "enode://d257b0f8d362161bb4a18b13253b1f6abb273a89d85fed73458f84dbf52d14ce556fd32ac07cbc49cd69d99c03ceddeccab919e10351c9d4e795a4c36404aef7@3.218.112.8:30311", + "enode://2aadea249d51e076060c97cbc293a2d90052d1786062f137aa8f4afe06996b674ecdbe660d3033b3d46d9cdaf2c3e3db6c031e218edc5a2613caa7f9705774f9@34.193.176.125:30311", + "enode://0e8b399223f64479d5022b76e8f025214183d0a01b7f044a38a1844f57e9fe89d5da1fa04071758d0c39fe6afba4d5798703b4200a5078664c488129ff8239b7@18.207.56.184:30311", + "enode://742a02a0d8612e6c4a3669f525a9a045e5c7b0d38ab728ca7086901c5f00b90cab8d796eff64dcfa516cff4e45591f8cb3a1e34277810f84e22ac72311c42cd8@52.21.104.255:30311", + "enode://9f2246671f19410e722b4f977e0f2997a95a1614fafccc2db15c9dee810bfb10628d3ecc0f6eed5c2cbc1f7fc71b5fb5eb3afcd533cba5f02a6bda673f99ce29@54.204.215.58:30311", + "enode://bcccac7dfbd21bd1dbbb7bf64ef7af6986520091f00320905e5919d12167fc8c94698099946933747ad2ea24745d35ebc980f9ba1475a839c83574d5ccf318d9@34.196.94.250:30311", + "enode://20d04257749893d7193b8e3ed619d46384d28b350508bef163b52ee9dc60efc4f562aee00c7fde5cfa83e4e9723b0e90d6422d9031b6069734bd7e24a9ed8e73@107.21.209.99:30311", -var CalaverasBootnodes = []string{ - "enode://9e1096aa59862a6f164994cb5cb16f5124d6c992cdbf4535ff7dea43ea1512afe5448dca9df1b7ab0726129603f1a3336b631e4d7a1a44c94daddd03241587f9@3.9.20.133:30303", - "enode://8e6788508278e514268307f27528ffabd6c86e755b0abd5ef170502b6444b35231dd0c7183e902c6a566c650104fdcfa58c6de28b54533f3dc243af444a60f51@quilt.link:30308", - "enode://14bed0619ef778342cb1ed18702004cb29f4324b7d411fc3d20adc8fe2d15c7bb30c663bd8767eaa32eaadcebc227a24e21c006028e12b9c38b25ea5e3147316@217.182.200.86:30303", + //from https://gist.github.com/roderik/60fb0e376518fabaed6d703096269353 + "enode://9f90d69c5fef1ca0b1417a1423038aa493a7f12d8e3d27e10a5a8fd3da216e485cf6c15f48ee310a14729bc3a4b05038479476c0aa82eed3c5d9d2e64ba3a2b3@52.69.42.169:30311", + "enode://78ef719ebb2f4fc222aa988a356274dcd3624fb808936ca2ea77388ca229773d4351f795abf505e86db1a30ed1523ded9f9674d916b295bfb98516b78d2844be@13.231.200.147:30311", + "enode://a8ff9670029785a644fb709ec7cd7e7e2d2b93761872bfe1b011a1ed1c601b23ffa69ead0901b759d780ed65aa81444261905b6964bdf8647bf5b061a4796d2d@54.168.191.244:30311", + "enode://0f0abad52d6e3099776f70fda913611ad33c9f4b7cafad6595691ea1dd57a37804738be65315fc417d41ab52632c55a5f5f1e5ed3123ed64a312341a8c3f9e3c@52.193.230.222:30311", + "enode://ecc277f466f35b249b62de8ca567dfe759162ffecc79f40339655537ee58132aec892bc0c4ad3dfb0ba5441bb7a68301c0c09e3f66454110c2c03ccca084c6b5@54.238.240.9:30311", + "enode://dd3fb5f4da631067d0a9206bb0ac4400d3a076102194257911b632c5aa56f6a3289a855cc0960ad7f2cda3ba5162e0d879448775b07fa73ccd2e4e0477290d9a@54.199.96.72:30311", + "enode://74481dd5079320755588b5243f82ddec7364ad36108ac77272b8e003194bb3f5e6386fcd5e50a0604db1032ac8cb9b58bb813f8e57125ad84ec6ceec65d29b4b@52.192.99.35:30311", + "enode://190df80c16509d9d205145495f169a605d1459e270558f9684fcd7376934e43c65a38999d5e49d2ad118f49abfb6ff62068051ce49acc029da7d2be9910fe9fd@13.113.113.139:30311", + "enode://368fc439d8f86f459822f67d9e8d1984bab32098096dc13d4d361f8a4eaf8362caae3af86e6b31524bda9e46910ac61b075728b14af163eca45413421386b7e2@52.68.165.102:30311", + "enode://2038dac8d835db7c4c1f9d2647e37e6f5c5dc5474853899adb9b61700e575d237156539a720ff53cdb182ee56ac381698f357c7811f8eadc56858e0d141dcce0@18.182.11.67:30311", + "enode://fc0bb7f6fc79ad7d867332073218753cb9fe5687764925f8405459a98b30f8e39d4da3a10f87fe06aa10df426c2c24c3907a4d81df4e3c88e890f7de8f8980de@54.65.239.152:30311", + "enode://3aaaa0e0c7961ef3a9bf05f879f84308ca59651327cf94b64252f67448e582dcd6a6dbe996264367c8aa27fc302736db0283a3516c7406d48f268c5e317b9d49@34.250.1.192:30311", + "enode://62c516645635f0389b4c851bfc4545720fac0607de74942e4ea7e923f4fa2ac0c438c146e2f0721c8ce06dca4e7f30f5c0136569d9f4b6a827c62b980fd53272@52.215.57.20:30311", + "enode://5df2f71ae6b2e3bb92f92badbce1f601feabd2d6ce899cf8265c39c38ff446136d74f5bfa089532c7074bb7606a509a54a2ac66397aaaab2363dad3f43c687a8@79.125.103.83:30311", + "enode://760b5fde9bc14155fa2a87e56cf610701ad6c1adcf44555a7b839baf71f86f11cdadcaf925e50b17c98cc28e20e0df3c3463caad7c6658a76ab68389af639f33@34.243.1.225:30311", + "enode://57824d2d9b5f39681bee265d56ec98a17fa4af343debdeba18596837f776f7c6370d8a33354e2b1750c41b221778e05c4189b93aca0d4cb1d45d32dc3b2d63f1@34.240.198.163:30311", + "enode://9b7ff9e2d2154f6de3f53db2123e6f9a6b5b29414d9d5ae8277592b361158c25fcab86e6bfad5ef6554c6d92fb4ca897f7342563e355b80bcdc994f9c268dc2f@34.251.95.115:30311", + "enode://67ec1f3df346e0aef401175119172e86a20e7ee1442cba4a2074519405cdae3708be3fdcb5e139094408b5d6f6c8e85f89ebb77d04833f7aa251c91344dbd4c9@3.249.178.199:30311", + "enode://99c8d55d4528330fc494705ea15c2a8be9c25cb638ed561657a642d57e7851e38365d20b6864419e82e593e2b8d22cee23a09e9bb774ec8f15795b077bae7aeb@54.229.26.251:30311", + "enode://1afc9727301dcd8d2c5aef067031639ae3d3c7a23f8ba6c588a6a1b2c3cbcd738b4ccc53c07d08690ef591b99fd12f00a005f38d820354a91f418ab0939b9072@34.253.216.225:30311", + "enode://7c7b46ad65325f16768013167a0b2ca3eaa20e5d594011b6202b9c4707f740e2c795e84563b3a8c7986fdfb413ce88726a096f3cac8366ac9ebf073095c20584@34.243.12.13:30311", + "enode://71ef36f019bbdaa2a7b4676a61d014d0be81958e2c60dd95c66a5e1af10de6f3a62ecf9ad0c26b6c5789b81ac22f774abb4735cd9e259185773ebfd1efded5de@54.170.254.50:30311", + "enode://627a1cb2c4712cce439026da0c2f599b97628c90c8ccc55526574a944b7455827544130b3003e79399cd79bd73a06a1d6bbd018fcf9ffc5297d3b731aa1b40ab@3.91.73.29:30311", + "enode://16c7e98f78017dafeaa4129647d1ec66b32ee9be5ec753708820b7363091ceb310f575e7abd9603005e0e34d7b3316c1a4b6c8c42d7f074ed2eb4d073f800a03@3.85.216.212:30311", + "enode://accbc0a5af0af03e1ec3b5e80544bdceea48011a6928cd82d2c1a9c38b65fd48ec970ba17bd8c0b0ec21a28faec9efe1d1ce55134784b9207146e2f62d8932ba@54.162.32.1:30311", + "enode://c64c864572dae7ea25225a412c026ced0de66ae429b40c545be8f524a1aeb70b3441710dbfed19e3ba9ef08ce13b00a58daa7a7510924da8e6f4f412d8b45fd5@3.92.160.2:30311", + "enode://5a838185d4b91eb42cbe3a60bb9f706484d8ec5041fa97b557d10e8ca10a459db0271e06e8b85cad57f1d2c7b05aa4319c0300b2936eefcb2302e10b253cf7d6@23.20.67.34:30311", + "enode://3438d60bcb628ba33b0adf5e653751436fdc393a869fab136dec5ec6b2ed06d8ea30e4fec061f4f4a67bb01644897dbc3d14db44afc052eb69f102340aff70f9@18.215.252.114:30311", + "enode://c307b4cddec0aea2188eafddedb0a076b9289402c63217b4c81eb7f34761c7cfaf6b075e93d7357169e226ff1bb4aa3bd71869b4c76cf261e2991005ddb4d4aa@3.81.81.182:30311", + "enode://80f446f15c3c17b2f8cd7e0f7811f9ba62381abeabc0ce562134d6ac7d400aef212020c439f462d760ca250e8f14b50f215d65e7137d2e3e25d22dc8ff21bda7@54.162.73.225:30311", + "enode://d69853daf3057cc191514afdf56df4769238fde4f261fab80c6e089480abb9916d61180e783d1cc9e5ae56d30ce6261d9954702dc73c41cd47e4b3961830b2dc@184.73.34.17:30311", + "enode://ba88d1a8a5e849bec0eb7df9eabf059f8edeae9a9eb1dcf51b7768276d78b10d4ceecf0cde2ef191ced02f66346d96a36ca9da7d73542757d9677af8da3bad3f@54.198.97.197:30311", + "enode://a232f92d1e76447b93306ece2f6a55ac70ca4633fae0938d71a100757eaf8526e6bbf720aa70cba1e6d186be17291ad1ee851a35596ec6caa2fdf135ce4b6b68@107.20.124.16:30311", + "enode://2d55e48679442a9e3ef2a3edf2854dcb289f8162d57dbda1e82e7576b0708e0670befaa7255f5c9fa8389443a7e7b4ff762c9e7fd33ddf9f21ec9562f03e8945@18.212.135.123:30311", + "enode://f7dc512940ca4a8f6858632abbdfc59cea6c4ed7a8da41ddfc4e4dac74e2664e74355fd7c688b285a22295e0053a800f759c9123ec741285a5bd602f89720cea@54.198.51.232:30311", + "enode://9df97e190f0b82ba7891e0ed556f11f4c1a172c26b2e823e52cfe5722b3df3f1819d2acb87ed0bfeb21fe3aee4ef1ffb8c9227fa7fdf744bfd4f47caad461edf@54.81.89.198:30311", + "enode://55ef168aab6fe8e14bb536a6c5d1d7c9330bad75a597f7e2cfc6233e6e2a6e58fb341ee17917f494f88d7393f191a042be40af7ca43fb6150b0f89280211db28@54.75.119.68:30311", + "enode://ae74385270d4afeb953561603fcedc4a0e755a241ffdea31c3f751dc8be5bf29c03bf46e3051d1c8d997c45479a92632020c9a84b96dcb63b2259ec09b4fde38@18.180.28.21:30311", + "enode://d257b0f8d362161bb4a18b13253b1f6abb273a89d85fed73458f84dbf52d14ce556fd32ac07cbc49cd69d99c03ceddeccab919e10351c9d4e795a4c36404aef7@3.218.112.8:30311", + "enode://faf14b1c38422f9576760b4d86b62ee6d2b436d1cac9965adf3f5af23dece3a9829ad3f53015cda992c6bbdc44816ccc96043fa342b839308681909cbd0ea9b2@52.71.45.253:30311", + "enode://f420209bac5324326c116d38d83edfa2256c4101a27cd3e7f9b8287dc8526900f4137e915df6806986b28bc79b1e66679b544a1c515a95ede86f4d809bd65dab@54.178.62.117:30311", + "enode://e421c47edc33d0d929e755196e92c8e7c26f24a38cc76dd17b0e78c304426e7e6d34e3f4e39f5dae1397c3cfac8238eb45533a62e118b183afd66b652fd1d03a@54.249.78.93:30311", + "enode://c9d6f27e2a2a3d208e02e043106a7fdf94806fca59d50c292b9ae28958162bfc2090a0a38208a68dace3f21674238c27e5f3b34ed8614a7469c6322549305015@3.115.97.167:30311", + "enode://e071da3e6d4ef916c25901e976da90cfc5ec7de3269de09719637787778824da3186638a0f94c03ad90cdafeab32263f6f6cd9b0fbed67a744c25d38f67a5b5e@54.65.247.12:30311", + "enode://45146a7cb02cd127d21cf3c37f533623c5caf4dea31aecc619d5e47ccc38f8377f08be8ce60f9c3429efaa50825c435498880a46b4634ccdc3ed8eb72ba054ae@3.209.235.131:30311", + "enode://590e3069563fa0c46f72b6724c028aa2dda8f4e9ca70b7f288b0c1dcf9d32d74ac98d05da5a3c6473f133b13ed98523c41a567e18e6eadc8b156a3a2b11a791c@3.212.19.242:30311", + "enode://1cc4534b14cfe351ab740a1418ab944a234ca2f702915eadb7e558a02010cb7c5a8c295a3b56bcefa7701c07752acd5539cb13df2aab8ae2d98934d712611443@100.24.179.110:30311", + "enode://82efe88c5070a94e1cb7ec218f3e916a1621eac64067c6973e3103492aebc40d8febf810e12a786e316b8f2f02f35bf93ceaca69bb1852fbf8d5f345cd75f04e@35.75.44.49:30311", + "enode://cb9d9f49c314188b2b9eb38572f16300c64ec2af30cfb044e27aad7f459e4ef52dc49ea2c31b78bebd8055b3bfaa94ddb6e96e75c0bd5928f5b7dc791d84371e@34.246.249.249:30311", + "enode://1f14309a0e695df7afa03512e931d2782301f185d068a98ae9b24e6be88637ad7a7390b8ea074e6b8eb4b62e3f9826936cd7164b4ee4102b74f5b8fc357181fd@18.213.93.106:30311", } +var ChapelBootnodes = []string{} +var ChapelStaticPeers = []string{ + "enode://69a90b35164ef862185d9f4d2c5eff79b92acd1360574c0edf36044055dc766d87285a820233ae5700e11c9ba06ce1cf23c1c68a4556121109776ce2a3990bba@52.199.214.252:30311", + "enode://330d768f6de90e7825f0ea6fe59611ce9d50712e73547306846a9304663f9912bf1611037f7f90f21606242ded7fb476c7285cb7cd792836b8c0c5ef0365855c@18.181.52.189:30311", + "enode://df1e8eb59e42cad3c4551b2a53e31a7e55a2fdde1287babd1e94b0836550b489ba16c40932e4dacb16cba346bd442c432265a299c4aca63ee7bb0f832b9f45eb@52.51.80.128:30311", + "enode://0bd566a7fd136ecd19414a601bfdc530d5de161e3014033951dd603e72b1a8959eb5b70b06c87a5a75cbf45e4055c387d2a842bd6b1bd8b5041b3a61bab615cf@34.242.33.165:30311", + "enode://604ed87d813c2b884ff1dc3095afeab18331f3cc361e8fb604159e844905dfa6e4c627306231d48f46a2edceffcd069264a89d99cdbf861a04e8d3d8d7282e8a@3.209.122.123:30311", + "enode://4d358eca87c44230a49ceaca123c89c7e77232aeae745c3a4917e607b909c4a14034b3a742960a378c3f250e0e67391276e80c7beee7770071e13f33a5b0606a@52.72.123.113:30311", +} + +var RialtoBootnodes = []string{} +var RialtoStaticPeers = ChapelStaticPeers + var SokolBootnodes = []string{ "enode://f11a0f80939b49a28bf99581da9b351a592ec1504b9d32a7dfda79b36510a891e96631239c4166e5c73368c21e9bb3241e7fd6929b899772e5a8fe9a7b7c3af6@45.77.52.149:30303", "enode://e08adce358fc26dfbe1f24ee578dceaa29575ca44a39d9041203131db5135aceba6241840a9b57b1540eeaf7b4eff1aead28a74641be43342c35af454abb31b3@199.247.18.10:30313", @@ -83,6 +179,8 @@ var SokolBootnodes = []string{ "enode://f11a0f80939b49a28bf99581da9b351a592ec1504b9d32a7dfda79b36510a891e96631239c4166e5c73368c21e9bb3241e7fd6929b899772e5a8fe9a7b7c3af6@45.77.52.149:30303", } +var FermionBootnodes = []string{} + var V5Bootnodes = []string{ // Teku team's bootnode "enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", @@ -101,6 +199,16 @@ var V5Bootnodes = []string{ "enr:-Ku4QEWzdnVtXc2Q0ZVigfCGggOVB2Vc1ZCPEc6j21NIFLODSJbvNaef1g4PxhPwl_3kax86YPheFUSLXPRs98vvYsoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDZBrP2Jc2VjcDI1NmsxoQM6jr8Rb1ktLEsVcKAPa08wCsKUmvoQ8khiOl_SLozf9IN1ZHCCIyg", } +var MumbaiBootnodes = []string{ + "enode://320553cda00dfc003f499a3ce9598029f364fbb3ed1222fdc20a94d97dcc4d8ba0cd0bfa996579dcc6d17a534741fb0a5da303a90579431259150de66b597251@54.147.31.250:30303", + "enode://f0f48a8781629f95ff02606081e6e43e4aebd503f3d07fc931fad7dd5ca1ba52bd849a6f6c3be0e375cf13c9ae04d859c4a9ae3546dc8ed4f10aa5dbb47d4998@34.226.134.117:30303", +} + +var BorMainnetBootnodes = []string{ + "enode://0cb82b395094ee4a2915e9714894627de9ed8498fb881cec6db7c65e8b9a5bd7f2f25cc84e71e89d0947e51c76e85d0847de848c7782b13c0255247a6758178c@44.232.55.71:30303", + "enode://88116f4295f5a31538ae409e4d44ad40d22e44ee9342869e7d68bdec55b0f83c1530355ce8b41fbec0928a7d75a5745d528450d30aec92066ab6ba1ee351d710@159.203.9.164:30303", +} + const dnsPrefix = "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@" // KnownDNSNetwork returns the address of a public DNS-based node list for the given @@ -122,3 +230,49 @@ func KnownDNSNetwork(genesis common.Hash, protocol string) string { } return dnsPrefix + protocol + "." + net + ".ethdisco.net" } + +func BootnodeURLsOfChain(chain string) []string { + switch chain { + case networkname.MainnetChainName: + return MainnetBootnodes + case networkname.SepoliaChainName: + return SepoliaBootnodes + case networkname.RopstenChainName: + return RopstenBootnodes + case networkname.RinkebyChainName: + return RinkebyBootnodes + case networkname.GoerliChainName: + return GoerliBootnodes + case networkname.KilnDevnetChainName: + return KilnDevNetBootNodes + case networkname.BSCChainName: + return BscBootnodes + case networkname.ChapelChainName: + return ChapelBootnodes + case networkname.RialtoChainName: + return RialtoBootnodes + case networkname.SokolChainName: + return SokolBootnodes + case networkname.FermionChainName: + return FermionBootnodes + case networkname.MumbaiChainName: + return MumbaiBootnodes + case networkname.BorMainnetChainName: + return BorMainnetBootnodes + default: + return []string{} + } +} + +func StaticPeerURLsOfChain(chain string) []string { + switch chain { + case networkname.BSCChainName: + return BscStaticPeers + case networkname.ChapelChainName: + return ChapelStaticPeers + case networkname.RialtoChainName: + return RialtoStaticPeers + default: + return []string{} + } +} diff --git a/params/chainspecs/bor-mainnet.json b/params/chainspecs/bor-mainnet.json new file mode 100644 index 00000000000..df6e684abc4 --- /dev/null +++ b/params/chainspecs/bor-mainnet.json @@ -0,0 +1,53 @@ +{ + "ChainName": "bor-mainnet", + "chainId": 137, + "consensus": "bor", + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 3395000, + "muirGlacierBlock": 3395000, + "berlinBlock": 14750000, + "londonBlock": 23850000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "bor": { + "period": { + "0": 2 + }, + "producerDelay": 6, + "sprint": 64, + "backupMultiplier": { + "0": 2 + }, + "validatorContract": "0x0000000000000000000000000000000000001000", + "stateReceiverContract": "0x0000000000000000000000000000000000001001", + "overrideStateSyncRecords": { + "14949120": 8, + "14949184": 0, + "14953472": 0, + "14953536": 5, + "14953600": 0, + "14953664": 0, + "14953728": 0, + "14953792": 0, + "14953856": 0 + }, + "blockAlloc": { + "22156660": { + "0000000000000000000000000000000000001010": { + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610caa565b005b3480156103eb57600080fd5b506103f4610dfc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e05565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b005b3480156104e857600080fd5b506104f1611090565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b506105486110b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110dc565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b506106046110fd565b005b34801561061257600080fd5b5061061b6111cd565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b50610758611358565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af611381565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de6113d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e611411565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061144e565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b50610964611474565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050611501565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611521565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a65611541565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a90611546565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb61154c565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115d9565b005b348015610b2e57600080fd5b50610b376115f6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b60003390506000610cba826110dc565b9050610cd18360065461161c90919063ffffffff16565b600681905550600083118015610ce657508234145b610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610dd4876110dc565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610e0d611381565b610e1657600080fd5b600081118015610e535750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611da76023913960400191505060405180910390fd5b6000610eb3836110dc565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610f00573d6000803e3d6000fd5b50610f168360065461163c90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f68585610f98896110dc565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611027576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611d846023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061108c8261165b565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b611105611381565b61110e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b60008060008060418551146111ee5760009350505050611352565b602085015192506040850151915060ff6041860151169050601b8160ff16101561121957601b810190505b601b8160ff16141580156112315750601c8160ff1614155b156112425760009350505050611352565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561129f573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600181526020017f890000000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b6000813414611460576000905061146e565b61146b338484611753565b90505b92915050565b6040518060800160405280605b8152602001611e1c605b91396040516020018082805190602001908083835b602083106114c357805182526020820191506020810190506020830392506114a0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061153761153286868686611b10565b611be6565b9050949350505050565b608981565b60015481565b604051806080016040528060528152602001611dca605291396040516020018082805190602001908083835b6020831061159b5780518252602082019150602081019050602083039250611578565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6115e1611381565b6115ea57600080fd5b6115f38161165b565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111561162b57600080fd5b600082840390508091505092915050565b60008082840190508381101561165157600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561169557600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117d357600080fd5b505afa1580156117e7573d6000803e3d6000fd5b505050506040513d60208110156117fd57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561188f57600080fd5b505afa1580156118a3573d6000803e3d6000fd5b505050506040513d60208110156118b957600080fd5b810190808051906020019092919050505090506118d7868686611c30565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119df57600080fd5b505afa1580156119f3573d6000803e3d6000fd5b505050506040513d6020811015611a0957600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a9757600080fd5b505afa158015611aab573d6000803e3d6000fd5b505050506040513d6020811015611ac157600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b6000806040518060800160405280605b8152602001611e1c605b91396040516020018082805190602001908083835b60208310611b625780518252602082019150602081019050602083039250611b3f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d18573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a72315820a4a6f71a98ac3fc613c3a8f1e2e11b9eb9b6b39f125f7d9508916c2b8fb02c7164736f6c63430005100032" + } + } + }, + "burntContract": { + "23850000": "0x70bca57f4579f58670ab2d18ef16e02c17553c38" + }, + "jaipurBlock": 23850000 + } +} diff --git a/params/chainspecs/bsc.json b/params/chainspecs/bsc.json new file mode 100644 index 00000000000..7e8945cabce --- /dev/null +++ b/params/chainspecs/bsc.json @@ -0,0 +1,25 @@ +{ + "ChainName": "bsc", + "chainId": 56, + "consensus": "parlia", + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "ramanujanBlock": 0, + "nielsBlock": 0, + "mirrorSyncBlock": 5184000, + "brunoBlock": 13082000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parlia": { + "DBPath": "", + "InMemory": false, + "period": 3, + "epoch": 200 + } +} diff --git a/params/chainspecs/chapel.json b/params/chainspecs/chapel.json new file mode 100644 index 00000000000..ee755b44a17 --- /dev/null +++ b/params/chainspecs/chapel.json @@ -0,0 +1,25 @@ +{ + "ChainName": "chapel", + "chainId": 97, + "consensus": "parlia", + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "ramanujanBlock": 1010000, + "nielsBlock": 1014369, + "mirrorSyncBlock": 5582500, + "brunoBlock": 13837000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parlia": { + "DBPath": "", + "InMemory": false, + "period": 3, + "epoch": 200 + } +} diff --git a/params/chainspecs/fermion.json b/params/chainspecs/fermion.json new file mode 100644 index 00000000000..856f3f81f25 --- /dev/null +++ b/params/chainspecs/fermion.json @@ -0,0 +1,21 @@ +{ + "ChainName": "fermion", + "chainId": 1212120, + "consensus": "clique", + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "clique": { + "period": 15, + "epoch": 30000 + } +} diff --git a/params/chainspecs/goerli.json b/params/chainspecs/goerli.json new file mode 100644 index 00000000000..7596abd2be2 --- /dev/null +++ b/params/chainspecs/goerli.json @@ -0,0 +1,21 @@ +{ + "ChainName": "goerli", + "chainId": 5, + "consensus": "clique", + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 1561651, + "berlinBlock": 4460644, + "londonBlock": 5062605, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "clique": { + "period": 15, + "epoch": 30000 + } +} diff --git a/params/chainspecs/kiln-devnet.json b/params/chainspecs/kiln-devnet.json new file mode 100644 index 00000000000..5141f75aab2 --- /dev/null +++ b/params/chainspecs/kiln-devnet.json @@ -0,0 +1,19 @@ +{ + "ChainName": "kiln-devnet", + "chainId": 1337802, + "consensus": "ethash", + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "terminalTotalDifficulty": 20000000000000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mergeForkBlock": 1000, + "ethash": {} +} diff --git a/params/chainspecs/mainnet.json b/params/chainspecs/mainnet.json new file mode 100644 index 00000000000..c3ecaa123bb --- /dev/null +++ b/params/chainspecs/mainnet.json @@ -0,0 +1,21 @@ +{ + "ChainName": "mainnet", + "chainId": 1, + "consensus": "ethash", + "homesteadBlock": 1150000, + "daoForkBlock": 1920000, + "daoForkSupport": true, + "eip150Block": 2463000, + "eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0", + "eip155Block": 2675000, + "byzantiumBlock": 4370000, + "constantinopleBlock": 7280000, + "petersburgBlock": 7280000, + "istanbulBlock": 9069000, + "muirGlacierBlock": 9200000, + "berlinBlock": 12244000, + "londonBlock": 12965000, + "arrowGlacierBlock": 13773000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "ethash": {} +} diff --git a/params/chainspecs/mumbai.json b/params/chainspecs/mumbai.json new file mode 100644 index 00000000000..92f2a6c7c77 --- /dev/null +++ b/params/chainspecs/mumbai.json @@ -0,0 +1,45 @@ +{ + "ChainName": "mumbai", + "chainId": 80001, + "consensus": "bor", + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 2722000, + "muirGlacierBlock": 2722000, + "berlinBlock": 13996000, + "londonBlock": 22640000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "bor": { + "period": { + "0": 2, + "25275000": 5 + }, + "producerDelay": 6, + "sprint": 64, + "backupMultiplier": { + "0": 2, + "25275000": 5 + }, + "validatorContract": "0x0000000000000000000000000000000000001000", + "stateReceiverContract": "0x0000000000000000000000000000000000001001", + "overrideStateSyncRecords": null, + "blockAlloc": { + "22244000": { + "0000000000000000000000000000000000001010": { + "balance": "0x0", + "code": "0x60806040526004361061019c5760003560e01c806377d32e94116100ec578063acd06cb31161008a578063e306f77911610064578063e306f77914610a7b578063e614d0d614610aa6578063f2fde38b14610ad1578063fc0c546a14610b225761019c565b8063acd06cb31461097a578063b789543c146109cd578063cc79f97b14610a505761019c565b80639025e64c116100c65780639025e64c146107c957806395d89b4114610859578063a9059cbb146108e9578063abceeba21461094f5761019c565b806377d32e94146106315780638da5cb5b146107435780638f32d59b1461079a5761019c565b806347e7ef24116101595780637019d41a116101335780637019d41a1461053357806370a082311461058a578063715018a6146105ef578063771282f6146106065761019c565b806347e7ef2414610410578063485cc9551461046b57806360f96a8f146104dc5761019c565b806306fdde03146101a15780631499c5921461023157806318160ddd1461028257806319d27d9c146102ad5780632e1a7d4d146103b1578063313ce567146103df575b600080fd5b3480156101ad57600080fd5b506101b6610b79565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101f65780820151818401526020810190506101db565b50505050905090810190601f1680156102235780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561023d57600080fd5b506102806004803603602081101561025457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bb6565b005b34801561028e57600080fd5b50610297610c24565b6040518082815260200191505060405180910390f35b3480156102b957600080fd5b5061036f600480360360a08110156102d057600080fd5b81019080803590602001906401000000008111156102ed57600080fd5b8201836020820111156102ff57600080fd5b8035906020019184600183028401116401000000008311171561032157600080fd5b9091929391929390803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c3a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103dd600480360360208110156103c757600080fd5b8101908080359060200190929190505050610caa565b005b3480156103eb57600080fd5b506103f4610dfc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561041c57600080fd5b506104696004803603604081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e05565b005b34801561047757600080fd5b506104da6004803603604081101561048e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fc1565b005b3480156104e857600080fd5b506104f1611090565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561053f57600080fd5b506105486110b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561059657600080fd5b506105d9600480360360208110156105ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110dc565b6040518082815260200191505060405180910390f35b3480156105fb57600080fd5b506106046110fd565b005b34801561061257600080fd5b5061061b6111cd565b6040518082815260200191505060405180910390f35b34801561063d57600080fd5b506107016004803603604081101561065457600080fd5b81019080803590602001909291908035906020019064010000000081111561067b57600080fd5b82018360208201111561068d57600080fd5b803590602001918460018302840111640100000000831117156106af57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506111d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561074f57600080fd5b50610758611358565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a657600080fd5b506107af611381565b604051808215151515815260200191505060405180910390f35b3480156107d557600080fd5b506107de6113d8565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081e578082015181840152602081019050610803565b50505050905090810190601f16801561084b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561086557600080fd5b5061086e611411565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156108ae578082015181840152602081019050610893565b50505050905090810190601f1680156108db5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610935600480360360408110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061144e565b604051808215151515815260200191505060405180910390f35b34801561095b57600080fd5b50610964611474565b6040518082815260200191505060405180910390f35b34801561098657600080fd5b506109b36004803603602081101561099d57600080fd5b8101908080359060200190929190505050611501565b604051808215151515815260200191505060405180910390f35b3480156109d957600080fd5b50610a3a600480360360808110156109f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050611521565b6040518082815260200191505060405180910390f35b348015610a5c57600080fd5b50610a65611541565b6040518082815260200191505060405180910390f35b348015610a8757600080fd5b50610a90611548565b6040518082815260200191505060405180910390f35b348015610ab257600080fd5b50610abb61154e565b6040518082815260200191505060405180910390f35b348015610add57600080fd5b50610b2060048036036020811015610af457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115db565b005b348015610b2e57600080fd5b50610b376115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60606040518060400160405280600b81526020017f4d6174696320546f6b656e000000000000000000000000000000000000000000815250905090565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b6000601260ff16600a0a6402540be40002905090565b60006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f44697361626c656420666561747572650000000000000000000000000000000081525060200191505060405180910390fd5b60003390506000610cba826110dc565b9050610cd18360065461161e90919063ffffffff16565b600681905550600083118015610ce657508234145b610d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e73756666696369656e7420616d6f756e740000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8584610dd4876110dc565b60405180848152602001838152602001828152602001935050505060405180910390a3505050565b60006012905090565b610e0d611381565b610e1657600080fd5b600081118015610e535750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b610ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611da96023913960400191505060405180910390fd5b6000610eb3836110dc565b905060008390508073ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610f00573d6000803e3d6000fd5b50610f168360065461163e90919063ffffffff16565b6006819055508373ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4e2ca0515ed1aef1395f66b5303bb5d6f1bf9d61a353fa53f73f8ac9973fa9f68585610f98896110dc565b60405180848152602001838152602001828152602001935050505060405180910390a350505050565b600760009054906101000a900460ff1615611027576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611d866023913960400191505060405180910390fd5b6001600760006101000a81548160ff02191690831515021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061108c8261165d565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff16319050919050565b611105611381565b61110e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60065481565b60008060008060418551146111ee5760009350505050611352565b602085015192506040850151915060ff6041860151169050601b8160ff16101561121957601b810190505b601b8160ff16141580156112315750601c8160ff1614155b156112425760009350505050611352565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561129f573d6000803e3d6000fd5b505050602060405103519350600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561134e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4572726f7220696e2065637265636f766572000000000000000000000000000081525060200191505060405180910390fd5b5050505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6040518060400160405280600381526020017f013881000000000000000000000000000000000000000000000000000000000081525081565b60606040518060400160405280600581526020017f4d41544943000000000000000000000000000000000000000000000000000000815250905090565b6000813414611460576000905061146e565b61146b338484611755565b90505b92915050565b6040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b602083106114c357805182526020820191506020810190506020830392506114a0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b60056020528060005260406000206000915054906101000a900460ff1681565b600061153761153286868686611b12565b611be8565b9050949350505050565b6201388181565b60015481565b604051806080016040528060528152602001611dcc605291396040516020018082805190602001908083835b6020831061159d578051825260208201915060208101905060208303925061157a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012081565b6115e3611381565b6115ec57600080fd5b6115f58161165d565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008282111561162d57600080fd5b600082840390508091505092915050565b60008082840190508381101561165357600080fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561169757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000803073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156117d557600080fd5b505afa1580156117e9573d6000803e3d6000fd5b505050506040513d60208110156117ff57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561189157600080fd5b505afa1580156118a5573d6000803e3d6000fd5b505050506040513d60208110156118bb57600080fd5b810190808051906020019092919050505090506118d9868686611c32565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fe6497e3ee548a3372136af2fcb0696db31fc6cf20260707645068bd3fe97f3c48786863073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d6020811015611a0b57600080fd5b81019080805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff166370a082318e6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611a9957600080fd5b505afa158015611aad573d6000803e3d6000fd5b505050506040513d6020811015611ac357600080fd5b8101908080519060200190929190505050604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a46001925050509392505050565b6000806040518060800160405280605b8152602001611e1e605b91396040516020018082805190602001908083835b60208310611b645780518252602082019150602081019050602083039250611b41565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405181815273ffffffffffffffffffffffffffffffffffffffff8716602082015285604082015284606082015283608082015260a0812092505081915050949350505050565b60008060015490506040517f190100000000000000000000000000000000000000000000000000000000000081528160028201528360228201526042812092505081915050919050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f63616e27742073656e6420746f204d524332300000000000000000000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611d1a573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505056fe54686520636f6e747261637420697320616c726561647920696e697469616c697a6564496e73756666696369656e7420616d6f756e74206f7220696e76616c69642075736572454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429546f6b656e5472616e736665724f726465722861646472657373207370656e6465722c75696e7432353620746f6b656e49644f72416d6f756e742c6279746573333220646174612c75696e743235362065787069726174696f6e29a265627a7a72315820ccd6c2a9c259832bbb367986ee06cd87af23022681b0cb22311a864b701d939564736f6c63430005100032" + } + } + }, + "burntContract": { + "22640000": "0x70bcA57F4579f58670aB2d18Ef16e02C17553C38" + }, + "jaipurBlock": 22770000 + } +} diff --git a/params/chainspecs/rialto.json b/params/chainspecs/rialto.json new file mode 100644 index 00000000000..e11de7d1443 --- /dev/null +++ b/params/chainspecs/rialto.json @@ -0,0 +1,25 @@ +{ + "ChainName": "rialto", + "chainId": 1417, + "consensus": "parlia", + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "ramanujanBlock": 400, + "nielsBlock": 0, + "mirrorSyncBlock": 400, + "brunoBlock": 400, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parlia": { + "DBPath": "", + "InMemory": false, + "period": 3, + "epoch": 200 + } +} diff --git a/params/chainspecs/rinkeby.json b/params/chainspecs/rinkeby.json new file mode 100644 index 00000000000..6ebecf052a8 --- /dev/null +++ b/params/chainspecs/rinkeby.json @@ -0,0 +1,21 @@ +{ + "ChainName": "rinkeby", + "chainId": 4, + "consensus": "clique", + "homesteadBlock": 1, + "daoForkSupport": true, + "eip150Block": 2, + "eip150Hash": "0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9", + "eip155Block": 3, + "byzantiumBlock": 1035301, + "constantinopleBlock": 3660663, + "petersburgBlock": 4321234, + "istanbulBlock": 5435345, + "berlinBlock": 8290928, + "londonBlock": 8897988, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "clique": { + "period": 15, + "epoch": 30000 + } +} diff --git a/params/chainspecs/ropsten.json b/params/chainspecs/ropsten.json new file mode 100644 index 00000000000..fd3808b5ae7 --- /dev/null +++ b/params/chainspecs/ropsten.json @@ -0,0 +1,20 @@ +{ + "ChainName": "ropsten", + "chainId": 3, + "consensus": "ethash", + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d", + "eip155Block": 10, + "byzantiumBlock": 1700000, + "constantinopleBlock": 4230000, + "petersburgBlock": 4939394, + "istanbulBlock": 6485846, + "muirGlacierBlock": 7117117, + "berlinBlock": 9812189, + "londonBlock": 10499401, + "terminalTotalDifficulty": 50000000000000000, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "ethash": {} +} diff --git a/params/chainspecs/sepolia.json b/params/chainspecs/sepolia.json new file mode 100644 index 00000000000..e349c2525ec --- /dev/null +++ b/params/chainspecs/sepolia.json @@ -0,0 +1,19 @@ +{ + "ChainName": "sepolia", + "chainId": 11155111, + "consensus": "ethash", + "homesteadBlock": 0, + "daoForkSupport": true, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "ethash": {} +} diff --git a/params/chainspecs/sokol.json b/params/chainspecs/sokol.json new file mode 100644 index 00000000000..ea8d6fc24ff --- /dev/null +++ b/params/chainspecs/sokol.json @@ -0,0 +1,20 @@ +{ + "ChainName": "sokol", + "chainId": 77, + "consensus": "aura", + "homesteadBlock": 0, + "eip150Block": 0, + "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 6464300, + "petersburgBlock": 7026400, + "istanbulBlock": 12095200, + "berlinBlock": 21050600, + "terminalBlockHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "aura": { + "DBPath": "", + "InMemory": false, + "Etherbase": "0x0000000000000000000000000000000000000000" + } +} diff --git a/params/config.go b/params/config.go index b20f4956285..595b5068001 100644 --- a/params/config.go +++ b/params/config.go @@ -17,34 +17,62 @@ package params import ( + "embed" + "encoding/json" "fmt" "math/big" "path" + "sort" + "strconv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/paths" + "github.com/ledgerwatch/erigon/params/networkname" ) +//go:embed chainspecs +var chainspecs embed.FS + +func readChainSpec(filename string) *ChainConfig { + f, err := chainspecs.Open(filename) + if err != nil { + panic(fmt.Sprintf("Could not open chainspec for %s: %v", filename, err)) + } + defer f.Close() + decoder := json.NewDecoder(f) + spec := &ChainConfig{} + err = decoder.Decode(&spec) + if err != nil { + panic(fmt.Sprintf("Could not parse chainspec for %s: %v", filename, err)) + } + return spec +} + +type ConsensusType string + const ( - MainnetChainName = "mainnet" - RopstenChainName = "ropsten" - RinkebyChainName = "rinkeby" - GoerliChainName = "goerli" - DevChainName = "dev" - ErigonMineName = "erigonmine" - CalaverasChainName = "calaveras" - SokolChainName = "sokol" + AuRaConsensus ConsensusType = "aura" + EtHashConsensus ConsensusType = "ethash" + CliqueConsensus ConsensusType = "clique" + ParliaConsensus ConsensusType = "parlia" + BorConsensus ConsensusType = "bor" ) // Genesis hashes to enforce below configs on. var ( - MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") - RopstenGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") - RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177") - GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") - ErigonGenesisHash = common.HexToHash("0xfecd5c85712e36f30f09ba3a42386b42c46b5ba5395a4246b952e655f9aa0f58") - CalaverasGenesisHash = common.HexToHash("0xeb9233d066c275efcdfed8037f4fc082770176aefdbcb7691c71da412a5670f2") - SokolGenesisHash = common.HexToHash("0x5b28c1bfd3a15230c9a46b399cd0f9a6920d432e85381cc6a140b06e8410112f") + MainnetGenesisHash = common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") + SepoliaGenesisHash = common.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9") + RopstenGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") + RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177") + GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") + KilnDevnetGensisHash = common.HexToHash("0x51c7fe41be669f69c45c33a56982cbde405313342d9e2b00d7c91a7b284dd4f8") + SokolGenesisHash = common.HexToHash("0x5b28c1bfd3a15230c9a46b399cd0f9a6920d432e85381cc6a140b06e8410112f") + FermionGenesisHash = common.HexToHash("0x0658360d8680ead416900a552b67b84e6d575c7f0ecab3dbe42406f9f8c34c35") + BSCGenesisHash = common.HexToHash("0x0d21840abff46b96c84b2ac9e10e4f5cdaeb5693cb665db62a2f3b02d2d57b5b") + ChapelGenesisHash = common.HexToHash("0x6d3c66c5357ec91d5c43af47e234a939b22557cbb552dc45bebbceeed90fbe34") + RialtoGenesisHash = common.HexToHash("0xaabe549bfa85c84f7aee9da7010b97453ad686f2c2d8ce00503d1a00c72cad54") + MumbaiGenesisHash = common.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7") + BorMainnetGenesisHash = common.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b") ) var ( @@ -52,272 +80,129 @@ var ( ) var ( - SokolGenesisStateRoot = common.HexToHash("0xfad4af258fd11939fae0c6c6eec9d340b1caac0b0196fd9a1bc3f489c5bf00b3") + SokolGenesisStateRoot = common.HexToHash("0xfad4af258fd11939fae0c6c6eec9d340b1caac0b0196fd9a1bc3f489c5bf00b3") + FermionGenesisStateRoot = common.HexToHash("0x08982dc16236c51b6d9aff8b76cd0faa7067eb55eba62395d5a82649d8fb73c4") ) var ( // MainnetChainConfig is the chain parameters to run a node on the main network. - MainnetChainConfig = &ChainConfig{ - ChainName: MainnetChainName, - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(1_150_000), - DAOForkBlock: big.NewInt(1_920_000), - DAOForkSupport: true, - EIP150Block: big.NewInt(2_463_000), - EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), - EIP155Block: big.NewInt(2_675_000), - EIP158Block: big.NewInt(2_675_000), - ByzantiumBlock: big.NewInt(4_370_000), - ConstantinopleBlock: big.NewInt(7_280_000), - PetersburgBlock: big.NewInt(7_280_000), - IstanbulBlock: big.NewInt(9_069_000), - MuirGlacierBlock: big.NewInt(9_200_000), - BerlinBlock: big.NewInt(12_244_000), - LondonBlock: big.NewInt(12_965_000), - Ethash: new(EthashConfig), - } + MainnetChainConfig = readChainSpec("chainspecs/mainnet.json") + + // SepoliaChainConfig contains the chain parameters to run a node on the Sepolia test network. + SepoliaChainConfig = readChainSpec("chainspecs/sepolia.json") // RopstenChainConfig contains the chain parameters to run a node on the Ropsten test network. - RopstenChainConfig = &ChainConfig{ - ChainName: RopstenChainName, - ChainID: big.NewInt(3), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(0), - EIP150Hash: common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d"), - EIP155Block: big.NewInt(10), - EIP158Block: big.NewInt(10), - ByzantiumBlock: big.NewInt(1_700_000), - ConstantinopleBlock: big.NewInt(4_230_000), - PetersburgBlock: big.NewInt(4_939_394), - IstanbulBlock: big.NewInt(6_485_846), - MuirGlacierBlock: big.NewInt(7_117_117), - BerlinBlock: big.NewInt(9_812_189), - LondonBlock: big.NewInt(10_499_401), - Ethash: new(EthashConfig), - } + RopstenChainConfig = readChainSpec("chainspecs/ropsten.json") // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. - RinkebyChainConfig = &ChainConfig{ - ChainName: RinkebyChainName, - ChainID: big.NewInt(4), - HomesteadBlock: big.NewInt(1), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(2), - EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), - EIP155Block: big.NewInt(3), - EIP158Block: big.NewInt(3), - ByzantiumBlock: big.NewInt(1_035_301), - ConstantinopleBlock: big.NewInt(3_660_663), - PetersburgBlock: big.NewInt(4_321_234), - IstanbulBlock: big.NewInt(5_435_345), - MuirGlacierBlock: nil, - BerlinBlock: big.NewInt(8_290_928), - LondonBlock: big.NewInt(8_897_988), - Clique: &CliqueConfig{ - Period: 15, - Epoch: 30000, - }, - } + RinkebyChainConfig = readChainSpec("chainspecs/rinkeby.json") // GoerliChainConfig contains the chain parameters to run a node on the Görli test network. - GoerliChainConfig = &ChainConfig{ - ChainName: GoerliChainName, - ChainID: big.NewInt(5), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(1_561_651), - MuirGlacierBlock: nil, - BerlinBlock: big.NewInt(4_460_644), - LondonBlock: big.NewInt(5_062_605), - Clique: &CliqueConfig{ - Period: 15, - Epoch: 30000, - }, - } - - // MainnetChainConfig is the chain parameters to run a PoW dev net to test Erigon mining - ErigonChainConfig = &ChainConfig{ - ChainName: ErigonMineName, - ChainID: new(big.Int).SetBytes([]byte("erigon-mine")), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - Ethash: new(EthashConfig), - } - - CalaverasChainConfig = &ChainConfig{ - ChainName: CalaverasChainName, - ChainID: big.NewInt(123), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: nil, - BerlinBlock: big.NewInt(0), - LondonBlock: big.NewInt(500), - Clique: &CliqueConfig{ - Period: 30, - Epoch: 30000, - }, - } - - SokolChainConfig = &ChainConfig{ - ChainName: SokolChainName, - ChainID: big.NewInt(77), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: false, - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - /* - eip150_transition: 0, - eip155_transition: 0, - eip160_transition: 0, - eip161abc_transition: 0, - eip161d_transition: 0, - //eip658_transition: 0, - validate_receipts_transition: 0, - validate_chain_id_transition: 0, - //eip140_transition: 0, - //eip211_transition: 0, - //eip214_transition: 0, - */ - - /* - "eip140Transition": "0x0", in Byzantium - "eip211Transition": "0x0", in Byzantium - "eip214Transition": "0x0", in Byzantium - "eip658Transition": "0x0", in Byzantium - Byzantium also has EIP-100, EIP-196, EIP-197, EIP-198, EIP-649 - - "eip145Transition": 6464300, in Constantinople - "eip1014Transition": 6464300, in Constantinople - "eip1052Transition": 6464300, in Constantinople - "eip1283Transition": 6464300, in Constantinople - Constantinople also has EIP-1234 (bomb) - - "eip1283DisableTransition": 7026400, in Petersburg - Petersburg has nothing else - - "eip1283ReenableTransition": 12095200, ???? - - "eip1344Transition": 12095200, in Istanbul - "eip1706Transition": 12095200, ???? [EIP-2200] has superseded [EIP-1706] - "eip1884Transition": 12095200, in Istanbul - "eip2028Transition": 12095200, in Istanbul - Istanbul also has 152, 1108, 2200 - - "eip2929Transition": 21050600, in Berlin ? - "eip2930Transition": 21050600 in Berlin ? - Berlin also has 663, 1057, 1380, 1702, 1962, 1985, 2045, 2046 - London : not in list - */ - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(6464300), - PetersburgBlock: big.NewInt(7026400), - IstanbulBlock: big.NewInt(12095200), - MuirGlacierBlock: nil, - BerlinBlock: big.NewInt(21050600), - //LondonBlock: big.NewInt(21050600), - Aura: &AuRaConfig{}, - } + GoerliChainConfig = readChainSpec("chainspecs/goerli.json") + + KilnDevnetChainConfig = readChainSpec("chainspecs/kiln-devnet.json") + + BSCChainConfig = readChainSpec("chainspecs/bsc.json") + + ChapelChainConfig = readChainSpec("chainspecs/chapel.json") + + RialtoChainConfig = readChainSpec("chainspecs/rialto.json") + + SokolChainConfig = readChainSpec("chainspecs/sokol.json") + + FermionChainConfig = readChainSpec("chainspecs/fermion.json") // AllEthashProtocolChanges contains every protocol change (EIPs) introduced // and accepted by the Ethereum core developers into the Ethash consensus. - // - // This configuration is intentionally not using keyed fields to force anyone - // adding flags to the config to also have to set these fields. AllEthashProtocolChanges = &ChainConfig{ - ChainID: big.NewInt(1337), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: false, - EIP150Block: big.NewInt(0), - EIP150Hash: common.Hash{}, - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: nil, - Ethash: new(EthashConfig), - Clique: nil, + ChainID: big.NewInt(1337), + Consensus: EtHashConsensus, + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: false, + TangerineWhistleBlock: big.NewInt(0), + TangerineWhistleHash: common.Hash{}, + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: nil, + ArrowGlacierBlock: nil, + Ethash: new(EthashConfig), + Clique: nil, } // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced // and accepted by the Ethereum core developers into the Clique consensus. - // - // This configuration is intentionally not using keyed fields to force anyone - // adding flags to the config to also have to set these fields. AllCliqueProtocolChanges = &ChainConfig{ - ChainID: big.NewInt(1337), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: false, - EIP150Block: big.NewInt(0), - EIP150Hash: common.Hash{}, - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: nil, - Ethash: nil, - Clique: &CliqueConfig{Period: 0, Epoch: 30000}, - } + ChainID: big.NewInt(1337), + Consensus: CliqueConsensus, + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: false, + TangerineWhistleBlock: big.NewInt(0), + TangerineWhistleHash: common.Hash{}, + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + ArrowGlacierBlock: nil, + Ethash: nil, + Clique: &CliqueConfig{Period: 0, Epoch: 30000}, + } + + MumbaiChainConfig = readChainSpec("chainspecs/mumbai.json") + + BorMainnetChainConfig = readChainSpec("chainspecs/bor-mainnet.json") CliqueSnapshot = NewSnapshotConfig(10, 1024, 16384, true, "") TestChainConfig = &ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - DAOForkBlock: nil, - DAOForkSupport: false, - EIP150Block: big.NewInt(0), - EIP150Hash: common.Hash{}, - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - MuirGlacierBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: nil, - Ethash: new(EthashConfig), - Clique: nil, + ChainID: big.NewInt(1), + Consensus: EtHashConsensus, + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: false, + TangerineWhistleBlock: big.NewInt(0), + TangerineWhistleHash: common.Hash{}, + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: nil, + ArrowGlacierBlock: nil, + Ethash: new(EthashConfig), + Clique: nil, + } + + TestChainAuraConfig = &ChainConfig{ + ChainID: big.NewInt(1), + Consensus: AuRaConsensus, + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: false, + TangerineWhistleBlock: big.NewInt(0), + TangerineWhistleHash: common.Hash{}, + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: nil, + ArrowGlacierBlock: nil, + Aura: &AuRaConfig{}, } TestRules = TestChainConfig.Rules(0) @@ -332,30 +217,45 @@ type ChainConfig struct { ChainName string ChainID *big.Int `json:"chainId"` // chainId identifies the current chain and is used for replay protection + Consensus ConsensusType `json:"consensus,omitempty"` // aura, ethash or clique + HomesteadBlock *big.Int `json:"homesteadBlock,omitempty"` // Homestead switch block (nil = no fork, 0 = already homestead) DAOForkBlock *big.Int `json:"daoForkBlock,omitempty"` // TheDAO hard-fork switch block (nil = no fork) DAOForkSupport bool `json:"daoForkSupport,omitempty"` // Whether the nodes supports or opposes the DAO hard-fork - // EIP150 implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150) - EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork) - EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (needed for header only clients as only gas pricing changed) + // Tangerine Whistle (EIP150) implements the Gas price changes (https://github.com/ethereum/EIPs/issues/150) + TangerineWhistleBlock *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork) + TangerineWhistleHash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (needed for header only clients as only gas pricing changed) - EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block - EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block + SpuriousDragonBlock *big.Int `json:"eip155Block,omitempty"` // Spurious Dragon HF block ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium) ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople switch block (nil = no fork, 0 = already activated) PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople) IstanbulBlock *big.Int `json:"istanbulBlock,omitempty"` // Istanbul switch block (nil = no fork, 0 = already on istanbul) - MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (bomb delay) switch block (nil = no fork, 0 = already activated) + MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // EIP-2384 (bomb delay) switch block (nil = no fork, 0 = already activated) BerlinBlock *big.Int `json:"berlinBlock,omitempty"` // Berlin switch block (nil = no fork, 0 = already on berlin) LondonBlock *big.Int `json:"londonBlock,omitempty"` // London switch block (nil = no fork, 0 = already on london) + ArrowGlacierBlock *big.Int `json:"arrowGlacierBlock,omitempty"` // EIP-4345 (bomb delay) switch block (nil = no fork, 0 = already activated) + + RamanujanBlock *big.Int `json:"ramanujanBlock,omitempty" toml:",omitempty"` // ramanujanBlock switch block (nil = no fork, 0 = already activated) + NielsBlock *big.Int `json:"nielsBlock,omitempty" toml:",omitempty"` // nielsBlock switch block (nil = no fork, 0 = already activated) + MirrorSyncBlock *big.Int `json:"mirrorSyncBlock,omitempty" toml:",omitempty"` // mirrorSyncBlock switch block (nil = no fork, 0 = already activated) + BrunoBlock *big.Int `json:"brunoBlock,omitempty" toml:",omitempty"` // brunoBlock switch block (nil = no fork, 0 = already activated) + + // EIP-3675: Upgrade consensus to Proof-of-Stake + TerminalTotalDifficulty *big.Int `json:"terminalTotalDifficulty,omitempty"` // The merge happens when terminal total difficulty is reached + TerminalBlockNumber *big.Int `json:"terminalBlockNumber,omitempty"` // Enforce particular terminal block; see TerminalBlockNumber in EIP-3675 + TerminalBlockHash common.Hash `json:"terminalBlockHash,omitempty"` // Enforce particular terminal block; see TERMINAL_BLOCK_HASH in EIP-3675 + MergeForkBlock *big.Int `json:"mergeForkBlock,omitempty"` // Various consensus engines Ethash *EthashConfig `json:"ethash,omitempty"` Clique *CliqueConfig `json:"clique,omitempty"` Aura *AuRaConfig `json:"aura,omitempty"` + Parlia *ParliaConfig `json:"parlia,omitempty" toml:",omitempty"` + Bor *BorConfig `json:"bor,omitempty"` } // EthashConfig is the consensus engine configs for proof-of-work based sealing. @@ -384,6 +284,82 @@ func (c *CliqueConfig) String() string { return "clique" } +type ParliaConfig struct { + DBPath string + InMemory bool + Period uint64 `json:"period"` // Number of seconds between blocks to enforce + Epoch uint64 `json:"epoch"` // Epoch length to update validatorSet +} + +// String implements the stringer interface, returning the consensus engine details. +func (b *ParliaConfig) String() string { + return "parlia" +} + +// BorConfig is the consensus engine configs for Matic bor based sealing. +type BorConfig struct { + Period map[string]uint64 `json:"period"` // Number of seconds between blocks to enforce + ProducerDelay uint64 `json:"producerDelay"` // Number of seconds delay between two producer interval + Sprint uint64 `json:"sprint"` // Epoch length to proposer + BackupMultiplier map[string]uint64 `json:"backupMultiplier"` // Backup multiplier to determine the wiggle time + ValidatorContract string `json:"validatorContract"` // Validator set contract + StateReceiverContract string `json:"stateReceiverContract"` // State receiver contract + + OverrideStateSyncRecords map[string]int `json:"overrideStateSyncRecords"` // override state records count + BlockAlloc map[string]interface{} `json:"blockAlloc"` + BurntContract map[string]string `json:"burntContract"` // governance contract where the token will be sent to and burnt in london fork + JaipurBlock uint64 `json:"jaipurBlock"` // Jaipur switch block (nil = no fork, 0 = already on jaipur) +} + +// String implements the stringer interface, returning the consensus engine details. +func (b *BorConfig) String() string { + return "bor" +} + +func (c *BorConfig) CalculateBackupMultiplier(number uint64) uint64 { + return c.calculateBorConfigHelper(c.BackupMultiplier, number) +} + +func (c *BorConfig) CalculatePeriod(number uint64) uint64 { + return c.calculateBorConfigHelper(c.Period, number) +} + +func (c *BorConfig) IsJaipur(number uint64) bool { + return number >= c.JaipurBlock +} + +func (c *BorConfig) calculateBorConfigHelper(field map[string]uint64, number uint64) uint64 { + keys := make([]string, 0, len(field)) + for k := range field { + keys = append(keys, k) + } + sort.Strings(keys) + for i := 0; i < len(keys)-1; i++ { + valUint, _ := strconv.ParseUint(keys[i], 10, 64) + valUintNext, _ := strconv.ParseUint(keys[i+1], 10, 64) + if number > valUint && number < valUintNext { + return field[keys[i]] + } + } + return field[keys[len(keys)-1]] +} + +func (c *BorConfig) CalculateBurntContract(number uint64) string { + keys := make([]string, 0, len(c.BurntContract)) + for k := range c.BurntContract { + keys = append(keys, k) + } + sort.Strings(keys) + for i := 0; i < len(keys)-1; i++ { + valUint, _ := strconv.ParseUint(keys[i], 10, 64) + valUintNext, _ := strconv.ParseUint(keys[i+1], 10, 64) + if number > valUint && number < valUintNext { + return c.BurntContract[keys[i]] + } + } + return c.BurntContract[keys[len(keys)-1]] +} + // String implements the fmt.Stringer interface. func (c *ChainConfig) String() string { var engine interface{} @@ -392,17 +368,33 @@ func (c *ChainConfig) String() string { engine = c.Ethash case c.Clique != nil: engine = c.Clique + case c.Parlia != nil: + engine = c.Parlia + case c.Bor != nil: + engine = c.Bor default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Engine: %v}", + + // TODO Covalent: Refactor to more generic approach and potentially introduce tag for "ecosystem" field (Ethereum, BSC, etc.) + if c.Consensus == ParliaConsensus { + return fmt.Sprintf("{ChainID: %v Ramanujan: %v, Niels: %v, MirrorSync: %v, Bruno: %v, Engine: %v}", + c.ChainID, + c.RamanujanBlock, + c.NielsBlock, + c.MirrorSyncBlock, + c.BrunoBlock, + engine, + ) + } + + return fmt.Sprintf("{ChainID: %v, Homestead: %v, DAO: %v, DAO Support: %v, Tangerine Whistle: %v, Spurious Dragon: %v, Byzantium: %v, Constantinople: %v, Petersburg: %v, Istanbul: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, Terminal Total Difficulty: %v, Engine: %v}", c.ChainID, c.HomesteadBlock, c.DAOForkBlock, c.DAOForkSupport, - c.EIP150Block, - c.EIP155Block, - c.EIP158Block, + c.TangerineWhistleBlock, + c.SpuriousDragonBlock, c.ByzantiumBlock, c.ConstantinopleBlock, c.PetersburgBlock, @@ -410,11 +402,17 @@ func (c *ChainConfig) String() string { c.MuirGlacierBlock, c.BerlinBlock, c.LondonBlock, + c.ArrowGlacierBlock, + c.TerminalTotalDifficulty, engine, ) } -type SnapshotConfig struct { +func (c *ChainConfig) IsHeaderWithSeal() bool { + return c.Consensus == AuRaConsensus +} + +type ConsensusSnapshotConfig struct { CheckpointInterval uint64 // Number of blocks after which to save the vote snapshot to the database InmemorySnapshots int // Number of recent vote snapshots to keep in memory InmemorySignatures int // Number of recent block signatures to keep in memory @@ -424,12 +422,12 @@ type SnapshotConfig struct { const cliquePath = "clique" -func NewSnapshotConfig(checkpointInterval uint64, inmemorySnapshots int, inmemorySignatures int, inmemory bool, dbPath string) *SnapshotConfig { +func NewSnapshotConfig(checkpointInterval uint64, inmemorySnapshots int, inmemorySignatures int, inmemory bool, dbPath string) *ConsensusSnapshotConfig { if len(dbPath) == 0 { dbPath = paths.DefaultDataDir() } - return &SnapshotConfig{ + return &ConsensusSnapshotConfig{ checkpointInterval, inmemorySnapshots, inmemorySignatures, @@ -448,19 +446,14 @@ func (c *ChainConfig) IsDAOFork(num uint64) bool { return isForked(c.DAOForkBlock, num) } -// IsEIP150 returns whether num is either equal to the EIP150 fork block or greater. -func (c *ChainConfig) IsEIP150(num uint64) bool { - return isForked(c.EIP150Block, num) +// IsTangerineWhistle returns whether num is either equal to the Tangerine Whistle (EIP150) fork block or greater. +func (c *ChainConfig) IsTangerineWhistle(num uint64) bool { + return isForked(c.TangerineWhistleBlock, num) } -// IsEIP155 returns whether num is either equal to the EIP155 fork block or greater. -func (c *ChainConfig) IsEIP155(num uint64) bool { - return isForked(c.EIP155Block, num) -} - -// IsEIP158 returns whether num is either equal to the EIP158 fork block or greater. -func (c *ChainConfig) IsEIP158(num uint64) bool { - return isForked(c.EIP158Block, num) +// IsSpuriousDragon returns whether num is either equal to the Spurious Dragon fork block or greater. +func (c *ChainConfig) IsSpuriousDragon(num uint64) bool { + return isForked(c.SpuriousDragonBlock, num) } // IsByzantium returns whether num is either equal to the Byzantium fork block or greater. @@ -473,6 +466,46 @@ func (c *ChainConfig) IsConstantinople(num uint64) bool { return isForked(c.ConstantinopleBlock, num) } +// IsRamanujan returns whether num is either equal to the IsRamanujan fork block or greater. +func (c *ChainConfig) IsRamanujan(num uint64) bool { + return isForked(c.RamanujanBlock, num) +} + +// IsOnRamanujan returns whether num is equal to the Ramanujan fork block +func (c *ChainConfig) IsOnRamanujan(num *big.Int) bool { + return configNumEqual(c.RamanujanBlock, num) +} + +// IsNiels returns whether num is either equal to the Niels fork block or greater. +func (c *ChainConfig) IsNiels(num uint64) bool { + return isForked(c.NielsBlock, num) +} + +// IsOnNiels returns whether num is equal to the IsNiels fork block +func (c *ChainConfig) IsOnNiels(num *big.Int) bool { + return configNumEqual(c.NielsBlock, num) +} + +// IsMirrorSync returns whether num is either equal to the MirrorSync fork block or greater. +func (c *ChainConfig) IsMirrorSync(num uint64) bool { + return isForked(c.MirrorSyncBlock, num) +} + +// IsOnMirrorSync returns whether num is equal to the MirrorSync fork block +func (c *ChainConfig) IsOnMirrorSync(num *big.Int) bool { + return configNumEqual(c.MirrorSyncBlock, num) +} + +// IsBruno returns whether num is either equal to the Burn fork block or greater. +func (c *ChainConfig) IsBruno(num uint64) bool { + return isForked(c.BrunoBlock, num) +} + +// IsOnBruno returns whether num is equal to the Burn fork block +func (c *ChainConfig) IsOnBruno(num *big.Int) bool { + return configNumEqual(c.BrunoBlock, num) +} + // IsMuirGlacier returns whether num is either equal to the Muir Glacier (EIP-2384) fork block or greater. func (c *ChainConfig) IsMuirGlacier(num uint64) bool { return isForked(c.MuirGlacierBlock, num) @@ -500,6 +533,11 @@ func (c *ChainConfig) IsLondon(num uint64) bool { return isForked(c.LondonBlock, num) } +// IsArrowGlacier returns whether num is either equal to the Arrow Glacier (EIP-4345) fork block or greater. +func (c *ChainConfig) IsArrowGlacier(num uint64) bool { + return isForked(c.ArrowGlacierBlock, num) +} + // CheckCompatible checks whether scheduled fork transitions have been imported // with a mismatching chain configuration. func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError { @@ -521,7 +559,7 @@ func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *Confi // CheckConfigForkOrder checks that we don't "skip" any forks, geth isn't pluggable enough // to guarantee that forks can be implemented in a different order than on official networks func (c *ChainConfig) CheckConfigForkOrder() error { - if c.ChainID.Uint64() == 77 { + if c != nil && c.ChainID != nil && c.ChainID.Uint64() == 77 { return nil } type fork struct { @@ -533,9 +571,8 @@ func (c *ChainConfig) CheckConfigForkOrder() error { for _, cur := range []fork{ {name: "homesteadBlock", block: c.HomesteadBlock}, {name: "daoForkBlock", block: c.DAOForkBlock, optional: true}, - {name: "eip150Block", block: c.EIP150Block}, - {name: "eip155Block", block: c.EIP155Block}, - {name: "eip158Block", block: c.EIP158Block}, + {name: "eip150Block", block: c.TangerineWhistleBlock}, + {name: "eip155Block", block: c.SpuriousDragonBlock}, {name: "byzantiumBlock", block: c.ByzantiumBlock}, {name: "constantinopleBlock", block: c.ConstantinopleBlock}, {name: "petersburgBlock", block: c.PetersburgBlock}, @@ -543,6 +580,7 @@ func (c *ChainConfig) CheckConfigForkOrder() error { {name: "muirGlacierBlock", block: c.MuirGlacierBlock, optional: true}, {name: "berlinBlock", block: c.BerlinBlock}, {name: "londonBlock", block: c.LondonBlock}, + {name: "arrowGlacierBlock", block: c.ArrowGlacierBlock, optional: true}, } { if lastFork.name != "" { // Next one must be higher number @@ -575,17 +613,14 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head uint64) *ConfigC if c.IsDAOFork(head) && c.DAOForkSupport != newcfg.DAOForkSupport { return newCompatError("DAO fork support flag", c.DAOForkBlock, newcfg.DAOForkBlock) } - if isForkIncompatible(c.EIP150Block, newcfg.EIP150Block, head) { - return newCompatError("EIP150 fork block", c.EIP150Block, newcfg.EIP150Block) + if isForkIncompatible(c.TangerineWhistleBlock, newcfg.TangerineWhistleBlock, head) { + return newCompatError("Tangerine Whistle fork block", c.TangerineWhistleBlock, newcfg.TangerineWhistleBlock) } - if isForkIncompatible(c.EIP155Block, newcfg.EIP155Block, head) { - return newCompatError("EIP155 fork block", c.EIP155Block, newcfg.EIP155Block) + if isForkIncompatible(c.SpuriousDragonBlock, newcfg.SpuriousDragonBlock, head) { + return newCompatError("Spurious Dragon fork block", c.SpuriousDragonBlock, newcfg.SpuriousDragonBlock) } - if isForkIncompatible(c.EIP158Block, newcfg.EIP158Block, head) { - return newCompatError("EIP158 fork block", c.EIP158Block, newcfg.EIP158Block) - } - if c.IsEIP158(head) && !configNumEqual(c.ChainID, newcfg.ChainID) { - return newCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block) + if c.IsSpuriousDragon(head) && !configNumEqual(c.ChainID, newcfg.ChainID) { + return newCompatError("EIP155 chain ID", c.SpuriousDragonBlock, newcfg.SpuriousDragonBlock) } if isForkIncompatible(c.ByzantiumBlock, newcfg.ByzantiumBlock, head) { return newCompatError("Byzantium fork block", c.ByzantiumBlock, newcfg.ByzantiumBlock) @@ -612,6 +647,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head uint64) *ConfigC if isForkIncompatible(c.LondonBlock, newcfg.LondonBlock, head) { return newCompatError("London fork block", c.LondonBlock, newcfg.LondonBlock) } + if isForkIncompatible(c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock, head) { + return newCompatError("Arrow Glacier fork block", c.ArrowGlacierBlock, newcfg.ArrowGlacierBlock) + } return nil } @@ -677,28 +715,143 @@ func (err *ConfigCompatError) Error() string { // phases. type Rules struct { ChainID *big.Int - IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool + IsHomestead, IsTangerineWhistle, IsSpuriousDragon bool IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool IsBerlin, IsLondon bool + IsParlia, IsStarknet bool } // Rules ensures c's ChainID is not nil. -func (c *ChainConfig) Rules(num uint64) Rules { +func (c *ChainConfig) Rules(num uint64) *Rules { chainID := c.ChainID if chainID == nil { chainID = new(big.Int) } - return Rules{ - ChainID: new(big.Int).Set(chainID), - IsHomestead: c.IsHomestead(num), - IsEIP150: c.IsEIP150(num), - IsEIP155: c.IsEIP155(num), - IsEIP158: c.IsEIP158(num), - IsByzantium: c.IsByzantium(num), - IsConstantinople: c.IsConstantinople(num), - IsPetersburg: c.IsPetersburg(num), - IsIstanbul: c.IsIstanbul(num), - IsBerlin: c.IsBerlin(num), - IsLondon: c.IsLondon(num), + return &Rules{ + ChainID: new(big.Int).Set(chainID), + IsHomestead: c.IsHomestead(num), + IsTangerineWhistle: c.IsTangerineWhistle(num), + IsSpuriousDragon: c.IsSpuriousDragon(num), + IsByzantium: c.IsByzantium(num), + IsConstantinople: c.IsConstantinople(num), + IsPetersburg: c.IsPetersburg(num), + IsIstanbul: c.IsIstanbul(num), + IsBerlin: c.IsBerlin(num), + IsLondon: c.IsLondon(num), + IsParlia: c.Parlia != nil, + } +} + +func ChainConfigByChainName(chain string) *ChainConfig { + switch chain { + case networkname.MainnetChainName: + return MainnetChainConfig + case networkname.SepoliaChainName: + return SepoliaChainConfig + case networkname.RopstenChainName: + return RopstenChainConfig + case networkname.RinkebyChainName: + return RinkebyChainConfig + case networkname.GoerliChainName: + return GoerliChainConfig + case networkname.KilnDevnetChainName: + return KilnDevnetChainConfig + case networkname.SokolChainName: + return SokolChainConfig + case networkname.FermionChainName: + return FermionChainConfig + case networkname.BSCChainName: + return BSCChainConfig + case networkname.ChapelChainName: + return ChapelChainConfig + case networkname.RialtoChainName: + return RialtoChainConfig + case networkname.MumbaiChainName: + return MumbaiChainConfig + case networkname.BorMainnetChainName: + return BorMainnetChainConfig + default: + return nil + } +} + +func GenesisHashByChainName(chain string) *common.Hash { + switch chain { + case networkname.MainnetChainName: + return &MainnetGenesisHash + case networkname.SepoliaChainName: + return &SepoliaGenesisHash + case networkname.RopstenChainName: + return &RopstenGenesisHash + case networkname.RinkebyChainName: + return &RinkebyGenesisHash + case networkname.GoerliChainName: + return &GoerliGenesisHash + case networkname.KilnDevnetChainName: + return &KilnDevnetGensisHash + case networkname.SokolChainName: + return &SokolGenesisHash + case networkname.FermionChainName: + return &FermionGenesisHash + case networkname.BSCChainName: + return &BSCGenesisHash + case networkname.ChapelChainName: + return &ChapelGenesisHash + case networkname.RialtoChainName: + return &RialtoGenesisHash + case networkname.MumbaiChainName: + return &MumbaiGenesisHash + case networkname.BorMainnetChainName: + return &BorMainnetGenesisHash + default: + return nil + } +} + +func ChainConfigByGenesisHash(genesisHash common.Hash) *ChainConfig { + switch { + case genesisHash == MainnetGenesisHash: + return MainnetChainConfig + case genesisHash == SepoliaGenesisHash: + return SepoliaChainConfig + case genesisHash == RopstenGenesisHash: + return RopstenChainConfig + case genesisHash == RinkebyGenesisHash: + return RinkebyChainConfig + case genesisHash == GoerliGenesisHash: + return GoerliChainConfig + case genesisHash == KilnDevnetGensisHash: + return KilnDevnetChainConfig + case genesisHash == SokolGenesisHash: + return SokolChainConfig + case genesisHash == FermionGenesisHash: + return FermionChainConfig + case genesisHash == BSCGenesisHash: + return BSCChainConfig + case genesisHash == ChapelGenesisHash: + return ChapelChainConfig + case genesisHash == RialtoGenesisHash: + return RialtoChainConfig + case genesisHash == MumbaiGenesisHash: + return MumbaiChainConfig + case genesisHash == BorMainnetGenesisHash: + return BorMainnetChainConfig + default: + return nil + } +} + +func NetworkIDByChainName(chain string) uint64 { + switch chain { + case networkname.RialtoChainName: + return 97 + case networkname.DevChainName: + return 1337 + default: + config := ChainConfigByChainName(chain) + if config == nil { + return 0 + } + return config.ChainID.Uint64() } } diff --git a/params/config_test.go b/params/config_test.go index 3c8ebaf4a51..97fb72ab3a3 100644 --- a/params/config_test.go +++ b/params/config_test.go @@ -32,8 +32,8 @@ func TestCheckCompatible(t *testing.T) { {stored: AllEthashProtocolChanges, new: AllEthashProtocolChanges, head: 0, wantErr: nil}, {stored: AllEthashProtocolChanges, new: AllEthashProtocolChanges, head: 100, wantErr: nil}, { - stored: &ChainConfig{EIP150Block: big.NewInt(10)}, - new: &ChainConfig{EIP150Block: big.NewInt(20)}, + stored: &ChainConfig{TangerineWhistleBlock: big.NewInt(10)}, + new: &ChainConfig{TangerineWhistleBlock: big.NewInt(20)}, head: 9, wantErr: nil, }, @@ -60,11 +60,11 @@ func TestCheckCompatible(t *testing.T) { }, }, { - stored: &ChainConfig{HomesteadBlock: big.NewInt(30), EIP150Block: big.NewInt(10)}, - new: &ChainConfig{HomesteadBlock: big.NewInt(25), EIP150Block: big.NewInt(20)}, + stored: &ChainConfig{HomesteadBlock: big.NewInt(30), TangerineWhistleBlock: big.NewInt(10)}, + new: &ChainConfig{HomesteadBlock: big.NewInt(25), TangerineWhistleBlock: big.NewInt(20)}, head: 25, wantErr: &ConfigCompatError{ - What: "EIP150 fork block", + What: "Tangerine Whistle fork block", StoredConfig: big.NewInt(10), NewConfig: big.NewInt(20), RewindTo: 9, diff --git a/params/eip_ctx.go b/params/eip_ctx.go index f60449a0305..3858d4f0fe6 100644 --- a/params/eip_ctx.go +++ b/params/eip_ctx.go @@ -9,9 +9,8 @@ type configKey int const ( IsHomesteadEnabled configKey = iota - IsEIP150Enabled - IsEIP155Enabled - IsEIP158Enabled + IsTangerineWhistleEnabled + IsSpuriousDragonEnabled IsByzantiumEnabled IsConstantinopleEnabled IsPetersburgEnabled @@ -21,9 +20,8 @@ const ( func (c *ChainConfig) WithEIPsFlags(ctx context.Context, blockNum uint64) context.Context { ctx = context.WithValue(ctx, IsHomesteadEnabled, c.IsHomestead(blockNum)) - ctx = context.WithValue(ctx, IsEIP150Enabled, c.IsEIP150(blockNum)) - ctx = context.WithValue(ctx, IsEIP155Enabled, c.IsEIP155(blockNum)) - ctx = context.WithValue(ctx, IsEIP158Enabled, c.IsEIP158(blockNum)) + ctx = context.WithValue(ctx, IsTangerineWhistleEnabled, c.IsTangerineWhistle(blockNum)) + ctx = context.WithValue(ctx, IsSpuriousDragonEnabled, c.IsSpuriousDragon(blockNum)) ctx = context.WithValue(ctx, IsByzantiumEnabled, c.IsByzantium(blockNum)) ctx = context.WithValue(ctx, IsConstantinopleEnabled, c.IsConstantinople(blockNum)) ctx = context.WithValue(ctx, IsPetersburgEnabled, c.IsPetersburg(blockNum)) diff --git a/params/mining.go b/params/mining.go index d3878199f89..ef92a0a513c 100644 --- a/params/mining.go +++ b/params/mining.go @@ -11,14 +11,14 @@ import ( // MiningConfig is the configuration parameters of mining. type MiningConfig struct { - Enabled bool - Noverify bool // Disable remote mining solution verification(only useful in ethash). - Etherbase common.Address `toml:",omitempty"` // Public address for block mining rewards - SigKey *ecdsa.PrivateKey // ECDSA private key for signing blocks - Notify []string `toml:",omitempty"` // HTTP URL list to be notified of new work packages(only useful in ethash). - ExtraData hexutil.Bytes `toml:",omitempty"` // Block extra data set by the miner - GasFloor uint64 // Target gas floor for mined blocks. - GasCeil uint64 // Target gas ceiling for mined blocks. - GasPrice *big.Int // Minimum gas price for mining a transaction - Recommit time.Duration // The time interval for miner to re-create mining work. + Enabled bool + EnabledPOS bool + Noverify bool // Disable remote mining solution verification(only useful in ethash). + Etherbase common.Address `toml:",omitempty"` // Public address for block mining rewards + SigKey *ecdsa.PrivateKey // ECDSA private key for signing blocks + Notify []string `toml:",omitempty"` // HTTP URL list to be notified of new work packages(only useful in ethash). + ExtraData hexutil.Bytes `toml:",omitempty"` // Block extra data set by the miner + GasLimit uint64 // Target gas limit for mined blocks. + GasPrice *big.Int // Minimum gas price for mining a transaction + Recommit time.Duration // The time interval for miner to re-create mining work. } diff --git a/params/networkname/network_name.go b/params/networkname/network_name.go new file mode 100644 index 00000000000..6bedcf7dbde --- /dev/null +++ b/params/networkname/network_name.go @@ -0,0 +1,35 @@ +package networkname + +const ( + MainnetChainName = "mainnet" + SepoliaChainName = "sepolia" + RopstenChainName = "ropsten" + RinkebyChainName = "rinkeby" + GoerliChainName = "goerli" + KilnDevnetChainName = "kiln-devnet" + DevChainName = "dev" + SokolChainName = "sokol" + FermionChainName = "fermion" + BSCChainName = "bsc" + ChapelChainName = "chapel" + RialtoChainName = "rialto" + MumbaiChainName = "mumbai" + BorMainnetChainName = "bor-mainnet" +) + +var All = []string{ + MainnetChainName, + SepoliaChainName, + RopstenChainName, + RinkebyChainName, + GoerliChainName, + KilnDevnetChainName, + //DevChainName, + SokolChainName, + FermionChainName, + BSCChainName, + ChapelChainName, + //RialtoChainName, + MumbaiChainName, + BorMainnetChainName, +} diff --git a/params/protocol_params.go b/params/protocol_params.go index a49c4489f19..b2f3c1b3c33 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -18,14 +18,17 @@ package params import "math/big" +// GasLimitBoundDivisor it can be changed by BSC +var ( + GasLimitBoundDivisor uint64 = 1024 // The bound divisor of the gas limit, used in update calculations. +) + const ( - GasLimitBoundDivisor uint64 = 1024 // The bound divisor of the gas limit, used in update calculations. - MinGasLimit uint64 = 5000 // Minimum the gas limit may ever be. - GenesisGasLimit uint64 = 4712388 // Gas limit of the Genesis block. + MinGasLimit uint64 = 5000 // Minimum the gas limit may ever be. + MaxGasLimit uint64 = 0x7fffffffffffffff // Maximum the gas limit may ever be. + GenesisGasLimit uint64 = 4712388 // Gas limit of the Genesis block. MaximumExtraDataSize uint64 = 32 // Maximum size extra data may be after Genesis. - ExpByteGas uint64 = 10 // Times ceil(log256(exponent)) for the EXP instruction. - SloadGas uint64 = 50 // Multiplied by the number of 32-byte words that are copied (round up) for any *COPY operation and added. CallValueTransferGas uint64 = 9000 // Paid for CALL when the value transfer is non-zero. CallNewAccountGas uint64 = 25000 // Paid for CALL when the destination address didn't exist prior. TxGas uint64 = 21000 // Per transaction not creating a contract. NOTE: Not payable on data of calls between transactions. @@ -90,7 +93,7 @@ const ( // These have been changed during the course of the chain CallGasFrontier uint64 = 40 // Once per CALL operation & message call transaction. - CallGasEIP150 uint64 = 700 // Static portion of gas for CALL-derivates after EIP 150 (Tangerine) + CallGasEIP150 uint64 = 700 // Static portion of gas for CALL-derivatives after EIP 150 (Tangerine) BalanceGasFrontier uint64 = 20 // The cost of a BALANCE operation BalanceGasEIP150 uint64 = 400 // The cost of a BALANCE operation after Tangerine BalanceGasEIP1884 uint64 = 700 // The cost of a BALANCE operation after EIP 1884 (part of Istanbul) @@ -106,7 +109,7 @@ const ( // EXP has a dynamic portion depending on the size of the exponent ExpByteFrontier uint64 = 10 // was set to 10 in Frontier - ExpByteEIP158 uint64 = 50 // was raised to 50 during Eip158 (Spurious Dragon) + ExpByteEIP160 uint64 = 50 // was raised to 50 during EIP 160 (Spurious Dragon) // Extcodecopy has a dynamic AND a static cost. This represents only the // static portion of the gas. It was changed during EIP 150 (Tangerine) @@ -126,6 +129,9 @@ const ( // Precompiled contract gas prices + TendermintHeaderValidateGas uint64 = 3000 // Gas for validate tendermiint consensus state + IAVLMerkleProofValidateGas uint64 = 3000 // Gas for validate merkle proof + EcrecoverGas uint64 = 3000 // Elliptic curve sender recovery gas price Sha256BaseGas uint64 = 60 // Base price for a SHA256 operation Sha256PerWordGas uint64 = 12 // Per-word price for a SHA256 operation @@ -167,3 +173,7 @@ var ( MinimumDifficulty = big.NewInt(131072) // The minimum that the difficulty may ever be. DurationLimit = big.NewInt(13) // The decision boundary on the blocktime duration used to determine whether difficulty should go up or not. ) + +func ApplyBinanceSmartChainParams() { + GasLimitBoundDivisor = 256 +} diff --git a/params/version.go b/params/version.go index 7ea5b019f0c..56d8388b83b 100644 --- a/params/version.go +++ b/params/version.go @@ -18,6 +18,8 @@ package params import ( "fmt" + + "github.com/ledgerwatch/erigon-lib/kv" ) var ( @@ -29,10 +31,12 @@ var ( // see https://calver.org const ( - VersionMajor = 2021 // Major version component of the current release - VersionMinor = 8 // Minor version component of the current release - VersionMicro = 1 // Patch version component of the current release - VersionModifier = "alpha" // Patch version component of the current release + VersionMajor = 2022 // Major version component of the current release + VersionMinor = 99 // Minor version component of the current release + VersionMicro = 99 // Patch version component of the current release + VersionModifier = "dev" // Modifier component of the current release + VersionKeyCreated = "ErigonVersionCreated" + VersionKeyFinished = "ErigonVersionFinished" ) func withModifier(vsn string) string { @@ -85,3 +89,19 @@ func VersionWithCommit(gitCommit, gitDate string) string { } return vsn } + +func SetErigonVersion(tx kv.RwTx, versionKey string) error { + versionKeyByte := []byte(versionKey) + hasVersion, err := tx.Has(kv.DatabaseInfo, versionKeyByte) + if err != nil { + return err + } + if hasVersion { + return nil + } + // Save version if it does not exist + if err := tx.Put(kv.DatabaseInfo, versionKeyByte, []byte(Version)); err != nil { + return err + } + return nil +} diff --git a/rlp/decode.go b/rlp/decode.go index 0cbf5ee4ae2..a817dee09d9 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -38,13 +38,15 @@ import ( var EOL = errors.New("rlp: end of list") var ( - ErrExpectedString = errors.New("rlp: expected String or Byte") - ErrExpectedList = errors.New("rlp: expected List") - ErrCanonInt = errors.New("rlp: non-canonical integer format") - ErrCanonSize = errors.New("rlp: non-canonical size information") - ErrElemTooLarge = errors.New("rlp: element is larger than containing list") - ErrValueTooLarge = errors.New("rlp: value size exceeds available input length") - ErrMoreThanOneValue = errors.New("rlp: input contains more than one value") + ErrExpectedString = errors.New("rlp: expected String or Byte") + ErrExpectedList = errors.New("rlp: expected List") + ErrCanonInt = errors.New("rlp: non-canonical integer format") + ErrCanonSize = errors.New("rlp: non-canonical size information") + ErrElemTooLarge = errors.New("rlp: element is larger than containing list") + ErrValueTooLarge = errors.New("rlp: value size exceeds available input length") + ErrMoreThanOneValue = errors.New("rlp: input contains more than one value") + ErrWrongTxTypePrefix = errors.New("rlp: only 1-byte tx type prefix is supported") + ErrUnknownTxTypePrefix = errors.New("rlp: unknown tx type prefix") // internal errors errNotInList = errors.New("rlp: call of ListEnd outside of any list") @@ -58,6 +60,29 @@ var ( } ) +func IsInvalidRLPError(err error) bool { + return errors.Is(err, ErrExpectedString) || + errors.Is(err, ErrExpectedList) || + errors.Is(err, ErrCanonInt) || + errors.Is(err, ErrCanonInt) || + errors.Is(err, ErrCanonSize) || + errors.Is(err, ErrElemTooLarge) || + errors.Is(err, ErrValueTooLarge) || + errors.Is(err, ErrMoreThanOneValue) || + errors.Is(err, ErrWrongTxTypePrefix) || + errors.Is(err, ErrUnknownTxTypePrefix) || + // internal errors + errors.Is(err, errNotInList) || + errors.Is(err, errNotAtEOL) || + errors.Is(err, errUintOverflow) || + // stream errors + strings.Contains(err.Error(), "rlp: input list has too many elements") || + strings.Contains(err.Error(), "rlp: expected input string or byte") || + strings.Contains(err.Error(), "rlp: expected input list") || + strings.Contains(err.Error(), "rlp: non-canonical size information") || + strings.Contains(err.Error(), "rlp: non-canonical integer (leading zero bytes)") +} + // Decoder is implemented by types that require custom RLP decoding rules or need to decode // into private fields. // @@ -227,19 +252,17 @@ func decodeBigIntNoPtr(s *Stream, val reflect.Value) error { } func decodeBigInt(s *Stream, val reflect.Value) error { - b, err := s.Bytes() + b, err := s.bigIntBytes() if err != nil { return wrapStreamError(err, val.Type()) } + + // Set the integer bytes. i := val.Interface().(*big.Int) if i == nil { i = new(big.Int) val.Set(reflect.ValueOf(i)) } - // Reject leading zero bytes - if len(b) > 0 && b[0] == 0 { - return wrapStreamError(ErrCanonInt, val.Type()) - } i.SetBytes(b) return nil } @@ -249,22 +272,17 @@ func decodeUint256NoPtr(s *Stream, val reflect.Value) error { } func decodeUint256(s *Stream, val reflect.Value) error { - b, err := s.Bytes() + b, err := s.Uint256Bytes() if err != nil { return wrapStreamError(err, val.Type()) } - if len(b) > 32 { - return wrapStreamError(errUintOverflow, val.Type()) - } + + // Set the integer bytes. i := val.Interface().(*uint256.Int) if i == nil { i = new(uint256.Int) val.Set(reflect.ValueOf(i)) } - // Reject leading zero bytes - if len(b) > 0 && b[0] == 0 { - return wrapStreamError(ErrCanonInt, val.Type()) - } i.SetBytes(b) return nil } @@ -426,9 +444,16 @@ func makeStructDecoder(typ reflect.Type) (decoder, error) { if _, err := s.List(); err != nil { return wrapStreamError(err, typ) } - for _, f := range fields { + for i, f := range fields { err := f.info.decoder(s, val.Field(f.index)) if err == EOL { + if f.optional { + // The field is optional, so reaching the end of the list before + // reaching the last field is acceptable. All remaining undecoded + // fields are zeroed. + zeroFields(val, fields[i:]) + break + } return &decodeError{msg: "too few elements", typ: typ} } else if err != nil { return addErrorContext(err, "."+typ.Field(f.index).Name) @@ -439,6 +464,13 @@ func makeStructDecoder(typ reflect.Type) (decoder, error) { return dec, nil } +func zeroFields(structval reflect.Value, fields []field) { + for _, f := range fields { + fv := structval.Field(f.index) + fv.Set(reflect.Zero(fv.Type())) + } +} + // makePtrDecoder creates a decoder that decodes into the pointer's element type. func makePtrDecoder(typ reflect.Type, tag tags) (decoder, error) { etype := typ.Elem() @@ -584,7 +616,7 @@ type Stream struct { limited bool // auxiliary buffer for integer decoding - uintbuf []byte + uintbuf [32]byte kind Kind // kind of value ahead size uint64 // size of value ahead @@ -719,6 +751,59 @@ func (s *Stream) uint(maxbits int) (uint64, error) { } } +func (s *Stream) Uint256Bytes() ([]byte, error) { + b, err := s.bigIntBytes() + if err != nil { + return nil, err + } + if len(b) > 32 { + return nil, errUintOverflow + } + return b, nil +} + +func (s *Stream) bigIntBytes() ([]byte, error) { + var buffer []byte + kind, size, err := s.Kind() + switch { + case err != nil: + return nil, err + case kind == List: + return nil, ErrExpectedString + case kind == Byte: + buffer = s.uintbuf[:1] + buffer[0] = s.byteval + s.kind = -1 // re-arm Kind + case size == 0: + // Avoid zero-length read. + s.kind = -1 + case size <= uint64(len(s.uintbuf)): + // For integers smaller than s.uintbuf, allocating a buffer + // can be avoided. + buffer = s.uintbuf[:size] + if err := s.readFull(buffer); err != nil { + return nil, err + } + // Reject inputs where single byte encoding should have been used. + if size == 1 && buffer[0] < 128 { + return nil, ErrCanonSize + } + default: + // For large integers, a temporary buffer is needed. + buffer = make([]byte, size) + if err := s.readFull(buffer); err != nil { + return nil, err + } + } + + // Reject leading zero bytes. + if len(buffer) > 0 && buffer[0] == 0 { + return nil, ErrCanonInt + } + + return buffer, nil +} + // Bool reads an RLP string of up to 1 byte and returns its contents // as a boolean. If the input does not contain an RLP string, the // returned error will be ErrExpectedString. @@ -841,9 +926,7 @@ func (s *Stream) Reset(r io.Reader, inputLimit uint64) { s.size = 0 s.kind = -1 s.kinderr = nil - if s.uintbuf == nil { - s.uintbuf = make([]byte, 8) - } + s.uintbuf = [32]byte{} s.byteval = 0 } @@ -962,20 +1045,20 @@ func (s *Stream) readUint(size byte) (uint64, error) { b, err := s.readByte() return uint64(b), err default: - start := int(8 - size) - for i := 0; i < start; i++ { - s.uintbuf[i] = 0 + buffer := s.uintbuf[:8] + for i := range buffer { + buffer[i] = 0 } - if err := s.readFull(s.uintbuf[start:]); err != nil { + start := int(8 - size) + if err := s.readFull(buffer[start:]); err != nil { return 0, err } - if s.uintbuf[start] == 0 { - // Note: readUint is also used to decode integer - // values. The error needs to be adjusted to become - // ErrCanonInt in this case. + if buffer[start] == 0 { + // Note: readUint is also used to decode integer values. + // The error needs to be adjusted to become ErrCanonInt in this case. return 0, ErrCanonSize } - return binary.BigEndian.Uint64(s.uintbuf), nil + return binary.BigEndian.Uint64(buffer), nil } } @@ -988,7 +1071,7 @@ func (s *Stream) readFull(buf []byte) (err error) { nn, err = s.r.Read(buf[n:]) n += nn } - if err == io.EOF { + if errors.Is(err, io.EOF) { if n < len(buf) { err = io.ErrUnexpectedEOF } else { @@ -1005,7 +1088,7 @@ func (s *Stream) readByte() (byte, error) { return 0, err } b, err := s.r.ReadByte() - if err == io.EOF { + if errors.Is(err, io.EOF) { err = io.ErrUnexpectedEOF } return b, err diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 4e308324426..856751273fa 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -327,6 +327,11 @@ type recstruct struct { Child *recstruct `rlp:"nil"` } +type bigIntStruct struct { + I *big.Int + B string +} + type invalidNilTag struct { X []byte `rlp:"nil"` } @@ -369,20 +374,48 @@ type intField struct { X int } +type optionalFields struct { + A uint + B uint `rlp:"optional"` + C uint `rlp:"optional"` +} + +type optionalAndTailField struct { + A uint + B uint `rlp:"optional"` + Tail []uint `rlp:"tail"` +} + +type optionalBigIntField struct { + A uint + B *big.Int `rlp:"optional"` +} + +type optionalPtrField struct { + A uint + B *[3]byte `rlp:"optional"` +} + +type optionalPtrFieldNil struct { + A uint + B *[3]byte `rlp:"optional,nil"` +} + +type ignoredField struct { + A uint + B uint `rlp:"-"` + C uint +} + var ( veryBigInt = uint256.NewInt(0).Add( uint256.NewInt(0).Lsh(uint256.NewInt(0xFFFFFFFFFFFFFF), 16), uint256.NewInt(0xFFFF), ) - realBigInt = big.NewInt(0).SetBytes(unhex("010000000000000000000000000000000000000000000000000000000000000000")) + realBigInt = big.NewInt(0).SetBytes(unhex("010000000000000000000000000000000000000000000000000000000000000000")) + veryVeryBigInt = new(big.Int).Exp(veryBigInt.ToBig(), big.NewInt(8), nil) ) -type hasIgnoredField struct { - A uint - B uint `rlp:"-"` - C uint -} - var decodeTests = []decodeTest{ // booleans {input: "01", ptr: new(bool), value: true}, @@ -451,13 +484,16 @@ var decodeTests = []decodeTest{ {input: "C0", ptr: new(string), error: "rlp: expected input string or byte for string"}, // big ints + {input: "80", ptr: new(*big.Int), value: big.NewInt(0)}, {input: "01", ptr: new(*big.Int), value: big.NewInt(1)}, {input: "89FFFFFFFFFFFFFFFFFF", ptr: new(*big.Int), value: veryBigInt.ToBig()}, {input: "A1010000000000000000000000000000000000000000000000000000000000000000", ptr: new(*big.Int), value: realBigInt}, + {input: "B848FFFFFFFFFFFFFFFFF800000000000000001BFFFFFFFFFFFFFFFFC8000000000000000045FFFFFFFFFFFFFFFFC800000000000000001BFFFFFFFFFFFFFFFFF8000000000000000001", ptr: new(*big.Int), value: veryVeryBigInt}, {input: "10", ptr: new(big.Int), value: *big.NewInt(16)}, // non-pointer also works {input: "C0", ptr: new(*big.Int), error: "rlp: expected input string or byte for *big.Int"}, - {input: "820001", ptr: new(big.Int), error: "rlp: non-canonical integer (leading zero bytes) for *big.Int"}, - {input: "8105", ptr: new(big.Int), error: "rlp: non-canonical size information for *big.Int"}, + {input: "00", ptr: new(*big.Int), error: "rlp: non-canonical integer (leading zero bytes) for *big.Int"}, + {input: "820001", ptr: new(*big.Int), error: "rlp: non-canonical integer (leading zero bytes) for *big.Int"}, + {input: "8105", ptr: new(*big.Int), error: "rlp: non-canonical size information for *big.Int"}, // uint256 {input: "01", ptr: new(*uint256.Int), value: uint256.NewInt(1)}, @@ -479,6 +515,13 @@ var decodeTests = []decodeTest{ ptr: new(recstruct), value: recstruct{1, &recstruct{2, &recstruct{3, nil}}}, }, + { + // This checks that empty big.Int works correctly in struct context. It's easy to + // miss the update of s.kind for this case, so it needs its own test. + input: "C58083343434", + ptr: new(bigIntStruct), + value: bigIntStruct{new(big.Int), "444"}, + }, // struct errors { @@ -562,8 +605,8 @@ var decodeTests = []decodeTest{ // struct tag "-" { input: "C20102", - ptr: new(hasIgnoredField), - value: hasIgnoredField{A: 1, C: 2}, + ptr: new(ignoredField), + value: ignoredField{A: 1, C: 2}, }, // struct tag "nilList" @@ -603,6 +646,110 @@ var decodeTests = []decodeTest{ value: nilStringSlice{X: &[]uint{3}}, }, + // struct tag "optional" + { + input: "C101", + ptr: new(optionalFields), + value: optionalFields{1, 0, 0}, + }, + { + input: "C20102", + ptr: new(optionalFields), + value: optionalFields{1, 2, 0}, + }, + { + input: "C3010203", + ptr: new(optionalFields), + value: optionalFields{1, 2, 3}, + }, + { + input: "C401020304", + ptr: new(optionalFields), + error: "rlp: input list has too many elements for rlp.optionalFields", + }, + { + input: "C101", + ptr: new(optionalAndTailField), + value: optionalAndTailField{A: 1}, + }, + { + input: "C20102", + ptr: new(optionalAndTailField), + value: optionalAndTailField{A: 1, B: 2, Tail: []uint{}}, + }, + { + input: "C401020304", + ptr: new(optionalAndTailField), + value: optionalAndTailField{A: 1, B: 2, Tail: []uint{3, 4}}, + }, + { + input: "C101", + ptr: new(optionalBigIntField), + value: optionalBigIntField{A: 1, B: nil}, + }, + { + input: "C20102", + ptr: new(optionalBigIntField), + value: optionalBigIntField{A: 1, B: big.NewInt(2)}, + }, + { + input: "C101", + ptr: new(optionalPtrField), + value: optionalPtrField{A: 1}, + }, + { + input: "C20180", // not accepted because "optional" doesn't enable "nil" + ptr: new(optionalPtrField), + error: "rlp: input string too short for [3]uint8, decoding into (rlp.optionalPtrField).B", + }, + { + input: "C20102", + ptr: new(optionalPtrField), + error: "rlp: input string too short for [3]uint8, decoding into (rlp.optionalPtrField).B", + }, + { + input: "C50183010203", + ptr: new(optionalPtrField), + value: optionalPtrField{A: 1, B: &[3]byte{1, 2, 3}}, + }, + { + input: "C101", + ptr: new(optionalPtrFieldNil), + value: optionalPtrFieldNil{A: 1}, + }, + { + input: "C20180", // accepted because "nil" tag allows empty input + ptr: new(optionalPtrFieldNil), + value: optionalPtrFieldNil{A: 1}, + }, + { + input: "C20102", + ptr: new(optionalPtrFieldNil), + error: "rlp: input string too short for [3]uint8, decoding into (rlp.optionalPtrFieldNil).B", + }, + + // struct tag "optional" field clearing + { + input: "C101", + ptr: &optionalFields{A: 9, B: 8, C: 7}, + value: optionalFields{A: 1, B: 0, C: 0}, + }, + { + input: "C20102", + ptr: &optionalFields{A: 9, B: 8, C: 7}, + value: optionalFields{A: 1, B: 2, C: 0}, + }, + { + input: "C20102", + ptr: &optionalAndTailField{A: 9, B: 8, Tail: []uint{7, 6, 5}}, + value: optionalAndTailField{A: 1, B: 2, Tail: []uint{}}, + }, + { + input: "C101", + ptr: &optionalPtrField{A: 9, B: &[3]byte{8, 7, 6}}, + value: optionalPtrField{A: 1}, + }, + // RawValue {input: "01", ptr: new(RawValue), value: RawValue(unhex("01"))}, {input: "82FFFF", ptr: new(RawValue), value: RawValue(unhex("82FFFF"))}, @@ -833,6 +980,40 @@ func TestDecoderFunc(t *testing.T) { x() } +// This tests the validity checks for fields with struct tag "optional". +func TestInvalidOptionalField(t *testing.T) { + type ( + invalid1 struct { + A uint `rlp:"optional"` + B uint + } + invalid2 struct { + T []uint `rlp:"tail,optional"` + } + invalid3 struct { + T []uint `rlp:"optional,tail"` + } + ) + + tests := []struct { + v interface{} + err string + }{ + {v: new(invalid1), err: `rlp: struct field rlp.invalid1.B needs "optional" tag`}, + {v: new(invalid2), err: `rlp: invalid struct tag "optional" for rlp.invalid2.T (also has "tail" tag)`}, + {v: new(invalid3), err: `rlp: invalid struct tag "tail" for rlp.invalid3.T (also has "optional" tag)`}, + } + for _, test := range tests { + err := DecodeBytes(unhex("C20102"), test.v) + if err == nil { + t.Errorf("no error for %T", test.v) + } else if err.Error() != test.err { + t.Errorf("wrong error for %T: %v", test.v, err.Error()) + } + } + +} + func ExampleDecode() { input, _ := hex.DecodeString("C90A1486666F6F626172") diff --git a/rlp/doc.go b/rlp/doc.go index 7e6ee852001..113828e39b9 100644 --- a/rlp/doc.go +++ b/rlp/doc.go @@ -102,29 +102,60 @@ Signed integers, floating point numbers, maps, channels and functions cannot be Struct Tags -Package rlp honours certain struct tags: "-", "tail", "nil", "nilList" and "nilString". +As with other encoding packages, the "-" tag ignores fields. -The "-" tag ignores fields. + type StructWithIgnoredField struct{ + Ignored uint `rlp:"-"` + Field uint + } + +Go struct values encode/decode as RLP lists. There are two ways of influencing the mapping +of fields to list elements. The "tail" tag, which may only be used on the last exported +struct field, allows slurping up any excess list elements into a slice. + + type StructWithTail struct{ + Field uint + Tail []string `rlp:"tail"` + } -The "tail" tag, which may only be used on the last exported struct field, allows slurping -up any excess list elements into a slice. See examples for more details. +The "optional" tag says that the field may be omitted if it is zero-valued. If this tag is +used on a struct field, all subsequent public fields must also be declared optional. -The "nil" tag applies to pointer-typed fields and changes the decoding rules for the field -such that input values of size zero decode as a nil pointer. This tag can be useful when -decoding recursive types. +When encoding a struct with optional fields, the output RLP list contains all values up to +the last non-zero optional field. - type StructWithOptionalFoo struct { - Foo *[20]byte `rlp:"nil"` +When decoding into a struct, optional fields may be omitted from the end of the input +list. For the example below, this means input lists of one, two, or three elements are +accepted. + + type StructWithOptionalFields struct{ + Required uint + Optional1 uint `rlp:"optional"` + Optional2 uint `rlp:"optional"` + } + +The "nil", "nilList" and "nilString" tags apply to pointer-typed fields only, and change +the decoding rules for the field type. For regular pointer fields without the "nil" tag, +input values must always match the required input length exactly and the decoder does not +produce nil values. When the "nil" tag is set, input values of size zero decode as a nil +pointer. This is especially useful for recursive types. + + type StructWithNilField struct { + Field *[3]byte `rlp:"nil"` } +In the example above, Field allows two possible input sizes. For input 0xC180 (a list +containing an empty string) Field is set to nil after decoding. For input 0xC483000000 (a +list containing a 3-byte string), Field is set to a non-nil array pointer. + RLP supports two kinds of empty values: empty lists and empty strings. When using the -"nil" tag, the kind of empty value allowed for a type is chosen automatically. A struct -field whose Go type is a pointer to an unsigned integer, string, boolean or byte -array/slice expects an empty RLP string. Any other pointer field type encodes/decodes as -an empty RLP list. +"nil" tag, the kind of empty value allowed for a type is chosen automatically. A field +whose Go type is a pointer to an unsigned integer, string, boolean or byte array/slice +expects an empty RLP string. Any other pointer field type encodes/decodes as an empty RLP +list. The choice of null value can be made explicit with the "nilList" and "nilString" struct -tags. Using these tags encodes/decodes a Go nil pointer value as the kind of empty -RLP value defined by the tag. +tags. Using these tags encodes/decodes a Go nil pointer value as the empty RLP value kind +defined by the tag. */ package rlp diff --git a/rlp/encode.go b/rlp/encode.go index d6f9d4cae77..0b5539fa470 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -601,15 +601,40 @@ func makeStructWriter(typ reflect.Type) (writer, error) { return nil, structFieldError{typ, f.index, f.info.writerErr} } } - writer := func(val reflect.Value, w *encbuf) error { - lh := w.list() - for _, f := range fields { - if err := f.info.writer(val.Field(f.index), w); err != nil { - return err + + var writer writer + firstOptionalField := firstOptionalField(fields) + if firstOptionalField == len(fields) { + // This is the writer function for structs without any optional fields. + writer = func(val reflect.Value, w *encbuf) error { + lh := w.list() + for _, f := range fields { + if err := f.info.writer(val.Field(f.index), w); err != nil { + return err + } } + w.listEnd(lh) + return nil + } + } else { + // If there are any "optional" fields, the writer needs to perform additional + // checks to determine the output list length. + writer = func(val reflect.Value, w *encbuf) error { + lastField := len(fields) - 1 + for ; lastField >= firstOptionalField; lastField-- { + if !val.Field(fields[lastField].index).IsZero() { + break + } + } + lh := w.list() + for i := 0; i <= lastField; i++ { + if err := fields[i].info.writer(val.Field(fields[i].index), w); err != nil { + return err + } + } + w.listEnd(lh) + return nil } - w.listEnd(lh) - return nil } return writer, nil } diff --git a/rlp/encode_test.go b/rlp/encode_test.go index f3bd5e02887..1cedf1b3be7 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -21,7 +21,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/big" "sync" "testing" @@ -134,6 +133,14 @@ var encTests = []encTest{ val: big.NewInt(0).SetBytes(unhex("010000000000000000000000000000000000000000000000000000000000000000")), output: "A1010000000000000000000000000000000000000000000000000000000000000000", }, + { + val: veryBigInt, + output: "89FFFFFFFFFFFFFFFFFF", + }, + { + val: veryVeryBigInt, + output: "B848FFFFFFFFFFFFFFFFF800000000000000001BFFFFFFFFFFFFFFFFC8000000000000000045FFFFFFFFFFFFFFFFC800000000000000001BFFFFFFFFFFFFFFFFF8000000000000000001", + }, // non-pointer big.Int {val: *big.NewInt(0), output: "80"}, @@ -272,12 +279,30 @@ var encTests = []encTest{ {val: simplestruct{A: 3, B: "foo"}, output: "C50383666F6F"}, {val: &recstruct{5, nil}, output: "C205C0"}, {val: &recstruct{5, &recstruct{4, &recstruct{3, nil}}}, output: "C605C404C203C0"}, + {val: &intField{X: 3}, error: "rlp: type int is not RLP-serializable (struct field rlp.intField.X)"}, + + // struct tag "-" + {val: &ignoredField{A: 1, B: 2, C: 3}, output: "C20103"}, + + // struct tag "tail" {val: &tailRaw{A: 1, Tail: []RawValue{unhex("02"), unhex("03")}}, output: "C3010203"}, {val: &tailRaw{A: 1, Tail: []RawValue{unhex("02")}}, output: "C20102"}, {val: &tailRaw{A: 1, Tail: []RawValue{}}, output: "C101"}, {val: &tailRaw{A: 1, Tail: nil}, output: "C101"}, - {val: &hasIgnoredField{A: 1, B: 2, C: 3}, output: "C20103"}, - {val: &intField{X: 3}, error: "rlp: type int is not RLP-serializable (struct field rlp.intField.X)"}, + + // struct tag "optional" + {val: &optionalFields{}, output: "C180"}, + {val: &optionalFields{A: 1}, output: "C101"}, + {val: &optionalFields{A: 1, B: 2}, output: "C20102"}, + {val: &optionalFields{A: 1, B: 2, C: 3}, output: "C3010203"}, + {val: &optionalFields{A: 1, B: 0, C: 3}, output: "C3018003"}, + {val: &optionalAndTailField{A: 1}, output: "C101"}, + {val: &optionalAndTailField{A: 1, B: 2}, output: "C20102"}, + {val: &optionalAndTailField{A: 1, Tail: []uint{5, 6}}, output: "C401800506"}, + {val: &optionalAndTailField{A: 1, Tail: []uint{5, 6}}, output: "C401800506"}, + {val: &optionalBigIntField{A: 1}, output: "C101"}, + {val: &optionalPtrField{A: 1}, output: "C101"}, + {val: &optionalPtrFieldNil{A: 1}, output: "C101"}, // nil {val: (*uint)(nil), output: "80"}, @@ -393,7 +418,7 @@ func TestEncodeToReader(t *testing.T) { if err != nil { return nil, err } - return ioutil.ReadAll(r) + return io.ReadAll(r) }) } @@ -414,7 +439,7 @@ func TestEncodeToReaderPiecewise(t *testing.T) { } n, err := r.Read(output[start:end]) end = start + n - if err == io.EOF { + if errors.Is(err, io.EOF) { break } else if err != nil { return nil, err @@ -434,7 +459,7 @@ func TestEncodeToReaderReturnToPool(t *testing.T) { go func() { for i := 0; i < 1000; i++ { _, r, _ := EncodeToReader("foo") - ioutil.ReadAll(r) + io.ReadAll(r) r.Read(buf) r.Read(buf) r.Read(buf) diff --git a/rlp/typecache.go b/rlp/typecache.go index 89c0d0232ed..3910dcf0806 100644 --- a/rlp/typecache.go +++ b/rlp/typecache.go @@ -38,15 +38,16 @@ type typeinfo struct { // tags represents struct tags. type tags struct { // rlp:"nil" controls whether empty input results in a nil pointer. - nilOK bool - - // This controls whether nil pointers are encoded/decoded as empty strings - // or empty lists. + // nilKind is the kind of empty value allowed for the field. nilKind Kind + nilOK bool + + // rlp:"optional" allows for a field to be missing in the input list. + // If this is set, all subsequent fields must also be optional. + optional bool - // rlp:"tail" controls whether this field swallows additional list - // elements. It can only be set for the last field, which must be - // of slice type. + // rlp:"tail" controls whether this field swallows additional list elements. It can + // only be set for the last field, which must be of slice type. tail bool // rlp:"-" ignores fields. @@ -104,28 +105,51 @@ func cachedTypeInfo1(typ reflect.Type, tags tags) *typeinfo { } type field struct { - index int - info *typeinfo + index int + info *typeinfo + optional bool } +// structFields resolves the typeinfo of all public fields in a struct type. func structFields(typ reflect.Type) (fields []field, err error) { - lastPublic := lastPublicField(typ) + var ( + lastPublic = lastPublicField(typ) + anyOptional = false + ) for i := 0; i < typ.NumField(); i++ { if f := typ.Field(i); f.PkgPath == "" { // exported - t, err := parseStructTag(typ, i, lastPublic) + tags, err := parseStructTag(typ, i, lastPublic) if err != nil { return nil, err } - if t.ignored { + + // Skip rlp:"-" fields. + if tags.ignored { continue } - info := cachedTypeInfo1(f.Type, t) - fields = append(fields, field{i, info}) + // If any field has the "optional" tag, subsequent fields must also have it. + if tags.optional || tags.tail { + anyOptional = true + } else if anyOptional { + return nil, fmt.Errorf(`rlp: struct field %v.%s needs "optional" tag`, typ, f.Name) + } + info := cachedTypeInfo1(f.Type, tags) + fields = append(fields, field{i, info, tags.optional}) } } return fields, nil } +// anyOptionalFields returns the index of the first field with "optional" tag. +func firstOptionalField(fields []field) int { + for i, f := range fields { + if f.optional { + return i + } + } + return len(fields) +} + type structFieldError struct { typ reflect.Type field int @@ -166,11 +190,19 @@ func parseStructTag(typ reflect.Type, fi, lastPublic int) (tags, error) { case "nilList": ts.nilKind = List } + case "optional": + ts.optional = true + if ts.tail { + return ts, structTagError{typ, f.Name, t, `also has "tail" tag`} + } case "tail": ts.tail = true if fi != lastPublic { return ts, structTagError{typ, f.Name, t, "must be on last field"} } + if ts.optional { + return ts, structTagError{typ, f.Name, t, `also has "optional" tag`} + } if f.Type.Kind() != reflect.Slice { return ts, structTagError{typ, f.Name, t, "field type is not slice"} } diff --git a/rpc/allow_list.go b/rpc/allow_list.go index c4da4cd0201..1e6ed84e3e6 100644 --- a/rpc/allow_list.go +++ b/rpc/allow_list.go @@ -33,3 +33,15 @@ func (a *AllowList) MarshalJSON() ([]byte, error) { } return json.Marshal(keys) } + +type ForbiddenList map[string]struct{} + +func newForbiddenList() ForbiddenList { + return ForbiddenList{ + "eth_newFilter": struct{}{}, + "eth_newPendingTransactionFilter": struct{}{}, + "eth_newBlockFilter": struct{}{}, + "eth_getFilterChanges": struct{}{}, + "eth_uninstallFilter": struct{}{}, + } +} diff --git a/rpc/client.go b/rpc/client.go index 76b8c14f666..172b2d31696 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -412,12 +412,6 @@ func (c *Client) EthSubscribe(ctx context.Context, channel interface{}, args ... return c.Subscribe(ctx, "eth", channel, args...) } -// ShhSubscribe registers a subscripion under the "shh" namespace. -// Deprecated: use Subscribe(ctx, "shh", ...). -func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ...interface{}) (*ClientSubscription, error) { - return c.Subscribe(ctx, "shh", channel, args...) -} - // Subscribe calls the "_subscribe" method with the given arguments, // registering a subscription. Server notifications for the subscription are // sent to the given channel. The element type of the channel must match the @@ -564,19 +558,19 @@ func (c *Client) dispatch(codec ServerCodec) { // Read path: case op := <-c.readOp: if op.batch { - conn.handler.handleBatch(op.msgs, nil) + conn.handler.handleBatch(op.msgs) } else { - conn.handler.handleMsg(op.msgs[0], nil) + conn.handler.handleMsg(op.msgs[0]) } case err := <-c.readErr: - conn.handler.log.Debug("RPC connection read error", "err", err) + conn.handler.log.Trace("RPC connection read error", "err", err) conn.close(err, lastOp) reading = false // Reconnect: case newcodec := <-c.reconnected: - log.Debug("RPC client reconnected", "reading", reading, "conn", newcodec.remoteAddr()) + log.Trace("RPC client reconnected", "reading", reading, "conn", newcodec.remoteAddr()) if reading { // Wait for the previous read loop to exit. This is a rare case which // happens if this loop isn't notified in time after the connection breaks. diff --git a/rpc/client_test.go b/rpc/client_test.go index 64fe5470b74..5af53af3538 100644 --- a/rpc/client_test.go +++ b/rpc/client_test.go @@ -24,13 +24,13 @@ import ( "net/http" "net/http/httptest" "reflect" - "runtime" "strings" "sync" "testing" "time" "github.com/davecgh/go-spew/spew" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/log/v3" ) @@ -256,10 +256,8 @@ func TestClientSubscribeInvalidArg(t *testing.T) { } if !shouldPanic && err != nil { t.Errorf("EthSubscribe shouldn't have panicked for %#v", arg) - buf := make([]byte, 1024*1024) - buf = buf[:runtime.Stack(buf, false)] t.Error(err) - t.Error(string(buf)) + t.Error(dbg.Stack()) } }() client.EthSubscribe(context.Background(), arg, "foo_bar") @@ -510,7 +508,7 @@ func TestClientReconnect(t *testing.T) { if err != nil { t.Fatal("can't listen:", err) } - go http.Serve(l, srv.WebsocketHandler([]string{"*"}, false)) + go http.Serve(l, srv.WebsocketHandler([]string{"*"}, nil, false)) return srv, l } @@ -575,7 +573,7 @@ func httpTestClient(srv *Server, transport string, fl *flakeyListener) (*Client, var hs *httptest.Server switch transport { case "ws": - hs = httptest.NewUnstartedServer(srv.WebsocketHandler([]string{"*"}, false)) + hs = httptest.NewUnstartedServer(srv.WebsocketHandler([]string{"*"}, nil, false)) case "http": hs = httptest.NewUnstartedServer(srv) default: @@ -610,7 +608,7 @@ func (l *flakeyListener) Accept() (net.Conn, error) { if err == nil { timeout := time.Duration(rand.Int63n(int64(l.maxKillTimeout))) time.AfterFunc(timeout, func() { - log.Debug(fmt.Sprintf("killing conn %v after %v", c.LocalAddr(), timeout)) + log.Trace(fmt.Sprintf("killing conn %v after %v", c.LocalAddr(), timeout)) c.Close() }) } diff --git a/rpc/errors.go b/rpc/errors.go index dbfde8b1965..5375a68621c 100644 --- a/rpc/errors.go +++ b/rpc/errors.go @@ -25,6 +25,7 @@ var ( _ Error = new(invalidRequestError) _ Error = new(invalidMessageError) _ Error = new(invalidParamsError) + _ Error = new(CustomError) ) const defaultErrorCode = -32000 @@ -72,3 +73,12 @@ type invalidParamsError struct{ message string } func (e *invalidParamsError) ErrorCode() int { return -32602 } func (e *invalidParamsError) Error() string { return e.message } + +type CustomError struct { + Code int + Message string +} + +func (e *CustomError) ErrorCode() int { return e.Code } + +func (e *CustomError) Error() string { return e.Message } diff --git a/rpc/handler.go b/rpc/handler.go index 43efbdcf7a1..f35c8226b1e 100644 --- a/rpc/handler.go +++ b/rpc/handler.go @@ -17,6 +17,7 @@ package rpc import ( + "bytes" "context" "encoding/json" "reflect" @@ -63,7 +64,8 @@ type handler struct { log log.Logger allowSubscribe bool - allowList AllowList // a list of explicitly allowed methods, if empty -- everything is allowed + allowList AllowList // a list of explicitly allowed methods, if empty -- everything is allowed + forbiddenList ForbiddenList subLock sync.Mutex serverSubs map[ID]*Subscription @@ -77,6 +79,7 @@ type callProc struct { func newHandler(connCtx context.Context, conn jsonWriter, idgen func() ID, reg *serviceRegistry, allowList AllowList, maxBatchConcurrency uint) *handler { rootCtx, cancelRoot := context.WithCancel(connCtx) + forbiddenList := newForbiddenList() h := &handler{ reg: reg, idgen: idgen, @@ -89,9 +92,11 @@ func newHandler(connCtx context.Context, conn jsonWriter, idgen func() ID, reg * serverSubs: make(map[ID]*Subscription), log: log.Root(), allowList: allowList, + forbiddenList: forbiddenList, maxBatchConcurrency: maxBatchConcurrency, } + if conn.remoteAddr() != "" { h.log = h.log.New("conn", conn.remoteAddr()) } @@ -100,13 +105,7 @@ func newHandler(connCtx context.Context, conn jsonWriter, idgen func() ID, reg * } // handleBatch executes all messages in a batch and returns the responses. -func (h *handler) handleBatch(msgs []*jsonrpcMessage, stream *jsoniter.Stream) { - needWriteStream := false - if stream == nil { - stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 4096) - needWriteStream = true - } - +func (h *handler) handleBatch(msgs []*jsonrpcMessage) { // Emit error response for empty batches: if len(msgs) == 0 { h.startCallProc(func(cp *callProc) { @@ -127,76 +126,49 @@ func (h *handler) handleBatch(msgs []*jsonrpcMessage, stream *jsoniter.Stream) { } // Process calls on a goroutine because they may block indefinitely: h.startCallProc(func(cp *callProc) { - stream.WriteArrayStart() - firstResponse := true // All goroutines will place results right to this array. Because requests order must match reply orders. + answersWithNils := make([]interface{}, len(msgs)) // Bounded parallelism pattern explanation https://blog.golang.org/pipelines#TOC_9. boundedConcurrency := make(chan struct{}, h.maxBatchConcurrency) defer close(boundedConcurrency) wg := sync.WaitGroup{} wg.Add(len(msgs)) - streamMutex := sync.Mutex{} - - writeToStream := func(buffer []byte) { - if len(buffer) == 0 { - return - } - - streamMutex.Lock() - defer streamMutex.Unlock() - - if !firstResponse { - stream.WriteMore() - } - stream.Write(buffer) - firstResponse = false - } - for i := range calls { - if calls[i].isSubscribe() { - // Force subscribe call to work in non-streaming mode - response := h.handleCallMsg(cp, calls[i], nil) - if response != nil { - b, _ := json.Marshal(response) - writeToStream(b) - } - } boundedConcurrency <- struct{}{} go func(i int) { defer func() { wg.Done() <-boundedConcurrency }() - cb := h.reg.callback(calls[i].Method) - var response *jsonrpcMessage - if cb != nil && cb.streamable { // cb == nil: means no such method and this case is thread-safe - batchStream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 4096) - response = h.handleCallMsg(cp, calls[i], batchStream) - if response == nil { - writeToStream(batchStream.Buffer()) - } - } else { - response = h.handleCallMsg(cp, calls[i], stream) + + select { + case <-cp.ctx.Done(): + return + default: } - // Marshal inside goroutine (parallel) - if response != nil { - buffer, _ := json.Marshal(response) - writeToStream(buffer) + + buf := bytes.NewBuffer(nil) + stream := jsoniter.NewStream(jsoniter.ConfigDefault, buf, 4096) + if res := h.handleCallMsg(cp, calls[i], stream); res != nil { + answersWithNils[i] = res + } + _ = stream.Flush() + if buf.Len() > 0 && answersWithNils[i] == nil { + answersWithNils[i] = json.RawMessage(buf.Bytes()) } }(i) } wg.Wait() - - stream.WriteArrayEnd() - stream.Flush() - - if needWriteStream { - h.conn.writeJSON(cp.ctx, json.RawMessage(stream.Buffer())) - } else { - stream.Write([]byte("\n")) + answers := make([]interface{}, 0, len(msgs)) + for _, answer := range answersWithNils { + if answer != nil { + answers = append(answers, answer) + } } - h.addSubscriptions(cp.notifiers) + if len(answers) > 0 { + h.conn.writeJSON(cp.ctx, answers) + } for _, n := range cp.notifiers { n.activate() } @@ -204,26 +176,19 @@ func (h *handler) handleBatch(msgs []*jsonrpcMessage, stream *jsoniter.Stream) { } // handleMsg handles a single message. -func (h *handler) handleMsg(msg *jsonrpcMessage, stream *jsoniter.Stream) { +func (h *handler) handleMsg(msg *jsonrpcMessage) { if ok := h.handleImmediate(msg); ok { return } h.startCallProc(func(cp *callProc) { - needWriteStream := false - if stream == nil { - stream = jsoniter.NewStream(jsoniter.ConfigDefault, nil, 4096) - needWriteStream = true - } + stream := jsoniter.NewStream(jsoniter.ConfigDefault, nil, 4096) answer := h.handleCallMsg(cp, msg, stream) h.addSubscriptions(cp.notifiers) if answer != nil { - buffer, _ := json.Marshal(answer) - stream.Write(json.RawMessage(buffer)) - } - if needWriteStream { - h.conn.writeJSON(cp.ctx, json.RawMessage(stream.Buffer())) + h.conn.writeJSON(cp.ctx, answer) } else { - stream.Write([]byte("\n")) + _ = stream.Flush() + h.conn.writeJSON(cp.ctx, json.RawMessage(stream.Buffer())) } for _, n := range cp.notifiers { n.activate() @@ -335,7 +300,7 @@ func (h *handler) handleImmediate(msg *jsonrpcMessage) bool { func (h *handler) handleSubscriptionResult(msg *jsonrpcMessage) { var result subscriptionResult if err := json.Unmarshal(msg.Params, &result); err != nil { - h.log.Debug("Dropping invalid subscription message") + h.log.Trace("Dropping invalid subscription message") return } if h.clientSubs[result.ID] != nil { @@ -347,7 +312,7 @@ func (h *handler) handleSubscriptionResult(msg *jsonrpcMessage) { func (h *handler) handleResponse(msg *jsonrpcMessage) { op := h.respWait[string(msg.ID)] if op == nil { - h.log.Debug("Unsolicited RPC response", "reqid", idForLog{msg.ID}) + h.log.Trace("Unsolicited RPC response", "reqid", idForLog{msg.ID}) return } delete(h.respWait, string(msg.ID)) @@ -376,20 +341,20 @@ func (h *handler) handleCallMsg(ctx *callProc, msg *jsonrpcMessage, stream *json switch { case msg.isNotification(): h.handleCall(ctx, msg, stream) - h.log.Debug("Served", "t", time.Since(start), "method", msg.Method, "params", string(msg.Params)) + h.log.Trace("Served", "t", time.Since(start), "method", msg.Method, "params", string(msg.Params)) return nil case msg.isCall(): resp := h.handleCall(ctx, msg, stream) - var ctx []interface{} - ctx = append(ctx, "method", msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start)) if resp != nil && resp.Error != nil { - ctx = append(ctx, "err", resp.Error.Message) if resp.Error.Data != nil { - ctx = append(ctx, "errdata", resp.Error.Data) + h.log.Warn("Served", "method", msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start), + "err", resp.Error.Message, "errdata", resp.Error.Data) + } else { + h.log.Warn("Served", "method", msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start), + "err", resp.Error.Message) } - h.log.Warn("Served", ctx...) } - h.log.Debug("Served", "t", time.Since(start), "method", msg.Method, "reqid", idForLog{msg.ID}, "params", string(msg.Params)) + h.log.Trace("Served", "t", time.Since(start), "method", msg.Method, "reqid", idForLog{msg.ID}, "params", string(msg.Params)) return resp case msg.hasValidID(): return msg.errorResponse(&invalidRequestError{"invalid request"}) @@ -399,9 +364,14 @@ func (h *handler) handleCallMsg(ctx *callProc, msg *jsonrpcMessage, stream *json } func (h *handler) isMethodAllowedByGranularControl(method string) bool { + _, isForbidden := h.forbiddenList[method] if len(h.allowList) == 0 { + if isForbidden { + return false + } return true } + _, ok := h.allowList[method] return ok } @@ -434,7 +404,7 @@ func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage, stream *jsoniter if answer != nil && answer.Error != nil { failedReqeustGauge.Inc() } - newRPCServingTimerMS(msg.Method, answer == nil || answer.Error == nil).Update(float64(time.Since(start).Milliseconds())) + newRPCServingTimerMS(msg.Method, answer == nil || answer.Error == nil).UpdateDuration(start) } return answer } diff --git a/rpc/http.go b/rpc/http.go index c1d0ab0ad16..497a99cd59b 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -23,19 +23,20 @@ import ( "errors" "fmt" "io" - "io/ioutil" "mime" "net/http" "net/url" + "strings" "sync" "time" - jsoniter "github.com/json-iterator/go" + "github.com/golang-jwt/jwt/v4" ) const ( maxRequestContentLength = 1024 * 1024 * 5 contentType = "application/json" + jwtTokenExpiry = 5 * time.Second ) // https://www.jsonrpc.org/historical/json-rpc-over-http.html#id13 @@ -72,38 +73,6 @@ func (hc *httpConn) closed() <-chan interface{} { return hc.closeCh } -// HTTPTimeouts represents the configuration params for the HTTP RPC server. -type HTTPTimeouts struct { - // ReadTimeout is the maximum duration for reading the entire - // request, including the body. - // - // Because ReadTimeout does not let Handlers make per-request - // decisions on each request body's acceptable deadline or - // upload rate, most users will prefer to use - // ReadHeaderTimeout. It is valid to use them both. - ReadTimeout time.Duration - - // WriteTimeout is the maximum duration before timing out - // writes of the response. It is reset whenever a new - // request's header is read. Like ReadTimeout, it does not - // let Handlers make decisions on a per-request basis. - WriteTimeout time.Duration - - // IdleTimeout is the maximum amount of time to wait for the - // next request when keep-alives are enabled. If IdleTimeout - // is zero, the value of ReadTimeout is used. If both are - // zero, ReadHeaderTimeout is used. - IdleTimeout time.Duration -} - -// DefaultHTTPTimeouts represents the default timeout values used if further -// configuration is not provided. -var DefaultHTTPTimeouts = HTTPTimeouts{ - ReadTimeout: 30 * time.Second, - WriteTimeout: 30 * time.Minute, - IdleTimeout: 120 * time.Second, -} - // DialHTTPWithClient creates a new RPC client that connects to an RPC server over HTTP // using the provided HTTP Client. func DialHTTPWithClient(endpoint string, client *http.Client) (*Client, error) { @@ -144,7 +113,7 @@ func (c *Client) sendHTTP(ctx context.Context, op *requestOp, msg interface{}) e if respBody != nil { buf := new(bytes.Buffer) if _, err2 := buf.ReadFrom(respBody); err2 == nil { - return fmt.Errorf("%v: %v", err, buf.String()) + return fmt.Errorf("%w: %v", err, buf.String()) } } return err @@ -179,7 +148,7 @@ func (hc *httpConn) doRequest(ctx context.Context, msg interface{}) (io.ReadClos if err != nil { return nil, err } - req, err := http.NewRequestWithContext(ctx, "POST", hc.url, ioutil.NopCloser(bytes.NewReader(body))) + req, err := http.NewRequestWithContext(ctx, "POST", hc.url, io.NopCloser(bytes.NewReader(body))) if err != nil { return nil, err } @@ -253,8 +222,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Header().Set("content-type", contentType) codec := newHTTPServerConn(r, w) defer codec.close() - stream := jsoniter.NewStream(jsoniter.ConfigDefault, w, 4096) - s.serveSingleRequest(ctx, codec, stream) + s.serveSingleRequest(ctx, codec) } // validateRequest returns a non-zero response code and error message if the @@ -283,3 +251,46 @@ func validateRequest(r *http.Request) (int, error) { err := fmt.Errorf("invalid content type, only %s is supported", contentType) return http.StatusUnsupportedMediaType, err } + +func CheckJwtSecret(w http.ResponseWriter, r *http.Request, jwtSecret []byte) bool { + var tokenStr string + // Check if JWT signature is correct + if auth := r.Header.Get("Authorization"); strings.HasPrefix(auth, "Bearer ") { + tokenStr = strings.TrimPrefix(auth, "Bearer ") + } + + if len(tokenStr) == 0 { + http.Error(w, "missing token", http.StatusForbidden) + return false + } + + keyFunc := func(token *jwt.Token) (interface{}, error) { + return jwtSecret, nil + } + claims := jwt.RegisteredClaims{} + // We explicitly set only HS256 allowed, and also disables the + // claim-check: the RegisteredClaims internally requires 'iat' to + // be no later than 'now', but we allow for a bit of drift. + token, err := jwt.ParseWithClaims(tokenStr, &claims, keyFunc, + jwt.WithValidMethods([]string{"HS256"}), + jwt.WithoutClaimsValidation()) + + switch { + case err != nil: + http.Error(w, err.Error(), http.StatusForbidden) + case !token.Valid: + http.Error(w, "invalid token", http.StatusForbidden) + case !claims.VerifyExpiresAt(time.Now(), false): // optional + http.Error(w, "token is expired", http.StatusForbidden) + case claims.IssuedAt == nil: + http.Error(w, "missing issued-at", http.StatusForbidden) + case time.Since(claims.IssuedAt.Time) > jwtTokenExpiry: + http.Error(w, "stale token", http.StatusForbidden) + case time.Until(claims.IssuedAt.Time) > jwtTokenExpiry: + http.Error(w, "future token", http.StatusForbidden) + default: + return true + } + + return false +} diff --git a/rpc/http_test.go b/rpc/http_test.go index c1f7f7f4864..f9aae87ed44 100644 --- a/rpc/http_test.go +++ b/rpc/http_test.go @@ -92,6 +92,7 @@ func confirmHTTPRequestYieldsStatusCode(t *testing.T, method, contentType, body if err != nil { t.Fatalf("request failed: %v", err) } + defer resp.Body.Close() confirmStatusCode(t, resp.StatusCode, expectedStatusCode) } diff --git a/rpc/json.go b/rpc/json.go index 4d7fdcb31b2..0893ab549b5 100644 --- a/rpc/json.go +++ b/rpc/json.go @@ -284,7 +284,7 @@ func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([] var args []reflect.Value tok, err := dec.Token() switch { - case err == io.EOF || tok == nil && err == nil: + case errors.Is(err, io.EOF) || tok == nil && err == nil: // "params" is optional and may be empty. Also allow "params":null even though it's // not in the spec because our own client used to send it. case err != nil: @@ -315,7 +315,7 @@ func parseArgumentArray(dec *json.Decoder, types []reflect.Type) ([]reflect.Valu } argval := reflect.New(types[i]) if err := dec.Decode(argval.Interface()); err != nil { - return args, fmt.Errorf("invalid argument %d: %v", i, err) + return args, fmt.Errorf("invalid argument %d: %w", i, err) } if argval.IsNil() && types[i].Kind() != reflect.Ptr { return args, fmt.Errorf("missing value for required argument %d", i) diff --git a/rpc/rpccfg/rpccfg.go b/rpc/rpccfg/rpccfg.go new file mode 100644 index 00000000000..3347b55d08e --- /dev/null +++ b/rpc/rpccfg/rpccfg.go @@ -0,0 +1,37 @@ +package rpccfg + +import ( + "time" +) + +// HTTPTimeouts represents the configuration params for the HTTP RPC server. +type HTTPTimeouts struct { + // ReadTimeout is the maximum duration for reading the entire + // request, including the body. + // + // Because ReadTimeout does not let Handlers make per-request + // decisions on each request body's acceptable deadline or + // upload rate, most users will prefer to use + // ReadHeaderTimeout. It is valid to use them both. + ReadTimeout time.Duration + + // WriteTimeout is the maximum duration before timing out + // writes of the response. It is reset whenever a new + // request's header is read. Like ReadTimeout, it does not + // let Handlers make decisions on a per-request basis. + WriteTimeout time.Duration + + // IdleTimeout is the maximum amount of time to wait for the + // next request when keep-alives are enabled. If IdleTimeout + // is zero, the value of ReadTimeout is used. If both are + // zero, ReadHeaderTimeout is used. + IdleTimeout time.Duration +} + +// DefaultHTTPTimeouts represents the default timeout values used if further +// configuration is not provided. +var DefaultHTTPTimeouts = HTTPTimeouts{ + ReadTimeout: 30 * time.Second, + WriteTimeout: 30 * time.Minute, + IdleTimeout: 120 * time.Second, +} diff --git a/rpc/server.go b/rpc/server.go index bcfcaa9b5a2..b92487bb1d7 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -22,7 +22,6 @@ import ( "sync/atomic" mapset "github.com/deckarep/golang-set" - jsoniter "github.com/json-iterator/go" "github.com/ledgerwatch/log/v3" ) @@ -100,7 +99,7 @@ func (s *Server) ServeCodec(codec ServerCodec, options CodecOption) { // serveSingleRequest reads and processes a single RPC request from the given codec. This // is used to serve HTTP connections. Subscriptions and reverse calls are not allowed in // this mode. -func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec, stream *jsoniter.Stream) { +func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) { // Don't serve if server is stopped. if atomic.LoadInt32(&s.run) == 0 { return @@ -118,9 +117,9 @@ func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec, stre return } if batch { - h.handleBatch(reqs, stream) + h.handleBatch(reqs) } else { - h.handleMsg(reqs[0], stream) + h.handleMsg(reqs[0]) } } @@ -129,7 +128,7 @@ func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec, stre // subscriptions. func (s *Server) Stop() { if atomic.CompareAndSwapInt32(&s.run, 1, 0) { - log.Debug("RPC server shutting down") + log.Info("RPC server shutting down") s.codecs.Each(func(c interface{}) bool { c.(ServerCodec).close() return true diff --git a/rpc/server_test.go b/rpc/server_test.go index 157aca11b67..82c11bd7349 100644 --- a/rpc/server_test.go +++ b/rpc/server_test.go @@ -21,8 +21,8 @@ import ( "bytes" "encoding/json" "io" - "io/ioutil" "net" + "os" "path/filepath" "sort" "strings" @@ -54,7 +54,7 @@ func TestServerRegisterName(t *testing.T) { } func TestServer(t *testing.T) { - files, err := ioutil.ReadDir("testdata") + files, err := os.ReadDir("testdata") if err != nil { t.Fatal("where'd my testdata go?") } @@ -72,7 +72,7 @@ func TestServer(t *testing.T) { func runTestScript(t *testing.T, file string) { server := newTestServer() - content, err := ioutil.ReadFile(file) + content, err := os.ReadFile(file) if err != nil { t.Fatal(err) } diff --git a/rpc/service.go b/rpc/service.go index 6ed5468a2c6..e04225f82a9 100644 --- a/rpc/service.go +++ b/rpc/service.go @@ -21,12 +21,12 @@ import ( "errors" "fmt" "reflect" - "runtime" "strings" "sync" "unicode" jsoniter "github.com/json-iterator/go" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/log/v3" ) @@ -149,7 +149,7 @@ func newCallback(receiver, fn reflect.Value, name string) *callback { outs[i] = fntype.Out(i) } if len(outs) > 2 { - log.Warn("Cannot register RPC callback [%s] - maximum 2 return values are allowed, got %d", name, len(outs)) + log.Warn(fmt.Sprintf("Cannot register RPC callback [%s] - maximum 2 return values are allowed, got %d", name, len(outs))) return nil } // If an error is returned, it must be the last returned value. @@ -158,14 +158,14 @@ func newCallback(receiver, fn reflect.Value, name string) *callback { c.errPos = 0 case len(outs) == 2: if isErrorType(outs[0]) || !isErrorType(outs[1]) { - log.Warn("Cannot register RPC callback [%s] - error must the last return value", name) + log.Warn(fmt.Sprintf("Cannot register RPC callback [%s] - error must the last return value", name)) return nil } c.errPos = 1 } // If there is only one return value (error), and the last argument is *jsoniter.Stream, mark it as streamable if len(outs) != 1 && c.streamable { - log.Warn("Cannot register RPC callback [%s] - streamable method may only return 1 value (error)", name) + log.Warn(fmt.Sprintf("Cannot register RPC callback [%s] - streamable method may only return 1 value (error)", name)) return nil } return c @@ -214,12 +214,8 @@ func (c *callback) call(ctx context.Context, method string, args []reflect.Value // Catch panic while running the callback. defer func() { if err := recover(); err != nil { - const size = 64 << 10 - buf := make([]byte, size) - buf = buf[:runtime.Stack(buf, false)] - log.Error("RPC method " + method + " crashed: " + fmt.Sprintf("%v\n%s", err, buf)) + log.Error("RPC method " + method + " crashed: " + fmt.Sprintf("%v\n%s", err, dbg.Stack())) errRes = errors.New("method handler crashed") - //debug.WriteStackTraceOnPanic(string(buf)) } }() // Run the callback. diff --git a/rpc/subscription_test.go b/rpc/subscription_test.go index f96b60c0670..f2474414a35 100644 --- a/rpc/subscription_test.go +++ b/rpc/subscription_test.go @@ -48,7 +48,7 @@ func TestNewID(t *testing.T) { func TestSubscriptions(t *testing.T) { var ( - namespaces = []string{"eth", "shh", "bzz"} + namespaces = []string{"eth", "bzz"} service = ¬ificationTestService{} subCount = len(namespaces) notificationCount = 3 @@ -195,13 +195,13 @@ func waitForMessages(in *json.Decoder, successes chan subConfirmation, notificat func readAndValidateMessage(in *json.Decoder) (*subConfirmation, *subscriptionResult, error) { var msg jsonrpcMessage if err := in.Decode(&msg); err != nil { - return nil, nil, fmt.Errorf("decode error: %v", err) + return nil, nil, fmt.Errorf("decode error: %w", err) } switch { case msg.isNotification(): var res subscriptionResult if err := json.Unmarshal(msg.Params, &res); err != nil { - return nil, nil, fmt.Errorf("invalid subscription result: %v", err) + return nil, nil, fmt.Errorf("invalid subscription result: %w", err) } return nil, &res, nil case msg.isResponse(): @@ -209,7 +209,7 @@ func readAndValidateMessage(in *json.Decoder) (*subConfirmation, *subscriptionRe if msg.Error != nil { return nil, nil, msg.Error } else if err := json.Unmarshal(msg.Result, &c.subid); err != nil { - return nil, nil, fmt.Errorf("invalid response: %v", err) + return nil, nil, fmt.Errorf("invalid response: %w", err) } else { json.Unmarshal(msg.ID, &c.reqid) return &c, nil, nil diff --git a/rpc/testdata/reqresp-batch.js b/rpc/testdata/reqresp-batch.js index 964bc808401..977af766309 100644 --- a/rpc/testdata/reqresp-batch.js +++ b/rpc/testdata/reqresp-batch.js @@ -1,7 +1,7 @@ // There is no response for all-notification batches. --> [{"jsonrpc":"2.0","method":"test_echo","params":["x",99]}] -<-- [] + // This test checks regular batch calls. --> [{"jsonrpc":"2.0","id":2,"method":"test_echo","params":[]}, {"jsonrpc":"2.0","id": 3,"method":"test_echo","params":["x",3]}] diff --git a/rpc/types.go b/rpc/types.go index 79887142509..d6ddd664c36 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -68,6 +68,7 @@ type jsonWriter interface { } type BlockNumber int64 +type Timestamp uint64 const ( PendingBlockNumber = BlockNumber(-2) @@ -118,7 +119,7 @@ func (bn *BlockNumber) UnmarshalJSON(data []byte) error { } func (bn BlockNumber) Int64() int64 { - return (int64)(bn) + return int64(bn) } type BlockNumberOrHash struct { @@ -135,6 +136,9 @@ func (bnh *BlockNumberOrHash) UnmarshalJSON(data []byte) error { if e.BlockNumber != nil && e.BlockHash != nil { return fmt.Errorf("cannot specify both BlockHash and BlockNumber, choose one or the other") } + if e.BlockNumber == nil && e.BlockHash == nil { + return fmt.Errorf("at least one of BlockNumber or BlockHash is needed if a dictionary is provided") + } bnh.BlockNumber = e.BlockNumber bnh.BlockHash = e.BlockHash bnh.RequireCanonical = e.RequireCanonical @@ -219,3 +223,50 @@ func BlockNumberOrHashWithHash(hash common.Hash, canonical bool) BlockNumberOrHa RequireCanonical: canonical, } } + +// DecimalOrHex unmarshals a non-negative decimal or hex parameter into a uint64. +type DecimalOrHex uint64 + +// UnmarshalJSON implements json.Unmarshaler. +func (dh *DecimalOrHex) UnmarshalJSON(data []byte) error { + input := strings.TrimSpace(string(data)) + if len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' { + input = input[1 : len(input)-1] + } + + value, err := strconv.ParseUint(input, 10, 64) + if err != nil { + value, err = hexutil.DecodeUint64(input) + } + if err != nil { + return err + } + *dh = DecimalOrHex(value) + return nil +} + +func (ts Timestamp) TurnIntoUint64() uint64 { + return uint64(ts) +} + +func (ts *Timestamp) UnmarshalJSON(data []byte) error { + input := strings.TrimSpace(string(data)) + if len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' { + input = input[1 : len(input)-1] + } + + // parse string to uint64 + timestamp, err := strconv.ParseUint(input, 10, 64) + if err != nil { + + // try hex number + if timestamp, err = hexutil.DecodeUint64(input); err != nil { + return err + } + + } + + *ts = Timestamp(timestamp) + return nil + +} diff --git a/rpc/types_test.go b/rpc/types_test.go index 6b204d101f1..a5ce42daac9 100644 --- a/rpc/types_test.go +++ b/rpc/types_test.go @@ -98,6 +98,8 @@ func TestBlockNumberOrHash_UnmarshalJSON(t *testing.T) { 23: {`{"blockNumber":"latest"}`, false, BlockNumberOrHashWithNumber(LatestBlockNumber)}, 24: {`{"blockNumber":"earliest"}`, false, BlockNumberOrHashWithNumber(EarliestBlockNumber)}, 25: {`{"blockNumber":"0x1", "blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`, true, BlockNumberOrHash{}}, + 26: {`{}`, true, BlockNumberOrHash{}}, + 27: {`{"jsonrpc":"2.0","result":{"code":418,"message":"blabla"},"id":""}]`, true, BlockNumberOrHash{}}, } for i, test := range tests { diff --git a/rpc/websocket.go b/rpc/websocket.go index 18cebc4a0b9..cb2415918d8 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -37,7 +37,7 @@ const ( wsWriteBuffer = 1024 wsPingInterval = 60 * time.Second wsPingWriteTimeout = 5 * time.Second - wsMessageSizeLimit = 15 * 1024 * 1024 + wsMessageSizeLimit = 32 * 1024 * 1024 ) var wsBufferPool = new(sync.Pool) @@ -46,8 +46,8 @@ var wsBufferPool = new(sync.Pool) // // allowedOrigins should be a comma-separated list of allowed origin URLs. // To allow connections with any origin, pass "*". -func (s *Server) WebsocketHandler(allowedOrigins []string, compression bool) http.Handler { - var upgrader = websocket.Upgrader{ +func (s *Server) WebsocketHandler(allowedOrigins []string, jwtSecret []byte, compression bool) http.Handler { + upgrader := websocket.Upgrader{ EnableCompression: compression, ReadBufferSize: wsReadBuffer, WriteBufferSize: wsWriteBuffer, @@ -55,9 +55,12 @@ func (s *Server) WebsocketHandler(allowedOrigins []string, compression bool) htt CheckOrigin: wsHandshakeValidator(allowedOrigins), } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if jwtSecret != nil && !CheckJwtSecret(w, r, jwtSecret) { + return + } conn, err := upgrader.Upgrade(w, r, nil) if err != nil { - log.Debug("WebSocket upgrade failed", "err", err) + log.Warn("WebSocket upgrade failed", "err", err) return } codec := newWebsocketCodec(conn) @@ -87,7 +90,7 @@ func wsHandshakeValidator(allowedOrigins []string) func(*http.Request) bool { origins.Add("http://" + hostname) } } - log.Debug(fmt.Sprintf("Allowed origin(s) for WS RPC interface %v", origins.ToSlice())) + log.Trace(fmt.Sprintf("Allowed origin(s) for WS RPC interface %v", origins.ToSlice())) f := func(req *http.Request) bool { // Skip origin verification if no Origin header is present. The origin check @@ -140,12 +143,12 @@ func ruleAllowsOrigin(allowedOrigin string, browserOrigin string) bool { ) allowedScheme, allowedHostname, allowedPort, err = parseOriginURL(allowedOrigin) if err != nil { - log.Warn("Error parsing allowed origin specification", "spec", allowedOrigin, "error", err) + log.Warn("Error parsing allowed origin specification", "spec", allowedOrigin, "err", err) return false } browserScheme, browserHostname, browserPort, err = parseOriginURL(browserOrigin) if err != nil { - log.Warn("Error parsing browser 'Origin' field", "Origin", browserOrigin, "error", err) + log.Warn("Error parsing browser 'Origin' field", "Origin", browserOrigin, "err", err) return false } if allowedScheme != "" && allowedScheme != browserScheme { @@ -189,6 +192,7 @@ func DialWebsocketWithDialer(ctx context.Context, endpoint, origin string, diale return nil, err } return newClient(ctx, func(ctx context.Context) (ServerCodec, error) { + //nolint conn, resp, err := dialer.DialContext(ctx, endpoint, header) if err != nil { hErr := wsHandshakeError{err: err} @@ -271,7 +275,7 @@ func (wc *websocketCodec) writeJSON(ctx context.Context, v interface{}) error { // pingLoop sends periodic ping frames when the connection is idle. func (wc *websocketCodec) pingLoop() { - var timer = time.NewTimer(wsPingInterval) + timer := time.NewTimer(wsPingInterval) defer wc.wg.Done() defer timer.Stop() diff --git a/rpc/websocket_test.go b/rpc/websocket_test.go index 6d0ba3c2bd3..5e370cea8b4 100644 --- a/rpc/websocket_test.go +++ b/rpc/websocket_test.go @@ -53,7 +53,7 @@ func TestWebsocketOriginCheck(t *testing.T) { var ( srv = newTestServer() - httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"http://example.com"}, false)) + httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"http://example.com"}, nil, false)) wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") ) defer srv.Stop() @@ -83,7 +83,7 @@ func TestWebsocketLargeCall(t *testing.T) { var ( srv = newTestServer() - httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"*"}, false)) + httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"*"}, nil, false)) wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") ) defer srv.Stop() @@ -164,7 +164,7 @@ func TestClientWebsocketPing(t *testing.T) { func TestClientWebsocketLargeMessage(t *testing.T) { var ( srv = NewServer(50) - httpsrv = httptest.NewServer(srv.WebsocketHandler(nil, false)) + httpsrv = httptest.NewServer(srv.WebsocketHandler(nil, nil, false)) wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") ) defer srv.Stop() diff --git a/rules.go b/rules.go index a56a624a922..f947bc0eb91 100644 --- a/rules.go +++ b/rules.go @@ -1,8 +1,9 @@ -// +build gorules +//go:build gorules package gorules // https://github.com/golang/go/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module +// to apply changes in this file, please do: ./build/bin/golangci-lint cache clean import ( "github.com/quasilyte/go-ruleguard/dsl" //quasilyterules "github.com/quasilyte/ruleguard-rules-test" @@ -48,6 +49,12 @@ func closeCollector(m dsl.Matcher) { Report(`Add "defer $c.Close()" right after collector creation`) } +func closeLockedDir(m dsl.Matcher) { + m.Match(`$c := dir.OpenRw($*_); $close`). + Where(!m["close"].Text.Matches(`defer .*\.Close()`)). + Report(`Add "defer $c.Close()" after locked.OpenDir`) +} + func passValuesByContext(m dsl.Matcher) { m.Match(`ctx.WithValue($*_)`).Report(`Don't pass app-level parameters by context, pass them as-is or as typed objects`) } diff --git a/tests/block_test.go b/tests/block_test.go index 77d14ee8232..20e743ef80b 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -14,47 +14,28 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package tests import ( "runtime" "testing" + + "github.com/ledgerwatch/log/v3" ) func TestBlockchain(t *testing.T) { + defer log.Root().SetHandler(log.Root().GetHandler()) + log.Root().SetHandler(log.LvlFilterHandler(log.LvlError, log.StderrHandler)) if runtime.GOOS == "windows" { t.Skip("fix me on win please") // after remove ChainReader from consensus engine - this test can be changed to create less databases, then can enable on win. now timeout after 20min } bt := new(testMatcher) // General state tests are 'exported' as blockchain tests, but we can run them natively. - // For speedier CI-runs, the line below can be uncommented, so those are skipped. - // For now, in hardfork-times (Berlin), we run the tests both as StateTests and - // as blockchain tests, since the latter also covers things like receipt root - //bt.skipLoad(`^GeneralStateTests/`) - - // Skip random failures due to selfish mining test - bt.skipLoad(`.*bcForgedTest/bcForkUncle\.json`) - - // Slow tests - bt.slow(`.*bcExploitTest/DelegateCallSpam.json`) - bt.slow(`.*bcExploitTest/ShanghaiLove.json`) - bt.slow(`.*bcExploitTest/SuicideIssue.json`) - bt.slow(`.*/bcForkStressTest/`) - bt.slow(`.*/bcGasPricerTest/RPC_API_Test.json`) - bt.slow(`.*/bcWalletTest/`) - - // Very slow test - bt.skipLoad(`.*/stTimeConsuming/.*`) - - // test takes a lot for time and goes easily OOM because of sha3 calculation on a huge range, - // using 4.6 TGas - bt.skipLoad(`.*randomStatetest94.json.*`) - - bt.fails(`(?m)^TestBlockchain/InvalidBlocks/bcInvalidHeaderTest/wrongReceiptTrie.json/wrongReceiptTrie_EIP150`, "No receipt validation before Byzantium") - bt.fails(`(?m)^TestBlockchain/InvalidBlocks/bcInvalidHeaderTest/wrongReceiptTrie.json/wrongReceiptTrie_EIP158`, "No receipt validation before Byzantium") - bt.fails(`(?m)^TestBlockchain/InvalidBlocks/bcInvalidHeaderTest/wrongReceiptTrie.json/wrongReceiptTrie_Frontier`, "No receipt validation before Byzantium") - bt.fails(`(?m)^TestBlockchain/InvalidBlocks/bcInvalidHeaderTest/wrongReceiptTrie.json/wrongReceiptTrie_Homestead`, "No receipt validation before Byzantium") + // For speedier CI-runs those are skipped. + bt.skipLoad(`^GeneralStateTests/`) bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { // import pre accounts & construct test genesis block & state root @@ -62,8 +43,4 @@ func TestBlockchain(t *testing.T) { t.Error(err) } }) - - // There is also a LegacyTests folder, containing blockchain tests generated - // prior to Istanbul. However, they are all derived from GeneralStateTests, - // which run natively, so there's no reason to run them here. } diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 1500c3606da..13885cbceec 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -128,7 +128,7 @@ func (t *BlockTest) Run(tst *testing.T, _ bool) error { tx, err1 := m.DB.BeginRo(context.Background()) if err1 != nil { - return fmt.Errorf("blockTest create tx: %v", err1) + return fmt.Errorf("blockTest create tx: %w", err1) } defer tx.Rollback() cmlast := rawdb.ReadHeadBlockHash(tx) @@ -137,7 +137,7 @@ func (t *BlockTest) Run(tst *testing.T, _ bool) error { } newDB := state.New(state.NewPlainStateReader(tx)) if err = t.validatePostState(newDB); err != nil { - return fmt.Errorf("post state validation failed: %v", err) + return fmt.Errorf("post state validation failed: %w", err) } return t.validateImportedHeaders(tx, validBlocks) } @@ -180,7 +180,7 @@ func (t *BlockTest) insertBlocks(m *stages.MockSentry) ([]btBlock, error) { if b.BlockHeader == nil { continue // OK - block is supposed to be invalid, continue with next block } else { - return nil, fmt.Errorf("block RLP decoding failed when expected to succeed: %v", err) + return nil, fmt.Errorf("block RLP decoding failed when expected to succeed: %w", err) } } // RLP decoding worked, try to insert into chain: @@ -189,7 +189,7 @@ func (t *BlockTest) insertBlocks(m *stages.MockSentry) ([]btBlock, error) { if b.BlockHeader == nil { continue // OK - block is supposed to be invalid, continue with next block } else { - return nil, fmt.Errorf("block #%v insertion into chain failed: %v", cb.Number(), err1) + return nil, fmt.Errorf("block #%v insertion into chain failed: %w", cb.Number(), err1) } } else if b.BlockHeader == nil { if err := m.DB.View(context.Background(), func(tx kv.Tx) error { @@ -210,7 +210,7 @@ func (t *BlockTest) insertBlocks(m *stages.MockSentry) ([]btBlock, error) { } // validate RLP decoding by checking all values against test file JSON if err = validateHeader(b.BlockHeader, cb.Header()); err != nil { - return nil, fmt.Errorf("deserialised block header validation failed: %v", err) + return nil, fmt.Errorf("deserialised block header validation failed: %w", err) } validBlocks = append(validBlocks, b) } @@ -305,9 +305,9 @@ func (t *BlockTest) validateImportedHeaders(tx kv.Tx, validBlocks []btBlock) err // be part of the longest chain until last block is imported. for b := rawdb.ReadCurrentBlock(tx); b != nil && b.NumberU64() != 0; { if err := validateHeader(bmap[b.Hash()].BlockHeader, b.Header()); err != nil { - return fmt.Errorf("imported block header validation failed: %v", err) + return fmt.Errorf("imported block header validation failed: %w", err) } - b, _ = rawdb.ReadBlockByHash(tx, b.Header().ParentHash) + b, _ = rawdb.ReadBlockByHash(tx, b.ParentHash()) } return nil } diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go index c3f8a1bfec6..cb4202bbb43 100644 --- a/tests/difficulty_test.go +++ b/tests/difficulty_test.go @@ -14,78 +14,46 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package tests import ( - "math/big" + "encoding/json" + "fmt" "testing" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/params" -) - -var ( - mainnetChainConfig = params.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(1150000), - DAOForkBlock: big.NewInt(1920000), - DAOForkSupport: true, - EIP150Block: big.NewInt(2463000), - EIP150Hash: common.HexToHash("0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0"), - EIP155Block: big.NewInt(2675000), - EIP158Block: big.NewInt(2675000), - ByzantiumBlock: big.NewInt(4370000), - } ) func TestDifficulty(t *testing.T) { t.Parallel() dt := new(testMatcher) - // Not difficulty-tests - dt.skipLoad("hexencodetest.*") - dt.skipLoad("crypto.*") - dt.skipLoad("blockgenesistest\\.json") - dt.skipLoad("genesishashestest\\.json") - dt.skipLoad("keyaddrtest\\.json") - dt.skipLoad("txtest\\.json") - - // files are 2 years old, contains strange values - dt.skipLoad("difficultyCustomHomestead\\.json") - dt.skipLoad("difficultyMorden\\.json") - dt.skipLoad("difficultyOlimpic\\.json") - - dt.config("Ropsten", *params.RopstenChainConfig) - dt.config("Morden", *params.RopstenChainConfig) - dt.config("Frontier", params.ChainConfig{}) - - dt.config("Homestead", params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - }) - - dt.config("Byzantium", params.ChainConfig{ - ByzantiumBlock: big.NewInt(0), - }) - dt.config("Frontier", *params.RopstenChainConfig) - dt.config("MainNetwork", mainnetChainConfig) - dt.config("CustomMainNetwork", mainnetChainConfig) - dt.config("Constantinople", params.ChainConfig{ - ConstantinopleBlock: big.NewInt(0), - }) - dt.config("EIP2384", params.ChainConfig{ - MuirGlacierBlock: big.NewInt(0), - }) - dt.config("difficulty.json", mainnetChainConfig) - - dt.walk(t, difficultyTestDir, func(t *testing.T, name string, test *DifficultyTest) { - cfg := dt.findConfig(name) - if test.ParentDifficulty.Cmp(params.MinimumDifficulty) < 0 { - t.Skip("difficulty below minimum") - return - } - if err := dt.checkFailure(t, test.Run(cfg)); err != nil { - t.Error(err) + dt.walk(t, difficultyTestDir, func(t *testing.T, name string, superTest map[string]json.RawMessage) { + for fork, rawTests := range superTest { + if fork == "_info" { + continue + } + var tests map[string]DifficultyTest + if err := json.Unmarshal(rawTests, &tests); err != nil { + t.Error(err) + continue + } + + cfg, ok := Forks[fork] + if !ok { + t.Error(UnsupportedForkError{fork}) + continue + } + + for subname, subtest := range tests { + key := fmt.Sprintf("%s/%s", fork, subname) + t.Run(key, func(t *testing.T) { + if err := dt.checkFailure(t, subtest.Run(cfg)); err != nil { + t.Error(err) + } + }) + } } }) } diff --git a/tests/difficulty_test_util.go b/tests/difficulty_test_util.go index 09e4fa98567..0277c540de8 100644 --- a/tests/difficulty_test_util.go +++ b/tests/difficulty_test_util.go @@ -30,12 +30,12 @@ import ( //go:generate gencodec -type DifficultyTest -field-override difficultyTestMarshaling -out gen_difficultytest.go type DifficultyTest struct { - ParentTimestamp uint64 `json:"parentTimestamp"` - ParentDifficulty *big.Int `json:"parentDifficulty"` - UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp uint64 `json:"currentTimestamp"` - CurrentBlockNumber uint64 `json:"currentBlockNumber"` - CurrentDifficulty *big.Int `json:"currentDifficulty"` + ParentTimestamp uint64 `json:"parentTimestamp"` + ParentDifficulty *big.Int `json:"parentDifficulty"` + ParentUncles uint64 `json:"parentUncles"` + CurrentTimestamp uint64 `json:"currentTimestamp"` + CurrentBlockNumber uint64 `json:"currentBlockNumber"` + CurrentDifficulty *big.Int `json:"currentDifficulty"` } type difficultyTestMarshaling struct { @@ -43,7 +43,7 @@ type difficultyTestMarshaling struct { ParentDifficulty *math.HexOrDecimal256 CurrentTimestamp math.HexOrDecimal64 CurrentDifficulty *math.HexOrDecimal256 - UncleHash common.Hash + ParentUncles uint64 CurrentBlockNumber math.HexOrDecimal64 } @@ -53,7 +53,12 @@ func (test *DifficultyTest) Run(config *params.ChainConfig) error { Difficulty: test.ParentDifficulty, Time: test.ParentTimestamp, Number: parentNumber, - UncleHash: test.UncleHash, + } + + if test.ParentUncles == 0 { + parent.UncleHash = types.EmptyUncleHash + } else { + parent.UncleHash = common.HexToHash("ab") // some dummy != EmptyUncleHash } actual := ethash.CalcDifficulty(config, test.CurrentTimestamp, parent.Time, parent.Difficulty, parent.Number.Uint64(), parent.UncleHash) @@ -61,7 +66,7 @@ func (test *DifficultyTest) Run(config *params.ChainConfig) error { if actual.Cmp(exp) != 0 { return fmt.Errorf("parent[time %v diff %v unclehash:%x] child[time %v number %v] diff %v != expected %v", - test.ParentTimestamp, test.ParentDifficulty, test.UncleHash, + test.ParentTimestamp, test.ParentDifficulty, test.ParentUncles, test.CurrentTimestamp, test.CurrentBlockNumber, actual, exp) } return nil diff --git a/tests/fuzzers/README.md b/tests/fuzzers/README.md index 7611c53698f..026a7928742 100644 --- a/tests/fuzzers/README.md +++ b/tests/fuzzers/README.md @@ -1,12 +1,13 @@ ## Fuzzers -To run a fuzzer locally, you need [go-fuzz](https://github.com/dvyukov/go-fuzz) installed. +To run a fuzzer locally, you need [go-fuzz](https://github.com/dvyukov/go-fuzz) installed. First build a fuzzing-binary out of the selected package: ``` (cd ./rlp && CGO_ENABLED=0 go-fuzz-build .) ``` + That command should generate a `rlp-fuzz.zip` in the `rlp/` directory. If you are already in that directory, you can do ``` @@ -24,22 +25,26 @@ That command should generate a `rlp-fuzz.zip` in the `rlp/` directory. If you ar 2019/11/26 13:37:24 workers: 6, corpus: 3 (33s ago), crashers: 0, restarts: 1/9967, execs: 219294 (6645/sec), cover: 1054, uptime: 33s ``` -Otherwise: + +Otherwise: + ``` go-fuzz -bin ./rlp/rlp-fuzz.zip ``` ### Notes -Once a 'crasher' is found, the fuzzer tries to avoid reporting the same vector twice, so stores the fault in the `suppressions` folder. Thus, if you -e.g. make changes to fix a bug, you should _remove_ all data from the `suppressions`-folder, to verify that the issue is indeed resolved. +Once a 'crasher' is found, the fuzzer tries to avoid reporting the same vector twice, so stores the fault in +the `suppressions` folder. Thus, if you e.g. make changes to fix a bug, you should _remove_ all data from +the `suppressions`-folder, to verify that the issue is indeed resolved. -Also, if you have only one and the same exit-point for multiple different types of test, the suppression can make the fuzzer hide different types of errors. So make -sure that each type of failure is unique (for an example, see the rlp fuzzer, where a counter `i` is used to differentiate between failures: +Also, if you have only one and the same exit-point for multiple different types of test, the suppression can make the +fuzzer hide different types of errors. So make sure that each type of failure is unique (for an example, see the rlp +fuzzer, where a counter `i` is used to differentiate between failures: ```golang - if !bytes.Equal(input, output) { - panic(fmt.Sprintf("case %d: encode-decode is not equal, \ninput : %x\noutput: %x", i, input, output)) - } + if !bytes.Equal(input, output) { +panic(fmt.Sprintf("case %d: encode-decode is not equal, \ninput : %x\noutput: %x", i, input, output)) +} ``` diff --git a/tests/fuzzers/abi/abifuzzer_test.go b/tests/fuzzers/abi/abifuzzer_test.go index 423a3cd2329..c66399e1b78 100644 --- a/tests/fuzzers/abi/abifuzzer_test.go +++ b/tests/fuzzers/abi/abifuzzer_test.go @@ -36,7 +36,7 @@ func TestGenerateCorpus(t *testing.T) { data := common.FromHex(corpusHex) checksum := sha1.Sum(data) outf := fmt.Sprintf("corpus/%x", checksum) - if err := ioutil.WriteFile(outf, data, 0777); err != nil { + if err := os.WriteFile(outf, data, 0777); err != nil { panic(err) } */ diff --git a/tests/fuzzers/bls12381/bls12381_fuzz.go b/tests/fuzzers/bls12381/bls12381_fuzz.go new file mode 100644 index 00000000000..bba317a23c4 --- /dev/null +++ b/tests/fuzzers/bls12381/bls12381_fuzz.go @@ -0,0 +1,244 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +//go:build gofuzz + +package bls + +import ( + "bytes" + "crypto/rand" + "fmt" + "io" + "math/big" + + gnark "github.com/consensys/gnark-crypto/ecc/bls12-381" + "github.com/consensys/gnark-crypto/ecc/bls12-381/fp" + "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" + "github.com/ledgerwatch/erigon/crypto/bls12381" +) + +func FuzzCrossPairing(data []byte) int { + input := bytes.NewReader(data) + + // get random G1 points + kpG1, cpG1, err := getG1Points(input) + if err != nil { + return 0 + } + + // get random G2 points + kpG2, cpG2, err := getG2Points(input) + if err != nil { + return 0 + } + + // compute pairing using geth + engine := bls12381.NewPairingEngine() + engine.AddPair(kpG1, kpG2) + kResult := engine.Result() + + // compute pairing using gnark + cResult, err := gnark.Pair([]gnark.G1Affine{*cpG1}, []gnark.G2Affine{*cpG2}) + if err != nil { + panic(fmt.Sprintf("gnark/bls12381 encountered error: %v", err)) + } + + // compare result + if !(bytes.Equal(cResult.Marshal(), bls12381.NewGT().ToBytes(kResult))) { + panic("pairing mismatch gnark / geth ") + } + + return 1 +} + +func FuzzCrossG1Add(data []byte) int { + input := bytes.NewReader(data) + + // get random G1 points + kp1, cp1, err := getG1Points(input) + if err != nil { + return 0 + } + + // get random G1 points + kp2, cp2, err := getG1Points(input) + if err != nil { + return 0 + } + + // compute kp = kp1 + kp2 + g1 := bls12381.NewG1() + kp := bls12381.PointG1{} + g1.Add(&kp, kp1, kp2) + + // compute cp = cp1 + cp2 + _cp1 := new(gnark.G1Jac).FromAffine(cp1) + _cp2 := new(gnark.G1Jac).FromAffine(cp2) + cp := new(gnark.G1Affine).FromJacobian(_cp1.AddAssign(_cp2)) + + // compare result + if !(bytes.Equal(cp.Marshal(), g1.ToBytes(&kp))) { + panic("G1 point addition mismatch gnark / geth ") + } + + return 1 +} + +func FuzzCrossG2Add(data []byte) int { + input := bytes.NewReader(data) + + // get random G2 points + kp1, cp1, err := getG2Points(input) + if err != nil { + return 0 + } + + // get random G2 points + kp2, cp2, err := getG2Points(input) + if err != nil { + return 0 + } + + // compute kp = kp1 + kp2 + g2 := bls12381.NewG2() + kp := bls12381.PointG2{} + g2.Add(&kp, kp1, kp2) + + // compute cp = cp1 + cp2 + _cp1 := new(gnark.G2Jac).FromAffine(cp1) + _cp2 := new(gnark.G2Jac).FromAffine(cp2) + cp := new(gnark.G2Affine).FromJacobian(_cp1.AddAssign(_cp2)) + + // compare result + if !(bytes.Equal(cp.Marshal(), g2.ToBytes(&kp))) { + panic("G2 point addition mismatch gnark / geth ") + } + + return 1 +} + +func FuzzCrossG1MultiExp(data []byte) int { + var ( + input = bytes.NewReader(data) + gethScalars []*big.Int + gnarkScalars []fr.Element + gethPoints []*bls12381.PointG1 + gnarkPoints []gnark.G1Affine + ) + // n random scalars (max 17) + for i := 0; i < 17; i++ { + // note that geth/crypto/bls12381 works only with scalars <= 32bytes + s, err := randomScalar(input, fr.Modulus()) + if err != nil { + break + } + // get a random G1 point as basis + kp1, cp1, err := getG1Points(input) + if err != nil { + break + } + gethScalars = append(gethScalars, s) + var gnarkScalar = &fr.Element{} + gnarkScalar = gnarkScalar.SetBigInt(s).FromMont() + gnarkScalars = append(gnarkScalars, *gnarkScalar) + + gethPoints = append(gethPoints, new(bls12381.PointG1).Set(kp1)) + gnarkPoints = append(gnarkPoints, *cp1) + } + if len(gethScalars) == 0 { + return 0 + } + // compute multi exponentiation + g1 := bls12381.NewG1() + kp := bls12381.PointG1{} + if _, err := g1.MultiExp(&kp, gethPoints, gethScalars); err != nil { + panic(fmt.Sprintf("G1 multi exponentiation errored (geth): %v", err)) + } + // note that geth/crypto/bls12381.MultiExp mutates the scalars slice (and sets all the scalars to zero) + + // gnark multi exp + cp := new(gnark.G1Affine) + cp.MultiExp(gnarkPoints, gnarkScalars) + + // compare result + if !(bytes.Equal(cp.Marshal(), g1.ToBytes(&kp))) { + panic("G1 multi exponentiation mismatch gnark / geth ") + } + + return 1 +} + +func getG1Points(input io.Reader) (*bls12381.PointG1, *gnark.G1Affine, error) { + // sample a random scalar + s, err := randomScalar(input, fp.Modulus()) + if err != nil { + return nil, nil, err + } + + // compute a random point + cp := new(gnark.G1Affine) + _, _, g1Gen, _ := gnark.Generators() + cp.ScalarMultiplication(&g1Gen, s) + cpBytes := cp.Marshal() + + // marshal gnark point -> geth point + g1 := bls12381.NewG1() + kp, err := g1.FromBytes(cpBytes) + if err != nil { + panic(fmt.Sprintf("Could not marshal gnark.G1 -> geth.G1: %v", err)) + } + if !bytes.Equal(g1.ToBytes(kp), cpBytes) { + panic("bytes(gnark.G1) != bytes(geth.G1)") + } + + return kp, cp, nil +} + +func getG2Points(input io.Reader) (*bls12381.PointG2, *gnark.G2Affine, error) { + // sample a random scalar + s, err := randomScalar(input, fp.Modulus()) + if err != nil { + return nil, nil, err + } + + // compute a random point + cp := new(gnark.G2Affine) + _, _, _, g2Gen := gnark.Generators() + cp.ScalarMultiplication(&g2Gen, s) + cpBytes := cp.Marshal() + + // marshal gnark point -> geth point + g2 := bls12381.NewG2() + kp, err := g2.FromBytes(cpBytes) + if err != nil { + panic(fmt.Sprintf("Could not marshal gnark.G2 -> geth.G2: %v", err)) + } + if !bytes.Equal(g2.ToBytes(kp), cpBytes) { + panic("bytes(gnark.G2) != bytes(geth.G2)") + } + + return kp, cp, nil +} + +func randomScalar(r io.Reader, max *big.Int) (k *big.Int, err error) { + for { + k, err = rand.Int(r, max) + if err != nil || k.Sign() > 0 { + return + } + } +} diff --git a/tests/fuzzers/bls12381/bls_fuzzer.go b/tests/fuzzers/bls12381/precompile_fuzzer.go similarity index 100% rename from tests/fuzzers/bls12381/bls_fuzzer.go rename to tests/fuzzers/bls12381/precompile_fuzzer.go diff --git a/tests/fuzzers/bn256/bn256_fuzz.go b/tests/fuzzers/bn256/bn256_fuzz.go index 1e9b0dd5526..2efbdc8efa6 100644 --- a/tests/fuzzers/bn256/bn256_fuzz.go +++ b/tests/fuzzers/bn256/bn256_fuzz.go @@ -12,12 +12,12 @@ import ( "io" "math/big" - gurvy "github.com/consensys/gurvy/bn256" + "github.com/consensys/gnark-crypto/ecc/bn254" cloudflare "github.com/ledgerwatch/erigon/crypto/bn256/cloudflare" google "github.com/ledgerwatch/erigon/crypto/bn256/google" ) -func getG1Points(input io.Reader) (*cloudflare.G1, *google.G1, *gurvy.G1Affine) { +func getG1Points(input io.Reader) (*cloudflare.G1, *google.G1, *bn254.G1Affine) { _, xc, err := cloudflare.RandomG1(input) if err != nil { // insufficient input @@ -25,16 +25,16 @@ func getG1Points(input io.Reader) (*cloudflare.G1, *google.G1, *gurvy.G1Affine) } xg := new(google.G1) if _, err := xg.Unmarshal(xc.Marshal()); err != nil { - panic(fmt.Sprintf("Could not marshal cloudflare -> google:", err)) + panic(fmt.Sprintf("Could not marshal cloudflare -> google: %v", err)) } - xs := new(gurvy.G1Affine) + xs := new(bn254.G1Affine) if err := xs.Unmarshal(xc.Marshal()); err != nil { - panic(fmt.Sprintf("Could not marshal cloudflare -> consensys:", err)) + panic(fmt.Sprintf("Could not marshal cloudflare -> gnark: %v", err)) } return xc, xg, xs } -func getG2Points(input io.Reader) (*cloudflare.G2, *google.G2, *gurvy.G2Affine) { +func getG2Points(input io.Reader) (*cloudflare.G2, *google.G2, *bn254.G2Affine) { _, xc, err := cloudflare.RandomG2(input) if err != nil { // insufficient input @@ -42,11 +42,11 @@ func getG2Points(input io.Reader) (*cloudflare.G2, *google.G2, *gurvy.G2Affine) } xg := new(google.G2) if _, err := xg.Unmarshal(xc.Marshal()); err != nil { - panic(fmt.Sprintf("Could not marshal cloudflare -> google:", err)) + panic(fmt.Sprintf("Could not marshal cloudflare -> google: %v", err)) } - xs := new(gurvy.G2Affine) + xs := new(bn254.G2Affine) if err := xs.Unmarshal(xc.Marshal()); err != nil { - panic(fmt.Sprintf("Could not marshal cloudflare -> consensys:", err)) + panic(fmt.Sprintf("Could not marshal cloudflare -> gnark: %v", err)) } return xc, xg, xs } @@ -70,16 +70,16 @@ func FuzzAdd(data []byte) int { rg := new(google.G1) rg.Add(xg, yg) - tmpX := new(gurvy.G1Jac).FromAffine(xs) - tmpY := new(gurvy.G1Jac).FromAffine(ys) - rs := new(gurvy.G1Affine).FromJacobian(tmpX.AddAssign(tmpY)) + tmpX := new(bn254.G1Jac).FromAffine(xs) + tmpY := new(bn254.G1Jac).FromAffine(ys) + rs := new(bn254.G1Affine).FromJacobian(tmpX.AddAssign(tmpY)) if !bytes.Equal(rc.Marshal(), rg.Marshal()) { panic("add mismatch: cloudflare/google") } if !bytes.Equal(rc.Marshal(), rs.Marshal()) { - panic("add mismatch: cloudflare/consensys") + panic("add mismatch: cloudflare/gnark") } return 1 } @@ -112,16 +112,16 @@ func FuzzMul(data []byte) int { rg := new(google.G1) rg.ScalarMult(pg, new(big.Int).SetBytes(buf)) - rs := new(gurvy.G1Jac) - psJac := new(gurvy.G1Jac).FromAffine(ps) + rs := new(bn254.G1Jac) + psJac := new(bn254.G1Jac).FromAffine(ps) rs.ScalarMultiplication(psJac, new(big.Int).SetBytes(buf)) - rsAffine := new(gurvy.G1Affine).FromJacobian(rs) + rsAffine := new(bn254.G1Affine).FromJacobian(rs) if !bytes.Equal(rc.Marshal(), rg.Marshal()) { panic("scalar mul mismatch: cloudflare/google") } if !bytes.Equal(rc.Marshal(), rsAffine.Marshal()) { - panic("scalar mul mismatch: cloudflare/consensys") + panic("scalar mul mismatch: cloudflare/gnark") } return 1 } @@ -136,18 +136,20 @@ func FuzzPair(data []byte) int { if tc == nil { return 0 } + // Pair the two points and ensure they result in the same output - clPair := cloudflare.PairingCheck([]*cloudflare.G1{pc}, []*cloudflare.G2{tc}) - if clPair != google.PairingCheck([]*google.G1{pg}, []*google.G2{tg}) { + clPair := cloudflare.Pair(pc, tc).Marshal() + gPair := google.Pair(pg, tg).Marshal() + if !bytes.Equal(clPair, gPair) { panic("pairing mismatch: cloudflare/google") } - coPair, err := gurvy.PairingCheck([]gurvy.G1Affine{*ps}, []gurvy.G2Affine{*ts}) + cPair, err := bn254.Pair([]bn254.G1Affine{*ps}, []bn254.G2Affine{*ts}) if err != nil { - panic(fmt.Sprintf("gurvy encountered error: %v", err)) + panic(fmt.Sprintf("gnark/bn254 encountered error: %v", err)) } - if clPair != coPair { - panic("pairing mismatch: cloudflare/consensys") + if !bytes.Equal(clPair, cPair.Marshal()) { + panic("pairing mismatch: cloudflare/gnark") } return 1 diff --git a/tests/fuzzers/difficulty/debug/main.go b/tests/fuzzers/difficulty/debug/main.go index 432a2ca6cf4..a80c80d7036 100644 --- a/tests/fuzzers/difficulty/debug/main.go +++ b/tests/fuzzers/difficulty/debug/main.go @@ -2,7 +2,6 @@ package main import ( "fmt" - "io/ioutil" "os" "github.com/ledgerwatch/erigon/tests/fuzzers/difficulty" @@ -14,7 +13,7 @@ func main() { os.Exit(1) } crasher := os.Args[1] - data, err := ioutil.ReadFile(crasher) + data, err := os.ReadFile(crasher) if err != nil { fmt.Fprintf(os.Stderr, "error loading crasher %v: %v", crasher, err) os.Exit(1) diff --git a/tests/fuzzers/secp256k1/secp_fuzzer.go b/tests/fuzzers/secp256k1/secp_fuzzer.go new file mode 100644 index 00000000000..a6c7be0ec00 --- /dev/null +++ b/tests/fuzzers/secp256k1/secp_fuzzer.go @@ -0,0 +1,50 @@ +// Copyright 2021 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +// build +gofuzz + +package secp256k1 + +import ( + "fmt" + + "github.com/btcsuite/btcd/btcec" + fuzz "github.com/google/gofuzz" + "github.com/ledgerwatch/secp256k1" +) + +func Fuzz(input []byte) int { + var ( + fuzzer = fuzz.NewFromGoFuzz(input) + curveA = secp256k1.S256() + curveB = btcec.S256() + dataP1 []byte + dataP2 []byte + ) + // first point + fuzzer.Fuzz(&dataP1) + x1, y1 := curveB.ScalarBaseMult(dataP1) + // second point + fuzzer.Fuzz(&dataP2) + x2, y2 := curveB.ScalarBaseMult(dataP2) + resAX, resAY := curveA.Add(x1, y1, x2, y2) + resBX, resBY := curveB.Add(x1, y1, x2, y2) + if resAX.Cmp(resBX) != 0 || resAY.Cmp(resBY) != 0 { + fmt.Printf("%s %s %s %s\n", x1, y1, x2, y2) + panic(fmt.Sprintf("Addition failed: erigon: %s %s btcd: %s %s", resAX, resAY, resBX, resBY)) + } + return 0 +} diff --git a/tests/fuzzers/secp256k1/secp_test.go b/tests/fuzzers/secp256k1/secp_test.go new file mode 100644 index 00000000000..76bae87086f --- /dev/null +++ b/tests/fuzzers/secp256k1/secp_test.go @@ -0,0 +1,8 @@ +package secp256k1 + +import "testing" + +func TestFuzzer(t *testing.T) { + test := "00000000N0000000/R00000000000000000U0000S0000000mkhP000000000000000U" + Fuzz([]byte(test)) +} diff --git a/tests/fuzzers/txfetcher/corpus/0151ee1d0db4c74d3bcdfa4f7396a4c8538748c9-2 b/tests/fuzzers/txfetcher/corpus/0151ee1d0db4c74d3bcdfa4f7396a4c8538748c9-2 deleted file mode 100644 index 2c75e9c7a75..00000000000 --- a/tests/fuzzers/txfetcher/corpus/0151ee1d0db4c74d3bcdfa4f7396a4c8538748c9-2 +++ /dev/null @@ -1 +0,0 @@ -¿½ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/020dd7b492a6eb34ff0b7d8ee46189422c37e4a7-6 b/tests/fuzzers/txfetcher/corpus/020dd7b492a6eb34ff0b7d8ee46189422c37e4a7-6 deleted file mode 100644 index 8d3b57789e7..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/020dd7b492a6eb34ff0b7d8ee46189422c37e4a7-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/021d1144e359233c496e22c3250609b11b213e9f-4 b/tests/fuzzers/txfetcher/corpus/021d1144e359233c496e22c3250609b11b213e9f-4 deleted file mode 100644 index 73731899d58..00000000000 --- a/tests/fuzzers/txfetcher/corpus/021d1144e359233c496e22c3250609b11b213e9f-4 +++ /dev/null @@ -1,12 +0,0 @@ - TESTING KEY----- -MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9 -SjY1bIw4iAJm2gsvvZhIrCHS3l6afab4pZB -l2+XsDlrKBxKKtDrGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTtqJQIDAQAB -AoGAGRzwwir7XvBOAy5tuV6ef6anZzus1s1Y1Clb6HbnWWF/wbZGOpet -3m4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKZTXtdZrh+k7hx0nTP8Jcb -uqFk541awmMogY/EfbWd6IOkp+4xqjlFBEDytgbIECQQDvH/6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz84SHEg1Ak/7KCxmD/sfgS5TeuNi8DoUBEmiSJwm7FX -ftxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su43sjXNueLKH8+ph2UfQuU9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xl/DoCzjA0CQQDU -y2pGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIáo‡X -qUn3Xh9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JMhNRcVFMO8dDaFo -f9Oeos0UotgiDktdQHxdNEwLjQlJBz+OtwwA=---E RATTIEY- \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/0d28327b1fb52c1ba02a6eb96675c31633921bb2-2 b/tests/fuzzers/txfetcher/corpus/0d28327b1fb52c1ba02a6eb96675c31633921bb2-2 deleted file mode 100644 index 8cc3039cb83..00000000000 --- a/tests/fuzzers/txfetcher/corpus/0d28327b1fb52c1ba02a6eb96675c31633921bb2-2 +++ /dev/null @@ -1,15 +0,0 @@ -¸&^£áo‡È—-----BEGIN RSA TESTING KEY----- -MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9 -SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZhIrCHS3l6afab4pZB -l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp -jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX -qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo -f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA== ------END RSA TESTING KEY-----Q_ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/0fcd827b57ded58e91f7ba2ac2b7ea4d25ebedca-7 b/tests/fuzzers/txfetcher/corpus/0fcd827b57ded58e91f7ba2ac2b7ea4d25ebedca-7 deleted file mode 100644 index 8ceee16af1e..00000000000 --- a/tests/fuzzers/txfetcher/corpus/0fcd827b57ded58e91f7ba2ac2b7ea4d25ebedca-7 +++ /dev/null @@ -1 +0,0 @@ -ð½apï¿ïï��ï¿ï¿¿½½½¿¿½½��¿½ï¿ï¿½ï¿ïÓÌV½¿½ïïï¿ï¿½#ï¿ï¿½&�� \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/109bc9b8fd4fef63493e104c703c79bc4a5e8d34-6 b/tests/fuzzers/txfetcher/corpus/109bc9b8fd4fef63493e104c703c79bc4a5e8d34-6 deleted file mode 100644 index df9b986af10..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/109bc9b8fd4fef63493e104c703c79bc4a5e8d34-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/163785ab002746452619f31e8dfcb4549e6f8b6e-6 b/tests/fuzzers/txfetcher/corpus/163785ab002746452619f31e8dfcb4549e6f8b6e-6 deleted file mode 100644 index 55467373d46..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/163785ab002746452619f31e8dfcb4549e6f8b6e-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/1adfa6b9ddf5766220c8ff7ede2926ca241bb947-3 b/tests/fuzzers/txfetcher/corpus/1adfa6b9ddf5766220c8ff7ede2926ca241bb947-3 deleted file mode 100644 index 4a593aa28dd..00000000000 --- a/tests/fuzzers/txfetcher/corpus/1adfa6b9ddf5766220c8ff7ede2926ca241bb947-3 +++ /dev/null @@ -1,11 +0,0 @@ -TAKBgDuLnQA3gey3VBznB39JUtxjeE6myuDkM/uGlfjb -S1w4iA5sBzzh8uxEbi4nW91IJm2gsvvZhICHS3l6ab4pZB -l2DulrKBxKKtD1rGxlG4LncabFn9vLZad2bSysqz/qTAUSTvqJQIDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Z4vMXc7jpTLryzTQIvVdfQbRc6+MUVeLKZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk54MogxEcfbWd6IOkp+4xqFLBEDtgbIECnk+hgN4H -qzzxxr397vWrjrIgbJpQvBv8QeeuNi8DoUBEmiSJwa7FXY -FUtxuvL7XvjwjN5B30pEbc6Iuyt7y4MQJBAIt21su4b3sjphy2tuUE9xblTu14qgHZ6+AiZovGKU--FfYAqVXVlxtIX -qyU3X9ps8ZfjLZ45l6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo -f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA== ------END RSA T \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/1b9a02e9a48fea1d2fc3fb77946ada278e152079-4 b/tests/fuzzers/txfetcher/corpus/1b9a02e9a48fea1d2fc3fb77946ada278e152079-4 deleted file mode 100644 index 4a56f93d3ba..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/1b9a02e9a48fea1d2fc3fb77946ada278e152079-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/1e14c7ea1faef92890988061b5abe96db7190f98-7 b/tests/fuzzers/txfetcher/corpus/1e14c7ea1faef92890988061b5abe96db7190f98-7 deleted file mode 100644 index d2442fc5a6c..00000000000 --- a/tests/fuzzers/txfetcher/corpus/1e14c7ea1faef92890988061b5abe96db7190f98-7 +++ /dev/null @@ -1 +0,0 @@ -0000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/1e7d05f00e99cbf3ff0ef1cd7ea8dd07ad6dff23-6 b/tests/fuzzers/txfetcher/corpus/1e7d05f00e99cbf3ff0ef1cd7ea8dd07ad6dff23-6 deleted file mode 100644 index 1c342ff53a3..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/1e7d05f00e99cbf3ff0ef1cd7ea8dd07ad6dff23-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/1ec95e347fd522e6385b5091aa81aa2485be4891-4 b/tests/fuzzers/txfetcher/corpus/1ec95e347fd522e6385b5091aa81aa2485be4891-4 deleted file mode 100644 index b0c776bd4d9..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/1ec95e347fd522e6385b5091aa81aa2485be4891-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/1fbfa5d214060d2a0905846a589fd6f78d411451-4 b/tests/fuzzers/txfetcher/corpus/1fbfa5d214060d2a0905846a589fd6f78d411451-4 deleted file mode 100644 index 75de835c98d..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/1fbfa5d214060d2a0905846a589fd6f78d411451-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/1fd84ee194e791783a7f18f0a6deab8efe05fc04-2 b/tests/fuzzers/txfetcher/corpus/1fd84ee194e791783a7f18f0a6deab8efe05fc04-2 deleted file mode 100644 index 3b6d2560aea..00000000000 --- a/tests/fuzzers/txfetcher/corpus/1fd84ee194e791783a7f18f0a6deab8efe05fc04-2 +++ /dev/null @@ -1 +0,0 @@ -¸& \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/21e76b9fca21d94d97f860c1c82f40697a83471b-8 b/tests/fuzzers/txfetcher/corpus/21e76b9fca21d94d97f860c1c82f40697a83471b-8 deleted file mode 100644 index 1d4620f49f2..00000000000 --- a/tests/fuzzers/txfetcher/corpus/21e76b9fca21d94d97f860c1c82f40697a83471b-8 +++ /dev/null @@ -1,3 +0,0 @@ -DtQvfQ+MULKZTXk78c -/fWkpxlQQ/+hgNzVtx9vWgJsafG7b0dA4AFjwVbFLmQcj2PprIMmPNQrooX -L \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/220a87fed0c92474923054094eb7aff14289cf5e-4 b/tests/fuzzers/txfetcher/corpus/220a87fed0c92474923054094eb7aff14289cf5e-4 deleted file mode 100644 index 175f74fd5aa..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/220a87fed0c92474923054094eb7aff14289cf5e-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/23ddcd66aa92fe3d78b7f5b6e7cddb1b55c5f5df-3 b/tests/fuzzers/txfetcher/corpus/23ddcd66aa92fe3d78b7f5b6e7cddb1b55c5f5df-3 deleted file mode 100644 index 95892c7b00c..00000000000 --- a/tests/fuzzers/txfetcher/corpus/23ddcd66aa92fe3d78b7f5b6e7cddb1b55c5f5df-3 +++ /dev/null @@ -1,12 +0,0 @@ -4txjeVE6myuDqkM/uGlfjb9 -SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJm2gsvvZeIrCHS3l6afab4pZB -l2+XsDlrKBxKKtD1rGxlG4jncdabFn9gvLZad2bSysqz/qTAUSTvqJQIDAQAB -AoGAGRzwwXvBOAy5tM/uV6e+Zf6aZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Z4vD6Mc7pLryzTQIVdfQbRc6+MUVeLKZaTXtdZru+Jk70PJJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+gN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQ2PprIMPcQroo8vpjSHg1Ev14KxmQeDydfsgeuN8UBESJwm7F -UtuL7Xvjw50pNEbc6Iuyty4QJA21su4sjXNueLQphy2U -fQtuUE9txblTu14qN7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6ARYiZPYj1oGUFfYAVVxtI -qyBnu3X9pfLZOAkEAlT4R5Yl6cJQYZHOde3JEhNRcVFMO8dJFo -f9Oeos0UUhgiDkQxdEwLjQf7lJJz5OtwC= --NRSA TESINGKEY-Q_ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/2441d249faf9a859e38c49f6e305b394280c6ea5-1 b/tests/fuzzers/txfetcher/corpus/2441d249faf9a859e38c49f6e305b394280c6ea5-1 deleted file mode 100644 index d76207e992a..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/2441d249faf9a859e38c49f6e305b394280c6ea5-1 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/2da1f0635e11283b1927974f418aadd8837ad31e-7 b/tests/fuzzers/txfetcher/corpus/2da1f0635e11283b1927974f418aadd8837ad31e-7 deleted file mode 100644 index 73ae7057014..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/2da1f0635e11283b1927974f418aadd8837ad31e-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/2e1853fbf8efe40098b1583224fe3b5f335e7037-6 b/tests/fuzzers/txfetcher/corpus/2e1853fbf8efe40098b1583224fe3b5f335e7037-6 deleted file mode 100644 index 692981e6141..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/2e1853fbf8efe40098b1583224fe3b5f335e7037-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/2f25490dc49c103d653843ed47324b310ee7105e-7 b/tests/fuzzers/txfetcher/corpus/2f25490dc49c103d653843ed47324b310ee7105e-7 deleted file mode 100644 index 5cf7da75df2..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/2f25490dc49c103d653843ed47324b310ee7105e-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/30494b85bb60ad7f099fa49d427007a761620d8f-5 b/tests/fuzzers/txfetcher/corpus/30494b85bb60ad7f099fa49d427007a761620d8f-5 deleted file mode 100644 index 7ff9d397521..00000000000 --- a/tests/fuzzers/txfetcher/corpus/30494b85bb60ad7f099fa49d427007a761620d8f-5 +++ /dev/null @@ -1,10 +0,0 @@ -jXbnWWF/wbZGOpet -3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp -jy4SHEg1AkEA/v13/5M47K9vCxb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xl/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6Yj013sovGKUFfYAqVXVlxtIX -qyUBnu3Xh9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dDaFeo -f9Oeos0UotgiDktdQHxdNEwLjQfl \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/316024ca3aaf09c1de5258733ff5fe3d799648d3-4 b/tests/fuzzers/txfetcher/corpus/316024ca3aaf09c1de5258733ff5fe3d799648d3-4 deleted file mode 100644 index 61f7d78f346..00000000000 --- a/tests/fuzzers/txfetcher/corpus/316024ca3aaf09c1de5258733ff5fe3d799648d3-4 +++ /dev/null @@ -1,15 +0,0 @@ -¸^áo‡È—----BEGIN RA TTING KEY----- -IIXgIBAAKBQDuLnQI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9 -SjY1bIw4iA5sBBZzHi3z0h1YV8QPuxEbi4nW91IJmgsvvZhrCHSl6afab4pZB -l2+XsDulrKBxKKtD1rGxlG4LjcdabF9gvLZad2bSysqz/qTAUStTvqJQDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Z4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp -jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj043sovGKUFfYAqVXVlxtIX -qyUBnu3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFeo -f9Oeos0UUothgiDktdQHxdNEwLjQf7lJJBzV+5OtwswCWA== ------END RSA TESTING KEY-----Q_ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/32a089e2c439a91f4c1b67a13d52429bcded0dd9-7 b/tests/fuzzers/txfetcher/corpus/32a089e2c439a91f4c1b67a13d52429bcded0dd9-7 deleted file mode 100644 index a986a9d8e75..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/32a089e2c439a91f4c1b67a13d52429bcded0dd9-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/33ec1dc0bfeb93d16edee3c07125fec6ac1aa17d-2 b/tests/fuzzers/txfetcher/corpus/33ec1dc0bfeb93d16edee3c07125fec6ac1aa17d-2 deleted file mode 100644 index d41771b86ce..00000000000 --- a/tests/fuzzers/txfetcher/corpus/33ec1dc0bfeb93d16edee3c07125fec6ac1aa17d-2 +++ /dev/null @@ -1 +0,0 @@ -ï¿ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/37a0d207700b52caa005ec8aeb344dcb13150ed2-5 b/tests/fuzzers/txfetcher/corpus/37a0d207700b52caa005ec8aeb344dcb13150ed2-5 deleted file mode 100644 index 2f09c6e28f0..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/37a0d207700b52caa005ec8aeb344dcb13150ed2-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/382f59c66d0ddb6747d3177263279789ca15c2db-5 b/tests/fuzzers/txfetcher/corpus/382f59c66d0ddb6747d3177263279789ca15c2db-5 deleted file mode 100644 index 84441ac3746..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/382f59c66d0ddb6747d3177263279789ca15c2db-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/3a010483a4ad8d7215447ce27e0fac3791235c99-4 b/tests/fuzzers/txfetcher/corpus/3a010483a4ad8d7215447ce27e0fac3791235c99-4 deleted file mode 100644 index 28f5d99b986..00000000000 --- a/tests/fuzzers/txfetcher/corpus/3a010483a4ad8d7215447ce27e0fac3791235c99-4 +++ /dev/null @@ -1,7 +0,0 @@ - -lGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp -jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/3a3b717fcfe7ffb000b906e5a76f32248a576bf7-6 b/tests/fuzzers/txfetcher/corpus/3a3b717fcfe7ffb000b906e5a76f32248a576bf7-6 deleted file mode 100644 index 022de3c61d4..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/3a3b717fcfe7ffb000b906e5a76f32248a576bf7-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/3c37f6d58b8029971935f127f53e6aaeba558445-6 b/tests/fuzzers/txfetcher/corpus/3c37f6d58b8029971935f127f53e6aaeba558445-6 deleted file mode 100644 index 9f3bf093ad1..00000000000 --- a/tests/fuzzers/txfetcher/corpus/3c37f6d58b8029971935f127f53e6aaeba558445-6 +++ /dev/null @@ -1,2 +0,0 @@ -¶Èíw¿½�€��������� � -� � � ���ï¿��������������� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/¿½0 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/3c73b63bafa9f535c882ec17189adaf02b58f432-6 b/tests/fuzzers/txfetcher/corpus/3c73b63bafa9f535c882ec17189adaf02b58f432-6 deleted file mode 100644 index 0dfbc46993f..00000000000 --- a/tests/fuzzers/txfetcher/corpus/3c73b63bafa9f535c882ec17189adaf02b58f432-6 +++ /dev/null @@ -1 +0,0 @@ -LvhaJQHOe3EhRcdaFofeoogkjQfJB \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/3d11500c4f66b20c73bbdfb1a7bddd7bbf92b29c-5 b/tests/fuzzers/txfetcher/corpus/3d11500c4f66b20c73bbdfb1a7bddd7bbf92b29c-5 deleted file mode 100644 index b19fc7f4584..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/3d11500c4f66b20c73bbdfb1a7bddd7bbf92b29c-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/3d8b5bf36c80d6f65802280039f85421f32b5055-6 b/tests/fuzzers/txfetcher/corpus/3d8b5bf36c80d6f65802280039f85421f32b5055-6 deleted file mode 100644 index eacd269f317..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/3d8b5bf36c80d6f65802280039f85421f32b5055-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/3f99c546a3962256176d566c19e3fffb62072078-1 b/tests/fuzzers/txfetcher/corpus/3f99c546a3962256176d566c19e3fffb62072078-1 deleted file mode 100644 index 9e90183d6b6..00000000000 --- a/tests/fuzzers/txfetcher/corpus/3f99c546a3962256176d566c19e3fffb62072078-1 +++ /dev/null @@ -1 +0,0 @@ -¸&^£áo‡ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/408ec46539af27acd82b3d01e863597030882458-8 b/tests/fuzzers/txfetcher/corpus/408ec46539af27acd82b3d01e863597030882458-8 deleted file mode 100644 index 65d55437e5c..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/408ec46539af27acd82b3d01e863597030882458-8 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/436154e5bb6487673f6642e6d2a582c01b083c08-8 b/tests/fuzzers/txfetcher/corpus/436154e5bb6487673f6642e6d2a582c01b083c08-8 deleted file mode 100644 index 28e519c1258..00000000000 --- a/tests/fuzzers/txfetcher/corpus/436154e5bb6487673f6642e6d2a582c01b083c08-8 +++ /dev/null @@ -1 +0,0 @@ -ð½apfffffffffffffffffffffffffffffffebadce6f48a0Ÿ_3bbfd2364 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/45f565cd14b8de1ba2e925047ce776c2682b4b8d-3 b/tests/fuzzers/txfetcher/corpus/45f565cd14b8de1ba2e925047ce776c2682b4b8d-3 deleted file mode 100644 index 9f03a095b9f..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/45f565cd14b8de1ba2e925047ce776c2682b4b8d-3 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/4a0a12f5b033c8c160cc3b5133692ea1e92c6cdf-7 b/tests/fuzzers/txfetcher/corpus/4a0a12f5b033c8c160cc3b5133692ea1e92c6cdf-7 deleted file mode 100644 index e50b5494c97..00000000000 --- a/tests/fuzzers/txfetcher/corpus/4a0a12f5b033c8c160cc3b5133692ea1e92c6cdf-7 +++ /dev/null @@ -1,3 +0,0 @@ -DtQvfQ+MULKZTXk78c -/fWkpxlyEQQ/+hgNzVtx9vWgJsafG7b0dA4AFjwVbFLmQcj2PprIMmPNQg1Ak/7KCxmDgS5TDEmSJwFX -txLjbt4xTgeXVlXsjLZ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/550f15ef65230cc4dcfab7fea67de212d9212ff8-8 b/tests/fuzzers/txfetcher/corpus/550f15ef65230cc4dcfab7fea67de212d9212ff8-8 deleted file mode 100644 index 34005f43cbe..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/550f15ef65230cc4dcfab7fea67de212d9212ff8-8 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/5552213d659fef900a194c52718ffeffdc72d043-3 b/tests/fuzzers/txfetcher/corpus/5552213d659fef900a194c52718ffeffdc72d043-3 deleted file mode 100644 index 7346ff1955e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/5552213d659fef900a194c52718ffeffdc72d043-3 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/5570ef82893a9b9b9158572d43a7de7537121d2d-1 b/tests/fuzzers/txfetcher/corpus/5570ef82893a9b9b9158572d43a7de7537121d2d-1 deleted file mode 100644 index feffcebca0c..00000000000 --- a/tests/fuzzers/txfetcher/corpus/5570ef82893a9b9b9158572d43a7de7537121d2d-1 +++ /dev/null @@ -1 +0,0 @@ -ð½ï½ï¿½Ù¯0,1,2,3,4,5,6,7,-3420794409,(2,a) \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/5e10f734f8af4116fbd164d96eec67aa53e6228c-5 b/tests/fuzzers/txfetcher/corpus/5e10f734f8af4116fbd164d96eec67aa53e6228c-5 deleted file mode 100644 index 0eacd0b59a6..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/5e10f734f8af4116fbd164d96eec67aa53e6228c-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/608200b402488b3989ec8ec5f4190ccb537b8ea4-4 b/tests/fuzzers/txfetcher/corpus/608200b402488b3989ec8ec5f4190ccb537b8ea4-4 deleted file mode 100644 index d37b018515b..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/608200b402488b3989ec8ec5f4190ccb537b8ea4-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/61e89c3fbdf9eff74bd250ea73cc2e61f8ca0d97-5 b/tests/fuzzers/txfetcher/corpus/61e89c3fbdf9eff74bd250ea73cc2e61f8ca0d97-5 deleted file mode 100644 index 155744bccc2..00000000000 --- a/tests/fuzzers/txfetcher/corpus/61e89c3fbdf9eff74bd250ea73cc2e61f8ca0d97-5 +++ /dev/null @@ -1 +0,0 @@ -88242871'392752200424491531672177074144720616417147514758635765020556616¿ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/62817a48c78fbf2c12fcdc5ca58e2ca60c43543a-7 b/tests/fuzzers/txfetcher/corpus/62817a48c78fbf2c12fcdc5ca58e2ca60c43543a-7 deleted file mode 100644 index 795608a7895..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/62817a48c78fbf2c12fcdc5ca58e2ca60c43543a-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/6782da8f1a432a77306d60d2ac2470c35b98004f-3 b/tests/fuzzers/txfetcher/corpus/6782da8f1a432a77306d60d2ac2470c35b98004f-3 deleted file mode 100644 index f44949e6aef..00000000000 --- a/tests/fuzzers/txfetcher/corpus/6782da8f1a432a77306d60d2ac2470c35b98004f-3 +++ /dev/null @@ -1 +0,0 @@ -21888242871'392752200424452601091531672177074144720616417147514758635765020556616¿½ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/68fb55290cb9d6da5b259017c34bcecf96c944aa-5 b/tests/fuzzers/txfetcher/corpus/68fb55290cb9d6da5b259017c34bcecf96c944aa-5 deleted file mode 100644 index 23d905b827e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/68fb55290cb9d6da5b259017c34bcecf96c944aa-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/6a5059bc86872526241d21ab5dae9f0afd3b9ae1-3 b/tests/fuzzers/txfetcher/corpus/6a5059bc86872526241d21ab5dae9f0afd3b9ae1-3 deleted file mode 100644 index b71d5dff516..00000000000 --- a/tests/fuzzers/txfetcher/corpus/6a5059bc86872526241d21ab5dae9f0afd3b9ae1-3 +++ /dev/null @@ -1 +0,0 @@ -¿½ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/717928e0e2d478c680c6409b173552ca98469ba5-6 b/tests/fuzzers/txfetcher/corpus/717928e0e2d478c680c6409b173552ca98469ba5-6 deleted file mode 100644 index dce51061150..00000000000 --- a/tests/fuzzers/txfetcher/corpus/717928e0e2d478c680c6409b173552ca98469ba5-6 +++ /dev/null @@ -1 +0,0 @@ -LvhaJcdaFofenogkjQfJB \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/71d22f25419543e437f249ca437823b87ac926b1-6 b/tests/fuzzers/txfetcher/corpus/71d22f25419543e437f249ca437823b87ac926b1-6 deleted file mode 100644 index d07a6c2f324..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/71d22f25419543e437f249ca437823b87ac926b1-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/7312a0f31ae5d773ed4fd74abc7521eb14754683-8 b/tests/fuzzers/txfetcher/corpus/7312a0f31ae5d773ed4fd74abc7521eb14754683-8 deleted file mode 100644 index 3593ce2e193..00000000000 --- a/tests/fuzzers/txfetcher/corpus/7312a0f31ae5d773ed4fd74abc7521eb14754683-8 +++ /dev/null @@ -1,2 +0,0 @@ -DtQvfQ+MULKZTXk78c -/fWkpxlyEQQ/+hgNzVtx9vWgJsafG7b0dA4AFjwVbFLmQcj2PprIMmPNQg1AkS5TDEmSJwFVlXsjLZ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/76e413a50dc8861e3756e556f796f1737bec2675-4 b/tests/fuzzers/txfetcher/corpus/76e413a50dc8861e3756e556f796f1737bec2675-4 deleted file mode 100644 index 623fcf9601e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/76e413a50dc8861e3756e556f796f1737bec2675-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/78480977d5c07386b06e9b37f5c82f5ed86c2f09-3 b/tests/fuzzers/txfetcher/corpus/78480977d5c07386b06e9b37f5c82f5ed86c2f09-3 deleted file mode 100644 index e92863a1c70..00000000000 --- a/tests/fuzzers/txfetcher/corpus/78480977d5c07386b06e9b37f5c82f5ed86c2f09-3 +++ /dev/null @@ -1,14 +0,0 @@ - TESTING KEY----- -MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9 -SjY1bIw4iAJm2gsvvZhIrCHS3l6afab4pZB -l2+XsDulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp -jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xl/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj013sovGKUFfYAqVXVlxtIX -qyUBnu3Xh9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JEMhNRcVFMO8dDaFeo -f9Oeos0UotgiDktdQHxdNEwLjQflJJBzV+5OtwswCA=----EN RATESTI EY-----Q \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/7a113cd3c178934cdb64353af86d51462d7080a4-5 b/tests/fuzzers/txfetcher/corpus/7a113cd3c178934cdb64353af86d51462d7080a4-5 deleted file mode 100644 index 16818128aec..00000000000 --- a/tests/fuzzers/txfetcher/corpus/7a113cd3c178934cdb64353af86d51462d7080a4-5 +++ /dev/null @@ -1,10 +0,0 @@ -l6afab4pZB -l2+XsDlrKBxKKtDrGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTtqJQIDAQAB -AoGAGRzwwir7XvBOAy5tuV6ef6anZzus1s1Y1Clb6HbnWWF/wbZGOpet -3m4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKZTXtdZrh+k7hx0nTP8Jcb -uqFk541awmMogY/EfbWd6IOkp+4xqjlFBEDytgbIECQQDvH/6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz84SHEg1Ak/7KCxmD/sfgS5TeuNi8DoUBEmiSJwm7FX -ftxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su43sjXNueLKH8+ph2UfQuU9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xl/DoCzjA0CQQDU -y2pGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6PYj13sovGKUFfYAqVXVlxtIáo‡X -qUn3X9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYZHOde3JMhNRcVFMO8dDaFo -f9Oeos0UotgiDktdQHxdNEwLjQlJBz+OtwwA=---E ATTIEY- \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/7ea9f71020f3eb783f743f744eba8d8ca4b2582f-3 b/tests/fuzzers/txfetcher/corpus/7ea9f71020f3eb783f743f744eba8d8ca4b2582f-3 deleted file mode 100644 index 08f5bb99f5d..00000000000 --- a/tests/fuzzers/txfetcher/corpus/7ea9f71020f3eb783f743f744eba8d8ca4b2582f-3 +++ /dev/null @@ -1,9 +0,0 @@ - -l2+DulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpet -3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprIMmPcQrooz8vp -jy4SHEg1AkEA/v13/5M47K9vCxmb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU diff --git a/tests/fuzzers/txfetcher/corpus/84f8c275f3ffbaf8c32c21782af13de10e7de28b-3 b/tests/fuzzers/txfetcher/corpus/84f8c275f3ffbaf8c32c21782af13de10e7de28b-3 deleted file mode 100644 index 2d6060c4067..00000000000 --- a/tests/fuzzers/txfetcher/corpus/84f8c275f3ffbaf8c32c21782af13de10e7de28b-3 +++ /dev/null @@ -1 +0,0 @@ -KKtDlbjVeLKwZatTXtdZrhu+Jk7hx0xxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLQcmPcQETT YQ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/85dfe7ddee0e52aa19115c0ebb9ed28a14e488c6-5 b/tests/fuzzers/txfetcher/corpus/85dfe7ddee0e52aa19115c0ebb9ed28a14e488c6-5 deleted file mode 100644 index 9b6fe78029e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/85dfe7ddee0e52aa19115c0ebb9ed28a14e488c6-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/87bba5b1e3da38fed8cb5a9bc5c8baa819e83d05-5 b/tests/fuzzers/txfetcher/corpus/87bba5b1e3da38fed8cb5a9bc5c8baa819e83d05-5 deleted file mode 100644 index ef091f0be29..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/87bba5b1e3da38fed8cb5a9bc5c8baa819e83d05-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/8a9ebedfbfec584d8b22761e6121dc1ca0248548-4 b/tests/fuzzers/txfetcher/corpus/8a9ebedfbfec584d8b22761e6121dc1ca0248548-4 deleted file mode 100644 index 953be79201d..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/8a9ebedfbfec584d8b22761e6121dc1ca0248548-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/8ff3bd49f93079e5e1c7f8f2461ba7ee612900c3-5 b/tests/fuzzers/txfetcher/corpus/8ff3bd49f93079e5e1c7f8f2461ba7ee612900c3-5 deleted file mode 100644 index a86a66593b4..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/8ff3bd49f93079e5e1c7f8f2461ba7ee612900c3-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/9034aaf45143996a2b14465c352ab0c6fa26b221-2 b/tests/fuzzers/txfetcher/corpus/9034aaf45143996a2b14465c352ab0c6fa26b221-2 deleted file mode 100644 index 9c95a6ba6af..00000000000 --- a/tests/fuzzers/txfetcher/corpus/9034aaf45143996a2b14465c352ab0c6fa26b221-2 +++ /dev/null @@ -1 +0,0 @@ -½ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/92cefdc6251d04896349a464b29be03d6bb04c3d-2 b/tests/fuzzers/txfetcher/corpus/92cefdc6251d04896349a464b29be03d6bb04c3d-2 deleted file mode 100644 index 9b78e45707a..00000000000 --- a/tests/fuzzers/txfetcher/corpus/92cefdc6251d04896349a464b29be03d6bb04c3d-2 +++ /dev/null @@ -1 +0,0 @@ -ï39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319¿½ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/9613e580ccb69df7c9074f0e2f6886ac6b34ca55-5 b/tests/fuzzers/txfetcher/corpus/9613e580ccb69df7c9074f0e2f6886ac6b34ca55-5 deleted file mode 100644 index 681adc6a9cd..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/9613e580ccb69df7c9074f0e2f6886ac6b34ca55-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/98afc8970a680fdc4aee0b5d48784f650c566b75-6 b/tests/fuzzers/txfetcher/corpus/98afc8970a680fdc4aee0b5d48784f650c566b75-6 deleted file mode 100644 index c82defc2437..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/98afc8970a680fdc4aee0b5d48784f650c566b75-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/9dfc92f4ca2ece0167096fca6751ff314765f08b-8 b/tests/fuzzers/txfetcher/corpus/9dfc92f4ca2ece0167096fca6751ff314765f08b-8 deleted file mode 100644 index be75c25fec2..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/9dfc92f4ca2ece0167096fca6751ff314765f08b-8 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/9ebcbbfdaf0e98c87652e57226a4d8a35170c67d-4 b/tests/fuzzers/txfetcher/corpus/9ebcbbfdaf0e98c87652e57226a4d8a35170c67d-4 deleted file mode 100644 index ab036767db9..00000000000 --- a/tests/fuzzers/txfetcher/corpus/9ebcbbfdaf0e98c87652e57226a4d8a35170c67d-4 +++ /dev/null @@ -1,5 +0,0 @@ -l2+DulrKBxKKtD1rGxlG4LjncdabFn9gvLZad2bSysqz/qTAUStTvqJQIDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1Y1ClbjbE6HXbnWWF/wbZGOpwVbFLmQet -3Zm4vD6MXc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hgN4H -qzzVtxxr397vWrjr \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/9ff520eb8b8319a5fdafbe4d1cbb02a75058d93b-7 b/tests/fuzzers/txfetcher/corpus/9ff520eb8b8319a5fdafbe4d1cbb02a75058d93b-7 deleted file mode 100644 index d91a13138cb..00000000000 --- a/tests/fuzzers/txfetcher/corpus/9ff520eb8b8319a5fdafbe4d1cbb02a75058d93b-7 +++ /dev/null @@ -1,2 +0,0 @@ -&Èíw¿½�€��������� � -� � � ���ï¿���ÿÿÿ����������� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/¿½0 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/a0b57a12e25ac5adcedb2a5c45915f0f62aee869-4 b/tests/fuzzers/txfetcher/corpus/a0b57a12e25ac5adcedb2a5c45915f0f62aee869-4 deleted file mode 100644 index 78243163a85..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/a0b57a12e25ac5adcedb2a5c45915f0f62aee869-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/a2684adccf16e036b051c12f283734fa803746e8-6 b/tests/fuzzers/txfetcher/corpus/a2684adccf16e036b051c12f283734fa803746e8-6 deleted file mode 100644 index 4e12af2da8e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/a2684adccf16e036b051c12f283734fa803746e8-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/a37305974cf477ecfe65fa92f37b1f51dea25910-4 b/tests/fuzzers/txfetcher/corpus/a37305974cf477ecfe65fa92f37b1f51dea25910-4 deleted file mode 100644 index 75cb14e8d98..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/a37305974cf477ecfe65fa92f37b1f51dea25910-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/a7eb43926bd14b1f62a66a33107776e487434d32-7 b/tests/fuzzers/txfetcher/corpus/a7eb43926bd14b1f62a66a33107776e487434d32-7 deleted file mode 100644 index 88e6127355d..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/a7eb43926bd14b1f62a66a33107776e487434d32-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/a8f7c254eb64a40fd2a77b79979c7bbdac6a760c-4 b/tests/fuzzers/txfetcher/corpus/a8f7c254eb64a40fd2a77b79979c7bbdac6a760c-4 deleted file mode 100644 index da61777c22b..00000000000 --- a/tests/fuzzers/txfetcher/corpus/a8f7c254eb64a40fd2a77b79979c7bbdac6a760c-4 +++ /dev/null @@ -1,2 +0,0 @@ -lxtIX -qyU3X9ps8ZfjLZ45l6cGhaJQYZHOde3JEMhNRcVFMO8dJDaFe \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/a9a8f287d6af24e47d8db468e8f967aa44fb5a1f-7 b/tests/fuzzers/txfetcher/corpus/a9a8f287d6af24e47d8db468e8f967aa44fb5a1f-7 deleted file mode 100644 index 7811921b79e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/a9a8f287d6af24e47d8db468e8f967aa44fb5a1f-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/aa7444d8e326158046862590a0db993c07aef372-7 b/tests/fuzzers/txfetcher/corpus/aa7444d8e326158046862590a0db993c07aef372-7 deleted file mode 100644 index 870e12ffbcf..00000000000 --- a/tests/fuzzers/txfetcher/corpus/aa7444d8e326158046862590a0db993c07aef372-7 +++ /dev/null @@ -1 +0,0 @@ -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@0000000000000 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/ae4593626d8796e079a358c2395a4f6c9ddd6a44-6 b/tests/fuzzers/txfetcher/corpus/ae4593626d8796e079a358c2395a4f6c9ddd6a44-6 deleted file mode 100644 index 845deedd0e2..00000000000 --- a/tests/fuzzers/txfetcher/corpus/ae4593626d8796e079a358c2395a4f6c9ddd6a44-6 +++ /dev/null @@ -1,8 +0,0 @@ -9pmM gY/xEcfbWd6IOkp+4xqjlFLBEDytgbparsing /E6nk+hgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLmQcj2PprLANGcQrooz8vp -jy4SHEg1AkEA/v13/@M47K9vCxb8QeD/asydfsgS5TeuNi8DoUBEmiSJwma7FXY -fFUtxuvL7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4b3sjXNueLKH85Q+phy2U -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xl/DoCz� jA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYiZ6Yj013sovGKUFfYAqVXVlxtIX -qyUBnu3Xh9ps8ZfjLZO7BAkEAlT4R5Yl6cGhaJQYFZHOde3JEMhNRcVFMO8dDaFeo -f9Oeos0Uot \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/b2942d4413a66939cda7db93020dee79eb17788c-9 b/tests/fuzzers/txfetcher/corpus/b2942d4413a66939cda7db93020dee79eb17788c-9 deleted file mode 100644 index 10aca651218..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/b2942d4413a66939cda7db93020dee79eb17788c-9 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/b4614117cdfd147d38f4e8a4d85f5a2bb99a6a4f-5 b/tests/fuzzers/txfetcher/corpus/b4614117cdfd147d38f4e8a4d85f5a2bb99a6a4f-5 deleted file mode 100644 index af69eef9b08..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/b4614117cdfd147d38f4e8a4d85f5a2bb99a6a4f-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/b631ef3291fa405cd6517d11f4d1b9b6d02912d4-2 b/tests/fuzzers/txfetcher/corpus/b631ef3291fa405cd6517d11f4d1b9b6d02912d4-2 deleted file mode 100644 index a6b8858b40d..00000000000 --- a/tests/fuzzers/txfetcher/corpus/b631ef3291fa405cd6517d11f4d1b9b6d02912d4-2 +++ /dev/null @@ -1 +0,0 @@ -&áo‡ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/b7a91e338cc11f50ebdb2c414610efc4d5be3137-4 b/tests/fuzzers/txfetcher/corpus/b7a91e338cc11f50ebdb2c414610efc4d5be3137-4 deleted file mode 100644 index 9709a1fcb82..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/b7a91e338cc11f50ebdb2c414610efc4d5be3137-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/b858cb282617fb0956d960215c8e84d1ccf909c6-2 b/tests/fuzzers/txfetcher/corpus/b858cb282617fb0956d960215c8e84d1ccf909c6-2 deleted file mode 100644 index 0519ecba6ea..00000000000 --- a/tests/fuzzers/txfetcher/corpus/b858cb282617fb0956d960215c8e84d1ccf909c6-2 +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/bc9d570aacf3acd39600feda8e72a293a4667da4-1 b/tests/fuzzers/txfetcher/corpus/bc9d570aacf3acd39600feda8e72a293a4667da4-1 deleted file mode 100644 index aab27c59095..00000000000 --- a/tests/fuzzers/txfetcher/corpus/bc9d570aacf3acd39600feda8e72a293a4667da4-1 +++ /dev/null @@ -1 +0,0 @@ -� \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/be7eed35b245b5d5d2adcdb4c67f07794eb86b24-3 b/tests/fuzzers/txfetcher/corpus/be7eed35b245b5d5d2adcdb4c67f07794eb86b24-3 deleted file mode 100644 index 47c996d33ff..00000000000 --- a/tests/fuzzers/txfetcher/corpus/be7eed35b245b5d5d2adcdb4c67f07794eb86b24-3 +++ /dev/null @@ -1,2 +0,0 @@ -4LZmbRc6+MUVeLKXtdZr+Jk7hhgN4H -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLQcmPcQ SN_ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/c010b0cd70c7edbc5bd332fc9e2e91c6a1cbcdc4-5 b/tests/fuzzers/txfetcher/corpus/c010b0cd70c7edbc5bd332fc9e2e91c6a1cbcdc4-5 deleted file mode 100644 index 474f14d89bc..00000000000 --- a/tests/fuzzers/txfetcher/corpus/c010b0cd70c7edbc5bd332fc9e2e91c6a1cbcdc4-5 +++ /dev/null @@ -1,4 +0,0 @@ - -Xc7jpTLryzTQIvVdfQbRc6+MUVeLKwZatTXtdZrhu+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbWd6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nhgN4H -qzzVtxx7vWrjrIgPbJpvfb \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/c1690698607eb0f4c4244e9f9629968be4beb6bc-8 b/tests/fuzzers/txfetcher/corpus/c1690698607eb0f4c4244e9f9629968be4beb6bc-8 deleted file mode 100644 index d184a2d8a46..00000000000 --- a/tests/fuzzers/txfetcher/corpus/c1690698607eb0f4c4244e9f9629968be4beb6bc-8 +++ /dev/null @@ -1,2 +0,0 @@ -&Ƚ�� � -� � � ���ï¿���ÿÿÿ����������� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/¿½0 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/c1f435e4f53a9a17578d9e8c4789860f962a1379-6 b/tests/fuzzers/txfetcher/corpus/c1f435e4f53a9a17578d9e8c4789860f962a1379-6 deleted file mode 100644 index f2a68ec3de9..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/c1f435e4f53a9a17578d9e8c4789860f962a1379-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/c298a75334c3acf04bd129a8867447a25c8bacf8-7 b/tests/fuzzers/txfetcher/corpus/c298a75334c3acf04bd129a8867447a25c8bacf8-7 deleted file mode 100644 index 0b437f22608..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/c298a75334c3acf04bd129a8867447a25c8bacf8-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/c42287c7d225e530e822f23bbbba6819a9e48f38-6 b/tests/fuzzers/txfetcher/corpus/c42287c7d225e530e822f23bbbba6819a9e48f38-6 deleted file mode 100644 index 91818f56348..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/c42287c7d225e530e822f23bbbba6819a9e48f38-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/c4cdbb891f3ee76476b7375d5ed51691fed95421-10 b/tests/fuzzers/txfetcher/corpus/c4cdbb891f3ee76476b7375d5ed51691fed95421-10 deleted file mode 100644 index e365cc52623..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/c4cdbb891f3ee76476b7375d5ed51691fed95421-10 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/cc9572d72dfa2937074b1766dcbcff9cc58d1137-4 b/tests/fuzzers/txfetcher/corpus/cc9572d72dfa2937074b1766dcbcff9cc58d1137-4 deleted file mode 100644 index b72a78f5291..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/cc9572d72dfa2937074b1766dcbcff9cc58d1137-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/cd1d73b4e101bc7b979e3f6f135cb12d4594d348-5 b/tests/fuzzers/txfetcher/corpus/cd1d73b4e101bc7b979e3f6f135cb12d4594d348-5 deleted file mode 100644 index 3079de55575..00000000000 --- a/tests/fuzzers/txfetcher/corpus/cd1d73b4e101bc7b979e3f6f135cb12d4594d348-5 +++ /dev/null @@ -1 +0,0 @@ -822452601031714757585602556 \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/d0acdc8fca32bbd58d368eeac3bd9eaa46f59d27-5 b/tests/fuzzers/txfetcher/corpus/d0acdc8fca32bbd58d368eeac3bd9eaa46f59d27-5 deleted file mode 100644 index 794d5d86c6a..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/d0acdc8fca32bbd58d368eeac3bd9eaa46f59d27-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/d0e43b715fd00953f7bdd6dfad95811985e81396-4 b/tests/fuzzers/txfetcher/corpus/d0e43b715fd00953f7bdd6dfad95811985e81396-4 deleted file mode 100644 index 742db5fb3ba..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/d0e43b715fd00953f7bdd6dfad95811985e81396-4 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/d925fbd22c8bc0de34d6a9d1258ce3d2928d0927-8 b/tests/fuzzers/txfetcher/corpus/d925fbd22c8bc0de34d6a9d1258ce3d2928d0927-8 deleted file mode 100644 index 5920dfe6012..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/d925fbd22c8bc0de34d6a9d1258ce3d2928d0927-8 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/d9ba78cb7425724185d5fa300cd5c03aec2683bb-7 b/tests/fuzzers/txfetcher/corpus/d9ba78cb7425724185d5fa300cd5c03aec2683bb-7 deleted file mode 100644 index c4df1cf210e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/d9ba78cb7425724185d5fa300cd5c03aec2683bb-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 b/tests/fuzzers/txfetcher/corpus/da39a3ee5e6b4b0d3255bfef95601890afd80709 deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/tests/fuzzers/txfetcher/corpus/dcdb7758b87648b5d766b1b341a65834420cf621-7 b/tests/fuzzers/txfetcher/corpus/dcdb7758b87648b5d766b1b341a65834420cf621-7 deleted file mode 100644 index 78cf11ae217..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/dcdb7758b87648b5d766b1b341a65834420cf621-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/dd441bd24581332c9ce19e008260a69287aa3cbc-6 b/tests/fuzzers/txfetcher/corpus/dd441bd24581332c9ce19e008260a69287aa3cbc-6 deleted file mode 100644 index 4e0c14006ee..00000000000 --- a/tests/fuzzers/txfetcher/corpus/dd441bd24581332c9ce19e008260a69287aa3cbc-6 +++ /dev/null @@ -1,2 +0,0 @@ -Dtf1nWk78c -/fWklyEQQ/+hgNzVtxxmDgS5TDETgeXVlXsjLZ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/def879fe0fd637a745c00c8f1da340518db8688c-2 b/tests/fuzzers/txfetcher/corpus/def879fe0fd637a745c00c8f1da340518db8688c-2 deleted file mode 100644 index 555752f0ed1..00000000000 --- a/tests/fuzzers/txfetcher/corpus/def879fe0fd637a745c00c8f1da340518db8688c-2 +++ /dev/null @@ -1 +0,0 @@ -ù ´ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/df6c30a9781b93bd6d2f5e97e5592d5945210003-7 b/tests/fuzzers/txfetcher/corpus/df6c30a9781b93bd6d2f5e97e5592d5945210003-7 deleted file mode 100644 index 2a7adb093bc..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/df6c30a9781b93bd6d2f5e97e5592d5945210003-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/dfc1c3a2e3ccdaf6f88c515fd00e8ad08421e431-6 b/tests/fuzzers/txfetcher/corpus/dfc1c3a2e3ccdaf6f88c515fd00e8ad08421e431-6 deleted file mode 100644 index 59f3442c053..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/dfc1c3a2e3ccdaf6f88c515fd00e8ad08421e431-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/e1dcc4e7ead6dfd1139ece7bf57d776cb9dac72d-7 b/tests/fuzzers/txfetcher/corpus/e1dcc4e7ead6dfd1139ece7bf57d776cb9dac72d-7 deleted file mode 100644 index 5ba489f99dd..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/e1dcc4e7ead6dfd1139ece7bf57d776cb9dac72d-7 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/e39c2de2c8937d2cbd4339b13d6a0ce94d94f8d2-8 b/tests/fuzzers/txfetcher/corpus/e39c2de2c8937d2cbd4339b13d6a0ce94d94f8d2-8 deleted file mode 100644 index 0e9508938e4..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/e39c2de2c8937d2cbd4339b13d6a0ce94d94f8d2-8 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/e72f76b9579c792e545d02fe405d9186f0d6c39b-6 b/tests/fuzzers/txfetcher/corpus/e72f76b9579c792e545d02fe405d9186f0d6c39b-6 deleted file mode 100644 index c4d34b1732a..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/e72f76b9579c792e545d02fe405d9186f0d6c39b-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/eb70814d6355a4498b8f301ba8dbc34f895a9947-5 b/tests/fuzzers/txfetcher/corpus/eb70814d6355a4498b8f301ba8dbc34f895a9947-5 deleted file mode 100644 index bd57a22fb1e..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/eb70814d6355a4498b8f301ba8dbc34f895a9947-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/ebdc17efe343e412634dca57cecd5a0e1ce1c1c7-5 b/tests/fuzzers/txfetcher/corpus/ebdc17efe343e412634dca57cecd5a0e1ce1c1c7-5 deleted file mode 100644 index aaa3f695ab3..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/ebdc17efe343e412634dca57cecd5a0e1ce1c1c7-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/ec0a25eba8966b8f628d821b3cfbdf2dfd4bbb4c-3 b/tests/fuzzers/txfetcher/corpus/ec0a25eba8966b8f628d821b3cfbdf2dfd4bbb4c-3 deleted file mode 100644 index 65cf0df8013..00000000000 --- a/tests/fuzzers/txfetcher/corpus/ec0a25eba8966b8f628d821b3cfbdf2dfd4bbb4c-3 +++ /dev/null @@ -1,13 +0,0 @@ -¸&^£áo‡È—-----BEGIN RSA TESTING KEY----- -MIICXgIBAAKBgQDuLnQAI3mDgey3VBzWnB2L39JUU4txjeVE6myuDqkM/uGlfjb9 -SjY1bIw4iA5sBBZzHi3z0h1YV8PuxEbi4nW91IJm2gsvvZhIrHS3l6afab4pZB -l2+XsDulrKBxKKtD1rGxlG4Ljncdabn9vLZad2bSysqz/qTAUStvqJQIDAQAB -AoGAGRzwwir7XvBOAy5tM/uV6e+Zf6anZzus1s1K1ClbjbE6HXbnWWF/wbZGOpet -3Zm4vD6MXc7jpTLryzQIvVdfQbRc6+MUVeLKwZatTXtZru+Jk7hx0nTPy8Jcb -uJqFk541aEw+mMogY/xEcfbW6IOkp+4xqjlFLBEDytgbIECQQDvH/E6nk+hg4 -qzzVtxxr397vWrjrIgPbJpQvBsafG7b0dA4AFjwVbFLcj2pIMPQroozvjg1AkEA/v13/5M47K9vCxmb8QeD/aydfsgS5TeuNi8DoUBEmiSJwmaXY -fFUtxv7XvjwjN5B30pNEbc6Iuyt7y4MQJBAIt21su4bjeLKH8Q+ph2 -fQtuUE9txblTu14q3N7gHRZB4ZMhFYyDy8CKrN2cPg/Fvyt0Xlp/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+AYiZ6PYj013sovGKFYqVXVlxtIX -qyUBnu3X9s8ZfjZO7BAkl4R5Yl6cGhaJQYZHOe3JEMhVFaFf9Oes0UUothgiDktdQxdNLj7+5CWA== ------END RSASQ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/eebe3b76aeba6deed965d17d2b024f7eae1a43f1-5 b/tests/fuzzers/txfetcher/corpus/eebe3b76aeba6deed965d17d2b024f7eae1a43f1-5 deleted file mode 100644 index 20d62e15b32..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/eebe3b76aeba6deed965d17d2b024f7eae1a43f1-5 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/ef8741a9faf030794d98ff113f556c68a24719a5-6 b/tests/fuzzers/txfetcher/corpus/ef8741a9faf030794d98ff113f556c68a24719a5-6 deleted file mode 100644 index 09fcd86d77c..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/ef8741a9faf030794d98ff113f556c68a24719a5-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/efb7410d02418befeba25a43d676cc6124129125-4 b/tests/fuzzers/txfetcher/corpus/efb7410d02418befeba25a43d676cc6124129125-4 deleted file mode 100644 index 2191a7324a1..00000000000 --- a/tests/fuzzers/txfetcher/corpus/efb7410d02418befeba25a43d676cc6124129125-4 +++ /dev/null @@ -1 +0,0 @@ -88242871'392752200424452601091531672177074144720616417147514758635765020556616¿ \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/f6f97d781a5a749903790e07db8619866cb7c3a1-6 b/tests/fuzzers/txfetcher/corpus/f6f97d781a5a749903790e07db8619866cb7c3a1-6 deleted file mode 100644 index 219a8d3682f..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/f6f97d781a5a749903790e07db8619866cb7c3a1-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/f7a3cd00fa0e57742e7dbbb8283dcaea067eaf7b-5 b/tests/fuzzers/txfetcher/corpus/f7a3cd00fa0e57742e7dbbb8283dcaea067eaf7b-5 deleted file mode 100644 index f01ccd89efa..00000000000 --- a/tests/fuzzers/txfetcher/corpus/f7a3cd00fa0e57742e7dbbb8283dcaea067eaf7b-5 +++ /dev/null @@ -1,2 +0,0 @@ -Xyt0Xl/DoCzjA0CQQDU -y2ptGsuSmgUtWj3NM9xuwYPm+Z/F84K6+ARYi \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/f94d60a6c556ce485ab60088291760b8be25776c-6 b/tests/fuzzers/txfetcher/corpus/f94d60a6c556ce485ab60088291760b8be25776c-6 deleted file mode 100644 index 58d841ff036..00000000000 --- a/tests/fuzzers/txfetcher/corpus/f94d60a6c556ce485ab60088291760b8be25776c-6 +++ /dev/null @@ -1,2 +0,0 @@ -HZB4cQZde3JMNRcVFMO8dDFo -f9OeosiDdQQl \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/f9e627b2cb82ffa1ea5e0c6d7f2802f3000b18a8-6 b/tests/fuzzers/txfetcher/corpus/f9e627b2cb82ffa1ea5e0c6d7f2802f3000b18a8-6 deleted file mode 100644 index b5dfecc1e9d..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/f9e627b2cb82ffa1ea5e0c6d7f2802f3000b18a8-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/corpus/fb3775aa24e5667e658920c05ba4b7b19ff256fb-5 b/tests/fuzzers/txfetcher/corpus/fb3775aa24e5667e658920c05ba4b7b19ff256fb-5 deleted file mode 100644 index 6f4927d822d..00000000000 --- a/tests/fuzzers/txfetcher/corpus/fb3775aa24e5667e658920c05ba4b7b19ff256fb-5 +++ /dev/null @@ -1 +0,0 @@ -HZB4c2cPclieoverpGsumgUtWj3NMYPZ/F8tá5YlNR8dDFoiDdQQl \ No newline at end of file diff --git a/tests/fuzzers/txfetcher/corpus/fd6386548e119a50db96b2fa406e54924c45a2d5-6 b/tests/fuzzers/txfetcher/corpus/fd6386548e119a50db96b2fa406e54924c45a2d5-6 deleted file mode 100644 index 6fff60edd4f..00000000000 Binary files a/tests/fuzzers/txfetcher/corpus/fd6386548e119a50db96b2fa406e54924c45a2d5-6 and /dev/null differ diff --git a/tests/fuzzers/txfetcher/txfetcher_fuzzer.go b/tests/fuzzers/txfetcher/txfetcher_fuzzer.go deleted file mode 100644 index e4ab68ed75b..00000000000 --- a/tests/fuzzers/txfetcher/txfetcher_fuzzer.go +++ /dev/null @@ -1,207 +0,0 @@ -// Copyright 2020 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package txfetcher - -import ( - "bytes" - "fmt" - "math/rand" - "time" - - "github.com/holiman/uint256" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/mclock" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth/fetcher" -) - -var ( - peers []string - txs []types.Transaction -) - -func init() { - // Random is nice, but we need it deterministic - rand := rand.New(rand.NewSource(0x3a29)) - - peers = make([]string, 10) - for i := 0; i < len(peers); i++ { - peers[i] = fmt.Sprintf("Peer #%d", i) - } - txs = make([]types.Transaction, 65536) // We need to bump enough to hit all the limits - for i := 0; i < len(txs); i++ { - txs[i] = types.NewTransaction(rand.Uint64(), common.Address{byte(rand.Intn(256))}, new(uint256.Int), 0, new(uint256.Int), nil) - } -} - -func Fuzz(input []byte) int { - // Don't generate insanely large test cases, not much value in them - if len(input) > 16*1024 { - return 0 - } - verbose := false - r := bytes.NewReader(input) - - // Reduce the problem space for certain fuzz runs. Small tx space is better - // for testing clashes and in general the fetcher, but we should still run - // some tests with large spaces to hit potential issues on limits. - limit, err := r.ReadByte() - if err != nil { - return 0 - } - switch limit % 4 { - case 0: - txs = txs[:4] - case 1: - txs = txs[:256] - case 2: - txs = txs[:4096] - case 3: - // Full run - } - // Create a fetcher and hook into it's simulated fields - clock := new(mclock.Simulated) - rand := rand.New(rand.NewSource(0x3a29)) // Same used in package tests!!! - - f := fetcher.NewTxFetcherForTests( - func(common.Hash) bool { return false }, - func(txs []types.Transaction) []error { - return make([]error, len(txs)) - }, - func(string, []common.Hash) error { return nil }, - clock, rand, - ) - f.Start() - defer f.Stop() - - // Try to throw random junk at the fetcher - for { - // Read the next command and abort if we're done - cmd, err := r.ReadByte() - if err != nil { - return 0 - } - switch cmd % 4 { - case 0: - // Notify a new set of transactions: - // Byte 1: Peer index to announce with - // Byte 2: Number of hashes to announce - // Byte 3-4, 5-6, etc: Transaction indices (2 byte) to announce - peerIdx, err := r.ReadByte() - if err != nil { - return 0 - } - peer := peers[int(peerIdx)%len(peers)] - - announceCnt, err := r.ReadByte() - if err != nil { - return 0 - } - announce := int(announceCnt) % (2 * len(txs)) // No point in generating too many duplicates - - var ( - announceIdxs = make([]int, announce) - announces = make([]common.Hash, announce) - ) - for i := 0; i < len(announces); i++ { - annBuf := make([]byte, 2) - if n, err := r.Read(annBuf); err != nil || n != 2 { - return 0 - } - announceIdxs[i] = (int(annBuf[0])*256 + int(annBuf[1])) % len(txs) - announces[i] = txs[announceIdxs[i]].Hash() - } - if verbose { - fmt.Println("Notify", peer, announceIdxs) - } - if err := f.Notify(peer, announces); err != nil { - panic(err) - } - - case 1: - // Deliver a new set of transactions: - // Byte 1: Peer index to announce with - // Byte 2: Number of hashes to announce - // Byte 3-4, 5-6, etc: Transaction indices (2 byte) to announce - peerIdx, err := r.ReadByte() - if err != nil { - return 0 - } - peer := peers[int(peerIdx)%len(peers)] - - deliverCnt, err := r.ReadByte() - if err != nil { - return 0 - } - deliver := int(deliverCnt) % (2 * len(txs)) // No point in generating too many duplicates - - var ( - deliverIdxs = make([]int, deliver) - deliveries = make([]types.Transaction, deliver) - ) - for i := 0; i < len(deliveries); i++ { - deliverBuf := make([]byte, 2) - n := 0 - if n, err = r.Read(deliverBuf); err != nil || n != 2 { - return 0 - } - deliverIdxs[i] = (int(deliverBuf[0])*256 + int(deliverBuf[1])) % len(txs) - deliveries[i] = txs[deliverIdxs[i]] - } - directFlag, err := r.ReadByte() - if err != nil { - return 0 - } - direct := (directFlag % 2) == 0 - if verbose { - fmt.Println("Enqueue", peer, deliverIdxs, direct) - } - if err := f.Enqueue(peer, deliveries, direct); err != nil { - panic(err) - } - - case 2: - // Drop a peer: - // Byte 1: Peer index to drop - peerIdx, err := r.ReadByte() - if err != nil { - return 0 - } - peer := peers[int(peerIdx)%len(peers)] - if verbose { - fmt.Println("Drop", peer) - } - if err := f.Drop(peer); err != nil { - panic(err) - } - - case 3: - // Move the simulated clock forward - // Byte 1: 100ms increment to move forward - tickCnt, err := r.ReadByte() - if err != nil { - return 0 - } - tick := time.Duration(tickCnt) * 100 * time.Millisecond - if verbose { - fmt.Println("Sleep", tick) - } - clock.Run(tick) - } - } -} diff --git a/tests/gen_difficultytest.go b/tests/gen_difficultytest.go index 9750e8fb28c..33e3a41bba2 100644 --- a/tests/gen_difficultytest.go +++ b/tests/gen_difficultytest.go @@ -6,7 +6,6 @@ import ( "encoding/json" "math/big" - "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/math" ) @@ -17,7 +16,7 @@ func (d DifficultyTest) MarshalJSON() ([]byte, error) { type DifficultyTest struct { ParentTimestamp math.HexOrDecimal64 `json:"parentTimestamp"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` - UncleHash common.Hash `json:"parentUncles"` + ParentUncles math.HexOrDecimal64 `json:"parentUncles"` CurrentTimestamp math.HexOrDecimal64 `json:"currentTimestamp"` CurrentBlockNumber math.HexOrDecimal64 `json:"currentBlockNumber"` CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` @@ -25,7 +24,7 @@ func (d DifficultyTest) MarshalJSON() ([]byte, error) { var enc DifficultyTest enc.ParentTimestamp = math.HexOrDecimal64(d.ParentTimestamp) enc.ParentDifficulty = (*math.HexOrDecimal256)(d.ParentDifficulty) - enc.UncleHash = d.UncleHash + enc.ParentUncles = math.HexOrDecimal64(d.ParentUncles) enc.CurrentTimestamp = math.HexOrDecimal64(d.CurrentTimestamp) enc.CurrentBlockNumber = math.HexOrDecimal64(d.CurrentBlockNumber) enc.CurrentDifficulty = (*math.HexOrDecimal256)(d.CurrentDifficulty) @@ -37,7 +36,7 @@ func (d *DifficultyTest) UnmarshalJSON(input []byte) error { type DifficultyTest struct { ParentTimestamp *math.HexOrDecimal64 `json:"parentTimestamp"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` - UncleHash *common.Hash `json:"parentUncles"` + ParentUncles *math.HexOrDecimal64 `json:"parentUncles"` CurrentTimestamp *math.HexOrDecimal64 `json:"currentTimestamp"` CurrentBlockNumber *math.HexOrDecimal64 `json:"currentBlockNumber"` CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` @@ -52,8 +51,8 @@ func (d *DifficultyTest) UnmarshalJSON(input []byte) error { if dec.ParentDifficulty != nil { d.ParentDifficulty = (*big.Int)(dec.ParentDifficulty) } - if dec.UncleHash != nil { - d.UncleHash = *dec.UncleHash + if dec.ParentUncles != nil { + d.ParentUncles = uint64(*dec.ParentUncles) } if dec.CurrentTimestamp != nil { d.CurrentTimestamp = uint64(*dec.CurrentTimestamp) diff --git a/tests/gen_sttransaction.go b/tests/gen_sttransaction.go deleted file mode 100644 index 40e4ecb70a2..00000000000 --- a/tests/gen_sttransaction.go +++ /dev/null @@ -1,99 +0,0 @@ -package tests - -import ( - "encoding/json" - "math/big" - - "github.com/ledgerwatch/erigon/common/hexutil" - "github.com/ledgerwatch/erigon/common/math" - "github.com/ledgerwatch/erigon/core/types" -) - -var _ = (*stTransactionMarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (s stTransaction) MarshalJSON() ([]byte, error) { - type stTransaction struct { - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - MaxFeePerGas *math.HexOrDecimal256 `json:"maxFeePerGas"` - MaxPriorityFeePerGas *math.HexOrDecimal256 `json:"maxPriorityFeePerGas"` - Nonce math.HexOrDecimal64 `json:"nonce"` - To string `json:"to"` - Data []string `json:"data"` - AccessLists []*types.AccessList `json:"accessLists,omitempty"` - GasLimit []math.HexOrDecimal64 `json:"gasLimit"` - Value []string `json:"value"` - PrivateKey hexutil.Bytes `json:"secretKey"` - } - var enc stTransaction - enc.GasPrice = (*math.HexOrDecimal256)(s.GasPrice) - enc.MaxFeePerGas = (*math.HexOrDecimal256)(s.MaxFeePerGas) - enc.MaxPriorityFeePerGas = (*math.HexOrDecimal256)(s.MaxPriorityFeePerGas) - enc.Nonce = math.HexOrDecimal64(s.Nonce) - enc.To = s.To - enc.Data = s.Data - enc.AccessLists = s.AccessLists - if s.GasLimit != nil { - enc.GasLimit = make([]math.HexOrDecimal64, len(s.GasLimit)) - for k, v := range s.GasLimit { - enc.GasLimit[k] = math.HexOrDecimal64(v) - } - } - enc.Value = s.Value - enc.PrivateKey = s.PrivateKey - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (s *stTransaction) UnmarshalJSON(input []byte) error { - type stTransaction struct { - GasPrice *math.HexOrDecimal256 `json:"gasPrice"` - MaxFeePerGas *math.HexOrDecimal256 `json:"maxFeePerGas"` - MaxPriorityFeePerGas *math.HexOrDecimal256 `json:"maxPriorityFeePerGas"` - Nonce *math.HexOrDecimal64 `json:"nonce"` - To *string `json:"to"` - Data []string `json:"data"` - AccessLists []*types.AccessList `json:"accessLists,omitempty"` - GasLimit []math.HexOrDecimal64 `json:"gasLimit"` - Value []string `json:"value"` - PrivateKey *hexutil.Bytes `json:"secretKey"` - } - var dec stTransaction - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.GasPrice != nil { - s.GasPrice = (*big.Int)(dec.GasPrice) - } - if dec.MaxFeePerGas != nil { - s.MaxFeePerGas = (*big.Int)(dec.MaxFeePerGas) - } - if dec.MaxPriorityFeePerGas != nil { - s.MaxPriorityFeePerGas = (*big.Int)(dec.MaxPriorityFeePerGas) - } - if dec.Nonce != nil { - s.Nonce = uint64(*dec.Nonce) - } - if dec.To != nil { - s.To = *dec.To - } - if dec.Data != nil { - s.Data = dec.Data - } - if dec.AccessLists != nil { - s.AccessLists = dec.AccessLists - } - if dec.GasLimit != nil { - s.GasLimit = make([]uint64, len(dec.GasLimit)) - for k, v := range dec.GasLimit { - s.GasLimit[k] = uint64(v) - } - } - if dec.Value != nil { - s.Value = dec.Value - } - if dec.PrivateKey != nil { - s.PrivateKey = *dec.PrivateKey - } - return nil -} diff --git a/tests/gen_vmexec.go b/tests/gen_vmexec.go deleted file mode 100644 index 80d73a9e940..00000000000 --- a/tests/gen_vmexec.go +++ /dev/null @@ -1,90 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "errors" - "math/big" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/hexutil" - "github.com/ledgerwatch/erigon/common/math" -) - -var _ = (*vmExecMarshaling)(nil) - -// MarshalJSON marshals as JSON. -func (v vmExec) MarshalJSON() ([]byte, error) { - type vmExec struct { - Address common.UnprefixedAddress `json:"address" gencodec:"required"` - Caller common.UnprefixedAddress `json:"caller" gencodec:"required"` - Origin common.UnprefixedAddress `json:"origin" gencodec:"required"` - Code hexutil.Bytes `json:"code" gencodec:"required"` - Data hexutil.Bytes `json:"data" gencodec:"required"` - Value *math.HexOrDecimal256 `json:"value" gencodec:"required"` - GasLimit math.HexOrDecimal64 `json:"gas" gencodec:"required"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice" gencodec:"required"` - } - var enc vmExec - enc.Address = common.UnprefixedAddress(v.Address) - enc.Caller = common.UnprefixedAddress(v.Caller) - enc.Origin = common.UnprefixedAddress(v.Origin) - enc.Code = v.Code - enc.Data = v.Data - enc.Value = (*math.HexOrDecimal256)(v.Value) - enc.GasLimit = math.HexOrDecimal64(v.GasLimit) - enc.GasPrice = (*math.HexOrDecimal256)(v.GasPrice) - return json.Marshal(&enc) -} - -// UnmarshalJSON unmarshals from JSON. -func (v *vmExec) UnmarshalJSON(input []byte) error { - type vmExec struct { - Address *common.UnprefixedAddress `json:"address" gencodec:"required"` - Caller *common.UnprefixedAddress `json:"caller" gencodec:"required"` - Origin *common.UnprefixedAddress `json:"origin" gencodec:"required"` - Code *hexutil.Bytes `json:"code" gencodec:"required"` - Data *hexutil.Bytes `json:"data" gencodec:"required"` - Value *math.HexOrDecimal256 `json:"value" gencodec:"required"` - GasLimit *math.HexOrDecimal64 `json:"gas" gencodec:"required"` - GasPrice *math.HexOrDecimal256 `json:"gasPrice" gencodec:"required"` - } - var dec vmExec - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Address == nil { - return errors.New("missing required field 'address' for vmExec") - } - v.Address = common.Address(*dec.Address) - if dec.Caller == nil { - return errors.New("missing required field 'caller' for vmExec") - } - v.Caller = common.Address(*dec.Caller) - if dec.Origin == nil { - return errors.New("missing required field 'origin' for vmExec") - } - v.Origin = common.Address(*dec.Origin) - if dec.Code == nil { - return errors.New("missing required field 'code' for vmExec") - } - v.Code = *dec.Code - if dec.Data == nil { - return errors.New("missing required field 'data' for vmExec") - } - v.Data = *dec.Data - if dec.Value == nil { - return errors.New("missing required field 'value' for vmExec") - } - v.Value = (*big.Int)(dec.Value) - if dec.GasLimit == nil { - return errors.New("missing required field 'gas' for vmExec") - } - v.GasLimit = uint64(*dec.GasLimit) - if dec.GasPrice == nil { - return errors.New("missing required field 'gasPrice' for vmExec") - } - v.GasPrice = (*big.Int)(dec.GasPrice) - return nil -} diff --git a/tests/init.go b/tests/init.go index e15a1f05b15..b9c54386bc2 100644 --- a/tests/init.go +++ b/tests/init.go @@ -34,68 +34,63 @@ var Forks = map[string]*params.ChainConfig{ HomesteadBlock: big.NewInt(0), }, "EIP150": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), }, "EIP158": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), }, "Byzantium": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - DAOForkBlock: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), }, "Constantinople": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - DAOForkBlock: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(10000000), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(10000000), }, "ConstantinopleFix": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - DAOForkBlock: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), }, "Istanbul": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - DAOForkBlock: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), }, "FrontierToHomesteadAt5": { ChainID: big.NewInt(1), HomesteadBlock: big.NewInt(5), }, "HomesteadToEIP150At5": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(5), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(5), }, "HomesteadToDaoAt5": { ChainID: big.NewInt(1), @@ -104,82 +99,101 @@ var Forks = map[string]*params.ChainConfig{ DAOForkSupport: true, }, "EIP158ToByzantiumAt5": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(5), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(5), }, "ByzantiumToConstantinopleAt5": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(5), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(5), }, "ByzantiumToConstantinopleFixAt5": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(5), - PetersburgBlock: big.NewInt(5), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(5), + PetersburgBlock: big.NewInt(5), }, "ConstantinopleFixToIstanbulAt5": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(5), - }, - // This specification is subject to change, but is for now identical to YOLOv3 - // for cross-client testing purposes + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(5), + }, + "EIP2384": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + }, "Berlin": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), }, "BerlinToLondonAt5": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: big.NewInt(5), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(5), }, "London": { - ChainID: big.NewInt(1), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - BerlinBlock: big.NewInt(0), - LondonBlock: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + }, + "ArrowGlacier": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + TangerineWhistleBlock: big.NewInt(0), + SpuriousDragonBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + MuirGlacierBlock: big.NewInt(0), + BerlinBlock: big.NewInt(0), + LondonBlock: big.NewInt(0), + ArrowGlacierBlock: big.NewInt(0), }, } diff --git a/tests/init_test.go b/tests/init_test.go index 45bfe1ba2ad..c5667ea4b6d 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -14,45 +14,44 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package tests import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "path/filepath" "reflect" "regexp" "runtime" - "sort" "strings" "testing" "github.com/ledgerwatch/erigon/params" + "golang.org/x/exp/slices" ) var ( baseDir = filepath.Join(".", "testdata") blockTestDir = filepath.Join(baseDir, "BlockchainTests") stateTestDir = filepath.Join(baseDir, "GeneralStateTests") - legacyStateTestDir = filepath.Join(baseDir, "LegacyTests", "Constantinople", "GeneralStateTests") - vmTestDir = filepath.Join(baseDir, "LegacyTests", "Constantinople", "VMTests") transactionTestDir = filepath.Join(baseDir, "TransactionTests") rlpTestDir = filepath.Join(baseDir, "RLPTests") - difficultyTestDir = filepath.Join(baseDir, "BasicTests") + difficultyTestDir = filepath.Join(baseDir, "DifficultyTests") ) func readJSON(reader io.Reader, value interface{}) error { - data, err := ioutil.ReadAll(reader) + data, err := io.ReadAll(reader) if err != nil { - return fmt.Errorf("error reading JSON file: %v", err) + return fmt.Errorf("error reading JSON file: %w", err) } if err = json.Unmarshal(data, &value); err != nil { if syntaxerr, ok := err.(*json.SyntaxError); ok { line := findLine(data, syntaxerr.Offset) - return fmt.Errorf("JSON syntax error at line %v: %v", line, err) + return fmt.Errorf("JSON syntax error at line %v: %w", line, err) } return err } @@ -269,7 +268,7 @@ func sortedMapKeys(m reflect.Value) []string { for i, k := range m.MapKeys() { keys[i] = k.String() } - sort.Strings(keys) + slices.Sort(keys) return keys } diff --git a/tests/rlp_test.go b/tests/rlp_test.go index 79a1683eb23..ec0ebe08d0d 100644 --- a/tests/rlp_test.go +++ b/tests/rlp_test.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package tests import ( diff --git a/tests/rlp_test_util.go b/tests/rlp_test_util.go index 5fc99c63641..553de0f8506 100644 --- a/tests/rlp_test_util.go +++ b/tests/rlp_test_util.go @@ -71,7 +71,7 @@ func (t *RLPTest) Run() error { in := translateJSON(t.In) b, err := rlp.EncodeToBytes(in) if err != nil { - return fmt.Errorf("encode failed: %v", err) + return fmt.Errorf("encode failed: %w", err) } if !bytes.Equal(b, outb) { return fmt.Errorf("encode produced %x, want %x", b, outb) @@ -85,7 +85,7 @@ func checkDecodeInterface(b []byte, isValid bool) error { err := rlp.DecodeBytes(b, new(interface{})) switch { case isValid && err != nil: - return fmt.Errorf("decoding failed: %v", err) + return fmt.Errorf("decoding failed: %w", err) case !isValid && err == nil: return fmt.Errorf("decoding of invalid value succeeded") } diff --git a/tests/state_test.go b/tests/state_test.go index 949f6d30c01..955f1714a70 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package tests import ( @@ -27,30 +29,22 @@ import ( "github.com/ledgerwatch/erigon-lib/kv/memdb" "github.com/ledgerwatch/erigon/core/vm" + "github.com/ledgerwatch/log/v3" ) func TestState(t *testing.T) { + defer log.Root().SetHandler(log.Root().GetHandler()) + log.Root().SetHandler(log.LvlFilterHandler(log.LvlError, log.StderrHandler)) if runtime.GOOS == "windows" { t.Skip("fix me on win please") // it's too slow on win, need generally improve speed of this tests } t.Parallel() st := new(testMatcher) - // Long tests: - st.slow(`^stAttackTest/ContractCreationSpam`) - st.slow(`^stBadOpcode/badOpcodes`) - st.slow(`^stPreCompiledContracts/modexp`) - st.slow(`^stQuadraticComplexityTest/`) - st.slow(`^stStaticCall/static_Call50000`) - st.slow(`^stStaticCall/static_Return50000`) - st.slow(`^stSystemOperationsTest/CallRecursiveBomb`) - st.slow(`^stTransactionTest/Opcodes_TransactionInit`) // Very time consuming st.skipLoad(`^stTimeConsuming/`) - - // Uses 1GB RAM per tested fork - st.skipLoad(`^stStaticCall/static_Call1MB`) + st.skipLoad(`.*vmPerformance/loop.*`) // Broken tests: st.skipLoad(`^stCreate2/create2collisionStorage.json`) @@ -58,50 +52,40 @@ func TestState(t *testing.T) { st.skipLoad(`^stSStoreTest/InitCollision.json`) st.skipLoad(`^stEIP1559/typeTwoBerlin.json`) - // Expected failures: - //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Byzantium/0`, "bug in test") - //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Byzantium/3`, "bug in test") - //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Constantinople/0`, "bug in test") - //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Constantinople/3`, "bug in test") - //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/ConstantinopleFix/0`, "bug in test") - //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/ConstantinopleFix/3`, "bug in test") + // value exceeding 256 bit is not supported + st.skipLoad(`^stTransactionTest/ValueOverflow.json`) - // For Istanbul, older tests were moved into LegacyTests - for _, dir := range []string{ - stateTestDir, - legacyStateTestDir, - } { - st.walk(t, dir, func(t *testing.T, name string, test *StateTest) { - db := memdb.NewTestDB(t) - for _, subtest := range test.Subtests() { - subtest := subtest - key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) - t.Run(key, func(t *testing.T) { - withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { - config, ok := Forks[subtest.Fork] - if !ok { - return UnsupportedForkError{subtest.Fork} - } - rules := config.Rules(1) - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - _, err = test.Run(rules, tx, subtest, vmconfig) - tx.Rollback() - return st.checkFailure(t, err) - }) + st.walk(t, stateTestDir, func(t *testing.T, name string, test *StateTest) { + db := memdb.NewTestDB(t) + for _, subtest := range test.Subtests() { + subtest := subtest + key := fmt.Sprintf("%s/%d", subtest.Fork, subtest.Index) + t.Run(key, func(t *testing.T) { + withTrace(t, func(vmconfig vm.Config) error { + config, ok := Forks[subtest.Fork] + if !ok { + return UnsupportedForkError{subtest.Fork} + } + rules := config.Rules(1) + tx, err := db.BeginRw(context.Background()) + if err != nil { + t.Fatal(err) + } + defer tx.Rollback() + _, err = test.Run(rules, tx, subtest, vmconfig) + tx.Rollback() + if err != nil && len(test.json.Post[subtest.Fork][subtest.Index].ExpectException) > 0 { + // Ignore expected errors + return nil + } + return st.checkFailure(t, err) }) - } - }) - } + }) + } + }) } -// Transactions with gasLimit above this value will not get a VM trace on failure. -const traceErrorLimit = 400000 - -func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { +func withTrace(t *testing.T, test func(vm.Config) error) { // Use config from command line arguments. config := vm.Config{} err := test(config) @@ -111,10 +95,6 @@ func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { // Test failed, re-run with tracing enabled. t.Error(err) - if gasLimit > traceErrorLimit { - t.Log("gas limit too high for EVM trace") - return - } buf := new(bytes.Buffer) w := bufio.NewWriter(buf) tracer := vm.NewJSONLogger(&vm.LogConfig{DisableMemory: true}, w) diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 750002e79d2..0200753e588 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -17,7 +17,6 @@ package tests import ( - "encoding/hex" "encoding/json" "fmt" "math/big" @@ -60,19 +59,15 @@ func (t *StateTest) UnmarshalJSON(in []byte) error { type stJSON struct { Env stEnv `json:"env"` Pre core.GenesisAlloc `json:"pre"` - Tx stTransaction `json:"transaction"` Out hexutil.Bytes `json:"out"` Post map[string][]stPostState `json:"post"` } type stPostState struct { - Root common.UnprefixedHash `json:"hash"` - Logs common.UnprefixedHash `json:"logs"` - Indexes struct { - Data int `json:"data"` - Gas int `json:"gas"` - Value int `json:"value"` - } + Root common.Hash `json:"hash"` + Logs common.Hash `json:"logs"` + Tx hexutil.Bytes `json:"txbytes"` + ExpectException string `json:"expectException"` } //go:generate gencodec -type stEnv -field-override stEnvMarshaling -out gen_stenv.go @@ -83,7 +78,7 @@ type stEnv struct { GasLimit uint64 `json:"currentGasLimit" gencodec:"required"` Number uint64 `json:"currentNumber" gencodec:"required"` Timestamp uint64 `json:"currentTimestamp" gencodec:"required"` - BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"` + BaseFee *big.Int `json:"currentBaseFee" gencodec:"optional"` } type stEnvMarshaling struct { @@ -95,30 +90,6 @@ type stEnvMarshaling struct { BaseFee *math.HexOrDecimal256 } -//go:generate gencodec -type stTransaction -field-override stTransactionMarshaling -out gen_sttransaction.go - -type stTransaction struct { - GasPrice *big.Int `json:"gasPrice"` - MaxFeePerGas *big.Int `json:"maxFeePerGas"` - MaxPriorityFeePerGas *big.Int `json:"maxPriorityFeePerGas"` - Nonce uint64 `json:"nonce"` - To string `json:"to"` - Data []string `json:"data"` - AccessLists []*types.AccessList `json:"accessLists,omitempty"` - GasLimit []uint64 `json:"gasLimit"` - Value []string `json:"value"` - PrivateKey []byte `json:"secretKey"` -} - -type stTransactionMarshaling struct { - GasPrice *math.HexOrDecimal256 - MaxFeePerGas *math.HexOrDecimal256 - MaxPriorityFeePerGas *math.HexOrDecimal256 - Nonce math.HexOrDecimal64 - GasLimit []math.HexOrDecimal64 - PrivateKey hexutil.Bytes -} - // GetChainConfig takes a fork definition and returns a chain config. // The fork definition can be // - a plain forkname, e.g. `Byzantium`, @@ -157,7 +128,7 @@ func (t *StateTest) Subtests() []StateSubtest { } // Run executes a specific subtest and verifies the post-state and logs -func (t *StateTest) Run(rules params.Rules, tx kv.RwTx, subtest StateSubtest, vmconfig vm.Config) (*state.IntraBlockState, error) { +func (t *StateTest) Run(rules *params.Rules, tx kv.RwTx, subtest StateSubtest, vmconfig vm.Config) (*state.IntraBlockState, error) { state, root, err := t.RunNoVerify(rules, tx, subtest, vmconfig) if err != nil { return state, err @@ -175,7 +146,7 @@ func (t *StateTest) Run(rules params.Rules, tx kv.RwTx, subtest StateSubtest, vm } // RunNoVerify runs a specific subtest and returns the statedb and post-state root -func (t *StateTest) RunNoVerify(rules params.Rules, tx kv.RwTx, subtest StateSubtest, vmconfig vm.Config) (*state.IntraBlockState, common.Hash, error) { +func (t *StateTest) RunNoVerify(rules *params.Rules, tx kv.RwTx, subtest StateSubtest, vmconfig vm.Config) (*state.IntraBlockState, common.Hash, error) { config, eips, err := GetChainConfig(subtest.Fork) if err != nil { return nil, common.Hash{}, UnsupportedForkError{subtest.Fork} @@ -186,10 +157,10 @@ func (t *StateTest) RunNoVerify(rules params.Rules, tx kv.RwTx, subtest StateSub return nil, common.Hash{}, UnsupportedForkError{subtest.Fork} } - readBlockNr := block.Number().Uint64() + readBlockNr := block.NumberU64() writeBlockNr := readBlockNr + 1 - _, err = MakePreState(params.Rules{}, tx, t.json.Pre, readBlockNr) + _, err = MakePreState(¶ms.Rules{}, tx, t.json.Pre, readBlockNr) if err != nil { return nil, common.Hash{}, UnsupportedForkError{subtest.Fork} } @@ -206,15 +177,19 @@ func (t *StateTest) RunNoVerify(rules params.Rules, tx kv.RwTx, subtest StateSub } } post := t.json.Post[subtest.Fork][subtest.Index] - msg, err := t.json.Tx.toMessage(post, baseFee) + txn, err := types.UnmarshalTransactionFromBinary(post.Tx) + if err != nil { + return nil, common.Hash{}, err + } + msg, err := txn.AsMessage(*types.MakeSigner(config, 0), baseFee, config.Rules(0)) if err != nil { return nil, common.Hash{}, err } // Prepare the EVM. txContext := core.NewEVMTxContext(msg) - checkTEVM := func(common.Hash) (bool, error) { return false, nil } - context := core.NewEVMBlockContext(block.Header(), nil, nil, &t.json.Env.Coinbase, checkTEVM) + contractHasTEVM := func(common.Hash) (bool, error) { return false, nil } + context := core.NewEVMBlockContext(block.Header(), nil, nil, &t.json.Env.Coinbase, contractHasTEVM) context.GetHash = vmTestBlockHash if baseFee != nil { context.BaseFee = new(uint256.Int) @@ -230,17 +205,10 @@ func (t *StateTest) RunNoVerify(rules params.Rules, tx kv.RwTx, subtest StateSub statedb.RevertToSnapshot(snapshot) } - // And _now_ get the state root - // Add 0-value mining reward. This only makes a difference in the cases - // where - // - the coinbase suicided, or - // - there are only 'bad' transactions, which aren't executed. In those cases, - // the coinbase gets no txfee, so isn't created, and thus needs to be touched - statedb.AddBalance(block.Coinbase(), new(uint256.Int)) - if err = statedb.FinalizeTx(evm.ChainRules, w); err != nil { + if err = statedb.FinalizeTx(evm.ChainRules(), w); err != nil { return nil, common.Hash{}, err } - if err = statedb.CommitBlock(evm.ChainRules, w); err != nil { + if err = statedb.CommitBlock(evm.ChainRules(), w); err != nil { return nil, common.Hash{}, err } // Generate hashed state @@ -285,17 +253,13 @@ func (t *StateTest) RunNoVerify(rules params.Rules, tx kv.RwTx, subtest StateSub root, err := trie.CalcRoot("", tx) if err != nil { - return nil, common.Hash{}, fmt.Errorf("error calculating state root: %v", err) + return nil, common.Hash{}, fmt.Errorf("error calculating state root: %w", err) } return statedb, root, nil } -func (t *StateTest) gasLimit(subtest StateSubtest) uint64 { - return t.json.Tx.GasLimit[t.json.Post[subtest.Fork][subtest.Index].Indexes.Gas] -} - -func MakePreState(rules params.Rules, tx kv.RwTx, accounts core.GenesisAlloc, blockNr uint64) (*state.IntraBlockState, error) { +func MakePreState(rules *params.Rules, tx kv.RwTx, accounts core.GenesisAlloc, blockNr uint64) (*state.IntraBlockState, error) { r := state.NewPlainStateReader(tx) statedb := state.New(r) for addr, a := range accounts { @@ -335,90 +299,6 @@ func (t *StateTest) genesis(config *params.ChainConfig) *core.Genesis { } } -func (tx *stTransaction) toMessage(ps stPostState, baseFee *big.Int) (core.Message, error) { - // Derive sender from private key if present. - var from common.Address - if len(tx.PrivateKey) > 0 { - key, err := crypto.ToECDSA(tx.PrivateKey) - if err != nil { - return nil, fmt.Errorf("invalid private key: %v", err) - } - from = crypto.PubkeyToAddress(key.PublicKey) - } - // Parse recipient if present. - var to *common.Address - if tx.To != "" { - to = new(common.Address) - if err := to.UnmarshalText([]byte(tx.To)); err != nil { - return nil, fmt.Errorf("invalid to address: %v", err) - } - } - - // Get values specific to this post state. - if ps.Indexes.Data > len(tx.Data) { - return nil, fmt.Errorf("tx data index %d out of bounds", ps.Indexes.Data) - } - if ps.Indexes.Value > len(tx.Value) { - return nil, fmt.Errorf("tx value index %d out of bounds", ps.Indexes.Value) - } - if ps.Indexes.Gas > len(tx.GasLimit) { - return nil, fmt.Errorf("tx gas limit index %d out of bounds", ps.Indexes.Gas) - } - dataHex := tx.Data[ps.Indexes.Data] - valueHex := tx.Value[ps.Indexes.Value] - gasLimit := tx.GasLimit[ps.Indexes.Gas] - // Value, Data hex encoding is messy: https://github.com/ethereum/tests/issues/203 - value := new(uint256.Int) - if valueHex != "0x" { - v, ok := math.ParseBig256(valueHex) - if !ok { - return nil, fmt.Errorf("invalid tx value %q", valueHex) - } - value.SetFromBig(v) - } - data, err := hex.DecodeString(strings.TrimPrefix(dataHex, "0x")) - if err != nil { - return nil, fmt.Errorf("invalid tx data %q", dataHex) - } - var accessList types.AccessList - if tx.AccessLists != nil && tx.AccessLists[ps.Indexes.Data] != nil { - accessList = *tx.AccessLists[ps.Indexes.Data] - } - - // If baseFee provided, set gasPrice to effectiveGasPrice. - gasPrice := tx.GasPrice - if baseFee != nil { - if tx.MaxFeePerGas == nil { - tx.MaxFeePerGas = gasPrice - } - if tx.MaxFeePerGas == nil { - tx.MaxFeePerGas = new(big.Int) - } - if tx.MaxPriorityFeePerGas == nil { - tx.MaxPriorityFeePerGas = tx.MaxFeePerGas - } - gasPrice = math.BigMin(new(big.Int).Add(tx.MaxPriorityFeePerGas, baseFee), - tx.MaxFeePerGas) - } - var gasPrice256, maxFee256, maxTip256 *uint256.Int - if gasPrice != nil { - gasPrice256 = new(uint256.Int) - gasPrice256.SetFromBig(gasPrice) - } - if tx.MaxFeePerGas != nil { - maxFee256 = new(uint256.Int) - maxFee256.SetFromBig(tx.MaxFeePerGas) - } - if tx.MaxPriorityFeePerGas != nil { - maxTip256 = new(uint256.Int) - maxTip256.SetFromBig(tx.MaxPriorityFeePerGas) - } - - msg := types.NewMessage(from, to, tx.Nonce, value, gasLimit, gasPrice256, - maxFee256, maxTip256, data, accessList, true) - return msg, nil -} - func rlpHash(x interface{}) (h common.Hash) { hw := sha3.NewLegacyKeccak256() if err := rlp.Encode(hw, x); err != nil { @@ -427,3 +307,7 @@ func rlpHash(x interface{}) (h common.Hash) { hw.Sum(h[:0]) return h } + +func vmTestBlockHash(n uint64) common.Hash { + return common.BytesToHash(crypto.Keccak256([]byte(big.NewInt(int64(n)).String()))) +} diff --git a/tests/statedb_chain_test.go b/tests/statedb_chain_test.go index 287aa1fcddb..a578c46e23f 100644 --- a/tests/statedb_chain_test.go +++ b/tests/statedb_chain_test.go @@ -43,13 +43,12 @@ func TestSelfDestructReceive(t *testing.T) { funds = big.NewInt(1000000000) gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - ByzantiumBlock: new(big.Int), - ConstantinopleBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(0), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + ByzantiumBlock: new(big.Int), + ConstantinopleBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: new(big.Int), }, Alloc: core.GenesisAlloc{ address: {Balance: funds}, diff --git a/tests/statedb_insert_chain_transaction_test.go b/tests/statedb_insert_chain_transaction_test.go index 26ab29f4d78..0d228d5d630 100644 --- a/tests/statedb_insert_chain_transaction_test.go +++ b/tests/statedb_insert_chain_transaction_test.go @@ -716,13 +716,12 @@ func getGenesis(funds ...*big.Int) initialData { transactOpts: transactOpts, genesisSpec: &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP150Block: new(big.Int), - EIP155Block: new(big.Int), - EIP158Block: big.NewInt(1), - ByzantiumBlock: big.NewInt(1), - ConstantinopleBlock: big.NewInt(1), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(1), + ByzantiumBlock: big.NewInt(1), + ConstantinopleBlock: big.NewInt(1), }, Alloc: allocs, }, diff --git a/tests/testdata b/tests/testdata index 5d651381daf..a380655e5ff 160000 --- a/tests/testdata +++ b/tests/testdata @@ -1 +1 @@ -Subproject commit 5d651381daf9d12cc663a7326b3b16d7bb4c1aa0 +Subproject commit a380655e5ffab1a5ea0f4d860224bdb19013f06a diff --git a/tests/transaction_test.go b/tests/transaction_test.go index f4a2d295008..1286ec3f55c 100644 --- a/tests/transaction_test.go +++ b/tests/transaction_test.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +//go:build integration + package tests import ( @@ -26,28 +28,15 @@ func TestTransaction(t *testing.T) { t.Parallel() txt := new(testMatcher) - // These can't be parsed, invalid hex in RLP - txt.skipLoad("^ttWrongRLP/.*") + // We don't allow more than uint64 in gas amount // This is a pseudo-consensus vulnerability, but not in practice // because of the gas limit txt.skipLoad("^ttGasLimit/TransactionWithGasLimitxPriceOverflow.json") - // We _do_ allow more than uint64 in gas price, as opposed to the tests - // This is also not a concern, as long as tx.Cost() uses big.Int for - // calculating the final cozt - txt.skipLoad(".*TransactionWithGasPriceOverflow.*") - - // The nonce is too large for uint64. Not a concern, it means geth won't - // accept transactions at a certain point in the distant future - txt.skipLoad("^ttNonce/TransactionWithHighNonce256.json") - - // The value is larger than uint64, which according to the test is invalid. - // Geth accepts it, which is not a consensus issue since we use big.Int's - // internally to calculate the cost - txt.skipLoad("^ttValue/TransactionWithHighValueOverflow.json") + txt.walk(t, transactionTestDir, func(t *testing.T, name string, test *TransactionTest) { cfg := params.MainnetChainConfig - if err := txt.checkFailure(t, test.Run(cfg)); err != nil { + if err := txt.checkFailure(t, test.Run(cfg.ChainID)); err != nil { t.Error(err) } }) diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go index 2d94d10cb1b..fe28fb88c77 100644 --- a/tests/transaction_test_util.go +++ b/tests/transaction_test_util.go @@ -18,10 +18,14 @@ package tests import ( "bytes" + "errors" "fmt" + "math/big" + "github.com/holiman/uint256" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/hexutil" + "github.com/ledgerwatch/erigon/common/math" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/params" @@ -30,69 +34,101 @@ import ( // TransactionTest checks RLP decoding and sender derivation of transactions. type TransactionTest struct { - RLP hexutil.Bytes `json:"rlp"` - Byzantium ttFork - Constantinople ttFork - Istanbul ttFork - EIP150 ttFork - EIP158 ttFork - Frontier ttFork - Homestead ttFork + RLP hexutil.Bytes `json:"txbytes"` + Forks ttForks `json:"result"` +} + +type ttForks struct { + Berlin ttFork + Byzantium ttFork + Constantinople ttFork + ConstantinopleFix ttFork + EIP150 ttFork + EIP158 ttFork + Frontier ttFork + Homestead ttFork + Istanbul ttFork + London ttFork } type ttFork struct { - Sender common.UnprefixedAddress `json:"sender"` - Hash common.UnprefixedHash `json:"hash"` + Exception string `json:"exception"` + Sender common.Address `json:"sender"` + Hash common.Hash `json:"hash"` + IntrinsicGas *math.HexOrDecimal256 `json:"intrinsicGas"` } -func (tt *TransactionTest) Run(config *params.ChainConfig) error { - validateTx := func(rlpData hexutil.Bytes, signer types.Signer, isHomestead bool, isIstanbul bool) (*common.Address, *common.Hash, error) { +func (tt *TransactionTest) Run(chainID *big.Int) error { + validateTx := func(rlpData hexutil.Bytes, signer types.Signer, rules *params.Rules) (*common.Address, *common.Hash, uint64, error) { tx, err := types.DecodeTransaction(rlp.NewStream(bytes.NewReader(rlpData), 0)) if err != nil { - return nil, nil, err + return nil, nil, 0, err } - sender, err := tx.Sender(signer) + msg, err := tx.AsMessage(signer, nil, rules) if err != nil { - return nil, nil, err + return nil, nil, 0, err } + sender := msg.From() + // Intrinsic gas - requiredGas, err := core.IntrinsicGas(tx.GetData(), tx.GetAccessList(), tx.GetTo() == nil, isHomestead, isIstanbul) + requiredGas, err := core.IntrinsicGas(msg.Data(), msg.AccessList(), msg.To() == nil, rules.IsHomestead, rules.IsIstanbul) if err != nil { - return nil, nil, err + return nil, nil, 0, err + } + if requiredGas > msg.Gas() { + return nil, nil, requiredGas, fmt.Errorf("insufficient gas ( %d < %d )", msg.Gas(), requiredGas) + } + + if rules.IsLondon { + // EIP-1559 gas fee cap + err = core.CheckEip1559TxGasFeeCap(sender, msg.FeeCap(), msg.Tip(), nil) + if err != nil { + return nil, nil, 0, err + } + // A corollary check of the following assert from EIP-1559: + // signer.balance >= transaction.gas_limit * transaction.max_fee_per_gas + _, overflow := new(uint256.Int).MulOverflow(uint256.NewInt(msg.Gas()), msg.FeeCap()) + if overflow { + return nil, nil, 0, errors.New("GasLimitPriceProductOverflow") + } } - if requiredGas > tx.GetGas() { - return nil, nil, fmt.Errorf("insufficient gas ( %d < %d )", tx.GetGas(), requiredGas) + + // EIP-2681: Limit account nonce to 2^64-1 + if msg.Nonce()+1 < msg.Nonce() { + return nil, nil, requiredGas, fmt.Errorf("%w: nonce: %d", core.ErrNonceMax, msg.Nonce()) } h := tx.Hash() - return &sender, &h, nil + return &sender, &h, requiredGas, nil } for _, testcase := range []struct { - name string - signer *types.Signer - fork ttFork - isHomestead bool - isIstanbul bool + name string + signer *types.Signer + fork ttFork + config *params.ChainConfig }{ - {"Frontier", types.MakeFrontierSigner(), tt.Frontier, false, false}, - {"Homestead", types.LatestSignerForChainID(nil), tt.Homestead, true, false}, - {"EIP150", types.LatestSignerForChainID(nil), tt.EIP150, true, false}, - {"EIP158", types.LatestSignerForChainID(config.ChainID), tt.EIP158, true, false}, - {"Byzantium", types.LatestSignerForChainID(config.ChainID), tt.Byzantium, true, false}, - {"Constantinople", types.LatestSignerForChainID(config.ChainID), tt.Constantinople, true, false}, - {"Istanbul", types.LatestSignerForChainID(config.ChainID), tt.Istanbul, true, true}, + {"Frontier", types.MakeFrontierSigner(), tt.Forks.Frontier, Forks["Frontier"]}, + {"Homestead", types.LatestSignerForChainID(nil), tt.Forks.Homestead, Forks["Homestead"]}, + {"EIP150", types.LatestSignerForChainID(nil), tt.Forks.EIP150, Forks["EIP150"]}, + {"EIP158", types.LatestSignerForChainID(chainID), tt.Forks.EIP158, Forks["EIP158"]}, + {"Byzantium", types.LatestSignerForChainID(chainID), tt.Forks.Byzantium, Forks["Byzantium"]}, + {"Constantinople", types.LatestSignerForChainID(chainID), tt.Forks.Constantinople, Forks["Constantinople"]}, + {"ConstantinopleFix", types.LatestSignerForChainID(chainID), tt.Forks.ConstantinopleFix, Forks["ConstantinopleFix"]}, + {"Istanbul", types.LatestSignerForChainID(chainID), tt.Forks.Istanbul, Forks["Istanbul"]}, + {"Berlin", types.LatestSignerForChainID(chainID), tt.Forks.Berlin, Forks["Berlin"]}, + {"London", types.LatestSignerForChainID(chainID), tt.Forks.London, Forks["London"]}, } { - sender, txhash, err := validateTx(tt.RLP, *testcase.signer, testcase.isHomestead, testcase.isIstanbul) + sender, txhash, intrinsicGas, err := validateTx(tt.RLP, *testcase.signer, testcase.config.Rules(0)) - if testcase.fork.Sender == (common.UnprefixedAddress{}) { + if testcase.fork.Exception != "" { if err == nil { - return fmt.Errorf("expected error, got none (address %v)[%v]", sender.String(), testcase.name) + return fmt.Errorf("expected error %v, got none [%v]", testcase.fork.Exception, testcase.name) } continue } // Should resolve the right address if err != nil { - return fmt.Errorf("got error, expected none: %v", err) + return fmt.Errorf("got error, expected none: %w", err) } if sender == nil { return fmt.Errorf("sender was nil, should be %x", common.Address(testcase.fork.Sender)) @@ -106,6 +142,9 @@ func (tt *TransactionTest) Run(config *params.ChainConfig) error { if *txhash != common.Hash(testcase.fork.Hash) { return fmt.Errorf("hash mismatch: got %x, want %x", *txhash, testcase.fork.Hash) } + if new(big.Int).SetUint64(intrinsicGas).Cmp((*big.Int)(testcase.fork.IntrinsicGas)) != 0 { + return fmt.Errorf("intrinsic gas mismatch: got %x, want %x", intrinsicGas, (*big.Int)(testcase.fork.IntrinsicGas)) + } } return nil } diff --git a/tests/vm_test.go b/tests/vm_test.go deleted file mode 100644 index 9f153ac30fa..00000000000 --- a/tests/vm_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package tests - -import ( - "context" - "testing" - - "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/core/vm" -) - -func TestVM(t *testing.T) { - t.Parallel() - vmt := new(testMatcher) - vmt.slow("^vmPerformance") - vmt.fails("^vmSystemOperationsTest.json/createNameRegistrator$", "fails without parallel execution") - - db := memdb.NewTestDB(t) - - vmt.walk(t, vmTestDir, func(t *testing.T, name string, test *VMTest) { - withTrace(t, test.json.Exec.GasLimit, func(vmconfig vm.Config) error { - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - return vmt.checkFailure(t, test.Run(tx, vmconfig, 0)) - }) - }) -} diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go deleted file mode 100644 index c4de0d2cfcb..00000000000 --- a/tests/vm_test_util.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2015 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package tests - -import ( - "bytes" - "encoding/json" - "fmt" - "math/big" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/turbo/trie" - - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/hexutil" - "github.com/ledgerwatch/erigon/common/math" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/crypto" - "github.com/ledgerwatch/erigon/params" -) - -// VMTest checks EVM execution without block or transaction context. -// See https://github.com/ethereum/tests/wiki/VM-Tests for the test format specification. -type VMTest struct { - json vmJSON -} - -func (t *VMTest) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &t.json) -} - -type vmJSON struct { - Env stEnv `json:"env"` - Exec vmExec `json:"exec"` - Logs common.UnprefixedHash `json:"logs"` - GasRemaining *math.HexOrDecimal64 `json:"gas"` - Out hexutil.Bytes `json:"out"` - Pre core.GenesisAlloc `json:"pre"` - Post core.GenesisAlloc `json:"post"` - PostStateRoot common.Hash `json:"postStateRoot"` -} - -//go:generate gencodec -type vmExec -field-override vmExecMarshaling -out gen_vmexec.go - -type vmExec struct { - Address common.Address `json:"address" gencodec:"required"` - Caller common.Address `json:"caller" gencodec:"required"` - Origin common.Address `json:"origin" gencodec:"required"` - Code []byte `json:"code" gencodec:"required"` - Data []byte `json:"data" gencodec:"required"` - Value *big.Int `json:"value" gencodec:"required"` - GasLimit uint64 `json:"gas" gencodec:"required"` - GasPrice *big.Int `json:"gasPrice" gencodec:"required"` -} - -type vmExecMarshaling struct { - Address common.UnprefixedAddress - Caller common.UnprefixedAddress - Origin common.UnprefixedAddress - Code hexutil.Bytes - Data hexutil.Bytes - Value *math.HexOrDecimal256 - GasLimit math.HexOrDecimal64 - GasPrice *math.HexOrDecimal256 -} - -func (t *VMTest) Run(tx kv.RwTx, vmconfig vm.Config, blockNr uint64) error { - state, err := MakePreState(params.MainnetChainConfig.Rules(blockNr), tx, t.json.Pre, blockNr) - if err != nil { - return fmt.Errorf("error in MakePreState: %v", err) - } - ret, gasRemaining, err := t.exec(state, vmconfig) - // err is not supposed to be checked here, because in VM tests, the failure - // is indicated by the absence of the post-condition section. - // In other words, when such section is not present, we expect an error - if t.json.GasRemaining == nil { - if err == nil { - return fmt.Errorf("gas unspecified (indicating an error), but VM returned no error") - } - if gasRemaining > 0 { - return fmt.Errorf("gas unspecified (indicating an error), but VM returned gas remaining > 0") - } - return nil - } - // Test declares gas, expecting outputs to match. - if !bytes.Equal(ret, t.json.Out) { - return fmt.Errorf("return data mismatch: got %x, want %x", ret, t.json.Out) - } - if gasRemaining != uint64(*t.json.GasRemaining) { - return fmt.Errorf("remaining gas %v, want %v", gasRemaining, *t.json.GasRemaining) - } - var haveV uint256.Int - for addr, account := range t.json.Post { - for k, wantV := range account.Storage { - key := k - state.GetState(addr, &key, &haveV) - if haveV.Bytes32() != wantV { - return fmt.Errorf("wrong storage value at %x:\n got %x\n want %x", k, haveV, wantV) - } - } - } - root, err := trie.CalcRoot("test", tx) - if err != nil { - return fmt.Errorf("Error calculating state root: %v", err) - } - if t.json.PostStateRoot != (common.Hash{}) && root != t.json.PostStateRoot { - return fmt.Errorf("post state root mismatch, got %x, want %x", root, t.json.PostStateRoot) - } - if logs := rlpHash(state.Logs()); logs != common.Hash(t.json.Logs) { - return fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, t.json.Logs) - } - return nil -} - -func (t *VMTest) exec(state vm.IntraBlockState, vmconfig vm.Config) ([]byte, uint64, error) { - evm := t.newEVM(state, vmconfig) - e := t.json.Exec - value, _ := uint256.FromBig(e.Value) - return evm.Call(vm.AccountRef(e.Caller), e.Address, e.Data, e.GasLimit, value, false /* bailout */) -} - -func (t *VMTest) newEVM(state vm.IntraBlockState, vmconfig vm.Config) *vm.EVM { - initialCall := true - canTransfer := func(db vm.IntraBlockState, address common.Address, amount *uint256.Int) bool { - if initialCall { - initialCall = false - return true - } - return core.CanTransfer(db, address, amount) - } - txContext := vm.TxContext{ - Origin: t.json.Exec.Origin, - GasPrice: t.json.Exec.GasPrice, - } - transfer := func(db vm.IntraBlockState, sender, recipient common.Address, amount *uint256.Int, bailout bool) {} - context := vm.BlockContext{ - CanTransfer: canTransfer, - Transfer: transfer, - GetHash: vmTestBlockHash, - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, - Coinbase: t.json.Env.Coinbase, - BlockNumber: t.json.Env.Number, - Time: t.json.Env.Timestamp, - GasLimit: t.json.Env.GasLimit, - Difficulty: t.json.Env.Difficulty, - } - vmconfig.NoRecursion = true - return vm.NewEVM(context, txContext, state, params.MainnetChainConfig, vmconfig) -} - -func vmTestBlockHash(n uint64) common.Hash { - return common.BytesToHash(crypto.Keccak256([]byte(big.NewInt(int64(n)).String()))) -} diff --git a/tools.go b/tools.go index 0eeaaecf422..7a7ba16ab0c 100644 --- a/tools.go +++ b/tools.go @@ -1,4 +1,4 @@ -// +build tools +//go:build tools package tools @@ -20,6 +20,5 @@ import ( _ "github.com/fjl/gencodec" _ "github.com/kevinburke/go-bindata" _ "github.com/ugorji/go/codec/codecgen" - _ "golang.org/x/tools/cmd/stringer" _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" ) diff --git a/turbo/adapter/block_getter.go b/turbo/adapter/block_getter.go deleted file mode 100644 index c92fa56d54e..00000000000 --- a/turbo/adapter/block_getter.go +++ /dev/null @@ -1,24 +0,0 @@ -package adapter - -import ( - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" -) - -func NewBlockGetter(tx kv.Tx) *blockGetter { - return &blockGetter{tx} -} - -type blockGetter struct { - tx kv.Tx -} - -func (g *blockGetter) GetBlockByHash(hash common.Hash) (*types.Block, error) { - return rawdb.ReadBlockByHash(g.tx, hash) -} - -func (g *blockGetter) GetBlock(hash common.Hash, number uint64) *types.Block { - return rawdb.ReadBlock(g.tx, hash, number) -} diff --git a/turbo/adapter/chain_context.go b/turbo/adapter/chain_context.go deleted file mode 100644 index 8224efd258e..00000000000 --- a/turbo/adapter/chain_context.go +++ /dev/null @@ -1,90 +0,0 @@ -package adapter - -import ( - "math/big" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/consensus" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/state" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/erigon/rpc" -) - -type chainContext struct { - tx kv.Tx -} - -func NewChainContext(tx kv.Tx) *chainContext { - return &chainContext{ - tx: tx, - } -} - -type powEngine struct { -} - -func (c *powEngine) VerifyHeader(chain consensus.ChainHeaderReader, header *types.Header, seal bool) error { - - panic("must not be called") -} -func (c *powEngine) VerifyHeaders(chain consensus.ChainHeaderReader, headers []*types.Header, seals []bool) error { - panic("must not be called") -} -func (c *powEngine) VerifyUncles(chain consensus.ChainReader, block *types.Header, uncles []*types.Header) error { - panic("must not be called") -} -func (c *powEngine) VerifySeal(chain consensus.ChainHeaderReader, header *types.Header) error { - panic("must not be called") -} -func (c *powEngine) Prepare(chain consensus.ChainHeaderReader, header *types.Header) error { - panic("must not be called") -} -func (c *powEngine) Initialize(config *params.ChainConfig, chain consensus.ChainHeaderReader, e consensus.EpochReader, header *types.Header, txs []types.Transaction, uncles []*types.Header, syscall consensus.SystemCall) { - panic("must not be called") -} -func (c *powEngine) Finalize(config *params.ChainConfig, header *types.Header, state *state.IntraBlockState, txs []types.Transaction, uncles []*types.Header, r types.Receipts, e consensus.EpochReader, chain consensus.ChainHeaderReader, syscall consensus.SystemCall) error { - panic("must not be called") -} -func (c *powEngine) FinalizeAndAssemble(chainConfig *params.ChainConfig, header *types.Header, state *state.IntraBlockState, - txs []types.Transaction, uncles []*types.Header, receipts types.Receipts, - e consensus.EpochReader, h consensus.ChainHeaderReader, syscall consensus.SystemCall, call consensus.Call) (*types.Block, error) { - panic("must not be called") -} - -func (c *powEngine) Seal(chain consensus.ChainHeaderReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { - panic("must not be called") -} -func (c *powEngine) SealHash(header *types.Header) common.Hash { - panic("must not be called") -} - -func (c *powEngine) GenerateSeal(chain consensus.ChainHeaderReader, currnt, parent *types.Header, call consensus.Call) []rlp.RawValue { - return nil -} - -func (c *powEngine) CalcDifficulty(chain consensus.ChainHeaderReader, time, parentTime uint64, parentDifficulty *big.Int, parentNumber uint64, parentHash, parentUncleHash common.Hash, _ []rlp.RawValue) *big.Int { - panic("must not be called") -} -func (c *powEngine) APIs(chain consensus.ChainHeaderReader) []rpc.API { - panic("must not be called") -} - -func (c *powEngine) Close() error { - panic("must not be called") -} - -func (c *powEngine) Author(header *types.Header) (common.Address, error) { - return header.Coinbase, nil -} - -func (c *chainContext) GetHeader(hash common.Hash, number uint64) *types.Header { - return rawdb.ReadHeader(c.tx, hash, number) -} - -func (c *chainContext) Engine() consensus.Engine { - return &powEngine{} -} diff --git a/turbo/adapter/reader.go b/turbo/adapter/reader.go index 44a11a3b88a..0d13b0e7960 100644 --- a/turbo/adapter/reader.go +++ b/turbo/adapter/reader.go @@ -12,19 +12,26 @@ import ( ) type StateReader struct { - blockNr uint64 - tx kv.Tx + accHistoryC, storageHistoryC kv.Cursor + accChangesC, storageChangesC kv.CursorDupSort + blockNr uint64 + tx kv.Tx } func NewStateReader(tx kv.Tx, blockNr uint64) *StateReader { + c1, _ := tx.Cursor(kv.AccountsHistory) + c2, _ := tx.Cursor(kv.StorageHistory) + c3, _ := tx.CursorDupSort(kv.AccountChangeSet) + c4, _ := tx.CursorDupSort(kv.StorageChangeSet) return &StateReader{ - tx: tx, - blockNr: blockNr, + tx: tx, + blockNr: blockNr, + accHistoryC: c1, storageHistoryC: c2, accChangesC: c3, storageChangesC: c4, } } func (r *StateReader) ReadAccountData(address common.Address) (*accounts.Account, error) { - enc, err := state.GetAsOf(r.tx, false /* storage */, address[:], r.blockNr+1) + enc, err := state.GetAsOf(r.tx, r.accHistoryC, r.accChangesC, false /* storage */, address[:], r.blockNr+1) if err != nil || enc == nil || len(enc) == 0 { return nil, nil } @@ -37,7 +44,7 @@ func (r *StateReader) ReadAccountData(address common.Address) (*accounts.Account func (r *StateReader) ReadAccountStorage(address common.Address, incarnation uint64, key *common.Hash) ([]byte, error) { compositeKey := dbutils.PlainGenerateCompositeStorageKey(address.Bytes(), incarnation, key.Bytes()) - return state.GetAsOf(r.tx, true /* storage */, compositeKey, r.blockNr+1) + return state.GetAsOf(r.tx, r.storageHistoryC, r.storageChangesC, true /* storage */, compositeKey, r.blockNr+1) } func (r *StateReader) ReadAccountCode(address common.Address, incarnation uint64, codeHash common.Hash) ([]byte, error) { diff --git a/turbo/app/import.go b/turbo/app/import.go new file mode 100644 index 00000000000..f1810910a90 --- /dev/null +++ b/turbo/app/import.go @@ -0,0 +1,222 @@ +package app + +import ( + "compress/gzip" + "context" + "errors" + "fmt" + "io" + "os" + "os/signal" + "strings" + "syscall" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/eth" + "github.com/ledgerwatch/erigon/rlp" + turboNode "github.com/ledgerwatch/erigon/turbo/node" + "github.com/ledgerwatch/erigon/turbo/stages" + + "github.com/ledgerwatch/log/v3" + "github.com/urfave/cli" +) + +const ( + importBatchSize = 2500 +) + +var importCommand = cli.Command{ + Action: MigrateFlags(importChain), + Name: "import", + Usage: "Import a blockchain file", + ArgsUsage: " ( ... ) ", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.ChainFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The import command imports blocks from an RLP-encoded form. The form can be one file +with several RLP-encoded blocks, or several files can be used. + +If only one file is used, import error will result in failure. If several files are used, +processing will proceed even if an individual RLP-file import failure occurs.`, +} + +func importChain(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an argument.") + } + + logger := log.New(ctx) + + nodeCfg := turboNode.NewNodConfigUrfave(ctx) + ethCfg := turboNode.NewEthConfigUrfave(ctx, nodeCfg) + + stack := makeConfigNode(nodeCfg) + defer stack.Close() + + ethereum, err := turboNode.RegisterEthService(stack, ethCfg, logger) + if err != nil { + return err + } + + if err := ImportChain(ethereum, ethereum.ChainDB(), ctx.Args().First()); err != nil { + return err + } + + return nil +} + +func ImportChain(ethereum *eth.Ethereum, chainDB kv.RwDB, fn string) error { + // Watch for Ctrl-C while the import is running. + // If a signal is received, the import will stop at the next batch. + interrupt := make(chan os.Signal, 1) + stop := make(chan struct{}) + signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM) + defer signal.Stop(interrupt) + defer close(interrupt) + go func() { + if _, ok := <-interrupt; ok { + log.Info("Interrupted during import, stopping at next batch") + } + close(stop) + }() + checkInterrupt := func() bool { + select { + case <-stop: + return true + default: + return false + } + } + + log.Info("Importing blockchain", "file", fn) + + // Open the file handle and potentially unwrap the gzip stream + fh, err := os.Open(fn) + if err != nil { + return err + } + defer fh.Close() + + var reader io.Reader = fh + if strings.HasSuffix(fn, ".gz") { + if reader, err = gzip.NewReader(reader); err != nil { + return err + } + } + stream := rlp.NewStream(reader, 0) + + // Run actual the import. + blocks := make(types.Blocks, importBatchSize) + n := 0 + for batch := 0; ; batch++ { + // Load a batch of RLP blocks. + if checkInterrupt() { + return fmt.Errorf("interrupted") + } + i := 0 + for ; i < importBatchSize; i++ { + var b types.Block + if err := stream.Decode(&b); errors.Is(err, io.EOF) { + break + } else if err != nil { + return fmt.Errorf("at block %d: %v", n, err) + } + // don't import first block + if b.NumberU64() == 0 { + i-- + continue + } + blocks[i] = &b + n++ + } + if i == 0 { + break + } + // Import the batch. + if checkInterrupt() { + return fmt.Errorf("interrupted") + } + + missing := missingBlocks(chainDB, blocks[:i]) + if len(missing) == 0 { + log.Info("Skipping batch as all blocks present", "batch", batch, "first", blocks[0].Hash(), "last", blocks[i-1].Hash()) + continue + } + + // RLP decoding worked, try to insert into chain: + missingChain := &core.ChainPack{ + Blocks: missing, + TopBlock: missing[len(missing)-1], + Length: len(missing), + } + + if err := InsertChain(ethereum, missingChain); err != nil { + return err + } + } + return nil +} + +func ChainHasBlock(chainDB kv.RwDB, block *types.Block) bool { + var chainHasBlock bool + + chainDB.View(context.Background(), func(tx kv.Tx) (err error) { + chainHasBlock = rawdb.HasBlock(tx, block.Hash(), block.NumberU64()) + return nil + }) + + return chainHasBlock +} + +func missingBlocks(chainDB kv.RwDB, blocks []*types.Block) []*types.Block { + var headBlock *types.Block + chainDB.View(context.Background(), func(tx kv.Tx) (err error) { + hash := rawdb.ReadHeadHeaderHash(tx) + number := rawdb.ReadHeaderNumber(tx, hash) + headBlock = rawdb.ReadBlock(tx, hash, *number) + return nil + }) + + for i, block := range blocks { + // If we're behind the chain head, only check block, state is available at head + if headBlock.NumberU64() > block.NumberU64() { + if !ChainHasBlock(chainDB, block) { + return blocks[i:] + } + continue + } + + if !ChainHasBlock(chainDB, block) { + return blocks[i:] + } + } + + return nil +} + +func InsertChain(ethereum *eth.Ethereum, chain *core.ChainPack) error { + sentryControlServer := ethereum.SentryControlServer() + initialCycle := false + highestSeenHeader := chain.TopBlock.NumberU64() + + for _, b := range chain.Blocks { + sentryControlServer.Hd.AddMinedHeader(b.Header()) + sentryControlServer.Bd.AddMinedBlock(b) + } + + sentryControlServer.Hd.MarkAllVerified() + + _, err := stages.StageLoopStep(ethereum.SentryCtx(), ethereum.ChainDB(), ethereum.StagedSync(), highestSeenHeader, ethereum.Notifications(), initialCycle, sentryControlServer.UpdateHead, nil) + if err != nil { + return err + } + + return nil +} diff --git a/turbo/app/init.go b/turbo/app/init.go new file mode 100644 index 00000000000..6ff2edf5525 --- /dev/null +++ b/turbo/app/init.go @@ -0,0 +1,67 @@ +package app + +import ( + "encoding/json" + "os" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/node" + "github.com/ledgerwatch/log/v3" + "github.com/urfave/cli" +) + +var initCommand = cli.Command{ + Action: MigrateFlags(initGenesis), + Name: "init", + Usage: "Bootstrap and initialize a new genesis block", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The init command initializes a new genesis block and definition for the network. +This is a destructive action and changes the network in which you will be +participating. + +It expects the genesis file as argument.`, +} + +// initGenesis will initialise the given JSON format genesis file and writes it as +// the zero'd block (i.e. genesis) or will fail hard if it can't succeed. +func initGenesis(ctx *cli.Context) error { + // Make sure we have a valid genesis JSON + genesisPath := ctx.Args().First() + if len(genesisPath) == 0 { + utils.Fatalf("Must supply path to genesis JSON file") + } + + file, err := os.Open(genesisPath) + if err != nil { + utils.Fatalf("Failed to read genesis file: %v", err) + } + defer file.Close() + + genesis := new(core.Genesis) + if err := json.NewDecoder(file).Decode(genesis); err != nil { + utils.Fatalf("invalid genesis file: %v", err) + } + + // Open and initialise both full and light databases + stack := MakeConfigNodeDefault(ctx) + defer stack.Close() + + chaindb, err := node.OpenDatabase(stack.Config(), log.New(ctx), kv.ChainDB) + if err != nil { + utils.Fatalf("Failed to open database: %v", err) + } + _, hash, err := core.CommitGenesisBlock(chaindb, genesis) + if err != nil { + utils.Fatalf("Failed to write genesis block: %v", err) + } + chaindb.Close() + log.Info("Successfully wrote genesis state", "hash", hash.Hash()) + return nil +} diff --git a/turbo/app/make_app.go b/turbo/app/make_app.go new file mode 100644 index 00000000000..b74bdd7e13c --- /dev/null +++ b/turbo/app/make_app.go @@ -0,0 +1,73 @@ +// Package app contains framework for building a command-line based Erigon node. +package app + +import ( + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/internal/flags" + "github.com/ledgerwatch/erigon/node" + "github.com/ledgerwatch/erigon/node/nodecfg" + "github.com/ledgerwatch/erigon/params" + + "github.com/urfave/cli" +) + +// MakeApp creates a cli application (based on `github.com/urlfave/cli` package). +// The application exits when `action` returns. +// Parameters: +// * action: the main function for the application. receives `*cli.Context` with parsed command-line flags. Returns no error, if some error could not be recovered from write to the log or panic. +// * cliFlags: the list of flags `cli.Flag` that the app should set and parse. By default, use `DefaultFlags()`. If you want to specify your own flag, use `append(DefaultFlags(), myFlag)` for this parameter. +func MakeApp(action func(*cli.Context), cliFlags []cli.Flag) *cli.App { + app := flags.NewApp(params.GitCommit, "", "erigon experimental cli") + app.Action = action + app.Flags = append(cliFlags, debug.Flags...) // debug flags are required + app.Before = func(ctx *cli.Context) error { + return debug.Setup(ctx) + } + app.After = func(ctx *cli.Context) error { + debug.Exit() + return nil + } + app.Commands = []cli.Command{initCommand, importCommand, snapshotCommand} + return app +} + +func MigrateFlags(action func(ctx *cli.Context) error) func(*cli.Context) error { + return func(ctx *cli.Context) error { + for _, name := range ctx.FlagNames() { + if ctx.IsSet(name) { + ctx.GlobalSet(name, ctx.String(name)) + } + } + return action(ctx) + } +} + +func NewNodeConfig(ctx *cli.Context) *nodecfg.Config { + nodeConfig := nodecfg.DefaultConfig + // see simiar changes in `cmd/geth/config.go#defaultNodeConfig` + if commit := params.GitCommit; commit != "" { + nodeConfig.Version = params.VersionWithCommit(commit, "") + } else { + nodeConfig.Version = params.Version + } + nodeConfig.IPCPath = "" // force-disable IPC endpoint + nodeConfig.Name = "erigon" + if ctx.GlobalIsSet(utils.DataDirFlag.Name) { + nodeConfig.DataDir = ctx.GlobalString(utils.DataDirFlag.Name) + } + return &nodeConfig +} + +func MakeConfigNodeDefault(ctx *cli.Context) *node.Node { + return makeConfigNode(NewNodeConfig(ctx)) +} + +func makeConfigNode(config *nodecfg.Config) *node.Node { + stack, err := node.New(config) + if err != nil { + utils.Fatalf("Failed to create Erigon node: %v", err) + } + + return stack +} diff --git a/turbo/app/snapshots.go b/turbo/app/snapshots.go new file mode 100644 index 00000000000..01983ff0905 --- /dev/null +++ b/turbo/app/snapshots.go @@ -0,0 +1,365 @@ +package app + +import ( + "bufio" + "context" + "encoding/binary" + "errors" + "fmt" + "io" + "os" + "path" + "path/filepath" + "runtime" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/common/dir" + "github.com/ledgerwatch/erigon-lib/compress" + "github.com/ledgerwatch/erigon-lib/etl" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/mdbx" + "github.com/ledgerwatch/erigon/cmd/hack/tool" + "github.com/ledgerwatch/erigon/cmd/utils" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/eth/ethconfig" + "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/internal/debug" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" + "github.com/ledgerwatch/log/v3" + "github.com/urfave/cli" +) + +const ASSERT = false + +var snapshotCommand = cli.Command{ + Name: "snapshots", + Description: `Managing snapshots (historical data partitions)`, + Subcommands: []cli.Command{ + { + Name: "create", + Action: doSnapshotCommand, + Usage: "Create snapshots for given range of blocks", + Before: func(ctx *cli.Context) error { return debug.Setup(ctx) }, + Flags: append([]cli.Flag{ + utils.DataDirFlag, + SnapshotFromFlag, + SnapshotToFlag, + SnapshotSegmentSizeFlag, + }, debug.Flags...), + }, + { + Name: "index", + Action: doIndicesCommand, + Usage: "Create all indices for snapshots", + Before: func(ctx *cli.Context) error { return debug.Setup(ctx) }, + Flags: append([]cli.Flag{ + utils.DataDirFlag, + SnapshotFromFlag, + SnapshotRebuildFlag, + }, debug.Flags...), + }, + { + Name: "retire", + Action: doRetireCommand, + Usage: "erigon snapshots uncompress a.seg | erigon snapshots compress b.seg", + Before: func(ctx *cli.Context) error { return debug.Setup(ctx) }, + Flags: append([]cli.Flag{ + utils.DataDirFlag, + SnapshotFromFlag, + SnapshotToFlag, + SnapshotEveryFlag, + }, debug.Flags...), + }, + { + Name: "uncompress", + Action: doUncompress, + Usage: "erigon snapshots uncompress a.seg | erigon snapshots compress b.seg", + Before: func(ctx *cli.Context) error { return debug.Setup(ctx) }, + Flags: append([]cli.Flag{}, debug.Flags...), + }, + { + Name: "compress", + Action: doCompress, + Before: func(ctx *cli.Context) error { return debug.Setup(ctx) }, + Flags: append([]cli.Flag{utils.DataDirFlag}, debug.Flags...), + }, + }, +} + +var ( + SnapshotFromFlag = cli.Uint64Flag{ + Name: "from", + Usage: "From block number", + Value: 0, + } + SnapshotToFlag = cli.Uint64Flag{ + Name: "to", + Usage: "To block number. Zero - means unlimited.", + Value: 0, + } + SnapshotEveryFlag = cli.Uint64Flag{ + Name: "every", + Usage: "Do operation every N blocks", + Value: 1_000, + } + SnapshotSegmentSizeFlag = cli.Uint64Flag{ + Name: "segment.size", + Usage: "Amount of blocks in each segment", + Value: snap.DEFAULT_SEGMENT_SIZE, + } + SnapshotRebuildFlag = cli.BoolFlag{ + Name: "rebuild", + Usage: "Force rebuild", + } +) + +func doIndicesCommand(cliCtx *cli.Context) error { + ctx, cancel := common.RootContext() + defer cancel() + + datadir := cliCtx.String(utils.DataDirFlag.Name) + snapDir := filepath.Join(datadir, "snapshots") + tmpDir := filepath.Join(datadir, etl.TmpDirName) + rebuild := cliCtx.Bool(SnapshotRebuildFlag.Name) + from := cliCtx.Uint64(SnapshotFromFlag.Name) + + chainDB := mdbx.NewMDBX(log.New()).Path(path.Join(datadir, "chaindata")).Readonly().MustOpen() + defer chainDB.Close() + + if rebuild { + cfg := ethconfig.NewSnapCfg(true, true, false) + workers := runtime.GOMAXPROCS(-1) - 1 + if workers < 1 { + workers = 1 + } + if workers > 4 { + workers = 4 + } + if err := rebuildIndices(ctx, chainDB, cfg, snapDir, tmpDir, from, workers); err != nil { + log.Error("Error", "err", err) + } + } + return nil +} + +func doUncompress(cliCtx *cli.Context) error { + ctx, cancel := common.RootContext() + defer cancel() + args := cliCtx.Args() + if len(args) != 1 { + return fmt.Errorf("expecting .seg file path") + } + f := args[0] + decompressor, err := compress.NewDecompressor(f) + if err != nil { + return err + } + defer decompressor.Close() + wr := bufio.NewWriterSize(os.Stdout, 16*etl.BufIOSize) + defer wr.Flush() + var numBuf [binary.MaxVarintLen64]byte + if err := decompressor.WithReadAhead(func() error { + g := decompressor.MakeGetter() + buf := make([]byte, 0, 16*etl.BufIOSize) + for g.HasNext() { + buf, _ = g.Next(buf[:0]) + n := binary.PutUvarint(numBuf[:], uint64(len(buf))) + if _, err := wr.Write(numBuf[:n]); err != nil { + return err + } + if _, err := wr.Write(buf); err != nil { + return err + } + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + } + return nil + }); err != nil { + return err + } + return nil +} +func doCompress(cliCtx *cli.Context) error { + ctx, cancel := common.RootContext() + defer cancel() + args := cliCtx.Args() + if len(args) != 1 { + return fmt.Errorf("expecting .seg file path") + } + f := args[0] + datadir := cliCtx.String(utils.DataDirFlag.Name) + tmpDir := filepath.Join(datadir, etl.TmpDirName) + workers := runtime.GOMAXPROCS(-1) - 1 + if workers < 1 { + workers = 1 + } + c, err := compress.NewCompressor(ctx, "", f, tmpDir, compress.MinPatternScore, workers, log.LvlInfo) + if err != nil { + return err + } + r := bufio.NewReaderSize(os.Stdin, 16*etl.BufIOSize) + buf := make([]byte, 0, 32*1024*1024) + var l uint64 + for l, err = binary.ReadUvarint(r); err == nil; l, err = binary.ReadUvarint(r) { + if cap(buf) < int(l) { + buf = make([]byte, l) + } else { + buf = buf[:l] + } + if _, err = io.ReadFull(r, buf); err != nil { + return err + } + if err = c.AddWord(buf); err != nil { + return err + } + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + } + if err != nil && !errors.Is(err, io.EOF) { + return err + } + if err := c.Compress(); err != nil { + return err + } + + return nil +} +func doRetireCommand(cliCtx *cli.Context) error { + ctx, cancel := common.RootContext() + defer cancel() + + datadir := cliCtx.String(utils.DataDirFlag.Name) + snapDir := filepath.Join(datadir, "snapshots") + tmpDir := filepath.Join(datadir, etl.TmpDirName) + from := cliCtx.Uint64(SnapshotFromFlag.Name) + to := cliCtx.Uint64(SnapshotToFlag.Name) + every := cliCtx.Uint64(SnapshotEveryFlag.Name) + + chainDB := mdbx.NewMDBX(log.New()).Label(kv.ChainDB).Path(path.Join(datadir, "chaindata")).MustOpen() + defer chainDB.Close() + + cfg := ethconfig.NewSnapCfg(true, true, true) + chainConfig := tool.ChainConfigFromDB(chainDB) + chainID, _ := uint256.FromBig(chainConfig.ChainID) + snapshots := snapshotsync.NewRoSnapshots(cfg, snapDir) + if err := snapshots.Reopen(); err != nil { + return err + } + + workers := cmp.Max(1, runtime.GOMAXPROCS(-1)-1) + br := snapshotsync.NewBlockRetire(workers, tmpDir, snapshots, chainDB, nil, nil) + + log.Info("Params", "from", from, "to", to, "every", every) + for i := from; i < to; i += every { + if err := br.RetireBlocks(ctx, i, i+every, *chainID, log.LvlInfo); err != nil { + panic(err) + } + if err := chainDB.Update(ctx, func(tx kv.RwTx) error { + progress, _ := stages.GetStageProgress(tx, stages.Headers) + canDeleteTo := snapshotsync.CanDeleteTo(progress, br.Snapshots()) + deletedFrom, deletedTo, err := rawdb.DeleteAncientBlocks(tx, canDeleteTo, 100) + if err != nil { + return nil + } + log.Info("Deleted blocks", "from", deletedFrom, "to", deletedTo) + return nil + }); err != nil { + return err + } + } + + return nil +} + +func doSnapshotCommand(cliCtx *cli.Context) error { + ctx, cancel := common.RootContext() + defer cancel() + + fromBlock := cliCtx.Uint64(SnapshotFromFlag.Name) + toBlock := cliCtx.Uint64(SnapshotToFlag.Name) + segmentSize := cliCtx.Uint64(SnapshotSegmentSizeFlag.Name) + if segmentSize < 1000 { + return fmt.Errorf("too small --segment.size %d", segmentSize) + } + datadir := cliCtx.String(utils.DataDirFlag.Name) + snapDir := filepath.Join(datadir, "snapshots") + dir.MustExist(snapDir) + dir.MustExist(filepath.Join(snapDir, "db")) // this folder will be checked on existance - to understand that snapshots are ready + tmpDir := filepath.Join(datadir, etl.TmpDirName) + dir.MustExist(tmpDir) + + chainDB := mdbx.NewMDBX(log.New()).Label(kv.ChainDB).Path(filepath.Join(datadir, "chaindata")).Readonly().MustOpen() + defer chainDB.Close() + + if err := snapshotBlocks(ctx, chainDB, fromBlock, toBlock, segmentSize, snapDir, tmpDir); err != nil { + log.Error("Error", "err", err) + } + return nil +} +func rebuildIndices(ctx context.Context, chainDB kv.RoDB, cfg ethconfig.Snapshot, snapDir, tmpDir string, from uint64, workers int) error { + chainConfig := tool.ChainConfigFromDB(chainDB) + chainID, _ := uint256.FromBig(chainConfig.ChainID) + + allSnapshots := snapshotsync.NewRoSnapshots(cfg, snapDir) + if err := allSnapshots.Reopen(); err != nil { + return err + } + if err := snapshotsync.BuildIndices(ctx, allSnapshots, *chainID, tmpDir, from, workers, log.LvlInfo); err != nil { + return err + } + return nil +} + +func snapshotBlocks(ctx context.Context, chainDB kv.RoDB, fromBlock, toBlock, blocksPerFile uint64, snapDir, tmpDir string) error { + var last uint64 + + if toBlock > 0 { + last = toBlock + } else { + lastChunk := func(tx kv.Tx, blocksPerFile uint64) (uint64, error) { + c, err := tx.Cursor(kv.BlockBody) + if err != nil { + return 0, err + } + k, _, err := c.Last() + if err != nil { + return 0, err + } + last := binary.BigEndian.Uint64(k) + if last > params.FullImmutabilityThreshold { + last -= params.FullImmutabilityThreshold + } else { + last = 0 + } + last = last - last%blocksPerFile + return last, nil + } + + if err := chainDB.View(context.Background(), func(tx kv.Tx) (err error) { + last, err = lastChunk(tx, blocksPerFile) + return err + }); err != nil { + return err + } + } + + log.Info("Last body number", "last", last) + workers := runtime.GOMAXPROCS(-1) - 1 + if workers < 1 { + workers = 1 + } + if err := snapshotsync.DumpBlocks(ctx, fromBlock, last, blocksPerFile, tmpDir, snapDir, chainDB, workers, log.LvlInfo); err != nil { + return fmt.Errorf("DumpBlocks: %w", err) + } + return nil +} diff --git a/turbo/cli/default_flags.go b/turbo/cli/default_flags.go index 4a65dce6b29..8d73a12b39b 100644 --- a/turbo/cli/default_flags.go +++ b/turbo/cli/default_flags.go @@ -10,39 +10,76 @@ import ( var DefaultFlags = []cli.Flag{ utils.DataDirFlag, utils.EthashDatasetDirFlag, + utils.SnapshotFlag, + utils.TxPoolDisableFlag, utils.TxPoolLocalsFlag, utils.TxPoolNoLocalsFlag, - utils.TxPoolJournalFlag, - utils.TxPoolRejournalFlag, utils.TxPoolPriceLimitFlag, utils.TxPoolPriceBumpFlag, utils.TxPoolAccountSlotsFlag, utils.TxPoolGlobalSlotsFlag, + utils.TxPoolGlobalBaseFeeSlotsFlag, utils.TxPoolAccountQueueFlag, utils.TxPoolGlobalQueueFlag, utils.TxPoolLifetimeFlag, + utils.TxPoolTraceSendersFlag, PruneFlag, PruneHistoryFlag, PruneReceiptFlag, PruneTxIndexFlag, PruneCallTracesFlag, - SnapshotModeFlag, - SeedSnapshotsFlag, - SnapshotDatabaseLayoutFlag, - ExternalSnapshotDownloaderAddrFlag, + PruneHistoryBeforeFlag, + PruneReceiptBeforeFlag, + PruneTxIndexBeforeFlag, + PruneCallTracesBeforeFlag, BatchSizeFlag, BlockDownloaderWindowFlag, DatabaseVerbosityFlag, PrivateApiAddr, + PrivateApiRateLimit, EtlBufferSizeFlag, TLSFlag, TLSCertFlag, TLSKeyFlag, TLSCACertFlag, + StateStreamDisableFlag, SyncLoopThrottleFlag, BadBlockFlag, + + utils.HTTPEnabledFlag, + utils.HTTPListenAddrFlag, + utils.HTTPPortFlag, + utils.EngineAddr, + utils.EnginePort, + utils.JWTSecretPath, + utils.HttpCompressionFlag, + utils.HTTPCORSDomainFlag, + utils.HTTPVirtualHostsFlag, + utils.HTTPApiFlag, + utils.WSEnabledFlag, + utils.WsCompressionFlag, + utils.StateCacheFlag, + utils.RpcBatchConcurrencyFlag, + utils.DBReadConcurrencyFlag, + utils.RpcAccessListFlag, + utils.RpcTraceCompatFlag, + utils.RpcGasCapFlag, + utils.StarknetGrpcAddressFlag, + utils.TevmFlag, + utils.TxpoolApiAddrFlag, + utils.TraceMaxtracesFlag, + + utils.SnapKeepBlocksFlag, + utils.SnapStopFlag, + utils.DbPageSizeFlag, + utils.TorrentPortFlag, + utils.TorrentMaxPeersFlag, + utils.TorrentConnsPerFileFlag, + utils.TorrentDownloadSlotsFlag, + utils.TorrentUploadRateFlag, + utils.TorrentDownloadRateFlag, + utils.TorrentVerbosityFlag, utils.ListenPortFlag, - utils.ListenPort65Flag, utils.NATFlag, utils.NoDiscoverFlag, utils.DiscoveryV5Flag, @@ -50,9 +87,12 @@ var DefaultFlags = []cli.Flag{ utils.NodeKeyFileFlag, utils.NodeKeyHexFlag, utils.DNSDiscoveryFlag, + utils.BootnodesFlag, utils.StaticPeersFlag, + utils.TrustedPeersFlag, utils.MaxPeersFlag, utils.ChainFlag, + utils.DeveloperPeriodFlag, utils.VMEnableDebugFlag, utils.NetworkIdFlag, utils.FakePoWFlag, @@ -68,12 +108,22 @@ var DefaultFlags = []cli.Flag{ utils.CliqueSnapshotInmemorySnapshotsFlag, utils.CliqueSnapshotInmemorySignaturesFlag, utils.CliqueDataDirFlag, + utils.EnabledIssuance, utils.MiningEnabledFlag, + utils.ProposingDisableFlag, utils.MinerNotifyFlag, - utils.MinerGasTargetFlag, utils.MinerGasLimitFlag, utils.MinerEtherbaseFlag, utils.MinerExtraDataFlag, utils.MinerNoVerfiyFlag, + utils.MinerSigningKeyFileFlag, utils.SentryAddrFlag, + utils.SentryLogPeerInfoFlag, + utils.DownloaderAddrFlag, + HealthCheckFlag, + utils.HeimdallURLFlag, + utils.WithoutHeimdallFlag, + utils.EthStatsURLFlag, + utils.OverrideTerminalTotalDifficulty, + utils.OverrideMergeForkBlock, } diff --git a/turbo/cli/flags.go b/turbo/cli/flags.go index f23c6354c78..5613d79d9ec 100644 --- a/turbo/cli/flags.go +++ b/turbo/cli/flags.go @@ -2,17 +2,21 @@ package cli import ( "fmt" + "path/filepath" "strings" "time" "github.com/c2h5oh/datasize" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/cli/httpcfg" "github.com/ledgerwatch/erigon/cmd/utils" - "github.com/ledgerwatch/erigon/common/etl" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/hexutil" "github.com/ledgerwatch/erigon/eth/ethconfig" "github.com/ledgerwatch/erigon/ethdb/prune" - "github.com/ledgerwatch/erigon/node" - "github.com/ledgerwatch/erigon/turbo/snapshotsync" + "github.com/ledgerwatch/erigon/node/nodecfg" "github.com/ledgerwatch/log/v3" "github.com/spf13/pflag" "github.com/urfave/cli" @@ -27,7 +31,7 @@ var ( BatchSizeFlag = cli.StringFlag{ Name: "batchSize", Usage: "Batch size for the execution stage", - Value: "512M", + Value: "256M", } EtlBufferSizeFlag = cli.StringFlag{ Name: "etl.bufferSize", @@ -37,7 +41,7 @@ var ( BlockDownloaderWindowFlag = cli.IntFlag{ Name: "blockDownloaderWindow", Usage: "Outstanding limit of block bodies being downloaded", - Value: 65536, + Value: ethconfig.Defaults.Sync.BlockDownloaderWindow, } PrivateApiAddr = cli.StringFlag{ @@ -49,24 +53,18 @@ var ( PrivateApiRateLimit = cli.IntFlag{ Name: "private.api.ratelimit", Usage: "Amount of requests server handle simultaneously - requests over this limit will wait. Increase it - if clients see 'request timeout' while server load is low - it means your 'hot data' is small or have much RAM. ", - Value: 500, - } - - MaxPeersFlag = cli.IntFlag{ - Name: "maxpeers", - Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: node.DefaultConfig.P2P.MaxPeers, + Value: kv.ReadersLimit - 128, } PruneFlag = cli.StringFlag{ Name: "prune", - Usage: `Choose which ancient data delete from DB: - h - prune history (ChangeSets, HistoryIndices - used by historical state access) + Usage: `Choose which ancient data delete from DB: + h - prune history (ChangeSets, HistoryIndices - used by historical state access, like eth_getStorageAt, eth_getBalanceAt, debug_traceTransaction, trace_block, trace_transaction, etc.) r - prune receipts (Receipts, Logs, LogTopicIndex, LogAddressIndex - used by eth_getLogs and similar RPC methods) t - prune transaction by it's hash index - c - prune call traces (used by trace_* methods) - Does delete data older than 90K block (can set another value by '--prune.*.older' flags). - If item is NOT in the list - means NO pruning for this data.s + c - prune call traces (used by trace_filter method) + Does delete data older than 90K blocks, --prune=h is shortcut for: --prune.h.older=90_000 + If item is NOT in the list - means NO pruning for this data. Example: --prune=hrtc`, Value: "disabled", } @@ -86,36 +84,29 @@ var ( Name: "prune.c.older", Usage: `Prune data after this amount of blocks (if --prune flag has 'c', then default is 90K)`, } - ExperimentsFlag = cli.StringFlag{ - Name: "experiments", - Usage: `Enable some experimental stages: -* tevm - write TEVM translated code to the DB`, - Value: "default", - } - SnapshotModeFlag = cli.StringFlag{ - Name: "snapshot.mode", - Usage: `Configures the snapshot mode of the app: -* h - download headers snapshot -* b - download bodies snapshot -* s - download state snapshot -* r - download receipts snapshot -`, - Value: snapshotsync.DefaultSnapshotMode.ToString(), + PruneHistoryBeforeFlag = cli.Uint64Flag{ + Name: "prune.h.before", + Usage: `Prune data before this block`, + } + PruneReceiptBeforeFlag = cli.Uint64Flag{ + Name: "prune.r.before", + Usage: `Prune data before this block`, } - SeedSnapshotsFlag = cli.BoolTFlag{ - Name: "snapshot.seed", - Usage: `Seed snapshot seeding(default: true)`, + PruneTxIndexBeforeFlag = cli.Uint64Flag{ + Name: "prune.t.before", + Usage: `Prune data before this block`, } - //todo replace to BoolT - SnapshotDatabaseLayoutFlag = cli.BoolFlag{ - Name: "snapshot.layout", - Usage: `Enable snapshot db layout(default: false)`, + PruneCallTracesBeforeFlag = cli.Uint64Flag{ + Name: "prune.c.before", + Usage: `Prune data before this block`, } - ExternalSnapshotDownloaderAddrFlag = cli.StringFlag{ - Name: "snapshot.downloader.addr", - Usage: `enable external snapshot downloader`, + ExperimentsFlag = cli.StringFlag{ + Name: "experiments", + Usage: `Enable some experimental stages: +* tevm - write TEVM translated code to the DB`, + Value: "default", } // mTLS flags @@ -138,9 +129,9 @@ var ( Usage: "Specify certificate authority", Value: "", } - StateStreamFlag = cli.BoolFlag{ - Name: "state.stream", - Usage: "Enable streaming of state changes from core to RPC daemon", + StateStreamDisableFlag = cli.BoolFlag{ + Name: "state.stream.disable", + Usage: "Disable streaming of state changes from core to RPC daemon", } // Throttling Flags @@ -150,10 +141,15 @@ var ( Value: "", } - BadBlockFlag = cli.IntFlag{ + BadBlockFlag = cli.StringFlag{ Name: "bad.block", - Usage: "Marks block with given number bad and forces initial reorg before normal staged sync", - Value: 0, + Usage: "Marks block with given hex string as bad and forces initial reorg before normal staged sync", + Value: "", + } + + HealthCheckFlag = cli.BoolFlag{ + Name: "healthcheck", + Usage: "Enable grpc health check", } ) @@ -164,21 +160,16 @@ func ApplyFlagsForEthConfig(ctx *cli.Context, cfg *ethconfig.Config) { ctx.GlobalUint64(PruneReceiptFlag.Name), ctx.GlobalUint64(PruneTxIndexFlag.Name), ctx.GlobalUint64(PruneCallTracesFlag.Name), + ctx.GlobalUint64(PruneHistoryBeforeFlag.Name), + ctx.GlobalUint64(PruneReceiptBeforeFlag.Name), + ctx.GlobalUint64(PruneTxIndexBeforeFlag.Name), + ctx.GlobalUint64(PruneCallTracesBeforeFlag.Name), strings.Split(ctx.GlobalString(ExperimentsFlag.Name), ","), ) if err != nil { utils.Fatalf(fmt.Sprintf("error while parsing mode: %v", err)) } cfg.Prune = mode - - snMode, err := snapshotsync.SnapshotModeFromString(ctx.GlobalString(SnapshotModeFlag.Name)) - if err != nil { - utils.Fatalf(fmt.Sprintf("error while parsing mode: %v", err)) - } - cfg.Snapshot.Mode = snMode - cfg.Snapshot.Seeding = ctx.GlobalBool(SeedSnapshotsFlag.Name) - cfg.Snapshot.Enabled = ctx.GlobalBool(SnapshotDatabaseLayoutFlag.Name) - if ctx.GlobalString(BatchSizeFlag.Name) != "" { err := cfg.BatchSize.UnmarshalText([]byte(ctx.GlobalString(BatchSizeFlag.Name))) if err != nil { @@ -196,18 +187,26 @@ func ApplyFlagsForEthConfig(ctx *cli.Context, cfg *ethconfig.Config) { etl.BufferOptimalSize = *size } - cfg.ExternalSnapshotDownloaderAddr = ctx.GlobalString(ExternalSnapshotDownloaderAddrFlag.Name) - cfg.StateStream = ctx.GlobalBool(StateStreamFlag.Name) - cfg.BlockDownloaderWindow = ctx.GlobalInt(BlockDownloaderWindowFlag.Name) + cfg.StateStream = !ctx.GlobalBool(StateStreamDisableFlag.Name) + cfg.Sync.BlockDownloaderWindow = ctx.GlobalInt(BlockDownloaderWindowFlag.Name) if ctx.GlobalString(SyncLoopThrottleFlag.Name) != "" { syncLoopThrottle, err := time.ParseDuration(ctx.GlobalString(SyncLoopThrottleFlag.Name)) if err != nil { utils.Fatalf("Invalid time duration provided in %s: %v", SyncLoopThrottleFlag.Name, err) } - cfg.SyncLoopThrottle = syncLoopThrottle + cfg.Sync.LoopThrottle = syncLoopThrottle + } + + if ctx.GlobalString(BadBlockFlag.Name) != "" { + bytes, err := hexutil.Decode(ctx.GlobalString(BadBlockFlag.Name)) + if err != nil { + log.Warn("Error decoding block hash", "hash", ctx.GlobalString(BadBlockFlag.Name), "err", err) + } else { + cfg.BadBlockHash = common.BytesToHash(bytes) + } } - cfg.BadBlock = uint64(ctx.GlobalInt(BadBlockFlag.Name)) + } func ApplyFlagsForEthConfigCobra(f *pflag.FlagSet, cfg *ethconfig.Config) { @@ -229,21 +228,26 @@ func ApplyFlagsForEthConfigCobra(f *pflag.FlagSet, cfg *ethconfig.Config) { if v := f.Uint64(PruneCallTracesFlag.Name, PruneCallTracesFlag.Value, PruneCallTracesFlag.Usage); v != nil { exactC = *v } - mode, err := prune.FromCli(*v, exactH, exactR, exactT, exactC, experiments) - if err != nil { - utils.Fatalf(fmt.Sprintf("error while parsing mode: %v", err)) + + var beforeH, beforeR, beforeT, beforeC uint64 + if v := f.Uint64(PruneHistoryBeforeFlag.Name, PruneHistoryBeforeFlag.Value, PruneHistoryBeforeFlag.Usage); v != nil { + beforeH = *v } - cfg.Prune = mode - } - if v := f.String(SnapshotModeFlag.Name, SnapshotModeFlag.Value, SnapshotModeFlag.Usage); v != nil { - snMode, err := snapshotsync.SnapshotModeFromString(*v) + if v := f.Uint64(PruneReceiptBeforeFlag.Name, PruneReceiptBeforeFlag.Value, PruneReceiptBeforeFlag.Usage); v != nil { + beforeR = *v + } + if v := f.Uint64(PruneTxIndexBeforeFlag.Name, PruneTxIndexBeforeFlag.Value, PruneTxIndexBeforeFlag.Usage); v != nil { + beforeT = *v + } + if v := f.Uint64(PruneCallTracesBeforeFlag.Name, PruneCallTracesBeforeFlag.Value, PruneCallTracesBeforeFlag.Usage); v != nil { + beforeC = *v + } + + mode, err := prune.FromCli(*v, exactH, exactR, exactT, exactC, beforeH, beforeR, beforeT, beforeC, experiments) if err != nil { utils.Fatalf(fmt.Sprintf("error while parsing mode: %v", err)) } - cfg.Snapshot.Mode = snMode - } - if v := f.Bool(SeedSnapshotsFlag.Name, false, SeedSnapshotsFlag.Usage); v != nil { - cfg.Snapshot.Seeding = *v + cfg.Prune = mode } if v := f.String(BatchSizeFlag.Name, BatchSizeFlag.Value, BatchSizeFlag.Usage); v != nil { err := cfg.BatchSize.UnmarshalText([]byte(*v)) @@ -261,22 +265,80 @@ func ApplyFlagsForEthConfigCobra(f *pflag.FlagSet, cfg *ethconfig.Config) { etl.BufferOptimalSize = *size } - if v := f.String(ExternalSnapshotDownloaderAddrFlag.Name, ExternalSnapshotDownloaderAddrFlag.Value, ExternalSnapshotDownloaderAddrFlag.Usage); v != nil { - cfg.ExternalSnapshotDownloaderAddr = *v - } - if v := f.Bool(StateStreamFlag.Name, false, StateStreamFlag.Usage); v != nil { - cfg.StateStream = *v + cfg.StateStream = true + if v := f.Bool(StateStreamDisableFlag.Name, false, StateStreamDisableFlag.Usage); v != nil { + cfg.StateStream = false } } -func ApplyFlagsForNodeConfig(ctx *cli.Context, cfg *node.Config) { +func ApplyFlagsForNodeConfig(ctx *cli.Context, cfg *nodecfg.Config) { setPrivateApi(ctx, cfg) + setEmbeddedRpcDaemon(ctx, cfg) cfg.DatabaseVerbosity = kv.DBVerbosityLvl(ctx.GlobalInt(DatabaseVerbosityFlag.Name)) } +func setEmbeddedRpcDaemon(ctx *cli.Context, cfg *nodecfg.Config) { + jwtSecretPath := ctx.GlobalString(utils.JWTSecretPath.Name) + if jwtSecretPath == "" { + jwtSecretPath = cfg.DataDir + "/jwt.hex" + } + c := &httpcfg.HttpCfg{ + Enabled: ctx.GlobalBool(utils.HTTPEnabledFlag.Name), + DataDir: cfg.DataDir, + Chaindata: filepath.Join(cfg.DataDir, "chaindata"), + + TLSKeyFile: cfg.TLSKeyFile, + TLSCACert: cfg.TLSCACert, + TLSCertfile: cfg.TLSCertFile, + + HttpListenAddress: ctx.GlobalString(utils.HTTPListenAddrFlag.Name), + HttpPort: ctx.GlobalInt(utils.HTTPPortFlag.Name), + EngineHTTPListenAddress: ctx.GlobalString(utils.EngineAddr.Name), + EnginePort: ctx.GlobalInt(utils.EnginePort.Name), + JWTSecretPath: jwtSecretPath, + HttpCORSDomain: strings.Split(ctx.GlobalString(utils.HTTPCORSDomainFlag.Name), ","), + HttpVirtualHost: strings.Split(ctx.GlobalString(utils.HTTPVirtualHostsFlag.Name), ","), + API: strings.Split(ctx.GlobalString(utils.HTTPApiFlag.Name), ","), + + WebsocketEnabled: ctx.GlobalIsSet(utils.WSEnabledFlag.Name), + RpcBatchConcurrency: ctx.GlobalUint(utils.RpcBatchConcurrencyFlag.Name), + DBReadConcurrency: ctx.GlobalInt(utils.DBReadConcurrencyFlag.Name), + RpcAllowListFilePath: ctx.GlobalString(utils.RpcAccessListFlag.Name), + Gascap: ctx.GlobalUint64(utils.RpcGasCapFlag.Name), + MaxTraces: ctx.GlobalUint64(utils.TraceMaxtracesFlag.Name), + TraceCompatibility: ctx.GlobalBool(utils.RpcTraceCompatFlag.Name), + StarknetGRPCAddress: ctx.GlobalString(utils.StarknetGrpcAddressFlag.Name), + TevmEnabled: ctx.GlobalBool(utils.TevmFlag.Name), + + TxPoolApiAddr: ctx.GlobalString(utils.TxpoolApiAddrFlag.Name), + + StateCache: kvcache.DefaultCoherentConfig, + } + if ctx.GlobalIsSet(utils.HttpCompressionFlag.Name) { + c.HttpCompression = ctx.GlobalBool(utils.HttpCompressionFlag.Name) + } else { + c.HttpCompression = true + } + if ctx.GlobalIsSet(utils.WsCompressionFlag.Name) { + c.WebsocketCompression = ctx.GlobalBool(utils.WsCompressionFlag.Name) + } else { + c.WebsocketCompression = true + } + + c.StateCache.CodeKeysLimit = ctx.GlobalInt(utils.StateCacheFlag.Name) + + /* + rootCmd.PersistentFlags().BoolVar(&cfg.GRPCServerEnabled, "grpc", false, "Enable GRPC server") + rootCmd.PersistentFlags().StringVar(&cfg.GRPCListenAddress, "grpc.addr", node.DefaultGRPCHost, "GRPC server listening interface") + rootCmd.PersistentFlags().IntVar(&cfg.GRPCPort, "grpc.port", node.DefaultGRPCPort, "GRPC server listening port") + rootCmd.PersistentFlags().BoolVar(&cfg.GRPCHealthCheckEnabled, "grpc.healthcheck", false, "Enable GRPC health check") + */ + cfg.Http = *c +} + // setPrivateApi populates configuration fields related to the remote -// read-only interface to the databae -func setPrivateApi(ctx *cli.Context, cfg *node.Config) { +// read-only interface to the database +func setPrivateApi(ctx *cli.Context, cfg *nodecfg.Config) { cfg.PrivateApiAddr = ctx.GlobalString(PrivateApiAddr.Name) cfg.PrivateApiRateLimit = uint32(ctx.GlobalUint64(PrivateApiRateLimit.Name)) maxRateLimit := uint32(kv.ReadersLimit - 128) // leave some readers for P2P @@ -299,4 +361,5 @@ func setPrivateApi(ctx *cli.Context, cfg *node.Config) { cfg.TLSKeyFile = keyFile cfg.TLSCACert = ctx.GlobalString(TLSCACertFlag.Name) } + cfg.HealthCheck = ctx.GlobalBool(HealthCheckFlag.Name) } diff --git a/turbo/cli/make_app.go b/turbo/cli/make_app.go deleted file mode 100644 index a5a439b6173..00000000000 --- a/turbo/cli/make_app.go +++ /dev/null @@ -1,28 +0,0 @@ -// Package cli contains framework for building a command-line based Erigon node. -package cli - -import ( - "github.com/ledgerwatch/erigon/internal/debug" - "github.com/ledgerwatch/erigon/internal/flags" - - "github.com/urfave/cli" -) - -// MakeApp creates a cli application (based on `github.com/urlfave/cli` package). -// The application exits when `action` returns. -// Parameters: -// * action: the main function for the application. receives `*cli.Context` with parsed command-line flags. Returns no error, if some error could not be recovered from write to the log or panic. -// * cliFlags: the list of flags `cli.Flag` that the app should set and parse. By default, use `DefaultFlags()`. If you want to specify your own flag, use `append(DefaultFlags(), myFlag)` for this parameter. -func MakeApp(action func(*cli.Context), cliFlags []cli.Flag) *cli.App { - app := flags.NewApp("", "", "erigon experimental cli") - app.Action = action - app.Flags = append(cliFlags, debug.Flags...) // debug flags are required - app.Before = func(ctx *cli.Context) error { - return debug.Setup(ctx) - } - app.After = func(ctx *cli.Context) error { - debug.Exit() - return nil - } - return app -} diff --git a/turbo/engineapi/request_list.go b/turbo/engineapi/request_list.go new file mode 100644 index 00000000000..9e36560e1e7 --- /dev/null +++ b/turbo/engineapi/request_list.go @@ -0,0 +1,167 @@ +package engineapi + +import ( + "sync" + "sync/atomic" + + "github.com/emirpasic/gods/maps/treemap" + + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" +) + +// The message we are going to send to the stage sync in NewPayload +type PayloadMessage struct { + Header *types.Header + Body *types.RawBody +} + +// The message we are going to send to the stage sync in ForkchoiceUpdated +type ForkChoiceMessage struct { + HeadBlockHash common.Hash + SafeBlockHash common.Hash + FinalizedBlockHash common.Hash +} + +type RequestStatus int + +const ( // RequestStatus values + New = iota + DataWasMissing +) + +type RequestWithStatus struct { + Message interface{} // *PayloadMessage or *ForkChoiceMessage + Status RequestStatus +} + +type Interrupt int + +const ( // Interrupt values + None = iota + Yield // e.g. yield RW transaction to block building + Synced + Stopping +) + +type RequestList struct { + requestId int + requests *treemap.Map // map[int]*RequestWithStatus + interrupt Interrupt + waiting uint32 + syncCond *sync.Cond +} + +func NewRequestList() *RequestList { + rl := &RequestList{ + requests: treemap.NewWithIntComparator(), + syncCond: sync.NewCond(&sync.Mutex{}), + } + return rl +} + +func (rl *RequestList) AddPayloadRequest(message *PayloadMessage) { + rl.syncCond.L.Lock() + defer rl.syncCond.L.Unlock() + + rl.requestId++ + + rl.requests.Put(rl.requestId, &RequestWithStatus{ + Message: message, + Status: New, + }) + + rl.syncCond.Broadcast() +} + +func (rl *RequestList) AddForkChoiceRequest(message *ForkChoiceMessage) { + rl.syncCond.L.Lock() + defer rl.syncCond.L.Unlock() + + rl.requestId++ + + // purge previous fork choices that are still syncing + rl.requests = rl.requests.Select(func(key interface{}, value interface{}) bool { + req := value.(*RequestWithStatus) + _, isForkChoice := req.Message.(*ForkChoiceMessage) + return req.Status == New || !isForkChoice + }) + // TODO(yperbasis): potentially purge some non-syncing old fork choices? + + rl.requests.Put(rl.requestId, &RequestWithStatus{ + Message: message, + Status: New, + }) + + rl.syncCond.Broadcast() +} + +func (rl *RequestList) firstRequest(onlyNew bool) (id int, request *RequestWithStatus) { + foundKey, foundValue := rl.requests.Min() + if onlyNew { + foundKey, foundValue = rl.requests.Find(func(key interface{}, value interface{}) bool { + return value.(*RequestWithStatus).Status == New + }) + } + if foundKey != nil { + return foundKey.(int), foundValue.(*RequestWithStatus) + } + return 0, nil +} + +func (rl *RequestList) WaitForRequest(onlyNew bool) (interrupt Interrupt, id int, request *RequestWithStatus) { + rl.syncCond.L.Lock() + defer rl.syncCond.L.Unlock() + + atomic.StoreUint32(&rl.waiting, 1) + defer atomic.StoreUint32(&rl.waiting, 0) + + for { + interrupt = rl.interrupt + if interrupt != None { + if interrupt != Stopping { + // clear the interrupt + rl.interrupt = None + } + return + } + id, request = rl.firstRequest(onlyNew) + if request != nil { + return + } + rl.syncCond.Wait() + } +} + +func (rl *RequestList) IsWaiting() bool { + return atomic.LoadUint32(&rl.waiting) != 0 +} + +func (rl *RequestList) Interrupt(kind Interrupt) { + rl.syncCond.L.Lock() + defer rl.syncCond.L.Unlock() + + rl.interrupt = kind + + rl.syncCond.Broadcast() +} + +func (rl *RequestList) Remove(id int) { + rl.syncCond.L.Lock() + defer rl.syncCond.L.Unlock() + + rl.requests.Remove(id) + // no need to broadcast +} + +func (rl *RequestList) SetStatus(id int, status RequestStatus) { + rl.syncCond.L.Lock() + defer rl.syncCond.L.Unlock() + + value, found := rl.requests.Get(id) + if found { + value.(*RequestWithStatus).Status = status + } + + rl.syncCond.Broadcast() +} diff --git a/turbo/mock/txpool.go b/turbo/mock/txpool.go index 4bc70646c38..68ae9acba64 100644 --- a/turbo/mock/txpool.go +++ b/turbo/mock/txpool.go @@ -98,6 +98,15 @@ func (p *TestTxPool) Content() (map[common.Address]types.Transactions, map[commo return batches, nil } +// CountContent returns the number of pending and queued transactions +// in the transaction pool. +func (p *TestTxPool) CountContent() (pending uint, queued uint) { + p.lock.RLock() + defer p.lock.RUnlock() + pending = uint(len(p.pool)) + return +} + // SubscribeNewTxsEvent should return an event subscription of NewTxsEvent and // send events to the given channel. func (p *TestTxPool) SubscribeNewTxsEvent(ch chan<- core.NewTxsEvent) event.Subscription { diff --git a/turbo/node/node.go b/turbo/node/node.go index ecc33886b71..eb9620f78e2 100644 --- a/turbo/node/node.go +++ b/turbo/node/node.go @@ -3,13 +3,16 @@ package node import ( "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/node/nodecfg" + "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/cmd/utils" "github.com/ledgerwatch/erigon/eth" "github.com/ledgerwatch/erigon/eth/ethconfig" "github.com/ledgerwatch/erigon/node" "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/params/networkname" erigoncli "github.com/ledgerwatch/erigon/turbo/cli" - "github.com/ledgerwatch/log/v3" "github.com/urfave/cli" ) @@ -36,7 +39,7 @@ func (eri *ErigonNode) run() { utils.StartNode(eri.stack) // we don't have accounts locally and we don't do mining // so these parts are ignored - // see cmd/geth/main.go#startNode for full implementation + // see cmd/geth/daemon.go#startNode for full implementation } // Params contains optional parameters for creating a node. @@ -48,23 +51,29 @@ type Params struct { CustomBuckets kv.TableCfg } -func NewNodConfigUrfave(ctx *cli.Context) *node.Config { +func NewNodConfigUrfave(ctx *cli.Context) *nodecfg.Config { // If we're running a known preset, log it for convenience. chain := ctx.GlobalString(utils.ChainFlag.Name) switch chain { - case params.RopstenChainName: + case networkname.SepoliaChainName: + log.Info("Starting Erigon on Sepolia testnet...") + case networkname.RopstenChainName: log.Info("Starting Erigon on Ropsten testnet...") - - case params.RinkebyChainName: + case networkname.RinkebyChainName: log.Info("Starting Erigon on Rinkeby testnet...") - - case params.GoerliChainName: + case networkname.GoerliChainName: log.Info("Starting Erigon on Görli testnet...") - - case params.DevChainName: + case networkname.BSCChainName: + log.Info("Starting Erigon on BSC mainnet...") + case networkname.ChapelChainName: + log.Info("Starting Erigon on Chapel testnet...") + case networkname.RialtoChainName: + log.Info("Starting Erigon on Chapel testnet...") + case networkname.DevChainName: log.Info("Starting Erigon in ephemeral dev mode...") - - case "", params.MainnetChainName: + case networkname.BorMainnetChainName: + log.Info("Starting Erigon on Bor Mainnet") + case "", networkname.MainnetChainName: if !ctx.GlobalIsSet(utils.NetworkIdFlag.Name) { log.Info("Starting Erigon on Ethereum mainnet...") } @@ -77,10 +86,11 @@ func NewNodConfigUrfave(ctx *cli.Context) *node.Config { erigoncli.ApplyFlagsForNodeConfig(ctx, nodeConfig) return nodeConfig } -func NewEthConfigUrfave(ctx *cli.Context, nodeConfig *node.Config) *ethconfig.Config { +func NewEthConfigUrfave(ctx *cli.Context, nodeConfig *nodecfg.Config) *ethconfig.Config { ethConfig := ðconfig.Defaults utils.SetEthConfig(ctx, nodeConfig, ethConfig) erigoncli.ApplyFlagsForEthConfig(ctx, ethConfig) + return ethConfig } @@ -89,7 +99,7 @@ func NewEthConfigUrfave(ctx *cli.Context, nodeConfig *node.Config) *ethconfig.Co // * sync - `stagedsync.StagedSync`, an instance of staged sync, setup just as needed. // * optionalParams - additional parameters for running a node. func New( - nodeConfig *node.Config, + nodeConfig *nodecfg.Config, ethConfig *ethconfig.Config, logger log.Logger, ) (*ErigonNode, error) { @@ -107,8 +117,8 @@ func RegisterEthService(stack *node.Node, cfg *ethconfig.Config, logger log.Logg return eth.New(stack, cfg, logger) } -func NewNodeConfig() *node.Config { - nodeConfig := node.DefaultConfig +func NewNodeConfig() *nodecfg.Config { + nodeConfig := nodecfg.DefaultConfig // see simiar changes in `cmd/geth/config.go#defaultNodeConfig` if commit := params.GitCommit; commit != "" { nodeConfig.Version = params.VersionWithCommit(commit, "") @@ -120,7 +130,11 @@ func NewNodeConfig() *node.Config { return &nodeConfig } -func makeConfigNode(config *node.Config) *node.Node { +func MakeConfigNodeDefault() *node.Node { + return makeConfigNode(NewNodeConfig()) +} + +func makeConfigNode(config *nodecfg.Config) *node.Node { stack, err := node.New(config) if err != nil { utils.Fatalf("Failed to create Erigon node: %v", err) diff --git a/turbo/remote/sentry_client.go b/turbo/remote/sentry_client.go deleted file mode 100644 index 070f2a96b78..00000000000 --- a/turbo/remote/sentry_client.go +++ /dev/null @@ -1,227 +0,0 @@ -package remote - -import ( - "context" - "fmt" - "sync" - - "github.com/golang/protobuf/ptypes/empty" - proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/log/v3" - - "google.golang.org/grpc" -) - -type SentryClient interface { - proto_sentry.SentryClient - Protocol() uint - Ready() bool - MarkDisconnected() -} - -type SentryClientRemote struct { - proto_sentry.SentryClient - mu sync.RWMutex - protocol uint - ready bool -} - -// NewSentryClientRemote - app code must use this class -// to avoid concurrency - it accepts protocol (which received async by SetStatus) in constructor, -// means app can't use client which protocol unknown yet -func NewSentryClientRemote(client proto_sentry.SentryClient) *SentryClientRemote { - return &SentryClientRemote{SentryClient: client} -} - -func (c *SentryClientRemote) Protocol() uint { - c.mu.RLock() - defer c.mu.RUnlock() - return c.protocol -} - -func (c *SentryClientRemote) Ready() bool { - c.mu.RLock() - defer c.mu.RUnlock() - return c.ready -} - -func (c *SentryClientRemote) MarkDisconnected() { - c.mu.Lock() - defer c.mu.Unlock() - c.ready = false -} - -func (c *SentryClientRemote) SetStatus(ctx context.Context, in *proto_sentry.StatusData, opts ...grpc.CallOption) (*proto_sentry.SetStatusReply, error) { - reply, err := c.SentryClient.SetStatus(ctx, in, opts...) - if err != nil { - return nil, err - } - - c.mu.Lock() - defer c.mu.Unlock() - switch reply.Protocol { - case proto_sentry.Protocol_ETH65: - c.protocol = eth.ETH65 - case proto_sentry.Protocol_ETH66: - c.protocol = eth.ETH66 - default: - return nil, fmt.Errorf("unexpected protocol: %d", reply.Protocol) - } - c.ready = true - return reply, nil -} - -func (c *SentryClientRemote) Messages(ctx context.Context, in *proto_sentry.MessagesRequest, opts ...grpc.CallOption) (proto_sentry.Sentry_MessagesClient, error) { - in.Ids = filterIds(in.Ids, c.Protocol()) - return c.SentryClient.Messages(ctx, in, opts...) -} - -func (c *SentryClientRemote) PeerCount(ctx context.Context, in *proto_sentry.PeerCountRequest, opts ...grpc.CallOption) (*proto_sentry.PeerCountReply, error) { - return c.SentryClient.PeerCount(ctx, in) -} - -// Contains implementations of SentryServer, SentryClient, ControlClient, and ControlServer, that may be linked to each other -// SentryClient is linked directly to the SentryServer, for example, so any function call on the instance of the SentryClient -// cause invocations directly on the corresponding instance of the SentryServer. However, the link between SentryClient and -// SentryServer is established outside of the constructor. This means that the reference from the SentyClient to the corresponding -// SentryServer can be injected at any point in time. - -// SentryClientDirect implements SentryClient interface by connecting the instance of the client directly with the corresponding -// instance of SentryServer -type SentryClientDirect struct { - protocol uint - server proto_sentry.SentryServer -} - -func NewSentryClientDirect(protocol uint, sentryServer proto_sentry.SentryServer) *SentryClientDirect { - return &SentryClientDirect{protocol: protocol, server: sentryServer} -} - -func (c *SentryClientDirect) Protocol() uint { return c.protocol } -func (c *SentryClientDirect) Ready() bool { return true } -func (c *SentryClientDirect) MarkDisconnected() {} - -func (c *SentryClientDirect) PenalizePeer(ctx context.Context, in *proto_sentry.PenalizePeerRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - return c.server.PenalizePeer(ctx, in) -} - -func (c *SentryClientDirect) PeerMinBlock(ctx context.Context, in *proto_sentry.PeerMinBlockRequest, opts ...grpc.CallOption) (*empty.Empty, error) { - return c.server.PeerMinBlock(ctx, in) -} - -func (c *SentryClientDirect) SendMessageByMinBlock(ctx context.Context, in *proto_sentry.SendMessageByMinBlockRequest, opts ...grpc.CallOption) (*proto_sentry.SentPeers, error) { - return c.server.SendMessageByMinBlock(ctx, in) -} - -func (c *SentryClientDirect) SendMessageById(ctx context.Context, in *proto_sentry.SendMessageByIdRequest, opts ...grpc.CallOption) (*proto_sentry.SentPeers, error) { - return c.server.SendMessageById(ctx, in) -} - -func (c *SentryClientDirect) SendMessageToRandomPeers(ctx context.Context, in *proto_sentry.SendMessageToRandomPeersRequest, opts ...grpc.CallOption) (*proto_sentry.SentPeers, error) { - return c.server.SendMessageToRandomPeers(ctx, in) -} - -func (c *SentryClientDirect) SendMessageToAll(ctx context.Context, in *proto_sentry.OutboundMessageData, opts ...grpc.CallOption) (*proto_sentry.SentPeers, error) { - return c.server.SendMessageToAll(ctx, in) -} - -func (c *SentryClientDirect) SetStatus(ctx context.Context, in *proto_sentry.StatusData, opts ...grpc.CallOption) (*proto_sentry.SetStatusReply, error) { - return c.server.SetStatus(ctx, in) -} - -func (c *SentryClientDirect) PeerCount(ctx context.Context, in *proto_sentry.PeerCountRequest, opts ...grpc.CallOption) (*proto_sentry.PeerCountReply, error) { - return c.server.PeerCount(ctx, in) -} - -// implements proto_sentry.Sentry_ReceiveMessagesServer -type SentryReceiveServerDirect struct { - messageCh chan *proto_sentry.InboundMessage - ctx context.Context - grpc.ServerStream -} - -func (s *SentryReceiveServerDirect) Send(m *proto_sentry.InboundMessage) error { - s.messageCh <- m - return nil -} -func (s *SentryReceiveServerDirect) Context() context.Context { - return s.ctx -} - -type SentryReceiveClientDirect struct { - messageCh chan *proto_sentry.InboundMessage - ctx context.Context - grpc.ClientStream -} - -func (c *SentryReceiveClientDirect) Recv() (*proto_sentry.InboundMessage, error) { - m := <-c.messageCh - return m, nil -} -func (c *SentryReceiveClientDirect) Context() context.Context { - return c.ctx -} - -// implements proto_sentry.Sentry_ReceivePeersServer -type SentryReceivePeersServerDirect struct { - ch chan *proto_sentry.PeersReply - ctx context.Context - grpc.ServerStream -} - -func (s *SentryReceivePeersServerDirect) Send(m *proto_sentry.PeersReply) error { - s.ch <- m - return nil -} -func (s *SentryReceivePeersServerDirect) Context() context.Context { - return s.ctx -} - -type SentryReceivePeersClientDirect struct { - ch chan *proto_sentry.PeersReply - ctx context.Context - grpc.ClientStream -} - -func (c *SentryReceivePeersClientDirect) Recv() (*proto_sentry.PeersReply, error) { - m := <-c.ch - return m, nil -} -func (c *SentryReceivePeersClientDirect) Context() context.Context { - return c.ctx -} - -func (c *SentryClientDirect) Messages(ctx context.Context, in *proto_sentry.MessagesRequest, opts ...grpc.CallOption) (proto_sentry.Sentry_MessagesClient, error) { - in.Ids = filterIds(in.Ids, c.Protocol()) - messageCh := make(chan *proto_sentry.InboundMessage, 16384) - streamServer := &SentryReceiveServerDirect{messageCh: messageCh, ctx: ctx} - go func() { - if err := c.server.Messages(in, streamServer); err != nil { - log.Error("ReceiveMessages returned", "error", err) - } - close(messageCh) - }() - return &SentryReceiveClientDirect{messageCh: messageCh, ctx: ctx}, nil -} - -func (c *SentryClientDirect) Peers(ctx context.Context, in *proto_sentry.PeersRequest, opts ...grpc.CallOption) (proto_sentry.Sentry_PeersClient, error) { - messageCh := make(chan *proto_sentry.PeersReply, 16384) - streamServer := &SentryReceivePeersServerDirect{ch: messageCh, ctx: ctx} - go func() { - if err := c.server.Peers(in, streamServer); err != nil { - log.Error("ReceiveMessages returned", "error", err) - } - close(messageCh) - }() - return &SentryReceivePeersClientDirect{ch: messageCh, ctx: ctx}, nil -} - -func filterIds(in []proto_sentry.MessageId, protocol uint) (filtered []proto_sentry.MessageId) { - for _, id := range in { - if _, ok := eth.FromProto[protocol][id]; ok { - filtered = append(filtered, id) - } - } - return filtered -} diff --git a/turbo/rlphacks/bytes_test.go b/turbo/rlphacks/bytes_test.go index 312bda7d804..af2f825cb0a 100644 --- a/turbo/rlphacks/bytes_test.go +++ b/turbo/rlphacks/bytes_test.go @@ -1,3 +1,5 @@ +//go:build integration + package rlphacks import ( diff --git a/turbo/rpchelper/helper.go b/turbo/rpchelper/helper.go index 4014c7237da..0227d156056 100644 --- a/turbo/rpchelper/helper.go +++ b/turbo/rpchelper/helper.go @@ -1,12 +1,15 @@ package rpchelper import ( + "context" "fmt" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types/accounts" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/rpc" @@ -22,17 +25,25 @@ func (e nonCanonocalHashError) Error() string { return fmt.Sprintf("hash %x is not currently canonical", e.hash) } -func GetBlockNumber(blockNrOrHash rpc.BlockNumberOrHash, tx kv.Tx, filters *filters.Filters) (uint64, common.Hash, error) { - var blockNumber uint64 - var err error - hash, ok := blockNrOrHash.Hash() +func GetBlockNumber(blockNrOrHash rpc.BlockNumberOrHash, tx kv.Tx, filters *rpcservices.Filters) (uint64, common.Hash, bool, error) { + return _GetBlockNumber(blockNrOrHash.RequireCanonical, blockNrOrHash, tx, filters) +} + +func GetCanonicalBlockNumber(blockNrOrHash rpc.BlockNumberOrHash, tx kv.Tx, filters *rpcservices.Filters) (uint64, common.Hash, bool, error) { + return _GetBlockNumber(true, blockNrOrHash, tx, filters) +} + +func _GetBlockNumber(requireCanonical bool, blockNrOrHash rpc.BlockNumberOrHash, tx kv.Tx, filters *rpcservices.Filters) (blockNumber uint64, hash common.Hash, latest bool, err error) { + var latestBlockNumber uint64 + if latestBlockNumber, err = stages.GetStageProgress(tx, stages.Execution); err != nil { + return 0, common.Hash{}, false, fmt.Errorf("getting latest block number: %w", err) + } + var ok bool + hash, ok = blockNrOrHash.Hash() if !ok { number := *blockNrOrHash.BlockNumber if number == rpc.LatestBlockNumber { - blockNumber, err = stages.GetStageProgress(tx, stages.Execution) - if err != nil { - return 0, common.Hash{}, fmt.Errorf("getting latest block number: %w", err) - } + blockNumber = latestBlockNumber } else if number == rpc.EarliestBlockNumber { blockNumber = 0 } else if number == rpc.PendingBlockNumber { @@ -40,37 +51,55 @@ func GetBlockNumber(blockNrOrHash rpc.BlockNumberOrHash, tx kv.Tx, filters *filt if pendingBlock == nil { blockNumber, err = stages.GetStageProgress(tx, stages.Execution) if err != nil { - return 0, common.Hash{}, fmt.Errorf("getting latest block number: %w", err) + return 0, common.Hash{}, false, fmt.Errorf("getting latest block number: %w", err) } } else { - return pendingBlock.NumberU64(), pendingBlock.Hash(), nil + return pendingBlock.NumberU64(), pendingBlock.Hash(), false, nil } } else { blockNumber = uint64(number.Int64()) } hash, err = rawdb.ReadCanonicalHash(tx, blockNumber) if err != nil { - return 0, common.Hash{}, err + return 0, common.Hash{}, false, err } } else { number := rawdb.ReadHeaderNumber(tx, hash) if number == nil { - return 0, common.Hash{}, fmt.Errorf("block %x not found", hash) + return 0, common.Hash{}, false, fmt.Errorf("block %x not found", hash) } blockNumber = *number ch, err := rawdb.ReadCanonicalHash(tx, blockNumber) if err != nil { - return 0, common.Hash{}, err + return 0, common.Hash{}, false, err } - if blockNrOrHash.RequireCanonical && ch != hash { - return 0, common.Hash{}, nonCanonocalHashError{hash} + if requireCanonical && ch != hash { + return 0, common.Hash{}, false, nonCanonocalHashError{hash} } } - return blockNumber, hash, nil + return blockNumber, hash, blockNumber == latestBlockNumber, nil } func GetAccount(tx kv.Tx, blockNumber uint64, address common.Address) (*accounts.Account, error) { reader := adapter.NewStateReader(tx, blockNumber) return reader.ReadAccountData(address) } + +func CreateStateReader(ctx context.Context, tx kv.Tx, blockNrOrHash rpc.BlockNumberOrHash, filters *rpcservices.Filters, stateCache kvcache.Cache) (state.StateReader, error) { + blockNumber, _, latest, err := _GetBlockNumber(true, blockNrOrHash, tx, filters) + if err != nil { + return nil, err + } + var stateReader state.StateReader + if latest { + cacheView, err := stateCache.View(ctx, tx) + if err != nil { + return nil, err + } + stateReader = state.NewCachedReader2(cacheView, tx) + } else { + stateReader = state.NewPlainState(tx, blockNumber+1) + } + return stateReader, nil +} diff --git a/turbo/services/interfaces.go b/turbo/services/interfaces.go new file mode 100644 index 00000000000..8bbfacd2b86 --- /dev/null +++ b/turbo/services/interfaces.go @@ -0,0 +1,57 @@ +package services + +import ( + "context" + + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rlp" +) + +type All struct { + BlockReader FullBlockReader +} + +type BlockReader interface { + BlockWithSenders(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (block *types.Block, senders []common.Address, err error) +} + +type HeaderReader interface { + Header(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (*types.Header, error) + HeaderByNumber(ctx context.Context, tx kv.Getter, blockHeight uint64) (*types.Header, error) + HeaderByHash(ctx context.Context, tx kv.Getter, hash common.Hash) (*types.Header, error) +} + +type CanonicalReader interface { + CanonicalHash(ctx context.Context, tx kv.Getter, blockHeight uint64) (common.Hash, error) +} + +type BodyReader interface { + BodyWithTransactions(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) + BodyRlp(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (bodyRlp rlp.RawValue, err error) + Body(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) +} + +type TxnReader interface { + TxnLookup(ctx context.Context, tx kv.Getter, txnHash common.Hash) (uint64, bool, error) + //TxnByIdxInBlock(ctx context.Context, tx kv.Getter, blockNum uint64, i int) (txn types.Transaction, err error) +} +type HeaderAndCanonicalReader interface { + HeaderReader + CanonicalReader +} + +type BlockAndTxnReader interface { + BlockReader + //HeaderReader + TxnReader +} + +type FullBlockReader interface { + BlockReader + BodyReader + HeaderReader + TxnReader + CanonicalReader +} diff --git a/turbo/shards/state_change_accumulator.go b/turbo/shards/state_change_accumulator.go index 9e0ae5246db..9fdf9f0b8dc 100644 --- a/turbo/shards/state_change_accumulator.go +++ b/turbo/shards/state_change_accumulator.go @@ -1,30 +1,54 @@ package shards import ( + "context" + + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/gointerfaces" "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/params" ) // Accumulator collects state changes in a form that can then be delivered to the RPC daemon type Accumulator struct { - changes []remote.StateChange + viewID uint64 // mdbx's txID + chainConfig *params.ChainConfig + changes []*remote.StateChange latestChange *remote.StateChange accountChangeIndex map[common.Address]int // For the latest changes, allows finding account change by account's address storageChangeIndex map[common.Address]map[common.Hash]int } -func (a *Accumulator) Reset() { +func NewAccumulator(chainConfig *params.ChainConfig) *Accumulator { + return &Accumulator{chainConfig: chainConfig} +} + +type StateChangeConsumer interface { + SendStateChanges(ctx context.Context, sc *remote.StateChangeBatch) +} + +func (a *Accumulator) Reset(viewID uint64) { a.changes = nil a.latestChange = nil a.accountChangeIndex = nil a.storageChangeIndex = nil + a.viewID = viewID +} +func (a *Accumulator) ChainConfig() *params.ChainConfig { return a.chainConfig } +func (a *Accumulator) SendAndReset(ctx context.Context, c StateChangeConsumer, pendingBaseFee uint64, blockGasLimit uint64) { + if a == nil || c == nil || len(a.changes) == 0 { + return + } + sc := &remote.StateChangeBatch{DatabaseViewID: a.viewID, ChangeBatch: a.changes, PendingBlockBaseFee: pendingBaseFee, BlockGasLimit: blockGasLimit} + c.SendStateChanges(ctx, sc) + a.Reset(0) // reset here for GC, but there will be another Reset with correct viewID } -// StartChanges begins accumulation of changes for a new block -func (a *Accumulator) StartChange(blockHeight uint64, blockHash common.Hash, unwind bool) { - a.changes = append(a.changes, remote.StateChange{}) - a.latestChange = &a.changes[len(a.changes)-1] +// StartChange begins accumulation of changes for a new block +func (a *Accumulator) StartChange(blockHeight uint64, blockHash common.Hash, txs [][]byte, unwind bool) { + a.changes = append(a.changes, &remote.StateChange{}) + a.latestChange = a.changes[len(a.changes)-1] a.latestChange.BlockHeight = blockHeight a.latestChange.BlockHash = gointerfaces.ConvertHashToH256(blockHash) if unwind { @@ -34,15 +58,21 @@ func (a *Accumulator) StartChange(blockHeight uint64, blockHash common.Hash, unw } a.accountChangeIndex = make(map[common.Address]int) a.storageChangeIndex = make(map[common.Address]map[common.Hash]int) + if txs != nil { + a.latestChange.Txs = make([][]byte, len(txs)) + for i := range txs { + a.latestChange.Txs[i] = libcommon.Copy(txs[i]) + } + } } -// ChangeAction adds modification of account balance or nonce (or both) to the latest change -func (a *Accumulator) ChangeAccount(address common.Address, data []byte) { +// ChangeAccount adds modification of account balance or nonce (or both) to the latest change +func (a *Accumulator) ChangeAccount(address common.Address, incarnation uint64, data []byte) { i, ok := a.accountChangeIndex[address] - if !ok { + if !ok || incarnation > a.latestChange.Changes[i].Incarnation { // Account has not been changed in the latest block yet i = len(a.latestChange.Changes) - a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{}) + a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{Address: gointerfaces.ConvertAddressToH160(address)}) a.accountChangeIndex[address] = i } accountChange := a.latestChange.Changes[i] @@ -54,6 +84,7 @@ func (a *Accumulator) ChangeAccount(address common.Address, data []byte) { case remote.Action_DELETE: panic("") } + accountChange.Incarnation = incarnation accountChange.Data = data } @@ -63,7 +94,7 @@ func (a *Accumulator) DeleteAccount(address common.Address) { if !ok { // Account has not been changed in the latest block yet i = len(a.latestChange.Changes) - a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{}) + a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{Address: gointerfaces.ConvertAddressToH160(address)}) a.accountChangeIndex[address] = i } accountChange := a.latestChange.Changes[i] @@ -79,10 +110,10 @@ func (a *Accumulator) DeleteAccount(address common.Address) { // ChangeCode adds code to the latest change func (a *Accumulator) ChangeCode(address common.Address, incarnation uint64, code []byte) { i, ok := a.accountChangeIndex[address] - if !ok { + if !ok || incarnation > a.latestChange.Changes[i].Incarnation { // Account has not been changed in the latest block yet i = len(a.latestChange.Changes) - a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{}) + a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{Address: gointerfaces.ConvertAddressToH160(address), Action: remote.Action_CODE}) a.accountChangeIndex[address] = i } accountChange := a.latestChange.Changes[i] @@ -100,10 +131,10 @@ func (a *Accumulator) ChangeCode(address common.Address, incarnation uint64, cod func (a *Accumulator) ChangeStorage(address common.Address, incarnation uint64, location common.Hash, data []byte) { i, ok := a.accountChangeIndex[address] - if !ok { + if !ok || incarnation > a.latestChange.Changes[i].Incarnation { // Account has not been changed in the latest block yet i = len(a.latestChange.Changes) - a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{}) + a.latestChange.Changes = append(a.latestChange.Changes, &remote.AccountChange{Address: gointerfaces.ConvertAddressToH160(address), Action: remote.Action_STORAGE}) a.accountChangeIndex[address] = i } accountChange := a.latestChange.Changes[i] diff --git a/turbo/shards/trie_cache.go b/turbo/shards/trie_cache.go index 5aab7320824..295d16ca88f 100644 --- a/turbo/shards/trie_cache.go +++ b/turbo/shards/trie_cache.go @@ -212,9 +212,7 @@ func (sc *StateCache) SetAccountHashesRead(prefix []byte, hasState, hasTree, has assertSubset(hasTree, hasState) assertSubset(hasHash, hasState) cpy := make([]common.Hash, len(hashes)) - for i := 0; i < len(hashes); i++ { - cpy[i] = hashes[i] - } + copy(cpy, hashes) ai := AccountHashItem{ addrHashPrefix: common.CopyBytes(prefix), hasState: hasState, @@ -238,9 +236,7 @@ func (sc *StateCache) SetAccountHashWrite(prefix []byte, hasState, hasTree, hasH hasHash: hasHash, hashes: make([]common.Hash, len(hashes)), } - for i := 0; i < len(hashes); i++ { - ai.hashes[i] = hashes[i] - } + copy(ai.hashes, hashes) var awi AccountHashWriteItem awi.ai = &ai sc.setWrite(&ai, &awi, false /* delete */) @@ -256,9 +252,7 @@ func (sc *StateCache) SetAccountHashDelete(prefix []byte) { func (sc *StateCache) SetStorageHashRead(addrHash common.Hash, incarnation uint64, locHashPrefix []byte, hasState, hasTree, hasHash uint16, hashes []common.Hash) { cpy := make([]common.Hash, len(hashes)) - for i := 0; i < len(hashes); i++ { - cpy[i] = hashes[i] - } + copy(cpy, hashes) ai := StorageHashItem{ addrHash: addrHash, incarnation: incarnation, @@ -273,9 +267,7 @@ func (sc *StateCache) SetStorageHashRead(addrHash common.Hash, incarnation uint6 func (sc *StateCache) SetStorageHashWrite(addrHash common.Hash, incarnation uint64, locHashPrefix []byte, hasState, hasTree, hasHash uint16, hashes []common.Hash) { cpy := make([]common.Hash, len(hashes)) - for i := 0; i < len(hashes); i++ { - cpy[i] = hashes[i] - } + copy(cpy, hashes) ai := StorageHashItem{ addrHash: addrHash, incarnation: incarnation, @@ -292,9 +284,7 @@ func (sc *StateCache) SetStorageHashWrite(addrHash common.Hash, incarnation uint func (sc *StateCache) SetStorageHashDelete(addrHash common.Hash, incarnation uint64, locHashPrefix []byte, hasState, hasTree, hasHash uint16, hashes []common.Hash) { cpy := make([]common.Hash, len(hashes)) - for i := 0; i < len(hashes); i++ { - cpy[i] = hashes[i] - } + copy(cpy, hashes) ai := StorageHashItem{ addrHash: addrHash, incarnation: incarnation, diff --git a/turbo/snapshotsync/block_reader.go b/turbo/snapshotsync/block_reader.go new file mode 100644 index 00000000000..d70a960fd5f --- /dev/null +++ b/turbo/snapshotsync/block_reader.go @@ -0,0 +1,743 @@ +package snapshotsync + +import ( + "bytes" + "context" + "encoding/binary" + "fmt" + + "github.com/ledgerwatch/erigon-lib/gointerfaces" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/recsplit" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/rlp" +) + +// BlockReader can read blocks from db and snapshots +type BlockReader struct { +} + +func NewBlockReader() *BlockReader { + return &BlockReader{} +} + +func (back *BlockReader) CanonicalHash(ctx context.Context, tx kv.Getter, blockHeight uint64) (common.Hash, error) { + return rawdb.ReadCanonicalHash(tx, blockHeight) +} + +func (back *BlockReader) Header(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (*types.Header, error) { + h := rawdb.ReadHeader(tx, hash, blockHeight) + return h, nil +} + +func (back *BlockReader) Body(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + body, _, _ = rawdb.ReadBody(tx, hash, blockHeight) + return body, nil +} + +func (back *BlockReader) BodyWithTransactions(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + return rawdb.ReadBodyWithTransactions(tx, hash, blockHeight) +} + +func (back *BlockReader) BodyRlp(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (bodyRlp rlp.RawValue, err error) { + body, err := back.Body(ctx, tx, hash, blockHeight) + if err != nil { + return nil, err + } + bodyRlp, err = rlp.EncodeToBytes(body) + if err != nil { + return nil, err + } + return bodyRlp, nil +} + +func (back *BlockReader) HeaderByNumber(ctx context.Context, tx kv.Getter, blockHeight uint64) (*types.Header, error) { + h := rawdb.ReadHeaderByNumber(tx, blockHeight) + return h, nil +} + +func (back *BlockReader) HeaderByHash(ctx context.Context, tx kv.Getter, hash common.Hash) (*types.Header, error) { + return rawdb.ReadHeaderByHash(tx, hash) +} + +func (back *BlockReader) BlockWithSenders(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (block *types.Block, senders []common.Address, err error) { + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockHeight) + if err != nil { + return nil, nil, fmt.Errorf("requested non-canonical hash %x. canonical=%x", hash, canonicalHash) + } + if canonicalHash == hash { + block, senders, err = rawdb.ReadBlockWithSenders(tx, hash, blockHeight) + if err != nil { + return nil, nil, err + } + return block, senders, nil + } + + return rawdb.NonCanonicalBlockWithSenders(tx, hash, blockHeight) +} + +func (back *BlockReader) TxnLookup(ctx context.Context, tx kv.Getter, txnHash common.Hash) (uint64, bool, error) { + n, err := rawdb.ReadTxLookupEntry(tx, txnHash) + if err != nil { + return 0, false, err + } + if n == nil { + return 0, false, nil + } + return *n, true, nil +} +func (back *BlockReader) TxnByIdxInBlock(ctx context.Context, tx kv.Getter, blockNum uint64, i int) (txn types.Transaction, err error) { + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockNum) + if err != nil { + return nil, err + } + var k [8 + 32]byte + binary.BigEndian.PutUint64(k[:], blockNum) + copy(k[8:], canonicalHash[:]) + b, err := rawdb.ReadBodyForStorageByKey(tx, k[:]) + if err != nil { + return nil, err + } + if b == nil { + return nil, nil + } + + txn, err = rawdb.CanonicalTxnByID(tx, b.BaseTxId+1+uint64(i)) + if err != nil { + return nil, err + } + return txn, nil +} + +type RemoteBlockReader struct { + client remote.ETHBACKENDClient +} + +func (back *RemoteBlockReader) HeaderByNumber(ctx context.Context, tx kv.Getter, blockHeight uint64) (*types.Header, error) { + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockHeight) + if err != nil { + return nil, err + } + block, _, err := back.BlockWithSenders(ctx, tx, canonicalHash, blockHeight) + if err != nil { + return nil, err + } + return block.Header(), nil +} + +func (back *RemoteBlockReader) HeaderByHash(ctx context.Context, tx kv.Getter, hash common.Hash) (*types.Header, error) { + blockNum := rawdb.ReadHeaderNumber(tx, hash) + if blockNum == nil { + return nil, nil + } + block, _, err := back.BlockWithSenders(ctx, tx, hash, *blockNum) + if err != nil { + return nil, err + } + return block.Header(), nil +} + +func (back *RemoteBlockReader) CanonicalHash(ctx context.Context, tx kv.Getter, blockHeight uint64) (common.Hash, error) { + return rawdb.ReadCanonicalHash(tx, blockHeight) +} + +func NewRemoteBlockReader(client remote.ETHBACKENDClient) *RemoteBlockReader { + return &RemoteBlockReader{client} +} + +func (back *RemoteBlockReader) TxnLookup(ctx context.Context, tx kv.Getter, txnHash common.Hash) (uint64, bool, error) { + reply, err := back.client.TxnLookup(ctx, &remote.TxnLookupRequest{TxnHash: gointerfaces.ConvertHashToH256(txnHash)}) + if err != nil { + return 0, false, err + } + if reply == nil { + return 0, false, nil + } + return reply.BlockNumber, true, nil +} + +func (back *RemoteBlockReader) TxnByIdxInBlock(ctx context.Context, tx kv.Getter, blockNum uint64, i int) (txn types.Transaction, err error) { + panic("not implemented") +} + +func (back *RemoteBlockReader) BlockWithSenders(ctx context.Context, _ kv.Getter, hash common.Hash, blockHeight uint64) (block *types.Block, senders []common.Address, err error) { + reply, err := back.client.Block(ctx, &remote.BlockRequest{BlockHash: gointerfaces.ConvertHashToH256(hash), BlockHeight: blockHeight}) + if err != nil { + return nil, nil, err + } + + block = &types.Block{} + err = rlp.Decode(bytes.NewReader(reply.BlockRlp), block) + if err != nil { + return nil, nil, err + } + senders = make([]common.Address, len(reply.Senders)/20) + for i := range senders { + senders[i].SetBytes(reply.Senders[i*20 : (i+1)*20]) + } + if len(senders) == block.Transactions().Len() { //it's fine if no senders provided - they can be lazy recovered + block.SendersToTxs(senders) + } + return block, senders, nil +} + +func (back *RemoteBlockReader) Header(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (*types.Header, error) { + block, _, err := back.BlockWithSenders(ctx, tx, hash, blockHeight) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil + } + return block.Header(), nil +} +func (back *RemoteBlockReader) Body(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + block, _, err := back.BlockWithSenders(ctx, tx, hash, blockHeight) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil + } + return block.Body(), nil +} +func (back *RemoteBlockReader) BodyWithTransactions(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + block, _, err := back.BlockWithSenders(ctx, tx, hash, blockHeight) + if err != nil { + return nil, err + } + if block == nil { + return nil, nil + } + return block.Body(), nil +} + +func (back *RemoteBlockReader) BodyRlp(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (bodyRlp rlp.RawValue, err error) { + body, err := back.BodyWithTransactions(ctx, tx, hash, blockHeight) + if err != nil { + return nil, err + } + bodyRlp, err = rlp.EncodeToBytes(body) + if err != nil { + return nil, err + } + return bodyRlp, nil +} + +// BlockReaderWithSnapshots can read blocks from db and snapshots +type BlockReaderWithSnapshots struct { + sn *RoSnapshots +} + +func NewBlockReaderWithSnapshots(snapshots *RoSnapshots) *BlockReaderWithSnapshots { + return &BlockReaderWithSnapshots{sn: snapshots} +} + +func (back *BlockReaderWithSnapshots) HeaderByNumber(ctx context.Context, tx kv.Getter, blockHeight uint64) (h *types.Header, err error) { + ok, err := back.sn.ViewHeaders(blockHeight, func(segment *HeaderSegment) error { + h, _, err = back.headerFromSnapshot(blockHeight, segment, nil) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } + if ok { + return h, nil + } + return rawdb.ReadHeaderByNumber(tx, blockHeight), nil +} + +// HeaderByHash - will search header in all snapshots starting from recent +func (back *BlockReaderWithSnapshots) HeaderByHash(ctx context.Context, tx kv.Getter, hash common.Hash) (h *types.Header, err error) { + h, err = rawdb.ReadHeaderByHash(tx, hash) + if err != nil { + return nil, err + } + if h != nil { + return h, nil + } + + buf := make([]byte, 128) + if err := back.sn.Headers.View(func(segments []*HeaderSegment) error { + for i := len(segments) - 1; i >= 0; i-- { + if segments[i].idxHeaderHash == nil { + continue + } + + h, err = back.headerFromSnapshotByHash(hash, segments[i], buf) + if err != nil { + return err + } + } + return nil + }); err != nil { + return nil, err + } + return h, nil +} + +func (back *BlockReaderWithSnapshots) CanonicalHash(ctx context.Context, tx kv.Getter, blockHeight uint64) (h common.Hash, err error) { + ok, err := back.sn.ViewHeaders(blockHeight, func(segment *HeaderSegment) error { + header, _, err := back.headerFromSnapshot(blockHeight, segment, nil) + if err != nil { + return err + } + if header == nil { + return nil + } + h = header.Hash() + return nil + }) + if err != nil { + return h, err + } + if ok { + return h, nil + } + + return rawdb.ReadCanonicalHash(tx, blockHeight) +} + +func (back *BlockReaderWithSnapshots) Header(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (h *types.Header, err error) { + ok, err := back.sn.ViewHeaders(blockHeight, func(segment *HeaderSegment) error { + h, _, err = back.headerFromSnapshot(blockHeight, segment, nil) + if err != nil { + return err + } + return nil + }) + if ok { + return h, nil + } + + h = rawdb.ReadHeader(tx, hash, blockHeight) + return h, nil +} + +func (back *BlockReaderWithSnapshots) ReadHeaderByNumber(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (h *types.Header, err error) { + ok, err := back.sn.ViewHeaders(blockHeight, func(segment *HeaderSegment) error { + h, _, err = back.headerFromSnapshot(blockHeight, segment, nil) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } + if !ok { + return h, nil + } + + h = rawdb.ReadHeader(tx, hash, blockHeight) + return h, nil +} + +func (back *BlockReaderWithSnapshots) BodyWithTransactions(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + var baseTxnID uint64 + var txsAmount uint32 + var buf []byte + ok, err := back.sn.ViewBodies(blockHeight, func(seg *BodySegment) error { + body, baseTxnID, txsAmount, buf, err = back.bodyFromSnapshot(blockHeight, seg, buf) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } + if ok { + ok, err = back.sn.ViewTxs(blockHeight, func(seg *TxnSegment) error { + txs, senders, err := back.txsFromSnapshot(baseTxnID, txsAmount, seg, buf) + if err != nil { + return err + } + if txs == nil { + return nil + } + body.Transactions = txs + body.SendersToTxs(senders) + return nil + }) + if err != nil { + return nil, err + } + if ok { + return body, nil + } + } + + body, err = rawdb.ReadBodyWithTransactions(tx, hash, blockHeight) + if err != nil { + return nil, err + } + return body, nil +} + +func (back *BlockReaderWithSnapshots) BodyRlp(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (bodyRlp rlp.RawValue, err error) { + body, err := back.BodyWithTransactions(ctx, tx, hash, blockHeight) + if err != nil { + return nil, err + } + bodyRlp, err = rlp.EncodeToBytes(body) + if err != nil { + return nil, err + } + return bodyRlp, nil +} + +func (back *BlockReaderWithSnapshots) Body(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (body *types.Body, err error) { + ok, err := back.sn.ViewBodies(blockHeight, func(seg *BodySegment) error { + body, _, _, _, err = back.bodyFromSnapshot(blockHeight, seg, nil) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, err + } + if ok { + return body, nil + } + body, _, _ = rawdb.ReadBody(tx, hash, blockHeight) + return body, nil +} + +func (back *BlockReaderWithSnapshots) BlockWithSenders(ctx context.Context, tx kv.Getter, hash common.Hash, blockHeight uint64) (block *types.Block, senders []common.Address, err error) { + var buf []byte + var h *types.Header + ok, err := back.sn.ViewHeaders(blockHeight, func(seg *HeaderSegment) error { + h, buf, err = back.headerFromSnapshot(blockHeight, seg, buf) + if err != nil { + return err + } + return nil + }) + if err != nil { + return + } + if ok && h != nil { + var b *types.Body + var baseTxnId uint64 + var txsAmount uint32 + ok, err = back.sn.ViewBodies(blockHeight, func(seg *BodySegment) error { + b, baseTxnId, txsAmount, buf, err = back.bodyFromSnapshot(blockHeight, seg, buf) + if err != nil { + return err + } + return nil + }) + if err != nil { + return + } + if ok && b != nil { + if txsAmount == 0 { + block = types.NewBlockFromStorage(hash, h, nil, b.Uncles) + if len(senders) != block.Transactions().Len() { + return block, senders, nil // no senders is fine - will recover them on the fly + } + block.SendersToTxs(senders) + return block, senders, nil + } + var txs []types.Transaction + var senders []common.Address + ok, err = back.sn.ViewTxs(blockHeight, func(seg *TxnSegment) error { + txs, senders, err = back.txsFromSnapshot(baseTxnId, txsAmount, seg, buf) + if err != nil { + return err + } + return nil + }) + if err != nil { + return nil, nil, err + } + if ok { + block = types.NewBlockFromStorage(hash, h, txs, b.Uncles) + if len(senders) != block.Transactions().Len() { + return block, senders, nil // no senders is fine - will recover them on the fly + } + block.SendersToTxs(senders) + return block, senders, nil + } + } + } + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockHeight) + if err != nil { + return nil, nil, fmt.Errorf("requested non-canonical hash %x. canonical=%x", hash, canonicalHash) + } + if canonicalHash == hash { + block, senders, err = rawdb.ReadBlockWithSenders(tx, hash, blockHeight) + if err != nil { + return nil, nil, err + } + return block, senders, nil + } + return rawdb.NonCanonicalBlockWithSenders(tx, hash, blockHeight) +} + +func (back *BlockReaderWithSnapshots) headerFromSnapshot(blockHeight uint64, sn *HeaderSegment, buf []byte) (*types.Header, []byte, error) { + if sn.idxHeaderHash == nil { + return nil, buf, nil + } + headerOffset := sn.idxHeaderHash.Lookup2(blockHeight - sn.idxHeaderHash.BaseDataID()) + gg := sn.seg.MakeGetter() + gg.Reset(headerOffset) + buf, _ = gg.Next(buf[:0]) + if len(buf) == 0 { + return nil, buf, nil + } + h := &types.Header{} + if err := rlp.DecodeBytes(buf[1:], h); err != nil { + return nil, buf, err + } + return h, buf, nil +} + +// headerFromSnapshotByHash - getting header by hash AND ensure that it has correct hash +// because HeaderByHash method will search header in all snapshots - and may request header which doesn't exists +// but because our indices are based on PerfectHashMap, no way to know is given key exists or not, only way - +// to make sure is to fetch it and compare hash +func (back *BlockReaderWithSnapshots) headerFromSnapshotByHash(hash common.Hash, sn *HeaderSegment, buf []byte) (*types.Header, error) { + if sn.idxHeaderHash == nil { + return nil, nil + } + reader := recsplit.NewIndexReader(sn.idxHeaderHash) + localID := reader.Lookup(hash[:]) + headerOffset := sn.idxHeaderHash.Lookup2(localID) + gg := sn.seg.MakeGetter() + gg.Reset(headerOffset) + buf, _ = gg.Next(buf[:0]) + if len(buf) > 1 && hash[0] != buf[0] { + return nil, nil + } + + h := &types.Header{} + if err := rlp.DecodeBytes(buf[1:], h); err != nil { + return nil, err + } + if h.Hash() != hash { + return nil, nil + } + return h, nil +} + +func (back *BlockReaderWithSnapshots) bodyFromSnapshot(blockHeight uint64, sn *BodySegment, buf []byte) (*types.Body, uint64, uint32, []byte, error) { + b, buf, err := back.bodyForStorageFromSnapshot(blockHeight, sn, buf) + if err != nil { + return nil, 0, 0, buf, err + } + + body := new(types.Body) + body.Uncles = b.Uncles + var txsAmount uint32 + if b.TxAmount >= 2 { + txsAmount = b.TxAmount - 2 + } + return body, b.BaseTxId + 1, txsAmount, buf, nil // empty txs in the beginning and end of block +} + +func (back *BlockReaderWithSnapshots) bodyForStorageFromSnapshot(blockHeight uint64, sn *BodySegment, buf []byte) (*types.BodyForStorage, []byte, error) { + if sn.idxBodyNumber == nil { + return nil, buf, nil + } + bodyOffset := sn.idxBodyNumber.Lookup2(blockHeight - sn.idxBodyNumber.BaseDataID()) + + gg := sn.seg.MakeGetter() + gg.Reset(bodyOffset) + buf, _ = gg.Next(buf[:0]) + if len(buf) == 0 { + return nil, nil, nil + } + b := &types.BodyForStorage{} + reader := bytes.NewReader(buf) + if err := rlp.Decode(reader, b); err != nil { + return nil, buf, err + } + + if b.BaseTxId < sn.idxBodyNumber.BaseDataID() { + return nil, buf, fmt.Errorf(".idx file has wrong baseDataID? %d<%d, %s", b.BaseTxId, sn.idxBodyNumber.BaseDataID(), sn.seg.FilePath()) + } + return b, buf, nil +} + +func (back *BlockReaderWithSnapshots) txsFromSnapshot(baseTxnID uint64, txsAmount uint32, txsSeg *TxnSegment, buf []byte) (txs []types.Transaction, senders []common.Address, err error) { + if txsSeg.IdxTxnHash == nil { + return nil, nil, nil + } + if baseTxnID < txsSeg.IdxTxnHash.BaseDataID() { + return nil, nil, fmt.Errorf(".idx file has wrong baseDataID? %d<%d, %s", baseTxnID, txsSeg.IdxTxnHash.BaseDataID(), txsSeg.Seg.FilePath()) + } + + txs = make([]types.Transaction, txsAmount) + senders = make([]common.Address, txsAmount) + reader := bytes.NewReader(buf) + if txsAmount == 0 { + return txs, senders, nil + } + txnOffset := txsSeg.IdxTxnHash.Lookup2(baseTxnID - txsSeg.IdxTxnHash.BaseDataID()) + gg := txsSeg.Seg.MakeGetter() + gg.Reset(txnOffset) + stream := rlp.NewStream(reader, 0) + for i := uint32(0); i < txsAmount; i++ { + buf, _ = gg.Next(buf[:0]) + if len(buf) < 1+20 { + return nil, nil, fmt.Errorf("segment %s has too short record: len(buf)=%d < 21", txsSeg.Seg.FilePath(), len(buf)) + } + senders[i].SetBytes(buf[1 : 1+20]) + txRlp := buf[1+20:] + reader.Reset(txRlp) + stream.Reset(reader, 0) + txs[i], err = types.DecodeTransaction(stream) + if err != nil { + return nil, nil, err + } + txs[i].SetSender(senders[i]) + } + + return txs, senders, nil +} + +func (back *BlockReaderWithSnapshots) txnByID(txnID uint64, sn *TxnSegment, buf []byte) (txn types.Transaction, err error) { + offset := sn.IdxTxnHash.Lookup2(txnID - sn.IdxTxnHash.BaseDataID()) + gg := sn.Seg.MakeGetter() + gg.Reset(offset) + buf, _ = gg.Next(buf[:0]) + sender, txnRlp := buf[1:1+20], buf[1+20:] + + txn, err = types.DecodeTransaction(rlp.NewStream(bytes.NewReader(txnRlp), uint64(len(txnRlp)))) + if err != nil { + return + } + txn.SetSender(*(*common.Address)(sender)) // see: https://tip.golang.org/ref/spec#Conversions_from_slice_to_array_pointer + return +} + +func (back *BlockReaderWithSnapshots) txnByHash(txnHash common.Hash, segments []*TxnSegment, buf []byte) (txn types.Transaction, blockNum, txnID uint64, err error) { + for i := len(segments) - 1; i >= 0; i-- { + sn := segments[i] + if sn.IdxTxnHash == nil || sn.IdxTxnHash2BlockNum == nil { + continue + } + + reader := recsplit.NewIndexReader(sn.IdxTxnHash) + txnId := reader.Lookup(txnHash[:]) + offset := sn.IdxTxnHash.Lookup2(txnId) + gg := sn.Seg.MakeGetter() + gg.Reset(offset) + // first byte txnHash check - reducing false-positives 256 times. Allows don't store and don't calculate full hash of entity - when checking many snapshots. + if !gg.MatchPrefix([]byte{txnHash[0]}) { + continue + } + buf, _ = gg.Next(buf[:0]) + sender, txnRlp := buf[1:1+20], buf[1+20:] + + txn, err = types.DecodeTransaction(rlp.NewStream(bytes.NewReader(txnRlp), uint64(len(txnRlp)))) + if err != nil { + return + } + txn.SetSender(*(*common.Address)(sender)) // see: https://tip.golang.org/ref/spec#Conversions_from_slice_to_array_pointer + + reader2 := recsplit.NewIndexReader(sn.IdxTxnHash2BlockNum) + blockNum = reader2.Lookup(txnHash[:]) + + // final txnHash check - completely avoid false-positives + if txn.Hash() == txnHash { + return + } + } + return +} + +func (back *BlockReaderWithSnapshots) TxnByIdxInBlock(ctx context.Context, tx kv.Getter, blockNum uint64, i int) (txn types.Transaction, err error) { + var b *types.BodyForStorage + ok, err := back.sn.ViewBodies(blockNum, func(segment *BodySegment) error { + b, _, err = back.bodyForStorageFromSnapshot(blockNum, segment, nil) + if err != nil { + return err + } + if b == nil { + return nil + } + + return nil + }) + if ok { + ok, err = back.sn.Txs.ViewSegment(blockNum, func(segment *TxnSegment) error { + // +1 because block has system-txn in the beginning of block + txn, err = back.txnByID(b.BaseTxId+1+uint64(i), segment, nil) + if err != nil { + return err + } + if txn == nil { + return nil + } + return nil + }) + if err != nil { + return nil, err + } + if ok { + return txn, nil + } + return nil, nil + } + + canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockNum) + if err != nil { + return nil, err + } + var k [8 + 32]byte + binary.BigEndian.PutUint64(k[:], blockNum) + copy(k[8:], canonicalHash[:]) + b, err = rawdb.ReadBodyForStorageByKey(tx, k[:]) + if err != nil { + return nil, err + } + if b == nil { + return nil, nil + } + + txn, err = rawdb.CanonicalTxnByID(tx, b.BaseTxId+1+uint64(i)) + if err != nil { + return nil, err + } + return txn, nil +} + +// TxnLookup - find blockNumber and txnID by txnHash +func (back *BlockReaderWithSnapshots) TxnLookup(ctx context.Context, tx kv.Getter, txnHash common.Hash) (uint64, bool, error) { + n, err := rawdb.ReadTxLookupEntry(tx, txnHash) + if err != nil { + return 0, false, err + } + if n != nil { + return *n, true, nil + } + + var txn types.Transaction + var blockNum uint64 + if err := back.sn.Txs.View(func(segments []*TxnSegment) error { + txn, blockNum, _, err = back.txnByHash(txnHash, segments, nil) + if err != nil { + return err + } + if txn == nil { + return nil + } + return nil + }); err != nil { + return 0, false, err + } + if txn == nil { + return 0, false, nil + } + return blockNum, true, nil +} diff --git a/turbo/snapshotsync/block_snapshots.go b/turbo/snapshotsync/block_snapshots.go new file mode 100644 index 00000000000..0350018723a --- /dev/null +++ b/turbo/snapshotsync/block_snapshots.go @@ -0,0 +1,1925 @@ +package snapshotsync + +import ( + "bytes" + "context" + "encoding/binary" + "errors" + "fmt" + "os" + "path" + "path/filepath" + "runtime" + "strings" + "sync" + "time" + + "github.com/holiman/uint256" + common2 "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" + "github.com/ledgerwatch/erigon-lib/common/dbg" + "github.com/ledgerwatch/erigon-lib/compress" + "github.com/ledgerwatch/erigon-lib/etl" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/recsplit" + types2 "github.com/ledgerwatch/erigon-lib/types" + "github.com/ledgerwatch/erigon/cmd/hack/tool" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/dbutils" + "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/eth/ethconfig" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snapshothashes" + "github.com/ledgerwatch/log/v3" + "go.uber.org/atomic" + "golang.org/x/exp/slices" +) + +type HeaderSegment struct { + seg *compress.Decompressor // value: first_byte_of_header_hash + header_rlp + idxHeaderHash *recsplit.Index // header_hash -> headers_segment_offset + From, To uint64 +} + +type BodySegment struct { + seg *compress.Decompressor // value: rlp(types.BodyForStorage) + idxBodyNumber *recsplit.Index // block_num_u64 -> bodies_segment_offset + From, To uint64 +} + +type TxnSegment struct { + Seg *compress.Decompressor // value: first_byte_of_transaction_hash + sender_address + transaction_rlp + IdxTxnHash *recsplit.Index // transaction_hash -> transactions_segment_offset + IdxTxnHash2BlockNum *recsplit.Index // transaction_hash -> block_number + From, To uint64 +} + +func (sn *HeaderSegment) close() { + if sn.seg != nil { + sn.seg.Close() + sn.seg = nil + } + if sn.idxHeaderHash != nil { + sn.idxHeaderHash.Close() + sn.idxHeaderHash = nil + } +} + +func (sn *HeaderSegment) reopen(dir string) (err error) { + sn.close() + fileName := snap.SegmentFileName(sn.From, sn.To, snap.Headers) + sn.seg, err = compress.NewDecompressor(path.Join(dir, fileName)) + if err != nil { + return err + } + sn.idxHeaderHash, err = recsplit.OpenIndex(path.Join(dir, snap.IdxFileName(sn.From, sn.To, snap.Headers.String()))) + if err != nil { + return err + } + return nil +} + +func (sn *BodySegment) close() { + if sn.seg != nil { + sn.seg.Close() + sn.seg = nil + } + if sn.idxBodyNumber != nil { + sn.idxBodyNumber.Close() + sn.idxBodyNumber = nil + } +} + +func (sn *BodySegment) reopen(dir string) (err error) { + sn.close() + fileName := snap.SegmentFileName(sn.From, sn.To, snap.Bodies) + sn.seg, err = compress.NewDecompressor(path.Join(dir, fileName)) + if err != nil { + return err + } + sn.idxBodyNumber, err = recsplit.OpenIndex(path.Join(dir, snap.IdxFileName(sn.From, sn.To, snap.Bodies.String()))) + if err != nil { + return err + } + return nil +} + +func (sn *TxnSegment) close() { + if sn.Seg != nil { + sn.Seg.Close() + sn.Seg = nil + } + if sn.IdxTxnHash != nil { + sn.IdxTxnHash.Close() + sn.IdxTxnHash = nil + } + if sn.IdxTxnHash2BlockNum != nil { + sn.IdxTxnHash2BlockNum.Close() + sn.IdxTxnHash2BlockNum = nil + } +} +func (sn *TxnSegment) reopen(dir string) (err error) { + sn.close() + fileName := snap.SegmentFileName(sn.From, sn.To, snap.Transactions) + sn.Seg, err = compress.NewDecompressor(path.Join(dir, fileName)) + if err != nil { + return err + } + sn.IdxTxnHash, err = recsplit.OpenIndex(path.Join(dir, snap.IdxFileName(sn.From, sn.To, snap.Transactions.String()))) + if err != nil { + return err + } + sn.IdxTxnHash2BlockNum, err = recsplit.OpenIndex(path.Join(dir, snap.IdxFileName(sn.From, sn.To, snap.Transactions2Block.String()))) + if err != nil { + return err + } + return nil +} + +type headerSegments struct { + lock sync.RWMutex + segments []*HeaderSegment +} + +func (s *headerSegments) closeLocked() { + for i := range s.segments { + s.segments[i].close() + } +} +func (s *headerSegments) reopen(dir string) error { + for _, seg := range s.segments { + if err := seg.reopen(dir); err != nil { + if errors.Is(err, os.ErrNotExist) { + continue + } + return err + } + } + return nil +} +func (s *headerSegments) View(f func(segments []*HeaderSegment) error) error { + s.lock.RLock() + defer s.lock.RUnlock() + return f(s.segments) +} +func (s *headerSegments) ViewSegment(blockNum uint64, f func(sn *HeaderSegment) error) (found bool, err error) { + s.lock.RLock() + defer s.lock.RUnlock() + for _, seg := range s.segments { + if !(blockNum >= seg.From && blockNum < seg.To) { + continue + } + return true, f(seg) + } + return false, nil +} + +type bodySegments struct { + lock sync.RWMutex + segments []*BodySegment +} + +func (s *bodySegments) closeLocked() { + for i := range s.segments { + s.segments[i].close() + } +} +func (s *bodySegments) reopen(dir string) error { + for _, seg := range s.segments { + if err := seg.reopen(dir); err != nil { + if errors.Is(err, os.ErrNotExist) { + continue + } + return err + } + } + return nil +} +func (s *bodySegments) View(f func([]*BodySegment) error) error { + s.lock.RLock() + defer s.lock.RUnlock() + return f(s.segments) +} +func (s *bodySegments) ViewSegment(blockNum uint64, f func(*BodySegment) error) (found bool, err error) { + s.lock.RLock() + defer s.lock.RUnlock() + for _, seg := range s.segments { + if !(blockNum >= seg.From && blockNum < seg.To) { + continue + } + return true, f(seg) + } + return false, nil +} + +type txnSegments struct { + lock sync.RWMutex + segments []*TxnSegment +} + +func (s *txnSegments) closeLocked() { + for i := range s.segments { + s.segments[i].close() + } +} +func (s *txnSegments) reopen(dir string) error { + for _, seg := range s.segments { + if err := seg.reopen(dir); err != nil { + if errors.Is(err, os.ErrNotExist) { + continue + } + return err + } + } + return nil +} +func (s *txnSegments) View(f func([]*TxnSegment) error) error { + s.lock.RLock() + defer s.lock.RUnlock() + return f(s.segments) +} +func (s *txnSegments) ViewSegment(blockNum uint64, f func(*TxnSegment) error) (found bool, err error) { + s.lock.RLock() + defer s.lock.RUnlock() + for _, seg := range s.segments { + if !(blockNum >= seg.From && blockNum < seg.To) { + continue + } + return true, f(seg) + } + return false, nil +} + +type RoSnapshots struct { + indicesReady atomic.Bool + segmentsReady atomic.Bool + + Headers *headerSegments + Bodies *bodySegments + Txs *txnSegments + + dir string + segmentsMax atomic.Uint64 // all types of .seg files are available - up to this number + idxMax atomic.Uint64 // all types of .idx files are available - up to this number + cfg ethconfig.Snapshot +} + +// NewRoSnapshots - opens all snapshots. But to simplify everything: +// - it opens snapshots only on App start and immutable after +// - all snapshots of given blocks range must exist - to make this blocks range available +// - gaps are not allowed +// - segment have [from:to) semantic +func NewRoSnapshots(cfg ethconfig.Snapshot, snapDir string) *RoSnapshots { + return &RoSnapshots{dir: snapDir, cfg: cfg, Headers: &headerSegments{}, Bodies: &bodySegments{}, Txs: &txnSegments{}} +} + +func (s *RoSnapshots) Cfg() ethconfig.Snapshot { return s.cfg } +func (s *RoSnapshots) Dir() string { return s.dir } +func (s *RoSnapshots) SegmentsReady() bool { return s.segmentsReady.Load() } +func (s *RoSnapshots) IndicesReady() bool { return s.indicesReady.Load() } +func (s *RoSnapshots) IndicesMax() uint64 { return s.idxMax.Load() } +func (s *RoSnapshots) SegmentsMax() uint64 { return s.segmentsMax.Load() } +func (s *RoSnapshots) BlocksAvailable() uint64 { return cmp.Min(s.segmentsMax.Load(), s.idxMax.Load()) } + +func (s *RoSnapshots) EnsureExpectedBlocksAreAvailable(cfg *snapshothashes.Config) error { + if s.BlocksAvailable() < cfg.ExpectBlocks { + return fmt.Errorf("app must wait until all expected snapshots are available. Expected: %d, Available: %d", cfg.ExpectBlocks, s.BlocksAvailable()) + } + return nil +} + +func (s *RoSnapshots) idxAvailability() uint64 { + var headers, bodies, txs uint64 + for i := len(s.Headers.segments) - 1; i >= 0; i-- { + seg := s.Headers.segments[i] + if seg.idxHeaderHash == nil { + continue + } + headers = seg.To - 1 + break + } + for i := len(s.Bodies.segments) - 1; i >= 0; i-- { + seg := s.Bodies.segments[i] + if seg.idxBodyNumber == nil { + continue + } + bodies = seg.To - 1 + break + } + + for i := len(s.Txs.segments) - 1; i >= 0; i-- { + seg := s.Txs.segments[i] + if seg.IdxTxnHash == nil || seg.IdxTxnHash2BlockNum == nil { + continue + } + txs = seg.To - 1 + break + } + return cmp.Min(headers, cmp.Min(bodies, txs)) +} + +func (s *RoSnapshots) ReopenIndices() error { + return s.ReopenSomeIndices(snap.AllSnapshotTypes...) +} + +func (s *RoSnapshots) ReopenSomeIndices(types ...snap.Type) (err error) { + s.Headers.lock.Lock() + defer s.Headers.lock.Unlock() + s.Bodies.lock.Lock() + defer s.Bodies.lock.Unlock() + s.Txs.lock.Lock() + defer s.Txs.lock.Unlock() + + for _, t := range types { + switch t { + case snap.Headers: + if err := s.Headers.reopen(s.dir); err != nil { + return err + } + case snap.Bodies: + if err := s.Bodies.reopen(s.dir); err != nil { + return err + } + case snap.Transactions: + if err := s.Txs.reopen(s.dir); err != nil { + return err + } + default: + panic(fmt.Sprintf("unknown snapshot type: %s", t)) + } + } + + s.idxMax.Store(s.idxAvailability()) + s.indicesReady.Store(true) + return nil +} + +func (s *RoSnapshots) AsyncOpenAll(ctx context.Context) { + go func() { + for !s.segmentsReady.Load() || !s.indicesReady.Load() { + select { + case <-ctx.Done(): + return + default: + } + if err := s.Reopen(); err != nil && !errors.Is(err, os.ErrNotExist) && !errors.Is(err, snap.ErrSnapshotMissed) { + log.Error("AsyncOpenAll", "err", err) + } + time.Sleep(15 * time.Second) + } + }() +} + +func (s *RoSnapshots) Reopen() error { + s.Headers.lock.Lock() + defer s.Headers.lock.Unlock() + s.Bodies.lock.Lock() + defer s.Bodies.lock.Unlock() + s.Txs.lock.Lock() + defer s.Txs.lock.Unlock() + s.closeSegmentsLocked() + files, err := segments2(s.dir) + if err != nil { + return err + } + var segmentsMax uint64 + var segmentsMaxSet bool + s.Bodies.segments = s.Bodies.segments[:0] + s.Headers.segments = s.Headers.segments[:0] + s.Txs.segments = s.Txs.segments[:0] + for _, f := range files { + { + seg := &BodySegment{From: f.From, To: f.To} + fileName := snap.SegmentFileName(f.From, f.To, snap.Bodies) + seg.seg, err = compress.NewDecompressor(path.Join(s.dir, fileName)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + break + } + return err + } + s.Bodies.segments = append(s.Bodies.segments, seg) + } + { + seg := &HeaderSegment{From: f.From, To: f.To} + fileName := snap.SegmentFileName(f.From, f.To, snap.Headers) + seg.seg, err = compress.NewDecompressor(path.Join(s.dir, fileName)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + break + } + return err + } + s.Headers.segments = append(s.Headers.segments, seg) + } + { + seg := &TxnSegment{From: f.From, To: f.To} + fileName := snap.SegmentFileName(f.From, f.To, snap.Transactions) + seg.Seg, err = compress.NewDecompressor(path.Join(s.dir, fileName)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + break + } + return err + } + s.Txs.segments = append(s.Txs.segments, seg) + } + + if f.To > 0 { + segmentsMax = f.To - 1 + } else { + segmentsMax = 0 + } + segmentsMaxSet = true + } + if segmentsMaxSet { + s.segmentsMax.Store(segmentsMax) + } + s.segmentsReady.Store(true) + + for _, sn := range s.Headers.segments { + sn.idxHeaderHash, err = recsplit.OpenIndex(path.Join(s.dir, snap.IdxFileName(sn.From, sn.To, snap.Headers.String()))) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + } + for _, sn := range s.Bodies.segments { + sn.idxBodyNumber, err = recsplit.OpenIndex(path.Join(s.dir, snap.IdxFileName(sn.From, sn.To, snap.Bodies.String()))) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + } + for _, sn := range s.Txs.segments { + sn.IdxTxnHash, err = recsplit.OpenIndex(path.Join(s.dir, snap.IdxFileName(sn.From, sn.To, snap.Transactions.String()))) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + sn.IdxTxnHash2BlockNum, err = recsplit.OpenIndex(path.Join(s.dir, snap.IdxFileName(sn.From, sn.To, snap.Transactions2Block.String()))) + if err != nil && !errors.Is(err, os.ErrNotExist) { + return err + } + } + + s.idxMax.Store(s.idxAvailability()) + s.indicesReady.Store(true) + + return nil +} +func (s *RoSnapshots) ReopenSegments() error { + s.Headers.lock.Lock() + defer s.Headers.lock.Unlock() + s.Bodies.lock.Lock() + defer s.Bodies.lock.Unlock() + s.Txs.lock.Lock() + defer s.Txs.lock.Unlock() + s.closeSegmentsLocked() + files, err := segments2(s.dir) + if err != nil { + return err + } + s.Bodies.segments = s.Bodies.segments[:0] + s.Headers.segments = s.Headers.segments[:0] + s.Txs.segments = s.Txs.segments[:0] + var segmentsMax uint64 + var segmentsMaxSet bool + for _, f := range files { + { + seg := &BodySegment{From: f.From, To: f.To} + fileName := snap.SegmentFileName(f.From, f.To, snap.Bodies) + seg.seg, err = compress.NewDecompressor(path.Join(s.dir, fileName)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + break + } + return err + } + s.Bodies.segments = append(s.Bodies.segments, seg) + } + { + seg := &HeaderSegment{From: f.From, To: f.To} + fileName := snap.SegmentFileName(f.From, f.To, snap.Headers) + seg.seg, err = compress.NewDecompressor(path.Join(s.dir, fileName)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + break + } + return err + } + s.Headers.segments = append(s.Headers.segments, seg) + } + { + seg := &TxnSegment{From: f.From, To: f.To} + fileName := snap.SegmentFileName(f.From, f.To, snap.Transactions) + seg.Seg, err = compress.NewDecompressor(path.Join(s.dir, fileName)) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + break + } + return err + } + s.Txs.segments = append(s.Txs.segments, seg) + } + + if f.To > 0 { + segmentsMax = f.To - 1 + } else { + segmentsMax = 0 + } + segmentsMaxSet = true + } + if segmentsMaxSet { + s.segmentsMax.Store(segmentsMax) + } + s.segmentsReady.Store(true) + return nil +} + +func (s *RoSnapshots) Close() { + s.Headers.lock.Lock() + defer s.Headers.lock.Unlock() + s.Bodies.lock.Lock() + defer s.Bodies.lock.Unlock() + s.Txs.lock.Lock() + defer s.Txs.lock.Unlock() + s.closeSegmentsLocked() +} +func (s *RoSnapshots) closeSegmentsLocked() { + if s.Headers != nil { + s.Headers.closeLocked() + s.Headers.segments = nil + } + if s.Bodies != nil { + s.Bodies.closeLocked() + s.Bodies.segments = nil + } + if s.Txs != nil { + s.Txs.closeLocked() + s.Txs.segments = nil + } +} +func (s *RoSnapshots) PrintDebug() { + s.Headers.lock.RLock() + defer s.Headers.lock.RUnlock() + s.Bodies.lock.RLock() + defer s.Bodies.lock.RUnlock() + s.Txs.lock.RLock() + defer s.Txs.lock.RUnlock() + fmt.Printf("sn: %d, %d\n", s.segmentsMax.Load(), s.idxMax.Load()) + fmt.Println(" == Snapshots, Header") + for _, sn := range s.Headers.segments { + fmt.Printf("%d, %t\n", sn.From, sn.idxHeaderHash == nil) + } + fmt.Println(" == Snapshots, Body") + for _, sn := range s.Bodies.segments { + fmt.Printf("%d, %t\n", sn.From, sn.idxBodyNumber == nil) + } + fmt.Println(" == Snapshots, Txs") + for _, sn := range s.Txs.segments { + fmt.Printf("%d, %t, %t\n", sn.From, sn.IdxTxnHash == nil, sn.IdxTxnHash2BlockNum == nil) + } +} +func (s *RoSnapshots) ViewHeaders(blockNum uint64, f func(sn *HeaderSegment) error) (found bool, err error) { + if !s.indicesReady.Load() || blockNum > s.BlocksAvailable() { + return false, nil + } + return s.Headers.ViewSegment(blockNum, f) +} +func (s *RoSnapshots) ViewBodies(blockNum uint64, f func(sn *BodySegment) error) (found bool, err error) { + if !s.indicesReady.Load() || blockNum > s.BlocksAvailable() { + return false, nil + } + return s.Bodies.ViewSegment(blockNum, f) +} +func (s *RoSnapshots) ViewTxs(blockNum uint64, f func(sn *TxnSegment) error) (found bool, err error) { + if !s.indicesReady.Load() || blockNum > s.BlocksAvailable() { + return false, nil + } + return s.Txs.ViewSegment(blockNum, f) +} + +func BuildIndices(ctx context.Context, s *RoSnapshots, chainID uint256.Int, tmpDir string, from uint64, workers int, lvl log.Lvl) error { + log.Log(lvl, "[snapshots] Build indices", "from", from) + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + if err := s.Headers.View(func(segments []*HeaderSegment) error { + wg := &sync.WaitGroup{} + errs := make(chan error, len(segments)*2) + workersCh := make(chan struct{}, workers) + for _, sn := range segments { + if sn.From < from { + continue + } + + wg.Add(1) + workersCh <- struct{}{} + go func(blockFrom, blockTo uint64) { + defer func() { + wg.Done() + <-workersCh + }() + + f := filepath.Join(s.Dir(), snap.SegmentFileName(blockFrom, blockTo, snap.Headers)) + errs <- HeadersIdx(ctx, f, blockFrom, tmpDir, lvl) + select { + case <-ctx.Done(): + errs <- ctx.Err() + return + case <-logEvery.C: + var m runtime.MemStats + if lvl >= log.LvlInfo { + common2.ReadMemStats(&m) + } + log.Log(lvl, "[snapshots] HeadersIdx", "blockNum", blockTo, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys)) + default: + } + + }(sn.From, sn.To) + } + go func() { + wg.Wait() + close(errs) + }() + for err := range errs { + if err != nil { + return err + } + } + return nil + }); err != nil { + return err + } + + if err := s.Bodies.View(func(segments []*BodySegment) error { + wg := &sync.WaitGroup{} + errs := make(chan error, len(segments)*2) + workersCh := make(chan struct{}, workers) + for _, sn := range segments { + if sn.From < from { + continue + } + + wg.Add(1) + workersCh <- struct{}{} + go func(blockFrom, blockTo uint64) { + defer func() { + wg.Done() + <-workersCh + }() + + f := filepath.Join(s.Dir(), snap.SegmentFileName(blockFrom, blockTo, snap.Bodies)) + errs <- BodiesIdx(ctx, f, blockFrom, tmpDir, lvl) + select { + case <-ctx.Done(): + errs <- ctx.Err() + return + case <-logEvery.C: + var m runtime.MemStats + if lvl >= log.LvlInfo { + common2.ReadMemStats(&m) + } + log.Log(lvl, "[snapshots] BodiesIdx", "blockNum", blockTo, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys)) + default: + } + + }(sn.From, sn.To) + } + go func() { + wg.Wait() + close(errs) + }() + for err := range errs { + if err != nil { + return err + } + } + return nil + }); err != nil { + return err + } + // hack to read first block body - to get baseTxId from there + if err := s.ReopenSomeIndices(snap.Headers, snap.Bodies); err != nil { + return err + } + if err := s.Txs.View(func(segments []*TxnSegment) error { + return s.Bodies.View(func(bodySegments []*BodySegment) error { + wg := &sync.WaitGroup{} + errs := make(chan error, len(segments)*2) + workersCh := make(chan struct{}, workers) + for i, sn := range segments { + if sn.From < from { + continue + } + + if bodySegments[i].idxBodyNumber == nil { + log.Info("[snapshots] Segment has no index, skip", "seg", bodySegments[i].seg.FilePath()) + continue + } + + wg.Add(1) + workersCh <- struct{}{} + go func(blockFrom, blockTo uint64) { + defer func() { + wg.Done() + <-workersCh + }() + errs <- TransactionsIdx(ctx, chainID, blockFrom, blockTo, s.Dir(), tmpDir, lvl) + select { + case <-ctx.Done(): + errs <- ctx.Err() + return + case <-logEvery.C: + var m runtime.MemStats + if lvl >= log.LvlInfo { + common2.ReadMemStats(&m) + } + log.Log(lvl, "[Snapshots Indexing] TransactionsIdx", "blockNum", blockTo, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys)) + default: + } + + }(sn.From, sn.To) + } + go func() { + wg.Wait() + close(errs) + }() + for err := range errs { + if err != nil { + return err + } + } + + return nil + }) + }); err != nil { + return err + } + + return nil +} + +func noGaps(in []snap.FileInfo) (out []snap.FileInfo, err error) { + var prevTo uint64 + for _, f := range in { + if f.To <= prevTo { + continue + } + if f.From != prevTo { // no gaps + return nil, fmt.Errorf("%w: from %d to %d", snap.ErrSnapshotMissed, prevTo, f.From) + } + prevTo = f.To + out = append(out, f) + } + return out, nil +} + +func allTypeOfSegmentsMustExist(dir string, in []snap.FileInfo) (res []snap.FileInfo) { +MainLoop: + for _, f := range in { + if f.From == f.To { + continue + } + for _, t := range snap.AllSnapshotTypes { + p := filepath.Join(dir, snap.SegmentFileName(f.From, f.To, t)) + if _, err := os.Stat(p); err != nil { + if errors.Is(err, os.ErrNotExist) { + continue MainLoop + } + continue MainLoop + } + } + res = append(res, f) + } + return res +} + +// noOverlaps - keep largest ranges and avoid overlap +func noOverlaps(in []snap.FileInfo) (res []snap.FileInfo) { + for i := range in { + f := in[i] + if f.From == f.To { + continue + } + + for j := i + 1; j < len(in); j++ { // if there is file with larger range - use it instead + f2 := in[j] + if f.From == f.To { + continue + } + if f2.From > f.From { + break + } + f = f2 + i++ + } + + res = append(res, f) + } + return res +} + +func segments2(dir string) (res []snap.FileInfo, err error) { + list, err := snap.Segments(dir) + if err != nil { + return nil, err + } + for _, f := range list { + if f.T != snap.Headers { + continue + } + res = append(res, f) + } + return noGaps(noOverlaps(allTypeOfSegmentsMustExist(dir, res))) +} + +func chooseSegmentEnd(from, to, blocksPerFile uint64) uint64 { + next := (from/blocksPerFile + 1) * blocksPerFile + to = cmp.Min(next, to) + return to - (to % snap.MIN_SEGMENT_SIZE) // round down to the nearest 1k +} + +type BlockRetire struct { + working atomic.Bool + wg *sync.WaitGroup + result *BlockRetireResult + + workers int + tmpDir string + snapshots *RoSnapshots + db kv.RoDB + + downloader proto_downloader.DownloaderClient + notifier DBEventNotifier +} + +type BlockRetireResult struct { + BlockFrom, BlockTo uint64 + Err error +} + +func NewBlockRetire(workers int, tmpDir string, snapshots *RoSnapshots, db kv.RoDB, downloader proto_downloader.DownloaderClient, notifier DBEventNotifier) *BlockRetire { + return &BlockRetire{workers: workers, tmpDir: tmpDir, snapshots: snapshots, wg: &sync.WaitGroup{}, db: db, downloader: downloader, notifier: notifier} +} +func (br *BlockRetire) Snapshots() *RoSnapshots { return br.snapshots } +func (br *BlockRetire) Working() bool { return br.working.Load() } +func (br *BlockRetire) Wait() { br.wg.Wait() } +func (br *BlockRetire) Result() *BlockRetireResult { + r := br.result + br.result = nil + return r +} +func CanRetire(curBlockNum uint64, snapshots *RoSnapshots) (blockFrom, blockTo uint64, can bool) { + blockFrom = snapshots.BlocksAvailable() + 1 + return canRetire(blockFrom, curBlockNum-params.FullImmutabilityThreshold) +} +func canRetire(from, to uint64) (blockFrom, blockTo uint64, can bool) { + blockFrom = (from / 1_000) * 1_000 + roundedTo1K := (to / 1_000) * 1_000 + var maxJump uint64 = 1_000 + if blockFrom%500_000 == 0 { + maxJump = 500_000 + } else if blockFrom%100_000 == 0 { + maxJump = 100_000 + } else if blockFrom%10_000 == 0 { + maxJump = 10_000 + } + //roundedTo1K := (to / 1_000) * 1_000 + jump := cmp.Min(maxJump, roundedTo1K-blockFrom) + switch { // only next segment sizes are allowed + case jump >= 500_000: + blockTo = blockFrom + 500_000 + case jump >= 100_000: + blockTo = blockFrom + 100_000 + case jump >= 10_000: + blockTo = blockFrom + 10_000 + case jump >= 1_000: + blockTo = blockFrom + 1_000 + default: + blockTo = blockFrom + } + return blockFrom, blockTo, blockTo-blockFrom >= 1_000 +} +func CanDeleteTo(curBlockNum uint64, snapshots *RoSnapshots) (blockTo uint64) { + if curBlockNum+999 < params.FullImmutabilityThreshold { + // To prevent overflow of uint64 below + return snapshots.BlocksAvailable() + 1 + } + hardLimit := (curBlockNum/1_000)*1_000 - params.FullImmutabilityThreshold + return cmp.Min(hardLimit, snapshots.BlocksAvailable()+1) +} +func (br *BlockRetire) RetireBlocks(ctx context.Context, blockFrom, blockTo uint64, chainID uint256.Int, lvl log.Lvl) error { + return retireBlocks(ctx, blockFrom, blockTo, chainID, br.tmpDir, br.snapshots, br.db, br.workers, br.downloader, lvl, br.notifier) +} +func (br *BlockRetire) RetireBlocksInBackground(ctx context.Context, forwardProgress uint64, chainID uint256.Int, lvl log.Lvl) { + if br.working.Load() { + // go-routine is still working + return + } + if br.result != nil { + // Prevent invocation for the same range twice, result needs to be cleared in the Result() function + return + } + + br.wg.Add(1) + go func() { + br.working.Store(true) + defer br.working.Store(false) + defer br.wg.Done() + + blockFrom, blockTo, ok := CanRetire(forwardProgress, br.Snapshots()) + if !ok { + return + } + + err := br.RetireBlocks(ctx, blockFrom, blockTo, chainID, lvl) + br.result = &BlockRetireResult{ + BlockFrom: blockFrom, + BlockTo: blockTo, + Err: err, + } + }() +} + +type DBEventNotifier interface { + OnNewSnapshot() +} + +func retireBlocks(ctx context.Context, blockFrom, blockTo uint64, chainID uint256.Int, tmpDir string, snapshots *RoSnapshots, db kv.RoDB, workers int, downloader proto_downloader.DownloaderClient, lvl log.Lvl, notifier DBEventNotifier) error { + log.Log(lvl, "[snapshots] Retire Blocks", "range", fmt.Sprintf("%dk-%dk", blockFrom/1000, blockTo/1000)) + // in future we will do it in background + if err := DumpBlocks(ctx, blockFrom, blockTo, snap.DEFAULT_SEGMENT_SIZE, tmpDir, snapshots.Dir(), db, workers, lvl); err != nil { + return fmt.Errorf("DumpBlocks: %w", err) + } + if err := snapshots.Reopen(); err != nil { + return fmt.Errorf("Reopen: %w", err) + } + idxWorkers := workers + if idxWorkers > 4 { + idxWorkers = 4 + } + if err := BuildIndices(ctx, snapshots, chainID, tmpDir, snapshots.IndicesMax(), idxWorkers, log.LvlInfo); err != nil { + return err + } + if err := snapshots.Reopen(); err != nil { + return fmt.Errorf("Reopen: %w", err) + } + merger := NewMerger(tmpDir, workers, lvl, chainID, notifier) + ranges := merger.FindMergeRanges(snapshots) + if len(ranges) == 0 { + return nil + } + err := merger.Merge(ctx, snapshots, ranges, snapshots.Dir(), true) + if err != nil { + return err + } + if err := snapshots.Reopen(); err != nil { + return fmt.Errorf("Reopen: %w", err) + } + // start seed large .seg of large size + req := &proto_downloader.DownloadRequest{Items: make([]*proto_downloader.DownloadItem, 0, len(snap.AllSnapshotTypes))} + for _, r := range ranges { + if r.to-r.from != snap.DEFAULT_SEGMENT_SIZE { + continue + } + for _, t := range snap.AllSnapshotTypes { + req.Items = append(req.Items, &proto_downloader.DownloadItem{ + Path: snap.SegmentFileName(r.from, r.to, t), + }) + } + } + if len(req.Items) > 0 && downloader != nil { + if _, err := downloader.Download(ctx, req); err != nil { + return err + } + } + return nil +} + +func DumpBlocks(ctx context.Context, blockFrom, blockTo, blocksPerFile uint64, tmpDir, snapDir string, chainDB kv.RoDB, workers int, lvl log.Lvl) error { + if blocksPerFile == 0 { + return nil + } + for i := blockFrom; i < blockTo; i = chooseSegmentEnd(i, blockTo, blocksPerFile) { + if err := dumpBlocksRange(ctx, i, chooseSegmentEnd(i, blockTo, blocksPerFile), tmpDir, snapDir, chainDB, workers, lvl); err != nil { + return err + } + } + return nil +} +func dumpBlocksRange(ctx context.Context, blockFrom, blockTo uint64, tmpDir, snapDir string, chainDB kv.RoDB, workers int, lvl log.Lvl) error { + segmentFile := filepath.Join(snapDir, snap.SegmentFileName(blockFrom, blockTo, snap.Headers)) + if err := DumpHeaders(ctx, chainDB, segmentFile, tmpDir, blockFrom, blockTo, workers, lvl); err != nil { + return fmt.Errorf("DumpHeaders: %w", err) + } + + segmentFile = filepath.Join(snapDir, snap.SegmentFileName(blockFrom, blockTo, snap.Bodies)) + if err := DumpBodies(ctx, chainDB, segmentFile, tmpDir, blockFrom, blockTo, workers, lvl); err != nil { + return fmt.Errorf("DumpBodies: %w", err) + } + + segmentFile = filepath.Join(snapDir, snap.SegmentFileName(blockFrom, blockTo, snap.Transactions)) + if _, err := DumpTxs(ctx, chainDB, segmentFile, tmpDir, blockFrom, blockTo, workers, lvl); err != nil { + return fmt.Errorf("DumpTxs: %w", err) + } + + return nil +} + +// DumpTxs - [from, to) +// Format: hash[0]_1byte + sender_address_2bytes + txnRlp +func DumpTxs(ctx context.Context, db kv.RoDB, segmentFile, tmpDir string, blockFrom, blockTo uint64, workers int, lvl log.Lvl) (firstTxID uint64, err error) { + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + warmupCtx, cancel := context.WithCancel(ctx) + defer cancel() + + chainConfig := tool.ChainConfigFromDB(db) + chainID, _ := uint256.FromBig(chainConfig.ChainID) + + f, err := compress.NewCompressor(ctx, "Transactions", segmentFile, tmpDir, compress.MinPatternScore, workers, lvl) + if err != nil { + return 0, fmt.Errorf("NewCompressor: %w, %s", err, segmentFile) + } + defer f.Close() + + var prevTxID uint64 + numBuf := make([]byte, binary.MaxVarintLen64) + parseCtx := types2.NewTxParseContext(*chainID) + parseCtx.WithSender(false) + slot := types2.TxSlot{} + var sender [20]byte + parse := func(v, valueBuf []byte, senders []common.Address, j int) ([]byte, error) { + if _, err := parseCtx.ParseTransaction(v, 0, &slot, sender[:], false /* hasEnvelope */, nil); err != nil { + return valueBuf, err + } + if len(senders) > 0 { + sender = senders[j] + } + + valueBuf = valueBuf[:0] + valueBuf = append(valueBuf, slot.IDHash[:1]...) + valueBuf = append(valueBuf, sender[:]...) + valueBuf = append(valueBuf, v...) + return valueBuf, nil + } + valueBuf := make([]byte, 16*4096) + addSystemTx := func(tx kv.Tx, txId uint64) error { + binary.BigEndian.PutUint64(numBuf, txId) + tv, err := tx.GetOne(kv.EthTx, numBuf[:8]) + if err != nil { + return err + } + if tv == nil { + if err := f.AddWord(nil); err != nil { + return fmt.Errorf("AddWord1: %d", err) + } + return nil + } + + parseCtx.WithSender(false) + valueBuf, err = parse(tv, valueBuf, nil, 0) + if err != nil { + return err + } + if err := f.AddWord(valueBuf); err != nil { + return fmt.Errorf("AddWord2: %d", err) + } + return nil + } + + firstIDSaved := false + + doWarmup, warmupTxs, warmupSenders := blockTo-blockFrom >= 100_000 && workers > 4, atomic.NewBool(false), atomic.NewBool(false) + from := dbutils.EncodeBlockNumber(blockFrom) + var lastBody types.BodyForStorage + if err := kv.BigChunks(db, kv.HeaderCanonical, from, func(tx kv.Tx, k, v []byte) (bool, error) { + blockNum := binary.BigEndian.Uint64(k) + if blockNum >= blockTo { // [from, to) + return false, nil + } + + h := common.BytesToHash(v) + dataRLP := rawdb.ReadStorageBodyRLP(tx, h, blockNum) + if dataRLP == nil { + return false, fmt.Errorf("body not found: %d, %x", blockNum, h) + } + var body types.BodyForStorage + if e := rlp.DecodeBytes(dataRLP, &body); e != nil { + return false, e + } + lastBody = body + if body.TxAmount == 0 { + return true, nil + } + if doWarmup && !warmupSenders.Load() && blockNum%1_000 == 0 { + kv.ReadAhead(warmupCtx, db, warmupSenders, kv.Senders, dbutils.EncodeBlockNumber(blockNum), 10_000) + } + if doWarmup && !warmupTxs.Load() && blockNum%1_000 == 0 { + kv.ReadAhead(warmupCtx, db, warmupTxs, kv.EthTx, dbutils.EncodeBlockNumber(body.BaseTxId), 100*10_000) + } + senders, err := rawdb.ReadSenders(tx, h, blockNum) + if err != nil { + return false, err + } + + if !firstIDSaved { + firstIDSaved = true + firstTxID = body.BaseTxId + } + j := 0 + + if err := addSystemTx(tx, body.BaseTxId); err != nil { + return false, err + } + if prevTxID > 0 { + prevTxID++ + } else { + prevTxID = body.BaseTxId + } + binary.BigEndian.PutUint64(numBuf, body.BaseTxId+1) + if err := tx.ForAmount(kv.EthTx, numBuf[:8], body.TxAmount-2, func(tk, tv []byte) error { + id := binary.BigEndian.Uint64(tk) + if prevTxID != 0 && id != prevTxID+1 { + panic(fmt.Sprintf("no gaps in tx ids are allowed: block %d does jump from %d to %d", blockNum, prevTxID, id)) + } + prevTxID = id + parseCtx.WithSender(len(senders) == 0) + valueBuf, err = parse(tv, valueBuf, senders, j) + if err != nil { + return fmt.Errorf("%w, block: %d", err, blockNum) + } + if err := f.AddWord(valueBuf); err != nil { + return err + } + j++ + + return nil + }); err != nil { + return false, fmt.Errorf("ForAmount: %w", err) + } + + if err := addSystemTx(tx, body.BaseTxId+uint64(body.TxAmount)-1); err != nil { + return false, err + } + prevTxID++ + + select { + case <-ctx.Done(): + return false, ctx.Err() + case <-logEvery.C: + var m runtime.MemStats + if lvl >= log.LvlInfo { + common2.ReadMemStats(&m) + } + log.Log(lvl, "[snapshots] Dumping txs", "block num", blockNum, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys), + ) + default: + } + return true, nil + }); err != nil { + return 0, fmt.Errorf("BigChunks: %w", err) + } + + expectedCount := lastBody.BaseTxId + uint64(lastBody.TxAmount) - firstTxID + if expectedCount != uint64(f.Count()) { + return 0, fmt.Errorf("incorrect tx count: %d, expected from db: %d", f.Count(), expectedCount) + } + snapDir, _ := filepath.Split(segmentFile) + _, expectedCount, err = expectedTxsAmount(snapDir, blockFrom, blockTo) + if err != nil { + return 0, err + } + if expectedCount != uint64(f.Count()) { + return 0, fmt.Errorf("incorrect tx count: %d, expected from snapshots: %d", f.Count(), expectedCount) + } + + if err := f.Compress(); err != nil { + return 0, fmt.Errorf("compress: %w", err) + } + + _, fileName := filepath.Split(segmentFile) + ext := filepath.Ext(fileName) + log.Log(lvl, "[snapshots] Compression", "ratio", f.Ratio.String(), "file", fileName[:len(fileName)-len(ext)]) + + return firstTxID, nil +} + +// DumpHeaders - [from, to) +func DumpHeaders(ctx context.Context, db kv.RoDB, segmentFilePath, tmpDir string, blockFrom, blockTo uint64, workers int, lvl log.Lvl) error { + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + + f, err := compress.NewCompressor(ctx, "Headers", segmentFilePath, tmpDir, compress.MinPatternScore, workers, lvl) + if err != nil { + return err + } + defer f.Close() + + key := make([]byte, 8+32) + from := dbutils.EncodeBlockNumber(blockFrom) + if err := kv.BigChunks(db, kv.HeaderCanonical, from, func(tx kv.Tx, k, v []byte) (bool, error) { + blockNum := binary.BigEndian.Uint64(k) + if blockNum >= blockTo { + return false, nil + } + copy(key, k) + copy(key[8:], v) + dataRLP, err := tx.GetOne(kv.Headers, key) + if err != nil { + return false, err + } + if dataRLP == nil { + return false, fmt.Errorf("header missed in db: block_num=%d, hash=%x", blockNum, v) + } + h := types.Header{} + if err := rlp.DecodeBytes(dataRLP, &h); err != nil { + return false, err + } + + value := make([]byte, len(dataRLP)+1) // first_byte_of_header_hash + header_rlp + value[0] = h.Hash()[0] + copy(value[1:], dataRLP) + if err := f.AddWord(value); err != nil { + return false, err + } + + select { + case <-ctx.Done(): + return false, ctx.Err() + case <-logEvery.C: + var m runtime.MemStats + if lvl >= log.LvlInfo { + common2.ReadMemStats(&m) + } + log.Log(lvl, "[snapshots] Dumping headers", "block num", blockNum, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys), + ) + default: + } + return true, nil + }); err != nil { + return err + } + if err := f.Compress(); err != nil { + return fmt.Errorf("compress: %w", err) + } + + return nil +} + +// DumpBodies - [from, to) +func DumpBodies(ctx context.Context, db kv.RoDB, segmentFilePath, tmpDir string, blockFrom, blockTo uint64, workers int, lvl log.Lvl) error { + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + + f, err := compress.NewCompressor(ctx, "Bodies", segmentFilePath, tmpDir, compress.MinPatternScore, workers, lvl) + if err != nil { + return err + } + defer f.Close() + + key := make([]byte, 8+32) + from := dbutils.EncodeBlockNumber(blockFrom) + if err := kv.BigChunks(db, kv.HeaderCanonical, from, func(tx kv.Tx, k, v []byte) (bool, error) { + blockNum := binary.BigEndian.Uint64(k) + if blockNum >= blockTo { + return false, nil + } + copy(key, k) + copy(key[8:], v) + dataRLP, err := tx.GetOne(kv.BlockBody, key) + if err != nil { + return false, err + } + if dataRLP == nil { + log.Warn("header missed", "block_num", blockNum, "hash", fmt.Sprintf("%x", v)) + return true, nil + } + + if err := f.AddWord(dataRLP); err != nil { + return false, err + } + + select { + case <-ctx.Done(): + return false, ctx.Err() + case <-logEvery.C: + var m runtime.MemStats + if lvl >= log.LvlInfo { + common2.ReadMemStats(&m) + } + log.Log(lvl, "[snapshots] Wrote into file", "block num", blockNum, + "alloc", common2.ByteCount(m.Alloc), "sys", common2.ByteCount(m.Sys), + ) + default: + } + return true, nil + }); err != nil { + return err + } + if err := f.Compress(); err != nil { + return fmt.Errorf("compress: %w", err) + } + + return nil +} + +var EmptyTxHash = common.Hash{} + +func expectedTxsAmount(snapDir string, blockFrom, blockTo uint64) (firstTxID, expectedCount uint64, err error) { + bodySegmentPath := filepath.Join(snapDir, snap.SegmentFileName(blockFrom, blockTo, snap.Bodies)) + bodiesSegment, err := compress.NewDecompressor(bodySegmentPath) + if err != nil { + return + } + defer bodiesSegment.Close() + + gg := bodiesSegment.MakeGetter() + buf, _ := gg.Next(nil) + firstBody := &types.BodyForStorage{} + if err = rlp.DecodeBytes(buf, firstBody); err != nil { + return + } + firstTxID = firstBody.BaseTxId + + lastBody := new(types.BodyForStorage) + i := uint64(0) + for gg.HasNext() { + i++ + if i == blockTo-blockFrom-1 { + buf, _ = gg.Next(buf[:0]) + if err = rlp.DecodeBytes(buf, lastBody); err != nil { + return + } + if gg.HasNext() { + panic(1) + } + } else { + gg.Skip() + } + } + + expectedCount = lastBody.BaseTxId + uint64(lastBody.TxAmount) - firstBody.BaseTxId + return +} + +func TransactionsIdx(ctx context.Context, chainID uint256.Int, blockFrom, blockTo uint64, snapDir string, tmpDir string, lvl log.Lvl) (err error) { + defer func() { + if rec := recover(); rec != nil { + err = fmt.Errorf("TransactionsIdx: at=%d-%d, %v, %s", blockFrom, blockTo, rec, dbg.Stack()) + } + }() + firstBlockNum := blockFrom + firstTxID, expectedCount, err := expectedTxsAmount(snapDir, blockFrom, blockTo) + if err != nil { + return err + } + bodySegmentPath := filepath.Join(snapDir, snap.SegmentFileName(blockFrom, blockTo, snap.Bodies)) + bodiesSegment, err := compress.NewDecompressor(bodySegmentPath) + if err != nil { + return + } + defer bodiesSegment.Close() + + segmentFilePath := filepath.Join(snapDir, snap.SegmentFileName(blockFrom, blockTo, snap.Transactions)) + d, err := compress.NewDecompressor(segmentFilePath) + if err != nil { + return err + } + defer d.Close() + if uint64(d.Count()) != expectedCount { + panic(fmt.Errorf("expect: %d, got %d\n", expectedCount, d.Count())) + } + + txnHashIdx, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{ + KeyCount: d.Count(), + Enums: true, + BucketSize: 2000, + LeafSize: 8, + TmpDir: tmpDir, + IndexFile: filepath.Join(snapDir, snap.IdxFileName(blockFrom, blockTo, snap.Transactions.String())), + BaseDataID: firstTxID, + EtlBufLimit: etl.BufferOptimalSize / 2, + }) + if err != nil { + return err + } + txnHash2BlockNumIdx, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{ + KeyCount: d.Count(), + Enums: false, + BucketSize: 2000, + LeafSize: 8, + TmpDir: tmpDir, + IndexFile: filepath.Join(snapDir, snap.IdxFileName(blockFrom, blockTo, snap.Transactions2Block.String())), + BaseDataID: firstBlockNum, + EtlBufLimit: etl.BufferOptimalSize / 2, + }) + if err != nil { + return err + } + txnHashIdx.LogLvl(log.LvlDebug) + txnHash2BlockNumIdx.LogLvl(log.LvlDebug) + + parseCtx := types2.NewTxParseContext(chainID) + parseCtx.WithSender(false) + slot := types2.TxSlot{} + bodyBuf, word := make([]byte, 0, 4096), make([]byte, 0, 4096) + + withReadAhead := func(f func(g, bodyGetter *compress.Getter) error) error { + return d.WithReadAhead(func() error { + return bodiesSegment.WithReadAhead(func() error { + return f(d.MakeGetter(), bodiesSegment.MakeGetter()) + }) + }) + } + +RETRY: + if err := withReadAhead(func(g, bodyGetter *compress.Getter) error { + var i, offset, nextPos uint64 + blockNum := firstBlockNum + body := &types.BodyForStorage{} + + bodyBuf, _ = bodyGetter.Next(bodyBuf[:0]) + if err := rlp.DecodeBytes(bodyBuf, body); err != nil { + return err + } + + for g.HasNext() { + word, nextPos = g.Next(word[:0]) + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + for body.BaseTxId+uint64(body.TxAmount) <= firstTxID+i { // skip empty blocks + if !bodyGetter.HasNext() { + return fmt.Errorf("not enough bodies") + } + bodyBuf, _ = bodyGetter.Next(bodyBuf[:0]) + if err := rlp.DecodeBytes(bodyBuf, body); err != nil { + return err + } + blockNum++ + } + + isSystemTx := len(word) == 0 + if isSystemTx { // system-txs hash:pad32(txnID) + binary.BigEndian.PutUint64(slot.IDHash[:], firstTxID+i) + } else { + if _, err := parseCtx.ParseTransaction(word[1+20:], 0, &slot, nil, true /* hasEnvelope */, nil); err != nil { + return fmt.Errorf("ParseTransaction: %w, blockNum: %d, i: %d", err, blockNum, i) + } + } + + if err := txnHashIdx.AddKey(slot.IDHash[:], offset); err != nil { + return err + } + if err := txnHash2BlockNumIdx.AddKey(slot.IDHash[:], blockNum); err != nil { + return err + } + + i++ + offset = nextPos + } + + if i != expectedCount { + panic(fmt.Errorf("expect: %d, got %d\n", expectedCount, i)) + } + + if err := txnHashIdx.Build(); err != nil { + return fmt.Errorf("txnHashIdx: %w", err) + } + if err := txnHash2BlockNumIdx.Build(); err != nil { + return fmt.Errorf("txnHash2BlockNumIdx: %w", err) + } + + return nil + }); err != nil { + if errors.Is(err, recsplit.ErrCollision) { + log.Warn("Building recsplit. Collision happened. It's ok. Restarting with another salt...", "err", err) + txnHashIdx.ResetNextSalt() + txnHash2BlockNumIdx.ResetNextSalt() + goto RETRY + } + return err + } + + return nil +} + +// HeadersIdx - headerHash -> offset (analog of kv.HeaderNumber) +func HeadersIdx(ctx context.Context, segmentFilePath string, firstBlockNumInSegment uint64, tmpDir string, lvl log.Lvl) (err error) { + defer func() { + if rec := recover(); rec != nil { + _, fName := filepath.Split(segmentFilePath) + err = fmt.Errorf("HeadersIdx: at=%s, %v, %s", fName, rec, dbg.Stack()) + } + }() + + d, err := compress.NewDecompressor(segmentFilePath) + if err != nil { + return err + } + defer d.Close() + + hasher := crypto.NewKeccakState() + var h common.Hash + if err := Idx(ctx, d, firstBlockNumInSegment, tmpDir, log.LvlDebug, func(idx *recsplit.RecSplit, i, offset uint64, word []byte) error { + headerRlp := word[1:] + hasher.Reset() + hasher.Write(headerRlp) + hasher.Read(h[:]) + if err := idx.AddKey(h[:], offset); err != nil { + return err + } + return nil + }); err != nil { + return fmt.Errorf("HeadersIdx: %w", err) + } + return nil +} + +func BodiesIdx(ctx context.Context, segmentFilePath string, firstBlockNumInSegment uint64, tmpDir string, lvl log.Lvl) (err error) { + defer func() { + if rec := recover(); rec != nil { + _, fName := filepath.Split(segmentFilePath) + err = fmt.Errorf("BodiesIdx: at=%s, %v, %s", fName, rec, dbg.Stack()) + } + }() + + num := make([]byte, 8) + + d, err := compress.NewDecompressor(segmentFilePath) + if err != nil { + return err + } + defer d.Close() + + if err := Idx(ctx, d, firstBlockNumInSegment, tmpDir, log.LvlDebug, func(idx *recsplit.RecSplit, i, offset uint64, word []byte) error { + n := binary.PutUvarint(num, i) + if err := idx.AddKey(num[:n], offset); err != nil { + return err + } + return nil + }); err != nil { + return fmt.Errorf("BodyNumberIdx: %w", err) + } + return nil +} + +type decompressItem struct { + i, offset uint64 + word []byte + err error +} + +func forEachAsync(ctx context.Context, d *compress.Decompressor) chan decompressItem { + ch := make(chan decompressItem, 1024) + go func() { + defer close(ch) + if err := d.WithReadAhead(func() error { + g := d.MakeGetter() + var wc, pos, nextPos uint64 + word := make([]byte, 0, 4096) + for g.HasNext() { + word, nextPos = g.Next(word[:0]) + select { + case <-ctx.Done(): + return nil + case ch <- decompressItem{i: wc, offset: pos, word: common2.Copy(word)}: + } + wc++ + pos = nextPos + } + return nil + }); err != nil { + ch <- decompressItem{err: err} + } + }() + return ch +} + +// Idx - iterate over segment and building .idx file +func Idx(ctx context.Context, d *compress.Decompressor, firstDataID uint64, tmpDir string, lvl log.Lvl, walker func(idx *recsplit.RecSplit, i, offset uint64, word []byte) error) error { + segmentFileName := d.FilePath() + var extension = filepath.Ext(segmentFileName) + var idxFilePath = segmentFileName[0:len(segmentFileName)-len(extension)] + ".idx" + + rs, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{ + KeyCount: d.Count(), + Enums: true, + BucketSize: 2000, + LeafSize: 8, + TmpDir: tmpDir, + IndexFile: idxFilePath, + BaseDataID: firstDataID, + }) + if err != nil { + return err + } + rs.LogLvl(lvl) + +RETRY: + if err := d.WithReadAhead(func() error { + g := d.MakeGetter() + var i, offset, nextPos uint64 + word := make([]byte, 0, 4096) + for g.HasNext() { + word, nextPos = g.Next(word[:0]) + if err := walker(rs, i, offset, word); err != nil { + return err + } + i++ + offset = nextPos + + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + } + return nil + }); err != nil { + return err + } + + if err = rs.Build(); err != nil { + if errors.Is(err, recsplit.ErrCollision) { + log.Info("Building recsplit. Collision happened. It's ok. Restarting with another salt...", "err", err) + rs.ResetNextSalt() + goto RETRY + } + return err + } + return nil +} + +func ForEachHeader(ctx context.Context, s *RoSnapshots, walker func(header *types.Header) error) error { + r := bytes.NewReader(nil) + err := s.Headers.View(func(snapshots []*HeaderSegment) error { + for _, sn := range snapshots { + ch := forEachAsync(ctx, sn.seg) + for it := range ch { + if it.err != nil { + return nil + } + + header := new(types.Header) + r.Reset(it.word[1:]) + if err := rlp.Decode(r, header); err != nil { + return err + } + if err := walker(header); err != nil { + return err + } + } + } + return nil + }) + if err != nil { + return err + } + + return nil +} + +type Merger struct { + lvl log.Lvl + workers int + tmpDir string + chainID uint256.Int + notifier DBEventNotifier +} + +func NewMerger(tmpDir string, workers int, lvl log.Lvl, chainID uint256.Int, notifier DBEventNotifier) *Merger { + return &Merger{tmpDir: tmpDir, workers: workers, lvl: lvl, chainID: chainID, notifier: notifier} +} + +type mergeRange struct { + from, to uint64 +} + +func (r mergeRange) String() string { return fmt.Sprintf("%dk-%dk", r.from/1000, r.to/1000) } + +func (*Merger) FindMergeRanges(snapshots *RoSnapshots) (res []mergeRange) { + for i := len(snapshots.Headers.segments) - 1; i > 0; i-- { + sn := snapshots.Headers.segments[i] + if sn.To-sn.From >= snap.DEFAULT_SEGMENT_SIZE { // is complete .seg + continue + } + + for _, span := range []uint64{500_000, 100_000, 10_000} { + if sn.To%span != 0 { + continue + } + if sn.To-sn.From == span { + break + } + aggFrom := sn.To - span + res = append(res, mergeRange{from: aggFrom, to: sn.To}) + for snapshots.Headers.segments[i].From > aggFrom { + i-- + } + break + } + } + slices.SortFunc(res, func(i, j mergeRange) bool { return i.from < j.from }) + return res +} +func (m *Merger) filesByRange(snapshots *RoSnapshots, from, to uint64) (toMergeHeaders, toMergeBodies, toMergeTxs []string, err error) { + err = snapshots.Headers.View(func(hSegments []*HeaderSegment) error { + return snapshots.Bodies.View(func(bSegments []*BodySegment) error { + return snapshots.Txs.View(func(tSegments []*TxnSegment) error { + for i, sn := range hSegments { + if sn.From < from { + continue + } + if sn.To > to { + break + } + + toMergeHeaders = append(toMergeHeaders, hSegments[i].seg.FilePath()) + toMergeBodies = append(toMergeBodies, bSegments[i].seg.FilePath()) + toMergeTxs = append(toMergeTxs, tSegments[i].Seg.FilePath()) + } + + return nil + }) + }) + }) + return +} + +// Merge does merge segments in given ranges +func (m *Merger) Merge(ctx context.Context, snapshots *RoSnapshots, mergeRanges []mergeRange, snapDir string, doIndex bool) error { + if len(mergeRanges) == 0 { + return nil + } + logEvery := time.NewTicker(30 * time.Second) + defer logEvery.Stop() + log.Log(m.lvl, "[snapshots] Merge segments", "ranges", fmt.Sprintf("%v", mergeRanges)) + for _, r := range mergeRanges { + toMergeHeaders, toMergeBodies, toMergeTxs, err := m.filesByRange(snapshots, r.from, r.to) + if err != nil { + return err + } + { + segFilePath := filepath.Join(snapDir, snap.SegmentFileName(r.from, r.to, snap.Bodies)) + if err := m.merge(ctx, toMergeBodies, segFilePath, logEvery); err != nil { + return fmt.Errorf("mergeByAppendSegments: %w", err) + } + if doIndex { + if err := BodiesIdx(ctx, segFilePath, r.from, m.tmpDir, m.lvl); err != nil { + return fmt.Errorf("BodiesIdx: %w", err) + } + } + } + + { + segFilePath := filepath.Join(snapDir, snap.SegmentFileName(r.from, r.to, snap.Headers)) + if err := m.merge(ctx, toMergeHeaders, segFilePath, logEvery); err != nil { + return fmt.Errorf("mergeByAppendSegments: %w", err) + } + if doIndex { + if err := HeadersIdx(ctx, segFilePath, r.from, m.tmpDir, m.lvl); err != nil { + return fmt.Errorf("HeadersIdx: %w", err) + } + } + } + + { + segFilePath := filepath.Join(snapDir, snap.SegmentFileName(r.from, r.to, snap.Transactions)) + if err := m.merge(ctx, toMergeTxs, segFilePath, logEvery); err != nil { + return fmt.Errorf("mergeByAppendSegments: %w", err) + } + if doIndex { + if err := TransactionsIdx(ctx, m.chainID, r.from, r.to, snapDir, m.tmpDir, m.lvl); err != nil { + return fmt.Errorf("TransactionsIdx: %w", err) + } + } + } + + if err := snapshots.Reopen(); err != nil { + return fmt.Errorf("ReopenSegments: %w", err) + } + if m.notifier != nil { // notify about new snapshots of any size + m.notifier.OnNewSnapshot() + time.Sleep(1 * time.Second) // i working on blocking API - to ensure client does not use + } + + if err := m.removeOldFiles(toMergeHeaders, snapDir); err != nil { + return err + } + + if err := m.removeOldFiles(toMergeBodies, snapDir); err != nil { + return err + } + + if err := m.removeOldFiles(toMergeTxs, snapDir); err != nil { + return err + } + } + log.Log(m.lvl, "[snapshots] Merge done", "from", mergeRanges[0].from) + return nil +} + +func (m *Merger) merge(ctx context.Context, toMerge []string, targetFile string, logEvery *time.Ticker) error { + var word = make([]byte, 0, 4096) + var expectedTotal int + cList := make([]*compress.Decompressor, len(toMerge)) + for i, cFile := range toMerge { + d, err := compress.NewDecompressor(cFile) + if err != nil { + return err + } + defer d.Close() + cList[i] = d + expectedTotal += d.Count() + } + + f, err := compress.NewCompressor(ctx, "merge", targetFile, m.tmpDir, compress.MinPatternScore, m.workers, m.lvl) + if err != nil { + return err + } + defer f.Close() + + for _, d := range cList { + if err := d.WithReadAhead(func() error { + g := d.MakeGetter() + for g.HasNext() { + word, _ = g.Next(word[:0]) + if err := f.AddWord(word); err != nil { + return err + } + select { + case <-ctx.Done(): + return ctx.Err() + case <-logEvery.C: + _, fName := filepath.Split(targetFile) + log.Info("[snapshots] Merge", "progress", fmt.Sprintf("%.2f%%", 100*float64(f.Count())/float64(expectedTotal)), "to", fName) + default: + } + } + return nil + }); err != nil { + return err + } + d.Close() + } + if f.Count() != expectedTotal { + return fmt.Errorf("unexpected amount after segments merge. got: %d, expected: %d\n", f.Count(), expectedTotal) + } + if err = f.Compress(); err != nil { + return err + } + return nil +} + +func (m *Merger) removeOldFiles(toDel []string, snapDir string) error { + for _, f := range toDel { + _ = os.Remove(f) + ext := filepath.Ext(f) + withoutExt := f[:len(f)-len(ext)] + _ = os.Remove(withoutExt + ".idx") + if strings.HasSuffix(withoutExt, snap.Transactions.String()) { + _ = os.Remove(withoutExt + "-to-block.idx") + _ = os.Remove(withoutExt + "-id.idx") + } + } + tmpFiles, err := snap.TmpFiles(snapDir) + if err != nil { + return err + } + for _, f := range tmpFiles { + _ = os.Remove(f) + } + return nil +} + +//nolint +func assertSegment(segmentFile string) { + d, err := compress.NewDecompressor(segmentFile) + if err != nil { + panic(err) + } + defer d.Close() + var buf []byte + if err := d.WithReadAhead(func() error { + g := d.MakeGetter() + for g.HasNext() { + buf, _ = g.Next(buf[:0]) + } + return nil + }); err != nil { + panic(err) + } +} diff --git a/turbo/snapshotsync/block_snapshots_test.go b/turbo/snapshotsync/block_snapshots_test.go new file mode 100644 index 00000000000..f3c82864fd8 --- /dev/null +++ b/turbo/snapshotsync/block_snapshots_test.go @@ -0,0 +1,263 @@ +package snapshotsync + +import ( + "context" + "path/filepath" + "testing" + "testing/fstest" + + "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/compress" + "github.com/ledgerwatch/erigon-lib/recsplit" + "github.com/ledgerwatch/erigon/common" + "github.com/ledgerwatch/erigon/common/math" + "github.com/ledgerwatch/erigon/eth/ethconfig" + "github.com/ledgerwatch/erigon/params/networkname" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snap" + "github.com/ledgerwatch/erigon/turbo/snapshotsync/snapshothashes" + "github.com/ledgerwatch/log/v3" + "github.com/stretchr/testify/require" +) + +func createTestSegmentFile(t *testing.T, from, to uint64, name snap.Type, dir string) { + c, err := compress.NewCompressor(context.Background(), "test", filepath.Join(dir, snap.SegmentFileName(from, to, name)), dir, 100, 1, log.LvlDebug) + require.NoError(t, err) + defer c.Close() + err = c.AddWord([]byte{1}) + require.NoError(t, err) + err = c.Compress() + require.NoError(t, err) + idx, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{ + KeyCount: 1, + BucketSize: 10, + TmpDir: dir, + IndexFile: filepath.Join(dir, snap.IdxFileName(from, to, name.String())), + LeafSize: 8, + }) + require.NoError(t, err) + defer idx.Close() + err = idx.AddKey([]byte{1}, 0) + require.NoError(t, err) + err = idx.Build() + require.NoError(t, err) + if name == snap.Transactions { + idx, err := recsplit.NewRecSplit(recsplit.RecSplitArgs{ + KeyCount: 1, + BucketSize: 10, + TmpDir: dir, + IndexFile: filepath.Join(dir, snap.IdxFileName(from, to, snap.Transactions2Block.String())), + LeafSize: 8, + }) + require.NoError(t, err) + err = idx.AddKey([]byte{1}, 0) + require.NoError(t, err) + err = idx.Build() + require.NoError(t, err) + defer idx.Close() + } +} + +func TestMergeSnapshots(t *testing.T) { + dir, require := t.TempDir(), require.New(t) + createFile := func(from, to uint64) { + for _, snT := range snap.AllSnapshotTypes { + createTestSegmentFile(t, from, to, snT, dir) + } + } + + N := uint64(7) + createFile(0, 500_000) + for i := uint64(500_000); i < 500_000+N*100_000; i += 100_000 { + createFile(i, i+100_000) + } + cfg := ethconfig.Snapshot{Enabled: true} + s := NewRoSnapshots(cfg, dir) + defer s.Close() + require.NoError(s.Reopen()) + + { + merger := NewMerger(dir, 1, log.LvlInfo, uint256.Int{}, nil) + ranges := merger.FindMergeRanges(s) + require.True(len(ranges) > 0) + err := merger.Merge(context.Background(), s, ranges, s.Dir(), false) + require.NoError(err) + } + + expectedFileName := snap.SegmentFileName(500_000, 1_000_000, snap.Transactions) + d, err := compress.NewDecompressor(filepath.Join(dir, expectedFileName)) + require.NoError(err) + defer d.Close() + a := d.Count() + require.Equal(5, a) + + { + merger := NewMerger(dir, 1, log.LvlInfo, uint256.Int{}, nil) + ranges := merger.FindMergeRanges(s) + require.True(len(ranges) == 0) + err := merger.Merge(context.Background(), s, ranges, s.Dir(), false) + require.NoError(err) + } + + expectedFileName = snap.SegmentFileName(1_100_000, 1_200_000, snap.Transactions) + d, err = compress.NewDecompressor(filepath.Join(dir, expectedFileName)) + require.NoError(err) + defer d.Close() + a = d.Count() + require.Equal(1, a) +} + +func TestCanRetire(t *testing.T) { + require := require.New(t) + cases := []struct { + inFrom, inTo, outFrom, outTo uint64 + can bool + }{ + {0, 1234, 0, 1000, true}, + {1_000_000, 1_120_000, 1_000_000, 1_100_000, true}, + {2_500_000, 4_100_000, 2_500_000, 3_000_000, true}, + {2_500_000, 2_500_100, 2_500_000, 2_500_000, false}, + {1_001_000, 2_000_000, 1_001_000, 1_002_000, true}, + } + for _, tc := range cases { + from, to, can := canRetire(tc.inFrom, tc.inTo) + require.Equal(int(tc.outFrom), int(from)) + require.Equal(int(tc.outTo), int(to)) + require.Equal(tc.can, can, tc.inFrom, tc.inTo) + } +} +func TestOpenAllSnapshot(t *testing.T) { + dir, require := t.TempDir(), require.New(t) + chainSnapshotCfg := snapshothashes.KnownConfig(networkname.MainnetChainName) + chainSnapshotCfg.ExpectBlocks = math.MaxUint64 + cfg := ethconfig.Snapshot{Enabled: true} + createFile := func(from, to uint64, name snap.Type) { createTestSegmentFile(t, from, to, name, dir) } + s := NewRoSnapshots(cfg, dir) + defer s.Close() + err := s.Reopen() + require.NoError(err) + require.Equal(0, len(s.Headers.segments)) + s.Close() + + createFile(500_000, 1_000_000, snap.Bodies) + s = NewRoSnapshots(cfg, dir) + defer s.Close() + require.Equal(0, len(s.Bodies.segments)) //because, no headers and transactions snapshot files are created + s.Close() + + createFile(500_000, 1_000_000, snap.Headers) + createFile(500_000, 1_000_000, snap.Transactions) + s = NewRoSnapshots(cfg, dir) + err = s.Reopen() + require.Error(err) + require.Equal(0, len(s.Headers.segments)) //because, no gaps are allowed (expect snapshots from block 0) + s.Close() + + createFile(0, 500_000, snap.Bodies) + createFile(0, 500_000, snap.Headers) + createFile(0, 500_000, snap.Transactions) + s = NewRoSnapshots(cfg, dir) + defer s.Close() + + err = s.Reopen() + require.NoError(err) + require.Equal(2, len(s.Headers.segments)) + + ok, err := s.ViewTxs(10, func(sn *TxnSegment) error { + require.Equal(int(sn.To), 500_000) + return nil + }) + require.NoError(err) + require.True(ok) + + ok, err = s.ViewTxs(500_000, func(sn *TxnSegment) error { + require.Equal(int(sn.To), 1_000_000) // [from:to) + return nil + }) + require.NoError(err) + require.True(ok) + + ok, err = s.ViewTxs(1_000_000, func(sn *TxnSegment) error { + return nil + }) + require.NoError(err) + require.False(ok) + + // Erigon may create new snapshots by itself - with high bigger than hardcoded ExpectedBlocks + // ExpectedBlocks - says only how much block must come from Torrent + chainSnapshotCfg.ExpectBlocks = 500_000 - 1 + s = NewRoSnapshots(cfg, dir) + err = s.Reopen() + require.NoError(err) + defer s.Close() + require.Equal(2, len(s.Headers.segments)) + + createFile(500_000, 900_000, snap.Headers) + createFile(500_000, 900_000, snap.Bodies) + createFile(500_000, 900_000, snap.Transactions) + chainSnapshotCfg.ExpectBlocks = math.MaxUint64 + s = NewRoSnapshots(cfg, dir) + defer s.Close() + err = s.Reopen() + require.NoError(err) +} + +func TestParseCompressedFileName(t *testing.T) { + require := require.New(t) + fs := fstest.MapFS{ + "a": &fstest.MapFile{}, + "1-a": &fstest.MapFile{}, + "1-2-a": &fstest.MapFile{}, + "1-2-bodies.info": &fstest.MapFile{}, + "1-2-bodies.seg": &fstest.MapFile{}, + "v2-1-2-bodies.seg": &fstest.MapFile{}, + "v0-1-2-bodies.seg": &fstest.MapFile{}, + "v1-1-2-bodies.seg": &fstest.MapFile{}, + } + stat := func(name string) string { + s, err := fs.Stat(name) + require.NoError(err) + return s.Name() + } + _, err := snap.ParseFileName("", stat("a")) + require.Error(err) + _, err = snap.ParseFileName("", stat("1-a")) + require.Error(err) + _, err = snap.ParseFileName("", stat("1-2-a")) + require.Error(err) + _, err = snap.ParseFileName("", stat("1-2-bodies.info")) + require.Error(err) + _, err = snap.ParseFileName("", stat("1-2-bodies.seg")) + require.Error(err) + _, err = snap.ParseFileName("", stat("v2-1-2-bodies.seg")) + require.Error(err) + _, err = snap.ParseFileName("", stat("v0-1-2-bodies.seg")) + require.Error(err) + + f, err := snap.ParseFileName("", stat("v1-1-2-bodies.seg")) + require.NoError(err) + require.Equal(f.T, snap.Bodies) + require.Equal(1_000, int(f.From)) + require.Equal(2_000, int(f.To)) +} + +func BenchmarkName(b *testing.B) { + a := common.Address{} + c := a[:] + var x common.Address + b.Run("a1", func(b *testing.B) { + for i := 0; i < b.N; i++ { + x = common.BytesToAddress(c) + } + }) + b.Run("a2", func(b *testing.B) { + for i := 0; i < b.N; i++ { + x = common.BytesToAddressNoCopy(c) + } + }) + b.Run("a3", func(b *testing.B) { + for i := 0; i < b.N; i++ { + x = *(*common.Address)(c) + } + }) + _ = x +} diff --git a/turbo/snapshotsync/bodies_snapshot.go b/turbo/snapshotsync/bodies_snapshot.go deleted file mode 100644 index 9000fd08c79..00000000000 --- a/turbo/snapshotsync/bodies_snapshot.go +++ /dev/null @@ -1,260 +0,0 @@ -package snapshotsync - -import ( - "bytes" - "context" - "encoding/binary" - "errors" - "fmt" - "os" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" -) - -func GenerateBodiesSnapshot(ctx context.Context, readTX kv.Tx, writeTX kv.RwTx, toBlock uint64) error { - readBodyCursor, err := readTX.Cursor(kv.BlockBody) - if err != nil { - return err - } - - writeBodyCursor, err := writeTX.RwCursor(kv.BlockBody) - if err != nil { - return err - } - writeEthTXCursor, err := writeTX.RwCursor(kv.EthTx) - if err != nil { - return err - } - readEthTXCursor, err := readTX.Cursor(kv.EthTx) - if err != nil { - return err - } - - var expectedBaseTxId uint64 - err = ethdb.Walk(readBodyCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - if binary.BigEndian.Uint64(k) > toBlock { - return false, nil - } - - canonocalHash, err := readTX.GetOne(kv.HeaderCanonical, dbutils.EncodeBlockNumber(binary.BigEndian.Uint64(k))) - if err != nil { - return false, err - } - if !bytes.Equal(canonocalHash, k[8:]) { - return true, nil - } - bd := &types.BodyForStorage{} - err = rlp.DecodeBytes(v, bd) - if err != nil { - return false, fmt.Errorf("block %s decode err %w", common.Bytes2Hex(k), err) - } - baseTxId := bd.BaseTxId - amount := bd.TxAmount - - bd.BaseTxId = expectedBaseTxId - newV, err := rlp.EncodeToBytes(bd) - if err != nil { - return false, err - } - err = writeBodyCursor.Append(common.CopyBytes(k), newV) - if err != nil { - return false, err - } - - newExpectedTx := expectedBaseTxId - err = ethdb.Walk(readEthTXCursor, dbutils.EncodeBlockNumber(baseTxId), 0, func(k, v []byte) (bool, error) { - if newExpectedTx >= expectedBaseTxId+uint64(amount) { - return false, nil - } - err = writeEthTXCursor.Append(dbutils.EncodeBlockNumber(newExpectedTx), common.CopyBytes(v)) - if err != nil { - return false, err - } - newExpectedTx++ - return true, nil - }) - if err != nil { - return false, err - } - if newExpectedTx > expectedBaseTxId+uint64(amount) { - fmt.Println("newExpectedTx > expectedBaseTxId+amount", newExpectedTx, expectedBaseTxId, amount, "block", common.Bytes2Hex(k)) - return false, errors.New("newExpectedTx > expectedBaseTxId+amount") - } - expectedBaseTxId += uint64(amount) - return true, nil - }) - if err != nil { - return err - } - return nil -} - -func CreateBodySnapshot(readTx kv.Tx, logger log.Logger, lastBlock uint64, snapshotPath string) error { - db, err := mdbx.NewMDBX(logger).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.BlockBody: kv.ChaindataTablesCfg[kv.BlockBody], - kv.EthTx: kv.ChaindataTablesCfg[kv.EthTx], - } - }).Path(snapshotPath).Open() - if err != nil { - return err - } - - defer db.Close() - writeTX, err := db.BeginRw(context.Background()) - if err != nil { - return err - } - defer writeTX.Rollback() - err = GenerateBodiesSnapshot(context.TODO(), readTx, writeTX, lastBlock) - if err != nil { - return err - } - return writeTX.Commit() -} - -func OpenBodiesSnapshot(logger log.Logger, dbPath string) (kv.RoDB, error) { - return mdbx.NewMDBX(logger).Path(dbPath).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.BlockBody: kv.ChaindataTablesCfg[kv.BlockBody], - kv.EthTx: kv.ChaindataTablesCfg[kv.EthTx], - } - }).Readonly().Open() -} - -func RemoveBlocksData(db kv.RoDB, tx kv.RwTx, newSnapshot uint64) (err error) { - log.Info("Remove blocks data", "to", newSnapshot) - if _, ok := db.(snapshotdb.SnapshotUpdater); !ok { - return errors.New("db don't implement snapshotUpdater interface") - } - bodiesSnapshot := db.(snapshotdb.SnapshotUpdater).BodiesSnapshot() - if bodiesSnapshot == nil { - log.Info("bodiesSnapshot is empty") - return nil - } - blockBodySnapshotReadTX, err := bodiesSnapshot.BeginRo(context.Background()) - if err != nil { - return err - } - defer blockBodySnapshotReadTX.Rollback() - ethtxSnapshotReadTX, err := blockBodySnapshotReadTX.Cursor(kv.EthTx) - if err != nil { - return err - } - lastEthTXSnapshotKey, _, err := ethtxSnapshotReadTX.Last() - if err != nil { - return err - } - rewriteId := binary.BigEndian.Uint64(lastEthTXSnapshotKey) + 1 - - writeTX := tx.(snapshotdb.DBTX).DBTX() - blockBodyWriteCursor, err := writeTX.RwCursor(kv.BlockBody) - if err != nil { - return fmt.Errorf("get bodies cursor %w", err) - } - ethTXWriteCursor, err := writeTX.RwCursor(kv.EthTx) - if err != nil { - return fmt.Errorf("get ethtx cursor %w", err) - } - - logPrefix := "RemoveBlocksData" - bodiesCollector := etl.NewCollector(os.TempDir(), etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer bodiesCollector.Close(logPrefix) - ethTXCollector := etl.NewCollector(os.TempDir(), etl.NewSortableBuffer(etl.BufferOptimalSize)) - defer ethTXCollector.Close(logPrefix) - err = ethdb.Walk(blockBodyWriteCursor, dbutils.BlockBodyKey(0, common.Hash{}), 0, func(k, v []byte) (bool, error) { - if binary.BigEndian.Uint64(k) > newSnapshot { - return false, nil - } - has, err := blockBodySnapshotReadTX.Has(kv.BlockBody, k) - if err != nil { - return false, err - } - bd := types.BodyForStorage{} - err = rlp.DecodeBytes(v, &bd) - if err != nil { - return false, err - } - - if has { - innerErr := blockBodyWriteCursor.Delete(k, nil) - if innerErr != nil { - return false, fmt.Errorf("remove %v err:%w", common.Bytes2Hex(k), innerErr) - } - for i := bd.BaseTxId; i < bd.BaseTxId+uint64(bd.TxAmount); i++ { - err = ethTXWriteCursor.Delete(dbutils.EncodeBlockNumber(i), nil) - if err != nil { - return false, err - } - } - } else { - collectKey := common.CopyBytes(k) - oldBaseTxId := bd.BaseTxId - bd.BaseTxId = rewriteId - bodyBytes, err := rlp.EncodeToBytes(bd) - if err != nil { - return false, err - } - - if bd.TxAmount > 0 { - txIdKey := make([]byte, 8) - binary.BigEndian.PutUint64(txIdKey, oldBaseTxId) - i := uint32(0) - - for k, v, err := ethTXWriteCursor.SeekExact(txIdKey); k != nil; k, v, err = ethTXWriteCursor.Next() { - if err != nil { - return false, err - } - - err = ethTXCollector.Collect(dbutils.EncodeBlockNumber(rewriteId+uint64(i)), common.CopyBytes(v)) - if err != nil { - return false, err - } - - i++ - if i >= bd.TxAmount { - break - } - } - } - //we need to remove it to use snapshot data instead - for i := oldBaseTxId; i < oldBaseTxId+uint64(bd.TxAmount); i++ { - err = ethTXWriteCursor.Delete(dbutils.EncodeBlockNumber(i), nil) - if err != nil { - return false, err - } - } - - rewriteId += uint64(bd.TxAmount) - - err = bodiesCollector.Collect(collectKey, bodyBytes) - if err != nil { - return false, err - } - } - - return true, nil - }) - if err != nil { - return err - } - err = bodiesCollector.Load("bodies", writeTX, kv.BlockBody, etl.IdentityLoadFunc, etl.TransformArgs{}) - if err != nil { - return err - } - - err = ethTXCollector.Load("ethtx", writeTX, kv.EthTx, etl.IdentityLoadFunc, etl.TransformArgs{}) - if err != nil { - return err - } - return nil -} diff --git a/turbo/snapshotsync/build_infobytes.go b/turbo/snapshotsync/build_infobytes.go deleted file mode 100644 index 839970f34ba..00000000000 --- a/turbo/snapshotsync/build_infobytes.go +++ /dev/null @@ -1,46 +0,0 @@ -package snapshotsync - -import ( - "fmt" - "io" - "os" - "path/filepath" - "strings" - - "github.com/anacrolix/torrent/metainfo" -) - -func BuildInfoBytesForSnapshot(root string, fileName string) (metainfo.Info, error) { - - path := filepath.Join(root, fileName) - fi, err := os.Stat(path) - if err != nil { - return metainfo.Info{}, err - } - relPath, err := filepath.Rel(root, path) - if err != nil { - return metainfo.Info{}, fmt.Errorf("error getting relative path: %s", err) - } - - info := metainfo.Info{ - Name: filepath.Base(root), - PieceLength: DefaultChunkSize, - Length: fi.Size(), - Files: []metainfo.FileInfo{ - { - Length: fi.Size(), - Path: []string{relPath}, - PathUTF8: nil, - }, - }, - } - - err = info.GeneratePieces(func(fi metainfo.FileInfo) (io.ReadCloser, error) { - return os.Open(filepath.Join(root, strings.Join(fi.Path, string(filepath.Separator)))) - }) - if err != nil { - err = fmt.Errorf("error generating pieces: %s", err) - return metainfo.Info{}, err - } - return info, nil -} diff --git a/turbo/snapshotsync/client.go b/turbo/snapshotsync/client.go deleted file mode 100644 index 597db6056fd..00000000000 --- a/turbo/snapshotsync/client.go +++ /dev/null @@ -1,19 +0,0 @@ -package snapshotsync - -import "google.golang.org/grpc" - -//go:generate ls ./../../interfaces/snapshot_downloader -//go:generate protoc --go_out=. --go-grpc_out=. --proto_path=./../../interfaces/snapshot_downloader "external_downloader.proto" -I=. -I=./../../build/include/google - -func NewClient(addr string) (DownloaderClient, func() error, error) { - opts := []grpc.DialOption{ - grpc.WithInsecure(), - } - - conn, err := grpc.Dial(addr, opts...) - if err != nil { - return nil, nil, err - } - - return NewDownloaderClient(conn), conn.Close, nil -} diff --git a/turbo/snapshotsync/const.go b/turbo/snapshotsync/const.go index 349b08e3dc1..10566537903 100644 --- a/turbo/snapshotsync/const.go +++ b/turbo/snapshotsync/const.go @@ -2,366 +2,8 @@ package snapshotsync import ( "errors" - - "github.com/anacrolix/torrent/metainfo" - "github.com/ledgerwatch/erigon/params" -) - -const ( - DefaultChunkSize = 1024 * 1024 - MdbxFilename = "mdbx.dat" - EpochSize = 500_000 - - //todo It'll be changed after enabling new snapshot generation mechanism - HeadersSnapshotHash = "0000000000000000000000000000000000000000" - BlocksSnapshotHash = "0000000000000000000000000000000000000000" - StateSnapshotHash = "0000000000000000000000000000000000000000" - - SnapshotInfoHashPrefix = "ih" - SnapshotInfoBytesPrefix = "ib" ) var ( - TorrentHashes = map[uint64]map[SnapshotType]metainfo.Hash{ - params.MainnetChainConfig.ChainID.Uint64(): { - SnapshotType_headers: metainfo.NewHashFromHex(HeadersSnapshotHash), - SnapshotType_bodies: metainfo.NewHashFromHex(BlocksSnapshotHash), - SnapshotType_state: metainfo.NewHashFromHex(StateSnapshotHash), - }, - } ErrInvalidSnapshot = errors.New("this snapshot for this chainID not supported ") ) - -func GetAvailableSnapshotTypes(chainID uint64) []SnapshotType { - v := TorrentHashes[chainID] - res := make([]SnapshotType, 0, len(v)) - for i := range v { - res = append(res, i) - } - return res -} - -var Trackers = [][]string{{ - "http://35.189.110.210:80/announce", -}, { - "udp://tracker.openbittorrent.com:80", - "udp://tracker.openbittorrent.com:80", - "udp://tracker.publicbt.com:80", - "udp://coppersurfer.tk:6969/announce", - "udp://open.demonii.com:1337", - "http://bttracker.crunchbanglinux.org:6969/announce", - "udp://wambo.club:1337/announce", - "udp://tracker.dutchtracking.com:6969/announce", - "udp://tc.animereactor.ru:8082/announce", - "udp://tracker.justseed.it:1337/announce", - "udp://tracker.leechers-paradise.org:6969/announce", - "udp://tracker.opentrackr.org:1337/announce", - "https://open.kickasstracker.com:443/announce", - "udp://tracker.coppersurfer.tk:6969/announce", - "udp://open.stealth.si:80/announce", - "http://87.253.152.137/announce", - "http://91.216.110.47/announce", - "http://91.217.91.21:3218/announce", - "http://91.218.230.81:6969/announce", - "http://93.92.64.5/announce", - "http://atrack.pow7.com/announce", - "http://bt.henbt.com:2710/announce", - "http://bt.pusacg.org:8080/announce", - "https://tracker.bt-hash.com:443/announce", - "udp://tracker.leechers-paradise.org:6969", - "https://182.176.139.129:6969/announce", - "udp://zephir.monocul.us:6969/announce", - "https://tracker.dutchtracking.com:80/announce", - "https://grifon.info:80/announce", - "udp://tracker.kicks-ass.net:80/announce", - "udp://p4p.arenabg.com:1337/announce", - "udp://tracker.aletorrenty.pl:2710/announce", - "udp://tracker.sktorrent.net:6969/announce", - "udp://tracker.internetwarriors.net:1337/announce", - "https://tracker.parrotsec.org:443/announce", - "https://tracker.moxing.party:6969/announce", - "https://tracker.ipv6tracker.ru:80/announce", - "https://tracker.fastdownload.xyz:443/announce", - "udp://open.stealth.si:80/announce", - "https://gwp2-v19.rinet.ru:80/announce", - "https://tr.kxmp.cf:80/announce", - "https://explodie.org:6969/announce", -}, { - "udp://zephir.monocul.us:6969/announce", - "udp://tracker.torrent.eu.org:451/announce", - "udp://tracker.uw0.xyz:6969/announce", - "udp://tracker.cyberia.is:6969/announce", - "http://tracker.files.fm:6969/announce", - "udp://tracker.zum.bi:6969/announce", - "http://tracker.nyap2p.com:8080/announce", - "udp://opentracker.i2p.rocks:6969/announce", - "udp://tracker.zerobytes.xyz:1337/announce", - "https://tracker.tamersunion.org:443/announce", - "https://w.wwwww.wtf:443/announce", - "https://tracker.imgoingto.icu:443/announce", - "udp://blokas.io:6969/announce", - "udp://api.bitumconference.ru:6969/announce", - "udp://discord.heihachi.pw:6969/announce", - "udp://cutiegirl.ru:6969/announce", - "udp://fe.dealclub.de:6969/announce", - "udp://ln.mtahost.co:6969/announce", - "udp://vibe.community:6969/announce", - "http://vpn.flying-datacenter.de:6969/announce", - "udp://eliastre100.fr:6969/announce", - "udp://wassermann.online:6969/announce", - "udp://retracker.local.msn-net.ru:6969/announce", - "udp://chanchan.uchuu.co.uk:6969/announce", - "udp://kanal-4.de:6969/announce", - "udp://handrew.me:6969/announce", - "udp://mail.realliferpg.de:6969/announce", - "udp://bubu.mapfactor.com:6969/announce", - "udp://mts.tvbit.co:6969/announce", - "udp://6ahddutb1ucc3cp.ru:6969/announce", - "udp://adminion.n-blade.ru:6969/announce", - "udp://contra.sf.ca.us:6969/announce", - "udp://61626c.net:6969/announce", - "udp://benouworldtrip.fr:6969/announce", - "udp://sd-161673.dedibox.fr:6969/announce", - "udp://cdn-1.gamecoast.org:6969/announce", - "udp://cdn-2.gamecoast.org:6969/announce", - "udp://daveking.com:6969/announce", - "udp://bms-hosxp.com:6969/announce", - "udp://teamspeak.value-wolf.org:6969/announce", - "udp://edu.uifr.ru:6969/announce", - "udp://adm.category5.tv:6969/announce", - "udp://code2chicken.nl:6969/announce", - "udp://t1.leech.ie:1337/announce", - "udp://forever-tracker.zooki.xyz:6969/announce", - "udp://free-tracker.zooki.xyz:6969/announce", - "udp://public.publictracker.xyz:6969/announce", - "udp://public-tracker.zooki.xyz:6969/announce", - "udp://vps2.avc.cx:7171/announce", - "udp://tracker.fileparadise.in:1337/announce", - "udp://tracker.skynetcloud.site:6969/announce", - "udp://z.mercax.com:53/announce", - "https://publictracker.pp.ua:443/announce", - "udp://us-tracker.publictracker.xyz:6969/announce", - "udp://open.stealth.si:80/announce", - "http://tracker1.itzmx.com:8080/announce", - "http://vps02.net.orel.ru:80/announce", - "http://tracker.gbitt.info:80/announce", - "http://tracker.bt4g.com:2095/announce", - "https://tracker.nitrix.me:443/announce", - "udp://aaa.army:8866/announce", - "udp://tracker.vulnix.sh:6969/announce", - "udp://engplus.ru:6969/announce", - "udp://movies.zsw.ca:6969/announce", - "udp://storage.groupees.com:6969/announce", - "udp://nagios.tks.sumy.ua:80/announce", - "udp://tracker.v6speed.org:6969/announce", - "udp://47.ip-51-68-199.eu:6969/announce", - "udp://aruacfilmes.com.br:6969/announce", - "https://trakx.herokuapp.com:443/announce", - "udp://inferno.demonoid.is:3391/announce", - "udp://publictracker.xyz:6969/announce", - "http://tracker2.itzmx.com:6961/announce", - "http://tracker3.itzmx.com:6961/announce", - "udp://retracker.akado-ural.ru:80/announce", - "udp://tracker-udp.gbitt.info:80/announce", - "http://h4.trakx.nibba.trade:80/announce", - "udp://tracker.army:6969/announce", - "http://tracker.anonwebz.xyz:8080/announce", - "udp://tracker.shkinev.me:6969/announce", - "http://0205.uptm.ch:6969/announce", - "udp://tracker.zooki.xyz:6969/announce", - "udp://forever.publictracker.xyz:6969/announce", - "udp://tracker.moeking.me:6969/announce", - "udp://ultra.zt.ua:6969/announce", - "udp://tracker.publictracker.xyz:6969/announce", - "udp://ipv4.tracker.harry.lu:80/announce", - "udp://u.wwwww.wtf:1/announce", - "udp://line-net.ru:6969/announce", - "udp://dpiui.reedlan.com:6969/announce", - "udp://tracker.zemoj.com:6969/announce", - "udp://t3.leech.ie:1337/announce", - "http://t.nyaatracker.com:80/announce", - "udp://exodus.desync.com:6969/announce", - "udp://valakas.rollo.dnsabr.com:2710/announce", - "udp://tracker.ds.is:6969/announce", - "udp://tracker.opentrackr.org:1337/announce", - "udp://tracker0.ufibox.com:6969/announce", - "https://tracker.hama3.net:443/announce", - "udp://opentor.org:2710/announce", - "udp://t2.leech.ie:1337/announce", - "https://1337.abcvg.info:443/announce", - "udp://git.vulnix.sh:6969/announce", - "udp://retracker.lanta-net.ru:2710/announce", - "udp://tracker.lelux.fi:6969/announce", - "udp://bt1.archive.org:6969/announce", - "udp://admin.videoenpoche.info:6969/announce", - "udp://drumkitx.com:6969/announce", - "udp://tracker.dler.org:6969/announce", - "udp://koli.services:6969/announce", - "udp://tracker.dyne.org:6969/announce", - "http://torrenttracker.nwc.acsalaska.net:6969/announce", - "udp://rutorrent.frontline-mod.com:6969/announce", - "http://rt.tace.ru:80/announce", - "udp://explodie.org:6969/announce", -}, { - "udp://public.popcorn-tracker.org:6969/announce", - "http://104.28.1.30:8080/announce", - "http://104.28.16.69/announce", - "http://107.150.14.110:6969/announce", - "http://109.121.134.121:1337/announce", - "http://114.55.113.60:6969/announce", - "http://125.227.35.196:6969/announce", - "http://128.199.70.66:5944/announce", - "http://157.7.202.64:8080/announce", - "http://158.69.146.212:7777/announce", - "http://173.254.204.71:1096/announce", - "http://178.175.143.27/announce", - "http://178.33.73.26:2710/announce", - "http://182.176.139.129:6969/announce", - "http://185.5.97.139:8089/announce", - "http://188.165.253.109:1337/announce", - "http://194.106.216.222/announce", - "http://195.123.209.37:1337/announce", - "http://210.244.71.25:6969/announce", - "http://210.244.71.26:6969/announce", - "http://213.159.215.198:6970/announce", - "http://213.163.67.56:1337/announce", - "http://37.19.5.139:6969/announce", - "http://37.19.5.155:6881/announce", - "http://46.4.109.148:6969/announce", - "http://5.79.249.77:6969/announce", - "http://5.79.83.193:2710/announce", - "http://51.254.244.161:6969/announce", - "http://59.36.96.77:6969/announce", - "http://74.82.52.209:6969/announce", - "http://80.246.243.18:6969/announce", - "http://81.200.2.231/announce", - "http://85.17.19.180/announce", - "http://87.248.186.252:8080/announce", - "http://87.253.152.137/announce", - "http://91.216.110.47/announce", - "http://91.217.91.21:3218/announce", - "http://91.218.230.81:6969/announce", - "http://93.92.64.5/announce", - "http://atrack.pow7.com/announce", - "http://bt.henbt.com:2710/announce", - "http://bt.pusacg.org:8080/announce", - "http://bt2.careland.com.cn:6969/announce", - "http://explodie.org:6969/announce", - "http://mgtracker.org:2710/announce", - "http://mgtracker.org:6969/announce", - "http://open.acgtracker.com:1096/announce", - "http://open.lolicon.eu:7777/announce", - "http://open.touki.ru/announce.php", - "http://p4p.arenabg.ch:1337/announce", - "http://p4p.arenabg.com:1337/announce", - "http://pow7.com:80/announce", - "http://retracker.gorcomnet.ru/announce", - "http://retracker.krs-ix.ru/announce", - "http://retracker.krs-ix.ru:80/announce", - "http://secure.pow7.com/announce", - "http://t1.pow7.com/announce", - "http://t2.pow7.com/announce", - "http://thetracker.org:80/announce", - "http://torrent.gresille.org/announce", - "http://torrentsmd.com:8080/announce", - "http://tracker.aletorrenty.pl:2710/announce", - "http://tracker.baravik.org:6970/announce", - "http://tracker.bittor.pw:1337/announce", - "http://tracker.bittorrent.am/announce", - "http://tracker.calculate.ru:6969/announce", - "http://tracker.dler.org:6969/announce", - "http://tracker.dutchtracking.com/announce", - "http://tracker.dutchtracking.com:80/announce", - "http://tracker.dutchtracking.nl/announce", - "http://tracker.dutchtracking.nl:80/announce", - "http://tracker.edoardocolombo.eu:6969/announce", - "http://tracker.ex.ua/announce", - "http://tracker.ex.ua:80/announce", - "http://tracker.filetracker.pl:8089/announce", - "http://tracker.flashtorrents.org:6969/announce", - "http://tracker.grepler.com:6969/announce", - "http://tracker.internetwarriors.net:1337/announce", - "http://tracker.kicks-ass.net/announce", - "http://tracker.kicks-ass.net:80/announce", - "http://tracker.kuroy.me:5944/announce", - "http://tracker.mg64.net:6881/announce", - "http://tracker.opentrackr.org:1337/announce", - "http://tracker.skyts.net:6969/announce", - "http://tracker.tfile.me/announce", - "http://tracker.tiny-vps.com:6969/announce", - "http://tracker.tvunderground.org.ru:3218/announce", - "http://tracker.yoshi210.com:6969/announc", - "http://tracker1.wasabii.com.tw:6969/announce", - "http://tracker2.itzmx.com:6961/announce", - "http://tracker2.wasabii.com.tw:6969/announce", - "http://www.wareztorrent.com/announce", - "http://www.wareztorrent.com:80/announce", - "https://104.28.17.69/announce", - "https://www.wareztorrent.com/announce", - "udp://107.150.14.110:6969/announce", - "udp://109.121.134.121:1337/announce", - "udp://114.55.113.60:6969/announce", - "udp://128.199.70.66:5944/announce", - "udp://151.80.120.114:2710/announce", - "udp://168.235.67.63:6969/announce", - "udp://178.33.73.26:2710/announce", - "udp://182.176.139.129:6969/announce", - "udp://185.5.97.139:8089/announce", - "udp://185.86.149.205:1337/announce", - "udp://188.165.253.109:1337/announce", - "udp://191.101.229.236:1337/announce", - "udp://194.106.216.222:80/announce", - "udp://195.123.209.37:1337/announce", - "udp://195.123.209.40:80/announce", - "udp://208.67.16.113:8000/announce", - "udp://213.163.67.56:1337/announce", - "udp://37.19.5.155:2710/announce", - "udp://46.4.109.148:6969/announce", - "udp://5.79.249.77:6969/announce", - "udp://5.79.83.193:6969/announce", - "udp://51.254.244.161:6969/announce", - "udp://62.138.0.158:6969/announce", - "udp://62.212.85.66:2710/announce", - "udp://74.82.52.209:6969/announce", - "udp://85.17.19.180:80/announce", - "udp://89.234.156.205:80/announce", - "udp://9.rarbg.com:2710/announce", - "udp://9.rarbg.me:2780/announce", - "udp://9.rarbg.to:2730/announce", - "udp://91.218.230.81:6969/announce", - "udp://94.23.183.33:6969/announce", - "udp://bt.xxx-tracker.com:2710/announce", - "udp://eddie4.nl:6969/announce", - "udp://explodie.org:6969/announce", - "udp://mgtracker.org:2710/announce", - "udp://open.stealth.si:80/announce", - "udp://p4p.arenabg.com:1337/announce", - "udp://shadowshq.eddie4.nl:6969/announce", - "udp://shadowshq.yi.org:6969/announce", - "udp://torrent.gresille.org:80/announce", - "udp://tracker.aletorrenty.pl:2710/announce", - "udp://tracker.bittor.pw:1337/announce", - "udp://tracker.coppersurfer.tk:6969/announce", - "udp://tracker.eddie4.nl:6969/announce", - "udp://tracker.ex.ua:80/announce", - "udp://tracker.filetracker.pl:8089/announce", - "udp://tracker.flashtorrents.org:6969/announce", - "udp://tracker.grepler.com:6969/announce", - "udp://tracker.ilibr.org:80/announce", - "udp://tracker.internetwarriors.net:1337/announce", - "udp://tracker.kicks-ass.net:80/announce", - "udp://tracker.kuroy.me:5944/announce", - "udp://tracker.leechers-paradise.org:6969/announce", - "udp://tracker.mg64.net:2710/announce", - "udp://tracker.mg64.net:6969/announce", - "udp://tracker.opentrackr.org:1337/announce", - "udp://tracker.piratepublic.com:1337/announce", - "udp://tracker.sktorrent.net:6969/announce", - "udp://tracker.skyts.net:6969/announce", - "udp://tracker.tiny-vps.com:6969/announce", - "udp://tracker.yoshi210.com:6969/announce", - "udp://tracker2.indowebster.com:6969/announce", - "udp://tracker4.piratux.com:6969/announce", - "udp://zer0day.ch:1337/announce", - "udp://zer0day.to:1337/announce", -}} diff --git a/turbo/snapshotsync/downloader.go b/turbo/snapshotsync/downloader.go deleted file mode 100644 index 9aedb3bf6f5..00000000000 --- a/turbo/snapshotsync/downloader.go +++ /dev/null @@ -1,408 +0,0 @@ -package snapshotsync - -import ( - "bytes" - "context" - "encoding/binary" - "errors" - "fmt" - "path/filepath" - "time" - - "github.com/anacrolix/torrent/bencode" - "github.com/ledgerwatch/erigon-lib/kv" - - lg "github.com/anacrolix/log" - "github.com/anacrolix/torrent" - "github.com/anacrolix/torrent/metainfo" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/log/v3" - "golang.org/x/sync/errgroup" -) - -type Client struct { - Cli *torrent.Client - snapshotsDir string - trackers [][]string -} - -func New(snapshotsDir string, seeding bool, peerID string) (*Client, error) { - torrentConfig := DefaultTorrentConfig() - torrentConfig.Seed = seeding - torrentConfig.DataDir = snapshotsDir - torrentConfig.UpnpID = torrentConfig.UpnpID + "leecher" - torrentConfig.PeerID = peerID - - torrentClient, err := torrent.NewClient(torrentConfig) - if err != nil { - log.Error("Fail to start torrnet client", "err", err) - return nil, fmt.Errorf("fail to start: %w", err) - } - - return &Client{ - Cli: torrentClient, - snapshotsDir: snapshotsDir, - trackers: Trackers, - }, nil -} - -func DefaultTorrentConfig() *torrent.ClientConfig { - torrentConfig := torrent.NewDefaultClientConfig() - torrentConfig.ListenPort = 0 - torrentConfig.NoDHT = true - torrentConfig.DisableTrackers = false - torrentConfig.Debug = false - torrentConfig.Logger = torrentConfig.Logger.FilterLevel(lg.Debug) - torrentConfig.Logger = NewAdapterLogger() - return torrentConfig -} - -func (cli *Client) Torrents() []metainfo.Hash { - t := cli.Cli.Torrents() - hashes := make([]metainfo.Hash, 0, len(t)) - for _, v := range t { - hashes = append(hashes, v.InfoHash()) - } - return hashes -} -func (cli *Client) Load(tx kv.Tx) error { - log.Info("Load added torrents") - return tx.ForEach(kv.SnapshotInfo, []byte{}, func(k, infoHashBytes []byte) error { - if !bytes.HasPrefix(k[8:], []byte(SnapshotInfoHashPrefix)) { - return nil - } - networkID, snapshotName := ParseInfoHashKey(k) - infoHash := metainfo.Hash{} - copy(infoHash[:], infoHashBytes) - infoBytes, err := tx.GetOne(kv.SnapshotInfo, MakeInfoBytesKey(snapshotName, networkID)) - if err != nil { - return err - } - - log.Info("Add torrent", "snapshot", snapshotName, "hash", infoHash.String(), "infobytes", len(infoBytes) > 0) - _, err = cli.AddTorrentSpec(snapshotName, infoHash, infoBytes) - if err != nil { - return err - } - - return nil - }) -} - -func (cli *Client) SavePeerID(db kv.Putter) error { - return db.Put(kv.BittorrentInfo, []byte(kv.BittorrentPeerID), cli.PeerID()) -} - -func (cli *Client) Close() { - cli.Cli.Close() -} - -func (cli *Client) PeerID() []byte { - peerID := cli.Cli.PeerID() - return peerID[:] -} -func (cli *Client) AddTorrentSpec(snapshotName string, snapshotHash metainfo.Hash, infoBytes []byte) (*torrent.Torrent, error) { - t, ok := cli.Cli.Torrent(snapshotHash) - if ok { - return t, nil - } - t, _, err := cli.Cli.AddTorrentSpec(&torrent.TorrentSpec{ - Trackers: Trackers, - InfoHash: snapshotHash, - DisplayName: snapshotName, - InfoBytes: infoBytes, - }) - return t, err -} - -func (cli *Client) AddTorrent(ctx context.Context, db kv.RwTx, snapshotType SnapshotType, networkID uint64) error { //nolint: interfacer - infoHashBytes, infoBytes, err := getTorrentSpec(db, snapshotType.String(), networkID) - if err != nil { - return err - } - var infoHash metainfo.Hash - newTorrent := false - if infoHashBytes != nil { - copy(infoHash[:], infoHashBytes[:metainfo.HashSize]) - } else { - log.Info("Init new torrent", "snapshot", snapshotType.String()) - newTorrent = true - var ok bool - infoHash, ok = TorrentHashes[networkID][snapshotType] - if !ok { - return fmt.Errorf("%w type %v, networkID %v", ErrInvalidSnapshot, snapshotType, networkID) - } - } - log.Info("Added torrent spec", "snapshot", snapshotType.String(), "hash", infoHash.String()) - t, err := cli.AddTorrentSpec(snapshotType.String(), infoHash, infoBytes) - if err != nil { - return fmt.Errorf("error on add snapshot: %w", err) - } - log.Info("Getting infobytes", "snapshot", snapshotType.String()) - infoBytes, err = cli.GetInfoBytes(context.Background(), infoHash) - if err != nil { - log.Warn("Init failure", "snapshot", snapshotType.String(), "err", ctx.Err()) - return fmt.Errorf("error on get info bytes: %w", err) - } - t.AllowDataDownload() - t.DownloadAll() - log.Info("Got infobytes", "snapshot", snapshotType.String(), "file", t.Files()[0].Path()) - - if newTorrent { - log.Info("Save spec", "snapshot", snapshotType.String()) - err := saveTorrentSpec(db, snapshotType.String(), networkID, infoHash, infoBytes) - if err != nil { - return err - } - } - return nil -} - -func (cli *Client) GetInfoBytes(ctx context.Context, snapshotHash metainfo.Hash) ([]byte, error) { - t, ok := cli.Cli.Torrent(snapshotHash) - if !ok { - return nil, errors.New("torrent not added") - } - for { - select { - case <-ctx.Done(): - return nil, fmt.Errorf("add torrent timeout: %w", ctx.Err()) - case <-t.GotInfo(): - return common.CopyBytes(t.Metainfo().InfoBytes), nil - default: - log.Info("Searching infobytes", "seeders", t.Stats().ConnectedSeeders, "active peers", t.Stats().ActivePeers) - time.Sleep(time.Second * 60) - } - } -} - -func (cli *Client) AddSnapshotsTorrents(ctx context.Context, db kv.RwTx, networkId uint64, mode SnapshotMode) error { - ctx, cancel := context.WithTimeout(ctx, time.Minute*10) - defer cancel() - eg := errgroup.Group{} - - if mode.Headers { - eg.Go(func() error { - return cli.AddTorrent(ctx, db, SnapshotType_headers, networkId) - }) - } - - if mode.Bodies { - eg.Go(func() error { - return cli.AddTorrent(ctx, db, SnapshotType_bodies, networkId) - }) - } - - if mode.State { - eg.Go(func() error { - return cli.AddTorrent(ctx, db, SnapshotType_state, networkId) - }) - } - - if mode.Receipts { - eg.Go(func() error { - return cli.AddTorrent(ctx, db, SnapshotType_receipts, networkId) - }) - } - err := eg.Wait() - if err != nil { - return err - } - - return nil -} - -func (cli *Client) Download() { - log.Info("Start snapshot downloading") - torrents := cli.Cli.Torrents() - for i := range torrents { - t := torrents[i] - go func(t *torrent.Torrent) { - defer debug.LogPanic() - t.AllowDataDownload() - t.DownloadAll() - - tt := time.Now() - prev := t.BytesCompleted() - dwn: - for { - if t.Info().TotalLength()-t.BytesCompleted() == 0 { - log.Info("Dowloaded", "snapshot", t.Name(), "t", time.Since(tt)) - break dwn - } else { - stats := t.Stats() - log.Info("Downloading snapshot", - "snapshot", t.Name(), - "%", int(100*(float64(t.BytesCompleted())/float64(t.Info().TotalLength()))), - "mb", t.BytesCompleted()/1024/1024, - "diff(kb)", (t.BytesCompleted()-prev)/1024, - "seeders", stats.ConnectedSeeders, - "active", stats.ActivePeers, - "total", stats.TotalPeers) - prev = t.BytesCompleted() - time.Sleep(time.Second * 10) - - } - - } - }(t) - } - cli.Cli.WaitAll() - - for _, t := range cli.Cli.Torrents() { - log.Info("Snapshot seeding", "name", t.Name(), "seeding", t.Seeding()) - } -} - -func (cli *Client) GetSnapshots(tx kv.Tx, networkID uint64) (map[SnapshotType]*SnapshotsInfo, error) { - mp := make(map[SnapshotType]*SnapshotsInfo) - networkIDBytes := make([]byte, 8) - binary.BigEndian.PutUint64(networkIDBytes, networkID) - err := tx.ForPrefix(kv.SnapshotInfo, append(networkIDBytes, []byte(SnapshotInfoHashPrefix)...), func(k, v []byte) error { - var hash metainfo.Hash - if len(v) != metainfo.HashSize { - return nil - } - copy(hash[:], v) - t, ok := cli.Cli.Torrent(hash) - if !ok { - return nil - } - - var gotInfo bool - readiness := int32(0) - select { - case <-t.GotInfo(): - gotInfo = true - readiness = int32(100 * (float64(t.BytesCompleted()) / float64(t.Info().TotalLength()))) - default: - } - - _, tpStr := ParseInfoHashKey(k) - tp, ok := SnapshotType_value[tpStr] - if !ok { - return fmt.Errorf("incorrect type: %v", tpStr) - } - - val := &SnapshotsInfo{ - Type: SnapshotType(tp), - GotInfoByte: gotInfo, - Readiness: readiness, - SnapshotBlock: SnapshotBlock, - Dbpath: filepath.Join(cli.snapshotsDir, t.Files()[0].Path()), - } - mp[SnapshotType(tp)] = val - return nil - }) - if err != nil { - return nil, err - } - - return mp, nil -} - -func (cli *Client) SeedSnapshot(name string, path string) (metainfo.Hash, error) { - info, err := BuildInfoBytesForSnapshot(path, MdbxFilename) - if err != nil { - return [20]byte{}, err - } - - infoBytes, err := bencode.Marshal(info) - if err != nil { - return [20]byte{}, err - } - - t, err := cli.AddTorrentSpec(name, metainfo.HashBytes(infoBytes), infoBytes) - if err != nil { - return [20]byte{}, err - } - return t.InfoHash(), nil -} -func (cli *Client) StopSeeding(hash metainfo.Hash) error { - t, ok := cli.Cli.Torrent(hash) - if !ok { - return nil - } - ch := t.Closed() - t.Drop() - <-ch - return nil -} - -func getTorrentSpec(db kv.Tx, snapshotName string, networkID uint64) ([]byte, []byte, error) { - var infohash, infobytes []byte - var err error - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, networkID) - infohash, err = db.GetOne(kv.SnapshotInfo, MakeInfoHashKey(snapshotName, networkID)) - if err != nil { - return nil, nil, err - } - infobytes, err = db.GetOne(kv.SnapshotInfo, MakeInfoBytesKey(snapshotName, networkID)) - if err != nil { - return nil, nil, err - } - - return infohash, infobytes, nil -} -func saveTorrentSpec(db kv.Putter, snapshotName string, networkID uint64, hash torrent.InfoHash, infobytes []byte) error { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, networkID) - err := db.Put(kv.SnapshotInfo, MakeInfoHashKey(snapshotName, networkID), hash.Bytes()) - if err != nil { - return err - } - return db.Put(kv.SnapshotInfo, MakeInfoBytesKey(snapshotName, networkID), infobytes) -} - -func MakeInfoHashKey(snapshotName string, networkID uint64) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, networkID) - return append(b, []byte(SnapshotInfoHashPrefix+snapshotName)...) -} - -func MakeInfoBytesKey(snapshotName string, networkID uint64) []byte { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, networkID) - return append(b, []byte(SnapshotInfoBytesPrefix+snapshotName)...) -} - -// ParseInfoHashKey returns networkID and snapshot name -func ParseInfoHashKey(k []byte) (uint64, string) { - return binary.BigEndian.Uint64(k), string(bytes.TrimPrefix(k[8:], []byte(SnapshotInfoHashPrefix))) -} - -func GetInfo() { - -} - -func SnapshotSeeding(chainDB kv.RwDB, cli *Client, name string, snapshotsDir string) error { - var snapshotBlock uint64 - var hasSnapshotBlock bool - if err := chainDB.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil && !errors.Is(err, ethdb.ErrKeyNotFound) { - return err - } - hasSnapshotBlock = len(v) == 8 - if hasSnapshotBlock { - snapshotBlock = binary.BigEndian.Uint64(v) - } else { - log.Warn("Snapshot block unknown", "snapshot", name, "v", common.Bytes2Hex(v)) - } - return nil - }); err != nil { - return err - } - - if hasSnapshotBlock { - hash, err := cli.SeedSnapshot(name, SnapshotName(snapshotsDir, name, snapshotBlock)) - if err != nil { - return err - } - log.Info("Start seeding", "snapshot", name, "hash", hash.String()) - } - return nil -} diff --git a/turbo/snapshotsync/external_downloader.pb.go b/turbo/snapshotsync/external_downloader.pb.go deleted file mode 100644 index 1b78fb93100..00000000000 --- a/turbo/snapshotsync/external_downloader.pb.go +++ /dev/null @@ -1,474 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.25.0 -// protoc v3.14.0 -// source: external_downloader.proto - -package snapshotsync - -import ( - reflect "reflect" - sync "sync" - - proto "github.com/golang/protobuf/proto" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -type SnapshotType int32 - -const ( - SnapshotType_headers SnapshotType = 0 - SnapshotType_bodies SnapshotType = 1 - SnapshotType_state SnapshotType = 2 - SnapshotType_receipts SnapshotType = 3 -) - -// Enum value maps for SnapshotType. -var ( - SnapshotType_name = map[int32]string{ - 0: "headers", - 1: "bodies", - 2: "state", - 3: "receipts", - } - SnapshotType_value = map[string]int32{ - "headers": 0, - "bodies": 1, - "state": 2, - "receipts": 3, - } -) - -func (x SnapshotType) Enum() *SnapshotType { - p := new(SnapshotType) - *p = x - return p -} - -func (x SnapshotType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SnapshotType) Descriptor() protoreflect.EnumDescriptor { - return file_external_downloader_proto_enumTypes[0].Descriptor() -} - -func (SnapshotType) Type() protoreflect.EnumType { - return &file_external_downloader_proto_enumTypes[0] -} - -func (x SnapshotType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SnapshotType.Descriptor instead. -func (SnapshotType) EnumDescriptor() ([]byte, []int) { - return file_external_downloader_proto_rawDescGZIP(), []int{0} -} - -type DownloadSnapshotRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkId uint64 `protobuf:"varint,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` - Type []SnapshotType `protobuf:"varint,2,rep,packed,name=type,proto3,enum=snapshotsync.SnapshotType" json:"type,omitempty"` -} - -func (x *DownloadSnapshotRequest) Reset() { - *x = DownloadSnapshotRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_external_downloader_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DownloadSnapshotRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DownloadSnapshotRequest) ProtoMessage() {} - -func (x *DownloadSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_external_downloader_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DownloadSnapshotRequest.ProtoReflect.Descriptor instead. -func (*DownloadSnapshotRequest) Descriptor() ([]byte, []int) { - return file_external_downloader_proto_rawDescGZIP(), []int{0} -} - -func (x *DownloadSnapshotRequest) GetNetworkId() uint64 { - if x != nil { - return x.NetworkId - } - return 0 -} - -func (x *DownloadSnapshotRequest) GetType() []SnapshotType { - if x != nil { - return x.Type - } - return nil -} - -type SnapshotsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NetworkId uint64 `protobuf:"varint,1,opt,name=network_id,json=networkId,proto3" json:"network_id,omitempty"` -} - -func (x *SnapshotsRequest) Reset() { - *x = SnapshotsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_external_downloader_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SnapshotsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SnapshotsRequest) ProtoMessage() {} - -func (x *SnapshotsRequest) ProtoReflect() protoreflect.Message { - mi := &file_external_downloader_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SnapshotsRequest.ProtoReflect.Descriptor instead. -func (*SnapshotsRequest) Descriptor() ([]byte, []int) { - return file_external_downloader_proto_rawDescGZIP(), []int{1} -} - -func (x *SnapshotsRequest) GetNetworkId() uint64 { - if x != nil { - return x.NetworkId - } - return 0 -} - -type SnapshotsInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type SnapshotType `protobuf:"varint,1,opt,name=type,proto3,enum=snapshotsync.SnapshotType" json:"type,omitempty"` - GotInfoByte bool `protobuf:"varint,2,opt,name=gotInfoByte,proto3" json:"gotInfoByte,omitempty"` - Readiness int32 `protobuf:"varint,3,opt,name=readiness,proto3" json:"readiness,omitempty"` - SnapshotBlock uint64 `protobuf:"varint,4,opt,name=snapshotBlock,proto3" json:"snapshotBlock,omitempty"` - Dbpath string `protobuf:"bytes,5,opt,name=dbpath,proto3" json:"dbpath,omitempty"` -} - -func (x *SnapshotsInfo) Reset() { - *x = SnapshotsInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_external_downloader_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SnapshotsInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SnapshotsInfo) ProtoMessage() {} - -func (x *SnapshotsInfo) ProtoReflect() protoreflect.Message { - mi := &file_external_downloader_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SnapshotsInfo.ProtoReflect.Descriptor instead. -func (*SnapshotsInfo) Descriptor() ([]byte, []int) { - return file_external_downloader_proto_rawDescGZIP(), []int{2} -} - -func (x *SnapshotsInfo) GetType() SnapshotType { - if x != nil { - return x.Type - } - return SnapshotType_headers -} - -func (x *SnapshotsInfo) GetGotInfoByte() bool { - if x != nil { - return x.GotInfoByte - } - return false -} - -func (x *SnapshotsInfo) GetReadiness() int32 { - if x != nil { - return x.Readiness - } - return 0 -} - -func (x *SnapshotsInfo) GetSnapshotBlock() uint64 { - if x != nil { - return x.SnapshotBlock - } - return 0 -} - -func (x *SnapshotsInfo) GetDbpath() string { - if x != nil { - return x.Dbpath - } - return "" -} - -type SnapshotsInfoReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Info []*SnapshotsInfo `protobuf:"bytes,1,rep,name=info,proto3" json:"info,omitempty"` -} - -func (x *SnapshotsInfoReply) Reset() { - *x = SnapshotsInfoReply{} - if protoimpl.UnsafeEnabled { - mi := &file_external_downloader_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SnapshotsInfoReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SnapshotsInfoReply) ProtoMessage() {} - -func (x *SnapshotsInfoReply) ProtoReflect() protoreflect.Message { - mi := &file_external_downloader_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SnapshotsInfoReply.ProtoReflect.Descriptor instead. -func (*SnapshotsInfoReply) Descriptor() ([]byte, []int) { - return file_external_downloader_proto_rawDescGZIP(), []int{3} -} - -func (x *SnapshotsInfoReply) GetInfo() []*SnapshotsInfo { - if x != nil { - return x.Info - } - return nil -} - -var File_external_downloader_proto protoreflect.FileDescriptor - -var file_external_downloader_proto_rawDesc = []byte{ - 0x0a, 0x19, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x68, 0x0a, 0x17, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, - 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x31, 0x0a, 0x10, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x0d, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, - 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x67, 0x6f, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x42, 0x79, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x67, 0x6f, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x64, - 0x62, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x62, 0x70, - 0x61, 0x74, 0x68, 0x22, 0x45, 0x0a, 0x12, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x2a, 0x40, 0x0a, 0x0c, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x73, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x62, 0x6f, 0x64, 0x69, 0x65, - 0x73, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x10, 0x02, 0x12, 0x0c, - 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x10, 0x03, 0x32, 0xaa, 0x01, 0x0a, - 0x0a, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x08, 0x44, - 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x25, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x09, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x73, 0x79, 0x6e, 0x63, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x3b, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x79, 0x6e, 0x63, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_external_downloader_proto_rawDescOnce sync.Once - file_external_downloader_proto_rawDescData = file_external_downloader_proto_rawDesc -) - -func file_external_downloader_proto_rawDescGZIP() []byte { - file_external_downloader_proto_rawDescOnce.Do(func() { - file_external_downloader_proto_rawDescData = protoimpl.X.CompressGZIP(file_external_downloader_proto_rawDescData) - }) - return file_external_downloader_proto_rawDescData -} - -var file_external_downloader_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_external_downloader_proto_msgTypes = make([]protoimpl.MessageInfo, 4) -var file_external_downloader_proto_goTypes = []interface{}{ - (SnapshotType)(0), // 0: snapshotsync.SnapshotType - (*DownloadSnapshotRequest)(nil), // 1: snapshotsync.DownloadSnapshotRequest - (*SnapshotsRequest)(nil), // 2: snapshotsync.SnapshotsRequest - (*SnapshotsInfo)(nil), // 3: snapshotsync.SnapshotsInfo - (*SnapshotsInfoReply)(nil), // 4: snapshotsync.SnapshotsInfoReply - (*emptypb.Empty)(nil), // 5: google.protobuf.Empty -} -var file_external_downloader_proto_depIdxs = []int32{ - 0, // 0: snapshotsync.DownloadSnapshotRequest.type:type_name -> snapshotsync.SnapshotType - 0, // 1: snapshotsync.SnapshotsInfo.type:type_name -> snapshotsync.SnapshotType - 3, // 2: snapshotsync.SnapshotsInfoReply.info:type_name -> snapshotsync.SnapshotsInfo - 1, // 3: snapshotsync.Downloader.Download:input_type -> snapshotsync.DownloadSnapshotRequest - 2, // 4: snapshotsync.Downloader.Snapshots:input_type -> snapshotsync.SnapshotsRequest - 5, // 5: snapshotsync.Downloader.Download:output_type -> google.protobuf.Empty - 4, // 6: snapshotsync.Downloader.Snapshots:output_type -> snapshotsync.SnapshotsInfoReply - 5, // [5:7] is the sub-list for method output_type - 3, // [3:5] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name -} - -func init() { file_external_downloader_proto_init() } -func file_external_downloader_proto_init() { - if File_external_downloader_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_external_downloader_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadSnapshotRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_external_downloader_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotsRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_external_downloader_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotsInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_external_downloader_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SnapshotsInfoReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_external_downloader_proto_rawDesc, - NumEnums: 1, - NumMessages: 4, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_external_downloader_proto_goTypes, - DependencyIndexes: file_external_downloader_proto_depIdxs, - EnumInfos: file_external_downloader_proto_enumTypes, - MessageInfos: file_external_downloader_proto_msgTypes, - }.Build() - File_external_downloader_proto = out.File - file_external_downloader_proto_rawDesc = nil - file_external_downloader_proto_goTypes = nil - file_external_downloader_proto_depIdxs = nil -} diff --git a/turbo/snapshotsync/external_downloader_grpc.pb.go b/turbo/snapshotsync/external_downloader_grpc.pb.go deleted file mode 100644 index 814d31e01c2..00000000000 --- a/turbo/snapshotsync/external_downloader_grpc.pb.go +++ /dev/null @@ -1,135 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package snapshotsync - -import ( - context "context" - - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - emptypb "google.golang.org/protobuf/types/known/emptypb" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion7 - -// DownloaderClient is the client API for Downloader service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type DownloaderClient interface { - Download(ctx context.Context, in *DownloadSnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - Snapshots(ctx context.Context, in *SnapshotsRequest, opts ...grpc.CallOption) (*SnapshotsInfoReply, error) -} - -type downloaderClient struct { - cc grpc.ClientConnInterface -} - -func NewDownloaderClient(cc grpc.ClientConnInterface) DownloaderClient { - return &downloaderClient{cc} -} - -func (c *downloaderClient) Download(ctx context.Context, in *DownloadSnapshotRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { - out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/snapshotsync.Downloader/Download", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *downloaderClient) Snapshots(ctx context.Context, in *SnapshotsRequest, opts ...grpc.CallOption) (*SnapshotsInfoReply, error) { - out := new(SnapshotsInfoReply) - err := c.cc.Invoke(ctx, "/snapshotsync.Downloader/Snapshots", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// DownloaderServer is the server API for Downloader service. -// All implementations must embed UnimplementedDownloaderServer -// for forward compatibility -type DownloaderServer interface { - Download(context.Context, *DownloadSnapshotRequest) (*emptypb.Empty, error) - Snapshots(context.Context, *SnapshotsRequest) (*SnapshotsInfoReply, error) - mustEmbedUnimplementedDownloaderServer() -} - -// UnimplementedDownloaderServer must be embedded to have forward compatible implementations. -type UnimplementedDownloaderServer struct { -} - -func (UnimplementedDownloaderServer) Download(context.Context, *DownloadSnapshotRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method Download not implemented") -} -func (UnimplementedDownloaderServer) Snapshots(context.Context, *SnapshotsRequest) (*SnapshotsInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Snapshots not implemented") -} -func (UnimplementedDownloaderServer) mustEmbedUnimplementedDownloaderServer() {} - -// UnsafeDownloaderServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to DownloaderServer will -// result in compilation errors. -type UnsafeDownloaderServer interface { - mustEmbedUnimplementedDownloaderServer() -} - -func RegisterDownloaderServer(s grpc.ServiceRegistrar, srv DownloaderServer) { - s.RegisterService(&_Downloader_serviceDesc, srv) -} - -func _Downloader_Download_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DownloadSnapshotRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DownloaderServer).Download(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/snapshotsync.Downloader/Download", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DownloaderServer).Download(ctx, req.(*DownloadSnapshotRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Downloader_Snapshots_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SnapshotsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DownloaderServer).Snapshots(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/snapshotsync.Downloader/Snapshots", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DownloaderServer).Snapshots(ctx, req.(*SnapshotsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Downloader_serviceDesc = grpc.ServiceDesc{ - ServiceName: "snapshotsync.Downloader", - HandlerType: (*DownloaderServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Download", - Handler: _Downloader_Download_Handler, - }, - { - MethodName: "Snapshots", - Handler: _Downloader_Snapshots_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "external_downloader.proto", -} diff --git a/turbo/snapshotsync/headers_snapshot.go b/turbo/snapshotsync/headers_snapshot.go deleted file mode 100644 index 18df3b423cd..00000000000 --- a/turbo/snapshotsync/headers_snapshot.go +++ /dev/null @@ -1,128 +0,0 @@ -package snapshotsync - -import ( - "context" - "errors" - "fmt" - "os" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/log/v3" -) - -func CreateHeadersSnapshot(ctx context.Context, readTX kv.Tx, toBlock uint64, snapshotPath string) error { - // remove created snapshot if it's not saved in main db(to avoid append error) - err := os.RemoveAll(snapshotPath) - if err != nil { - return err - } - - snKV, err := mdbx.NewMDBX(log.New()).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.Headers: kv.ChaindataTablesCfg[kv.Headers], - } - }).Path(snapshotPath).Open() - if err != nil { - return err - } - sntx, err := snKV.BeginRw(context.Background()) - if err != nil { - return fmt.Errorf("begin err: %w", err) - } - defer sntx.Rollback() - - err = GenerateHeadersSnapshot(ctx, readTX, sntx, toBlock) - if err != nil { - return fmt.Errorf("generate err: %w", err) - } - err = sntx.Commit() - if err != nil { - return fmt.Errorf("commit err: %w", err) - } - snKV.Close() - - return nil -} - -func GenerateHeadersSnapshot(ctx context.Context, db kv.Tx, sntx kv.RwTx, toBlock uint64) error { - headerCursor, err := sntx.RwCursor(kv.Headers) - if err != nil { - return err - } - var hash common.Hash - var header []byte - t := time.NewTicker(time.Second * 30) - defer t.Stop() - tt := time.Now() - for i := uint64(0); i <= toBlock; i++ { - if common.IsCanceled(ctx) { - return common.ErrStopped - } - select { - case <-t.C: - log.Info("Headers snapshot generation", "t", time.Since(tt), "block", i) - default: - } - hash, err = rawdb.ReadCanonicalHash(db, i) - if err != nil { - return err - } - header = rawdb.ReadHeaderRLP(db, hash, i) - if len(header) < 2 { - return fmt.Errorf("header %d is empty, %v", i, header) - } - - err = headerCursor.Append(dbutils.HeaderKey(i, hash), header) - if err != nil { - return err - } - } - return nil -} - -func OpenHeadersSnapshot(dbPath string) (kv.RoDB, error) { - return mdbx.NewMDBX(log.New()).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return kv.TableCfg{ - kv.Headers: kv.ChaindataTablesCfg[kv.Headers], - } - }).Readonly().Path(dbPath).Open() -} - -func RemoveHeadersData(db kv.RoDB, tx kv.RwTx, currentSnapshot, newSnapshot uint64) (err error) { - log.Info("Remove data", "from", currentSnapshot, "to", newSnapshot) - if _, ok := db.(snapshotdb.SnapshotUpdater); !ok { - return errors.New("db don't implement snapshotUpdater interface") - } - headerSnapshot := db.(snapshotdb.SnapshotUpdater).HeadersSnapshot() - if headerSnapshot == nil { - return errors.New("empty headers snapshot") - } - writeTX := tx.(snapshotdb.DBTX).DBTX() - c, err := writeTX.RwCursor(kv.Headers) - if err != nil { - return fmt.Errorf("get headers cursor %w", err) - } - - return headerSnapshot.View(context.Background(), func(tx kv.Tx) error { - c2, err := tx.Cursor(kv.Headers) - if err != nil { - return err - } - defer c2.Close() - defer c2.Close() - return ethdb.Walk(c2, dbutils.EncodeBlockNumber(currentSnapshot), 0, func(k, v []byte) (bool, error) { - innerErr := c.Delete(k, nil) - if innerErr != nil { - return false, fmt.Errorf("remove %v err:%w", common.Bytes2Hex(k), innerErr) - } - return true, nil - }) - }) -} diff --git a/turbo/snapshotsync/logger.go b/turbo/snapshotsync/logger.go deleted file mode 100644 index 793d60efc94..00000000000 --- a/turbo/snapshotsync/logger.go +++ /dev/null @@ -1,39 +0,0 @@ -package snapshotsync - -import ( - lg "github.com/anacrolix/log" - "github.com/ledgerwatch/log/v3" -) - -func init() { - lg.Default = NewAdapterLogger() -} -func NewAdapterLogger() lg.Logger { - return lg.Logger{ - LoggerImpl: lg.LoggerImpl(adapterLogger{}), - } -} - -type adapterLogger struct{} - -func (b adapterLogger) Log(msg lg.Msg) { - lvl, ok := msg.GetLevel() - if !ok { - lvl = lg.Info - } - - switch lvl { - case lg.Debug: - log.Info(msg.String()) - case lg.Info: - log.Info(msg.String()) - case lg.Warning: - log.Warn(msg.String()) - case lg.Error: - log.Error(msg.String()) - case lg.Critical: - log.Error(msg.String()) - default: - log.Warn("unknown log type", "msg", msg.String()) - } -} diff --git a/turbo/snapshotsync/parallelcompress/decompress.go b/turbo/snapshotsync/parallelcompress/decompress.go new file mode 100644 index 00000000000..481717b2ab9 --- /dev/null +++ b/turbo/snapshotsync/parallelcompress/decompress.go @@ -0,0 +1,62 @@ +package parallelcompress + +import ( + "bufio" + "encoding/binary" + "fmt" + "os" + "time" + + "github.com/ledgerwatch/erigon-lib/compress" + "github.com/ledgerwatch/erigon-lib/etl" + "github.com/ledgerwatch/log/v3" +) + +func Decompress(logPrefix, segFilePath, datFilePath string) error { + d, err := compress.NewDecompressor(segFilePath) + if err != nil { + return err + } + defer d.Close() + logEvery := time.NewTicker(20 * time.Second) + defer logEvery.Stop() + var df *os.File + if df, err = os.Create(datFilePath); err != nil { + return err + } + dw := bufio.NewWriterSize(df, etl.BufIOSize) + var word = make([]byte, 0, 256) + numBuf := make([]byte, binary.MaxVarintLen64) + var decodeTime time.Duration + g := d.MakeGetter() + start := time.Now() + wc := 0 + for g.HasNext() { + word, _ = g.Next(word[:0]) + decodeTime += time.Since(start) + n := binary.PutUvarint(numBuf, uint64(len(word))) + if _, e := dw.Write(numBuf[:n]); e != nil { + return e + } + if len(word) > 0 { + if _, e := dw.Write(word); e != nil { + return e + } + } + wc++ + select { + default: + case <-logEvery.C: + log.Info(fmt.Sprintf("[%s] Decompress", logPrefix), "millions", wc/1_000_000) + } + start = time.Now() + } + log.Info(fmt.Sprintf("[%s] Average decoding time", logPrefix), "per word", time.Duration(int64(decodeTime)/int64(wc))) + if err = dw.Flush(); err != nil { + return err + } + if err = df.Close(); err != nil { + return err + } + return nil +} diff --git a/turbo/snapshotsync/postprocessing.go b/turbo/snapshotsync/postprocessing.go deleted file mode 100644 index d6703f8a0a4..00000000000 --- a/turbo/snapshotsync/postprocessing.go +++ /dev/null @@ -1,335 +0,0 @@ -package snapshotsync - -import ( - "context" - "encoding/binary" - "errors" - "fmt" - "math/big" - "os" - - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/etl" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/eth/stagedsync/stages" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" -) - -const ( - SnapshotBlock = 11_500_000 - HeaderHash11kk = "0x4d5e647b2d8d3a3c8c1561ebb88734bc5fc3c2941016f810cf218738c0ecd99e" - Header11kk = "f90211a01cb6a590440a9ed02e8762ac35faa04ec30cdbcaff0b276fa1ab5e2339033a6aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347944bb96091ee9d802ed039c4d1a5f6216f90f81b01a08b2258fc3693f6ed1102f3142839a174b27f215841d2f542b586682898981c6da07d63a1ceded7864e95f09fe65b6bd17fb3f02a3644b1340bb0ab8a7267251e62a04cb5cf79c8a58a4787ec1ed0af51bcce19e6ad701dd40a45086244b933104cf2b901002438522b194b05881a7d976aa8c45ff47193ba8adc6fe2cc85eb68c66503558fa0ba43cebbd2327cfa297a87228511374ed3a2f66f3999426dced224c464840303de108b8604dcafce84d678b589cbe8a74aa2c540668a9a9acfa1eb94c6569918d819063600c000f3c060d649129f8327cad2c7ba1f9495531224b34a1ad8ca0810ab2d2d43a18877484dc33d220c0531024f1dc7448f8a6c016340ae143efd87c5e681d40a34e6be5803ea696038d3ad090048cb267a2ae72e7290da6b385f9874c002302c85e96005aa08031e30ac2a8a9a021bdc2a7a39a1089a08586cefcb937700ff03e4acaa37448c00f4ad02116216437bc52846ebd205869231e574870bf465887ac96883a7d8c083bdfd7483bde3a8845f7befc090505059452d657468706f6f6c2d757331a07a1a8c57afdf3be769e0f6a54e92900374cc207c7cf01b9da6ccca80a8b4006c88d495a5d800490fad" - Body11kk = "f99a34f99a30f8ac8214268541314cf0008301d4c0946b0359f95796327475ad4f12ae4e1047c3a67fa380b844a9059cbb000000000000000000000000fa1dfa4588664928951778b355b3de1f703ade4a00000000000000000000000000000000000000000000000000000000001e0b8725a0b3855a81e5f5ab38eae3b2c1bcd9ce72e143803ef4e47d9845c177aa156137f1a05993fea2c5b3e4995ca84aac5a11dd87ea1dd9a70f6cfc52f88a4b932edec56df8ac8214278541314cf0008301d4c0946b0359f95796327475ad4f12ae4e1047c3a67fa380b844a9059cbb000000000000000000000000def1b9aaedeeb0dbeba57773fad640aa7f30e735000000000000000000000000000000000000000000000000000000000057f29b26a0dca35e61c625a15c23579b346e032598a2ae33086ef1146330ae59335b28b90aa0162e3d461d1ecd5a57ef92ec582aab7daa6d7a402bb162963f37e1af9b0a8eb7f8ad830109f9853a35294400830138809412d79c345cac7b050a5ff0797b5a607e254c73f580b844a9059cbb000000000000000000000000e7e7a94e68be242a0db0c525dc3acefb755ae271000000000000000000000000000000000000000000000000000000000041696725a06f44e89a311d35682d93f81599bbb23c7a3477682c0ee66436688eca14ead9a5a00465af62a83af5135904c7953fcbb4821cc977a912b9e9055afc978224014a30f86d5785131794b40083021fdb9456710f7e591fa0559003831e041dd67789d2af4a881bc16d674ec800008025a08286e05045a922f5cb264de212d0fcd9bae59dfdc98a9a9d30b8cfc90baaa273a05945cb96da53d2ac56063d5a7273892e946f74ab371771ba75a725c223626820f88b825259851298879d29830249f0940000000071e801062eb0544403f66176bba42dc080a400000019000000000000000000000000000000000000000000000000000000000000079d25a0d704c1f7f9480b5f8f7e74c9dc5cf77391f4eb8abd901e5d5331af8272f4820ba026c7b701f8a24c6ce84d86c02fcdfd116b9a590bccb4848e012b6baefded1e99f8678211cc851229298c0083030d4094e5fd3dc48656dfed32601468426fe57595d8938080801ba0d1e94509c4ac498235452be50481fc49fb4037f37d2686a13c52280fcec15815a064fa69a8fb3bc49599be90dcd293f72a2575da8e991285c2a4923aa6042c1c45f86d82f06285120b5c270082627094ad978dc888e1a2590244f8bf9e716eb18b3b68d787354a6ba7a180008026a0ed667359fcecb1d62418dfd5535fa5ecc0abf7dcf314b1a59222f8e87a1af8a0a00755cf05e3dd4e9f95d9f9240cf5e66d8320fe3e64f7ed2eccf879c2db546ca7f8708302e5a28510c388d000830186a094dfda58c58d9d2e862d386706efdf6153e147ae8b8821db0ba827b770008026a07c7bbca5548e94b3da64473eb35b287d802a00433b5e67815da4765803b076a0a00c4c1bd0ba655f8c82cc4880bd4a1821de03bba379644685e6d8ceb3252d22def8708302e5a38510c388d000830186a0941afd9659259df405dd3f507ef77887aa0cb751b98843966d18b91b80008025a0c345c9fc5217f79b2e9375916020162f10f0505298ce5c074b15ad14495c8e81a00292440b70d3a6455902013ba251caa8578a22b76d59b14a668d839e2947f608f8ab818f851087ee06008301d4c0946bc1f3a1ae56231dbb64d3e82e070857eae8604580b844a9059cbb00000000000000000000000024434ebf296c2f9cd59b14412aae5c4ca1d5aad2000000000000000000000000000000000000000000000a9e566513a4910d400025a0db1575b0bb6f9ff489eceda148be18c2914680dd61d93e94b272d25919536feba0539db0b71bfd18077a63b7cec6624459bfb2cc1b5ec157bd540d7e323b833bf7f8aa1d851087ee06008301d4c0946bc1f3a1ae56231dbb64d3e82e070857eae8604580b844a9059cbb00000000000000000000000024434ebf296c2f9cd59b14412aae5c4ca1d5aad2000000000000000000000000000000000000000000002a4c2b736cdf768d400026a06abb41e737220b9f918e351d4e1106c7f4ab1c76e9f71dcf1313e34056c855e4a02e5737341566322cf7049561d9c62bebbb2d9fe681a9672a98b76d27b3525cc4f86c44851087ee060082520894efb2e870b14d7e555a31b392541acf002dae6ae98808a9fd000b5d10008026a0a3a8ce710f12d38d704b748aac579095fa76a2d4335fddc507c2b320ddadb341a048b3889aeb79855224b84c89aca69ef15716a965b1a3d4a416a2b932e53617d3f8aa3d851087ee06008301d4c0946bc1f3a1ae56231dbb64d3e82e070857eae8604580b844a9059cbb00000000000000000000000024434ebf296c2f9cd59b14412aae5c4ca1d5aad200000000000000000000000000000000000000000000386992ac084d52b9a40026a0a30a1900def92ba2d630ce8851016f200a6f0ab7cbb3726e856b80c8c7c2cdb9a046b2ebc2062888b195266b27c24b832d16c38a681097661e7c85dc918c659f74f8aa61851087ee06008301d4c0946bc1f3a1ae56231dbb64d3e82e070857eae8604580b844a9059cbb00000000000000000000000024434ebf296c2f9cd59b14412aae5c4ca1d5aad200000000000000000000000000000000000000000000d3998a945d035620e20025a00aef9d9d942121f0ec78f855f5b41a8f5012e9ad245adf3b19bd25a5e60d40cca07119f902bc2bf5ef3a30788ee545e4dbedbc52054c970409fc6a742281802831f8aa37851087ee06008301d4c0946bc1f3a1ae56231dbb64d3e82e070857eae8604580b844a9059cbb00000000000000000000000024434ebf296c2f9cd59b14412aae5c4ca1d5aad200000000000000000000000000000000000000000000135d111acd67564fac0026a0f1d8a696da6547e491e1fb89c642493f3ae1b80c1f2b7f48857940117b10e83da040b4b8557111d4fbfa45e8711e1856dacf6d5aacdfd83975d91f8507f6d2491af88a82238285104fe73d7882ea60940000000071e801062eb0544403f66176bba42dc080a400000039000000000000000000000000000000000000000000000000000000000000fdeb25a08fb55bfd8459411b7bb69bc388a2f1fb4ccf2e28a52739ba6e7246b8dfdd282ca06924a9f7387c9405b0ebe379a69a3fab0e5606254213b67646470d0d9ae36fdbf8ac82b747851010b872008302bf209410086399dd8c1e3de736724af52587a2044c9fa280b844a9059cbb000000000000000000000000444705e7ccdc6bf014f3e956e5c4eda78b59f79b0000000000000000000000000000000000000000000013ad784a9942cb78980026a0b2074cb4a3d2954203fb6dfdd75dbe2b4e581452c8111691b2a8903d64c741baa014edfd2a96f05c667482fb098da4df0d323ceaa03c1120fa8c3b11b1e6752cd9f86c03850ee6b28000825208946cbdaad85cf5f084c25d349972178e12e0f3811b8801cd3fc4be2751008026a08cce1042c48eac631c16b870576577bc6837ea9fc8aa8be4fe6085115fc1072fa01e5e0c39bb23d8a844d3fbb15a2b803db00d19f16db962c51aca9efac4735be2f8aa11850ee6b280008301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000f2b293e9c1cbef2316ba8a4eccfecc8ba7af123c0000000000000000000000000000000000000000000000000000000013fae61025a0fbdaa8990cf1562bc687fba0919bee234fc4943ba536959b5d53199b08e645eda03610f59eb4a9f1b264a41da1f4b75e6ddcfdddc25e51d319e8aeae9f1866e2c6f86f820109850ee6b28000830111709429bd07c50a2a2a843b309264361c9a91950ec650880a47e9a2ff200c008025a098d7a79510ec8088e40332b6c17eb825c85b0f7f5169b38f32b4176804ea798ba02103aa7c8c18724bd2266f56f6eb2982e59ce66fc7e815b96258f1733000680df8aa1d850ee6b280008301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000f2b293e9c1cbef2316ba8a4eccfecc8ba7af123c000000000000000000000000000000000000000000000000000000001141445026a0304b4214474adb7c012af51f66a557bd5e4dd5ca6384181b75718b695cc0ca58a028e921c3e0bde2b373d3327575493f56f2c38e938db5a3af79d9cf73ee5bf41df8aa07850ee6b280008301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000f2b293e9c1cbef2316ba8a4eccfecc8ba7af123c0000000000000000000000000000000000000000000000000000000015bb0ca026a05817ff739574af40bb6a2a1e3521c81d9feeac9e1581ea1862e1d1310e992f25a04062cbda0d6c9cfd1ec650ab2f566ad443a32ea185460ba7b848e0c707222bd5f8aa04850ee6b280008301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000f2b293e9c1cbef2316ba8a4eccfecc8ba7af123c000000000000000000000000000000000000000000000000000000002b181ac025a01db94ba187623de31c790f335151b554f6edc8c3d3ae31c4bd1ff87f76b494c1a02f2d366e315e0243f2c00127f5bb00e3306e6c56fd93d415588381e2636912d3f8ab820ee7850ee6b2800082a0f994dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000030c6ce4559c9e40f79a21be12d8ac6a7cab5fbf400000000000000000000000000000000000000000000000000000000115987401ca0760fc54c11cf12f3a7cccb5340b4a625a926dbde65d482400de8eb9c2b21eb26a0725adba5a62c12842b6167cff941048910ac3bb0aa3502924d713b5648819d15f86c09850ed81dd19882520894f47b8ff418b81d929b1e2ab079ca96f9bae00ada888ef0f36da28600008025a0f3c3e987f3474dd3b8d298f9b127ac5dcd0d7728ce040da6cf148170b61b9008a06cd26c1e56d27009833ecebee4dcc7b69791476a64cddb9f660b39e9a79bf19bf9015103850e6f7cec008302a5e6947a250d5630b4cf539739df2c5dacb4c659f2488d87943afad18a21f4b8e4fb3bdb4100000000000000000000000000000000000000000000000038e62046fb1a00000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c279a165c11340ff6262bd74ce7b328ca7d738d5000000000000000000000000000000000000000000000000000000005f7bf4210000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000bd301be09eb78df47019aa833d29edc5d815d83825a02f07ebc6959fac30dcd3d89d9a102f919086a2641afb6be871b021a956fc9cb7a0195f7d7e0b59d32190c2fd10c7a448d9a2ea40b7c72762a99c4613b690089073f901ac818c850e6f7cec0083048968947a250d5630b4cf539739df2c5dacb4c659f2488d80b901448803dbee0000000000000000000000000000000000000000000000003782dace9d90000000000000000000000000000000000000000000000000000001d690b82191f53800000000000000000000000000000000000000000000000000000000000000a00000000000000000000000006795e7f4219a48e083157db6b52cf70002eced5f000000000000000000000000000000000000000000000000000000005f7bf45c00000000000000000000000000000000000000000000000000000000000000040000000000000000000000005befbb272290dd5b8521d4a938f6c4757742c430000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000001712aad2c773ee04bdc9114b32163c058321cd8526a064c6e05031df9eb138b78b0e4d6578d17d2b17fda9f05d8ac921ed707390fa5ca06a826a830e4e740cca349d89f1afce04cd48cdf527780401ce28d235497734c0f8ab820c6b850e6f7cec0082715e94a1d0e215a23d7030842fc67ce582a6afa3ccab8380b844095ea7b30000000000000000000000009748d39b0b0949c0d5214094045fb7e2222a26ca000000000000000000000000000000000000000000000000000000000000000025a038e6bd86c77f10475337e7cd32c88043465d9cdfde5d1fdce4e778ae55383b3ea0767b31439035cc8499be4c407d7c1db7f38755b7cc8cbbc09065b689de0716bdf9016b34850e6f7cec00830290bc947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe500000000000000000000000000000000000000000000000007492cb7eb148000000000000000000000000000000000000000000000000000075567ee0995c7e400000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ddaaef5d33f009bef641ee9a8054d0fa7c1e8d0e000000000000000000000000000000000000000000000000000000005f7bf45c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000028cb7e841ee97947a86b06fa4090c8451f64c0be000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc226a02daaf93f114bbe4209f1c082ead858afdc91ed29f2d5fa7866457e14a114d99ca022e100caeb5c78e445a014875c10b9bdbeb2828e1d7f2b35b5f0558f3d230981f9016d820274850e6f7cec008302878c947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe50000000000000000000000000000000000000000000006d3c17ae6ef8aafbcc90000000000000000000000000000000000000000000000000e718f3360c35d6800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e53699169e2ce5c49dbb85d86de834ad4a4a9d6a000000000000000000000000000000000000000000000000000000005f7bf45c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000087c00817abe35ed4c093e59043fae488238d2f74000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc225a0747216c39ceee5fcfcf7981317eba8108952819d6d0cf1fc4301e2882d3d54d7a068555b7b379ae6a66f31f64616860db5be895ee5fb5e6e1045d6217769a80d00f9026e830efef8850e6f7cec0083017c4094baf075545c3a56ecbaf219e4a1b69bc2b94b0b7580b9020464887334000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000a7d8bd0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000331005a675e1d000118e351dc07f3000000000000000000000000000000000000526b143b1737372ff3262608cdf5000000000000000000000000000000000000e37003f2f90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d600e2aeaa0800fc011eb527f90f000000000000000000000000000000000000bfa0eaf4ebd0c9d80c09da01490d00000000000000000000000000000000000017a1fd0b0900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021ba0e8b0c6d27b12a2cd8506f694a874547161c2ef5fb3134fec6415010124624e32a018c3b32b8c7fbd563c33025b712f4b311cfa10ae2b7d4e6a8df76721b0087b97f8cc822bf2850e6f7cec00830249f0940000000071e801062eb0544403f66176bba42dc080b86400000022000086fef14c27c78deaeb4349fd959caa11fc5b5d75000000000000000000000000000000000025948db5a78975a28a00000000000000000000000000000001000000000000000000000000fca59cd816ab1ead66534d82bc21e7515ce441cf25a049cbfb1f56c0a1555daf81f30121a791d149d1f4b5c9bfb278a070255d5bad65a0669c9a99b922a620ef5295e6f0b88bdc2619eb3ea9043d9ba784967e7c796721f9015482025b850e6f7cec008302aa06947a250d5630b4cf539739df2c5dacb4c659f2488d88011c640541017538b8e4fb3bdb41000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000003c8e49a61e91e6fdf7a56bfc4d6e347dd863ac27000000000000000000000000000000000000000000000000000000005f7bf45b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002a7f709ee001069771ceb6d42e85035f7d18e73626a02068b8d08937830226e99f3751ac9d21c381177b46f3cd7db65402655d4d8a0fa01a67a20e628a491743bee70f0dd3a573fca70c754d4b5b117052df173160b32df9015278850e6f7cec008302ad2f947a250d5630b4cf539739df2c5dacb4c659f2488d8801859bf17ded6942b8e4fb3bdb410000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000934831793baa281838c1e09e665a4f1406bc7560000000000000000000000000000000000000000000000000000000005f7bf45c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000de201daec04ba73166d9917fdf08e1728e270f0625a0b9eee4c06f560fa62718be16a004561f8822346db521eff8b2454e8768bc0f07a07e4161e5898bab99feb09b44cf6737fb7c5f1e3f48138d599a22fc00ed867c0ff8ac820758850e6f7cec00830102cc94990f341946a3fdb507ae7e52d17851b87168017c80b844095ea7b30000000000000000000000002c6a9c15e7f13de8ae55302bd29608c9eed78f080000000000000000000000000000000000000000000000008ac7230489e8000026a06feeea2d9505a20d7b2d10e1936d5bf9117d4b88e632c786322c3217dd916ae5a02e618e1517a44cb023837b64f1e902f0ba4a9a6a7d2d9806175a83f5d9ec826cf8ab81a6850e6f7cec00830381f9944d23c0537d7ee782cfaf9bbecdd60840e3d0ffe880b844441a3e7000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000045be7ad5bf65491d325a0a2b643fdec2ee570d216e2fce4f6030e7f7d162157808fc0e07c22da253e96b1a0752e21f128a8a64f7b79beadb3c65714505e9df52cf99068c7acf83a21e2d928f86b02850e6f7cec00825208947264c9f085858c607733daac1eef2625237fb333870b4fcc9ecd62008026a053b3489fc1005069296c19ee693c6e0ad78367ba818b930558b006beed0fa479a003adaa5da3158347c5141ca120dc4f2623e0fb0a90fab1129093fa665893e11ff8aa04850e6f7cec0083013d8c943fef5a74bcd2b8d2d44885b144df7f9d149b4b4580b844a9059cbb00000000000000000000000044fa1f6a271c6eb84227304e92813142758e133300000000000000000000000000000000000000000000001226788055013fc00026a0e2e6d5433b941dd559ff46677069c3689ac3dd5e28d12ee0287cb6ff3cb48bc5a010ae409467d096bc0c07fb1c4b2a3d9afca1e69d4842f329ccf987966aaceccef86c18850e6f7cec0082520894dfc105318661fc8241eb4d50275ad49bfd99903d88014a6701dc1c80008025a0c6301d39576a4f65741d63644701dcf63fb0dd8b8faaf5dbec353f3f64197d7ba0011557cc13411b8664590e2bc18517cbec0683bf4da982cad2f85cf3eed68fa4f8ab8201b4850e6f7cec0082914d9432ce7e48debdccbfe0cd037cc89526e4382cb81b80b844095ea7b300000000000000000000000073282a63f0e3d7e9604575420f777361eca3c86a0000000000000000000000000000000000000000000000001e3c5e6d667f9c2e25a09d6afbad3bdf0216cba142d92e752fd8c22956ba61fa642d2665e507e7a1192fa047403cec0c3d6bf90fa1c933907d80ec4668a605f2a18dfbc87255c8dda92ea8f8d240850e6f7cec00830454ff9473282a63f0e3d7e9604575420f777361eca3c86a880de0b6b3a7640000b864aed351470000000000000000000000000000000000000000000000000000000000000cfc0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000025a042d718cb1b80c7615c6ed21a5cf00b8b174f70eb1004005e0dfffc4fb2a4a090a07ceb1139767232185f78e822b78649d0d4123861205f8236b8e6268750048180f8aa80850e6f7cec008301117094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000040c266a51ced55caf390cb6e00b5b38c5736a79200000000000000000000000000000000000000000000000000000000b06d6f9026a0493eb28fb2ad6ed89ddcf5f2cc30f6432d503c69dd91d5ff0c990c9f4f188886a045bc2d33815b1765150e63ef106e5b4c5ad877b25c1419a122304b089572f15ff86d820229850e6f7cec0082520894bd7de91133e32ced22820aeb44a864b2ec25c7188711c37937e080008025a07d0a9d5cdb3f59f1bfb3df400acd0aa3112ab5948018e49024571d3254f7aee9a02f0a90d0eb973cf22f86fc9c4d15a1e6862f2e9cf2817d63a12380866938f93cf9013201850e6f7cec008302fbca947a250d5630b4cf539739df2c5dacb4c659f2488d888684fd111d7566bbb8c4f305d71900000000000000000000000080fb784b7ed66730e8b1dbd9820afd29931aab0300000000000000000000000000000000000000000000016cabe0ead394bc000000000000000000000000000000000000000000000000016ad91964884878800000000000000000000000000000000000000000000000000085d8cdb8b5a19d41000000000000000000000000e62d82f95e7fb1848b1a01a5972d4f7a0507a55a000000000000000000000000000000000000000000000000000000005f7bf43925a0305fb0ab4a1a1b73a4dbfb4ad525ca66b9fa64e737361343cf0881dfdf489024a0749ceb292f716bbf44ad3e8c5100da848a456086e45fb273d77accf232b8fd74f8a977850e6f7cec0082ad46946b175474e89094c44da98b954eedeac495271d0f80b844095ea7b30000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff25a096609f8ab69bbb36e2862e2d6cef3fd7cf38535243737431aac84dcb7ee0507ba00dc3a059327e9248c684828dbce2b482843dd2b066058ba81cb3bb4a4fd5af16f8a93e850e6f7cec0082beb29487047986e8e4961c11d2edcd94285e3a1331d97b80b844095ea7b30000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff25a0d2e07ce83d0c82fa351da9765e8a9ba3cb6c48694e40f39cfd5adaf10a114aa9a03281be0d89b856c3b5615af37ea71e8a8860b9b626d71d7bccf082b99fc2861bf9016c819c850e6f7cec008301f961947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010438ed173900000000000000000000000000000000000000000000001080bca471a87251120000000000000000000000000000000000000000000000000fd6f74af9fc2ee000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f13f7bf69a5e57ea3367222c65dd3380096d3fbf000000000000000000000000000000000000000000000000000000005f7bf45800000000000000000000000000000000000000000000000000000000000000020000000000000000000000002a7f709ee001069771ceb6d42e85035f7d18e736000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc225a0e901cfdeae3ac58d894863e2c810c32c3dd9d3c93c2a5c205a1dd1f860d51d8aa07454fb37616bb4897a4ff1aae0690c678b4039fc88cbb24b942767444027c3cff86c09850e6f7cec00825208947fd97df8b1bd5b29e97ccf09197fa86196b6a79e880de0b6b3a76400008025a09f2c471e5f9372d9d1d67ff2ad43a2a290cef47624e71c0d41e28a6e4b7ce7aaa05601a15d106d6d9ebbfcaa8d755c88d7ab4144f689d394b712a30ddeb4794d78f8cc82525a850e6f7cebff830249f0940000000071e801062eb0544403f66176bba42dc080b86400000022000086fef14c27c78deaeb4349fd959caa11fc5b5d75000000000000000000000000000000000025948db5a78975a28a00000000000000000000000000000001000000000000000000000000fca59cd816ab1ead66534d82bc21e7515ce441cf26a0dae920ba1886fd25c3749ebe20b67e39de3fce33227c1205a9fbd389652f8674a069100b5700683f1f58729cf795837c93a1ffaf8095368a82c477e287b8530b8cf87083032eb4850df847580083015f90940ea6bf3bf79c21703f34d021c2b7dcf76c44fa888804820fbd9230bc008026a0128468f13235769729c71c3929fb11127d400455ff314782c1508c3c6c273163a025cdb5a37aa93a72b1848940336010df7e27d89396a3e6d56dfd44dd373d4538f8ac824268850dd4841200830119ed94dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000008d8478f898907e6251d98601f32a0c1a94d315580000000000000000000000000000000000000000000000000000000001a35a541ba092cf05068392bebbe1e7fb04c7afc1e8781b5dfa4aa8d09bce894e5d9353406ba00dd9f708bd64cebc57b26596c553d05620084aebab5c219bbf5db14ee071a0ddf901323f850dbcac94198302ea14947a250d5630b4cf539739df2c5dacb4c659f2488d882f24f966aa302b2eb8c4f305d719000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000047820d4100000000000000000000000000000000000000000000000000000000472685810000000000000000000000000000000000000000000000002ee8a11d3104686700000000000000000000000015fdaab0c0e130c7f0e72d7efab5e96f103f143c000000000000000000000000000000000000000000000000000000005f7bf02025a01199f616db8a6af136eff302e4dea17713ab7a1f82f4ca3967dcdd7124626098a01f83463019dadf0b2f4d6d60808be65f59a02169c0a267adf8adcb2eb644bed6f86f83010d82850dbcac8e00830186a0945dee759699e83cbc165fa0bf12f80a9ad11c6a0087470de4df820000801ba072ca22aa17cf7a155c6be34f2591ff378832d8db9331009272d5edbfb3b38453a010fd777ad7ccfee732efc0b9309f917495eabf8c59d6425c5719af0cdd42654cf9018c8192850d92f367e98302d223947a250d5630b4cf539739df2c5dacb4c659f2488d80b901248803dbee0000000000000000000000000000000000000000000000d8d726b7177a800000000000000000000000000000000000000000000000000000000000004186672900000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000834d399905c86b993354777ab858e08f6d5b996c000000000000000000000000000000000000000000000000000000005f7bf45c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000ff6ffcfda92c53f615a4a75d982f399c989366b26a0b0f7ae019099233e1a7a4fee1bcc0dc0e21cbe61e49f110cf582169f2808dfeda0663acd0f4b34b6d4471748bc1f1bd3bc39d615d725592816d5a57866b6170a07f8ad8314be13850d4576fa00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000009a6cc6e8a82f6f4e10972300d0b1094072007dc000000000000000000000000000000000000000000000000000000002625a00026a02f21d1dfe66cacbd2d5558809ec77b7c2fa772bf02012f823bfe860f112fa672a056a28ff19d10debc6eba7b0ec39a5c61e88deb0e0258380421bb48b1f270c3baf86d81a0850d4576fa0082520894104ff25f04d2ebcc602495fc5b4f4d422eb7975088016345785d8a00008025a08c8ec39beb6ff5136625b1d07d364bbcdb8f408ffbc65f01951a7b6491601508a0425709fcd2cdd064dd1196044283e0b8667635dd72bd606015301f95c3baf0c0f8ad83147438850d4576fa00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000eb845a45e0dc707164b55f04e6a15e967705ff2500000000000000000000000000000000000000000000000000000000743b3c6526a01f72ff693b4ccf22e1e091643d9b1434e90297e8164560c6047844e0e18f1c0ca02886161bdc412246a540b082900dbddfb7448f1227405b9b52f9b67a858f1e01f8ad83147439850d4576fa00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000003e8d29f9ef0b3b4bdc997c7e644d1e44eac5a185000000000000000000000000000000000000000000000000000000003d648d8026a00748de85240f9a86b2584f9c905f7239a9cb6e136a7e495f19f3c009a62912d9a04cc16a5a7497b42d45368e01d0d6348edad9f8dfc62b8f80c6d23a30fa96115df870830115f1850d4576fa0083015f909433f543df44521a4777f9b65756922b4a51b189598801bea209329540008025a09500efe32941004db60b82da2478379add6ed9cd9592e48ebd63dac7f68dd42ba05977faec04d591e3bb8c6be36e7cffad810e8fdc614f9d0c0a877ee4fec8822cf870830115f2850d4576fa0083015f9094b44e83a8d9aaddc4864f5105822dd5ff234741f7880b4d876ab52f80008025a037d89eb746412bb23c7bcb9090736bc1ec8494c4094227676065f48089d1f4f1a005d6a3a8def1ae1c671ab50f172cf0ea4c744a8a40a8d926a693578e16044949f8ad83128a50850d4576fa00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000000556c4e74997b8c2aa9fab24bcfa7671714124ac000000000000000000000000000000000000000000000000000000001e0a6e0026a039497e16a9268eae2309470719234e0d0585d8c98c61e4ba97a2a10f5a586e1ca070f0a295cda26024665e80966761bcf4c9d489ca8a8211c83763edbd6abfd615f8ac821801850c92a69c00830141da94dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000097870b2951805078c826dec929a0a4e39c1e3ec40000000000000000000000000000000000000000000000000000000005b8d80025a0e40cbd82ebe816bd45396bc46035bbef4062358f71a6f808b6a13c775644b0a1a028b30761ba0479db9a2dcc965b9d6868eff9975f24dd9129aa6bc4f5b480e00df86e820e41850c92a69c00830186a0949469805c2450c797e94db7b684437883af5b26df87d529ae9e8600008025a0766d5f402b9cb8b770574d56a0a18e31a2858d953c02634035540e67f816e67ea0660cf0f8727caa2fff314e153021f34f08940f71af0300051eb9be94334cdeb6f8ac82013c850bdfd63e008301075094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000ea68673a2aa2d7845ebda48f68fece2233a3b90e00000000000000000000000000000000000000000000000000000000042c1d8026a03ddea161a13234d724e4d468935d97c898c1ac1d25498e32ccb37173ec12a9baa022f1e426f03dd02b67cea7068830628ea16df0a853e6a33a772d1b1a5b5215adf8b9829ae2850bdfd63e008304f58894000000000000006f6502b7f2bbac8c30a3f67e9a80b8510000d9c58600140051000000000a68000000000000c12d099be31567add4e4e4d0d45691c3f58f566337134075f5b5a0a94ac891c7b5ec5db5cfcf392cc04744ab87a4c37afd91680ef280b96ee21a026e26a091f853150fbed3d6ef89aa0eefa97ce96374ce267ce44e48b8e355aaae52450ea06d2ac99c554c8d922523541dbe7e961c87cd58621f90bc6d95b72f3bf103044af9029182122a850bdfd63e00830bc315947ee8ab2a8d890c000acc87bf6e22e2ad383e23ce80b90228865a6b4f00000000000000000000000063faee0a2cbcedc0102575c6ff17da38b1565c2200000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001847ecc63970000000000000000000000000000000000000000000000001c9eb028e55c1af0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c12d099be31567add4e4e4d0d45691c3f58f5663000000000000000000000000164a1229f4826c9dd70ee3d9f4f3d7b68a172153000000000000000000000000c04744ab87a4c37afd91680ef280b96ee21a026e000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000078d65bce7dd600000000000000000000000000c12d099be31567add4e4e4d0d45691c3f58f5663000000000000000000000000c04744ab87a4c37afd91680ef280b96ee21a026e000000000000000000000000000000000000000000003b3558c3d643af5e8324000000000000000000000000000000000000000000000000000000000000000126a0aa58ab93b2fc330ed5fd4d5e9e5165877fc517bdc944e03f9b107de1d558fd9aa010272681e6e57c3aa74f719f526873c81e01d01222157448e913f62ab9dcd06df8f6827823850bdfd63e00830a4cb894000000000000006f6502b7f2bbac8c30a3f67e9a80b88e0000bb6bee0051008e0000000014d1000000000000c12d099be31567add4e4e4d0d45691c3f58f566300000000000000000000000000000000000000000000000000000000000000000000000000000000003b0116363e435d9e4ef24eca6282a21b7cc662df164a1229f4826c9dd70ee3d9f4f3d7b68a172153c04744ab87a4c37afd91680ef280b96ee21a026e26a0c4e7826ef9776170a23747941d8e2031e1d632cf4bd0860d00c5ecf14f0fac4aa03a4ab912aa4b0bafeb1251e62a686c05d01856725c2bc9fcb9d514b16e8c3efcf86c01850bdfd63e00825208947a3b3a48da48dfd7171064c43efca3eb88dd83bd880a804988f69b5c008025a07ab7ce5668879c2a8b2271e9899006d1f955755bcca0e84c7aacc87f7384d8f5a001c09a314305066a7a99b0757c3fd34306fd740c3fe676ce9b779989027002def9021f83017e4a850bdfd63e008304f58894e33c8e3a0d14a81f0dd7e174830089e82f65fc8580b901b5000b060d0713abadabced27fd1eaeaeaaf0fd72adb0120000000000000000000007fc95945eaa14e7a2954052a4c9bfbaa79d170ae000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c12d099be31567add4e4e4d0d45691c3f58f56630000000000000000000000000000000000000000000003643f0f256d9376e9c40000000000000000000000000000000000000000000003520346458fd696cc0e00000000000000000000000000000000000000000000000018a893fdda355e00012000000000000000000000c04744ab87a4c37afd91680ef280b96ee21a026e000000000000000000000000c12d099be31567add4e4e4d0d45691c3f58f5663000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e33c8e3a0d14a81f0dd7e174830089e82f65fc850000000000000000000000000000000000000000000000000000f539c0ca6be80000000000000000000000000000000000000000000000000000e92936feea3900000000000000000000000000000000000000000000017cd98b0be009d000001ca05422af299139186ec365f14c427205bc76e7b41d7d6eaf14183a282d41fe90b2a00cc85b86c76ce5d6f9cdcad085624d82476baf34d6c38afb99c8db0ee02a906ef8d48260ee850bdfd63e0083061a8094000000000000006f6502b7f2bbac8c30a3f67e9a80b86c00000bb276002f006c000000001bc1000000000000c12d099be31567add4e4e4d0d45691c3f58f5663017fc95945eaa14e7a2954052a4c9bfbaa79d170ae00071afd498d0000008ac7230489e80000022b1c8c1227a00000c04744ab87a4c37afd91680ef280b96ee21a026e25a00e84a9a46e23d619837c594d3192cea4d9fa388066a4d5b100f79a17a9b45928a06f82d747d441daa4de0c573baf56c442c53c615021b5e9e23d25a3f985d5cc10f9015233850bdfd63e0083026b7d947a250d5630b4cf539739df2c5dacb4c659f2488d88243ea5ce72ec5d47b8e4fb3bdb4100000000000000000000000000000000000000000000021e19e0c9bab24000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000c281e970225cf3bce07d9024b4423b1fd3df0e29000000000000000000000000000000000000000000000000000000005f7bf4390000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c12d099be31567add4e4e4d0d45691c3f58f566325a053005935343bd6b8355c3559ffcd855b30936a0386fbaa36b04aecb6b6fd51c8a0670215bcb30cb573ab8b4c424323039b00fccd611437dc99708c4a93769590f0f8f8821662850bdfd63e00831050879478a55b9b3bbeffb36a43d9905f654d2769dc55e880b890c89e4361bdb09816eaff92a339048a9119bfdb7f0b848b42628642fe0abf20dcc2c82f28fe4f3e406928c22938f493207e57277a8b483b3b122dcdc4000000005016c281e970225cf3bce07d9024b4423b1fd3df0e29470002b67d020000000c427fc95945eaa14e7a2954052a4c9bfbaa79d170ae000000c12d099be31567add4e4e4d0d45691c3f58f5663550000011ba074a4ce83493116995c8eb5746c1068cdd6422514ad83ef16f9e113c69bdb2b93a03002e2ca1e6e7ad945af6eb93d7a4b1d66c8e24efcee9923a565a4619f5640e6f8ab821a47850bcdf49b0082c7bc94a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4880b844a9059cbb000000000000000000000000948045ebbc5fe5ded30f2ace84f99ce1b9fc30a900000000000000000000000000000000000000000000000000000000001bd4e325a083ebfa18687b06c006e7db126cc80855081a2b9954aa2ef84614c467276a1e08a01be36d428ed259ef55ef0cf93515fba796518b62c2a101bb3dcda2fbef6e20a6f901ed820182850ba43b740183061a8094a57bd00134b2850b2a1c55860c9e9ea100fdd6cf80b901841cff79cd000000000000000000000000728258295b1ccbc61d72c4e86c5b44345ac790ce000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001042fdc7315000000000000000000000000c2adda861f89bbb333c90c492cb837741916a2250000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a200000000000000000000000056178a0d5f301baf6cf3e1cd53d9863437345bf90000000000000000000000000000000000000000000000228a17fe49a0620000000000000000000000000000000000000000000000000f69c471cb506f64bd8000000000000000000000000000000000000000000000000015c808740b32a90f000000000000000000000000000000000000000000000000000000005f7bf0340000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000001ca05df7b3acaeb55dec2fb125f4261814983a0f4fb24696bb3c02ecd4bdb8664ab2a0634cd17f4bd2eebd956dcd1c60c882483dd145f36738802d1540d6ca0bd18e6ef9015482016c850ba43b740083026981947a250d5630b4cf539739df2c5dacb4c659f2488d8801028b9db6d1e430b8e4fb3bdb410000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000277d46fcbe71144c6489d182a8aa00da61b57b07000000000000000000000000000000000000000000000000000000005f7c43e90000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000014c4d8e57751e083bcd1edcca5b435720166f5e925a00985497b640cb6f70739b068292050a427b6e0c908a9d29422582a9214a6003ea0415cb1f10d3b6f2a201ef340dbc8ca8c67171e7422cd315bb9fb574d36111317f8a901850ba43b740082ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000eba638932d82ebc1161eb9a992572ecafc197f7e00000000000000000000000000000000000000000000000000000001b9df78601ca0f0f487cfbb3896e83daab39082d361b5df9c6b7af1b24c227268f23c886c6ff7a00db21e461dea4897cb626c4aa60df3979aba5ab4e89971b962ecc59729403e1cf9015258850b2d05e00083037033947a250d5630b4cf539739df2c5dacb4c659f2488d88027f7d0bdb920000b8e47ff36ab5000000000000000000000000000000000000000000000229a587e3e68685925200000000000000000000000000000000000000000000000000000000000000800000000000000000000000007562be2022d31a75f9887b7b932256c704f0c8e7000000000000000000000000000000000000000000000000000000005f7bf45b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009b06d48e0529ecf05905ff52dd426ebec0ea301125a057e78766ae798e30b06e2ffea600bb64950ee8498790fae4be4232a58a7dab76a00bcf0307bd910dc4eb8a0f59c08c38941c951ca5c176e394c20e2802f0ec0569f8a928850b2d05e00082f17594dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000005f053acac0d67f0e6d1cc7a5284727ddc108a56400000000000000000000000000000000000000000000000000000000389fd98026a0af5ebed76724a1a2ec0480f7a928c758f105039ece0c9dd358fd36ff89148d96a058f4978b9b948fc259616bbc48bff2d42b201af89d3920f730c9bda89bd95ad9f8aa3c850b2d05e000830320b394de4ee8057785a7e8e800db58f9784845a5c2cbd680b844a9059cbb00000000000000000000000038e3c92a543ed6c87eaed33bcba04b9d302912200000000000000000000000000000000000000000000004d12beac3ee39f0000026a0df7786f7994c5546becc6741ef476cb6d1a4b07cdfc95ce9d4c54973b86460baa07a32b0a60ca94b0902b6a2640ca23c65daecc540d4c60662f8e1488373659117f8ab819c850b2d05e0008301494794dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000002ebd488b3b362228c503afc7cdf1698f37722fc200000000000000000000000000000000000000000000000000000000000f424026a0ac0838acef8e84034d475c2e2ab9b194ca0a29ad1550a69aabc497e857373d96a03ba2143fd0ab21a2ca741b874ccd2db3b6dcdf36756b7b7e678b90157e068f4ef86e8319ac74850b2d05e000825208941c6cc4f378266a1ea89edf1f92fa529869571a18870e90eda39440008026a0f1885607a6a384eeca3f2a221cbae0a7d1be32189a26e3f6024f1013b6458a66a02eea3bde50f2a790547d02e53f21a721131cc0d6823a7a0f104a1d2e027bcb9bf86e8319ac75850b2d05e0008252089498aae5c4097f803a0616b537a4f62bb25ad837ec870e90eda39440008026a08da329c004df7420e2065f1344a77dc6e2819b5fc5db5812c362af58596989e5a054e3f72cfedd01491d81ac512663d1bc6915757f32d12ac65385214dfa6b8390f86e8319ac76850b2d05e000825208945b879b10efcc5400c4b5931be5e577c8c97593d1870e90eda39440008026a02260ca75dc848b82e2e24e00de3dd0bea9c664adfde6805a791c77c16dca03f5a0225743a8e187c5b54148cb099920874a99a9e761b2870e46a3f9bf4d60fe9e4af86e8319ac77850b2d05e00082520894ec0ae94c1c03959118a66fbb43fc39bc2c1bb63b870e90eda39440008025a08b750dcdc29374b2cb70f517ca646f5725b820a0acfe10b9e3a216a652b2f54ea0765bc5c251ee433c85ab35bd130bba145df8511fccce743adafc46722d4da752f86e8319ac78850b2d05e00082520894558d7cdf026486652f3d94b2c860c9fdb9b05fae870e90eda39440008026a0bad87f9413c9d85e5fd708e81d62f68d8c34addcfb8e269594573c6f9a9427a2a0672011774c1598a0099b20bb3426768a96ef8962de389ecb94d6eb7e0d5f0f81f904b375850b09429fca83053d2b94dc6c91b569c98f9f6f74d90f9beff99fdaf4248b88745c7039d837c000b90444288b8133b1d717c9fedc8e8f40fb977a4a887e7f3b9721a403109441c45dac7dbd42d537000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000032464a3bc150000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000745c7039d837c00000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000d0e6cbd9da5d6214818a3ca2c4be074174faea8100000000000000000000000041f8d14c9475444f30a80431c68cf24dc9a8369a000000000000000000000000b9e29984fe50602e7a619662ebed4f90d93824c7000000000000000000000000dc6c91b569c98f9f6f74d90f9beff99fdaf4248b00000000000000000000000000000000000000000000000000000000b0de47ff000000000000000000000000000000000000000000000000745c7039d837c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005f7bf6caa989bdc492903b542331fb370f3307fd1b2b2bbabf59c552db34fd50dcf47be5000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f47261b0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000581c0d6b99cda91d02c52cfe70cdee39e3908e10733ea0c7bbea96e4bd0cf1eb3c9a179df6e905e92a575c6d947671bfe84aa761eca6ffec506e310223bd236d6854da8d98e2a1a211130e940c71f2004885e8c7810800160400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000561c4cce9f6578c835fb47c7b5d6fb1b4d4f5f815dda45bd98d920c70577d1f063fb3a80eacb0dddc9730cef6735e23abe58b2747d3173eb0f75ce1ca86d3472bb01da8d98e2a1a211130e940c71f2004885e8c78108040000000000000000000025a014fad5808e4a9ae55ab8dd2c1807fa7ec2c1d4c15bea056922b2e791b6264941a047f50bb736001dec7314f4ea345412053d147442a4204236d5f27d3d69ccae6cf8ac820244850af16b1bb383030d4094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000ba6f0cb6688748e1dd48d1bd5924f930bd164ed2000000000000000000000000000000000000000000000000000000000cc6438025a0b5374ec5198978e5e9e362dbe3dce2a7271bbb466ae3aeeb4fbc7fe845089986a02110277cc3dcaf906ef487fe923f0c36347415a31425449d0edc92c9777d5782f86c1d850ab5d04c0082520894c0631a2e7e8b96f7a22e117560b39c9e908a6da98806f05b59d3b200008025a0196275ae3606075a8f23e705b9c8438c0fe9aba2cdac79ca0fbc52b456826ae5a003071f97a20eb4e372adfe0261bc123f31dbe1fdf431749281a8e4626e6f9ddef90d8b04850ab5d04c00830357e8943b5d2b254224954547a33cbf753bcaa5eb4b27bd80b90d249ec9b36b0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001c5d932241d20c7a72a42bc6a023437347bb80940c45e7fc8c4c5e6f1cc02c591b1c7b04f95c1be906d5354ad4d3458e97a04a9ba7a45b1303756728eaa0d45b7f000000000000000000000000000000000000000000000000000000000000003200000000000000000000000007bae6e785f8c9f5aee6ba49cf72d19d5e412707000000000000000000000000000000000000000000000000ac7b5695e7e7f530000000000000000000000000c31bf9a4969a3ad0f2b9823317b329125bd3e923000000000000000000000000000000000000000000000000abc29874867d4bf8000000000000000000000000d1e6fc718660618d73d458a77bd0339f6c2f4212000000000000000000000000000000000000000000000000a98966b8c60716b000000000000000000000000066b064b5fac00eeb32cd6bce64bbf5fd98581b08000000000000000000000000000000000000000000000000a8fc4c2e8afd20f000000000000000000000000061f1d048323de4aa996290f63a1e2a29636a3d06000000000000000000000000000000000000000000000000a8d7cb23466da910000000000000000000000000ad1b4d6d80aea57c966d9751a5fe2c60a0469f60000000000000000000000000000000000000000000000000a7a6751221a3ac90000000000000000000000000bdc7ac031671bd67190b09a8c3cb1e7872b6c6a1000000000000000000000000000000000000000000000000a7883a2f27b3c020000000000000000000000000088b99442b893a861db16e5c8c6a01a66d0c3ada000000000000000000000000000000000000000000000000a6e441d4b6183960000000000000000000000000dcf54138acc74e9b99570af10328e89d97d5512f000000000000000000000000000000000000000000000000a6610325fe2ec410000000000000000000000000d65e87f756d0f21faceb8d32eacc509c1284f25d000000000000000000000000000000000000000000000000a62aa70b1f6f1f6000000000000000000000000037a33fcd214405e74ed93addfc7f0787326c4f40000000000000000000000000000000000000000000000000a445a47aeb3c1b1800000000000000000000000068799b81c7bfca8c661197645755ac33da8ef4ff000000000000000000000000000000000000000000000000a3fa48f31df4cd6800000000000000000000000090496a8e1925ad4a1931ca2be0e50480abc24e8e000000000000000000000000000000000000000000000000a2f5c981c11bb8e000000000000000000000000097cf2bcd41c323940022bf8906da9011b8271ab5000000000000000000000000000000000000000000000000a289933188fd0790000000000000000000000000945fe27749f564173237fddf47749b676a14111f000000000000000000000000000000000000000000000000a1088c0a7dd222c0000000000000000000000000b21763ce87472dc76fc3b485fca9d57df5d47bfd000000000000000000000000000000000000000000000000a0b781dfa364764000000000000000000000000067513103973cf85cb20f2f8ebe61cfc1990d3d3f000000000000000000000000000000000000000000000000a0820178a791d2700000000000000000000000003b2e5507929f9b794f39acba3f0311cc636390140000000000000000000000000000000000000000000000009f93541fdff84f4000000000000000000000000080c5cae1fc0b6a548ea16fe40171d01555f4f57e0000000000000000000000000000000000000000000000009f8a6ff0dc0416b00000000000000000000000003d16451a4b73e778bfec126025ba79716a17e32d0000000000000000000000000000000000000000000000009ed512db2aea289c00000000000000000000000033debb5ee65549ffa71116957da6db17a9d8fe570000000000000000000000000000000000000000000000009e9a91a4b0b0683000000000000000000000000024d0db7e182fcd29ddea14c04bcb182c89cbb0c00000000000000000000000000000000000000000000000009dcaa8e3be581688000000000000000000000000952ab11461fc27f65175b0469eee9f0f5af3a9ef0000000000000000000000000000000000000000000000009d3748d8c22dc31000000000000000000000000061af6c7925cb106ea04fb3148affba6220bda5c20000000000000000000000000000000000000000000000009c6cf18620f1e0180000000000000000000000002db3c0f42022fdc8dfe70036fee85e48a24b88af0000000000000000000000000000000000000000000000009bd0fa53e03389700000000000000000000000002fe50c88f228dacfc24100de0c5167aa7a539dc600000000000000000000000000000000000000000000000099d85913e41be54000000000000000000000000033d66941465ac776c38096cb1bc496c673ae739000000000000000000000000000000000000000000000000098e8c47b582093f00000000000000000000000009e75d5cf5d6a1970e47bc3d37f3c21a878c321e900000000000000000000000000000000000000000000000097c535c877dce088000000000000000000000000852bab46dd2dd7a585d23a79a8600c2a65fcf2e000000000000000000000000000000000000000000000000097811829ba6749d0000000000000000000000000bb9297f03e92ecefe1a45bda0e585fc6f9fab41600000000000000000000000000000000000000000000000097811829ba6749d0000000000000000000000000dabc521955476811ed6d39d7d54224c37bd8acb000000000000000000000000000000000000000000000000097811829ba6749d0000000000000000000000000eb5831daff60bc27a3af7ded164ce159dcac035100000000000000000000000000000000000000000000000097811829ba6749d0000000000000000000000000f4317d52acdaf924329c8a15c37a9273e2a3797b00000000000000000000000000000000000000000000000097811829ba6749d00000000000000000000000006c31b772cc57cac99c85d2d0b0df8e54b07a7a5500000000000000000000000000000000000000000000000096b154951fcf8310000000000000000000000000ea94c9a3bcc2bf5a3c08e3de1ccc64c6b604971000000000000000000000000000000000000000000000000095585cb6c4282a10000000000000000000000000e5ae7e62ee71f675f2fe0ff5cc83c215a44e76d100000000000000000000000000000000000000000000000094ca53acb0c381500000000000000000000000000db5e7924d87d2ec27876882e7af911a58050dd1000000000000000000000000000000000000000000000000932042d59dfabc70000000000000000000000000c2d3ad9240a85cbdbf2e77223185542996f192eb00000000000000000000000000000000000000000000000091ad5c281f8ac6d00000000000000000000000001fd252771bc2dfd38ec774efeeb3c6ab7e8e535b000000000000000000000000000000000000000000000000915a77a49303dab80000000000000000000000000b946efae53975b97a0d1d02f75fabf55d0d6a960000000000000000000000000000000000000000000000009082d22b97189770000000000000000000000000e07e487d5a5e1098bbb4d259dac5ef83ae273f4e0000000000000000000000000000000000000000000000009074a6a89f402e980000000000000000000000001fc022c33332bb9e45f3ff8129a51f03347f842f0000000000000000000000000000000000000000000000008fb33fc665fa01a00000000000000000000000006726b6dc15eaef7a530cd9e27a5027fff66a46420000000000000000000000000000000000000000000000008ec37e27521c85500000000000000000000000002fec5d8835b39f314187dc1da933b273f32f18c30000000000000000000000000000000000000000000000008e2577f5cf5c0b700000000000000000000000001f4d088464a0175c8ddb90bc7a510b1d5a0da1a60000000000000000000000000000000000000000000000008c7de56bd4e5a0580000000000000000000000000c780749e6d0be3c64c130450b20c40b843fbec40000000000000000000000000000000000000000000000008c14be8f739d98a8000000000000000000000000291502048a3396486cded59288df83fb9cc9d1cf0000000000000000000000000000000000000000000000008c0d91180c2789f00000000000000000000000009e199d8a3a39c9892b1c3ae348a382662dcbaa120000000000000000000000000000000000000000000000008bd9a02684ae1cc0000000000000000000000000c13ec844eb19d6a72ddd5f2779484ba35279a8170000000000000000000000000000000000000000000000008bd9a02684ae1cc0000000000000000000000000970c7ab1ca32547eaacdfcc89f6ed924600da8670000000000000000000000000000000000000000000000008bd9a02684ae1cc025a0d7be5b752c62db2acc078d5ec60fdf525d8d1866399827772c7b97c8b2996b7ea0390cf16c61b37128ad6e8e56a36190e11de890f326ba7014b82fe655f08cb37ef86e8305985c850a567242d6825208941d86c8a33c7b3b6c7f2fc580e7a2b076c49cac75870118a797e62f6e8026a029ce1c2f5f6e95826e3484b579a32b14088966c802120a7f64051d64188683f8a044a9a1c7f2d05971808a1699b2d21e1240dd5e99ddb716cd34be9ebc23e17ff3f86e8305985d850a567242d68252089499ab81b3e74800ac05958cf8e8ebb9d3a3f994648702c8cc350d8c048026a0f06dc5296371c0503dfd1a8c7c1372f23bce4ded60a992e348df49116241b12aa0659b3d14f8a3a9a26bbf8571e9520c8f319977a368c665ced3708daa18074703f901ab43850a3e9ab8008304fba5947a250d5630b4cf539739df2c5dacb4c659f2488d80b90144ded9382a000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000001e4bc4bcbad7000000000000000000000000000000000000000000000000000000002ddd72f10000000000000000000000000000000000000000000000001e3cf46b06880d66000000000000000000000000ce156d5d62a8f82326da8d808d0f3f76360036d0000000000000000000000000000000000000000000000000000000005f7bf4390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bfd21d58146585fa30ccb92362c65c6e09d6b9ee2bdc77e87f02dae12152a13f72e3c0ba57b03f89e25d5ba8bbf4f945ac5b8f1693b7739f3d802f640876b682326a062147cdc091cd1f38684508540739bcd6fe25c07e3bcec27f88edae81e0c4753a0569a6a8f75bbac18ad6a97ee205aebafa30f8c31d53d0f582d6630c0eee3babbf9012c820539850a02ffee00830493e09451b4b27a7bd296fd34ca7c469f49d5bcd7fe513780b8c4942d468b0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000007c5e7fe5fbef2a35b02e1bce0d39e0076ec389a30000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000c9c653445750800025a013e64eaee87f711f381bb4a6c240ebe85489843050872b076872b512f7c809eda02864404d277f8dd792b0871b2873e086725661906c5cb606e93a1a4291261328f86b82040c850a02ffee00830493e0943388a0117f0c5c7f493afdf46ea03fe7445dab6980843d18b91225a0125032c84dd6e8d83c39daaeb652d36590cc3fbc36924b2cdedd080a70f5d819a03cb2f9762d738d5140831726d20d039e83a0b12ed93e28d0f5563737d1a043b0f8a901850a02ffee0082e74994dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000006c8d7c88371e673807372d7d3eb84101905be6cf000000000000000000000000000000000000000000000000000000004510cee21ba03e58bb7a78dcfa7ed656e565fe79ab2ff5787e6790d18abcd8db3151f4bdff32a024087d8b67f5a2c7f4e82d73444b7fe59d29128fa3e69a407da7ded484f1633af8d2278509fd0a0d00830124bc94006a7fab93971acdcfd5e465c29d714ea0d530b5880de0b6b3a7640000b864ad65d76d00000000000000000000000000000000000000000000000081c4d9b0b73ea666000000000000000000000000000000000000000000000000000000005f7bf45c0000000000000000000000001764dd87455540b164f45edd8d1efabeba26d52425a03359ecd73c9462378f22b31f6d3cc9cc0f4689d2748baf03a15bce87d66f826ba00ce062c7e1e797ecdee2f97625959230607aad8f182d44c367e855e26647fdfff86c028509fd0a0d00825208949187a1b5022ad5e801c474589c3d683e067467c188058d15e1762800008025a0151e70852cd730f3a3069bc8088f0caa6dec4c16defb7cf78776b0a55477641fa0709edc84332329640ba64a75b28e36c2bd9472cf251f10ae679da3cb0a8665b9f86b038509fd0a0d008252089469ae0b74d23a741a25a6e997de6418f374a0cf4d870c8304402804008026a02d86bfefc7eea31f1899d12e71d8ad9399c4a74ccca7fe43218a485858dc6bf3a00c93da0de2cfeda1909b651cafc831f28ab568b18a195bc5c4538ed09094f372f901548202848509fd0a0d008302a6b4947a250d5630b4cf539739df2c5dacb4c659f2488d8820b00eea5820b8beb8e4fb3bdb410000000000000000000000000000000000000000000000001bc16d674ec800000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000373d0ed6a697846661c3b0a0b9b94577c564c79b000000000000000000000000000000000000000000000000000000005f7bf4690000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c34ef872a751a10e2a80243ef826ec0942fe3f1426a0b9c2f746418b791458f6a3437cd5c73c486373a6917c2e6def8d938539aaa492a03e9771211cee9602321727096da87c4b78b086a5ea0d08fe6b5164217333eac4f8ab821b878509fd0a0d0082ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000003c707feb77ee94b42ea0544c6982865b651ac9660000000000000000000000000000000000000000000000000000000005f5e1001ca0d26fff2eaa7936817c0d64c73dd405a2671e6db3f9d5d38adf58312f035cf734a0418044c1fe119a29b5b280dc352c96a70d1ebc1a31e67dfbd4d9039f063f10c3f901527c8509fd0a0d00830243a1947a250d5630b4cf539739df2c5dacb4c659f2488d880d2f13f7789f0000b8e47ff36ab5000000000000000000000000000000000000000000000000073b44eb80b69e320000000000000000000000000000000000000000000000000000000000000080000000000000000000000000579c90f77ae0c44ea7ba329c41a980d36348d8a7000000000000000000000000000000000000000000000000000000005f7bf45c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005befbb272290dd5b8521d4a938f6c4757742c43026a0c9e13f207c1877b89b510db359d494bc9a46cbb54ecd7227eb28c8f101decfe2a05ada94e4ecce058759c82d417fb1135c93d878f3e2143f73e88a2741feb1a853f8aa018509fd0a0d00830132b294c05d14442a510de4d3d71a3d316585aa0ce32b5080b844a9059cbb0000000000000000000000006a43c606609fd2f10b5e04bd199c311f2381a26a00000000000000000000000000000000000000000000007062f534e5517b000026a0f41544dcc58b2f6c501f4d339e8019c1c05cdd8a95eea59a11a67564e06c16f0a070ab365c8e8138326e309989eba25093c4731748d7449f1903a403118f2ff62bf9016b558509c765240083029c35947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe5000000000000000000000000000000000000000000000000660fb7013f9c7b1a0000000000000000000000000000000000000000000000000cd39e0af9d7081f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000f68b6c658087cc45a32afdb8c38509f6eaa84b0c000000000000000000000000000000000000000000000000000000005f7bf45c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000038acefad338b870373fb8c810fe705569e1c7225000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc225a05479d4365dc72b124109ddf48047e17ed0bd6b111dd72343dc57f3f0b23df5fda0544dd5bde89240cee4ecadcaaf71ece54053a68646fe98203b812cb5d9e6ca87f9018c81968509c765240083030526947a250d5630b4cf539739df2c5dacb4c659f2488d80b901248803dbee000000000000000000000000000000000000000000000091fce1efdfdef40000000000000000000000000000000000000000000000000000000000003185259f00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000b15dc08b5d8a0c596c1f7970732ba7e5074c9ebb000000000000000000000000000000000000000000000000000000005f7bf0b50000000000000000000000000000000000000000000000000000000000000003000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009e78b8274e1d6a76a0dbbf90418894df27cbceb526a02fbcf47980497d578369380634d9107bce7e5e00e3db4335a46513a054878971a04abc8b37dec7aa082b6fcaa84577838fb08fccbceaff700be48102b5d6c17153f9015482019b8509c7652400830283bf947a250d5630b4cf539739df2c5dacb4c659f2488d880de0b6b3a7640000b8e47ff36ab500000000000000000000000000000000000000000000000274287b3e75d1707c0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000f3c31bb059036a9cb0fe4f516d88aca7a8c0ae0f000000000000000000000000000000000000000000000000000000005f7bf0240000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000fdc5313333533cc0c00c22792bff7383d3055f226a0c263437091b1b6470cefea0b3e958b1df35b51bb14211dfb217a0ab42cd8686aa02c97da3139e224a50a66d0d0256a463e6fbe5c3e0eda7d5c4f1a156b07b02bfbf86c148509c765240082520894cecea3a4cc75bdb5681e0c1e9b9ef09a8793bba7880780d514a93f0000801ba0ddd15b761f33f327617511150ef88572812500f1b1720d124b118e39b8ffe000a051cec8a670a822bd6faabae5cdad84d770f97dce67a654bcfd5b65caf3aa167cf86b028509c7652400825208945cfe24f2912ebb0fbbde9d70e6c495e69f58a58f8725ec578c01e8a18025a0e755e96f5d27937fbe5a171c2601df09076a1cdd21f1717a1042bf8196b19af5a03d784c0743047be9f39af71cb3d0eddb9c1e89d4082cba5eb39cd6ed78a0a4daf86b0c8509c7652400825208940adca8d84b20b30a8a7d4ed207ccad825c0cd39f870aa87bee5380008026a09129654f51f4fa187ebf9b7af4b95bfa25a1135f51e1fd247ef9c0dd3046b527a0464e5c2b13f0e3108a67a3201676a00115770a915b2cd8a42e887cbce681b3e5f90131038509c7652400830308d3947a250d5630b4cf539739df2c5dacb4c659f2488d87071afd498d0000b8c4f305d719000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec700000000000000000000000000000000000000000000000000000000000ac6eb00000000000000000000000000000000000000000000000000000000000ab91f000000000000000000000000000000000000000000000000000711e4fb1a60000000000000000000000000006c015175b6fa02f93ce0fe99e13554fa6a104c59000000000000000000000000000000000000000000000000000000005f7bf45c26a0654606132d677aa2b799c7ff664581d1fd7e10534c7138fbcc871772e275ae46a0250615fdc003986fcda12488d162770f98973e583ab86b8c07132cd0fed93272f9016b028509c7652400830290c1947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe5000000000000000000000000000000000000000000000000013fbe85edc900000000000000000000000000000000000000000000000000000180b9cdf65f766d00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e9bc563691fa5adca0dab7ed8e7c1341277ed4c2000000000000000000000000000000000000000000000000000000005f7bf45c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000009dfc4b433d359024eb3e810d77d60fbe8b0d9b82000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc226a05f5fc078448ccc652abf2e867870bacd9c4f78b10fb16dcc5597170d9d04f7a0a07ec8ad3754705ea33324ff8991dcaa36b8ea34722f506dabc7ed6733f3847da0f86c238509c765240082ae3494f22953567a8807848c36ee02576694649a37f645880bcbce7f1b1500008025a099c7734ad747ff41d40e3ca37f28c1e7c1cbf11bf495fcfc7db4161f76901aeda02c08079a11a875b06bd38b9db97266613f83b2c173462185e91295500b8c86d1f8aa3685098bca5a0083015f9094514910771af9ca656af840dff83e8264ecf986ca80b844a9059cbb0000000000000000000000005c985e89dde482efe97ea9f1950ad149eb73829b00000000000000000000000000000000000000000000004f78d640cc92a8000026a036462ef4f7dc79093050f26be02535f20064fdedcc456c27c45b4e4bcd3b186da03ac78299efb26baf2e54276886e2d726c6459b7d67e614f63f549c9cc6b29cc4f8aa0585098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000fdb16996831753d5331ff813c29a93c76834a0ad000000000000000000000000000000000000000000000000000000009fa9def025a02576ec6be227f2ccebe0fe03d1c89e0c6e85a4da440c13006662ef3b79f246cda01b207e62214fedca6621c32f8f9b50034bb76b73a9a196dde34c737c7591976af8aa0385098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000adb2b42f6bd96f5c65920b9ac88619dce4166f94000000000000000000000000000000000000000000000000000000007733b2c026a07c2de322142a5037fe2b0e849903883af9f7801b64b12049f2eb31fc6b4fc679a04287a9e2e1bf0238aac81b0bca1c6f2e147cd43bf9ef219f4eddd424504e3ed0f8aa0385098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000fdb16996831753d5331ff813c29a93c76834a0ad0000000000000000000000000000000000000000000000000000000077326f5025a0bc3b627348c07ceaecde8c20ae369ed4044435eadb98fd730d39327b03110ac0a078cff03080223c0fc2d61652c62d4b77fd4e2662338e1fd6df25738d482d45c8f8aa2185098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000fdb16996831753d5331ff813c29a93c76834a0ad000000000000000000000000000000000000000000000000000000007731273025a009d0269469b831785c4daa4f705547f3379099988f0409427a6b7aebfefc8b07a06004458520a81a83c5603c0ec2717660dfafa2f58c8411d237f44fe1312d2628f8aa1585098bca5a0083015f909432d74896f05204d1b6ae7b0a3cebd7fc0cd8f9c780b844a9059cbb000000000000000000000000e93381fb4c4f14bda253907b18fad305d799241a00000000000000000000000000000000000000000000014fb68f5d03c265400026a01855cad304a3c245f7635998e739ae70924444b10337677c554369b25ee76e95a00ec7988b478d3e0aa4e7a434da8928e413efc073108988091fc817d624d9a2bff8aa6985098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000000a98fb70939162725ae66e626fe4b52cff62c2e5000000000000000000000000000000000000000000000000000000007f60084026a03a371eca9ea58a82b38af8032e73870382e18009cf39d8eb290ed342b0825bfca03f3fa1cce7e07ff0909a1914d6747c33123634dd6a5940f2a3093e020ce9f8d2f8aa1585098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000046705dfff24256421a05d056c29e81bdc09723b800000000000000000000000000000000000000000000000000000000773021a026a063a1a1a30aded50d8619b08e0fbf2b9defc2e521a0731f2953518b65cb413907a02ddaa13c9793edf51f570429f09f714f2a79c1a9a1ccc343899be81911bcdfd6f8aa2e85098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000adb2b42f6bd96f5c65920b9ac88619dce4166f94000000000000000000000000000000000000000000000000000000007733232c25a0eea5d54d8a2988876099e73b7a7b458a370f94f4b7343119da720bbe130624aca048ae11d7219a72fc9f20e1144624db5f1ec7d2b220b5ef59d6cc22c4feda515df8aa1185098bca5a00830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000006748f50f686bfbca6fe8ad62b22228b87f31ff2b000000000000000000000000000000000000000000000000000000014b48598026a09bd76874b6033a5cab13a2215a7b3a78a571c4411a8225d4855de261a1ece36ea054edbd5d59ed79cdad561ea97df9fc17977495ded7ce4ea4955725a10562e7f1f8a911850979e8bd4482a0f994dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000006b71dcaa3fb9a4901491b748074a314dad9e980b000000000000000000000000000000000000000000000000000000001091f18026a0737ea17db2080698c2af3d7a9f9ca14bfcdd0e21fc0e592271fe050d4209d1f4a035ae008889f7d5d85b8ec48bc3929f681b09305f36eb65a6760918e9b9b04677f9018d8214c1850979e8bd4483010e2a94d141a26d786e9432d345774721fc141c13ec10f380b9012452bf1d92000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fdc8e278f5bc4576a7fd13d1a01dc081ae0a2b00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000da57b127b937185816683503de31cdb1fa203001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000af90e3681ba01773e74e7b8be1b0a6cdea3dd634dcb724613891e99b06e690a05addee7d8cfaa04d966d9097c1e3b0f2d2dd7a2eac5deea28d8fa328643d0b065ea86aea472fedf8aa07850979e8bd448301d4c094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000c3462da2baac16770caf09c6349241945c0714f700000000000000000000000000000000000000000000000000000000810351d426a0176f3b44e6e9c0c12c89132a64089ba2b9d66aaf7aee5df92747c5a9bd847fcda01d9d2f4f002f006817cbe5da7375dfd5949e682d24bf347c61fe3350c9098764f8ab821b88850979e8bd4482ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000531052427a3fdb4e1eebc8765cdf6e98972b31d4000000000000000000000000000000000000000000000000000000001e8480001ba019040c51840ce978756fb8d0b98a47b05d36e8e78228ecaf6d223f93fae8f3caa01ae2bdf972eae310ef838938165d47379563cdd265a7004ff42836917da8a522f8a906850979e8bd4482a0f994dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000006b71dcaa3fb9a4901491b748074a314dad9e980b0000000000000000000000000000000000000000000000000000000024d5ee8025a06fe92d92cc309c4150846ea5ed9413490306579b6c7ce664478443e6fbb74ac3a046448faf47445d8b533c6423aba3ab72322b3e24ecdea9a0051c6c7983927715f9018b51850973f2d6008303b352947a250d5630b4cf539739df2c5dacb4c659f2488d80b9012438ed17390000000000000000000000000000000000000000000000002636c37f92d4f0c0000000000000000000000000000000000000000000000000054e31d02918ea9000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000bcc414838d46bb02a5651a8714cd647a0c1fca27000000000000000000000000000000000000000000000000000000005f7bf4640000000000000000000000000000000000000000000000000000000000000003000000000000000000000000dfcb3fe1c69bf561a920f623fd152e8630674d0d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000009464a922c053c519ac0237a9650e303d532a4d225a05d067e854341536417fcf031529d2ab65232d4d7964a8c7dac9907cf6fb738e8a055549b345c8b0a10e9aba2d721142995d9e4a74393107d46ca6f80a186b13dd9f9015267850973f2d6008302a2ad947a250d5630b4cf539739df2c5dacb4c659f2488d8805734bbb01b06a28b8e4fb3bdb410000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000001ce0c96cf5aad45a8824c22152ec5055f83ddaa1000000000000000000000000000000000000000000000000000000005f7bf45d0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000c7be37b00c1d3127c09da66fadf3d6eb600dece26a07033f3a1433bd9455f9808c6ea10268aa3f0399b351c9fa96487fba14ab00e6da028578d7fcfa99a356d83787d38cec328f981bd2f3a50a5141f22298f8704edc0f8ca028509502f95b383019f539427b4bc90fbe56f02ef50f2e2f79d7813aa8941a780b86423b872dd000000000000000000000000946f2bf0f01580f3063b94115d48221a92916cf7000000000000000000000000f629527029499db6a6154a1cb20eb210735da33d000000000000000000000000000000000000000000000000000000000000927225a04852d05e9c6c106918bc5312720148113e6a48ae4403a6fd436b08ead64d41e8a05c1cec000313c180f5d29294c27b0d98b3969b7644800366f23ca91b73d31d78f8ca268509502f90008306b5e094bd277e47d0ecdd5db6c57eda717dd8f5a329edec80b864fc1d230e000000000000000000000000000000000000000000000000000000000000898a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000025a0542d85a2796e173a90b813bce70913b51600f7d180a64195ef04d7e2c7b8f90aa0123ed49099ae6c7a368fba99cdb6b6fdd1622e66b9ad8e663ca7d9065e51bcf8f8aa808509502f9000830186a094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000adb2b42f6bd96f5c65920b9ac88619dce4166f9400000000000000000000000000000000000000000000000000000000e10f4ba026a05574388857f5e60d3ec72ceb629d81b98c336f0907ef37f4359a46dc8213dc16a02e749cdc7f6b0a7b240235be95128f0a603abf4e7ad95e1c3df043eef640ef6ef8aa168509502f9000830186a094df574c24545e5ffecb9a659c229253d4111d87e180b844a9059cbb0000000000000000000000001062a747393198f70f71ec65a582423dba7e5ab3000000000000000000000000000000000000000000000000000000743058279026a063f627fcf6ac293cac6f84b5f8807aef92682368e99b244878d162998e5c250fa07a20fbb570af828a69f7e62d06cfe913fa3739f42cb43c2cc16e036efbaa0709f86c808509502f900082520894f85a34c8c414dc13ea15590cd383198ef0c5c63d880e397b561dbfa0008025a0228e8f924ee18c31d102873dada7c8564021e1bf7b3f717cfa230f59ddc42132a045bb47ed08ed4df51d1325f8670ffb91ee4c8891036886caf72b474afa6d94e1f8a90685094312a10082ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000030950d97d1854f587b73f8346c2a808ad73b73ac0000000000000000000000000000000000000000000000000000000051a88a801ba0a3bb6f585af27c6fd0053936542418d3583b5f7d2887a1ba353160f4edb008d2a01ccc663badc590398149dc6757d2351d8276cbd71c8771549cfd902ceda762adf8aa80850938580c008303d09094dac17f958d2ee523a2206206994597c13d831ec780b844095ea7b300000000000000000000000041f8d14c9475444f30a80431c68cf24dc9a8369affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff26a02a8ef1097bb4bc7036343ad59ce010d590ba8c3ad659b160e50287bc817b6d89a06d4e37d3f219cb4f9cf06328259d09a5441e0bf2aec1eacd999ae3142fca4a25f8a90c850938580c0082a0f994dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000006b71dcaa3fb9a4901491b748074a314dad9e980b0000000000000000000000000000000000000000000000000000000005208fa026a04b59e7f4ce7a662e3d133a26fb7beea4c8dcd2df71f162dcfade0a0b28119d4ba06da4670c1575a071084fcebdfb6c73dffbb7d6bde8364d73c1c798aa8b0090f3f86b4b85091494cbb3825208948ac4bf2465dbeec007b7f9809979f22aedeb7806870a71ea17a3c0008026a05a5a5f216393d82283357f4bc9a9b569b467cebdd08da509cc1880301bbefd01a060d0c4d61ad1455b6847965f5f521e62affa0fc86f97eb6395344bb746549344f8890385091494c60083018808941f9840a85d5af5bf1d1762f925bdaddc4201f98480a45c19a95c000000000000000000000000050ed33cc70e3d7952967acb55901b4b44d3cee226a0def74c07de86a0fe72d478fb412e3430b28a2658fe6b10eac18311f6f5a3c4b4a06246e2c183d3dc928cf860bf2c82dc557788a4f8866c179297bfbe1d6479f06df8691985091494c6008311935f9401285d34fe29262a61788775df716acc7ddf897c8084d1058e5926a0ef28dfb04a55901b9a67b00c794502813cfb85b019c9804a004fec560b3c17c3a056254016ed435f806ba9b92be8b3a290a9617b79bac068f223b6abac5220af69f8698085091494c600830878a6949765fea9752505a685c1bce137ae5b2efe8ddf6280844e71d92d25a084331b1cd673c4634c16fa25c6d381b36fcca12b8fdfa34ceeee2f4e7fc68d29a05c0c6ffae21c5c348d0b03c82c6f0cfcb75a10c0b130809aa791977ce26bf17af8ca0185091494c6008301a3869427b4bc90fbe56f02ef50f2e2f79d7813aa8941a780b86442842e0e000000000000000000000000068323fa0171364b9fbb928dcfc22dfe965785f800000000000000000000000003bbdbc26a0aaf9a8991a28b1cc429c8e0ea2897000000000000000000000000000000000000000000000000000000000000927b25a032507f49426c3b56e42db20d0cea50235528728ab5b98097fc562461373161f8a065b9f9df23f54faf91e8a298f1b40da3f00de262492a62f0f9b85d89cbfb2085f8a90185091494c60082fde8940435316b3ab4b999856085c98c3b1ab21d85cd4d80b844a9059cbb0000000000000000000000007b00bcf548a069906f654627c3e04795357d82990000000000000000000000000000000000000000000001f29fe46ae84af800001ca0a7a4d1458365c4beb07b05a6e7dfa0a9bdf73807c508dbd4cd65aa254070147ba035333336910d89b785f3c33feb9c46a11230002e14e32f90533c348499ee6a35f8ac824b2b85091494c60083011170949dffe202df7f82ba57a7f8d571628805eff7fed980b844a9059cbb00000000000000000000000017849384ca9173290f540e566e369df84e924b9800000000000000000000000000000000000000000000006c6b935b8bbd40000025a069acf936392176ffb46c35851218efbe318218f8250261db49a8c9fd411aef94a049509eb3ddd2865547739a9be6c45958552f9d77f9abbbfea2c5047984e378f9f8aa8085091494c6008301259494725440512cb7b78bf56b334e50e31707418231cb80b844a9059cbb0000000000000000000000007b00bcf548a069906f654627c3e04795357d82990000000000000000000000000000000000000000000821a69b498f0c61f800001ca08b42ff2c6746c6663ac1ce97183287bfe79e1e36906ba0e3a349707bdf378442a04f8af6df29b3a0bbc4d5b2b7b1934388c096c9c5eb90172fb297d9361cdf80d4f8890285091494c6008301cdbe94a39a6e35d98e531058b52c28af4ffdeeafb1749d80a4a694fc3a00000000000000000000000000000000000000000000001d776c9997241a800026a0acc704c9c151bb6988ff16cc1f9c3605525c7e2dfebb1251ae4a21733e0a5447a00fc1abe875a992fa1368766c31d1a301467cf565387d9b3772dcd50b96dbad02f86d0185091494c60082520894d43ffc3367ea4fee1a32342c8b92ddc558e5e826890108721d3368fdf0008026a0efd4fbbadc6d2714947ce815eeb99f711459db9573d66a14b4837e1a994442cba02da5a5d74fbf3d4b5a8a17acff8d4e8d0055ed488ef13e56c738e95ef8c85efdf8cc82034585091494c6008305d22794b86021cba87337dea87bc055666146a263c9e0cd80b864fc1d230e000000000000000000000000000000000000000000000000000000000000922f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000025a0734009bcae96f41f77d600c562a70c1606abcc0751268407b7a4829b92eb8cf7a00fb0a91b8b350cc898d3fbf4ea9249344ee677e334d353f228ebc1ec40bcffe5f8698085091494c600830878a6949765fea9752505a685c1bce137ae5b2efe8ddf6280844e71d92d25a0ee1e0d0c01d19fa2881d2db84d4c54c8719ecee4fe8ada44ab6b51bd1892480ba065d9eed77a7f76565d10552537b29753f8f7182403f0334b0a823bc70fa1da08f8897e85091494c6008302b4c59475ce0e501e2e6776fcaaa514f394a88a772a897080a451c6590a0000000000000000000000000000000000000000000000056bc75e2d6310000025a0b56d9e64fd7baac51c8a1464af551978ce94037ba93cd23499a01a42c7950a5fa06d04bf6de15e8f2ffb9359ce517960422106a3bd9c5a4baa3e865ee3e021e2a6f8cd830226b185091494c60083014c0894bb97e381f1d1e94ffa2a5844f6875e614698100980b86423b872dd0000000000000000000000006dd0ff909dc42abd3b6b52f6e7643d215715e1e7000000000000000000000000c1ab0c708aa638ad492d99383217c033f0eeab950000000000000000000000000000000000000000000000ce661595e03f85f8d925a01831096c49030fd369e15776f7d4bac38ef0f8e5572e3447841e66c5ccd5807da02fd5e62915e24339d30a472a565330b8808dbeb06009e6bed9715893c8b36d2df9018d82017585089d5f37b383035ff3947a250d5630b4cf539739df2c5dacb4c659f2488d80b9012438ed173900000000000000000000000000000000000000000000001650c2523dbb933d49000000000000000000000000000000000000000000000000000000000674219400000000000000000000000000000000000000000000000000000000000000a000000000000000000000000082cd3c7035104d1fbfb55acc62667907791fe423000000000000000000000000000000000000000000000000000000005f7bf4390000000000000000000000000000000000000000000000000000000000000003000000000000000000000000b1f66997a5760428d3a87d68b90bfe0ae64121cc000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec725a0f6147595b4fba2f27e1d595a05c11fab5953335862c6edea856f9e9a77814529a056473fcf8e676c26ba05a1767ae9a514901c8fe6faa1ec473d47879afe7762f3f8ab82015785089d5f37b382ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb00000000000000000000000089191c0f10eebde841ea5d12b1f1098ef73859de000000000000000000000000000000000000000000000000000000174876e80025a0be3553ba3c9a205e4d76afbc0a6dd6f0d8a84f7efc8d5076eb98fc43a76808baa055e94b68d8a1da425f4febc9e0272cb65e1da38e6d58c06489d3b54e79b52b4ff8ab8218ee85089d5f37b3828fe094de7f89c3d1261f07589fa52fea19bc1b14dfc91980b844a9059cbb0000000000000000000000008700e5430a4b57f24a7f84abe38864e51af7a4b8000000000000000000000000000000000000000000000000000000909af338a526a02cfb25a32d955a1d8c6b51f339c8cb0acf6cf3e27d45fbb0a2ecfc12b85602f0a024d77aa56ace50dfe58c7413aa08a5006728e293bb26397e7be096277903938ff901522a85089d5f37b383028908947a250d5630b4cf539739df2c5dacb4c659f2488d880b263a94504c2e58b8e47ff36ab500000000000000000000000000000000000000000000000ae0b305bb98f9a7ad000000000000000000000000000000000000000000000000000000000000008000000000000000000000000071a85ed3f949a63dc13c127fc2f2751c13eed024000000000000000000000000000000000000000000000000000000005f7befe80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000002a7f709ee001069771ceb6d42e85035f7d18e73626a0e3ed1ca94b4285e9ae128d9ffc907da874634e6784ac29db70570e5a610aacc7a016da61376d706d3c8bbedfad33e229d2f80a0015e40e5345e7415aaf9fab79d9f9016b0a85089d5f37b38302935b947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe5000000000000000000000000000000000000000000000006551c67c8504ff9b600000000000000000000000000000000000000000000000003bc3298899feb5700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000e42bf6c707ff70adbcb5d3c41a18af9c7b59078d000000000000000000000000000000000000000000000000000000005f7bf436000000000000000000000000000000000000000000000000000000000000000200000000000000000000000005d3606d5c81eb9b7b18530995ec9b29da05faba000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc225a038bae485ad7254f45da6ee9ccfaa7b61e09335ed4d63145c171a6db4b2c58b43a06aaacde283c87486dfaeed8b7c65da2a4968b0da29e5891a74633d1142b9eb7bf8ab81be85089d5f37b383033e3794577af3dce5aaa89510135d7f6e095e33c06b8b1f80b844e2bbb158000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000026a05591dc7d86736fec625daea5eb6e71cf2d41f29b77d6d9e59f030ef0352aba5aa04459cd24f3cbba8eb1f5640ad1f1f36a8402cf438bcccd48b9feb280d80c1e10f901731685089d5f37b38303bbc3947a250d5630b4cf539739df2c5dacb4c659f2488d8802b3a3cb06ced308b901047ff36ab500000000000000000000000000000000000000000000022dbeb06eb8dc19a65e000000000000000000000000000000000000000000000000000000000000008000000000000000000000000032769651c655db12154b17910dd477592c54576d000000000000000000000000000000000000000000000000000000005f7bf4390000000000000000000000000000000000000000000000000000000000000003000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000009b06d48e0529ecf05905ff52dd426ebec0ea301125a0a0d302734d13499be466feeda44570a2bdbf364b31e34be62ee16b4dc4b5699ba0687177566a9a2e6bf7d3f2d68cf60e93482447dd3b472b67c17b8f1e00981b78f9016b7885089d5f37b3830295f8947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe500000000000000000000000000000000000000000000000f23c3cdb2637622cb0000000000000000000000000000000000000000000000000f2ec381bef4f22100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000003904ea4b55a09e7c6e4c213cce0db7a9f599a4c3000000000000000000000000000000000000000000000000000000005f7bf43900000000000000000000000000000000000000000000000000000000000000020000000000000000000000002a7f709ee001069771ceb6d42e85035f7d18e736000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc225a0f34f01bed0f338683c5207c1587d1a5ba229779db4c1de9d5482c4a905a2ad3ea068e89a5b8047924cb71cbc8e123e8b05a8c8719a049afb02a3c6972febcd0085f8a90985089d5f37b382ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb000000000000000000000000d3d0278216491edb86bc06f8cfb11d51a9dd808b0000000000000000000000000000000000000000000000000000000005f5e10025a06c7279aba31527aae21db6b895612f99ba1244bc9aef8264bc9fa6a15cb3efaaa073c383316de97f4c2b5b9b51ea7d74d17be0b4dd9529c6ab4e59e93f5fb57346f8aa81dd85089d5f37b382bf2c940ff6ffcfda92c53f615a4a75d982f399c989366b80b844095ea7b30000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff26a0e4ce469a5e40f47e838933ebf2a5af9cc0cb39b1c87dcc90db9ea90207060960a04210af1974ec3fbade5ffdf79e92a4287b68290a52c8301aa7a96f325b29b089f8a97285089d5f37b382ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000002562dac3ecc0df840568597f5fe5db96d7fad37f0000000000000000000000000000000000000000000000000000000011e1a30025a05d6b5a2fb581a0c76a0b6ad86d9f14f9461a924bfa23fd3e6dc29469aecee960a047cb4d29954ef81da7a65933c5e398a3d012b106ad1f49dd78ede22414a59ff0f8ab82011f85089d5f37b382ea6094dac17f958d2ee523a2206206994597c13d831ec780b844a9059cbb0000000000000000000000006742a5be977a95e6bd413ad7dd67e750d25acf77000000000000000000000000000000000000000000000000000000000081b32026a09d70ff51194da072becc6095e121853a1e9500ee6285a37fb3fff0b7b37d8d46a03054b0e28af6cac98ca911dcfe7e47eef7e9546d1c4743d72b5761839c133f24f8ab82010585089d5f37b382ea60945913d0f34615923552ee913dbe809f9f348e706e80b844a9059cbb0000000000000000000000009bcae07a4f32391c337081db539f18c8a41f0b17000000000000000000000000000000000000000000000000016345785d8a000026a0d8364bccfe1cd13452d32320bbbe7007d2a49eb4c44e4192adcf13c5319dba12a0556f74086c4f19473dcd0e1651ed2f1ad41a6e4955ff4489e580637b76cf559bf8cc82027b85089d5f37b3830449df94398ec7346dcd622edc5ae82352f02be94c62d11980b864d2d0e0660000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c5990000000000000000000000000000000000000000000000000000000002f51218000000000000000000000000000000000000000000000000000000000000000026a05f066b907360fdd977a7be7b87f8abb63c026bd6a9b79961b2df31f4b05197b6a03ee77c3bb73623eaf754e19a3de2587917d5bc9fe9fd6d18d01263994a8ae482f9016b2d85089d5f37b383040b67947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe5000000000000000000000000000000000000000000000005fe80d4a5da71c8000000000000000000000000000000000000000000000000000f4d4114fc1b990700000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000d5ef38a6bfe29e37fde0e05c3b5d053d35cde31c000000000000000000000000000000000000000000000000000000005f7bf45c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000960b236a07cf122663c4303350609a66a7b288c0000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc226a077384993315e895c506addb765b6ead9aa40643cfe0e47fa9a7cbe7b68b5c26da023e3d59adf9659ebc24ac7b1c61a8d34870c1473482062dee58001e433dacffbf8ab8202e885089d5f37b38270d094c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280b844095ea7b3000000000000000000000000e2466deb9536a69bf8131ecd0c267ee41dd1cda0000000000000000000000000000000000000000000000000000000000000000026a0122be7ab3dd42a95a6f9f7afd4b53cdd96a54533355678de8e6a079c1f3a507da0184286f4fb49dc18285b01b7b881ef7219783a94e4adba214d5f846cd05bf080f8ab8202e985089d5f37b38270d094c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280b844095ea7b30000000000000000000000006f400810b62df8e13fded51be75ff5393eaa841f000000000000000000000000000000000000000000000000000000000000000026a09cad61d8896acfc385722a5bbb7cc933cf424848b3c1e5ca77d65bf05c6d6fcda074d8318b68ede0035abf2b7be4ff24b8434a14e9265539d0a7a667da017671a1f8ab8202ea85089d5f37b38270d094c02aaa39b223fe8d0a0e5c4f27ead9083c756cc280b844095ea7b30000000000000000000000003e66b66fd1d0b02fda6c811da9e0547970db2f21000000000000000000000000000000000000000000000000000000000000000026a0e6503c732760d18c807a75da58051281d667f8c4198c45ed51ca087614d5785aa01e224cb49e6837da617107107dc0ea4dfad191de3797142648bc1dde0df987faf9016d82018f85089d5f37b3830295f8947a250d5630b4cf539739df2c5dacb4c659f2488d80b9010418cbafe500000000000000000000000000000000000000000000000f068603508f9456ad0000000000000000000000000000000000000000000000000e494da22dc7c0b800000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000ffcee9c64c3cdab271f5c3c7c184b153f1344b2a000000000000000000000000000000000000000000000000000000005f7bf03d00000000000000000000000000000000000000000000000000000000000000020000000000000000000000002a7f709ee001069771ceb6d42e85035f7d18e736000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc226a0197b3da148fcee4ccbf62eb74082ef5b79384afdaf3abd2175173b404d2c6c3ba02fa9b883c18f17f6327cc8de85764d2b59b3dc3e8b5359a225585e719067c0fdf8ab82069a850826299e0082a95994b4e16d0168e52d35cacd2c6185b44281ec28c9dc80b844095ea7b3000000000000000000000000fab1eab539d2cf50162245e59ddea174a301d85d000000000000000000000000000000000000000000000000000000000000000026a04919640cc96cbb20a3fb12871737fbd812a1f8c812f852db7abfbec889c04a20a04c6f5c296e8c2628537c559d76ad3b750cf068b689e6021dc17691bb846d6d5bf86b1b8507ea8ed9b38252089409f72bc14a0901c3d8127dc3b64971187900a66987470de4df8200008025a0ef0162ddd727191632140402fcd1d3d3e05cc0386eb5700c71b12d85a1732176a02958d5b3f7e4c9a555a172c6b4921cc568708ea8138c26bd1445036fbbaef2eff86b078507ea8ed9b38252089437434a338fdcff98e8ae3c07e3ce6bfae701a47d87ce0eb154f900008026a0d38057dbe925e7517a9321248cdce4a91aef0caac2a28b275909ba1e9b365312a01b1f4727a4a644c733b7fc975dd3791d4931d1e210ad8423415a8d3a4ec85b41f86c038507b4e9eb00825208941bb95bd09a9463a9fb0874cc9305744eed1965368815957b01e7cdcf5b801ba06a8e9d014dd495c9d5c98b8e7d71e3d170e2fe4b83752d219f8bf794c8c9f2eda023dd8b8cb5491984b639e0855817d71dca426e1ac25053e2156d5f95042b86f4c0" -) - -/* -0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 -0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 -0x4d5e647b2d8d3a3c8c1561ebb88734bc5fc3c2941016f810cf218738c0ecd99e - ,BranchPageN,LeafPageN,OverflowN,Entries -b,4085,326718,0,11635055 -eth_tx,212580,47829931,6132023,969755142 -*/ - -var ( - HeadersPostProcessingStage = stages.SyncStage("post processing") - Snapshot11kkTD = []byte{138, 3, 199, 118, 5, 203, 95, 162, 81, 64, 161} -) - -func PostProcessing(db kv.RwDB, downloadedSnapshots map[SnapshotType]*SnapshotsInfo) error { - if _, ok := downloadedSnapshots[SnapshotType_headers]; ok { - if err := db.Update(context.Background(), func(tx kv.RwTx) error { - return GenerateHeaderIndexes(context.Background(), tx) - }); err != nil { - return err - } - } - if _, ok := downloadedSnapshots[SnapshotType_state]; ok { - if err := db.Update(context.Background(), func(tx kv.RwTx) error { - return PostProcessState(tx, downloadedSnapshots[SnapshotType_state]) - }); err != nil { - return err - } - } - - if _, ok := downloadedSnapshots[SnapshotType_bodies]; ok { - if err := db.Update(context.Background(), func(tx kv.RwTx) error { - return PostProcessBodies(tx) - }); err != nil { - return err - } - } - - return nil -} - -func PostProcessBodies(tx kv.RwTx) error { - v, err := stages.GetStageProgress(tx, stages.Bodies) - if err != nil { - return err - } - - if v > 0 { - return nil - } - err = tx.ClearBucket(kv.TxLookup) - if err != nil { - return err - } - - ethTxC, err := tx.Cursor(kv.EthTx) - if err != nil { - return err - } - k, _, err := ethTxC.Last() - if err != nil { - return err - } - if len(k) != 8 { - return errors.New("incorrect transaction id in body snapshot") - } - secKey := make([]byte, 8) - binary.BigEndian.PutUint64(secKey, binary.BigEndian.Uint64(k)+1) - err = tx.Put(kv.Sequence, []byte(kv.EthTx), secKey) - if err != nil { - return err - } - - bodyC, err := tx.Cursor(kv.BlockBody) - if err != nil { - return err - } - k, body, err := bodyC.Last() - if err != nil { - return err - } - - if body == nil { - return fmt.Errorf("empty body for key %s", common.Bytes2Hex(k)) - } - - number := binary.BigEndian.Uint64(k[:8]) - err = stages.SaveStageProgress(tx, stages.Bodies, number) - if err != nil { - return err - } - return tx.Commit() -} - -func PostProcessState(db kv.RwTx, info *SnapshotsInfo) error { - v, err := stages.GetStageProgress(db, stages.Execution) - if err != nil { - return err - } - - if v > 0 { - return nil - } - // clear genesis state - if err = db.ClearBucket(kv.PlainState); err != nil { - return err - } - if err = db.ClearBucket(kv.EthTx); err != nil { - return err - } - err = stages.SaveStageProgress(db, stages.Execution, info.SnapshotBlock) - if err != nil { - return err - } - err = stages.SaveStageProgress(db, stages.Senders, info.SnapshotBlock) - if err != nil { - return err - } - return nil -} - -//It'll be enabled later -func PostProcessNoBlocksSync(db ethdb.Database, blockNum uint64, blockHash common.Hash, blockHeaderBytes, blockBodyBytes []byte) error { - v, err := stages.GetStageProgress(db, stages.Execution) - if err != nil { - return err - } - - if v > 0 { - return nil - } - log.Info("PostProcessNoBlocksSync", "blocknum", blockNum, "hash", blockHash.String()) - - tx, err := db.(ethdb.HasRwKV).RwKV().BeginRw(context.Background()) - if err != nil { - return err - } - defer tx.Rollback() - - //add header - err = tx.Put(kv.Headers, dbutils.HeaderKey(SnapshotBlock, blockHash), blockHeaderBytes) - if err != nil { - return err - } - //add canonical - err = tx.Put(kv.HeaderCanonical, dbutils.EncodeBlockNumber(SnapshotBlock), blockHash.Bytes()) - if err != nil { - return err - } - body := new(types.Body) - err = rlp.DecodeBytes(blockBodyBytes, body) - if err != nil { - return err - } - err = rawdb.WriteBody(tx, blockHash, SnapshotBlock, body) - if err != nil { - return err - } - - err = tx.Put(kv.HeaderNumber, blockHash.Bytes(), dbutils.EncodeBlockNumber(SnapshotBlock)) - if err != nil { - return err - } - b, err := rlp.EncodeToBytes(big.NewInt(0).SetBytes(Snapshot11kkTD)) - if err != nil { - return err - } - err = tx.Put(kv.HeaderTD, dbutils.HeaderKey(SnapshotBlock, blockHash), b) - if err != nil { - return err - } - - err = tx.Put(kv.HeadHeaderKey, []byte(kv.HeadHeaderKey), blockHash.Bytes()) - if err != nil { - return err - } - - err = tx.Put(kv.HeadBlockKey, []byte(kv.HeadBlockKey), blockHash.Bytes()) - if err != nil { - return err - } - - err = stages.SaveStageProgress(tx, stages.Headers, blockNum) - if err != nil { - return err - } - err = stages.SaveStageProgress(tx, stages.Bodies, blockNum) - if err != nil { - return err - } - err = stages.SaveStageProgress(tx, stages.BlockHashes, blockNum) - if err != nil { - return err - } - err = stages.SaveStageProgress(tx, stages.Senders, blockNum) - if err != nil { - return err - } - err = stages.SaveStageProgress(tx, stages.Execution, blockNum) - if err != nil { - return err - } - return tx.Commit() -} - -func generateHeaderHashToNumberIndex(ctx context.Context, tx kv.RwTx) error { - c, err := tx.Cursor(kv.Headers) - if err != nil { - return err - } - log.Info("Generate headers hash to number index") - lastHeader, _, innerErr := c.Last() - if innerErr != nil { - return innerErr - } - c.Close() - - headNumberBytes := lastHeader[:8] - headHashBytes := lastHeader[8:] - - headNumber := big.NewInt(0).SetBytes(headNumberBytes).Uint64() - headHash := common.BytesToHash(headHashBytes) - - return etl.Transform("Torrent post-processing 1", tx, kv.Headers, kv.HeaderNumber, os.TempDir(), func(k []byte, v []byte, next etl.ExtractNextFunc) error { - return next(k, common.CopyBytes(k[8:]), common.CopyBytes(k[:8])) - }, etl.IdentityLoadFunc, etl.TransformArgs{ - Quit: ctx.Done(), - ExtractEndKey: dbutils.HeaderKey(headNumber, headHash), - }) -} - -func generateHeaderTDAndCanonicalIndexes(ctx context.Context, tx kv.RwTx) error { - var hash common.Hash - var number uint64 - var err error - - h := rawdb.ReadHeaderByNumber(tx, 0) - td := h.Difficulty - - log.Info("Generate TD index & canonical") - err = etl.Transform("Torrent post-processing 2", tx, kv.Headers, kv.HeaderTD, os.TempDir(), func(k []byte, v []byte, next etl.ExtractNextFunc) error { - header := &types.Header{} - innerErr := rlp.DecodeBytes(v, header) - if innerErr != nil { - return innerErr - } - number = header.Number.Uint64() - hash = header.Hash() - td = td.Add(td, header.Difficulty) - tdBytes, innerErr := rlp.EncodeToBytes(td) - if innerErr != nil { - return innerErr - } - - return next(k, dbutils.HeaderKey(header.Number.Uint64(), header.Hash()), tdBytes) - }, etl.IdentityLoadFunc, etl.TransformArgs{ - Quit: ctx.Done(), - }) - if err != nil { - return err - } - log.Info("Generate TD index & canonical") - err = etl.Transform("Torrent post-processing 2", tx, kv.Headers, kv.HeaderCanonical, os.TempDir(), func(k []byte, v []byte, next etl.ExtractNextFunc) error { - return next(k, common.CopyBytes(k[:8]), common.CopyBytes(k[8:])) - }, etl.IdentityLoadFunc, etl.TransformArgs{ - Quit: ctx.Done(), - }) - if err != nil { - return err - } - rawdb.WriteHeadHeaderHash(tx, hash) - rawdb.WriteHeaderNumber(tx, hash, number) - err = stages.SaveStageProgress(tx, stages.Headers, number) - if err != nil { - return err - } - err = stages.SaveStageProgress(tx, stages.BlockHashes, number) - if err != nil { - return err - } - rawdb.WriteHeadBlockHash(tx, hash) - log.Info("Last processed block", "num", number, "hash", hash.String()) - return nil -} - -func GenerateHeaderIndexes(ctx context.Context, tx kv.RwTx) error { - v, err1 := stages.GetStageProgress(tx, HeadersPostProcessingStage) - if err1 != nil { - return err1 - } - - if v == 0 { - if err := generateHeaderHashToNumberIndex(ctx, tx); err != nil { - return err - } - if err := generateHeaderTDAndCanonicalIndexes(ctx, tx); err != nil { - return err - } - if err := stages.SaveStageProgress(tx, HeadersPostProcessingStage, 1); err != nil { - return err1 - } - - return nil - } - return nil -} diff --git a/turbo/snapshotsync/postprocessing_test.go b/turbo/snapshotsync/postprocessing_test.go deleted file mode 100644 index 2227323030d..00000000000 --- a/turbo/snapshotsync/postprocessing_test.go +++ /dev/null @@ -1,107 +0,0 @@ -package snapshotsync - -import ( - "context" - "math/big" - "os" - "testing" - - "github.com/ledgerwatch/erigon-lib/kv" - mdbx2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" - "github.com/stretchr/testify/require" - "github.com/torquem-ch/mdbx-go/mdbx" -) - -func TestHeadersGenerateIndex(t *testing.T) { - snPath := t.TempDir() - snKV := mdbx2.NewMDBX(log.New()).Path(snPath).MustOpen() - defer os.RemoveAll(snPath) - headers := generateHeaders(10) - err := snKV.Update(context.Background(), func(tx kv.RwTx) error { - for _, header := range headers { - headerBytes, innerErr := rlp.EncodeToBytes(header) - if innerErr != nil { - panic(innerErr) - } - innerErr = tx.Put(kv.Headers, dbutils.HeaderKey(header.Number.Uint64(), header.Hash()), headerBytes) - if innerErr != nil { - panic(innerErr) - } - } - return nil - }) - if err != nil { - t.Fatal(err) - } - snKV.Close() - - db := mdbx2.NewMDBX(log.New()).InMem().WithTablessCfg(mdbx2.WithChaindataTables).MustOpen() - defer db.Close() - //we need genesis - if err := db.Update(context.Background(), func(tx kv.RwTx) error { - return rawdb.WriteCanonicalHash(tx, headers[0].Hash(), headers[0].Number.Uint64()) - - }); err != nil { - t.Fatal(err) - } - - snKV = mdbx2.NewMDBX(log.New()).Path(snPath).Flags(func(flags uint) uint { return flags | mdbx.Readonly }).WithTablessCfg(mdbx2.WithChaindataTables).MustOpen() - defer snKV.Close() - - snKV = snapshotdb.NewSnapshotKV().HeadersSnapshot(snKV).DB(db).Open() - snTx, err := snKV.BeginRw(context.Background()) - require.NoError(t, err) - defer snTx.Rollback() - - err = GenerateHeaderIndexes(context.Background(), snTx) - if err != nil { - t.Fatal(err) - } - td := big.NewInt(0) - for i, header := range headers { - td = td.Add(td, header.Difficulty) - canonical, err1 := rawdb.ReadCanonicalHash(snTx, header.Number.Uint64()) - if err1 != nil { - t.Errorf("reading canonical hash for block %d: %v", header.Number.Uint64(), err1) - } - if canonical != header.Hash() { - t.Error(i, "canonical not correct", canonical) - } - - hasHeader := rawdb.HasHeader(snTx, header.Hash(), header.Number.Uint64()) - if !hasHeader { - t.Error(i, header.Hash(), header.Number.Uint64(), "not exists") - } - headerNumber := rawdb.ReadHeaderNumber(snTx, header.Hash()) - if headerNumber == nil { - t.Error(i, "empty header number") - } else if *headerNumber != header.Number.Uint64() { - t.Error(i, header.Hash(), header.Number.Uint64(), "header number incorrect") - } - if td == nil { - t.Error(i, "empty td") - } else { - td, err := rawdb.ReadTd(snTx, header.Hash(), header.Number.Uint64()) - if err != nil { - panic(err) - } - if td.Cmp(td) != 0 { - t.Error(i, header.Hash(), header.Number.Uint64(), "td incorrect") - } - } - } -} - -func generateHeaders(n int) []types.Header { - headers := make([]types.Header, n) - for i := uint64(0); i < uint64(n); i++ { - headers[i] = types.Header{Difficulty: new(big.Int).SetUint64(i), Number: new(big.Int).SetUint64(i)} - } - return headers -} diff --git a/turbo/snapshotsync/server.go b/turbo/snapshotsync/server.go deleted file mode 100644 index 9aecdd09f32..00000000000 --- a/turbo/snapshotsync/server.go +++ /dev/null @@ -1,94 +0,0 @@ -package snapshotsync - -import ( - "context" - "errors" - "fmt" - - "github.com/anacrolix/torrent" - "github.com/golang/protobuf/ptypes/empty" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" -) - -var ( - ErrNotSupportedNetworkID = errors.New("not supported network id") - ErrNotSupportedSnapshot = errors.New("not supported snapshot for this network id") -) -var ( - _ DownloaderServer = &SNDownloaderServer{} -) - -func NewServer(dir string, seeding bool) (*SNDownloaderServer, error) { - db := mdbx.MustOpen(dir + "/db") - sn := &SNDownloaderServer{ - db: db, - } - if err := db.Update(context.Background(), func(tx kv.RwTx) error { - peerID, err := tx.GetOne(kv.BittorrentInfo, []byte(kv.BittorrentPeerID)) - if err != nil { - return fmt.Errorf("get peer id: %w", err) - } - sn.t, err = New(dir, seeding, string(peerID)) - if err != nil { - return err - } - if len(peerID) == 0 { - err = sn.t.SavePeerID(tx) - if err != nil { - return fmt.Errorf("save peer id: %w", err) - } - } - return nil - }); err != nil { - return nil, err - } - - return sn, nil -} - -type SNDownloaderServer struct { - DownloaderServer - t *Client - db kv.RwDB -} - -func (s *SNDownloaderServer) Download(ctx context.Context, request *DownloadSnapshotRequest) (*empty.Empty, error) { - if err := s.db.Update(ctx, func(tx kv.RwTx) error { - return s.t.AddSnapshotsTorrents(ctx, tx, request.NetworkId, FromSnapshotTypes(request.Type)) - }); err != nil { - return nil, err - } - return &empty.Empty{}, nil -} -func (s *SNDownloaderServer) Load() error { - return s.db.View(context.Background(), func(tx kv.Tx) error { - return s.t.Load(tx) - }) -} - -func (s *SNDownloaderServer) Snapshots(ctx context.Context, request *SnapshotsRequest) (*SnapshotsInfoReply, error) { - reply := SnapshotsInfoReply{} - tx, err := s.db.BeginRo(ctx) - if err != nil { - return nil, err - } - defer tx.Rollback() - resp, err := s.t.GetSnapshots(tx, request.NetworkId) - if err != nil { - return nil, err - } - for i := range resp { - reply.Info = append(reply.Info, resp[i]) - } - return &reply, nil -} - -func (s *SNDownloaderServer) Stats(ctx context.Context) map[string]torrent.TorrentStats { - stats := map[string]torrent.TorrentStats{} - torrents := s.t.Cli.Torrents() - for _, t := range torrents { - stats[t.Name()] = t.Stats() - } - return stats -} diff --git a/turbo/snapshotsync/snap/files.go b/turbo/snapshotsync/snap/files.go new file mode 100644 index 00000000000..0e1ee2e7d03 --- /dev/null +++ b/turbo/snapshotsync/snap/files.go @@ -0,0 +1,210 @@ +package snap + +import ( + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + "strconv" + "strings" + + "golang.org/x/exp/slices" +) + +type Type int + +const ( + Headers Type = iota + Bodies + Transactions + NumberOfTypes +) + +func (ft Type) String() string { + switch ft { + case Headers: + return "headers" + case Bodies: + return "bodies" + case Transactions: + return "transactions" + default: + panic(fmt.Sprintf("unknown file type: %d", ft)) + } +} + +func ParseFileType(s string) (Type, bool) { + switch s { + case "headers": + return Headers, true + case "bodies": + return Bodies, true + case "transactions": + return Transactions, true + default: + return NumberOfTypes, false + } +} + +type IdxType string + +const ( + Transactions2Block IdxType = "transactions-to-block" +) + +func (it IdxType) String() string { return string(it) } + +var AllSnapshotTypes = []Type{Headers, Bodies, Transactions} + +var ( + ErrInvalidFileName = fmt.Errorf("invalid compressed file name") +) + +func FileName(from, to uint64, fileType string) string { + return fmt.Sprintf("v1-%06d-%06d-%s", from/1_000, to/1_000, fileType) +} +func SegmentFileName(from, to uint64, t Type) string { return FileName(from, to, t.String()) + ".seg" } +func DatFileName(from, to uint64, fType string) string { return FileName(from, to, fType) + ".dat" } +func IdxFileName(from, to uint64, fType string) string { return FileName(from, to, fType) + ".idx" } + +func FilterExt(in []FileInfo, expectExt string) (out []FileInfo) { + for _, f := range in { + if f.Ext != expectExt { // filter out only compressed files + continue + } + out = append(out, f) + } + return out +} +func FilesWithExt(dir, expectExt string) ([]FileInfo, error) { + files, err := ParseDir(dir) + if err != nil { + return nil, err + } + return FilterExt(files, expectExt), nil +} + +func IsCorrectFileName(name string) bool { + parts := strings.Split(name, "-") + return len(parts) == 4 && parts[3] != "v1" +} + +func ParseFileName(dir, fileName string) (res FileInfo, err error) { + ext := filepath.Ext(fileName) + onlyName := fileName[:len(fileName)-len(ext)] + parts := strings.Split(onlyName, "-") + if len(parts) < 4 { + return res, fmt.Errorf("expected format: v1-001500-002000-bodies.seg got: %s. %w", fileName, ErrInvalidFileName) + } + if parts[0] != "v1" { + return res, fmt.Errorf("version: %s. %w", parts[0], ErrInvalidFileName) + } + from, err := strconv.ParseUint(parts[1], 10, 64) + if err != nil { + return + } + to, err := strconv.ParseUint(parts[2], 10, 64) + if err != nil { + return + } + var snapshotType Type + ft, ok := ParseFileType(parts[3]) + if !ok { + return res, fmt.Errorf("unexpected snapshot suffix: %s,%w", parts[2], ErrInvalidFileName) + } + switch ft { + case Headers: + snapshotType = Headers + case Bodies: + snapshotType = Bodies + case Transactions: + snapshotType = Transactions + default: + return res, fmt.Errorf("unexpected snapshot suffix: %s,%w", parts[2], ErrInvalidFileName) + } + return FileInfo{From: from * 1_000, To: to * 1_000, Path: filepath.Join(dir, fileName), T: snapshotType, Ext: ext}, nil +} + +const MERGE_THRESHOLD = 2 // don't trigger merge if have too small amount of partial segments +const DEFAULT_SEGMENT_SIZE = 500_000 +const MIN_SEGMENT_SIZE = 1_000 + +// FileInfo - parsed file metadata +type FileInfo struct { + _ fs.FileInfo + Version uint8 + From, To uint64 + Path, Ext string + T Type +} + +func IdxFiles(dir string) (res []FileInfo, err error) { return FilesWithExt(dir, ".idx") } +func Segments(dir string) (res []FileInfo, err error) { return FilesWithExt(dir, ".seg") } +func TmpFiles(dir string) (res []string, err error) { + files, err := os.ReadDir(dir) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return []string{}, nil + } + return nil, err + } + for _, f := range files { + if f.IsDir() || len(f.Name()) < 3 { + continue + } + if filepath.Ext(f.Name()) != ".tmp" { + continue + } + res = append(res, filepath.Join(dir, f.Name())) + } + return res, nil +} + +var ErrSnapshotMissed = fmt.Errorf("snapshot missed") + +// ParseDir - reading dir ( +func ParseDir(dir string) (res []FileInfo, err error) { + files, err := os.ReadDir(dir) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return []FileInfo{}, nil + } + return nil, err + } + for _, f := range files { + fileInfo, err := f.Info() + if err != nil { + return nil, err + } + if f.IsDir() || fileInfo.Size() == 0 || len(f.Name()) < 3 { + continue + } + + meta, err := ParseFileName(dir, f.Name()) + if err != nil { + if errors.Is(err, ErrInvalidFileName) { + continue + } + return nil, err + } + res = append(res, meta) + } + slices.SortFunc(res, func(i, j FileInfo) bool { + if i.Version != j.Version { + return i.Version < j.Version + } + if i.From != j.From { + return i.From < j.From + } + if i.To != j.To { + return i.To < j.To + } + if i.T != j.T { + return i.T < j.T + } + return i.Ext < j.Ext + }) + + return res, nil +} diff --git a/turbo/snapshotsync/snap/flags.go b/turbo/snapshotsync/snap/flags.go new file mode 100644 index 00000000000..e65a279ce9e --- /dev/null +++ b/turbo/snapshotsync/snap/flags.go @@ -0,0 +1,39 @@ +package snap + +import ( + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/eth/ethconfig" +) + +var ( + blockSnapshotEnabledKey = []byte("blocksSnapshotEnabled") +) + +func Enabled(tx kv.Getter) (bool, error) { + return kv.GetBool(tx, kv.DatabaseInfo, blockSnapshotEnabledKey) +} + +func EnsureNotChanged(tx kv.GetPut, cfg ethconfig.Snapshot) (bool, bool, error) { + ok, v, err := kv.EnsureNotChangedBool(tx, kv.DatabaseInfo, blockSnapshotEnabledKey, cfg.Enabled) + if err != nil { + return false, false, err + } + if !ok { + return false, v, nil + } + return true, false, nil +} + +// ForceSetFlags - if you know what you are doing +func ForceSetFlags(tx kv.GetPut, cfg ethconfig.Snapshot) error { + if cfg.Enabled { + if err := tx.Put(kv.DatabaseInfo, blockSnapshotEnabledKey, []byte{1}); err != nil { + return err + } + } else { + if err := tx.Put(kv.DatabaseInfo, blockSnapshotEnabledKey, []byte{0}); err != nil { + return err + } + } + return nil +} diff --git a/turbo/snapshotsync/snapshot_builder.go b/turbo/snapshotsync/snapshot_builder.go deleted file mode 100644 index b63c7464fe0..00000000000 --- a/turbo/snapshotsync/snapshot_builder.go +++ /dev/null @@ -1,390 +0,0 @@ -package snapshotsync - -import ( - "context" - "encoding/binary" - "errors" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "strings" - "sync/atomic" - "time" - - "github.com/anacrolix/torrent/metainfo" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/erigon/params" - "github.com/ledgerwatch/log/v3" -) - -func NewMigrator(snapshotDir string, currentSnapshotBlock uint64, currentSnapshotInfohash []byte) *SnapshotMigrator { - return &SnapshotMigrator{ - snapshotsDir: snapshotDir, - HeadersCurrentSnapshot: currentSnapshotBlock, - HeadersNewSnapshotInfohash: currentSnapshotInfohash, - replaceChan: make(chan struct{}), - } -} - -type SnapshotMigrator struct { - snapshotsDir string - HeadersCurrentSnapshot uint64 - HeadersNewSnapshot uint64 - BodiesCurrentSnapshot uint64 - BodiesNewSnapshot uint64 - HeadersNewSnapshotInfohash []byte - BodiesNewSnapshotInfohash []byte - snapshotType string - started uint64 - replaceChan chan struct{} - replaced uint64 -} - -func (sm *SnapshotMigrator) AsyncStages(migrateToBlock uint64, logger log.Logger, dbi kv.RwDB, rwTX kv.Tx, bittorrent *Client, async bool) error { - if atomic.LoadUint64(&sm.started) > 0 { - return nil - } - - var snapshotName string - var snapshotHashKey []byte - if sm.HeadersCurrentSnapshot < migrateToBlock && atomic.LoadUint64(&sm.HeadersNewSnapshot) < migrateToBlock { - snapshotName = "headers" - snapshotHashKey = kv.CurrentHeadersSnapshotHash - } else if sm.BodiesCurrentSnapshot < migrateToBlock && atomic.LoadUint64(&sm.BodiesNewSnapshot) < migrateToBlock { - snapshotName = "bodies" - snapshotHashKey = kv.CurrentBodiesSnapshotHash - } else { - return nil - } - atomic.StoreUint64(&sm.started, 1) - sm.snapshotType = snapshotName - snapshotPath := SnapshotName(sm.snapshotsDir, sm.snapshotType, migrateToBlock) - switch sm.snapshotType { - case "headers": - sm.HeadersNewSnapshot = migrateToBlock - case "bodies": - sm.BodiesNewSnapshot = migrateToBlock - } - atomic.StoreUint64(&sm.replaced, 0) - - var initialStages []func(db kv.RoDB, tx kv.Tx, toBlock uint64) error - switch sm.snapshotType { - case "headers": - initialStages = []func(db kv.RoDB, tx kv.Tx, toBlock uint64) error{ - func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - return CreateHeadersSnapshot(context.Background(), tx, toBlock, snapshotPath) - }, - func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - //replace snapshot - if _, ok := db.(snapshotdb.SnapshotUpdater); !ok { - return errors.New("db don't implement snapshotUpdater interface") - } - snapshotKV, err := OpenHeadersSnapshot(snapshotPath) - if err != nil { - return err - } - - db.(snapshotdb.SnapshotUpdater).UpdateSnapshots("headers", snapshotKV, sm.replaceChan) - return nil - }, - } - case "bodies": - initialStages = []func(db kv.RoDB, tx kv.Tx, toBlock uint64) error{ - func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - return CreateBodySnapshot(tx, logger, toBlock, snapshotPath) - }, - func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - //replace snapshot - if _, ok := db.(snapshotdb.SnapshotUpdater); !ok { - return errors.New("db don't implement snapshotUpdater interface") - } - snapshotKV, err := OpenBodiesSnapshot(logger, snapshotPath) - if err != nil { - return err - } - - db.(snapshotdb.SnapshotUpdater).UpdateSnapshots("bodies", snapshotKV, sm.replaceChan) - return nil - }, - } - } - - btStages := func(shapshotHashKey []byte) []func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - return []func(db kv.RoDB, tx kv.Tx, toBlock uint64) error{ - func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - //todo headers infohash - var infohash []byte - var err error - infohash, err = tx.GetOne(kv.BittorrentInfo, shapshotHashKey) - if err != nil && !errors.Is(err, ethdb.ErrKeyNotFound) { - log.Error("Get infohash", "err", err, "block", toBlock) - return err - } - - if len(infohash) == 20 { - var hash metainfo.Hash - copy(hash[:], infohash) - log.Info("Stop seeding snapshot", "type", snapshotName, "infohash", hash.String()) - err = bittorrent.StopSeeding(hash) - if err != nil { - log.Error("Stop seeding", "err", err, "block", toBlock) - return err - } - log.Info("Stopped seeding snapshot", "type", snapshotName, "infohash", hash.String()) - } else { - log.Warn("Hasn't stopped snapshot", "infohash", common.Bytes2Hex(infohash)) - } - return nil - }, - func(db kv.RoDB, tx kv.Tx, toBlock uint64) error { - log.Info("Start seeding snapshot", "type", snapshotName) - seedingInfoHash, err := bittorrent.SeedSnapshot(snapshotName, snapshotPath) - if err != nil { - log.Error("Seeding", "err", err) - return err - } - - switch snapshotName { - case "bodies": - sm.BodiesNewSnapshotInfohash = seedingInfoHash[:] - case "headers": - sm.HeadersNewSnapshotInfohash = seedingInfoHash[:] - } - - log.Info("Started seeding snapshot", "type", snapshotName, "infohash", seedingInfoHash.String()) - atomic.StoreUint64(&sm.started, 2) - return nil - }, - } - } - - stages := append(initialStages, btStages(snapshotHashKey)...) - - startStages := func(tx kv.Tx) (innerErr error) { - defer func() { - if innerErr != nil { - atomic.StoreUint64(&sm.started, 0) - switch snapshotName { - case "headers": - atomic.StoreUint64(&sm.HeadersNewSnapshot, atomic.LoadUint64(&sm.HeadersCurrentSnapshot)) - case "bodies": - atomic.StoreUint64(&sm.BodiesNewSnapshot, atomic.LoadUint64(&sm.BodiesCurrentSnapshot)) - } - - log.Error("Error on stage. Rollback", "type", snapshotName, "err", innerErr) - } - }() - for i := range stages { - log.Info("ID", "i", i) - innerErr = stages[i](dbi, tx, migrateToBlock) - if innerErr != nil { - return innerErr - } - } - return nil - } - if async { - go func() { - //@todo think about possibility that write tx has uncommited data that we don't have in readTXs - defer debug.LogPanic() - readTX, err := dbi.BeginRo(context.Background()) - if err != nil { - log.Error("begin", "err", err) - return - } - defer readTX.Rollback() - - innerErr := startStages(readTX) - if innerErr != nil { - log.Error("Async stages", "err", innerErr) - return - } - }() - } else { - return startStages(rwTX) - } - return nil -} - -func (sm *SnapshotMigrator) Replaced() bool { - select { - case <-sm.replaceChan: - log.Info("Snapshot replaced") - atomic.StoreUint64(&sm.replaced, 1) - default: - } - - return atomic.LoadUint64(&sm.replaced) == 1 -} - -func (sm *SnapshotMigrator) SyncStages(migrateToBlock uint64, dbi kv.RwDB, rwTX kv.RwTx) error { - log.Info("SyncStages", "started", atomic.LoadUint64(&sm.started)) - - if atomic.LoadUint64(&sm.started) == 2 && sm.Replaced() { - var syncStages []func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error - switch sm.snapshotType { - case "bodies": - syncStages = []func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error{ - func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error { - log.Info("Prune db", "new", atomic.LoadUint64(&sm.BodiesNewSnapshot)) - return RemoveBlocksData(db, tx, atomic.LoadUint64(&sm.BodiesNewSnapshot)) - }, - func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error { - log.Info("Save bodies snapshot", "new", common.Bytes2Hex(sm.HeadersNewSnapshotInfohash), "new", atomic.LoadUint64(&sm.HeadersNewSnapshot)) - c, err := tx.RwCursor(kv.BittorrentInfo) - if err != nil { - return err - } - if len(sm.BodiesNewSnapshotInfohash) == 20 { - err = c.Put(kv.CurrentBodiesSnapshotHash, sm.BodiesNewSnapshotInfohash) - if err != nil { - return err - } - } - return c.Put(kv.CurrentBodiesSnapshotBlock, dbutils.EncodeBlockNumber(atomic.LoadUint64(&sm.BodiesNewSnapshot))) - }, - } - case "headers": - syncStages = []func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error{ - func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error { - log.Info("Prune headers db", "current", sm.HeadersCurrentSnapshot, "new", atomic.LoadUint64(&sm.HeadersNewSnapshot)) - return RemoveHeadersData(db, tx, sm.HeadersCurrentSnapshot, atomic.LoadUint64(&sm.HeadersNewSnapshot)) - }, - func(db kv.RoDB, tx kv.RwTx, toBlock uint64) error { - log.Info("Save headers snapshot", "new", common.Bytes2Hex(sm.HeadersNewSnapshotInfohash), "new", atomic.LoadUint64(&sm.HeadersNewSnapshot)) - c, err := tx.RwCursor(kv.BittorrentInfo) - if err != nil { - return err - } - if len(sm.HeadersNewSnapshotInfohash) == 20 { - err = c.Put(kv.CurrentHeadersSnapshotHash, sm.HeadersNewSnapshotInfohash) - if err != nil { - return err - } - } - return c.Put(kv.CurrentHeadersSnapshotBlock, dbutils.EncodeBlockNumber(atomic.LoadUint64(&sm.HeadersNewSnapshot))) - }, - } - } - - for i := range syncStages { - innerErr := syncStages[i](dbi, rwTX, migrateToBlock) - if innerErr != nil { - return innerErr - } - } - atomic.StoreUint64(&sm.started, 3) - - } - return nil -} - -func (sm *SnapshotMigrator) Final(tx kv.Tx) error { - if atomic.LoadUint64(&sm.started) < 3 { - return nil - } - - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if errors.Is(err, ethdb.ErrKeyNotFound) { - return nil - } - if err != nil { - return err - } - - if len(v) != 8 { - log.Error("Incorrect length", "ln", len(v)) - return nil - } - - if sm.HeadersCurrentSnapshot < atomic.LoadUint64(&sm.HeadersNewSnapshot) && sm.HeadersCurrentSnapshot != 0 { - oldSnapshotPath := SnapshotName(sm.snapshotsDir, "headers", sm.HeadersCurrentSnapshot) - log.Info("Removing old snapshot", "path", oldSnapshotPath) - tt := time.Now() - err = os.RemoveAll(oldSnapshotPath) - if err != nil { - log.Error("Remove snapshot", "err", err) - return err - } - log.Info("Removed old snapshot", "path", oldSnapshotPath, "t", time.Since(tt)) - } - - if binary.BigEndian.Uint64(v) == atomic.LoadUint64(&sm.HeadersNewSnapshot) { - atomic.StoreUint64(&sm.HeadersCurrentSnapshot, sm.HeadersNewSnapshot) - atomic.StoreUint64(&sm.started, 0) - atomic.StoreUint64(&sm.replaced, 0) - log.Info("CurrentHeadersSnapshotBlock commited", "block", binary.BigEndian.Uint64(v)) - return nil - } - return nil -} - -func (sm *SnapshotMigrator) RemoveNonCurrentSnapshots() error { - files, err := ioutil.ReadDir(sm.snapshotsDir) - if err != nil { - return err - } - - for i := range files { - snapshotName := files[i].Name() - if files[i].IsDir() && strings.HasPrefix(snapshotName, "headers") { - snapshotBlock, innerErr := strconv.ParseUint(strings.TrimPrefix(snapshotName, "headers"), 10, 64) - if innerErr != nil { - log.Warn("unknown snapshot", "name", snapshotName, "err", innerErr) - continue - } - if snapshotBlock != sm.HeadersCurrentSnapshot { - snapshotPath := filepath.Join(sm.snapshotsDir, snapshotName) - innerErr = os.RemoveAll(snapshotPath) - if innerErr != nil { - log.Warn("useless snapshot has't removed", "path", snapshotPath, "err", innerErr) - } - log.Info("removed useless snapshot", "path", snapshotPath) - } - } - } - return nil -} - -//CalculateEpoch - returns latest available snapshot block that possible to create. -func CalculateEpoch(block, epochSize uint64) uint64 { - return block - (block+params.FullImmutabilityThreshold)%epochSize -} - -func SnapshotName(baseDir, name string, blockNum uint64) string { - return filepath.Join(baseDir, name) + strconv.FormatUint(blockNum, 10) -} - -func GetSnapshotInfo(db kv.RwDB) (uint64, []byte, error) { - tx, err := db.BeginRo(context.Background()) - if err != nil { - return 0, nil, err - } - defer tx.Rollback() - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil { - return 0, nil, err - } - if v == nil { - return 0, nil, err - } - var snapshotBlock uint64 - if len(v) == 8 { - snapshotBlock = binary.BigEndian.Uint64(v) - } - - infohash, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotHash) - if err != nil { - return 0, nil, err - } - if infohash == nil { - return 0, nil, err - } - return snapshotBlock, infohash, nil -} diff --git a/turbo/snapshotsync/snapshot_builder_test.go b/turbo/snapshotsync/snapshot_builder_test.go deleted file mode 100644 index 9911ef903f8..00000000000 --- a/turbo/snapshotsync/snapshot_builder_test.go +++ /dev/null @@ -1,1497 +0,0 @@ -package snapshotsync - -import ( - "bytes" - "context" - "encoding/binary" - "errors" - "fmt" - "math" - "math/big" - "os" - "path/filepath" - "runtime" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/holiman/uint256" - "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/dbutils" - "github.com/ledgerwatch/erigon/core/rawdb" - "github.com/ledgerwatch/erigon/core/types" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" - "github.com/stretchr/testify/require" -) - -//Testcase plan -//Step 1. Generate headers from 0 to 11. -//Step 2. Run in a separate goroutine snapshot with epoch 10 blocks. -//Step 3. Wait until the snapshot builder passes the first cycle. It must generate a new snapshot and remove duplicate data from -//the main database. After it we must check that headers from 0 to 10 is in snapshot and headers 11 is in the main DB. -//Step 4. Begin new Ro tx and generate data from 11 to 20. Snapshot migration must be blocked by Ro tx on the replace snapshot stage. -//After 3 seconds, we rollback Ro tx, and migration must continue without any errors. -// Step 5. We need to check that the new snapshot contains headers from 0 to 20, the headers bucket in the main database is empty, -// it started seeding a new snapshot and removed the old one. -func TestSnapshotMigratorStageAsync(t *testing.T) { - t.Skip("often fails on CI") - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") // after remove ChainReader from consensus engine - this test can be changed to create less databases, then can enable on win. now timeout after 20min - } - //log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) - logger := log.New() - var err error - dir := t.TempDir() - - defer func() { - if err != nil { - t.Log(err, dir) - } - err = os.RemoveAll(dir) - if err != nil { - t.Log(err) - } - - }() - snapshotsDir := filepath.Join(dir, "snapshots") - err = os.Mkdir(snapshotsDir, os.ModePerm) - if err != nil { - t.Fatal(err) - } - btCli, err := New(snapshotsDir, true, "12345123451234512345") - if err != nil { - t.Fatal(err) - } - defer btCli.Close() - btCli.trackers = [][]string{} - - db := snapshotdb.NewSnapshotKV().DB(mdbx.MustOpen(filepath.Join(dir, "chaindata"))).Open() - quit := make(chan struct{}) - defer func() { - close(quit) - }() - - sb := &SnapshotMigrator{ - snapshotsDir: snapshotsDir, - replaceChan: make(chan struct{}), - } - currentSnapshotBlock := uint64(10) - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - err = GenerateHeaderData(tx, 0, 11) - if err != nil { - t.Fatal(err) - } - - err = tx.Commit() - if err != nil { - t.Fatal(err) - } - generateChan := make(chan int) - StageSyncStep := func() { - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Error(err) - } - defer tx.Rollback() - - select { - case newHeight := <-generateChan: - err = GenerateHeaderData(tx, int(currentSnapshotBlock), newHeight) - if err != nil { - t.Error(err) - } - currentSnapshotBlock = CalculateEpoch(uint64(newHeight), 10) - default: - - } - - err = sb.AsyncStages(currentSnapshotBlock, logger, db, tx, btCli, true) - if err != nil { - t.Error(err) - } - - err = sb.SyncStages(currentSnapshotBlock, db, tx) - if err != nil { - t.Error(err) - } - - err = tx.Commit() - if err != nil { - t.Error(err) - } - roTX, err := db.BeginRo(context.Background()) - if err != nil { - t.Error(err) - } - - err = sb.Final(roTX) - if err != nil { - t.Error(err) - } - roTX.Rollback() - time.Sleep(time.Second) - } - wg := sync.WaitGroup{} - wg.Add(1) - - go func() { - so := sync.Once{} - //this gorutine emulates staged sync. - for { - select { - case <-quit: - db.Close() - return - default: - StageSyncStep() - //mark that migration started and changed started flag(for the first usage) - so.Do(func() { - wg.Done() - }) - } - } - }() - //wait until migration start - wg.Wait() - tm := time.After(time.Second * 1000) - for atomic.LoadUint64(&sb.started) > 0 && atomic.LoadUint64(&sb.HeadersCurrentSnapshot) != 10 { - select { - case <-tm: - t.Fatal("timeout") - default: - time.Sleep(time.Millisecond * 100) - } - } - - //note. We need here only main database. - rotx, err := db.WriteDB().BeginRo(context.Background()) - require.NoError(t, err) - defer rotx.Rollback() - roc, err := rotx.Cursor(kv.Headers) - require.NoError(t, err) - var headerNumber uint64 - headerNumber = 11 - - err = ethdb.Walk(roc, []byte{}, 0, func(k, v []byte) (bool, error) { - require.Equal(t, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)}), k) - headerNumber++ - return true, nil - }) - if err != nil { - t.Fatal(err) - } - if headerNumber != 12 { - t.Fatal(headerNumber) - } - rotx.Rollback() - - snokv := db.HeadersSnapshot() - snRoTx, err := snokv.BeginRo(context.Background()) - require.NoError(t, err) - headerNumber = 0 - err = snRoTx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - return nil - }) - if err != nil { - t.Fatal(err) - } - snRoTx.Rollback() - if err != nil { - t.Fatal(err) - } - if headerNumber != 11 { - t.Fatal(headerNumber) - } - - headerNumber = 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - - if headerNumber != 12 { - t.Fatal(headerNumber) - } - - trnts := btCli.Torrents() - if len(trnts) != 1 { - t.Fatal("incorrect len", trnts) - } - - err = db.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotHash) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, trnts[0].Bytes()) { - t.Fatal("incorrect bytes", common.Bytes2Hex(v), common.Bytes2Hex(trnts[0].Bytes())) - } - - v, err = tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil { - t.Fatal(err) - } - if binary.BigEndian.Uint64(v) != 10 { - t.Fatal("incorrect snapshot") - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - - roTX, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - //just start snapshot transaction - // it can't be empty slice but shouldn't be in main db - _, err = roTX.GetOne(kv.Headers, []byte{112, 3}) - if err != nil { - t.Fatal(err) - } - defer roTX.Rollback() - - generateChan <- 20 - - rollbacked := false - //3s - just to be sure that it blocks here - c := time.After(time.Second * 3) - tm = time.After(time.Second * 20) - - for atomic.LoadUint64(&sb.started) > 0 || atomic.LoadUint64(&sb.HeadersCurrentSnapshot) != 20 { - select { - case <-c: - roTX.Rollback() - rollbacked = true - case <-tm: - t.Fatal("timeout") - default: - time.Sleep(time.Millisecond * 100) - } - } - if !rollbacked { - t.Log("it's not possible to close db without rollback. something went wrong") - } - - rotx, err = db.WriteDB().BeginRo(context.Background()) - require.NoError(t, err) - defer rotx.Rollback() - roc, err = rotx.Cursor(kv.Headers) - require.NoError(t, err) - - err = ethdb.Walk(roc, []byte{}, 0, func(k, v []byte) (bool, error) { - t.Fatal("main db must be empty here", k) - return true, nil - }) - if err != nil { - t.Fatal(err) - } - - headerNumber = 0 - err = db.HeadersSnapshot().View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - - if headerNumber != 21 { - t.Fatal(headerNumber) - } - headerNumber = 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - if headerNumber != 21 { - t.Fatal(headerNumber) - } - - trnts = btCli.Torrents() - if len(trnts) != 1 { - t.Fatal("incorrect len", trnts) - } - err = db.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotHash) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, trnts[0].Bytes()) { - t.Fatal("incorrect bytes", common.Bytes2Hex(v), common.Bytes2Hex(trnts[0].Bytes())) - } - - v, err = tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil { - t.Fatal(err) - } - if binary.BigEndian.Uint64(v) != 20 { - t.Fatal("incorrect snapshot") - } - return nil - }) - if err != nil { - t.Fatal(err) - } - if _, err = os.Stat(SnapshotName(snapshotsDir, "headers", 10)); os.IsExist(err) { - t.Fatal("snapshot exsists") - } else { - //just not to confuse defer - err = nil - } -} - -func TestSnapshotMigratorStageSyncMode(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") // after remove ChainReader from consensus engine - this test can be changed to create less databases, then can enable on win. now timeout after 20min - } - //log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) - logger := log.New() - var err error - dir := t.TempDir() - - defer func() { - if err != nil { - t.Log(err, dir) - } - err = os.RemoveAll(dir) - if err != nil { - t.Log(err) - } - - }() - snapshotsDir := filepath.Join(dir, "snapshots") - err = os.Mkdir(snapshotsDir, os.ModePerm) - if err != nil { - t.Fatal(err) - } - btCli, err := New(snapshotsDir, true, "12345123451234512345") - if err != nil { - t.Fatal(err) - } - btCli.trackers = [][]string{} - defer btCli.Close() - - db := snapshotdb.NewSnapshotKV().DB(mdbx.MustOpen(filepath.Join(dir, "chaindata"))).Open() - defer db.Close() - - sb := &SnapshotMigrator{ - snapshotsDir: snapshotsDir, - replaceChan: make(chan struct{}), - } - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Error(err) - panic(err) - } - defer tx.Rollback() - err = GenerateHeaderData(tx, 0, 11) - if err != nil { - t.Error(err) - panic(err) - } - - err = tx.Commit() - if err != nil { - t.Error(err) - panic(err) - } - - writeStep := func(currentSnapshotBlock uint64) { - writeTX, writeErr := db.BeginRw(context.Background()) - if writeErr != nil { - t.Fatal(writeErr) - } - defer writeTX.Rollback() - writeErr = sb.SyncStages(currentSnapshotBlock, db, writeTX) - if writeErr != nil { - t.Fatal(writeErr) - } - - writeErr = writeTX.Commit() - if writeErr != nil { - t.Fatal(writeErr) - } - } - - StageSyncStep := func(currentSnapshotBlock uint64) { - t.Helper() - rotx, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal() - } - defer rotx.Rollback() - - err = sb.AsyncStages(currentSnapshotBlock, logger, db, rotx, btCli, false) - if err != nil { - t.Fatal(err) - } - rotx.Rollback() - } - StageSyncStep(10) - for !sb.Replaced() { - //wait until all txs of old snapshot closed - } - writeStep(10) - - tm := time.After(time.Second * 10) - for atomic.LoadUint64(&sb.started) > 0 && atomic.LoadUint64(&sb.HeadersCurrentSnapshot) != 10 { - err = db.View(context.Background(), func(tx kv.Tx) error { return sb.Final(tx) }) - if err != nil { - t.Fatal(err) - } - - select { - case <-tm: - t.Fatal("timeout") - default: - time.Sleep(time.Millisecond * 100) - } - } - - //note. We need here only main database. - rotx, err := db.WriteDB().BeginRo(context.Background()) - require.NoError(t, err) - defer rotx.Rollback() - roc, err := rotx.Cursor(kv.Headers) - require.NoError(t, err) - var headerNumber uint64 - headerNumber = 11 - - err = ethdb.Walk(roc, []byte{}, 0, func(k, v []byte) (bool, error) { - require.Equal(t, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)}), k) - headerNumber++ - return true, nil - }) - if err != nil { - t.Fatal(err) - } - if headerNumber != 12 { - t.Fatal(headerNumber) - } - rotx.Rollback() - - snokv := db.HeadersSnapshot() - snRoTx, err := snokv.BeginRo(context.Background()) - require.NoError(t, err) - headersCursor, err := snRoTx.Cursor(kv.Headers) - require.NoError(t, err) - headerNumber = 0 - err = ethdb.Walk(headersCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - - return true, nil - }) - snRoTx.Rollback() - if err != nil { - t.Fatal(err) - } - if headerNumber != 11 { - t.Fatal(headerNumber) - } - - headerNumber = 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - - if headerNumber != 12 { - t.Fatal(headerNumber) - } - - trnts := btCli.Torrents() - if len(trnts) != 1 { - t.Fatal("incorrect len", trnts) - } - - err = db.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotHash) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, trnts[0].Bytes()) { - t.Fatal("incorrect bytes", common.Bytes2Hex(v), common.Bytes2Hex(trnts[0].Bytes())) - } - - v, err = tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil { - t.Fatal(err) - } - if binary.BigEndian.Uint64(v) != 10 { - t.Fatal("incorrect snapshot") - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - - tx, err = db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - err = GenerateHeaderData(tx, 12, 20) - if err != nil { - t.Fatal(err) - } - - err = tx.Commit() - if err != nil { - t.Fatal(err) - } - - wg := sync.WaitGroup{} - wg.Add(1) - rollbacked := false - go func() { - c := time.After(time.Second * 3) - - roTX, err := db.BeginRo(context.Background()) - if err != nil { - wg.Done() - - t.Error(err) - } - defer rotx.Rollback() - //just start snapshot transaction - // it can't be empty slice but shouldn't be in main db - _, err = roTX.GetOne(kv.Headers, []byte{1}) - if err != nil { - wg.Done() - t.Error(err) - } - wg.Done() - <-c - //reproducable datarace between Rollback and Close - rollbacked = true - roTX.Rollback() - }() - //wait until read tx start - wg.Wait() - - StageSyncStep(20) - for !sb.Replaced() { - //wait until all txs of old snapshot closed - } - writeStep(20) - - tm = time.After(time.Second * 10) - - for atomic.LoadUint64(&sb.started) > 0 && atomic.LoadUint64(&sb.HeadersCurrentSnapshot) == 20 { - roTx, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - err = sb.Final(roTx) - if err != nil { - t.Fatal(err) - } - roTx.Rollback() - select { - case <-tm: - t.Fatal("timeout") - default: - time.Sleep(time.Millisecond * 100) - } - } - - if !rollbacked { - t.Log("it's not possible to close db without rollback. something went wrong") - } - - rotx, err = db.WriteDB().BeginRo(context.Background()) - require.NoError(t, err) - err = rotx.ForEach(kv.Headers, nil, func(k, v []byte) error { - t.Fatal("main db must be empty here", k) - return nil - }) - if err != nil { - t.Fatal(err) - } - rotx.Rollback() - headerNumber = 0 - snRoTx, err = db.HeadersSnapshot().BeginRo(context.Background()) - require.NoError(t, err) - err = snRoTx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - return nil - }) - snRoTx.Rollback() - if err != nil { - t.Fatal(err) - } - - if headerNumber != 21 { - t.Fatal(headerNumber) - } - headerNumber = 0 - err = db.View(context.Background(), func(tx kv.Tx) error { - return tx.ForEach(kv.Headers, nil, func(k, v []byte) error { - if !bytes.Equal(k, dbutils.HeaderKey(headerNumber, common.Hash{uint8(headerNumber)})) { - t.Fatal(k) - } - headerNumber++ - return nil - }) - }) - if err != nil { - t.Fatal(err) - } - if headerNumber != 21 { - t.Fatal(headerNumber) - } - - trnts = btCli.Torrents() - if len(trnts) != 1 { - t.Fatal("incorrect len", trnts) - } - err = db.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotHash) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(v, trnts[0].Bytes()) { - t.Fatal("incorrect bytes", common.Bytes2Hex(v), common.Bytes2Hex(trnts[0].Bytes())) - } - - v, err = tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil { - t.Fatal(err) - } - if binary.BigEndian.Uint64(v) != 20 { - t.Fatal("incorrect snapshot") - } - return nil - }) - if err != nil { - t.Fatal(err) - } - if _, err = os.Stat(SnapshotName(snapshotsDir, "headers", 10)); os.IsExist(err) { - t.Fatal("snapshot exist") - } else { - //just not to confuse defer - err = nil - } -} - -func GenerateHeaderData(tx kv.RwTx, from, to int) error { - var err error - if to > math.MaxInt8 { - return errors.New("greater than uint8") - } - for i := from; i <= to; i++ { - err = tx.Put(kv.Headers, dbutils.HeaderKey(uint64(i), common.Hash{uint8(i)}), []byte{uint8(i), uint8(i), uint8(i)}) - if err != nil { - return err - } - err = tx.Put(kv.HeaderCanonical, dbutils.EncodeBlockNumber(uint64(i)), common.Hash{uint8(i)}.Bytes()) - if err != nil { - return err - } - } - return nil -} - -func GenerateBodyData(tx kv.RwTx, from, to uint64) error { - var err error - if to > math.MaxInt8 { - return errors.New("greater than uint8") - } - for i := from; i <= to; i++ { - for blockNum := 1; blockNum < 4; blockNum++ { - bodyForStorage := new(types.BodyForStorage) - baseTxId, err := tx.IncrementSequence(kv.EthTx, 3) - if err != nil { - return err - } - bodyForStorage.BaseTxId = baseTxId - bodyForStorage.TxAmount = 3 - body, err := rlp.EncodeToBytes(bodyForStorage) - if err != nil { - return err - } - err = tx.Put(kv.BlockBody, dbutils.BlockBodyKey(i, common.Hash{uint8(i), uint8(blockNum)}), body) - if err != nil { - return err - } - header := &types.Header{ - Number: big.NewInt(int64(i)), - } - headersBytes, err := rlp.EncodeToBytes(header) - if err != nil { - return err - } - - err = tx.Put(kv.Headers, dbutils.HeaderKey(i, common.Hash{uint8(i), uint8(blockNum)}), headersBytes) - if err != nil { - return err - } - - genTx := func(a common.Address) ([]byte, error) { - return rlp.EncodeToBytes(types.NewTransaction(1, a, uint256.NewInt(1), 1, uint256.NewInt(1), nil)) - } - txBytes, err := genTx(common.Address{uint8(i), uint8(blockNum), 1}) - if err != nil { - return err - } - - err = tx.Put(kv.EthTx, dbutils.EncodeBlockNumber(baseTxId), txBytes) - if err != nil { - return err - } - txBytes, err = genTx(common.Address{uint8(i), uint8(blockNum), 2}) - if err != nil { - return err - } - - err = tx.Put(kv.EthTx, dbutils.EncodeBlockNumber(baseTxId+1), txBytes) - if err != nil { - return err - } - - txBytes, err = genTx(common.Address{uint8(i), uint8(blockNum), 3}) - if err != nil { - return err - } - - err = tx.Put(kv.EthTx, dbutils.EncodeBlockNumber(baseTxId+2), txBytes) - if err != nil { - return err - } - } - - err = tx.Put(kv.HeaderCanonical, dbutils.EncodeBlockNumber(i), common.Hash{uint8(i), uint8(i%3) + 1}.Bytes()) - if err != nil { - return err - } - } - return nil -} - -// check snapshot data based on GenerateBodyData -func verifyBodiesSnapshot(t *testing.T, bodySnapshotTX kv.Tx, snapshotTo uint64) { - t.Helper() - bodyCursor, err := bodySnapshotTX.Cursor(kv.BlockBody) - if err != nil { - t.Fatal(err) - } - defer bodyCursor.Close() - - var blockNum uint64 - err = ethdb.Walk(bodyCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - //fmt.Println(common.Bytes2Hex(k)) - if binary.BigEndian.Uint64(k[:8]) != blockNum { - t.Fatal("incorrect block number", blockNum, binary.BigEndian.Uint64(k[:8]), common.Bytes2Hex(k)) - } - if !bytes.Equal(k[8:], common.Hash{uint8(blockNum), uint8(blockNum%3) + 1}.Bytes()) { - t.Fatal("block is not canonical", blockNum, common.Bytes2Hex(k)) - } - bfs := types.BodyForStorage{} - err = rlp.DecodeBytes(v, &bfs) - if err != nil { - t.Fatal(err, v) - } - transactions, err := rawdb.ReadTransactions(bodySnapshotTX, bfs.BaseTxId, bfs.TxAmount) - if err != nil { - t.Fatal(err) - } - - var txNum uint8 = 1 - for _, tr := range transactions { - expected := common.Address{uint8(blockNum), uint8(blockNum%3 + 1), txNum} - if *tr.GetTo() != expected { - t.Fatal(*tr.GetTo(), expected) - } - txNum++ - } - blockNum++ - return true, nil - }) - if err != nil { - t.Fatal(err) - } - if blockNum-1 != snapshotTo { - t.Fatal(blockNum, snapshotTo) - } -} - -// check headers snapshot data based on GenerateBodyData -func verifyHeadersSnapshot(t *testing.T, headersSnapshotTX kv.Tx, snapshotTo uint64) { - t.Helper() - headersCursor, err := headersSnapshotTX.Cursor(kv.Headers) - if err != nil { - t.Fatal(err) - } - defer headersCursor.Close() - - var blockNum uint64 - err = ethdb.Walk(headersCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - //fmt.Println(common.Bytes2Hex(k)) - if binary.BigEndian.Uint64(k[:8]) != blockNum { - t.Fatal("incorrect block number", blockNum, binary.BigEndian.Uint64(k[:8]), common.Bytes2Hex(k)) - } - if !bytes.Equal(k[8:], common.Hash{uint8(blockNum), uint8(blockNum%3) + 1}.Bytes()) { - t.Fatal("block is not canonical", blockNum, common.Bytes2Hex(k)) - } - blockNum++ - return true, nil - }) - if err != nil { - t.Fatal(err) - } - if blockNum-1 != snapshotTo { - t.Fatal(blockNum, snapshotTo) - } -} - -func verifyFullBodiesData(t *testing.T, bodySnapshotTX kv.Tx, dataTo uint64) { - t.Helper() - bodyCursor, err := bodySnapshotTX.Cursor(kv.BlockBody) - if err != nil { - t.Fatal(err) - } - defer bodyCursor.Close() - var blockNum uint64 - var numOfDuplicateBlocks uint8 - err = ethdb.Walk(bodyCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - numOfDuplicateBlocks++ - if binary.BigEndian.Uint64(k[:8]) != blockNum { - t.Fatal("incorrect block number", blockNum, binary.BigEndian.Uint64(k[:8]), common.Bytes2Hex(k)) - } - if !bytes.Equal(k[8:], common.Hash{uint8(blockNum), numOfDuplicateBlocks}.Bytes()) { - t.Fatal("incorrect block hash", blockNum, numOfDuplicateBlocks, common.Bytes2Hex(k)) - } - bfs := types.BodyForStorage{} - err = rlp.DecodeBytes(v, &bfs) - if err != nil { - t.Fatal(err, v) - } - - transactions, err := rawdb.ReadTransactions(bodySnapshotTX, bfs.BaseTxId, bfs.TxAmount) - if err != nil { - t.Fatal(err) - } - - if len(transactions) != 3 { - t.Fatal("incorrect tx num", len(transactions)) - } - expected := common.Address{uint8(blockNum), numOfDuplicateBlocks, 1} - if *transactions[0].GetTo() != expected { - t.Fatal(k, blockNum, numOfDuplicateBlocks, bfs.BaseTxId, *transactions[0].GetTo(), expected.Bytes()) - } - expected = common.Address{uint8(blockNum), numOfDuplicateBlocks, 2} - if *transactions[1].GetTo() != expected { - t.Fatal(*transactions[1].GetTo(), expected) - } - expected = common.Address{uint8(blockNum), numOfDuplicateBlocks, 3} - if *transactions[2].GetTo() != expected { - t.Fatal(*transactions[2].GetTo(), expected) - } - - if numOfDuplicateBlocks%3 == 0 { - blockNum++ - numOfDuplicateBlocks = 0 - } - - return true, nil - }) - if err != nil { - t.Fatal(err) - } - if blockNum-1 != dataTo { - t.Fatal("incorrect last block", blockNum, dataTo) - } -} - -func verifyPrunedBlocksData(t *testing.T, tx kv.Tx, dataFrom, dataTo, snapshotTxTo uint64) { - t.Helper() - bodyCursor, err := tx.Cursor(kv.BlockBody) - if err != nil { - t.Fatal(err) - } - defer bodyCursor.Close() - var blockNum uint64 - var numOfDuplicateBlocks uint8 - err = ethdb.Walk(bodyCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - numOfDuplicateBlocks++ - if binary.BigEndian.Uint64(k[:8]) != blockNum { - t.Fatal("incorrect block number", blockNum, binary.BigEndian.Uint64(k[:8]), common.Bytes2Hex(k)) - } - canonicalHash, err := rawdb.ReadCanonicalHash(tx, blockNum) - if err != nil { - t.Fatal(err) - } - if blockNum <= dataFrom { - if bytes.Equal(k[8:], canonicalHash.Bytes()) { - t.Fatal("snapshot data hasn't deleted", k, canonicalHash.Bytes()) - } - } - - bfs := types.BodyForStorage{} - err = rlp.DecodeBytes(v, &bfs) - if err != nil { - t.Fatal(err, v) - } - if bfs.BaseTxId <= snapshotTxTo { - t.Fatal("txid must be after last snapshot txid") - } - transactions, err := rawdb.ReadTransactions(tx, bfs.BaseTxId, bfs.TxAmount) - if err != nil { - t.Fatal(err) - } - - if len(transactions) != 3 { - t.Fatal("incorrect tx num", len(transactions)) - } - - switch { - case blockNum <= dataFrom && numOfDuplicateBlocks == 2: - blockNum++ - numOfDuplicateBlocks = 0 - //after snapshot data - case blockNum > dataFrom && numOfDuplicateBlocks == 3: - blockNum++ - numOfDuplicateBlocks = 0 - } - return true, nil - }) - if err != nil { - t.Fatal(err) - } - if blockNum-1 != dataTo { - t.Fatal("incorrect last block", blockNum, dataTo) - } -} - -func TestPruneBlocks(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") // after remove ChainReader from consensus engine - this test can be changed to create less databases, then can enable on win. now timeout after 20min - } - //log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) - logger := log.New() - var err error - dir := t.TempDir() - - defer func() { - if err != nil { - t.Log(err, dir) - } - err = os.RemoveAll(dir) - if err != nil { - t.Log(err) - } - }() - snapshotsDir := filepath.Join(dir, "snapshots") - err = os.Mkdir(snapshotsDir, os.ModePerm) - if err != nil { - t.Fatal(err) - } - btCli, err := New(snapshotsDir, true, "12345123451234512345") - if err != nil { - t.Fatal(err) - } - btCli.trackers = [][]string{} - defer btCli.Close() - - db := snapshotdb.NewSnapshotKV().DB(mdbx.MustOpen(filepath.Join(dir, "chaindata"))).Open() - defer db.Close() - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - dataTo := uint64(15) - snapshotTo := uint64(10) - err = GenerateBodyData(tx, 0, dataTo) - if err != nil { - t.Fatal(err) - } - verifyFullBodiesData(t, tx, dataTo) - err = tx.Commit() - if err != nil { - t.Fatal(err) - } - - readTX, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer readTX.Rollback() - - bodySnapshotPath := filepath.Join(snapshotsDir, SnapshotName(snapshotsDir, "bodies", snapshotTo)) - err = CreateBodySnapshot(readTX, logger, snapshotTo, bodySnapshotPath) - if err != nil { - t.Fatal(err) - } - readTX.Rollback() - kvSnapshot, err := OpenBodiesSnapshot(logger, bodySnapshotPath) - if err != nil { - t.Fatal(err) - } - - bodySnapshotTX, err := kvSnapshot.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer bodySnapshotTX.Rollback() - - verifyBodiesSnapshot(t, bodySnapshotTX, snapshotTo) - ethTXCursor, err := bodySnapshotTX.Cursor(kv.EthTx) - if err != nil { - t.Fatal(err) - } - lastTxID, _, err := ethTXCursor.Last() - if err != nil { - t.Fatal(err) - } - bodySnapshotTX.Rollback() - - ch := make(chan struct{}) - db.UpdateSnapshots("bodies", kvSnapshot, ch) - select { - case <-ch: - case <-time.After(time.Second * 5): - t.Fatal("timeout on snapshot replace") - } - withBodySnapshotTX, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer withBodySnapshotTX.Rollback() - - verifyFullBodiesData(t, withBodySnapshotTX, dataTo) - withBodySnapshotTX.Rollback() - - rwTX, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer rwTX.Rollback() - - err = RemoveBlocksData(db, rwTX, snapshotTo) - if err != nil { - t.Fatal(err) - } - - err = rwTX.Commit() - if err != nil { - t.Fatal(err) - } - - withBodySnapshotTX, err = db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer withBodySnapshotTX.Rollback() - - verifyFullBodiesData(t, withBodySnapshotTX, dataTo) - withBodySnapshotTX.Rollback() - - writeDBKV := db.WriteDB() - - writeDBKVRoTX, err := writeDBKV.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer writeDBKVRoTX.Rollback() - - verifyPrunedBlocksData(t, writeDBKVRoTX, snapshotTo, dataTo, binary.BigEndian.Uint64(lastTxID)) - writeDBKVRoTX.Rollback() - - tx, err = db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer tx.Rollback() - - //snapshot to 20 - dataFrom := uint64(16) - dataTo = uint64(20) - snapshotTo = uint64(20) - err = GenerateBodyData(tx, dataFrom, dataTo) - if err != nil { - t.Fatal(err) - } - verifyFullBodiesData(t, tx, dataTo) - err = tx.Commit() - if err != nil { - t.Fatal(err) - } - - bodySnapshotPath = filepath.Join(snapshotsDir, SnapshotName(snapshotsDir, "bodies", snapshotTo)) - readTX, err = db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer readTX.Rollback() - - err = CreateBodySnapshot(readTX, logger, snapshotTo, bodySnapshotPath) - if err != nil { - t.Fatal(err) - } - readTX.Rollback() - - kvSnapshot, err = OpenBodiesSnapshot(logger, bodySnapshotPath) - if err != nil { - t.Fatal(err) - } - - bodySnapshotTX, err = kvSnapshot.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer bodySnapshotTX.Rollback() - - verifyBodiesSnapshot(t, bodySnapshotTX, snapshotTo) - ethTXCursor, err = bodySnapshotTX.Cursor(kv.EthTx) - if err != nil { - t.Fatal(err) - } - lastTxID, _, err = ethTXCursor.Last() - if err != nil { - t.Fatal(err) - } - - bodySnapshotTX.Rollback() - ch = make(chan struct{}) - db.UpdateSnapshots("bodies", kvSnapshot, ch) - select { - case <-ch: - case <-time.After(time.Second * 5000): - t.Fatal("timeout on snapshot replace") - } - withBodySnapshotTX, err = db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer withBodySnapshotTX.Rollback() - - verifyFullBodiesData(t, withBodySnapshotTX, dataTo) - withBodySnapshotTX.Rollback() - - rwTX, err = db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - defer rwTX.Rollback() - - err = RemoveBlocksData(db, rwTX, snapshotTo) - if err != nil { - t.Fatal(err) - } - - err = rwTX.Commit() - if err != nil { - t.Fatal(err) - } - - withBodySnapshotTX, err = db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer withBodySnapshotTX.Rollback() - - verifyFullBodiesData(t, withBodySnapshotTX, dataTo) - withBodySnapshotTX.Rollback() - - writeDBKV = db.WriteDB() - - writeDBKVRoTX, err = writeDBKV.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer writeDBKVRoTX.Rollback() - verifyPrunedBlocksData(t, writeDBKVRoTX, snapshotTo, dataTo, binary.BigEndian.Uint64(lastTxID)) -} - -func PrintBodyBuckets(t *testing.T, tx kv.Tx) { //nolint: deadcode - bodyCursor, err := tx.Cursor(kv.BlockBody) - if err != nil { - t.Fatal(err) - } - err = ethdb.Walk(bodyCursor, []byte{}, 0, func(k, v []byte) (bool, error) { - bfs := types.BodyForStorage{} - err = rlp.DecodeBytes(v, &bfs) - if err != nil { - t.Fatal(err, v) - } - fmt.Println(binary.BigEndian.Uint64(k), k[8:], bfs.BaseTxId, bfs.TxAmount) - - transactions, err := rawdb.ReadTransactions(tx, bfs.BaseTxId, bfs.TxAmount) - if err != nil { - t.Fatal(err) - } - for _, transaction := range transactions { - fmt.Println("----", transaction.GetTo()) - } - return true, nil - }) - if err != nil { - t.Fatal(err) - } -} - -func TestBodySnapshotSyncMigration(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("fix me on win please") // after remove ChainReader from consensus engine - this test can be changed to create less databases, then can enable on win. now timeout after 20min - } - //log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) - logger := log.New() - var err error - dir := t.TempDir() - - defer func() { - if err != nil { - t.Log(err, dir) - } - err = os.RemoveAll(dir) - if err != nil { - t.Log(err) - } - }() - snapshotsDir := filepath.Join(dir, "snapshots") - err = os.Mkdir(snapshotsDir, os.ModePerm) - if err != nil { - t.Fatal(err) - } - btCli, err := New(snapshotsDir, true, "12345123451234512345") - if err != nil { - t.Fatal(err) - } - btCli.trackers = [][]string{} - defer btCli.Close() - - sb := &SnapshotMigrator{ - snapshotsDir: snapshotsDir, - replaceChan: make(chan struct{}), - } - - db := snapshotdb.NewSnapshotKV().DB(mdbx.MustOpen(filepath.Join(dir, "chaindata"))).Open() - defer db.Close() - - tx, err := db.BeginRw(context.Background()) - if err != nil { - t.Fatal(err) - } - - defer tx.Rollback() - dataTo := uint64(11) - err = GenerateBodyData(tx, 0, dataTo) - if err != nil { - t.Fatal(err) - } - verifyFullBodiesData(t, tx, dataTo) - err = tx.Commit() - if err != nil { - t.Fatal(err) - } - - writeStep := func(currentSnapshotBlock uint64) { - writeTX, writeErr := db.BeginRw(context.Background()) - if writeErr != nil { - t.Fatal(writeErr) - } - defer writeTX.Rollback() - writeErr = sb.SyncStages(currentSnapshotBlock, db, writeTX) - if writeErr != nil { - t.Fatal(writeErr) - } - - writeErr = writeTX.Commit() - if writeErr != nil { - t.Fatal(writeErr) - } - } - - readStep := func(currentSnapshotBlock uint64) { - t.Helper() - rotx, err := db.BeginRo(context.Background()) - if err != nil { - t.Error(err) - } - defer rotx.Rollback() - - err = sb.AsyncStages(currentSnapshotBlock, logger, db, rotx, btCli, false) - if err != nil { - t.Fatal(err) - } - rotx.Rollback() - } - readStep(10) - for !sb.Replaced() { - //wait until all txs of old snapshot closed - } - writeStep(10) - - tm := time.After(time.Second * 5) - for atomic.LoadUint64(&sb.started) > 0 && atomic.LoadUint64(&sb.HeadersCurrentSnapshot) != 10 { - roTx, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - - err = sb.Final(roTx) - if err != nil { - t.Fatal(err) - } - roTx.Rollback() - select { - case <-tm: - t.Fatal("timeout") - default: - time.Sleep(time.Millisecond * 100) - } - } - - readStep(10) - for !sb.Replaced() { - //wait until all txs of old snapshot closed - } - writeStep(10) - - for atomic.LoadUint64(&sb.started) > 0 && atomic.LoadUint64(&sb.BodiesCurrentSnapshot) != 10 { - roTx, err := db.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - - err = sb.Final(roTx) - if err != nil { - t.Fatal(err) - } - roTx.Rollback() - time.Sleep(time.Millisecond * 100) - } - headersKV := db.HeadersSnapshot() - if headersKV == nil { - t.Fatal("empty headers snapshot") - } - bodiesKV := db.BodiesSnapshot() - if bodiesKV == nil { - t.Fatal("empty bodies snapshot") - } - - htx, err := headersKV.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - verifyHeadersSnapshot(t, htx, 10) - htx.Rollback() - - btx, err := bodiesKV.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - verifyBodiesSnapshot(t, btx, 10) - ethTX, err := btx.Cursor(kv.EthTx) - if err != nil { - t.Fatal(err) - } - lastEthTX, _, err := ethTX.Last() - if err != nil { - t.Fatal(err) - } - btx.Rollback() - - writeKV := db.WriteDB() - roWriteDBTX, err := writeKV.BeginRo(context.Background()) - if err != nil { - t.Fatal(err) - } - defer roWriteDBTX.Rollback() - - var blockNum uint64 - var numOfDuplicateBlocks uint64 - dataFrom := uint64(10) - err = roWriteDBTX.ForEach(kv.Headers, []byte{}, func(k, v []byte) error { - numOfDuplicateBlocks++ - - if binary.BigEndian.Uint64(k[:8]) != blockNum { - t.Fatal("incorrect block number", blockNum, binary.BigEndian.Uint64(k[:8]), common.Bytes2Hex(k)) - } - - canonicalHash, err := rawdb.ReadCanonicalHash(roWriteDBTX, blockNum) - if err != nil { - t.Fatal(err) - } - if blockNum <= dataFrom { - if bytes.Equal(k[8:], canonicalHash.Bytes()) { - t.Fatal("snapshot data hasn't deleted", k, canonicalHash.Bytes()) - } - } - - switch { - case blockNum <= dataFrom && numOfDuplicateBlocks == 2: - blockNum++ - numOfDuplicateBlocks = 0 - //after snapshot data - case blockNum > dataFrom && numOfDuplicateBlocks == 3: - blockNum++ - numOfDuplicateBlocks = 0 - } - - return nil - }) - if err != nil { - t.Fatal(err) - } - - verifyPrunedBlocksData(t, roWriteDBTX, 10, dataTo, binary.BigEndian.Uint64(lastEthTX)) -} diff --git a/turbo/snapshotsync/snapshot_mode.go b/turbo/snapshotsync/snapshot_mode.go index 5d505cb557d..2cdb44b0f9b 100644 --- a/turbo/snapshotsync/snapshot_mode.go +++ b/turbo/snapshotsync/snapshot_mode.go @@ -1,6 +1,11 @@ package snapshotsync -import "fmt" +/* +import ( + "fmt" + + "github.com/ledgerwatch/erigon-lib/gointerfaces/snapshotsync" +) var DefaultSnapshotMode = SnapshotMode{} @@ -28,34 +33,34 @@ func (m SnapshotMode) ToString() string { return mode } -func (m SnapshotMode) ToSnapshotTypes() []SnapshotType { - var types []SnapshotType +func (m SnapshotMode) ToSnapshotTypes() []snapshotsync.Type { + var types []snapshotsync.Type if m.Headers { - types = append(types, SnapshotType_headers) + types = append(types, snapshotsync.SnapshotType_headers) } if m.Bodies { - types = append(types, SnapshotType_bodies) + types = append(types, snapshotsync.SnapshotType_bodies) } if m.State { - types = append(types, SnapshotType_state) + types = append(types, snapshotsync.SnapshotType_state) } if m.Receipts { - types = append(types, SnapshotType_receipts) + types = append(types, snapshotsync.SnapshotType_receipts) } return types } -func FromSnapshotTypes(st []SnapshotType) SnapshotMode { +func FromSnapshotTypes(st []snapshotsync.Type) SnapshotMode { var mode SnapshotMode for i := range st { switch st[i] { - case SnapshotType_headers: + case snapshotsync.SnapshotType_headers: mode.Headers = true - case SnapshotType_bodies: + case snapshotsync.SnapshotType_bodies: mode.Bodies = true - case SnapshotType_state: + case snapshotsync.SnapshotType_state: mode.State = true - case SnapshotType_receipts: + case snapshotsync.SnapshotType_receipts: mode.Receipts = true } } @@ -79,3 +84,4 @@ func SnapshotModeFromString(flags string) (SnapshotMode, error) { } return mode, nil } +*/ diff --git a/turbo/snapshotsync/snapshot_mode_test.go b/turbo/snapshotsync/snapshot_mode_test.go index 810d4494f41..84d24418ebb 100644 --- a/turbo/snapshotsync/snapshot_mode_test.go +++ b/turbo/snapshotsync/snapshot_mode_test.go @@ -1,5 +1,6 @@ package snapshotsync +/* import ( "reflect" "testing" @@ -39,3 +40,4 @@ func TestSnapshotModeFromString(t *testing.T) { t.Fatal(sm) } } +*/ diff --git a/turbo/snapshotsync/snapshothashes/embed.go b/turbo/snapshotsync/snapshothashes/embed.go new file mode 100644 index 00000000000..8949a45ee45 --- /dev/null +++ b/turbo/snapshotsync/snapshothashes/embed.go @@ -0,0 +1,123 @@ +package snapshothashes + +import ( + _ "embed" + "path/filepath" + "strconv" + "strings" + + "github.com/ledgerwatch/erigon/params/networkname" + "github.com/pelletier/go-toml/v2" + "golang.org/x/exp/slices" +) + +//go:embed erigon-snapshots/mainnet.toml +var mainnet []byte +var Mainnet = fromToml(mainnet) + +//go:embed erigon-snapshots/goerli.toml +var goerli []byte +var Goerli = fromToml(goerli) + +//go:embed erigon-snapshots/bsc.toml +var bsc []byte +var Bsc = fromToml(bsc) + +//go:embed erigon-snapshots/ropsten.toml +var ropsten []byte +var Ropsten = fromToml(ropsten) + +//go:embed erigon-snapshots/mumbai.toml +var mumbai []byte +var Mumbai = fromToml(mumbai) + +//go:embed erigon-snapshots/bor-mainnet.toml +var borMainnet []byte +var BorMainnet = fromToml(borMainnet) + +type PreverifiedItem struct { + Name string + Hash string +} +type Preverified []PreverifiedItem +type preverified map[string]string + +func fromToml(in []byte) (out Preverified) { + var outMap preverified + if err := toml.Unmarshal(in, &outMap); err != nil { + panic(err) + } + return doSort(outMap) +} +func doSort(in preverified) Preverified { + out := make(Preverified, 0, len(in)) + for k, v := range in { + out = append(out, PreverifiedItem{k, v}) + } + slices.SortFunc(out, func(i, j PreverifiedItem) bool { return i.Name < j.Name }) + return out +} + +var ( + MainnetChainSnapshotConfig = newConfig(Mainnet) + GoerliChainSnapshotConfig = newConfig(Goerli) + BscChainSnapshotConfig = newConfig(Bsc) + RopstenChainSnapshotConfig = newConfig(Ropsten) + MumbaiChainSnapshotConfig = newConfig(Mumbai) + BorMainnetChainSnapshotConfig = newConfig(BorMainnet) +) + +func newConfig(preverified Preverified) *Config { + return &Config{ExpectBlocks: maxBlockNum(preverified), Preverified: preverified} +} + +func maxBlockNum(preverified Preverified) uint64 { + max := uint64(0) + for _, p := range preverified { + _, fileName := filepath.Split(p.Name) + ext := filepath.Ext(fileName) + if ext != ".seg" { + continue + } + onlyName := fileName[:len(fileName)-len(ext)] + parts := strings.Split(onlyName, "-") + if parts[0] != "v1" { + panic("not implemented") + } + if parts[3] != "headers" { + continue + } + to, err := strconv.ParseUint(parts[2], 10, 64) + if err != nil { + panic(err) + } + if max < to { + max = to + } + } + if max == 0 { // to prevent underflow + return 0 + } + return max*1_000 - 1 +} + +type Config struct { + ExpectBlocks uint64 + Preverified Preverified +} + +var KnownConfigs map[string]*Config = map[string]*Config{ + networkname.MainnetChainName: MainnetChainSnapshotConfig, + networkname.GoerliChainName: GoerliChainSnapshotConfig, + networkname.BSCChainName: BscChainSnapshotConfig, + networkname.RopstenChainName: RopstenChainSnapshotConfig, + networkname.MumbaiChainName: MumbaiChainSnapshotConfig, + networkname.BorMainnetChainName: BorMainnetChainSnapshotConfig, +} + +func KnownConfig(networkName string) *Config { + if c, ok := KnownConfigs[networkName]; ok { + return c + } + return newConfig(Preverified{}) +} diff --git a/turbo/snapshotsync/snapshothashes/erigon-snapshots b/turbo/snapshotsync/snapshothashes/erigon-snapshots new file mode 160000 index 00000000000..b900e6362cc --- /dev/null +++ b/turbo/snapshotsync/snapshothashes/erigon-snapshots @@ -0,0 +1 @@ +Subproject commit b900e6362ccb20b31d3f29fe2fe1efd73e8f6183 diff --git a/turbo/snapshotsync/wrapdb.go b/turbo/snapshotsync/wrapdb.go deleted file mode 100644 index 65d149227d3..00000000000 --- a/turbo/snapshotsync/wrapdb.go +++ /dev/null @@ -1,216 +0,0 @@ -package snapshotsync - -import ( - "context" - "encoding/binary" - "errors" - "time" - - "github.com/ledgerwatch/erigon-lib/kv" - kv2 "github.com/ledgerwatch/erigon-lib/kv/mdbx" - "github.com/ledgerwatch/erigon/ethdb" - "github.com/ledgerwatch/erigon/ethdb/snapshotdb" - "github.com/ledgerwatch/log/v3" -) - -var ( - BucketConfigs = map[SnapshotType]kv.TableCfg{ - SnapshotType_bodies: { - kv.BlockBody: kv.TableCfgItem{}, - kv.EthTx: kv.TableCfgItem{}, - }, - SnapshotType_headers: { - kv.Headers: kv.TableCfgItem{}, - }, - SnapshotType_state: { - kv.PlainState: kv.TableCfgItem{ - Flags: kv.DupSort, - AutoDupSortKeysConversion: true, - DupFromLen: 60, - DupToLen: 28, - }, - kv.PlainContractCode: kv.TableCfgItem{}, - kv.Code: kv.TableCfgItem{}, - }, - } -) - -//nolint -func WrapBySnapshotsFromDir(kv kv.RwDB, snapshotDir string, mode SnapshotMode) (kv.RwDB, error) { - //todo remove it - return nil, errors.New("deprecated") //nolint -} - -func WrapBySnapshotsFromDownloader(db kv.RwDB, snapshots map[SnapshotType]*SnapshotsInfo) (kv.RwDB, error) { - snKV := snapshotdb.NewSnapshotKV().DB(db) - for k, v := range snapshots { - log.Info("Wrap db by", "snapshot", k.String(), "dir", v.Dbpath) - cfg := BucketConfigs[k] - snapshotKV, err := kv2.NewMDBX(log.New()).Readonly().Path(v.Dbpath).WithTablessCfg(func(defaultBuckets kv.TableCfg) kv.TableCfg { - return cfg - }).Open() - - if err != nil { - log.Error("Can't open snapshot", "err", err) - return nil, err - } else { //nolint - switch k { - case SnapshotType_headers: - snKV = snKV.HeadersSnapshot(snapshotKV) - case SnapshotType_bodies: - snKV = snKV.BodiesSnapshot(snapshotKV) - case SnapshotType_state: - snKV = snKV.StateSnapshot(snapshotKV) - } - } - } - - return snKV.Open(), nil -} - -func WrapSnapshots(chainDb kv.RwDB, snapshotsDir string) (kv.RwDB, error) { - var snapshotBlock uint64 - var hasSnapshotBlock bool - if err := chainDb.View(context.Background(), func(tx kv.Tx) error { - v, err := tx.GetOne(kv.BittorrentInfo, kv.CurrentHeadersSnapshotBlock) - if err != nil { - return err - } - hasSnapshotBlock = len(v) == 8 - if hasSnapshotBlock { - snapshotBlock = binary.BigEndian.Uint64(v) - } - return nil - }); err != nil { - return chainDb, err - } - - snKVOpts := snapshotdb.NewSnapshotKV().DB(chainDb) - if hasSnapshotBlock { - snKV, innerErr := OpenHeadersSnapshot(SnapshotName(snapshotsDir, "headers", snapshotBlock)) - if innerErr != nil { - return chainDb, innerErr - } - snKVOpts = snKVOpts.HeadersSnapshot(snKV) - } - return snKVOpts.Open(), nil -} - -func DownloadSnapshots(torrentClient *Client, ExternalSnapshotDownloaderAddr string, networkID uint64, snapshotMode SnapshotMode, chainDb ethdb.Database) error { - var downloadedSnapshots map[SnapshotType]*SnapshotsInfo - if ExternalSnapshotDownloaderAddr != "" { - cli, cl, innerErr := NewClient(ExternalSnapshotDownloaderAddr) - if innerErr != nil { - return innerErr - } - defer cl() //nolint - - _, innerErr = cli.Download(context.Background(), &DownloadSnapshotRequest{ - NetworkId: networkID, - Type: snapshotMode.ToSnapshotTypes(), - }) - if innerErr != nil { - return innerErr - } - - waitDownload := func() (map[SnapshotType]*SnapshotsInfo, error) { - snapshotReadinessCheck := func(mp map[SnapshotType]*SnapshotsInfo, tp SnapshotType) bool { - if mp[tp].Readiness != int32(100) { - log.Info("Downloading", "snapshot", tp, "%", mp[tp].Readiness) - return false - } - return true - } - for { - downloadedSnapshots = make(map[SnapshotType]*SnapshotsInfo) - snapshots, err1 := cli.Snapshots(context.Background(), &SnapshotsRequest{NetworkId: networkID}) - if err1 != nil { - return nil, err1 - } - for i := range snapshots.Info { - if downloadedSnapshots[snapshots.Info[i].Type].SnapshotBlock < snapshots.Info[i].SnapshotBlock && snapshots.Info[i] != nil { - downloadedSnapshots[snapshots.Info[i].Type] = snapshots.Info[i] - } - } - - downloaded := true - if snapshotMode.Headers { - if !snapshotReadinessCheck(downloadedSnapshots, SnapshotType_headers) { - downloaded = false - } - } - if snapshotMode.Bodies { - if !snapshotReadinessCheck(downloadedSnapshots, SnapshotType_bodies) { - downloaded = false - } - } - if snapshotMode.State { - if !snapshotReadinessCheck(downloadedSnapshots, SnapshotType_state) { - downloaded = false - } - } - if snapshotMode.Receipts { - if !snapshotReadinessCheck(downloadedSnapshots, SnapshotType_receipts) { - downloaded = false - } - } - if downloaded { - return downloadedSnapshots, nil - } - time.Sleep(time.Second * 10) - } - } - downloadedSnapshots, innerErr := waitDownload() - if innerErr != nil { - return innerErr - } - snapshotKV := chainDb.(ethdb.HasRwKV).RwKV() - - snapshotKV, innerErr = WrapBySnapshotsFromDownloader(snapshotKV, downloadedSnapshots) - if innerErr != nil { - return innerErr - } - chainDb.(ethdb.HasRwKV).SetRwKV(snapshotKV) - - if err := PostProcessing(chainDb.RwKV(), downloadedSnapshots); err != nil { - return err - } - - } else { - if err := chainDb.RwKV().Update(context.Background(), func(tx kv.RwTx) error { - err := torrentClient.Load(tx) - if err != nil { - return err - } - return torrentClient.AddSnapshotsTorrents(context.Background(), tx, networkID, snapshotMode) - }); err != nil { - log.Error("There was an error in snapshot init. Swithing to regular sync", "err", err) - } else { - torrentClient.Download() - var innerErr error - var downloadedSnapshots map[SnapshotType]*SnapshotsInfo - if err := chainDb.RwKV().View(context.Background(), func(tx kv.Tx) (err error) { - downloadedSnapshots, err = torrentClient.GetSnapshots(tx, networkID) - if err != nil { - return err - } - return nil - }); err != nil { - return err - } - - snapshotKV := chainDb.(ethdb.HasRwKV).RwKV() - snapshotKV, innerErr = WrapBySnapshotsFromDownloader(snapshotKV, downloadedSnapshots) - if innerErr != nil { - return innerErr - } - chainDb.(ethdb.HasRwKV).SetRwKV(snapshotKV) - if err := PostProcessing(snapshotKV, downloadedSnapshots); err != nil { - - return err - } - } - - } - return nil -} diff --git a/turbo/stages/blockchain_test.go b/turbo/stages/blockchain_test.go index 06bc839e5f5..28851bd909e 100644 --- a/turbo/stages/blockchain_test.go +++ b/turbo/stages/blockchain_test.go @@ -45,7 +45,6 @@ import ( "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/turbo/stages" - "github.com/ledgerwatch/log/v3" ) // So we can deterministically seed different blockchains @@ -312,13 +311,13 @@ func testReorg(t *testing.T, first, second []int64, td int64) { // Insert an easy and a difficult chain afterwards easyChain, err := core.GenerateChain(m.ChainConfig, current(m.DB), m.Engine, m.DB, len(first), func(i int, b *core.BlockGen) { b.OffsetTime(first[i]) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chain: %v", err) } diffChain, err := core.GenerateChain(m.ChainConfig, current(m.DB), m.Engine, m.DB, len(second), func(i int, b *core.BlockGen) { b.OffsetTime(second[i]) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chain: %v", err) } @@ -438,7 +437,7 @@ func TestChainTxReorgs(t *testing.T) { gen.OffsetTime(9) // Lower the block difficulty to simulate a weaker chain } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chain: %v", err) } @@ -465,7 +464,7 @@ func TestChainTxReorgs(t *testing.T) { futureAdd, _ = types.SignTx(types.NewTransaction(gen.TxNonce(addr3), addr3, uint256.NewInt(1000), params.TxGas, nil, nil), *signer, key3) gen.AddTx(futureAdd) // This transaction will be added after a full reorg } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate chain: %v", err) } @@ -480,7 +479,7 @@ func TestChainTxReorgs(t *testing.T) { // removed tx txs := types.Transactions{pastDrop, freshDrop} for i, txn := range txs { - if txn, _, _, _, _ := rawdb.ReadTransaction(tx, txn.Hash()); txn != nil { + if txn, _, _, _, _ := rawdb.ReadTransactionByHash(tx, txn.Hash()); txn != nil { t.Errorf("drop %d: tx %v found while shouldn't have been", i, txn) } if rcpt, _, _, _, _ := rawdb.ReadReceipt(tx, txn.Hash()); rcpt != nil { @@ -490,7 +489,7 @@ func TestChainTxReorgs(t *testing.T) { // added tx txs = types.Transactions{pastAdd, freshAdd, futureAdd} for i, txn := range txs { - if txn, _, _, _, _ := rawdb.ReadTransaction(tx, txn.Hash()); txn == nil { + if txn, _, _, _, _ := rawdb.ReadTransactionByHash(tx, txn.Hash()); txn == nil { t.Errorf("add %d: expected tx to be found", i) } if rcpt, _, _, _, _ := rawdb.ReadReceipt(tx, txn.Hash()); rcpt == nil { @@ -500,7 +499,7 @@ func TestChainTxReorgs(t *testing.T) { // shared tx txs = types.Transactions{postponed, swapped} for i, txn := range txs { - if txn, _, _, _, _ := rawdb.ReadTransaction(tx, txn.Hash()); txn == nil { + if txn, _, _, _, _ := rawdb.ReadTransactionByHash(tx, txn.Hash()); txn == nil { t.Errorf("share %d: expected tx to be found", i) } if rcpt, _, _, _, _ := rawdb.ReadReceipt(tx, txn.Hash()); rcpt == nil { @@ -559,7 +558,7 @@ func TestEIP155Transition(t *testing.T) { funds = big.NewInt(1000000000) deleteAddr = common.Address{1} gspec = &core.Genesis{ - Config: ¶ms.ChainConfig{ChainID: big.NewInt(1), EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)}, + Config: ¶ms.ChainConfig{ChainID: big.NewInt(1), TangerineWhistleBlock: big.NewInt(0), SpuriousDragonBlock: big.NewInt(2), HomesteadBlock: new(big.Int)}, Alloc: core.GenesisAlloc{address: {Balance: funds}, deleteAddr: {Balance: new(big.Int)}}, } ) @@ -634,7 +633,7 @@ func TestEIP155Transition(t *testing.T) { } // generate an invalid chain id transaction - config := ¶ms.ChainConfig{ChainID: big.NewInt(2), EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)} + config := ¶ms.ChainConfig{ChainID: big.NewInt(2), TangerineWhistleBlock: big.NewInt(0), SpuriousDragonBlock: big.NewInt(2), HomesteadBlock: new(big.Int)} chain, chainErr = core.GenerateChain(config, chain.TopBlock, m.Engine, m.DB, 4, func(i int, block *core.BlockGen) { var ( basicTx = func(signer types.Signer) (types.Transaction, error) { @@ -648,7 +647,7 @@ func TestEIP155Transition(t *testing.T) { } block.AddTx(tx) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if chainErr != nil { t.Fatalf("generate blocks: %v", chainErr) } @@ -665,6 +664,15 @@ func TestModes(t *testing.T) { ) } +func TestBeforeModes(t *testing.T) { + mode := prune.DefaultMode + mode.History = prune.Before(0) + mode.Receipts = prune.Before(1) + mode.TxIndex = prune.Before(2) + mode.CallTraces = prune.Before(3) + doModesTest(t, mode) +} + func doModesTest(t *testing.T, pm prune.Mode) error { fmt.Printf("h=%v, r=%v, t=%v\n", pm.History.Enabled(), pm.Receipts.Enabled(), pm.TxIndex.Enabled()) require := require.New(t) @@ -675,11 +683,11 @@ func doModesTest(t *testing.T, pm prune.Mode) error { funds = big.NewInt(1000000000) deleteAddr = common.Address{1} gspec = &core.Genesis{ - Config: ¶ms.ChainConfig{ChainID: big.NewInt(1), EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)}, + Config: ¶ms.ChainConfig{ChainID: big.NewInt(1), TangerineWhistleBlock: big.NewInt(0), SpuriousDragonBlock: big.NewInt(2), HomesteadBlock: new(big.Int)}, Alloc: core.GenesisAlloc{address: {Balance: funds}, deleteAddr: {Balance: new(big.Int)}}, } ) - m := stages.MockWithGenesisStorageMode(t, gspec, key, pm) + m := stages.MockWithGenesisPruneMode(t, gspec, key, pm) head := uint64(4) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, int(head), func(i int, block *core.BlockGen) { @@ -722,9 +730,9 @@ func doModesTest(t *testing.T, pm prune.Mode) error { } block.AddTx(tx) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { - return fmt.Errorf("generate blocks: %v", err) + return fmt.Errorf("generate blocks: %w", err) } if err = m.InsertChain(chain); err != nil { @@ -837,7 +845,7 @@ func runPermutation(t *testing.T, testFunc func(*testing.T, prune.Mode) error, c if err := runPermutation(t, testFunc, current+1, pm); err != nil { return err } - invert := func(a prune.Distance) prune.Distance { + invert := func(a prune.BlockAmount) prune.Distance { if a.Enabled() { return math.MaxUint64 } @@ -866,11 +874,10 @@ func TestEIP161AccountRemoval(t *testing.T) { theAddr = common.Address{1} gspec = &core.Genesis{ Config: ¶ms.ChainConfig{ - ChainID: big.NewInt(1), - HomesteadBlock: new(big.Int), - EIP155Block: new(big.Int), - EIP150Block: new(big.Int), - EIP158Block: big.NewInt(2), + ChainID: big.NewInt(1), + HomesteadBlock: new(big.Int), + TangerineWhistleBlock: new(big.Int), + SpuriousDragonBlock: big.NewInt(2), }, Alloc: core.GenesisAlloc{address: {Balance: funds}}, } @@ -881,7 +888,7 @@ func TestEIP161AccountRemoval(t *testing.T) { var ( txn types.Transaction err error - signer = types.LatestSigner(gspec.Config) + signer = types.MakeFrontierSigner() ) switch i { case 0: @@ -895,7 +902,7 @@ func TestEIP161AccountRemoval(t *testing.T) { t.Fatal(err) } block.AddTx(txn) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -1000,15 +1007,15 @@ func TestDoubleAccountRemoval(t *testing.T) { t.Fatalf("read only db tx to read state: %v", err) } defer tx.Rollback() - st := state.New(state.NewPlainState(tx, 0)) + st := state.New(state.NewPlainState(tx, 1)) assert.NoError(t, err) assert.False(t, st.Exist(theAddr), "Contract should not exist at block #0") - st = state.New(state.NewPlainState(tx, 1)) + st = state.New(state.NewPlainState(tx, 2)) assert.NoError(t, err) assert.True(t, st.Exist(theAddr), "Contract should exist at block #1") - st = state.New(state.NewPlainState(tx, 2)) + st = state.New(state.NewPlainState(tx, 3)) assert.NoError(t, err) assert.True(t, st.Exist(theAddr), "Contract should exist at block #2") } @@ -1038,7 +1045,7 @@ func TestBlockchainHeaderchainReorgConsistency(t *testing.T) { } else { b.SetCoinbase(common.Address{1}) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate fork %d: %v", i, err) } @@ -1073,15 +1080,13 @@ func TestBlockchainHeaderchainReorgConsistency(t *testing.T) { // Tests that doing large reorgs works even if the state associated with the // forking point is not available any more. func TestLargeReorgTrieGC(t *testing.T) { - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) // Generate the original common chain segment and the two competing forks m, m2 := stages.Mock(t), stages.Mock(t) shared, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 64, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate shared chain: %v", err) } @@ -1091,7 +1096,7 @@ func TestLargeReorgTrieGC(t *testing.T) { } else { b.SetCoinbase(common.Address{2}) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate original chain: %v", err) } @@ -1102,7 +1107,7 @@ func TestLargeReorgTrieGC(t *testing.T) { b.SetCoinbase(common.Address{3}) b.OffsetTime(-2) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate competitor chain: %v", err) } @@ -1134,8 +1139,6 @@ func TestLargeReorgTrieGC(t *testing.T) { // - https://github.com/ethereum/go-ethereum/issues/18977 // - https://github.com/ethereum/go-ethereum/pull/18988 func TestLowDiffLongChain(t *testing.T) { - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) // Generate a canonical chain to act as the main dataset m := stages.Mock(t) @@ -1367,7 +1370,7 @@ func TestDeleteRecreateSlots(t *testing.T) { t.Fatalf("failed to insert into chain: %v", err) } err = m.DB.View(context.Background(), func(tx kv.Tx) error { - statedb := state.New(state.NewPlainState(tx, 1)) + statedb := state.New(state.NewPlainState(tx, 2)) // If all is correct, then slot 1 and 2 are zero key1 := common.HexToHash("01") @@ -1443,7 +1446,7 @@ func TestDeleteRecreateAccount(t *testing.T) { tx, _ = types.SignTx(types.NewTransaction(1, aa, u256.Num1, 100000, u256.Num1, nil), *types.LatestSignerForChainID(nil), key) b.AddTx(tx) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -1452,7 +1455,7 @@ func TestDeleteRecreateAccount(t *testing.T) { t.Fatalf("failed to insert into chain: %v", err) } err = m.DB.View(context.Background(), func(tx kv.Tx) error { - statedb := state.New(state.NewPlainState(tx, 1)) + statedb := state.New(state.NewPlainState(tx, 2)) // If all is correct, then both slots are zero key1 := common.HexToHash("01") @@ -1620,7 +1623,7 @@ func TestDeleteRecreateSlotsAcrossManyBlocks(t *testing.T) { } expectations = append(expectations, exp) current = exp - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -1759,7 +1762,7 @@ func TestInitThenFailCreateContract(t *testing.T) { u256.Num0, 100000, u256.Num1, nil), *types.LatestSignerForChainID(nil), key) b.AddTx(tx) nonce++ - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -1767,7 +1770,7 @@ func TestInitThenFailCreateContract(t *testing.T) { err = m.DB.View(context.Background(), func(tx kv.Tx) error { // Import the canonical chain - statedb := state.New(state.NewPlainState(tx, 1)) + statedb := state.New(state.NewPlainState(tx, 2)) if got, exp := statedb.GetBalance(aa), uint64(100000); got.Uint64() != exp { t.Fatalf("Genesis err, got %v exp %v", got, exp) } @@ -1777,7 +1780,7 @@ func TestInitThenFailCreateContract(t *testing.T) { if err := m.InsertChain(chain.Slice(0, 1)); err != nil { t.Fatalf("block %d: failed to insert into chain: %v", block.NumberU64(), err) } - statedb = state.New(state.NewPlainState(tx, 0)) + statedb = state.New(state.NewPlainState(tx, 1)) if got, exp := statedb.GetBalance(aa), uint64(100000); got.Uint64() != exp { t.Fatalf("block %d: got %v exp %v", block.NumberU64(), got, exp) } @@ -1902,7 +1905,7 @@ func TestEIP1559Transition(t *testing.T) { addr2 = crypto.PubkeyToAddress(key2.PublicKey) funds = new(uint256.Int).Mul(u256.Num1, new(uint256.Int).SetUint64(params.Ether)) gspec = &core.Genesis{ - Config: params.CalaverasChainConfig, + Config: params.GoerliChainConfig, Alloc: core.GenesisAlloc{ addr1: {Balance: funds.ToBig()}, addr2: {Balance: funds.ToBig()}, @@ -1939,12 +1942,12 @@ func TestEIP1559Transition(t *testing.T) { var chainID uint256.Int chainID.SetFromBig(gspec.Config.ChainID) var tx types.Transaction = &types.DynamicFeeTransaction{ - ChainID: &chainID, CommonTx: types.CommonTx{ - Nonce: 0, - To: &aa, - Gas: 30000, - Data: []byte{}, + ChainID: &chainID, + Nonce: 0, + To: &aa, + Gas: 30000, + Data: []byte{}, }, FeeCap: new(uint256.Int).Mul(new(uint256.Int).SetUint64(5), new(uint256.Int).SetUint64(params.GWei)), Tip: u256.Num2, @@ -1973,7 +1976,7 @@ func TestEIP1559Transition(t *testing.T) { } err = m.DB.View(context.Background(), func(tx kv.Tx) error { - statedb := state.New(state.NewPlainState(tx, 0)) + statedb := state.New(state.NewPlainState(tx, 1)) // 3: Ensure that miner received only the tx's tip. actual := statedb.GetBalance(block.Coinbase()) @@ -2014,7 +2017,7 @@ func TestEIP1559Transition(t *testing.T) { block = chain.Blocks[0] err = m.DB.View(context.Background(), func(tx kv.Tx) error { - statedb := state.New(state.NewPlainState(tx, 0)) + statedb := state.New(state.NewPlainState(tx, 1)) effectiveTip := block.Transactions()[0].GetPrice().Uint64() - block.BaseFee().Uint64() // 6+5: Ensure that miner received only the tx's effective tip. diff --git a/turbo/stages/bodydownload/body_algos.go b/turbo/stages/bodydownload/body_algos.go index 4c5a551063d..c2d392c379b 100644 --- a/turbo/stages/bodydownload/body_algos.go +++ b/turbo/stages/bodydownload/body_algos.go @@ -7,14 +7,15 @@ import ( "math/big" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/common/dbg" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/core/rawdb" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/turbo/adapter" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" "github.com/ledgerwatch/log/v3" ) @@ -26,10 +27,10 @@ const BlockBufferSize = 128 // validated at this point. // It returns 2 errors - first is Validation error (reason to penalize peer and continue processing other // bodies), second is internal runtime error (like network error or db error) -type VerifyUnclesFunc func(peerID string, header *types.Header, uncles []*types.Header) error +type VerifyUnclesFunc func(peerID [64]byte, header *types.Header, uncles []*types.Header) error // UpdateFromDb reads the state of the database and refreshes the state of the body download -func (bd *BodyDownload) UpdateFromDb(db kv.RwTx) (headHeight uint64, headHash common.Hash, headTd256 *uint256.Int, err error) { +func (bd *BodyDownload) UpdateFromDb(db kv.Tx) (headHeight uint64, headHash common.Hash, headTd256 *uint256.Int, err error) { var headerProgress, bodyProgress uint64 headerProgress, err = stages.GetStageProgress(db, stages.Headers) if err != nil { @@ -53,7 +54,7 @@ func (bd *BodyDownload) UpdateFromDb(db kv.RwTx) (headHeight uint64, headHash co bd.deliveriesB[i] = nil bd.requests[i] = nil } - bd.peerMap = make(map[string]int) + bd.peerMap = make(map[[64]byte]int) headHeight = bodyProgress headHash, err = rawdb.ReadCanonicalHash(db, headHeight) if err != nil { @@ -76,7 +77,7 @@ func (bd *BodyDownload) UpdateFromDb(db kv.RwTx) (headHeight uint64, headHash co } // RequestMoreBodies - returns nil if nothing to request -func (bd *BodyDownload) RequestMoreBodies(db kv.Tx, blockNum uint64, currentTime uint64, blockPropagator adapter.BlockPropagator) (*BodyRequest, uint64, error) { +func (bd *BodyDownload) RequestMoreBodies(tx kv.RwTx, blockReader services.FullBlockReader, blockNum uint64, currentTime uint64, blockPropagator adapter.BlockPropagator) (*BodyRequest, uint64, error) { if blockNum < bd.requestedLow { blockNum = bd.requestedLow } @@ -98,7 +99,7 @@ func (bd *BodyDownload) RequestMoreBodies(db kv.Tx, blockNum uint64, currentTime if currentTime < req.waitUntil { continue } - bd.peerMap[string(req.peerID)]++ + bd.peerMap[req.peerID]++ bd.requests[blockNum-bd.requestedLow] = nil } var hash common.Hash @@ -109,17 +110,21 @@ func (bd *BodyDownload) RequestMoreBodies(db kv.Tx, blockNum uint64, currentTime // If this block was requested before, we don't need to fetch the headers from the database the second time header = bd.deliveriesH[blockNum-bd.requestedLow] if header == nil { - return nil, 0, fmt.Errorf("header not found: %w, blockNum=%d, trace=%s", err, blockNum, debug.Callers(7)) + return nil, 0, fmt.Errorf("header not found: %w, blockNum=%d, trace=%s", err, blockNum, dbg.Stack()) } hash = header.Hash() } else { - hash, err = rawdb.ReadCanonicalHash(db, blockNum) + hash, err = rawdb.ReadCanonicalHash(tx, blockNum) if err != nil { - return nil, 0, fmt.Errorf("could not find canonical header: %w, blockNum=%d, trace=%s", err, blockNum, debug.Callers(7)) + return nil, 0, fmt.Errorf("could not find canonical header: %w, blockNum=%d, trace=%s", err, blockNum, dbg.Stack()) + } + + header, err = blockReader.Header(context.Background(), tx, hash, blockNum) + if err != nil { + return nil, 0, fmt.Errorf("header not found: %w, blockNum=%d, trace=%s", err, blockNum, dbg.Stack()) } - header = rawdb.ReadHeader(db, hash, blockNum) if header == nil { - return nil, 0, fmt.Errorf("header not found: %w, blockNum=%d, trace=%s", err, blockNum, debug.Callers(7)) + return nil, 0, fmt.Errorf("header not found: blockNum=%d, hash=%x, trace=%s", blockNum, hash, dbg.Stack()) } if block := bd.prefetchedBlocks.Pop(hash); block != nil { @@ -128,12 +133,13 @@ func (bd *BodyDownload) RequestMoreBodies(db kv.Tx, blockNum uint64, currentTime bd.deliveriesB[blockNum-bd.requestedLow] = block.RawBody() // Calculate the TD of the block (it's not imported yet, so block.Td is not valid) - var td *big.Int - if parent, err := rawdb.ReadTd(db, block.ParentHash(), block.NumberU64()-1); err != nil { + if parent, err := rawdb.ReadTd(tx, block.ParentHash(), block.NumberU64()-1); err != nil { log.Error("Failed to ReadTd", "err", err, "number", block.NumberU64()-1, "hash", block.ParentHash()) } else if parent != nil { - td = new(big.Int).Add(block.Difficulty(), parent) - go blockPropagator(context.Background(), block, td) + if block.Difficulty().Sign() != 0 { // don't propagate proof-of-stake blocks + td := new(big.Int).Add(block.Difficulty(), parent) + go blockPropagator(context.Background(), block, td) + } } else { log.Error("Propagating dangling block", "number", block.Number(), "hash", hash) } @@ -142,7 +148,7 @@ func (bd *BodyDownload) RequestMoreBodies(db kv.Tx, blockNum uint64, currentTime bd.deliveriesH[blockNum-bd.requestedLow] = header if header.UncleHash != types.EmptyUncleHash || header.TxHash != types.EmptyRootHash { // Perhaps we already have this block - block = rawdb.ReadBlock(db, hash, blockNum) + block = rawdb.ReadBlock(tx, hash, blockNum) if block == nil { var doubleHash DoubleHash copy(doubleHash[:], header.UncleHash.Bytes()) @@ -175,7 +181,7 @@ func (bd *BodyDownload) RequestMoreBodies(db kv.Tx, blockNum uint64, currentTime return bodyReq, blockNum, nil } -func (bd *BodyDownload) RequestSent(bodyReq *BodyRequest, timeWithTimeout uint64, peer []byte) { +func (bd *BodyDownload) RequestSent(bodyReq *BodyRequest, timeWithTimeout uint64, peer [64]byte) { for _, blockNum := range bodyReq.BlockNums { if blockNum < bd.requestedLow { continue @@ -189,7 +195,7 @@ func (bd *BodyDownload) RequestSent(bodyReq *BodyRequest, timeWithTimeout uint64 } // DeliverBodies takes the block body received from a peer and adds it to the various data structures -func (bd *BodyDownload) DeliverBodies(txs [][][]byte, uncles [][]*types.Header, lenOfP2PMsg uint64, peerID string) { +func (bd *BodyDownload) DeliverBodies(txs [][][]byte, uncles [][]*types.Header, lenOfP2PMsg uint64, peerID [64]byte) { bd.deliveryCh <- Delivery{txs: txs, uncles: uncles, lenOfP2PMessage: lenOfP2PMsg, peerID: peerID} select { @@ -341,11 +347,11 @@ func (bd *BodyDownload) DeliveryCounts() (float64, float64) { return bd.deliveredCount, bd.wastedCount } -func (bd *BodyDownload) GetPenaltyPeers() [][]byte { - peers := make([][]byte, len(bd.peerMap)) +func (bd *BodyDownload) GetPenaltyPeers() [][64]byte { + peers := make([][64]byte, len(bd.peerMap)) i := 0 for p := range bd.peerMap { - peers[i] = []byte(p) + peers[i] = p i++ } return peers @@ -357,7 +363,7 @@ func (bd *BodyDownload) PrintPeerMap() { fmt.Printf("%s = %d\n", p, n) } fmt.Printf("---------------------------\n") - bd.peerMap = make(map[string]int) + bd.peerMap = make(map[[64]byte]int) } func (bd *BodyDownload) AddToPrefetch(block *types.Block) { @@ -371,3 +377,8 @@ func (bd *BodyDownload) AddToPrefetch(block *types.Block) { } bd.prefetchedBlocks.Add(block) } + +func (bd *BodyDownload) AddMinedBlock(block *types.Block) error { + bd.AddToPrefetch(block) + return nil +} diff --git a/turbo/stages/bodydownload/body_data_struct.go b/turbo/stages/bodydownload/body_data_struct.go index c206e8445cd..56995ea9c4e 100644 --- a/turbo/stages/bodydownload/body_data_struct.go +++ b/turbo/stages/bodydownload/body_data_struct.go @@ -13,7 +13,7 @@ type DoubleHash [2 * common.HashLength]byte const MaxBodiesInRequest = 1024 type Delivery struct { - peerID string + peerID [64]byte txs [][][]byte uncles [][]*types.Header lenOfP2PMessage uint64 @@ -21,7 +21,7 @@ type Delivery struct { // BodyDownload represents the state of body downloading process type BodyDownload struct { - peerMap map[string]int + peerMap map[[64]byte]int requestedMap map[DoubleHash]uint64 DeliveryNotify chan struct{} deliveryCh chan Delivery @@ -44,7 +44,7 @@ type BodyDownload struct { type BodyRequest struct { BlockNums []uint64 Hashes []common.Hash - peerID []byte + peerID [64]byte waitUntil uint64 } @@ -57,7 +57,7 @@ func NewBodyDownload(outstandingLimit int, engine consensus.Engine) *BodyDownloa deliveriesH: make([]*types.Header, outstandingLimit+MaxBodiesInRequest), deliveriesB: make([]*types.RawBody, outstandingLimit+MaxBodiesInRequest), requests: make([]*BodyRequest, outstandingLimit+MaxBodiesInRequest), - peerMap: make(map[string]int), + peerMap: make(map[[64]byte]int), prefetchedBlocks: NewPrefetchedBlocks(), // DeliveryNotify has capacity 1, and it is also used so that senders never block // This makes this channel a mailbox with no more than one letter in it, meaning diff --git a/turbo/stages/bodydownload/prefetched_blocks.go b/turbo/stages/bodydownload/prefetched_blocks.go index 8936e80d642..bcce88652e9 100644 --- a/turbo/stages/bodydownload/prefetched_blocks.go +++ b/turbo/stages/bodydownload/prefetched_blocks.go @@ -12,7 +12,9 @@ type PrefetchedBlocks struct { } func NewPrefetchedBlocks() *PrefetchedBlocks { - cache, err := lru.New(1000) + // Setting this to 2500 as `erigon import` imports blocks in batches of 2500 + // and the import command makes use of PrefetchedBlocks. + cache, err := lru.New(2500) if err != nil { panic("error creating prefetching cache for blocks") } diff --git a/turbo/stages/genesis_test.go b/turbo/stages/genesis_test.go index 6fd443cf676..5c6877b6549 100644 --- a/turbo/stages/genesis_test.go +++ b/turbo/stages/genesis_test.go @@ -44,22 +44,15 @@ func TestDefaultGenesisBlock(t *testing.T) { var err error block, _, err = core.DefaultRopstenGenesisBlock().ToBlock() if err != nil { - t.Errorf("error: %w", err) + t.Errorf("error: %v", err) } if block.Hash() != params.RopstenGenesisHash { t.Errorf("wrong ropsten genesis hash, got %v, want %v", block.Hash(), params.RopstenGenesisHash) } - block, _, err = core.DefaultCalaverasGenesisBlock().ToBlock() - if err != nil { - t.Errorf("error: %w", err) - } - if block.Hash() != params.CalaverasGenesisHash { - t.Errorf("wrong ropsten genesis hash, got %v, want %v", block.Hash(), params.RopstenGenesisHash) - } block, _, err = core.DefaultSokolGenesisBlock().ToBlock() if err != nil { - t.Errorf("error: %w", err) + t.Errorf("error: %v", err) } if block.Root() != params.SokolGenesisStateRoot { t.Errorf("wrong sokol genesis state root, got %v, want %v", block.Root(), params.SokolGenesisStateRoot) @@ -67,6 +60,17 @@ func TestDefaultGenesisBlock(t *testing.T) { if block.Hash() != params.SokolGenesisHash { t.Errorf("wrong sokol genesis hash, got %v, want %v", block.Hash(), params.SokolGenesisHash) } + + block, _, err = core.DefaultFermionGenesisBlock().ToBlock() + if err != nil { + t.Errorf("error: %v", err) + } + if block.Root() != params.FermionGenesisStateRoot { + t.Errorf("wrong fermion genesis state root, got %v, want %v", block.Root(), params.FermionGenesisStateRoot) + } + if block.Hash() != params.FermionGenesisHash { + t.Errorf("wrong fermion genesis hash, got %v, want %v", block.Hash(), params.FermionGenesisHash) + } } func TestSokolHeaderRLP(t *testing.T) { diff --git a/turbo/stages/headerdownload/header_algo_test.go b/turbo/stages/headerdownload/header_algo_test.go index 5f09a3a07a2..27ccf854f16 100644 --- a/turbo/stages/headerdownload/header_algo_test.go +++ b/turbo/stages/headerdownload/header_algo_test.go @@ -1,23 +1,61 @@ package headerdownload import ( + "context" "math/big" "testing" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/crypto" + "github.com/ledgerwatch/erigon/params" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" ) func TestInserter1(t *testing.T) { - _, tx := memdb.NewTestTx(t) - // Set up parent difficulty - if err := rawdb.WriteTd(tx, common.Hash{}, 4, big.NewInt(0)); err != nil { - t.Fatalf("write parent diff: %v", err) + funds := big.NewInt(1000000000) + key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address := crypto.PubkeyToAddress(key.PublicKey) + chainConfig := params.AllEthashProtocolChanges + gspec := &core.Genesis{ + Config: chainConfig, + Alloc: core.GenesisAlloc{ + address: {Balance: funds}, + }, } - hi := NewHeaderInserter("headers", big.NewInt(0), 0) - if err := hi.FeedHeader(tx, &types.Header{Number: big.NewInt(5), Difficulty: big.NewInt(1)}, 5); err != nil { - t.Errorf("feed empty header: %v", err) + db := memdb.NewTestDB(t) + defer db.Close() + _, genesis, err := core.CommitGenesisBlock(db, gspec) + if err != nil { + t.Fatal(err) + } + var tx kv.RwTx + if tx, err = db.BeginRw(context.Background()); err != nil { + t.Fatal(err) + } + defer tx.Rollback() + hi := NewHeaderInserter("headers", big.NewInt(0), 0, snapshotsync.NewBlockReader()) + h1 := types.Header{ + Number: big.NewInt(1), + Difficulty: big.NewInt(10), + ParentHash: genesis.Hash(), + } + h1Hash := h1.Hash() + h2 := types.Header{ + Number: big.NewInt(2), + Difficulty: big.NewInt(1010), + ParentHash: h1Hash, + } + h2Hash := h2.Hash() + data1, _ := rlp.EncodeToBytes(&h1) + if _, err = hi.FeedHeaderPoW(tx, snapshotsync.NewBlockReader(), &h1, data1, h1Hash, 1); err != nil { + t.Errorf("feed empty header 1: %v", err) + } + data2, _ := rlp.EncodeToBytes(&h2) + if _, err = hi.FeedHeaderPoW(tx, snapshotsync.NewBlockReader(), &h2, data2, h2Hash, 2); err != nil { + t.Errorf("feed empty header 2: %v", err) } } diff --git a/turbo/stages/headerdownload/header_algos.go b/turbo/stages/headerdownload/header_algos.go index aacbc632943..4f6b777c05e 100644 --- a/turbo/stages/headerdownload/header_algos.go +++ b/turbo/stages/headerdownload/header_algos.go @@ -14,7 +14,12 @@ import ( "strings" "time" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/turbo/services" + "github.com/ledgerwatch/log/v3" + "golang.org/x/exp/slices" + "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" "github.com/ledgerwatch/erigon/consensus" @@ -23,87 +28,90 @@ import ( "github.com/ledgerwatch/erigon/eth/stagedsync/stages" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/log/v3" + "github.com/ledgerwatch/erigon/turbo/engineapi" ) +const POSPandaBanner = ` + + ,,, ,,, ,,, ,,, + ;" ^; ;' ", ;" ^; ;' ", + ; s$$$$$$$s ; ; s$$$$$$$s ; + , ss$$$$$$$$$$s ,' ooooooooo. .oooooo. .oooooo..o , ss$$$$$$$$$$s ,' + ;s$$$$$$$$$$$$$$$ '888 'Y88. d8P' 'Y8b d8P' 'Y8 ;s$$$$$$$$$$$$$$$ + $$$$$$$$$$$$$$$$$$ 888 .d88'888 888Y88bo. $$$$$$$$$$$$$$$$$$ + $$$$P""Y$$$Y""W$$$$$ 888ooo88P' 888 888 '"Y8888o. $$$$P""Y$$$Y""W$$$$$ + $$$$ p"$$$"q $$$$$ 888 888 888 '"Y88b $$$$ p"$$$"q $$$$$ + $$$$ .$$$$$. $$$$ 888 '88b d88'oo .d8P $$$$ .$$$$$. $$$$ + $$DcaU$$$$$$$$$$ o888o 'Y8bood8P' 8""88888P' $$DcaU$$$$$$$$$$ + "Y$$$"*"$$$Y" "Y$$$"*"$$$Y" + "$b.$$" "$b.$$" + .o. . o8o . .o8 + .888. .o8 '"' .o8 "888 + .8"888. .ooooo. .o888oooooo oooo ooo .oooo. .o888oo .ooooo. .oooo888 + .8' '888. d88' '"Y8 888 '888 '88. .8' 'P )88b 888 d88' '88bd88' '888 + .88ooo8888. 888 888 888 '88..8' .oP"888 888 888ooo888888 888 + .8' '888. 888 .o8 888 . 888 '888' d8( 888 888 .888 .o888 888 + o88o o8888o'Y8bod8P' "888"o888o '8' 'Y888""8o "888"'Y8bod8P''Y8bod88P" + +` + // Implements sort.Interface so we can sort the incoming header in the message by block height -type HeadersByBlockHeight []*types.Header +type HeadersReverseSort []ChainSegmentHeader -func (h HeadersByBlockHeight) Len() int { +func (h HeadersReverseSort) Len() int { return len(h) } -func (h HeadersByBlockHeight) Less(i, j int) bool { +func (h HeadersReverseSort) Less(i, j int) bool { // Note - the ordering is the inverse ordering of the block heights - return h[i].Number.Cmp(h[j].Number) > 0 + if h[i].Number != h[j].Number { + return h[i].Number > h[j].Number + } + return bytes.Compare(h[i].Hash[:], h[j].Hash[:]) > 0 } -func (h HeadersByBlockHeight) Swap(i, j int) { +func (h HeadersReverseSort) Swap(i, j int) { h[i], h[j] = h[j], h[i] } -// SplitIntoSegments converts message containing headers into a collection of chain segments -func (hd *HeaderDownload) SplitIntoSegments(headersRaw [][]byte, msg []*types.Header) ([]*ChainSegment, Penalty, error) { - hd.lock.RLock() - defer hd.lock.RUnlock() - sort.Sort(HeadersByBlockHeight(msg)) - // Now all headers are order from the highest block height to the lowest - var segments []*ChainSegment // Segments being built - segmentMap := make(map[common.Hash]int) // Mapping of the header hash to the index of the chain segment it belongs - childrenMap := make(map[common.Hash][]*types.Header) // Mapping parent hash to the children - dedupMap := make(map[common.Hash]struct{}) // Map used for detecting duplicate headers - for i, header := range msg { - headerHash := header.Hash() - if _, bad := hd.badHeaders[headerHash]; bad { - return nil, BadBlockPenalty, nil - } - if _, duplicate := dedupMap[headerHash]; duplicate { - return nil, DuplicateHeaderPenalty, nil - } - dedupMap[headerHash] = struct{}{} - var segmentIdx int - children := childrenMap[headerHash] - for _, child := range children { - if valid, penalty := hd.childParentValid(child, header); !valid { - return nil, penalty, nil - } - } - if len(children) == 1 { - // Single child, extract segmentIdx - segmentIdx = segmentMap[headerHash] - } else { - // No children, or more than one child, create new segment - segmentIdx = len(segments) - segments = append(segments, &ChainSegment{}) - } - segments[segmentIdx].Headers = append(segments[segmentIdx].Headers, header) - segments[segmentIdx].HeadersRaw = append(segments[segmentIdx].HeadersRaw, headersRaw[i]) - segmentMap[header.ParentHash] = segmentIdx - siblings := childrenMap[header.ParentHash] - siblings = append(siblings, header) - childrenMap[header.ParentHash] = siblings - } - return segments, NoPenalty, nil +// Implements sort.Interface so we can sort the incoming header in the message by block height +type HeadersSort []ChainSegmentHeader + +func (h HeadersSort) Len() int { + return len(h) } -// Checks whether child-parent relationship between two headers is correct -// (excluding Proof Of Work validity) -func (hd *HeaderDownload) childParentValid(child, parent *types.Header) (bool, Penalty) { - if parent.Number.Uint64()+1 != child.Number.Uint64() { - return false, WrongChildBlockHeightPenalty +func (h HeadersSort) Less(i, j int) bool { + // Note - the ordering is the inverse ordering of the block heights + if h[i].Number != h[j].Number { + return h[i].Number < h[j].Number } - return true, NoPenalty + return bytes.Compare(h[i].Hash[:], h[j].Hash[:]) < 0 +} + +func (h HeadersSort) Swap(i, j int) { + h[i], h[j] = h[j], h[i] } // SingleHeaderAsSegment converts message containing 1 header into one singleton chain segment -func (hd *HeaderDownload) SingleHeaderAsSegment(headerRaw []byte, header *types.Header) ([]*ChainSegment, Penalty, error) { +func (hd *HeaderDownload) SingleHeaderAsSegment(headerRaw []byte, header *types.Header, penalizePoSBlocks bool) ([]ChainSegmentHeader, Penalty, error) { hd.lock.RLock() defer hd.lock.RUnlock() - headerHash := header.Hash() + + headerHash := types.RawRlpHash(headerRaw) if _, bad := hd.badHeaders[headerHash]; bad { return nil, BadBlockPenalty, nil } - return []*ChainSegment{{HeadersRaw: [][]byte{headerRaw}, Headers: []*types.Header{header}}}, NoPenalty, nil + if penalizePoSBlocks && header.Difficulty.Sign() == 0 { + return nil, NewBlockGossipAfterMergePenalty, nil + } + h := ChainSegmentHeader{ + Header: header, + HeaderRaw: headerRaw, + Hash: headerHash, + Number: header.Number.Uint64(), + } + return []ChainSegmentHeader{h}, NoPenalty, nil } // ReportBadHeader - @@ -111,6 +119,10 @@ func (hd *HeaderDownload) ReportBadHeader(headerHash common.Hash) { hd.lock.Lock() defer hd.lock.Unlock() hd.badHeaders[headerHash] = struct{}{} + // Find the link, remove it and all its descendands from all the queues + if link, ok := hd.links[headerHash]; ok { + hd.removeUpwards(link) + } } func (hd *HeaderDownload) IsBadHeader(headerHash common.Hash) bool { @@ -120,244 +132,113 @@ func (hd *HeaderDownload) IsBadHeader(headerHash common.Hash) bool { return ok } -// FindAnchors attempts to find anchors to which given chain segment can be attached to -func (hd *HeaderDownload) findAnchors(segment *ChainSegment) (found bool, start int) { - // Walk the segment from children towards parents - for i, header := range segment.Headers { - // Check if the header can be attached to an anchor of a working tree - if _, attaching := hd.anchors[header.Hash()]; attaching { - return true, i - } - } - return false, 0 +// See https://hackmd.io/GDc0maGsQeKfP8o2C7L52w +func (hd *HeaderDownload) SetPoSDownloaderTip(hash common.Hash) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.posDownloaderTip = hash } - -// FindLink attempts to find a non-persisted link that given chain segment can be attached to. -func (hd *HeaderDownload) findLink(segment *ChainSegment, start int) (found bool, end int) { - if _, duplicate := hd.getLink(segment.Headers[start].Hash()); duplicate { - return false, 0 - } - // Walk the segment from children towards parents - for i, header := range segment.Headers[start:] { - // Check if the header can be attached to any links - if _, attaching := hd.getLink(header.ParentHash); attaching { - return true, start + i + 1 - } - } - return false, len(segment.Headers) +func (hd *HeaderDownload) PoSDownloaderTip() common.Hash { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.posDownloaderTip +} +func (hd *HeaderDownload) ReportBadHeaderPoS(badHeader, lastValidAncestor common.Hash) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.badPoSHeaders[badHeader] = lastValidAncestor +} +func (hd *HeaderDownload) IsBadHeaderPoS(tipHash common.Hash) (bad bool, lastValidAncestor common.Hash) { + hd.lock.RLock() + defer hd.lock.RUnlock() + lastValidAncestor, bad = hd.badPoSHeaders[tipHash] + return } -func (hd *HeaderDownload) removeUpwards(toRemove []*Link) { +func (hd *HeaderDownload) removeUpwards(link *Link) { + if link == nil { + return + } + var toRemove []*Link = []*Link{link} for len(toRemove) > 0 { removal := toRemove[len(toRemove)-1] toRemove = toRemove[:len(toRemove)-1] - delete(hd.links, removal.header.Hash()) - heap.Remove(hd.linkQueue, removal.idx) - toRemove = append(toRemove, removal.next...) - } -} - -func (hd *HeaderDownload) markPreverified(link *Link) { - // Go through all parent links that are not preveried and mark them too - for link != nil && !link.preverified { - link.preverified = true - link = hd.links[link.header.ParentHash] + delete(hd.links, removal.hash) + hd.moveLinkToQueue(removal, NoQueue) + for child := removal.fChild; child != nil; child, child.next = child.next, nil { + toRemove = append(toRemove, child) + } } } -// ExtendUp extends a working tree up from the link, using given chain segment -func (hd *HeaderDownload) extendUp(segment *ChainSegment, start, end int) error { - // Find attachment link again - linkHeader := segment.Headers[end-1] - attachmentLink, attaching := hd.getLink(linkHeader.ParentHash) - if !attaching { - return fmt.Errorf("extendUp attachment link not found for %x", linkHeader.ParentHash) - } - if attachmentLink.preverified && len(attachmentLink.next) > 0 { - return fmt.Errorf("cannot extendUp from preverified link %d with children", attachmentLink.blockHeight) +func (hd *HeaderDownload) MarkAllVerified() { + hd.lock.Lock() + defer hd.lock.Unlock() + for hd.insertQueue.Len() > 0 { + link := hd.insertQueue[0] + if !link.verified { + link.linked = true + link.verified = true + } } - // Iterate over headers backwards (from parents towards children) - prevLink := attachmentLink - for i := end - 1; i >= start; i-- { - link := hd.addHeaderAsLink(segment.Headers[i], false /* persisted */) - prevLink.next = append(prevLink.next, link) - prevLink = link - if _, ok := hd.preverifiedHashes[link.hash]; ok { - hd.markPreverified(link) + for hd.linkQueue.Len() > 0 { + link := hd.linkQueue[0] + if !link.verified { + link.linked = true + link.verified = true + hd.moveLinkToQueue(link, InsertQueueID) } } +} - if _, bad := hd.badHeaders[attachmentLink.hash]; !bad && attachmentLink.persisted { - link := hd.links[linkHeader.Hash()] - hd.insertList = append(hd.insertList, link) - } - return nil +func (hd *HeaderDownload) removeAnchor(anchor *Anchor) { + // Anchor is removed from the map, and from the priority queue + delete(hd.anchors, anchor.parentHash) + heap.Remove(hd.anchorQueue, anchor.idx) + anchor.idx = -1 } -// ExtendDown extends some working trees down from the anchor, using given chain segment -// it creates a new anchor and collects all the links from the attached anchors to it -func (hd *HeaderDownload) extendDown(segment *ChainSegment, start, end int) (bool, error) { - // Find attachment anchor again - anchorHeader := segment.Headers[start] - if anchor, attaching := hd.anchors[anchorHeader.Hash()]; attaching { - anchorPreverified := false - for _, link := range anchor.links { - if link.preverified { - anchorPreverified = true - break - } +func (hd *HeaderDownload) pruneLinkQueue() { + for hd.linkQueue.Len() > hd.linkLimit { + link := heap.Pop(&hd.linkQueue).(*Link) + delete(hd.links, link.hash) + for child := link.fChild; child != nil; child, child.next = child.next, nil { } - newAnchorHeader := segment.Headers[end-1] - var newAnchor *Anchor - newAnchor, preExisting := hd.anchors[newAnchorHeader.ParentHash] - if !preExisting { - newAnchor = &Anchor{ - parentHash: newAnchorHeader.ParentHash, - timestamp: 0, - peerID: anchor.peerID, - blockHeight: newAnchorHeader.Number.Uint64(), + if parentLink, ok := hd.links[link.header.ParentHash]; ok { + var prevChild *Link + for child := parentLink.fChild; child != nil && child != link; child = child.next { + prevChild = child } - if newAnchor.blockHeight > 0 { - hd.anchors[newAnchorHeader.ParentHash] = newAnchor - heap.Push(hd.anchorQueue, newAnchor) + if prevChild == nil { + parentLink.fChild = link.next + } else { + prevChild.next = link.next } } - - // Anchor is removed from the map, but not from the anchorQueue - // This is because it is hard to find the index under which the anchor is stored in the anchorQueue - // But removal will happen anyway, in th function RequestMoreHeaders, if it disapppears from the map - delete(hd.anchors, anchor.parentHash) - // Add all headers in the segments as links to this anchor - var prevLink *Link - for i := end - 1; i >= start; i-- { - link := hd.addHeaderAsLink(segment.Headers[i], false /* pesisted */) - if prevLink == nil { - newAnchor.links = append(newAnchor.links, link) + if anchor, ok := hd.anchors[link.header.ParentHash]; ok { + var prevChild *Link + for child := anchor.fLink; child != nil && child != link; child = child.next { + prevChild = child + } + if prevChild == nil { + anchor.fLink = link.next } else { - prevLink.next = append(prevLink.next, link) + prevChild.next = link.next } - prevLink = link - if !anchorPreverified { - if _, ok := hd.preverifiedHashes[link.hash]; ok { - hd.markPreverified(link) - } + if anchor.fLink == nil { + hd.removeAnchor(anchor) } } - prevLink.next = anchor.links - anchor.links = nil - if anchorPreverified { - // Mark the entire segment as preverified - hd.markPreverified(prevLink) - } - return !preExisting, nil - } - return false, fmt.Errorf("extendDown attachment anchors not found for %x", anchorHeader.Hash()) -} - -// Connect connects some working trees using anchors of some, and a link of another -func (hd *HeaderDownload) connect(segment *ChainSegment, start, end int) ([]PenaltyItem, error) { - // Find attachment link again - linkHeader := segment.Headers[end-1] - // Find attachement anchors again - anchorHeader := segment.Headers[start] - attachmentLink, ok1 := hd.getLink(linkHeader.ParentHash) - if !ok1 { - return nil, fmt.Errorf("connect attachment link not found for %x", linkHeader.ParentHash) - } - if attachmentLink.preverified && len(attachmentLink.next) > 0 { - return nil, fmt.Errorf("cannot connect to preverified link %d with children", attachmentLink.blockHeight) - } - anchor, ok2 := hd.anchors[anchorHeader.Hash()] - if !ok2 { - return nil, fmt.Errorf("connect attachment anchors not found for %x", anchorHeader.Hash()) - } - anchorPreverified := false - for _, link := range anchor.links { - if link.preverified { - anchorPreverified = true - break - } - } - // Anchor is removed from the map, but not from the anchorQueue - // This is because it is hard to find the index under which the anchor is stored in the anchorQueue - // But removal will happen anyway, in th function RequestMoreHeaders, if it disapppears from the map - delete(hd.anchors, anchor.parentHash) - // Iterate over headers backwards (from parents towards children) - prevLink := attachmentLink - for i := end - 1; i >= start; i-- { - link := hd.addHeaderAsLink(segment.Headers[i], false /* persisted */) - prevLink.next = append(prevLink.next, link) - prevLink = link - if !anchorPreverified { - if _, ok := hd.preverifiedHashes[link.hash]; ok { - hd.markPreverified(link) - } - } - } - prevLink.next = anchor.links - anchor.links = nil - if anchorPreverified { - // Mark the entire segment as preverified - hd.markPreverified(prevLink) - } - var penalties []PenaltyItem - if _, bad := hd.badHeaders[attachmentLink.hash]; bad { - hd.invalidateAnchor(anchor) - penalties = append(penalties, PenaltyItem{Penalty: AbandonedAnchorPenalty, PeerID: anchor.peerID}) - } else if attachmentLink.persisted { - link := hd.links[linkHeader.Hash()] - hd.insertList = append(hd.insertList, link) - } - return penalties, nil -} - -// if anchor will be abandoned - given peerID will get Penalty -func (hd *HeaderDownload) newAnchor(segment *ChainSegment, start, end int, peerID string) (bool, error) { - anchorHeader := segment.Headers[end-1] - - var anchor *Anchor - anchor, preExisting := hd.anchors[anchorHeader.ParentHash] - if !preExisting { - if anchorHeader.Number.Uint64() < hd.highestInDb { - return false, fmt.Errorf("new anchor too far in the past: %d, latest header in db: %d", anchorHeader.Number.Uint64(), hd.highestInDb) - } - if len(hd.anchors) >= hd.anchorLimit { - return false, fmt.Errorf("too many anchors: %d, limit %d", len(hd.anchors), hd.anchorLimit) - } - anchor = &Anchor{ - parentHash: anchorHeader.ParentHash, - peerID: peerID, - timestamp: 0, - blockHeight: anchorHeader.Number.Uint64(), - } - hd.anchors[anchorHeader.ParentHash] = anchor - heap.Push(hd.anchorQueue, anchor) - } - // Iterate over headers backwards (from parents towards children) - var prevLink *Link - for i := end - 1; i >= start; i-- { - header := segment.Headers[i] - link := hd.addHeaderAsLink(header, false /* persisted */) - if prevLink == nil { - anchor.links = append(anchor.links, link) - } else { - prevLink.next = append(prevLink.next, link) - } - prevLink = link - if _, ok := hd.preverifiedHashes[link.hash]; ok { - hd.markPreverified(link) - } } - return !preExisting, nil } -func (hd *HeaderDownload) AnchorState() string { +func (hd *HeaderDownload) LogAnchorState() { hd.lock.RLock() defer hd.lock.RUnlock() - return hd.anchorState() + hd.logAnchorState() } -func (hd *HeaderDownload) anchorState() string { +func (hd *HeaderDownload) logAnchorState() { //nolint:prealloc var ss []string for anchorParent, anchor := range hd.anchors { @@ -366,7 +247,9 @@ func (hd *HeaderDownload) anchorState() string { // Try to figure out end var end uint64 var searchList []*Link - searchList = append(searchList, anchor.links...) + for child := anchor.fLink; child != nil; child = child.next { + searchList = append(searchList, child) + } var bs []int for len(searchList) > 0 { link := searchList[len(searchList)-1] @@ -374,13 +257,13 @@ func (hd *HeaderDownload) anchorState() string { end = link.blockHeight } searchList = searchList[:len(searchList)-1] - if len(link.next) > 0 { - searchList = append(searchList, link.next...) + for child := link.fChild; child != nil; child = child.next { + searchList = append(searchList, child) } bs = append(bs, int(link.blockHeight)) } var sbb strings.Builder - sort.Ints(bs) + slices.Sort(bs) for j, b := range bs { if j == 0 { sbb.WriteString(fmt.Sprintf("%d", b)) @@ -410,74 +293,65 @@ func (hd *HeaderDownload) anchorState() string { } sb.WriteString(fmt.Sprintf("-%d links=%d (%s)}", end, len(bs), sbb.String())) sb.WriteString(fmt.Sprintf(" => %x", anchorParent)) + sb.WriteString(fmt.Sprintf(", anchorQueue.idx=%d", anchor.idx)) ss = append(ss, sb.String()) } sort.Strings(ss) - return strings.Join(ss, "\n") -} - -func InitPreverifiedHashes(chain string) (map[common.Hash]struct{}, uint64) { - var encodings []string - var height uint64 - switch chain { - case params.MainnetChainName: - encodings = mainnetPreverifiedHashes - height = mainnetPreverifiedHeight - case params.RopstenChainName: - encodings = ropstenPreverifiedHashes - height = ropstenPreverifiedHeight - default: - log.Warn("Preverified hashes not found for", "chain", chain) - return nil, 0 + log.Info("Queue sizes", "anchors", hd.anchorQueue.Len(), "links", hd.linkQueue.Len(), "persisted", hd.persistedLinkQueue.Len()) + for _, s := range ss { + log.Info(s) } - return DecodeHashes(encodings), height -} - -func DecodeHashes(encodings []string) map[common.Hash]struct{} { - hashes := make(map[common.Hash]struct{}, len(encodings)) - - for _, encoding := range encodings { - hashes[common.HexToHash(encoding)] = struct{}{} - } - - return hashes -} - -func (hd *HeaderDownload) SetPreverifiedHashes(preverifiedHashes map[common.Hash]struct{}, preverifiedHeight uint64) { - hd.lock.Lock() - defer hd.lock.Unlock() - hd.preverifiedHashes = preverifiedHashes - hd.preverifiedHeight = preverifiedHeight } func (hd *HeaderDownload) RecoverFromDb(db kv.RoDB) error { hd.lock.Lock() defer hd.lock.Unlock() + + logEvery := time.NewTicker(30 * time.Second) + defer logEvery.Stop() + // Drain persistedLinksQueue and remove links for hd.persistedLinkQueue.Len() > 0 { - link := heap.Pop(hd.persistedLinkQueue).(*Link) + link := heap.Pop(&hd.persistedLinkQueue).(*Link) delete(hd.links, link.hash) + for child := link.fChild; child != nil; child, child.next = child.next, nil { + } } err := db.View(context.Background(), func(tx kv.Tx) error { c, err := tx.Cursor(kv.Headers) if err != nil { return err } + hd.highestInDb, err = stages.GetStageProgress(tx, stages.Headers) + if err != nil { + return err + } // Take hd.persistedLinkLimit headers (with the highest heights) as links for k, v, err := c.Last(); k != nil && hd.persistedLinkQueue.Len() < hd.persistedLinkLimit; k, v, err = c.Prev() { if err != nil { return err } - var h types.Header - if err = rlp.DecodeBytes(v, &h); err != nil { + var header types.Header + if err = rlp.DecodeBytes(v, &header); err != nil { return err } - hd.addHeaderAsLink(&h, true /* persisted */) - } - hd.highestInDb, err = stages.GetStageProgress(tx, stages.Headers) - if err != nil { - return err + if header.Number.Uint64() <= hd.highestInDb { + h := ChainSegmentHeader{ + HeaderRaw: v, + Header: &header, + Hash: types.RawRlpHash(v), + Number: header.Number.Uint64(), + } + hd.addHeaderAsLink(h, true /* persisted */) + } + + select { + case <-logEvery.C: + log.Info("recover headers from db", "left", hd.persistedLinkLimit-hd.persistedLinkQueue.Len()) + default: + } } + return nil }) if err != nil { @@ -499,10 +373,12 @@ func (hd *HeaderDownload) ReadProgressFromDb(tx kv.RwTx) (err error) { return nil } -func (hd *HeaderDownload) invalidateAnchor(anchor *Anchor) { - log.Warn("Invalidating anchor for suspected unavailability", "height", anchor.blockHeight) - delete(hd.anchors, anchor.parentHash) - hd.removeUpwards(anchor.links) +func (hd *HeaderDownload) invalidateAnchor(anchor *Anchor, reason string) { + log.Debug("Invalidating anchor", "height", anchor.blockHeight, "hash", anchor.parentHash, "reason", reason) + hd.removeAnchor(anchor) + for child := anchor.fLink; child != nil; child, child.next = child.next, nil { + hd.removeUpwards(child) + } } func (hd *HeaderDownload) RequestMoreHeaders(currentTime uint64) (*HeaderRequest, []PenaltyItem) { @@ -510,128 +386,294 @@ func (hd *HeaderDownload) RequestMoreHeaders(currentTime uint64) (*HeaderRequest defer hd.lock.Unlock() var penalties []PenaltyItem if hd.anchorQueue.Len() == 0 { - log.Debug("Empty anchor queue") + log.Trace("Empty anchor queue") return nil, penalties } for hd.anchorQueue.Len() > 0 { anchor := (*hd.anchorQueue)[0] - if _, ok := hd.anchors[anchor.parentHash]; ok { - if anchor.timestamp > currentTime { - // Anchor not ready for re-request yet - return nil, penalties - } - if anchor.timeouts < 10 { - return &HeaderRequest{Hash: anchor.parentHash, Number: anchor.blockHeight - 1, Length: 192, Skip: 0, Reverse: true}, penalties - } else { - // Ancestors of this anchor seem to be unavailable, invalidate and move on - hd.invalidateAnchor(anchor) - penalties = append(penalties, PenaltyItem{Penalty: AbandonedAnchorPenalty, PeerID: anchor.peerID}) - } + // Only process the anchors for which the nextRetryTime has already come + if anchor.nextRetryTime > currentTime { + return nil, penalties } - // Anchor disappeared or unavailable, pop from the queue and move on - heap.Remove(hd.anchorQueue, 0) + if anchor.timeouts < 10 { + // Produce a header request that would extend this anchor (add parent, parent of parent, etc.) + return &HeaderRequest{ + Anchor: anchor, + Hash: anchor.parentHash, + Number: anchor.blockHeight - 1, + Length: 192, + Skip: 0, + Reverse: true, + }, penalties + } + // Ancestors of this anchor seem to be unavailable, invalidate and move on + hd.invalidateAnchor(anchor, "suspected unavailability") + penalties = append(penalties, PenaltyItem{Penalty: AbandonedAnchorPenalty, PeerID: anchor.peerID}) } return nil, penalties } -func (hd *HeaderDownload) SentRequest(req *HeaderRequest, currentTime, timeout uint64) { +func (hd *HeaderDownload) requestMoreHeadersForPOS(currentTime uint64) (timeout bool, request *HeaderRequest, penalties []PenaltyItem) { + anchor := hd.posAnchor + if anchor == nil { + log.Trace("No PoS anchor") + return + } + + // Only process the anchors for which the nextRetryTime has already come + if anchor.nextRetryTime > currentTime { + return + } + + timeout = anchor.timeouts >= 10 + if timeout { + penalties = []PenaltyItem{{Penalty: AbandonedAnchorPenalty, PeerID: anchor.peerID}} + return + } + + // Request ancestors + log.Info("Requested", "anchor", anchor.parentHash) + request = &HeaderRequest{ + Anchor: anchor, + Hash: anchor.parentHash, + Number: 0, // Since posAnchor may be an estimate, do not specify it here + Length: 192, + Skip: 0, + Reverse: true, + } + return +} + +func (hd *HeaderDownload) UpdateStats(req *HeaderRequest, skeleton bool) { + hd.lock.Lock() + defer hd.lock.Unlock() + if skeleton { + hd.stats.SkeletonRequests++ + if hd.stats.SkeletonReqMinBlock == 0 || req.Number < hd.stats.SkeletonReqMinBlock { + hd.stats.SkeletonReqMinBlock = req.Number + } + if req.Number+req.Length*req.Skip > hd.stats.SkeletonReqMaxBlock { + hd.stats.SkeletonReqMaxBlock = req.Number + req.Length*req.Skip + } + } else { + hd.stats.Requests++ + // We know that req is reverse request, with Skip == 0, therefore comparing Number with reqMax + if req.Number > hd.stats.ReqMaxBlock { + hd.stats.ReqMaxBlock = req.Number + } + if hd.stats.ReqMinBlock == 0 || req.Number < hd.stats.ReqMinBlock+req.Length { + if req.Number >= req.Length { + hd.stats.ReqMinBlock = req.Number - req.Length + } + } + } + +} + +func (hd *HeaderDownload) UpdateRetryTime(req *HeaderRequest, currentTime, timeout uint64) { hd.lock.Lock() defer hd.lock.Unlock() - anchor, ok := hd.anchors[req.Hash] - if !ok { + if req.Anchor.idx == -1 { + // Anchor has already been deleted return } - anchor.timeouts++ - anchor.timestamp = currentTime + timeout - heap.Fix(hd.anchorQueue, 0) + req.Anchor.timeouts++ + req.Anchor.nextRetryTime = currentTime + timeout + heap.Fix(hd.anchorQueue, req.Anchor.idx) } func (hd *HeaderDownload) RequestSkeleton() *HeaderRequest { hd.lock.RLock() defer hd.lock.RUnlock() - log.Debug("Request skeleton", "anchors", len(hd.anchors), "top seen height", hd.topSeenHeight, "highestInDb", hd.highestInDb) - if len(hd.anchors) > 16 { - return nil // Need to be below anchor threshold to produce skeleton request - } + log.Debug("Request skeleton", "anchors", len(hd.anchors), "top seen height", hd.topSeenHeightPoW, "highestInDb", hd.highestInDb) stride := uint64(8 * 192) - if hd.topSeenHeight < hd.highestInDb+stride { - return nil - } - length := (hd.topSeenHeight - hd.highestInDb) / stride - if length > 192 { - length = 192 - } - return &HeaderRequest{Number: hd.highestInDb + stride, Length: length, Skip: stride, Reverse: false} + strideHeight := hd.highestInDb + stride + var length uint64 = 192 + return &HeaderRequest{Number: strideHeight, Length: length, Skip: stride - 1, Reverse: false} } -// InsertHeaders attempts to insert headers into the database, verifying them first -// It returns true in the first return value if the system is "in sync" -func (hd *HeaderDownload) InsertHeaders(hf func(header *types.Header, blockHeight uint64) error, logPrefix string, logChannel <-chan time.Time) (bool, error) { +func (hd *HeaderDownload) VerifyHeader(header *types.Header) error { + return hd.engine.VerifyHeader(hd.consensusHeaderReader, header, true /* seal */) +} + +type FeedHeaderFunc = func(header *types.Header, headerRaw []byte, hash common.Hash, blockHeight uint64) (td *big.Int, err error) + +func (hd *HeaderDownload) InsertHeader(hf FeedHeaderFunc, terminalTotalDifficulty *big.Int, logPrefix string, logChannel <-chan time.Time) (bool, bool, error) { hd.lock.Lock() defer hd.lock.Unlock() - var linksInFuture []*Link // Here we accumulate links that fail validation as "in the future" - for len(hd.insertList) > 0 { - // Make sure long insertions do not appear as a stuck stage 1 - select { - case <-logChannel: - log.Info(fmt.Sprintf("[%s] Inserting headers", logPrefix), "progress", hd.highestInDb) - default: + if hd.insertQueue.Len() > 0 && hd.insertQueue[0].blockHeight <= hd.highestInDb+1 { + link := hd.insertQueue[0] + _, bad := hd.badHeaders[link.hash] + if !bad && !link.persisted { + _, bad = hd.badHeaders[link.header.ParentHash] + } + if bad { + // If the link or its parent is marked bad, throw it out + hd.moveLinkToQueue(link, NoQueue) + delete(hd.links, link.hash) + hd.removeUpwards(link) + return true, false, nil } - link := hd.insertList[len(hd.insertList)-1] - if link.blockHeight <= hd.preverifiedHeight && !link.preverified { - // Header should be preverified, but not yet, try again later - break - } - hd.insertList = hd.insertList[:len(hd.insertList)-1] - skip := false - if !link.preverified { - if _, bad := hd.badHeaders[link.hash]; bad { - skip = true - } else if err := hd.engine.VerifyHeader(hd.headerReader, link.header, true /* seal */); err != nil { - log.Warn("Verification failed for header", "hash", link.header.Hash(), "height", link.blockHeight, "error", err) + if !link.verified { + if err := hd.VerifyHeader(link.header); err != nil { if errors.Is(err, consensus.ErrFutureBlock) { // This may become valid later - linksInFuture = append(linksInFuture, link) - log.Warn("Added future link", "hash", link.header.Hash(), "height", link.blockHeight, "timestamp", link.header.Time) - continue // prevent removal of the link from the hd.linkQueue + log.Warn("Added future link", "hash", link.hash, "height", link.blockHeight, "timestamp", link.header.Time) + return false, false, nil // prevent removal of the link from the hd.linkQueue } else { - skip = true - } - } else { - if hd.seenAnnounces.Pop(link.hash) { - hd.toAnnounce = append(hd.toAnnounce, Announce{Hash: link.hash, Number: link.blockHeight}) + log.Debug("Verification failed for header", "hash", link.hash, "height", link.blockHeight, "err", err) + hd.moveLinkToQueue(link, NoQueue) + delete(hd.links, link.hash) + hd.removeUpwards(link) + return true, false, nil } } } - if _, ok := hd.links[link.hash]; ok { - heap.Remove(hd.linkQueue, link.idx) + link.verified = true + // Make sure long insertions do not appear as a stuck stage 1 + select { + case <-logChannel: + log.Info(fmt.Sprintf("[%s] Inserting headers", logPrefix), "progress", hd.highestInDb, "queue", hd.insertQueue.Len()) + default: + } + td, err := hf(link.header, link.headerRaw, link.hash, link.blockHeight) + if err != nil { + return false, false, err } - if skip { - delete(hd.links, link.hash) - continue + if td != nil { + if hd.seenAnnounces.Pop(link.hash) { + hd.toAnnounce = append(hd.toAnnounce, Announce{Hash: link.hash, Number: link.blockHeight}) + } + // Check if transition to proof-of-stake happened and stop forward syncing + if terminalTotalDifficulty != nil && td.Cmp(terminalTotalDifficulty) >= 0 { + hd.highestInDb = link.blockHeight + log.Info(POSPandaBanner) + return true, true, nil + } } - if err := hf(link.header, link.blockHeight); err != nil { - return false, err + if link.blockHeight == hd.latestMinedBlockNumber { + return false, true, nil } + if link.blockHeight > hd.highestInDb { + if hd.trace { + log.Info("Highest in DB change", "number", link.blockHeight, "hash", link.hash) + } hd.highestInDb = link.blockHeight } link.persisted = true link.header = nil // Drop header reference to free memory, as we won't need it anymore - heap.Push(hd.persistedLinkQueue, link) - if len(link.next) > 0 { - hd.insertList = append(hd.insertList, link.next...) + link.headerRaw = nil + hd.moveLinkToQueue(link, PersistedQueueID) + for child := link.fChild; child != nil; child = child.next { + if !child.persisted { + hd.moveLinkToQueue(child, InsertQueueID) + } } } for hd.persistedLinkQueue.Len() > hd.persistedLinkLimit { - link := heap.Pop(hd.persistedLinkQueue).(*Link) + link := heap.Pop(&hd.persistedLinkQueue).(*Link) delete(hd.links, link.hash) + for child := link.fChild; child != nil; child, child.next = child.next, nil { + } } - if len(linksInFuture) > 0 { - hd.insertList = append(hd.insertList, linksInFuture...) - linksInFuture = nil //nolint + return hd.insertQueue.Len() > 0 && hd.insertQueue[0].blockHeight <= hd.highestInDb+1, false, nil +} + +// InsertHeaders attempts to insert headers into the database, verifying them first +// It returns true in the first return value if the system is "in sync" +func (hd *HeaderDownload) InsertHeaders(hf FeedHeaderFunc, terminalTotalDifficulty *big.Int, logPrefix string, logChannel <-chan time.Time) (bool, error) { + var more bool = true + var err error + var force bool + for more { + if more, force, err = hd.InsertHeader(hf, terminalTotalDifficulty, logPrefix, logChannel); err != nil { + return false, err + } + if force { + return true, nil + } + } + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.highestInDb >= hd.preverifiedHeight && hd.topSeenHeightPoW > 0 && hd.highestInDb >= hd.topSeenHeightPoW, nil +} + +func (hd *HeaderDownload) SetHeaderToDownloadPoS(hash common.Hash, height uint64) { + hd.lock.Lock() + defer hd.lock.Unlock() + + log.Trace("Set posAnchor", "blockHeight", height+1) + hd.posAnchor = &Anchor{ + parentHash: hash, + blockHeight: height + 1, } - return hd.highestInDb >= hd.preverifiedHeight && hd.topSeenHeight > 0 && hd.highestInDb >= hd.topSeenHeight, nil +} + +func (hd *HeaderDownload) ProcessHeadersPOS(csHeaders []ChainSegmentHeader, tx kv.Getter, peerId [64]byte) ([]PenaltyItem, error) { + if len(csHeaders) == 0 { + return nil, nil + } + log.Trace("Collecting...", "from", csHeaders[0].Number, "to", csHeaders[len(csHeaders)-1].Number, "len", len(csHeaders)) + hd.lock.Lock() + defer hd.lock.Unlock() + if hd.posAnchor == nil { + // May happen if peers are sending unrequested header packets after we've synced + log.Trace("posAnchor is nil") + return nil, nil + } + // We may have received answer from old request so not enough evidence for penalizing. + if hd.posAnchor.blockHeight != 1 && csHeaders[0].Number != hd.posAnchor.blockHeight-1 { + // hd.posAnchor.blockHeight == 1 is a special case when the height of the anchor is unknown (it is created from the fork choice message from beacon node) + log.Trace("posAnchor", "blockHeight", hd.posAnchor.blockHeight) + return nil, nil + } + + // Handle request after closing collectors + if hd.headersCollector == nil { + return nil, nil + } + + for _, sh := range csHeaders { + header := sh.Header + headerHash := sh.Hash + if headerHash != hd.posAnchor.parentHash { + log.Warn("Unexpected header", "hash", headerHash, "expected", hd.posAnchor.parentHash) + return []PenaltyItem{{PeerID: peerId, Penalty: BadBlockPenalty}}, nil + } + + headerNumber := header.Number.Uint64() + if err := hd.headersCollector.Collect(dbutils.HeaderKey(headerNumber, headerHash), sh.HeaderRaw); err != nil { + return nil, err + } + + hh, err := hd.headerReader.Header(context.Background(), tx, header.ParentHash, headerNumber-1) + if err != nil { + return nil, err + } + if hh != nil { + log.Trace("Synced", "requestId", hd.requestId) + hd.posAnchor = nil + hd.posStatus = Synced + hd.BeaconRequestList.Interrupt(engineapi.Synced) + // Wake up stage loop if it is outside any of the stages + select { + case hd.DeliveryNotify <- struct{}{}: + default: + } + return nil, nil + } + + hd.posAnchor = &Anchor{ + parentHash: header.ParentHash, + blockHeight: headerNumber, + } + + if headerNumber <= 1 { + return nil, errors.New("wrong genesis in PoS sync") + } + } + return nil, nil } // GrabAnnounces - returns all available announces and forget them @@ -646,7 +688,11 @@ func (hd *HeaderDownload) GrabAnnounces() []Announce { func (hd *HeaderDownload) Progress() uint64 { hd.lock.RLock() defer hd.lock.RUnlock() - return hd.highestInDb + if hd.posSync && hd.posAnchor != nil { + return hd.posAnchor.blockHeight - 1 + } else { + return hd.highestInDb + } } func (hd *HeaderDownload) HasLink(linkHash common.Hash) bool { @@ -674,106 +720,123 @@ func (hd *HeaderDownload) getLink(linkHash common.Hash) (*Link, bool) { } // addHeaderAsLink wraps header into a link and adds it to either queue of persisted links or queue of non-persisted links -func (hd *HeaderDownload) addHeaderAsLink(header *types.Header, persisted bool) *Link { - height := header.Number.Uint64() - linkHash := header.Hash() +func (hd *HeaderDownload) addHeaderAsLink(h ChainSegmentHeader, persisted bool) *Link { link := &Link{ - blockHeight: height, - hash: linkHash, - header: header, + blockHeight: h.Number, + hash: h.Hash, + header: h.Header, + headerRaw: h.HeaderRaw, persisted: persisted, } - hd.links[linkHash] = link if persisted { - heap.Push(hd.persistedLinkQueue, link) + link.linked = true + link.verified = true + link.header = nil // Drop header reference to free memory, as we won't need it anymore + link.headerRaw = nil + } + hd.links[h.Hash] = link + if persisted { + hd.moveLinkToQueue(link, PersistedQueueID) } else { - heap.Push(hd.linkQueue, link) + hd.moveLinkToQueue(link, EntryQueueID) } return link } -func (hi *HeaderInserter) FeedHeaderFunc(db kv.StatelessRwTx) func(header *types.Header, blockHeight uint64) error { - return func(header *types.Header, blockHeight uint64) error { - return hi.FeedHeader(db, header, blockHeight) +func (hi *HeaderInserter) NewFeedHeaderFunc(db kv.StatelessRwTx, headerReader services.HeaderReader) FeedHeaderFunc { + return func(header *types.Header, headerRaw []byte, hash common.Hash, blockHeight uint64) (*big.Int, error) { + return hi.FeedHeaderPoW(db, headerReader, header, headerRaw, hash, blockHeight) } +} +// Find the forking point - i.e. the latest header on the canonical chain which is an ancestor of this one +// Most common case - forking point is the height of the parent header +func (hi *HeaderInserter) ForkingPoint(db kv.StatelessRwTx, header, parent *types.Header) (forkingPoint uint64, err error) { + blockHeight := header.Number.Uint64() + var ch common.Hash + if fromCache, ok := hi.canonicalCache.Get(blockHeight - 1); ok { + ch = fromCache.(common.Hash) + } else { + if ch, err = hi.headerReader.CanonicalHash(context.Background(), db, blockHeight-1); err != nil { + return 0, fmt.Errorf("reading canonical hash for height %d: %w", blockHeight-1, err) + } + } + if ch == header.ParentHash { + forkingPoint = blockHeight - 1 + } else { + // Going further back + ancestorHash := parent.ParentHash + ancestorHeight := blockHeight - 2 + // Look in the cache first + for fromCache, ok := hi.canonicalCache.Get(ancestorHeight); ok; fromCache, ok = hi.canonicalCache.Get(ancestorHeight) { + ch = fromCache.(common.Hash) + if ch == ancestorHash { + break + } + ancestor, err := hi.headerReader.Header(context.Background(), db, ancestorHash, ancestorHeight) + if err != nil { + return 0, err + } + ancestorHash = ancestor.ParentHash + ancestorHeight-- + } + // Now look in the DB + for { + ch, err := hi.headerReader.CanonicalHash(context.Background(), db, ancestorHeight) + if err != nil { + return 0, fmt.Errorf("[%s] reading canonical hash for %d: %w", hi.logPrefix, ancestorHeight, err) + } + if ch == ancestorHash { + break + } + ancestor, err := hi.headerReader.Header(context.Background(), db, ancestorHash, ancestorHeight) + if err != nil { + return 0, err + } + ancestorHash = ancestor.ParentHash + ancestorHeight-- + } + // Loop above terminates when either err != nil (handled already) or ch == ancestorHash, therefore ancestorHeight is our forking point + forkingPoint = ancestorHeight + } + return } -func (hi *HeaderInserter) FeedHeader(db kv.StatelessRwTx, header *types.Header, blockHeight uint64) error { - hash := header.Hash() +func (hi *HeaderInserter) FeedHeaderPoW(db kv.StatelessRwTx, headerReader services.HeaderReader, header *types.Header, headerRaw []byte, hash common.Hash, blockHeight uint64) (td *big.Int, err error) { if hash == hi.prevHash { // Skip duplicates - return nil + return nil, nil } - if blockHeight < hi.prevHeight { - return fmt.Errorf("[%s] headers are unexpectedly unsorted, got %d after %d", hi.logPrefix, blockHeight, hi.prevHeight) + oldH, err := headerReader.Header(context.Background(), db, hash, blockHeight) + if err != nil { + return nil, err } - if oldH := rawdb.ReadHeader(db, hash, blockHeight); oldH != nil { + if oldH != nil { // Already inserted, skip - return nil + return nil, nil } // Load parent header - parent := rawdb.ReadHeader(db, header.ParentHash, blockHeight-1) + parent, err := headerReader.Header(context.Background(), db, header.ParentHash, blockHeight-1) + if err != nil { + return nil, err + } if parent == nil { - log.Warn(fmt.Sprintf("Could not find parent with hash %x and height %d for header %x %d", header.ParentHash, blockHeight-1, hash, blockHeight)) - // Skip headers without parents - return nil + // Fail on headers without parent + return nil, fmt.Errorf("could not find parent with hash %x and height %d for header %x %d", header.ParentHash, blockHeight-1, hash, blockHeight) } // Parent's total difficulty parentTd, err := rawdb.ReadTd(db, header.ParentHash, blockHeight-1) if err != nil || parentTd == nil { - return fmt.Errorf("[%s] parent's total difficulty not found with hash %x and height %d for header %x %d: %v", hi.logPrefix, header.ParentHash, blockHeight-1, hash, blockHeight, err) + return nil, fmt.Errorf("[%s] parent's total difficulty not found with hash %x and height %d for header %x %d: %v", hi.logPrefix, header.ParentHash, blockHeight-1, hash, blockHeight, err) } // Calculate total difficulty of this header using parent's total difficulty - td := new(big.Int).Add(parentTd, header.Difficulty) + td = new(big.Int).Add(parentTd, header.Difficulty) // Now we can decide wether this header will create a change in the canonical head if td.Cmp(hi.localTd) > 0 { hi.newCanonical = true - // Find the forking point - i.e. the latest header on the canonical chain which is an ancestor of this one - // Most common case - forking point is the height of the parent header - var forkingPoint uint64 - var ch common.Hash - var err error - if fromCache, ok := hi.canonicalCache.Get(blockHeight - 1); ok { - ch = fromCache.(common.Hash) - } else { - if ch, err = rawdb.ReadCanonicalHash(db, blockHeight-1); err != nil { - return fmt.Errorf("reading canonical hash for height %d: %w", blockHeight-1, err) - } - } - if ch == header.ParentHash { - forkingPoint = blockHeight - 1 - } else { - // Going further back - ancestorHash := parent.ParentHash - ancestorHeight := blockHeight - 2 - // Look in the cache first - for fromCache, ok := hi.canonicalCache.Get(ancestorHeight); ok; fromCache, ok = hi.canonicalCache.Get(ancestorHeight) { - ch = fromCache.(common.Hash) - if ch == ancestorHash { - break - } - ancestor := rawdb.ReadHeader(db, ancestorHash, ancestorHeight) - ancestorHash = ancestor.ParentHash - ancestorHeight-- - } - // Now look in the DB - for ch, err = rawdb.ReadCanonicalHash(db, ancestorHeight); err == nil && ch != ancestorHash; ch, err = rawdb.ReadCanonicalHash(db, ancestorHeight) { - ancestor := rawdb.ReadHeader(db, ancestorHash, ancestorHeight) - ancestorHash = ancestor.ParentHash - ancestorHeight-- - } - if err != nil { - return fmt.Errorf("[%s] reading canonical hash for %d: %w", hi.logPrefix, ancestorHeight, err) - } - // Loop above terminates when either err != nil (handled already) or ch == ancestorHash, therefore ancestorHeight is our forking point - forkingPoint = ancestorHeight - } - if err = rawdb.WriteHeadHeaderHash(db, hash); err != nil { - return fmt.Errorf("[%s] marking head header hash as %x: %w", hi.logPrefix, hash, err) - } - if err = stages.SaveStageProgress(db, stages.Headers, blockHeight); err != nil { - return fmt.Errorf("[%s] saving Headers progress: %w", hi.logPrefix, err) + forkingPoint, err := hi.ForkingPoint(db, header, parent) + if err != nil { + return nil, err } hi.highest = blockHeight hi.highestHash = hash @@ -784,20 +847,40 @@ func (hi *HeaderInserter) FeedHeader(db kv.StatelessRwTx, header *types.Header, hi.unwindPoint = forkingPoint hi.unwind = true } - // This makes sure we end up chosing the chain with the max total difficulty + // This makes sure we end up choosing the chain with the max total difficulty hi.localTd.Set(td) } - data, err2 := rlp.EncodeToBytes(header) - if err2 != nil { - return fmt.Errorf("[%s] failed to RLP encode header: %w", hi.logPrefix, err2) - } if err = rawdb.WriteTd(db, hash, blockHeight, td); err != nil { - return fmt.Errorf("[%s] failed to WriteTd: %w", hi.logPrefix, err) + return nil, fmt.Errorf("[%s] failed to WriteTd: %w", hi.logPrefix, err) } - if err = db.Put(kv.Headers, dbutils.HeaderKey(blockHeight, hash), data); err != nil { - return fmt.Errorf("[%s] failed to store header: %w", hi.logPrefix, err) + + if err = db.Put(kv.Headers, dbutils.HeaderKey(blockHeight, hash), headerRaw); err != nil { + return nil, fmt.Errorf("[%s] failed to store header: %w", hi.logPrefix, err) } + hi.prevHash = hash + return td, nil +} + +func (hi *HeaderInserter) FeedHeaderPoS(db kv.GetPut, header *types.Header, hash common.Hash) error { + blockHeight := header.Number.Uint64() + // TODO(yperbasis): do we need to check if the header is already inserted (oldH)? + + parentTd, err := rawdb.ReadTd(db, header.ParentHash, blockHeight-1) + if err != nil || parentTd == nil { + return fmt.Errorf("[%s] parent's total difficulty not found with hash %x and height %d for header %x %d: %v", hi.logPrefix, header.ParentHash, blockHeight-1, hash, blockHeight, err) + } + td := new(big.Int).Add(parentTd, header.Difficulty) + if err = rawdb.WriteTd(db, hash, blockHeight, td); err != nil { + return fmt.Errorf("[%s] failed to WriteTd: %w", hi.logPrefix, err) + } + + rawdb.WriteHeader(db, header) + + hi.highest = blockHeight + hi.highestHash = hash + hi.highestTimestamp = header.Time + return nil } @@ -825,118 +908,129 @@ func (hi *HeaderInserter) BestHeaderChanged() bool { return hi.newCanonical } -// ProcessSegment - handling single segment. -// If segment were processed by extendDown or newAnchor method, then it returns `requestMore=true` -// it allows higher-level algo immediately request more headers without waiting all stages precessing, -// speeds up visibility of new blocks -// It remember peerID - then later - if anchors created from segments will abandoned - this peerID gonna get Penalty -func (hd *HeaderDownload) ProcessSegment(segment *ChainSegment, newBlock bool, peerID string) (requestMore bool, penalties []PenaltyItem) { - log.Debug("processSegment", "from", segment.Headers[0].Number.Uint64(), "to", segment.Headers[len(segment.Headers)-1].Number.Uint64()) +func (hd *HeaderDownload) ProcessHeader(sh ChainSegmentHeader, newBlock bool, peerID [64]byte) bool { hd.lock.Lock() defer hd.lock.Unlock() - foundAnchor, start := hd.findAnchors(segment) - foundTip, end := hd.findLink(segment, start) // We ignore penalty because we will check it as part of PoW check - if end == 0 { - log.Debug("Duplicate segment") - return + if sh.Number > hd.topSeenHeightPoW && (newBlock || hd.seenAnnounces.Seen(sh.Hash)) { + hd.topSeenHeightPoW = sh.Number + } + if sh.Number > hd.stats.RespMaxBlock { + hd.stats.RespMaxBlock = sh.Number } - height := segment.Headers[len(segment.Headers)-1].Number.Uint64() - hash := segment.Headers[len(segment.Headers)-1].Hash() - if newBlock || hd.seenAnnounces.Seen(hash) { - if height > hd.topSeenHeight { - hd.topSeenHeight = height + if hd.stats.RespMinBlock == 0 || sh.Number < hd.stats.RespMinBlock { + hd.stats.RespMinBlock = sh.Number + } + if _, ok := hd.links[sh.Hash]; ok { + hd.stats.Duplicates++ + // Duplicate + return false + } + parent, foundParent := hd.links[sh.Header.ParentHash] + anchor, foundAnchor := hd.anchors[sh.Hash] + //fmt.Printf("sh = %d %x, foundParent=%t, foundAnchor=%t\n", sh.Number, sh.Hash, foundParent, foundAnchor) + if !foundParent && !foundAnchor { + if sh.Number < hd.highestInDb { + log.Debug(fmt.Sprintf("new anchor too far in the past: %d, latest header in db: %d", sh.Number, hd.highestInDb)) + return false + } + if len(hd.anchors) >= hd.anchorLimit { + log.Debug(fmt.Sprintf("too many anchors: %d, limit %d", len(hd.anchors), hd.anchorLimit)) + return false } } - startNum := segment.Headers[start].Number.Uint64() - endNum := segment.Headers[end-1].Number.Uint64() - // There are 4 cases + link := hd.addHeaderAsLink(sh, false /* persisted */) if foundAnchor { - if foundTip { - // Connect - var err error - if penalties, err = hd.connect(segment, start, end); err != nil { - log.Debug("Connect failed", "error", err) - return - } - log.Debug("Connected", "start", startNum, "end", endNum) - } else { - // ExtendDown - var err error - if requestMore, err = hd.extendDown(segment, start, end); err != nil { - log.Debug("ExtendDown failed", "error", err) - return - } - log.Debug("Extended Down", "start", startNum, "end", endNum) - } - } else if foundTip { - if end > 0 { - // ExtendUp - if err := hd.extendUp(segment, start, end); err != nil { - log.Debug("ExtendUp failed", "error", err) - return - } - log.Debug("Extended Up", "start", startNum, "end", endNum) + link.fChild = anchor.fLink + hd.removeAnchor(anchor) + //fmt.Printf("removed anchor %d %x\n", anchor.blockHeight, anchor.parentHash) + } + if parentAnchor, ok := hd.anchors[sh.Header.ParentHash]; ok { + link.next = parentAnchor.fLink + parentAnchor.fLink = link + } + if foundParent { + //fmt.Printf("sh = %d %x, found parent\n", sh.Number, sh.Hash) + link.next = parent.fChild + parent.fChild = link + if parent.persisted { + link.linked = true + hd.moveLinkToQueue(link, InsertQueueID) } } else { - // NewAnchor - var err error - if requestMore, err = hd.newAnchor(segment, start, end, peerID); err != nil { - log.Debug("NewAnchor failed", "error", err) - return + if sh.Number+params.FullImmutabilityThreshold < hd.highestInDb { + log.Debug("Remove upwards", "height", link.blockHeight, "hash", link.blockHeight) + hd.removeUpwards(link) + return false } - log.Debug("NewAnchor", "start", startNum, "end", endNum) - } - //log.Info(hd.anchorState()) - log.Debug("Link queue", "size", hd.linkQueue.Len()) - if hd.linkQueue.Len() > hd.linkLimit { - log.Debug("Too many links, cutting down", "count", hd.linkQueue.Len(), "tried to add", end-start, "limit", hd.linkLimit) - } - for hd.linkQueue.Len() > hd.linkLimit { - link := heap.Pop(hd.linkQueue).(*Link) - delete(hd.links, link.hash) - if parentLink, ok := hd.links[link.header.ParentHash]; ok { - for i, n := range parentLink.next { - if n == link { - if i == len(parentLink.next)-1 { - parentLink.next = parentLink.next[:i] - } else { - parentLink.next = append(parentLink.next[:i], parentLink.next[i+1:]...) - } - break - } - } + //fmt.Printf("sh = %d %x, nof found parent or anchor\n", sh.Number, sh.Hash) + // See if it links existing anchor + anchor = &Anchor{ + parentHash: sh.Header.ParentHash, + nextRetryTime: 0, // Will ensure this anchor will be top priority + peerID: peerID, + blockHeight: sh.Number, } - if anchor, ok := hd.anchors[link.header.ParentHash]; ok { - for i, n := range anchor.links { - if n == link { - if i == len(anchor.links)-1 { - anchor.links = anchor.links[:i] - } else { - anchor.links = append(anchor.links[:i], anchor.links[i+1:]...) - } - break - } - } + anchor.fLink = link + hd.anchors[anchor.parentHash] = anchor + heap.Push(hd.anchorQueue, anchor) + return true + } + return false +} + +func (hd *HeaderDownload) ProcessHeaders(csHeaders []ChainSegmentHeader, newBlock bool, peerID [64]byte) bool { + requestMore := false + for _, sh := range csHeaders { + // Lock is acquired for every invocation of ProcessHeader + if hd.ProcessHeader(sh, newBlock, peerID) { + requestMore = true } } + hd.lock.Lock() + defer hd.lock.Unlock() + hd.stats.Responses++ + log.Trace("Link queue", "size", hd.linkQueue.Len()) + if hd.linkQueue.Len() > hd.linkLimit { + log.Trace("Too many links, cutting down", "count", hd.linkQueue.Len(), "tried to add", len(csHeaders), "limit", hd.linkLimit) + hd.pruneLinkQueue() + } + // Wake up stage loop if it is outside any of the stages select { case hd.DeliveryNotify <- struct{}{}: default: } - return hd.requestChaining && requestMore, penalties + return hd.requestChaining && requestMore +} + +func (hd *HeaderDownload) ExtractStats() Stats { + s := hd.stats + hd.stats = Stats{} + return s } func (hd *HeaderDownload) TopSeenHeight() uint64 { hd.lock.RLock() defer hd.lock.RUnlock() - return hd.topSeenHeight + if hd.topSeenHeightPoW > hd.topSeenHeightPoS { + return hd.topSeenHeightPoW + } else { + return hd.topSeenHeightPoS + } +} + +func (hd *HeaderDownload) UpdateTopSeenHeightPoS(blockHeight uint64) { + hd.lock.Lock() + defer hd.lock.Unlock() + if blockHeight > hd.topSeenHeightPoS { + hd.topSeenHeightPoS = blockHeight + } } func (hd *HeaderDownload) SetHeaderReader(headerReader consensus.ChainHeaderReader) { hd.lock.Lock() defer hd.lock.Unlock() - hd.headerReader = headerReader + hd.consensusHeaderReader = headerReader } func (hd *HeaderDownload) EnableRequestChaining() { @@ -945,10 +1039,46 @@ func (hd *HeaderDownload) EnableRequestChaining() { hd.requestChaining = true } -func (hd *HeaderDownload) SetFetching(fetching bool) { +func (hd *HeaderDownload) SetFetchingNew(fetching bool) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.fetchingNew = fetching +} + +func (hd *HeaderDownload) SetPosStatus(status SyncStatus) { hd.lock.Lock() defer hd.lock.Unlock() - hd.fetching = fetching + hd.posStatus = status +} + +func (hd *HeaderDownload) HeadersCollector() *etl.Collector { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.headersCollector +} + +func (hd *HeaderDownload) SetHeadersCollector(collector *etl.Collector) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.headersCollector = collector +} + +func (hd *HeaderDownload) SetPOSSync(posSync bool) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.posSync = posSync +} + +func (hd *HeaderDownload) POSSync() bool { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.posSync +} + +func (hd *HeaderDownload) PosStatus() SyncStatus { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.posStatus } func (hd *HeaderDownload) RequestChaining() bool { @@ -957,10 +1087,195 @@ func (hd *HeaderDownload) RequestChaining() bool { return hd.requestChaining } -func (hd *HeaderDownload) Fetching() bool { +func (hd *HeaderDownload) FetchingNew() bool { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.fetchingNew +} + +func (hd *HeaderDownload) GetPendingPayloadStatus() common.Hash { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.pendingPayloadStatus +} + +func (hd *HeaderDownload) SetPendingPayloadStatus(header common.Hash) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.pendingPayloadStatus = header +} + +func (hd *HeaderDownload) ClearPendingPayloadStatus() { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.pendingPayloadStatus = common.Hash{} +} + +func (hd *HeaderDownload) GetUnsettledForkChoice() (*engineapi.ForkChoiceMessage, uint64) { + hd.lock.RLock() + defer hd.lock.RUnlock() + return hd.unsettledForkChoice, hd.unsettledHeadHeight +} + +func (hd *HeaderDownload) SetUnsettledForkChoice(forkChoice *engineapi.ForkChoiceMessage, headHeight uint64) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.unsettledForkChoice = forkChoice + hd.unsettledHeadHeight = headHeight +} + +func (hd *HeaderDownload) ClearUnsettledForkChoice() { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.unsettledForkChoice = nil + hd.unsettledHeadHeight = 0 +} + +func (hd *HeaderDownload) RequestId() int { hd.lock.RLock() defer hd.lock.RUnlock() - return hd.fetching + return hd.requestId +} + +func (hd *HeaderDownload) SetRequestId(requestId int) { + hd.lock.Lock() + defer hd.lock.Unlock() + hd.requestId = requestId +} + +func (hd *HeaderDownload) AddMinedHeader(header *types.Header) error { + buf := bytes.NewBuffer(nil) + if err := header.EncodeRLP(buf); err != nil { + return err + } + segments, _, err := hd.SingleHeaderAsSegment(buf.Bytes(), header, false /* penalizePoSBlocks */) + if err != nil { + return err + } + + peerID := [64]byte{'m', 'i', 'n', 'e', 'r'} // "miner" + + _ = hd.ProcessHeaders(segments, false /* newBlock */, peerID) + hd.latestMinedBlockNumber = header.Number.Uint64() + return nil +} + +func (hd *HeaderDownload) AddHeadersFromSnapshot(tx kv.Tx, n uint64, r services.FullBlockReader) error { + hd.lock.Lock() + defer hd.lock.Unlock() + for i := n; i > 0 && hd.persistedLinkQueue.Len() < hd.persistedLinkLimit; i-- { + header, err := r.HeaderByNumber(context.Background(), tx, i) + if err != nil { + return err + } + if header == nil { + continue + } + v, err := rlp.EncodeToBytes(header) + if err != nil { + return err + } + h := ChainSegmentHeader{ + HeaderRaw: v, + Header: header, + Hash: header.Hash(), + Number: header.Number.Uint64(), + } + link := hd.addHeaderAsLink(h, true /* persisted */) + link.verified = true + } + if hd.highestInDb < n { + hd.highestInDb = n + } + if hd.preverifiedHeight < n { + hd.preverifiedHeight = n + } + + return nil +} + +const ( + logInterval = 30 * time.Second +) + +func (hd *HeaderDownload) cleanUpPoSDownload() { + if hd.headersCollector != nil { + hd.headersCollector.Close() + hd.headersCollector = nil + } + hd.posStatus = Idle +} + +func (hd *HeaderDownload) StartPoSDownloader( + ctx context.Context, + headerReqSend func(context.Context, *HeaderRequest) ([64]byte, bool), + penalize func(context.Context, []PenaltyItem), +) { + go func() { + prevProgress := uint64(0) + + logEvery := time.NewTicker(logInterval) + defer logEvery.Stop() + + for { + var req *HeaderRequest + var penalties []PenaltyItem + var currentTime uint64 + + hd.lock.Lock() + if hd.posStatus == Syncing { + currentTime = uint64(time.Now().Unix()) + var timeout bool + timeout, req, penalties = hd.requestMoreHeadersForPOS(currentTime) + if timeout { + log.Warn("Timeout", "requestId", hd.requestId) + hd.BeaconRequestList.Remove(hd.requestId) + hd.cleanUpPoSDownload() + } + } else { + prevProgress = 0 + } + hd.lock.Unlock() + + if req != nil { + _, sentToPeer := headerReqSend(ctx, req) + if sentToPeer { + // If request was actually sent to a peer, we update retry time to be 5 seconds in the future + hd.UpdateRetryTime(req, currentTime, 5 /* timeout */) + log.Trace("Sent request", "height", req.Number) + } + } + if len(penalties) > 0 { + penalize(ctx, penalties) + } + + // Sleep and check for logs + timer := time.NewTimer(2 * time.Millisecond) + select { + case <-ctx.Done(): + hd.lock.Lock() + hd.cleanUpPoSDownload() + hd.lock.Unlock() + hd.BeaconRequestList.Interrupt(engineapi.Stopping) + return + case <-logEvery.C: + if hd.PosStatus() == Syncing { + progress := hd.Progress() + if prevProgress == 0 { + prevProgress = progress + } else if progress <= prevProgress { + diff := prevProgress - progress + log.Info("Downloaded PoS Headers", "now", progress, + "blk/sec", float64(diff)/float64(logInterval/time.Second)) + prevProgress = progress + } + } + case <-timer.C: + } + // Cleanup timer + timer.Stop() + } + }() } func DecodeTips(encodings []string) (map[common.Hash]HeaderRecord, error) { @@ -997,7 +1312,8 @@ func DecodeTips(encodings []string) (map[common.Hash]HeaderRecord, error) { return nil, fmt.Errorf("parsing hard coded header on %d: %w", i, err) } - hardTips[h.Hash()] = HeaderRecord{Raw: b, Header: &h} + headerHash := types.RawRlpHash(res) + hardTips[headerHash] = HeaderRecord{Raw: b, Header: &h} buf.Reset() } diff --git a/turbo/stages/headerdownload/header_data_struct.go b/turbo/stages/headerdownload/header_data_struct.go index 03513d4c38d..3ddd551af63 100644 --- a/turbo/stages/headerdownload/header_data_struct.go +++ b/turbo/stages/headerdownload/header_data_struct.go @@ -7,9 +7,23 @@ import ( "sync" lru "github.com/hashicorp/golang-lru" + "github.com/ledgerwatch/erigon-lib/etl" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/core/types" + "github.com/ledgerwatch/erigon/ethdb/privateapi" + "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/engineapi" + "github.com/ledgerwatch/erigon/turbo/services" +) + +type QueueID uint8 + +const ( + NoQueue QueueID = iota + EntryQueueID + InsertQueueID + PersistedQueueID ) // Link is a chain link that can be connect to other chain links @@ -19,12 +33,16 @@ import ( // present to allow potential reorgs type Link struct { header *types.Header - next []*Link // Allows iteration over links in ascending block height order + headerRaw []byte + fChild *Link // Pointer to the first child, further children can be found by following `next` pointers to the siblings + next *Link // Pointer to the next sibling, or nil if there are no siblings hash common.Hash // Hash of the header blockHeight uint64 - persisted bool // Whether this link comes from the database record - preverified bool // Ancestor of pre-verified header - idx int // Index in the heap + persisted bool // Whether this link comes from the database record + verified bool // Ancestor of pre-verified header or verified by consensus engine + linked bool // Whether this link is connected (via chain of ParentHash to one of the persisted links) + idx int // Index in the heap + queueId QueueID // which queue this link belongs to } // LinkQueue is the priority queue of links. It is instantiated once for persistent links, and once for non-persistent links @@ -69,19 +87,41 @@ func (lq *LinkQueue) Pop() interface{} { old := *lq n := len(old) x := old[n-1] + x.idx = -1 + x.queueId = NoQueue *lq = old[0 : n-1] return x } +// Anchor represents a header that we do not yet have, but that we would like to have soon +// anchors are created when we know the hash of the header (from its children), and we can +// also derive its blockheight (also from its children), but the corresponding header +// either has not been requested yet, or has not been delivered yet. +// It is possible for one anchor to reference multiple links, because more than one +// header may share the same parent header. In such cases, `links` field will contain +// more than one pointer. type Anchor struct { - peerID string - links []*Link // Links attached immediately to this anchor - parentHash common.Hash // Hash of the header this anchor can be connected to (to disappear) - blockHeight uint64 - timestamp uint64 // Zero when anchor has just been created, otherwise timestamps when timeout on this anchor request expires - timeouts int // Number of timeout that this anchor has experiences - after certain threshold, it gets invalidated + peerID [64]byte + fLink *Link // Links attached immediately to this anchor (pointer to the first one, the rest can be found by following `next` fields) + parentHash common.Hash // Hash of the header this anchor can be connected to (to disappear) + blockHeight uint64 + nextRetryTime uint64 // Zero when anchor has just been created, otherwise time when anchor needs to be check to see if retry is needed + timeouts int // Number of timeout that this anchor has experiences - after certain threshold, it gets invalidated + idx int // Index of the anchor in the queue to be able to modify specific items } +// AnchorQueue is a priority queue of anchors that priorises by the time when +// another retry on the extending the anchor needs to be attempted +// Every time anchor's extension is requested, the `nextRetryTime` is reset +// to 5 seconds in the future, and when it expires, and the anchor is still +// retry is made +// It implement heap.Interface to be useable by the standard library `heap` +// as a priority queue (implemented as a binary heap) +// As anchors are moved around in the binary heap, they internally track their +// position in the heap (using `idx` field). This feature allows updating +// the heap (using `Fix` function) in situations when anchor is accessed not +// through the priority queue, but through the map `anchor` in the +// HeaderDownloader type. type AnchorQueue []*Anchor func (aq AnchorQueue) Len() int { @@ -89,20 +129,22 @@ func (aq AnchorQueue) Len() int { } func (aq AnchorQueue) Less(i, j int) bool { - if aq[i].timestamp == aq[j].timestamp { - // When timestamps are the same, we prioritise low block height anchors + if aq[i].nextRetryTime == aq[j].nextRetryTime { + // When next retry times are the same, we prioritise low block height anchors return aq[i].blockHeight < aq[j].blockHeight } - return aq[i].timestamp < aq[j].timestamp + return aq[i].nextRetryTime < aq[j].nextRetryTime } func (aq AnchorQueue) Swap(i, j int) { aq[i], aq[j] = aq[j], aq[i] + aq[i].idx, aq[j].idx = i, j // Restore indices after the swap } func (aq *AnchorQueue) Push(x interface{}) { // Push and Pop use pointer receivers because they modify the slice's length, // not just its contents. + x.(*Anchor).idx = len(*aq) *aq = append(*aq, x.(*Anchor)) } @@ -114,12 +156,16 @@ func (aq *AnchorQueue) Pop() interface{} { return x } +type ChainSegmentHeader struct { + HeaderRaw rlp.RawValue + Header *types.Header + Hash common.Hash + Number uint64 +} + // First item in ChainSegment is the anchor // ChainSegment must be contigous and must not include bad headers -type ChainSegment struct { - HeadersRaw [][]byte - Headers []*types.Header -} +type ChainSegment []ChainSegmentHeader type PeerHandle int // This is int just for the PoC phase - will be replaced by more appropriate type to find a peer @@ -135,6 +181,7 @@ const ( TooFarFuturePenalty TooFarPastPenalty AbandonedAnchorPenalty + NewBlockGossipAfterMergePenalty ) type PeerPenalty struct { @@ -151,10 +198,11 @@ type HeaderRequest struct { Length uint64 Skip uint64 Reverse bool + Anchor *Anchor } type PenaltyItem struct { - PeerID string + PeerID [64]byte Penalty Penalty } type Announce struct { @@ -165,29 +213,104 @@ type Announce struct { type VerifySealFunc func(header *types.Header) error type CalcDifficultyFunc func(childTimestamp uint64, parentTime uint64, parentDifficulty, parentNumber *big.Int, parentHash, parentUncleHash common.Hash) *big.Int +// InsertQueue keeps the links before they are inserted in the database +// It priorities them by block height (the lowest block height on the top), +// and if block heights are the same, by the verification status (verified/preverified on the top) +type InsertQueue []*Link + +func (iq InsertQueue) Len() int { + return len(iq) +} + +func (iq InsertQueue) Less(i, j int) bool { + return iq[i].blockHeight < iq[j].blockHeight +} + +func (iq InsertQueue) Swap(i, j int) { + iq[i], iq[j] = iq[j], iq[i] + iq[i].idx, iq[j].idx = i, j // Restore indices after the swap +} + +func (iq *InsertQueue) Push(x interface{}) { + // Push and Pop use pointer receivers because they modify the slice's length, + // not just its contents. + x.(*Link).idx = len(*iq) + *iq = append(*iq, x.(*Link)) +} + +func (iq *InsertQueue) Pop() interface{} { + old := *iq + n := len(old) + x := old[n-1] + *iq = old[0 : n-1] + x.idx = -1 + x.queueId = NoQueue + return x +} + +type SyncStatus int + +const ( // SyncStatus values + Idle = iota + Syncing + Synced // if we found a canonical hash during backward sync, in this case our sync process is done +) + +type Stats struct { + Requests int + SkeletonRequests int + Responses int + Duplicates int + ReqMinBlock uint64 + ReqMaxBlock uint64 + SkeletonReqMinBlock uint64 + SkeletonReqMaxBlock uint64 + RespMinBlock uint64 + RespMaxBlock uint64 +} + type HeaderDownload struct { - badHeaders map[common.Hash]struct{} - anchors map[common.Hash]*Anchor // Mapping from parentHash to collection of anchors - preverifiedHashes map[common.Hash]struct{} // Set of hashes that are known to belong to canonical chain - links map[common.Hash]*Link // Links by header hash - engine consensus.Engine - headerReader consensus.ChainHeaderReader - insertList []*Link // List of non-persisted links that can be inserted (their parent is persisted) - seenAnnounces *SeenAnnounces // External announcement hashes, after header verification if hash is in this set - will broadcast it further - persistedLinkQueue *LinkQueue // Priority queue of persisted links used to limit their number - linkQueue *LinkQueue // Priority queue of non-persisted links used to limit their number - anchorQueue *AnchorQueue // Priority queue of anchors used to sequence the header requests - DeliveryNotify chan struct{} - toAnnounce []Announce - lock sync.RWMutex - preverifiedHeight uint64 // Block height corresponding to the last preverified hash - linkLimit int // Maximum allowed number of links - persistedLinkLimit int // Maximum allowed number of persisted links - anchorLimit int // Maximum allowed number of anchors - highestInDb uint64 // Height of the highest block header in the database - topSeenHeight uint64 - requestChaining bool // Whether the downloader is allowed to issue more requests when previous responses created or moved an anchor - fetching bool // Set when the stage that is actively fetching the headers is in progress + badHeaders map[common.Hash]struct{} + anchors map[common.Hash]*Anchor // Mapping from parentHash to collection of anchors + links map[common.Hash]*Link // Links by header hash + engine consensus.Engine + insertQueue InsertQueue // Priority queue of non-persisted links that need to be verified and can be inserted + seenAnnounces *SeenAnnounces // External announcement hashes, after header verification if hash is in this set - will broadcast it further + persistedLinkQueue LinkQueue // Priority queue of persisted links used to limit their number + linkQueue LinkQueue // Priority queue of non-persisted links used to limit their number + anchorQueue *AnchorQueue // Priority queue of anchors used to sequence the header requests + DeliveryNotify chan struct{} + toAnnounce []Announce + lock sync.RWMutex + preverifiedHeight uint64 // Block height corresponding to the last preverified hash + linkLimit int // Maximum allowed number of links + persistedLinkLimit int // Maximum allowed number of persisted links + anchorLimit int // Maximum allowed number of anchors + highestInDb uint64 // Height of the highest block header in the database + requestChaining bool // Whether the downloader is allowed to issue more requests when previous responses created or moved an anchor + fetchingNew bool // Set when the stage that is actively fetching the headers is in progress + topSeenHeightPoW uint64 + latestMinedBlockNumber uint64 + trace bool + stats Stats + + consensusHeaderReader consensus.ChainHeaderReader + headerReader services.HeaderReader + + // Proof of Stake (PoS) + topSeenHeightPoS uint64 + requestId int + posAnchor *Anchor + posStatus SyncStatus + posSync bool // Whether the chain is syncing in the PoS mode + headersCollector *etl.Collector // ETL collector for headers + BeaconRequestList *engineapi.RequestList // Requests from ethbackend to staged sync + PayloadStatusCh chan privateapi.PayloadStatus // Responses (validation/execution status) + pendingPayloadStatus common.Hash // Header whose status we still should send to PayloadStatusCh + unsettledForkChoice *engineapi.ForkChoiceMessage // Forkchoice to process after unwind + unsettledHeadHeight uint64 // Height of unsettledForkChoice.headBlockHash + posDownloaderTip common.Hash // See https://hackmd.io/GDc0maGsQeKfP8o2C7L52w + badPoSHeaders map[common.Hash]common.Hash // Invalid Tip -> Last Valid Ancestor } // HeaderRecord encapsulates two forms of the same header - raw RLP encoding (to avoid duplicated decodings and encodings), and parsed value types.Header @@ -200,6 +323,7 @@ func NewHeaderDownload( anchorLimit int, linkLimit int, engine consensus.Engine, + headerReader services.HeaderAndCanonicalReader, ) *HeaderDownload { persistentLinkLimit := linkLimit / 16 hd := &HeaderDownload{ @@ -209,17 +333,19 @@ func NewHeaderDownload( linkLimit: linkLimit - persistentLinkLimit, anchorLimit: anchorLimit, engine: engine, - preverifiedHashes: make(map[common.Hash]struct{}), links: make(map[common.Hash]*Link), - persistedLinkQueue: &LinkQueue{}, - linkQueue: &LinkQueue{}, anchorQueue: &AnchorQueue{}, seenAnnounces: NewSeenAnnounces(), DeliveryNotify: make(chan struct{}, 1), + BeaconRequestList: engineapi.NewRequestList(), + PayloadStatusCh: make(chan privateapi.PayloadStatus, 1), + headerReader: headerReader, + badPoSHeaders: make(map[common.Hash]common.Hash), } - heap.Init(hd.persistedLinkQueue) - heap.Init(hd.linkQueue) + heap.Init(&hd.persistedLinkQueue) + heap.Init(&hd.linkQueue) heap.Init(hd.anchorQueue) + heap.Init(&hd.insertQueue) return hd } @@ -241,6 +367,8 @@ func (p Penalty) String() string { return "TooFarFuture" case TooFarPastPenalty: return "TooFarPast" + case NewBlockGossipAfterMergePenalty: + return "NewBlockGossipAfterMerge" default: return fmt.Sprintf("Unknown(%d)", p) } @@ -250,7 +378,34 @@ func (pp PeerPenalty) String() string { return fmt.Sprintf("peerPenalty{peer: %d, penalty: %s, err: %v}", pp.peerHandle, pp.penalty, pp.err) } -// HeaderInserter incapsulates necessary variable for inserting header records to the database, abstracting away the source of these headers +func (hd *HeaderDownload) moveLinkToQueue(link *Link, queueId QueueID) { + if link.queueId == queueId { + return + } + // Remove + switch link.queueId { + case NoQueue: + case EntryQueueID: + heap.Remove(&hd.linkQueue, link.idx) + case InsertQueueID: + heap.Remove(&hd.insertQueue, link.idx) + case PersistedQueueID: + heap.Remove(&hd.persistedLinkQueue, link.idx) + } + // Push + switch queueId { + case NoQueue: + case EntryQueueID: + heap.Push(&hd.linkQueue, link) + case InsertQueueID: + heap.Push(&hd.insertQueue, link) + case PersistedQueueID: + heap.Push(&hd.persistedLinkQueue, link) + } + link.queueId = queueId +} + +// HeaderInserter encapsulates necessary variable for inserting header records to the database, abstracting away the source of these headers // The headers are "fed" by repeatedly calling the FeedHeader function. type HeaderInserter struct { localTd *big.Int @@ -259,18 +414,19 @@ type HeaderInserter struct { highestHash common.Hash newCanonical bool unwind bool - prevHeight uint64 unwindPoint uint64 highest uint64 highestTimestamp uint64 canonicalCache *lru.Cache + headerReader services.HeaderAndCanonicalReader } -func NewHeaderInserter(logPrefix string, localTd *big.Int, headerProgress uint64) *HeaderInserter { +func NewHeaderInserter(logPrefix string, localTd *big.Int, headerProgress uint64, headerReader services.HeaderAndCanonicalReader) *HeaderInserter { hi := &HeaderInserter{ - logPrefix: logPrefix, - localTd: localTd, - unwindPoint: headerProgress, + logPrefix: logPrefix, + localTd: localTd, + unwindPoint: headerProgress, + headerReader: headerReader, } hi.canonicalCache, _ = lru.New(1000) return hi diff --git a/turbo/stages/headerdownload/header_test.go b/turbo/stages/headerdownload/header_test.go deleted file mode 100644 index f78070c6f28..00000000000 --- a/turbo/stages/headerdownload/header_test.go +++ /dev/null @@ -1,180 +0,0 @@ -package headerdownload - -import ( - "math/big" - "testing" - - "github.com/ledgerwatch/erigon/consensus/ethash" - "github.com/ledgerwatch/erigon/core/types" -) - -func TestSplitIntoSegments(t *testing.T) { - engine := ethash.NewFaker() - hd := NewHeaderDownload(100, 100, engine) - - // Empty message - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{}, []*types.Header{}); err == nil { - if penalty != NoPenalty { - t.Errorf("unexpected penalty: %s", penalty) - } - if len(chainSegments) != 0 { - t.Errorf("expected no chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Single header - var h types.Header - h.Number = big.NewInt(5) - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}}, []*types.Header{&h}); err == nil { - if penalty != NoPenalty { - t.Errorf("unexpected penalty: %s", penalty) - } - if len(chainSegments) != 1 { - t.Errorf("expected 1 chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Same header repeated twice - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}, {}}, []*types.Header{&h, &h}); err == nil { - if penalty != DuplicateHeaderPenalty { - t.Errorf("expected DuplicateHeader penalty, got %s", penalty) - } - if chainSegments != nil { - t.Errorf("expected no chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Single header with a bad hash - hd.ReportBadHeader(h.Hash()) - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}}, []*types.Header{&h}); err == nil { - if penalty != BadBlockPenalty { - t.Errorf("expected BadBlock penalty, got %s", penalty) - } - if chainSegments != nil { - t.Errorf("expected no chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Two connected headers - var h1, h2 types.Header - h1.Number = big.NewInt(1) - h1.Difficulty = big.NewInt(10) - h2.Number = big.NewInt(2) - h2.Difficulty = big.NewInt(1010) - h2.ParentHash = h1.Hash() - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}, {}}, []*types.Header{&h1, &h2}); err == nil { - if penalty != NoPenalty { - t.Errorf("unexpected penalty: %s", penalty) - } - if len(chainSegments) != 1 { - t.Errorf("expected 1 chainSegments, got %d", len(chainSegments)) - } - if len(chainSegments[0].Headers) != 2 { - t.Errorf("expected chainSegment of the length 2, got %d", len(chainSegments[0].Headers)) - } - if chainSegments[0].Headers[0] != &h2 { - t.Errorf("expected h2 to be the root") - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Two connected headers with wrong numbers - h2.Number = big.NewInt(3) // Child number 3, parent number 1 - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}, {}}, []*types.Header{&h1, &h2}); err == nil { - if penalty != WrongChildBlockHeightPenalty { - t.Errorf("expected WrongChildBlockHeight penalty, got %s", penalty) - } - if chainSegments != nil { - t.Errorf("expected no chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Two connected headers with wrong difficulty - h2.Number = big.NewInt(2) // Child number 2, parent number 1 - h2.Difficulty = big.NewInt(2000) // Expected difficulty 10 + 1000 = 1010 - - // Two headers connected to the third header - h2.Difficulty = big.NewInt(1010) // Fix difficulty of h2 - var h3 types.Header - h3.Number = big.NewInt(2) - h3.Difficulty = big.NewInt(1010) - h3.ParentHash = h1.Hash() - h3.Extra = []byte("I'm different") // To make sure the hash of h3 is different from the hash of h2 - - // Same three headers, but in a reverse order - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}, {}, {}}, []*types.Header{&h3, &h2, &h1}); err == nil { - if penalty != NoPenalty { - t.Errorf("unexpected penalty: %s", penalty) - } - if len(chainSegments) != 3 { - t.Errorf("expected 3 chainSegments, got %d", len(chainSegments)) - } - if len(chainSegments[0].Headers) != 1 { - t.Errorf("expected chainSegment of the length 1, got %d", len(chainSegments[0].Headers)) - } - if chainSegments[2].Headers[0] != &h1 { - t.Errorf("expected h1 to be the root") - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Two headers not connected to each other - if chainSegments, penalty, err := hd.SplitIntoSegments([][]byte{{}, {}}, []*types.Header{&h3, &h2}); err == nil { - if penalty != NoPenalty { - t.Errorf("unexpected penalty: %s", penalty) - } - if len(chainSegments) != 2 { - t.Errorf("expected 2 chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle header msg: %v", err) - } -} - -func TestSingleHeaderAsSegment(t *testing.T) { - engine := ethash.NewFaker() - hd := NewHeaderDownload(100, 100, engine) - var h types.Header - h.Number = big.NewInt(5) - if chainSegments, penalty, err := hd.SingleHeaderAsSegment([]byte{}, &h); err == nil { - if penalty != NoPenalty { - t.Errorf("unexpected penalty: %s", penalty) - } - if len(chainSegments) != 1 { - t.Errorf("expected 1 chainSegments, got %d", len(chainSegments)) - } - if len(chainSegments[0].Headers) != 1 { - t.Errorf("expected chainSegment of the length 1, got %d", len(chainSegments[0].Headers)) - } - if chainSegments[0].Headers[0] != &h { - t.Errorf("expected h to be the root") - } - } else { - t.Errorf("handle header msg: %v", err) - } - - // Same header with a bad hash - hd.ReportBadHeader(h.Hash()) - if chainSegments, penalty, err := hd.SingleHeaderAsSegment([]byte{}, &h); err == nil { - if penalty != BadBlockPenalty { - t.Errorf("expected BadBlock penalty, got %s", penalty) - } - if chainSegments != nil { - t.Errorf("expected no chainSegments, got %d", len(chainSegments)) - } - } else { - t.Errorf("handle newBlock msg: %v", err) - } -} diff --git a/turbo/stages/headerdownload/preverified_hashes_mainnet.go b/turbo/stages/headerdownload/preverified_hashes_mainnet.go deleted file mode 100644 index f5a23ce343d..00000000000 --- a/turbo/stages/headerdownload/preverified_hashes_mainnet.go +++ /dev/null @@ -1,66794 +0,0 @@ -package headerdownload - -var mainnetPreverifiedHashes = []string{ - "d4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3", - "723899e82d352c6eabd21e34942f868687203ca14b3d5a23aeb47c555c123390", - "d3d5d5c1b501a00e76cbd467f2c670e436119b63974d19652d0d2d35bbc79cf3", - "41a7466b58b8b6d5f7d6076e7fc403525fe797dbca6d6b477ba62cae646a8b38", - "5cfe57c25382479a629ed9267df375b81f135970ce0ffbd600a38ea4e1c19c3a", - "91691083987bd2eb8eb1642cfbeb1f19b43f1331c49a6f2e72ea343f751d0e2a", - "495b33dad3ccc2619b8f58f89e6d2f5f2d9ec40a1522e608088b3e4d890fc327", - "84b78745f1ffcbf351a97e33e77c5ed1b35d3a4d68b94704a7d8b0bddd0e2783", - "b787b8e099146626f4f6fee13c0282ca966564b4978f660d74bd8ab18a7d0da3", - "d8c37e7f63e4e767606ef9fdd35e40f819ce88bb490950c5ca55c51b6eb4f264", - "80013e0e3394c02ebdcfd896dd1655d366065682db5e4e0dd2f81b68403549c2", - "88983bdfd04d1e4a82ce3d3bbfecdf943fb564d10f523bf8c4bc67765d9a2ec8", - "a5c6762a3c34dff1b8ba8f7c723303c022d7e1649891f4c2bca5357856c08e43", - "2f3bf56c0be438ed5d6b80e422e2800b3d73f401950e5f3128076c310e246460", - "eb8084141f9531bee7d08dc1e87a95d3a2aded201e442797f897272843532ef6", - "04b8e62e39834d697a80a89101cb3d56fbeb5288b3e36e2895b624c95be4ed9f", - "e1304296c3e641a7bee6d7cb0b2cdd054c8d3bc6a518e6a453dc47ec082ac21b", - "c9ccf0f206801adedfc4d6ca1da51aee86684c94281be8ae6d79d00aa1cfbc3f", - "1ac8954a447195efd4818fea896a7fdae572e3ac6d611fffdde64e17b29ccc3b", - "38121348c014e04aed83fa36c9b431268fe7890ddfa76d455f1fff7280f1b99b", - "2df82bf6de363885ecaad75e2da12e2898bdcd73d3c87aa3adcd3fa033679ca3", - "45d77340f479606eec1b7608fbda14db5f850183f6b7b786678fa1158fda63f7", - "c5e623b8e2b7856b237946f04bf652bb981aa3ff4373aabd0542c1ab96a07ee8", - "25a7e24da5f80fc069d197bc7a75c8c66a1543f4b3f79351b35709896ea7d61a", - "368d8974ef64173eba7f1bcd47dff96353e9a1dae12d927611d7fa79941cd7d7", - "e266847bbfdcb105469fcadbfe1365bce8d996a39342a1fbba1424cd4de91df7", - "c6c053e1aa5f985f773fb20c93d5b689fe69b38e5cb2227821e47715952f14d4", - "70524c9b527f729e066dc46d7b0cdb2f46637ed1a46e690924128bc4cf34c5b6", - "c58491fde899f819dede8a3d525661170b2d0fe4707a61a94083f3eef7d26f08", - "85f492bcd127663833dfb9856dce2a78992b36cbf46fe72431f817b5b5fbab88", - "82b72f284f44fa5b863c55764a14359b5bddf1eb5022d99cd02dca500ecceca3", - "874879ee812553bd415c09d115594a736769079c18f79f528f659b568998a366", - "f5fce88e2cdc61688eea7ee4dafbf91908aba0e19cd731c9cfe7d6e783201e51", - "b80c9ac33cbda40692005c9af03cf746db94d7ac3edf38f0228d6e93d610ee26", - "f2ffecac8a4b4b3f0af82dc96bf1a5ed9f7ec8aff08080a41b63ea815ee609e0", - "56ab758e0fab4b9ab11065883702a72ff24d16d7e27635c1c6ee8091015786fa", - "ab79f822909750f88dfb9dd0350c1ebe98d5495e9c969cdeb6e0ac993b80175b", - "057a6da572dc123a27245c6b5dcdaca58c449d758324d7fa50eaf185f599e28b", - "b236964c3d9f40f4d329f1b5f473d05679b11d23281bb33a854e7976b3fab2b2", - "0abcdd944ce3676a2ab7e9cc5105e57bc75f7c90abab229edef34b40de8c25df", - "ecdfeeeb9116aeb78633ddbcd4329d6659946667c81b4d9f2a90a6737486ba22", - "8521313e439f8af01a8e1d9f32a7c5d1806d3a5379b5fba83d12a4a47cd6e649", - "0eb9b4bfdfbb592f44b751400a3a6aed827a155f9a87f970bc46a3517ae63109", - "41c51cd0a6880d83b73ea47a9d014b17bd55c3fd308edca98ca7822ea1f26b87", - "0c2ef1929b9aa39ec7dd3b1d7883222393196c3409cb5baa9bef75ba1b9e3313", - "f96a8bdfa944b60b277b4d928fead182e585267f82b48a7bc56352f85d33d2f1", - "7a5c8f9ff4aa3aca5a5617517e0f8ccc2f0571684831ca83deafc65b5ac98b39", - "8fa319fb8d24d740336f0dbfbb3d6ec810a213f12f374e8f40968534ec166de2", - "81c1b81cafe05c18e2043e6e0a7e73a1fe900320048edb9e048dcd6f5956e7ad", - "ac33be6f45ac3697864c1176ecfbbc87ef0cfe2e2074a558c85344b419a595b5", - "d911aa5dbdf4edcc424aee94bc612511acc1425f5e1afd0ec49a02ab36a4a6c7", - "e5e55fc298c68782ecb71b95f6202362be01b9c7706d9732e2083a82939bb849", - "20c28f4c0384a85cbd02359a6975b98095b613db26509cd267dff95d18125322", - "b268d7ef489222cab5b97cae15f2892cbdc007df99affbfeda3419c01a355397", - "5e0d2bb67f072795f02d8e8daa164e9ae6e9e1797c6ef286f2f8d577c179dc53", - "85049c9c5e65be768af6827d73ef9eaa5fe05a0676278782fdafc920b419ce95", - "7a10064ce0a7410909c3c759029e25316f44a609290cf0f081004da047a7dd48", - "3f73b7ee872844c5e6480b90424e237e59b772a3e0bdc796d8a61099972ac7df", - "4c4eee92ee9e808a3fb44e9e596b1ec3ec1cb8035d7b8494b6fc86308d4ab4c8", - "45049d58c6e0d29003c5f8ca61dae0d96be8dfda04b2097fd3a66a0b710e2ab3", - "12395e2604e0c319ef332a2a06e9da7b5b516ae45e39771982386d6c241376ed", - "0f6a93643d56bb9f643a750212a1673efc999b7531dd4a38c1dce9f945ea66c9", - "562fa408f3bba05d16323b4473723ed63537668d19e29e30ed997c1439d6465e", - "2f09b74c32551cdc91c7489899fbca76b782e03910d64a42d1b1939abdd71a2f", - "583a8cf7479fae2d8d3034d59254974779836dbaf622a9989d3c8e05ebbe886a", - "584da3ecd252cc1749db9ca845a59bff0e56abe37c85c41dd052355a1abed31b", - "ff3ece80b9021cacce9e9610479ce543833453054111b7697f93755ca2662c40", - "3c1d00945259d71ef13754c4af20d1e27256230dad7fccb43ab090db182f62e2", - "94837e33302d42c5645b0ddef512fc199865129c3189b2f395b9fb023c831089", - "6ef561c13f2680b6b25d2f0272b11105a8df940ead41f4c624f23c719f881183", - "63d935887a892775ac173b54dcf13ed9196528883df4bf3bdf337cebcef8c942", - "0d81061ed5c2dd5ef3c0766f9ab1c4eb524ba503aca160166aeb83130e2d873f", - "aba8811c94618bb32c66ec3809dc80a7cd3d068ceb158eb199eae089b2276fe7", - "95a01dabda72f6c89a89c95c9f28cd3d18fce7e9c358fa009bc34c9ba9090328", - "286aea42469e1c25cf6b520a6745bf976a0ffd52d4b4681a82c074ff89451971", - "b68fa2880d7a1dea183797082c825b46d113bc8a7decfb7812b04daf0afdd0f2", - "2b88bfec78d01c5118d2675fc2cd8b0ef5027ef6e8c4aac4ce6f1e8b4436a37b", - "2c67f6e875dd819c4f163e5b9b08aae0301a0f335c78a9c3e699af434ef22737", - "10d2e156779d60e4678755401790dbc42f3a8f65312e75a4475c3d49604cde34", - "7028e93d08a479cf34864e8e20376e43f309cab8a3436645b9dab279a425b379", - "7e6271c17e25a53e83a7f555fc6b0a6a0acec17a3346585a28c8cb224d3d9e35", - "2ae036fb3e3974653bd2c70f83cfe8dfa17ad7ba420c2c1e74d99e92f48cc71e", - "2a07cdbb3606bfc807ad3eef161f2afd47ef9c7a2be4e7fb530fbe30f66f31e8", - "40ebf9cef07ae69c7660d3f916700d8e6d05f58d7d769d1d59e8b726c073b696", - "8319852310522c06ddb0cede524d0d604d7973a7c95055a1bf45e8a53690b837", - "194f3e76fae91dd3474eb92bbcf253f008d4dcd3cca253148c4e3d0ea60fc950", - "bd259f366bf7a3197db5b4aa85ffed4977bb7b772691ee0d206b19981fb656e5", - "39518839c36563cb00c0bad79263ebe78fd03f7fa39e93033157644aa6ca88c0", - "d260100d75fea2aefc39865226242bd31f1005a3056afb6475730e73cd0e6877", - "bc9fd0f6044901b3ae9a7517156b8c71b2967c94bb0d270f61fb068735542dd2", - "130a0195594d32be335934c3adae90cfb1900aca9ed9ab3ac6278223bc0359a8", - "c31ac92fa86232f0af238c54e62fafc7fd3a60195000b40f2e6eca6ed27aba1e", - "edbbbdaddc72b43c727e722bcc8c8a7476a01418930d0150c170f48589a50911", - "74ee2cc891c2609b70625243967ba11c9b13559b7c53c09571bd80b2c8ebe4c1", - "a57baa4373e2eb2124d9274367b31113b3a8faae8bf2228e6231b8cd7c6c2b4d", - "4e413a5ca0ff0db338d65096afa8f4b8eb7432777956c4f45ccd7ea738ff764c", - "f526ca5fd5a66798712414014f6dc9d122fa1ed10561a10c4b20b2894461d007", - "b44ac70bf018da90ec98851a13300ee11c1f64f8306db8618239ff1089fb2c45", - "528b8109bf631dfea4f138d4fa1b18854753922a25e810d821a34597def12df6", - "e9bcec8c8586f428a2366a6c0585c52f46ac6af58690563dc79a84652eed5edf", - "e407a577d47074b38911c40703006dcf9e82268646befc24ba0ac58b77809192", - "45bf7cbfdb646018df729a288ad1f0c5c62ffa659c00e159bebe281c05bb2088", - "fb822cf2e364d04c1f9d99e4f88396d57a1c5ec707c912a0ce4bd41b89d81842", - "d935563e4fcc1460b08ef400bb8aa6bc2b6ae3ac0c30bf621c1ee3fda402f75e", - "585f7b44582277d925a3d682a3c99eb5474d46289d357a1f6a0b4d7b8fd4dfb7", - "ca819547bfd0c67ff30e70e71157b6baa489fbaefa74d883e7e36a01ef7d1f5b", - "9894bf2ba8fe4365a2e3f93876ada02f993d65a57633ca9589f35333b7d6f3c8", - "7e16cf52ee3f424c00496d0e336988bc7f264e596315aa14b25154d4fc2d8cb0", - "b65720c5af43525e5042e5e6469d71ecb7123a530383b30936cf5f752d960eeb", - "ec830da6d1ae41436d943f2c23c297c4f0f06724c08810596a3fad4893cf0426", - "754f651960085afa54387039a05b42ff434bb5141d779df75c22944e5e7782c4", - "0dc2e09d7b63973b1f09e0941e7e288af4e9ad18a39feac1ea4ffd77f27f6162", - "b3827e1d5874691ee9d13d24a502a7c6ced1f50671a0a8b46868c22aceca0764", - "0086ce4bf2dd3103a043033bc6369efbaab1b84aa9761880e59bc06f0ed89609", - "f479502d215194a7319867fcd0fb5d8f5e1f15d7720ee9edf3c7e4a9af869c42", - "d41c68f1fbc5fc8750ea87aa9458c3b8ab56ab2ebaf78d6af908a32df59961c9", - "8f7c8fbcaa461f32b9d2d73501503978157f10aafbd3edaf129c9fca06c1898c", - "4ee28c9df4c7207437f3ecfb185712ff1d372de0d067ab8c98add3eeb68b266d", - "df68ac6fb255f26ff8a5c9b2a3fb65ddddb676b8679d17469b7c0f80263d4b7c", - "5e83326131aa8707284fd10d6e50b262793b3d53739785953925d65e78677637", - "7cbf69d3f139bb53510b5bc8977f9299122b3c7cdd8312bf7ed8977c1cbffdfb", - "50db479fecc83ecea18645df9e4ae320c13d2bd815ee9ed9db198749147cd1aa", - "64a1b3e414e65f24950c3b369d5288574a9b76198434456b6ecd14611d84a354", - "19b3cf204f2d137742b0a037ae9e49a9801e5724c9b9a3bc6616004baf9fb38a", - "dd677f8eb1235cd2b949621846e17cf02671c398bebc2331db56ec966dbd11dd", - "abb762857d77cf8d59a95fb5dcd9e609112c411daf79517b2348a3f11d6e2f10", - "df064fc3fe189474710089316742550f86f85d594e889a82f967977c432e735a", - "8db4798c4c0c655f6d16896d700e8444fda080b4e73cb6658cf60a71c9137c27", - "32aa8325e5b022078aa5858553ac97c8c0215606f82a59367c91aa73bfca3c79", - "38e6be2c24300ac25020b3c0ab58f920e4ecb66163888aa66dc9213a439a5fbe", - "685eb7b74717ffd4141d14d718c4efc6538bb2e2b7ab8fc5ec828c858f05d468", - "f952ce705a7ffd081eb1ffcd0aea4e1405de4a4fa81a10c3b68ca6e31bd2428e", - "be208bf10973b9a3860684ba10269a5cbd5799a5b77a04fa26e7ada0d1430c21", - "709d7f4e39807a5fdb1818fa19511ef0ee5226b8ff4fd79a1c3e3aa167076c2e", - "7c5f74fd3fb7737977c4df17dd7dad678c825267b05df48a03d0e2aa9336d02f", - "36b439bbf69f4ec4e46b241e3680005ef60ec07e799f92c083216bab5c558b98", - "3b482b735bbf184c5ce2924cc8865465f6c827fbfdf6203ab49e99251e7817dc", - "99fbbf77c1432cd121784bc5cbe077c9d83beb9bbd4a19e7765c3d42ab75ab96", - "8e66bf3e11f838c4a9de63a9de0d602394338c2bcc9d71209a14fb8e714a388e", - "486883fcbc7b2a5a2eb2d5cb647e7b7e472c5b193e22647e5e05c244969f02bd", - "ee37c07a823d1c75ee937a6a832ebb01e9699aeb30751a06544c0baea3c99af5", - "429ed5188dc43a0d93378d360039b47cf79c81e048672dcaf7f46450f65ec1c5", - "1c9e41be64438a6fdcc6639b3ed9f41f3aa6147becd5545b2e5c89bf917ee285", - "b68ce22ea9b4999f8a3eda540f7e3a7c7ccc0e0c1e4a7795453db8e6486319e3", - "e3446dc16dfd2104b00c5586131821a62e58761ae0cc9c0e95b602ddff019e62", - "64693f13122cbeef29a70cca6735f23c01af267b3e2391b3ea2212057e69249f", - "150d75895f9083fba61528beb04e5be422c9c0bea5de836b68e689e8752bf1f3", - "9fe901a98c93617cbe03feb0128c1cc21b7e1e9cb7ea958c61349dff68acf0c9", - "24f772089f738cedeeb471a7080cf31dc1a55fb4000cf7df77b870b4f07727e8", - "92cd88c103664668c8775706d39a2ae056253a5c185288e90e6a6927b461439e", - "348714ff409abb0711b45e33898f79b104d99117f7acdc144365986e4c6e32f0", - "d2689ca99269a04346c4135a91f41690c36a0b3a9f0a0f80ec5eb97d3352a3fb", - "5c1dbc437c8155f352864583e394edafd4a169ec455356bb4c2ff40631f66ba3", - "fd844c53c86a63ba5679eadccbdff7162fd621cf1c9369ec9b449d4b82a57051", - "f2d7e4e9cb7b68dfc67bc451ad62586293ca329fc522db5dd1717826fb7a40d6", - "f9601c5425923d5828960bef14b3f1373734004c2048c56223eea46bddfcc63a", - "8414d3819e62189e7f1d56de447348d6483c85cc95cdea1c77b9039c7c523544", - "b85f0b8439b9a603ad4785d4cda2144f4f7c1d093fd2d5e06d9751779d8d590c", - "dced73f72db4a4ae3ee2f58a5b0fc4e1b2359d1da4865701667540aa7352f43f", - "072b8c6067bd72d878468937ddd129816c36215eecb875c7c388486b16036e0d", - "d6c33fb5e61eee0aac806df14642b5478eff7a3fc8f90417ac1d2188bd93a6a0", - "aadfe15cf60423cf0de322468d2c4381867c765e7f8ee53e3ae5065c5d4170ad", - "a44b5980fa25c602b5761a4241f013f65e5084db9a85cb30f33cf85db372f5ba", - "c6b1f6da0451fead29e54b0c2878948547e579d32b4e977193c4f1b20cc2d28f", - "d4efb04e87b6a8e149c083713befec73436e9cbd2a6461f43aaddbbf0cadc52f", - "f4f1b80678a560f8e0957289724b7b7e20c2b0b3a91e1cf8fb6064e47b1b9d77", - "dc8c756d5eee080b26a425d5d87b68788176ec5c608a350a7c9a1558e84c5ca1", - "76864978b52c63e6a7e667502e441b4a7b8f51b421b814ead6271daeb5c6c413", - "de80b8ce737abaf0aa3fd6cdc2c3ee7ea8a2f1f1f294335fd378d223220e701a", - "86882a60844999daaa40f7cd877351cb0d7474d1af020036701419ec215a59b7", - "5ffc36d6749c30d1e60c04d880363aee2c83b3cc0a1c92c3356a5d4a68c284fb", - "0c6d8fec118879aaef2aa88c92f6ca1f56acfe2204d1efd2fa256b463ea0d75f", - "bf1b31c687a7246d6818fbc0ed1bc4a8c98ad0c7719050c7d99734ab11207962", - "738611d30d8eb88c7bb7f3651dd66ea30d21fea2f89d5da8a6cc6dfd062289b8", - "d307e0a8e3867050de13ede927cee2463942359a87dcfa948def682987ac6043", - "45b38c640846dac3f4dd86bc6017fb14cbd1578b6f6f243e517cde07d5e311ed", - "ec1f237709d01d0bc9af318b2250741a1aef870fc2b9a62ac2ae82d31553b7ed", - "2b73654f771007f2b3e670fa958b184c4c0a2bf58cca39e99ac4ca6be6bd4aac", - "1a29eab88f772bca6a9b2d0f6e46fa6cf71a4d9a17ff404dc97d3d77132d389e", - "3f7e27abbdf9edb28b520b27179f88741510c9210f980102711f64d584cc7421", - "2efd0b7bb23908c94fc809d7af2f52883d8bd3da3e2a8dd0e87f21cc8b58d9d8", - "edb5e31b6aa087e295003eb6d99ae3160e0292488d0b3c8b118b51392f12fb1c", - "91dca83ae619f4c72ab3c1e8719118d4ffc349658567337ddd8bceae0d937391", - "20485d4d76307276c0811df5cf59f345b95d839a75b501124dba47075fa79bc1", - "9158b2ebce2ac164b1af40655a1d64c22bbf00be09ac9f3e01f5057c3be3fa49", - "a751c6b361cff2afd8c2189cbf5d941203a2b0ebfa9716ed22123a676285112f", - "55c3c3c6f90987419f235da641a0b4655463242712e9706484769f771c968faf", - "94e325fe4ea39390e69f4fcbb510f713dd9ad9c4622e286f434d7949bf44cfdc", - "779068af168d3f882e89f7c3dcb43a2be1d348a74603b45a65cb88fa0c516f1f", - "1f65f8ee49a163180725e2d490c10d01b7875768099a042dc5ec8d8aa813691f", - "271fdf3cdfa52c6e54bc77b5f61851c82bfa46969d9860ea6e843e6fc71ebf9f", - "4146a11b141f0a0e6b8485990878bc05e8784adc82d2cbb82791a48a28df2e49", - "5451d530952127a524f730d8151b2714c4541c9b46b7a390c427b3f14700570b", - "635a6f7f67f3632be7e15ff4a4756cbf5f1b7f0628b111d338781c858c20d091", - "1eefef4f602433fba1c640b7b96b6b9e3a09cb1f1a86efb98086ab8cf302ddd8", - "3ad36f6275ed5571fa2c45e004fdab057036a840a0e333a2195581a1afd22846", - "f690c2dee5f0be37f10c543a1facfeabaf807a7838e2cb26e92a80462b46e55e", - "5358bb617a210b7257d27b98c52c927c9285453749f5dba983c1030f4a94150e", - "d360bee05758a0a88e6d5f876e82c6d559b44922096233360d1364f7cdb240af", - "5e082824a816712ce1b100a01be6efd2115d0c98a2227955a12c9cbb5179bd08", - "b6f3e4a2da054043a05a29d085a27ecd0f5d9897ff06e7ad041ce413ab75f5f8", - "a4ceea2c559f72b666f670fde280fce680fa609c420bb53efafce617af4d300e", - "709cc84305e2ab052cfa978b72e4c0fbf5e4d14a6a710ebc7a7ae9536fc4779c", - "780ff9da2a2e5704f67537e843bd206f4c1b981ba26ed623e2029fa6460e0db4", - "1a1cd245bce0841c9d5cb0cd701b22216dee1075545503a09e5377d144514d2d", - "fd491255631afbea8040b007f1c38943522a2e371f8f7c306d25c150831eead8", - "7a9a44c984318122c82a7108a024696072674314b0bf3e5915f3a05f4477e35b", - "2d684309291952798e88226c8d1068269f466ae9e9459b154dbe88b09f12aa93", - "29d166da1a876e8b3108284f4598626b3d8dc751785a32bd324839d8beb8ee87", - "a5820874f8e8da3103a1f2805c3518d9cad34dfe823873ae0cb398823b36e043", - "8476b8150a2d59afe3f110da2079ac1decce223266364b771c68af6186fd8810", - "6d84d55fcf06de340ac27f1d6d7f31110888feff8d643f0c383792fb732e653e", - "592a8b5ec6a80d3c0b7031f1ac0569ff89f45a1c53fad6d3a882d15a2b5e0d05", - "cdc715a71084b9273b5e05d4c77c8919e0a5085817ff85683aa91f71a15d9e4a", - "87685ec6cc73496ae4a1db5a42c9c0b1f62bfb68759a8b2404a9aa7b0060325f", - "27e4c4d2b43ad3111e756e061c5139d7911f96d77e41534eee329b283bb464d2", - "f83aeb77a8c0b7d907b82142444f1402e26b19babd19b26d96ece3189f315655", - "aa312c65fff8fd7b9532b4c7d5811795c7fe44741e736d09223da40826fffca7", - "d9e83599529cd629e61ed4b44d40e60549a97b5144283c0f015d755e4e364068", - "4708c41013b98b11d48bc95f5b77fd1670900867cda9696d6f48129a753b02a7", - "055c11eea0dbb5584ac0c249cb32327e6724594d3794319f005ee19f83d6fd0f", - "c55edb685284d01bba32a1cd2c0414045e77ab1d289528eb9db2d9e090febcd0", - "89ef082e9a3dfa9e10fafdb2d15131715e0c7c2e717841b191d65967a79042a2", - "ae3f130e475926a419308bd1ed27b658c80a9983c7c540b5d60ebed1012c0359", - "683279e88966879a03ae09d6c65d5221aa3e84c1f96cdd790df1a4098f6747c9", - "b451df73761cda5a73afcc3aeaed6a911dfc3030edc6f6ba0ce55cf27b3507ae", - "548f4b43e68007f44fa8f9ac98535e9b9e9545230eac7aacf29c50736af31127", - "644c47ff6a80f93060046a6bdbcec220e4b9e1404fdf2ba65739d2109894cea2", - "9b1433576be6a1caa01c1fa9187ed428d7638fac96957843cac82dd36eadff24", - "8570f7b79c12e3c986b03b76eee4ff1356a5a7756bf352d9a6ed185ad0a0ff88", - "d87d0112f30e17844f4bd7659bb421ad96311a6f9d83459e7decf52460e82d27", - "f70181629fa154198209010bf94cdf8159692822163493aa1906d7044ffba7bb", - "146e5b7ea41e68b39a99da8cd593a84a3cd64691e58c4b427cec8d80e6ca1ae7", - "b55145703d02afbfd9593932a0140bbd4915d9af5ad66feb41b5bc34a54efbb9", - "5a3d3adbd2e26e2a8d26526d52f2e93791df85777ea9469397413bee31818d6f", - "0a4b993fb6437eed06a13c14f3664d2e8fbd19a124cf87041e7313e7fdea06b3", - "a9e990288f9221e1677c0c905bd02f2da7ab14ea9f10050e3e8a4dfeab85a14e", - "16bb0f104077ae8902a97bfec87a26ffdf2f53b2c160b7d407e2ae72813de391", - "a2d67d4b7e278f498cba9d3803920892d5ff1ff220175a804b40f3bcac5df89e", - "c9508a46fe1fd9620f2c655efce6f201bea37245bb01dcd70a8c15d72b465e76", - "0da6ede684ca9f99043655b2d84442e16f38cd0d4c1565c13338929e1605421d", - "1e1bdaeae0191a49fe6b403ff346c24507ac97e8b445ac3a8726fd21e207f7b5", - "607b8ece69f42bd9d06d85bf8255787e0af6a886471b3a6841cf76482ddffecb", - "73d900f6f979ef544347f0ff61b15df18eda349f2a296194670edf59d5b76f9c", - "b9fac5a012d66d22fba943537adb1b264b0f9ad9e0ca56d87642c7a11bf36fd1", - "5c3648d762c3ad46c2bd699161fe91768442dc7fdbb6c90070fb61a12115f4f3", - "55bc2e7bdae0162c9dd52f16f67e1a35245e49998bcc7b40b16bf62dccc687ea", - "740cf917a15619e47e7f1b18bd74c8dcb8efe6e13612fdd9b8c3502ea47f1dea", - "6de8ca725c8b7aebdfe7608d8b857a1e1f631f7c84662e4460071d8f62905024", - "b78bb375e26fec5f80a7079104ba5f4d2b8735e56facdc5ad580eef1559e8059", - "e28721baa5225d58f54ae37042749ed8879096cc232a3149b03ebfe68bf39b14", - "de7ad5c206517f6ff16ee67e2ab4a6d07d4d966a92f020ceed7132f6126ea5cb", - "577cffe56119c75860c7b675efb4083fc2f2abc9e26a58bacfe4cba19c03a06d", - "29e1aaa8513d76e3dd068a8be1f5d872f16a60d09c8e5e9f3127894e57eba12f", - "57282db160e6d1e30d7f856fb46d0ea65a85d66a6024c6af04ddd88552362db8", - "1b71f512ba619b7e3227792f2288d2f97e98dab9cf1f09c960a5f906cdf89f04", - "884e998cba217859b031e337bd6205f0163871cc299fbfaaac958d46e014d051", - "d12a3b2bb0d29671e53f92a6dcc6060c8439cb302b165a0a5c8fefced70af817", - "1701472e0aaeea7d7e5493bc883fce88db5058adbf399c38fc9a2f07936a1103", - "1ec60cb88774c3533da24294bd629c55721f1a880399b2c6cdce2d4a68ce8dd5", - "b00180e2005ae7b58b98b8fdd5e2bba6cd1858a4c94d517b816a9803a5462d4c", - "c530e22c4f9d8883da77e07062574159113829a809318ec5eb1c1d59718073b5", - "5352760a4edb1c320f5b753aa8b9d29c6db52c09dcbaf10a540e435300c7dfcb", - "b7ea1d0126237fc47db25f55ab038331d4e45fb25c71e702444de1af01d4f4f9", - "51df335c7c349a6aebd467fd6a5840fc56f96231519c7f254217ea02186eaf0b", - "846086aef11733164abbeefae2a8af70e5c0085367bf4785b50d190f70bde6be", - "826f33a3ee60acb3b29115eb115bc146ff987a4d040be329431904e8cf7eeb34", - "fd9a9826a5402c8abf7dea749c915554604ecec1deac1267753083449a14ca47", - "3edea3180ced856354f659a8f1a7c21dfa5b0c9e5ead5a19e5332b2dd082884c", - "062760d7e44534844ca63c8b8d15113b7ab5b64358883d5b1382dbffb4590450", - "cf1ff25dc7476aa36c1de5bb2114194ce9d3d0f844325596ca9e5989d881d0e2", - "a3b5f71e41eabb063bc44ada423d92d6c8571090b8a1f726741e38c3eb84c395", - "a169d68e8b1913cfa1e32c16e091fcd227c4c004782ca9a43c16bfc8f8abaab5", - "c0d54a4afaa068163248238c83abb02609bf13825a7b2e9709f9a90e33296f6e", - "4c55a38cdebe81ea358170a23a0cee4bddcbc150952d78152f439038f45cec57", - "3398efa8a8b2811db1fa9c5fb6e049c33b5047f89a287a3be1fa6b4332740c5d", - "cb30dd938546032bf334ec7cb04dc08f28f04bae3c81573fd5324be85772221d", - "97cd7e240333bc60438696e8a376040112f4dfdf4696bd065feae496ebd8cbc2", - "d55c89087594c63ce29ece53175262315d013b9a7a27ce6a5f826507c37b0a9c", - "46c75217ecdcd6e9ab21088fe3339d1ba984ba7203372223a333dec82ee8456f", - "8c05f500b0dba0285c5577d0587068e80c317b031775035f0ff481d7ecc09a29", - "4473c8584d90437de6690e75a9a0c6e3474266668aad82cf43d5a21fae85a71a", - "829ab818e93cec7b1b29a19e6eb246bf123c6e0928278b06ba97b6d4e9624079", - "5cc9e1fe98f21bd0f27f936425e0b71f0026faf456389d01fd51dd14116afb94", - "efb2631b31b48bac70a1e22f861e44ed24d6b3a8912890b528e7d9e22678b3a2", - "d5e99a1317edf54e205c85289924c6164c191213b61970c015f349e997fa5714", - "08c875bd90dc7589c792d8db47c967c91d9a2f354142c0f00b137f7a2d6ea810", - "727edd9bc2506f16b398308177048774f4190fd5b8c5ba506f71ff3f55c86e8f", - "b5aa1d64c7e7ae1f4ca7376455123010aad2d3a7cce563399ed9588acf4e860b", - "9c3ae00c31de22cdaf6bcef1410a4b1a249c565d7f2a9ff3ac70451543a88cb1", - "6a9e031b16d7d7cb1ff6288c21650de4aedd799a9aea9bec44cbd038fa4c3222", - "07cd40de73213ce972933f6e6ccb8c790a2bc0db60099e8fda5bb939f1ce372d", - "11ecd82f7e189f96eadf0bc4560fa39a181217e300a08ed99f592daa6f889861", - "8be82e6abffbd1e60275b38a4932b832640094d5729920f35dc0869218bb28d5", - "58566bc71924e41e281ce625449adbd269e4d355e42f4ff0959edd1f20db7d94", - "ebf2216ce9ce8b4129005a94ef615c0fd32f5eb63100a0c43fa00e19d2506f64", - "45bf871b105bc944f42af763a8b35a38b1bf11379ae6800c37c0ec5530d097bc", - "3570784fb2130e2c59001e5618b04b62cd455161bb7199db0aa1a8c51009caca", - "611daa2412fb49973227425385f96f127b5e9a9a3c9c0b7191182cd4c5a2806c", - "d4769ff14172c5c301faf1940348743b14c3eb1c2bb0f5b79b13374095b4c5f4", - "0506637f831d38f7e77cac6aa87a841065aed3e50196aa36b7c537bbbfbf0234", - "32f31d74871397e7cc67a09005254ba247e4ad570071a0927783bc5987d1526a", - "57e72a2d7c34ba763ebf70cec855766cfa4f205fcf72d8d1345ad877e1a77075", - "ac6006aac76a85e1238c8c87291949c8f7961d4a909c20ee95e60939afc41565", - "b4fcf51ed10957aa30f79f3294e8c245ab1740be5417bf18e491063e12d0823e", - "3c415bb6ccdd8aec72804b25a99fdf7f9679b40e85562400033c2ebd1889d464", - "3d3c03c87a4856d8bcd45a47c6c78b5fe9f0164578b3636e7b109169461eb34d", - "ea63ed4629025b23ba64f1c50b5648e069bf08b5a85d8ccaf816b6c5420b782e", - "7d2ee2870a25b2a5fb805faa9450cd5734fa7cfd54d41799d6ce5b33e154e8e2", - "8df8e71bba08642f35526a9983e1ecd66b8c9ddaf1b06d9175f04448d7e6165a", - "fee00e2f08c0ebe99bbf3eb325754233c3d710be82d8ec14a6b7e90b8b5c5b59", - "f7a5c4c2cf27b9d6982f54b40a5e7a2eb454d289dad4e1db8ba5f2729131c303", - "b509b8ad936d42d8677bec19356441cd9cf4bae56be7bc97070c5fc920e8aba3", - "2b66ea59550b2a366dd32436230162adb12d21848ec60b5ba49d5360f450cdd2", - "b9d248296c9963cfb9975ae01860677dce1aec7bd7b354d7e76fae57aafba363", - "41b2b1fad8dcfc876f6a80356c374f78b230ceb4d4a1dbf1320edfe5e5358426", - "44092048c08cf90c04855262f31b7ba297115215ad145864c7de8723bdff99bd", - "30afcf064b89ed31ba2c09cd550978a401cc56fc5915f9ab3ecd8162eb359ccd", - "786fb7f5b0e96b8293d3fcf8df7a9bd1d3821509618051468ebb3f6d7095efdb", - "6688744707d9b92c893f0b41eb99e8b900f0717aeb9f5bb9bb9743a22d1ed72f", - "7e8d6bc3c3f1279ae6516ad50a36c79563b06fda60efcc4bec1cc8ac6e914764", - "768a815ec2c87cbab36f721a0f52fd9cef5643275e31cf2fbb86fa0e3d06db65", - "55056edf63a5798035b519cef6ac118e500739892361b1815049bf05280c6882", - "271014ab1445f2cfbce033acedd45dcdc0a87e55cf468793fafc8924348de9d0", - "e7826e8ef31e108f52143b109a213513794bdadd64b0ad838b025dfec000ae56", - "a6254e227c0310c248e7ed49f08cbfeea6959be08b1377b2548b9832f339d53d", - "8c00a12990e74bbefd130ccdef366014c7825d7a0fb3616719bd0b258186d6d0", - "2031935ba21bec9cb0fa716d7deb0f30ab226e5c37ac19c97eabee3912ada3e5", - "a5d7dda5170fada222d26e23db97b3bfcde8b720ffa33ed08235d14d2144f731", - "cc6886b8669e9c32ee2d23f9c846a1f70a9472bb44e4d0da81d7560e64490eb1", - "95cfffdd5d31103348e4b845be222cb644af12d323946ac3802ebd0df239462d", - "ddaa9ff6e3639e2a667029ce204696c64d91c77f1f2130ebc5f547b45c4a966a", - "617b86361f77ad8ccfce540486d0225dfa21ff22904a43acc9ccc3a0803feaea", - "c23c948293a767c9939a89c7d98cf928ffaa38b7c3900fd758c0446c9f5898bb", - "06d40f251749a3176db0031105c6d3f66be48241aa9d6d2fa3e27821d7092b36", - "3ae3cba0d8f6c8ddc4672d6171800d37e0c084ec6b39655b90e81a674bcf8464", - "3d724680156d38e79724fe0a82c12d1ee88257b7aa5662f9675c1ba99e60f6c1", - "0de60ca7a80460a9c286a59c602b25593903196d8d9f430cdb4d2cb9a77a3159", - "b890ac61e1fbea200936322c57f87783d50b6080ebcd4db2905068159fcb7c28", - "2d79a3a70edcd8dc9f4614ec6586ebe7ed6d048a8c041ea64ade7a766aa01e96", - "db649e1afa2cee30e867459e5a8302c886e19ef938485d48b0b9a5a22e749f23", - "3d3f3312cbde144efebf6eeababe23cceb12062e45bf8b975821047e415b7456", - "58d0388572bad514328047aec9f33e9787f4281be8acbe9a9804e20654757783", - "bcbd06ebd04efbb02546a2a5979e11def0f9cb8274f671405fa2aeead9cad6e1", - "389981950215ce73f406b7bbec4e562c09d0a84c9755bad130a7cb242d9b296b", - "a205bfb4e286f55c62c385421ac9c7c040f3938cd741c134673cfa3e702bc8d1", - "b1c5e486072488bd06066647444ad4dd5c705d12938e939299213aa63e46cfee", - "e525813a3039b1af88e5e01e6d016e97e218718174e74c30e9eb18da4dd4145b", - "befd03ccb3cb6ab84ee7deacd8e893adde97e424e84998d3528553432bd31f4a", - "b364109ad91adde9f63f0574cb07a9ceaf4ed8d19e2c0837c502abd80748f269", - "0c203d64173f1c4f9defa03e333d5d94d814455e12fb333b9b2e9ce7fb791573", - "41a20558d791924760286cfc2a2699ff002db7bf564d89454107dec43f229b07", - "fab6882b59ba9d44d621c3dbda5e5bdbc0422407d7a52f72ee4658249e29f3cf", - "423f49a2bf476adbf061d9133b96b0ad8ce2bf41ecce81fb82c677553ae74aa6", - "f6feb86242e95aeca549862ad596487736df04d7350e3762dfb1582381712336", - "bafb8375d71709bb5472f4f171369051b13b5a554e17108f035c8fc1851d6b68", - "3b9b3b57924e99ed4c788cfc77f9746cd259aa206e39ee0065cdaa5e3dd79f53", - "ef239cae724bdac3083f09d4b6746f6830abae484e18d39dbbae06931e1568a1", - "17e1cf57a21b564200046b62e7cbff0f6b0e944669a0b4ca57c369a8223fc32e", - "78d8fb0f4e272039668437f2738d1463d47a7aeb12f66b827e8b2a54a9ac847f", - "108c11c4d83c1abc10242eb0797f33daec571896541272b878f8641fe96cd3d6", - "9f71604a5e6a1bf27775b73685094a4150a437d39459fa7a64491660a643359a", - "9d0648005f22920181013e13bc888ba1593c15921efc05f99260be664919bfa3", - "b7442a629ee53dbc03250a3c06b532c0f8d4fbc3c6c2f33aa859465e6a869a1b", - "732268d64cf344099287cba33ce5389fcba4b994ad6960f20bf2b62119fc11ce", - "8a933cc4915c728c9ecae5a805b178411ec058b433fe03d350511eb017c7d846", - "be15a5daa121c3b3c30b7b534343e39b76f321ca539c5a786a2701871496767f", - "01489ec5f9278fa3d7357c2660f1b1cbb07dd465b5fe1f10590eb5c7736d6f55", - "58654a0b81bc30026a165ddf86eb96c949746149dfece190d9bed0e5cc028ac2", - "47a9b4f323a7ba6cfb89682a8050e222507974ef4f5e308a67d631766a58e970", - "bc2c18ee475d6e59f774aaf173d152a09b4119b5c02c4f974c7c5d0baf6c73f2", - "62144c29e6ad7edb74ea570146b4523ada6ebddfab486bcaa015ecd09a4a1759", - "c454bbc2cefe983eb45b17729949987788825645fcc608f11c2b974d4e8a2ad3", - "54447da4a7b26d46106c0a95be934f0f63d2db6edc1c7d6221ed6366940a9bdb", - "71354c0e36590decdb1f2a8b4ee505a90d6c3603eb6ebd23a2538e9be4cce473", - "dbda54d9e633f473712418a71a9a92a8732fef2f2827b26c446a83fb61c0c0ff", - "f179434d253eb6b17b536fe62e2a85b6190d5e06f6349bd31ec42e377a574f7b", - "2832c967f3b05e70411d682703ee7e3c790f9d7b8ca5403bf18d0d2e93d2b5b8", - "515835e2c906561b85b0e57d9d75813d42ecfbe4883f50b93329e9052344e8b0", - "5b6202acd1305fd13d18e771e780dc0916510b960452edd01e05b13c505594f8", - "c63baadf03f776585d3b0c5faa65d12de7effbe317184416b52bc4b0619d1b22", - "b2f4e9b25f53ee1dac3667be2d7fd0b9aa825f39b6d2b729bf0d4249c68494db", - "30cb010d5d0a9c5876efd32214283c4b8b958afaa2ecf75893923b036388eff4", - "c9878e8d30c544dfc4ec15cbf2fc673e10eedfc3c7ca8ab46e3f7d75ad3648f0", - "47a51dbc6d4994ed9452b050b4200959c7072be1947c18e24ce75d2e65064405", - "019e1a37b8c0b642dc41a41830c68b3f51ae4203bed2189d65200eca21e83201", - "1a36bb009a3b75a6f6430d1c6811129967ae3324ba687a8fda3a0121a8c20823", - "85d6c2b643e8c724a8cbc4a4892d2e4bcd0d0ffec38df36e37f5b9526d813831", - "1d0423a19a2c0265dd3c9248fbe6d2aec13e4ea523de91922728fd31858486e7", - "522da8810f8157ed86b1eb48830e917402450341df42975a62665e5081f3fb9b", - "53d2b9d47f07d0aa08b3a4ffd8ada6d7b4fa9b9f50c2ec516b3dbdfa86bf90f9", - "a1593e9e900ba66d3dd3c6ab6b2be629a77191ef11b5fe2fda707703eb715c22", - "49f73c513dac8ee4a51679a7938374b941cf88ee87514fe9d7a55669c3af13da", - "64cd70ac435463fe2e93a99f4de32c2957415bada691fab5aa65ba9a0433df28", - "c76ff68e0f7715a0b4f7af14ef94f3390a7d79ecef4f618f97bf236232ae18bc", - "70ff9011ee9de09edae7153b9921c0127865546dc0bccfad270870672d5ead5b", - "46578e188d2d1e6ed4655ec4c917c117ee1f4203eeb939f8505c39df844d7fd5", - "ce661f89cac7d3e1d8317c0c02c609e455c1399487b002a8086dd0b30cedac4d", - "aee6cbaa1398d70bd885407fa4a81be4c2fac6a9645d91280768c6cc3730f325", - "40221abfd69e0f20df460d1276f8bcfe98453dad9370eea4d02be7498a31460d", - "71c5e66f0bc1bed869fad900cbdc152d3a306b7b36224c59f093a4ea884318c6", - "f60488a190a3e34755cd8f2f6445bf931cea63b8ace070636c64e270c55280e0", - "d8b2319f9b1c742b3935c9e41fae954da121cc11802b1ecea1921c10d4fa4a9f", - "1e384fc6b8e263af73ba87d891f41781d83d9de0f72b01c61811cbe0563a9edf", - "99af3805e870333ddef72df05407bc9297d107501f29b4831b960e704702f8bb", - "a3eded1251857f2ce334fe2dd62947e111a7f509afc472ce18978bfb6bdb465f", - "f09aec30c22fe6daf594b9d4af2315df965f8bffec1b276bed904864232d4f97", - "c56f45bce2cc9596efb60f7973c41da3274cce806bc02c1c94faae03f98ed37d", - "8ee14ecd889d8367c2566d6796b0f67bcee7f84c508a064d7ff669f4d7c6e9fc", - "63926dc02f4f2ad7017ef16f60701c74380b5230896d6acafa2dfb05ecb31578", - "4a2da72f250929b98524afea7f00ccbe1dbfeefe7d918915a0c21bdd570bf070", - "f851ba3a501ccf473b33acdfb45448402b389457cb7330009dd1ee4a213d89f9", - "3e9f15e6e1c37f6e267a96c2e154501d58bc74ab4e0941a4206be2648535c4e1", - "0e686499b7b16f70fa9eb7f66462ef77cc4794deda9724166542cd8b7f748a23", - "c700728cd3dfca8d12ccac67343833dc77c411425945defa4a7a333dd785b50e", - "4d5b2d23b3329d7cb333d679a585ab6c1e64d8dbf2ff16b63cece3bb2e145a39", - "806c450283cfb9fb41c653cdaf3ccf58af993299dfa36b8be2e6a48f140b0ca0", - "eddd715d978fd1a86dc6928bd5a6f976316a8dee6de9ee09dac0977b5764c59d", - "e028afb69c4d05c1242a42ca617792cc3e03d17e7b6e6f58166b51d6b97ca73a", - "baa740a4fd2e2499f148328cbeabf32074e24164adbf79e22a496834c663f6c2", - "b3b7617aa23754d7d5d5c82fba28b49f0e110c3f521379b8b862a7ed466119e0", - "2fc6893215faa580ba0c28d56fe06de0aed1b75200429ea8d08ebbd592251857", - "aea8a3fb6b389176825c07ec5435d085745c146b950d0d96a3ffd416c464a9c1", - "4b52b4d5870516b73c603462c566910ab7dec0c59de9ec2ee1e11f3c77dd0c2a", - "1276131b7eed02104ae6cad67fa76a2ec54bff30ec8633270528709d413997e4", - "1b209af68c8b78c9047b0a307781f445182708c099a91b2974c3518a3e900bc5", - "73ebf61fcc8b28ed05cb1aa277efb91c83929fbddb0c4aa9f298354335352472", - "555b13a77c342f0c07ec987e735a6bd95fe25a42c39206337b61703d697040ca", - "d99c5bc9c1bb0c5140146e9fc9abef907cf7617236b9eec01a8afd16162cb1b1", - "676ddd560fa621accfa086367bc4dd3224b0a3d28e2463ee7c26d49f961dfcb5", - "e19eccf27832f5f57cf83c8de3a83eff20e3df83db2662a14b796ac697e56a61", - "f7bff2e49c32608ba97f5d72bdeee06a3c8537dfadcd2aeb8fafd011af4fe782", - "0042bf6fa06d929d6671617737e91a3425331f7d5ca2b8138857ca851bb34e4a", - "9e3b0e3392ab634fc95152bd3ceed1a0c352e7b783e97357ca5b8b88699a79e0", - "d51fc0c86f52fd4709bc32e3b24e42769abcef561c8c5b014c094e56ab0394a1", - "35641a5f37708942205a441810aef429980a350e5cb52e5221a17a3bddcaca27", - "f8008204a6e9e16784832937e8c712a194019bcf8fbd407d1ed4f8b44853a538", - "1ff56a61b0ccc0ccf96bccd88088658a10146da81b23268ff0c18bd018614c67", - "25b8f6cdfd9346a415106cb87d2b6282c0ac95718982b33d05ae15982bc14b70", - "1678058bbd0db520d0877ba2994ffbf547fac84ff2c45bd6ff5a32bcbbbada24", - "502cb0d74807e3af3a318d4a0fe91e8173c44a30c7702cfab10b0d254c71a81d", - "634e2879a9472456dd230f041c7211aafd9efa2937fc4f3433c34d9c9ef28aea", - "224e29ae7be856a3344d89b5fef94e9e106e5f7e83a7c1dfe7628a3643f043e6", - "7db54084c442ca85b87acbb3851b0da9d42166b0cef9b4e14ee80b887af3d372", - "101beae0d40b3b025c6244d8fa0d6a106ea45cedc8b08191dfe5f6e62ba0fc3a", - "e5e51ceb5877be415b01b3f5161bd5ccd8f80dadc228bd34171664a92beebf50", - "6af3b87aa9e4c9f3c0b16c8c979c3f0a7334912b40b8edc35c6fb628fc5778d1", - "d08c78b1789c736757b065c120452c27c97e63dc8320bf882793d4d544e837c2", - "4e104203527e1d5ec61e294b2a5b352f6d66a995367b0c16d997ccaf2ba2f5a3", - "c0a96be770a659abeb11a7d8446b581d2e600d887c4e6da31017717082bf524a", - "eccf72b2f755e8356d7a6e030e7252f7ef1f5046e679cb12a3aaa6f4e117d335", - "adbac43c735ecd92bc1f38c1ed62c478e41907d106626e0497928d1ca288f0f7", - "6aa89cc9f468c329f25fbcff9d18708fc25ce9768524db4f02f8668199feeeeb", - "3ee1317c69d287e25720a27ebc4644cb98b74c3e19bb018b77a758797f3f6fe9", - "6fccf6de655422e5a4f5efafc7b24d5398b7ff4991c3d2876c9bfd7a6b3473fa", - "a18520530ee05497b37ba33619691bcd8c88e422627d15417a7ac3ac251948b0", - "5707b1bb72f200db990b0d5b7d9ed9b3aa6d27b9eaee7b497afc1f9d83c9fbdb", - "08cf1fc9c4d5415a9be9d8a94e410dfdd3135fdbc44d8c4d8bcac675bb2e0e74", - "dbdb6ab6ef116b498ceab7141a8ab1646960e2550bafbe3e8e22f1daffacc7cf", - "8a03243134f210f5167178e88955cc4ef02d3e939efbc5aef116d3cf083603db", - "42b3e47d381947200856b4de71fe2a5d331d5c09d9ee216bf86b85ab5241ba06", - "f57632f0332c2e592b5c33ec455510e6974b5853dad1b6fc76b7c26b84c97236", - "d8f35baf12085a4de008e4d2a84afe9c53ef677f20de66f2f159375fd759a780", - "3a132fec7d4e607e52ce06a74edd3db413bc9139112147a3cd86dd6066267b6a", - "e1ebc00a8de668c973d22845e29fcc29aef8b1379d62f2a412a765087921cd84", - "8d457810da4ac48a41709ad7c656087ad6bc152efa9649ac598c0522d5787a9b", - "f250b76a48d8cf0af8da1f9766a81a2c4019e6f54e1cb10b29eb3c6ae58255d2", - "d4f15fdd846eff84f08a046f5ec2fcf32ac8f2e28e957ea1f626b1d3e53f01b7", - "bc75c7e05a3c9a45ce0803566ad3923a7d6587f4c89ae4803f783a7b9a19b68c", - "4dc87d24749a40d500702b8e5a1d409ccc11c6cd3e23a23f74af36cb705967bc", - "042eeebcefed481c57476b7dd4347ee2bb67f221238a7b0bb743442568e8d490", - "be1fde9ffdf4efb16b837ba3bb7944c738d3456764ed464c2cffaf3510f8b080", - "ada93b63339e4b21e3315fe71005914dfdb7826bc9035a25bf9822ab2be053a2", - "ee86136a4496d1a0b2f924f67d22f9ca06b7e9b5bb8f3ae64afe5ad277cd1a44", - "754d801999f019fe5d2b81e55505178c9e3a545f09933cdf5ec8ef4887c8da90", - "ce781a53e4a86afc8d5cffd7da9b56cba6b6732d6d5f05eaa4e3c108adf7b22a", - "fb8a9ba54abeee33adf89f22a477bff97490846fce529eb490ba366397e51023", - "1f4ce9d149dc599666c91f89f456fb1dd1cda2c5859eef903acee44a38970935", - "535f24352d023780d1b3291b87fe50df6b40c7b785898cfaa0c710e1b09883a5", - "400d1438d339c1432b7f504dfa50119eea94f7afef604e0f6ee72543b22f57b0", - "9138fcfb08113b22fb6f5fbc51e191e8ccc2826d9f59ff15e424340e47ab8bb8", - "d173b3d5d4ce0de30ee9fe8272cb2067b45b3adea71e923d5545833fd9b62185", - "4a1f37d754a1a0a424b1c9535b76459773a828a49552145a24a4fcadba5a5d06", - "130111f5c9b2020760c1b58126647cf493613374eedeb5b335352c5672d189ba", - "782706eb825b8395e6ecdc7e51a312f65b6ef9f2710dafa65df40802b8b119f3", - "7f6774b7e763dc3336bafc72945df6e782a7d313931ea5be4f4d602904730280", - "81bb4e09a5cab1bba405c15a34e4dc1e24a3e6154b3b6b8a76aaaac69ebd765b", - "d1f440ca12465d000c0e23ae3dc5b20cfc5a6e7ea29d83183ded073585d69eac", - "df09f2d4048d10e5a7458bb12740fc0952f8be6c9d8ff6611edb4f0806528ffe", - "25635f505ea6dc15915bd729ca3d02b9c0e42e98ca1c007cb1e60319f6f04420", - "490edcfd1016d83b78cb7e26e5a8b1ea2ebecabd74af38fd3701552be97f0a3a", - "1a880eed7002ee2d3b44db3a69b151ea04715a15626889d7d2b5d8df7592400d", - "f4e3118070b920a9a1b21040e9a9d533c0c9e83e0b06edb79d247b49b6cbdcdc", - "491febb660afc688d0641288d7b8eb14ffdf0d3275fe668fb58f10cae21f4a79", - "1d8ae8a5daed9ce72c6d7fcd3d868c193f42146e655a6cd24b3c8d6d0894af77", - "e3ddbdc9e01cff5d630945535c6f46a097646aac51d34e9f880ee246f2f29eff", - "0f4ea60fc448a5c1e87ab1274ceaa20f1f4d0b9ac16d5b8262ceb528ab4a1627", - "43aabf82b3815a6cc4d00ead3c208961e0389b084f5ba78cdfba8384a769ed3e", - "54dbe7139ca2feb75ddf6e8e281f2fe8e50f0e79c7845b07cdff4d65b71fec97", - "bd4767db216e1d310b9eef7eb9eafd77ea1d09558f44603afadae052c62a7fc7", - "4a545568171f3c59e3e907a00d22743a66dba95beee54e1093aacfa302e95329", - "93f230c31765db2f5b25b18e1364d135675c38785b1e6f1c5bb0c07406c659d7", - "fe6bc09f605989e1bfe60445fa28946b3d111d3cf93aaa1d6a5ef45c1020ab30", - "36397178765dd0a1408779a3756f4ded8286fd87bbca87294626d9e717a2aa9d", - "9bdd8673a0edf064c2cdbf298383edee2d08a1ffdad4ba3d41ffc6741d069527", - "05ca38709c2583493c4b746fc558a057bfae43931741a0041c8306611ea8a624", - "f144466f0f8d77ad944d2f76f38ac09d0c3a719c9bd67a039dbbdd1f9b644ee9", - "e3e0ac1904355499398e8df9acd407b81fa86129c011e35f6232ecceaad3e978", - "12d5e52fd5d5c9aa891cb0709f51ed91f9792b976225a05bc7123c45d42fcfa7", - "9c7a53ad3b9c19adfaa6bc90aa78d7ba6929327b0b884644e01ef3923b79e25d", - "2eb83035c5da4f574756e2aa9ad81809b14f95f3a73ac0d80a6c248535934959", - "1f51d8a0da169fa2ec381ec3d7f29fe6745c0df1b851d9fc6b0aa59d7437b155", - "fad6416fd18536b349328e81ccc652768efc4b11f8d32133fc4636864cab19db", - "fa9fff03abf5f08dc29d2b265d21b4f841c92249c89e901a585f668ce85cc092", - "1abb969cbb6a30c449aa2799f0c5452880ae85d81f9f31656001a76e48d1f247", - "052e3cc47f385c0d8f4ae4cb9f2ba067a586b2880888a7661a64f0f526b08593", - "32adcbddd949ecafd8e1c55450be2f635547379d94c00fd7f81560953406ad3e", - "b468d092d74d2b7a7b79c24482663517ee2df2b09ad29bc304878fe05682ade0", - "4652c9347206ce93749dadc6c5a1b7c86200b18824b196091b59533f8760db56", - "8d5f51c0fd2205f595458882db6a2d18bddb618443874e621624e5141585fd8b", - "7615ebe8f14c0545f1e0c30059e5da224a17fe48ddcb9c65d18a780a67828d43", - "cb992b3609de1f2553d9a5c635c4fed13ae663b9cd06a05c240609ecd2ee8f3a", - "c990bceebc225a82a81de109bca472920511a6e16afdedd1b1d4f139e2e34d34", - "05228fc494af6bf8adeb133c996b357806015a38c9880d02652bd502831e7166", - "75a69099934a57efe149e94d55c458bcb379670cd309b38fef174fa6832e0a0e", - "94f16b8170027dd60533c3223d83a63c0d349502cafd7eb5ab9b21059ca82085", - "dc622f47607464293df30121b279be53f8a445936fc970dfaf6a396229d22f55", - "b6488581b8d03e39cd10ea6b6b271689060b5fd64a7457b5936fd136a4a8ee74", - "3cc0a9c60ef4c4f075cca58f4e48a8f373b87a38a67ee4cdbcf56454387337b7", - "0bb5479f80fb4b701fcb7b20cb591fc14c5d218dd6c3ea24d4a39150e0d13f58", - "3eebcc01c506c8aaf6f1e98b432f83aa20ecf59decfa7e02ff0fdb4758fb251c", - "efc32934d7f75bc8bf7308bfd3c2766b5d67c8e777b70a86faed487ce874fe7c", - "8de3256d6bd3135bc957786e8ba09058f36429a9f3236cdc0ac2769e186495dc", - "4f609c7c6dda43a1de8aa6ee2c411d8c6592ea2fe725c96528545733fe08fe6a", - "38aabd62dfe1040d3517c6e08e0fb8ced0c050e274ea8e1c5cf6eb75922c8447", - "73cb23804a6c5589a3a67b93eebf107a28ed20ff77ad3167c2f02d6b8715c8b0", - "6734cdf1dfeea7759bcaf4503d1a4fa5572427387b993ebf6f56faad902d148d", - "c3b210d130d241791d080d9951908d1f06b2e22aa8a082ca50ef02f18c63e92e", - "d36e7535c016444624b05303346e4305f566c4863365ddc210db67e953f116f0", - "85172e229b57bbc2618eeef0daf973e99cf82e07c846a67d978e5033f924a4f0", - "fb0a4aa81678f61b2c33d8e80cbd40199b6f10cbd1f0d86546abdcecf508bfa4", - "bb950ff463ae0b93b867054691a2b3802af1cd040698208ce4fc1024faa1a416", - "07a418112c24b8853d0236ff22c74c463ce80a446926246e6334b94650978bde", - "fb59345a395a7e3b76373188fc79e87f9bef18219a936c79c9312c00a19abdf0", - "696ab77183a818ddc9570e86b8a8f7d37973879ca56767d42d1efd58dd6a758a", - "4a82afab2f58af40b85e02fe0ecd236e8bcad18ab756bbcca19f7d177e5ec539", - "ca6c9cc0c09ff0767a8355cfcc9848134c7e8accdcd6f59e7a333b5f50fd7bf9", - "0c5f5b9834351dd747b039c59a0001cc7e657cdb2d9e962cabbfdaff3f667f95", - "a7e87914d7e6e451d98b0590374eee6aeb800fc34089d7cd8f7a2e4c75ced1f9", - "7af0104e7f8c860aa77b740ce4da7292d42cd28f6007656f876257118e204f1b", - "02065c6c7e36c4c99f005ae1930ab36e3e6aef6ee635696aab9be824ef22fa91", - "826fda97d9265e049f4b7a5caf64745853bfce2e20e9a7f66ebd3df9268918f7", - "9eee5e31c39a8158ee62fca0f7822b14490bb76a17be75b3659433c6f251c811", - "5a6f6c04684823278adcc837b2c3ff038ddc8fd17bb0ae6a5cdbb861a8f6c5e6", - "d311acdcb38ebe9db21e3d8e1518bfd889e89dd0e82fe22beb084ea9d0bb5ee7", - "d6ee3c38c6a89527e763535c1b47ea5d7627190dcdc676102597a4ae18ce9dcf", - "9cf5d301f90e6a6ffa4adacf1670774c25fefbaf1a08a6e52766ef90e376f16e", - "f49c007d175b7c622d9e91c77d1ee8d3f7545cde455522d093b6aee47b6737ee", - "d208830d5d4d919ca49f1c54e84ff076039ee70cf25c2cf233a33de30c88a1b8", - "97feaeaab2de2d4948cff2d74e740477bac7063ce70ce8dd934fc1609277b812", - "0acc05322788c8f919a732f2ce9d678c18b0d67595971a12945b0fc198b29515", - "dd541d0d59f5b8109cb51c5874bf7f0cd1e0674a016d14ab93eddfb23f6719ad", - "0ae5041f419230e37b67459837e60aab9dc0298fea0ff857e884f2e33ec8e0ab", - "2d7a286946f0fb97b75b7ee3d633980dfff12c5283b7927b4f26eb00f886df77", - "f31092fdcfb0c985af134bd1c054af0a6cad92701f124fe4b8e7d5502662b148", - "0dda4cb02f2a6c2cd6029ec429838f408e75869d4b8c2c20609bddd49a081cb5", - "d84649e151ef0dad7472bc67db6951f600871da25629ed38c633edb5957d66ea", - "756259f29d5aa4880f439907aeeb1f998ec0b880a2718f4c904fee6dc3b544ab", - "5ed4e175338d585a0f39a1671564b8e881c88eee3af23c873ff9ba475073fdb9", - "7c78bea7292de87002e9fb8f7cb6b408d5eed926196691134e371f5884726a7e", - "df1d4e4164b08b021fe1929696f620616b3cf9e5374034c6e7cbd1fe0fb16471", - "8b18b55d324b1bf30a5a835ea82379a1858cff4525753767dbe096c66e061e03", - "987f5beab6c03165c6fdd815fb5e8b5fef863ac3cb22eec51a2f6c30f4d9cf7e", - "48a3c198544562b5b26f6dc348a6bc0fd87b466a6d43cf7da5aa6823cf50f947", - "4d308909fe3172e10f2e283f307a9f038faef6745d6935fb0846e166653a2176", - "90b49ae1de64a61c3863053a648bf99082cf8181046dd2428c5b3838316541db", - "b170402608fea32950fbab4da99ac6af6d4d2a21fc10e7441f561c211e572339", - "ffb9ee2ec4e601779e3e0de7d4eb375cd8285b33241786ed6e22301199c92049", - "355c049891c334627d8091b4ca0543d45e1b38dfbd40f5fc812fd6a1b33323a9", - "450a8be9ea3f982393bf6d957dab9c731649165dfb02f121d99603e01f67e51c", - "23ec6f7539ae5bbcb6b382e58ffdd9ce01943fea163e6ccde168243894565a41", - "d77a3757459ac7cae12bcd3591d692b747409712d194bcf0c6c5c9217004ff76", - "66cd35dd8ba98fe646d348559217e3d3deafd305750c5fd3daf55df795b94b8a", - "cc97e180d49636bbc20c75a651e2d988996dcc560b50cbb206433e297d3c88e9", - "0614d2204514cf2b686dbe0bc85e3275fcd39b396ddfcd376ca1395f2e156bf1", - "b16f9ac29f7824dddefb8a97e2fc1bb261ce24110685082de3ab7dac378a969e", - "8c17e1c3ce96ee5279e7702b6365e60f213e8121d492d814c0db39660f4d2ea3", - "f271b11b4d0cb66cce124baf1f4d4a290c9569532300aa7447969dceee6b541f", - "e07880ddcae0eed600ca3cd5ec9750b77716a4891ced2110c924d780b8bc847d", - "8a48255c60e0d7f2f0f24fd1f601d6a5163a411f0da01f767edc20226b418445", - "f725d3182ebe66c3767c8cb393c2f6cb96fa6ce15271fc81379078bb7752f72a", - "7daf741abb14e73039de5c53570d56faff6c5c6b6e264d70d4b478788c5a7efa", - "4f53e02804217335d368a6132d3d3f8e262a4d7d8caef12cd3e845a918f3d5cd", - "5788b2e665b64ab55a72b818225749d4d1a60c506211251e972bd1ce1e4d4887", - "51263c83c76b9ca64331877e773b3700a2a755817ee4cce2bc2d981c73708bcc", - "82563e38bb35aba852a15ab11a12f2f727f8b480a35e8c11ced6c8b38fb2416b", - "339d21bc5b75004cc163969248ecd08ffdca008a46af64d3a77618dd8dcfcd09", - "623c99840aac71e71bd03ba7ef3d0fbf37470015e4767b7a0ac561aff3eeba8b", - "5d263e15a5354bd2d9eb5b640944de20f42a0d8707bdb35db51d086e9a7cf9c7", - "a55428328a28bc9abc3a5d3bec7991933c00bdc66e2f4deb0c9a60b73ca4cb5e", - "93628959b1cfd2919016c81198c55014f19f5cbcf40e83875c02be79c0e1e69d", - "bbf54c32541a7ff9107e586c04449aa50d45be2cd2d9c2047ba19145ffa2a527", - "f08c1aa3bc6d6ba8114e7f9e37be6e66fcaee0d74f9175cc6dcac7fb03a135d2", - "a1527bbe23b70189d76446f957ff52d9965d64e43c8b3a69a2868d2eb1aac266", - "7ef3367e6720bb0fde1cf70451dc809afd8cffc3fa0a1d49524d62f5b00c2db4", - "f83f15cdff4dfae3b8dbe98bb1522d0002499ff5ff5dfd07d68727a34103237c", - "3db0c98861c8df3d20e1ed355bbef01901d81fb68c48ddbf8433526878f9e4c8", - "dc8814aeea5119690296ec7876c4e0cac669d3f662917a9329fb380f43b65c0f", - "5fd3940253a147d18224558c170478b9b1d769f1538fb5cd03d645f24acd85f0", - "c95617d563b5f712b69777523867cb07c664322bad2f6c95e6e1fe0d8288b4a3", - "577870e1059cdadc1a6374dd3fc16e232e15adfb5388dc53811dcf8e2c28a218", - "bcc1771078d67abb97f46e041bba8ca0ae03388759f877de531663a1deb932f2", - "c60aacdc44717555100192622a977381a96fee812b089ce04c786b181e2bb416", - "f4b7d78b355b88fb1b530854d1f16f644f606e621deda61f631988efe29056fa", - "0071b05732c265a79c47b7c927039a5a13a1fb01aee586500c24591ce6870350", - "14aed0d606c486b206eaa44804cbcea1bc6ae140c8adc0f90208aca89e3b9bd7", - "2384d96c75fbdf1103f81ca8c3a63052ed4c0664a54cb6beb46d2336bef80cf0", - "3ec6025be0668749912a8348a7725fa236cfe314a5a126e817a9d8646d1564b3", - "31b882f9188f7541d5b4525958081398be7f2bdb9e9b219bbe63d2cf9bfa7d06", - "8a7a28f66d5b6f0e75f156a9805bc4fc283aa49ea28dfa9c66312d8729ae8f1d", - "8784f5fb0ff4479c7b8a35feda435b63795d0bd836a98c5d554dd82cb8d75d03", - "b6ef9b45aec84a4e8c92143cc428aa427a883a317b8b7bff1ac1c7b1a305557b", - "189847581acb3e1892833b05fd77a79a2c1db4f49b6e283c76ba96bfa281092b", - "fbab132de8a0baf76927ba5a0f2f7cf333a6a9e14bb8d31859de8d25569267d2", - "46a8ee1967dd695e6758d3e842e8bf06f009d7396ae261bcda4175f1c3c1878e", - "15576d5deb72a552fcde26caf8587c40bf39f0c8f9fde5bbb21f3164e0cf2bc5", - "1c9ae9a022eebfea2438a3265ab3661cf424f8497baf4a57f5eb242e4edc40bb", - "ceae65f6c58c7af584aa7f713c764e09dda8f4c25aca06fd4748eda008df675c", - "2913a32a9c6db16545cf385b6e3885a3bcaf179d9771a288b874c72fdb66d6e4", - "2ffc6fd8ebbc398eb05e2cfd0566fa1921411547bf9449bb43986d625c850670", - "9dfeb508aceb910b38603d84c453b4087b2c039320ce6b9f20bf678f25460259", - "add17692b2b7701f34ea878fe7b831f10dfb3bb8285548d5b786aa437ad2069f", - "885bbb4f06b20e0cf0cc6f375b8de820030b15690a846d2638a353b1168221da", - "128c3258c25f0f54fb782e8d0ad54eb85de5ea7187d8215f0eee96195f956703", - "7f343f5a89351b5704f7fb4b06952857d70fd8d0c162812fa703904515e5741c", - "246d9990b1fe7a2d30af74f8c59558e57003766b033b502e5984decdeb264647", - "7433c40fdfca4d848af31e689a783e1f4882e7d1e39670e83d8c7c5ff8f5bb2e", - "cbcd473d45e0c91c3fccb6f358fd762cab5fb403b49bf6071ff00c2cda99e250", - "b44d3de0b9901aae4c34ec0c238a8c1eca140f1d421a1be8a4de7bd8a3df1d10", - "e60846cb10e0266e2a26a51f73b305aeac380ae68c0c69ada557cfed4f9a6c3f", - "d1c949ac93dff69e918bfd4f630b7542947475a70d0dfcdc458a427f04a3e9bd", - "d6778da2f22d80be3d126496cb3be7480ec9a157e333de98d43a7ab7c65e048a", - "1e6220c8fb949526eebb74af64f158a31e1a182b94b2de6a6b00ce58cd581e5b", - "bd4724b58e5cfb067dde370ad228902c93a7e077fc41e68bf3963cc1c7dc7635", - "ac88a1b0640af7b29d004520f00b46dd2322f2a3d623b262d1749a162f553c02", - "a8ca09d55fad7ed1fed1d41f00fd5a2b9740b594595bfd682030241cb35d1781", - "28ff8125da3cd98ae7688907bfb226dd0c46389fe2917cf48fdf98322083ec61", - "b5c3a79d4f59ee31aa5cb9875ffbe6e1b91bff8d4db2c2b5b7f7de586a6baacb", - "d1c1b98c33c3fa9f0723d7a9b8530fe4caf1ba769bd7fa323137b5c5f92e76c6", - "8377d2ffac00bdcc2b53ccc2dc13a644801d8538d0609a629e2a1d3d91d6099e", - "0da7fda30fffd6afd7ff6baef0be5e0f237fa1c5f98e080849a15aca7673f380", - "0ae1ce2376e55bad274570e549ea52c984372274b84e933e5175c7195cf2394c", - "44e1267d85ae03cdff4fd2c883d77fe3dffdea5122693bbb7b1d2a02c633d56d", - "0ef855c109413e91ee550d775b4c772ddba64bdff0b88e8938197bc9a4ba3765", - "b435a466866d8d8e54b64b1a994d5b22e635eb5863565a0a747c6ed234395fe7", - "f772170f519154d8eaa56820aba43a988d1724c50c7d97ee4b671c9a617cda37", - "7d5cda5eafa80e03d4945d31a632b1c7dcabd971deb1db8e7ebdfce0d96381d3", - "e1317ef9957f7e1624adde7e88a2bd72ddba8e21e7bd779f6d7cce8831c860ea", - "330c3fdefdbf87db06604c16dff04a9895e47ba9b228115abbee5faec34ea959", - "189558ce7b1777a38a5f5c48b6df0884d8ef6a9a1ede5e84754c0b67dced8f37", - "d4d08ffde9a6e376350f3de8ae995b5d36a77dc2c619168446e9c7a9d031841d", - "af4e2836daa236a81c57e519ab4c45b8f71312170010395012c606553112ffb4", - "43fd9863b2c4e5544ce7ab3f8eb9be6253188c1224ac57c538f7f02140ac27fe", - "21432423a3b2e683d9ad0dfe3a1dc5031fe91a6f3699953cce37bd0cc4faaa27", - "970994917ecf1b378eced4259e526f7ec4b1891063d50f74bfb6c3b2b04e668a", - "6b3bcf560c9a918d1610cad0364e987157c97c42270bb0d7a278029bd26ae541", - "f99eeeb727976152c7a406c5a5588895e7568f3ec11c0770d734bebbc7ba20b3", - "acd5f906aaddd596237db236b9d41ee87aeb07cd2b894b0185bba6851a322725", - "07b3b74f6fd355a921f92b5491a7c9fe8100b4652620ed1f8cfcb4efd8cc35c3", - "4f3830e474b62bc58f45fd558a2d3b02cbaf16509fdd97f2e29bf38b2a6048aa", - "3b942ca40fd569d23cd0939d4dd3151d118d1a6656bc73f825f7a835639d8b24", - "84250814066ebd1f678e5b64d35d1246f4c4107912fcf3c3a222f13dbd525584", - "0fc06685d2817e5c5ed8741b30ecebc698962585511f85321c77c943ff0a2c84", - "0b0db9207a881d71582ea0d43742897daf33e83aa84d358ba9f15390eb0052b9", - "8bcf6ac2f21e15e2e1a8e731e4eaddd2ef13c9e1fd8ac10770a155cf478160b1", - "84bfe81f65b4a4b24832802b33dad448d7729f1e613d1d237de96b0cdd9d6f1c", - "63bcfae4ceae4b79511a3c85b5d09922c96eca87ad6c2c895a493c90654daf5c", - "93e43c62b6baa5ee2f2b9bc3db5164752c92bb87fe123fc2c2973de500b6808d", - "d942431f7d40d88b409f62d14a0a07bf3260c8bc9a8ef9c21e32111f31914806", - "0be463439de5161c6443dbcabffee01516781dcf1f02c72950ec99d41489756c", - "d21f66b3f1a053131d9a11692f3c62965ffc1df88790edcdccf6ef04d7490907", - "dd7010c2a93790e78488fd02e8767e04c23cf28437f2dd4338eb1a933892d90f", - "20469e4f321071b365bdf36fbfa4d69d6541f90ff40550f644a5b5a0dff6395e", - "25338173090c1395d67ca6af8d3c7307e7e72f3f1e140654882a8929652c1f12", - "e51bd1862d1f2900b9e8398695e82847e174e634c11c71c4510228ed6be68062", - "931dd5281db5c624f8dbdf5809d30649c41175a2c4760f48855c21e71f5a23ed", - "58a8609345aae009eca4d3143306e20bc57cf934164a086782f5f59a67b6def1", - "0a2c7fb2e29ce7cbb41d015143bca453fcdc4e24ffb5be3b6d33ae483655ef6d", - "1f2bc27a4efd35a5950d1e900154515b935ec5be41b87cfeb07fdaf18d168abc", - "f372788c44d1689317b5f2c80d9ab4637f66a04b865e78c1b7a574dfc56a868e", - "840db686d441700ddbbbdd2ceed674740c485fbbda97fe96fda6e82cd604a60e", - "39615747915f3f22de9040ba63ec9a736bc1c753e5685a25ac7d0fd0436d9585", - "5a13bb37308ef07c89ca74b295db8809d640eb4c08080b5cd759258585127b4b", - "02169bd4c1b93e355a80e2de181b5717308f441628ddd434a9a14afef2ac8bfb", - "86275c7dfba030ace035fd94db7c029381eb142c8b707f689afc211ba5e24204", - "c25168f6c9dac3f8373aacc2c120cedc48bbae40fb8229deb96718b8da8a76ef", - "0db4c10e71bdcaa157e02e4baadfde07b951c91b37a995719f5b83670a458250", - "4ff88bee28faa1504b1191ebc452e10e9360af67dff1766be7a86c2e1afb0ad9", - "cb23c4ec5ac1673d7c7d9e61e2974c5c421965616219e4a3dac3e476c3f00170", - "ae5d9f80cc88b4eebd4d43d9778f4004f1ba6733c69757ab2dad1f5f64e703a9", - "4917816141fc831d5352d6983ac2452608f14ffcec69911ef5d24f64d96475c3", - "fcbf2c272960aec289aaa2116a1ec47138b6da3eca2c64a912684d9b5d9b054e", - "b62e3960daf885f4294f133fc38fe026c96025fe6b2ff57a4418290243ed699d", - "4229d830e70dedadda3e5a52eb29ca4b5808725dd21db4cb1f1a546eaeed19b8", - "0e75be01949bafb239eacc290f5b7c19aa5fc319a1344be0ce9a81982fc5b303", - "a162270749ad59c535072f54f4ac4688253efef8b92d3430df495741c9b0f1dc", - "7e2877ebdd3d7f1b8a21b405213b35475e8ea35f2e65566f109495ef3753d96a", - "194ddc33e93c047b54c18869dd818fe69321a57aa3b2d2bc73e892ab224f0211", - "2e8b7bb2ab6538c0403bb72c47b5aa584550e86997492e15a69a7a74a99d789a", - "7f9dc8e7a03d9fd6b6f44ed1b035cebc9508adff900bcc7be3a988714664fa0d", - "39bd093ccc9bd30861b018a235777e514371dbefb9a01170f87016cd221f8f39", - "4134e02b4cf8bc983a83d3e234bf967190686123bd9076404c380e40be7b09ee", - "94b67e2b274c5937b6c7d5a19c96fa22bc19ee128b77512eebb373d6c92b4965", - "d76e77b0ae24fbdabd313d26f8ed8628d7d6d07f2acaf5af4c5d91ded6201deb", - "59871cdae2da75df06ee8332876282d1cda3db2b2f515a4aa79f524e12e9b974", - "6c0f330b7af87dee87d7a0aaa9ac7179fc69364dfb0ae01795875e7333216a55", - "680d5a4812fba397cc47eade49e4eec9c37dafc3423cf6dc2fe94803ae83ce7d", - "b1afddd4458a888e0b640caf976c742861a7292bcbd6f373438f18a6bcb418ad", - "80cb1eeddbb4b02bf4dc28054b40271c9b97dc0cbaeb7304071fc73f23501c18", - "bc020e22cc32469aaf2d7ab6360f9727c0afb7a40de211f174d52af8338e99e0", - "000474d8c180393658da4c6aca2936587ebd5f42b44641098494b931f9980b86", - "55c24a23941cadc8c706ca15fcc010cf5646ab37bddb59bdea35d979ef748bf2", - "5e4ff82e70789a35b5c1db8cff27d7a413445bd79dca90936121b63c9c0becb2", - "af5023053459d86468fa65acca9c07794c94c044cb85eddf16940cfec9884ef6", - "6f5f39451f48cc5a4793fcf193edbc348b1d4436434de97503289263727a5263", - "cde004a1f2ff7b456b7109c6e9225fbb33494404f176354f70cb393356e2e1b7", - "d89f32c0cacd6f1052b05fdf2153a9b637b75f4a4ff583f2b5ce71a6d80ea679", - "61e18009356da05d26b8c179d44cd255a2ac49ee52fecde2a151a2777bf46453", - "e7745b53ff0a68bd46868de5546678cef564fccca6f4eaedc2e481baccdbe388", - "876fd4a0c0985100b2b14b58317a51ef5d3b0f0305be3116ca886e0fd8f16486", - "2a46b8558607554b60e3d4e818f44173bd46d40dbd2f7e76b11595a196e15260", - "9154233570176366952668184f42d8b57de2fededf396837ebee62ad338bfa64", - "343b26f17f2f799be3a57df7e8512416ed6cd032ea7d46f26cc26d5da74ea597", - "0ef03479dbf21cb02456c21b7cebb67476eb3cc11afc29995034ec61f8a23548", - "2ea36f27879aadeeeac4e8564e162d004d6506247326e90a1b040b6fff605acf", - "fa41beaf550099a49f8b134a3599df96332faef8fb556c1ccdc1412f7f8d279d", - "b94c597ff7db966d723a65a83e64bdda5629fc5564f3837887c1e954b2d934ab", - "50ce59a85de12286ee41e600a3b9cd3ef2cdd7b76c0ea2b2ca9256f8694554ba", - "4668326f69100140aaf5591f1d45ce9b68f85a62eacc455a34533ddde4ffa6e9", - "eac4e0da49f9fa9e0909b7ee1d9e90662b691a17eef3e86a9d3f8fa10f396841", - "806e1c085c83c50a765d6657d346f34b29733d0ad923263f681cad064f769098", - "fedae59bb650f96e45b8d70f23ef112867ad3ae3c7a4954b4873a5ee52f50fd3", - "1a8cef77122dda54b845a95288a9d32026c53cec7fa1d9d9ca469209cf87463b", - "e0d078cc7959149b172186ca598d64d188b672cc43489f27fc06051329a2d531", - "8ec84f73cc232db128f78fdb0bfb7bdbb5a040167e83350d355647322370ee6b", - "45a79f5dc538752813aa570bcd2bd7916eb081a94b6ebf69f3c441ad9885bfc8", - "3ea147c22bd37e7582c50c4c413991939940af98e34ce9adf86c1583c7e48cc7", - "2561b68913e448689deb7a2f215ce895ccdd24104fea80dfd653b807e764c047", - "577e14bf6b9a5f8eb1c93c2a1f11631f01f86247cbf27ef9d6c51570b397bb84", - "3065f6fa054671b0465a53e7a20879888cce203bb85290f476a4836e22fd11cd", - "c665baa54eb8c5a975dab6649116556b5470fe5e1cedb98e5b0db7d4a16a06a9", - "ecf0585ac102eb4b09e3011577d24aacde97f01b578194c86a4d88dab6e9c457", - "7eab242b13690b7ee791a1a6b869a9bc089bd36b98a39fb62c67e07bb857bdd7", - "a24b6913d1e6d79dc4fa03602aa6b64044b647ce3c39df4f33f65af727e2264b", - "287f6c0fa45760f08d10b137e8a67028567c9dcb4a7768087f49e908963179e7", - "a326633a4ad646d225db2fa14603a82fd163b4fd09ffc027359094ba678be1bc", - "7722e527856748b257901d361319a0cc85c03fbba896653eb255c539adfeb232", - "cb0610358cd985970a0e0ee521a9158f33301499a5d2f469a8b84f7999f9188e", - "97a7f63139390463f2716b7ca7ed1e1d4314f34720a3ec85f2fc5cc0cacf832f", - "9e0da9068cd9d945f6f7801d00a6c56acd723282f4023ed5e8050ae23e707019", - "9c44eb540822e330739a359e70d137624bf5cb0235928363cce57d94523835c2", - "8e2883752327213bba38f69edef52dd8836467d3cf17c8c09a14dbc86fcedbd1", - "e830d1e22b3891938764e8b0be0f5a7e4c4b3bc9ba7bfed59e19c16a0a7b2265", - "9edcd25e99ab99668f9b1cff4d94dafaf12844fe5b600742f1510e6bc4e572c6", - "57d94b06663c569e752b358c45d44a2a955943fb31811fecea953c0f49381088", - "b1b46de73a58d202574f02c66e54347a5ca2124894c354af84fcdc3248713aea", - "dfdb9d2a002b57b0b86d2e14ebdebee5a09b33b524443a38f801c1dcb5e8ee91", - "e4d9f1f26802bcb2898f40879e549f65ceb7e41442e00601fee83ae1c81bb15a", - "cd67cc264324c7e3d644e0ab3748c026d20ff01b8e101eb0f83f4f3641813a72", - "2d089b5f588f3ccf2c0fb1ac4c6692681d5b83df0754c29c419ca98321e55ac8", - "214695ade7a64cc0de83c0e7e31d0394df2971509b4de8ae52c616044b3e162b", - "e9927eee7dcb143c66e6821e7fa3ab0c1b06f559cc94b4d378dbaf61db93afd9", - "b7e4441757e0ff9f64b0636dba52b915b4e5d6e0c84fc35f5572ce17553f7791", - "58bf1bcb4acb0814513c6bf53e694576a87c492d972199c16ed97e8903c349e3", - "ed62788ca7236b588a1a87c832fb78a613ebc86fecc09af34e34122ab719d238", - "74efc30d405ee75149fa4b72681e96fa4a60d94d74f510048d452aa4e0bc97b0", - "f312ccae1e25ec2e51c95a5e0d72f661a449f960e1687d2875cad50581a86d4d", - "4505ae2e7e50d24e08faee42b0b43894bac303b830c1d62037f610688b8effab", - "0b6b2b65fc7da1313b45a6342f14959b3dc979154e23048b4e104d6440b7b649", - "b26621e7082c439ecbf17a8d691f7544b888a375748de01f38e2663fb8daa257", - "03013092d078866d39f565e6efd9cda98647c9d39758fd33b2c0c3f396ac07ab", - "f4c72e5183c2b8a36d5202af3c39559ef00d158fa47a61ed3be69ddf6f309ad3", - "685747af984b53015b2a6e19f7bb969262c5f99b85b65bbc57844ee7472abb8b", - "4441fd44c9ff72bb6b826a0f04e5e8254d1a649198ba3a0b9553f56279deb1a1", - "d93dc2c33def3db3845e3810dcc0cd9d3c246a616e0d673a0cdba0f1572824c5", - "9a6742ad96cafaedd946149a6459f4d01a198053f6c97640a251880031234195", - "af8800abcc105ae64b9fb6fe41517b3ba35a299ed0d6ac30e507923b377ff23c", - "7335c0cf47d36a3bc6fe55b65a52e78b73e3982e23b054141cac081d7e5a5b8e", - "6584074561d3dfd20ff0611af63db68f55131cb0129af4ccf285954bff4f24e8", - "4c5edb818dc7e11e91229dd7a38fc81176ab16696c63c924622ef04b880ead94", - "34ef342a1fa67fc75836841f6e539a77ef613419ae31eb10437cd6a2d4e7fc76", - "3a71388d0652f09e45ae285543be37fbb7cf6a7174dd155d354e1cd95f18f88f", - "26c0473fb7c4ee353ef95960eeb3617826466695757c4ac38eb675a5cff4b305", - "112ee2d5cceef3cd4c5db3b86a4b5e0a71f5343f76e879931c8113d4868948f8", - "b6af6e7e438c04d9c73b0ff46053311c810c674e494a6d75c917ef8eb028784a", - "49a1a532f56a4e8e978c15a241df88642e4179dff3a3e0343abebdabbb92414a", - "091887360d97009c8d01020aa76e1651ce8a32182420c0b7bd63e762fda70756", - "b727c67714a11d82410b6dca1578c43b74bb7452fc3be96a69104df9baba9c57", - "7fd72857cc45357b4ef2628b08c9941db82ba60331032eb8b00abd51cf6ed6e9", - "3c845917d17c1520c2f6c4258525bc917cd4b626bc3b5d3350d8efe0fb9779c7", - "b7d2118c143499940839deee1709dfc40bfd175fdf01d392f4c34cc0acc9343b", - "a3c5005ef6eb9db390f2dbb62071325416d3672c591e417e39a2c6187b542a06", - "3a578abb36a1c9ebd6c412f4ff6fdf5a113c504f27be9d676a1b512149a83ad9", - "1bf11f02e8727fc25a5ca153760b4554a7b64cb3d965e91bd586b1a9ac6d9bfc", - "64002f777fc4a29e76ce479bb9597534f49750b785477346ab82135b55545346", - "0257579ffb98713eea7cc3ff25722a65e2e54781245e63800a7c86c4e0dfa986", - "58acc34b3f30de35d7899c07e2f18e811553b75f205bacb20c387ae645a6a4e0", - "60c90b429c19bdf28cc0a0f17b37aa4f8915f39615d484fbe1dae464ca25af73", - "94b15b8bb2616b0b49ba57a7dee629f4c901504e0fda1746e024962ac6b0f5a7", - "43242d65d729a810c7194de710a5d2ca2595d3f27cc713b91d3ccf4aef3c6526", - "489c20e2003ba0f0c5c4e30a03fdb1f27ac7695ae5f87455848e4f893058d005", - "714586fe4eeb795738fd8c9f6519f3f0b2ab5b8d46dcb7ffc0aabd78587bfd73", - "baa52a8a68272df2b3c77c8bac43c563f87e79ded2657752164f6f6d41ad5093", - "d7645f4bf049966ae3928ea5fc8b7a43b75a1df9ed2d3a0898e83597f9a9f1b4", - "d937ee7e2cb331b9af8dbdf155726ae6984a900ab0094167438e4106845aa0f7", - "b3af41f491c9f51e594aef37b5f9013b6e1530ad58cda991f2af4169fc0fe6c4", - "d5fbd784152e65ec4d300499076567ea20bb4179b2a7b2383c94847f16095e11", - "894d9e415490b10654694806df286055fafee93f4a789bebcf878416c78d2cfa", - "10ff0cba6d685d97f72072c73f6e19992aa514aa74e1b0adaa21cc859cc64652", - "f359dc418bc308cb23a10bcb5e6c66ff9a3ed4f08e2bd318a3bfec14b2147fdb", - "f80639f1a37913d3e8c182dbfb6841ff4f59d1ea4b8cd64334813683b1fcd6dd", - "f75c7f9806ed2ff3bb6cd6227542a061b7a5294e85a9b61018ed78c1f7a59da0", - "46ca949c7f88f9571aff8dd427b8576f1cdbf861b57d9df4545d6584198985be", - "e71ebb73e08411ed492f7a47a640f27b500817b3b241cce07ef64557e8cd0bec", - "0ea928e6638ee1a64009dcb4a55471fe3cb763f310b4ace8dea8eb05762960aa", - "918a05822be302a82cda6fecdf92c16ee8854dba4e096697b16ec3202a6c30c5", - "7458ff8a596e463a0e2114c85c629331979c7e1d983e13219da1b33381784d08", - "6cd5e3a8382ce3d17dff144c5592c338c4acfdbba8131d37b80d8851d220544f", - "2c394f20ba3123ab256ec9a0067e256616569bbf38baf2bb60cfab4202eaf65d", - "771e858a9a4f65f0294f8838a1a2d89a548e331d88203c2f215bf00f49f2da6e", - "bd013ce6b2754c60cf29c8810d5a96304d478281f9b547651cca14825cb606f7", - "a5969d10a50086c473e52485dd7e72e3b0435502b8e7f5680fb37592ac16e46f", - "23a3893b8e1c4be1b3bf87b667e4cd6e51156132dec052cd46393da801639253", - "9f6a5ecebc0b11f772433c4f4154661616419040eb109f79e85692842ff645b9", - "1a20b44ddf0fca5e1ad7ee25dca0bd0d9c831183b014f0b692b3c06a82946947", - "916c73953871dca7ae6f944e0209608fe4319fd7ace94da0d053ccc33beec5cb", - "03eecb1376ea56a8c6273a5b1f5f3b450acdf660e5a83af7ca64810e226919a5", - "066452d6cc59413244d48e65ca9e6329755d10e87c049d9b1d85e7a2a0134628", - "c4aa06ac4fc0b00bcf1c822ff708035b78ca53aba1d52ba693e7d2002b846dd8", - "f8325037fa483cddee4d2adc6e2b9426e2d11c43e7efe0e0d1bdff9aad4cd934", - "b0384df8d900d0eb3c3ace0b778ae5916688934ff9e1e0406dfd9c05223c5717", - "f7ae9ca5b506a7d6c643fcc1e7c7b7fe03b96615b7e41f8bee9197fabecddc38", - "9ed221cae868b103c0cc184490f874e5ddc506aad1b2b0ed6f92b856990a4ad2", - "37e104493b9b5cc2f552d3238a06f4c188b3bb75ed4f284756e109df1040b2b1", - "a1019d50214bc31499f49dfc68e7deec60147bcde957555d01f7a6e8c198a79f", - "6e3742153acc9caee95895c5e153f66788857eaeb4f6a5f74e4010bc481f75da", - "9528edf35f72aee04314f2032c408340f03bd08572bd41f5078dca7e247d4211", - "fb4a4aa6e56d1781fcd3fcc2ddffc411deabc4506627fd51e09879fac7a046ad", - "76fc7ef85fc8ebf9570abab3f3b8724e771417fdca2acbd594bf225fba78ca30", - "dd5d5545542742949c0dbfa48013d3b534840cd302e3036d6bff4148eac41e91", - "6209b3bd073edce6439103aaa9e1b4d31d1bd72679f268cf792db656a9f43796", - "3d39cd5e6907a81cf2a552913e8bce9f907a0a92af0d76c20cb6434357edbe98", - "2a620521994287708354be93650e150ffa2a0d438459720617d05393a62eb4f5", - "174f39e06d9ad53fcbecb7a52e306ad159a64fc1ca0ad36d722b5d163b5a0a97", - "cf215ed6ad27f2aa4019d78c4581d51b051769108914e4ecfa75647ae48c232c", - "67e2565468cd2ecb46feed6a1058260ace0a4024fce86fdf4214d88faff6adde", - "d50d8e21714a1f445c78147f8620015683814b12eb0b830606f6f8ecf695cb87", - "13ebfb6a546dbbc4277b21a706fe0f27941b1a26a4c8bd945ba989a5a5069a2f", - "47d9b5dd495a43d224c2c792dd900294c77082a9b9e92d5370395ded30e5adfe", - "0a0ecdf8a6400804bb76f927951db442a8f584d5c3420b526e8521cbf9fca942", - "7dac697c79cc7d287a0833c423ac8d6ad62d44c44e10579a305117e4b486dec4", - "12c354ee7a98aace79e34e66573f2897c702aa47ec5691576f945699dac217b9", - "9c6561cf1f968fe1e1010990230ceb504bc8af093cd73f8f4f24d8c96069717e", - "e657100339056ae6c7f4281898208721e5e3bab0177a7c70eb390de308d49112", - "5af0d58a2d3d114bc5ebea6894a2a088cafca9f6167009185fbf49b08fb5dd63", - "6c5f260cf22d8273e396b133765da046eb4ca5f87f705e8b6c3524fb93cbd175", - "768e5b059f536c67f156dfd4c0b7e86c95279f9aea58cebfb5cf0c557f304ef4", - "2b012174cbb85709994a583830d1956d8fa05e0551752977005ca040ef30d95b", - "7abfd7a19d752eb552ef192f2ea3da96fd5f96581dd411987baee68ec918fcab", - "5ce7dbb5fc2cc7448825eb5ba75bfa7bb8ae56ff06b64c25640be2aff123ba1f", - "98a186d50f44700ec5a0376b0aacb21cecdcac4838e54e8d9bd52c43246249b8", - "f0d7d218ddbfce47479db415804e453367a2767eeffe601e49fc60c0ad3ef118", - "74ecd4a9117bb982dcc8879622e61d28b0236042340aa4a26e5846189b960733", - "23941520af2c7cdad2df4b5b71a8c32cdcc3baa94bada5687cd50106ffb304f4", - "4ccd4c1d336e64f29200d8fc89bf6152b923a7087feffd351099c5bd17cc0939", - "797b768d253d2791939753f2ebbddd22d4f266eec0a7cc0b3912b2d2c4bd9342", - "5dd5cfe530b7f66c67b1ccfdd51fad4774b8b7844a68df82d02bd7d9ed3ad2d4", - "bba835343e3624a30407dab12a221cb532c09c51f67850f5d5f3b0982f511a67", - "67765a49b9ee6edb5ba715bb6be2a77254ecfe00f8018d77df00cbd298621692", - "f4c3f78181bbb9bd90895f0e13c9f8e0a2df88ce072c04dbc0375422111fa338", - "8e974049694a05b3414efd844d5d0f735b3a64e3c3e0ec678501c8de80275fca", - "346d8ab68dac1afef62cf30151ed12033b2bd9823dfa7fe27d56f5610cdf8c03", - "c5abbec66e11b86ba8ee2731a1df0b88ec65724b6fb2be73746c61bd259bd1df", - "a33a27b9d49e28a89bc207fc8139495bb2ad440212a0d016e4d4a60023490df1", - "54c3e0df4411f3267f6e218bf4306a3a0e31e387caf1218eb38a2faa017e3bdc", - "e8086ff7a3828c8e4aca80e6a585e5c14ffd20ccd29610d628b722ee97f643cb", - "292ccfbf38277f60555773b14e0415c36bb2b150c2c242fcbbf992d7fd201d57", - "3ba28199ac4b948220188ec311ab5012aee30c35fdae7e19bf3805b8e50ec5f2", - "9dcf30bbd902c15c1dea5ab4a5862b83adeb85bb8c8d05ac7408eecdb2bbe818", - "a296d7cb312c7121f3965c731beee81fc338a242b5443f54e19ffe6d5244fbfd", - "df65a7bf18167faadc2fcb808410dcfb7172bfcc27f958cf1d81ab7022627a2c", - "c314b4255330619a43ebbd567fd6c5a53b80bd53e183f0ca10fdec85a0a92fb7", - "160dae35c1c3e9a98807f1f3aa747e110fa861e95fe0418faf2172911094303a", - "6d39478bec26f27757e38c0d34d59cfba265e9657f23164586812164a3dc5f60", - "53d069f652473ac7985c0467f202f07c1391c1695dbb099e9332e3f1f3179907", - "56b951711879862a158ef143b419564b190ead5585fe9b2c0243154c39f09430", - "658a01fd6c8fdbfd66f13a81b698d550fcbd663daf8245ed3be98085765d817e", - "589050c226d9cf880a419e630b2f5ca83f3be86376284e1092ccc09140df47b0", - "1906eb6c8ea4e34fae20d09d599409f8529c95840b07e58397c6aa5147515ee0", - "4babebcd765cd5c075212135eb08a49555b09e8f41d8cc92fcff31cb2d44e16f", - "c3d2ca2c9393bc3eacb062204e809c10d0b3d2d7d35e93327ad2f0f5f130dbcf", - "3fc717a8dcf350dca8cfc6a0afebfe3faf48a83b08fb3cb9fb6f861163e2c92c", - "e63b092caa58837fb871e99a543202113980f6e5ceef261f871927abc86425fa", - "226e617ce95c6d35c743bfd3932790867910ff15247cfc0e6cbe93d023aff86c", - "5ae827d5deb5179e6296312ac322e8538f0a322b736b6ed51d4a73a82ef4ad14", - "583c23145d8817ebbd0e743ad97b4980c906205c586580b688dd70039a79312a", - "0217f4996ae785068eca8344e57884dc2dcbb5198e47a96f12b53b95972432c2", - "c27e16e62c179c9a45d94a8dccd91411ec0544422465e08adde0efa573628395", - "ab5e3148f03e1fd0a387ef6880a40410176e081b6f4818885bb3595c6e73a82b", - "632d4724998a7fdb32fec2b4d61f57eaf3b43ac52900218cd1ca8dc3c471d16e", - "a1ed347ceecb5d47fbbc57fd6de2a9bf2e815475d6be5266f30db4887e759eab", - "f1d4c2cadcbd465ea09ad892a32450a9ea7564aafa07dc0e46b8068ca4f6454d", - "7654a15fa89544f4157d4e07cbc12fb2bbfb55f0ae791b6013607a64b7d999e7", - "3a276d087bc6a0f743c8ea2481227a07dcd39d3da1d1bd5c95a8d5fa0bcc805d", - "db71e070d91db46df5a6e889d2abb6c29b67d8b1526114e47e85fc0ba7800a97", - "aec3fe1932c147b201c0d37d069f9a88ca662db52d04429bd17bc81dbc09fbd5", - "f85ec35bb0fc5b667de3275cbe93acae846a7e0262f565697422d4412a8a34f0", - "20f15408156ff9e575bd9972fc66cf41efb8b114da0836c62f4da36d76b4a7f5", - "7155f11afd75c8beb29fcc6b46c4726701b66ed29c4e5e57bdaeb5d2c1f55c87", - "6366ec7029e7935a636b1791dfd5f45826472326e768a173a4680d45a3a053a4", - "5cf72226bc90aca247722346967339b494c55335933dc142a8779eb4b4fc444d", - "a11fc65b58487b528c4b7d6ecdc92e13eeb4375d2c31becbc27ca50c682e24c6", - "333e513606fa3793bd027fdee8d5669240936bb3c22d93f3ab76f0a8db87cc1d", - "cf95005cebe6902455978697992201bd53fbb568e5bc35e6afaf0dcad901baea", - "c5f5465583e3212356f917569717a5be40c906376510e7e782ab84682dccae9a", - "ecc704f074599e612533898f9cec5f5fba838ea5497878bb2e145b74d83c7210", - "d3a8c147a90fef3da0261a31e98d0433ae9e4cec879193d36b058b555302c1b7", - "cbb63bf3657765c9038756b7e591c555027fa6b5e963f6e00b8b1531a14716ff", - "a0f789992ad39bc5555893dc6f1dc1891eb94a870f6e19354dfdec8e1bcd8fea", - "9ec687b68050634db20ff2ca09e2fda2f1da3799191abff5cf9a448556c558ab", - "b524a43f1a1bbb66e031800f1e84151cea613d8a03841e4a0cf8b9cfb7a9eb50", - "2fdf7f11d45cd654e56d924c465c23c86cb8de63dbf82d6c0d34102186b4722f", - "53469c5238922ccbe1656b249f6e05b87baea5dcabb557de0debc883688829a8", - "e28238bcc3e783f0efa6fa4ffeb9ef2592c24c8bc13cc068da7f7c5a20c10fc9", - "cc9d4278f947a530b4a89c772242ea2a9f128dbc838044468067758ea7ff506a", - "8e2e215ef799350e03dea1f04bf28239f2d7392c841c6114ff875b0065a411f2", - "775a79d08e259d6b58e654ae1722aed4900029689e28ce96cce8ce49d2ef04ba", - "4540351833ca1a32dcf1f7808f62fd990e470ab8aec7d2e8c519616583dda0e6", - "200213a8d55b1aaf851e817c3705aa3ed32a8f03f009a44d5b1539f809a7ab08", - "37e88d1f19ae4111917a07d6cae5ebf6e76f585c5af234932f4d738166400735", - "5284176d478bee83b67cd453a42868bdd10d9361386775fd8e2199b51b67bf3f", - "232aed7cb2d84f514d161b5c5e93891d341096f2ffe12a43ff93fed17e1e9947", - "eafdebc45639b0f3dea71ce922f68197dd7c302306600f3549122152edbdde51", - "675dd9322495090d3a9ad53594dd9479545ee78776930427334e88a761d2985e", - "3e106f0e9360035420bf8384c9cbd5f39b1962e80bf7677e555f4ae2193ccdfa", - "e6713cfc5c5b697767dbcaedc6c82c5518100c494d3005fecf2e6a7870fc2feb", - "9e4e8e5793f34a5df2173e5f4fef9ecd97a0abbc789d329c37b4d0430d4b0a63", - "0eb349b6b438dccdc480ee2dc6326e7394fcec84184c99b2867016f8bb9acfaf", - "1c6c234d20bbb5be277f68d5f3980c2d2262a6d5142a4bcb056bb2b551785a60", - "65dff7a0b759fa4c31caa969f4f6773901fce32933de11ecef6cb2a7559a479c", - "b338256a0607f70ea93c88169a1f73b17612305638dc44af09efcb94ce687237", - "cf477f2caa668cec448ca2a33074eb20d29731448208fe97e19382610abbe87e", - "7cd1458ce947d825e2eaf4e03729d9b551511e052ed86f337e05bc616f4ceb87", - "db3ca0c8b2ae80aade8740b63b2c5008b79ef0b44e8745dfe67a64e6b080db0f", - "3846a2897ef705d491dbeb24bdd4feba7fd81e45a42edaeeb1d4c118b565f56a", - "5afa492402b95f8b720ee6f127cd93528e5907dba9555e896c3c6d08e8f596c8", - "bc58f27d2ca9a0d376d1c5e82a90ac63466e60d402d29f9af267c92897e47737", - "bfc33040ac1f61c7a97f1d4a085d00f64f1b187c504a93f743082a9b55396869", - "71bce0bc67c6b4d1f563f21963c7bd8124fc81598bbba7d920929f93be5721b9", - "2bd64e04c81addd5a665cfe5251b06a04119bff57b4708d0fc844d2d9878bc5a", - "7ef115d357e8020acb769d96dccf3cfa0660833ebde64d5c4366e42a953aa221", - "3222a48539ea0c7021ee8c147b67e42db35f292c1d6a7f53254b2a1c1a4fc6e9", - "79a2fa2904a01de96fa64437f3a09e407b84fa3e7347d6d0813373ba3d95bb76", - "3df94a2afca293939ab00ebb227cce6bfab642e863475375a4b53990b4e75738", - "9e9c93e987b948d0025bcf64497bc19839041fd6a259875429a9df90b29ea09c", - "0aa9501ee6ae2a4bcaf633e102cf00a0cf6eb99a5649be7e0dcb3b64f6cd56a9", - "78ca303850241d3f2770fdb2f5fcea54e9032da69aaf9b2d02098a28ed8994ee", - "fbf7c418bfd3d7686a23db3e3011d43ba55eb6f19ef2495f19fa6024aaf42f81", - "429987628830104baa896c91851536c2a81343eedd02c3f4a9d3de7420877316", - "42816631d3f0e516bf6dd469b4a0e519a4f296e8eaa41e5c1e72cb657bf0dea9", - "d31d0d5a04bd411b9b6f94b2da9170de0366cedb3631cd75db17b61158daf787", - "0ce6a4f05c703b74d3b40097a39f5730722bed911128b152a58fa5cc3f1d3da9", - "b424faaeaf169fc65e54a1959e142db102749bcbc03228860d4c52e439670f1b", - "95758311001b8406d83c1bdc2dc0c9b172f4062fc6208f53f65c8c79659767eb", - "fa148ca8b63e328136b42c72033c7a18a136daebc18e5d5e6a66d6a057a24a8b", - "90dd92d02890054cd4f2eef5b802665f37bf195a08a0ba66709a76f937251bbd", - "66d724a110fb2a015b848b3b360208cdaeaa08d6a9a77eb94be9f51df41eedb3", - "29d71c0f240729e25a420d5008f37a65c1b8d92e68548c914df56b38ea240f9f", - "33aa6ae58420042a6af5f5d13a9309f1965f97eb27a6f5a68cf9317c490d065c", - "12cfdef41872370f48e1f18ff4cd9922b3b5631ee75b30fa75fa5d443c7c7882", - "85270acded91d5eb756dcadbb460bb101aab8b607da4392517a264f6c144c85c", - "4832cfd9ca5973bac889f484c3f8b27dc0690c454595be986f8b6bc73802ccb4", - "c8bba4a579ba049b8a096955d6d5cffb396897d6cb7c6985c378e164cc578fe2", - "fb2748c91b7ca6f430ff127f0e33dee0b80a8c9fc10042ce8bd5edccd3561a65", - "25cd6fa99202ba8c9d2ae0968cc29c145428edfb8c27ce65a4b234cf25d9dcc6", - "72547048de76802e6b4ed9a08fba55f4947c19e51adff2e534238a8c29f67643", - "ded06405a27a75eef74f391d715fbdf10345b1eb5e09d3c96718d1d860348e27", - "3944e57623aef73a8ae86c6eef5cb6f923a485b7d9694b8d562d20171cc1b2ca", - "e3b9eae2140764fec5f0b323a732fe5f7c111ee7c6c41f500d70d43d6360cd4a", - "aa195a7fae47ebd325a69a3f3f020c8fbea99ed0425edddcad277d9a8eb67edd", - "f6c31216a38fdb771aac6c4469d1c09068875873ebb3b30d0442856ee32569df", - "2751d5872a9b2b59b8c7bf0c4846d13749688a9ab90e60acdefee9be76bacb67", - "93dbcdd00ca17ada7fb7bd4d3fba85d54707739ff4d527dec216e8606228c618", - "90f47c83753f8e31d2ddcd07511c9f6c5cb51d3a88d99eb7c689174c408d31a1", - "3b851458a6198aaa870ff667a990f481e2c43c92f277887e414ac0e941f7e778", - "20baef03eea77871f5df2171f9654a8e19c4121b2bdcd2d8d354ee1f814c8ceb", - "d4ba5ad43e0d16efbc9dabf64be1154837b9e1f8eb0ad2cfe315369a292329c2", - "d44b9578fd5c938fecf598aa05112443814b773bbca69a7c7065a0f0ce1578ee", - "be29822f77f8646a02e5b34668ae92d232126fd48c9d3e9895f75a7577ba5cc0", - "5bcad4ee1f2c5581b8b03deb0554020f35a7a6218e6c6b01aa76c6087d4cccf3", - "33de7cd40d8f02605b5645d257e272493f715e0ac17fddb98d4bc0c19de43bac", - "1109f8bf244c8b314661ab67476fea8c0997c8cfc2746210dd22251ce721919e", - "5aab6d4fc3169a09c206ee826a4e44f6b54d3c0b5cf9887607f7a75f11a5941c", - "a0c69f50ee3ae66b7bd093e0b70280dc526ae07a5ab5068e99e1d77695e2eeec", - "60b911e9aefe517f29a6e396fcdf5863f1ea8247e338da467fd118ffa5e8f70c", - "fcafa82688fa1cfe473e9d9d1ca7d0290ffda70851050eb14310eeedad182ee4", - "220a55c9f0fbae95ad512687895312fe4451480b2ea11be487833f118c1ff791", - "e45828a9b45776b2a4c9c1912541c143d64f6cf1236fc08b98bfb534a3fe6a88", - "9fa2f07e976b3b32e417437d71342ddef82e16d3fbc1aeaba6a3a70ebbe82a23", - "14e8cbe4e5388f71b401c2f2b9185c81bca00678134164a53c1557fe9bb2e102", - "a0a4440112d522c09feb2bf0336ceed00c8f82d74622bd96708cf441c5fbe6e0", - "161a6ad711cbadd4481217b23084340530817beead149333ed4214fc4250991f", - "b869287e0318006303cce350b58bb5e5cea67150d9fb8aa0f002e174cf9f7122", - "4e1e2ac295a7a409d62cdc1ff95e794fd1c25ef57acd1e625ed1ecef71684a4e", - "73f0b6d0361110babf86026d9897bcfaa1819d580a10e64a182f5b3a923691e8", - "fd8a56dde104bd5258f393da51004b4f4ba219dbaa3f5123faf64f99ee1aa24f", - "38010f2b6d4154976ebdafb3ff08069df723f5f0dd8e528be2caf70b326c2b54", - "26cfc17eb0d31a36edb3a2c9ebcc83af33b09e23ab15e63a68942d20586db6ed", - "e35afc42718fe6ac589277b83b7e21d3a9ce191bef2455d4871850d3865f0da8", - "fb305346257cec6415b1fc76d4a043e750886ab1506e78639423ae5048a58d11", - "5691206766b3fcece871da5557b4020308798fb133ac5942a8f0ae674c6dbf50", - "80ab51d8b60c9178ff8a04476fa0b97e159af0700657c7284834d5e89308139b", - "7e74b0527941569bc4f4f95c6bf1ca4a39b7ba81a005d80c882ea6e2cb65d708", - "d48a3006eeba72d1db7a9d2c0dc1f2dac4e0af295c5a88278685bde6956a6e2c", - "4f21de819802de0f82879155b3a85d58dd370e712e8d2d5aca0171e499a2a496", - "2383dfe8019cd789b6a4a39c35a4f2a43a28401e858255395fdf9c1194db9dca", - "d4e5bddf8cac4309ef54b1f76f29a60586c2cf4a0124ba304c34ed057bfa6a0e", - "885f9edd77cdd93c11581629f2516e729d97c6b7b09250f40150d754636a9938", - "4d93c4ed42ff2f628d2f20844fd19882c85e0079134f5d0bd4e8dec196ef41de", - "1f15aed36fa5a02efba669fe18bc090bf4e96ef1e6cce193a22d1b9456814172", - "5c00dfeb82ea23644dd5fae9825dc9eac58dd725dcd44c4cd5bb5cef5bf611de", - "8c1bab03cb35f652e3f4d2f0b50354b48e977da1ae4542e35cc23a79d98528e6", - "a3a8c9d5a96258b0ccd808ca06b26be42c5e6c6cf8e6c0bb97bee458c0ac3a64", - "cd5580bab1c38527f01128883e1027998065aa178079698a39a9ed07697352a1", - "dc94ffc3106e3803d81f144a5039258a626c34df06a88713bf2d8d235ba06ff8", - "394ddcfea283817f31b9619b585c35631194cdf0d3ebfd88ca6a4bd77f012f82", - "d595d8ea7591a060f39363ee01095475b9ed76a5935b941a97ddc0f6a8aff22a", - "3422ed0f2693975167372513f254bac07a93f0329a74111ecf0aeb52c079edb6", - "2c33d21b469457d4e133d38b57b072321ad48dd227a08f66b314086e12867caf", - "2d698c952400f3b2f08176d0d5cd0f64aec9d3a8dcb925795e5089d20da18966", - "ccb4b6c5f47821403944b615b01d58931ad216cadbba7c6cffc2820fb4f24991", - "3c80c10a1d694a880b7d28328ca7a6eaf0a2461bcc6bfea85c5f833c8b82d12d", - "78a8d171ad73874d1fd5006be08e735f5fa7220afe1256c141563a496d1bd5c4", - "1e149412efc751497944f7569bf2770924a854fff3d0d8d16504d6fac4bb57a8", - "4d67b3e590a57f9ee6917d0b76100c5534999823804042b4a51c499d521a8c18", - "fe2284fe623f3a52d01003306522b7c770907786c6ccec29357ad7b938fb0526", - "c22f2f72af03629bba51a9d75b7f9277c9821779121f7038348e3fd3cd992767", - "de22c9bdb01fb373c700dbe68d0a8dad3bb86667b88e7f57b4104709540f9383", - "571cca3a5f2184d9c0db0c07ab806cef51ab0487380e645b0a5d47ca9983fc01", - "8c6b0fa77d3b0af5d406df55f53a97906cf139310e72cdbfd1fcdf4b18e3c458", - "3ed90a9d2e9bee2c3b78ab7aee2c383b9822367a1343e6ef1d97ac6908dd147e", - "97682da5ac1f7d8135dcca58ae5b18ade8a8dc81c140cbec773d4e9d68b585a6", - "160c5b8366df91281325e735276d6411a88aca139efba82b7d7242691c09ad64", - "c2035f5b43381da533acaf8029944b983bb23392c454f6e590edde87dc78256f", - "7a76dedf5190921b204de182cfc8f3b04a286bd849bb840f083ac3d3775b4f3c", - "ba00219d39173c22b87036f28956252372f3d4a7210a4f39bef554d124097e87", - "2406974cef7b90215453cf1b670441232aebf229b5a4f185deb9591e51d90d61", - "a4382e22a4e0b8232aeba34fbcd29b4caf56f3c3a909cf07f8e1219d7871aa75", - "b3a2b7aac2a48f0d42dc3f13544a1cf42f051a3f57178303907989bfd253f672", - "f9eed0aac930c145ac061d2b2d7f55d8753800d4422af9373f028ea2f009e9b6", - "678a6e9fb8e316118ee26600b588e61a359ecba682de3cfc6740cf1413226265", - "c3bb78029ceb40e3c024f3bac5949a717eaf826777201aff0068863260a91f56", - "b5f9e353560b225165fa960ffdf2ea8fd785b73c604f37ef2afa911b89a2b7e5", - "e22d18df6e8c3de6bb8f08289fb1343b40e05c99934ee4a8adb2d56942d86a87", - "77a9c13aa381f13c2ce8202e61df706d0ed7be4eedd219f016189c71d7a4fd15", - "c8edb3bec34d05ba045f89bcffe37c6164c42ffb17865428c4e308adb27cca37", - "9a644165605f71062853b400fb978c47e9afb64cc62d24eab75f50e77ee9b485", - "32413825fec3c4f518cd34e29dbcee38c1a67471389768ee8dddce732dbef74b", - "6e16c88b25871c5f060194a9e5667467a1232cda4ff776b2b48d4156c2b31430", - "724e8b60fe3585aa0f0ed51f858bc0f5a6d567f3e9b8e636c48e5ff2602bc404", - "81643b2f90558ffd76f65cbc0b40151747837eb66f01e8cd02d323c8674a86dc", - "c87bb7b251f0c557c77e3bfd665f910b36cb461de178158759bab667350cef97", - "21dc9f1f2d6f2fdd4b42bc8fa6eaf488f95657ac2e26fb4f6f58e81720cc7451", - "39d09561e148fa53369dcff7d6f63abbc1b71da5bacfab7371c441cfb7027142", - "f19e5d77ae81fc35293c6fe06582f4c7e588390986db805a968ba9f7d87c9cde", - "7db8c3dd330b02b2495653194844e29104cbb64e487c746d33c7c899e0aad6a7", - "cc073e58b50a2da4c7269a5d22129bf13c24f744a3dd2ffe26cffa9161138dbf", - "b100bb90ed075b84d04d600af1bc3970381df417e80a8808168008d7d6639dd2", - "aeeefeba7b9a3e1e6f30e05a475894b6da1ccc9f07d399c0e6a4be8332cd7259", - "41aa5c2042975ff2d34479fce726c481af58e4d4a79578331dd026b68532e0ef", - "b2f96c4bdded83df3b060ec5371903c496835a52088a43a79a583b4f432b317c", - "a2e51e44cf4125631e573c14cebe5dc51274b8f1579e70b39cde70d90b6e8843", - "26a6e57136ba1dbcc1dec39de32c471441ed6a5117a000bb1606f8e765aca487", - "2370043c096efa6af80e9d7e7b237a91519aca6ee14938cd3810846841a19a2c", - "d563b0b6d2b6dbec71e048321c7fb0e0d15887656c67a4e108d7dfd27fe32e84", - "ce3a2d34376591c45c71c81c002e2eb68a658bc3175c218e98bd018f0d386031", - "03866923d999796bcf3f1d9f37a4b1ad54bc286ec19911376942b1d967797d78", - "2e0e9589f35638cca40f8c359225a913cd7a9626388407e6b25f11cdfad8641c", - "991dcb0d32048d76c963d7301a1dbf21995a28e0a4f90a2cf330ddd8c360c9b0", - "f5b9c1cc5ad0818281cfd79870913a87238030636ad83ae4ba51f687e0059743", - "facd7b337158a9066f4edb33400ca6095bad7f57f8910d4e1e8384e0aa88ab19", - "99a469d605a6109d29f423376522d46f6d5c3702112dc9e0a6c53a785ae6a0b2", - "dcc21a8e0764a97877b96ab566afb7d60f3aae722a6eb9cf4604b2546d45b3aa", - "0a375ba384593fee55c63af690d4c035a819fbd4e6413c1c1f1b909814ae8d4e", - "fcb86485849f0bf66850528181e294ff6bd4a8feddd8a00ebd3fb4e6ea266381", - "f1945efece8df9e080304337b43dde1df78370164bf78be616520e719ee8a942", - "411bed83925e4971441cee936dbeb5aec7c07456202b6c382ca2efdb7665f085", - "e81dfdb68f7969e3674e189dc66802e4754d04e1bf2e6549a329fb7181f3433b", - "43f5bc3848db7ba6f1b9a0d3a11cf2dee4044fcdc0d20931f7f6e2ba8772ee6d", - "542458c9448f181458861d52a1efe9e0651f72194c7f1f733c7fffe4adbab6fb", - "4f3c94c202c817f08ad92174b86cc197a2ae1f896fb7e0353c513d2cd68eb963", - "62de525b99734a9609636f410806197fcfd95305a1a19d9e2d44bbe7516cc938", - "059ce2d71752a9d675f5af8a3311d8df1f64abfb8f26168e940cf6322024face", - "312b2c1e228120f16d1537b8e17d3cacdd9674a70515fcfc301b8bd83751a1ed", - "b461a6f47095292102d767b01f821b64a3f26b7cde1cf98c904ec6c252f112f2", - "669e8267accb77bc59bca167455969788b0da166d3383ea9c6a93d231f1395c3", - "918d5c9b4907c4b2f2e2cc97a16202982ff8e130855595fca5e726d2de70f3a5", - "181d2290767bafaf448dd50380ea95ac9a278b1e93ba711627950d7d0b6f3a98", - "ecc411d06a1968babb7480a5580c78bd415f2db6f79222198f7a857db235431e", - "eb72758ec0e5588d3be89e54392ad4da3d6017ae9d92102fc16f96f5509c72c7", - "57d51b7d09ccbcb099328603fa1b2e6c1ecd93d75f6e8652c72b2914d271f9e3", - "96a2192eff7ba74c337b63d7a624afbd59cddbbab8f4edd353dc294e9806fd69", - "5712c9a14611012549f6498b7e783043f5c4d0c5d3c018c353ec987841e9524a", - "359d7a476f0894d73a3020e9159e2f8416b510d09086ef3b698f264c24edad5f", - "df3b10ad05e9ba739f058d2ff892a487bf1368de6ada1b0a4752568872a8fbc8", - "1654600fce3eec262a54c36a30090f078f8d000da676e30475550ea64479421c", - "4690b0c4bffeec864c1db1e9bf84a86a93beda008c54cf637162b34b2ed4e289", - "04687a38dc44b81ffb8abd6a2744a61a3b3f9e61db7f5bb6d254f66a5a5dc766", - "0a8e7a64ce0fad5682cf9fd7cda924750670c2ab1c04a0dd0d9974638ae30abb", - "bbe269fccc95d1978bc0caf663c3435c4af91209ac2482675498994fcaccbb9c", - "0a54d62434fdbb620c359e0eaa8e3dbf90baf47fc746abc8627cb07e9b6e278c", - "213367f93cf1bf13b1b3b0fcae62c4bda76e807f2a8abb1e437ed33167bfcec0", - "291a0795816e62b6e93ae41015ed3d637a9f8a90c85714546bcd2be8e74a85c9", - "c4e06d7363ddc83452520e3b3d65510006983a7ec561638e3d600f35504302f8", - "2adfcf79e5596b1459c68eadeafc8c5ad49057ebb394afd57671fb9fbcf57a7c", - "a537332d64e487054bd23a6fe955b84ee3059d3e6727341be80f3b945734db1e", - "3f54c934c732e740538ddde32e964b0d9987f8e9f3551a23e6907ffa4b665610", - "7078515da51fcbef300c818bba0f147161130da3ce7a350886a0759ae74e627c", - "ace207c41b258263ba365ec3cc685bef5c46f56d1821d14068c56562bb192652", - "58f8dbb4cfc9124e5aa83171e24d07100e32818074949281bdaa84f236afecd9", - "59371b0e53343c585007d5ecb0f8f058e1e168d7d4be96db69337432a58e0acd", - "43a464f9ec7151736cf04a8283cc320dde6727462ca59d99cf70620ae2cb6574", - "e7a437d20c8cdb567a32c7b08624160309ee479c485ef79562a3223f9f2c52c3", - "5cb88c7665c16342ff93b64ff7767fef4606a032659470fa622bc8bc535bcb96", - "88311f3a4a9083478a135841eda4a3137a6ff1530d514f5a43549d3d8291196c", - "4479cb332ce73654b5edc5d04d2c853a4a32f8a42b280426e88b0d173fc119ec", - "9f5c4da7693c350e62b58b053593006951c0c397ba46f142c447a856433d833e", - "cca4f08b4199d116c35182971be47ca4cff4d88bdae93577b73cbcfaa2025e69", - "807b63ce29963b42b0a134b4fb995d15b6fa7fdd294c2b715996ffe53646abb5", - "ed115b12850995721bd04b9c1118e345a460acca8cf495bd5c519c96db6c7312", - "0b906e0dd40e972d87b1ae9bbffcf110e1eaebb2b7a53ead9a04cd6919df0b20", - "28bf47b9779f5aa48c890c8587329dd923d20d47705fc95c8ade7118b019473e", - "22955216c57a2b250b808c76dc410c98834bab822202a5e95003250cb2f27c79", - "251ac090e84547d2e2a6c178103387ccdbedef4291ad98d9298075f1ee1cc4ed", - "184622980b9ee9575cd8ba570db2fff7751630483f855451a9dc85f9834aa1c0", - "37d43480856f58937b1f1792368f7eb88ff56519ba364a4647e5a5e6ab0e3c1c", - "8fc6681d163c88752d898b23a73d965228f305ced36c81efa1ccd97593bc0a44", - "01434b51e0b147ed49057e31e70e7f4ca3f186d1680f43daab5370f9016f41a0", - "829a82ecd7e7f19e5eea342a12d3c6cb984fdb68cbf923bfc85aff64b66a5c42", - "073683f724c4a462d3f7b1f6e743dd0eea0cfb0802045dc27f242f9a5f577096", - "9c19630a905e1bd625a7458d13caee6d93880419b3174efe5da9c8503f24aa71", - "5eb404d629d4df72579c5aa6f90c464ef8a6d80e8358d8c7aa727dabd55f2ea4", - "5d55c589044c3bfd182b13eaa62f433af6e9333a6238c1a98e3ad88b25f7a898", - "b3c6f954cf727d099055ace3feeeedc7883f24165f25e90fc5accfc52881635d", - "3c6ff167daa67f0ecfe0c7a1b01d727ac89ac7a8266997c36a2af5a44faa9203", - "a52a1e27683b804be8120231789443b04956b5e2559a2f3fa4da60b3f062625b", - "b2bfff9f5ad334bd9a041f7e95d485d439fea817e2b6d4ce5fceaae0f6bb8d5c", - "1d71863556805be16ae80c93c55ce69baccb7b6d1e7ec1d34dbcec21ccb953cf", - "14a5812ac6bb09f2e286af943aec06cec8c68acd39e71806a8a2446c9e97477f", - "1ca6a1b7433fc7b8928638892a1778c7b4bae0f73c6b3a8a4b0f8f9b11422a22", - "8148ee15def6480e10258acbb2606b58fbadd84eb56cdc6b9c62e0d9aa5132e9", - "ac53e7a4f15496b0aecb53e81c967b3d0fba773ddf9699f285d6eec927382153", - "a193d3930baebe01518fede1d1838f07cce8f230933235143c0c1a643fbf3e2f", - "c756b5ff0ff7cdda7f7eac6e217215fa0df95f19ca4d89d0b6186273db967ead", - "c9a97e5a7b73b0ad2d0bed049f05b1e26004b804767efc2ba379985d3953fee8", - "4a51e0bdff3890cbe1647fb935e79e0436c2fe2be10e8d9af54f17ae8bda33d1", - "9e11f6f1cbf5fdf1a13c8a1cdfa027ea1c6dfb56e357b31cd82585837407249d", - "aa159e5216d7780513d3bec4033cf87176a60f905bf909177758c71b575db2d0", - "237e33565a81f031260ea24efd94cad1bb90075a4117786227ff89df19e7242b", - "2c3759c2348613381bfd00753eac893f791294579d612082bccce674437e0bb1", - "047833bd828065fc0c245c5d761c929e0d325d2f723904af5371c5600d599700", - "89db3d228d1ad3e5b7db2398723f577cd81097c8e3fc20c8b611a0790d26a765", - "3f4ee527de039112206f7cc44162e199d9ba462bd72876921d873b6600596f76", - "dd4458f150806138efce09a1b113a2df66d032978ca7608e2a1558ec1d46c62b", - "841cff9693207484fc80efd982d2678b9d126b07d949dab7e0e2499782108cd7", - "6a705259f12a05576cc9b1c4e3e1f4b3ed25a1415bdd9e7dbfcbdb2c55034ab1", - "66d136d869daacb0a6553281d9118c689e9aa3c050c81267924aa115398ac150", - "8e8bfc7a3103b6979c524fc63f027b4d582cadd084fab1acf99bb935309651a6", - "9a59738bee997c76c2086d1f8503b1c095b9992e350dcda54e0ac7368009160a", - "5a790f268b10e6d4a25797c9d65ea344d9627dc9ea3c9b499e4fa62152ae810e", - "7b699d8a6200ba7774a82fe2bd142391613c86763cb82de7e9c05e35fd0ed6a4", - "5b4075789cd147dd91a6aca4da2fd761e2b9ca514ef2cbbbd4c6e959c9bf6fe9", - "c9229d352cd84e844d62c8b125225bf95e857565b2f91fbd48821c69143d041f", - "3622c5218cb3b9debbaaf8aa121bc00a4473fb0510b743922966a0f130e1d1ba", - "c7d2bc969b64624531971e62657e91f131f08fc3e2f62893b0f0ee6362346c5e", - "6b15e7b92c36c835fc523c88b2c0222490b5ed4d779f2b975f1d3d584a201811", - "383dfdf3442af5cef32e7326ec7db07ed3f359757af0f2771dc65168a075e603", - "4142460f8b6ee57c9ae07d15485bad611ca11a06b0789a6e85a3a1ed7c0b9944", - "0b4323be371b1a7ef460c6a3c1ad9cc83991b564fc7a8975cc6fd0e7364aad42", - "93b03b04d22d67ebd522bef331124660fe17f2ba046128f133bf74831f60df9b", - "249fcb1617bc763a817e3e259643144ae26305f0dd47388b481ba7027c741f2c", - "a7f055e57fd2df02390d87c7128f07ddd2c43d6d3be74f75dde704d678192a6d", - "dd2e5b5509a917aaa46f6c6f06d476ba52025c45b45f7bc5d5714a0963d188d2", - "e3526c0ab410e24acd7fd493cff1d2918f6e0fe55607be58cfe0d381001afed3", - "ff27eb72300d6f1fe915d144e36ed3a9af5386d9190a122142ebc67e742cc87a", - "647d6b2a45e83a9a21215d023cb36a2260fe181b8c875d278a360a1323ccb910", - "7f8e95f3d8e49e96ef6f379436c00c91df595fa801034cb1a48384f031d749d5", - "c40ef2e978422994c9e7a987c2039c5d39b132c3139afed778116a2616683012", - "7102e9c1eb125e0549e740c726b98208ffcab93b5df009768c6467f8120d04ba", - "49f7219ff8b6714ff62dedd672e6b2e8533738f9d7319620bb7cc77497fdfcec", - "0b3a33996d946137dc83ef91f7c9da7434539ffc6526415c56f997e411377b16", - "5575d66efc6d9b75440e35055860ac24f60c59e7adb3be19cb2e2fd58a4e9d49", - "e00d316d2b35055f69a1fbcd3259b80be93dfd8e6f49e3db63e40e04b8dc12b4", - "b7fd072ab0a2463e0fd4aef66613f0458f576ff2041c6d90789a77e6a8e2cc1a", - "ce0680119a1279faf1ab43b9b545c4275d6aea1aa4fbbd92df849af1690278b0", - "0f569d83bc5ffffb0221ced62805e8c9ff77a419b0250f400f8e6b4962e393df", - "036ebfbf1c610990e4aa10860c3b17462ae211768d2d1624d34fd0a9de1082ee", - "d2e8d0455f89dc0b31013fbe19ef92f8b9b52c9902f7a3aee06b425cdd7e15ee", - "07c233ac21735f2516bd7dcc1b0aed2ba3ad0cd49e84d3b5964a30618d653392", - "f8aa58b8d5ace33f47b6cc0f70c912d26f1bdf0743dc974e67107e05c7e35bb7", - "a4cdfa623324bbf2bbc0371a4b9d5ce0d2c2553b01e1d1e15d30388c6980c1b8", - "f1b3234c921ea31846f56a1c68c8ff95643e001b8dd6ac7e0d7b29a5724e8a51", - "a8bb9b145aba966cf42e98a4b6a1c1541b165fcc3ce426bb8bd257d34bcf94a8", - "d200158bb19b24b1d96afefbcd6755fc49366a11e6b3296213683888911a7905", - "573d564e719e1c30d32797a94e9b7551d390ccf92194e15c22ec0d2a2a56ab4c", - "7f7a88e036f62ce2db7b16de40b2cefca74f3edb849a97bec55c81b608f527d4", - "84de79d6d163441aad11b380a81fd0c5428d51922069f1ad114fc7030b763d3c", - "fc26162900ba978a444bd35df0d208d2b8f4345c337cca6335d1b6cb7472bb52", - "7793c7ee96f9b80f270c76e57870987878a33a96d18de84e4ddeb07ccd847c66", - "6c968a32d5f540b0c98d8fd458d3eb565ecf62af5489b270ca684daa806a53a2", - "c1c29d6136b35196406a630476756f040d19c5aeb03e399f06786e5ce4f48372", - "488e125c74f258c0e04b8de018c5013b8538db7ec38d65e67a4319f1e93369f5", - "32f95476b651ba960b36b59c3a9e6ce32475af3be0023e173095da58ae6f3463", - "2557ec419cb512f7bf1bf5e744043d7ad21562ce4fa48305895a24732e137d28", - "cec005c2bfc0bfc81b94d340d33a80d9d3dda493b6724f8bd5d73bc73e048a9e", - "222bf7dd2f4828af08042e9f19cfc206256b0934b81dc58aa15e5a42efa7592c", - "ab6de7163388f644f5a59a9001afa3e664124c7716a00d7fb036462013334473", - "8544891730eb42fe2571663c23ff902dc1aec0615e6e5dadc9027837dcb4351c", - "199f285f0ec8f7a863b051942997d0f54cc72edff4aee5f1bf25bfb7e6616055", - "63446d52e7d85524f73bdd9679368dc6bf4a2a5b19ece0ddab576c338095f67a", - "64f0080e52169afc940c7be064d528147e29683d3805ad22d46d0394cef33daf", - "e194cb96ee3fa763015a2ab3df4cf9b3c36f2dbcb6ace25acfef1b31bb91bc8b", - "31b42ad74b0de5686339296cde7abd18b9f3b87ff85b05b8f1bdf7350458f5db", - "dc1809da0a05ea939358dae43ee2965e9e9383ef634576a30e008ccba2a65242", - "fcc74f1bb8df09e5860d205b93c34b2be1a75af59e8fcfded89351614ec02de7", - "653ab8953a6f757dc2833d975483da8782bb6202feb4831b1adb2dc4faeb51b3", - "ed94ec87bc4fed4e8c32f6c9ed171613de6779b98a36ee7875c8918b2fdfda0c", - "dd9ffb73b0643e446bf2c7bd763311c4f968ea8a7b58eae0ce589c2591063d5f", - "87e5a41075152399a88ee11e88950cf27a69a20cafd22f6e5d93538c850d07ba", - "bea33b3ef6f62607b488fb341e7fe653be416420cc2bdad76da3c6e2efd949dc", - "d78b1367219fab438a6dbf9c58975f63f4b50cc1ada23435b68a3ff5cfddd616", - "f23979b419d8b77ba280b21f4c2834266b1234de25de435463454c59676aa84d", - "d5fc13c3c09d614fc02188ee824ae70f860a7736b68946d8d18d30db589fa69a", - "1131df53fa69359e59db6cd149e41faba6c1324c9b4b1ce721f4e2b254ffe8ea", - "9e2e3ee831dd9027c6b43f2f7a805957b8fd40c17fdc1f172c9e734412e230d7", - "afc10e7bb0a13fad9f7185bd6231c23886d11ec53cbdd966da2da907d83a3ce1", - "f870ec62a3184966ed2dac65f7c02582302752996d077e4ebe05fb5465fd3286", - "d8f983163077d494a4bbde5d1691b4a7aac88e4318db511350f096e4291260c8", - "34ad0670af16e7ca94d16e12f4ce84138531f7ebbf56c7537ce0d02a530e60c4", - "835d4c6f850f84d42b8826d3239cb84fe4f7967195083d446f705aeb01cf8c5e", - "9b2fe650977c2e0cbebd2b4f9898af40d7dbcfd2fbdfbcf263115ff521baad2e", - "ff05aa303f1698b9088ed9f3ab528c6f0609d65be7c13f7af030e7de8d4798bc", - "5e3a352624ce636921ed5ab12e49dab73ecad8e37de4118b6a2e5fb4091418d4", - "3e8ffefe410dac9b96a175009cf311b8fff4fb036810113ff2ce41f4160b93fe", - "bf04074bd015635cbcb8ad83f1fce0ce591b62da3a3dd2b2b040c3d77895023b", - "d86a4fc5916329a649ed1de523ad014f2bae93634f53fad7e8018713539eb99f", - "4de04b761353e6658b6cfe6edb9f6a5be13c46b6b2cd8d79fdd34b041aeb8ecd", - "99ca2bbca0fd146537c5d2682d5d43a84134d486a229d236d1b68faafa0573d1", - "d3b1e7a2dc07da061f995e5a4c86c2cd4b70d0b2b1ad364bacd98755d87418e2", - "e3a09fba36367508c5dea3cbdc6bd5c0815eb017e3c484229ff50e0847bc6902", - "980a0ea44aa0b6d4909b9494b7f172db0259d82971f36b4cd7d2b65cb1d1beaa", - "fc11e9dda892b0883fffe6f5cdfa65bbf0f9a3e394fd95fb9a0e2b39bc6ddc11", - "f36925dc71263d496181ca2bc49232588305cc776f4873b3cb39a874a92be2ae", - "34ecac26fd097be322e693ad13889a5cb99c92007b2272df9b2df1ef74a88cf7", - "311abdbce6963b9966d5ccd45c2f860d3df043de39b9a8b2b2f7e3e94c25718c", - "e0b1b9aaffbb093c58d93e8c7bfc6b50e610acced3b3ad9dcabbcdd76c2d6b58", - "bfee51dee65af39a45c21d4a199be18f6af2b13ba0d49a26b8097e4f57db02f2", - "a4c856d451247ac2fb7aa537fe3208f724bf204fcc9b8e6e846a5d7e6c7a474d", - "5c388c8e02514cb920c276de78e398422d2f33aee0cab086681938a4fc31326c", - "2e2a0934ef9222f15333771f0885dea622c378eaeb9f2925d8b17cee40f88352", - "95c4684ebf9bd1c17655ae0ee63cb1b70675721757b31798f85bc76e01866d35", - "ddd1287a2085c1ac953a5405dcade72858da2ee83812dcb53ca8a263e5937aff", - "e0b9f72be682911532d70afb6c905529bbf9bd7dc6023043791e1641aec465b1", - "836162a8b4686c71bb83afe3baff7b878f9d0465c74166aac2c5007094cc9843", - "2ea6e9ee1ff6cbe2b973321e7fba047d17fcb77e4314400fcfa7622f040cdffc", - "9f1ffba25cd08a8cdbfedb98a382be356786fc41b80a8a3c898bd0609d830c30", - "2a9155ed3c17f46d4057dd8feebde211a697a48ccb3917923ebf43b87f1a3c39", - "fa42d73b237956fe2c44e680a3ce39689cd4e944c518ccf4ebe0c7fe5fcf657e", - "e44d1af91414b5ae26eb4c1b5ec928dbd43173e605f5ffdef8d416f979da2092", - "022fa74ac71c94719844eb6eabae83e9d946935baad2be4d9fdf36946b530f34", - "aa1fd8c538bddfdf55ad2cb6ce23491088746e05723a4fbd49b8c6aa11aef818", - "83acc69c8f1d49ad919d1e9e8d570035fbb76795d084de5549830c15103cd320", - "d2bc3fb506bce3fe90fe082f4ed670f74166fa51373052cde9a41b9e56b8315b", - "dedfc987a6e16b68a91202a507e2cf831187214a0b3d679d8047a3a5b39d7cbd", - "82b1e21bbdab8d22c19116cec96c972ec5825b8ac7f26abf41eb233188adba41", - "49b470232e77bc72da68ea1d52253e99eed0f1a51cd8c1a2bb6367d28fd70996", - "0d819f6ee03c5ec9f63ad0f1fe0667fa4c9452ffc9cacd2c05b2e8c5b99f6beb", - "6a3ee851fa682f74da6fc304c3ef0aff67cb4cbea66c95f3293de98c82b3a351", - "4ab660925119eef89fee8da578e929230725bd9912836c1e51b57bc31a156483", - "4707b878ecec0ae987851dffbb38087887ba2bcd1387813c06a5f86c25b0a733", - "6c5a51120c8cb17721942fe036fa23069b8a165128f7ab16dedbd3f5de4c63ff", - "7f378f029c4bdccdde9aca4c5a5dc092433e6fc680602336469c33d7c8181e31", - "51ad307e2714705d8b795e34d4a8f4652449e9512f78ba10a1df2c5f0ec36c39", - "4f1cee5f78d256e16e7491f90a381cb8934fb79a2c13f4fa2e40a53ab5441b91", - "7149cab505485a539c8ce56da4c092aaf6d90db7b793e40ad25c3ebffdb7b254", - "9f47989b32de12d2f1f852025ca5e64c67b174e18823af650666cea850e93a41", - "474a41a4e1b279c9882b8e3832206114db4b5d2c8d00b6f8aaa77344b6895ca4", - "c69cd9325e08f422732f696668ee94f57686dfda4b0c51380363733f5e867648", - "271935cb93b083882ee0d61d93b8dc0e2493156fa7f3a56d7c3ac1423ab55bef", - "8d0f0edad08600fd409b991a010d77d18310b9a02e925081020aa10f33f0ad00", - "4e0fa4c1b5f6c92963004d42b7a3e0886fc17eda267cf34433c6554c687fc025", - "0389cb1d525150ad5846d501c0353b839e4bb60daec8186fe885b6dfc67e6003", - "079f19cd816915e7be94e2b3d053cc85e26caf90be8ff9a97f433b0f4ea4dc58", - "ebc091dbc439d80656039e8cc96b455cd1f733912fa2fe7addae5ad9888ed549", - "9c98e3e635f9ae36ef2825acfd346af6f3c7e801c2465be669464e4284dfd1fb", - "27605d245b88e01e424bf2f47b7cc03b5c3ba1c7f0a28cf07d2bd09611d84e4c", - "64cc5080311d8102e986ed63b8e11a839db251fc2dd574155eab055d88787cf9", - "1d9df2371bbba3d424b79acc92695afd59a30fba87491d3b3bf711bae252081e", - "7cbb438d123088b1b1e3a7d5509297d8bc0bdd4fd4610ddf8dda5d578f5f8c2e", - "9055e207e8aa38a40340d3c9a581c832ce8768632e85812fac498da05deecddb", - "f6ed04676e37cf16b350410d8047958e525d8dc36788d5d77df21d024d41762d", - "88105ac7fd859294d443bfceaeffef04eaff778cf67b21beacb3940e275e8214", - "6bd2315e7efa8300b87f5cf20b5e91d42c6bb9524f77c7e47a1f29bcdf70f663", - "d0a81f8295b7b7d413bf5e2b2832e953e3efc90b165eadd6f629060a3d01497c", - "a81e0b89ae958de5309e1ec07399f3e66e9a87e6f74c401e7e3fc5407c9c1fa5", - "36b38c35096e68485425a9b08b76ad31a1f732f0be05ef8a0be2354bfbbeec7d", - "0d23737f2de3272a7e66bd29ae04dea1ef48f9fcb2504fe75bfba8479ef81d0c", - "e4c1d875697068214c556edf1c395640a0fafbd02b973eb1c0e31b7e5823d553", - "a1c064dd6b17957bb7c81beb84b5b64cef3ce64a308fede46112817c2d4384c5", - "a7888d64e4253fb2ee636af77bbbc63158c4a412d2115e6ba13209df316cbd56", - "82f02b5456b3ab832975fc681504570c8bd598691cfd3e1b0a4ba9a9da7be48f", - "5c73dfb5c409334fb6986c431ca53f965ef0fb436132437e34c66aac8ad4374c", - "ff38fd9217ef854b0d62cd69a87037ad37343d130fca5c865c6e549a998db349", - "3687026fd5043a3d0283e68fc7e24aa6c0e6eaf0237d5b82a96df11310377a9a", - "cf6c11891d79ab5ce1a8735c6fa2554dce8da8e0a0dfa9a9b563034f62972ba6", - "74cf56a3f19ceaef2004ce9ae6bd147a2f47afc957b20276c10ac7ed58d1105d", - "f36a044c9b9666d89e62ada4febe9faf5660c077f36813964678b925bcf9e73b", - "c80bcad291d61b7830ea73d5595de7dc17fa2e655d39e6a3f82af24ab95b1f0a", - "537746783951a8b33771fb0a5470990e4ac11774ec069811208254c7603d98ea", - "29e365d7f0e065dad97ea7ad38f37eeeb21742bf6bfb33f0c2fa94763c1a00c6", - "3fc81e996c6971c925e27357825d00e4fb709dfd24246b6d1d382300ecc40912", - "edbd008b8e6efb7b5d3b87aa8ec1c0b41e88b4f99001af7422053aae10906683", - "f156bb50f21afb4be00f584796599fd4429af30a29208f1541ec51bb4b062d63", - "7fcfb3b2046b6d84325662f3d04bddb1f14306188a675cad5a9c7b5e579cd246", - "225041d46ea0e65e770f59d1fc0df75606c8a0da5b5530084f37606add290542", - "42afc63e6eaac8b629eb9a6f8f8c2b47e74e1a46df513060d7ce4716d7e4ce81", - "c1e92d53fa319583b5ff93b4f8f27cd766119a0417e5567467bd4dfca8388101", - "34286cbd5dd7b41bda111b08571d4d44fca1a7cbf5337da9803d117bdf054751", - "8e3ab31e1c3fb0d00e260893d61398df663d7b27b7570afc1f87bfb570e6145d", - "218ebd693c6bf2658d07893883e2972907aae086109956dfd3649181f17fd1f0", - "1d64c4639ae898de80ce0af9b9b9e1d3f6f2a135c1ca609de0c91d93aed6e23a", - "f252fd7c28a1094285dce5bce1397d712165c6fcf86a3926f415fc5c3254efd0", - "6a0c9cab46445e97bf81c3a36269ade716dc111ab8b3cb196b82eb39e1bd9103", - "0b76040026ccd80939ebe2da4ca1bd7efa38138ab9787b15923e1d6974a93e4b", - "2eca81fe2133b4324ae07e938832935648d5197d04736de69eb26a55b63fdc04", - "fb5d50c5b00310894421c10ea82087ea0feab91c2069b8007bf92abf1478acac", - "7be7fcdd9ee6c5bb007750e9cb185c2c756b60d9b3c9d2afe60aee22bdf2a899", - "0f53af0b21008d4603a519e5823c98de9194f3a5ab26ece37b54e07817b969f2", - "4a8e68591bd7c72a445a7bf67140d76cebf6597bff519a10495f13e44575563f", - "92990b8277185fa5ddf51c87d29a9fbd9438cd7a861329c34cf107f0dc7ee7ce", - "0ad633a0b88ce0752c138bb58d52960a840ad005f8ae5c3392c21d5ad820f9ad", - "2f6104a2ed821168c488fb46dcc4d34b4f8e5dfbec0d38e9ce8fa24b0df40075", - "6082587fcb9b22ad2d61623df2a18b7f639bfee316f02b43ccf0be79a1a46eec", - "3125871950878d3efbbb2c690eee8078b0b96b20687838c9ac7ee3ef2c5e8224", - "cdfae0e8c29865b069a5476dca2709fa01f93cdf524082cb9d0114bc68d69bf8", - "c6f3b9f5aaa408f9546fc88f0860f9d46d3753daafcfc30869eaa19b7fd64841", - "ddc9d6bb794d397e6dd2c07aee1ff374c10b9f74a95c7ac5b1cfbce26d0c7d79", - "fae5b1f813e69b8f75bb022988e9cd0acce399b44edd5ea9e3505b516000e64d", - "73a3fdfbefb48bbc051c91d1b25cd3464b4b1ba53a924ff2a31bd439b1623e69", - "754bc4f5976b0b33792cda73420dd9eedb5e111d98f457e9c52a8041dd23d819", - "cfbd114ff12bbbbd0dfd600b21fd971af865c45971f77493ce3a1d51b6d43597", - "407379e7e650d55a18fea01c48985f9a0f462a8182a7fd0c5ddc02fe5a8bc737", - "960aa24d47a2e73f7bff8e9de48f0d46061afd1db44e394bdb53246305ea9ec2", - "f5028355cf221507ec639f080a7b0c3c65887a828d6e7432d687a45b9245d30a", - "d485d1c7aeb5de7f0463aebe25ab8f76b80b6cf4b2db8a8e134a52451043a9fa", - "57e5b7490901f355c3f0ffa16359e8b7a6f37b7c087484b61c584b59010cd6ed", - "56b87bcf08f83701451bf7ee7c3f034e561c228f0caa237c35bbc86f1ff7d3d6", - "3e9a295926de7c47b5d8b62a4184dcb7cb94117e7a1c37b20baa832b87cc3199", - "d2c56db29797324c22d9808cc58d80fc0c53f034f1e215fb077abb223e3bdd9b", - "97067dc569dc545cd1b8e7322e908ad962d5c5323c8c2b43bce11d8ec8248d85", - "aa3e4464b77e58d2649029ee21598881eaff0eabbfd476b9e9696390fdd4db3e", - "c8ef0cb4031050f6ef7f767c1a09a1ec95863fa87630ff0740f002a3a06227d2", - "e5b89f6cb3c91eaa6e11a485d67fdbfe221a6daa068fe1a57f8cb8444f1c5542", - "b1dfb123243d123f4b74b5b7aafd57143068be6ac6834bd41023e10b46305ef8", - "84b029d21d76a707be701dedf614563aed3218e3e1bd39c3101bb46db5223f8d", - "8d9b5b8da0b49f9de8618b4d44361893179b69dba6c21fccfa850b8bda231b3c", - "88e0f30ca28046fa01b4501c96da5df793311dfc36f32493ba88728a5c734ea9", - "756cdac39ef74a0a0fd793735dedc57f723bf72d7e67f8a0a6bcb6d14c7a8758", - "6ca3795e8c8469623bf0fbc0d8d6f49509c02432b6e7048c6563cba436ab6553", - "c4e3561e24164b261eb0558d2b7361aad78fecc8a2697d1926276646dbc9323e", - "d3bc95249320b259963b10cb646cde7ba31af8d0fc8de737468d0fa2629b61ad", - "ace7c92f381f1662159440c5aa0186101459eed7d88376757ed5340a9b22ec01", - "f427d012fc4209cc3ec9919fbe231e2d7141a2656336e56f3e6917a731da5714", - "99b778d90788965156f4a5906b99c063130e4835267ddd7b7df27612c85b2c4b", - "af402e354d1eff8cdb20efc2a107ca75ca6205baa7f91784af7094b0d3c3240a", - "2c5b62722033e3665b7ae222e07de467b8e001f39f94e5b248c46c31d0d3ea91", - "8739a5cb3d51aea5e60f7f9349790cfd7aa271b5a42bfb8c5463582077ec415b", - "bbb7a77876863e5e2342ff3330c9a72047901eea6d9af9519b85f1d038a9d85a", - "8828825bd5f6130beb3be7ceeee35263b67ef651551bcf27f06071e742458af6", - "71df8657e0d3cd6bd52545904c91fbed393b1cae0fec443a71aa877456397693", - "f6d40a56cdad2b7cad414839f450c8c8450abb8bab5f2c5a02b9c93171a4b6ca", - "4b5724c92af3a898fcf4cdecc2ce3294c9d93f85eb494b5c4877104cf2e0c73e", - "323badbd41f1af1db41e98f5366972d0c925d442fae6bf0193756de5d0808a72", - "7d1ba5c2317a9ea022d8235ae4a0bdc3a111c81e7a526f2cb2e84932b064d941", - "61f4a05908ca3249473be033c5c3f3d26a16bc4fee01db61a67bcc7dde1d3956", - "c2301aed3f8e296aa0d97cd11ee9dd1e6bc18f0042dff2821c3cbfaa218ca595", - "08204058dea7f60a2fba07d63ddc8f458b3bee9e71a975d2e37ab905a93c9d78", - "a91fcaeb7e6bb0231c6141e5aa2100b133ac95fdea3f20ac108b85bd6b07fdd8", - "bfc515fc13b4e863f2ecb121aded06214a23e717e048d01223cb7ca547517db2", - "7a7a616d7d5f508bc65a2323db5123a46781e5ecf7dbf8b1d9f4b770efe770de", - "a18d726605f83c03a5cfc4a209941c443afd5a2adaa19a3b81e5d7374f836d93", - "cc17b5b8ed2f11d49fdd7bf45c828c45772af9a92885f4236cd8c256cc8ddf6a", - "28dac595dbeb7c4a0881b5e9e70e78f8574e869c9602b2286b5e6031fd3174b1", - "6178e442f3e89fe72f36e34b98562a7510079f49fcd18e49f0bda22d284dcb12", - "a3775dcd271145117f23ed63aa15196e12ddc22b6c903b0d881a98f8cc2512b2", - "c3331a34e88263bf84153fe20573da4734290bef082570711c24773beba2309d", - "7dc83bc3baa6d6c4bf2bd6f9ca3e74f0e720b322b1755cd8d44653d2ee9f6a67", - "9d76130e6c2c814d20fab3828e575abd5c0d4df7be5bc721f075f186ca0eddab", - "1922058368b1f5f816207485af4830c8384ec120aa75639a761f11188b088d92", - "d0e3f35f04935cb4b59d9a5c3be15d939ca90cf29178f0e6105a0daa27be7126", - "63570efe0cf326398a1178cea0265e5c0befa255c3e9fbd6a736cbc679d637f4", - "0f832c5df8f2dd6e04dd3d28833bca239711cba8331f2ea24ab793c6a24fc6f2", - "49e24ab309ee1cb8ea845a7351aac04a706334addd8b7802824c477e17cd3443", - "f6fcb33b792ca03ebc11537c481aae44a653a3721dad9ebc64ea9869e236dbee", - "bfdd4dc0891def1388bff30f0f27bc95032efbe7f4a0cf5993f11eb65283d841", - "dbd56d0eaa361b40cd1049eb38b5fba6da4cbfa3d5827101e03fb2fffabd4e22", - "adeff78d28dccc54d55522b55fe564a506905da0459e6d8d4e2f75676b037286", - "f7a68d48f6e5b1174eefdcfb40d2a59366415a1ec7edddfa3caa1cf3fe2d59c7", - "c16a36dc0af24c18afa1e9fa624b1b251712cfd88d461d31119403dd234b3bd0", - "0ecf7751038e902d578af516047fa86c01517a0d6243d9268aa3198c5625178d", - "1ddc41709a123612066a1a4016c5a080bb2de8529cc26c7433e585fd479c7b5a", - "624fcdd10c7149633e2db42d9f0d5a3685d9682a85ce3a7c7dae51dd9ecea28d", - "c469b5285e74315b57652e7db54f4803f04a5e3b2770093c980c14ba28c03b5c", - "c6b9d455672dd39872099569575709ebeb9cbc0e92ecac9cabe67312e9f485c6", - "108246c6495340eeadf5f4657badc5ff0ff68033c29b746e078c11bbc0a3e029", - "6fd505ca3c8d8aa820bc309af5d9b2fff8d84c19fb050ab09e3ab9e13635f3c8", - "49bda531b2dc2e27cfe41fd399b1464e3e3d5ff2134d383f99c4ba486d81c7ba", - "93f701d7b96a676620709484f60be55d7cc8991cf19827b4ea25c80feb4f5ff3", - "5e70fe83e93a05a2f9480c0f91a58e3618774898a3e5621f28135087a90533c1", - "2683cec2893db52c9ef6e5b64c86a5f4df2c7f54c3e9880bab34ca9aece49e57", - "e0d55fa80bd38a8b6fe3dcbc117516706aa7210ab0eeb0b4a27fe6b897403dea", - "8d4070b7517ff111f9662f41343fcd0cdae5d57763fa9d11d5e4acd6023595f3", - "6b5d0ec4f43c9957b45913c6fa19c948d886bbc22bcfe09b460794bb4c70a826", - "825756cc595b782a8b250c08c4b30511a68f66ae4f22b61c32fc0fcae15f9a2f", - "e783cc0c16f307c5ab9396ea3960b9d9494ee00d97cc9f9d6a3c38b548301250", - "9147420f33f1431c45dabd40bc0b72ca2af9b879db3e150893960025d39f0154", - "13db8ead1b2ad4747a83ca251a9b3bc177468a2ef3de616cbed6c31e1d00d8b4", - "bf756df1bcbc100abb9837b632697a40853efc6ba526fdbfe6fd7e813cff48a0", - "d067edcd41a405797b9d365e7ac78160329fd325f0cb0d042a44dacd2229626e", - "34ad3429e0a2390308861b58cf9577f06a03f596c7da63a5f87f487ff0e96c70", - "71b4cae330a1ee999389b85431eb2e91adc21155dbc8514ea2ed9e0b647de2bd", - "28d73ae98ca19feaa5e9f1c3822a36d82e7cf78d811bf68c40239763a45e3a5c", - "4c778d5a77a501ba55d86796f2fc1868c54440c5d296ad72933da7e6a4348157", - "5770c89fe5968119e2b4a2d0b420f4e5c09cb30c51319090d725a81179a2ad55", - "1dce48ed2de07c4da8e85f46f4441cd2bcbb8c9ce14c7b1ffed03247ddbf4bd8", - "62799ee2fc78c2515bc7b143917bbc24fa918aaabe075860ff993575a48c21e7", - "eb48eba5f6132310d703cfecb34c9f90fcc7de2659d835203b54592da0a068d9", - "2c53675e507756921237f4b8337ef7132e003ee395ecfd16ea89bb92948c6ce1", - "1362e9261abe3a39c8967bc16de70830a58bc1881b12a56ade29eda15d78ba61", - "a5fac3fb4bd8e333144f2871a128db9effc5ca5c3592be0d7cdfc9833996fe77", - "89d51df36782e851b495b46d8bc8867b80e5d01ebe3938387b1028fda58e84a3", - "0a3162d7fe39d14bec4718f231d19d16af1ddbb0d4c17ebb90e0b1991805dfbe", - "1ef5cea2092653580a717ed52412856d3be3ef8944d21f59b818ace70bfe98f8", - "14bc9cb29e0cc192e94582bdfef4b65976cf3bb4995d0ea8c3512159840d3ce7", - "a06dc2bb5c31862282830515d0d18864a2db6cd25a8be29c42b22442d8fe194f", - "bec3050014a50c40aee242b57a046df080d627542efcd1805fc8b7e7ca1869d5", - "f5fbc1f93af30d0ad070f21d0f2d1f1a6cab40493aefb80c93f99daf267a5b6f", - "abdac96ba4f50d1ccc82ebd32ef42f6f6cfd22aa33e3d2fa7e3769171a0f04cd", - "edf9feaa7a1e1252cc42d6fe8b466c56403cd6f19729c02661ca6478de5eb13f", - "f62e51b1dcba045d90a43cb51512de29afe216b8ab341f3d3548a41ac2c2e6fd", - "62c14d1a816c2892b237cf7288a466365db8029d8b1e89e51dddf5e4a920986b", - "ce247a0a59d6c5d23db3f7cd0b9e7472bc22e39c9835f45cbd39c71a21135875", - "b4572c8966ee170f1bb2296e0554dfffdc0d78a9f3a37ba2f33d7dc2f2dc382c", - "95c2de0ef7506749225ae4df331201f0761e6c017718b73e0c6a9b8148b51b7c", - "3ef76c4643420bec0b2a7b5f0a96923553b230684a4a5a7d272354c5b0ed8049", - "5e62e2df308e22a54cd509e8cab9be6f899ac12799510a9165276b4e0b58bae8", - "81fc3ad3d957a8bade1e725d2724b52e4d15fdef2d51c8d807959b3bc15c417d", - "4f070f8b1d1c812165bca1bbc59da11a51cb52dbdbcffc0f1db2e082a328503a", - "5083574696c60fb05e59b392d32c0bb5d2ed5ed3aa3e1bcd5434669bad2e0d13", - "b59c01ef7c8516e04749de000e9e511aa5555519778321670254dca000a2cc1a", - "6f30410124506d26922b0ad0e825cbdfb0abae19a40ec6458a952cea423960ef", - "b714bbb4f837d20a23c364a1bb19ec030f08d253d3ca5841af282914ec5d71e7", - "6f3d00d26f1ee09113119907219667e5279c69e0781535e312dbf9f5c0dffec2", - "1f5250c699bac6ff1dda510b9af0498eeb8f35e9e1d6ad51160b30a3fef85316", - "90153087a987574203f1141b0ae2188761eaf8cc01bde2f4ae692b9a85fe79ba", - "57e6620875a340d2939b2a850db105dcd2dd1a174c890ba5793e187a8054231b", - "0b3cd61d105b8fbdaf2f309affe05e5f503b874fbf30ba27dbd18dcca76480d7", - "da65fcaa210cfa6f817fd7bbff81deaf380a5202048949ee69152ce42ae75377", - "ccd0ea472fcde3134c85b7b3c9afad415c21d6bc92b887f166ad47443758400d", - "7a4c10bae711fc64a8ef84e87308ad8e280f441a899f4803235a5276a1d50e54", - "ac99d81a7f48769d7707eaa10723c6613ddc3baa7557703bfc56f1c4a673aa14", - "36788c16a464220fd21a01aecbc4a685c30bec40244ae7e031c41885cc9bcc73", - "026e42b75ee8a4cda7addd11803bac1a4f364d98918f9a9a67d5c1493547aaa7", - "218873813c310ce9be404941fdb466f238690f53de9703cc47b84ab5b2a3348b", - "3ea4c8388bacbac8f72ad88923f2df97ff5fe9c587af95e749cade81484d6dde", - "992cca6640b25279ec23940f582f8602bf97d7e3fdb89f657c4a07c1f1944755", - "2d97d5ccc4a36f34be5e2b82e1257848a516475c1ee1abd81f4774d9f60b62d3", - "1c6e4de85ddd2889aad77426f55e1d485bfc4675b1187eaebe8ba85a6406ed95", - "4b8ac6e599f03d0651d830597e59813cfacd6ea6b30306fc2c51893c0c064393", - "cc2727e551802427c2e46058cf5175f15e572e2f336aaefe0bb50502a1af58d0", - "f3d79971991f9f02db99d72efdd2ef92b823bb55293f4f592c97d7e3f728610e", - "d45fe5cc919cae81ed093accd7c9c5f69e2c572c6ad84cb12c9caa958d8d93c6", - "10ec69d6b4720d4ffcc69d4f883492d09625430b03961e3f96501cf58b98acfa", - "7a2dd17ab1b417fb58a687307ae87bd866a0ebda2a1bfc0afc130523db89ee66", - "6736d50501006c6c5b87449d5add1b3e679d1b015effa66b53a1ac8ff9c096c3", - "ede878da425762cc6a96fcf4f20b40b7b7fc3648d03efdc1d5629e99dbfc6727", - "de75552a801abdcc8629abdb84aea60f3629f7803b8e615cbbbb18534f0b348a", - "a206a746663d850a48dd3268b5453d750e2484915e78bc4b51faa449d0a817e2", - "deed8ce47fb9ad85a462956dc584bf4a9b125227608074c95a469c00a12ace80", - "9f0547f7ef221e9caa4daf377d9283798940f7345971b01992573a61a4073dd1", - "e19cecd05f79053a98b30f34459e91f5dd7b823e97b3e6a1357bc46636467502", - "a91c2b03464e7453493ecc968dde46a13f1868c46672f9247e76648cd3b2c411", - "0f77608409f90faa7c925bdb52df489497ed07ffe9b7e34a9bbfefe301d7968e", - "48bbf553f329fcd90dad713d53a1c9141f62860cd425e0895c1ca48ed8f46536", - "d04b64e9376633fd18605cc657b45c537cd341e09651a0a7f72f7ac059563f72", - "41ceecb4f305b16b51f2966b996ea95a5b2875cea40f4dbc431311d2e51f411e", - "4217a4abfffd9124c9296581b1a637adf04085c15c65cb538004336d1e671897", - "3e1573906b6f1ea6a1b607e95256b011ef78ec86293b909574a0ef492320cbc8", - "d8fb7530e840ec367d2e44a65884a98b4b768e344b666f295cad947f422b4c70", - "a0db386a5872d3faa6af402858ed9f058bbbdd3389ee0452db43a2e4d9f68e6a", - "0184059d28a67d3ec3b055e1dcf15796af9886cf61e063280ef426bfffc2e198", - "92593446e6a3f6d4bcd88cb7b1d0d98d3063b9fd14a7e3adeb61a3ed3b741fec", - "b9fc68a5a4f3ff797081eb15ab18c61eecda821c359875256c4b3c78befce7e5", - "6e8521d2ec9c6a5e8bcef7853fb464c91a63355d27d404a7fa579ea222d197eb", - "9c9041e90e89f22535968952d5b080721502dd512044b6284822480c0ff8783a", - "7a51a276c53ed3f62d49e9f689927eb9dd11604a12f6a35540bd895f3ac3369e", - "f715a5bc5a7fd2aa29e1ab5f023fcf962c16d36bfeb7bf83bf565ff70db9206f", - "0b8b604e7846119e5872fe3eadb1e14c6ff194bcb06dfe1822621936ee90d3ac", - "dc6373cb9b97110673d4f4a46c93b8f7f6e69d7c5a8815a4078c0d27e77fcad7", - "8849452f22470008ce48a3aec8f89b47636472c518d60bf674223eb67bf3d3c7", - "4c3f1bb4283f307daf9476e9ae7d991627e72a9e2ca46f0ab169648aa12b5020", - "c434dc23068987623c499cbb2c96864900fa2b17a40a01c255ae5f70a9407e27", - "c1dc4a09b92340561949a49a1b4d28a2369e45c386d08f406c1b03682e8b02a3", - "934297a94eb0bb0141d557988de3d51e09829dba8bedafa3bf4e78c1c07d9bd9", - "f7bafe85a32d65c622e7bb0416de2c404fed4afca229ca14824adff0db9fb82e", - "fdd4d43bda80b09af5115ea53e72fb90117944fb0f04c1585e087ecb4df078b6", - "639b91ce71e5572e59387a5dbbbf1bdd9866624ad8ee0d6b0514b997b109ce98", - "33f5418fe13e713b1eed5b4756f002c74195f35b7288dcec568918da8cc89e78", - "390edd6e0b20d1930f19bd5d4d0d99c0d0020e29b6fdc9e4f2390ccc8f7567fd", - "0619b04af1cf118ec19da81425879848f31b2ace08879fe0137a301fdeb96b73", - "ca9f1d48863def96a74e654a7465456fc3251852d1f90ca2efa8097bd5d4ca7d", - "1016dc1071c1341cb9afd8f72eaf415f4060cf2f07eede40a139b0d77a104773", - "956fc698852797f32a609b77d5516a08833e81e707b2f3651706e63b379472da", - "98b3a5e1ac6d1a5dc76042243126db4b3aef9085a80518fadc48601d6be81c60", - "8a49f2c38204827b8b67bb6820261c2091ebe6a238cb5ac7cfda7a3db5f37742", - "92e8aa088752bb23dea292ec48818784a055708096b4cc20d65966b8342783a4", - "5e847fcaaaff256ef1197041813fa59be9f4c0459c944bb3b4093d3080cefb59", - "400bd5a95c6dd34489ac34fc23ea6bcd4aa945881e379a0b0575f7edd805a1bd", - "7575fb8354036d5d115ee726501be2711588a32e43c90d75d98bd5ee869a7b9b", - "bbab703a670e0b0270baa9cf0022d54e1ef20c0ded5770846085c5f81c21e38d", - "1ae92bf390d782a666f5c385f008af7b571d5f3bbec56bb62c1660012753a5ff", - "2cd0909f1e6acec33b0cc585fd49632d91fed8543c8e8f02a48983e6a4a3acc6", - "87313f54cfcedda89ef5f7e868c7ae74725f42235bb590b89cd9d06559e93c31", - "730f72815f77ee49f048c97d6adfef580a762747226ca5bd1afbd35830c9ca60", - "41a46bc1539476620fc2f63d560344da9092ab67c4b0401dcb17d8d5fe191887", - "0cc88358885cd80227e9e26ff7f1bb8cd052d0614b1cd947c747f711aa088c8b", - "16710fccbd52e1f62ec9e6bbe5b5a8ab5d047b66e44daf5dd4f12799a9e01626", - "e1711ae712017409f789a554afec4107c7800560b0d15ec3993cf1e7280aea2e", - "0c04f8d69afec9b98345a8c8dd2e8980015c9e0b475e246f650341452faf7d7d", - "71e23babe069ea3f209e001e4127ae95f4f926740a99b60e055e5864ec99c1f7", - "6b8ef0a8d15f143c6f687a24057c9501e829bc32f3ffb574c0f889be3f416c15", - "f17ae1aca9707a1c983473332b26ff420eb4619e35a269c18017a26b34f43018", - "2d482251261d6ab11541373115548ea5191388a41be881787d0fce6191e65cec", - "1e10fe0ec6d4f730f7cd110fbbd083c5fb61da4a8bdce66fbcc311de50925520", - "8fbfbaa0b8dff5cd7f383ce3f3302645f7d79c2ccbc7fe34ee8fd8f339b129d4", - "857c5099dd7b6a8616ecb196f1b1423b13c6c7fcbac9b5245091c010c8e028a0", - "661649d09a4d5c3146d91747ebfffc771d1237eb5f78a87e7563d3471f806925", - "cdd84f489ce98d7da204a992396e1a442ed8ec1b6626db4cdbca6c7d7c2ddab0", - "b2467a371fda5cdb7c394408feec5a3a7c710a378a9a10bac752f694c32c779e", - "865b96e2c15425bfdee58c6fed4e973d8930c2e765c873e8a72baefb3f8e5c31", - "e0e523dfea5906d5ff31b9589dec71134883ef67431390ae48d60430563ed94d", - "12166f09d6332283d46233ee2559d91be4fb93d3372165083410b370e5552a15", - "ce105f302f6996dde59d4d2db71b60b58b2a392dea2676ca57f68e7a4a05f7f8", - "45fad9c32df18f18b4481f361b70cab05e9c2974dd2c7f2284f88fbc1d7688f4", - "1c91cb4a9dcbaa502ca3a0ab1ba795cef77fec0ae148d16730be79f84af65c06", - "aa78af1e0d5327edd16e51cc97800675d793ef13a62fda039419e2243932edd9", - "cfb38ac5b7deb81a7b036dc6a9c21e79fc189fb0e4b3cdc6438db97865eaa155", - "6431fbd50e774115b612710539b669d9ec065501850b2464e318dad8fa56716b", - "9d702c8527cdc823c0ce80dbb16806fed155dec9ec0308b5bcdb9d47c68ab3e6", - "29c5dff7297bc724a91c740000e458accaffba2d99c77793cf0b695fdb24a10e", - "f2e1ad35ba868aeeef55631f40a2b30cd1674f9cf32c73564af0fbdbd8f577dc", - "199c4b90bbe6eb271e6a10b2afc3457f18c732492a6a09a070e65efc6974e13a", - "d2dbe0aed2b1a01a039690112afc888cab38c63d754cd83bfa3ec384b125139e", - "8e50cea5a30382a5f9914dcaebe4eeefefa14c754dc66ca699c4733d5c02a35d", - "fe05a04c1d13536a5e63e0c5bf08f64079898644ab4d1b6ed677af554bb3b1e9", - "09a11f06e3ce967c1aa5d455476fab64984dfb86c7ddfc70c08a6d1c0f6b7e02", - "7ef48b5f25a05cd72f7616089e3abef0939a12f4fa3df859a62ab1f6a260fa0a", - "111ecd099ea9fadb0ae515f86d55db0575d29e801b97f469c06c5b2b63e17701", - "d0694d0348c2a4ed2ff24a1c493df66b91b5c8a422fe0fda017fc73a6d34223c", - "87f437010fe3b24547c06fb7d63cd85d267f0cbd03b3d78eb590fc80ad29810b", - "5d4b8c8a19b119e2f0dc942160c75df574e7b4855b420e1f98a36846aa9ec1e8", - "41286ca0fdad4d94a2be349be5011467c3d281cdde7ed834e45426af5b6b2afc", - "5d0f6d09777e939505596215cfb6e9d002ed0afdf11565a4fe004fcc799f5670", - "d643553b23057f2083c4d5ea7e6b42200dc85bb190700636a363f44113c5eadb", - "a5c1a2641f8070000cfa01b758bd8aac34f4e39161a78e9664c997e8db7aa79d", - "2fecb6382988a24217d3ce790ebb144f6c754797f71d325435dd6522a1479d81", - "51d990ddf56e170af5c9851b719830b8d6b19241556dfc9c4aaad1978b741a85", - "f6d44bdcb65b961a897c7f4ada012306ee4fa76b0045582a5e895cf2c5ddd21f", - "fe656c637abc68a9844a514b447971c5ae92a756d355906be9b27bc9b3e28e4a", - "da509da5f6662ca8755843ee017d6ad360c6ed42cb7ef37462f7a3d6e50b483a", - "2ca4a2d26a4b725b608655d81a6568badfc2d78979aa6fe84b65f612d9878c77", - "86130aba2220b4ee1daf00c295668368c3b223bd9547bf8f547a060713a906f9", - "91227956113a611d55f0e48c1eaa3e45164852bcf9005bcee71a971577dbbef0", - "e51778f07d43d2ef6e278ed7e8e0577fe7b843ea7fc1b4101b4dd60b6d9d1a3e", - "2bc48fa8e06259668b2b1a578bd8907b1d9c522bdd0dff8dd849d9ea04184ea1", - "7e442acb123b1b668809a9205023b48be4f1dbee1e5df30e6b952c45ca1bd913", - "a8d7af005d41ffe8fb62afffafd1423cb67b266496cbbd7b25cfec699ef42341", - "e98ec74d70c9f316bf511d78a528485ca5d8ea958d8eda9dea0b37b7b46d1e1d", - "72a4346750057869af28a6e4aa8eec251ec1a24bba8b5fa9d66e5a20c598f8d4", - "ef91c7f84ce09b7cba092ef27ee07e907dd54046863edc7952609f358a7942d0", - "b0f4678e1c655fddcbaf58709192eca542d81bfb77eec152b0a4e8d5917755a2", - "dd897260b25567617afa9d54eda0c5055ebab9b4541e68f961944993c128cac6", - "020ed8432b7e46292087a726f14494cfc67cde459b871320f13b4080e54e313a", - "9af1d7847e54c1f0d6ee9d6a9149784ff32bd9fb92c3ac4c6d22ac277ab6285d", - "69e49302ff845c87989f9628312e34a273fac47c2d3a69f4a2ce927349e2963b", - "62955b64438be70c544d65a3c9549e3db0531239cd4ea11459adf4770d7b332f", - "006d2c708e626ad2faf87c5c019d93d634276ae7e111e51608784a876fc9df9b", - "c7e257d13f2c77c306fdf6a759bb80c789e996c05f6235f06f486bf27f64275f", - "bc665653246eceb980b1441d0665dd58bb230a060d82cbc8436d2c6cceea85ca", - "8da13549e1fb0eb4c9cba7a7a280fcdc6039116b251d85a99473164c7f4654b1", - "26ba9e9abd7bb693a8411ebe80b01915c9aee40e901a4d2983eaaccd22d6fb71", - "0048e1bd4b8d63cf854452fe1f98afd53a654515e344ec1d8a1e583d95ded9df", - "9eb70f57dc3e709c0f59f2c6f6578b45adb6cf3e6f90664b7452a9026b6068ce", - "b5778912001d105744e3bdbceb38e015549da2606ce2c26a99e3aad70b751ba5", - "4bdb00d48fb46ef978d12cb991d50a6842cd73985557939683a163b9d6ba1ae2", - "416ef15cebef6235f63e23b0659a8c26c5f39d045df48569bcb4f8d1fc50a973", - "d653ff3e0d4abe4ba59eb8176a0fe22de4ee40044cc2292fdb4056a786cdf5b1", - "12cd20016cbb7186f1760a831df8cd072ed92559b0cce9621c69f5a989d1c6de", - "cf3a49be8e9190bd0567646cc4359772a0f58951ebe369483d9a2283b5bd31cc", - "dc442d2ee4dc26b752bb86a50fed9559d2f1e2b4f0552bd898447733b349ce0e", - "07b6e8d4ef4cecfd8ecc593052d99fc2237e190c0962c6482afbce890fcd4330", - "a92d11e5c22ff419430a80a283b9ef3373dcda3d1e7a4e1fe87ed6a2590abc9c", - "3a0958d10bbd7678286861299be2a51b2c9730a12c4e152b48c33b589e24c2f1", - "df8bd0c232aa7e3cc6766ae5d522c5334cb5a9d81842d97be97dfd3d9c90dd6e", - "0b58aa28d17e4b328a12ca2cc64e83ef9d2f3dee2bcf6d93c0c3a9b7e71b5da9", - "5ca1ddee456dfb2e0388ded1f3705bb875a300db439fc243f5fb9e675588cabf", - "c2fa609a96573a6d57377ffab844687952b501667744d0f1730111c1ed1cb0c2", - "a921c701804ee904b2269a25d960025a1c7cbd5cc17c8d5193f3bb08ed26fc9a", - "951e800bc88a9c3cde4fb4670be013be8d378127d394e01d929f9939d2df7096", - "5fc1c672ae53b2adc3878aca7191215f72c4e7865de5e7f898d0f6ec2fc19c21", - "065f03672a003fef9f0accf39fd5fa86ddd4020b8ed23ead9a572b5213386051", - "673d44d4c959acd950dd14071f35ee7d06b0b8183fb24fa5d725ff46b5acd2a5", - "3ca8848bd78ccbad1c16902c6928dc2b82f96a91d990c7602d416180e75ed59c", - "8eac59f3f66148d2d210634cc201a7dddcc76f6cf7572d41e8a808d9e964592f", - "75333de76a2c5e0098a6d95875623fa59fa4d03e0e3e26c9ff4a5d33591e3505", - "3a875ae161dfe27df36c6a2c0b6af0318024419d78978d3bd3ee02e8627a9954", - "f6d0d766952271468d5cf5cc0db921ae74aff3282de7ef1963074cb0c2aabbb0", - "3c2e6f45fb4c2754d71b285d8ed95cff8ad308c038fbcc0ac9ebb4e6c14173df", - "29a9f24f4c7aa816bc0d38cb821c1cc717de9430f2f4bb29f08f70a3a2528b86", - "f5f072eac418e965c3dd8c6ad8e672a958ea002b3df1779caee072d953bad0c6", - "cbde013eb46b898aab3b3251d9d3500b407248d2494ecaed83346a4eb2ad3117", - "3a8c8882c481f5d6e05db787b69162d81988926807fe913fd62db4881d90bbb7", - "ace3be4ecf8b270e901cf624eafefd3b29aa7bb0540abc24d3acc35a2ed5d0f6", - "eef798fb344af5edeac328862d63386236451c2f64af8277ace913af83a3d3f1", - "9f6105ec859851ce95ffefb5552c9ec6916c0ab64f8ea6ae4c0bd3e1f02461ab", - "046c6f1278ccc87fb0f03ef6cdfd5195ad533a04339a3e0e4a34903a409466f2", - "1d1f6352c0f9dbc07697daf468fa0035c74ccd5dfef791f0f3c934e1231b743c", - "adcad5c71e95f55f65a1ed3218c40cd785ad877a59a02055f2a7a3903be15d7d", - "c38dbed05134205e86146fc872ebbe9fda705aa9199f411171cd86fdf6604a93", - "5cb5b8be6b62c4256e2bc6071ef3d4fd51bdeb020484b8a2c2811d82e2609df4", - "e384ea112f289c06fe753acf1d7a7cc9675d3c56b12c2a576b00d40068c66016", - "eadf5daa3b795e24034207b28a3bd52c1c6ec471f59b815034d3a72a186019e3", - "068918d7d921c64dea682aaaee0cb4f00be0b4fb37bd65a71d4ca21d63930903", - "0114504b784773bf8fc6d721056781b23ad97858dd1a8dbde22765c81396aab1", - "47b690d575f13f653b78a8504cdfcf6caf73f0ff2e274418d785dad2c46e1197", - "741f11da9af07596d9403022a20ce0862a4c8f4622d3b43e58199299fcdef788", - "afba9aeb421683976222eb6639c265c847339902de9ce7b908d272e1c8685514", - "d58c428712369e344edd97cb3bb7a5e8d2631968d98dd0b5bbd57c2e8471bdaf", - "dfb2385b3e0082182e3382ba7350b3dc8ca64fd526c24ea15daf9243e505246a", - "b7ae60b456f7733ae3d8bb927b03470eb662f0285f6c83d545b735c35634ede3", - "c812b7e0e6be3a05d54df306889832c627778fbe66ab8fc39b6f5463201ad2bc", - "4cdbf86b74ecc853d0672065f689c18c23b78bcc24e70c96b46f554386efc74c", - "f0f222d6a8a75b3d4972c04e2527b16ea9281408b0a6d2c69e3d8a83962a1665", - "74292d45d9fb55bd429a731218296b87d93c0643e819311e27071031757b9610", - "bc83e9b50483e39bf800d05c5b485e01279daad0bdc24f7affbb17962372d39f", - "72a26ba859de785564e5bfa4fd8636ebe41bcc748f2dcead806927432d27bee3", - "532c60d517ba5843af50e2b6103387105b6f8841244400b2caaeae548a04a8a4", - "f2e88b684cf62475cf81004375c0ad2af84432046f9c565617f0cd6a2bfa3332", - "b974ff148c7980b52a04c2aa14a069a52d16b01181d45eacf00ac3e6cd0da44e", - "85211735a4aeabc30a3d3a8180d06b0e042ca625a5446eb48e66653130afc525", - "4c1cbe1f067d1eaf834e56033fa5b6f5ff726fe47c45c14c7a4dc831670bfebb", - "f7891a1f61ebc2a9c42888d1320f699a20f56d95c3b8c41140478c8d96d24240", - "66b2cf4680fabf712cc9e9fbb5bc8819e5a76f2e86e92cba5f9ea708951470e3", - "a101d2b4da884d971ad0c41f626c761627e713ca00153e5aeec3eee4a5dac547", - "73419d820a9e0a91975cf78b55ff7d6b064b683f5aa5bc209f89b0d5c7758786", - "a94fcd50991b6c13d10a86201314fc9a93a6eddd7a80315a6261d67912d9c004", - "7db49f16780e4aba11afabfc042a6155cddd70fcf49b971f00550dcf7f99ff1e", - "ba50b036aadf4f6ab4e07636d67c26820edd043ca9f1a8e664faf302186c0328", - "48924ae4a3d00820aeebbb0e06dcd606c0607253339405ca1367d0fe37aedda3", - "4a0e2d83ddb0d0f5108c04b11eb1877779a628d9087852bb413b836f38a1e594", - "3d5bb3caca5b944e4f86082f9b7fbf07dbe0d2400c8fd8cfbe618cfd4cbf2591", - "ffcdcdbab93131cd3a7b03717300b00cbd4b44c7667a403915ff43bbfeac8050", - "5957ee07b62aba3d17f90a132e9056adbad543deefa6302dbb18179309e11d5e", - "96a5b84af2225a486bae8172ae906f3aff6265d43a2ad7c3ab5b009a33dc9d14", - "6f2033cca7541d7b0013e7708525d8e4f8524a59d9c327137f82518d0c97e6cf", - "dc0680693502960ca8ec2fc184299be9a0fd249ec1e01d6dc23be694a12101ae", - "e72d32e67c79abcc38278f107f98b07a14d6cfceadacc4cc974f7c39e2749615", - "5e15478316305ffe70fb954cbcfee8b4eb3242ad3f1572b9bc050eb2ef8bffb3", - "435579cdcc072463d54ae640971ae72f13a225ebd5355707b66a80cc8c1eb743", - "ab1cc04fb524a319c5e51e44d03a63b061df60179d96b4e7947185897dc24f36", - "9f09020d0723bce988581b2f9670ac7d28c631875088675823786f9a9da5041c", - "1c92de77a3fbbdde4369a48a18cd578a83a94cce825f41b2ae8e30e78aacc5c8", - "10152a1d39608edd62ab016b8daefd1dabed0d9fbc5c4230de2fe3d71bb38f25", - "ce3a5e43fd841a6d6d63f8c84280c34c67a7e85a7bd272ff300c5ac2343f4d2f", - "51b667181515f1ca6c8d1178917caa3ce6e7ae4154bc54e9576525257dd31854", - "ed0526234a8f564866aed948f2a23127509b328928a59c274bd31832d43eaa47", - "9dafafa659f38f043ea3081f0342fb081ee4347a7b90870c3b2fb52f2d158878", - "dfaa3353f59ded2e04a6a30fd967c11ae9f732c54bf5f04189a6d8d9023d480e", - "f9e4d5aa9545da2d5697beb0ede0be1edbcedeed8f3a86258be183691a262f36", - "86dbc0d74ea14091ef0588aa7cf3a67697dcfa53df26ea0aa8a9372446ffa7c7", - "d9c750f100db113382295795843e43d30d21a5c097fc5af47ca6af0b350917d3", - "583497fb144910b9a9aa75245ac4a090ea4b5d16ee474061ea65b281d51daa90", - "685c760aeadaacb4f5aefa407c6dffd497de0ba24a89d8a1a1ef0e8e993e53bb", - "7ccd332e2c18e8ea8a0c61e689c6f9679a48413b3c8598df01f764a4d953736b", - "1939d247fe8ceb993458a43620ed22728c3c9f84c7119633087a5c1fad5004c0", - "394358ff290531238cd5a5e556dbd571171a8b24bf100389428cd7ad0c43cb7d", - "5b9c2e7df60bd6e17db11b1598ce8c8963b01f9a3508c39fe6a4ba29358b41d9", - "b594b98ff00dd2ae5ae10650b5b94be2823e2cceb79ce3fffefb5dab95e4e57b", - "eb5b0a19e17f3ae1c176bcbdcf473d692978f8a8d3fbf9f02550baa14af7a255", - "caf53014f10d6e1a41ddf13c28241a7f6c6d4ccb540db1a91cb23d70a4fd44f5", - "4f28d16b0e634225df7aded8df25dfce7d9e971f03a96158d562db60e1646e69", - "6a4aca7582d80851efb9c3c8cf1bd471a8ab01003c75877a667ee6953b61ff8d", - "19ab16bf39219ce03c8ae6c5ee9fba01bcdb1da7c9f7855d3b9bdfceb4f6bfc9", - "5ed425940efc5b13fdf9614356997691e91d76fd04a6f518657e5e69b2de7244", - "c844bd2b99054ff667e9a34e79e9fff645962d5376acc8c0b3d76f4ecce00f70", - "38b74b426dfed825038a57c80cdaba128a3e40c0357f106336c6a24e89858d41", - "581deca78c943e9c99afa4cf43cca0257dd54bfeeff6fe36de4820e74e9a2f30", - "2d2d4ac68bc0bc43ef89de1658c251f42d37be9cd089f0361c27b9d01ec47e3b", - "6faece0e9b1b17d9cd709a1cc466661c19a3773798b2c8b4c66c5f9dd9141380", - "1049449a85536b6d95d2fec212549505429f5f8f29fab0d54d86a421e39b6a00", - "ae946dd6669a0ac07a199359c083c5ab69a1d6e83b012c00f72d7662b78b975c", - "c4aecf303a0367c8098cc6e2ae1af6b587fe97ba19fab669e520a97265ade396", - "6463a4cc86a8c799251be233a2e53c1541027f6f7827c494762d17d84a8d1844", - "b26ce0df780d02502bde073ca49166a6083bd13fc0a00e2366046874f4a62665", - "03c9004a38ffd96e547140d902b3a14f059e63953de3244a0f900dba7d5aaf71", - "f1b1d1444fb6f2b8fec4e89fad02cd4b0d48a8b689110d92bf9570f2a1605589", - "0f3a2fa00b5687086a3d967fdbc9acc39b63fb9aee1d9aa5e3c892b72a227112", - "615e11502c1c229ea9edeca6a448ac10e9ed792556adcd8c634b5d4e6fc61707", - "9bad4c0f92ccff735c9180661895cbf3abc698dce2de3918cd7d3c4a67d3ed08", - "fe4df68f7f3d70ee9fbe64c99fdad4dc510cd3d68296e46615c58c2d08ea745a", - "0939b9b6fe5556c8f138fae6188e0badd272fdd57c644408824c58bf26d50eb3", - "72f9a5194241f29570326ceee4e3f03673b5f590b7496788d6d685fbd689fd1e", - "dcf8f075564b96e210a1698c4a659addfc7ddc5ef2d56fd8d5c56cc5612d1e77", - "fded72a316d4d1eadc84223d500e6ea5c14c2a904d867a1f74ddcd734ed81c00", - "27a753da76e4e96b8cf18add6d1b3b157b7d2988f4ade0db3a229a13ea8852dc", - "d10b169883bf8077ce2c4d8421dcaeefe3c2c07f5a6b86eb2d42b4b5348e5b5b", - "2f5ec385be84958919fb6901d72d52a32dff769da849437fc4a40db5413af81a", - "ed2ee0662d228e61ff748b33415c5dfe30d2cfc09ecf3fb92bddcbd5f2a9b51d", - "052bf25c6c9e9da2d5955d0747e6ffcb20c75be6ab8f5541fdae64c65fe8fc67", - "23703714ee9d7caf1d23f50b59e95b047801c62e464ca2796f501d2be36e74ad", - "e5b1250eb0545b84526cbcb6412b8d31e20402689da73a00bc0ec770af1e185c", - "b9e3f014953f8a6a722df4c720fa6319de298366465579c2f14a11e4aea2d66c", - "929155a2c62f6cbba52333f1cc243b45298042f2bcbe75949f3cebeb83112bf2", - "7bb40b769f71d4e8fd3dc80cfaaa47a30baf85997f57f94fbba689812bb65f20", - "41d81cad842bb8a8efc119a2970bd536d03cb41db96c462ff1f2f9374cfc13ed", - "f4f429b89472e38efc74d9b915e6617f3fc92351f9c1116f9bf84845d4b88756", - "1a6ae9a6faac81b2d98c2b2b259b279270659e94592630c7e668f802cc1f8fda", - "ab431ff098e86e9fc4dfcc46722474803b18ee74fbed7fb76bc4ea88acdb8bc0", - "b338277bb7ceb0deff6a448b4127f5e6060c503af812d82339dbca9da17ada0e", - "1c7efc0c937952136aa41f8608bfc0b66cdd56d610c026ebb5b5af31eb609734", - "2ddaccb47941800344f79acf5f1e2333d2171d2a4c5efededc39816ad4f19098", - "c6b5d03642c0be4580ec0a775d82607609c04864187ae89f529a3838cea9acaa", - "86fb14b96663dcc17b953e4c67a688732f682678b238966d907883ad8c1173f0", - "3cd847c280ecedf71a01cc2f086d0bcc2b0c4a0f191c063f8ec604a8498e08df", - "e93991d56a938895160a42ea5e36244150d9024b962089f4ab27da05ebf1ab96", - "902ad03e8ba121ba54ffb49e12a24f95e10b20c8617fc537509b5d681b0f502c", - "bbc58ad70890fea4832ebe5dce200576ed98a7b46d3b611daf01e2b05af2ba4c", - "30c4a981eb2a7d8e307c2985b0e7dec6ecd3981b03ad750e45475ea65216a811", - "61002b7b9c1cfda19b5365d395554d1993472927d79b517babf076639279e4de", - "39148dee1071d4885c96ee34f79d7d3fcf661ea3c70ec3e83e88a29e97cf8118", - "4ce3cc259412a8ea5976066eceaba3ce7f4a07471eb11aa522a84c699c4906e0", - "1aedaf9f81f17e5391f117e429376065332356a731d7649ae34717a3d634495a", - "8e54a11cf9fdba772e1e1d25351ce3681c73206aaac1c270aafdbd6ca71d6f63", - "4b9a24cfdc0e555dcb793ca3f8eee16a6490d600cd3d988d8f9592a22ce57c85", - "383c19e571720330637f4f6a55eff3ae3acdb1ea3788d3e72ede23fc82204139", - "2b340d77687039f029cbb76f0015c594caffb00f3646a2d1d68b3a8515eb9d27", - "682209123356d6b35abd508de6293da27a8b64acf852571f75b506f7150f522e", - "3c009a763acac621a6dfca4a8182b2e1c563b77f26a78a0c22dfb5201b066681", - "ab768866a54879c638d21fdddbda3dc775609cff4fc0c5d34821d5c7baa1535c", - "9865cfe8d28a94d4dd2966fb446cf781573f7f6800d27a828c09e41371f3b7fe", - "fd45b26e2fdcc10419651d7dcd0f6904ddd3c3530dbefea2ca89c68e23cbe3fa", - "ba562114d2eb14e52c0fbea3a85be9f5324ed5777e534ba719e3e0f5cd93d586", - "9bb2676a54683fe6eecd770c4a03f7d2ccfd7ebebee1778d708829262cdfe000", - "4d8602215a1b504d4b023686aac02aa41062d23d56c604c49cf60640d66508ca", - "1c8c19c41f93102d0f8565f187794a94f43473585f3f358825be4b56aa521b63", - "0ca34bf3aa5a2af5b8a4ca4b4e4d19c63296e47f7fff02beb2c6df0ea8619f43", - "141b5db756a775f4d29f6f00e955df84c6525d82d5ccbfdc99d2f4c97dece197", - "51dd206ed84b372c10597ac0b716f7104df43f728ae7203d83cbaf994a99e300", - "f8d30216546276b21e4e306ae477ba94595e9a0817a7fa46cceb354ac078d6e8", - "29808537e4631bac98ca137889cc6be13abdf61aa9e9a3cddecb1d98123f27cc", - "f869b0e6f71f61ed940efef0d20add3e6775ff73ffe40f84a9afea9f327077b8", - "10b70a6a3b931c05a4ed71ed8035e23bc25d51b3f10305afbe8ab8649450d16e", - "5bffa099d3546ff864df1fdb04fe4ac66c743fd751d62f189881ca338ea582a2", - "a3b71972c1d1ac45b02f9e7fc84ce110b45c3a8bb2aea05da5e9fd28bdb1f9e1", - "03b71a6c32d2889bd260302c4adc4fead00b1a5b432f9d2f5e2eb0ab5f9b24c1", - "9d43c1e2d8d501e0c45d90121f4d2e635edb06a06221fca62a9446c31fd6fcd1", - "41a35bb92f06e611285536d6146b86459d5addd85adb54735d5c1d38f9e3302f", - "64afd8c9f97401c03f3e47e67e33a73fe50fa2aa28d08b81f4e915cf4045cd45", - "c0d1bd5bf1d2ba5c271f6a519e1551aca9ee0e6d203ad3025819790ace6e963b", - "9d06dd61ceb85ffcc6f8f6aec438bfc4fca9315681b026fb6a79192313e692dd", - "09f7971bbaf811858db152df6fbd134e9f5b731fb124f3ad5fc7c28d08f089fd", - "ec7c6965b8e577e289da14fd41a1831a9cb7e9181bcd04ae42594a582b66c809", - "c908676d7a12d407de59e51de216c88bc8c01f71ec25beda63713f27ca549468", - "dc2a8828db8555110a15579d19987cbdfb157211dc8960a18d8811ba3ce4f96d", - "2f7409ad45e24e4398bc86c1973777da1c5f33a40380137701bfa50732548196", - "7f94412cb20cb6d2fad3071783641a8e0bae5d7d1208a3f47338339256e9c748", - "a3351a5aeb828ca2e63518301f3573975d2af0d6effc8d5e9257c5c0772940b3", - "105fcc2fe59eef74a3afa444c958e57f942fad3e4693860a7617b9a63ac0626a", - "539b136aa7b4546245f1b3c6f8c1ff5f0c6470cd9b81b92583ec96d54a3a9405", - "a531cfc6d6270042ec73c8550196bdf732e14748a2408e11a7583564c1426da0", - "8371f32b1f70b96501dd82e3338efa5fd0b85b1934ad02d3dc6cee9399058a8e", - "b02e1fe32dfe17c0c31f696363061a9bdbda95810d3614defcf96661f0b7c49d", - "80dc545b60bd99ffbcce5d3cfa1b4291518960f23d448751fef7d48dd3514c48", - "2263425b212aea75eb3a07646985871e026c84543a2ec2a9633df3b4e009e229", - "3c010cbfe4f6fb8d45042ee58e26a4787b2102d7b05df597916a4da2998d867f", - "36ee7163f05e2b7b52f6794773ddb3801c57e25f8a1ce49532be9f0ff5b29c69", - "105d011661c5a73e8a1e28eb41bb2291bd12c99f99d86e5595b2d9cea0d1642e", - "7a52b9e734fa54efb228859de3e0954bd018afab11590f2a16ed7b6ce32c44d2", - "0565134828cbdaa1e1281d26f40339fb12a0052329900f11c2a555775f45dc0e", - "0344e610532a8388e26643bf93ed3a48500e6504e9583fced8a2ea569069d661", - "7a18229781055c4a1085a1401d0e9250bc5192cd650a71b0e31d004d7e9e1fba", - "924f3859ed7a4195ad5bfe03784c6cf7c530318ce8310b8fa528cd2fdc18e28e", - "9cb43279a76e612aae022a2155ff9f44d78e5701ee18cbd6cee19b58ac1759ad", - "e2f0c678200852c3b05e138fdb2167a6f2f5068478b2ae26cc75532574806bc9", - "2a28c4ca71fef77ca162637044d07182e3ce763fe2fbad232e51d24460ea6eaf", - "4ad4dab9470c394ce005f30603734e75c1d285b857549c92b5a0408503aeca59", - "203f5a10f8e876c909da6c51198fe97b67329e325e59e6f12a6e1c2f369da2d4", - "f71426e1182d4c36180aef84432b2734b5397de23b89dd078c1ca13e7cde9b7c", - "5eaa3c852111bed5f3350626ab5d016999834c608cc2a1ffbe80283876aa22a3", - "737b9e68207c0d2f3c89d5bbb3c74a25261640ffd2625b4eb50de1a2fb98efc5", - "76ef4d0e86f3081e859383c885411200b75eebf7e5a9a20595989c5b8a5b2627", - "23fc7c3be09475f7ff9b4e56ba25b552bb093a12e2d6d30808bbe28049949a0b", - "945a4bfe4c9bd9ffa01d6d11ad80fe3b41484a9320c864f64eca35f743e4528f", - "9c8ffad02afc0ad39682415d52621dd0c42b2f51b2b67fb088053a15f6214376", - "88dfd1fd6bb6cf917359f3127ff047d6e91429e2b1b4448c7aff92b85dcd9f31", - "0580b3e459f13ca5604142c14bb97ea4750750b784ed40796f23cc8c155891bf", - "04ba484bc68e59b4dcd8f8fb4ea7895a0f2d922c1e2ed53cac428cf2221f8631", - "03a40941dd1b7a525533b515ac14b9c3216b4d8902f16a7ef0873c889ae5a7de", - "ee42e3a9940d5b9ad753244027cf9d2a26301d3613fee351852d3baabf86e45b", - "27e9d0fa949164c2ce0212300affd89f91925a5406bad11d2a4da5d37f1cc918", - "f7b6fa1bde00e4e48f64930ba8bdd2a9280a23ffab098951b1aa902b771a7e8e", - "bd9dae50acccffe0b8716a3035cec611f1b1d0867747660b32a058b1adee9a31", - "ec9030e6065d48ad37a98c7fc0bf5c328f238ba8f7f9c146a0c63e945e042356", - "1791a8682aeaccb28cd5dbff2a3c26f031b3ca5b464acc8920a7d9e775ecb58e", - "71531d7b8a17f1bef208f88b329efb988ceb978d59279dbc71abbebda35db43c", - "d79afe4b0e2decf62a082fd8602e66a58d633241efadfde565f682a0d59a841e", - "a70f7ac8804ff234776e84cb56901792ffd0444be94543f7bf46026e85a2b811", - "2329193adff3998e5ca605e78c1f283acd84e55ffa61081458ed942751cc7b92", - "83f1cb661fdad5e526d8cea62c44940bcd9ed8784b2429d593a9d410ff0fc21e", - "a15b5df0f7bbf89f0e42cff5f35d8e4fa705a7493967d15b28fd5466ba1e3602", - "242b3001d172fc9c6df8378dcffad44cd9e37b37829a738216eab3296042495d", - "7acc056afe3c6c9121af4daa0773fde893d64d6acc7b63e27674fce700575bcf", - "9b07f098612d512e83e353e9a7514e97fd99340f2a086817262297cf5dfb86c4", - "91b04928b2781df773f55b68e62330e09e3536362d84f79c12832ecef3321d44", - "0fb986181cb97c0a588920fde6f60ad9c52dbf05b80963ff3809fd3c31352c20", - "54052f40f7ffc538bcb99402b4489e1034d20e6672d47e39bab0659ab035c7a5", - "6462f83b94f505bed1a300824f0d611aeb1c4bdc6bcf63538650ae1687442f3e", - "713473a9930a555de127a6614a691df81f6466f90e192c38adcf74645e614d37", - "ad5e3702769162e6bc9fea3d1f81865c9b8bd1a6a714558f50c33e36b7479253", - "994e8cc983ac2d90cff0b7f4306eb250fd7bd87f19898c7ce7a70c6b7dea9486", - "e49a6f2c0cd4b530e50762fc12ddbfe95d00fcc4985837602dfb4250ec10a7ec", - "4b336ce70ccd0eed03c1e89177af8430372f689414576b9eaa445939887f4817", - "407f593e61a2d1db8a15ed6d9f6420f52bb7ac6a9f36e2e218b7d1de51e6586e", - "4136dacd2a7eab0777f4a1d759ecdb88bfc714551534ce541bc1845fa0e1ceda", - "84231b2dc85cd32ff716d8c987ef9052c29756505a915b1d1991f796c9bfccf8", - "e0c24923059137f2d42cdf5f34f14ed3cbaa18729cebc35f4e33985d2da638e6", - "1c631e0d1af1ae8728d1c06a009adedad82455273892f8fef89ff220d5cf1800", - "d1ec73082c70dd0d527ba1b28a149a82808b32805d3c644a3faa3b89a0b55945", - "f19a2117d0f9c8eb0f49769afc477ad7d1fb53ba6cebe635222a4df11ad28a1d", - "27233939f5f53c14db8b24207dcec3c496cc27a2366f242eb515e0ceeeafb89e", - "ae83f1d34f6d6d80ac0ce0d512ebb7d79cef2422fbb47751edb0a304f5e5a3e3", - "2f1c08593b04ac832ca7503c55c7a31def98b0eeaa773b489005709efb5446b3", - "7941d0d6e051f107e96375d5ebc5ccfa0c109ec6f8f1d8d0e080f917c7546b12", - "21d6540a07dc77cae4f1ca726721a7b85e1fbfc71c08bff0c9c622d30f099c06", - "5edd9a3b82bb977fb497572c2862a0a84a2e630f6e778d1fddf2930b565ceb85", - "a757c4b2e2630851735083120340a03eec7badbf550b2817fb41f95bf3d2d7f7", - "aca21f3cdce4c12c4f96b32f57f59161571d40dea6881ff3633c00b13f6e4f3a", - "8a171f322c4968c10992960d16254554cb7c338bbc45578417830f12382e0276", - "4a01253726baf67834fa2c15e8d8dd87035a2456782dc0a1579bb0c037ebc214", - "589286feb88f8afe5bab314220b04db79e3c4db61f08b3353072bde3762b0892", - "7c1721565b298f2e5be17a07fba1d7a563f321bb84c8e124ca1103d2675d1d16", - "a1be32596b399393d366b2a74dcc70f5344b9dbae0846ae6db8df405cc9f38bc", - "f0bebacd0af3749573a67d18ad664c94b692c137d7f4dd604bb1ef21f5e4d239", - "3b38459673c003ef869aaa64b4eceea8b8d1aa94b5c1c6c57ed75e25b1314c9c", - "a7bfd9668b366a668ab30681350e2772e09ec00c94563a505bcbcbf35d3606f9", - "8260376db0ad8115eb3b2f058626a044fdb9b1fc7cc87f205cf20f32549ba402", - "e674e5ee29e76759292867d468b4dea778989f25953fa884c5266f2c1ef2be69", - "1f15a57f3638923f902d5a3d76d328986763ee4eb134fc30ec5a6bab2a3bf983", - "92074fab57e7ccd38612e5a17609687ae7a5bc877cdf4862eb9b879099297f6e", - "edb415e605d6f2a23082f8c1ff5822052281d8d0c5ef162fc35cf57fc96be100", - "909a9fcffb0dafcff6ff417cb5786db6081a0d529c5216b96a604a9b7960abff", - "16cda10c389c9d8e496a0c141bc4646e004fb534cb49fa61b9228d8570d9e8ba", - "7093430180ec32293fc67d54bac69e09e5018c27d06dff348e47425c8c81deed", - "5d285688eb572eb83ea84daef5e2a81867cd3c1688d318a6038568915eb3020c", - "50d463135c543b567eef8f71ed63b13712328ec09147cc4d4351da1ce5ebd2c3", - "7d379a3c3344ddb50a7432e1b55818aae892845845ef4768c829df75d6467201", - "f10e7cfed89f06b47be07e7b2b58870f256fa36055e26e0db77a03661c0673ff", - "961000715f4ea647b08184ad08f6cc157e809c45cffac04a9ddef6c074be5171", - "6afe5e9c676feee002864e9c000e8efcfc30022f0e9150a24163f587c2d12e9a", - "c5194ff56b89e30686f7419de6ca9359c45ea8dde95adbc7a31f8e763405df8f", - "154a591bec030c97042051880c8b4b3c6326109e54930781ecf48613cd76cc62", - "7bff2c44a57712aa0ec7cc2ce70996481a73ba6d4ff745ba1ba1edb0ec311285", - "a781315a85d0b12e1f53c13cce4d1a0501a3d5bf751d024575200100969eac25", - "25668b63177f607efb82df41d693fc277ebd261fed4efbb8fe6121bf5ec721d6", - "3704d33c721a1c4de18be6d4af5d809eb276f0edc855fb1f72bd75fed7d1527b", - "3e8b42b3dd09c60463e50a56d573b1db67a751d718f1f78757348712675db287", - "15d49bbc4370deccdc3a6932cb8fb90cc6cb143755e3e3de067a19e3b980d990", - "4c8d4782810e1751bdefdb182b7e565d5d169f47bb5dbedc19e320c77686658b", - "33c52f806002c561e4fc9814a3060d8c1f6fa006f93bd114010cb8491b1b1098", - "319b5d8ceb2ee0e067b156f33647817372c94f93c4aee97a06410f997708cb82", - "46c79cb8a8ef3eaac4ebbce063e654d54ef87b64ce0a1295ad928d51d05efa74", - "1bc221f3fc31d0a7ec57f2cc2a1b625005c9b5ff5062dbd3eed846d160877756", - "0e14b844d498edf9239229a1c790252f174d023eebd921902b61d2dd37055a18", - "40e260ec652af02d86222e9a08bb9df05ccf62a043e0e68cd3cc3343edd37083", - "c365ea9680c4572de670140366ea89d01a60d24d6ab05b225a38c7d633c98577", - "0cf0bd8f496f171a8ac0656549c28babc14ad963189129a46315ef33a6235635", - "af9494967f4715119dfec3bf1b3eb208bbfdafee3da21c10f7d94211f97c7634", - "f08eaf46f459f30b681062f414d40d4f18b358d41e4e02b6d0fb57bcacd3f4d9", - "78f0b1c492a8163eab97d84ab01c95b6d12898691576f6c51cdfd4242447098d", - "d141cd10c3386cc175beea0db988ec13489fdce338ba7b61f514e7cf9db8eca2", - "810ed96445b27c732c08eff75edb8d55099fcda8b32cf90a603e39d7bc2b538e", - "1ba491d5e4d2af46cb175813f6ab41b2900502fe5bb292b45039525ec6b02ceb", - "9f9f6faa0c0780f0d25d3de56d8ed45e8fb7ca6694acec47a1adef33b5170a8d", - "6ac85ad7c50e7573a76ef9b93b162fca8709646537e6971ae30076ff979631e5", - "89925b79298939cf9bc2bc6c3966be9697f7749a6ce54f0305de515dde7d91cf", - "8b34a8c8fd9d41299f23e264ce80ef9fec36bc5f8bdd1f7c2f774f6edd921854", - "8d07241a1878e71b5b1443ceced581921565d7d9da5f6c2cd8d2c559f5b61597", - "3860a413ca0a92bb510f2030f9b949d1f91e612a31eb89e026312d34fdb04308", - "f1cece47485bacdc422470fabfdfc399e8248df2748ae24c4e79a2e3d8b92f6d", - "57d2219fb23ca0eb79ca15462924551958d53e7865b6bb1781d68a6292ae4d14", - "d5118484ac773f32f243ccee23ea4812c240dceb32914f901d9d0687c9c599a4", - "c4207a44307745ed5faa9bcebcfef97bfc6a07ccdf9ed76779a0942a849028b7", - "1f3ebd832f8ba8936e040b4b6bee48abb0fb546d51793a8f23d3270bd8c1e2e0", - "5a1baaeb6a206cb2b058d6716e4933e80a68d5c37c7b0b999c2fb432fcf3ba0a", - "a5603d7a7c48f6b7bab719a13eb667601dad104403c066ead707ddb1e11abeb1", - "191364e77cb4ea1f831df3f47ee7ba28728b3ec50b15129303754f1772040aa1", - "d44dbb31c01157d7823c5f45dc1197d2069b61badf091613c56cc544bb13a7a1", - "b3c9358a511b636ebf77805ef53474b95a40cc890c9da43316e9205d613baf80", - "7386e95e653569389fb0ae7985a5896f0b79f853a1b29c25376f27e30e62119d", - "324fd74740253e0c90b9bbececc347b1a64587afea60fe77c231f9999b47257a", - "0646ddec0a1001fc9f546e400a9a483bceae8ec37dacab11c8d549d9dd236cf0", - "c372f7881487a23c9fe3eb7dd176caa2a2b50c291a2af9bb6c0d0a27d359dc22", - "03220193e7853c4fe91d0477bd994244fa54758920b41f0b89b295f0dfd4469a", - "c3ef4c3438847a3447e833108d7cb45308ce335b6103501cd9fbd00d2ab0eb6a", - "a11cf3201a819fe47893a39d12e3c73a035490fd8df8c3793bc75d86960d431f", - "3dd2bd9f06bf91f619f84b0868544122e88bccdc3ef45ff3feefeea9567de5ce", - "c524c54ffe382d3e97c04283d3db91149bdbe012d5ee71ac64f1aa513e3f690a", - "93eaa4791d6ecedf645105b657d3a6973d184472252679666f9a1287ef6b408e", - "f7732c3103a2261dbce8d1693c00a3d195c6645a7664dcd6d2c1e2020eea8547", - "41f75263da3ec1e8967d5c8c34a91759eb4db64680568dfd579d6dae77cb4513", - "749b6fb78c4ed4828f083c2a6481b696e4b8cdf3aeeb34a67c4c9070a70d662b", - "4300968452bced59ac346b3acd4686fc4257209c46dda7806d78376d62ff781b", - "002acfd1c2ff63224973488e8d9885ad8fe07939f61b37c605767513d6826382", - "72b9ee4f2c170332785623312966db3e826573c575f48dcb94518e75e665f61a", - "a5aa92231eb8c47f5a9c46d8556038195ae4eadacbe9ef2c26c1ffc8e7e5316b", - "274b77e669b582ab830a39d4113ddccd42f9d4407888f744fba95ef560d8a269", - "785b18daa9cb5eb2db7acbfc5ac711ff88b2f15df784fb8d18735bce41dff51f", - "b17a82390d24df30c29d77456341391c04a91867c1c117e0a6e5e8d2987c30a3", - "8a06fd76a440e4d0137eae7f1632c1dcb53ac4ff24a37f44f00dc190da3d9138", - "c8e1cbd7db08e2316eb45c9e7436db1db5e3fd7256dd2a338f2f2e5eeb1badf5", - "4bbd1dd07eacc7b989775a197ef87356d107763382ecc86e526cf9342ceb43f8", - "3abb5aec58816be922fb975a3df94ecbca6c0771de639844bd9e4ec884065767", - "a3db1abb5c1aca92de8dd6cb8e41312ef939b2544f31daf2f2fe60dda8cfebb6", - "92b4f44a8f8bc2dc64234f14f75a4de94eac934192693befb70624438bffa7e5", - "6500c7b7adde7bbacc9cc0d547b58608de4527110dcbba5a6a60a4e3b80efa9b", - "e39df0f76217307a0e1d951d2eeae59526e0c63d43c4bac09268b266ebba1905", - "a0aa76e9886c8c3ea1094b2c9ee5d3fc27270c73760daded85e3a5bebba5d985", - "2cbaf49ec80358da2e7b3fe227fa8803a4806b12b9ee385ae5fb15acb222607a", - "2d1436642de006db3995e05e89528a3b6f762d2784e861672be845d0aadc0d05", - "1b44796cd479721fbf0b3ff2d2244c2fdc7b77be1c3f7bd6b60ad10445c55aed", - "27c877247be2146213c79587b05fda29174a717d31e999b69042cf690e1d6d3a", - "9c20ae6b1526743f613c179fb56c52c0f8f9a035c622709fb362a4c24d69b3b5", - "52b65a213fd6cd1578ff9d51ef913b9f7d9ea3862c1b04147f9cd2c9c6a39731", - "e4609d880e708dfe56efe40cb54a4353096f1d5135c8da40ebaf23567029583c", - "0c27bd899e39b30158f4ca2f3661aebcc6673700b888adfb01bac627bf92a64a", - "df709a687c2e01d1ab46535084cda920d5fd930d7c92c0c0aac074f617713e73", - "84d0dd55fa80badd4b52651f41047fa79b2d74cb16319adaf02ec6b90b8c7ad2", - "9f07204b75ada243c2a342ca1380ea99e75cef96531d930d5ec7b0e623dc4a4d", - "3ad91932aa2501dcd643e3bd2ff665ccdc9797648e6e84ea17b3afb7b33e2b9f", - "2ddb6344a1e0da7d3964db828895500ca31ee25063d0aea126327e2fd11ab6a9", - "1a0fb573f7a8cb71a5fd37c3f20699fb49565eb53a724400609058cbcb407650", - "7ca9e26ed2c43ca7214a4ae815deea1d590413a58553c61bb0193f26e5599b83", - "5a9465fa7ce7825cfdd728cbf6a797907a6e17a62a244fbde788845e91fbfddc", - "a25f3f26a9e25b074a5656fd275d47ce249aa844e5080552a5df0551b7329721", - "1a50662443221a4774882137323b9d2a37ec27c0c6334059d412a9c9b1c980a2", - "0e195c885fdd1f5185c90724e00ec6b7c3c542d01cbe208f33d6f2ef25da5d48", - "8d41767cf2166d155e4c85270445e717ca249e05b8e3e0e255639b33f9f665ab", - "fe203c30aeb5392ea037387721d7e6e6bc4798954bf42534b08e90f6da7fbf25", - "9b04d3f868c1f3362da247057c17ca6ced8d5269720233e586c74f413315c706", - "4d6a6876abbf4d7de471a94d4435e7074e0202454ebe10a34dec0e6beabe4e54", - "c55878d8d553ffa103964720536ce11dc808bef11a54cdcdaa6a286abe9aa101", - "350a3f0e6e70119eb768a1af7838b67dfe3fadda4c5814f3bed82d207972aeab", - "6f19e315c5a5f695da54f9751e1e0843b6d808136b83ad72e91573a0122d79de", - "4adbdeb60eaadc1802c3749629d03c860149c57594001f6a3836d6dd98c91a0e", - "99140a5908d452507064fc6320cbc8bfe7413260d6a63e293967b1e5f4bf526f", - "033bbc3a0794e7f945ee7bb8080ea2cc29f05c3d81604cd40061383751f5c8c4", - "4cc26619400fe4d8c3ae6ad198612cbb4614ec818357b2eb81ceb86c64b4230c", - "37c869178ef19543b4f496777d4df279f31d6ef67dab4cef41776ef5bf9663d6", - "9f847474f719ef6fedb0c8ee51387bc6ef7b4ef26f28598fc4060ae05f26b1b9", - "348b4a329550e021ee91e9a63bd71958f6297b394116626e8def8b5567274937", - "be3a0089ed543d3164ecf6641dae6a22005f46611a7f3c0e0be930047c4863d7", - "926549a7809d692dedf6b4081353eed544124374ac80e307e3a47090f1169665", - "e885b3ceb40d2f29a40c80d2b765d0af6d1892bb367402de06131aaea182890f", - "d2b5f49de009a7b47b0e91d427fa21b0eaa50ee73cabb2656502ed548c2877c6", - "8bdd1e05552fb9477b72a138db628b29dc806ac33a8ed74c01fb1f67df7bded9", - "1f1e216c4174d9789c5adf5d50206199149d74fa2548d7b233ab9e54b8d43ad8", - "3919ff60d646fdcf5c8cc4107774ec310a1a82a13b29facfdc05aa8fa1c38113", - "9c55b2d13242afb99c1d15f664b34806a512a53edf5170de541cbcf83391d0ab", - "94b34db6c3dfe19621cc761ba4182557cf950358b0a1de3c6f1512010a4828c4", - "a521a59b689814ec588a61c6931e45c7e903c49e7e5136e791d9d171319a0cbf", - "92b812aa4e11743c44b714a31ab8de3742b47285323b5c2ed3acb8a7ec84b829", - "57cefa093f9ecaa6f88fd84555ad50db9ae46e0451cb4c963b954b5373997e87", - "524388ae10fad5bf58dac86a4c028adfc75dbaa379167f29df927074349712c4", - "f9721f7ec1196b2d1f20dc1d9ab8b49c2b0b4ba9c25c59bfab92a0451ebdeef2", - "744d445f96ea715259302f4a9e5642221f27576bf30431080a79f20e9563dc0a", - "ea7c4c017267ff6b1ae72a89a8f049eef64b2d5c008794159eaa9b1f77bdf5b3", - "8332103a632386d7fae0f27934a8f3d90b6aee4eefde32636effea48eab59d57", - "21fa0c1f635f069928ef1dfa01fa3ee118bbac19db56459abad957c1562d7f34", - "e65384a65d2102c1d2227c26dd893abac11bf6510abdcb0e3da4fe53a010d00e", - "290bec97389197d0b61e9603ae45b19bbc31c699d568cf474e2d7109bc2492ce", - "67d553dede6337a8fa679ca1b7fdf5add83c859af71f75d4ddbd2b15e91022ec", - "6dd54668d6606cdf4f3c6277c905115916875cd1761fc0d6d4553589d14af64c", - "5797af1f914bf689d1220c13aad93751361515dab798bc24646ebdc57e32fe16", - "674eff0d4aa2c79e4b344a89647a3eae8f82bbc1c5880971a41197851d28f5ce", - "38c10e7dbc76b3ce23b639b88791ae0eb5747931c1ba1c2824f7f6726aa207db", - "04cb1d3aecd3eebfbbd7bcc4302289a03905cf2c19981549daafbba818b77251", - "773f9cbc64e91ce9811f71f1915eee419c0de95b4b2b1ff56bb668b52777e9ac", - "7fad69773057a511d5b971f7ac891c2383ef95fdcce8f1bceb27dbc53012c96f", - "de401ea0ecddac640b7af274e9d1c6cfffbb732ed20addb07a71a5a7c1bfd56c", - "a8db653c9d0451895fe34fc18c38c15d28a35a7585a255a9ab3335333a95150e", - "a56b74970334eb95295364798c1f0bf36915ba1356ad13bba2c29f8f62ea14b4", - "ec8e7ebc4d45e26affee6ab826c4922b2d22c5f165d00f8ba21b75057eec8ffb", - "0f51ac4b923cbb4e47528ebffceca61595d547aa26978a45c65be22e88351010", - "e345b38d936a58261a81535631de9f3b939e5d600a5698aa912583930e02ee1c", - "1c4d8584f695f860f937bb413b3daf191f115d514d0cc28f5b8fb725201f5d63", - "48c7859b2de234b7d9b9089e4d8ef87a9aaa9e24d450c46881916d486e10d7a2", - "57e2766ecbcb75d6b0db89dfcc7a2c08e573c7cf6306ff8ba2b307145ac7e66e", - "2e7e9cd0b644f534924c26db9adebf4dc7dc5a538f97eb6d503b2ac85c4d8225", - "2f0df2dc7a5379abdd9ac52144f366fa65de21c403cd35d1ba3f1c576cafcd65", - "40cb51c890bcc6230e8a593a08ad6612c4e31a67aa47a70fd2566c5f07e4ce34", - "38c7090e7f6dd4890bf23cc5088d1325c53c4cb5faa657d673bd289858116a04", - "ef8c6243229aa71faa89b8b4ad7d450384b20a1f2d55a87b616424a0b0c0a200", - "063155dde5ca678b876a87b80ff6867e26fd5b703fce746937e92070da186300", - "a014b26858c75853e728aed94c891c761ad1aecc02fab3f4c6d444a05b193dcf", - "a57bd9b261a1b9a07cd462365e54fa952e998e435d9a0cbfff84b52378896b1d", - "c6f1a9ca0d8808907d7bc1cf4cef18d72380e3685d274a308023fa2bec12027d", - "f9818145bf74e1f3c1d2ff24a92d81130912a60449a57868322636a720c97514", - "82638002d096232f94851fed0b4c96f871ae96cc65a959eabe18a7fb23f5396a", - "f1a8cbe156d704c17b6573db5ddf7b9eae223f52220ab40e2854551dea89648b", - "90534f575004dddbe75e3c9ae7df0d2e0650005497b07658b82f9487c6c6325a", - "fad77405675ffd2e484a74b7061d696a2a30b55022dacfdbb93c7412794e5e60", - "3354d52c33fce5079162ea0aee6a013deb0e55b0015f45f59355fba7f8166268", - "e4088613a3c1c6a18366f04ceb71246ad32c452e6123b7bf49be8de07a12aa5b", - "5bcdd644f7d0c30fa7778882c56d3a628886daab8468ed4fff4cf535302abf28", - "dda79eed6509b6339ef74167293ea0c829113909c5f695543532bfa8d469bb57", - "0d4faf950eb0120e52a1ecf7d35def426b72dab81a0dd877d279a8858a413254", - "54491d1e9c01f2ab7e0a217b76903fece95c006b871c006cdd60fbe6a3e53c85", - "a6927ea277e1eefdbf0669a123e720bd6967b14b87ad12543d660004c69a07aa", - "28f5ad23ee3e9c353c24465d87d5604020d35d2387c1fad5d633c9526003a1ee", - "518998c0f934d580bbc8991f804a342ed30296fa89fe44d9a2aae8298654708a", - "3200272dc2acdbdf99d7eeba8318eb37b3f9c9627a868addf4a9c900bb73717e", - "31c1c59b8e3e4b4cb3b4dd97afb4222225476b4587955ef6fb0c228f6e270597", - "56070e1c608cf311ee0135038f0539b730b7a0830633c16647a4ec142b4f75e5", - "d06c817d9768ae2250d659fd42aca2dba407058df30b1065ba977ecea7679bac", - "fdfc776e12803ef83c53ae828a8b685d20164490702b63a9eaa095631e83a8de", - "d692e2b0c4f6caa705a2816798611838fc60cd17dbc7663e226cfc3f5f262b5b", - "9c0ebafd34e7538941e13b82208998a0eea5f3d7333264f1bbe6803f81ffb508", - "067e0ef97ca8531147d408d0d1e74fa507d65671295da0e1832f1b97811a3998", - "f3fc0e9d1005345db7ae953221d39c59955eb943001515f2f5066bc7e103d89a", - "ed577fb9ac9731322be64c009313ac8be6b360d0a93f063a4b8629cf9543dafa", - "7f2caf3403f079f44482f2a9a7803cfe1f6910a9baeff7bc5a4ded93e6eafaf8", - "43c2869e356656a438b691f0d2684bcbe5172622216ab2796b35cd55e49fad12", - "9b12cd9d87effa9727540a27ac70765a5ac13b239344c7f2de7d1fd1086acbb1", - "d82208f4c388dfedfa8e4aea37905c2d0acff911d97e1c5be82c1653084fc8b6", - "f4878f52ee93c6cc5075a00c1e2dbb7605fd99fefb338fba231cb6cddfb7ab0e", - "a82f8414ad8608ebfe705ff1555ef459ddeacc3b3ae44be2a1b9fc2bf2824c32", - "2b591bda2fae36fa31e349e1522eed8d2a4ed0df2c4d67a38be3366a2ad3c9c6", - "a5573503981c2de4132e721454272d446c3d4b8451c0c57251c18f912c6ab83f", - "c4f9555f29d585faf6611d0a104d712861c4c849e5f92ce1e553dc6c55bb06f9", - "3143fde3deb816deaf410226fb50a042c611dd21fbe3d44ca5e0869927be054a", - "427cf14c65035da4e0db76d6b883249bd9eb592c5d0bb5f2873df77a513621e2", - "ba700b675dda31b62570b243df43a11e2791f81b1a992fe9c5241b3b109a301b", - "a8163f98ea90b00a9f26d6daf7fb752ee3a5d893453be5dc071a610bb91fc8dc", - "d5cdbb7f4366406ef4a94671501b22aadee8e4194f658f2b359a1f245c946915", - "7592da6d6060ddd79ff3701906fbe570529a90a43bcf66b6c7a0336d28536c54", - "70fc146c04fa8d68fe900d8c43932bdbb5830e1b282f19bd35cf1c32c0be0fe3", - "326621218b1453dfbb60ab6cacbb2a4efd93b0541d48c75102a5238b61fcf20a", - "84b3a16f29f486975cab24bed796e290c24f8e966d12f07000374309e85a2be3", - "401c6be0ad1041e8ff0363590ce5380890555f36e91364cfce137a551ccd3489", - "94c3851e68981d45e64918f4d61ee528f2bbb077c00af62b743937499c376cc7", - "840a55c69d82995d1fb1469ccb05b9464f957190c7c66937408384f66ffc8cd0", - "a769c73ed4142632b157eb186d45a0666b75d1c96c5f698465f24c47149f5d70", - "94c2ed8c7f0e5a7a5acf1fd0f6044dcfed8057fea5ee113d28bf12b24e06b767", - "b6d4afb8b1c535231546a62c9ea5a2cf70be9cdebdb503afa85e28dadbb44a8c", - "42d2eaad8129b000a9321cea1d86aafaa7e5d643c5d2f321e3cd1d460d6b3351", - "419801fe4bc13a22e5f264e6de696bfd8fcf95e9cc1f37cca506b7ec4347c6aa", - "0a175f1166f6a612d4adc8a6479a4c17c757c41c7669cd23899415a2c73370ff", - "bee614da17317995ef95a9c2aa06d36b88867310d777688052c7f004ca674280", - "dbfaf21018e6c96393bc1f9fe64dc7341de97c4469114c7e8817f82f5a466492", - "b880151ff298f4ef2f80e9f61779c37c41eb0a42fec681a0cba3c43bdbcdf1ca", - "06c2efeafc9fec8aa6a43ae6d5ba3713b7a094ef9cafc43470167d56f4e79867", - "259f5a8074eaf1167cc41156e330cab49f72c5fa6879fdb9def682220e924340", - "4dd6c78f2a5a930936c45581b5ea2e17dda0f5fe07fa852fc4c14fd95792f96d", - "f2080913c19aafba5660624fc19f493a6ab9092c310710b8e37d2683141fe9d1", - "be868477e6c36ed0a6afcf41c9a4d0b78ca6b41371380413452c6bfa80c7ef3c", - "928f439cbabcffdc5f9b7ad6d61712377b7b82baec76c4988cefdaa60ed52866", - "1b48ce0d1e4364c86adbd44a90672cbe3f54f82548d88fe1e01a7ffe2d7a11e4", - "0a46804959611454c6be89265cd10e6ae1345bd71b4120c1a7f6464e7ae465a7", - "b5e4d8542191519ee5c8b28f92d18c4e1aacd78b5ccd989f388f574ed40e6739", - "6fd411de060dbb424758ae566308d61c1fea956d11d71f71e536f009fe545d23", - "d2fa863dbb8db4bb88cbbb2d85e3edfc6baf837980a3cda621f0b707184a7710", - "eec96ffbcf0ae36ad89049cdffb58f21080e18a1383cbd5f97a188bed2fb7266", - "6f9c2ba31b01b63209cbe7579ee760fbbc682446d9d4b5833e39e6d0faf2e15d", - "f55d70e3ece95f1f2ece6c3f69c00f015ea5d4067461078da6b2b187d2a337c7", - "9b18e84761102bbc389fc63a26c304c11dd00f58c3ac098d72de8523565486f7", - "22ebb88e238bf49d7c5e7d0b7609ba19725e8cea7f03f47f7dc8a2061439edd5", - "326df9354e07247b785572947cbd84485f3da7d31877b55fd0837df4804699a3", - "c99e9f3cae8cacc9fb2dbca51dcb485cb11267455302c1cad3984b586d67309e", - "569dbde3ff71135ba8a64dc7befac4ef1057b591115a7d7caaa1a44ec97a0372", - "007778474c78a9b738d5daeac1465c8caf86a203d2247bb088223c74721ee051", - "b80750ccf69934b6c75efac1744de26c591e850351baac69daa70d6866dfa038", - "185f36eb21232d2b4ba40bf79de8a58bca768d334b71818ce140030ed8f137cd", - "deb5efc7fddc36dfec6e01e6ec96e21050b0d5b5616515a9a06c69e851d23bda", - "3c0ff264ae37e1672bc0b620e4cc3cb8bca93b0cf4f55e360ad14644ea3bb547", - "30a79e48fd4452ab7d55a054cad479a6c87d6aaca40876362313222ca7eca3ce", - "c2d6136ebef8bd82f661dbba58b9aae8bdbcfaf1af8eacd8418f9ad5b3cc30ac", - "2a9af4a59a98b71c41e548150aab9bef551b9bf44c312581096e95ef5e865cbc", - "772696498fbad4f5f6d95f6c7289e043588658362431cb4b7394a9b438e7a8cd", - "ed99dfd62954c9bc703f81e0f0d57b605726ded17821b453426d8d2bea695654", - "7a7023d2b0ba30daf2db6f74aa5a1af858addb65e843730eb88c984db1d7586e", - "98d1b8e8da30fec85a8fb79353e4ebaeab8660deb69f4db452a13d435976a995", - "3ebee3e21a0397bfd820f7525a5d624dea5f505191f9ddb3e65f9e0391984534", - "82d7f87dda2e35df51ed023eb0b4681b4a9658bfd9ac6717d6a3adcd119fb066", - "e46191dc9d1ae772a5d1cc9c5ea706d744e851a2abe6d82cdd50d36c5fb91818", - "6e36d5b47a404e83e674957ea637bf495cb4ec648dc375bbea9cbb1f0cfc0d4e", - "ea8509f6149a0d206c705113015de4ad9cbedfca42e1bd0facd066d6bfa4c9ea", - "2d236fcf226c0f9ee68819e6017ff4ec64aadda3a32ef0691471e302a7ae3333", - "0bde72490b8cc23a8104b92c15f99034a07153b7cec199a39301b489a659512b", - "6b89a6cc03aa5dd89cdbe09df93244039d1c2d6c16e7e961fb01e71eeac28fb7", - "10b57307d0d27a7f8e68d5dae0231831ada48985082de60ad9b525c7a655d274", - "2b7903458c2cabe331416bdebbf8366a9907a0e6268f6a94191245cf58c8b1e8", - "b60bf0fa4db14659216ed72647dac14ee7d41c09fb18fa73eeb5c7f24ba8919b", - "0961cb33b509b3dfa4454879506fd909da57a50ceb15132122901439e0b550f7", - "413d68ba33e18599f6aed10ef3081c63a1a44f48b0ead76aca7facd3be3a3841", - "cc524406bb6b5c3422375de3a9e515ac22805bcfea8808aa9c5ac0a807571117", - "a5247ef6cd64b96aea2a28f15f207bf8fe5c11b2ae11c75771a2a07f12f7c107", - "106c4cfb4685fff5dd2063589be2edf2f43c40cb731f324759fba8051302b2e9", - "59919d213f142be97aedba49ffbeee9de17ad44edec25405108b082fdcbe5ff7", - "1a3b31c75ac9f059f4cc1f198663e4fe8203df64dbcd9dbc4f0eb17fa028070a", - "3805414ad08c4b83e40fe00b952021f1f1dab0ebf3d98ddc21b88c6ccc1350ad", - "806befb985a3a5fbeb1405fef08242350dda766cbe4fa02c73f3758a137eb2c7", - "c67c265ddc6c15e75bf4a89632e170946bd00702d1840a191edf3d29257b599a", - "1d6b78c43cc07930a169076074b3f7f1a6c7670039212f065c134017c25f75f9", - "42e60f71c679af1813502c59aebedc691ac4465d8d904230864348d68984d5e9", - "dc814b8b83eb0aa4d76f2610c9ec4a28fefb76149dcd015def420e4f1c140b02", - "727be8714f3cd82d47e7d1c4d9a52ff88ebd52ce58b014f85875e306aa25dde0", - "80f7dc72028f6ffefc96e7b7cbc4bc96344144abc11a8a5c29ca6b38ff5d48df", - "1f8c26759326a9843ff18f4749567c54bf443d9c4092c589b31956b97c8f65f5", - "2098415857625cff4c4a24d0fdc0534b1ca42ac0cf7221396985394a1e8c30ee", - "fae4d788c085a9e58799e71429ca332d87914903bc99b24381c0d985fed3a7cc", - "edaa3a5d76242b2813e01d2faf97a131683ede14b84445727941af2e417dec29", - "4f53fb2d40799ddf95acc1c53755d6b0135e16d5d24f0126bb06e0a8fb3c43c8", - "c599f6aac2bcec10979c8ffc2048d3ef676191cc56468093b37efc2e374cfed4", - "c48cda8d937ccb6ca8f370e46d0c60ad913b066899e16d227f9b84078e1b8a1e", - "daaa6eb3857fb0e970330bec58e31aa5025d99f829a751e14266cbbce35ba1ea", - "edd4833cd028c07cfb1d41ce54c55373f7283f6cbd387270d6c629e2fc5524f0", - "a58900f88a7b6417bdf5aee90aee66c2aa7d2b278d59b27714e5e82779ffb822", - "4bf209242911f525962d553fc97d997dfe2eb25b194f93edf0de3c54201dc43a", - "fc24093ff939239601a9da1990b3568380485a60d35e9c2df3d55e813eabfcab", - "50f5d40e232298d1475919149a3a7587e4c8b049056f3e43880c8bfd51569290", - "6e838b65fbc06793219fe07c2a1ac11a6ab8d43b5dcaf6140a23cc940cb4236a", - "d99a0388533f42e495674a4305ea3c45b5175ed060c165b00ba23613e1418dfd", - "bf83228cf01c7f1fe1be7e7c69488b0fa9d37c64a41051713bae457073c6732e", - "62d9970df90a76196a8d7d0a3000e8e4f1706ca6dfa2673c81edf746169a871c", - "347ab30f2b208f5a0798bdb2f27d28a6dde778657a361f3e82a356a01682dcc5", - "ef4b430a81640a00173b7b8c87972b79b09c331d26181aab54d291bce3709f68", - "50646916c3a6f3c990d8ce2ab35821eaf4fa02395b2922834f7f93f90c14ad1b", - "91925cca00a40a5e7060e3977110122b5667d5370902a69dce7d560a72486788", - "d7990c1f0388fd7c58336342083256ff26e16f7d142eeb21a851580caa1feddd", - "b8b08ae51b93ffa920d5ef776c4764c1b7a5b65aed0ced11cbbf5f8b0f411cf8", - "a40d04364ba5aa30c3dd0bb37422d5c3e7d2508c41582f848db9c2f0bffd6d02", - "d42c128c6007355bc6be755724ba22460e5eb793297dd55fffc1faa3ba9f9694", - "ab96ba2f3cb0f96f7bdead3fd7e607f87cfc352eb888fbc9d03268546bd0291a", - "fb19e8524a57b4fd5ed2c609dcdcc577462f6d3558aaca83778da448f44d7836", - "222028d6b4844eed20f8945a83395c36e818f2cd0ff62a252044cdc4079b32cb", - "580f82b1a7c45834438ecce3ebcba19ca501349e4e4521c01b32e957beae1ce4", - "f79d4f2d9760ecc9e03bf34bc4291d34fd2118ab055524ac750850c4b30ee82f", - "90c20bf05b6eccb1f310e4f1e414c9c04107a2f83a8cef289df075ea2722ac57", - "8409b1ae49df9395db74e6ab5fe80acbf7c0b134260e77c60f07340bf0f91748", - "58d68cbbf326416c2b21d75569802ee8604f8852d02f146506c01621660cffa5", - "4bf1016820c26f8431db03dfd1c533b97982fb686fe00e4834fb5171f0b09fdf", - "5ebf16fe0649535753f088de6a3699082119cfb106024c6863d2be7110b41ca5", - "b227a0c426c85cb1a862936b0afac059a5298dc53d51dc634b8d9c245a515142", - "031d20ad08c94ea3d9eb9e1759ff0f527edfe0f403a1e50a2434333a9c66290b", - "e296d29fe71715f6559ba2c417c4105ace0cc5e6be12583daec877687c98d14e", - "6914cac3430be297e948b8c3c3fc89f1daabe61f5fc90ff2d78c28b1dd71157a", - "c1c570545909904e1ed4b0ad704af2f128458ac67d59862dd9a8ff78071531ad", - "255eb3907ff44b0bbc6769ea55ca839266a2fd5a8e52fa37439249dc4a0602c8", - "968da706d9b3402a15b73b8b13b0613eb0a03a00a197dd55b55a386e4bdacb07", - "0e0877f470f9a291b38c757e65c1bc84dfdd3e1b9a803ede750193957f110242", - "ee5ef3d4f74643e5c7b9ee1d81888672b556bec12b3abbf1150c136fe4640cf1", - "2ab0ae6c8554177c13f3b30320f439da039448a536526e3e9447825c9153629e", - "d9f232290d82b67e916babec7901bbc984c27d6f0502561cf07c53f82950025f", - "e700dac5145fcdab8c7d5802d037afc62e39799d60ca734055f22569282e39ce", - "30dcfbd7d9b26a67550ea52d54fa2eff0d8eba0f8d6b490723ad2a88a2f15b72", - "7326590a6117abb2a009f8650b3e5bb7ba6afff6add6b6c9fc5bab7e49b8a25c", - "db32b36a1de4ce86704ac8ead6135243a028dd6185ad09c2ae4e6eda8f2164e2", - "6c58986fe3c86fb168d2fee7c871584d37d74f5082e8842c237086be8e8bf0ec", - "5d6552f141a350337d3d4b7014bcca8336a253b8469140c511054547620df4a1", - "7e40f7ae04821ea92dc07d6a21afcbb583ad468442cfd4792cd73306c038c2c7", - "8533d89e2927e4a318b87756cfaa9b38010125e34bc62413b8135576af655a5c", - "a7b61e89f5cdcda1a28439f8c27a18ff5bd01025850d0a21168c37e783d21059", - "cd2d0a9309380f0f63775cb914e95bc96b8d39ec580736614a9e4ce36cfffe68", - "77cc9c5a77f8c6a94dffca74e072394e285cd484bda628303de9682a5f5fd899", - "500a79b2e1fec306b2fcfaa5192aa88053a9bd6d14d094f6afda1550b1aef3b7", - "2086ce64b54c578cdb2c2f8eb08cb115498c1fb1e5d5e4cf8832249beb71b2f4", - "7330f418373e35b0002f9ad0c71f75b2b91fcf699ade0bafa065972df56f32de", - "9980430f176700e1541c3c6421839baa7bad6d004a3817f9625f0d0d7ed6fb24", - "95a09cad828a6a9963050d4bb41bcc6cfb6d5aef9280c69a48e34ff6904c3069", - "a84bfd76bc1e552e90890e1b2478b524348976dfd334ea3bd6a541b127937f21", - "db902b87408cc702ba6ff664d1d3e2a4c9f717887db67ac3d7e5a65845820a23", - "383c4b93a8f3bf4be7ca46e9c4bbc4f4c2104b93bbd42bf179de39a0d0f63119", - "c1a953796f854a88f1cfbba6d3734f6cfdd1e74d549aaa6e678008cd575de934", - "c185022364974ad90f7e1d22b77be95cfe9aae9aff909909e819d9d017dcfc62", - "6c7374d17d55f104affe21ac221f31e3f33ef9fb91bd90fe94f382bd9bbd1078", - "c2a37d197a66920aa5cbc1c18e41fcc56ee55576bd901d3e501472281bdfa2a4", - "4c7a23e6789a7f6557c1546444c7c6d99d98c5c4d130c258d2a71c0aa85d41e9", - "2c35b46ed21e1fe710bce0481355834676fe8af79e8d8b53dee905961f0d200f", - "b2046bdceb87798a3061774bbca69acad756ae0c52e923e83567b497ebc7cfc5", - "7c6c331e97440b11df2a3e63f3b400a2daa18c354e029a9787c7a2f634b6f07b", - "f22577804f6c1604273d898e966494e81be6e789ba770c3484462947c27b402a", - "b145319f7799080fb2671571c74d3778ca706bae09e67c885797263e1b748bae", - "72e3970eb1068acadfb7c7cf6b1db61f07ee0abdc87603bd1f60af70a70de2dc", - "111f02728969e28339af09367b337a69f999bced8a4376ab519f83c3aad05fe1", - "3a84813b9d68d2ab29646b36161d561dca7493b47e435a98b863e646e6f0108e", - "38fcdfc0750b92256d106d44377a3aaaa5ffa705632aec3f30712bcc3dbeaf91", - "11b9425254aa2a506b01625a12f28e4cf037a9ac8253ff9e7f010251921d100b", - "18d0eeb16fc4af4aecf1fd1a99c07f657978f61b7e17e005112d6d8e3cf3fad6", - "0cfd418d4b4209912653577514eed52fa60903ab29a3e1f9c38a5b08e8c6459f", - "7f07247a8d750034a7537c899620aa1cb8d9dd418fce9751bc26d525950838d1", - "1795af2f3c8602e1d0d6a5955aa474df47737f3bd0bc85510858fe52f878431c", - "f2f96262049fa4017647e7925a7b5f8c47f8923d003dc8986acb030727e5cd67", - "e5e12f23d2c9983199ab4c8fdd5deff68aa4f1415417264908589368ab89b987", - "89a699c66293141b1eac161d9eb3796b6ea18d37a7845f612cac76f760b674f0", - "355e1046fba9d011e420aab349f0e0e2373b4019b6e612f5978697aa218a8d67", - "c70fdd67f9c5a5745c0fce71c3a0652b43ae87ccb1bd4298e9c107eced1ce249", - "9a5e208c25493abcc80d290f97dc535649d52d5bdf598c85fb9c7ca855f195fb", - "ac2957fa5dc3093e99ddf5cf67e4d0e4b1dd07b0a626ce2895679704a09f38cf", - "2ea06f15bf380ad8b2bc9f5b49dc8a55d698543fa68e241b77483ef751c24233", - "21980091c148395fe856afbbcceaaea7b20e956b2584a1a93ea0599d7bc07e35", - "7267b0646bc077ab93bfbb649324c227c6a2cc570142d21fcafa20b6b3e1d41a", - "e2c6c14ac0fe609d2fa8cc57b903acffc7a732f9e302f3b510a42326ce548fff", - "2b4384480bf0f629edb4375d1e3c65639a55c48d073a57d178cba83fc827b4b1", - "bfbb06182ffa8fae750d30b31e923166a21aceb1eef38b0fec7988f043073aee", - "0f32748a877fe31064656b513c77427603718153e615f3571ff87bba67175b01", - "e53089674a71f58a5b9f891150440494623cec82117d01c7bc004ae150063b7f", - "4a0164fa2e3bc641f7f132fdf83926b2adb014ccf6f7d49f35d70c92f4ed3a5a", - "3b5f0e908ab0b2ce685c038dd844867a1c13a55dd39cd32cee114a810647b88f", - "19832943a4d04fde85a8409552af1ccea235de204fd2343f7b735390740b3b44", - "41d6be7bafdca134301d122d9b71ae91fe9c4a34cfb34770e8db64aed5114155", - "b1dd1609663f0c7ba50a3525eb7e25809539daf8157b2b23413734d42c02f200", - "46ac57fdbfbb9fdf35b7996ef8ae8d5bf8df8c1e5a6ff267bc1b32f1b6bea566", - "64f8a81d7eb27bcfe77d1dfe8327a673dfc4999688f20777d3a3e1cc2415699a", - "e66afa351fb495e2426f8dea97d2873aac5e09e299decb37f8573a9e55e2d6b6", - "9c556a5e4cfd359bf3ff3051da0c03e9356645e0cd4e21425543408c820c765d", - "6e0c129c3b5845a58c5f617cb89e40b17ee0e399e5a4a862a032537cfe63a0bb", - "6b1d7efd69d9e4869e017d284389a319f053fe7514cdecefe8387324c2a9ac65", - "282bb238b793ef05f37e3685e5652db128e8f76c68ec5793262e46f1700d8afd", - "84d6ebd96bfafc5943c4e90c1b51a5c9142e53a53bc47914399f58f83d307aaa", - "567f9dc732e0a2cdb91210ab7c287e40c094b89a14aa9a040dfb1353b7df0f28", - "8c0aa5bb037dc0f22cd21e5f4a5d23a075a06f654d8d271b2cfe10285f2889e1", - "49b5244aaa9c233eca46338d63d2285d7336515175457c26ecb22150f3ec9567", - "5823c58ff1700496eaddf7d436eed81bd6e6c4ae1def1d87dd415cf1479d18f9", - "4b0ca8b1484135161859cb4e3da193392d9f19f6d9811fc02618bd0bce746ea3", - "c54b4da70ee28033591fd6ed8a1009911832daf2d138607e05aabeeea5c87e8a", - "40cfc135cc7249af29b890a1269b052e3f995066e94d993e3e8fa3722ca3ecbb", - "021f22698fddebf10383e78b066e08be54931a5ac085efbd6c3aa456b0b99d33", - "58b72a087c22cc193ac2418cd86d5707a349e4540261d21b3cdcf8b0cc2a9b25", - "cb1f392a818a8cdd9627432ee634a9e5bc8d149a901a3eeddbb132730642ce62", - "3455fe57bda059ce2d4fd36e952169f70ac7d3f21087aaa7a368dc3c4718b59b", - "4b379e7b480b2c0cdc5e579abbf2842246618573db63d37d74ac9638e6024ff6", - "c4e78fab3cf076cf97b9130f1b60a725393f18b38a247ce494c522d386343aca", - "119c24e3fec487cda0d858135666c372755b8771a1b4e74a3e0cf281b19603ce", - "24762509b619d699227985fa9567a7547bfe876939164b283c51c9b4ff6c2169", - "cc47b4a72bad99a91c04f8c42c88e4c9719aad6275d029c11299c5e50eba9fd1", - "2af156043a1d2c7091faa0057773bb8c4c76839ee5481bd6797ec92b5a68de79", - "f700076ba4c7abdd69a366c7a87dbe5fafae4a8707ea82e7810e5d93c318e73b", - "c1af0326ac9687131b1e7c3124e4e79b73c648db7f96dc9b700597e4c9c51db3", - "4232fa9db210d078b7e4bec767390fb0b6ec5cfeed36a69afa89d368610478c0", - "69672b6e0d1be0dc8770841ee864b5e6709a6c78d58ac083042bd1e8ad034281", - "4470be004bb3e2af99955afc85e29caa5f2277085dfd345a7199adb3a7bd24c8", - "29f9905ddb5898bb368e2f534b5f5bd09d969ef60020c02f7ad397576da90879", - "5e98d9e7b5bd2df2795b216cf042d6a061cbdc3c11d90967c3706bac016251fa", - "111eade39357fc971ed2d81386a688ee0ccfd07c0ba1face37aeea57b222c6da", - "7a0762cdd2c3687c6af409ee83d82848afccfa627749a793c6a7078e4ee4d4c5", - "766ecc65cf29db1cb689906aefe5dfdacee623d8e5e3ab00943394dc0928f228", - "2d8d7ad78d7050895ed7fe290e3b6c53749ab9f1decb1f19c83e1e3c62fcf573", - "2eeb5121356fe1f81344d2ac1405d9f1069b7645c5db34b509d747a4fc4f6825", - "7a7b94fc71cee2efb0de8c2429c5e936de0b1da8b6adab5ed69019738b68e7c2", - "3370aa63d63b1f4e6c961841c807b558e76e3328c30623b731fab65d649c76b8", - "22f050e3b71ef7330885db1375134459cb75101a21e2d7c1124074d9791b8c14", - "72b3b6525fba74b1fa2794d1de681ce5bf52608abc962d48a372778c36e21cba", - "4ce499de6c08ac1bc41d71a4dc5bc082f27f3d613d80f3868839e831046dbbd3", - "6a6c9c5525365f5114783bfaf714a226600d183e0f15a59f02180a31ad275ca5", - "c42b791daf200a1cc063005c50465e3d2448ee97dbcd5c4555b438eb72ddb697", - "a9a19d57cfca276ce0dedad3e32aa415b8d1778c200de9b51d1b2bb814fabf39", - "ded148c8a4dfd336ba221d8c703bee39df0ecae0d66f16700a819d616c141054", - "bc0a0e31e7b58804d6ba173eb963976532032cef9cb7f841f4bf89ddd3fa9fe4", - "fd647957ce926d91dcd932342ef06a77025127d37f1f17e87a6e00b08b45d86d", - "c0de7f014b4646a0d99abfeb957a3c690819e80af6d506c6b18f1e7a6acdf520", - "ac4474de9f806d0f8baeca7a22aac7eb8b502bba2b4c062d988b10534b8280e7", - "a41edd9add23aa3b62401a8058a68723d8e0bbfc041f9e7bedf23ec6ca077f5f", - "051337594bcece9d9f16aa6ccb26f5dc89c41ad4004510bc43c726e82a84803d", - "6f759ed796fc983e496aea78a559e44bc6a24304b34e0e2e16bf37baf4742a35", - "815d0b988d6286870a031bde491d876fa1dd8fc22f6e7bf9b925f5ade18f2f64", - "0b80bdca9f75bee875f64c66c22af681838190930d5fc8413806d3cc525f063e", - "5ce9f205c149cc9dc47f2f72b5ca0e3ec8bbdab669dbfde88b132eea98d9b3f8", - "4f6b7526a4a08dff480a216d1ff0a93724691bdbc6524933ac526408590a4f2c", - "10e17be5558bdea3c3d1aa87ab24de3e73091b57c710ac81ccf1fcfce7fe39ea", - "d92c48b00a9b095cbe7ef9ad1791fc46215000e7bf07be4c81c57ebad01cd874", - "6adda45f14f352b3f9a469d3ffe9c5e7c334318b7d33132437b7c2ee02c2975c", - "81fa2dee3d78e60c1d7b8690bebf79d09e205c2b41db39985d67d3c74a8c9302", - "92e7e55e452879606418febec5291cfd43f99fa0cdacd70f9c7b48e9b0d5dd30", - "c8224aee17c32bc4589f819d8e071866d3175284b5ca74673d36b4802b9d93fd", - "75d27ba044a8e242ce0a112547924f6f3526f35df63443bc25ed08a68e4fc6a6", - "2829ae7d79707ef8fe9557c8f9fc1b5befd0f22e2deabe89eb5415a7079e5b07", - "7685a75f09e0dc926796c983c7995860bd64e59856e983f735a86bfab946fe89", - "ff510f6035e5c1e9518d55e1da747df8d88ad78c75be58206b0f869d077ae7d6", - "32ae893355a5c8309af537bf3f2fd5a32104a72b7ca12c7a07dba71f9933a062", - "1862425b235b6c53313307d892a3b2d02ffed4b25e6b6e7d93c869df8aafe5fb", - "e3e25b19329e4f1ee82a0756bc3ae9c6695e2312b5070935ba5b997ec78ec9d0", - "c98783715631b6b27ad9969181a15ea3795c872af783dcd7edfda44a01dbc29a", - "ad1e5ba003c07925ca31a5641bfdb9834c6a58d7141c3ff88bd08dff84edfc65", - "44d338b0123c3fa6f91dddd23be698092b352028d0045a110f0a137186e67e9d", - "5110cf721980bf0446d1eb417236466de0f5c9e186a778a52bfd46f587b17812", - "31b6a2e583ac1fcd6d15075d2f99823fcffe891b1ac65a83d7026346f67a975b", - "9cefe9ec936c48441f131d32474cda3d78a043e6ffc437b6715ef90a9eb113bf", - "37718940decf0441a314bb3bb33c0bc15a12b183d5d8bf3955637bce300bf251", - "f1fe2c3a86c0e50dc0499d335bb02c765d8fd466af6709c29fbf9949f71b2823", - "fce7ba36cc0f57b6351e8324a114f8df54d821bc4eb667b7207ba898ff3a1a6c", - "551a6a3a100a46654338f9870c872740d11899bfec74854c0cc2bd1ce6aa324a", - "2436489010d0ebf2dfb0b420038ca1139e71ef88694f0dad6c5472d445e27dfe", - "6b378852c4965758e3c7c00005a3573bd6323acb7e8016b6c34db63918c41f0d", - "f386a9a4ea669026add42fe9bcc28ba7f2df668e82057e8f42e4e334f43bafa8", - "b4bd666b280724b16120b0b494c7a512adb9f119b97452bbe461441cc346b92d", - "21315322b5ef28d541bde8e35c70a6ce0ddb2a394d80c359814f36da1c9449b7", - "5546fedad8a8a6bfb5f01bc8a090cc7b665722e237ec212b94841d7cd6b1735d", - "577d0b3c79ce437c2faafbe00d33098e46b39d87966b30eee417736c6c27ab4c", - "74078b21963124b530a03e59de74b0e8c6cc6c2eca7694bb3cb1a7ee2a774d55", - "3449e028ab2e5bdb15dc88500e54873c6150b1593a8f50a76e9fb701392fc084", - "8b434434d1126251e1c8d7012a7ecadb317728795efa13e453a8d0d04d30726c", - "587e1f492d783ed79b8c0343274a649536a0ee11b2998a6a8afaf884861540af", - "46e5a6636f1e2b946d4ee05fef51ee734b81c1c5f8056a47d41907d8b092553c", - "9ab648c07fcd39f482050a8ece68a85e014f947d2d62f71cf4a4f2fd09c10442", - "be78a81f264b0df12be69dfe42422549083810d173404fd6bb1b9ff01768a3ad", - "d86599324a5146aedb9291389fbf11b084a80cbdeae74fb137c250fb358ad2b8", - "02aeaf54e3e1ccf79545c897802303d0eb84b6f52277170cb9671c83135e4fbe", - "52ad69dc8ee6c10c2d385a4adcb0aa52a7187ad2a6fa3e69171b1f78eea0c386", - "3abb8c039f90ca647e63a575fb6b30471d69d126bbd4dfcc09849332f65da16f", - "ba433d072594217905a148c5df2ccf1ab390c1ceb360e5f7ebd72f895decfdd2", - "e17dfc597c92275933c75acae72f8ea734d2a5b58ce913c9c54f0e1e15c28ca6", - "68da6992346c796adc139f98721914cef060ae901863743f95a2d667835112b3", - "76770b5e45eeac852ab24ba5973dc2fb9ddb34e92cf289111cbf22ae71e6345d", - "89496617a5d85dd64f0eee324f14328e6696bb63375612d12c16758c874a2b19", - "07a3b7a8dc1ac72302a76dd37998fc8f4af4562711b5dea7bf3c99d17bcece31", - "eedf4057922db594d085fb7b9c1e366cf51bbb81b899c2e5d83e0d4cca4bbfe9", - "d9fce9a22f01763be4db6a3153a2186406ac7cda58bb9ba4a7ebb71075841dae", - "20b51c3fe4454f74e45aacb3321fa0f23b2016357a7fe988a58d053261e1087e", - "f9cdd0a5c46b8bea9433f501a95cf07e30e58106aa60d52d7721938946956b0e", - "e252f29b6d4218402f6ffadc885a75d536493c3ff3edc59cd20d6e3fd7db1ed0", - "82f814194646047efb738fbf42370a2e8d379da07203dea55a5f2461abbaa4ac", - "cf8c4fc6ba6591ae69523c0f0a65d31df26f92c2b0a9ae1f1ce768471d2cfa64", - "1524783b793af533d7c19f4f08f9ba5b0160e2b317b65a98b9f1003d7f06cfd8", - "60ca5d47de8220988c2e06fe20eb43e285e48157296dd06f6b4327e521afee95", - "8e7c239f6a213cc5f8d94849ab011ea10d1f149023144599a190306b198b7691", - "40123d12e72ce412c518e23e9289261c8cf2dcc1fba4f1dd500b44999f620010", - "52416431c193ef84424e08fd327b20f5f39e220dba814b5b64a8f9347317108e", - "6fd6123a8390371de760128f9343e9e10361220089d1cdd8fd59abb7dbabc0c3", - "51fc387a6cf13f32dd62c7997e14326d373ed2f342bec2ae3b7a9b38ead5e412", - "757d1055d295b1ac1630879b79ceb59c2f0aac30251fe2920f695085a86d58b1", - "3d98272190ed0dc72091e62b1a83183a5577461c050f8518485a590bb7e8b7e8", - "5e17c13106798f80bfb6b300cffaa620537e860bdbdd9f2975cacca7ee201053", - "64be9daa74c3e09c36a019ae822cb9bd36343094aba24d2ba80ba140c58a87ec", - "deeedfde82ce8c896bd703460a986f86affad9cccb206e8965ac13781bcbe7c8", - "91782a419321125207123d5be811702c148d244fb209547142c93f88bb2fba0d", - "3b027d88a9f6806e1f956aa8d5b72d42ad971ab0001a0db531836fd969399c45", - "a1d13b02cca41c65e54956cb89c0b357e645e74d63d3b950bf6144130a639ef5", - "53830bc9437ec0a160c9f2effd6b74c8792eaaf637df5a6a0fa6e1732cdb1c0b", - "48d4c69553f5976b3d71397850832f52d0ab311349ea07f3d5f078b99516dd42", - "95d42f79fbfe95432cd7173b1876c4f02a5a8383824bf7d94b35e668bab194e3", - "891122e4b5b08d0ef779a918d35ea8b1774416c46d29826c151ce2429e79d287", - "14690cc1a3e1b95f4a337600a8ecdf509ac1661f28c4ee20986e0878a686780c", - "3379a75220b068a87cd188f304ab070d8a78c3f621b0dea091a7ee5541b94b65", - "23650b6105f4621192a8806fe76dab5c249cf478d8b4a557d7c30aab0b99a240", - "8896157fa7cc23c76a1c33a5e66abada26959937540cb22b290ef2109ead9d80", - "d1cccba56a489f7d225ac2d5897ca79c61625dff14c1a31bd40db9a9ab5ce9dd", - "4ba2da6c6ccb20d9bccad08dcd9d9bd1135324c4bbdbf12bff2ac164acb740a7", - "1042732ec3852a56c647cc66d17545b8a631d1141163dd095b7d53b6a3f04c35", - "5c214f0211a4d19b92e3b4876189abe6ad79b4a965e90000bc5c6880f8c4027c", - "395fcfcb8b6cbe1697c13abccee324122004eb23afd59fa580642012219cd395", - "ddb05d1bafa7000bcb6a65d609733104e114c6e76b21c9d4cc66f2815ff2e28e", - "518da77373597a3b48f0021a6721798eb340db4e523acc64c939d58ea5a66a2f", - "dc3069e4b5bf829269f6f9cb92db02122594dc2ef06c121868cc4025822cb06c", - "5b022332b16ada6f48404ce2f54233e754ef15fae4d25483a10b259b1f799b3d", - "aef026b94e68de3dd7b308e8e2d6bc183dd4cb60120287f0ae54aeb05a414f7e", - "a6bb22524026690806af1d18d364f35fadab69de6f05ca51e3ed1a605d793085", - "61312b67fdb6e00391a527778b38aa26367fa9a0a2071f2c8befc7b5cc6cc96d", - "6f29097074a0224746d87d379b8064f8869be8c1fb5e2a45b4ba85d874640464", - "064421b48ded6337658852549c6645df24c4b7a70b5adcdd6a3f138f23632e27", - "b8efd7390ac065bd8868d57b0ca6aa4a7b9a15a09be294f9d30042ab2f68d61c", - "2e63aac30748ff4dd68e450562808320178878ab751509d1f40d556a60d0d140", - "59201d7f90928a8ae373c34747b89d9737d9a2db100d33d7e75c5d9b1c3c10e1", - "762e3f3b8c3b995ea8f2d471791a43b9e371e276cbc355966f3fccacd0ddeb86", - "9ccf3731dc89fe441d77f4186cd009610a43bff8a2afbaba90cf67e895f70935", - "58f0e5b1d5e970da683e73dbb18e6fe7d4962ffef8715b7fcfcee88b7d38bb31", - "e125c962006f13c926d340a8a7346d7b18a9af0a81648c5abc6c9be047b5a393", - "ee6e8a204c8e6f048f6054b9136fbc5be3288316c18cac0942a26e6148351160", - "1caa1264e17f86c2743a7dd02fad6d487a11cb76323cde34c4eb3bb7b055804b", - "aea1989f65ee9766d74d0fdecb4a6ba43a658403d52079179334dabf491388a6", - "28584c9ffece4a104af34717ecfd8a95451f5860898310328df2e5adf47e07dc", - "6625088238b9921a64edfb703f912d28ad1eac82e41780e7e1c302ca564ba8f0", - "f183c662e5008977b2497a076a178fe90f0a165c90915d15a0477e5ad65f2cb7", - "2ea8ef5b1bc94ed8a7dead52f013bc9ec42793dbbb197f48905ac7c473eb472c", - "f680397d59a300b3da7eda8fc8e5438b8e48bbdd2ed6cae0086da1faab14af7f", - "d24edf8aa0a3ec28d53c2949e9b9fa957299d0ab8b5374d7908aa2312e3afc45", - "b5c42a576d4cf46033d36cdee5fe52372aed2820e3266c145ce515453620fd25", - "60af5e1ef1a3a6e0577b875f41f7d9cc8472d38ba12726ba728c6ef27a15ea82", - "6e23cede76227d21b115c2688cc8439284d9fb64fe59c05c3edd8cfdd09c8838", - "69c3d942b495f3101e0c8fb65338494da672376c28ab9b1b48be9f86bc856a61", - "9c065718a9e81fab83deff6ddaf21cc5d3882c93aa22ff717a219079c5a616e1", - "3d74a561fcbfea1b151e5aaf836e82c3d2ec30e591d48d721be15db4f569251d", - "22868b9dc54f942d34af7ac2b1d03c765116c7ee23d6bba70e414a7242b3707f", - "f1f5a580c3e966bb82ee92dcb7d8c3760ece14e9c6859a49911ca3e102ca28be", - "171e94dd9da76fbca9dfb8aa9113f3ca2b6137c2b3b54eb35b01683dcb7995a3", - "78406dd1114a34fca4e3d6cd0faa442b7650371d0c25259c4ac5fea7a0037b2a", - "1d815f0d06fa01c3035f016a6e474c075b4300ea93df504b85c1a08f6bcd9f94", - "c8ace593a0fee6b79cb08ea473a8f705fb8d251b87011f2dab224a4a8376c91f", - "8dd328b38c1c2497ea83ee01383a50b214efd11aa0dae85fc6eedaa4e8a7910c", - "63655e1d38bfb2a077d4dc4c878a11d57806fb60e96eda77ea0e6cf59de30f25", - "ff77799bd5b281af341b0bc874e8bbe739c693ef3b2a27a8f9afee9ff00d6519", - "5df99c32a8f268f6f7b3b3cce36516df15f6d4c890ba8672048d8ca56f88ca57", - "0321cc437539aecd1709597775c98f2204bb7f55a18bf063af7b9add4e2eddbf", - "51ff78b3aa828db3882df9f56d4966a4e3105a9a59fa4062cefcadb6b42a8193", - "374a23684c9649c7af81bfd8f00a721be3cbca2f167282086e4e15bcc3798756", - "56b957a4230a8e221d1c988e20bd0dfe6ddef34b81f5121d41df0eaaad5ce698", - "5a0be06b8736c75afc438ff8e32c3ce90672d761eb20595918471d897e34909c", - "796aff4f995ec54fd80614db2af37672edff5bb0672a434a46e28f0cc39a3ef7", - "fa040d04f8e6c442cf0549079ca47780f0938c295a0ee9018365b8e079514b4a", - "548fbc74d22c750d9fac44d88871a690f111bbba23587fcab605b3626d9fe0b2", - "dd46ea3f5312e86b913fc241bab52bb50a2f3882424e32611f493982cad3c22e", - "55dc0c35d72613cc558e27d113520bad5ab7eb62cfc5aec90dfbb7e3cf2e4532", - "d182b3a117bb70b25214679733adec0b9bdaa9e2f46916b386670eecd661c4bc", - "a745911dab4f91dde1b2fe6f5a0f6d30c337d4d98c78e3d3a54190a0a9653c42", - "f5a9f29b1811cf0511affef170f4b5cb3175a34563a335dfe549294b11c84e75", - "9c459a977c933d330e44de52027fa02240897fe5df4b410562402dba83ec62d6", - "0eb2cf9c73f4ea51f3a1595be50eee6e332246642b7fceede14ea2a1d2d38401", - "4931b9635b0a8b538a73f6af17bf5004a9fa4253b952acea8d247a04aca07de7", - "9fd2ce32d252e93b6dae93b47e41b4351dcd5568f0454a007d0146e2801ae891", - "47372aea281db79600913b5339a439ab4736d19ad08b954856fa8c95b9e2e3b1", - "4f2a1dd1987dfe55bc622a696fc85b954e8ce77d138529d97551ed67cfac2164", - "c7a3be139d80eb98ce7c62955f6a6ffdaf36f7aa7f364e1b79487aaa64ffbef3", - "c77b1453e81c2c78b30832b84a5632350a0eb85f09f4534fa2b1b680d4fea83f", - "5d0d631d90dd98daf0e5918fc7aaf2d6b2b9fc8c631296c5d2a4b3cfd9117a88", - "20733fb2d6922f350453e1bdd9be92c3b97f8a3ca2b1d23177aae09cb75d8a0a", - "699d1a899f57393b8791e0e02c8a4ee9620179c603202111934b12f3f358e965", - "e9f7c28aaec560e0d632030cf4a84fc5adfa26d1fa19aaf1d5a058bdc14f1fa5", - "ab40333f27af58462770434ee309d32ed400ee317ee5d94be92841da7df8996d", - "bb17b375dcc827b77cd297b8cf78bf9e785b952589b439af062801f05389c134", - "748e739d302fea4b4202614a0bc4eca45ed91344bb519452109d02cc638ec9cb", - "baaf45368be07390048237eb289f1c585a8460396d261cd06f87b81b5f668cba", - "872f471be09a4390c2fd064579447812d27e939f257f76048c17d27b9cb7c83d", - "569f3af3301d6c846a48bdd5fbbc48157cf60ee59292b7353d82312f9d67a3cf", - "34732a0b83b488c965d5ad930770d5d25b4c785280763ccfabbe2722a06c7461", - "e7c7d381732c35469468d055b41bbe8bfa34e459bd80fe462fa9fc86938eeec1", - "d3381a571e4d75138bb61c0fe9bc3a26a484b206b50e033ddec994699ff75061", - "c9c0331d9f588cc6a7a4a4b868d8053f61837156b15cc976ac107d8232504bb7", - "c98da2d3d0c79d0eb242615f6ae1349609e87f6d4ede82205b3865c1598f6127", - "03a4a03fcb8607138a9dc102c438a259db1dfc02435638a5ca0d8b7a92e7c494", - "685c6cd3ac9f44304b78a58cd7cc475125d79d9503bf99ca2a5d0260cb4b1777", - "38f1951e0f84cf8cc1fa6af4b5a22120d391a06cc4341895273255592cbc3876", - "b12995dc895b03d7b07d1f5b2f5f8d24e0b7325b9b71a6ff9dcae19336dea2d9", - "d8ed3b0bf9ad677bb721ce9b1bbb53222123dd09f33142d5590bb0702093a1e0", - "a30472c176891518d9b9da8836e6714392451d30adfa1bbc57f5556c7dc6da21", - "3ebe5b7650a09fc9cce9bc27f34438812035fa41b5412cdc9a1ca4424359c3c8", - "043b2babe35546cf981fbc3d9a7527547f807ab5c457f995ef22a1c984bb6881", - "33557e612a65d4ba49fcba7cc2669820d361219ffc94609c12c137914d23e20c", - "8f937949e1066bb8315e412f0ba91e1bf69114f3afe54a0437ea144be30e058d", - "ee320fd96e5a33a967e085eb4eb0a1b7a3e119c1715e96f32d7782a4e328566a", - "973e71349681a3a9e968b9e497f8aedef84a48f987323ed95b142f00fd249875", - "59ffdb8cbb0434208f4cc703e21a88466b920c05b5d41218f4030d1bff15e1cf", - "70776760c6ef83ec32dd7d75ec6366fbe06e5d1ec429147a8a905cdd5235cc1f", - "f19429dedbe142e167169335a1c92ca2b256f6917485976fa717af3f729a41ad", - "5050cc832fc1f8556a4da93ddb7d1e64ba4a7f892bd8579c4a360764ded603cd", - "a863263b2cd990b519f53b9110dade8ee24aa3a6b1d488529b86872efd80b7e2", - "17fb85ef8004d2c12bb287321b7eb45935d1d99280293ba14003aed9470d2576", - "ae301bf35ede3103b7a08a7ba6b444e0d0897f06b852064e7d93f26c1d5fbc9d", - "41cb311a735a4e0f48e9039516d87fa4b778dbcd75e083d0f8f41786339eea92", - "5e7296dc50eeb9650bfe870a012332c8ead1ee726b6601819b0446283c8a5f68", - "35b63762f62d78d35fd9e39fbf10a9eb86ed875277484ff3b047dea398881c67", - "7260663ccc7897525e50d6ba719e1f2dc2dc7c9bacb4bf5d4fd9c93736423d63", - "0599c69b8f60f55bd6e7f01d8202ef59db11c59b50869e52ccfdf7c2e87630b7", - "e3d6e12a2eae3d0c48dec73b2918ff27bb903ab3fe4c6c1a51981de441597cd4", - "df386ba96f9fb788c8cfa2a8e8c612778b6b25985b89f526df1d474232229b5e", - "e6d4fc1f8d4f33f2939ac721d32282d44a9d11a5b6ed02bd698a1662d6fbcc4b", - "e8ffe4675d6af48e696d00f2d4acb53c4b744cfae2aae7b63a0566bd8732bb8d", - "7ac40fee03a25c65bafc9d0b708be0210ea5bd632d596928648568dbbc90b30a", - "e01ba52fc39bf5e81c0067ddf70f0cd131b1243e9825994aa0c4399fc7039f83", - "f046d909b7fd22880b86931a9d7ef8c964c3234e53acc69a598073b890dd0503", - "1d87ced504c83c6c9e2e7277d0c6f4db1597f2d135614ef17963a62f611145b6", - "fbf3f04f7a437f7a1c80248e23241477fb054b4fd2aa5ccbe405952ac4da91dc", - "8627ebfbbd5d4fdc56dd7dbdb2f6fc375effa05dfe418d27c5648b60d4b6d99b", - "5a6e8a921e1ce47055dd6504bd670d2cd09dd7355b877a307d632cd8054cee3b", - "c61a5af741ffea387f0f9defc54dc9c4fdc5c22d4e038bb661a90806aba1cebf", - "bdd383f4776b25f3ab3e43ac97f6cc94ec25f84289ee8283549210016ff52337", - "37a598575098d4929a5ffa0474a96bf66e2eecb17363ef1aa3694ce7b4668c70", - "d0a086eb92ccfb014314c0ee8c88d4451625de59a61bded5bad7f370324f08c0", - "63d3a29849978529bda9bc5076c14677b692efd7d7dfae6d41bccb390e2acae7", - "b42770075069ea6438313e1da21964e7ebea47efad7d6416c794f53a2bd5cfa5", - "72ffbece66b62242aea0321a09b80d576646309161e7f194b13c20078d1bb00b", - "97f001e690ccc5dbd892be64228c7043cf64483ecbb5e99ac5351523433a886c", - "5d8aea61838247eaadc2224420c6c5fe9b38954c3d391e83d0dd0d57fd22586e", - "83cd77bbf8329f5407575fd4410a07feafac361e6f896fe2b4e264e68afcda4f", - "ac39ed5441b402c507703493a8dac7e65e362201b39ba72c75e9e8a6145a57b9", - "d5b2637989d0f6b292c3200fe1a417f1d27b41fbeda103eeb142ebf61c40e39c", - "64697898465a4aaa10760ba9865fc61db9b7e1d8f0d7dd03e96568d7fe03599b", - "b3866f9e0b3978c8f52c4c852765acbbfeac84c224538e38b9fec4bd636332b6", - "1d9385006d9634a0749c18b151509a2a6987a0d1411a330cba2bbfa3f1f70452", - "c24c2e64812774f36db6f1ce3f64ff9010ae467201963010dc328e40ec547678", - "4b1b4250b5ac8743115de3cfbd26f071000dc48733dc36f2b446866ca96c1891", - "218321f3b85ea7bd581126b81c94e16fcb6041ce3cd9650e998c6794021900a1", - "f8792a040e164710932ceed5ebf4e5cf1f4d1169a72f9fdb8d2e2261d89f8543", - "9ec472c1c50c0cc19fc10a7e3e311392da9d50fcd9a353ac9c93cd825ad49d81", - "e951c3d3466e421a0720c3753ee9c5beb563fa668311504d10fee6ff9142b0b2", - "271667a43b244a5d798c50c155702f118296cf6a2f82dd443c0732ef2969e1b0", - "95d39c33c724f333bcd23f46476b54de3c4b02288f2e4deb8839d71c69a95aec", - "4a4b1f3582a5b9c51b9a7773695334b119b5b132d0515b859d9ccf5fb5bf1683", - "7c2b83877f711129035870b19120b0ec1af0722c804a4b0d36ed586c69458e9e", - "4fa89ef804fa21d189b82193cd881c761fc47a3402589de1352b23da26f3273d", - "f550a3b3d78745de084de5991c57a42c016843b38e9e2a3c7c16790468eb3d36", - "013284ed4a238fc4ae120bece589d867d7c19f9f71ab91763d4c0624febb41f0", - "1fefe50637c077bfb3dbd0205bbbfbe3faca1990886cde71ea7478930aff064c", - "1e062ca845f87f3bee4e8688282c2bdee957e573390af61ca728878469bb0872", - "22b7f6e33df7959c27de8c9b0ace5dcf81d1769b5ff9f85adfdfb79bcc44fa00", - "c537e0ee46a20690d4a07514f41420e9f116499ebdbd516f8296b0235a0ba2ca", - "04bb5efdd3c51dada9fe3bfbfc3c71e790d79e2909e86e068dc410364f6dfd35", - "e2bc1c1ee766b2ab4f9ed96da8c82d106571feb58167fff5e8264f629087b67f", - "04e6d37fb1bdd36317e3668a5e4cf69441a0720cb579af62d96e2790d471061e", - "373919f4b692dead31642602d9005a673d388a726ab01b3c765ce05bbd49dc5e", - "6dd9ab86c0d1ff5cff38c4badb0d89abb51edc9e10411d3f7cf19be0948a4007", - "4cee9c4486ce1f6b6ccd8938550a87cd0b575fff16e389b87f4baaea6f13c512", - "35eb22d0f6939ef2c27de50034f26f28113142067d7e1eaba066ac12ed778439", - "877148ef845157adc38ffbdae9155567e21c4ffd07b3392aff48ea76102d6989", - "3286b1a9e9802766d2cff33c9cf25e802d0ddc81dc5578fd5da85d698cfb552e", - "0b74444dc25dfdc1d87ecd56456dc8a3acd1ad1f85be89194942520d23e05e21", - "182e416edd8625baeb64d4e808ced5c2a616f8aaf52f8a1c915db1c9e3352eee", - "3f1da555ccd1d3148e9c596eef470d085082646dae01b8e805a176ede140a079", - "737115dc859faff23459ab6bbf09229c02ccc15c1d0e1d465a1c6d2b14169872", - "4777d1527e8163b3c3e7c7dea170c4b1f205447261ad2c0f1265f94f1116a676", - "fd06af15f2d091ff044f7ae918a18ca58ceb9be68448649747e5e3bef09ced8e", - "1219d3a90377c4ba525e463f00c2389e031b1880a0617eb21242169f041aa498", - "0a7b58cfe7ff267896d85d92c9f60c32978866f0a76db797e8746e25af6d109c", - "754b1a1713286456db476e4197c120e2e9771386782735f632678aa530e64dd0", - "8fd23798cd296061f84cabd0e89a68608633ff275d2c5de3ccdf35ecd926f3b5", - "9cadcf6cb4b0450fc558e3c6416b627c62518bb6f4898258d8260b3d0d60ddbf", - "ab29fe47b9e28eefd62ab70776d3890761b85d329a9bb956c4cf40f9e816f932", - "5841f38fa0d12216bcbd4aa76c7a515689348b1220ef4914beac6863739d5e5d", - "876ceb1005681dc376c55c41234039c3097d739a4d1095dc7471f8bedfe9e71b", - "b799e7aea2218ec2fd19b9db69a3510c1cc05318e7e80b11d7f34e71021bee25", - "640d402cb38af28555e6b2788464ccfea908e0dfe50f216021d56628b8cbae8d", - "8669b8751995842abd5d816a6507e9b3d6eac858aa836eee896e6863f0d8ecf0", - "c7dd037bdcf48b058d0eefcb3c6b058bb9b175798e240bb0060e3d1b83030c9a", - "d390fac8bab5b183f91c0cafbd9c2b4c64c7ed4a6decd1dfabf83d3fba5eafe3", - "b6ff82541019e5b8fa510f4223c48a152b8bff663fa0788bbbd49edc890753b6", - "545c4adbc0cb4f123bfcec618c78d432d61444fa6ba0109399e5b95a1fe57a05", - "9db3c3b26a1ec2fea00e6c6f68fc312ff7564249182cd31c68ee012eeacd83f1", - "0a2c40d0b2b9172ada46d37073ef257f37ffed8b926b43cb2b0625efdbcfe787", - "4d7d0dcbda367e80771676a350acc9b4d34f9d954ecd1322bfb3d1cdff2814b0", - "72ac92bfce51d08cf2243219aeb62711c52ca136c37992901738dda6cb045181", - "adaf56f51c79b01a97c9d1937d8af4af218cf3f9ecb17df5be5db3fafcd57ae2", - "a32246516b8dae67a85f1692834aefbbdf98452e0f96c477889ac9e120d67106", - "34801162d09554a66fe8710ae6735736da4fd8c78c55a49c2977a3f42b396bcd", - "79fa43e117e6bb13f47a480e5c433f1ee85413c204edc72a39766492c7f4c32b", - "25cf98eaf03565509c8eeb3367eb1df91eb22b07f94771d69978726f1ad9e79e", - "4a87d2d6333e1b915215183b9523260c94cea2db3e28effb4a4e6352c510c504", - "159423e4624d3390a5f593435b1b950f3a88e5cc4e2e1f308ed9fae7e6ff2705", - "884e17c120429811b60c3cf175d7fd34eab253373bd20ccf19383a15ccd5f1c3", - "c2f8eaf3c215c9b1482f8fd77db9f2a4dd97b42143c29e36f243d396ce29e93c", - "d146c745cb403b81a722afa16aca0cab726ecab225f1253996f01723491f9285", - "32459d61ec652321abf16d07c079b2dfebac7c0c192eb72d0fffcb2d4a1f29e4", - "05333112e59115de12d4466b200e10346fb6baf9bd2fedd1d1d846a9a0ed4a07", - "006e362208f8f27fb288157defcf841e07a93182e94a9a39249ede50b23d5116", - "491a97fb31dcb50acd8864ab03719a790ee5ea0e893784bc70e7d2c9d41c4077", - "8a1a3f0513ec21c7dd059171728b19a5afbda03dbda08e89dfc48a082e4a402b", - "fe3491352a1fcd4dc47591c34ba7d47ec66ef1c97665b8030afc5f7235a23912", - "8c6f0ea01726c7f7d7d43b416f3fe115bdba8cd84e87d90db4bbf0d4524fb683", - "4f01c33d8791d7bcb93956aff6f51b7f42e1cc2e1ed844bd5c0b3180accfa444", - "a840c26d94483463e73509d7a56e2c46adb53459a5ccefe5b21ac6e0958db09e", - "608d2458a172c567eb5b04616f970b11b0322a2433421dac8cea3d82b4e3253b", - "4585ab1c3ab9258797638ec0734847d0c08b97f3eea11215b1880dcaad9f1280", - "a2a3d7bc620b70672f21d296f9d253e7dccf3daf056409a483c00909bbb194a4", - "858f3202f0b6198e2429302c23d39801c2cfa1c629e995730e5037432c0309f1", - "bec655478e62ab768d094a595f77aa0a14abbfc042330698879500f4b77ced2b", - "dc751f1c779b7b7408e1d2a7d0c1578098034309b0530ceda7ba4bab1e6601ed", - "44615b096bef8170e61eb39797c9fa05c6d1e697a29e60473410cad9874f6e00", - "09162adecc57a91b094ecbdfbfad0696c688a30d8e37a16189e585f5e309351e", - "d39a3764992166b08e5ca04196a020aa1b5bdb8e6e09a910c8e2bfa7808f162b", - "81e91c3d54d46ab6ad729c060c207f630c936af49ba2f1acc7898b8a224053f9", - "f0c58d7bf365813553f7a6a0342fe14e96bd36706f3502c355b94de75c257618", - "db3c98983e579c8adbcda00ad63c223c8dcbf49f6b4a1035d9af2d4d3883c717", - "302c41a693c368165cc0d7357519c7130420c26aa2c47eb579daf676c158e5cd", - "5b1405bc98fb8f13f132fd78d1ef7f384a464e819a980a46873742955ff40a76", - "338db92704ec526bab771ad76efa5d00cb4cb689754194bbeecc8558d24e2e9b", - "55eafd5943b8ab28e9594684f2be14f6586292b9aba63201f7a52e835df74069", - "0200b5169cbd9a5c40aa2d304fc62ac681ca4912cbf1c36124f238ce0e05f864", - "fbeff0df10955f455278eca08b4b65b4f6b1add2fbe7671a4a363be60e029332", - "d5930049963a8b4bbdb2f72690ab0c23681900cd6baaceb968a693b802b8207f", - "afe418a14461185e4f0164add8395e56c59a19a7d7223ed57361be3c5bcdffc3", - "31b06faa821634560f27dfe992ecd1158c0be8514f840f364e8ad410e3c91c1f", - "c2e443b519248d289c655ae25819192fde318d773508f2079dabd7fda7959c90", - "68ad076a45046bea15ab59b25f02c0b5c2f8a381a6eff45581a19b56136075a5", - "9c0f8f7a1d4b31afc721176bea4372d4ade74e6aaa42b8ad1cead28674731526", - "24bdbdde8eafc9d280a0465d70b17f21ee189f0f48caf885abccd4453b44d658", - "e992445910df213dad049db643179f5f56941ba29e0d4982a8834173e68baa98", - "14d2215f357a2b386af4d469eeebe3474cee25f3617843d60812fa02454b7eef", - "87ed3590e4a88c561af3fe39de06485e98502c2f5c91e837b9a034fec3520b92", - "8ea1e465e96d9e746816d9933c1a73ce8afebfb9e203a7cff47a74b36b4af654", - "2221926e733871721d3e6e98542ab101a2ac4a7e665274f7f374c2532aa1fc7c", - "c72843b92509135c1a06f7bd00f8695e8545b1a8d1602d99e11e6b748d283ffb", - "6f15477ad0bb4c184c0fd33c12435899829feaef3cf2c816c139112c10861f0f", - "b59b01a2be4e79d2e9189dbaa8063083e88480b0ecefb69ca6b8c2d44f9cb277", - "dcf1adf57d1c9831c5287ef76c8e3bd05dcd91696b3d173162407d79a410ede9", - "62869ad26d22ca4c77fa1481db307625ad0dab37fecdd665d756f72a139b148f", - "7f1833edb46fc75fcc7118670a3432051d66f1bb18fe5da300029372327ae0fd", - "ab3afba48020ed05791614af35d47a1a2b9ec5fee2b9983a8b6219ab114df9cc", - "965be021f778d5b5e07df8fc43245afba66971603abb72e1b3a548afadb4a6b1", - "075f4ed4a71822eab155926c7dac6b3312e6965200aaaee75dbd3fe20b3bfca4", - "3b81ce473d6a94daab6897625cb967b6a2ed236ea1c6fe0d51b9a62fbb62dd08", - "336a4fe679d6eb9f7df618fbd985bdf1b8f4900ab5c503039aa0e318192bfd15", - "a3f931bb2bcc8d7612ef065d5f1846a6532edc613d226960c6ba8e4ef29fb5c1", - "57cb7c2e0f7f9b3ccef7dc28b78888cd56f8f5943db7811a46065ba6ec6d7d2f", - "45c36fce31f2c06cbb26dd2f32e105ed6e04f0971bf4ff102b2d054b1a1180e1", - "a4422d81c1611acc6fb92abcc710788e8b180e33df1c94030c03420ae55cbd17", - "968bdb5780731c2d1ce8c5548e9ba1235d3db86c253500c50b7e622dd4a1c6bf", - "cf64933c442af0249dfa67daf384717ac821391030d0f76f57f1620e813ca582", - "d4f875195d8f4c1020385f7d236dbb6fd191427b9cc79ef85f530eb86dbca315", - "6f43d7dd974ec5ad6a5025974d4df5f1f00c2923a8361d21edfb4eda9d85eb08", - "8716a6ba15d9bc627311ae4ff035fb6e73c6e51a2e884e37528cf7a9c7998166", - "f6f03c7bea43ddbedbe286cc1c02327f8cc7c6d28a255551b1f9f98b81e7d1c2", - "027aea88a24d2755c362abe510e80689a10ee4ff8f2b62f33cd7783c8425270e", - "0e2be32d99ead7b7072f9afdfe2fade2932a4091d51700186df0add5efcf88dc", - "0e96f5740ab34c98e95f26e1947574c74e6adf38e8adc56280bbb1a9dee3c683", - "957b76c7c5fcf309161fbb5bca26339d5f2f80a54548ab713fae7b27a2214c66", - "8d43d4085ed312f1815876c817b197c55b72cca89b8c2b317807b78098ac4b66", - "12fc25eb2ae79a41eb3c5b529641a6a6eef26d4d34b24f1339653e5aa919cc5d", - "10fb94613c2e85ef9626578e6c1e876fa2a22cc2c80be6e5e6e6d7729063c378", - "c4559ee4bc910804868376e7a72f45b3546d826809766abbbae5fadfe1848149", - "a0cc161d277e717e145f2b9daf84ab18a598e594c0348645d74ebb84399b9f86", - "dfc9d73ddfbafd8f0edd4db8bac6377062f33d46a0a4cc61c04eacc2f840c924", - "b5d760cfaa5d2f74592224dd52bd3f8d0a8dfa8ad8fa9d18fa2c6a649a266db1", - "9c97c8f97bd269c8dd3354b59e0314c02e8150fd7be18b199f648877fa7f5f77", - "1cd034b909a1d84b5fc609c795eff3356d3384ddae441427fbf140bbb043fc37", - "42bb7e607070777f3696f875459987225595f831716134594c11cec7f1a89759", - "aec31bbed2c5ef3015a425dc467431b6d8c50a4d49159ae1dac10a6b95be9edd", - "77fd9c06fe768f808bc7626c91985e5881c0f3d6d72f8b41692c278908623341", - "6a9cc45aa8a02a8b2888f30f928dd7677ac2f3965a72540e4c35e4183a26a0ea", - "af05c7ba1b6db8e71aa9821eff09bc0882e3b5594b0f18c688e70f3ebe706f4f", - "129d69afa52d5b795a2e962aac17d45602486874bb50037aff651543cdfa2673", - "1445eaa71a18027897906857bd6dd14c36ef2ff4757cef403da7380d4e7ed94c", - "cba04fb8e5d743a4347c4a8b86cefd176fb221dea394340193477ec0b6aafc04", - "45ccc3eae01dce86cadc6ae1a6c59fb39eedbbe23cb350fe848fae15991aeeb1", - "4ed8c67b6192c5caf8f914ce0e22974bbfba13122323a99bdd1262f3ca2666d2", - "6d86ba861240d0a1f4956e3baf76af0e06ac77dca700efc0ecbc819cfc6355f0", - "62bf0c771811470856ee51957e79b4290bc604f51341e597b8170ce06366c2ab", - "3a217a6811f608a363bc0b7c6a99255497c10f97d8a04ad830a53991bb34f68d", - "90763c962b9bbd651b28557223f6cbc257c995c40e11ac2fffe98ca342ab5ddc", - "d43675eaf89518a0dfea0f4ac70eabc4b377099f41524e7d6adfa12bd35e5a9f", - "fa7a4945f4c30ed2d2adfc39e33f6641477dd607c9256e9b42e82e2a8fee7a2a", - "e37645f8293848380f2b648436053071957fc3d55c6baf0b201e41bfe3d46b5f", - "c3c6c8a4ec9f4c66eada9e1e28bc31c347e92f0186526a44312b53f421adf882", - "5eb5d3d526d4bc2fc9f3d70275f5ff77c4671de98c98f0f7e6edf740707b3ae8", - "43c86ee5bc909704a4d02cc949744b0d20fb5a0cd12b36941d457d2aca58481c", - "52d73d480ae02109ba2296e14c443398efa5efe390fcf4821704325c71a5769a", - "cc9c7606d3400567c42ca06c740a54eede0b709f691c0203c4e58d712751e9d5", - "46bf1502521ba187b76ef531af5e759c737b14f92d9a3b7c2ba4946d7972ae19", - "a46d6125c2f7648ffde61cb13c56190dd6ee6b4d8c662d5a06119d12dea3fdb4", - "c06ada9c01c7aa3cfe46403f36ccde249a980237e8d4c8d8066117d0e465b090", - "ea259b4085a9b3334c488910adedec1dcc75f69206d53ee34d31adf241c82d0d", - "10ea4828a8a866b13ecbbca42adfca9b89f23577e8bc852285c03452d8d6d1bb", - "f59949f84821f909d64f67f7ca3a806e070e3c412a21e702d7a7d885fce394f7", - "122cdb8a2a709750e5bbf1c4ba072399d668a1ee4da6dd4b6e6b228f7f80f963", - "21c068d435ac02255a70fedaf516f6baf7dad3c7d198e5947096032ed95f101f", - "d66382c5a1e3a925b41626e2ceb7d2d06ed7c043382b3352e26c9a3947b1e818", - "5928223f88ca8b9ae8abc8501828c76e9291849b3c24e3916f9aa468ec6fe7c1", - "d3e965f17eaf0292d7b55dd03f5d6382f993dc04503b0bddbe85342764a03a51", - "9f2f126d0e4922df7300cf9de8ee1f64431a95cc25b270bdcf73a0d18e76706a", - "fd1b80f86efd23649f68d1ef90e49f392494f8d55a736a780b840a647f901225", - "23b3e3c1ce88fa5bc259df79e85ff5e8ffb979af972948fc2ebd2453bb770a04", - "1ee40502abc198b18aef782d501ead8e98ad16fc60d27ee41a4471fd11f4ead7", - "66e91dab752d3ad960e7c07dfc48b20de08ca25ae079801379d1f356c6d8e38a", - "1ac51f36f41b0b53240b1821df7a5e9b1ff1b83153b8c9ff27650d3e9087b675", - "68d6aa1fce80acf4ad649bab28a32d4624e7a69cd25524c1e82ea903de0e59e6", - "4f7702dfa37b3e396462065a9d2e3c647041dc202da9868769fea9f8d0fe2ba2", - "49f051e0c0fd66679c8489a8d460525fcc684f611aa2229b94f3760548675521", - "70038a4ec823394be67a234d6dd055ab91b274c2e7fd543813f702b28f81ec77", - "7c70096a87e6c4b12ad431aa674442c5a567d99b0226cdb22db49d22c3c2ea07", - "7c37ad6d8515e6387f481dc2cf78da353b91552996df5cea3736d5f871b37b0e", - "82190fa5d4d2f247bd2e617fcf69ee4fd850ea2784ca1d30f821af98711cf997", - "0a4bb9a7f9ed8727f4745384a75b8eff6d2129bda64e52212106d3fc459de3fa", - "41b9142cc46a935420b1f7e25069ae51132d29e464408c7e9d5de7480915362a", - "0ef6c63e22e7dfb9a815e787968e3101b35a9b8b79400b97952f1f3086af664e", - "1bc33a51ce967080827072edaa7865b5562340465006cefb16b717f088e191ae", - "ab0d218ca343f9d4250370746c64fe4f4a96366dbebb40c74a4286b0cd57b9e0", - "3ed8937fac446232ee1b9aa63dcfce6996eca404b8e4c438d398c69f8e06ec3e", - "2c66c5e7c38b7ed0ac40c3631ec25c1af6c8a9bfde40bf1e0eb833b71aedbc54", - "cdc7a9dcb4cda8d8baf2fd522061ce6c2691c03e49b047746576d424b427879a", - "311fe6cf0a0169e39a21165adc529a2ff86615849d2a4d510d74d6ebaaefacf4", - "a674c7f35f26912065baaceea6abc2a3590fee6727b59337fa6b1d6c7c32f34e", - "af77d94f7532f7ef23d2c91cf39205bd21c6c08a1c009c85d3578709549dcf8d", - "d4bba9b1d51fa0d789af811275cf5cbfac0b273940db58cb4be5621810d82e6d", - "2809f9da7fcedccf99b88f5cfe6c5778a7356687794c467c2aef13d596988fda", - "4057faf0a732115b5924667e59a32caafbb329fbf1507d22e4353686298cfaa3", - "ecdac624462ec9a263c07b15db80e9c1439dfdbed0fc1b613f4001f528f553a2", - "208e2aa048e5b67da3b53b772573f3fa659ea972d6c4879695cf0d5511ee4930", - "fdaef77b60047c2dea77d1306ea0d5d1569a2504f58bd6fb9a5b13e38df1423b", - "cc96c2be506954b5fd050659f7269d919f1844fc145f928f975cd100f58ae731", - "b110395be5a76c25050e29930af588219518a167cfe278834c6e8501f7018b47", - "9ece6899671c9e038fd9eceabb4efe4156bbeb4af05925dd70e9f409833e8920", - "14075a3af3614b71bdbd40edfb8fb5b11b75a19e031b4d1cae93970d2a394340", - "8af10b28611f3cc0bfba4636eb276b584846b87dcf916162cd8341c62e1e36bd", - "0f1f4ea896a09ba04ad445663c48c0f6ea9b5b62ddd4c5f379b6295a979f3963", - "0a13d7a8d530d5de500c274ceaf420e07f7689c6b3e60ed9248d1620df48a82d", - "eef4e4fb180adf16f9d3fa348e57c475145a737adf01b821566d6d6c37e46217", - "32761ded0eb43b66bc869cc641d872acc7c6bf384e4d0682b0fd22a07a16b7c5", - "82e75b4d0ca7b63cc38afaab35930ef26fbe6836bdb53c2c196949d627f3634d", - "487429ef935ea0c925a316e8b0dea79c5cafa371863a10c10dba03bad654bbf4", - "340a88222ad84e0d3f37f9de116434dc45b0bb07d3bfd9d7039df7d0cf033712", - "2990d7b5a86fc4122f7fffd44c0e1f7ef71cec2df04bf598dd211112154ccd69", - "9fef1ed1f76e8902d2bf913a6dbd631b28ff14d52fbbe2dd171af1dfc8014003", - "0a2abded4f00462e116bdedbf671521cd3b377d74674b38142de0f621d2376ce", - "3970ddbca109e4e2563aec50028831ec35334f4e124dde9115bfa41c48edf1d4", - "784f869267ce6ab1c0c8f21af2cc91572696f2ff8349395f80c99a9484998fc3", - "3eca32c221155b77c22bcdbd5627faf6d7b855efa02290c8c9cb33d772cb0472", - "b1a9ffb880d4fb1f2385b754ecc37812560f45334bfd3d2db7502eee984f6985", - "4bcfde0cc674f4816a59b0e8e96482d18109ffed7d37607ac9e2fbb04048bdb1", - "fae1773f2d84586f01fd4df60ba724ff0ab97eebc54462c5a4cf023113bb8f76", - "ceb52c990fe868ce19c7d0fc61b9e280ff3f08389739719e63898acb4de729c1", - "4bcdaf88e3480f0c9503d9298fcf57e24c4f36eabe5ac550e9c86d5cbe05b058", - "a88242fb7ad8761c12612e6eb7994560ab548eba5047f8a9cd5218fdf069fa5a", - "e01e6f4b1a621db552b1957e079bae3714c35356cc9570e60af0aa3ef3d45fe1", - "0cd5d689076e448b1e7fb115fc71308b28df704fac6f4665093a773b1835a0d1", - "a5dc57c5172bcaf358e7d056d7369a97f454e01bd93405829962cac15add190c", - "67332f6f66256b1412ed4391e939a04859dd98624d5289899b5ece8a2898f4b1", - "e9f972e68ade92d6e261cd93270bf0cf801fbe161603889f9c1b73dd1f11d5d5", - "cccae1127443a1c4307ca07e0da8932b7b84fbacc580665efbe232788103c689", - "bced9411293ddbb4a2590fcd3a2705198117eb31a9e396498b840f98fb812643", - "255e10c4133a75f0cf8ed909282a72c55e9f9a5fe4d062228d268aa63b30dee7", - "2ed1a51654f51d98bd61f13dc8700debddbefa66cdc9a7b9c91e6f0676ddc1ff", - "36c49467f87a2d41308b179ed9a8532d658966d07db28d94ad8b9a43f3e4f755", - "391b3260798dcc967b006fded5e54222d65141a61c62fdd94584fb807c41fd19", - "99928f8f2be69c6d98f6f863e1e0e1804c2ca2416528dae034cd93d7786d872d", - "00d5a10c0787b978679af6135eb5b1fe944f628c5c62d2b44115de36b821d65f", - "0d243d8fb59269d91f990b75ede8cc2952564ccb4e2c33d915f10d237c1a0710", - "01146f1dc8016c948a1f5288cbc6f8d1f157baec1d965899a4d296cf43fa6641", - "0586723da3f0c739d039f5dc43e56b6600d55ddb761098d8f938acdd35635669", - "ca6df056c6a217fb0f6180bf573c2a0be4fa6fef825177a3037bf5730df1b134", - "a4896d1f8d212d7cff95dd57871e09516648dcd29b7238ff06717dad6dc8c764", - "364bc35c223eeafb63a77a3fd41c09e60446b6d9fb5ab7f3b0319317e10e9497", - "e06db6997af26eac08e35c91f5c54907fc6a7ecc4d6a7723c8787a1a09c51c4a", - "072c0a221891de994155ae60d1fb04765d26c7e452f8f98f99ccb20eb6b8fde9", - "bcef93fef6fe5fada8edd85c296a79a81d1398d4a063540bdcf6dff3f28f5fd7", - "f1af1b77515c054c36469d6789252a4be6b7f5b81984af4ceb38377ba361092e", - "89ba2395218daef286d480a79fe13d7816f175c8d9dff83790192e1cd2e413c0", - "5bd71fdefc6b5cc75c4176005a37b4f8eaec74ec5ace945efd72f1ab4eb24c8f", - "89de2faa7e6c7ac99968f827535524b5d0be4976d45db18623de145eaf85c3e1", - "00580e98f496333c22ae0539828277950ccbefa8d78b009e0c2788c9728c1dc8", - "9397462746141b6383b7de346f86c4747d9e3047cf3ce820e18c4ee142f4e46f", - "6e7714970918a00663a2eba1ba5063f4e8235a4578512728914d097b190908b0", - "f66347eb0ba2116dae54e113bc29b02d8f2c0f5d826aa047196b724ab3f12c47", - "32ec9bea2b879a43fc001c9916590d3a38241633e8f707521c9242991cb9dcc1", - "43b36ca23edc2c0836ba5f6768c3ae5e71bcb1a9d2d4ea83e0b25774e8c9c1d2", - "6e268ce7de25878d91cf80aa589e3add8967f215383b320ae88cf105e151493f", - "159e8357c25237742a04028e71d1a2bca487f2a48e3634b4ccd52a56f9b6c22c", - "2cea878af521aa07fe3d97f058b7e978af949e1494cd736035347d71d34646af", - "58b71b8536c3427faa2d278066f493af95fdaedbbf25d72a60dcd047284c7396", - "4ae772a5a0aad4909fda901b8fd6a6d7efe7640958858ff1c078598f35f0b649", - "ff6d3a896a8fcbcbe02397abd2d9bce31c755740d5f5db0be98dcfc2f0bccf42", - "af17d941ee565c02bd93fad8d027f4eb77345479d61aaa08ca63320e230882b1", - "f45a49cff1531faf523af44f8f62dc46fad2143d18b03eec5af33561a49f17c4", - "83378b2446d55b219c7dae6e894cf78b3d7072310ac8cdd338f4674a176d8321", - "2e070dcc0cd71a194750c1fbab2bd204305cd50c31fb9934f02951c25388ab75", - "a34986e3e438080650fa4bfd341403e110e974663450e3e7294277897944011e", - "6d06a8fa5a83c4902f089498e1d4d2127e9aa6db64708a2cbed8465a6c768430", - "b07f60c8995b55a28efc560f7db9886eece90c784e487d3c44d52665dd3201e7", - "8a08588019bd79e168b23b0c502722076e500864618a87d01b1a4b7392e04af5", - "cc2f7c6babb9b260c459608a30d26d1bfb9f4cfd05eb473412b0a894a8c1f761", - "ee6c22252dcdac258ec6999aed2e5d58fa0f0b6196dd13a407ae7f8df87a3df1", - "f9b0ed0cbe1b78d96902d74df8f96c74ea5e174e399922a410b1717321c4633b", - "5539bc9b0bae45f4784c2c4b12a70ebb0076c60e2167eeae562722bf983f1ddc", - "e0b4b244ace301f1699cfbbce4ea6361aaab4634766bc2228d270f1e22316348", - "0c49fe23b6d0cc069e4b4520fe6817a43cc0059f6f2d885d61a02d7031dfc789", - "11b8780587e3fce648b25f503326868b63484009187db3e95782790947421454", - "14045bc80358820cba026b660d462725c6b6ed277864d8edcb65e9b0a02d0e3c", - "6d21a9faa64b99c4623be358227ccdfd0cddb096905d775d198120b36d5baeeb", - "0af3ed186546db7a70bde47b8ba7c7b4c13965037deff0e16777092fb45b629d", - "cd635c4cbdbdc88d05bf8a502868f4390cdf252da00575bb4baf1a36cb2ecf72", - "ae322b2fe6e243078706749589578dc4c4a83881ecfc394f197a89f69ee5a93f", - "b6459021da165d1602276059ff262562d1875f80340218194aabcd99ca2b8caf", - "3f20eeea103a4237b55de28674a6c63bb6a0c7b26c0e6b0a69ce1f7d0073dc52", - "325223297959a9a5b0b3a88dce98841c2644e0b2541f5481d0550651cbbf08c2", - "8f20a7c8f82842cbe1028db2ff6435defbc32cc15b57be17b4c79eb3c49315e9", - "43a2bbf02bb4658a77facb6f6f6a87c11790bb466786a506db687c42278d170f", - "7c2c6bb60a581eb4933daddb388ded52c2193311a22352443cbcd061e33b0567", - "518ace2fdc0262724c36001a6a34b88b395cec447c5914ed6f4621036d57070b", - "8d26aa721dc38655a3f082492bc4b581d14cccf100d981a1fe93777747c85e96", - "a2347dcf9afe765833b0eca200c22f69d740e02fa103c963f31ccd7463283687", - "bc4ada35dfb677b25ae5091307f15291fba0a9f4da6f1190580a32433495e3b3", - "f0748a38b47b67a28252200a198cf3b07ef80681268e47ece630b7883edf9bf6", - "f5e1c6461407bf1767ff11d9ca075a31383e9de993807ae8ae79d29e1842d01f", - "57fd496c27ab63e75a2e8e322782d06a27da2f73266caf9f12f5d1e26516cbd0", - "5b83ef5f7987f3973977f1cd4934b6eca0df68e7b975c00adbb7b2016ecc9cb6", - "0a82fe50f3ff035b9ae68183a153878da49c039bf05802813cc0213b12cd07eb", - "ae7280f7fffa5c51bc54804f6c2ea16a8390673475298ea10824709c86f8414d", - "499f02ba5b766aa09e2dd2d0c36d3c85209c7ac59dde4940c9e2b578fca59db8", - "556ef39669168052a6ecc1b620bac90689b546fa4ca2476288de89ed994438cd", - "09eefb84b53a2119790edf012400fef0b2fb5dee2b4cf2d2431d372df67dc07e", - "49f2f88ca359fdfe1a7f5e47d060db7b96ddf615e1d89c9b9ff20db503404b9e", - "318edcff3b97551eea8c073de0c616c4385a1dea71d72c3fde7bd9ffccf65f48", - "71958d8480333feb55327ac95b4f67c653f383d66dbaa97e0355c4458233244f", - "e71e37d0470f674d3101aa53190148206ddedcc3c76ff32b3c7e515c790c40ca", - "ef9aa29215687ab39511c21e2c5328f66a71ec74ff6566fe3d877a86c7b12676", - "ba5d9a17fb3f41f3297cd9b2054c0fdefb02faa8d65357fab39c00761c04db56", - "f6d5f369fc2cd85bca582dce4b1a027638828cf3678a0979cf18dbb38b4cb00e", - "7df9c19e4b38341ea99164b74fd99cd7775d6f4ec5096a66c6eb71482c5c0630", - "e327dbc07cc3c93bdec500f5fa0b6c71dd67052c4180cc3fb1501ab4a72615cc", - "94c6d6deb77222a1cfca9cbde5fb7441db4ef0ab3942e9ef424f44b981984883", - "8e7bf3ad15b1d88a315f17d2e83f8011f36cb6767228beeb28f830b501bcdead", - "57724e7c777d10ee7aef93bb358719944cbba5e487f1dcbe133a7ae658d8bcf4", - "454e2cc6542cbda0c13d72306fad1aa5582990b5e10c7848f6754bafe5fc3d0b", - "e6eded43b331f4cbaa57d5da50c2384c58743a073957022f62bd95f12beef319", - "d5d8e19514c2c6a091d637a3c44f603c15cd22ee99fe2e3a4d2cda8fac5c4a2e", - "3ac39927064628ad96d110979596fba2cec8f550e226b1a06990c45f59e723a3", - "73e30e90fddea80ef4124b95bfcf301a0a251df8e7b20ef145818652d6fd158f", - "e191f316a7e3180ea0551bcf3e44eb86dc6703ed2e46c1f92d6f2351d2fbb7e8", - "93331e5dc4a95a0d3351fd27dab397b9284f7e607952c368ca27a1fbed102f54", - "9904429cae2aab88f563863c90981b29632db23f5002cbfe180669813dc6fbe4", - "d50dff02f1d33f2298d7d65f602291c5faff920074a43fbf4f87b4e3071cea82", - "a80c7c3529f2b2ef0998ca535f12041601af21047f9ea1d51d953d63ac2c1be3", - "5df67a6dcfaaec4e971c7680a2a745751a0e6d35e64f6b76fee6a0a58190c740", - "83c232b0ae434a3a2d9f1d2224daac5131c87920e10a9dc4defe5f5a31fa06ac", - "a82b544a61c6eddb5a9773275bb9152564218168a36daa5493bbf7ac00168dcc", - "e664d3628af37547bbdccfd4db81cf75a0abe1e841d332e20cac18905d28729f", - "889f3a6de40584bd8ce4965e05419e162d231fdca561b9952d91b2e0fc116c05", - "d6cfa1d8ae4716beac0bb60cc47637f906990da2ad845fa15310492dbfd26919", - "ad39f55f6aa24efda3c910003849534e9c50db5dad99d09fca9b3854b6a96390", - "4fa42efed873b885dab56f92775c6ceb7e2537392b1a78fcf7e535911d72e9bf", - "2332207786c406eec4343ba81a219e0bdb05d8bd1610cd9289d9d57cbb3bb49d", - "b8cd3653cd2b502cbdb0c105f567288572eb54c7df032cff8a468f0432183ddc", - "e47e8dd41d1db769fb767a34b9f5b868f5e76302c8497c985b2070931465d9c2", - "68b3db99afc6b063bcd6149bf6639b8b8f27d228b8d50857db7844cc8708d310", - "1ffa8da82e25ca115f8f6a6c921d5faf828ce66f1bca008bd74109cafe85919c", - "d5f78d2a85996365a1b91b2cbc15bc21666fb1f8bc9dff326c21225e16693799", - "3828544836805a443c2474f2aeb2ded8c68007375ccd9e94b5ff07410aab9c4d", - "82dfc789eec42b49700427a180fb4da5e5d2595819348648823eb4961ca797f7", - "199a19aef3dc700013d72f117f614af0e14ce8465a3c5fc51d5b51efd8f3c777", - "aead2ae87d6112cf1298a3175bcfccf7a4d27b67939cfa1f3792348854536f3c", - "be77ff7483a4b1977509ff53a64790980e4cec9d8e0a4312cb39d973df764059", - "4caff52bfcaed152a160ef79e7d2f8e11b1bb2c6589c3dbc60625e6c06e82aa7", - "64b1e9aa266014c79a92af9cd5a81b8a516319eee80fadadbeace22bf2e42acf", - "b7d47b1c5a3bd98eed0a85b5390554e3521475deced294c4aa47393cda883ab7", - "ba6672bca86681868e1ed4b78d013249c5d566396327135902c5c1ccb7789921", - "a5d00af153a5e39f9970296955588727485ebe00da2700d4bde0da4615d900db", - "1cb01e8ae1dd515417fad95aa1847262a150ab2a21449523de4841a376e4a62f", - "3cb846cff5c4cdc3b78587c2c8402c4a55a64622cc0f2b2ecacc40dd7d4f49ef", - "37e746bffe3ebac85d04ed2a7aba610e554fed2b318c0306a1f886e070a1d38a", - "770d9c366c740db0b6aa63fe7da30f44fb2c860103b89e30a8938cb297d402c0", - "7ff5429134846dc548034a93e35296bfe923798e67cccbf5d29984ce363a1a3d", - "03df8c796d8cd390844ede40c37f64ee456a0bfded9ccd0edb16629fa86eb005", - "81c0d9dc26414492e7d6a924f9d386aff27ebdf6e76c4536c1b257edd7281498", - "191b7a656357c34061b69fe74a272a507b64af454de8598df1dab82f90008928", - "2b5369c22136297b7659240dce3119a9a42a255a8cf19c26c1ff263cd8d7088c", - "6631265a65ec70b4dfecf204ca6216a68907e437c5e659ea5afbd080c25c694b", - "938241638bc16531a486b5fafdc025ed42b7e582ab2c06ae7f9481d95ac52c1c", - "aa1507834f3472878edcc958c68af5cc34564e45d0128ccbd79bd15df553756a", - "9e98e4c86fa3a5834b78a256891e5952098fac57ede035f47f0640e05f7fe7c2", - "d03d52a4cb918629ce64239fa5fa58469424b3aef26fe94e7f52518fbc92be91", - "6d2f2f78e4584ba23920ecf70987f601454f1d27a808752e453f2c19bce44765", - "b9b814958c9940b98f13cd49bd79df2b1d61244b20d4ae9a418fac08b2063133", - "6b4e717fc810edc1fb785a6af2fa636646574d561fcc749e2b58b1bca2bf48b3", - "48bad357c7a01c7c62800215e3a2e8e6492665b1b878336c4b524506d32fe256", - "18c4e2d78b9890567fa29c77fd311bd508931ae2d7b5d2bc261e99c9c23c0e55", - "e368821b8bcd2db233dbb66d4019c9a413ecf1c4c23da054174b32c2ec71e229", - "aa4dfa0a1060bce2941f031a718fa94b7431e39ede1924b09756a341f0ba7716", - "260cbc2dc6666ea111a9af7fe539c90b15f9dac314631da3e5361b05a9a130d3", - "51d30ae45b6f7bd8cb604d98ab9d6a9c54045e48aee017e904b47151d99105c4", - "ecad3c025337fd3a05d86319d15fed9e5d0f7225bfad5a3b020da8e1462d581f", - "409249fe5a856a6d78dc849577be81d3c1806ff3e49547307732082d02b3efb7", - "ac2e69b4aa4ff62e0e87aa89f8eff4a5ce8a9eca0e1e234acbcd6308b9bc49f1", - "af2085b43ce3905b53a812aa375e4087ec506f767e6edc013b1c58f5c0563388", - "58f4cbb05fe27d46fa5a88ee9136905b444d5d675e3246028efe5e7cb53599a2", - "c635025a7c5d73a1d16cfb5b22e41a257699d07edb50f26daca8f06f1470e77f", - "9fb60e355bacbdf82d7629d455d24ccecfb608d14cc59a2c47c4554c8adc29ae", - "37d843661dec2823b2129754bc6b2e4cbbc7f2eeb08d3795e6bdca0749bea926", - "da3922bc932c6ee81211f0ea5b8791c74d6db67769a103ced86d7efbb8130662", - "2f137b7d62d01f8179eb30d84d50dc3fce6e35f7c01e70460fb5ea527cfd08e7", - "0a00c37265cd9c2e2143316647fa8ad125e902286129f712d6249d8712c6eb73", - "8942b7b36f7d4f694688c2e9b64f164794d58ed340d8a83cd368d3783187ccf4", - "1d4c6b0991602b3751054a00afd07179364c4f3283e8ef77cc86f737d0762cb4", - "e364a9da0c5e643a22006498505620f011c91b69b726def71149c6956115201a", - "a279b5fa78c5cd4f7af4b51c59c3435370551b0c1304478441baa6d44ff04af1", - "d7bafab12371acf547d210a47fecdc6d273880962e91ae7011e517e767187312", - "8d3a5ae0e70af15547c693203e4575f440b9c3b22202457eac1529f5a1ff6c83", - "7cb120e5b7dcc0d2b8d9297c9a3404d8575aefd914b46ca5d114e9db34e924bc", - "357c8a2c6a09a0bfb2f425697cebcce0d1fd45b2bbe8f1de6197dabe61c1fc7f", - "83310a96d7273b237cfa82582a9ab1175526b3e135b221f7cd5ead6ff2761c03", - "ee29c3dc29bdff116799460922ff7df4ded7c4e69bcd010f296adc29ffa8025f", - "9d458cfda9b59575ea4337f95507a5d61a12128d0a995bb5c8c169f3b0831d43", - "8e8afb867e80299061a200aa5b1ce0173df40f07059e1976f11d16c8eb97c241", - "1392284dc6d30339f48f0f4d6eb29f3856e819c15a72792412fe19b24fad51f9", - "5e621af17d7f45b882a2dcc31b6aa45c278bfe73431ee1c52977a338bd92acc0", - "88e5d40e013f8c73a01211281181b5bd79656ea6286dd317c3068dc85eeb4779", - "1c87ef2f338d52430937fde3acc0a4251d0496d7cd21177fa92c65dc964248c5", - "a79eba49548951200bf5898a97061c3197514958d6950151ce399926509dad04", - "b0c61290e14deb34cd9f61f4d590ec933a6672043897183ebc32b48974ced2ed", - "1b74a5681a3d9a472c9baa97d6a215845b78b832be7d6d2ac042a5f7c61523b3", - "569e93177f841d6f775a787101fe10710fe213dfa6c76dbb00e4cb15d87c6fa7", - "f7d112198b01bf5c13cadc9630b8e8f378ba82722c2f9f6eaab6262d7b0430c0", - "e6cdd729bb50c4539a87270a598b0c10b0f786019afbbcf361c9522756e9ca14", - "40876f3a71302615436e369ce4789cfb73bd4b17454e449c4ab16edccb8366e2", - "21ca3b4cd3456567c8c7b037305f6ea1c0165bb8c38f0ab1ecc91eb988239734", - "60da9a04596ea97289da05678e442dccaa65ca84a4f9765caf3e0c155d4c9abe", - "99c6f2f0b34c8a6bb90e2759d110d5610ed3a8beeb4e925e228ffeba19738e14", - "4e50be45fc265fa663aa9d3c417504f4f81511b416b9797cc4d4ff660420c6af", - "21539afa5136b386bac9cb1a9b8b43f6a4666bf26268e5af4c45bd5fd335a638", - "a9b871192e575197e5c9309d5146fed745925a339d7e2753749ac5d70061eaa9", - "42148a53bd4b5a0bf53da19a8413109153f9eb121b283e664df9b8f0658a9922", - "9e5303466ec726aefbadc80b92f4c0937907bdcb0c13ad7c5556e7c6eeeeba8b", - "d12d5a3dfc5bd1c5ed19e260f26f0217b135cb14af39869d1e01670c0257d5fd", - "882e21e7437d0315cce82b0ab4df3fb020b192a5c5453eadf2b0499d728d8ff9", - "90706e4e435f847f615e101f5747b56d1cda6c66efe8be80b068ca0f69615107", - "962b18d8a8dbbe5f32e8b1e89c65eb0dc75baf0d7a72a136e13407b9c1b0c77f", - "9acaf95717430ada68851504373260bf1e1218ee31e67a5a463dd1d988d6468c", - "510df522d978fef92efcb6c40cf5a1e20f32f4c730fbd56ad073791470157813", - "b7c2ae60a42f37d1043b6af7ef11f03476c175bd9dc9019c083764bc3d7edada", - "f37e2d0a3288280573a76273ee38f30a30e8fa8d4ef4543f3dbe527ae1b7f27a", - "d6d46c7ac2680d072d88fc6b561fdd14dace2526fe35873257d29bb11512f691", - "7b6b158388d5b42f11160b7e5ff7f14590364462dbac29b8bf13ac61be77dbde", - "7c27ca7b931d7105314114031b002c2f44300579302450b67ee6f8eed48a5c47", - "6d702faf62768301c19ad4d964af1772438fd083aa09d37f29f50ea0d3b14847", - "23a053c7c05cf65e7500a7a9e8226b659405a84db9cd0a25ccf166e99e034838", - "6604c613858026bfc6a3b04be5b941cdb378a47caa5739d753d95586008e5754", - "e7f7952af24161a78961301f52d336e191cce99b1842156a09b71d1f51fd736c", - "a3185724ec9d463d86e86faae36b4592498d9a61d29a447936f02e0a4419dbd7", - "dff60f706053dbebd0ac5def55cf57fae4cd546089773d9374501bada7f5fd17", - "88453f60a29512b6b74afdada1442c29e35606944815a7f2db6693ca0da07062", - "23fb3fb222d4bafd2aec29010817272a072d9414e7a586d6e9504c280497ffdb", - "e7e83b2410f34e69431fc2451ffacd17298a1af4c8cac5a5f1611ffbcf3f018a", - "ee3c6fc80939c84539017f8eb2b4bb70e3855d4fe97c89dcc5fcca5cba7f4a53", - "6017f202338f6ad0b51e6e4db28ee0120417168f283785bf1dee70f6586e6d7c", - "cf123e08485a8d5f284333e63f6756e186bf68609959e2e59721123b5efc625b", - "819688ae47749886e4cad03130cc66633e0dd7ae99fe330622c81133ef8bec18", - "98c32ebb1691467a20605b934797355beb2e6f47d271223b6106275dfe508f9e", - "e2f10ecdd29afb001cd84c3c0a2a8ea70e89bb28d2911d0edfddf499ffc5013d", - "07b8a34f4651bb9678751c789dd1172e64246a3c2c8efd876a2e7ac880a7a08c", - "521f8aa61437fae5f65ca8907cd2466dc732f6e670751dfa0550edbe573dd07d", - "e45e3ea752f17ec0114acc438db1a235bf722b5a4b977783202135575c8c28dd", - "1323b34b4670cd8636220c4cbf3f506f941e355f31216a5bd0204a027150d79e", - "e06904950adbe9ea9027e2f06dda2bdac3c9864cdf801431828dededb67857ed", - "9579e881b8d596db1b5b604bc1a2b83eb7ad8352e1f4076cd3d9313ba8e8c23f", - "c6e145791fd9d6231b3f25d07de06317ab56edaab888f7b925154f18519cdbad", - "7b1df3550c3beec5af66e88bcc9b8919054fe0989e8a1562c7e60f73ac784de8", - "83cf1022abf57ca2c3e78f6265054092d43919b20bd7865d5c3dd763c1deec7e", - "dc1cb04ce155029623979a9bff788692b2d17d1be0040b4bab9adb5305441cbe", - "9cc8aab564469587001bed1cc3be5c453bf9c22b5a6c5862966b6d2425934fd5", - "79d2808da1e6bf68b45aceea88f11de8e68bbc89ab10fe60763eb46e373fb6a2", - "953e71b814375da04e695d1362396b899cb96f15a450a5121ebb2b215d5b09fb", - "a84466d17f43a92b2516be3b382217bff52227e6566b8b38ebe7672f73a0da56", - "6cb313862063484d5172cdaf0ca8bb5a2ec4d2fa9e58f3d63f7b857bf471094e", - "45b923cfecc80764290b5eb2b9974cdbc56dd25609056c0c9b2826bba72af7cc", - "32bda99cb4d0227e2a09bb0773e5d456ada200db2259559c517743d6f980b519", - "eecb8621cfe78a7465b2d208d533ccd0f00f4e34b866a94de04c6cbd229e968a", - "863c6eca776bc11d9b0abb4e9de44436de13374170612a704c73ae41d306f1b9", - "fa41a866e922c9fcea1e5051434037d3f82c4bf1a5d7252ba702de20e6983556", - "c2fc6814c02876ccba2d881db1a3418fa82a18f9f512c3bd555ce29344c73e0e", - "489e209d6765c227dd76de9059f8a03724804675711ace038a8a799331aa6740", - "87f0369ddc1da47b351f5cf72d6b77267f8f172e44507ef5d2ddb0981145d82d", - "1fd20326fd4f2aa855bde28f7b1893e2cc8b3ce71dbaf592b98b4e9dcdff6453", - "630d7efcc7720208c99511b2d25bb384694d40cf9aeb9301a7889c6a6dd32869", - "831aa42b439cab5612139e4f68d87c637d1430223b0cf371d3c0dc4ce3558b65", - "d4a870a63335ab24e6d760c1ca99a8c45a41e6aa1b8c67b8638ac32c8936c12a", - "80a180eed699881bf948d3fc1771fa43140b25434585c7b608f6a9a301841c0f", - "0faac71ce049c6e73d94d1efaf13e11b4d4ed26976de6dc746e8eae2a949d9fc", - "e209a284437f6c124431f53449daecb9b72b63d19798ac4fea95c4b6bf10ffba", - "914127ef3b7c71a4123d8d2f8a31cecaa92ab29368e794d96e123c7bb3ecc6cb", - "595f403e355be6417f55e556985e09d2ff63cb9cc62409e41a8e1544f74219e7", - "9629b60bf0df69e1ad2dc48f2417f426272730d79fecf90438a8c930615f2903", - "94a2dac51bdf8fcf1effed579b427a28ce6892623191286280c07e20abed66ad", - "dd3c5da03c869786e27ef17ebd849ec5003c103d088ef5fe4a6f88e7229cc5f9", - "959722fd58f5dc2270e6ff47ce0de57c29da77cf756a9ec3fe43c4442cd0e465", - "ee0504a703d2e03974bcac5e5ac1d8fe78e7100d05cb4e494e41233857f3e359", - "1f4087449b3b6d7b84b0472f21cb8cc4c38e424a45b21db9d5c94fad796bc71a", - "ae9b580b448a957eedd845014beaf86c74af7c8fdce11167c6655da79e68a03f", - "e3c095e9d8bb8faaaaaa2cf5ede622b97fffd13a4f46f4b0d8dc561ec26519d4", - "d077bf165ebe3756e6f0ec76b72c463f37f133e39ee470a39e6642adf61f12d2", - "015e8a909d3eaf414ef8999d0b137b5f4449c7c870cd64f4aa765c624d7548b2", - "e92e2ec2a59ff17dc9c0259af8d623086f5b564173fbe2a36af3cd7a9fa29f71", - "753aaf1f91c2be5d6cbdca9623b71f038ed54a0e4284d8309f3f22c4ecbddfcd", - "78dd67f0c414fd65815f15d4111575192ea991add3408a5cd5df71dcbb1d40a2", - "8de7925ed5fd3bc016ec177ce95cc3352a63415790381df599b01bfb5ab38e90", - "b3b853968a672f7ab914757b7ca45727c667c1245d82eeed196a13ca7019efbd", - "bc685719eebec57ff3d689c9236d21337de2ef92183975a322bafbf9b97724ac", - "faf07775f97af0c1bdd238d1e09d1b30381ae49cb024f361ebacb3882032974a", - "418487e0ae65b30c204abaa4ce44093e43cc37e9681b5f77ab3b7d8a74fcd382", - "e2990cc643c95d7d3781a34a93a47bd4db927b2b7848c69502434a8c69bfc99a", - "fd4f6b6136b520cbc5fb6639d6f7213fb701f556e200459626ae6a6098622bde", - "870c62140ef664abbec0ee82f1099bab5b3ead7904a10f5e9aab266aaa8a831a", - "799ed09926be7225212962ebe2127c65db419027eb8459b44a86fd13e82aaa7e", - "126c641729f5f91bc2ba3e336efc23b0a8f524434d78669e1c4217e62e2dd341", - "b07a7c1b9c700893dcbfd5b6cf6ffc303a80983257b032e97a34464ff541322a", - "ad1f50ca779eae4e68cf19dbf9d45f58ae86c24180e76e8a13edbd1eb62534c8", - "e56ac25d4a563c03ce24cff5941fdcbf8053373de9e671d5aa3e9924cea43ca4", - "94f304dac064eae378f40cb38ec98ba8123568430690542aa2b01edadd239364", - "2048fd3aaaac79b459127634b34f9a85c0e584e1452a26d7ea84e4e82c1df5d9", - "32cb82de79e79eb9dabce7b45afdf13bf6bd11a30666d81593b9630164268eb6", - "681fb12b46d6cf31fb04efe7751d902c985ef771b110c63db0c623a32bc98f76", - "b4289eba910f17fcb3cd6a634698612b6c30653183586358a44b3670d73b6fe8", - "80839a36b529394dbfad9c14ffd979bcde291e1066bd4345698af2d7dc7fcca7", - "8a49f0757519a8f8ae64e8fdf89f13a54fd8ee20fa2d7f0354cf1ba79588b385", - "7022fd48bd27f09bacee3e53e4b4d3931d66969c93f88e8f0f881658f481db6b", - "3c67400aea79bd144032cbb00a4244b58b06f725b9d3125b6495a8b1ae0ac204", - "a86bb84a4b1aa088af73f275ad87c536007b9957ee11e3c859365e82601dcd74", - "9c3de7a12a2bec237b35ecaf4de29909eb8c4ac89373053654d0b68504a29f94", - "0a5257c92e164918e216f2f16ddfefb800284029e6ffc05e369cc127dc5f0f1f", - "e2fa273487ec583bb4edd022f9d115e35afb50e919014a9fff5c5438089b9445", - "99fcfea900352aa6f90db3c05851fe3ce4c40de55277500c4744f73c764a3b09", - "a0135ea72501031d2b4c59a1ded34e5879f9ee71379108d1fb6071ba44169f16", - "f5bcaaa52c8e938af6f7955a3c3ef4ef1bd91ce2fe9f218b63877bfd7529063a", - "64986dcb3e227f59091e5e30bbb3c4bdc861a29043f7bafd3e300fac6d394b53", - "53fe3094fb1cb89e03a6c9b6acac80e864ba11778a20c5e2bfbb2506c59e8d1d", - "786af5b3275afb83e2779e74101a587e64ed0797cbb5f9e970693c528497dba9", - "f0a0f6439c9dad75e510201463f454effe14669ede8caaf7a6349bd63f151618", - "1bdaddfb9018122f583edc6696f62fcdb1b8c596227b1235cded114d508c3deb", - "6750d9cbc3f13b040a3bf787f9cc627b7c693fd6c5f7356902b97aeb6cd0d412", - "df916a804fc3ec1a792dc8c36ae93f6bce2914dc58146ad273391e12a3ce4f66", - "291bfffef6cd808547f30a8657fc0d5d3476dbb1263c331061290c6933b1da33", - "479090cb16fb92dc6cbfc10c9daecd50afc39248bc544041392947de7877c144", - "24a56416babb71fd1d499c7c5cf05e2b50e8149c3717f6b32a3d9cecdc60a1f3", - "1ca1321bc13b458bd1ded7389be74a5824e095d3535173545a73adfed8df3302", - "0350ec88782bb992a4aa29008901f863d87905ed32af059ee96481491ae735f3", - "52658dd6a76ec0008b03350938777e9fee5d7932f27522ef05f2674a3ffe22f8", - "9c6b3261d207069c75900016e1e04aa2079e9e16714a78c75a95cc3ef7e82c36", - "88a57a5e0217a679246810dba2f97a266ebce7f6d354a632f1799cc51160a017", - "1f48c0a0b9ae43e67987c4228eb2a2dc9cb40061b4399ece372f7786c8613f40", - "087d20ab2a1ff03a9c32a3f374e4293c9498b6a51a8cbbe916871ea243ca5511", - "6bb86899a15810d74e3301e3b1ec8a530ad8ef98dcc9ab09aa85539fb9d21ab5", - "5648da99960bfb66b36c578c86e666a8e6542ec22ac630acb4b5c7e3cae1d735", - "92222b2d4294f0c8af31a58ebe5a841d4a0cccaeee75458336afe27b42067d5a", - "4056d6f22ce0b90a7d8c8a12b0eaf462f5f7f432d25ef61f7dc17500a8813008", - "ae3dc26dec5c5497ae94f5cfdfb1cedbeee98ef21bb8eea702eb5d88c2a998c6", - "c5df2691b63bdbbb758f9367a3799bdfbf92f45ee87f2c47add4e0a24b722623", - "e04a3d9f3a075d348a9696cf3d3322d6fac0413249d97458b9ee7fd003f224d1", - "f84a741e6a550eb605774e331b189625c419de5b6f7cdd53d50e510dd57b3f01", - "0eab32cfd5f01854746bae93f0f1b62fe215164b974db1da58af74c470a9cf1d", - "e9d06f5a8c70b82e4de5bcb65fee56b5cc8fdbaaa3f6b3005daa2a64b33b9f90", - "e74ff0c2aa54c0c048ff6bb8230552a95c3ace4a5ceb26a359df82781a585362", - "dd3d84d529e95f53b7cb61a0de8082ee35988ce35e98a3397f3a8c05de9cfc7e", - "795ee40c1eebc98f2da3f71a0ae92bba5dae2790b341442bf5baa529e935a9ce", - "a88ee3f7fe64e39debb5e14a065d59df6e0eb42c8ce263420086bd7d62bfdcf3", - "56cf62c8afd0cc6399ae22e32b327973d17e8d2e29d781ad54666d6b35842723", - "e3800badeac351a94ccd5e9bcbae7e052e1847777c7a9c427af320dd6e973907", - "1a9e8ea873f5ad73b78bdf4e3c0ce8ef13880baa5542ea2c1e65f453709145e9", - "d58a65c4e5de1f8119dd66227f99ef7417b3070463ac0f40f0eddf3393cac6be", - "890408e42a8de3dceee9fbb39316cff5e82fb3a2b7ae7e0aada1a97955bf1c1c", - "b76d3a4ab490a5d9ff5bcbe7badff683e9e7e58495d3794ec9e58b467b2d7278", - "e5040f1636c9177cf35d9aef913112e11db193d7496e7ec5d2d7014085590fc9", - "d596d608c65934601761a2cc69b1685cde4811568221a9f6b4532cfc795eb4b4", - "0d5b3521b7108b7bc761ff553ebe4b7987151c0397cb7b1b0961189aad0019ad", - "e5084c1967e69e19ac0f0329ee18708c655f8609c215da7d3a7874f3f4833ac8", - "28b80020326c6e311dde6ba7a8b9f674bc39a640eeb96f5104ecf81f627d7c1e", - "27e38ed7f6e8769884559ea26156e561b6b52eba318e11a35cc8031f7b6a0bd1", - "47d4d083a140a7af678f08d83a718ec0f4be99dfffa371817a0e23f954a70ce5", - "cdb98ff6fb297d4ab6cb5209b5c6d044a800ce46295acf9fcd8d030dcb009a63", - "a47b843bc53f6edb901359003df5e4298ea438c4f09780d5a6b79c7770316d54", - "c21ab038fd0678e5624b2ce057e1bd2ba77806d83a84cdfb451c8cdbf8ae707b", - "0cb4e14d40a1b2dd024c401a5344e0cc4a64321f4080ba32b4e34b09dcf08785", - "0392c9c7ed2213858cd8fcade8de0651b2f06332dd9364aa9f651c026db4449c", - "f56b2fcdc7224bbfd69728b020f4c73ee6a72e1c6ab89b4811dd1c1619fa2c7c", - "263644a2c9288ef2131329f77f2de259e8e5b753215bf25fa33635c6ab32b11d", - "627e614f410861d38431aff8ea923087ff05e0842b80ef802be0e89b5d90195e", - "eb5a0153c750f06abb71e610e5b99f3a75693ffd4afb4d3eeaf10d1c60401431", - "d3f7a13b2f3a7f69526b6c8d58f0b4b9ec4754c5ec3740e1e6f082af059e8dc3", - "c7ca2533dfcdcea2f7183ab23f322be6b6e50485f3d3e36c5f346aacbc6282e7", - "ab0dd245a74f8b9cb02a97cd4925fc764fdc6d3986da9809682022e1891b8c07", - "d7c8fd266035339b573be433982c0e235f54cedef38774d23baef89b1a54d33b", - "b6e0551d80ba9f5156667a97b7e56bebe5a5f3d2b6e27ce6cdd6dafe20a33fe9", - "69d2b03c1c0583598260eb1c40b19407e3b88624920489ee738faa12a2a4ae4d", - "5c791748ab6c24f35430bf14df640594b5835015d02d8edb47dde1062db371b6", - "080ccdc233c4ce279fbc98b64523f114467da948cecea4ac604a5c865bb7c8a1", - "a4bd4466b5785ed3d73f6518d2a6545de0c7a57e12bfd77efe707adf716f0587", - "5fccd8c75a242032533f4d13c0ab9bb91bbf58513764de3d0f18d11f4101981f", - "f7c7e0e133d4bf3bd25774bc3fb3a55209ab0177833bf08503e1c16ac1fb3f43", - "d8c4cf9d76c2bb6cfd9421c851a0b8b6094371a33c39fef3a8a49345779ce2f7", - "662d4ebd13bc806e67bc83ca2de9c859ed9b629e8961a8e6e42dbe2f5844244d", - "374b058b578bcbd09e06a3d47a20a37666a4673e36ab98523ad24ecf517cd3b6", - "680de776e04b099b31898c1cf366848b98b81db0c7f8078a5d6ec7cf72f35929", - "b0e083c816c96f54208b20482d2ae89f08c12a7031efd24e1f5cf326fbaefd15", - "b2384cb226cf8db09c125799a4534176569b5b669913f5127b902842701b56ad", - "cc97ec754770df8f1174834ce498a14ebaa37463e98035357a1205bbe7c83185", - "85753a8d04985b7bba88ba6538f095f59bf21e4284cec166b6eb2af183a2af60", - "82bf805159e608f5bdd1924af17164a416651a11c515f3c49a40d7abe23fabbf", - "0a3565d6290c97986c1df88831a6a90379c908217e96777cba2a42a82d8873ee", - "08a7b7ca2595d483ba3b5dba5fe6447cd60029f0d16b03eae1834ab77a503c37", - "b1c39d7a4ed7c4546063a6282d62557de798586b9f05c9f563b296ab1a41e8ce", - "4aaaae9ede02f76b8f602e196ce4226abf63e904e2d3bacc3a1fcba7f98367d3", - "e6d02a821912c49824a6e7e4c1379d050fee3c739bdfec1f3b29598d3fc67200", - "c50cdd0240967ebf7273dc8c3c1bc7beb052cee60f0eebcd73a1e30243ed0eca", - "da91947bd3bed2669a9524d42f7022c0d2cef4ee95f4106c5c24844f28d572ee", - "1cdf08767d916938dbd0fe925aa63ba0e05ad3eddee5cda5d7f849c1b1fd98d9", - "df120c7666674024b539cb49f5b7c05e658a70027a3269eab8f897f22d49bcbb", - "34d58b1693ad9013f742aa3c87af1c735b6e581706657d7b6ce3d37239db711e", - "29bc8a1bb692ce09405b8a445e577f1e4bdebda2d83165af302d7aea37901712", - "bd06dd40a99a92b5688436b08557bdd17506400e2351a30a8c028ad098cd87ee", - "aa987803fdaabed1c6175e7d5411a9ca9a46d9ccf974afae00f1705f20922b87", - "e4193c8e3b5e9c867842d70241efd282aa35cdb8c596eb9a4f4d85360e3cc7ec", - "047ff747bf29456330a6a01a5c5b5e7dd300979fe62533c81937de19e53c18a5", - "5b6e17c95e21b685a897ebd20b63587d50f8999579c0e43c15a896cbcf2e45e9", - "3f8a0ea0a6c72248109abddb2f3dc0b5558c6d63629e543af1be6ac902e40dac", - "eaeab8adb1ecc6061298df4622fab95491b3e2e17e08fa9db9e3f1912208b940", - "621bc0fc0793edb8af7b77c131e4acde8c5b2da6ca64914318a11be6efbb4131", - "23bc5678fd75a4d98d04eb284809b381d73a5cbcd526c14461262c6d526bf9f6", - "6150a0a0b0251c638f6932b6417f915193f0ac32c350469c46412eedb02aa6e2", - "e6ac0821a1ff0b5f9815219dbd111d2bb1a617412581fa1f2527b3753b1097f5", - "7b154bd5152d319deeb47122a4b3f50d8daf1c6ebfa15c971c8f0cca2227b284", - "a96fc680a7d8933f7c8cdd4dfb301be77a41791f3f39c640e7549782fc960e9e", - "9869a075336e036707ad4637e8e2d26520fc652b1f393f5231c0ccc874fd6da8", - "f4d4d24aa1b8b7fce53e263fc7c165292651c2c2b75ddeee6450630e56b44898", - "068c1569e89ffb3d496641617e41404c7d47c3a0ccab55e6ae0b045ff189b389", - "1db86ed073339d2f503c264163c207baa085a41135f484c12316eb687385875c", - "cb749e181d5b3228724b2c642e010dbcb64bd9e8015654345b4ab30fbabafd4e", - "a164eac8cc935c8d79acdf80a0128aa176861a37dc5e741f4dc0ad22639b059d", - "ae422427218cfa20fe823dc82acb584ee5128592428c9bfdb55f9d59744a8578", - "52f7dc58b2e30b77014db0a45903c0c3da2a7fb7721bf890e791f16b92092bcc", - "3c12bf9026a780c7176237878d42a38a0372f0d0142d486441154a0f6e6329a1", - "c775d8244351cb637acff73db0bc7ae6be029ffe85f23b64644b4d0897d59ab5", - "f9090321185d4728dc021347eec9441b8a77578b567a8cee311de29f8d6a12a2", - "7b5d74a6604c2f92628ab2b6a8fa81e7db1ba19518e95ea3473f1af4a8dfe5c8", - "f6fd63cdd23bdec7ce16679e0254e6417008042c3780413791144be6d0e188fa", - "4cda2b5610caac139397e197e5a040b02dce7afd874419ed99e4f867423d2217", - "08b2e0c570abbb1d87398f04fdab046b031e22883368db403a8d8d8bd8131dac", - "bcb9a6157996317640359e364c50df6a03a9d7e1114e5b43b128442e8d3ae403", - "8575b0f2633dac14e3d27701e09514e79b0af7d576c3b8ae727a9db933f41ee5", - "d196b7bd5a2a8da7405097c125f75d90c5cb8f6a660b212ca0d2122c295bc7d4", - "e5a2c0666e524ba940532c316ae10a075d97ec686d6c4e13b9589c6ab6d08882", - "93450987fbae038a114bf42748fba5bb2b03c93ef3f52dbccc37e359e1260301", - "59b03bf6b2dd1ca59be1cac6b86f17f309b603f8f13c75868d69e66fdecfce6a", - "091f6af5ba2c80750404f0bd6bce933837bf8b86f46cc8280365e1bd75988fa1", - "28d09f2a6c8a289fdbbf7f80540183032b05abc1ce7ec114c23d54876d517716", - "7cc6178b5f4edd27cbf87ea22bb16c93a453cba41b2ef0ed9bac05294f4cfe59", - "487717aca78a0791d8ef08c3bda3a1d114d320d8dcac7eaba8f7729a34333980", - "eda941ea446f7316fb2b9a5f8b70898d19b2194709b091b0cb09cc8458e19e2f", - "768afd8af88bf5e2b3d0323a25761bdf79489fb87c9da6057d3a280a4ae0311e", - "b2624328d556295017ab7a0f1147f398bd222af807e619796cc95011b3afa43d", - "d0e3a1cf4d60b0b9192f8b4fb6d54b5efd663165676fd9d4e7a8860978a706a5", - "192d3f032206aac558f422b3cdcdf98fb4f9b305a1dfd7d343fc72205c319bcb", - "6a0ac97709cdecb73d2ffdac83552f2dff8c304ea1ce34352b0c42158beb1ae9", - "8e28a3093fe784971dc3925837164198c47c9a76fe5f2ca56028b23a507adb74", - "06fe575ffbacf2e35394cdd48248640475d5d8c2601fa31c0309f4d691830e5d", - "db74e1964e7f726d81e104c7159d61746d5eee44350f8ca23fe2ae83f1bebcc7", - "eec43eef647fac630e1e165e600f5b769bce07d55e8fdbc235e409368c7a0d76", - "6ff9e54eb0a17c82589d93488abd16f7eeb390301cd1c565c71a36ebf10c72e1", - "7dbb71131e6b837d30e478cf4f4e19943965c759bc1eac274add3657080d97c3", - "c82719cf660a5e321f45485445f65d8bad2d93b9204be3972252b07ff2812826", - "4334736796de05cbdc36cdfd50a713c790fec6adaf6f20d757e3aab56b0f4db8", - "71b03737b635885ca5eb2f9a7f7c51d030734f1f821883e6d199bc082e5b549b", - "4f111ad9ffc7e2ae11790a61b1c0f86ed6523c33b0a305727f7fdab2b44319b4", - "cf0ac2f4c1981f34eea66125d918fadde7528ad0505c79ee4b9d067a204740dd", - "8e5f626beedf601536249c931413acb75327bd94ba9277ec1f5b309c7e3bcdeb", - "8eedce6af99c75f998ebdc6ce770d1b4773eb59fb43b6642c5a5c10bba36675f", - "e130938eb74cedde3d63fbc273b3cacf6a7af4133c256371df8856c926660534", - "458cd1e839892b4c5ebd028c086648718a9e5706d312b1c7ad87a8112220c976", - "172bcd62ed12c1966d26b442b240a0aba017fe2ffc743de6535287c0ecf6667b", - "604b68f6aff432ef940202f3713161489ca6cb21e05da30b64d8019abc6e18e5", - "c83f6c9973c691ebf394d92ab79aaf8f360439c4f80a8ad53e6bde9507b4f2d6", - "41efbe40c59b16da98a4f470fb2dce327045987884f6f933a7e63ab776e2307d", - "484e82f098d5d534b7d7ad228011d1f70cb9298df62f05430cf8c83a99d5cd0f", - "0f760f7ae0326391fce480a72b8bacd19dcbe837212819f7722a097f2a5a7e2e", - "acd7d7da2da72cc865eb426bbe594793f09256f583431b86943e7e9374658f33", - "934c51e0ed29507afa9ce3cbf90821386090ba8bc2fe24c271bc77fa6bb3b39f", - "2890bb3790859bb7a456140f66c068dab585323ad7002dc459ece567cd6066bc", - "0bf1c0dfe3ceaa25c25c4f9683808d24d91880b4df6b3138f17ec4ed81177c9b", - "55912c5536d1be60de4aebf35295bec3abdc2ca993793449784fe0f77c158615", - "6717f6658cac576a9deb2ffc26d45bd8e5d29439e7a685bb7a1c9853d14600d5", - "5c40587f78f16d3ce7338620a6f1be6b71ab4f645a72af83e1d2d9d9cf8c0be5", - "b6ab6b29065d3cf9f09db566dc47f74d6b0e483c62428a7f7292ca51f2cf697a", - "c51784c3bd83ed739cc999383c3eea0af8c6a2759b52144075393a38a3b68739", - "70d79afa0dc9af342fc01f59ef7c7e77e6c98379bbd7089089374053202cd1b5", - "bcbc277088dfdd5346ccff424f4b0422514c42c785bce7cb71f7ecfef223195e", - "153fed289cb4abb51ad18161f8546a733b681fecbfe2c4ff6c26d933d2bb4508", - "aef19c22691d4c2c988bfa3ad506fdb4875206607e34dfe20f00d5aae28708ce", - "47d0455c7dec36f80f8b8ad7178b3e256670a5fd081b32393a1a43f1cce2144b", - "792f51507f712b1868eeb9ce15767a282328f75f51340858435dd39a9a8805d2", - "92ce26e025b985735367cb922750f73f7f9fa03747c287e477999723aedd7d10", - "ecbc6e0f1e87777667c72092def35bd2ef953ee46c8645c11130ef2fbb484ddd", - "14ab248053b4bf61727b88308b7711a508c776302be7e4781257c370a20bbc44", - "aedf5ba95d0a3043669ec4400fcfe80ea95a8f06d114e2124b387a4b6762f0fa", - "91c4e2fbb38a42dbe1a0b176a5bf4e1aaab797cdbdecc29b781177450432c4a3", - "76cf33103bc3c9f332dc5be357ca91eb9f5c4de042d6a65974503555d5fe229d", - "8a9b55053e8f10aec3bd01acf4381c268f35548555a1ff796ae338cfde87a5e6", - "bf9f14553736e58fed4cddcd93aa4a764b4f98d1142f73e1c4e8b751cbf173a2", - "7a2765292f461b6d2459c4d19bd87ca268c0962af85379c5a41cab98c35e440e", - "a2788e0773219a01141ce1c40bcfcaa002c975a1e9f55787e97ead39ce6eb6c4", - "d323303749bd70049abc8c0282ffafb45cb0a27af130b9a9bb82cc7b9673d367", - "8678dddf5e90a7feace96421dabdd3348f81c5ce707eef743dd3c48f19b1c568", - "ed58596625848e89c52f25539e695e4ade0a8826f67e08d8c2360c14c18076f2", - "95de2af71e64cb0cc49dded2524dd47658a8e37b371a1defd2c9686e26625271", - "90c9a8484bc7fa1b436a370bd61555ea4faa66f6e4e8f033a907d68038b2e9d7", - "ed8466d00aebe27c4130a3944556bc1a62ac063769a87b7cee1a468d0fb3ef1e", - "a60d8fc32ab3482cede715d8fb412677d9eafb1b134b725968d56ceb8c5ab8dd", - "1ec0a9cc931b20dc37dd9e93d484551d456a69666df7a82bab44571c581ca64f", - "b53e460dc6fe22d50d1da6d1462a849413103198dd616284410850fcac5a3133", - "110c22648a2d9299ffaf5e7631b551bae6c5e4e039f896042bb926186e5b370b", - "2d15ca616d61406220953d33675e66d307ecf16ee7b75bf614860105ecb16c29", - "04de06a1ca6b7890ae3c5db08aa05af462295fa398b0da07c620e0b2826b0c52", - "3f7ac67f95612891fb57d00adc0da74d051ead990f3d480a0ed6ed3b5238e5aa", - "5d6c818c789f3f0b63a588625e4a187c774eb0dd74a2262fc4f7ed13a18815c9", - "e1049d3b242d54639da3b23ae5d3078c8684bef89911352f511b7084c5fc7041", - "3b674de8c71f07f508d49568d1d1f2b0fc663c8ade86cdf0ff6c8d180b21862d", - "96c83e5745ebe95f7612713c60ce2daffcbec2389431025f08c81ec902d3e9a7", - "f0e573b84c0e902a7084befafca0787ad05f1dbb0fb85afeda0602fa214195e9", - "52b07061dc91438f551a510e0dcfc10794ded61171dc35dc5d7e62e22b4b04e2", - "d64191ae253c72b3b09c78211ba41b9f482931ca90576e4dcc588982611dc4eb", - "5ebadd9aa33fcb71a82a952cc06245db26f47e4486168ac645a83f4ff00369f3", - "b8d7d3679fec4ba34b061489129c303d24a31fed2924356ef030c7bec04695a9", - "a898ae3d43d9f8e72339be467e4b0e846a99c2a01ebac4e65d16994a8830fbd7", - "fdc69e2d5720a0b3154602b260457f81c9f8e458858fd168bf32a6f9b4777e27", - "bf5f3d83af18a9b7ec17001f6ea33dfbeda209be9a6073771619b2eb335990d5", - "63285cf455b8add8422736d3607ab92f10872c04bd6f2995488f45f6828c53a2", - "6c42a0f3485a8bd3fdb98f3614f6c603ca051d224d6462249e9b082bb79d8986", - "fa4ac317e08a2f7d06b12bc09354f888e8d53590e9fbf04438c510eab2fdb93f", - "c37dc8faf3b07f9e4fd1e597b484463073b2a4d35794b6ea2fe7f9d55915e48c", - "d2572faae9a5c40636c920376cd0d6be944ec59ba66bd4a61aa4cc9472306678", - "0a40c7dd0d8959ae158e081fd950b6cb6eb748c63cad9f89d647f3992d558045", - "cfb4e6c431386a7105fc6a62fcd60ce6cc900bd4913e98e0b722d3e5b23f5de2", - "e225104c0ca8ac75edf811d555f2d6c027cbea5d9ca67975a5de4077638ebf8a", - "35d54e5bc79d66532346e1d931f6d781b35b60d89a787a49d28bf669e0479091", - "188da8157423a6382bb8b1f671f7ee4edba84ce6974e6270a045befa59f8d785", - "3834af7a06bce5b6a3714192fd32a9cac08b23d43b1a646ce035e349774cd849", - "685fb18c5d0ad0b7e34be19f8437f10b941d889b212f7b3fe09a70fad57f34ab", - "76daf53ef30eb25541592d4e9f8f77ce8a2f0356f3359ec2efb78303e9ab5157", - "ced4ba2a2e1a7d12d75b7bf00f5e262af3ce5851dab113193976f3d986a9a4ae", - "f81030ee69952c7f85353e5e06761ec34ccb87d006f02094e5b75aab82b1626d", - "7fcc40f34da6e51a104b8075654a13e459b89bc8b8c1424f9b91dc895350bcb0", - "ea59d6307e7117646d5188031b850870a9b2418a3803b4e6e2e8ecac450fc3d2", - "71d268704c504ad22884776df0ca41d48dfc8ef442e66169ec782cf05656d48a", - "0715748e89c53dc2d2c815bb77c5938265c65ab2d45c161650984ab0f88aff98", - "eccf9493c0fc82c7aed1e8a29aabcdf9d8c9a84ecb0ef5de93be0a885a81df2b", - "315d82aa886fc3e8e9e6747ba7b09eefca6bf16604bb31b5ecbd02bf8fa8dfef", - "94f6f2387081ebb146d0c3bb86d028365f66a58b77abf68838edcb4d105d92c2", - "15060d762b8d7a56322debccdec94af9c779261690a72ba9ec4fde35528ca3d9", - "5832e0a81e2e1da218ac88f9a62dba8aef8e1b601961c8a6be60188d1b864540", - "6add455ad9c2cfa0d5e5a885ebdf8debcf2be71c943beab11805421af73980ae", - "03b1a2a43e9148edcea2ad94264f07d705728d4a4c515f2288b6696512373487", - "afafe80403f8be0b14718f799818e7f76a9eb77c3ce90e97f2dac77e59c030de", - "88df86892c726601d4436e2ffaaad38a4a5f655d6712545035a397830c185ba4", - "8c1d90dd38aedd29480da7fcf0983571c538280579a31a2b2f77014509801bd7", - "35c893ac3e98f10d45693af00e9048b48c418e9f33b772af70d8b48551ef5233", - "99f9b56f1164c3c6e4d5bcff5a9623168c1e7761dcf30b54bf1856abc8289924", - "4d45dee94a0c207de6b593ed904355150aa4eb9c8b71c60107d71724db7e0532", - "4a4cbc87beae82316f280b3c55e15f9522c316d6d41dbff529d65282b57193a7", - "d924106da8d4a9bf3fb79cd682e97db039dd0ef28fe6a15b2cb81b21b0198377", - "c20073bc6bae55a5b7e7bb20e2175d9e9cae134fc3859542344bfb45eb9e646b", - "4395261b789ffcdfeee8862d1b5d513c64da2c9fea4716fa87022dd17d4c34d2", - "9487ee1c8a7211c3c27de39bb73a4af8546eeeedce5351d2693df5fcabf38247", - "b1e70d5223edb505618e24bb42337e135414e17734e94f959c6495bedc213c83", - "297cc63ab4875f32caf361b01ff06cde53443a37f4e8e08bd4893f167c32acfc", - "63602bf7e065be537022cd337bf70a405458c8e555500b6b3c959017699a72c7", - "dcc1213c97619161b316ae5ed1967459e259d9a48fd4321ae0b4e197391a8e7e", - "4d44f0b11807be6f16151132795a1177e65cdd8fa8230c144e92eac9997ebc11", - "26852ae275b2748d7db3d0ace5126e4adf3bc6713f5a8e800ca638ce9f1d742d", - "a9f774078606c8dc31a5df524ed2310a0157d804de2b00ba9f35b576f25209c7", - "0d1f518ffa0ad2dbabcd3e61fab667bc74651ed621d99ec09aca880eb0ea6f48", - "d4f8256df501f05c174eec1b0d56fed429ad4e90734b139f242e833c7571b7f0", - "10016e90b61b5b1c236de90eb564c5b2a8d90d8b426007f133d3ff63334bc818", - "366b06e30b233f453a5f1e645fdb24585c39d8f25d848e08731537764cc43dec", - "a8f2403b402f1819d2c94262b18818f9cfef38bf94fdd952c6c8a70ba994bc88", - "2df41fe0b74c2c99d98cf881490b04486ff33485cf14d2ac5876c3ae91a23668", - "812fa8827ca14a704e2622dc521283ea56255416dab70a64e72124330f80342a", - "437bd76528943dc963edebc2f646326cc56e6bdcd99e40d6b9da37e290db2af3", - "06f86368ec9a4e5cee98b10b2e31b933219b79e6c629da563ca509d9a673b96b", - "12a4dcb93f035e2e53bebce85f49458109032f062545cb5a6cffb7e2c3bbe38c", - "6caf285e6b15224a61cbdf8bd6ba0394d3f561f118fb8bf05300d375b59c3be4", - "d5f03dbdff841cb6d85e9fe9deeb7d6efcbf234e7def46ca508956fb27c0c4ca", - "b47c7060135541cd9b0f0ea7dfe5dc1a9ff1e7fe0000d413bb5aa067472556c8", - "c07d8d071a9bb018f6d75768c04924c9ea2212a2533f8f04f4bb7f9d9e9d73a1", - "664d621449ec0d046a36bf40a8cb20d23bf4834c25462202549b5acbd9c25405", - "1cf06db7c523abd382a44a85c6ec07486ecfd59bef5f73057ea3551145856fec", - "15879e0560af4cdced8cba0789d386547fa3602380cf2078327cdd70b88d9f43", - "af67d0b51dd51ebbf4f7b30a8a7579470d05f12975428db48adfb3e7ea212edf", - "604172d6f235989590c8250731b80260372c99aecc472074f009fc893435b303", - "7311dcdc9621fa416fb5bb22ed6a3bf26f396717ddc320c528e8d3fa4c68e5e0", - "2b0b73ae2865c4cde75cf3c77d0934556c358d32fb3c4d531326e89ed985b0ad", - "7f0c686b6ac82cdd359398ea29210ddcd6dedfb2571efb3d4171c1e4dad374ac", - "cbae89004a7af7b9d96e2999f086ac87726bfd06304abcdd37c1dc100ce676fb", - "e1ce5407aaca9b23cc6ceb3a700c1f41344bfa4c975ecb2619a46cee607c8446", - "7fe04c164607ac215d60a4f13718f5a674de022d1117c88f9995bf2747f61ea1", - "36bd118e57e9057e18904e33dfe68d7b66e84c6e6af6a0077b5f5984824031ba", - "d4945d721924e477fa3e6a64b38ab0c09f7d6084f404d497574a859520383d9d", - "0860e1507413fbbe53d9e1cb577a2be08e9fb14708c60250cb3606daec8a51a2", - "a5afd4b73ea04795d48852785f01dc87e07aa3e069ff38e24520bbfbdaaaea15", - "821177258a8ba51e0c6b5fb9148324fca7f5cecedff9aa5d40459063b537694a", - "acccc7f4796bced08d022a362010372e59345e33a073b4368f7aa9b87c6df1b9", - "249d73dfbe395e2b93dfd2211459aa69b80916282f14c587bb11ced52a9e611c", - "896dfed9b0eacfabab35e2125d6047d1eae2611032c046c0c83feb7078f5fdf1", - "cdaafb6b0f1c61307a24cbf9f3a7b346156fb63ce3bb21d97914532a3d761407", - "2255c446a8dab86ed118478d9c1060357036cc17222666ec91bfc30eb6d69890", - "8f2f338cc7b25720b3da478f1c78466257464ce36fdded7e529e6cc2abe0cd5f", - "37cb914e20778690e2823495b6e74c28292149e3148e4ad974647af50dd75632", - "c09f04cd36e2ea440954adb8d45f35c54244926244bbe40a1195147b3614fe5b", - "b3634a879fbd13cb11751769b17f2430fdbb6ee712c8c8340c7d5a5bc26d4ec4", - "4c287b98716794c78dcebccf2250bbf4761503842768f732725ad0125ab996d8", - "d340ae8e099006bd65fcf422e1950934e880b11f6b1f9e6aa9803b423a41ab74", - "60c9caf82b59f207f6dd49d8a12649eb08b16e6206d5e1079c97f8cb5f3adb1b", - "0e02013680719a77b2b3bf40f53ceeeb3a52684b40df771e2f0658e98251e8ed", - "d168ce5c1d5e9d60e54f7a097af7ed6ce8aff0007ac58ff2fff4499ece8ec6bb", - "2c89732b3d668937ab647d58ddb409679d7bedb57444a20e74763ea17c450829", - "e92f0a7ba90ef7615a54cb310abfad08ca6842b57f9383d6d6d1315a85778b58", - "bdf6ce1df6175fcaa795496aceb123c80a68b06495426431236d886a2bc27c5a", - "4219e9c904d5af4aa3a23a189bfdcf3692d8a0768e22b7846fd46b0a5999c451", - "6c61c5fc22908d9a5aeb434bd5d90c6c5d1af6146dc038f8c0780a8ececf23df", - "a2e7887dab426374f7ab37548c3f81dde212d2fb97b742e4e10f8f7f2fff6c89", - "5508d5a942ab068c9f7c9a4e3d54314caaf6e877477a79d750f9b8429f12ec7d", - "7fb9282b2beddb33c4700fccb04c66ee3753e5d7330fcd2d78cc253df52a9006", - "d6cc693834573302b5582080bde218b2b6b047fa418ec6c554f06e77b3035bba", - "5271c89c26976802ec7e4692e5d2b0251833148b679a3c8fd6b9d16b36406bb0", - "264c211ee0655720987a68ff369abbd223023fea9f2758f4e59dd3d4c52d247c", - "e37f7342b6a95ff357225fc21fb31571a2c90bb5cd31ecbf67f33a9eec07e229", - "fe10464d0c2ab22ddbc72bbc275aefe5956dd3e7ee58b34b98dafd22a66c5c25", - "4d7b04605700e408ad6162571dc87ac1a542616447050bdd55bea4f78c0fd33a", - "9ac5680919e621889c01149ea5272d3b1700b3f9bca7ec7cc917fd2e4a9c7456", - "8f95762cafeef2874faca336d073b6eef3317efd8db3c3ed333d4649167aa566", - "6e1df21aa3a08b33994b85203c6a8ebc81481f9a2321a10846d4eb804126108f", - "0122a5ce4bcdd11ac9bd7348256763d7b0c083b34fbdc6549e7737b5f5900a1d", - "da10d4f54181619b5fcd910671acbdf00c3018b06a50ce88cc989ac9e63ec4eb", - "af1e8b13c86417fab41e27cb3b0baefd3f119bfcc79a0d68dcac6e334c376a0a", - "5cf6af07686b71d3504da69ece15f59b74455a979f04dd0df8f4ebadb24f216a", - "c816ff8cf2010111cc441fb82f675c851f5415811770d9f4077803409060fb3d", - "bf6d61bc3892619ed86ec8f339c2c5e4bb8148604c84878a0068e55314aaa1a9", - "cb2a3d179102d308d4b5a62185c5f56d7ffcb32dc90e3094761c06576d945783", - "7c73ae6e00a7f3aae4ab25dc216d14a61819dcbb99b7fad3db5f0dbfadd6e72b", - "9c0f44bbb840ef24311084d64e760c470f35ba51d653838ebd563aeada170ed1", - "9e42944fdcb29a67d76877c0b50d15d173cffd1e26ef592de808aa1c839f016d", - "74d1371b6b472bcf993b5335b540974a95a8d9d2033228c865f97bb73152987e", - "b1d3b9209ab2d960fed9ab3b0c36b97dff215a7c85eabbbe9c6eba9271a54ecf", - "6cc8ba1b4abcc3cfc560e8fb615a1738823938d88eeee2cb8e487e964d23ab10", - "ab7a67191569e6050a2a6dae6ca450c4631049684d04b558088f086915abda42", - "e9c8216bf023a31f5e5b69096641bdb2eeebf386bd82fd41454a2c7db1ee976c", - "78f96deca72e9d5a04dfb2d8bc4106a154970e6777bfa204ac727d2cbf6317f9", - "2802dbd4f374614663cccdcb561bc4b97ad58bb2fbb45f3ed2a53c8035d0e190", - "9f10a416b607fb5a968e070cfd620ac504309bd5683556cad0cb8acb90143657", - "6cb18c49dbeff89c212a1209b602ca2e9a40e42d11910df1a518c044cd7a419d", - "d507dee544f32da57a7ec55bf474f65af9084bd87ca645991443df112e5e23bb", - "31e542ffcca3a7f5b8199b943500a30870a839aabe98c4fd70d40175729bca96", - "bc86edff2205aa62874700e2fd96086055675839d83fdfe2185f50055093834b", - "da3b5eec0167f052d58e6a050397b49a05e33e47ed15a7bdbbfbdcbd3ab40b89", - "eae7dc24fb4c0b2d4ce35ebadbc1eae58b2ad8ad4aafc69eccf81931efd69660", - "2f54abe6f08186a5216ca8bfc9b583026b36f9928f89d347ce7277ee96019517", - "f540e836d995a66047b1d066d24166a948bc569c5454d0d9f9309248607fd2c9", - "e22ec778b82dd5f392d47d76ddc8fa54514d230c6bf2827890d226cd53767502", - "e3a05b81a1a972c92eb7dc6795d01289df4b163384f9ba237c93c93d2aad3e68", - "62ca2ff745f355bad09ad71366ca491a32bfa6842cb404782000605f70e4aaa3", - "52c296701eba4bd2b2c891a9060afc1d7aa4ad9b2ad10878e2e0d903ed4f6156", - "0be6e4b34104b1a7b8e667dbdf93ccd87abcca61348093007c4d442c1e31bfe3", - "cd96422630471db4dd87e63215d0351e39206885cdb6e5972f893124da283ffe", - "ac5bcad0911f8eb0c674df6ed81011385c75766b1580c9325bdf0a2748f25841", - "3937428e4d6c436059c3eea1fd062143ce08125690357cb47318a65264dbdb22", - "99993738355a42a9b41c3f3692f4fe32f1b5eb522249819380d4d445155f12ef", - "a31af9b2d1857e1ad722d00788e017bf48a307fcb1c03f8c5d8f8327b6b7876b", - "cee9ee7354c3cd90b057e32dd3b3460d9bdb87eda456a822a09412d6b018ad98", - "965594db1d8a68c3319d12249371eebb9e5129b48cca6a07ad1c0f8b17b510b5", - "ff1ac86468c371475eadf155b4fa4a15e381184e9cb266514b8f12eea2a273ce", - "95c7c00877c47c032b3def8a17ffb15ac645d825e27355b6ebdd884a0e109f7d", - "c58ba9f070f7cc66792cec2a2f3e1517d22056ddb2b780d3c3ab224ca4124916", - "d049765359a2435adb733ebf4f2b79078f5c8016149e769b34b460f8af6e1495", - "d29bb0f3411d7e154fa6ff9fd5dedfc31f872d4bebbd5e59fba8a24a793d254e", - "3a1f82c025f4c1b39aa5536276fc3bcc72be2c1dd74b941207adedc7557a8533", - "19aa1b7a6576f63cf89e79c5fb65d7fc055f2b30e03c028778f31b7de0237755", - "c7063227a18827d0f037e6725033beb35e31e0ed8f627802c683bc25a43210d5", - "6b3fa6ee73e276171e843f16605dc4c4ff033b4a4f5251d3e71256a945097899", - "96bb2992eb1531132fd2c04c375a8e5db4c7ba65dca03a0d7cf4542e8a0f915b", - "c59b197c45ab4afcf133e1271ac1d27856fc5e7d89ca042bc7bde68184e8b104", - "1ac672388934c7bc8e18a27e2855f7fb01ad0be68469e4889599ebb0f15d216a", - "4b5f9dfab2bfa81457a5338ee0c46416c4a6e0a587b1c6926ddc958ee34eea2e", - "8a6ca8046bddf8a9da2f32dbe2e57139ea9832aa120eb0a5859411e8e6c3eaed", - "3cc9c5c08abae45f9e82f0a5e1d7ee1ed2c6c58f00c402a51b8b0d1c96142cf1", - "ffb8d31a60809d69528aec09a938f608af4135c2d5391657aaba6c322a6e7f1c", - "57940e862051abe7c3ade36b235f04a6900dc87f975e4a4ca757d9319be43c6f", - "ba5fd20153a6f4acf0bb4a4e2e2e55088f6bf63be50bc9a78e97c040f174b9f4", - "2ebd4b189f349fa667768af39249ada6b094540a497cb46b48808e8af8b407b2", - "f65f2f68f30b49614c0336d589ce60c13146ba62766f050610fa31c6bf3dc4fe", - "490e25f43a804eb22bb737d849bee00aace77d9b489ec328510bbfdd64f36333", - "aa72a5277e0162e0a6c7fe7a40d81b0d6d350f2e7eed2f4a9616f9560e3aeb3d", - "489641d11bc0d8f195322b1ff9babb9fa893a5c87a7e59a9e2ecc744ebf26aa9", - "907cecddf206149c754fdccfcc666cc5fe008e05e973c0261d1c0b202fd3ad5b", - "f9bcacdfe03247513821c1021f6f228b7bc91bd7d3d25d459684c64247da64a2", - "d5b0aa279d3dee38c7aafe239b887c2e38f963b81a836bb112ae022e8f25bd66", - "2b4a8628f6528afa7981e76180cd31a8332412b9467d87ce2502573944f1b3dd", - "aaa881a89246c590d781c30504ab00e2607facf438c77b6c552a63e2c3f907f7", - "fa8e1f5312074fb060c688d60937637432e1b04f580e539acd4a2623b2c42972", - "e780316302958bfcfb722c820db4a3dd76c3d5b9300b92f0934e60a5375ac4d1", - "995729382c75c1aad01df5754fe1c98fceedcfd3cfe24fddcd4ec14f4624d065", - "050f24c215e040baa8e1822a58ab356655763f572ab8551989f0a618133bad9b", - "bc614f2c37438c0d9cef3824aafa4faedb425ffce820cfef207d98ee3f37804f", - "d6f756e09f2641010d2db6774ebd996d56c9aef194517ebc3d87c44e2ebc8b09", - "bcde95e88bf7711ad87e41e6afac621929ff1849e85d090e3ca73c5dcbed1ba0", - "1b5cf4240166573694997ad6b3a17abb38fa0e6d55503a9801c894c91b6163bf", - "d44a23811c4bbd784988fb727b4f36c057b36c6d705846a8104998a73dd66938", - "aad8e077a876fd9c436cc09ab69a221ec28c83d4a1f517a20cd624503e6e1367", - "b738c428b7078e8db9260b405df0d2c772f0747d52800f4f3b77419d8c3538bc", - "1dbca5578cd9774ea04cfc8bd19ee6c3b9e2e6934c2abffbad11becc9a316417", - "f6864651fffe07da58756a7ad1266e4a04f75f01180e96d0d8582186e0d90da4", - "64d1f4c548e382a094082d2ed8a311b6fa65651775f217eb5365238c9d2e5816", - "4ca31e6b1907a87fffdb3eab83d9a48c853ba75ec53134faa09feeed2a2e04e6", - "82675f56f48f2c1ce6c913b381d55c271193a56851e929e68f0b955e5b0ede0f", - "287871f32293206f89e3caabdc62696f8079a757b44c12d30cbeb8cf705bd0c2", - "c0c58502eb7b27734ed1d320fd3e0ebbb28ad8cfb5ba6e5026058c6fce6a3b33", - "857fe90528fd650c90810cb581a79d121b3820c835cc5cdee2416051a82e6829", - "b9fd3956b5ab82ca01df0158efa3cdc0782277fcdc617e6eb3fef8eaacea6541", - "a53bd3e4f9355dcbea89de17515abeea9b593563214e83033932bc429319cf3e", - "b3bc84012a22b3966c22499c1ed9882c974a321718ca066e6169b189dece4fb5", - "3abe574bb341a2d74bbe059a5016596011a47e4bba2d44a3edc98d74485c0367", - "dfb102a61022e795a19fed860103125ff8378b28dea92d6bd588d7fc96edd370", - "5556bad51753de9288ea59467b026a93bb2826b1d4c4319fc1b314180f516870", - "a0f731cb49ccaf12c8f04aa20208af12a17209da2aa32286504c8710c2443fff", - "491612167e16d5e24e896793b52ed9cd5e1688b6407daf235ce640707687760d", - "1d68e6de0ee93f39bd4872223f8a424677abeebb81c27b1755c04f50a59bc083", - "278b638152894a52966bd8a73c2b1af41306158217b5389894e1aff7599d745d", - "f09f9a1af03afe147c67024b01c8dcefd28dcd66d8bf0cecb4946dda44eacc1e", - "7296a427e6d53d26414c681896f63e55969ff9d50654fc3af0dffc6bcaea9d9a", - "8370b23ba0bed12d1e8848d5157729332bde8e40c49ac80851736cd921e6484d", - "c119f14bc7be216630f16cf09322ce327f1758ae973487df44b4be42ad0af30b", - "fb0dcbb3a9a52aa539acb736cbfedc4d1cfc13810c494ac75e6dada1b2645032", - "60095220b492ad3989f0063b36e8313c72370cc003fe7881a4b55435a2caad83", - "dac25dfac694a3e3d0100e96c7b6b3ef34244198e715e111218ed7e93ebd5398", - "04822550eaea862b9e432606a773f356796ef329477a7b559fa6d6192f768306", - "e2a2afe5a6efab91112dfb861edef3b19d87d97d8ba547c8c73408a47fabef13", - "56ab49a17c791fd9660ce53e2a0742844d573774792d35d0a2ade620df2698f2", - "58156036043eb9316aada0811d2adfc41985ebe1e552a33f0969cb8c1d5ecd03", - "54471e109ab014043954238e843de3519d613be95f25639e6a697d62e39ece20", - "52c028f1cc079a27fc8377a6e2d831e9cb171bddbe88839bf4365624236c428b", - "f3c589299fdfc21c5dbe04fdd5b1cfee5eb9ccc878ff10d9dba93b0ee856a60f", - "4c3d38f2b74c5e3b276cf3e934efa8110b885bae1ea84285ef89b9103d3ebf08", - "5c58dfa9b0c7738194395bff9f72677aa9e8ae83274e3343efde1502713efea5", - "9b4f65eb64c11f44973b60713880b201807311e5ee7e1f02a15060e6521129de", - "301ed1eb6eecd301640b824f09a541a0cccb96f4171159a44d9a5133d399b8cb", - "8031429d0c796001a35fff431109d2009f27dc4837e1c32572ecf140c491969b", - "5264f9d3a6565e2169247c7c9f4948b9929f298c30f6d255ff11d0e14e4880a2", - "afe9457a6403f30d4387410b138dcc01ecb65d327d2921f5949bf8ca988b67b5", - "57622ebc3fb2520e0038d6b546636bbcb49334ac6e5da3fa703f7c5b116f23a5", - "dc905955ed31ebc3b0601ae22adb0fcc2b21ac607113ed616aec21808a5cad81", - "ab73edbfdfd701deaa9fddf23d70672c7b402e7bc187e0b87036deb2c4ba1e9d", - "ba8670d9f5121cc8e2a4f2b4b61632fb2582b187c2df2f66e8733b84dba9a67d", - "8386e4c1df66b8a6df0c5bbf653ec49be7b16bf4347f43c8e7084d5567e39cac", - "4b4bdc232335410e4439afd47ba23d8c5f6f0a4a6a0d91674e2be8276b741c40", - "e0f605b120acd4a7f8af2f13486c2f889cf1b212b8f68eded14b94e7b3f17637", - "1a09fb93d1b171e5d7a6bee681724e3eb981f5153cbfc89b7541c04917350cef", - "32451d8a7c857f12e75922f705e8e0c025919a0615b4375bc6fbe4bd958ed5a2", - "d6a54b6bbda1a25d2d7ff97d816cac809c6a1f4c5b331699c2527d19bc52756b", - "d3de2fabcde51aa7a8bfcbf2c0d72b868d50688327339f7d816cfcbedaf8a0a7", - "20b20f19c6b068e970bd0bb89986e5782a07bc6c7ab14b4ae3742483d1f9cc64", - "947972b54f6f4b231fa79eae270458f093ad72ece93bcede11eb957152d08931", - "d15a70ba41b08c95da602359bcda850995f3e50adc8948001fff19c6fdfbc08a", - "333fbdc20c914ee5cf73c129d51971db7395346d9b85b030fd05f776eafb0c47", - "679157536bf033b50240aaac6201bb579d8f2a2adfe53d09fb7cce617ff8f5a1", - "9ad9703d4df78eb6b1cc5a0f37db3ead22d0f66420a00bea43388ef4fbf19f54", - "eb699fec62ce1b38254ebd2ae20318a20a3bb3dec9e308af5aa03e0479e544f3", - "472b0504ead77655c5224c1846924b63c0592fc54a1f29fe0c8c6252ecd83ef0", - "f1fcf892277f4407e38b2a73abaf6915f0e3331e8925950eb98ea63a8e5148f9", - "4b734ad998ddc332e3f6b1a91584262e9cbdda4f4d3684ac703f1cec0d8e6d98", - "cfd1ffde4e5ff7f582d65588eb4fca14e7e3d8aab0b9f36ce212a38f6b4850c9", - "03fa875ee34409cbdde7c5055f15bd551630306e198c2234b1e2a30d4a2b3d31", - "632341b0e368b1ab46c97ab945ade44cae16952784da46c147419f4a9cc5b13e", - "eb18349455b888da91dbab8b76df4a26be495f1d5f80a0e30b811700c20bd7d4", - "9619c376fcc1cb62c71426b6eadb3c09a694fc670fb8eb58ea84025009037a7a", - "69196032acabe52ce0cc67fde44a32e4160bfe2548c5293360eac66fa246b8a1", - "db1acb546dc8fd7f497ae8a12b2aa68ce8f91f3d7c3a2610fc0433efa782e3ce", - "c5cea571808a96b03eae676b000b671a6789e21055d757a4bb206038c74d4538", - "b8db629a608acf09b54b6ca11ca3b1108470529664440e86d8969f3526e8b437", - "e741088f9422fcba6535ad54974863b4d6afb16996455c6fd0a14a6b5c818e77", - "aff476d1cba5798549f05f743c9cdf28859b1d4667d07fe4ea72037a2071c028", - "336b52a74405c8b1abfe5749545e0132c2abbffe551812686cc718db631e04f3", - "e5d4832434340a990f1da4a18d26807b5a621fd5977deb9060dd82742bd99012", - "2c21d817da5944cd9c863aefe28d0989c3e502d6f57a2cee53dd1d78d139b547", - "0db25258b258125fb26a274d2f8fbe95bd2bda8dbf50ef64514f2bcb66ca582c", - "9b71e0a2bf5930fc540c93d00cf7fc985cd34271fff84ab2b3a3993d7b8247f2", - "2b0da60c5acaf6c75dc5841d31229374a697b9517490420c3b6c9ca9f93bffbb", - "26a6daff5f53ae8eba2a681575e7fda44ffa4ecc5ed1c7c8b872546751906d25", - "efea397a7904506e2a48e4876aefa72eaf539702ab2a6c414cc4c1a6767ada56", - "706d168ffa37a0119bf1854ecbfaa29f3e0d822c3435320c9efe85fb4512e163", - "27899ad57d641a0ff35ac794af74158f9fc637797c063f6aa48297ced4078327", - "1feaa93f0d16ea09453af5e5b285ef94d15facd039bd0218fb92805388bb0119", - "78fc1c8c6d490232ec083a1d3fec94aea4fad316ab75f83a3c32b89532416301", - "1d9658b10250cb1af952c5336ec09e11ef3d68edf5b7ee91e3405b975ffb9bb9", - "4bc531339f6bc53a487e3f7fbed79939601bd26c09564ed3fd12515da574ce3a", - "fbcce2ca9bab035c86095028f59f6a4079b809cb49aec31539c3556236d96231", - "63072cc88ad1fb8a5343a0988c3db75bbef82d6baf8046077ecff1434110a734", - "b187cef1f2121e2dbd5758e1faa25cd5d9979fab3a4998b687ee525c5e92f691", - "ab6c6a55add22dac5e4a2f22bcc8f07441620d2d8c4eaee2cbac09b7ac2dcf38", - "e0069d9a9466b6be59d13ef9036bcd6eab5707d95abb455deef1d349fd65ae12", - "42c667042737de0374e54ec437db8cc856e0b7414ed3b7d5495c642ffd0c1b98", - "d1bc2a7c3ab9339c8db4949c2f949e412ff94cf150a81361c86d6c7192e06125", - "9e931e5ef4a680792dee9a1313196e816648bc17779e5f4b3329c1ecdf469211", - "fce3d7004b9dad7b4da66f223af0e67c07524361fbea462270599d4ff924901a", - "5232739a2c7a2f8bac48fe5c17d3be5721e33ef863016f0aa5b89244412c2772", - "5715149b671827050965950287e71c05aee8cb8b0892baadfb4fdc4ed2cc2d4d", - "ccb652cf986205e2df05a9dad645379ab6d551ef94d790f2c446c4289df9b230", - "ee163d69d3e2b13960cb959dead0a724cd04f47651974f0829de5e3a4ee4767a", - "1467dfc3269c2c8732961557e1a6522f0204bbf6362f97dad1ae1a54938434cf", - "2d0207e7ca11eaf4f1648acf124519c3be8eae80e7a2159f29df6aef4d60f9de", - "38e5e1134e969f987f216116ab1380c77a25b30d54adb26dca6200bd99a4d62c", - "0d0682984fb9b442bb91ae5b29825894601f7f09f6b6f1b1ad46249d2100ef1e", - "8dd12b8e4529bae7c2e32269e1e3aee5998884f9a03de1154e80530aaed2a305", - "d3953888ee428d1507920c98bfd4487c7b07232ed4111eddcf1fbe680ca4b301", - "6ad5286fd3e5691a9193bcd730fa435b539164af797afe7e1dd50415969b500a", - "feb89756e71fb5b64bbff7edec9c854b18385664045624783aa756a0e82ce51d", - "29788b600d824b5ed1c1b72aa3bf6ca44786b25022999b4e3b209c09153ab0f2", - "a7f7351e5cc5bf622bb222627014edcabb7a845384486cb399c5b5e08f833c65", - "8eedd28b7fdeb329912b909e04938c67308d6bb0601bf29e94ad4080f4c93b40", - "a48c720a2f6fcddf3e4d993681c5864b458301a185ffe2114334bfe9a4fcb86f", - "172fa8cb59c574dc5b8d16d3de3e6423cd5edc1ae0f231924ab185800961a36d", - "a37163b5f329c7616aed8cb82608a8533ff452f7be1b531a84949a3f6d08d787", - "6f5c9370165cc1967fe4063706abf801c3b6ef249774741d0e9dbe4027ad4879", - "8d55e80048e5ffa641d481616ea32b7e8126f2dc887ff42ae2cbe584f3c68975", - "c3f7367d0a19f210a4dbea2b1fcb71dd086faf922c5bf437c0e3bbe827d20912", - "ca92a632a412da63c9d21e479de0f618cc75c5093f5945e673e79c80fa091546", - "66f66a63ae79d053a09c8ea6914728cdd3571849657974bad7b19d15393357ef", - "71ba7e9b0298fc69adfcac3cfd8e478e46943a1b26403d838f996f22413c6d1d", - "68dc63b298dd44efac9946bd1d1c5154bf50a1a1877c72dcbafbe5bfc840c931", - "8aa3cc184c6cef5190ab24d2a5fc6bb18fe274748b2dcbf6e29d0f72b5eac29b", - "98485b5aa967af69d36af4ebcb9e300e713b7a9371ed61ec62f30cbcbccdfbc3", - "d2cff33ff99c3f116dfcfce9710be1fd0f70e9bc74aee45c12f7db03cc8d1545", - "ef24b46156b2f4ad700b4a304c46518d1441d7042e56ab5113b5201c681373a9", - "f790b15c9635a83ec0c3cc133375d76a723ce6a84a2a96f33738acd6e89b62bd", - "185faab8c79deb4863cce142b15a94fecadd545325f5b5fbb2526f7faec15383", - "57fb5803ff791dcd7bc074fc3fca3be73ffaec10f155e7d28e25cc27813fe26a", - "9ad299073d2c26c64915d3c4737118415095340a26014ee363dc0437e00ab3b5", - "8bcab74a7abd569ad69377cc3f0c626835272d979009ad986cd471a63fcb2536", - "14996f71abf6972663c9d3cc4d30fbbc7987ed18cdb44e1b3bef0a5b8fe171cb", - "979feceb929f94971f7a18fad38648fd68aa36f9e3b87dcb5d0ab06df0c53229", - "c41336bef2d233fe16f0f9d33dfe501a55ac27d7ef68893a7854d870350e6af5", - "48da7caffb3e0777c12843c5f2cd8c09a32d178b4c3af5cb2726d0a8d8232e1d", - "13da2fa0735f10f54032537f71b30975e5b03ebc07e38f484f46ab4315d7e34e", - "d582f4acfc1b6098947f7494a89187c5e178cef96ee7497c5740ee19e0e96f42", - "0a01ba3688e6c72d4132c9e8a360378f9c5709e6f359a7384c5063ed9a1a6f0e", - "06c4c0bdd008671f2565a2743b74d41c971b29253ef27146e04932b0bed1a699", - "da0d35e0e0f360580b9a16763bae1d27e7acf06a600a37c5ce034990be323907", - "03da80c1fb58b8954ea71a812835f9d2c5e1d3c9d4b37e5cb3389f8db6708d86", - "c843d27e2c3ce343ad2adca7f52bc47e247dba2c87e6b4f7fb69e0b8b30300cf", - "73788660a4ec6d9e506bc8f524cf644ba64a8863ec230c1ff5b9621868ca119a", - "08f4ad365c393244595f80e6b838130287af9bf197cb238a9e41d961638a17e8", - "3eb070edb3420d6994b17d9dd6776e7a242ec0b6eabc908490322825a11a2983", - "8d95c1e19c7566f334627afef25ab4c18abe30fc6d90897cb33922e44de7e737", - "a0b37253344cdde40ebe211eb108d9636eed871325fd325c143bb87599b7f1be", - "b645704a22f739a191777f97b431054bf50ee6fb0a6aeed7dbff51fb0aa0c8f9", - "72b4ac351a385bcadcd28b4fa301d4d07783fc876c2ff5103f3f1622db34da1f", - "0e0975526ea7c01e48c7de75fde24d4c9ba1e56433a53220cd267a4201416978", - "134014109bcba275e7f00880b20509832b017b8075148bbb46c450a80d7b4326", - "a7182a62805de2bb530109851f9449893919ab987222fbd79c226eb601f481ac", - "a7c9eb18083a885328d8347cdf47c9d057dee703b64c1ab4940c6a81ab1102dc", - "6bb1ce1fbfe8f08b59711506d562e261b26f618923d3cbcaef9d8820e45f7c14", - "0384a4f00ebcc2b1671ab21d38cc1815eedd6ffe9ae5b5eabd241b75c22207ed", - "a29896dd53b7ce5212aa15cd8265f7f6010b14d1da45772ff03352fb6361502c", - "d36324e8074db7f3b63932e2f3d69b9a6763297609049982e534dc59402ceb13", - "d07cf0c5038b6be5fce136b632af8de5a62708c88fba4122272d6a48bcdc9bd0", - "c1c888c809c245c445012985f9a9753dc03ab4220f9b985aec41ff2c16ed276a", - "0eebbb02210a9671574e191a987ca23c42291b148588d05dd89653912672cd03", - "fe5a41ae8507d5e6c4cc0ef70a36656e28deb7bf4850da75abc780c17250572a", - "21e32ab5e36baba709cb2cc223ad122dd9931ae957b6c45d3c61d59bc1070757", - "ab655c257fe50690e53416b3e2d90a816726321cb8c6bfa9f5bca80ad6002ce6", - "74027cc65cd6546665a98d9dde4ebbdf61ef113e8c52d4f1cf10726e89477514", - "aa8e49b1c3bd02504984b30248dbad04d22ba00d45c2453d6018f7288edb7c43", - "a28c85539b7ee018c958983d02993a6284bced7439bb047a34c114d4232934b2", - "9b602b0f54f546a1c11a668ff162b103d1ed3dd61aa92287146d2e4e04194757", - "d263634db27d206e5362418be46256dbd38da8c8bd9e821c6170ea34e04c1fa0", - "16de891bbbc9c2c8836638c9b52c12b664976adaa5cab6763fff3a11eb2c1f12", - "5762c14dc2b00eb919c5cebf855c84b9c237203b3db03e1ef3a1e46e1f755d97", - "4e883e818fb6a61df12799608b0a25101fa742a0240d01ed657b3f3fa45eefdd", - "30ce5e31e57cc2b8a18113f6d29d3ae814dfebf165ebf7b9d65012e343520506", - "b593d1bec4b151b02064432ac54e264907907adf420603a55d78ca58d001f5b2", - "0c23b93e9338dad637496deee9feb3a97e01afdcc79595e9180c5b071fb18659", - "35effdb886b2ca15c1ab3e47ec855e572ffb48870b8cffc774bca2a9b2df8817", - "081920baf7fd1f26b6a9260ce05ffdb676fa388625e21f449f4abd12d9feaf17", - "e715020df14aa5d2c05214c945721000180f4b2f6e18ffd88cda229d05f59d00", - "aff1e4dc4035803dbe9dd60448e22f7d84d172d612f5b0e62adb802a7fd56de6", - "e277d309217b858562dbde6170b8bcc087ad766e24278a649e53834d57249ccb", - "f99e60f7ddad75281c3a7cd2c43d2c3514926ad5c12a272d1059b1e16b2564dc", - "896698180c40caf96578ab49a39591741c23db6555a529c1a6a15ab9d5455c11", - "bbb031b32cc5ee3fa569a1b1b36d55b1d461709d44923258f3ecf14f1c130db1", - "97355de7099f8e97a6c01f804e833d87442f766c2fb95c195c86506d7cc8dd1e", - "22f8cdbedd46d2f5c4caa404d0b360bbec2da1999b0adf3abad9778f71bfaec3", - "dff50ed4e85da6d424b8df7f844c3368cc98d9ac80bcb2675c098c752a274afb", - "f9ea1c965115bdd093546ed4417efe888781bbfe0ca548759c2adb3528cf9338", - "e9794fe81fabb8f2d3b8a6e4b864421feace6a80fb133b1a7c9f3ca44e7b180e", - "87e9fd7435fd69ea2be5411dde81e81b4922989cb052f392fa15686254c3a655", - "46df485bdd4866b8013a6ef8cedb58086bb469078b89744f8f3eec5b05666118", - "312d6f79165c2c3acee6ae7da0880051392deff1c1feb50634556e086f4b9a59", - "7d9282fa0c353612c2c5433237499d80f2405d5c68c0d3885e98a9723cddfe4c", - "c0d79d0822a7d50ac91a3a61c612b8611ca11f833df767855a71bcdff23bfdd1", - "914e9309beab4657731e04a3bb5f5a261d96b841c0db28f1dea6012af9696955", - "5fdfe23674866bd4f459c17d533a4edc4d9ebed90a3cb51780c110c3fab298d1", - "63e79694f732f7406a1de1b9be53d59797a15e28977584a4b90709f86c987078", - "03e1a87f965f035a08e85b39614e6a76dc63fed14c61207a717d80c75fe5863c", - "4ad5e351250b80fe039443b565f4d2371d1dc7f286ab575a59585449e7028939", - "cc3414f5301a82637a9a4ef807656cc6ae435d72542e5a140ee806e9aa9e0f2d", - "f78f96458acfe760a487f3e9ee7526087de264f9c2186a11a2e8a41ad4ea05aa", - "fe8b62e16b5c48cbc55d99c03d96692bca8a020fd941c0b588aadcdf8d675d9f", - "197b66698c1229b1c7f15cf39d2101fd9d48972f617ebc25d41ecfb3c480076b", - "410dc0a45057f4d833196d2de78c6530a918641f0007308269257e502eef980d", - "895377dcafc38b9a78ee3465b3e689b9c1c5537ca1939e780a7a210ddce52a98", - "821a7bafd0defdb12eaaf090d3567639a6e3cf855d1b0dabccfd3e48268098f0", - "9f87f31fd291e7033b60255d1b4ccadfd024d217355b05c951a8f4cede8a3856", - "1e787c57cf034031888338dd43286908177167f435415acb06446e3bf89d8d7a", - "d291d84e4e2c1ab877e48ef5bd9908b88a470d258bd974f0b82cbcfb49ed6de9", - "5098d3de4f9879f754ab4181de22996056af22cc9dead636840a52dccab9828a", - "0d55a895318a42f4cc030627182bb742ae7c0665cb1609713bf394a9087856a5", - "1fbc2c4e7f234e4cf4f99beb5ea9b082fc0b54b2b9534e6779f47cfd076df4ab", - "c33afc9ee95707447de0cec71cb0086463fae10a05613b0da7e4c0640c7a706b", - "4329ecdd462f5335b36888800185fb62909ad32478a5432aff3c8a2ac007cedf", - "dbf836d869a616b73a040907dd155f78e64285c94a86b5c032a4685ff091c95b", - "875b38eab492297ef332af8e9c6a93ae6ba6de85a6529b0598779de845cf32b4", - "59f5f121ef92809218f95fe35578ffcf134ff7a58cc0f1097d3d623f5a2eb36d", - "76b453b66e0db9676c293e1bb8b6d6514861427a9f80b3b2db82cc0607efaf7c", - "28d962de91ec6c17f635e2919449cbeca2dd983d04259d5b8f793e6bcfbb6e5f", - "ba517076c91ca561585994e03b90f31ee01916b5e85a9aa5e3a2d209c20df6db", - "00602e64363f628efc7c96403c7ab2e1fa6acc347a757f09ddab6d972adabbaa", - "e753efcf3d7028d5d1ce608e9ed06643504e36ae76791ce5de34f6f7a009df7e", - "70e2007a37a286d9472722a575c71caa5445f26d7ee59cc0075ca354a940b900", - "293becd179baca6e6f08f3963ad5ca4076120913927782a54bc058ff2839092d", - "8517bb83ae1796bed7c0345e53463a5f8daa3ae87c83a63ac25401a248c56e01", - "e7677c083c5ab168d6b6a692cf193854762b7f45d62c04c2b62c9f0d2c7d0aca", - "83e1542131d1107ead9f9016570143e3c40d680a67e230a05459193d9b1e0227", - "fb4d2baa3bf20ad81012a0fc61739f9cd050e5e62b0c2ea6f00a6943c0950403", - "9ea82688221cf6516e9ff9a547dba66abe08f790ddda9f27e433362e6152aac0", - "f248bb45f9683a205ea776010af0d412d8c2ebc0e224e09c262c84958a7f72dc", - "9a30a0f22336405c7c76321c88212b770c13d146e481af652ab69bfaf1040317", - "54edb5c08011eaedd2a162ff08a5b18b67aa3460896f794da0235299eb4537fa", - "ac1884b12090670fea8c1d09f3210303cd6e676c2fd9378991dceb4d13d62476", - "b69337d81539581f453ef5c6c9ca7d1a394b7df13abce85d70a421e5444edbd5", - "aa00217e5427d500e1854636e4fef803960e682a8646c9d05e43e63b3a1e03f6", - "cce707f6234ce08008697653aef1a461c20f8ff31c01c349fac3c469847c2f0f", - "5f6120cea3c6202344284d0ed246fe805774fcba99bb2b52190ce4626ac9d517", - "3435263f1ba0474ca5661f75d6fbede93d3f59b874c7b6eb583e7edf17ce985d", - "92d1392476dcebb82e4b1598ea7496734f596226d7307c34b7aef1d819d1dcf2", - "95f3b3b2e86bfa8c462383874d419812f04ebec6c7b0488b0580650bf32ff65e", - "41a76a7890beca8565e5e0ecb6647c4d90e2ef4122f6c4455d6b0602e9985a0e", - "123da811c5dfac3ca1a7c1e69a5c8a820c4736258b6eba41ea0e720980e5fc3e", - "b9e02e9ad7593cc7bbfe24d466bbfe48d601068fef66292ac119385cfe793002", - "5635cdeb1aa5d549b6ebafb725543de68fe76d256844b98589bee39054fe5594", - "e85a03ff2f5e2690757a1198b5e5dc71b626865d3e367e49d3f5433371330925", - "6cdbd6d7fdbe9b324e0c227fc9a103651fef9d2c0271a0f4154c5f0d8a6ceed6", - "1200acaf1c8602a4ffb448257965ca183bb80b63dfc844d78439257f2ad1af5c", - "3c58dc08e1d50acfe8d0472a6ceed054f3939d25646955c8747e931d16b8b461", - "e67190131259aafd16a03eacb00e514cbab2fc2235d40f768319a279f59f8b15", - "5e5a3fc69b01e14ba636a489e76246592e7212c242c869fd72a424d7d8680a85", - "8a921f7f0de77a18377ac07e405fb8cda8c0a73c1f0c3e8cb7590730948d7eda", - "0c56b33f142328bf260b19caac4f58a1485f030e6b5238ea211127e21c111672", - "8f05ca2ff82ac999e5d40c59ff00a14f4baed4a65a319f9754ac455841d8794e", - "09cee82e04dd2795214d62547a9ffbdb1b00377c8e46fe0aa30a93e4b95a92df", - "bda014e3e554d816f3779682cdeebdda8de582169d2345057ef189b63aa2ca1e", - "9e251cef40629da574786d83caf5586f16e9f47867e7c260cbec9f1d3208f071", - "4b23a25e73ff7a263aa38b293df3e9f56fbb355c71ae8e032a337de94c1426b8", - "8cd0977366581a90d409df9b13c8eab8b1971a5fdce01edc28001ab8408f291d", - "ea5702adece193bda8cc24b405b970704d95d3dc43c328f795f1322d9aaf1c31", - "acaa51a84bd1b06092cb9df56ef2864c694525bd72bc96205230ab128df0dc90", - "78072da84d5a4a905a7f4e74d4d07e5f1f5f7d86194969a6004c25d1a478c54c", - "cfe65c0952b192c7ed73eac4fee9b92c902f7ee7a63b9c7a1f97269c6964fd27", - "1bc213cd7c80d374edad7e1db783113db9694a53dfc894af82d7ecee58f0a8d0", - "76f92d8596f9ee8fe0afd617c288ad66d788fd5912699ed4a0eacc3fde8163fa", - "41bcbe77a8a39e49db29ee74d0bf742f643182bd687823f1c6b805593fa8388c", - "ea0b813dd4466dc0a18112e2eb0d0bca474257ba01111fe54403706b65737a0f", - "24e3dcbb69f4dd87cfd5c6de5aeb6b0ba4d3aa19a632fb43b9ffb2c61dd43ead", - "45be97dc3946ed1a633ccf3e82c30e12477a838edcf8afa824dd5ad9ac8d1eb2", - "ddb0c2a5f5b524592c63c41d74415111c1c696b23b840004880a6e89a9254fc9", - "7805ab20459b8f0374ecb569d6b67707f08975ca521624e586f756883d3d8736", - "6838022eb768fb392c19eedb9c5f1cb1065bdf77c2956e48e2a5d4e4a2e5f4c4", - "6df7e7e60c564013f43e9d178b87eadd6a248dbd6c82a3257cf765c4ff37d434", - "ab296ae153c7e6677f3edfbc5e316dfada121f9a7290bc4bb665acaf784bdb91", - "519cbc90bcb1a6cc55801586aae0e57a25a96a748a365dba7da28c72cb311aa6", - "4de29ff54fc82c0d7253d78a927b695f5819264c027faddbfd722777813052e8", - "85ccddc156093d1c5d2ab850a80a4ab2dba5495920b5c00ebeaa9f1e2b642bad", - "044cb535414eefdbc780b0975589d67e711894419769a4e51ac4aabddfb580d6", - "c009eb9d90ccc9c7076f24279773e517870edb10f75487c54628beed879497ac", - "dfc78f607543988647d815f3cfc2d0f99a9dffafcd02dcf3c958eeadfe279edb", - "c69cdf6c96b30adc76d61a862f5cd843aec32638a775648936cc22aa5344526e", - "de2a6fc2d14de8ffe6b7a525e8471f9e91164f4eef6040ce623193995bd6fef5", - "8f4853ea198ec928217c4c94c3affe17880b62e8c3fc364415cf46c86ff6722a", - "9d28cf973e33ea126b1ea924176b7399272a9b91ae9dd4eb25729943a92a5c56", - "d6683d273f5132f16599aabb58e7d1666028b2d74f9607e6d7f2dde699e8113e", - "7fa6dcfc0e28e434bf671502e39701cd878f36f48c305b656e4b5947c9f04ae8", - "b686bb15e5efdbed6a6143ce62fa9b42d1b6eeefabba4b6e24cd3f98ba38b04a", - "b82ac5741c1fae7da5fa77b2dbcfee9b3fc28c23ec393c676ff6a1a6d596d948", - "f853a176648e6b13df6025a540a556ff30e0f0535201ea9f7d60c877c1e41533", - "5537e384e7ef5da63f5f04728d84cf39940b38fc3697c4a5ff7a958968ea8b74", - "65d5c9d2ad77760cefc476b663dc3539560ec4f555346ac69622208c2239f266", - "84787b618cea268ff26343eede224664a01ea5bdf6bf886303f3c54f20910094", - "6dfcd0f0b05fa8f2e6a9b2b94776f925acdcf6ef7f65f2c4d6ceaba85ad4bffb", - "1b8ffb4834e8110e9b3af93379a17858e8307448174fd136b1d33dc7636cb49d", - "706f0843d5ede25f5c793405a1a321c6fb94d4f7c439cbf7e59425e4d6bca070", - "b978162c9bd2b63fb34758c5b98a01fa315d51693e9d4defbdacc3219a2748bb", - "2373af2968c3074e2d61e194913eabaab8b89c92407b41ea5af8768a192bfb69", - "394ee1faf6e8e8799cce2c48332f05a4260adc5113d8078782f22ec1e613cea5", - "03dc1fe8ad0848e3b8b2ccd10d7ddf9544df4c507f23fb07cad7eb3d8cae5dbb", - "3d2a83b75e629c982ed8d1c617ccdcba36d450c0adb3667cfee24eb7c8f062e4", - "3769092628e73d1d7035072b02abe6b67ed2de3f3b55c5256f60b2744161fd86", - "06606a36677415d8d6fd00fd3bad99e0f722c33208ae03e84586ea2652860191", - "ce927f9632bbcfdcb92f4bdfb9df6995d2f93b1248c38ec9b593d82ade5d6c2b", - "ddcb751a716ec673d03bec6a3de35655c9254a6983514aa9a4a594269341fd07", - "09f5ec42a7b5fcd3a32b2122eaaf846e61c1aff2674b58cc0f86ed8ebd410ab6", - "8781de32eb83c85cb6465f5fc5aa4f10f48adcd410bbe77b62a264d6d1c51882", - "c27907b7dbecfd19fe285e8f89d018aa83cf3f79d3d1ed4e2e3c87187279bbf6", - "16b85d172b6c93e48e425a8d7be3552b3c03cdecc9dc685a0c09dbc5f88fd08c", - "3a2d43f9191d0936d349e5e134fea98301aaa02236e010f0dc154ca82a05c280", - "6966061c13f4dc617f6c2d8de9e637fbee10946dab0f70770818b7bda5e754b0", - "df366799dc861310a0b842feb9c9354edefd5a98b6c953b99d035556a852743c", - "36bb80f64379b19440361cf8abaccf1bd406f50f999cfe8873ef24c4e0836bcd", - "c1f37bc53b0f333ad23223d010994dad088b954cea45faf14aab5bf9da82cff0", - "5f0503c2e8896f0ccffeab445acdb5921f6f02be3e82cc19b2b8f218ef88f7d5", - "a00e8033c30ea8421cbb3285fdea14e446b9cdc004ed983804d4a3e77a600704", - "6d49aedf130c494187935d6519c6e6bb919cd5aaa5a3d1e2536b21169854aa0a", - "d41366aeeae821aa16febd833cab0bc6d7d84addda8e5336d3bc5071ed534790", - "bc307d6f2a7d92ad91c63f8f6eecd1249b2a8174f433e7af113138f1992d0e2f", - "10d8b99c6f18a008c3c3cf2e8c3467287185b950a2a6b8728f2a7e4cd73ef75b", - "2735b9c96e8d5e7652bdb0f7208a524d68e904f0425b722421d03d521272eae4", - "5036cf9dde28134f059a1e5fd4358262248a7769de830fd1cd1022c5c85ab08e", - "b3dd2bc8c017a75def87c869bc5a33ba9e2c0030ea297a59dff561c314f70ce5", - "f34ae00f7fc51e7a6e7deffa1dc301db38dd9e9b7c782969a19e9512fedb199c", - "6826b0d036562babb3ac26d17c61d227e40a60fa8e38c7224da00a96c4f1d541", - "95af77d05cec6b401568d59ca9528bfcbe69965d972d38597034b387b9baa125", - "80c697d7ac92c3e88e952592fe473ce06fbe1004f1cdd1afc901852c743227a6", - "0e6c00a06578a22846ab332649ab95b13f25705543bf5586aeba60f1a6331f7c", - "e8117f405ae1e0bc2ea31d577d9141c36a711c09070766588c1276903350022e", - "215035d767a31ece2e6105a9a7dbce1da5b7757e43f02ad68e5ef2f22e3e4ff7", - "88f796632ab910ede9310c82197f45fbc3c9fc7fcc4c6875123d20e5475e41c7", - "db9c56871a96bad339cee873b7bcb7a0bf37cb90e20e179b1cef8d74ae9eb49f", - "6a5e43be241de424b1902d84f8214b6afa273331460cac2b57e34ba0c8924332", - "3d2f843e93229e4bce77343c91913a518dc834000f01eec8c43ad9eb80a22dd3", - "7556c92b78f0d5582088808675c4b60bbd4b4d77058cf13e67413edbd577af06", - "952cfff7e92150b57302d90d8707b446a978e3538620e669de48ba20a976f4f5", - "71b1d361da47127d125e6a73208b284254c70b6122f9023347977cd12b6d6b67", - "82de5ad538c7c6afcdf756e155c8ed98a585d1a4a49fbf950953fc13b629adb3", - "81ce91667bfa77496ec9929799694cb4a6dfd897e50a179e4a89715630f0b7f9", - "c2e6a33564b304645e1193a4c6d90d10482797b844b5de86978c468b9e01710b", - "7f6355e9e6005c3cb26974595c751f558df433535d3ae40483ce2c028cd6212e", - "9915978e18a69d1e80dd8f85637e44ba2d90bdb6616e7b3a0775cd121b9ef70c", - "e337df07bf3f940076ba92ef5e4d1fcff2b66894123093f0def018e820055be6", - "4e0b5dcc33f719fe14de27d570295237fa8f8a678534941e0ca13eb3a2a8ccf9", - "a249f0c0741eb628a8c250caff9cfa01394baada6d0ae3d0b33400c1311454b2", - "46554886680b8ed4dd95dbbc9f1414ba53a258c163d07b4873c213836aa703c2", - "fbd56d598daf3a23fac5da9bd8ed9f99d4f6e06f5dca64bb72643f664b8751c1", - "30bde77306d0da26799208d65133a3e83932fba3004d4ee11ce1fcc0da1fd49a", - "5e7963be1b2d80187bf39e141343626b0984299232719357c536c5ab9a7d7f87", - "da2191b6489f79612145b0e7806cf343c69939b76cc537bc128663a61862e51a", - "22ee4056da3e71cc228a011bff80f970139de30c1732f29f28247dcbb0dfa9db", - "f6107a3fc6e79bbe881f33ae6d205efdcc0669db7a7612f8848b87c8fe03fdff", - "4897e38943fbc9e17db751e2fd126d8fcb0c3ac818264dbeb6f694b2d23d8b47", - "93217c673578f12a947c054b243090dd2e6f2eaf5b2fcf772a2ef825dfbfe1bb", - "c3693fba8ad11f1b0c4b3568a8381c75ab89354797b90f85915902ded65e6868", - "28b3155e1a3df148135d15eb7779d1453e85d1bb446794c4a0327d15646a2597", - "40d729135ea4315b67ec2cca9cdd14976860a7ac1da82fa15f251b7e6d065acc", - "8033bd0dc6ec440890535de0a51881a9d4b4aad3686b13cdc6c62b8c4568b847", - "92d7b98c52cc7f25972300aaa834e0baf614383c53ce2987ea755281a1aa1cda", - "02ebf738fa8cde3cb5b5ea90e4d8eb3f800acab86b781f9c35deb0d7dfad0b20", - "252df9b2c47855d731631bb8189d9ec97bd5c73210b323b1a18a7d9bdd20ba7e", - "aaeccebe74a08c4ebe3705a2590831eea128d43d05120350f8104d645c26de6a", - "30c5ca9ce824199e9b4804ded646d9c247e1304b0509be6cb345f0adad4db868", - "34f6801c6ba09dc9e0f82117d597a792dbe941e22dd381ff872916281250ec99", - "04650fc1f6f9c7d827079863c0e08d5562f0aee571a3da90f4a04618c42f5068", - "e6d3ec981928ffeb2defa944ee289b4ed2dc4a18b9df10249a622ced29bc2e8c", - "0989fc5dab0fae65ac530773eaf3969e659f0e8bf563e1cf68fb73c0a999c44d", - "3bc96c442ae50992398550d6ac17604c4f3feb3a711b42a03da00fec948e5cbe", - "a0a2af4873db3ee9e09f51c29c1d966e31eb5e0a0d3655854fcec624e8195a27", - "a18c28b2ef215f378ad5220dbcaa170cc38fc5b52ba759ce77c3869230bdf173", - "de6054b3481d91e9403ccaadf30220269a52d2f0f193c1243d20f8f8b424b4d6", - "f0b66e4202ef754aa0d658c730c70005e859e1ae20944a1577eb437f3d20e768", - "8de9a9abc3ea967bc5018080a1225e4c36b52d7f80cb135ff454038c3a8024f6", - "f6ac72b9fa4f348316834d659131a19d397848b3ccb18d3cb894c53fd770a848", - "42b228a6a5d731c0a169504f0005583992792da9c4d8da351825932cf049df3f", - "d83961b1cbdc23d5b003d5269be0ffc509a418ddafee9a539fa37c28c9f159e3", - "5e7a5c2ef9ec5ea75440ae83e8c99bef19c807f14e222b64d31daa828397186c", - "a5609ecaddae347d9a782d90bd01b51095992253ff144085662eb3f6ddc3361d", - "5140ca9234ce759ff78bc2947c9ae8dfe15726c33833eb0e6f4b25ea7f823903", - "41397bde07d4dce6c7378d5bd5b478f5d83e4c35a198f09292ee81baf7e7c1b4", - "3df2b2f736246a7a63a3867271dc702f8605a57571d433a2d21c1113b679a9cc", - "4091d5916e33a72afd370ab05ae0f02a6bc4ff3b792f5984a65cb4ec54f870e2", - "32a0031f3a640b5231a3334a4fb56c0cc0ef85d4cb4eabb7f0d76a947733400b", - "caddcd93d07fd0683b97e41f2260adade6ca9c0e97bbdd8607d8f7b64deceeff", - "c39374e030561d8ec205ed5231977628bac1915a852f8dd34e914d6c4bb2f79b", - "b206369eeb3d1a8493c1b88316b5ec0aa2e1c3d62bf9c74a848e8350162c6178", - "67d7db2606911ded7112987b164f8d331d3b124d564ca7d13b5fed94fa2d1d32", - "056baa7017ea46c31011502ceecac1f923f5fedc65055df9e4120d97166ef893", - "c6bcf445cd8cab33416daa413a97d79941130b57569ba3a65a0235aa300d32a6", - "dd29df5fe3df48b554443440dce87c87810c5537bfaf2548445aedbefa398ac6", - "f1831363e57d0ebfe3ffb2f35d6b152780f34e44b72934251949e8593c801887", - "2d91177617046a38d44da531ec3009c7ae13c69cbd7ea0d01a3bfed8e0b23508", - "8eed6df0d162177ac9ee01980a3e34b8429ed2455f027df4c289da2f064b499a", - "131becdeff32ec26235d052bdd27e646da0f8d01589658b6ccb2f256398ce286", - "136b282cf6a36fb487bc4398a88c624ab5cdbfe97d837064a711ea5df37f3ab3", - "4d86c4a343b3f6bb6ee3786d42c61a593e28344ce08a780f5d7ffa7c05d2ea1a", - "8c1904812a9a8ab1612a322b7ce55e3f0a1f6d0de3f6dc78d9f1bee4029217ab", - "91184aaac14720a2be5bd172e1d38af317ec9382695fb1efde7b5a01246a5fce", - "a126e02dd1e4ccc8992834dc42ea1f12107b26c39e6b4980009a7cc4fad6a142", - "3196dd160dfc4bd770940295c79232921b1a3c2ed5110755d0f72d86d8f5fa0a", - "dede5fc5a014201c53e70414636d26d80bda393d2c3177fc7c1894d74385fc90", - "d5f32969d529fd5e11ed25ce69aa381cdad17f9bf290d01992b42971af6ae7d5", - "3625e0c75dde45d62b7c06515b636277ca4558cdb7281cd0c7e4a454fca39c4f", - "e0fe9d59693ed939fe449c8905196623c7df2496c975ef5de8c88ebcf79c28c0", - "aa0725df2755737dcc168fc53e69e9529220c94f2adc2d81481a38330bef751b", - "36dc0f80017f0b404786bfbe433dd2eb26f0cd4e23a8c13ca80c288938ee64b4", - "d2c7a8e1f01aa7e52cbd7166aa44894eadfbff7c1a5a1c6f4f9363aed56049c6", - "e518983fef98c6220404d44127cd083959b75d70f0dab754762b1262cd745f31", - "f7d2289e6c8617acbd6c1236ab1e162d7cd85f4005072634f0e3e826064c928b", - "e3913955129d757cd223e2fe08f1b1fb09d57a634516efa6af4b9d57df92b33d", - "1a226dcbd4d77949f7979517f2305e316acd95fffecd9d55cc29ef683bc6861b", - "3f7fd18022141ad72077746499efe04d7d2ddad3ce1f7f1d02d417229497d093", - "b97fecca699343d5a0d435bd679a77ca46ebcd3edef7f906cd932717c9405673", - "89c1049d9b462703f0d10e126c49595f8b3d6b97d3175e22f0be5b4237144717", - "5079c26593cfcabff3c741ab91f00d59bc6757abee061578f79b9f888c811f5f", - "b25924bdfd49c8cd2ff3df92a5655baf5f6dfab75175ecdd894e007c12405a8e", - "00dc72492943dfa90acfe092a36061d92d5f58507efe38ee41f004c8af0f6acd", - "6aa169b2b3bca1996be49ae4479e40ede6d462d683e00edb858d5db46b600ff6", - "4a012f9ce8c2a00fcb91921c0f928fc53cccbfa3751d03eeabe725be96d45241", - "1c9cebecb19d36c279120d96b050f7d5207b7232487724767278aa2a964cb4b7", - "c7321e01db50d4863153d0aff0077ae868cc22f327baab61c8f22b8898436265", - "b65b4649e676cd5993554bb808ef44ae2e17a6790d07d8874443d9899a8238ca", - "d08aa43bfe12ab69495f0f06424c0ac38a36df03d7bdee7c086dfe64dcdae30c", - "a8e89e41492b22d47ce26b5f83fdde22f1fc21b247daadfe95cd17652be47e3b", - "80d20a7c67313932a63f57b64626492fc165f3b52fa13316e8fc6200a1a79542", - "22408db4a67e075351ab8d1e01ab517726d0dac04703f98359e758bd8578e10c", - "9c8e6e27bc24d4925361af35e8089c4df2881e3afee68678725a58c7ce7bf212", - "b7068293d490c3737f7fc53804ffb21561833f9f62c61f107f3daa876e36f7ed", - "15fc382d16c78118db572480dc5aa5108c65a9d7987d96ac43d404e3b50b7302", - "42151a2aa96f617c5cb29ee2a349bf781f4fa3ca3513a64f363249b43bfdebcb", - "18573bc1b104661351f23658879fd79610b2978865ea7111fa999482122af83a", - "ab0be4f8471f86307ac05637e4712c37de0064517dccb5873f4b9a974e3dd7f6", - "d6db2e78ea1585a6d7487e5342ca7291023a183abdcf6d46397068f959bcea50", - "76de78f7202e88bf69c31032fa17c34487543e065e48a9774a3cab3a2154f6c5", - "04d4e08ff397c2b044fc9b74beecad3511704249c0232069a37517edd17da98a", - "1483d6d43569d4cffb695bb46a7f4b806d2693b0d03cc456f5d58724e3a05486", - "cae292b7875e65d9788a0f87feb61fb916d872e679cfb4b9b45f09310e3e8121", - "3a808e160a1541da21aa3820d9471e870d2434f7fd1031252a90053cb567a361", - "96166bf72cc38cf4289696dad21ce7ec5af11236598fb4e893a5bb6b5f89803b", - "c87b51cc5d6ad4325d23de7d82568d9746fea6b9ffd12f8c51759f7bdcd8fb22", - "4da4de62fe523d02a0e8bdd495b4a233226e33ff21acc59765f45460f79ee9d5", - "d51577735d3de44c9d914eb0fc4a4dd6c29fff030d30d95f98acdcfe31d7a5ac", - "28d9dd455007ddc87421518d92e8c29478e658b767a02d46e6fe50ecd28f2b1a", - "c8a5b10ff95f0c53c2c44032f8e32e0306bb1d7cdfb9e57dc77e377705c4b5ac", - "ca634d0780e2b7c6876261771ac1230e6e47830ba50776aa8f686e8bbe7a4070", - "c394519dcf2570dd11bc45112a77f5bed8f66a616a6dec4a4ab5bac8df7afb56", - "f58d7472695a66ab2f574b0f3f6633b3c3056a46a88f25e763f1e7d6865a3bf0", - "210417ddf09c1627ffe04bd82699efe30be5fe1799d50711078d7177b6e58ab0", - "535939170c7bfe155177e7834a519d1ea1cd7f9be54fea6e67b4d51df14e45d5", - "63540be56ca80440cf5fcb8410b45306bfb898292efd0427d86c41fb368920f8", - "6656a8438f0e3211ce04492c25c83007cbc179723759ff58b743b2a26ca0022c", - "6eab979b3e67a46091c7bbc5657743274b1aa093960a5d7c698f95cb85e0cb9d", - "7bbb1a744ddd5d183c353763b5f9b84f6359473d4f643fd2355f47e9a6652846", - "c871c034194f22c2426b063a9f5962282377de090f5fb49c49d911d3dea4b205", - "4dd3c465278098e50e35cc865ee6c5cc7f349e7a07a2c6f2bf013d7ba60e6b14", - "3bf34d5b1d77b80c248304e5d3362f20db959cc6e0b993ce31953de73dc3e904", - "e16903fa1a79954af796ab97f8518af3f5ec2638b60a19810ba765a6b5e98370", - "7f7fcda245a678c9cce83fe5a8586223e980457dc9c5280660530aa929aae035", - "a12884aa92330a4bf0dba6f91051cade2543ae03fa0645aefb4b8fab88a886f5", - "9aa589211595b51bab3992ce14b8f2890f014dda34128b07bccde3805d489b14", - "b0c79f6a5d1ba300ca28f1a2f50df5083017e8d83e6e4f33e861e9edee769e39", - "1122568dd043a38d197e4c3f4254474017b77b35fd03d6fb029b255f7865da72", - "bbc1c1a2a52e43b35a658e1630554f0b09d87e5cf4afc4bdb72ad02ca54881a3", - "27b5abbaa00b319d9095310858cb745e96dc6fe6ec92b98ab77ef0bb008a4adc", - "8fd1ac6199e9269c8857193eabd03bd63d23800457a04e1fa61dfc24eeb495d5", - "48ecae1bb9955d2458842fe3a13bb8162346b5113489fa8cc0ba90ec62de4903", - "82dc811fd181a056309d951b0d88eb3bae7c789e164106e0c26a57913d95f0f5", - "bf5b03c1f09e31f97a024957a418c33dfd154f41365b03a5e849500cd6b4c61d", - "a66fa661c576495308f2d01fd128ebe20f756156d4a60326bdca77d450d63386", - "55e31d824ba7d85eee4c6c3aa8f022815898c32408c783ef180b34ba6da92067", - "daa8775370d8d83202fc3ebdaf10fb2cb7c1965b1ec4bd981021d124bc2f95dd", - "5db2a6a421857d9692d95e810ab7428e2f0ac3c3b894bb2a85f06e175ba70263", - "e1eeb405974aa779792608dacebeb9fdccfac9f0b6bfe2134cc9c537b327d81c", - "7c1ea41ea864fe44b1ff9ead1a8d9d2d5962bf2f3c205cc900a2a1c32de74daf", - "e6a0c52fc889a5125dec7d975aeb2ffc87e149b3d168bbe860fe2e3ce1c97f9a", - "b361160950f89e329dcbcb3f78b0d7ffde61d61b135442bea6ee4a5d87fcd798", - "3e5494d88ec78afc6e59082295db1de8e873882c8723c2374d5b329a4a495e6e", - "8ee6d255ac4e6f1c552d234df886f3a77affccfe173ed6d7210fbb89d0d2f4af", - "3a549e6d1ec1bf262f7ec2cdff5ee3ac7ed7f41790ed8f9f531bdb730401817f", - "bca024f16d99b0b7d0cc5161ffaf0e7fcbd74cb622960f950afc053bc5dcbfcb", - "526bb90badbc56c90ee465bf54af9abadb8be4f0a5928b0ca7baa78d46d73bce", - "20fc28ac8a73629df752f99c824a7e884733f279948c66288449fdc7c47aa688", - "3a5f6293d2ff14dede9696f769da5dd7430fe3473fc066761796a30e18ca61a0", - "a517d91eb9d213e4bd9dd3731d5b28e7ba710ad4a9ad9d51ed607ea4b57309dc", - "e387b025c2835e0431e739e9dd5145a9555ba5f637d2e8f36c4222ce7c30c6f4", - "c48e416183f49a3b916fe96810614fbecdf1e647eb66a00d6f6b3ecaf69462fc", - "e8f222f4f62ff3fe5828ba0eb77cee1c7f0f25b5b2823e13329e19142917b464", - "a1b032d5dfef1e0cf7873d4720efe5badd3537158d07c54e4b96095a69cf82c4", - "b0176412e0c88648d6c71d61953c06329f35ccc4a1d5c5cab01744fb324011b1", - "471f6ccc4c40cbec0e08cc06b463d0aa961da72c742b05d7845e56f31c6009c1", - "506ff88f1e018771c6da9cc5e95977710cb4b3ac6c0d5de3bfa3d9a395973547", - "2ac08ca44d6694e3bbb747ce4c55dbd87481efb70d7b9d73363a171657780eb6", - "28aa591179732ec3db351060857c03703f2753053796ea47ac226b8a504872ed", - "a7439b63b212199d82e53098648a9b8a7e0baff9e62f2b58c59fb341c9d8d645", - "9cabb4b0ce407f1dd629488fd43694efd3a4a75730546240cdf504c2ef14d1e3", - "399d4a7d84d79019af5a890bcb77fc0a757c73a30ab72d7f0574d09b85f35035", - "227ed67a29cb072dba518553412255abb7e1686094d263c64b93d5fc2d2abcc8", - "615efb928a51f2b89bb8160ad4b5dbb69e7ab2389fcf164178a5d28d4935f93f", - "82d495aab2cd60f30663ce62cc12a6acddee77bab0c48ba2d27e060ea93cf2a5", - "cd64273d39d2684087adf4b3098355844249d71899f557b13ed69de8b870b6d2", - "bfabd7099bad6fd72ea675c860d9b5428855ab4e818e7818c6c57815056ab7b1", - "132a19795fec70d327a39f517c69a6b3b87c1e75633a24b48b5d30a22d47e02a", - "bfa0f2d171af4b3a40501f79bbcd5c02169c1f871d158346cf859fea991e951e", - "8d295612ac308d9ae1e85557230943bb320e9f054c64b474d1926dff838c6f8b", - "961688c9ebda45589accc75fb84866c99fe38020bfe63f14c5b78813ed28ffef", - "42989b359cfac99b3812cf4353cd0ca416d640cd6732d90a876cc13949a8350f", - "7ee8945ef0bf7d57569885c4006bd43e1d26a043698c08361c7fe5f9bf8937db", - "5ba633317a09953ff7e52b0fb059ea8ea22c2cb32efeebae1b588d4818c707d9", - "e9669ef27a6330e7824f7082b929a6c22c9d0153f7efce2435bf6f4eced0d0c8", - "09949a75d11415d4d081390929492cd68514c43af45395cfcdbc275d898fb8d2", - "baec913ac8f6f902309d39fcda5ce0db96adee2ab56d3d493e6acbde3224959d", - "45eb9d620064d0d7831f51c7307ded6c008e664fec956f9d6773b8e0cf415274", - "8ecf54479536ea49d03c8502d35ba4b94a85190330e59f35f560e8a08b0c603c", - "005316c8ec94701451c1dafef356303c5f0785644a46e41ed6cca14a4485a9d1", - "727ba71af43b1c23027d89b14814db74481edab9d40a92508787e9e6615d04d4", - "8abfb00442b496ef60726cb3adb64f46a069700a9879d7618808f94989759884", - "454bb988843af685f0e47a7fe977a5b16e6cec7c3eb5daab86261b0f36523fcc", - "3486c8bf2e60b917e05763a4076957753681572ae0c93dc8b93cef50713404da", - "281dd4ba7cb1c21cf7aacf8a245089ecc751409f360aec5f5e8dfa4a9851de02", - "e03f22174212647ce7430594cfd164b388ac588c2d854a2f8125dbb762d9e2dd", - "64b062c1c44418620966543cdd9e7d040723201615f3df86c256cda2426e36f0", - "34c8a0ae81a0df8c369b025511034bed48d2b9332d32187815fce56c58cd68a8", - "aa48f9d78e37fd87fc265ddc33b56174e23634fa35af1a49fe8d6e2d96a559b7", - "b48d736ebaf3958661099d8df53cb51246d2ab5950f18b9c4640aa2a3e9b12c3", - "89473873a55e0b57f95ba8d7f6e313c0782953a0c8d0a4fa8979bbdf00839f43", - "a441053dcc7c1d96fca410e3d9b19f149e70333f66a3c81da400fc54b935168e", - "df291c973b9a6177e28f54f3da9643d2f957d5c4e4322e0d9013697cfce661d4", - "a8d553059d50550c678561a052fa1ec6940495d1ae36227d268a6912c5e47a27", - "1b53552af86ac4feeae380f51cb87201247d19f6bc1075f5d8f00826fb32fbb2", - "2cbf10bcf084f2fb034ba5c953f8535698c147074cba4c652fe2dbfdd18781ba", - "d4606a0c73058ddf02b2dfbcf0901fb47314aa23d251a4e7af064542c90c04c9", - "46d5d6ab86c67d58fbbfbe11a451e3c4959a42d1034ca143b44d5a802a0ed6b5", - "2a868b07e9895b904e35fd5673187f0d81bd08eeebe924deda57dbc6b42fff54", - "c5a52eae9b2e8ed6e8dc60e04c1ac0d2e7631ef3646c56c3c8dd22b2eba5070a", - "596ec96a4af80b9b8aae89f7e55768ad95c48355dc0140fdcc0befbb83f6aec9", - "555b6f072a0afb8fb726d048b26d0078ff95537df7d25e29141789f099a6e8e6", - "730ffd805d3a4015dee82fe36ef9623fdcd850b907b2c79a8812b15f19545567", - "f46d44a28d893020dd4d7fe7a0d3bfa98216ea2349a00548dbae2e00c799383d", - "ac2d31a21070202d004805217c4d892c41d03d7d3e5b24f0ca4b3c4729b019a8", - "a4936c341275200cdbfc29da7b22f6ca88d73cebcc53f4557bf5a0b56110a192", - "ecb09a392c7deefab51af6fa35fccf9924191a0e9ec069e68b63e84bff849711", - "64c78f250afb76507b9fdfe1603a1edb76800d22e8e44b8505570353899f8007", - "a29313a6661ec1f718e1f1ec66e4f3181c45e5cdf4f86a519728839d9acee1ef", - "44371e6fc7a41da9564e484185dd326ca00a0a11e63ae36a6253e03422d336c8", - "ac29e01df9abb463b9582425ec52c63ad2a828dc70dbc7349be2040b87345666", - "253c5ee5604011488cdd276afbe527791854295e760c7e846b37f8681bcad6ff", - "9f7d7b591e3a8f6a5e15a441b74da72598c114147d95c0ab26a45471090cfa50", - "138f87c78a47711698568fc41a9ec69dbce45a035f28fb3362407ad805ed0140", - "66336288c2e6e3862250754482a3847a0cf69d73fab76a56414d4832533be873", - "e3d4eb5b30a2325a58b710f65897d57454d2ae64203da72f6075c7f2342e9b81", - "47be546e0d2a294a1e5f6bf47c9f6416b529e0fd99196b310b2d3060df7c3833", - "c4f2e922e0c6c87a1e45a09d4dd4dd6d441a4fbbf6ea208a7cad53d80b876e0f", - "26b5ad7ad300bc222d6646569708ff8e25dd91916c4a62a007ebbc9428d26862", - "14d3f57787e9ef45280ae3d070d0cc3348f112222fb38ba9d72a7654ca7af353", - "a5f74d4f7955f6b419209c5e4d416360021b9b4d095a99f4b889d61be9a945d3", - "cf3c80d8467a56a1c4ef9c61078e46436766ebf425475ded1ca9ad6bebfb5814", - "b01046d976a8cc89490c5d7bce5683bc5e4424af3435284b5d68422083fc44a1", - "6348674b53dcc06e470f3a39ed43794b6f45b34692cdaa5a21544cf5552d772a", - "9696a26cd94c8ccbaeaf4f49982175068a2c2e3877e2b1c6d300d2383c46c615", - "1a79dd4c65ea2643ed8aa3345a800b1eab75f1c92544fe9f948a80ae122423aa", - "0e0025eb223524f07b605abe6e70ce26d8323618d26aaf229ff71bd612e3faba", - "ed8cdd8bd08aa1f87cd7ca5608139cd01bb6f709f546e4b1c37d4c20d9302a8f", - "6eb0ace52251fd0c44b86fe7e0834def61fba539ba7a4c2125b38f6ff0bf82cf", - "dd02ad7942db1b018f733dba43413d57298c40fafd87dc77ee98783db5ad4c09", - "f58dfef650642dad17c106aefc27f5ef64429632ef2c09b82c580ed207b3c41e", - "61b9bb2e4db48e29e4ca1e0548ae85c9ea0237ad76dd0b9fdc4953464abee51c", - "a6196357edd6bd310655979463f4a3bae971f64ddf8c7dc41fdc0d6f362ad549", - "8f582314d5d07f9c05641f2054e52ab157486ed4261f8c35680589d88638cee2", - "f40efc7ccd51aadc7f9f4c520d1d528f461ca180cc69a065b06c5c49c182d31f", - "e923cc4e83e9ba4bdc032b5b5ccfff4443dfdd66a4dbffe9e1389c7a4e7cf8d6", - "d98df137854a278cf24643b003d5a7f76adcf8a2602246749b4ffcff43cd9da6", - "e6daf757a3ff76d95566c8794458da5701de3b6adf063e043d9628da68c6f9d4", - "1d0184f0b8ef6f6f9dc0c05156bba639f9964665246c5eb2dffa2dc24ecab4b7", - "83ed364d31eb1aac333e18a618adb160fcfe6d4b0a563f87f37f15fff1714f75", - "3042b1b3a3f5c76b6050f307b0464cc770aa1f593c35fbea65fa6ef121e56684", - "760e1a1617fff938fa8b6dd5178425cc85e310759484a16cf89485492ec6181f", - "3d86a24aadb52a2698d589ada3f65c582f65a1fed69b36970c0761d60708dce7", - "2068cbefc2f56cc8091d12e5f7f8b41fb68877b83464131d0af0a705c783ffe7", - "6195cfa2894ad50df637eaecd65d5c56ce0b21393fb3c65b5f64a94b7e20d481", - "70ddcbaf0d9f10ee738aa85e95c40fae135c15ab1cd665ae408240482d176c06", - "60fb986e5bfbdbb38edd77d7f0f96aaf8cddea9fd5088ed561edcefeff18b78a", - "e36bdd02d2e63eee29ba5761442a859f20195c2fc063fe87b26d0686f9ec2333", - "1f27db23375c9a19cfcabcacf80704150f079f9f57f910f4b07cbd95443aa38e", - "06b92b3c32356db4e66e4224defac24ba4b1dcb7dcf7f8d0691154af9422417d", - "ab9e2f87bdfff5f4063ae7d3df8eebad25c650c31af16e860fb862bfdcecf73d", - "1d1ac6b2dcf99edaf5c0683bd077e2d31d24f782b41426b01a2b8821a1120613", - "5522278b42b0e9d73cbba2a65384f9ac082acb525fa449ecac7232d3564f1202", - "76a9c42537ff32c10368aab218e25b4f37d7d1816dee07a54e71e8a10b10ce7d", - "26e274b13877eda871b549d234b93640f68e62100eb3b0a3e5273416ffa7e486", - "cd660b6f5ff9540bc8d4de519f01fd45a004fa571e0370f22236cc02e57126f6", - "c6ae48578565efda41f244a313815e9bd8af12b3c20c1f8388e793069a191482", - "fadf320688e64e8ea869fbc43617bbbe9306267e3c02810682d62db9f74ea89b", - "3501eb59789b5f0011ace1d6ad9ec72c5bfb95d3f0c6647bb8f601814d0c8026", - "df514e1649e9d49b39f430a7aa0090b8b9c00766eeb955f876599024d43ff710", - "201a33c45b01289b0c4e760aa0ee854df3a453ca5fc1cdc3cb11f27945918db1", - "765ba0ad1f4a4d9ffecaae75ebdd55e588ecaf599ce7c95db1a2f9d8cc8dd178", - "2ced29ee714193b10b98dd2f9b8f5fedb6d9f09f56f9f2c27ee5a10f58a4ed84", - "37d80dd45ca81b4c2b792652ea6d291136ef91756c0ac0cf892f62ff530cf66a", - "26601f66ab47a0a5e9d843d01a1f8ca8ab7f5b94ff734b46ebb7f1057b67359f", - "1dccf4935435805e2ef3feb8d27c8f25508747f4e2df2f8aad810e661123d253", - "10aa96d680d2e844373b8dff6f809ccf97ce72c564417cf1f3e2149e08e239d8", - "c0a71ea06cd63a74af6be2ffcbc91725bfe916d91b1d57e4b29f3644d7141cf2", - "51ba61a195112efbb6b61241e80f516c1a5eec4dcf533eb1336ac357b92cd5fd", - "716881d33707d8031793750edc6783fa92cd6904cb89fe92538480b8477d34b5", - "6b0fb56557eeb1b3dc171d19ff12bc30cd53b0e5d1a2f4b711e6915a8936a2c4", - "ce164b260c90a4c67673ba510a06cbffb699019ef0106ab094037a5c194a51f8", - "5e74230e291b92b6fbccb2afff198797a31e19bae84a80aee0877499fb0b78a8", - "8c3e80a9b074ad8ce1f53c87377664e0d5f42711cafa642470f1ecb18c679539", - "af06f5f5f5b010ee994cc7ec4543a86fbf040b6cd283275eaef533b86b6b954d", - "1f121a3fdc72109a490702c3c6c753eee0da6ed75a18870c5fb8f88ad248d195", - "53ccd3ab1e5b15de0982280cedd3ddd2135891b2b31b2eb120da5d28fc689bcd", - "1027c44fd66e9b2ff49394f335a08515c815dad0976b3890d944f23f6d425a24", - "e6d21602345c11af6894198700d49cace08cddf5414976132c271005390c4463", - "fff6fa0210eace6f59c7c45278a12f532b2c0ed166137007df71692bc52fe39a", - "81734d25654080d0a178acd13c1ba2e5c3ee502f3531e9d64f4de03d4e8553d0", - "c748fc47cf13bca048d40d5130824584e9215d281d09e908d9a7109bdff9c9c0", - "288f376269e61c16b2d82ee4c5eee209ecadb9356bbcad1198fe43a701b45729", - "5cd6db0dbf0ca474bc5fdd815b3d894776c3c53b3f8601e0cbd72752ddc3f36a", - "b3e488e6b7beec7b573c4a50ba795754a80fd1484086d794afaed13d5a6da475", - "7e870eb076ca143159fb03070ee619f0db1312316d83e768d6a1eced7c6fcd78", - "f9d44e3c3bde53bd9d97ccaef79e1d5ce22eb010d4f5108e07672e0395a08fe9", - "d719f98f8baee38f72cc6893e5c35309a3d626c8b45ea7598838a1593b0dd941", - "8c2b7859000000979690fbf4e82b61712e0d3ae127618fbc9aa78f63faff039d", - "8030606ecbcda51a192fef1d7ff3918c10829a480c44a63579cbe0aef361cfe1", - "c19f018642242b6e70638d9857c6746e79c3468a218d34481373d26258e10c56", - "9813d4d99aceb403c50d313862c7375523708096d4d938fedecc5fe77693a5b3", - "ae6ada0b65591ff95e559a4d831d06f832b2c08472ca233dc1cd37923503bbf7", - "e1c648b6a8006849c2124b4de96c3555b660bb9a3e10b1fb01a0e8064a627bcb", - "a05f54657d037c85836d6200bd84a3ae5941be544a0269af84b3a248a9e7c26b", - "61787d0490910a912fd7d79cb3f85f365566fbb001b367f91f60e290fe3fc092", - "9fc0c2abc4bc3d467974e573fdcb7d2dbaceaa8205c1ba46b6fdda25f469cf99", - "e3efa3fa383b765ff4f52f3d4ced4af04c94e7b025f393a41667386d6260eb4f", - "0a17562f7b4cdd1e66cb813c53c696aa1bc1c918b50b6ff16f924a4666741304", - "cae6de7b52fb451da55ab77680bdbb8347e417e3de9b37f1c89ac752a243d49e", - "ead101e171a6b3523714f52d4c635b9375f9668ad7f1119b222ed4622bad348f", - "46dbb264f24775b94a5703b553d1f06be1fec0993b15be55c1b3a1b41d36cf5b", - "50cbd2d7394a11b36e9ed0fd87020690e73a8ff142c6be2b5e8170c91a62c0e3", - "39d1983db044fa1c8c604d7ebce47aab4fe1dddbb58105be105ddc33c47ecc94", - "911da493231b2842be117877855a29d0bf277dd2b85c4231d14b798bc06843c3", - "c4e350a1a2574a5ec417585ab037145293c6b2bf4f1af8ecdadf65775dbcc80a", - "264e1ded58c2607446d547600440f7482e39b0cb47b36d3a353769ae7bc52049", - "eea973e3e403b6c098262f0a60ea5a921a06ce9250c2dcd46810ebf71e0c2a12", - "2e9691569fe0885ca80783e437911acdca52ab2563d2ebf21ad50f364bc61e0a", - "25442c97bb48ad8e6ec2fc7d5bd6c7085271d4357f75e10d2fec64d9162d7662", - "ffc7c446ea07f6e82c0d15ceaa74f88b5866af48cafe7b09ed81d47be8a06f03", - "8dd8c7a310e550277dce95ba04b818131a869edacb3b9ecf801a0f619afdfe73", - "50da47f667740bdcb55cd39d08f07f3eb1cd231bc7820aa3d988248cfae62eed", - "acca82278a25e1dcc24a5d3cb4d378a092f89f0d08826ae86a5ebd79748f9031", - "f964e5fd65d7cbe0c0eee7ab62667287df249597acd0e75bbab130d90d5f6e60", - "df2c206754ab3346a737d59fc0cae87d750ab0cb379411b6041b8ed9d21d4d61", - "609b426182e1b61e9c6acd7f0a955f4b0e0cb08c710f785bbbb122428608ee05", - "3212a8851aac92db25534a7d2d30f557eb7fa3e8681506081ef42abdcf2c2245", - "cb3f1a9aca291dce84ee40f264b55b13e956e06f6749b90c3b75bf23dd33b718", - "2e254484c9b673ef70689f495865af52901b762da24c2374c7ab57a6d038bfd6", - "f232f276b8e44b1f425fca73592991b5737ad158c2dcc87816e25bd9435dd468", - "804a41a7512fc55e7e7e3fcbf0219728e81592891da66af8486492a7a4909999", - "fb971524800615eb481e602e93abf6bfb269875a967bb7c2d8f714cfab613d83", - "75e79fd789abceebac8f1d5becb541f82cdd0d1aac859c603d33f6f06491c3cc", - "6d84179247e25ef745c4f49d4ebb0c7601fc0856550e95ad53df41058435d7e8", - "af335732bb86101eade8c57c2f89a49880965793788e6244eb7e4d62ea00f056", - "3a8c555b624f9f54dac33b3b463e304d4c37d5a312b680786182a5d36d51bf67", - "70bc7643ae7cd84625ef7f25f951007d6061a42642f9a8109cb4caab597cfed7", - "b15daf4f7cc5a77f9059985c88e5abe002182c1c5d82b28f7f4ff1e2cc7b37b6", - "ead6e9ae8a9a1079af76b27b637949624b17f5865d2c75740a19e8010dce148f", - "beb5662b47fe211a0403cf607fcf45adfe7c3f8dba246f1b7e5020fb917e5742", - "612725c137378c04aba6295f4fc287c63a7d20ba6a63f5c122376ea78f97846f", - "f6f3de81582ad68221a0d1c7e82018f604374889f30abc35b0e224b3f1b4db38", - "7d008bdf4e61e596cde37a27511238d6bd1900594ee5d187523e58f4e51a7563", - "a02c8a32ae3e10b4816b60d5faafd018c18891cdfdcd64852d072a0c2ca04b9e", - "921632f8919d03ea4df63efdc2d9064cbf2918b2d7bf01f78a90f54bd0a9c672", - "2e889bd7f7e0c1cdb46441cb904159e0eee321be1bfcaaa7e75584c426a48b3d", - "3144dc3df10a437bebc3a56837896bd299e1f53161cf2876a7e0f1431f8d39ef", - "554ec86315a76441e9b2c6204737e1a213f8a0021fe264703b81050e52a4dc74", - "4886aae1cfd3f0eeb6e447d38cf7366e368a50b7d2d9a0938817f4d522a51836", - "33d362bd0740da9dfad030f9baa30a7b48d24da1143addfb86253b5ac088d42d", - "54e5a13cbf01f61f4da6851968be841b57ab14f9922829047290dab07cb68ebc", - "f0bfd5787fcdb30660b01be1f17f4f4148ac038d6fc4ef0c151f68b409b185fd", - "23cfdfebc9d5cc8d4bea9627e4cba78895c8ee06cc818ada24b2888d58fabf3b", - "b12425f4addf969321323c8e5b4da18960c625f185209ff6fb09397870402bb7", - "4d8945f89c83c499c8f059e765ccb6531e57c749c23933960335fdefd29fddbb", - "acda72ad4c17158026368ff3d0585a2783f4261e6238e557a40a37efcaf0cb31", - "779ab93df712048f68479c5508f02a56d593c2a9a55f5a4a9817abef448f6e34", - "2c8a7fe086c8afd3f7791f0f8703634c4873bcc30e2c8fbfeb467ed6c9eb9e42", - "ab5738f47f0d8a9338ed855d71bded161e9d8dabcf60c7b2d967335d3f5f6bd6", - "7f66214e245423108d56bb1a094202e0c7c0650850b86db933b2825ae8170f25", - "5ac31628d77a0f63f7e3bfd32849e77e2d112aa1d4b778c7cdc02f0035af4f8a", - "a90bced3bf9da6b669a1aa046e0434963199f08b555cfb423a9bb3de186a3eda", - "2014b9067d60b41483bdf5ef792fb3bb3630fac51bd4c4a0141c151788cc9e12", - "ea55aa227c2f30f99543e5a6a4c9bd1d559dd13b77274e31a92015746c661b7e", - "6087dc8105c60ac071ff63f6ecc7a6663ffe68582857f6919cec90076bd161d0", - "a1648d1238d04b760dd7d6de04e3cc2381953793bad7bf45f06a96e70af23341", - "32f1e8756319cc7d2e4af6339c47715e4989bd2cc2a7876c47b12283804d0342", - "0e997106d7a84a65be3bf029c2bd4eb6f275c8e3740d5d077b9d57a9da5bf4fb", - "99e7ed0e8f784e354f0c9307bc0fa8f679354c11bccbe7f48b41aa0fdf98caa2", - "eef58c84a25b80bddcf14771b336ae60036800fa115a88935b001cbc788d36ed", - "69cb350a08c185e152870502d13f0af36786d3ff236772632da0bdbe4f3c3cdb", - "bbe08d803f469f2a3dcd8e70e2d9ec4430c63b6b477a4200757a5a7fb0667e07", - "38d7a4a9b857ae8ee0e4ff59480af25d175a9463c7a4bf87a5edb271c3192e81", - "4da747cbca8cb15a47c26c56f652e2f886fa78ad2d8b2811b181385dccaa53dc", - "99d09de4f99135500fbfc2e6a2f7d044261414ccc583f50f2fb3b1349875fab2", - "56a2938b01cf055c9034108daa249b34bcba4f933db7bf0fcb8b2ba1cc7b83aa", - "ac7751b0247491919e9447ac6ca4f7bc9f7b3fb9b3f6a12bef8f9aa442d24128", - "1403f30e842a66bcf88c178e0674522322693525b7db767b937b858dcd4bfe8b", - "be2b629fc8b65ec8090c4a57d13b13fd3a1eebd7bd78105323a2069953f07100", - "664e8f039f225243143c7d7a3859c8a1d6d91167cb44df2124b3e78a1a024265", - "24c2321b3225719e48b06b327a06b74448a7062e14223dbd2812ff840aa3f6dc", - "0cd927deda751fada19e85b131d3c69b302e7f1547f591ece39c586b3cc2fb35", - "01cd7dc09b16827193b4096e27575230efd8b9daca82c2d92170e1de4e4569e3", - "557d858253650535525ab1b294dd6cfc4f803f3fb8b504220faf74dd191f28ce", - "e8e19308f5743edb0bb26582fb9e8b3f4e8da31a0f4a819d71d7eec5d91bc22a", - "7a5dc52b5c70bb1a51a97a37f355e0725cbf7d57d8cdebe6c2e1edef36c51b00", - "ed0423347ffd0a339a1761144b6fc368d5fe60b2f281fdc9419c9e80e8ed57e5", - "fc581c9f7bbe6784c29fa9be2a81fcdadb3043b7b5964557d273c964b905028e", - "f15a9e432fbb364191167fc0f81068548c212938e5a2f070c8a64a83ac3028f6", - "74cdbafb4771f9f9aee080fb6de4a4ab2b9db9d803ddfd76bf702fbabd5ba129", - "b52a87947d3b6a085ea2cd802e97712bb19256467f5973d016cf8193341b64f3", - "c127fe34e06b2d08f9d72a3255598d90c31f8dd57c4f0c3fd627ec2536caf5d1", - "0d9823fced902ac869ab5e6119296daeb9eae38301e5543b4d6f5ca7562e7e51", - "4c3d5a4039b23b54c694b375e1dc58abb85477409bbe8c7fd28e6837d368df3b", - "5f6346acdc74220879a308e948398bab37433eb53211f81d3cde6b25cb80be4e", - "e1f8e6f981a00c29fb4417d1a4dbe0962573d703d2d95bf04984b13d064c4bd8", - "ef73df849ed0f99ba3d28f78d195ae11b42eb3fb64f1443986c624d991cbf625", - "4708246b7fc6972df74b99a9100d7ac63ffbefc2a05250ac6ffae57e266d4490", - "bed7aa1841d6a59494d01f1b7998e4e41498cab24d7e9db26367f662e4a0b685", - "15f868720e3086154c7569328c3e8af493022b6033605d3a96843f8acf4297f5", - "57cbd70780a7c25bfa3cd757b27bddfc431662bd4de5348b5b2610b9c6b431c2", - "e154957c807cee8b4eab9d85a4b98f502a40fb187389f77b8fe5dea8d558bd35", - "31ee84be8d53e548cdbad35fef511570d7635a48d5ad43ec3c9c6f378941bab3", - "23b65a177259cbf5afdf355dafd10add3c2ee4049955761fe74c5c72a1f139c1", - "d634417b796da5ca6c2e904b326004451b5f174a196021e62807bca73cfa88f6", - "17deec5643989d88015299d2af793ff0b3981034ee802fc62e64ed66b5a0ad33", - "bd74744c69468a735f63d41023c29c0b9db9cb1497ab20d5b9ba5c04f6acc32c", - "d80cd41cb1a597bcbbcba957bfee439a2176776e12d1673455c6947bccf2376b", - "f9922f6c9e904c157848534590acac0f0f35b52652f0c36f1e69f72fd211d8da", - "c90f1fbb01bdda62cdfefa120bfe1a2a074e4dbcad879560ea4321f97efb16b5", - "8e0125f5529a93d5ddb527998a26f664df7e8fbf04602813b7750d29ffd3943f", - "a111a58b24ba64c99684c6393690d1ba05b2ca92177e3b12a4aa076787b7a57e", - "3897adef556e3d109f2397dbbce4d82462ca897ec0ce526bb82a90c78516e41f", - "588790716a41401847c212b7f4c5276eed55257ee2920b248e339bb9001496d5", - "cbe7ccb7b4ab7a7614c87dcc4788a6e7d300b551d15ddeacb3390fb9c3e41067", - "0cca9f96db82abd4e8e28e496aa3c614cf3d0851e4cbb8a19c038b27bd58bfcd", - "c5430c8828d2f1f497c7e521bfa07b9f38df80e65df11a38584de70425ac0481", - "a9542cb2ed1f4442b86c87b3b7172f78e48ddff180c87b4a49a7fac532fbc8d3", - "881282a411a1bb69431d5cadc3dc03046188b8c96c55d80a3c458246a9333877", - "b8fbe7f6355fe5f43ca1deaf7291a91416107141946009ef9d8bb75f1ec3e6a6", - "ec409be356e64fc59a62a1bbc6d222be72d03dcd2f5000d9208a901f75cd0626", - "9c033578bb37614342e01e8e7ab8d00de75a07383c5404c1c8737c9d5f69643d", - "43a4d1d0284d41d1f82846d111d5d378726d9c6360ac62650255cf8c8e886a70", - "ba4c5711562b27f7c77a2e7d76639b792ddeee1b32ba1548bec375a1c42eb324", - "0a0766c6f491cefcc8788fe41187f53b59cfe8a00a073ddaa2398d49311a1ae5", - "4463a65a14acd465c4f06b0b9f898b2195842995f940756e36057eb10e668f67", - "69033252e7ad44ff3fd8744c94a7226e2f7bac43cb4bf76cac7d407a6f780995", - "5b40e3794075e088e11982d81abad1e0a8036d42744a2448fad2451a2555dc86", - "29317a85ea06667a40f6f55b3634c68fcf0666b7ef6ec3f42017618515c3d288", - "eed704a1719aec462a27701d13d67bfaa6a188d0f4e4d9ae03b6f72588f357d9", - "742b2d268fd1c94f1a94702490572ddc1038b8de8f40210a6804dd95be0b95c1", - "8fc5bdcbf97404d07662b263c2bd226fe5d934e58d14c35bd11b1446c200a799", - "f750bbc88275ae9ae9b105ba12a1f63638b451b59e2dff285f6e2af6c08427db", - "37e0e0991f978def72da4eeb5a15a12adddbf84833f70d0da7e06525ad2cd3bb", - "25f39ca33980f17627a3df4bc350b86aae06c119caa3409dbcb9e533b49f5672", - "fd71cc4996bb45672614e353dc573d071c13dcbdb2b1a3869e9f5e56f5ad1a1b", - "633fe81d2b9cfac1d4315459f342952cb23910457d60bd231436698ed07306f2", - "2362cfb9f123d2c1965a0fe9c65d514049b9ecb35a422167a74971523bec7358", - "f5e8039dd0f163e8832605cf6306eca5d28d67661ddac15428b9e46952fac7ec", - "6b53cbf0c1929f28fb5657e38392ec4c87eba0e2062be8bd08d7ef8d53cc4eb9", - "f176c05a39f2cf06121dfb90862e48ba7664036b7a0ae3cd5badcd78b76e946a", - "fb2739d048dbebeb3f9da327af8b6589a4a1e9f0e0fb82621aae388fdc118ec7", - "f61c05098f77f7045f7d2b569c49875151f00f30bb58d431065518796197848e", - "8008b5c8da783a7ee21da2928bb0a07d18a0ce5e1fd48c4509d7b34dcb414b81", - "b27786a1a985236609128150c37347b3cf0937b872e534283d2060db9ce6a606", - "f3dc86cb5cdd884c690e630ba13bb2f1692f5f8cbd12cc8ced0738e7714127a9", - "6e1edf87d7789749292a2368e64d16dcc889c28c4bb5354f4bd83436f742385c", - "c8aa40b26c6da51cb33aec442a27d084d277ace08ba69a2eca6e23c4be391310", - "fa201bf2b56c98bf4d99950c73d7a423142ff87cf76396ae93d4204ee76d7142", - "b55d0b786b7f9d397e59006ae5c10ef2f3a75eb7120f161256ae463d60cd02e3", - "a380eb4741ab15809607dab645c35ba11809d9108481e849d5c2fc2bb023f023", - "95f7581a8b219489b84ca54c092d26dda1202a25ae739992025ea7e65230dfd9", - "ae89fe4b3e7fb1066b9d640313176b1b537308d71d84d4d712ce2d018cb19157", - "792921f0c9e9ba3dc88294d4486b63aa89b7e37fcb5e7eb4c45542e5f14c670f", - "90f5ed00a1be4284f7eaf62fd4712caa46e27e8bda8e08ccc701d7636a2944e6", - "35bf1c3c64916371b84270d9407b0ee2a346e210b6b82c44f4c4598441d0d825", - "d01dc23cdd9ccfb51e3189c0bbd996608519e39512efbf09d8b154a24d9e5af0", - "676098658805673e9d07b49a68ae77db39c40364a7f41ab0111bfb045ac33485", - "8cf7d254b03277a695a54784b1dbfb23af0e0e8bf13d4e25445cc5dfd6d4c1da", - "ca3ac9289366f7e88b0d8a5448dc7c5f2dcb7bca8faaaf345c654c626b5f6929", - "6afc0fde55fbddffd4df482236c7fdc958c23c8ee241955075ba56263407dcda", - "5d715dcff39df9640ae555223bf5aa69d866c3c2a198e8d43da02437a9a4d112", - "e399812802ca6db66d79c9b15cac3dcca89f7b3cc13d227c3687f7ef732d59d5", - "6c49d43db7b5fa928526f6291442c2ef7520064d76ba8daba8e565ea8239e279", - "d3bf48b55c6a843268039b5e619ba6a0e944c46615e4f7fd64e597c9ae172173", - "75aa7f59d2bc76e0f4c5818ceea94d26ea61433a2b20183f11e2498f8c413e24", - "39c7b5e7235023a4817c5b04de1e21727ffd57874a4644f77a308de9cb5001b4", - "11b0c02152eeb735c2d74b234faa9e7bbeda1195a348de6d95a63b3646768c88", - "ea0d2f46917c93c3d0418ef6389b5ee8693330e22d340ad60ff8f4becfe3f55a", - "4d17a3a142064956cac78f5758120f6bfa072afcbd714ff025964a17eb4ea626", - "1bfde066a49f701096e9b99e04b71cbb6167187de2bec4eb16cb2d99f14bae1c", - "b2f81a6c9e79e526e05553c0b5f0e4c425a4560c3278a47c366a25cde90a31c9", - "c466cb142357275b991ed621c33e901d61503aa62bb8e1e1cc1bdde4c6546ba2", - "829c81a3cde43e993a81b3ff06ea10056d8dcab384a0e6ca0e7671bbc86bbc6e", - "ac0670d22d287101fe5a6e857c86776837624ed3b69d1eeadc35b2c60266fb08", - "22103e5e869f96e2d8dc5999ce3d5f35bca76f0b159986deef6f5fc376a33b18", - "54c895fbe07f39d333bbce3dbb20e0eaf55bebbf71609ce5e64431e3ce6958ff", - "c61587e97078f31d88120d4485da9dfdc447003e2213bd4aa9a5497599ac635a", - "3039d2a37bbf0c48b21abefcb96b1c640b237d4641964e3de70446270718fd66", - "7c59e1165da46304786bdf18b43e41305de39e7c78852b23a345ce1aa2f5093a", - "994d3eda933bd025e59f061fb30c2b46620c66ea9e3e9828c9b7520f9bb82155", - "a57867ac202ec38b1bcab177591e4f4e34f83f6834ba97a9521233d57b64df2e", - "430100f81d8a542c2114d08ea5567756a3de00a8f1d65e0460405b8696d07052", - "a4526df18b8b48a8f455eba647baaaad4f9ae4698bb43b75f8a43740e1fcfd94", - "ce8c4f171e8505344982da0fabc588266509ddc0aa72f0f8080549affa3f9ecb", - "8018355277b106d13beb570fb6242c986b099be5165d7fbeaa5f20416bec88b4", - "56a53ad96935119653e02a109b37e9bf5ac6f45ee05ee27dd9a8ba1ce1d0f0f5", - "deee2c4c53667da7d08c5d376000a239c581706a8fe2681ea0b83f121b5a180e", - "271f291748f61c248dc182234681ca2ce8adf07d797df025c49f27692a3fb87d", - "5e9aafd7c725afc5b87bb6cbe6a534ed27ee850cf3a55e1f79dee135da39f84e", - "03f2763de7295b5ada23b14bc1b3dec72019fe2d7cb927df02a86c98fdcbe859", - "44cf80872e01b2f0f334ca069210d8d53784c8a238254692945361edc374fdfd", - "2f6131f0591dce3a19b171bb929c1cd5d89f2d57c887ff977da3d804c8d4de11", - "69c8002fb04c588811ee8ab9a8ecde561e53379af83aa6061ffa39ff74b6ad47", - "7a48495aecfb6aad778419e2597dd1000c43b8d9a8ed75d1de9d5c4aeca045f2", - "eeb1b795a221253c1d56b450f20f8a44b963236e466d7339f0e7b63dff61696f", - "8c3beacab87639cecae31127458e43f74d90ae1260f2a771dcd1a7543b118eba", - "e4ee3458b7562caa1475cf0a9cafd8c0d1c0b7eac12ac91089fe24b60c87d96e", - "79adfd96b9168379eac4d15674964f8bf89dc87fcd4dae8de6f217beef9b7aa6", - "b88be3bb43420eb649b30fcd39f0c232d0c114276bcf436b8ba5122518b46590", - "b59be04e684e13d63eb92f43029cf8571e77aec46196b2f79651fab12d585395", - "11081200b7baccac7ff80cbf52a5cf6aa26f7995f0c215afee67c1aab3723f51", - "75bc288dcd258f2429a01ecde0c01807ca36f58aee4d7a516f378fb0cc56820f", - "2314ff56a46bc6475708d82d7e409842e1328c3da98290254f48d34feb150a90", - "d6c0f26d2b9292c3e4ffb5c2b4343ce5aba6692aed55c167be11f1c6a8ce6841", - "0040073a370d5449152f361530ad327fbe6bd190b4d852689f5b1f1472bf53cb", - "0723135faf4f207eead2353e06cdaf76ef524f5baa42bb7f8ae6c696ad8a9007", - "6dc623a84f00ecf4f7cc53c3a6186950e935448e1bbb97bb76747f343d427f87", - "27359f9d2df7b37484756145023905bb912bda985af931e207e6cf4d0e426631", - "18a2c010f0a5563db98da5322a4028e3d7b8ad4837b860b8c1a809cd2002543c", - "ddbce45b3df8b218388812c1c5dc493c913c76ded8ef7f72dafb8b0a835bf6c0", - "3ca1d5521278db7188a127c0b4c3f7507954b36ace9738d2db34845a9385cfee", - "3893d8fb0fb0e7dfea25019763aa288147cb9a215166ce86186eecb537372870", - "649d19f5e60b1190cb73281c4ab097cd71490b9bda3e1f96b60eba2ea7284548", - "607480eaec7baf1010b0cb209e783ca747826e312e5ade8560bcd6b8ad59d334", - "e2c15cef692de6ac03d0dc37945546cb9a1e301e8dcf586da6ed54597879afbf", - "5ac299724b48ae2fd0d2892ba048cb77e8e18657b87b59e10215c65d9e9ccd90", - "b4b1581755d50fc42c88b123bb76a13fd345f6f3b1bba6d0be0e97a996e317a4", - "0ce480930dd2d9b9b74886e8ab1e2e9e9577edf7f3646ed7e60b8256fb2556f4", - "8c61ca86a9d34bcfc6f9d5814a776efccd89b28a0f36de4dae7ba389ac2cd1cd", - "b31668c5a26d954afdf2add4ce0c56edda9c9b7ee8a5d99117a4971b8c954fb6", - "1fb1473130c10c3b6eb88105077f24612625ee34a1f62c7e851b60b890330329", - "b6292706632b3ed39b6c536720cd88b30739ddbdc75928173db3f00da6fa1eb3", - "df0ee4f8c164cc8b06975f236a7bc8712c68eb30c76a13da7dcea1a37ee33add", - "20893af18a57b581d2fa4b6ec604659147c5379b356c48b715a3b81fae59f535", - "d9c355d61d226ff59f2cb9dbaec519dcd80d6fec34f5f58d4ceb224c2199c9b4", - "0185cd259bbd777d1081245897799c0e8178942a30da2fdbe938f7e21c867c9e", - "399a45c29c5f72681f5672cbbbc63f9857e10da8157a0b2f5d49de3219a7eb51", - "92c14f0272f42e4135ca568ccfaaec144b066eb758349b76545898e45fdef019", - "9ab5ec392a5963b90001b28f24150a641813bcb88949080edd4456e15d7fdecf", - "835e154f4d2f88f9a3dc28ac3add5f061261123340a62c444c3defa790249d8a", - "9a66a1c3698d2de91d35381bbddf21065d926c6aab4b0d798aa96811cf0c2339", - "a52a55c623f065ea5793cdb98e4e945296427bd94436edfad28baf7c362ecac3", - "8db66a75f2a67ec8410805ffed931e4cfd12d7c2901d741af410b5836dcdd186", - "52e83294fa93ba6ecbc2ef346da66c037ce9f05d15a561ab7fa1c90f8ee70dc9", - "de6df359d6cce4c43a9b88adc8d1afae74f61899c7bc7676a9c810813e8701ff", - "f26e29f953cfef4069bbe4d4fae380128e380a96c464157c6e1dbfb111a47aff", - "b9e241cd142d1a4dd0ee4f3ec65b008385cb490a30842ea33f09dc027ad5de58", - "72106ff5e6b98415cb0b5be6fa6781d7b84b97e5eb9025da9b8b37cb452c32df", - "ddff7196e57802e72bc207e01f0dc244c36ee6d66219818dabee0b2461db9ac0", - "aae8c8e806890be7653550955f6f37bafd706d71c7b01d86961f25b9d88e3a5c", - "e418cb886e750fd3b7bd221fa875507fd40147ad939aada520c9abe829a467ab", - "7636d806d7444f53b0d98ddc99a8652e3170fb20c1ca892493e439c112f47c35", - "23188eb36edfefdd66abeca6ed9639ae8fe3c774aff3b55c79cb6fb49c267b79", - "e6ba800546f5a4067e1aef57e63e541680642cf20416eb9735a3e686d895f98c", - "0194e72a577724d386eb129a94db039ac55c0b7538444ceb91505f9f3be067e3", - "e1aaac7c63b9fd07b441918a1cb4abb8cd18704c8f870846de460f751a0901e4", - "726054b9d65343b2656e58ebd828c2cb9b8975825446f61fc2ba036ef8e28982", - "e0832c2926212e7b430bd65127645eb38f2be20d256903b3d24a7e583b4b4b3d", - "a5f4986fe7d70f879ed5b7684be83d13ad56eae9cdaa8df678c4d4d1f165e6cf", - "7cc843ee9482bb8aad1e1bcbb4c4d1183d903e0797cc30f9debc04c9df9ec849", - "70d6e95159c7caee1d80376ca24d03d055c6ed88dc9fa1e7333783f384f806d6", - "ff14ca01b39a54ecd446c5c35504576b3411bd46aaeb4e5e45d6eee8a60dfd3f", - "b2de409e3bc831b90f8e5dd879d8aa2b2ca073f46b6f979086995d2295fec04c", - "67c58fdecf041879d437644100c65300d93f3f516b9982bb0755793d6a7c53f6", - "ec933ae31573a3fd63817b572524e2d354ef23ae0afa525ae06df791f77431c5", - "3ad6b1dfdfbae95a41537f7e3b86f230134146a63f90cf0b80a1fc114e91bdd9", - "4eb4c80b04f5cae1683da6578b996b6b8d1ce9ba0029cbf6d483c8c436c51dc9", - "6602d4fca94fb0f4f6886f914e6d090442ad61d541fed701c85c6d106727bbdd", - "994a8b12321540327b03b7493a0fbd0ba14d6626375bde7ec83faa5a7c2d7621", - "55d6aeb0e35349e8c344597a2ac6a54ba9f6b33ea847a8ca222d9482aa21dc01", - "8513d89de5f8cd51cd3ca12e9cee10b762b88c3696a7ee0b49090e44351a749c", - "95d188379693098f32efc7782a306f5cebbf6a3c866b685497b039e79543399c", - "c34c6026b29f5b98f55e894727ff17ef3ca61be59fbc2f306ffb5eb4e1ac8250", - "c97b62e8c16c12dcf7669a7157c36a51345d52425dce4afe791bd9a01374201d", - "158cab48916d2c7c822ed7425a2181c8138e95511abdf61ae2e57216b000ea4c", - "c5ce92bc7b14d5dea98372353b22f56e7caebe0f2d230ba709a6146c2e150d06", - "db34751be3a46273af3c21bf4e66214f3c2cc8dd1e341eab600db0a2a4078c00", - "1a19dc60224ed8009ac0ca6a48ad9dad738f01bf7cbfbf0eba867b519b177d28", - "89c6d05969bb74592158fae6bb9c4c5d1e20b5993b16dacd35f2719ca13beb92", - "eb8720b63fb90921a9c40f09cf425a65b2946d2698c5994fd84510f7759ca658", - "5eb1e7f0f0e2e87e06389f990636d6446a884365cbda28fa14628e617f87b36e", - "0407f74fa23c593cdf924712cc3583b9b649b442b458732162041f19b92087a9", - "027b9cf7f69ed74f573c866cc5673241c0cf7e79fb098918bdca81a5aed88c53", - "0ae9887fff226f61c59eda513c63e5d2ae2e09622b5ca846478cad6820831e1f", - "8e20f76f8e33e54156525de0986afbcd27ab37e9eda305b607615bb7c8d05d77", - "96d61ad7b78a09debbdcb9635031756ac6ba10181b1d793f1b81a16355ea0f77", - "9c1b8c01b4b102022ec73edc17533587ec0e0fcf733b5f83eaa955eba61d9c93", - "fa67ee8a0a5751e34bc2058432ee84b182aeacf4c518f05a0cb7b5859ba3ff6d", - "ed4a042ba0cf3c76ebd23c5586e4ced667ec8dc6769692c605b3a8acf2e07bee", - "076071e14c47830d8af73c9b83c63ab2721d9c61b134101f5b507fc9ad992b3c", - "951a41bf3f1276f8890902893cd02afdd9ba71917c825596e666999b3f3de61b", - "e2aba3f0ff362e98be0549d471f8cc7d34361677949bcb9573d1eb468496639b", - "2c97032755382b6b6ce7fea6fb461ed215ae18873accf7fb0f52da550e99054e", - "5039b5e6502f6e99b98e8730ca53316a1936fc723327c8c4e288ea001460a8a1", - "313db26a3552e26d8ef1126ee93c7209bf3a3b3587992bcf2dc76a5a1a9575fe", - "a87cbc084a4e8653a61f83caf69f334a5335629a47d6fa28fdbdf4ed20190c5d", - "579d0f548d87304fad445f74837591716f11224e755761b17e30b12e11f97d8d", - "1f19e6e6052bf5c6ef3550063169c0998754c7fbbaf15c408779c78617b64df6", - "d01ca6d31a118ef78059c2ed38ffe3b2eaab3fd58b810f675362fef459ec4208", - "92b589a0763bbfdc4e03053adddaf513864673eae9e913dc215463b0bd03b716", - "cd1932389dcd386dbf42fd707311acb45e17792f93e0f0184c415ae770a2eab4", - "3af7cf066f0ae80e4647d805d8bbe829ceed6274cfff307f105ebc5e572f71b6", - "ed8d4aed4d394f44126a0c3552a16aa9a6e1776f599a0727a7f1f2f72b559331", - "339a22fb3cb1b85267bf920345d839eb3d18e9af040f2e4a6dcea4dfb4533b60", - "a11e114b1265c7568308609fe4da107dd7cbca64421bb347b63447764ed8dbaf", - "6ac678768ffdb9a6ed3f087f007edeb79833450a859baf759c310076664e32e2", - "e26a0ed12581112ec688ef1684896f9e77322174392ec7a17f24d166bc2fcd34", - "8d06e56b5fd25e8a9b0c373fbb13c25dce0c96de361253e913b12c8066d8a238", - "7e47d8f58a2c15ab140052a10f4a32394d5fb99744704f6b3942d9a811a9d141", - "7810e90e8bb4cab61b8d70b848c870c571113e45586cc2219a5f021415d57593", - "7ec50e8dc180a009ad8e316f2c5e37ee52c390b5a9db1424603ffd4845a90f96", - "11c18ae1c3d1bb9c3721392aa57976e0314646a87827cf89bf14a6388dd48f19", - "c567d3f8754a6ec8215a2ed33098f92f35f99aba1bab0f4536bc7b8a4aa14f9f", - "f1b9fb305b8f1403780714d8bc8241b7bff639464b67733f5fa868d6f523b836", - "86c2c0b14b78e0f8199e4272e4e8cab45d94a732058327e9cd7d80be446eec32", - "085e5d95c5e3224f7d9e02f42ffa2df37bff2f0d1694b347de515b40cc3cacd8", - "1b64068b92c56be32e6cd4fe144d867990c606ac7e9307d4f755cf7b44418f95", - "5ae12015e3b20e58e841ad471e3e4c802b193ad48bbe59a16395ea99168572e9", - "e9df81130fb94c7d1e4b13141077ca20b01936223ec1051681ce8acea5cb4d30", - "a69ab8029550f7b9159b6245fa5b6014826113fcfd112e2c70eadf3aa246cb0d", - "29981e838c7289aa3974f8f97cd4d97406de233d24c542e9a803532eb16b93c9", - "4a31ba974effae16d76ed04e2d2984ec7642d4eb6680bb4ec19a17380bc66ecd", - "a8642f99cd494b23b69e0ab78e9dbfbd100713898d420231afd9a47379ec6ab0", - "a06e678e1c70cad395904bda6e5b29f25463ce8a93830d08616f4626730def46", - "01948d02e708dcda4fa16b172c4c5df4383d8d33469bab6694446876730b3afd", - "5a41acf69f9dcc3fc45592a82fa5724efb3ad383c90b9e6af3ed791dc4ab80df", - "708f786e1639382ad6cd9cd0975630031099b9241eb8e72eb016a5426b91f0c2", - "be5e6c0e81b4bf68fb83b570fc05c806b3fcd64017b59282527b6d3a9fc12dab", - "f974f458499ea35e421527c6d0446e62d9c9def567b0a9d4c91adc461e3ea475", - "f6ffaf11b36c5372d16e9244248961f8656d1d39e2c3a00f0974f90806ce1ef5", - "fbf191b942219b8d0f4959947ee128b4f309f6a811d3e356dce034f1ed43c1c5", - "c1d7df85c1c3a3a68237850418dce75d98c7dca31ccd150c1d058f2dba35635e", - "e690cf5fc6c516a50e6bb09a47ae566e360cc8dd4cbc10abab2ad7b1264ade2a", - "209d9cd67b69dcd3988422ea5076b7c13f1dd9e929b3cacc7d55f8a0e54458d8", - "a580626c2ced2b30d2d1399f58ace63a18fecbee3ecabe9c0610d363841f96d0", - "247b30bef966cd1857a3273bb504455786d88006138428cbb94ba6e236b289cd", - "ea129a6b8aeb5bf939cba6a0fc373fd7adba990ea2a57a73ffdb3588047fd2d8", - "c3bdc82a987036ee257a63344c2bef77fe2764f599d777bad59a1f08e1656986", - "36407dfe7c9297a424b31a99b0687cf65e02754d2f2af8ae5b144fe3241232e0", - "26b4b16a64db9294680fbcae37040c883f1fc873f8fccab089058e551a40dcfa", - "e7216ba6b8a04c7b11a8f33cc944cd2def1c6c2a433f2bdc39829f9ad2fbfec1", - "66c40606b688b9c899afb2559a07c53761954b061583d5449bcfbbf50b96e188", - "a19daa6cbd51a68994be5b3f6a3996f3b54c4307a955008091c5ca41686f71c5", - "1798390c224c9cdac41ca735fa20f000f856469fbe8bdfa479428b1a70639084", - "4aa2b6bf8afc5d4a5cbe953828314542ea047473e475bddf166493afa76cb53a", - "20d092995978aa2e1d60473a375db26ce2d5028c60fdcd7d8190d589d4ccdb75", - "09060b3c1aa767db830cfcfabd4e29bf1ff97e2215c7a749c21ad07fccc0fd72", - "1642f0eb27f520a61322806db64a7f17d821fbb84ec17841016402d604f12d90", - "f8d59b279adb4b78a537a924d99c691d7989becf89278b2f0ea5f728b6106840", - "28b9eab11b3c2062fa5ac6a0e0a3afc31a539eb00337865ab2252d27e39f0af0", - "b8de2022d8e1811121a3f7240847d938f8cfccba449e088f3ee3669a8696d079", - "0f2572c94a41c67f570af22bec4006d2ce2032c2741f611725e841645537c195", - "4a77ea393f0019a6e6c57370d23a5c4691f4ed868a17348e2fb133f4c00880f6", - "38b7adae30559b798a70b709a9c9abdbde03ff517c7bafa024f6a3751f5e0bd9", - "aa759e3b8724517b92c4ec5169a4bcfe331cce6d7ef7d84987dacaa08f50d5fb", - "41daeaee69746345d3b7da931386d6949958b7520280f94b5743e3595361acc6", - "90ea4e82e5dfc5af5f34d0040157792fe1db28982099b15aff27780453bbd916", - "1adc0acfeba2a26fd9aefd1cde535968d04a813e531693293430ccbc6a55e64d", - "9a7812230e407f0f1eef452b976466913a60ececf7b21002da0bb34aaa8f19b9", - "67bf595f5071a48c34513992e8bbbad4a633eb3884d39b59d4906bab03bd9ae3", - "7ec5209dee607cad0eb69ee914ab30dde9b40621c5d20e82a9ffff49e45cd56c", - "a0362c4435e0d6cf6a7152b7dd9a85e7c74f946044b8ea5c4937fdb970b4c2e5", - "ed6160fa91a98ecabd0f7d36fa673e0f8a1be36be96e5cb309c6efbe4ac5188c", - "7eca8100fbf73bf0ac790973a6e254b4c8ef491a30dffc4fcbfe8a75d8dc7811", - "3e25fcccf72f4fae5f0219f95e2b80f07e754aaa314f91a2bca2cbffc0d535dd", - "811f3d5fa4fe79a76c96c8b27a80a0c32e9b67b73575ae9997b3f001e70623b5", - "8bfca27cf75b762d432ca8b63913cffaec1720e980718b6b18fd4c2e1f56f5d1", - "e09fe4d9da5b345e8f94716265e9da7ba7138b5fc97a445c2a3048f984bf5aee", - "36f8d27aa4f24abbfcd46a9a571c542b9c37497c12202a273dc8462b78530e35", - "e8ff2d90f68df5a4cb3bdaef0b1226ba9148abdb059c7abbb3049115a7f8ccd6", - "d876e396ea18faa4fb9b4323a976561be7192d7e27799ea7a13a715e069bc9e3", - "261bd03300e46bd7250f795175b8e6459c2136bf8296b51c9272698c5ee7c0bc", - "d388d5ab3ba9b9b6fcbd16da232e69cea218c7bc127abf68e99daafde78f5d11", - "cc1b66fcff56103c9ee8c11aec6516f89038eaa25cc209d1424b0f31ebf6ef97", - "051ce398a0d31730ada25ae6ae39ea0fdbb5adf59cf19711b7715bb86a465b81", - "ff94eb6a1af6f2c87d87c719491b4dbac38cb6114a4686296ee802a2f351a14c", - "8700ac9680bde75b99c1c1c5216ae77b4fdff21ea2854b2f6be0302c5eeb5a7b", - "7645657d0709f282e787fe3824e6dca24a9c777743600cce1312991311a422b3", - "ec3740c33c0c408c7106c0d5662c5a87e3e9a3ac2b1c7db40b10c792e02a849b", - "5670790f0ee3edc2bc19a0b01082623a0e3782e667125ffff7d98893aa03108b", - "15e246b0a2a7b4ce66877b63b6891b0b4fdea6569cc32111c181bb8d4fee4bd5", - "ea45fe589bcc1c65e7b394d54dfcf73592da1a25b6799df3bd3666a74a99af2a", - "ec562bf54dc4adf0aa62ba88e627401dc89cdd9d13e5050e01848a9b80335195", - "c172b2164660049887d288c59b72b27138a68a26f850720e3ff37ea5cdca94db", - "5cda20afde0ae022f1741322fa272c4916e54b45aed3435269ed32320ab4fbaf", - "c1c2cc183a688cfd1598c8a6eece1423b8588aa014691eb03e21eaf35168c6ae", - "a8bbc1e18d3dc50f7bdfc527ec5c25b9cc8a5ea66cf625c1e1a533adb249c6b7", - "eedc8938601ca37d8473dc300a0a831b955b5e82135906ec8891ff63d5c932e4", - "9e01f3472b5f777439c83df9be475077a51528207d831f89a2ad22e2d6ae1758", - "05239c5870a3b0d85ceec44b58a0ecf4f34391a04998ee2b1463ce17b055361c", - "9ca1257945c013eb17e2f56a9da5ea1dd306a89f956650ae4958e2e647e3ba35", - "65a25053ecab14eb5d7d6669ce5a483ff04e20a7cce4cc647129c620e9a2e736", - "361e585c77e4e7c867c808be3b2dd587cc56e508759b4786f5ad1372820dc26d", - "195f7e88b8c0b304050831a6d120b00d2e213a3fcc50cffab65247c8afd25c0d", - "6a7585c35b1f0fe215e6965382a16f2e606836f112a0b425fb7297c10d4d8810", - "0dc0fbd432176dfe0a95ec41a95ad9d95046d0245dfa6111a63f25bcc4831ae7", - "49e7631210a6205709949323412fe2d7cc9d6d6964cb2a5255e8496572d7fe33", - "bbb9186d13c626959d36329a8f2a5ae59138dfbd41f6d35ada155e33d2f64cfa", - "fba76d110501e2df894e6fd4b0e3a22aea1e3b5324eebc01a4e5303633d2692c", - "2ca0601cf656e03392a7664bd989557f32d36d83b20552c45b06150e0d9ecd84", - "c64cf31881d7bcce06d2793094c4ec28c35b511b7002f8bfff5b1b2246171f7a", - "a7cc1a6698439edb7462ff2f9836bb663d1589dcf6657090134eac8cd32cef8f", - "896ca6a12de87559493cbc841ee27fe58bc8794ee8628b2bc64e2f965ba18922", - "efc7b5254ab355ce83e520c74c7e9358686d31dbbdd25f55dcaaca3caa568756", - "b693e29f56d9fd7c46c1bb8a717a2c2238728cc1e1e7c44e15f3b901b3f5533c", - "6de65a2e6d5eece349587bb03209c57102473850080b3ee964e2e14de48bd020", - "b7fc72c11e9c2cb81ecfdc184a7aae2884a80b7c9d796fe69b808bf64c6007a2", - "e72e3805927ec3a95de2c129d28d8750dd4b2414e614454b097e262197366f33", - "c1b257664a15e44c3c65d9132dd578d3680995ad112a5586c842fe8c78e429f8", - "39e530774325b0c135a29cfba4c9661a0853eb62f62c03b71d1adc53a551d987", - "581f794c5257d7e80fa01578b927fd639cff4af49f246382881de4337b3645da", - "2f4a15e24fc40470f20e0d99a72eb5477f6e0be9ff016bd4e9c7d3328612b697", - "b74e9db1cbe26b5058c25aff2111d300f59c20c4e4995f5b66c05b6162c1385c", - "0a533692c55948698869f5d4146a18cdf54c8b299c4b89f1b280e2cefb0aa526", - "ab97a3aeea9d96dc690dfcb9fdbe03d743766f70c61c8f38db4e304e44857d74", - "916ff2ab06a20a9850412b72c874824cfe3200e8c592c8619053e3c370b24052", - "4e8d7e22ab5c00ea360641e15657aa7a2d8428919515325322102a7cb76b5927", - "971c633d4ecf2197b6fdf0f70e6914ef9e5302a84a2a01b227e39f4596a3e465", - "852df2c9d343dbb5a4b370050d4daf70a6a47a98d8fbd56b646d7aa28a207c7b", - "ffb14e22205e58bb957f8fc47f40b266c3ee2c7db7d730c3e8051c02ec273ac2", - "2f1ab5c66e535a4d8afa27c9b233e1a311c4faed2a293abb644b5edec6df1706", - "fed22b45565fe27f25cc3ca51cbcd157771cb0b95165c7103ceccb14964e8277", - "65948701acb993c858b112615fbdd511cd77ea58052e3b2dedf1e8197c78dd1c", - "a73b1b43f8fbdf647428d8fd658a9e0def2cb06d05fcc26776757da504edf209", - "91a8f146a598733bf4c8ed5de9a21193f942e583d74fb5c884fc696d6f80d0c8", - "3c0034bd80b4cc570ac70510257ffd442d2e9ed52582d602378149f80a47c849", - "2356e5643a12906e0c5ad94962dea9e571c4be90f71623189d000762bc5431b9", - "f2ead77b460f516c2fef8451cb7d81656c2ec3ae740669a4db07a55da29f106e", - "d03b4eb67c8341e123725f05cf2be66507af4dacc12c20c240e8b273bd3be9c8", - "4b8340aa31685212d5334441f859de1ded39537f89434c8b5745aafa193d40fa", - "7c7cfef71c623644ecc28da1deccc4670b550d6d74fba4a134344df49faf44d5", - "27650983cc66503118ab5aed7b0782a7b260b3678731ab682f9c0f3f0202ac1a", - "911cec6d27e6b6f4d2f940fa1ecb8638ca990db005ebc561bbfce79df5f0fc36", - "85f51cecf983c659764d30b48a96abb53a62d353591f3be5e5f8e74df32390e8", - "634bc8ea91e719a013ca5659cc7ff3cc4e62da1ae76fa8a620f04cad9ecb788d", - "3425f2fe159a2e1f33674b7abd82644d61538ed772a427a2f89078f47123402c", - "0c7be5755b8c1eeea0e5e93905e0138607996869deee958b0969a9cd5a01b07b", - "b91368aa6af5cd0ed575ed966e54fe98513932b76477f8426bda8956df0dfa3e", - "a24b41ca3acc1852dff960449232073092b08feccd3c859c9371e46a0b265361", - "f699286ce2c926cfdaf8f91ff6e9d880b209e03c0e627a56243547f4b9f46242", - "27716f924dd63738242ffd941212f5a5f5700f9d1abe36defb9d843a134277dd", - "bf9a9350579bae7a43ba664511071958cdb427e70fd0fb27bb8b7b22b49e6b28", - "e22a4af5cca0ad8fb8502b45416c90c02bc6944a53b857fca1acdb429941d185", - "f52f7f9e94d586726b0c6b057c27f6e9d5a084f63c4856fa4048cfff9811182a", - "b3c8188c6d346e1b41062faca025b7856aaa3ea0e0c02749421734f31978a143", - "b734f48e1b126cf69e7b02f85820a0632770305f39c2ffcf8f6b3f51e57fdca6", - "ce9cbb730e46e1fdae5634f5f2dabf6bd831559ff469a30879a5a06ffe330043", - "59884396c45f971f7342a36a3e4fa128938a94f3eb51e9301b6b0fee7414921e", - "4024786a5b009b23a9ca91c57c47892130530bf9b615e2441f91137dd682e7b2", - "09cddd729e522820866ac03ef20dbd9e45cbdcf921a40c82aa569bf8aebb036e", - "7d34b66add0f954d890a6b82ae24b9df13eca1e99083779eda8f1faeba07579f", - "fa68b69c48e111baff80d168d92bdc5846629be3a2003408e614eedae3e6befe", - "9647f01f75f03802eb4df7fab095b63c8d3b2ae11eb83fff1739c4ff3dcd0dad", - "d3b11ea9c81186768c1ef12f8da7553657458ebb0fc6ad535e04554c7293e718", - "0eb5eab4c65dbb10e3315d7627a0285e40bc9029b2843605b0d2893bb69b7aa7", - "b70281685332c2b4a91cc7e4c4fb5011106d16b507fc2e554550aa76b48de966", - "6998f413252d72b42e2dd3e408c21d8a3012aded0b3f8ac92ff498fb0adbc30c", - "ecdb0a74457748387a40323c08ddf8e1e93fa52010e6ba341bd61b53891f6de8", - "5eba3f97b1417bbe8857b26090ccca3ef779571d6bd261675d5e124d528b26e9", - "a3ef4a462427b9215ac2512b7ea23385bf68d426fba2f87005be994b3dc0b336", - "6202d94c34122eade3e86c6940679e2f7364ca826107ccec1a83c556d60ac9d1", - "2707d827066c04d46f99cb68de66a14502057fa0a2648477ed2ee25b01a9546d", - "d83a7bc1266eb0f7ab9275559fda61cded2446f242a8339734269cefdee0a403", - "774cb3dfb8bc675909fddf515e39bae2797fdaac2c2fd9759dfc7ad73625d08e", - "cde0cbef353d7ba3f382fe5620a161b6586905519b5571fff46a18d6f720424b", - "08acaabab478f0194eeac7fec1fbe7af4aef6aa316fa26250b886d9648587445", - "ff7e9e3f211282fcd72e116dc7ed82ebe0c21e0770d9d5202233179868054e80", - "493d5bfe8faa97650e18b53e74b52c98b42a81ab992673f5f82c2efb52bbdf0b", - "273b9aac4e40b49e6f7c83b4097a26c9c52ea74d9b69931c74216ea102ae18cd", - "e89ed2306ca8a372c2dff0fc9741d719e580e4e64724f2a76eeb21a18359d24f", - "85d9c356fae59410e5780ff1097472e49510e436e2c2bd53bef721e02123a26e", - "4787c812d66315883c8efafc3b252cad886d0631bdb414a14108b829eafaec7a", - "03dbbf737336810e9bc0570ac12398b7dba2a2bf98d8432b2f6685f514ee23af", - "806b83b61f5b6804f1d2607b761508a1b778cb21bd73c1bbb43dfbeaae0d01ea", - "5c1ffb29c3fe80d086585e0d8309c3c82cb34fbc8ae14e11dc6a36f7d8c33fdc", - "ae7172e04f494fc75eb307d509da6a109c71e787bc1e220d30485c1d33266164", - "0185359a900ed4ad9549ad84a0cce77d04ea8c6239494b877dea83ab4df8d746", - "67416f0c35b434c9854a2c9c47591098ae5ef0b00a7a82679acccc9d442d0c6d", - "921aaedd388d5b7720340391496bab72a40295d690a099035d530f475564544d", - "118cbeae2946e381eed4d39ec8cd60276a526f4c570dda6b40496e12a2c659d5", - "cd0b9b8f4399e32cbb7ce0853b82493589f4f2a2db8d4ee53695c1362f215aba", - "e694f2180ee8b82974ad07995d3d537358130b67714d0ef66081488748a21dbc", - "4e614a9efca665120288bf2351c4e45d41de4a173d1d96c50daed8281d4a078e", - "669443091b178362955c91a13c0d0575721845cd75da3d3ba39fc246af498e87", - "aaae28333c98546e6e153a83c0c99e3676748e15782d67047490271b51ca3dec", - "925f46f49298bff475bf649db5195b14cb7e885fcc6bc18b46dd60264bde2ac0", - "c0b6f38394bbf83afa8ff8cedf9d24258fedee36dd8907591bb7a3bb6c2e1287", - "d5791b2fb7911243d08e75d8e10f51f28341c3e10471e41ffbed39cf43a8f19a", - "9a66347c60d1311f45cbf08629c59155f4ac7d73d04c0add6eb9fc8c2bf58563", - "8ac4cd7e9b5143c0f5bc7925f590ced8760c60beb7738075aebb8b2b6110f657", - "f39466ed8cea32c3843dc478f254595f1aaafe4379c45bf8afe958a007ca706b", - "657058b7315519425aec3ff15bfcd441b0470290ed1b8437c73071803cf4b9c7", - "194071af5097030b2555925ad2da012bcf3d32fa8cb8b67b4a7a69a7fad9d614", - "efeb3d656b87d5bb90ba50f27728617aef350d9c6d8e884d355448ad2774107e", - "f6734c699982e421b1fa6db676fda4a0c88f31537daaca3c952bc1a340e7e6bf", - "0537d2e2ad162609f7e7476155cd3008d42e69fd81b19046f3a243834390286f", - "f176297837b89e82714dba34e0e42402e2d9cd7868af7d3519bb0c6c9ad45b65", - "b57321119c61ce6075d6530d38479b4720eb96ed597b56f78a9d06ad3743fd80", - "edc1733608a1484cdb18b8735978c185edd6cccddc35a2e41ba68189dc5eea73", - "bc0e93e9e08852ef177d367e05870e473f0f806162431f44102be1303d973029", - "cc7c2a7918b6909e4df7b59f83865623a2d830a0e0f72540a35cac34ff8aa550", - "fded66ea8ba7451230206e45da9820c541cf97a413c47369a1d6eb9f33eb8d2c", - "65ce43fa627aa763e6266a26721a61ae8c7c69c88c95ed1ffa5c7713b0a142d1", - "6258be0c25ff36a5fcea31bd7396a86d19627e82ccc6950574e13cf53564748c", - "dfef32ea2e865915211a4a3b5581db595a97fe65afc1597468688747a7e84db0", - "af1e21e578626fef06d2411f228d2da9c99f4808a1f4eef710e167e699758540", - "ac5b2e97088c8396374bda802edd809e9b372b312fd08c86f0ede74eaeaa9171", - "c808fdc3407d63708bac94bbb14fcd0d1e0ceb7a938d05ab313210d6fcb7100d", - "61b6603bd2c23eb3fa8a4d7e36dfd88469d77a3a665a581866900eb9150d0d00", - "466e910eead87ca93bd93882ce89e88b985f8e60f4a94d1da7db0b2804a783d2", - "4129e0c812eaf88b4872504ac1b6aaef0bbb7fa3e88f0790225f3fe5686dead5", - "15afe2eef953ea5756bc061bbf2215a641ece542e2ce5fb085272ec5e5729bea", - "d93c3ff3b849a79daf13142ce62f66bbc957b3884654556e7d59af7127d8d6cf", - "7ecd56c0b839ea11e10fe4b74c14644d428d3e94426b7b98bfde878aeed004bf", - "6878d57f19feafeea2220d395de92e7d7f5e6a8c4f96a0aacf74d519169b988a", - "548bef6f6de7e91a2a57305f95a0caaf8ffa03abc65341df4c01c4a5c0823965", - "eaca81ccbddcceac9776ddff451796095b2a4ebc8dac5b89d45a6e5d3c6fd97c", - "9646e9ea7c08044e77c9abb9bc40942cab7a701f376779bf883fe444c5762b8f", - "cc838621c988f802645da0a6b06c6181d038b32c58ba75bd4e178731a5ae4bff", - "07ce51fb709322b9eb63476d46c2bb467a8f9c06b82fc34cbadbbbf6ee9f9581", - "cd76c8f9d20b4b16efe3e2184d683894e8b8228379afc385b86ab8cfed6f02aa", - "4901d77a861e6aaba712f10fd89d4d5e6ec15827e969bc8f2380f7f0c11b05a5", - "98229f756d6133aaa00e90177c8bf0cc7f7263d4b86b4fe7ffb5b96dc132e926", - "dd99f04ef8c8a8ae843fe1a4729feafeae6dd1be4792efc17ccd334bf1851245", - "a2517934fdbb7f5d8acaf340a6502c71aaa5b7c9df2285966c90107416a0adc6", - "a3d3e35b8febfa08cb9983fb7d50c57d2c699772fc392ba96677d51635bae513", - "35b7c2cf7205443c4c524f25aeb18ee95645783483b6c1aedb4b52cccdab9e26", - "d4bfd0ccec5841aaf93031ab21e054177186a91cec085c5d0b900e5564da6a14", - "e066ff3c7a3ad431dcc8882da6faa88e38aeaa3c934522a281c15dec35fa5b4e", - "dca3c3dae0b582d054ae521d745056f27d0273cbb792bdc97e7d3223f131522d", - "e73195b61c5e63d4af025547bf7e7b6be2f67534f6d20452dfd2ad308f155943", - "0307cfd21e59d6145b5f5e9f2766fdab44cb98d3ead0ed25a8ec8cdb7a5deee1", - "60267d7afccd827a87b30acb8b9176dd187c714accfb834df7ff58cf122012ce", - "367ba083367b48f5a05ef6563d360af559091135c8be215561cacc19cd9fcaf9", - "7278a8b3717d70300b45a9e7d6564dd3531b0e4491d6a4c05d210371a16b8f01", - "dbe6458a33b1d909a01b4254d3ad0e821f5ca9f23dfcd84eb802abeba6056d0a", - "172e52c9a571bb8fd544f4a59c6de2502eaa982a9271d67ed243348b5fe066c9", - "b95d7bfb65d5b80fe9fb211b6680da70dd49bc75c193297634ee583513dc7769", - "47522f1e65c3863810d8461f3cadda2004affab625c403147ce4196af4ca0d05", - "eb71eca2e1e883bd4777c381360234d66812d7d4148e3ca93ab15b3554d68991", - "f2421c770c8cad5cda6c80a97b75e3c162ea430e9bd6c3ce20bcd6e76cd46d23", - "6d02b7a2db921133d09efc8128baa776a0d21723d23c53811f9d2fa887dce193", - "e8be581f755077272b7a8c5f0538f4ef4f05737f45bd6e3fc43c8cae48cb16e7", - "c9c7ef77984dcf79cab54676758006dbe40b30b461ec64a825d372700a22fde2", - "45ee490c62f618e189f0f9c67681af1a5c92473e159ce7f09f3153318c395dcc", - "6664d6dc9c60e59c8debce039c61ddb05b5e1024a8fb94125bc65fe0f5dc6b4f", - "cd75c3c67e76504f2dcf79127e1081b5bbbc1776a5305f69d46cfedf1c38b0e7", - "5771325c5037900e2a24a91f771627625be49a9aa6c0c5a9e777d415a3a7fc92", - "09048c1805aa5af8974e736854604f22800046864dc771eb451b9f5ab7a139ff", - "4d047a50936817ec077412bca76b4fcb35a59b4b2f6c453f33f43e2601cbee0d", - "69c1da331ff26c47708c45a7fbdf4dd4e90a7bb07edb89b730aac51b3275d0ba", - "4f8264442f2d677b3052a7bbc42c983b311c6a3a94350c0eff6484f0c3232eb0", - "0803a1cd562fc8b4f131d524583e3cabf059a92a10058ea5f6d6b125b8f46227", - "55ef08c8066b9f98d874b9f60eae46380143dd0b1bb7e22194bae3d8cf15483b", - "08851935fc56502a17016877875ead5b33c47a72129e0faf0e3757203748d53f", - "101e3ed774b2a3143b24e782e7f3a5b0b6d3c5461794770694e3d345a55622b7", - "747907f6bf97cf560b745a5f4b6f1440ed425eb1298a9d436aed6f4ab9092ad8", - "985676c32a0519a7fafae114c99b4fdd6a1c0c68f5f86bd1fae626c560ded7b6", - "dbfcba72e577f436d3770d0ee186b7795a8cfeff286c2fe981a2f16defef6faf", - "874216e344c89a0510a045d51a836ba18d5ccdcb3db2c236787a2cd2425d2d26", - "28a68f3537992d56fb3213cdca42b96e8702bbd4e157b2a6342d98d4c8f53cbf", - "176232710f09156613e733fe55759a99fd79f05bc73bb06e4f8c0b51232ef16e", - "f68bf2fcae2c82e39b8f3d5fa6074672319b98f82cddab7853de07fb4278461c", - "f6408bd6bfbe02173b0d5a009370e560dbfe20fed9b3438b27be71fc14165bc5", - "e9bc55448af0a59bd5748c7d365dcd58436962936919a64a9bd065f1a62ffe02", - "a3294bed38250e4cda60e2bdba3986ea61910901f860bc5d7ccaf446ebbed00a", - "da56dd0fdf520c0686ed8f9fcdfb7549ebf38c445fdf17d45a2367df68d4de9a", - "69737d5cc075edb1b8c2828cdc7562520a1a12c859afc7857e120957e040c2ca", - "132a18010aeeafc5b0c966cccfcd0221c0f3572370a3f193ff8f8aba6b328049", - "c458bfc5273f25ea2484d1fd901724c7ef7f48b6768cebad28ee3c8cca653e8b", - "b59231dff6783e2e52821b0e2927a980e802d808848b0b30d2fedf2ef657a09f", - "5c5128a38b220c36cbaea15901db886f3a866fb84575bc884ae679679941c587", - "6bdacc3f4d84a0c44069d0c946a8985ba0c50539af21d80a5f1d0d9345774ed6", - "7cf59bc3937ad0a5d8f787610525e8563a4b9d41f72188282290b878aeb0bd89", - "1e17100a8a03d01037e82a5701da6fd3f74cd4b96ca80404f4365c0f33475e38", - "a955b6197a1937a8ed932345cea4bd9822837f3d77e3bc3db608348b90f8359d", - "b5f2b2d844de9a315bc84ef73ebaea6d4049614f379bda12d813bf5a430eab72", - "527495f012b52b0d310287902f332017e79bad3f5558f4057197742dd25c0070", - "5b2274c323f7cb8d978591d3a980aecb79c044e5d6e3a7a1e3306adb6932e5fd", - "78e639f5bff2ff75fa8503c6e7acfcad3af601ba40f41c18e3459403caac27f8", - "8d9dd58022d78e528d4164dbb65c94175ae83d2a3feb4917960e36af293c8a6e", - "dd40a2b14c4fd590c2ef30eb698688db053682c4ac7590830f7277c05fb83d68", - "2ebb9c177ebe6e4ce760ca1cb4c0e09b7343f14a053084855fab41a872ba05a5", - "527106c74e90de4267adaa3a0dcb2c4c991da58aabef07fb5346271b9d2ca39c", - "3c470bd6201f7801f093d035b0d1cee6d8e5039e70c0d47ecc908c402f3c99aa", - "4871f09ad95db372d0245dac06f8b07dd26a8b6997f6dc02690e1abb8dbbd206", - "9f3270a857c6766940aca815baae5c2c03e0c2134ebb218fccb584c2422ac064", - "e6713e3e12118b27a9efefd966a8aa1443cf9220051ea20f839a43ae4934b356", - "dfddd2c2ea426c315292fc9c84dcdf3e8541b3c01cc9b9e6f652703181b3fb17", - "1901ba773166d98d5047ddde01fadfefcf0e1df3de88b0e536e946ec56a59c99", - "80b0d286dd84de9b953a9f757a027a9eff50f4e67493139530b0f590b6ed925e", - "cc43ebe8d47902a3934ddf23ac29fabf3ea60b4464159f2528a9e8e8d18c1ef2", - "aa58baf2da86dda89a8cae9993989d1e6d758c89ab6d0063822e649498e287cb", - "f9cb118972ed8d8023b42ea935fe8af0a3902561032707efeeab53a44b1b427f", - "eb9c3743a64658e2797776a84f2847175cc70de1384dcc29943aa6d28d3fdbe5", - "7a60b695f178178ca0f9c70bf4712dbee7973db24d899b11818d9b6b6983ff9a", - "70351bb1bd839314a2302598eec15db3f133d9e33c29901423b909f854f378ec", - "b21e228014d2130625e7fae4b8ba37863e0f027d1052ccb229385e5172233e33", - "50d4edbfa7df3046a58af8e8b4836d376e052849a86735c1c02039ee8d7629a0", - "e6b60aa6aaadf5175450f113577a6ae2136eb13710564d545730789b2c806d88", - "a7f8bfb449c01fb2f619c75ede4508f103df5a4c2cf955e77102386b2b886173", - "4d9b4445afc404893697d81be0ba38c5b4b5d8a8ff2ccd4a2bcdedbe42c69db1", - "8a805f56f00206c68b8fc46edab7d0f1fd1156ee8c15437b2ae7b30c3cde7f12", - "c1a40b6fadced1ff816342a48d555527532ee8bdf5adb7b4a12cd6533a18168a", - "6158176c5059846be9bd9fa676e2ff254ec5204ea5d8a18b060093e7073818b9", - "d7bc8f84b947b47f92210d77ddf30d49626d1cabf6ef6b982d8e1cf1a119f960", - "66eb38dc7ee0bb9796eb2089df23f9042829ece8dd012cb89c26d58773a93249", - "883ccf6976606ae739bc0b1bda7c477ca2d0849e77b571dd6ba42bda34037951", - "062a00ded142aa9959782e5a9b5db0be9d2250558914d0f7f4958bd80364ad2a", - "1f6b1fd85b972aaf501040fc210c05eb73bca602ecdbe60c67e11af86aba8b82", - "f7902978226777df0a573f4a311538dc54474b1e847190bcdc8ec7ff98e0bbc0", - "62362e5eeaf134a75632f98ca3148671d9c118a5f6b42e2b50b133b0c727f195", - "d51314f8162a183cec50a99f33472055baf6449d87b13be13e14ba9a58fe010b", - "3dbf8d9ee5bff639a332fd50f326ad3418b3e3b2e0eeda4fb4487058129e3122", - "bd3c823cd340573723ef81df716d3629c0b5e96f4fa54727d731eaed6820ac5b", - "014566cd257a3f8758e587b58da7bac3faf79f04bd794da88649bc408fd3642c", - "bcb7b3cbd6deed7c1a76f65fd380f865f82387ab5806afe18c1beede56c86181", - "8f21eae8f24000427ebb661fdca8e8b1c5156956448ba22858d79006be319b1f", - "4e2ef931ffc340287a0c59e26a5d0a0f877f3ebe4ca2f59c98d1e689a925da41", - "2f887548866e777efc36ae1385631562a8b1e36023d9bffb4fc644122cd3a731", - "c1d3fbce104baa254bc4f6a8dbddf8e87c0637b336fbbc5a44d7184c32e0d4dd", - "2b8c0b0d84b126799dca085ad71e593dbf795bda8d259df2badd7660ed59acf9", - "c734084b4c21eaeec0561a53bac3e0685a1faefe6442abb46131417711734b9e", - "1859dc5fd1f969327866f785e3fa669aaf3a4a305fa2e77da6650ea350ee48ac", - "9413e05ad9c8e6aedf82b3ec35d1e103b4583722c2e5d982d4cd7f8baa6efb1c", - "74e3203adf5145ba993efa7319aa0b2fe9e54f72a8981f6c96b4cc7c0cc6fb37", - "e10ee2331b8bd1caa9a43c2cb81ead82eb16c3436cd3a76ea85a7cde72c97e07", - "c4f6ac1cb357482ab0ae662d89c75a37591990ad766964a5b5de7e58093a7df3", - "c031f198c2902cf8bcaaaaefc86f812366c7cd435b69278a721f221102932d8f", - "3db01a3616d58038ba24a1f826a4fd5aa6e001de1d6bfc3f7eef804bf50eff35", - "f78a26426a0a49e77fa5e2fa19379e81fe779e7b2699cf9084a85f73bc5cb9a1", - "9b83b4b0419aff379e8a8888f06ca839336c9953461ad3d182b58209b37c73c4", - "656c417e8a2b9b6ac99aeaeb0c55528364b8d2606e5e9bf9b87d6d52c83cdbd2", - "16a5bece27c92b10f42289a8677e056cd6d41aef374a8a95138212591e8809f5", - "7724f50e9f80bf25c99394e51409cb8ea08926844e07b10731646bbb3d5b2912", - "5829119c01f959b2786706ac62f39e75ee47053709d4d02309badfdcd4dd1c2d", - "dded9e84a87faed4fa94b5ace60d10402848320d00bd6184fb21823df904efcb", - "3a7b877c49fe3e30618d9885876a153feecdbc50330a1d3aa8b6767a3454a4a1", - "c9d7cbb6c509b61adc1024a642b8b321760b0a4871218db2f3ba0f519ffb18c7", - "60be2f285c3e7625d22002ea37bd5e4dbafbf930fe21a433c1b5b9c6b789e29a", - "fb1711a0af29f0df17013a023a751acb318f10b36cdf3b6c0f07e65877cfeb25", - "38d7beff430608c0705fccca7a4029f933268e08e94463fb71298452b4064f03", - "5c00e420e508a653e82bc8fb617bdb6312217f102cf6a3be106915f9d6be504b", - "deb7fa9f01331333d1bc05b77e1806501e1dfbef5cf00c9d51df9306b15537fc", - "d5c1fb4efb2e76cb319eed241776e113d388bb93f0f5b050c93dca75eb13a9d7", - "0614e9ffbb0c7ad13a927043ab7c8e149d88d1dfe03fb560203ae6c0c88dd5ce", - "fc2978321b3050a1bf70afb109d1a0bfd05ced21a16e1f78098680a1f45d6c37", - "1ac91743d42f56d4d11e2b23c68d9287b5af499414c47cfc6af5173b99f8f9cd", - "bda9782548277020f87644089c6dfb9bd39eb84fee78e36c03a2f0205e6aeb13", - "3f560e72d7ea3ae3aa6ffadd054ef955d72d61914d9d902b54a7912ed1d25ea8", - "ece83c997b1a8b6e98f90b1311fd630a32762b7f6ec8c36d9d63648ac4a91e49", - "0e7ef3fb7faccc0f0feffdb0a09c59f445ac7c4320a2e7d91ab893bb0fa131f7", - "7d2553d94e8f561ec68e138447c3d7420f9c35577eb38244119622afa75b1d7b", - "b5b97c69a3a81d62ec11971cc23bcd8ea89dde9752b68ca6ea14ecc3c612e226", - "23521d422b70e01ea795d79a5e0e2c38f5623d5faf0ffed2b0e93b96f8e166aa", - "42cedf21b0223a8a541065fee48b74cff4af3a97dc8e4b90a08b615c4993ddf6", - "f44a952a2f7d9f75753601ed474695e8eaebd097c2adf36e6178770bf6b1e70e", - "52e31b7b9aa87640b9b711ab50b4183155ba4369b1b4d125c5b8eb12e7c2766e", - "7b8a6753f63c7c05e71056ab5387a5d63396bf4ee1475dff26de0905606fd059", - "bd654817d7e3ff7c007c0ad323a6fcb8158c3131ae3710f2ce200083a83df6dd", - "01bbc429aeeb6fd0680baf472a308730912457526e2de803035fadce8e75cd4b", - "0e3356f3268cebf7046d1df78ee128f0003a8d055b6fc51c689601eaf232f086", - "4a8593cfb53c0ca0e086a39b5b1f9e1b28b3f468d5b7dcb9d2c4e7af92038696", - "05818018201741fd6b671c021e1957b667717a89ddfafac8b18b714dd8a20897", - "d0fadeac007a258dd0b41f8306b154d01151b06a56398761265cd7bbe2854637", - "c859891a5aef45e02e6fc2f172aaf6409f532d64db8f335038713a8875b77c95", - "db79bf3c285ad66d8878afb28ef26ed6029ae07c3baf94f5ce8a54aab32994d1", - "5ef53f7c89e7e41a4184948a36bfb80b32877e5d35f70274c6e248a0ca32bc68", - "e9335e98ba3bc59ec60260e0b3f67ec8fcaf86649f4d7653efafe05ee3b5c496", - "811e09f980e2ffb066099efdec996895cca8925538c4278f3e68d739b2ab16ad", - "d92eb8feab0c6f917c5c76c90c76cf1d11f09f2ac52c5b02ae19497a8ef9f9f5", - "578876d833825ce725b87a002534e30906fedde35ebf3b45464b8b2e792d126b", - "42bf2bbcaee75b2e64c06ad9f656776c4d06414ee2b765a65253c7147910a76d", - "959a53ae5dcf95affc2ec380246f9c54f7080b96a99ed56a03dce5b3750d05cb", - "99f9a1daadabbe7fe2317a14fa652debacff4f2761a5c7b7e5ecf524fa5b5a2e", - "635c31339004c597f2d60533ba3fa8e85d074bdbcd2713fd92302897208598b6", - "c2ef6bba08b1f6e5a48d29ceea6803cfe75f919d93465af6619098d68bf9db98", - "130fc41031ef1b04ef1c89a63e3c484f849728079674c3aaff46fa321d8e5430", - "a4cfbc6d324ab88f5a6e88a56931dbb46152a72181d64bde948cb33f72ce0cdc", - "00432adb16bde36496ca79b093be18876c71fbbd81203909d7c176ecf406e8d5", - "94372c32942b8c5dc9b541742684bba677f1c2dc61a721b1aae8d732557d6c3c", - "f65510e4ac0dec242af54024f0bf8010f2e5e70abd0b89e00e8587f205637aea", - "e1d9ebe7265ca055d2a5f3f25f437a859dc0f34507bd03f9d3a2eb8832d70336", - "172049d020f4eca28a6bb922f4572193012bd6c89cafd16674a3f14b4ec0d1dc", - "0c6e3b6c9969e9f47d6a85cd3129cba89522822815f501597063815dce8a2bbc", - "9629006e3d47517734e0249948f6267a8918d133e9cc1a2d52851454b9874fc3", - "6671e38eda42fcea222082e83c4c3b7cbe986e937d8d12a10a9291fbd7306b86", - "67a667215838265b129f17ba30ac642e5fd1b43466cb61a53162492bc240122b", - "defaca0cd6c8ac1b08aa3fa42b163c5a5589e49f3fa2901fd9950a12e6ee19a9", - "61f00b6f310f16a7b6985c1232b5e1c0ed250a0d9f5dc9d6edbde22ec752b697", - "0651a6004d1a41c3fb194b4490774fe20ce86f82f429a3c992883bfe023fda70", - "e981efd704ed12bf7fb68ce6b405ea5150cdc2c02acc92f739447f7c66ca9961", - "32680191e5569e7df705c77b313ba41c6951f6d4bff4a65e46657317ccc3ba3d", - "22cd2204d52dace8f3ba754642dd8f976f5fd7c0ccfdb815902cd1ea6db4c90b", - "cdd960458278782c87b3e8462d18e445d2563be3ad7ea043fdad7f0f8d9b4e99", - "76900d305d77e95b5e10cae2c7311626b6afb443d515d008ce2d4b5606192096", - "1db08fcb9791a2079f2b8570067f015eb361a020c84671e2ee3ae8fd825a9c79", - "7e9856f957ee66eda4ac870a02e9b4cc1a5efdc024e668294a5751d242fd0d48", - "9d2f61b58f8b6ef918a2f8199018f323b3b2afd687249944dfe1358fb99de3b2", - "47a046bdb2e0251cec16267f3b7ed24570cf4917d9d7fac7e69960783bb736e6", - "ca102d7ccef316683f9765171bd9e7eba28ef33a52d41b3d129cce0c831451fd", - "0d9916e7c2d6333b197d8b1a84aacff229ca7f8052996bf4c537b13321e603e0", - "08bd9385947df67d9737ede4c37bfd34bc81715c1ba94cb6373aebf24bc36b35", - "8489e1ef0af29e26ec19c319ffe5061dbd6d4cf99ffd439cfb083416588d46f2", - "f0fb3cd227424034de1afe6d110d7661670aab9562777c507a6288ad59df5325", - "e87b703bc1fbf50640cbd8d3d906cbb48970f0bad5c1c7999451ea8a6242f463", - "ce72f3f59d100d661016e757f3897efe6ff9f65c399dec671ef0a9159974fa7a", - "e2475c9e662b9ea1c77dd01286c58c3daf62d91da5bdc0221bfcd5dc31fcaa2d", - "8683c3564a749a012b208dac70708689c6374133100bd5c24571ea1cf8f8248c", - "91a76ac59ae13c692fb4b5f86cda7e082c4246b3efec748bb35f41caaa082bad", - "b6fc4f0594f631c984149994a67edfe4e19507f8cdd881417d133e7d9ce81039", - "f42fb8efe2f09708013407f4db6b43136f7067ddb48b94f21e4871f7f197863a", - "fb35d4865b133e52069d16628ecf6954376ccdc4e4cffab534c973a4da2ce89b", - "26aa986fd89b0fbb1bfd562e3709c9d9f306da24e53a8d8541ff813923152436", - "e0f734e352a9c73bc472b86d3e63f5e3a1d50a3b1b6d4881843162fa6b77ef7c", - "81b9013a4a014f2da370e8b669238865f00c70305101cb130ef7cbe3759cb9ef", - "1e265a89c9363658e259d336ca50610551ab14b8ca09bcc7c3f352f6b9f982ff", - "06b7cbde3bd46e24d51584c7dae3a2b57fee15c91c4f6a38188eb32310dfffad", - "40fe5c59044b7314ac0dee292a4517d7f3c34a1d0d9716b4a50f19191b937461", - "b7d4f29110f524950743c756000078ecc77b6e6e155fd6c1af119eeec5ff2ba2", - "1056985ab70c03b0bf609fdec9f28b68530d25407fd5500651c1e6f0b5ded12a", - "62b6886ed248bee5b8ebccd386a03483e8054752b0f635d80750beaa41300d11", - "cc8b8dade6c7369f95270b2d77acc4390936f69135c66ad9b0a18e155969877c", - "4aec95c5c5720cc5c166b3f4cae8bf059309d9d70b7105941f8ef58fd724ab45", - "55ce138fd133e1bd1943c6ebf3df8ab09db2d5bc005ddd3e8be41b0ce6e67f35", - "ce64bcb0e5d9cf71a714e2886514b39760e47eb4857b0d65681bf72645ead12b", - "81071814097ca0fe8c7e8cd5198b6870d756e96923f4ef6fbdce7359b44e6ba5", - "5d1ad6f39b89548645fa251caf42a82d3e0b23520b4046bc3ac6134a680ce88d", - "211d3e94162103cc7e90516ec907aa63314e030f93f9f0b6a4f9e4d1aad80bbe", - "c593163d1c9b812f7067bb59107a537bea874b8f0739a510877548e798394e10", - "43a72095349d8fbefa0bc9e52cacea7d66d88b82eb6c41670e97e66f044d2a50", - "ef5e102ee006833ed9111ea89645848fd1fd820255d586d47ecd3c01e8a26098", - "c14f45ca8ffe95d2152b4c58c7264d6c7befa8ad84d1b82343158814ee11d31d", - "b250cd3be92c768fbc40fa8ca6683006ced27240fbf6b3e64d8d423f100f9297", - "1289183aabed0ec99ed908700d4d6a8ba18222a77dad84e8d4ea9b3eff508692", - "6f62625dc454b01ea0429258eae3101eee35749df03d227fa08a63659f32b5a3", - "cbce207cb76546488eaaf46f4656e61ef2194134e5e021fa6f3ec983291290f6", - "19289003546887fb8c23a2a99312ad2efed35ca57e22155245b1776d200c37c2", - "24abc7a8be40f1a998777faf7e417196287c0bc1a325199ea88f1d89b5a144b7", - "224d8ce23981edd70c9944ba80f8941d546206ec2d3134eaf7eb04f6f3d228d9", - "3243cec66746f2cdd4a85f57a2d38c3038d9254bdb85374193c187fb48de1c02", - "d0ef917335b06d191adb76306042b1d91b4f277316a72ab483381b62328085ea", - "6e4f1b74c1f4fc7fc0e7436be1eb3b9a3b769239b66cc83a17b818072bf7d0d3", - "fd790d9908f84bc5367cfa435de30a48e548324d65992f3642d301bb32bd3afc", - "0afb43fc3b05e212336528be71f218e455d01bd3271ca51e1efb0507d7364933", - "48963ef41bad4387fd7052a018412910559374421810c60eeae753a2cfa160a3", - "c3cb9e3a27165b62bf492576effd4e10a7b86dbd1265a3ad4677b3d522211a17", - "e77ad47c3d53bd98e02e4a6876ccffc0303a2472b51651ba086468b4904bb8a1", - "e87f351ce130b8d314e8f1eda84de0855d0187836c26f72f992da2d3d858f054", - "cc4179b90cb0eae6a47e0c1298219792bdf4bb981530b58081428af2ce02cd2f", - "352e9a698501793bf49063d6797ce32ecd00e184790e65cb651fa7c92aa4b608", - "e29110047524a94fe53d6d2d63577a18f2398f9dbca106782eb4f1f22970af62", - "f8059c633b5bb447ad4df16aef4c1fb03a6df7224eb6360a89efb86042be2e13", - "2ad164ca3945de10550d8ed7137b52b1e795db7d2c477b236c348d0687bd0b50", - "513e81e7f9da2d316672db5ec3f4f5db84874592ed0ae2ca8ddf25bed543c789", - "4297a60cb58edd5687495eb18682c24ccb8a42e9be138c461bf10a781764c120", - "b1a1c1cfe06e61377a0415f85eaaa9ba24d8996ebc8b91852a1bb9476d63bac2", - "1f304242bc5a4ff63d949ee35d84c89f4f36d32135d9b408304bf8d4fb944a28", - "170599f5b5929f817d4a42f251edd99bc939d45ade9d901a4d03d693a91dbb0f", - "42bd1711143e5100a0a58e789d859f3921ee30b284a9858782549f336235915c", - "c6d3ddcb4147619462c702c20d0b87f7a0ca728dc368db4557a71491c8839c81", - "52d2d1b07040cb723e463df4c2327dad70fe0b0a367beccb15e6b7ec768b2fb1", - "51fd0e720a20c0cac004a21825930708e11b40fb1cfaa78921ecb1bf3221b7cb", - "0b24cc74e85199110448aa9264302957fa4df5562228fec55933509c9f0d3f01", - "7fd99cad935fb5d02ad5858afbfb0842efb94b5f495fe2b878fcb02fe370fdf4", - "6ee49cd2b4632018eb71167cf1d07988ce1f52f7c19915a1a613554eeea15a17", - "2b104dd97183305239b46b38303d24bf8ce5cd1808bf096ebdd5e60c5f7f1781", - "7e5da686882d10afbb33ddafd453c557bacdc74e3916bcb12688505f589658fa", - "8a0a9b3d1f425752d288589f2a1c3e70d140a984cb7bf0aa7c5e83882d49fa3c", - "97b46d13067934b044b91add1f66647e65989a9ee621b45ed7af432606be34f4", - "3d74c405609b4ffbe8641ac0a42e7ebca6b136761b9c64ed708c9fafd4048536", - "65fc33bea3d3b30f77887d0633686af1082b23c8603da4e160118a815cdf587d", - "686dca2740e67a7fdc9d60d740ef7ff647df9ad4f1c9e72907a98f3cb36ee508", - "157d0bca896833a21e4f75a08f59a055fd4815e1666b635165bf562c7c78aed2", - "10f5bb48f69679dc9c02536e2b9cf4cbfa70f4921f5c26b834c805d1a1e0643b", - "bc9e872e1b3e8da4c5b0d9996cada580d175fc860e092b6526ee24be0d878f43", - "1178940c0badb763fd8d3a1673baa4e1944478cb76b19ddc9a20cd2eef0fa6c2", - "ef1ac183c65fe9a2243755661e164b336df4b478a29a1dba03444a73c3080e21", - "4eef4f851b4b50fadd3e4e0fb828554c89dc0003437f81805dcc262189261457", - "feb6ad40a42391ea6b99049cbf75b76de9176bcd6ff11236dcc9945441510e5e", - "dafa296039bf20706f8ac834462456ed546cb04595e933e3d705926a96f88056", - "e81224a8d471a50c6959e0b0e8c7916347b2e4f8dd6739a4c66d35a500fb263f", - "cc48b95d1b107108370fd4f68053651d66a8fe223caee391897a5e3e5ff1d0be", - "bbecbace9974fddacfe82dcb52c2ac14387b0d0da59c4d1cbe167c6ef7cbf438", - "c27ba83ebb3049c04eb65a2de7f11d85dc8ef3b650c4eae98fe0ca45f42493ee", - "489e2d212ac2675c2a4123409271de556f062cb6e799e74df364fd4330a7de17", - "c5484b0c8f77f65944eb6ea32e9a7c7ff5959ec2682fd982fb2768f30a699a53", - "63bd98c368cf9df768390c652fd8b9706222a4db04b932e4b37fcc07b9288c22", - "9f5fea4c9157ca9cf2c6982739783258fe2f701dc5f4f7fa9ab730cecf50242a", - "137ffc1441ea42dc87cbb811b38c54d477ed8342cfbdd40dbc14bfc4b053ac25", - "2fefc27d5937606c61f9e9ad5afbde27a578e2a3415b0eca314e097d3d9749d4", - "4cf59e999333d8937c4f3854fe07de9947276b90f2ad2be83be960870aa42ff4", - "f6bbf13128cf9c6facb78a53c9ab1d88e8ffa9d158715862a7cb1fe92cf5d4ff", - "060e05879f2b8175b3051d6e28e72761f8b9c6a3bcee0ecfe494dcbe9b3e5daa", - "228666aebd6db5ed96c0f747695cfc67a96de57a9b1ce252a4bfd3cb656d73c5", - "b0e413585dc7b2ac0999ce759b1347d94c39b4db555346b1f0d30762558c382d", - "7f4ccee74f39c926b74baeccac4cd96b4097e673d4e6ccbb4b19ca53cbc1e258", - "82cf33716f6b0e1e2b7e43486c2cbd38aeabe99604f8985afbcd798e13769bc2", - "a44defd635139e88c7b40e524ece3e9261e3996e96fcb32301763bf392584865", - "a43086256593d4d5733ca541357a698e760c5d181d77cb5e3be24ed926816f98", - "bef4d52ecac3e368ad782808c32086f822fcaa906d7a2fee19409e1e14454a7e", - "b6dee243f355fd7f321c76e781e3444ac87b50f187fc4d121dd15a70339826d2", - "0a93681e2e9f8d3b6d701ae2df589ea2e510ffed2762a9ae60c26093e57cacca", - "60cab6671fe2b36527330723e8fc3b2456d7ab84a4e74e3cd19cbb2ae44a1499", - "a046322c1b48d6f0e330e20c17c0a11c347aea95eb7775092291e9bf39b74388", - "7568a1b135d85b3951a707a4b5e84df6e030bf4aa91865092eebe7716e4c1da2", - "f096582a1bac615d6d61d5c2e21c722594caacf00ccfb3c4f1b0867fb853805e", - "ae79345bbf878257410d5f381759b865eee25183a4e6021643829f993fa76ad4", - "a0a445fb98e6c3a95214aec8ea193f2bf4fba3c9714f3b5a8e49607061bf2df4", - "fe1d6fe71b74e4c9846992f237adb51b6b174f755884e2ca4448d0e34f075312", - "4d09d0be94eb63a6365218245fbf5c8f2337a2f6687efcae73e49da16c41fbcb", - "44455e0f93d9e97c1b1a4f6a2048968819fba9f57b3ac71fe4b519c401a003d3", - "a09e56e970efc023d4db73694a0d01d6325a2e35caddc5471eb3578527ec1787", - "3465b3c38a9835ddf3fd2b0f857981f05b48f6923b904a5310d233d45da92c02", - "fef58db48586df740f9da243ec74d27c895ec39500ede3f7c248b661c5634005", - "190306ecec1f07aa54a3ff9c6fcfffcd41d12e8a1944c2f5885f8a896a4e6bf8", - "bf0d55ea95ece257a18aa33f101a601795087aa95accb0c15c5f0607f7c524ed", - "899aa394103bea934244bdc70afe1af6917252fd8560e4fbd79290db5e7678c0", - "e15596c28f1abb628d08dd015e1c05836a9c05c607b5efd094c73ca8c1e481d1", - "302c7e26d0411dfdabae1391ce23827143945ccef7d6712f4cb4ba8599f23e93", - "a4a69ded99aea42141ef751d5c32d0e28c2bc4f1bd58ee5583f1454065468b35", - "4dd25977369435734538141e0b45edb289b94736f326bce06437d10fc8eccd8c", - "18a4a0036ffaab6adbe5b3aa35b094ea93398c826c88e1ef19d279c0bc79b451", - "cf630f43f8fcb15e69fe78c020395fe1d68f405f5deade40b15a2b772a446b57", - "88d4bf57ecaedff9594f05170c9b5021c7dafbd43ced5d068fb8a2657c147244", - "14c7991dac447ec99e459e3ad432cffdbfb5b54a7c8fdabc255e76f4061b8d43", - "4bf68bcea900c3647044ff43f6b1dd7f41d234f407a6c8a1e7101f43aba92d6f", - "946a6ab22210f4274d23593db1452519ed897fbf883d97ac409d2e9594f9ee51", - "e4692a4105917d0873ccfd4f0b231046db3bae8d3f39905500394a58beaf973c", - "18dd7f9cfbe77d5f43f5253d430786ac6a185d4c8347996bced395e8ebe84e54", - "ddf50022b8935de752280003f99f5f41054ecd41ee002aeeadcd1228646d7c3a", - "02efb021bcf800166bf924ad3778987565f06a82a01ce20840ecfa9348d7de01", - "b61888237824177a66d807f0f2a5ddaf40984120f08d852bc96c5d2eebb4f76c", - "43728995e2aabf2ee5cdfcb1893c9a07ffc079d424d862677a9464eef414c213", - "cdd506ad72fdad7128eeb3ed7bfa8005df0202eb92702674eba1c06e484e19e5", - "adf9ba49d50eec14aa2204f278ed619b04d71125bdd20c9ee6ce433559922b68", - "2df1e21c0c3b83b7b2ca704dd0598e9365d5c06a86fbe603a66fed7e63158f99", - "86a012fb13364c93757f6631cf1f779dfc3d7c037f35418180325ca969f4d7d1", - "16395a1d56c6d23f413f452cb04d70c1f5f5d0a348b52a67e24552c3c2107683", - "5a8316a252799c21ee0535895c495373d5dc7c9f0d4452119af6fac70c10214d", - "2758cd957fd47ee6a7154de8d35ee493f74c3c1288fa7eb430cd626331c84a2a", - "4972e3994c9a2b68b28f658fe0a853ba13497316336fc458dcc2b8b1a52f7a36", - "03b8ac3670a1fb352a0aa9dfffd5b942c0e7137c3fca641e2843c784af6395bb", - "276dc74378426b769b32eb39af925087c8d4890743c2d0a3adc2ce06cfc14a3f", - "17a92365c7ce9f6c7acef1ba4641015ce9b57a9c3850820fd775357758b896a3", - "84b2c8dd752f408ade6ea4f2fa6d15a47f134eb6d19db8d70562f5d71521bb22", - "ecfd1c71da84e82179c2c81eff34a178c2269293d23ba78d1abe55c7b265aabe", - "4e95a8e65760cccab58427fcf0379da9c77732a65ef3e0118d38467a137b6c60", - "bbc03989637a38e01c4e4aa6a5824a1151494b817149a1ac19bcb83ae23661c0", - "2c6be9faabf94cc8bca0dd733852605ac9ed19de47448327b73d9c8a2e225263", - "68d0040ce68087febec74c2a8097350ce5247d1b0902e0a793bf5856509de820", - "89274b32a78a071618e313d214a494acd62f2375516fa5a311ab598552d5a717", - "202426b237e2d8e801976171234a7903af83ff638dfb22bcfe9480f0719b8b63", - "7f9cb966877908e8db0cb93c3d8bcb32302f4b7f3aa20bc8ac67303b5fd2810b", - "e5e1772667c38af7b7e74976d01fed44ad44bb307c13c25393ff9ca74b13e7c7", - "bd16b4f742251138751345104c960a2c770a79d2b5140628064fccc5e765b17f", - "bbf27d9f57dc1132b181b4468783341801d721629242eab06f0d211719f5f71f", - "fb4d7600b72ff34ceca6caed078a12101640de0da0b593221b35956c82a7477f", - "12921f4a3e532a7885b289761a0fb1cb6331ad717b01efa765a1d0cbf8591fec", - "f395e26a3dc04cab4c2f99ba47b534617dfdc54402a5199d45a3246e935c7c3f", - "c334c2034e0cf01adfc1dfb8058cc5e293e8f0fbe997cee02954b7df3aa791d6", - "4da3b060677c94f97e2dd28869058792c36f1bd7a12ed5d1dcdae3eb8548dea6", - "51c2f757f91466b2aacdc4e638ab28da04085d8cba01ab026b4012b90ca4d402", - "4f5045774d55211f1765fbdb21a9a5462994405e70f60f22ea2ec10d02583e29", - "480df7a009e0c63589157071ff5d83111228948ac5516b590f88a3a1dd3d0d9a", - "ca0c19e4130cc07235381fd3317bf602f8601293a76a68b3187b079d0a24b12b", - "2f405ea1c87adae68ec64bd5c49da9b7f9ecc29f411e08f6dcf76d4f52ec8e08", - "18b54b7521f3bd6df0952fc639260a5490eaf9869c83479a2ac449a67ef4bc5c", - "a422bcd7aefc8b899f513b18405d7511c3df8211a5cb680ccd4f62e749c39d28", - "f96630dc4958c48aecb082cba86c65e589e62fc003a941244d84b75d670e017b", - "a5562316b75d09f281267750c63948b9598c6452bd2eefdc6a92fdccd94f495a", - "714621b90313b9ed832d61243f4f706736e49ce0e505039c782c1945590a9d53", - "426bfd5d28cb03ac104abcc0ffb087d420e83837abb0272053711e9213599b5f", - "8f902210d3c3655a3b375a08e5cadddad119f5069706583a007d0be0b267becb", - "5cd0edc71ddfda0c98899f15574888b502a90a3131a84564198cc47bcf5032e6", - "56463143bb243f2bff12680f7c0a6076fcf4c796c59be5dc68d764fb8ab40c7f", - "e6301eab53008480679b753b8b88dea52dba4b56e63c296a76e3bfcad22c41c1", - "1c91b368176ab41a9d4d8b5032ea3f3115516399bc65b7057793e6a6aaa8bc4f", - "5c897b3a3a5ff225767bbfd098908e5fd5e17a5ffa195df5b80973e48b4f1696", - "15de42d3ee31c9c43d40a65b2ea090b11fb6addcb9217df81273e354224240da", - "3803cbd5a60d0663b2f8f3148d44594bd40d19478aa4504713cc5c94316a3860", - "a4c9118822eff753c2cacf775bd31c40800a95263532fcc73f29ce68031f0865", - "96914192e59f3ab791a3fa0119d0162b7576f29985c94d7a2a89aa2698f03107", - "6d37372c2aed23a7e9ba22c0c09c8ba89e9b6e0a969cc723c39088b12765b828", - "a0042e210a3262357d6f5a0fc4d4ef529a9e96a02d558ce82413853a002f4cdd", - "49e5bd70b506cc50dfcbc115667a1fef527588b2bed4def1f418fde099a8cf4e", - "80514448c8bf4866736b2b9c7ad052dd2b9492e0a5bb58bf7650598b31601f61", - "c71b641777b315dc97143146d3c9962c5ee86c27d477b314ece0ad69975935ed", - "7644a632924da54bfe277061a27505aae62289933afcd7987734e70c66911baa", - "3f04573513ee2a00b817c43f07f4730f98429447214050c7964238de1cf9da0e", - "2256b225b8643b011028b003b05c4d7aa7722f2ef12b0c257eec5a6e6a6afb87", - "69a6556889da34d86d3b89954d0ec63bdad2bb341f03cbbcf6c3725fc1643204", - "5320354c743fc5f0a21d82a4bca0f02789b55f639d12bcb58cb340469bd82878", - "3daf82431f75a4f7240faa751f8f26355c4c3af371e507ccfcf396355d1e490c", - "afeb2171a77fbe63ab379dbf510577b62a93acae850fb95d01d3286a653a72b8", - "4cbc0943d293722276182e267ecd051d52ffc0659703ac785a8aaee26ff4d974", - "19c658f30fbcb544ae755a1c05cce40afcaf94fa4ccc0e3864e41344050a52a2", - "455bfe7f2ec0aa27938ff722949661086d81930e0358c60378dab462c8a85263", - "2c2d2c0a50e11577b8364f09fb5d61df5baa821dd933c20d3fcaea62adc30ea1", - "5b7d43e7412755b894212b575e6d70994f44c4e9e15bf01ee21079601d9ca1c2", - "94ae04e014ee456094dca66ce90d39a479461152a8bf9a338d560c95e76954cc", - "1fc9c0ef0ef6b61564e355d29cbe026638eb08640df1357fd9288e10d208492f", - "f79d3337d854b7bc13267ba8a501cffd006bf4898c149c00b48ada41d3f0957f", - "8eb82286b5b3d9c6bbcd52acff9a11e868fe6f213b17fd40ba56182e3822aef0", - "1573797cbb1b5664e54694ae0f0de7ee26e361390eb0a7300937498699b0af33", - "9c2eb2e090e363df0be341fca3b71555ae98e020c2fa9362bea30baed40c2514", - "b01eb34a5f8c6e06b400987c19c2d384b0dd2e9d8cba4cb04b84ad7fda6420d7", - "8b40b8ce6be83d8136cae23c5d471d924b0bf21a0c7c27ea1a25ff1500ba69f5", - "32bc220574bfebf8c95f7c2c50ff032ebe8dfd7c009b5b6746ac8011807d801f", - "7d39634b3f179163425a159591b429b2fdfcaee9cb1a9d31d76149e0d20ac9e8", - "04aa032b51063dff56836faf93f31bc624cabc69a438a7c5e490dcfefdb20555", - "80e0d0515c90ff171654cc79493e4df869c626a359f5f8fbbd29a43174bcee12", - "c868d98fd0ad045308f8b3f18b961129cd11d5e5f4147c489ab5b9da79914f4c", - "30dc9d240fd60bf2b191b83e846054399547a4eadf3de94beb3d91825e0fbd9a", - "3afa4b8100c92d38ba2f8bf99e672447d79eac457cc56eabf676b642636adce9", - "0093f6825a110b814e7d348f619bcfdae84291c5ef6590256e28b7b2748e70d7", - "c06ddd66dc0fc2328dcc429f9b6889b01193fe62f2903327928fa5735862ddcd", - "ccb0b7bd8752838b67e66389cd12530601d15d0b4788a25846189b36eb2bb06c", - "1dedae5d7fc202d63332e6939079bffdbb67bdf929ebdcd17a38c7ba7f8e19d9", - "f20bee7be058e33e24d588be6c06796acea8aa8ee74db1e5d8018a64f615490a", - "2c291bd31f14186f093692ad977dfbf8841a01bf5e03b8105e6bc2a1f1f2558e", - "acb145343ef4c0d6677b068756f40d18a02447c2a39bd55d1d95e6e5c07ab30d", - "9f07c735407af2fbaa7eb50fdd6cf65ae33ea2a00ca80a9bb63edf45bf04f83b", - "0fecf70203b8b5a1f63105c841dba497e2399dea7a6abfb58081e1ff03b23bb7", - "a954131c0d99f3fac50a6885100d3968a5a7011917edf3cf51ddf8c4b38fbe14", - "49f48d18362afd6606f0be6a25393151bb5d6e8c469f82273a1ae763e4da1a8a", - "ef319c4560086e1531aac2df089c887a68e056889b96c6990f43f7d36fea59fd", - "329710c27521d4ebc4212e729b96c9e7fbd75312a49a30d05006b1e6237360f0", - "1e0f3c727ab2a49a302607f8003ddebe93566fa63555929cba6d5ec9cade0254", - "b593d585ae35681be14587b7c00099d16460945ef938fe31fcb4f2edff0887e2", - "02b4a3ff491613382ed8b70b1da773aa37864aceb238c579759fcfb050cd99b6", - "79d0ad11f741d67cb302cfffebc43b4d10873457ec155dac34133205108bf019", - "c39f16998eb29af57e76e23fec02f4a51ad3e82ae73267c0ceec6f5f9234489f", - "ae4ae0999c0a7caf8c2ad1db96b45a4e87f5c36f8c0ce83146f0ee6ffb915434", - "742fab7ad71f5b40e3f16c9fb8baafa2e8afb3865e3280329907d06ee97c4ecc", - "af40ae7c1a74284fa71adaf82abe0af61e200ac1ec52c83bf795f9b99215a6e5", - "8fe801e68a12320b37ae26e2afa8ccfcd2170c759d81f7ec4e929622cd3b865f", - "fee02fa49178c969a0300caca8edb13fa198cd7a95e38b8621d438aac4df5fc1", - "2a530a22231c77d328b5cb08e72992b3767a3fd745788109cd8b3a84443d309b", - "8d9b80777c5fa2701073050ec2ea2872642ccc03b1d1896bfc4933f62e108209", - "1bfd676bd7ebddc8a850475959d846c632d798c4e37b792957883867081dc11d", - "1c331e5d08e95a987ac597f3165467ca255ba86e2ef1e45ca163a9179640aafa", - "be53b82126fc9781f6e49bf97ba73784c1490328fcb7bfccbbc28ccd4d963059", - "a15f8105da911af78fa500674114fa05ef44faa7ec5c898d21e2f874a9e56971", - "f950f603324c33af15bffd361eaed720a75c265596ca9bba5291459680ac54c8", - "6426cbfb559cdeb396262f29b994427aa92765170218d76885aa006bb13af074", - "904d42e03da5e4a1cb4e338e68c52e9f25c5e3dfe1b870a234c0800a383c0512", - "f04d0e7e4f5b26c8b9ff3a8daf2313af441056f64b9a29914d85cf774a1ca560", - "d70ebd75d8b93644979b7f90502f8c6b650e6826f216b231f23c7eb8a36008bb", - "266e31a6356be16b4bbbcb1e205ee2338b3752f9e02dc88f45e6ce28d281c98b", - "dabeb775d24b773f0592758ad8319befd924d81ac95684aa75ef822ccacd8138", - "957cd22d5c8e923f55b5791f868afdf9a807597c21686b63accfd89f1302fba4", - "29b2ab15fd21be74d34b23ddb5fe4f491d2fef86dd8d2aedd88924f4e9e0bff5", - "a9788564d8bf2e95b3d5f8520fa3271038e2140e110b53799909f20c175cbbfe", - "b5138e10bb88e89a21c34fc2003d954fbfd48ac32232d8664e1987b0dddec252", - "0024ebfd4c97d18195205bd2c4c2ce616951642cae1795c3e6f448bb89eb3354", - "9cef9455c1e42ab5f7a93f4add6d2695316629c66560cd16771e05334e6988ec", - "f6ca8e7de1f72c9cb0629a32bb1b3f5f0806f5f141d95bd1dd3fa41f30589a63", - "68ad5335f4728b9023da40bcff59b8307b2cbfa654564ab30d03aea6bd9dad80", - "c5a15700fa8e6d81372b9c536797609c2659ebfc15856bbc6c098148b2706932", - "9344090e269e076cd551c0b2024c79268f9a432617ae46c5f48a030dde337358", - "61cef30bc791c395aa9f32c33b5ec5fe8eafb64f5705a1a12c0209898579e7e6", - "3620e4183525cf5f59787873f13f119efd582a719fee2900ced3b0acaec4fbfa", - "00ddb7b12558b94abb7fa3df3cd425fff53f0077e3db69557f4a2d957f21f60b", - "1b9db9ac2966b76aed3970e7f77b16744c9319c83d71353df24564829932a3ad", - "c5654a2db607c5f56b9b15bdc7b8aeb64b774f975ce8093cef4123a2af053db5", - "d84b2732695df07291a1a8f574c46e0e735cf1e1c288abd8d3f9ba6a644d8351", - "3b028b19c60e1f2644e0a0ea9c9dfd8cf51a922461b7e9e970e6574c375b6fa0", - "48c0e19217f3f7f7f70290623cd9004bb7850a1c2bc6cbd98740de96ba0edf54", - "8d8b4dcf58e0d2030016de91ba8c41133d51df18fb4bcbe7a9c2bf23f7e47c6b", - "1862a05a1e0fe05537f1d61851f0c9bc4b58a7cee405526bd530b8274674a538", - "0f9000382240f860679bd7f10019e69e97c8c8f83d0525e578a177f1c530d3d2", - "7c704386e91df1337310c09d2542a0b925ceb58ace03e1a08bdb0f2d3823880e", - "d2631fbf21fbc7bf9af825cfb6b1cb7f700026bf231b6d70d61602584b8d604b", - "a4b303a845f763d533093d7fc93368ad7c1c4afc3f63b42e3dadd91d80ed2316", - "b6749bb5447275805e0d3f767313e7cdf81f1c5f03bc117700b5cfcd14a36a9c", - "5f1098d4c6818400e1f8eb1043ab97ce41e954914cb41a81511e17b226d407bd", - "55d00cd71b86cee0b637504c2a6494e2bcaebad90d38b5d2ee8b5329eea2309b", - "1ed84888c4d69ba7731c3d5d39717b08167101fcb2b0c4c60a2ab1c06f0bc380", - "aea4a428409e944656f1736356ba2c66f3d721a0e8c632f99a3fa133046f18cf", - "b384fee1ea552f0b9896e05622675573f718100c4d9b98ff4b03507d69f9e44b", - "74dce258331646dfb0b661d184c805be4f463407f55a55096755584118d42b0d", - "dbdfc694bb66775685f21c6b639a4b5be92964217d0186b16575b81eab81bbe1", - "6eb65f55fa7b09fecd60cbaf680fee194eca56e9586546040bcc1028a0bef822", - "4d365bcb682707bc2a8692c231957e64b67f80608e32b3b12a59792cc88f36f5", - "c2151c226a35d4fb77e1859ad6efaeaf75a828094f31a24ddb83f2d03d841d88", - "e21fb7269680e68acbba5509c9f99a517204c68f7aa4f9d59f0bd93226da2c17", - "96fceb0cec466156ad388e90c9dc97fb6cdf7606cabf4c29c4ba61b02366be0a", - "485f19a726fb9fed8af7199e5f3c2e53b4dae2c03ba96b4024ca399e63ac98c4", - "6d0b137f03ef3c423fc31ccaccdf4c04e5bfbc1138294137f32720875420ae33", - "dd709c88773ae74ddf2c767d86b58fe5ad30c792ab3af8427795f29ece95bbaf", - "719bef93ab9a4013e1d6664f4526460b69ce43278cd444ba46a7d11279dcf6fc", - "88934ea3eaa86e5dbb9df9a7f107a4b5326e0c8a135b929c22f9d18c39cdb4b8", - "c9c2b1d34fe2ab2ff823e696b62f7c1ec6bede1732fb598050875c42d4b1f06a", - "badb47e51060074a6e32b95b24f5ca5e6aa315155caa62a022faabef2097dc6d", - "965219aadb4c9075a01bd515f87cd61dee51c83f28583b4b6632586674c5aa85", - "19f3697e54686744c395048428c2984a5ce01011449473669c60ca280a4718d3", - "db9c8ec31624fd09b431bbb56e5365a5d17c408d904fc99e1627f50cca950720", - "2fe79197ad9bd29d142ec2215c7ff2c303467f676b7f3d41cb190d4fab180115", - "bf3637fc2c56ca19ce47841b3e2688483877268ded36025e66aaae965cab482e", - "a992d70542f8fe01d4b5f3d7b58757979fcf1d2946d6bb38062f3d3ab92e6191", - "4d510e571212084845b23c1d505b54c07e85749df05dda31dd2199bebe4f3ce9", - "26f2a21ed3e516f0097e03e26f806a5634b3bf9400a6426313a5319351271e1d", - "a5d6fec743d33418d2d39b743ce39d28d14272bba8eaa6df940bc25fee5d8214", - "cde556332723552af6dbb30964ed4521e5508219a78c0009600bf03fa68739e5", - "9bb1a4a56652ae0846c5b878fc3db14caf6e03a6bb242b12a9a8560d8d662d94", - "cc8f835eb18d674b261cd0359cf3e5aeb4a9ae87bfd617bf12d5914442517b3c", - "e827ef1ee7bb6e694e4f9076e7190d547e661ba45f76904cae39ee044ab3438c", - "bf64a1df30f144b00349b8ab64eb9d6f738cf8cd00eff044fcee08ee88a1dab4", - "a9e9d671032fb3c4ccd736b6d2fdba24cede158d1d2317a5578eb965339a8041", - "aabc69d9e51a23ada5de1d4e93049411d097f3b41606dcc46c5f73f5c3004789", - "8d4bad44b4ee93fa5712addb4513c4ef99824501c4ef55645a3c714f8d7a6264", - "3682f683ca96c2ef02421b3af2a49ab43dbff7b15d162805b73a0f23991c1e73", - "946156c34bff28ab1d44f377f67e34fe2e3d161857fb823ce0be708e4f6caae6", - "da2ef01846620abc08a4cabb64f463d388d1988dcf26f512d307f1c28c5605eb", - "efd43856ba065093ad291354e715a229aceef15c93bfe1b419a38ed7f0d8628b", - "bf7f2cf9bb7334dfedd03a9710f87079da4e98835316ac5786d76852054ef94c", - "c20b9b2ed2f4a7fd209abb256da7383c4604323649f2f785af3ce1ca48df405c", - "3a684eba3312ae27cab91d9453c3fb26169b08b7e7d34c3254d8e21d2f58fd35", - "435af1ffea923df8e8424cb6f9a5243b40a357291c195cf1d4dafde9c2b35e2c", - "658c7f0f0ff2ce82eea0a0f1ef8d9b6c266a0537a3fe376c79255b36d8d5f0de", - "5406588e5c6a1987dbdb69f56f378965be7a31b66e0c777cb223b6d7494745ac", - "47017ea08b655023ff687718674428788785a4c5b0d17fcd3b2e4604e9ce43ce", - "eca8fadea41d2e29ba372c843def33538c9f165fec39bd4da58bfbd694498934", - "e507131a35451a8de9daba082037462d5678f5f02f23c71eac7ba5f26953cdee", - "491a193b19256ee9519bda1bbf7d8c8cfc629eb6731c5152d3fdcc2aac82e0bb", - "3407e4c1099c350c2a17e0158019c627d7b9bb63cd01afff25d32e14678b1ee4", - "7ac5c389a4ec35922d4d30c0eb28121df6e7de3e1f9e02d1f9204980c3046f10", - "e5f6e39cc7c37f99c3c00ed6cfebfc94d09e6cbca1b28cae7234eed3ffe8c36d", - "cf5b5ee15e19ad814ad947a056ba744118133136e4ef95732a9bc85d6847be62", - "d6cc72119758e13d41b52be8989715222ea864a980c44de8b59a48d635091090", - "02bdb7499bd6f9ae11745472917a851b21fb64bcb344b790742fe790fa33d82c", - "92daaf78480c85024b5d0ce1c03cecf60cb99baf2fca1c86c33d1c1d8eacc304", - "81be6c876db19cbecd2c28216e9d3d0bb94dc0e45898cafc3425277a8e8c1849", - "31f3426a36d3f3d580f73cf46d30d86988ef01428af0a04e67ecf9b5fb9dd49c", - "718b68d389c2e82f49e08813803b97cdf97e39bd06cd0c641da2a2784f8eb288", - "999af9fa877dc562980a1868729a2dfbc038d6418626917d401af15f6b95f464", - "5cda1de68aaac2efd4801938a891dd6ea1f29e7005f59e95f5f057db02bdfeda", - "e82c62e4f4670b1e44e4fcb1e6a9febb418696b38a2d393373ef592a29a3a51a", - "d8c43c4f6a96dab09a8abb6f0f1f8595558ecba32836e951dfbc8d47c648e389", - "77db08890bef771b49dd038f925bccdb2564f5e807f99f34252df36c7090dc46", - "7abd0bc4b1bab3b10e2104e22f546ce92c29d07b340cacc983a420a9d50448fb", - "71511efdf435601ec0863bda46e9e832324db0cfb3f98b0d7aa78b7a08b31339", - "06109c18a9b4e8aacf2dda38ea3b5c2abc68551ce7e583b6ed9ebafdedee99d9", - "d19309ad3cd16d60df39c1a32ff25b8dff2b245ae30aad987e6b9224e856b312", - "623d7369f1cb347d4101d2befc2e7a2d763d2b86c73571c4119872f062b3f312", - "0d61ba1d5de5a882d2b44c0d9ac38fbab9ff57b6a2cd130956ce27f961be142f", - "3f45a5c5b07e9683310961a1c969a3ff14986970a10efa1ffc4ee9ffd1dcc472", - "914b0559237c131c0098a68617215c23c1c28c2c963aba59c21bb79cf58b3b40", - "36525b75becc7e70b66b346db31e9543d0086c32ddc57e881536e5422011d5c4", - "7e5edf030a9554a705029828a12357a5864f5de1a9673614aa3c2630aac90a33", - "4c477c06b27fa2543b70a586c15e161bb0b3eb594d8d485227159a992dbc002a", - "cd0a106eb95e1fa03a0324508440acd93b776e1dbfb0dc4ce27e31066577f5a5", - "6032dc504c1d907c5b4f426b5421d4e061a17b97b98d3d133fa1885107f04a44", - "0bd8c45f4b959cb0d643feb21f210e95116738e5a4570911e4c1200ed230d1f0", - "4e6de6ecf7c1121dcc58739b4608daddce3db2a7af846da37164da35e894e223", - "edc58e16d9b2338840761f97ce90bca9c400e0ce538144699a9ee7ce26cb4670", - "854ad09785466054bdb6fa06dd4929751d42f867115b9503a4056fe25a8ddac3", - "dc6e90ce2ae423a5fd4cfc37d72ed49693b69e74714b38cee16b0db766394d07", - "16ca07983acc4aa0065b3b82acb184bf0802336c32f745aefa4c2acd7b8b1d53", - "6f82cb6c5b86e965089fa3a5b97157be5433360df21b5f25524aa6fbb5312455", - "25bb4ef095308ef5a7f0da3a0cfd04faeef88860a9890a71240da8e325270205", - "727a831f7b15b3bc8e80c712d523c3bf5aecaeeec1ccba62f5677a5ed0b0284c", - "9d23d123d44ee22a822a7757505f95357ab3189d0446717822473e0d89c8092e", - "3d79660ef93b8c1e6037cfce45a6413c5dd12a168d7f61da9947f0708418c1fc", - "e1e9a586047d690b94efcd1e255436bfcfaaaee380e6b9f3a84f31eb8c3515a2", - "c145eb5ee318a397089a5d045da15dcdf3900f4bc33066e1349ba1a6ee77b5d8", - "686a533184341bde342e628fab0c61dbd1b6fab4fdc7dbbfbfdc8fa6491c54ec", - "6505d9a38689be94f8c4b104b7ccbbc8b2e2876da433ed393586da21479e6933", - "bd64e950895d316af3238ed1011ea993373a8416cb9b3c68cee053d24318cd95", - "4c9cbb99b8c01afe93257a86e41e69bdd7ea9e08a0b5118a5f8f76d47a086d4d", - "7dce405c0b3c64564aea18ab264b3672bf92f2283e1956d4158b3fb5f9ff78d3", - "f847e8b62cdd2e8a902b2dcf014be0cac8f586de0e50f17e689800fa9c5987af", - "9aedb6c5c86ca8721739614cbb7ee82cb0be5ff14c3662249a55ef802327b252", - "7ae9942637c88b08ab73f9e511540fccf6d2dbe6358543bda2337e374416040f", - "e46ee3a907e154f45475bea6d8869d1fd2c087400f6a11091d918c9e09973bb7", - "c80bdffab631dabc80918a9856a90e87c2e14fa22b6f2bf87ff2136f1e616701", - "29ec31f53f17a8cec29e456ebc7a2fdb9b15320a60897485c6ea8488f29ba693", - "b4e07c4dfb5125787219112b1f8285bc3fade2bea3ca253d4145f09c2adf3f4a", - "413db429a2b60bd97f188b637a6e5700a9aeafaf272b928bf2e48f76dd602d00", - "3c08d71102e299f5411df2e3d226387a7b5e6f2c4467ee3bf5b98c79f4587022", - "ce4734699c541bf184e2091c3b23077ceccc7643bccaf5bb170c4025093c2930", - "9b31f3228541ff8e65e53be31ddfd7364fa62e9104b816519baae5f5032e6e74", - "26227ed3bb47d190deca6c9e03ecb912c5b985d1b4fbc9dc0ed8935902f7162b", - "86250d63e84287eeb56070b9f6354536d22fe5bfd17a2ccd9868cc2f7920e086", - "8fd20405d8f6be71d91317d9658cd1b47ef16697284dceddfd6b69931401e4ff", - "76bd82ca49623b1349f5c7416ecd556eca7dd4aa45cf030dc2885744995bed02", - "ab2058039b49b3621b3329e564bf88844e99e0aecf009ae0bcb3db28f753a1f8", - "c193d4f3d3b9d036453e5a677b0bb78621db74a64ec42aad95808014b8f965e6", - "e0944c43f29ee774b2c81021ea2a4f5cee80eb13b6436b49f51c7b85f019a3e7", - "257494eb5496714956581e27a99f9079f6d2e1ccf16166dd08817c90fc868e65", - "433cc9145ec92ae1bc9a3306439cdc548ad32bfcf8052267abbcbf30f0fe14b7", - "ff9a3eb1cb9091af6afd4965a0bec48160a027327dfa17a7c49958c6b90b9282", - "e58c8bf9a4f44da6a84390cf61b647e17fcc9c361bb40cf5e5cdb495a7847180", - "7694b00d2b5ecc782d8de3243ec66fd55cf78bb7fc4ef9e335451eeabca9334b", - "8b16039300e043c3b89289ae971511e8e34b222cb7a6506cfe4bfc8e9893b8e8", - "1ea1750bc1c29e33e219129bb163f4a8208d58fc15d4393796722635f51f29d9", - "a33c3f0654e9f33bc0758ed2f89791d86a91172f682288b1c71e81e4f1ec6cff", - "a75293123874c8163f1119f8527ebddadd865e0b8bfe6edc91a78613bdb20a90", - "97f4073ca1b418d8ef36737cdec6b1a569184e346176ebbb7a81b36c5c706576", - "b06eed89029442461fdf4b90505e4ef45e0b4008c56dfa61e4bc7b7f464a65c3", - "4b64030cb5b0cca94696e6712d6d0ee414d416fbda4067ef7c126eea7338f58e", - "b23456518b14f6a8ac6437aab581187e95943941378dfa0ada8e4da96d5057c7", - "0534630855f9ba5f5d36b01038318ae6554ade202a1c4d87c82e3b09d05ee404", - "da2d62da3dbbbba85590c4a4c6ad67834c99b01bcaf985ebd84f3a30aaebd541", - "6c6a975f166a0c9d025cac6e140ccd61eb2789d79e628c1ead16adff026ca77e", - "15b1e215819f58f7ba8cd368c4080702aa9e40c32dc1ce76d00064a4732c3d49", - "1372a767ebae6ed55f14c1bdb5f7c1bdef8afb9924f5a5d988e162b7a4692bd9", - "9ba94bbf6b858ab52e028a31a3785474ea549808c96866310de8b6cb6c83eb16", - "2950c6554e700a6bd3ea5a0e03298a11dd1bf2f9a278856a4d373ea19a36eac8", - "3703bfac7a95239e4db2c9bcd29bcbddad290acb082691e83c8e468b67732288", - "909104fe366d875543315476ea8c4457d6ae09a1618aaa931261c73e53b1e50c", - "74930bd453cf040dafb5b1abce9bbcddd64c8ff6b67c507e415f76ef28e78f59", - "27e6cb430fbc253a702b2969abd80e3d8710fe1387af8c5ff4ec2bd8ec9a48ca", - "82f34adc0f933a8949c268ffb331ab028cd625ce3e52cb39102106d3b110552e", - "22a73c42eae6375b43058ecca686eca13ab5fcd4217b350740d0261e49a18a9b", - "17c18611323c605997cdd06cb3da7ecbc0d68bff8827cc7780cc8e5d522061ab", - "4b856db53434927255c1d3281b375b096b13bbbb89286cb84c210006d106cca9", - "9951ccb62c38d0100af2ac789f21e381a29bf1a1011dd41545a7fee4131142a3", - "4f4700808db3a20f1b3dde808e98642cb922a530204c8d35ba9efbd00bb85c79", - "9df373b826b4f34a1e2ec49f1ee05e1ee90207e4e3d005aa7557f6e01fa40f8e", - "efe53a5ed7764aeafa98a95dfb5efb3c9ef032f8e9066dcb452c957e53e39fee", - "578c7c6d8c0d53f707f5397a5e79376d033139c02f7a48030fd386ee374eee0e", - "85a06eb8a613532064c83ea9aa3819c49435355677dda141a93bf5a44d92444c", - "715b7a96319117c155e73c76cc3e861e73456d3700ba6b7b47e5093476825ecd", - "6c93485adb8f92ba0c50b84de731fe1758c100e860b5ff243e2aa15d8762883b", - "3a6a418e5a973bc3346117b3c29ed8ba5f7099ea370fa31243a54f9b646e29ba", - "72212902398d38f3b813c12454a30698bd7e493257ad2d40943be65e9fccbade", - "f5307a249dcaba988b17c24797ca2a4be17ff0871413fed3d9eeff8e7de83713", - "ed1659c85e58492483ab7b51c8cb8b4a9583723b39fda6094cf83aa281fd1cf5", - "879dcd6d753ef51392f2ff9b5108a306cdc1186ff54b5a074de86cc3f6000a8b", - "9d4adf0fcf2f49bbdbad05228df31e0e762e3734de764ec88f723904f01ee4cd", - "9ba03bd4ca635e594c2820f75d73dbfc3c841001c5e9e0b503347d3da8671437", - "703a56a6d637623fd12846ac1c8a27f5235c7716906fe3b04982c06ac813f8ac", - "e4774e4b06ea4dbe63c76a5d58f06b4a7d2b5f72ae77829437a997e0636401d9", - "5571cd9283aca04d3dbc4e08e7b821171faec327e286a9137ff931013b02ab93", - "87336bbb0fa714ac06e4ee8cee5ba1a5a75e863840b112dbd2497984d89b45b2", - "c8cb495518f529570fcd1b73e602dc806c47a1ddb27db4c032a25f4a4f62d6a9", - "87f4846b7c86c151fea1dfc48c95eb4a348b903619f50cd5ad4c9480099f965c", - "884a0d0ac8c871217b7f7e723ec65fec99c01f27b7bd2e3869913626bdcc382d", - "888cab898c43c66c06ed35e4f0ba2e8be822a12439ba1583d904cbb024eff6d6", - "f0c13255180d0937a1ad9697984bc129ad58fdaedd657893999b40e660c8f116", - "fe0dd5a4d9fa8a77f00ae4432feef93f56fe04ba649c3ad8fa7b29cb789faadb", - "48c9dfa9b61d35aded326219fc697c0e0d7512fc3b13e399668b91113a3b7304", - "f6d04b01a1eba930dac24636601bb41243a708a4538970438d8b1bb58a780dab", - "34652d9587c48f234ec8d267f5f856cbb54bb1f1602b560fd8be8370494056e9", - "eb2276cf62dc7f393e4fae7c4ece0dc34eb5e8b2ae12862e2de7a2e606bcc21d", - "8810e53e42618ba99a8243ed8ba8758db46ca0f69a1cdd8eeab9e6caeb69880d", - "84e27b16651c5aff3c7119e83d29b87ab62a2d8c9cbe1fe1e630d93e9d961d80", - "b291bc5223c55eed78176010943131515523daf820fdd978337d34525061c867", - "b215f1f7be0ad004d5477f7ac05cd4fe3348bf01f82a2c76f4e9465bc4269221", - "dc69a2cc7e175043b7d59ff0468b9004292e6ed487e5343002d6e216531f5131", - "b3ee246d1e8fd1a7edd2935fd46c971f43a5a6e3c8ad2c273e212fe4f1d5f4d1", - "19c9098c5d8139523befce30d454679f252f10e76535d0e00e3caf5b67e92842", - "c21a76fb293bc86ec3deec377915644d211303f3777bbffb795f2bd67e3bae8d", - "453fe4e0ecce8e8cdb8bf1d654f2c32fd6acdf1e0b8e35210d767efb44386fce", - "616b7b847c2cbc25f66b1e7ec729f26cb9349f3e5892a90d40bf65668ecb8686", - "04ac5b27fcf3ca761036c4dc018feafb4eb4292beb443461b1ee9b6919888427", - "468a631a3bb2da80bda1a292ea2635a7fabbb960f37fab59f24a6d8f4f12a190", - "8e98fcd0438c1fc89a1278ded5db6ff74eb8e11b521773915d352cf411c3d0df", - "e41ee3fe471df3877623c1c32ee378e302d8a2dd8c4e46245e0723121818a8a3", - "7dbbb799f6b5919e925124ef131f9f7710f6124129059a8f19724d3ff233bfcd", - "d1a337fc7a156a353ea07d8c594d9be8cdc8053404d32e00e1bc35e9ad45e52c", - "2c6cf9519035a7ebf49df822d14d7d913c6f0f861c70a6ee09887fce157f0715", - "0efbd22a349c6791976aa433c632e5d392cd77a89caafd796351fe9935feba73", - "98dc144d1b594623140665f929bd972ddf0ef6e44267cd715524375111ba5b5d", - "f10d9a1088df3cde43d0534141419c8a0541929b7d2f49d6734bef5a0095d84d", - "22dcfa07a39d1f5072c213ed9da17149c947c95f83360ba96edc904af0193814", - "6bbd0eb2019db4034154d539cd173d98cad8d8ed4e7936a13c58daf76f5697c0", - "07bbb7f2e6c4d8c7edaeb07f611cf2d6c8442ca93311c54a005c109cad21733d", - "9c68cdc7c32735627f45dd85771a05f1145e3a1a830b0b0dff975924bc712ffc", - "1a51d377ce22c3d20565fb6dbeef79d5fb4d5d6992ee580d1ed38124d3880256", - "523e82aceb541f483cd7d11491e8ff8b67c7527af2ae4ea219290f820269ecf5", - "d6cd05c54a783a57eb744db4aecffedb5f258ccbbbd19c780444dc0339d8dbc3", - "9a0bc9259ef27718c8a1ee1f5eb3b97c0abb6f4a0c7b0994b72484c18318655f", - "f2811d8fc8dae26591b09ec4a32febd18195e701ab8ae23eab39f9a23bab09f7", - "a9e2bd851cfbd490916ded57fceb5878fd94fcbeac2bef04fa17c3cd5d60f50b", - "066fc589b98f1cb6f9d5ae161f63b9d5b6f69a63ae0fd340a71de6e381921d9e", - "82e5fe0d6246ca50c9ce2a37bec821068999000b395f6be5626e9a6240d45472", - "87ff5b66157e2032a93a36c71e27c98af2cf3dfc6445deacc8a8f14c2345df8a", - "48de65c9105a09d20e15d5e65c620fa57eb107cd9070e0eef5eebc922f65889e", - "a64a66a6bc821112817729b61673a712baf5b19080c6bcab6f45948b23e896c0", - "3f447a321d98d05aca5ebfd399866ffd936943fdd07ee1350dd8da6009c587d5", - "3b33a93e13842fabad0bfb6b3ae8e82a2bcf22de2ec02035a87eae321fa404d4", - "9e65cf093dafaee4f68d3093ec4e330391723b0016724a600ba340235def991a", - "30c1866cd3522706598778b67aed047d5236b9379b28fd5a7775800c8ecbffa7", - "27a60088c692f0074db272d19e65dde662103cb33155d3296bbdbe6b0effe5cd", - "d42f382a56d67782a3afa7cca1ebbdc62bc9ada61f4855a2aa1db24b52d03b9f", - "2e78f9e3bcc291d3ae5beb24ef0c0d7179556965c9eaf83f39a5473e35c5b1b2", - "42ac9279c68a2ced1c1ff253fcd6bd157fe197fff4b9d3de491c851bef73066e", - "ce3b5ad9f43b2be292634af721512d9e6ac5c1cc076089c58d9ad216d97f55a3", - "81cf64712388a9df9ba269aea55eae503b488493c2577ea20630636d724626c4", - "ae4f71f5ea0a2021d9bb257146de75e5a4b1ca752879cc1b93955a5df78453d7", - "e79cb69db9a38adca7f552131e5867eb261e24a8ad05adc7076aff6a5ef58ba7", - "8771e54c63ac47cca5eca09d214418fa4a81426bb86de8f4408fb068e902d901", - "eec0b622cff2a5781d329b8ee4f0b41300e9f968c8eb7405b0a5f038a9ce4d40", - "83129e7f75864fd2bb8d87c0dbce60eabe849396b9d44231e8a3c11cc2148e97", - "7948fd08579b48a285d1a4107633edd7495d97e8a1f8b95faa3fd59ebdec995f", - "9f104f120621ec5f21ef79d2924a403ecfd5ef90b526cc4f2e656fb895275538", - "fcaa8ce0e2b18ac2deeb0159d21b275cd65c2a58bb6d102997a851e97831559d", - "1d9ec12f687cad323bbe0435af9b681c1244cb51027b02997652ce3e9e3dcacb", - "58ac1c7d427e17f72582e9640f13f2605ee4b349e3e7cd8da4d5960e5ab95e0e", - "a218dcea6a8b28da5caf1eeec393e9fc6b2d4ce4ced4296a942fa55a1aec2abd", - "280c1f7c6847278f47a42321eb9d9370e8e9426ebb7bf2e262d3ab9dcf586f06", - "6dc979207e11494afd73277c6704d479125b3079ba5e1c92920ffd4545b91d5e", - "0072f00009f9c56944a166f0e70d2346e5ef75f415ff7a0b60e2d2aa59796707", - "f219fbdc6d003c6719e8ef5ad94a21f12e34a1b67cf0e317d30fb676e75bfb27", - "cc3ed673917187f2f26ea02655883d882b3b59f0826ecd2737fb3327850035dc", - "aacbea762d986b5c8e21d2b7e0e0716c2203bd6dee3018ee080840d11d105931", - "94ad7c5804e3ac8aaca89975a9554298db6b880d9b2f43669c1f6050f586ccf5", - "7cfc3403e7cd5860659998510b0219390390b24f80c0ec0c9df067a50f26c360", - "ae7920972466434529f381230c7f6e8073038853b7a426d2ad7124e080923e9f", - "230b3869397db10ecf82aced52dd1e28459c4d5bfa6540fbb5ce686bd5ed66e4", - "5f871ca33473d7e45dd442234a32386a335cc25977f767a421172d340d99040f", - "b7bb658deefed6383555ba0aae9018dd1094488bbaebfaf89130061c374382a8", - "213cb85d181be5c7258f315656e1f504109fc1a97873f8552889daaca2e884d9", - "f5481f473b1fc0d377abec6183579a322b93333bea38c043ff740dcc8f46acc7", - "57c10c57b589c78ff308d94da2938c79a844efd9f1841472767401adb515a1f9", - "c52ef399b54a49376311f8bfbe76079175c88101a68e5f854e03391f85bbe1bc", - "c7912e995f1405b6f99ea3204594879071be062b50e0190e544cc4beb83a68a6", - "f24edf040ccb75ddaa82f67645a9dc329c0f6c56241bbe39a111cb1d97db4e7d", - "92751e826c957a354ae48b18eb7070c6893585df3916f6e559620182b5ed50a1", - "e4070312728834c0a5746a2daccc22701be24d8fbf27dad0f18b3d15c3a2ffe5", - "f1673d06a1f4d6b79a005346f74634d8bff2eae230539706304d8c2025befc87", - "57d9809c2bb583a6df438dca25bafab349cfee16920d07f34572a6dd462681bc", - "db3ec1d47f9574a527a3110d793263c27f468fca8371882752d16e4180d997b3", - "3c7f9465ad43801d1f572a0c475c02a010304d4494ddc939978c9942060ca053", - "e8ba04eafe1fadc5604926ba7110de7ffc5435015e9d8ee6be1cc1a9e3751434", - "323569f35c8182e607ad6150a103045cd1f29866e60062d2e078bc631f8ac0b8", - "6092dd09821128989829d4e209fee7bbb1511028cabd5394f8b95f2be8ac874c", - "ec6e6d1eda644c8148a7b917edbde6c1ce6f3ff2ff85b22a23587bdcec5fab7e", - "dc4eae9d0893b70971ac7c302d77c71c28a86a77f6350d720a49a76f55639a0c", - "229c10a8e67a9c769c5aae30f786720a39236135c4ddeaaa73f1337266e9a9a2", - "3d2e5363c2e6d88c55548c83d8c41e330803e872eac89243980cb3fdeb97cf57", - "7d57e953101c1b4e8e069d5a04b5cd13231d9ec857b78316d1a411fe94979eb5", - "d9c36c8eba775c54684eb051819b71bed78fe7a4102a02b8842ca2f609e3cf0e", - "c693d01fe363c1f55c01be533a4ec1c852dfe8c074f14916dfbb17e3676e0cb1", - "67ccb2cb3b0e5a00c95307ecbb41da56c8f84c58f9fca00b179e031bd74e5d63", - "a9c19f4eab6ef3e9d6325354018ab70babb119488e7a4be43aaec83c036b0345", - "208906bcfb857fe8dcdfce28357fe48d2346eebf86f466e5f8d6d20838434468", - "aa2280b376e3becf54518b2762229973994dba898f61cb11e4a2f0fc1fd8316f", - "142aee0a9c385f8e6a3bb5c0812cd7803b83f3802d3a18772999702b7dd44c4e", - "93128b835c657bcbe392ed75c1d14c8c8c23465aca31c7b466c8ed6580af14d4", - "22a12542aa0cb83b72ec2a2301ce3368e8af111923669c4377a2a131c8e075df", - "bdcb8c9d56c160ca7a16e1a93ffba07d80e1cdc7a6334487c997d8106ca1e219", - "9c548e86720384f8ee8f1f4dd813631900ceaeb88547d45666e7e5bddc6e9ca7", - "7a59b65eb4adaa7934c442696f64550ff89cf4842487be9c632676261618bb11", - "86a42c38a6a27ddf19044e6836b32f4ff975f8562a87047f9694854339ddb6a3", - "493517559bb0feadc6a4c8b44fc7aa538b7e2f4c8df055d98e05806af339ca08", - "e97277b83459bc89be4d61b2253700faa6cef4c54c217ef1a05d0cedb9a7be24", - "1ecbb581956dd0ccf1d679f304adeb7cd9851adf1bd5bf3fba2e040e86cd8f46", - "1f2fc2589ce475e83b2f104bdfe78d6f05efd240ed9fbc363a62e64d7f110e8c", - "734851e8151a9d270fb0c3900e47de20f024af9b327c58a944daa0417aec053f", - "ff5bf950266bba5f84bf4eda01893d75effd211273dafcf1398d848f76fd7d20", - "5e0e0f8535461f5b575948b14dd10ac98d42c3a188b24ef61e6e688af0cce3bd", - "b7876806b93a6dab7e56e147f6eec2da5fead48fe3e47801cea75106aa8dca42", - "e79d03ab3e44c481e4f008c739877be26240ee19bc4a4aeb330b20ddb1fc635b", - "552dfedef92d35f884396018956db30ecab803a04c3971af75ea396484b66782", - "0b3a74bf58696e932a47cb046677201bd33b24cb91013910519109967592a4a7", - "f18969289de760d95d594e3ff8a2bcfec6db9c3a0bc38eda18a3c67e7054771b", - "7897f04d754b9da80f5f802cdf6046ea463eda25b65b4da63ea0d5bee308194d", - "6b8edccf4547d917cc68a87bcabfb3edeebe96d6515d13e6986ebc819bd92794", - "fb93ba4388a3b04bd67e89fafbc244225c3bfa6da27671665905e2ba46bb0648", - "d7aaa6d3dccd4f4b2f562c42d2e9bb66598451a9206a90a0ef8f428b5177dae7", - "311cfcb891da29829b054e12bc190cc0da33c37723c3b3e994e3ca4e24b53846", - "ff92716c4bafa87fddb056f32e78c01a6c7f0973a620fd51dfb110f6a3e8f883", - "46d82ab460708818653f5ca2e8e8e2bb4ebdbb371ef592c946fef31d45f361fd", - "4209d40fc1f9a71fa471dcea2a4371276e5a99a64730578aaa325f3243261446", - "7b864263942461db4d84df8900fc34e6109cd7cf4f5aa0e8f5e392e2b92cc071", - "3f0d260c5c819943f5e70468106ab60f44fcf018d433d224af3cb9b29f1f20e0", - "39e0cc7d19a4c58490b20ee8de81a1450be384bf673110a7ad2fd617a4d4ca4a", - "2ddb476236ba85973dfb7a8fed3019d981cfb8010f5efd84f7f639ab2fd1f238", - "08689e52983ea7453d4409a2078097bf385fdf39881f94b00405bdf2922d8ee7", - "b32af2a118180613336eb163d55bdb9968696a637f20f578a0baa5e37602d8a0", - "43e75d99b7036683b1ad7dc9f8fc7ba67e36e10118f9eb4bb241c8b4d8eb57f8", - "c81f3b83b752c4ec92e1336688fc8e1171a1b8c750dd105e52a7f4add24458c0", - "4df1c6de00dc9a0a06ff5d5e0a3c57027a9c6ce902a81bc9b77bc715524d833b", - "68b7362f92a431df064c139dde88348f43059eeb33b9535c0558b64673faac55", - "77a24d6015a06f2225829fa49d0c37922c9fa8b105754ec0cdc8d7adec76a525", - "d32a5cb16c0545484d9c9458dadf6c096eb9395e382566ec949b4a66b85a698a", - "d10bc2702d608d3dec788fcc3e8eeee1e83b8bc97f3118e992055a27b03d08c3", - "4b5179065ff486ad90a45640e129f7e75068791ca88e558c90c9c5794594dc24", - "6c27ff45441d146b77bba5f3f669e0b3f7e29c3b3077afa95c5539121b2fcd0d", - "21dd8a1e46dc41e86a82a4dd37cdc12576ade8e809fe395b8f978283aa61ee98", - "a5db72e1419d4add32f39d561b059c808ab1e675cc9412120b022c8c5fa95dc5", - "f44ee95889d7ca59b637d6ebe38078c50f97fcdc58cceee887423e1f274f4716", - "2e83bb9dc505bdfb90cbb53d4b7b5f240602eb8f8acf036c6c80bd7af4ea9921", - "a2637938e8af3781c52a8383d9c0d02bf092996f42512f6b83af3fc92320b5ff", - "153b370b9877b902e999b1cef48e26c5330e84a53821fe379ae55ac3b574a066", - "d1564b3c0c5851b1f67601b56b7d9a793bbc5254392029d059448dbb7d99508b", - "1499a00a3ab95f00f329f18113b36a1a1d9de5f010775ef860081b50af9c1102", - "2eb08a5abb75e6c0e6e53e203b9a8e37ea57923a245ea521b3bf71cd64724b3c", - "8c08292c92737634eab567a750c4f8cd2eda0c8b19f5c8ddfa9e3a0b8d381d02", - "e4087018105baa5ecec05271b114eef7b2c66e393721e2ef51f9a005534f33d9", - "3dc06a5aff75730e4b7112652f1dd719f3e45ec4103651b946180bbde27f36fd", - "3f6d18fd7111b608b8191442ec0a72a1e3617bb7bdaafd8da7cd5e90b85180da", - "5263205ec85f1ba825f34a66a63e42e65b2376ef07417391cade99e41cc44836", - "35c74e3375fe29de9753e1637da51be5b0aa5e017abf34c13853064b9130fec2", - "ca417aafe659325344b1bf42c3427ecf8fbcb9bcff2c6d9ccd846566f7b183c9", - "03de28dd442f7d6b289b894bcf7e8c3244c65d966ea198916450770e20a44a12", - "9cd07d77ccc681264d2f0923b789b77a2d1500ef0db6ce8208d96cff6bd427d9", - "61aacff82c53ef76249cced6b1d06f35ee48ebf9aa65354d6733dcece829a1e0", - "f8062172d673318d534d121486771328a6ad34ce6664934eafcb8f9a886996da", - "2e8ba514c9846489eee5a0a6d1fa6c0a23f7e4cbe0afaff24bcd67c35f654df9", - "53023721463c7f21cfde40186a5c88fbe634492d1a4684acfa2a95d7af8d668e", - "9a20b06facf1339c029b92bf8e56727bbb29a3bc056738a801aa3b2dca326580", - "062554364f6987b251562b6a342f371ee65a1452651684d6692fdfbed00584e9", - "f9da3a1531c7a23ba7f1046e8bd47a973b8223594d4382b4ce0d5e9de23a5686", - "c2411bfded86ee2bd0cece753610fed8040d7c1274b65fc9cddc0d48695fc97d", - "80520007f19dde382f924139a76102065637df3ec3c8fb6fadb6d0f306a053b3", - "f2dfbd9561a5697341c2e8412dc9b1e159b03be8ea38bc8bf307b94e88f66ee5", - "f39b70532e2512cf153da4d273b66b2e47a2642604c008c45e50f36fb6146eea", - "aea43c7f261f4feea3aa1355f64e67dbb8c773a7338aba684266b9d7459dd926", - "4f38b519bd5d3f7492c6b503179e45048902bda2ac76be0cd05b78a2ef20c945", - "2a4000d99ed7ce1ce14f1430aab44bda54c9f9e7f0135d05bb51302c4decef52", - "12b69087751b251403b6ca29af77a466bb380c5399c3e454efdde858cffa74c1", - "f03bffbed7ab510999830d6d01573257c96ffc553f8773fc1c49efb7e82989c3", - "68ccc3dc203bb8aad8066e7cb342ebd5dacfc5f4b8b3aedc442cecc0ecef488e", - "cec0f3bc4926e11ed42a634e80e3eab1f95a4e6e6f12d344b2057b05852228e5", - "433999dcd5e2f986411e0a179c55569c44326edc4092d2af4b180fc078a35e0c", - "c6d79ab4934af3f43f2339d8d2806fac4fd5a8e512cbb6d3c65ecc668a24f327", - "3405bfa19b35f7b031f7fb8e63335e8b3230630f77866961aada8475400032ad", - "640b115a7b6417de79b2b18d4c4776cf3ffdf5b6e9635abe4a9f9e76b92e7407", - "94a0a0d453701745e617aca2ae33320748d8155d747d92f238f9513bddc00bf3", - "d92f674d401e5bc6dfec8ec4039b25b45debb386ab4c22a2406eaf211179ddb8", - "1eca7916e8f626307e3a169ea5fac152b2a6c2421be9c52b4a4687dbc02b5262", - "a72656ed0ccbc4abedfede6320551ce261d0ab47e9c57e3b6271db08f7efedd9", - "807bf0f774f71bd4e8922a94954d01934a13b084818c74a09f175931eae25e90", - "bcde508ebc6caae84f2ae97f915f0d1f02f2c7e5bdd10abe94dca0a8b8bfd202", - "36b493975501d88469c348f6382def2cbfa7d419ecb5e20f01cbe72bc7c08748", - "33bf00366157ffe00ebd78d454bcf50084339a2466dc400235f72905f20509af", - "d91be2e0dd0b0f834a6fa745f1a3b2e1538bfead4c788e35617c27bc3bc0f757", - "57beca528122e1e78952e6a8f5890c0bbf8dfd6ac902f82457f843a232eae4ce", - "cb504f80b0030a7fe691941c7c875c6f7084a38befc51b785ebf564f3173b7f2", - "42412ef3b0c0427dcbc60348688fc2997ec75b8a5f01a4881979ed7066f6eb7b", - "e2110cb2d034c6f48000672b6a383b2dfe67b50489f0bcb0623aab3f123f3908", - "0dd9dc0812e491c60e2ec2814558544e429f7c9211fc2f9a4bc01ad03ac28d61", - "ce95bb10b46dcad16ab777c6057263c8aa68e01aabf2cbb5e7466c364e856a3e", - "d1e13afbfb2e4b1c5d365e224ada11a7378c4e249b2e30c4d2db1439c33bfe92", - "627fb2a0176dce9cb425324909c0ef663009166f249f9594d6c9d1f32bf5865a", - "61835c995a45baa4d72d95337748d5cd06d5669d5549f2f26d8f45ca0ec71e0e", - "5acd798dde5458487a44fc07a1eb898372e1de035216c0e5cbf83f866897f9d2", - "0535ef1da3f0cbfc027df0a41a4352652282d07da68761038757d4a1d3f13bd3", - "bf86c810a8260a09b152f3e22ee7440aef14bd5c0d9540e1918e0333d9461be4", - "2d8d2191489fa95f3e7517697338c1684a63c71682dd0f76e7b7b2366ec22f4f", - "a20712e5be76071a925f9cb5bb4daf3215b9ded020a6f03811e723e969a39fc5", - "c77d8f72f8d38e8c84d5ece0f66a4c3e194a947ff7ece62780fc421a0bb50585", - "b7b3383266fecb71e574d0e4891ff61fa06b8cf23b91a3821f0ffd58d4c6902c", - "dc885e4641c1728f27c04714e97cca9e61e9ebbd0b34644f5ab4e708df78ee3c", - "46752f1726ea583f946d22937f498e0304e86f41d164b0f82113c2fdeebf3e23", - "2660dd43baccda5a6a0a73f7ed242c2b1d055a7da8ad41ec26f8b07c4cca05e3", - "a10ea11a4b82613d88dac7c159cedeeccac2043963ce8926755167da15ce284c", - "0302f363e6b75e5e56788fdd211826939093e9162057540ff1f079a5817b576e", - "ef9b09dff66c93c01b28f70057ef7a9a3e5dc20700ba38a126f601343d32d063", - "59793dc9c4cd70ae780c3a3b8cbfa493292d6fab37fdb852fb9b21c90c8efc2d", - "74692fc160efee521b719fb6b6401e14e2ffe717f75fadc9e945c37deac4d27d", - "07e201a511ed83dd5dd37ffe60a33651b91922d2ff887204393a144881aeefea", - "0ca23a2aee26219b344d6910174abadc0627019bbf3ec1fc9093f3c0323b82f2", - "1cc699e0c3ac8e98aad0e9c2c475a0f71158a51517c352785a5f6aa875cefddc", - "ccb634a5d034c5429becfeb1dcc23a20a3c72a29c92fd825029d6633566cf743", - "45f1909e1b66c417634400c4a96a440fda717a25e687c4fcf3c0a64623f04fdc", - "8a55768dc89ffa8ab4520b9f0780989e9752d247063bf4f53d3eeea55e9caf99", - "da2453cdfcc0cc07754d7859c4c7cb79524850b8ded99ec08e8038003507c626", - "adacf62dc88754c4cbe41aab25a7ee56d59635d4578de6929a61f294611b80d3", - "df13c157542401ad66654b1e8343ffba8d70e07930a8e84d6504b1aa0cefc082", - "c1464d0a4051c9c931dbbff6f96d6f0865e364be9c28dd29eca70526c1d5497f", - "c1e11d15617092ce5f5ef33ef1c649bb7bb19f2b372152f8474d5a0f2ce000ef", - "8ac086664d6b877354072ab995f3e122c3247ccd964f267cef98427db8c00158", - "862a8c391d5177425489a31c8c39692fe62d6b8f3cb292406e9fea8b2808f067", - "9fc2c8a240d0daa3704514d5ae7aa43f9107484e2510cec29817b411987ca466", - "42a9738adede4ac2fef3809272a2565a371783900a9f48ec8d872eff205f59d0", - "77cd0b1e59be50dfaf0b18323e319f26f83e6fa6b3141b351486ef9bd205319c", - "12500a0017e6ee8d81efa46778e688a488e8ffc5039495a0dd4c68b5deceba66", - "94c1abbc073d9b9956338e6a218f99ff1cf76c0b289ab09e8e09896f2ebceb15", - "d3504f2b59e5d009407d0a0d263e84a47957faa41600d1ecd80ae68b929a9cc8", - "dd05da069f3f8aafa6d5fbeec3b4463e61958a52b3049ca35bf6f605195f7cfe", - "296a7ea720c4b7b6cc6e4d23f6582e21197cc01b42b55dacbd6dcbd0e69f4f5e", - "9c15811788127396a382966eafe9016d9b82b8a87689f66a3fe7aa20ec83ec1a", - "3770c8b6a24c6525448bb11b23f6089c94954a77d91502b5d15054bbbd04f104", - "5da54357b351d8f75d6763861451b9eb2171c2a203869a6337032d25ac97b128", - "6868e617982b84e94de0813ce011060c552f1b1c887bcb9853ae1f8fc944c17a", - "622a510c0848af4320487ed943fa036f9822809e85689ef9d5c823bcd12ee6df", - "399860a8299566e855284ca9bfaa2cd2684df3bda681d98366c2c95954c6bb56", - "a6f9c183ae17ce925a9bcc0af44d3fa8a401cb1770e7c64282561e18298ce09a", - "a404a70802fbe17802393da31ed8cbed5afeb671922abb6521591aa530f63b1f", - "b12b234129f22c580c52c31f670f5965388dd51690c193b67a5cb7e208198ee3", - "f86cdb177b00f8c2025c5dd492aa9f5d544ef6325b23ecddab852dc3ca6b0345", - "be7386cd80f7bf6e137a06bcbc223d9e60715d4709a6b9d1b2a82e9361154b5b", - "4f73c315e3d1c8ed470df6a5f3cbf8c10ad6d82c1a964a8051a7e52e1c3c8516", - "205bbaed4c1759fb0a51ef06ecc4bca9f81aa741e5e0cf94085ad5f5d1ff12d0", - "80e8f4ddfed7cac2faa7f21ee792a1794a1988736966dba574de2ef37080b00b", - "32163e8436adc961630239b70de263b11685148d85c019bf5e6da0360e355870", - "82cc7df3ae702ea0b4c0667c2388aef4d245f39019d0e573bdb18a1962b52a86", - "471e5fa2c8b64e3ecf5c618de7a265f68eefe3767864c1abd0582827ab56d63f", - "e0b15c9f34952572771d37a8c30827f873defb896ef1ea06a97e4857698bb879", - "c71600dd3a3d6b1c8f04940d2987004f40a4541cdbd84f7ab63f8d0ec8b5d492", - "5cbf062ae9e62ad9aa49c2544fbe5197e5cfa42bdf3d28781f518b293cdb99a4", - "bfecb8c055b7f2295b6ac5f911157c46542ac444283728a4f9c729c8532a82fb", - "155198d42d6e255ddee3afd32a08743254173dc00b18be0891630af386308137", - "0d838b8dde6d88928949250921824c4890732eac8c6244bf538039c32f5ea4c3", - "a62821757c08709b9e7cbb45147ec8fe00de57a0e0b47eef0ad6397bb67915b8", - "7d32832c54b829e2dec50603bc4053b14562eec5786a8ca25e24ebb4d38ad872", - "ee5a8701d1fd74abd8ee7ea6195c223ab5f3b72a20974cfe175ca3e69adde26e", - "baa2f646c244a04c95cc2cfaaf4729f09c624cdac7b91d8311437b613c9b3508", - "f13ea4288dfca91d6cafd79d49b6e3cdea6dd58a1862f4edbf25f494090a9ad3", - "670ed9506cd8b745a24b1cb1b6f5e95ad8cc2636be858bcc1becc6a97a52d05b", - "75afbfdc9da08d585a9a98ac04264e93f37f356061db6f5d1e14e879c48fd163", - "e9615cf95d262e89b363d381541f4b06a12e73479a4612cf99c7dbe25d5b3b7b", - "f0934d915d910f2d43f7ca2debfd6e7420f282aca74c11afc61439e0976cbcd4", - "cc000f0d8bb39deeb267c0414def1c6ac9799e4216be93e11a607c5d9aea0647", - "1e7137b087960a4e6bff7735fd4a59125a0a07f653dec03982c49e1c1d75e027", - "6b10150daa101092b1a9c5b76e8b86986d1e1f2b4a5b02524610f69d367a7027", - "1dc35879bf43a9b5b538b26a9496598a41589088ea8d42f844f0026c9a8596af", - "a33438fc6ebd6f913f465faf9d4513ffaee1e196229668072f07e584e79be1c6", - "ef4c612f36f1098752098e96c958a8a937faee6a74638a0bb5619400d88f61da", - "375ecda20a1fa8da51a7477dab47eb872a3137dfe3a2e0454f01cb53497d6a98", - "50f52d1c72aecf3d7a59b35666611a943622ecfda9160cf6cced5ac518cba39c", - "c3c3b627437aafa6c97b6c9c08a8878cabe2ee3b50bef61587ab79cc37198e42", - "bf927d53459875f40a847afa0c64af34d575ed3646800f45658aefb64a28cf54", - "b6298d84bd980438968a020148e129ea9e451969901d0cf7ae5b6ffdda89c235", - "937be9b1524db70c58abb1ffa150b6dc3df13522ccd0d22f2c7b7128a76af640", - "a97872f03bdaaf95305d3f51ecef03099f763e4c6bbc857c6a56aa2b9a4243c3", - "2a836dcf0774a7b7c0ad6aa2102a4435ba7f83c3bc72baa32640a148a3da0520", - "a9021a3391d1e5fa57f0ff3e37049cd97c444393d69f1b958378c7cc8e2531cc", - "98fde92e314df245f2d6a32eadf0945a04e8911960bf2c532a76a10a69d259a8", - "6f278b2fdfd70dee72732dd9133a5f01d597682a52c0eab74dd7c1ef92ad263f", - "283a9e7a9b335a9f867082f797d84add431cd01f5fad7f8178ed2511c8971aa6", - "263fae2909cce0946f5e38b1e1c7010cfce8fba1c75d87ab3ed96d34838c425f", - "74c8c4de6736c4458760739826ee6820fe499c2f6aad06decb0fda64bf39b362", - "778ec380cf97057b8369c32b869bd673bd2b69da55e0531b3c1d38294f3eb460", - "74bba063f028c78746264f05acc3b07f59c88adc09d3f17b5a23347dadc8575d", - "5007732b2a4d8ee917e4649002e14154bc8f905a69176d044adc11f1855aa0e0", - "453b10c2e9a8d475b774cd63e2410cff1f7f949352347e4c405f72245fe987c5", - "31404dfbe3492883ea02c89b6d09fd17c51ac55252ed2dd9f89db36506851ed2", - "f3fb46928ca4b87bd7a8de6eab7cceedad6274763f2602490b33740be1482647", - "66f3db7e51abe9fbf2ac4eef6c022d59528bd3667c86eff06f98d41ef524f450", - "09610f851691e3ccf8de6c594260bb1db9cca1f14d278efaa509c0a6943ad70b", - "63496473a81286e252f207d65ceba5283900e6c7cc1209a8cec7ec592852d73e", - "420e69a37dee2bcf2d159aa20f5fb27551ab5f65d56e0b74eb6e74897ed4237e", - "9bb12d6c2d403bfcda7eb879df1a82631661b62469099e0612a2ab49e5284037", - "3dcb6155945db09af138824aa1ff5e5e4ebc560c7af4360f77dd77e36289e148", - "04b8ed1405b35252b109928fcc4d4fb557cb4e432356ff0938d420c868eb81e9", - "749e973c11d76826bb84ce42b3d87f7201d3356c547b288e5d1917299d4eab45", - "9ff488e983d53599b65c5ad6ac265c2d12d02dbc364ae59a63fc6b8dad637e8a", - "aafa5cd6ba259a86865dcdb3a22bf1b97c611d40d10f37679a95de09bfbb3aaa", - "03e52bb73ffaf0651c61e183ab3134b9b53a6574f2897d152ba014a487107932", - "339ef2bb93113b38e3e7098639f8bf29cc68d315d9cba64c93424b0e6a8e695c", - "4f0b750a3f6f6d3372237c565396a0d0114496e9bf0fe3492e747a9caa82b4e2", - "712028a546c71c27968e9dc6c8bb6075de9e942811523ee710b4d8b6e1262834", - "a8933576e64f52486cd635baf0eb1cea2a4e5e5f8c8bc2f76269f09647b89486", - "e8112de518018e675932cf50afdf25928f953d80b780fedc3d262eb2c1cd02cc", - "169805ba740bae5f2427e1e567e9214257edb8a5c6259f22ecd76a2f218c9942", - "b822490bc12ca7d14660ac57684f14fa6ddcea1e5905b01e230ee281b9cb091c", - "949e50dadda59323e2c232ec5c8248ead60484db8ba5ded5907cdb955e25b9df", - "d8e723c48f0a13060dc83ec80b7bd07cbe3fc25941d85fea977d37fb31fde44d", - "bbf7c4031b39245d478e4f2078d851a940d69c9f9c0c4348f03561ebd882cfb3", - "8dd6a4707a232e51d67fc1acd6892206e7fae2b72bd01dd83a1e5633b23dab1d", - "ae8cc21ddfa6f336431f1770c2b126d2014172b8a5e8bca95c1f7b2279883ce3", - "ab47f329b73295b505865d49d86917eb38cf1d94d4b2a906f7c119d35c7d3eeb", - "db538b33a8e75435013775fd638bf9491106568e87bf648b6e5607eb2f016023", - "206db499fcf5009e489bb1027dbd148f2d63dfe334db3bf9840aa5e194114a59", - "0f21cbbdc94af30b81611c793dbdbb9d9ac7086eea79a98ed32535dc418b0f37", - "148be0a8c12c1e5f883c381087de259e6503b90215093a34efcb260558cc1090", - "52f6206b3fc5a11835e1a3a31de8ec69fa188e07eebd7a8e432bef9ccf179244", - "5776bfb7ef8b29c10a50a7822545dec4cbccade15c54f2fe0dd7973bba8fa1c8", - "354c62ae332da694b9f1fbb51b3d207a640323645eb8cdee9311697702d98751", - "000ae54483a47d54e1b089bf5bb1f90cec00007df32faa7817a5f0eed4c4a0c3", - "da2ff500229654c990c523f1ddb2a71cbafc8cd5b4a5d0d1a3ad88c0086cc992", - "98f29a159690c7c500da2e650b4c70ed946390fb88e5ded7e41f38f613284e2d", - "9c07055ea58020c86878921ea7b36ac5648fa31a54420a27ff652ba6d71730d8", - "6ea3775ac0c5a18a7d58e76158ab35eaea3de16d59997435d5e2ed04ca2ffdb7", - "c1e473d6e574a75f216bafa09d6741b6c9d250bbea991fa6710dcc4a0d21a9bc", - "918113320e59a1695bcb6d1628acad5f1ea8f81d93572a27ffd46a8af4b41f13", - "306f4a7152d848b8547b87e21d23065328ae73ee075b5db15b2e924e5e1bb55c", - "fd7fbe8e810bdd63c09cf83b34baa0a828bba8f2ea1aaf5ee6c90de16da25162", - "5c9f5e6cff1be38a6ba73ad665a989fc1416a9b5aaba05f5d817115d10a1fef1", - "5e683474d1c8bb5d4f6ee97d3abdd7b5a9a576a988b14ead2793e2e8d4eed7cd", - "57c890e2556e688e9cfaa6d35eb6131f62472ba8abbbb23c7fadff705ffadd10", - "658b291f29d4ac72ee2817c9019af744939522f248930839e02ad688f9409fe5", - "036e729d89105350ffd1983966695194bdf8c80e4dfd220a3941b48cbe1b2d5e", - "89867ff702c3e471c5a8e5826008b0082ace674da2948e3e4aa6dd33917e314e", - "9fcccf81c3b2006660bb4474c40d74af9a36963f00b6cabd678a186351aa6e69", - "d1f47ff8c844c9dff46a64d7e19608925e3631b212a3d9bfd1709a561e2d7b19", - "4ede3000eff01b4ac020420aef0a6fcf0ad95e011340dec74f0be7224666f352", - "b774e06da58a82a358327b8f1f3504fd04330c00913087bc5682734ef4ff53f0", - "c2fcfa18cda889769c0b8b20db6d3f7a2177d50790624c190ef4b95ac822e8df", - "9b0d1d670fff6bdd00c4f81b448430b8dbd96de845bf78a94f2085c578784b81", - "ca4ec28ad7f9ed0d582ffdb768e79dca9645f8848b6a733323c6bd50b34a46ac", - "522bd22794b908ef32b4d5573da7d75913524814de425d706c1ea4dfcef414ac", - "e268c79c6506e09dbba423eb6cd65af631b0a3256e7abc3f48c51c3a3bd93d2b", - "357dbe782e295e37e8cb66e82ae1bda442dd1d19c274c816a39d1a7fab6c9409", - "6e13ff582f22247cdb660f330edd6642036149fb7898c0db39dfb8ee6eb5988d", - "e11bb55a3afcbebbd7c73fd9ad485d9e0fd627817aa43f14e9d4bf144bd9d607", - "0928749103aaff5280df847666405405fcb9e2dd9f010995f371115313ff2bc0", - "c970fc7c778f18d5c0bc582cc076e866278642d8538bb26e195ae91ceade0791", - "8dc61f38fcf72b2e1db079794eb518c04de3a8dcdfea3a9b3ea9b853a08a7401", - "f8c427026471e5e45911e6ac6ba56712f4add2a83ee32fab2bf23f4ad819e77a", - "cd7d0384e02b8abf60e8931d1fa572044d2174272d9e65b3d9fa1e01d74be88b", - "eb8b94ad35211efd1dadc8913804750ac87abca8c26beac7696c7f928706d3ec", - "f1f7ef6d2d82df414dd79af1107792905903f622e693d07cfde81c91baad0931", - "03660a8fa6ed18d9843bbed8ce646a56f06ba5f920b3ab1e0f50d169206c98e3", - "e5723014bef2b1a48652e709081b4c9e2fe398c7b98c76656861818a933598c7", - "9c5cef32d139a9f1a56a7c16d508a8a3cb52d53ba46ea62fefad5ace4aec7191", - "3cae88c7889f74752f65cd5c66c03a1dd8e7214b6f00cb725a5e6527c63bd71b", - "52f7fc77c5654a4c3a33aed4502c264687218513f1fdedf61b0a0979033dc052", - "4c66a5faafb1e463aa0919df51fd0334554ce3f694b9dc7f9fa48ec1af871c5a", - "6b2f4c61992180067edcd710248a9fb47b088e963e65bbd0d3cd08b1b191b2aa", - "01550f4b2131a5029b173277d39c30ccc259fa51cfee2f26e2707f46fd3a14d3", - "52beeb98a334f76e2d8fb4b84d7a626fbe3918b763c3face3da850b7f7397265", - "8237d5e0b95418182eebd1986b20185072f1b5ce56608c93e5a4a51b910039f9", - "b69a08e047013682554cf279ea1293175cfac401ad96e446c13b6ec4266b6786", - "d90bb1f6ad4bf5c192392aca1173302a5b0fc80d062885524e59332835321119", - "eec06739a3f99f96321c16af764d7cefb82ffa6f6a0eae39f9740f6f94328cee", - "226a6cbd96a33d614b62b53c9a5bdaae518c2425846fdce224d21c8ae2b29bde", - "57a04f7abef18478b1bdf685ee4e767e768fd0fed33ae4f56f9ece7817abad2d", - "ef21d8eddb81c9cd91f4e076b19471fd23168438e381269fd12a941718349061", - "d6eeada153e1533904dabd1196de73d9e97e26c2f376377a4d7e50f2d3d4d19b", - "1088f91de3ffdc0a407f3c9e785bff5a5663b61e661a9f5212df67a5cda28630", - "c25d6abf2c742838bf7edb469a84e12f8087ce627a50a206b3ad85c76ca11695", - "891629b3765f2ec037ab066e2a4cf4035f02c6f3b97aca7ab42f55d3b9afc7f2", - "9964d4f5d0b1f4bc4770094ec1718b7a0c3cba7e6e42dc0088dc6ff426dadba5", - "622c48897b83f47b10b7657a907f67f6bb902f5ea75396d6b6ab1fc649a92405", - "a5ab0a8e3a39e65e5f75da01b6e3a6b5b1532790f5bdfed63543599022c15165", - "b2ab33cb1955718888bf12f656ef756320e3ded852fa5011ece572eca0cc6e69", - "18d18ad23f7df2f128bbd8660edb14a33e4360a63c306b8df4573ddba4f32759", - "3c3733e2449bcea2faadd03bf187db18b3332de8dbd3529767cde48ed94758f2", - "452e8fd4c8884109e2d9598b5a27ba382d30ab2ea5a169f16498bfe0e88db713", - "6978a4e35d4601ee268179f4e93d2cc559de2bb4eefa424b63c5081cc3f017a9", - "dd0c3a6290cf659a51048537285bd9d08f2662a6de9deabd105fd110c3b08942", - "38898358aeca2cce8cc0dc755e7051bb71bd1d4ee38bfa24d0e1e5251c4717bd", - "db7a527815fe9f77c8e589b648d2d18c3cbbd5bac5904f901da1fb3b6f0190f6", - "eeaccc80f84e01fe461717a35fdaade400d9e820ee248b4406454ce7987b7027", - "8ef37bb1339b843313921a25b7df79f47739e59c6416315f1250b5d5728eda16", - "d622ac0b2e97c963dee0ea8e23eedc27c02ad4336354ae58543a86740fe53f7a", - "d7a30e988a48823417ba18cf807aa15b007cb69e52eb0f354c04d650b83c040e", - "73de617dd5330e06ec8751ba5ff8e075e1c257972428b1771ae8cd7031b3db58", - "d7a496e5c3dddfc197439eb762e3a4b3702ac206d76e66ef8f914447489a4f2c", - "d59dd19b71971fa88f1d3e263ea7a758dc6b7811d14105f04ce9afb2181e5822", - "a1a7624dc237f2ac0ca85622e0fad51a169611be66bda9bb4ad40de11093cb9a", - "a5f249ea9d091ed298871714d6685c8d0506c7a272f8ccfe78adc6e9471ab147", - "4176fdd36b0d821cb1d7ef5d473e7eee155c8acb42162ad6c4d10ded455077b1", - "b7eeecc46967d45109401e884b78ae48e46039082ea76a8cab41fdb74d8aa6a4", - "0c5fbaca8dd160b1004ed16fad393921324ed34a5fa8e57c3a8ec70b5f08ffc2", - "10d0d12121ff1f104422a66d89e6e8648fb45a1353c5dc3cd5afca91fed880d0", - "8eb0a710e973be12ceb18e7e9b1f530f3fa189d7d8abca64e0a703bf537650a1", - "55e86f6a208b94b2178ffc58b74b18481d7e888121e69cb3f125e1c8d473fc1f", - "92d31d0c16108ebe5a2d2b6ce44bf42a8021c5817c2c96d196b15adbd3871c87", - "35562ab893c716c24b5057ff566c8408ee9d9f7aea1bdaac562875edb5940d88", - "5d02f3514a25e97ca2dd89bc9ff6074e8b03b15836729f426309f502806b6a8b", - "76b14a118160e6f7b05ba09cac4ccc1297780f7d5f94131d90fac40df4317b5d", - "6ade99ae5514264aca69d8ae93495d16539a8dfef901ce694b35d230bda28b8c", - "4449ced0b0c5ec7a86d70f183a24728e57a1bb2d3d05f2807e5f2d05f3420337", - "70f8549683d9a70da744dcbb02e21aa1bd7b97aae7149b2bec8d07a097f4e059", - "8dbeea728df804c35dc9bf009818a32aea0079c4184e816e3bf866d60f987ce4", - "aff327772298f1f32262a472c02737dab63cb17337cbe5df0dc00edd43089493", - "a5d46b9d0ed40cd825c9aa7fed47cabc248171a33c2c1d190dfe4c9232349930", - "b476c0e4d8b5e6b18334ee1c725d1994f3ba48017213b2421106ab9c26d023de", - "3b6ee19d6c06bfb58377aa325889a41f788f47af124bca156d1a4ee09945dd82", - "1144ff9d8cffb49ebbabebfdda6298846e43dd54de5a875fae80979a254930eb", - "a109d56b2427f577cd8a32c72860e664b9a5599167236aa556573798df219826", - "5c82f09fd21cc0d85d92942bd3d3c2ef930185e0c3581054417d5503ef3bc244", - "a1155b3c4e0cb9575cb7811ce2fbde8308322f752bf0b3ea197a44296a792069", - "628e2a2053abba9ffde2373b37d82d36bd60b9bfd502d0877fd80563ee837542", - "63ec90262421af37da64c7cb62f637ca9c186c531ba8736410425089e9b500d7", - "f7260218dd188d857efd46c19ebc83758a2b5ff81f6bf4a8b6005492819e5b0f", - "b31d46161e940722f9a628db4350a69772fc098d024ad9646b53ea1257b5473e", - "0b4d437c2cce79b39985805f40ca121b180eec67fdfb05365b3177d21ebfd555", - "6e880d51f2e939fef623a962683579bbc67fb514f3ba247a4c3efbc28eece37a", - "23b0d3ebef28eadeaa02798510f36a8c8b6664045a807b4b526b4ec047dee5d2", - "7fdf85c98c43c11fa6ab083fb4196ca768ec3fc912bb9335a631ec9661cc376a", - "653d032e22eb9545d6f35178c4da48a4cb75c3a55533c545796089322dc5ec20", - "5e83667f1f51ccccc0f26abc528135e337481580d48d9d33464d4c04a8e73b87", - "fa73a4f498d7706596f1ad1b784d9b8cb1aa3981d6697fcd1e35571f6de9400c", - "920c2b2bbeb68b8d6c8988db084cb70c9f99a23fd1a0e23ac43666556308e632", - "114103405931af4f76497bfe43496ecb00977b6f15e9d22345de1758b93cf855", - "548dc6d143cb20a42b31f1921390178a34d17ecedae9f595dd0f310d271aee46", - "9457d9f6145393f342a666a198bc9ec13ae131e03262f72024e65a28e6c8de5b", - "7a46de2386495f9a2bd7f6ce6bfea204aec6473e16de8f1bef867623a849fe84", - "356f9eb4bcf7de3243744bea2ee97ec29ddafbefd8af1aa3a37390f03f058d96", - "15d937f994967c3687ced7b27b72f0c180a22dfa1ed546e9da1533f58c398cc1", - "b4f69b09d7650ec99dfe814c3214fff2056d7486ab16d0516b5b6a1ebc0cd168", - "83bc6818e4cd8934c281abd477a75ea1026475903bfa05962925c084c0941aa3", - "3fdbc3c42f4d9fe7ca91781ad4301c9ba093a04c8dd32bddf481c506b0a72e6b", - "a30d1beda54c09cca761999bc8a9e40243c5bb0c21eea5a1b38cb01f7227bb8e", - "20a8ce7a002115fd2ee414d485d509a10933c25ad0fa2f3fff72bacf00abb4a0", - "c63b2087283ed38b38361551e5baaf680a5f651dc6a20e7049c2415ba7bb6f52", - "499fd84a6aed2fb534632bd0840e53a54c73f5684ab22df9c8dc9d919c31f698", - "64ed012c591eb0979156e6b322c3f52e56d0022e1d9cb09e9e737f23d6355822", - "57d3f3ee4581c37c99bfb77b2ee21a473aa9ee7f23226667bb3ca2a01b758487", - "65e0c2b6308bb43a86cccda4905dfe9bf949727831ece1ce3985cb7e05e8a901", - "768e22a7225cb313728c5937fa042942e53d6a971ce97549ed8e3c4c907bec02", - "4d9b9ce2ce343f6e66ffcf8014850641372396a0e816aeb6c89859762cd82cbf", - "17a07960b647b63af6822a8754fb69b4821d385a9b122d50c752dadd69770254", - "037449394e8715dfb06b728698520295f43ccf8cde680a019cf96d03ecbcf497", - "1ce3ebad45e17b61a98b98f75ca31735c141d4d040ca006b75810ca0ed483ac6", - "c2f3948f6c71ae279730aede8384c040a78a5dc04a5cc2a8febe3edd2e578816", - "572c296711f7b77d054db850a93e7d7da3848ae08900a54cfa8ed59c2e5a6713", - "4d131fb3f320f34770c97116e71726e0b52325a6f0ace642dd8670656158f40b", - "8e7c5200b4d9e1b467599c3214f69bd1b4030b71d77262e985dcc4eb56401835", - "54d1d6d107c8dc13b907f2052a74c5330d8cae8c4f5005685292d720e4d6d6c3", - "d35523deee0b1be260d772e7f31cbd822f2952e2f7d1c2b3eb7cce4629d77941", - "79643b22c4936c75d8b685d0dd305db6baf509ddd28d192a658eafce55d5dfb0", - "2cf3db60e25b183f8c94fb3e6d6c678786fb3e4da051368afa525e7f069cf1e5", - "7f3fdbd67794feab5777f8ac613d9ee0a3972fd3e5bebb595134a6b923e8a2e4", - "0fe50a858501181a004a6df3751b8b188ccc6e5f95270d6b8dff1da14250bcdb", - "e04bc6e1d7bfbd0cfbc15064fb9d2b79563c513bb2cb5c13d4864b085535a3da", - "1cef79b3da2ed6a3b6fc2122dc1f5ffbcce8e5c6f9e3bec731f3c57acf7dd5b2", - "b2e5e2f47076a1143f76f9f4f93881d12045197dc3f76a748a3363a6b6fdad30", - "080b8cbef93b4d1c74f706b166aea48b5aee3cd7e18c5d14d43e6c64369009d5", - "4f34d86fcf7a54cc70406d937a65471594ca24a4994c51e412fe22b4edca4fe1", - "8bde7d4a02298ae034bbce64908ed83afb1b009fa83ec46e3e20ef161b2b8872", - "1c7bcb52de27c173a86ec4b9905b1ee1b21e8dbd3726b2751b995106e2dda108", - "ae6ae9a20bacba827bd202d4e17489024f94cbf431c94fdb8de9827d7fe4b644", - "bc66bd442b3b065700b6cd7b4ad7e01984e4ad6bbfab1dd3e0912203a5c0e3ef", - "bbb440fa7fc6b9860bdfd529e6e049fcd6a9cc33fdd7bf508dbac729dc9452a2", - "453fde3b912795342cbc0148041767b4c32251b780e9786e66e82997345893f7", - "9fd4e616d95930f6920f2937162fd9dd1388c62e5a18e513fde202c13619d07d", - "2446ea2b65c95179637c7392afee51e23d5d74c05ab43124b2a7a8a594c4f494", - "3ce746f947a219d22d0d79272bb98cc93c3eb3282adfb2bb0fa7e6df8afc1efc", - "76efed8ce004d59d97f68a9678a68f49ff832bfc1fce16faff673f92b6b98ea8", - "21fc4f15d901dac1f5d0e0cf86bff1d24c31d74dfb9b40970d941aea9539bf9a", - "97a86a8327ba99f4b8c720b33c05e4f6afa6a32b9320aee7b840a6212e7d171b", - "fae0625817030ec11d70a3fd358cd38f2a5777835791513fe21d400082b9378f", - "389ec5e075569604b29aac379e9a8e213269588d7b63421fcb1f68efc227c7f7", - "cac968951df8184997c444d4bea8d4841b5a7ef2dc1a3caff4b5a417c5ceb40a", - "1850a4bc3ba6610a043ffc0476c54bef8e5a0ff751021957d5ad96958e87c75d", - "b98af01ced9da10d4e987d54df84c0d8a9c3007a6204ec6ad277c55bb10cb63b", - "320aeadcbc687fa8f0a7f3b8a27d83033042ef6a9feae09e2ea6772e2a8d6116", - "a6f2dbd7450a05fe91318cd6cf36547ff5ea4567a5c73c949f13213e666ad0ee", - "91f09a4e0a26dc704115370494ff41341a24ec3e2f6b13d157e5b6d9be094301", - "5f8e7c692be711a004f004638e0f01b111f0107a06817a4344db7c17ed7a42ea", - "9c279b25213eac598b576780563024a91b23c5ad85ef96ae498659e301f3b41e", - "15a3177e2ab0b154073bb76782b9ffb9645c187a6baa52b989597f9c012df45b", - "d5560d65bef54abd87cacbb6245362f39237341b8ff2ea7ba441553c33b88f68", - "d4174365807b130574f41cea124f1419346e60b7a604e572cd6c9f27f690c69f", - "27ffa4b1a7ae9e2e7949dc354745fec0b62f95e0474222a3e2304650e0d794b6", - "99fcfa3797bd5fde12cd56df68701f81a1f96a9241688f6ec4efd661435e4755", - "669235ef5ac59b166403ea1e7e348e21fa46a297e5da8c67b9d786539c70c3e9", - "44790994b5f89be4557da699b19435bb898af96b76510d3d72909b415e659997", - "bff1f09362206758058ece9c66143c9ac1b36e22797d35c81f1586b0d27c92f8", - "d926b4f46594f51303d2f0cc066b53681a4e703a9058efc8281c3df0f6202f92", - "d0f0af0ebbac70de92d8bec2d396736943677e36e4a862a0d6e802533c852f0e", - "466ebcff88a69b0ccf72141e4ad9e1640ba3e61bb4a782621977622b2d108c60", - "49731e0cbeccc5ee0e5c649d4aef89eb22d4827877950a631d88ffc17fd7ea95", - "5520a892f4a701b0261d9adab035aec42efe99c9651bce94b97aa7bfd1e22bf4", - "bd0056a94392429cee54fe1a427e92c62385f14654cf0f263b1a16d6ffc04f9f", - "13c4808451669d2151116e6dc6f047ed9dc0a23b58c571ff1174b820d80b2166", - "c0bdd9f7a5e391cf08a77fa02e791d00a938d9cb65f8b37acf8e0f91cebfacb5", - "1db4e55e6f7783e4cb4d52aae20846bfe8257fbd913f651847de89a93055797c", - "880aa45efe1fc19d089a8ee46710124ad4a502016e5b2e22614d1e7dea62127f", - "d1d766868cfaaccfc4faf4aa7df39c106e3694bff50140a6659cc9d1e2a54b15", - "0df61b0331d24728705528f07e2f306e43c1b6465b365f1889cbb0d494f4669e", - "e58d6e960970fcca2a0760bd7b14727cd21aa16a5154443cc0b73e5ebabbe548", - "0ccbf160f099c732d15a4bda4e8da84fe19e6d989cf1d44960f3b9f46a6164c1", - "13cece030e07160f80f62d7986362f63f0025ce1752ae81acd90661324f8c81d", - "4ffbebe1df678732bc352aaeff35de7475261dec878e70c22becf8277fee5bf0", - "13892d831b3a505c1806f657bbf137d5cf4f4e7c806cd5708c231f5b368718d6", - "f2cfe2262688e746bbde40a38da26dbe41463ab027655652ade46ba42a8ce964", - "88545e63469db37fbf3f18c961ee1c87ef6d4fd25a37631ef7ba24fc7f33dfd0", - "af054442e46a7db10f3992cdcc872a59e795fdbbff7131983f10ba7358c509d8", - "aeeb053a07d6a10501071a2ff9ae14746a29492292b7369e70b000f6d84f74c9", - "04514fc6182408e40bfa380222174f28287c4c95563e21cb4c26a87795f67077", - "5c0d9c05bb3fc73df61ec4b82dd833ba49eb68dc51de87af352ee13e88ed5c86", - "9caf95fd5917bc604a38eaaf8d644a2cd198a2e40ed83c07b15d1088a2351d28", - "767c01c63ed587c153d94beac29f737574c0f0f63b53e5e32fbcf7d862212f97", - "c04e7975b08caea66909a0b24ceb65ace9caf881d55fb8275d90690fc5065bae", - "c75d8a3f6bb24ca6ebbb61f17f9958830fba4db96d76752bf8da57a2ffe24dc1", - "d1485790af555c98b3da8cb3f51ef3b11c10cb9ee221f17bfd2b5816d7af7b43", - "1174b56d0ee99022c2a7903c9f7e644b2e3af5035806d69061527492797dd48f", - "f5ec5ac64eb976ee7fc857fb859810280d0212ce7921d1497181e223e7081680", - "1593379561e2dcdb0676c03924acc6d31b67cad50ec09c4e820d205f56cf11ff", - "4b8e6b81624424f4075a435d491177296c7796999c38f81f08828b1ad6f49d96", - "4ccb615e8dc40b5d2e74f8d4f343a5f920ca001defa11f7138e90324dd6e882a", - "05c3d3ecea508f28c8d8727f8bac5264bb6abaf62ec3e3471ac826bc817bc817", - "cd3941af509b20b245b2681c38d9bd24118e657d0077991125d0f4ca2c352c4c", - "8ef319af1ff6a17aae079654d783d2d251336b2ed7681996c734c0a71780036a", - "8be4e5d125cfea74b0c4abd3ea885bd6ea13e34cabaef6a8ca9e78d1ffb61f4b", - "6393d83061e5201013636e25e561bb2fc694af73a99fbd348758c73b17cea0ed", - "02fe3313432c5b52cb3fe52fc59977cb48dba2211bafab4ffa7e690a790f2a62", - "27297526b5b56b7cf45acee9ab7c946642b08849670fc171e745126e0b892125", - "4d67b880de22464e81e5f9ab6c3d576cc6291c7c52094224b978f69021b30597", - "cbc17508f8e1c999194d1cb6bcdfd1a251dbfdbbecc5eb472325db1b1d892430", - "35533ba479eef3251d0753090a542136848f84959de46776d1531360c0a0f2b0", - "3d3a34bba67ac2890d2072914eb1f309ba71f3d8e598bcd6a32e66ae383c96a0", - "d6dab97af1c1a94588adc6ebc7e737259cba11a36d281e8cc9755aa47a3015e3", - "bc3cd4da6cbfe6a043faf6564277eaf67e8967f9f0446b0807c88c4c35d2c600", - "27bafa236f12706c300f13efeef1e559f7100db0da2a0a602ad99a577b00488f", - "7a646777488a897a84284eae1bdc086c12a773b315efad4cb67d15dd61810ca6", - "282795398a4dacda1e2e8144e04098f3838ae7d78df7694ba37a4f5c7e396973", - "9d3ec2862259d327f66c4d3d2e90ee8619e2af796d8619d92e087c0b82a7da4c", - "dee0e59acd8752bef0b22824d3dedc09491a81766c1ef60ff87e8879a55bc723", - "3da415ff60f5b3974df6a4d257e8295bf81dc2bc48f784b263408ca24beece74", - "c727e07ab6aa063309ede65b40a2dd57e8991b46e93d95df245e1eab4cdcff41", - "d1c02f40226589d54f89fd3555f0fece04adf876fbb849c91600e4dcc51fbe3b", - "b370de81b0d8c49dbdf45a709a88814ae79df6db3ed5d9339d3e51b1fd656d67", - "c527f047ab57020a79fbaa95abd45037a5976aaf2ccedfd2423ba7b565148d15", - "17b8247284ff378813cdef4378c1da997e10bc168bc23bcc983a83d3644cb803", - "e3427688fbf15cfeab1d04f6f4b405321037817cdb020302bb176cebc08e8cee", - "fa34a7142a048947b25f7eebd65028b5fbf234f22948c58e6e3f9ba7a0422aa3", - "282bc533c0a7cd7438393f4caf65b45dc18dfc0fb012899253deac4b29926dad", - "2db98909767b2ced67c5fc4529c5545323187f4dd67d4bfb3ddb3e6b3c4499e0", - "9071178479da350bf622cb442c73b191bce6614ab005bc153021063de246d914", - "fc5558ad38009682d97d378a22e355f25ef53fd11d5f69357eb242e317ff7425", - "00d7917dbb2b62350686f5aae703a84ca89e19a6cc6a9344994ca724a02c30d1", - "af51d748712933a9331fb15236a90d78400db6c9ff1004ced248fc175dd0ce8d", - "ff509be13529fcefdb903ff524b71cd821350856733c5d51dbe0fb995677e141", - "49e6582de7a0aa649f91cba5691467291f2ddcf118be314c859e8f53cb353ca4", - "196e8ccc725ccf0ac43ce43b6816339b321ab566b43c3f1d698a935f700932ee", - "a08d28b0d65a5b6945cc3f92fe1c8a493f3b178fe2a89cf5f1dcb0905b7f9e0f", - "e8c5d93c19f961ed298301ef63bfabb50ee3f1f88f395f07162f44278cf52d8e", - "63233acd78862a8dda19cf37b0c2b48e93671367552294a32f59385c891c788a", - "07e039144898749afbb305aa72b1e03c5cc162bbf207347b4dd5f95d2578df77", - "124fcf5962c6cad1db4ac20789f8ffffc2456b99e4597b405a92571318a8f03c", - "c400e22c73639e40fd085a2664d738cdf0735c9b54e6883077844a950bc5ba5e", - "63889306fb35bdcf4d425ab980300f36d3674876faffb6e4e55561b825a5dfef", - "6115d54dfc27f534f552de7e8953271a323b7062727123bedefaec40ef2de9ec", - "0932a623674965de6fe4468662ad5596d518bc16ec583c6ed6fe2bbaad92dc7c", - "733e16a10a718e50b096086d45d06b8c68a5c0f157e815f7246060cf7148d8de", - "2c70f787965d17019d0b5e137caba895048d155bb13e761989d821b81577b5a9", - "d2c01e85873abe1812dbc786bb73b5b14e4ac18d9eed84e52080c088d236874e", - "e19040769c43dcc20cf876d4a83f1faf35781ff26ea1e0d2491ed0efdb00c7e0", - "ae494f60287fa6ca42294e49f74c186466f5e9067fdcd9d37eec96097bfcd9d9", - "d56eeff7948809e678e7a7de6a4548bbf173823d16a9a1de51e9f28c35f60ae0", - "2f388e9cb35ced164ad797ff36917973a89ec2231eabc91cb12e2035a0c02263", - "bf6f9423e36413a7b388be9af9e77d62c52428fa68d2ce50e61df70def74348b", - "7a2d2f5cc051d909146c1f88a2a03ca38195a1c5c4e651deed0cf100924026a5", - "684b6c076fc3a9b92c04ded5a37e3cb63ad7f944370c6cf8c399c8cc0feaa763", - "9420f04fad4f67f5fdbb0b01cb8f28efbc2197e0447b16af6186b98af3262e4b", - "6316789135f8b785acc95ef7b0f66d8162ad7852d2e7a1bb73359319cc65b06f", - "3df896b7c8ba9a479ad12ec309b51f15e5263321f0fdea32b09e00645f244396", - "7cf674ab1bea20991fd641dc2aea400a0bb6fd3209961054afb52811b85de809", - "378ff1fd0571e01f27976d15a1e5775a7b6be688e30286402eb818812b2f7ed1", - "b5feb20ea67bd376eaf0c1d32f28abae20e34dc4cfaf92224e4b49c314fb7d1d", - "89ccfb14c3d785ea66cfa1c38adb714ef9e5f77b981796e3c64e811b166fb4fe", - "2525b4d13d65afade07839fd34b43ec86eeaabca03eb58f18be342282dd021e1", - "81cbe9faf2f0b9c8c023121f5cc202b48903c11ce08931abc1ceaa9f74f27633", - "31a4046d42915428808b8126d8f5d49e01bc15ee91d23534b679f5d1bd070ec3", - "7388538f2c32f74af2b60cbc688bad9820196f822ac473ebc8867afcd87b2322", - "85b3508a1e365c80894caefc0838e45a4f26e6461b6be92679bb041228870488", - "d5bb2773060758626de20046aca8f9ce50b718f767c263ceb3449b0be927db71", - "2567ea8ed69d565f53150eacf9c4b40a4181fce853e3da257aa703a5ddd406c3", - "5344a2c9349ea19f9a39ce16112e0bdf5ce5d40376c9cc88b391ecfa60f40809", - "597561f9b928e66ceb9af0e3066b69ac793028db33fdaea34e5a63413bd00414", - "2ded17469068acdd9b52a0d9c7d6856bab8e10e5aefcc28380e6b18075ca4756", - "f30098aa3ec157a2a9b812a3617e5ab7bc0cff479b344df91680e40db82a0cf0", - "01b6618e4a352a9230e56ac384a2acb81dcbaacfd3a420c533f65fa69c2a1291", - "1908b104a9119a8550ae46d064f007aff178f841fdb775b4eddca48fbe7e3e45", - "fb31ae57971ba4a2dbabf87145ae16b3ea10ecac3cd8ecf568bfb399b4459dd8", - "146c09cf13aba29c40bbd1d5fb57915c8857a43e75e60090d0763c597cc80659", - "3da114b7be2dab1a26807c8d3d9ae2183881825dafb6491128b961d619df1d7d", - "bb35bddef855464fed1e41d4741f473d7c42bbc4e744788e83b1eb72420c1828", - "1fb2f4530246b6f68a0f31c17ca70c7cd2356c17d7d4e0bbc52f578a178dc01b", - "de55c9aada5ba41a04326a7dcdc5edb22d653b54cefb1e1ad15e9c29bcf465e7", - "4cb20e08fb1dde68cbdd7bfb6cab19b7aab3159ba27386637c65f53a5358002a", - "fc0e925ca36240b176654b1478501e367fe6542829a7a5650ec66411235644c5", - "ea30fa024aab486790464f3b8c566d8984ca6831b926278b74c125de98f0719e", - "8f9f7d46a59610b9b746ddca077d80f101970263250a2550e6f70051115f298c", - "1db8449237d45684c9f8390927dbb5d8f3340bf49af60d447cbf4ddce767ff61", - "ac280119cbe3f7a14f72e46678631064c3da0dae16fdd06ff08599f57f88170f", - "dcc50146451c3a26e83d7294374bf436d9acbdb31ae481b8ced9c0f59c95439a", - "fa555f4e42869e5aa42d0077bcdb1ee37ea910d45966f0bde6484747ed8a10b2", - "c8e6a52368db37b8b52aa4f706a85fdc36ea72d9179a33599825b0cf3700379a", - "96bb33505f2a6153f43dca380b089b6ef8f06cd0ad7a9b44e6de405a502dbf70", - "188971d1ddd375a224051a3e0e7f12dca6a0fda962f9abbc6f5c056cbf2a90c6", - "b0493355b4ad7bb76f491badcf253b500c5a095687f838b0c003f3c6ec5526b2", - "35ba42b1926f6f6f4afe098a6a23da8208963738a1f6f7d4e0cae1a13b58673e", - "4d688106411bfdeb553791b1276783920ec122a854cf14f847d7152edaf9f40d", - "097cc332bd26769701152b46a0844a65e0abab1e69132cb39c91f357dc36f271", - "2030fe6c987cd1986b444818bcc42acde813e2331862c619ea3275effba145cc", - "b87da7f8648d3995956e2398eca902d774ad6cb653b53fb3e5aed25003bb383e", - "1f1808766b1526a09784fbc0a0692d086784ebe954243daaf0637edb3cd07215", - "c7a05c93a8feb279cb522fedb54d73bb6059b8d9b64fdc3521fdd51e3ce216dc", - "9da90dca6344e49b94cd90b29d494439e6c089636b932819305daa95077b1d90", - "7d3d0daea626b1aa691d346a8a22f687f39f4ad4bebb353fe9b28ade50494c65", - "1d5a63766a46a28ba29484fa68c0a13a09456894005c8a1f74ae227b8011bf4e", - "72a6db7b1c064cc97da4ff89fe60b66fe049856e2608f0d35e3c4b6a94d9ca8d", - "2c2fc53a4acecfbdd355be9e151117bcad25648af6e2e3ac172a8affee0fea47", - "bb8295e0f4bbcd0b6ce8cb8cb512fc329253047c07e291e753d3423b532a5390", - "fa62790d365c349f54697b48d77b07b9ebe3e3c5e32c93016ddfab363785704f", - "cbee7c2e10948ce2f2f5409f62575cde13c2b34f47fc221637329380d85d07ec", - "53246ec7670a6e4311a3b900f7953c66f429bcbb58b58df73b09ad3905d99c3a", - "f86e037b8e2cd603f1ae8bffb17ab35abc0418388326bcb22f66d288c1056b96", - "7c9c84bccebe3e111c973a46c6d043a07e3be4e35c79971af9f063e6ff8d445c", - "d9d25434302552c6e4841fe2cb0bc98576b6ddbcd839eec5c6fddd2cdce818ee", - "ed8c77392627364db6c94a63ccda6010d48bfe91daa5eb5218fa263200b3f564", - "80de2da074a4a711bbf6979f59f60533eaa3f0d20c72d562c460b99b4ad17bf3", - "a82d17e879915a7e12a6ae3769800ef2018fe78205edb12734f5de6ad9f324cc", - "59155c893a6e0f26d53522b9233b2c1eb3036681a699aa9bf0cd21de8a887cbd", - "3c76af897398f7efe0eddf8b9e5f14259766b3286d96b8f771488797bff50aee", - "ab3bae8c3a67f6f7d8eea962b41c948d1f28a49ff4d86adfc57e4bb60169651b", - "29fa8a25b92e139bcdaec41bf36cf7fad5d024966620548467f9c762e0127781", - "a6d1c4c7eea592fb69f0ee6458fdd818b9526ae472897bc0d57536d7d5dfcc47", - "52c6e2e276c786bcd7e7db78575081ba7b3fd95c72c754a94904e169e8d356f1", - "811224a3dc57db07afac0e6a6f49ab6f8c131d2e70abc36b51cb8a027f80b3ed", - "12d0bca51d74d550a16fac3294fe94f4298ce7861a2961fc765b0f6533ef5842", - "a782ebaa8cce6cceddc4de7369bab8977a0b3f391ef82814443814ace4b5cf8a", - "4f5e8919f762856e43be9abd37697d4d3f822c2cbc5ca26ff0c61c32163f71c1", - "ee8bffd476c325e2bb5a8b8748ba1adaa01c9e3ff9ea00d20e72ac3492b3d5f2", - "6b89773b354396dc10ac4ce4dde3b166bd0a3d23aa3b5fef02225354477fc6b7", - "7ee255f7f2f5578d1d3913ee0fb29544f946ffebb2ee163d64ad54eb373b1f04", - "4a84210aa121d2177b4b03a9dbc6bfb714300bc655939feb462de19e85d786ec", - "a90eaa64869accea620b637490d443780c8f3483929a2d4f61c0427419d629cd", - "e5c77cdf1099c0f4f6c20ed3fbce1582617b925f116fe37f4d7a2b6b06ad221d", - "5cf5379e11372c1fd87642bee0fb24b79fb57b20e10c8578474fb25bf6414bad", - "5d8df431214912bd29d6516c836b5327db5b2741edcdbf5ee51eb99bbc2deab0", - "0933b7ed5847320bb5f98ac13bebdd583d90e4b932bd97d58b24fde1accf13b0", - "d462ad8a9d26bac58c7dd3dac2701c685ac20dfaf6b7af2a5c350a7d532eeefc", - "3af2690b06083845f8dc7d7a57c946aad2a166d74b57071b496ec5bd76eac078", - "158ac3ce4fdba688012102b81d9953072fa74c7535da5eda8a583da063aba7c6", - "8a5891cbb09f25198d0d29a69ffebe6d6e4d15640a2448c963698007ab32e35c", - "0adaedc25d56f495be1d8428af5b2a18191f21d5ea1f320314b0761e3225f7a1", - "079b30c4dcb355e3bc53bc8409a3495b87b92847582ed89c16cec3f8eb11492b", - "8c3afb2cdd131aa992525e5e787e3ea0461f578cbd66395ee87ee3284c9193c0", - "d4eead8c69d3cf55542a794b4abf1896031d6fb541b2c112bf8a3f127dba6b9d", - "8c736af51992ba8125a729d28ba39f2ea66c06a78d624173cb1b37e6dc42ecbd", - "b017ab4bb6c5e06b0ca1cc14421b955f4d003c5d28b4b3829fd34d1b2edf91b1", - "ed9c9a80272fb6fbb145e8193e6e8274025aafa83108187418808e5889e91218", - "45fb562845ab5a4af9c8abd948a60819e9c6ada517734d7e9b3f1d0ffff0a9a6", - "bb105db8abd9c578fa5618bc219db057230e5b100159f6290f91851b651234f6", - "557491a28a101653ea26a740cffe52482742dc48d59cfbccaa15b354087eb56a", - "e118933849a5f21790681a9e15fdde13a9473c4d7486a5f38707547d2d70f00b", - "b536ed5dbb102544d2cb56b77aa94f5a3bf9c5d2fdccbbd223c5d1aa161d493c", - "1d08c305456f36cf8a59f6cbaa84e11523cab9dd6277c9cc3023ef237669a3ad", - "9fe70d85945b10b8bee7b8c7bd007b24c96276449b4f69927a0f319ee785bb89", - "a086badf20065421ba1d230c567209d6e4d5612b6736f003b225b2329f783dee", - "b80355b1e712adce6ef2ae5aa7cfb691c42fdac64cadbc5fec76dc54d423f817", - "ee83a70bb8817bc0145a84c9bcb583b263d1f8c390e062fe68cb355670292c42", - "e876977d82338f59def539829ec2dd8509239dcff5181de2c47ca22255b07d77", - "9c574eda43ecd472e75b74f01229feabffe241e69038c141640e4e1ea4874f8e", - "68a9671e05e2140aef0c08f983f5b32410342c341aaf909543297191820cdd06", - "1a6492c9492e5e22eef3d5a55adb30870bee53f6fe8be2ecf566b2426a301558", - "ae15472093afb31d73783a128e0d87fc477af0a26707d762a9a84166afba867d", - "c6b09c7c3cfbe81ceecdd9e8ecbd7de7773518cdffa984ad2067257ae9589b86", - "265f63c005e4df4ce15a94811745c3fc50f404c01820cd975a1e0a63589205fa", - "7bb4a1d360e0cdfde276654a38d9fa9a28a9e63a7c98c8f2eb44a9726d947d05", - "a59f5e6c26a209bc131660274cb5f97547029b364b778c6c9c503c10b082b945", - "c27483805eaa7802e535905482142d9ba86c3aa76a51410c43fecad5c2203c62", - "156b24a6f3231375e3d704fba2b297051f9bc8d0256089cda46b6b89bc5ffd3d", - "7f601d5cb60f60e55586d66d626a36150b6672990687d818255b54b41812b98d", - "65f67441778a7d0343a79701452ea2042647f43c09718f552907f622bf2f4bfe", - "f35bd953fea10b18465bb24b893b5d5ca4ac456c6fa5b912e46b32e13189f607", - "769c3dba2c7f67a3f955fd69b0d6b96b5e774ef42107cdbeb8d22cad676bbf95", - "eff610aa04618129e1607e50160d273465145164dca3ba66fbe56f54b9b7144c", - "9d8057e31082b9a95d08d0d3564f4cd7a806d1f83f9bc6f0359e66b545f453cd", - "0e065bc479344d7af92eaad5e96a5eff5663c81339eab16fb70a6180e58c86eb", - "3adb3c96b60aba0f7253e6228f9b17bb588edb8ec4a502b4e0a45d0efca9af56", - "f2221de5c62527e454a4e6be921a0ca2b794d8d665b8eb4173a6a7841e15a3bd", - "dd7cfe822da0f99dcb3fca0c6d6cf9e298065a8bd1adb973e36ffd2934f75609", - "621c1ce0b2e5197ca77d2375a2313c35642e435551e461e2386b1cd897722188", - "1bae3cc266171cbb2685e3b2376b70e52f34e83ddd3fb81e803bc01a58f84b83", - "b3a03795ed5a26389759fd7b7c6f2d334f11d750a1b3c165b0587c6ff6a4a85d", - "10b28e86aef9b935e26cee91b178b0d7d88673097270afd56d1b205289778197", - "5142db6e009b86c0e973db43b7862baacc9b6735022fedfe05c10ec6adeb2090", - "e29d857d7deaafe06dafea6f6e710cf75f52b49d6a7c82100c745f96382fb3e5", - "aad5536e50ec0cd74c0a5a451c8bdc53d02457934ab3a529b6d358b5dd4008ce", - "811df29497dd34549f37161a8689be176ff34d111e7b52bae86a5a54833f904c", - "6043fd9ca30eea9d2c4a2d4dfedd860799cb039330241796819d812259bd252f", - "679dce3f537a7d995f7c8258102570285f88a2f6e5e548dafca2297273840fd3", - "67498bbd7c17e2887510cffe45abb347ed54d67beef85b08f011ecc75dba4306", - "8dda7fada87aa84370479b9ece1ef2b488c01bdfcd09554752bbd80ba2f9b981", - "979894b699389e540222c8cd28db0701806eeb7760f6e72130a1fe29c05bf930", - "5c17b4622e66722d863769dcb892483fb7e67161afacae829cb9ec646d24b012", - "5363fb15714675ae82c518a7fa2b6d51cdd11ae7da559b0fa439150a34c4dd29", - "3a5cac157a16f412e006f3a7eb61ee4746d291c638bf0c8bb0a9c59d1be72c02", - "c8cf8e636a68f5ea5fb24a0a65aff46fb4c97489296152acb7b0fddc726e2c68", - "a61673ad76351218bca1d47d7440d812c998c0287027b84546f5d3849703d7fc", - "63319161a77df616f160b02bd506c56df3cec3b2dc34d2643abdaec1b54702d5", - "7a2ebb22f0164a3d8afbc79a413c8a5fc1ca695a50be5c7e85b6d5b0891452f3", - "06e842d6947a648a813bb102a124de100b1303d6a69cebe201ef6fcad6312927", - "2f5495c9c3591d2a89df54625493300a62459cb72b52ec075d659b689f4c089c", - "ccb29f21576df435ef8f0048864b9ff2c349c6567286cae2548e420e022481a5", - "818d90230c6df68fa39b0a75e2aa18637f7edabd29752b58fde468148fb5a2c5", - "54fbe6c4f3e6d6ce3b66ba274f085a953e053b51104c22850173ca58602b310b", - "0e92a0401391a8506493ef5672f99bf254cc46c497e40404ecf8fbf0c6aced9d", - "db04d2e690b377e026f0fa8c15fc234c0c44e4054ca27b3f3781b2ed60c1a81b", - "4cb0d8bffcf5777ac44396d4db6f2c77b092782022f8c7b8921aa73cd2186be1", - "101e479f889543bd9151c20168c12cac3e9d4fddabb0544677de4ec38f0a0461", - "1f156df82a64452f108dd6a54c3245a3af0f46b807dca9cde9be010e8c8c40ee", - "5c0aeb9478ac902ecc70e9c11f1c5c5474b2a870835f545c72ef292f47f7e77c", - "53c28f65a2ae9444cc36bd6ffbbd51328c10e051cccf2488bd82cb74c06b2671", - "97b393bd4dad1304d6db93f8125bb374c2c633aef91e6e25fd8291d0cc6409b1", - "68d4ed22fbe9230795a6f53c177e8099ac6689293ecdf6073019b027304c2451", - "8332975d1aede671a05b4c8128f9910a64ecdaf3054e5caa1ae45f7f95887b13", - "6aae756da26f5eb5fcb6988e58047929592b471968cc74b4ac139cddecb524a3", - "47a9ad427c15ec0f74140221dd7465aec35b1f2df21e52cc3a9dc3515a48109e", - "add9e3acbd12a1ff93c83df84671652b7f322f91c75cf14195e9c76685db921c", - "8593744d74cef285f390ce5cc04bb77a49e1e7dfcceea9ec07c926b86d984531", - "570714b65ccb7a0eddc9207a7531f02abe040ddacd0d71fb8a3cec34443f6839", - "8a8975c97ef4c8a3bdc953645f97af65aad941ba153ae131231f37274ae2e9f8", - "e47f05bcc19d1fe491f3df2295a4ac53c227517ef4b4ea48828be3865ed34a1c", - "fb73dddb86306f828fb86fb287c3790b9517d9dd193188aa3322c333f2f5129f", - "57af82315a9c4ceac6aae5d5c1c7e2a160e42c9a98c7e657df82160555a1cf57", - "2af414cceeb0bbbc7540186099dcbd4cb0c5dec26dfdcb9f87a635098f09e3e2", - "9e04ae0fc88318bbbd1100f8dc02956928dce8b4df3a36b4391d9b0d5ebabecc", - "c6bda95138e4c88314fe922c4511f4c4ed6734d3bba6da474d990043c1990484", - "a55036d9328c4e88876d70c9e77efbe3c41b2194339eddca2315b98443f940d6", - "90a656e41e0d336edd47cf3df0635eef4c4235a9a6b66f64707aa0c6c730edf0", - "6e7a9b977a8cc9491e57679e0b98838ef22774fa69634509673f890d444fd317", - "0d0b568eeafbf596df96626421a5a154e6239e27eca2272d4a995c081eb0998a", - "d543c24af5a2b838fe4aaca65fe4bbcf5d9a053bc7416dbf118e513c7f28ac0d", - "6aa88009ea5a7e6574264ddc8861ca407e9205859f9efd958d039be52495eea8", - "1c3d6ad6b2d89174ee37d4e164e681a44cd4dcd1fcf3697bdbf64294e68edfe5", - "717e1b523f44012756ca111ce7896768f2036aff9bba325400923fd607008951", - "266587a5599af375015a6f52e852aff8a199f91305c07f94164d6d9019c926ab", - "f20e635b14e5ffc3bbfd112fd25a90c1549e7b744037114271668a9da1345635", - "bac9a88e7b38f0b9ec3e1a2d790889e2152994ebfc1323b1119211e741f049f8", - "148566dfcf2959332bd2433ee3f593daf669accb2da6a1e25bf9426c628de669", - "6632821a68461d8e52232c52bf08b2a8d3ae56cdbfea7c45e1de6b7c6eb756b1", - "16990a739cb2d1b8dae708d7cbb98f1d7d99dcd408bfabd0d0b6b04a82d57bef", - "aacf5fa658800b24c0cb526af8a03f182843449c87ac25b840b5c2e4e4982dc0", - "76b93c64428f6668dbbba9f6f1464a6bcf7fb8ee5a6fc0c41169ffea97f0d086", - "f6d20608864a15ae0e6a524f025a369986d4fba10379595e8dc03ece7149b027", - "c0f5fc0d304ad1bf313a1a3d80f557563d2d322534df8e69ea76ba104e59d551", - "f330819bf1c586513a539f976b2963f1352277e57467479d23a33dccd828c8a8", - "0b1f536b2104e25bd10d795b48a19e7d9cc0f93b7b9051cdfaa29caac586b4cc", - "f1d47a115fc94a11f273063e9f1e00527fc9f310c4bb63c722526a09805afa47", - "26f5ad0a7d219822ae1cd755070c436c1a4942289863930f544f08d9fea091d2", - "57acf78a0edadc22828d7e6de48403f75ed6dc66ab0279f022631ad93bd80ade", - "be0b8dce9417df9ef8a02161205c43bd82fb82c75cd33e03e265c5e1a8c68e80", - "a0da3b46c7e2b296fb146d9f2ad1aead4ea8acdbc84b3a5d98f09166539d927f", - "f620e478bf4a2bb98fb84cfecf3e88aa7ba1688bb266877ad98fd701800eb17f", - "205bf40f8b5c8c07b4f5e3416ec5c5b2f0e00e4c9ccae950c48c3e818f7e5fcd", - "54dbc0c8e754292c0fa64b2a8bee09461261641c75d3279630f5f4a9989b28be", - "b91b822fa77e3c1fb698d167be8297d3598ae948ecc0924a73c2282f820f2696", - "9586c4726cd75498f6d69f41882ccc6733a8fc712ef37f8aa5a446a6869543ac", - "a9260ddce02e1dff6a7ac4a35f5a150ba73825553e5ecb3653c735f84ce03e76", - "e029c2432030299bb9411a5ca1bf00e45d3812a3751cd57635ef7d49456d227d", - "70d655728eb67a8a5fce36c7749dc64b668228744a1e446e3548920a4f0b150e", - "53d06f18fac84116aab7d14e2cc1f09dad4055704b0e320dca41eba8fbe98a2b", - "9a6e47b8d1dd25b1db0fb549e8e8f06d5e73f79644df571a4decea60a3ab6cd6", - "ca2d9c3508a5e8ae4665344c47bbaa9e9eddc5f5e64863e47f2970d56cbff419", - "8480cf314ccfa9a3d1a85418b41b583e03d2f66383a172d8c79bf8471101c3f3", - "eb9f436457675e1d51745ba342b735d9476e37855635cbff44e5a7dc0f963006", - "9e483d998614f5ca3c6018d0f41e6da1e05f6c0553e5c51354f9211bdd2adfb9", - "4d3636a9751b6bd0acb68a8e4d57ccc3180c1a13fe80dfa43938bd5e15342b98", - "8c1d726ac4b6dab9617d53d8ff25268261109cac5d89f1d695ee76c08a4b5e65", - "bd77df42a2f4b604458e54e65ce2311722bacfd59e8c8401bb420a8103dbf86b", - "54220fbd0b238d76ab44ffaf609fcf67a784f293aef0fc13004f45ccee8da313", - "7c7aaab1e01f6591e49e27c32f41a5a8e4ee5f0c3df463b7687b93f7a6025459", - "6f75b80bc2d3d8b0db7d02212228a7d3df37ed64f98772ae7f75939e7aa6b6cf", - "55fb22f7d811fbd8eeadd201ac94b342f1d5eeb02bfb95243520bf125f205c2b", - "f46d97afd0d5ea797541098889b422331395462465d77ce391edb4a14fc665c1", - "3eac365a7d65ef628c462df6294de44e51a5e8b75cda08085928e50b4297d5a3", - "77e6c73c4b4b69691704be2b5f3b88f4f0c04e56a873ba3af9ef5dc66a863c96", - "5e6bbdd620893d4d03eb02391bac02501b3efe816470e3052db850a7924a25e9", - "50c0fbd5286dd3df7f6c99b54105d12307ca774486e6f97caab7c83b56e98a06", - "197f7789104e1bb1a13e8978621aa6c8b1a7bd9916c6ffc18f72c81fe2fda3b6", - "3f3bd0752d2dad1a1625373b88f92222c214e0c0d35da3b98e6abdacfc85fa82", - "cf288fc290487463e8e9d38a62e7986c77c63624f9a93356fb0d58333b1c0b38", - "101e64263205598592a3902673c8c749075ba02e3705f2db110a63564ae05eb6", - "98f82103b34114fd084b14d2d759e686e750dae03ba46cb84a57036e3b9b688c", - "b82bd522cd7b7985ea6c568aa9dcd1fd1c77a9913e708ea066d05387797e1e62", - "c827285199d3fe3f1fcb1343437f37f1af66db194cbcb1297fc38d011b63dcf9", - "05a79d1b32779c3319a0faeeab480117f5765ba640d06abe2b5dd7765d8b7c4f", - "be079e2d23dcae5c8f22d4790e93fc985755dfc012379de7b34f771369fe8802", - "bc783063ee46e574431b3cec061641dace7c2015b3b806e9c76d9a3b4ce21b8d", - "40249c94157203599044b9cd1a32f22a1dab970737036f9ca062c28a0f7aefed", - "795b7d42afd5a2baa8f4741fec8e7a5e7d3d530802fa09137a59d16a7a0061f2", - "224e37205a32394f303904a5914fb7aacfbddd7d2126ded9d988ff6b320de6f3", - "656a5e07390f4af7a805383ea131b3641edc238ef6535c03a481f94e39ecc7f6", - "1f2a06bea6a945d058402afb92d9a854cd1c1a671ff2901936b8da85455bc201", - "c9b77b69ccf3243f2cd1d73433f63866114ab39374bc186a4df49636ad4ada00", - "f05e627e3c0d072498088598e7b2bda7f563b268c33363a536f1036770ede22f", - "ac340c81ef82514c60e0cfcc4104da7833de714b63e8342cf6ccb615bc119f9c", - "c942d86f329ea77df2523b60459e2bc5dca13c3c66be8c48592dd23afed8a249", - "489ae27691b4a1438a7dbd87019d195cda1dd9f5cca79a0f3fc1d7800f8f3f0d", - "9777a68f2b60f65d090f775ed2902fc3db77f1c9183baeece91b51e0dc998cb0", - "e6acca8a62de3e9f463538ee9bf66dcd638cf069b3d145d869751e8bb36d9105", - "1694c305f3f775aa7c18321521db72644acbc7fa519a107ddb0a00458999ace1", - "888e088412ea3560190d7b08cc1bad1353938c6ec937e0458c01523402df4b9f", - "ae997eccfb1bae2685256098ffe67d9599c60d7907f43326963a4560c3603ea3", - "e6aecbc18f48efddd7153579aa2e2d8a6a32781a5a59f860ca4945002f42f8db", - "de017172605c4c8f927ec43af3fbc917b3d7134baa1eedfa487fdf308389ad8b", - "7225b6afd3a20ecbba4bf16e4919f82f828a5874253a3f769878ae9da0c3837c", - "e835b63cdd8cb27986487945fc2b897e68c4d41d72c2b32bc9c342457561e699", - "5222c68aa7791a43b4412372c4e494c14649af51bd3b6e5c645eb8d47fc0006f", - "1ab666cbfb5ba2a8d4e5fffe04f6afc82ac9fb749a6bb70e32a4a95282413ff8", - "19b5b9bab623d6f11c95a6e0313d19724ce67bd84966052e4b02cf9c3a6d42c0", - "7236385d34f99cb54e6c6c9d0341500b530761950557c8aad9af6c68877d885c", - "ae7030eec7c6de0745245d741e3fb791bb3af7ef955e38311aad00b7f53d0b27", - "337002213249348c1ef3b7c5b36fe4bd47a174dde43626ac8ec930f787f95ee3", - "7d9855d3976debfe59c94ef98c23ecf88382fa78339bb1f0477e7d653d4a0dc4", - "a7c6f9e6b55412fd8b6bc7ad3b63fa8860017749f022065426aeac3fae09cfbc", - "4c123711cacbee0fbb21f1ae1fbe9fe751890aa9346591173c85e82e13320821", - "d5f73b13344c94db12f0e70a45aebd81007e8343ef6adaceca3b68671f36ce58", - "80c21b78e6fe6ae4dc792372f8c44a1d1021d67f6685237047a14e27cb970211", - "993e123d05aa52092a3ef4b335213a7b02a2454b875ea798693fb8fc0528e09c", - "e359d1ae8771b5c057503175f866a6a80d12ad97c5e9eb9abd89982db93654bd", - "6fa50d67f5b1d5c6a196b0feb9e549f4cb8c8868fe1b8170ad38c293d4145234", - "11406f1e2d72a244982aba2c9b328137d24ca4fbcd8167d0a0ece22465cf6824", - "0c955a19b68a7d2e5782c99728ad38379930ac457faad5b59f0a98599fe304ee", - "47b9474a362d34abef1cc0fc24f53139d8fd7a005ee8bd95255f0cb0a1eb1cd1", - "36a3f107fe6bfefc2d58f3326b29c4135947215f296032c92e884a179f0d0d71", - "f5846f0ceb8b86d87fa6dc0359e69b5481e8a911530920749caa97c6fbe3a496", - "c706712371aa7a7faec5371ed7a12c6ca4b9649287ef3d75abbb8c2a717962b3", - "6706b9007b4c541b515b5ed7adc13e9160a4573a5d427804e337c3527addb3db", - "219c54a55ddc8cd8abc724da700505825f96e2bef032308aca5febdeb00e8104", - "4965d6f611a6ba1d40dc79e24789fa2ff6f4eb9f50f55a57963df576c54f389a", - "46d69ef9c34105933886a670a60d975bef5f3e2030555cf5f5e972d03dcfc75c", - "1d000b6758d501be7f37d624611b8e4874daef1d39ac1157f2e835201a81ee7f", - "0c8634358167b53c2a36224ceb946d5047a69ed898baf04896750b80fbe3039a", - "8931c4d8765186d20c788a37e6c02e5d404751f4cc83510cfbebbaf9d268b1fc", - "7537b001853da035f8ff605a3153b50bfbf7e1e4136aa1ead5711256f8f0db4d", - "000ab1b37c6dcb7d4c810c6a5826db01e4cbf049f56cae9cd43b1f3012c2b03a", - "59897c24de111af0867da23f53ae4da1be8723f533c8bc03ea6d8d2be35efc14", - "9b64f78f4952513d22654575791bbd8e17d2ea65ad01748d43cb7a509225447f", - "c8bff8b985d6c938e876ecb34ac5805adc63b48fb4ac9b954c54c2e498f97244", - "8c4cc6fd601edffa96a4d37fd475c3755fd34da2756fc7bff3b4c125ecd98419", - "ce5fd5c1244001da9f36fd715b98ece92d28c93bb460da083cbc8fc43f3f3851", - "4673363164dd322ed367b838193a5def75bd461d7b83989122aa8228cb3ad7e7", - "766d527035d5405752a4bcf3aa0e0e79fb0cb69797f7f7b5f0a1419be890c4ff", - "29be531e95dacc80e80ec5e3a766f6dd8d15b1c6e73becb221c39680fc8a2f5f", - "58950217a200d4e4d729627a38525aaea1b666b558a9228a3600213a7c5e15b1", - "5f7094ed2ceb94c64fbdc49ebce98b308c16ee8afca4fe165780d1e155337145", - "ec5ec238c7b2819f89917c56fb7f4cfec93c3ea91f1be50fb19c453891035857", - "0e6dca518ed804f67bc61c6d8f3445b4667a685f9d6c8df622a3e355a1589910", - "8a873a2c155af23c2d5c00cf028645d592ff740701e9789291d6f486f7eb2f7c", - "f5909e441c3feb87211d851b35ae7bde8be21732c79beb777d6bf7226eae95e9", - "c7f1d2d6a80a98e2ef8813aa37ee240b2043b8cedf1c5abe9c6a7b1b47456435", - "1036848166f7779a670d6af14e17847134bd25f9aca4fe740f9156738177c927", - "4a0536fa001cb9bab2bd56e3fc0ed360413d158bbb9db2e178e2b3762e15bee5", - "5f7bcfd1186d56fd703d67218384c51bd381d057eb8abe0a93fe91953c86381e", - "86c1bd731b9612ea249d8a9370eb1e5ba9418e21ec24afeb1e789e4a7f873cc7", - "ff9d1eb1de5c2d00630f3dffd0bb1b079d54cd67c5fa5cf13e5efe19432d68c8", - "d5f240a2693894d01e5970794780417d7a89fafe9d383f5ec1aece1080c4d980", - "f65358c20aa44bcba0baf19bef2686dd07b7630374448d4d51bdb40842b83044", - "203c9f10254559b977032493f51a7d98082576be049c823b920f21fadf705975", - "180c0cebc6aa2228e1d002c444ab2f32e3f3f0214214140350def8214330b0dc", - "0f8354250d8ad1cf886710c543d1f6edc62c45a794f4d81a07d0565a9c592b0b", - "639ff56ab215c58ea209aa4576ef828f1406b5b2cb68d052cf654abe1e950642", - "c2a1790dbd6150baf598702c258bbaa94f828f521fb48f0c2947d46a8baa4d6e", - "d6840e81638b76ea66aef20849e9bd53c076d05c197f7402191ac0fb07d4ccde", - "ababda97e68b5117aa92b69683a8ab8008f994796989d3bfaf15929d7d47e5c7", - "4e7bca6334b80e537901e005f7aa189380da2ea5b1f4c395fd00d1bda00762d2", - "ac09459b230048e28f24428714a36e06eec259c292f7aabe9ed52f03be6c0828", - "e4e3528f1f276e74bac65ae939554e905e2bcb9c4f0e9043c495dc57ed80f26d", - "a8de50c2380658618d24bd772a22113ec958687bd26a4f1bf7a5d0a37d587387", - "88889dc6857ef5913efa66536aa6a7c9145d08c5463abcb53c9a03366afc4050", - "0c978a0502e70c588ab31781d340bdd2af3d5393c040a70c3685aef897b7f598", - "1f0e6eadcbbae4c21990af6fa255677c8225cba8b8694115f8322543dc6ab121", - "7e5458f453d655fd2f7847f813835a68e14266d014d8a9a73334fce009f89728", - "b593c4f1246534f72cdf8700f7b8337fc5811b6bbbde958366e969d32796b450", - "d8e302caa5b16bfde35b466dfa900806720471a6c82797b65357993c017a5d9e", - "d51d7701279b5ab360d80409b5061fcc83c06fa4fdff82778e7c8ce9c79e3dff", - "d4a1d4d1db13287aec6f5d2fdb4ae013c912359c41ebf90377e80fad43d766e1", - "1a395615bf9db0565a4eaf9dd9f26d5a696562218f8c0a96bf74b832f86863d8", - "8f0cf0ab52798e53d92988ba55f6e85fe06c93c36de7956e19884e9bf13757bd", - "0de08f04b26c22ea680408c93776ec295cbf1f84f89a97b6af5d6a2e4a11c42c", - "f2a061530e8c6db9729f80c4b6ca70760df429293423e598bbe1ea41a723e2ca", - "eb4206f37e1d7361c02dec4c456b34b5bda85861d71ce026d4ed7365ee38ab5f", - "c0cf77264b12cd185f25813df834f4568e838dea36ee7ffe278e135bd5d3d333", - "c07551f683afd2ec31f961a2b061e524e80bdd19d6ba1d4f59625403837c2b18", - "4c03439e5d3b8bb54bead5912faa68e209fc99272d17ba9b0404c33658c22cb9", - "8713d99e54903095c2c98291cfc852e109c2f182120431525c8fdf50112a384c", - "4ad2a27b4e5c0b2c9660750f9dd1e1c3ba51ae031f9af72d7f0c9a1f5242030d", - "36af953955befdeeb50530c2df50338a30dcfe9e637c26aaa113a641ddfde99c", - "6e0bbc18a167ad2becc9c5eb49de3133cc14d91738b3dabc1583a8b264a1ec80", - "cbf9cba2268dc33a91971d946455d7dca677fc46c8c3b2674e28499bafae0a99", - "f190c9f02005c496284a67494ff0c44def38c2ca98064c97363bfa4933637f06", - "9bcb05e33ab71c66b4455622fe1ee9d0c52580159470593e79509323028830f5", - "d3e8e1aed45d1ca15d3fe57c94154941e0a45f66e3d0daf7865dedeb1d58becd", - "f332ac89bd46cfa4f87a386bf6d2a40c3388e9307d5d759b52a3ada4795f8de4", - "6405da5b6b40db181d49886cf223ce474d40eaf6c5fde2095d7c97a129d017df", - "8f2d8f96d1d1b7b6cf0b13e0ca5e3c038e9a00f22097c3a1effae13aea66dc6c", - "f33bd41e84a74422d5aeb5bb519aec0b2ce89f9996d7b3d1a23b57a76a938af4", - "2e9c574d1fd4210a65e9477fb5913e783390a600d7ed623fae1b86668b91680e", - "92f538ca97134113d51ce4cf800724134267c44ec51596ffee9a527d9ea1bc25", - "304ba3cd6ccd304c006d3d6fd2507ed98cae6a6cf58f475b445f952a06e62a85", - "96918a22f1af13f5b6f1624751c5982dee21ff5616d08346270128fea27f34ba", - "d1e49c41a576055eeb93b4c89da9680e711ecd46adc63f372d26ddaa5cd18b15", - "83fd90954f5af899f227081d77c841a14f6c8268bd544eb2b707d42355c6446e", - "a6441af82e95d9d3db685df13f2451471ac2a6fc259b89d844942eb5fede5e4d", - "35a4b33c40b20e50fa972a3ca1a9cbcb1013d548c9c61aa23df2ba145b2307e9", - "2bd179ecfb9af5b3de945d0df5289912d4b09f58dd044b6e706a3f170585550e", - "0d74688b1381e6563ddd2ece69e0b2f9038e260459a3424af82e5c9abe4219c7", - "414801970f4c924c44f615ffc67ca49b99953d11066bb8cfb08787c625dfc0ac", - "73a20a45132954ab32b3b7795effd4674eb798014dfbc976d80cdfe75a6b3a33", - "5a7bdcc27c5ee2d0812a601092f5e905be385d2780181c4d5363034b02f2938c", - "6f06b41039054107cd68df837814d738db24cc3722026165f37ca61f862b9fb6", - "317a49e983ad1779aea71088d3a805644af6081f475934a9c878f0d39543e269", - "f9993d1d3979add642cafab3cf9b48bde2538287393ee14201313de4a41885f2", - "d9906365e048777ee1e7812c80f8ad510eb621bc63713a21a7d64a0f3e9b84f6", - "aeb5086022b81db765eb26ba45a90bbb0ba35eb8a8524d82df933ff676f9e805", - "6b4604d095fdd99593e1e0736aa5338218ff005c7b7354a36ef61db6e9d956df", - "a63d9b38eeb3e211393f01deb6964934284ae10eb12057742bbd3133bf2250b3", - "c74fc42fa47a4e7c82d467c8f9ccb7ec794f71d0b8c99d2b2ac18bac990683cc", - "becff265185d50c8b0c5bd09e94fcaf8777402ee660eeb768d67b50e55df03e9", - "b86c7f15b8cc5dd7b7b093acea4071bb113c0859897539a43abe2eb2892d146a", - "0c2fe802170653404b1ee95d2c5355e3ba10b3b22f628d0e2596735e5e1f2194", - "b42cac9549b70395b1af002916ab96b8a3d1fe3dc7bee26e20dc760e6f46db23", - "60c5b68806c606b8c415fbf45a9899ac4dd3b4f0a3d457d031a4fc4814a0040e", - "c086bee3d6a78f57fbcdd4b7f96b32ae072a300701a392e3c727d44b12eb51b6", - "83c76b11444d73ed017361008ecdad86dd472bd78e60c43d18ea062a1be6aad6", - "f5ae00a4cd4896015f8e7c45a69c76bb85a826abf138975356836fc8e497cf0b", - "54e2439fc6bc3e6aaab866a1980e4443b60bc16a9ed9eb5948a240f4b31520ff", - "098784abe9f68b7ab7e01197fb57e9143a1bbe937384b33894eebc36285600c1", - "6a428de940b2251f67678138a80cee11ece5a377fe52fd0082f0db1317617a89", - "445ad8a4be79785585aa0c842a3083bfa4e7dc04162dc74dfbcf3259baf37b95", - "3810b36535a3c80c25dedea6a9727ffbcc91db9a6239c76e4a2b8939613c29b8", - "21f69be423aea81a1c4f15be1696eef3a2c05d4aa110efe57056da0049c75954", - "ee276a1e44dbaabce944dee1163327b87fbb67da701b822a0af76026141ecd18", - "d15e020860327e50b0d51ab5726cc8a04541d4bdbe1a6163119b2f19a3ef3aa9", - "2466e2870b509ca43213338af4f72d5908613862975b612bca5ee22e10974243", - "03c067538b2fdc05023c85f4a80478d327b479517f8e46e54ebb83dee1745e4b", - "82eab71154bf1fd75ebfadc80e662c95f6e73087930c17703367a98f638c0749", - "a23988cf0982fdc17587f0fca91796d7b2e79e8f5b158a7d49eba3c9c295e8c1", - "e525ced3e1d3fb5f24df128c81c008f656a415176bbcc434495e8f720a2ee0fe", - "a7721f55820c8765b269d94f5198b6af2b6af35ba6435e3393bf2aa0f966febf", - "38b072e4dad0e260d76676faea77a3a444d3bc076c631433a841bdb8fc07d2ae", - "84dd77021f9f60ae1007b2a726d58fca7773213840b082eb7857516792e63b5c", - "686d81c2ce32501b42407d64166979411257dc720267ffe90c0356d7b10b014d", - "efd967e9c7ea51403e1c5f6617a3c49e5e5352ed0d4a78eaef75108ccee74cb8", - "5d4c64ef27fb287b8d5de11ac44f6cfd0685126713e867d3c28c90fe6731aca6", - "c2f6c86e976982afde4845ac6f185a1fb96e8456654b2f50211791fd67e9dd39", - "8218e2b833c8e205a5cc37a102f856f08c873c8c948bb85ad48ebe79f2056098", - "a8f50a304ef31141cfab97a1dde14da60e2d09758c28b3fe7f45a160faf1b8f1", - "9e7ed55cd36f8672ce2a23b31ab59d47fa06560c8c8af8c0893c048e8147c7e8", - "2d2d4d8c46abbe90a795576b486b1e29cd5b8ebe47dba00d082f66eee71dc7da", - "1a18b8606cd950ddb8fe10c5b07254f7e8f26a30ff574f26604d9f7a697cfaed", - "7326cd724ca321741f8aa3c028a8304878aec25629764dc35d2c041cc1b7be58", - "2ad3aa63a92d0d63c44a229eee90d0f319fe6f36ea9a470be31a16a13f744738", - "79f90590c99dfb6320eaaefb9e890eb339b01c8ac815b72223c8c3a5f6c2bb8b", - "e7ade3e78a30a4f35a7072f5722ac1631449408cb81221f15bcd571c9e9879c3", - "5c1d30842d19eaf5bdd5792263a2a7ee3f78c9257909f62ae4d0f6face2e4914", - "152c67043c926400dd9cddfbce38b337a898409dee75eb26b9f3f7e6084f6ba5", - "e9051739c1998a7d8085ba08414300f50768eb1200aff97f51feba47c7e5e6a3", - "589aef71d58c4dfd19595bfbe90da4fe05599f899131c9c0298abb8fcae3be22", - "c752d0a35148aaf7f46ccd1574b7b4788ad07a7edc0da29efb571fa2818d6301", - "6a2fe8526bfb862e799d614db90910d472a5acb54eb577edbf35e7d3fabab2bc", - "debc5f667cb5c738ca2054822f6cd0196a2d98f9cd697e802d3cff6bdc603ce7", - "d2ba8667d1ca7d9987a5dc74817a08c5391f1c9726d8932bc6e274a9ad3acf0a", - "c3787b68abcd25e1250bcbbf5ceba8c4710c1622b51b04dc484f79807c356f5e", - "65e48d6f8dc73b51b0845882b95e885c2303ccc2194e108b349da7f07b95d770", - "1abf98428e706df0d3542fe916d5c93336a2b45a14cabec215f7c3a6148d45f5", - "51aedcee5bcad3225eb99341afeaca997942ee58967be72508f3a649977c6f48", - "aa325c2ae58aca7945d1f2bb0dc997aa6597970b9553c25af05dcc90eecb3f92", - "a2435bbb897995c92f547254a62d75b62ef9a9053146a3a7d3ac1a01b3f46ea3", - "c31d7fcf393f09d27f741733675eae516fb4ceec5427be7e4dad2a918005b60f", - "ba5ffb35bc9d536b9f116f3265aa883198e681db76ae781e8a792240bbf92346", - "9702a6c1e946444c5d4bb2ca42b1ac376f385609a31143224dbd0916ea24aee2", - "d7260701434d5a3f718bbbabdd9bc17e97e4ff5a213d42e27399973b8fbc1cd2", - "c30812c30921e9566bb32d238fff11e2d05e90385405140ae5633a1083878444", - "26d0807da142f4f0552d4bafae2d51245d3b492034709a101659d48bbfc41e32", - "443116749560d6074fc5b8c271f1fef84ec4db98df03688a2f944b54b3da4296", - "f93f526cba8ecd71e098e542cb5fddef566923654219d315150675a487737468", - "c8c3b686fbc9d5c56d090b4ee741b7e4fd8c32c7d0482af14b91906aa1157c92", - "f5a150862bcda21be51fcd561cccc57b5e491f9479acafa455a6997a5073f3cb", - "79b8dc9f0a8577e413f11a1f68704f12f8cc2bcf8fcdafd1a69369d95af23159", - "1a28e7ed8ea4d2ce31513540c811c5a1092435f22d6cdca889e3237e7f41f18d", - "97476fd9b12fa60ed8ea2b5308845174ffb8b2efa6b2672eeb1242d9903acb37", - "71e8ff4b8bcbbb7b8450b59d81a6ba4fa65861d857341efe58a0277b989def03", - "fb698495607aeced4eb3beb0398511f62652360336b9c7dd3b7912fcc115432b", - "6a4924a3cc3b406a6e9cb74790bdd49407363f5ea6451b3129050202dea56c8b", - "e18f8c2c8c407292d6297ddf70b16c75e02012a28df36b8956d62b5f3c449320", - "93051155475962937bb49128c73ee848329502d5ecaacc2b3dfd8f20e8d7ca4f", - "4b8354e4e88be8241cb3db8b63a1ef7d707a3cc49c2850e9c5e85b06b0764157", - "e0423918d3e4c25223c1c2a0e9e8e7b0a6055c3a9fccf2c6deca25eb901d30fa", - "4eb3a942db5f5277004ef457d2584bda14acdc82efcdd843e2bf0bf8fa887189", - "92d00b38a6f625a43f8b807465d3f57879e9ddf7e96e814d19e0a55640c09c59", - "63d46528356dc6f0658fd97c41bc7fd83e1f44bdac187dfcf3e8632565f194d8", - "e574d67def16d5087e3c63faf6e0c54f9621f70230a4978ad09d9db39a8117ed", - "b00a492aca6e64c22734a28384b2c3872cd3418c32c1a34434e781cd9aec78f3", - "71badf38cabb98975c32e760fa3ff1b5970a7bbf5dc4b18d125f47d33980b615", - "e4cea5e7b1faad2b93389f056413f04305071e3033f0cfe2d136809047eafbf6", - "d4e8196a431616d2a9c08cdb8ef31563fa9395d55854e738f5e1adbb7fb447ef", - "1978231b0785a7aee6e50646e68181f9392c7f8ad3e4801ec1effbdc1d219511", - "a770430e13fac41aeb4d294e74eb271023861cb95d5265469513b4b0925771fe", - "99fadd23f3585fcd9ba4b64df141ee2865ae8d52a38bfb9b7a88f86b9ce32cd4", - "02f913c4afa1b124f85c7103ec2b3f0dd3829430125e12b16ac77e46fa9b7991", - "bcf3c75af730b757d3a39d26064221b981e9eda8259194461a851adba7deef09", - "528db0aea4bdef0e905f6f3e0f36fb7d98cdcd1b9ca24cba16525b082dc8cae8", - "e43f7d0c643fa7c606fff3c5d65cd287b14ae2b148e972c0614e0f50625fc019", - "d4add92e5dbe3f941c281403456a23bac04d0659a2cb0dceed523333d35893be", - "c723e02daa46bcc22886f8c68e558eb8ffff0c082b56ef518eaef19a2b37ccc2", - "5be1585c0301a1dacd07a309a7d12099f5f04809d494fd8e28af9d1a678d4fb8", - "7de6fb9cbd4f7b18114ff73d3fa73be6710628505af0107a23213f44c66e8e5b", - "4d53c86f5ce67dcf477ad12256be97b3be6d9cfadb22a442e27e30d7b290cf13", - "ef8c8044a091e6d32358e718209d3c7043291bf36542f37eeebc33a53144fa64", - "c4918b99ea7c6dcce2ea2102f575d77a261434a04cd20f86c4159edba793da63", - "a6f5d98443797ae61c8f7ab0692805f330f05dce0e3701fe759b504d778997e6", - "f5d26ceb1271ceac5a228ec8f44eb9f3f4c6a892efa5079aa7235c769da9b799", - "e3bc768d0328318918974005685b1418736906f1df62ad5e384f4dba45296bc8", - "6208bd9707c737c2aca9af9656f7bcf2f303d6dcb256b33c3f7a1bd461ffbe20", - "3472b5d98bcea331342d0ad9c194a0a9adeb9a2288c1499f88c41b5043dc5f6a", - "a745443aaec34172c50468ab6b72c2bdc18ad452e5891270c8b8680917cd8af5", - "5ce072f162f80d217e0f0f816625e3900c5be4569f306f06560f800785d5eb3a", - "38a82cdefa29f4c6b7faff70efd42392e22da7f97a2e68b7500ee96f918515b5", - "f53bf03e427bb1ee77f8514a55c0bb541706db197154096c5ce64df8dd5e9337", - "fd15d244b2cf22b7be16544d38d9e0237c439ccf3b8434f9da50012731e0979b", - "753fc0125b234f1271538c60624d825451409da44620bdb6893fff33c29c9181", - "d0205db15dff7de7ca1a1118d64ede2051a9b795394faae76f612f12befb2547", - "243870d95aeebf4f7b404cc89b2b3605cd10e4e4394d3ba80239daa8070a2bd1", - "673de48a84508e052c730e0cb8cd105ea8d008914c94d21a15d6a33a1892ffc8", - "ba132568bccb8bcfcb14544a11fe35a8f23d4e859d3e98c4c6460d8db247003f", - "c5bc01600dcf2d7e7374a76ee6bb46d7a4a4b34f230996b1a10fefe21fdd78bf", - "aa20b4589cf59de60379be5f82818e652215f367c5e5170505ced03eba8b176e", - "0e85fd3b7a1ba8ec9fedd1343a17dab732f6e82e4aab7b6cf93b9e1f313b9ac0", - "3545e12235bcc65fae2eca069b5ee8e1607c38f0b7e6b60073a31de74fd8bc25", - "ff8432c2a71a2e9fcdda0d45481d4a7ad0bfe5d1fdc689206e0c41908f50e45e", - "ec812b9304760146dcd80c7faf3b23f3590e945e894ad76e01c5bbfa03eb78b2", - "939ccb643ac1d863e9696e5e9afc3bd095547b274308e85a1c86a2766121b687", - "ba031306afbfdb13d017bf9dde60f60eb1f83d92771e6ef1085d8930f8c48012", - "4bf25923fc269769f5f353abe595315185b734499c541589dbde206a3f7a1dad", - "da14f36cc0e2a03126f29d131f8b7a28cc67713c8b2531602493070669b6b6ee", - "91f1be56077028078c1fdedc67c38f8dd166f845d88bbcdad5f4fbdfe285e330", - "6bc19b8be2bd3366fded4426481cdd08c6738747e36efcebbb58af93c8738c48", - "8d68e58dd5847858243d6b57614782225e4d30d8d0131aed7881fef06d7968ea", - "ba371c2484b30e10200bfa874bf0f32522fab9d5a862f20c0b9a76409db584b8", - "abfbf6d4fd699a42220d839e188f2878591bb42931abe985e168a4ffe7907474", - "f73490b1b6d7593727eb817b1155cddcd7d8b9cbf4fa373a6f462809c5f0a04c", - "0fb8b60b5733e5f26f23f8bd6818816f6c5c9051136c75d596cec1f2aa2eb68f", - "5dfac76c8a323317a5f84ee78c5a5fd6c9d5952941cf66b1e4b701d2c4ecf5af", - "b7275f63932f51f6f8738553d526c527ae1bebb4f2d991743aa5fcf563b6b302", - "aecd644a5acf139cf16b60d2556bd6e16d1f2c7b91d984f5cec9ce12965ac809", - "6f2cbcf6f6de547da8eb1dec68138d552961feeb112cf72e0603f87daffd7d94", - "9e817ebf73e2c1ef1488ee2c9ce064fb4dab945bd16171f6dfef082c0560806c", - "b1fb45c35c8b14ae56ffb605b5690c6c85388c5f9556c229af764286b4642b1f", - "45583f15bbbd5a4caed5d21074d32eaaea00d180a7ffa06f0684a92ba01bea12", - "e40ee7d13f44b622705035ea26345aece80ba916c107f9c07561c3aebaf4b9a1", - "a38e1cbbbbbf1840fde2ca3cd40f04caf2b5364520d4343dffddbc21e1777038", - "7c56f2e99fd46248db14b95a794bc6b79306517f9ba9688367358ff226c3925b", - "a49b031707f356dab385ddc857cecae7f853c596296e057e5ea08a2b962f269c", - "3b42e445b944b7a2eb68a4822c789061333c598c4296be94fcf3604df4bc8149", - "051d663350ce0ffbef960caeec8d3d2ea9a0a7293cab7a3da481af6b1201b0f8", - "7856bdca22aff47117129a6cb07222e8df16c330436f53323408e79da9053f67", - "84ae0774f76be54d68a69ed50f4bc966050961d263d387c8db338563553c8d95", - "06c381dac008e2c353f459cf176d9f58d47e1f0a80f82a7e43ad762a8e1c934c", - "305815829bafffd936415bef1469d8347f306e3fe3755711e29d395b39ea0eec", - "3d9fc4e450f490b58270a169f8ab62fb8212520663c1513c04b4df12e54c2bc6", - "32f787165617f51c633a974b5005b71989181f9dc522b44db6acf8be249bcb11", - "4607b214312a0130efded9680255372dfad8d7c2031023c00e8b6b6de8c92d3e", - "53208ff55c8b3d6ebae96c66e0a40d9419f94ae4bf11b9b55d728a5ea872d312", - "87c492175d22c88f584c3aed4f21cf05a4382606c21411c9fc96075319f7f636", - "72456dce7c6664b1a23a2b5f3581ac36ac3d84b71dadfacf004664f1fab103ca", - "0857ffa21ab559d97d093412424b20f54eb6c2aa21b094602acd228aabcf16db", - "230fcf5be5ed197868dec35c0d3b7ed0cf95208b695886890c6818de3b2d6d6d", - "5177c0252f5d6bf51e53173cffd9f1c3ceaa7dd34c085bd15782cbc9b8eb2e69", - "4b58d08a9b545c28cf6df956412fc3ef7e8d7e97c87de8b15b6f5f923b3739e7", - "74515df6f661c16c7f93f91edf590c4284874cc3954ab5c5e27e7c22766f2e3a", - "7b3df5be72f269b089ecf199b50939fa9dada5128bf2e1082402c51b4dc2777a", - "cea91c76b9556c6b0d6fb16bb0b668c5bd6d88e271b0121ecb2622f069d4bf05", - "427d4d17490c244a28697ea85d9c3ec7d7421d90f9db8c2ba6cd2d1bd1234ad1", - "e707524aeb644b0f140027b5f63075f38820bf711311d13bed4669c3c3781e9c", - "fc128d764bc03f64b6ff57e5255d1bba5473335ae2bef337f1e77bdcae6cdabc", - "846ab5f8670cc563d23cfe5ebe07f2b1139f5111d0f221b42b9bc549542bb13a", - "109a635bfb917ae8f14aa7dab22c78807058f447158cbab45c80868570137a5c", - "d142ea1f52b76598f6d7e8c75e34b6357b0cfe82951f67d2ac0e2d58cb6b4949", - "c1e4ce4c677d1080642c7c8bdaf14a0ee9e3d7eb75b0b2371981137b303fea49", - "554f6f43ea48e22554cfcdb8ad4620b82e6a356a02816fc6f07343906be81e0a", - "19d86f787254f4723a15ef96aa9baf0deb33ec7bfe8cea0a5d3e7d67ee81ff5c", - "8e15f678c33a463ec98c5278346b0f34c5b5063106ab3b82964ce6297ff4ff41", - "e10863ea823c436870fae141388db768a35cd4eec82e002c9ea36f710699615f", - "f5c491e1bad469e54cb1db20b18ccef49c2059b5593e928fcb87d9ed15f1245d", - "3b84b17f520dbc98c38b087935da4f80285fa3c0f9c456604916dfffa11f90ba", - "b9ab4946072c289a69fc056f9e24a1848b0e9738ad03950369231197318ba56f", - "67cf5c6939370bdbb2e876dfb7141a769ed2586b0c42fadd5d9b506f6d52aa84", - "82ccb893cb2b2357d1b6274983271a62d628c577d095a7a731f3fdb0346fdc66", - "a76ba9f4ea2b7ff1844b0f8659dc15964eed49918c18c6c2efbc2cc8de3b675e", - "34b0d3fd8dbb82847fbe0c2dbbb0c502734a6643f59d6a4d29488f4f5f11d67e", - "4a2dbd8d2f179ea53c6ae73fc4f00496412a1bef1a3d9e317f3770dc81b39813", - "3a204309afa2d8cb90f0f4008ddc1a36b777ddd86d8c5d9b6faed04cdc36d176", - "494995ddb9357bb3d6476da9463394780bbe8d1aaa7066554f3206d383d7d3bd", - "1762d9987c535e87d45a70be469e973ba5896819e231dc6e660d950d2536700f", - "8e5074a440e11d28efa41417d3b883efa46e3ac2a9e705398970f6923e57eae1", - "97abb8389859e5bcf09102deec14bc07c4022214c162614f1129c0dc16fe45d0", - "712c26c87b34d6818f8f7b28b0b271bab80ca51abe4da615c1f13a3ca0a469bf", - "e48cf0ceed2430045fc227419bc7c11e7e935a3ecf572e5842c4228f89f2eaae", - "f40416711d1a8c7ddf7c58027554f02993844bcfec6420a7e0290531eb4dae05", - "25dd6f102d8b4351510004275988985b3154edcaa3a8daa19d1105cd13ec6048", - "676c236a03c13bc60e3248576b8cdee0b0ec3bdf98501f97220b90c21c893539", - "090be0913b8a9e01a12e8c337109c5466fadc4b2696f4034e0e2473b8519b04d", - "ed269802d7a0786215f6e918fe74655e256cf91daab17259839612cb942c21c1", - "1185f05eb5f426fe324a76b3d20a973ee45eeeaf726fd75f1b7bd71a76a45f26", - "8480979ad9a6c9b44c1dd1bae5e51133a8a6ad206d59b27904c58fd582c3ff33", - "d0af49ad8219f1f0a345f2629ecf231c24dbb6edf7721b8e4c539eaf427c872d", - "8d75c137b1e2cff067356662e47aeda6431d052e9bd7f8ca0dce31d22e36c69a", - "f3928dbb53aa9f2861817f9ee5a70e4b28771de5de6b07e1f132945576b5687e", - "973a7ca9fc0f258e0d1d851d04d1ea43e170914f1e063ac6e67df8e2db6169c0", - "e78a4af9cbceccc8f5595fa150183c29dadd2aed7c5c8f7340b820291b7c12ca", - "7dfc56f1e7761a1355eff473dde3e07e7eb2f5a0482309cf40fea5605d393439", - "c560c497af71168920d1cea4fc0ee07f84a44d06431a739ab0e8c51a00811810", - "eaa0a7b3fb70f85c31b96e84aac851dc34f992c84f4d0bf41d5bbf067ea15c96", - "cfd085a1cbb0b65786d1d006e737215063ef0e5dae301c21f0729d8b9d8df4c1", - "967ee60e0b1557d7c687bcacb810fa75a61c72b93fecb11cb5ddce52965914e8", - "f713276956b45c09516fcf5e73724219f225e558041ca4bea6b0f4bc4e0efe66", - "1702ee00d59a33e7af2df4b348b17987b22190003c4860d6c7a4ad561dfab0fa", - "3a814d306921b600c39eb652505780c8cc58d82a8bac195339ba73f45ae29814", - "066f47daf87378eb9d135f315ab8f72e51dce9d117ee3bbde5d89b456e394686", - "96bd3dcd980a19e47f931fa6298fcffefc2ad82006a52410b2d87f1e92e818e3", - "519baba352efdf393bac8a1c829849aa0ef485da5f3b00e13b4906043cba3d70", - "9fe6fd45c6eeb1df02ed15ff0cb08eb9061c47e11de28a9ed3abd03016f5efd5", - "eed8a201613d2c63aa255185d653e5b9fecd7e30f54875004e368d4a0f8913d2", - "f74d458568172b81e346b301f91fd6aa9d5b783010092007c36f9044ad1a6b87", - "ec1e56ad31eced415838d8e02124b3355932b2d630b7ad4b233ba1fba2113a26", - "4e070111c0997a8ab0cb30bcf1f67494a5cdddd5eeaab117d02728c8104e32a8", - "e222add4e9c3b3878de1939ca23edebfd531fdc898749ec6cddcf7089a974716", - "6e3aa83ba9bd1968dadba2eea578158bfa9d552512d5e48479f2b1fc993bf65d", - "5a7f5dbc64e5a8f2eed2ae30f225e87329e81b42c172fcc7ba080c81e87f9cf8", - "5c883d0634a297fa8bba0475b29b4d2995f90310911a24a657c446a7eda56c21", - "89467cf933d3c062d8999d56d64bba945012b8ff2823de4f33ca29b8c3ccfe5c", - "2335bbdcf5edbf7f910357a3aaa51e1b43be09f388ca07b1083780f38d5361ac", - "cc8ad30c2b2de70b0f015572220cc7c7f7153189a00840f4af53857bf4d2500e", - "9e245e75ac8dcb515a2750644e6305061fa09fb4ce9e5cac4e07d7dab05b1af8", - "38d13dddb40901d41efc0a21d2d71983af3ce5d69d228ce492e3b52c8d930666", - "2a961ff8507b2577027b2bf74cb7663b98d5abe7f1691393bfce38553c63400d", - "e6dfe535ed41d481b4afdcc4a389f427d48d61c063a30638ad1af1b5bd7b2075", - "66f8bff1b70d321af71f0ac41664c3d6059719858ed060f601357283b0b0baaa", - "5e89382d764e7d10d2fd7b5d8f59f1ab13f7b1bd93518da65110324387449214", - "916ee3b7d97b2686c19dd5a5d93a5bc24c010c6e14f05a15490858fd1438c9ef", - "4d07d48e26ca61d6833cee03ae4ba4fe1799c6a64420d37a8c3818db02af6d8e", - "4fb51a66cacf4225153098e1f0a24b3e9e6ff9f9ca55a158e00bc7140ccd7056", - "6ea524bacc157f2d6e361b0e7b41eb52b65b0c8c162e391a5e8ad83adee7216f", - "8198a8548ebd836899e3cab23d26147a375e0579d0f6c5b874d17427627a8448", - "ac6ce4b138744303eab9c67db1d0d08f116a0dd0a6856727047f7cf894f35acc", - "b8b44695a54094b97f66b6ea1cf6f3a8299b706c95a4841156406c16ac8d8527", - "d68cbc9e709a64cbab5b91118bd7d33362bdcae335c99f887010cb6d3f71a6db", - "e7374907cc3378f388f7317399b4e7c1140c0ff0ae1a37aebf8a18fc820a64eb", - "cadb83dfce3ed449b9d3c5925e71d27c986e76e8b3c38021b6f520ce4c6debb6", - "0c54bc8654eaebc046a68b208db9f0642d6f6ec817147694f6f7d9428be55700", - "f24c31321ac51646115ced1de4d6209f88578dfadd038db5fe9950ea2ef9ec6e", - "e23d4c167f8c823bdc2edc6696ed21ccd9c31acb69c0640139dbf607ac914afe", - "6b3d55384e0eb296424d79295a6a365f7fded1683473a0fa4aa40b62f0fa57e5", - "8c5bfdc797fdd104573e6c9a845bb3e93ce218b0e0d49a413138edb9747846f4", - "ac3b4945b7a5664b96ede8ba0daffff4b20418d0d9d0b22ea0bdcf66a1789436", - "36043f01067914add68c3e247d22446163ce202e4df6f6b03660d3f310e75c90", - "063a7b7654625dbe3bf9eb6b06974293033b1a3e7404ad24540644517b19d817", - "54b839f2f317bf74668f52b488677cc239f4e74ad5c88f5f3c7c209c8dabec56", - "d37768a5f24a3d8a3d73e76f4abb7ba5d71a1069adebdfe84e7de99be9423609", - "cf1e02e0787600310f8415259d78caf3f55304cf18597d16f2f8a27557cadaef", - "af37fe58a025d07833e2b4e80eade03cbf718ac31845570f8ceb43427372bd3d", - "657de5153a9311dd90aef0155c7be9b626050121ccf53db94c58aa3af5a44971", - "d0091e4580148b05b4b045bf4855586f3021c6f8bb2f50b931f692960b9b0d16", - "0549922367ebea758ed0a904658ce5f4764c5e3b28dd8f1ad7b199664b2cc8f3", - "3a1ccb1f48615acc2be746a97d02cdc4e6364ae9b4caba6290c5cda2750a1492", - "982d952a4f354baa3175a87754883066f059b0e79a1e30ec28ab7bdd536c6ffa", - "c77a0c36134aafccbbc56cfd25500f4efab325b8074db3e02550a3466ffd5bd2", - "4a2ed1ad114df2bec534b585f2e77c4d4517285508cb68b2a0b746ae8c6d8c93", - "5ee6966dff4500cc448a1da21712c86f961b923340e565f458995149fdf469cb", - "99ed7a20f12d747c792192a02d84e8e7de8d2c21233750c6c70b01c26b09ffdd", - "3b4199d22fff4f40ac88629297927c061631822901738ec0de3111d0ca01a938", - "6be66ca28ead0f027cba582c6fae7c06580528f45a0c72c56db84f99e4bdb98e", - "14f8720f3c065f262d41dd38579043043dd559200b8664a88f1d947df15cbcd2", - "473de6bfbe6f283dc064d8db6baf675c43bad3ff6b72cd82b2a61602457f1a0a", - "36194c0403abfebc3033df7575a87c8ef3cda057ae5b02ee16432286555283cc", - "144ba8ef09b9f602ae8a2c18afdd88c59349041a3776423d5f61f6cdd4d24fc9", - "2f527d955664355766dbc1680fb52f7d1ed45290e61b9b1cc1bebc6dd33732cc", - "b556d7747482330e3a44e5c802bd65c9f9adf23cd2a6b2279ae0c9ca1351a84a", - "273d355197a8ae57aa853b1aa47ae0c19b9d54c9a93187fa4d2790743fa8095e", - "cf64902e34396848893f0cdd810b7b27acbedc284c2aa1a64666318450881555", - "4f420b1775e4e2125d05d83fc52ce496c6f07bdc93587bb1e4d3aea546055ab5", - "a26132c14358ffb04dc718f97699dd034026b56d96533b474611bddeead46e0a", - "b3f4bfe19e3b687d29a3a29a60de9dfc2666447270225e711e1612c490e1b0f1", - "dfe495ef67665d9116b1c6e4e8742094fbca1d02b158f41dbd1c4c265353e1de", - "0873e4c76f1ea403c556222e688be27106e8a5574fa33c5509b8598f3f648acd", - "d4d6d4468f487f94483cbb8b871f956726e6d3297f7dd5f6523b2359c137a0c3", - "5c9168b9d6219d6468b8547ac1520fea918e5ef5df586757bffa28ca1e86b83b", - "20dab50d7203b28b06c40aa464f4460b4fbb52d11b9cacb232259bdda5ec3330", - "5b019e1ccf40e7d49632cc544cf41643b0cf5c0de95202666e2a2b6d96fb9edc", - "855ebda7a3592d5dfa91b5a6fcf84a89747823b39454bb2f8b895ef63c8585a9", - "f2d02152fff252a0443f533f153d504440deeb4015c244c24603357a109aaad3", - "35b2df2a206457cac6f4082190043936393f2410869608207c2ac345f2ee5a57", - "26578d6c8ec59a5e852c458d886f49184dd2ef9344edac70ee8fd5fc22a83e35", - "270d7992e87d4e51f3e0f1644a0662d45acb59bd4c5baec03cbc3b57873fd933", - "fb5bd2afe7369090642d61c2e8176849c5e3c583a31358f6fc9f62e4b6eb6dc5", - "4d0eae57ceccff513792d5e69ec740e73c60d5f511789939256b2637dcfe7032", - "2c7efed5c7e66d60bd01e546bb337cf9ae133898589dcf6fa287e177da559df6", - "92f4c271ba412ce8c816bba02b7874f577379cd58af818e130aac40e318cfbd8", - "e43fbfa986ff74eedf6fa8d0b1eeb0d045bdc480e7a9f58cd70deaee3dc3840c", - "4d0f34a43264a21f5482d803fd3a0f2e4ab3c9148e6543fec61f07b5d5bb2221", - "532b547e5f68aefbc466bdc23db2796a82276c0be2eb90568ce4432dea5d9918", - "978a02868fa843d48ac61f518e28126bbccc79989c7e105527bf29ac4a79a9e3", - "852955669b7e3076a87281cf46bbb29505687ee671b8b3cc5ad5d1c7cb903009", - "33c0c7c996be1a7cdbef504f689964ad48354e1b3cc99333d32fd46c3ff21b05", - "e827a781a633f8fd35032b35195a1c285ee53c645f98a4249d46c2eaa340d78b", - "0baa2d42be7a669fa02ad69286dc2e1f1026f54f957d707ab1e1d989344d9118", - "afbe0476e359c5a1594732f18e7c116f6b99b84262e41aea11efe4cb8c26b182", - "8a83c5aa45f9c86f9ed261a606d4d40179622431527c7f2e8613af7c4200d4f3", - "8b28b014ec9f810520d4c967f82815ac38fc61dac02718f4ba61390e2727dd96", - "44bb97f9cde2e8a30c40b29ba3efc5b6cc22be188227883ef0986a2db2075b96", - "3c7f498eea8d8963edac0fe95207d89542907ba7641b12e0509f13348a2c894c", - "f446111deff0c710c719e3ef45d6f7b38294621994251ba5e359f661fbd843fd", - "bcfecc4d1e8261b8831942fa787b8ca5e26c5b7c21e3b875f9b8f373b06453fe", - "55e5d25b01cf316eaaa3ef56e22036ec46a476a93a0921de26d32443d5c62cae", - "bad0a443a928f90b5f294567f717ac602c3c01de83769f0c0fc232b6cb57c68c", - "ec8aa6addfccddb22ffe7fee3ec98b01138d6870b96276cbd5c2ba710afb00f4", - "a5320722dd21fc05b7e136472b0746d9e8a2962e30744e32b2199a1fee16c205", - "9f5c216372b685dcde90228bb3bd8c553332c631115ad1b343f5df6c637b7618", - "b963e3219f3887f3708a92e404a585e2699d0820da69a4cf3a2a8280fa4fcd5e", - "b0d5d62fde537ea49e7849ba88638fb3391b5200b6f59813404b658bfe72c64e", - "4f913ae8a051f75eeb658ca17b3a7f2b59808867e400475028fc017ddfc29a20", - "94b3662b8bae96523541d003b342ce8c4c2ae98f692e950e4c17db21cdd9755a", - "04f5dbfe74459beab4cb7847c76a62ec26093dffe2459caf4f122e88fcc5a1e4", - "914f145ee55a4c5f4f5001fa66d8481931a19303a808ced8f425ec59407d1485", - "828bbd5e01205c3372aa9e008cd55aa4b6a493efdf6cdb30d3993b762c804068", - "2725a9e2af484f25be1044b41d54f750449a5d3d50eaf6e4009bdc891365a291", - "0bd8a24743c92eb581e728664a7faf17f6e916e792a3ea17a29b590ecb858bb4", - "ed70e5275b1b56b4c36443c8274ff7bc5df04845a4f65c8f507806484d1bb3ad", - "c8080f707bdc54eef90a408cff99fb6a2bdd59d92e1067197414a63002d2cacc", - "f5b2db4a6b8ff1bb021821541749e75d29ae60953aa605205ae2ce35aa25a630", - "53a673344f8204c21e4985e27c48673e4b00c7efc56b0e37d8d2892fe8a3f52d", - "46818e0952a1433d781e5ae356480c4e63fb9bbaa6d22a3b78f378c4aacad29f", - "aa0e29cde1ab97783a9240b88632c95941250cb89bc23727a333e629029f49aa", - "3a9acf6bfadb99ea548dba4ea2cbec546098200f40eef647f1d9ba9575d50394", - "bce4f20a1ca8a0bacc8597a031168d064820f10e4ba55ddd127cf87ca4419bf2", - "0d18b7b3846c474a318ad471234cde0ef0c5027ccca1e5ef81ffc0cf5341dadb", - "d16af5332d82348fd9379943cadac357a880e283564ec74830dd6a3dd00cabae", - "b150dffcdbba679d8004743718004caa1909906726ff1806ef9f8b1805476a8c", - "8a91d62313f4649aaf3148cd40ca1f932e190c8f531d6ca950f3cd85ece88dae", - "af4552e958b35ffb029e317e34127fec8edbb9f38f3efbb02e77e22182fd8499", - "f0ce1563dafcfaa483ba3e701551e8d466e2ea6294b345d7606699cd57ae88b8", - "4ab24440d9dc56836ccec2950c71970820683d1872495aae3b5b6f6e3e017c9c", - "133cedb6cc887e7a33d7603659b21ef043a08dea30a52512c0c3dcee2f413b45", - "c5003577642ecb08337f549f7eea2a1136c0aacfc803c85a1c6b65b9499af9a4", - "23dc6d77dad2f36220665df258e2e8b1dd9035470cb9f376cd644926324b19ae", - "9b7753325bb5a09a120298d3e7bf9761db4b93ca0cc1ad928b721c9537f0b83f", - "3ab545184ab5e50534531fd693e33fce61ec03981793e90169b6c1fb484d755b", - "82eee24b0484af024b0257124d09ddc95f83e3f5dbc9e3699c5a1ba80acba219", - "f7caaee56fb4272fcbd60a631d2572ecfad8e548211ec0726a9e64b3d3e6685d", - "f83c4b1d7d4a5d55a22141e4b64c8b8a73cc1baf21e34c9fdb18ec10ebd78da8", - "10a87b415ccbeab52e8180ea95c17f3e68907f93264fa78ecce776e0bb895968", - "24cfd060c2df8c72c219955bdf94029c21e99acd6a715210927480f0b51164c7", - "ad53e9f6f56236e8e3984ef05032ac8193777838e3572f8f3121e83c6f739e17", - "d0b551c5a8926ff46b9f2e7898ea4124c845f0f460c484b1c29931a0e66f6189", - "b8dba3280c7a4251a22280f1b3f5358492da2fad03cdbe8d0c71b2c738d35297", - "a2165b08f7a25ec7f46f35d99af694fb2fae665f871e5965b10137b58219bf28", - "5173db2cb2ca9895bf0bc41625447c99725108aeb707725e10fd8a8e5bae3a8d", - "e433a6d62222c774dd31749aa78ecc2433e258a274d4bd0a386bb18c8d6cff4b", - "ecd2b1f92bf2ffc4da4ca735a78e965859f6183ddd5d643137bbb4264bf1f1c0", - "9f19108b9343b93e3a991d89c45dc36b74abc33a4c4ff6ff38b48b9e32e85cfd", - "8e03eee36cd2e7d3c73af459db616a21c81dae951140de18cb0dfb9815a1e21b", - "2104ff94f571e7b41d92a510ac99b70e3aaab508ff5ca00c74818d87a976d5f4", - "9eea9491a2b38bfe2cb972a1614f81795ce49420bee3891f788ccc05dc45c433", - "9be1781c4f26dea563c1d2935125bd8a31ae279b0c7bae864e3dc4ad7e3287a8", - "688753f7f5e238ae8710d6198e10ea90a02563f5853cb4ba829ee57fcef6ff75", - "5e5f48da1aac4aec079ec4b7952f0ec7968e309eb66b614c451d30a3bd3ae6c3", - "0995df0e32d9ed62778805fb424fa7a8d0892b37be6c75739192f22fd05fc115", - "3f156f378791f70e6402695dd6b204751906d218f8a3a1006dd65be5e456b099", - "c48e7e054bb5abd2796117cd16c41d368d3a22224cfae14ae05dae990f4c6d9f", - "9ad8f1aabcadd10a47aeb3e689dc0608073a00d582ae2c26b454eef1e7d4e068", - "05aae9565375d386fab767d78f8e0e4e75bf02f5c544957cc11b216e26dd7f47", - "725f3fdf01bbd33581dce10e4c87e32c3e7733ff1659db8ec7a83a9470c0836b", - "c323d72867d6d771053064884a119dd0cf67cd7b6ee1f10c0f45e75dc4a6f337", - "efcd4f44ae44eaf555a1797a3cae5b260df9ce3d7330ebc692593a84bcec2ccf", - "061d15d7c6bd727e29336e286de65da6f2426946181180e8304fbc9daf2d4824", - "773780eb01b4293b1d53d97af2df3b2b26ca3432973e8482f63be94ae30d32b6", - "0d836dcf596ed19d8bfaee4db3a9ade837b76da8cde42f9ba8ccae0d4002f59b", - "3efd7f14cb09e7f33d56d54dc107801bc7f7b5c73c51041d0f858a1287ebb946", - "916d3a94d69de2308535c1c7c0e6e5f2abfb339e0f2fa703d7b1415457f806cf", - "3ed24fc43c6b2802b067086115520e6d96ae3d76b220a91703d0f99283ac5f49", - "f6267a0bad4f68bd9616a99a01d777f81117aa16f4fa3b22f8390521b7927b6c", - "f383132ee31b64373ce57dca5c5df0779039d93e9497de9dee2e1eaa183f18bb", - "dc851a898217b190b9c908d48d8fe68bd8d125494c922048a6d6b4022f07b4f9", - "9afdd6efca3de006885b42d0f5fbd2b4c0c4622e47ca6802a0a704112150f7f7", - "3c26bdace7dfeed8dc18d72a1ccb578bdc05457311da76c3ab77a3c860ffff31", - "497eb31cfa9675a2209098751abe7f38977a4bbbab7e59461552485b562101b9", - "9cafff166019cb830e8b71fb1009762d00a2dcd71ad256f2975f5137a2fdeddb", - "e5b00fa75dbef223c7725803d8299890b2d6d9d0fe3ef4a710843f665e44d161", - "3d05930cbc8e74db533011743cc78b975b90fe35873924e3a11e5d03d085ef36", - "63a274ac28f0e0e5a88fbf1ae529c6e053440ae2e7883418ceb3edb797537d79", - "dc4cfe69c396c430f8f2e9b0bb83983a20f724b589426b21249a26f8255b453b", - "1951605914a1b0724918923dc9153c2ad328f4f75457eb9e882d3fc0ff39ed25", - "92fbba34f264d1b8fecbf32751c8b4969e8628faacf417ef03bab38209e45eb0", - "9ca11b16cd55e4670dbbd80acb91166634ed136067d2b24ee9ebc06d7b6f1f51", - "27e50ee2822dc4e055f147ae2a6e47956dddb4df15686b7e53b81af9a722c6f7", - "39a3834664a64e11d712bc369ded5b4af357635daa4abb58cdca573ee35d1c3a", - "29bc50aca482b90a2738948d2340613c4af6563c732125bcfa1cbd5467f40d37", - "8fee8a3c0bf5bfbd142c5696fac307ba2f472145e8f36a8b284f11b28d654184", - "d8969556a54985a5e5cffcc910ed89cfd5f72c3dac608256480c9a294ff8e696", - "6937498931e4fcbc0424a3f6672145a22148012eaebf0938b35bd78a81e62245", - "1094a156b5cffabbbcd9ca0c8d95c5a01fe106c727d5a8f14220f8f160b9e993", - "c0e7c67edccced061d78f4071c7e862c1e2371d654d1841d8b2411773ce31ba3", - "250dc7e46eefbf139d2e51f485c47d74315c8f4d9b62eb8134f8b32bc4900dfb", - "d6865c62867e228b5283fe81bca9a3aff8d9003c5a0db2f888331a7f36f9c555", - "e376ca5b89ae89184b6f2b53d925d59514b25847bb2cb323739ae193ebc5542c", - "5e2c4f21b9f218c2ab9f05c07c6cad1d092ebae89429b0f4af21dc6985fb442b", - "01b1a24a0625e9c31a0a60d2c237bb72e943f853c1aa80e82346d19c375e0a0c", - "4a21b15270522d057eee2cb1a5541f331d543c3f83a66d7821f9208a866c2db8", - "1baf09131599d36c0e62c42d449d86cce882f7528f2e7302fe2758b1a7ca26d4", - "0a0f0f7d125b87d809ae9529e3b80021c52824da43504959bf4c0694ede5fa70", - "37f34a6de65b8d1b252b0ef5a40a9747e78b4582ab2531684220c945a057ac26", - "a7d19668bcf4a2491e1924f0bc65b98c33dcd0123c92b0ae4e608d61004b228b", - "6a1ba374005ebbdf55ebb82be43600c3ef323957a6bd95826d77a355e722fb25", - "c22c411d1b4d5b6086c2dc8ad89dec9297f75de0f737a484ceaf9efa882486f5", - "2344d00c256f7eae17cf42ddda2fb3ad0071a550f20c016de363d68aa13c4763", - "8c361f57dd4a7eb07875af04e9e49c4592cc7e02f9de11827566bcae21428755", - "608285854b06144e7058b9a980869a8a9d2fcc49d72e7d7fbc552af2afc0826f", - "50d75c576a6958c68cac7ad347de11ae1f4f18c98e2cd5919c9ec6e878608061", - "087b2e371d6a6bb3007ac70a4c540942f876c8b6abaf7503ffa8fdbe3a7d4ea3", - "27da2b644b520f8fcdb550f56f7ddfeeaf6d2afd43d7f1c90e9779da2b69f5b9", - "9219e33309dfe21903ec235cb97a3b9c5565776b0fbe5d39d6ab573d9c11b011", - "d9121668e1695f944f60be722c9801cb8015d6b3257640ab693785a59c316b8e", - "80b85903736438e0536a0b1a0b9b8e098802a1a7a3a6e6c4d604b1b70bd53db4", - "46bb069df1efa8bd326ae28c7aa4c001f0021f30908cf17a83483d792ca16dd8", - "8a982ceafc558e0af8d092b4eb3362ce0413201608272a171d287e9f9503f877", - "b75279bfa101c49ab21ce2c0cf8a1e1cf17e9901a700b2d7818e5e0b5e6186cc", - "f2c44b8b4138f60db2284d7552104a3c4deb63b61ece75124e04e6d348507ce4", - "1afb496c571f071b6bc3e7c1baacdfd24ab4345e15667e4c353390009b8fa6db", - "b47352b60f782cbd624a281e437d57858a04cb22d9c7fb5a288fb2c8ec447c1f", - "f545eeee9264df7c069932dc7f87d00bdc5d97666a2ee8ce00882f3301077d3f", - "fa510531f2273d2d52f7f6b8a2666e14ec4383fe2f2de47e9192a66664ac75ec", - "99de7a69b71af6d3606baebc2f44c68240b20bb3684fd7e4fa983d050e03a34a", - "795872fcc9bb71591633786445e3e39cb1c4a03d332f3cba52248b4040820ee8", - "db618b2751b302f9b2598a670e174ae7d253e340458550b815160819ca2612e0", - "78100c0cf3e61c1e38ff4a56385b3a61bb7d8cc5f782047264824a050fad0b78", - "24612178606223f6d91bb892ec1778853390dba019688c11e0474b52582c766d", - "525fffe35beeb56b4dca4884617a7583c5f02e72d13a656f7f25ab4dc4cafe34", - "7502776e1cb3499cce6a732b763ec82f7d70050d890ace7cde00f4d9b1cea4f4", - "5da5aa6afeac8524e3ec7a829081ff60b9e90cccac85f9f8a9d4f42118db83d0", - "f1115a5894ef4e0bfee86cd92e7c9fa181b1b032a16ecb6ad9a0a820869baad1", - "5e2ebc257b01d79652cdc28ac2b5c26f80e4f03df1f83445417fe86c099e3704", - "bf30fe9d1f09f9acb619fe7ec4c0b02dabc62a3bc6372f691872d5b746be9e93", - "58217dcf2d3ca411bf589476b6e75bfb5194e524f085f1c1c9622e2ea9b26d9b", - "f5341af7b2fe47b2054f14a19648f08925042617a347df23fcd25916c72750ae", - "343723706374d75279bf5945676e425e5f03cc4e22ff2c1f0a523af844ec17aa", - "6187f264dcdb878f6550973be68bfa4eb469212b430b490e492a4300486f8b1f", - "9381d324cdba565dd2d3df6c6849a58e7848848748bffdab384b4e739f097230", - "4ca44bb0b3528cfa30c3a73dcfee3c59da0d6197644e6be2235448d5524028bf", - "60e257f6d4e391663d9f9a68b31f026f564518d4e6dfc869a535f4763a1aacb9", - "8bf84c11bacca87837dfbfb637ca9e3157f73ab42cdcacdfcf325f543faeddcf", - "064f017cda9852ffa15deccb9b4d9841ab08b3348f07054f36eda0719da4821c", - "2a0e89d3138f0b60ea4c5d4c6d7bae908e596dfcce28141bddf9ed2848e5d434", - "661526098ba4af4f6ca9fe376063efa293830d4908bd4895ef5fc41b5b0a67bc", - "138464c87d57a1dc555b2d403b438cdd7b657e106190aa38ec813c0fca026de8", - "d17295730438b9218c51f6e2fb23db324018ff70950da296f6da9923b45a4509", - "6a8efab560f2995ed4ff9f58ce9b0a884fff0b7ac60d718e59106c4e0c0ec412", - "b382d6b7849b59bd5b31562a65add09d61470c0fbacc1f2c3f3e537759e5b601", - "03bd370bbf5e3f299428eda6b3473bd38860522dd53a4df1c0ae84fc9ced47b4", - "0aecc8bba3da7dfc43decc38b8fb4f2e290316fb9d66576e4164c79e8ee4bcb3", - "4c2ad4b0159c65e7b254acad12eeae89034f87d43f1fece2c834b26eec5bf469", - "00252d5af6e54ef8234bff210796f7a378cd6a18ff41939dc64ea3f7a019cc11", - "8c11f9c3430886ebbeb1913f3903785fde8bbc412048e15d51c44f5098a11b17", - "3a6e8ae75202784063deea27fcfae92eb9c574f5f8aacad0e078c0d33eb670cb", - "de9296a09ead6ed677fba8e9b9d5e583c901ad192b037020c28d93487872c3e2", - "9760e934c3e8dcfcc33d7ba35403e6f2a3fccbee71fc6a8e8534eaf1a8fa920e", - "8f5fcb10c3c547c3fbae76990527b1205fd3d051c60ba9ea0e12faea7d44c7da", - "2dc3ace63e8d149cacae71c26b863df84137b6d4fa9c34de88d3e1624bfe59ec", - "cd4d93e3e01af9c35e73df78727fa8a52934ce59845de1337fc344f74d3b088d", - "4342b99819ac4e4acf3fe4e2e5ce7621cd6ecadffed2f772d2df1babad53ae00", - "794bbf927a0973b53d8d9e446e106e2d89a51a310ada902bbdfbe8ce4963b5c3", - "3aea5c3f00b8e01dbbc74911963dacbf112d4f2264e735d585a02e1bb82ac668", - "a1eba59c277f87e1e46b1716f0eb41d262166413bfd6f04088f744afbb8adc55", - "255f4f238b2c657d60b159f73839defe1f30c95ac6b3ebd22363872d80d4a136", - "d88ddd9004991f33f9e852013ba417907f85fe8ea5b7b484fce376f3093b36c0", - "d6ab1748a44bef0c21dad65f447c79aa4067392809f91722501ff66ba5e03526", - "b5652ae5f7c6f37ebc382f0e4ec27a8d6389d3b2d96dabf6fe9ad4f5e1fd175c", - "ddd61fce5c4a882337327c584a503b6c3e793c7a8e4b8f0f1271510cb3afa18b", - "ec886edd3b33f3ece385735e9c92e1b9dbfbc150102b6b934587091788e4a270", - "7e4256af49a5afc81cb38ee0550cac1968651f9e1c2e65921a1b522114c37083", - "d6e8718ac672873043832ce1cd625826e2a0f5738fb00e9fb212af10d9e4aca7", - "6d91495c8cb2947db99963ad528f10cf50824d99ceb8c5d1e2db764b3776f823", - "ad1b574ff055bfd5df03bf9b77e5474f134fed13173a8d4d64c8b2427f33bbd3", - "8f395949856bb67f27292409018788b33fac7ebe9e379db96fc7b0690f431a26", - "47c5ea6f0e8ea6e648fc6119e22864f7341449532a63989ecb59454d7e856981", - "55e39e7f818fadc977e50b07a24d9d159cefe34f69c8b99f6fd6bdd311917638", - "54098490ab744408953dc3c16a2324d1c98dbd394d344d4320c559356d63bca3", - "ee17f609dec8f19f33595bd331835543b9e9e7c5450746f34093cd1c559eb600", - "0d02129bdeaf77ae2536895871fb2e85248f25c3139874331eba48d2e064f02f", - "19196ca4aee079489cd7d7f9c97ea73aa3398e590b205ff808dce77260eee71f", - "9925a2a660a8b83c54af98004ebe2cf88d42d117dbce936b4dc09a3e26ac9b04", - "b95b8381c6bd0ef1632a42020d730b803ee836787442c0cab7b9f5abff54ede7", - "4d356593a181aef9b47e57aef38745ffde397f015056e794ac400e7f83168bc8", - "5ac2fd968b8800adf7d31a2343836809714e7786b44d57be5033bf293d545d10", - "3350955d461ff6ec1930254e849891ebe37c9a8768856cc91b5117cff1749c60", - "e85a0f7c66daecb89e7a9407e8061412ee3066441e7ae95655a42718253831b2", - "a8c0999e7ea44dadbf4a9bc66ddda8cbe8cf90c0800bc7ecbe303f5b73c46d91", - "b058a25f6329329f891f648cf9cb8e99513e825cbe01d4438c32f0ee6ecadbe3", - "d7b911008c0a8d878e1049ddc135edd123013193898f0568eeb4cff90fc75bb8", - "8c18570c257d6e4436133539a6a314f597e0ea1ee43f0ec331f45a005c425bff", - "97928fa4c34c24a00957ff3540021bdc5e1dbdd6439a89bc30ffd1fb9afb99c9", - "04f1fa6ec524c0da99c9adc5a68ac1adfdb5fdd70c7f3d4d668b3d78bf67f008", - "f996c12877abc5683d76160bf76b6fd24ef259258022d44de8090b2be438336f", - "37c252b38c5a129d8294f6c37652ddd44a282484b1feae5f8b9520d760f8a3c2", - "bcc3d981a2975c52fe6a0d09bc1f59c17efd58ecd71117752b05babebca7b7c4", - "0e2653c646d17b06d0efb3359c96a39aac6a637b5470fbb78696f32c17847a78", - "6eddb088dcabf1ea109c682672c1f35bd245c69c67f54375e83b830bb941fbf2", - "c0028afd0be1fe0ce185340b49d44bc12104f6a7b06661e1dc36e4f7be5a78ac", - "bc6cd11b011d4c9613e0e93cae585c2e78872f912df0838723ef60e47fdfdb1e", - "8c68b5277bda5fa6698f6149c0b47a14e019050f9b64c42888131083551a9b25", - "83ca34ebadac148514feca9fb068e136904c3aebf57642ce44a3c3aedd908b7b", - "e80f6afef8b74e010f0e68b00659a8761a7bd960ebb96ceaf2b354945643bae3", - "1ff95ca87852b6f43178a58d35badfcb05bd7e7e9fedbbfb3899fc6f59c06b08", - "5daa6bcddd5c558319c3df7b3dda94301744677bf3410178db435f7936272ea9", - "b3851a6334a1335ba41939925b4a181c8315ca9ce8ad09e4b9ce74742b3cc9a7", - "fc031ab48dd93eee0799c3fdf22b8b13990d4f22def20f761fcd61c58a868e90", - "94d11649dc38ea8febce1a22f7f0e05ba202fc8ba7f301b4531a811a44839234", - "e164e528dc264b6b065029958d524e0dcf0829d78c21c675da4aefd8ee241300", - "61f432bffad6d942fea92d4c201313121a170bf5756fe32af0194a254a94d672", - "6f294dd8b3414d1e724b7f1df23bd1b8be2d31eba91abcd9f26c749ceab942de", - "69c7bbeb632aee6285b80546bf2d205bd8c78ffe5431e07d60234098eb7659d6", - "2cfc11fd2c91ffe8b9fb8e1ab372894d2b99cc03c35cb613a1b71074bdf1259d", - "224160368b49dfba017f0a15c4f10014e189834b6bedbdd726d5cfe8d9cc665b", - "82af4b28e8ef4f075cae263ea9d3603c46f334a325a76dd2c5d32a6ae76d59ee", - "3cf10a9692a4b2c301366cf1a06ef9fb109235c9a0cb4eecbbe208a4cb644ca2", - "24d2d7da30357c5f11a5a36a622fe2053a7390714717317b56e80ffe68188284", - "4f6d9cfa96956fb04c2bb5511cb876cdea09c452045f1c01b2e4d04e30cf8eaf", - "02cc7988eb854d05f526222a26b6566ec3f392d1f9ba6848e541ae545a613ad2", - "76a866b909b4b3032a4d29409218166f3e1df1e50dd336e16ec0e1b8a3825338", - "a6aa57e906900c88b2da6ef5625288b7a2397cd731e1a1032378460962ab154c", - "5f581c8284fdb598258b9eece5af3d372ffcbad7a9f756a35cd686569deeefc7", - "fd6d184498a174c203d4389d5110b12db72c36c9814e45ecdb0f4a5ff769579e", - "623239e9e2b87c0a0b41769863a495ac74a5002550047c540e96ef67e211ec56", - "97bd2eb6fd4a55bc457e2cadc350712de72f064d49b3e9ba284a3c8c6874e9f7", - "41887c385949a49df8a606c1a123877c9b2562231bcdec2473aff478f1a132b0", - "a7025c819485187359186daa6d86af3456c52501f93904ca6b6c6f5e424bcf89", - "3b207e06a23d52c283bd95866c93e918b67b838c4f51112e2e3e7269beae31d8", - "29d642de5738aefc134f4f1d838231cc103f3b598cc30d094143c9816f85c979", - "19fcbdf65f15e86db125c0fe195735b074448a1b2730c703dffd3e84064e1f00", - "3e48402fbf829742f73047b02bac261227acd1e31da2e75899a289049b7ea4e0", - "19320fad66105771c701e4f266c58d1c32e9867952906d51c04b304fed45e690", - "358afc32b710b54ee9172814a1f34abead03b3f0eb32eab4bc249f583671170c", - "2cdd89ad2bd8a19a83f3468fef1d70edddfbe273f9bcb55eec973be4012bf4d4", - "45ae6c58a8692a984f2f2c9c9728edb721bd7c9c4063ce458bd11ea71cb2cbab", - "ec017d0b4ba4ae9d37cc08649ea4e18613822bf81133e9c68ab6ae1563cdc59d", - "965784951da7cb5776374b1a616fc60c2c8ff290dd7248485187497f00f67e05", - "aeb0e48825f1aefd55fc11ebc67c279f0d86cb569651a4cf97487b3361b097c6", - "4f97584705d0d8046785579c3149f2fc6fcc404480e140fc42b24cabb8ab961f", - "56fc4f251d3b6668bc16d0434273e7ae9de83c99ada5194d9a10b7f8d9a89276", - "99d91efd8681b9216db67bc8587081ae30789059417d27a6f6178bcca5d751c4", - "536080ef86958e5649d33c98679855acc396bc8938e290c7f088a72fee27079b", - "30ceb1b4e33401aba9bffce9e677016464f57f046aa65bd70f6511126401a07f", - "fc0c7b69b6e4c22e7f81c955a00a69029f5e0753a5ce2bb75d8a6f22d552b655", - "6d5f32fff5e2ba99a6feb033e304bbc330cddc115aa3d95034334395911fda48", - "5ffee4c14d7b1e96bff8e75301bd7984c910a7e7ccb2e8cf73fbe083f0b3e9d8", - "4dd5d267ad14206f8495b00e6af7b18a3e62c4c1e7a4f5aeefeed32ec81d5ba4", - "abc91e106e52e6b740b4ed5484a8c5d36eaa4214528f80b0baaa7dbe015b3d1d", - "e8c49f116735bbb2053764612166397e18fa3a3df746561aec3130c45101cc91", - "319f29e6d7f1d8913ef00a7da8c61c82ced3af3bce1dc5d1289fb933c36ac83a", - "ebad5192218d61ff0ed5e7a44080b7070078d89879ee4c1938885330ab783b8c", - "511ee23fa3c0b1fb89dd40f8f888b06c2e2cd587c2181c5ccfd3c78e8451253c", - "b5911f606b88288655bd41ad1569c9a37399527ded856fe97e01c5e06cf5222f", - "5e08e2d405b4bf825f308a179baeca641975a413e09700578d5f55e1ec0f4f40", - "2cade2957fa92a604df422c622e18370a392041d78ef038773ed3a335825b652", - "22f465fe2add329282dab7f6cb3ccc69da35b527f07c3d4fb65acefd3ac6a118", - "4284123d3523caf12b52c9c6063e9502357776f80b72391930a83aae0333c51c", - "9763d51b4dc60832cca101fc7bf17c6a4b7a3612a374803a1a3fcaad553e4814", - "f303cd4f154ab28cbfefdec8570c6d8821dd46439558e87b440c348a5ff11697", - "52bec98dada75523f4613ff3a24425bb1a119f2fcb02715ddab55a458c834d4c", - "35f07daff92d5e204b0db2d3582ad5cae135a4fc5fb44fcb189d6a8951e6ed38", - "344ac7aac07fdf62e385a2dc7f12abbbdea70c88afd744d4a47aebce4d00bb20", - "b8b693f873adb2da6878813899b41efb0fe87a183d763fb285e73c569074e875", - "76c43e49da77964c238a5a36c6ee8ef2ff851d47f42c07638c8c0db00a1c680a", - "ca19ecd9fc8e66570c6416620071ca8c848751c9311e96fb730dc29812f9946d", - "11e5fa4726ef3602749d975d828b32983eabe343eeb717aa7d64526eec9f1223", - "6e7039fbbe8c0a271a33aab35b9727ecced71ba644bc91ebfd49af83335e20a2", - "52e4895501ce5f0b5e3bd0860734eeb81841a0fcce3be49d402cefa4a176fb2c", - "77ba64034946dc5d156f852b97efee394c11886b28a82e2595f513b96c8e9929", - "dce803f0942340f25837e22923ccefebccef6d4c5324ba187a8b92c15ea378e9", - "44add90f8562ea82ac99f69a9c624e869a6f4e648ff2edd01a1b62721affff31", - "64829b1e27d54812fb29c70f30189f63d96dcf17d3d038497a7ba45123694294", - "8a78e3f35b92cce02ae2339983cdaac573be9a25c7146a16fa72822e465c9548", - "b86803bdd0b92470094819ef6ceb948817e49f2e8fdc484eef9956735d916988", - "7f5353d03e2af0de493f3c79f0d189f0cac8c2d072616d687e7bf8da7c150167", - "092b79a8086fcc65c24c3e85f2e5bcdb1998d4034d93aefd9f9efef0f60b3292", - "b914b9315596ca9e0881697e27ffcf391e096acef0381cb03891751a7d94e378", - "ffa3c2ca7a1db870fe0703e364824a520bdb79ad2ee8ca8303ccbe9a070d6c0f", - "fe0065810b89087c4f1f7629d9cb30b17c03de90a66390b687f806e86dfb978b", - "5174b8e74d4bd8cc89501e359c68388d2c331658523b3d0f9e3edb7549babc58", - "a45684f19bdca5b43bd53649577c218d721837599379c1e16569584a0bd94235", - "13572a8f3e7d581ee1041725ab5c1209fa412a99621f4e83ba82490e45c8015d", - "59acb2404c43a23e60472a01d699d1a80d6ca47e971dddc185f73766559a93e2", - "49f89fa9ef61531a53678beaaa54a4fde7cd69f8bd8c8355a253e5fb372816da", - "429421b2628a99d47aee0bf7ad77ccf7dcbd8b0ae4b424256709b60ca2fc1532", - "03ec08c9f65881b81026f0ade12c664592f6bd1cd336b05555c2b14ccb2477be", - "fd2f9f5f00b72c285886d73ac79b3fc5caea06a2f1827b2f35dc6f434fe682f9", - "3cbfd3fbeae85a41abc183a2a7d8e35c3aaab8a03494e40c84a91e1eab71e9d5", - "e79825ad1374571bfc69b7d091108cb9a192d643a9786a7a83b8f1ec69202123", - "d731f1778967f847bdcee3037b72a8e0688072314ce953e3694548a376cd80f4", - "ebfd066e88aa477dccad16c4ae234af520ffb937a129d58c132dcf03af9a194e", - "895d609ae42453f1340832c6c32421aed2b2ed02a3bc0f07d65119936a0186ac", - "22366af8cdb08b759dcd06a4a54d9489f8369744af9e1285f256c2284aceeed8", - "5e825c23a663626ffdc83dbae5955d0999204e3ae4c39633a35787d01117c4d8", - "aa779ac71b565f4d331e11f7f5831d0b0d6618482a624a2e1a17df70591cdadb", - "f8eeb0f90e6d26e8ff98f187c0f3b9fef17b273a2e2d55dca2edf3588d4846ca", - "9e9523dbdf48360e330906fc4f500ac60d6df37b2533cb79b487ccb902fd7db8", - "f39e36d98552cfe752e30fbc31e5b48139ef4680f9fdae370bfba6d32b68b316", - "16570a27f591a1a90ac8767f0f88c42ef4aa72f86f11702e65acdb9ffed014e9", - "5919de68fd085f737d3cc7c1a474f631970ec02011793d61432763582fc90af0", - "9b6b291435245e7935d068dc70dcc7ad04bb76a8f948f5f52369427b59d589b2", - "466b98649a6080d04b1cf123968b41eb1f759383d6d4bd31912d5798d8019ed8", - "a5c60733ab4e09a26fb8ec31cdb1b031e8607d852ba395d3f8a3597d12c273ac", - "6d0815adb0f84aca37626deda3c5bddc6e9321fe9c5cf95f56dd3f1abd356d7f", - "d1ad6c8d792cbd8e0ba6dd38655573f95139ef9fafa87eb008b23a11ec3c1561", - "73e3f6aa9551f8e2ea1b94f26dea0d0205a3f3c32976a0d0762a56e2689901aa", - "624fc1ff726ed27e2cc445edd0eba46155952facdee26b0b3ba4f71606b0468a", - "2ec82116177e2131ff8278b1eb23a47c97b2a9c7e754d7f4b432127009271c79", - "d29d9f2e0973b8a2314e8159343dcdb1b4a558235b58a3f0a7894cd732488e64", - "2c6261f11c92432b813411b08e47950afb4221d3296494c053225d791dbd29a5", - "c99d8e5325ec11be0601bca6cbcc6b97395a5cb1d60a1a8dad9239ab1260276c", - "74e1a73b45c1ac430e4a33a81281f5eb5e74a7f54ff5893148004a3f8706283b", - "897c6cff850693223b0d7f5b45cdfde11f206be8494602102ae207fdaed7e2e2", - "56d1353b14b58bf9f22607473968553c5bcf9dc6b0049ffcfa0e1afe361d9d11", - "05953a6e41e09081c74e06c04843ed1271e014f127d95da1573e4f941b7efcbd", - "34e67e9999192bb04c0af35a70fb5f072bc18226b5c79a2793159f964bb5cebb", - "5b97e8ba11ec0337851c7a1f523d6b0ea45f999ae450487d82e0ef104dd6c430", - "fc837af754adcb8f57435be89c02f93041bd5135e1464f7496d78f83a4961563", - "7cf9609a37b11c46cdcd4d49b9c035f37c33ea199c3ea1c6356b29b8ab02635e", - "bd18f8c770c4d1a66118a8d6e30db0701fcb6132aadcd8fe51493354c7fe5cf7", - "2ee42dd2444cb5436fd3418ddc2a949f793329bbd287643a6ecb6dc16acfea8c", - "1b02b5e6c7c477eeb6cbbf5118bc31684af72506f43f276ade95c17687001e45", - "56bd68720f5714bb11ba3b100ec70963f4f7d8863d45baea3cf63484157b4d2d", - "fd3d3310f7fac370e39ec84808fb030c5f101a9f7dde10a6339d63668f2cc7a5", - "a6877eefbe64733e61cabf937615da7479efe009e2544794e030fb4f04b44bb8", - "371587a3459753f153392ad34f4cc310540dd55af3fb026e4ba5c50beb20ef54", - "57fa8138de99e5684b92c9b019846bd21e6af573fe287eee9f20b91f17dbe2bb", - "5c6c8145eb34679e3d6015bbb7cdc2c6006a2e575edbe4bd6c6085072e350235", - "e78ff43e7079405d77d106ee71d19c83dd82d66d9dde8cfab7782ff42748f7d1", - "48bf81786f71629f2c60e5d2e93c752520b6a0a3c4629bdc7d529a3cdcad35d6", - "e8fa61aec8065ac256030b49191b5780a6f0450bcba5dc631886b8f693aebe40", - "055b1c9e0b8f2a2840acc4853c06eda201555548f44360389d020e9f8401ca03", - "c9b7908acc23c5a94e2d528dd6ee04285fbaf8ae2c91ebfe1bdf171181a817cf", - "1dd755b637afb5098e4ae1d59f22727308ecccf18d69158622c31d9a28f90f17", - "2c94889223adbc759df39c7f0273d3e20d8ad80eb44c4a53332df26482b26f27", - "e5b76612a92e19091be1c7b60513451ba84b54668e29192093f897744ef78fa4", - "553f5a83adf243185ff917d2280d62a4acca3cc2c96f475199abdf1aed1ce867", - "f0fb06019cf14d19906f4b15d1fc6384f7ae81ab67b5ec4fa10b82f345300513", - "4be2b0bd591ad1bf9d0fc71b77fde489994ad70cbddb042babe8e9e6bb38d5b6", - "6b3fae2b8eae8689f1e0c93c547583eb052aab0c96c5618e7bf62e7adf88d373", - "24eb9777ed50bdbe4832bd4c0cf4d36250c14e73f054be2dec4e6f92fb5895f9", - "3828c5fdbd2ed0d8f4838f8367f494d3b6498eedb09e21655854b52c2917c898", - "4b17899a55aafeb05f146a08cb46e08c2df89b993581ffcd5792c6a02e5782d2", - "f4d1168a8f36d30aa2b822028e9ae1ded50b88baf9817b5e99e567af34abcd1f", - "550ef5bec1b0a6194a2b0bf8cb607a70ebcf722b148c0c4e25a15206e71562af", - "3812a0b2c1c0c86529d0722b071c41b89ae7a0ecbe73e3f9c614244eb1d371ec", - "36cf3d028337c3fa29604cd8562f3e576b39b239aacf844ef1ef488a90b46b3f", - "8d722ffd401d43c86b53684281554022e4ccecd9ae797d502e5c2e819f319d83", - "6f0d17b118c89176aa818ff0dc7eff9d3cf61a0d81bd0651c035624c566977c0", - "cee9cf5b5ba8910d5628dafe48c02b35c567c7bb2d79b4955694aa1b0fecbfde", - "d7368a6c78700f6d4e7a5dd3b057974c354db3ccf6df5c674fefa77d7c5e03f2", - "81c778317856ab6d141cd9aa5b574c8e39e0253ade79ac93d70139aeb0df030c", - "13e3170514bd3b88945f96db8f4f4d69a2ec8a38f9569a3477199a395da33976", - "5bbd2e84ad5af5f42e62f95ef1920527661381f3fc1a9c35d756a046beb8b271", - "fe4093687de199c6f00057a690b48d1824c4964503e08166da2c1aeb915df10d", - "b4f52cddad913ac1b7431cc4ae0430a5870f1941080565f7a94493b49def5855", - "378bad9e22359813aca831a56936da0994cf78e94f207b5765eb3956c9176ba3", - "f3ec316690c7a0f2d03a033e0a1f2defd838048a27cdf37f62c95f161088e2dd", - "df518d04f1b7032481d71cfba8cf8bcd6d97788b5ac1ac63a19c5c3009ed84b2", - "85da8e34c4ce0f24d3586e779cbd157057aa90f4fede6707ed288c060212dc85", - "6ae92c3376c8e0afaa9fc67c388deb06bcedcd9de0e006592985a41c434e6858", - "0670021b6ca03a68f7a1ae2948f878640ff40ab091296ebea6f9398ac0e78117", - "18b2012fc2890a324d21ff8c91d96ee69008ce904e2b05eda18677941e4c55d6", - "ba66e70fbcc249224b617d0b95bf0125cc3094e236e10f7796a0a6eee3e761b2", - "99140f39487991221bdb3badefdcb3c82c47f3244f3df0ddf882cc711372a969", - "f1702b67af03c6474e3bac94d06ed4cad767cb8c930096b3708c9b7a8ca9d70c", - "4679dbb8564cf76a75e67e5d6467fc9d92b5b964c624d937474e6236c235734e", - "60e0dd268d1fd3c985a71d1784d83af60bfd7724006d8d3817e3a3929fe3cb11", - "55ed0190cd425f8db7027d8e9441458662ce33303c1f5b888921c201ed050b31", - "fb49300c7516c55f7676901b34afb4b0d4a26b1fa403b3e78d55a47e117698fb", - "bc8f38689cea23e54f791b01b2911fdcbea62950da92fbb5d645c5dd7e454a72", - "a1e2bb6f2d85e89f703e947dde640e8455b2f51e1193015c8117ddf91282a68e", - "5db71a8f8948341f6ef5d1bc003a61698e451ca9a16d2a70dd4c89bdc9d2835c", - "30bf05a8e750435329706ff862bdcb1261841196014af30c66e9cb6038ca07fa", - "e69e6fc70de029a9943fcb820c777cac1b439d5fc2f9fc1854b712f9bf7f3e76", - "94766cfc78b5d0ceb321fca81a86bc0f6192c6ec933bc257b13ab563fb47ff6b", - "aaec41fd17ea99754690fcf0045f01949fc6e17c6defa976c4edff203e97986b", - "0a8c5dba8754bfc2bfd7f64b1c5ac06c2213200d5fbd3c022a39a3ef70016cbd", - "f094735e71d138615abf270ad8e210db8073d3a20e36d522746d479f4ef014b1", - "7404fb06f85fb907bd01d5cd07f231f2bc0aa0e0b3f31afd0dae397ccae4948e", - "a6e15d3458e13b74b58d479d9d1fff0037380a4324a24b13b9aa8ae6a6feb96c", - "57410ee3aaf4f1dfb07d812a4a84a3593dc68e9527ce612c8fb371323d56e159", - "e8965e290e5fd57bbe4a5a37161f182ee9f6fa916c0980ac6e7bfe2c2735aba3", - "ed9ca6879b90189c4380f062fa4f54d46ffd9625af522266953559e8209bd96d", - "54d04e69636a625f276dca6d386d38aa018cc51307929f38dd987e9985ddb242", - "f07b7ec1f7d28908d2d69007940b5409c15f05166a080c62970994515377b7a7", - "46fb1e2fe83f2302e45ae31155cfdd88133dfe7ba6500be6276f9bee771884be", - "a8331ebfa81b2563f809db13e4a0bfce7126f317c4420ad0070709869331309e", - "b351b5654d20177fab915c99f655d34248fc01a5a866e8f660712311de5f1a05", - "937f677169264600e7ff7b23f250b0bc9d367add5fb86dfa2254ec7366ea3921", - "aa63d1d1bf5eda7cd55e708bfadd911dea6082f5d4068ef4be0d8ef11174e98a", - "800cbd537a54a13ed45b50db47ea3c8ff7f7f9e9407683b8b30019c298448622", - "7d78fe4c2d6a784cf4cfcd50165b0aeeda0f6ebe84a34cd6a0c83e920caf8470", - "2868e8bc6474c39153d69819941ab899c64e80ab641f157077945bed9747e75e", - "7529845d908eefc9b9949708774cf6bfc089f3121c417dd81815028bf05d8ede", - "451b9d4ef5926778743199c65b31902bdc2c51cc43ef392a64d6dbec106a380b", - "17c6c745c3c1ecec1d7b059309fc5e5fd14961d0071fd657dd0efe23bdca7bb9", - "59e5a9173beb084a5ef7d27d92aa757df2fccc213d81696d6bdbf6be93340bc5", - "e9d8bfe582ce6470fc297fb8394523c901131b052c7eb598514fa13984e69f34", - "c498cf46b152533f007ae557fe79b59b4ddd07b9862ea820209fe7c0fc3a21a6", - "f79c87b58e58845dd3aabc74404cd6c47c8b1b34c12bd6c18a718d9bf6944d7a", - "04fc4f38dedb4341026ea329f2a8c72ec7c2e2426af7f2daa521ee923e9f5fc7", - "f8e1298c320a319ac7befc23591733651af9ceaf880dea6c960d8546b7fdc117", - "39ba493cddf073ff804ceeb90a343be4faeb60316c31d72310cb1f1cff18b050", - "acd6e1b5db7bb92ceaded9365559f41a05328d1f04dc85c2edf10194b768d031", - "0b28035d3d704825f19c18e806b8c7ca0a36cbb0c8750b0096ef47b23ec72580", - "19913444ddd6c15e1522a6f6dc17d5c528c56791baf4414877dfface2d3cf3a2", - "d5ba0901c7dda08aee18ba6dd0bbfa91f04fb68b76379559109d86967fe0da9d", - "611edad22dfd845bd51f8c83011c02140a77f1fd44d263f802c850600262d379", - "285749c5413a361b53f3964337ee9500dd41d85df20e0ec18149d3ea6b9f6b79", - "a463302e77347624834a22dfca5e3bd9a7e05341a2011a35169d7fcebe453389", - "2b353b37f08877a2aa23dad26edbbf8fbe1c55cf0ea59d693b26d253da624131", - "25461f815028b17d3a644bb6291ebb0c109c5f345b45989d12c396f6b3b1b2c7", - "9418afb8987a7373aee7017ab1238a7a19ca53d7fc749d85a9eceaf4b560c368", - "f107d708249f327625ceb5ef05aed57fe5f0bb5a4d36cf6afae299f0004f9612", - "8614ef957d9b45df01b15622e180f2898523d02eee654ba12121654ac2a29859", - "91badd5a3aaf96f4566a75a6c11a47b424c7be1b01c8c8d1d8a72382d57ec771", - "518be3dc351cf922cab3c009a1907d03a9b5d8e6e8a420830abdd11da99e93f0", - "8bb3508b8233ba5f93ed96ccaed25884d335289de07af8b3e189ad25d29057bf", - "dc9b1b6e52b0a879ba93b0aef31add7cab9967c42e2ae595646c647a7afa4a13", - "f7ba96eec9beab3f5418393e8db7b59d9aaa90a51cbfc03bf73ed7f7a93629d6", - "9c7eb7ea8be6d6426e2e24cccfc739f47fc62d58ac31835399cb65b3ab69c104", - "f200285aa1b8a50a12c9462dc5fb5ce08282e7de632212f3e09610fb4cfbfbc4", - "4917eb2d6e825bbd2c0811f74b91787e3f76c9134b2d484f7625890a41f7ff8b", - "b874fdfaf03de0226bc7fd5896701d5e3e83fbb9afcfeed92aaa1ec065f67152", - "4cb1f3329f2f267dd1d5e8beb852396ac8abc05361e4f5715648e31a9baa4898", - "1cdd73af41774198d3a205b38bec21a603a68bccc6a3721e4722cbdedbc1cea5", - "6c68c33de49cc5f3951d84e8adfcde75541416e8c8aeeda08ade3bbda920491d", - "405752b83f1cd8579588086a0b17a3464f7a1ad89da62c923b156dd217fddbdc", - "9adf18a4fe740c5d23c8e8c7008ff54b40d6bfc7bb25716a3fd8bcf15276c01f", - "21af03ad5ba5cd3ee3797690f048b14754fee200567471a4f88c3a2fab0935bc", - "9485a64d72115f03d59946f776c0da834f18fe9a7abac6d486df56662a927dfb", - "1009603e9843d4c3979bfde2bc6d358da1d71c1e3ed2b0e26252b53e8331174a", - "fc269d73fa94dfb41d36c8af02452341e847c818adc998e6d7009926e954e915", - "fcc55c2478b1f7edb045a7ccb008e33ac1f9bdffdf5f89ae498a0c4f5b1ffcfd", - "09967e2353296201c7c1e8173ef3f70c5eb49dab3ea16d377330a4a8a6207fa5", - "56acce1b00d90790a8a9d564dae34d93413f698beae5dced86745742e3bc693d", - "dbcd232a47196b40aba8b8a873a5dbd94e5db26b6752d7fb623847653e5ca92d", - "9f8db7ef064078e9ce94d828c5ab404b76d897ace4ba5f33192f10e916cee8e3", - "5f52172549c84bc589dee817444d1416abc2963a4fee13b144be0d9c4df2592f", - "1a56a1d82afd07f58bf8570dda6800aeded07bb66d25399308bb559385f09c2e", - "9755873117c5c03141fa53f0f1fe0b5b460bdf55cfa56e26c4df5e4233123649", - "79c9c6de5ac7c89ab8cb56334fcea3139a04b018169925ae00d62367d06627c5", - "b2b606c6d2467261635e3e33318aa256327995faeb0ee10dc8ec43d80b2c301e", - "b4c1145bcd23f84c81521a338d14fb42209d5dce2040a504c608ab50893d55e6", - "87b956ec9b2b4e0fb391c1b20dd7409aaca96cb531f3d3824a6a9adaabc3e61e", - "5239cc8615e23cc37a075578a5b2bce2b5f25a807c0890874ab2cd058bafd567", - "4cd17b254542a9f633d5a5e7ef680c63f342a740af1e4937a19cb3d5212b4f3e", - "fa67ea6a15c038b665e0fe2b975efa3a3f24ef57edf6f5c689c7daec55781169", - "40b5b8022daf2a9019390c7437f845046a1f709fb04e771747c1baba1ee66bcc", - "5b4e760bdb9ae90603e5f63231d6df6b24eaeaaef4e4819ea08c187dc964e716", - "e68e2b20c7646e12835c27987b6c8a4b1d587bbc8292435472671b87625dc1ea", - "ebf55935f5040a89da33a8ce5646e12f5def07e88c9fa1fd3a260d4bde4210b7", - "6391b9beef473ef77764fb8faa5f3a8bb1b8bfa5fac2078346a5a166c60a7cb7", - "b85c15cd9dda965d3cebb56cd1646c6f458de7c54353ea1bda621abfafc46b7d", - "4349848f58b97544c8ababaa079de35595cf53abc758dd1a63c0a08bb47b832b", - "5aea17a1906bd0f1036c984a04a60477b05c5eacdf185ecc15358e6198567941", - "1aee1a64643078c1413d7860ce5c2c4d0bc73dc05a261a7df516f889c85edaf0", - "85880cdd30815257bbad6286131d176e56fddc53268167fe358fb9b29c291722", - "ae6d95d8a3d83c88e282cb5dde9f78944c79556077b8fb5c7a42c5425e19a46b", - "ad5b0293dc92e6faa10b6d5d269c449f8416a8110a25113b05adb156202a6bed", - "af29b740cf7b015004fd21d82b07760cc4ea97f5ea1f1b3ad8fe31361a5ebaa5", - "4092aa6b6cb1433f0e4a5961c38925d92c29bb3bda4e78c744bda35bb5e5e545", - "68b22c4be174935fdc8f300a31ba26310babaf816787c601f17106fd2c7d5859", - "21632ed8ad3eda55a0321ca2aa728c6848c88f8a152dbb90663731c1c512f666", - "1d46e55420a735cb315a3244dfaa0135f64264049e534e5cfbf8065558bbf63f", - "59513b6f92c2c67cf657bb21f36bf0b5c73ff00e891a457ed94b267f52a75b58", - "420ec9a0f43e2fe9f3a2702c0e939eaa08d82a5c165c615a89b64aaa344e444d", - "b9419267e6f03ddddbb9c68f1739c54fe229df441f28716934d79ab16a77b6a4", - "36fe44415ac650ea6e7b4107ddd05f11eb690a051a1e12562263b73f157081e8", - "c771384b0dcce1b272253bd306a95d860b7cb7abdd96d34fbfe54d6579bc63aa", - "50e4dcc79afd026e85276734490722297cb262c576a6ce5ba9ae963c7d8b6e4e", - "7c0e641f0b43dbb176ee930187fcc2bdbb46121b3ae6ca09e0223aa6a12d807d", - "628c112190b02430647854642c94ce7cff76c7d0063d53935e49ee00fe0d0d66", - "c399762f6045fc0313f3bf35580d5433116b405e1255c9a56fb7141894e5e0f0", - "9f82421c324f3dc0d973b71e3306240ea3277839000bf282818c84e595d711f3", - "68c45449f4552f8d67d6818b1c670bef27ffe4923989e8cac6b35370a1645253", - "306299a6dffb6b009bff99fdd5a9768f158b740f17b6edeca4e62b8b89f5d9ce", - "57a23ddf0abf14215fbf8ea146dab09473838396777f37d97cf7c9aa8f1278a0", - "5c44b3aac19141e81def7f63becc0de103c1eea88fb7cc8e35e92804a56a6e10", - "0e1831ed658762db852213d454134a7376faa3e9614ac3cf27cdb34376d6d0cf", - "9bd34d4048d24f0b770c0b403099b63e145b678dd6769152fef2119d60b40789", - "a056dc010ce2a7f714b4f88e9a786174a9b373bf7d7172f16ffe9e29fed42aaa", - "ef437351f5c44945365febccf85dff8027acbe1f5087674f3b501815166a81f6", - "23de0adcf322b10f7b0713695f932d032712a6f8612599159e58bb23cc6b1d6c", - "ea4956f8804d46b379b3e7d79a86e9c5727c2dabe763a2ec384055038c7313c4", - "4f1600686a66136a3941c93bd4b385c3ee5d64016986650fb16210c7f2d58bdb", - "5aead7cff409dd1c8758df3cbb2996c3a0370099cfb47cdd9902ae4e950f6984", - "aeb812378dc0603839f86e422c581acfd52ad2188bcf669507e70e4871ff9338", - "ea23b9f3d7940ee072d4d19bc499cb96e7722d820decaf29526a98977acc2ef9", - "db50b8b3762b0276b2d4b258c6d1ea2f9d2458eef128598d8cf00de8a7a6487e", - "b23b5d010940d5f48708d5595fc9b2ab62d3399ab8bf8d99c1ecd22c0ed14b6c", - "79d2d4a18ed36e5aa7abe6644126e913e96e2130cefe522baf7379100f08f57c", - "7686fb5ad5ba2435aeb668baeb5b08be9744c5c62ec96c14f6788a49d0fb037f", - "74ca7f2da61d1b965584b53ad25e11cd8f95e15ec21c5e53f28afafccc8ad19a", - "91aab5ac6aca3b08f45bde83daf2089541027c758953a490d89a62e6cedbb97b", - "88e6e013de889b963722f527eb63b3a4a55d8300e3fadd139d7a52b0d459c7a0", - "7455ffac0a4c8f5d1d8202fe236c203cdf777f4337f824bcdc141a0abf4c645c", - "905b2a600de13b039bdd5d3416ef9b4062e9afaa08dbe529ede8370e85ed0c35", - "278d065551d4fa43c40b985b77b1fc91e15f374563e379ef1a7fa56c4b6877d5", - "b113e4b284e821e3ab553a13220f59e299371509e0c6721e3ef7591685efcd0c", - "09cabcf1aead50379b7140c610d97d6d6104ea4fe8666f68a19079fcf9e6e57e", - "acc652ff1b0be8381c36fa0f1956577c91cc9474c0fb234ec78a3d24b8753c66", - "52bea0b4d3037c153c4f158c3bfed5c79de6903698b1edf95903f405d4fb8a2b", - "a3e88f62b19d58372b2e7afab53bef249741abffb224c844707fd0395262462f", - "ee7785207533d7f7ed1ecb058ca9d90bdd13e511bef47b466571d1d10097b667", - "c1f0e70a7d585e46e21796be0ef1f4f51ac461262b56ffa507ce5c8d2ff5bcef", - "030b425d47f78adc0a217e80c012baea54c8cd05df58299badb98a14ba4fb36d", - "7ce68a352a9441b9bcd32c0e209479cda67d333e80d57326bf013e65352605d5", - "1acd93602d564306b2abbd6e1f1aeae46982c7287926191fe4fd2f4543019b4a", - "2f775937973106b9dd5c479846514a4ff0ac242e4ca638a27f5c09fae2a63014", - "09ae06df867d1e2e901589c4f4399a6a75bfeeb014b1b3c9826e8ef510cf58d5", - "2f5e18bc4ef40bb65fea911bf215a6664392b7dd3639718df95d96b146e1348c", - "e111c1779fe5be804f7de2dca5c3e69f46282e7f5ecdd9ba8606c81e09155e80", - "8780c6331a89b94933b325d94d72dc4eab99d223be11d81433c7fb0f16f99720", - "d3ab4c65b135225f3575b665de6c261ad3c82505c137a259190db1b2f1bee5f1", - "67c88330634ba3742c3b6a06191bea81efa76a3d01ad5ff4ecdffc7f2a4ac01d", - "e6ecb6a577a685147fd95e5584c89863353efe6d6d3a08189c1f24bd953b9dac", - "e02fc9d4fa10e0d93ba27f4f0d16347f21d20a8f2a9bee9dc49bc6b10b89946c", - "37184bb846a9f662682d49b88955117a2bc89192df25d2cd865179ff91b4634e", - "9dd50b562f4f16bbb068ab0212f685bb3453c787a1d5180fef03b98e5e01de7d", - "5ec3df8f4916672d3d0f5985347f484da124f8e81eea06a8b72349d346150170", - "e883f2abd306b620e98c06ecf1c2d22d716625694fb9f2a440e4c9ffd5e36777", - "85ebdfe07e309bc94288b34e7826c5cfc6352993570fc564ea4e21190ddf8f64", - "e7df5a0bf37afbdf1856d26a5ca36919be574c4d06ef90c29fd001b363b9d41d", - "79d71dcdd175ec4d29ea9c17f347155414b08e264e7ce7c18696695beb8db6fa", - "d374d386935c8f6dc75eb40c1b47db11748527d468e59a32ce53d4ea6885e569", - "777f60846baee9292b1b6c84904e6118986312eb31d924a6a651bca477ecdf71", - "3f4f12554f92b81493506e0bcf86979343690bee0a1e84606727f048cd928954", - "b49a379aa62f5162c2401e2db55f06e0fdcedffde300d710210f15ac1ec5c2e8", - "9c9eb27801a2b72e6ba8d10c65fc9e50c88c48efd89241f6d0585600b3d45ce4", - "d2822645cbb02cf36de84ce1609ac49cccf9f9f05b962f2b081f5fbc7b0ae93e", - "d50301084324f7781d94d4418df187ab4254578cf888db3b8a6a4bf572f25a93", - "e35483c3a5c616ad7d198442863d7d94366bbfcdbe4eda14c1d1829d212428aa", - "0532a324e2f14f75e1f4c1b4540d704196904bc8dab678a17287deb3c3386779", - "d04cf3a7350e403ade7df281e1a94beb7debc02537284b3990b618264e435550", - "86599facb2b0c249d7d1339dba8b19915e62809d406fbcfea307e6e9f81b62ca", - "ed2c3afb85c6722173429fc6dc65d93dd35afb4edea0bc39b4541ca8fdfe02ec", - "8a9fb1751a667d28439f5cc6356d474123e2769204832c75d2717ce0e5436bba", - "4435f34232f5ee593ef5e5dfc7ce5ba24e7ecb07b1fe0f8b1949075b04748d9e", - "82af76e99cb2de5d4f510d3303165e7f11aa4b95d19a6aeb93369cb29beb60db", - "258d859f22e3edfb7f105bd748c32faa6cb31fe36505b805eaf516d84848acf0", - "3a5c0dbabaa5d8fc72417f5f647988f4dd6956d60063b12b9bdb913905b78a38", - "52c83a60084d0bc27d431bfc0f5106e4f33181387f233313356c0a45dc593d1e", - "ee98423519d198b17c2b96b2fd03c2d9474f0d4d6d0205863a48aff3cff6d01d", - "b89252c85a19b01b8e3e94d30fbdb88c6b33d71026bc4c6f5b4388c1fd8ee1e4", - "b0f871a44b7f1c7da604bb026cb1908feb9e1e4b8cd69ce61d943beefd609cca", - "be3fbdb247e4c155e656bb13d37858b7625ed65919f91901b8d74127aab8dd9c", - "2cdc9e3a78d9a8663073c902773f242ade25a0ebf254c416f7143271ae5213bc", - "007329a902951552287ecfeaf208ae0781b80ed83711aa0dbba932b25ff6d529", - "de80c2c883020600d07cc51acaed2fd499aa9ad9c4e18ea8ab09724a9360c208", - "b93f88a4c733788ab5309678b4166a4cb14c55f25203a59e67353d3f22dcfff1", - "838aa9cbde0322ae0f0c7b7f1ee7c56d15fd7c80ccfd90d5aa508a904827a5a5", - "bda2274caf0ceff41315cb3378ded11a66421d6b76bbf0accce0373ee2821925", - "195c833ca89914ade6bbfe3a652f4830e0518766180ea8bc9453718c82186118", - "b6b2da44b0e3c2895a4bb208ffb1952346165d984067aaeb18034b197596ec3a", - "2becf685d98ea0fce7414ad77000aafaea6a098ed87200e03a8a9e083c67d3af", - "f9c361d7a88586089341024ebe6b530dc66abaea3b3237a9c889caad2e17f46f", - "a5c7c0afd6ab5960ef6d19ece9dbe8f1c49d4951e9a2cbd4bd39b3b286c637c4", - "e4961a8b2b6ccbe40055bdeded5ff1aa673982cc3de56b05e88f7fe421825b7c", - "f237918b88fd10105bf70b1bd74183c8f533c819f5f4e9ed4cc8111b0ab93e92", - "e662aaad491a515b90a6396f20492be73812d9ee7af94de00c51178c254d5992", - "9dc2c9bdf4f119936681da389f63a79259f1e278bb4dab9327ad7265bcb88e7a", - "f1520a2a7d7a73d8a1d03820f1ffabdca5451da0fdad32094d099738772fc115", - "42980484dd634a8bc0a6d248bdce452540da351769d0fd14a7cefa0a6e78a663", - "c845a7b83aaac8bb5aeed5deac758d2b88b3206c683725e3357109886b1de484", - "1a2adbdd2b74d6c9b63e514f1f7608c622a6cf86b117c9d70ccb4bf12b3c91d9", - "9c92ec3b0205e3eb95c86616cf691473c7953d9898aab57cac1bf406fd669239", - "292f47470e126a37bdf46e624b7b33504a6732762c1a48c404e9c8b2b87d129e", - "4ec6f5b3038857761963ef6479ce1ac505a7319e85e56f475628e8fc9bb3a50e", - "62a9947dcde0951160c99d446b928b555cc7799ba144a6a3560472cfb3a5df27", - "abdbbb7988c652fbfcd72e3d4247f635716a8c1299264c484fb1a2062ac83927", - "b590d6142217a9964b29ff6561d313b2b4e0cb7a234f6bd99ed07f54d6123f60", - "582570fe1ff44ccfd85b8a27c88eb37416674a1afbc160e299acf4ee9c5bcdf0", - "1aed445459384216e8d9b650037ba67081c62a130bf298685fbf8bf255afdde5", - "b8f24c87ac52638037d97bd5f529f562e1e6834e53e251f05b56e09d24518b5f", - "811b415bc9494ffae100299766e768db90b2ad996a5458b35b81bfa79d067b02", - "a2244c73e3cb99161d49a4040ac3462b1c4777f918f8ad7c061c022668fc9326", - "01ab135fba991d3c5969584aa50ba4361372c527376a38681ca05419b806ab53", - "4190e2d3b05cbf4a8905b34c90d1ab1983603bb1b986736e7234261f6230dcdc", - "9435c635f8dd810069a3cef5e1eb41b8a271de99f3a203f3a796155094e900d2", - "038321eef177cc739aa610ed5347d4398e3536b7f13fae2714d4eb9063c28f6a", - "767cb80cab4f59be14c9ee25127fa299331d727e4ca3c003fc5fa3037e2b22c5", - "ea9c8ae57959e1c6a03b4f456ad54cf68f000cf23b137a01a63a318642e1792f", - "15676cabda3b224a10426eb6fbc02b597f8222de0ed4fdab2ce040b857d76d60", - "43ee6351e16af75beaf713070157430fa8f630d804f564403b364ad802fb9772", - "a0bb4ffad495bb6412b9eb104e7d6ba28fe64a9113d49cd76f9176764a93f636", - "5bf0ca5e2725196b6c883772655f89162bd90afaecd354ce2920d40d70b0ce79", - "bf4a02b60522da5b6e14b9082964bba6c5822bc8097a4430012eba7c30ff7a5a", - "0bd7025646cb55343d17d0c54f85324373959c4187a296b25d1419757bd79448", - "d9c5871f10df2f7a21785339be55f8ee18589ad71cbe6d4104d27f60526b523c", - "7031aca8746ce1b549cf567e5d15e69a41b047426fadd8638c0c579beac93305", - "233c2e454bcb761f90338fdfe8298dc5b5b39d545d73dd7b94b789aa4d85842e", - "fed20553426197b0c31310036b4d61fa50ba3a63d5c137e3c5c4a7464b6dfc2c", - "a25e03138b93e5bc100403e30ac20baeeb811ea6865fd9c959f3796bcfe8d4e4", - "f1189bbeb3a09bfa1c9fa0f28107ef0a9b862c68723b632c9d4fb02abf3fa021", - "a85faf93655dd4d9250b8616067f4d28c971095475dfcb334bf46bbef4bfe359", - "fae0441725b5ece17367e2499a1878d2eced7bcfe08b9d02b75075e557cfd1d9", - "07e21990ea1012bfcb33c2790c802282a17236f04fcabc13bec0efd7439a9c30", - "b24762c635a918dea979370ecada0ce90048efe789bd7450db00a0aa033fc282", - "a71d27dc4e2581df19d1e719a6bf6bde74b460cb87c31351226d1b6e6b53675b", - "8d88d4d510e17085c12e4ee3c1a363d25d3cb5b41248e14ce19473ef1973ca62", - "fdf362867124af949d9efe0eba11821d92107866754eb0fa99f15e1637472291", - "c798fd6f61681ded511586f8f4cd64340d6c552b9d42d8ac0a8310aff983e44a", - "4e2e1fdf3bb8280269a3511d39c0cba6ddf6d47671b8061a6d12173f530475e2", - "6ec6f42dfe5d64f76ab72c4280278fcb453f7c0b639add67a73a64d83f70e4f1", - "36e22c04bcb15fbafff84e66e7ee145579bb0f4939849ad82f31f9d7627fa058", - "dbe16c84d0ec99ed5ef01d6ca5a8b6d0d64074627b03292ae890e960ee0fae93", - "8c5d9653faf1e230a75fd1b1886c42ae94b7ad5b64accffcb90be1670df96c4c", - "399b0453c6465ca5b43ad8033bd5ddb253c413854f214bda407a1d3e63f49dd4", - "d9a619ae4b28224b3410489ac6efe03ab494c8c2407b04d5baca45baf5aec918", - "89b3709907f1e868a3d1ec9a409a7137f8de608594979b3a8539f0e8ece61d89", - "1fd7809772aa19eee211f084a89d8376ad01dd5f0f171aca35be1178205e063b", - "05bde79efb220414ebc1c27e3c6680cad3d64cb915b7c4aae579dd47555f7b49", - "6896d46d44d9ea6eecd3c5f8a36243773d7e4a6a41bd489200109906669e60aa", - "a09514f9ea7f3421d630def269864bac0ab2db13778ff06a1ad819632a4efdab", - "575f990210a825fe2c98a7d2f7e566609e5cf5d509cfe3ac1b0d97e61a1515c9", - "38a19570485dfacef58b17d4a2498cd465c011f849812b1be3c4b20c419d4180", - "56a1ece942d660ec0cfcbd7d3df98844fd38d4449d0fa4282580877bf691cda0", - "13201b632366b7a593a3969c7f3d2c8a8e17f4fe236770e85b4e326d6f6207d2", - "2b3ef31d22cec94ef4f7b3701b33a618883fdd0128ad63ed6ae639a136cc0390", - "f8ff890b6b0642194687a392126de6b6528ebe2a3b66bd43b7b7fb6494812593", - "9767f6ff08974cbb9c538c71ffd7a297e916e2daf6df5556b277de7a0060b1c7", - "f5e11573357e4bfccb2d486265f06ba42256d3dbd3489a43285438e918e488a1", - "24734b08b5d6a6fda222946f01b815ee96c6ff3d554ad78ff1cdcc3e354ac9fe", - "122cb3f079b679555ad94c517c5d90ad345e492183140ee474805e3a3de19e8c", - "d2237b3a765bee8a49b11b473b97e0ec589eff71e3589589d403c77070b4fb11", - "afd5448dbd7676e871ae5d5a1bc66cc005fb0be2a421d0bed37be89229548dc1", - "f2a3c16d0b0352f774ceb7f40f29ad94382f9ca40fbe8abc53988cd2742c24ab", - "7bdebd1093f2d43d52f52c8916dd077c3ddd7fd1c3aa8b561af0793738be750f", - "6d583c38d985fc04aabe9c09752cad68b92c3c757200ea9b5c7441615a9c6064", - "8dda5c45f47e9f076229f23c64c4f5a65b6579a04821a5dc8c42964b9c066801", - "3906e37834f718a94be3ef5eda4415d211d774b45d6b90af9872e58d1f38f9ab", - "42d572642ae52e5f52b22099b586ffef84b9031a7977b9964ee0a0b598d3db58", - "b84090a23a867f5036d9d7fa97b6c1db0251ac0541409c26016768b37adebc64", - "a97beae0e75124554153038ef1bd231bd81a3084ff1664b6cd2b9f43bbc2b3c0", - "710542598eed7bdf6a7bf972672c54ac27635c00379d225680e0e3e3e4772694", - "417d6354c2d9b2a56675d61d5c60d7fd6cdbfa7401ee3f72172eb7873676312c", - "ab7d496fc38baab692fac74218c6fb30a1beeda03fbd1d23c0af9afef08b5632", - "03157b8d75051d096b33e2dd461a31216574ffceea1c8092c6a2dd66741eb4f3", - "c57741d8c8cf9f15bd603ebf456ef9af97aa088c6a24f01dc21e9e0648d7e014", - "687d0251539427e6a1fb9ff6d3bd6fcc02ac3a5f2fcbf20cb71d36446656e8a6", - "b5f497f579065a5d32d439cab966dafe3dabec9e2fb8089ac69f1b9e36dad21b", - "c27cc97a472294747c885b64ea58a7b5ed05081043595ddd546bbbab2f59bb54", - "9c46b7990e95fdc91b7fcce9ea6226c0ae7e726fce2a077372e836779c96e17c", - "f30ea91f739b93bbc74c0c5a5251969624d127ea15fc07ec0d8624931d6b60bc", - "f40b7df1d6e739221ce038eed72e107f609ab8cc52a4d952f8508608a2849065", - "5db009902bfda332f673882a08bb879035efc66c6c20ee1015d70deb47620a18", - "60bed3186e939b54c3f10f85bcc97c555af2b3c68f696b5279a7fedb4027cde7", - "8601361e1199ef77ade1fb19f6277622b8891f85801b6aba8b825a68732402ce", - "1e241f32a602dffc646b35e6c49748c6d7effd3815caca5a41760a6bce2c3773", - "f536e93ea71e9cb0dba2398ecda8777a670686c666b3c330619aa751994b4dc3", - "199f29daf3b397011f4c9628d1ef559148f4b31d2178a00d8552aa6a83b536d7", - "a52480d9ce285081a24e6be9866d8869662d322b2d021e1240b7a65696bb5e0b", - "ef6a5cfe23fafb6284bec8f51f033ac344d71bab4377417750e1940c7a8caab0", - "2b1d9b903a437d23d39edc4ba831de067ffcc6df2f6e4a0b677ee63ad3df9e08", - "2b465572d32f337e4e53f990ae72f6abba26fcd92a547db0e4737e9e2d7bd5e8", - "c3a7082066b0bb80d2443b99c6168995873f3277f6119a99703228c5093ff299", - "9830f55e905716fc825e218953f7c5bc3af7875463001a2500f0a9050de4de55", - "e8bbb2c4818f9a9da9cb5a22d215bdeaa058417415564db9a83926c12c3d568f", - "efce67099ea0e82f510f25fd29cf2f5b4700a02e8ae876a9631720006d21aff1", - "9432c4213431924c4f74b40204d915662e5f41b0586caaadeabd3588da5e40f7", - "d9627c3ddefa916241db1a1b604288c23074db452db8b05d042c25af28061b54", - "587cc0bc508c506363c71632713acc12603a318a4bd23d290379bd128d850c56", - "7864f3d0b439cfc6920765da05b916d2da9f86ec381f79add8c11f8dd178109d", - "7b53c8a39fc6c30ce5de63cda664afc4d8c83e42851e5556d1aa181d11a92a20", - "880b10b5a02b2d497c8bb1f84fe2580f23909a194ca17fc48c35d44c2662830d", - "71909dd96b784f94d995d5cb5c8a9ff674c13631fa78f5cbcb59343de691ad6a", - "dec406df23b565f8dc9a7ec5e261d82e0c6aa5b4b42f061c6ebcb6b8feff2b37", - "599a91e1d52fc64159413172e6022a82441d50ead83f6b234aff1800f58959fd", - "b76467f747376d33ea3b25be28d74400d884ed7db6fd3a73733405ca2ad68e98", - "0f9cc57b063cb06c6ec03e0edd995807bb796d30c8cbabe74dc09cba5b6e8264", - "8c5903b97b5aa4e0ba2e59dff96eaf8fd007e32216dde06f7680bb8957a12ff6", - "397381b989267a19a7d644951ea8cbf3652d5eb63fa9cb3e71f5043b98b66a2f", - "e2a6590fd637c2caf3b8326218a6b887720e3cca9a2919e6de44588d180ea5bc", - "bcd9c869c8a882c83a81c78997c15fae7677ef38a449790423f255a6342c0ae2", - "9de4c1fb735eba10dc861cecb49b5b0aece03141bc19d08943ddca23a8817817", - "bdc7c5af17d980a5d43d35badbf26a87a3f9b7d4e1748610e137b90ebc11072a", - "0e3725d5ff9edd9667992263c1b1a971f3f2b50333286c8dca4f49e34b0152be", - "a803ed80ea65dbea38967272386bb3c4942469119e565bcf4ffa7129339ac073", - "eb713f2a688818940b5506aeb1bf8f266e95ae00e38d280d66f527d4cb9af7c7", - "5a6d59b6a21f8082bec14b3bf3fd3ed80c39938042e75b9057eb5da7c68aaf97", - "dbb4ea24b481e3f7bdc5613e72440c6fd933df26af59eaf209f56747fc2e6f3e", - "e661e0ea4281a2878ac823a4e1eadba213abf406cbc9a10cb2deda6176cd9db0", - "24a86444f66f34345717f9e0b619de156ca54b3d0b792040434c524e4ef805e8", - "1ff4610e56e2e6513639ce9edef5c4472bc78d6e7d02b7b7133ac80361f6e5cf", - "7327306bc26a2920d537d6f83aafa8c5911be1c2198cb69078a3564256eae6f0", - "372c991af1e0a75fafd3ff4b71a6658fa85f05fb0d3ac4f378f1b33aa684bd59", - "49ea49dfd4bb6d59c53cb63e309f2dd5e7d94ba5dab8d1346af4b22ecd1a0520", - "7d0d7c6cff5396b6341ea665e00774ecb622331d144cec7cc08f4741fdc4c212", - "1c2c1dfcf4c44e6fa0ce59bee2eef09605ff3a1c98562cc4e089b782426b1186", - "a2d8f134f9cfa123bfb3b38bd08dbc425fa7a73ee8654e1f9fcc39fc85261a6b", - "c71ee98b4a4019ca6fd61b460bab7ec1e60e6d8e8604048fb110c38a28f21888", - "b136f7014e1a0293d0ad36c5f7cb226dc1ecc46c7f671cea7ad906ce7f00f802", - "4e80afffe23746d6823500ea865dd20d68b05ec6d633ddda8ca4b6498237ca5c", - "b08b6517a8bf86894e5a4b0ab79c8437a0cc9115c1d7497c12b2d494d0b33759", - "49d018e567093702da9e386257f26061638de75db215ab73d1f4ec24a8912cd4", - "ac2a96c12dbc2c2d47b45eb7d6bf41340e63f9f543e1a693262c8b1bea005645", - "ad87f3230d94ce63c510713330b12c4c0ce26b83282b90dfda69e4ebbaa948ea", - "7111127e163872c41bf7abb94b4eddecac6b703db892debace57e267e50f0c70", - "c99dcc2f95317fc81b971f3a306e8e93d8998e8f9c6984f6c1f52e3eb37061d8", - "536e664e2ecacdc53cd8ed4a0bdcf1a0738a1b4cc468e47731791d42cef936ee", - "3b85799046ab7cc38d8d6fef3b0d9d8e6442d374ae5b3fb7467c87a01e89218f", - "99042a3521dd0f0160995bef6a33bcdf583649392570e6facfd4abfed9f6262a", - "dfb6478ad7f6bb0c0131ff6443cbedf103d4b8252fa3f3707e592366ce9989c9", - "6707a77fe804c97af2f6b2c2d6004cdd424ed6aa075503ebc50118c8f4d3c00e", - "7eebb5d05dc20c5c4af001a1b5e6e9100ce118d28c3218b31eae84e3a24837d2", - "9f1abb1e35960964e01e9c30c9f174a157d55b96e3545c683f847c22b5a78306", - "79d973edc6d431bf662b5cc784caea649d7e1ab48db7497eb675e743e3da2877", - "567accdb7ac31283bcdbba59dfebcfb3fb0aa5a9cbf9cf7ff65d454790576aa4", - "d04e1f7a45fa9063528558d19108552726375c4e1941085ce8187809119f83f6", - "cbe7f68bf7d5d68038c2993edd66e2174228cb657c5f1fb2364914ecf5f78e9b", - "4ab8193da1907b7986ec5e4d70e654088e49ee56566277423f053ebe953f9100", - "10c447296e2b63a49a2a8b00970017fdf9a7f3f380dd181f9546e269d8e70e34", - "4d897f2d440079e896e6e9eb801c32fd394a14a494c57fe3ad1690de68b88ba9", - "676cf0a9764c000eee22f0e0bec0cc42b4845882fe5e01b8efc673d10b59a4f6", - "09355fb5259de93b7ae9800a368357847b55547256e52dfe300d1d9f6a3b64cb", - "d11d10693fa2385a56b13c6b044f9c6fdab9d089ac3f06861f04130102b668c6", - "27a4ce92b1d70d39ec3c844e0955049662caffae2f7b4b25ecf0a18e9eda1c20", - "08eb38f9ff05f06b84476bcdead139d4eba501a32abf1afb0fa4a2d3c7dacfa0", - "bbebd8b452e851dd01f30a033a282516caa418771871dcca1073930551165d11", - "503ac8879378c12bc848086509dd057861a4a6428bded2bcd992db0ba425a357", - "e1cc07f52175a4be8765c7d6f227e9c4f20ecade4342adfdb4ceb03f0f846d23", - "6fe54cd2ce71002b568aadf0ff454f86c2f118b1ae20467c898695362955d779", - "b841eb920dc8321ed0bf46b015fee39366fdb667de7606cb07acb2e5d643e210", - "3b41934a6d059a8e29ad3768bbc12e3231e50cf2b297d416de1c5f5f8ff45295", - "80d996902619dd2718fc051a05221adb66283416af7d0eec6e50d5d4a58b26ba", - "c84439aa197063d5a9cc44431904bacf0983e29912d95c64bbe5bd5258a07c50", - "1ab4973c5adcbe99f82b565d81b7cf18a2f9f17dd7119c64b490030af58df3d5", - "3d00b76decf1d5f7543a4e650b0680bf9a188a8704c0ceea3a8e3b95d90fdb7b", - "ba82eac707c085ecba7aa8426b4afed70486a214b345df6483ce3637cfa58ded", - "99897536ed1642c3b587541ec85efd54caa6fbb0869065531ec4d74c945c0485", - "c029b0eba1299bbf07d4cc6a947637d19a528d92c4af6fa529b13196e0d57fea", - "fe5680f25b36b07fd2003f35e8ccf026eaa6af7650097bd0b038b34671f21aed", - "9a4bad3abb7cb333f8b3c5dd48789418a37e4186cd37ea9c30bb67bad745dc33", - "9a79a104b8c09c3b815c5a70bf20d7c1e5ec57a1fe6e5d56cfe4497e5455dba1", - "e18a1433731db0354be68deab2a77fb3ad98606fc5dbf902e4f5db590670774f", - "900ed8bb5e8e8eb25c6696a75d31f7ace0f2f6a9a9363ba0cbef31584f381f42", - "a1f772038c22e50f9680d54e6d381b1a8435a500f69ef8200f15d8f9d7bc3009", - "47eccad4c9c12830a202aca812bd7ebd75b0f26dfcc5f94e2ddb0a2ff2790921", - "73765f3d84ad3f9d79532a35544b6dba7d3a8df82b4e394fda6ceaafdc42fe75", - "ac3a1f1a979e28cc33b885f7d86a554f859dd6d5d44257fcc60d493ba616fbb8", - "32919c470b8ec08571cacd107163857f0868bb0f12aed965660543f7ee04625b", - "89a0225b9f419c69ce875655dae10b6e264120a96dde5a51f49d47c5517849f3", - "d2dee8e51d0e96372763b9e061598fca03e5abebc4de5a9e446135a4f5e01e46", - "0d42ba486af53b9e90afd87aabeae896dd92c34b8cc2da15fd3f33e03f7f4dee", - "f312e8c284f8144d35444f77319644b7d110b5a1d80ee3de755a732fd1c22e26", - "049d7db1578b389c33f1ffe78e868218f43e28fcb3b030e44f8c0583422e5268", - "80b4554c96fe27c96648d49b821bba0266905264464ecfcace8392572b0a8c80", - "46fb353c8c9789215b0bd979fa5427158192376a231edacd2f18f777181faec5", - "1d451912473df40ef85473c4f24a5a70b477b21d28c7f5ece0915505bac56fe4", - "383147de06b3f8a1824861e30b9471075bb92de410badde8ab6fcc678e51bced", - "930b4be32feb58a76e08973b480cfab516054f2b8ba23eee2fb737291f7d374f", - "bf6252986f75e48dc237b9b2ab2360714097f144b7f40f2063134f10e641a9b2", - "148352e4ab85728322af9f104ecaac17189db9b59991faa41dd99c5461fbea20", - "2c37d04d26d8c2245f8c75ddfe7a5cfc2904a9a4c7010ac33f6b5fcf943e68d4", - "647ee8d65cdb1aa81ee5b5ccac100764061f047a781f10488fec0133cca7afd4", - "9a3de52f741807528072eb1f3a1773d6dffd87c91cbef6f0629b2a264e568c8a", - "279ac0599f75d87df3b12c455c0152d172e23af1df5fd9a9ff5757544557be6d", - "c26339d5df2d739b0685738f6432feb493033e3f0b1d587ec106004ee98669e5", - "1a65440dbfcd30ed0ef894effdaf5037ebd4a360e44da5db82818d6bb51e913d", - "391b739446cf0a31508e64687b038cf5f22083df0a76b931512bf181d59e69cb", - "f58ce5d19ac1837baf00e4de80551540b6a479f58239ede4cb188959fd30c7cb", - "c0f8115795f0433368209a37e19e29e02492e1108950009562a3d7593e1a395a", - "41116030ba6ff8804a1b22f41dcb554a4a63b0eb43bc69f6029fce177b852840", - "8f17cf337861fecec2b2022997488ca4b26d74600892b3ba5c88d12dfce97396", - "094eff2cb3698371e7ae138391414d8dd4eef061a4fc85838e686761ab941f45", - "c5a76445da0a63ab106b9955a0d3da50f88f075cf55fd66e85f8188690f77e0d", - "24338851c67f1f81d32bb16378a9a680b3d4903088a3df695df5083a1f55829a", - "f2810ddcbf76f470f44c4c4d4c93801c1331062d51048820dae77ce670e8155f", - "007b88dedb9b7a10657f7c31a79b9a443285e4c9f9535be84123bcd6e0c9e521", - "4cda09e3adc3280999bb001580a5362f233579209403c0e139c1cd12af39719c", - "ecebf3d2196d2f1bf813c5e2f662fe16d45e03a65a6e5701ee1acad7fb615e92", - "f99e07aab4e37e43c68bda6fff22bd5a18f24480c00e2bf227e826092a2af216", - "d3fc44a2c79184895f443cd99d8b8753d288ca6c61c66e11a22aa84d3ea21480", - "0d3d772d5266ab894ee1849c26764d5284f17785a6580fa4fad17f4f6b0fab01", - "7e065d106b2cf8908f9cbaa1c6edb965fc1d99517332bf733aba5b61e0f2f0f9", - "53f4b35db1c8641ae81ac55a216c8f36bc79b249fb5732d53f251dd89f54f17a", - "a5f54ce1b27487cde7a8be2c4d1373c8c480b845818d43951d847fbab0a117a9", - "586eee9ab5e381ddde3f76f2f9a4f6a7224a470a13e65483d8b4137bec87f52f", - "2872835c5ca1cdf8662f8ea87b54d51f337149760f76e2030bcdb154c75829ef", - "d84e60dcfed304d750e5fdcdb46e4ff82c5d3cef4fa12addb0afa7a36bbfa436", - "9f5bbdedad4e097ef537ba96798045ce3cc49aeeac51fc68ab4bbfa224273599", - "6c31a5281c5080399d1ced78a650e6aaefcd107002ec012feae48e8788bfd46c", - "6551daf218db4d946e04b0c8dc5bee4d2b41ea93a6b3e36987a8b9c1f285206c", - "33f798527f07027302d7ccfdce91d415699facc7827b5bb58f6f3fa0d9b42468", - "e7adf3a6bcfc509ab7b71bdce3e198df2dc78d8ebefa180c354f1ea214a06e10", - "d48674bcc52ba1aa12a0396dcc829442899a55118eb381a80de631b351d87523", - "dfc283e3e4e5e95c372dbdb3e996ff97bc564c6210da7b9379c0ab53d8ab0f48", - "fb5fecdf283dc632c68ed5439a5368fe4bf564cab3240535a1a9cf0c202e8eec", - "abac92866c4f9c81e5f43bd223bfc957674b4bd4cb1930cc4b5ac66c16de46fb", - "cee66e090b7be8159ad258c365293f3e6d2e7a07a23f0df4d98156569c573ca2", - "4ca33531f1900b2e8feef93d58fffdea2bf174ec50214c6e7e95871dbca6d3cb", - "0be6dde561673fb0d515f30b26f010e366fd7e0a409fd4c99e1d257e9ec6fa58", - "8f863b9f5f7b1900e82a3fac6eeef15f87ee2fc614076567a2be9e2ded25e16c", - "14af8b2318e54ff96b0a1434a342dfbc7e7f0a4a020baa29ec28062932582cb0", - "e75a000377b41afe2897e0697573b99d8e8fea48a75ae9bcb749e7fd3e8537b1", - "29a6de88b13d9c23cff3c2c30094687f7027fb8e9275628915d1bee5b857bd83", - "e9622735165e1461e0985bbf61e0966e2e9e51ca9e83a251490862974131ce8a", - "efc7436ae4651aa8e2f526fc477f67d3937949621d42f24d5ba0d9eebe46d6bd", - "9623daede7c8d6cc9cc8f16b32e58924be91cb05fcbcbdd6bb1711c8eb077ef9", - "eee086dc3aec70b25ffa97655174d9f355b00985141feadffc45a9c4c52f6fd6", - "f6a974fc4696b6bd75186caff717cbed58151e333371360daa62558f7765ef7e", - "41107b090ceaeb6add499c9bf831262b32f4eecf9e57aa9c194008a6ee0fdca1", - "5f03197ea7a338a8365d6deb75d4ee90d90dbc257900ea42c653caf02a8984e9", - "ab6ac8f839c899c7acc6ec8c0a99e725aa6ed1a9305c8201c75e73f22a882caa", - "a13ba5eae9184af0f26c6889de8b99d1be016ab79faa5df5144d8e3e771ad982", - "7906f4d5f738a943e4729d910d07e47a41fbe5e76c613ae0d2436339fa00cd59", - "d257cb4283902abf55ba8fa7b052294a175ed193da8d7f7fa7bba679d8558cec", - "84742fd439e17822c4c9eafa42c918feed4552a5ccb888797909bb50c1bb9d38", - "5abe086871ea2787220eeb4e023dcd113604ae3068a427c4f1cbccba1df772b5", - "93d726da39e12a0fddb49207cb0890276d797af911e3bec68d1eef40974785a2", - "1b173ef6e8ab99f829502fa386123decfa12da0f7e5f7732b9d1b67d34d99eab", - "ad57956f32883f637809c76095dc7e72c97b8bf6d861517271a447933322fd72", - "9454426bb5332bbace6abbc212c1af26e0e373c2ecd5a480661c670f0ab6be22", - "e99176db0dce0cb82fc23240abb13950ef4aac6376f14e38e9f302e2ea8be66b", - "a71e7e1845211260be23107aee59a84b484bc58797d8259cfd6dab0834561ec8", - "e243e0671cd0ed4c267aa53071e5b7566eab6e3d222918ad60eac7255ebfa4ef", - "ad14776b791550aff07a571e080933a8086065070362f148b900e1a6920de870", - "72138325633e21af29bd9d437ee775246a34a36acd86c9f22efbc310aca79192", - "6f53866476875eb3938911ad5b4d16d5ebf4e71a18ac47ee598642079f7f3860", - "6866a2091ea15ce4dd0c57c00925a3f6197ba0023957d039f9f8c6315d1e09ed", - "75e7bff18575c0ddadb61f9676573bfca8ddaf583cfadb1a8bc8b9e250ef3a85", - "8d9ef6e7a7c008b19be04221ce2ec4e80994bebdda20bda3750dd43d7d0131db", - "b282ab1d4e9c94290c0b7a0b255adea74a073fd16a18653ebf6e1e287bbce412", - "9d0f3fec4dd04793debc82ff4e19be5037aa1404eb429051d72c2ce760240594", - "4bff6deddea7bcc7954120fe711bb56e4b257b10fe512412d0316c68588f835e", - "486ead699d4c4c5b3e9bdb9f5a566a937ae6499c3337c7fb3d7b2c0bafd7730e", - "b33ef0feb490fa4bb411377abca8a264bd1b430162b01ab80b882d75359f55f2", - "4b5fff195cfbffae6da1a7d0c1c1d557613f725333c49c77d01424b392213e09", - "bf369f79a579f5db8831cf479e713be969dbd4e13dc2d83caff59cca922fbc38", - "e2c27987916ece1164971b216b9ed651c87b1ef10a3ee5a9bac69007defbf716", - "8d21303b7f2726fa7ee25c147d0bf6926041e458cdc228d5b2edfe44dcd5711c", - "6332fd678f62cb4853ea98c47513662b5daf955096331b1987aca84650386f4f", - "32462291fabdc4be3c9ad461f516eeda672473b9b0e81b8299d3534b97ce63b3", - "43b21b8e8be9344682e25ef7e16b2a04d965f8f9dc982ca68c8ea4b6d522f052", - "d054de7b64f37b2fa4ffa96a19e6d9555856d527b216c52ddc77288463422884", - "41bae35d2df5386591ead5bf7580e0d8dab46ef5b5b20ca1d67f9ea750cccfa7", - "07d656f486483e84d3cb4321c7b9a90d52bdb3f0e529cd2ed5aab95c896c6899", - "c97bc779d7268241b7603b78ecf323b8633868932f9872372a20e17f61194cda", - "eeaf8b4925812d8574f1256d62f73402d044201604865c6af1d07f38861e8b6c", - "209546e99bffe2252012875317ae72c24f86d18cbe9ec54bfdbd1c3d3da23b8f", - "dc8d2654088dc69cbba67a653bf0cf513091a4ee116cbbe2dadb94f01b1e8f94", - "dda71d99cbae3166ff7d5adbbfea09c72312abbf2cd32dccd0564a743eaff996", - "ac45d6f160c9de69f348c6ca792eeba47f07203f7ff0861f225d85233f46914f", - "79456bc335d7feb27af40fad2b68f2cf28b803f42d8bf6aae1bdb1376f84eb10", - "64cb15e1f15bab8b0feed3e193045ee56b7f87610dc8f91c6f7259955a220ea7", - "31d008c535a4e118a6e12a7fee66e59bd9aa070e00ee164bf52059c37fc6b4e0", - "7ceaf9067b6d720c3a6033049448930554d85f390318ce01f41b476f4e2c374d", - "3f147bf6a7596d23711055357ec0bd8ac13ff407a9cf2ab05e39ec612b5786f9", - "bdb8e3105180d2373546ae34ed93b03a110b373e7008382c474f566d9f61182f", - "71f7c15b98e3bc16357ede6d6cffc11e9faf39bd2bac18a971d22d37845daedd", - "78e8534af215ed49b6d11d5b466a81d1b8faa81e31d89485ae1ff876a241fc00", - "beb84c0895b88a3207450a03bb7211fb204b9ae55244a28886da937efce88680", - "43567c5cf0672358161c1a7fc7139585eba21c2e8b57d25be094df9f83029482", - "778dd12454ca3fc5ae181c2c196d864b913e6268df296e3f7e00b2b125a5f1bf", - "8b35e0f8df7866a4be9ae53f70cf67a3903f4a38deda25cd18998d05bdfab197", - "f42c553802b9f73b61a195b05ae07d86a3e414ab00f18688838b9c73a7f7bb25", - "959618884dae535b95bd0ff003ce964db9b741f58592c4a0d6128f23eeb77908", - "de7a14700b8c019c1f90887df5d6b5fc10e90e61a5053d16336ca6bf6cd072a5", - "9675cdc81feca041f9b50e445247d9d3070a258aa22153051f09c340df7a7213", - "386faf2abb7da3163cf4c62d170bfa94a2ab8fc48b24fcb843f5202d604fb2e0", - "f06f35c76553fda980eed44d9f997320915cad4287c68020074e686dbe624e9b", - "1d63b5fcb40cac8e34397b7df57c263ab9a81e8c3e1be5edfc3d839599f2099a", - "954031537efe3994f50cb3f009f18a057076375e2e5ceaf1470f9fb4a91028bd", - "c46b6708658fc1cbc94b1d680198632b77a6eac3651fe2b90cfce6a47cad30a6", - "cfb5938db7ad8fd7c418a267bb6bdad531b888f9b2ef982f8edc025e160cb587", - "4d7aa91eb73198cb1d46aa82b264730aa15f9fc6639a124239ed1ce17d9ddc58", - "46a7ed31e509b837b1c265a6e4f01a418045008579b1dcbb63e3747df748a32f", - "259032c99c290c8ab29ca05e0263765d92527bd8483e8c47544372bc5d0db782", - "7f1749f19045d603fc3ed409c28ea5a92f6120a9f6d067464e6c26701590cf1a", - "55315775cad4e05639b7b657056d98f9b81b2c24f2e5904992dd49a816c5c48e", - "223d61ba4305fc79d3679549eb8f2f9ef13cddbce522ed5fbd5caf29353622a2", - "d1b57a33fe85d6705ecaa1333662c771b6499c9933d17da0880080a80d0a9f28", - "b1ee71f4f702b38ff59f367a0a2cc84fa54b6322035172ea08f8e66cf9722ccd", - "c65a135365e1bb5e6cc7b9ace7ee1dc80f613bc11dfe9bff79abd5ca095362b3", - "5876309f3bc32d7bf683afd65194701bdf23892f37ad94860bd3aeeae68c8e8c", - "651db7bdf95112a06572f606f3382090ae57cc1a847a5c72407bd9acc3b5d45d", - "41b4c71bf73c66f5f7fdedf601fb237d0996b06fe78ee28e3ddfcbf195e4e6db", - "4840433387ab1623b04e3095d581812ec492bf633a9c6f26309e4515eb7c6ae2", - "a37f1f753e3927b7ef46e85bdcefc193bb5f776b2646fc088c129cc927a34e24", - "fbab2c286c421ceafccd4b52d6994d0d8c6d9d087378a0f2a175989d9120b739", - "3dc1671aac251259cb939c9a8218d2fa5631f99bb373f55f689a8e3664d07b1d", - "cc4127bac643830e061dd3d9fcda3d37b108b4b0415b42490449d512ecdeab4e", - "7a18e7265a0e00c692423a78c3439499cec6a5f1e10147cdbf098e63fe78ca6b", - "136f87835c641497435bfdd6e1c6db12fd0d5e36dd1310548adc19fca42202f9", - "4aa3de2f167e509fe99a6c8a87bb31485eb637296b2314eb3e738cde1512ac2f", - "744d53a412450871d696f3651861ce735d75184ea5653aaed9e376ac8bb13a38", - "af42fb5ba100954dbdcff94a6f5a203524791ceab105c55d61d3e79b22d75ff3", - "5981ea7b1e88f1c1d3458623fc3a14f72ee196f092cc328a262630c4a9c88276", - "667fdd666c72141b7db16159030883988e4a5bc804c918536f513a0e04b0fc7d", - "1c55bfc071f8dcd5a1022e352c7d55acd2ad9cb53f2bd9a128f87f00b65ab4a6", - "9a10cb1fbb5052a45d27f8e2c01f6813ed6441225e0cbd4b0bd6401775ab626e", - "f4f3beca58c03c5c5b04df8442c94906fe393a8e252e8d2ba2bbe8f8c4da69aa", - "1be1742b78e64214b88eac1a8d9f55a3f02073bffe9d34b94eecdc42bc4c18ed", - "a3f32560b6f461bb9f808d6873a76769c9977e03b67dd6abb851f1b01536acff", - "2c80ea012c1417c15c25413965b473b6db30dbf4d529fcb3a89540f6f6ee7ec7", - "55c0518e15811d69a522148733faeeb5932bee72b0d9ced0cd3291f8e21a20b9", - "6d93bc124122ae8ba26028397dd10e3a7bc65630bb2540bd5cfa5570f85be25f", - "db4303187883bb0da690ee81f5cb1d583dbd155344b1af8c0770c7412d549cca", - "1c65bc78e93172e2cdd2e083a280e8904efa01aa7a35dad00cb05383dd7ad224", - "4c2afdecaecad95587d7ab6476dd7696452fcf0bd91e576c797590a1f734aceb", - "28bcc78dd6e94489d2a3ad923411214cde3989fddf7c72a0fba136bbd812a22e", - "b3af019005d17043cfa303054628fc4eef9b73d682c744e041a5862520bfb0cc", - "e7ee190cc1f755c30cbd53bcae51b9aa23a889c86558b55527babe673a0e9f13", - "03f82c1eca4b6f4b4806549cad539de9d1f435cb3172ed468cf95eeec8d6229c", - "42202f92784996d0665dd7a66c2cc3c70e8a17e220957d77ad15023742733214", - "7f4216f9a7726a9e5877e53c239b6582589d4043cbab82ce501cd104e2003415", - "5ce2ef71f8602da9081a4468c84c73c2f32835e2f8b4b1ebf060673ce6e89d99", - "c3c8bcebc9ef60bcfb63da5e8fc2ffe4287006e7a713481a59157cdaf9c33821", - "3ff2474206ce8bed53b6141685271c1350c35a8f4492dc62b5a63b15813bc11f", - "b8d842abf12bc6e10546e87f12504dc445b5c60a2d8dccf89ba8f691f9d72ecd", - "f3321c34acc247cf1ab662782824972069d7057e38efdc94bb4331825681085a", - "6950f18827879a241d750c425e887b84336e4bf779dceccaea2b0e78ae86ba0a", - "2bc00245d35002455522d4b9a971427c1cb6bf5afaaee7ac9835494f5eff4aa8", - "b56689e34dfa17167bfd020080d28ca924d4ff2afbc0dc7274d297a92fff264a", - "5a846792feef696775e0b359be0ea971d9941fcf493a62261f3a2c61ee51764d", - "fe1d23fca4e93790b1ad6895d014734918891fb42af1c036a686e22b1455d923", - "7c8305e10b79d453c5abe2228ea858f3e1ebe62e5dafe56e8503183429acb243", - "bbbd4b63f80d7d57ed65fe1deee8ea187798f621189ad01ad3d2e86595bf9c62", - "bf18043020de7dadf72c86c84d30f7ed3b080124c2801048d146be5cffc49f5f", - "fb2436db3515c47715d8fbd7f492ece10f82d45ef491ec74bf141457d520dde7", - "106c4d70db2a45fb1fff35f25a7a07b4741b3d0b20de7d9d67b2bf8af35bcd98", - "38406b720f926d13a1defd6f9823bf1c8897faaa0abaaeee19629cc6bc8e077c", - "ca66fc22569f5e6df5396ccd72194e7942ef8b29601d5c409f8ce2a2a5064e77", - "1f0623337a3d0cfcc01d0b5d0e3a31af7f41f4542b90030282772f3e1e8032b9", - "5c0fb9bd8d4b2325837fec129e4395944833e33ea7c2cf29d3263fb2064b2c89", - "65511b05411bb76c25c8248d9d94253acd9a758cc4b33975f4e643bd8c318817", - "bff2367475a71f72bebf1c73c1364158d0c34dae1180e12cb0ce94df91c6d062", - "3bbd8b2c86f64ed0b21cb95b2fcacac11f28e6d8323741f24f5dbbb694fc521d", - "ddebb452661a2fc05e0fccdcb14d9316100b48d64a0b80b882efccbf7bc2579a", - "3fbedcfb860e12a2b475fde81917e27778fcb0e50512ac81fd7499238dd9eaf7", - "76b25df8110f20e8002b744b3f956dc34fbe10cdc658b1482e8b36d585ae8cf1", - "67bf8e4b0c59bc254fe9c670a41388579412c745749fd976ee05117da15d821f", - "71d5891bd82326347f1ee892d13ff45aa8e8bd6852ef39bb5ce362bcab8beeb2", - "203feb4005d1af751e6f1e4e2df8b104c4a8b6e26b6ea009db87c33f8ddabc9d", - "7ddfe1ef3fd99937980d92da9b1baccbcad143871c7a0c94e7f69151112946fa", - "d18a582e215fd962949c0d0ccdf86aa9bfd2fdba11aa7aaad26b3d04865d331c", - "77583fff642051a4f4ef27c05482741b53b33182384a5b74f0e2a86e64d47f2b", - "dc10e700f05c6e4b2bf8d6fd3ee22079240fa762b9b7cfc479708679ab3f070f", - "f84a8a021686a83f5668385e54ab0a1acdcc376fd10b199d15d6c4d07cf92e0d", - "00cd256c74fb3c88ac6f3ec9d2de465988530ba8b8af631d19439d7af7229f87", - "b22edc92eca03e6410318f7948c274b8814300395b4e823f73719d27269416fb", - "fcb7476961826f5e5a9bb078e7c4e30b4b03a4d40bb6c4ac38ca763884f44632", - "9eb85228faae8d7fb0ba992fc96ecce42570690b1d068eb3dee7251683919ac4", - "3a7c3ec55301c4ff66e60ed0aae5f67fe98bbd18e56a169f60b68e71f0b3d11f", - "0f16a90bccd2dbbf5b7d797ccbf71812da075ac5d23c5015dba3ef68022ed002", - "10413caf620536b1e725b8b0a831f2e7b95de337a28e50a97534e5561073ef62", - "117f99f01d937bb02854deda107767065ec49f67a0669baf79f2146e2358e4e8", - "2656d0bbdd363ba4b4f4e003d59a2c106fe72239d374ab06f9e61872f557d492", - "f7adc9e46146c916e322240e530626101deebe565311cf03de9515062921c9c7", - "a50cfac8e42fea4e252f9b8f5ed5017b36df81603c07de1a08ff4696a3e76452", - "45e836a9cdb382e95f15c7d4c2a2c5fa7876ff465daccf2178ee457576ccea9c", - "e63f7ce7502b4a1aced26e732a14ed45fe9a60c702dcc09cdd30ece531153246", - "4a83a8f382f4b44ba0dba0bc8faa5821fdfd5f3e8501e6828e9d4513ef66fec9", - "f9c5f6d32336c7884f8bfa45d7dac0721620cdfd32a986b705f21fc3127989c7", - "9344a25f304e9dce08ce2b0ca494add90205f8cbc1148a07dccfbcdcd01d8cab", - "c453a22bee326887f72ae6a1fcb7cb5e944e12745f0ced67501ed8387b8c3503", - "6c4a4f8ee21422d5aec50db0c461a1bd5294e0bf032a8cc6357d57b105ba46c0", - "f6d59de23671a461ea845b8b1993f36c2c77045f4d0fdde4a023e6c31c7aaa80", - "2d1a32a0bef024c5365eaa553d9fb2e3b5e5d4943c98bab13aecae72b62b2a74", - "467e1437bc83a61836317d913cdf632ba8e851ed2281aa85466408dfe2dfa9ca", - "de59c404b91c9806a0bc2c4107e6fcb573ad09857c26ccaf2de691e323e90d79", - "8c056d416ca69c046e08e209989ce60d70b250d46de02bf554b83dc932a2c7cf", - "9b293bac0b82fabd076d3101a03aad46e1cbf2a503c2df81b8e4ba887d3d9fa2", - "b2c51d85cf9cc567e414a00b213b33731b1ba86703340a2a30d61da27308412d", - "59dd9522d218e68aa1ee8db5f4303e2b32a0cddc70c5563be9c7b509ad28d1c9", - "f6745cef9b7d06fc894e78a62a67b30b5065504e6b2ad61e698012e1ccdf4c00", - "a328d282e6f115faac9829fa8b82d7d9fb7477649fc1b5b1fac54d3d96aaf31f", - "32bb438d927a78849ed7b5d241eb99c9ae739b589f14a74f74bafdba219cceeb", - "79b76a1a045dfe4a080a04dda1fe79ca1d2f12a7958c3fab13a11c26462108dc", - "b150948a34dbd9cd12888e6c8b4aed5377d0a26fc3281fb3befcd93007d9761e", - "32a68a1135daf590c0dba2de226bd999685b65a44e14c338c756a49cc4e78baf", - "6989016f29d148e70cf0266e3a8b37a9b6a300938c637ed0835f572d907f00ac", - "07f8c4d4031d808a49fd51be43cb872a016365716b50261e32a6a4d49a662202", - "66a9c71cc174c6b6073f36f5c614e05c11bb27c1489e109daa5ccdfd8a1e4f87", - "fd166fd6bc674b72f1875bf444798bf9f9e2d1747b826baefcf507adbac89271", - "6ad514b680f04f78d3a56979a001697d6210cd5b64ba4ffd1159231a14f63c2a", - "6eb87463f14144404dbb69fc744a29603fa585aa1abe2c4032a6470d3941bb87", - "fb1aa36f3957e703f7a0ae2f7236da7d4cbe39d2be155e262b1b98eb1eac63ee", - "c0e4af1c8fc15590e81b714fe6dec92841be6f4917cb981f00f3eb76a36a34a2", - "07e58d5fd60d19bd6b0edf34a9ca2f72ec3610a003d23a9ff94e4859137cd4f2", - "70985459d60fac60447a9c4e46c5bf101e354e04c9625fc9a0e5f4a3737b96d3", - "73a9f419ea6625f05bce3af128db15bbfd0d0e164272a65315a09e73138cb434", - "ba86c7033b4b1691f4e4394308446f111988451bb49f93b3333615436dcebfef", - "34f5001d5d12355a9dac098055032c2bcfee3221158a1ec50269b4003bee5326", - "c18d4cf3ab42d4af34442022d49660cf4db386f38c8b1ea4aa73f9fd134f0b0e", - "b3f2302bf85e555c050e3d180c4d9429789e766612fc39a037d453f8c9298a2f", - "5edab1b61298a941ebae8ec9ba175ba659489167d113b5888a66ac8a80a90022", - "b90eb8366c111581d5eb93813573ce8feb386932794810eeccf4f671162965c9", - "67f1047d4bfb2897e94b4fc51467a06731dcf23f30dce53bd4df25de5b0ba32a", - "72e9a45ac6f70f8475b42be7b5c5cf409a109c5e103a3807dd7aa787f884bd7a", - "7b8867155874af0bab15e0cf072dfc34448caffd7b6e9eefac710b62e7d781d9", - "d098dd278155d54db1c8fc9c0c8193cd359bafd140f07f0988924b9962479f25", - "294b5abea9fa8a5509efd3c1758d9372bf3fca954cd86700081bb1ad5a8345ba", - "a2ee2284f8eaf9505b62dbbd2f0929a04f61862c4bed848f8f5617114bf7199b", - "1a432748f72edb642d92a0b1bce09f9179e3f64c75a810f980035372572c4bba", - "11e9d0c0ee85fb67046622c90a1e0a7729f17dd3fe766c4bc741feac11d1235d", - "d8fab7a7bde3ebdc226abeefdcac43cb850d99d1836dff33cbad1be1a591f661", - "670dc87e68bc4433b59cfd9da0499bf597d80b4f63185ac9a27b3276520a68fe", - "7d301fdc6617422f582dee1e29b241a9fdef9d61dc9bac074711be3826110747", - "07b7f3b51f21d3198878713d1ec717ed3f1f296694686d2cee107bee0870b210", - "f1f5c0655083a3e71d43ad1cdb58494a8634628359293f04950ab121649bca78", - "2e09bbd84d8ac78bd0941a918afd886f0d60950958225873415ac8d4b9e57fa2", - "d5923ee3f6b8c4014a0360794328a02319d319b531012e68bedeb0670d221f53", - "a5c3479fdd3bebfdb158a4ccda7c2238024c7643506337ff957f00e5202c6761", - "d1d548987c34e0a69f0d65ef629038e13bde9147b6acc0e4b94a59faf1494bfb", - "62113166492ca19c5931d233cf4b22a920110c666430358058b907fdd01faa71", - "07cf45c39d32910493ef399fd13ffe824609e96d7dcfbd38101d2ad8e40c8112", - "3eab3351808693e318450419ff3d7aec3330a435a758ee5180e28447c4cf93a7", - "62f02a3eef3364ec25b5d196ac74861a09a3804d35dca244dbf6554133b8bbb3", - "1a77ad00f29ea8ae83f099651e89de8f9c5f3025c1f3da1d0afd77ed7a8d48fa", - "e9fecf1d7746a28eafe3c3effc2f827ad1c893cffb21f56cc2281dcea556a5d9", - "1d5aa2a401064193721e80ad4aa16db4e2ed964a387e7ff56061ad4e3f516fe8", - "4dacedf819795fe2b025a6dcc7c120016c4cb43c568adfd2d7e052591b319f5a", - "fc0173e5f5dec295afcdcfef88291aa0bf56ac05dc4d0f62be4d8674bb1895ac", - "361ac463069e98d489f948e93fc748c58c7b9206b64deed2a1978c3dddc7407f", - "93beb6d38bc92a96893db0e84ae265d3a7875b288f98b65f55622e4e77990a57", - "0e8c8a12eab27eaf97ae5e5c9d6478c06925fdff87e4f7c4d788ca76a2db9c1b", - "c7dcea51ca74f9aa5c1eaf04ab624603d8c015867220a0d886b9358eb5729e10", - "bf82b42b918a8ce39239cff0d6ec7518b79b703d6c19c5a45f121fe3150ab196", - "b49d31aa12166e7234ebfe3edaa2657e670d5d9c7a86bd8fee44c7aa6f420ffb", - "e11f3b9652c38b9956ac18aff8829fbd1aa280ea4a4f7006ebd491edf422b1fb", - "7ea40accff8345a69fd3610ae91e29adb6f8f42449786c3b05304c25f21823bd", - "73f0c021ed27bf0f479ade100d317791a09fa7e646ff7020b8f63e0136776298", - "ca69de73b38480979c4cb50d456f237d12ff200aa1f28f62331d0b0de07e7be7", - "eb6acfc84ad8988a74399d92ed00c9b5e3c5cffae038b9b802018a2fb46f75be", - "d073f440cd3a00cabee7ade3ab3a7e2cfc22331b1c25c4a80c11d6e7fdae99a4", - "5ad7ec71c37a34a906222d0a8e969d37c9724d6ef3a3f989aa5f0d8d125acd42", - "1847be7c84821c675210b823c5010e6a985d38a54b0d54274cc3be0a1433d03d", - "67a31da78cacd8ba34c1002c257b6265e7277d0a138d06fa6996a0c3b8461b3e", - "d59256ee13a5d4266cce07d4446d0de46a74ff39f21c1c8827532f45498d422e", - "2a0c247effe7e28c699669ce2e1681735cf2688d0fd05802583493eaa864029b", - "245f73ed23712c70de87f95b3efb08a42c87f895e18a513e6e7e4fec483098b3", - "495fcc9ae5e40647177d62df888b6651c33843432399610d5ca26cea44d91163", - "afc23233074ec6ea031ea3218952c09b396031125a2901dbb6aadca8369cbefb", - "2b8511b1df21e721993a3ea5c25c147b00d6dc0845a1e5e7bf3cde3a2e774e2e", - "47da06e670a9b716a222d08d9c3a82677e17f9597e52dd246abacd8eeafb1a29", - "786818e20439efbef606bc67a8d9cd6dbb54f4437328b7bb54716b5f3e6fb67e", - "5b5d7cad857cc81d710e48c504de9ce7e9a5b4866531c24619707c2fd26ffa2a", - "8ba01ff75ec27929052d77d69f7f2d190a462f07b70a36b8eb50b55b8abbf246", - "f91e080111eafade2993b364563a5eac7c47ed94db8fa8ef5a910a6d225dd821", - "fd0968c34cc357e0f6d2e5ad867abbe1cf7129900a3d36ca698d6b1b6a0fa10e", - "33d0c1a6c8756ccafb01bed41c68373e6bb896a733c9a123a9b610c516e78324", - "c515e4192fc52e4b1b68623364af0755cbb0328db2cde5fea5de1f1bc5095daa", - "db40f02f2da53d93670d92b27409f7b272b56cff562675c9992ad09a3037aecc", - "aaec13a6fe019e811b75fdd12a0f4a1ef8724b9bad80c9ba914dc39eb4f7bb1f", - "e39181aaef86b26794d477c2a56ca0bd0fe69ca8be7358ad90c62042e3dba331", - "0936c532f24dd112270cb37216be608ff385519534047c4e0df84d111658eb04", - "048c07864105320ecb69a4467fa53b3b8d3f89507912d5064e363e48f831f9c7", - "e4c974ca22b77591bfa54e76866fa4fd86e8f12943df56dac8f35920a534419e", - "11f66658a1fedd32978d0969d69ec6ee86e15c3f914cd88d0dd244141dedc9c3", - "fbeba54422dc8ff7185f75f7cba09243de5dd2832e52b499c0ea77de62e3dd07", - "39abb209fd63506e6b82104f38d819a8e13b77339aca905f816cc7e9c17eb686", - "df7b5a3917c8dbd06fb18177c1ae3c47005076ebffe7ad00f9dee1bc78f2b2b8", - "c3c69cd80cabee508b96050948e19a52c3d7b3c1331eb61a77adbfdacb2b0411", - "36502e9bb5116b49577589135e6b3e05844fa4113c3a7df349c80c8ec5a83027", - "39738f3f8406a06ea70791ba72d607b00de78f656322e3c04e8d43fdb42fd35c", - "8597c1695e40cdeeb19edcc2557edead96bfed664480c9f18597dace37780b9d", - "f00f75b9292468f8a2b605c29fbf78a91eb58e3332e24c38c3473c52fef59e0e", - "73e77703f54bed1279d3b73f391115ca32f77a17721bddcbb4532ac90e7dc860", - "ba78ef729416895ef8b1d91282c30114d7b1f34c44d03b4f94c59a0cfaf58d58", - "a789a699fb25ff3d26c8153017fdb6517bf5ac2fdb883a565cb9f80c28308557", - "c986dbe15086d78df36dc8ef10e3c2e41601e6b1e29352a9c9680c3ba8a7beed", - "98a551ef979b910d400d1c1993fac2eba2f609a38853c8c39dae1a1c88181534", - "52a337c27aa077a0cab226cf9657126a6f88cae9ea88307273d8682d94a34ec9", - "ced576bc1f486e0870a7d7bdaebbace1397a08cb4f5d5da26528b5858a624730", - "92096df9bb8cc70f64d80e079a8ec416a55d909a0bc4f1358517aefb1a3c2d9e", - "73fdd9abe4091b92e25c542f81419944d8c2817134e83742106515e39c10e4ec", - "744ab8359f45cbccafd3f7f440daa92c7a28f04e2eb32c0700ed4690f0b39e2b", - "acf1cd2949b1b0e1351d2c7677582b8148f8c9b55579d9b10fc5803077950726", - "52f3e7daeb9695f4eef0013e946cc3da981ce901ec2009a6636d2627188e6f67", - "0f75f525851b941d223ed3aeaad6e11dea5eef864efc487457053cfda215d892", - "3d4f4d0fa853ab9c608d6eeef100c823eae723fc68e08b1b1e95f990530550d5", - "afa76c92e197aa8051e7ce7ecf2fb6b9183f4480fe4f75ec3990e0bdfa10907d", - "7c4c5f8f646686ac5736fb2554db81db5a1ba3c71af034abf85484dc3ddc3ad8", - "dace45cd7f9f0d7acb24a0e5b9994928ff26fb764fef6bd43d05cca776cba6ab", - "21b6f5327406a00b97c5c9b4575e197caf42f6393123facd71d0c8a78d0db1fb", - "c618c028d74db161e5ec1243e6e9c34d716b05cfadf95c8b395130de7a8cdaff", - "8e2599a62aaf2e197de9a0d03b1b68915978b505a19c9159814ec175dcfb8c9a", - "bee30b9ec18bb8c762d1c9858199ddfff52386ea284aadba840fab293628f2db", - "46b38100c5a2c971de78180e2a64d379eb50f451c1cd6a09c88c245b63d93ed8", - "a957ea71f992e2ad8e8fdf9023e3115fa490af5e24f1d8f9e69054c276bfcc37", - "86a56b2a2f90a2df7ded94c8e0e237ce3f77d42b5214dd2fa9fa895ee193a861", - "736a1f860faeedbb4c86dc21dcf92c82812cfab2c13e25cec7b08155e9d40a8a", - "6b86226788b26b2c32a7338b2c20bda5af7011a3415942c9d66af8363df98f1c", - "0268168248a6f5dfe3e081dc0a16945dd67b7a6575b63a7c0ecc3b810661b525", - "af890bd8ca2fcf9d50494e7fdd6bbd5727430badbc2ad6c83bd077e795e9473d", - "b6061d736f1b0f611b188c156516a14f7a2a0ab8c093ca900322c294b1a6e98f", - "5462425ac4e950f7990dc2a3bf52dfe63fbe512bcd21487599b2b818f284b0cc", - "886dde5a10213b455a1bdde4ddba4cb2e3d50acd573ecba9fde88ed46bc1def5", - "e06627729f3336a8c377f0a3e68de7b8cbf5a11f9549a934c501cce7878601c4", - "617104d25e5e6a9ad251618a3d38e57c449dd77f52239b84f7c10b1fd78e95a7", - "f0a8e6b56e9c39aadcbbdd049413dd78a09dc6a091bbc198d0c2493a0f60a285", - "324b10fdb31a484ee02b84db113aec91b9b5b7787e39eccfd04c4c7df65f68a2", - "bfb73ac6fe02c073d9f85c14f96628cfa4eafeacf5e64288faa42e41c728633e", - "040f0c5cf70725155704e35f76a74fb6425ff4c1ba9f6cc7682edd746f9efa8e", - "65983cee5a085406927736bc2d0acd4ade57c7ac50ba2ac3bbd377da15a9a943", - "12795659c2e18b907aba3db4e274710c69f0de1393f7127d4ec364f3e5f495f1", - "d6be51b93b0343c34804714dc7d7e4c594692316ca043e648a562b37ed7270ef", - "c1bee62a7703831a8539d6cf7baf3522f64d97119d2f88588a693ce76a99b3ad", - "8d717b61aa246aa295a28189df8d4b12fe4f2e25ec933b3d037815d6b9f4d46f", - "5a9c70c9b98795719a0c6df915b9ec3c2759f52598a63954daf00f01c66e7c17", - "e4ad66c8dd365cb4575f7e6f3e5d0d94ebc8ed0e101d99b39830ca0daca46dd1", - "e5b38d28b21c6ab97f0f5c8583ee65af91b1045c261b92b0a438d31605dc855e", - "7b97c4832492b19d0160e3e3342c8afc8fb2b5f8dae8c077d84f2c11eb333108", - "2fc3041aa0c9167927b8ad1fba563de059bfbda75dadf1f9d1b583d125d80672", - "85b4621beee8c7497441a7762f61086fe7cd5a50b90c791cc47cfeb4dd12d3a2", - "f4c7cea0a6b88da1608e414cb51b44ae3a66b35ac74440a0a97175a2fad6d032", - "8b01b1c38d6ce1a21f1c640528041c9ffe32754a777714f42e6656e92335a759", - "5ab3d8497565e73c22a496307a925986611a28668c669b1d5c7aa9d1a36e864a", - "6b0fc4c6dc57558e10970a14ba279ac340938385e231879bb870e201bda70655", - "aface952878e83481b7ccd849602979554cb24eec439e840f0df20d974e4395c", - "27d5b2d979d15458eeefbfa834a4c9902ccd9a38846622e04cfd78b585ee2256", - "885f10c2b42f46352ed6cf8a9ae4e0069d527c90d0751a72bf578c683cb85047", - "33d2b170e6892b4facfa7baaa893b3375d16326fbe0844725640fba5dfa461c5", - "d569d387523624c0f3a855b653c0d060f9983633e9de9f151eec1e9bd0c8ccff", - "8ef5015b3dc4ea8a21052fe6f6960f368cc5beb1e9053c918107820dec8bc2e9", - "b8bf2c63dde8743cbc37232e087f0f2e3c120f9e31ecf6498554c9caa5cb06df", - "3d7144c5fa1d2c309209a7753a4a486adfc0073b679a0b149d63fed397a180bf", - "16653f4d816aaab576727ddc7b63afcd7eac716726d03d410ddb3c3a0fae0eaa", - "2b316d9690bba7bd064e6bc3966db68cc0576953610ede47c14b5602d807b140", - "12e136b1af3b1c92591366bc6f83c0185701f03db6f9bebceae304407f7afba3", - "a559d65689ee059f3d8f2ca1757f4e32c376da06eb06dee28cc985399bd66ca3", - "a1cf34b65c76435b3d303291e6ff04d94982bc429edb1013842d9e6e507af53c", - "0082a8a3890afd921360552dec6bb0da2523c220f1a9207df202db41b035417a", - "d077cea834132fa1a8331c259525f521a6ddce3d4a7d26e83c0f295e86b101d9", - "bc7efea2b6783333cecef80eade86d0f13f2f6a7a01be16675a44a8dbb3d4e53", - "364f71f167891ea5b76aca71c886251b96c2c5ccbe1fefb8c5280906cf06133b", - "0b6545e53acf252eaea92ff49a20ce854fe525dcac25db00d686c9c2b0932982", - "2baaaa0f9c97e9101ceca54dde3679f1d61f807151e8129b999ac24b6223d57d", - "87575595635cec203994153a8fbe7fbba885bceb0f42750b386d9409851da519", - "5faed3882e0e970b59973a2f33e9fee5434c012d9e78436a5843750ebb81902d", - "0e7cfa1eb61bd664fd82553c8ec17644aafaeeaf66eb41c5a43b58e58b0777b8", - "87c7b2de4924ede04f97dcc65714f3a7fdfb6012f113c26af4d67414fbcd66f4", - "33c18b5fa745231ce86ac5f02b0cee7b67f211ad23f94b19a534fe5b32c1efca", - "8b4d02c9ea3ed2d5ef018bf0527bae3d1c47764d8a1e012e4d42eebe8692e82d", - "4f3c53c26cf7aacffe4283720971957547b4b7f70e62122e31844cd4345e09f0", - "7101ee59a48bc5442c77d437d30565bb98d05b0f9e99a7bf439576710fd3a403", - "f13c60fa2bfd9cf5105e531239c04bcad5f6fe0bb3114373c1bd0fbb4a9b5b63", - "e5fff7794e131ef43e30a48576a918e4f596601b9980c36abc2f25ad4f39d7d0", - "379586634dc4bd4eec8cef574e50c9152046e3378581bf1620a627573c35886b", - "820e04378983deeb014f19b7f672a8a74cf52593dc2c71717cd4bfa46f44dde2", - "5b084e05624c5f5c49426b88c72ce09012f9a0e64064b347a565992e5a76fd62", - "45239790ba8add01000dba8e1db545f2d863a0e9415fcfdb7df3c96793e5d776", - "40111e7ee45d21122f2911f6c1c9f3d2812e767c280024c9c0dce89cb22d5e0d", - "7785258108719291cf5bf3e47714818c0cdb32e22c411223a4e77d4c24ca76be", - "22c8b9c16931789cf375abf99c68d6197e978b197b81d5682d21f2db62916444", - "e74d68d4ee29c655a06672c04ebcb6a4df6073a643a2d433571f10c7deecba9a", - "5e92a2dd8372f9960b5bab81cac5cc27a18d22e3e74f27d94282cfbcaca851bd", - "3fba8d54842e679896ac7163c9209a6813ad8575d27a09379e79a6c6b4a14be6", - "1b166194e108cf7ebc99fc416797f1714b8113608134100471a696576e9ee989", - "dc444119d9198260f1b07d361bebe5ec070f740afff49e3328d5a380244f4c47", - "644404474379c2b35e65b75f72bd6d23c11ada4b5a030f33bf1510d531ea323c", - "e7c72dbb1b71e451b349bb362962b5a139aaefba7a857a340df2669b4ea21234", - "0f14fe2be1164a40b9efbde79d1a9e917fbd7b32e1063cea7811e5ab43f875b9", - "4f79bad7beee600dc1f3a43af5e4ee4358422e2b3da4781d838a78a6223953fc", - "1fb3b1f5d5e000ff7601cb46c498d67dac64d1d599994e042d897cca0b1cd24b", - "af035f5b36342e788b82a7b8e15420afd1c19a78d7da5c61685f5e5346e12d17", - "099734610d159486218a11115bd32f89454a86a627abb3959b6e9b97924150b5", - "2ab1a45e34db9f403011458896fac24238475aceea0222c307ea98abb506740d", - "3092264e4d6ccab87f4668f40307c35cf9dcad2b33963ecb9512b94f50a5a8f6", - "a8685b3f51abad912a341bee7e82f4d820a2ea85f4547549bab67d1264be60a2", - "ef97c1a0eda5434fe850c0eb64d080809eecc939a588776493f09465ccef2336", - "ee39d33acfd0656cf5414be62fae8b5c72c6c3b0aac1514306e6cd08f21c59b2", - "47cb374f327aaa65fe494888106f8e4d5e19b1d8fd882807c8b74671ce4e9ce8", - "b9b8e64a49e823481e32f6565094950e36cea18068f3ee1c4ba2af10000ecec4", - "add084569c6392f433cd4e5ac033a0ed822e1b2b5ad3de55356ae6e8e2bac544", - "c992c6ad27220fe4d3ae96f16f3e9ce3588d1afabc80d722af6ec7490600c2c8", - "0c983f6467aead9cea16027f93c6e9b3032acc56f3e3f35d15593da5cdeee55c", - "99666052078fe185d60a0ee015b1c8e31b7b4e6b55490beff813552c5602ddac", - "1d99c6d6f928be56a1f4e27ec38aabde110a31abf7239ad94c3ab6550e99eb60", - "24b7782c36cc4929b7233c2059000d52ec674f67d3d66de989917672447fae1b", - "798788743256a47780c1b8b51f1473f811c7ed76619371c200d143d60bfbeb97", - "1903f53a47230fd0b9afd4ca5944f222b0313878f299ae243040e05e18e86fc4", - "b707f62025c42709faa02009cacea7a30cf4a979d339b44e119b05583be8a6cd", - "2ae0fc4e1dfb2191d40ca3a3fddc3afa5f3493562e6d7cabccf50035a9e8593f", - "99cdb16c4f7132160d9d9cd03631326492c996be7d7ea67c46664eeaa67b6580", - "45a9b556126ef7bb4c860efacb2bcfe8f8c144f07a11e2afcafee4dd0c59a163", - "cece309845f91a36d3a2e4bcc29fb0d1a2479c8e2be520df980fdcbd0167e291", - "0af3d4d3a2835ce4da5971c666e4b318eb9e2e51c140e9ad41c38bad88eb9f8e", - "4cc34a02349c165406e7dcdff5ac84e24ed83506b6843cd23e34275398bd32d8", - "2be240dc3ca973904336a92bc64053287c551bd334efc228e9031c4054215907", - "18611e8a6fa9e7a0c028553c78b028b624129c1cb9bbba04a2796c2a26c2b164", - "fb5a9b0958321a930c39566db0e7ae56df1a519dba009a0d6952640b18a63f2e", - "58cc783e0aca7b8dbedd8f04181bee900ffa251ed1eb2dec9c57b7dac9d02364", - "e25ea1f7e7340e555148b71c7b3b4bbbccff09163cd6918bc2d80e0befb0ebf3", - "72d092a1bf3d95647ea4b68c40bf5bdb72698a0fb688ad74b14cf79034494fef", - "c629099a56ef6ac30ea16f6cc709eff3b0fc8a0bef454006ca682b66e95af4bc", - "d1441adb73c70e51246799857c1ba38c1e7ae509d0f81417f6fa473b16c21834", - "7c2a97288ce425680ab6a86e42efd7c8756d5fcabb50b666cd256c64e918aaf2", - "ef4de6d2947774a0c5a20c602aaaa544f7888de1d360cb1da11703f5abe56708", - "8437ded9e898a3f7d26453db3eaaae639eed3d285e115ad019bcd3d0e64ed4ae", - "f373792e86cf49f3f8dda6ca931e20864912492033941331959f3d101974a693", - "3c0073f269340e1f7d8e0bcf4bd53673717628c56a22b66fead7036ec52a7bfd", - "fcf4b06dcbec38d71b7d00fcf022b1f4f306489ccedd44b0445c194a03ab5e1c", - "6e1ad063c9610258af03a13e769f3da0835f506151d64b10906de256116022f3", - "1db466d68e9ffeeac7c437e9a4a1c6185f87be3354c54f4bfba3ac948b4b7b1f", - "8cb26e7e8a8a8bef6d37518622176c31f4697bb03312f65bae647a36ebbda059", - "c9bda4295a0fce80a0456d2c680c06d9497d67d5fd0676d08a4b050762373455", - "14446901fd6facd99275b9b319a4e0ccab7751090a6fc0cfa033f4ea674af428", - "745afd53ef22503d6b133b7e188b2f0baa0dd016b46414cf1a97ca3238a000b4", - "74233ad9e6f276104b18817071ce8133d9b5443d9b985b294beed2d0c25975bb", - "43acba1a875a2d51830160bcc1cde17e43c7e7f8820e928908c0b9f7dd53e9eb", - "cf7a1bd938323ad9916627373421eb2f58972cd8a50f6bd0e783694b85e28192", - "033b409ef3f6a7349f1c21f0559dfc4f7506f7d7ea62bc5778174d11da853124", - "40e27034722c3e8e2866cfc5fb683d37c413cdaa6b900c1c7116a7a13ae322ce", - "b8fbf47ccb50762b24ac8c5f046aee267ede5775c8cf26caba6a48b01df70d58", - "02d527954a125f0fb718f7736977e5eaef5151111dc6a277f2f6526abfe95870", - "c4a19bb69bebde574e4403bab8aff87848ced48185dfc965959b32363d9bad66", - "26d85f067f5fffefa64a7afaaa1ea48bde091808fdf54cc8ad17975227c1f683", - "ef044b984964012f5cc00051212d7dbd0f41a4d858c292a19b5fbc77eecd996f", - "536dd2d5fc4b3b23759dc61f3dc3633d1fbd7d049bcac07a56ce290c2b209475", - "9569e649c18da8b007f97618a6c5ada7d0369ab4ac7f120a087d7f6d5d31bbe9", - "b659a082161f66610d1f1c85440266209810d977b9b5bc595d724b89389a8efb", - "cd3b4622ff7a911d80e394ee6168d8a6b3a7371137c74811fb8dba69aefeeec5", - "d4e16f0ebfcd0c353b73424dc9abd89908bf8cb4deab5f2c916a9926631ebd8f", - "b6500183e89a806ee928297e87f67c9f5ac7f2f4886e9d1d7a9d4c5571cd003d", - "3456eae0931141d2cfa08b866f2de5f2e5404402cff4815afa883b659f16dccc", - "90351b489278e220afe1f8b0ae7122df2dd2a1ca1af0b29ae626bef98d393fc8", - "f2ea77f8bbe1d97d4b4c5ae555475fbc568c14e86cc209e6c32af8045dcd021b", - "03caf204f2d00fd4aff034c2fdfa98f9708da1402fe03bd3dd2a86b33660d2d8", - "355cf3dac7369a3ff9ed7a9edcf0989722f4c1d5345c000dcdc05b1b860f6130", - "bb86fb2cba0651a00e8da17da8d9b66e17f860382e8cba527d862825fbd46a03", - "5ce5a64f0a46ad78d0a2f7e09df92a897903440106bd435fd817a9da902a924f", - "82dea9cdb2ae8d2fa58d28ba13bfd586619600f219019b8d551caaf3fa88636b", - "9a0b1c4243f442f04a2ca2d1baa1313dc8756fb5ce88927c1e8a3882c553b4d1", - "50598f56c4303554f05064af3a54de998bf5e949704573d23d0bada9b8814080", - "fcea4fd5e6048a6e39a9e5e4b4c8986a3e40b677531ac5621c2032108bb9166f", - "6668d35e9a2394841aa7c690b5a2ef9cbc5f30ae914d266b18592eca6163ca35", - "c11505d55f5a6093a5c0e2681f28658567a708daa319ee665f839e875459c2fe", - "36021fea790c8e147d07c2523fc611461297224f2fcd2fced18c9521f168c845", - "aa1026e4ecf4e3abac996123f8265e4e63d90faca2d54b2eda5d116612189b6a", - "64cc25b4b8e6f282f591fd21f4f453ee2405a766641d26cb0bae4bc86225de82", - "4ee45a1a1dd0f47892dccf2169df55e9fb01371b30238ca2acfa6370b53ba286", - "a11f515132b77c009662b7ec4c75172766548958158b7a82f310478037574699", - "2cc5579416e294eb6b5dcc801f456981201a3320d1826113552752794ff3ead8", - "ab5a5d0a57aacdcfb6caf8a172fe02ca0964496ef16f675f7a4aedc07b40ca48", - "ff21a326c0c1cb273df7707543a87639bf303fbf1ed24647d5b758608801b2cc", - "5aa905169348998e20fc47f27b96914b04721d83a2d80bafe81d85247aa994ed", - "614582ca1f7fc6a96853c3a3c2b89e86f2d238995bb64881ebb2317502a8817d", - "14fdfafe8e287284f666c15c3084bcc2df6f1a0843e8abc04c541ee1956e2b3d", - "fca3b57ec50e30f3febc61bc939b83b46cce03b02bdd6bf367ee29fd0e97ed5b", - "d8226dfa6df3c26ff45edd379ea752b6ae8fe641e7ab486a5ac9ba414eac3aa3", - "bc214399b5bc6841ac13fad323ee6cba8276e713fe4419fc7ed913fcff44d47a", - "6723677009ff7220b877b6657e5d96fadaf36dc8b2b44de53d50f21c6f604541", - "de54a564918d35729d67b8ca126fcb8110d5ec5966012481fadd9c2f7baaff02", - "54f8c7c0b9ef54f62f0dd4e91ef7bd7de0565b7ebcebd9890dfe82a3b44c77fc", - "24b06f7a4953f40ae895e7e2be8f106503e13aa9c7f532cbf0198ffe4ac9fb8d", - "7258a371857cccd24b4c28f1106f4f10dcfe81fbbd65d3fb4f521097399092b3", - "7b4f74a4dba9b00e93410f31a1d12c596aaf5431c9fce1449455cc38cd2d032c", - "8808d6488d8b3a91a3e6e1322e7c227db5b08fae01edccfba78d2ca6343475b3", - "dad12884abc1dfdbf4a9b4c0f1272a4ed52ad23e068a6f3b415fe4e5f47d9bc5", - "da8f1941f425263eb73e7303939b0a4f0df8f9bfdcc9bcabb99165ae44de5f38", - "7ccf68e2b5cd04a290520968539488ba9100d2491ecd38f0ddb9c96a5aba3b65", - "66d682043209aa0bad5c6062d1986269e36b5c2fb40982beeeed0e31d1952b70", - "ef87521406fffeb262055250952f842accfd4e5bb76b292b694d78c7112fd10a", - "6ccee4aac4018040099e69d1c6ceb07bd853a8ce14fe113be4c6c22a537c9285", - "e8e6d3e1f2f3c2a129fdb7235f085f672efef700febf25cc63a3a01746b7a7a5", - "e0754ce7c53f7f77adee035c33518a7e38955b14a4fc35b8709b3be85a32b250", - "59c11f2943aeba879a53c7c714cf44a6f96f62b0b561c03215dea0a436b5635c", - "73af62de9e5c73186744d89e334042d279c29b4373089d6a88ebf3465934fb2f", - "ea5467408948295350eb0bb2a3ae450f56c5cfbbbaec49e8f2010b9363b312be", - "be0877e9e71c0fc9b9145485d75779ca4a1b49bb68f629fb0bbb26ec9122500a", - "fdf2ce1d193037b2cb5609394f1fdf2c735a33c332fcd3b94f1095e56b5d1f6e", - "51ddb0e1e4429b47aae4c62dba9802d219818362fc567c8f52d8175656e96120", - "babf1bf0c5734133cedd265250f5050ee70cf1c07ad01c2c58ed736f6d4d2ca4", - "f52972525fe3afae17d0edc967ed755e5b5169b2dc0a40fbb3dc39a8acfb0d35", - "7d3e9849adfba35bdb65baec0dc7c70c0c2a7343eb1cb90b39c140696b4a5cc8", - "44a9ac452d2bb266f3e2327ff2cb4cccdedbd6893b57479eb330fe06f6e7ef9f", - "6f4ec001278a0d49fdfb28b5d5d545f6e9bd43112a2babc3b3561abda498fccf", - "16176cbcfb80537241b778eace8022a23df1479b5b1b63bda0b12390f1ab6aae", - "5355af422bdea9ad243438f9381825e29d9eec314d9a2dcd0ac2dc432443db79", - "6b77aac255f0418dd9253520409e7dda1dbdb513fd31ac52594c429a16a4fa52", - "42903462ac675a6c86689565aa5fb274f4e3dc29118c8508fc54ceb3fa81547d", - "c9ffdeda553e10b422072f791a15bd3283fd6c377247f5130f6a08c46cbb602f", - "8dac2cce2bafb3c1a4e865905625505ea81b54325abb5abf58a2711bdd3ef20c", - "398c643945d905a7166bae61376a59b56550088f066f6fa609ccc182bce9024c", - "1866a92aa60716972f1395ef3bb6b5695943a25b2ccc1203b920045fc48c3313", - "0159bc9118a16221e345a1609f7d9018d543f038eda2e06c543cd4cd162f5834", - "550aa90299645463c0da086c6fa8aa7123f67a1edd593de7575c987e2b5ef97a", - "1cebf7834d485277171a8d6eefd2b278170bde70349d13eccc82c085c1b664a0", - "de9d4af06f8b539354c492862a3716f9c410ad4e7e96ca159fb10947e4ade671", - "e3630c1b3653618b63a6cea3c9c4b00ba7739b6fe2c85b781333255dff8e5d70", - "6e72578b82c0bba8cf03127ee0d313f62ba280be47f8037f8ae26c23e236f777", - "51f1b72cf78adc15f0853d7fdea1ffd4d6aaba356240e24b2725aa77bbee9665", - "2cea5334d04893998b93f848c5302b26e36762500d01239f4a6d16c3d1ae3d38", - "c48128869f10e1b23fd18793bc718cfa9e31e06f04bb10a83dc610ab2849a7c0", - "f9990ef045cc95d5906d4414dc7a7ffb6c820b83d352fbfc91ca4430300df553", - "efc58a969b1945fdf4b2cd56d7cf47788ca218a6920098f9e9fdbf0430201fdd", - "b976022335f72e2cc9e5e34bdd7b30aed364ab1aadb52f22a16957b7feb7c2cb", - "ebe3b511d9488d1dbb912e611cd79aaee3f1e9fe5e9523940f9eb6aae6ab056a", - "cf63e967d59d670b0df21dca7bbfe02dc351fb0f876b2aa06f8ecc5c390711d5", - "b77dbfbd17c2a014071d533669baeb74fba6bc3c9aaac3dd50773f76e1db7fee", - "778deff69d2a94261de89c7749c49d317506cae4ff9437c72c27174a92cce704", - "c471bceaaab0e984883311c17bff2af6ec206e7536f57428e2e45ba8b61c4d0f", - "e5457fe2ff87ff2bad92ef1f70936fb498363a23085ce97b32ba30111c593946", - "c5315776d23ed7ea191b957746cb416a80211d92df979f36486bc4edb8eb2b2c", - "69447a57a0188232c5c1e8375f77e7c6344ef0424e75ec2cab49c60c4e1a9f08", - "7c9ebbd93a8771a3268ebfaf1a607f2bfc582795510828e8793947d4db7ef458", - "fc5396b48c3ec195b9868e614647f603de55ce1b5a78ad2c302e38c1fad0c1f9", - "2b5fd42fe8f3f018081f813c5f6829bbbdbb6e9c4c20bf19e9f270146fbd10b9", - "b1037376722393ffdddc8fdf6386ecb36dfa57c4c16c6859ae9e009c0d2eda7c", - "5b98a994c79d37b3d2a782b26240885211611c7b77b6ca53aeda37b3e7c445d2", - "d08cfcc13ca5a328c2ae1ad73fe56d4c8dd4d70ee096e6198c77834cbb9a4a7c", - "45c80b8d0c73fb16a8185f14261bad4a75dd082e5da5373b52340a218b2ff86a", - "398b6a5aa297fd4c8a5774a118a65d9121c7df3930f07272cc2d4799abbb8182", - "84061783f970fafc6902633deec7696d8a246e5c6d183902a16574d00ab39a40", - "b54a256ffe23f40e6e1a5e45bdf5dcd23c15089c23b5b8d8dbe99fe3c91dd283", - "39099b0fff66124eadf15124991fba96a304257c1da82e3caf057ba630603eed", - "527b302e46ac80c3adb691d17e76650bd39c2cc06b3e2d58b5f5841b1dfe49c4", - "a1cc814e0e139f71793b0d4dabaee4c257ab1a6207ba9ce05976e156cc99880e", - "ec6fdbfa6c440f0882016438e3c4c03ea502786970cc83e71fa3035548607705", - "06d1f488a3b4dfc4df48351b3210b1c59a6fcf5a1f4848099efd1ccaa2a8e336", - "5e79964adbd1b6364f9ae3a0b0baaac64d4f876f2f25074207a15bf0b73b3106", - "775703d4b22107042b265a4eaa342b29cd0baf14fa6ec1c93c8c4307a5d1ac24", - "bb119325bc95f3cc01cdf5d2827a54439fa1f943fe1664a2ad892fae5b340f43", - "9aafacf210cd057478ba152d1835ea0c32571415dc4f00c250f56d102641d062", - "86b6594747759c664d77aca56edf18c25ea4e421d51af46ee03a3777055fd4eb", - "4f79889fef05cbc7ee0f86dc2f225299a2dc58fa02ddfefbd9d0aadcca354a23", - "d526f847544963390b55cc92a3ae27095d54fe21d9c1e6a21d42c91d49327734", - "80b1c924698595a9e4dced0301a5369f12dc3f901af0f91e9798048464ec861a", - "fab661ea50bba14e92a6e00e5af85e5e884b6764f2ec1d692232b8e423c0ae52", - "2d1ef9866eeba489b310a50dba5f8da6e71978a7364c3b10c1fb1ab87c86134f", - "b5994ad1a6f9c90f3a7ba3b11e16357006c0fcd055fd663dd0f25c20b71ad831", - "bbb0fb584d870eb0db90ccb397a4e5749f6f8bff472fa10fae0ee201e065340b", - "3bdd2c9177a575905e3341f84df401d73eecb75c55c367b1ff058da8bb87ddb4", - "d6e1c866ae4ac627d0bb759a1412e0311ed40dde4cbf67c21883fe84f486572f", - "1b4b50c606657f6460b2ee96aa3fb26c941cbc4080a9d4618648af5dc1dae58e", - "f65b335dbed7f0c347c1989b2a0f1482eab53cf6c5c20df37070f8bcc9a9587c", - "2ff0c677402490e957aa1ffaa3047ad20e7c29a4f9ee68efa073930a15ef5519", - "7795ac21ffc137856f3ee7297c55faf7279c33f3af0cd3c4f0497f2091a6ba62", - "987c09ca5106745beb44d21742b985f557e9109e6fd18b2f9cda8b1cf960e471", - "7c44318d3d162f344524a1b69af410ff0811530c385aab977abffc9be4730d82", - "c927429a8a6291b067e0aa6a9bbc350b6da17731694ad317330ffdb3440a8667", - "3a3a645af904f0020ab7ec2dae0b393ab2e8f3034ecf8438695517688f276d8f", - "37fa7272fa7d3f439a604602fb1219df1f2becea0df96da71b6bd7a44233f63b", - "baefce21c5638e774d9e5127738e981daac087d14ee5ea28c7646762eb6d220e", - "4d5d7ecdaa598e28c12a33a99e6b57b6dae451b3ab23f3f21d102fb20c624b8f", - "ea2d87b3c510c65da358a45e86702570190f8e6ca7d562e7ba7e52627e24f05f", - "97b49ae5e073449c5452b4e1ef309aa002c06f7b696250a6705dde4fdb6c330c", - "0d034c23e49a9ec1b6f92e42be5ec3d58793e269ace2587f66de8ba0680f297e", - "7812b0a35b2e33e07f11154682ae3d9810e9b289ee4358ec6c32f1c2de16c6bb", - "2cb471b8ac420c569fa57cae4856cce3a01d1b5158f15ebd12292fd6d4b93c5f", - "58c8e22032ffe3a3c32b0ae2e6b83235331a6d5dcd66048ef83242b5a2a365cf", - "82c163157757b7f2ea524136b438719936c9e78adc75f9c9111558ca2d58696c", - "fb04de496bfcbbf9040bceb44b20cf3a80b110657adef17149be8f1814b09020", - "753b7d8cd100c7ac4a8a603ffe2e7adbf587b5b1f75d9381164ecdf874b12bd9", - "33d3be3c4cf8bdf056a22f2491fcb880eb2f90231aacaa2d6a0724ef3cb1cada", - "800b3acaaa230969ebf973932e84c617b9cc300dd553867389487d354835bf74", - "9a5b99154d4ca7ea483b27b81769ceccd9bef39588756d1e745c52d27d8f6b2a", - "1a0931e8853992a12a40e3295ae9d20e3a8ae81a82cc0f8e0c47d07aec4c5518", - "1253236f1c6037c05f7987cc58cb8eda0e33f35cc504df6787b82e6d26703ae3", - "f1b29c17f297cb0f494077607d79e82935a9d7e9bd147f380f93c4a24c72ba01", - "db5446e473d685e8dd1a4f6a9499637a6115ea46d853a36f90677bf62a8ac88b", - "f219e58fbdc565021e7d5490d84d7bdc026e3f14b9c38121eb30d5b4a1eb273c", - "2de67506d4355fe388e4f5955f860e1cfc3c4c9b95290efd8ccf401c83d9ec90", - "d7758ee702cd2e34f8a9a1cb8b12d71059824358eafdd6a34cbd1fea48caf0c5", - "e9a631f0fc575876f270110d187090261465c7fc439c9fd881381c479344702f", - "679da7adfa5172bd99631f959ce49a049e4aa9d64296bea7a992afd5dc0f9a21", - "27c52ad7767a6396ce23f16413574210fafd461c2e5b870397d376c2f9e8cfcc", - "96a416e12e79f7e006d2c45bca33ac54a30d4ae1275de3449ce69384384e612e", - "1306242cfe4cf92d1f046e9bf5ffd091dc84d15d474e707cf389d59f82dc4822", - "6d5d849ced1aacff442d9c6a1f43caf1b4c40c928904cf86efef30bfeee52c72", - "d3b52adb724ddde6a5985d0de1409acc769fcb41acbeea257b471ce83ff078f2", - "0cd26486ea152fbccfa362795b58287b45bc6d1946a4d2a6fa5b84504687870d", - "c255db841e1fedbc5e8437e5efe6aa88ae26d97b1be7631ac51b5f40e6ff05af", - "bfce807b4ce438968d6f17b5e04697cacddc821a821f2bf567f9a92d10bb72ad", - "ea3964ada3531506832ede771212fee46b9f3ed69f46c37d34458a79f27c538d", - "967d8a56cc612c84172ff10da0afc27cd515295e83d9f83ab71b9bd12c8dab24", - "facdfcd1e8991e673c24cdfbd5fbd3e4440f238e4571d03a5ec59e57c4b7946d", - "01853ab97947c9a1b39814beaa0f22c76b9e0c786e17db02d4f3fa3d4b46c018", - "651f8a0139a240d69a112dc5b37532e27c3308fc6fd328b20c5e21e11024e452", - "557fbac7dab31005a153e5bfb70a6b07f0f6d877fbdfa2ed3927ca460fa25777", - "cbbb3ea39eda5d17f4da24abd24e9fae6311cce37a3eea7582553491c8feff89", - "a27630f263ad14fabcaf9c13a5f34f77afd904ae9d8bc9f2aa6c7b9ae77a2c9e", - "1ee173f3fc8b5e3d9945d3ad0ab2a58c508f9ca6c29f843d238dfc2a5a6e6a0f", - "9063413591b8593479f27df724e3b441e6a4efc75f118c99e1eb27a5f69627be", - "81b59828ac00874a88164b6c25ead8a7bd139f16524b4d7b369182c81bcefbb7", - "aa7d7789c3f9fadbe4139898ad629f4119ddff1c78d2d5c35a892a981f90f5c6", - "060bd7985ec4570a56180a71c89fb948bc71c7d2372e4fe5b2b229bac1294f1a", - "6ae89f9be9122c9f23eda7a1d42917b377ebbac3f6b88ff7772452769f0fa4a2", - "3b53fe108c562ea754f3875eb262e96ee185e39160d0856c5f9b90b60b484082", - "b5f53588396f39d5dd1891444f0f322fc76716fe8ec96181221b147f24328212", - "8da06754128ce0733c1ee9b48dfc3f786f4c2ff7b20e308dd70ef7a35d8add2c", - "8db77e657ac0c0ea2ef216befc3a79a4bc75519fae5d7fbe45f4fcf557d3691c", - "1da7fa160af4a3dd755c0df08eb94b43dc1a38072d4e8c7c229eed1f00ff2d71", - "3f1229ad03e7558cb29bbbb5794ed3e1642555c64cc1829e366872f0f494786e", - "cd8b91882d194354f4b918c21d7aa874ed5c9e56f8e5bdb6cd0a20db576f068c", - "470245aa0305d7ad0599a285eb44393351d51caa7c29934bd6145be2a1aeafab", - "bbf195d1283a6cce48ddda98d7a5689506a146dc12a84e175288eda99ff77ae7", - "db4b82ea851477fb0dde3b721ece53f4cf8516305e11d5c1d8a30a5203708057", - "9d5270265eabd7f4553d498a9f23799fe88cb4f15ac5b896ebe5094c47a2cd8a", - "5e221f64c704c7090a6e6686e793ee7a502c54d97362da82515bc2d6de775d82", - "d7505b72670a17ae59601de001618a312e9c6e5b2180d08a690d763c22b38540", - "d472ec84e35edfa6484eb64e8f114a4a7785b17fde8f1d497d804efb5aff3d78", - "7e059db75443e13d1ce26f4f35c1175b3439eabb71bb4aed80518f7ac5c467e7", - "7f195cba1d171e1fea2a604515ace0555d9bfa98d8f64b4867c343752148275f", - "8f5113f417f511ee887b5e115ff6dd7a52a10d8bb5b06539d2160acc1d891de1", - "9ab3aa5277ea9dbe96c759243f2fc6db7c0ba4278bdb3308915ea6897575ccb6", - "96787b5754c90c2b09719a54fad954b29a95798714a244c94d53fd56876164a2", - "3641c3fd182f7d68d9a9138a1f0ac711a53af2813cda7284cc22ad91376a3222", - "5aa7711119073140e2788c0a99ec1b87d9f35cf2c47fdb6d822c79591bfbccfd", - "5737617548243e24d63b1be63633dcef63418c94e42133fe5ac3e9a470286900", - "9498d2d9461a853f8bad7f4b5e3f68c051202e5426f646cb7bb3e83be560c230", - "bc8285f91d9794f204c8a3ecf6d5cbd6fcd4766f29c09a3309519d6a9967e8bc", - "eff89cf42174717e09162f4efbb68deb0f593413501eebd563d17723c2c4f84d", - "145b7bbe55df49ff589c220af4b26168d5ae50102730ffcc460b01626be738b0", - "61b72bb8589b66510afe072e1afccbf6969fe9e6bcd3eb53596b285e497b0f36", - "32e3be4c94c5293002e181753b4963ba7efd84823eee31c301ac8d2749b3296b", - "f2b7b47017ab43acc6be6eb04e8ceb22c599860347fc033d0f360a3fc31194a5", - "c61616bdee16e08c6e5fee8da9bf324fb34f82e9c8d93728375dee35fd8f1f67", - "32f5d76c7b39f8dccddff1177e8b378e26d16cfe0ee925c3b7509db618408c54", - "bc73f08afbbf3c759d4bc2deb2f12df51f4f299d9a0d38a9d3ba29ebb3971305", - "473ade754081b675b69f00071518c58010f236976dec32f012ad75c035cf625d", - "934ec71f17c02010544352cb3a8fc4890454e5aa32b90947e34551b1b20aad25", - "0032927a97052320e59d0bb719d1819aedccfcc8ce58e236dc17cbd1ff2f954c", - "8f2c7850dc8069acbd8cb888040c6efb0a1cad658100da23f7a62eca65b9e4b6", - "ccbbd9cb670ce7b1fb035a3b9e8fc6fed109ded15f6bf0e63f50068d951a7b80", - "0a319dc4f4dcbb41946fc009d909ced8976ae8cbc6d4362a488dd7ee30755f0e", - "066c0b9689deb3f59a65e4af3ad27d5b9d392bfd6e725c964fddc63a937664d0", - "407409eff4abfa5acf89e8c1f818fc91dd2bb0e07aa36b851df179dbe40bb842", - "b8be13f51433fe4165257daf5eccdb728a4121043a847d222880f8360741f137", - "a770ed1519ab74c8305e237f41e8776476a010bb14910f9b59f5c713f2dc159a", - "03682b56d17ccb5cbc8a2dfadd58edcc3d6764b9b8d96dd713cd89df7c574574", - "98f3cacff431deb65adbbc91792946b2225bd97e78599b1e158fcbad95bd0f7a", - "c4bdeede9f2a80cb7b9c015ac2a6f272ebf63936fd0101eebe7f1b1d4d29165c", - "394fc7d7e11c6f662b46b920a828d237334659a0555db6ef76954092a41cf8b0", - "fa1fd905b0b2383a7d57061f7c431b40ca2261ccc31c561e743a26203820a5b0", - "754bca36313608ab2cf2a878495e82e357ded19c7728faf384be8eb124205ace", - "d86315752a4fbcfc91698d6ba972a365ef96016e963c90d50f6ea69878a80c2c", - "c4821ff976ff192cf2243c18d690bedafc8a5c35e6b0eb8c5e7e10ecdb5ef735", - "ce17a9065ceb7d61096faef71f846e1eb802167afe9da1170ae904bbd1b13108", - "0334826dc8dd2d6ae567fef73c3e54a1847177a988ce3a180c767bb76be2c8c7", - "01fca607fae00d9fdbdb78c05e70870715737ae99b1720216a62e981db94d7ea", - "89ee76f0c6f4cd18987f7f7b2577e6b4a51d2b3b2fc1f915956b9e591b5a51b6", - "3ccf01596c34707888c8eb1a8471bcbd9c12437ec240284e045371bdec358a51", - "761f14c7bf290aa7d714a1fc5bee564e04e801a82ea08497c66ae4d24429afc6", - "7717d095606353274e36c67c6e6b7e99720a316f4ff187d819839b53f772de81", - "c7de0dedaf0f7e3b90077ded13e0ccb30b5abac9a9338b9e27e390f9d522432b", - "b45e656331d5c46b984051a12cc0f17daf379ae1be62b8116a0a2d1d47c7fa19", - "6adb177b8b5c4c492fd6f70d3c1e5b119ca104a491f1423220cbf4e223f6a9c1", - "46cccb708998a09b81d8834d41e3f57318f69c161da31953ee88b6b99f5ae4a3", - "82c709bde2687d0f54bbb02dfbad2ed19b98764c4bfce08f2ecb41ea2c11cdaf", - "c4483f5dea959e1f9f0f62eac7672c2405c66d52df67de2f45370e559fdde23a", - "ce4f22ea7a9cbb0e8f507bdd03bbce8d812a743de1d9355144d3bce86912a18f", - "df1fda4815fea3a14b0ba08419ff33404a02876eaa83ec5f74e33a5ff33e06e8", - "887d4821258a1c4fe4d28040b9e22a20ee9e205388f928127c30bd6079fe58ad", - "8664545feadaa8fb9734782a60e717fb252cd5af5e23b6ce19309bb05463aec5", - "188f72e5651b188b39b4ff5af50b634a9dc53349dc9b32115437e41cc9b0cb6e", - "42fc7154070a5d1d28c2d7aa84c2f98d87e6abfc6dfef13b81b35ab11fb64a80", - "654aa446708f0226eceef452715133af1f915f9f103e6c5686ea9aa07613568a", - "be3a18ae92c0fbed55e7b5c68cfd7aa9c549fe053c5f163e069806d87cca47c0", - "661fc2bcee70984a5f644d79cf6d00286367e65c8c2da61c7d3d244050fd8cf2", - "6325526080c2ad8828d8c3f42eefee52ed19f34100ab76e6d330816abb44be0c", - "594d6d04fb224adbe5b882fc31c8f75bddb83f0910ec490d98e4b45094a67f4a", - "1da54af0f73dcf9d62314b8ade2b3c424099b316ef06ba3447865141ccfd533b", - "dc71f4edff449c8e540293f3cef652be702212cf1b53ef155b36852de4ecca74", - "353c4c0c974709d05d81c9156c617bec759cd5791947f89d061ebb49b86d715c", - "790c3c7081b5874cf98ff1b34b70d780b09aab9ef085116bde1b83ade25ef744", - "6adf225e07c03d68d808f769c9e0004140bcbbdb093303c4bb9a57326555f34f", - "43e3b92a68ee4ebeada482bf1f8e66e7bdebce0a284a16e07ced69ecce3f3abd", - "7add1fd897536a3e77f77c7877ecfa9c960856368bba52c0efa075af0c4258e8", - "f5379e80f352ef3fc17ec9cf420187e62182bc8361c024b54c3a4e2cc8eb2902", - "207dca63dae39795b9982d5bddbfb06cc3056207cfc2a895f61469b6cace670f", - "5c6b541df2750a3cfa24ab6081e6366320a2eae4ba46846290946b2623a01585", - "a8614d950664183894677858b638004044f8973b92816ef914d2753dc64d4fc1", - "8f5ed93424f5714a7c6efa47e475a3cb2552e95db5f41c4805d981714fe16def", - "bde808c04d9c569534ac458c9e6e0c81ef65f23b51e732fb70b66786fffa559b", - "95ffe328f6a2a640527255a5452df3c68587fcdc2b59822bd8a54678710999c1", - "3d3d113fa4f3b0bfb8a583ff9e64745f38af3a6d63259ed1360bed549f6ffd1e", - "8af4a49075983e7475f8134ed51d5d305e1c40a1e7875f3965c34c856b04a61f", - "12538f1a30bdb6ba9839c23d72878a7fedfe46c6c8dc4035d5017381666a81c2", - "e59ca069b07fb1a47ede1303dcbc6f8ab69ac83b50117c0fb96744e97ea49f8a", - "212bf1aeddc455c1ca6b9d06727dd0d3abb1ce44042d130bb604b5f9f964247d", - "a801be353b6ce90ec2e5463e9e1c95c35505b2cd762c390fcb33face458c3dfa", - "e8bc37bf3f4807e655404d596977b906344e606b8d6a0df18d0f46b56a2154b0", - "a0e7203d92c97c819d0240cd440525404495d4225ac0801df76cadec1bb8c00b", - "6f74dc2ea277693e3351d718694e27676eeaec69b582063d527fb525fe59229f", - "591eb6280ba99ca02e571285b7cce47323f5c3d154812a7b77783953b117c575", - "cc723b996e8cba85ef14cf01999dfb6311b592ec50c1279999fac5fd2b3a16f6", - "bb034b2118053bf14c61b88da31770bc9040d11040b2204cad5876b661881407", - "9e983e0aeaf59d1de970ec91dc26b9cc2809aa2c9d3d814e58f6c7d214e0f350", - "bfeed3c38c72d8ca6d8d39d148376e01935abc9423fb7aeeda729fe32a225d5e", - "53fae1063d0d25e9ed99802c6a784aca4a7d28b83be3a17621fd20a8f5719bfc", - "26e1da8c5f466e1cc2e6574bbbf9e3e235b14fbcb158f987db25b9e8e59c5146", - "5e261e67d873c329b5a3b7a8d6f047c0982269679b1681fd5fe1133790e0a9c8", - "9256c2694dd634801bb65b71bcc6b2a5f3bfdde1d7ddb92ac03ed3902013b9b2", - "16495bd326082f94696ee43dcb83d82346c307f12636c6986e63051a650e821c", - "38313aef3e93574f33f83c0cbb01ca73af72d4f5fb54e4f9e9ecf8942a12f26d", - "2db72ec7811adef2af280004e89409ccadb60316ef3c367924e6ef1b72c537d7", - "c56fab3f1816d04bfcfff2eb76d2d57cd920501bd08820bdaca3e0325647aa16", - "08dd78bb3287c621587d0540bb7e766d00e7af76078c294f07a69151359d17ed", - "6d64ce65886f073737623ff7ffa49dbbc5d94d054140bf3581afc64eafcaff73", - "0b7f96adf6d6bf938cf111af8992bb6fd9a6fac90b5304d4a0b06bc9590aa31d", - "ff63da9c647a4433e658a7cfa09cb971b056ac9e8c40e0c804c6f5e610b74d30", - "8d7234cead5599e3d29966cd82b6fc33e5a015abc722a2008244c298f7f99c4a", - "4d753c6be73623363fa1e55237e4c2a00731aaccc267a9f5e3f5f7117885fd36", - "419aee5d3e22137388980ffd2a4a8cc77b9a7e5c78245ba7bafa5fba464f08cc", - "12b7324d787f4e63bb8b12652d187feb42be7d8ef62b7ce30a6161de20f50cc9", - "d53c649f82acf42f37dd6d64cea2899022892a78850fbcbf2b2686bf8aead835", - "dcb126eeabb45e0f63094cb387e6885f888afd61666de0182c15b9f29fbbff9c", - "744cce848e7c7d7e0806baf30881eb370f07cbd47886f410faf101902fbfcc5e", - "d283d96194e3ee4f3748f71d770015fdddffec2afe5fb2b9605b5da181739882", - "3e6f277e21377dd0aa96170c31597441345a5f466b52de41d64eeb73f94b4b66", - "02075de526b325a40634d6a9b5694fe8654407b7ec148cdad3a01556443e29fc", - "2905353c7ff247520a3e73fe41b05fa7c663eec042e810fa4cb6f700498f2a94", - "f969b97df34b633966731ef5a2ae0b27e2c48ce5ef4ab68cc8ee15645555ec5a", - "bad30190a7372d5aa5a11fb1a42ba07575897cf37ffb2c268450850dde490f6d", - "985ae1be59d9a33f310d2c4b8d3ce16cfd750187dcf1535d024e809e93c7b43b", - "c0b3c5a2511c087ea28fe49e0ddfc3a440aa8558cd64d79ee29b2fcd524a62d1", - "96de008a19a94eedc43f67750de6d92759bc65f4cbc67c91d1112e6fd5da13a2", - "69a9c834b9f39009994b71a741668112e26d674f1193f5820c29e46b7e4e1cfc", - "f58774f906dcc33ed018500579796446e998225d909242442a96386e110c115c", - "82bff35aa47b82b074a8fe104a7e8cdeaa9a3ef3748ea8f8940802231b26f33a", - "cd3c59722597b08feab83ab31c7bc6400e0039547b90d40c4a112f33d53b5348", - "24b7bfcedcb2077b67395378c29ddf6f328f19205dc8914ae6b9491733a370fd", - "2e23b5ff04b514804923b393389863c5dea4c751bf95d497701d2276eec50f72", - "d20098c85448c446aac6c35f3098810fd463fe5806f7145c9adf2d7effda41cc", - "1dcdf1dc31e9aa4cd49690e57cfe810f84fbe7a201dd1ec5f50b4d7cb9a33615", - "817faea66bc5f71fc794f58badef3945458322ca19ed7546da70fd70daf4741e", - "c721f4a131f3a24423df9aa65351a22a653c4ab6cf09ebfb8512c6d6f5efcd1c", - "4371530009d396864477ee8eb8f1119be3b58fd2878885c96e96a5e1a8ee6ead", - "a71115ce518ef95f22a3fc9a677b4348579f43b2719d639652e5d09810ed2427", - "a5b6f44963091735b35af08d7295e88c35accfcec92491a7a0142e83b05389b0", - "7891fa26b54adc38dacedd971a8ae13699dea1f74e1fdc0617796a13130b68fd", - "a3ec73f1f9a683e92357a28424b856dbb9489e08ed6af8308d4b55ff153cc4ad", - "991bcec7a5dcc8ccfbcbff12c42a7df318ee739de0c5420ec0e2f5a96b3147fb", - "69537c08c633a6447eaf3bb128f43c335574ae7ca2bfb95fc0e8c38e46d2a020", - "16590fc3ddf370df60f21a473935977edc41088a602a47a2d4389198bba25669", - "d943d8af6cb375265b2ce454c0ce58d7372ce220cf731fc96d663af802b4c9fb", - "4698f5bb68049274bffc405a7e4c86f5e163158a840b845e27e780a658374bde", - "34b57f01e1a6fac4519984fb650c9f53cff81306dbf0d92e1f3a8a4b29850130", - "d06201059b4763d901bf2907630ae99a732a72c26771a267818ae2e8cda9650a", - "8ee0cdbbff9b256c6fcf62235de71caf7acaae69c5c6d619d96a177b848b5dd1", - "060791b41d162842f9d9b9cef59786c3578233b4f41dd649b518aaf6df02751f", - "d10fedfafc6e341eb2dac5354cec020d7ab3073fe82efb7bffac9ef70194939b", - "ddb862a1aa7b362f26b40e98c334f3f1b6a52f30374218cf47e996aad03697e4", - "df417791821c3a6e430e651cabd43b3bca08e82273c91b9a0daf44f351ee8b01", - "c23740dc251870865ffda08918d9012368625ff626a57c906d5ddaa61c57e7a2", - "0ca868be013d15e7d4dfd6305d6d62f21c4c16856f1e995302b39b895343eab5", - "abaf7390f2984e5e4cc4c8bd6d1839c83ab2213f4f9eb76558382101345521bf", - "ef0218c9d26e0da6dc6d43bb2e69d9ada553c629b783982047b55607eb71d699", - "7dcace389b8c16967955b85856a0e96a908a881171ca02cfa109fb4575a83707", - "8d3d43162b48b2999e9a3e6bb56dd87e53a128ba31e52328e31ff6dfe2a02437", - "9bd2d0d6ad274741364452ac378d0f2569116555317351a49e6d071e5a265d47", - "5b2af60cc9b4721dad1e1adee8cafe91f2608a36db0ce43910769e54a2f6fa6f", - "34b16f9b050c8b650852637830b3338f377e87d5882fe61bdd93d969231a518f", - "2baea4c0e4d446441ab07b9808d25a5bbf4efd5adcabed712bcbe52a2d1b5c46", - "47f984b3e6d349066211184c3dc57e7672d09cc26666e9c05b70078cc14be2d3", - "77998092b9089a6d4e9af7a2b0dcc8763e98843303a7d893ccb611dd86690d90", - "98cae09c865b13d5694d768900e5e1d3e79cb0db79f6c802a921b5505c382410", - "ab654eae7b41327415a4eacf836c340b3d79774df0128451bc779262d10d98f0", - "60979fd6a3fd9ca3c9d0054785e409509c0f9a29bf0355e358217b8bfa1bd1ee", - "8c3c92a963e36acfb33d95cc2903df0327ca7059637730cbcad15ab06dc93773", - "e30a61258ed509390ee578af1d5329e4001a6f8579c82c9ba2aac1790bb39520", - "61847f90734718bb70687efa8c04d7027daf8337572dae845080492bd31082e6", - "4c83227cc61d7c565a54cd1111afa4e8421f1a435c8c783bed131e003276f323", - "d7644439bc633f518fe73f4eb7c0f4c03f53e578d252269a30952492ee9f81f8", - "9e83a5648f98e935e643012c3281a29a2b977e8704edeef5f1fa757545d432c3", - "e43b261faf1050ba2624d53d18c860dcb5570706df7015ea43e87ea1624b83b9", - "ccdd0b001c2e471c3277c260f04b472cba01e04a81aa7f0c7aeb4278e0313b0e", - "807c4c58d8ae805e87aadf7db22d163ee0a9b00a8a4317603ab8fe8a0fac0340", - "a7a1a22bc5608ffacd947c3b0e48980abfbdcb334877b45aeb0997351468d77d", - "a56cb38f28b77270188cac1c2630fe306cb456a0787f674ef046586399e76a03", - "7bbd7b74b9d0233d8f33d1f6a973f2d625785c0f5a9d885ea4796f612793c40f", - "a1a069b664c858a3cb46cdf5c464b2c7fd8ba569e4ad8551fcff1037a2246d21", - "199fcbbb844fcb6e4e495ca193c6f37a18d5121ba0e720d2be76919904c32c1a", - "66a20885ff9418d9748d67da91914a96c8b36f264b07b1ae07be0f69dd8886c1", - "b25272b598938056375500cfa8b877f20de30d828656401e5684acec55470be5", - "464ea7f725159c691c7a2d07e040d762a3ee4d8df14fa7746163be60139b7dfe", - "6d8b9ee940abf2ca7eaaa6b70b90479e4c8df505b75563bff623a5941ec794f8", - "2af4eda22b49b7b8e7034a2ece5110416a570d6df4eac0eb5cff883e4bf1810e", - "e4f5398213b8c28d9d06abd0b4e0a3524b2926c1dc639c9c065a3b36103096cb", - "de490be7d5d620c970710eac3eab25c850a5425f2b3050c240986ce0d478c92b", - "2fc1f557a0463fd3bcc417c7133a19da5eab6e0a5c3307d18a374efb3810f331", - "7eb2b6b1fb7ff8642f236798b99274588504fdfeb950dce5c098bca862788f3a", - "587e20513873777c0aca7b5bdea7183929c00ba936a882154d04d888debde7cc", - "2460c948238c13b7fb50063205c519410626c1efb23ed7857358a50546b1e121", - "646099c5b913c7448119b26464a5bad48838effc4bf28948a859196965b6480b", - "f36398dd5752e66a0f9c1fdac0696b28495289fb6047f33f047020a55ffb7829", - "d97e787574754f6a837ad830bcd5a62e1c356c6972a59e8765e8daa6c2efe221", - "e1586a8503a0975b8734d2d64ec665298977bd127c3a62a825e9e2a697498db1", - "eafcaff25ee5fe47081bffae98f4b3c81ba6b1b17001c32a135d86ee39b55ae2", - "16cc1f4ee4866ab38e2d2582e6f841855face587c2dba8ec34b979a12f374723", - "4ed68b258ceb43883e5a28cc3588ffdb9b6dbe23a1b05cbe0f758c3cbb21f738", - "35997e6fa9b83a7e46b5bd96eb55438feb3980ced49c0558cf964d5240689012", - "ba7512810c35c0ef323a8115637be8f39fab534680dd4673b3a347b4e7f29e14", - "d0dd39d87e39f051019e84ea61118fab990e49386d5d312789a33fb047597f66", - "e130c8bc97000a87de4527cb018fcb24660291b1dff3ab17b896dba63696a7d4", - "24f1895e540fd3b71fdc02a4edb2862189b052c6e65dde9c2379801e6505bba4", - "f535fb35c7631c4fe7b7734e1a2453713eb809d5e506cce1710e84c575fd905a", - "d9cd2dae1d17e4171f83c3e4c20c16c478244aebe691437ae70565f26b3c6854", - "96f8efdd8306a6a3d81a18de3181ca170f3076b86d5c7030dca46c338bb443ca", - "c157ea91d98a3b402e4cfc7d2f821e58f9f5d7f59c90314e87f167f3f68ef4dd", - "84496386e3f15a9b6daf65e99c8af48aee55423b3b4f97d573d05e35005cc06b", - "635d24243310f2f99c4516bcfcd1a29ff5532d09a4341e85c5d8e33b178206d4", - "aed2fbb401ce32d507633bf9af27dc5de79addb4629a62b1f213cb7a981b10df", - "0edcc31f2f39e98caa39f51fb3837ba0b9fbd4c69f8bc1924d94b894b3d7effa", - "c9e6b6920e9a1251690da1e269514f9f35cf38b8e600576f546c3f126302688a", - "5515f97e4d5de4da01a02105c363c8c506cb49da9c976ca0443d63c0f1d1db7a", - "40756574e676c870ebfeaf1977b06664440c3a16bce2a6f5da449c9e60b0b389", - "f140848e9192aa4199fc26e08ad919fb88032749997cba30620ea0d01f449f7e", - "37e68b368000083cb1768c1e83592e93d0aab31cb89a67098e2b0c0a5c669212", - "d220d7f21889a66cf5bcfae93b03f0c2f7aec540b1aebc23105c194c2c420270", - "773f54537e1c025fcaafbd29f8f18b1470f6611d8f4a2faa056caf633f09b51d", - "5bad0984363cbc0dfebb073ba5cda479e5386bc6cd4b617e32111250b87fa304", - "d96bdcd8460de4bcb0f4476f3e7c6433c933b1cb889828aa91ee2fedd94a7649", - "2ed687f0ac017dde4812ab76c11e8fdcc0ef021ae04b34bccac5c43bb241e396", - "00061ec03a78fc29ff3dbf3101f536087ca772830ed47a73129ac68d8c760a05", - "0c622ce3154258e96ad1045bc860c814033d6e5b2a2d8688a8b4fea97a7cc5bd", - "1525dc49396bcbdc714ca0559271059000621d9b81e412201946ee6715411118", - "6db13fe8c97c0b1cb932f42ec90c2a6e9880fa098c0e2dbb20b003bf562e9d8e", - "c72ed2715b93e6d26cd4edbc0e556d7cafeab9193de67763b9397ef571873f45", - "b5033ea29cb2bb19c4614cca82d455ab2395dcd83aa42e97bc2a19801a13f67e", - "11461d7eabb18ff708965894485cd9352fa05ae9aba1aa9f9fb3d4e201786077", - "9fa12b5955c4330c7675732613524751b1c4113e0225e099e7621028d545413e", - "b316984e6ad01e5152b879521787c810a55267324cd8fc03b285c457f1b18339", - "9d97cb087386ab57c8cfb539e795f24a9986ed7627b0ea7e90558a266d8d2979", - "29c86f1b3441a0c3c9ca41df19c305ba8394d4d95681b155e751052e567291d5", - "dd323b1f722c230fa9611e2f85feff08d96d4155ba48d9c70f48c182f5e3bc3e", - "74064f75e93ada63fedf86f412e1d98022fc9d5fece0c2fb70786987a28ad1fb", - "657ae3925f5d6f40a0bf6ae2044e63069ac56ec8e41f97751076ce44457a64ee", - "444b205b207d9534bf1c497aa6d8de0eee029067b620026d6380a46e8929f4c7", - "5f97cf9911c20d63a6a08ee2828ce9a95c8b35e4dc639b3741a23abb65597231", - "5025edd907ceb6aa3995b606265be45fb13d3b0c856142b97ebc48a4139ec8ad", - "7ce1cc61d9ba5ed6e89912395f5c34b9998eb1206f73c1c70180a2a3738a4321", - "de4ab0dae7aaea81c0cd513660cdce0e07c39b23cdeb314b1ff5d43cc9d02dfa", - "5c0ea2597cde83eb8a4a5eceba6a24b130719833cdaa8e0fdb4f17a6f0e6cebb", - "290577aebcabe344046d294714694b232623fead2c0705e9937416d71ce09605", - "89d753265d72058dd5b5e4476221b068682b591b136e50d1ea10312b02735ed9", - "783e69b3058007647a2506a612833761dc267c3448496ee87b7ce8f4cd188708", - "e65f2ba2076d5f082dc0f718963f3c55eef37b93e81ee8a96b0a563316607af0", - "27e8b737d4247b9b41631618851518e5691e869599df3e2d4000c57e9b80a4aa", - "72df0a5b04b42466352ac4b541230a5a6c208d1feb4e296292671690d9c33036", - "403dd68444939f84fb706ac4bddd28fb2cceb6cd283cac021b473379128347d6", - "6cda838873a11d03d120bfa7f637ec13c11ce48d57bd1eb8b5e111542b777926", - "4c0207042bfcd4556fad4ae05581f7a8f56683beb274610b82241063d6916117", - "15d2c5d99e492152e2ad15ced9b2ed3d18e395d59e06b4e3793f8de06a19e6b7", - "224cbdd2b2f19d2bf49b2cb51ef9cc94e408094dd142b5e5c00a12f2cbf79d59", - "ca9ca778fc3349c83571aa372a0d18080837ffa899dd706d65d1d22552e3d0dc", - "72d201abf588f48015c875001293d676198535c20f180f9bf40159942e07d379", - "d8b5bfc43f284a4a048a96beb66cfd1b9fd82d8d6cc7ab2f574b2d92e300913f", - "0e51889e9484733966113ef08144b092219f231dd7b16a8dfad30eae3a129c17", - "7329040d7fec2ab736664edc7eb8770cd320873f910688e6b874b1f079596163", - "c1d4639823dd4f26d8443a2e58680bba82048625ee9ea97a0dbd53de37bc0f7c", - "8b8902c879b0b8f2995ca256d0057126ff3110e7a5d69bf359d4924b34ec2e2d", - "e299d3c27aad020dcf8d9febc53e3b7a716e3ddd1dbed80b9732dbef96faae0e", - "84b01fa3701af5ed880a94ba1acb8db45a8d87ee0640671ccc720befe823298b", - "2f767f54db7bbba0cbba417d2472f6ec8d144495f5a1b53a7aa4c71d3fe565f8", - "f38ff01cff350df1244956cb4bbf85bebe850b45361bf7e18c617b2c79562344", - "bb6a386ac2208b3ac2482918421b2355518075fdfdb53752ca10dc369d8ff9ad", - "8cb2b202d097de0f78b9d329770eb340403b1f480baac86ee635e474501917f1", - "5c17ca5a66a16dee3974421e6283f3aff9252cd36782765c614f18740e0c4157", - "a58c64ebee97bbd13184716c6c5b9dd8623564c880196d6a97587092d4db8220", - "efda408d8a16625efb0e98b7f7dc7ec5eaf96c94d57d8c34a56f47bb13063acb", - "4c4d6edc7209323893a115e25230112f2433100a15619c739c680e81787e7465", - "251dfbda9a379f723d5b4fafa7c7203cfa5acd2412a4298010e55cce353c264e", - "dd60373c4adbfbca5b046d875755ca9934bdb8f0ec116f9cd149301a9839e9b7", - "e5cb0277991bd537971c9774eeea832ace3e8b1f085a526c857c59957382e861", - "3994e73aa3915b6ee1b47c1f3bac5f6869652e4fe44dfe3d3a804c98ccc9faf0", - "fb48bed2bb043e172dcdd033c097c96c9358c21b4a081eaf61cee56e6c3c729a", - "cefe0bcc415113ae3dd7d4b654f66ce679fff81c21c6d274b368682c74ec2502", - "bf5a7541f0d272218cd0198ab8e37c042de93a992fbba4dac041a6ad9d92f385", - "807408ae34dafc6d97fc9dd929c1247cdcce952645135657475d558558090be0", - "847f172248ae42e7813d1fe5869e5d9d72edcd9ae313d329d7d819c2363b4c1f", - "2a4047f1afd212a59dce426c9d785aaa2deb9182d55a8d7d869808ed87d0442f", - "eebff42aba4ba310b6484121dfc47905b99545627e0148344d709cf52a85d5c4", - "a588baaa97bff1ddbfd4cdf0933ef17454c8a28eaffa12dac56c97197f5d5ec7", - "ac0078eac1916f5ece68806c53bcbcf69df755ae52eb5fe62af6bcb977be3dcc", - "59a1c50bd3d6f01532275077eb7c9280e7743127b998fe075636a777de063843", - "d942df7dbe39a5b087c717a5ee5abb5bf0969dca37a53d0ae80e5eebede1e42f", - "4b33db1e038177adf43a146d318aef26d3a8adee6c10a8e1e7528c168b5d2c76", - "b51241672877395d07e86cf81bf1a6d3e075e87f6271346cacff0ab89340e586", - "72bbd4e8e02c8fb26d0f664f9f1e6fe7413218c7cd48396973f558b3fbb4b215", - "47fd9907e57b1b2a477d95ad07b8aaf73e071a18f21fe8669494d65e5d1a691d", - "8f2d224adccec88954ce6a66d67030b181b13ecfa6b9f19f2de8fc11851e669c", - "ce64dba976771558b8efb568f6cf50f14b601c601bc49b87861abd14d8cf939a", - "06e84d8ced20fee3a406fe48c28c6ebe30665964792beb94d84db024818ebd70", - "50d5396d87688faa530c7d82f8ca8b198aa9472574c1c18ccf0a44c05a585e2e", - "7e544d04235ead58d52efd86fd4e882abc4c67a507523eb846c01af0c75c5850", - "464fee94861f11fec21d3db40cb49663819c5b4fb6eacb980edfe89df7ae67a3", - "cbce959e1b711d4fc45c2b2ac7b30d412fad48786bb3ac7dd31b68ed35b9f7db", - "c6bda7fbd686a5162e68b7cd9c6e0695430b30f4d560bdc1e7601edfa71992dc", - "2833604f20b5ff057b7fce217a4eea9362cec3f0acb508cd9c13b118ffd249f1", - "87e530f74bd886ca62cc2b6b355d7338ea9e7169c4f1d0ee32c196516af5a715", - "c1c1c285ced21640405a3268d389c7cd113131fa9f4c3d2501f002e81dc1094f", - "38341a8928d98acb3ffa0868f6959be989550f380d47f6902ce20e8e35e6dd85", - "677a2b630092c8f836f569c8b6443b05c8ffceef8b4e44f5ed8999b1e03ddd7b", - "d2910ea6ce1559b25113bd87e252cbbfd7ea637698869aef11743b4717bb04cc", - "e637e27dd3a1baccd2d83f3d837bf1e26d5cf8194c2114091005a2c29a92e3b7", - "2196a054410072d42b02cc93b64fdf854fc0710c7ede74bd74841e860557a0d3", - "4f6f8cce8af9b9fc8638ff50793286f50dedf6ae3c2a168346ec25ed2650bc3c", - "7203cecb81cf05d51a67efb679fcdf342bd764b03343e9448c8378051c1a0e48", - "b035c0d5754ac97cdade498c51b21f23f1f7789560bee70ddbe14c192ec8852a", - "6d04aa330462deda066b278de4fb7f49793511cb2257ae5deab39ef1ee39d3e4", - "780d45df354a2c3d3463606314552249f337dd6404ec2ead69de4127d6e40dc9", - "091a4dc0ca2f19d7a7d5ba3cab7c985cd8095bd18b6930de240ebedc70375fd2", - "bf7e42da39de596f19ca973c8cda78429ae6183e4477d95bfcd092e1aeb78083", - "d0a90ee2a6d73c87b2030c50d16f4440182dccf98b9f4ef9b2ebfef22561d398", - "eacb449963adf3b9df982e604f317952f45414c45153f698bc0cfc7b0c39346f", - "d2485000c1c98db631d26d2687904b8c6afed769283adda82b183e087961d94e", - "46321bb06402e5b78a359c4d5b4c6640c5afe18ede11acc06144ca008c7c4de3", - "59b1dc73cf60d54e96c9ce1a98b88a8435a7c9fd5df74017a17526cc5d9f1b79", - "d593b06cb85b6c8f51f0e2065fa6cad9a918d75a6ed1f9108214e121d91f0c30", - "5ebda75618810b735282fdaf24730ea8e452dcbaae4c557b18c3e8eb7f393b1d", - "23b3dcf9c8c972c9ad9c116f78af6640d85b23e96b8eaf5f1a36e5a7a9ca9283", - "fff578001bc9a95b59fce7add2d1600395b78e97363a0cb9d94cadc6050d869a", - "b41b68f1dc04d54bb38a62498afc3ee72a06307559de7638b9eaa892a7d2e84b", - "143f4774ab8439b04ca8f97bc5caf53c842faee25f76cd16ade8aa7031867cae", - "7a55a8adc7619ef542672241e7f1c3c9937e6b39bd06ef8cf34b8b0f1913c2b6", - "8402a060f6a23b43cc35ad290684ac8cab380735af15f01b8965d2a236bb8cd3", - "3173dcc47d2b56dc4c45f7bfca5318c990e22d859adfe08b65b29b7393fa866a", - "759f36f110efd2061db586d609bb49c8a0bae3782b0e7adae37a61a1c03c5173", - "e8bcb45d38d9d56d56126725ac9e988a193dc551bd3c031afae8d764e5045388", - "db18336239ce6d35da9fb7f54f32a9673dafa8ade0a0f9dd7a3c212f17ba65c0", - "6e69d948c1f1d1f75143c0aa60c051b22a5fc3530a5f4e1d3787463dbc157a70", - "4653ace60d59bf5218f6769842578cbf864fb675a2fe60c0d9e2aaa09f53de08", - "139231811c6b6825af108424edc7b3380f919c297e1750bd3ffbfc1017af60af", - "680034a16fc8f791b4918b13e627b3cdcc0a2e45d23387471feaa41a4d79f5a3", - "c98e83240bc7ed06cbad016431679d8f2c97e7ec25123cdc3dfbacc5be5ddf03", - "072e52993f02ed98b0686421e2e544a208f17d49d1c734c63f43e401b2fd88c1", - "3310299b61e320d35bf855fd2eee98e447d0419f4d043b0731b1623dbef2b45b", - "084f66c16e1762805190c04741f85e8d9cad183cdd08f1a48b534135493e28f0", - "81731a84bef9cd710faba71ee2d668e094d28ea789886d2dab8d9fadc99a00eb", - "0629354fca629eabc4878ea58c71f1b8df7a5704b0ed7fe8806e0e19525afad7", - "c27e43503ec3b4ada4dcca54e3b4f18904c04d3b5de6a6ff738b76f07ba60501", - "be66a1315df2a825c3710f86e849c1282bae3f3221392a1803405aec9f63f7f0", - "6059d60c9100b5a539ac7ae6a7e8c1ea053e2a33dd0d84958ab628e1f73fd35d", - "05fb48220dbbb48efae250e568c961de41be9ea2070cee328ca5d9711618f27b", - "687454ca3f6b10847089a1ce855c70873152d149d42aac07db68cc828fa67327", - "39068654fcd7050ff8b05f0973befb808590819ea908142fa76c2222aa30069a", - "82c23913ef269eca9400ed4715d632201978c43d35d7c3e86ebd05025f32a5c0", - "ec242a3a274e7d3cd80d9185990ad7a9c6fe17ef9e8c07eaf17cb342075204fb", - "bf96b2df41f6599edac61019bafe5a9884c318e47e84dc6182f04de62b58f36a", - "9f4b717d4f6c4ae3d4c045d5da39dd74a4492febf348c5599dad21ace33dab50", - "c16aaa6f6cc618842798e655ba45f10139f9ce9b81a73eadb4c2667970ae5874", - "63e4936b1c7f5cc047103efe5d1920fee629d1ad3e76848fc19f3b3085cb5c1a", - "40029f46e2491e9e72a60fc61421fb5ea4d0325851bdbde2a5200e7524bcdb5e", - "ac01ed917ee548bbda0ba200566bd847a8a54fa1340717fa937a0ea6a0a49980", - "0e546203144f7f42b3c31e0c228630406f51153c38990dfe687a0e70bc5f7105", - "9c55a1600054eca45da942542d740097f82e550c8d22554bdd5c92851359dbd9", - "79356e6e07b99f8a031156d1185c74c34611d5ac060a89d3d87fe70cc4fb0f86", - "fc76b18ab8db92d96b180b072732e212d5fab0d753ea61bf79efc4244e24d3c5", - "2c4ce210c68ec245ebded8de190924a7b379dd700053ad2bcd7bd49a4137d4b0", - "dfb709fd1ce7b82a800c70bc5c54291cea6429fb129ead7938ec11102ca982ad", - "13bea6bbe3e028ddac070f18ca67d7f8c0bea2098bc2074764c29f9b8cc832d6", - "887a079bfd3125a9b7fbdce88404077711336c0f26b0aec32fc8e65cfa322f73", - "7534d2f31c92b966edeab22400587f840622ec64b68b42399ffa9dcce200430e", - "436d92407c6e4ef666caaaa80490180eb926b4390a4abb61d3116ef4e7842f3a", - "d9a4e180598099d89f64c03047a3f36875a21ef10dc179676019bc31ee6158c1", - "eae047360ec910f7776013c5e2d195ff0d41489c098fa64ff2eadc8a42730646", - "9e4b5776d64529425238f93cb655fec189d06523298bb412a13fde805d9bb4f8", - "0bcb9b24b10daebbca0c637f952d8999c17b68adee6c6e60515391ae0ec7e3ff", - "68bf438f6846ad338a3ee53de6523aca2c4add039805df00b86b69f53721098c", - "b516dd536cc2245f7e6ecb8ff83e50210ec5b9a91dbddc1157530c383ac3a24c", - "33e84a8ee8df653f03968703dcd0b5a3eb7c36e9a3c2d6d4906201f88680c03a", - "26a22ffbcfe9e084fd62176ad6c28672a3ef3f2809001ab962f8ec97454c8655", - "3dd37f4d3150bf4935c24767f4078ecf777dcb3d9e2e6dab0126e8a540a3cc83", - "1fd8fbc90a10ee425f9b427d1f0f6ec35d8ef8cb0d701ab048f3a955e5a43dfe", - "26a6cadc64a695c757879c3a381cb9066af441f7e8a6e95ca99123f52b61a186", - "0a10b123c2c2f759254d75994b0a8937f2763a6324d63df72368c4a64c84866d", - "2572fad7682d9bfc1f08a02e102204131912bf0782d2cf1f06b886b4b2f8884a", - "e529e15c1c54276a4cbbd6e931555f4d6d9c0404b7985b7b7f9e2f1033ae678b", - "e3bbdfae89f238d5fa379db0f29bb60a2271742878d7bd7a18223e885e5b2a55", - "b36515b17d4c4cfc02f66353bcb1b8ec32824638abc497277b32adf8815093c0", - "bc7e978e82e5b667652e9d72d935480a122d4f7c323186f198a92e5a32b0d8cc", - "d182f88ba88e4bfad2bd15829c58c8d5cde5c58c2b5d9791d9860bf5c89b746c", - "dda53d5b3f3225eccfa2c9b774e9fa7625490e1fd2647f1fe4a47af3f9c0f4f7", - "f3c2482363fa916628b130b63a683902d5e9b70d8a5bf29f841975772a51d94f", - "f38371ec1f3f162788a54ca59c5146860d5557d383dbce958ac4db983d88d404", - "e5787ba6f4367383a4b899d4b32366ee02dc5b912e5ad09be8db2d9e5a4468ef", - "d8d0ede5b5b775bdae5b79faa3bae2d09eb30fb092031ae00226bb1c2beda7d4", - "f47e9a76940d74bf799df812c66e616516fb5c0a7c084d1d9f5974449e7514f3", - "f69aff77aa49b75ed710b8817ac34f337ff98b5cd35831c0c3edecb7f5553d9c", - "5d65840fb2cdca6939b57b2f2bdfb94a54d6b6079cfc67feb1cc82954d90bf2e", - "276ed40ec10e4ea77767f8921972a34d567d337146ad486af66b0f3e6230e95b", - "2986b9ffe2507358862baba973b01c13032e4a27c767bf1de25adf7dafef6442", - "bf951786e69e45d768381fcd83394ba815e1346eafa0c742c8f9c1feeec4346e", - "6f116ff2f4346cbd467bed6dc2a02760f5c98a5f8c58c4d0a03a8e80c14e4bf8", - "5fa3e4e00c570836808b414a1db34297c7646a2b07f645d7c3a9a6daf308059a", - "456245a6338ddc923cf8a1702e584e930c7ef1f5db495fae673e721bd1d860a2", - "0120727ef4115acb2f12dbba2789236965cd9bad006f015efabe1777305189da", - "f1017ddb3885babfb0ad283566e7c98ac2c6dffb5cc1970140cb09d06f37efd7", - "0d5149c8e4f10353816d9da7e09121cd866d38bcf2f48d6ebb4a572aa313ca9a", - "ed3b98ef312cca09962f0a5ef81d1edb950046bab17a980f67c53af6f2de5901", - "f331036eea40c728ec40e90c97ab40169af45d5fd6b8ca448ac73a752bd76d19", - "87aed9621acc57fb09e810e6cdafb05fc07808047c0eec5828a62f8158992ca6", - "7530e4988c91972426c6c1a2d4fe64dd4a923549eaf470c00a671f29b7d15da9", - "48e06d046b479aded98820408c247a73c878d38bd77d57f38bafcc228e2f5a2c", - "f774b6a5c9a6fcb4c896ae753d406b0ffcfd7d8b8fe7ff522a10271a295b573f", - "22036c2a57c8688eeea17e482c56639600c797c5d7e66fa6347bff1504f3cc59", - "9c3c99ff2b4990c8d930d163022488c335ceeb0d8beefd6c32a6fdd2da86e0c8", - "df15eb1da70ce17217b5e911a44a41102822c3ccc921e2609d0ac6f46b5aa7d5", - "976794c0cd923d0163d78df9d3e20610811fe7b973d6469a87b2b06e665b4817", - "329d48f5a09923269535ba9d53977fd68d9f9e12e93239b681e608423641b084", - "8552c389fb0ff8d1026066654788e8ac3aa3991464c3f6099b95a895a2d533c1", - "3f806373297a78e849c229fe7c55a9302b22d63202e5193477e263a7974ae042", - "afe7c5aae3f56f53c62252addbb6574ba047239e86b745dfb022716bcc425e10", - "f8c821cbaaae6365460d8d2c461fb7026ea56ca773afba5d3e91bfe25d4f841c", - "418f46dfbdb4113f4400e8e9aa24292e69cdc46d968ec182f878ccd43a99d2d2", - "33213259a1f95bf52fd2ab7750725dc0cc54e57839b29eabfc628d63ec231ea5", - "a74fac3fe984f7cfb9dd41324e8f8af66204d2fba1bb2c69c6f77f74617d85d9", - "cc42f755f5bf09310ef16dff61091df13d8694ba515a2e6f30f5db8c58d2c698", - "9cf595abd97e4a36120f1b41ed40e710f95451bbd1e33cd20180415659850623", - "d050aeb9e8bc7f9af1caadb95f7d6eda6913bed715ac7bf6fd80bf866d592686", - "b91279608796388bc4f85d74e6e27c114796433ff272c5be92a6c464e9a3173c", - "7ebe358de9ebc1f3288484a374ebf8cab9794cca3e91220494ecfa0f5d3e8983", - "011c24a4ed5807178862197b5b5632b169fa99e8f3abb62ef5199a1de73a8284", - "b258c251e36b2809875e800eb9c58f7dfbbddddecccd9b278b097512d964691f", - "a8c78efa27c740be7347aa005ee419b49948b2a3a3e39e8301b42c603c511ca8", - "f7afa70eb641aa28978736b23eecae7c6ce42c95885707bd9a90b9447f147910", - "69a28f503bb6c39e055c567c50d23d76524c30a92eaded8ef59e3a5bcf2bccdc", - "c9f95d080248c795054ca6b1d920bc27f83eeddf32c3d1a868ed0dd5209c2f09", - "a809234bd0527388c6ef88e7f11736fa8888bd5c86a4726cb8194e0fa8a9bc8e", - "8293e16f003f34abed93c8538b7f56f51f2a9643121a39555ccd293612c033b4", - "ada8a23391c56afc844274acd61d40d355db547ea2a87b7d3160822e36a3b1d9", - "14e0d128d43966140945116a62498ae81e9cc3db5691ead29d99f95bde182fd0", - "12847b4fc3bf6c7efbf01bb30b149cd135e3b6971931bc4d5fd176e7ca42c04a", - "4560cab7fbe6b6de2fbee582f08a4457ae584f6edcba545edeccb5d858e22582", - "aebc88a37dd5b9c63940c0ca734daf52c4d5cc0c411b11de09a6549df42f4df6", - "65ffb699a1736e58e82dbf37b88420b847f365fe959f8e89ff4ace24493fbb1a", - "222c0aad845c74ed3da045452e8a8ad94a649f0e6fe6b4ef14d4a3d805991427", - "52222b8bca29b67c9008ba26eccec9032eed42599ea99803b091729446fe4e17", - "e07f44942ca0c4d93b3613c8f60f4dd7cd306da2b0f13cf470c5f48ec362736a", - "dbd9bf0a7e25b01d1b7f6f71aee750192550da64f1995540eafa701712e44a14", - "6cf99cca8a1103c237cabd9c4ca5886a85789b70ff54378216209e2594799e36", - "b86fa86b18792d4f51e1b9806311b5941d510c46dfc84781dbf1dfd685b79523", - "62ad94a555f3c3fdbea0726cc73ad995b79e1e0976a39eba0d600e8ca7631dd7", - "3ce257fabee84131dc8c45fb461bd04991c8348df74481b8e17a8db55ce33c75", - "e10e967de1edfcf10feda3d778cf9f687967b304487d9e7319155ac3ec910b2e", - "160ee257d9a5198f824b801ea33f01ee9ad14f781eaa62167d3098caeb9b8981", - "4f57673c6058527e753e3fb187e56cce958be8214295dad499ab29060347201b", - "1722554b03217eaf0f6a5a79aae032cc155bfdaf1c5ec313281da9a2913ae25c", - "561892aaf6f034e9266a507628bca6f009cc9c58eb3ab54aad15b3bc1e4485a0", - "46ad4ae35c3eb565447b9c43e8078a223133ebd810d4f62df068eb52749438ef", - "e3db35154066583fa62288ec9cdc755effdb920be4ed262b5c3635bd57566fdf", - "4a889e9021130d0bd40b601a2c7ca8ba2eb87f971dc841e88f6643390f6f88f6", - "06f436a8d4dc08e6f8eccbf236f030dbdc3bbdcb9acec0d26b49862e8af4eac3", - "c041b0ac2a8a30379f0eb40c3a1d2f194ffdbf735058fcab7acb60a61ad79d9f", - "52b935280e0bf2949aee8f9bdd1cb7ff75c189bc954e6b2ab80ef868fb3a831d", - "06799b26e377779d1261db5feb20bfa9333333a055513c0c76b2f0659f2cc08e", - "e2c60ae3a0a366bfc63bafebfd02b74d0263451600254e4582e1244253f74e50", - "cf5825cd9b50f0b0c0acf327643aa66dc1506c2ca90ae03b542d3355923dd63c", - "8a2ed9b53c111ca8c981addd53fa6f051cf067b5934668e5b3f637abbd0f8440", - "f2a658d536f2fb207c97204c6acd44cf93e561db3299ff3e1c2ef5e0fbfeef80", - "72ebad3dcbe36c3ac6267931aeac06370e8d7810c649445e0fefe6e93efc220d", - "018ef2ad7a61ab0a7b69f3ef7bff0546a7449a909af1b7e8002902e9ac84c190", - "44fedd62dfb9381c96b7440dc0eb3bc3e042b9a67020d74eb81db90bc8687650", - "5b776b4b9011b3865fe95b14fc798c45b885b48ff18f16ef4a31e21c3d03d6fb", - "521a11f9ba5495cffe3572e98cab704771beb6acbc21dd5d5210a9c0f672b704", - "5a123a72825b51e5b9554b8706eddb865a79f0267ed08ca3a11710657ec0cecd", - "22c0e4adb5e6a1f05f9e4fd89b1de2720b6f70f837e93d4d0958a6a6063b4e06", - "c77e242af77be3531fcf6d41ca40a7262eac464552a82ef6c1accd0063ffa73d", - "70e07624605592c7b14a3356f2d7f587ccaf83272b2aee0c7a59dbece5128fdc", - "1341ad4983e6b22955045ec9584fa9414732b9535962d4ac4418a728ecd36d8c", - "dac26de736c6e0b6882fd7b7d6f634f9107bd5904828dc610c5a8fa1b0a1d367", - "b58b1927a1ea503d9f9397ef85020730b231be2eabe5cde08703275046b4eccc", - "b9741ce3cc13c2de48710f4e47829dd4fbdbbad320fb20e3e3f94f4787948776", - "7b3da6b4112bd2739e6d243c4a032208333e7588342c3b54e35ad9d2022d219a", - "30236c9c8e05930faf672e67f2f7b5478db6ccda42133e114c7961f36c8c3b34", - "a5ec4d150ccaf8779d3136fc84d47d7b9ce31efb395901f478a52fc8a3bb45b2", - "12e63b59c4d662bb3d1fd25c4b7e78ba0343d6897152b3100d1e5e94dfa119ea", - "054eb9ba743bd483847373d3b44922b1afbf123ea9deb9167dbf6ab0ffaa1b4a", - "cb21e6394d4f964f425f3d24f36f07613faecece05d52c4e2da20ef24f9e7c90", - "3832aad9b796e0578b0a27c9e47018331edf177109de681f8988d394dcfa1d80", - "0f876eb887619949ebe2eafeaaae8aa57438fbdca23af03443409adc9e8a7fc0", - "56732ff5981d81f27499918ea16adade5033cb71a34c18b5be39874169c52048", - "0c54a23cb52bb5137a208c31e788efb4483fc58d8d7c089d461265bc19f045db", - "06f08ffba89a598776e7a382d0fc5fa1ffcc2873fd194c64fa33c4422509c6b0", - "f25e1c4812e1a58924ee277bf2d77dd94e2dec8beadbeaa96e4fa3cb8c99c813", - "9ed6a3f50f75eb2f89b7e2b774ed85bf7e96d5dcf7646893ff5a41bd66c7d66c", - "9c7523fe1e4e99f1b89237c5070f4e46bb2c2d2403ba39c6e19745c1105c4b85", - "5bb5b7a5bd3f4ccf7f3497493c68a232733e60b4f0356c50980b52b712e2bd78", - "e12c8afdd627de13a7d09ed133d4be9bb7726ddeab8e55939b516b3e982157e1", - "fb87f18c5fed686f63d62bdec9bbaad4019c94c9a4449c6538cbe43f4c9bc802", - "af9d9f9538ca6ebfc90d30b6d55a595639ce45fcac083f06a93426386e7c2bd7", - "945cd65ea630fde3a4c837a4729e9871e37a2f6359df9ddbf80013e7921e9a5b", - "1a957f833aeaa02ef2ed3cb577e136fb22414155b60b8341d701ecea93e5b427", - "1a58fde49b16fc126142c1bb9b7055519139f45358bff73bc84146feafb2c08a", - "5d4d4bc230cbf4422f6566fcdb04f11f6fe2de115aad8cf4cb548cb27b4aaa85", - "8637831d70d3278934497d70fe5b3e948fea6e0788a6ae326e6a81f8dd5a1995", - "a4db0616cde94d9f5abbdab006fa141688f2be85da5eec77a8309e6eeb02eb8a", - "ec38feebf31ff018a001ca77cb71fe4d5501fbc1b551676c0ff0aaf773950a33", - "73aecfba100f132b70c2be110ff09249e47993013d5f8a041ebd568837887c00", - "1071043eb3af3b5273e592cb7917e2c82f87c79db75fd547b9c91bc36fad60c2", - "4680ab59807b5d364a350b332ca428bc5029d282b0e72f02b6e617810727586a", - "c4ecf5cc1228acb4aa4dcf587470cc7a79ff2fb2cbef2ea3af314a5e2b3226d5", - "13034a6707b7cbeaf2507e167006c921a8b2d1f3a307e8c2cfc6b9ba8174c98d", - "870e884a766958e73b051b9f07c04e80aa513510d50aaa3383bae445e25bced8", - "b2d3936716674d6c459b83fad9d2b53e481e74b43bccac65988578cac06f00fd", - "0889a901f409b06a1683ef3526678a9dd311172bd76e556e1df3e0a89f9152bf", - "8946c4b44e9e1ea060390b789138b049c60915b5b93d4c60a67c7bd971d1ddda", - "a5663eb7ca657aae406d1419486d594d2076f3b8c64834eee689059912601b48", - "80588ccf85ac9187aa051515c4b8c578ef65458bbcd93d541310a3c987f450ab", - "5346c176fa8c90026348d3c60aacf742b51aea35b27a23ee7ae21dde088ae683", - "631828c785340521d3ca616a53e09cc6fcd91c02cc9fed5fd5b60abfd6312804", - "bec20ada43e75cb233d216c832099910281355ed599286d9f0469e86e0f418b7", - "0f65727477c4b129473567dffe5830aeae64f76c983f168a59e685bd19f6c602", - "ecd911a4d5d35c5fb079555916c2e996344c1d48ef0903dc1aef8dfd63343e6d", - "c95039cc5e77e40cff2d7e8ea80ad117de676bbaf6ccda334c638824dce17506", - "a818159bfe017a51904fa88d325da7efb844770a45d67ebe55a3368cd966eaa7", - "5636a48eb861664dafd036eb493acbb05b854619236dcbe814ebb1c20dc6ec24", - "6ec45d38451b3d1d55ff91212fa7d1583158a1172438a0619c1ea1ddbc0425bf", - "803b5f65f4260565d95ab0e478d3c29a22fcafd4d52d21f7e5d28447ce8198ae", - "b19ef7ba57494bf4b2c7977c567373385162d5ed030c11f001e73f1665bc92a9", - "1f9ed66633ea0846a1720a864c4db16bb5f8b37094a38b763050eb20413fbd12", - "2187098949b65c6ed5b04175b728bc650222ad40acbda85b903f2b53b90cd51d", - "136ab9c231900734e0a7616ffd924f7b632eef286893acc6cdfe74e6d3fde1c2", - "e8e5e7ac14b1cabdcca0baa7fcee23b61b46922f676548daec1de214dc96f745", - "b75be0f5a2493d1444609bb5ee2002636088c075541a56125aad3a1da6a195de", - "53b370658537c3941e6a96777e9ee6919684f4e7410051abdd128e9832057104", - "6a0853e9a2673ff55df38943d96fd1b133762c63ecb871d7b6c72322043d7f9d", - "c3b3540be0227daccad15e61542832adb52afb3ba65c375071b07945a024e3a7", - "a734e212b96fb3ab9ecbc5ceb8d592831308f806942230a82e211a8bab279ffc", - "013800025f85582bbe3d750473928f940099715462b22b212d8cad859002acb3", - "41088fdf119e377bd151dd964b3ae895d077c1357add1f964e03a27bca800db4", - "094b1c20edc9a7c877522acbea37bd51d28211fa0960ec4ae2d84d6d2615606a", - "7811e9c19289d4fbdcf2c184acea156075f545e7eea3686459a76d1c8c4f2999", - "d002163c5aae8d8689dff84d46979d225c60bb2dbf167763549cbb3cf52a462e", - "b64966f3b4cdd2d22a8ef06f2008c69e9ef3f159985b7e6347d64856776edd99", - "55ad3e9c6ed6fa47157db63e7ef60f66e4ee1e42f74872f1ad4cdbe77dcf5d1e", - "8aea1b96304f255df66dbbcc471b686eb2715023d0abd96b8cc4f458976a0a89", - "b64d70295c2f0b802a1b6a60057d3d3c22c37a78df692e63aea5ff56278c4fb7", - "28b0dc06916c424ef94c7e1404336a0beaa4431c8b118ad8305c7e66a0c7db7d", - "325ae475cda3b373c184d6a4a4eb5a87f327634be7e568d934b0dc907bbd8fd9", - "91c262600c1247290df2cb57e2c7503ca878107cbe691bab82cc24a9e992a00d", - "1eedb1fd0989467881d794aece977e9b2edf3c971d4b41975416bea57f678bd2", - "48d1a68186eea1c1ffe99158858e56060615052cd5ee37f2154590efb4fab0b2", - "1f0f9093ba8552602b2d56b3a8265f8b296de8ef435712420ad85482bf78dc15", - "c01958628c47de64ae82f0b9a82f7c691d763a42bae1dfa2a6e629bd78818e5a", - "85042b3e512751373ee922323011e243e76abb3461a5e3cd8815ea66d75bfe36", - "92f7cc1a378545884a5c8cda20ddfec3b6b2b86e6a2ad384782d5f4932215fbe", - "55ebfe0297406e05d84a664af5823fea9868888fb4e938e068469aa0d687e719", - "428255bc99d0bec93dd3cfea970bdd8e4d5f1e8df504dd4a1be6e67612e0ab08", - "5b9282718bae34dd7f5174d13027613f35a208f0ffe218b7b4114daee0cfc41e", - "e32e1b381b0b06233f6bdab6b1235541db8960be7afe5a2c867fc3c2c3d86534", - "298f85ab3c49e13d96fd20efd433ab5f58f480936596008e8eae589c4c3008c9", - "7a090e7efab21d2e2d14aa76debabc5c21db9a2cc21d59e807f84f88288d0078", - "69d69513c7f315e2c1631dd92381cde69d84b4c34d545c32d5037c20ef415b87", - "d6209c4460bb867ad0a4e65787c61712390fa6b94506f09385600bdbc2e9b486", - "f4b85fe76d1da9262181750f88cfa23044e03d050001ab0016f0143e4f719aa5", - "279c58da4ec440a508abc10c66f3f01ea71ba62ca993253fc057d8a2e20c8116", - "7de71de157c2c3d6df89b94fa6b390444338e34fd2fb30c67c07bda0163b2203", - "72ebb6214e9c33d5eee10c920ffe6151492a49b13fb9a3dcf743feefb99600f3", - "d1d49ca28f218747920d25d39971a7a7bd50a5f589a1510bb13e8b51a2106acd", - "a8c70d37fc9ada011e81b537c5f336d3b2d82dda7e78d259898eec0e4d527f93", - "3655ff643a7a1d579c08de0c4f933433f1ce9b1babc4fc6684cf9791780b6c22", - "2607766b537da3e49192b20579d1a688433579e7733430ccc66eff1ac8a71c64", - "314f8bc2e15d351450640df26f6527ee093d2679e1ff1337e866ca13c26d80b9", - "b0e81b8c7015e45ab0f4d6d8a0b4a49a0c3743c4d17972d22f2bbc48cc0d4b09", - "860c68b5f3e45f2034f9e3edd8e7eebfa2bf850d8db2aa87be8d52747d7f65d5", - "96638270ac35da73e7fbd841c7d1182b6d371fe9ebac2cdf096bf44d7cfbf1e2", - "88bd2455d2378037f42f9db801b24f4eda497b8192e21eafd2946e8cdb98ad32", - "167b32b0686615bb0ed62d1c22a5dce6068ec083a714a90ed7a166182fe50d01", - "af225fff28275f9aed4a97eff5b554abaccc96ff8a0eacb3077cf6cca43aa290", - "58b58f9524e6eb4a64831b90a4d6ab8fad02bef3a9ba96a4adb80e4984b07737", - "b6722357740b80797d651e72c0fec37c53a1f3bc5a5381d3ec9bf89caa4c510f", - "ee6f831437b408cd64510902b3c4e113d4db22e15c80e8f9e6516555e90f1584", - "52b2d1b59d68b1be39e7b315064563023a66c4bb8c65420001d5c06e972680f8", - "2729bb5fb45891d55e75666b01296f590120f732b8b58fd754cb5d84e9109618", - "6404577a28016f04f6cf8a28d7ef77fc5ea3bb1b6cf0ab9f59378b5206b44b4f", - "bcbe0ed6757a93f58b2000feac0d01e350d8dee7e826406a79ebde8517019c81", - "e1ac9e89ecfb7742eaa3667767646c339450732ac28360d89baea4be9da98ab4", - "62a5c36b582abef88180298ac18068cd610ea8be14fb9b8151afbc236e5a2ee4", - "899857285f35c8b4eb0dd967eecdb6c8c895728358176ffe0e0963c80c36d88b", - "245c3cff5c6d1578026941c90640892d415d7ff6c8256068caabff872f138056", - "43e9b7a33eab42b6cf4c0fdedcc4ecbcab487a3e6a58d315afe31b5381d3cd9a", - "601916074459a2a4fba847d187eeb53713d0cfbf419c50a6350bd79179b13454", - "14a0811d24f184612f5e0098ca73d5081f4f1daedb8456fc765d46785c876fbf", - "14d0dc5614396ac1500fd5109c48af8f4836cd49dad074317345bbe80e424f71", - "1c93c269e0e0d17cacbec440345ed3b8c85725d8dc4219c4902ba03211dfa1a5", - "59464dfaf4a1952d565fb050f2f9cf1c6473e26b9efada2286ec506e77203361", - "b091b67d82cf8750cd014e4e7b3dd24e662b7e59993e0ac19258a3eb314c963a", - "731f73c3f9fa7c8cc46e819d95ef899746d1a98a71a665879cbc2e36e0ccb85e", - "61d695ac0665a11a11b4f1b594770f94870df6404e5dfcb9a26798ea972a0870", - "4190b4d081aee4355298f6d8159a951b49b312ae56aaebe7f245bdaa76e48b34", - "ab4b31645c67fef67b84747cfefac26b381f900a897573e2e28a256ef630e4bc", - "ec45885e4144e22e96812c05434e081cd3d92d25de6a312c99ffaaebab1f22c9", - "f4ca2697aad9c901ff89c319cd7f701703f65142a8349ff7552bb9bec5d62f60", - "fa4092685c4210db08a760115e45d5e2bb39c465f20bd3882a84edd01ab0f52f", - "1abdb7f327e5e482c285b7c3775fd421843c3a519c1a1f2390573607b7ea36c1", - "e376ef03b36a120f975ca52879db0df76f577306d7b1a665bd1c869b8d6226aa", - "139d0337c01a73b16ecce0f88cae4c3da1002a2f8b4ad9815ea3f088c0390e3d", - "270d96c51fea2e06b4629d17e4dcf9a06d5c2772511a76acf64e2d8d3a24fadf", - "2161377f75e7d9a0d91392d521db333febc9bd83f488b5b91c39f86b5b1c6d64", - "527c38bbe815483dc5b2d103a41c8fb8c6585f5df7a0127e9a754a452babc620", - "1cfcfeba55df750250941ca4b322ca682923cb2e2b6666bf78196377163a3503", - "d1b03eb10cd1a6e102385721314ba0d970143bdf5d65efb2941721742721f2fd", - "bfbf998209b8ffa1ea2140befadf38e15ba98ca27b68eaa0d391b5500001c7c4", - "ecf67a1f3d66a3559a8b4423c4f4c695e4d52015249534bb1dba92ee0922e76b", - "4072cc342da38501766ba5e62a056d4b3b323715474d4b07b4c44a3f440e6ba8", - "9b321cba2fecb2b6f51184f2dd91a359577663868b2e346b2c8feedc980bc3e6", - "1e45be9d45a2dcd910bc72230ec158aa064f0ed4c35d4fb8b90045031619fb0c", - "e4eb1d424eca1b7ae2837db101337bfc80f1ba6ca876c75e757c02232dba7519", - "854f858ffd2afce37ed226198d0d85aa7b70ef9bd15a85bc362add231d587a58", - "a27bfab92ce4467ad15bc30532a12c87dc209a44b29c69701c1b3ddd8d9b354d", - "70a64680c34834878b2438a5b1d7b1101945bb3d94a724507f75a8af72665934", - "fd132815995d5742b7b04ef441385430a1a796f55a6690dc7ebc502e6e1b606a", - "4d2d2f6db67712da1208eebcfefab39167c26970c4195b126d671ecc31939980", - "051998a40c1a9dc61979d3bec78909b5ec16a4be8c2627172a2a5de39a8d6ea7", - "1ba0f1d1b6c50bfda12e1d4f52496e353bed0648499a99b8fde440e454b6d2c9", - "77fb108617ceaa952b0a55ef07ef091b96dfb3a1488696d5c11e4d20b1736169", - "eb05997e53edf98bfe387060db5b32b7c41eb5c687b84ea05c8ecfcb6e4d424b", - "cb46c16c5b5a22f4c02bc593516f45c801ebf5227bbb698a7af8e7c323ed8047", - "b615f25fb4f7622d0f56d0c9fddef546f39b760dfa4d08179c8e35c490eb695f", - "c8a5782c3c1d3525cd1468f1ac36ca03df4eb8863be0a1c6bde3669a5a703a09", - "38fabdeda884be31a5d2ed709e577b022524c41de511e70c0ada776f6daff2ab", - "9b84c2c1f58d154325c05b36fa53390f92bd04ad8b7ee3c5985e765951b38ad8", - "9343c5980e9a8b50762801f5e1af8fd269828846a92aeede8cbc790c5726848e", - "4826b4c8da4e9441ff10fcf66078e7b6c10abf4ae776a6378ad89b2bc74452aa", - "6cdc9776d926e4ed147959451a45c815cf3eb61201565d2bda9122aa22313d01", - "c27098166ab7b7b29205d3708064b5865dfbb397283b70e8b07c6d057dbd47b5", - "04634261606cc726be8c42b0e8ef7825d007978fe98c084bf90632e12f64a30f", - "21ba18ace7c7e18e873c040ba2dccf9d23d0cf51a9eaebb96c0220dda398e493", - "6eba11d498546b8426f21c88fdc8e2677cfcc886cd8180846cd386e98922834d", - "46b632fd5caf053391eb7351295861838191062d067082d83a18ec6802a4d302", - "302487b6da8e8aeacda487c035d822fa01b468859f302f442708693ebf558aac", - "8411c5289d9661f32ebcdcd6f22bcd7c1176b69352890145968ec43a6c97fcf7", - "44c3d0891eedd5a68277875805ab737973684fee1b0040adf8a3bd83fa0d216d", - "15398216a8495bcd96c52dac6318358a85e195a61e8f26504dad56b0c94a4ebd", - "4cd32d2ad2c6b52d204d107b8c12ed2eae69b1bd3458dd561ba58fb951da2d1b", - "fcbb52f4d945e0665f0f7896f778bdcd815a2f11909ec38e9de1cbb6b23fa641", - "c8477d4aed68c74e01557656f3ef683e3060513d883c3bf59dc754c29202c5dc", - "2d748c21606255d4569f5de9828746ef064d75cc800b7630d28cf313a15cb6ec", - "efd37bfc5e5808c935ea32e2e433bbafc1ad230cb3a28676f3ba422003f234bd", - "a1c4b000e9cadc24ba5ca873974978725076c2bb125344f4904f43e855618264", - "480338f3e58164a0f3f6dee840bdab0686d7b23c969470df490f189f9dbb24da", - "914dda434d7e17b0c6028cc34abef81c214b17905cc7c1981f72f9247114b963", - "901b74a4362ba3f047c956cfb40b3f4fded585d9737b0d125adc82d69083d47a", - "39445ffdae2720c9d78a71a91d55e8552555abc10899541e50820d97e161abce", - "69fd3f7c92643dd99692c6017b6159501d3abd9fab0ae4bc8585a41e7c60e4ea", - "6f03dabea9fd86a2a628185e540f78b0819112751178c28987bc457ec2722e4c", - "e616ff614d68a6e4393f13215f120b5716ffa9ec2df7599e3db7f33bbf388eee", - "1ae9d9f4b5aff3354e859a0028daaf9998153695fe8a7296529d64cc2f84997f", - "a1d477f7399b4339c464f855fb4f60eaf4d69d1ff281943f601c645b66fc04a5", - "23d566ea581652179fdb9e3d7dd65f1160a07056d2798fba4d08db252ccaf683", - "15e675a330e59655210d9170d8207483f37d6ad76869680a1fe9842e5597cbe6", - "8df9803b1941cae7793dfbdeaaba59fb62de75c6ab3f83e29301d5ae26a84267", - "c666e195508033530883017e2c955d43045c5ccc586a231e875d672a5dfabe48", - "d1ec6299ce057b1bb649d1794251dbeea725fd5ae3f5bdb77feacface1c66d14", - "fb73ac58245afe275e0ef4854f6fbb0d974b77cd25b6f124a6776c21970379f2", - "024bdf4b9d0827c7fc671a88cd0d7f651fd818d286b92b2d38cd6dade9924360", - "d0401b62ebad7f61e0513b0c28286c8ba70313098dc71058b134e5f4a3fc4886", - "19e3c6c47913311ae65429f3f9f0f62ec982c28eae3fac1a277e317fcc11797e", - "34f0efd7d5d95c70b145dd6fdff23e7f5886347e4713d76c2df1d6a4d8d67500", - "81037bb63cba7064d09a27e51987ceacac29657af2c10e4bd6b9864c421887ca", - "673cc5a100300777cd1ed57cd86e27f9ce9ddb4d60760c27d82e596d57fad41e", - "496ce29d849d1a65708d35230d2995206db344ed43cd6af08d0aa63531a60283", - "6545a14c4d4feb72d720845658c93de5c75040c8a71c489f117454c11883ebe1", - "e4a4faa02949bdf9d15506b26715c935bb143a1317dd0b2dab80e65dd98cacfc", - "fd3bd0a1d71f2a842fc7b5f7bc2fb06357045477cb8277a11d30d9b3a1f36f93", - "4b170fd456c5161ab047a03d998f199ee52c805e07755a11443fff011393498b", - "22d29e8536710609837fec5c56eed9b651b53947dd85020832b27a47eddfebad", - "26931988a5d719eb063747d6075337e70ad4ba6d9324d383ab02d986af530476", - "848c1cb38dec4bf004e4b21c72370752c4601255b7d85706d52c82f1297cb086", - "2d0700d494dfe8d9d0c72a8145c953741094cc95f7b548d0606df5caff1bd386", - "bab18ca7c9edbf015cadefd3fc6506bade93f6c3a9f769ed4a5def8073c1c47b", - "5cb74ade4303ca49f78a7585dbcef0d0bced37c608a1fbb99fcb3814b64e8f64", - "8913b961febb300785bdb9500948c2736c6be2f8d2b3534e3b1c1b3fc42187d4", - "65cfe9da23fc161fe3ca2a4e87193df60e5f8a15b01f177c2fbf7a468483cef8", - "a1bb9be176b8804c189b0bbbea1af03297673160069485aca18fbf41dd38c20a", - "b64112ed416746c468b57cebab4795bd843b5c4213c05fd30b202fbcad700843", - "f95c9571d375987b915ee5228b51a9c86c8ffda6df494285f0e11ec485de8eca", - "50f8bcb790c6737fbf8c78c2523c9e513a3dab14d44a929126a2f3b41552e734", - "67042a401be278e2fa66327d63c2ff577589d87ef9ee81258de2733ac86b424b", - "7ea80a9bb6086244d79d8d8e33999bac556c13a46673a65ec18fac494d5f96e8", - "31a2a7e5cb5504d4a63b849d98043ffe3fd8d89f61046a30f014fafe3abd56c7", - "216a9f5de2d9a99556215e9839312a8db5a069295ab124f66bf4e76212c09b89", - "ba21461d9f142b86a0867090bf621d890c161c4a48ef42d42e5f93967ae0b03e", - "b6b2443af2e362b8b7819edadab247f17c75465f222f36870f094a8eb18f9a91", - "9f58431b08f464cc670e942a7bfc22e86a99e26dfd6482645f9c07a82f2cd938", - "1b59517acbbbfc114e05ec900e2a84b48da481c58126a3c8566479ab0762ef63", - "d4f88a874a324160077cfe198015b07b33ceb442c516c75669c006e9e6aa55c5", - "87a4693ae201c676080d56eb4cf57b59fb83dad3b3cae7eaccf750c9022cd73d", - "cf1a8f004300d8e0a69d9cc9f2e015251829ec7dc6e76047884baa9373da28b3", - "63dfd3ac16c88c6218137b1cac927fc9d8048a993d03870aafe327eb266ed848", - "d542d6abf79edc7bc089158ed80992ccafcc6120aeb0c60ad0ea48ca1e628615", - "79daf482b6ba2ae37da59d5cf5013f4fb8890947a5a322985b93ce68e50726f3", - "6f35b1e7dda9d3b03c0b396451c9662df4db9b85af506891c146e817678f6d04", - "84c944b3c4b36c6e2cacef9a4ba1050f9a16f145ca2a4296029fadc607528a3c", - "10abefd968d52998e99ed114c6dfecaae046201d8a63026cd881ea164a46fba8", - "98b49dc1a416cdaef05615ae30f19ddbf0c71fd803c650fb04668d2585cb8436", - "e8328919390e3880b61432dd480d7ccd50dfd838cab4d9d8cc38b1fd835b1833", - "2391061069996294fdb1d30518dda93e8da3d4ad2f4ce2c48a1ffed100982cdb", - "cb072a8dbc27fc248893bacdcdd989a562cc8cbb63caa2aded2c03b6496d56c5", - "bdc81132444362d355817d4ce483e67560cfd24e17ee124e62e29c11fa67fa45", - "5ead98726aebad67120f9a437315cd7b87e376c88dd9e2ac05abcf6c16b84857", - "25a7e120fd27dc70ae75ad4ce07d2e60efcd4f9321fac333edd7110b1c139514", - "175bda8a09e36340d3e3fbe0c3175b49ed0bf4de1a5be9f1270890e8ff4ca438", - "0bedaac9b42bda24c52b927ff116b97fbc0813da41b0b4cb29b686d08dbdf838", - "f181723b86d8caee80b94d186c6c9e17f191df5fdd43a47938a838765fec445c", - "ce0e074c9b8b7a563ce7fba931d40b05edd861c08a9040f352d329292b7e2382", - "8b0bdc91d8ca5c35aaed9f1b6ffa93c4e9a33103f3f5f23743852b012a35298a", - "9aba1368876f08393e45324550591fc2159d885226c126d26e991ca829161d70", - "da1b907f99e6255dee2f45c8cb5d597389af45c512935096870ca1c0302266d2", - "b15c74a98f4c31ea29068173aacb110f4008ed4f0ab1272a2ab1f3db26f617a6", - "b49036aeddb73638f280c647528140c88ae1bb582a06f865f9e14d1ff992a96c", - "300d971b140b2dbe56b0c3acc0a1d2758f8738a0db67d9f785f2ea02f9681b54", - "38b5735bb49c1694608488addbb88e2b2b1a7ef8dbc7201050de04cf4470e4eb", - "bbd0b0c9e8ec9beb1d15627f01f73e650968eb897c7d369ba37840146d7e63fa", - "b29b997dbf65982cc7e8b2be704b12fa8631a4f6b8fa0f2bf4ec2ba29823c9b1", - "f35b3db6f38e0e9ea1ca665887f72b7a7ab15fd4defd1c0d2ee706517ff9f15a", - "46c60f3cbb9573af0f9ff5345e123ccb8b1dfecfe9e12dbdee0fae9e1aa62375", - "60f765f82b9c871215469c47a57e6022266737700014d876b73a23be7bb1dedb", - "bcec2e20919b7d8ba66a0d5d44c6e441f3eec8abc9bc00ccaf78369cfff9e37a", - "301084f50b8c5e78ff831319d0ebd1c15858d256ef02dc0897f9e20a049b0e57", - "717356f70fbcd2a38d62b17028fda8ae3f14868ec0bb53138c73e96cf4a122d2", - "e9f788131c2cd5a25985d446d42535da82603dfaa282ea848902fa220b9ff644", - "6ef8f79b119e250ee26ba233fa0d07bfd94ff05fb4e1c4094421277238bd3754", - "113e4cf8578606db0f84ca5bb9925d0e58f4166b0b470146bf78833481c85e1e", - "8bda0c1ff55d851521a618497cdc0653e04140f19ae0fa732f06119697c2fd41", - "6eb198c465bdcd41f72f6764f86456aa27f597a45efbf3ae6bc955e223eac5ab", - "4c2e64916f604d8e2ea61f9759ee4863e72e365d36970aed2d5499562b5c056d", - "6fd82f033c0993971083cfc6213f1a1e25578503ad5e3855287d130d3e570716", - "cbde0ed091ae37bdfb0a50692ea0c519b54967cb60ad3f749706aa945d3f2154", - "48c60dbb0cfb6846724dc7946df305d4e14266b3adf6ada00fe8eaf694741e5d", - "0645790a66e8a85b097387234778555ee61249579ddc34b5e875356c1a231f78", - "6fb65d4b20c958ee20a4a74ce47781e9a654523b66bcb31c478f15cefd7bb338", - "e8658612ae801a6519b9f2de1769558fd8b1319e3c9aceee949649141145b948", - "bb8c347adf12a5f0289aa92ea19031b62ba3d4f706059be10ff658688531e4ac", - "bda7620e6f91007567ae564cae154928e09324751fdb4cfe27a9c55715499695", - "93a4cb2e47bc0de4bde99cc7fb3f96b08b0c4daf59026671b22117e5a81ad1ea", - "c2529dc14c78f8ec87413db80da219f661c8c2412c750fb6fcdfdd584db78181", - "9c335aea51db5916cd6c43036bd6c7965e72f86f5f5c23260fbc1c4528e4551c", - "5bfb56a8b23dca039eed79f3a5502625399a78e02677575c3ace6716b457196f", - "03e72ad998e8ce61d2f6bcf6de56e453c72c83b62c4057a9ec00937c011a6d1c", - "e1d7760da4f0a37ac56c57058ada0361894757a885a05d1a481dda136343e6e6", - "dae01a570c8ffbbe26ec84546d0eb9de383584197291008e157a677e04f0e1fc", - "7c2a0ea29e6288eaab778d8ea7cf617931a9f58fc23a03d8e93b201e2338926d", - "45f98990aa159050399e16c86e449cb12d30a3e2167d49dbd4425b0e27d89f5d", - "423005c53dfd57810d246eeafe0b6aeca5c5e2552eeb4fbcd2555609dd348b5d", - "f1b8352d755b8e53b5337d6723755042cad95c1a9c20e57605525669c0e1d13d", - "211020c543b8987f1c46f01132b7d1f30d389150504e624deee87569234927e7", - "b809a927461b4a10e8bafd67641e44d2372d71664814f912b697d60b2f9c0875", - "c72823044a416099aeae84551af11652b851a8cb7f13dbbbfe96994d8449eeda", - "595b3b73823a0b0ed77f43a7aa017873743a25eb6cf547f145c32a0c477f6a45", - "1817d89efb0b4dea190c905929010f68cbd50515fc180df9a51a4278dd399c29", - "56deaf9ec55ebe73e8e126450b5dc0e33ef38004d28f9dd5d2d0563de3f72951", - "2ec6136d12fef427d1daf91b02fcec948c7332f495d5be93b2f44641c9f21214", - "59aac3ab579f077e8ef2e7f7948246b251e348f598463e63bec02e17a7df794f", - "ccc23b31b97c793a9d6a02685bce35962f0142cd65311454da8ec53dd94fae82", - "2e3f0edbd174f1fe3416344fa652ea4e034ab63b957de138d372a510a75f8882", - "0a293a09ab256725eff2194337f30731f2f3417b829f8a43f6523d22c0b70261", - "200e06308c906ea60542c12d572e9fcdc3220b4dcbcc80f040ac45462fd62a7b", - "65870f530c226320b29d3c4f6c8a92b21468b1466d62f247311ed333cbbb22af", - "d00dafefb5120efe05ed7e027a665fb6544d919041d1c815fa5ffbd0b37680a4", - "efb40cc8064f4f8faa1e928f00914787b9e0f7fe493c0857e0a9588b7ab27e27", - "b77f71b22bebe43506dcd88860e1a1b3cdc7326df12a32397456cc7be3c8df00", - "721aa0c2cbee5c4d7068bb6ec1bc7dc9f2567fe20a40a7559a6b6ca95df21525", - "c6e66d56e75994f9c49c565f5a37038d0eece4e320468c5462ea5542e301f681", - "2897882583960bd390be1bc2e2c567def542c91108616c2e866154167af33461", - "560b3c5d2ee3cd103634c1cbaba80386842bd85772f08d08f8fc2435500aa85e", - "cbd654a7c16ac6f88936d75feb910080e1cce6ae8b43b4eda5b87a3f4518a5f9", - "707b086be4b137326950317734b6e676bb9bbd07cafda7fe24248b2b40d17669", - "13cfd40c814c020f7fcc1a9e93e4f5bcc0fa1da3c7e5530fae46a7b24c216cf4", - "dd782be0e0b23b70840928d13de11d48d67b62b2b28ea2eb232d1fb9c8e9daee", - "97f0b7ffca39bf0a67e9387ecc599bcfd92557cf81abb2a4d95341fa14e8a672", - "f07aea6775b73acd52191b62eee9accafcd1d07982ad7c63acc4ac4907caa6ab", - "7737bf915c9da09f3ae0ab4300e964f9b727893305dff144332483d700ce7225", - "0530ccc416c679f4ac84c8b83f94f77f3d462aa97b91b9ecf709dee69a5f7086", - "aecd6947bc578b0c7eac9748c2891e8c6f285175720310ec19cf33ae6db2c473", - "703cc5ab19340df258d58ed30eb0452b8722ec85974d65f5242f2c7a2161c751", - "0f1e2a420ae1a71d1a01de479ee0b26736320f143798ab4869aff9c197a42d11", - "1a7be658f20219c64dc819616cc62f8ade9b35aa62b7c7009910a637e19d75e9", - "0159105992e448acd98dd893b0f24ec989add69c86acd4b701de7d0722953c39", - "063f0ad316a1f0a16e154174b24fef31064520e293907f1cc682cf9d20071d30", - "96fcb7acde10ecd83b8002b39769a33f285ffb8f4effd3bdc248798ea6a112f3", - "e90fa7ac9f50bb9d5a83771d9105427431cadd0f8d4713157fade62c11e51b01", - "2f738391a2068c1bf43a4cec3ff06b6be5acdc5b3a72d1a373a987ae97d749ca", - "9276f5a8401ae1acf37bf810047be02e403dabcb93fce56d9a7b7933137a5cff", - "c539607679f94ec8d845e678ab9c1cb9aba411923f1e2d2f74797940426190c4", - "df9db397f1c5f4bdfe4b5485b5a7e01df38b8412601b60cb958af543ff9e4e29", - "be89dec1f6af5428c9a4a3c8abaff17d9033da31be8b17aac7ddaea3af04ea45", - "22b04e579a17b979e7eca3f65abd0f17cc130e868fadf1aeb84528f35312e64a", - "04919c3c48d58b7531a46db9dec7c6d862dd3e91671efb77dd0169d7b9826bad", - "e4c6b4bec46edd64f971a7b373cf744315264519d9bba7960558b9c247e04a78", - "dfdf9d07dbead30e30b9ca49b7bb3392dc5970a6b543939ec4f450c8cd797e5f", - "b9e9dd81b07ed6123cce29090e3bae20eb7e43d455b0fd5d4987e4cca83fca0e", - "80d25cbb6c91697d4284982afec3ed0de55b3689c3e01ea8dc22864c9ecfe686", - "d90d399e04aa37af745bf83725ff4a98a9adb51fae164beb8348374a76e3c13b", - "695b639be13d948f8f330fdb18d11d4efa84ae39b71fb20ab85dd789c3682044", - "1c385fd0b7333c569180ee27fd401151750b15d8a8fcb45f2fb011f3206a31c1", - "df47f05280ca96f0a9b9a48ff48eb6d303b78d9b4c5b285f8e39cb203be8fb1d", - "ef2849ec72c65972a6a5187e023917f562021b68fbadf824067f9294832b43bf", - "11dea243f2675b6f0e84d8b921f9cde5a1b86728bb875c23d76f10e239ef8c5f", - "d308f9bcef578ba0a8828d80c37c0accec238492961dd74149dd3a5708df96bc", - "30e63ade33ba4b88622f2debede338ee22372b59f21a1b2ad7759f912f300b4e", - "187fb502859107dfce3b464cd2c43cf45c619aa3edc503f464300ca55c63b10d", - "1851a0a284acb49efb657eb3fb79133546e0dc1d16dfb9f332378559a0bf7986", - "269fe014bbf98d935bdf227a4294b20b4457e5eecd16036f25ac9b4772f24374", - "aa6d44b42aaffae66da17c7976c6c2671ddf7fac16feae61e727a616896c120f", - "9ffa22b9d6331aa6ff94a637c3244b9992ddf0834748401bee2add4b3830042b", - "6b8ae9bb84861b1d204497cd75dd5d59ff18869352885400348170f0b8fdbb3c", - "e4f11426d57f8e49b652345d76dba034e4e4b6e9336dae844b050f01a5131181", - "605065b18fea353472cb43fc82d9568d789557ab5328d5b123792874a0c0dc40", - "0f78b20fd917d4878a85943f9ef56b435a7a4227b3aa5366071ff3934503b11c", - "3fac04614b1ce50524d5e9e33ee0e68324b3c51c8fb8ee8b49a5c2fe16e1628b", - "2acb60b2ed9226d57a3201f7da551cacceb53df8b9557a47f65a060b90cf4640", - "e496ea961bb7a0bfe5c644372bef8fd7ba3a03feb1bc30e00dec8c91e66485bc", - "911813399c349e13841433d7fe80cf980a46c3520a219324444729c37f7805f8", - "7a71118c1940577e099b846727134237c9568ed0178cc197bf99c8216dd5479d", - "d2fba7e7e4dcbf8e339de2fe88873a331c581c785fb9f522dc6615a0b4213d7e", - "65ab2e1f2f56e420f5aa72dfd10a10287c6f316fb7821d955c20874ee42890a8", - "280dc96759af253efc22e2e4f208163416604cb2a9cccddb04c1aae20c8c0387", - "c435df73868e1672f56db1ef443c0653e54b956048285bd93f63ddea5a6d9ecd", - "b2adb90c37b9266c10505aaa07a49d2da8e33fc60ce531c13978bdcb8e300c63", - "cf18b4aad52d39bf448580cfca5fa84a4b9259f11152d1c1f9a816fed8d06f1f", - "c3d16c450b82b5d904f6ddc54222bf849f33f95a002165fd42247eaab10812bc", - "580fa01a22eb27ef1f74c069874a22dbb31b4110293092f455ed9f4727b3b4bd", - "12a7f90469ff86a24493040ac7d50ab38b5afc1c5cd4df59146d95299700eec8", - "ad596d869fc678c2ed6e792dd2ef5cfcc1291d43367688f0cf88d93269dc007c", - "81cc9674a433309da64f089496040a84aa689e688050f099df7b30360957cc98", - "411f002ea5dcef8e24b96d8ccab8076aecee2ac9f43d861c9a3f595cd0aa2aca", - "e15266af0fb91162fd788d912de3f65c346032e405cf489ce358830a42b16f4c", - "ec96a7b5ec80ed1673cc77b2dc74e2980c99378813852eba14442763db1a8979", - "39fefcd3cdf6621eb095d24d82b39898fcc104d8932e0fb65b266bee4e01bc0b", - "a219d2bf2c872c7d728d8a6b2f32c53c1c8f61912003ddef1772ec68205ac9a3", - "b49a0b7afa2b3a047966e81b363609bd3f764591340621e1b01ad83f91baee34", - "ebd3e7dd744b7289d0f78f99c6dd181d826a1a28e984f1e74f48b975524013d5", - "dcc457523b3e49af44878dd3816dbe4838ff404b6e9cc76b8dc17e0f598b8cc3", - "3a3a31e47315ae735a4d46521ae21a2ebca9240eac8531b371cbba9a4346be31", - "08bf97973bfe82e9d299bc1b1a7dcb8ba64eec5561c315e26c93a72d43382a92", - "e81be1dcce3ae77055e971390f6afabb39d35b9e897f58bc9ed6c15b8e8d9cc1", - "03926237e1e6389c2514068d4e61eb6dea1db2e00cb2fb7add18e9a5111991a2", - "e300f43235f0153b08578b4ca4268887c7f7c88dba52951f70b3b4e02f014b3b", - "a090bb3ea96cec9d978934e0710e3641f70f2aa30df60d4e331450e4f5cd8d2d", - "3e824c64c41663753df823d1ee25e0abe6c4218093a6f6fe56eba19734af3e69", - "22ee69a72e068251982c9744f26cd06776dc158b2eb19980b04d65f68ef1ea5e", - "c9702de9935ce15d06cbc629f220153deb97678cb263eacb4c057222053a1aff", - "7c70239bfe92c81df50d8876cf5f5e04c04c5067e423aa13f434727732cafa75", - "729dcc43a9c3cd055c260240e8954e133e7425431e9f9196dcf08423ccadbc54", - "46c12e0f14490ad450143b380d2c061808bf0c2ad55940e117a86fc13cfa518a", - "2a3a867d3a817a84ea46ac3c523da3effc6ad07cc225b34b5d159b8819c66840", - "4032ef31833ed0bb075da0793a656d1c2c46150325450f99e43e335aa615e9d5", - "ae15824a08813acd6f95abc97e5152be1a74f5d2c70fcb6fa12792a987d8148b", - "6ac4ca13bd9542b6e215fc9bb15c28e9528a21652205c2c89f10dd337d5c3cb3", - "17473cbf20fd4aff0436856251343b7ea497a71887b2c1bc48e5cb0a2ae5e35c", - "27f9fd151c1bba87e5de95e78801241e8ef9d09f46999eddf5ec8a507192a44c", - "95895274d2a4201987bc783f3fef7bf6e5b3e97f0dbfe70a2f3b4099d6427cd5", - "d925296d57575e10712a18aa87328d3592bfccfc5bd1e4f49a9f6088b27a268e", - "2866ca09b94837f6a1f1974dca1f7ca5482f2dbf9f7d4ecb8b07c94120c049b7", - "ae00fd96cc22343ffcaeab2e9954f699be8f939a82e29185f88c9f4ae67147ec", - "afa1d0db31cabcf00e0ceef3b55c2a8ab761e9802fd0a7ae776dbf427976beb7", - "0d92bef72a916fe516911c95beba03295e6b6a44223356c8e2ae136039dc98ba", - "ee94fb9e587fc6aca86406514c9b05c194ccebe129852dc65335091a541a7e03", - "0e53cef54fe70c01a7cde59b3312e9f89b5ec4b4629852de108ac5572b95f99f", - "faa16b5cc70b36ecac5f3fae79b2542a3f2568b778c312284fa3947ce00a2257", - "21e321ed0ce4d42b09cdf2cca2d3ea3ac085f1f8c50fd9029f8659515a1ef765", - "5874e0f72e7afa0c1695227bb45d1a773fac23070d65867a626786ac6b5f0638", - "5e735538a104b989454269be9493de289b83b1f068b50f6c4d62ca16c1f2d92f", - "a3b036ff20a4e659526ececc46afb3852603b0b4998a2f6ba7ab0832c6bf89a0", - "461c862eeb0db016a9f1097606aa5a07817a7ee9f42d2bb99a672b25a9714bda", - "4655f9d4a12524dd45c33516d89c6a512ccb4226825bb50c33c0b2625cdecf0d", - "d64efe310aa41e6cac59a5e2f7fc4506696bf4a30916f56dccf10fdac402d37f", - "f39f75e49ff3ff0cd2edcac5d5762428d125d20ec7543dfed6ee201eae575f52", - "07da210283a3d771a4d5f237fa8fb05817c809b7099d7e4681841a3d02d1a016", - "03a12e78b74ef0fcfe9219dea47ce35b51b69bffec8e188e0ed88093943d8319", - "0656862909649ff13050a2960f40fe0aa9862fd7b1342060d422a335f894dfc0", - "b6e079a8f62964589ff744ca4211529ebe87bd26a7a44823872c66dd78c1217b", - "3ac75d2bad7458c0af81bdf765d6be389bfcf97f1c8ba3d52b6f838a7d4ad6c8", - "5a64f1d77e975dad638f7b62744cee355e69fd15bf51a50c20df6512f8ad23e5", - "0d664400026a11d843ad1162a88e06ef64522ebf7b7d8fc7f38e70815b5e3251", - "738d85e56925eee2fd65dfba1bd8ca58b9d0ca8f85afd2f330027d0295bdb334", - "ac732deb6e0396ee8778b634bd5a3e2e1fcd7c9659b2a8dad66c906d85fe6970", - "3da08aafa1c6bc93823e53888d0e711500ff609fc5523f7d1165f91a46dcfdbd", - "d8b9e4a6cc3b45e58dceb9861011be3106f579bb2d4fb0b30b22b24f3d6d88a8", - "f24989b639972f47ebf67e50ff251412960b32b7a052af75a4c2963e40bb10a3", - "e49394dd82ba3978d441d4c9b1a04418d521d0266610e98c37457f317d95d12a", - "7e0d0aa2abda4f740a97c42641ee95b45c704d8f296a3a6e79fa1d496816d361", - "8fed0ee02534cd2859a823480633dee69331c1c87ab497a1ff3d31ec5086291a", - "0f278f3c1f45227967a7e0b49aa566c31859154965cc8907b488d8e1b49b5a5b", - "102ef598e20f5b5e5ff656266476213239213da6d2cc5adad3e209e2105347df", - "4a5d9e207bfc41ea670f14327d64750d13ea5c763fc2179c4f98ec07215884e7", - "5999aa052378d31808a9ef16704c17d4186505fe47371ebf0fd861e3a2009876", - "3408a8227ab9ad9c5834aeb370a013733671e9714413e369bdba259ee8531535", - "fdb29dac5270beea5e41684d984cfec6386e0afe771accb8b0c7e0d24b62f584", - "a2e4b05ead97d8f16578ea58c4966e45a11d0431d004f6b0b3f10d0c1ffc8352", - "b740f70d420bcd096fa397f7a43afb3757d28b25f04c0237ac7b288035b7404e", - "3ee70c4ac96484a40ec0fb63a5d19ecb5bddd5b4c46042d1f21b6f076b3a5045", - "8ff41be42a0cdf442b244ccd39dbab1f3ed5cabc210360e0b7f759fc553e2905", - "808aac4942b9324e7e91b31285709c02a8deefc3351fd0f3385dcf4c1dc3a8c2", - "a03c7279ad124f5bb64e4edcbf7d0d0475730ce87aea08052563125148d7b394", - "07ef9d46c34b214ae97c9f8cc9a8cd0b1c2bd48585c8a39678e593e4b2158ae9", - "7e3bfdba6685d8c8bf10088d846960614acce367151f62c2318490dd18fca73e", - "b7a86ac3470b0f0fa0661e37726a9305e306b329a848e81f051888845721c6bf", - "7255cc2ff9778be9eab88743e7d0676ab106c73e0c76e00989d671734dc17b6b", - "02f7c71a29902c1c6ef34b90094d14da7f697725bfa34c745bc0930ee0f4cbc4", - "c349d3001ae1729d2e36289e01eb10a348668d15ef9b09a605fddfb1abe6c095", - "82b10d87e678904bee723d227ed49b13dd795f2a440fda4f3d0750af2471ec3e", - "d0639e6b3a8b93318456f6747d7050038df755cb9d5a475a86af8f32637addcc", - "bd8e4fef4714f7429aa4768a6c07e931f0d9281fd178520a2a4a2adbca7748e0", - "3387c43d0b1dbe490745eaad0c7fbe4b7a6a1be19d200e586d280c0e0d8252ff", - "ce4b75c20fbecca530154c6d5f5beb8f26d8ac01c38174acbe68e7377aca4c90", - "7254cc97ffb676afbc46b246cb013efd208b52518172675012b581c5e6aa38bc", - "63e484ad239725896a52bf35ea89e7550f8026b535a82c2f514cd461693aa556", - "8b2bb99a435d757032be1cb89f9956f75ae0e1d8ab139330b5b47b3eace4d21c", - "55a946a9cf96a1f6ca867fdb6e21254692be43cf7ebc5b2e02aa65f1fac30c7d", - "ddf0ee42164e3c519bbfc73940283ada5bd26f7663f0821e86f01015d8168074", - "d791af0095ac26fe66859654c9459a6c2f7486c990f2e836cb7bc483bab063b5", - "48be33f87e85490b64498d0b8fa0267fdc5a4108611a102a2d8f4e66ae7184c1", - "4c7d00c18c3edc7e81671313552d229e760fd4510065a0e309b356acb7155bd6", - "0b121765fe820a9860df2cd0b9f5d6d32214bf162655845ec6afc1ea79ea18ff", - "a3e134271671d587686964513ce66a845dcf2025130dff05c40553c14dc673c9", - "f5cecbce741cddc5618602f70b6bfa2170f51fa71bd09aff3fa23e3b8e5c203f", - "f044da5ed98a36e78ccc945c489da3e1734da18fbebbf33a5ca7019eeecb639c", - "8d41c0a253ef206e7dfd708982614a98b954bcdcbeea4f84ce66660d1ba3465e", - "f2ebf369b507854acc3cf8c187e42bb2874a19b4e362e815231cef5e0ef2451d", - "6164d6da9729103c311ba7ff0eb8ec70439a9e891c8dfadbce7248235f5c8620", - "f2f1191af9e15ae098a8cd06436faa540afcfddd8482f6fd75ec9bd0adf7902f", - "69a3d0f2ad4fa03988c24d3c2d88174b51b5012f6e54ed2325d99d7941c966c2", - "2c1b8a7ce1dc34fe808ad728efbcb2636316e666371131530602d60ff11ae0d2", - "ffe3e75eb6cfa2b3e6b1654ba0e089b17c42c11e35fc91f131777b7cc8ee7c0c", - "7003f65e1a28b04a66fba0881f93e5933837a3fea222fbb09f4d2d3ee1f4d565", - "32f5116e20dc4a2a4f188e267dc995591aee28b116b45f9780dc61943d15b446", - "87d0a1cf46cff6b74106c8497e84d8a7c4fda5d29d548b60574453449b1ced6e", - "5d8b42ab5655bfbc4e2d5e1e0cd05576e1e3db2d80781dac6635b61510bbc0bc", - "35ee7bcab403280b95c67481bdffb41fdd1e26fe0e65e38dedf595ccea533b76", - "42711e54eceead3d3335a9e2dba15ab476c9fefad384c775d97213e08e6aefc9", - "6420c782576497fca8627b9cc9c1290646b1a53747278cc5a30c48f5ba430aec", - "034b95a978c6ca3785517bea3cf078b26400e95cf769fbca186d7d6d601d936d", - "65b4819971daee0e54f3f433142410460a99bae3a15a9a8b2794443c4a7aff67", - "a103ef775003f96f344c56e9943d7d40ed5a3cc437e4f1a0ac9a62a348fe25f5", - "986c0e9b7a85eb530a7808fd9ad2e87cd46b78b3d4a74a35678c9c45976697ad", - "70aa43761fd35670bd2eb070f589eef782adebd85d17104aa661d05703778a70", - "3b8289cc424ab74769d82133e7ce8a639b6888c765a2d8a0aa6bb22b81f4aaf3", - "040dd5159b8458d86623e2b354a16d085381c999550a0202a61b08bfaa0e8002", - "120c025e42d030ed2431cc02bea3b3dae034199a5858f921a2461aba3579d3f5", - "1d0e6e0b4b4606ba67a99ef00dda40f4a1809c224289e4852f55a9239784dcd0", - "4c6c8105f81bb8affb662f01938115f417895e6e88d81e23861e0c4b842af903", - "8d14017c82f241cd3835e5b328c1449d924645ba79abb1d07037323fb73b9953", - "474dfcafcab66fc9b4f61caedfafa56f39538db78053107a37b40096fb7887cb", - "762ca5ea20d5050731380a5eb0a3e7fd2992ad0e723765867dc1ed77246595df", - "03eb097129c36e9f61cefccb89220d95164e130b3ca0b991c96edbcfc7e40658", - "052b56b8fa5e4b0b609c172698a122a37c2e5702ea2d9ce024d7efae5cc42a88", - "d447bd32fe2b993ac60c34ef803cb1f836bd39c2d77df91df3029c73c2d0b66e", - "511d3b9e16c6d97360bdc3bd7d0470066cfce3868827dc3bd862db8a69fd9bbd", - "39f9103e33c9e5f5a05bf8261a78a25eee8750d8cf87cc26571ec19915274042", - "d2ae146e87745f522eba883eb2d10a92a05ffefb2d81ef7af2d9f0f6d26721e3", - "372780f85ba4c3602b0d1a1badb89c63531c156f2aa29b79301dd308e95bada2", - "049a2a6d66b37e01b1178154a1ab27a52420e4952117eb63819b81d8a5cce793", - "f836b8d7fb6849f4444d78166d466ba57a26a15b62a885e8f4fd0d765308c631", - "1b1227c0d7f73e76371c4caf0370240bc8cc5af11c137b09db82d19c21ef1ad7", - "52dcb6ab1ef09875564102e6c9e0b7b2c8e20953b5c67a1a62a79ca36d02df68", - "9d9b4306de556f9c0b61d482fb794c0b032b82d1b6cde72278d7837a3400408d", - "2549ad21f836824620e6fd27f91d48d513f910d04213476ee4eb5ee03bc0ea9b", - "4b4adfcd20f3b0d9d12399c3d8f1ee890a10eb78ba7e32c4e6d2b58925be4517", - "d12b0ca624aea7403c521d98503338f5f30bdc9c9bebd5921c33aa7f2c8205ce", - "43a09f1132dc24c48f6e30f9d20155fa3738ad837b299bbb3e361b440ea987f3", - "7ade605ac1eea6a65d3bc555d4c80abd2490279779ac223ee996e0c2f2beb962", - "6fc3525eacfb2ac2b34c38860805f6f874d244ee3b80c766fc77f242d2a36fa1", - "92dccee038b6f85d96b75c4d592392d6a7f5089b955718137f93df7160e18618", - "ba0b2e13a7e76f1fe9c345a68f2e622a12f65aaaa644135dba097b21cd82bf0b", - "2412c166225b5502a8556f78e73eedaf43b3fa3ced2450462572842e5e59ab47", - "90802a2c174dbc6b9788c0b84e388411f8fdc22237b6fe1455cd5974d9777acd", - "3ee949e09379b8c42dadd185df1a0ea6f8efefbc4e4ef0aeacac801f3b437032", - "44cab37fbea5641b1b857abc6ed265437421f0f31dc466f7335206705fd6394a", - "a6373e5402c6fe811551a6022a764e607285709b288c1dcc41a4a7d51fe5329c", - "4e137612e6c1e0623022ffe496e2ba2655995130f816ed01ec4f38b604a4614c", - "94d0559944cb1b5ca2886868e043b0eb9e7a771d897b74dc017482e5ce0f6998", - "716c6652c4b37789c1bfff26bd6331ca2aa5d6fd7c1b6e70a1c0fa0d20a92257", - "bf60c6a304049104b78413a9ce9a5f5dae10a140f454b417ce4dc2bfd3e5b457", - "fec73123b691a0ae5cd66c027f0c7f281f8553c7f5de3e8c5792fd8bb64cd840", - "d5805fc6a91dca7461e4e39e6d69befeae2b5b2448a6f768cbf978008ce9654e", - "d7470cea91d19772aa198a93068f685e648c746cc46d51a6307e00c665d44aaf", - "e526ce9146acef46974ca94b7cc0c224ea559dae9800f86498d6266368017f58", - "30acf5b90883ccade7fd6eed3b1d9c273c9ba89c8c51d9b9c8dbf78720dd769e", - "b030b5761e237f369a24c1d68a1b07ce0b1c96a858cec90bc8f8a33b57ba1820", - "5bc705ed0466b8ec54c29e208cb4360236115e5e43c8a8e95c154128d93958dc", - "303a53a30625ae4006710e507f68ed3d9e584becabeff3382c08d0f699c0ef4f", - "d431a96fb1f8cbb1aa47de47c1b8ecd885133cc5d256d78ab5d7c0a4989a4e26", - "5ffce8162cb8f477dbdfa5913a8b7e09d374f33d644d53039eea045c34d57da0", - "85096b42c8552d69bdc6ffdecc1d60eb7bfa270bc8e773d0de4166037ee2ad64", - "2e0dec4f9ae584ca50a6d801ae00fc22e08dee562631a0f1b1874db625868a99", - "bdcbd363aede8a58f5a9116147d79fcad2ad244703ea4fab97160905d60645df", - "7dba2c6f94e3d2a45b1a63973786e7d7a0625296b118fae55c020a139d527396", - "66fa51bd96b88622def12c1878a0d3bf43bff45620f21b8fce25c141f781694b", - "f1da1ad8a56b71f6e461b0a7723ac050e8876cbf9976bd4aab13669f9297bd99", - "b4d602be92bb7d9488c6c0028926f9d1360a1542be4586c2709260f2696359d4", - "aeb0cc81fc734914a377a6eab3cb91d7c0777289cc67b671a5a2aeb942b1f97c", - "3ed30c1eea3538a9ddcf9497b1ce805d4d75db9bb302976f254c9ae596e275ab", - "c7ea6ae7bf9a93bd1d33dcf14e0de3b74bb986a32c3c9a7e6082804761777116", - "e9bbc617657396d2d9089de667f0d4d1c2af9f71eea9efdeebe977740dfbd1e4", - "f7b3668b62d3833c82a94b5fc93072bc1e7b693f31768bdb0cb6d1af4254a482", - "4f67a2d042c18b0f3110bff14e8096f85981e66b4094b9b9fa2ceb1c9d1c6646", - "c6542fbec2d92e5193299b89d1f890d67a37952b22ecbe21af69fa64a88bf587", - "1c4b152724322d9c95388e7cb6ae758d097ba7d3f956859cb232e2ea6a9ddba4", - "ff3dbd7d6bd1bcae01e31ec817c057f4df6e0f8eeba6a3389f47ee87ca1ed7d7", - "1c2f6e027b669f8c114a2a30d1744056f95c57ad59ee10454c69c21a683fb505", - "c8b04163afb2313300df10e46f8f4e8008b9777edeeb604650b5063d316af706", - "393949b1eb596c3bc1ca1a459c1db8014d3922635f175e333222036eb81bf659", - "a6e0f392a3c1b7fefb75c1dacba47105e8b69eb50e38e8efa5572882480d1d7c", - "7dffa519a9fc42b6e82076500c9b7169664048c09928c21f1bbf3af47839c10c", - "5b6c5f33df707f762df5a6d829c8389569a4038b5a55cd3ba0c12d5ddac45f35", - "6226e8f21cd6d818c1e9d5d8cdd68cd37e282a26e2ccec05c79c5b1da11f6ed4", - "ae55b7d41569ddc75c3d7db1ea24e70d4d8d2998ba8ebf75f00f2aef26273156", - "c17732765c13d4b50fb9db65ce42f144043ffaa607d7344494656f78bbc7682f", - "aa85ba344e1ecfb29c7f173065173a84acb0dae413f80ed99822e51e1cac15da", - "86140707c906e8c5b46c1f81118f1158833b2c87c7466c0e5a3847ad1eb47f34", - "9253e962e3bbe544dd7ace0879c4aa0787a151a38d7778574e989dee966e55e0", - "6e8cab7443e01d1848e279ba53a6c9f802d01595b2a73e70b5636715264985ac", - "b72a30da5b79640a099bd02108e00a3cf9877b84ee52f97b5e46c68926e97533", - "1699da1bf0141574c8fd6b53b960fb7df8ee18c9637dafdb3f573d4bd8af5aed", - "0704ab882b65349e717bfb6eb41fc86c15ea8e4ba19d334727690bc98c4b09cd", - "35ead1d0f6f516d9dce9233077cbb7ec7b798ce8dd264e8e30b22d6474e0499f", - "1f2c550d29076e2c568464a8f23ab523a43e9e5924fe6e3ba4f0004d3b2bcd59", - "bd60bc1207002b51092920fc077ed62c816745cf34514416a7cfa3584d738905", - "f344a1753fe4f4133dec902b5df1ecc04b045e7491989c6dd7e88f543261ccc6", - "3094ae51141dff6066113510a61d7431b220b089ecf66cd54403b1688c8cab09", - "38bd6074e07b4f13ab29856c30ee042d4a8923560e7599cb76e90215c971ffd1", - "e528f607765915109621af5c5f29b2d8de473a4384800eba28b812c22cd4f2f3", - "d6f89c5c25302fc097736aca276c4a8473330fa428f7153e349ec4f480d7285e", - "e1074a2f06de110f79e8682b04fdda9bfb5b118e8666b01f74250cdb84d1ba7f", - "f0004f377b032f3e81606c35a5c8dc8546e2d01392c664d3847488c297a7f8b9", - "8e74760fac97e79b27460b92b1587986989470241ded00bda7f91cf963fe987d", - "2f9b6c6356573b9d86597f93a74d85665c9452c133f7ecbb18507e6796a3e68a", - "9336d170bff7055a5c072bdcd71f7dc04182e5fd1da1918c51be5d29aa008935", - "ad6ada18f551f9276a5259738626817803579cba4fbbdeecaeebfb85c9004468", - "1f3f88d8c2b50b146280d160bd005f0eb3824fd61253088ce963f02e82ccde62", - "32ac288ba7b5c75f724244095433aec856bcd30f432f4f05a6837c09972bc4d6", - "fd997abfa3ceb8172a33019a387f682b029fdcaee77348a4be70577eca8c5b3e", - "071486c14efae3a26beca2645a61aac7759f46990400c11ebd6cdda1c416ec62", - "ae9a292617edf2231871c4ed96797c4010ab713d7f81e44c357421a465335dd8", - "45e47ec4e3b522135bae675c144642d1ae89d97a5d22a8e2c536892cc07944a2", - "744d7f9770a7a7137961a3f903ea937ddc1614f66f57c642be9b3546af294b69", - "a3af8cbea590369c8d39b6ce1e7d2745bb13cf106b5e9fb1f013f29e615c1ab9", - "d2f24ce243b06ce58b6ba08f0015cefeae950c67911d71680ea365a503b340b2", - "9f701ed9faa114610750628d7ce5670e6025e4514d5750081ed0b5f3cc014e48", - "3077cdffbe5f6aaf532b2775d3d98687cedf5dc3f779427e25da7462819604e4", - "b7440514e16bd7d47fa953662d9dd37fe0b19b09147545e757a07572e4736866", - "9af897ee6fe1b5831524fe50cc48ba22b4d715062b047e1a02dcc63f309a0653", - "5036ff45433d4623c2d7b9ae7fd66c0d41e9c62ac8cf3d817c777454c24641b6", - "910de7e1a9bb691104f467b0934573e86bdca571eb58d1c97dccc8a0035a6a1a", - "44ae75eeaccb6dc490afb2175cd4ae9e80f3a4d4e2e1a9ac5207a0d8cdec87b2", - "8fc89b6553beb16f11403b0870aa0ab49c9a728a9f8562e557bf168b5c13fccf", - "5bc863a8071dbf191ec8df32a25eb9608c75ec4519e55487811a3f58b16eca49", - "e260017cc317a47255ed18844d529ec35b4997d34b497dccca0114cf870a3b58", - "269be7e6f9ae4c73fd32c50e6bb534992a8774580cb4a1856d7d7e578db34049", - "11ee5601139c74125576b5067c6b9aef9309e0746c0af14a760eced1c1b162db", - "27cf4bcdfc821ffdb89dfc536367bea3b3f9f06e259dce63ff87c14642bd2cd8", - "3f8481d4abbe7e9c6ee1fd46b7f8200906651e00382baaa0e9647138c7f8ddb3", - "767e81983ba84e136a26da0b4e82660b2b459cca06bb970a9f6f53170418af14", - "4fe5bd9e4fe6cb0f0782678d280fab87e44df2fa00f608982acedfd5ca09db7b", - "1af909c3a1f750ef80d2a474f14d2468180e3cceddb397d1c4f963c10ae229a3", - "5f819bc5dca7ff1993730c640faf68ed4c0a8c0629da8bba9bd2ffdb709ae9d2", - "634286a74d85086375d6cdbfc0910019caf1ad04c3871dd833f2d0b831ce179d", - "7dadf59a59096c851af8a8a5e18282c183296bb15e6724e636544555ee0e9f3a", - "39afd6a3d778704d325841e67ed4d3dc395e31f10afebe25925fd8e32a956fcb", - "f4033c038d0ea69baf1e76ca53f44475b0faec812230793b4253cb2a1321acde", - "daa6c74f87701fcfced59a833922ae8c237634f767defe25f41fcc6d22d23fe4", - "fdb389e648776c0e7efcb12810863b75879f119c993a06acdfe98c8910a2a012", - "89918968e540030081e5bbddc1645c2344c657483e3b774c0570bd9917f40f14", - "99b8d5b5cf76934d883c60123b4c085534ba38d9b565fc46c20b308b4febe15b", - "25845e7f7b2352c38246a165bc210bb5a09a5ba9afb3ca89dd3d9b5dfa28242b", - "dcd3ebf4ef1f7c820bfe7b1d9f1b156e397363e050c6be330d6246a44ceca443", - "4cce72a91e9c00a80d207ee6f784c3bf5eab7f305182962fcdd7b20e75e0e03e", - "e1deec9e74499cae50be3a3fc4bbf9280e1944233110b02717ea8b701011ca7b", - "3b543990cf566a22977a157bd4953de55901dd67aca92066656b4c2810f7a6e3", - "c5bc351c035b60cbcb5713d7a2759b7cfb9b1ba1d69a4d8b946844278c8541ba", - "72dfda07ceb5bf76b0f755a49cd4e6970ff73a5346b05b3d48082ef4904990db", - "ca081cfb7b6856262dd6a5052928290acc13a2dd81868a60faa2224046ec8c83", - "9b8e0eaa61bec1b201118b118de5a2beb3217d26fb851824a6b62c3349fedb12", - "3ec7498233eae31aba5d59e233257055a3c2f9a946d8c8d08ed9b9baa45e8a10", - "f4c53b584a073fcac82420c0e70cdd0ecade17bf7e1119b62cccf6cefbc8f42c", - "02951d3185bfbb07530d1eddb067c75468faa702b449fe77f7c436e4d5fd72e5", - "4220d9f1de4205ff9b02a6b00bffc7d063590e43c1f798488f6c2947d137e2a3", - "0a0a98ac69716aa820a84e0bd24fddc6d85851f5f189b9b80bfdffc47e29298b", - "b80a8fb2662d3ecfc6cf46160dcc1eba81b0581cc52f59b154bcceda832e1aed", - "f2adb4513cc14e515d7fa4912ace9f161ca39de13526d2960eb386aa29d480c9", - "4d9958ac39a97297e3b72360ea0a511dc2212e3d6392847042951ff7c05566ca", - "08d2062cd18e0ad1d209e8f18b8717a310329ad58623b82bfb93a07a53a14a0a", - "bdf91f3bb84b9e393c1c609ce89312174ac9372f290129cf0242cf578df5a86d", - "4eebcb58f1a92843370c824cfc53211d6a3052dfd0e4eebb8c17dd11c4497cf2", - "8e3193d495a71b5c09bae1e5e33bd5fbf2c0243775207dcc002215e39a765167", - "8aa8b6bb6550fcd22817215ea4d781257559511d25ef25d820b0e9aa5278eff3", - "8fb3ca9e73a669678cb84c7ea7b3919e9ccfc589ce8671f488908670ac68e74f", - "cc1096234e5c064741458e62bbc9f6d4fb38b18209fdecf6e6f79b33df1bb67d", - "cec511113089b55bce6b20a9e7f24fe3bfff18af63f5a2cbfd4494692c7b9dd4", - "da5200082962817944f828de253d4a7e8107136087b9f061a917cc55b6b11e7c", - "58778430e993274b6ff9d2e7453c4c46a6cafd40c1ef195b94b00206487a0fcd", - "42694d70f21ee1855314cf8666d0cda844c1c733046fb942186ef4509e4762ed", - "bec10737f17136095d07d4187be2add859a1ace05abf16e21298f63f9bec7fa0", - "fa3b411fb3ffbe2b63e130ead65f48e586674568d639f42d8f1eba0e5b11eb4e", - "f8abe2f62b9c9f7be8ffdc5a8469b9171e3f0c893e0e04887d1e2661d4f03f05", - "7c6064316b4297729c25614b8aa6af581929a32d5a22acc498e39501ce5cbf04", - "cd2bc850bc1cbf3e9f02acc30a164937efe623fea751e4ef5e13036b19df349e", - "bbd4636582f56282425c8630ab3aa1c069f37226b933d721837750f371ad3d75", - "6fcaf2ae153fec5d7d8c9fc99e0cac1a98a610622d83e84a0d38b41cd8c4562f", - "473c1a30a82c164d63a807454f1889c65db57cbbec064153437bf9a5c493696f", - "6897cf7c67db3058695cbe4725d53836a654df00c2f6fce4c82cbf765374255d", - "272c20e66d304c9b6b0ec39b1bd2aa1e30405040d272f705fb5a85a16ed0f5ea", - "17bd1c343f6347dea761a1529f8ed8e679e77081dbc3991511d36d1645d8d355", - "ff50110fdfee00de827e5ac3004177376f833326a8499347bea0bbc25e11b1bd", - "aafc133e395e7552a4af49b1d0f0e71433cc099dabeb6118af3db13c6a3178c2", - "28b58003e1600530ab758066e2cf7148a88b5cf8d45800427ac309f0ae1ab59e", - "2027b2ccadbd09775c519cb92364974f72ce986e9786bbee96d2bf701f6d15ed", - "cf269a6454d50e72da2e39a3769934b017caad459b05951f55c0547a473c2fb2", - "2c32586141d46401a53f999ce70ddf893c4fc61d70fd75b32bad5acdb7c39ee5", - "c0f717af8ccb72e4c0ae69174ead9a729329f35a632fbab6c9d54eec0d078aea", - "f2a70a9446f2304470ec83f826c91ab0840438db29f3789e2514dd8286d7d699", - "ea19e222fd5e92ea04a50f536afd5915db27a291630ea326fe0d3afbbb373086", - "2b4819bd3e1d15a557a3fb21aae1fcbe8dab08b1c150c0a5e41d40659973595d", - "ef8cc368557771ea86733d954f3df38c982d416a2f34b6bf8847880218c5572f", - "66a474d3d0c0091aa7aeff3a3ca8e22f1967a27124c6367ebcebfc7d556f3e16", - "3cf24ea3f21af1f73787055bc7962b3a777ae0fe2f21187fc673a2c8d378f8b6", - "31ea6517e083fd514262ee8b18d4be421b45a965eb8f10334f84c2ea2d5d99fd", - "54f628566968b5e254af689687c4e322783682726633cbee0764fc314b2e2214", - "ff14ee75c3c23811a805fac5ade090edba69f7a71b7e5ac2ee2b6b524f07ac52", - "1d4ebcf35ab48b6af510fe019963e250cf51d095bce509e4b0bc97fa075724a1", - "120a11dac03c1972a3f4636c7c48e5fd19aeef8cc350c84f2bbe06e03eafbfae", - "ddaff5894e8f88ec6d75700147b77f1014f1ce941b1dd359453d0a26ca161adc", - "bab3c4522022c414d6b6bc03d4f874315a2b38490c805370f9eb519ac382c5af", - "9d2e5e551fefe4fba0ba4ccfd1f42b202fbc9ca14e667637feebb1691fb8ffdc", - "5d4a735443090fccb1c6c9129f2c15f0368056d9b4e63bec2107d3291f27f0cd", - "0eeab8a06a5e94b87985281a2a48a56e3002ce0d45be553b0de1622729b06236", - "dc1338274d940bf3bb1bd418855a06711707d7c8b44c60bd866fa41c3bcff2dd", - "bbce2a126ccfdc944fce1528555ba608a98149959527b5e1d0da6dc2536da39a", - "8dca82d3af02f8ab1640323feff1c1c19b0b2bdd45c56a2b97b004b3570304b6", - "1aab4dd5f46d229299079a5ac7a33c8d1acd6e8eeda353425f51d32bbc3370c1", - "8de463bbb36716baf06366f489bacfe1d386c80bb1fab5e89169caf64d6196d3", - "cd3f0e52552fa5f6d6dde423a5a49cd0df089bee899c62ae6636a6ccd9cc7f61", - "8a55ad0c157fae1648051bccde233276f300eff8f44f05df24fe5ad76c52885c", - "1918c4eaf08201312d1e6b2516f52f1b53982029463162c09f59817564853420", - "05c7377f0f8409006014b163e8a2e507bb02db97cabd915dab37bee37115ecf9", - "5bec6a9404b832f922c2c2249d46e65786fb7e7ffa915abef8da3be38ccdde37", - "b68bcba654ad0a8fc1ddbd1aecc8d9d7045a8814dd342e9494091c5b28bacf83", - "e7252098e256998d79faabec5bf2c93e6a1559423c839fcfa89769757bddf441", - "6d2a84b795b382892256b8b2c8a8d83c02a1c975c45ceebbea943bd7d98ad39d", - "6bed81ba02cd38a6258275bef4fbf7b22912889cfcbb720b6edc73044ce55b45", - "fec5874c4ef681381c246a5cdc239fc2d9b12fbdd36ea1def6c38466ce22c058", - "74892e21d69869a725a1117a04649042588748742012ab55ee7ab5200727e78a", - "aaf1b87a9373da5e40656b5d925f0e27a334e4ae4203e77c88a09c40663c5624", - "7b637c0db2cac372665455092d248bbae69555d18b8c730d54042e8e2b9bdc73", - "985fabc4827de7e6ef55707437f6b9e4167fba4a6fa9d8041d01aa2d18bf7eb2", - "7d72132f8bf0f723fa6f804d49bc681944f93f92809b74fe191ae73602fad5b8", - "ff2520a581edf1dd18f79f708c65fb22f324f0b2e103d1c809fcfc39ed71b391", - "b91a2b30f019b2f905af95c66a768843af02f95a7027757f65b25c46c841a4f7", - "e3a8d825c36c6c19b0280ad74b734fb4dbfc19be62906d7b5575fa28a7623c4f", - "b1edd3fb6bd283aaac13a7307c5bf3ef005a169aa75dde569c6db2853f7ec2da", - "bdf44d0a1593ca8ab495ffd2b83b5cf916d2fd2ba7b821522284a705a8bc2f3c", - "131b0edbde344232145b383542db13f34a0070630b5e27d81d925035f10db048", - "f37993690d8992e8894a4c1c96da223b1ca47e22a4cc8d683794bc6c36a097e0", - "5e923ab3375107b0abfafd1784eef53837f8da272443b2e2cbaab7ebea123e30", - "9e4fcfe571b363efe109bccd2c52cc92c32a4f6d2ee4979a289194270cb16922", - "701602e683db5c4492ce155f54f19a39949a98c09bc9106a1b973d150d86dd1a", - "1a7fdbfd5ea3f897398cf02f84bd269775a3dba0933e8bbbece28df8ab4d7fc5", - "525d014e6735f0bd13e40d4c0081b327eae5588b97ddc7c244890e4d71cc5b77", - "931e8668b532452b560af4113042b1754802a714ecbc61c83241201849eb37ab", - "b454becaa4d6d6608b417722be706996a163f3b98267da93074ea999744384ee", - "8e8f32562732fb294bc1295957921042057b0cb9a8955fdf629bdae0856189ea", - "0d9aa651ec825f2b9a8b0fd3d7bcc9ce2fd55f2a9ccb76885aaa5969adab8402", - "b6473d90cf640dff8333c12f58788e3eb0e20a0f6e923a1beb986c996a8a2dbb", - "e298748df74ca3c15ccbb85ec9a5e42cd708e1d0d48bc6c18f1f2976f41fce6b", - "dd847503be08139b0b5b3118607203f81ae3b6699ab6ef4ea166503f8d77dd43", - "7c0c600d71361e3048550614257fb992cc4c381f43a734da037ea73f620f6e39", - "ccbe95da8c52cbdf22499d9329941f39fa7f2c8490ccfeac4a8c8a69c69d57ae", - "5cf3c914166a145028b4d1014500956ce0a536644fd18176ced849af825be91c", - "706b387282ea578e1df2b2bc5883c16cf7e455b47c92ff9e3a008bee7ec1f46e", - "7c8aa101171a41d40fd7cea68621d9218759c629fd0d91f18aae44bbe5aa5233", - "76d94e7046821fd3c145ecf6cac2915e34313ef5fdd59bf41e81875238a9b427", - "2c9681d1ef88910c620a0eaa706d236c7d27a5eeb83dabdf5b90ed2b4367c632", - "70a88982344c87e2faf4601efb7bd6f4ae659101b382740f3f90c82e452b9332", - "c36e2d860832d9c7277cd65802a62dd030401a4eb362afc08c0edaa9c288cceb", - "55389ce80447498c8e75daace1728bbf0d063b9e218fa70105e25137705e5381", - "532dc009a86dc86847909ff0522d3b8c6be59c493445e466dfe83706c4a1f0a7", - "c1ed1c5100b3867bbc20f44fdb2dabf0d3ef7a4b09d936be6b7536e3cc5a8a50", - "d8f650d124261a8b3f15696a3adb8f5b377e825fff7edcba30c05869274c6aea", - "2e408ce8ebf012aa1fb2e231d39dedb62e29942d33188f9e6f2bb521061ae050", - "8c6c1f5bb1b296e553eb531a3bd84c30e061b096a88744da48b05ccebc558e1d", - "9d45de7321c441c08fec0a5865ab1d8f0bad51a0a3aacc33025d76884267b418", - "c94bee18d1d92e1d5245cc490907470009e0670e8768c82e5c4e5d2cc1ef3463", - "cd717834762286c8de73d4a5b1e5355166ba36e4f2fa1d21d89519cb817c2455", - "30a7422a025204349d1644d43c7c5690201aeafa720761b87e9007a5a2d1b592", - "1d51550d95eee8bd9934818fd0bdb8b81f0555f965fcd5eff0885b5d7c3b2f15", - "a4d4266587283c5156e1e5bd6d8eba8eeca547a52e3893c0db6abd9ce600f45b", - "4a0aec1a5be5ea93d650ec0d7828dce8b8c73fadc596f016c8b8f494b4ef81b4", - "906de0b43e48dd3448f39fb48d0d4ac6148756aa878011f23b7c14b3a374f531", - "4a58352562f36bb3713a1943c121a32e8a4789f52c86e39fdad8df42aad6782d", - "bc70ce1427277d2cd5898556bcdacb37d220d3130ea2e79e35dde128d54d4362", - "529cb6cd0ca196f644a9d8615d97e025467bcd2d572ad975755af079835b3a34", - "6c9a68b3750e67c0a2b1808e0a84c16ebbddfc8f15878e91bf718962d5e5749e", - "6a965e40a33ee52e4432c5f769a90779d8367f16aed82a20bdbd7158802a7623", - "836dca3eed2c21073f2c9ca5aa32669a737b494c1bafbfc30704e87a6b6c7c1e", - "56e3c041c4a439bda07ecb422f6c6e76c96b9570e8f1e88d1b837571d840bf57", - "5d6df71767e1fb33e1b4f2a4e99017a8aee46041f8ceca9f753aa3ecdf91ecbc", - "93cef457f68b84e0785219fc188f735d71315c8065652c68341a35345b6ffd4c", - "264c95e9294e277417a61343afcd977f1f4499840f3e9bee448b8b4c26752977", - "e9622701ca20987f26c2deb86f11e7244a5a133bca6353c9eef7a866108e7612", - "bed0cf467dde2e046eccceb5156cec5ed41b5c3e26da398fdf5907631d3bfbd0", - "192eaa41e9440319b37c1ec4fc4ccb59381e1bf0f22202d82232d3fcc9e513db", - "d323020b5c84b1be745ef330297e07b56b69864c7d1c0fcf2c80e9958771af98", - "8052af59f70b688e3809f5076c8ea0bb0f00256763193c003be08cbba8bfeb4c", - "c804dd39a32f6dbbb11c5aa56b585480106f8b7977ec70879a53238657dee72e", - "1f2a380661ec1a0f3a6707fe107234d2068094391f1f4d5d31143719601c970b", - "51fc8c298fd5426dc02459f52ac6252cf43f46e747a5857cf2a8e46c6c065485", - "3c21817363182a012602f6c8f1e8c57dbd77d930b5cf7e7cb82682aaea571078", - "cfb2baab0131287e1c9d5f955631b0dd8b4ab030925fc8ff81f11c94995d4e95", - "db63566d3ea0f5867cf37f3a04fb17791a9a98ae1ba75098a16ca50e6f5992c4", - "9fb62dfec4e9119be4490913f447f8e1c1acd54a800110fac686957e18f5180d", - "bb7bb163139e58afad6a8408b2c194fb9dead74b30d5f100da0b5bdc252033f6", - "a8e651d229e6a3c073ab5467fef755fc06e25265673e49254cf2564d3dbcf003", - "c129865748335c0498053c4bd6db6ba15e0bf61f7fcf89451129a8d1c186bdc7", - "6cd4cbadcdc1e75f180473a18877992e6d3fd0eedd7a88e1c13d72e2a3894cbe", - "44c15673da71b42a29ad5d145285c47f4fb97d666a06cf8245a17ddd66c75543", - "f23f97c86d3ce953ab35c0815e55f992f36cec8f52883f94deab2b2ed63b2426", - "7c2a560cb71ea2695888e17bde521ca5f2ef24d5d8947056af6fe8fd39dc53ac", - "8503dcdf8f18c31b047f972d1c23d7b449f7c9f3914cdc12bc675ff47531be7c", - "62647e9f8b86477a4cd770385828da16e84f923fbb82df0fdc4716ffa8a1b3e6", - "091e5ac7b957ceb6cdc6afa55fd259f1dc101cb12b31176505f2951409b4c06e", - "0998f65f01db47247ba911ede5ae2d4df5348796e228b2503d87a08c96240129", - "99a5e92b51ba4f34f49e8ba252994c1d8a5377130d641cc51896d404535576f4", - "b3ef357807706dd9d21eebd0e558a2fa8b49793e2d45efdddd9331ff193b3916", - "a632454743c58bd1439377966cb518dd95a666a9e162c2b8f942b8ba288bb319", - "d94a1ab9002b50729abee44b2a48826f6611b9ef22e26e03b566c9a93f93ae4a", - "914cefeb1c19907172628b45063af2d1723f1e402abb523cffdc89aa885e1fbe", - "fb6f3fedc2baaf0bb8cb6233fdd62052a858fb55aa2619a8a33049e6c3d63883", - "7fce5f1c642328b8fa94e3bacb295b9322138156ea6cb33ba197863353e81fe0", - "b2edfbcde7846ca9becf24a7a2895715413244daf7b645434aef8ee968c3bf49", - "46875dea4a808e5d773602d962ea09b464b581c8f2df32de4c4f041218c9841f", - "6d428b63a578a6224aecfc60f827d1b1e6cac6f45ba4825e2ff6cdaece982f6b", - "d375e1b88b09fd146fb2dd271a578590a8353ab93783daf1d6deff2c3eb95bf9", - "5ecdc25a4678e5660b44e8ba2a82ab92cc7f1bff189e71392fbf244d61ab33e0", - "86ea2af877e778f62fe5bf4856b0b11f0fce49d4ae5822b50484bd86e555db2e", - "35121d802e6cc0413a80d082403ee8e01418d06ff1c7fc851414419256e96b9d", - "9293aead103a357142a8aa77220d4a2088bd10f62d0595f2e47ea372af2fad5c", - "75e0da27b8834f55d145a3ad695bc19219345332640fc7835aef1a8de5bd0942", - "e67d8f031204102847c2e74ff44465700c5138efce77880c7cbef9d9f2f1f182", - "e52576ff5c199e7541f1f785d97f7ff5c2395485628b1e6d600ec029a7311f30", - "038745f5395ed3e02e1ce925c6807754a0b741c7ec78d895d9565e5628f00901", - "ef1f973097676428c046bbf2f4f6aaa021100c59d7a9d2c58ea60adcbe05370e", - "6dc00dbfec1885cee2c73913151d60987cb403cbb551b9419605909d52f023f8", - "64818a532b3a4be12c3f5b074f2d7bc0b9ca8fcda1bf3158adac3e5628e9fad2", - "5f8906ffc73b8fe05904ebfee181dc925041bc1f87d1d67a2fc633001262402e", - "6fe002f6d9e68502d8173f959b5178bdfc94a16232d5531a1d0ad9933567e773", - "36640f4d45f0eb93846d4c4f7eb67e3808af46ab668b569b1d918640750136e4", - "f32abcdbbc7ea41369580fbb380f4a401a79ed88c90a7d4c564800502b0ed5dc", - "3fd4ecf26c224fd4afe751d1d76582bb1cb618b5d56c5b5f853c6c8f75ad669e", - "a9b004fa3bed2d67f6d926d403a8f262719244f4e580d7141b0dbcdf424810f3", - "514bb0df2eb07d8dab34d44e50e77d90688577c0e3d55bc9b54ee4f0cb060df1", - "ba704d67e4dc8a19603530b5098a452718d0723910cecec832936e73c032435a", - "37238862c3bf778de7271e8c558bbf9aeffd82b389e00d07146c7198ca60df15", - "8cf30ed9163485b01e74d6b2afcd2ff0d2a65eec77156547db40e497b923902b", - "5294bc45fdf7880a1c8e49851f4d37a77f971c542900f76d0dcb7a1e9dcd0e61", - "98cd079861e5298a780c3ed989b6da80fae81285631aa209c6530ff866f108de", - "03eaab60cad27712c731bf74f6a2a45b9e413c7cf2937b66152afede288998ff", - "b40e0353f77a483694f3770562d0823edbf5b98391f546d54afd24b3c928020c", - "a55697db41277280514e6e44ec7b3e8c652ae3d21a0a017c9fec31ff1b45b0e5", - "3fa4c1f1acd2b572694da3ea297c59867d8cc08e147df090599df7378cbf9671", - "47c0411805ef9611bea2ff6dfcc16a6130b1d0699274cdedbcd1aed4d677b420", - "2e8a2668370119d20b39cf07aa8530d5b793958211a15c02ca9defa89d0e7dda", - "341fe17214cc7cf150150214d966b8c5b31de2662c5c5b3e29c21e009da3803c", - "8952bc17d397c68b0e9f0534e31229f8e22ac58d957fe78fb4447dcdc8378cdb", - "c477a1baf9a6f9bdf99f3ddd75bfdc34a003e2800ba870e53ad64b6bcd5b21d6", - "aa3d5e56234b03b348724f978eb8a7832b1852c76816f8ce0f1af9b402761580", - "f8e852d185cfa492bdc93b597ce1e290ab2e8462483ea175f8686347ba8aff62", - "29ce6e32a42526b6b91ec8fa8bae5d5a7e383bc8be204f4485f36fa69d30f65b", - "20e2b0fab02a2d459d8a99683eabae08e1d4493d9fc5bcaf8df3d9b0f483903f", - "5d7a97de27d999c1557b64332adb279f78a2d9c883982a226916ee1cb15034c3", - "8d50092d05cdb4c49211d8362c1e06c7c27a589b3aff6e8e4848dbf0b02aa39a", - "32513ea3fd951f65cf390768abccba5a2cf1396ee8160df8e790862272406ea0", - "d87dc862b6759ce39c6643753dcf035e0b369a21368c8591c7cf09335bd9ceb7", - "061f67e3f0b5e8a13d76bd87685f7f2a71275160e88c2209e26cd2c9566f11c5", - "71752cf22fabb35f38e413ee4aac021fe35f7221657bb8629da6041d7f016b38", - "bb16591f016a5d4c939cef320bf26f7f4e97d53000d96b920d6e621b20a60f2e", - "b8c94863ffeba537077e441855a3e31d477000e9b37e4a908f7aca2a3d353a6c", - "045e9e45e430e878fb788c072023269e438205a758c3b67f07303b818b186e22", - "8b53c02dd653a62d839e91bb48b2ed041158c92ce76365dd5f77c0d618a0cd7a", - "104d4f5e63cb3e38501709d5beabc98c30f4567eef741123216deffff4485a0c", - "98b15488408c0d7356e4906b1fcea946c25a8aa6b7ae09c052bf99dc39e4b887", - "553d4b0ce70c9d4f2e0793d8e270bfd1892523607c905eb2b6f3baace21015cb", - "2f421865ca1ee38e06e107abc98500d60daa3f704ea6f87b21a83fd06b8535e8", - "962dbb076ce5c5b835a020d1b8407e85a2736fd3f94d5f7e24a3d6f4005e5be4", - "a67cffa20d6d7435310357a3124974ac2450747acd2c2f429dbefd564adba62e", - "9b952d6a8dd58528c38b37e95f04b8af59983845fb9c7a485d0a7d72790c26c0", - "e049635ecf94dc07fa610a63e3df986fa876ea4fe317b93973de80f93d96835c", - "c4dedb363ab5c678147c25c2bb3ec5087f935dd7ed7841d731cacd7e433e8a29", - "51104e7da43cfe3f23d877da2be75dd3dc524314f6e502cdf7ef993dc9b94c28", - "2a305beded0fc330d255aee15e72bc5d4d5aad707e144ff8137c9d5e10df78f9", - "aa9be79b370bf99a587250828aaeb7ae1f468393dddeaf637d1769fcb081adfe", - "f010294f15ae42a46e63fbdf77658d4e6ff39f58bf7bfe6c194c16e27afae2e1", - "09dc1e5cd303c59526047724762882124b3378f41d1adcff8bcc7bbea4b7981d", - "ef99c2b6e0ebb1b4e35e1d832e4dbcbd0073a6bfed17c337a9a61986ce0aa66d", - "81345ddfa192346924ccbe17167cb38b1ff06b201a3bab36bfeaaa29ca210dce", - "2fce9c11eea27f9a57d7d307811efc946c382bac8318e267f8b839e9a5cfd059", - "74140e9e3380552b440e95fe77c1f03fedb01a95b05a572aaea7117786b7bf12", - "525428caa7acdb8370dfd45119e703bb2a064e8e0a6cc1fbf51c2f1298b98169", - "bcf1b8f3609ea23abbea7cb96ad10a8a0ea553df1cd4cdf6957477e617cb9d78", - "7add78f95879b8b95f6133c6ff00fb66e539514b6cd0743b98a84e50996239a2", - "89af2ff0cac18c0df089a9ae0e1c5a83bcf63bddf60b6cc3cb10780a3de65696", - "18be4eb79f6785d36fd5a03f296cdc083c28ae33347aa7ab77ac51bd44b0c8a0", - "60c9a35642f0a650ea9ac5d3ea48c33c38598ad6e45c24b562de75a0133f8b84", - "fdde58c83296c2dfc6e7faa64a38e71c6fc84c4ebd459eec78dde6599f81e90f", - "1e42002ff2f7a18299fe065ca960d9d8fe274569e6874afc9876bfd55e4f0f54", - "b682672e59a46a3c8efe5c182ea6067baabdd97e9df2e590f0f0754ddc7ee9a1", - "5c2f4c647c7c0be490e6c62fad270c6b17c8eedaa64e9659b0abf1b4612e2284", - "d48a387cb343768ecbb773dfc6394a767c77548e729db62f1c28f721ba9e47e2", - "793bcd9cc7d34f8666e453d47367401e245b1aa3b5cb928865851ee2c6d776bc", - "85b01c0a8e45588d70a1a49d34d7d371b50c7bdd5782ae52b9448ed415912fbf", - "8ea22df1df9460bb469ed3275903ec3f35bc984b47d56adb26cceeaab067257e", - "d5238ef76281246989f7994e3c7e4b970260db40d7ef1626aed8bcec8cd0ffc9", - "9ec75609a37de8cdab036564fa4f09d4658dc1b71b8554517e12baac2033ff44", - "da52a27ef6368865873ab312e1e8f07f377bef2edc8737a4ecacd16de6258bd2", - "3ba7ebf3663f51fcb03cd9e57a302ba11a8a0bcd22817c3b2e7eb82e2884b469", - "637f6665610f8edfff91940a15d7cee79c34a1500e44fde42a5683242603186e", - "6b5e3da1c1504dff95b9bb1d7c579bbf0f585e103c4be060ef395201e24e06e2", - "7e1a930caeecff52bf5ac17b6dede2ca77b5f514ee7888d9b31f54584adfbebf", - "5853cd0d2ef586ae2392a6ef3a66793d8473292d8b5d68c1f6acdb5c5c13f06f", - "7e8c156dc38869b223922f01d78fdf9aac39254f24257c7a12f05e12cdaf0e31", - "cbed0b23eb6875718bb17d26efda062b9b92ec4ecb2ca1e974175fc129e7955b", - "15dda0ae60d484cf708e92c7c072890c5b91247434a1df2d5bc919573e193bc2", - "af4ec54432f24ce2d707cbafafed7f350e6fc81b540daee5e4371dd97effe621", - "06bb6c65911b3940d19111d7796a0490d9c6c8f01e9c631fe5ec8542cb41dcd3", - "66b97aabfd5bc5420b337b7378c9d3ed518d2b9b3d1adeb4cee1356c75705a0d", - "b6c2df8143e35de63daeaa15e0e2193262b2c65af6034fd96b586cad83e87107", - "15815a29758bc956468f579115c762583c85d3de95726594a151c0c44bd1a0c8", - "90aa403cbc28b99e148574b195e69e5bd10939be90a14c5ec88eec8b72e0088b", - "54f531b2b67b05ee820a87cb295a1907dd12f3b152f50fdc800bb7ac7aeef980", - "e0655f968b2aaaaa2fbe2cedb8953b11c6f2680c040e6f439b60d8ed3a219fd2", - "aa49bbbe3edc7ab0463c6c81d108bfa030f365b5ea5ffbec047a30cca036df60", - "216ef7fac5359bbaedc91b016f0a87b9f98adb4a1ccdd72ad8d295db75bba162", - "efab0d2f0440a632c7f72619d36defbb1eb211efdc47e3c59e28bc6990b6ea96", - "2963d20c1561a5913d791df1744534fe275f4351cd213a6b4e6647373ed58a90", - "93dcbadb266cdbdafe7ab2867ea846fbc0437e69165359c99beee54b493c6b3b", - "5abd04f3d914fb7c751fccab7e3dfdb3c9b47aef24075a8a079607e7da5cc03b", - "b98a1c18a13864c28fa71871fc740efcb12cb41e57423b4144b0a1e6e85194c7", - "2cd30d1687ca7767f1f4388e6ee3c497d37e9c5ff666e3da620ce9b9885e306c", - "76ba983c9ae71633fec62615f0dc3ecd14d25eb74960c61e6fc00a38a9a32513", - "f5c212e6817cef21019749d772b4894353d5585f45b88ae4647f4d859586f597", - "72ab65cd9d1ff1dc430e9afd82a275e97bfb3d5f6a85782bd6a81668ea5be6ba", - "aaa26b303a715f620153bdaecac974b46fc46f611731d3d4510c8f8cee0a3dec", - "ee1e9b4cd921b7a025529c0f1ae551fe104565717f1dea1fc839b92c55c5a848", - "8d73f47d9ec0e398262d43e10f8ad97932b224e0bed8f47bde21f90180b257f9", - "e8f36127893be02806561c04145b27810fcd28fa3fad736e33e91034d6d66f22", - "3e391ef1c6acc00390a43c3b2e7688715112f32dfb7620cba62c7367334123fa", - "c9aea65c348699ac60fad36e7e0a9ba3b19669caacf8fb3dc0bf4ce5aeb0037e", - "f502f072adc32c95c8d4a60345d28048051d2b79e2ee4616d1b793be8016caca", - "23a295185c45ce2b4595b7adea1fbab3815ef1b4ef5932a5c77dda34c771b7d1", - "305db51391c09650cdc31d398eae5d864ef69ca652c24564c8a3e5ac242090cc", - "dbc1246c09b804fa92784fbbda12078a5f89da96542eb500a4c2cbcb26cc9c0a", - "a146bfeebf5262e951456b44d13f1aee04a956356daf7056cb6ccd350815ad03", - "28f75d6c0c3c229fdcd4c097ff364d749149f146978d374fa20a1d24bc26e2d2", - "5ba5b8c5766d29261e91955945288ec13fc34c80dd3639fc34ed7562dcad34ea", - "b673d4840f0baa7d372e9e25dbe2794353f5a3df862c64d70583f4ec0829cd76", - "4fae82f2e2a0da0375419c92df5536db7b366bb550ac9255890fe14fce2ac273", - "925fed96995434b483298a2c6c1a3be2d5d7b9904303460dc9efae9e91f1a41a", - "2831355140e0d379df2b7fd5591137a8d9cd07ebd1f4d0535931a613a1c48ff3", - "891293b63c8ea1fd95cf1a598de2c381d397d541529adaaafd850530ec7900f1", - "a23b8c5d9a51c8935feec4d9d296389c66074c0d641be27c28b4259fabf83b02", - "dea5f6a774f29e56c345511a3e093d43db5c65624b341c158b31875959305472", - "c3d778ef1c4e37d6181e1c9b6e0feeec7b47b712d700d2376e184d4a316e4ac5", - "98e920a8f2451c119af9a1707a6aaed588e1a5840c2eec8e5cda58254b98e2bf", - "e7595ef52e76d7b0ec8bba687f6a4c7e97129727ebce94c1fbe65aa0f7d1027e", - "50c2779e29041fb53eb3ff32883fce8704b9cc0b5769bd455aeede43c9ff1077", - "8690eec907105b41343c44a4ed548dbde53bcb927ddfe31b76ac1681b199a455", - "07be3ff944ea2f8bf7c06fb3fb68ce3f96f32aab828593d35e0ee74f4659d74e", - "45cc40b80f95f6e045434185e9eab4fe0661768b0f1dbfc90e9557d7e994c511", - "485864c82dbd4147893457eea360e5d1b870e58e4fba0251ca4ed64241b1d1e1", - "59e9df0f1c05367c06c602f0f63929875dddb5112741861aeb6b9881d71ac8dc", - "25357cc13b3b59a600901014a3ce31b8e8512f5c1ee3283454c5005741ab51f8", - "55e43b25198098f7c32928dbd4c6c2c257a8bf4ced87c23cb512ea224e820631", - "da549f34abfeb95dd1dbc18bcdf37383e45a203c88a1d4d3044272e223cc512f", - "9ff51c895b23c61b24fe66c33c53aead5d78e32ece30702843bd850db273ff94", - "ef9bc1faaef22c0ab6cc415a598c06395a8078145f8f4f6e54adec569a810817", - "a5f41746272b406a8468ca0310453eca8bed5d8c86551877c15d257f2f4eee43", - "dfbd79c0682d16028fe62fff1f312cfe7ec428f719ca851e10b1b7b14ab8b510", - "74bd0824a9979f8577043a4a7af7a797e79bca23c3dd76e9259ece209342bbfb", - "705f22c62fcd76364b5ad4f9902edf4f50281c6a1e8e1dfde9adb18cc497b18f", - "f7aef2384d85721e26c45f15f8dbf4e05708088466f27c2db2b6d70af16f887c", - "36bdbe3549f7fdee8944fb671371e55286629611b7d5a43475460f6fb881a642", - "9e3618a17654257f002a666fafb663dbaff666631836891e8261eee5f0745a92", - "43e3c8f91eb72970ee6800aac3d8aaee4751f99df98fe09ca118a58d8fe0c33e", - "34dab5ba3a659caf692cbcf6eeadeb7e83541966dc2d8170722c07bc1d494a4e", - "ced8943222ec2b42a4d60395c880903cdc0c0f3c7e00b8f626ab2f622e8b7e1b", - "ba1ad5bd3d61211eec3c09e400f6d643b7f01795278ab4b8e9247818abf5c38d", - "c98259409838b938427e7766b15c5908948a5a9d505afbc201ea3ddc4cbd5063", - "919320e1751a968729b1cb375781abce7c56f4e74ee024a8eb23b4bc697b289c", - "3d59f267f40af351514f8fb35ff143c137bc9bf82a926f78b8fb59cee0c75881", - "7e95ff9b535ce10ab0fea4321dc73c97afcddfe0bd7ae0b661057116068c413f", - "6d48c24f9da20f689eca843e5345220e681a6e28d3a5fec9718c5608e3025795", - "fcd4fd96c402b532ecd0c8d0943af22cb53c420ae7dd5c9bf9884de93ef21464", - "254693e702fc6765817004cfb0ce89ca4bedff039dd113b33df38562032e86ff", - "ad49c8753196214fb2bbfd4daa315dc1af72e9efa3d0f7d081b12dfec521490a", - "daf9eb9e7c6528e838d78898c75098c3cc3e005c82b58d72a843cd2f86afbe73", - "086b18c0acca4c13310cd0b88dbad8e405cd233dc945944ab1dc3ed116ad8721", - "35ec1d83120c9fb2bf39a0d67de6d824ee8a4a7fe2ff403061a92cc15a8c6376", - "24308094d4969e3221697aaa1d21db8741b7beb8e4639da17c682c78d484dded", - "3e9f8e9e41708173b1818accfe34f9f7247b88087629cf2f802b57bf3113587e", - "7bd4c33c76a24e244c31770b3b358a77460965742623dd928d31c491b4c18330", - "fa5b3fb23863f829a25acdc7bd56084fbcf87f1ccc163c57fdbad68a7965034d", - "96c144171ccbb7b41c6aebf092f0e6a269bc77758bca375b6e6b2bd6ae610c84", - "13e24ea3fe689c0c1d5c84e95e4af60af1aec5d818f0471bdc2dbf7c05fd7eb9", - "405c2ae5afef416c5db2828f8dd56f1b05c1aec63cb1d113a977323faab5d8f0", - "8d79df8f17fd2766cc95e0c60d0dd3a99eb49209ec314a6954bc1c0dc82d361d", - "53a219a4deb3dfb1970c4339315d2427fc4c919f79041f8bd3d00e4818bed904", - "3ad547e15296b778115ebb56d5a8a5da03e229dce222af379ab9321ac6e0e792", - "d779e670c22914e5468b353cfc975174196c9fd652d83543e8e1d5c2b017c4f8", - "ef39eacf0048b3d6fb4ff5bc035b66927e5c601eb498ca71f875e4e0c71e93d5", - "c83301cffa2274e2817b3cd5f47ba6a151cca692b8e72bcc9a7bdd31e0b7016f", - "9846c1b808c305de7a5100552cce13a5f730028db12729b4a167d3bcd6aa10e9", - "082c896cfe0f4cc7b60142aabbe49f89b4092b62ed08a52d576cf037ef3f1ad0", - "9d6cf1781ad303c0c8a6a74a511dca048187af00affff59acad4ecba451eff6b", - "a81e7fd365221157f59f69825d06ce4af7bd80a195761921381a7feda2c116ef", - "feb645f003cf009978e744721215d7ad148631b5beef8879b7e786981208a162", - "9747768b935391a415ebaac854d7448816bb057a61ac55396f3df38d9b410bf0", - "300d7df7fcbb8c6416a11e3bb96e7644a972c1260fdb9995671de84a769d7fed", - "9666200ef5b67c6a4df6b015d5386f40191dbf3911eb61003207a627d1eb6920", - "f89bf7f2e56497fe1c0bd750c719362172e8ad87d44d317ab2b49ae02b7f7051", - "513912ce83dc2f7ffec989a8f0594e26296230c4c5dd7823dc71c103fe84f6f4", - "882627fb59d80b9a87a482075d83ffda19749151868d8e453f64eb464cde0774", - "5773babefeec5f78d02e1a3696dad59790fe521e02cfd599a6b937b86c9f1c7a", - "6ef55bb1c13db19452c1faf9d898d3ddd61320a5523873435c687c34e897925d", - "08396cf6be5da716f1f2e9de1aec82f7be665bb2a299fbd474302b002b2a2e03", - "793a034fb2cd9abe209ab64b2e7a119380ff7238d48fcffdf1a2160e81c76a68", - "b303ca9697f03fc9a17cd8d520fb6907be811848f92d5de31c2e6eaaf79247d9", - "11610f016b5dd2280351a820682a9b3d620950a1faf9437e24d13d81c531fb79", - "b01d8fd47b3554a99352ac3e5baf5524f314cfbc4262afcfbea1467b2d682898", - "e75637863c46e29f199b5c4cea975cc7b768358293edf63d44c58403907d3076", - "19e802f96f8c3f19454e5cd1c290f4d7abe71aac55c673f97b9f79ce631d4329", - "751ea42e9d8a40c43b54e305d00e618e6685c908dff0905979a1c2f15fea4ca3", - "e734d578ac96f329fbd42028e52207bf19e3c11a559077453d8cb1c39913e360", - "60f50ead36025bb7f56fddc21daad0477012aecec082d511eefb7ae20601c164", - "0bb9f4e851f6f165d65eed23b0f711e83579c800d8576d3900893225112f1b83", - "0cfc6717aebd280b836a369d2ca739a8ed29742f63627ebb7b523e82a9abd7d9", - "22c12c7e8b35b3bb1acdb640b720646ad3eaf54ab5950eedb50b6ba0f5051653", - "53d841dc4d38c1395351864c9db327c007bf07c1504cf0915dd41e6bb4dee27c", - "12b10de76a5e42db8fdb4e2aabf645f3a873a559f7da081fb46934df15777d18", - "f731e5c8b6b75e8ca9119b3f50997b5451fd6b639efc2226506cb99eb3285503", - "700b19149b03516523e56db7ef9761aff2c360718879deca5f689e9e4293ae47", - "f288a45ab0102c6c6a200a586303bdb11fd4a8831fc9b3c267439edf51fd3fb8", - "6c168aeaa7f708d79cb2d9fc5e4f60be3c009fa92708d28bdd46da4af241ad07", - "cd95cc0929bbe2b04dba8cccd9206b8036ce486c0a06d0accb0403f7d3318f33", - "6b1bfd45f8798273d631f8defa42e558b083924f38c35a4974f95394ba8c47dc", - "e0ae0f0ec661995904ec578bd74fe4e17cf232ace656601249a66e8f5483d850", - "a529349158f92b7704d7698743fe12acd02395d6347f1711a4ba90f1e85c834c", - "97019d312ad64349f95040954bfcbc21a4bf748b55c02e95f9764d48f8a402fc", - "3a833f46959839f02fdf3f14df9477721bea60de31bb4e9d0c287905957de928", - "59c2da15f49e4e27032ffb41883941dd8079b3b03d86cd73f9ee137a4a3fef1f", - "51a1f123eba8ccb274e6dcf9b0d446e9eaac75657f8fdcbcbbaecaffa4e630ba", - "fb1fc9f51b1d8056ab5b296ecdb75a898b0220a53133b9614fbdbaaa43da1df3", - "5da6371eb01d3fe721f12203e167467b8a0a0574053c2697dc5b029d3f4d8f05", - "2dda132c479c43393a596bfa1377942d066466613bbc67de14d5082841f0ccea", - "2eed76272f28d06bc393da03e3d30266262dc0987190593c58ada526d5582409", - "b709bf07d08c22bde29bde52ebe5cec216ece9de22b8759ca2a251884176c1af", - "c2b1ba187624038eb0172db35bc9417821b0dcf09c07d0bb1633d2e1208093ed", - "af2cd4004e8457635630d9dc6dbd50cc143a01d2999df76e072736764d736dc7", - "188641ebe351da6c182c0055205954f6a07af7d1a6236875f5c706ad8034189e", - "65752719c7bd0d73ee4f1e889ba68f02dc474ed20aafa3fdbb2b78c6196bc1a9", - "59a50d3a8dbd9e8c59b553c3150006f75ff53d7c6c9e006d784acc857320709c", - "94bca1ae70f456a5e67b5dcf3de0353383b65c63bd18b2591737dc95f8a881d2", - "cc4f62c57e29c0e3cb15a350e430346871c2d2557fe25ef08821d977d7af97b1", - "36a8af7dd6b9d35c228670b72a6bc6507904bb46e9b89523a0d1a7cb022617a7", - "6e0c2f3e05ac98c80f68681d1d100b81a40271e5870c25e1af63f6b67edbd0f0", - "13bdc233376f175106c48e6abb04653e1962a3d1646aec813892fee261e10e52", - "9698e5527ab074f993cc3060e6a6fcf72ea4bc8ad73595ca0608d4ccda51c750", - "f7cfd5a0230545d74386e9454fe649fa89362f2e2f962c0446ace6aea9edec02", - "15a186bfcc1e3c1186480341ff7e4ead9c370e042726884801761d9671f46eda", - "d79ee5ac551d4828889f51d49cf8e1d28230c369f05c183f7ff7b9f8ecb0a7fc", - "fa00ac126f662b9b6b2388226b318f0ff3d1d7107a81053bad41c1b459224ff1", - "d9ec4aef9ab9e6c35500488205700d003f2e136710d443d732d8b635a53e8060", - "2df937a2229d0f286bf3ccd34dea147d9f5223cc488f86b286f9e790d0a2bdef", - "2e8c3882f0abd4700e69e5545df599eabff0058c81c4bb291b94689d0b93e1e2", - "8bbc04eefca18e9cc65a2706315e2d7f379910995f22cfb693721b0fafbbbe90", - "852dc070d1f744c3bd6f11f6e63fa6d36a6a331696ac8604194bea194b3342b4", - "2aea080fb171ae9a605ec4e983a197c0b320cd98e340ee188dbaa2fdf03f0438", - "333882deeb27e7e37e5805b58222f586fa8b010e4dbd0e52f1b29c62a36ca4ec", - "9e30670cb63bcfbfd8b421c5fc4e51da7621fdf81c742f64126c33fe9f12ae43", - "f95b6e2558a3aee1be52eb7c750b6659b24fd260549e57a021a9aeef8e5eb448", - "c752e85f0f5f84d7fb0188636d83254abd914ba90d9eb21062509f44101152e6", - "eabe6912029b049afb88407402266ebde2c5b4c3df6aa5eea4cd94df3ae7302e", - "0f863541d9987d910aa91549594dfd326769355fbe0b5715ca8e373fbddcfe07", - "56c438039757adb5caf428c4ccd07831c582c2791a0d3ba65c28943a25f50cc2", - "c24912ddf84f5e58ee12944a6468ae1d35288f410b18c6a006cddea158d96baa", - "0e46a4728689e21a2144cd9e8c1ba08e98b2c8d5eda96714f095b9c5a9ee735f", - "8b80c8d09c1e9b393aedf122cc51e109d9bf0e08946f2a94f94a3f3c544b5f6f", - "3e0958f1b77ba53b0f2c773620ba2be1831746e4cbb139e597b64382bfde8324", - "267e601e2b66da052cbc4279b6af3436fa5b539a0ae709b7b3d05271216d79b1", - "7450fa08a6183aa854e77428c161fd104fd8512891e60477f88761da41409a05", - "4c30b3090f9c93ddfc7787b5feb3576f91d80a61d78fb95551923dbc41dcf50a", - "4ab02c17937975d452d029f00a5729082565b19e9ab58305193476e3cb6546e8", - "93d391178a816af6cb0db613d14860010d031ab0b84ae33b47783c377aa9192f", - "8e36cb4c705aed01126c362d428d5f996fd416751cefba696ef58ba66480f092", - "6f44aa2289919cf9763b48bacdcad4ea40f9aef9cc52fe9c58109cd9ad92db48", - "b5ae35499e7a50b1cb583357f6906288dae8ac14c7eb972ee433b6a0cda233f0", - "f38e2e9caa5f235f78653b7a16f2ad0ae584ad9e62293cd73f2bf1d9e2d8e44d", - "6384c088434b8292e54d2aa1e7fcd40a5cea1bb6501d14f7ffcc11ea5705474e", - "46394b6ca8e73b45fc8576a69acac7498554e05f769db62ed1ae9676dbd22730", - "957d734adc8cb1cfe79d4d45cdc34b815ba60da672dc6efc944411b240c871f6", - "a60e1a2cef17a1de3d47eed9befaf9695b56fe01e1d5ec77f6dac4e36e764800", - "7eb3717e271391271520b4751e340aab99fca25a449a6bb051ec063da6eb2037", - "4d81fe41538eaec3764f69e0dd30b235d506b31fc3b2ca5c4b5b08a038e28fb1", - "33a6d96b21597b7c0e95c25f9281e42a450e5037927c61eb6814206fbaf9262d", - "19dc9c6322245f6170ea0f1b18ad70ee5f55f48733241b5ce67e32398eb6c081", - "dea64a80d8fd74a65f2327f65c4f5c14a8117d769869af5deb9f8d00a895199d", - "2adee2025abca80a9676a4816b47dd86a305ec74d2016f013ad96a5cba9b9e4e", - "2fb9eb3ea37e3e505c6c22258f7f4f377bb7fca19b56c8f09c5cf66ec5d77dc0", - "00fe08ff10a938862ede0c3d596e9fa77459da489659da9a5ed16bc0e99ce89f", - "5ac2ccff3c5859f538891f0c7db8395f152340390f2c801ea596c2ec715fb6a9", - "d9cba2307b6a97b66e1eb7a8b7e16ff0d4ec3187eb54b4d57fae6914c3273b05", - "1680a1babfdde0151bc0c8f47f4b4cc862c9fd06c82d8d81710db01f0607f3ad", - "1ef3287db0b8d3ed5bc1c64d6542ed4745eb875a22956df6f0f8daca6282075d", - "4a45514a13b6cdce33500f8dfb867d3efc55dc09c645801330eaf3c639e5b23b", - "46f7cded4dfa41b06e48935df8fef2df80ca0f85f21a1fbaf43f2d2eb293f797", - "bd431dfaa63826a5e9d0dd3e6cba5a9114165739cc086768d19225902ce254e6", - "2251be073e799c88bd8fd9e6344dbd38dc82115f6e2fb0303f28dfb9482f34b9", - "54fc64db90d01f8698b1108b40bcd7b794b9bb2f58dcf4a4620c3220277b3dd5", - "cba687b7f3d486b3090a406e887b85713c54615ee2e1388b1581b36206e190de", - "dacbfa8d7f50da549393e33a40e54b6ef19a1e355fbb166fa09939b972e51c75", - "68fe2a6a3c8b6ea19518d06ac05a61974dd0c5d5ebda6505507b2fb36c6d58a4", - "1e65dc8ac5a50f942f8a43491a9547b00ab1b5598c8a048d9c870299c8ede448", - "228df80bfcd5584e89e6f2b33a57ff4271a62b334544b9450e111b646a2697a7", - "243afc40028057ef8bb697f1a8ad4e136ab2d5106294c3d95a9f3df8993e8e33", - "c4e3d9df710792bbf5115d41107cb825cf33551d2513c430e3881a8bf530a294", - "58f324e942e9f9a6c876ea4d94a87313efd7ac9189872164f155f2b15ef89817", - "37ad82f11b2ec48f1e3fc2a868b3acf21fe9d20931b87fda86fbd6c8c720c79f", - "7b3054715f59158d95032fa036babd58c0085d524909256c7c7c2b0f6bdcc5f6", - "967c387c5e32c1019eb1b57d67ef67c7640d6feee766955223168239792028d7", - "19a40f7972e4944a1cbf5aa23f876fb89672ffcfc739f21e0dad381727713146", - "82871f3919d6ef275cdf849f34918e1a4702dfbb4a2498b88ca36fe149f69418", - "1252a8c5681910dc7ac1d55d5103697048d9474cea4e177ddda7453a45884904", - "4142d8af16156920858c8853a96c6139c3b22f3b8601662e2307d3f5172d29f0", - "807d84be648eb49b8e8fd73d747815a94b02ae278537ba0ccc0ee4c90f46e67c", - "9eda0bb367a3a0b6fea2d6d8b052165300683ee7cd4779a50dc0f8c27ef96e39", - "50ca057adb956286228ade513ae9ab2af0321ba0c857291449812a51a612e64d", - "2f52f05a8a0f29298f0e185b47cb7a1722d8412c2c7fb37007b78afbcd07668c", - "b9bff76604db73a1145bdd32a1bef94ed3e2d8f78fff1f607a86ef12244dbd72", - "3c5e2c36a41613cb458de17f9c5d291f251b8f0546b340010036a455bc212533", - "b12fe0223a3ecb88c49d7360bf4e01a656c73c86976ccbf1fdcd95b8f40e0a21", - "331e5051fe948fe5ccd0fd59af4bfbcea888596cb4429f2167bbb884afeb6e99", - "605fa9bddf6c71060387b01168e2c7cac92687e095cdfce7c2e58ca783ec9e11", - "6e85acad3e9b46a23a07d48b41b52b4862ba7240094a57a7fd3cbbf457b34d20", - "432ab73d697a19db0ad156f51d3b3def791ee21b43e0c96b695c0be2f35f90e6", - "9a615067758df789b04d04e32b9e68089a8db225585476f191960ad6024a8602", - "51e8eb6d8c1fa5676d0345491e727b038d38766024c25221541b5acfad4b4f78", - "f622cf208caad2ac7e8dd0b07e088399344c74ca78a0734da3925d4aa362607a", - "8aa484dff4b57506f483fc529568e4ff69e521abca49b0502732864f86fbf110", - "dd539e842d78f984e9dbce32ce753ba3a3ce9e340f07aff466a1c93a6eb200df", - "a5589c62c1840d79d6ae43fa3a798bb544cb5532ce19de2682fab7ab38a0efa0", - "374eacd47afcfaa09e098d45ed9a215c480f3ca229c7f0250309c18fbb4fd7a0", - "ccddf838ab1ecc312d1d72fb8707d75b5196276babac8c897795cf92fd22b7b4", - "dbea473f7597f675c0191b2f1f55b817bc51bacb373ff7f01383b4fa7fb0da36", - "40304622d6342ffc835e23bbe0517c5f51095801f6116ec398fb45b144fa0162", - "bbb99982e6af5721e609c17e4a6248530fd793d1a672ddceb614ddf4a5ebd189", - "2325cb65481ddbfe991786ed7be7d169d19069da42965b425dc7656133902a50", - "f6d1560c29c8f77b052a7d26d797266592b7730bd032c3db07a3ddf8202cf94a", - "c079082f77ef7082c44a9f6f522d43dd088f81d1d22e0432213d02b29c3a7e89", - "7596cb44898f3055f35ad4c17caf6925cc0422f380331995443a38f26f650532", - "76d293c215c549207c5b810f5a4b5b3de2cdfc5a26a5a14d7d641860152544ed", - "8f2d8af9b59fb1c5a126817a9daf982b63c606da0d4f41929b8b27b78a3ecd66", - "901bb754aa56617dc7b32629cc3fb3c986ac6fb261b37cbc6778b06eca60db9e", - "11dc6c97e8e178f93ff4aaae135cacc01a9ff6b1366a8cd7273c2cb1a202e238", - "be08327769b2d22105b9483c92a73d7433ebb73827b1fa516dc4a88ab4f0199b", - "aaa7e2bfc52bbf073a260f8facda79f395f1b8188fb810e4827b455eea6f641b", - "38f1e0a6c3e13144b6c552eb0f82db2358b474f936d53daaf6e554aa6636efb8", - "8d037068724f32fb16529fd44408271616b0786a4411109092a9556b2451d91c", - "5fbecf417abdf1526979f934e9584b0e39658abe82401b9dc5ce9e7988aad30f", - "2f9b7bd6de95e49d0ef1826ee815b93cccf0bdaca8628d434983fc5cbc2e97d5", - "c6d10c20b09b7bf20a6c9981d9ec04ecd2f8bc71dcd92a5516a577c8316f10be", - "02903a4385f3c3ff8cc0ac91d0ed5843a3f159e06e90424158f8fd1e03cc063f", - "f88b2dd0c2e880aa495194f890f44f819fcb92f1a1f11867981d23a34524e049", - "afdb8b85c813d0a378906c115ab0f36d5f8d173bfe517556ef88a039a5140075", - "b6dc15ebc746390fcf4a315c226a9e2417303d8397c80ea637bcda1c74c84989", - "037ca7224f875d50f6d8cc062eaa0db02d785018f5ef56991e97bfb384efd20d", - "5f80481410587623de688e072c3ef6dff73b6708e4a3ca961c6432d5486a388a", - "94bf654c5a79dc72435a8950a1ecadec3ad07ebf498159885b82bdd789a89e95", - "f291d5109e031631bfc21848a9ff0c7ebbaaaa75f2ba34224b38695e6f648550", - "45546b30f0b08ee20b8baf5ebcf6a6c5b30721ec5500742808446ae674d47d83", - "1964735ea490be778b248cd5201f28131a22155ace2a059e655ff59dde5b725e", - "fd50204d0a10f309d27d32d57fab0df5bafdaeb8c2ebca8f0ad1cc07e10eb741", - "90fc587e291155c21c9da1cf15d530b7d83edea7f5e72d4d5191b051b6cceda1", - "3bfe927c77f7ba4a343f6b2ed9486e2ac5b23ea777d05b02c2fc9f94e99d1a40", - "f2239348b829e9b9c9e1973da4e42a9ce6f35236f08956a12121a021ff78ec11", - "20d91dd00cb713dc53eb4ac690c92563fae8f4a1c9e7ec9587fa6b5b67a91001", - "c355f19d25dbddbb7a7595841f117332d88747b460b6c32976a0ad8fe6299b1c", - "2a9904d99577c8e5b0610e907d465e7fce814c68869a45daa89b529b7f15dd7d", - "338d9955dd527fdd43bf41677434c377de268892f02cc234e52ee43b02c13840", - "482c90147a55fd3d41528c7711016e65fa785d87d4631367a9d2a2838fb90b66", - "82c6e404753143e45e22c2f0e420f1769823421b0a561bff68891f3864b71c09", - "cd0b6dd99f6b94feedabf125c56c39bcd2613394fe4e52b393e10358cec3d1c5", - "9fa4d800972726b3e5e7a5373d5b1830666a3e0dfe16dcd9a08c0b0f52810c98", - "8f1af963cda660fa029d41ad4cacea86801db66d214bc1704afc59c3864dde5d", - "9da887ac99e012bc508eca5b5fc9dafb93a324f195eeb3b7990d1ec282ba62bf", - "78907af8e920799a2f510460b9d8800d03e46a8363796c1fd3891a9cc5ec2e38", - "35f59c4c569b9973450e8d738f9e8027139c235169114690951dc2e8a159894d", - "0a3df4a94d80d8a7327a15ad517fd2076f3163849a9beca20ef4e0d33b4c33dd", - "0bd7039f1e7650de1f38c2e877ba5db285ab2fa65a61fc7ea7390d2cbd410a7b", - "7c44ecaecde0e7d3b7857fd0e3ba40fbd29d92ee534925177b7eed2e454cad1b", - "ee31487be9887bd23ae6ea8a3f0921f3b8285d3544427354e207398d7a02a1c4", - "a8abb2cb36b06319abb4644b02d5f33af1bf3f859bd6deee9bbca9d2ba9b4abe", - "27a73ed4c71265f98bc59ead64ac05261d458cd5f9581b545e1b94079fa4b15c", - "126265fbc4c60354121a803ce0dbe25a6aabfa181369b38e128345c475cefac0", - "5a0d4ecc658a70e03ecded722b7fc579941b1b6a94cc47a14417b8a32c85cde7", - "d60d946f3c070d868d748bd505949225a3b600ad10dedfdcf397c77bf09ea739", - "3fd75011dbd4d9151092384d7a2e73ef3e62541e39907a326bda46aa3f42762f", - "7a032ddb20f0ebca002e74d5849ec218f6d4c749a0c900f18e94634b568067b7", - "53d36243f392f964ef9dd6680fb8063d96052472a038c96ec23580a27c72df43", - "154a7b5cf5a53aa10001bde9c74bddc6d2207ebf70e26981647a50cbb227a48f", - "85f6ad2c44af894d5146fa28c0584c5678e36e6a77eee95bf5f7d1e384d083e7", - "d3f2828e7949bf0a4c7324e4b1eee11b4e711f315a71ea8c8b19cdc3ba53fc0d", - "35ea5877a413046d301c6da4f4aede5e96bc712b2c6d5460a8e74dc8e522b65b", - "54be355b3f670e5aa3c316dcfda8b0e6cd2ecdf0d1c3dd63a6e4bbaa828f160e", - "892f0e80748f52a6b9219cdaac7cfe85ad718d5479be0b6391d5d34d6a47a5c4", - "60bba0092dbc3cba5240febd064d8e1e669064bcef77c889c50011e0b92858d9", - "29154f502d1a4cd4b5eb0848d35305adacb5f411f5c429450c4900c45fc1ec43", - "11ed9074db6613a3cee2712783a80861cbe22ca9f2c8b40d7a43f0fd06d6a768", - "fa43e5cb407b6e1c570643b3f567c48d9f931e533f189c07e3940542cbb0c196", - "328cb20b1d2b5c25a877b50f4ffa4783e2518e93070b0a7b86a380639ec75552", - "1d52c97d3451f6dacd56bfca2bc20de5d5186deea63fe77db88bafd1aab141ac", - "fe6fc8ee14d59280087a6611709bcd42669f78a7c0c985ca63050861cc600c09", - "7eee9ec0461db9d566c51b7cc8ffef39b29e5865d05b1ac427e66a12fdfec020", - "dad5f6db5a6ac1f0afb6592afbcb7394504073d6aa1f4fae3e4b265addc6e761", - "21100d361f3b9ea16076d570d3653687c9f8fad3edba08b6aab4fd38dd264632", - "b3b13ba3f2c66dc8b8023116b7159917f1761d16b769327913f23012cc28fc1a", - "aaa96c463903dd348e99de72a7ca5542221771f8e12993ae0343cc57a58bf0c1", - "f55e00e25a16002eb11ee8d5d0dbe9b408ed71d6cbb88319c366c1c30c85dda6", - "e30084ba23295c13cba39c2224d2a4ed738e54de93b4c0a29a6790e579dad44e", - "4551093e03a155583dc92b4d835a16280aff336caea802af99e4e75e37c0225d", - "3aae0a4f4fd6d38cc247817f0ca3d9b3e01904f7c5caac4b8c22efac41475b12", - "631b587ae685ab0c7bc1bed16dac056c8e27561b218c55263cd8b8eb5b8549bc", - "af64fec6a248d5b98ee2f3ad67637a18a967d00a6b6c5a38da04cfc7e0cca8ff", - "e4070a508270729b55becc168d4879f37ee781c8591f77690d4aa7e4d3ad9099", - "95f1a2505faf42cb2704bf5c2f396826c86b09032eaa347da3e9317177fc1c63", - "fead60b8d6073226969518fa89a25f8184cc28728331427cc88f3ef13f30171e", - "416f48d9d0c5626bbad309db996d17863d0db8bfb0e7806674cbcff989e2af62", - "64787f35b1ad4e7a019c48f82934eb41d584b66cae811b3e25ae024f20dbf73c", - "6e0c6bf6382481639d5fd722b7eeadc2b79e95da6497c60751d3b48312b94dfb", - "f124d0e555e59d2680d51fac00d58fcd98a283975207e1c4d0252b67060a3de0", - "7e5c8b68b51ccbf36f15670ed2cfd811e9a23ec9417763683d54d3b10eb66c5f", - "fd50aa9e908402416ad962ef5c09a358dce7ebd4c635cb880778afa531057214", - "88ef0612d77395ff2c6203089ba0f4e84b1afa7bbdd5efd17218acf221f9e2c2", - "10f9df0d7c8c5a128ea89e2b71916ea60e37addd0161094ff0a7cbf5752cbda0", - "35fd3a3a3a8e8095d7d81286c51ebc595127d051fb8a9585abdf4104740a5fe5", - "7a57e897976742fdf18b1f516999bfd5ca97165cc9c63e4bfb854ac75e0f03c8", - "25f17e6395f4b5cd1c20334f8430469c9a101f51f687fad167330471ef133f49", - "3e0d2379c1cc29de5cff720510e9ec3a35872ca7f090a08fef0f8338c5b31bdd", - "45c93446100f742cd9c340fbcf12d6a9aacf9eedc08eca680a1efcc8af70ee01", - "c196303ab60145b847c8f22c427cdebc563c574ace05d690c1bccafbc8257662", - "d5ed87a46ac369136c68198eb7e4127cebc02a66338584b0bdd13d2579956ad4", - "a9cb613767c33e0e930bf8bfd28f2002f122c21d5467821575a9b3a562b2202c", - "0941b0e01c04b8f97828cd76d358e0d5db40fcdc0f3a150f4fc3b5f49cc8efbe", - "1672a7df518c48ee06decff326717a9ed79975ef8a1781ad26a1b585ac276198", - "8b8ab0998b4d5025b8ee21d9f7d7934377b09e30d8a7d6817ee746b184c00cdd", - "7d1c0aadd02bd1792b033366972e27b2ce055b79c3b489342dd5e5706b46ba90", - "c210b0b8645ef912daab373d5f22df0470270e3d5e706e436480973e76bcf530", - "3c742b5a260cf514bf8a387fe56a2648f718364cdf374eb5acb0a9205fbd6d9b", - "9cd4781ba2b1c62a5370bd9f2a27ee51d4c37fe716b15710cbd6b7cb378f741a", - "305139b95fbed29908dfdd4d67a25d6ef0725e34e73a2b069991dc319a8194f6", - "6d855476d65c8fec0a4e5a09d24ffb8e3db6d8d442274488f6a56aebca1bba25", - "96eae6265bb06eb83b0b102f3958e871d4faff01d523f7649e44deb8261dbfec", - "f55bdb7e970f6b4dce3e2eab54c24f7dc5c753aac9b0156e5eaef3887d1c3285", - "1bbbdd695915db3ce1eff6ccc7a397eab41427af9709f785f5aca4b0b8dfa4ca", - "a9d1902bb9650fd7899c61c268fb8c0cd121aceb4f7c0921a0f83a6d5e39e74f", - "12940bad2b7de27975dd677dae1b7380fe121dc7986bca0a11cb22b649c91a86", - "b609e871ffd32f0acf43b5c3fa583de33392932e3e12bb1cdaf95834b2bfcda7", - "cc7eaf800a02a8c1810ff2fe6fafa764473be0b59b967709774331cf17e6922a", - "435fa1b35f951e1da2566387d57378e4c16eaef8954d171e4a3a387c13731027", - "ffd066fcf022cde72cec82ae542e993de0c61c9482b3faa23c2b1da3421c32f4", - "7f25f66cc9c4ab977ccf360fe61740ac0f374b4551635c10f98632557488b686", - "c9149b9a047f1d1caf7971beef1d4458fb33e47413e791e7f75975260c73c4de", - "972be08ab5411a3d056b01ed1f7b6d926df1eef7583db9a289cc8d4e10f95d4e", - "c37a627e426cc3cb076e9a8028a8a1d9691d1d58f5a2cb559329820c5a719076", - "28c37011b1a022630b74a6e42dfeaa2456f7e7bd3ca46c629091a632991afe40", - "44cbd96804c8f9681179447f1544d99d4585ae799cf913b0f4dc64046681232d", - "20212331662f7e94862a278240ef30d41f8c8695fc532192fc27da92b4052a96", - "b73c52f38c0c88cd18f2b4a90939e74eee8194b5a64f8553eb54046557243f3f", - "6c4a0a9c9744f39c19cffb98ffa28481c0830742a152269caf52ea70a560201e", - "01ff6f1cb5015f177598e8d62dc5b4b45ad9137e01927cce322280d46318b0bd", - "ab4ee87f0c8e938605b93235ca4b7651632b5f70664df087f10b633ff9986433", - "fb62149adc2870824f372b8d5d4dcbced41ceea477bb8b8c16752c6514105380", - "dfad54f853367eea858d991b3518d881ece68b57829afd3859e0e47039da5a88", - "3355ee70ec08aba04e18c47edf6547a31e75faf9d983dffb6a79e669461cd138", - "7843c86c15c4d0a1fca29f7a429286dcd60db62a8f19c92e93f77861b8c03217", - "8fcb7dbc862b2b0f682839bc04a8e5d9cc2dbd353114b869f1b50aa2f75c5b6a", - "f6128193b256025382507962cd9e97385fdc52213026942f229a7321b06f5178", - "7fa3fb4ce2338fe952e4f550c86cb634a4991967f5c3c1e13a39d6f2104289cb", - "008abaf45e206d1029eb5e29ac669c35396b97e94922ad8d22e4e130e2b17ef4", - "f8679c3103f4db3bc0dd9d198e45c481fe29ddcdac15c337713371e0862ad767", - "b4b1de2ebb4fc78ae24864bde6247618526c740d0a1b467c977f77c5546b38cd", - "0b4d82fcb7133f6763eba4f230c3974fbc1cb1bf7f85fa0d42758e2a0c7f5e4e", - "96c01c9e999b5f7bec977ca207e0ba451c45c8acafefa8d65dba5190e76fab33", - "8b4104d89bb0e0d2281494e60001a0d01bb5e922b5566c33cb68014363de637d", - "0fb34c044219236e261da1eda0b3965039479e3d03101fa3361a265ec4201fd8", - "a196b8b4b0eb06678fae08da2588432e21793538e705e11d82e87cd022dbe6ba", - "1909a0160ea8a6671e7e590912cd812f27658dcbb05ad5f7beac67eab1100475", - "83417dc453a6c358b5b16d1135072f77706eb1ac7702e71a00c6a725124667d6", - "cdb443d1e79bce714386d465173b5ac9e53b4c2ceee754e9fe1f89c1ff1526d4", - "d24f301d4b608d791cd56b6a36118681c01712be12b9336766409e9d29eb8f31", - "dda8830fdddd4448a1621fbfb90f181b6dec12e5ca201a976869fcf3713d9027", - "9e97489f673503b8c6af8e806abf9755192a27e71faf9f52828c0fbe35b5d829", - "bfa906202a5eb5eb5cc1ea4deee5f997f12847d9cc6e64296e4ed1f7a78f8844", - "e7dad69d3668584f279fd994c8214f13e8d98f3ba80397cbe79e481d18f5028e", - "b7994d09cc4c9ab0ddfb363fc7c6697b605a5faa05edea29460c1bc45b7309db", - "91f739c04f0a1264fa8b7a35691e0ce7d71c035e58892fff03f8120ace62ef3b", - "ecaabe12354f0bf2de5d9f51c6ce5add5441e46cd3985421c586f8aee668128b", - "b0db24a12098f4d1effbbef9e49d4202b40c8965a21625cbf48909848d70752d", - "c3e5d932f3493ab84bc65071543c48242d5db420ff5370b0b6dfc4f057413ecc", - "6a4b002c885622118dc07f1bc0af4b98e2921d08b1f5f22044044276b22daa1c", - "0207a52266741a85afbf77ff3b2ab915e408833bfa8e68c58ea148b1c828e384", - "62de07e99a8b7d8a1d80c13bf22f34d22d3535edf6fee42850a8ffb8622b4ce6", - "eeb1c1a5d5b8d1d9d3da2ad614997cfe61d2e92d36baaadf675a3d8724bf838e", - "b1f7e860f0dcba18e284156e6d69f916494d19aeca2d18c5e62ed0ebe32fe737", - "faf00737720e5f7b46aa808e546bc02835ced5797298192a2ba1d05110d027c8", - "9d3dafa10536e6c375e25433378f77bdccfa1ec28bf3d1d4edfd8f4c35eb19e2", - "5b8170d1e39923b9cf7e56b837fb55243209418173748180800bb39192f67991", - "a4ce0da5589bc03fbe04b9193584f24abcdbd8cfacf91cf0aba8dda784c72ffd", - "282551d2769fa21d56afc34e874f4d76dd6c4ba79829cdcdd4b515378ff6db80", - "e02450043bc16ba04797fc4ac5bd916363094a39b205931ea9180d7bac72a05e", - "531ed759a8e2d6cd735dc5cf79054fd310550bbc7ebc84b2a6a66f91b86b27ed", - "0e44ee7e328d6165d764cf26582295a1b7c7b65756468c5570393842435fa480", - "3feb8b16a310dda35931865a0572350c93b364afd9a45f020f116de5634368e1", - "b01ebf70b6db147bf65d27f82efc3491d073839cf5174690411c29569815bd7a", - "862a9e1a59660fdf18c19c1ebc3679f1282154df078fd5cb2f53540f31daeca5", - "fe46d47c3b3fb1dbc77a81b5149216ae3e5718b09924ea652e8cfa8a1fc59f04", - "3ebf85be083bd5c002c32c691adece5d42c2f3716022f5cd1bc6fd208d50bb06", - "b72c9dd91927bbc40bf44e4546285c0c6b1b60e21257a4dbac97f561e88acac2", - "f3e7903466c0c83749bfe1bc0e6ee2ee4f1bdbbf40c7b9b6194b73a52b9b817c", - "333699fa48f5473dff22fb8187caa2c72ae544b3bbd4d13b095fd8b432c95c44", - "bb0ba58d2998b21caa4268f694bd865dbbaa7a722f43adf2d5e31ea1e20f3898", - "483665848515330fff4b0f3dcd6dc17d36408071e9c3977bc15435ad61c6c281", - "e9bf674847567e85a3e5569ec8bd020f6ff4e920ddb3e6b29e8e4078a7e68c41", - "8ccbbcfa7539a2aeb8b11231f6b9272b581d2d5669cb473b5811409d4216225d", - "d002662dae1857002b204078bff5d6fe453a776974e26c6ca838dc766822ddcd", - "ecfd1bf322337c6c47e02c5d2164157b3749447fc26d04ca0abef6b97605f8aa", - "c875910a896199a3081bcfa3c653f1ed4851a75e957f48a43f6fcf96c13fd9cc", - "48872ddcfbcc6a4c58121f751c5ee0b123d6eced5ca877c5a02c3f80c4cffa3d", - "c6690cf3626698640ecc68dda0aa5b4559f6d8e5715218ab6a63b9acfd94c38c", - "b60918fd4159f4bad5dff35b472eb5932d3d0458ea999c282956dff87df5c307", - "c775c52c16a3e03cf6b948a36da0dd09b3ab9f8d12e5d4dfd8d82190340df1fe", - "5311beab8929560697cfe1cf10b116d7cfc7901c3180be42be57e4cc56eef38e", - "de4dc5ca91d21c13d7b93eccafb19c2dc92e4ab27c3f5c3279331e17223a8247", - "b32daa26a93162494427f7bfab579c70b2fabd01e1c91ab35a26d8f58f706b4f", - "1a8031563c8231f5c0fa11419a5441a8114856f13018591a7850a4edbb29af9b", - "7fdae546cf0f685d8d256544144eec3cfa6ecfc40b8eb97c981ed49239e335ec", - "976f6355515de307175ce54f3fcc239a081e8a615abed1b3ecda30719788f6ed", - "60d286ae51189b7547da995d7c43bc886fb577a71bf4efdbb52276b517955081", - "b7514e9da143f4a9a65d06e88cc2578b1821a27c40e61edab1a83b9e2ccd0809", - "2fd006bb7049cb5dc1a3f8e29d428ccd55027d71beea6a1a1c48a23a9d0f9ec2", - "c9131746aade384d835d57e4dcd6975ce49ec4bb6013a19407023b3a981f6e62", - "5c46af5443eef029b99e94152bc9b8326c8f44b532cd985dddceb50dc383d395", - "041af87d3a165ca7592c0f81460eca5bc8ab419345071c492610e4ec9f25f98e", - "a59938f9ac03d5cf19460cfd65309c6798745d53d52161186c7838f375a3e5a8", - "1ed1fae5684572e89f558298d191c2db6b51b4a6650beae849b7cb610883734b", - "bfe19729dda14db555b2e1a3ba24417a4d98fd021bc44e8cde56edd59d8997a7", - "793abd6df76250f7baf45b1c013253723e62deaed2f5acd190408405b91c64e1", - "7b8b6dbf90282e0ac9772766db529e978056de9d326d83c470950796c6101859", - "a10503ddf7d39f7c7f60d11b706b51f7d23152d966651d1edd4fd17ca7b942c6", - "92007458f8a9b5f466262a094b5e787a197036a84b5834d64e8e9a25078d2ca0", - "7b9497de8536441ca4d9fe67bf698bb00bfa17f00943d15d276a519f438cf8d5", - "e64806958343e300a83f5066f94f7ef5710202592298d7d29e061e9c810a6f2d", - "625eba51933a87704e4b497f0fcb055b333c654a4eee0d62e50cf59a2e7f7ad5", - "df8073733a6d219fc636f560d80725d9e67270c158834871e1314d7e2672669f", - "8c60d9e25dd86224863f37ee000838338bf30fc70c92012026b613f609913c11", - "0c0f2bfa80aded6cbcfd3fd92efe33ec00d34a894c14e340088ca2e2d2e40e53", - "9e03537bee50fc64eb695ac3d312f0891619b8f5b6bc36260e9eccf9581c02df", - "dfd01af405d5c011c1cd23d4011d719abbb50cb2eabc745fb1e38cb633a5b1fc", - "85ddf1f4c06ff6180b8024aa6b22929d7a87a539c6d53c31ca030d36e0647bdf", - "18b9dc0c7dbe5f51b89f2c1246d6a3481cc7fe97635d29a0c3c103f12e8891a6", - "62c19ace40b9b4da009682cb4db3314360ed3c49ca924d6af4096891254f9be8", - "7e9f0458628dd4fb718ac8c6b28facd68f5dff76f88c512cfcca101bd8843bf2", - "084088a2a3f92bcd5facb6665db6355bcf9910066388528f67b49f762ee9a79f", - "95e76b439130e7313aa0600086d466fc19151db0a961a577dd8f4c83e0b87a31", - "0e256182f709602986802e3cdd87b099ff85a62314afcb57a8991e3d8e351b79", - "3b37b99fc50426908e9b5c69f16155db87e22836b0b0568dd620fa9181a16482", - "103a9ba300d7cb2707e953aa77503e2677d7129cc7ba4437b90cbe89bb703798", - "15e903b05f3897ca3a74fb270781ec5ec8d34b6657b8eb55a1e6201ed4b74075", - "5565fa3f3170dbc792be4e7d4e06fab947dc8c95e05ef317569d308b4f1f9208", - "d5125ebce701674b73c1fa73b713bb86998a100cf59f7ab38002e7cf982998de", - "cb3e80dd0203cfe53950e6165a8945d569db999d4970014a1804cebaa88d50c0", - "fdbd387e78e2099abfcf32464df653c81b11848343a661f8543ac85a562b4286", - "ec299b3c9b69ebd7c188a3f7ed3e9bace6773ae2101fdda31302dd9eaef03275", - "9c85fb65d2b1d2ef3881a3f7a6a0c62ded746ee7e905dde9e1ffc1b213d54ffc", - "699fc38a448bbd9070e551783e7ef1bc0fa55f2ad1d14533d0d394b164cb1fb5", - "adae9fc2daba9c5b636034371ef7f6ee6762a88e1e24088b7c360b0ad58723cc", - "7156b82754203b1e2ec036308bbb506f820d95f63af308792563c552829dcfab", - "42cc431d5b2351bdccaa77ab1f637045fa8211fa3acdee13f58e8b9361bce0f3", - "16c07b769ca067881a42065ab7f434f883fa593203ea72da3e8caf2845d2e8ae", - "21a70a192e2dd36a1a3e98f7d8f7320e4df6d0e66afa320c385ba48a6af9c83a", - "a37df1f601890a55b5093907c5edaca7bd4087e99b0b8b3093641f89284fdd24", - "66e7e2c06c7bfe81489eb0884ebd5dc7ff38005be05f79ae8e60191b05559c4a", - "fed3db95bc414b5ae224b1affbbdef91958b5e047fe4bde6df55a1434651977c", - "f49ed9b4646c8ae218fa85362f5263ce9efa6178a6dfcb7f8f645e04d153359f", - "81dccd3e522c8567c519ae49ff962136289ac1b15f3d9f662ecea8e55418cc28", - "3076dc16f147243ff2100929079dd1ae186508b1a5f1017843675b839686283d", - "eb5d30e4791204b1e160c05e6f1e2912187bb45cf523fd43fbda503f51b63060", - "2c1e834c667e0b9b8cfcb20c544c5ff291dc441022b5d7ffe1a53062033593a2", - "f34ec6d269c8638f843e6c52dc84972efc74f78576a645aff60b5a6e6a094f50", - "f86910b6ec74b817e4d39251a69bd695cdeabd14b7ef253f66f98fbc35920d61", - "3f94fd068f377ed7ec4b87c7ab24f6e4e5c3dcb87addea999d1ccecc1a599803", - "c4ab592c9f02e5dbff562a928969655e722537e3d166808386afb12901cbdc1e", - "0ee3193fe5cd68392a87def3ffbc791060a36cfa826630a9549df1813e366c51", - "e8c99a1f986052677bad61d2d550f788cfe6de70594bccc10fa45d413e327a89", - "2b33a3b7d0dd3c3d86e916ad269eaf8ce3abb02de4e9eb288b7dad3a32f2f34c", - "193d393ac1e1cf42b13da2f0e51d4c98e3fde63809cd4ca147e56bcd90689cc2", - "3cb69fac05dd7f41a903852de7c0eb768a8ad9d59a30bbd93ae78b418f5ac607", - "3edf3594d4c38ef0242798b1b9a856b33af130c5302e1ecacdf617391c0cea13", - "55344439b70df83452442ed339cfa8e20cade4aa1a7be7493c3859c21ef03821", - "56bea81a3993dd2fc36e5f0a6358ccee74e3d205fe1facf10207e11bceec856b", - "b731f5f301d03a4123cd4974306af6fe7ab75b7017e95712a7b2ab2ca66d9c3c", - "4a7cc83bd3633d8a8eb51dcd4ff38e279e1b157453d409fdc5baafaa7dcb367c", - "2ed492ea863df18e6d08445a5f5097aaecb7694e234f311800797be2e86be57e", - "453817fff838a4f97fc8dd3dcbeb0a39c8e5b93eaa2a93e95d55dd61ea126c4e", - "0f2788eb8bb9196173c00af970016ac2ae8b3e616c2af60a922b121bfbf1ea44", - "c86cb6b1408c039976be02787ecd28e5de2597cb2c010d43d24c0e8599d50d7a", - "e302f172b42dbb6f014dc69c056cf8c17946c2fc4995814d911ed6df60e2757c", - "10f5ee6ca3bac7ff10228b85fe4f22334c66a164c6041b9f2bbbc30fa383f189", - "4fb8202cc360b8532e6f5574fc901d39b02662fdc1eb5be436c377bc203e85bc", - "85950a98c9ea737fdfef5541b36e5f1a4d45f9d20b7fc05046150b6b60e8239e", - "761548283daccca58dfb7f117f721cd75ebde1472b4ae46e1fe4831d9417416d", - "8b8f191531c76116c4f635014457ff05de09521a1a4627b05cdc2fea4b2855f1", - "cf6831aad918304a6fe21dd570e2e9a0ca6641acf327afa213a41ebb172319f5", - "eb66c829c0fce1975104ae1723b94b852ce1ba3667273548352c440b1292b8ac", - "f9007d27289d820fe43016274283b4a36c99eaeb4330f336dadd672bc660af0f", - "2b4188be0fbc6b982cef411c00a09a4fb4c5b36fd7dfe576441e5acf1a74050a", - "c7e201784b0a2a151da16c21aa7b8f78010fcd949cc17df21f39d92a3fd70d25", - "374c20336bb9743fa3f557dc9620437785eea5b40c7957791bac0b5fbb2da75f", - "fe6c01020cef9f76bd7554b44f2b384c4488fc4ad027d733967dd0e09690b19d", - "502e75fb3c0adef151a7e989d4ad2fc3d7f3831fee2e62d050b77c790d855526", - "7093c4ebf1522196a612fb9d7956e51b0b0012cbe7c3c9c98d1bc6e717993aa5", - "10af29dcb69f14ab551ff08f59025d9f09c60c608a3845d7590a32845751df4d", - "21861ff3dec13ae263a2bef63517ee4e685951c3a06f026b7ac7b6c7e5cb2b46", - "6a4aab420d37f9cb282a42b241a17eeda7ad89b6f2117a568a39203ee5c6635b", - "37a500656bea801a55ef3053b069653e10d642bfa92b8760091deddc7cc0773d", - "4e43aba58f63427431237d36b797ad2a0101467e40651d80fdda41c2cd7820af", - "c9c5933bb6e7a81e83763276ecbaea3044a20acf4bb1b1970156b046c69b64e1", - "aa8b3d1a640ec98640b5a4861fd73eeba85879d8e3fe3ba0cf61c9e0f0888319", - "50af6672e9b53854ea00574fdb355b69ac2d590a11b7d3d2d4b59eaf1267bebf", - "0a2e5207f5a988b1b3401e99310d08afc7ddeaa459180a1be150b3893df2c86e", - "fd884c8d29a979f094f1a025d3a90f41de771db89c3ab0bd891f9cda81b28fe9", - "5c7d1b3ffc6eb4ce47f507304e8ba389ebf8d4b8ec3fce8fd6d847642d1bf691", - "b712e7eb5e11ba97bcca3464f9cebd0cc8e208253d4deb146cde1af57baf7b63", - "e977ce588e9d882989703071d10ba92abcd2714e443ab3b00d0fbd9d186c0476", - "69a01d4228eefaceed1dafdb00bf01c0a3d9f4844a29e78511bd18df2e6b61b2", - "ee25a59de9d9d0294ede35a24f3718941d3948ea06ea4d00e365056a2c7298c2", - "206ffe76a98055631d4e831fe12ef5584812476f21ebb0e8f2a5d277dfc85ef2", - "e739c7851a1ac9330b94ad3fbd6f3ebe55cb6e555cc73dac0136f269b0d8c093", - "6dd3198c91d290727cf03913135df5445165bf1db305d2e82841e61e33a80a0c", - "49c87de0cfd487d230bafea9e8b7a19cabe79d4a5a7f1d67dc4f90134a39f6ea", - "c484d1d3f9f4d7e7b977a70f40849c8a1d401cff913f00bc36844ff4415be1e1", - "ee96c919e42187ae2d32791b1a7a2560f7a96b125eb54a28bd106d7860b8d09e", - "67a59322599bec858e2d1858d4b3dab205165b563aaf642f75e7ac5607202243", - "3efd9b7274c3e14f08ae1184d9e9ea3ceee017d5bd7c21d5a62077bdbafc51e7", - "bed01ad44d262988bda91fc41b9555395b963c40935f87c6d02ec1c6b018100b", - "035f14e255bfbebabd4d0f2bb74dde8b0413ba1ff5396e8efe8030d6a6f8b80b", - "82312140a90de2212c14ade628a773a9ddaea0e978c1fbf8046dc26106c3883b", - "c22075c9cf3d5f7a190a60b32ce8a595e67f705784474fff9d5352edc9c255f5", - "261501892281d784c01cae1c7c93decbf674cb988720821dc05c9598ecc87067", - "01d583a8634ed584b0e60f5a9bec1e7aeee161b3999564beafd397e5131c905a", - "68d7b09097b09a4aca8b9793674adba31b3a5cbe785561e98240719369e52b96", - "da192af695608dec662b4052618280823a3d1c805c268e54eb431862d8a2f829", - "9ebe533b0e5d04ef14e4d2e302652a8fee584a61f4fe7f1a04054acf4593f1b5", - "6c34a86f3876e44ec786db0311235600d0aea3341d20aaca08b9e15623a56e9e", - "948ccb444e3be85c9a68363a93d38898a33cce3a08b4856ec46e95d156e3525d", - "27e73416b7d28ba7557d29109f8fe97f46b07894de0b2d0ff0b1f82664d7e5f6", - "d4c2d2e9ace80debfeedce22b44d3821ba3dfcfb48399a48a5ad349f8b4524b7", - "005d719862b1c0ac89f967cb350b443a92d361bf1a54ec2afcc32d68398d998c", - "5dcad810abadeec9c76c82e40c5b516db1a0d04b6d29da74194b2931394246f1", - "e1e99a9e6e5a8e8635e1ad8de463843ab59cb42ca618473b4cb3fad6360a2327", - "5559acbed774aa334a1d7a561a85582b898cf5813e7058de85322a1d0f1aa95b", - "2847edf1afc2c9ebe9834ae40c19b5d76e6c3d8d39513be0a356d3e7bf2b4047", - "50b972bb2008d3d6cd197dcb8d533928cbe77e7e7399cd626d655bf8996e59dd", - "64a1abf6c9f76c1bd8e527fa12598a81e722c5a7806fba90cf7894df6c451aa8", - "64c6f448afafd833826c86959cded8e10e76815dbe88f8dceafa72945e74b63a", - "84bf86e3b5270a29ae5a2551bc7707ddcbd433585224260d96a69faf628801ec", - "0ec62288308c4605c994c5d9273bd93c136fd03e6a38fcb096f2b592a0c3336a", - "03ddb7f9ae183d10d4e1f64fdff2f7e9cc1a5429e65fab46d4bd70f4ead6d587", - "7243d9f95428d5e308359ca9dd9179d5e72bb3b3878f4d1c735f4a268cdb0dcd", - "4af2f55a1594ab4146f3653f4c6ec0bb0ceaf015d892ff14d2f6831962c47de1", - "a76770fd17d9953ac0163c6ceda3f96864fbd4e43c511a0a514d204aef24d808", - "345c1482911f847f1be7058b3a8ae3c33e666a24a1a130ca2e728db6a4f36a39", - "22a904dd6065e164729b80794daddc4433b7d4012e3d62138a71ce06e3a80a3e", - "004cea60b7f71ca795d6c161f3e1f33884315980c1e237c5e3caeb21e6ab7486", - "4568f4bc235024a44706f83f1273fab31318803def60eb76aaed311cab320490", - "0cc8e734e6acece5313f22af4c4c66735811575f434fc0f0f7e71c382028cda3", - "72a3a46de1b5a4d9bcb087d024db4a836eedc463d56f83b5281380e7d3e023e1", - "a62587f506f474c38d01bee82819297d0ac9f6acac85c0bb03f937d9307bc80b", - "3fe0423bb22fded56519207037ab01e7615a23d5ddb63c065be8cf8aeceac254", - "4ac60495e03bfab75885210325a0fbccb74dbbb8c6198495a9aebab35eb1fedd", - "792f7c8392b42f447e0f093ae4baa186030fd9244c5ba71aa38e5323b5eb6b8e", - "5d4d9da8208efb9b23b39f84f32164d16363d806b2df606542a839a3449f94eb", - "8cf4d83a9cbed16b56cadf3574241b40388ceca247b9f6626ec7e5176daedd2e", - "511428c0967203be8e289706b91d696ba3df3d201cbd6d50828e4281fe37d3b8", - "786a9417feaca26e48eee646458f6a1a368af879937e285ec6aeff01bce752bd", - "13a367f87debc7c07d7deb957ea67e5de9014255d3670c9a35d2a2d213928466", - "5d11391cb33733eed14228ddb5d1219b018211103375ad3841b5023def0082db", - "4c2d1d4aff59851981093c25fc1b9f0e448763d146fbac04fc1b0a87db77ae4b", - "2c51dd1788f1412c51b5949a77bd4769e6868a10204dd3946e6459f6e274b7f8", - "d484cc4174959a5d8551c3ed8d41868ee6a7e17ccaf27ec576991187526ea468", - "51f01a8a322e5354c9359690d2636ac3e2759e3b664c1f30e39e47ccdf6a2727", - "e0afe8071c2ea88b97369c7d8194d65ec6615d94e5d72264f1837c4bf9770087", - "1c587003b313ead19887de7539bd13c2c24c0ecf778b91c11ec2a1a0b2d3032d", - "0ab716ab5d5e47e852b37a24512df5d821b6ca370b65f8f7e9e08643a68665c3", - "41a861acb33328c83a24817c89862a99f2c9da44920808de16d4885abc027a72", - "eec92f20f3116362f603640294680fbb6d8a18f002f165ac5fabfcaaee9d2266", - "cb7c244a9327d92eaa2105cecfcbda11c11045934a2ea01342c187dc08f7f299", - "33e4547022c82b61fc2b77cbefce24f6a7b9f2e79d0633f5d5260a5dd524c271", - "1c90cd3560d721801d47d87a57a5b8af1a8adf52b8a21b31d4f58c23b52b2546", - "83511018dc01579f71b990a94df4213e982fb5c1f94bfcd799142ef564d1188b", - "08f77858212886ac512c1fe3dfcebe911f9c725387eb35d1e3991ee10464fafd", - "bd12158f98ad901b5ce8566c1de7baf392cb42a8d61b0d788dc3e28845431c8f", - "0e0963f67de9defd1c55366b9610b310cf23a633f2c817f23c7c1ff4933fa3b6", - "32ea4ffcf28c619e426c8f752bce00fa1625d0f636b18cf65d275c0f89109493", - "abbe298f29e55bde6b4343cf9c43da18e3ee1f9e94c364fc34746644b0dd684c", - "eeeede91ffcb5249ed5ef4b7cf3e3b79ff5ba6cd5aeb74d9a4ca1d094ef29a23", - "e4024d194648808aee6c2f08b2f190838e52386d1c280fd6b68cb42c08a9cc9c", - "c11fccf23fe33810cab5ff627c10666592f5af8b03d181b9fc618c2685927747", - "7de7ecad06a5adb6504af0c7324294751fdc7b2dc01143c8ab20e37f388097a4", - "32c5e64983867e111140b7914851d5bfefb3432dd8e9bf07d43534c14c174b48", - "131b5d1421ac0fcd256df90ea225683427df4b12b82a90b43aec589d0b8a5730", - "e6d9301413782192267112571312341c41adafcab774bb6c2e7b7c1e39da7555", - "9edbec3cdbedf93ccf7db349de05344fc610be27fc682634faeef17079769234", - "cb349f605df0e58a3ccf596596befd53287a383e65306437793ee28b292aa79f", - "fb734bea2f109ab7baa7465cf9f85eeba498819b49b84717d96ecbee8a4eff99", - "cb931010ed77589574b999da984f787da746901012a6f5d467d069df1e53ebd6", - "d9845d9245070960b78f55cd42ac880d4f5178291ca7c781a71bb68736a7e4c9", - "3cf49942e16e187fb35c45509fc838ffe3624ac50be054c831a1bd330fd64d19", - "48f1231f2609e7e1e0e1177ac7539028bba870d6cf0f15b0fca84bde37286081", - "9a5f72ab3675c4dac412b0be56d3397610706dbeac36006441bd3d277b360161", - "42d601685757d9e5cd263c1250dbd69bbb6f3b3225dc515283ed993ea46065a1", - "cd95de1f0a4aef134e362fafa5c4a4fd1ca826a9df409fe3c11c47599978a194", - "17f8208b8d8d3483709994f97bb4e456965b6d856001fbfe78282f73478fa6ad", - "fb7d2ca04fce8f8a45b4c7a3857137b76d5302fdf0479bb5b516a6123679e37b", - "26d1efe22549cf875bcd9326b020b139ef5dcdf00edfca01de522a3470ac5fd5", - "c046bcd6a91741ef5e89668401a2a0f702730bdf672ee300afeddb368b1309a6", - "b07cce4166d48f0a2d24b16c973a847c5f01d52f74229a256bfa397a2c2d7e72", - "2770d65141dc6c36d0a7700dd2068a49532a599e43b34ddbf265b67872cdc36c", - "938f1cfef462bb05539c38b7ac456f61e3cbf2d278324ab356715cb5df9bcc16", - "ab5b9ad0bab1751ef91531061163ff337ba31b940fe3cabcfcb1d1469bca8a33", - "b41bb747b307e33b3c742c1de5e06d0a344ab1aebe42fbffef65595546fe168e", - "46e8dad8a6fae9bd9f224504eb43259efce6e6ee73c7d297999949441d0803b6", - "614daac2a4bbe45a63c9e41b5e71c0555c02063da4eca014e62ba8fc01dbe4f5", - "39ad01de481651e117e22c9c43685cdaf231e3ebf03e0c5a6836e6123da4df50", - "b0488e4fc8511c518179464cf6d7e6273795bcf71e117a80c9fa3dfb0371ba45", - "0ed754005fa93833556de1ac4db38c626eb7c7ef199fedf6747e506075097e82", - "59b61d5743681e11b97e28629c0552b0193e56c61d4bec0a3c480b65eb7d7adb", - "61b9b3f26234d79a6f9a0b55e804af705639f9968b80905d8a84f59e26f0f2c2", - "4f6d6cbdbc2e109925b13f4cec2dfc20e196b7eaf18936fbb437a937760eb632", - "6b0c531f1c52f6b9d77e214144fa6a10288926cf91bc9af1874c4a7a0b2f1004", - "68ce543f417aed47f68e95514ad453ae7c044eeb00b580f2c1dbfce9e05af813", - "337e372f330e07a974d7b0463b98e3b9d6affa0dcca0b45b6f2f3c3c262466d0", - "99627d91a3ce89ccd8b85abed23c3bb3a1aadb10e900b76e4cb725318797871e", - "d671a8a01a01317773a731d945cf5c9096b3d8744ef18c43f87883636e796b71", - "ecb88c123b93e0bc4aee063a3e3ed414f3ea3b6ff2e86ddbe9c0cace5d532e9f", - "43fd86727237a3b3de28c837504b2825f23b1736cfabbc49ea650ca8852c2da6", - "cdbbe92ee8d2546817c92bdb8b98210feb2aadf95ce3c329860433528a5ffb1c", - "1e8ffa486a9dbd7a5a3d7479d79d11462383fa670a1232e3eb2defcf0a7ff07a", - "13502c1a5fbfd11cc2e652375bd2b52a3b42adf8c3d03b65ec2b4f45cb36c57d", - "30a158be2d92ac1cf72efa686c51c4acc775726a96594b13f3ba649c53787298", - "398399147154ca64fbd69b57708253e2da6fe96dc19e7fa45c661b8148e87dd0", - "72e764ffda2fae8c5ab71c8c327207415880dee8a37d86285d485536b45d6386", - "24be2ad7182764d2ba827b3c06dcb715c04207ef76bf1fafc740f824a51f98a2", - "63016f1053d57fddd58f92dd178531b864c04e6b9fcbe0e3bcd1fc15ee89342d", - "33b11173e8a2cac607c578bdb5c02c612e8ee1e1960b9e55d8d33ee35755dac4", - "667ba8a2f3197c6b5a7630463616b5db78b477452b849f6c858fea6ff764f657", - "a8a0bc1cebcbcd830a908e941ffaffe3d83d730f6baf0200566441d8e2008b39", - "a9e96fb29905e14e5d770854403764389eadf42172550ae3f3424c46af447a50", - "a1c49c9b226a5de74e49994bf2edf783528549913a850c235db07a4f6a47370a", - "7f515cc0bc4d16d6a6b8a87549535ab5c84824c0cdf9aea5fe128616ecd12d87", - "dd9f0c8b700cb05af25783a3e8f2ba11db23e7860f95e7eb1f3b7537e18a01c9", - "8c79d112d928f0856fcdbac9134fe2a8095abbc8da27e63d2fefd72b1d7a67ae", - "c59232614b3fd41532d77fc808284ab286c21ffb181bd7cdee17a6dd4303c4df", - "273528b85aa50869c4dbb97947e2016ad4b7b1f557f5757a982730477244e21f", - "8a9651344ba8862bac2707c3f25cc7ffaedb4ae65a2fdde295d793820010e94d", - "ed6a328df84d3585e7439e8e6933fe5d8b8fb44fa1e6804770ec7e64a2e38815", - "ca9c3ab1598ea4652345b056d1b40a39ab20cd54329e25a79985ceb7ee119cb7", - "c6999b24bdbd5a0b046bdf39612949ae6b515dbf96bd145e8ff490b8e75811a2", - "b89f05928228210f85eabfc823af67a6ad6275f0c59a21ec67c2e800eff3a783", - "94678b01bed9077419f557e121e6ec42ab7e1ae3ef108ae7c7ce38a4791bcca4", - "ba7a640f52b6c20182c2354c11691a42ba520556446b64530548651f21bd1885", - "c9dfcefa9eff717af740ff098ba76c2b8993ad4e8d5011fb3aec271e75757c5c", - "bae4e90e1e224805eb29d2a55562446f94bc33b385964fe494ef6e26c25a9c3b", - "d5a356f656d351b147410ecdbe26bd8c389f427448047f1fc55ee15dd9501902", - "84c5baacc9856cf2dedd1e601a44b95609a5a41d0874286dac8edddc5c8b950a", - "5697930d336d8cc0fe0889375662d3d60d5079f0d4e9b7301398e9f92b6164c5", - "43f393c980b79dbb3599bcf02da1ea90de9f9b86c9ef7af60e0ca57551a24500", - "bade1161811a8ef97076c230f224c54b3ecbac075396b6f3ae3ee4ec28359645", - "af202dbf6d654a9e68f5aa5bea69d1f19e3e537c503369bf96377181c8ccf2f5", - "dc7c712ea41d04294e4befc2390564848bd748670589f798ad8b420aa86d72b0", - "f9dc251a0e8906bb26f138b8d2d8d56f71f1bd7c85741e951b7f69e209aa4e7a", - "ac458d5d342d5d164c5363ece07ff763dfdb0b1d14894c313647b6327ca7ccfd", - "430c2fb4c8a45a689d7697822f92de690b840cf81639e7bd81ecbc9f0810d4e8", - "687cec171190a2c3c07a9010dd4edbae0ae77eb4f3ec82ba76b78368a1bd5038", - "1f70aa7f432ee9b235dcb1f72cfd6f79a3c4a1eaeddf0c6bbdf8ab51c60bee42", - "6209dd56ce4c1c1693b893c2ba12915f589d8537dcf098f8a1f3bb18ff809ac4", - "27b135ea407834f77e39eb22815edd8bba2e28a280d0dd4ae0388ba936e7b0b3", - "31117fcb99f391b9e40cfffb03601e6261fe287117b49073b416bd32eae8463f", - "9e549283616633d9fefe1d95cd458e061f767e5f9bfbba31f362d2a9572d5a67", - "ed152f50ca189e1b887af4c22b9f41706776ff5dc89c333398e98ea707459558", - "748a3ee1029ff6e47a0eb26add7359c032403f16724a10e877ff06d0b8811f25", - "97b92b6a20cbd4c388543efc8d7fde8a80b5edfe7fbb1f7410571d34d67915bb", - "30b353e0242a64d3d5c78165d83a45f3b7143b9b6108fcaf3418a6a1865272fd", - "041d21d738cf6b94f97404196306b7a11d8d1d61bd95ff6eef79f3926fc1b29f", - "872612e812d0efa858b7d984a0cebb6796fdeff933908c866453e0e1756b4c9b", - "ceaee016dc0d6215f4c1e594118babc388dfe7756ea0e7f8c2d71a466b7157f5", - "0a1d846693cf62e0d5d495573810f5436aa784e55e127cda96abb702200dc96d", - "155ba17b55222df925b3dba7e9fd8f1799e9e79476c1426e94d91f28291562a1", - "2070746c89e63103a1cd9a78dbaf482754c0b861a4084e23c2a3dd0df908867d", - "1d19df85cbd9cfaaa013354d8ffc78d10a27a491188b5540192567fd37b81343", - "3975df2d44fa192692fa00ff23fb3791caae5b91956df0c5b0646741395f317a", - "8881d849f2fe3e36633527bb02c50af95647a5c7a723d9fdf54eb83154081425", - "c1b99abc6f242b0b17aa6fc9f4f984e091271cfe47c0a3e76b04335011db2bc7", - "d02924f85048476c5e90676ec8076aaad379aea0bfb1d6e85a1bc5abd0bdaead", - "9cf4d50e3ee8e4b06c2ea12589e3626fd4ed7940677b66e5166c594a56006d93", - "82e8a3b2f8bcd2fd86b823ee1d3ad737471d16fe15c20f7a319c92ac6e82bb4c", - "64b01cb1ecb497fcf16c392e53cc89c3e0d157d8416ca4927d442fc6e1fcd5fd", - "e300881270d53f82b015a4553ecf4ef35554a30916bc4732ebbf88a6812a5df0", - "1f2f2366a4d5bdf670edd88a5f99f203a9c91337bf586e12ced595e0b83cbe97", - "2b1383e9a6394114da5dcca63698fdc8c988121218a3685eb1d0bb4c0355ded5", - "cc9abfd2d5ccdacd3d8416c761f15d01299d6142f9248598fc1b23299a0e3710", - "4dd5e2c5543972d02eaf433ff76e7e92aa0bb25cb710a094ed16889aae5bd9b2", - "61907c21b152e50ecc88a6a8b68fc64426444221d80d6345d77db5580bfaa02f", - "526bacd751f394e3363417f878e8726004c6a15cfb28001267e35b9fa6bf47bc", - "0463d050b5f71820c830b3e06d6b1666cc7ffb11f4550d8f9560ae8dbc155c95", - "576cb76bdc88dc7e67e02608de77f60eef88acbf90c73fec6e5d1e73a43f278c", - "17ed0793bed80c1d6ee24039847c7a71edfd9f237356e63fc75d2cec0f3504f8", - "a23d0d39b24216fcc7d24de1775020ea23c5e4bfdb359c52d8a4e6ba20c6a9fb", - "5b4453cb8af82089b835cee227b3a25bbcdbd45e84993d505176ce7757cb8ca6", - "44aef9bd30ee30e6c1b159258404cc727bbd75b9622685a1ba5af26087dd93e9", - "8e66c66f73016479bcdde044d1f64f0eff4c6968ce8c713327e82a0e10b4ae75", - "b8b49d644ab8eca06f34bcc4bcc1c9d7e0a741b2439db277ffdee64157332728", - "73cbd5db888d6a61ba4845d00f950d16dc995b50ac9316674df405627831fa69", - "e20e6405a18a78e7084a25a05c5c3cf78f75323a5b18883b3e29d1441cdd0b79", - "0aa73bd49eb272a32e47ffeaa2fd4dc535664de75efad323f91b6a0fd80e8185", - "bc1abb18b1f982f87992da0aa1483d47568ce32907b415dca1d68475006591f8", - "cbf1cb87fea93dde7cf69deb12f949bdcc91638406660457f2d5acb93128f68d", - "11d84387e2b590a812c5d0803f103260158a5bb8ad6c3490d6e283be43039315", - "9294f5822ec02b222e77c8b71afa3adef366b4fc261fe7f218af63deb85fe09b", - "b1e22968313971d09557d217677de5c34ec64492cd1955e249bf68f4aa18160b", - "b48d799e02470e877559eff05cc1e71bde2677e37410e70bcbcb64f8f0888009", - "fed5975991e2e7edc2f05e56939e894ec7a2841bbb216b4e0f111a859dc36565", - "8d6aec646643587f00415c2fe384a476ddd80b1c7427d7b1bcf3a4631821ff4f", - "f029f73f1c0acd49b7a81dfb7bfdd0b55b002fea94a7c6d4e62c048465675f7e", - "437eaccd0775000fe13debd2ce41254b7762e18d87ce074c5e0db5405916a334", - "37d7eeba67c4aba47844d5bdd48e895b4693656b2c73db363cfdd464a4826009", - "cabb42386732f41a5244e13c59fa706f87b12abbb54acd1d822810d327fdd150", - "b3460809fe96eaf0b9ece1e04bf7cc552bcb3605be97249e295f824ed2a82da5", - "d17ad2606f9c16c0dea4ad7c1428d56208e13e509d21be1482880b40762e305d", - "e582a2e27577d715cdef88a4813162127b96a708de77cc9d8fd19d3bd0cd8947", - "d96145592f4571186eba94ad2794ae2e3e08d9115ce58d826b63dd382eaa4800", - "882a59c39dfb152c55bc58d245f7915d22baedad218809999e6734de4cda341d", - "b183eb49518c5ca306c87946cb34a06d5fb69ed142afc5a95897586718471a2d", - "4133b69b67dd5dfe3e69802f0e0144747b49e1eb4f9e5448b38333cc325e270e", - "8be8ee2e22e6cf8cec81e692b7d1f5172067b10d5a9831be3ead73aefc688cab", - "f5c668125e11b866cbc31ab748c43744bffdc5b3fd2367fc80d35d8654c7d097", - "490a2c4f53f80654a4000a4717ded91fca7cf0e490da49e4eb21fb94cc09363c", - "e3a165de2d06dea50f876c301e04b6d5e1d3c2b09590f67fea5698acb08e0288", - "488405ff4844975944c14288244a681199e30814260ca03e654a6748aee58abe", - "f4ea18e30816f6c29abfc7407ff5afbd1009f81100c07990bde46e25953f509a", - "de8c5919ce4eeb5d7553bf64c22fc8f0e26e5706e0e9551ff926ca7a6b679c39", - "691f434eaadcd11badf776a37a539e78b93c067283ff535e3de0a42a74d91598", - "42731e521fe01e83d08e67b6eb0b71e8c5613b5e3aa2c4cecf197e7177bf4578", - "a45ea323412c9bc0eb8dd32d64958767cfbc2cb4ad3c8ab526267a5de09ee023", - "5b155acf1fabe06b346a5f7df9e961cbb139e5eb20bb3400cef65d6c2f1eb919", - "a0e757245e98a03f072ecbe5a720dfd0fc8827ed34e686775446d229fe6ea266", - "6929be81995eab8d16072977ed17cfa9ef52a6d209c1ca287cf3b8db9a6e73d4", - "01f53cea304db2aef47fb46d6a2fafd5c20f54f837b580b0726c38266be68edd", - "c5b2aadd39c882c488f7be876edac1ee0c071e9b4d6482dc607c6cc524c2c675", - "0cb494b4f0ed968ff2dd8292d4ab1e3f6dad0db0cc4225bf79f386de488f77bb", - "161cff6789d39de0212975366dda27b20ee910af6b110604da28fc0878ec7dae", - "85e1e63c16c6de194de5f01bd44193777918098802aae4151982c30e431ae4b6", - "a04166137a4fe52bd662f8f3871a3b31d77f99a8860e52c0e91a102586d438ae", - "a4bf7198260258488a995703442019c094c75318b512b615c2a7742fd62fd2ee", - "1901a7ac3c6f088a9546838dab62a746acbd8ace8368ed700cd46d0c51e475a9", - "3ce8e43c3b64c36c5d06510fd724d931892f8818ae9652d11f02d5ba69b5caaa", - "6523b555833e2adc1191510ddd8d3f8de1d3d8f3b54a74415b96b2f4c98cae7d", - "f7bba8b62b3734e1b1baac192d63a22fbf0e73eb808c4bc95bbbb07be0cabb25", - "5237e09deea5eddc657f302b9d78a65047a071a5ed99f731530416ef3343051b", - "82b7db706603dfca05f0cea730f95971b366a1cfa1249f4304e94d3f6c175257", - "69cf5b5bb66e85af9e82bbe0babb12036801c1fb731ac5fe1760f5f801124b03", - "b84e6d536a19794ddbf48cb5c326124ceb63427c610098f74f606c7d9b286b64", - "aa229885829a6dfaab78fc5c134b4580d5b4f44c7ab645a23647b094f6d188e8", - "e8ace48ef7fd1dac0884c113f4fb085579f14803b3bc508eceed51fd00958fda", - "ef1773d6566256aa6a64e783b4c0e6115bf0f415f83a0ec5a4e6bd9154afa6d3", - "4efeefd113a4718fa7ab683a3080e1232c2ada7d00c6a486ff13eaed2f04dacb", - "7576a4d947851c04d5ba738930e86b1b92f1f11b647e523eb4df7f9da7fd0daf", - "c1685040853e304616eca685506e2087f8390b5e8a77eaa73c2f7757a50ae965", - "94b69906899a2d400a4ae38a38d152135a6eb390fc46e08c2e1db9f9c1ea03c0", - "01dae4486b42f0025167143334320eb6ffe64b5c62e9a141fd0f3c5d94ebefee", - "559f8fedd914746769f7e856c706a25e5d05f928fd3c6455eb663c6024309428", - "a3f055c6407543590bdf5ae5f2beff7ba45df3c05d9cfb86dd5d55a9bc336926", - "124fc7bcfad333ec410ff5cf79dffe0bc204ba56fd0cc59c1ed28472e2da7d83", - "92fc7c3aaa1594b920725ff0e19aa98bac9d409b5eab5008d4af841e34da56e9", - "6c3e84fc85152a9ea313cbd73a31ece5fd8e09b8ddc1642a93a238955e7aeaf7", - "f61ee48817fc222a81119ff4389424fe4621f5f2d7c7e34fa59bf68e1737d42d", - "b979ada7664ecae05edf21dba1522cf951116f76024f56353829e70f476948dc", - "2c482645ad24ae7f815584c19c8540c998116d81cf380ca842adbbbb13ca17a9", - "2df6262320323589ab5d31d5734e5e7d31efdbcc50e998d36e19679352dabd98", - "126a250a5ce37b63eb75ce75f3f2c952862c245339dd116bfe1f40b073e71d22", - "93249a7b3507b553dbbe74442851e4018da40d142751cd89de4050e75ea46a6e", - "ab7b5458a16ff50ce1dbc1e79efa2de41c06212355211170013eee8f9f007ed9", - "735bbb6d355328313c9c42119d436943356288bb33004e0052dbfdf607a92ab5", - "839c65bcb550f82f0573fbe77283572b59f930dac90482e538cb2217b930d6db", - "419f9ecc8cab335283c583ee9918ba66ee8b0366151d2cb2ce80be25d1ededab", - "665b583dfe6f1454a0352d4d662b4b41dae24685fffcd46dfa3378e27e9aff2e", - "04bc20b56dc5e4f5820a754574ff6508ed6c630f60134bc547323fd6a564824d", - "0894df6c90582984257ab6ea1a810c7c75e3d19f09a5f348df3b7944d340cc59", - "b303ec5a6d5ee1c1fe99b65ab11e8a893f0a181e40ea3f419a5ea6f2b8272b82", - "84cf899ce7b4dcc72fd551712b6b79329a0e501ad4073aec54cd67270d484984", - "aaf0caf1072471f7c48b1ef703af224101afaa0678a5fcfee57c52ce25beca28", - "115a5047c077dd58bede1cbec1c0898d105d10188d5da68880623c37ca7eba5f", - "52eeaedef1cf5965eb449e02b64d0f692c3afcdfded23e08152fbfeec86a16f3", - "890ea78522137ac3ae77dae60692bde0d11f63e067279af5079c502f14c6af08", - "0ea5c75ba8e9821ce346661fba5eadd47b5875742e3cfd95403a30242b89866b", - "b7cf9d99d1210b1dcdf738a0e662ea91d5a2015fd907799b9fb835199e8dcf2c", - "aff413778af150a8d0d69dd1ed845d294a77bc98f3152f64548170bcf7b4ba74", - "987f7f368fc8337c17932d47916c5a6868a341313930055e76be605d75cf7055", - "4a73e6e07399a9009ccfedf82f139547b4ed932317676c766be1314d72eb6ca7", - "7afea8336e9c65cd91f0226e39c4351b5e21816013c43b8fcba8b1a1d582d18d", - "754da78923d10fd364bf0a9d5f880518e8f28a3f0fa63896f19c5cfd483209f3", - "d53a06c5c40822581c94ad8242f52ebc41ad0c3483759db0115a86edc8d50ead", - "0f4050b1c8d483b45e86b6a15b48b0016e558d821822da466422b8723692e705", - "10aeb27a7f86f473a892f2e6fb73ebd974bd874d3908839027abc870ba453b5f", - "de7e69bd587895b9235db0824d3137d432edc745960ad8758b8acd06f35d1c75", - "7a41b2388c133195737cd64761b600184457fd231c565d3c2318ecd913bcac7d", - "18f16eda32c9459386320e3beccd972a7b8ee9b0c7c924fd0ac5aaf0d281251a", - "465b418da9b235c900644d4ce5c2a866aa87eb3c6d94c4fc125e8d9c26543195", - "57ff67c7718f3e5894e37940636642ce931c456d3c087f777990a7e38a4b58f8", - "a9303c30978318d5e388e7218654b232545761235a07065fb1ff03ebc1d5bc54", - "64a889bd15cf131113a2372121b0f630ff64260dfb590399f139b39acf162327", - "9d2cf341de63c6926e3eba104dbbc64914f8c666718df108fe890d5bee9cfee0", - "9cff5bad00f50cb678ebbaa8932bcba6d71ef574b4af85ed228b01d401e12b66", - "904d5f18cbf89d265f85e819b66dd451d7d4600e243c9794ea4d5e91e05de3cf", - "a6da5c331b45e72fa97221dd2cc51561d4da5e1965be91c516f3f8813c248b88", - "188269442cc714fccdc82b685b1998892775ff4ecd0499263b55d17dec4dfe2d", - "4a0a95a53fcf64c7a77a2edf0c69cb10a873a2b568e1e0a2d6389a027fc8f7c7", - "29c626a158654891a83d1c1d17cca6ea1f166aacd69d97fb708016cadba1998e", - "a9fd1b4e61885d75bfff3418d004366ffa012408cf39754eef52b164f5b7c068", - "30b81d7d0d1016c525f247b923eeb5d3958b3ac1650afb5874e7f21cf76aa8a2", - "7796ecf1c984086066473f2278b4a0a96e2e8515af5c5967477166b085c4bcee", - "197854855020b115a438ebd71853870a482ad28f4f5877538b5dbd54aea6804d", - "ff9c4ec969cc5c02f0cbc3d3d6dddc839ae7efc8ae18391fd1880a8aa410f9cd", - "2e0357de6139ac156c73cf56edd610605ae5a5bee48bd4898eb1ca51cbd2c097", - "87ba33dacac93e9ec599d7ec8102a657174eb63b5dab59c58aa0c0a6f8551cae", - "d714c1a9c23f8e8a3627e937b7c0dab512692e4739dd75788c412c6fd8bf6e6c", - "6eaa5161448ce70891a56e7c444a623f94896ae44ed5a274777096031b63c87a", - "225e2084b02979a04246c471b5e025334c6a850326d23950cecbe985b29c6b3d", - "b665ebf0dcbde16579ff1966b160d91bc362aaed2a7adb02f324c786ef4ae66f", - "cb36ffaab23005e5e7b100be79bc58e1b6061545313f497f85bea4dbfd8e0aa1", - "c143cfeb63e3192affbdbaac58b418c5d460e5d41f61114e843318fefcb19f4a", - "fcf87d61397629f87bfca54b49e142fcfc1224bc3e6069261df47c5b76ca707a", - "d7e622b0db42d02653aa3e5d4d8c4f535b24c8963f8182d8dc7c27d5b7bc0f00", - "18e595bbf8b6d920088a60afa349edcdf9ad0bb630e528cdd65128d968218f46", - "c82a776face314506d14afd5c62664b7b427d85d923506a88735d51ffb3d6b79", - "ef4dc895dfb051c74c0c7c7bb312bdf076d566cf0414d3a4f0f5a8296c4be4f6", - "646d45117be0359ccbf2ec3835d4f7efdfba08422793daa03cf19cdc4b8fa38f", - "6e894b69df3f6cc97bcb96184febb38d3abcff807096d04423f47a5a450b2411", - "9cbcff9d9014de309111f93f00d5893caa9897f04078d8deae3156dc670d512a", - "0b16586ba4ecde69b6701e1036509326dd39993beae08b1572dfea9345bf645a", - "8a2d946df7ca79749fd1bd686ac06791d9ece7ec7bee491607cbb41aa951352f", - "af1c9bb318f91a0d2f26dd852627c4509e0e35e8f98660ac92a3495a0d4198d8", - "90d220981d3a9ccba152f4d27249cea4de07bc70b4abf80cb1fec46f2993de0e", - "bda4590e1088a953b5d9b2299a600b71cf593dc467c2a24d5693a91518b8c757", - "edd1a546f1d3772c25288656f538456647f1c599b88c5370dd27efd1e419b020", - "9d77432fb8d1459e9cb5d4ecbe92fc8336b9430227bafffefe5be5ee619509ac", - "80162c25f7f0bb298648444080761eb9e4fca75713c86883464756222d366404", - "e55532b96e06521aabcef207491fd3ac88fe4d6aeb1ea416e8de646490cd09c8", - "b6c88ba17a642ddd10088c54dbc116f5ad6a43ba7b91e6963aff9173d067b0f5", - "8458b37f963a22ad404a44034df620775803238027b33e4b532dbe37c3606cd6", - "6d5cb1913ac0b51295d6c0ed5e400e3a549aed0db17ac19119fc5bb9f1537ae2", - "7b60c851e1bd568ad03a99c2727c3b9dbe6489a23a35699b9be65ccaf556592c", - "e3b7b1281c4b184086a08ab537da3a20ae84371e47e31fc3513c2ab88656841c", - "55e266e6e619d638099a94469da3b8f804e8f10bcd5da03ccbc11cc6606ae6ce", - "383e00f26ec00e14030a34061887fb74c15ca76f3b3370e252e4cf92b94363a8", - "635c54d7f87590d58cb24c6194972ea47aba4056a7bb258bbb7e738f86feeea7", - "d2570441c3aa05b3cf0245d1cc5d6092eef533af6fa477a2c620b14df1fde1b7", - "1b3695f5a475211a22f23bc54d250ff325eea0077c436a0cfabca85f1964461a", - "999397c26fcf9554fbe7efc76d26eaaa6f9f24b495b2fdc5317ec9d61cb03399", - "6c0239fa0381d037f9463c46f624761f737b265a6f9538ba8aab002b96281805", - "5f3af93c0633f682039337b4c1ffd966f9fe313989951c2c7de9de62edfcddbf", - "3c230924fb5149505e86caff8cf1868a7bb17e9a8194e4397642e8a06b909513", - "19d50bf3ce95da03e10cf9a34b5dcf74b4c7e9edb0750e1adb7aebbe8cd87580", - "b52a6e64a058c03ab3404e12196d20fc5422c2fe232b13e76d50daa425045c5f", - "8bcacf6abfafad3052d025f9c9ba39e8df26a3b0d03336490c63d2903fc18a9c", - "95405414b855085fb201b9104990fbdc6dfdd34d413c874fe95f41e47b3fa0c0", - "4ea9b6fbb4fc2e3de731eb0f640aae80034606267a45e7bcb5db9772a83c4f48", - "1a587976be56f3db969dac2abe2acba72aee7edbe43a7683c6d49a6dbfb08f67", - "7dd7d26865737c5d95c387698b37adb63ae93a778616b2e3816f9f6535c763e1", - "a6e401416604c2a4438d49f8f2bf8b31422a31622df511dfa148aa3777238727", - "1ccf2603e3c9611e41b6818a255c8a81e3fb7392a042cbf2081fe13d198a8c5d", - "dcf4c2642ca256346bde53a85083b6a5cc0c97022f5c1431d2abc06f6639b61b", - "06bd18ac78062b900978e4ea6aae89fedb541ee71384482c4ffc846a74239d50", - "622d5f5347e1012a2166b7457700b0e784c2f237a6cf0ce6eeb81638ba75668d", - "a2d0ebe0f6e019874f0ed58800e79c658cd74dc04384b4b5c86a1dc2cb214bde", - "fefe443a74adefc9930ea1d0b52cd3c0bb0f9efea09d1262cb072d609f0da381", - "cc20c5e2f10ad81964bd7c09b4f25c83d1bb4bb7f4b0f34a041453d94a922fd3", - "38a769014b9d7bec35384b68d6961f76b37f5e87d838a25cad38e25d31b608fb", - "ab16f552228e82f0feddc8609c67dd8d44870c3cafe0b4d1bba726e349532290", - "0e1246cf18592dbf56143ddf4e47ed21bd6c092b8cc489676fa6797983e340e7", - "61d1f4d703ca69d4246229e839a8b6816aa3299725ca85c5e33974783aaf5a65", - "a6f7648be89ccc19b09939e85b0c819c8ff59e3a68c54bae691405f76785ccd0", - "fd216d923321c788aa98b25a0849c61e9d9a0ffa16abc04f8b165e82f0caae56", - "d1db5d4c4b1b1195a1f10f399fd43ef0d115a5cc67675ef915a56ff13cabe226", - "d783774450cef11c776b96ff7458d9eda001785d24ab6d642635f9857b8751b1", - "1508746b79f93611a46b0d34583435fc3d6b8a0b57b1e82b235f23f1fe10d684", - "723045768082c995dd86fe5acaadca9ed17ac0403c12255c9db7c0ccddd028d2", - "271bc684e58cdba4ff34693d299bea26930d569d1b3ea1f2e26dbb18d4a62e14", - "45e5a5f8a84fc637f530fd7005152ea60fba4b01298a90515793d630c47bd36e", - "293ddacd9f46a290e9ece9578d2f4e0b11c1f85049c11b8d467f7f2d8ac4cd19", - "463199f4caf47687d2b0d482dcb97babd0466c6fd3bdbc6e2062ccad666bdebb", - "3fbb28450aac3c9d578de613f9962bbd9b4c9a2000500f3c38afee6a81598646", - "89ac9c5287a1685fc9536e6f3fc433eaabdfd9330217865ee985a078f4339784", - "5c6a5fb4ce25779c34f2c401193b92c48920ec96c6a678ee78fb19641ded9d53", - "d919d7bbbaa9c357f152bc1b8c28a9ad4bed5ccf89fcd7b2f03b9755340da4cd", - "f9454fe63586fc1c79fa882f17d390420f7d9c0c8618b2fa880aa8177e575931", - "16e76f891dbc753fe6b52824cb5ea84009c8400c405745311aafd97e2b4f2717", - "5aeab6a939d4223de14f4d2a29ac0a0771106de8090b1df19a08f55644c98edc", - "c728aed84d625a9f62e31104476e64b2892854b0bc72dbfc4bbd6be3b7e33858", - "2da2da1333ce96c077731907c5b13c7bb16ba5799862c35a0d4201a44fbf8a3c", - "dfa0784b25d1e749c0b7e65d0cade825d9d24abbe69513606092a331157f24f2", - "4985f5ca3d2afbec36529aa96f74de3cc10a2a4a6c44f2157a57d2c6059a11bb", - "cc26a76b864c42527f0c85380e2ef7d1d2ff6d981d44a411ffe8ca916b0317ec", - "050b95829c208021df42e8c0ae0e8cc600df9a9e6ec2a540386de18b00d92c18", - "8d42fe1e7e6715f10e05db948f132386355af680f29bcc59556ed111a8c7d776", - "3a7f2a1787571aa5022965d045e8c6e13281670c6d8caf00d4684433d8c4f325", - "9f95c6ac32f91d9c1eac9313e1c0409fd30e0b09a2c46b9e0195f93643dbf031", - "fda10e376485be47a7babde64ee7fb46b7fbf6b3b02e3bab0914a32bbe0614d8", - "6be4211bd666d16f00f1a0c2852bb695d1bd13bf9af41de0a13501e09217edff", - "d4d54861b7a4490263ef86dceb4af597f2b69ac96fe12cd02b0e25a2d2c38c4e", - "19daf4032f3beb4345573d2866f8c625b1822e14b36ddf48f2890e73e714a760", - "f9aee278ad7bd8d8cefba224160a20c5039ca8c9db372ae91d2f04e4f58edac6", - "e98be5311f7040c45fff523c7a1983f922c097dae5e5cf65f82579aad6078d75", - "533689337ec54d51f5997a959fcb5ffdf66a8e67c752f9b08a0c877cbcb1256f", - "b33aee5065de0997f94806081e192cc97a180ed417d7894088e0ab899c74b488", - "b25e51ea87de2828d35e0bca81bc142ba53d3924d565879ac8517f69dc920ee5", - "f1efa0c1906a5716af429146ccc0de82214c3ab2a5fd83ecefeba039937d9da2", - "d5831a5de90dc052b95645697ca611f2009aa223c6a3b0804e3696999fdd45fb", - "ed8274a174ac318f7a20bb9785b354d69e65b0dbd09368a7dc841622b8a27bd9", - "7fe36e1b1a2c0c9a872a429d929cafbd0146a5b3d53e63b66d70320167884322", - "c591cc185c22c1afbe5d821607414cd60cb2cdc60512f5d8cb578852190246c9", - "7f6a09bf8bae51fefcc51216f0482a31b23748f99007343950a72760ad39f60e", - "f2ea43636efe13d7e3a09b111901375b501f5ce28b73f332800a8c3135b3c908", - "fda8a485daf42abffc97eff957c796d1209a7184b7df0103a13aa1644e3b7041", - "2557a42bec7cfd012e5b144eb7ed0a41f5cbc38039df89e8d91346e3901b1277", - "e01b8337171a9b41a72a18bb58da77cb6d41de8c432bb4ed65d892595fe033f6", - "d56c66da342c223b122deae6f5db40e492bac0dec675c9015954350c82901685", - "ccf341921f08efc68375e606374c848a2cd79d070cd469f0d5744c614b52b672", - "c5a0385866573f7d721ce193ee4360639c733743267bbb0d689bd737b3623b6a", - "b7de644cbf416c8551ecdeec4012fba3e2b335fdd16296c42842a2c306f9dc3d", - "a002036f73ba8d47e2bb0591b9cd4f9409cd34f6c6d6a6a715f076f41a1b20fc", - "4ac20610d1f8e4b4f09a536ba7d908b820dfcd2358352f78c598eb6426620eca", - "ea8794a5905b0a9829233fe3d4def4ac0eac3924d3ac5af4a6862c47eae3a821", - "851ababc681640d1e934356f839cdcf1d84da877665751eb902fe40110d1b594", - "3e7bcecd8b5df8524e7d946ceaf9e0e6aa0c8009a8308580bc6f955dadf67a86", - "493607e7a42a5f1134e075ae37ea88020fbd8c0d1ca4e2f753d1fd0d02b0b664", - "3d1cd27769754b8d4b24aece69e3c2e81a90488d6fbdcd8ca0466853fdb7de63", - "355f7c4473e12f92cc17cdcfde878c71e6b15f6d37103b3760f38f17e2ed03ba", - "5d45dbe6b77a1c0f9d38b8bab34fab62c3a558fc5cb166f5a730f16bd8072da4", - "a048be32a52489d05e2ea5147341a0d2fe8ecc437515dc7bc53c4f773825d0eb", - "6d07e01fa767f496b8ac9a7005b6899a8685a2cfd7fe086e0628c982ed2b9a22", - "b9285ddac9cdf4adec7e9e489e467e02b5b57ed6cb900e439f385a315db5ae8d", - "a626642bed00caeee4125910e103eb04eb9418ca12c679934561dde079f26482", - "6acf58eb53182aff3a3eb78504a7069cb14bc5cabf41fe3bbb516c313d5d6cc2", - "ebd90d304d90bfd6d363a469eaf3b75e42d92e4b0b3f1ab18e377da7abe7985a", - "fb19f1a65fb4f1023563481bd70f5c0f08aab60a7287636c15d01189bac89ba8", - "568d1556f5f409f259fb0142644734a8151fa94c5b0f279e751da6830231b09a", - "b425e3d4c125a1fc3a16e04bf3348feab02060a3db7149b1c7b2e880cca4b793", - "74a265a997e72483ec12f6922ddddc7be80dcadf46889d2a146d9ad7a6833030", - "f3bfd3e62e1b463d2d1673bab0ba3b4425da66cdf24293464e6cd03437ac943e", - "1d3427e5bce9d19a8f3220b9b3a51dd8beb6100cdf83fa52ddf1a5f89d5944d8", - "57194b708b03161dc688502f14cdfdbdc50ca6895f1c63ef3a587b513bc6e4f6", - "a58835f54bcfb0a6a5837c07ae17ce6fc1a7373e9e68c4b89cb6a6108afbb1b8", - "bb92940e15abc9d421ee7d01c2b3ed337211d01fda7344fec7b65dcadddfa7fc", - "ac0094c5e35d6f52433e129f8143b0d62d40f365875b2277b408a54d6099bbe4", - "2de113496f7bbf786a68e2487da84cab4d6f3a5a5938092d0bc2cca716794654", - "0c2ee6203a6344895fb55e55dfa8e2cc4cae9e186bcd44ed7898a8682facddc4", - "6b13321218fa5a31f1823577400d4ef71f25c3d76beeb7bf7be6c3bd4cb5c197", - "6b61f5922c2b3dcb3ee3aeb7375f76d6f84cccadf11fb145d5c3dfeed5e59669", - "373d8d5f17a28005c024f186789fb10ff6431b8c407979173ba96f07f8990c64", - "11c7b91b3517ce84eca8e8dcae0eb0da80bcb25a292cba3d78f454ea99857632", - "9e320c5e7e56b0e02787d53f8da84c096b244b34111191df70c923709c800d57", - "5d662859c14c06eef53a310192a9612bd04088a22a1f51f53379f830160cd6e2", - "c3cbfa0a69aa9870d3a5169f69c7203a0e876141c815e55109d290a6e79c70b9", - "c3bb364631f871048be2545e9fd7bc2f5629e05312ca4adf766340a6f763561a", - "a54fc5ace6f9819ea29a8748373431c7b63e0ca427eef36741c7e6d630a7d52c", - "ef465bc93fbc9bcfbd8a9aca3fc50022444ac6abcf610267cbab0f5d82e0daa4", - "3126017c183a993491f2f50d43860169134c2cbbb33124d055603af64c018962", - "1923f351e90f2c9249779c449763c561c7f19decbccff0c529a21adb7bf13fb4", - "1d8c3e99642f93d4306ffc3ad26a0ac37b5309f3e9d74d5f713041219e2934d2", - "df9cf6bcd195ffca53fcbaffeefb08ac34a9b3be76c975f334ca102f79c2482b", - "36fb819ea0167527ff7498ad1eb8f7de3a856ca447fdefcc7b637cfaceaf0cc9", - "f026ba1c2476cb03f2191e473b35d39cf168f805996f4bbbcb2d1bead6ca68e8", - "607bce8d65f140c403f4c46d296d99cdc479121db117d5afe688d6dd0d27d950", - "9a94f0215d7c1a945c6bd3aa18ddf960576bb197d7e19adec36305d38dbc8b3e", - "facc28118ef7b0928d17037eb1ec62bae0e3e22e401c3584c1d3ce544fb97556", - "741a5421bc15f1fdf60f61a79cffeedfaa40c2fdaa3ab93de37c708029b59a54", - "6560ca5e84612643cf8400eabcf9521d004c8581ae67954b67199272a7e9ea0c", - "aa258ad858965b53408004fccdfb441d21405c7ed869afae7afcf8e1c739bd74", - "2f7776a0a0a23562ac203939ac1c6d5ed5da3700cd58884a6095f1a7e212fdc2", - "cd8ab0c92070efa9beee603ef95fa841ebd0168b1bf3e6cc0846351934dea70f", - "23e93502bf823a96984b61f7d623943ce2797bf05a5befc2f5bcf24e095d4da6", - "03f9d96eaa077501b6f70e329982e73c5a1079b5859154ef44465276f04c336d", - "bd4cc5a94a8af67ade5c32cb3063ce2b0dfb7c5428f70583622a2717ce543d0c", - "d4c1c37eed291dc65167fdd5a434d88af82810bca57d6433dc127341aaa54988", - "67457e4d5a6bfc2119b680176c2c4603bb091a253c469c3818e984b359d83645", - "cca82b976454ab56d2b19a90ca36beeb24c42e7eb57a501e3c93fcd809b735bd", - "cf5815aff82d486bce93a1be441b3087655fd206f0a9e7c11cbbb950aaa64467", - "0b60e643a31af716628014c6a6d531f1a2957945769c40548a4fdd7acf750bd8", - "51b5d5391bfc965ce57b6060c122930a76ec20ad12d43831a98286f1c7789397", - "b7fe347f8060803025e67d5efc10cf022bf5ae7681314f5804e8ff862fef0c9f", - "ae0b9fb0d40bf49305b8483cc61adf9bd4671c54b8126c06dadd72b156d4f9db", - "086abb64347a6f733872f6d45214dd58be40d8fc16865beee9f7dee418bbe67f", - "147685b38f032a24021d013217e1fd2b742b75b8a1bcd93af607d6aff83860c3", - "e702a0df30e5465b4841840d85c3f74faf112290447376f4533bfa87d3e8ea76", - "478b80f966de2886825f98e886391a63eb9c4afdc04f0eae9587599981199443", - "0ae721f6a721a31f311077937175ba8a4965ca76b9598a37ac3f5e2c90bfb6de", - "cbf54ed9f927e9c7949c3df80481dd929ec41a6f5986fd2c08a9e3a21ba3ff06", - "eff260de78d0158652d3aaf9307b9cbe195cc986d44b247b839651485104d449", - "237f29c10e636ffa2eb9d9c5d489a4e7296ac92c9580355b95cbde5eaec345f7", - "cd66ee70701c05a12c4def8aa26db362b3d917681d5812fe4fc4953ffe9f7b48", - "56e9fad2041a8f4f3a6de5ff6c6284c9ba4c60b725f282ff5501045bbcb60cb9", - "47b35ecd2d3cb0a0eccc7b8bdc9479cc8457a42e3c1d8986f3945e1d59d1eb86", - "e7f105a5496178e963deb89e105395077044f83559d2bfbc1ffa16255cabe881", - "583278503e84b8b46fd6bc2070d39a99478b23b439406afdaa2689585065298a", - "0db8815858f1a0afad3a7201eda8e0532ec029abf6aee5e12cf89735c331e76f", - "5ff9614ac5c5adff1a58a476d319357cfbc6f5f17036c54b010374b5bda241aa", - "84f82d5ec7f18ab10e8ad0da39b9797973f0bd3a9a87dddd75106f530d400c82", - "32fdafcbf2951669fe639f3440316338e78c33b816cf5a70b91db249d01f30ee", - "a4d7bf69d91fe960362bdbafe9568134acd2354ce74a2489aff3471a35cabf21", - "6282b0277d40fc9c05cd6834e38b4275074e62b8b79044eb24921a574f483f65", - "095559e02542f2f0a4172feda54dde588ff5b72489b6c332cab79e27309a8300", - "0071feebd6fecfcb70743accd8e7bd1199ab7e46f3af52355498b97d93968c61", - "f033a8e93b07300b4351c7ddfcbbba2e6886d879a60b7b3ca571aa437a25eee6", - "53802d8d32fee86eec77be4db06b18cfe57f8f4e8e7563726cd95828cac589dc", - "711bd74121f3df336ee0a6ab5444e477b74de28f8f8c360c4a7b64f3d50f1339", - "6ba0a4e2e28516e585dc9fcf99e2d1260013cceb63073f4eb7c82f08c04c3117", - "8d24ba23836b8a844c6f9a63e76946a75b2f36d564402653ab4d2a1423ea4317", - "d12a610c41efc62793308423534b13def08a730fbcb3eddaea5bb718175b8a28", - "fa4f6afea6ef33ea6815b0fb2feb0a1b6e90e490c5b7625fdf14ccab161ee328", - "517a341ac3539bb85852fc6c19fc1a1eab38eee6b2cb6e573d33383600ca875c", - "088a1c8c998ddfeb94ed767abecb22995f97413674d83af798986585c7c85af3", - "5f02f0fe4aa11fafaa288e936af2829324a7d6e39be48f09253021a92b3ce984", - "d0135368a55c51e4aa9ab84e3898a219774ff2305737e1d6568cdbbe288de6a0", - "2a0627ee4dc64946961df3095e627b63780467f1dc12515611f1ed8ce965562f", - "aacb241feabddef7b0a9b1887c96fddc004cb23e178e7f5b72e7ae52d0db9d48", - "f2b27d941d94c1546d7bf4077abb94ce65f281dd98ddcb115271e208b0f8879a", - "c219978275d8db71704b8e46e63656774a7a99a150720268e8e103df44f92c9f", - "2744ec547db3c7c9ee295e4e1fb2002f2015253a40181095d9246c40b1200404", - "fd3b194d413a35b27b3aaae4a03087f117377c2e86fb825710cfe3571b87d0bd", - "fcdf2e624110f890c2e828481544419c6a55abf48ba6052b9d84d5dec0b0a1b7", - "e34fedc2d485029f409d00b80ef11bab4837a7c3ce2d123c06616e9e30323e81", - "f32dd764d6c8a7984c17d2e3ca71b09522c591e187d35c991e92cc4e43525749", - "e0a76fa5ee2edc9644c5815480b5c2188c345b2d33e8038a419a65a0f22f5e80", - "6593c1d09159109b512af73bfef22b576bf658475ace75145e57e3e9ef9d4e0c", - "fc97a2308a78bda549135283c4d1eaf613441256ef53239a11059a72d113fc47", - "9e9b3835c48404c70bff39b326733117bfc0f4bbd54964062cf9008dde9fb061", - "464c1470635f50227ddd3986782d359c96f6ceeb26b32a0565ab109f1f6704cd", - "64e45bd95d93176c9333223f04bdf0ed385ad5b6ad5f75575647ad992bbf4f6d", - "4dff2e92bed840917b265adfdaac83620b429e0c39cf023277829cafcda3108f", - "414fd611f0d695b1e820c2e479a10d4101aacad52a96e96eb69948973288901c", - "591012a1621a6fb8be4c48dde89430807cc5891384b3ad68b00f904d31075363", - "8aecf489f6dc0c8128a70ceffff36b1145e40fd2cdce20aa66fbdd9d5315d8da", - "0d50dd6534f5339078c4931ffbdd994dacba90779f370dfc2ac6f14f0b6e3711", - "7fc248e65bdcdec4548e182e92c7c0d2082229e18569299fb144a139ffe7eec1", - "d228111155b0a41595e2af0d3beec7c3ad7024a27d0b22c3a34dddab9826eadf", - "b1cea5eaaf42e6295f03d255d1c8663a61cc8f2591a3036832d87481d507bb79", - "520f9aac8ba3424db9afc45e5cf42127c893542af2b22554b34e8471e5c06a6f", - "4b279c42ef2509ae929fec8f2393ff238badaee8cde2ee75560368c885543344", - "09bf805f2bf7619cc2fe62605d359786c04214bd0a2e03b2aa78119593517718", - "aea2fd27e6674843f7c91a8ee36a5ab07a15105f21f5ad1fa877867ccc96bee0", - "d4a1f7995ae180f5e3b67ea70f340a9e7a5bcfb923d96da48c1a0a74a899a19f", - "333a49fc944cf3db31f000bf2030898f2b19121cac81e4d5dbbfca6acf9670c0", - "33f8d0d51a83d454789cc2963159179937061d66111d7df7572c2d3006b5119c", - "596cbdcbb840ec69cde0ddfdfad010242c210fced38122f3bcd7e95dcb47eb94", - "98c57295c05beb04c22f67c1cf46dd5c9b491a34d853749c0476c39e238762c7", - "85e5a765c7062a5feb614e8ddc52768edde9c98debbc913eabe22cf0c1cc877d", - "13d37b964d51dbcc47020c3ffaebe2a32e547343e44ae0e25fe935b969707978", - "be06be628ac4724dfefb80c450bbc406b33f97d55586901434107c924505d765", - "8428bf3a7443b75f6f1a13e3a9e10e3d509385b10069fe1f8fe4a5ebc07a3108", - "98921f30a71eadc8f8c3b7f84be0d48e4240334737997e0bbf5fa34653b83503", - "e61170f692866f463323b5d258801c598be04cb596eb1aa972f46eae2ef3b7fa", - "6357a56f1213ab382432a9d68ed4255845bddcfeef548bfe16ae4df3fd6201e1", - "80eb0326ce50f8c26194a2d6cf1d867a3f37a9b567ab19c48d96950d8d2b326c", - "4a83d815e54921c07d31b0d5254fb351a1ed8df84baac2d7596be09ff684b3bc", - "ce7f87a73e1314db0b3c0b07ada483062f8b44b51c750bdab6c48138cf5c1089", - "874fe7e42cee2d6b3108b0d635610d115141498ec14e7f3d7e52641e5bd98d44", - "93bffab0906473acff0017580ddb2f269f87eb3a075ab799cd464244f9c6b540", - "c6cdb12040f7851ddaa1314d85bf15cd8b3f7f341680828d8c50340c5ff43f62", - "9b517730333ef1947e25631cd70129cd94d6680a004e3290e7a75f6c2d3dad07", - "46e859070adfbc1e0ffeb50cee611b89d7f15227ba364e375135f05357139a1b", - "f5b473673c014b1a56f84bc788890ebdacc6bc9281d6d957d20cb71f5c26bfef", - "7e87554eb2bf22df9825f86e59f7f22b8f3b8f17927463c35fd1a5826699319c", - "9f25db5801567e3cd49d07068a386eb996fb57d5720135dd9cdde9770bc89d11", - "dd16c890a85bd6f2a8d5ca4c9fc58dcaf3c100e266b352cafba865c0957999a4", - "35f7ce39e7fc1683be63b9e5616b389e9d1f1b503eb4e6e728e014d7e76fbda8", - "e6277bf17b0704dce00d72e0a820c56a1732d998e3031909e518154be94f6433", - "c81cb79e0cef8d8118c2b4fb358d14a08b806081c9e724c77a23ed448d5c56b6", - "aec0eb47ae76d62ed1c5f86843a004d8542112ce4c9c75df3c93afefe6012c7a", - "a9cc89fa42d5fba1fa8757f4dbf1b4935b4694cc8bfe820de468f2e5d9c3cca5", - "4f6034c9bff4ccbfc104e25fb13f1ad95f28e5b28d3fabb02ab1eebe5fc9dddb", - "d94d768877a60b42e918fd446a2f356b50b3f59c369dd5d477a1618b7e116c54", - "cfd0d27b0369f2a8042cf75524f1ada1009fcf7b6b2b93b8c7741435060bb9a7", - "6f3ad467a1b612095b78453de60eac737aec01fecb5451b1639f12ba797ad110", - "b726b765500af424d2ec426eeaf7b8b49ec9707c011ec6f683e46467d38e28bc", - "33df3ef68665185819835a53d6eca5c1e25d9477cee7a37b82374d5e3d1f6aae", - "8ca2290945d530c582c813c1171037cf12aad851cddd13e75f0ead12da171a0c", - "98dfaa6cd9b7ba3a53b5218061600b9bfe9a9729fd858787d58f448c16ce1572", - "1e058ad91d73422f813c8343c0caefbfdc0d2d104f43622cc6d9136161bd9397", - "ee1e3aebaf870c55f8828392f51b3195a761664e2a1e3a83e8e23045fc23c414", - "715d0e71b7c5c7adabebedd53e1519342d54c5470916f961b7cc724a809d9b7c", - "fe357c5e267804db38fd59b41dcd71231d53f3a53a0a72291687d2f90c100863", - "458c5854f65022a08eaed39659da6d42220da225e0584a3a0feafefaf8674f83", - "267db962493853161894b90d95e1ddeec84643128c200d2c0ca67e42179b0cac", - "4492ede443eda1e213e358bc2628e1590fad7ecb6c30fa8ba73b453faf7d3ad6", - "b1ad7860ba5c27797481a775b755b776547faa0e018f939a615c9d6a2e2907e9", - "163b440c4e009e10b56519a693147b8bf5919cece843523c07aac29f51b56786", - "f8229e2dbe53b93966a7c4bbab18fdd64939a62badaea759a877e3b85be95adf", - "8ddca0ab679ffb47d1f3ef91cca63279be753b748c194a68df85279c5cf4b7b6", - "6b218fa2bfd0e3c331c5f442dc559208a1ee41e8a01c2c689b0f338a107d3708", - "31496b4906f7b3967299f6fcebabea84746d1ece901909ac987fe32b45a2647c", - "59d75e38fae330ec88c1ec0536ad59837aa93fd6db3c3cd85209b322211d1127", - "ad61c0619e2d8184e27a3fb1e9c5315dfd5e2ff8e90ddef0e27d5f737f7fef56", - "d6ab7babbb605f5bd62c35b044f2ba8c4c94ee5684a657bbaa29c1d1ae0abde9", - "0584b65b8fa58d19916a983c28a37a2124675c9d8224d159d4472ce93aad288a", - "08e1519adb174a5a6e52a128680079b7c873f621c7777c5e8e00f332f4ccc731", - "512020bd56515abfa408d56d9e8323074228c4d998c147bc9ac04079d993fc2d", - "d92dab888a3e626679dd6b282510946b933772a1e777e87068d990de14c157b7", - "1874465b4f08382e2fc4e5fe7f1f096f5e788dcbe8a27600213c5491557efd61", - "4a7739e1f62fa5b8213177f8753538b0e2e99dd3f9f16f2b775e684b11fbd479", - "c81ab1dec0c260dc9e53ab8fc31b8e3d5e15a7feba11c1ec414fec05e0b5f910", - "f3e5b377d7425043f2e6bcc650bd2e64fa13074cffa3f549d80a6fb357991a63", - "e967089c0df8c920e2e9e691e173211b5502976d053253e76bd44ce3fe74ebc4", - "9f74b92192089906cb2ec99464cf4e559337eea829a2b0dbd1d87f2e3b07be10", - "b0d866b95f3f7940b03c1a7b0a7f0a0aa3a5f1e6231d223db74233a96a32b8d9", - "6f9ee6299067dc66241f6d4e13c42cf0d7ce1c32e6d82691b4998867fac83320", - "8022a8b902af220995fc7c8ebeb4f87f898a2ed2e103c7c596ee331824f59d5c", - "9b232d3a969925b473e598032540dd4f02bc945bcabf50d7fea60b98329587e8", - "7f296896555c8520f75f8505141b7034277c2515edef5d49d5fea88870b080ed", - "479e84e36bd25ff852fa127f0cb8331f403c8be99f6c808c326a69e0564f2604", - "57bdd43028f25c55cbcc32e4fe2b8dc0ee494d013ac9c2703beb952fbdb08ce5", - "d20b76886555f0d4c5fcef900746024fc5c560c9d9b5388df56dd21b8f591194", - "67712247780539d1d05d26e3c79e5c56182b1a85c3c681e0b21ba3efe3a0a427", - "c375fb45cf02b2c8373b454b9e9f3ca5db36e82bc0dd983cfa732c22bd0149bf", - "10aaf42cbd7b919b226095cbcbb1b6de97531109808f923acd5489992992383c", - "7f46a35396a5f8df09dba285cecdc30f0c0ed96ffe9a14d120aa7785e599a871", - "f3f8cf4613b2a6cc5491d8a9b5aea3de8811bb6286d0335951fb0a3c844c95d7", - "c22f3cb679a2c51f905f06b1b7d94b911c3c524d9342035d87752ac52856e3b6", - "7329b4638fc6cc2a6efcd3164e585c93f1c80f2048b096005a73bbb64966c7ea", - "6d9e2376b0b0e7b9809f459bc2d0cfa7b553639eb2f63d5fd0eebe232f5ac41d", - "cb0f6f185f347437a14f7e70bf4dcd758a87a0a2a95052751c9aba14b356d80c", - "8b76a4bda3603143a54aef42e90d92a9d12b10e148c1aa1f5d7b20fb03354781", - "8d8031ffc51d3dd74fbe9478d3f1767fadbc590d976241a72592330b43ea9c37", - "2ccdd72fefccd2d86d041c176d2c763ca102d21334c13cf49f8067f7ebfdca61", - "adadeb2df58c4b6864a6589c0dab9298f3dec34a8b9c0763d98333fa520a3cf1", - "91e93abaaa2387380bb0e7405b7d58ba03e5491ac6001e2cdcd59659908ef1a0", - "ff8641ff817b4005207b5425cf4b65c805fbaa4117c5efdf3fb0b7c0f2b1db8b", - "3a04c6509ece9452552bcde0932375418e06b48e70eda6143c94582d7ab6708e", - "931e2b39f3624193aec3c6170d7c01126d812f8bb5e09c36a3fdde75eb00edb2", - "b5650e432cddefd86144cae30644cbfa5e5d2976a8dccc4c662f6e0ab3d7c8ad", - "86e9327a68e1be617c0afc529b1e7314fab6f0297b4c61c74aeea827a649193a", - "27951d88a79ac7c9c5cc030f34cf3478c963eab860a27c98125d4ec9d5befa5b", - "5cb05b6afa00477502b5ae67d2a77b719fc8a1abab689d17770a09b1435c4700", - "81ff026e8f86d84b1e571f08ffbb880a0b7cfd74e2459edd0c55ce20f8ea18e6", - "3c20f748deb6737ec53560c7b29f0857ef0ef1cb61b284b73e8d6a74f841e0b2", - "02c311d4f66545e75a07a434cb3d2166b251c99ec469b4d5451bf281873d936e", - "04614f33446a8275b90d012f7d012c63ad62b76d81a01694f9b3a30b3d06498d", - "dc512e4510a4221ed183349d2a77a28a03843625fbb625ecfc24253437068127", - "f068d157220a90debe38a88dc7f5f8d916e51bc3e80f329bc070a47e0c6dbcbf", - "3270533351c23176058be98af477ae65b2b6837d5b7264656e5855179fe7c196", - "7d14ad30c4f3ecb35370959e46cab34b725e1fa065845d9619dd020e5ef0934d", - "42375efc519d78568ec90a91d7a2fc7e20b2cd2fdc7967a999805c6d58d60cff", - "ebd9d375a5512b4a0a69b2f169dd2a952280238f5f0d0afe2d2d3e8b5d54d0db", - "c21cffaa3cfb33f6928de8fec1f7b7930e768fb35f1aaabec103c59ced534ce5", - "a48d47c6dce1b7461ee27975b839d9feb5525821807a032ccad3c258cedfa022", - "7a189c3c662be106c2338f73b63d9fad6062e50834a9a5a04291868cf7e1721b", - "c7ddf5f137444652aae6f346b838327ff3b75a2915a01b53e65d27e343e711ee", - "6b11a16ce91f116423be75f265135ed8ab0dfa0dc15b7e385d55bcfa27ae5772", - "39788347afc99e9e3082c19f66ecb3d8195ee571d3c851df7e25f7aad09458c7", - "c7f22574e3f7b2cd7e65bb0d99a550b26ca840651c56eb5169bb112358bfcf34", - "1a0091155dc43ad76d7f5f66f5629130f07f123a428e9a9c3d3ff7ee0114f144", - "7d7fa6dd54975f9cb6a57775ed5bd13b9fd97bf557c3e4acba7716d2e61e279c", - "58cef661e2ef914216667a1dddcbddc00129c4fef938f3a9b085f26853235e72", - "d3098a38f235b0d726f55448772a96dd28f55f4b9952f581c5390bef956b2d91", - "f4fff8a2b42e314caab0513584747e86c79e16f999c8407ace400f9f9089e4ac", - "90827bdbd1942f627dbe2ff1d16ff19c3b35434c9ed753b446dd65cf1780749c", - "6844485349a58be6b28c47e52ff96074298677fda6901b6462c47588a806a7b6", - "0f273d6d290fe9b360240b40ff92628087344497bf7d9d04ccc3fda6861262f6", - "2039f0f1603872d93c2b15ae44b9852978cc216e8c91c261601e1ba22f664624", - "29ae817c077451b1a64544f5ab30ed103d9d185eae8a2adebbbe88b4c98b90b9", - "9e86a58480eb3336dc7e0d7be850430d7ff19c2b654f752a2fb8e6bb9091ad79", - "dc782699ab1a537b4a333594d871add10c195a9ddab162c0cabd0ea75e1eb5ef", - "89aa287ecf88271d451aa267b14ff2fa9a9cb7002e35b1786278b896ad570cfe", - "c127bf0881f5af9aadee63f35c5ea3a3bb11378bd49f8f91a95a7f7e126d1ea8", - "a8105d2b9ed40a399759ae96468e211e19c7c9c4b5c3194dfa37902c266d8ae5", - "0f84864bc723d6bf45b392667cfb88739cdf2b38d6b3ac6d6c8c91ea9abbe22b", - "bd0c00058b144987a9cb71a3739b51cf0271152826cc0d0e5bf252b5840143ce", - "0a37d06619b29cd0088c28b699f2c2ab5fa6f7c328abeb30665ffce76b224c48", - "e00f967a6d86377e400df053aae137868ee03814dbf675456591aa7d64bc9be5", - "0c31fae01ed611a9cbc3bd9519c2c7d36275ff59aa45118e60e4c5d3f2cb5a3c", - "994fb8c607d00ab462d9defda478429c9cac2ee056b2bb24bff8d059c3816208", - "6db827225e0b172e8da69ba694feafa077878d111e19806d1cb66520a4035026", - "01247a5c55cda15a3f27ed4d74c9be09ec0d7474ecb5d4f6f6675fd8473e44c2", - "bed61757c8ec188fe5549f40149cb1f07e335b3e2714f922389be5325f165577", - "2e363acd6e760995552393e244f16b89e19a019c078450aceceeac3e7ca9bfbd", - "8de17214fd9929bbb758a5c8abd6827cd0f55ad95b796ead68432352b92611ff", - "41b11eabdfa1e879ea8caa8a7df282a0187f8b277456513cf875d874717a1854", - "d056beb2d4678e8b299cdffda19fd59cfd8bd42bcbd374140dd920c6ef1f5a03", - "96d05a125c00a4f080c28d5904a4fd994839fc83c8f62b22d0ad45e0aae0bd8c", - "3b5538533619c480c2a843cbe1960e975b6aa3bd38a243cc8a92c45621e37e48", - "6b5d8bc533e6559adb28e894eee3e3bc77e2f426e17a4c980c2e0e33e112e462", - "b9d8580ca5433a835042866212d7951b38056f559b9cc15cc65d1fedbd397441", - "163778f6065ca03708c25ef2a894fc19bffa8df9847a21223b965d1f6622e446", - "d1fb2224d526d1020980bb25fe909e14be0c91063aab1f17f0c5986910e34c72", - "fba9dcec4cdbcafdd1a83baba54a7cd057daed960e95f8eb8779b19f5e898e80", - "a3c04a4b8d06980bd14c5db000ef6d165e4dcb6968aa1a6e362393843bbfb4e8", - "05fa2e73d7a6f008fd2b506a01cabc3fdfa9649b960cfb4e8f5d33cabe7e33f6", - "fc256da60fd858f01d3a88de35ded0965c54008941ac10dab47f4f3a2a764dda", - "7cfc410973cc06fc837f03cb557c0585b8358bbeee609d467609045a13947067", - "d6ffa469948a37e057248dad123856f0cc841e146317b0604d30f387ce697a5b", - "038288114ef7c5b91afcfd20f8988e19be721bea90279c9e83dc2c0dc334c4a0", - "d2ccba9dee2370f6cdf37b15c0dd545f74413223df4de39cf1556e30a45282bc", - "c36af79ca62b5beb7abf9ea838b08b227f5dd5be1ba62e52f874d61e14b48891", - "0d8f2ebe0837675e71f78d811fa808b6646ee223a5c1a2f52f09e71ced1b52b1", - "01e73106420e75b84faee844b3507f2e3af68ec7de161f9877d6dbfab7f40bef", - "36ee7f11275f2cf277078aa61d59c743c7ee722061944167ed18d53b46dc2e51", - "5ad8b30930cd1ae85a67909373f824b085b8cd3bff35462331375ca4d1bd4d4c", - "f987b5e0b3f3359adb3a7028c231ed42b49845303aeda08c681a46df4cb1751d", - "ba2004261e5e69d25e0e43361f7b4c15912f974f37a629385d8de55d152376fb", - "8fbd75a73f0038a93638074c0553501139ed3a247bde4e5b6d30c9131dd91c1d", - "6f769d6fcac5f9603e4cf71a23c2e7c41fabe1be20043368c265c4be8f281ebb", - "10f1bf47cdec1ba882486f331fb5896a9dd2c839098dcf0c1978e3e04ac56e19", - "71d9afa38fd39d57a9424ffe2264c302f844d8d2bcd6831a07b8ca325bcd9c24", - "b5eb38acba7956e9a6d617ce9ebc25f658bc116f83295f3e4785480b59823dd5", - "5bc13d3f5dd144faffa81438a901be25c922c5dc3ffd0cb4a1a807411affbf3f", - "3ae02e78bfe7eaaa52fc0d9c8654c3a15f5443167f46de0839c9c06f1bd576a6", - "2edefa56c0a888ac6b1c3ea683a1b4e001ad6876d008bd0538da82e2a6981477", - "1c9efafa567ee8a66ce366b0db49a3d5417e2ba88b1d6923f8e745da607b4db9", - "55560b33b3a993b191c7ccdc48edb527bf5cd31ced88172b3a095bf801698fa9", - "f1cbbc5dc5c516a2b1007faf15b7af2f293c81ae4445461dc487ed64fe4eac3e", - "6f42207aa502a5e7e3fe2addd577aec33adf406bbda543612452cab927709ae1", - "40bf48fd1929ad5f49824100b80ea03201cbd29770280ecf17dd5fcdbc5268df", - "891d2117805068a089fcdc31c6714cfc817e941032bd2b8b9b70cd11c90f3f18", - "8f4c839b2eacda7e1fc021b34f9d8b0f4debc71384361547be7341ddd7477f89", - "56402880648a834d41fe80f4757a4e0a036e67f36b2da6cadcce5b7f973bc7a4", - "cd9c20f1ae10499ae5c1de7a59ebae4a77924ab7af4b1d7d4120c18b43bb65aa", - "7f2d8749ee67a16efe180a52198d1ddda29b09f4f9badc784adf6b73c88602ce", - "3c7e331156f0c9e1c103c6029a4d5bac167f8654193f4675d142362b8a043ccd", - "163adfe015be9e21156e61e4058a2addcc62d6107555da4549d96b2b74a3b2a4", - "2e11f3cea380451dacc63320fcc924a47f8d63adf4012d8ee07766c018434d33", - "dda83caf9c82a25379887ae2a0e8092af29a4d991422af92ba8174afa26182ac", - "d06aa51fee5d843952f09ce04ed48397cc323f9d9c87a9b1c8d1fff23ab4e5bd", - "9ceffbc5e2941b13a01acbaab02131733e7cf63672290d8fe60d889ce3184ce1", - "afaf57531da39e68de70977a082133c2d9bcd10d867fc270d54ca518ab36466f", - "3f29292a4a927fc58ab6b496cb204d625d78b1a0afb7d819a5c3ab9c395574b8", - "70dca5ed5ad3d058bb26d55954a6aebb7d43c81028e9dadb5f8974d194a13793", - "bba7ae39df63d3743514a5ec4ffa3317c31f5707072ca21a5dc5471371345bbc", - "4e903bac19ff8b6c9010df89988bebae7699a46d1bf1e2b3111e0a36a3937e6d", - "37d582186d8f27d0be785f47f03d3c3a2a5f8a00ed7c984113448476a953aa18", - "60e56a54e12dc5e8ea17a99ca9bd8af3fc1866c4806390d69b46845b30b8deba", - "2770631a91404bd386166b41e08a0e2edeecdd552315b6b4eb780f43c1820c10", - "eab728b71a02ebb93d3b5a86e3ea95e4a713460943b506d1fbe9477d18451b21", - "44f4918ae8e4b3ada7a81b97817cd35c4d6402ffbe9f08a5e670b6454aac4b73", - "4a59fbe3b89482cccd68f86df4f6e655e292b3b44f6bc0bee08ec355a32fc892", - "e70d849a9f2c67fa856dc3d994044e148a2e53d34f727e07c8a4d4034caaaf97", - "04e9d5c5e659cac5d0e260a2b4937c329a68f96ab0211107cf02f3bcacd83350", - "8f97fb6859d5f7c8fd9c7095bfe5ba34c5d3f2700ad5e4fe38001967f4b644cd", - "7331213248871afe22026a62367e920ed30626b37b14d5a45e35ef0fdc10ae22", - "12d81d9effc3ce8e370bf01107335922dff299e47bdfbb6372b5a55ff5432812", - "f633859a4667293e6186210e606e1581a19f60a91bfdef19b4a2bf96ad1116a5", - "e8d91ac12c53c0347103967bbab1d5753153010d01ed9aa38e74cff02a4f8788", - "4e9edf52a6fc53a0ff741847ade639a6e21c23af9254266a527fd172bac6b3c6", - "a1b360f2cebb614e515cb1ce89721b36d8326272468a03a925ad7cca18acd90f", - "7abce5fa50f2a16a817e0f29e61e2671b3edb1f4ff64c22efb75f44aae92b4e7", - "91371e59d6132d00b9d45fd11a2bfd3cd36eaa174a4905ccfe2a13c563671420", - "a11fd2c39d75413bef4f400c3213a0204738787edee2b5b2cc51b46cb54f4ba0", - "8223379c43ba5bfaac4be98f3950968ddf3d4217d60c9727aeadbc2a34008514", - "424a53ad3253eddd9e016e6c32b1b83ec15178fc4808e12e57a056e85e24aaca", - "50f735c347a88e67aa9c5708267241e8db7ed5194cbb03da36b8ef65088d7ce4", - "6e5926aaaa75ff72bc57d39547e8b3d5e64d1005acb043c8010d8ab3802db568", - "56567c222b386409170d639cc02a3cd9349270f288d78360fc05ac36fd6db46f", - "3b028bf6d728c6657fdc369f587f9531ac9a42222bf9b462a95ddeb4b3dc130a", - "26737487a494747713d231d55b07d3f740beffa4ce3909f5c43394a473e1a75c", - "31bcd19e35c33450b36d9d33c035f9f5c3855bcf1ce0d43f6b8881ee9f827eb4", - "f3afc74a68c948ef4477bc069454bb10133a9b0d0362f371e9368698c63cbac3", - "34bfc96ee5f48b137a22b6dec6b241c4d692dac34f24bfcfd56d49cc4dab8780", - "c980fdc7dd2797c6c8b70c2d541d55860ad056e73f1d346695bd2e4ff76c69cd", - "5a721a26eddc55f9ad7f600bb4d82a60a392baf707472d0d2bf075b786686dc5", - "bf95cd405a78da55a1ae028eabe1a37197cdf036e58274d60a2233efd7721018", - "c56c0b125b5a4fdad51caef7deda167067127a49992fd6bfd08f2c27bee071bd", - "8716a96a27b7d34f1b2002f44efbec8f0dcaadbbbd2442122ca4641034204f90", - "43177ac048058463cac8b517f2dbf1d68d8843825be72b8b925a5f97a295db85", - "da1614ca945fb8078ff88b47b14845c76594f8ac6bf56447859c1ea38b4f629a", - "729678078ced55f6b4ec8b2397b2a1b6fe588243d961f63804df493986d24f17", - "11cdd868de4780111283a3cf15e96c935fdcab595489cdd88d30ccfca0f16876", - "255d358f5f1b5d8234103838662aa296c192ce1854264dc46ecbb38321cc7d27", - "8421de6f1c6c0adec50614546be6a300006d0ea4a3a5ecfc163557b87d36ab9b", - "e7a5168c457f00fc5c6e12786063ee7f60f50fce518188027790ad524e312e0d", - "023000b3b4791c97cc138084fbef2b3eabeaf311b42125333c884af84513297d", - "acb56d9ac7e8d3618c760b42ef8bed60b2a6d8fbcaf877ead326670e1050a7fe", - "be577d0c63d76541617579031938c900e5ebb6e8ade7bda9fec78a5738726c57", - "d4371ce80b9fd12f3bfa47b528ad57042e751836706324698b1948e09ef95e6e", - "8bd2bf79cc24e02c8d7fe775470afe65aadf340b579976f1d97970b381917b4d", - "cc7b82dc51c7f0115395e03a4f5ac642fdc0a779063d2f0aa803a268eb6deef4", - "592f55241d78b5aeaf2ea0df6d21f7d9205fd2c72511da3aa54689e89d8bebc9", - "f246adde263edf41d795ccfce7b73295af38f8fe7201f1500c8dfa6d5eecfe43", - "d5611885aa0f93d0310918d5f562284861d56a1073ef82c25b8834e7c21ef22a", - "86dda5b8f67610af784d3135957d8b4573dca8830ee5108844753a8f46561ce2", - "31ccd87c7a70dd53110f8402b5becfc4781e4214dc3bd7d6fddd8c943368afd2", - "7e47439e2ce7265bd197584d0be7a92127ec6ae6c6f9c6380de7520eafda1e70", - "8ba91df0ff972ce3f83df8d65c84146fdda270cbe91587ccaa7e1764058d2e9f", - "df566816ffa793de5cdfb5ed9df62746d4892cb424d250d44d947fbf4d20fb6e", - "affb0a54ec203dfa4986252627b246a556516c8e7823919d701c737f1868116d", - "c20462b0b7d7e55f24e963a8057df8327df6c0a5012046386d7384381f3e155a", - "1b6cc1c313bae8341482655c064c75c1c78bd2ce898c4fa61b23cbb55aae8438", - "4ad03c5731cdc508f23866867dcb221984d0951e47eb22efde472394ed1ae6ce", - "4c2a1cae9181f6d93a4e7fb7608f38fd03914bb5dd8003221b4241149fb813c7", - "081a6cd7075d4bf23b66d4356a82ed77dcf2b13bb73cb0702e65d9bd492439b9", - "e96061734158252bc1092cb8e8b1ccd1233a95c22fc36d0d762f233cb2118352", - "302245a1dfb46462da6a2ba0aa5e7f8e4b90a75c9ad679ef8eb863101cd7dc58", - "f6aec0132b70cff64f6bdcb6ea79d5d5a37f3ffc9de1181949225116359abd50", - "6fc1ae3dfa98ebde4b4285461643f3af1711fd301f9038aa9b7a78c869f3f3a5", - "f924c0fdef8f6cc5f6ee9e031a9d52b1db09a8fa7f148d551f70ef930ce020b4", - "443a951eb759f97215252e3130ddc9595fd573de3af41401c1bafe33c6635dd7", - "99d618e62efdd7da2a989f03114a3adfcb02e7e306b3881c98cd7f8045a5c059", - "486906844d55bef24b09acf1ef0a57a77666e5d819d01df548e2ffb887aa4f5d", - "0d911b5dc6b42d2871f0eb9a6ca29424803f05d8de932453d174a21270feb0ac", - "628a226b053bbc25dd1f190f9fa2beca4ea39cb339b6606815ebf3dd7ec1d614", - "46a5f4ba4211dcacf2d5db3c770b236f5e94439f5f226cb7910e2f5701da0be8", - "76cac7e4b6e7edee76bc90810ac01a722cbf0310ae4924fe507e31c2cb3bc96a", - "a70679b4092d0739fd8e94682ff1065a184c7a006eafb65f12d29562eb798cff", - "a05110f6191611a8be75104c9a531d190ad127d75e0da212580e968502912085", - "fd696afd5d63f08684157ac68167422477c822f426f105e194af669131c0a880", - "fb732d70d7f04c34aa248254102ba56e6dde765725cec46a49e756f051c1bc4b", - "56644fe333cd2e20ddc939497d0bd0fb87c32c9b0336508fcee0e259883c7891", - "278599c7d9f5adff699dacc970f4ff1971a77027e321277742f906a66140e967", - "0869ddb935913a41979ffc80466949d804655a0207034e8953a0a37898882f7d", - "0910467bb5266bfd20da3a3d1a4bf090aa3d6a01136882ecdfb85ff62a01206e", - "cb5cf128091cdf0c6bcd3fea739fdc84bb5353e1cfd64ec31e1324415a91a5ea", - "34781e928ebdbfb9e3459cd21d237510c3de4c00c9d43a8dce4e7dffab0e2d10", - "6350821671db16d6989ebd8a59643357088a755f45fc01047ea00681a3f1dc73", - "bd068a257ca3fd1590a546e40dda284dd50e8eab2c77be34c34aed85fcc64aee", - "3cb7d5340f367764bbfc79faa53710e8e28bf1081734056d8d9a5bd34340b87f", - "d403ced799b2f05b2d3eae9492467e15649c5291ddac19a39e543b492a4c6dd5", - "5a55c6be89c8166a8b5908c1b94a547c0c4f2e86663abd93d6a83138cd08858e", - "58288180b5996e982fb249bb4b33188eee6f17ac2909e3bbad1e4d1f13a99ba2", - "f564a138336b89ec86084065bd85dc30d2b8791c0c9535f4a94214ec106b417a", - "c46cec3a6a7b190f4154e8e624449ea8c3fbbe2019ff7cb2683624f3d1ef5353", - "0a732331df4cf8de862887a19e0a2974eef860dcc64e2b9db593f676bcc14370", - "e402b499ea3ebb269e75e3fec3191ee4e4fc1e1afea2c727733ac51300d85110", - "420feb65f8436c5338fd8943bdf870991fb7167acd125ef3f721f19077b44da0", - "4206dc2a856874df94f658434389514f1046cb8fe4877cb68cbdcd63701f201b", - "5f592b007aff44e591c96eff958eeb97d1ddbd0fd23e7d2e036547397c704676", - "09da4139a425e290f9ef64b8f6b3f4d8f71b42b5b1e20f2c6c8175429c3addfb", - "b748da64a954586fdc00750fd55848924540cf447a4afab17f62e516591a28f6", - "18956917000420bd789c046c56e8b4741b78cd21fc01729f2f452512b27843f8", - "0b5ea023e7a73c9aa99c74ecc863f47785129b64da896398da89724909a36dbb", - "8d4153f2b1109edab8538b6e63e29ac50be2515e9ec860d80901fea0766afba2", - "fde8ea7f6e13ecad6f0a61354733e85e55c6cc12ee50cc0b4e035a44c297e029", - "d6f5be07e7ff7034c2a3d66cb59290eb10e3ce2b35fbca279c8e303f713b6a0a", - "fc209d01f58ae86e487a903cc9ac82adf91c37aafb326f54ed37b9d9a472bc80", - "8c54e2210f7623fda08bfb339462b438c83436c675ae70cf75b831a774783709", - "19d76b13c6db876b8fbad4563cf2ef66f9b795cadc54b789279791210b065fef", - "ae776a0cf04fe5a6f2138b5f0d7b5126cfb232e51cbc411048d4aa2bf5d04b24", - "a75b6bf2dc68371799d485d04ae8c4cc0809261df2be386692536c3d9889b220", - "0e855388514c1d1a41f3d71e029154094da731446e1c0d4461baddaaf0158069", - "1efdfd2a807f818d81d92870216332de64039c216c4d3a6b644b23e20998a008", - "a323f74c0d0013819ae72023a420f946050cfd7143a14a6e9c27b1cfa1acfadd", - "5fec40ce0bcd4e1c0e6e60250617dabcb28dcae91fdbea8f820119d4c4695de0", - "0f278e73741f1d570f71ec5cea7d2cb6f4e7d2fe726a7616f7e14dca1616c780", - "63f6869cd9001ffaee95ed1b86757bcdfd4ebfa22efb5400b7b2025c68779fe3", - "d7f5e53c7ede4768c3fd66f5ed73184d0340befe35425031b800ed6c77b50d36", - "01e8cf8c4c3681b51bfb634f1339c3127323b646ce68d26eeecb6b5e4dc0f40d", - "11ab741cf281357d08a4d29aad50b1258f40e14ceab695e03fa1425df9eeeffb", - "55fc35be29a3561a264ee405b9252136e3be8a5373217e22f653cab673978638", - "682f95e79ea0808ef22c3e079c4b21db8c0d601c554aad17881161cdc304a3d2", - "67c9ea181bf3c5efb8ce3c2237342851db02dacc8efca61611df589bbacf96a3", - "996517e6a52e9b69b606de9e8e9155155f3a5872719b667167f3b5f96cd6a279", - "5ba7d1db607d9bb330eee7a66618fb0dac28cde5b6cd07eac20be504d9cd52f9", - "17af41b945c3524a586296f582abe2b7e5b1b243a25e446f5f03dc554b9ceed5", - "dacf553e88564fbf6f3ad2e2bb95a50f81f0d2ff12a29aa4069c778041060743", - "f4149e6b9321628875c07afd45390823c84f142bdc43a8924be9c676fb044fe2", - "a876a6e6efa8df0038cb6efb7c27a36466b716bace369e727ca1507fe4485f72", - "42d06660bd1cad8ae41d5d0f2d78d8807304aaed336e1e6ff8f6d94b91714227", - "d22c75514105ad4f1d8141ed020f9f112209f0694300ed04fdbdd9ff2e4d4455", - "80ae5b0fe250e1dfdc57634d6db689dab5adbbfdd7989951d27b57fb4cbeb8b9", - "d22c1a737114fa24213c4df7bdd1694360bca765b9041ea68f4db6768a5cc325", - "7df43501c0dfc8a66902b91ebe7cd9b32b222385ed3a6dfe0feb5c5e35028dbe", - "949cbf927cb3192dc63413e0ad2aac97fea8563826b380a5574cdc7f9a8f7a7a", - "d7661fea5628ff339cc9dd357f0293d75cca15546b3882377063d4efd0ac3845", - "f07830a3546e826ee420240a3e114ccfb1b923eb24511474172f1f3dfb86d8a3", - "be1f9e25b82450deddeb8eafc083a6dbcacae1858b80638d55d9c143579cd09a", - "844c0fb787b8565eae225bf4b9db8c3e0474567dcbfa68519a4d7a6d69d1cfdc", - "52624ad9bac85925da8e2a08795b8070fff8d9bf799e8eaac9f64dcdffe55c84", - "ea0cbccd0318ed3a194e5c67dce4af90abc40f8d6ba8e61f1072e3c1baffe74b", - "2385f25636817e3881aef299cb1356bc29dd72dc53a19d2064a9d46fd450c70b", - "1d7cf8b26aca13951792fd71a4923d52fec5759c0936933a65bcf8ca3c2ed958", - "3d26739976daa38d1f1cc14e9c4cba92cf299a2160064527f1878603c0cb68c1", - "01fe5a50c8ab60bca634f464615bdb5c5f15bbe0dc7087141a579baa5048818a", - "bd05e1f219161b398a755b046e61e1448ec2062bf1e9e9c76fd1ada48c0a921b", - "2f0d64ca77961a4d14d2ead04c66a50b804d2299f9a1a604f2f502912cf3adf5", - "76f4550117c2e75c0e511e82f14d8700318fbf11d2a17a790833c4d0894f1887", - "a519e14f114468ebeec837f5d5d918a115a63fa055844e5b00e9c35f8c2d0ccd", - "e0651ff4f6ef46bfe9d859c451f00d7b2c910d087a33f6f366b948eabffe6d3d", - "144b65c39a07d556f4d6e17a88a6db5f67bfc005102ad64ef7ee08eb788fee72", - "afa4a85d9a90a3e56fea3d3a4a57d3c8e113684bca861b49a0f743fffba9c882", - "cb295c406279f64c572716d9d10e58b6606ea75135db979e9b03048483ae780d", - "19ddd280872843635649d85b2fba3795b899549de85f9965d0923e1e09b9dbf4", - "b7ba858b079a693d03239b1197c50b5a27b9c8204b5632dfed5d725f87cf52c4", - "1a4a7ac5953f119531e7d3f0f29b3cb25b746cbf44a81274b827885101cb95f0", - "7b9e399db274397430d323b2fb7c499c7a230a1dd9a078c9d5d28f72238eb278", - "12e491e04248b46e0457e1c92b3622809a7f21b488cd8095ac6798a381a7e134", - "774beae2004d5977efd99b641a5ecb97191a1abe84f26c5d4f8e86a9a6deef8f", - "e5f031c07b06235bbb6a758fc7cbfaf7b5273a811565f6716ab04895a95e7e46", - "d5f4779771860a045ce188a08679f917e928c151875e84759ce3b0e221b07f8a", - "856172c42e8967bc27bef5353a01817e93601162c87f29b7fe88da355594c543", - "33e0dfcb237c5dda43ec92f972a50507dab9775fcdfff63888ddfdd72881b92a", - "e0886442c33d33b052c84de9f136e0a174eca7a526de847fc82219dfc75975d4", - "04d5231c1ac245ab681b54b4f4dab0b0d285df31adf97dc26b1a17047d08a9a4", - "8d0d3b8271966abf78f70c76dd77e0a96173702715f7ba53c94041c92a156958", - "512f7f4ec00b5e90018c65fd48a7ad3f817fe6d62fcb9e32106767c8bfc1c4ff", - "69a062661a0b19c5d854495ccd9f8cad56c0800e31a17b583a12aa6c670a34de", - "91b140e361dc6316d184287d26944c06e1ad520613c5948d17bb46dcf8ab940f", - "819b4b71865dacbac16c15cfb1c0f0b39d422b6ef2c2f38e0fd1b67921516525", - "dedc1da481e87f098fafc21957681a64314a1f8694ef0249c0f6c01eaa4f6e08", - "f32741bcccfabc169313a78da875d1b505c212f059052793e22b3b6b9fb90241", - "6e5694934d0dfe6e631e19bbab15eec03f243b7d24aadc7c881de0d912267dd0", - "16167c6aff400b21ca04d05c608d73c58acdb07ead3469317b1e65d69b55cf3b", - "1ec63f03b87b35e0ed64440eb9627656241220f292ebbcefefa3610fb62cd15b", - "b1e01b709b416e4ea331800e7af7be2829309e6de7ba574e8afcd1a931b71b2d", - "fb870486a181f6d8181a60ca8b75946882ccfb9573ee7a36a82ba308d360d053", - "e8ed545bd3e9c27d85133ea0b8aa4c148299b85716999b36f8ffe28f13bbe4cd", - "92b9a76220aad37a392c0144a167022dc849ced11d6028e10944d7ebe4c1573e", - "cd40effa19320fa40473dd830b28fef948b556852fc20808a4c78c8ab90e5fe6", - "79eef36a0c9ce121db651deb2fd8d42b9df65adb3ee5acdf68f890270a6e8373", - "bbf6c26f2014ba8bf93115444d44d808ad11d03327a51856f9be4d06b2028f2c", - "36827f88743d83ac241180687da87dc86ace220e1a88e8b175a345a2cefe1518", - "67abde7c3ac3237901d12d617258e34e58a4ff1dde90a06db2dc2db01b58c0b4", - "c0fd0699740fe27b2a779e0e379517c041f08a005018006cf91779ffb81f3098", - "f630b037fc6bf552ba15825ddb4fe5c8081e1235132f96446560d04b5258b393", - "d954c0ed60528d5c3303ca0002aee72a7bda8e7c72fbaee781f4dc37da6f29f3", - "3e18406466ecc9cae4b4e3e5c409b799d273b59e42fdeaad24d73e1b065c2b0f", - "e158e4ffe67c74bb4d226066849fd48e1f4472231e28c368c44a2f79cef7a2e8", - "2eb776b8cbb5e4fe00b675b4137be5b08987f3de42e8efe07e4c745d74396ace", - "179b28c468188e041e9de3736256dbb62e41ff3fa4a30185305452bb16a086a8", - "7dde8e621ba3456240b9c0f985c286efc45f4bc7220ca659cbcae635aec2d25d", - "59ce375ceab0c6a753ec36c0f5001bc5e54f2a80c74871478fbdf5d73dbe6ffa", - "086a2119c924eab2c230d7be7a977ef1bd204185d8200fd8b9fa6b34cafd050b", - "7310438bdd5b0367bc43ef70c2b243c4b9eb7bc29143d989f8d5170813ca861c", - "d5eab1c8524680e20e8aeb98f8f11a8462f5066b569f854837164ad0ef73c825", - "a13dbbe4402ca093c6712d4b837c945119142b97d92f22e02f753f5b6a621b8a", - "8d69e260353592ecf2945ba2a15ea399e0f05a894197201894fedb923d897915", - "8050e3102a137e059381ebbf2d81cb4a69533a07e16022da9868c4fb52c4ad6b", - "ff7bd81e5e19664c9747103d72b305566cc7723e88b5dd7eb54ff8feb1594792", - "f44b0559e5151069d9945f15aed8828edadc5c7a0246d741909ec87418c32a94", - "0f5d45b9106b919d0d2917b1ee46a681a4210a9bb193e7b9b323c2dae5b5663b", - "437c2a9d381351bc5291a18b60c22d02245eadbdee612b3bd79f73c64ffb5ce7", - "09e63401a843aa6a1c9fb1f412c8215c68ebc0f38433b0c02e84cfbf1022ac52", - "1a386ac6e7b067b06ec32e566c65b141523538af67b53e13c73504f863dc608e", - "d2b301438776900fc559f5fd0568b1183693987315f726ae1bfd9ff50885245d", - "17af188f086ce0b57403e737bbbc13bb19817cc753a0e6109c8b20ec3012230e", - "cbbe25e512db919bbcf505e9db0612aba2d4a649e2fcddcf75ae8bf29be3f4c6", - "6a603fb12c1b899a65903a18fb7c6167f0bf347c770c0e4c32500e810d3cd63e", - "59908c7ced23e2e57ccf77e8419f880e0c7f5d1014b6f866c4605ba78b31c8a7", - "f267023131e9ed46502f5a1168ef87836d7b9088f3bae835eca8cd1b067b30bb", - "a22903808b97f6c5893dfdbcdad02410c65787fd976463b58a3320fb2dae1f3a", - "6801754d22dc4688df2822e203b3f37f30ab5638fdbf55b4e9e040ba7b58eb4d", - "f545ff393c464e48eab6b2015271555af9644299c2d33ed893528faff8218d4a", - "387f1f7a42a7a35ad4a85099fe39351f2025569febe389d9f63c41f75e031e65", - "4556904de0f58e18c1b269b74a2a8017f0d10d9152c08749feb6e036c0635cb9", - "fa1d3c2bc0189b86d6f4800cb725b5f09786051543ab795304926b3186847777", - "1bc9172d244061807fc0353ef0853c7ae487d86554334bc890b878b7ce89d27a", - "4509bf11e31b2e410cc8bcf527a62921d4da6fe3510fe0fb9cefd703668a620d", - "66eef139c26b109cb8e3d93ae0415841dcce0a1bdaca8766abf5116902bd5a48", - "9358306cdef420e8d5c64c15b1bdf56fecaf6e1f4a77876034f3c452320812e8", - "8a24ade6a33d129ad0827cd31032f2a5854352fbed660a4207e7bdcf1a8a8cae", - "5abb38bacfc1f22373ee58005e290942f41bc97eb35bdc0ab6965e60a260de98", - "d92a11a69e05e9fa0b057ebc90b41f6b4bf7053e00d68db3b71021d53998ec4e", - "c4c88641c6a0cf62719fcb69c36b022850e9d3e373b112b2b83e5c957c18b5a8", - "dec3d8d92d243c1989028cf0880d3582c2fbfaa1d2d4958a8097a76f1ed31ff7", - "4e5f2279562502bf034ed923e31820603471aae56e03e199a3e87a41df44aba4", - "816b925a8882b87e9c616d58c2869c416b8bacb51e70fd128d24cd575c533e3d", - "2915b8e679b5c2a925374dba64f60eca81c54f8138e1054c0ab50ac766723091", - "d6d1417c80c1524fead01e6f9f0b2d01a4bcef8bd3acaab5035e84f1a75033c9", - "7078e7d40aebabcca065eb9d9cd824ae30a40e64a45cc1f3b267e93fd784c282", - "1110c1cc779444e4b525cfe002c70066e6b9d22bc30424c17152bbca3c8b467d", - "7c50204b9e447379a5a5fbad59cde96b39b1dc80fc01ff792877c8ba64ac66ae", - "d5cdcfe5e33f52622c3ac6953d4a580656c014a1ecf58660f935ec22e36aa98f", - "466ad2bf9c6582b6267b1a7212fde93bf05b3041a534b55b275d52291221eabe", - "e73cbc264aac610cd18b169ce404209fc8678e4f5f8a92b5561e21756ce07d9d", - "91ae2eede1e3752927aa9396a37bc49bb5f1ae2c51254ef651cb2e5e05e64967", - "7236b6b52bd70b3be133174e6edc5ffd2c8da1c69275c5485dc37dbfa017c071", - "5a20e7b49fba115a4edda6a38cb3a081cb1cd979055ee87ec3b14818d3ee2dd8", - "765ffccfccac6a0efc0d4eab0d18def03ba0e7887b935a9381146ade2976af2d", - "6917aa2f0ec2a37723509ca86814e1694bfcb5f3ad05aa77c0eb8de8d9712e0d", - "c6d12191791a035cabaec2986be85b503043c181b3466ff547e7f108d40a993d", - "58991bebf9cc327eea74d2585422e38b3267ee470886c76e790a8bfa5bfa6d47", - "af939c2c06904f40802178e4208e739c0cb69b37dbbb4f428b636a0edaebeab1", - "a1b2a5fe5339b219da80ebe2a9e929f58ef2c09debacb18e61c35b0a1c691038", - "2052cfd240f4909983e62b5bed5b1ebb62fb06b2000c64dcc63a416677c1cc78", - "8bfc23f88830cb513c03ef00ebf348100445f5d75a40eeb8a99c9032f3f9c822", - "c3803c5bc836e7846b1bdd17d4afd8627ddb4bad9bd19c5e51ce45b91b521317", - "ca0b4d171559589294f377f9cb7409e424e82d08a531fe13d0c213cc882f8de1", - "18c03556cf75328a5daa06573e9085968080f11cd6fc06a8117bcbfded57879f", - "f19a7c631404db9b15e6827ecbf99d509f1827a5a22fdb049db9060479d7e618", - "0416e026e56407ec399588219f31417c261facb286a2c45b4d5d865efe4aa24e", - "04e74ac07d29e932cdccb80337da55df34574a74902449feaf3969d31b3df93a", - "0684c9e3508e2219be3f59a6e804f0de1ca7e0cb0c96152dde7b270ede972a02", - "37dbd16d72eee6230fb72bf9fa5efb1dac7775bdca2233e6e95ea47863c1d8ab", - "d4094f32e09bf869689bcc1d8259dee7a8151b6b3e91258ec7436ddef865ee7c", - "c5870289fb7a6741deacfda3c80b2620396c536a08923923dcbd33620ae86d48", - "e14b9a040c1d145db2ddd5a2841dbdc929a0c28c8f0c540e26960338502c57b1", - "1e4cccd52e24216017869be1154f6071ef26c2e79f0d86a8891cff93ab08709c", - "6dec4294e079d6632352054a47e6ab10823943381b4f4f60a706e30f85a4145d", - "e8da9f089a6fb6127b1950eeb258228fc8599f381388c2ddecff8745d4e16a88", - "28397f594b3945823d9f72388416e920e848754dd00ab0a35fad3176b06ec872", - "a0b9db9a5cabaec21cce56fd84841d09638061db3aa2d1f485a05143f42be989", - "0e0fef65dfa19a15b433335cafd6406d937867da90f34e3cbcfbbdf2601111a1", - "e084b521615bef0a4027b4aaacc1c6b2fd0c4aa4ba86132946161b23bd585c61", - "a37444859291e97f50b1be623766c2c6df607fcd93d462a883b67cc5c4503a27", - "d25f43c29c13e40c95cfb3be5634d98cdee5e19655235874b8b011ecf933ede0", - "a5883da9a5ce9397ed4cc45f1dd5c3f6f01d113d7e8adc770314f4af9d4130dd", - "7fee330e3b54212bdef91b11130935a32451118184931f2f5b0b4e7745249873", - "ace249ad2051353917ac776249dc911788b09ac11e9fc8fb4766a7dde5e812f8", - "24f25f5931b3b908fe08fc54658043b2cd92673720bd4268e32788d8acf4f90a", - "ce50647b37e394a19879c64bf46922803e7bafc3b0b6809855dd0fb2218dd347", - "1258766626926a3c77ba7f2911164a869da3f2163beb00501e24cdfcdffaac1d", - "5a824e030b1e86692bef447e3f87d422741edfece6c4a59937bccc164414964a", - "02a90e717b90ec3e2627fadf0a5689a48927a338bc4357234db59bb2d8a29aa9", - "4fefeac88b40c7eef1184c3e9ea98bb35865cc1f832dc88ff05e47f4fc560eb0", - "38cfb82acbf5ae900fd23615aa90aac838fcb0d257e1762e492dc8fcc0392244", - "9daa1708b5a32875638b9e1e8543bca864706547566bc330a27108ac5b187eb9", - "5ee3ae96404a25e221c145960621d031e22a4d7191983fa32aa5adc63be6c083", - "5c143268dc845f65b343f829d70b43ba04557cdbef35824771eafd2caaf12abb", - "8ce62cb258fb57d04038e610a904707acc5c50acce3d72874b572d6d7d88a6c9", - "7b0856295697d0126fd00deddffaa74be9a3a128237e382a094df41c665b2358", - "833b8ff249d920cce0c3b844e05ebcafb7cb9abce2d7215d9de9f38b91627bdf", - "a1faa9b10cefa7e3caf2b66b1f4671c766d839b4fa5d6f158af4345c4a6f8608", - "26e46214437d5f7b34cc5e4bb58b5710e5780bea6a08e963acaa0602ebf48d7f", - "2d5ff04a77ee755a9cb4bdc5fb21a7268a99e3278a68775922bbea76f5798d83", - "30b51d0a98235e8cf784ab2202a30cc605fdecf43de24e2f5b13ab250c5a0fa2", - "edf847354d0da70b200b0b90b1048d8934d17e2dfb6912aa6f230cc4aeecf96b", - "fd6aab5a76f00dc1797c4f78dfff051457b5ef62f1ab16abd356c59dc2031871", - "83c03a1cc5e59003a4f53924e4fe42bdf06a364d607740b59d7fd3ce45cc4bcb", - "fb9856a3a425b62ffa50853297504a52bc9cfee2abd5145853ac4074b1bd59e1", - "74a9b4b84ca6b5ea5e24b07c9dac4018fc817686d6dab3e27c3d8ac48d3266df", - "342a012473c5ed01edec51ebfd69d3e94e2e67250f08ed4246395cc16b26ba74", - "ee51d608bcc87d6fe138a98b7375d7a0866f84c1a0ccd1f0153feeba6452c768", - "91dc3a37bb5dcc0e66cc55352145ab0b08c3854432a5f670513b83e9f6e2893d", - "abadc346239f31a1b0839cf28ef34c6839a8349d3036e6cb4c64f59a5a8b7b47", - "02055a9b1d01630c8329ddb6490f7690cb2f41c5ae37bfa43ac908e143f25fb1", - "f123e64d616ab82c0d8717c2a4081c9f0d63355f51ae8c9506d90758d2114852", - "b14697b2bb65f8977ed9aa412ea8a723dd0778bbd1d2d778db7d598656d91b39", - "0c976da9f64e769403725cd0c6e3f9707bba97e625c24e8fdee5e025999a377f", - "6318b3e9fc40f11e6eb736cdb1fdb9597cb0849fdc26ab8eb959584c22335d49", - "9d4822b3f2a487c62e8408d79145fd4b6ee4aca88dae475a2110678a3e083868", - "bc6afc64f52b65ad80a8be9ce1f986bee87d2d854ac0d6027e3a776c88b96956", - "b0da332b61fe1d74128f9c7b75a887711197f3ed3c348de5266e0ece8dc129ac", - "f7388055c2830cb71448438994d85a889d073528b8e5c8085d290011dab625cd", - "d78fbc6201dbc84745f6462ef44af5c26e947dfa04b1b269df83f8598b0bd66c", - "6c275b70cb8aa73fc65245096ce80313e1201b3589afff5d23e6c9c980711dcd", - "8e6c82f3348fc146e5c8a243add4566551edb705809de3d3189d5d60e87598f1", - "2aa51f86f88e6d0a3022ee2d39669040f02b0d34eb05aa9ba4fee225ef320bb9", - "94608a1ca572937c0774f6ba2dd7d16019a96a3917016b83e758a931b340b77c", - "9ecf4946e63ca4a27799a79e459125a6152fdf459e33d6f33768283b673fb9c9", - "2f8ba3179c8f36840a1460186cef3db2ac29461b30bda7d676b4d77033b9d9d4", - "d088f280021e435be22d789a14289cb43fb7ddecb289fa4d62fed999fb8da010", - "34bacc63bb48ab17eaec936b2daf2fa74df23fa342793b835afb0c029fab9bd2", - "058aa8bd5c279f70a54ce128236ad5b26d2d4be73fcb2b544bf9aa39f1750523", - "57d6a043e5d76c4be52797865b0d0f47a3b09f97b65379c1e94fa6a335b0d6a0", - "641b9bb20e5c2f64c493a280e277383bbf57d071bba9620652b65c5f00f23da2", - "d9bf72b513a282c6946980ed39820623aee2eb720e646831fd7b9dc3a8653d5f", - "30da2d08282ecbbdb943ca59396727d6cff31c069e131c44f58c902142265e6d", - "ab5eb4ac34e63d8c9b1e774632c4562b42dd832018a2d29c0374190bfdb1cb05", - "0545dc752460ce3ee5236a7c58d341f2ce8cc132811d223481cfa9a639ec956f", - "d0991b55db4812aec608d7634b25ef7769a637c9deb7c2f63ca5215db37ee564", - "3ecb105981559e439bc510e9ac6ce88ab7a3607a885d1ab637a8164ac5fc0952", - "8f0cd557d861690074c6e18fda75f41194fc2335da8fee5ba0a01e94f06a22ae", - "c028bd46faf791c14123e5b2e6fcc56f6c2ab2dc6975704c14ffc56ffdd093c0", - "53b5074de745bc9bb8de4a8f8fcad54b20fbfc0d321f843055ad729a9e7ee12d", - "4ea381e6b9ff7514f5c6dade80d8937ca505ffd6a184feeb5aeffa3d97f5a423", - "4b1e360846f8bad89548fe3b35e7bc077e75aecc0d918893845fe3b6d832693e", - "6e8467b76516ac5e268ce05f905ab48d3d08bb5e3ceacb170a4ae4e2c214362b", - "bd1e74fb17c49754de0245337d87071496503ad7ec53d9ffff37eb117229f752", - "326b507d9f94b9747055fc9fac41c293545618eb0dbad7ee8041dfa76be91609", - "bd5d21760175c7b1c5fbd2a4c9a3ef7a5c5c5170c2e35b3a047672d584d08dce", - "409b8ea1068d2ea5a5e94bea6d798b6ba03851bdc54c4f1f86e027166bbfd757", - "9f90f12fd70839d50aef4154fde6e580c0be14b99ad715ba987e276d27bc5bff", - "c719390735d2a3f2022effbcf35cbfddcab1ddbc0ffd25a1d04eaf920acbd4aa", - "e1e1b53bfba7af965578782cbcf57d13c8cea82253d3d6325c1f6ebf7936d134", - "4c51b0d8b6a7e8f77f1673b7f118edb20e01e4bf1cb74e6d104fabf10b3651b1", - "9f31fc5f3e628cf1d4ae7da781e4517a52e71041e0f9678fc5101f7ac8049733", - "38e95597d3b1e402f80357dee5a774c57ef54f0a6a225d918dd55ea3ae2ac363", - "014c5c0be7d6b6934dd87a3f3bf90eb4395129e441e8ec5bb02609af09cc3670", - "f8aba1729252a657885269704ec7723989984b98c4f900550ad6649e82eb4f74", - "b6a7546d28413dc0ac6e4ec05169b0b5e219837efdfa6a90d94b24bfe2f70426", - "a54a5b3685fcecce6f948217cd51130f494f33a43cb632138dec0ebc43d19b1f", - "d0a252a5ce54f56fdd774cb01a0ebe3004dcc1854fc1bb58af05b6062dff1d56", - "625546753ad04b68ec5fd063c41a1b3b34de55a42fa995375a0ad600bca88254", - "e97cf74547bbb1a40d6c4ef43dcd3668638c49aafe311037f6b53b282a7ef38a", - "884945e99f862765d191898742a3d954fe00aa72b5e8583fc7f9937552256755", - "735ac837f4b08e5c48f57b7b9f1bc3da38887ee8483fcc08b37433ff288b4eb8", - "8a1cb9d180fdc130a5d5366a1204c84f623432454ca9f0e8d73a894b5409026e", - "eead445d33889fb9c4d34837a891143bdaa885274f5f76b62fd00f558f4801f6", - "aba988dd6d6b7511d38310c3b1599aace102662f9e98aee160c6b906458d796d", - "025238dad91574655a561598d92965278a8f84527bd2f7f31d5a72744279bb67", - "c22c243c799c055e2a1e0e8a4e57d149cf701b868d4a47720845ba1cc8e005ea", - "182978bf87bcaa685a6abe46e43de63f5187592154a9f697fafe3ed8ce5c0d93", - "1d9b9744ec404ac77d592639c8318b75ff75b9fd2fefced44eacb02da7b787fa", - "4b93859ddeec5f25a6a16d4b345c2bf89f94461d45c46e538ddf78d6d251a34c", - "3d1f106082d994bf48d7841338e1bbd2d17d885106aec0dd4893ef5d93eb8c6e", - "82a4cdfa61490a331c991bd529dee56f65b7d6786441569a58a7b3678be4ce98", - "25563bfe1b6445afd20bcf88878b17dcb9db3d7efcf155bf2aba5057169ca2bb", - "76977e3431ba3b31a505fd3ab028b5ede22c62186bf2efefdf4079a6c7b673e9", - "25fbdefd8ebf89b7af5f36b076004bf015866c13dffd10a9e1ad5a639d0d2f66", - "68d86a5901aefbff29df2ce1f8bda2c77b99ec50bbad66a7f94fc962652d5508", - "9dccebbb6f3b18a938659c1172387f202d59761b32327284a157a60f4bce4219", - "b59e88fa7f3640c738971fc36572f4f52eee6f63a7f64ae5583d0d2df678aa37", - "3aa8b173a4a99de4a8381c1ea53fbb280b1ef245987a1515262106812c0cd818", - "c85176032a8142c4866a9be1afe04c7e2df57de046b9e72938c60c38aeb9d361", - "2dd099e90e08db276a44c2d3a2ec965ad6a37dd958cd3fd222b5530b00ad7f84", - "fc99d9bc64ee88056f91e2cbd358f775383599d7edcee412a166086ae53c928c", - "9400bf7c16a3cd49793cf7f6c45d44e3f9ec0bbb8108f56ce7dc5c131b54bfd9", - "4906ee7e7f63adf31d363cba311fdc1d0687dc5d9605b7f4b0f728592673843c", - "ecf97a1ce28cec937cef138ea44051cf4c30a528c6abf50910b6220d112b4c6c", - "56a5df90b5dc681d13144bd8d291475e7ba3f61ad99adb3e04b40e8b615053c7", - "7faa9962fac4d1612d57727e2bf9522abd07fdcfc9b05a3c0520a75afb341b96", - "a636cdd346d2d4a288b95a132b9c87c2c44c69b8218174237dd3517def9444cc", - "ccbe2a6503a834c6c4c33e48c9e774c8c4d7a156c1ccb37babf2d1e8c09e8f24", - "0a714d5db7de6e00e158f07f2fc4911e6c61a3c9fe00860b7970127aebe02c00", - "66fb5357ea557f16da779b2af71084d16c8d4650b7946c98526999bbf1cac4e0", - "e12cb41bf9ae5d5b978c659d65a9558291971ef6d6b027b8153ca94b6234db14", - "305b049cdf7802e975ce4f21ea35005e399ae42ae7d501e5aacfb7fc1589980e", - "15135cee9cbbbc34acd41874b78782451aeaac60e86cceb7c375b17160d7532b", - "b39bc213e44b12061b094656f49d47f737049e8745cf11164312d1be48558c25", - "aeccc594224f7082d21328775e8113ade2d0ca8fc640be9d4dca73c943fcc6a1", - "e5529b79527a5438dfc3efcc0d1591af1836a49088403b144a087e2530d44175", - "bef0528091f8a11fdf2aaa64187b0163a09d73fccf5ca05cac242d3e65352c54", - "6c691bb9b42545644b47874ea504bc7ebb7691377e13a29267e9e0adb07e068c", - "175f0ceadb7b37f064fc7c2c5fa74e4bb9171894ced0bd3480ff37a98348e715", - "17fa3e6d4646c3e99f65f27de1cc02a9d2bcb724673a7f6126fd22b24d7ffdd7", - "cd2c2eece3c8bbcfc4737ac4e65cf5393cfb6093c04069a73b7182535549ac25", - "0a2e03fec70b7011e31e2e8a45f67ca49c55932c06c64ff8aeb57d9c75e67a53", - "d3baa8ef255a84eb44618de01892f08df5de6c75f4c54b9de5a6d1480be577cb", - "3bf716dfceca8db390b3a6857a230393906a607769c8e6c98de38ca6da0e9082", - "4e90cb9b9b58b2e0fd113ff4157a440a5ad0dfc5a35e82d8154eff4286bb075e", - "7e1d6a376b4529c4ed7b6c48bf9bd9d3c6f6bd5344ecba3cea7e9fe5c75c4b7b", - "a79e534a696c0385783e7a4a465ec6d1a8b297b4936bd10380a431397ff6d14c", - "defae6010a7d6f32a4df72c334976bc7e3f0c8bf191f2f4b453046a2bfef3b5c", - "05b702f2df40d98d3055ba80028ed7ad958b82193dedc861f0d23aadc07532a0", - "53b3a9f8f99990c9238504f386769001f3a8506f3ec31c55da1cc9cf7253749f", - "2f267a7b495b232408def9d3a920392300fd71f40a716ce359daebe30e3ff1b7", - "a0741e1da33eae81f1a163db72009d2408a16ffb2791327f1b846bd841d201bc", - "2d89be90f8ef2eb717f814087bdfbc0d61dc1cb1a848586b7c4ca3169929487a", - "91730d4c087fb46cff40eb956c618c9cd606a6647248d51199c2c194e74fc4e1", - "ed5727c0103ca49815b4a0edb25791ec9b6b0f664a703d59ce9e6094b6c7a386", - "16857a46c332c35561bba589639e0316a851f5edfa3c7bf7ec219367e0e79067", - "e21733a2412ea94f32c57acef447b70e3f4a7d8047509245d50edb6ae79f754d", - "eecf6c948e7ca27b8b243466e1d1e3814a885f225e3765cea04570615681e161", - "9124a720bddb6900dbc9cceee64b73166b92063e4ac33013c224a22c2034357f", - "316d4973837ec332e95776bfe4debaf6ccf36042b8638e9afd489b47455e021f", - "27883fffcf31e5b9a96999daa8a131d33847bc36e24d0ad5624137a2ec74fb0d", - "ea9be7def3adc1d1a583bfe523fbd98edef73b3fad8a2ecc1241afbcf9eef689", - "046dd050598f6d231bd1094068c12c3614e35c27ca8475b0c294780be10de221", - "f8a3b55b2978696a23025ab96681b7138426de1a36f629164502e411f433f89a", - "141f3b3e7d30665211062dbcb3134f0fdba5ff0baf6355b8a6a80bd623c44fc9", - "412db80ea2eebdff301a6bbdf5777d8b2b1bcb248c03e30c98ddf9b18f3d66e0", - "a258f9660056d49328140c8f5632fe2908457c4102e95922ac0d1b4cc64b5228", - "1ba0301f54bea7d032d683edbf7110b32800fbe9229def9371f6bbca97bbd4f6", - "3f492ab78c0618479e7e467db81e7ace68f21a7669639f746e42c705d5dd02b8", - "f5f2cf750e37d1bbbd8b0cd379ae5b521c86afc613702bd13c80eea6f9efe0f7", - "40fa9f62424f441c27534b136ec948d3babf1fe23adb27d324351534a454ba01", - "072ab78b768eda2eef172f88cc9dc6edc2748015a7b852d4f337c33d3cab9d54", - "54a434062ae64105a2e11a2137af8e38ab53f10253a002b961a677660fbcdb31", - "bf72131203d6f389c78543360adb1d45796b01ea97d7e106d247bd45a587aab7", - "a697b79e39054fb1167c6da585d33052d7b95ae7060fbc6f0224edf2a51684a0", - "30e9393211e867e3f714000001a76e2a81f57b80f3fcbd14a300721d99547d36", - "e201958f937f6642181d251262154a9c78829a6d3416f406766238d76ba41280", - "07d941b490478ae253c9d70a48ce932108d8c51b2dcb84112dbc4e83fc40da1a", - "1c1d34c377eb0d9c54f064d17193c1cd62dfb97215b204f79783d54df03ee340", - "57f41d33e2120649c624ef8cce2573b8fa5035eee7b404c6a6e11a61d4ebb2eb", - "e147816a9736976da456d9fa2160dd19d6592d164b1259bfa73ab45e07611f97", - "f7451995ec270ab6344588b4e504ab46f604e019956516d697e5efbab019f334", - "475cf924cee50acd41f05ebbcce2702bf3969c283157da118aced368e1b5e295", - "18689601748e6b4c2e9167e21e9f7baeb00ae98625b603f29cadf0c0d1400ed3", - "81e10572a0cb753b26698c111e58864e508e99d69bb35e2ff82e45c5298277b2", - "24ac6110684993cadf57f525cbecf1fd33d21fa396d2442af4d24ecdf1973829", - "cd651e372aa33c9ecc3b4943ffdde732372ac774489600faa95504edf207225f", - "73ebc0047613273aeaf40786393432b075ff0cbe7130ba6a4d743de02c38aba8", - "e2458c2d324503a840da752dbe811d4a45fe0776aacdd7819a63946c38b31f38", - "3235c60adeab216e00ee793fb3537e5278fda79ce1259f72da47ba85b202131e", - "7fcb3d22927fe483893c5d7f0ee5117c472ed3292798ad06ea0a3107c6e5ac29", - "b854ef9d58e82b9636c9127dd32f0eccdb4f35feb6a77539479f407cd4cce341", - "eff41773ecd20b3bf30b3776fc5cdaba6244852d645ac6b2aa2663285ad4e9b8", - "a6f7e65c4e171f2a1f5ca54c380d370dd7dde7417bfb3013ad8720a94313a588", - "6cd4d6c48e805a901642f533425eee6adfb31eab66b0759da5909cf21cf97768", - "d90325584b34aa92acce5c493a482b0c749aa098b72fab47ed74c79e08fe5cb4", - "ed892811a801908916b081d79febf913037d3ace889505ebf01eb26d13a5a7e6", - "a966d214c4a22b9456561aec8e3b805396edb5b4de4a46f4958cdb254aa88305", - "a0f1fd015c980bd2df4333df5dae6bd79fe9b7508a5b92698cc86f19c82d5a4e", - "911070d4b846850b76bc5bb589839e3802873541093477f130d250c34424354e", - "a183891df2327c3941961600cd2a5f7f478147501573ac0a53c1c54852a2bc8f", - "50ec4065260e03e0decc9bcf3fc54f31ae420d483d6fe8482bef836c50ed4c40", - "8bef647ecada89e99c3e7f928540cdc9d543b7f3a683f8cd12b998f5e62e5d41", - "c93b46355d86a974d494ea742b3611b1844bb61f22315f87385b0dbbd4f1484c", - "5c5fdd0aba7cc504c24c9d5b8cceba1df5a5d9254aa88757dbf987ec6cc2b5c5", - "84a9bd189598538fe22daac1cb2a55e36af7fd7c74046a05203c1ab0507d76ab", - "3cc9f53bc2617f7798c163bbf9aed7641c7d08352ce81d094af11316ae7b8d9b", - "a0b41291346d89c5b96c2e8f88e309c2a78b2b07ca7fca17f1ef20fa24c55f32", - "d9d648836aae110480f8267ea0243e916d90583e8807d22aacba71b56fa6f363", - "abf3250b3289d64c38acfcd0f4339734ae10b94eafa30dd7a5e167a49926d521", - "21f33bcdcc66aa184f3e7aced84a15ee542b32128a13aebfcd02e66216f71914", - "83a26f26e25986485f2e68eef8823a2cb09768b691e24c427cf8193551ab1149", - "d91d852983a78496f4ea179824f28cfa5d95ba24c4fe2a88200f99d192b4ed19", - "0037d89829d7249b627e223b73f970848e1c61d89320a341adb87ccf26ede6ca", - "43b01cf53e10763d2c6f51912628f2957161554d31ec73268d48f8bec7cb5c18", - "046fa694d95c8bc7cfedebede04e930ed355b417e0a68eb523072e882382122d", - "dbf76d02c17d501e32bddba78adf194cab48ee342694398588bb09e14fb8f4d3", - "9a0e6d03f0948e73faeb7c101df49813b508c1ba74e3707f3fb868a0a5dc102c", - "3e05af38bd9a5b772cd959e17bfdbed75a83f110561f739708ab06594925e2ee", - "daf004f061531fc8596ddd52b8f38ca7bc3a95e68a1c7c551fa6b1c569a77d9f", - "1ea478414086db680ee4e93d8cdb7fb56c466f62e7380f5b0053356b122b429b", - "ee9a424f0770610bbd86a0609c1d84f08639bb8a401b95da64e226f5878b8534", - "c8bc9dcb8ba1cbb243fb3b6fe36ed5552e363de0f94b27b70e0755b1e92a5810", - "03692f96a87736eaa38712edcd752adf557b6911f22dee0fb389fcd06f2acfe0", - "6a12e93b55559db9edf13f4fa0286056e60f7c8895a66e9d36efe11e977587b7", - "6b1cfd653dee0aae8547ee601034f496c60867f7297ad38d97a04dc278afd58e", - "9004a6a5d50791e115d183584ff0fbaafa58a5c1b0f0751784bb3fb637f95612", - "089455b7d23557745c5197d30eab0fb8461a1d28ac6b1efb88eb8f4b9984936c", - "50f53aa623e38c69a7c1582da8ea8c68ecef1645d59047853cb7f9d48a352ab7", - "916bfc160d153bbafb84ae3eeb12c7c344a12cd2b851cb4638af1e7369a2126e", - "20457047d82819728439f74396fdbe13b8979b5bd661e9379f4d38809aaeec44", - "e4a700ff7a0091cff3dae6b701a6166f7e6dfbacdb4fd8f6d514a1111e25409a", - "4d67daf61bf396966933fadcf7d23d2e753b0a745fc433477c392f0b4b8ae1a5", - "a362405f2f8b54be9e701aac38986220763a5d966054f6e4e118010e65f54ef0", - "652b5ebd228ef84111b3b91825d525551e8a550ff7d307fb66e1ba4fa83c1802", - "8cb4bf29fed066669ec620826b7a9c76ea28e92177a21f535150817dbcd71ae2", - "918bfa949230efe534a8bbac42c5ef97a60e2a2cc1b3f8acb78173417346801e", - "567364eb44637a1828213773fbe482abf43da836a6f835d23b1cdbac8c3d35e7", - "b6fa86936984a90ef290f2c577e81f78e13019025a2a3a0b62c1e737d120fbb7", - "54c4c06aaf30a140697885d7d34ec2c2f231fbad5907bdad50258511cc98f9cd", - "8f6664e44658780216f5ad8e29c2fc40ec211aa559f1fe5710507b284a022212", - "801baaaff66ad9d40e7ba630cce61c12dab07d9fb39b338c7c4e552f64570b8e", - "0c266ae9e19034b6dd6464e8e0afe02e057a4acff017e0686ca9a58b521e4767", - "625adca8f33d595e8977a3817eb141da22d792b65f6197c401eb2e384786049d", - "61eaf47162772ca1ed9ca7c88a9de91d878278fe7cb8f3c65394c8514617d491", - "ce01ce353c1ac2665fd56ea72b68a9589a49ca9ffee2410b0d328ddf50aa4e59", - "784715070e9613ebf518d24f97a2a1a13ebd083b3d3cd663951b82e8234be90e", - "668980a274c552b63d9a6ea0975667c6b3b3bba00702341d162ebcc832f6485f", - "7b59add35c3df9a0251564013f959198fe48f4bac3111f6b0ccce3fef2452924", - "75f0ac161a7c9547270a9f3c2cb50c3d02b00dfc77c2ee1bd72da585ee0dfe52", - "2765d0e606d8139e377fa8e2c72b28b0cbea3872a90b27ddb405c2cf0920cfb2", - "b3d7984a6eaf7d2a3178db25aa3c8ac45d0fe586b5acaee1558d89a0b4a57716", - "8441e59293da3e4d3d8950a8a127a0ddc963c8032db0b13f08de8ef76a0b55ea", - "494bdf68c0fe721a7e9087da74d82ef902723119e69e0032d6b34664ea5e0504", - "7dd0cb1a70d2d96c32e345df48d9f5cd793be88ade269959a922dadc0bd5f2e2", - "6d3a95dda3809a2100b9f4830401d7b7b29ac117ead3a1b522e70b54b6907696", - "8c8c84507f79f8f04b4e304bf83fc65b8fee329fd3e2f702a59546245371d693", - "264ecf7607e14294c67fbad9164154793fec04cc6dc29f3c1613878b06278152", - "03de3456f2ff10d0ff476ff19ea383a9f33f756de305cd575af6a764668d95ba", - "e4cf204258cd8a458c9c6f45d586a8935159304954fa9616188475930c92e289", - "b028f96041361790c49284d4ed794571335f19cbc85887acb8a924d27bc803d2", - "36518912b32a24826e4e2d409ed8e0fa4fe78dce2dca7179812799bd69182880", - "a6a7bffefdf7a8634f36edac620d6fb1fa5cfc9193342b089b932a269b5a48fa", - "4f96db84511966b927d0588f4aeb6da8bf7a2e8f0f7b4edb000c16f06fb6ce1e", - "4a5707ff7d5fbea4f8a45ee271407d607e91e677d53eb51431b76960c77d6c92", - "fc597fb59f5d7aa6776734fb1963639463298ed71fdb7320f12a19c2c066dd18", - "9310d2683ae8739be2d8a4e163943967cdcab78319a6593a0ec440e304c2ff44", - "78f2bf80a49ce495ffd9b474ab96f4b6a67549eb0ecb603593fe48bb4090a210", - "19c937debe4d57cce9cbc4eaa4179bbbb3bf2593318c4d411ec63adc79c5f27e", - "4d22da6fce687bd8da40b8a47bc401a4877975ad99fabed504641d5da301bf53", - "e7d4226d857556c0c252042901b179ef376028b1842f4a514c15c3cbd841475d", - "508691d13b94c3ba57584d409db63611882ffade7ad5e50ceda9ae0ca8c5841e", - "e8ebc3d36130b5413c0807ea4ce556f1529512dc505d253e43ed56c0fb811aab", - "d6084bcb52558c6523499d10e065fd7f8f7d90bcfdc2e334b1d05dc8651fbe70", - "632892ea99df4140c1c7ff2e167a5c578d835ba0603126550c2b41601b8a1127", - "5a588eb797ad6e0127cec5ab095ad7a228a042913f604f8c72a61468785cdd98", - "50301d2e1fa0f0f1ce477ad04902e4441e39c5dd45eb62b30035a8ac1d7feea1", - "6e4fee1c1db8a8d59e41a04774a055a2c3cdda61c01d9d22f7649aca968cb7bb", - "638dec165230937ab12c080a2ad80fa7078bddfc86110d999aa94d34c7542b59", - "b508708b9a6e9f708f25edad895cc7f8ff53b9527fbc611f450ffc96b329769b", - "931873217ffd4f8f391a8f69ec59b5ac72b3fd4e84d99d363c77bded0e7ba6b9", - "af0818c68fed60f84e04de65a2520b817407634a00c159732d753cf192954b66", - "e8cb834acac187b0bd511efbdebedfc04871da3126f9edd242dc83d5788f7351", - "d41c7b9e3c9378ac635c78ec552082f7300687c4c9ae123462c2a63acbc57677", - "a7a8745fab1dcecf17661a03c067871d18b5213f82a1600c33794412bfcc8165", - "7d7c94f1c280858d878ae516f1f973832426c47dca1a98f9125b34695a35bd19", - "127eef39479cc425866911a48bc0a795605cbcd37822d3ddb96a3718d893fdce", - "e80c60e87bcfb3f8b6a9398be97e13ecb2c197a8c7765e5fec94d7d50a0390c4", - "b1fa9fc4b474bcb1bcc1fff350afc5ce6e49fc475ffaac160a445dc4c8c8861d", - "542070ace034b2c4c884045ea05141c085d9bede3d1723ab00757ea8fcad0b45", - "c10f0277e423386d7cc1b9426e8d9dd7054a7990c2a41582823638551535e484", - "b1d16913b56faddb4865e1a6728fca8e614e8a5499d2eb7acbe2c135f5938e7e", - "2132a76cd85a365c9e0377d3b9f5fcb79a53a662ddec60aa3a6cd438ae5bb179", - "5b088abfab61c32bec2fe62c50fc1dec78a2240526a7e0f62bea74fac7df01b6", - "d12864a34f247e142e3e6446b9b83557c378cfc7f0fbe76ed7f4725a86d018fb", - "a1405484aec3bfae255900762185e515380b109717168ca35fa5b1287a63228d", - "93931e2a90c6f06ea50ff23a4006a925f9923a1ca99b88a173a0bdf7762726a8", - "95def23801a63e6f2b015da3fce7dcc5d8130647dc738ca8b334d60d58172b49", - "e46f45a16bb76cdfc77c2f4a1c3c8cc31fc4ecc269f8e4d515ac062962364036", - "344e92a5280dddacdb2d3a8edc74b32933f9beb409744c1d488e25d26cc798c9", - "0f09954de364f9f49283da2097610f457d7be87d7914e411eb697886e2344553", - "b4966a040b05c337a8b4fc6dd8d242c2c4966718bc70347826057910ee34dad0", - "dc029353ee05f0d95ede1d95889a089d93f4bd7e13b94cbb77be899f9444ab76", - "6bff5007fe2767e7a6239414da583e52e028f7092ce9f2b7fc3e8af7c3da509c", - "c9dbc4d72d38bf2690ec801d9a2ee9e6077ed17c3f660b90500c7225bbd8a00a", - "fad5754e948d53c0a08e6e3197624065862d51d1a51f31b6a653501603658f58", - "cc15642a35f2c1daf75314e498a60b031e9d45eacc956b41030bf2712f84bcc8", - "39d2bf96bd2173ae9cb97c81be015658e804d2961589b9f19a55eda8eed487c5", - "333d46bd5621531fe831b56768ffbdf1938256653f78e7fba01316c391dabd3f", - "f86ffcacc353db5cb5d92e94eec52b92a6f138be1f3f3fb5c3ce88ad62e3f802", - "243254f465a5ddae1f41b0d481359f3c46d9b766c8ec0c764ee47981d8221d7c", - "ac122ffcb424ae4c701ebd5c65deedbba3d8ae54c95c792577506c70564e9452", - "4435d01c9c363daf0a8aa37ae312d566640f0fcfe02a21fc9d975209f4c76190", - "35577a9723a7d80525c113711e6bf48cbc46ca76d6f8b918347aa62b2be2189f", - "7c9e94ce36557273a495716140eea8eb61ddeb6087fed96f3d76d83d8a6f9b59", - "0f3c23833af96610fbbae1b1e2e120f32bb7fa3dcb69b6e3aad5708cc3ceaf09", - "25f90e4b4573c2b0f01e99a9de9ff4aef236a6caada8ded705d9caaffd46cfa7", - "4398789911c2e63528baf5e8b1519e2d96bd9ac1aacf65c59b819652874bf268", - "bbf047d02ef9e0fa85e2bae8ff150cf9cfd12b7d91ee07515df8aa15350adce1", - "f7a6ecf2ab45b4be649daaa1fa31ab956d71bc737295e7b7bdc0c9d353c2c54b", - "070d04adbc2b237359b37bb0c8408489f19c7119db366c148a53ed246f2f9cd9", - "a1315f7c03a5f21b1d31ff182a6ab117113e1e5e8896e243e0bdb023e59f2c7b", - "b280325ccb579ffbc1833bd8e5254023c91b160760d2c01c973e5ba120998076", - "b5d1b98925d53aab47ffd1fa2ea8f0dc3efd2aa2fdeab3852157bca5402d7aab", - "16f3210b6061dc0ac8dd9f628c4e90c7621f2cc0b64b30127dce8d008ee92eb8", - "f8a067a22e364971e0946f3661b07add533f0e0bc03dbd15db85498fdf1d3744", - "be21755c57ba5f3d86eb389e67114b314f09c2204a59358b5f042719ef356520", - "bf2509e14d21ffd7614a54112f4f0d77bd37dae4ba9088b2a63313ae408733c6", - "7860ec451613326acfe21d4e128bccb656d19a25a26d623553a1b8c9548a12e9", - "237e3fccc5a2202d50cda472a97970bf094d0d06329d9bdfac0437533d43219f", - "b96900a2bc698cb6bf28b3a6af9ff8cdc14b06dbd9c14e14c18e53669bde1fe6", - "6c2f34f9c60a8e38f061bae404f9e8a1adef91f613d8bd4494ccd321c7f9a209", - "d7e2f2fc02cc98fca178016d3809dbf0c4d8a43c3746dac29ebb750866c45a1b", - "adeb3b41ac643132f45965600289f786741c9f6287c226fe8cc33e6c30094bf3", - "f47cbee5fbf9087be18de628f23cbef2e52e3122405f768dc9b80e58a3ccdc98", - "dce16543b498a58d190831ae9cb5aedc7fefd49dc9fb082dbf95c09853ac3b2f", - "5ac798f94d82cf127c60e3c0597a3f449c6428aeb0859d74a21b2651bfdabccd", - "b01201bb2115c7c2e2e26133da0ed44ca28c0ffcad92eab25ffd0bafb8510456", - "43979f130d8f9bc7778527cc5e631b60c615e5a07f23c2deb7cc07f94b2a2735", - "0159c38146d98cbffb47eac39852243af6e78ed2710e01ee3a987826e27a769f", - "e08240baf8d4f11ee62ee240d571ffb0c91e3547927f65d4b9e905abd547aceb", - "c3eab8096e75f1c59b9c1ac38ac35e99bf692f92cc0ea1088501568e548469d2", - "ef1c0b59af6d22dfab7381da951937b726453818737a52f17ada6cc016e60905", - "634ac639586d14decdf2e00dc4e56fc6ec7e6108336d57444e6376c1207ac690", - "9fa4387b9a9e4de91f11f1cdf1c35eef4fe4d38e4548d581183743a2f6dee23a", - "b7d468cdeca910c455b5e7b71703f7a6bad05f2187c2477a9e41dd2259bdfc1e", - "0c1f69b777aa9d8b15d41982ca074d6d70472ee32d72c8dc3c9c13d65f0221cc", - "ac46625af5c98902c3998aa8da53176428ce8f2b647dcb113a65b9ee14695a96", - "9c488746f5e373c63ad10712a2f72e3053ff9ca2d5a546fe9542b11103e1560a", - "5bc5593052a06407c9b6ffda795f7e7b3a49d88fc78d9c017c4ec0271c280906", - "c1db6354ad5a9d5d26281e572dbb9122b1b012344f5d629c2c68a31a67437466", - "e6fd569a504368dd91f62f19424dedfbd45a4be91958dd9dcba712bf0fb3e761", - "6ea0a62cf6926343e93b6105453c943625e7f9fc20829f692e9e04a0d9b91643", - "9825bce054221653eab05eb066b814b0df08227c1a57890bde7b8997fc22412a", - "ed5c7348b239160d31579235cea91a05bafc6bdad123a315a7ea10ff40c4ede8", - "e6eebcc5557134935da6e77802be57642dcac91c6aeaf9a50edf9872371fbae3", - "17831244f87f1e5509b2e6890e6a48906582b379b022074949657e66d435b3d3", - "57cc6927a6f95cca8f3e0aacdb0c6ae558fd1ef62a8d17a4d60755ad098fa161", - "4e09222295f2bfd572c2720ee2653dc6519b27dbb2fca39e6dbbf69e2d392202", - "cef9e3cbee52808ae5a504585e38ae46093cd7f4e53d5a214e371d7d713e526f", - "55db04f23b40310fd9d58a0f0b114142749ea56dbce174830617501f306d2697", - "3ac96e33f741cc49970cbf1b3442f905a710da9ad16fac67172d89a8b834bcfe", - "459feec3abb649113f549ea1bac4998518f0191456b9b9320af9041a20e5c0aa", - "606cc32f2e5d5a6cc42f0264a6f1101c743d1523599594442e7c865437c14fca", - "16d57f9b1d037bee7e0c67572d482b8023bd7720e0318e20f3c39ace7ea6837c", - "e6fbda7b8b6d0824818d47e9571e7bf6de9d4ba9d4672af77cac3be3dc837ba7", - "3b2b0e596837e7210af63176e642c54fdefb01a56776978464f01a4f9b2cb2f7", - "4c55bc8c3bffbca54fd79eefb72bbbccfc930decf01d1c3549626196c70e8b93", - "6245cbba7db0f005fb65170886ad55f5f0479fee24a045b9f3faa965e0cf26f6", - "819ef65727443bdcfa5b1fa586ef9b2afc43729956a5ec11685f9a469e0f1ba6", - "02824cea3d53e7ab3842be6279f4dc35f86d8df9db218f899cd439bd4a64cd29", - "042d5c1b67a8288c8c5f5d2d574098708bf239bf2119d13ec51c22bf750ed422", - "3a6805e7cb0844f60f742ca32101aedc7d1e9f14bef2e1933e5016dde259d9bf", - "9a63ad896e04436247c0e1b6ad89bd9be45a972f0d22c4b1e4b3e38622d8010d", - "5a2c7692ac511b47ac5ad75d639936c20d25610804e83f5c4ae88f732ddf4dcf", - "428f4307cc1c013204a4c7fee06d1b0342d504b7c7994c558cea0286f26cac88", - "7514df591ab8b78e3560efab5baa8b4065308723e1b62260ce975a7913a94755", - "f2becb2a09b93adecb435e9f0c4d794cd9052f588157aa96656576ec2e8f7286", - "efa349c431e39baebca0993e2913491ebd02c626bc3ed2620d79eca58e86b776", - "5ab8114a949d05556ffc0a2aa272312212c10dcbb046551eca5c6df87e9a1095", - "99792462a95a2c4c197f3cc5bc072c5a4c104fc75cf0c26adada32c0e9b5025a", - "4c5547d6a13363adfc44cceea006ba0083df1c2f8943b1f8ee44e65c7eba05e6", - "1a04236aa375ead964d897ac6d0dfdf0a3087e9a72943ab98c459b287272f1e2", - "fcb9f82b487813a579953d23f1632d96759066d770827881c3799a5ea97c6c3a", - "1fe2235905621086b621a7afd3600ba4ff1212451ff99ec467df906e620a8074", - "923a9ebaa191c2987010830e8703d8687c2f7d824185d3ee75ea44f717654bd3", - "1e50e94cb05a7bee1af32b8f431a57054f816dd9dff769e56f639da5ab75c5a8", - "545d11a818cd6c2588c519ebf19381653a40cca08cdb671942ddfa9052c980bb", - "2d4a9665e5468e3bb0ddbc142b29883333ba386381229b3e0630d438abf015ad", - "6dc6b6bc94456e206de6adf9418b45c14a0a0847daa989e7df1dbb5e9022a1dd", - "ca4220179ea80b40548a5024730ea3df855feabb90eac02e600d1af2598e7dc2", - "a86a860326fd62e8e2372bf61cd76c907a84e5260baaa5cce27a226d6bed30ab", - "b9616100fc53f006c248eaa0a05c5c352f419b061179fe24459ac2819ed01c95", - "6e8dcddc09b8c621212f6565b18417bcd7dfca9a9f7f055f55315e4cefbc1747", - "fc144ba656d95998ad8b6b06a767f37b16830121d2bcdddf194de27c3533a1ef", - "f7a901f8d243ea17495691705fe0ee49e324c848538ae9d447d067760321601e", - "3faaa8e349efa69daac7a5433486e145175190a9c120f88d64fdbdfbab3b394f", - "1f13b1f328e775328bbc3083b592e9a12c48c53ac0619e350d7af83131bf6a84", - "823e704f4c48a684aafe8f56dca54e29ed6eef3df902db6ee5e23c0912f89f59", - "b0a25876c294dc4282487d713cf30afb1846b5eb5667ce8ea7fe3c1fe91fd659", - "128e94865d14be47fd5fae8130c2a95ca74560bdd15186ffbae485589c2b90cf", - "117ac2b502310de841047d9d325d6557d414b980af37338d6aa1a5e67b857091", - "023dc0406fe1b69d77821e61a6681bec2cb9cc6b2c303b95a47f6ff3ee34c534", - "1b24d93b8ce06e3f686c83f1ae474375900be2219849743a631c76cb5924ae9b", - "33caf22f91816824eac934a4b621c563466ac02afa7fdf6d0442558a30ec84d5", - "0a9b535f9021c315dbf1c141cecc15bba1305b31099c99b064731f15f134713e", - "edec6e99ad1d79fccaa6b88143048919ccd3b23e80e9d4597d2969d6b26d4b85", - "256a5b9a6584f00bbbf2ffdd803a77b791916224e9a047c69779f179f81dd5ae", - "702ab0e9a114d0f585b113501067e50f408285e83a9ad1c1af12c09cef36409f", - "1174c39e9129027d3686ff3e158a5fa178ab379c7596704de85d805592982caa", - "e9108d32c563845205a463162e8b46bd5391b1578446f2174df1ff48df68ac19", - "fbb04354d8deeee2f7a0abd381b0796c57316718ad89da7d584ed4e4e8ab58de", - "e730797a4f328efb60dcb615bbad2bc6654fa474c9316df8092fbafd0f034c5a", - "adcc29aa7aacf64e94f1e563f3e84410dca480bb62b832cdd079481e8cfc04d9", - "fc613041b3b45d8dcb9e5eed46bd29717d1b7ca9e1c1083d86f3f174b7d3f081", - "7548e0ed180bb71b1246dab8b090ccebcef93dd5f09297c3c559a5a74bb2f733", - "66013301e843db19afb154d7c055a1a7be656e4c412c19a0cb494c863f14e73b", - "83cea8aeffe0a558945f4c259b4ab6e3fdabcfb52527f41b1027f1ae2738de6e", - "503bdf5832b784f67bbbfbfc31c15387a964d6b787946a3fd5784f54ec79e503", - "5b9035880837d2e212a8420c98d7568f24630d04a26298a62d8a853283db33db", - "4275a177a546c8da45483b082fed384c98b36627948ca5cf7c8010ba18f0968a", - "508f6c6311dd6d0d7f38f6b4129b1f536c48d3d0ccc934054b8bff74023da048", - "652c76dc3aad3afcfcae006f2c3f0eabc19df91b01304d6f804cf2d3a944f419", - "a400cd05172dddf216339bccdd746425648dbef13b2c5b7c623191784ce293cc", - "7c0eae957b1259dcf7c9ac387cdb6de29e081366395d6f210ea45d78ca4efc81", - "ed49cf0d83c606256dfbcf6aa917e55c581741b5f7cc4d5164f3ed4f7d83fe57", - "238397b4a492fa14bc802db7d58f69179b5320e2d382ad42f996cc4120722df9", - "500a6f46d421b4053fae3df061399c4b77ad464cd78ca4973c4e31d3610fd431", - "c6f48431d31a70328bc49723a201e4e9122a802dd2844c471e3256e9d872f837", - "ab30bf29b567eb04a6afc768cc96834bcd89daf672e924e9bb48d8e5aeb285ff", - "b3bb69f9526f64574197d924b7cfc28c02db9517df3bcb2349e38faa2228e5da", - "2da2dfa1ba60da7212ee47caed8b8a865575ad0bad7a540f8284069d7feb9c9b", - "3cb408d3d7629c62ba41ad0ee49e2fc179290e9c0e0ad68f9ad42f39c5afecad", - "40b0068237072b9984c021e1289aea1853f362790005303f80654f6cea06f39c", - "d34305668437d9d22351e35eceef488367137b4f087726de3f04bf727628cb79", - "3636b7e9e377ca4590b7905616692fcaa0d97b5ac1d9dbc8bde19545aa03d98c", - "e50ff1a00cdd52a61d0a3b397e02e0f240f4fa0d299151ab5d8b6cfda2636cf4", - "af65966432ed84bc8cfe23717f100f1bc4386487cc77da7cead23936ce3e33b9", - "3859fbbf89bc0fe08aa20fe4a3df286ca459f96ac60cec311739b248d343efe8", - "927684a9e5a91ee0c4ccc2ef9c0bc8ba641cce916ca151c0033fc08883598bef", - "8fe62e62a0a892dee7ff6a3d0a0dafd54c989f46480d8aa8c2858bd4440ec416", - "4a0288a2187a753ed5adb632ff59b8c339e20300e2a2874b5799e51b5c06789f", - "50f79a6ecf1b4b0658a8ce98fb7ac1cb5434d02539a136bd5bd8062456194aa3", - "fd0ca13ca889a9fef0dca0b8df6e3c687b3afd91e6b7ee439d3d03704108bbba", - "1441b0653c07a8904612a9ed68fd016233a6a0845c4cb7e245f0685dd69d227e", - "d4498335ea428ef63e171ae456e5a4108efef024215302ff26244101f2742c0f", - "a04c567afd3ef8fe864a6f36608b35351615e701c354487a3ab630ab1ecddfba", - "ae62a5912d02b37a8f1a14fbdc1e1c3d39114f015e607ddfc8357381b747d302", - "29f989faed0a819a7c3d8899691970d5b2f756e0b2a6ae6445e506411f552535", - "ce7d0f5c840da94f28441f34b683f4c2d617144c64ffa1dadafc43612bef894e", - "f389f5cddbe0ff33fc8c38c66bdc17e23c2184aafbda0fc23904939f26e5e92e", - "ecf8c3ed9ae54ffb1df089342cb2e4954ff061e72ce0f9ce236f3e17781f35c6", - "b3e73878249fcb853ac3e5826a642a31a99518fea53a2ba292fedc9983e208c0", - "ddcec5f678940ae39fe2cba995258e7b82a23168b29a82cb63b00c519f2d1906", - "7f150e7bfead1c0fba1225618ae5de153d31f6e779d16f1f93df45750dffb1ad", - "02083923af86bded218c389d35970eea73f0996fdbd532bec99ca95abae4a371", - "84943a56ad11cdaf7f6cc826a6f252cad6fbfa744bd0fdce67d3659a32e5a367", - "07d1c639e796817cb70bbf08b4e8cfad789b5be36c54d0c2df905c65b8a53300", - "48391df9b598a2cd74d7be43d68a611ad68df212dfc80201058476cbb8508b27", - "7efa97eb50a5fd45d0805094e1cfe10c2e3db3cf8172bbe84d5e5f2e543891e5", - "5e6ec67a1a90b2b61c57e5ef247a90d9c7dd641a73836ea294cab10f0a02e7e1", - "73aee0a9ae6d0a5b4e9b17cba9a320f2e84c3fe94b9f20c359d63c0fbf239c79", - "ca8919a4bd14c61988b1dfbed61cd03917ec95be509e1f888ce1215f6ab9ac31", - "5475619e9712457e8837c381799b46411a28238fdf48878d15cf0f95e3468b3a", - "11da66b34e12e12d3a7f73b7fb874eae6bb1878a30a02f786b3b402ff3477bd1", - "75ff5918699c4270ac6e08423b464053c069c38de353f34f56608563a3491429", - "9faf0cfbdc01b521df2ba52d6181a5ade8845762fdf45c1a4583fc5d34f402d4", - "99f6d5ba96570b78e3c49dea4f53e5153407bf3b7b7921d670e78fc19408934f", - "0151f01a60008a9a543992632a0e0a4472aafa4e5a16140d5c8fee66319ed41f", - "61e54a7c3cf17239d6b011f0e3548dd160a47ff8f3b1d4a2617d8cda5c08b307", - "29cc57f1a0d1c913a2e051faf1bddd999cd55b22d099bc8f2676fc01fcff5d8b", - "42076807d1f5b5ea15e7ae37bc240370ddbaca9f81ca099b33bd4073d6586560", - "615100c37d5700cbccee96a6367c8b4abf3f99d0ca9b056becff59e6341cb68b", - "493c7307bddda9cf67b5aae9bd6de6edd03357e3a8f8ed74a671cc38b9406c74", - "55518de3c54bf704c376d18878f0b825b1b65b97d4f218af11ed8d8ecaa15de4", - "4cdf00c9d454a11e26a9d01d62437a5ae993dc1d182a93fdc5dc8ce515ab88da", - "5634b6293065cbc74ed12e80ef528f6968a923921161dccf79658b4817855e7f", - "638a17788a909140c0748709e49606e1330e5deae2bfef73a8b00084ee799a89", - "734b4cd21f680d5310848aa0066b20b7fbddaca2a292b5ecdfc430b949b13b7d", - "f7f997464f41860992fd782144862cbd3930f65b082b673da51a8c45993d5a12", - "14903f37cad956b41116e2b8a02faf93176e77c2ca248ce7948d00327590fb67", - "a2ea61d262a46c553b437e0a86fc35d6cff83d3018ec75bbf28d520f8ea4938f", - "f7ca020691d36dc69f59443cfeee030cd2acc60f703c267b11c06c1ddce71ce7", - "e4c5b3110cd3f901599013472da02f82b2103bcf621dc4c2d75cee64cbd32fcd", - "8db946f6bcb7dc4fedea4643220dec7dea0ae5d74859920a13a0965d87ec401d", - "babbbf5934a38f74d722b762c48b28a1c5ab3e47ab291c0de0417479b235bd75", - "9f5c2ed6bf56c8753cae2306af8c926e28395f95926acf2ca7ac1c1fed0a3ae6", - "cd00c4969e9d5b43853975647cea7ab43ba4392e73aee2f19c85f48da7881fb8", - "a777c6cd71d78df963356a3a8517c6cc6c76c266004ac9d13a9cc136f1ace1c3", - "1ab178a6fd4554a2fc7b5589e6af2a383e7946626458c79f98ad83d88883a0e2", - "38be798889dbb6aa963b8a6803049476100816ae0d62b3fbe900e0520502025b", - "41cae10f39afd763a7cd065cfd28381c42b98a9dd3c03e2c99477c793f21087f", - "453be27d9826fd58625cce8144d3ab718f72232e7d1ca92c58c791f5f5c13a7a", - "f9dda20488ec69aa1bac9543a93989db3c560b13f770feb83e51db4c48d10198", - "ce184075197b4427610f50657511e855aadbc7f0ec55bb9c78064a41312b4026", - "64bb4b2a97893421a43ed71a62792bd6419f568e11f77c9df551a07e71015362", - "4c1149f9941db967ff6eaf95f979f178344c6c484c80946d968a43309f38dae4", - "d5473d66622293fbbcfb6f6fb2e3309c495f97974001acffa55d540bd0ceea78", - "00af906c49757ad23d1840ef8cda1bf7442afd5402a6ccb732357375d056beaa", - "d4af11d67f00eaae13596beb2df6b14e49a8aca9b4f2187b224b9465284d638d", - "cd30e31b0a58c942de4a2151d91673298b9a343cd01ce99a906184728f74d0d8", - "297c1fda37a9edbe20a2b4eb262b6883d3313e4eefbd21c35b1430b713f37212", - "5f6e23584ab881ed03d1b579849888136b33f40c2511b7aaeea6e8485bf4973f", - "cd707bbe70df8c9f86ad739fab4713225721d2b12a48a8e4a5d67b830a28866d", - "9ea587852e489f48ecfcf60d63b30f6bcf1e44f25a9e5a13e6b43abfdd276289", - "43dc0a7c5782c8574a5f41a9e1fd206bdd92c7403147ec60d8ffca14efe84990", - "5668d193aee446761c78494131c697644b3dd8b5b23f527a045157081c8b876c", - "ac2d477beeb7c095aa4c84563b7d35af46de0c1fd2a31243281d0cf78ed025eb", - "89716e6534593a649dc66a98b665f99584e15c0ad1b772b51dc99212b43ddee7", - "4a8fdd6407a204d3a779d2eead7a025baab8409868a30c343d7f547d825a8c79", - "35d7eaeafa3a9d420c94a796835bf5ebe50d08ede7d393acc5fc61a989269859", - "b98753551d461288be629c1f2a528fd1713baa9141d33ac931a693d135433a36", - "e3985b6f77f4efea368089c5277396fc6492927d3632fef76773fd3ab94c1a35", - "b2526f8cd4de61be36e1398fce287343d763aa252421ff2f990031a46b664f7a", - "aef611e9c4b6abe3a199cdfd8a7dec9ce924cc35d4377cd74f81ea823aedb0cb", - "ac3be884c48288e43913470839f6f3b5e53481a06939b6a6554aeb559e0a5deb", - "b1588ae42e6ea3b6ce5403f6191224ebb9ba8035241228a52bf0cebd527e5d07", - "f83e5ff234d424fecce4e428e5aa61376f3b2338eb19eb47e15ee65761077f99", - "4adc66be619a8ea5d9ddb38266bb760a785b69ef3e281f09be8c42316a592036", - "1e3948720168b767be22c57131a05d6ff3a5fe780ce9cc7e4feb489674dfc396", - "9643f726f6c941e1386e5fb00a2141140da14d39bd84a804a7f7b59bce33aa2b", - "7e5b1e21450ff4f84bd628de7d178c21e0d668a958ef94d7a0e2a86698235be0", - "c1000d39a2448ff60ab95a074c6ede996f189a10208d90419a87118c673c1963", - "6c0b51043125136397b5d5b2c3d27ebcc319895f893cfeb6307d3e367e1f1b64", - "81f3f3fef924536e7b46bfbe05fe1a77f2d9b08e6f03487d79b2637f4e14cbf2", - "97aa87709ccb40e0a09230169740ebda3a810a5f80f7f7eefa791a5e8a4eb9c7", - "84f57e0a8a959535801231c12dd46a30d35beba5afda97ff8f6683913b2daf11", - "2e597d54a67b3006b998133553bb6312d02912432d7c018be63421d8047121c8", - "23cdeae0eaa17c8d3c724c6b6671da4ec5391a4b584da732aafbcf5da369a031", - "4256c8f1dcda4971c2f9d185b58a47b918df6a8fbaebb28721d5dc9d4aef2d73", - "4b8daa544af05ef9596628ae7147585a85bf3c44b0309a2266ddb57125f45699", - "e1ef322520425112d42bb826ff4ff235d404be506925de5b8993ca845b3c2880", - "6bb61644df117663cbf2c354972f01c760dc96f3d3f0159a6ba6e894dbbdbb22", - "b05cded16fa7fc9ecea5f925967df05483d051037a9f2fb18470c904faa29725", - "6517104a306ae0ca0489b6078a32a1af055b1f75b02f71b61786c017b57df793", - "77393a4a3f20ff94b82e005813a406f45041e291431ce48bd3cd88fa40f51e44", - "4d25848a18d5faf17ea62fe56234ee26e1833d45ed430c39f3890a4c657ca1b1", - "6af0522acc40dc1626c72c11b673f12878808f23eddbf3c9ab7856499c66e1eb", - "19e3d7ecd0c5b880e20bced51178614580f08db5820f6fe916d6d3ab8cefcb61", - "7b718989c75e4fb2a645d2b1533bda330dbe27ad8431bba1f9bc96db293bf034", - "24d6a8d573df7ba10b8218b0c32f75f4d0e41186f28bb23f19cd4307f66a6f5c", - "4da897c93504536a7a84e1bd298d013b7a0d3c8b26eec38fb9f2f30e6d70b502", - "fe1505c0361cd5a1135496e56d3ce649511b714e9313f46fcb4a8e0d9f6ace61", - "a02fb8c075ef6299de49b3538ac38be60af19330d376c30e46eadf95f087746f", - "3c031bb71593b952c58e046fe81f971f25e36bfcbacb0571543a2ff41aa7e6ab", - "0b7b4fae1c17d4431e73d44354f9969298a6c5103ff12aafca9dab597fb21207", - "99a3ec8b6a2a87a3fcc1f6d558bce9b2dd76bf256e4860a7ce5cbef18e8f374c", - "d492966ae65c51381151f823ea08273e4cec1afaf12ba4bd8d11ee34ac37cbd0", - "ae8675d2630b9b7c193bf9fc2b94f730f644c23949842a56e35661384399a203", - "b31d9d41bbd5cb694fb599b3fd4426c4567fd57b0c2a12917c96baee64e9dcaa", - "a866f17da013828ca27aca73c9c9930f0176b26d9acba81a9956c1bb1369fc52", - "02be105dc3e686cbf0f83c29441c79be7313ad5be4ae17d60499a3038885b561", - "aa061386a6479bee9f957fbb26accd6e69094526cba441af2e048f9ceb10d856", - "fdbb585e8a818bc1eb770247b04bdada2e611a5e5195a9f44fc5684e23b8af9e", - "cb06fb7ede75d1156f924546a157de4b8c9eab19c13fb9b4b653dd8aabef26f7", - "d3d66b70ffcc1ff5dfe1d5534a3e2ca604ffdbda70c79c9ae0df39fa5b32e4d8", - "52fb3580b2120a7ff687663f38a6d429561e035b289ca8b3af094735c3b2ba10", - "7bc22f61ff865325857114b42f1257e681750cfc5b8d35898703db0793c91438", - "c039e6e7536314386a13c804927173ab8df9124853226f0a88e8f53924ce1e5d", - "c70a9c54cd5260dc45e549dfcb8daf376f5ee53a51acd154f9f201c4379be7cc", - "52ce2e82e320252057ee4647fe241360da9c93bf9fda24d59168a51a8068a9f8", - "9214e9173808db7302c622e283c90872f6da5d4c1171d81cfcfddf231f2c7f9b", - "ff891f103330f90b5018abaf78fd0b34f7bf883b701c0c6a70b34b09e065742b", - "81633365cfdcffd62cae14e6e003262613d42e7dc0eca92d76fac89a89cbf883", - "0bb5708ecedd8626b620483ac7398d7e1049324c686648074da6e27f09bdf43e", - "2b796b8371f0f3414a444071c377909b82c006724d188782d9432d0b49d23a59", - "681970a43a5e3fb06421b880dc6026764f37a1786e977ab1f6419b0a88197574", - "d1f0f7b648b8128e3133a574ffe8838be4999998584f28ca8afd206f59af35a3", - "669d4808c3f9981a6c431aee5d742dcf00eb1358c87c308f19ff0423b8e0df91", - "b4da34acc9b6ecff6f533976eb9e5bd5be2b4e71020d23f20b58dc192d86de56", - "b56a85a2f10809e6d8405aae3bf9baaef06782aa81c02694c62b5284133754d6", - "f80a2243901bbf5175046685b7fd5649a217728ed4b904942e3a50787386d248", - "1347b4cdf3b672fc0e274e7cb9bc27370fed13e7f0f1260fdd12435d82de2984", - "7f6dd2eacb6bc0057c50bca0680e6460a4cc4ce9050308a915b99ac78206c527", - "a3bebc094b2af3ede8d61156a66d7f91187a7e96cec3a78d324e3eff94de3afd", - "2304b056b817f6dc4cfe07cb6a9cfb7ffd933bd2508451bc3cbdae7b60dd43ba", - "75575e71a10144574ab850c9765399864bb7e1372caa2df415058d34b1f05273", - "25e67fc278fb130e5737d2373d1e348178f1bcc258316d0362f1c82d2e05acb2", - "d4f94f353b06d4967d3c6eb82a8ce8a60d55dae9d3ffd2a0fe2f480d0dec9d1b", - "2879c50f7f9e3eefc84c3e3b356a7a35fcbb0916f63a556005ef87876bd98a92", - "cfd621bba56f8cd6fd6f20ccc32c941f26f9c59f112f4b61d79728cfab14d162", - "d1471c2c44f260cb5b9ee90e55b0006a9e2d4bbd5c0ff5e845078f65c4afed2f", - "b81cdcd5c161f4146093fe5117e9a636cb35c574da108a06df6214c0727011a7", - "5e363c12c28dfb60b9f927ba59c2027f28ac6fa4fc70575ef32c48ac7bf6b6e2", - "dbd1459da51a673ed90a38754dd32853b883d3aab7b17ebabfe6c00a7e84fbf5", - "9ed5f8d9f9520c2eb6d973921df1083dd8d51fadfe14b9e6ee8e0eaf7dc50f8d", - "a7f96d449c146c102f803a5e6a1b3c0c1241fdb90cee45d440a59e0ada94ad88", - "bea3b57f08ce4c37741d753cc04fc1ea9a3a7b731bc1ada4ef81592e33cffdc9", - "901e4a7afd4991ab7441f16cf436d33ca3888873684fe90df1cf1fd48b396ebc", - "453a2b38f99cd14e19e9221d6fb334878b6e8a6307f529a3a6e3e746eaa43daa", - "5239a8cbe84507deb2d499cf06036f6f1b1edd61d8b88109487a27de01a5bb21", - "77404c7a31f44e0966c0db6513bcb22ed0b4b4138aec180046d0b5213b41d4c4", - "270f5873d7cfbb02d46ada9bd999c58711b38d3e161b2e56e1f6598e6b3b300a", - "5164e2ea54192a5a92497be9e58bceaed7c27771f1c5de36ca361fdc37b14870", - "c2034feaf85438aa306104ba6f8cb3e26fcc7ad88e8bf894b03ace007dcb5d6f", - "f9d703ed4b83d676f9e0636fa519a57b7567a530e7fe7a6934830c2ab142095c", - "f60a84dfafebe06dc12064c96028831390a106465c267532e3a849c42fa85e4a", - "24638c276df04df9f34dc77fe2857aaa4781ab5db5d9e5110df8ce2dc78359d6", - "b208f4e7f8fae27731a4a348841ad699758d10da4d9a2e5dddc8dd884c82cfc8", - "952263b7b915bb5599d1fe4c3d4c236ba82cc635f9b9a29351c0b4e94d7cc8b8", - "1ff468e75ba6a8749c5f64eb4357248aa8ef23c2fa71353db1ef433585478e9b", - "9bca0860164aee7b1b6e39b35cf74f6a65c0e28de47486cfccc86482d1953932", - "a15fb092d416033a1abdfd1c8a972fe474d32e69578c4b0bb3de7a0505622cd2", - "76b1a50e134f3a9e6fde8601fcfe60607c6c37959bd497b2d1454eb741dd8a38", - "69f883fe774040703bcc730dcbc08c0c1ac423bbae3f4db71be17fe75d9c1da1", - "60c11d0323ad9c033ffb2724920910426e6ad0e4fcc68be72eeb42202d496731", - "2ec0253b10b3f3e5c1b1adacebe3770bf644a1b3c409e73238120bb1a71c0e4d", - "e231480a005c4d77a1980666d78233a0fb84fce11bc0a4749efa867e4d7743bb", - "598a207aafc5df41d0478062690c33318c75392b28316f629bb899c4e395e72f", - "31c1a2eb93fac683c922c5a93374d0cde459b2742e6e80642144d335637887fd", - "ad9ff25860e255e4bb99136d4042de0b6c84ad1e1eebb845ffa61d71b219493f", - "6ef45ad19524bf25dc6aca3e05a03906f98c61ef33524b8ab6413657d1228631", - "bf37cb83102edbb0b2d32f30e42f022ccf5744e7c31241a8782947f6252b85c3", - "de387decf800f3750bb5b8c718e36d0c384f9028264f83c3615767c3383e1cc3", - "fecbc7b346de7da54f0d150165da908b0b4d1fb231dfd525e544a7eef4b62188", - "88fa5591aec07092b8b9705ac2b1dc4c63db53166e1d2b18a7f3d6d87743ce00", - "7229e048f64ecb4d0395b33412135de216084c655dfdf1c6dca1a2b5a2206734", - "d1d32345fa0213931bd7ee44b97a8a64b63cb5fce540d93132fbdb45ff5fc7ab", - "0f6ca099f2f877363fa3210ca9a7656a84bf7256e9961cda1099005fa7187320", - "c7cafaef49fb47009f5d7aea4b4f3e4b8490f378618c54c4afe3713234239663", - "e311af17e3b97e4ba99a089a03a04c1f3c9ca943598bfda94ab9cac172b84bd3", - "6e8d1ba4429daa9eed4154b0b75c0018789712fd43858dfa0b7eb9eaad35ed63", - "a7fcc3b64318aea9198b9f7aa7e049f7eb5d438dac55680785b9c89af7c649a5", - "50d7e28553316eb3b68b2e30822c81c007cc79849db988527e6773838bb8454a", - "d259eb78e05b791e8ac17633e60837dbcde18f584c7b01f34b44ac3770c4b1dc", - "9f7e2cf069388be7fd3fc576c4df6bc7c690d5b5ad7397aa393b6c3dcfbf1697", - "8b9b18632647db9a2794b17fdeb03b6e129e5b939eba251b67ad208032a7080e", - "d1cbb21300020b780c2d4918836e4c7caf16c327d5c758f168d9f8ee5af42c43", - "cdf05c554267b3479585af72db2236994b4b7facc32b06a79d506b57da0f4052", - "8d2797795b6c38d703f0548456b54678f74bd31241811317c83170ab3f019519", - "36b844ed73f9b35551415ff4005bea4c32de692acf9de3690f634643c44471a2", - "f41c1e37b46661a216d5246efb53065db6cdeab91a561ab8302ee1eeca62e2bf", - "e725a3aa1da6071de0ba26e3e7639e26902b4bc2477042ee6def96aab1e4fbee", - "872c45e31a3e6a75725999ae9328ad7aa2a310e3b836e3e4ccb7c0a24c4ba0d3", - "b511509070eeb703edfb6ed0aa6293e32b739dddd9ae7bde44dd5923d63647d8", - "b6c6a86d619e2cdc4b4d0fe12606e8a2b9094d301b70c7ac44c4ad91ea60e7d5", - "fc0e01ff10369ab7281be42dd7ff176c8f779a8e610d8cc6bb2ed85616fcd1c2", - "b41a793bd33a41b4864a75d67ba324ed03a338a64f1436445e4e6c43e77a0e7a", - "469852ae5db6121f4ddcebdf3628168fc260317ee196a9c882d8945e1162e574", - "6b828406234cba6b6201344697d1fb84166baf5a7e7549620e3d03719ca865d7", - "51430730fc4f7f94c98678a59fadb47f891913ab9712ce54ea75c5feb52fa5db", - "5f4c3d37130e4afa385473f0611b3d03c21ca4b9eb5e9e57900097e5ce489d69", - "27d6bcb0c43dc26de5f12d1d178ace4be10dd2bbd9edb66f5c557237451c4a8d", - "bd5b294fba3f385c8b024b22547c97b27d41309171a21053e258151296324367", - "f6c0406c0c49133a49c82cc97c6b9f073ccc124572e1d622c16bc904ca929fed", - "33f018bcd4219592b1a4b134d19e860668ae04082e87f61e832eea659caf2b34", - "988cf0bd98cd26ef8b4e79f1941949ce90305dc0b4e2e9f046d12c07b2629c2f", - "38d4f6f4b7c1f1a5fc04050f900a5d75ebaaa099f26e242e5bfb9909e66a85df", - "87d8a34115d613e56c09e89fae4bc5a8b6a08d6ede6099be16d9dbaffb2b6d85", - "081602d112b4064aa74a3df924a4c910463eda6c86fdde159ba5b5312d755fb5", - "10011d888499f3968c156028324203156873bd7ec471614e56e128733ed711f6", - "feffbb03d0836c5401bc974aa9fd48e3f84400420ff72c56dcbfdb2278c63f8e", - "b88d7e33b8088128b33c1783a0d731776f8fb910c60a04feaf77b055faa2e8c6", - "808fcf72d1fc3854fcb6b6b738b18f9e7d551975e68d2178c058431821583696", - "e78f75fd376766c478a92143e1ffe6dace6391eca921235c2d180909b7e91fc9", - "ddde89f31c729bb45796b127d1e501e65e33af690c284370f672468b47618789", - "bb03b824de781b69d8aff96d21d9fc4f9aa34fd5cdd0b911c339f4731e199abc", - "5a3574ae6a724c7ad702c92581aa504b23ff78bde25bf2da73853ae34bdd38eb", - "591da6a87d1e3a32444d753d1aedbddce186a6b3908ee49648127092d501681e", - "e2d2d5bf31853dd8a216c09581a5c74d7e4b52d15d74d48329983010f85db6ca", - "b164d0351d5daef31f4f0e5e2b9e0cb910a9f5362a217407521f680f4e69e9f6", - "d339c9b03d753e353884536a257298c303978487da196e5d8c1a82644421cb29", - "f82c2e2507bcef96c5538361fcba1a1b33a2dd6fc07d1eb00d6610522aebc6b1", - "e5228f365f357ace52bde14495b87667411cf0c70f47f76e04b7f09903ba0e63", - "f8f036087306dd4a9b476b528cc5953305425973fb501a65d0c75c9752317cd2", - "cf3bf43b4e2c58a8a54598eb306d182ba217fed08a187206fbd1abb61db52056", - "fbd1311b17f5494d42dccb0d833a214261f2327da85bb3be3222290c6c1e943c", - "25e7455e01d23c2fef22610a7aeaf1a8d7773e80315434f51c5dce833d4dc71b", - "161160f8892f0c0356f0b7800927235373221eee51a8695346201b411b6e81e4", - "deaf3881613ef78c3d1a116952f1c3e9792597976f3a545a33f9b8efea3a81e2", - "a9aea8a18977681f785f2c0c0bf34db5775633dd23fdd949f333930b9a7a039f", - "abb808efd999ecfe7a119dda1897464c7dae5936d81fe6bfb5f614cc43f68b4e", - "4ccef848f6afede830b70fe75f1953385bc70249ac3e3c898ec8ab68fe41e85d", - "c41fce9e3ac019cc10731a45896d99fa70b32e4fdf0a00d09657e38916207980", - "07d2f4d6452452e0aaac2dec511085cb16031ba3701c4181bfb67436a5398fb1", - "c96deed2fcb6c8908a2db240f0f619c291b00cf5ff5948f87eea51f1e5f424be", - "d81022326c96c8701b61a39489ae8e5c9b2696ad8b90601fbbb3d27c6f8aa1c5", - "278ac7ad7eed8382855c056212af4e7b517e1484b07f6d9ee982403c3b63955d", - "68269b38ae2befedbc63092757f5e356de43b8419109c7e8c2cd44d887696ec8", - "33dd32432ad5d0c5fee5e434563a943e3ffea1ddaaf0d4746ec6ba02c8868715", - "96a5d9470c3fa1927c69c026aaa03ea7ed8819654b5a2ccc8c7de047c374e8c0", - "d6e37c2b1e855706c6e9f3ff0fde35cb9f694dc5f1ce713bc362879d365c3b4b", - "3e1c6b7a641734fd7466a867f3bac1f9a0d2a7cb7a96cf1318ebf315ee1d0d05", - "95c264692ea4292b073b284e7e1963beebe51fbde9cf6cda46ce2567e9ae5e14", - "4268ca92349da3ea000377644ac5207148dda6475b2957258f2bf578b4ca298b", - "c2c187acd540748ff17c6c4d8906575169073d72c5bc0343cf48ab30d3a68ae4", - "4a53c892c3784d1ce19bef2d8de9f227cc846128d20a626318d6208d3a410015", - "e046a757699f8539cbbb1761b73cc7f502ffb5e893512a122d7ea1102fcafa7d", - "358165c6e46be33eeed38fe0d67f70f292cd3c23fd3de7e175b7aaf01422d0ed", - "6fc31b82e054b2bbf522e9730600af88ba9272967c09f3944e35cf6fab830674", - "ece63669a7aff9b1f6769d901946d898f49f24b73b6a27e220c4add3ce430468", - "87a5d66a086f144511edfdf4e6af5849164c104e39c8bfb52a33491a69fcf9a6", - "dae2db2aef40c24c2d5d21874166402b7670a494d8d02f59d1e5f01fb7de5a52", - "adffa20d7c2a43b0480db6434400765ddc273f0c6580fbcf43f12c312df6ca44", - "b0cec6567a6ee480738038a986c7b92c763717b9eef7f917410e46cf4d615425", - "b46cc4a08dfbacdbc8aa2f855063430ed88fc0e1f8875479c9cc45fc795091cf", - "d362e51325fad9aba25cf1ecb9e5b0aeb83e3966891ddce9b01c3455c86fe744", - "76b5f12bed55e3e40d74d836a5294e8b160200eb58e4e6cb8be4580859779381", - "5ebec9690ec0c00ce83df4d0f57a10b3759436bef64732e0350c7a0ef746e596", - "f2677b0e6839ad9d405defeb2a49a57e42a9b194fe84eadbd9c84f34eafc4681", - "2a1dda840c8adc0d85ea8ff4776d6b950ba3a04f23e6d029cce6e545223574cf", - "49939cd7e2bd9c62d147671c5cc4f95962d9944b5d0e2821a710e56a8cd74ad0", - "9857731f6b0e9dfe4d8c18d4ca861f64b2a05a7b44e96c030cf6f2153a6e6057", - "848a9928dc17df5c5d9860a19cf0863c921f18902ecb212b12b42bc1a982c583", - "990c48616eb5173e5f96f91ce65601688b8c29fa59960bbd9e5b107010e334a2", - "0f27d2eebbe22cad92ed1a46cac6a62860733c2cf1af759a988ac332950d403e", - "9de2dbc0d14baf6aa47e862926cafeecba16a844c36f3143bfe1dad3b4fbe5f0", - "b143ca7458fb2aa25f9ad4ad703f5f57861988b804f8620f47177438ff9a5894", - "1f818959def82e31fad1292f7d20a29d0e7e9e179621f6381edda79cc73e34f7", - "78dc38c03fad3f8c579345b160d7f765d698deb5135d26206376b755858cb782", - "dce4ab6587cd318cbe9f2473a7dba14357ce51b7df7754f15ff40d0e814de20d", - "06b5a8ada3756723b0a09f9e5d6b0fc12864e3eaf3c53486cd741ecdfd88f40d", - "91ee5ca9d0cebcf14c8d52f23aa9b09c7ba74835b2b3ad9fadd643273b6287e5", - "dc027a4a4b12abd38f086e5d4a233905469320a832b87238f20cc49f13dd9b15", - "87a2f39d546e920efde129753a5215fa8a12f826b63dbcd1f28b4e728c254c2a", - "3b68079ad67e801987ce9c02ff3ccb037db65c75bc5347268b1b39e56ed8265f", - "9fd8b6a702da00cfb15c0044c3a23c30aa8900858a2aef72c155228973018791", - "997fd8ce0d052558c6f07b30fc1277199956a76a2eefa09a32fe9c9a33b2dabe", - "21827110af11641072e18f4f001ba5ff86ff306aa6a3f12ead971a17a8dbf24e", - "9ac0770c8b7d0faf991386d207d8915570760b99232c24cb377db67997f4de40", - "828e2f915531a70e4dc6c4cf37ed8cc77fc78eef6976d25d0a19a8d146425ab0", - "faec6386654bfefec2798939ce707f17c7f906ca9a97a69ae5f0bc20eed13664", - "ce306c8d7e32dc84594f0218e632faeca28348641a973a7e5a33866235fdd06e", - "50144be08c376f56d0bad2502893967c12ebd88ce0cdbfba0520af9285c9e747", - "9fabfa6fdb8a43f8158277b37ad53cafff82cec69035365dad11d29c989ff4d2", - "212ebd75efc4b27783f5e4cc1c24f5b37b00e5968f728c8c497b5831d1b65265", - "68fe147a362e06a1c8ef91d2d6ee84cd26fb07bfc2f93d8fa4993931997a2a5e", - "67fe784cccc62863d6c2c980ab9dea540b6b73c094744c399d56aee2e32b507c", - "e6494c2e2fb26ae484bb3ba872a8b61e4ce3b71484d6d88866180f5f64596a52", - "da5491e0085ba194f262de20c3367070e54702b1f74e12562d6bf4e268698713", - "351b03115dae04e935eead0d2f781db32a5229e849b718cc66f7109efebea0ba", - "2b06a8ee1c19d6ab823487117f6013d78cae265fe8fc7893c9fd8e8ea10b396e", - "a03324e0a934c857fb0585ebcca5d1c744a7803f0b6574631f5c4b351424fbec", - "5a2867a370b773619796a3756eaabe5afc572cc5685017d670ca2215f4efae30", - "1a07fb765da58476d0baf039aba99569c6cda2e021702b76b2e1ec8bdf71042e", - "9ff9313b78315dd529d8fb3638de64b5dd1078050359bc5873e87d1e588a81d2", - "e6c3669b8db3744e395566dcf9eef1e2e489c5db048fdb76047ee6dc4013010d", - "29d071aef53b7b1fabf65af1e61034ebbf01063e169109adbc3b02423064d5d6", - "d1ab0da9d4e1abd7d98bc983a5aeb1eece8b49a46e35a2c699c6c6c654d76ff7", - "ea1235899d16317581e89eb118037ec6d201d58efd56e99cfa536b2625b347ad", - "f981169617132f518684cbd6954899cf885029b8be7d9301538a35c09551b413", - "8f7b888fcef13845031cffd6c25f0ca57a3f3a74f4fcd9ef8765287f6fe134c4", - "808cff8512da1ce7108303887f8b38549e9282af7d6fd31c9fe920289b49e07e", - "88fcd00540fd9f80431da5d921fc08ef5ce49918153951642a95c235e6df6bed", - "83a30d5445a3e980fe28d057eecbc0d624fc3103bb8b85d0ee16037a135e7957", - "fba2fbfb2087b707357b62350befdb3504f1bb1706da0fd8030b43c89d14c04c", - "8981771a6ec9ca133e3a02f30bb14d4fcff409f5f89abaa8936bbb643dd8d90c", - "28e20a6e4db03f582bf0ee67a369d8f1a67b786f3b3f497e2ef94c625b90d71e", - "6050637872fb28f1667aeb6810ee6b6536bff3cca228e8963f292eef1f89ff34", - "8ff156869fc019ef51972f8d9854fe0b2260e6c79fb041d1a715b05602533d53", - "72ea6e6677335fcee970091a9b334dd34e751a13bf8551c22d487a3f4c5cf963", - "e5a9ca88de45933f1427a005ae899eb38e39b62ebcff0e56f0e03fd0659e012e", - "008e3601f8352cb2bd9e87da56bb9e715502a8710daa51e966db1918d507a9f4", - "3688b7319a57a077eac7a8d39691ed89c18e3ed908a0792d568622f232755947", - "dd89f3380b736d35917fcab2b29304b4117adbba2081dc1f6ead44e59c67641b", - "5571dcf2aa7030743c2331a6b8b16e9321f5ad904690fe1a3805bc9d473bb182", - "326e22c6f2708c4a7283aecf595e9aec663d0ce81863dbcfd14a44fdd00e5433", - "75243f01a5428552cbd4b358130715fd88638a3c7c5b5fbf20ac98330a5fd7d9", - "195ad28b3286e01f19f3ca91af2401b17db79147370ba00aaded56e64b584982", - "1c4a2dc8dff800b37ef4d36d211120b8d9e53babe5eda31e37d7ade282762db3", - "14897e121ff9e0157fd66eb9c35943dc1fec051c106b3efb467052f0502a3ae1", - "d884e02d43dc65f85bd3207462147221d244ad88c80ff6317637267edba6d322", - "58da4fb8d31fe19757f71db15fac7b3869d7ba1e2850cc042542b90474553e86", - "b75a0faafc4e03c569db358a44a603bea06385a005bc953e3da71d5bbc973b3a", - "f0b25a7239c4602e3bd4f7263b734225bdb5487275ae5e1a7c17d7fdc7a57094", - "65d77f331c689b25dc63e9905a39862134c8731f84eb983b7c008b87e12b73e0", - "9a1585e82c87f66c4ead95c8eef2f7bd6bacf95d7bbe989d275ce78237a251e4", - "c9f4d8eb08b6b3a32b000580a67bdd704ee83742e14fc817e19dfd302cb4a47f", - "fd0bf2447dd9e8974ecae8355521bab9925cd51bcd005bb3badb5d2c114fa97b", - "8994e31465303a9ff117e758d15cf467405a410798536d36158ddb036d149179", - "02ee4dde788c633e290177a98b600cae70e8a079ba37156d155c569c083de501", - "ab52adb6f66de5dce28fd3d439612141663f91941c4cbd90f23b561f520ceb17", - "5c2bb6f8740ccd012f3ce54b4a611977ad83297807ede9949bb2c20c3171db74", - "308cea31e2860d92f8b60482cf92cbc36607159f1f4a90a7100a90460c8e426f", - "4b7c8b8dc7c577e1b7029400937580cf7ccc4efda24fe7191c3c4a316558603b", - "3b487ef7e671cb273066347cc59515b2f53e5bccfa16e15743d66dee50ce1cde", - "09d6dc1e48e345728a02a5bec2e83b67e7309807ff1300ec31fb691b6076cfef", - "be481c4c9be6d79c87b12a59397a252f88f470cd60723940fdc175443b35a771", - "a38796271d959ea5a4eacefb79c46d1b8cb7a3252a6d45c50ad12a895c7ee634", - "576f90299d60ea1ada9d40d069326b79590f5d509d7b514c24476fd26622c779", - "0aab9319cc6ee4418e14ecc40b6b27d02c9ae5da39a987a7df45f4247cd641e2", - "186693ab8793e3a28a558c411722987b196edcdd31558dcfad11e4799983ae5f", - "8ee95d715c7d76cf1944dfd3a8bffdbe57af206b72b1805bb469ee9d04cee293", - "dce291b1a7d83536157d4811c2c4cbfcf777d7108ef7c9ed2b7b3f24e44c7aa3", - "ed9cfd0b47b4ae44bfcc850846ffd943ea53b70e83d3580c5639c5851bc8b532", - "ff7421f594058854b451cce2aa9a9415d1bcb1ec532e0d5a13a157775c707ca1", - "14159a4706d1ea9eb9b702f3f52d5efd708af4e0ab849ec04c26a993a6dc0cb1", - "62f9a3e30e7799d8890c9288814500000859479d73dd76b3f00028ec5177a668", - "8e9b5ea4226c52684b1e196ff4ef21ba1d9541e44aa6bb49926e5d610f07af94", - "103e9631e665da1d70d26995cfc35226b837b6e13652c212ba216021da27d804", - "779abf57509fc3f275fde00b53cf24a8fa70078a843e42fdc5dba61b602299af", - "b07ada6a63daea59cb31dbad1a20066924c91ea401dc21858513835c2546ccc5", - "3c31c682f0ed366d7fd06523a8e164ff6547f9e39ef50ee243a5c0d5ce1b3bf8", - "68777c7357b2a9d41894962f0c3acf9b08010326129dc37aec8494ca0fbb9356", - "d0412b479e0b06735272d313b336451f70e48cf17edc0ade7fa66eb1fa452b02", - "84d07582370e7d07415555117e243204bbb6041ad1777af8fa29d0275d09211f", - "3d6a7a6f1a0d299f4d736d92a9c07a628b91e3542f5458326332786365878034", - "2624e7b7b0628c0c23344ec018a77206cc6d9c4ee343366a914e3de924f9d68a", - "c0e2d8b801961f09453644fae597692564ce0f4d4405c3334ead74cd8cfad207", - "b54f145edcd30ea66fccb8e21d8f800534c41cf337de30e9b37e26fc2cb6e63c", - "a18e07c01c76275992092fdffd3d3cc8fd4e39b4a6acf5c961fdc861424efbe8", - "02e21338d35424ad0e134c99606c7b05306b804429f3c9ede99c87a47d82c129", - "de6408daf728bf0b7cebdca53090410c440d2ac27d641696b4173a7c34b4cfdc", - "29ee14beafcdbb9c4685ccf025b9a48d137685b4ddf6b13798f613471780d3ee", - "af1607aab475acc2f823c58be4572418bce71f299d065c30fdd6829650a4c68b", - "4977e2dceed5c16e9efb87ad54057e1c4f1660d25b5303dd599026c45866b14c", - "34095ba29ac00fedcc92e1a1018ae4eff056744dc4af48b747430ebeb79463de", - "977d15f4c84e28bc3711c2b3e0c507986c9241efce6742076d663e4265ffe399", - "ec06d38d3e38e805896afd14779e445276f8cc1636d69845a3233200b2f4e046", - "745c0d6a94a9c35f141707bed991d4d559a2a706f5111250f1df548702008230", - "33daee6ea84834c04e275874624b03f6ae9584b77cde0e2e6b8d7b3766463991", - "0ef89e8b4c2bf31a05ce81203bfb0e7a8428e902377f14c2999a89d72281e123", - "69eb1190afb73bad11baf468e6b2639bf339559d4e6b721d26c925b8e20c0f67", - "b81ff1b6c2bbfb1f52ca5998f3f25434abe97fd2e6cd3ba404e3713fe511ee9a", - "c2e278de601dd5d093fe589040c52364f16b2c00b61dbf1eb354902cc7dbf776", - "4728938f4ca0d15764bb3ecf0e0d30c895c44f294aaf5e3e60db1380c9255c62", - "7726e8b657dcef10dbee0d8d296c1848f2e6bbb6c3b7eceb2cd951b32e48053d", - "8989508ffd48baaa40a492c131204a53932be965737ef89a4992c661068f05e4", - "1c47be75b83c9249ff6293fe1bf2a71a1ec70cf439dc950500a9ae832c7c1daa", - "3dc8eeaf0d7c4b4ab0557d4793befbf1a506a1bbf736976afdebc3080452a815", - "c034ab9fb6ddb1ed3eceb54c3201149f426c6599ccafbd2dbeb15e1d81fc048f", - "5126ad8ac7fb2b3dfb071994775f000cecdb488e64d5149ba9f7fb6d6a925c58", - "a35eb26c274ccb8f1779e5651313f8d6650d37837b710bf606a1d6d949fcee0f", - "2b6eaadd1f58af5724d7379347d7a10c65b06e29c20152ec44f43ffc01f217a9", - "4b266e99a54fe5c4cad957038b8974c62f1720adec6ab8dd1ba1113de402b838", - "ff99025ef6d03f9fb37acdde6308ea5ab328582ca4252cd54f9323fa56919cde", - "e82c0328ff49eb818a231a16bfb4a6d90dbded3ee11317daa31eb90cd15afef1", - "b47d59f084f9ffdb4838ca569881e081b2878f897229497a252bbe9dc5571c87", - "1ed63fbc5c140c9ee93ae051214da6aade8f64a4dc0cb6cd01a4f302f1ec3482", - "fef9e1e2f51cd12671e2facc3baec39cbe7bf1a7835b65d8a492aa482579c41f", - "fda679b4435cd6226338e12adb49ad120da018ee01e2c5943bd9432185ef3284", - "249beb8a97ecaa1fa047aa55571fcbf77d1e5243f8686d437dcd6c942f567c50", - "02ee01e4059b7666865f60701f73eda821fedfcda92306c118c4aad2994ada38", - "62e8076c980e9d0b861f516053d6ea52de5b3021e110b07b728b63a9d65cd929", - "7501908b34a290c34ecbf4e2219dccc92345506634e6cfba71c967f4c1753760", - "8697a2d0ab0175b6d19a992c48b8cc586eb258c2283ffbe4ddaec4cdad830167", - "4c29ee6e8d7e721b1d3e87d00bc098ac711f82d5c161aab8dbe76c32888618e5", - "9471dcb1bd75543cdfcf761da87c395a4ac890d11af7ddbb36003dce6838296f", - "14c8ced456664c2909feef5e84b33e72143ccaa5d4a6b89ea77c4931dd301c95", - "2c1ce1bddc85e9f07381eee5e544653f9d0924a15e8e4a614fd001fe6a5b7f24", - "39d0d3a6b0a903c302b206822d78fdb36a6b91154517c2a972413b59d58dc8dc", - "5fb74ca94a8c4b09a4c8a0e149b91a486c2c8a5f158a529d71fbb30f4aa52286", - "55d901f9aa9ff21115953dba5fadbd4eb41d9fb8af3f1a30d660ce4bf20fd2a8", - "8337256a1749a62512fcf2941eac2ffccc12044e718da13befc22f87119a4307", - "488552be651f0640e677bafbd1b8e3e4f8425d328842bcfda29892b1330ca462", - "87759f9ea873f56a99c028549c85f503e0cde5c29968ae14d3971fa9e764acf8", - "d494e0a876ac175fc7bbc91165a82c5a2957f2bd36165310dc6caa18eca6a912", - "a12d462d7a8cb518581d18051dcc0a651afd892f909f7c850a278ec2d1b1ec4a", - "f872250f7bb4353b4cc7337c8787454c4efb28601213fb445179c65a22100e89", - "ee6a159dc76584e4d1dd400abcdac4aabd0cdd903b33a49ce96ea21c3f9b246a", - "d4d531ee0cb7a8cecd0c6370bcecf2bab92b48e6a01c50a44b250faab34101b5", - "c921009fb351cf7cac98b72bfbfa4140203ae81c83fa1b761246dc22bc42c44e", - "04f68ad52aa0afbf2fb4fe529538dea69520c72a2f87f07b0c44b8bc6d7e3bfc", - "98882f516fd6aa2fc4d4bf21a0c78d87383bd5728f361eba2bd176efdbbd44c7", - "91758baa7872a87f497f9277516833dd9d91bb972734d4a22e51b1a339e26af8", - "aa9b40c4a46f7b76c7132da14a31cdecd4fa79bf06db3d6c105a84f02cd3ca70", - "ed973ec074b0bdf7bd07e38ee86b3fcc3085f818bbd5334465465bdf8195ebef", - "c0fee99afabd6d39dac7b064ee74f96e83a320df8a9144764b0e1287ead5bfbe", - "db13ca5084cda2d39718fd587c3f5cb8d21aa365657961e45425abe43fa14551", - "f4a4b4d0948b6a67c2e7ca5f7c32242f71074ca48271a833929e722fa9483f97", - "bd0f5275f80eb1b48749dc15f5aee8521c11ca9b6c24f566b6ddd7eaa99aa59e", - "8f3b933a0a2c6877c09937a88f912bd7afefbb0b6536d211752b3a5045bf243b", - "b34e4675c1f6e3e0b2e0eee5ce2968b0c8da9f78c691a44d3d6d191b2ea42e8d", - "0d311e70cff215db51c99fc9b54489846eefd7bf1ef039799d70a5fd2ef96088", - "009be85789447a11e1ef8c15b4fdc0f6d2d1d2745c17aac5606a6f84c09d82c9", - "5ba0823748542a992423c9e3a812cad59ac71263b775e9e90a9507632924f6f7", - "6781729d3fe299a94e72e0203ac66584943cda14bd01b860aab9e3d2f3a59c44", - "2e1bd869bc268781bbaec4bf8c3abe0035300bc6d41935469344487afe0bb0a7", - "0d28025e7efa352c25bbf77879fefa289cf2769e3d57b74d39a64e3d5230dbbd", - "ea93ad3e0f7afb18d54724a0d8c9c2770df55ab6b8619d0c68581d65214a5013", - "58fb2d17d38f98c491d957d906614beff856052fee352f4c2f07db3e8561ff7b", - "cc66f7c7a41c196d8f830fde4942e1a59a008691f4ce5deb8a6efbe94d924cb6", - "6235507a7dd2a0cc84bfc047ffa58d2cbdffb1ffd9b30e9db45aa69859be6727", - "1d57d6ced622011507d10cf576d722a94878a57ad2a3d12563af846280cfd177", - "7921bbd0f613b84d2ee89824b7bd1816e71f94e5e094ca6882550ac36851e98a", - "f8a84da95d74b0ac58f6fc1f77f1d2a679c04e84fb3a43bb46794674e2bb363d", - "7aeb06fd3dfb6df0d04a15c53bba3661f1811243e13b3236fb25d99fb7566169", - "9986028e77558eb25a3583219326ebd2842499981274e6d96945479a12fc4213", - "eee9f44185fc77a1961ae0b857a57841ea198a491edc06e2c9c1b7b81e15f7fc", - "973c7972eb2091d2bd2f9d1182387688e1da19ffcd6d9b09bdadea12702134b2", - "1b2df5573573c8b8a4927e773f20a78631ac2fb10b60f2b5cd46743252385f77", - "1c4c126e26c28f0c9aa2477782fcf241f0d8aa766039410a05ca21223721da5a", - "c281d3acc70e6975aa447986710d7aed58b63e7c3acdfc7f3929a45d8433465a", - "00da7778e81cfc14e1ca9d80727baf94bc98b3828fe562fc861c6b29246b5e87", - "4efb55d614f7c9ef81b019de2b6b20f23333ededb57054989c852e319eb02926", - "b46a1d11c5f97d5dd2abf17dcd7aac3e1f81ca379df32a33b30d304652501ba4", - "2fa3f2d179a4be8e1b290fa5e2da7c454f6d9b3b30cf53b21788f9d3f6d5ba96", - "506501913703ee781516051cf6d4feb2d2c0ffe87cd9f8b75c12bf1c23e49894", - "1059e6380e8c980b2804ee3e58d578a93ee2073b30d8da9f87daca416240b0c6", - "5d5292b901c318a9acaee7fba9f133db7580a4b228db4a79b8032c8cc276625c", - "9b2619c23c06fb78229cc0d8c68113c803801684d3ef069f7598defb0d05c07f", - "0b543f51c304188cb588a8c343dc5d20a2e809d99beb44be229232f84739c064", - "598f0da5b77503dada2f979ae197a3cca0a28b85c5fc9cd2d2cec10dfa1dd387", - "9d19b764a14d878b14cc65c5a4ce0033d5fbe4cabc03fddc45044e278d519176", - "e421e9c9046170459ab28cfcaf12ca13891f4cfbf2c064dd2d4ef2f9e81fd33e", - "9b6874a9a067efd0e25600194673bfa4cc6ce45eb0ee7949348f3cd95dcd400e", - "d59aa8bc6e247472ffa3acbe504ee7affdf630cef7b4e1ca0510b141f1622fba", - "1fae962ffce6ac8d265996d58483125d926cbc415b9575ea4e67524005c7bd88", - "eff9498844923a1b9982ac685c51b447138b19215703757cfff29cd256f49038", - "8127aba3b6ceea6d151b83997b8757bceda60483b7cceda7c26dfbce0cb49b1e", - "8001d5ae24f0c46abae31f2696e4957b4e15a9832dc72ec65f1992383264982c", - "4eced86feb15519940937e107e07f586e205015d34d66bec63b98633c0b9e996", - "ec5c59f0b3142a39c2dbf6d2c01915c64d085e58248679973f42b74cf717aaa4", - "344c2cae9939c2ef824ef08d01aa283e1d3559ef91ebc5aa3c34d0e1e1272c6a", - "8999f8d99a158099350e9b7a603035b605be67886c6539e550966ae2c8820079", - "961f1107a9d48c4f2f137287609bb06e0328d46b22e7794c87b9f7846b5c9ab7", - "e941a44684bef16a2d7cfb3174e6928019ede585d3a6f0df38d153a11636f1a7", - "638ca6aa4bf3c9f6d006004b3caf455dfeef6ae6d76977b4ebafdd6bb9b439d7", - "b95f455f6c9688f751b490eddf28834399d8ed083f7e49d58e31e7ba78be0c40", - "fcd714f0c59e29bd785ecbfe20ca00cdabb5354142d8e20d946a0420c0617586", - "31a0d9accaa597f1a9ae27b5c2a98b0efc7f4cedf57c0c64c5afb33493475a5c", - "f7544f006f0dc94da8becb9ed0b05f404d60185205f6856c3e741e8c7efb44e6", - "a4ee77cdcfe31713e2ec9f24c8f55c7fd4345e586fe1ee76fc0ea368e3ad4908", - "a87e101c1261912572d77c9c46e9a5c3aade24c16e34483956c1c6eb9b02d858", - "2942214f8cc3e9c6d10654c0ce3334a9ec4b446cc5f8785f80003fa886f6ccd5", - "df7dd511262ea53bce4dd87bae78f66017f44a804783a8e06f3c5c145fe4c311", - "7fd129a671de5bb97047379e155025714554d57a6889870295424603d7a53a5b", - "933da61bf663dc25678e1eabb79a59aeee97759a62bfc76dd7670ec6e0f162de", - "6c3a6f33a4d6f5995646028efce2514788515e0d27188f17bce98d9bab7e88cd", - "b2ee4a03e21e615463d18ed75c3596f3a017233a592a97fb001c851916f56efe", - "ab599f29fda88959b983bb1849246327ed68154caf42e4ba7a74c34f45141b19", - "8d6e4a2633ea6b983f1528d2ab8c69bfedb38ba78b39407c5541dc0260e2c800", - "858e525bb687919cc697e7427c8b970f4aa1cf36ec0b73b702e8a056cbb21172", - "8d8b1ed3db6801ea1777530ffeb1df067a5561bc2e9ba39fff0c5d65d15dac20", - "26b228b3ba5eb3bed8604cd9f8669c8f122df214f422423a962874ebfe0d8dd8", - "20670ab75e07974f7c19b73c0c92893267001f9bc8c013c1d209840057c9944b", - "e7ff3c275e8a34ce658c37fbdf8e59a2f46c0b0503494f7a197f4da3906a4a42", - "9efc00d815de24d6e5e6397ba84b13c963cb74ed30ac2f00a41f19a5993eee05", - "f16dd674724bc82e09720d693e7095165b907047a23d1a1dd9d967781a36f622", - "aa4de889227ef3961d831dd68c7c09cf846f7734f5ee73ba13d47771f13922d1", - "5da2493b5718b916693a9ca4f5619a8f023c9c5462f863a134ef1936694a7d69", - "a1fa007c2f6ace8cfd743025048639b26088f079c4e0d3debbdc1b9b310a1eec", - "b5c89d2e515b163b5a519141ff7acf1ba6b28c371cea63a9d4cf3dcf44b88fd0", - "13b6119503443f0d1bdf561d5e6c9630417bf9b42aa85aaa240c19b0390a8137", - "d5d17e6c7599aa38b705f61b49d906fd48c1e51288e587e9c3633bb511064143", - "04a13e4890a533b4ccae2689c212baf5181f61880fbafd43d8794ef044af7167", - "2f2649a16202f9ee06abd855a1cac393ee788ef0556428e49e1ce7171b266e02", - "1ba2d3d923a322f1a4131bab296b4a00986e18f1aa36edb81bfd6c634eb827fc", - "6160ce295156e4a05079d1698b0457dec3e29715b3ac8756a299c5ae533017db", - "70aa9e6dcadd5067af4cd8d174321809154f7f6c31271dafff833e96142455ba", - "4574de06d0fe4ea776293e718130f7c24bcaeff16f65181d80db3aeb3bef9743", - "978542482335723ab435a9561de157966e6b8317de39160fd45c5969348f20cf", - "7331fdbb806ef633013b0944e303e228d6ba52fa11a45e97e328112e22a1c8f4", - "8bfbeed791dc8184b4821cf0704348414708f7d461aac0f3ea2d16fb67c2ade7", - "1b17a4d95705664676bed2edc0b08c938472dd661a3ec1ab1b802c4b75508f36", - "69f2cd1a43875bff34703bebc8ab6678a5bd8c417a429ee92d71c8d7b9b7bca5", - "a22a23e48f4b6baaf7349f0477dd4a7a4aba79080b18d4464553033934a6e22c", - "8157c387544ba2694bf9cdd45591481dda7fee90c9d5ce640a1fd245c8959716", - "f8e0117275a53d705b3ee62fce5ded89efe54f4a05b7d30dd6ccf20eb8ea9e93", - "60517a2da254f9bc87339c7ffadcd32617b77e47dbcdd63b638c3f2d728b03d6", - "7bf283266b83f8d47e9855746ea7a1ecf469b1ed7d06555f08d9289e4af6d529", - "7882170599fd312652d1eca4a0918ae110338b7a4c644582f8dfa2ac8ce10fc7", - "000d438eb60c309f35298c49f9964177c86f8bdb2fee675122e6ec885ec0b61d", - "6f6752fd8d3eb39cf144667055f7cd324ef5ae3650157c197469b502669e96ef", - "877aa762d04a1449ea6aadeb3e0f99e74543daeef261225180f86e7444d99e17", - "c88fdfec7ecbe5a3c7e539ff03c8e20d60fc8b6bf126ff82cb756a7a28c3cd32", - "317364955b5e29071de19df25cbf13a9d1a5793f72f1c3a7d22866f7dfddaaab", - "6a4ce879fd363e4913177c4acff2d8ba6dd69eae9cb81707c4ed79973e63944d", - "db7bebc29e96bd594be91817a65f826031bc076231369259263a464a139b6e22", - "c615962f62a0fa4740e4311f6b479f0975d4faa202a0cd546224a234154d341d", - "1aaa8ade8f3b3106af5f074ec44fbf5cb50810161865d915e9cde1fb165e3a6d", - "2994cf835ad83d1939bf74a145652768813f96090596878dc71b45e9c93e2b4c", - "c0eab3f9758dcce52aa607edf681ccdb95e97b52719d71af4f9cdc3f9f33e0d2", - "9755fa2107b56ace1ebae082b338ade232919972632431cf8ea471355f53d6c7", - "6fbb088ba8dac345b3c35227e0aa3773ec0fe51a6117d885458ad322f71a990a", - "8bba265e34196105c24b67f2c52734212dc75bc4c506d020cfc0584e073c7b57", - "b148875f17816acdb4790f5fc16b331a0d4bb0cabf7cf892698685611fbaef5c", - "277ee8dfa560766d1aa123c839fe5450a817d9bfd518b71f935bf0858de6bd47", - "450f0b4b18323df85a0ce37b2b6d211735b9ee798a2aad72dc608fd88ba99de7", - "e275b8ee76ce58cccf0d3ff306689a190618f5007eb7fc7ddb98bc7b39cdf7b6", - "efc3a3734ba33a28206fdd78a21570c56a964cfeb05317feb33ed4c1f953d21b", - "1e71c6946489077df2e1d05775f27138bfe09e8fdc357de7c5df5a20ecd5f264", - "503e816c557e0e09cadf5f84cf58ef978d180ac40b1bf95a006efe18da888bdc", - "4c776935cb6a087aeebed80270b126cd5a7aff7d205582eec3e72d8e95f26d04", - "cbb08bc88c0abfa7a494152cf4ed805749a923905b0ff847bf503731d6967607", - "129053bdd34899377d6f80ace5db0a7c05e7e36d7e7970b8cdc21b5861dd79d8", - "b7bde2f018d4d2bb3af16986a9f31284803f81f5f64e07ce0a018d8182324455", - "67479d125df074b51f5cf196bc954a879254ea7c4e5389dedb9d5692ab42e9b5", - "e97ed5f0eea5c4c3d26207b1f793c718fd7765a88e42a051ee047411a2f82339", - "9d5f2fb95e0d8c8cbd2d1c93aefa35375e83350d5b938c54bd063ef3ea9b1aff", - "b72828263515a6f7ef859364e203fea77016dc3a70d71352c59fd9f02f476c07", - "0ef365b45aadba9f2c7c5aa6470bd4219f6da029caeb72e5284c48ce1772eeba", - "3293df8b351d90767eb0db2ae4390e676aadbbbdf0a3ff91a91627185a13c8b8", - "00f452c4b9d5f5e3595352f33b834750d42d7d80ba2f409b3ba2bb5856c1317c", - "2c532402692918842fd16304126795791e4fdc739a266a4e7c578c9033dbe349", - "58202c9efc789f5ce92695f213306a3cbe108de6ab81d5c818229a65f3a07f1a", - "c0d40dcc95f4f92d43dc45d486dc472edf29e0b626a73bdfae486eba29ea9d4f", - "a024041438e83a729a6e86507ea5c6d8819f795cac51d6c42ba0dc704d0d0e1a", - "2673a4bcb8cd9346a8fef2f39a112000698ef8637e2646a6407ea2cf9b396a01", - "5c7e5bff2af2725644d2cc7a014bec4e057251ad4fbeeb629b60242d67a7dba7", - "6c5ef119b806b4238bf4534250be3bffb716432bbfacdabbf45c3d45aa6367da", - "90912a802b6d79ce74ccb4c9e79f7eb87524be9f95c78b0d6aae362d7c9003e2", - "b0de35d1bc36b59260d33b06dab6b923a749b79de604da6d2f11475adb19a546", - "9373544d1d1e0e3b57309adf0a8ddeeecfe8b7725ee6d3e11abed9ca688a863a", - "76fd2a07b1c5fcb4f0baa6659d1fa784a1153727262f3b2796aef62bc9ad9fda", - "26109fe66a8400e158fe1546b3a37f49a695bf7d7ea0526877b78addcf439113", - "7c5a9d333b99d8ec354ebfee7b402c6c71301bf5a47a30496912b62ed9563f68", - "902abd02a04e340d21f0c391b529c4aeef692945962b6420d821b93627e703ea", - "2b57ca8c2b4f878101dd3b34f75e1ca31f22b6d14a21ea0c8bc22707522e7c43", - "3536d3c52ae4553c78dc94eae477f895040d1af6abde9738abca5bf4ca3f85b3", - "39309c07d2659bf56372a50f5c68500bc85b526730397fad1a2dfec660d06b44", - "5d4660cb9e1368bcaa46db3527374568a121c1f82c6f2898d36f22733f769275", - "8259f95383df005ca86325655757699eea8e78fb325e130b3f51db5acd146fa3", - "b253d48e159250a8c32c76d3d613fe1d7544e3dbfe54fd5c6ed6596a79308a6c", - "ad76b5aaca1d4c8afb03d1c5a9286b4a67cb1d98724f96c646d0bb145479da54", - "10e3976612e6a6db9eeed6beaba9b5fab46cc06b06b23f5b406010f8d695b99a", - "a5cbae7c787f79989e6305598cf8ad10e3d85123376072d323f2164178313042", - "3699cb7750b14f781821c014ad2910d1a531fe8c0afec65c6ded2e8057021d72", - "abbbae22f44b42d1c4e0227fdaed344b16c547a0a5733576a8441786d6865c3c", - "e3b800481721b7995754ccaeaed09409b53ba360bf62fd0bb1976a69eab18d21", - "13bf8850a06e667c369086dc1d87d2ce6d044a9d1b7847f71cbe655d605172f7", - "ccba7207147f6c4ef6e60798c90eaa9f425daccaf7094871d28eefff6173b505", - "19e17ff95f603386ae4c05c6a7c771b776b763ebf511c1f33ad0593954d54847", - "7a60b5dd6ababcda73b0317a8c8a87b15fe2238853eadfda7178e347ee125b9d", - "ef4d3912660fcb406a2714ddb4b401feb5c8c2b4ea04678b4a0b95e628d54bf3", - "689c0a765a01f9eca781faad4666e71ef32419cb61485d391328f3637008fcd0", - "cabd81d80c633703676b0047d5f30b8f36ba5080181a34291cbf1b7c26b6858c", - "5136d6f3ecef371f5b13e61513c14701a618a525d9abd5c4057f209092b83387", - "4fe4ae066a1e5e5fcd22f7b61c4160c28ee0f382a17b8f9e6b3c6f5f831b5dc2", - "9fce64e6cda225af12ef41f01f79ea6d029ccd533c84ac738c20af57e7576cda", - "0065a88551fafe67c24fc1827e91d21d906fd6c2da209e2ea6b9c1a0a4d73e88", - "3fadfe8d2f50f97692a30f1045e26703b32e6fbf9313476de85a4ad1f59f5f88", - "b3f5032ec845c19e10b166312ed4c9d2ae358202353cc5ac92d29a573f9b1b26", - "393a63612d7188886f98966f212baf3eda8b298c8a46bcb00b9dab88839f695d", - "5e1f60c0f80ff3d7a67a2a53617a580c4c9cecbcc397628fe637adf8c1747654", - "02d5514bcd7ba7bdf84512ddeadf8f3a14b2d6307daa69173badfdf226a0a5fa", - "4c335cc92734bceb6ef92849a4be557747d306f779b16829c7ba4c95eea5ddcc", - "0e212a6bff5a6848f8a6115a512d24cba39bd36b2b8bb5ce8f808f31300a3ca8", - "32d50364a63f9c7e9e005af5ba9a4393c99f8480ea18a2cb74c92cdd34e39281", - "1bc08d8521d03e4b3b2f17098d0060159b6a783b69908f2169a96cc34831d142", - "07340f554cfc75b30f5df0628b0eccf879c474a58aa9bdebe5253a438a4ff5b9", - "874cf58f6f4253506805422d77a782a635ed5d9e02c421d6bcfbba963382ad25", - "33a73219affcaf3a5f504fdae35e36496cecac1e8705d0b845d6461ad1e77db9", - "ac1ca53cf719361f23f78128483a04f81cb705cbd79cea5a0e041ace83fdc209", - "a25468a00eabde5d5b6368d32b977aa44410d740738257335937f801d55f8e5d", - "ab83b568519e0b92ce77daee80d692d0d5587c1a08769ac4933d1d73519ef586", - "f2391abca7d3a8338ddb7831abb57072606d4bd7fb83e82883dad7b02270cc44", - "4bc9d0f7f16860d1153085c204a52850370ddf7d68c970aed27f758f31ade729", - "8c11e666f2a516dba94fe4f31502e21d42d8036ab9c44c23a23ff3803eea2fa7", - "e8e2df94376a1a45d5fcf7a8c84d07db1e0f4bafa64ef145b2fe4b03765ac5c1", - "08916fa042cfd92bf530b1f04390f23fefee3c7fba7ed2cdfac7353b1e7bd5c1", - "5c34a66568c094cee8bec7dac6bf7e2355b86f0cb8c7e93c3e6b48d120d97ac2", - "dc7abe1560f1e32d02d490cc172da2503e57fe85fceec4d2254b3114a170bed5", - "ae2091f5c1182f145696f985be13c851eb81c0edb20617d42ed69bc01025aebd", - "9b50e3971ae769f3240b1640764e92a4bf2f8ce3eeaa10bff0ba9d5bb6a89395", - "7d9bc448d342f0149d1866d4e8139b4184c3fb3433d835ea75bcad54824b4b02", - "f3de20d279c0255e480972322b4dc338d14fd5a8047d530bcb946144a131b364", - "787daab85007e0744fdb0ed8d185a8736b2dcb81ad5c5f55c2fcaaedc4797b9a", - "3412c44fb6ba0db80d13d2ad74eaa11fead5799b7c870de134d565a01560a9fc", - "e657b3bba5a8062f6f0521ec0d0cfa4aa9877e368dbf1bf147be72c48829681a", - "2bd92a07b8a354034d936533674725e1dff63508051c59abb63f06c1ab6f047b", - "85feb15da5500c7be9bda3da4b7539a84c98c9311249f830a2f4f71401847a40", - "f181ca5d0c9374ed3930a341fa8311f5197545528e005306eeafd223c0e0e7de", - "8b5ba9148270605ef725b2fd4432bd5bdb7a1ac6306739967b09e225dcb03616", - "a055d0a7303fef9f86d7b748dbd1260032310c9b7fbf4a31438fec4fdf4a4c13", - "be39797278d2081e402f8edcf7837ea1153ee80444aa53bafddb643cc07e2fd6", - "9d034a3226f502f9c26674e0ad22406ce531e48bf7cc84c9667b00cfda2b0a3d", - "ef82a9d815e0f5962b5163f006ede942e57e94a3a0cc1ed1bd9f1fbfc9ce769e", - "8b097d13af17beab8d3a43237755cde20db749678fc12ef8f413cb761486e60e", - "2b769eb9236bbb93e7425a67c290dce86d5934ff8846617c241a97f62fc3d7e5", - "8090c107c756dac9784c4076c8f57cfa4dca53aae711c354cf1182d81bd25b67", - "ed933dfed79f4141b6e1f16652e0a0e75c6d9aa01fdec9ba5ec1f23056832d47", - "15947570438a213c87c4a5165fa24af305109522291a1778532b4d6a3cf4e721", - "5cee80172c4dd93d0bb2918e94bb4e6ce5a5c8b1e57f60a45522a2eb192a71d4", - "bc9fa734265eb33f4e564a8bc4f6893777205c77cf3cc95b757d0d71a37c4b51", - "b0d8f86fce72da26a6a34c07f45d2610d9a5cd5eac5894577224222d62459679", - "a4a9296efa11909921f41c02edb6cbce93312187af8be209fd1aff30bf9554cd", - "3adc8fc15ce5dcdd64c40c91eda4848e14516f2515a31e2febff57e74a270b18", - "2be09a077f7ef16ac5189c4ace20cb9717f910ee70eee8a3c16222e5ed5256ad", - "c204a4831fc451df3c7b9577c5d672ac8114db3b66193b0d96827142cc805edd", - "8cf9f03eaa0eb9a963e499622ae14f6fcb04f3d1f3db54fe88743afe4b74d904", - "6949909bfe00216717efbc1aaa0cd2339f180533b97d0a68fdd129a6ad377ec3", - "59363f201aa9913e482213b31253adcd3693762daf5f642046f97789ca40f86e", - "f0d876024f3feb3f5b2fb942d7a7eaaedd49b98d0b63b8141e16a520d8178dce", - "336e646a420fd0e1c513583efc04207bfb70839db5cfa64710188b2d8059c402", - "4d0b770efc48d311042d52fa052b52cba6a070c9dab952f2f16cdfdffb01bc19", - "9499c2801246f6a7e6a2cca6e9c1b738878a1883d75cc1ab8f182a02d1ca73a8", - "57885c2193e5c7aaf49321b9efc06bfb85e8503439e33126e5c178b425a732ee", - "7b435b109314ef38021c3c69fa10c222e74bd2ea39aec9174e4e9ba4ebcf746a", - "bf40ba77233f153155f0c81db4d28d2eab9dbd0f365ad66e06e4f00720162dde", - "5e85f6daf723146c63ea96377b4a2b2f66653a845f2fd3f0497c6b393cef3f6d", - "138622fa1da77162c7b3b4834349b6038bba6a92658994952fa5dc01f4c51c32", - "f33f13cbf500ff4e2189391be5d925c554c9c8388dd1b755662ad50b6591a653", - "b4e465f8c36e52cf96d220533f09e42046b71a61b6c03ab90839bf735082787b", - "8018cedbdb486c7385c2ce0a4a6bad162c28d83335ea1d8d994d24c4ab68ba78", - "4de77986e6a3be733399c4749a6becf060a9b4278f4b6c471726bee5acfee4ae", - "f589d2e7db17462679a580bbe17140def2b3cbb04d668808ab8160492110c875", - "a781fdb4f4d071d8585cef344128d9eb4d0bb36a0477310eca2215e6eb226811", - "47a1cd7cf6c8d09894f7d1bdb1ef7d5e6d7f102fbb465b7d0dda261e032f54e1", - "76f37de2fc5ef779de513080fcb008ab6778ca0d9b22662fa7441f866d782717", - "88cd3b57a549639283f7625ff8d5d6b92a96ee7401d7c5582fc4146270dd4270", - "df64ccca91b76ba76ea2b013df8b13d437c8cccd91c6d98e2c8caf67d6ac705c", - "4cb74e26049c0fde9070714d1c95fc2ee82bca90dcd68dd6f0f372156b5b72fe", - "93687b6ba7bd59e83624803782e9f0c071882f74c815b765773270cc23eee0c4", - "ea8cc3244e4853f688097187813648ffb718a65e3b903ef17f6a1d4448986d38", - "543e0ee6d467c6e743955cd9bc8ec0e090d1dc602a7ee09efb9691b94aee40ab", - "6f58df699619c2ea1c79d8f8761786be29bf74f4677ad686526974d3d37059ec", - "c07fd61b6cdab41d2f274b5942c5447c3ad4e7e8e9ce0d09d7c1c140133c0ef8", - "a3b9e7fcd412b1fc3cf23a271c4feeb8a50272f6b8b1937b3532a2a27bb6e433", - "13a8d3b849c8ff93145d64701d71fe47e54e303cc37bbee1a6a19ea168b2f494", - "9c75785398774b7b245fc745966871eafebdc4b0e2f427b87981a9ab0dbbdc9c", - "49f24c61cb2845c0420ddd6557e04fdea62e01e18d2e498437119f528e42a680", - "be4767d83b03ddc0e047cd1a0827dc82908b8f441a1bfbd6a043626532fa894b", - "f11826617f11ea89a171d417dcd5648109ffa8e271f48cb7f8d0879c19ddab4e", - "346fa0f6048424db9b9c268c70bd8afbf54e9e0d640927df3cdf12eadc36117a", - "a986c57e653c9625baf4c8720dc6d02976b08d5045791b7eec29ca8714280153", - "0d01eeff7824e38dff00cb7982202db55dfe2cfc7fbe939c890e4faf1a2d9185", - "bffb442b860b9e93440d13406389bfc192994f955b3f0d71d6c8a2e77d95d11f", - "3c844a7e9667d6d98d36b8a93727dcefd5d69ca5b90e3cf7b5be7bb9014590c2", - "3331f822a4340e1136041f25e733de6a219fa73fe4ac6604f181d0cf9b0fc2f9", - "e47ff5ec3b0de130441cdf9b753c9735ae54b33d391bc409b6616c7295650884", - "dd08872083d215ac9fe11a523873bbdb2eebaa2948efbce1813863d053b09938", - "07e1ad3c1c90b9e61ca5b0ac451b09a5c5e774ef8ddd41155b5acb98c4b734b2", - "bc9b2ca6f9a2695d12d182a37a51b0ff403033e9064af1d686cf03d6c2be9cb8", - "0d27fb1260efa218006b944fceecee569cc901637005d2e02c4ef8cda2709cf2", - "76698a33cd3d7ccbbca9ffbb5840b8e2e6fc9d6742a7e36fc4b5aed94246b03e", - "8c592989fea6a99f6a6f29294faea209732acdd3f3865b4cc2d5bb0088ac2a45", - "9197533901bb5280e6da97ea0c6908f2046b8ca9a0183dd6fbbdcb51510cc91f", - "270ac412d00bf4873ed9174352783dfc658db638b4754f0e20d22f12f2a74e75", - "48f2f98b9ded219c7771f5e99355a0991160fe3b6e1d8c733bab44d7905d5008", - "b3b65ac9a4159b35d529a3bf507f4f55d402b0187022ad116b309e95e1c94977", - "b683d2c96a7f83c95dd0bb14afc3340bc202ef105ca69dbd7630f6eee3cc1e7d", - "33ed557f9d99139401f1e788504b4a06f1fc54319bc6ffad8dc0bed71049792f", - "97f8a59c14b122d0463748582c724e871fbe67100128f19b93fe4ad9baac2c04", - "642c6a2b19f84f9236660bfc90e5d6698213bc1aafbf55e69910af7591c21850", - "f36bd26198c7f87d5b127fe9da15711f56e23d112765420c39c38f0cef37c73d", - "7200d93a74aa2e11d965a1d7e064b94840e09471fa61c5e24a2755464151a091", - "84bde31c07ab5bf3c0b73e01086d95e1b61ae50a7cf5f062aafe14bc83dd65c2", - "c2add9702380629fef18e4626330f24ac8a960636bcc5876e506a297b346617b", - "4a17d6c71c49fe62b3772387a79f0b43579c46232707d2ef0e05bb183f9b1d55", - "36acb47e4c37ca2843285fc78960681b234bee040ca363d90e05837a2cda9f5d", - "5dd8c7f7e96f2880c93d5bd2fbfd5ead3792f877f6ba13cf2b928160e226c4f8", - "cb300e5add2eecd4e68b774dddea36e92e625704e3fb9e05999a67d117258892", - "756643a1d31c7c80a6439448bf93f0e0e3aba61d99a1279d33e07ed0a8b42c0c", - "bb08f5a88cef868fcbe6ecdc9cabd3e7011f8323b2c7a3d781cae430b85ffbf9", - "b09048b2a58a3eaae68b873aac1c75679b9a811286ace83a93d8e29caa85980b", - "2c89f6bd828f91f13673a6125cfae77b26b1f013219166a8efb002e2b12104be", - "a1e8a54e8a3d12de2115cbf0bdb46b05c2782d515f2ee8b5318341456e454df4", - "21cbd4b1928c7adcac489ddc92488d09ea409af280670cf930a88c1c985cd6f8", - "15f0fccc6735ee672016ce2a295a53cae5baf2e33a9a4959b99dba9e250bfabe", - "d4e52675ded23e16f75f3d5b9e06685f015ac4eb88c40512dc2c516e4b911588", - "2d3a83fee1bce17f7f75c7f22e86a00d2be0ae04eeeaba485c6cb7b35cb8e0bc", - "efaf9e0acfe07479cb2fab473d1d0127ae3e3d420e964d25eb510e5091b496d9", - "1e7a5a963be8a42d18fdf30fff4c58bd72df1b390dd11837a033d72e55f7c7cf", - "f269cf5731d8bd59a4a4a2e0882a1e13a411fa1654a684e327e19af253c6cc07", - "4e0eedfaea7a8609d392d9ff0fd4008dbb3cd13c0ef6a21e7d0e382527a0d6c5", - "a86d13a83b9e965a28578ac2626265ee1a8430d5de4aab482febdc2b9862efb5", - "2c1ad764cbe8b827780551a0fac3d9a0292c493e5202c2ca9cc8f45a396aa61f", - "e1a37e5493e3d4ac7e296fe82b1b06b3a356d66210aa4eb70d23cdd141709191", - "26b0e2574aeb311929e1bf8aaa8252b9c2a13a88b8400c3ee6cb75399accc682", - "e21574f549c16cb44ce0ae1125d934215655bc1fc21e2201d08648966d2867be", - "5c52cc951db8d8ea392f51f13141356f130676f166fe8975b5df7ebea6c0e869", - "cc133dfed1fbb7c9299350e6c13e5dc580f3898d7388fb4f16d891250d316d27", - "7529e8e1200d8ae25d990e84f6e2bad89f6c4822d1482ce64aa48af670fb9e53", - "8ac3da9621847b1e372ece2ad130ff18bc634c53edceb7af400dfea46c9cfcea", - "149939869b6f18442d3fe3c1ec777a39573e58c0ccaa2ba37166e1ea1efe0172", - "2f9012d76426726be3660ef09260f2173ba658ce6baeda3af8a7058e466abc44", - "2080d2675fe1021a46a737beda868b399137de371ca6a608d8d2889ff08d9c01", - "f03100e678daa4e4af3f1858052ad711a6180349b0181e4a69f33affb2efcada", - "e574a67f400d00e6e41347d308b30c6ba1dc390b1ce95217d144ec9d04776e76", - "211aee4eb625ebebafe4c5622e21c7539e442139237d0b44b9cea7c6c1b5888f", - "14a59075c35863fbab0130ed8de3079898d54659fa9b3460ac198859bf7520e8", - "7d815853e0770ef1fe15e4ac8ec908031572759295ec728c234e18a158975fab", - "54acbecdfae7369c71385def9c95faa98854a3abad7c23e97df8369248bf80f0", - "451e362e7a4b630dcc28d11c6b622768f7c5b6851324adb9dbad78916c04b732", - "64d72d9bb1936c2501110fb1305adf799a2e657144a3cc506060fb1bd96c5344", - "b4774a8547381845d6514f1be779e79e6c4824baf038cdeda843e615b14e1058", - "57bef41acd171f98ec3a1d3bdc2222da96ece06fa87a46910f54dba77dacbfdf", - "3a37b7ce0964965f2ab3768dc3f5eebcea9b588b7d58921ac4a61ec27a983e05", - "bf31449a3affa8f337fe78e539a6aadbd4cdd82f5e679101e280040b98bdc1e6", - "2220eac2e5723f91e3f519b4e2de29e90ca935d64240723a27ecbc48e38f0100", - "3f2645d929afebcde30995e10b22c76fd00317ac188b0a545a8b407e0eda40d9", - "c9912df97b25d6792abecd124364c292eb90ead2607a9f6ddde9538d9b95d830", - "edd47261dcac0ed49550f875ff8437cebe6d2ae9c2867d262a942c3761770901", - "89704bb33824f12a48fbfcebb05f71ca4e7b049719ba3fcb717a4943dde30ece", - "4e1df45616f5760aefd6a9fd80fa7b8cff540bb23392bd77d01c687139ab6c2a", - "d897de98a72a375b88c22ae8991bc69846c9f49ac2676f6b608a8f1371cce774", - "45a72a57a434b6b86ea34570929b5bed16ae8cd7b75b5c0c328f7bfadcf2b9ff", - "e9e0d9e61f4e881d2da383c23c29ce1fc87dc8a2ca2d056106c4aef253a6cdb7", - "811b14d8e3a5923e180a6d1d8f41fec97b59368b2d1c85662db12c088e54fa42", - "02835f7ab6385e613bab66a3cc07e2aeaf29c634ff9d83193200e8d06e55346e", - "fb7a8bc1ac2fda9121a749f482ad54fa86afacc423d12df3d2a6ba1e44ffe8cf", - "82b69c13f5059cd485adf25aaedafdf45fb9b7ffbaf473fc1cc13362a365a438", - "ff3ec6a3081c3ed12019fe0c99a2cdba41874e717324860a8dbebac47837314e", - "78d3b418dedf7f0915960d8903fca934bbd01b26009e402c71297e8dd0d29176", - "150c85ca7ff31e0d0603e8c8b37c52feb25b219e45fbbc0d818404b32dd2619a", - "39f934c9a0267f4f4e3a916c11923559ed5b1faf10f2055d4b8d02d21ef25549", - "79f52ca04f08e85368d52fdd530ff11beab10519f15397806315abd2d27e5a8e", - "b66cf0b0e3b83b8cd98164bfadc0dedc3a0924bf02718192e224a027a5157adc", - "994f8e1de64f56529744bf7e8a94678c3776580c5f23f804137331bc54d7d95f", - "7c4c58ec56200413ac3f379bd784de0cfdba3a032616dae258f6951f5555347b", - "c59b7d6b2e103f9537a1986401d1b3e31f210f84d65e9e4deb91a4471d677d78", - "c73c7fc052cd032f4e17a8272dc5899ae702224de27895aa7bf23d856743c456", - "cc5377d623e0b77e014698820ff507ea4da722516d5ccedfc96ac8306b334c48", - "27f6e4e824b80720674b15f3d41a8adabeab4e538d33565d14919fa1bd76a4c1", - "6397d0f3f76ca74c28b48d4ab8821b154dd27b57408c5a83143fc64799c1df55", - "bc534ba47abedb423947fe84779db066bbc979de62f48abb3b0e61e7ddbae9a5", - "b6e4c348221d30f2ff3ed38971268c147b524e48be130cca72d3e0910bdcf969", - "43bb38b9c5844fd5b671209394d58c9df21f4cc8021ad68101a4f16160242227", - "a4b25790f5b671ff7627a06134891b5fe9f295979a3b6588449e2ff8fb763fd3", - "7d29653a7f0814beca38f5ad7b34215bb737b8067957f9b8d67a97a0f24536f4", - "5c618f6d29252d71f26e0b6c64c1f62314f69b16ee5e27b036edc462d4626539", - "98927145fb5ae0c9dc81f52e31ad4a15094a0749226d759a7fabeb7a312007d3", - "f5cde64ebc73cd559a83676a6fd67b43dbc6b089e2c474dfc1c254bff6c98608", - "921e323e9b49b6c1224e2c2c911c3c7df486dbdf6f8dae5df43ade509bdcc3c6", - "34170fb8f6555a44f85210b01118d3701edfad0f8ef3be989078574c06f19248", - "557fd80d3531d129e2259820277f29177f2c3cf49a496a6151ff5d1472f1a0fc", - "da0fe5ab1b5c3b3c778cfad14fa7f3eaf71a8672748766c262662c30ffe8d042", - "58976989415ce61979de318bd566690e721a2876b40de975ae5680c2659a752c", - "45d42502893d66f752fc0af9315ef8e09a5e946af925d170f0fde20fef27ec05", - "2ce11d5e87fe2ca30661c8a20fc41a9d9bb07a2956032c88b678d59d9b07d641", - "1102040b80adeca3ff279c4c916a45572ab4945be223a907f6c770a446ab09cc", - "f4e0f86e98fb65b2a8772bbad4a9634f23c5c18c37b7f9a2eb342a92445bc9ba", - "2018cacb082b308c4e22fb2e0d07396cbc79510c984747ffd6c41a6bf1036029", - "a3b35d4c2e6aedeb2bd3a4808651d0a27bae63fad412764af49a10e4df8eaa82", - "178f671e06be102655eec18624b5b6d93fcb03b3428eb50df3054c7d9d6c1ddf", - "57f44aaeb95aec76e956fe02e5b9e03554a53bda2b00ca05f4813b181458a40f", - "acb3d4c2c4a6b8a85d29979319229c9d0a0018fbda4e7aeb95035710e396a764", - "b89ad8419439e3184eb26c86e118ea6bd14ec55bc0f74ff592e0fe9622ded477", - "0065643eb08c8c42f81c6295241e80df0364609a0e94655947c818f40f7b7906", - "f230e0cc0b7afb69250a6ac962fb9a9f89ebaca47f6050f6e43a51ca75458b5a", - "e52b049b83ad03f5ab6ec4b868574b6e03de2fd27d75057a57ea06f2ede123dc", - "7ec5c729ff5483b04cc58cbaba964938365959206decdaaf4aa17582df41025e", - "bda4b3a437a53039b3d1c81502794cd5feace7c8ff3838aed6831ea56e3fcf81", - "e483e2db6c5ced91e046c279d589363f04228627eb6294e160b3392e95801d3d", - "3694e8d19c4cdc003f6e61b5fb4230c14065aa3c60288c02f0ec5d46c7b2611f", - "f32f28272d8eb7a7912c0ee02662c6a98d8886ce8f87aeb6455cd8573327880d", - "2da8db8e08a098fb2d55e2e4396824c66bed67d896d9250f0c4e22a1685ffd1a", - "4d4686171ce9c12223cae1b59e10d11364a5b47df3352e39baaf93bb6ba5662b", - "b37882a0e340a6608d89e79549c5b78d75d7972b1df23a47a0a17b1b74604b2f", - "42e2efc584b2574b680c6c858b287cebb94809fb384088dc013b8b6f36957a2c", - "db93526b5b3f449829ed6731860a007c2351b8aa32ae7b252e0e5137fc79ee83", - "7a68ad177aa45782fcdc8298f3b842377603b5fb707cfadb61b0683e841a6e90", - "36ac072f363dd446bb0fc6a5832a5701464194afca69729bd066a21f3f5a330b", - "f28adfbc3d151bcb5e915906d81a23809ff24d71ac0651cecd0c09ec997f503e", - "976e1b49e4ed503bb65c7c78c0911390ba885454fb752fc6c24919895011f3b5", - "9c10596b6abfb1fa397656a12b653840f28e07aabdfea2d0bb8e5cb78f3ab28f", - "45eeb25a464dae64ff7d7a9628e13fefbde38a9fe18a3d96d22133fe9a9104f0", - "23ac13d65338857554e3c6e784870dd72dde50f6ec26b1cf69cd6f62893b8421", - "b452b560aeb54a275b61e301644fc5995327d0ae332677b242e5394a3f114739", - "0577981bce7add31092f39ff1235a6608d66ccf0f9a35697af8e0956614d6dfa", - "69e1e024f97d4455887b195f1b5c706e0c5b10b3af47b5bd75683e7d3f134478", - "f2f46520f0fab533cfe4c1280da5eab342f09e99ef058d786f2d587edc6e108b", - "3d0a8336f8024d1ee4d7e4ded41785f4e0b8b525cd8bdc05958a25d2a1018784", - "bde4ff32c54f64ec7b4097d9e7b4a3fa1f7ffa6d2a289b3e40aeb39b1e66b124", - "c0bd9fbaa8b216a5f4e3a12574f83b7ae59f272202898f8dfd11d1d61103248b", - "a7bcf92aae95a625004e0cba1bbe5152e8cc6eb932669f6e934b1fce4e1b1fe5", - "363b3388908c9721e300767f6cc1d9f96e8c10ec81c9dfdfbbdfa8de48093863", - "31ffff1bdaae901ba9646d371d170ea6b1021abae91563ce3ade0d47933de501", - "edb2f948012ea312ba19b3313947618d2af5a5819052cfbf5b4022d0e4af27f5", - "f35496d84820a4fab2f042dc99f5944e610c84d9fc0542227932d7bd3ce68531", - "60f05618570f65a6d9fa1e51ba174b0cca4392bfa142fa9c4c115412cdd9d719", - "2b0e0e78a8707a1ec77b661e62af4b5b4239fb1d64aa3cf56bfdaeedc47c29ec", - "b9f6fa41503c476ffee03b0d5614da31a2aa049fc7e99eee9dc29361c0e70987", - "5d17a0d1ed1a5de9c570eb37099fade5de7def0964b43aaaaf7eaa4afb7e19fd", - "b5aec0067621315c76e4bcc45137ba22cb75b78f47f57d38f09267104bf4c211", - "2eee4e56390505bab4c78a233bd7171c4a6531771b4d8ac41250171a0cd8d315", - "37cff5563240edb7a117a8291ac638f162001930f3555a12f552140f71fc269c", - "ece0646868b5dfe42c067d000235d25e5521f6165c57e19150197be08e44f875", - "7e04b45052ef73d2ef3f30372283d8fc1ea30c1e9419511fd995696f8406058a", - "3c28c727fe504cf1ebfd0a5785461b99bc9b11b64b078cb1afd09d19a17dc0a8", - "1234298db85d923de800cdfdf765b4d2c704979f9bc6208aa3a4fc95ca33db95", - "b53fc124049dc10d98cfc46e91dcb98d37369a023e10233e1e67467582c4ad8d", - "e0d327aaafe6df581cf3a0d4574a2562317c2d590363a978f9c68e0d9ed12838", - "6bb0394043381709e28ce4641a2a0239409872f75ceed17dfb5060940b8c2a89", - "653d6fcc338df102ba75a0c2854c4fc017d4ceaeecdb0698a39b67a0dd4ba41d", - "9c61fef702cdcbf6001e4ea7fc2f0bcdcfcc77a70349461ccdc679827baa2512", - "4afd2e0a587ed3b59cddcf0a7bc4c954875f843679604b01014fe3ee335f3222", - "0b0804bea6c1f8a6bf8a9f2eaf64306e104158ebc00f6f5373862c019cc21303", - "579d415eecdb4184851c5a74309f278ad1d6ef749ef4cbc0725cf1003a78c892", - "f59c8dce5f840ee13da95a94d2b5e502f95d5b64e4c20eda1287b879f7c96dfd", - "1c8ba8b1d3ec33a269f2cb69c8e38cb53087d61ec4b0f0525338a26893c3bea9", - "3b758654b605d116602f2e9a7f829809ee3034dc09788438211713d9c2ac0dd8", - "8efc99ef79e62e3c6af13234ba9d5b719c22518cf9c00420ad0674c13f11dc80", - "2a39a6321e318b10418178e640e7553a1c2b838836e69830ddd88dc6f7927931", - "df0420434f4a6692bfa2f9b7f997490fc37b106c1291b8f3ea615e977e611bef", - "fa83276df42011ed2aa8e39c35f0052c5143f26ce5d2dec43411028d2f0c5c02", - "3fe48610161dd982d6b33836c331734ac1aa7eb45d6d04f928202cbb26e56aa3", - "8d821174b6b50d3b6160c81e496debb4b2a83ccb8f6baaec3a10a68060aae0dc", - "a1e01bfe07d739fea69982e511e0f35a3e12c9298dd0e26c1f22b016c248cca0", - "3203a8e711948236737ca95002071d4be530e4cdfbe6f34e4f544e13b8afb778", - "dda9ebb8b26e6245ac3c87b5bbf14eff8811b80ed830b56488f1e99ef0b9073d", - "64ef68e7fdd70b87752c680ee7a24f2b6812b33bd695fcc2e07756379d5c369c", - "f452272603301f6b4715b363e149a3430e83f9e8ee03f11cef936385091e351d", - "db067319e46111e142dc2c628dc3bb27bdaacaec3762cfcb2ab70007bb938a42", - "0adbb994bcbac95d3f51994d25b7b388a4ed44daeaaa1a34bba83357a1634271", - "66612c441d9168629c5ce23a278f12e10313b57c2b57e56fe9b6910cc2090380", - "b7bfa77ca1e926f037a9f39ccb6e33a0e45c82c27059a940836bf2e4a0a51bd7", - "e79946073625b2363725de8ec61e40bef587f776a1dada9759c980b8cb4908d4", - "8e11230586c4139b7d2556424c7462feb7a4c46a0957c0d544db168113d7cc0a", - "c4a4d6a3407f78616d5dc7634cd5dbe2b20bfcdeccf9dcfb7296815461829441", - "27d00f3a3b181cbdab9cc4305bcc0c335005f1f3dacb3360a9eb473d138c219f", - "dcc42ee8c5bf3650786fe7d2ea64e3de9b972d910c332271ed62259da1316dbe", - "ddf312746361f594000e307b7339490f541c18fe656064c6a60c8ed2b896b651", - "c0bbe821a4f1cdfa3fd527da4fc50b44167359cc1b99b310c131ed6fabaa080e", - "8dc8a5017e682d7dc4da361fc7e5d26d2b20ee90af3e1f99c9e59dcf6f0f8a05", - "c9e0d769d0a6a897d0fbee752098bfe0cf29481fe6641678c41b3fba6116abed", - "be04e1e474c975f5548f1b73d329659d759ba6dbff450583eea17f501ae3abba", - "e714aa489275e1303cf30d8c01a8339a864d7fd77d4526f12d32002265d9e2ed", - "140a855278ba6010ada25aad30442f46a265a2ed6ba9a8fcacc0b17a2fec9a75", - "2084b19c2b0313159f67579e193525634666a6b94dae93f04b56337bb1026268", - "0b70242f42e9fb8486d9fedd807d4c1f29442589545461a9fe799c30802927ec", - "4d0001a4065d367fd38419f33cec6cd19fe8952e604fe66e8dbd89b66d1d8cde", - "32d50a60097005f556b924b7d3d73284a30cda2e2c1f8274b8277c9b436f8603", - "aac69f62dfe99107f565936c69ebbb041d12161019feb1ba02049a7e63424ed6", - "0cd6c6dcc037394f95c4681063c857209f527f7c5b6cb0b182740e73930f9303", - "c166519f8bf18bc0a75c8dbf9f3937d0c27d811f71d78bd1c74208ffa4e5cc1e", - "f41694ebc9904ead3a78d97b9f704cd9d6e27665bb94c619b1455c1947ae9c83", - "128525603fb71b346971a0671bd854b0baabf081d9558953e009cb1891ca8f72", - "eeffb9a94a6d4c28a518e7a42d1ea34566649e2f360ae12194d2849266b90e12", - "3b2678f928cfe1c658c18c8f8da64aa77616962de8b4181be689a3a3e17310d5", - "3358fc9f84c3563e9ada17aab5b9643398d80224fa830e52bfbc58f2c40c703c", - "f071d91027dad60dc618a631dee85563007927c4c3fb070cb0e44f48ec1ecfe9", - "e4b2af5fdaeea97636c9925e1a80d1a14cd6596557fe8f8e15251ff0185bb2fe", - "7c15ecfaa5401731066728f9b15686e9654c0c4f43dab9c7ad9055772f9e4f49", - "05d2b9291d1b567a222f43a2068dd05064cf063758ccba9ba5ced52dec202274", - "5c69e3206a0a9d9ab1fc9264772a573847a51191d205866ceac174fb003efaa8", - "53d704c22cf61431c34ca5d189c04feeefbd6fd6106f5f986dda3db5645991cf", - "35692a3b0cf79ac0e822ecec207dfeb9cda3b8c513afe0e347ca3d4d7fb3d3f6", - "150faa4cfdbda75b485a00f87fcd59dbca33e250a65f2f8078d1e544027264f4", - "9fd0ad4019cad93ee8164182f4b51c03fb1b98db5420e4f3fdd2d4e210460c3b", - "df07b0fa9f0ee88cb1cd4a576bc71c07020fd5678a6a9fae535c80f2dd8aa353", - "9fbb9c5699119b1e5951ad1e398773d0232d3286d2a9b086d1b7759433660735", - "8cefb394a5a5197549d0d2d644f3f6d00db07f6fa927607a1fef3a4ceddac95b", - "ec57e5a7d536a07edb3df0774b71e9d7c4c9f27aae73d9fb7ef15844c341d582", - "adbd1d70c950623d9f9f24d88c78856d3018079b08b1a5f0cb18cdd1be6a64e8", - "71776299b803106d2ae910abbed516f029869ecd6233c6eca4de53a08ea017fd", - "d5cb7a4af734580baf1eff88db00a4bb088338032dccaa32e36b49a5217e4fbd", - "4fd33d6707fb89d8232f08a7d517b2f2a0eea82249fa1e00f5d4cd7807f9aded", - "44bbb8813d318ef984d1c9a320ff63d22bb950f76650435d9737412d0e11d7c5", - "ae6ba07832525c1a82f98afff2471663d5e67e5ed5d6d9de8eb44d4bb5efe3bb", - "5c726eb67109241578a2225546bbb681d8d130898470f813e679e5a50322ac69", - "c43e9f6d95ba2418adee6a077a63b01f200d18ebc1014736a3070ed9c04dacf1", - "a21157c9c8239387cd2882811162b43761381b0d9ee2c6316e087f574f91f749", - "d592bbb520fd266cc344d7bb982857151b5f9b4c6fa8eed6d25efaa8ecad7c65", - "ef7538c3f1c62bfb6fe3ace9d99b6d2588f0c529e43fc728f1ed9baa6ac8d08c", - "8ca6ebd36954c0ed3bd759a16b011ad285f0efbc72c10e3a288565752a8f97ad", - "59a07133ed8a5be7ce4796cff00cbfdf4479f3c6192cceb7d727efb1f25c675f", - "132dca0515be72b46e4d82f4e92e872a9eb6d2fd30f2366baa849dc060a091cc", - "ad2f05232b0d6a1adbcc2633a7cb477cfd07aa703d313fe44ebe43dab4d8b14f", - "0ed5a45e8a7e2e756e58637fc136c477012fb45829fb8f76fdbbdc9c5ace1323", - "f6fe47f2ffc0747332c6db155601bc6593d9ba4ae8666f15f8ae7fe8acc66e9d", - "7598060d18bcc6bb74f4009cd8f05c84ad6a84c666f6209569a27e8f6ec6ea20", - "33a643c5fd15c1ca597e564fdb0fd427b79852d097a178f1fe534799525502ea", - "5f5f6d3f8edccab2bbefc8d379eded17e5ee431204bef121343ac8cd7a5dd954", - "c4cb5725911296a3364e5f82cccae59f20f066231a2a96154aa49377958ca2e3", - "c9555657f51c6238726eae29310cc5d83c0de2e6fbed3fb9c9408c9aacf85aa1", - "e2f643acc02581e6deb1ebf2b3e5306257b759a43fa1058abaa8e73386f2d215", - "03a250591fd840fa6af23bdb4adf55e4f717f86aa07b186e8a17780626d7cb75", - "48ad56abd5b7548b86b9e21566f883ad291527c66773cb0fba58307a8fe2e174", - "e37036fab4b7b2639f22953739110ad327f22f3f1d1a78cf499c357b878a7ec2", - "42b742650f856a22c1b0ab8b5bdab528bbc7b5c1fdea4ca08334245c2a07c415", - "48cbc0e780b32988395b6bc58898e72d80640272138a2f267988fe5d1a2127d5", - "015d00f85e9ac42451fc526bdce5fa590cb170bd6b32a009893ba1d6d79e2ccd", - "3d489d21722c965b41398bac445740c8cfa769e0ac32a0c17e10c63968c7e623", - "fb6083b4691afb102249f8ac621c3168a156de8e4420300b491b940d16d1cbaa", - "6463e7fdb5c86f75a8b2a2b5f6f001cb510027e309f9fc0b7476be2d30ecbdf1", - "53bd98424b1d1f3f07ed6c27006e626d6db1a4cb8f19f6f9c372a07a074a2e1b", - "e365bdb878cd7ccb0f54957e46dd5dca8c43549db15bb412383e321f2d5c6b16", - "05bacc2f14deee1e56227c59ee845fa48a28fa8329299786452106b4525194a6", - "d56d473b912ac84a3145ec2304f68e79fd29545ad783aec214d4446219cc6c6d", - "ed048374d10de89a69acb073f940efaaf45bb9d753e477c89fa33bc6c1bcdd37", - "73b379d6fce4bac18a54d152416e4801ee4ae8d08b345faa3247bbc8ebcfe0c3", - "dd351da21a1171837e61111ca569191445df655bdc99c52886109c89945d7dbb", - "cfa34893cd6cf37c652cf428f500178ba1f46ce30b9369c5d40d54ea31590403", - "90bd4c1669569e1accc681427e23b2cd6a7472b5fe83453bd043615aa2e054a7", - "c0d0d30b4cd02e1c0c02a6fdb44c569e8f8fb0cc17466730c3a63b49cb40ab8b", - "e2b48f68db90f2ec2b706e684f3fdbd4c4c36263ec706308bd737e20cf5f2414", - "76574ae7c82e4e23930daa692c30d4fbd20a03efa6259094d670054584989897", - "4c55accb34dbdc04faf8f6261cb98b7b59a93bc7052b548fdc8292e71d8fd1a4", - "7b1d5a1aa13ec4c5841122eb4d3fd25e10c328453f3bb7419df0cb7561bd6b36", - "74f5b68a63bfe3a7f2c2405e8c7325f2500f2bc65a83bcab3023213cf6362a73", - "d53ce9e606b2141188b981161f10b4b167ea78c3fb046ab655ecaf8ac809fe1a", - "97d99641c736bdc722a410c8ae6d495a78093d53554d460e9da782be5853195f", - "aaad61d1674aa449aa3426b953b8fd67824c9c78779d30443b20f8a200412d1a", - "b05d98e8888046e5fe96a9052f47265399748c3c4edb2c08e1d2197daf65e265", - "90c6844f9d015a308d2f7259bc451ca78c75f8f758cbbe5fcceed28ad8085462", - "40dc479d7d7fa8e4efcf014232e8ab2be04f0b0172bc05ecb62ff8bf612d8391", - "59897515bedb6c6a462d02dc23a30ee7254e225d99a89cde278bf061be6ed66f", - "bde649ba983a623c5701cac93628a4db1ee96e598fc73ea5e18c6075c211c5d2", - "1e754f402b3b4da115cb832c350e5089d11891d2e45b3c49ad82f7008cbb12db", - "745660e3a01aad409989820a9d4dec56ac65ccb404e17d21eceba299c262629d", - "2c5ee75809fac89b75570fad2a31a6f4c73e9d21608f692f4621c8dce4f38a6b", - "d32310138244e0ebbd3bb4b5c0ab9190f8d113d16eef0b0809f89b07ba484451", - "90fa18ed09a952a7eb795ec0e4f0cdb5f4fe2f5473f06c05afb9caefd6cc7eb8", - "2bc993070d2f2b9e0b914fd97601eddd58ece5e87a14bbf487a7fe823da9431f", - "c8499084e5c05f7a7d01d75d90123eed1b5b1eb432adaa108fb0879e3e0ff249", - "9c3916245fb747a161c5b2e6866feca822273e07b4086eedf8a67449b7d1dec9", - "c156391899623797853f877e696344db192d15d105cf685164f61b1c9608138a", - "7fc6cfd283c83a44608e4754446c02a665e0fda84290353f5dad9b12e989a62a", - "7e953d99c707dd184f02257e6457a3354f22fa9680eaf23ffed8068d8f74ddda", - "c997bd673750318d091f8604768dbae573b6beb974764f7a6a023108702954f9", - "0a03f102ca3c300541f2e16b1b8a3ee3830d2a46c612781b1d1ff0854cc7b513", - "65d0355676aec95b4057bcc84fb2b99ebd4743f41edbfd65bfae5e9a97782c42", - "1d26567222d7e9de8b33a1e90ac6fea9588e15b8cd58034b1add17b46b7e4e5b", - "56bb4a28a3d8eccef8424d78383e807ca9a7572968572f8446cd78b9105935f5", - "ce95c5c19d210c53d2b25a9ee63d84ea60cc5f6a191d9919ca944a3e79c38b2f", - "04413aee8e1f5280f444e1c4524de135d0eaec676a20ce05878aa1fdd83210aa", - "8d949b78db65e0098e50a1fba573c19d675c0376992cb17812eb66071345e80d", - "0c079107e99aab0e5bcbcaa182b6b05dda5625403343d6f498a51c32d8da9183", - "753829438c5086e3864a65f4d8bf3f16503382153f04417a169cea62ca8754f7", - "b14387436cd52325353e0dcd46e079e883577ed9edd91f3d9fac633d0c32eb39", - "2e16537cf8bd09d5a2777f11bac0ff206edb313607c7c1792b5c47584e649762", - "67ad2d4626d0f6bd7719e70ea42a92639d41d9d7f43c8139ac12df51dac44cd6", - "8d542fcfb6fba288825461e7ce31d86cdf8a70bd67c3d05eed6e7a6e129c0099", - "07d1ade59e3709b2249fba2d73e01900a8ca9e0b4597aa7576246630d06f084b", - "85ba76926546ecb46103e8cd75f9f54ee96f7a300f6183fa6d6ee42fec9487fb", - "791deeec81e5bc1cb6e28719217f74013c77eb36633d63645d33d1da71f40d39", - "f9b0e3db35737e906b0b2b8c9b0b741a13644e349a20ba6c3cadc3eb1b88bb99", - "80223633eff30bba8401f74b3712bcc861af1b6dedeb289f1b610d4c50d82d7d", - "aca4962e4e980babd05c8746f668589eaf0b1f29a2a1f366706043783e8b9fed", - "19e04521d52a2459a49586a25c5ea02fb220c69e2294d99bc96be3da10734330", - "9f05e748e967c7311a178baa79fd70c898a293bb68d6c7711d3a150401418f1a", - "1287aca3b87e7710f3ea5f4185fdc2ae90acd837eab391eedeb9bc790fe19097", - "39dbc8aabdf0cdff47dbe1e28ebba127c9c7e996236081ff90e8b5d6bd2115ca", - "318730f19e9893670528cb93465cdcb508be5572df477c8e40f4d059b7a36d61", - "5719827c173f3dc96e68b030824fc1cbd056163035ba2fd676f703101b8221b1", - "475052de3c7e7d4457fdea2fcd251a2b367a9626c81340935061fad52a52c04c", - "ad168743918ee30f71e5b50faf4b77f56890f9517683ed5c47846b9edf0169e9", - "627525cae8b1acf64080a9ed4ae003882beea574a6f4f6c72b0385d0f55d6609", - "a2e31a9ae8a6aba80f6e068d9d66f1a12c6fb7a9dcc9b4c38e17d454c1ac83eb", - "13c78d86785944681f15770acbc0da0f348fd84f4364c224d4150d9a5dba1acf", - "bbdbda161630f4b321560b7266cfd97897cfefee6783e6c5f0e47b06455a3694", - "88ed96683e703e1ab189bd3e067ff0736680f96cf666185e85ca91d074b3542a", - "9de1101e2c521405fe0df3c8d3298c8df3fc7bd5cf7e3b5d3986c9f0c30cd4d1", - "e46da2cd50534ee0c21b60878ca28c34f7feabf158c78a289f4da57c86c484ed", - "63f24e5f3decd3816174a655ad602c834f89764dfefaff23fab895b4fe22edac", - "5ab7511d965087ede2482e7fba3169a7f0e020274248538ed06d2c6046116d36", - "0dd5e14338cc7f5d462350fa582df257563f507f06d8a6a0f1898dc63716a13f", - "bcf18d1899b037ee360b56c311ae63fec712849bb159f54358c4638b3d010fc8", - "614cbf1ee70d9cec4a790540c5d249da5d71919314a5b2b9c96c9e529fbf3252", - "047ca148b9cad7c95ea9c4c3f678756f07cd4a1fdf3d25a490e99736e5d4e035", - "020d773d8a0da1f53be6c634af2112cdf16e53d979756961a889b643f4be8f55", - "2a769e66e18fcf6389da61fb3b2a40dd722cd238bfd1449d6bab0c7cbb723cd8", - "8317c08109d4f4c588a6caac24eb062f27818f5726a69da5abb9863b3c76847d", - "78c2d0516b37e678423b02980c2b3220a907069572d92392255cae0704a6a98b", - "6db8a508a85a2822791675002a574c512d9371a788b9f70c0bf778365a2e30a3", - "18e5ae73ce6b24d96fd1cbdd31d78363af0bec8364a3f8f26405aa947c97d3fd", - "fe5798e39726a2d567ba523a0aa0274d5bd4b08103b7c246567e156b719f28e1", - "b7bcf4fe8bc79460a98aeee224cce01ef4af7c1702e6ff68b0853ccd0eb2130a", - "fb5f24684d791ea418d904b235d04673f1f6e1c02a6f0e55e1ce5deaa234463c", - "ed912933dedbf0d349efb51f906178cff2389cbb92c54ae4e97ea5ff40a4325c", - "2bebb673145d29f3c65824aa253785b91649dc071c461affaa6e26ed06d1d44c", - "3af0d82ca65255d321f69bdc773db74d0f5ed5a118e88fd4fedd693f8173dfcc", - "a2ccb6dfdb4cfa1363ca0ca6df571404127178adb667d437cc69d85cc3978426", - "96f35dc0be07285e4cfb9bdfd07486b262c9fbe6715eee8fcaa9f5d848e966d4", - "69da6f55167741c2a9d58ce7cd68db645a2cc4f47ae994451b1b1dfdaae161a2", - "92737379bab2327fc064f985be5fefef4bd384839849dc242f3fa66090778720", - "1c60d57e686bc4715e64c992feeecefc73c366253aee2487666d18419b3f0676", - "0900e32099817bae75f572199554835c7675b982bfe68abf4c6cd514f45a5d18", - "83d81c19bca867d8fde2685105355eb6be38526ab7651be3a573f0ee8bfedddb", - "2a884ec7cbd3b842220b0eaea9fcd9842e3590fddc50ebf850bafc0d1a45388b", - "39b9c458349ae5f0c9250c67923f24efd2f7fe6114431bd96cdbe649a2de768f", - "228dbf72287423ed124662103477bd66932e0dc54b47f9f30450d6519bee33d2", - "6c3707155dfd11cd180721d2aa3c330fc3c208a20458e3c5c9981a4d896b0114", - "c62e6966eb849f952186824aa78c55fad854280620d1aded1024976f42871e5a", - "5b4a4ebe90edec32db58b931fde99b37ec088547ac82a1409cb8d6f257ac871e", - "869867e452a9c936eab715e085443ee85bde62287e96a21455c6e10cdb0fde25", - "d87077411f779a3a1349ea7a72fcb34a3314591d9df45b61cc9891e1bdf8e977", - "302666bfae018bc840a0d6abe71f22c1eea95605c04105aa276799c570ba2790", - "e54f820d44eb16323472d35b9c1c66227bdfc8ad4554f1991fae575f5e35157d", - "41adb16dc274007c753b5eb626d82dc9eb3c4419a8103acc467596261e0cd1eb", - "69acf019b5c4ada5dbc2f0b40bb2ba888dd8bc8f69fd4345698622aba1110201", - "c978ecc3a39fe5fd81a91f7f3e7d3504aba8fc39e999fd0a55690f9a10d9191b", - "43039522c02dd99aaa21b0ba383e9be3dac746daffbdd4a4457b911e1211e288", - "84e21acaf672196d9e3d77a2b72aa6253d19e7b21333560ddf6c7b36e363f5e9", - "c0fbd019b3898309ed62553a0acefe3288ca612c67e1ecff9c37917d83415eac", - "1755065bc82861322d23f1bf7690e44a9b06c77c02ee9f23c34d5e660de3b61f", - "a808f9e4c8f40cfbf881f1d598545471af66f2f4d060d83068932a70c988427e", - "88b5c7d186dfb94b6f01cd0dbb5b20520e308b5432f220bd826aa11151bffd1f", - "dee19a3d792bb99120f5cc325eefe8118e972a9f54d4a7d4878fb26cc6237f34", - "dab94bc48805d4300eafcf57cac90bb7fb3394b770bcf6cd7a671b2f1eaf4924", - "3f720f4f6569d4578a2083f6cad5627aeca511d11b7d527ca47216c392d96bb9", - "4961e64b7619d8d929ff4329a86702728465372349c94da56cdd18db6aba1926", - "d228696cbc9fb342d2f38205402bcd5e4e3eb8ef727825942a7d37a4dbb2b4d6", - "dad69252fde942c4f969a65fd65c191414734beff3ad0d3c8eed2d068f71e24e", - "0b1fc648002c4a34d4f615fbdb3c2fb9379bab7f6f8aa4e709f188a292192022", - "17c89c5d4ea720b71be83b763b64a90dd8ee481a8d4619d2e905c925fc667800", - "60ac998e7e6500c8710190c9ba073ff9e1e3f5f618830b913cb6fd4e0fd41d3e", - "a4e99559c971a8eb1031c006e8482f276e42ba416a32750dd3e7a4b81eceb648", - "b175557b81c208c4632b8f3efbe0751901d5d830ccf5317f956551cb60fa8c9b", - "acca7481a5899ae8419c122c0d63af3f413b65c803d56c479258fb085d07b318", - "2b1904df54aa4c5b82c877bd82a287cce0c2481b011881b709c106d9d653fe2e", - "f8b37f87aab66364c80ee690a3fdcfbac4a8e9163943a94605b3bba3caaffd01", - "7f6f3e8577049a100fdf28e60dc45492268a5b539e39a0e6fbaaf65fb4ab9665", - "c21626a9145336dd4bf7d1aa33a5b2c699bdb79f1e0cae2b88e78d8eddbd57a6", - "93f2a8f3913a70d6150e02aee7b551d1128e54fc2dc8e9b69c7a94457642848a", - "2521840ee28e886f54069f568ef0738cf232273a4f242fa50e56e79208085491", - "e1c2985be22c3062c80ca355d5abbbd56d2f750d27d52b2ab9a27d263b55a6c8", - "b3673f62147c1e9cdc30ad1c4b0915b964123d139cced1cf2e89c497fdb91d4a", - "8ae92fd18c3182596a8884f7f96b4a844180bd0691f281843b1915afe3dcaf0f", - "9502d8ce6fc28c42d122107e64ca47a17b9fcaaf3963f7038ca5747efb32d2cb", - "780a737f15990ea1b75710e82475a10a210e404c8ea179433a8794e134b61132", - "fd2ad3f8afdcacc409683d75779bc0862fcda3f4368679a933707e7912ffc47f", - "5ea86c1b0c6a610e041af4be1098ad7b20a2cc7a9b3ea5ae8c01ca337916cbb3", - "1caf255a014a7916d129d3e17b32b1876084d5a6ba7a3303839b673869915a25", - "9e7464d09aa5b2560977fef9f76b5da13bc26b8d2c90caa48678de2f457500d2", - "a70ad730db6131f553f4671aa56c334cc1f8dc1edbb2cbcd2b07a2b8ec7d9f40", - "552c5159a5d527ccccf28f534163a5c27d46a393a0619b51e3c68ceb3120fc72", - "f7e28cd3e3ad76363bbfb5f0316295089bf11052d4764bfc0b27ee8bd5f394a0", - "33463a0ef3ebf5693686f1a9225ccc6ace52c8d64f655e356269344f9fcc924d", - "ea33adc3f20e6a26d7d12dcaf70d748889f6bf16d9ad233e8bc899f25e1b08a9", - "c675cf2e475d19bfac6f0b5ff0895f2dae00beee632c89a1e29c87a2282d4b54", - "278dfb6c3381787700a1b0afb875a0034be0cb62d9cfffedcef5bcdb961577f0", - "e7faee298bf25bc921ad61e675e5420d016eb87292508bad44d8d65838ef8b65", - "f61d5addd3589aa695687eafeb3952ffd9f6862c75f7bea3d4b0951ec84a0b02", - "b155b6d48016fa44c2e74278b689af6cc41bbb2da2afc933f3eff6f83e0d2898", - "d44d7eb1e789c0bf9f059f116654ed860ce36b4ac234cca3065f1aee48223f58", - "7189721a3c4d1865f8fe12ced973184c8a6d847d4de19fe82787a7434e188c2d", - "26fcef516ca7ba8b25fd1011b4ac6a473bcc8a843dfd5591fc423f49f7773b77", - "16a4ba461f10797f0065c3e01c351dc19ae91a3c982f02432e8b8953848d3f85", - "4afb406103c755a92987008431c079c36eb04c1e2a29df0203debd99c9d1fa5a", - "68d98c6d58317005f2fa31c6953e389269eb6c25def9061851053ce286aa581e", - "e89bf1890edddcdbba895c5462b39750b2e72ba8e0fe9b1393accd09aeeb6985", - "5a494215368e76244c6c1ad0a239488f3b158949ce7141c777b686b89ad5f70f", - "3e15d86e58aa4c619f10b25707195b1ee08915ba43cb71aa89aae82df456d863", - "6e0b1e9e461e0c30d319d0770077c46c40ad491eef0324019a143add65874eea", - "f592133b565dab0442133adfff37a2a598e507c3766fcd809d4c9907cb0c3338", - "2db80d0a9a7419bc020ea1e18a1c8b6e5c4024fe1c36663f46719da4637cb7f7", - "04a7d46cf90eb9b7fa1d7d82aa04e5d0d9d9f1bbe95f0eeece2f0c8d99ee1c7e", - "7189c1420f1b9e74a4a9ab1099b88a2a3150effb9985362784c543337b122652", - "45b1df8f70ff7a25cb6c60da39e1194bca4bd4842950e36b3692b3d6c9b1364a", - "3f66e0974219bf9db547cb3285331d43c5dd0218aa8ee818a1fdbd2904dcb7d7", - "8c04249b05313815784240681289562d4623d866b603778cdec6f33913731f6b", - "b7e384a37a6202b1d1476b4a1a841a7991fa522489a6662c6399708421cb566a", - "a89da40f0ee89e4162bc05386e287fe60288e14194973449a6ee0d48521667d7", - "2c1fcc58e7b47bd9e1f4d29bebb9f5ebda506e91d97448b18affcc62fb4f91bb", - "faf73acb9b62f7253377bb92d3d2a40e4caeefece38da246429fcfc9b0bcfc64", - "075b0ddffbf56f392d11cd245144985a50ae020739259e3a4502423a7320fb9c", - "c2c4fee2c165f889b74317d00b546378072493b04c45a1eb5b081bbb2bebf578", - "501d749f996c185f7957b5c8823e39e6c207a233fadf0eef3cb7dc378c539e3d", - "d06432821dbfe4ac9fc59f82b93a69fc9d6d9106c62071022387f53103246f25", - "837e15861ea01b86ae7210f10a3b48a0d3d6713d308028f81217e99f0019a8d8", - "378bd7790b4263cf526dcd22af0f84409c99b4eb98e13aa26dada8af723b0fb3", - "120976f05ba828aacba98cbda7eb665858b33fbf151028ae91065b1e97022657", - "5d7742f294f5be7f3662267cc6f0e58be1a56816541b6c9119b1d2a33f740238", - "5157b43e88ca443fecf4e0f259aa44a2bd557dd9eb795164d0a9f0cc9d1c8d4c", - "115b6d60574c88ac4ad3fb5d96c3817db6a1c6accbfd5c92f5f5ecd5b411a29e", - "dd40094fc0dbd1cf0d87d7cc2e2e4c5e6bbba3243757e92ac5346423445157dc", - "7ce1d5a80e03693168c9bc88e4fe93bdd3426344fe9a4df209d6b3d93c39c0b2", - "39f8e1ab903a22c5c6188ce932a8cdfe38e6797274b2a7232e0816deb8ba6143", - "5ff9773434ec84a5f0f473a33dfdb4c507f7c18c6122117b55eec955866eaddb", - "2b4ef9bb0a6e1900c57b890d616774568724f1bb41b0563f6c527d47e5b2904e", - "2b2d783d717292ed5e3f5b820a994133ad58ae7040d6719232c991335f10bd60", - "4e29db5fd0db520978e6ffbc8e97a2aeb5379bbc6aaff757c70c7a8d4fec1a85", - "42324595d2196f2b4f7b9241b612a7764bdb05f2debdcfce88b0126f480ef625", - "9c7168f9dcb3d4da6323381156409ecbccf3560edc8aa7a88b8f377a31485bfc", - "6046334447e44d895a6cc8158b4243696751bb9ada4fbbc6de04b97d4609028a", - "4f90ca4971e9c2ed73584738cb89aaeb7c60efd38b7cfc464acb1c501763dfb9", - "483b273cc695741f00a91a194a21854971ed36a2b7a391036b8abe59b7d73a1f", - "7289edb5a15014eb1ce4b0a695045e116ab76d87a465869955de1c3bfd8cb665", - "cd7f1237cafc3e9a780fa0beada254a26a8e3d4a9a629b0ac4f35a923fac4f05", - "e59250c7afc1fb2d5764950b7c36db653b73fbe5474211a227b58ae0adf3dd1a", - "d3679baed6a5feadee18b41bc9c00d0e77905ecd3a8c132f0badd4bf872d8ac4", - "96de8d5f365803a841d94352adbc5a8fb6fa1ead6ad4bdf1f04f29ec43b9c2e5", - "cc90d8e5fdacd1e8d9a453bcf16636d5aeac3068fe83750541237d23875515bd", - "7f72b420bad65486ee76aa8538429fd5adb9aaa75235055bbdce677e286e33e4", - "d4f085eaffd21119ba7a6bf09b36de9e2084cc6643eea29eb7943c6743d19152", - "305d9f2e5cc96afb9bb8dd0647692a119fdda3f9415614a9fa08ae33724481ab", - "913398098c5e5fe30acc951f6981c973a9c27adc4679c771105d5ad5b49ea1be", - "aaddd81e5b7769e5a013b6ba2cfb0c0bfb7d6c19fa38566fd08ea22cc2438165", - "2a4f7ade7f6791da8a6c591aa44b311edaa8f6123f9ca11f7e2511f2873b9737", - "3609ff024113637326dd08ec87d0677879d19a8a41ea8fc70e0b6f6be54fba3e", - "754a0f73a290a9a4b59cb28babd54e1a129bb4d7b1383fcbcba8a17fe9f4d44e", - "7f4547f160f0ae6ead99aef968fd041b42811a8a0ae2a2fb1ef5a592c228edc3", - "7ae90fd4361593b72c9854edbb2b1ab5f23a125d045d0ad2150fe952dcbd429b", - "f933587c23f2c92de27d88a4e45f1c05ece43d801ca7e208d79b3ab0b0d745cd", - "4af61ea3f8e52fbd72a6d6c8e9d4a6d2ac18b6d57f8fb6e57df2fb69d5f33a9b", - "26729eebfdf223c51d0de81fc02609bf7c53714e086094053935054bacbe20ac", - "a330b37170b5c0a0caa944de828ac669fdc20f3a5d82a5adffa434f6c2d416f8", - "cac73058c92fb629955ef501d176d78f89b6c52317883d5328df1f1aa2fadfa8", - "30b80549a663666ebd51b6fcd4f03ffbc6027cafbb7c7e75aeeb844414113a16", - "103dc98f2044997c1a82ccff35ace9ad5580392e003396fc646cf25a70b3c9e6", - "d7dd2bdf6a8d721227934a12d697b73b3363c12e9826e7cc157401c46d5933e4", - "3732d483776d392d0907d4961c59901ba1a0fce9dedb90cd3ddcc1007d639da9", - "13fe175bd6b3cc8a82f66d5789f727c0d6915d475c3965e1097744dbed05bb57", - "132478e8dd7f7afb142ca8b16c95577e08c6daddc0d74fcdd4fb30f6b16d74ca", - "c65937d9c19dad1cc4b10f4965a5d360982d8ddcad8bfc072f7049b87b7ecc70", - "79f67a22e227f9da6f2a31b5d107d5891c27cea981055826312a2275fef143b2", - "4cbe2f87c9234fa84424aca32865544bdce20638c60d17786e4fb2d01346f846", - "3b257b5d87b0203abdc1c122f21eb0899778cf760d3e0b7470b971c1cf953491", - "2b67ce8152915e607ad492c59c12131ddd39c46d322aa086b5505f519d708e49", - "11cb143ee98c33d55a87e82e1642aff442aa94fea2f73031737c56b5bbb3d6eb", - "b0b5013f16ee523691827f0133e587af842b9af927af53916c462d50c99e1fb7", - "86af9778ed467fd176e0ca344b78870ec04e5a6493e10780d5a4940a14fb4a7e", - "6805afe0546859fb9de3c88493bb63d543455aab272a79e6e6d60ccbbc8e336b", - "91afbd0f541a7380a75e37e767aee82f09311435b6c2c0ec6d1e2b580b55ea76", - "d57b23faf5219c24581787d719ebfccd903682346e4cd0fec48a3693523ae7a6", - "d50e3acf2b1b5a773fd83b7d3623d1634961638577bf6b3d74e45e6b75abe5fd", - "b4e93907c97eca037013574646b9ecbb9ca6d87f8de3391752e44f5e486c3a2e", - "e9ae35966f54009443260ac596fe7fef5ea30f7863ebfbd8c246af71c111fd66", - "8e378d45900f59cd16790e88d0028a0845439327a5f0dea5463d67d1fac3e1bf", - "a0f7ab94220a0b2a6620fb9e238db79449c66f4e08bdf6a5ede14f3dda4742bd", - "0b53f4e81250f9658594ca50aff830fed248d7cd2fb9c48ad182e219395bf24a", - "ebeadd61cf3c4de70531a958831f16014c2db272924e10c033a762791ea0ecb7", - "cd8d40194773f5b0337535aff7e1fbeb20eaf84cbf4df19480c1112250990af6", - "708c7a23a32f9ca5312402905391817292b24fb7235e807d9339b499a7bfe799", - "018c60e07ccf426df771c7361ca8c240738533630d5fa1bd91c6ce24de9dcdbb", - "21b080e614dff91f42a7d86a67254e60b15cbcc61de3ba6159305362658ebc21", - "450e8810386fcae072b509d87c699d223e85d349c56885305d5cad66063e8ac2", - "84a82a4579ee07abeeec3147ae7c0b13068ac7f982250b5dc2c90411d83f20bb", - "cb1db1f9748264d52aca3b1247f899c839e7bad06d3823a578f3008fb7f0d648", - "8a277a8724e22fdb34d683a1985a9ade69e1c90fc046de4f327e5a03e4a61f4c", - "067189feeddc5aa8d1e9894d0689173f61260b25676e3e7eb6e23928a9ac5c40", - "b72380e9b77bf15f47889de5298bb320e038b46f78baef08fbb2ee57a0762d4d", - "5fb68012846f0db1d27ae0075e0d3ae1cbada2cbd818128e2686f8305d4e19b1", - "a2c70a0113f08bc36fbaf56cce3c75176116a617c2c6161fde8afa7584bd5c49", - "779ca8cde6373cc6d6fc967e2032aac67928abd5beea7f7f655bf7aa25635b48", - "ff8e868ab4cda14ae7adc1f2fb11a26c867c158ed298058cb338e7f2dfcc61cf", - "8eee4af8843fe6c333ec78b8f93e108f660bbd141ebc04e517bfe7e350885713", - "32024485702b66e23c5b8e169364ea821aca42548cbdd54920278c92af267e1f", - "aae7fdfbf2e23629632240a2ccee974d5d05753f90dd4e075281ae3d78f750ec", - "324d8666bdc7a26621cfe0e351ba9bed3ae611b0de4e0da039d5246854250f86", - "14787ab4366aa29a09d6ad5f4a97a4cd410b3480b5e01fda812c47538f08d907", - "933fc50b0015d6977ea115be15350b984e4986731eb5e6aa4ef06b2f2088dac4", - "8fdd6c05a685d01788fe880c153e68245e528d0a3b9b594acb849bb193687a7f", - "d903bdd93bff9b92f0d06af75ec82f98cbdd5afb64ff78ef7a5c9ac3cf01e781", - "89fd2c88b619fdd3cb607a59790218121a9a72d81af3fad76ce0482d00a8ce59", - "3fcf2d977ed79a8445fda5753a4e2f8071ba8d802ae5c201489db5bd23248f05", - "078c308bb30ee29c3f19762f701a365d464e04156dffdb774cd3fb6d6b9699f1", - "1c104edb3ff729006984e1a2109cff5bfa82d0cddf5cd0fcb1dcf936c507eafd", - "8d6ec64f59d35dc2d32cd918eec94ee35b9a3ff025be2117665b577dfe7fe514", - "6bece667de5324177a029bbaabf13e5efbe4689417d92fc960ec6009f1407a34", - "6f5c5e87f836692af2bbec6872abb943e1629505a83f9fd62472d142dc9886fd", - "05e6d74447b1e716e3f4e9cea66c61e5ce93cf6464990e0fc359698309f24d23", - "5664121aa506d01c77e8d10ff37d82ca54fb2035474c6d12b0b75dfb2f56bacf", - "0fee0d444c69488b7603a7a69644587133d969a38fcc22bace991101dfa7ce17", - "c70598e6b310cef24970f0f1c3ce7539e6db2198552b0db99c0a913da8506c24", - "8b2b4e3126038e13aa28ed564cb0159739fafa7d78974d4be4d5f61c7f0fdbd2", - "e203ab5afd0cce946dece4e03127e3003d8a32db7d8002ff7cf2777b651a04d6", - "21a69e920eafe6ef611ef5c36ae82d523f87099bfcd27d98f3a5b902cd7f4efe", - "477181e6cd6ce04adaa14fae21dfc93c825676f38bf931972fd6c92c5846498c", - "323428bc7ee866d818ce802d7cf6430ff18f9200007101419a8126b4f5d01ffd", - "34b704751da320fec4981b949f6b67d7fb3f7811fa8ae8116aa4ffeb2ea9cc6c", - "7fbee81923a366449d5e5de6c2489a1898c698daad679d55fd81e1008a727bf8", - "03c2cb55a995fecf45facef9f7a0dd1c6eabc65fdc4a804cef99d938008f14bb", - "252663cc858634158a64f4fca3e8c953eca590a4cd1df64f6a254a5e5b1cedbe", - "e9afbc0cc4b81fe9d8df5e2e75b39cd19db45aa3ec3165da838bc0f13bfa626f", - "92c2c58c34085104166315e6f3e58cc6e0c74daf95dd553dd183a6d101ea83a9", - "4c5c79116e2fc33d7c5c962ace30f3d0f41f569cb920d4135a006aad7242dbd3", - "7e5abd873e2f4c9792108aab4a4729c02032c5e557a7b8448d09adf301008c77", - "d1db31bc24200ede87949ae7c989700e3adbea7253236af97558ad07c9e1f04e", - "314560296c52ef0798f12d264234cdc8f08ba39cbd83dac5d4da84f333c1fa65", - "9802a67f6222e75407842d7d9d0628c40841306036a4e5fec79c1668c733f508", - "c90abe80cfb6bc732deaf002bc8a441ff9ab55a488bd0606c035074bbe3c8e36", - "0a43349f92982b1f5d2f256c3ab164de8a93b40c67e8012db9779af3f2a387b1", - "7d822d04cdb882273fa13f48b0a3cac225c760710821ac0f52cf62e4a2a6ffe7", - "b65106c7f5567d2d054abe741fbf6949343e25516af32c925708183b6750630c", - "b0c9f336a95335ba6803e19d89328c27007f5c39046388588930861b8dbc4605", - "38da9c587e6bd3e2ea45b7107d6afd073c3ef5859db08fdb24b584ea200e71ec", - "b0e4a00f360a19dc1e45f03b1308d787588cd9444c4cdbeef34351b1dbf97a10", - "bb6b3e0fc42278b817f7444ac15432affaba3784569ac02aa30a444e09a15902", - "a6e10b2b10aec3cc9b67e0c2ffc486c23ab96844b69a8649bd3255f7aa1b956f", - "36b3b06c60b37663684a7630fbb94ac2a5aee2c4ffa434012303c46bc159b11d", - "c14702c982f27d44beb3fe9617437dc2883b4c8efe0e7fb80b14d2f773f0e33c", - "b7bf3bc6ca43737c3605b0f6d4774c1934c1c50020529af9f4096797f5e46ea3", - "51a0986952c5905409a6f04d4793b4e6876d2f04220c1168144601de90133aa3", - "c898df8df43057f4385165d4fa05e136e3dd6e2a362cfbdefc4b55ebbe600478", - "f21bb91ec875428c9e2208558d90e87444da7b2a08626532e870d6393d36ed2d", - "e26ecbf425d9a2cae59d80e8f0a9db5a3a9bca7d782d6013a8995faad01c3cc9", - "027c2be66ca78beecc99e2bb77672a4944cb5249bad7c2724226983adb27f63c", - "3aa9e88cf0853baaf01787b73297820881a6cb81a0be24cc7f00198c3ca0ca3c", - "0ecec646e6fd44e818194cc99a7e4d8e489e7374861e82070e347b9c1c533e6e", - "86b6403017905af236bba77af133d8f1a6763d641044d279330a0afe88d40e1e", - "5849ca4d8b4a307ff67383c4b70896280c5a2108b335b2a005057d0f105aaf31", - "241e5220fb238ac89dbf0f7dc5d8cb109c9ef56c9a4c1360d164087deadc493e", - "38c002e125febaa5dd0a441efd2eebbb6ae63ba3e3cfb1554092159ad57d9853", - "edaa79e62bf3ae93a8a5a705d26d57c124d14c4e3e1b427c1fa115257fd0f0d2", - "13edcfe77562b8d1ab6b43cbee76b1d7f08a00a5ae2c9cefe7f9df5d45537e40", - "97fa62e9fb5e05583844ee306c1c0e5fd76d80fde1ad270bb19c160faad6e569", - "ab776933b3d90a7dd3a45d07553cdfd960956694e0f3daeb6c3554a02b33a7a4", - "987e3a8170eddbeec90b67ab2a5b6ca5f886f55ed7102618a1256b1b5679aee6", - "537ef2148150033a23e636babccc1fb0f03cc2e0a28c65a27f6f6540c6471e8e", - "5eb1820020bb1d3bb2a4ab9b1df8bd216cf79f4f0710242b609fbe968cff8319", - "eaeb138b621336d7b6b556222d9f2b7ada72af7d6272cf990036df427b60ddf5", - "d704257614639f51df39a765807917b71f1753fc74404bf087e2e73f2ce540e0", - "b3e5f4ae7903266cae658501533e6245a68137136fabd3a912f035184fd41df2", - "41f4560863395530e417a0d35316230a94bb8f64556c8463779d2bdcfee0d290", - "06f1208f48f22fe682951688ab265530eeb217bb6ab6ae03b94768a58dc7213f", - "da5cd0c69c26121c414110219b012c2c1af5c030c0b5e3a88f3753f9c165248e", - "28eed35d7c938760b93363a34eccf10ea81e21fd3c1b46cc5329d94d65f55ccb", - "515e2b025e59454ac5a31abf07169367a764a521ac4d805c5f9d715019d6fe2d", - "42934efbaf09f6fc6663114b037dc6c711c9501f7733996add4a052065b95118", - "8613910e3a9ff6c9b1a9ef735c6a95f53391f698072825305b4c47fa1b7f35db", - "32e0750e31a8349ff168190a10e9f996fdce122ca6c40ffd848b0dc3de4b6c01", - "5bb58fbf66f1be99b8264380e5fb3382cf688b2ffa1ba350467cb848f2d41553", - "dfe56c39229b58d4f7050ddc3f0b29f69878029e73ce4c56600f9210057113c2", - "23745abeb0bfe70ff34b9f6f0191324745983d0882677537978c2f8f33bc860e", - "52047089d0b27b7bf65b95c58479711362f667c52d08c6b6299e880163b57305", - "91ca93bc6ae85bdcb8dd0e55f99d5ef41d9c95a15ebfb7a2f424ccf480b61d7d", - "f82723ca60a82deee82f927843a335db03a5815b8f87707fada8606499555e91", - "0a6e172232d5ecf3eca4595435289407282dfc8dbcfa89d09f2413da04fe79fa", - "a5f5b5eb3c768785c8eab18bf8d95b52a2a20a0bcf4722a2aad716e3ad21ca21", - "a418ad95ed65072065fe49fe4601607a73239c617cdff3e4fea5954336650e04", - "27cc11aea23017444a3b5c0a5e9b9b6a3d92012f45ddb8afe25f0b6f56be9ee6", - "64057b9623298cf5fa8121488298a5c0712ec91403c9b79492abbc19f765f627", - "d0ff52cd4ad386cc5cbbe534c3c521634184ad49d0e13a0dc392b936b855e835", - "139d02d7583444409c1b507ebd862f2d9f67ad2b7ad0814ea6c8edf4ed9aaa0a", - "af38c4b6b885b94e11bbe776ca8f2b8e329fcef12e97c251b157c0d952d1293a", - "0ca1624be4617fa416e401c381d4b0d2b4c00dd1902a0bb7aea8c7df237fbec6", - "eb194c1e0cc27e895e98387c6df41eaf4fbb5c12ce10e580afbba5617ba17c4b", - "1f9feba887abde205e762d1ded96419da27b8ac58ffbc274aa07a1712079ab13", - "5e4aac80c192d001c4504771a3bd0845e9b3720c9b3a453e05cf1de4d6bdf87b", - "64fc6219ae61083fd87d266b73fe989b2f7e1b8c27ea2b0a90f02de561b7a463", - "0e30dc221c75325e7462f67bd30b5562f1f1ab410316434d15717837c88f88d9", - "1c7524c4df86967cb7195edc1f5eb405eb4ad528bb3e16fd06a0b2255fac0d60", - "08f2c284705cee712bf0300766a2057f208f503d2d403c4678ab684e8fbf7c6a", - "f914e0541d6a7d637456676f79c83c2a418c5aad9ffcb2f355405cc511bb8c0f", - "0990beda5040d66a2c6786210145c20f069c6cd1f9c867c83de0b1f147cbf1d2", - "059f8abfd6668dabd7bec1d65df8fadef8392d9d9d5820fdf199dc2ed8ef92cb", - "91dd9d998d9f620b70f858bb466f05a3439bef43c57a0ccaec51f85271da955a", - "74135d968a9296c78e8ca5914dd59866fb66a29f8c920f28ee33722a925cc6b4", - "8d57d4e67b2cf4fea1a444370fef98c4229e85e54a73d93fb301450acb9a4b11", - "050ca1ac8800ade81a1da9cacdd3216e156e548b64c2f3dfac28a0fdba0701a6", - "e9e5c431ce59644791927034b2eae3a4bfed7bb662cdadc6cec142fc4baec51f", - "e05abb87ba98bab1a6422ddcc8ead5e1c1afaf3cb300361d31f068c3e5d59992", - "3d17aa48a99e01e1596d4ce0a19973eb477519bdc5138872a4e90319a87c7dbc", - "8547218ec32d68a6303c1c507c89f5332b311ca90ddeb74328d10b95530dd3e7", - "1105d755c1e113ba22e2f7076515d97c1beedaceb54f06fd125983658dd3fc1d", - "67100892ccb79327b09acd6f7b81e1ac33f41bdae3c6b59fbe567b85cf640fec", - "3b162a59a30ea727359d028902bf88d9a4bd3de42a38c0928283cf28aad43d99", - "a3c93fede1ba8b878edf0c391fc181f04fdebd3407f290faa3b49caca2585f40", - "1174cd53bdba653681663573347efcbe414cb6e91cfabffcc807ffe6103daa75", - "4452350fd6a7deb9eddded8e86220e466457fc89cea64452e53173609a7764ab", - "51718775f8368edbc122b2fc18e698a6b67804c78e3a769ea056160db8002c30", - "1b46fd01e85d70c71b6e9c789e431656b661f77be02662853e80f898d90bfaf1", - "43bd187ef2c87eb3dc72d518b3667efb06f4fc9ebd18fb0be69dc93a38f7c589", - "569fd809b4531b72bc53d89bb0ebd5fedffab5b127980f93f57d8cffc96d42a8", - "22df7d8a04c823bd090618eb41b9c2893691ff1c8e9dbb0b9cdaef0411f52f98", - "e28b64cbb01fe57c629eaa04fd4ff475d6f587709e463f18bae41e6776d51587", - "0da820d73b4501e3c2a843ae78e433c8a561106bd562d205264ed3cede0f1820", - "1b1332db4bae791462e46881be7ea7dc7a6ec40d33b19e6d4e4c20e40875b9e0", - "c5b635de117d0fc26b4f541c15c4054178db43fda4cd073bc1f4b6ead34c4921", - "28da63b5e0aa10a38e6641bdc8a5a5bbb9903ac238d18ec7c7013eee3c97edc4", - "84f962b11f2964487a1d32b4f502a5e003864125910cb72c51f2379b431c3f99", - "302122c51c8fd44b117c1dabcf087bff6bd21b6962d2715db15b4466131a7d60", - "2a4fcc052a71eb8cda83ecdb1e71dacd78550108e47025474e17e9c92a277223", - "a12a18f2a84d1b9887c63931f38fcb4dcf6d8edbfd5c9ead23ff1a8536852a71", - "2e1f0b8d946b8adfd4521e3530165b2ef52f7e33fa4edce273950f35775b1cc4", - "b3d02ebdc7f3a56beb8ddc69f9a68736040e5b263b7281df8de28263015b88fa", - "19fcf199e70bcb893323b34a94e770f8c44bc6ec182a0b2607d342ad2c34a247", - "65d2b1a8ab154f0da7d37a98240f1efffd238f2f4a003fc5ac40df1ea0b81741", - "2997cbd63a3afdcad5c61a9a29aca84cd3118c8f78dad84fd0174482075b7ba4", - "c0be80288ea733075a61c11f712de0bf1536b335098541b8139354509acd2d82", - "997e289d6f907c6b0d7ba0ef2cb29d81c601a7435586fae884282608e3cde095", - "d31dfa5cdad4418aab6471315ead1501087739d92494aae2d76997f3f2cfe212", - "85062f760dc2ef5099cbc88aa28bd4cb3ad62255c79b5951df599b7a6165aa9a", - "7d7f0f9a26f0419fa193a7cdc36245c02a82d70de3baa30e7800cc17305baace", - "a06f0dbd6bdcc17c2a65c21b00779a32a4c0d201bf751eb8b886fe9da399e340", - "2df16a5935909d024a4e32d982def84928b88b223ceb3a32190cf682ec912d9e", - "f240420d4efb7bfe98b773ffa997a3dd1cd7b8b5203b85da1a2392d1ce353181", - "db85286609256b8b25d040c292dcc63436848c74cc92f44b99ea7977eecc80b3", - "841c47fd7fb2b4c89fc46c0921e2cd653df76583969ee66595c7718aa8e4c69a", - "67b6f82a04ebdae2d44f89b752f088b12a08f9468d7327ca617ba7bebe1c389a", - "3a8712025c72cd4dae0a6188152aa82fd7189c912d030a5018f2bc505d9a4878", - "9cec921fb4a4cd7a510e460e82cf6651688c63a25a936be87e12b958053714a2", - "8523631b6cdfffc48f72f4cbc6bba82913bb10eabd6c289cd55f9765bb7a0c07", - "e062f205614a24074aadb08f8df434ecaa72dc72e9bfc2e994bf419738e27585", - "4c872e4ce8563083f3a021949742e9b7f2488aba4aed52a728f7589d178a7aab", - "14a383efabc4c55644cc73d642951381759c89bf7267ca0ba4523f990fb05aaf", - "634105e890034253c65039f96457ddef4eeffe0de340c2a45ea80f2efcf54d2a", - "1b03b4760bb0cad4c8cdcef2a249863b9014de85c592c0f0bc0256ced0c74dc2", - "c3850a9abfe51cd97821eb148070435ad9a6bd817f89601e079650e4c97b8b9b", - "49a86fbe80fdb2541c1d43d22057e2187257d2a99f3f54b873f242b2492b0ecd", - "72b83dc7a9f1733b67b4803e70716733d6f0fe45a56a5c31958e6763a910fce7", - "a52e064d9be2bbb96f3f86a5383210fa2b74ce564b4748b87cec97629318c452", - "89bab73cd19353ff53417acf81a942f77d3f6a8c54c6a984d5ff90b3bdfb74cb", - "88203ea1515c0a07413bf0615c648b952b92e2c25bb326619343597b5a841130", - "bb05f4f09f860b145e0f917b7faf7f429a5385038697fd1364c2e1567bf3c80d", - "8a7e707911a2d95e2106aa45ed9ea7b8a144538a6e8d7502f5512b665d2be2e8", - "6994b8ea1e8c15cc342cce189eb8f0db407eedb495beee847efccfa0a9b5413a", - "4e397ede1293e733927feae0421a0f49fcfc30676e6ee0ba975ed7d1866a8713", - "682dbd75a81060b900eab8b292171bde0e51c2558fa9e33455e6cdf9e365519e", - "030df79d0e2e518963dde4c2241d1e36694b9d1464725b40fe839ef1ed7227cb", - "f704fcf57ecc57d062eaf91d8e0e4c300bc8eac8c3ec409674466783e224fda3", - "10991d6d90d507b30594052000d9536ec3469f945653cba7e1bd84921bec37c5", - "83c268ad388d506f19f39ce66c86b8af775b453c4208472c027144d62abbecf0", - "f1aec452c62d0f91d8db23f7c062dbf963d66216f6fef70ddce0da83dd588b76", - "59b3dd780dca47bed09afd3918d761cb3d6f2c8bb8df63c0bbd3e005b7a3605b", - "ba77daaaf214857b39e364e82c82423aef9d5c9ec2a86af8f3e2fc1af7aef88f", - "c718dd63f79a9c438f5632fc1b854a38faa73b4f01eafd59f519232a415dffcd", - "2e8af0e0e2e775ba279ed720be2bfbc1307fccc67d86dfea8f47eb933d3c0408", - "668181a44260f934862d3c6ddca81d63f9d3f7072006c95540bc8fc89352f543", - "e7e76d8ce2730d2764caee7749a0e65cabea1d372c6a20de567b69ea598bc881", - "0211edbde4c5f512fd176243d10546b492acc2ac813f44ee9cae6d3f824ac921", - "e21145698d73964870bf431432d9f236ac8123d257e6dfe26ddeaa1d27b4e8c5", - "e84f519bc19a62f819b191323ea132047b5d98ebb23e5b27ab5035d33682972e", - "74c77f335f288dac6087075d8d677fbd494ab7e1a408b875b8b163362842a8e6", - "12b4e80f55e84a8810b01b27173789cb9d846e48bc557acba809ecab7e537926", - "4827c35c2d9c1f41181955227acad13c9a83ecf9cfd8fee69caa4c55a6c5d3ff", - "dcc4938fdf83776b4a326f6ca11ddfc6b44d60c0a15b4c3b5f19fce2224737fc", - "df416dce1bac2014a09a6a88375e6e4652b488cc189c1cf276fa7e4afee2903a", - "4d30e83b6a75d22b9a9a8151fd0fb87afd6549bb76d9bced5cc669445fb8cb70", - "16928165159764746b3e150380a7c51586ab96867e7fff33599b410ef86fb4d7", - "1d859c5bf8ff017c1c57b8377ae9589039fd0cca067445a09bce504edba004d8", - "49c7e303cac101a378ddc5d2a4e85b000c62b374d1980992a4ec20cb98f0e1cf", - "4f2da9b49032a432fc00f2406ec936037c01cd3f7b784c46adbfcc80d2cd7df4", - "2163df4178c0a8f0feb22783943fdc0c00c1d8b3fe24792a25e077036430b8d5", - "a37d49cc66def6613794349348ea071d1b129aaee9cabbbfa26b4d0bc67701e3", - "5d816f4e3f16c09ae6c78c42dc55e840dc590bb6d665c54684437657307e328d", - "698265aac36550e5d4c9aa35c236ef3c173acfb9a98455d4d5fe1db69682a845", - "4a607eb0e0b039611f3946836a1f33f4f3d80914943dd4c9f595926b1f8426bf", - "1f0bb942e09653c73b02435901ef28535825960d8821dfd437411c8ea33d1858", - "44f672fe6f26fc389d781a17b55757803ef90551288fbd35a9ac8b2c30f0b411", - "59e8f2fd29f093b0084908e553bbe9af951896279d6399f949bb0fe60ba86af3", - "76320de748049e47f8bdc8e00c68cd357a2d82fe9f718c86be84805ab8e07582", - "4bbb4ad96ab888889ce328bbebdffc8f088e0fda6d25dcbdd214a0fcfd565df1", - "81bc5b636d18dc20122eba4f1d628909d99f9bfe5037b94ce7e9b8d81a09a4cf", - "ab01ef84d61a0545d391b5c09c91ed94ea64561ef4dbb9413205e0148e33556c", - "6926b4b6b5a79e164aedf0804f47fddf1fca08d74d44f05742ab68b85b7597e2", - "cb8b97fd933fc06daf4ccb080fa8a980a068f958c0274130abb823caae745efb", - "4f472f7ed157829f95bbc077c5378bbe9c68a6bfa6665d3144436de428b53652", - "dd6ef3569e1d26b83403464ba8513220a14e803df111f63a945f8f8acf5761d0", - "f840da6734d0c158bfced370b87e79a566ba00e17c8af7291158bae69052a1a3", - "c498e54b7746b88b0cdbfac373b3cc549407d7490a9377492f60b566dc34e27f", - "d9b2f99d2c1df9d014a2761ea2784c1fab93e91ff8261690c02175a0d4b26a3a", - "575ce422b428f48a42be89a005fb75050d97e0134393f75205583e66378bf8b7", - "951f8f39d2eb7561cd0d9eaa8505345233e147692ac0719a7b91956f6fa3d893", - "e8dadbd145fe186decde4a9c02802599272711cc59d9e923bf8b5c5af2b58e74", - "95738997fd18fbd66f20e3e1142554b64c3eb74b9d484617e8e83efde607b677", - "ea332889c84aeedcf0720d3ad19baa2ceea8bfd581f43f29cd578f76ef9cfe02", - "d054a1e8c65d74c8491cef537b509f202b9fa4076784ec1838a9a13c9c60749d", - "ae4328e26a5ec3a344d130e87ba30a738e256b94eb1d9ec78805df9181aa502d", - "a9bce64cf26bf04821698c2e006d7daac2774761b4ccd17e526215d8178923f7", - "f80a46269d5f2b2c81723426b6520ba3b6bf3458603f26d8a8cb494f801a973c", - "3824df437c0d151f40cfb13d685bbd92eac5050860e381af0a9612fdd1ac3b77", - "933656a9bb6ecf661710f82cb96a9c87fd214a998556beb857ec66300a0c1f6d", - "11be894f4ef211b44a17b9b6b48fa04a36cb66a024aa0b13acceb75b85287fbb", - "785520a542a9398a3f29dd2ef07e27bb9e3aaad9bbd9aba1a9befe86b63da338", - "36a717e5c32a128b37a0306a19d06e26ae63dc017241994706f379d670ed0105", - "35f3f315f1dcffec14f456f1a50c95bbb564a387158372169b356bd3ec50c8fa", - "ab0b600b448c32f0783e0e61bf1592aaf7908e426627e861e1c1faae75164d7a", - "fdc31d1ce1df000068c7b4467b13e5fa76d8de91fb56d6e64af1591670f9831e", - "abed32c40c2a236f1cb643935e62a91127560761d664afd57aa917a95410adda", - "5eb65dc21f9148f0c82632df0a9b202f81f2ee3bf80bb378f29a724380bdac8d", - "fba396894ea9ac3bff623f148573f35a6cc0e681cc571e3bf88c61de06c25c47", - "83a7c59e94d73caff2be38f84d6ff1fd5042df84a780913ed8373f0410ee5834", - "cdea08ff937bacbdace410a7d44e207c8096d864df0bad0b54fb9f5ec55dc2e5", - "db623b9dc1db72d8dcf9896dcae15752e059cd6872b889c3254e6b7f053d6530", - "66fa06059375f7fed4d24e425ebb960b5e2ff3adb47094ec0b0ddb2c80a41bb9", - "93b8b07df530afdb67f03855f817fa3441b4711ed3855a5aa0992b9cb8c31c98", - "7b4a9b0544e0b52346905313bb5ce298d1f784f17a33e3f6708fa9441e326b0e", - "71120aaab5f9af0032b6bd364f93f09d2a56f14d23f5f6e23566b74d8b0d4247", - "9e6928e290e25048b3591f8d7c92d5182e99ff4032bedd589f48d0656ce6e8be", - "b1f6bcf5670aa884dab40d5038ebc750fc40e5b9949fc842c889b83a2451ece9", - "91e64a5e110a4943e132108c9d6e78c8e7c01e3770f72c4f170caa7127b84c1f", - "7ea2f199a3cc44ff26774acb1c6b80160146aa32e65b9ca7ee16185c4156750b", - "30edee31a53dce1bfd1ad2f1688650adde1194ccef9c6cd4ac74ea65c0e252ca", - "836c832892bc92f6525b6c3127ed2718290e0f70f3aad5a94b756008183e29bb", - "8b25da847e57d37933965775decc9f68270103e6fdd58608168db949701fa73b", - "d90bf2032cedb2299f4a126e19998ba5f7f248c383b1dd25dc09864fa190a33b", - "e0c80937828fea66a5cdf7c2e06c613b53fbe70c7ef663139cb9a202ead41d92", - "6f415d4482075da9586af96b41ca3f24db962814cff1780d7849aff8afc14daa", - "e39e05af2b193fec9d239637895799edb59ed17fc2a6cefe536b1a48fe057679", - "6ff061ca48e39b11227e14ca69a0ba46567df8b6e90adac4597369f11cff73f5", - "e8db0f2209ad26d9a4ca296f6891be34050bdc31fa78ee57936b1758c14f95a0", - "386b6abab6038ff4d769f775dc01c5acb32426917b695bd55ba8a5c5986729f3", - "cc46c562dbbd300d08e83fda9bc79c3ea031f88b4abae6f8e4a6ff3330e708d9", - "00066efe960d57d7b69402fae9e0cc12a35bb584a24c104aad89cbddbf7cd351", - "efcad5cd113852970c0d0232aff5edf7bd9050ddf934a1cca17f4e3162ee4d22", - "b6399d60d8d735cfeb403b731dbc314672c0505714f808c1da3b27417cbd9793", - "dc6320f3cb0bb91e549b4fadf9534394cd3f2791c501731545e4fa348f8f042f", - "5f7ed07df785d4c5c52d532436bbe49885395d3c9c550009cf734e9449087f56", - "0daa77fb83cf79dda63532d4207821d4ab13030dfd284f9367d39945f1105231", - "b4b7f39e1fa5d3b7b0a2882c03421267c7acd5ecb55b2e289db2424e95e3194f", - "0ad66fd58ebb67bf4b7439187758e12ac894cec711583923d51180affe28dac1", - "8aa76c3f0155694ea25e46cb8eea70c7ff7d285382569b9bf8b29eb26ca4a1a4", - "33878b3ee976090c1178d323f25bd7fda61a4e9751aaacade9b46588fb793c77", - "cfe56e03c7d7a43d552b0793a675ddd270c6a3e557a71a04b36478a083e3a720", - "b1912f5d339ff1304ac218424132753ebdfbd04fe8b8813289a2376361f6b01c", - "3c751ccc76a5e761847743b9e9ee6985ce77cc9fcb51e463e598a408f93919cf", - "52db09c4803a99dd72b39243db71038fb5b33aeb6c4f03ec72fd71c18f24bdcc", - "667248e922a81198faf1c50321caebf7e1d880570b3829e6d907efb3a298a353", - "f467b7682eb7d0d53424a470a0a9a256a0cbba144034b2656205f05080213a9f", - "dc2d3bc99c93df1d76431ae23a805948750343f7329f46f83cb0e2ceecc45e45", - "e4c38005ec77485c5e312ba9f8a8c2e5be35972a54a25fc2a49bcac22ea2b5c2", - "1b96046a2d4c53a0a95768c09d2f7918d449347f686e60e100748f4cd834786c", - "6d70f3915de469301ba6ab8d45ee1e67f76ee37f8780a91615578afbc2da8ded", - "e3e8cc5e6d5008708e54b62ba28d024d08ab89a53e687d4c64d124b97128cd14", - "fabc5e48ac2871c0777791962b34f3003a16f5326b07ee168e408d8ecc918425", - "957c9c9a45a9f04b1a8c181506ec41d223488f537937a31c79690049840cd45c", - "acf0b595cde941d517b1d331b2e4317463ca7df4ce3fa452f5fedb442e3c0439", - "c5eeed68da46487f6ec942a9db2c8c6cc1811dcf90d7370aa95fcc8cc5010bbe", - "f2ec576aebdd81465e218e044ef13e6714ad79abc512f9aa9b1b738f60847c25", - "1c71962ee7b114f4621fc987cc738f65a826a7551320ec7026d8ae4da6ba2194", - "030627a820d1e0a4a0da075e2fe9fd578114126e34eb6be0fc80697ab915b7a6", - "824685150bc8e744a57d7c2ca697496707e4bedb2f4d704984b6221900206913", - "b4354006161fcd761a36fe60cc3353dcff293b4b69d8258b5e03e85614d6a9f5", - "54758ad3a952eeef7475f0a50216bf014c679c15b6fd5cea08fd6471ef337d01", - "897eba7eb6fa17e13644887554572c747f20d80e204622965fe3fac32aaa2012", - "0751d9f368295ed10f6c00d148423152dd8e6d9ed182a16747146fe08199fd4b", - "eee8b650a335cca703747aefa06d0cd3437fd58d777bec70a007db35ef530e81", - "786bd0f20036380c090b6f0d2a33bf151f2a27f8aaad1b972380829be8fdafb7", - "0aeceaf9a1228bc1673cdbd33f5faae630ac4394f5cd02e28c42dfc1c05dac59", - "5012045b51e72500714afd17f2d83e6188a8d113d767c193683c49aba9ff01bf", - "e0b7d721a0e01aa48035f20aaab2d1b590a8fd9dfa45e82c0a79ab1f60e708e7", - "859a8e716191631cc2e363dc821a424908617549d12ee64d99ef5d39c588b8f5", - "9eb0a5f201e7a74191ebe7a4d757d82174ffc0af695df92dc3571febf601f6d1", - "8450473d25311d8fbb3459781f3d00c4cf12f7905c62bb0b8576af1c5661a584", - "b16c2b4bbf37394aa21a92acfda95de3987d8dea75a04be6e748256b4b0b61aa", - "2ce28ca61622f43419d6c1ccf147344128162d65f3eb109fe8a50bd7d28d83cb", - "705a635ff28ec354aeae1cb657a3e915542cff63617875c9ac5d6e63e7d627da", - "aef26724ff328c01242369305bcab3b741dc4a2b5ae091d165b406250cb9e851", - "80b0c483ea9ca2e5d532601e38b2d719e59ae76dc55cee4cd948afa172c546e0", - "2499bc0849326dc3d96a8e0f85e332734912ddaf66bfe193a86e5ffcda1813fd", - "90b2030aeda4d04df6b268ff8e013ad7b8ba955ebad51093f47dbc2ca0368a2c", - "a2ebe410e506667dd0743fadf26019e5d79b82d4acdbf6cbe1d0c556845508ff", - "5d249dc6e319175f28e22ddd7e851434db2f6c8dac23b4261146f57b9e1c2ff8", - "72f66fe29cfe5b60b4c669e6437d0c52f7fe7e224e1d7de1f034b382d67b506b", - "fe83fac763d66e19793142d93aaa2dd2a709e5634b792b482dfff3c89688fb12", - "9bbfc4f97d394220fd15bba457d6eef87899be3e2bcb9137cf18738d30ce4bd4", - "99ccc057652d16bc8115e12cb28f91eb4f80ffd247e2a40b6c1eddae18655dc0", - "943c63de79fdf32189ce6ac3f454d7ec78131720ef95eb98ec8c951d51ed7a0f", - "8e83f225c271a501e8b1d82ac329bc79a5e92abd98a58fe2479511c876961720", - "36a304d8bae27c0010bad174a0a74bc78e7f0931cca4169aad33c27860fbd7c9", - "e401ed60ce77fc56781f52ed88ae1c7b42a38280c59b578d80f9ff9eec7d0157", - "b555c62ff73e0fc7316ff0ea8b647bc99a09d9ed038417c441ebdfbd2a513a0b", - "16c3acddd560ffa5f05dd874e08dcea1b2ec82d06dd6231d6c8f62e3f6870a1e", - "8c29f2ef13089b39ca963bef789e1342712b8121202024a1f8de43c15af9817d", - "1131932453dde16cb50035d7cfa0a428543e4be6dbe0a9ffcea2d32659019a06", - "05a6ada482a92b229774d086d924220534adc508b48af31596bdf2b8833ccd03", - "8c8dd0cd6746bae6dc5ff0090b9ca0d11f4e9f28716db835a18a4df980329a69", - "17d8ab5fb863e3028330d1643a35ba73b5a96da6b31e6d77edea0c5bfe1a0a41", - "fd132b5794db1964a01b4964b2631965be240ea417c3a1ec64161ae0d862618d", - "9f4c76ad1bdea3310df337c5ac1501bb87ded774445eba219b2e6702390b8369", - "2bb1708b4a59726a0435e07375f6c44662aa20d58e8b2a6e1228040a46e071e9", - "e44a424b7e7b7f2dafca5c81321f79528cbf99e20cd2a6486c6402eb7b1b80ab", - "c98e19f760ffbaf854c54f3273f63bd3abec36d56623a9f3233022d79fc163e3", - "13ae425f6489825f5545e3f54dfc9875c762a9e8679e9245a6ce36992b0152c1", - "3748faa01ed5b8a7de98dfe0465e65655a33d2254fe6d024bd787e0cba2ea424", - "863e0e3610db5f0c0ff0cce856551eef49478a0afc7f4cfc64f791568af4afa7", - "bad0d8dd85397a2baffdae45840ae0605f10defba8f285cb39073d36455b5df7", - "3b95a16eb444f9b82bc0c2a4b7dd709a785a71bbb296787b541ea807b35bcefd", - "ff5bfee9ecca3bd2eaf23418b0474d7c2b9c064a4659d5271cf31af9de84ff6a", - "b7674a05c1eff60a1930fa6fe2b57dc6d3694fb834286aa966b36e5200adf81a", - "3f1d5f24c43c648190a1e076639a43d2eeac906629b4e6a4690ee7bb40e76c4e", - "9b30ab53750f22b6da58611c3d5d7bcb8930f9a2d55a2b5da1f1de24c004746f", - "d45a8ae98a2d8acaaa7c20c995f0a8db0937870f8c15a2799019095d7fc589b4", - "b4beb98b0f52fffbe619ec72eaae9fe00284939fd8e5925aae5023238c1b8ec0", - "9465cafbf4fb2ecca06293b39c010de8093fa9fec8dfe99ca8b760ed0e6ff4e1", - "6a576ff0ce74195cff3a2feb0dcb78035e3a51b1d3c802942c125a036aa821c5", - "3d7182945968ab41e0d2f25af352998881b7869b49e2fcba133e06eedc0229b0", - "edd60e17e0172df0d0f64dbd37135e9063dca1cf4623000264212160b73539ef", - "1378ea9988bacf1c0363166d6cae11cb9fdaa0a559b3888dc9d448ab1ba8a6be", - "9d573679f848e7e2130d9705b4d1fcfc94fa0691b0940df2014abacbfb4080d5", - "3dedc2dad7cad77dfe1cc29bfe78c3ff0282867a89e14fb5d5d6c212b7f3151b", - "3cf8d6a59538681101926dc579784a26f24f25450e6c36c681e107edab489a45", - "5d35b7e53153f8c0417853e94111791966032cb1053443a98e61179530664c7b", - "60b61ab34916032eb02cdf91ddb5cc0095fc6f2a7e98feeb8f988c2b3225c1bf", - "fad41834ea531fdd88edd83bdf9183209bfb0a4df7b88a088588a32541e198d1", - "cedb1f75b28517819e880fe05ff1f36fe7b7f4e14202c392646bdf40dc3de569", - "ecb6ad1cbd7b20688627c6dd8cde76cd1513b104c36ce93a8da476f862a1c12d", - "3b55338bd3312dbdf7a6422d5b179858b2be55d4a3d5f3993438ed9699501545", - "f90fc949dd06f93524b0c932699df69b61694792949153854b53e54e4b8c8a10", - "130320b935321981abed3b1455acbf3c2ae4b59da7597577f0c9b70d04990a45", - "98508116f0c8d6fc2dff34db95291ff419733a05d32a4d1ad21bc4138c57a3c1", - "bf313dd714167f197631dbc169094aef73c6c25eed3776c09b107567d11d899a", - "e374b24ed49e1348b8614c362469d107992f015708f0dea46ca43afcf2953fbb", - "7bd8fb1f5d09bd36324cd05ebd8967ada7e1c9d56079a130f60e5adb3610b4e5", - "acdff4f1a0e15892975fd150a987d568128cca7de16f4413d10b5c2b5b3ffbd8", - "7a9c038a3c418cbed2ed58e21b164950f67e098047a34c727ba74a2282caebe2", - "a62d509732f5c07f1b2f1281977a5c2c372d30ce8a0e222f9e71982c9c35d542", - "ae46bbb10368b2e6cbbdeec0c5a851ee35c1185d2b3ef5a24fb525d45b17d134", - "34c9cc80b6822dcec6cb47195bfd72c6eb5f6ec50e48cd822b4aadf07277e191", - "c1311b92f145bd233a4c91e4c1680c44cead37990d8e1099531b1bd2a176ff22", - "8b52e3b621f0ea92c9122d332b777fd52454ed567febd6772e36909859657f50", - "c37dbd86ec606fd6713bd2b9277e7f9bb11f05c4ff0b713447d4ee56530aca59", - "717095b8ca7ecf605d2cedd40f72246996b92d6f562f1a9cd8a7e586175af858", - "25489baec59b5b6a51098b4e4ba12ef67bb41881d4d48c067d85f56cec5e9fae", - "01927a127880e5455b08bdba10bb9a9e2b27967f594f77bf9694f86ab8c47d5d", - "c940ffb1a5b1b41c9061491496d79cc2441c3c049ae70b552a8e66b9ed28ff35", - "1ec1d08fe7d3ea894c127782e97c4327392ad389a715f0fe71633738bccb2c51", - "6c343556bc6c66e7e77a353362c4aa168ab3616ffa6edb1f6147f141ceb218b9", - "a74c8c08a1e1231cc8f752f5e8072663951e491c27be1e2610b73fec5ab89c53", - "ac75b64020736b93218fc6e9f754534304f45a63e3e8f3658fb53240471d9780", - "019d9106e3f89021db9fd176eea3e26ac0387f4290c5d69e24bd699464fe5a58", - "f3870d42d9d88f6f792e1f4f040287daaba28b2031965e9dd7af8afbe42c8703", - "1c77d24f4e145bbb50be883ccf506c1672fc4c10136cba1290cfa687b8312bca", - "7b3c21a0a4b2c16dd67558a37e4659dec194f7a947a2bdeab70ee8f2ff869471", - "5a808422d0de9c9b191ca38d79cd77b502f751ea93b8d135efedb20e53858a6e", - "19628b157d27a8c522c5d0f5ae6d9eedf8ebb415d5f35957ef370e7f5446feec", - "375efccd366c7775b73e4f3e604eb2d09b5620e6b2ef9b083b69d5c97f837d25", - "b1169fb4241f13add02c01f1843abb3191eeb1eee5b2fc84be1a22c316dc9ca0", - "8b70d43f79aa1edbf2a1bb1ad1813e960f79a7e1a7870b190f350104ed907a9b", - "dbdf5d327591f7acb9131ca139de70de588ec4e54af29a540ce92b72f9398746", - "14e770ec16d33efffbbe08b309b9247f3b0e190c410bf1910256ecbc50425f2c", - "8862f32927a279936362949bf5fd59bb324c1355632f17c739fda3af716d7891", - "523973497d90a7c251a40d84208cdd76e578628005d4aeaf5ba833d23915d5cc", - "6bedc74be9139b341cfa62f1406d8b47153e6f951723eac93200e83df3db6e6f", - "9d1a0058ef3f4328cb582df4202c58d038f5a9b400df6a4379e9de056b2f8e9f", - "309b13eb9cf455736eb74111209d947cd4af73bccd92917d1fec84d675ce603a", - "af8fe1ace63154f92fea02ade2d419951772c7407e185dbb6270afc257365ec3", - "9ef815a5b3501bcd8ea109516161963335edfebf934967370d9769b42e45e7d9", - "2985cc4368003dff70ed01427415f21d3f9afdac62614d5291b8cdb5b27be26a", - "66648448e1cd38a6118d5979b2adaf0e3be667b9c51de447994ed1e3ed942211", - "7c7cde6bb4dd2285da2ea79aaf9a74156bc2049aa8170ee8cdecb1e0bfd2d3de", - "e6eeeb5fec0f884568d7cf0ccec435b9589fde545044da399ae8087d48ddfb8a", - "c1dc61d11f08a822a09c83ac77ef6006488cf4293fc72af685fa374b10048f10", - "8a91d53a421ca7493bdc2f1b7fa9a6ca4c75e08ef1acc28baeafa088f5f396c4", - "491c2ce39621733d3de7becadacab3acb6a5025d61b878f10a36e57b21705bfb", - "17f41fb95433d01f53393d320d3ded658e5185f96fd93eda97d75ff096460812", - "68c48c24b35beb504e3686f62be0a346529469d1009f655f32899c0ded6985a4", - "b0ebcbc9721745574cb87aecf1f23d639959302c2028c5f2f46274c93ff07701", - "e22dc5125e6b455fb3f4bdadf94b1c5e1b136a5522e35949eb8bc6054b1fd621", - "f4dcd203a78efff51234853b6f22816fad245e98a597efa353f90b2b83efe660", - "263de70d35325b42d68a524eb5e41c0a779856767c1485c1b6c5e9628d3355a9", - "fd9fc1abc50832562908b1ed00f0b557cd211cf2b16871e6a28f442b7b4b094c", - "10184d39831837ef6fa40e2c90a2a3fc4aae9c579d8f81a12f5b96e780f70aab", - "fd0e6905d5df4202b738989cbde7eef2e1cb12188ff51d0dbafa00b78e2026ef", - "2128d935290fe889f4ca1f3e38075ec440e97efe1b0eca2a3e8ac03f3bb26bd1", - "a58b4e378bac0fa76034498b5361c151cd9572a91c5a61050df3f56dd913d775", - "b0d6a685cadcf5020e201ddd97cd1efeedc7bef554ef0123e5dd9df98b53409d", - "f3cfc75841c34f73b1d44c52f08631ba56cc73d0c8a89949f37dc772c99ce54e", - "6aa844620190f751426691caec84a2efe3ab2c9961210f97669a377572ac692b", - "f82245f8522ca2891403998586005339f999d12e28c52a53287afa73f5012492", - "c959c6b7c54508c3558ab3862366e1528e926537cd25769b710508bfd5d90a6a", - "878c4aa11cf23b6f9750d21b08656a28cd5258b2acd71cc22aaa4bee5e5f5260", - "f792de4458e01aab4a41abb9136177eef87c5ac4d5da0f467dd53d43d538b1b2", - "61fadaa483581b85ce7fd4998dea17106594a2a7d13a1021d0b92ac8dca8dde0", - "a9178ff8274e2269cb10c98bc9422d57ee47b22711f8c4ee0a37b626a597040d", - "8ef04f1e5c9522d9556c5174bfd83a3761c83d365aed070f3c292cb08d65c98e", - "7b93ef71af09c4804d3fec547644add396226e94740cdcb486410bba943be537", - "34868a60f88c0d9c4ff504184a7e9955b0c4c566da33c70f691e2b9e54e8925f", - "4c633b539dad2817b71f2f72bd8fc9bdff03e3ada2bffcd80b54c836d7ed9a38", - "14f99379716d67cfd12c437883e744bed08b799be842ff6774d23161f3ebf627", - "01cc9dd1235af8b0caecaecb7f7103e13475df38486dcab0ee9568395f80966c", - "92b7e0a4dea0a93419487fd146203451d9fb9cd3f0db62cbeb540f3897ac6916", - "f1259c30020e4e2dacea29c5751aff0b21c11a3e591e3d07a6b38ca17f4c8a45", - "d810a7a14a67f41e17e6518e234c088d0da320b29070dd9036689447dbb3489a", - "b44862a86dfcf39a339e4e395a6ee718f97996cd383ef82370a3635b7ff5048e", - "20c279cb76b44a9fd9ee86899b17c6416b7c81a4f829581cf51b8101e1576353", - "da72189fce007ab1efceb3383eeddf4c9276480ee00cf3cfb161fd7af2de210d", - "e3eda7f6658aa721147ef5f121b97d9f1a3e2248ba3a36a08359653ce57e1bf5", - "1007dae0d18b88bc02324d490a6cbacb9e90682a6827dfa45455b5b3bc49b16e", - "f7049324a59e84ce596dfcda9a54c03f6f208c94bd9f45ca8e032cfbcecb8bee", - "4b9e96d1fecfdc6bf45f085099c2e756f5c18906d89556cee7004536fe8ac6d9", - "4de2b275cc678805ee6a971a616902b9699f544a44a5364fa424b56e980ba304", - "0851b43b5629f05e25678ba79488334ec3100a9b2c4ba7c73b6ded99e1302bab", - "f21abf4e166e2e5e002a83f249e6a1e92d8697bb4e179d674ad5577473377e89", - "671fc3ba6b3c5c7051eb380d0211ef7059fba93b4274e41ecbe7e236510e70a0", - "332f23df7300d9e7a29a7eaeedcb2bc82b9d0590cd57e177b2d907b04fd78f03", - "a33be514591e545b2c10c9726f6474e3d7acfdf71a9eeba3afb23b18a31934b9", - "58728207eddac84d4b634725427891dfa9446a0de3d57df0b8d39b57daa04692", - "d50bbd68b2aa5e3966d032835732843bb15fefbf22c76b90b7c0b0b6297209da", - "194736955283463c7f12361ce4352f76d0ba5f536d9628f613929c36aa3ba39e", - "23b60a157246fe6e6f3e9d4129f7941620442d7779fe3a81d5b91607613cdbe2", - "7e63f5908399e492fe3cc05a66794ba7117604dec2dd7fe6c69871cf5c4fb208", - "ada90cbfb42f7a854842d8d75c9fc2332bea08e1e418cea19036abeea4625cab", - "553227b5ad0f6e4921cdf8617c7df2b9f0d32248dadfa1bef38a69efcfc05cef", - "52085ed0ad6e852f5feaa09d51b7606d10a73f50a937d0f4f115fc2cad395824", - "75977e8cc6fb2f99a9ab05384ad25c0db46cd704389240b441c77bd0d92df264", - "e43d02745fcae6b71c7c043e20ababf965e09d663c2d38c79ae06261c440db3c", - "ea5574cae816f20587237fda4558d974d1d124112df2871cbbdc7a72893e4339", - "7e4dbd0c5f5c736f3bd876843f1fa50dfd7a00a5a7fa84366b1ce0f92a5030c2", - "5a6fd53af5b2ea437390217d90c40a6d99610282f8ffa3c14f145c2218d50f46", - "556eb5846350860bb8524a523807f1689a50b997b88499cda787468f43f41f1c", - "2fab76edd3ebf27294d2732dfeb19c07aac0a4c68dfade3a3b84ed12cec0373b", - "0ba13a22f8ba2ed86593366ae0a390da21c6927f7f53d6078ee6cbcc2cfe8706", - "004ae6167f2fc5dabd06fadd517b6b2b7ec1ab7bec7d8b3dfee9b02c4e51f83c", - "e202abeeff7578ac565d4cc87c16be35ac0a8a32caee78fc18ea8a88658b97de", - "191c64e999860b5ccbd65e784273677e8206e73ea1ccaf3a189f76a1ec3524d0", - "3218f9f436f5c40f9e595108e932c28dd7ce92a9a9190ed998dc9c4f61d71d83", - "9ec3fa656650e05b7222e4118e6f09ef742a5ab46b6b243269c1e1a257679e34", - "25f7f294cf04fc5811057b3e90a43abd8960ba5f2084d0bd3abc8c40c3214c2e", - "0d383b108ad4f41ae36e0397fbf2d6e0191dfff8b3c2b3cc66f2c81332aec02c", - "88ea4ac2990427c7b2319b998d19c8307e9cbdbf09d510246edc44ed0247502b", - "297e64f42a1d73e562ccfb770b86c6ecc0512204c730fc2b2c52b7d271e50747", - "12c56ef6057503c29d80e4c3ffd2084930ba43d31a26e84a8d8d9e7cbe2d17d2", - "cc69c7c02983a5a74129dd1af24894b784b90c779d519816f4ae7e256dfdbe5e", - "d2907f2ea12551fb0262d761fb6c53fe1a8dba47ab3444ef69e02f0e65e89141", - "ff35a0ce65108143f2d374b3621f1b3fc0aead0d93ebaf9352c21d90d3112be9", - "26466c92d61981ec6b94f4de79b17160ae44fae21cb271bfe3603f6d2ba9f193", - "a5b79a70442b2a82229856b77e60160cfdd9674f1ac5806fb95580a0d5e1f0c8", - "62989913c1ee5cba4a8125a6453b99f1ef309e95eb4d983a0ede74687fad6d31", - "34e7feb7548595ae6e996f50aa7d336595cf5424f3f40404e3cd20da3d6acb3f", - "e7930471df08a7c531e60b65c27100dcf6b06672701e562aed468eddfe71980e", - "3d4a6be40b609cfd6881e95e2fceb602664b2d2d94311e3fa3dd5fb676aace70", - "c3fbf38acc4a2aabec41c805d3b629e32190cc7e79557798939b86a3825cba83", - "4f3bf174860b91d1019b8c5b73b3125547f81f96a67a0058620c2cf9ca87dce7", - "7dd0e57feac47b17017275331c29464b0a1f6e8724581e2791593667d240667b", - "fef044b10473f4fd00fb9c7193a3baea23be21f8568a2189dbc2e4db41fff612", - "18582a2887e716f5bac589344374b210411977d28d4eee1444648e5aa6135f81", - "2bc0c5f52e1cca9add7bc2f8cbb823658ff94846e5359882d88070b7d85228d4", - "2e7dded9f21921c1a710fbf87ffd2a42fddf0e9e233540d7e83d34e8db643bd9", - "fedd178416e810b936456a93fc6d4c19fd94b6449ec78596b2b1ca9067d99d08", - "ebe6479e85908606298cb5eb7c6b2698c09ecaa77b89451d65a36111dd9ee34e", - "fca89b9119926b160311b1f01ea05a518ddd68a7b32ea9e97e6313a8335eac50", - "6d908cea33fdf50fcbc2d711fc3bffaf8a26994d32d1fb3a53ce160bc2953ed5", - "200b29032cc903644a543aa5e6449fb159a4289ce1a117006f3958f7abd3073b", - "0454fa091d7b91e2df187b536fb5d3b787297a4be79d6b93c73fc93a5f50bddd", - "d43bb04e6310c02e436b7662df1f4d5dbddb7a7520a28e705ff2a3455eb250b1", - "9e758ffaf1668b139f77ef22b37eb55592c83fcc2aeb749f900993c9fb67a258", - "21b0924122abb3055514e79791a5e42de15610c084d5117914a959fde2e2e02d", - "4dbc17208370229a155d9f56faba9a6cde4af4e3e80acf81484fe2d4e5b08c4b", - "b1b1af51260862a21399c7ae245639feaca669463e18e9d12fce21cd8b3f63ac", - "4805025da1b82ad880d74f913af79ada32fc15bb3b83622e50f653dea86c62de", - "fbc58bce1e054a9e127982ad1d775d31085ac73fdc8efd698261a024473d0c1a", - "02178b7380d34dd98e2ecd631701fee3218db67da95ffdc44c7beed0a978e016", - "48185769d0115734c288181f4b0838936722bb86429b4901ff5b7c7e152df5c1", - "33ba78563fd23915d0efde7f692382c13f6a0fe4d2bead8efe13cd04a94459cc", - "4dd25b0ba01af86534ad55033bd32009fa6c0568721930766d9fbbe5bb6dae47", - "d00bf2d326445ce0ed5a3474250dba939c605ea03fdadf41025dfdfa1ec6ed0c", - "20586fcd6f0c69c9302966c784c050e6c53623fdce7e8d50668b351aac6a6b11", - "52da704ae1a6b7e3ab9eca9bdfd696ce3bd549189c211b1c412851bd44e22235", - "abce633e48298dfc823c9a360fe1c23cf23f4c4a79d016d847ff393c56221711", - "81384aaab38404ac7473964097bf020eba65f8500b34fbc5d4ccde146830b388", - "5d019ccb69b618450d9af69a82e2eee62a990216a06d373e9f9da47ca8171ad0", - "e4a84f8f62aed632708dac10cde52c889a75241d535cc2e79dcbfe5b51d23c2e", - "72aaec8adbbb0aeb6c1522ef62eb1c50f825ea55619fab08b5eb75bcdc3a3f2b", - "1f5f3ad7baad95340010a3e6914e67e4eb9b75d8e6e5774514ca87550f6d0c09", - "d5d090d74ece92280cc26b7427803db680ff157e16efd4d52527fcce2174eefd", - "8b6a48198588a4e6aaaaca60a7bb79c9afcb273787a1e409777fa7a381b75bd4", - "52ed8104d6b3cb0ba9022525fca653dbda1d6061cdf3ae3592164727957c6f7c", - "87c793d9bd979ea2a42383941bb4f9ee4acabbbe18a044aa3e81aefd351d6090", - "693227088f392904a82a9fc70fef0f0b9e0956731a21cd82681cf747a5f18c07", - "f45573c556cd6372f503430229a4075451c2d9a2f70142a0004fe7ee9c1f50bb", - "2804a6126738e29369307cce108487edd609931a177623075ff7df9422def89e", - "cef2b114e2732de7ca50793156efa7de80e79a077fac1823e302846fa10bbc71", - "5ef67eb4bbeb648994abc0b877acdfed915ac9cde28bef8fd4e9a3835628a8db", - "519bc32481d5ca05aff0ea37743eb06369bf2d691df52e8b8e47860f0c6803d1", - "378164461542757b4f7b00215e4e6ff5644cb59c832ab4fc16e9e857a3724fda", - "d16be28d62b10e4c7deac951cd44b84fd95d37baaaf658344c0f7bfbd13dd03a", - "a098da9b317d0840722c6c71d76178321c6f18cfee5f18a4c535a647c60e8114", - "ef8b1eb046edfda7813e3647b65cef636045e610b86bcd3c66c9a0cb817731a6", - "f62214c676c39868e18c9a84711ccc8558f4d283e8e6e7b3d048f40e7d7be313", - "2e52e0abf1691b198d2576cca8843c5c9db9aa3959c217317128f5f7f3149278", - "328cb52fd4112930f3a1a8b8b2f1f5ec35436e554e8d2f3b514678db73631fac", - "3cfd0fc7e87c55bdfd51075cfa92858340f502e14337a7ed1513e036cfb9d13f", - "d04e850c971c0821c1c8f7a6ce182afb02c80b368c521713323acb5281bff069", - "98c8534c8c3d63a5d7fcc08d9f4074fe491cda7fba81ddc334a484c13316ba21", - "52c1a1c9899d108837669851976b02b8541b0bc13f9642ae65c5667660d3aa26", - "f80c1b2b2bb3e684d399511d8e42fe907f67687d73c5911f4a4c97f96e43b817", - "cd6226d48e337b96bedc0f8f9eeb6c091e5fb4483c4265e364014745a602ffdb", - "bcda9bf737228bd8aef1d240d4470606c6cd7628aa2563a47f34e725664e21b7", - "31c3b71325776f0e1431db512190ffc718fe951fe17105d09df7c4702b2a8c16", - "c930102d941cb8ef6beba197b94c044ccadb85a84b380db0cf95b0950e0bb8d2", - "2b420813ddb0f768777364c3903d1cf9bc0fed1d3b26507d5850823fc4fb25f7", - "3f8b583fd275d704630f089cd600751a0b59cae82b2a1b6c125791e7014d3a26", - "1eaf4b172154525b5acbe1aa6ac029c2b00a413be0c4bc3f9f04e82b3c7a64f5", - "1b563f0af96a364f35136d9bf6545003aa1c453dc39e1fb0ea4736cd43cf2a0b", - "ee82f25ebeeb65e60c69c64c98ff6e587ea35bfd64cd8a4140931c51531720c7", - "6085d2875a787e85e13258fc4383a2b53355d75ca4aadf6df9fee9b9b483c387", - "a383758ec47144e8e14623590fd4966d00e27b1046b64a074319095663ef6a05", - "010d55d8b5c32936a28bb9d0d3a977ba9f89d1238028d0e900556fba6a82cdbd", - "4be2d51093bb72b42f85c24a5831ed8156a3fe953e9d2831221ce1ec9363b789", - "7fa09de9747169634fb7731e8e69199115d7bb11f2866a61391037f2829f9bab", - "57bef7e0fdd8373f46b4a5405261975c4307b643d406a35716e3f9bdfc363ea7", - "739c5c646254f0fd08f2f5627ceb5db11dc477d7ac4f086f4465c7351872bdc1", - "e50d8021c2d850828f702645acdde7dd0912803da0e6df9054e951a1bea1a1b3", - "a193fb28e87f67df718b0e0cd12365e4a9334b2e445f13317340b770e23bf2a9", - "f70f5bd1d08a562ca7938501c2746392373398eb93b9e752fceb2852841bd924", - "cf38e22ae3afd9ad8be755c306aaa1518fb81f56d39a7bb4115eac08c9f2138a", - "74095e1b554fba0b86a431c0a426cb0ba1889402c67ffdc3bef582a60af883a4", - "4ce2a2d06ef24f07a46af0c64716d2f44b2bcb480c4e70e3264541b56c67495b", - "29f179af6fa910bd58a51f0f5ea28ba6d53b26882609e664a33542ff91a130be", - "a4433e1fb8957986eab407bff96bb395a877f36abc6dbeaf0b04db741903a5db", - "afcffd389add7d42ec6166e9b75d6c95c4c5310f9f69820d5d0b1c6b45277ca1", - "e6484aa18d17aadc7551bf0f98f25d198d2be3082786abd7fc69c8cba3e1edbb", - "b54fd4686f3a630b7196b10c42ec834f32becfc3ed0e3ee8163e6e3995518067", - "afb53ba42c81fdc50b3a8f7431da756c6c937300ec35764651681e6839ed6d67", - "e41334d1b4d08abbf5046b9fc3d6ebb96448a5d1265609e51dd5fcee0e06665e", - "6d44f8c246265a64f4e59a9b451f1c9f3306ab0c8ad48912d4261f74d90e591e", - "8ebaedb98232d48aceb27e119653f922a8e6bf1618640615ade6de87e16daf01", - "69cc02cfbc9b2cf7f529f46d03cfae4349c2141765a19cc4e972c57c1f1ad1f6", - "29cdbbf21317372ef64533d5f9ca171f5f7a62e7f2c369de1790b3905caf9c80", - "a4fe0d47d5609a6533292d031711da581b92c104dcb1843c66095d9512e740fa", - "6f9138268cfbf6cb426f717311acc146db52140d904f1809e3760ec0e9731bfc", - "f19e428dfa449bece9a6e8724ec0e906186081189082d9da7675ab33aa9a483e", - "12ecc7735c6bb685ab76494f0bd2351e04f6afd5f133b6741f7c244eb295a4a6", - "2759b535670c37644f096e4a0c4a3d020468a7c3cb30ecbbe8b23276b6540ba0", - "b5e7bae276ad0a498ff40d815ea998647afd82f5d2f0db9e81853625e86c0526", - "187a073813f3b06ee4edfaedc7151742d4caf2234b13a2eec81afa029f12c4b9", - "9e3dbf5ab7d6a6b56b9645d98ab088c1633ed187aa1c8d87148e8f13b5649037", - "a9b1a8ceab909824242fa0ef5c5bd81ce0053638ad93985a406771f7e8b68870", - "7a6eee2b7a317f0ee36d58f01dbc8cd09a92636772e75bdbed13121a8fb52e29", - "ee7c5866adacdf7603e8fd2637bf1c79387e53fc23f926b969f1f310ce8e2b2f", - "cf6e27184062018e4bbd86e8fff7a34db3b0ee90753144b3611719185748ce9f", - "40e32504bbbf2f531ee80f99768e2ada66e26cba8d45940fccd5a51cc1fb9b54", - "8ac0552afc89d95a0eb642b9577c7aa9ffd25d88f5fe9de6804a39319dcf596e", - "6feeebc29fe8be2758d147d284839ec859b2b68fd7edd740d20834c6f152ccc9", - "9ad03018a55365fd64a3dbe2adb6bbef3b7414f77f7509b3e39dea784fec9e4c", - "965d368bf9bfa1bf39606f12cdf8f96e8df325733b8376fe17c6ab7224332331", - "acef90f420b1cd1680ed232ccaff11cf121f34ec0a723056fc69c5a299d976b2", - "0d851aaa28c36f4009849f23283c5face681017873bec3536c5cd2022f19cacf", - "a320f7681693116d8c85b0b78a64284024b1adde42345b2a9b7cff0aa90e6697", - "a78838f436f0037e44357f4d957be65b46bf4e106a054e4e84c23744dcf10a30", - "45b394de1fe79b3d5cf814466efb92f4ac273452d16b231d1a6ec9fc44060d46", - "e6bd08703cd688704334fa07559e41863dbee8cb1020724d49aa6b8933e06382", - "600a237c84c16d8cd6a6d087e67eb2208f9bda980deab25bc9c47e27973cafd4", - "b49555e4f3c5476f7a8a775fef214576a6428dbe4e9a6a6fabc523dbe8d94cf9", - "49686b79372446afaddfa2e89d172a47e9b7ac31367768ea96f5bac8d4a11b6e", - "09ff5fa432e6c1c9ba73190e2b59067608a6d7ca0d65656c6a35e2eb8c02fc48", - "d8c1b6b352cd2ca258a96738eca56dea49bd1d32a44e5b91f84a3a5042366459", - "cbb768879f356451dcc63c75ae82acb5d19832839f708f003b050d0e46c2cabe", - "29efc27f1d10d360c3036613ba9dfcac87768796f38a5fb2e4c8b9533838210b", - "e9cdc77b7526a0a3efabaf5843859a08aa60c63bda6923805eda9040c89d92c3", - "ba6bb901456a636d209bd60fc5ffce0c0ad8a53889c98f6bc912e07e377dae1e", - "a960eed342297424975a91a5a983a930e757effaef933fa0e9b956d9b0db24c8", - "37e5d8c6dde99450ad82fd5f74bdbbfba430e9c3ca89820380fb835aa30805d4", - "3a5913a9048d7063344ae6a4303dfc8306d52091b85b45bf197da8324f34ea29", - "3f6054ba151af3eab5e176ca5610e6b60b98003424432cb83937a633172def65", - "79c29d7386203fe887627a2b14702452dd7315109b0f7047c280b3c3b76095e3", - "422115ba775b9308a0071d016cb97ea92fca0b3af4414d8be46b1df429da034b", - "e9f1f30c9c8b4f43c75a62ae8de019324208602e939d1682e4e7c07278611ed8", - "516bc7857fce7de1fb7f2de95a03ac9efe24d083874c027fdcb726d7b727eeaf", - "d51f82ff0be44dd57844ff8c6ce7abd4fd64d27290fb92aeb47fafc0216b6667", - "8e764cce2504150edc8a3d9c20df0c3f3e30b71fd4135f1a80bf5f2a2727fd59", - "a5b8ac7cb46b856164ce2a2675e148ffa527aedb8ebd9d0b605924ac5300caa3", - "81b143e92cbc2a152b135f318654ca25759171e391f5eb8aa31dc565726b4cf7", - "4d584b1745d0b2ccea59201ff6791274000028e4ac24fb26c67ac8446a8830f8", - "43e2ff8e63a2403d226ec97fff5a6a5a567ff54d2936951efb92bdecbc62a0ea", - "8c15b90e5a79b2af9cda8a5383b0e8c680f19cc446e2a0a9458f2c76c650bb20", - "37cf73aab487aa4b753a45c2c3a48946ed46a87983457e284bd8cf619992d9fa", - "d71e32c33dd07d49f8795fa159afc01bb7d7f4bc5ad5bde232a75bcde658db45", - "742a1fbf51f305c4c37683de94bb5018109c56039e624a76480ffface73fc008", - "fd4bb6cbab6f820f27f855e98ceb2bb33a9fa937c8ed415f332badb14cb9bc30", - "a3d44a4e627bd7dac5aa6a668cfc05d7c981a1b9c007382e0aaf8ae58b83c954", - "9c508f84927051bd8143c96b12e1888a68fa18cf46d8b559919c9509d80215d8", - "a0d11ac9dcdf145bbe288e08219eb7b795f07b32cf0da06d64f0001defee64cd", - "db782e90b6a0804d99ab48f6fd1fa7a426a3921404cf00a1573baf66681db4d7", - "f3f941322e3d7ed6c09f9b8bf0811c4c30ab656c023780929590a373fbda8e31", - "8e1560ba93f31f7dd412694f13b6bdd9e79bf63804541396078a562768db50c9", - "cae3dbf7add3ab7163f9259374a43f54b7fa5da669b22c160359b4b27962f92b", - "de8922dbaa16a55170063203a42b428629f2e19abf7712a3bf788efd3fb50317", - "0232ec5f41c38bd693c2b95c5aee8155c9b55e83b59aabaac41bb1699fdf7f4c", - "fbc26bbea0ed46db4b15ad9d369a1f48cd760152d83160196c91fde67b1c0308", - "9a8b9374e2046d118e27f26bd0f1dd5b2b2c7b86ae535266aa0fc8e8ea372afd", - "5e5d52df411bd8996803052c014492e903edd864a21f188d9383383cc8f30692", - "24144b600339c49d9fd590e090593a22b2f31c7b55fa263712d44114711ff395", - "a897dc9b4f0c3efdc037f0aac78164b3eca280e06359a9f5af779d6829f24fb8", - "02aa8be96b3943792296b87bc0fec310ce7b40a243f01a039bb5dc0e81155011", - "3bc69577d1a4098db8bd56084566793b11248efea37d411782175feda045562a", - "fc037e3746f2b8f1b90e37d7da27423f99ef779c62274a3e85e6134881c0d4be", - "016181a00ef1889b30d1cc27c4fe4b7f16b79b3f750d05e3dfa0ce1e9ef9f557", - "e7618dccdd69b75913139f57e0e82b8008df6f40a09b007e08277230e6badaa2", - "77f1e089b5740809aa73f2052b49ffe6ce0f70ecfd5737fb81dcc9f3e4c0e175", - "884d2d75b6b526ebab60d3f09342f438b19d72de4c29ae50fbf41fb142f5613b", - "6401302ef0647f27635fb6e83de4f943cf25e801825b0758d4bba80214164d51", - "d90f155a93ae67e0bb3f9ec64b158bbfdb1cf2cea2f3bdb438f199940048afd1", - "d99298573fcfedbac18e76cf74b5c7d623bf164a2d48af3d4068272d7edf067d", - "7c359ace94c346a088f4d37bc67e5e156bd67e8378d9ffe9ea66f71718db0c96", - "e6b6f7713689825bcf9eb77825f49c89eb0f20f5b76da7e63de0785c5942da03", - "fdff1cbf929747c1abf6c9c9f68696734b0b6c078f5bd2679e0e7a3a4ee75fbc", - "4b97a64897ec178c82e9bb8009c3ebdd13a2ab27e00976ea2cffb22490f843af", - "64b4cc85adbeb26eb522d4da23bf07e3aa8119af556d69cae66cf36f60311951", - "501450192a6b4a0a6289de286b91bd277894f78449fa95144c2f0f7cb4d9bbc5", - "908a6f57ac5041c1b2eee4ebf50751397b4c8ca01b64a57214705d899476dcae", - "10531ed385e46671a73998f7b716dea902abae5713739ba84c7580b4a77becaf", - "ae8f419955ca00172e320c02db73e57a38abf6078668906fffed86332dfebdc2", - "af27e94bb90e408dd10346887feeae4f33efa9efa5676bfcdc6e5d755f6975ff", - "301ecce11ff4c4bcfdbb20bd0fd3f66fb4dab2a5df982c43a89cbc2a5c3b1607", - "b1cd8ebd20477b0acd2e7cf3bdb37bd241eeeeca268593463757945f86d0b309", - "f1e6fb7c3db8b56e7a4c96b2ec5286b171eac057715f47e6813c6a7ea70c61af", - "41147032c2410da00f6d9469c7e7c971128b491a8eab3268c3f08ddbaf7dba8b", - "54818f8c0e2348ca34d049729140db02a975148489c92f8ea1e21f6363c601db", - "4310b93a3fb60163893f66158adb9d32c9f51f00c2ae8ae7a382223f0fe80bf1", - "65c4252c95bd5e42eb618a57fa572d3e4ef68dffa09a3047b7030045a7d966ae", - "a784fa0017528b5c21caafa5f364a7b6da506835468dca96371bd3de73d4b3a8", - "6529c9a7b2dcccfe6fee7677638ddb34d22c0a0994e021bf119f610b0b2c844a", - "40387224cd41673a2eb50304c6539fa7c45c619c7df2a8d7a6fc120356a5bedc", - "6067fbbeeb125806d3e9a9147b96e23e500f23a851ac3c1b7122314392549870", - "550616bfad99cf15d5a0dfb4b7a5bbe30a63bb06758c4aa3b5e181c66e2c2ac0", - "7d7a484c44fdd085fb32dab98fb7fc82a20e234baaf343eec9223f865c8b4978", - "a30f0f3a4de25d24432c3b6a8e279a796e6082c7d3aa19667d2b13e51bc768a4", - "a2e4ac7141ec0f4aa2ed8cfdc118db688df75c5a82b6e8b3213186664b25f4fa", - "710740165280c18cf93cb013307a3663520dba5e5c2ce9a2513611526ccfb1c0", - "be5f93131d682e6b75d2e14e0345788a113a9ad9b4df3dbdebcf9bbd4a6837ca", - "77cb080f8cd1e4c9066a3d2a84a8bef6eaf2120e5037c3c026ae7dc3709639db", - "c8f5cdb107541d618eebda9cf6dea58f8ca50bdf6d8aa293bab578a8b2eb7675", - "1a5199107fa62358927a01bb968736ea6960c4c1f93b50abbebb729f24c7fdec", - "d330c5025a69abf0c8f417fbb7e91a412b9508a99c56f536bb7df2d6ce5e2730", - "a11735b3f36eb6912d17249044adb09a1bbd5fae2748785d6fde992795ee9c99", - "2b03a66f937a4d9abe0d3b754756f139e57efed6ee72c6d8d34d2116e756da62", - "a01950b5d1b47e885f684dd2e5a1c62eba7fb214a58c8df94cb990f29181a303", - "587861cdbb3d8732729b687cc8273d53a9b1be8d02e55fa4490e4bfb27c401f1", - "a726f8227fac1d8354ecd0356d968649b170ca2318538a69734d3b0df4618944", - "9e5daf9b8c3d45a30bd0c3afed5025cfadf834f226a80d9dd6e44331e8c0a912", - "9c1d8b0aa603dd210185a52efb83e36f37111310823167451afe591e27903643", - "b8fbe486f14c5d26737d8083f47030bd37495a938224f58a13382da8354fd03c", - "9032e2fb75d9c1cccea45ffef8e44565f8547ecc1e7fff8ee561f51849ca38c5", - "0285be9665838e44f766346483be5c5287a295c29462cedf6eee4d38b1b195e8", - "f8239c6d2b0316c9c465b33275c96caea6d338852d1b8621e77cc45944281d40", - "6b48db5095dea1fe5f8ea8d486b1cdf4bb8530c9f603c51c9da164dfe3fa3176", - "193778d3c8b9da9630e27d0e49fe92c4918f59bfe848f795d220fca2698c7830", - "68894f5c2d800a390889216d953967b5aa7e96957cc594cac9705835b667ba86", - "3f20253da2b8dd4617f8e14a9029eed62a8fc37308761a0705f288986dd9b1ee", - "ad6c36fc1c6b578fd256bc0f4947af9ee6e80ea19350be4c372e05e2302dc164", - "c5c6783828bd0fbf3c763291160953b042b5486395d03e58287667f836d1db9a", - "96ecdc78302935bc82725b8ed8ada7ce353fab27bb8c7e01bbf52e5e6d683ac6", - "9bb7bdb51afc662e6c6ab7ca54c802ff5e49c6d54d4bd56ae103940f344e1b89", - "4b68274276c14adefdf4559f2a327861687bb642893a986188a9075a0058eca5", - "9942e00151c623c79c8041a06c84fa81dbc7b5a5cca07935bc4d673a9ef1c79f", - "f33a23d46066f02d4cf7b00323c52764d108471ce90a257bc08f250599f87b9b", - "5cd80fd3090e13ec78a1f57045fa32ebf23a2b0fdc27f1f026f6fbb4fe692b56", - "ae04562ae84d9c6b6e83675128b79fb24e7f775ddfa2587daed6f75e6f88661c", - "7f7f14ef92a923e5525f9f5fe1491a2e18743a766ca68ca6cd3a0ae95fd35a4a", - "1c843d391f755e95d8556f0d39580700d921b5aafe27bd5705bf75146f10d951", - "a9739104a108765c8db8cc31515a721c852a31d62e4f50f7855b87fc40b349c6", - "f39d39fee3338e066b7f0445a897088ec4e3b29270bef3f36eb95f176c140151", - "3d2357e3628cec587343c1febdbafec348dacb8180f144921dc26c6c01e6041f", - "abef0c113c5afb751765913c72f07500199f568dca91d6e0c9a1503640e4770c", - "69802a2f489aab0877825e60a5213b6b230220c81b0dc16e2ba03643fd9b9508", - "f56687acd4dbce82d5efbbb59ae279a46f569509da1422fe6a76f762d0460858", - "7af5c3f6ad8b096f4bc93331c5cce8e92c358de2f56ae575447187e4586480ef", - "c032f17226ddafcef41bf5234c48e35b417b7ceec4e776970f54b0864903035e", - "67db49f88b7227b1cb31c57c6de408202841cda6f4f73795ace604a14ccbe6be", - "204094f6436082e43b5501be60199b32e1b22f34e034b361ce5bf9b5d76f0c06", - "cff82feaa5349e1ee4652c6794843360e80fdef915d335486a0e7bd959be4e72", - "e6917ff4d57965256e3f050ab8c9f933dbeeb980d83fc8789a428eec15eccccf", - "f12a604905e259f1b12e2eac837824ddbd2287fd5ad202ea9dffa81f572b205e", - "1343dd84242176043e9dd8a29aa2a143107817061b4260762e6364aef9cf5e4b", - "3b35abb905cff43ba6aaba3ab960049419ae84cb8153e8b63f7d6d6112e48b85", - "9d99335e04c10496b62b7871a14dfb2df0abf9c6f52cbe99a6657272e017d4c6", - "7a11f0bb8271e8c7fe20aa0c906386c96ff89388c1001d7625d85af21f2e5569", - "60b7afb25d468393d790f354b1f4c79b02d26c5ab6438c2235b284f4236fbdb5", - "de7b0f2c61989d839d0a8c08862e9b343b2f1703165eb3d9a886d6d88f7a835c", - "dc8c357bbd365963fe7759d895134b6c30b8a835b02739a614ae4e210e322d5c", - "19c8633d17ccf1949a5b5ffdb7a2ca9db50a157c3c9ae27de40bd0efc6170a37", - "e31f37842dd37b89ee8f9e7e60fc2b4c069088eebd94c7a87bde1f37749a45e8", - "d86662a0d2f3e0c88585bf21f5cead28798ec2193d80b8adcdbcab1da2bd0027", - "295dbef487c2591e571ec5d9d842a2d185ff8e505c13522bc13d42cda7915350", - "bf66c50b6c3e979d4194662fcb8485ee27e0689039910017192e5fb74ad8ed36", - "0fd67f3b6e68b3236a5206f614331f25041c92b252fa411872638964b0b41466", - "0a9843ddbfa382b78d8af3c713b15886471af53dc05d7fba69569f1cb8b12d49", - "0eb14b7cac542eda3970332583123cebfdec5d374244c3650f53c666eb5438a7", - "379bc280d5333518b537c9e851828856cf347ef638d411d0d184d24e33ccd9c6", - "b289cdd3aaf8f66874b20c07d7c6ae1776c0f4db2ee7918bd5124d91f13b3311", - "68b35b883a1a7bb975644a09626bf965cfe1f3dbb1b5d80be5eec93e27989532", - "ce423b39eb0a132f0bbe4841cbb586579c3b35027db8984b86ad53ea70cf3f53", - "bd6d8725b1b02ba73688a4a62b6ba058ded78f6b51158f9005077c52992d1bcd", - "708a17d7e41801a8f355494e7f5847afdfd994026743cccf31cf025c0f4ac931", - "b5fa6530adb8188adf41626e60b79c9515cf5c7e3b47d2862a25a32987d95f3b", - "b8612b7c09bc7d92d53871b2035bb2d52a0c55bf3b7fac3114db00c765406ea0", - "7fe3d41515f9688a31284ae56c3e17fa3d1fb230c667339176c9073ad502b169", - "a5bd4b6e2f1b4fe6b6bfcdec6f3c1ca1f80acec183cacd2df8e659c22545d9ab", - "90c631a31fd7f92ceae9969f5ab2bd484beeb4e5cd633353aaeca2df0dee0621", - "7a80d2d697f37503e796580430e380977620291acccfadfd0b1efbda140217cf", - "d7cf0f256cb67669ed1dfb3e05af388e337eefc939ca53ec1198f82d069ece89", - "f86fbc5c8c06774584cc2274871f7f92c3a0a5635319bc224ca6a4dd1243ff4e", - "7bd703f3054bd90289b85a85dabcdf0a0921705393433b4e29075fa5e4695dcf", - "69d72c996f275fcacb34114fa539a1bf0613a31cf38624e92a7971d13ce45d11", - "1fea8f8d7b3ab3bf7735f8751e2af518e64085b377330f8f80b366c5d2890867", - "2c3821969339f363256e04ce21163d2c9c92a8098e0f0242e653ab8cfa905867", - "eb0376fea0cb553270abf1617f21aae484779257ae2c5e74770b8b1f57e13b44", - "f46700f5e60f6258b0ae64f6bb04ebe4f877f29fe8512983ec0af8645577e458", - "0e74941e29511b7ac5c2f33179b1d8b8a843141f19a79075d1e70cb0649b3dc1", - "ce6c691ea74b87a749a43747d44534a8e686ee1aa242cc1bf1013eff61b7dfb6", - "8871971760bd23b6ea47b894299fe439d6f9685c1ed918f3ef1fca15b516c5f9", - "5f47d56d4f939d99acd5a8fc8a7da9f4a4fc201161aca49980e871527a3f0178", - "02e10af39bce37255785caf0258d8dbb0a0f40a2664d43c183f6b279cfe060c7", - "ec66a8d7aeffb2d95bd4d84e0e56eeb5c6c4c6b945965fff3008ba9a7aeb45c2", - "becad8990c001e7545d2f9b9a0052f6f2e09bf788a14e27fc73749415915e24c", - "cf6bc2bebc2459c911e51b5ad0144767c54c478c9426159784edc0cc5ec14796", - "744480015f49f5b254e601a64c3cb8f8637d2f3a4ea937b2cc3baa6ff876ed85", - "7582f45084a74edb01531694cff097d593754fc4f10ec8d4a468ce055a55410e", - "b1d2d6786b40266f8d9226fa5e70791cf17957f0b8bc173a912eeb3e39503a05", - "d74c5ba3e33581fbc6fd55f985a83bf331859567003e6b0863ec838ac43b4031", - "ff0f0c6c6ea2da27eb7f1f32c1712bfc9ab7a241d9919afbaafd91aac1cda957", - "6dac7213481086887307b35598a8aab82ead695efa2064808f843026c0023967", - "921d89a9c284a6453c440df45612c800c5b980513dd0dca0844a5a4008512611", - "837b980f8939d76b9acf4a0c0a26542613fe431f3fce4a0b0fd6e46981ac7619", - "d99a909a3184e5656cf0b0632d4fc1617897e85621a2d42cb11cfaec7f9aef9d", - "7d02498133107b6990b5db961792a7045c48a0d8bb34046ead15a3274ffa4c35", - "83f0c17e810649b041c6422bf71e7853bb2c4d07bbb11a8c6d54fd514072691b", - "24b68c51fb1e5d17703d8226e9f07d2a15d132da7fd17c63dd001511dd296c15", - "946321cef1a2649bce90fad163fc12cfacaba65fe9f28255a3beb52a6cd54c97", - "ec785e8d1980f57c1fe94734c082dfd6158dc97c82d101f92d57027f938f6d82", - "97fb5da3ba5ba20d31516e491159da56c671c875d5faf7f14f0c5cc0893daf20", - "d16cecc8fe04ae707873f5efbe8640be926ecd3348cd18384b560b4aee64f8f6", - "b5a06a17b3a1f7fc13b79862819d0251c4e3e8a2d2adadeeced58c14e43719e8", - "b31446614c24e6de8c81d4d0a02186bd882dcbb83402541d4991108054872f9d", - "99a1d61991fce7609f16985bec2f5e3118eb4d29d2a165c1083ff310b445ae37", - "5ef96e72c5f0c0a265bad5dee64dc1410f7e7db230621bd66811de99df48f95b", - "2465e7a069bdd9fa9b41ed3337cc0ebef8708e8611b2ee73936a3c66b35e9d12", - "664e62818d749c58150a7b58ecd323c83a3d5d7f878b0a31e4405af0b444e5a5", - "2840488152d9d083a229d9388f4e6bd3fde35ee2df9a83055a68d996d926c1d8", - "aa440e775dc5f0bab1146f3efa286a040477f25b3e096abe090e58c5734f7c3e", - "60c65e1770061f29c444502dfcc59e7e549e0ef318031495837ac1eeb8f6113d", - "e3b2d0387389487eb9baaeefea4337def872407151d2f2e06bb4b0f077f02ffc", - "ecf6e5fac9be478c5f3990b195eba63a6a01b7f8c52e1f20a5326733340dcbd7", - "c61ef82c283ba17ce57a6bfb04e7c0a3e0a7963a10281582b0c49f2e12da561c", - "f7145fc9c98d3d058d5f87c80c44d553ddf3562cd141d4dec4f38e43c70fe5b4", - "459dc8088b01081702b1409c4412c0dd7730dc831ba99857d8104e51e28d7859", - "8a8d87a6e8ba7c42cc22d9da92056f259144e3f90d393e94afbf94dbb86bd04c", - "23c79d320fb95229a4180faeeb202e3c2520c7a3883472643045edffdf260b05", - "3faac23dcbe34db54a51e6ef7212f4c5ca923dd83ce112114d031c427e6cf850", - "dbe8882b5274abe2314a53f372fbddfd25e6c71cb78e5df2f921d9c869e68a28", - "2f18b12bda1f26a7ceb9a1d3350950b99de5a381383a925f6fa64793267e5e5c", - "dd18021d6510019eff8e22a9e9f91ce8da885c157d6cc0aad86131d01f8632cc", - "1825d0612f7f05dfe0ebbcafef343fc5f6c3c46e08ad071a8a079edecdc12761", - "b8b378398e49a39d09b82fc90aeefd28e7ee5f391b1d287dc213aebad1a2de15", - "677a37a6eaea7484f28bb82e43f900f604b8991e0962401e7d36bddc033a61f8", - "04b5be47938f185ca4e8f90f9ab75c7d83fc09ffad2bfff4aa1a3b332622c11e", - "f18683e4d0f0ea4feb1f309bbc1b8dc30a6ebc8501d3fe6ab73c26b6496bd3a5", - "07bb0df101fc7f7e24f5835c8a8f048f619edf25fb8a969509fe5b250e57106e", - "536738969734c1997cc9ec53209dccd5eb9168f9cce3f97bec76216b49b2c45b", - "d8f8a4d318eb9f237d1261745593fca1b639642ab8cafe88a21a43f72658da1e", - "64c986b447c6407100f0fb9bdd929cb2aa4717ce28ae772e2ba3771ca677e761", - "417012b33fe79291180b57523faa00cd196fe32704eb6eb0360280da9f03c10d", - "38a70a98feafb8c55b513d96bde656c293e51a4d26a81a727d851c2c4d1be8db", - "a293e2e4dbf30af7645cd891d9fb6ff2eaa63adfbf71fe9d7762f0cb8e4c5547", - "13608384ffa499bc19d31978fbf0a0493edf858ef3e0806f5e1e57561873c3e0", - "2309d5c375dc0032b9e1a83b1f300239b93bd4853bf516e6f3c0127e52aeef78", - "4a11286f853368d35cd2303ad0a7f92958852453df3e18e243304c7697208092", - "62734bde4e06f0881ac1f550e652e7c2ce90bb41abb65783005252a06994593a", - "3f612c19844b4a1632b47dbef63b53fb9e9a82c91c152373397f53828c2edc4b", - "b38764801d522331d20aa2bfd1be33128c1c91b3c59418773b38c8af9280c2c1", - "142c2c3b27fd4457a409c3a656ac1c547f47c18d764774e667fa14454b5cc5eb", - "4d31a9dfa837e6cd76138943f11c75688ee317a3ea407c5a8b129198513e8a8b", - "40a90ed5a83aeca85c74c2e5407f1de14eb6f5bb61df834ef5d435ba681b1265", - "2c4ad49044afae17e3a9b4f041fe1ed261ad695cec3305150c7701f7ee77be91", - "c09145cca48665873356899aca10629da31f4e7fa39f19173332031bf7cec1bd", - "3aed1ea9536b7f2f10913fa1a533b2d3eb98e72d13ee275124bdde58ea312508", - "2525905f28bebd012ecfe8622cfa86fc1fd5a9da7a0bc0a726148809d1147bc7", - "c7e75bd37a3346243c0f77f4614432f6eaf13387182d1f6b8344ed70192887b2", - "7661c36807ea014cf187092ec44362ffb54c01bf910bf2d6100af44e908cc329", - "3ceb720857ddb25b2ac86919f8f92eb5f40dc785e0569e8583530a2fc0e93f2a", - "0bef6eb12849c03fe9b9570d1d23eaceacf3ca1a589805e4f0538db60df2c815", - "55d07fd1a90f3202ae6108d09471f547794aaa952c39b91070e405b86ea4fb0d", - "b48597ffa85a8dd48d1cfd5fdcbcef568e36006bb3176004bd6c335dbd29d88c", - "61e42810f75009597aaf32e9deba9ff246535b26464835997034a9326c78b5ab", - "e73735d33cb3e12b84f98f8505854923c29cdc13cc9e556b99cbc9d61e51de7f", - "143607e2ca17a9027ae28e197684695d090d762c71df095a66dd3054bf7a73be", - "9f42b69fd981587662e937f23e38099d0bcb4061e9fcce508bd38369f240b93a", - "cf6f95fb17a65f5d7fb1d37cc5368effbd84f919a25597d88e5812e6e048fe6b", - "2b91e4d4e4af8371b3a5e5a8142dc36d39dd5016d7a311add50c2b0cae120f44", - "827d6413d55e74635f7e8d6110356f47e100bca3e3526147e50eb1b90b748de3", - "1fd44a28f4f98974fd0647550c8da11bdc45001aeebe086361fbb5770295947c", - "07e6823fa9341816b3f544be791833a1fccd5ad22973f3c09f9625e0f1c4ae78", - "4df6f6c94ddbce31273fc8f2953e791b574fb56fb0e308a742ea05dba6f3fd87", - "da22beaeb92fb215f86a54a547eab16da25b5bb587c9a4740c6e991fe8f9e6fc", - "36c17fadcab9fec2c9c911a1a1830ce087d09742a9666fba359e542034911534", - "bfb0b1cae4617cafc3a8a0fcac9318a952e621865de210926e095e02fe7d3373", - "9ff4f1650c6b3574e2599a589f52c068a87d3b40cfe22b1d27c3480e8e49b605", - "699f6574749c03d5bf79a7d5dd09eeac5e14fb30d37ee64db2c81a4c684fc880", - "ac6b93ae928bb4b4b62229bde339323bda2bde8d59d6f77fac6e7593cc0ec816", - "922057482f3ef14cac34fc3e8c6646c09bfa744e5dd65445e1d01d4824e7c620", - "c19ef6189fdbccf68c57a80af6c76f1a60e744e86a7cfaaa50d87079ad092f53", - "f1166840a4d3fb803b5b19803badc5c14f62e4ddb594b2b096f24a6076b5ed8b", - "5cc3929dd82a0da226ad6cc72d6c4c9074c562e095ea8dc4f50bcfe64509aa45", - "d74a2a4914197955eaf617d0f642cc2870b79919b8ba7c26801234c45692da09", - "cc6bd9a66dfbfcd7df34c78b0b84fbefd24513d5d2d96519b09499de2973b34a", - "77c43fc42e4fd3d6aa688a9646fb0d109631f3e7a52d16568094565e597ab7df", - "5ea662715d88726658c6cf4cbb4366dafb2eb9effc14f03b1e946145fd887271", - "7296a4272f1547efcb4ee925c95202a5b7f58fb91ca41ba05a81e1788a477df9", - "f6cdb7ed992917176d82cb0a8c16ceb42a69e5b6320d52b44cd2d2768dd01ffd", - "219bbf3813b0c6a9bbc1e86cd39e25be95ed6c6b6aa989e6ade747d3ef49362f", - "4018bc2da0bcf0c77abc37f4f575bf88feaf7314e74e37bf6cbf179a867b082b", - "0e4aadd2c8fe74a6e3880c38db49d5463e26521d9769ee0d67b2d92528c39bf0", - "ab2d77b708c95bebda027b6bd3576814391ca654e768a4a0e23cab4b32dbb772", - "9dda48b8850b4866921954cf4e98f14eb2177c33e4801039d9c187655754daa9", - "759b3b622317e56c1993b8286d168bfed133b3b997cf88040e4f086f9a23748f", - "cc4ab94d27d55d0c74547f9e696ccc4dffa4dfddc71e9da0f471a6d49ea64fcd", - "c20b05b9f6b162b6782e45b24dc4d7ae2a318cc72e3158c1e6ce92e2a69458cd", - "cf2a2476b8bba012e95d4c6eac3298c9280e9d9d803ea0aebec3b337ed0b9fb0", - "f89fc8fc98ef0003a62473584cf9c1f9f41d852d01752902204f7fc8d96ba6cd", - "d8736fbf43452e145b675233c44101a9b8d7865712e0f26af54cc79cb9f7c542", - "e0be25e5aaaa714d209665346f28dcbcd31c1c0cdef8021ff374189b3adbf4d2", - "043ff12343341ce7af0707d7cf61d904b2d3e3f1dbae45f9b0162a1f2f1e5e17", - "9292b38e9b5dc29849f259e20f038e934f37dc78f73dcd3d777b25ff5ec1cbe5", - "4f1111479993719c2acd8228b00f2e2f37fb25b4b0d7185fc7e5fd1d2de7e682", - "84c3a71695ecf7a8f9ec0839cb0502497831293b144d09cab8f9e7929d2291ff", - "fadfd26b8e858131b14746454bb98b09b7fc4aaf699c72a5bc3fcc4f7a881e56", - "7c9b8e51990315b0884fa63ee1e300904262db22ee08fee5fcf6b02cb5f8d96c", - "c4d8b1d03c2c8aa30ee05937ce5a2e339d29d70e564033efd421ebc6cfcec736", - "ec7d74fa4a12640148932481c2daeb6e34ab8c032bdb8fb07facd75e8fa20b5c", - "5d99a90b8da7c6d88dbcd7ec1a3f8c07d5fd413acf3546265db132028d492084", - "72bc4a79354f90a90b6bb5c163546e4d16aef81dcecf70eaaaa38e3dcee4e1f6", - "56912a2575f22535498b8afe351d60b3b33bb9a0322dac6b7935e97096e06916", - "dd965c6c6b83d7c5e0e5e208ccb8841b289769f942ce261523d54fd6ae6c9165", - "8f925ee43b63e9dbdded6a9f81fc9c3bd6ac2f35829662964c31da4edb7657cb", - "d8af61e7dd88d36872bc48abfa6180d2cd698608334d156fe56ee104f3461ca9", - "f130c73e869ba18b59839b206fccfa6ea9e13fd1d65f1f51028104945ee1113b", - "e7811fa279980c710374b8fd39e1fa35f1d2d2e4e018c02197cd44df06e43439", - "d86dd475d57a1ed0b2287a9c59c2ad3bada9767538345bf3aa5e77891c3a2cb4", - "867ea7264013882c472847a6ead82efff5863751c6b5c3b1873dec140c9573ac", - "6dbacfdb5f3cffea029092a07cbe2558b54d882bd692c477bdc5f5bfaba6d346", - "ba5dfb711c920af470bb693e67a75d82d7bf5fa4a689c53bb712c34e1298c92f", - "4ec9ab927ac929bdea8c454fb0ffdf6b5455b55fb2a6f209e549d656ecfb4ea0", - "d53bc0adca5196d85c96055725c51e25a1ab8532ecaa1adcd30bbb55335fcf60", - "e4594eeb94972463b6890f67b9ca06fc85d2542b652b92e239ee4b6942873ad1", - "83bac39115ee01c391c8916c5f9398574412794641685ea763ca3c1f2c1a5756", - "dbf7127a988d4d998a76b2379dcbc42da1305e12134ed4ed6378b65746d07c0d", - "913ade0fb5806c1724caa95df5aef1b6230c26ba494be51605d37b3cf31e30b5", - "a69e9a753ef871627bb91f1a80a780e38ab76be21f5d43af32d5e35d30ead398", - "47857c9ed7d2e4a6cef98ca777f16ae6ffe6de5fb3a8e46f4c18b23404c9bd9c", - "8d0e1403225897f1bf61a175910c4bb65e6e21404d9bb1f11ec91ff87289ef90", - "1fb938087040672ce9e33697462b656f7b1c4f63469a399b881a49da01458846", - "6dcd3efdd045884b57717f4de218562b9140610880158ebcd4f08221dcddb0d6", - "331b18b17dd8235c3e3bc8c506abb410ac145ad74a4f38c4ff381de7bf37b6e5", - "a7fe0ac2e86e46b802506c66820ecb4185dc0680fa857a5d2655661b2130bc4e", - "591f7d91c685c5ba6eb1a2174ebd693883bb089784e8d95f7697ec7b99f23647", - "497c854954085e0981c7f8e0caf319cc46ecf8ec4a27e964047f357b847e4d11", - "d8db1ac7fbdbdf6c8b43a10d9e962c702afa64ec8b62bca32ebabdcb7aca8de1", - "10a72fa2caab91572c368a2f9f3845f4fdbf9f164a2ce319b50fb260327825fe", - "cdc1f30e6e50a4c131b1bf4e3029d0040fe8af99920a05170c02765c571683ba", - "74060fc12062f46de3d73627889df868af9584020a6a441dda45c7a67f872b19", - "3b56a7835421d1ec94ffcfb1ed08f9511350e274446f23878a215066ef9f3303", - "a6b42a5cfc2f32c2636f9197aecc55b0cf336e8bd41518f93243290d8b63c4b5", - "9ab863b0448a3b8ac73e8e6efab6caf3015e8ac0e99159650d54c837e15a0740", - "ea9b279bed94e6f2de9e011c00d8fbf703ec579d210c9b55add72d360066b3ed", - "9b05880b0e5af3eb0fbffca0d36bfb68d6c85f8a8cfc972d0a9af647eb8ef5df", - "441d33778c4b5a0cee298d4be50fe36ffbc1f76701c2dff4f90a829c73a50025", - "b13442f5e9a3a3d5f8d272ff2870f98b69bf198013fa7f13676107ee1dd8acc7", - "37cd81e47714e799f0a584bcddee400bd62ac7d326c8a03f3ffa9e80c342b0fc", - "8a463f23b2d00ae1ea8451ad061b0d71875531ebc819c900bb4007503a3e7ec4", - "41f4e3f7f0d43e614d51729c73efd9c4dc0244a0c7b7c0c1e524151a2741d524", - "44ea7e7bbe70c8c8f043027b69ccd50ac16808b0f78080b7f24e2060fb0fbb83", - "e254985e4ffeeda19099659685a2611e7152506ca54de58ab05e0ce1ac85bc76", - "1069102f21277983e78cc92c066f9b5e2682800b4722962b867c94c1e798cf9d", - "eb5de29f3d14f76161c3d94c5296fec09a3d8509c092e7c334a027451770e5ac", - "bf260544309f75c392c7dcbda22ca19a148b1e3db99ffbfc7acd0132fbd9c2e9", - "51a240b954eee2391464a0eaf6b265b46d1329b284a4f7e752390504ac38be02", - "76c492a623dac80e92cff237d44ec3ce6ea6356ae48d8ae1bcd761a2ee6068e9", - "79ae9a1531cd89d51e077c962ee698b6f0246fbec9a0f7917ab4d56c47828be7", - "68214ea0fcc608720396e658b482272db7e2898d5ef200d371a0c4996f898002", - "69f0d648ce7106e4b51086b96814b3acf6ba14a6c154cee5d6fa4dd96f8f91c5", - "a3993edf906b9cfba8d89eff9c55699d0f0eeb24862b8115d4f2fd764eda7107", - "229ff64612d2a136693690ce1502a510956ffe2520676c71d271e0c252b291e9", - "ae27ced8bca5ff2e2fe0c64bf4a6903610c2b738723a508aff01179d0978e9a5", - "6d5da89bafc71f0cfd7f113ba08fb38e972abf5b92e98047606e2bedbda1f84f", - "7f427171fd4d66cd5f0cdf0afe20a102acd4bd8d0626182a38d31baa37ac7dae", - "af1bfa5fe3b1570fab5c7c0564cc78112392c1d434ada5f6391a867ad08b0cb4", - "be70dd76fce8c4cfe6999ba2019646547b63d7664b4c543537a11fc1adbad5a3", - "52b2fa7386b4d2b9e8f8422c43d6237c6e380b3a044c16c2be22d2a4dabd2114", - "5ecff641ba61befe1f36383dc417d3d15d64f4c5a67d958c5fd91d8688936888", - "48f7fccd7070694958128e59a22cd13dfa4fdf62766f156144641e928adbf3af", - "2c2a9f895a86ecf2b030d8b565e8ce9769cd58447edd6de81173e958fa85435e", - "5e3e7246ec57acf72da2753ee3ece5a4e9b59f5788ac9fabdc9e4839542ea43e", - "ee85433639bbbde61316ca5c91c686a01b19298aa885f6e383d90ffec0689ebd", - "77d399d2666f23ec70d70388bba539ef44e2122a2e7e7498f2911ae82f72acaa", - "68d03aadcbac4634eaf65305806530c49fc6ce8a20d234b080a46f27cb10eb90", - "0b1185a6006838d9ec55a4aafc65f7d1c6eab1abc68d063afe89d8d95d759ae6", - "31e9dac08be20b87e2c88792212f3751ad36504a2804781cdc27d7bc84c9fcb5", - "afaf1249dd84d940a6fbb7f99d68b3dc1844440be0a0adaa424793013d98636a", - "e6756f5ec078591dc9f75ce3552f20fe6dc2b294d274e260779b0db681f080ad", - "cbdabee72bf08ad30bbf4e8e23c27e2f2a0369a9a51a374fd78bb98326aec04e", - "ca1b8f2fad6e25d7d548666df09da665effdc69529f279a7087eb157cb573ea4", - "97160e2ee9e1eb2fa8e6cd4eb850192d4f9bb1952d19c3addb01d5d743970ef4", - "f2d829335fcdd43483f0d2a3c637729663978ec6b9dd31bd4a59819075065c9d", - "f2fbe2056fc3e251c7ddbffe25ed77b0f44d9491ca784679ff68c2453ac2af99", - "4032eb69a827dcda3f3702504a49fdb23c56f34ffdcba5dddb4725c292b66273", - "89c47f9b2bef26f932528e6941d1fd7e62270f52cb0645c2177a5f9f55e9d854", - "eb5202c4e62d1d03023f40eb152aeb46cf8bdb951c53c838ee61049235b39b69", - "f85fa4c87d09526fafe92e54e063c366f78387f762e53f1191112b4e7ca51179", - "f30599b775d3804e5c4fc79e6e133d73aea4a8c40864333b57ce1841ff92dd8d", - "77f65ea13b6d51cd55d7df3c1fbda056a4d111c8ea464bcc6bee6ca5f9ebe1c4", - "df66a431ba8c74614e76121c14f976d9c115df6079cf94a75214d6eb65d9fb9f", - "292d047e9c69d887a33586beb98868efdfcede3aaa598b8c8c379d69fcfb1779", - "f3daa5a460794257b4de3cdfb5b45be8c4e865bc3db236956003c7ee13c82866", - "6c4a8c109e27a9a85106642b4ef938a59441d6212c33fdd2ca169bdf841778e5", - "f9beb5ecf087347c1d5f77c105de12ee560adafeb396dacc51043969fe2bcb4b", - "c2c9b53f5f59a219da663cb8f21662fc6c2eb2faf0bb3eb3f67c1dac69269b59", - "3ea21c08e9432a9881e8e69f6efac99a8280e97455661c3c8635aa133913efbb", - "17c1cac0d6d4800c0c78d2a5aa5322b88808b40bfd4b88c0dc384976cb910845", - "418ab550adebda52eeb52cba12278d19c53a45f29f9315017487cceacbeab3c9", - "a521a2fcdda2cb9b8d8b27ec4ea0e74e7684b0e18ac2d56708815980f9c0d4b3", - "7d278816bd2351f6309cad30ef9ee76a90676c67e6a2a9fb43d41f53f1dc60ca", - "7d416d33db513b657a7d6787cd5c31a5769422e5e47e415c72557ad4d080b7a7", - "cf8c753c46f3b967b30b959f37fe67005f3f348f9fa2c918114f7fcdaa1425c7", - "06c3323efbaf31f73d46b6863df5841e018673460b3482f4fd54e5c20ee3d36c", - "25a27e05592eafa0273ce015302356c96e4180b0b53eda807aed7eee0873db2c", - "8cf4df03324225c2c1c357b6fc0a078347a727016b991474b7335b7465de2857", - "e103504a0ddaf4bd84ab1318fab2492e7d1c26747e396d9d22c2bd962eabbaad", - "cb82faf637c8f1369c0d30c6e3628724b158bb42a05aafa735a6c6d8b161aa02", - "c7f1710b6162fe00d5e77a8991e7b382f2fb23ec7f511ec61d1a28e7c30b0662", - "972d7f6060e10f07f907026bc129db33b5942475acdf23a62636d7e2e803c4fa", - "11498e508475478af3747ae3558c4635ebb10b2b41816e6eb690310c74c2a568", - "f596bf6e433547b6868bb32650f8d501813d8335a0358eac888b5230b9f01542", - "6b075a3179e5ce10ecadb18a6113fef23d4d4617b3b7d9b177b2c03f08a2b0cb", - "ec879a73ff6d85cb4412dcca90c9e93b5b22c69d8751950e9dcc75249c4df203", - "c5c2e3d6474b513091e3be32223cbdff7ebc50cd63046640761728a226aa6c74", - "8d1cbd60f4b8cc7410c88fcd6da5d16d025fd32ecacbe7218931847c356a75db", - "3aa9297f772f86accc37eead1ea2bc514809c60e0647b71fa9fb3527f692924c", - "6ae1b8d84454475c0db71576ba008d7b993f9f10c4d619640853018fc9b42068", - "85fadf25c51f66904722111e4d92291c3283f4933ff5d981354ac77d66e5c747", - "7372ec81a1f5f7be75bb04f0cf8d29651c549e8de136d5724e696d86d8840587", - "4e6020bae8ca5b13dd9bb321c7fd47df8e01a0dfb93d2e3359bd4d158a980910", - "e98f692540897686121b0efdc9ceab6ea7ccc2523a19d33cd2b21605abc4b5ef", - "79a8b40d9872e264fe19db67bb340eb1c29a62e749ba71cdf11b8ac8c8360e42", - "8ec5ab6fa8046d8fe0da803f0901ff00e7b2f823e99ec5716f0f1bae16bf84d7", - "ed165be3e9f2cd7d00c5a250ba66c865f8da7bff0bbbb23ad85704b654518c92", - "fa931b64799c805303c4d882325b484ae1fd509f81fcac5f86cc0dc20f8ed6b0", - "aca92853c2e6bd3e698dca08e63de619f4c4bfd0fb78ef5bb56c2c2d8940ab79", - "67652df373e6f4bf8dec9caf6b2c1d5156f0b0b26dcc4e1b4d127ab941e25531", - "e34d954a570e46927b301a2a6732ff7e39021c3b34af42bc97ac0abd276d94c6", - "c8da2c399f08136488947434749625ab56457f5b5bfd85ae64df5e881e38c3e6", - "388a5a4df7cb654ceca14a22d703eaf3108b2a8d49ca8f50e24b944ed6f03423", - "7f0fafab1abe19a5f20621179a3b42fe1eebd2d8d7b3bd8c701627659a8e2b89", - "f99fbf10cf38a7f99a00986ead6079aea9eaef2f6e55242145ca9d6d552fcd33", - "83e4fa9c5cc563dcb3970cd22757e023b5ac5006b2975a409811d2e70ab52ec9", - "4aa9fe71c30883c4fc2cadd6274fe31a0d93a4a79bddce053d4d3a2c31f50885", - "e1ef8c210819719e45d17645a3fa11541baa96e669f6ba59a66f3b4dea53833c", - "5ccd1394bd78e1ac5cd017113b026c1eed142cbb1d0f2eac1be6111c23380a61", - "9cd545190083db5ad35aeaf5dc4f06097af354d951efebb44f2130c60d56df26", - "0cffb26679747fc1209a74e97f5da2fbbb67347814afefd9931190a451967932", - "59dbf192b90aece451752be07fca6e93de5cca78328b280da219d04c9e25e7ab", - "b22db78d5866d85a6389b1f2c5ba28e2235c2918e41317c649e34f1f6aa06932", - "5d9f83666e8fc72dd0d0f1dc8fd8d85d209547f87c6f650343f393904e562994", - "ccb6d9ac545a5b0ed3164fac9d37d9fa357537ac8f8803b37d1ec4f1ac7d14cf", - "6ddd521a40ea704d4242f1d06883a499837d6903568ed72a6c2b66c8d5ca0d83", - "cef062e9aae53610b81a23daa553bf8218285a34180718c4a3ac8916cd4ed7a7", - "bb61898f4c869f5ff06d4cf932fbf5350f724cdd18e52d7a47780584f7cb55e7", - "9a9bb151de7c4daf6f6778d24a6a9550f2fd1cd9457feb4fecdc7c82804a508c", - "e8e63074d82063d38376936c8d9d3b312f2aadce2500fc0341ca6a4a46f56e28", - "519bb546a7e0a2d3876a9393f4e6354fe05461dc5a55e50a65f7cfdc211cfe82", - "39c5fadc0d1d6037e9312d69ca1efecb197c99fadcf0d6b45fc5cb92df46a083", - "a7eeff6dd2b13b0f4b3aaa5c17dcbdacdcd3ef667d0a923a48b7df021831a9ed", - "c4e2f59c86882d4916c7ea2fb340d2964059bad4525a3f02683f3ee12c12c52d", - "3834bdb7771419be2ef19834809d3b2565215dd8b7927ebcb6df3a90faea277a", - "de801584766b64725b429dc2780122d24a8088ce4ba48241982d1dddfe479d4a", - "87f8b38a2fbfe7e81d0ce96c25fc6545dbfc46b7d2947d7de99ec732f53cf9ff", - "c486fa3a1220dc73253f64e455a9cc184c6bf6758f34616755178822c24ead00", - "65270464ffe1ec1caf3954a24274a5dcea62bad048b0f99c01334ac10cd9e8c5", - "adc9701c5688a518a208e78c753ba159b29737c5b2b17c5e27aad3bdd3f49660", - "447f7a2d62edbf774afbc9fb3889a260c5e9ce379dd7277b761e24d426129c97", - "b7e459d09a20d88115b465af53d6a063e820c7a3c780a2e366163230db1c4bea", - "f463efa86352be499f33ab8ed18a33e81eb3aeb7d70808549047f1c5469a6818", - "0217f8b8a1fa03a50aa93c1bec89a410708169588984ef93e0079c81c23ea900", - "4b7372d81a43543614b5db38325a119a64e81b927531826105a4978019b5218e", - "96a80fdb7bc5fdeb6615387f0ca05ab88d50df5d6873ec028285d62258e73292", - "b95b7d8a2fbf09acb743c5f4ed3185803b1902830da965762c4e42d47223b9b3", - "da7caefebf91961728b2447c40266d63fb279c95c09aaa641f2df12b4dbfec52", - "95cbe4c0bfe2da8f7a900478f8e9b42246bd251420162d4c2b670bc2f6b80a19", - "6f05890ea8514bb682f3d5527ad836f60836be835f4c9fc73899c43a85765754", - "657563396ebdbbf9508280f16b500c04a6005f2c51f3d449314632c9ab1fdbed", - "5e4a58bbc5fc6049d5f6394b7bcab077f50220f110c622e4288b5a5cf17252c7", - "812225bb0176228782d47b461ab89ef624654199ad9049ad643b8d443a2a4d33", - "5075366952fe633a609b75217b7056998fc5e87ce04725591b8736bfedc1d8c0", - "5cd340e1351cc6e17eeccd286f4cbd1a165cb1cbc4fb2a30d756092f1097ae37", - "839f74c9d0aa7c1e81592e055ca4289e48e728a68c3a32058c166eb0794f3c04", - "a22efdf3c786735b02ef96914f9a1e0e8c70a6d506ce4517a7e916471dc17b4a", - "61543093ec919432521d99bf818248299dd1e9ad761209b2a3966eb3fab4259c", - "2dcc4012b5aa22da4d1c6b842989cf02dcb29fe858bf826b6f5a30af8c797660", - "a4a9d3c3d052b23080c8c0265e245bf54f5816318ec20e937519322a67e458c9", - "fa96034df0a7e6a622f0a82c031c0ff3036c1c47982cb94d811b52be36d15d0f", - "4d236b9032a3a3ef09d3ddff6eb2d80bc0adad78a717b4ba74504d965689d02d", - "1d7d15f858b14d431522b931d92896bf7d23b4156330e117116f74584dcf8e36", - "f689484336e798c553388687520d8dcff8f8daf808dcc2271009ff6237d44b90", - "dd12e305f00bbf92623e0eae6ddd16cc7b8d695891160b6e8647bf06c0ec9086", - "83ab42aaffb20c7cb1c101828df58a213112894331605a73af5c7a82dc5576a4", - "8cd30757c806e488ee13511cad42bccdcdd7fca791dd731d3268239d2e7f18ec", - "d9a555ba0d89bbd0a777a7b7b3d4c4a47e150b70661e020f8a1a23f54a47d744", - "a56e0f0fb438df641a1918c2d89e16faaefbf0ba92f6cc1211c50a212f0fc19f", - "8fd33c1dc8364da04b7e7137e32fe2d5333f019c673d4fbb4a69a02007ea1ffe", - "f5de2ec999bd96ab029e8b77047a9af124276366dcb3dcf601e7ad2605a1c1af", - "ba4bfeeb874a15b7c5f61244c5f85d9a5b031bc655cdb9244a84ff6ae9b0b140", - "268870ddc937e838f503c5449bc438d7d902e894b240ab1e4c91d7d646d1b979", - "28de4fc810ea8a34f7172defbcc84f87c7674e10792167f13f35010546f76df0", - "0fb32d1b1e57bcf1123db8ffa789851cc78869531492c41d3899ce47e4ad2d6a", - "e2d160f1a8c9e356609b21eb5e573d8796bc20d9583bfd4471e96e9108e3e0e7", - "ee3c2d7efbbee5a12b37a47a3040cd32de6ac70d4ca7f979e0ecaed4b41d1a93", - "6a49a619a6cca41ed8c5952b20199ec33c6a43d5382443ea4918c84a67d13748", - "31916001224793007e612cb84183e960fdaf5c7357cea5f2fd8b44272fbcb34c", - "25b8507524664d74b5013ea6dd1b787e016934339672b760cf47397e0291fb37", - "e335b24d8d7af351588420046e457df0e8122a2b7244734ca49e18869e8772db", - "481958d581622121e80b90aacb4b142206763d8d751b8b042d5ca8175695d51b", - "8a0b8532e917c180dac8ee2b864113bd8b0e8a7c4e574adb753ebe42b5c5eee3", - "b646da73747a117396e827751b5ee405f948df96590ab5fb603af8e76b61d839", - "b6570e08c77bf6be8c01f6b9537adc00a0d2f3d4839aec5ed71b952dffe3bb50", - "acb3a12d0a60452c4361459809c75f42cc2543c167e3a0adade4acb25647d8b3", - "21ca83db3373b00b4c39d05552c6b2f949c4838a4bf035ed29bb7900214700c6", - "baf4de065601944564e80d2510e26dd6f0c5dffdfb834289b285af3c87577a74", - "46e1309cf4c2a66e4072352b199ef7a20615ed3231df42ccf2c20019c66e6dec", - "9cd19251dff316a31c37202687a13da24342c5756e15e9da292c7356868a50d6", - "83720fa873c6a8904374e40074d18fcdb52ddd8bf472f34931bebb037df8d520", - "fd7389e500ad86e05552a853719b96884d23e89498660f1c1e6e8e0bc3e4c6c2", - "673671aefca21609235724ea61d62d564f0ab19b7c6b6fec19fb4a8ee7830872", - "a650c9735a152c0a848c23ea3f54e52d54e83eb8cff7aef4288df20554699735", - "30d608a913503035770ee3272d94a42663cc2ed8310a7af13a430cf099bccdd2", - "72ad9dd52ed858703acc0d7d3aa7c3e931c5e85fdcc1889fd35b17f21f53c6ef", - "0f2a523ef2ce7678492e4430f393558ecd596059d41261067dcfae0f85cfe052", - "98fbe034869534fd4b7d734c887f6485a2994db6083ace41c3ff76500ead399d", - "4b72a28c72ee777a9efef31c5518c2b5cc7dd3e8f36ca3e8d274047b2f441764", - "bd3e29c65d0042eeeafc59293ff6fa4c98082ed176764057b7878c9ba1e6dc7e", - "5b1e4eb30767cfb59b369b10b402da6f3cd3325907752b64c77b856e38695b02", - "8ce6e9373fa7f0ec2ed19556f186ddae00026c42c1a0031e864233a94dae01f8", - "9961f36af545647a5f2777250825e415af40be36f7590f19a14a819f77875fb6", - "c722ee6f6d27d79cd353a1c41a94d277de1fe781587d29a0a5943eabe585ac92", - "bf99b4ad1bf21ce2fda9995492ebfbc29f84301675eaa5826c3f7b6a3943ccdc", - "1e1d4a57d7f46bb1342c6705a8ad3189e6dd2f3070b7b5b0a9b470d1e2f92eca", - "507b198699487509d641d89dae834223b8466d411e120a76d536f814df08893c", - "5b639848e8c03799a854792446a7fca15982c52241feb3dc8311c0ed893b9898", - "8c7d0244f5717f31051fc3a142ab583f887547cfc912f39c192b069020c0ff78", - "b2ebe153347f06362bfe3b918c4a06a3c36ddc389e0ba153c97f3c5d8818eb19", - "b15625bcd419514a469c973dd701b77995776eb6ec39eacf42515042ac72b95d", - "fabc75fdc7ca53818babe2a45c63282dc98162f27ec79c50608a387626ffd6a5", - "cf80362cb18d07b0350f95427398b84f34d8a4a870af2e9a3fbde6422a7f9b4a", - "c90de82a81efeb300f974bf11f6f03a0b9ad29e9af0e598606563a04af2c56f1", - "1c90d380c21cb9ef92bc316f1c12d13159b009df971025d81d4e01dc1d712ce8", - "9a06470a3599cbfe85a4eb73491f74a199861a7995f2248aa7dd0e6537304201", - "aeb67566d1842f2433c8a060dd9af34242f383d8f13340fc72157413596168d2", - "1e1a55a84bb39a75982884de3b6ad71184dc098aa1bbfe6c1168448338cac3a2", - "de4a3a6b6b01e3869cade0fca1a7ca8cdd927865885cfca477975fd1b705d6e8", - "81fe7dc6f7b0b75f84667bf1776cd7b67a8f3cb8f3b8881fd185d4994fb67ec1", - "4af222ad4ad95d55d1b6672cfe5cc2f4a204bf5cbf67a5872a6acc0d69a57f04", - "f887a41912451a1515634601e67a71df741ecafe92f6057f1b31442db61afa2a", - "6b51a7eaf59d1db294ac0a3cc2cb4bfec6c0b17563ae30be4a5b8402a58a99ed", - "7230912ff37c9134b76d87fb09bcf0358f8c34c8fcb370d38c51d4c64bfa3114", - "5ae87e11128bbc7522a7308460b899355a91e3f6e3af276daf1237a7bcb5873f", - "b5ab9a7f434325be1190ddeeacb845969e8fbfd021be1c77ab7b49a16ef59acf", - "892669d5b21a1d924a2291a75a9c501fbe5d533945a2ce86f9cd1e8fa2909aba", - "c8ae8869f2858b33d526f6ff562e82ee67dc2eab199f12f56919ef9747aa2dd4", - "023c4f201e55998a8f058cbe1ebac4250676704b4423cefb539d927e2e6596cf", - "0fac7d10349d02428c0ebf99dc590ae7308b20a050048b58ca6e7a79fb7e3399", - "286362bad551b76e84ec3b67baf677a3fdad8a2f26404f3861fe6dd568e674b5", - "25dd577cc0eee87484cca636320881c6518320f65d882684f58a6761343b007f", - "9ee89bc5db084d337ba7c12afbea4a3c73e22d9755a919a79562c710f3b48750", - "61eb6fda3e59831fddecc368ffd47966963f330e9bd5c97200e8fdb59019a6cf", - "949daff034a7a258dc7e4617939bc4aaa8df484a12c8e7d18adda2c3b94d7088", - "1f6164db790816a129c07a78fd0dba62b710848c8805a5f2c7643cd6a0602f5d", - "521df94e2d350d2dada9724909406b8787846f39e2dc40d23926c827aee24772", - "09e8d48c58f694556d141a4a64549801f1d2278839996a010e75d4ac8e398b62", - "a85e138529c46b165f551b9f2ba205b15c91d63a60e9f6127ff59931295be915", - "7b292b943e140bdb4b9ea7879203d13dcfa8abc10815c5d8a12c16326a1fafe9", - "9a94936a85103e8fca1a07bd1d4ec7214d3732cd50252d440fd596512a07c7e1", - "4da7fbc10c021515a944a04efead5b81ad0faa32391581734ac917085ab73b6a", - "6b4e4ac13fe640ddc8715734cbc3ecef6fd4b7da4766e7bb06343a4d2b5f4568", - "0ba1ca5bcae4215ed1d5dd10f16f431455b3312abb0c868fb77f96169e569ad2", - "f9f000fa6279f7231a6b8301b8d5c715917ac2c3c95e011df92ca7b4e92456b8", - "fae0dfeb6bba48342d3e7e68d91942a597041366dece86d0327ce9af92481996", - "ebf1682790d49f3406dc0059373556cc7c76c80ad5126669d605fe9ba478dae0", - "5f25f78864ef13eef02f313ebb1b55325ff568c816584ae30ff11229c09d03aa", - "9e8bc81123ed94b07ae775dd1c9d8299f7d88c41d59d957d5fc022dfce8deade", - "972650d914fdf832b545aab7ef937ab8a8c899d244ee8faf62d6f1bff5021b87", - "8ef3ecf11c43f7b3df4236e8c0a46c6c28d6dd283795a359f2b2f7e93c690aae", - "af1f0320fb14bb2b80cd67f152865d28737654029a3d38dd81eaa685878857da", - "b61b0a95262fa1b15cffe752330a261395e78d17027f67e7885623fa621b9a9c", - "36db4c37638fa2bb7fe3e079f1483ae3ea59efecff9e102535f1c1674d448666", - "f8ec283678b63fcab2ec812f7e42c2ca73ff2f8be7fbbd8842a08466192d3348", - "89b5d601af002dea54d5e9dcb0b6da247cdf4fa0a694102fb586bd6de146dbd2", - "5c16f9de3f535f75871a70d21ae8426b6273e33d0204617a5c887f879013563d", - "48250fda812d318d49efdf034e2c734122741bfeece08285c53eedf95ef82483", - "39972727ffd0556faa9f2699bad69df6403f81ebc4f30ecece902c5c4acd4247", - "708625dbb0c0eb743f3e931f3a344915b968628cb8389bae7ba7d9567ee9045d", - "6d347ce2992c62877da42edc745c959c9de1025f2f32adc4ee8f062ff9355998", - "c37ab1471d81e88242871426a7d237565e27884d438aa6348b606728df9d95ea", - "9a9a596d59f91890f17b12ce887c536757005018573f2174ac2efb17424fec2f", - "359410f06a1938d1b4ac3ee62d6d81e6fcf1acddb4ef6e5940a5626dfbb0fd03", - "0ba6f05b3f46034cd25d272052092f892e0d6ab5b5c5a6a845e0a0b4426ff7b1", - "0a5533de1859c3cad8bb260a9186f1405e40485c43cf126ec0639e74d58f73a9", - "e6851e1daaa4832704d9b5e95a46de3401d155462c8e923be7837432cc3b8716", - "4b8026ca418236ff02932254b4afa67210327b6cc1425f0b0280cd26aab16ab3", - "7124024acf3636b0c206fc1c0059eb60e0fbf8d0f71dab430cd14623c78414af", - "862788ad3f59238c174d3e25411b673503d7b4e7d30c2e98a2bd2520cad6ba9b", - "6ff0b607dce6c5c6eb11407a6629a51946f1772bf00804529a07e68fb182f793", - "f403c27ea451902b8d3f12dc71a13f84ef4cf75817a20c3518ddd9f00e5bf1f6", - "9f2932e60f40a5e7cf0118109b7b41b6a81c79caeb0f5cde1ae219c5f9631bea", - "3ad63360bb34b61eaee6cd3686321e959790e008784d696e7c9ee4f28597204c", - "a55c3ccc28bea7993bc56c0ab555631db93d5ae93e986c809e55b9f1b4171f03", - "d41ff1e947850577930da4d1f53ae53f5ad8d6c35a1dc8ab8e4a2f0312908d49", - "dd26fd517e9f6902b43c8b612bfe12f13908e1da0f94cfedf0ef4cf72cbc7bf5", - "53aca4b355d8a085cc373e6c67fda3625a7d7581fb706920d1bee495b6734d87", - "8bac4fd64eb671b1d14e13a8dcdae69e804a60627e2b615812121e9893216f67", - "8421115ceb68bf682ac7f5348c8e0ea117e958c045a07bf687c01023de8c23ea", - "ea6aeee529d764dd6363f3f93c07e95a1527ca88c416b677b22eadf1a41be4b6", - "909a22ecf5813384fc67d3042b47d766a62fcd590f1f11df91e258fb9d2542bb", - "f537e53b097df521912ea07eb2703a66e7438d668709a8d311fbc5e01f8813a3", - "565e6d5aaaaa0d0e0557e6ffecd377c09c0de4437c800ed7649e579145ccc870", - "a91e6e9fb43eaf32135514e0731711f46517ac21e2b46d7c9f24175b95105360", - "33332f2b8ac89b91e51b0449550c85c818ae016211efe97bdf1f94eded3d5669", - "0b7678b274628d81d18ea1a1ae68bd88fbed83728fda102b498eb15c714362af", - "c1b8ccc0a022fb113f023b46179468140bdc4dbd32e249af3802f02411422a11", - "836d20485ee85630f71a51189bc634b2352c042264a6a20d8c467a3d4641fb0f", - "d84858babd09c8b2ca4917ea23979478171a792f464f17b7abc11007d5cfe09c", - "23cd42ef89652691f4a3c42ea0585fa0a3cf17c03f47fffd743edf34915faa0e", - "23dbe8941229add6dd9f9b064703b163327f18df95f61f9c54f2af2650c8065d", - "aa0684ebe411c3214379e2d57bdd3f8aa148a5b7eaefaef056f07c598884d3f6", - "2a60269e986afcfa877e572c3fa3be5c8218bbfc03d49cbcc1d21f45a87465b9", - "de9c761deb016176f836b24488fd94820f9cf3e5f75a70188fcee71ee50c54a1", - "4979eec94a8c8eec69e62da1c4be73c19415fb945ed52621f90594218ac5f281", - "7365d8bbada928f56bf1b852528567830856a83586944ff9d4c72f9e0f9f235e", - "17ac1ae5f98efcd6e2e9d07cffa377ca155611e85a49933b0928d79c227c9f52", - "17a87f288216f4667406db7bf1772a50d88c840f2a7f18a902ae6c7a782b6d59", - "defd9681ff259a36d449a89ce96f91b0bf06b5e32cf2e6e86fe996e792fb8472", - "b264f6fb6cd5dff2bfb5e50a81d705c7e473bcefc4660826604506d0a7151c12", - "2579178166fdbcd57af471457a83822e477492daf3420bd6dee080a2371b28a7", - "cf9c48eb50bc777d561dee2edd9ed8dad1bb73d302ac918c5cb6fb5e40b661bc", - "809360803744a74660f62ada70a566d8369e77b02c3acc5a630bc6eb5d6c9e7b", - "01c0e48000c3240cbfcc120b2b44ed29c79b7796870844d3c1392c3dd434e06d", - "2330c7521e5167d40b1c42307968ad814375bc4e63146070a12e155dada733d3", - "3bb4607715de1a55b10b06b4a9e07df7f693ebbd1a7564f0f15c0807764dda7f", - "1cc22c43a2de960bec4d6c0ab18a9e0ae75df81e986ccbd7142b6dc11c4a518a", - "7e4069539ab121b256a023c424dce22585b3bb6590f3f1ab2d8d8110ecedc773", - "6c74565d7f6e7f8b218767432cc9456d8242bbe768da174ae9fea015c44c6488", - "f975be54c892106e6fef62356aad7b1a2dee73b105a6de77beaf5094d0364421", - "af99eb822e1b97ba5993cb23c41330e3907581e2cf07ecaa42c48a8a343a1ca0", - "092ece2a09ae7b2c7971d9a5a6d859f1d23fc4713c5b78e6ef70def7c66a928f", - "16c69daddfd1054bf2f30a0db23aba627bb88e9bd75d4528a401afda787f4f48", - "664acd963f75ef412fd6d373b7a64cdc3305aad380498afcf6826046e67a2529", - "134fefba78b62c4295b7919d0c966291d0ae65b4197e610115ce0deb789b8c56", - "b2b71d2b23c190209ba3cd28303b1ade175050df9313147aeb98fac617a04b33", - "33ab517271361181c60e1ad0d381112e0b0ea87d0284a59853639d4a5384b0ad", - "bbb2fc5543acbb05f0ddcfae33a2f1c17eabe70a6532cd75c5b55ac048a453a8", - "22532eeed86528bf9f179a87810eaae9253b0f0dff0faa088b7a3f956f34fb20", - "fd43f5a70e6256e2cd209fe8f0422fc60f6095e3bb8733e5c358496b6d36c77c", - "fbcccf5fbc04976b0aa8668c83c17c230d53890631c3256341d793344cbbce31", - "8744d1dc2a2419144016782e740f69c99b5abebf97752471da598b687f86152b", - "c955153c08ce492d162ef32e4ea34b0e67a37bdf09cad745a1ca983112b855e0", - "8c305ec2e3acb564ef061ff623b29e0886767b07dfd0b09dc247bc2ec540c8e2", - "4dbd7a80864ddd9f996e6d2bc714a96dad6cecef630169051d912c80019e99d5", - "216aec74533b9f0e37ab4970b90f229f6ae2b36ee2fe2c402d482e418e7120e9", - "ebf45b576ef047e5168870fe4806273b84398d8bd3e8c0a26a7ed1b1a62b6bb4", - "b48e715fc8036773c497da6b38f7d793cf58b73e761c07ec842db15e44683889", - "ccdda6d9ddc025a16bdbd444f7b66e8876415ef309e9f2ea1049e39f7c1a64e2", - "e821b68d42f84c9d1e3c9ac44bbe64c9a6394baa6a7dde7dbd59a25f577c711c", - "521d2660793e65b48f1c5838ead0a2806086b5db415b8f8734261a4a8c97ff07", - "7cec263c3cd34feb77d4e76e790b2517e3898d049ec162ffab1e3eb8e3477abf", - "b1eb09dea53680d1a956f5272c63ef9ee02cec4b00431bae3e6324247b3893f3", - "8549c9daf9420e45f25ee826c78089853e67aefdcf730d95beaba542e4148bcd", - "d8f24aaaa5d57f99d49713d7e8a43a18c1841b3882302c48f939bc863ecb7cd8", - "459fe956bafc580b9ebad081bce21ec34a1c0fd4e80d0d50efca5a5070ad31ff", - "4fe4189a3eb0c9be67a9181ad5ae8ff59421863ec7122ced36eb88177d3a24fd", - "7feb9b68b6f83be1be75c982af6b0e34d8ffa6c0c86efc2e0f2a145d43e26ba3", - "eca1c0e02cf1f427176cd5175aecde2a5c1efa858f73356b589a90c89179fff5", - "c30de1c9d2079ef0540646a07b607a224545076d43699c8dab141d4bc974106a", - "4ef1ec1cf2b5246f26fd514c74efbfd75f0412067c6b27b294e0938f66e303ff", - "762f0c1b4c1d8594c19d21b3347dbcd364ab63913f530a9229543654b921bff8", - "ff49b2e42ae9eeed407e29b16a6bb188334c456248de2fd73b5856bc0de42f63", - "5ad451ccf4bda6f28a7f4bded552fdb6ec5e83df9210fd52ff55206e5b17bf4a", - "e2c6ecd2c3d7f3f7525826f5050ee4ffefefa200ef6a1b2bb126eae26e40de21", - "34555feb474637e5f05b75e688a8915c21268d57a2f4d62cd2ee397f5e4ca476", - "a0fac6501fd4b08de310585a3c88d5b03b0dedec4f55f52650b1017f905f2fb0", - "bb099b5cea150dad28cf3a3f7b553fe0fc7513ac6bb5d5332e6563103264789f", - "cf8c8f8db6a0e3d114eb755351f17d7e77f971a6ce52a1f4823c7f35bc5d95eb", - "1723d93c5397155c9f8f98d920f31ab034fe615a186a06fdfd90c5b1ecf857fc", - "b7109883aaba818c1222ac59c64a7e6e9fde7540575c544e98663493004bd57d", - "788d7c5b2812e02512ccd8f6b580a9c90242986ccb6c1ce6bbded1dbaadb7374", - "8c3b9cd2db70990f3247259a3023ec3ad5e77e7ebbce2a187574e5d1ce15def5", - "948eec9d36edf7cd9f1561aec0a6d18b9c9e013ad3a6cad3e92260de98cb12c7", - "06b5ba924936ddd056110041b6431eca9a8bff8a94ca2d3b7ede2dadbd49d523", - "75d988c8bad54b1a97258eb3dc2ea7c5d43672c005a716e3ba3a4dda03c7f2e6", - "68ae41cbbac2f24f76d5a0c7c914b7a66d7363d347f97e5f9e0920e740b238d7", - "1b6011e5cf1ee15f16351c478ec4cbabab2705024d039fe8d27bd3bbc09cf41c", - "9815b9c6fe3289ee5883e2c09ec555961973e642979c259ecadcf8c656dcc805", - "eac6474559b8d8a4280a794e420d611876175a255969d48cdcf6cfc93bbaca44", - "cd1b1acd1c66a88d4d4b0f63b219f31f696619e001e759cb1b40d388bff81b18", - "f1b9aa8d8743fd0311c5a1df4442bf677c8d50d609bc22df4fc9f0d16b86d87e", - "85f761ab9775d369b35545023cd458a2fb91266be376ac820b4ebe73522883e0", - "34dcaa25fce620a55d327bff148a0d288f5e9730ac63d6f3d6398a154cf05b28", - "d76e807955ce85ea3de0750756a08d4e4baa48ff6ec9d6d981b8f0cae64311fd", - "e200dae0cda47038bb2aac753be70968f7c683197e04c39fe3a6c4b988c8e7fa", - "438f1aa6895adbe6695e912ce3707b8e99f35587e6967bc4ca9980ba0b674cdf", - "0efb682a96f1aa8a99d0ba88f844ab790821760188a90d275b9cc2614a5f52bf", - "c4e2f5ce17fdf3383a40e7120223d709383b5ecfe6ea8f4d21a24e3eb74f9451", - "506a99025b6642ea2dd9f304903c0563f3987f67ed4df10faf3e58f3a32b5a94", - "2e54b9b25d6969dbc180be3755000ca0feadc0752b992b3f3db35a03b3fbd00d", - "39ab4ecee7c7d3f6ecc7b8021d052ec63cd45166b60fa59ad4c7bcdf0f899487", - "7b2a0a7e85c338e092bb0a5e8a7de69d52d3667860e157e70e09c46c9b46004c", - "df4f5c047490e22d4d4af77b385d05d559997e9928ca260599feabd3b7c05556", - "b254d53fa2a919f1346a89d8c37bf983c265e54959620d4ac28fb8e46203e854", - "d168d7606bc1a471c0da0384bb06cbb6743b2fdae45fa0abae368ba664758685", - "40bd9228b02ce460f4a4f980d5bd62e64436cb9a2fd76bc41201d39c1005a7dc", - "452105fe058411c688bd9f2ce3af3d945c4f5b5f5191a49ffa812198ed8310d6", - "477c3c6c2c00eee80b6b7c1f762edc91f0a4cfd941ca97714c109724e6be86eb", - "ed637eead9d9cd3a93d25f981b87936ba4e3add026fe78e90ae5ab871708f31f", - "fc27d89de22ebfa10a9514034c1c914bdb3eec33e4fb338fceaa70080f3219a8", - "a70cdb2cefda23dc9fcd6e3e066923d5c488c3c8c8ae326f18f5563ee4e48c14", - "f81222f020c91dbb51c34d7ea5782bfda16db4a1e0fa26ef407bd5905f0d3007", - "586c6d6a5bd73a6096654cc9a6a036d22ca320041e7f883ec3bf937a80bdccb0", - "da30ef4f22ef5390c3a0c70c28fff72fcff01350b9e6cbaad219992f36d1192b", - "2f465d7cad4aa94b3983a8a380d68cb5401f0cb9f6270d8c4a680c10bf5bede1", - "232ef66f56e1e6e3102a226aa685a1a978e792b6d9e6fd747aaaa3538cdb9459", - "3eb86750296d6aae5074d6fb3727d60d5abe35e41a85238b43f64dbb269cf330", - "49774fd8a2f35472ab9c42d5406a744e1f3476e5171cefd5a055eced8920da84", - "22e6193821830a844310efd51b016effbe045c675193aeb7d94e103005442dcf", - "5922d8df82967a4560e6086306a388f4607ffe2d46d7bd0ecd22e97ba70afd1e", - "edb47804d246091a11bbd389b027a65625edfc865e0ccaab33bdafc1bc79d248", - "b4be856b05e4095a4c6b77968a0181c6cc34736385f10cb614d5b1e6eda4eeaa", - "d2248382b72380be13f52c89ad4139c7492ae033f9f32a384a1948e178991ae5", - "106bc6c7d9a5c7cef0e922d3c24d4995d003671eb4d60dae62fe0715ff959cec", - "36481eaf2f3519ffe2f36abdc8c57d435bcc806df429b563d4ff7c4cc3f5fdc5", - "6ddcb79723c0975cd479530ac0fe68881dbc3e79500edcc5dfccacbcf4fb179a", - "bc259c649c69fd5af0e0cb01a8fb247759535fd8c5e0b8eb9549b89a0c39d78f", - "358325d083920bb937ed7b3b042add58cbb2ad8357ae346c4be926f56f286923", - "e1cd7ff23269001d32032cf5e64f8de67eafe0d407f6e9fa6a4011f3b7fc6cc4", - "a4eb78bc3518cd59d45040b7121a0482387902318fcce88f4bd69e184c7b32f6", - "2b24e18f44c3f0f4cc9e058b1d8610511df894219e28433dc4bf0000100198b2", - "c366cbdbbe2af7d5293986620fa96ccb725362b335ccfb451ec213633df1f140", - "e32ce64a4dd4ae119e00027bf6d7582b01940f06fc3328a0d5f754728a4c7d46", - "84fdbdecce068f12a9238fe597dcf3d343150c4bdced56ab081c9452bb4356f0", - "82bff46f3a1964b259b38f6cb8d3d88bb2d85444490232dd04dfda57e7949ae3", - "5c011a8140ecc06faf19597866b35fac6c2030b34eaabc70314421a57caddcf0", - "99918561300524c348128576c0ff5d54dfab6a8490e55a237df57608d93d9d42", - "2995b4223c705576bbe54e093bc5a33c5d98ce6cc0cff9052f40872fe0029a21", - "7c5918dd797570b12d6bf287a6abc0243cfa9d5de3a98f3c81cadabb8150e63c", - "5dc36d364bc6820670b605cffc4a2f21681756f0a0cda37ca18944625f121f95", - "b1edc4cc18d6d7a5f27613791a81b985c50771f4985c47f280e51e7f74be42c1", - "51637f04c5a323a454da2f8383f42bf5ec82a9f1a47cc385399ec47ad2b6ca7f", - "50e2af9df58a25963c2e10c33cfb14d89ca61fb53e69d6766be50c6ed8f31719", - "315caacb2f7106f6453285b8400374d8dccddafa118c9d402f83fdb0368d7f92", - "8bea709c53dccc0c9542c6f2c11462571730dc9e9f35023e0353ddbcd0500349", - "9d8793927a03d1557d31ea868f60c71152dff5ce136687f530972136117db2a2", - "11aa361ae0ea219157987f236fc54ecfb8c741f99cdd5afb32db35228c543ffe", - "90d9df90a573852b1713e719c86bbd981183d1e286aab8c92779a8db53cb2e8f", - "b4a249f23f26fa83586a5b52d535a2fe51726ed4a5e2979f5b1a826e98e57101", - "ec09dca35b748b2edb953620d981b436677a6bff597dbc8f3af79233f796571e", - "6d9d48a4e4cb9f9bff33d56c63c3ffef4e70346f708d1196b99b871de5fbc0ff", - "55419dd26485391312177e992128d0193376dc468e90c30ef7b8c5eaeaed42e3", - "a844c4419e684ee8f2b17ada6c7d0903547a2eeeaae0070d7e9e666b52ddaf28", - "ca9d016baa3f10880efa3d8f9facfffae19a8f0c9284792cc4e7c88be60be1a9", - "85edf253f200efc94e019c61ba36365fda9c0e184827132158310f9ad6cd5bd1", - "92de7f746a06e3b6e539fa68bf0ed6b5013e0ef485ff090d5a5faa2501a15272", - "d6dfa24296e005e0a478db82c7ff3134b7e350bb0e5c3959d49a0d5aa3557c54", - "d59e594b8e16a3e988be3865785b96be297ac4d16a7fb34949899e93c6457d7b", - "83ceeddea86211b6d9af18bf9bff4f0b40f84936cb4d15a6e6b760873b4e52fc", - "91405b8a4282a6d82f4b1e0fc8937df82d492516e768b66fa8f4fd25807e42da", - "d2adba9a5bd18e3e8b65694f2a158fcbb324b2fee3fea666f201d023b024082c", - "34d96c50fe90293eb7e7f1c48ee079aa3748dfa59b0c023a9c0d97424fd7890f", - "de4eb1fdd2e534ac5d52fa877c8ee032c70eaeb5c266ef342c655143f4e76460", - "2f7035fe5cddf4a85d09af31a78e45e034806431d996fe1e293b4045647c144e", - "f4f7a0b722e0504ef39daddaf857f11b370fb8687f36b065ae02ac0d0dc907c0", - "ebd1c1398c14215f358065dee3658ce9930a50d53f6dcd5f5ec477370fe34b70", - "a5479c0ed2b1dd2ed4fb8cbd699530762a47ad2346b96c52639428c8c88f8918", - "590c09004b5c824e2190bb11f730c0e94d97fcf41b24d0b726b03a2fd79ec069", - "09f8228e8dcd00a639dbb25bde849d3281a146f9b2d740520f109d10aa2d2859", - "7b6e2b580d0db6058e6750aae99412f8bd210b69b427e98cd29908b742531834", - "e33711f11ad4d88f7901a9f0411279c01c22a5178bef24ee494dd28083b981f4", - "e5724b8230ed5f01064a035576e9569fb6a61e1e4e78591f1b0b603168fe0888", - "26a8e42855af945514f549e0e4e68909e2a497c0f44e2c8c922535e9e38713cd", - "f6d39ae8153b12f889ac4e747a1fa9457736474bc0f082985f9eda63ef34bc6a", - "e12d6a816a700f5920943f525c038a68dbe5d4c42eb71413b390ae5caf180130", - "047b42b3e0c892679eeb6c6f063765ed2efdb885638b8ac8609d2f4d555bc57b", - "070fd7f4013da2834b3d56db0c41b6e89b48b7fe307055c7f2dc6df8940e1089", - "4142f18d79aca3a4b1d39a926488fce54c6752bcc1290ed7abb1e562919d755c", - "845f671d0cd56fba1cdd61aaf71601eee6db6cd77460ee06595acbc73a7fcd8e", - "54a4e62b07afa7435ea239fc7921b8e7686e4d15c4c51b4fae579dcbc02045d5", - "b88bda9692cfc1d00c52f8d874979f4c916e00e511e019434aedcc3ee1d7e58f", - "f938b073bac12be356fc7854fadc7e7638d56faeaa0a0900f424f586612c2b66", - "8b8f087f517406724da25d30953c58c118405f3be6acbd3a23514782d77fa631", - "08f5926567f64703eebddd1414211b22939c0cf0fc4d8d2479191fdaae3dfb3e", - "a25ec004393d936009b3b3cb31dc6089bc41f0764aa486e466f6b8cefc679ae7", - "474f4da7f593516439f4d9cf5288fc3108fc53acdbbc7129e7acf9f752c907b0", - "6c90aa4ea620ddfd0b9269967708050736d681eb08e7ea382f8e6949c34cf0bf", - "1b7555210ae9cb8a8bf2a8ae75cd36b56ed4afd55337cd7de38a3a3065aac22b", - "c7413e806f5988fb007b79da78a7e5d2583a2205856ae25520e2d086fc2d54e7", - "d29f00a40ae6fa60d44d14f783186fb5d461087bfc643b75c25d0f7072baa939", - "f97cb0d96d5f0bb50ba7cdac027b2aea738f763f9b2e91c85dfe3b6f171881ba", - "fccfa0d161ba7e6b82e26d53da4369ffdeb917e2ccd780af83f4b507ad86d5eb", - "85c73842950d6616c14c3c1a8903ba63c6bc32d4ec8137f53e694724587d6e9d", - "0a42886a0913e96539597e230c28f835c226a2af54c0f5331d7b7d912626e4c7", - "ef589029c5d36e0e6227a1df85779c85e95c4b9db7b5facc605e0f4bee490837", - "07abcbbf882feb9a1eaaa027090e20dd0bfa24a8c93f647bdc57e0fcf73486c8", - "f555dae531ca3ccec8b1b9e06a51aae914617ecc67522e822758759dfcf1e4c9", - "a55d1a42277376b9c44dda33a8f2ff930f7462f7704efe28529888e7941ac1dd", - "2f20ace8ed026162f9028a8ffb9e72219d600175e4fce4512799cd1b50089c0e", - "9f014f877d09ef931c00c226a1597228beb91121cd5e0933099798129865e0bd", - "c5fcc977d8744406f3a2f32bc6f2e01944673b0f8447f5666297cdd9ffeaf998", - "7e9ed2cc89bfd827078fd6e8a536c6d873d48e3cb5bbb70c33f5f7490d9c30a7", - "053c063b02a605cfed62e7cb3e30eb0aa231f1e71c1159caa4faf7d073d61f1e", - "bcd46be0ad0b73bb943880e6b00e0805a7bca74aa7fc70d23cee800951658ee2", - "73bb5c5a2ce3258539baace3be865b5d1539cd2c95b4b3e55fc9a85f9d064f21", - "29769fd6cff3f36d3a2f79b2ed760ebdb12b919f71f06ae2452a807d425a4a35", - "b4c36dfea7201b3d42986bba8fc93042d25c550660712c0aa1e2423929a3dcb2", - "7b927891cc6010f02ef943e76afc1d89e3283b113f25e20e8a233f14789c000e", - "d7a16a7cc973edfcd3885131268ad0cef365f68ecb8ae46557e4b168ef272e0b", - "413e72405099881304040f423fc2873a593468a644af19f145d633107bb2194a", - "8a876942c0521ff8eae55c5fe4533e7f5a1945a7ad83132816a6feb102d0706e", - "56382c509768ea0cadadb9bf2207c272e7b54f16c0c618452503e3dbcd4b9e65", - "5656930d8a101d83348712a095957c2eb655d749367f0f10488e415056998bf0", - "ac7f9c414f1378884638ce9943007680b4b1e53fa7ca611991a6ab48904b681c", - "fc8473702bfdebc4c8a8b35d75f2dae1787ebe05af6c5cad1918c5f5b498a60b", - "b9ecd587f3f120aca801701aed11f0401d7ca0a049b0c3c45a148862b34a476d", - "a8e359b15685cb76b9b7d2b2a540148dc1190f75dca435e253e4516d6ae6692a", - "7c93a321f891c6949e725f9eec06016cf72da5820a601a78424b13f13465558f", - "4b0f075a0e1e3982e324e22f30dfee801ccb3d83333d15433a12bf16fe0d073b", - "bbade17f24a0d02141211de52a844b6d2078f9fa07084c092d645dbbb1824141", - "1a5f5881cb07fd48b32f238a713e55fe38fbb2798661ddb10bda4c179647a605", - "6728f5537c2534bd40cc3a3776a78ae26d1786ca0214f98f8b37086042458173", - "7b67405ae89cd01d7d27d72f92c4f43b787009c595c42a0b683e0bbf5bb78754", - "18715cc7dd638ba0daefae438032b6420ffdb57976b8452e83f64de9c4c6037f", - "53277445ff275d9ac7f0e72b76afeba28d5d3d0cfd07af3c3ff792561da885ce", - "35c1ec51cf8d9e62bc57ecf87bca5e42df1c2c23238ff818c177f8847d90a0af", - "878df3edf3bd15f49a09c8902a37e602d746d0405b10638115ce3acb01adb404", - "c81567c2aa5263111e4f783f0017068a4e6382a5d5dfbf62f55b8fd33ad0cdd0", - "8ea0071edab63766620931e97432d77fbeb9a57d7260c9b6c33341978d6b99a9", - "8fdc10f2efd7eba406ce833ded2d594b3c8a7c65f28294e46cbe32993eaf9a18", - "fa1f91e1feed8a334f534da660f11ff8850b3342efbd76f5c29a8c9d8ad5199e", - "802fd1a19a8b2f6b229ecc3df7b6dbbcf423ff521ee6efc6c9359198bdc730fe", - "5ca4b5d03f5fc5ada50d88201d18321c291ba82e6b23607b4e1244163e72062d", - "89d0203e07004bd12b9a513c76cd6243c32991a4a337386465c266153b68f998", - "110cdb8be37eaee21b8ab00e8d5e4208e67787e504a3a544a09334dac259fe9a", - "d56019b1cd55b3729a0d51e287591ed1ddaea887cb8f87dd2346b34c9cb32657", - "a556f8bc0ef49cdf6714236d8329b98c870721c91b55e80466fcd68f2fcae256", - "b575d76bff2e999712be606800eecf2f297a6d6a4a409795b193218d4088552d", - "698b1a1e8c7ad3baac68b29a71da9c0219436cb68924c7c39350836eda79d98d", - "5350f3919c7dae5c16e4294bcddbcece0450c23f2950165ae8a4ab4f2b3bc903", - "8272ec00cb9066b066ff68be8e0029a01c6208cb8d940700358882cc224dd95b", - "38029e764d5cfea88b4232ae3c8a462d994ea0b7b0d71fd5030ab0704f2c7df8", - "26870efb0a8f0331dc57c5d2b5c94ec349cb79a3d65d25bef65d3516544f0d0f", - "c20133c0ae484904fc76d20011a1dc7d7c552ff70f73bc00f6dbbc810ea0bca5", - "3a70481255e78a45b0bf9e590c35fd31969843d23b0f6dda58da17940b5cab8a", - "24e46d40d3c53ad70d7751d96f8ca45f057def57e581608d7a58b53212d513f5", - "3823d900d2f3ac52d694c45af0ff1e167ccddf74f69872a7832b8d7f7fa3c544", - "134061ab0ca584542eab8a0ba2168bf9c853dc938942f49d4f1784fe2d751f4f", - "9a7ee397a162d1c5c898d121ff7707b18b3c29aad2e26115a93cea39a437b90e", - "f486dcd2ef62a92e782eb43b960773a5e1a2c24ce6e74e74cb2536312b75193d", - "a4a4dedb75b1742278fed887e1904f434a1d4df43ea459877e163fa773c35a20", - "000246430c2de756c2c7bb07958e2b01d6d49b45a087786b7dfcd6ca68dddce7", - "ea0f1b3c758fa9a78df9537829608bf12577ac402d1a7fb995776d92006fedbd", - "7b0ffa188e75a6c15465d23380747d9a4235d3febf2b8d885c2fa8409755812c", - "e6c4db62b4c0f4f387189513847f9d77edb47897be1702321e6c5ded78777582", - "be457ec014bca2694aaceb9ea2bb9612377cc6080ece4a0e18fe698fb02f0f86", - "0a43cd6a055cdeec0097b0a8fb16f40c2d6c05ad6290a61b7b214e62c5d71c09", - "964c9f36498595ee263b061d2753056f4d29e652bb6d88edcc1484b98c0b9480", - "c462e26b73c8411b3b1daf8ab3718c998641a437380b0d0e3c9ed0bdad68352e", - "33bb7fb89bcd0ac0b97c565dc1c38203ce90c4cfe095bb6222d59a57f6afe932", - "954ead955174db23ade5daf6bf6c722a8a111c3578b7ab526f3cdbfaad616330", - "478c97058081f74a4f64361cd1158ee1f44d5905081ab97c0dce84e172f3d617", - "51cf52e652a0d82741a1507bcbc6896d3f880fec6160e376a2a458769fcb05fe", - "9c1a1bf9c12ee61bc34d5d8401bcfcc8224591ef0de9de7318e73c3954bef204", - "f948fa2d1c37854035fc2c82b118135ca9c4ba28f2e34875fdceb144b0a0d5bb", - "0da3481f86793ead04b17ca8c6b941956cd4bd9f5e9330725a3fd140ce087ead", - "c32f1afc773806ffa2b59a0309477ca4f0349f518f81db5daa9ecbb59e90267f", - "61a6a809e832c9389619ee42fb26818e7c55b2330a6e4a38760fdc66cfe29cdc", - "3b939dd09b3a190dadecebd7966df2a44a1e87a22ffbb83ceed8fa3d60833f17", - "974cc0d8d6a67c376f1e7fc4026f8c726ba20d4854b54cd87445eabd7fd53cea", - "9869e14b4661d8bbf21fa4e480aaeec53605702fe090786c0b56573ebc5f9721", - "e6fb986adc6020b2c7a51a7aa9b28b0a49513a8bb3cd1917ad2a98f47dc6e39d", - "0ea488d0965a7895b8a372906ab93dc2042daf0ca1c6f31e8318fcc7ffc104e3", - "60747898e756f7e1e72e2d12c6ce61adeeb0eceb9eb445916febe884eaaec1e3", - "0d25dc8212f1eb56b91378f0850e7847d057c9bec1d660f7357cce8c4c0848be", - "2fe6a24087c24fceac21291bb38c87b74a12f58f25c6c93e4baba038055bdd8e", - "0c4d81c436f8562074baf0d8902f614f602697fb5fdb45db31a84528e0269d79", - "eb17b7a70691ddb14a0bac0587c543b2780d35f65118025687a1a0f6becd79b4", - "32d1f78caac0f2d631f9a6b7caac2baaf315358636bf423a0683e70267676631", - "e958a58e5adf4976285e5fbd022ba486891af99ca7d3992c81f2e5864acfc8ab", - "c9ba4029dafbc2e0038d9789adb0a16a0792e14cdce04086661fc1048d114f7b", - "c67bb31120b1d1ddb4e8597134c219f901fda2a570d8272577e463b70b4ed934", - "d58fb4062e31dd83f46e302a14199c35a5667c7076af37ced8ccb9821a135a28", - "835859249c6256c6b7aebc9cc4e17e15bfe5cd6e4a4e3d24c7fb4e14d0ceed85", - "b005a02d78d141aedd3140c4c0603cd91adfd10d22862c2af4c5171e41d1ca72", - "6c378d36e2092574cf642d5ce2a2a7f18e8e9561504c4e74b7de95d5066c9488", - "af034c859330f8228e6d3253a0c973bfbbadd49238353b8cd319a5d8b85e3207", - "5e8104e52df68f84b84468e30d2562a1093806f014486eaf206f9a0aa8a62935", - "5ee0d855cf5e87ae4f10448837cfa5535a16993bf3451cc3dead2685802b2643", - "d584ae480fc7b89cc1556f2769b6d4aac084919d11660ae085e57f90f6f0b5d9", - "06e88bdcb28c025bed96bdd84efe40ed6a72f912fd89c73d582923755f4c34a4", - "efda3913c2d522c85399037ef9e4ada9a7730ba6007a1b9f0b30e9e00de9cb5c", - "e39aa020263355e66c5bf2d89488883572a900d404f7b7c07dbbb5fb278b1f09", - "bac7b200c7e0c28b02652ed946e0f7d2b564711704b2dc8e1bd42223cdf0de45", - "e09331f27e871f2f784f850cc6447aa58c5ef77e72fb5a2808e7b2f2c3da2fe6", - "47bc47283f9da3c2d5355d2c3cad7aaa5ee8ff067c2ecffc34e72d5264c88191", - "e0e28c0318cf6b077e262aa35c0a85e4d1c2ad0d134f07f374c6db9cafefdf40", - "92999b4ddd8203ab37eccac1e06f505e4a616fa725594e255094b3bb4309775c", - "5d852d57786d891c3ab6175183a9590424565cac818490fc856825176d55fa5d", - "70887c487e007264bfd6f485d981021066a5c20b3e1d1d3a7e02607f1db22150", - "aff442e06701da922c44d415031260f99223a6b2bc4cc13ea306047488a259ac", - "03d6dc3401a4325234c8f629a92748cb39050a7d3d45ef62d3740a54a9863dcf", - "e0d2cc282f9c13ed4161c3983eea0a12d5a9b2456299a79ba03c791a25ca2702", - "f46f8b83da2d5c41313755346dc70978272e37e0ba97911e88d3149ebef16dd7", - "7b8bf2a03909358dfe27e1e1723a0ce79e05bf354d134d60dc47efbc11dfef6b", - "cf47f9e8f986154173f351966d67bb716211a8779a08e4c67c3b7e1f71424d9e", - "fa73214ed4d8d4078206ae64f98e2dbfea8be4777d69713c9ce195528709ee41", - "91235fa0ccc9f0ed9f2b72615087b1f1c84f19667b2f98fd950c74717f9c621a", - "12b15952126d050f17c9e310f74ab47388355215838ccfa077800205aca025b2", - "2a2823f92bd5b8ed520f4350f17fdc0b07dd001e83bbf9d53dc9c431df5c47a2", - "7390b3fd0d0636a257fbcd0a4ebad563f1ca71f1ce539d833d34db53b4e36aa9", - "ca77979a290674a34759a5ec96b1c6fa52d6ed595b8a0d1d19380d08f4dd8b79", - "424d125cc666c6fdd9cce92a96369f6b12e1d94a27e560a376fc675cfa142316", - "b669d6c0616a15da3adbb6a77b2d03e9f33a12899501d7f5393b6db0f6ad6b93", - "b213e4ca10f9265343db21e2113ff5b35c5cc742a90d0692c376820f45f0505b", - "8d8f2b2c1e5aa5e5d0ca0dee7fd772202a717345692007b2ee0c01074de6c443", - "ac84767b16a68966fad37881d016b4ef1bdfa023df60d144c075c1d1635a6f21", - "5b297bed1ae1be0fe3a4ed6dba767b302cc4e7f27b3da89c0195f94a0be27df1", - "d92a91b5cd4d83dbed58368d2f15f1026bb998b7f921a0be9a292ce77c3bfa54", - "993cc16ebd4c8b0e16772c39543327f0e30f04cc5cc53f53df5fd9fb37b54773", - "2267bcb89ca2fdfe671842cef40bdb3d5cff15a3e32a76e2ba3e8f73d5361c2e", - "a6356df1530aa462be5a9a0a9aaf9d3e0a889e0adfb6541f2823b41e999c2ba8", - "12b65cf767ba3be4004cb3dbc6bf009cec7a280afb34d1e42b780ddc3a662366", - "710e256aedfc626d5834d7c17082f16acf6d6125a24decc84508a57f38cecd71", - "786bd2aed29e4be2392143b79e7ad0a61495bd2b6ea58e1d6a0dcfd08d9fbaa0", - "41fd03dc3200064368b9fbaea6b38e1b94314fd1002b65126c1f6f3095859704", - "a584809d83fb0060e87cebfdcf4043530c160f70c5f292580e1926e73ee84c57", - "d1266354782c85d2324c98a28a8e3c7f4101fa91fd1597fcb1a882de9ac394da", - "40eadcb805c33dba2ce9df20697faaff63c3fe9b9e7bec34e44f75616548d0e5", - "ff96234d38e10a100217c01e1b75e20566a96d107b02dcb97e3e4c78cdfc64fb", - "2c1ed3113ff0c9d4f08dd2bbd18e538103de1612349fa15bb4024da7466a974a", - "0ffabce41b301a402624ba486b6b2c652826cb32c066b59d37c11b1aec98c2e3", - "a430ac66bc8d4f2c8a816845ab1e23dce1712690ff7ce8600dccb60c2e993c7d", - "1e6478874c2c24db14efc0eb16266c35c018bdac8860a7c82c82808bd10f8dc0", - "f23cae1b1fe520f4729c14900eae95aeb97ad175ecb505b2775999e33c458a59", - "abfcff2f15a5bae9791b390d9c296c412c103f1cdd6366db0db63682a5306d77", - "3abf847dc0f2db286559540213a93f90ab7ff3d29f2256ce8b9328655ec55aa2", - "40fc23f070f18618e00dfdfcb7f6fc96e79d7adfaeafc37c6be034d9c1378001", - "f9daf7e368bfdb87c7467dff4e63d8b337dbd0979d284a94cc9dabeace4f575d", - "52b036bc4f9b6db5110052ccf48208169661624f5b3981fdcb52f32a2bf9a87a", - "1a212eb39a2b996208aca5ed41694a3625fd4b5c7d7dd40bb195a91dba0ea46d", - "089c199688bddd53cfc81050b6c3dba5b9e6ca535e5e8a83315cd657cb9c481b", - "9e8f2d9346f020c6353f652b54a24e7fb1b3fb433f9cb31fb03b4f2b8056a352", - "a5260bf42caae96739cbe138832540bc2d13b62a7f6888ad7d5c14d3b41d6d8c", - "4b15fe5e9d8b845c1149fbfdb56aca90348ed7211a0a5e9511507e00003a376b", - "cfdbe64fe7f688028bda1dd11caea99789965dbc6cd29e2f10cb441407551463", - "5704a5fe64d9686977544b7ad595d829906cd28096367512dba1a975a5732732", - "0df3019da540ac8a6624bb5af18cc48108d53739461b095c015da6d0bcdf5291", - "420f296b2aa6d98fa05191133400d572cc0e69bc80bd5a630900d12fc045412b", - "326df960e259a13ef9a0b826b4710296b03fea302751f7ca183115496ca62b1d", - "60ff001f0204b20ec02f4bee8624f3cdb105bb117e9bfb728c041c4346452b9e", - "4b19f0943a7f0b474acd2f1f3cf05971879ab4528d7febd643cd376699c70686", - "25cbc5c8468d52b62c3c40fe622d4a44e3b719e320ea8eab8f3dda8fda3f6d3f", - "1003e45f9b195888341e828ef383f77334b28b6481ba91319e0a8be4716805da", - "1426f43dca398069b94964c3533a22742ab83a1c0724d10392b4f01a9c962b77", - "6b380a193d7e7a33069366e6373823454838cc77e45c664d83bf84ca869b21f6", - "b569ccd831ea3001e5829784923680cded691ba5dd623360d3a051a5b96b09ba", - "aff9d6fc65b60b1d365b0d466e20e7e051c69bd2ca479189f3caf0cbc2d601b7", - "d7beb7643745c9aa79611bcab23ab38a57c1d85f5b8c330b4daebe95d25899e3", - "48a6bfec7c7e102d56e381c47a3e66b3939e518489f3352884f8fc7f323d4bc9", - "7964ccacd3bba054b129ecc12e7df4813f63956224c0c7a3edb02405f3aa9078", - "7e20710c155c6d9b96040a7ba74f37e09bb5442f7224f776af6dcbeba7e5e8bc", - "190b53aae017cd2790bfcb6c4b42b5d28b4dfc6beb066cc1249163bf1ff473fe", - "2ecd9fd557efd8c71a90cff09dc05ee51590f425191cdbafcb84946d1bebc883", - "77a010c2d20b9d5c0a58e732d0c8e682f2364031ceec885a6404f444f43d018c", - "6ca4fcad41a8472f7f20d1ea90765eb5a5f432828d641adc207892dcc5c82d70", - "e83746f2cca069a189d40a0980d8d9add30190a844c8edc99929be44598e81f3", - "fed4b01d1027a00ad3e0d6fda528b3d0965f9087df8a123b6ef8765c8cfc6da7", - "30f7432f46e37337b26d47378df512f5cb6cda032d8c273f8697dc4b9dbc0587", - "5f7fec08a0cb02be10bb0c44148ae6e20f7a63de0cca14a100f155e813891f76", - "a52f28fa65268bd86048d22ad7dff3520cb2f099dec460d744eb87fefa6b7a1f", - "70178a61e8852fb773e17a9d0b9840f8e058484b5ccb5b6eb1becb46501203a6", - "9455689cde590d8dce971fcf7f21b52585a6acc7d6d58c1cf329c2b5ed5ab4d2", - "17c1831fa11177cf3b6b673b3efb08a8629c70fc14d3de607699db7298cc9ad9", - "214528771159e627841467101901c6860dcf4e80940d28aa154afe78e852c65e", - "e900ee2bf593a9c93c1f784f4152b23010444b8ad218c899c5af6c8916c8864c", - "2c05ac773a19a2f2416cffc92d2f9481690e4ce809512a4edafe0f6b79a8c2f8", - "627715de7857374215adc7522fb8bdf3392f6a74d8eec3741c36df440d9bdb7b", - "41ee0a3b8fd828369449341b0caf539021cbe2d3f0733d93f1947ee7fd90da5e", - "3ab92d20381d57a7d02d02fde966bdf4a3fb26fa7454384fab2f049fe4c7f3fd", - "7bea0b33e26595f0f6ecfac34f320646b2514421a63a6233b2f5a0e4bd40fcd0", - "c97fbc461ab1289b42f35682a60c49c1cdbea288c0d4fad42295504c0bfd313f", - "f7b2039b744cd391a1a5d428680fe2cbd1a2ee95b67e86eb51093e274a6f478d", - "56c61200b6ba3d5654da88417aea0ec97563d4f9f5968297a4a0b870d5ccb492", - "c043400c8647cd6362b6a5e57d517903a26302d2089e0c4786c37719c764d7e3", - "5a8cb69dded1a86d362a3b96c851cb9eb57cb662fe1f59bcbe47a96958accfe8", - "ca1ce9c09889c5d7c84b3440f4c04b404b65ac5bc0787df3d81c21ea89d82d41", - "03b781c3948f56138fce959022306aec53269c01ff89cb2791f966641108ee32", - "8eb62ca0d2896b6d5317964959cc312d77b908fa9b98ca233422c01ca0b76945", - "a6cb083ffb070b7880ce9ccd16dc6e894090ead9b45d52a4f07232e925f6291c", - "70e2ca1319a552ac93d1ff362ad66a0baa48e1ae5dc57a2bc4e4abf6aa512ae7", - "49f366dc34352c2d4460c3ffb95d380f5634b0052785affe93298ba058bb6587", - "96b1ff9cee6911d3d7173cb95f3150f40f800763833555871004ecf6e4a628a3", - "40372570e44c60dcb8ae8a95c30f32a0896637af1017e05125efc364f4951949", - "e3cdb821daa717cd4d8984c15035cc04ee81aacd00457dff42bd24b2ec109546", - "1b2b82731eeb86c9e22c6520eb5107f4dc1ba6220c32e554b023e987d1b658a4", - "2da8e7b736617a1f6f6f787671efeda02b5d6ff53324ce8b5df2a469f0a1595f", - "4819f75fc149d0777127370e11fd01172dbac47e4ec64c759607b866f58b013e", - "c803bab2c7d26871d3f1dc67a5bf0938a86ce33ceb6a93c20a49c272ca8ce690", - "90733953168cca648e353fc0833e29ba4061c23af28e35a7782a62b4039364ea", - "0f229109a0b23c179284216c90347bb0f20e3a705629ed85b2c263abf6a68df5", - "ebfa94f22209b0a63666ba29c8606e44e5be8d02227d5708663a3cbbf7591551", - "459a1eaf37c6fab16c15d3ada18a5bacb9a47b33a834aa4f8c726e9f4e91eac1", - "7c429fe9fa1a4e83954a8f44cd66a930613552840ebe2d715424241fb4267c0f", - "65b78e8eb3bf827b877da50ebacc73d93722739b98e4d251d5de675bf7f83311", - "e782a4f5e98d37aec2775fe3867f52dd1abeeb0174e6ba36d0750a27792ad566", - "a501fed949d5c761d4e812ea1bbf55bb3d0bb2547eacc8a2b50ec25d21842a42", - "81648f52055ad4d3bd4ff376c0c502f1a3d929f1d7c672ba31124068538f8800", - "ffb37ace57af8ba7edf16e3c70133a7aa9c7035735e1d86ddc050db4e3adf696", - "202de4a8c12731b4483adb955fcbb93f2024b83cf443ebc93f491164809c4945", - "dd7719219ddcd768e95aec65bb0538859acbc68979a0d10afaeeb0b836ee2ad9", - "6de0b98481aa5c57aa9c35d1c7503bc787c480c4147a8fca214ceae72f53de6a", - "e3fd05109fd6cc869b86e9613f716f2dc4549d189c5b8585b3c43a34482d0275", - "927bcea01a8df9de3a08e0194e17c841dcf63b06aba389d00120425e9cc81902", - "b20293e6a131bebde034cb2bbf8b4a635e5579d756a8db74d7d2edc21362351c", - "416a76c1f961768232ea7b9f67a55c64cd57e5edf42eec4b40ff268a04d731f5", - "73e94b954f4cfb98e59647f9bec2900ca9ee2a4acf3c97fd53b93db0ed8da552", - "2f9b12fe8c42b58395fc101a8a099f2eed463eb1564034cfef203fb02bcbdb7c", - "36c3bdfa0c461924fb0760a01d8b261f56f8d70006d8c7b9ebe27f199daaca30", - "4d1aa381898c710efe23385a2fb47bc62b70d748c951811d6bce0dafd9714e81", - "5705b6de742f9206e9908cb9e5bc297d35bc859b802206caa6828c9b2598688d", - "ebf9a2be5ec5b51e1c5a93682e2106bd510ec7a422e03cbba7f3d1b289288592", - "05e41b40c13f44c1671445b56e2a1510cac30c63bc99c12a8943df3b487c874e", - "7045c1fe925662262119320a789d8de4c61032f135b3a9b65e3942d1776e9a74", - "e54a4c86299c9d1db1a215ef1be8e8736e39eabef1f7395486c0a091859dd1f4", - "f8839228e55e8073239dd396192c3d64eb4d2176fd02fb71cc59c12b0697a896", - "2bf31bf6eeb5870928510beed82b7a72f1193622e15b29bff9acb27f77348627", - "2abcd39ae0882a4bc72dad58d690db84456231b8fa08a55277c4eb638fb93c69", - "c2d7efa17e6333822d09c90e632631ede91b51fab943cdb13adb1c9c566cfbad", - "cf49a04b99dc4acea131c423293a59ebf9dff9938798fa74ce8470500ba7a310", - "9e891b43c4cf129a37729e517c8797a217236a668ce9faf9e29e8afcdeb36c79", - "a92f64231714893fe6e08beaae8a803106a2b67f997c52ae4e5710a9d84786ef", - "62bfc02ef5da04e52ba465b29f5f6bc9a579e4e76971a9b947d53c79e1f998fc", - "661e66fa21b0b145120c18c30e5ff0f4c963de2b1a3082408265d60a559223af", - "241ab06ebefec1efea1fd534020dc0a8b9a8915b9106c2b59e646894127902cf", - "773d45c89efc690848859197fec2624184473b9bf8d9a354d6c13c80ee917ae5", - "c82790266dd1784bcf97d4ed60ec2a5e3bf0f2ecef102a000dc38a51e43712c6", - "dcf0c6be52f90c94cf94f2d577c2c2910b923357410a73ba2a040faf3b118a35", - "531622e95a963fba6356754e6359d431eebb7c2cf9faca077ec3c9f13be06cf7", - "fd12aff3f878066c9be85da933650b502642ba1b6902b2433c2f588ba25004a1", - "313312a49983ec89f5aad4397a2a2c240b32ec52e12a60abc3dd05546680ee1f", - "4560ecbf7b5a0e7ae2dc5cecf91220262d0ee62bfba6b9b113b97358e37af639", - "c4a7a8ba5bb2862c6ed44db34a9b2a29d07cd209de31de255844f4344c349755", - "22b5d37a8cf3021958c8db012741aac69755d78948ed29bf74b2399f0b3da90f", - "3b6db27b61aa5d31d671c15f58b6a18c2fe5a41a48270836d87634fd263c083b", - "08b87a4b2757612b65636910bbe10e9afb03c096359d0ae03253fe17fbdab1dd", - "6fe9bdf14b9b979d60b9a3733122b61daca0a0a3ec4a93743b8fb62613980ad4", - "d9b91c77d46ff4f7085395ef2471f44e719afe7be2c089d7f055b25e50174f53", - "72a0c860b0b149b62312c416b1f9c241789105b2e086041741f09785ad4aae14", - "427e26d86af97cfb31ca6ef7079cf8cdc6a0e6c11c764d7399923438d37fe3fa", - "b99200d902429402abad63e63acc135e99ff6e35534aa83c5cc07fd23fcc9760", - "fccb66480fedc233c3f4cb39d70d78a4eb65348d028f0f0f4a3a83e4cd5e19f7", - "abcf2723aba0b2c6a1e32827f3436c72d6d655c4b592d10f0d8c3792a87fdc0c", - "eddda76db14eb51ebbcac023a6cfdf1132082c9b55cede85988c79b9d6248707", - "2a43a8168701caca20c51b955b24370a832bcff89808fb2b68edee3e8cf8fd18", - "b8af0571f5bafba417ce830760cddd18f9b9d63d2fd09ad7df443100178c959e", - "ad9949d76decc36df6b44aa36eb85359be2e1bc0b3fef966333c89ea41bf81eb", - "ce1edecf7459122f42299da5648f70cbb89905df62d16419d871488d7f48c153", - "f0f36a2c293d2b31ca5fd64ffe4be0d149ca2fcc4114abaeaae80f80c3585d42", - "7f092ea9d51aee50598580f3a530b62c01cea538b400091fd24053d22a5aed9a", - "d204959d1cbdf9d65ab51565fd4d2f0df604e58f39cafc63014c4638f1869471", - "779d23dab06a35072b2aa362785aadcc6763c6a4367a550fa13e5d8f680c0796", - "e8189b006043f9947822547bb3e04034f1c0712565c30e65aa75e126378b40e6", - "dcb70e55af9eda04c6f5b4c01c0f1c9e13d974913f980ac9ee7fd22db98f001b", - "baffd4e04c93c7ce0395f7a923943a46075d28d1187783855a5ae45363d72645", - "0c3d8dcc6aef35b63b652b7f80a2e072759ebefe6799c68d2ce6b29a573e1b39", - "22ec5ca21daba115fb5f7102a2e955375320de315a0fe27130ff4977cebe235b", - "d232d2fcbdfb6681e0775a2394c1450ae89a419a4ea215eb0700c7d472c62b87", - "12d4d53f2856662a8c4cf22e1c147a363fc4af588915cf68be93e57e676c1d3e", - "0dbed5ba0860c8f964db1250b64fc578728b9a7dbd52b49302b686cfb184e7bc", - "9088da5c96ccf5336756a7848a079c792b1b587859bc0c69c1e874b632309e70", - "bb48b44adc3698637d59141b2bbde53bc36eb65214fc43ffcc1f5fbf1e3ca70e", - "792444f080ef8766a55335f01982f53133db9b9b18e4614ef4173c865a854d7b", - "bdd0ec7c4b2b934b8dd085cb07855af8fedaff55457f611f816cf706fe7010c6", - "a8b6163894dbae9a972dbf145d954f52c84235212cf9bc64aaf34e1eb1dcd9a1", - "51cfc79fde44fbc2b768311f62f765e9d5dc6df344558ebbfd7c89a805565c21", - "f67fd1bd2f93be701120f2dbaf1571630d386e1e2cc7ad996e11226c3458f359", - "5134123a9606606b68486b6a3e8b1ea8b14d37cf7986ea6274be6d3d284016a0", - "4a02096833246d18f6fcd7a5389b9ca951f4b574e00deea3c041d146f73fe442", - "994ef98b1f8edea473dfb9e1cd6c2e2d8f31532da241cabf5f38a09584ee2468", - "63080507175611bb21f9b9dda469429d16f26351a7fc7b14a22cf77aaf853325", - "43e5c61bc8c2a86aac0df726a649fab67b3cf904f1c800cbfaa017971aa1f867", - "ad71529bd99dc87533952642119e830629fe18832f6f0d1246fe60d776744ee5", - "8aa98e6ed31bfb3d36f9539aa5b83f4b7cd3a70f100ace04c1320cb9e67b8568", - "d63e6b36822d5fa52d8cca82ef31cc52393f9a9bf9ff9e46f8a7c9f4b11b533d", - "0bb903b9a257a285c2b24ced946b293ff82b2cea5adaafdd01051284eb30c106", - "a206531067207b807fc898e676ff084b149497bbf4f4d655d8b2f0de20b9eb4b", - "8b45e8aef3a4b9bc204219db04fae9a2786907b073d0f54b15318c972c9f954d", - "1a3227f0137a12b2a806b54f9ff7d1463dbd77a2800ef2a5ee33c9ef79dfe042", - "1abf428e81d5bc7b9ff62f980fcdebd48df0a11a33eed33e509011bef4d17233", - "5a605cba4dc102939964455ae3a133bc5eb56cb6d3b6721469396b7ec3cde036", - "f44ce282bc20330e2c551eeba6d7f02006fd33814161d77633768ebe888fd429", - "140ee5b2ea8d48510e95aea97f26c3049eba3f82ceb08e847bdd610a1d8cb4fd", - "46d33cc904127848264910372d9628607e0257206646823fa66ab1edeb49e5ff", - "f6e4d385b95e1ffbaba97f19fb1277d59a497d8b2450f526ce33017f5b1687ee", - "dfb63399ff11325a3632f28b3043a298fab6c28f7d00b6a955a434789c579c47", - "5f26b4b02856ffd3dbdee2c7bc38cb10fb58856dbf08e92bcfc1d07a1041a48e", - "3cea66ac107e721b98b83deba0302f23dcdf7af96932d2f3dbce6571ac8e6b05", - "731d02f3ce6f996282f7aaf4c16fc460dd07cd9712f6de502a1cbe1828d269d8", - "e0e66f82078edf5f68d04ec41b09b1ce525e4964d9daf9fda501e0422f23d4bf", - "b11d0f17bf1556a1b45b7f9d3154c7efc183c21b212fdb02ba57c0bf86c27e17", - "20dab5d87199349d8c640e3a48c29fdf0bcd5d95be45cde9ff93f46145231b0d", - "d92cad206f98c4cebb6c63a315a0cfdd69841bc19b19d84040b3006e6a7de0ff", - "ddcab080561afa1ed500a37ede51b1720790c071124c08a5c763902a492b5c6e", - "d37a613aeed78f8f8c77b26ea509d52cced081d68f7d052a037d3f22d6da377a", - "6294005ae8898446fd411bfebca594af41ca0b058b1b14bc44a3007f70b32ff5", - "463e75245a9b9bebd12da473f0abd516d572cf0be29fe15c14cc7a0f6d169a34", - "62044c113f250f588d2dbd9267e370b71d0b90d9d55606c813e83c6f8da680ce", - "d18d9d91336814f57e6c1f36e8d8a9830da099726c1ee5f85d8e8703f042384b", - "fe232e021aaac965d3a8508885531695662ea312850bcc5733d10a0f3d130bc0", - "5a85bde6ec282e2c25464061d89faaa4449c9803adee16a73b25bf0e91a1af9c", - "847eea81358f3515166531ece1822f4bfe9e181a754fbcadc471b7bb3b6a4515", - "38b2f881463a9abb8c57168e10bbaee4fccd5b7d3e0469a1c09105ab2f1dd07c", - "f9f203d52e641d461c79e39d3b7b5eb0da5807fc73857d21235a235cddacafa1", - "c52767817417bafcf688eb943565427ec7cdc338d676a999ae03574496988a4a", - "d341c34f846376240285063c646a93b630d04c2ece48b65f77cb743127f191a6", - "ed591a5a6c99c42d9d90b2fe63485eea43e7f95245c98e6c72ea25ad9e7b32db", - "f5812cb81e4642b1e1f433b78845cc1128695dc537938665cf80c7501c6a0a40", - "aea186decffef7de2dc584b1341652b20e8ba5e219f4973d42b8743285f9f718", - "512dadb5621feacb13f37954761136ad3a98d0fa26ddb23e34f1117ce37bbe66", - "6aa52f8a3843656cbfa2d0e342a7f9c4e1db548c340c54bb8b40cdb8a96d1c24", - "32e445c12761935bdcf8881db8e08c4dee9e7b557dacc609be6eec9d9fa1c878", - "2283d8533f368b779e65127fb9a28fb3d533c957c970abbcac4e42db703a6c5f", - "561073e4bea3d0c2d7284fd6e663dcdc2664f17b5d2b0b80eec5d499b6f4a1e4", - "ae0c3440f27c4ca63f6d907dc157416b929a34da963f208f0e29f7374a51f52e", - "330e4f56a9ff2327141bcbb000fee34dd14c5086bc5894e28c3b1960f987e886", - "4142017f5fd06d402d2761302d91b928194b256bff862a3d8cea11183b3548e6", - "549f407e8626358f628b439a50ff29e9eaa4a98ac72e2911a18fac79fba93738", - "ca046e7fc732a1eed287ac5250c1234ff0cccad63d47b0b7acd3c9dee98b234d", - "a01b15c0ed2be9365e2f24245dfc9d3cd79b6989eba0dc2fc2ccd1427c5fc5b0", - "64f9260b3e5b228a5dbd7c5e6e09f3fc5eb903c484996fc6358860204b5094b4", - "ce510f45b1a3986d43a0c51e43182be4e7ddf0e6f62e20d50c97e207500b4b4e", - "f1fa6e262fddea1264ea96db9f25dab34a18aa1e3ed28b60ca4940c0edae1ad7", - "d38f6f16f562f7ca83ebd307f93efb0ee297ca5d7f2957241f6eed5dc507e210", - "ad5b0e1affc840443f14167da1c8e64c0cad597a6cf018e2b0c0bfc09422907a", - "c9c08cc298120af158c4b01ca71b33a36844bac433c2405866e59efffdc13113", - "b29fd779329f274e8d648f9fb3870c2258bee45cb9432af418e7e669c28639d4", - "7492ced89068474fa18aabadb344c22e0de48723ace0c634882d068d952ded87", - "e92b6c3b1c94856ade50f7c3fc3703542bbcb8ba7fdc0d5f5b11565edb028cda", - "6a19123244d584ff6fe1ca995938c2d474f92e5d22b862365491fd3974b92d3a", - "78500d6d819dc29468a68dcd00d7747a4b86405bd6d46c40bec5f629e4003102", - "7260516e7149aa33af4b0b4a093f2e0fe33c13f4e78b620fa35ebdb71d01e7a2", - "fc5a0e8198f71b49a58310e9396ecb27b7c34794757564d6588b839fefbdc28d", - "6329107df314548101eca2f5dadecadc8cfa618a3bfb2f44f5095f326c0e07f2", - "1e077bc29fe85864149670bd35ab898327051190be3e7b44c79476deb8af0e57", - "a128bbfe2f0fc2586eed1eadb8ee1084f36ed17321be8c52ecdfaf41edc79c87", - "6710ceae0249571bdf3f2e8d9d05c4f505403a4bbb6dcddf1efb0f620e724a35", - "cbf602d1b41b51a564ae205e35980adabd557580533e5cb8309009c1bbde0d31", - "236343b2eeedb3b5270c496dc83ec97300fb5b9b120d100080579ae774724b7b", - "952ad61ac17d3d19f00d3303205b469f3d250c8d963c6419f64f27f52d25e189", - "b7e20c68322929bcafd24d334bdac9b0518169c88e400efcf55b9bf37dafc1e4", - "f0b7dd8b4009201c8fe28b461a1dfc45aa5e5336956de96081175a9fee25d462", - "1904d58b0e75f72601f7108b6393d0351fc44d73102b85cbd1039b221fd8e53e", - "97164a4169f1a8d05ce733c05c6cd1c6f720a15911157b6be24d7af92e8aa0c1", - "37c43168232a38fe97ca4e80f289e904af473097d10949f476cc72142550b4de", - "3c85581b5904206c0b3be69ef7997e12aff457db71409b2daeba6a85db46f938", - "d8dc147efeaa81b7cdf81e5a7a9d5a5de563d85bd03be5c0982294bf67413fdd", - "e42fb83237c1425c096e8ae054a23a50e6bae9b21214ac9ef14afd4f4c7b8f4f", - "d1bcd8e32bb0212394c3900f13a2f3fccac84b1782000c6cf14737b416aeb33b", - "4dca549867d1f5a7d54df0b17926f320107926712c7677611097d85ad3af005a", - "113dd27e0fc9cd0c62de9696f4db103a0274a301fc9bc984834e2c7f299e6f6e", - "c7e320b000a423ae434507313ad2056c54c6c8e196a19fbdd7281a2800ff008c", - "57bab63ec88491bd9513467f2c888370674d71f07069ef2e8470568c4ef8da8f", - "1c1520ffa1133cd45ced34bb7bad2613296ea0d106200d7a6e15951bf6b556c4", - "925954b6b7dd03c0ad5f5ee5fdf925069e2fc14d275ec39b8fca945392eac667", - "e700bd6e827d94a5cfdafdfbcb85d5c949bb0773401d126d35013e33b01bdb2e", - "68a7eb11803a46deb7307f7e326c906a48772e1055482d7655754e742870dd50", - "ed1b717ac8dac8f5b0cb8d9317f8e15695d5c46a2f13e4903c6428ae3a7225b4", - "08e4ae2ae4aa00f0e294de47cde4cff5e2f21108cc00dfc4092a34d1127a1533", - "1cd9480293f2c81a7b491caba35ea21a42f59cff0682527f42f03692e74756cd", - "d8e5fc4dbf3a7b9f8bc11379eb5e5edaccf73f32a9c255fe103dd4b992159e8d", - "26721083f8cdb665568dc1c51d9ac3d47d973f336ee8e4cfba46d5c52ddf404c", - "7073cd69d2925461cab8b42d4cffa4a1c101fddd03328d5ba7bac975ec6951cc", - "a0ae1534317fb6ac976e5143a9f838093520c6720049a16c8a92171f6d2aa7e5", - "0f0042dbd5ff12e8163046be8a59f1467022020eb7ddf8db05fc7c9854d347b1", - "fb515e28a14d693c415bab86b7092b49fba0b71d914365f8be7b33c4bf934e12", - "28413d18d8caf40335ff85bb5cb2196b9720c3c7367721580e7ee2337fd70346", - "281d65f19932a89d7478486624eb9b54c8561a9d71d688991e4984fe01ae2fd4", - "f2da40b7e65b693536892a278556a0229107e01070615d5b4f792d8be5cffa93", - "ccb50c38cbe0bc2fab9b8dc5a9845007b9488434c4954a3b065bf54968c0a91c", - "d8a1ba12f8c09bbc4adc9faa1a513a89dafed23a33619a335f667a4441240e78", - "e136fce32d8a0e449f56788cf573b4315e9d1a529fd237ab05441e5a8206e644", - "664a4e0d0493973c10395d6e7338c45cbe27fb889bc49646aa4a9934055f74ec", - "6370a94ee695cb8da6f8da121fca047e4df647fe41acbeb764a856d847f0d34f", - "7b8c904eeca84238262cc1f4053709f5011348324bb8e55a833db65c59f2bbb8", - "4302b2794cc6e20ecaf9bcb5a09f708f49573912ea2a506f1bc7558203e1add5", - "d433bebc2d155e4b96564bb7ccfa7d7423065a0fb2dff78e16f21356a699a370", - "e0149cf3250138d47f0a3ebeb6201ea1082d7efd35232c847965bfe27e730e31", - "bf838267746bdf149f486fe7b22ab832bef7cf10831f1a48e3760e75ddeef5ad", - "9c000ffa1388080fcd1863196c46c72a33e9af8c344deb4e2e311eaeda920fa2", - "c3785fae3e21cda173b1e9ed541b09f6ca7a7521132d49ed48b0c2c5114f1e6c", - "8b41b13f0dda73a00c202aeb46222e0be1883425c58da69e811d367856a56794", - "b8c8150f7c55f49409da192d77c77023d81ee21dd2f77eac9498264403a9e07b", - "f423eca100ba8d14ce2c1a6593f126d257241d99f27ec465c9532717763ae718", - "390fbadb47ba6d90098d0c538b9218331237f56fb5e5e711f3294b5e92220c3e", - "86f9d9bcf8005e5d16cea4c413ea2516f579a51c4d08aa1db24eec7a0a6b07a6", - "c9977647b64da81a7ce18e4f444133cd987cff2ac0428a0cae7ef05ec678166b", - "874ceeaf21c54d729abc2c540dd16f9e2fbba8366b95760361196df37e56f4e7", - "4d609dc4cb20a2083a42d07d4b3d8741d02963818928b3d111c60d7430b7756d", - "14136845b838250444cc127b3f1a8c9f8707cbe15cac0ee41d34517fda82e5e1", - "030d4009786c32acaa499762b5b5c88d9de6f73f84cee617a6dda6e77530c15b", - "0eff61b11bdf9bd5dbacf16b151639cec0e017e91f306c4974b39017e853d443", - "a1aab3c7f213f8eba6d54cf7ca2e518a6021709317e77ae1e20079a48a42e34a", - "d5204c64f94d941168b9011a9247de8d198aa6a7c6438bc40afaa882a50ff045", - "ca29287c1d96e4006b81dd16b530e563ac79061d9d0aa15b329656b218a1a862", - "bea85d7b65d7a5bce10e2773383025d856735d69a6033c6a21f99dc60881a100", - "72a0bbcf2c1fd046a7d84a3afce57633f4a6910a7a78b994961b3dd3517a615f", - "8fc0587f6836a5e507725b8bb54b81bd70115de1bec028bf3bfe7895bc80aea1", - "2e7fe6ed1e7b481e57cc2d8992b16f81952bbf9968f0d883013eca2b83f5999a", - "3ef053262261aa2c64476bc54ecc43f59534385a510a01018e426ba8de62b78e", - "50c6399fd2650f6dc3b133c2270531e94b109f79db5aea34e5927a177bf6db96", - "5705f432caffd780401cea75d234cb20c9d91c35a67b1ed7c71057bb3544f54d", - "1ce661d44563b7c648d74b82c22d7cd44b26680d57e318cdfc5b83dfbf56f933", - "7f20d546f754ee00e1637a246145ba6bb54351ec44b3220f9b14ff233c913757", - "99ba34b4edb57b667140906751d1acb64cf1fff0808ce8bdb08e76128ed6cb21", - "a5265285777c7d149b7a897f80ebc8c0287b88fb9d3f082601ff689cffec2725", - "ab28ddc933dd7dd3e1f832b88255ba9df0bac3ad69602a21ede9fcfc0e794db8", - "6be3a324a60fea3e4131f5c8eee1986ae5b06eff27feb14b263c8d5253def787", - "47025a1848eacf150634980c7535b99c76a2ed2dcd2a705b58e961ef3edcdd34", - "b23b0cc52795643b19538dbbb56d263aef32026e7eb83769bd112c7b0cb98b90", - "37411d1a271e48de24b395284f3358b906db0a5e8bab2a39fcb1f2a979586942", - "7b131734b7f277bca44f9798d27c3a5a4eaabb8f4b72496261c227e80dd47564", - "8614615d42b4c84223be1a1e9dad4237ea37f67b4026c655e88e38a1a396358b", - "e4f65c7a4d1d8753f5e10b2069c3271fda545e67b466ac53b1039346a653c914", - "c5ac6dbdfe9b75c3a92dd2758fcb26e5662d4bc18fda02b55a281efde5277d6d", - "2098d0ca74dd74be2b14dcefe257520ea7d57bef3deaadf097655ae48a2b6921", - "2e91f7a468d653f67a618735dca06bc55a2107427ba4e6d87ef9c455fece3483", - "0510fd941b57d5c417ba66216a585a69f4818032df9b2f783ccde77cff1e71d4", - "ddeab94c5fe0ee0bfdc5f687de8f3cf57e7f720ef31e6c6701eaa3341f1ed91e", - "41a2b08af15cb992879c63baa8e665449282c41a512a390b65cc4a51fb21ab68", - "0271d57f78ff2342aba88e4cb945a2d19224d279c3a0bdc1eea72301570a1fe6", - "8d8b6891013212edb733ea96604f4f1fa24923e0f80e3a5943746b0a3f413c65", - "1ad47551ac5fa6bc9e22368dc6c6897bc21a3268877d1ee90fed50b8d5116bd8", - "580288f6c3fecdfe3400712b63a3293f240eeef93b2714d7a1984534b42337ea", - "a6e360a2885504ebd59e12b1ee8c7d35bfa204b866be294f593220e752bbadd9", - "feb3e11fe20dc1d08f7233d2edb7c387749d94025cf01202e13c0d1962b09c79", - "da141dfb9344a8b027c88a073c4a558aae0f621fdb546bf656e0889fe99c7601", - "6c876a8291a87542a1b1881565c22df25e3af1f285e274834b191af4b878e55e", - "0b643b1049a2fc0aeae70a8d32361f45799b4e4295562ae27613f27c1026b1ef", - "282ef6bc879ef387a8d929d45a45e23f4e220d3d5f6a9f4a7fc9cf76f87eaf59", - "3852db203557a60f39d6a1ba242c81ff62f793ab6397b3a94bc817b50fefe31d", - "b3d307cd21b99f2d64b0313073d1027451f6e2ac852c645097e15c2df571ca0a", - "9812d8a3ca011250ecca7b07552a2c647682c6157c08ac3d5637bf652e3be1d0", - "f95cd8ca983101386edc06820f9076221fcb290077c1944f81f53d84e49725c7", - "b2b67d8771d2ee050a82c0688d58d418a473c6d82a0fa85b1a07a5559b381d18", - "eaa41730527df887ca16abe02660a860cb75ef5152fd681af97dc8b8e410c7d5", - "fce6f85507944df6839d7dff1b5d9aac0a538f6ea2aaf3a3662b23d761730c25", - "428d9ed203895949ae0e63155b4e79c937bbb8071f127e2dee4c6473d214e4bd", - "753bce259782ce2459d209a67ec6bee614204a7294a2693a3d44e8cb65d0f24e", - "725c693ec460d7f5195891955dca42ba7d72de51e66abd6ea9de42848c065264", - "7c3b3fd1b3156557b140e3cb59269040ceb3c02484b83ed31d2463a4d5c2a48f", - "c7633025130f00ca993d8d4d5153c9e4465c221b4501f505778983bf372fc1bc", - "4bede917b2146b516a20b172e7c9c4feeedd51d74cf0154ca3cab164987a2f23", - "0ca8247e0c01928da73e072f4450812b0b3b38153f8ee05cd9d44cd263444ee0", - "0532d632d0e39987ae2bf7153f458fcf16386a02aed22a4ff081e32588895a5f", - "85c6174a3883e86572055aca48adc7d7a6b64b1138cc529cf5860e1287a40726", - "184ec59dc28715b79dee859ddf7a164e80d91c0c5d0f9d319eaecda5d4251d94", - "0d5d464e25004aa5bfaf536608e1fbb7c414613f952b3311c3c213c572f84b3c", - "f838260920c78f139471c9eb6f12ab678e6b1a99f5427b50961fb1f5d9406be2", - "1b7f4747b7781d971f2cfb48e1cbece5e00e58f30da7e8d54ec40796522ce9e2", - "4228a0921e7518f6c6897d8b493615477c703014188dcc178a0b2f2b90a90001", - "4888e27d6d54ad63b5535dde50846439d5d4b201834ea476d8b868cbd4fae4ce", - "789859f354b46dc44ac7b45a7d520115cb3e569e380652355d70b07f9bd88b81", - "314f24ed137830b1066c3473cb56cf4bfd969d804f4a6568f4d3938da039818d", - "479ec4e1d199b42162405e10385bc47a5956891171396d895514bea9297ea5a2", - "e0589e8622a4ed7772c61bec836f733909b9225b72d9f6c58435e5025942689f", - "baefd4ad7e0fe7a1fea7eb68c3d585842eafc2bb4d267e66a9c7c864bdf8e191", - "e806890ed1089cffa7cf2caa39b360bc7f793c727a3183475ec582fb6e0e6204", - "c99de917ae7323760cc2494d969245a0ead2209bd0766d56f7dd78a67e0a94ca", - "d7795100ea43a5ebdc6f63e0cebe4e058dd2f2cc4a6520aacbf91aae140dc83b", - "02661463cbee9ff4349f1a7e7b3635fc7ac6df6bc4f21e5b178a46719ba7543e", - "654106de04401928eb18b43d5fbd6ca1f03c08897780e834024868e6f5d5c891", - "172815b5649dff6edc717dc11caf0a11de5637e85305517d6a72a1fbb98e2e6b", - "0644c8409140b10e6023b9715bbb63c1e040be666c79511631f9e451150c7853", - "812224399906314c391ea2e603949fba49cb6408f91b6e7666268e47888bf1b8", - "c0effb07257dcfdd65ecb8e95b2992762478fc484cec651b664e692f17f801b4", - "a335ce39094cc5fc759512f3fdb7cd6f2fdc9e4b2b542b793d8feb78e880834f", - "2e3d61571c321912671cc7c9d842ce218f488e27176d62b5558c142b3defc730", - "abf908c3bd3c3fc8d2f719f9f466393cc55a46b9fdd6dc21d982c7df57d29dbc", - "7fbbfd817de0541bf57f58ce3b7c0679432e1d76a965187ae34657d031863f44", - "66db5dad3e9b83e8a1a5cfedfbf01184361426deb17ee8e040e18b2e0a7a8ee3", - "8b5f0e1150b1e8ae581a29708503887bfb034fd3422ae6489c89c524cfb918db", - "876b823e2b715756f6bc8ddfd08c19d1be5c2b2fa811d9ba11a461469c4b95ff", - "4be755f3ee5ebaf90a59299cfe385f6bab9d0c85514c75e3cd6c1fe2ce24cc04", - "39032a7056902284ff2608996a649f7a8d1864722bddc67229396cab0f0702a1", - "60a27a65cc12b2af161a4a0bed4e82edc8ca3f4dfae9d2d73322aad590ec6a5c", - "22699d1fb68b2785d34a6575e4903f938798bf0cc52b989e0a45a8a79b41acfc", - "437f4e1e30eee857b20fd2ad0882c860b9dce2f074ae6c3f8630429d7443ea65", - "5150f80aeec4060fdbc7394c53aa7f11597b86e3451b631bb71c23d53c3dc4b3", - "ab7519050a1c72d0bc21e5e03612a6404da2e09d14c24cd505e5e2f64a152c13", - "429b47d80dc175b3b1b7d3cff212bcc6bc94ca1890cef498313bb17f4bc8871e", - "d385b285ff4fdee257e5064a7dd11da109c1a5eeb49c1fb70c2db5c1a1513d0b", - "7c1ef1bbcc9c00498cb20ce3378df5d42a4e4b031fa786d2dd4a32ec29cb0e8f", - "223547329abd6ec0c1197cddb0f31e862da8d3d956697799a30013fbc635021b", - "9c5aec0f6cdb43358ba3197e97d6891eab20cf7ddd423d11de84d70389a66ce7", - "571159986d15b7db38fd12842aae47daf8a6b8a2396e02252524c378f7200e8f", - "9efc01d58a811580dbd02300e40ffcfbae281593c721b2e6cc1d1fba3e9db583", - "d36c21edc0aeb04eef0d77b44ce3455d511243320a426cd4de324e38f7be2184", - "9f30d404eb0923131bad05ba1d5abf7d24491c31105b2e82cc69cb1a7e59afa0", - "a7240b3c3e7fb08d298d26b9dbc23d0a36a18c063348eeffa155184d57972321", - "5b44ed7468092f370f2e2aa5e852988da095c624daeae2129c82983c9d181157", - "6127a456c82dce064d6ded1e05d165c21cb068961d2e457b98eaf07a663bc998", - "d48fa0d7b32b850a2fb81ff02c565de47327040bc1ebef1e7e5a523fd8c39622", - "c0df5cf3f49bbfbb8a661ebb055fd02f5b7527d362633fd0ae5727132bfea146", - "77d6ebcc4aa06c0ba895826ed9e97211ea92161f1878350a955f24d2772057fb", - "c4f5848a8396c7290ac5bafbc2578561d11fed65ac54b63abf23b3647740981c", - "25eec03c186e6f8d8e539662bca8b9922c98e40fece6711eaf054b363880f49f", - "557278fb601ff193ddf1b6a44b49891cc2c7db514e385ea9c3633d779e76a206", - "b3ea331ef809943d94f1559c403d954b88128cde37760a2310e24d1223c5ebf4", - "026725c6ea6a6544ab1ab3c3a28558a63b65775e3b453799e188218fec4fd461", - "adc6e2509d6ec819e0785ccd67ba558d1251934c3392a8f31905a3870a5e197e", - "d32148012cc09dd0e77eade411403cb7e51218226f6563ccbf1d330140ea3e5f", - "42bcca2cf9f2c3aefca3f5a03fee7fbd3fc3e4c9b517163f1a756a5b9d106b31", - "db99c26ed1edf089e3cca1f354e04bfdcae3e47a95ca8ec83f6cccb9ed9cc34e", - "b935f0e0ccd791ada1298d8bf9bc5795d64703c0a572ae062378ed3bcbf23231", - "bcbe41bf94e227ef80d110130ed11ec68a42cf943e40b27846f95819509139df", - "41cf7bfd05f8f14482df44ab5e544a0f8006e0b97501dd0ac63c873ba9d269ee", - "d072cc7eaa596bae0d72d9eb18ae863b12666c9313d118f5bfdf3bcc2be51667", - "d6f587791775b13b4aed7aececb6fc68a664b9e3ade7c0101d1e9eecdad9818c", - "9d43bd53d5e67aef21291e2da13c7e1fff75f4c16ef5193a3a5bb84c8203bcba", - "9c07ca1353a9528423a2851c41aebd5c8f6a200cbbcdc64f64b33bd3c4afaa30", - "60219f5847156518ba5e89437b35e78ba4cec354609322e58b6c62e5be39afd0", - "4b0c1e9d1c648eff9dfebb25647675136b4e2031c117707ed81dd064cb4dfeca", - "f6539352d69db602dc5fc0963b5417c92be3d454300b8ec47013faecd6291ed9", - "b04b5058138277b5e700c7be4e4298f7f2b92e47577841e2142c501175557adc", - "659aa597520b2e2f281ec3378b7f2dc952ab40b12d614e6e2edb05c0c24e72fa", - "5195303318d576d4cf6a09c0b755cab568894ee3a59ab67a36e1f855000d5e37", - "2efd6ad44738e524df646692a37262f9b9fa39ae0c9787881c689745a93e2bff", - "3dbaec4fe97ee0d65245ce5172917a51436d3c9be23ab76b4de48d2499837410", - "6be11be1f2141f59b4c6a6aeb7a267a0e834b1aaac85becef0a4ea9953ce0b5d", - "68394fc56d29a609a98466cd8e0eaef0b9279894be134f2b8eabf54de24e6c14", - "ed4f094c34f38e08905a59af811d8b7417a05b5a4d5d45fcf86d518c5e91aa0c", - "f0cc1187365d857c02ebabc68b8d0b89e0b81c4a275bcd24e18fd57f093847b2", - "c7a08678662fb233bcc449d72f2bc872428c7710ba09f2baecf2e572973e3e42", - "a45907eae534cc38625ed3f53394d6e4516336d9f3fc838c55945f13890b8dcf", - "b810ee47bec14e52e20a0f3de3a370066348ee733a7b341e3c89f7b3ff2b41c5", - "87cdf8d1eb3a7fd2072c700e9b74434bd7e23bd206cab28a32af7c097a6e25a5", - "ad1ca64803ffb6b8e80791338b33e69b127652f56250bbfb1d88b7ea1cb6595b", - "51572c0281ad175d0b366966cbe31e3d1324101d4b6dcc038fa8d036664a5c67", - "19379fa1857679273d0b2691c79e7af80e1691191b0cd7e5b59945ade4914e42", - "d97b97f92d5b5dbe8d518dcf653733bec86475ce3af88b5431f7024c3337a658", - "bd3483a467d9e065e84f42aff34c73c6c73561b04783c2aeb0ac7129a26d143b", - "b8b05ffa3e965f8a4f1e5053d8a1e205f2491265507f46638c9cb5e1385c2b79", - "46040077fb405923f8eeb9afa5c0c537cb07a99505c49c8b672a0f6ad00fc043", - "f9fd272d41f3f658914b7ee08b2dd431afcdee2dabdba7608b36dee06ca1760a", - "5c6f1832bf401d19e87be6683180de038597c19e053d12a6668034bceacca9c3", - "7a90f8fac14058e86c141ddd9720875e6bd074727bb6effae2ba29ac7359d1cd", - "52d68475f8f15706f91e7bb7effa0a9c2d86210228e3539e7f7c8a395a073fce", - "a4fd7e9d8aff87c57e5c305fe290e15c5ec6e4f59b5edc0106e2c66301d057f2", - "11c8a464ee2cf5db3b663a357b6057846d280f9368538333967c4fdb14db29ff", - "b9fe1b49d04dd087cff39035bc89bd4d20a3b9df40f0feb4aa0d84246a6ebae1", - "9765fc66debcf120ea867f34bc30455caf82fea07df6154b0379158619715701", - "7763570f310f0a43f974aa35087284dda3c6044d6fb4b098847b9d4fa4db49f0", - "fd786042dba3e1784032984dbdf0aba59abef54e90b49351b2c2f620049c1c40", - "fa9f054053636321890dbc9561ba8598ad4231b838b5969bfa066ec03c5809b2", - "acd44656df660806a2f4efc9d27088a6f986b3600bedd08a4dbf52262844db1b", - "1862e3b8390878e59f300e340037c41845dbb57a73cfb2dfaeeed9c69838b467", - "58edcddbf5e263e98e155b7d82c01de0458b71b71cb411ff9473e7cf1bcdc459", - "741a16fd483796f2125fe7f85fda33a5224d144bf6f2180e95cf2349267203c1", - "4c3a0033715636e649896701d40edc8fa3c095f97c17980b11abf5e53d859c54", - "05f6e7195410ddd78a35d6db523465a3e7e2d176be759cf33c441722e10040c0", - "e517c2549555c10c8b175c7a6a894d645c3c869a867c36741d097c279c0a793a", - "7319b8a529d0153da96557af35dc59b845edf90b15df966ea26d226126b8b696", - "18f8a05bde70a0905a7527ed8cab8e96bf846cb05b84cfb7226300bac6d6f65e", - "e24cdc0b31bde8989f43afdf15280ca2913397404c9e96681a3ea3a53b3e18bb", - "79bbb5bf23664ef7b3bb31bd271f4a7b0248f33fb2ba6cc3a263c6d9443bb709", - "b7d3e390454c7911ccbf667f2102018fba0620022b256daf349f39d2432ed527", - "03e6a2e7da61999a5fb864e317e5a715f4863a233e411f24e959731dfa8cdd5b", - "8f400fc9f2c394bc1adcc3722d3734fc1559813f8461c4f767dda085fd69f797", - "56b6732cb94de816b3fe0871e0832ea476ab2da8e508719933d8606269376ef8", - "f46ba6256d0db4482506a12f127439edc562a83c8c73a44377b51bb89925517a", - "29190dedb2205e82699e4655995f7689b219e5b8d5cc93a62d5fb6eaf1e96cd6", - "e5633f5a256399b2714c32fb164c46c230edfba6a9ca746ad68265b1ef586c8b", - "e97b71aabed9b1f75cf0f0b425b49e3ae10898371e905c2e841fa02113116a64", - "e86a6cf867cb8acc44dab0479b8a00de8ff674604da6507aca6dc9334a610e8d", - "0cac0432175074f18f4a0c7ae2044fe06f80b41237c5b389064834d7b1a17b4b", - "30363918f99ffa81151519dcee1cf1b295fd8eff56ab80a97e732cccecb818b9", - "19e90bf74e7b354ca0183434ccbaf78ece8154cd322e536823389b4242af374a", - "8de3cc19351db45be9b7a37e165c9c45380c6ab258e99ce2259d2eaf48ccbc58", - "f49bd7acb1e74f7f968d86839673daae0a1397e9a197a2e7ad56bb9e6e1a8936", - "4e1361d2c36958fdef8fbc7f3ce71aa109d184828fc0e321df36d4be0e16cdc5", - "93031657407caf5b25d1d04bbc4e2b25011fa2e4b65a74b4c3f549164e2cbc4e", - "2c7f11f5bcddd5cf9d0269401c70e0a708f793ac95b1dbb69284eb64ad36d337", - "5de9f75a0816686a5ef2764b46f65774fd5c9487d1950545e0b9ff929269aaff", - "4cf2ccd8c434159c1facb67a846b3f965e2422d9706cda9500c575abcb72de8d", - "4a2aee68952f659f9aebc860dcfa222354bdafa2eb3d3ff67b444fa2cd71953e", - "7928ce3084c521cef4bf929a03c0097ad7eb4347a38d9c066f4068b28c813daf", - "962b5a71349a7ee05d6fd19a4ecb51f2634254c5d3fe6bfcc8a245c3a0e066b8", - "3a1f13e11bc4d4d83bbd7808067249057ae65241e801cb51a15f06f977738b99", - "c1311f6a12a3ae8cbeb0647ba8ae3666c7e51662de3259fcadd7d99122e5493a", - "5b3d50c07a8411cc41e610d2c22b1b1363bc94c3d4d746470cacf7a72d0e910f", - "545426a6904f60235febbaccf8ed8c59ae8f245618642a548f76027e16eac343", - "0d5504299f4bb601426118bb8dd832c8269ca6e63c2babbf06b74a6795617805", - "d978789d2c261c0201ca209ab56cb04d3a7fb0ef38164dd4f4f43d41cf19e282", - "f53f6877e101bcf32ba0b027c53d4337a44c244fbfcb0198839cefd7ddecdd42", - "62ee72f36d8fc1858854a748189fb56673fc09f3f81bcaff67ac666dcebef11d", - "376520ee77d154210a68cd4ff7e29c62d8972fa34146a16e457ed70497815dac", - "e9d4161330dbbd229a0868e88b90ecbbc2b75d00813f90debb0f35d2c713ce78", - "38e9fe6d51b31688230f53951bbde7036b5ccfa7c24fb445171bcfd2218265a6", - "a9b4c34c55795ff36badf0d00195668b816683679487d9fe723b7bcf17fe6548", - "a4b6fbf094930830178c4cdc01a086f7ecfc95e693fbae800b675f006e87c61e", - "d3490f2d32cf8d1f6b598ce840d9a7a42279a338ab0488434ea6573017e1c1e7", - "cdf0ab291bbcf092a657b3d260bd52c41a7461cfb3ded8cd5132328f0d39a355", - "d487680e4e8f7d7042cc221fe5dff021ace200bcb9661aacce756e10855e9480", - "d86637fefad9938c4a8013174f98ea3eca4083bb7514cd905981cbeb42aabb9a", - "81eba1ea04858a85c4d3f1bd985ee495cda77315817a25c0cc83b025ccee5632", - "4c390da5945a0f9f0f0739aa27328f225fe4f1b7e03021b7648d5c73a824c8e2", - "e76d94653efdb485e316cec8ec93f68ba38fa30dd91b9981f5850dc877bd2000", - "d69366101a60074a0bdd91d9d560233e3922410f05e6fd95d2063706c019dce5", - "6fa714a666b03b0f3b148f93269c3f8c23eee5890afe7f6aa6d5764efafcbfd9", - "c8c1deb4ffef60ed333b848e5f1e2dc34488fe464ffa822717d7f6e9cdaddcbc", - "f216521e6b63f24a98794144d0522ae7de8fe8444f3b5bcef00a218988b6243b", - "1614071e3d74b1a46892a8791bcb67afa8b223a73f8b4729c00595c4f9382af4", - "8354f8e747736a0e47d11ce7e5a9f1329bd5715f1ce2460c515f83192c9d1130", - "479a0711c23094203be3cebe22e16a6b103664484bf07d1f7e66509ca564ff7c", - "22044d9fff4e10b4a860d5845c9272f1ec49569bfc576fa7e8b6230c83047f64", - "5a310682da08eec7e4e43a953f8a9b23a29b9ff15a7d306fbf224c861d8f2cb8", - "acbaa40615a3f9786d4d6d26f012789ac7003925ee7a62d66deeb58497b08346", - "0b463084ab2203e298ae72fd96111d9c77184df4ae3e71b51f2b669b34c3c3ab", - "af13bffa7b3f178ba4a8cfa0af6c0c5a18dd7527a2d6499a274d9fefeb1cf88b", - "351cb74c58021b87d72a5070d0035d2ef5f7bf87af7d0057a6029879ea2c5730", - "9c675f776c768647399b79d91655ebddd096261d260e8d8fe5808ea20c1fb172", - "e7cd539c655419304550f6ec8d5fd0f86f3836704db52e11dba6b2d0ca87be73", - "8bea4804ca24deca938642be26add45730e7a573e469360f5b7c6fcc50e787f0", - "89d4def77430070f02d9abbba5eab82a4bf376e7e706f69f475fd3650b6771ef", - "70dca15dab549e25640f2ad4ef36093dee3883f7fcfc5078a881373e612d248d", - "79829b1daec1f30ee365626517796d12a3860f2af6a10364d5ef959e6b0fc0d9", - "950c42e3803179f6befbb0544bdcf65f3166ac54e832ce700f66f50aa25dd9c5", - "1b3fa82561f47bfaa4a5eaf19d1e472f4131315f82008604d206c8bf4bcefe46", - "b7d9479a3cec53187ec157ec1102f742af439240537c39a51d6e7750a842bdc9", - "09e3a7ab7b79a1b9e7387bcbf853428d203b545bddf843df8f1b8aadf1cf22d1", - "662fe44a1be4aa9f2d6ac40e03d4682e948fa4a0956ea31c93f360758963212b", - "f17bd49f3cc90c318181095347850929d24d01fc4e4c06504c6f5e26a2088fe3", - "77e9a9aa47e8183e4224ce6f104554a14baae5ef0f60679a99ee2bb4f4362f9e", - "46306dae42b2fd341c7951fa8e720fa85e49dcf53a510a6fca39e568dcc344a9", - "088e15b789daaaa88767b5766455b8b08863f48c2e980ba5efb46b242bd74649", - "f9ddbc584dff86546020b702eebdc7ceb7801f17d9e898a972a077474a14fa99", - "ab198010bc135a64f5557d149e3190c3c12c86fc3b0a7afc04498f5f7c8197b7", - "28764f530da5f12ea0fa084f5c4a4898ce63b80951e9cb00e1461538fedc5214", - "e204b755727b6b4502acc0de36c6aaf24e4efd359f4a6413bd8ce4e03bb00348", - "a3855faf5dea373a81df7fc2e3449c29ea64c7e30be46b602cea0bb67e02b47b", - "0dada36db04bd9d43043263d637e5328bed88e81694416cd9ab26a23b6a22b56", - "fde631374318ec031546e8986c4fa397f1684dd8b9cd50580579725a288c11ae", - "fdeacc56fa00eb869c534d5ae63d52222d06315d0fd349e25d4632cf2582f17f", - "e64052b9642c779ac5524b3c89138fc16bead883288ca53c3caf727667d6b01d", - "a3aeef2d8f1ff155c0c7c12ee5dd63e13a57adf296748d4b3ae2adaf7a89b3a6", - "395cb316727d7cae93d99899de22ec327e43a22b8151f03196d7c5d97167cf7e", - "3193c0b4900b682f5341b5b4a4e68fc8933abff349adf87faec997754592d528", - "b66c4f04a58ea88634f554658d73aef0db7f5bef585c908a496e5c80cf07f193", - "6c0313b5c9a268d0b9c0e495c6b65578b25e6fe78fbce7cb34cac5d523cd86f6", - "8b9aae6bb8c7d2cd75b5f8532007817c997c5b0bef6e0e6bfffddf1eee1330f7", - "befd49f3b00c06c862c3564224cc6d238421d34661be3f57e3eeaa595eb9be80", - "60017fa8c648dd9cb62051b7ad1aef1f93d1353766f147ccab7d380205d42f6c", - "dfe5fea78c52d3c69d2e287cec74697f101c212cc23c99b102ad83019306ca49", - "e613701bc6d23d2d305b23e61513a635a6ab1f61c7550e52df472c394b0b5b15", - "bdf28ca5d6e728238932e699552def4805b04af7fc0da836b9fb7798d7f20667", - "17615060504d8e5bfe4bada91fb5e972584da5a6c01daa18a7094d21d694c015", - "7eb7cf95fc247adf8e90e64c8c85467746afa073cfbda0e1f5678f84d2d2e333", - "f7851e1528783fa6d496d8f9c66c30583a3443ac0e67e324165fcd090c9dd304", - "9da502e39627acd77f76f28d4bc4ba614ff3d24134b13ff7fadbd8acc16eaa45", - "db21ca85cf06e781c60ab2eebe73965979b71f4582c42f18d09660ff0ebaf1c7", - "afd80e8ecd5674c8a2fb868c434f5ca62da4a1feabfac1ef408f962dbea7050e", - "63439007dc09949ebb9b3867573a78cc858fc1dce239d89af7a58d117eb1b1c6", - "5f968336eb1e624ec4ec429c102ca15776c6d53b62d0368bc8825cd093d73f0b", - "a184f346a7e69ccb723471e3ef3553b0dcca846077d579af0839fe570d722609", - "94fc45d417c27ebde3c7ae2b23ab57c60aa578c58f697185deb7bd2284bd8c88", - "8b24d42abca8e8410a002656c2b82f7ad2d828e6a149dca75dee08964e5257a5", - "f0c4d267f6e0062d3a0e443d2b7ea4c4bbf5570fb26f85ab91ce908907f0dd93", - "992ee4e7c5adb6e5492d14a6b0aadc191f1c0ff22932edfc302e63c3603e5ae5", - "d58fcca2d3369f1a80ee4779c086b6fe8d9b59d51721e0846fc3b1b7936aced2", - "10ef4386a8fac63f28705082f54acc60502529fe34cf2d61ef3b236e6f7660ab", - "72f21f77860992de51026a976254b0acb562aad938d16aa179b19157358f12c5", - "6f0cfe8d23f3a9c5eb0a9b2604f11402382ef2f596dfba6f936c126e3bbad862", - "1c9f1fbe37e412a253a81ef2aa19445be25a28c3459fec04549db28e4afc67f8", - "89ccfe3ba4499de7a7b58e724b4a45a8730ae3ec9e658394940ac7cfd20502d0", - "8e9d9ce4ebdaf09cc8ced94650abbce4650b329fbf59196d95e939f8b52d50fe", - "f7c3a5cee4a65d1e4b8599f8a1c21548d0f0b8c55e5581581d53e8c4c697e17f", - "efd586eae96fa51f0c0c4aaa4bdd2c3c409e38eb0b94b2f5b232355cbdfeed15", - "39b1ccfc868442832732fa49c00d1431c16feb8546dcf7806dd9fedf9e02c1d5", - "113dd51108b23f622eaa6bcafb2898bcd1fe4d56a30dde0aac1f7a1adc6551e5", - "910bb0555c21deebfbf9de5a69570f9be62869179d57b6133a4289f2f70f181d", - "3ea54ac831153e3ec9e35219c35f63ae6d7129db2853b4053dd785dbb756b172", - "2517eb304f31d28a0a37d5864615c2969a08e0b262762dd8c2f5f4a8e6b8633c", - "d9146c70af95afb2b4263e775acddcdd54671bad0cbb55ecbd2dda0ed0383d9d", - "061012178b9ff74ccd675ab19c21798199f87f16e6c01bfdc14771abb52a4321", - "554cf8ab8dc7698cc4991ff01a471117a1594e8eef4b9b46cd8add0b3eeed187", - "1e93d0d2cbfb6a1c078027c2699a744b4c13a94a37a8d13b6baebde272958dc2", - "968075e4c85f1de2ef35e25b29167b4cbda9689c8d4bde6a7d42f1507b59f37e", - "fbf912adc886f524fbc44239bb467e92e9584d3bb897421e8a1ff4d0b6f9e586", - "1ef06a7021e267aa49f2515124b213ae2706b66dc39c71af9f6fadab65af5af8", - "62aec9a0a84e84b82ba5ea163f24984590d47e9a3767ea534faf0c8e9d20bc9b", - "9e1aceb5eb49d9b774be8fde15678a98fedbae78c4f500c852cc0d32ed729810", - "5046fb094b3ceef5693957a9de57127168a0b1cb4b740ee5c70a9bb4e19817af", - "081051731c58d51ad00cc1ed621d638313cd0116b0ec4abccc67b286a3d26918", - "ee5628ae40dd685781c74dcc89ac30420f7c863726d37a324384f95c47a3f9d2", - "9638b7315514d2dbc0507c9b3e4a5d1c0bc4966cc995dada778b702312198f72", - "a97cb24d49d894a8f9954562c888952f5fd28a19da481ce0e35587692c6ddf17", - "5e5f22adcdf95eba5a33de1c0daf3fe53a720a479ce8cc92baa19a52bec38caa", - "0a45e445b5fe563476db930f2742e9b8ba4786563352e5c6edcbe7c8e534df1d", - "d7012b7363e93de47869ea56250ec03813e68026512ace8511f1049bde75618d", - "e6efa7e3a55a1aa3a52402d848bdaef13f77c4a1f23c6136475ee546541dca0c", - "1581f0956035db84e381201ec0f10dcd273ae9bd4dffc7bf778791212ea6d90a", - "6ea4c0d21826158e9717248672f1e29fb5caa7dcc2de5cbaf4c12d6d719adf58", - "1fff7880ad12c7ebb80b20a161f25780342d02675801917a51954d437b6cd6f4", - "208bf6246f949309bd0288327eb341b1f145a90670c857fe1709cecaa1cb7f1a", - "64ce78add93c0bb889dfcc09167472ea6b0285540010f052021f830de4aee6f9", - "bf594110bbef8768c722de9b907b88403d11e5772f3cad62d395fdce9286faf8", - "76ede4a0d1c81ad519ba30dae5aac58942ced087ab0987b0533bcb0ac5527ea1", - "f8f286c2dd3bf30631d269a2ebee7798393ce570869aa854bf0824e3314b90bb", - "68d67ec531fe7ccb02db8841218d776a3025b77b6d8df6b06a64d0cdb5a332c9", - "c9d24b6967767d1b592d69d149f0df0d8056f613363583d5d3f74a5a14dc2afb", - "405a3798d7913205c1e2013de4ee649323dc8c1f0b2ae0f7b7f0e5f397f1977c", - "cf454b83951b58e8edd2a81139d7473d2acad8083ea3220e54eaa36921ae3450", - "2ad496550b78bb7f0c31e0966e96b974c9ce0ca1028bb9f96c0a4432a7348ab0", - "a4a1e8502ebd5f27dce76784e31eb1e0314f4f4040c00a5e277408a72a1175d6", - "ecda4bd4735dd899f9a47f78d178f6546399187d9c783dd1b487c79324136a3d", - "98af72c205e8ec3b5b99aa216be4f16291a5dc5ad66b6d46cd707605990a89d3", - "b3b08aee793860830a2443e00be4ad5a471b591279e8b33ce478f984662257a5", - "a6b3ebb222b2ee07cf141866a9990d4ca337891656bf9a211a5b4c2b152962f7", - "69be721aa2a80451218b2383d3e63198b0994bc63fdcb5c7e61fc6315e3715fd", - "5c09614a2c07337cee6b19f36ff4ff71d6ceeccc34ccd7cad9044f98077b9044", - "da215b9c918b8a642339c74e62678a1a29b4234a89abf5d100c9cadb1c49229f", - "1c8f852edf71e4606a9831747200f63ff4fca6ac563c3ea987ab85111f1e5833", - "18700b099425e4978c8db70046b8e2f6e1fe4c873e594562e860abc035665bc8", - "ffd9d54dd937992d62de6f4de44a96a03cce75da1036599d415e2a0250bd5b78", - "017266948e84841b499daf3e658904a692a81211cc86044c51bb08f468e0081c", - "b02db4ec507349ad9891d9019b31ad03b1c8f2999e59d072a608aa18904224b8", - "ac62cdddf051a7a8b43f76b700d1a0a2cf5fa4db5213645fbd15e0a3f593c268", - "a388086074288936ed2e583c9d0d49848234017e0a2e9782eba05e255a0aab27", - "d741dca04e193deb9b2ba1cb1fa383ebf84edd9eb962d6f3f10216a8d7840cac", - "14aae431ad6afdd6dcf238c32905339560446b2c3235836d6193cf7cbb0c05d5", - "aab26ba4d6728520a173c67229b39fb2588e64b379f29a2ef67e107f1dd08f15", - "e501228336462f35a5c7aaed7a45ca2805600e969238e49e8567788c6143b1a6", - "c13212a49093909f1d664d8e1dccd740987337311569e33f26607a5f21e29d66", - "a841e75355739109bab1826ae5678dc3b1c74eaf6cb06de25f9b43cb4c1bac62", - "5736f60ab82b5c87d9690b97d89ba45ce5fb31719f63d236e378e2bd30d6f7e1", - "eecd8d95531adc36b5fc03cbb599d66db7c6f58b5c8a2f00dc776759dbecbdc1", - "2a0da0c30b8af26240d08ea41103697a3c750a0b64055bb6daaa612506c1b066", - "385460f8b5018fdc0908a9f2510a0ead23e37fba4b04787d6348ce3f622e2e55", - "79e39dc42ea21111a75182e1b372ba8dace1cd28d98208bbed3315fbec3aa4f6", - "39672c95509c8e354823e9191d8f6692aa13512bc1593f7e916e549acda161cd", - "c82987acd933192442bd22ffd1ddc7013654aae322b939bc12496308733218b7", - "c7228e2678dd8c813d540b494819d20e53d1e04af595f9b238755555f8078e89", - "55904381045ba018fe09be1fbf29dea731a3c69ac34dcb7ca6177ca40b711630", - "ddbfd4e57bfdde3f58e7af2d5551ee4ebd18043b34320b09b8eb57e15320f4a4", - "bcea496ae8695ed4d5986475e036436279827ba48dd0c2bc3fe89e1376cfadac", - "d30fb7b5218fe96fb57ee15a9c998b9c411fb5010c12e72858ba583991f7accf", - "8b51add18a930d59210310a2cea34736c20f9360b9ab640ed5d5dada31295456", - "a30664bad861807e93965b1866af24e57d331d30b0e997fc7d903f7224ea949f", - "b09515d0278f19047bfa96082a822bec84ab36320c19957297dc427ccf7a91bf", - "4f5b6e75cb55dcb0d855673f99a942ccdfccbcfa6e4ed0917c7ee67716facd80", - "6521611699416b213f92b8577fd9304b3dcec6e1869fb77fbf6bf7a50b2d46c4", - "7b7846069b60aebc57c03e928ed502b1dc9ba15fd5771092c783b26f97989fe5", - "4bc9507fbfa001ac6dc04bbb9349deb9750a40b02c6f1ade52a86b4c3011fb8a", - "484b5d0b7ccb450e35d6a0fe93775563cac75096c9f306e36a3d7d9cd0d5da07", - "010dbdf47b373e4118fddb4aabce464e932ced672a5460ae6442f48f3b70712c", - "1a473f1279d52ac9f831af4c85aa697041403471760c6e2f831dee64ff4db24d", - "316d25228fdb94d99b120abfe035845ffe0bae09415f236ca8011e99bb1a5081", - "6c1eb95e5d3740c152a3e9f77fa70be118cd7c9fa765718824b60a0ce42f6b9e", - "c7bc884a3242f69590a4d0890daff1088cc7d94816cc52f3fe88636cf8785627", - "c8c18c990bdcddeec5c130361162fe8dba5df654bc0e4f233d3bcb0854e56996", - "f3a414f3f16b113f35f5b591e2cc47060db86813e309ea85a5b7b7db7db40143", - "fe9e97856c032824b8e53985d340584beb1763daa39d6ebe6957488846642d65", - "c86940a39550f4a6f0ae9ac474840d51311528fbe1a69416da0542d51360ae9f", - "36e952da251a9a77e745deef78245f359b9174c7d6c7e648f3159feaccd25d65", - "86e3de2cd7d07612d0377e18b74da5af2719e7dfb27ace9cffea1c7b91f88b70", - "40fc7cf54eafb0e4905e5e0e7e84efa7b57a95f20f0da8d371f527545f2b8551", - "ca3c7d4997cf11f260d03f6ad6685d35b16f4777b66ef411ad5c78041bd22c0e", - "cc71df65e91c4f4f89f41b45218c4a668033fcdab12a559b0b272c7d92e48900", - "585975d5b4ac975a0e881948cc6dfdcf4398a31259b7a7ca9739649842ddad51", - "02c78096d21a629c9110556aa61a08747532c9e124acb2713cf7307c160468d1", - "b8f2513d6ceaebbebf0975719a5d2f1336e32d2bc24e570b5e86f77c36614eac", - "3923f0e3b22dbc7dd994790b3bc1d741d946f3e2e5c6fa109d6b847b5a04628d", - "b720680f9d5d9003ed073258278c4376667028c390ee00b21d36200afbcee59a", - "270ffb070c0860a01dbecd48101b68717a4196e56b8944aa28739607435fc88c", - "5a56760350fa95e791665b51207b1db44331708c1a157f1681f7ba0ec9117f11", - "d2edb0426644ea58bf7ed134995e0a8f1226ca72cd7e15c6b2980a030155327d", - "365140e3b5ca48a45afc7065f0b92a9c64806e999ddef205d84446329211a819", - "4cbc657ce554fafc8b05ef09f1d275eb596bc7af1f2f8021ac3f0dc0ca17b87e", - "304d3a857f0b7ca4a85acb15b2f8714b2e0ed3f7dab03b6175dc358b7883f54d", - "614c50a863df74b71b014a9ec3c164cf98549a92e01af0fd458ccdcac5ed1f6d", - "32db56f60a3fe1bcb1a68b71cc2dc312edf5ab2b117ec824ea7b9347c5d74975", - "d7598fbef00add2d59c41ad4e265393717e92763dc15390fde099fadb1beff51", - "d9a338d2e01f9a27304437a6f87fa8271f2e7ef1ee41dbc4a97ac226cab01207", - "162e7e23da6b8e2a8db623a8d075d830814b7d098990e8cc3e761fa6c1ec9408", - "5f1017cb173fef9d8d752a8e146fb31ebad53e0864686f149c3dfdb3c97c8aab", - "183c263f604503c3d20e1a0cce723403faf70c22667dd7b7d0f5fa8d1db615a2", - "a78ce3b63a8a0ea52fe56d4aaae9a025332a84a2f74660eab20d3177d5bf05df", - "e5a5044daafb925c188af5634b03410109af80663919d061d7487772b5271797", - "acd6405b5838090de38d65d9d509799cc3e21f87b88baa02c685b6da9cbe4033", - "7caee95c970941577fce2140080c5290891957e1ee50e05851549548b588f0d3", - "5ff64247c4ef248cb90106cac1d7ca568d8317e9972d0f2924f911143904c540", - "d8eed38c7d7f8f5aa0693eeede840e4cf8d0b7d10d3cf5988e46beeabce381a3", - "d2691d1dae7be47e5c935212f00884d3bb5e031e7052d70ea4681e7f31a40ade", - "8aa76e26ed71416ede8953f33c7ce6ea717950376ef74997f2f17e6952931890", - "5863ad2590e2bd308ed792e4f8047142aebf2aabebd26cd8de8d8fe0b7a0c839", - "75632d56c3a22c5c8e51671296d20d000c43c2ccb8e559d6413832bfd68cf3e2", - "1f43ee7e6b2d7999b28a8377844a9710b19c315db3bf0a3ba28c55fba7a6bd08", - "fa2f09fa2dcc1824afde3c3aea90f8ad120e0841c771fbf9e65ba9999ac5b132", - "acac5c88d4138ae3be9d41f1ad8c2bfe991f748f64492b35f120b0bc462eeec8", - "7a6f31df732ed252b66422b51a54ab210f0405b51b67bec839a967405cb1c412", - "bf91c0b82884b2570eb4c39f75db6bcb2c1eb1fa6ee6b7ece5d791710e147f83", - "5e80fc7a4175845b1541479f950b113f96e73fb82ed2fc5340a77e6afd91349e", - "9e1d13da830e70452657eabf25b2cdc6062a35ff3e8c86a1d41735fa91d22112", - "33756cabd6ccf7813f3554d69a6fd96ce4d00ee6a4f9adc0ac25119a48cc959a", - "9c7a60aaf76b9dfe65b121cf1937079751d97061a984d8bced002f5671cc4d5e", - "f8d0e91bab17e3d1f590c0c7035826c1692fb234852a22f0414d087de936ca02", - "c0aac0aa138faa740436dbbaf9859c8a42cb18da049ecd3af361ac9e2d7c7a65", - "c6fd1a8200053ad29a1ee668e5b8a8ac5301fcf865fd8f8d89e3f074df8e6239", - "cdfeb8b69022eb0c48670538befa0e051856c08a5d059e87ab2617abeee7fcd9", - "0625624d4fd209a6da474ad7c2b82a3e708e0b2f1191e5466ec02a58894e86e6", - "c154868130106ee6394ea47aff2784287c5a9774f2fe75f3b20858fd178cd89d", - "4a13175300f7c5cdf8363ed00817aea0d10a901146e1f5c3037dffb410a1742c", - "a2026764b0023d7a5e4f51017b9ca4ae8c325bb6e5416924b068be07ff8c3d42", - "1a84d5623a91dbcb89ae051986efe7404b6be3bcf868997898522e799078117a", - "e401556750b57c25ed27429083ccb56e6e27411961b1aff462061b11a5737529", - "7efeecb8de09b89d31c79257490fd8ce735e895fe5f613d7e6893cbab292fabc", - "1504c3142381486d64881f3ca1cd474ccd98499f0f6c7b26d72806310503e5c2", - "ff4d508fe459f8375247fa4f3d3c5c7078b06f93128156053ef3a68254dcf157", - "b99d35549c48f500a2d309df686567b94c5ecba86c6b1a7258c35ff18d6b63b4", - "67bc809a4c6c5d679ca0e5f83582d1b91510eb0c648713cf1dfc3ddcc5e039ba", - "121f7fd863bbf6c998e1c2e2ff5e858334f08a9e7fd83d2b793a8cd95fad2d47", - "1b48483a091b80922aa00383bbea3936b56bdba7a08b6ee9b7211d9e57fb17d6", - "118b90733d9b93c9479f5034b01ebe543fe44d7195c375a08e359c25a420b555", - "7c01cd0d99a04d6b2336545eb174ef76c6030a9f589be981e8ad22088317037d", - "02019541937d825c6632a43aad8f860bb70f8d74884d9c8325f9050a61564745", - "65f95d00b1a7cf79fd1d8b24bbd87577119400b4e2a0e341e2bb27fc37ee3619", - "7a691e1aa6716a0733b54125b69f5184e4f21661396bd33fcb91f5b695b5f125", - "a83ca2e63ea4f1e9d045c80fd780101a1168c80bdaa9abd7ddbad813c7abb28f", - "96fee30ec0094161ae728db8d9b4daf841a7dfdf0c8fc9873f59e8a2b2d88dd3", - "5c1b809bcbcbd9b8aafa93d8547eced616eca1a396008995a3bb9ba24f466e08", - "f5d76df0ecc99e88059b022a36d7bb3ca685e7c536ec25c59a172943874f957a", - "b490082424ca0e6f82a3b7d269f6b5c09ecf7a957bd530e20e80c1df76f5967d", - "d99a94e17020f7223316dc213f5ebff1ae3b8e6698b6c2703a5cb9911acf889a", - "a832f950fb10b13ae5eddac5ee6b49db874e851f91423e2fc6cab123b905a0c0", - "957b602cd843dca7934a291d133219cde17ecf92e3e07eccc1cac2ae38fa3a95", - "71a04d4b3a3b772ce651fe38a853209b6b4bb4bd44a4043c9653e2e4ac8d0a36", - "2cf86bdc606deb785a36ce7b522c213cf6df1a0e4c993a1d87f3410ff04ddcdc", - "52b39344392b5ea73d3631583ef9b4537e25722163ab1bc3d27ab409951ee9cc", - "ead5ace6a70820a25dc9b1e9771cc9309c9da8f5988c80d2a91202d05c566236", - "05d0a9fdec33f483cf2d2eb8dbab1f8caf2983b67d2c0bffd41321cb211495c9", - "e6cf837c5d369c34583675f04d366632453581f1aabf3a80058d6dba4f1786e8", - "1f131cfd581bb6a63d61e39838e3cf45f78b4187a3b864c67bbd366d79a1ede6", - "cb8789f4bacd7b9ebaf76172305e08a899cc670413b903459b03b66f93838eec", - "dc4ebbc284fda5c400779f9973928eb06e9836a7f82959b6a37dcf2b68cf1e23", - "bc0f6d651d4f913c09a7cf92e80237031005e7c71fe922ad3fe2e067e190c9d7", - "63ccdea59c66b226398fe6d62d2fa15d54661070af04bd14f4ad51e5a8b0162f", - "9df53aeeab811a12633ec975ada55d0bb356d691d2f50c8cd086745e5e2228ca", - "4761a1a3d95b35f813fefcc5d86eb4e560d9634959e0f0cce485853bb6b864d0", - "d904b0acb3cb6aa70747a3f1c5ffea63733127238b931df691eb426f98748349", - "b1b55eaeccafe0c38aba33daf735e503f95dfe83c2c048083fae6844f4800068", - "853a13e40a9267963d60bd54afbb508a31fc2896e21f8a521e6c40ae5ba82c56", - "14ed2b25f7597a0ecdb41d44f1fd0f6c53284c4e5321cdb20a522de4a710e0f2", - "e3ff86582fcc69ec37127c2ac5d01ccfa289eb28bbe77c077541979737a35332", - "f4116b2daeeb80012bcaf08d80eb8547b350bb8560af0b526ea681ea2d90c7a4", - "1cde4fd94352196492fcf5ee7c810f4a39788b239f954f6a513b046551a6c99e", - "711f4eacf42d175579e6ffdb43fa3a515bb13059de97c52a0388fb04bb54cfa4", - "47006f65ef03e2f34a48a5522f94671a3ffc57ef9162b034f7ea52d412eccad1", - "9f4b446e3cfba8bbe33002938ca24106f6c019eb243ed05e6c3f2046e0aa61ba", - "275d0e3e12940eb537baa95902e1ebce96bfae0e877cb356bf262f852b41ca74", - "369dc3563cb7cfd0d7410637ce2b658bd75c4895a31c266c843395f0f03a1aff", - "8aa1a0e0c5359b74e09efe1719c9d8f26c2d86c66975a5041dbb4a65cf00d34d", - "c5f4a74b50dd5b499738bedc8657b0fe4ffea408b8ef564666fcb57da71504ad", - "10c170f24dd32d6dc3b9813b6d0493e96a5bfad86dea97cf482c1d2c212a1bcc", - "1117ff89f7ed3bec31e0a93c272dbbec9c245d1a12a47918c10a0beff4e0b99e", - "3db3d8f22c6a201ed261fcd2fd2a8e5204686510370064ecd262efe1475fb972", - "3d52e5aff1a2092c85355e9770f8abae5a444908e346dd202c9f10dc2b74abca", - "adb977e44f81e8e95951bd1c1c5fe32ce42ccd8350379dcbfe54dca991c1ac00", - "22326b25a72a01a81aa199613ceae91a0859f0cdda8de08a59ec4bb58a9470bc", - "cbe62bd4da67fbde31613336b996c8d8449ff2a62b74285c9ab0205c4689d60d", - "b9820655908517c4b5990aaa789c261649ebc62bed208eafda73f11b1c63f3f7", - "6f454447683c8a17faf95535e0b085bbff005fc5d2d497ae52105b1de308210c", - "7a9ee06f29b0df5628da2b9eacb2a9d127759946733e4c421eeaee9ee37ef4c5", - "a976fa905b26c17d86b1bf5ddefc6936363052d9e993cc1ebe2c08565269dc24", - "c700f8f6adf91c95374e6a31ce417777f99ca2a74eadc52484221fe7dcf81420", - "e7cde7e1c0844d9ef26a623f5232ae0bd4ca8fc927e28ecb3fa041be708afa2f", - "9b1f43eb2c4e0a5deaf6346a0487cddf4e48a2f62632887c09e5309cea066b57", - "aba7c0451688301d942c76ec88de4f259fc01900d12ed498ea4eabc97c716d66", - "3ea47ba83886e1c247e1821cbf9fbec8847815b36066058625adaf0a2f9c6f18", - "ee98e6d73c63465e1027f47d544b2e6ac5a1ac960cb763d13d30a9135e2dede3", - "052a9e842b218b5b4128f3dfbeec1de0c25f0ed348c0dff71f4fcc2ea23a2210", - "473baaf9c4da9a34a6424e47741b20e36d6ca3278e9a591e0f377fdab30e2083", - "aa7b182056f16c08b2f9c7c332f98c7ce9cc99fcab56f26f0bf9e08040686d22", - "ec964271fe5c0a2a851b03fab3f63ca2b2072ad17f26072133d2fc92e9384b54", - "d55b35f95a2a68447a6fd8aa3507a3b29abb437853182b17463d4ebc50ba1ca7", - "c463f17faa523c033b0ce1b4da203b98ffd2d61359c1bd431af6d6abc18b3b52", - "e08db991b055fd8abeb726fb49c9c95423472101269fdb4a1c9bb295e6907206", - "18066ec519962ae724ce3fcadd0559cc530a6cf6122e186fb1d8dbaa50e2e66e", - "8c2bb03a0d3be4ce8565ac77d9714e2b10c8067e5482baac30196448bc70e997", - "266b750e001f9794c15abe5f511067b29bd62da9b05b2501c9c12307f7b98509", - "568491f1d739618982fce6e051880e035de1a91a18c0be18526baf8c5a0c2c51", - "69cdc825ee4b5f5765b0feb7ec430b14274f62ab8bb843bde6e7f246b61e4b99", - "222822d8899b7eb3460f17d4edb68644ba966c10ce8f72b8ca585ecde5b79214", - "6d550a595af21b2e4b5310cc21bdc136effdf030b199d9692c97a4dafa710a8b", - "f36c693d8544031efb2d820f92ddb20dfbed4c1ce11ca6d7d47e370d9cbe5423", - "858cf6d2720008093e8cbc253900dfd5527c90d0c1371ba68ca84e10ad64eb24", - "b16c57238306f6135b19ade7d8f70f3354b3786d302b761821ca72f74b9b6fa8", - "4340f0f8784918764ed00700915a332a303ae52548e0eb68c98bd4d21929ea45", - "a36e561e1249d2c8491870c80834915c3731d62ad8e10e468616c3430b80a255", - "d8c510b493809642a829fba8da7a887d2c8d04df7d0156ca16a9cba160971146", - "e6ee25d6383a08143ad0f92e5836f8c3cec1a4dfe96719494e6f4356badcc370", - "22db62416ae19e09f85c5e299b810eb65c964062c56917a15ee4daa36b726fbe", - "c943bc1977e4ae415035939241620b7100870a2bd7db0a86311bd235a77d3435", - "07d1137ba8f4a01372bab29925aa6081a30d82051b0130092f2ce8b36e1e9936", - "1b89bb930efd7a151c1d33bcd190397e404ea91f2af0984dbca897d6bed21218", - "0f8bd0392c2037a614d2856cb17cec08d28d8bc11c7b93d2e0162b8325c74f66", - "ded60a7829f5891851cd173eb5550f749b7dcbff684155d72e894a8f5acfaeb1", - "35ea7b42d99b43f32ddc61bc140a7cdf153f785b05aaa38826460da542b28ed8", - "aa26b569d8f75d9b846dff20e358fef3d7279b393a6c2e1a15ae03a5cff6dc14", - "1f51021b61127842a7a0ca261f3af91be713d866f4f46b47be36df6878a25d08", - "87eca77d1a2391e7986b9cfcc132b1396fe6ee024dc1973215f4ea6660f2e39b", - "6d1a3cb62c9bed01181c4263cfcff647890034a62ece91b3b2c53b8400bdc469", - "e7a8e68a1feced0455470c51c90b121423e4ac878177d3743e3468a1e03ca30d", - "3e1f8fec698c029237d2bb2b02614cde34a02e07e62b003d2c6fe3995f9e4af2", - "3d458fd2729a2cfc5373476c70e2aa65b260557f43adfee1270df133fb489240", - "7d22e351a0e3c25bf2866cf2a079727a63fb69852cb0ff2cb2cda62c79f77670", - "08ee89f91fc0e68ef5a42157601bd1d23a3e252424bf6f0c57f72d7a71fcb6e0", - "5e5a0a72032d46ab6818bd9f71de3e6057165908c87837149722d19ff81007a6", - "d7830bebcc180297f4357f03095567e3d1fb383815215e9d3066662a86208285", - "45f0dd4031806bf2a87f74f3b137cd9b1136ebbfde3b018e08217d2227c83113", - "f87e354bcd93ee4522d812bc4bd30471d7e25a50a0ec8bba157ae36e9a610945", - "b2e9587233a27931d453a40bccc5165480ff687f1bdc69ffd2c71e14c18381f7", - "2bfaca06e6fc79d787285503c7686624088b7bfc2e572db8bfae7307fb9de490", - "26e1941df3a7be4d676fc7fa60d2c9c7d7b648296e43a941eac69ce8b35acdcc", - "d7ffeffc4cf820225707efcfbc07b03e5f6ad6a0a8c0984b5747caf42d3741a4", - "2fa7675e50ffa06678a83e71b6d14c5f209fa88f5e14c2c76d94f2daf9b85352", - "6aaab4439e9381801716b3e644c5bc877831c8bdbb723fff9aafb967737dd64d", - "4423fc942e6782b898aaa99435f89872fea23110a48f3853dc150f6bb49e8073", - "f80093f0aa7f1bf7b871868ddb0dba27b777a56258e4028645d3ff0280e01ee1", - "3d7260ea25b2dc4e05eae42ed1118fa4ed074a8d8a755f7237eabd712462f94f", - "4ef9b0893f45d287ea5e4d0d09058aa82b0f58bb2050a25d65e764fba4874afa", - "0ddacb05a52d80d2732491b915d933c14be5dfb6afe32974096e9ffbb0e5aab2", - "4e75ff1d37478303e72763a77e4356663c861079688bd0edcd0db53b4a36ab92", - "7348f47d2be79216817b986f24667371acd6980babe63d75650c24ac13a79bda", - "7822de498c2ab068e21cdf3f3203f9bd0da27dadb7ed4eb663c2ceaece166021", - "8b9dc61b8acc2361f2c9f5cf6c4915ca73c117bc0256cf28b036ac42e6a5d087", - "e97247fe2aa90546183a3de3bd0531c971dbfac94d38beca78adce91b3a1fe8d", - "f89fa8b30e19f8ef635b77e3f0d71f77989dce7385f069535e5558cc63c041e3", - "cc0caa9a8b4a9971e4da6adcd95bfa05a13b2233915c2097fb4887268527efdb", - "2fdb6131c47c7a709a092a897caf6222efbc449cbc73fb281808877415ef527f", - "eec8dda90b4822662c7d5a28f83b3ecc9caaae6d8d2a8238bf2f58a30bc7fc5b", - "79e0148c20f0e0aaa6df6cd20822085932abe9a3c44e9e932c0e50b5fa08993e", - "6e1ec848f0cdf979101ed5ef61ea155f06d1c3d9db0b67441a098cc6910c1865", - "a18889ca6107df421cd5c270bafa42a9e5973f4f34e587767b3db95aa6a57d50", - "dacc5914181d9b6c30718e8cfc679dfeaf65f73dd26ae5372fcc9cb0cca54173", - "cb52be8571ae7bed1cd21b35dfc8c2217b65961a96c9c02f0ebf3a5ab50e7421", - "9f85ec75bde1251fcf425863e5249d38c7b1a44022a1a8e9168d9f63c6f3215c", - "08b4c649c07aeb9d957d9d2050379109949853c5450aacd22724488d1e08e154", - "9d600ae35e2a0e95246fa8d4ee7c974b9e9c2cb89721c12bb0e49fe049578871", - "b5182b6617a211fa66d8ba8444c8f326bc6fe3c94e88c265f399c3b7553e734a", - "9d5e81f7c153a18e803375b407355bcaf2844b739178405038a59a4e762ad2ec", - "4e977972623d3360d19b0434570e7e2c4f66728fb757d7fd871b5ffee44ce015", - "e6b707e8c18247db7865a6a0dc45ca6d5376ddfb1b8514f4b20902bb5be7a768", - "59e8543377b4c34b36699c5942a4cc071b7dbac910caae7dcd70529dbcd75138", - "9468568b9b02f2369ed92e888c1027c81eec411107037c23ce2e8f133851ee55", - "68d0ec052c7f723c6e0ecc1388988a31232b74e96ba506445e0bccfa5a511a5b", - "b2415783369138bda3550de52ce3359b0a567d3ec455acb01ef7334df01b88ed", - "3b0863345f1f81d458db761ff232fbf4cc5dfe99f464c447daac1e6c0f3b289c", - "30a2bb47f9783f280d598a50279585055d30f5804326081594849f9e34942739", - "e65c91e1a66ab73ed4f250b6811c1177040f7ded113102accb637d4dab99f6dd", - "4bb0ded7ea70117bad148a3359b42f35b12a552c27fa2ed9e2d1d4a36e644dec", - "56824b13003ab31f633c167dde54e97482aae12252c1fc44b3e7803c79c1bc3b", - "b310e805b6b1cad8a37e8b3d01de86ba915f7b8617ebb1d8eb8ffb4001a39acc", - "cc06e7a441e89a5bdfe5308015f7023fda7b63c3d96163ec242250f121a63282", - "750d72070b27f234d5adb01856a6e595c99da5ae7a826cbf2d18271796dcec47", - "3d21a25fd3848f1cc5d95a97eba673648bdbde66ca6724798214b2398e62206f", - "5ed60637ac0c5cfe8b67929e17cd96f01b1719ccb8a4cc5147051731f5c6d67f", - "486be6e865cff4db1e433a768b15da10ae13f017a6ac3abbabef1597e66aa5a6", - "b73f5e890a010a9a7b1d030910b2be4c52da75ba695ffa24ae30696760bb91c2", - "3feb00ec8f96b6d97c38fe7d1bae036b9dc28ace77091ba1e7895a7f02a94354", - "94fbc1414d9fb8d9d92084c79a374b24b5110c1be87206fe3a964da285d9093c", - "99754d668709144a0dfc4e743e4206a490ac6ea30381004759f9e92b5b1431b7", - "49aa57cf8458477b16c587241921379294aae60bceaaee43456f4b5b191cdee9", - "16b557dc06819fae661cd888de528a102ee2bd6a59b1a5023cc205c3b8698364", - "f4d8b81bc34f6d14ab01a2849f5ccabde6273c8c144a858388d68ba33ea68fdb", - "47c4d30da42fb4bd1eda65bdfc4e9e82632f1a5eaa8c0ecb55469abee1ab9b73", - "961a4d5000eb5d84aa05b89a2b2c794c109cb8f3707ea05806aa6f98d42a8d2c", - "3dc2244916be06c8f4e8744e22eff1c1e6369c6c6420fed1a59ac07c792475f7", - "e60617b0a6543a047c222208ed64f1bee8b9f5145aba0d3d2ecdbf7b23c00e09", - "683db7787b325484658a66428f38e36907af2e7850e32f54f2c2c3abb0b31bca", - "09b995c1f796267bfdc9f01d952ffa8b66156fc241fadfa729131587c76a3102", - "5515dd7991ea049808be6532f48908ee0fed126a07d71f61d97fe71f9086377c", - "2e8b36fb9fdfc786d51303ed195dd2601521808c608bd059a97be303a4ae7547", - "79203de9c13c9cea6c7a1957acbc4fc0a2b536c4813e4d8aa14d442bd54f220b", - "764e953df946e270111988e270915fa1cf9cfaecf2a397ae59656e0049aac462", - "bfe4a8e2b832efae6d333cfbf1265f18c04467563e79a433a91e2def43705774", - "4c3673a60753c2529f00e74482194c234ee8c83509142547c744a201eb26cb68", - "1a4170fb1f05865251233b781c3da18313b61b3d8be3ef4ecf810430981fc55e", - "261e4faa81b29bff3bafed1ec59fa9951fb3fb212231476ddce023ecebf5c3f3", - "745959d50eefa7a1dbb79f85027f5bf346e788a46d5149860aecd4ec9419ebcb", - "f2bdd8adebfe36714d5e6c40164850f8d82849383c93ad646652afed321e1eb5", - "42ad235a594a3b9ed0c488a09247fb72aba60c53ee39e4326992d3713f7c1e02", - "80b5ec700f6de1f4e964549a09cd5b0ecfe2e9b08d32e4938442184ac8b663a2", - "6d0cb9ee70e6a2c51251338618afe1a5fdfbc8b57dd8ee28b12a390fa769286f", - "aaa7a422884caba352ef6efb29c24ae977e1a1e3d23185a13f2c98117519ec01", - "90ad4fbddcb058e77983001a26786c1d38690acf1c789adf678a64a209d35932", - "c5501ff2ff00b592e6bb2f7f78038dd749d24ded46d3d1820829b9dd956584c6", - "2d8297e0357436e416c0820fd90980c1fd56de1406de1522ce9e2fb88849d7ad", - "3f7c385fcd0d639b97989b34a2d7ed4c4bd94764fc6fab4cc6df5b18fa3c4553", - "d7bb2b18d2dc633468a7d77a7bde1fb21c3a150f75aa165d7ac652cf8a7ff137", - "0602a72076b43b2c1c33b40d96f4107533f1bdf8a5979579950671e8f055d41c", - "6832a1a9416f502ee9dd236c753dcbf126de5d78a247acc39e859838a3ace886", - "252d92d08a50e1f9ab1877f7a718047202904bb244efcb2ebd661c93ded12250", - "d18ff0b0baba28d9b03c0890187d511a7f8e6ab241a09e27a0edbac3fa2d31e6", - "102ad88b844a0fe77f234944e26a566fef7789cd800369f9062c1a2bfdb5b300", - "c8ceef279b7bbb0654952c91a859100b1c0e0da5b10140cf8888824ef2788d8c", - "d7c5cdb33a2efd4e4ceee1f47adc198c5c2468b64c2ca4cd086fecf037e0cdf6", - "42e5c71c59dd42929c117c5365883b147704c5dd33508082d2759acdd62ade42", - "32b6beb8d5eab107525d62dfbdd1ee4ecfd29c6f2b9e4df4280f6160c4fb37e4", - "8818653c38df074634313a848e9f1011c23b5bf9570f785496ecae63480b618e", - "9a8f67568c5bac7c68c031c317246fe98a5e834648fb4ad2df1e2d7b0e103a1a", - "957376a6045e55156a378c9c2b516a6fed3ecc6d423092699ddc5949ef25e75e", - "5ab74d974e7d58868b065c641985e333f3ef9e4496a99caa1895e045dc5b4674", - "2e2e75a81b512b4c7655e18a7320b938d218a5f80880afdfcaab185e7494e0c1", - "d38dc5938b121f648462eb32fdbe342b1efe3210ae4a5fd7fb73c248290c922c", - "703e8c7e23f807e63662c4e1a7f5c29fd98eb86643dd5221b42f73104d14b4c8", - "ff77c85d6b9bf88f5c64c9d16a1f28d32f86f50c33e80fb9522f45c877b67c13", - "a4e15c01ff21b61aa76ac12b69d25135c4b6fb7132da5594a15c2150d8ecd195", - "1b825f5c37102b873b8f6f5efc0a42f45489431a203a7b938a61219bb8c8ac8e", - "00dab60583b1f67e757a61f4fb3b14f41f127c92deb46c04cfa264673c4c3d5d", - "0f7d8d2054d562749414307d017204e7daf2d79dca24128fd527cd4ef2ef1aee", - "1ac7cbfb83865953db4513054a6601ad005d38e3a0457029b24a169ac251fd1b", - "c881627d3ef344c64d8241842eb92a263d850a63d35f5912e049b8a831b5a23f", - "ee750e7cdb778f4eb3400fee5ec3cd08e30b7c638f5517de0f7b1dca59dc5cc0", - "0876df722ef88c023b0bfe48c961bbc1332cd09e09ee238a8e789ded19b4f5a2", - "c1a1ad719f0602384ca3ebeb9b2ce1be498915d219011cc6a2549af72cc7e830", - "8f78ee82a292c6537878c54632c6f60fffb6e62dbf95d3e670b48ba842419356", - "db6f652b16614ba831f59130ed58b3c2c95d83b7f195e6a28c466d76da3458c7", - "a43b11e1cf8edb0c8e35f66ee0114365a34e7210e5a6ff5aa18e0baac8eed272", - "93cde47d50ada512424fde55b140cc2338a59b7c32c73d3002cfb5e7402b6467", - "5f84d3b2b6186b42cb3de46d6a1fe6a836bd2fa944de2e6ddb14a6cc773132e8", - "3a53ebdad1ce559637da636dd0e515cc87c2cc53c6e41659f3d48445b2f332e8", - "7f5b7e1e88d1690ce818686eb99837aef82a0b8e0ccdda4351fec8263f9054d4", - "46d0a85b0fc70f182142eb90ddb31569d37875ac7590565f86222648825528ba", - "b7862121edd9d021873febc18839c51822dbec9df4a068aad760517550bfa903", - "4a2b8bfd37db969055993f4ece01a9011d3f483421fcf8f105bcda91635a526f", - "3eacb807e36adec4a1e12cd4a073137d417eb529636e793e89444ad417c75534", - "b5f240770ea2d86f15f67c64c3d277a4d3e0512c8fd0009e9fe4d829774d66d2", - "967db873241d2d65339e54df35ba044119e3bc42b57551e38025b259b1a63d16", - "aa8d2f34cd35a5cabc306dae19d979f3da36ba703577d0432120d7290c536fc6", - "dbdc66f1a1bfcc3059dd30bba156b69bd0e006c1c1c611a411b0664b6ec87d3f", - "f5da59f9d77af65dca7804bc90b78026e6c0f0e9a0e724c59ffbe24bea2581a3", - "167588cfec9a5ec2809fe09f97767e279bbf874787ef17e556ee532ec106c803", - "cda9b94e3df047f93f96fbcb2161ea2d431a4409ad0e9b2b7bb47a83d53da7a7", - "50d4ad20272c1a99673b059425bf44bdc3eaa8ab15f9eccc6265cfa9f4e62dab", - "fe6527b26f3cb3824b443023bd062a40ce45060f6ebb4fccdd2b772cfd816490", - "27df880643d5bb19f00bf4582a1d7cb653faf7bcd88d062768291c0a578826c3", - "35ae7193edd7777b51e8c0379c10db2950b81a66c8e685260b6b64829b68c5f2", - "e4fa4d1c57fa7e7c108db5bb1171d51b598e1e02c9a3dd340ec95aaf92de9289", - "ea841c6fc44049d891d8130aaaf2c88c93a2e0f3f5b5b7da655d38dc60b70f47", - "d5ea7f50c0ec48fdb226837580c143f259be65facf722a0688633fd62468eb06", - "899ed6eec6dbbc62e160c50d3035dbe0d45117c3795519719df47e9fd656157c", - "d6efce4258b18df108e5a5cd13c2473c034cba3cdd4ad4cfc3688824160dcc19", - "8a0c23cedbd1aa2792a435118c072af0d49493606bdba2e2a58e68a40c3bbf39", - "09555c3b0586fe6c7738b39f40eb5c5a191a97940e0d1ebec949e519e921e310", - "f6783a8336084aac6809f4fa3c53776f9972231c1b8627decb22861e48183f6b", - "e7c1b0dec977462923a1f6c76593af24240a74e35a27a8ab0a0f036963b29670", - "0a5b05352774b05553bf67ef26a4d3ec85876bc4625bb6ad0334f96da1c5976f", - "813e9848455d530666ec48f98da1252473c8ac87267ae645fe0824cb515e1db9", - "3974d97d8af689d216057702e663702339ae6703128c1c22664c83baa87b1377", - "6f913185c84ff781838408d13305453f969cc33e65b0c5157a32f65738706628", - "5a8190d1664891c89b6cf83e9ace30cc5bff0cf4b63c8ed2955a0995b39d8649", - "0d524f60715759af0374d61c1f74834eadae04f9e8b64a01ba35db3580610518", - "f777b14a2562571f56637703649267ff7c3a27694ac7b3c60c6dc910943af30a", - "98b9f0fe89f0be875eb7bd6518252b91388ab5cf481da736c11c909f9bd692d3", - "510fc11cd88c0ab3c35c4536bc98cb833cb101a4defb37e1c789b8da5b6189cc", - "db1ce84de5a30b56c7f7c4192778ca0c456cb868de2382d46a1753677934b213", - "6013c4966ff4335946c6fbfa07ffc8a02433185ff9f0ba2e6426c38eb8ddfe76", - "40b2c34af71959b5994cb5e7edb7b506a46114fe86c6fe3199187960e4fb1807", - "1e28af5ea3c70a46e91f657c0e575bf03586eb70078ab006544b1c11b7e2a351", - "f2ff76e1db577e62a757c2bfe4388c2320409747969d5f0390756543021ab6c0", - "2bee3b7f262b707fbf4963bdc0d9108cc0747b2739e391cf4470d3d92a251a3c", - "a469990ae47f16f9ebde6b12dc58ebca9e7501562983caec2df7d0763e5dd880", - "27c2504579ac9516ba86f6ac062a0aae59c30b62f7e8fbf28fc237dc429aa79f", - "56873ce3b425f350ad7ae6fdd0b8910b4e77605460a014359157796434d6ae82", - "b9cfcf9cf16128f91f8450e945f4b2786fe67240da61c6abe6e17f3d9cb15078", - "18a0b8cf17187754d074e797b233ca8362df5d0830f53eef2043e6c62fa1ef76", - "2b80f0e9c7e9bf2aa26f725b13e9e6304da3bdeada77d4f5c6ebf413ae1ba147", - "a832d95c6da8e9d5e6349b894cb01c8114d5e37eb6dbc4a9a440e52ae95c6a0d", - "a5623e0e5d5b8423d21d7e93529f67968a973c041c9dc3ae9e78b56fdf69f189", - "d578c7e30bb15b000452c0cbfd62045cd40f67c194874a33b58993f362aa5842", - "7ba2ce98c2a7f8e4066c9ec046c57ca1464a83842f138aa58812552d18beb979", - "974efd06fe87a981289cf42757cac73596cd211f1ad6efba64ccd9a54dbf509a", - "8d47349c4aca20bc6460e7f5a7fb8dfd3e0e900b9c5a40ee349a592f67e0584d", - "d6dc13a605b8c6fb48f2d5afec77f2a3cc5271fdb74d2fc98b1ae4194d95c79d", - "f56cf3b08ad62bf85eb4cf87ca9f03df20520783cbc0d6f923f1cd7b7cbae18d", - "d760aae99ed80f296567a0c202e89c69567ac79435287227652664167053fcdd", - "7cf7a0387cafaa9ea1e5075535f9495e1841fe97933b1de7abfdc9520d3fa2b5", - "a55ac428d632b16a4ec2e989c2a67b215e8c94a96224ead9fa5d5af876660c63", - "b863f657400264939acfd22529399f57457bc0842ea8e4ff11a600e237d2483e", - "7d071b332246459d45332d15e54753d8de5f3bd3eaba2e83c0a1fc7a26bcc4e2", - "6c4b00f05650cb1593313afd0a48b7095bffcf0baee1b78ea202c98451222c7a", - "3eec6e576e5bed35715e01dbd7ff5f66721c4e3c0e021f25549093d5a638a779", - "faf2141115bd1d9feaf27e23d994cdc94914fb5ef0fec2ba174c1938f955d1e6", - "b588553991576603f535c73bcbd2361bd15e16b13d0aa090d6afbf56f31f4697", - "139051211d36c0440b05e051b193850c942f4d34ecf765d9e0e21a9a2a1fe221", - "46a35eefd4efdc6393d1777c4e8203169ff3db3b9bc5b3c4b4433b3d39fdf1d1", - "86cd2bb51fd54022762a073bb08569e3c7eb513d92d063b9f46ee90d43ae821b", - "5da25204d5c118066d20813d24739d7004e3e0aa2dfac96816510c3bae42d38d", - "2decd75ebcbfbc902eb67219c5ddf0d79e39f7fcc1bae8ace7a72388e2d883a1", - "3b3fcb99b033521bfbab4a7042e63ebd1450533622957a9207fd9be455576db5", - "80a8d11fde5bb259aedc0c0cbb6b88595596a6ab0c1f2b3acbeda44bb030279d", - "e6a1d02e167278fc475f606b5fa00fe40c3b98bd4565c4c6babc4934967d769b", - "070d9c76a70b5d7c5362db796039a4d52a054c1f3169bd246ef310fac2bb8bfa", - "00c7ccb6b6690c94519a2e010e0f5fddf224818c66875f1379ea722b07721066", - "db35207a32b03ddb355b7cf5126891c126b0d253012c057621d80b40d2986ced", - "446aacfde059f351152a15cf866f586104acb3d095dbbc3ed93bc2098477e8e0", - "060217c2da8e19638e53004d10ba31d6fb74c2b68c5c6127faa2097f4d4385ba", - "2efade4336af2847ce2221a232b2bab6fb24e278f58b2bb7657c6712fed73f69", - "1aaf437f996abd5c150d88986abeaf3d54738e86143c6e05018bde57207505d9", - "855daef4466b8d590fba881714f6f6f998b560aa111c53a842e72832147cf1eb", - "731e0fccee026c31f3f8e770004adcd5a7702bc9da8080e646f82850f2a2cd63", - "4dc15462b3fcdf570967fb6af9342c56d5aaa33d3e2262e3b94078ab03cf342c", - "acd7dec0f99c17c6955337cd58dbed9a70fb5d3e5d5ccedd6e0ee1dd648ca0df", - "500b13ff03b80cb8a93e9ca8390d906272a40063e950a719da1509693825c7ec", - "c2ee35741bada47e5c929b9a7f2b55789bc60976132151b28ef8b3e24d051af7", - "4b1e109f87b382ee758bbf624af5f0d180a428a33bec0d364dca6cfbcbaa4053", - "813df4c3eea73ca44ad6fdc7be2f738430e73227b01a929cd7fba863e6e8e2a1", - "552e4f7ebcdaf1972a67f9c9f47dcce4f805af3be07ad8abc2e6934f168d98fb", - "37ea987518225fcdef2e5ed41d99d939bcd14dd4e2611cb727672768f176454d", - "42f079818106f81075c2bab3fdc95977aafa56596bbd79203ba3711a4ce8b449", - "8c954f0117e36ed5351b041f6de7a4f9d8fff52da2fb4b33bd3999fcbd689f73", - "fb5c2d1299974950490b1b1400ba63ae8d8a15c0a1d558bd7a7b64648c40c6d1", - "ee3a98642354e1e08db4115a0a6e63119a0f1d23bec6d53c7d8ea2eec662f0c6", - "7a1d29cb8c1a2ef04464df32246c3c6a3685470b313553a05f14c16717b61966", - "3035e1ac2ab4ba882696e708f03fb71cef99928f79f15090b2c6d3e3bdf6b621", - "567f5a7eb6456697df3164fb9045f42b3c7eeeef4130253173c92fdcf190d929", - "296bef20bc6a54e81df11804661f0298eeff634d5d072790670ac54007df4203", - "3c8daac299a0e9fc684b7ca2e33cdb571cff2f4b3f4069a297cfc5cab9b13551", - "a9232749824c90444b8c643e2ede9817382e0c409d7f27428e9624d41a0a7308", - "4bfe53915539675c84c0a42516e6cedcf57b50a5a58d51ac1365b176d19d7462", - "57a922c0467e23e49146f1572ce15fb2d8f4bd3a849d46205918e76fe1fccea4", - "46fdf5410c2270faa5ffa83da60373b5627f1fd622953b3a611dbac7f39b95a5", - "1e843183a7cbdf816204cd1d5f2e3c533d98ac683986208a5488f44fb494a778", - "56199b8de14f6cf954ab7f503f5ce8546a6298e03b52085f91df914e98c46bac", - "2d7fcd80ca20336b1bdfd32d904f9af9bf759717cfb06457b398baee9eb66706", - "bc901c40c57b67c7589314171c5db12474a72df6e7edb8c672d840228fe782a3", - "591705701f50d654db6eec137da1fdb8a9b924d2f2b2519f9e2ee67ef8d31ac3", - "203fce882a2ccaa8185cb4199df819c4fa4c1d3fa244d1489f20749d79220105", - "f60dfe4a45fd2f0adb988e0b189e5d23bf86be3e1c406ccbbb6eb1d778986bce", - "229d19fe727de0da3b6a60144715618d9acf37af31806702ac1e54e34522554c", - "8d49cc339bd94c2ae38fc96739ae62242aadcb9532e0e25791ba6127a49a55b0", - "fb27194015c6fc2df8cc510488033789d9ff40cc3a9f3b966e62eea59c960356", - "eb983cb7eadf76f0f78babb55498fa20c0de0cf2cd2784754a774121df1f79a4", - "0a94aaa8ef5ee94f853383673a5c6c7d447d1dc2ed5da7d50486acf4eac46680", - "fc4926043d04bb4e811958ca4cf978ee882f9f8c305166c5118adc300af0c3fc", - "c3caccb332c9f31914fec46bd5bb591a345374b4d2b78852c590447785c53203", - "91690d11cebb558b428978f87551c7e8363aaa96caf3073c73fb06dbc85c7889", - "554e4ce8b532ad6a8abedf3820d2a9b7a4b234921063ce30c7415a129fd1780e", - "12b61c9af583e4b6ddc65e4ed677f42ea40ff23e9ccbc264ee89eb5e3835694e", - "936af773463ead81ce4b1c55f7dd7ebc48b9c1615a3a18de666d80b03b1fb49a", - "69c4ee85a3b983e41fc57fb4c72240b9e7ea888420e0fa419b08bc11b2cef5df", - "f80f3d69073e7cb8dcde2797d20d0a4bdc1eafe649dbb74ac3141eb8c7d82dd2", - "d2a3a0a5a96be31dbb4474bf23609dce8e05774331d5c01c7240f5fb701fd484", - "2b857d5a3055adeb2415edd48d2265e91610265678c89c6f7b68ee777d0fcc5d", - "474aaec5794cfa45f6998ed819447e3d1b24ec29bca7ea4284c2e658bec6c90b", - "1bc3307bd77945110b1d69bf351652f1ad43dac2c2d04a611facf3a22860cf46", - "c9677be14a216357f66d7ae362948cc9e0a89f1fe721e1e520fa3c84b6e98a82", - "da57bc37757380bba48f6ee72376bfcfdd2889a2eb3726bf69e5623029decca4", - "7e41acfd7775f9b127aa1c6b3b5c4e612fa17026de75f82cb95fd1ada9f9bda0", - "86d4768fe9e0c77e7cb441a6dbf6246cb5caac471f19023b35de1cc3f97b6af5", - "9712229bca1f431d661a537956768034a8992fa22cbdf9159ba1e40b3576e406", - "0b58061330192b3d1dda867694af571734111b47fc614baf7d96c7de801acaad", - "dd0439aa78387ae64716189d63ba53ec90f3a99f109ef3077ac2d6e032837eb5", - "e970ee363a807ab865706291acafdd50c9bd00c3c513481aa243fb2a6c177dd1", - "a1ea25b5b1c971a16d714dd5e524cbd421a8c4274c4e09eeafc23910f4f1a71d", - "2f5d7cbc21b071651fc444e7e3dc8aa2f631ce331cdf1d955c638aac041e8c03", - "c500b6e1ad03dcfc60947e665e047db2d978d4b2bbf4707d994c369dd95210c6", - "0881bb1fa3602e1b992f3ff3c8b89f923516d590bf0ef52bacabc9aa04ec1eeb", - "4e6de4abeadd9b75c57a876c4b568952a5e69ed006a0f7a058f1312c8dc734dc", - "e66c28efa9534f63e4eb6ef1f47877bd278032c351dcfdba83202d4cc5b0b518", - "4121f7c6d2218cd782b70517a856b2eb4f5240c9617e5f4371d1e6f003fd0d0f", - "2d126c053e1930177ba70d538697e46ccff5277f66ce8842dd74d0b7f69f1eb7", - "496260ef4270adbe0bca9f9badc0d15f4906efaccd709911eed3a27dbdcad90f", - "98cc9fb43b949b2e54feb8ea2aead5b457e935844a37260068aba4101813ab5b", - "9a44ee55171b6b3aa1f222c68deb4b1ff1a0c20ca0584d86e1236a270ba2522d", - "49fe507c350e7d73fe73ebaa58e30b68ae832c1601e5117f73433983c178ce8e", - "4854e3bcbabc7640f90412bc9cc14f3a3794bde421d807d9c9a2dc6b0735f7a8", - "a977dd45a6ed616be85bfc5279a302b893484711db9ca552296d01e7032f4f3c", - "f099c05410b44a519bde0abfaca74efe2a6e0209cb72adfb23abde2318829e24", - "5242ad3e6d06abb66f79cebc3382f5a4f8018cd2133ee8edc9493ae3d2a96f6f", - "998386d3a74a92c4475892634a5473aa21c02ce96a3c8f51441971c5dd18d178", - "63d09446e70e326de63814de1919fe8c220ab698fb53ccdf92f19e2cc86cd247", - "1f38e6aac43e71700ca01077f3401a9347e52a2af8b0004b28253ea655a8cc82", - "a3209e226446db6efb2f45ed9c494310e346a1b6bccf064a204e29b318a5d01f", - "cdf9399d362f1fd10f860b9b8e454b2d16dc40cf4065e1e65dfbbfb35170f5e1", - "039cd909173952ac1fde9425b153be006bf328ea975130a377e29eaf708b6652", - "fb6e2499bddc4709c581a921dfed8852750082e4978c9124454279b7f1654435", - "0c369b07118361ec2a0eb73d34540ca4bc888ca44e922078718229c1d42621cd", - "e864d01517741c049c4b951bd9fc06d7bc8c0b9306a41fa7f0365b5ae959f637", - "607dd6219e3ea7d89fb2924df089bca30f9aa8111b51e7b314abab9073ff6c3d", - "f2ef5330810fef9015e9b78015d8fac6bfb9c3a174e80e482c164728d61897f8", - "31eb212ed2fd3182e7040b71ff73898ab2676952c61e14e17dc988d495bb38eb", - "99f84141e335942393ccbfdcbcfe189d7b4e5aaf4a9a41ce99e88a71ebe1654f", - "0acf0b3f2adbb09ec6a7f9044a9f963983cd8a9cd4be9d8cf34295230aac499b", - "c611051c75776a18b60b491fd6bfee062394be49802978f373faf691ff04a541", - "c50e2dafe592ce7dd4a8c1b1ce7aea3474b6072353d5109567ba7fb5b4cf58a4", - "ff240092351149a17282a390e5df3a42931c82939fc422ac08e0296b6df1425d", - "3714d8e1e9fb600229796e2af4c268beda016bc49351c19558a05945bcb35dec", - "d8c087433025d66bc2bf1ffdfb77287a8ed922a0826c8469d547ed9ffac0d36a", - "b7f2313f837903fe3e46f4e88f678808dc1e4d03acf250672e41c832655f2ff3", - "d49a1213d6a845028db8d64dd588857fe59dfca2c256a6ea9722c08dec87d42c", - "d60e3dde3c79aa697ea4e7c0297a94051814865bdfa8f19687522eb3acff63d8", - "cf654bd760418a37411d62e2fcdc2b7b78bbd7a6c0a4cd76ff2471eac3a9c124", - "3910054e5f26d9d2c833f2ac797f517d84e858ca6a39b757642c97d2edb33a3d", - "e7bcf1fb38bb3ef60ae4eeb0be6afc4d7862c55c89fea0cc1a71eb91ba22d8c1", - "dda6b65c5ee039aa3a8ee1b9f79676b9c1961d6ac007c6f8f13f7a4d5a926ab2", - "99abb22edba88f11b9bcad5614c251e1721c6f1628c646f73078dfe664390ec9", - "8ce9fe6c6a5af0cc944f27c5065266643c2d90f9e235ad6cfd5e605d94a19351", - "52e100d83d0484827f35f446f31268848d92f19e855c5349942885137e74caad", - "6a8c2bac65ea65e6036e230fce9eb44d5abfb949a4a5b51e6ceb1118bd0d724c", - "d9f33baf7478e1d75663b58bc3b6f423d0870fbe34d42a80e5a90fe940c2c92e", - "ba32850f523300f7df8d6c674794ce8820f17d75d47771a0e22d423f37192a27", - "b7cd30e1e478f9537426211a8c7aff039aadba14ac2487cf90de471ae6d8203c", - "502ee3a9b4f177f381a08054f99590a4082fa7b05ec3e3c50cb4b865c532686e", - "1c2981bf759202a50e3ff60547f31f43f9884002cb14158e4ced7e6c074f86d1", - "afbdfc1c1456e57a4f4ea09412057abf05e49022a19f642bec2f67b18508bebc", - "56f6b389d308ff7dd2639b517f2d4b65aadfaa052d3b82e8c6e9e97f783df0fc", - "d7e19d0430310ec85c07309042ad9b6061823320b893819bc26d596277521711", - "f4579b8eaf5027d25896db1944331da68e3de8194146a5f2783fcf16a2db291b", - "b93d850d6a009de63dac3dd6d207304a446cf1bdbc52e7795d1859a5aa8bb4d6", - "6c8d05b28425db071a49fb47445390cfe0672f50dc944fc5483f66327eefc12f", - "95986b4273878e82fae0d44488913caed6dabf76ccd39c2516272c67114cbe21", - "ceb4b178955bce6f8d724a8b980a39ef2e7b17d2190b5ae82230f66ca4a95406", - "93a803de2f8ceba72f12d565faf18125de65c053cd007ac18f7d47f7f19df278", - "69a205958883255964a88e310e4b340df32ec801733a5e9d43bbd9685c8d3c05", - "6b3e8243ebde8c410ffb7f19985196f1c965f7250dc38f7153845a77a17f1273", - "e3e8e119973550674c54488203965453fecc333620f188bce49b2e6b9de4e992", - "335871c9b22442d6082b4da555eeb9bb6687b3e50389853c46574888a06b63da", - "a3d162e631bada753bdf6856df91427d586cb2fa99f664aaa5cf48d7eb96cc36", - "db776a0111264ead8a5ac6b00d18a5bfef2aa6177705026fda4797fb9b563979", - "bb7b319b72ca6062fc0f4efd58c8ffc096320609bf44da952110f5d0775e70c7", - "4d9101ba21adb9daca905385f87b8133b64ea6144bd235364c593cf58d4141d2", - "b8a0e12abc6f1551ab9d3654008af2407c24e5fb746d44d6e8d23d2e91fc4217", - "9d9d1cbdc3728f37809aed01533a2ea80fee6f05d57e686acb4a639fbf6f775d", - "a5cb49d2eb269ffd1f95102db142321370881a4ebc8b2f1bb35fa8948e25b568", - "7ac74f05b1d66457db1d0da120c642236b1660aff307f183889ec4cad77763b4", - "0ceab31322ecaae7b008b7d0011f3fc55741d67f7323c6f6c826563207c6d97f", - "cd6e0441a8ceefc32b68178818262301e7f6f6b1ead2523b09dddbe54170114d", - "4b614ab5af96c7db8c083c5e6e45dd3f6349312f7445f37439f4d3b21824cdaa", - "94a7db453e8d7df1c1f9983e8023f9d8bd2075c71a086d36cf9ce01edd492889", - "fd537bc24a6d90fe841237a92b2df8935d10c0c18d16bc14754b3e2736f51e87", - "d294d72eda05a93a43684686b786a3f586b82a6a33c843f8b2dfda128a73e8e1", - "7bf653df4505c434c28430a8fc6f46e9d39ec29d460a1f8cd540bfe45340e4ed", - "c05339e67798ba8951a80a3d5d75edf064081db29251a28b98ee1a9ff523dacc", - "188a48414be17374c29446326c79bdb339854e5c250f8598ce2b07a067024fe3", - "780765cdddb9edf4ef77eb3f5834284c8362f4eb41ff58811d7ec084c5e1dd49", - "6ba1e505f12ec2f93f792c52c75ecb9aa1a0eb0fbbb5545e68d8911a1d373ca1", - "0f5e98f52e5669127f4b17fd51ad1100a8cbb63698212526ff56dd691049dd5c", - "9b0406f9e77a1a5ae07dda6b57419218cd3cde5472da268b8852a2074d0cb8f1", - "442a41784b60e303c6a5aaca12a706332b959914fcb9bafa5b25cf58754b1d6d", - "1c52dd19d3773e47510890c9049bbb5acee3f0bbaee7a24e4f823d5d848b057b", - "218040933fdcf7b11023da2871adba5549be96de5e58300290f23e7efdc2a792", - "a93dc6f8e1f00f1f0b400922984837bb7f5aab1d207659a16075f0d3aed7672a", - "f6e982bf8f46100c832a2f91c9ba1c9bee150c8b257c9a7297d4561036750e0a", - "02b693e7320d7df7eb8c273103d76d4a37804d06f14eaa2cdaa9b04f56e896d6", - "c355f9460ec611f5ee6f5bc4822f200b4ca9c481483f2f3233773c2b343368ca", - "35bb26273678378c2ae7738d08b17da2ae90be3ae51224442862e3663312d672", - "d4c1c4d03da23f6d50e141d2338bac3609d70c32c7ffb73f30809a91d7862129", - "2b2bba140fd808a5630aa845df9c753d0b57c1aa4d1e5cf9cb782b4c4d474252", - "7d4c398f98a8443a0edf80442591c6ce60cfdf681ac7fc0e2e29ab1afe8d1a61", - "f3749ee1119a398f8bbd0209899bf5dbacdbc836d84fc7b5a2c4611dcd75cccc", - "7c37f428b61c45df01703ff3751338a6004248acec3b9222673f049e649645c3", - "55e9aff1024071301356a99f048117a5b16c1d3a2c66836f1a3ae0ef81444cca", - "3208a38691a825a48c1adc82034daeff948987ce326f82f3a53b9b0a87861695", - "fe70c99a6a315a8539abc29e95c212cfdab0e8fd76a213f6576d8d315eb73bf4", - "4d68a7a589cab07d82caeb4375fdfefe8e81178eae6dda4a9994451ed867ee43", - "af7ab4bfb19b9cc3bb17ba4f4faa64fed02a039c025ee459743ab6190eb003b5", - "ba90a5ccc811aac72e202c0c488602a8ccb2266a632495bcf90918fd073b5bb6", - "fd056975a05297cd8c783f44c0995c04d77b35c155ea52627e7e8a1dab82cea9", - "1de6407b9d8731d40d719f48114d1640cbc396f596df6cc270c6a3e6408eb45f", - "ac684d65cffd9ce084ef71b6c43b1dd6aa387897a3ab83d36f754b13122b38c2", - "c2a9e344a41294022c98aea8f2835d89365fc7b6392f44fa8388ff06d5f3be8d", - "5337f7fa9e9b63a7cc12393a683eb1a770b304d5747e26241189e65cd315f908", - "6072d3f144d040d6fa55a11d8865e2300043f3ef5d7b99745a30aad33f496978", - "e53fc2ae4e31bdf3a2ffab76d09bf2186bd27e5f3aa9c14c8ea2c720ccf4ec17", - "bb58b02d718a40a01cafacbb52be6722beb20edab46408106eae0dec6e9080fa", - "d7081a13573c66afa6fc844ffc64bd0a580afcd5c125558ce8c794c9513cd235", - "cb2aeb56152ab60558edd22cf3aef72df8bb033f1cc8e1eee60a3c228517afcc", - "d94052c840678b1fccf7b12c70b639b26dce2bf24491d987538fe72832f9a4dd", - "72c83faa5bc73e718742b3b33e52823ab2937447762e0bc23d3a24db75430a65", - "92835f42619ded0db346c03516c6579c4f70af0edcc8b30bfb418041e27642e1", - "139540edef87bec5c702048660d29f5c41a026d0ddf985df4fe7a19a4a25f0e1", - "a6c856a8b59df3867f0e82b418a15e261726a412d32350e25212dba42b64b158", - "cbcbfc7cc40612b1725cd43054a1f32f91d4e5b61ee1b42978e74e00c3e6a9db", - "8ece372c80ca73b17652be8ac87fd4e05ab0cf914ad5dc6e0dd46b0fcb2edb21", - "3be4864c69095c985aba482f478fbe393fd8e114544b912aaaad2ca08817a4de", - "33d8270ac644a71e5de0fdab00939b3b0a047dcc25363b1ccbffc84a23c9365e", - "adc59e839e4f9e1180760bddcfd6631691d76ed0c5565c616d951d0078d13478", - "c5ff40b7581775ac57455985eee2d677a7ce1f4234a30040a42160d601ec84cd", - "4d6f21c029cd2095ca6883bcea3e7e16743e7ec17d03ee24e20e6701216a1547", - "e4e68b422ea72c19903652f976eea72cb654099d9c9df132c86cdfd304a02e2f", - "60a1e547972b6f17c45025c2239213803160838358122a6f55c673a28e7689ec", - "c625719db2ae6f51ae3cbadcfcd3f646b7b85b914cf4c8baeb9896aa227c6ec9", - "0ac2e0b463f6c8feef193ca3920ea027fe424daa88ba8793462440b43df4f55b", - "ddcec70112c1ca7065fc9aab9479ca5cd65ba2d0a625129f6d360d38489a4cc2", - "fe27a2eee1afdf9802ea790a06326536404d0bdfa867641d79f81b1fac840890", - "72291dc598b179e0c1e42b2d91ffc0b266c7436927c4199a2a3c8eae2f8e3ff9", - "31ba3ce8900cf883f8e68080d512da22fa3297fe51e4a4ccda4daca13a6f3b02", - "1c081376dffd25e0d0f7446c53efb66738949d387eef365085620d11e7f6bcb7", - "f4a6406c8d8db40e1943ee9a47f6ee00966527a6fa2abb6a1ede84b6a2daee86", - "d477a1900f0572c2367255842e53baf1cea0304213096279e912cc344b9bce71", - "4d8710991218e4dfd657ee8fa290b5b18475db946fa4d23e46771397a9da238e", - "28a9533f3bc1885e8f3ff7c32dbf2ddca42749e3a403d30e0b9e16b99d309985", - "5842785c96e750c2f35988d9dd2140a0b8ced5c958dc69008c0145807a68fdb2", - "05815fdb5a04a820bddca00591be613d722b00f18fdce0681ed2414fab6a894b", - "e567b6ea657fcc5e4e50bb87aef5a4a4b49ecc39184a0135957180b9d131fdf6", - "fa0a8d940ac6ed4f7638d00327ae609b57af6b8c444fa7784a72b2e0e2e98910", - "6745fa5f399d93e8c62c98ec181bbac7a16e858d025b9362eb5c7ae6dd27c8ff", - "031a8c33b5c6afc238d9aefcd2d6a538084e2e2f9ce7e4705336b04556f3cdc3", - "74ee61ffe25d9068c160aa3198910d5f7599c3635e5c50dcc880d2f08b1b12c7", - "ee61790ce12b4e0051af3efba8b8ea1939cf2e2406e62a01a52f7521656ba5b7", - "fad62efd1cebc161b2693e9c879d10ff9a5a2476ae3ba4f30ebe69ab72f70f46", - "fb7ee814732a98cbe86b450f56e5f5237934b69a495c5a35cce23ac77dceae32", - "6b61670e6007d1a43a3b2c7bd3e7b5dd35db353dca3b90f2a078a64137f36db6", - "639a3011c09abdab13c7de85e28e042c9276548ddf5fd5ab4cf76304f5d80c95", - "0165e0b76a110d1f42a99687fa0328ee0c783658d16e4e30a03e4ff84986c223", - "21c7991dbbb2ae4952a5b31d90a01600a3d7941f3a7a2cdcc5f26d1e02473cfd", - "9ef0a95e61179840afa325bf54012d1f8e18933050082299fce08f45a85afa7f", - "334f17c534d8c4d37c1a3338676cbbcfe932b24a2abf7b5aed341d99b5e7b8c0", - "40f0b7d529eaa371e78c7ae30b7ccd50026386171b9cd17e79d9e84f320c5b40", - "d49d3f944599e3cb6775cbbc2618372c8d9448e80bbca07525cadd4ce8af4c13", - "6fcf13fc6b9f31f8b42a2da25279c0a51281925dc7b9f0496aa1bfd8df185180", - "13d3956e83c0bb455a93a764c73cb04d29f30bb363b6f73a9cf3ebf8cd259474", - "0f67ba1d31b591f6e0eeba0842ba3dd16ffd36a7f7f65620d85710467af3f50e", - "31b9d7922a90504957fe607af0356a6759cdd3ce6dbff614935b852c8b4e6213", - "f83e5122373fe27f49d1eab603cb29a00a08b6ddec453f5de3b0407d59b41a2b", - "93db8e05befceb57ca442fdee25ca2f07e4cf595ad443a4d62f0ecc0fbaa6601", - "2ac6ad4a651db4b738b95d99101af58fb877bd7d661528744ec01933b12c18af", - "28024e4138beb55582b1fef0eb4fc95d4e9f55f3c8fe2bc065c49328ea3fbc2e", - "0d55b62a1e0d58697545f96585a1d720d85e6e520c1436470e2e18789b0759d4", - "531c3b9dcac65658fd0403f5a6f6d0dec0ba1d126e2781c7208a1fb08c427c2c", - "0d70685eab5a115cf63c0edce894dd0add7d173d3b04a3bdbba535c914bf0bea", - "eb83b6f4f208c00deecc673b164193579273c1f243fe100c6a29dbef7976067e", - "68539ab80aba2348b5e92be56be4103ab71c915519ab0521ccbead69ce8e78fb", - "5cf371ce29d2d60c5b6f2e52694e3e6ae7627be79fd8fb20be21a3fca4795afe", - "615171e92246901ed55d057a3d46a7a14256d4029927e7a2d1e836a04c8474ec", - "394feae42b99727f802c2c98b2c0bfa770a2ec8c60ddd1b7ed695d60863f8938", - "72de4ea76733466cde81aab0192d48345dde060517f7ccddb1798431491e1cb6", - "bd456e52338c61ae733056e5e3b2784a3691bc5dd0d3730ebe0d50e9d36bce6b", - "7178cb3522507619f209a2388b2895d80c25fa8afb0ffbdbc09b4f6929b9af78", - "6cd94028c1888e4705fb986a0351ffad1c277061e28deef759f5a0bd77abb86c", - "2effa2b5a0edbd915119e41223ae7db5965ce918d68bab541546cc6c4c7462ce", - "f2ad4760f11f445200d371e9c56dc0c4aca31152157b8507a41fc79204b928a1", - "85cf346137db1b6d3c845ec2e6b87fe233e82b43ff4a53886cb6475c2119bce3", - "6ed805bffcccfb4a287e28208ed9df3aedd460e4ff385daec7231cd1c1c3501b", - "d07b7ff02a8c9f6a9c9e7c132b133449f5f50a80d8ac39261637b4268b9b6253", - "de72a90e8fbfaac6c4e6f0cdb0214358d6574d2c2b6f1534d474d40cda2f175b", - "6a3e50aa229613bd97fb1f5ccb56616e8836119629abc32f35e1d076cd6c6d0f", - "4f1945493d795aef26a051ecec19e3655d4ba8a9c680a23b88d4335726f1bcad", - "0711bcec8b73ec017a4bad4a05a24027a5227eabd57295815306078165a19020", - "70b68f1775905501e5f35aee2cedbea3a00b037cb2b9efdc0e2519c702d32cc8", - "300a74f26a30d54557bbeff9cb7f8eaab4e8fd68b52f41d4deb60dbf2a159c00", - "eb27dd18162229185802cd548fe5428c73acde7ce5b623456c979284eb2276ff", - "c14173431110a6d5150075f7afa6c68c18b9f860b381af547c95b486839de540", - "27f0756cf252aec573746de46efc8d96fa0a577de2ff23b33583adb8bfd3e10f", - "6f95ffc7563ae6b30871432223337110292ba34c3967c3e0156242048009c3f0", - "ab7ac3931f9e2fa9696ada80c49f70b8760480c41e1e4c07c67966b91f8b3550", - "3a2f62507b7b49f635653e77cc82c767bbb105fa2c549e58e6aa785350921110", - "54ff40d735b5c3d0fe368e7579b25e3e3ed36fbcc2d43c355e7aba7ae3e6b9bc", - "ab710bc7c0b4b79066827563a31fc5965ec81293b6ce26914c2d12cba2237da8", - "eedefc1def4be656c4aef416d57f58bb29fa9fbce1bd77f1504de8d806d92f63", - "35eea843e4984a644000b5f1ae39fa7555c19ea9421fccaaa2e27d0f51490baa", - "9da77864ef74b26c3de795d8700c37cd27426a3082b38aa3f4d28194fe4cb7ec", - "551b37a3de42b67844f1f85b3a74a857c95a6a022f9a704cdbc6b79068d76328", - "45f90c38eb595ec06d36bab93baaa3b56f134fd92f71f66010b6a4862ef4cbd5", - "bfc502135aaa088c3ac8f53b1eec24ae355fc6c54b6da4cb2dd71a8ddd4379b2", - "a816574e59c9e85817d2270cfda82c6ce539172a7453a46ac630e027e21b6ffa", - "da5d3c05ce070e28b7d8a421e2a4a79565e22e622723b9f666f850385c444644", - "237f96dc365d38bef8c82909973c2e48114a2e37a03723a7d35e37f0eb38d567", - "b051282f448a1d5ff7136fe786e0fafb5053c8ac732ea8e46bd3e5a8093037cc", - "ac42a09a3229c9f36d29b825587e454e464e9f6c715d113ca9e17605528b4e65", - "e9d0407f7ae0ba2aca3b0527e19479a30fb97c89cc0b9d98b7023cd97cd2e3c6", - "5599c022a72cd65a83e191b0ed5bdaa8ea23897f96ac981da5503445a1a1e3c4", - "8389310a0130349339f57b391a73a739e6b345fe11a95dcda97ad5fba8ae554c", - "056fd880399a9fa8bdb66a4bd5b4da07b21f6387f2870103c3a53c1261f5add3", - "dea1efa94db5f6093dfa3f82cb4067e9eeb01e8cfbf81d91e0e443ae409ebcaf", - "2a7acc122e5869107e0fa14aa0913c8aeae850a7180532fb6f76f0c1e63eb688", - "ba46557281d1b7c9c885a91a88b2bd1c50fab17f48d67ab5714f5434dc81cf3d", - "20c79583740b3c964651e5eb98b499dc9fcf5b4ecda71858e072c196498f1a26", - "604adf3cd8b9a79762ce55e839d4b9fdc34e2c5bfafc6f3c03a02903cb91c5ee", - "b5d2b2544c503c54f3d70185b223a504c76afcc94982b3a917bbd3f175a2ece8", - "6306ef9856dbfa8de5e82e5533ceafdad470b67000f60b6df5606ee5a3bc1d00", - "915c9512d37a203a094696184e2434ca3e31bed274ed2b90ca0dfaac649722c8", - "c2f8a413582c9cb1ca415de5383cb3f7ad2bfbfb1997f40940e6475581a14036", - "046e3587376e41a089a6a7de424dbf04cd95055d710923b22829b8ce5c7f97b5", - "b4b8c7d4b597e71cd3d2b14413650e384ca89057020e2b0a1c6df4cb5a0e8aea", - "b4af22687aded18b7c88e8a2ee535a94195b942b89c0f9a2a0d3558290d0ec96", - "56d60cb3d88450fd67ef3f4e51f25a085f57c685c8f095d843425411ff37d600", - "d467f3598ebe59d3e8be00bca93d4f977a107dcfc10d15aeb12654bf6bb982f9", - "7e0c64af6dcd0711284c6b05458750603fefc11a44b6d3f819a5b99a2e57f209", - "ea121ea728bb2078b9471c30da350c1068b1cca789fac4ad4f4a3ce78cdd8493", - "c6cda01b5c05b33ab10d22adc3de84085e335e6b5aa876e92a4511d17bda561b", - "80db5c8163955c2cfbf9f44d76d6f5a6c0cbe2e06779fb91836e010c445737e3", - "9baaece53afd39a1a883ef92514ac1a2c7dfcc669263b990ea7b41475c9212a5", - "a797377ba45497dc8e30931211cc50ff234344d19e069d0af9261dc6efbbef2c", - "f1ad58fab3a43d45ced62d06ce8f0511bcf126cbc140d066e7a553b24e0db492", - "1b6dc46b8d099f88094a18f86017d9ceae06b860db5218032142e33e5e32111f", - "21fad3e2d496597441ae0c0eea3a92c2d80ffd3500c9c939decda7a526f9d6b5", - "4450e7b1ba9f4c6541061342e8d4e2b39e6222afcee906e7a975db9fc01129c5", - "55400ae129b78065ea45934963f3918bf041057823bcf5e529793bd6a1d4c367", - "dfa14697d15e09989b0364409b54d8f66407270f7558379c5443f9c6d04ce3b2", - "f9627691e2243b55ab554cd7f0a74931c61cab670b143edf4214994ef7d285fe", - "6b389b8a057e45d04103bd33c679cec04eee82a812517d1f7efc690c166b8bf1", - "ad5c5068e2d6c9a6eac93f8ee2aa7bb4b2e4d91055af7d33cb2594284a31a6aa", - "0a5b46f12aebb70c551233cba36e3f400e93b32c8ae6a8ccaff775770544a545", - "f618842da73b8127a32e5823079fa55eba8ef50742f8a5867d24c5e9549c9e34", - "b4b3567dbcf684382741a7b1054f267494400734a65e820bb2609834c90bded9", - "f146db0da80d27aaec94c956af7b1e88bb1684a778af1586476bf5e634289fc3", - "9b8e0f7142b53af450b153c2d107b916fc461c5239cb844189b0ead1fbcd148f", - "62f9086cf17c2044145c53cb7835b706bce90101bae72bc6f04d0c2aa291751e", - "cf69236abb692ee91796612b95933298b1e297ff2eccd3e6a21b031f2bbe9372", - "eb1d48f4a5f8aa5ee66163f0a68ab5358720b59778bca8b3c9ce8a1efb89efe8", - "711b9a4977eaa15ab83f7b59326e07b8e68ef015c982b10f8c7b41b9258a9d87", - "dc8a044f991e8c51db544544412e34a7c8d63d3e1de67f6e10bca5e42f9a8ae8", - "cd7e8da8508d15421c944d626871b97e8481914a638965211fa3c32e0da0ffdd", - "612bb8094a3f1439c394022cc94cea365e241e6a2751ec701d49ebe6e194e625", - "2ad4ac81263cb2f9fab2e4c6ab18400cefc9081048d334ada9d4f1aa249d6f62", - "72b8b32952f298aedcf917c79fe11f98786e76bf1fa54b910d56586959432c88", - "bf57ca85321f31bf1b1aa5b9f24af064d5707823ca7006a580ff5f28fac3da8a", - "3c841ef76207f9edde74173fc41be157739e73df9cce8dc2d7e3cd341aa2acbc", - "87a823bb26984273622493ebfd6ecabf3549e5319e0331dc6a91d42067018a67", - "e16233684b880bea2ab1360ac2faf9ed3da7f6491e5c80996096bf0509ad58ff", - "d7c4ef09dbb62d05894b9ccfa0040391264b3852ac1d9b75d234d406cd951f2d", - "d2d3bb0cb423458644971bda6b36912051fddfb147b83e3f13184f0c5ea5ffa9", - "eb136a9610283d582c5656604679adf56b1f0cba0ed01a2e463f802bd4fb647b", - "cba0b157cf737aac15a9502bda891f8a697a3de24ca2071dae3d58dbe793c718", - "6260e86398c136c278afcb87e4744e674a6667a074185acce62ddc48a1791add", - "338cefd930f2dbe2b513381208dd60a6f8205a2e359708c0ad6c35edcc054b69", - "ea98fe074e97c320a790d34a3c93b246bd823a93edfb4895e1e1c7b82c8738e4", - "6a9c1d02d37fd18c880e34277d0c9e9b4ab421cd54910a6e33391ac9770c6a90", - "2820bc2f11d683ebb60aded87b911fa76df8c84af90f4601f67864a45fecfbe0", - "1f14157288867fd6731a6aa81a4bf1455413e615a9fb77b5936807be5c77a41f", - "98ff4f04ab5a462a04b8fca6f0167d87f94d60f348bc379b3d845c4d5ee9c8e9", - "82d84763cf46b00402741ec67a5279edf4433cd45e425239f662f9cd465490ff", - "ff15e3b40b0af31cfdde1ae130440d06bf5f0340b5d6662ba9c786b5bb464733", - "c6bcf9fd23b7547b2c3746e48583831be493a97ceb3af9ecd3061f0a61da9a51", - "57dd2de7279a9b3e393ae4de9722a599a09348a7d1b4e602f26e7d335b4e76c0", - "e3850adc17d5254bb14b5b51d226e2b0a59247cc055114ad38fedb49bbc66dba", - "b94f2308b436fca0b44b638b75e8701a244692bceb981b6ce70984cbd803a24a", - "11be9ed2272832d139fe163130103cae11b609a174b372ed9e693dac98d2e2c5", - "6d5272fe4d146d6eafdcd897a581f0aab153e768126bdc911c6b731a57c06f36", - "080507828a29e60ea62b97770a076b301edd66799422e2efa01360941280cf8e", - "2c1934c401c19052a3365726a0de39538fa52effc89b11e5232d420ce94570d1", - "6bbe2359ec7fa91b6b1082a98a108fd99ac2e3ad996e869d3a02ad5f013d57ab", - "82f9202def776b1a486099b7640604e61fd34d53fe0c7ecf7af0fd1b3f96e73a", - "8fb328e6a1ba893d9330f2ca54d942302df574660e185e1d7cc3e012b3f2d309", - "7082b623bddc541eb16200cca1ebbb30b47dd3a89f7e3a9f60d7bbffdfa8f232", - "84133fb61988297d899f772098c75d7dc2337b6a09f8e48a9f40f0a425b647f7", - "bbda07352745e12ff68c5a81325a16e17b6560616162c66d6de093034be58e76", - "e20feb9c1809e6ad26caaf85421c620cdf305ea2ed40886bce2d76e192f8761c", - "4f80b9362f4c77e2dc62580f183b0e59434db86136b285a4809b312957d45b41", - "94de240e4a9d0883cbc5eccce40e2af5615a333b4a55aaf490e4d3f59e2d7fed", - "e18f9c729958f7c64e1fbc6fae3b0fa0d65d615122b6fe8e306c3e5755c29ff5", - "e4a6202dc8c432baa94f5ec822ea425ede8ac2586dbb6bfb8f12f69e840cc9b3", - "3475761ca6483ab5933e6bc152e6f9188dcdcc64e7506272c1feca99e180d204", - "66e3365b195da85855a1b155e75f4a3ee623fd54ec45514c4eb615066d9f2591", - "ecdaa248d495a8757aa00ef2776ab67b0093d96794819bd76211a366eeb1be7a", - "f91ab36999d5bcbcd48329f9f6174f1ab67fe9c2a66f0751e8b03762359a4fbe", - "1a7b933206db498716f0c9d763da61702d586dd056d95ea5216554a6c56f2c91", - "0dd0e288fd2000a890fed1124e0e5d2e967d7cd5e9547176b4d12a05fc8241bd", - "4ddcb6bd90a8808131f015460c14918edbb52e221c9589423507dd6f4c5f52e1", - "7b1cf62607dc6ec46a46e0d3fe229d859ad89ed61ca4128fcd717a107a59f2ea", - "9c49294bfd7d6b768f89e8b5c5c305e6322e14429abdf11a25d5ec89024ee58c", - "78e3cc1f298378310d304aaa2372bfd707d77b5d1e65731270616ba6bf9b1923", - "cf263e38ffb3928ef944820e555734a8bcd9b569d929fd70d042fb9c8485a002", - "16a500cd2c942960af3e5b26a4187468afa4eec724ada4165fb03b0d16850558", - "0b6575ea4da212a09c14ba0d8ebeb8b1c82935a3f1e8d5a35d5d6aded8211ce9", - "1b0bf833861b1b7fba8aaa923bd31beab13fa4cb8f0fd440a27801c43a49781a", - "1443da5d4833702c2afffb497089eb162acf8df998bf550fbd08a40a4640c419", - "394ddd769e36a71eb143dde7030acf02cb41981bf997d48ab22dbba93f232b81", - "37da4e820f21a9ef7a2b336fa50b00e2f74a1ad22db30841b207d6cec2434e03", - "ff5a1bc4bb4258270fee221c4fe335e37c0671b232780c88cc8eeeaa237e75fe", - "41f90aac37aef027f8729b6f25ce577804511575e8af92dca2a93dd47350b0b9", - "b7785b1e7eb6fd3da32e6a6b21c887210879ea2aaf7cff7ca02fb2c518f63970", - "1a518174bb4dd6010ac77ea8e9394efa7905875ab1f028d9ff7bbee48366fbdf", - "f28e27559ebf446d696f3a265709dd0b4f67a20ba213c9ff9c58ee9bd024c77f", - "ea3856370d495c8d0a7de6cdc0cf2f8e77868428f401d745a6105b2380c9e412", - "049e3940b07389234caa2e36cea3102e8decf392a61f6f99261ae5b7bc63c719", - "b95eadd8eafaf4b02d6dc8b6e9c91fc4f44a16088b1bae353d7f9b0304239c72", - "907dc424d00e26b09cb7062bd613e82204fc3766aededf675b8d2abf614ac80f", - "fb5dd28a8777aac634f2109b7b266e38ea6b79ec67242db5aa80252c520c972e", - "1d931f91ce15672b52f8686ecae99970043c6d5115c84ac1fabd23b0cc877900", - "a428c7cf6c50e677c289f0ca785b7e79363115064bde0a43deaea4ceecb42042", - "2d77fff48f79fee34f759e062d4403377076389bf0098b2d22a577feb573976e", - "4ddf458662ff8b08169e6ba5d034b3f1859f0ad5dc393224979d0f4a47faa552", - "ab33edeb557716548b9236328b22e54d0bec5c7184eedda28de4d66426335deb", - "4c3b23a3c3f8609c25a55ec6d57b20aecf2ec7d87f5d0094371b08a9ae5671ba", - "98e490b7ad49cb64952d10b047c2145520e978fc841ba27e0acea5fc9b3b11eb", - "b98134bf7057c109f0383968916d176c82ba2ba17f0c845b84a1ff35c1f9e22b", - "ff3c51e0954ec9f48a1c80d776ac26c6b0d0f8cba655e9bc5d5dafa4f2d74791", - "9588ecbd259be4a2975c3172f172de064d511fc5e790decc06078438781491ed", - "a481d6219d366b109227b5b41f3f43a24cdf0d9b905f5782e2a0f88b7faa849a", - "0982b64fc93b844a2fe0650d45e73bba1409cb370b8b97b4aca01260f675a9a9", - "547b256076143b10edf4fa0103eb407715fa6872e5fd220760be782fa398f8f3", - "a4e6957763a800e3d1069b6f8dd358945c24ca61fcb825d3f11b7ff35ab5ba0c", - "8df0dd4de8015b56149ffd1aed063e8f551d4c882c55a031491c775823a83e28", - "0136ed7597130dac8c073c5ea28fc4af55aa83995875cd6baa50c561c7d08e60", - "b8217e9ac38cd0d270c081eedc95d0d2081189dc76608a7a15a4d3a76477f708", - "c1df57ae228e7a23d00cd376917d3b590ec15f5028e2d074d9edc39af67cd12a", - "abd43bd3cac2702da7d6b65b3d4c38975a4e633cbbd441441ed4c2ebbedad395", - "6e3c9454bfe4e6ab29111666e87caa4d00c160f175895d35c5ac97b870d152df", - "4b2ae7453202678518ede307d5fa86ad71a0921eaa156525f44747f94f07d370", - "a7ab614e8759d6c1fd714f24d286feba70cf8f3cb109702910477273d0b58b57", - "ad8a19b68cdec9833f1145a00759a4b1b14018f1dd2a980f0343f00d061f71d2", - "a520088e37e686e9d1ca5b53118a9cdec1e907ecbd6fffcc8b7a1cb055ac3420", - "6c27a2088467bfc5d9bba9b9b04b1f3d739d04315a1d7da4200bd19b8cb3244e", - "f4921fe24cf4e6ed6b12c32e0bce79579eaa97caccf371a9aa52c68c7c996ad5", - "da5171662e66a6b307415591b7e831cc713731c0656731e8a5ea634ccc5e2511", - "9df2db8bc56c4a34893826454df6b9e23d670bec4c7f4151583006ef04f171f0", - "cb0fa1f72c2e92ed40f2c029c9252c365a9854f53528489ae0b3468fd898da43", - "9ab508ec3f969746fcaab830d96328a50b8775cc4d0dfe6e468023040814da80", - "4417cc9b0acbed4f8b0197004ca80fada8d9dcfb2e9f7b31f0fc85d53bd3f6ec", - "00f3649dc9793d502f87ee87abcb825bbd1457124e928753a9c2b8c487bbeec3", - "1815c7bcabcb65a8373e6c0a741cfbc6a4cf55cf4a9804248fa4a47e3ed636ce", - "1c6f54b252b5465d8057585d6ff61ced26158313f5f269d5bef20c13dff1e777", - "d62e74f162666e8a895edb1615a336f981ee49bb2ca6a424c08248277686569d", - "cc6853befeed2005b26b51ba161133e1398638da3ef060168a622d152788a795", - "eefb119b47cc8182dec09fa716ace5eeea59af1cf3a3ffeef3bafad5faadc9d3", - "215d5d4ac85be91272f1f613b0563a1acd9acafe0dcbc13625ccf2f92d7b1e79", - "42c079005849718d588ef76ae3330400f9c18229700d68fb434011eaeb88326d", - "6031ef0a5ad114d99392972372ea9d62fc7cb7eaf9b8e7a22f13cc05f2acf720", - "91e87bf139f87fbf81394a864109bc87f1b31c9b3a9b2cd788f66deb8057ddbb", - "73b9b5ee0f1064f2d83b6592215d53186a09346217aa6b2b2ba52e7f85f48aef", - "c1724d929a868e01318ac614fb07240573b87b295c164b9aa71e42c13337eab8", - "07038a0118831d558b7e4071d4ed95587ada25265f3abbf249f30b689b4af6f4", - "d21088ab9641e7926caf06638073786807c3eb23731e3beab3c89c8dab32989f", - "687f7b0279e0eaec82c3b5d02807466d93b0d84fb0b12ba7060221028d27f565", - "7d45c0a86454635049323d45188d78dd0fbeed18d7edcd89df240a16d530aa58", - "3bd4076e0bef83aae7a8b053ec6aff8eccfbe04a45668217e6265b10a6d95208", - "4677d40b998d90a77debc261e76d950ee76eecb55512534f91353a8fec2fdb4e", - "0aea0b269d201e573443a7a5d151f79c871ffe628dd1ddd2cd2b066a98341da2", - "09952a464ee13c4c54c78c4aa3c35e84259f0623c8aeb4db8dd372434047d2f9", - "ac651e7e78707f2432fcbb7c34e428bee0d7b770e946fb02d9db8f228c70d829", - "020887ee3762e6f47817fecdcb68eec41ee306c9b8cd29fb242553690ca03c05", - "b7c08b06e988f82a88d071a617e24cc38a64e4c0d109300f24f0865f97becdf9", - "a7d57dab4a846931932d9b3175432d033bf0fd5aab125245b526a1cd015a1bb1", - "424e573873eef043326be33225297324bb5ad2f6ad40eefc7d03d7883f60fd62", - "f147d3afaba54bb98c12d853cb7a5673a5ed87f6c64699f485c09736c071b454", - "aa4345adfa7e8d30dfdab926f6f5a9ac120ccaea293159bf2339c70d23832225", - "f1b005cccc908498087b680467c97cadeb9d88b6a0ac153e76f4615fb5684c0c", - "26f844c84035179e2fe81eb7bbcc70d897166f856ac10581421cb3d1a78789ff", - "6758c92497022268b620a9cf6237c83b0a5d6d36b312698439ecb4c8c73d092b", - "357fe9d0501670903d406825ba1cd6d285987cd86050d4333ce30835d9398646", - "d1af6c2d7bf8d6b1e2759423896d4e1966c3312e8baf1b278cd378aab4e127ec", - "69a13b10282bbccd74c39c04c65158e43aa777df0fd6cfe65d4b86c2c6cfecfa", - "e9c9d2fdc1ae28a1c88301a21e7160ac55fc25790ac6bdcc4d72e170bf92b423", - "20971342a2cf4d1e5f7201f96e36e79a35f907c7468e7f50322b139e1c9eab77", - "070607b48d857d0a1800b968979ee86687cc02c1c53d5239a93423ceb1f6077c", - "7ab247b36b82a510ea673c6505acb9763fbae0aee134e4ecbef1f54127e0ec51", - "b82ec2dc033c2f4fae6c8ca488e860de9dd635879db7843e9542d8a3afd00654", - "dafe2b4fe34222e828aec9e989ccd36f528f4caddf6c54b7a5b762bffa80f900", - "6a9c2a24e93d9e5c5c16768d9d395b63e801a7726b23bf3066041cdc4fdc4897", - "7998d1a58f22586ba53a0ad4715b0814cdae3c8dccb253cecc409f8d8cc7d3f2", - "378dbbff815cad489a4176b26807c2721bcf66a90af6055a80bba6a1b1335771", - "1a1e836918fd127b432d0f81c7eaaad98e25f35242354e234b836a097fa22d9b", - "df288af80b847125d4d300d922f66789b6c6a87de8e00f9d8892c1b267cb035a", - "2292b09a753e4d7d72507c1b7097d7c6e669836a7d10da84f3164170f19fe815", - "b04d72dd97545be2b4b0e4f3d74ee023846ef3edca8da4f9dba57cf415206518", - "874be0c9fbe17b523479a3cfe26f37ede25637e8f395be82715a537f7108abda", - "020fe8a1dbd616b5e0ad598fbad2299e550a3441f1443f1f78053734399526e8", - "88a8a151f8c5516a08de47c81dcfe31d6bb83ffc80504f1d5b7d8cdd7c45eccd", - "6bc84c7308952c41080986f64bf7bbf237133e76a0041a32a2746a192a94d017", - "996c8479d9682b9110e15e57cded30d6872054eb9d9e36f645e6cdd31fd3f5fa", - "879f11413d6f285d71f6ba84ef72b16064cb2137cc0133fcf9f6fb6b5e66fd51", - "1fbcd80bcf0b50200ddb8a09f002670337a0dca1d85a7e89ba1ed4b5c2e94ddc", - "64b45b9a910a986efd1b4714d089b223efc7e668c25191d81d851cb3180a7341", - "28b1a1c283acc06e591844a05cf9acb96c10b0fdd40e57c4c97ff60ea73bd78f", - "b94857fad34b87063d94d654a3260b299af4c8569b9f39c7c121899831d743f7", - "f2e32e1b9187e3d972e7d6b994eedd0d6110939ed3467676c60b887ce68cdb2c", - "485d3f26a89559839d5d84e8968e394337a5b2ef76b33625df7468222361f091", - "a13516b59f1591d10e8008f066dca6c6fd9441641860ce48671155d970e8a6f3", - "2822c72d1fae531980b077132fb46828eed7efad06a3f5a9281bf0fea035002c", - "ff701c4cc056057999421debe230a145a73b3a8499a35eade16884bcca8f9964", - "7475de6251149aa6a1527c6593880ecbfd8fb44670c68b3dd3d245a436623aec", - "cced8e0affe8788209cc464ccf5059e85c16d558d8cc11bbaa28eb8d71596e15", - "270ae6cbd9e0bee56eba7988d0a5f326ec7e26b409cfc8b4f78cc260890cd334", - "26bff566a54e6f157252c52e585da99bf8ed50ed26f9f9e47c0941834ab786ee", - "1a06b444d57cd3c3b47d27dffdafa084026e092895c524a8823f78050d6257f8", - "8d3d347925b2f5b2ff075df71d9a2896485a3723bb2c4619c0f73c9014d9794c", - "6dfecb00c12e30d685fee4aaa5d3de841faff2ffd46ccc36cbd68f17c6e9cdf2", - "f31503c7e7d6c965714b1ed585e492b5f38a2bd15b6c15cddee57d94c7a25127", - "877fdb20ca3209aacc587b9e275b4ed06504f51efaf6e9a08a0586a3f3a39abb", - "82676e781cc9816d1a50e0d018c6849193cfad24b51b3fda3f90e8cb91d91348", - "07808257822bfddd587937095eaa14e0d749d100453508efd18aa1f1d4d4e9d2", - "7f53e155cf3dd0bac6e9415a7ac0aa6fc67966720ddfa40149d7134bfc134445", - "180732d80c65eb3f712f5b61d59c2e49acea617e648d889addeaafd2aa306180", - "20ac87e4e05e8b495e224d6f69112d264131805bb7f7d3263b6fb3217ade6aa4", - "2efe858696cf154c61f3ee8941b5576bf3a54c3a9460e36796396bd56cfe4db4", - "895d589a0629d9b2356afa91c57afc4adc8973e5108422f2dfd7068d1b38f2f4", - "7fd8d626f121bf43d7560d3beb0a1a6c87db18664d659c104f8aedc23491282a", - "4e8f7ea90c87420094fb00df5b3d7a7dfda16819241f4a8d88b36927416a326a", - "b33368474544aad9fd7607296e0af8b462411dc8fb89284dfec58370e34707cc", - "e18c094420d90870ac4787913a6f8ea54446ce0c9d3b4ada5d440a5dbab011ce", - "5d9711cbd4f9d8a5f19fe6e417b218da3a063189495f7c3e7cf410708e0650e4", - "8e7fcbf02b303b9e088c9c8d9d365466c2bb950c24c3e8d3d608177cb42d3124", - "31b8b0dc31add3796f15d5c132e97ba6098ea6d48bca855f0c6f49d49c6599f2", - "ad958fb3547a02a6a6ff875b4a1b8eb69a678aa2eef8460fdc910de8ee1356b0", - "23771641893a077c7afc0de84e4826318556fb80ee8b439dfe253807e8dfa114", - "cd3d3df59ff73625cad64bbd33a1e79f876a124c97aae0eb6890fb511a2e3e32", - "f5ea42d73af7922f767aa2bda11f0cdefccab465ce54cb543fa322a8cc9c9ed6", - "ce34fc4622e8921b925c5f4e8e7363a37ee9d7211b53de4abc15be02eb30cc5b", - "7bf7c3a2bf958fdf63c5e7e8e92b72240fadbf7e51f14f58a64fd91717257539", - "c9396ccca90b46f99802c4aee86477d88b4769e681d3c22b289c08fd29b96fe6", - "fe99c1be810231917df68506c0538562f8901544ffb6c9d9db85b4bff992271e", - "3f89c26069ec3b115a30212c1ff44a8b71b595ee91b40401ee0e102983211abc", - "460f978977e4c468311b90abe0bb905ce5b77ef5222214b9182ae4ee5800ea20", - "691176cce826b46095926c5b492afb62ca54e7adba0952b28e387b436ab4d712", - "a0a8c23264b2a88f2de3bbb00fa90ecf109d345d62c1bd2dcadd8c01ea840354", - "6047c691fb7b4b27c29bb5aa6b7ccd5ab1f7362a1f3025cb6b47c740d4ba2fb6", - "c2b9c0595c3297f28c3a34e63576afce83c210b4eb2c6212a766a72854079e28", - "73bf535750e6a85110abf63c1559de2ce29af7e47d688ac17aaa73f0c07e6218", - "d6c5ac5fce8bc5a263e0c01e16d301b7f3c267ad3c46dc1daf3b184fa4006dba", - "262d0bf4d8191eac26e98bded05aa45cc52db75f21ce34bc1ca64f93e0c90092", - "2ab20f2a01ade37f390a71cafbc63d8c5d823c0498ea744a18ad4c8ba017f700", - "2a0adf2373fdbb2349b7fad1496c3dd66955901f07beed2782b4a9ba797f3f6f", - "ac84806cc0648dbc021bcee1cad9acd700ff6baed7fcd97595bacf09f4fb3323", - "476e61cab781509b024ea1b71d9991fa78d72bf960c721b0a7efcea29fbd5883", - "376270ab82c0dac425131456e7ce04dac2c89d383756176637968f4fb2d8c01d", - "435b0ff2437e729beb0c8b892995de93c4730d99626f97303461216e094d2db2", - "48ff69a78e04f6df011b30884977181247bf85e1323f42076b99c2085757c1a7", - "be9ca85ff1a9180659dd96f725ff05dbcef57b3550c7713786d5ede66e232cf1", - "ca29e98c9ccec6271293d813d32b666e2337381685b5df3bd9835925f7363fb6", - "e055ab6e3a5398083e91732de76397b383489f5835cacf2de8745215bc5a2292", - "0dd865110ae202a0821bc2276fa8180d695910994c0fdc0dcf3728fb07f85332", - "83b5e7feabafb0ec588bce39de6a50ec4e9c1b537b5849f0628f6eee5035037b", - "054bd6adf86f77bf0b174da80702cbabe3e39773b05c639ddfe9116332093c91", - "0c53da6d1edbb8753426e84c96f0b711f8ed9214ef23122d5f32ec2b911b149c", - "296ca9df0e7e8ec65651d10cdb0b25dd0733d5af327e43817fd593ee35b36159", - "d7725819bcea1e879c0f6c0bd926841cb67344df9a7b2031cffe5c7b6e82030d", - "5122c97cfac2adde8a4d1902258dd124363c64b7537531b4750d355ab18c65d7", - "b148f3654d481f0ad667f3a43b9f74358a7013f0dcd76c832c1938f72d647585", - "22813a41d954394684b8b0d9bbfe21c1c9f781c38e0496851e5b29d9ebf690b8", - "983999d4950930e8d0fefd4533eb56b739bb8d01e5ee6a23bd8e35824099a58e", - "28b5e01ee21163c3ed1b26b54a588f1de93fb7148e470e125a50548274d7ad6a", - "e56ecddec5043482b9d7a416bf6aca1c381a5b89d92d3b33fd1b51a57019ae6e", - "1585f9b916c165ed353959efdc5e441a2013fcab73b0d31af2d38bab99ea4a06", - "e27561c8098f6fd6ea9a519e9151b196ff65c5322d09d19ae2a8d67668edcb25", - "d83b7dda88fd08dc69d77fdfb2f395c3763df42ee461e4678b96c9f4deae7a50", - "a3057780eb2d96e0978715480d15e69c1f5de054002b944bb5116821c9179988", - "346d8634edcc44a0b6b2a614e06da6cac34e4a217541616170085b16ee98f2aa", - "7476b0ba0e3f531c476e920362eb2d8e268e716089c20dacc9d0d4af72fbf4a9", - "0f6f8a67da47f92460b325be86ebede6cc74c3a0213e89107c59aaa98a028179", - "ce354327452f218b3dbae059eaa48798ac3d815933e2dbedce233c32131af6c3", - "1094512f5f50188ff1609ecaa44b8f35416872965c6f563c0f65f7d87495e0f1", - "3c10cd77697161dc2a9b826e8d5737773a8fa888c676611c05fad92d82b426b6", - "2aa7cdc4b1af5fdb7bd123ebbe4b0171f46ca701a56f325d3f374e4852f0ea22", - "b2ddc1e641f53a54198ef29a19b2bf6bac77aee28dba162bd440ccd902c1cf7c", - "84d2d2f2b608a066012dae859b374ae4d972865ecbf615862a1f67d93778584d", - "bf9aa2ea96c0616e38c9850e32bc44fa82ac21788b54e041ad6b4dfbbf95c174", - "581459e9354d9f567613b6706b90126174db727b76a5e3607a008713f14223d1", - "773ef0bcb4d9d3cd02f64d6451fa0f0c92683c4f7da4a9784f86dd76aef6be07", - "5d78eb5c395c29547cca904c75c650787a9e77e46384ebdcc42e58c394dc682f", - "7537b94b1fcfc729d9309e50a267d697a46c93e8415d8c3313f2f5371405638d", - "58b00a64d9367b3b3ea9aec2b40e049527976fee9bf52c2ac5eed2441276e2d2", - "1be2c5a08c12aefb058e811e007b9306afa9135edc76d94041a1a02f681daecf", - "7dfc713ff7c03ef210beb3348b8349763b8a906afb7214c534e6b2312ff4a1de", - "c144d902968b1df8f9682b676c52df43a657a63c6414b473a5534dd8ab9f259d", - "8273209ba6e1f94ba869a82f87fc16f71d1a0aeba898a0abf3bdc7ff57b6c38f", - "d16ac4f86c5a408ead69bca49ed933be31822df8dd9a749f58f462f6a88e70e6", - "fe5d167b8365e30b98f26084695355408dc419530f1b6a5ba1d5b8f29a40ab34", - "1639a25c8cb0a103c7096b534fd40a67981533f528efa526ddc153b09d0f5117", - "2c8e8eebd7c3150319ca9b980046662fa3dc43ca8731aaf85e1036e6ffc8d1ef", - "c63f665e9566c5d019c8238e55e0334198178841c156d6e29ab6fe4da61645c6", - "0db3d437a4ca5e5fac45b625675f358867ecff71b5789d0caf9636b194abce5d", - "c4f9969b704aa7fbbe204fc333f8017adea8c545e17c8db7f4e121d80ff8bfa0", - "01a30de67bc20c1ee143c93c6e8d5fa03ee7ec1acddc1ddc3a58db0dea7c819c", - "1cd4d2541275db66364115ac46efbb79599b6a2766169ddcf2edb8b9df56036a", - "61cbe1ff4d4884e367ec20d904ed79284cc65726f2701cc0e42f17e8c8b7fb86", - "ef10774762b7f75cd866ed1c07afbe67615498d76e7b143750a598cc91b48060", - "c7f65511c4faecd46d50f34c945479e7e44da2f2e2056b6ebac1f7070a32f47c", - "cb9e1a8707f8740a3b9ae716b03014181f974c39127358c537a835627bf8b76b", - "ede0c64a63d3df1a116333a7c6540b3d50b47eee6c26157121bbb631fa5d3e74", - "143dbe4a43152b3c838da09a308980aad2517454a4fed9e8ef1cdcfe573979de", - "0d6e729c1bc4ff5d747e067c7648309e265ff975f68be04f9e076591496f2f43", - "826ac7a1e1e6255587f7e6855d6aea684a647360c4489353a1500f6672702c6a", - "50ce67214c45583d495f70a20725653e5a404ce385be8712e19de416bac1d805", - "721b98fe6cfd54d115513187d034e8b766e22c3e71a15e6eabfb1c1ddbaea870", - "0b5c8dce81354d128d0275f7b9ded5516b0b677baf05f1452bac8c1fadb3b9be", - "e2296153e68dcb8b9761dec1e7af8a21050bae29eae436e782e54164c0dac4e6", - "0dc06be00466bcbaa909338a1f49620804c2d8bf7143d9958baa7a43aaa04a4d", - "6fe93846358709eb1ae36579f36191db53db6d8e672af529d5f1bdaf226b3739", - "b1408ea5533c70ecb6b1673ceb15dd622e3c92830945323c35ae81ac0b86e159", - "18bf6aa7d0a3e07794cd32fbd192e964d28ab4f023da1e37b9824de68401b03f", - "b187ac3598c64c760a2289a7e7c6cc783ca056218a586c494ef3b08634132471", - "27bd601dbd12df1c5a83efa3faf5c6052865d999333e64c269ee9dd0764bc2af", - "8667b1c57d69007d4023c8b65882c876641183161a078b0a63e08bc811dda802", - "defdab9caad77646544b919fb3905b2afa70f16fd3f13ee95a4d17d95020f2ad", - "dd47924dd3a7a276758631562c4710bb09d4223b607ab4d2369656c6c3cd206d", - "e37664ec5e764ebabb4b52e3c8cb52a38af783af6b589fab8493c4c69d99fe87", - "e8427908b073d2a26ebf2e55a8c2b9545083c27e70c775a01a8138e7ed562d6e", - "3f70817fb80e986f768cbac2c57b78e96601731315209a8b96f50b881c8b5382", - "a497214903ddd64425808f11d4a114ca325163b53c2e85893b6f4e2a74cfbd05", - "ed546a0e840b852fd150059fc762f1effc2e8835ee8c458ad4a7aa06fc6133f3", - "7b44c8ad73faad3f4f609090de81808b765129f0d5025aac523665489a2f4ee3", - "e1015ae0a3d8e5797d27e13aae874163ec8beff64f03727f6cc3e51efc069316", - "bbc303b00051aba5473dae2b07f5964e1f845f3fae286491e153c4554880deb8", - "8bbff43a5def4f97f53c323a033e280e5c93d58e63c0bca011c819a458024f98", - "efe3d9997fb9ec64be1b634fb589cd2e5d764adff0f95b68bb2b9b0e3d016ea5", - "7989c923b40cd6b73be6c43d2deb4b6c59035fcc5a45a7490c431313e8bba3d2", - "e5dfa2ad4c1d676edcc527498299d9ada8b58ad1e60fc72f3446449fdebdc272", - "b344ce848c0b68059e1fdac68689fa1ff4f4141d745639c6f92da055ce56207e", - "8b3e31632216c9102295e827ed2b02cdc95137ef365f93835b23391242f13767", - "420732470367829024c2ae03415ee1fd4bf7d478da0f9a072957a66cb610c7ed", - "fbbd159b9c1112d3662ae3ee1c3c830b9f6c968dbb0177210793ef7aa7f9819a", - "b2f3e3ed5d12e4cb571ec425f58c8a474c2364deadb1147490ef48c78cf242da", - "47b96dd3bb0749219d6ace52cd8f3b5b683b0c1cebb995cfa9f8df40514f8f8c", - "1039cf255361ff57827a8495fa4ff38fc0ed4bcdfba699d7e345b1d0e098f5f4", - "8dd749b16aa30fda20a46c584ef2eff7dce6d969cfa254448ee76f50e615b9a3", - "b1d0f3a7bd2848383bb5266515c2d9ab1fac17621162e05f7b0661036338ebf1", - "3db2df858aef6ae7471c9e109a83ffd51cb3e0b3667ccc90cf06c659780139f0", - "e7db3921335217d8057dc743e536db91782150c9c67742861b64abfc8c0add9b", - "b7bbc84f8b1a24d72e71958feece2f188d6161fc1af5c70d7dfa033c3f4fd3c6", - "31e65b5dd959b3a050fd88aebaa38fa7a425a4e7c9951946b53200b072c41afe", - "9b3b4a96810a84a02f6627be9a146884ed22c02fad389cbf140e2030bbf7b2c4", - "3e1ab27323b39898edb80436bf11fb036402ab0e993248ccbbee82d467dc0aa2", - "47aa950381c53e0f423736b3d6bd491ff67fc1d41d1c9d2ef58592a87b2a8dc3", - "62477bf85a3217c2833c8292173b980073656800f7388015d8bb64973a2312f0", - "7db463f048085babac85bb9cc4faa350b42fde8e16685f712d80f026fccf70ec", - "f6326337e04fe2cd93995df816054eef2a097d2d479e90765633e4a0faac3655", - "7e9dd7fb0a473247a4d04a19c3ec8ac183c7e74a141d86a2d334157c6759836f", - "241cafb3bd7d7b32e1780e4fd70f71c1f9cf732936dfaf62052aaa04ad119e3f", - "2f1fd841dca6dec83cb3674c7afbfc9b249bf3f9edd7fa8caca5d45ee410b24a", - "09245dc67b2da75e8bf266a38517016e94c66b84e77fdfb1be2c32565e7d1fd2", - "dc4d5b13049e849fc732f1f81739bf447fdcd2d69cbfeda2cc7c993fb5b450b6", - "ea7d76ddce73e93f1c4b9263547b106b0ba46a2bd4185aca21cbb0cfea40377f", - "784e6976b56f08ae59881d9e40e67fc4be6548d753421c6d80a5dc49a77554a6", - "166c1d841b79832e0f0e561275209bdc437953edf12aeb30c783444d0d2f1eaf", - "97208576db176cd4d2fc193da86d1e3d142688ff3572baf3acc70658db7893ed", - "5ad9fffa262d700755e76ee79a0fc93667979baf196837717111ffbb2c905e11", - "81578ad302f846b9f5b601a73b3aa1528d0541994f9afc74add6e15155d2d0ed", - "c50b8ae882546cc789d45f8bb16f5c0eff3d76ba74e2a9e5c58f279c12a244ba", - "c3eda5c7a8430f2b1caaf2cb2496d0d16c8959087c6c47eed60977bd0eabcccf", - "98b529a74f88cc7cd3821bba4f9cafc0491ec62fcb8f394d30b92e374e5349a5", - "fae4675cd95a384b1577760bd9f9ee4374681830beed27edf4b8c763a6095062", - "5f289387465c1d86d95b16b595722342c927bd774d10005ae11c2012bca11738", - "5a7da9d3af4cf1b61eeb0d0919d9ac7d09a3ce430d7e054bfc7edb4b028a551c", - "2857bdcb0d39d3ae001a7c074c09e8f2d6246114a9bc0a34c7b2ce8be86f0f13", - "3f0346abbc95315c84539253326a0e5381995e393e40bdaebb5aa19e075bf2f8", - "393b6a634c915341285f1ba106d9a755bd89e9590cd7a4f9268085439f8251f0", - "90fe11fc7895efdca042d9cd980a2df166e608be49bd5d3bc8fa42750729231c", - "17b91c8243b051a3a5411f345e31d7f6de1e999e0b865a53db80a8317bd62418", - "4e17f6abce7ba6ef015b39874c764c654e726b1a20cfa426894359e229b8e6f4", - "0b9cad8c6f8bfd7edb5276fa6ff7b1d8236e84845a232c98a0d83c37bcd42f09", - "c8baf0a2a6651f4fbe9d89ea1502fa57ef93cf5af8b6e3ff2e82a883b96821aa", - "31f083a79472f24c1447557804422a8a80059df971a06f6cc6e65d67960a5bc5", - "f1683236f5f9e6e7bb84210fa636f1c4a224912ea78621b2e928af51eaae0a5a", - "8a69585f8eb8094b094709f08be5b88051e488cb3bcae7758bd5dce1667d555a", - "07a90845b9eee2c72683b27889ad6fe7604f97c408375bc10d2d27a65b15e752", - "0ef65198143ff3442e3c936decdbceb49de4173a652755ef581886d65511bfe2", - "847f19310666ef5c07b53aaea433a0c7dfc65ba277af8fbe13b108a046ba0043", - "11e4a462c88e4e3f6d0b6cb3644fb5dbba9b955da80cd15fd19a12afd408f500", - "eae6f66da6ca39ee917f226f5ed8f68608413e016d0ef0b25a4783985617866c", - "f7dfa0d63fc047614ec725898a18d49e13fb19d7f73c24afb2098b6d1a43d0fc", - "e2e3fef4a912ee666522c53a1a4521ea233cf1f74d7e8199837d6d1562b0e898", - "ca2bfaeb5ea7e14a0832abb2a813be0e08dec91aa4f05cbad3a2363b8f581e25", - "6c135076982293ac287a64595e285c91215cfa560f4abe184dc388fb0814f518", - "fc036729c883ba48f00438c1c77a86fbf82e8010752f4c9fa6d87e69d0c7de28", - "7635221fa0bbf71b203cbf5a1bc10f53d0c4a4a83fb94dbe6ac1a9ade36b70f1", - "c99098ecf82d6fca29180521117945e1cf1346d226f5b0681ca249fdf0f0c3e7", - "50c430f158d99658ecf4dd42e97337280f3d633b3e88ad8bff22ca4b58859606", - "9e0853cbfb0a825a7f9a97e071a3b6e44f11cc23248b20a498a004bc55e315ea", - "3c9ee12576303b79cb5078135a2b58956644a065dbc4c7ba87a0e9ed09e09cc6", - "94c8e35c79997b98712f3998aa2abdb7454ca9c452af3d1c194e540279c25536", - "cf22ac21cf5a096997c5dd5ec681a986b6b6529e9ccb88551fdb75afd0f851fe", - "26beed24ae110dbaad70687bdca258f9fc0764bef202687514da5ac83afc3061", - "b13df23157f49df52729b5551261457177993d9e1966ce670aa1054df95d2de3", - "99b326228eb80ee9db21e19562ae2aedda5cd811783572da4ef99e8183d770f5", - "d42cf8144197a0f0404bf7695aab1dc23367cc6a8f894f00e4f9407bff0aa7cb", - "6ab86b692f2c13f328e988bb436a8125840217d747e5dd4d914d3bb95557d161", - "0de034faea2247082d9864cd5c3d8da7d81334df5e8c3c37b35cdc0b0c4cbb44", - "cb18f8bc1466e99c3805da44070f76fca7284d4565245530948e52cbf0be0084", - "25d84572709120db69e943761b28303d6cd8ab9ff8bf6c1c3c1ffe5c6e595f48", - "e3d88650c0586ede4bbed29d3cf6d76f7c23df8636b027179145f2ed381cd697", - "b83b1d6bb6198738133f29f78562861ee0503d911b3bd405b97af36c5836256e", - "cdc1393cfac3e31a7601c6dbc3d5242e9440d6b051a2d0cc7689b7a35717a8bb", - "2cc65746fe0d0fa68b6b9802cc907241b6ff500891aefaf2071a2038685e25b6", - "9ab8410772e9a5c4581f498d623dd62c335d2265c8cbce6bd6832c70374c48ec", - "159ab46a58812826ba76eba0999a10bce30d6dba1d37273a62e4ae57a174a8b0", - "f5dc8d5068b2171665f92d87f897b857ecfd0d872f7a4f97e8fc61890cf4a4aa", - "8922ed2a285860dafa1fd07844ea06ec033c6927a2645d7bd6bd623384011d7a", - "c94a3907b23699be250f8317bd6a8582cdf827c83e1a0050d02d648039310bae", - "5b4bcf6eeca4abaf5abd22c9534df65b36be15cbbe29a385b34470addddbfabd", - "9de265ce2840316324fee64fed1700ca553ed03fbacaa83be931ef927ad458d7", - "640175a1331d1ca34481b07be875f89b60995a6d69907fbac7efadb232026b82", - "ed55259776afe49b10c1211ef798798dec115d9403ec7075080a15663177e484", - "a3ab69c62396c446b5452710025bbb0b19a470586159db7cfc01458280aa7e1a", - "d47ef48f334bb120daac7b5060105ec148cbbf560f2b3ddae539c5a634ca30ba", - "106f0dc998cba9ee3e77fce09c45d83c5a251b67b1462082560141ee6cd5d98f", - "eedda5df0dd9de95790d2f238b738184177a65532decc727f97aeeefa421dc16", - "7f2145dd13225771aa001ed68529e83c83eba87dcaa31ab12bb1611f3f0e7813", - "4a27a56dfd8736f4df1957fd0a8919bc10765c3400bc129bbc3d730834e0b4d1", - "8332f339451e08651a37fd4ef9ef6c6bea4ffd4641132cd6d3059c88085670a3", - "88ade94012d9a384c772e19ffbe5bffa2b847487712718df25eb2d6c6cb4f282", - "1c172a415cc22d75b5f4898ebfafedea9ff6a4d6831f8b7097b50f9555574e4f", - "195eb12c95e7de7a1344fd386128a017181a6a86d5a33a9d097b90a4b46ca8f0", - "9285542a5c6299be80930686e3946384ee8153bfda9367d79c1ef9f02b7800e0", - "d58d6eb9c72e1c61e0537f669698190ef7565cd922a6d3562abab5607927e94a", - "81484b385f10ee046db5647a27b35115d9a96058ffbf25dbf191a35ac8524473", - "eafb6d598225ddd006b3a6c658481e7476717f7525929638aad0ea32fd60e5a2", - "9b322f8a6f431984e34f208c91cbfef38a2be7b8b7ee425b1d69c8ffd18ace35", - "5ac166cc0772ea0af561ce223d581c498f78fc29e146dcbfd245f21dc1a5f5d7", - "864b582e58381e143e896f2069a5528a5a3aa19013e9ec3d09ea8ccde35aa787", - "088c5f25a09ff7349c8d56817ab677f4d00cc5f052ad73e358b074af097f2582", - "7baff35e061b2d135f75d53028970a499e3a4b85f744749d14a9be9cc305c454", - "af2e44b5f3aaa539c8fe2fa8ff3d5376561986ab3234bc8681f1d47bd9ba0313", - "75a1f665e006ea0daf2d7ec25eb2b36755fad1ad17c30dbab9ae0677f6e06cfa", - "d6c82135f604a97cf5601ecf4fc7c22573d606a54184b046ec09ddc64996a33c", - "bbb0f6e9167471c50aa96a706dfc04f7fff7c0c4fd04c0647375d022f25598c0", - "7e84f5674f1422b0c4ca39a394376d9344137871520472c2cdfe14e433d10bea", - "1fc7bfae1eef67807708e1f96f2dda0f5fe7a52f12ef50f329fb0a6a9403cbaf", - "232ff4a48c321defc873960f6f387e3006f8d6e2d137c1932e70386e1f09dfa4", - "76a4f5277155d708a1f8568af69f50aa8df2e8ad6f905c061eacd28768f6546b", - "8ef1b386097275bc33697f351d264ae405337960bc91f93b13efa98f6fa69616", - "a7233a8b3ad23e677e421641db3f5dd710804ba328fec8c6944988b29772288f", - "346555ff102b7d18be4e9959a7f0d31588f51a697a863e9fbc8692e7b398c019", - "87d6aecb3370613ef4e2b2a6be48655f2f776c1d0cd3c306741e55fecc8d8669", - "41dc82a32ced609069589cd9938154aab6f5dbe105b3e9aebc3c33ef421baa2b", - "1c43abe8b25579ed434c2dc05fe53b8428610573a72b72c24c08febb21465178", - "2244201004d63d25e0ef91ab90f33b519d997e1cef654d3d5046bd1c5e0f0fd0", - "dab5294b046e462085d05adf7a30afe5839177f8cd315ee1c62b49c876173a3c", - "053f81cdd2a327965f2c644921bfc40b8fee0375663bbb7883dba68c521eb934", - "1e2b50d8f9babe8be276f47894fc37047d9a50cdbce1732055e5cabe747f9ca3", - "5ac56964b9bb98c52599740f4e198e061a30e8ea49ddf04b79a8b3aedcd09907", - "bc6c89f4234db34b1dbe48362659a67a22a5811f41c6ca1380496438a89ee7fd", - "7ec7ac05927611e0645d35d4831dd530e4e62d64fa94de46c32179536b7a773c", - "12fb692e8045f3971b2e87fef967f9b93d6433b2d6afa407225ede8e9ef50e6d", - "f3e88a2a00eb8f51a160dca891c10fad3f00748191b3b1c59c6651670f5ef81a", - "3433b6179f0a58741bd16661be8a7cdbce1e446fe1a5893d749d8050113a00a7", - "285b41b2171eea9af15f679dce17185902c510b6986dda6c0c23232b9762648b", - "b00b4804bc4746bcbdde6c2bb57a9b8cad06ecb0afda3873dd860f0bd994ff65", - "0c4232c9402d160fb3ad6ef36f0b4eb22851272775acf4921fae399cfa20db2a", - "c26fe818971e22d6b33c18c260c07421b18464f48b7039d86af51ab91d8e66de", - "b19dbb3dc96a34846ac4dce06c878488699785847a4f99c3ad85eb73638a3978", - "12d761edcc50c188239bc159fe447663494e6c4a4abd1dd7669f84539e62cd34", - "9aa111bfd1c8e777a372222638ffe722bcb352cf6e975799c7217d60af4325f3", - "2f3f35d351c53cb9bbb2b68f624e45d4ea599a3e46ec1e89c6b04ff1f5335f61", - "629fccfbe0630afb60b0fc4d0eebe458a0168984fa06a441adb77b6c7601045a", - "c718153f8547fc1301d2e0e9845481474eb16c934dffb2b1b21475e3d1cd218f", - "576cc31175821c941570a240a9e5cc18978caf3dab612e535cbfcc74ef07ce20", - "ddcf1e08478b06c05cecd86c019d2174ed38d81ba9719351ce5a3c97253d5bb4", - "aeb437d52814ea283d891347167e4c4e969e34ea4aef5df3d6f6fd29fb7ac91a", - "50f3ed10418123b0667ee25eb379696ea6bd2d91477e5f4f7bae6191ef1dc0a7", - "6826a0268a206638e7d7e2053781b9952f1ca71f7de144af9cc51dcb89284885", - "4ae389e91154b1c95ea22a57b55cc353b255720095fcc0ae0d5e65868bd1ad8e", - "7d73cf42fd5b1396d3a7733e90f1a380ac68077720cf5c990f1f600ca50ebc61", - "f018de064d76fa98958c6320b549970287f0fe9d22c74bb6216f79e99160eaec", - "ccdf9a44ee8278d4a4f7c0bc24be3cda73d2703ef3e84ef7566495a2704481d4", - "f2dbd5654d5620329005b804a3744b143997790c73488162a6a32fd6ae930370", - "15c4f6fef29d9c35698b61ab1666cfb961787a818a8cbd042b0a94799eb8f523", - "9a8bf7e253356ab5dd1d0758e3768450af9c265c632f967bd0503738a99ae9fe", - "c7d4cc3157071e2ae41653ed8437d127c57e9edb440c74c4e8c04d0f1d183c94", - "2d294ce660da1669fa8dedabf1148541e8b04ec4a86639c409e12e28e6f24936", - "96f173db3fdfacf0235a6b8b5a1e0087f2524d012c224c3fc427677a0894c2d6", - "2f402830bdc671c78f306bf6a3cc9bb90091513093e0fdc208aacc2e88dbd1dd", - "93b65318b603f9467258604fec0d8f79656565a1fd62f894019222986a4763fe", - "79415ed562a21c6daab1b2942e05c2c174eda3225636b6738288a35b2c3f1d61", - "a3bff2e14554231accd817d6118f361042476350de097c5fbefb7583948a8c95", - "c500e4febca16ac536b4edb1b49f84ae2a795255b1fb3e31b86d653bea3917b2", - "6d40464e018934d224a95c3e145a055880805258bb109483422b6cbe6489b826", - "b525b88d89d56f425567dab931d6c4dd4ea552b59f2f1a6c82066b276922cdd9", - "eeeb73bd1211b9c4bd27804ad8a0c0591d5a5479cb5880270dbfd2e65237c425", - "2182c5258f1651f7588c9f6a4ab3a9772eee6b475f3e4bfb8539e8cf648d05ca", - "4b732435b8235fbed8ace8a9e4ee9f6d172833e14932ba6c11cb0c8f4ef741c6", - "3ce8901b7f70d6d8ea102ba19226bac39217e16f9192910ad93cba99d46f1108", - "a059a86a2312c0e6e259eb8382ff26c82cab2ee35bd7848e0dff949664632c94", - "9ebf43d160a3dc7ddc44e46a4dfa5c3445e66e0fce582fab786381341b1fa3e6", - "241cea6aed01b7d9323d798a142978778be17b0fe02113a150128733346ce7e8", - "a780795e14648f613c29661c119fb9979c57d93ff1e96157590db948a4e23b34", - "f19139f5cbfc017acd7b4e4c58822e8399fc573f60f4bccdc1eef3ea5adf76f7", - "cb9bee2e109e5a07c5c2420d681017dde5f1a29c7da873eb98c53c8ebb3f9871", - "8df820ef3b295660d2a84c25e977d651677f05da0cac40d9d6902e4dad5186b3", - "1cee38c30eda82d65f9e482ecc9f3389afbdf1fc6d806603dcf4af2323d7a0a4", - "c063907fafb0694c1e236ed26d4e30581aa5a01c602ca8095002cd82af430762", - "4564298e861aea6719acf1f995569b4d02263797db5cc158a47871b8b79867c4", - "839399a6625b6fccf19f993e25e21da789abe6a0a3ef4d1a7697d701e97f73c8", - "113f2531f7dcba54456e626d5a4817882dc1e6b0d398941847927639d1117581", - "22192a61c2dd3c68b88d9e0a120e3431f51cec0ae8d4e9ad4bcbcc2c0ebfb7ff", - "a900aabe48a9422a344f7218415c7ca989f2a7e5440e660a06883f2c87fdf90b", - "85ff1fb63fa5ea9f1199ac2f329e86b1b95f309f55abfc4ceda4041147995e2c", - "fadd6b44efd15f69dd94714c51ccae157ffc1aba39ab465fb9356a8071ef127b", - "e80191e5d54ce7ddfd7ee87eeeab2a85ec1345655b73daadc241e6a50554752e", - "17f9b575626253579017971dc55ae88ea9e651dc780bb4f6bc77ffbe654c95d6", - "200a705e838cb580b15d60c3349e92a00fbce408cdd9b192c771c7effdf62d20", - "f2266e73598c8fc8e0a642153cb905dde9aa43daad967d1ef3e1a68633cfd21a", - "69ce326276d367169acd7cf23af988028f8c9ef4d24098beb169f87872f6e30d", - "ee7c0a19b587b4e681dfbecaa072499980a91aacf389f1b07792d4ce005254fa", - "714c0c000fbef09539737a93be52b013153192a1d54bf30f7158002eeb4d47b3", - "dc34982b07f511fec9662dbe7417e5ce5fe35780d9cadad63cda3efac27de212", - "c2cc1936d3ed35e79555bd7fe9657448daa004d4bd38aff8366b32d2028d4302", - "d487cc6085322f2087255e26977d457c6a5f83e344ebe901713833b3c0100cf6", - "a763b107c141a8ba007fb02ae30042f9fa5bd17723bcc062ae46e945d09d920a", - "21fcf89b718466650e7b58a1789d966204239a52364ad3a47eecb0b725b8bdec", - "ec21642e4a5c61235ec7ac3a16b2d55d56929394f3a60c2870cd0ab0a1a6474b", - "470d79a6ff8f9dc4e2afc35ae9b6b047412237e997d98521edc403aecc7b5576", - "f2935b4424b124fcdc5f7c8943d13973d65d68d7208992138bb2de7d63f953f6", - "920ca6a2535777fa9d4983ca551a6b016223c133326f5b092c1a85bd2a28d117", - "44d6cd5f2f9e4d6889b5b4a72f2557709eb6bfcf277f28e4c80c91edc11627bd", - "4dd9d0003ffcf5c4cf59b63a5041f99c05f2f3836f19fb2ba5f7aab6b14ce243", - "69854423f7a566ee0c55ac5d339ed314a9be8fce594646641ad2c778add5a6f4", - "f2840faf912c7a62c3eefa9952b04d2c2e1196bd37387f6ebcc941e6ba651e2a", - "509fbd1482d443e04b1e1321f068f5baac836cef8c3b5b5e3b21243befa7f5a6", - "e45f35b7830db92c94d21233a2ff5a553c1cd5fd1075c2f2923de6f5b2026968", - "0b2da81f869c66b13c0b0e657aa8573586aa33a209ff3a9233b218da3c441311", - "664a799f2bd8de79a931e0731a0ab9d3dea04f78fe4590989455380c195056f3", - "25cb8b3af80ffaceee63aab7b0fe8e357bd2080a137d916df32b34a5cc6c3ea4", - "7ea85bebc4c0ac2feff1cb4461b9023839148ed167ab5a175735bf7a02970d18", - "9ba49dac98d898d7d12e204ff3a33f5ca64d3efb45fa6944dad828a8c2837595", - "5e6e080d3ddc01def0eb3a9874c9d22c1590e31402d527442b6b7eef487f6ae3", - "b0afdb1452611c06f7af71425c2729e29b63da53f8d6e12fd4b8584354914447", - "832d243d85eebd76f538e0edff14d09fec7d0dafb9bea91305c44c50f802fda7", - "c66a83e2c59256ddd27c0370389ad15b0f4423c280a9fd8c1b45244ddc2dabf9", - "078b8ce3eca7597be2f1e0622b8ac145426624ee62584519968890b78c35f7e9", - "4b1aca5caf4fd2857eaa4c952b5fa687b1c3b29eff2a4d4073c41707b161affc", - "8ce8442685772153ae1d74663eaec9b3a44fd37ee5388510f3e5e97c2b1766b9", - "b29d2f64b38936d5de9cddd554f3b5fbe3dada490f2b97b77b879c8e449b01f3", - "35a457ffa3327d73534555972ab3cbceeddbf237e2534fe4e3c1b47c3eb6a5e2", - "d3c7d4915bd4e70563fc166812d48673b0c172ef90470bb20f09fdbed1360619", - "790144dc38db07c2332a5a9bf0576c38018981736c0e906ee2e391d6990d27ee", - "d2e0aaf0c3810418643fa36732325def66d08adbd297eb60c2d3bf5d1331e985", - "1c7bbecaf0e21159f2d879795fe7f4f79a3ed0224688df2613084bd602eb9650", - "924b0dd85dd5a863384a4f028ba88dd08955b936679e2d751fea00763c7641f2", - "c2a08f61eb7bf2fc620ad78f317742a3fbd495932f0c213857998aa53eebb8a1", - "f082436afcfba51fa0770411ea0350db98fc185656cfe69232eed41696bd8742", - "622e2296bab1a22cd3953120f5d48871e4ff31caddabfa2b4f8f9b3630cbdc12", - "ef21fd4d2eb7c6dc552e72fa2dc700d5f84b1aca02756fe03dc122e2bcd64194", - "f63e7199f3004c062cf58082431844cb6dd0b4c7152b2e9cde02e85f3e7ed9f2", - "a42ef01d74a445608463a3e1ddce6c5c2afd7d6472c674319da8bc5f0f99dc42", - "81339368f19f2b417f27a3fa24d00c0bbebf1a6ae33552c486ad44c7cbaed109", - "761c89327d23774bb4fbae04e5593ac7189e3fb44729ba7294a1946a219cb82e", - "e8f6ec9ff9f206b486e9712b902947db91c394294f8b68a8536b949a1af32369", - "02e418052c768bb613747c5dc715261413d0df6ba04aaec19be17eaa6625dacf", - "bbf7bbcd65580d7115da7b8ac652d42ff3921b7448fbacdb4a0a1c180bffb217", - "7b66d878b814dac74abaae460a19573c00b21f3e3587e66bdb067cd0e73ccaf9", - "491f6657b7d6448bce3df6ea27d844f290fd8cce905843c63f79a8820de4ee31", - "ab1bbb3aec8f3e73ffcd8a8bff05f12f1068858e361028d101bee1e057e45a27", - "de68fc2838bcfc3fa5e230a09c37af16d7337c33a959f3f8246393b4fb765ebb", - "5c3316bdd7502090533827ba2c3c599f1ecc34ab78b51a6d21c46da4219dbdde", - "6c9a1d5040450908183f03491c2c41b201663d9c87a0fceaf2dc7cf168cb584d", - "ed44e38e20ff9cb76369d22133fedc171b529efaa19a926c7cdc03a3a93f7c57", - "32100436320f9fda4a52c1a790f769602f2e6cc8a9df001918e112183b17500c", - "e33f848d50da416d54d18e6561a71f5c75d147854356eeaf05bbd80a7fdab69a", - "d29ca8fdc04f22e67a216fa89ff2a31381d0eca1392f7b86cb55ae72a6b6ac3a", - "e0de0d5e5e144c249853bd2e78f1c6c3e79cada2a2b72ee2a287a1c3a6b3f9f9", - "a452b86ffe1382844d390a5ab5ebf3171990014422ac8b52da16db6c7c4d19b7", - "0cdb4b9aeedf407ee35f57d3dd451e1285f89d7040ee26737a934e95ca52a1be", - "cf5150ba5dd0c5eba38af4b9ed737e16ce5659b356259b25d41a231fe47a79cb", - "bc92445293c6205ab309bdb03a80ae63643972c080a6499491ed33e02f9b767b", - "5a52d2eb8b8ce114f7c84e27d2fffcc14d33e0861cb3eeadc6176f7c711fb642", - "8769856c34bf01a111e3895c08d2b8d3152d397772cfc59408bbe544ce7f7aaf", - "5f36821523de9f88fc05510c1071d3503aa85f854a75a48fa30f5aebe3cd16e3", - "7e24ba46296b77a8be7b91b232da917cb9b75a268000b1e55be4d952eb72880a", - "c0e7557a6d0a5ade653b5d26ca8f2eb5e9f61803882174d9fce935452c61d111", - "1ab14e764970bcd4cda06f240c56bb22f1021d60da9103ba4e49f067043ad65f", - "cc9ceb3db92080e96a990528143891eb809e9fd8a7f1854e057175fa1605c392", - "998edbeed20ed7b568f58f0f3e488c644bca8edcbe5910bb81adf9ad632a3c23", - "5984cd47337ad46f2e5c2eb7b0249fb74716f5eec11a30415aee087e4746b640", - "535a1b1fb6afc5391c576bfec51c03626d8f744a436fea41b926b6e62ac06aaf", - "1ed87669b4bbf4270a9adba4d021643aef2e98e0a97f1e05df274d9da33d9d64", - "99bb6f5f70b205b7b769d79a8fa301fed1c389c9f1d2f83a294f27741f224a38", - "8c0fcb47827c33539f6b78e64a4031831bb723738acdd4e4136a5fcea17e6fca", - "39c4cda6fe27a39d6cd4d96bb71111b4dde811cb0f6434accda2efe7c95fcf5c", - "709f5e777251690ea5b5e603f361ab8f836fa4d009328628e2ce7845b423d33c", - "e537021c0bebb1c7f2e7e0f5917e67873bd910a60e44a8161d593f535d58b972", - "9d81aed6ee13853fa2533746fbedba39e860f437244759fd7e43f96f87c6cffc", - "2bf10f14ebedef9867c00ef969110353f700b2ac8f7ad3a6d012ab02663034b6", - "03898f0954485cfa635a8dd6305c69dc6f0a0436df447d1c1fc334f0fad4f0a2", - "ca509c3bc3054bdd720b6775f03ab92a2d85892129a9acc97267c90b132575d7", - "e4f182dbb0924aa5c90bfbbe88b2b34ce40c24d81ff9948adcdf0a743edf6841", - "b703c280140c1e3c0ac6994d859471810e0dbe846800a00b809980ca0447ebe6", - "a321cbf0eef41e6bc820f08a79070fea0083232359bcbf2913e4272253c24a5a", - "ac8192258c89e20aae92c73c56d35bd4c617c943be51f6e7780fd56afe266836", - "d84348e0a6a8cbbfd69eea8c6591221fbfbfdf5b9ebfdda6b000561547b8bcca", - "718ba26db8195d367dd22e138e042d524bd71bd93330e97d60e6178113e1d285", - "201652c6d49b1b5196cee2b971501b353e45d083d24360476aee82882e87576b", - "88dc404f05da9bfdf30d6b57fef3de90479fb9f7a95d04803d291b1bc4688774", - "e2ff4b3d33fdf372248601160c0d9456bb6970914931d66499828e9c49a80f88", - "f005fe9bfd77779cf94045b58a5d88c8546bbff57f88e7326f8e7aaeeba049a7", - "3d3bd462309750c592971fcc35d5c424321b749f168dba92dca249912219fd38", - "6b4136074f04f8cf3b125e08ac260ca2b9e157ad8dbcabe10e0149f50f006ca0", - "001ae52393b20a8c67396f97bac1810abe642cd1c9321cfbe78b3ab9d3d46163", - "ddab9fb54e327dad252ef8e42e9b2de943e7260f6286c0a6d96c39504d0e8ba4", - "81d809f9b9e2708bed0d6b50b6bd2ba82d52dfb43d0c57c6e5614695cd247d4f", - "f48543cbf9bdaaaf6c418d0ec6d895a8d972599d807f7833e42e38df5f77627d", - "54115c38fcce3a8354ea1892ca075e9c2e07987946f0b38439a2eb08aa10a3fc", - "7a19fc954bdf0ed574d9af8480da71f396ceaf0dfe164a40729635a0056fdcf3", - "9ab145f7f819e70f2515af95c9a5e4022f0653f569b03a1a9391f870eba4f9ff", - "5b36803ac85a759144666fa93f7e8182fc8fa1aee9f6908ad5b39f793466c0c3", - "d7a385f384950fc47a0a8770094bebc9177a04d91b3ff64f41f2f0c97d32f539", - "c128c203fdba0b0151ecfb2a012d0e8ed598764172d182e9a0bb8559bafc7045", - "5bda278a2a7422be3d2f026e0d871bac3d9dd502135eadae3081d06cbd2458bf", - "e07c36e02fb62a30ed8b31e86daf9d04381c6246a5dc6b2b61646e5d37d66918", - "252a3dc0d1f40931503b5415d2c1ae63992cdd86d1f21e376c0600299361ebc4", - "5ad1a2c2dbb69cd83506d235e3c556ca20435ef80324f0af4d1af92ca22999ac", - "b1e49c25843164abbfcd3ee8fe00f383f4cb0a80a4c3b1ab87d74fde2e78c234", - "8ef98d8b865c5924f1f039f04d833c364a78e998fa49774ddc9750e589b946d4", - "c345b20b0ce430519f8b5dfc4896aa3cb3607f43c423adbda79e1af774ead7a9", - "7ff25aacdeae60cbe3a0188a08a4c4d7ec4265393710b7dead698d7f8d6c822a", - "c80205b86242906de4e4d1d6ac8b0f31e8df315b9bcd30f4d01ec832278bd539", - "7f517876db58b78613df76dc92acf8ec520a43a0b5d61d8427fe46f85b09c9a3", - "6ad23393b327d354ff0cb91cea698e2c9bc755b1050eb7e55b0d21ea8532deaf", - "6c40d1c4d8a597d52b9bc65ac6edec8648c2dd63f91cd3c34686275b179acd84", - "6c15003ba800888f22ff224b828305c0e0abf91bf5e7a4787d05118313e21969", - "b06aaaa8d3b16ca7cd6627f7d2b840b5e717a110ed8ad8992777da10cff525fa", - "e8d666919293dad7269f64b001d264434749c0e388db19fdaa809344eb6bebe3", - "0f986199edefcaaf5ab34a82171d0db50c8e2d480242361d4831eb46fe21636c", - "8f27dad8d90be2a415bebddca593913a44287dc5babb2e8472580be01dbb9915", - "c531c8518bad44c32cd7cb5454095cdc2abb0b53f57aeba99f61b1e2f82459c8", - "e3a9288d615840ad714eca6d52367837b72ea3187985f09f6f84ef02c88f9e7c", - "91a183a658128f3c665481bd34cb8eec454fe0dcff6f26439dc73d388679dd25", - "16a761399be41ac1ca0b55f8e757975a4916b5e146778918dc97aeb09283ff92", - "52a5f3d3ea6f06197bcb0d23461c9bbbfeb86ce6f0cdbb0907a9bd0c19b620f3", - "d6eeaa6177213f58a3e9aff464c531fbb9cb3e3c24be9c5139fd46271f7f041d", - "88dd025d5b6f09f01b0d3a181c386d5a718bb2b1040368f7fcace4fb9e3b3d3f", - "cc200b52c8c241ced0eaaa8f54aa470cd8cc3ff9b6aa72242673d0902e449f0f", - "541a7749e678663e23278bf2a731ec0cbf5ef288ad3ab92553ba0fdf7c3b6a03", - "f5b3e7f5161bc376bf92b109395d1469d3d178eff11f70008e766fc398ceeb0f", - "d0816075f3741133a40f43c4ee48d5072f2366d45f49f75fd7475eb6f5064ea7", - "3bc7745de3999e7a4b73c3b55f3f68ec86b83b54e5d6d1715348bbfe2322fcd7", - "c2f2625009b9c9c9a7f74184aa567c2adebbba884f06190f7bdcc2a023ada99e", - "3b679db9aba4e43f18e3217d2d08d3bdca33ac61d0825bc81f971c635d7c41e2", - "a494cec0fefa9e073cb8571feb87c91bb08bc1f977948f5405b49dfd7a634811", - "63e93e51edd0498c30ebf9b24cbdb07ada8b91696bf9826f25b4e78850700ea1", - "f7e31a54e2c8e369868226b77ea8616bb9c55f153851f4f909e337f54f356c0f", - "d15c20053348968b39c35d5fbd9842bb306625880e64d07df72816eff6cfd32e", - "857bf3a8b49a3fc44908c7aecccb5b216e8fb6ffad327c88fe1e73b02a497a19", - "fc5f2cd35dcafa09aa43ed9a55ab01e0cb771613137b80166e6dae96e7b09357", - "77e55fa880fa5b7643c951cbec193bb43644a23d8fcfb05049c641c39672b702", - "25ec5399e180065f1624dfedada74a574fe3ecac035a187661786b375ca1ecd0", - "9c0e2a3d4397cdd8bb0689d2375280a710aa5716b0c225b44795feca7c43d5a3", - "1be051521c8ef5a45dc2592274c0ec3c49a9740f4b62d5acba5026d2f70034b5", - "db0920a072e8d787c8dfa6e51d368c8f0f5658ff52aa786464004b7b57a87534", - "74999198afb2fcb5ce56dae22aca74197c5ab5a14658f6e61543efd391695ff5", - "12724ae866a7d7debb8eaeae096c9fac66c150d19d697a16700f2b52fdb0044b", - "2365b794537859b5ea88fc1f7bc5ac697d0201c2b017250e116c3b3f43f5510d", - "5a1ed0249ec3f182c19c3064f3c88926a91179cee268afdd44e36431a288a38a", - "50c0fe9a31267ca3c145d1e0b314158b856bd4e6343bd749976178d3b396b782", - "29bffe1821a1c964fe79b8c04d6f19c07b6986d612f7b2e001f02446ba1c7bbd", - "5bcd59699c42719255489c535caa2c2f7cd7b8bdcc5d17f203bd8b1800a60fee", - "1672bc9ef16ecb41e347194f7520b1da7e419cf10324759a977d442ce051f278", - "faf6c850f37d26cc8e0ea0f49b8295eb638fe72a9e5fcda0b2d9ef1435787bde", - "b98dcd9de2a92fe094c6976948c52a44f5a60b5b973cb39d8d03de8f256776f8", - "830733e98feb7e4009cf5022721d557e71fce32e574f13c5ac9619945cf81b61", - "36c5d50dfc3c162750a410d93ed30d34a744f397375482b3bb15722f9816cdf9", - "e683b8552028cf4f4ad3ea13e510cb6d483df6efe2f79cf298abddd08ca61c60", - "4a24953b1f49ec29e248363d31c62255fd858478917653ceb1445717c8a893b4", - "a444b72d67a58b0c18f5e4e98a01596fd0f2e9c796d5504a06fe161f763b039b", - "2eaaf949c3f071c439ad247b8d44da1036525dfa6d6e4e5d8df9ec74eb70acdd", - "068027be54f3813d60728e45277b9219b9f1b018ba921461cc6fb1927bd38f97", - "c0be19c6ec410e4104c1c0c0f53df8e1c5557759f577ecfc7c3989886d48bece", - "fe8fc9c18b9001a0678417e70a454c589908f89823483774f8c6b1fdf34f5adc", - "95d3614f40e048f9edbf79742523348ac9715173902f6f936aa588c0ebfa8e5b", - "abbac0e99fab1989401b1bf1e7d6f4bc9a67cd08f549c8261132c20d17ae6e1e", - "5137933e5a64047b9368cebf3ec297962efa99b373f1bc536e6879251f89b203", - "112225831029fa2b154609c48820ba5adab93889a451a49b89aa95ece9c1605a", - "571954cbb776c08e19a3d25a9d07b84db7ebf500d827e2a8273ddcdd18d27c63", - "7a4aa84fbcf3b15a0dcaa35aa1ac77e909c8992616a40b0a520220df1fc8cca6", - "5fac778932c4dea08d70362e344dea590caed93a787d4979d73b5ff50db70d8a", - "1e1b310a590a5bb2d08a7aa3aa786afe6b5946f0f5478b1b74f11299a831bade", - "edf4480a0ccd9cc89f778ba21de96b20fd5b3584d913b339756113425f1d0e42", - "1bb1b2abb79861f7cdc4907dc395ce13604e3fe62addddecde1ee05cf6a4e9ee", - "e17006cb41de0c79e8a626b0430c17345468a0bd9d4852a5f0d07b651cf55787", - "1e6b51a416b67d1d7ea22f51ddd530ae07028e1388c87e188bb2dffe2203b995", - "4afd04adb9f99ab91339bf213c4a3373842e4e492175f2f087caa46b1d92dcb7", - "44e171e9d06723a7e926635f630cc85decb65e6c169870b1a250a9f70b8e634b", - "9a9e89ffc95f90118982b49f745ea8abdac768c5b344e4aaf23a4438f403acd1", - "e68482b356900d9b20ee702994b7fa0c6375cff57e80250136b0f59736069996", - "148294545825efb8585c9eff268c789a884adee635255e1ba0bba14777b2f4da", - "486373c768c6a7cd7f89ba653d03deeba11be074289bde157f8d104fb035e4aa", - "4e8d8bd6fb07428ff6556ec39f3ced4454af381aa6c2ccd59c31e30ea087db05", - "f002dc9541c58a55cbcde66552203bdd8dab7d2771314eed6f4d6bb516cb8c23", - "9bb12887ac7e2d49cfff1d266f359a285c66a12e54e7955cd51bde871a910626", - "2d0840dc1a05cb3c1343d5561cb53bb5dd8cab8e1695f84b5f80158c29c3df31", - "6e04f1e8c5d5bbc31d74ed0ea58fa06100a381aebe530c3b07dc5e24bc19714c", - "27f1303e754e53d07022bfdcbfb97fee873841ea33a4c9ec5d98b05b4812ed07", - "464e637f677dff977a5c8478c5d63c7a320e858cad58a7e0418e45e07237b75d", - "591d691096595b33612621720b9241ea9e8ea10d44b9d2a5a2ca885168837fe7", - "ed918e002165bf2097b77a3190aa3069e5d09ad941373861720e572754282cd9", - "1384b71411456e5bf6c4c687d15b9cd767f192f071334c0ab3f7fc0066b98a19", - "4f5b4a807ad257c846c751e61062a7ead22c9878e7cf929c8cd21665055274be", - "5643d295a5d3b156928b4caeb638cb536c299284a17173c4d4151039a3e4e68f", - "f7231da250772adf5563aa01359f54c0435bc5c41c4f368b4f0dd517df0fbe94", - "083f622cceb438cb434475abace1c118f6398f318d8513767774a443e2e8bd72", - "fd5add2f9fa1ae12babc011e40fbbed8aeae1a571b81d09306f393533597f80d", - "455355e3db2d25cae4e120834a05e9e07b0b656a4e041b5257e79756a2c788d9", - "f01ec0faaa96ff790360653e836b8fb30f591ad8661cf58f8c48bd79e6fcfcf0", - "1769f3c171ba1a76cd0119c9ca564e53d97560dba3667fe8467e55a52a2a6082", - "a004c45322fe6d9cb54091685e23b8e8a30c288611617f1b409cd9a03d5e28dd", - "6e365f11c604d439997d378460d1e4200a84e5a18a3bcff26c8e469fdb9dd268", - "7ebbf7894d0cd1a9b0fc520e2b0276ff276124ac058646febff84152dfa51a2d", - "d9a2d2f1a872de382612d5540e3b49e02aeaa5fa5634da95cb3b9a63047ea6e2", - "5e6416d302b55ea5af75e1e1b2e28927ebdaebb99e249b69f2746d1af89c52ea", - "107b3497be77eee2cdde65833c07ccfe7a618930550a0d383fe94d99d3f4da17", - "54686bb48aee1ca01d2e42c8af628ffd1042189d1014dd657ec49547072d9b49", - "e3b163a3bc3ffcf292c01a370946aaa124543e47243daab17bd98ecf053eae24", - "204167739cfd6f69d854e603428d88804015adfa548341aa0c6714b3cbc8af19", - "3586582b60d1fbd0403bc062d33db9d7eebdb6d192934e74cd9ff5009caffaea", - "5955f78bc42858206c47391fbfb6ee16f4f5d9a90cbb500de022b5e7c39801fa", - "ee396a86beaade9d6057b72a92b7bf5b40be4997745b437857469557b562a7c3", - "f8d342b2e2a793f304fec78f7f771b7e4eea5998c1dab96e123e50e8827d51fd", - "c035eab647a24d6765e9783e8b2a3049b72f7b4949e6945f7440dac44286690e", - "3c012d959e6c2d0456243174b850d80c0fb5d3ea8cc43f304038a3c28453be48", - "dea53f43f776940565bd86f08ce0204c27c90d5571e05b77576ded0e23ccd120", - "4ae7faaa56a343f62c340307d50311346c545b8bcb60e2413a721e52d7b6afff", - "26bd10f951c1d272ce13907e3a2e979d8216e898f30b0090e169d5f51bdd0b2e", - "526f8d7f7a309ed992ed0a69505676b8db6cd098855d9b3918013bff887c310b", - "f7b80e79bdc686fc5a4d0974b0ed17fc61eec6ac006f92e4faab34455deb2b31", - "b5aba1539e18095d0b1e78567df412686911f4292445adfdfd51c7c0a3a0c279", - "11816373e6ddea656d8e43794b3cfbce4ae9e7b93a2e0f558918448b6285d8e1", - "408f3dc1161e78a0653bdbeb3ad8fc9d7fada75e036bb2786da4f930d9b42435", - "d728b0f57d5db158160f8b14dd9acd849dff9da1ac1c38b504f080a99197b630", - "3a93fd4ba282a0c911d810ca61c96765f4071dacd069029cb3dfef2737031830", - "b0a127c6f46e043de9f706601130fc91f103646743ff82b7359e5820e60b49e0", - "1aa36e821785257b7268cde2070ed95ca08faf8bd18de1b4218bcc6e5c31ffb6", - "510d8105a431a865cca00c7ec231dbe453275d316864f57be0ec848b00719b80", - "58cb425fb7c9bb108cd3c0d5a8fa4949cd66068fad0ad4383c50ad98e4e6f1e6", - "24cd8d604ffe7817fef8e66b3e15bf0d96402fbf4edf9ce86f4fcbb3e17f713b", - "dcdb04135d33b8fc5446e6c3879f4fb102b7891e965d98a56d7687d312ac1144", - "c9b2d4f55340c8d52f6e794d6aa73144fa9a6f5d3889ea521f49b7e9deb3869c", - "8b12a4102ab60b531f6a1878e825557c2ae1f699ac20bce75d8f9fd4732e42a6", - "c478b2eb54dd23d97b93dca9048f365cbbd32d0ad8643199507b7002ba1d402d", - "99f9b7246c0ac3e77e0399e52a350ecf05bbff88805dbecd44026726e91e2d38", - "3dedfd7cc5213e5ff3f9e74ae4fe44a2ec377696a5612ac5114ad4b1c45822a8", - "5776a11db99f335603dede0a17ccf4207831bf527c0557f3423241f5f096dc6b", - "1f84f95c2f1ea50b1450e3ec5b9df7551294c86306cd1d8e21a17613cc2a7664", - "3e970e4a91c9836f0bd34b33d3a34119f250648d9e73c6845eb9156629d4bdab", - "bfb110dc58a5bd837ac0eb7943c10697e243dd439a1eaddf5f0aa2c90fbea374", - "12b8718edadf2e2dbc1fe680377f5dc66e4cdf54f0dcd07a7bc55b1f809bbec7", - "bb849a382e17e6add61c0f85957809ee60858b55e8e3e3f789239b60ba52cb9f", - "f68a262b5f873eb0a72b935a25442c97b5f23b8520ca6a7c1042c7d04b30d7f5", - "de1acd5376d810442f934da29002d7aa0857276a8e8077ae8cd9a314e28d8497", - "cc464375e1e931129215f13282e792d0a446836fb0e1ddc0d95cb97891c11585", - "c6c002f4948d1b5291e1535adc2e0b4862a8548b07a6d32d350aeef5b41d4257", - "51a451f051be8d0e9d7461163205fde73aa79b78dbd2c025a772ae47a298d8d1", - "71e81febd59af886c5873f64c548e8f0fa4e4e089888689da2c473f65beb45a8", - "bcc4b12bc487e2bcb77654af533f2fe3704e97a35b5b47ec791b848645ad4ea6", - "90e3eb8de67d4fc1c69f5a69bba65c8093b74e94d5377cda1097d1e518192e05", - "9dc1e8f9dd0b14ac53ec9adc6ec7b64fcf65e4fff4fd72990ab27b7446bbc98b", - "a2eae337f640f058556ba4a80d09e860313bd559ee708331f4741c315b7b654f", - "24846c33eeef7f5d2f1b8677045e06e6ce01c57f4ce415eb18862b5b8b00c3bf", - "0fbfc7eb67c8f272e3b8c2b9d61f284b17ab260190aae0299f86d0ca40187923", - "3d7a3e4b453837096e408920de65137d1560f74928819b957788e376c1fa9c04", - "c02920ce2694797ac6136df498cf5a73dd195518f722d8784caa462f19dc6112", - "6cf5870763b0879dc265bf2b4bbad64b7ea901acf41eb649306698bfe16bab10", - "f6850785ed897b56e9f8449c4a79337d1b16439f99f6fd4a3630c0c69b6d9acd", - "46be5d89d38a3bf315c7e528f6e07c3763bac04e6f15bd6cc4e1f2430b4c373c", - "e71925062940226f8f8606630a996bf20b176c5485963e2b94607e5d685142d9", - "e7f1a1fc824c693414dbc15d116447a7eb99dcbc67796a676e239f592159c31c", - "206a4dee1162ef5b1462e5a45a892e7ab1e90878f254161da0d9f4b67f3c02b3", - "7a561fb9b947ea54e308588f5d99fc329549691341cddf9468c5b89963b50173", - "d7c7cd256b9c7809d76d754665a7e74d370fa572909d948bcfd2b3f9d6b5f043", - "2af6bb3fc1b7fb9131d881dab019f3c8841c0f9d9a524c172110009d505964c9", - "cb4d30e2b2af343a2b5ef4e7b9291a70aed375062222c91e841979968f5b655e", - "85ddfec4b2791c40c60ad28fe44261bc180bffcf77df5168c28432c44e364f45", - "3541222c8eb1856ec2beee9e7e72b6c7fd7f76ed4fe006f94f18fe0654b84fbf", - "8a1d717c6977bc95a8d5f73ea157990df538c13fdc3280649844b5b4c23b2566", - "798b1ccde04354288155d79dfb71059ec7e372f8ed652051f75d568bfa81542a", - "0942ee3e2320a1167a9e5e1c0f2bf76cd2a867f2c2640d476c3c56d10873bfe6", - "807c2089f0f7b02aceb78f398d9f1d6608334faba15f5450e7c9dfb95f058a5c", - "070d23f326a36ff76e3c6b81777b92a5fb0b3a2a948c50ebb534efc87ec62847", - "fbb36c4fc3fe34540616591cc91003a2bba55c1efe6803475eb63807ac2d51ab", - "445103ded73a9515b9ad7272f6d19a7ac44883628f593b2dfbc5115a3ef48a25", - "e7939882a3b62af8c529106829be5737a6ee38ddcf798a5853f9d4e6625dcf7a", - "f52469e209041e092dfb0eefe4c7bcc5c599ec1aa478ecbe8c6178ab161f6cf9", - "5934d871b921ac4f591734c8a8b16fa01044dda809679e4714e2fd45192132bc", - "5ffb6e8d83f44e3da609748f7232d616c6139f784a7c3ffd103da85a97dd7925", - "d50bc2c19235db7ba93a277b8187310d0c9a2f7a7b3bdefbd32f8a95982a8360", - "ca2bd5a251feda8b450f529e7f9e038e890b414220dc32d87e002bdd939597a5", - "cd08eccd6d16a6767d9ff742beb5c32d026926bae93cf1206fe8951850df1e43", - "5dabc37ae0c8b674bf509fe25585e60b86b9ef2fd3b3a29c321600173da1aeac", - "fef27d6b747fd8a77a6d51377a05c8d6810f17d3621a170f94b3f37923e9485d", - "9d73c504534d0f5c5e35f769fc8ebd3644519cfbf24ec61d8b98d79b1324d2fa", - "57b7ac78bd278ef18398b37d1a398f1bebdd2954f9640b0248c957a91dd0513b", - "bbc6a7d213bee221d3fb2f58358efb2aa0fdbfde870b9acf958235fe9090b804", - "b02ce674438247e6b44b33256712febbac427185bfbad2b4f185b775c49dcf3e", - "35841b39831ef184de70d113e5c1cdafd83da64e63d39ca6178ff2bc69e580c5", - "b28a3c51ac5e19e8c874bad6ccd7d9b928744792a0ece0053293c1e98a63b895", - "819d073d75165bc73843193051a2f7dabb7f7d2caf120160d805af5c1ec2b0bb", - "9f81f48ddae704cedee3b9e17aa2f39da17cd6b545dce7ace8d1f364ce6eb204", - "77e2dcd24c15ce39211a943d65d6c6dd0e36d5ea9d096d212fa1d62303bbf1d6", - "fa950c10b6bb9d166baeafecc03d44354b07d3b4e852ccbdd57211ad3a3c336f", - "1e465b14e41ae27fdb6a3b245ecdc7a7bb1c473dc28b35f91c2c03e2228bbedc", - "234cb134ffe4374c0e188577e5937107999da51fb64f25748122ecfeb6682199", - "3fa5fcfaa6af074a8879a5695eabc34b8c67f1a76cf28fe8d6c5fd8df5a33e67", - "d8ad1000601b186821684df7cb6d3e38afd3c137ca6fad2f39e152d5badb5b68", - "dbbc28f84333dcea3cc82429779f7a40cb955c730b694f666cfe89335878f85e", - "e8c9f0e053c8a32524550106a7754b15a06e9d96dd6f6ac6f78f598090c2ccda", - "0a4ff2063cd1b1fd087a8a70588d18c4742885dadb326869b8a18c34fd31a084", - "a75b04fa7e8d99e1f9874762ad667d203e2615e13d0406c589bf73bd2ce1aa0a", - "ab26948ad6d75f02a615f80e2597d88a8647346a26235857813b7595523237e9", - "9b9fdde16d375eae2f291c96af34c809b7dc8bbaafae00b8cb985deccb221792", - "c1a3c3fa2a06eaf71ea78cef1028357b4e01a62497dd332ee54d22966173fa97", - "81fa6ba4ba1910fc43afd10c1a2b22bf271827ad7c09148b6f3a1c5a01389163", - "027c4761048c2e3e590c0245dbb10b16c1fdda4a52822f1eb53ef13e0aae40cd", - "7c824e694cbc03d89a28c2c850ffca06e0cb080634643f7aba9815f72043f636", - "63db940fa346d46b4a174a916ecea754233e2ed7462990593f4fa448d0a94b9b", - "ad35693b400c23576d55809da35f3a5a48c8b732f2859dd09c8622f69037f689", - "411baa573282664b251231a02e54c59e2f8ea64a2c623dd69f99e8ad2222cc2c", - "01e81cf0a90933653c6090c9db2b4f812a8148d191260f335ff3a91e4fbeadab", - "fc515720557265d770532c793e7b0f23b6be5f229fdf9c901bdd650590f6d6e8", - "42be46adbec8fdb4801d19d45139c8c08d6b25b6c3755f5809c44f1780c2cfe1", - "65e3f398623563465f8ed2cbc150fc9509d8429679fe9a94e26d851ab792f9e5", - "fa52f0b3dad03207b0768b753178c9e6d1c430be8da9406446ba98e5878b5f14", - "8198f0a146cd11f0720a7cc3ac11515cad225a920466d5f54ba436d6141f7c91", - "8f3ee383da0bd81c2578ec43aa3214283b45483df06f49dfd6a8efa1dc26e812", - "e7578b180b01a2c9665e9185e7b7996027e69b7cccc55f3d9d3f2fd599e6a9b3", - "397cf2b5512bd3adb8bc92f22a53cd705066b4027395087a4b87b490f1b9cb48", - "fe35c347b6c55d30ae200d3a62031a32bdc45e40347fc7f67b6c398d8375d334", - "e663b1cdd4b083af42f531f83443bc2c0f0235626f4f67566ad8f6e1d1aa6acf", - "964daf56740492bdd1d7a56b407f01a77fedc21debf04c6b685453a72003b686", - "9e90cf83d6f01fc29736f41566b066d51cb1102dcb2fefbd0db083bf49d8f684", - "cefaf2caca40722a9118dc5919419dfd0bb0d9f22f7b7dbec57be4f95c70c6ae", - "665cba1f6255a08a78d182b932ddd9c64f838cc3478ee2033a9c20646ed228c5", - "a9cfd9a37ecd36daeec3235e660b40788aeef45547730b4f9de938c761744c89", - "a43777ab29e1465fcbdf5f0ea9626cff8f27a43ea6ae95231810a49db2c17327", - "94500008a8969e3d42b89c37fe7615451556d211353feb590c5d09955a62f978", - "8cbe9be34c2869d34baabaebaba98751c917773da796fea324fb4cb6e41252e4", - "1390e01d3eb2c9de0a8d6e43d67fe33a4f2cdc26015e831ab38c42a03556f4c0", - "cc4e10a68fb62d5091fdf3b0d8b08b670d9893eb763eb6e81e7f02170adfb37a", - "624d168c69f97a3aeaf3b0ff681d0fdbd6e17a3775eee13306f91f03f82c3e92", - "39836222227f8fac2e4b9e37420fc204da968eddd17b4780946663725a3a8209", - "8d8dacdcfe732234c21e068c45a426fc5afd07c2eeda74aa4be977ab66b205d8", - "90075ba59d0f3c8e04c18013e7c68c4066413b28c4b79fcf1fdac3cbf1c23f35", - "90d1a2a266a9da85b54390bd95fbb5c0fbc45151785cb3cd7bbc892acb0f6e21", - "b8721596166464f7c5c1c46cefaab1f659cb235e0e459f4cba68335107866669", - "8591c30ce3a9670ed4807104b1254ab309613e6be8c87e68835e823383e9c34c", - "bd4e75b735e799eaa4cbc89fb4cf619a0b028e069686d947e63f133ae31a29a3", - "4fec4b444504b1c7cd4a4895065e32afb9b4e0fa0ae8dedbcf493d153d1698b3", - "c7b90245eaa75cbc5446f33961a8e46293934c796e8b06ccd9cc2c8bcfe54cec", - "e54751b227343ffb6c19a57866a4ecfabb3c91d04211e5f9870aee3b41bdc92e", - "ccf4116fe92abda3cbec5f90d8b5900c26ffd053b4918595108b4f5651a61380", - "be72f545f491d5d527fae1b14344ba81c2cb9075abae3ff1e2ced6275965e0b7", - "b0d1bf66c6222cf9a667465746b5bd24e902e2a4ab2fd4e8e1863b2c4fa81df0", - "513063b82e774ea2f76bd40b5246b8c59d43524e05d454eb2662e0a854cfb4ff", - "48b3c80407d04492b43546605c8b2d5d52abfe80bc37bafac849ebf3841c88d1", - "00b3d5cd7ef347fbb9e8189b69f9facc8344dde0b244e5de78cccb566a3031e8", - "e43a512499d1a6c0a58986c1856fc588c3de5337cb799568c5c41953ec2d81bc", - "0fa6865ade307c351d294cf2556e214e8120cd89f945f980acfd0007d9e700bb", - "7e3113e8e3b47ddfaadd1e2d29b7df322e64fce94517f19fbfa166ab7f299d30", - "272a8950520c06614cfaf0d15f2e61860a81fe3071f285f9986bc2761a5987ae", - "e69475e48ac169ed992cf318ab5e36b11d60bf70feaef1e011e8e55a6bada511", - "a2c355fb490d4f5d67b594b57ffb78f141ab21e1a3f5a50e5b031cb589bb371e", - "879544a28ae7d2cfa4fd4066436bfebeb61331c6afb885d54f7c96e900e885e4", - "c249f33bc73f1132c8c1fbfeac8d24e09a4f4748d59f5eeff1cfe114eaa0f690", - "8421794049312f5a178b5bb107b61728af374c1fb86e3e4d66b79b1863058a12", - "c4fa981ac838541e4dbe010744bb5196d1f735a370e044ecc90b54c261b04e22", - "d9368270c5fbaa23b6c23e66354e10486344e5ebcd4cb4211af9fd4c109c9365", - "08d8ae00516bbb51de49f99d636cafafdd5e30eca4b7400092ee58ec5dae6b2e", - "c5526606d2a7003353dbe6264f25b0b2cda6e1adea41cda28cc78d482de973a9", - "2d838eab86803c87f089660ee6e401ff169ed5456ebfab690591708299000aae", - "710ab0578764ccc512d96cea7c17158eef62038870bbf48895f924094096a933", - "c7991d0e2c24158704a989aabaeb38e42eeadcb1b0b5efb980a728637de5f530", - "5b0ddd791bf5483fa76b5ca3ae3906dddad5fb7c2e69fa761469bfc4fce2457d", - "22399c004c17e55d081ff2b528094dcb2d874fe22e1ccb934601edfdb1eb26bf", - "235efa6a0cf9e315914bf085010ba9e917b065a36d3846ee4d357bcbaf5ee798", - "f082f9b931e82bd8d735892d30e014dc8db75018272e97cdbaa2b1b7f6fd0480", - "20cd53c85a8eae180a1db79e91df46ad4b3354d5e96b8daf22b48465cb4bdf09", - "4f249bdee18c8f9a8fc95fcdde8d5071800a2e78cf331882d53b0bbd4fce8dc8", - "0cb91d6b457bd3a290b8b9f5f51cef0cd17f09a358e5e7ea9bfdf8638fd07dfd", - "f9fdbe57da03ebe1b1e575ceaefea5c44e4a3ec8f095fe177fcaf1bc6b176643", - "9dcc7b80b63a681731f634c67d2ad7f2a925fdade9590bc296370e7716e97410", - "b500cebf9f897b87ffc7b3b5083ae8491f39f858ddbcd500b044839925525405", - "89ccdd8094bd45b719279a5cd196820de7c492eb9e90bc379261d1f563b4ce51", - "6153850e614c1ed44373335ba725552be541fcc49d4abee5dccec9d7752718a0", - "b9a507f18debe917d151915cb2ccddf9baa66313b368ee0dd11791f6c01534b0", - "cb57cded162439f047b1a81f6276633bcca23e521e9ecf3cbed618eedabe6166", - "89881a8e26f53ac17b79be415e251d966233a3be42f18dab9ac78bdafd26b594", - "6e05284440d7252cf1370f1f5176152df2e1b7e5fa040e521ec04cb5363f0783", - "0d221fa560df58c677dd2aea6ac72683a872cd3213dddf51f6ddf053ec06ac3e", - "fc63ed55007c7e47b6b8acfda434159a6fdcaa7bfa27e73c473328ab24a0650a", - "71257ca03cb31be178cb1837bf81a62df3b779f6980299aafea2f5a1f3be1ac7", - "0509cc90d9af6eb7a8fbbb7e872b7dabff05b187c64f28e5e4b55a9769acde69", - "4fd50fbaaaddad275f1dc94135d83a5b3b9f812d81ccc4508c83106574e6f469", - "9ef519627da5a722351e2a5cc2e16344d4ef455959eede473367e152e19147d5", - "5d57b40167ba6ba3f670a154c83c03c76cc833e48977423e96ad9209eb0d64e4", - "239b18bfb41530b44a080249908dd4e18ca09b845ade444de95ddd90dfdfd27e", - "2ff77649da7d50e79bb8390fa008e78cb781dbe171d16c1b688e657ecd7259a6", - "1fd84c8a7be049f0c24a6f523846b65f9bad8856552216e25c7fc54d58d974e7", - "fbb51186eae8e5eb488f7eaf7707f0eaa9bf7eb0e12f068328ac48f4f1d409c9", - "857a83d792d645477bc3073de8f296bdb0557c1e714b7944208e5774cbd1ec6f", - "e167a6523f88d00589f0b261478dd7dee5eb76aee538451bd5181894f0b884cb", - "a3e05ed168fd27ae32c43f5a6c68e567ba88303934bc8738844392e01e7b873f", - "ca501d8327d0d0eef4575d5308640c4a553394de25037cff6ba9b5ad0589324d", - "aaa1dbcf74e6fe82c8e2d508063cddf4688ffef5aed78c363fd37a494708da99", - "0b0694f47dca4b796319d10ef58bbbfac6c89693e5ab9f971258046f6393c8da", - "c6bc94230ef687cade213875789097b0a4b7ed01c9f9343696d5d1739a20d5eb", - "c047f7f8c0a838c9745dbc352e5e09b733571f4fc16ac516df50c26a6855f3d6", - "9bc031543b8a021729bb548efa45cbdfbb008bc0db57ab4cb26e31fa0c470680", - "40536c24e6ba8d6f1b43142f6c6d9a0a7300ec47c85650d694a85b7183b59f59", - "e5fa34197d5fae83e60d6eb446e9ccb4762141cfd634f8d337e9647508040c03", - "64a0158862923c027275044311bc9fb5f861d43257d4760b34936b523023d9d2", - "379ff0a174b8d857ca264bc0d489f6876ee90f4906e99c143da7f463a87f9a11", - "188f7357882b24a41ad0b7bd051c8c6fad764c25a87cf73b1d6771d57d48ca74", - "98a56ad99ae5054b6d5bc61071b35751f56e67e24ff94dc19a668a71b8e4aa8a", - "42deafcd8fc056512d0f7c335b109c9dc606e4a131496f04cdff013a31806a7e", - "ecd5f14c00bed3c12436b1e2e3cf95acfa99882e08a6e51fb8f0e660dfb7e50c", - "2dd54d009459f2512cabf2ab7a80173f8e8b44655b85988d9e48c07427459b5d", - "bfc736b69a234622ad5f28028a2925a1aba5263b73539dda0c81bb9b644bb9fe", - "4ef7bbd043de5de04bc0045dc9425b51c98b5d5ad9f58ea8e4afdc91d31979b0", - "c04680923dc10f784228b7f39f00a7937f974d2a677f2726bef73a2db16b1b28", - "f5bd1fa7a367c19077cc5d5aaee6882a04214767ae6e3e8e687d9f07e05334b0", - "508e3761476caa2a99237230e36f8d604f0152f1cdabeae7ddbc3f5bbf838691", - "f34664ac5ceb0aaec1bb90cbe7c76bce01d9775fcbc0d0a40cca4982c6a44c1d", - "9591106f4df2297a5d0c08fb70061cc8ce29a680ca7075c7507e512487333845", - "652204fb08da8a621a8847ccd6d2c9323d3a4fc3578f728aa3b6a7b97d2d1c52", - "30ab9018ace4e5914a6f661bfec83dc45ad559b92f5ddfc356241301ef9696ce", - "6265ef80f98e97588ef48b2bf70c290cf529f7550c19e6a82f56987ae619dfe7", - "de1c2f237fae9fee23e1fb316dbe1f3199470141b41769f0395322f2886626c5", - "62e3da6bb42926d1e548196ecc9336f2a09d3727de6d6c61354119e8e20c3da5", - "9ba284abcd816b90f9d6f97b7bcf2d0b867a07d30dde16b84e04f6b7ed0673f9", - "4088b389fe192730be7d8235f21b71c0b1b1c01aae5d7a64dea6e9e31094bc2a", - "461bb00ccc7adbbb7b6b0ca019542c7ca575a843ffe19977b271ba6940261ff7", - "4c31bacf1ad2ecd85810a90ad25ec208526d408ca46e919112f8bbc859590635", - "64b7ac9c32ea6b52b116d673ce84172444d8f00447b739642aee58f414d4d96e", - "7f33b0e0c954795ae9e32302fc05170c1b72c6e93e2f042901087cd4bee15dcc", - "969e4ee1880e935d5ee6c722fb71c9a9b34e96962543509795e2d1fe852d776f", - "59842b799359fc3cdc38231dac87945dc98d85631587655a67082dd24a6ce779", - "ed7e34965b659412ed9012fe14e951b351cd5698b7f7ac8aa7ac18d83b07b844", - "f1e3233e93d2542a90aa6c5d27211a1bc57f5725d4da9041ea8ddd55eccce947", - "4063255196f5b60ed0edbec1f4c284e2bcd9107fb89c54f616e487b29a40e0df", - "915d7d7fdecc9c594699c4c7222cde310e03041b7e4a08b29ffd448dec1acaca", - "7e7caaccb382f02c1904008903de527332c361bf85f5dcb7aae6b3cc0f40fec5", - "a7ea394445bc9cf9d23d4cdcabacf5d7bbc9ec4bd30122019e32cbb9a94920e3", - "d59a5cebb8d94b7a84f013dd6690550e92adc31d6e152a9b20af3e2f9a75078b", - "382d52396c7c126c3606c9a05d232a31a63492077bc3d0d69101262580221ca8", - "8c6213d3cc4fb6251bacb88e183858c46691dc6ca4767dc938a76863923aa6f4", - "bf86aaad72266aa7db738618b1ee58ca51c6015b7a84b1fd917b64162af9166b", - "98f97c3f66a03a77df932210784726614dd3d75de3f6b0bb80535b27ebeb2c8e", - "9219a9838cf586e2b8478e8f66c48c794803774e289bcac3e7b0d720f8331bd4", - "ba3ffe343ddca33302484738a3fc6a58bf6699e61e134f0ffaa9633f0b156027", - "94323d3cc36089b240ec0300f4a9f3700e0bb5d348432ae5ada9a8f578dab1ac", - "a11a816426dc2fb9081d3f1a611e94ec9dd12447abbfba9a5011d457532f5285", - "87253fe3984f2ab9d3cb89d22dbd67af9c279eaf13d5ae12df0546fa8ac9f4f8", - "9bcf1d4dadd0e6ab97d1fbf968b9d0e38f8a1f64a5d442afdb1a8e22a3a57243", - "4c815e2a5a193b1a2e0ae2d87844a3d6d23a70312ea84ba4516486efd4a7b130", - "0ae9470b3fcde6ec70c348020b5595dd1cc7a204d86695a0fb0b5adbc7869f6d", - "641af9ac7d16aaebd50d40db6e2b17b20e2b0a4f2ab57c8d3d66dff981f2a15b", - "1b6496779a370d4e0ab1c9bb4427fd246afa9e062c80e808729a80efa154fd76", - "8564bac27717c6fd8e3968371552228fda850851edb0faf54bb4c4128536c06e", - "ad5484e17227124e0c90381e4220fb035ad1ec355e9bb003d075a217100d5502", - "5fe4614d378a8adee101b9722e501f6311e772e17f27c9bf1148aa3438251764", - "45f139237b870afc3cb14d10c1ec2d148d1b55382b5608dce6c164d2c3a05846", - "9d202ac89fdf9582520cfc2879573232fbd6e7849068f0d8638e4524d9fb1777", - "e0f5fdab3833edbcc221c1f3ac46e26656554a84632dd9b9f9cc484374f432fd", - "615d2a4259e2037bac716eb7d4071b2c35d310e695f3cd138ab0c1d263248bc0", - "d639b563a8380e3ca0d84ae3fec7d8c37d22f9d2166ebc3d40f9ef8a791f0ae1", - "6a16c8e61cf7d0f061044669032fb3b1e791828b672a671ed473e3f33b8a3cf8", - "1777137f4911e5793cbe830334f31b9d0edc9dad6884ac4139307ff8998d7660", - "e3ec477bac7a6bfca32e048c60f7981d51f573e0dfc7c1005575bdfcb556eaef", - "57fc3c1af3c360828187882ebee78ec4943eb6aadbad2f3390589dc3ccca1360", - "6ff0a690f072cc16d8e728180dfd6b8b1a3bcd389bf84c5aa0e5a944bc98717e", - "430552fc163521c64a0c31297d9d8c39cb0dd8052fab1c19ac8f2d6a9f5f4f9a", - "d84b7f329a470c88cb7470bdb079df5e15b47a15fcbd50420bc226545dc7ee85", - "6802d327a62ca110ef99f5271bddc50ded1f2684f1bdc1dfe4751963a37ca1d5", - "e33570ac1d42d47b3018f1e322f6b1f908c9180ef7514b2b48f1d6840cf76f4f", - "9dd76f878253474b0d3b8c6b4eef7897f80809a154f7101a5f0366b0657f5f03", - "35abd293fa38697525515277f986c78a4f544a69404f94a2f7c5f4236081cf70", - "b2382e9be9cee2878856be8ba395683be3054475e76d1ef276b3e4f2445c441d", - "4e1e369d6943f8c1cdfd49bd9f1ac859d381d5efb67a573082428554cd9fef55", - "d0e9e507703d06397544541f9236891c0696d091ac9fb3c3a23bf193d16d74ae", - "383369f2e1e78a36fcdadb64f1f8a591930a22efe9b3e790de9afe56065c243b", - "16553ae687a9f0b449eb503532ba52c04ed204f1e6dcb5d2ff3043955f44a82c", - "3d902604dbd9e19356283309a7729fad8a8a5bbdc03c6718d4c4b004b5f3df99", - "41571f5d5b21bf285adc9900d983b51d2b21d4f9f960aa69903f29ae63105045", - "0d21edb514d613799ef2f8ec104481b20efa22edda2e2c8f4ce2f1b1418152b3", - "71b4a7df489245b142fa70c84437bd04111e8565072d88d6141001c62e8aff22", - "b15489af29168179bc1ade1531ed2e0899b83150b42fb1a88420f2fbc560ecf7", - "44fb8d496c78232d7172fd96f499213d27392d9d785b974304aefa923aa6b476", - "027f236a70884e7f5fcf4db087f9545ddb1f75354e0f3df2c6a2b4b45d8acfa3", - "afe86f413ec7a56d3234547e64e7e772bfbde7176d30899d5490cb9df823d30d", - "57e2adb3068a638dc452e2180a07c39a4a05fca2d8411a65e183e67fecbef7bd", - "65035e6d34645fb83d189ee96acab6aaacc1f0ee0205a1c99f53e5a14b3d1116", - "f6c4612dbeffe73a1d6265e9f33414606fc9cc3dc878974da5d9d94e24ff9676", - "b751e7c211445334be7256207af1079ed2cda546ac49c40650cda54276ad3f15", - "788b4ed3649a10e5360256635d8cfb1492915636e645545392ec5a23621ca3c3", - "2f40ca35f3e4ee88b92c07faba9d4dec22dd5c44449ed7e8e099c5c7684c7233", - "068e87bf32b29b390cd82431997db40b255c8b1c6f78db7c7aff5fb609120d2b", - "7d148039fb25c6578a64b3d003276aa751572baa88ada1fcdf50f226e7f3cab7", - "f70a24a7e4d8a2c753e026027ccb27cbc7c43c56d30df2c3e4f4931c45bbb058", - "de20ee8a1893a424db7fe112700efbb9ea779df5f67e2936032b3b499de33781", - "08a5199c18c46824490cb5a31b83ff6df018be7b24b6621301ff4e1c7f92ad09", - "4b972180be63f61d1bb3ea2969ae9ac930ec756a0ea3616ea74f39594eb0b0af", - "31a223eaa3648c4a7266e2712649f9cb1a72d1bbfa1d00a7abb89e6ea69317da", - "e1186da86f0e597479f6b5b0fa33e690fb43ca3e63dee9c5f594f0528b24fc6a", - "1149bbdd0fe5e287629f9148a8467b9801b2d8c53bd1995fe364b9d02064d287", - "f66e9788805723bd6f32ca4acdf87938d30223410d6cd0343a0c5ea48f473622", - "828f39a5871bb24cfedf6fd0d55f728a76f74c6c436fa30e63077d45aba5bacf", - "3767ee058c622896e6cc512dc66a6e6ccaf2d8a45c66570a7f543a19f723001c", - "219a7c5d4170040014a4cbf3048f8b7d703ccbc31792e334b04721794957fa29", - "fcab92788309b4d36da7064d4928d26ca36a82ca678d24c502ade6cc168577e8", - "4be7d0e74555cfc8517e3060308886eebae3e642db1f29e212d8e9774b0394c1", - "b9afc053768cb76baf66f6266fa8df691b897bdd08ac639bdad445f8e5205229", - "41d70f85a671d4e32158a132011a3bf77b42de4385bdde6cc1c072f786ffda23", - "3ffc3966bf4b6627dc393d8faf1d478cee8bea1ac48b24017731d343a8d80170", - "7a7f06a071d006b4c8505ce7eebaad267ebe0ea5cc14b7c428c2bf91e88fa37d", - "bc560d7464a1a3557147b1c9106090f926e42daba3ec4c8ed393bf72997c99b1", - "3443d758c3c0ff4ba882dc2f16c6aa5adaa4b87a80f7779ef9184344deedc7f6", - "6bfa52c9b703a308a5d68ebac7eae24fdc1104f79247fa87ba21c0e8724f0918", - "7026e04847ce5b3a6bb1ba458c0564f72c31b2a0da748617ec1eb8d206cd06f3", - "77d53835a12144d2d1180fd1c076eaa538c657853bddbe77983aa5b2b2c26ef4", - "ba1bd2e977fe75174c4ce49c12c36c13ebcb1459502f07a681163314fcc8b17d", - "24951a074a494f0d52acf946f6e18d795b4f7ff063effe159ea6e2ab1be2cafc", - "3332316368f53571dceb59b43f851c2f786015ac36ed2e97722dd782f6afec1a", - "8f5e810ae0d77d9a85e0b7c0c9b8364b20fb8ea24753ab7ad39a648fc5dbbade", - "298fb26bbf9ce04db4e96aa5d18c96f7584764c9535fa6f30757542cd9fa7d54", - "b03d289a83e39b1687ea6bbe437432704406feeef456143d86c3647ed8cb1b63", - "090d35a4239bec36dd73b2435860682d37b5d1e214b5b2ab01135a45fe50d00d", - "752973e5abb2457e07aa47c7c6e8f3492bf0afeea59140ce550fde75c56b9275", - "a6d5a489f17ad8f4b615aae1cd7beeb25c4cadc2638eab7c4bf03677997ecdd4", - "6a09e09701cab1018859415a00af188d3e240f998f37b95d124b9ff9b40d100d", - "4af4ea1d5fac22654864a27d025c69e2093b43334bba34aa57f96ad0ea466659", - "4d394e69442dcdf2cb5b0efc8dc957992dd318f64cb4dfd64c54b77a93e59827", - "17cc780c006a92dde3d1adea53ffb5742016d901f639370cad6cfe8537bbbfcd", - "760b772ba1befc1bb5ac484ebe09a3b1a486a6cf2781e21ede4eea798382fc56", - "e6906ab47ee3e4e4a2360b260dfa5c59ebfff5535a97f7f45596220bab5e7512", - "3331fa849a2c4b93fcad3c5d0d03b66e7f6921a757adbd0741a8e8f25d180f65", - "1629c614c71bf22357f731823f015239694f2d20077a4c0639fdbfd7c3e0378d", - "0aa846323a777f6b43968688c094eff71ceb242ba6c5b6e3e5a24affa07ce184", - "e344e8fa11fb7632afd0c7717211e1e196616cbf20eeb844ba8d09e7eb23065b", - "6756c7682eedbc0fdddf4db5bec64149514a7daf263393fc4b9d28bde77d9b63", - "ebfa28ad204d8a0b2fd694708eae8ad705b3e7eca1ae18592fe9e9087eb2a3e5", - "75d188ddf91d1fe81a944367e128d58152636088914f54b9ba931f803b57c6a7", - "12f5985dacd108ac9dbaf4f65a6fd06247d7c23f3ae4b8b4b35b088fef6b96b4", - "c237db67770d3557f3176dcc4a40dcce73aa9a5d2301ada613f46510731ad9b6", - "c661165cb0adab33eb9fa268ab9e28e4dd699e97402a4b4342c0469492a26668", - "7bb0d6191ad0ebfbae5e4fe1d31c22c83475d99ffd743fcd03d114be63a450b4", - "72ee4267986cb9968b1a16bb4b58b076c7b58eac70bc6460f7941e86e7d9ba71", - "6a101d381bf78033dba4dc2956b7768fd9e9166e16b8cafcd71480a25bc8f65b", - "216dc41a986091c0775d53d1abc079b4cddd61484013a72ca1b31be75ab41f07", - "29836aedc6e5f7ce73a53b2be2d7675afcb0dacdb2ec9f944c8fadb746ff553b", - "2af66df1c1ef15897678c69316fb90fec19102ffce57f60ff5bbebb1961e8b91", - "07e396362d4efe3afb3a08dcc68f88da5fb4074badfcff7744bce0701d23cbe8", - "3d15cf7d980c3d340f7c176e73a862aad0e69910574a7466a470395d336e42d9", - "82586e2670296c6a7be17c598441099b5b19ee7f836d26c878c86f5cfbf72817", - "f79b04d53d45a25a501d514a2a8d23866f6e5f85ef8329a63cc3a0f1bd882793", - "d3a700c720d1e2eb89b5992eec2d83225d2cacd123d181ea126587be0c60b6d9", - "57f82d64a3b034920067bbc224b15d0438746ff5aebc1aef67f4437846a7a434", - "824c109a4f7ed6af9b8d5da9c2e75ad524228bdc6f665f8bc60a3c5f1b37e9ed", - "5be2a0e5afdf2e9db065db0e986cea648c9da54a5b3f64b690c7285e83bdeaab", - "b9d6257eb3b90fa0af703b9dab412d600136268a22319ff110878da56cb0274c", - "7f1a5ecd63ec1f59ea436cb3214131fa504c49856fa207d305fa586ae4f858f7", - "06e28599e30c759fda3b1e2f558923587231039a402d13388a5fc41eeb93d46c", - "ff66559271d7f992731d5dea24dc5882c19a773eb091f90712f79775e2bf52d1", - "922175710ebd1326f11e112b03480bced73a239fb10b2f2d073eeae4984e9868", - "c655d00528861e636dd5bf21e48f31aa3f0d6801204d35f103cc67c146e2470e", - "3c35d7e2e17928622fb275cf89c0b63016e782e1588b37f806106ef9db302270", - "bfcbc133c238aaaa5437d39e8de8ddd707faa3cece6895c5f9c1f6605330a636", - "ba988a9c0075d9a245c7b3b68d0ecbfee21862c4aa501c468772b3bd0095c93a", - "98a01794ec8381ad69cb26c2a3ca0cda670b844eb1c74a0b5e1d5ebd44ca8ad9", - "f844ce2103020ef699830080556c21dffc82535fe0d2f3197fd43be27e0b3f9c", - "cfbac4d84abf9040edac3f89767c450236b99523266524ee779046a127aec97c", - "57cc0600e3c687135c6b529166e137d973ff8f3ccd3c009ba8a0d9785aa7c352", - "64930dd72ec9962c352e8e593a4136c68ffbb600b2e8d665199683df2a0623d9", - "b7a6949d67c43031e81b21a53ebcffb731b6169e1f6fb5570132d5ed4f5e5cc0", - "90017edae8841442369b77784595fa69d08d0cca1f9f8734a456072ea4b6af84", - "f123f5dd1e9608492dbdd4fb4df23dc5ebda4eb4acc5d19d5c7b8ac6de38afbc", - "2efa3317218577b519964d9610d5e073d89d1dd397953e4bdf14a4bd334656a4", - "0964b15fa93ebca86481e38d342b6231571f731084889f935212e1321bef9d37", - "31120ffa87aeb228132fe9ab5e026fa5e55eac62d0bd7861f5b1350bf0becb06", - "13055913dc0714c6b69438a09349d41050dce8f5f104b218f8a71d8e7bb70e15", - "71bcac0d26bba6a764b04bc89b1fd236639f9fbb3269a37d2380e2c29ba8b053", - "9d4b7e4b8952484d0aacaa0bf81a8b01c3db804d1b1393b1f16d899adf10bcc5", - "8047280b3b6cbd52450528a09d8154089e4c8651a5c6d0541640dfaf6b522853", - "59ba5e00822e38c17289fbf0927ebf4452f31a5087fc8745feb4eedce616d705", - "5e2277653eedfffe9649cb80abe257ccc15609c3f2b213c423b4212db1e75340", - "1e9a7f39d9f5db0b3641a82a83fd5476ec35563c72059e9797fec5a98ddf3a5b", - "b934353aa7254da47c19a53204162e816beace1345bda71a2cb52d878d0f91de", - "a24d67c4eeb8e197fee1a0d3c18ab635992a4c93a3f9a231e9ee81cc2050df42", - "457f92788bbd9202c9be21e867ab93823e36574f05a8139d4987ea1860a71e1c", - "0c66dd03f460721b4a227972afe9e0401e94ef12b9915758a89f445a380f878b", - "c167ddd65a7b09329a18d4ac5b500a838c389f3496605c60e53abd867454e7d9", - "a576cac5f3619a9dcc980800b846447842dada47fc689e566eb845d91b80a092", - "57554afcab4a8d75a6af3646ca19df2461565f92b115142efdf5ba7a06a7ca79", - "e646cca695d50c20816dbb99812c43837453db4939e32abd5ee078c2f8bd844f", - "c14ff89a89e2d1e2e6f944312833682834219cf20d5c5339c258aba792f51642", - "1132e62f8c27755aa2e4247b6b26434fe8996df964f1709126191771394b3963", - "10f388225a090b5e30a8ab116dac6a1f25a0dd9eb159b79b5f99fe716d9965a6", - "90f149551b1da55522c2f0689d4bc1e7020ee84bf31ef93fe29591a6e440db45", - "04485eaa01818b82a91a47d36dcded68213d48054136810a68e9138c62362828", - "6f8dd158f966dc6268a5ddc999d9c035784880fe16c8820d4173f1ac577a2775", - "48c2f19704c4474b61185286369b01ba74896131c1d830aabec2716799f3f02a", - "ec16fd209c948b9a084d99cf670ebde3b36e821a71fb0953d8baa1e7139998de", - "b65faee38fff4c0d6be28f2adf57d072726437248c4083770b8c0c25eaefd9d0", - "93d66bd5bbbf8343bdc8262e3b17fce2ce0eb2588bd38987092a5a8f511514c0", - "f8f6813fcbd90f8f7e171e3f815419e7ec3604e13b9ee1cff8196f849960b649", - "341b8981d4550139e2bc8d87334d8f0b07fc2a7ec17e62572560e527f9913306", - "2a00af7902d20dfc8258704054f81da08217a7ff371679260d0af19ccf259931", - "3cbbcd97e8020c47988a39dae1d106b8b98a59fec6a665f76dbd477abf0b3f20", - "2a32e8c27d1df13021562c6bbafd5f43b34d2abb6cf374939316228a142653fc", - "9782194f3013e5c90da8a1bee6359e81129ac8c4428b7c95e8273c4d3f5d97ec", - "eb4e5e43bbe420dced60bd5dd74835e69deacf7ef36c3b8f503c3fef1fe8ec4c", - "f291fa215daccdb655e841b3158ca058bc2a81e43d5168d0216d3112a19169fc", - "1aa2b14b341f5ceb7043de25c262077826ff8d36fa9f9b8740c9b8094e68b823", - "2ed9cd9ac869aef56208076e557db9806280f768f19c8ff7b157705e4abcd80b", - "3f56eb77d96615a768128741ec2f197ac914909a19d484d56a2d48a41f722146", - "99db8fb0fc38c894bce7e13d187290ce1918c0e4d77acbaba6d26fb2e8cf32d6", - "0be9616c96a818b5a08269e4caaf2e62061082d3c15cc2a421b10b8a5c3f50c8", - "b9d160fd04466e453590b7d3c460a6f95610e41136d427af80de08f2cfbc99ca", - "e9f2764b416a4edbc59a5996549145be20f525fdcac9bb9fba0ef47312f2a335", - "f3c99a0349553ce606e05699be2b5c572b5227ffe191cddb25378abe55555975", - "bf9c69a6b36c96c53baf2a6748d0353688def42a321cdcb94608f6a273f59b4f", - "f28141c4348a91478b0b40efeb3202b45550197f7462d6f609b88c5c4f99e502", - "0a13466c25fa32ab494d77e5cf1844c7ad75d23cd89d7cf92e158843aaaddcac", - "1714ac2950072ccb752d1ea917d35b955bab321c488847f5307131481c232bdd", - "991ddf9cfaa50a36778395edac4cbca97e5451ffed1f53db25f4dfc029acfbbe", - "ba8b401648514c5a077e6573cf7487a41d2a5f5f3ed9fb352f983b46e7547763", - "e52ea484c365367390d5e6a309ae2ce796e6d7e321f92bdd23ac4a12daf05180", - "261539f5d783ec57d2c0c4c1182dc664cd95eaac585878ed5bfbf2a0b3baaaca", - "6cf7bb5dcd682dc80447a15b91ca9a7c855f101ecb32e2475372683036259a2f", - "dfa8297a750d491bf100971519eadcf9ffb4f29ad452f126435b6a5c36d11770", - "15595e33e24c2630db3dde62447f9caabe3a55168ba2e72b3049af91846ada42", - "b6bebb5cb79cc26df32ac1044664478ac2f07ca5569e907188e961d705211dcc", - "5140f285a684bac0bc5b78fa526234a843c648d8ddffeb44b2df1209710b2dc6", - "07dad67191ab0e9ea9c7e6d829751b605a47d3542ad67e276d40934b6ea24d3d", - "35cd0e12e2e05705d1bcf986e191d0133bdf02d3c035556a6b7bd4782acb5d88", - "91f4e6de109064ba37a80e17e7d44616ec9cc7914673d1c9175ed73191ac42e1", - "0884b21a5e446c1c2836b446dada1f2e4e582bf7027e3ad56ed8f70751e9c6a1", - "9c7791856da7268ce685a623d781d91d0bd181113b8d371ee1fcd6ec61dc1b1a", - "ab83bc13aa4786ff1bd157986351df259f22aa00dbdd1c2ba5c58e058d43d2d9", - "06f5e24bac8acb31a68bcf5b1c79651ee61bf4e0feb6aec554ada29bdd5da875", - "c238e8241006c5da8378a9533888944a874e296ef070e10006d661fc2b11257b", - "46c32db00e40fbfc4d4fd251dab0e8387a06ce9924407da64d2d26278d31c10f", - "649c8a4d816abed497c206c1a17ced1de22cdbe47aa13688b93c1d99ebc97ec2", - "fd8749dc461183c43422746daf6c3d71b0c9ea0bba1177ab684f5e0e8f41102f", - "a58273376b4c690d66a990204c6d83eab2f3dee19f8028c7022a34857ca771b0", - "ed19559de4d34c5e2270cc8d95f0c6015d000dc8def6fc0d4965146636b7d322", - "3ebefb93900ac18460dcc49cbfcdbb21e98fead4848bcb511d2cb572f8e44220", - "c23eb3935a6b00dd7f6c8308e1b387e80fb26096cc3747bd73bae2a199e3b85a", - "e9fee6fac0ed8387441d0ab6f241b68f9f73756892a6dd79e7672f4c9923bedc", - "c31b1e8eb4dcbb959a391551d0ecbfa065e6d3b5f80ab4ee9195e4b30a773015", - "25a0b9f66f9c7ac233bd012b35a5d33c46f218fe2605a871aadd6f711c80b49a", - "2e9d823b51696362914dece665075474ef7c7109378de68e19aa1be9a79ea5fb", - "e94c4a5407556482eb5a10d8dc82df03477cc9f60d50972aa0a778771ded1c48", - "0f82d30ea316513cd01c0df61b38b8dd91f4a3a645d0f90b22bd90ea5530b27f", - "a66eb855fc7e15c7c086baf9215a0b85517e9a83fa7ae64c222a4fce49806ddc", - "7a39f4cbe72f55e4007d1c8005ff82acfabda612ccb4f8d5bbb1506fca2f4f81", - "1714b939a0a7383e239b8a14cb9fe6c268b35a116997968ddb6d169353a8241e", - "07d2c2d4d4e96697e9f4c44ae7713ad677fe865ab0aa90210f1848ad4e0ac4d7", - "a34aa153510e07a75061966b239c92b8a82977ed02270ca192f82ec5831edfb5", - "1202f739ad280ad553e4ad0f6aa7621263295b06e8455d54dfc24abe857b559e", - "17553ea5f504073eb0094dc93556a46351d8638e887c6c8f37a2e6e50968f4a5", - "8f83726f0b1c7c53514fdf21f59de7663924319c1d1bdf90f810c607957fb4b7", - "8d48fbbc069c648ca90378c036710bd6c2230e86f94cb3e0a867625b10965279", - "091ea840212d34ea4aaecb265fdf184baf74dbc32effbeb1e80d00b52cc4e3d0", - "8984d42439085e7a2841c40bd31409b1ea752aaaebadac989e2efebec7f4f870", - "acea57b3506b482ef1ea1423ce3b52c941c20c07e397e88d2e90c44e2fc30a9a", - "6aeb6173ad8e11ccc8afe231e359db8f9f88ade90c8214081ac0a441a22e443a", - "b7744408612988676aa59edabbcd94058779c134bbca89030879d843d159650b", - "129ce74e3799cd7847e3dbeaea900939c9da2523bb7d5002ca9ddef50f02938b", - "7c80bb6702b803fecddd50feb70b29019d008c096372499965f96927a035935e", - "659daf20b03a4614097512459dbdc7741d46ee2599a4cf57fa646aa8821c7a08", - "11e034e884aa6daae7b9ddc0a5d0c9d0b757e54998d32bce87e0d12eda555d5a", - "0323ba9347c8f37fc86fd5d928d3440f5bd8be605dd41d2651cc2fb117ceb0f1", - "20d1b7e0bf57d70c6f696fd6e730b87802efccf9b70dbfe92ab616d67516c5b3", - "27f21183d60222a3004631b76f6da1af2ed1bdcbfd584ddcf72a7068ca37c38e", - "4d74571d33b9de5aaf38c13f50e5c51deb5c43d24ba8f1df8753f199b5f05580", - "4f95b4d5240892726015da552f314f192981af7f9efbd49e242139967b1c7d46", - "8f16df23d38ca0e6c4a2ddce1e81afa23bc2a89ac1bb8b3f013e27e58eb0ebd9", - "42d043dadd0c5bb900a2ba9ea9a3a9632f8a68c0c6fbab535a595a4cca66e736", - "c11a5d01a05b183e75c375caa8a22a1be431ad8c3d023fc2021f9a1fc62d0217", - "02b2e4c5a653f9a40594d726215c69c39f0328b93e2f3495d6442cae36900f17", - "fd7d6a80de935efd783774457c7a2c843b5bb0f62c9b0f1822d95fca994ab9d9", - "6f859ebb9e24715ce573a365569b5bbee8694bd47ee3d5531da412d49acdf11d", - "7d02b503d80215b360636ca812421746591bd4eba58cc093e3cdd759a8545771", - "b9b117454d51f97c9022ba631e2d6734de1c50c52766c177f17188a0836dffd7", - "c6c83f3f77f70e9f9cced646bfcdca5f04d32392193ffdd0d6fdbda4e00a5437", - "1fe31ae6674f194c50599909ecc946732703eb9b446a37396abc4bea20eddfa4", - "6c8fd4db6aab7751d39d05213ca3610d63f37ce16ca857ca0927c98a9359b1f8", - "21ef919d3bcf75384fc94b8baace5eb92dc6adbd2b873acbe856f1f0e94ecb87", - "d1b60923a2b9a6bb7a1de6917412e7f99d54a36fd2ad8852a8b979afbd847f43", - "b95fab697fef9682c255362db3eb9dda2f4f1a49ecaf94d504f8b69576b1e86c", - "34c495e839d7b3380be9dcafd1759483a8aeb2d62307350827cf11b04ccaa214", - "be7f7610579aaf1b00abfe9fbdfa9a860555cbf191e7c6998333ae775a3c759e", - "2a898dc7979d88f252b2db516173acfc75ded72399033ea12b1c53e8a21250fd", - "6ad72883d0bb53f7e334ddb41d0fc3ce4b0cc41119ec0d2f123f8a17d7a3dd97", - "55da2c9a5a281fcd84aa9b5eee27271ca77e0307d948ec2e8740918b33b7d979", - "0c2fb300d374556eb0a565013e6d6719a53cf4a033b3d4d39826b52f613a7b60", - "dcead0754fde0bc8a23743233f50e01258e00d7ff0320e2b0c89e5da29451aef", - "8f54ac8609159650db666ba79bf993ff44ef715f74d11e11ec2c7508f1848a95", - "1372b445dcc172d20a2273670c86639cb8364ff75823ebd8a0919b01182304f5", - "a255a5ff1ac51e577b613fd7bb4765673bdf96bb5ab6352671432545ecea0b7b", - "bff6ca1a0741a56627fa93609e87ef756695389aff09042b1f8b3f9cd72bcc69", - "66233098f380522813b845f566f59b530ae5b5acd78f09ced57b8ea3062ae200", - "d20c6900e2b67373890eee5e09b14f342460d179ad66e500c13148ed589e98b3", - "0e8324ec1d55e02ae74ee7aab35359aaecd3719f83c9c4122ca74872206e96d1", - "5129f88a4654003ece4f1b522faf915a10a1d00138d8b3e0cbe13ab128f5e5f5", - "0afd1fe2c163b4a619567dd10613e979956690891d1bebb54ba244b72dbca075", - "71672fcc96754e9fdd6cb3967f734b17615bde978a46d58f9b914e8176194f68", - "18430a5e7e7a4cc0bcd0df04b66a5826d71c3793b80251f75e3204595bad7946", - "d7215b8111f55231f41f4d9dc50464142bb6b4418a901870b89e860916552da5", - "ba05e27932fbfb4cff6551d84152321901fe26b35f434c0eadcb47ccd77304c7", - "c0e12958e961f46acdfdd0cd1066d0fef439777ae0b662a73ef9d379917e5988", - "5e166600b54d85942035d00667510b5e52b6c49456668e288131b04e5ddf18d2", - "5c301b99cdc6f985cadfafe3bb04712c65f8ed8086102bbdccbddbb14a77f30d", - "282f7f793e03c6afad0acdb151df241e011f8282faa64b4ed77953740fea8d04", - "b694b9416b4981e13359e3118bf5358fe227385de0e4b98ddc203a695e665e9d", - "d07850612abe6929f695b21e969ea4cea6deacb98ed613950d5b235a87478563", - "c7f9e9e8f871c902f5a12838ca837fea6071c7702f2643bc137c7c80254e4504", - "fe631a16dfcdeefebf9a4a3dc9948ef86ac011ed9cbcfb998093c552882739f7", - "dff49820cacc649011b080f16e95954859522bee4cbbbbda1a709f6130c42ed5", - "af7905ead69adb9dc346a588255ea1805d82caab93bc153cdc1b14a6ab7b7ae1", - "6653edaa420a037205305e557ef3c636d4a7feda21222531daec85b5e3a1f94b", - "f69e811d2982e01dfac92ff278355ea53da139aa182b1febe3de98aaf1399002", - "a09851bd812ed2cc30bc40c9d5ec5f156b18f165fd8a6bf49c819d34aba8b45a", - "17d03a8edec823cdefeb547912af3744c570248b5fef26e0b95db3a7d62ed550", - "0abccb740fb15ae5d386d8eb77f0fd7d91e89f9a76a5ce90319cfceb37eb3988", - "62802211816056069d366ac6963bdb46bf7a21cada530401f6ed87540978b51c", - "2487b56294390d2bafef76f24a818bdb19cb14842103cc2cce4636b4a6633a05", - "076279c4f50f4e540c432ad57cec55c15803cc0e1e108c349525319c520d5577", - "af616407c0ae3c9a47889114f0cca557396ecda85115f50d314dc92b79bc49a2", - "30f16d4c589ee1d11ab9a9e12b32a2f0bf471abe8d674c2e8ec57cbf054178a4", - "d6e0992240d1e02753866dec8a09098d2bfc9ecf179f113dd8f16455b9d1e0ae", - "d1f4bed5195bee7b726b74700d8005fcdbfbe11fd28db9bb9b5752dc641008b2", - "948378ecfc281116b0f14d972478c8d239ad4b01a87f3a7716fef25416062d97", - "742b296237b8cacff10a09935d9aba617209104f7ee406ac877e2953168ad337", - "03bbb6cad77485eacf6f2171368237d8c584ca6eb31f67bfe73573519e6a03fd", - "36267b0d6f3074c7259b8b7e1f941f68df147abdca3dfc520b40ee778b71c225", - "7b0bac39064e4df0dcff78bee8fedac3f821fac1f218a38e07ed0e146b435a68", - "b01a14909643cfae31eb82fd9b81daae768bfbf7ace0867fa189f23e5803d5d5", - "ff8e86c3dc09465bbde653d690efa93af706ab8f29e6fe541e5a9fedb6a91add", - "5154339f24df0893dfc66b7a7a36abd86a127c9fb695b886c5d95945ae467027", - "e3ed7b8388fc880f3fc918459ffa6e9b141155e5c4d062e2fd0ab5ee67d3cf40", - "608f0b691db64957ce232f89d882f5755363f1b5d3e2d8a8b4eabe714a5ce835", - "3e1194f48a215bd2dc0882d8ce021286cbeb4235adacc32a2c0b14c2b7d56aa1", - "1bc6bcd91596ea3264c69729e55e18063d49ea6ed254d5ae604837952a7ce33e", - "b30d99a99737680c0e73c25a37261d3cf9770dd5d42a9d29a65e3f8d16f480fc", - "ee5c2cbe2eebad668abf75dd75640c732076b6791cec1f919aa984a04babaddc", - "7077e19a1be46e0713627af60a5ef66e0a0aaa15eb5eec9996ec3647cc1d2df7", - "4b53b4d3a077c1a9d89d84c2de9d1310352c6480c2f6efce9f2a68333f129ce6", - "36e8093c30f2c36234edc1a1f7c4209fe4771388d97d1ffe2698fbf73297144b", - "1454504ab88119738d343702ed13407c1193f9b274620528d750bcaddc124443", - "e5827d64667fdeb24eb0047968a2cd277758934ff573b56c5c4b7b05e73ae5ab", - "438fdda3481d43a4dc1ec8bccce436da41bb24d03f95eb9bcf8effb33739f249", - "193b973fa8704406db538edbcbe249561d6f002f0c00bb4d226c7eec1d44dc11", - "fe9e696b8ffa64e753cf416dba082a0bc27b708bec467af5a61b595502b36e53", - "c7a12da23141a628386fadf5bfa1b03f02b78cb23804979fe0a2b57bdba68914", - "2366e07196ad2cafa046ee18f40462f526d287822a40714e50986cf99b2b59ca", - "ad5153a223daf2fe3b3be739ba20ce4bd5f184b197ac7446d25ccfeb24150bd5", - "aa55cc0cde2a471eb7e408ab5e66dbf60b0731c15cca90bed70fd966131c8efb", - "486c6603eb0fdef346bb630b198daf18debdd7f55b3d93e480b02c46acd21a89", - "67a376a1f92b98a8e9756d08666633f4dd5c069e8ed0a3d3f919b2478eeea279", - "41b38e4aa370be8b4b24c32a4937795658ef42daef341ed179880936caeb8b61", - "7e03dc7fa9c833c2a9c3b3a011b0df2c6dad2b1e452ac50447fa45672994c53b", - "3dcdb6c57d400842c7e7ca12ecc005a917078d39cbdc2d154d1d80e4184cd646", - "4209be9dc1ab989a8651503290b5d229c3f95e373ad36867c84e2448ba0eb71f", - "e13bc9a4a4bc953c77061fe8a20c95bcd6d4d226cd166e9d4ccc0376fc77db48", - "aec76a605959ae58404db88432ab00a6c5cd00d4eef15fbe8a0e87e44e556ffd", - "eb945bff363582372adbdead7ffed50db204734953f281de9149eea48eb87d11", - "1d52eab906c9578df33c21f739f9b0b1e2fa1afa1fabc9518ebddf242b97a647", - "57fb63343bace7f73d268bed2fe5a98173f35b5fa808a740670bab3c7c9497b7", - "41d60247b3b7911a2768af54dd2bc76d4ff4cd2c1eea867ecd8a221210c1a7a1", - "1a652385e06c03b1917ff424fbdad44d49d6e0fc7c64c517a14e6f9549b6e2f6", - "e99d3adf961b27d4fbe8bdb52982f47cce84824792a065943ace5dd039dde86a", - "7c66b66dc26148b9741e23f5119b5bd2a73ec7b933b31e6c47964ffad4a776b1", - "5606f5f182720f07fd52ace8e1528739f9f9731ad3d85c8b754db9fab3a1fce5", - "22ae872ff4327a547b4849748530e2ef5b8e3e9b244717c900a7c11a9cf4d902", - "802cd95d0300d84439c674cc813b5cc68ca844ee74f5752dc5de86c8d410ee96", - "55d43cb560e00eeedb1914fe1578f1b5c4b7ea6a16ce35bf6f18e9ba532e1ce2", - "308b019afd083d36258959a195da90a501a2f7c37492cde1f0b9bc3f6b92994b", - "e342dfa0ad7e4d0047d74c74835e36255c35605943479bfb55ca97b1b2a5030e", - "be2fe7c6ada30bb76ea365d839ead1c1ceaadbc116641e070833194951eecbb6", - "9bc95f70f2beb36f5faaac04dfb5c08451aa032849da9c63ccdc4c25a3fe7a4c", - "570c25c836e0ca23bedb6d0d3c35ddcfaba6d1bb0552d5dd3a5d1a1f05c02343", - "92400eb67190b8311acc9ec822113871f5f322377ff34ef7fa389717eb822d62", - "2d931e1e5ec8d49a0702931ddff3675293d8babc2c430ed151031e1fb4c41100", - "ea4a904ba43054feab70dda9e09c4afb2c20cee41cfbc1a664cf89a89bdb7666", - "d986b139a3d66b29b7a32ddb90a610da8c6b890a6dfd0572ac0b1ec71fd31969", - "2a93ca484479af155e0802c2c8beb61b38c6458085e45765d86d2c5ab44f89bb", - "493eb66265829b6d7038b80a969fa6ee2876d65fd8aadf0b2dfbf8d6758a0bb1", - "a32ba460b71483c1c4678afccd8d13430ae116b8c75dd62e95fef2451a36da5e", - "8394889584335969251eca5844a470b19b3bd02a8ab0e0ceb9896913b8744bfe", - "cadaa085f124e637a0e2eaf4a0df1a88323a802e92c598726432de192aa843e1", - "02e80d3ea0a582fcc6383ae24ad433e0ab09f97ad50bb0c81dcd356c6c17889a", - "2195c353636f456d73e40e53584f63862f45c4ccd11fa9861bf767381afc4739", - "88608946e7324b1ded1f99bb73e50cb0851560dac037da8dbc01793b74ccfdc5", - "a8425a8a19c31de024a17cedf13886180a28330dd46ed1435a9b76a67c680a1d", - "4a1b95f4792dda397ae732d25d00acab3ec3681e2f410bcd1a7e6787c6c13623", - "c272bd959e2cc5c18826b28f9beac3aa079841ab889395e62d4c259a9d527f54", - "824190e1573c405d29fdeab3be4803747f9a202e3aba3980552198ea6dd7c2cd", - "43fe372995461ed7c78ce81fc75c0a42cf001d8d7cad5a0a931b1a0b6f27d7f1", - "d60d49b89ffab9525f56c9a646a53d1bf2e1340ceeec0b8986ecb30096b52403", - "9f54aa37f2aa5e18d7eb02f6e2274a4f3cab707b7e5c3e9402c3fb5816a7da11", - "92ce7c3255896379987ffb7261f53370ba5681bcf4c5d9415bdb4fa2fbb4b731", - "e0b628d390cd355414eea35e8eb7000f3cdcac69aca046fa3f16bf9364428b82", - "df6d8f421237060a0a9524bb9dbf9e1faeb7d01941fb937c29c8c09ce026149a", - "526df9ae3a61a975325f1b611865f80148af368805b93916c0943ed8b2fdeca3", - "d8367441e3614d427b76163fdbec250e7b4eea194536177caaa1c60fb69508a7", - "ca4be7f488bca0b4afb16a7e237d8011f595cf412ba273fc1080b1185c9e62e3", - "089e6ebb17c3dcc1c202bd9978e85330631b4150a5ed9132427e5bb4e8f9302c", - "6026f629f961fd5891b72e9002ec565e31fd3df08945a951c1d9b2efa3fc778b", - "4b068a7b0cd9d16a9f959628ec5d7b952c307906c69738558fd9bb38fd793518", - "9418954dad2ecd61e539837f80cecb6dd55ed70e765dfa8f15d39b1b885f4bbb", - "b7e569a7a67a7c1edd8ce91d8ed24a2c8950fdef973bdc9fa784a9a73fb543df", - "01055066ce046db2ee5de3ad8f42a783237dbd55c57022192ad7c32bc446cb0a", - "8a5d0f7b49c16284333b37d95825f7ff3b8811b745d2b7c79a666008efd156d8", - "49c5f0b6946cef4795d2832c8e645f601e120a5071595ebb9369200d84a90d21", - "05a30b3abc3de26606badc05954503e169decde386f1f485684f6ca8b0d2cfb5", - "5ec45a4e361045f107f2cdd8c8812d9d5c188cbc69ff67dac22bd6b7962a3b64", - "1bd4c0b71a4c8ff3a78b881b1e2bf53b8154bf36870e5a77068454f04cdc00bb", - "b40ef3a1ad4a81db923ce74e41e13f4a18cdfb664834eacdfcae74cde9d88369", - "2c2a3943220315f7f6b1d1faed06b2831c2fdf8a3280c09f76c6ae44482aaa4c", - "f23650c64ac55590221368638fc375dcfa9ce734a2568ce56a56d7c4f2edc499", - "c6a8536dd6b8e29c2f7a7a1b719d91ad5204ff8608c6bcec021eaa8b8b9752aa", - "d0e9f79b5a8ef100783a2526f746cbdcd92c5bc5737971c93721cabd1cbc73ba", - "54ee36c7212a135c371f55c98d56f43dda2fec92ae27d5e9c2de8970233e8087", - "a486271e21710bafb70fe13ad35e94ceeca0848d6288c2790afdb297de9cc14b", - "5357879660cb279338e0dfc5c04fb5cdc145aa5aaae4127a0b8a1128e9136129", - "db20cb6bfbd3450f8425a64ba73f313200673b25795e86c4b33fca76b2edcffe", - "6f83f9c4af8f546963117c2514f0e3dcfee8656c4e956b333df824b673a27845", - "5e21aa3046c0c0413ab6323473c2a688bb99957fe696d88ac60639a98fbfdd25", - "83f35f8e7e632903bc16e258cfdd43d246e2e4e7e4c4eca2cac962519431554d", - "5fa95d5b2fa4d59e64e901c222101c85814c48ea4c3ddeda3a74fe1ba7698b72", - "2d66dc3ad6b65ea29f6fdf4e0190abe85473bbff860fb996f093b480f3834f7f", - "eef1d76c573d144b81a94bd0cadc547ef5409f060cabaa2c3a11ff8641a7b092", - "952621f92725a0800ebd5e9b4f74133a0f03760599355c086eef8650e97169d0", - "5530b4dd050ba9e6b28c6de8219a83d289a1bf4d7d782ec57b593784927e1b95", - "40a621c74e834de89ccabe9637be5a5e17d772cb817c22488637447519cf031c", - "e6b721b2893699491ad7b63bd71076fecf178eff00ca10df27b14ffa9c6bf71e", - "c36107dbd4486cc6adad6b1d9204a14c9cf4194e2d6e3337aec635a461858511", - "ab5f0093e32102bd4edf3bda7beb3ada3ccc2ddabd43e5c71c614d74382c474a", - "21400db1805f05ebaf6472f29670cabfba8edc6e72dbc5443d45a753d93e279d", - "64f8cdebf34ecfcfe3e5e580d066aaf1afae48e10bd2479d52200fa49097b65b", - "5a8b150d9900d61be435605700515489b1066cb9c9ec4648f47e7917e7a1dea7", - "1edd83e9f124080bda792787193d32e10ff4f90be7fa99a7412e0af5d914da81", - "c8f0a5014e73d2dd21234c891e51d7e4f746088972907ea068e4e52d918fb47a", - "72a2148ed651267a240076dbee2ef97b65d2609a3a2d957ac09ad553075c3f41", - "363bad7212ea7dbd98dbc19736a05e889af00f65950bd34186aee839b5bd2f6f", - "b5dc57039ef19692e3c91ecbcc9e256e96fea3caee4cef5c4c2d5414e9d1e540", - "5cf00a31fdc0a8e97f61c230f13914491f49777bc7403133aa1e0a9c0d446e44", - "7c2914eb5328fce371b5b1c60a23c6ddcc4c5bb024011076caf4f6987ac348da", - "d8f62b57d15cd4cfc9143fc0b503b6777cbe46c6381af3197df8fb9708eeaf7e", - "cb1512ec7691e17d3291a06ded784397a29df62a00031b9e134a14fd7c56d534", - "ef29d988be91a4e4ddb1d0ea1c70d3e765c63e658f07b487112fab97218a1f64", - "672cf1a303373bd5cb91c059b2ada695203a5920bb7f95170d83b49d3e565832", - "f8129548e3b8efc2fd4c3119046f15c1209817eb33211215ffbaa97728a37518", - "4dfb3b5a9e6691725b1012894fa7c060ecd88ae5dc8073ea03e29c14364f732d", - "977db425ba93bac6b368daf58d3313f96023063db5881404de21faab40e38800", - "f612b8eaa7f64e41bae7100a93ce0080fea39dbe3dd4ea93df2b3cb1ef99f027", - "05ee6108a3be0ce4a37c11b79fe6a9fe0341c8dbe53ffe5a54521393c5b9cfbe", - "c6f5fec3ff2866b2f29687caad2055bf51dd1369f403e504fee318f32e069d9a", - "12950e6587853824b7cbaf9435b8ae3d90a2c7d801361bbb4d619916e4931e08", - "c62cac6e0d5f48b8fe341af526403222df8a6bbd8be4d26dea4ca26f4caebdd0", - "6cb3de7c0d7d42fddebc884999e6a8022492bec8dfa4408e5c4736c859d890b6", - "8995d0c7e8951d595e7ffcf54522158831ae951a8c1214cb0261471f19befd1d", - "0a7ae70402fbbcd03ae608914ff1f710334595a41e213eddd5c79eec006741b7", - "7b5b981c6ce0c8f3be05824e87d42b468e751377c673c1545bcc5ec2350210dd", - "5ed627fc12d6ae6a0fee9413e09d07bd6cea48c1ab674abb49ae5a697fb8aa82", - "89aa8d92a7abbb99862daaf246192554f13a84e4063c7a9160bcdd2d23276d04", - "ca029c96de01e1bfc0a545a27dc6afbea63e3d78f6ed51e2ef885c0f2b5ea9a7", - "46fd7cd85b1ac59cd5d3747472d53c320c86f51b1c874448d635b46ecdc61683", - "0e4c9d52b087bab3238ed73750a9aa39096f2c1b2a885e87d73a73484b813224", - "6c458456c83075bc537bc6002dec29f55080014c97fe6ad02c9becc5f0794135", - "1eca944373f13a9d7326563f40918e60a0219279c8b0f60b1183988433b71b56", - "e22fb113ad6b749975cbf384a6264865e102420118b0d6f05e31b63e8eceb44e", - "ee6428f3a03c80967f2434223311ea66d8a99b12ebd34570dc7bbbdc7bf5f058", - "0fa34eb87e9dd8c2c14a5eeb7ce76a753eead1d6711efca7e0b8f7dceb642b48", - "43d5d93ff1569717acfea33b45c9266831d59c0678335af97be75e9ff3ee6d87", - "932610c353b6d124bcca6b8493f3abc4c6623347761aabec1d34c7b124cfde1f", - "ba4a23707a9cd7a3493fe79d0d9823292ba2317344c6f25f95baf3ceea7ff730", - "794890aeb36d7f4a1acb3a6e60d91150acb7c282766ea8cf4d276a8abe45e75e", - "a3f9508e684bc46af19b0798dda22eca3d7b6b16f4dcf61808ee17282fc247f1", - "25519a497136f67ade493bbe869101edb334e5d74c855ad54cd662feabd09a94", - "c8e3c50696a43b24882333e36cd2549c9f43ace2013b91bc33a4bf84eebea452", - "cc6f6f410867a07c0e23dee960ba671a95d17f49379781030351609ad7a85015", - "490323b21c46ce6e35089220ff1df42ff27520f017ec4f890c97b2ba49dff7ef", - "6a6c2bf503f36fcd914e5686d48bd830d385bc28a6085ae3cb1229bcc7c6fab0", - "db291b47112038a6a5186a4182f34fe792745edc4eaab6080c903774ffba6130", - "7b91bdb68df300950b24b39c803aa13fcc1b83e6f3cc68e2e8625cf5f93b80a4", - "1d5ed29bdd8ccf89b54275edc52a2e145945ef1bfbd103a9b874ecbfb18db12b", - "fd15935d83de7f8b57409ad2b0bdc1eda66831e5b8125c43143b5e8f860f81a0", - "2dc47783051e3ad95fb4c3d08f237638aec2f5c0611f7f34922a961b8adc752a", - "b5d47220ae9236e0b8bd7f7cbd2d4cf3b786dc5fa73f1b955e808f9048a36d60", - "5cf2a32d15327f81707d314779b2d12f60257ed983263853131c0b16bd443379", - "183100ee0eaa8ba20ce3c69a2e39625d6b61670b226504d5bef4f05849619c38", - "2ba511ae8e0ebbb82ece956ac305e96b9ab42367ea01d32adbf86d641c602bda", - "d821898f3b68d75bd375097f53d1038e1ec5fe7929f891617d005bd8dfeb3a53", - "b281f9403b6c8d5ce28ca40093ef5c4df94b34f5d62cc88997041fc3c2776cc4", - "6dc11083d913cfaa34ab64bbdc49d1eb5cba964e9e4edfa3f929f99a92d41de9", - "4bdfad0e22844920b249420177eb9a5d090a2098149dc78266b2c0670ff92465", - "bb812da92da2559d46fb1822c8ccaadbf6fd0e51926f6c1f965637ba2b5d0521", - "22a3275fb860967bb33e2249014c91e0f884c3faceb37b97cf6761dd6a6bdc80", - "523b0c44f155acca9d8d55436bea3c7be050dbe13fb48d5644b2ee64da555a8c", - "8ecd24139a93f1f46555e3910a862a8d46c986e3567330ecda6c47824675e3dd", - "7951499a94f8ab1abfd956c3d7dd53621356e19cc562b6de1b17573ef43e33be", - "2a4f226dd5f2eb43dd7649e8897194be5df3a6c1d9eac26c585dd20a29959a7d", - "4337bb4b7563006441fd85302d6aa92284be83ec6b898066424349a39b40ed4f", - "8f513f46cd47b03be3803e54365dc67d3a6d3f85d5de8e2d314b2718a8592be3", - "b1bc5bec916bd7692ff8103204a5f08191746d2aa2003262bb5254929256f68b", - "6db91db6314245ec4cf918db798933e21e9cc9bb6c20c3e7548e94b488317526", - "c87b1ec4f3339ef853b5b96f4e456eff53b0835999722d32d202f52d40f472a6", - "af231b8d5f08e6c4aff3968f9d621c94688b2f1c8a77f49f0a3da60e476a4548", - "bd812f033b6858b194598799f3b024eba2eb8dfd3fe63ffd3e81918a8c786f8d", - "20ddc2d17dfef700afe925337cf1ab4936d662ec7c80b186991298c2484a9ba2", - "3b4b2800a0b090eff4f3ee6d67573fb5e18321490353db0edbf35cca9fc652c5", - "570f451d6c6b4d6791019d8f60373418834e0c0f1ddfc7102eb3fb37d83f1e45", - "08db4475eea180865fc10125fab12acdcd04cbb8c1c572405a2193973ed039af", - "6da9e1470c876b3d99b32b4e6889b228b4a1f85de71c75aea858eb663794c199", - "0bd06a8c3318ba549707a3925c855c57b10c024dec8178b943bf9ef8551dab80", - "92233244d0da9e961da5d9b264501766c9000419746f6d57f4efaf8b21899263", - "9d9cb22aa84ca14545d9afe9fe7f0768360edea14d90622e57cf941e9040dc14", - "5a16ad86b1669756b74b6d90160a389007c01d25f4e9b4384b8bf7526e2cba10", - "99843365431d9eba279efd032856d06e85dc2b9b7d331fab8e6e5541f9f83909", - "05e430c0b2c808fbe6fd8ec3ae65ef1bcedaeb3ecc49f3a073801bfef1efeb0a", - "1f63d950e9c622984a6bb0c039d30719aa4dfb41f435ce0504ebd68fab199cf6", - "8b6df12d4ebecf7d33838a4e580076842dad6d012a0867d37d1405b333b0d401", - "ac487b82c5465523f0227f46014d8e559a6b4711ed8d1d36e64a65f71c970cab", - "c3b3a765179fc169bf708973824caa668c77d68f560c59fe768c9c80881abb1d", - "4d068c766343758e0e94fa522e5e0b23e1bcff39e22d8de153fedec07b4ac63c", - "b0cfd102fdbf74989367a5b07057a1ea386afce3f4b36f67c7c625909252b7ce", - "4d1d592daf81af4f89fc0510c006e13817c402f3ce87d1fe54e0cf3de0b652a9", - "77609eda11c5643f9e10520a6de615f5b02ab2679c080ae4d5f4693e7f41747f", - "a39be0bbed01bb52b8e510639080750cc3512933d8b704bee3959c276652b278", - "d4b8142d5711439431cc951b127c8277f433929e9a2dcdd24ac4fba440552b0a", - "d6d62ae9528fe4c33ce7262a3e701e474145b6bc7d5fda916eee530955c558b8", - "59081907befb1fbb0608e56d51cb9403787086811b5ea33aaeeb3bdb14333849", - "a1ab8a166d354a7d5d66e4999fe775d8bee689dfaf7c8fc577c44adfdbb4f787", - "cadc7c2b278c3e140fe4d963abb567c264c50cbdc5e6352f9a328d508998203f", - "04112de4bec9fefdc0a87a68ae2b3eece053c9e340f5eb71f0b53bb774fe4be9", - "28ec1553980abd83de1a84ae2a4ca05f5abc19a6c16ee54b7d22169f9cdc110f", - "2062843f7dc6c496b3b20d516e91b8ce43243d29b0530006bad0bb3d5959b410", - "e8030f7199cb6407b3a2db06121206696f250eff14863c20bdb816187ca9c1bb", - "bc0db57505b98199ac5ba1f4e16370b9fa3c0eb94c486a5a0c76337f46eefb34", - "2ee0a013938650268c0eaccc3d542b7e992430848acffb916ab855fbcc245694", - "75332a5f044a9a7ed75419ceedc8595525750b9e063e24f8cce28f4111bfe033", - "a633816e8d25636cad6f62298c62e68142beb2f62a021c7e9b40e0b7f77eff8d", - "33414f5455c10a36a54ac6bfab8f1540892840d41730269b88160a2a91084a3b", - "9e20aa568a1b1b328d1c939eac680000d02a12e0ec79bf200cbb125b2a030c5b", - "f851d79b597d9840495cad2ed83ad64dcc78f619dfa2aa926f149bc8211e0bcd", - "264b913cf67568d263f369b5ed7acc4934ee12fe338caae63a1a8ccdf3fbadb8", - "79ad147a8d0129f7a323ecce935ff2b662d632b292140ed0b81c7aab9e0c0a24", - "666fa9075534ff9ce8725d163483c3ba8fed0e1192bb9cb6d3901360f8f6c9af", - "580395dff5781642d61101b44fa01d84e140be99bd24883c4bc1505a503ef2d0", - "915b770ba37e5986854e13d771a972092e36de19df5ea3a63df5c07852a4c0c5", - "6593aa3924a2eef44a4a2f4a8a3cea522be212b0534184475c143b27746b1c37", - "3e9f48049a55e75a9efd581997c0d75ecb14fecb09656932e976e01694c248c5", - "4d86d154898849f7d68dbb58e17a7880c785c4f4885ba591e8352bb2d04a855c", - "d344fe1f3eb9688f478f8a07972d8420015c661a6d2ec0148fe5a87e0b63f6ac", - "4569e21027e0868bd7b65feff4b4a084b45ffa3457d2fb6558d50cb4e7146d85", - "9e018275022f99bc38b0e30f98598313abfc3de75ab95b70d7596462224da854", - "472708e840e910df325724d2d2bbad7c4aed95fa5d1e2269d9e4c4d90a952c7d", - "076e994d67cd2d3364bb4b39c883e9e4517c6355d5c4477d4b9be4ca42048eb6", - "5ba88c5476ac18366bb6ce333f3c044bc7fe79e15a2ad748d0901d6b34281a64", - "828bbd6366b865ddd733876a3f26fa5a3fe5f5050595dbdc5336d90caa5e3f7d", - "661ba07b754d14de24dfdab1dd06f11a392c5b14b1e8a6dfc0e97ad1d5f94cb3", - "b1e11f08257f3733143a76276ec798e08e70e9b857798778aaa81b455df262cb", - "345735e4e95f605a54c3880eb91315b5b75aaa252a4c5dde1208917c0ed77364", - "2415a950dbe6ba4bda9d5d2b31e0431190e8e6925215f7584abd880a0105867c", - "a05badb7ec7f5fedb3faeb0183cd92ff7c9361938692c0dadbdfd57bf19c2444", - "a031dc795c19c9f30a5859cb9d5d2a636a39e39eb98f8e01b2c2eae6a98d8a00", - "0694ed7ff6a220cf74c31860956c2b147e17da605494a711fc1f8db8bfa36566", - "58199026c5e01c65f73ab72d2a5bd83d3f2895a7767ce82500b66d9d18fde35e", - "3bbbefb69f197db94ac594637f0af82155eb362b1503cb291f96d17e66e9f98d", - "2cce89a1de5f81ac964cf37d6922fe4cb88abca93178ff4b69ec2e5213cbe349", - "3c1e959c69c76ca1a23cd9db18d6d1e07111b37cfeee177ab533ec5be52679bf", - "c9170a16a91508a3a7ebafe6afe95da3430c7101a295b2c85998b0b22a5161c3", - "c2446b2a8c060eea9fbfdf1b6d63141688342fcb7904ae722958317b3e97e752", - "46399b77fc28e161d2c9c4eee32cde03f288b68e5053ce3fead14ac0b0078e76", - "73911e1ac04255d7775f2feb4d3fd92754ca5d5f628b9fc8f75378b487232d2b", - "f974d06ab388aee5aa0a6281d44d167d80b4d87497b4155af1bd69147b59f264", - "976e7b623bc1e57c8f425111dffeff67b4c4d0125300c7bd994334e071a87067", - "768a09333e3cdde410ff330cf03e8f1a9484edb5d6c210b99ed0f6bd5d6e37b7", - "f8b4ecadc43463af0b666e966ece50e60c535875cc15f541060064954931eee4", - "24f26e64351c7c0ad2992730b8cdd62391c8848711fb703e9589bf99375b1022", - "e79a20bc3920d4540f4ff057ba45c73fdb2c4c6fccbd71538e0c075eaea10e84", - "c6f7cc5ec67702d91fcd826dc8043b676702fb49e8eef5566c1d538159ce7a79", - "bbb00c96bb0f4a95a19ab0b0b221baf3deea1533e8a233d8e54503bac70b8846", - "38d0cd3b69e7bee0a003cc24b66aa5a32e1cd6ae63346c1e70581d192325dcac", - "e0a725a2f930730460e33b1ba725eb4099812a5b442f20cefa6a4f3fbb9a6a70", - "469fd82c0d9c4e0a8fc7574ddfbc02a158548c061059c8923457ce4caae49fb5", - "74b91d7762ee9a984fb4c9cf76f8c055437a9d0b5781132c048c5565ad81f186", - "8c1107f68a0900850005e570f80ee6a0464f245321af44783e8789b58dd4621e", - "68ab8748000620c5a619b525737702ea1b204b135e242eeb5e71bf975b269855", - "66359eee238c6860ae25cb5fc04b348b352aae7a038f5abd2ff590e09c72a800", - "03623d0556261e74c9e438423dad1c08770d0243b18070f3a6aec4cf56f0580a", - "c522354d636fd504386f2f72aa96cd1565540cfe315010c73e8c541dd12a32d8", - "751de9f20594e5eddb3185ffd70f10cbdbc055cab9d30f78ffd04b6bc0378c65", - "9a13bb00f89119a31efb8d25e8e6854b565dca4761a8719081167bdead4d4dba", - "ebd3d933e4ae745e61ab593eb1e4846cf3a310870d57193d02138c8597c7d062", - "6243e22c8a6ceee482f59c2cccb562d67b6086a807d3f8d393c7bd2497c0e74e", - "f63edac303cb9ee3c8feabab91079b18fcfcd552163f0a7aa28a90b967cc4a70", - "a3ae685679bf5e7cec28b26082db0477a094f913f66bdb12403e120cd3a1a6cb", - "fa46d8b7255828778de83224729f4305230ca6f6b25b993ea953eae65a3fcbe1", - "01a6bbb2030d8232316acc1d43c135493d9d61b589d6e71caf8fc2ab7e00f2e0", - "486f605345cbee0a7fb9461f8ce52a4504363c94002f8aa8c82e040f5288d854", - "32b296e215054b1ebc1990704037c68ab39ce452abd61bd7b60c3402792b5cc8", - "9361873539fa9cef13321b2f903013bc1bc22301e7dcd6076bf727ea8cf68d0f", - "47748765c487f95fcdc9f496ffc07e2dcab191847fe3b7201b871a0401e78a57", - "e5c24b5db1bd9e68297de3853676c39ed0efcca6ff84c03df70514225f521b5e", - "6fe3e72d919d4bb5b722b789d7a3642d26c5c1b9c02030f4561855028ea980f8", - "bebf13561c3ed43d7a3f253a607e6aa96c788df15ccf155a882d7d06afd730fb", - "0527ee1924862d6b3014b7522bbcefefcb69973f4681a019cd46f198c88c178e", - "35a0508e47d2bdb4410d4c928acd570c4fa03abf2375036ab69d32b1ab00d2ec", - "de48bf6d043bb51559d61e966cc66afb4375929c2014a660e9abcf4cd49e2ee7", - "a3b9a874b98a1c4fdbda6ece291dd9d8adf5301bc92921ba842f81d6efd1bab1", - "e70995f116ae1b63a1ce3ee1b01d8ab2b469dc6c1337f2d68549c6c41a980239", - "39b0dfb42754687cf0029c031d875b5ce797f09a11fecf39f67ceec5c0ec699a", - "41be71e97c8fd50ab624d94752e06b7bd89c1e09570d1bc8751ba224c97f3d12", - "6b192fc799f36363b6ee3e2431ce2692c5dfba20a9238c50fdb354d3d05db449", - "4dfc851f24fad0b879ba2d3db50e37016fcaf310d4675a5c7b2049cdbb881b6e", - "52d4f0acd98501476d767681e81c5e98b92869a57dbad70418ee7294d1ef18b7", - "0807b04ea6349e3ce71cfc9d484f3d17b256262d03be40e57f4f6d3bb14b5cb5", - "104fb98c5d11ae0a216eaffec925d05fff94a3078749d5f1a53e108fe818f4df", - "29d66ece8641226855af799c14d29aca31749db469081cce5ecea56ae5063656", - "b7c439de2d6de3791e763db14cf7145a43a07db4a58f6e824cb053a391499d86", - "ff5e64f82ce9f9c19c4008a39df6012a0e5b0005947a424b5c1510da147f9b26", - "382246fa4dd0184c7a599d8bda86cdf3ca8ae75be8705e0f6b22952d379607b7", - "51c26b7ae6d944ea0207081095525159f87be43026fb8492e6617b522771859c", - "7028070ef07cc2e9e729dca03e8458a2651a710f06a55dd43938aa812fccecb5", - "d3a99215dc26ef16f34725d799ae214667d789ef50b85f219f6a0d648ec0c83f", - "959d8e066c9a1b3ccb1d1ce2b9e9a0b7d250dd818b87ed60992553f0bc4190ce", - "68216dc861004f7a3408ff5688c431bbedf0e9b77e5f53395afeb3994d30b605", - "ab82295d7ca2a6842ed91986f1002d5ca085374c60a3925d9afb338c1d7102b1", - "11d77a36ab05fd154c46e566c38bd3f1adeabeb017e1e5b91dd98b26d528a7fc", - "4082fcaf1dad0a5aeb3e531d0953ac1ed9ab08a68df43fe1aebe264140a0d1a6", - "1e1975c4573c4ed544aa75135cd8edfe2b072060a1a7d418d95274ef0ad40d9e", - "4b6ff7cb8d04b8829b2e361d7ec5937a9f0752e15bbc24c414c4623a6da954cf", - "d597c39daac3e4962fbfa080bbfa00bf996c5f43284c5a7f0505a0d30bc7849b", - "2908aa06e0e99137f6b34211a4d1717823fcfd4bbd67f2a3eb5ca67a06c0c42a", - "964dfc01bf5b308f58216c947c9c1605db6bcee14565da44d37816fdc0545b7c", - "8e9b17d5197e31f45bf518b1010c444abece3657a85f421632c58f7e1b90737d", - "7b7adc533d1126857287a4d5b3bc7d2fc1899468c85b870c76acfe0152daa893", - "eca88ae3be8be1e4dd3ed51036605f6d5607dc84b46a24a2a6cf2ad2c85195ae", - "77c45a6436b0ec1aa8b3cf95943c830aa205ec0853e16b2fa7a0163cc6671f7d", - "5dcd0b1e6d45f02abb0503c3fb10dcda86c4693bb764175d0851b14fed697cd0", - "e7276a7b8561762582aef6a95bae45df9638e9bde386cc7a378506dc1e772512", - "8bf2ac49178b221e8467f8def1d4f178ba81b2af539d18afb63bffc75f142fbe", - "3a53efa1fa165067c9445c4cbdfede2f4973a0ec8caa528a8f96e447833919ed", - "402e7e49cc3d2b6a27f169297b4c0b191d37be43560ce4162f0a5a2fc970a388", - "080474cfc739f0fb943d33a1cc49a1067abb85eac7f08e9878520bc11591c9c5", - "12784d96050e73f54c3da6a87bc66127ebc9b0ae75c0f55f63adb2c0b7a22d5c", - "6962da06c1b7dd7f6ff4f145672de2de4c96cdcb01c80d3d3dacfd50a90b1279", - "feee94897b96f6989a2bbdbc395aa5c2e8923ed3ad73b2b63c9c90b1a97cfcf7", - "c0fb802e73324f065964ddcbacca17d04bef4f6d56a01f5dd7d4e1ace8326993", - "d5ff23fcfefc00c172d9e6a86cabe85e2efc6dc32528a5ce18539d78ce45be52", - "759a37bf53ed736927f36e93b9a37c4ce5faa715ff56206a06f356ba2bec66a7", - "8599eb46027407e4035daa1cbf2720eee2588a02d84cde7f357f861d0606bb0e", - "caef9b3a890988fb267e53462cd76c5a3c6de5dffbd4d5213561ce4fc29e86b4", - "fc67b64db202268acbb8e3672c5cef5bff88be93b434800ef5494a644ca3efe4", - "aea5833f85772866424bfe84da1efe00ede125993b3b983d2ce62d7902afa360", - "fde95ab466f042174b2f75130897447e137fde2e247e827a111dc75a1e1e5fea", - "78c66723148cd077b443ee7c9c101f6a78c8c25ef86211f945b47a2a09688df8", - "5656a866d351b6703d248144d393ba36036d6b71ceda82748a9b0bec67e596f2", - "e17af0b790e38298f7364f6c578c7406230bb7a7d08796752b5d82e42f84d047", - "d0828b5c3de5e4815a0bdb1afae98f102d66dcd256095c309d633ea360474a07", - "1746c94bcfb47ef6c20682c4e8b362dc128002fdf532e32b9c17280ba83621e1", - "b6c1a316897b905265b8d16014f69fefb4a059f47e79bb7bb1a475bf7be6225f", - "0182916fef505e7efc3063c92b91401e149c41d3abd4c4dd3be9d32aba240616", - "945903353d3c739c4fe57a7d47a1d34fd6269aa6e74268b02828acc6e8beff31", - "efce69a21b31276784a2e4ca34c78bd5f4b72eaab6746bfb0ceb9a82329d951c", - "54289d64d697fe502754d08c1ed59c53b1243829727bc24b22460a0f8b2b8959", - "2941a7204765cbb7074241945f76e5fb382d7905ef32944e40e086c943788c87", - "f64eb497ad378804d3785cd952a8d0704f75212382e20ffba24cb9a668897d15", - "c775b9fbca30f28d3489e26404f2d172bf5f0ea9c34f365576f8591c86eab8ba", - "0ac71ad6643355609bf45eeeb15177e0e3b73905047d58a0150723d27c7da5fa", - "1e2291b23d04d311f29271919584bfd9144404ffc69c0a84632279fbce1910a1", - "4f849c494fe6e860a002b0d3b05769fe180f3df92699054c5cb176518921c53f", - "cd9798607a89cb3600feafa5dcaa3fbf471062b10534ee7438f92ab7c65a90f0", - "7fbb0aca8d5001a5cedf9beb7b05e1dd7f242bb0336b19734d48b58496b819ee", - "373fd0c4c8c48fa8a863d8416a35005a35d0a21876b530787ca2af9bf2256435", - "4513d7ea518e821b62766ce21ff479965db954aa4e3a8bcd243ca5ffab770304", - "53a8d9f8cd949334780b4da694728bdaa613e27d388f3448f4d7d91f3b89f20b", - "4a9c33bbfb93b342f892867a5fe510ea1a2e900b9fe272166e6ba0870581c1d7", - "0083ca88b0bee8441c649ce01ecbe4dc331a45be7603a6f2e95e3e7e0d08fb60", - "7fa79fb4b68fa2a511096e15b5cfda6feada4e85de9fe17c8a274b7ba22a3962", - "c16e17b26bd8db54a234e688d3453958982a972559d7937668f8b65268eddc54", - "5a1a3aefe8e99898caa822e4024bb9ff8404abf45a57c5616093c84faeb69d4e", - "dbabf45056dfdd155b742ce1dbf601c46e85b41c0d5b2706f388d4676cdfe6f6", - "d3dc440d82f69ba8c0d7b1decc1749fc694260a1b0a6172914c977c7094b20b4", - "23cac85fce66b565fd6afbf83d6aafdaadbbefa351e8d61480e914360f025d3d", - "13393fc5aae979d0c666d270f313e87f7b41f15113c0b1a19ba28a96dd09a76d", - "579a90c5adda1ea6f4e640e7d6d6971f5bd949c13fd19c3333ff4afef5fe1834", - "510ef677cbbbb94d6c160897825fc61eac2ba4d2628eeb2d60495ca5fe177d62", - "528b55e63d976aacdc8b238636c2503d55b97be8922c638f19960bf1f5e1ef94", - "26d33cc064320432dd0fba84ba3bc81b6f2f4a17661725e40d5953d6a2f55ed5", - "be9a54ac732c495cab7e8b331bd034bbd3ebeb43590bb3598a5f96474c5dcc2a", - "8e5d63006b51059435255b2e8acc423e50751171e3743186556baa3765ac6c09", - "28b70af6d9681c5dbeb1f59576b0ea019fa71ed0eb824ec85a82e9d127c612f1", - "64c79aacbf521d9a0b5fef0f0eaa2a3e5b399a53fa9000a6040cd1daede6b962", - "6bc6ed4b373bfea2f41ebe6857186aaa5ce8f4fe5266649fbad3ac96147f8d7a", - "30b5ba4678cfcb3ec8a8299068bab4dd581fc85793a6f99c1a0bef62e43cbc6b", - "916e63b1d33c67aa1473d072fbee64464d364f0cae1febc201375a0c76a6e008", - "7b77d43a72bd748c9ddb5bc099d26aefe650777bb0d2eed2f41be83d8c94e2c2", - "5516b43b45bc2264d89fbc7f7be295dccd4ef9b10b4c7453f7cc32cbe9171e47", - "1dee1a720ad88ac4bb02ac9d3794969f913a05b62e15de775f8c43adb5062419", - "e13730a46609543ddce5e20c7b54046b26544956451b2985b91209b47944a5d3", - "e550b2524e5c112ff76b05d249b7af1f54f7b4236e9dcd817cf0e6e383adf413", - "d3cf7aefaa1c400c92f53248c7471f7795f3ea3667ab3010194b936b0b82c947", - "4c421240a41c98d289acc4f3e393e602358d5c12c544d7970021d293fa22c567", - "8ce305fbc1002f5f9f61c3a4fe517046e1d4f5dc78cfc4d83d687d671be078b0", - "c3d0f9699571364fb6409cc394e5e3b54e3478633344f337fe620b72556b17d6", - "172186aa46031c0f5ba47c63a1599e694a951fa1c5f2efd791c30bce14fe351f", - "9179223143649be13a7ad0ff8489cd7ff8ce71d02d9858639b1e85f256ef315c", - "2f528d850cdfb33e70b11a0fb2cbd720a2192ba7a27e5f62522c7057f5ce48c7", - "60f30cd89509033d61d01aa8ff9362b48b11c3eb0c6b7dab21e9eeb3bdb93bdc", - "9f3768407e4686cfd75bc01626cff4d555535edc64ec52315a142f04bbad2eb3", - "6d4417cb328570a95f2d911c9ba48cd9fee7eb16126dd22f1760e440436efb46", - "d6177906c387337669fd73f17440b813b71941b4df161278f9b8c72b799d231e", - "9d90d135b99b185ee96ab91802d7fdaeb292464f5d265a09a2eb5e4628627e34", - "255dd52b73e88ab92f88b07e0047394ffdf1c31489bdff640ad73fd3e41a9199", - "f01df16147f5c24301962035129c73eaca5c5a3b8faa4e8ea5349694ccee6d4f", - "aaee41f9c6c432314a484a6720febe4c12edd476404b7ae9251a14a6afed2354", - "0ab97123e0cf67364ba383bb75dfae17f2f71b16176cc564be189db28c64a90b", - "619876d9a2ff2b0058e7a3f46dc95718b51b69eb84ab5fd8a1b709cef6aa1140", - "f96fc742e3c3f8f439a7f89a5709fc7cbd28bf42da985326eaf40307b0dc0694", - "bec56e1f43d25bd3db4ffba9b8214c2570d41a68f4f1ecfecf8ba90b6939243d", - "2d6404bbeb24184368274cd50354e5cf0454f50417990c5e5e305e3589eff8f8", - "8e7111513c3074a4fe065650bb54467d4b165f5fcda12dc42d4250f6c0a6deb8", - "7af458b8fb59ad1684cf5b3acf9235cd6ce749fc1e0d186acb0f7e3842224a94", - "a15ab213929a92bd3a86a0402d53b08c882fcce11afb41e3dd61f31891a2f0c8", - "c3bf9347b3b13fd3f03f0de8677644071b5789527e774a1097fc3fb1bb39a7d1", - "2e1297e1033c7f46f581964880ff8e294c033cb3aca0a2e61fd32c85eee39cb8", - "918eaefd63b6d060a7f081e5e08f0c258020196d3ddbd7d81e300febec193024", - "73d361f39653842b61bb7ff2bdce0c4027a6d17a2637f68f50a02726bc66796e", - "4f23adbe01d217324584a5283133a4970c461e02248a1e65490cbd2cabc7ac45", - "4c34005eba848cd089974a586d54d4cf666b1daa6f76538e940bfa364c9c2260", - "81be45e80997bb1d8b3e6c56e47757949f1eb081006aaee8b81eb953ff8c05e9", - "413a56403731b0618b7899bed318faec40263837a12b899ce4c2025654931cb3", - "085bb227ec4cdf9c4f51f08362d6a7ba98bec77f94bcf1922af9f9fd5270e7b4", - "bd650b88d14e667e2673ca7968954e8f249fbe568fa4072b26334b300b4a942e", - "044f46100b30a938644fcd36c3ebd2fdb5d50d1b78fa9fa3d87176fdb60f42c6", - "23e7f85cd82c7535ba06ad09d171c95aff93b2e2aa42f24cd21a95f1b4a5cf4d", - "08dce5956376ccbe7187c5524428790ee49a56b317186982c3d29289684323b2", - "cdc29215097428dd342d5dc4d9aa2b31bb5a4072cf9df3abae95fa9d0cc88de4", - "f13f9625b3c1b521ed5170af2f364e7d741a65204f3fc81daab5a125418b048f", - "40402de85bb31f01b29d022124c675f1156d98b8fdceee27f107aa3371cdc829", - "8a3d8fc69d27c134f4f9ab6c13424faf8962ea992f30db1df7be307ad595f3e8", - "20b5f66c6736ca552a543671dcbedd38ab95af151ccb80d346613af547ecc16c", - "f3f6fbd19ed410139494e9592ba5b1e896de660aca46d0af0dd784a1c5e41a3a", - "45549849cd6a7329cf83a61a794d2fe6d90f74d6ba0d0d14c10db42af8fc55c3", - "6e4dff3e82ceefbfd5e0f153d28eb487045d3dfbb3806bd265c1750535e81fc9", - "3719e38accdcada2069ddbd8f27ba1bc62a77fe1ffde6f493b80d9fbf94085e2", - "6de4744fec9637d35eb2a548824a64a1ceaf71b0901983ad5e4c08d1c2ab65be", - "25565c23170bb5d3928b11f6f2efc388812278521846603abde70337e16462be", - "57cb75527074026c56ac667485f24faf5ab5824bf5275cb963f9e58464da4f6b", - "15a2b59678b2d2e473ecbd60916364f1ad9522764c7ce350a60544977f747bf0", - "a0529ae35a3ed74a6245c10fdb57f0d6aced8ff7e591d4666da06fc02c1d1601", - "288cf0fbe445f620c1daacc8d63c8ab2906ccebbd03966e2658d20b3c8bf758b", - "6720beff3451290d76dd4d683bf6d61a7247d9b442ec430983d3db215f18733c", - "e2c4cef2f71aaa5d3a071f47dd490713206df3ab8cd18d102ca945ba223fb9af", - "96990a08f9f8dce75994374ee76f12328468e211259768822141d37e3c8d886f", - "53f4c3426376e224fc8590a656315fb88367dcf5fef591e6eef3869583c34203", - "6cd4c7d8d3d69d2cad961e7bfbc1d50106774f1dcbae0984a63b45115106e75f", - "99f90f68897e89a316e25dbcfb82e5a6cab70b82b776b6367cd6c64df4352902", - "0c61c1a3d8016b2f5d787fcc96a1147e4b708059b3983131cb8ef1c61aaa3251", - "886646d6eca3871be6b201983aa36f3cd89a62f1a70d0463c89cc30d66b574c1", - "86ee67db6b25a2c9fe28f98fa66d5b0ab4e7ec89614e36d648c6198e8ce03de9", - "74fb0c4784a1d4c1fbb9a162c554f73423630cf54db307a9c841fd2782121d0f", - "33be14a4796ab88a6c594382ad5879d3c7de5a082cf88dbe45e77b9eb8a8823c", - "9742021d9aaee12c20606e89da04ca4ce78b0812cde9025b9a6b62d079d4567a", - "9de427c372b0810bd085fa85127c3fde46621debbc80f3f885f1315404214e8d", - "97eb5a574acf13535e377d0e5022487495bb6632642f9fac2b34d0303a980252", - "932dc6e04af81e8ea24c09230ec819b417b60f225f8b5cc6d0353fc64a8f4427", - "1adcc4cc41d9427406329bbcf70cfdd22a6457b315c84e8823acea43b341b9c8", - "85fd9e0975d4d7652f4b8aa36fc6499d61465cc8fc1900c4bbc4ecdd83ca6efc", - "5e0ed1edd5f5e21ba8eb35230047e6272c8ef518a2a4fba3841f3d396f0aa228", - "a8b8dc1eef2a3a8b1c39cccbd5fda03b9207238f5473c909b41f40066f9f3399", - "49d4e2f8a7286eac87888e211dedd7318de20f7b17015482535ee42679692df1", - "66b5180d6b0e23498009050ddba58b6db1d531b2ca45c09b9795aeb123ef509f", - "a3c3cb33838c969d68d6a4929b6ea3d9a4c4fad4ca2bafe043918b6716e24e2d", - "a7ed8e216fd5f52fa07fc8e7036edb9a2299e933f014f3a19876fb6770b06481", - "3adf8c9d2fc67fe2e13dab65480b512b90abdbb847b74327196690b1717c05a5", - "bfca87f047cc427da00781b79391c02675384c107ee8c06f966c0e6986479eff", - "31bf8cf3a903ffab57a42da65dfa88746bc46be86dc02be5f7e04425119bae51", - "d2e9c1b4d0a7e3cda23678c65a7ae784be270c98566650d5e85286fbc1e8bd50", - "fb94ff3112f83b96773bf611208e48216df9fb6cb8a5cd6ca24e4c1bbf1a32e3", - "dfe1ffd9590cef35368d10ba5ed5c56f4c2b7166860eda9a0742cb7b4aa0348e", - "8a43f28c668abc089669b5e292f254329e75bd4a076c7bcc176f42f70a6fe068", - "79f0ca5c41d05cdb8838058dfa26ba493ea0118692c78c808697a63a3f8429ed", - "f04d51f1d7d3fe1c015f4ecaa9d24cb8f5749b53dcf9c9388caaf5d3a8b381a4", - "4edd4104160366755a3c59b5b75c08edda2eb30cd5cffd75f1c64bf7ac6dc3db", - "6b60551907edcdc11ef938d1949c8889d1fae167a174807ff51f612d9363252c", - "ed22059630f716e276040866c7d32b7c80f657a2ad2dbc7b7698b30b22270b43", - "316ad7ffb50277977023dbaf635084db48e5d4638a2ee07e6e416f5bfa7f8544", - "573a5a14cb62ab1e6e5949a76f953e82bf3922778ea0a3eb97fba0dde7618a45", - "f3fab6c123061b5bffbb7b0d57f33e32285e373a9320ab73b491f9f2cad68943", - "6b11675ecff729d354721601da30b9af9d85e89804ace1abe375f53f35d68a65", - "be8759f702dd85075e8adbced76cf8b6a267d16f5c908a62d76c82a9147da6df", - "a4f19f54e12938bef2ea81f80fa8aafc43d21f26b034f8a45b1f68f794bec203", - "b5fb0db7cde6607eaef52961046802724f063669bac72d358e3ae3d143c0b383", - "63c226f93b5fb71735877714f743391038dbd30c7db66ff2da78d5d000310a70", - "d09c6dfdc715c2fb20231b121b84c5efa4275dd9833e83295bdcdad5516a7860", - "8b7408aa1b966c0814ce67880b83a678164cf1cb4286ec1a16eba2962c255d4b", - "ae6dc5ee37440750e934ad4463e2330fb4331883da6dc0243809a7917866cf87", - "45e9ca704a60f9bde39d9b4b970352e9ecbbe4a919d7493d38e3dc90821d7ef5", - "a0c2344e0db6974716ee72a24b407aa7abfa366779f78bbf92fe27633c6ab66f", - "50f693517a63b1e013689cb80cea20104af563994254dfe4882aedf4a44df940", - "6efe0d5631ed920b3c91e50859d975b86b2a3150971d84df49980d25c137b694", - "f8817309944eed8dc8d1b2005c29ab4f16ac6dd6e5a34eaf01f94be5e4ca324c", - "970a193a143c445935606145f01aae110cee2c5606c0403d27810f81fcc07e50", - "b28a3d6aec1b7d92fc2f74fd39162bfe0ccf1f698cbd5d52316145ed94e2e1c2", - "6c759d99adcb5e2849fbb74b16585936e81c08958442eb6c2485efdd6d06b97a", - "554c2cc343cf3338d20ae90ef41234517b4d768e7d5e81457d4a2acaeb9a18ca", - "a0e6e150510aa44c1b55bb82fa4f90325007ff19ebe1a076d8ffef3757640c43", - "01892da620083321d1c9b89cbd2c2afebbc2aef4f0c3fc8e788d8f781a22f122", - "210daac4d7829ea0701eaf810db69fe427004490e3a9fc4c0037524e3efdad0f", - "743ff86f579542b706d2bc3176ffcfda5e1fb1705ce4cbbffaea8ecbc106e6dc", - "bb870774456e2bbdf42a6cde470da69d21ec8a4e186cd5362597bfbeaf574227", - "16ff1869368eacc29a16b68879ae139253580001b98fa4bf8f8f39106f73e43e", - "bf4c5c309bd81fe8e221802ad530ebfcddc625c2e71793b3fa3bd2de3eab121c", - "541dd68b192785ae674961340072e62da1941ed6a1666638d78943050cf35a40", - "bab7f4ae2d454204819e8be0c68e850dcf882f626aaa5f0b693f4e5326138858", - "aaec9135c599575881387b9e6e488f5c08b536872e87c6cff2356bab05c4fdba", - "1b7fccfa9686fc63a3e304a8161bdf0eeb9157e91c850defcb366ecde028a2d6", - "b5a03f4b8dbcd8e4b561b1474eb4ffa6b60e942c0162bbdf6a910d5e752ad410", - "a173d64f2844ca51a00bc6968bb3eaf921e4772260d18f7842e47d957529519a", - "e2a56bc7f64d5b23fe4b87af666abaa9cf52d9e4f635c24070d7c248e3715a89", - "c9f4d79a25f06bfbfa661fe5bdbc66103d00bc75e40cacd76367bbaa8fac3bb2", - "7e9636dbeb71792bb6fec7347b1d0c83dbd9eea8666e2b8935128ab1afd62dc6", - "6df32f94ad290c3d72b202b7b72dac5b78dc14b1ae5664a37423283ad8550712", - "95f927f413476d0fdf734ab456c68b731a7d12bb9f2e2dd09590948ae6f5caf4", - "b414abb3fbbe0ebc46233bf6b23642900ff489dc583140da26c50fe0607ac0eb", - "860c1117d2f06522ef77d3e95cdb808e3f94ba2b8f6ffae5bdccc0d8382869f9", - "90cb9d11d6f9f121aea6322bbb7666516d76258f21655b6ea28875f17d51c18d", - "834c36aa7d536ca4172d84df5ebc296ae68358dc9cc386013ca08fc77991d0b2", - "8a02b612e34d67c040cb34fe8ffb716a3c1862434b1f4be23e75ba8a25e89fc6", - "9ceaaded77de85d45ad89f214e1b4261900bf07b1428a934c4a75fa871f7fd56", - "ca60e56ca1f1a7627006d4d17225f1ea7e4f6bdf897af9b8bfb41e123f56c2eb", - "5a63bfc81a10a00436d49b165a2d97ee169f0c779fa139a2a5a7b271156a9185", - "d4e00f173af1c436876f899a4a4f284a6e95068a3fdb36cc5ceedc52edb44849", - "9ad5dd51f63dcc79908590129313db8a2ea12bcaeffb0c0346af5da548e14cd9", - "04c25719947faf5212fb4cd5b7c3c4498b2c8b07f86215d247331d2e05c7d29e", - "384c6b3fa32cf48b782c495e6ac0c4bab7809a76d46c3013ec03f3f54958780e", - "71ed7deaccfeec50e6cb0a21bcac57cc9f72fb9c20a6b80185db964368e495bc", - "c54345a76a324a933b5657741e41719474466c29dc217726b59d6c61159394ab", - "4c657ab20390bab953b259bd0b9a02b403b7a2be12c49f51ff1e8a2f1a1e38d9", - "be62c2ae277603c2f484ce2072661e65903f40ad7e16bccafae4646dfcff857b", - "8d3eb462720ba20c665b104de4cf4c94c677c3907939881dfb00b32efb31079d", - "b26758f776479d69d9f574910573215561097c5168ac4eccf57d0518e74d7e96", - "5caae00f374c685f95a404e765fe6ae49244f19071d94cbbf2d3de5dd77bc18c", - "b8d2d580c942be4a7c0e93cd6bbb2a26f82880d6fe23c3f5478a95d8296b3cc6", - "ea6f82e0684d4cb3abca9f76dc365cae4447adb67b735eadcd97d3afb76a6a96", - "cf6f32e04fa6a47ae29cdcb8cc5f699f599fc6a4cef704943e55410875a2553a", - "6d084c88d6cd7afacd7716383ab763eb399c44e52aeac853505feca4a165464f", - "08a08e86b1f9eea6096a5584f6f6f3479e1c135bd39c9cbe22b4f4ff2646cacd", - "64aebf00e2d78f67e6e40e1b75801402c9e314b854eb24d647781b6055060169", - "18ab2c516212b6d3b3351b5cc9fd8430b0bbee03cc5733ddcfe91ecdb52e1f4a", - "fe217adad0f8f8e9bbae8c1782c31e11a28ac092fbf3d556adc2d87842093f9d", - "01d13e623c429a4be68328ccb26ca32ac0465cb0934fc18eeab5165e2e34c753", - "62d33f86b729995fdb573da1ab965a93539ed3c6ac689f6bd1aa73ea022b14a6", - "1665f94b5977153bd6191d61352694e37a53f8f70819cf96199608123e88b53e", - "a89415b596151d82a610d3f243b2aeba5d9e5c5fd9126ac444e2b96d79271ee8", - "e4e4998fae06437ce31e8b6e0856ff97590ee393f5ee5cdde7f9e9416916d916", - "5690ea2a597c164c7c5d8e2e62a76cd49fc4f70f67afc61435ba4a05c51259c0", - "e7b88a938ea40b3abba14da8267a9d34197d95924b3c5106fc629b88579c3bb1", - "d6feef23796a25f8bc353a4a50a500a28a28f349df7b995f5516faf4987cb167", - "646cda019a09bf22240d1c989824ab86ce3d936a960a4439a3752b54733691d7", - "1a5f1c4a77afc30d9e186758cfb93f0b9c63409ca4678467737ca3cc6d540742", - "012b850bbbb9248c90877317aa68003531d84ca5f4b4e6886eaad564f7ad475f", - "548a9a92bda9858ca477869b0e8b525f0b34c42563c64ce8b3a8210f047503b6", - "6f56a87ba22b118004b54e900c9b6f56bd3b254855dad5dcc32fbf9ecfe7bbf8", - "f6bb2fe901e58e8cee37e97d30c45614c440bfa017dce631d744196a6b9d2f52", - "ce4647f0a07fed81ebc8a9b1f2b75d4c1e14df36d343e6dadc5ee5820b537f4d", - "b2317986eebb7ece0032e774df94eff41527863f05b2e48e3a7be7a5c5c78536", - "4e3c07910d7fa00366562685a2ea559466fc9271f4bea3caebe7e11cc404326e", - "a2fc862ecd43fd29cfe8093d5b6151b031eaaa74a40689b805cb882ef8fc1bdb", - "cfcd293bca6045c6d60cb555e4d07fbfad97cd1f3669e240e4ec6f5ee22b88ad", - "dd5fecb9b98d363ecf8bbd20dee343e60d28704190636fb8f9d8500998e58a6f", - "a8d944bfc4524148e227dfb32567a6c4af543a94ac7406d56477129526e1835a", - "2ba020f94c01220ef12620a6939c56a3886e35b57e691791a5c645ecbf419604", - "3e6ca2e54884174678ab422cabd12e01a9e7ae96e7d1e23bbc1ed3939a49f383", - "55c0d7d792fcd5f45f7a01b2ddae93d75bd76545da6f2858ad4c36f0a0139b28", - "bd4413d9c49138fd743e2dbc7611be9c7b2297cb5e29089c7273524241e1e80f", - "38aff433ac6cc31b45bd57b0b4fa4b8b859bf00f7f5de410fc191e41c16518cd", - "861c40d2608fa3d9996f99f21416f14e0cba7ca60e6181279a8450017e885808", - "5c6a951cae6b776f5d808a661fbd07c7008925209b1a901937f3a7873647172c", - "f3194da3722ff814ac8b61975d0a4ceb833ab7ffc03fa30c17368adc43b20c35", - "66e82617d9f71b9057a226144a6b71be6b06832956e333cda9a398c5b9d07c89", - "070bd5621b4d6d55148753d7c5e8688821f00d4bcc3b1e2f601960bbab5aa4e4", - "602f3a8cfbede45adb16626f878ff345aac1b9252d1d00ced6978983e1e729d6", - "edce8848642aaa8860f1a645e0c6f7e1464d23d46b86d43c280d7afeed0cb265", - "a43397fd026459bad6434c7d750238d744dc11b1d5e4c52ae787f55d5c24c750", - "56de65a07e9a0d251a9915dbaccd09768dbff25ed955770902d66885d36c5645", - "e0ea5e44a0db355c1b9e7f1b479f1dd1f8badc1b763a5590e42c669c402053d1", - "054705c4f29029c62310a52260584c98a3511c1432135fb87c704b7449b8d8f1", - "9be4202627e39757ae3beeb26ab47d0700fdf55ab35f72316200a8cc5fd818ce", - "239060feb837688a5af093fd74c2e3137f1152247560c722bcfc050b6fe2f9a0", - "e7c4be9eee5dd7f6b25f9275fcae8376c9e9be87695091c2ce7126fa1fcfaad2", - "a3513f0251cfce39ea81016ede164987eb404d27d60a018ae998e2a531e4f5b6", - "479a0308fad7d9e1a451c568c6afefa9a612613dad164e3313cac21ad45597f7", - "817e51cbb979434fcc3bb42b9b44dd78e6032dfd86c669e06615c045a29d7382", - "53cf573f31aafb551d2391f30fbab781b8b09e32620b5d177b72a8439aedf2dc", - "59ee4010a42c9edbc24dfcf4da4a322d166f76430687fc77f24cea1f15d70831", - "8b2398aefa714adad33d19d925aa843c1794c82c447dcde052473d541bdb4e70", - "88368fb7f62926ce3408f2b8fa8b08b201baa684f1838c1c5fddcc4521597d31", - "7210ba1b21762e959952c14ad1c2419fabe82bf0c0c0c6f7198aa850d8024d72", - "20ea1447c41cdbfc55730d01cb17217dd34fc43e1d62f4f64ca4f682a411c934", - "589ae96e9128a2a906eab362df42386e184f010b49f06811912567a67309787e", - "0db6d869ff4f75a17db0ff87707a39603a2d4734cca9caf22bbf97da9d82502d", - "a4a7b9806c3c81152f1757f118ae9875bf133f923212e8842b184b7e3fc73a38", - "5e884297de7dba8c7a18f7d47c6910b634072c059f6f1eb9b066666b078bfa0f", - "1552f8ed5f9030256dc6be8b3529c58e22ddd0095d293e5b5a176006835c9909", - "d35a90c12ed096fe72460c92eb1636a640e9760a761e90850907e68934e3a506", - "87a2899851fb68d7915cf46eb74799619ac65bb52fa81ffd1ef5e2f5fa126b43", - "7cf4753f11947b0d9ec0d12e58b26714bddf3b16bec6b71562037387dffa1814", - "334e9cf9f155a9631a122cc6dbc90889932dbedaddfedc0182e8398fa22a9bff", - "ae637d457c6a4653985e2a5d7b63eab62ea1485071a07b45d5b07d89233a06d3", - "d6e22a7eedbed66ae63c7b379cd4df9b0463fb7e1b246b23b881687b7d2a4548", - "086d154cba1d74449cae2eac2acdd2e4476995ec7450a0338626468699d5462f", - "9b66563722d3f90e81875695cc47e73962c8c0bfd9b8eb2603447b61aad13a75", - "f7e1e4ead823a783f981598238dc81be59852ce29572196fc8c365187d6d209b", - "0b30d9509ca6c5f7c5ea336d89d1a1db5a62b648dd3e613449237680c7f1d21d", - "f455871e662b5eeafc9f62d1ecc5dd6da1c5f15ff317de09323754d153eafd9c", - "e6495db6dfefe758df8a2a2feca1d41276faec19b5094467bf6f9a88d6a54fbc", - "a1a989368653f2ce829292433f756e3bc38ee0bf36a472c16b59d7c5c25a03ae", - "7193bfbc5b71049fa781379ab967681d52d6d3a79b0dde12a4212ccba8b217aa", - "c824da9694bb0d99546c24b0ed88243f88a53f21b9f8dc419f835063ad8d33cb", - "bbd10b8178d580151abb1734b4f0a21de8c4157134f578d183415abd941c7cea", - "d60ae9c3d53dddd2f83eacc0606f3a247fcb445a2e42579269b04a27a1f03c72", - "7e6d179cd20b2a5eb492539833c2c20a26e5e1ceae56324c129172ae38c20ba1", - "b84ce64108a0e91df4847f2fdda5b2ad26e099273058f7f4888efb31586ef17a", - "ac695262cc8b9c8a866fcd34e9f27a64f2c08c900c8fdc34ceea46ca82fb6a92", - "f0d5cd10da4c5601bdd7fc3fd7545433803df55bf44c63eb087e0bf42f77f5e5", - "f695c6e65853643f366966c9a19cb8ea43e3a5f9e2c17a5f1fa5849f8736e964", - "e56d1471a64fdcdd4019ab9737499e3cc924923536b438da87df5acdff736443", - "2db2bbad902670535773ba8844aec05d094b04966a8e206481f23102e88a7a05", - "ef152708631ae5f20d7a9ab6816a404ae4e4269d858077264fcac70be40834e9", - "31a08b1a7792fa8c65853bac794ffc3c84ba2fff3bd5d48c994ff26d6482b82d", - "cf79460bca26f2388ab4a895b524886b5136cfcd4f72c5f7e83fc68c02a6be91", - "2732295181daed7ba769d168e9836acbbef48baa02bdc2f93705f152f5b1d370", - "2c6f585cf0f71fe11ad428b088b701b6ef524791b3ff0a4628e715d2c917a6f4", - "5397aa6569937dd367fc567df81c611e9949a96e859286fc694f61036a3644d8", - "8a5c70b57b0cf387bb15dddef022582501128f277d5d78c2b688e843ef4ffbaa", - "deacaae135f1a571c7a970ac394ecf5f334607da5095e19fd6331f55e8669d37", - "d4c8c561cdac4166b34f271e1ccc4278ed32d1f11246cbc3a9298991dae2178c", - "106e437c8229dd714f415f620e195219a2ec2b62c4dbc2ef622d3190de84395a", - "f311a48cc2689280024ff60c6da8138b139136a73fd190d2ea1dd2c3518db99e", - "e18795d945b8b582b8fe7bef65184c65c50804471a810f592798f0bf4a792ce0", - "8c64c4778cbbc4a1f9d70abb97081d9829e19ccea0695749c116e22cd062fead", - "886808fc8c1124271cddd2e30345e9adc8fcc289c73d9f40eeeb0667c65ddee1", - "161058ffc3e754101d474a4c6e4e46f9c309e9987dc958c1a83f312bc6e42e03", - "efbd131c2ca7de0695335d5e4a1579da404f39efe7f2305f8e8531c0d3d20c82", - "62bbfe36ad08e7167bdc013c9babf68dd86ee9ab6cff3f1f558d9526a4ab605f", - "a7f5d4c03a48859e78855e23c4e3189e71c243023353ce4ee1f5459c3c729b70", - "a9028f4c7958e0f6697cc7623b293f8dcb8c7b1b0f465d9f230582ac42ce5a0c", - "48a69fe3fcdaf6717c276ba47d034f20f60a0aef8ee5731fa81e325214fd6764", - "9ebec1acb38eaea88ca122870e99a00671cbd06ad013cf16ed10b98d47032177", - "02a750fadb6023ac7a1c2e5da9d43a6b6ab1ca90aae095c9d7055e406ccddc47", - "3f53dade6e14e388899c90fff468cfbb0e46d3c984dc3bf87042e6c00039e2fc", - "0b8b24bcd804e87ae958988f4d548d23f1d4376c74fa88117a10fa10e1fbd707", - "14e92dc8f214886bd27a547a7ec4afbf58a4fe33c31b732019457453ee97bc05", - "d2314ca327477f74b67ba0afbd9bd4fde7d8271d38000b841a65bc9400bea0ac", - "5f794a30af7dc1599378b38ffaf5b4b67e99c6c5d00cf77d9f0d3d92be06b878", - "e61250c76eb01db7cbb3e41f5d0616d8835776761e92e97023a75438e9d1953c", - "5db240803fbfd19d79278a9d900f0bc0e521c2db8cb87a055a0806f923de5ba3", - "e5710cbd9b397c125b1e74d4b3cf873b968f0a671f0f4171e694b97c0e6cf4ea", - "5487a2a264674679d1d0f878f2308ad374d477d7afc2131262d23b147a6f73d8", - "15fb4a1a35e960f61c2d6eebdc7bc99397af093003c47d2b6a109de7148c39d7", - "1e5b126e8c081444559fd289ffd8f23d0247453be3c5c665252b4081e4302207", - "f5805496cb85f81d6c837abb9dbfb2a628869089fcbcbce38c286efe4d470423", - "3f9572452d5210dbb7a3d2e89ad85d311f8d05144e18e85cf0200e6115944971", - "03444d293ef586fca5403edd4f1bb9d4198183bfe969ab2696274bc14be98946", - "0f69ad393b62ae8f54c23d980977eb46dc51e74b81a38a03487249a6803c7687", - "2271c6209a7c48703b5e28e863fa765c70098e2fae79c1b549b4667296761c92", - "38396a8bb701b319a611218f4ad52740759aca4c4ccee6fe2280b1ef9c46452e", - "f75ca3ac25f95cb85bd15c234256f1357d3b77d95ab49990f1888cd3a1839cf9", - "de122a4303104de48a7b19b5ae98b342d32cbbfd4bcd46d1c7e443b2498a0248", - "a0781ae9e61f7be53b73817d853a6b97f5853e3208e7e45b9bed180797a32f3d", - "99b104f75aa4f6e241a13b31ec94bfd40d4468eaacc09b1a26ce77826fc5b1a7", - "d30403f1c70110dc1e371de800343e7399847b85c736b2745d70262ad44b6f7b", - "67b0e421c9618b23c0526a19e38825c5e03092ae2dbad3f160b0c508f75b38ff", - "c7d4ca3c9eb47e04552b46559442addc6c2d0893198e4ebcc65514e7cfb9dd02", - "0f1033c66c713fb01d24285ed23f6de253893f3068351ee15f455d132a29c341", - "74336fc4794270eebb25cf3d165fd848075d2224d860fd4cff91e6882b5d6944", - "bb2a31f71c3f99a864caef333534d741bad8bdd9b567a88e9bbf158b700e42d8", - "2e75d88666032e28bdced74bdbb8fb551f87c0415d47d0b7a19b04136ac39509", - "c6c6b018cc94d2cee1281c8c987baf87a7739ad3158a3604478dce639a045575", - "aaad3572f9ca026c775d77a3a34d2d697803ec0998a0c2a9a3c54a25381d5079", - "1d9574d2bb3dcda0b85ab2997ab3f97351eae9d4347717c796cff8219eb0baac", - "d2baaf361dbfcaaf93a1df5001a8c60405ae9da503e293c87a5a305f6be42be6", - "2139981d7f6a00c83dcf108f57597e74eef40a34ac636c5938719de79a48fa26", - "a4afe0ce6816ffc0b2207d5c3a45e9103089a7a8b6262637a6181f76cdc66241", - "b7da9ffa798de1add1db9ff6f7002d6197df07e92bb2dafc1b3272753b606321", - "5afff9933bc1a59583729cc2d988b4e239d23df34fc06a42e41afa2864dbb85d", - "2d2d1f16221247f4527f237261d42f099b8c35db53e1c30bc0237968fe605821", - "f1fe42f34d0b6e2b886744dd36fc3a1f21d898e34e6a005b1b6c924ff6636fd9", - "a04f7c514ff41fe84e1aa5c9786ba47997ecbc3f84e9721f1a5ad83abdb8f0d7", - "85b274ef304c39b80546df90a1258dd2f6273b923a5f2e05236d0b0e071e37cb", - "b9df6fd17a5d89178116ddbd3eb16f3bd15506b71b61c9f67c7b8a594cda5a2e", - "740be479957c7919d17f181709b1af08be8fb783391e2999df05199c1acde11f", - "8695da04525d0a9ae63ee4a50028c85745d67a85c4bc1126d89e7dbe34067a86", - "4f3fd22a5ccf95099e6b19ed6dd3200186538b37b34caa2598356d969fa81959", - "f731ded9284c66af3828ff67025bbb592a2ce830708ec903e73b8a11dd01859d", - "f66fd5b730858c7095a10829bb969482e84ec05237f45b1d1640955c37af5aea", - "edcfbd2e40f0e1f572789e62e904756eb0eaff9b70cae0499c6df5f604fa0265", - "4b3e21bd4ca62177d64eb348b663ad570bdea610dbbb5e89603fc0e0769cf8b5", - "5809758bf427751a0ac375f4ac65876acb87fe51e65105f15a009bff89b2ac20", - "238e2464c52c68abd8fe6867a72ee4aa20191149120a8463735a31dd6c5b1ca3", - "e236b4682474d56e72d59e14a6187c0b75dcf2c8987aabf93f45ed66f5d00a08", - "dffe857fcb9add26d820af242e59c63845d1f1412724f396bdba3167ad783eeb", - "b9fac3dfc769faff48ba2cc5f2446788f926f6cf2fb240dc2b1138f8b9a26872", - "975dd69cf6c4929a66d96e43c724a2198d0bbc682ad80ef9935bda634925d2c9", - "251f93d33e24a405fa2f4e751d72b3352dc0ae8ddcf32d1146e2cce337b1973c", - "8b95c434f01eed406a612369b5ee14357112c9c54622be9fc6c935f7802f1f9d", - "7e26c9b077fe721f303e350861462aa44af28e1dd53e12aa42d2e7bfa17cce5b", - "42baa40b3a94a00e6ff0869d43da73efa35a5426bcad0e72b78b5ddfb15d2986", - "9d782d6feadb9eb7495cb83865f381a65608366a5c9f1cec08a9265c86c91134", - "917f9b46f3ce2a5488f0fa61dc28c979bfbc9aef6125e84a970390584be55476", - "86e4c19c191c266c5edb1a0c12796534858e4fe4aa1588e06c28805e89d95bfe", - "4487e41bcc3c74ddb444f63a321cc0aa76c06a413ba9cefd5bab414e95ee6834", - "f6df74727218db24238e731c24814e5ac6d89958d04381fbbd3d7fb9a82dfc2e", - "6a43456af77d97c6e2af8c2dd1eeb600d779d60aede9a6d40318e55573f3f5c9", - "70a4c47062838bd9278f2582fbcc1de660699b0cf7109798b93c638d9eda1ade", - "06170ab5584b5b4b4501a43cde09a86a6401c069627c7b47377ed5e9b4902e08", - "dadd7c66d73c78452e92f3d7650228db53ce5632ef55003a8fbe4d69022b018a", - "5607e57d8dd73662e873b073f5d2698ce113b102fcd30847e3773ea84bb38284", - "02b004aab88e0ce14287f4feb2848e5ebed0d83dc02dc9cc9f3233ac78d1537a", - "a7f9798531b4281f48b3a94f48aead1e0147380269a6390da5e6cc7d4117a897", - "1db0c3787943edecb25f436beb630799cc84531157ef38f230bd1332e3d1be04", - "49d0018ab382fbab6ffdbb3b44f7b195127f7ab1e4425ed8021f5f002c875c4e", - "093b4f7af3b2663866d7e54ac4920e0dbb46c791d510aea7335fb8f695b704fd", - "818a654def4b32bcd54d68369cd395092e50c385b6d9097e6c95872b111db5de", - "6065eed9da917632354021877c6d6efe519163a3d97d728b19ec34b02646e5b1", - "b14464f58745a3e4c934af53566fa75b3d2fc1b3984445d7c17f1d87de69af12", - "6fe1b8a6834022511cb8b0d386bf092bd6f8510d70dde41b285fd824c7d3660d", - "57a15f1e18760d1962b917468671b2345afd28ae2c631db99003687baafd0add", - "5dc290fd6275b961c2004b4b156c3e5d7a42271c216e58d30c667813857a4c6a", - "bf1e6bbc1d445e353ec485e41c2483362c952b9eb22babf6c19a2319dd0dae49", - "f3041c4d4fb1fa92d8e0bc41b661961c9f162ab3cc08ba19cd165faebc13e0db", - "1ca225a2b38334e889b1a4a554c3254069fc58dd3f45d1d1f39d14af287f8ec9", - "b542c277f409c9dec349a492fd4a5be44eba6055d9f52f8f55bafa24c321efc8", - "9c1eafb69b7aec4bbc9087dd901dc61bc88508e4ca3adb10a9bb5ff8c69129bd", - "8de5a970b1f467519beda6f924f1a423f5430e95e33841e806fc33201126dd6d", - "fb0151db2b52d022a45efa11ef88038931647c3e9111b000ebf98257f6901049", - "ef728fcb943210ff795077c76806df2e26e1c6223087f13c3db09780c7b5c617", - "9cb5661366751c5a38a874970296887d09b2b703694d5fe6b9746f7f02540505", - "b1fed3fcc9015ac0565bd356231c3177fd0d31786cdaf677d8626b6e55ed50c4", - "5099e6ecf9510d62ca051ff2c7eeb5c5014c8a8b0db02fae0a7d2c81b3e54002", - "eb7a58df51fa3a44757a0cbe3296da7610704b77dfcee3221abf56ed238681f2", - "de659da1618e9f58272ba8f226ea505fba7a623bedd7f803a57274f11e6477e6", - "c62f58b2dd05482f3faae5e48fa1edd17ff740ec6d680ab69d93a90c12739fa8", - "ef6e51a38b5ea53ec8503688abdb06151c924a7a712f31e96a0763c24a9de057", - "9e3d041e998d1fcf9e4df1613a75bda7c471c2d297a3bb2c40e260cf7044ce7c", - "38179567d295bba36edf38066be2f51710d2a7c1b169af41e63dc18bb451a620", - "050a61d9112ea1dff4302f52a4bf24b94d94a22aa834109625312e8e4e31cb84", - "1804cf5791ba0c71b48bb1467a23055cd5816514abfdfaf8fd1f26ec00287d48", - "c5f1360c23d999de23a46b20bb3a1f4b5de1ecb585f62e1157d293c8f9df4efc", - "83d2e8929c8d04fe272914e23543d0d6132fd14d693b643a1db0f1c5f575c5be", - "6975d5038817acfd6ee03fddeeb0c022138277d6e8cb762a4d4cb5e9d7387be7", - "7a1e0096445426153efc2ae1c532d371a2cb117e45761a430d19ea0eb06d2c36", - "9cdf2581e7d382d13f37a6ef9fdc82da44f13b13d0ccc9ca8a7ddab41886440e", - "7c9becedb77f4bda335ed55f9e405b45338a571ed6df2d8f64ab038b1b397719", - "2f4cf823d679e9b4290def40744a1499028049fc7abed0f978644875de99fbc3", - "43bab3d842383080153dcd8078feda95639f43205c471ead0f1f07b0554526e5", - "5819cbcd7888eab690c584eafb9eb470d1fab0ef6f68d4b607d549f2425964a1", - "2053ae6b4da7cca93337bb44131910dc1a7e3192d53bde674930227f14125596", - "ae6ca22c657927122ce22066bc83a20a35209182bc944e7289ac0ea299548e15", - "bbbac33d98c797436752d692aaa20e245ae07449928a105445b610a338199537", - "9a7d254f24b57fb9478f013e8ec5756d52211123e7a1a47764a95ea05bc9cc48", - "5c5116901b59cdba7bedc01cf69311ae1e35d0fc7ea73a0f3ed390189cf36ed5", - "3953a3b11b6192408e7c38ee4e391c6a879223b140a5d40f486eb1d8ae903445", - "50eef1f16811b071ad4120667d0621fa7da91954697a8c4321b09c7e2d92a0bf", - "3b88cca305dd65d547a8fb6e33bc24d9b8a824021b77b3ae4cce2bc7cb09e837", - "5e91a2c6a437193ba954a07d4bb6c21de01e85184b247f86ab05f793ad5fbc8c", - "debc1341580d1ec62045ba70b6fd95f130277eaac4f081619aad9d77b236fc4e", - "5666cef4aa2e31a0a77ae4890a5c41dc304dd3fba4d587338de01f5143e822da", - "4310798d25f3abc07420b6df7182edb99e8140073283f65dec8d42a32642e7ef", - "77109f88d9696fbb3878276feac4731f6803f3a165344cdae2a45ed7e060114e", - "bac33c7c9d24839cf373a466cc1b548e0584313ab2dc874c46c97c86c78607d2", - "cc3b917a9b42e36363bdff8c0fffd386b63522097648a041055fe411233ce1de", - "c7a2516494c856ffa3893e50abe539a798d17f04ce350b9b4a480a7d6707e3c4", - "970c0d2ecc056c9535413360e4199e94ececfeaf0cbf840b720164dfb24800da", - "72aecbd53657ea1bdc8251232fbd5956a47b66d3b1f9c6be2fa954c08da50614", - "57a008753e25510319402498a4dead0c931ae7b7b0c17f4a1d2d96f17b654e5e", - "fae8efedcc382b2177acd59aa3d832082b8275b06fd8b411dccf0efa852333d5", - "42e71bb04ff8c8b6b9bdda236db13eb245ec8496adaebadfd231468edcce7e0a", - "acc776f3c4fe61ec1f2d4d75af4dfb1e92fd77749528b9852761278c4433ea73", - "f82889db7b9169c07946d6d354fc440571682c8e94021b05695a9caff19507e6", - "b837ceea345b5b6c6c230a1a561b1267b47f5ff608d1efee350af850b4ca7183", - "5603aa8b8f38c3f260af8c0b51531388de4e7c22d14a61e9698070527640bee4", - "47d32a159aef290889a93166519f4be240495773889c2edf8036360feea142e1", - "26b25441be09fe1000c03f1568c7223c45f52d894bd88d54c7272ef067dbc6ed", - "417842e9f00d76f20f632e6a6a0470a14474c85ca1956df4e0cfc7238a63ceb4", - "d06a3ecdf49f52e60013b73a4094904d281d451e0d6eeb4fa1048cc585ecbdba", - "09e7ca6e9e0c212babf6b38485ccc8f57e3866b923396d074271bcf30117bfdc", - "7ac548d88120da6e255aa9d795d853d4301db6920e518c452ed8127b8fb24e85", - "0f236b7da7b4b573a88259341ba66d46f12ab0bb3636fc0ca4132c5c4ea59731", - "fb4afc10fe202f51d67db0f71c89d05d800ca7278a57dec42af321316301914b", - "1d6da6557c9875dba47f51e39cf3c76bf269700aa5fab65e6f1f5f488100c905", - "d7cad6dc42eecf95ba943bec7c4f00dacbd7a0c88eb0d8c38376eed83885acb5", - "b222828e58e166626d40b734888f23da7af010265a74d94aadf7ac341fbc1fdb", - "2e65a70b4c75d212d1e132a50ee3a262f7b54301fd90c4beb3430d3568a620e1", - "1035efa54d95f5acc0d337db8a0a7c8efc5c4576edf221b59c4ac82309418e4e", - "3bd8d6a408f761a9cd4c965a2deb6e380130e4c8bc7f60c6a7d98a87db27e48f", - "2dbd53d4869ddf971bdcbff799d00b2ab579cbeee15e1fb98e66347f3ffc9b37", - "c6acd98774196749b3ce824aca8a87875e12c270b3ebbf979ba354327712b44c", - "8dd3f855026c11e8c96cc20f165d94d23842b26050cbd5ade07bf6ad6b859ca6", - "3100f4fac6daaafafdf55eeac1d1dbac3af016da2d34b8d6d968d9d6ef2b749a", - "f00014f812498312b4758f115384ae03b510ab272ff85d22100d8ab5edceb359", - "5a7f69ca5897fe35125e3792bd5d6fcdeeab701aacfac6edc4b49ba7e94e95ac", - "68cf41ff39527910370ecc5fb8b93419e3c3df0652bc09d1d6bf68c6b225ede3", - "f5a5d22500ca81dbaebcfffc2393510cc2f506331a3011003ec1d8433afaab0f", - "2816efc6e6d0c00103a6c5c1a80729c3e235b5e4b32e3dc13ce04b96afe4e106", - "727d20b14eb894a232ed75071749a05750fc81685318c8a9e006fdc29967f49a", - "acae19f04ac10c3220e59e87566cf0e9b87bdb1508f31022c2fe3b82025e39e3", - "9e2c692f1682993e750a26a8439d9953256d2650b6c858f47228a975655bc654", - "7c20aeb702590d3ca2a37c9a9797098a536bb0c09f0dcb6dc339f1dcfe521cab", - "fc68d97a5da4ed95f747b705eca695348ecb72d63bd8b6daa341aa7d48d8d0e4", - "9e513c0b52d053db64f06a938166d2e39e32f3752faf4c7b05195e18a3daaae8", - "f936ee38c17e73b9fb83edb10832652fed0ed4cdd87b35454fa49c08f72de29a", - "22ed6b742bc8bcf99a1955ad06dede0db29c6857867260f194fe87b354946cd4", - "439d410eb5a9681195b5f9f7503196f827b7ba6c075f393404e20af26888bc63", - "618b698c356130e351f3cacdcd9ee198c1cf7683e199cbda1b067d18bd665a66", - "eb4b9a6186bb7d9ac4112a46ba2a85277f6469a82f4ffd521dffd840d862a3f1", - "a74addd6b65bd3fa9f496f27f0a00ed5c00079692b4239391be8e05407b97cdf", - "b944b7d23ba6904cff9b0536a314b51c8a7b8fd92188b1e19eeef7ce4770f2ad", - "2087ea0cddd64c7e848e4473365adbc8617c7828201ab9a8c59c0728a8d58130", - "2bc39373d6aa1bfe1596c95344e0df2404c9e94c607aaaa425987d74ec598932", - "3ca3d6ea4ef61d714ac70172bac014e089d848f4b5cc7cf018f1f13669f5e8b7", - "5a4c0d7a727916702db530a6d786b6f2b819577b638d0b1e7eb2b96541fd7058", - "5204a41fc15595c9582ae131d1691974604c1de1118d02b858626b6e92370e85", - "236761b6de4cfaf5b55d223bbeb98d1e0528a9aa17c2859fe027d5aca41275d9", - "100e2ad960e46d34d41e341d463a622d8e40801855dc781d3b967efb464192f6", - "d8c40569588d47f42916bd0fb1843c5ee8df60717a28505a0503034c04e38d8e", - "fcb422bb2daf05f9b958b61c400b7567e58a5a568c97ac523adc32232a92b5d0", - "b1b54eeb85cca60b0c818306842b4d00bb1815449158ad4a9d6659258d5f2b96", - "961026cdde938277afb281d412ec1c23dd3c67abbaaa97ccbeffa95bb83b5daa", - "8196128a75b23aa2c8f2566bb12915faf8719c27b4d5d3043f49d2bdc1f904ac", - "bca9f6991ddc63d88803f43d3cc817a47095c4aad716b69db13f3bcabc488638", - "ead19abbd23cc3e30a6482188e9928d1b981a3c10e7bcdda37d5d4eb75907740", - "c19697f77245e6a7b0f49e3e02dece75842f4cd86f1871345400e7a619b37ab1", - "460657d51ab8f4df5581c9580b0c73c958e5e622d5ed8c426ce1dd724b607344", - "b38a5322b9c3849cbdde8ef4ee51aa48cd5f7e4b0cc3328d7837f020e412abd0", - "5de0d433d0c0170fc9d139cf9689f62b23eee05faa81b507a71bd84eb0727efb", - "bb00f66128fddf0649edb41f029e16dbac5eb67728c6b38bd37fff1bb192c7d5", - "87a321f13c603d8085fabc61ab7d312dbe11cb116b85b35519abd5173dec9df6", - "674e1f4b3f0d8e51c48b8a2c4c5a46b737252a85be43a75cedf03e98df659ab1", - "75bb8d76bab78a88d9013d69642c6c9c6e46cf73e1e5be2882142b45f303c845", - "dd5ac61fb02ead7cc0004d359e47fc17fab1b3d114499d5c3166f04895792a4d", - "3600e5de3eeb18f722a95cbac635fb6d21926739834d572e51d14434e66b83c2", - "7f78ba8dea25f27c9a8183af8e015a2cec6ca8bb3d6f0b29e4beb9ff7844d2ee", - "baa3ccfc0c5da5ef533cb33c8ee417288a5a66535a35c01b805c8818c0a4eb75", - "2c2a2feaee90b6dd67e5ab7dccf92e23295dd53a657e2550ef4f1f903fe99390", - "64b8df1f459e4b7ff7f2be3f738c5958438ad5c52d6b549f725e3fb4f523efd5", - "5e0965c422ef228c7c66261cc08bf62983df3c380a6b7152c67efadc34b91aa9", - "a4ac787ea31066958a373d5e495ff4dac8ce7c00447fe853030db8df756fe336", - "6a423417b5a503108381e1de6a3c2635273627e7601608473c8f1dd3efa949b9", - "a114b1e319f0d8109c60596e73e87a7b4a4b7d79a886ece3c39aeb0abb48614d", - "b50b8a105d240af6a482fc389a870892954a58a7d239c519b1ac342051b1be88", - "c219866d04daf3058ce845138bb6246ca3c02168cc8eb79a576c6fc7a908cc44", - "e38b015409368bcb03bb7dc5bd8bb11b8c7c7250a5739208f9f97eb2153d8c57", - "f77d579edb85a7112cc90a4b127f564dd4fdc06a7616602bcd7f2a0a3820414a", - "bf05d7be036195a3b564cb4f781954dc7da0f25c2c49ac7033b5be56ab16681c", - "9716aa137ae29d295d05d60ebcb4131d050e265a48743e1520a5dd9d02ce7a57", - "c75b0876dd971ccc58ebb1dabe9173b33c9d0e8efeeb6065d90114d9566422a7", - "1841e34ca1aa0d1fcc5acb098fa769c8785091e1d869b20be5cfc6bc58696b33", - "6a83e400e6f4ad1e48f739ce58537d100c61ddd057292f34b8de64d4f1cfeddc", - "dac7cbdb11b33a10b6c2b2f921c586224f1f84bccc23d49688f136efefb42c70", - "e24beaa168b93093cb40db8f38de000a9abba718404397ce822e449d9daba910", - "bbb232cbb7b85e3ca13249572ae607232910a869c189771187a1d4214cfb2c54", - "34e6344a04e0ef4db197eef1b4601b93e12bf1d81decee0f940b30fa5a2c7435", - "cfed763f74b91048a9e44654c4d5eb4bbc3f22d660af9ab6e83aef5cf9c3a38a", - "64556c51aa365c947335a405a1b9fc47236a4be262d7b2f57a0ba31be2d47317", - "0c244b5878dabe925a16ee3c79ea6e9e771df0ad2310cc57f36787437a7ec5c2", - "9960235a9d7465ba82e078f20298814404c4d3afa21c96d72d7bbc5aa7434d7a", - "e1a74a731de652d4c59e28e39dd26bd0db440027168b31ef21ee0e9ac33958c2", - "376d78bcb37b691027771b7ffa3222177ae8fdcaf567d10ae3dd7c249152f33b", - "8c1ec3496c7deea8b07b0e2a984c4235226896df05cff701a41fdc5df4715d3a", - "f67634e7517366fc838e03212a59f642b03095c455f92047e7b63b34cb135271", - "730ffe609168bde49c76942d16661c2f6f2f9e754df64672397f751a42d402d8", - "a683d9643840e360b4ba17342eb7c7f1966b2b924c986a3f603b96c5ffcad064", - "96eb066a384f08ae6bad693f7ffaa6f2cb87bf308f41a2e369b8108e6481bc33", - "08a3841d965a9c0798a02bd2c95dd993d3899c0305402602dbba8e94bd022df9", - "81371c2f6f85ab501a5db1be63f6351892d5427c17e520437dc1c6f85c807a47", - "d1bc00a28f9920a0f1513fc795f08bf40c32f3bb6118b594af34f4bc458af942", - "e6aa56e24b421e8785f229db57cde346592aef1e0a719d3b80e750e28f78f9af", - "8459a1c00f0cd12289b1cecbad01a6614b6b6e19928d8c1386dd9e083dc68a0a", - "744cf2cbebd6b44620ade7501010fa3369f2b58d7068ec9870e3d2d3235bedc1", - "ee59891e5f51d8c56a16dfa12f7924c5b1344dd302e168ee9c8509ac4cb4143c", - "84cd18113a7bb7beaa3d56d6359cb7c204fef34e4af5543a72283960a20a8c7a", - "7ef3c7f4460776559f34f8b83314705f3b8e6a6fb6009b351204217c7fb80fd1", - "45e97782dd299a884a714c081b4165a2d0b4cb681279da31b2e328efb501e9a2", - "0c44625d269320338abd38708c78d91ea6d7cfe2702e82c333fa77cb475acf9b", - "705cef88f8176221508fbe26f62cb5f823a521468ecc70c7086482c5d31f3bc7", - "fbc9e245c40449824b1b3e452b04608ef080d42a1a632752f955d2a731029cea", - "2dd81800c97c2f9f700309fe2882327798195dce4a3ff7994a2790b2f92a2582", - "824490c526a3018732e7185177509601cde9cf006dc2edbde91f54bf3bc1d18a", - "f4127b9a2324ad7389946686a3e4e4bcd13bffe81427c97eb9580aebe707d7f9", - "10c001064d3e47e13715d1e8096b3da0f94589f2b8be685a069f77d4c57c0518", - "7b8d694e6d317a02db91f820b0c4eb45c98fdf0a28f7377f02a2d5035b2b2c43", - "202f37192aca5ad1ff8beacc7fbab0ab8941cf4272b0ae55d60df2a515be5cb0", - "12364f98567ecdb7e1142800dddbb19306bda6b2a9f89666d0aa22ce161e2c7d", - "1d7a325a734422edeb0846b34f0110a26f2f005735f033302f6ae00a9aac4aa1", - "b110d7061adb9b36d011494aee7c2d865e3a7e1b9d787d403f5c06db579aedd4", - "9051b3379367f6faf17f849616dff81789e8ad47e177f6e7ac5c1dcf83daf4bb", - "e7aaa72d1bb25cf400923853c5d255411c63898901edf20e8b0b6cd246ff1909", - "3a387f0c2c112c099e6c736532edf2510eb25bf6d8af19492790ed37d8d4d642", - "186b221db4a3829598fa647b4b711c547f1eb6889733504e76440417b7cd1e82", - "8235e4e536d81050ecd348db75c0aaadd6739594b9359af62a9ffa3ec886646c", - "f90b22f721519d85503d7ce1e050bc04f67649faaea5f9e18a1dc7e7879f602a", - "6c811d339a36319c0fbdda281b1be95f2467d95d49e2a56eaec60a8d26cb45be", - "52ef6d8b5f984b4dc3ae5ed3f75123b071ad738ca66b11822845fbc09205cbc6", - "efcc08209373e6785bf3fa4e98b3ba32be9a7edda2bc7019ddb6a05c5952addf", - "662ee77c3a0ec7c24985d78860a64a8686b3c6b36dc7519a030272b6cda501b6", - "28ee1ca58079b76db3691809c8773fb78be7e148cd20c2c11ae45689c4cbbed0", - "56757e831d4dc10c78c813db12de6fad8befe8656380d8412f3e8a35017b7317", - "9ce424b489080385406ee9941de16b395807379d4c618d2c785b0b2b053818dc", - "7b6361a5da93e96cf84bf519aab213df6aa8fd3aabaa6e3576dba9cb0c065355", - "124b297c0926d53c215c26fe18be19305bc7b339e1aac7e3f749a835f6f2426e", - "4914fe99b7bbd3eb4c1c19cde24f88cd21e93e8717341a05fcb73bb2fc1e5069", - "fe7f846785450426f459b8b27dff6b5090abef7f206c4d7bc14214fcd6d171b8", - "61a3dd80bf5fa369a3c768e14b6debeeaf29a78f082e8b832239e382e2c4d5d2", - "a16108b047b76ee8f7f635893236b88d60fff0843596f319803860476b94bc79", - "ba098954847108dbba5472176c27db921528d4649d7627356742896d3b19dd1a", - "31216c8b797adf21ee35479ae884a392355510e9ecb9506e0fa9ed36048e27a7", - "66e4859631d61659eecc6b02a5a27bde4d666d937bf642c925a8d08384b0a544", - "380b55b9167733a55621789a61ee36a62db8634bd226fac5ff8afe2e8443a549", - "54fcae379255a650e308738e51243e34cbaddf5b456d5902ae82a97e03e370da", - "344ba7e8e38671eecd8ac39c4b32cdd1e0308971f68e0f18c0f639a6e0eda667", - "c62a89848307a8ac9766627df734ff79b2d24abe6f800f04488c79bd357be23a", - "638123fb7bae7d6cabea597b4925dcb27ac94a7f9ad9adbcf18cfca2d5960a38", - "533785acf0aa0531ca66a756bfd6e900cac4fe5c80a4755e49a9ee302d8c75d7", - "38f5da487940f680ae956a3b26b3636385c95630b858766ade4ad2a89184361f", - "311741dc8aa1441e4c5cfb23dc93234d509cb6e1779af7758034066590aa817c", - "847e8defb1525318d9abd07f512e4732ab8222817e19f1ae8b065a1cfbd80ffc", - "ee963c5840694bc3330c5b9cbb0bd0594cb7aebb1ed537cd0f2c95fbad0d69eb", - "afcf490f467e8b1bd22cfedc95993f333468f01a38721dd0a1f56b9f2efa7f37", - "c819ed680f060de75177eee8caf197db662c549a94de47ac46e4e1acee331244", - "0ecb84031e6257a6828b6b3bf02990cbff48b4a08d0d29eeb67b887fcd3a917a", - "3740dc0d6d42fc438b78d2b2e743e0e501aee4e71dd295919bcd025a8e8d1121", - "a6db753aa7cbb52e668aa9f68bdfc53e8f9ae863f91c1fa9fb5815e8b36c4284", - "f091196c4bf96ce63a6d890e28a7a849999a3c464814ee015f37862eece7e257", - "3641c2d573da60283b84b1f34dac4de8879290fc2de067f5eef5ade83a696532", - "6354d102943f31e2ae9a68dceecec57ecd41be29d2943800c178e8adc69025fa", - "09718a8adf24c29b268935a8b0ff3207dbc0e5a0dc230101da7f26ede336c8c4", - "19191a828fced471808c769fcebb55424493b18d65f64aa3021fa979ab6ad923", - "c012a41edb86613e32c2100bcf8e983f2e612b21815778794e405e362666979b", - "f245afc0681fd4a6b6140fc914390a3d906ef00c12d7d18cc9eb329afabf2e4b", - "6d2ffa91401a4de18b91baf8b03ec8f6fc34e43340ad7b0db133a4fcdc1feda2", - "34adc38207846dd609f10cb34865614140978af9ac186869eef063b08e813cd0", - "466501b24b7cf5ab43be8f058c30afb868096b8341458dadb58c76cc56b62cad", - "9eb8752959e2e78e91dcacb1bb80a00b629d76becaae7645280b03b2d9d04cb4", - "eff7fe6913d76f8852063b8d235c49e83053f9d903b74d6ad1b4a37980ec3949", - "82c2749ebf8b2912996caf4211c1aa826af1314497a5161b6dd43b569806549d", - "dc448941d261d0aee4055d83a4c56c703a4911eb13a3b1db6cb1e02701de0cf6", - "eab495a4e958605a767fe404131ea7296f568248497ce712c0f83f1e8e62dda7", - "de73e3183a11296ab92791baec0e2e88a812e75cc2387b4d6b898fbef250f765", - "1d84cc0b6d02af65e714994e38b4beb28ab9534e98e879c9f2bceb9e99fba02c", - "3f678d075bca6a6b2f10412810f811b3b0a79189421a1fe9bf95950df386df85", - "57e50b3bb230ead3e7feaf83d7cd86c1feb25fc473d134c9929b92361fe77f13", - "7cf05cbac8c0e8a73ac6b76cac446e55feb7bb9a05667ebacdb32c4de7ef5af3", - "e7101ef94b7fed52ab33e7b6300f5188755025723fa755586f2d0969ebff49fd", - "4ba26d9560ec3cad6733fd3e81eb4d1b559c0a7dd727542e65d1d33105112dcc", - "0e6f63d777ce7825f1e7e688fe4e0a08b1bf0629891c47792f00f0f3a38755f5", - "53e9d9d4b89473e592e2b9985557a589e333bc55a3bc5b30272e188ba875b0f0", - "687412b1c97050fada7af107cf557d25772ed6578d7c046dca993520088b69c6", - "86f39fa1bdacdabbf53362d7b0ca556aa60a0a436423c682a2f5cd0e04bb363a", - "672287019f8a0d8ee812c5501e481d60a198de78ec48769e9f6e1b8e7882b20d", - "0c54584b4e43f1b160b70200a808b24355a3800c1f05e80168323f8d0474e5af", - "350efc393098197e3464b4416401b52f39a0b7b9c96323e256329d579b1b1bb3", - "6bbf1aa0fdc560c0e618f051c35cfc5c96c9ed5f8bc25e3d882cc717d76588ec", - "bee5f1844e3f7345a48767254aa3f8a6a9e496a5866551f23a6f602e7e89d5ae", - "b513a1f119a756e6f407bd29cafc1e6f85c82f0af609b9244a8ce0f86732f7bb", - "30ad34f4adc4e877c4c9fea29937a3d0b9561edd11b1f6060b77a99349cea53b", - "9f18905c4d4a210ea042bca3c5e3d0a3092e3e5ce9c5e814842357823fce7515", - "b8ee953623c6887fa746956de7396c00771424ec9eaf19619914964b3a4caa97", - "68c486a18af4d8b75d3e8ba6f5938fe735db6188665e87e184aa28473d80be9a", - "cd5463bfdd6a9f55730e1339b1fd3337e370ea64509b0630b50733528d985ad7", - "041d7025749da070eac3855908a24f7173ab616f92e847864c6bc311ec6303a5", - "4feee064a1ade1b564cab4b6080c10a614c2eafac265526e737e91a181fdc47c", - "ba1ca126865bf2294fdb286c9762b8fd61c77327b1618c9259924be952f81add", - "e788ae9eac1c4e26b7e56489dfcab6db1f4daa2beda8958bd25b255ef93e83bf", - "38288dd8c2a1d7b3371b5a4219a430bf9abec8e79e4e1022db1a110d2f99c9e1", - "9835cacc365c50062e7478b41778fdb6d5b33ef848402670806b07520736e743", - "02d4237d50d09053adfbe54eebf74cb05429cea902cde1f6fdef0908408c81d0", - "1f060f431787a1cf2ae2ef5bb0cee9e8573faab8cc043039904442b3c008e2bb", - "9dd7f06286832292ee85204589252588c9252a0b5dc8efdd5f724f7ea43ddb80", - "d50fbd701799e51f25fa83c486419fa7073d04f3650674ead91619ea43492539", - "a28c81ec99c5a3ecce9d97fb093dc20799bc40597f7d0893caec8f02d24130e7", - "bb2f62581ffbf085c33a50d94e685d03e5f6ab727da30e213abf6bf86cfbebd2", - "2c52060144a578e70ae4853c9f1c773052a9fb9db7f8aed65aaaedfa42bbf6b8", - "f5978fc3f6da05a52bd2ac6cefe117e6a2060e2312f687f6d0fe5b64114f5133", - "66b7eb5e5a0ae2d2ff7a1ab1234374f4df8d52ef8a3477bf76b9d572618ecb18", - "1a58d278428c766680c51a584b4f8f547b1e3b3c70b7997700226f310047178f", - "5b6d9663e78bb11ece31204b73077f2f646e441677c0e4ae531e18a634625417", - "97755a555a2b01e76203edada78a75deb839a981b15c2f5b6f37ac39a425f5d8", - "1600d988d637f68fa654d0541657122f8202822b7a4b48d8ded2b5141132f3df", - "fb122071e533fe46376cb1c6ad0ff285299845b6537a725bd84fa91d77a2db85", - "130cff8e919404737bcb64a96b208be1a3bafa19397a20e1c5c9515e3e0daa0f", - "b160412184f2cad05f53bf39d2351324f180e9304deeee6fc061e2c515a362f4", - "f46f84244b6c35261b58d8340af817cc3075783a951fc8193a34bf729b30405d", - "dad7ce6e3b31cde48254a6e32235299ad1689d9b573b2665e4b8848b0754fdb9", - "3380d5335e5a6ac21655efad3986a357b9ac25c55d413aa83b98fc8907a866e6", - "61ad04f1f89c3370c596948c3c447b02d6bbcbb008accbf8f314782528981dd2", - "9c92af9e44715ba1e8ec2cfc0a651069ef275040669b9d2b9786df99192a282d", - "c6a930f53800931c5c3e78ce5c536cea3c9e11dfea2371a990774a91572e9942", - "1620ebbaf40675fe7cb848785eacdd17acd320e40538c7730a54f382bc49aa9e", - "48b9f09a7a2b31c44dfdd530c0194bcce811068edb49ccfd57f0abb2b35f0d90", - "33b53ff34321e32619fc474ceaaca5d811cfe90da6415e205180c3f253917a69", - "1ca8f7afefe4fb3536586ac9331ce38c8d6d8da92ab27864a7193c6d9154b65a", - "3ff7231760c6f793da8e56e6665a7dee98d2404604f287aad5b74feb7a676fd2", - "41f32618d240e9a010e76d52b11846c0ebe5b9cee6968047351bc741d7242867", - "35c8a46dc0db1cf9e4f9d57d5da6623a796a5fe33d3878922729e996d2e73e9c", - "45a6289fc241379bd8eca48dca98b3349b11519e08ffe183ca272a392fa2f1d6", - "0da3df711f352bf3f74eb3ed8b120a0b63c7b907593c4879563eb5b62a3a8d86", - "264702e06cd9f05d2eb5b2c116b73daf9442733ececd716709d2d4603a50d463", - "67c185a73148d001fc23497a86dc6268fc0e1feac1c3ddf93485c6fa3cdf662a", - "d271590d6b8154cfadc41e5fed3175f096a15560d2e5ba29157ac8d31260b3f9", - "6901ea99218d579f60d003b1e05216c326f162ac175bf52a76ce1b98dfe76a29", - "5c9ed3215babc0cc43e1cf04dee9c8003e1ed1d034f2f33243cc1a9299a964f9", - "072f8a9db9cca7ccb37860a4761ffb65c0f7b35fc2b198829098ffaaf413d7a7", - "3312dc733bae76e7476e20da3299dad0ebe3ba79a6a2377925474e1a6d7fce7d", - "ce5f420b5cb2e469b08ce95ab930eec938775e796fff8a1330f8a909185bb5c5", - "d4f9b75855e13f43a0e90f55fab30535b40aeb54824839600cc535ff264af89f", - "b0e60c0ae486561ea28432503b234ca7eeda34f03d91ca2a77d35989de0f59ee", - "5e4411b63a4cb0e1f730167e5ea18df159eec8db6309ded1059d63f81a688b8a", - "7d9a9336ce01ffd8c0cbcd27be90422510f1e0f284bc7aff2d5815a156c73d6b", - "4d309308216e9691885c3ec852022305e6612bb845abc49688e04771c9e0db68", - "a019f65fbff53ed71230545d1a585ea196f62eee6d2ed2a434476bcb1905ba43", - "402c6351a65a96994b2e3c1209809ea8421ab55b5fe0c2754b9e53f968f81410", - "06ff59fc34ebabb8a932e2eaa25a04e9c587fc5c746e24cccbadea16f65b7faf", - "496307d133bf26ce29ee17cb3cc608675d089b7b37dd531b5f3b75b1873ca45a", - "c5ac16227c790fb4da43a748fb739ef6ecf34dfc3170b744a957bbbb7a79745c", - "4aaa8b0a75b3302a78011516f2aef665bcba20eb555d68686b2966d4db86ff04", - "0160c12538f28ee39085577f01b9a87ad44074ae030d7502696f5d25d2052d72", - "527d76240c7bafcb4edbc08e3288ab10c0f6dadb1b0a6a5032391d676c8ef93f", - "71dbc54176f899d40e1ee9f9745e56c9a5d3ed3703939406b3bc095bae4b0c5a", - "f139bd5ed84f6d925aa72b7b44e00dffc5a7d57d9f212355c7b08341fb635ff7", - "99e37268b2344533f86ffadb09549104a3b370cebe70a06a3cd09ae50b06c791", - "e4a6330a2d7cd3c18dd7b1353204d527ceef8e513143c8f993c4fa092c883110", - "a5590968ef644b1282f5ae35e03a491918fbd2882b8203742f5de771ede1611f", - "84a3e3f4c0e2c1ffd0e3d7bc9c07aff0deb1f148e883207b3d927b49f2c2cf08", - "1010869fb9444bea139a866e8d7f872f2f6c074a7d630444d17b8a22a3e36ef5", - "62574beaf3cbc4a9d824b0831bf63cb319494f26f4f4a1c016fe8beb67c04c37", - "e201fafd48b6fc3da6188802a9705ac48d576d15fde44e20657eb1351692e9cf", - "f179b741148a1ab9b361adadb9c40b7ad8775e0f379557172a5897e998083a93", - "d15ca50a499405130d9e5aed8956a91dce0cd635519de8b9f3e4386e2ddbbc18", - "fbf4e6a7f2ec2ab91f565f8c4bd43bdee5f674cea2b52c09c45b63cc5c2fabb2", - "9651829272d6961c0bad835df32af3d70b5f2485d4ef6f7aa818ff57b52370df", - "6b7f43454f72807ea2e775569cc83a9c4f98be14a51d996564e0d86be58bf3f6", - "a1e0ae472f801087b41aeae6b14c89235e376f8321ef34b6dfd72c01bf97014e", - "cabc672b386a99042ad149866771f776d18f241b3a2af4288470aedb5e80260e", - "2d6c81121d8450c0ff5de0d7357798a1a1efc422cf98bc5d5f3b29787cc429ab", - "8555120a514f876414d9e625c9314e94c8a05a4b9b5c4d3fce4bde2e1d90241e", - "c4670adf8ac3680209c15ce72edaeb4bbd395b214babd766daa47f64cfbac6cb", - "0610083c5dc411c2aab6780230d164a7fe7b8170a071cf46b804151be4b322a9", - "82034697d9ac120811a87ea72c20ab7a18fb17a10b8a19171892a5806070139e", - "0284af70ce43bea1de985dcd733025f2a27db56a36ab2a6f5e2c1ef14bb9a159", - "749f05a80c4d75f90293155245b1ce56f2f208df8f19d200e0b81aea70003b9b", - "6532f1c0737ce7751eae33c6cabf6b67134bdc2eae15a414a0583b786d97dc8a", - "e78843037950e1905d39e0d9678e4eb744088d741b64593204a5aab75f640309", - "0ad23c6d7d0377b0f23fb745053c14bc0d57d26e3253065b7fc75295dffdd949", - "d1ca79519c77fbf8bb3b4eed3c1b08b5a769d2592d47608cb9230b4b907bcb78", - "f97c585446bf07598fab8c026a93d0fe9d27fd847f011f56c917c7b6ef06ff6e", - "10912a963339f7cf90f6b083ab6156243c354af6d05095f0f294bb38dbb66c39", - "ad1b421a5db9dab25de2e3870957cc126cca007ab923bace47152071adb2dbe3", - "54367728375f9d9debd8b0e418331ce5d396e62ca66b8dd902709a76bf2696ab", - "57ba38d4cad3eb6bbb920d1aabf05e72d3688b966593f61d0a69db8988816105", - "32a3fab18a740ec2d040044b23cf8e733d4d8fd69c2779a5eefd651c3c027827", - "79174a127a10ad4274d99aae3bf25eef173672c2740fcba049d3767c47c00b59", - "fa1c65c3eee1752cbc50acf13406b791e6035b3031e589b80fce1793a738af53", - "5a39d7c209bf2dac2fb042158a30de8d4f081acf4ae179290565e7798773f2fa", - "7de7869d2181ce87b4f99fe69b7ef990888248de481a4abed164895a69250bba", - "3d39bf0f0bbc5f38b68085a4e9fa25f8049ddd020077b7a7d4dfdbce23544b3a", - "b1b5172e4c50c43ecea16ecfcf81d6719790af421d0495e0a033f13b2243c4cc", - "b515fc8a691c4baff29f3cea1e7bbc2510e8c4eb1e82ba74c27ac43eb4f1e755", - "f7ac9854da23be161c03b20ffcf062565a66a3bf0fb4267c5b55c8d2c3910a38", - "b66e2d9ed02da37b02d14c42bbacc339db36fe489df97a88d0725c9cc1a49fed", - "ca61f4b9b34d672688555266d00ea8958bb643120814fa8f37873785a29c7755", - "66151cf6685bedab5e31b6b2e139be45840ba428340b8d55d49cbceb055edb0f", - "515bbc5df187f22132fd2d55aa78b284b8e20e495e8827145f3ac12b73eddde9", - "97b7a4b5daa8e24ecb4c2dae4d87c01b15eca62430eee91a52393a12cccc7634", - "ce92769f03128814571c2147d902ca47029dd483cf6b231df3ad0f107578e622", - "90d5cd835511f0c919b52cba2e3e71a528303ae3d2692e6146eb77be68f3e572", - "18797b3d49da54f0b3a032c26fd31572a16efef3683f53c4adb2972b2e1e8e7d", - "fdc4e89bdeb623827896f23803191a84d3619982a31b0e3d8a8844fec85f7e4c", - "5e223f2ed1c610eab3821b508c6628908cefa15581299b7f60f60ac71a188506", - "35f54e28dd45f602126902dc93196ca664803512776a9cd48eaf66d05058acb7", - "74d44a2a52cffedb4db2423b55c0da6ece3df9e4b2a2276bf362ab544f4d7075", - "3f30ff6c90ca5db4a3a2a78f888779f2ecbc469b4b8e8f52829482524ef82dbc", - "a7831355e176f315917b5d27091f3a580446a686e3682aeca3c4b8150f6332b4", - "bd73e8cf243e101424ddcc9c1a1f47765bb9e46e732e4972a8642d4e313881ce", - "6b67fa97391aac778b53bac30c88934fae36869eb1ae8065c5a64ed028e1f444", - "e38af3a6ff88f82cf671c64a366eda0b4c53c5efe737dc2eaa66a0a30bedd7c2", - "fcc0fbd230310b9d02ebe99965b922f1fe7b7cf435a8392446d28bccc4015ab8", - "bba89cd4c04fcd5c537051fe8caa306ee2ff3be8915ad9788eec66ef490410ed", - "a32db34faee9636de66608cbb54e8570fed1be51fffd3c7881c79d09f657c1b9", - "94f229b0a6739fa72f6431eb2fb43aa9d2010a3e028769686471de93f44edbf4", - "1af0353857dae44b7559c61f70f8f1a1c1187aa85e689e29bea0eb08f24608c2", - "22a3f7a7bf327a0cdce0ad341c3ada81c455b648bf626d5230bb42a29e97a860", - "605e3481277aeac46a2f1d43bf518d4f51d3e534381eeef6771dcb5b30c03cfa", - "850c594a9d64735dc776d355ce6347cbdc4cceb9a0faf1b4009e3b8c8cd62442", - "054001d1f043bfac9a03225f5265d157a98dec904d681bf41c442347e34f38e5", - "eec09d59ce10bbe9812d5b8cb83c40a7e84d003ef14d91737734134c30fecdd5", - "16e803c48925122a34d73f2de63e3c6b657a74f3cee8bb76ae4233278aabaece", - "217bb480dd4f11dc9174612cd36adc571cb9ad4f23c6a1186990f0069e8aded3", - "1d014c411293451f1ed7b84e9873bbc9eb0a45cd011cd9775f4910fcf8f32bbd", - "66ef2b2a79ffcb5dfe21f7601e8deec50d550fd28f38858d3044281316054d9d", - "8567e7f194d8501ac9cdf01d2bb786e2bac91fce61385db9782bc4de2468700f", - "7497a8b3a29d570a555978b6c2959cd1331c66c053e3f52831f63b89e554aecb", - "8a2907a487f9400fc46da4ceea08c82f20c635ddae6b679712d757098c3a9588", - "58d371e3b65a2dbd8082cec647e9268fbd0a380d6f5d1ed3e75c9086341e6c75", - "27546fb0ae16ffb1365ff40420051d86284acb66fe275e1f9a7d760b3b6c960e", - "b4dc7fa3299dfcc80af61fb502a881f3e3ea01a1fb67636261dab070bdcbf64f", - "35eaa2cabe8bcebbcf1d545ae38123b51dec7ec0bd605fe269f66bdae74bb524", - "9924f267f06bd8c01655c5fadb9fcd68cfa27894e3677ab43445bfef6cf65dec", - "a1a490f9b21b4a071b11873193460753c6da371c99eb5c3bbddafb4da33dc65e", - "d5b457e9e08d653eb18271f7c1d3992ddfda2201bc1bd5fb4dd6c42518943909", - "db0c1c9f715d6b5fe8fad0ba25665d6f826fbf7faeebc567be99385afc4e1d2b", - "a100778dcec03c80b94876301cf9a10022829776d74e281ad0bca29e19409acd", - "dd5b4b82a5ed474290b0b4879ed475e6c98f7f0899fcb2a62a1b7e3a9b62eaa6", - "035b9731ef7e25dc804a0923135f3af3f07b68a6573473a4a7950befd171bee9", - "5f5ce83fa2943e0dd2668dab88458a090a2e6e3ee019604c294fd59766c25eac", - "d1ed358bc9b2765da867d54c75d840ed4c63ff6bbfbdc61b887a876553b2769d", - "ab42c946a144162d3d62207d093f2dcbd7023ade5d2e737cb358cefb1e4e396f", - "f845e20338cbea7e0a856e4d2afa5023520751ad4b2b6fae130a68ff1171b0d2", - "0c6a58d920bc64563502f4070f3f832523a63e05f53786374a5d587baf7e8b84", - "0d84396f360099f3658490ec54fffe8b81aefb3c2431f14102cbdd3a0d2070bd", - "0de8c15db873c9d347e8ce5e4129ccb4526be8464f92a9f8aadda52782172002", - "078238e3b33b59a5ae32c61c9e20125a4381da35d949c85523b9f81076680dbd", - "d6618dbac72c7f18acc943e4b18a27a39e3f6e4c40242a77e455220729a2f67f", - "70d38b06661e9a489f8653330c9203d0380e054ef157cd0202f5a8e1064db488", - "2e8d1badcdd9efc0d1f287c8aab078250b42405ba6f35a4dae386b65379a5d9d", - "6922b081d7d137ed29a2fd3d44a635da07b3fdedf471fb8cbc431af86079c7ab", - "3698a99b965709701a54683eb392fcc78d81ec5bc851f157671e2eadb0391e3a", - "e0b0523fa1393c583b95399eab71d69ee85f723c5b850a58d25b9196a7189a80", - "5ec596c0ea2348c29052f5831a8afb0355547590935355957f4de56932f4d0f6", - "5521df440e63890e5fc5577cbf9b3cdd26eb80e6cac580d6fc2f3cf025c07993", - "2541bcbfbce79dd5632b584fe1b16461244d90e506a05e2f7349108af7e99363", - "586bb0f7cec8e9c66bcf7c853febe6ef1d70936bba7d2e32c9cdfcb7cb0ce08f", - "f8175847abfce98320a89bd76ba0ec063646261e33e67fde610ccd897980bc38", - "7674eab3aa51cf6fab3e76c027152299d9922efcffba9ae733c16bf8e89ade57", - "5920b97a9c6a79a87ae1338f8b123f5148aa6496aaaa3bbef74bef19488b9fc6", - "4a0c594ea965e8f2d4176f7989980f50bc1b2d4ad405a6e14fb0faae9c484ea3", - "5773ec62cbb4221db8d29cac8b759a14d4cbd4588faa13efb7143a4e93f6c7e1", - "a0cc39dd0b26e0420a379444f0463fdefca37696d615621556e9cddfe746bd30", - "0a3fe5c1896603a6175c599a21a9df2611105ba0da12a846d69af6c861d89acf", - "00b57bec8103921a2d53d8b15c6e3f693ccfc12b7b3b7db60ee93b16e43def9b", - "22b48fccaa4d0ad5a0af73c70537140d792e3a89d350ebb8b2cec83579eccd7e", - "7df5059d5872cf6d7b364cc6fc6ea67208a857e1331e25116a8c032b0757c302", - "e31f23c5d941e43a8c75cd1f0923803d4333d103258ac6a8e1f709bd2155bedd", - "2dae1ba397d6caad52bcd31dadfbe04c7ef3c9208000dc5a425d4f559d86eb67", - "3f139733763157c01a45fa063185932eaa967ec5c66a3aa565c678dd5d586dbf", - "c9243e38562fc6a09eabea687e2deb12d47a2de375aebda908bd81b56a0b6a6a", - "9675683a9423fea9dc5e6b6dc5f58b06c9927957ae5511595a588a582cd5b899", - "2109ef127344eb7d721f4f8ae27781da1aa0943281dbfd76d719a2e671c9df8c", - "b6a192a807d1b2b6d8b947e2dc54246ea5c2eaadf662cd652a5038e140b70582", - "da534474766be5d6f0b4e4262e9babfa4fe6ce4576b3c1e11869235d62090acd", - "3b9f10445d910cd1ee7c197f7cbe5d5f10a3a5724135bbb5ad0fea501b0db5b6", - "63c67fe344dabd8332643cbeb9e1570b9dac7a16ca744b1a9dda148accde6c3b", - "03aadd83cc8d60cbc3d852f0ddc0e98fd67b4c8e5f152ea5c8a6f5be85c7d8c1", - "5f3a96a8fc17a1c8b79639d1f7e8fefa541826b0b7d93db3d2e2f4d4645a3ff6", - "ae74d0d7fadaf995f967ee59ffa0c90e7de6fd8deeb366bd49d56a757ea82410", - "7b95df5bb7660b1ee212c91640608efed761a2a4ef1547532c514b60da8aa414", - "67518bef788373cade454f643bbf5e86f4dcd7c23d0f80bbedfcccc993486735", - "901f2871b4b0a8fa09e56a512a3227f8ebff8264a1ab4a343d541c1f02d90822", - "552f43b7b4f50083d742be0193c91f3d7f3c18f7b7ae6532605058d2d40bf994", - "3452f85266c0e8a400a3dbec317e5fe75ae4be939aa8fd321b7f0de0aa20ba52", - "2afb41e143c5b2d61f3bf1596c3f077a4f60be0994f92493f308691a26f58ee0", - "6898ecfc1dd05d57cf1fea3a0e60348af6062f8ff5ff579dbceb981b3758e902", - "d72bbf70ac18a03fc1c7aef77a83d8f859d1feeebba5622aed2d989600bedb21", - "19ff70cc319222a1207522c4f0c769c05e8f674118cd62121627dd9aca48e6c7", - "e16cf52d6f5ca0dba71440e0ec3d4c96b20993fc247f7d186d9ba5ac898e792c", - "039ea03ddeba5c9a5fa7f6f39f8ce467e160a1e755948f7e784c42f8775cbe25", - "034929d4ed31732ff1b7fb18cea5bdf40fa376e862727cd8bad3ee48d6d497a6", - "a6e5d3a2f580a167c4efc4d6dacb2d1a5a2097c27eaca13eda2eef7502f7d5f1", - "19fe6b9ae2498f4c291f09e8fdb468a8f5ac7dfbe70476e15f7f48f16bd33d85", - "e4fa0701ec930932cb49e8102735318f65795ee05a679532071a0d04d599a063", - "1b3abf6dac214fad4f7b1e31aef5730753c92e57eb170845199afadfd0150968", - "ec5bebe0382e37b12a17aa27a31b3bbaaa95b5d36b665962cda8d1bc575e83b4", - "b0e9b5640c562d49d8b4dba7511fb95bab27502c43377952f944f6954329822a", - "c7b21a15b43db78010d4bae37782e2ca4e764f2825e644d2b99f23afebe4131d", - "20ce46d93e51fddac368af0629c53f9df4384cb0726a9a8c83b073f646527c8c", - "379f533aef09bf5f795ed65348e5f2d184dacb4e9fda7bf30b0b11bc42b8a6cd", - "16b6b621b0edfd92593499abc146a44199c6cc999fb604af6a27e1c5fb98b48b", - "9c54d3ceb64afb4661223fe5f0267b8b5cee03a272f034fef94ddc9020c6e503", - "f93f945f5d46a26e5269362419483a4d2d12179e8b77c24faddaf3c6c55dd759", - "746b25640bd3697d6176bbb3c3ab79419ff38611767494ba137c23fc163bd365", - "f018f0c3ace3ed894113357019db6f1a4d1357868215a27a5bcfd03f28783b52", - "a5c700f21ea530ec21c35d1284f29f66519e75bd83fd83744f46ae527224f639", - "f26425f2b3114a46dc99c4c0edf47a4801d9bc70ce4c0b9b58b4a21c3b50576f", - "51ce8e92990e5b1438e74d4242af6f1270d7634cef3dcb345f959f3057f2f7c4", - "c187cdcf9ce378bbba244dcd5e2573742dabecbb62cd29543414d60f3e510665", - "104cd5209e569ace3f4319c78e201aa1ed718fb2ffa4d48dc0016c78635115fe", - "6e7869f628146d9096e2a730afe9558ff409458ded88431e21e4b1ba6bde5370", - "94d5109994646933682fa51a6bac584382c4af804e31f512f35197bfdc01c8af", - "1a1141aaf3b32fd3beea050e5d0d7ab1c5407db1f7b05573306d3431e8a57e83", - "46dfd853ab8bdab55d5aca4e261defb80d3cf38becb4c132b51e74030dc95da8", - "d7605c1391ef93a35682473b12cdc0a85ccb7af2655a806724f50a7455a094fc", - "20f32e4038cc945188ab05401010a71eee992830721eef60886d59650b2c6711", - "f21b61c43de90a26779893583544bb2cf79ef91a01a593e0a55eb852409530d2", - "29273ac0c14a005bc92b9448aae13834326add1d31ad879cd21140e66898bd1c", - "e4bfd8b473708b9d12666aece9a0926d10977f49b11e460140c859f9d0b55f9c", - "d9cbb7514592ecaa386f8f1ecf7b55d35a6b6e11289ff7c5c944a0438da38f6b", - "1eb005704a17fd1bf4134e7ab4434ddb4c09e47533caf1471a85e15551d62946", - "b040c3741bd46ee9e6972d2152f49e91a965e26a6538bb016fd0dde30b3e783d", - "337fab256907f1fcae5dfe798edb355607539d8dd007e0ea0834870ef41ffe4e", - "c150c5bef17c22c07d4ea077627cde59b4e32556f261e36252ef00df545efae8", - "987068444f66c8a9f5bccc03561668e486636aeb52518eae982772d06096eb93", - "51b5b0072141637cff8b47e8b76c1129ec925cb5e5daedd4a5cbfaac12c4596e", - "b88603ddb79f7b94d0f5340ebbee0dce6387689e9d8b155d78dcfde962c9ae81", - "89f57959d913f3cb6ed47209be047e2904d368643482401d77ca5a5c01f72b8f", - "1614a6e4dae65a82f40fd0b5a4e72af6d488ba3ce507f904689051ec495d1bcf", - "449c05577c56c4ac5a8ca271dc3976919c6d1b202445646d60f13623fa62c35f", - "ed48e7465b5b8e8eeded97a39ae616096580a66d76294447ad668410a9b4f564", - "6191b75aa41742f6af4149edacfa2ad60b4a4c0cb7922dddd338ff02e09ab1f7", - "40dd6990c45327bea1a59354d02811f5cbe715633b6985910847091e7cda39f5", - "b20d54b66291a7f33fde6b0c0922e2bb5a0d25fda30a3b7a3b35d739f3b33c1f", - "7a6f6348580a29fb99dd3ffb5960d77f741a0133d89c5ebe7a897583e0888d9b", - "48a885f69a9ac16124ea7d7d07c6d9ef0b65dd190e668cf2ccae5ea3d9591148", - "36b2cae32e96c415d0dca61d0887d6c5a547b936cb8ef13f036988d84a6a35d5", - "17df03e4e3576e147914dd8dbce9f9f79353f65d0ae11dc19b8df504e48ebb6c", - "d005329c44817e8862f9e85d1038be5796d60d1fed0ca78cd2fd24bd98ac8bc8", - "5803119b05a0f286f69d3e9097a77c7f3af55415d724f918550b0b7ee2b83609", - "fdacdfa4abe4d18e87e633069d1606f2001e2f48663aefed5363f10e0a187669", - "ccf08212f373ed3f65c0ffd99500f1500a75d9f485e2820da6b57b390003705e", - "fb896be138e807ae0d5f7d7c9c761555321ae5d3d9c02b4ad32b5bce7b82c7e9", - "00aa0dd64142912c23f142acb241d2432e63e5bc4c3c5376adc3e37712a84067", - "8f8acb9fb24a3b29d15fe5e96948707c312b5b41f80dcd3dca66c1751ba3d0b5", - "4cf0688437f78d7c1303051cd1241f170cd4dc8215f14c2db005b15510039272", - "26a0cb6ae010155ffcc0d075884487f3d8820b400cd784d19115bb03ee531470", - "5c2e1ab10d489a3c7509db5eb33aea2ef375ae3a81fc40efbd87a3a7e00c1a87", - "a6b86b83e0bf737eee5a88bb5b226aa6200705bbd0799303d01bbbb3a3e04b19", - "86317f70f186f05e12d735880f6a2f225790c1ce7e6e5375f436acd98fa8a8c6", - "2a654d1105892bbdb1aaec996a205073154718efb4a6f75a56a4e69f8cdf71a9", - "a52a67f2dbdec34bed7d9e3b5f44403c4df2030d68bb759d4e543a2f0df0ef2a", - "8e65e0206a61b4c9ba79978b8a0c7929db0b0302a1774c5ccd472a11036792e6", - "382f97e355255d91f52e89900bfdea7cc2221e97ba55971986024c74b9deeae5", - "7641a2242769f21de4202facbc63f0f4e1584b76e7fcf39f85f3a9bc9608a48f", - "3d9e57fc0ce070523f3ebd2c6cd0ae8ec75c5089cede165ebe09bee94c6222f0", - "1ae7749135f503b8029d16b41c41eff4a7af93bede1b76e9c30f930428e40fee", - "8b55b7c70c389edab58d8a67079ff44612eff4b6c6975a7d9aef4c8ac6b7d277", - "980f4964541ab39ca9e5a4fcda49df0e113a0d913e14174e2788c5ee9249cedf", - "236270760f4dce2e28540dfb0e5784dc9992b3fbf6d9bbfcb09b8c43e43ecd5f", - "7c55ac777e4631146eed6173df6ed72b4aa68d475d52408fddd8b4e465154d7d", - "f9817356e4be3dada318226e06d8044f9ecd2cefd16e4f976bc7baac77862f3c", - "fd1ffd7028ac600c0efa75f341a8a23a4f829bd8155d9b2b98f3b0c14214e113", - "8701ec6493c9e31025d654d143ee7af3cfa8d884dbe1b43fa6705f10f4d14c56", - "c386cbfe61ef16d5698c7de81b83bfd2a31dc6e1bdd89eb54ec4c66fee732da1", - "11716c731d70dfac21c10c9dfb79bd01d1f40fb30eeda4c6e9ee588f41e4c944", - "44605007ddd6084c5a26286d0aa299d454bee93fa54ece651c1b40b11ae47afe", - "d52c37f580e0262eeba8dea497a43fb7299ebed623f4d451333d110d22936844", - "9623d037a5d46a81db3d204acb1a223bfc6558d8bfa93259f48e74d15ef8f093", - "8cd372eab04cbb576192e6eca90686ee4d25fae7f44a31e09a86b11e138f8e15", - "c6b56263b52a65cd6c04e76f095ef29e85c94416c31fbca808a7ac2a5717b642", - "a7f1a0627d0609e5fa5058fd8f47dd0dd0e56f62c23089dbab20caa68e6c019d", - "1857188bf37512736ace86f6ebe869026a64801d7f1038bc4979bfc137504d14", - "9f5781760acce365bad66c204db302f5c822d9e218cd66687b5c09898eb261ba", - "b11ea75f381904a9dbfba725dfce82ce9084393b52820da33975fd2bdd3fb1c6", - "f494a52bae0f25a738fe77d57b566eba0ddcf60be190f4147b7f1bf65366e2cb", - "f9f2bbede04992a5748716ef7ce344e15e7ec0590052f4e8c5710eebb8c6ac12", - "76aa71a93f6c59397203bb4b9fc662b89e0eba32bd6dd614213a9e31fcbfea7d", - "b161b5bc42afe81e0c4aa0564d01486421f056ea05eaf4d2cbc46abd2776814d", - "6d08cc8e5a7638efeb1810eb237b13942f06732c4d44028922be7297139ac4cd", - "2587783aea3038db51114de1c7505c61fe1d6f302edf68ec6a63a1419f3999ff", - "6c39540ca7c2bb8329cdd86d419e469afc14cd257dfe2662456f6c6f1760c472", - "0afdbdeb5b14cd3e4712c9902ca0cf40a0eefecee86e5c816f820f430dbebff6", - "2ba7e87b240f4803e6660553a6016c0a5cd2472fb12948f5f7f6d770109a6044", - "d7fe24789707ce4a16decd8866120c531b56afaf7ba5d00f980c03f668e2fcb7", - "aaf1705b83c042708514d16f3fd6312bab1a3ad89e8605b34a9aa78747b5b93a", - "b626bf34e7da44418263e0f75aa86c4dd8ebe09ed0c5e0a53286d5e402264a9c", - "fe291783c2e0622118693a1a9267ead65d4f4afcc7de91e0ed7ac2aa1603d263", - "0472268d2e799b9c8a81e7eafe58cd61d31b458bc1ee92afc0f5ba6ae7a36a1d", - "c506aa0f216a00ca0c4ff54e48b6d8c0a5ba646c9e1c11035d7aa0a20e31fe22", - "2067b74f8e39c2e9dae01abea933fbee9fc6acd7d6fa6ad962d82fdf2530580c", - "985cb75da2f5deaf98314dfd8266a60da397df925ed4d12663f06f53afb5aa6d", - "570a6be90ae28e4d6b8c06dd83ea5b2e8671dc987e5b601dc60c3664054b1c38", - "2ec1599c3270a354dbf07a89ea2a9dc160b517a8fd04ac8cf59a45299b090a7d", - "4d8797041d8efc6b58a53813ac9fb0e71c24b38af92413c1bc8e9dd3db755c44", - "e1c84843589230af6d4ce6dc31dfb2d353c34593631c06a9e126252cf522988d", - "55927376f049f8c3c082f3c8475692a061ec4d2dc211cef13bac6f74bcfdb72e", - "39961c232dbf508f95f9ea850492b2f61716e15c1255766ecbcfdde5f3ade415", - "15c949e2c662e004461b1bccd78eae296af543ba1a3aaef70c95c1e536e7cb46", - "74254817b3dcd18a681317179a5f1ae48e31ed5825bb2b517962a7d97769bd1c", - "c925f52063ba9a57745dbd97d694b97dcb18b5cfa504151d653a8c9ad1bab922", - "3d0fcb4a92c8fb40b1627c1d86ec74893572e5203dcf786014550fd6a6b4e6e0", - "65cb951e87642255c101e27ae413c0dafd75be95368a9cebdfa679e0837c37e7", - "f372619986e05b5d9ff75620eeeae1e9f3775d0a21725d4d52da376b1a66fdda", - "2585917de080a114744a999810fdf245b28ec6e939aa49232cb0b2f4a85413f6", - "dbd0c46d9f53a0c4b7a73ff05593adea49b12d4fd28d01c83fabd5b5af37a1b1", - "eef857d083dc0d5ca5fe38b316e29e78c7548db3e6a7d270256b512f745ce929", - "01e2ba1f959a90da9a041551cbca685aa340e1fd752b36016fc384b3576646b2", - "c76c382825346ee6b8986c9731c506cd2b23d9f02a263e84ce212bf0c1080dec", - "40c41d885494d24ae3cf71acb6a450d91f299425a02e072615d4e465ee5da54c", - "966864fbc39019b47ee1ac3ecc68c28d0487f41f46a05b7af9cf345f2369da73", - "3998474c37733389a521b5d9877cae0d0a19096be4b35aea1fc59d2ac0a175b4", - "64e66b64e58a65a8f41bc6879ab7641552a66dfa76f290186cd5697f0c6f3f78", - "54aa11e16476ecfb655c4b14cea9c26f8f10b8a120a780dec78885903dd07516", - "5b9809f4f7894744085231f5d0caa99e5070d55021b8162d9ca8d441874d9491", - "fc618c147ed305b08c8387926f9ef4d58bbc6e14a2793d46e99870519ba6719b", - "d6bf0bc74aa19365e63fe3369e8d9f9e226656abfa057d139faa23f9859fe385", - "ebe32bd1bc8c1157292048e7ca6d11d82ba573aadc8ed272a8f4fe5d9b5e551c", - "4d90ef6c3670848c3e8df63e09cb02ef82f0423e5411c925f6c8a2b7ac063efe", - "ddf908c3333aa9e5a17d3c32064ef8d32b20cdf99678fcd4dc27b227475fb520", - "15e5d2706e7a9d23a740e3704a62d6eb51ecb89642a386f9eea505b842bc41b5", - "c36711409e47b3a2868cd3e08c9107bef964da0189abdb98d521f2ebc54b21d7", - "704874653df723cab87b319fc98aa684eb4536033099d0350482df5d66977666", - "748bb5f68b26adac80258724894b81ad0ff405a3d21c7faa516a3794e33b6c6f", - "c12ed5ce1df451f6aff2f1caed70a5902d58de89b510c90ec1df442478d6fa4e", - "f96a45c241dea3cdf58be4806a4d697ac18bea5449140991b0a64e5e9a98d210", - "5971ca59898c63d3a342ed7fd5dce877b4fdd54c3e1e1388113cfed69a34af94", - "bf5d873bc035c05dc7e5759e9530b0b9cb86e4653f06fcdd800cdebdcb8cac6f", - "1acf90fb28138d0263bc403a3851682acc04cc76d0cfb46111f3b70a85732d5e", - "c8dc718596737371e6c9aae40605f34b783e6a1e642216c1150ca10de575b3ed", - "d0c861feaa2871997d654121ba0527e31b5e9c1073ca18cb765376c3039b5c9b", - "076c7b12705c16863574dfe1acbf6c54013193bc10001603b34e88dce1fcee13", - "1d66160d04e949f95cec6531afee9d630119c7ca9f60b4097879f3e6221fbf26", - "d2d87ed4e73c9432eee39d1b60e42110d57821a8b523cf3106c11f1eeef1330f", - "48d44a6b0884de6ea46a1e6743e031471441bca6242c2ce82a9c93489480a1df", - "96781ca931f668cecb8d45d53cb053d5f9ee3fa8668d3ebe47cedabdfa991f16", - "4dd0402c1d72555a0748437e7dbd8cc1da416c509faee36e3dfcb6818bbcd6b5", - "17be6c1099c2eda7aaa04f4d400ec42fd061fb126b3098241fc63ac71bbc46d1", - "53a280afd6346ab170b0875875b712a2cb6156a32f1a3331483c7195b9f82103", - "86bbd03c4d84c439da8f7c5cdc671522c62a4189020f0459cc60f47bf5fcd867", - "4c8f047df5b6f493d4994495ddfdef8a658d9084835799cc930ae016accafb94", - "3c744e310181a2580d212b8607802c27127eae062f95099f4e7e99e77b1d8325", - "cd802470950e399fb20afd5a1468c503c8b0fe4d1a6762634eb18be2921c2ac7", - "9e4e655aa3f6c6d9fc4e7b1f9f04090316ac119b061f4c63c71160d873eb9d0e", - "6576b3311ed938c722be44b8bbed676033d48d4e9fa9eb8fe463fb0f8203f7f1", - "6c66850f21418c347997e437c65332715c4f4842d2ed67a821f3883965c42676", - "467d899c99092cdde619db876bbfff14684d703ea383ad56fda89d605edddd73", - "e15dd04d3cda6dd02bf11530be766f1cffc491bd5f73eeb3fec40887121f3b76", - "20932868abfcdbac63d5cf41969f680b9398f552298ea7f41d46572adef56ccb", - "7894a851cf47be36809553c6940b5db5bc50d48ed108b0b40d9fa381a18af002", - "950f89693579ff1a660cd67f410bbcc048f328c8dccfcbbb0227b17759a2824b", - "6f0ef509d542b357b1bddfd9d1901210b1f5b0f42948f8b4a0c07e45396c268b", - "2ee2173630e66987848d8d1ea479987f3514f7b61fec50496c073abea3b36399", - "6f099c9f3256ae54274dbaa65f483d847e42c31dd63558bbe57ba5a5f6b33f51", - "e6e6ad4db72de170d2d4f226c3a469b11b85232e4ffd1ff64234d2d457d9254f", - "3aabc2276b6cdea8f868aa4f7e4f41917a031055837b15d8277696bc30c3cf4d", - "eee2790bb7f65037dd0bdc6224f03a744da89b4090f686e246858188e678bbaa", - "0d66e02bfb78d98413d4c5dea3b3153d4dc094691668a20f17f302fceb072d97", - "15a3074db25b553a7c756673da78d220793d5711b7ad54713de814e63df5e9d7", - "fc4a7d1e91c001f5df1968cf90774bf5e0964d95fe57667c2a65b00a06acd0e9", - "c0ba93a5eb296be2e6fc8fe664e572169f80506942e0bd3f77de908936df86f8", - "3fab788069a2672fa6e262bcfc4e01d991b3e8dc0669e5c2a8ef6a7348642d8e", - "3dfae1edb333d21902b48243b0d145ab844ebb995bcc991bae5572e7d8d6d10f", - "4445ad3b8f8bb0d78d7f41a3fe25d85d0a32f28117a458f7c8f559a8632051c2", - "4e1e2cdd5bddb754e8bd2c7cba8da8ba7412a36cf71d839f4f8844cc89cc65fa", - "db197e3761a33d5e3ab41318d574a045bbeb013ff4332b3d11af1e8e42c7ccdd", - "b737b7cd89aa111faec6f86abeebdf0e8affb3224b086e92ca29bef499f47298", - "bd2d75ebcd1950148a0cce0275261dea70d0d792b31373e4e325e26a0a0f9e43", - "1235fb325c83f7d121d7ad841ca2066175cb4bb00cc6495d7832f419c82300d0", - "7fb8dfe7950154333d8821f5efd715dc3c06fb4b93bf66be3405e5fb02d83604", - "0717c511b2754949aa8670460fb0961c3a28e63c2f227a1142ad4c9978ee5527", - "8dd4863e577685e40381b4374584ba9dfb30552273f4ce9694fcca99c91bc0a5", - "b5ce715b1ef6043d8f1fa727a1c1b7fe032e341ae27ad67ade274502e8f8e9fd", - "e2137524729b47667b13945e974000f88e93cc79b09ebab1eeae8202069a3888", - "dac73c1fa336fe97c2ee3b1dbbf40305d915afdef7e59d85e640fae4eaf28b69", - "7e3e946ee8980660ac527d002de9282b802485346acfc3d179aa19275c7cd6d4", - "000e1d98d9115f6d4a4f7029a8799c46e86700c709e42dde0f6351361b13aea7", - "bb34dcf70552bf685c7c01a1dd7401f7c3381693af93190e2d81c2760c3184d9", - "1e978c0b37c3363056a2c79fcfe9f9e0db7a27a8e6b2a5ff57eb0a7bdc1566a7", - "35b6fabf8211f78f8e9363c88004db56718a2913140ea608172a1e00baa1ddb5", - "9bbff1e8454306f581835043f5c40ca25389c29533abbd88f377117a60dfc34a", - "4c1e90c3c55ac2a73c490d6068c0017b2584cbe15ce3bf4ffc9b80f99632023c", - "26c05d514066426f0a449d50286a2dbc60b7aa2837ed05ba815d4836c1cb5133", - "d6d676482ff09e5778c6a1e4dc82ca01dd3e2e2617059b6e802bd399194b3c0b", - "0f7cb44667e1558881c03b96f1e67c2a80a61087e8e02e221c4f8fb2b4859c67", - "c010057c4e3b73833b7159834b6926eb41b3639ab27a828b63c36bb209a26159", - "66f15de34a94c4a2a2944eb59e79499396199d0af532da3b9128ce805b34ac65", - "fe9ca86ed5fd2bda0f61fe3494623683b0b57a3a9b3693a801510c48f72a832e", - "bf2309791b6a78868148a02eeba024e59f24bbb455aa94f026be1dc565670f7c", - "6681a5e24e3f696a85434a43f768c99aff01597c5ffb60bd0304ae2753ef5348", - "718d642a93378208e21cb70e24949706118776614a9bc365cd58af0e37408389", - "b8f1c35a5a085a991bd0cad27d7aa5d5b3f525e3b5789279996ce7e7dfe2817d", - "05f12bce7f80b656282d780888a3959e92856757a7aa18965ab4c27c0cefc603", - "c7d9843cfa2df59985b7b82c9030e5469a07c06411588e473574a88a89d8410b", - "4562312deca06327a2d178528bceda9cbc11f39260ff888192444117625920c5", - "d8a4e314a9425cccef50ab1d539df454461c9088da51675318668bd5d1265a19", - "87e515fe1061e86a1c6f4bfd35129a36dd7bf69fb2a4db43ee71c59e0a6aa725", - "84e1a6696ced52889afdc8dc489e1944fa4a9328ec9f8509dabbb43881c63d8a", - "e28e031a26d4beba73f38ad8ed5417de26deab1eb097d09a2ffc33b1674d58b2", - "6934758b1d6f46b8852d8fb305701bb442d2164fc85f1346bfcfda14f1740cac", - "5ecc935b0adb9ce4f4a1bbc3ca10f04d06b7bb3b0a8997083618e06cb338a39d", - "b6c78f58ad2781eb4bb1f69c19ad32555ba1be8153107a5cfbac3f800689c609", - "dcbb0a1a5c99798961620a7c9d16f308dd79b2787b23d2a663bbb0db3b553069", - "3eebe2931b275669d6927bf0b8f7a623a752ffcc626a02a76a6d54ea329132e6", - "73c4f527f6f2c7cad08df0cce07e7f6c961da123c92d334241a997ee450376f8", - "ec1a6658ea050432751e166c2696f3af78377d95f5648fe90f8f21ac48763a84", - "9fedd06b27097b36f47419d2632fb36cca4bdc5e9a5db1e156d15f90f2e92ffd", - "ece52aa4a4d024cb7bfb7334442ff9894950e5363202131d370c44c0841a7c29", - "998ace2e67cec24ac616535ee7ebf6249b784a16ad41862b78fbb9ad6054aa13", - "5402d7703c1656911152b63a3cdd24d9c59c11223d8faa91e9727b94c177592a", - "8fd15f78bd8e5bb24f3206a668c0777b911a670a89d00da50851c5517a8f419f", - "aba5c742a69662aa71f249622bb33dca7a06bc1918aa74c676928714bbfb5e09", - "4ff67e24f2197887b650ff202ca68a417ff186bd11a1a96c25520aa824e9cfa7", - "f03168d06b860ef4f962eaa54a0666578ede991a2b5c090dbca97e8ab31930ba", - "599e975851aa71fa124784d944c4eb57a6abb4aeeb24caf2ff3f1b2b0b52913b", - "3bb30453c9e16c2ecd25df9968ad22be4590ccfcb4a2fa7a25dce0f3d1009f74", - "c5091cfaaf8f36bd7551fe37193093095b5306c83efcaf26e3b29b7f266811a8", - "68a29dce7061ba41dcaeca2523d2d4b752bdc2d1d8fe189e47e596482759f577", - "d86600d8bdd1e16e1b85f4f90a1cdc6832d3856969d6030bb5fe70f93bdfc83c", - "efd5b37d7797fb9bec22099791dfb829f0e78ac385cb6d3a5ac0c41bf044e264", - "2b131179b24cbb93e223815a1f5bed73eace2c6a7b49417cb28068f60d733264", - "f7a927896dba761d46a934bb60b0df84b00afa6342f950f9a965ceb75474edc8", - "2a7fe9af38d4f72f291304b15674383afec83ecddd263f838e43769637c16317", - "892abbd23f12baed3d56507e1ea9d80d94100891458895bca1343069343cf52b", - "b3b5ea381669e78f9ec7b6ffccd7b12896fc3de89d671764c341d83d9bd7f777", - "e3d0fa5139b250aa71c0c5d69dae255bc001eb1bfafaced8d8061397ccef14a3", - "263c73a50b78da2258cdba064fe25429bc7642eed7dd6751d0d95dcba02c9366", - "370c0cc04e267b398a8b8b9ff2a54b66ccb7f7abc4d508b1eefe03e95bff797c", - "ad622ce8da24b8cabebac1fe2e848aff90ad04dcb564b00e679bd0ef57a9f4cb", - "7f2803ee3645a7dc1b671aad782a9c317ebe61f9b09ab82f6dfec87c8d85e62f", - "d12b9c9c59d509b6ee70cc99d795c4727c82827c3b1b2b62817330e47e949a24", - "af70924d810698af1020749d8f2291a99680ee128dfb6f3767261da8d916e796", - "be6f3957f375c53d1d351a52bd9ae05a42808782c7a156dd33409abd90556f47", - "08e3859572ab53805b6af0187642f69818e4b2d9c2cc9184e548c3a18bd25695", - "6c71a05bfc11a09cfe33ab221232578cb1386fef87bf0e78cde8a57b98c0c7e5", - "e80ff2cbbea967374668e5f75fc5b7106692bc062ed7d113f82c8779245266c8", - "c34fb93bc5484b4fdf42adf623c85c9be897c63be6eec05655523211ec055654", - "5ba855ed140634cc510ad0ababc0ffb311e8492ca03ec17831547bf4cc830eb4", - "ed3dbec86ece4c257ebb19f1c16487107b1ba012a7e607b6797d29e6b5cbe885", - "fc88262080a72ca329d434421b6abd88ef34208fe8115b577154ab7e7fa84cc4", - "e415de57ca7edebd40686c3884c2a98745123339f670b70a70b938875006745e", - "f157c0fdcd8dbeeb61d43712d850b035c4444981fe8fd5f9e721f5420edfef40", - "5c980ce134536d6c9f2557b18dcd887f716c6dea3cd7e3b0797cb29162f98c2d", - "c612ea2598bfd65b525ad981fd6a3b0b30f9e3bbb5beeb8c2d2d0bc59c5c5306", - "52e73ea94c8998ab4f7880503ad05857d09742e50b951d74703963314cdcd342", - "100c883fb7b80ae37dc584446316053abc5a6d5916e125accc5efdb1c527cb76", - "87f8beaf77aae2e09863e459656b0929d2d7d63bc56ccc5d858be1221ab0dcaf", - "75f0912d855b86017275cc01f00d98a435deb520c6ea7b21e67b17f1ec281de8", - "c5e645b28a21ba325a64de060ccc7cadf8ae99e7e0a60166613080060076a3ce", - "3746cf31365a4526d8818672e7dc249f0fe92528fb15c0ca08bf52ad5b677003", - "44c174b693817dd8a6e8600709d3a0539e7fcd86f02d6e370a5b21ac971f7fd5", - "8bff3dec19744c51f48d4564c9d0b9f96b9cdaf5b984dac29837d34829760193", - "64ece808f946eb0f32fabcc76b80712579dca2983796791571bb60421c87dcfd", - "677990ecdf732eeae325994908d428c7baaa3c3d25f86947f6047fa401b3e482", - "e616ae7af399b9b9e78e4ec267ef8c659a5f5e725195898cf8e09d9775108240", - "4f8f616f7cddd81a1a671689d135f8b4d1018648321f0977c7d38e229a34af9a", - "c4ea67afa37f395128e0dd8eb4c9f1c7d68acf90509bb6bad3b8a9eff1804d72", - "26ea1f3a20bcb4c8b5f03aa04797c57de0ebde84742a93da666518cf129d4e46", - "155ecc46c1f9408a0bdb38e8a638536bfc1021433f254530bc95ed30f00d39c4", - "0e7fe6a3c094c12e2e81fbed622e7d256dc3835fd8094254e81ee5905bfb180f", - "02fd0b7089b2a25df97382a9af90812b409a72fe8f0b1dfe0ea4fe9c6977885a", - "ad9981d3970fe69dfcdd7ab9d654e33c492a9fc7a5ef2a8690927a26874765ac", - "98b6e17e3e01aacabff413e261bd63e043d12faf9cfd0c480bedcd45fa4c77d3", - "846ed2c775a7cb7e7f684ddced00232f055c7d3446073fab1f081e780c4c1d61", - "031cf105c7ef94acc529c98ded71d2b7eb1ba13eb20dd46499b10a955999dbc6", - "054879628ebb5951cd2ce1d0e4432dd17d989b6bbf6a8c78a36d5c2920b9d397", - "15c23da7122a67f51033c9ac8c0cc43d8ec740b534c1d7a3e3106a4f6928cd37", - "bbb19e889df169723a88dcabff74aac7eb0b2196ff26548cc0973e79637bfe78", - "720275ac28171f03b15432d193db9c32b535b442847bc9a7334c95efc283ffb9", - "5bb9bea234a9e990a128c33e27b69e84b08f247e0a97e9a09b8d3d44fd5f1933", - "59752330c1d98b7861de8bff0e4466b90b8242fa1a53ef480226cd28305a2e97", - "7799596ab742f671a03ef807b9b298e61c92eedaa8e2c1658e272d3613a5a5ef", - "a7b2ce0ac23a586f8b7e40e637d09970d3d03d5c8506f7f206ca0c3fc74540c3", - "e3c580ecbba1824e1fdc10d9e572e24520093458d43b9cd8f2977781a2147fe5", - "c659f72150ca8c55431c9a25d0b1a7e34bef473dda1ce8d44770c148ab1d59d2", - "07c1261b1c169e6940c2424238b731bbd8ebc7ff85a40d80fe15f5aa531d88a8", - "3f668e5790d99727d076d9d47209eb25618a4193bb3e824aec46fe238b032eee", - "c0308cae83f70d7979fb959b36fda057481bcacb02f320431f474081257279a0", - "8142a4b342e230908afc8f8928301b66089b34ba31ba2e83d3e5abbd7c6faf88", - "41cbe3923cb1ac1dc90848fb801c0b866bb3e0b9871fcec426de3d6303f2b5aa", - "d1c6ac6ce6d64b9305b163cce7e9c18403e37d1e1f69cef75d62e111dc77e2ad", - "446d76c5bed2e375430c3bf1e6e8711c49ec56a9fb8299fd4b5d518cf7fb739c", - "7da27c4f55369238913687b84fbb38be4489b31569f1b2e6a3138a0299c8bfe3", - "57b98b429267decad7fe987ee6f87a5ce4a3004b50514e9bfe4f326fb78517c0", - "7afd227ccb4392c99807471bc367f1bcba0bb6c58e07ec7be452074685db788a", - "4e2b6e1ebe8d736979c7febd973cc43f34657cded5d456f455a95ca3eac4331c", - "cfd1766a218a25593837da077e68bc6f08472e67ce5d580ce2d286781e4c1fb3", - "f4ced8018b48982878228de4bacff773d96c3b27bffc17cb18e3a159d3116b97", - "25b302daf7e5c93eab620e1073ff72f3f537c9f30c9a6df028bb527e6fed456a", - "2355a365541f20d704912e95bc9cdbd67d439c733449796fcfea38f919d292c5", - "791a85b86cc5f5d2359fdad02ef081b20b2db0c620c03e0cf6c1e8551e95b35b", - "6825f4ddcfbb306207dd55f037c4c09848522d123afbf8473200425d67716c73", - "7450bace61bab17df2ad9f9db5bdd3850fb8c1c76385c3aa6f4fca56709a2cd9", - "99d91775e8b1d6a4d59320d8ed963daf65145605efc4ad9659cdb91029b8cd04", - "3cea75a10cb8302c38a2c8b578424369398766777b49a801f6dead240d657d0d", - "45838cf2dd1c6fc1ddb3b44d177fffe18bb26d3e57e9f00ad1e0cfe53d393d11", - "a127badbc09f3f4965355de8b429ed28c726fab5ff9926141e6bed3ae082336b", - "1ee2b3d3ce44ef8429d9f0ebbb5de45cd8677244d4a0028556649ff86e04a6cc", - "6520fd004aeffe6289c7f4dce57a0fdd065c5878b39851c9c083ddccf3a499a9", - "04e92abf29ab2a2a024fd645292005ef384c320a6b076e4f94bcfeabf07f7978", - "6a152614083955ea95c68c414aa68f24f1015d767633f18b096b549b136eab1b", - "fdfacafd6e8d41cbdcb66c4f8765e3977925b8c509bda94c4301604e629a465b", - "4ba61ea98fa7fc72e3ea2d1943a0e0f8a5d1c217de0bd1fb6ceafd71397f419a", - "2b44089c305035986fcca8db48ce1e66e9a69d5afa59ccc16a0b733416d1e427", - "7c4c6553650f5de9403b0067a213d70dbed38f7dc8d8292253e046c567c23cd8", - "801bc007b3f6afdda442fec089d6b5d1e944cf25fed95a4ebcaedbe115dc5276", - "03e4fc161d0b4906528c966a6103d55c18c4f19e1a2d58369ea5a3aa686af73c", - "4ba86a04b038c72a765ae0fced7c2124afa5c7d22cfd27b667f154eee90e5c7e", - "21a88b0977091bd2aafba402e663095881e6d8ff75cadbdb0e373a1e1e724428", - "149715beefa46550ab8e8cb54cd6e8df4c1d32d8f1251bd9e0394a7d57200fcd", - "be724b7a19b5449193a68d761669f7d5f9089892347e5be14f8cfa8fe2840ec7", - "e0a6c53b181830bce13dc5e0b5d5b59d01aedce7d47a0103aa4a4b34b23beb76", - "d5b65475d267229fd6a4b00404ef48f90c9060e9a5096f6f3a1d833bad4cc2fd", - "e3689111387a9a3550893c010675a951ef084bd44bed47104a8b69681cd870d3", - "3bfa87076963826cb876c6fa148e37121b4fbddb96407511492138be1b84d9f4", - "bc87c549471fb5dde33913f824c472ee1fab69b7a7f38f3eda5cbcae80130f93", - "235116ba2aa6dd4b44be1b57c038115007867ff43b5eeb8bf3899702b54738c3", - "07ad88a3b7ceb5b20b4072f80a9ed1c8d59b501e688094102b21079f40164f90", - "2ae408c79311eee284cffefca754b0c17e5ac6c6879dcdbfdef0276cb628baa6", - "68fdcffe9d65ffbc5e766f8fc5ef074cb548489ede6d40d364a05b081879b9c4", - "584ccbc0f05c7b2b68f88f722dc89e8e7458a3cde2670066d2d649a2858629ab", - "2e2a5e6c202968bbe840ad930ac19cf3a10fc35486a3693f41508e0312ed638b", - "b608f2945313f5f9a93f27b1e514060eec986452953c1393fac7423b6fe9041f", - "597652713f1d0e147007f927998ea61fa979b1b5a64d5a56baa420ee55c0d8d4", - "5f96f37ed1d25501b3c93243f6ab8d8dcb62fe78c17fd5e15f41ab7ecb53106a", - "d5156efca702d0fdc6e666647c1157ad642f72811912ce3d9091afb436be0eb3", - "b83229f9c78bb317fac0e06c611c002d2c0479020eb0c99e083525a89c3a45f9", - "099e148354713ef709858b72249d2225222199368719f5d092e7e36962ce9ea2", - "c1176c339aefcddea35fb507784bf6630b80b03e49e91c12bd36f532f2191ac3", - "bb8d0a047767e96a2af3867737d555df28daa061dec51b450b0f7a4495359897", - "20004d94c97b927432ca95feee60efefd3b8027629d01fe2be834d03247c1895", - "e1877d7f936acc3397c07890563592f0d095e1293b97e88eaf9ed3225de49ddb", - "6544f29640e26406056846e9738c62dac202ab6d6fb403a8b6c4f19860035ecb", - "7133f0b1ed75c8a905a3b07f4b8c618d404d21b152ff31b8d26ca2c21dd5359e", - "446413006e2076113883926dc167f5ac1687c86961c0358fd3abf109d1e29d19", - "791bc56cc4e01179ef3aa1e0843e7560b5bf044d755d472a10bff5c9ead8ae99", - "a8cce2f3aa322d4860ba420abcb96a345219ebc507f1041a1022370c07e88695", - "4ed259ca2ca3739966974c3deeb5ff14bd16242807f8739990bf3bc76bd8f032", - "c2e4696c284c1a9675e0260d655d80edca33d8387b1d413b8377e7da09d0e2fb", - "95dd6a2b17668d3a0cf4aa29efa5388d184977f99ae0550535d7c5540cd64782", - "8167719e56077392b4319f2a31cc51eb58b50fbc6b4b0fc00e6cbedc89d401ab", - "7230c8d2773821bfb14d465ae629026cd72b1c4ec8098bbb47b26aaec786be87", - "3715328d32aa8eb2f503da3f9f89697b8d3cd8d29ad3a730c32707d6faff0816", - "55e8db48346cb70bbf628d2dea2ceb09e6e9003c5056cd52d8e68fe5c1b0d0e6", - "16fb794bb264e1595b2dd57f4408790b9c6990045219ed6d8dfc8d7230c2ca3b", - "e8b703d43902f10eeec52497742b386aa202a8a51d8f2a761d5adeb7b11c1832", - "4714bf907b84d45374fba038ba0edf74f4c48fb2f778231d3b1ebbf86426982b", - "586939f21e4fe9e86295cf839784c1c60c717057fcf308f6f0a9cad3030d5392", - "9b0fd0cffebb889b2f48e06f5a1be036d835d11759e288ba4664350a34fbb833", - "9b31f0703034a693f7524229835c4e455134e23133c8285632459ffe22f3a9de", - "17a9e79e0b51093599b250c4065e366deb00a17ed2ff99f17e8bfe9f96a7db8e", - "3caa69076d43be4f2327eb5587399e6e594f54d579554e12a32af3c97051e9e3", - "b267afe6aff77817ade1fd2a10561f523990f09cfd0d809d13320d9ae59d0d78", - "6ab257af4da4e8d43106e49228c79e213da09c5ecd3fd12cf3d6236877f10981", - "7cd0a6c66ebc4ff62b3d0d242dbbbcd9baef10409603178393fee5fda256f386", - "23e0724c71c4dccc2b811e61a18f27b8ade7392013add8eb485ff329a947fcee", - "04f29daa63f5e341d958a433dfc5bcc42d023c7baa95d1fc8036c97b10ada87a", - "d1c9e5cbac8a73802e2b589d74346fa497b0f0c7ec0a28c5b4342a812f2d055f", - "8b96abd27bab0495538705dbf5186ae03ac78340faa559be2e03e2a6c8f72b85", - "f8b734f5d733b7fbed3ebc892eb6f253c86511fa0df3bdcc226b3739ee76f382", - "ba83449d60ef0e6efdd4e3721b4f0cb72c1ffddc833f9b079f5aba365d4393ba", - "959ea3b3c39e96b28b6e8c577e706988379eaff0f67493787c5350c271169a07", - "ec18777aee0bc1edde8e3916b81cb64cfd59a019435df44c466f0b113d577d76", - "70b54fc40c803fccb986a4e958bd578ad2c48f6e6f4341284d38fdcf4995673b", - "aefc7d3665474ba00836b087f87a86cc7141e7e2233ff6b10bce8131cec1ec1d", - "b81bbcf82f6f6d1f0fc6aa0126bc5637f8583401064fd6e2946875cf72252f42", - "44695fe14bfe765a101b7257bd91f5736154d3a2b6322a099a5a046c411320c2", - "eb641537990fe50e52cf4989410ca201989057baf0452580a17eba226eeda0ec", - "73e9395d677363267e1034f4786bf65c472c5a7b0b6fc4eccadb08efa1ca5496", - "01abdeb4d1f1a81816d997a25db347b1d1964483873a9ec4d202fb67b0a03273", - "64c674264c95a92691ddd6a002a180a91814add1306edbf71430648ee23910ec", - "07c6cacc275a49f0e2213bae52612b60c5e9e0e4a2bd6f25146625d2af536c3a", - "bf253236de6b95ba38d10563b20ff5bba547bcc4dc950611b18309df0193dbb6", - "7714fa4eff9da0b8f0598e328354f38c09290146bad5fac602657b5fa411c66c", - "add982900bdebcb3571aa5b76622ee86234af763a512236160bfa5fa408a3abe", - "e22e75eec55065fb5b462051037b21f49c42ab9e37fce3fbf1b5ea5346b78314", - "b27ec5062b2572f59928141a8a8559f13280c6e7bcac68d173a3f1c0fda5d7f6", - "86da70df5f3d027b9b3fb0d409d8ded7f6ec3513382871c8d9c89c36e3fed820", - "af20c59e6ee605badd613f7cf174c7e9deb74cb0cd23ceae3e67d5f3427e3f55", - "d5c2da2b12bcfb30c54d6f71064e205c25f879b2ff06833317749a25e949b2d7", - "983b83bf89319c6fcc66299d95a30172e3f0f71ce41c5e508afef835d4741e3f", - "d38a97c07e2fd417dca809546f97677940e70d95fe230ef003202d358911157f", - "86afb1558a7412e4625f80acd5832092adc732ea3bacccb16234aeb6a5466500", - "5f5c91ce5beb9ad1c14f2db925ff00f37c1f238ce06695db430591dc81372aaa", - "eadec4d272c6eb67f3a5ee1899808117e752f3412f6ad110e9af01b98867af7e", - "99c2f6b8339d189a39873daad95a0c220bd5ce593f011eb00cc0a6022d0147b7", - "e40466ec1bbfaae0fef4108fc894df8b33e58a53d667e975282ebb201a49baf3", - "09f5dfb5a6202a8942695eca89fbb6359dbd93df1e8e0685b359b911d6dba478", - "4a808099c801e3cfa89050bf14945cd2a0cd504ddd0864b8436270b3db3a44f3", - "171c2291086503dc3ff1bd2a9a364166641822e14e1b8bf8336f4c1b0773a334", - "7fb39cd150b00a67d6a275faef95593e755b9863afacf9ad1e3c3f420d57fd9f", - "20192c75196f521ead3134607d187c2610da93725f711a66c4cf6a3d541588ed", - "2787e114ba72943df328f16d66c7d3db125f2643a54457fd27a5ce2445870155", - "7b79293f23eb6511c5eb141d45ea7ae8ebeee3cc0c57b1097fa798493d823361", - "a2aa8a6434a7b5d52dfb39be23e149d41879c238019e7f210ba72ed78c355cb4", - "5a3239183546b3dbf61db2e20ad83fc1c2dce3f551b3cc4a535385d3717c0306", - "d080085bb255139c7d35e83dc758eec612d548ed569e7dd04ca6cbfbb54a9e47", - "fcba7eae80d80d2dacc6ace2a2d371293adb9d28a95cb0ea8bc9ba8443d9ba01", - "83dfab9340a088745b31a4427d5ebd6f63ddb1db8812301a0b137e781e09d96b", - "90fcdfcf2a773cdc3e68ff8c4c3c14a77c719f084455c16070e179cccc10af15", - "1c320fddd2223f984c6d8f6829dc3980387980766c3e1ad5b0716cba6955d94f", - "dfb5648b5ccc4e39986be0af1ab50efea4fb82808a61437eaa0db249baa3c008", - "a445b8cb2cfa620ad7866f30c56e9ba14842fcb714dfe715b1ca677601e93105", - "dc21c4a77280034210c8de0559400296cd963acf3d71d00886c6677b84d23f40", - "88fc983244d9dc28d2f275a7bec9d12ef3ed0f83ffcccd64040eab70f505871c", - "c6936b6be19d1149d5e5ff8d9572e7eece45e30a6b0fe9a4b8d7f5b70258437c", - "f9c98232b8465b66937634ab10cd191905ab6b144ad5e7cf22d696c4b0a2a833", - "e02d4085e1b6f512506bb6b1a4734d631304285a826ec51f7ec2535a21a5a65e", - "eab770a38ef87c552dbbd01b2e5b08081da023c0a85264fb63f3fd7dfeb7e574", - "ec0a8fe06c7ebeb3e98664696a405be82d7b54ab68b11ffcdbe7f75a9c41a16b", - "3ba140a0b2488bc3f4285834d723a18db2707717001494da0c1f07c31ec0a6ed", - "8f52f227f7eddbeb0922349d8ad4f8521de0aa16309abd2718605667a22f4b5c", - "c4a9f4f57ccc8c5f30fe272e02c6365521a48515502952a45250b660f9759d39", - "e9e04dbbde8ce26930d36a25adc7f32054e531f41721a79bd46030bf2c6dc494", - "4e134dfa12f2b7e9869924858c99793dcc373a5bf332a149e8fa38a21631bb3b", - "4dbb35f780b4eb4a02721910be594886af059bd396bef1712662830af19baa55", - "1e85a205cf77b01e768821b4ee98f84a36eb07caaf49fc35f78588dd400b6cb2", - "08295f5723725b64be2195eab6ac7820d755fd75b62be06943e15af1c90cc25d", - "768a159e06c447a4e732713bbccdaa4b6e3b1fe095c8d1afea14b36ee8ea7afb", - "211b5f88c7c4a5d01a1b83ed0b5aaa01e4493c867c4984715ced6a0e131441ad", - "47e94a37e42f19b78cb81198d05c89cb91980d88b439463e7897ac8484441e09", - "7498c972c5b8be40d2c05dccefab78af9371f1df43ff38daa6e651a98bab96a3", - "8b6d7468d43afe5c6f033bd2e5665ff1ffa0124a04589bc2a159772643ae9e0e", - "af0ae8714ceba4a2fa59193ac5a77e07137d00be9813c8f888da8bcc77ce17cb", - "a291e9ffc4ceeba025c587247e93f76f7ee60e272cb94c9968fa71e2b4d58541", - "7586039acc5de3b3c1dcf81ef0da98b798af801bdc4586754315e0666756e5ca", - "45bee5c8338bce62be632ab0ebf2f7fe0aece1b79a59a403e1a9849b464ac68a", - "e393485f8abdcc94c41a73c90d12184effe108c6b93220dd1ac3cdcfd33a0a82", - "ecb255c9774569aee1e00b26d361171b0edd45433e176407d51c9cf6224525a0", - "aa7cd5e147bd7bc8d67504d789fb8954be11d26549ff617947e5809186983752", - "969a072789da4e489f3444c06021b10ed094d5b8e39babb16587910f93128b67", - "dd77688185bd879b8b3141d999b408977f790db6842fec5878ed1f512e23bd96", - "4ce1f7af50c06a1aa664b6cd037773fb319dbbac9a1d414625401e0ec48fff30", - "795b9e6d8dc2a0ceeb4ff0a881323818529777d4c5640cb007e4ce28aab04917", - "7b392658966aae337ed143ba09a2d8de50adeb258531b1729aecf30f6eafe038", - "cbae807105e80fa7735b703f105956b94cbde15a930c3d522badf1937eace52b", - "1b751217b19fd937a8c4e737f991904015b8459acbad605bf85256488767ea51", - "b5a6c010d7b01589a757f40971d750b16fdebd1f7b190fb3dad6a2c556cd1192", - "5425eecc225da218554d2b69fe31143a8a417ae3b0d5b0b90e4be6b5788033a7", - "c50e13c02430496f22fed65457e5b76f3fe48e28eea5f0fd6fe2282ac2b4ef95", - "fbf6e44797f02a79b6f720925a601e29f08171e64b1707768b1b13fb9e1ac8df", - "4866bf2b0097b08345525a4868694e44178ca3efd7951f4f818049505d5a2e80", - "d54c036b0e86b438c8c614c3f9f97ed5cb78834fd44bcb9ca720f9ad01d06a67", - "273f6efef737445b572b76fe5e405a5e9c5778d1d2ef934e00975939b1c86a34", - "e103a0ea7ad77f9417905017b368982ebc54c6c5403974fb351fe3137f2a5d0c", - "77c262c7288f0638e72b5313cd574fb0cc1011f5e37a73ba2fe4d5fcf12b8f9c", - "036f827cfd63e67ed0601e26875c60fc58faaa5d012577b5161fb032fb5b25e7", - "813a0b55d2589663a4b56934d13f130100704a29204c51708b7f67be4d6a2472", - "4ba980b898bc03241d754251f789590d4a7eda0d692ab5135747761e275d09db", - "20fe4ad3521dd6670fbd3b0e0b5896526085fcba8e35b8347c36bf9148355750", - "4d21affdf6ceaf3786a2ae45e6e2fb27507856e9022ed66adefc337928258bd6", - "9b51002f92798d99d87c659198c8706403f330a5941f2675460c881152c42c27", - "286f1b4059e7302933cec7e636558262f20117a14e6b7d56241e3729fca65c98", - "d081d4002ec786ac0d4d5d7893b2be4e3a4c64220a39962bd6e24e06355c6e65", - "9e4550bba00cb832e213f1195fcaf97a16b1beae44147224247d1735542a5774", - "003d3c8d61556269e49135548eddf35f351e8e493f8787afc2f1ef98cccf08e1", - "2dc42648a0e66007055865a2c6eb403d4089f0473c20c01de82828cbc0b2deaf", - "9f4ac9a861c5ae59a04ecb0589104ab59ca4458680aaea669d909c87fe4395bc", - "64a8a9d455dde4b4e74733283bcbe9c72ae48b10f669b271fb09c28cfd006f32", - "3f11ac92b2089eec03716cc9caa5e9393bfb0f426c77705f41052c9eed8fce92", - "5d7a440375731df5bdc53e31f879dae890cc3ff5601ed0cd9cb20e4f051cb318", - "57c59be2d4efac7718d2eae90b768148fb036a8a5096dd60bff461994678d319", - "e8ec00b112dabefa8523d5fc743c2dc6567b6f7e2d1b1ec21ea1b92249f9dfd2", - "a5b4188946cbf9c079842337e8ae82efb87692d9e4d34024ba1509b3d5f0a3a1", - "c4ce69d3c29c2ff5e964165da26a7670e2d585ca1e133a24d428d15aa82b4d09", - "3c1a913617ebcd4eb40cbbb27d478619bf75a1b849e1483d37ffaeded7d68a26", - "60df757edc022f882962b1bff36e1f177c002888841846cd19b362e2dda4e6ee", - "ea5f2c4eb32f5d155fdb9f0b003e4772c380bd51bd9b4dc2b5bd8cf88913b43c", - "ba68eb38d59b20b9b52cd150e9a50939da28af6a4fae7484329e3c88465493dc", - "d660cd3fba7090acbbe23e59119541d1ab56dfa6cc9b3341bc41eafd75f37326", - "e8452afc8d9a9931d0f877cae9eb7420d040546e1e74a7fc94a790bf93cd68b9", - "f025b2eee4f84bda9113b609e96a74cb14c47ba5713b50bdeb1a0b9e00947aaf", - "d9b4dcdbcd0cd98913470310b11cbd695d48908d470722b91dd84ba60623851a", - "e9a86af24ff080f4d7371ef837511d0e33c8929eae5a89198234522f1409356c", - "cc51de4d431d9f4a9dbcc16b70fdb02c30a3afb55474d3a135128dfa0ef0ca1f", - "2b6c44022561f94e068ca72a02bf81c1c3c30b793a0b5589d684f148a77cb6d8", - "bb39323405179b3157545200bdd17cd90799322a77a0ac0998b229d81073faf9", - "11e58db9cbd9d71240cbbb84d7ab80e4eea35ff28a6ca5a3c236abe6eb99b439", - "d9869e331b17a975aade708768551733801f06cd86773bb27999cdc27d1c8796", - "776d05321793a2e7e1639f8d170dd3fd286f16c09eb4bcd61146ed3923e0dcc1", - "93d22e2ee5f6a2fdaa96568cbb524eb9568b6df2f405a44a0be4f25e9b9c0f68", - "5933d5abc4b4dea0f3971606ff18e1a99e5c62f8482ed80f5fb13838aaa4c23b", - "8112930b70ab0d87cd439047fd54a0026806df38791263dc6366ae82f4507077", - "c91274bc64e6842fad73b0087cd6f4291bee4b2b6988952910b1053384e812ea", - "73a12f02bf32bd962bfe99feb1cbc5c24937e1b3e0d669863a8edc8474cee0fe", - "227b5a673d946769915eda99a2fb06c4fd0d7a2f8a11a3ffca7a02e0fda2bf7f", - "31dfd38faa4a610b9b0dccbf921787aeef4922d9cd740be08801764edbb93c54", - "5df66cb9eaa96a32e55b74f844e1a0b55d3fbbf61ff4b5d5d532392d37fb883e", - "9f80faa123753a164057ebaab09ff75092195bfebc8a5ca24599f06d1d026bfd", - "4825159ca348f7fe01bf3495064dbe8397d6febdeb686f1f10424c43d394cc9c", - "97b1cae7aa11b88074e355cba2fc45dde0db2ab949eb72e632e9179bba8917c7", - "a16d8fefb63756cc74fe430ad96a6bb831da46869bc1dc463a7ea62253bcb8b2", - "43d4f712fa9539c27335473b8518f5509953db70a3356a444224dec4b165b74c", - "9d8521a2b50823bbfc8d574241f5aadf769fb6e28b5aad6867835602fd62a847", - "ad33b9ef7b1e9a8a007579af927b525753e18a92071eb1000b50edb6a1669a0a", - "c2b1858e6d8c15d35f9d4b8b01948cdc7784a0e570a57a8c098d495b4ae47af3", - "c444daa0f13d1028b6b28e90996dcc8d132e780ce9d13c0dd1d2df328e6e7fa5", - "e1035a30ba1239508ce8a084a630a083c51ced1abc75e04d24d98bf4fd438fd6", - "4428c56b988e2d1bb30d1b2469880c11251c624e9d8cb153c65493ea142cddd4", - "324b57576057140f726f77a7d97a3bc0bc0db78ec0f19ab538bdb19543820bdc", - "72fc02096a27a76bb9b0438a2b0ed45dffcfe6b7667ff1e8228c10713a0f59b0", - "36456fbcf85c5d59664534009e9ca6c2b5a6ef5a268cd0cfac95fa1fd3b6db06", - "d29f53d132d569289a62d8dd0ca19313e35823b0b4ed13264222b1af28464033", - "cf20b5ad828916eade0c0d1c6a82f2e0de8cceb75a10e35974b6dcd8b4e14df1", - "e6ed5682470c58bd793452b08422d325467dc5bf84aef8f9f33a2825fdb3aaa9", - "94c94a5cd373eb2937ac0fd795fa650d6ec7b35559428a817fb0939a657399e0", - "525cea5313deb6f50854d0f95fb4e676771e0fb531af34f1155fdc0e4d358ab7", - "b7cf8e7d936a94aff307b692a98d98cc0a1f9c5410440bc412106ba16027acf6", - "615991913ec279d2ae0962d076c82c3972b21bb47b72d2b5d485cb965c1def2c", - "a2033556c6a8dc0f97940d553afb76f02c1d62c40ee42ba400b849f3c36acfb5", - "fd8224ab1ee0b346e6a9d65a60970012774d1d84f536ed5dfb072fbf48ade550", - "a266590a6428627e752209b95dd968861f560a461d58c9d82eb81029f12be099", - "310b8c68c411f5213e6064b97cb95928ed020ae92d0efff577aeb25042c8e7ee", - "1f14ad5924a843a74bb128982d3744cdad217e2bfd91474cb9a8d53ea00de9e2", - "6e78b7a8a6906ff00888777e35ea18b74ee1e63ea27ad6d092331618d674f791", - "53cf5287a32cce342ac158a0d6c6ca96e1664cfdfba8ab416cf6130ad325080f", - "0499ee01ba2560bf9dd7dffd2df9c9fa3227dcb11dd2e44cecca6977a70ae546", - "b3a2d3c545a8077a1c47ff46591d9fd7dc23b33b024cb0a4df6630368280ae96", - "2908c1c290cab57080f60259a4b950e92df5a0b974d7691a8d6cdba5ba602892", - "a1f679024228d24a4d006e204193a870187be1f3c4973658205334448110130c", - "5bab75f14bc1645e42e2db837f044d60bff58e130f368b902a539616903e8ad1", - "9537065be7e7b6b14410eaa735e76f64f7a5e84e93f00222a89e6a7e37b3e624", - "a1916312a48c41b07795e9a47e5690392de629d94e1438d9be65c7e8132f2e9a", - "d9557a3e9937ca2a8dd8192f371cf872eb3cf5a5e2626be50d5611d81444e471", - "8b5e34c4d3178b371a52133eb4160106ea13eabb9019e9394d6e2862ea904041", - "532e071fd7011e9427c0023d0e64cedd061d4e1fe0045f4a7087a94e64e67aa7", - "af381970d353ee471b520b4e34c68f64ffcbaf4542b193195af1fe4162d7aaa8", - "07b197a7739111306f7518f980d1f950ffe7c9013fb28404ba0ef328d6baf9b9", - "9fbf3ec7c17f0617c6a9c16e7833f1d06ace56b3a7bcaab0a191257f2c01e6e4", - "9d9499dd98e697f2aae752cbeb6941bb6328b125ce2e1621beb52d66f89636bf", - "0899fd97be23fd632217451c52c85b6d7f48689387cb395ef50130da68d016e3", - "1920660d17d7ac3a3f170a0e81ee3ced21ed1350e937e6783fc4cdea756406e7", - "54b2584d29d5c1bdb6e51f500a3a94d66d8af7d1286bbcef40ce63b4e5b0b78a", - "ca1a65e30ec3d4257f6eb05ebc686a7991f0f25e847f6c61aa3b5cf9adc66fe7", - "0dcfb3d273e1e4142d36aab6bcb6c689bb5ac1d3c68043f888cb042677e74e4c", - "2a08e16c460691a0bedce8f050b012154c28ac804689492b577c9fc15d46844b", - "11d1d1e1120979c54499b15b638285de0a1277f0fea7641383a095e8a20d5738", - "505ddde043bf6db6ec605f1af3b4bf3ba74e1c08e1c7f7d3de34e0dd8c3b3265", - "9d315eb901b3e4dc8231bee8828377c210160bdc92f0f5c49ad752980aa3b246", - "13302097afeb54ac5d8b4bff48b08fac012f207526c1c6c2d12142c95832f564", - "b827635996596e4ca573e1f49500598c5996fb81aea947cb50e21e21ae1c69d7", - "a4e73de5a5a65470b371ec2fb451e276fdd3fc773c7efeb1a4a202b4700c477c", - "734496acd25bd57ca7126d2bd5f14e16043968f80e239ec66df24c1cb2152ca3", - "c8ab1f221fb2c1d56fd891bab501f86374a81248e6396726739ade1fe2ae035c", - "f7339b1091f08b599924a22847d8779a32e00cf35726c55dee1bed84d4574f03", - "3280dc39c2096bc6a75d586adb551f7b56dcc32c95d422b6a8f840e6c7ed4c50", - "8a5df314093c18d368bb5d26fa21ba76701f62e9add2674bd10f4cee4d82b8b3", - "49b1ec2d811a5d4ce6938d2e6600b50ca7f438d265768520e388a8cc41fed007", - "31da3dc7d010d126b2c63cd8ab6c5ac029d48a0bdd4a466edbeef30b1ea8b270", - "ca102b82d577ab90471b644571d4dd330262e5723fb4e1ca87b2e2a7c1792423", - "b230dfd5171aa92e3a24f620d8f25239299a91e25eb9a5fbe7262be3c0fece61", - "348df44f7e381b9c476f8ee467a997375cf5c77a763f80526a57dd4b29566d44", - "a20cf6c19e095b4ff165ac1ee16e6cd0ee8cf240ac92ae710f9a000d3313ded8", - "4af191b27e661a425ec609f0dc953075affd476d4af8af09b1f15ef70b1fef7f", - "df5718010694139e635bea57ec01d25cf0de2f3d0fbd01bcf1d2cfb72ce33b44", - "e0a3568882254e2c1e91ad73e3c77e63cc4e421164e57125457af4eff57b991c", - "c139890084ca98d822e930a82049d309cbe0e55df215fbf5ea2c82a49a5106aa", - "85080ee079c8dd7332ad05fa5c6139c6661df269f868c364631604620cbc6575", - "e66539408320c76ed1cd87cfd5e87b4691e7b9dbda31a010982d0a27a43f3435", - "b62a7e210f9be18b987150f88065ddfc6eaddaf4b20a2f282ee7d49724c5780a", - "093af267d0914c058cec727e6c93b6b69a7a354e0f0014093cbf15d71a95e920", - "2c7d31144a211f6c82f78a90df739d234699329d2d0e15109e3ab0d7ca5ec85c", - "1951e7cf2d8b9a4f01b2f7e3361b89210272599b88dcf3b42e917b56f67c7a3f", - "71ce70ccbda1609cfafbb9f00c923a4e8b0c281b2507a3335e907f73b598a948", - "57660e3c0c1c2623fae6d0a1aae0e56e88027e1b1a933a51e3d52a158a583fe8", - "0345aa755740720c7e0ff065cbeb6ca5d27c7b395988e0792afe572717531d3b", - "6ecea4139fe9f06b4da923fb21d006571a6fc081c085dc60370ea6ad5c0bc2ce", - "6ccb140a8fa2898120d3d6a79e199bdd065a5f67d32063bbc9500c0e46e22721", - "1fb7dd2d3747a7d89fade788904615c53e6ea518e7e2709929b41a319f2ad3a5", - "1a97bdf94705b67544642a32bc13950586af6e1f03f1c61e10bbabb3ada62ef2", - "01457614da3c0d4b67d7f3f5f058b2ad345d0f12d38a55f4b438885c80f98dd3", - "8179686d6ca0b3a71b0d93b08523304077dbda5b8a9b6430dfc6ee36bb367a93", - "752dea55f77f0244c4affe14135beebb989883af6cab91fa20f604427ab20072", - "3e0397af428eded0ebbd17890de5af462b04c5e474f10a7f721b6ab376a08d0b", - "b01def68707d41b8af31ee2674cb454b97f6762dac218bbc03545d815c0da9ab", - "6aee53f0e5ed1ef15233d3bacdd80d07531865e1635eff1007105eb4486ba249", - "6d449139037f53abef1c21dcd07bb297df936c1434f75754f26cfa23d03ce741", - "9e1f396c68812a8a11d695df596b4864ffc32d40dcd242cc20cb4367cbeb780f", - "1c3e25636c436d6a76d4f2e9a395f1b16dcda738bbf601a2528ea495811f3d47", - "928e1704ca08ebc128ebdd50fe6ddc13e10c9070bb7e76105cb5e23b08d457af", - "06b1e2a81adccac871c86338e26a0444a19e4022a2c606b92b2e35b796dd7af1", - "213d98c8338250a3add1ecb9340614c9cd928b2fa6f0ead44a2af87ac27c8aba", - "d092171cc631bb54aaee86db76fab5096bfc0ae52fd70b3a41f8bbdf79f43f22", - "21ba3e02496259a0fdd91bf17db97f9fd5f989f1336654b844304f664abb30d6", - "80b50aed174563d7c1f7ebd4675eaf00140edaeec3b9d3fadbd7e6534e7ccf51", - "4787bc2ec7745a23115902cfb22dcd2124476eafb0164b714815c163807979f6", - "3ba8f25ca0e5dc3ac8292540fe4fddd00ee91efa523bc9bb82c83b393f79c61a", - "fdcaac7e44f3bcde326926984d65f96b93b77c51e7839ff7103ac82128da3432", - "2d683c8086eb9281fb4417a1daa00223a1268f38415570018814d6b52fc43041", - "7f7e9e09358ca76b00bed72bceb0c41bed1c4a8769887f7c1c509f9de4aa80dc", - "c0c4faa9e96cf52575039035b23fe36b3b191083ce8cdfee31e7a0544a8d202e", - "62fc8fdf62241ca44519ababf24df3196463627aa14d3c865999bed2fd29f52a", - "6dece9b083a1c5413b5f668074910d84ddf25969741d152c0a988b9900a361c0", - "099b77a744759bb2eb5f80c63bd7fd9ff0aeed77a060515779f350cc9f0a39b8", - "0a8ddcc662357b40070ae5ac589f4e419c76c5408537c358d7464443294ac449", - "a836ed3c17da88f78363ccbe286c24f80aa38e86661b8558ee7ba74ed9cc360c", - "f6f5ceb25e436bc5d6907de4e9abec5db7fc606f01bb1f23749bdbd2f2161526", - "b49ec900a840de3663f9fda9311f32342bdd4f96c60644784900f949aec34bba", - "9ac04af9d8992fc84664bda182ff42a7b8c034518d956de496ed503218203152", - "4e787200ba220fd7d5c0488cbbb28bed3f4eaa91ad9956e23ff050ca82145c56", - "e72e5e6ef08a3abb0b4bb489753752b6fcc33b04e9f570b4c8a5fbf05dfc970c", - "819391ab3db2b2b0c099566d06270a7c97cd50450729c63e594c360989f8b003", - "e496fe1c82cd1c22f1777ec5674e1691d20afc358d164456711864d8196c2157", - "1f0d6e461297ab9d390f27d187e51ff78a92eb7f5618499d95603e57b312008a", - "242fdeefcafafe74883960560344f015dd33bbbe3c67deac9f5d16046a205e1c", - "6999479c7d51a0e80d78920f7b6e1ae8c9cda83e4ed1e6dfef85fed420fc3446", - "2268adb975e2df57b3320f972097b38d65d44579c18b4133ef33ac1ca6604230", - "48a63bd3976ef1a10055e1c7baf3a37ff04cbaf054e81f067017124bd218710d", - "c5a7747b0c71b3a5fe8ec6281c8b0b90055622721d4e952a3d9003c4067c4501", - "55161545f22f66bc5bc9385520c40600bd3c608ec9cccb3aa7f84294c7e5ba93", - "1b9a29715412cd67ff66cd56f94b5f4c1a66ed391d2c65772c8ee42ebc9ba157", - "15dff337bc2c463b450a73801acba5fa879e2ca221c8757e02348183415385b5", - "e4e97940448f0433c7aae81999ff3d61de8b9a409ad54630e621a106ea90556e", - "4bf7655a08a8b976392c20e2dbf3480a9832455785cc7b00fc8ac85b94fea61a", - "025cf3ff45639912083701e6d61806663bc96a2926629ee8df6cd693279833ad", - "e470c82700b095200ceb7e1908ad85089bfda955cc50c27f0b6cdc008da0bf62", - "20ab96b78882030d2623ea27f82afe5368b06a47ad3e7bf1d918d9946769f4ca", - "86d76896b1f5cbfa281fe002848a926fb0acf79bfd512a3ad70c5c006bcf98ee", - "4abee23cb9a4a837171bc82365a0bdc87ad984bca79f491413246d97fdc385dd", - "3bec72959f8848d6a921d00a2581253e14802dd167f2beb72124a284899a9565", - "9d8ff6eaa10ad11d99962c550a192c5edf322984cdb6714b202fc4692947f9e1", - "798b3ef32af158b31d6a917ab239dfa7848b32b8e70703a3cea57190976d6de5", - "2bf70e263224d314784aa880c4399ea7061048bd5cc9899aa8fb88842a430fd7", - "0f1921a7ab7d78c07d9425f214ad142cf2c42ed03d9076c076d7de2e41ceb55c", - "b56b219e57cb474607412223ea97c915476906803c5565930e5750d740568d73", - "8c39dfb3a6bccb32b69feb304483d57364088c8e5fb8e5abe2ea08cc0b45700a", - "36caddf8fb84b714f31b47ce73f7f957e8ff95939cdb1820e83b6080b0ca22dc", - "e3970458501c834f0b1c348cf12151464fe078a4eb358f5ec15c1d38250a9ba5", - "4dc9ca125641649465080439af3aee74204735432eb646bfa260fbeea6f6800d", - "5702514dbba4fb4692587cab4b7ca7c62e3fbaeec9b198d696ca1a30ab726a7d", - "39614e86382130bfc82b5ad47a7745e2d571f95bc8310fba67ef4c78ff28e0ef", - "eaf028ba722894d6211c7c67a5e7328a126e3d20b74bfa12686a7edc598ff5d4", - "6bda9a68ee10d8c24ccf8b38c2b93a1452af5e17ab9bcec10e7d5b1e1fd9062c", - "4bce7bba3678beb51f411e62ace7fadb4e3543c96d4ae3251c9dc089b9fed4e4", - "96fa0d9166ff419cbe92b5b171feb947bcfb424ba65aa79378224c19b4390953", - "88b93ba12e8e6abfca5104abb57bfb06501ac45a86cdf6c83cbee59408790b44", - "e6be764629046fa5417b5ced90f267cee2b264cf6125d405be15b04b5061b75e", - "7222ac4c778ebfa531a2ca786e32d3b890a218f97d1c9edf352f588f2b963b26", - "67ba9fb2f39d26b82301d7e3e185d963902a08e7de7597c54911ea797783473c", - "823d109999db03fecf716d021d34029ec5a7ec7f36c1f8c97a0f9a00faab3fca", - "72d7ee7a939d3693843072907771d2d825748cb1d7818b0d45bffdb69e9b064a", - "ef46ff8a7b612ad04785837c410ac6690e1327c87ba3ea182970dad4d779867c", - "d075fa101edae32bd7b8f73810a4dbf8a50e1fc5eec8ded950a4e1f3c7ebe294", - "25f64ad612c94991d5241af5d49cbc10000138313bade97457939ca1c3cbd67a", - "8da6df0e1468d6f11f14406f47c50c1b3dd0c13599ccbcfb0d7e7974ebaac488", - "d361a634aa9717e5309096da934280dc83ccc5d1b98558e7049d4405b2145627", - "cf62682e484eaaccb56778e2f9dc6e95da5aa4822f3af5d36ec7df1002849f23", - "7a9613643c894f09e28de687990b00145e6832db6c24bec5246e431fbf1b51e3", - "9c74b3955eb9e8be1590abaebdf285c4d3748fb1986a7e7e8f47aa73b4aede2c", - "a012d9c4fd9d2a1a46edaaad27a117857d1e026793f3b905973d7b34c3416195", - "11deb356959203411221f6343911328953ea09f3e8982fe825d85ea84eed7d50", - "d4c4b8d6cec634672f925d2906de273dbe30009eca26423b4bfdcc9790e5fa75", - "7c3b8657116bb558612ec9b27b9aca4d448fbe73101d21488561918dd13de9a7", - "3f0ec5650cf8743d29400b5212a75beddcdc4f7e59956cda6489ce0556389991", - "b40f1c07e93e1760f635687ca6c9ea5b84e0ae541c5fb3c6f079b26ebe497ddb", - "fd494cdbb96ab01f30b689f6183139f883f8abe6f1813c32942ac33e783bb412", - "3ef468ecd3953261e7148e0b8c0b5a9f9a4ef1e50b4140d3d3b1f6f3b8e4e96e", - "77e312bd9c35b166ed9f1cf15bdc936c86645bb79f45cf0dab916b7f774524ca", - "227e8477ec51f0e5c0942027c6f2565926bb31ad38131be041275e84a580743b", - "4da7da539d247dd3f1dcc5d414e922001ea4b976a42f535faf7e9ed8a256f952", - "3874ec2c861a6a973e3088deceafa4c3a4a560189699fd1924c8bc316591c331", - "99bc3190c3a4652ef39997416e68173821f5674304164240b732c0adeff4c0e2", - "88bbc37de6fc9bf869d62e64c3df278137e83f4b756646e75e6f9b7a124525c3", - "6dac255d7da2225621d84726987463e777fcbea4d68857c36ba9af30ac5a8c2e", - "c36cc10c72439d74caebd578abf4d8b8f0b34e771dde908786b9c4626824b8e2", - "02526e3e3497ac367155f96525d540135025ddb05114833d4b34cbfb933e9c74", - "965ec39b0e3177ea2fc3ba466b817fa8eb68c6e74e805cfae5ade8cb5a87b3ec", - "83ccd0dd71508efcdd52defc536befa6031ff9650f0de2f5bf48585e90cd74f3", - "2876cc15df166b364ede9365c70f27001e040dd749e8325004927d256c13e98e", - "37ebb055fa39216b526434c9b68ff34ec17029f0ef81f3272e0f7c1408c0deb9", - "edeb09f2e403c8187f226c4bec097e4e1f1e0f3fde75bb2332f3a44694508139", - "c64efe28079fc15b2afc5d0cc3aa9a87ef88fc1a3e3340eb31e9ec8126c84955", - "5ec08831f9c192a5847dcae8aad9fef0bf50e9b63e793c96119586869365cf24", - "8f301b787290a91dc73c8dd4f16fc8eb553605ba3412dcefb3c08bb0b253d683", - "3a370d1f0ebbf82ce92213a9ccf1540c041a8a1c30035cae2f516c66ab924a31", - "6e7799d1edcb1c61b6855eb22600f02e3fb85c6c56194d768d914778a914175e", - "63189c523786fc1f2ba48daab5cec7168b547cdbffdd8913d848bcc9bfde4d04", - "c51d4b4da1cb97b448b6b10dc771225160d5c3019cdf2721603ae0e0d3eeb1dd", - "ee639d6c109a04585c10faa934692d0a33622fab160ee3f55c131ce7a3a5f4c5", - "c55f72649928ee086c2c8993416db4daf97c359461eb4f72ad52e24d94702e29", - "9ef911990a2a6a5b8013e348d3088fd79095518ef4ec24f7fb627da63b8e4265", - "31f1f198d65facbcea1c2240cad529ab5f9ce3f2578c4c9167492060035d46bc", - "afd4f9621ddf789940083feac0ee6f1735056b6baa0010608d957a09136f5e28", - "aeb6e325ff1a406bbeaf2b385977f37f60757128d9974db0a36553890d35e734", - "5bc1312bf4aea9c704fd52a2658f2b4c04ffd5382df0ca898fe57e662f13e76b", - "44b521f8c90545d5889fa30b2b1864b79bcaa06df8615bfa672f6fa21b80c8fd", - "8604076685f3686e0485ad87c33bab67d5dcd6b8c95a3e02b7f49c1648e3f1f9", - "a41b29ab849ebeee7f6790f61aa67e04acfaf771d3124f785f1a5f8b8b70a10d", - "08de6a6b1a4ae24b7d0f1ab6644fc1ebf54a116e960767f82427c07d978fd1d7", - "1201d575482d62f9622f5754a337d027d81603c1b025ac36e0c63887e8b8a058", - "519bbec9897efbf60d062ff8db51920fbf667ffdadd6eeb6dbd9f7dedc19ac5f", - "b4f622c774c99a7e48bd7fde61ce34c851a14528a946b5b2006c858b7f891b5e", - "d6bf7b7ae168853b9ea5f42fb7711a5a7635781d84a352b5e8ff4a4756272329", - "af13bb099c6b9f627ab4726670c8d11a3c3b382bf2607f81c20024ab5e31a926", - "9e7a641d099d26d0bad856ed4df86713fe0986abb3a591969be78882c79fcf3c", - "2dc5d307704b1c3d6360b535c48567fe61826ee2db73d4e5fd0cd930bf8d7454", - "1f370cf6ba9e7527e0c13d456d438d294255df23157dd905ea59064f7ca6aafb", - "99e466830553f4c69d34445a7e68cceeadc41af58d2da2c7d23070140d2f4315", - "5e6ea56e09a0cc9df18e3627990bef90d9ce2a838adeb8bf7347813498280358", - "21013adea8e587aa4ee6115a4c7bc77c279874ead03a6731497d8bb723b15ccd", - "bab9e1c856cc64382f3a716463742d5da6bfe16e39cdd3d9a5af5e90a82ea712", - "328ff92b3325ca8b808570b782adeb5fbda3a80800cee3d3c839c01f00bd13a2", - "2e0bfae5ba274ecc31292d72b5c28467b3f0a9326e77718976abdf65c4d0dddf", - "f8d1547944e56ba56004f812cd708c49165bf41f688c9029553fc8f79450ceae", - "9f774cd0fb1c11c0c22b7727389ac1e586ab5638873cf427dd7569eeb3f526f9", - "c90e868ef1224216f3c2055777ec99f3450683b73d9fc6526a42408b7acfaf7c", - "03e66f8fd445c20f8185885af28158757d910a57a07529f934031342627dcc62", - "73fc360a480c4df4a93d7bf9295ecd38dd2021199eca5e0290e8151e1f1736e6", - "2b3ff912bb60ab8f94282d2035b66b8f07c111bbdc8efec96fe52ece40bc4b7f", - "a6dffb560b0d7ffb5b4588e84613456442e831dbb70f05ed9e2655b120e0c27e", - "664367f6c95c79b8d886e5755f809635ac358d7c0a0e2b5f21519e4219b10ae4", - "d75b95db9d13be762c2d2c4cd41d128547b12f6bf757047339603a87edf6a85b", - "257922becfa81b6e4233cd71df7a17449ad0064b8e7ca473d0b79ed0a28d069d", - "fb3cffb6977ae98f5e50b5e9081dec25e112bf56052d13e59305c34d99352740", - "fba106b77865f2509836feb64192a8fca7bb387b73819a55c395b6a29fd5044c", - "464a5db20a732856cb2a03a18cca00bebcaf8e53c82d757d402eb17da74457a2", - "752a794e0d1ed02311218b2ff7b31cbf75d3dcd5f5987444e61e729ec05f9b69", - "45bb8444570101f9a5942ef018cb295d6e60ad0be03f2fa43f8fecc9299464d3", - "499a22a7ac6f9d6a3f4c203fc16d7957f9295593cf9f79fa8a4b1a035004e558", - "e2f59ad4f150f0828eb246cb1c303e4c7e150d0181849da374df25cc13119a46", - "9d3c663d3c89dd95a3d84a71a955b230057432eb2b989f16d432a0a5462304bc", - "dd0e7dda3e2e3645dcc9b718649c5d335b2731ee721fc4069be7a7fcca06f795", - "462990c81ca66d2d986ee282eb8e037b6718ab92fc9ea33147d8c6d95ce92e41", - "717132d969eec2a9330ae04a0709555e0ed5c62f3f3fa1967631121d0c55972b", - "dff5c4cd882596506e7aa82cd3762ad66543bda2990ae6ce5896c682583e18e2", - "f5dd574aae9cba6bfc67d3b5c1d4b347cc029c5e8449116754994bf48da75599", - "7ceb1fc1ac8a83679164376f9968ab5aab2479a7c2fd7fc2efbb3c9ac311eb31", - "a6ed07b24fd422994ab0bebbfc3f92b51034f401c09bcb66503f19f4a338b250", - "b0a5073307da085874bc9233473240e73be151ed5fc20719b0b81e891deb8650", - "7e8e88db3eba8f8803262d69ec92a840f88a21d886f68304202d19a36f5e8357", - "0fe6727ec24660265b6ddfa1dd69e5b97e1c40b62c6f0ee2bd23c3eea985f633", - "8259c39e963adc86a4ab9ed7ae02fa7b7570fd3dbaaae3681a9708ec17274ffa", - "7bc8cfe6150d70407c1a341eabdcedc167b686247e9e88a85331398002860847", - "156d480ef537f1c806402bd6130b8178a6ca6af7c99ef7f340d381582a9b26fc", - "6cde4bf6649e7bdafd0caa3791308fb5ac6bc97f33b811b2659bf532c56c76bc", - "c3a3807146fc624ae856ce7ef8889a94c4c58cb5b8923c285b83e9abee616579", - "8d3be2f32d001ad62593feba30424c2edc72117a1b1163efd4c2ec46899946fa", - "c27787459818f560234a514ce352a45fb71138e074812a42a0160d6d2b5d2bc6", - "797874ba48ca3155dfbcbd95668a59bea927e306971402b871908c973e8c2e2e", - "4f899cd46f87dc210953f1d9328ab35b963350d9ce0e9c27443413303e58c1ff", - "eb5bd184dc17170577ecf1a61ea64a2a7dc2948e3d60306a5e4aa7dcb7740c97", - "fc9bb8dbfd0f87af3763bc68f79d80045e8d0bdd39cfbcd5dc7734a5d0c5bc95", - "1fe042983dc23cb3e7c353e5c8a7510b964fcecef16ecdbe2f4a05912d799b31", - "33ba2a58575a2deec9e7cb21262673f4f6459727bcb0c251830b9ff39f45f95a", - "cafa35d45e5245aded37bd4a8dad5dbe1bec201a00fb523e19d16b1625fea4fe", - "fd09685768ceb2c735b17044f5c55fd816860954de685f96d99efce89dba9a28", - "663a87bfcc13840c1ca1573bbe04ec5330166a007d8f46b0afe4aaaeb677ac98", - "4d805a520159f2d101ae579ccae57cb80b374ffa028bcd90f468b7f3e34998cd", - "82f2f1bbddc1d9e5d904b64e561581da5bee66efe2e0a6907fee6690a29f2f6e", - "0d5250e98c180d4d526660a21292898245b8a65a5c08681777f09fa06cf63d2b", - "052426c9134be3adcf16b6aa695932756fe8ba5bb1c4c6e5a162c0b92fe64b6b", - "c5b5b4076a5caf8dc8a36f96bad7ba5326f606532899c7c2c058123432101576", - "32e40941c4aa0eb0b4514007b08f17acc756eb768c89bc1ca22e1b043698f352", - "34f7a762b30b8fedf1852fb30fd774dca13cea17c94813affc6269abcc4a12b4", - "aedade5bb5a41c7ab0f7ac9d749cb5ce73a02b196e07a5b7a99b41e211e08350", - "87514aa2df8c9ca9a6242caf4647a55f468e327a0ff1aa5e497648290f58f30b", - "95bb17cbb9fb4c5169a980630bbfebc9aacf483b12fe2f642a0b35e110a318e2", - "6031f377d884a91b64cc884423686e51a77f77f066d99adfb0e4a7103284b013", - "b6a946390ac3f3c6c06555219284df798f3b39d7b088fc767ebdf2b98c06b1af", - "820208d63a3036ab4ae7814d651cf4674772c351504fbf440f50f9a52746ea52", - "d98c556f7a6828a37e0e31f9122a7f32558c04a8cd7cac19afd2e22cb018c42f", - "5b25590c5b828bd7cf27f820565f2530ab7f4cc9f5625f96f81cb038e85c7a4e", - "707d971365b2b8d083295999e93b50da425d3c087d8f73277ccfa951bc0311f7", - "c862a26d8a7490d5649eb8f7d1173001d4c0cb6107187386cb6b67ab29d887f2", - "3dbd22015f5a05a1f72e2825a8ea60857f8ece46a901735c0c378f1a5b160a18", - "c8c921bd4c38117c79a6a4a7b7e3e87f495448a0737ac0f0ae9b266e625a2b42", - "f701b85c3b3f3c88674c6829b1a2e7e5d5ff8c0143f944a4399188a4ad17ce2c", - "3ec07dc0e5fbca6280804770a5fe0bf84fafc2f9a1421000880af395415011a4", - "4d87c70c6144912ca4804eebadcfc6b70544d738ec706da4329c5d2558ea76ef", - "c2905627808e4928694a7022bfc914a30d69547445d31c7e8164acc2e2287ad1", - "29e39b8342c0ec7a598a8ad39e1856de3fbaa7bdb5c029e74cfa048828b812c4", - "c67c69ba1d1ed472e96b5e482b087939af027c1c5001730cc63e798f270a7e96", - "6d12549270a8f3831fbf9b2215fdab88cdacf9f4fb21f03bab8efa6ced628cf8", - "c47be2d316aaa516cf2de9684ea63a0d0ab7c1bbbe18c87c8c31b986d1df915d", - "e1afeee5a502ce6e03250cdd99b7107befb04a6950056dcb403e12438811dd83", - "bfbe8ad805a6fc18870163cb6b95ead20d30bf0ae32ebfe7d4c79932ee806cbe", - "1bb3ce9aba98c0d7508f0c19b274a74e282d83b02ba02a5af02b813daa4c1f14", - "3363e866a6101c4fcca350ee5acc35ac7c8ca1b65efa184be2ebcd423c3dcc61", - "af52f4eef8031fe9371bcc63c4531af09c6e6af9e04e56894bed5772f8ce32ee", - "8e6ea68ae7c496e13f158ec3b2196ab9ffa9b8ec61e70327005aeff11fd4cc0c", - "fe178e96c41fabe336f310969ed2ed707db6f78c885012c86dcc060fa0aee708", - "d01e01e69e163533c1636e4bf96bccb0fe6335a50fe3e4e42c9459046476de00", - "89d9b67b08e4f77f5c70f987fa530e14a3679f6bf2f2c394ae4373b8523c5c91", - "31ea22e2f55b97a6a0bca72e69cf266cd64f0934205f01fbc224067c21a71466", - "d739337de5d8538d74bc0e05edf9e92624c3f9a11b99c7a35da014c077b3c112", - "5cea9041348b96f38f3e58fc17dce62b691159f9d895cb4753019da8b264c6ee", - "4f6ca9fa73cc07390387ccab2ad8d52959ada41b37d14a39df3dae421448fa1a", - "5cd4b72cfbafbd66a9fae739f1c0dcb255974cacbf3dbf5362e61978109c4878", - "9d3ed9ab9ad19e02b9a8cf12cba37f392f0c0907b57b80f21238aa4db4d5e482", - "31f56fcc5b49dd0afeb1f2cfd55cf295c1b16b312207d14c50f3326090d8bf21", - "ca4afd5cd9fa455e41a9e4266babaa022f95754aeb86b86473426b97a9578552", - "2cd365599e88ee8a62c23a7ed75ddc8c979a268a3b4802f74785d6f400ff4b49", - "7edbfd895b1d17a12c8a69c6b9791c70035de484af3c9e5e7bc8f91e36d8725c", - "5aaabae37e983762c2a933143dffea3fbce2d61178fe861e8f6ac477b97e0238", - "75acbf60a5e2a79648df8b1bfee0b88a6c7e9e409e27b1cc96157d0a355e4c81", - "6f054366fc3736bdbf636d6b75ce0ef0c45f6c6bacfe1ba5de92e41f45f15e95", - "a204be5df0eb9b42569ad2f711c0c5405c5dd8807e9f6a8a29b658b46e850adf", - "0ab04109539b85596e9c9b1d309c9bc3add3fefe29616794010a75f1051c516f", - "0c80fe277c1c2b0e139831e446275537785482fd89a1b6ba43b826ff03743a22", - "92a88ffebcbcd1bf3e757a229e30ba55fc8315af98ee66811ebde3f949faf880", - "dfd39e5e1f817d1df0694c7a2261912f53892a6f0f3e1d4a0b8b87c35a075261", - "286dd557b66c93248229c2504c65f8eef99b07956b9f1a36886d95fb278e39b9", - "d43681db9d820bfbaf277ee89fc7c9d32665675970045b27054bfdac78fbe3cf", - "1a788482b791f56551dd469e77488e529b6221e131c6ac5f72b1c64012b5e08b", - "76ac531bc853c3d6e74aee255c2c6f65039d0bbac9e87e11ead62a09158307fc", - "6ca034074ab73904e5a312a6eada8ec56bd57d64f8eb22cfcf8f5388cec19db3", - "9c9af64354a40f2910a7840eb79c300d414d45083ea75d050a72d494175eb334", - "26cce6e14ff5799966259e9d0760d6c5671939ba2e590120e36ec4d1962ea89c", - "60ce1e176b7a526efe3dcfd1cd87538b7f0efed751adc9ee731aba3b9f9d4684", - "f206b5abb8573e73c56de2fcbe083fbfd90b65720c3ddc3b2c613a019e019d61", - "22ff715974fe8f899fc7b7abfc80227418385ec9fa9570c3964f80686bd160a6", - "4e3f72e1001d390b68a47bb819e7897cd5bf5d8f7cc7ad854683f73b315f70cc", - "d46a09a01db4f0eebd224dd9550a510d2ba8b350d266dabc5f6bd1ada3fbfb29", - "7ebb46393917d563b50d231bc85366cdb467548a20dc7b37e3e7f548da133611", - "415472e34cd803112594fd1e2c432c377f10dd366aaff8391fafbb9688e6927a", - "2faf542e5bbeec4d818d9a2dd4da17ff0f4738110bcecbcf94eee4ccbaa75d5d", - "0d70c2f4c1024704059495545475a5650b77b7055b89fbf8afe4fd32af366c19", - "ebb9226ee4c7c0960676746dab5bc5cbe1b1bb7e30303424e5ed729d6565d3b7", - "0cc89016341e2933cfe37201f4d00be74f7e64e7c480609615427085662d085a", - "44ea987dcf8ac9770aabbf5dbd42f291b53388031dce15f8378374d4a41da352", - "a333ac4517bc6456efc6ea4ecb8400950857f51c0f64adcbe4abb79757550e5f", - "fa46c4e6d173c6e6466c6aa217474822ea6b4cdb30e4d2be253618baf7e7c28e", - "3052242309e45777d2dd77794ab0c9b953c7bf9a59a229620a79a4a9bf9c0476", - "c3a8c1bbeccecb884bd639fc62a3d472a0316c40a13af31a1bdc3abb171b7b4e", - "be48c91291590ed690f375b310f7d85aa0774613b1765389dc54ae3d4b1c030f", - "c136b67b065b9f4095d7fd1ead99ee94cf7e43f7415e70cb2d247670a49396f6", - "77f98ec0fb72544659b8d43052ba4dd4ff69770f671d39eeb075d3f186a6da27", - "4f2e557d4bbebf68c96e40c01d302dbb3652fbafdc82981196d6c7a14242ca63", - "83221743cd663ccada4ce6ad70e64c64e0b38098c5fae66dd3a01a3560518180", - "31ab4f5a5676b1f08cb3af5589997c0ba3b1e448553cd9ce03f7e7c6ff0ac50d", - "db725bbe283cb7ff1fc478d402fbd1afce5203acda1c5c38073d733002ba37a4", - "3afebdf7f2442a181bf7acd2af61a3d73599eedafb764bde15b2d1a44ce16f67", - "c20bddf7c23077f1aad2825425b9566121a403a9e5fa052c7ccda831d08e5d5a", - "51937531c2db9c42256102600cdc2f2b116cb849d763f876f13a5f900a75d849", - "fb04bf2ae17f76dd6eaf11e1ed70889d45822acae8c56eb309d585c19f1b4f74", - "ed29653bac111b75a4471cf5516b50cc166e0200803ee76e38e43ca79c6e3818", - "e57b47c1437462761e18334024f8738f441a3b1d89637702b92db4b0c9073547", - "ae374fa35eba222342b24fa372dff0c36922f3efeeae863e6099dec17e3baa9f", - "b38c9e7f8ebd6afe37cc60c04f7ad302a0cf353efe52f07bf69fab7df0c6ea46", - "27bb7056f6e4495dc9c49af6e589f6451725947c3bcc5a466c33723d892de4f3", - "0aa1a238fdcb71efdd9cce7006f66d726ab03b6a6c2957190a746ee342b2a0f1", - "cc86fbc0b7a115e8dc5af2d61b41e96f093c14d90af80fb74142cc4bc65da4a9", - "6ed885bd6ed613a5bd6d796ffb0787ab31898afdff8ffa9ba276c0f8d93712a2", - "cba51d9ae00072e6993806f37024557fb1f27fc5e1e9c769ce8435d51caf441e", - "d5e1ab06a60e3ae8cbe72db45fa4d6e47bba3dbeaf8fc722a2844949748a5445", - "6b34b2553f4664fd91f49a8c26258aa472b88d5ffef6b621bcbedc1bc636145b", - "f0c47d5ec255a5f53d483139cade3df161187945458a5db712f4c5a28a0d6e5f", - "e185df345fc3aeae6d60cdfc57d874cdbb7968f2a1051cadd3a5805b275fe6c2", - "42d121f65341a2b76eaccd96ee33df46c9dc436ef0ccd5e050af14db734a2a05", - "5ab7c701c81b91785f55d5306880fdbe4143cf70f7bdb687dbcab33c54b0979f", - "2e7cc6539c39949a0ebf9502bf2a2fa0d53ac281144b341efebc2bcf3ab54551", - "5c19963de4c784d151adcd467f0010b89ec9de0c12e3b7eba5ea0dd869422a60", - "8ff89fe9d7e945a0c81dea2e03c26811e0aef1bb99f5845253145fed4cb2f9e7", - "c28ba08424154d2571d591235ece4e7dd653565718b0f0d4a8958eff16d2d019", - "190e75556f0afbba3e558cefd123714e9a9675f66d01bb35a072185844865cf8", - "041cfa2d748d7ef29a85efa443cb5f6ac47352758d41f8cc285720c40d86f60e", - "15f1f8c557468ce7f4617c0734f1c7bb397d1f9b0f5e9d22ac9db4b20418be56", - "1bdeed7a5748becf5846ba635903cef57118569bc32e327ef56631eacf363401", - "45e0a2a223f68edf5e3336bf836a67958d20a927d1833c0c9715a03a1130973c", - "e349eda12d927036ae036aa87d2b8339993167662af93e0d343c7e95e4d13a1c", - "762b95d59c9a91ff08baee163d295034d1414fce54367cbfc967ef8f9c87bdb5", - "cf2c112bfb0ed18ba35fb64356bb4f3bf608376b271c2612f29727d0833c6aa2", - "c100cf14299523f7b82bbef3bf998ef0334793d1bfb2212d83502254e91b0217", - "f05570d89873675d54eeefddd02e0c49815d7c1560207f98942beb6c6672e6ae", - "8c2ae5918a6fea295edd3956cdf42b8daa91f1bb202c73d268308aedf5a37639", - "8e0754d3117e9cdab67b5b03485ebf9dd580ba790130a52dd099939d07aec8fa", - "186b3a3a76528c9858ae1af314a5cb01775b8aa2a890ca3eeff82cc013c96ab6", - "960789ba82012e630858211568a358576b1e9ddca2410b1b9bbdc41d9668d4d8", - "7935b31ea52e64d28240805b6fcb3f6b59de22a1172dbd1fb71464fc1c97feaf", - "2482595cf567967035c55c888f5e3812b5ad6f9e74c379649c76436b6cafbff9", - "4624436d35776445337a697d6415af33af22c0eafce07190e9c58373a8e4e995", - "f72b2e5a86e4e5ba6b6ceee0b6b6fa278f4488821698ad735dfc70284246990f", - "3aa44bcbcd975571c675fa63f86b4575c9b4e1fa4f0cf70061c6f41a90f5c646", - "884857087f4935454159f0018d27c039fc3e729625b9884185f8b59a941cc57a", - "fafe5cc1388b482d5547852fc18b86cbc11766178812427c9256d7e86fa753c8", - "a0ba06349a1ad2c74ca33d3e9dd9c651fb8d164c04b92869405aef41234cf14b", - "470c951d9f38b26ac217885151f5d325d3eaa5fb45430a458ef7eb81c5fae6c2", - "a9028b42233bfdffb2fdbc44cbc7c4b908dc5d8aacf18dca1a925c55139daff0", - "168859a870165f3c33b1070a1e013a30f7654782cc4b6a835dc7081702df8af9", - "f0d132f852df05a20f2a83a91744d9c447df27c58f1e9358ee4575443a472cce", - "968e6d32bcbc83abebca4a24e1f757dacd25eab2632f4bb01040eb3e950d2f32", - "e57ad35b6ebb6bbd977b6ab240c37c90e29569fd86aa7aecad4a40d5f9a961d9", - "dd0f36c0a682ff173cc40325fb333e6134d9fa1d30c69bc17bc91c3971a1a4c5", - "af10177ee1e751dd1ece3e65641884bc696af20ccc9904eb5cf890dfcc86700a", - "8c6bebedf5ad8c47fa993b08db01a50e10d09b31ec790816dfc07cc3b8d501c5", - "b88d29f43b37ed23561a68653fa09297e10c1d13436354018604cdfab75ba4c8", - "83c67b888c9002d149f94ae02c0048547f3dd4231ec6f0ccc3aa67f2b7c6139d", - "83551f24c747d6771480d57e9e4490046e7a69e39eb7e00300c8dc358b74ff07", - "9097cd00b1dbcdca4e580fb191d7b1e292306b41a626bb9acc993bf9f6bd316a", - "b870fc62ee5090167f8fb8fc05ee902c21944d8f1968beab2b20364999ca6098", - "46ee3566ed0557ad6b4e3ce5cdaf0101077e92d81a28d69cd5622ae531df2492", - "c8588bdaeec6f53e1253805bba4f66daa9a31ad25d24a1b8d1f968b18986330e", - "fea85208b2e985f702f9fefc2336a01d6bd61fb8a2d090481f2eb4edf291ead0", - "eee73d721b1320a0684dddd346e3f006be23c494012237a9cc707576c27e461a", - "0c53286fd03ef1e081072a73a9a1b76261d6543eea6624f82add7656a7fe920c", - "26b4631790b3939adffc59b358dbd3e496aa6a98d168f9d5663e9b495bc398c4", - "6cc0cc49e9b22c24ec8e3dc25b74b9bd84c7a93d866e8565dffa5389ff2b64d2", - "d94df5a05a4a2aad5aec1350538e5a75cd7c28bdc2e97e7ddc0c45cdd31a4bb5", - "5d51cd84a394fa0ee0aafb6d30372a305829b36a71298f4a4b3c7d34e32b25ed", - "91ff142525171730f45d6a4a4d68d69833d6c2ea56857d94cb4d650391b86828", - "b4f99049038397742084c44b1dd3e84027689da0d27dbcef8347b26a8a1624a8", - "039292dd3a8b2a950a99d1a8287a137806faf9f9cf820e275776f632bd3fd78a", - "403fb2825210ae2dde4aaade29cbf79e3caa921eec26069beda525f4847b946e", - "ecf1fe62b00f7df05ef27382306af239f3b03f01421cc8ecd0d2af3d07c75871", - "01e62d9724f8b0367272575080bafe8c841aab5c30b1a68e3e3c9115f6d4a817", - "5658204ce048e883ee32b7b6003905c607650dad4789d87985bbbcd53dab5f62", - "53338c366854b11082e53b6a4d747a3bddf1baca60e9913d42be34ba8ce22873", - "9865ccd7c316d323288be1e39dcea2934a58b491ed1e12d434ae8cc3f0291a03", - "a86bff3246ab25d6d1810a7cd83ad63b1086a79d89ccf41dc8bcec15b90dc2b1", - "47bed273e4fb1c1a57226ae626993325b7375646c63c166640c6d25fb89d45be", - "84a09e6d2b477f4c59bb20c00d333aff4dfcb247cc6fa01c1b47819ca3da23c0", - "6d85a0dc4c7bf95090cb7445479b203098c6d71030f4ae7742cac3d37a69194f", - "524d9c8924312b484cb97f15c515fc9348076d845b239bd8340f875bb29ce04c", - "a89cb3edc232d7a1c9736e9e47cb76eecabcf5d5ba73066504af3399c7aaeb10", - "94f3bd637d98804fea8ffe8603aa792fd230d83679a4f87b5c094fef5aac1fb5", - "20a44fdd2c726fd979520a03469c6750a16217f6dd1153cfcf644c452c1001b2", - "948b851b771617754850aa41a56032ec5b4053fa14a6e436d141ec2a1ddecea2", - "b4ec7cd911236831d3f6ef26066f3ac89b03e79124d969b0fe896aecb7cf00c9", - "dbf2b0a21b2c64f5d702950d161c470a15e852c2492ea289162c05fb2f86d6e7", - "44b1996198dde25299dea5bfecb411b379d392b37f7f37bece7a0d168a9dd324", - "e15043869f8a71eb1ae8160aae76596fbfbe0a2ae1fba68fdec0344e244de4d8", - "3cefb4a610fe985e33e6279e5275e74f60b0e2b5cebbd7da98ffe0b4dcf80391", - "8011bc4d0c5d07cc18f04ee97bcd0f291d464707da053eedf6a926ce1603eddd", - "081b47234352f2d55493205bd125b999f8517113b32a1454a143b1572d41e30a", - "4addc1e9d68e2be64358f27297d589cda819acc98c38a38157183efb9677a6bc", - "208f95e112fda64342d8119b1fa5b4212f06502929a06f8f2710d48f0c41165f", - "6c04ff8b5b17c5b1a90b7257cf9b26748b362ee618c7b9221d75053554384bb6", - "8c6d968b1e741bd89feb2c2af102c09244f46b8fc5eb7f59c11715f1d5881763", - "1b8c951040fee6e4d64b7b988c9a7d5c3c1629a9c2be5c498c35b2e1edff1665", - "e51e8a80deccb4842ff1a3ef2839570fd921e3e452c356151bcd4227ae9cc45e", - "9407d6f21ff58393731c3c19b1c099a201dde4856e3b9388e2cab5ae2a2b5507", - "eedeb447a6e931dddb4b715959b36ec8f97ff71fe8906ccc32ab8d49ec28e438", - "8fbc03b0a8be262dd088d164260c53cf730ac48c97d3a7a14502bc2f36fa08c9", - "27a417e8672c4f1a85eac819ee0177c3631973faa4417377b91dfd6de3127279", - "2f00f42f0b73b3b9313c5f8505faeceefde678d3d6fd0068a8fbcfad1e7f0523", - "8a43708b1a0cad455d5826916b68e2a56dbf24c2fef287a23bb980b6ebbc2963", - "7ffeac42c693e5fa018ec7867dc46fc9a3cbff5ef65076a4c3babf1c1d577256", - "154f5281790152506bdbe9efbc373832f1b09810e4dcd164eaa6f36fa76f88c6", - "0c7cefabaf7adfc73efabb9a954aa065ab7adbe26e7237682b679c06cc1e2591", - "519107a57adf3068a103491b756efe28078e38c3d0da6942419983a6262fdb1a", - "d345dab29e4090dc4e5f1b17cb4bf55df133b29cc27253522f9fc08d66439267", - "73c8efb3d35b11cf6e7d5de1528e4dd000227040437e130bf39c53c9ea5feb24", - "e6e068abeba92508563b07e9613fc9c599530becad8a692bf0b71130780fdebe", - "79c382593f81a44f76761b6f305c5407da0713fabe11ba26c728a6f29cf5ea48", - "68f6acb75cbc980fee9ad9defe5206e93e75f8f04701a35136278b543b530962", - "2c06f8e6a447bdbdf63b8fef5da11359eb27cc57b48ac21d6ec6e4b82f789de7", - "d86aeada7fad2b68ac7102525fa03f7cdc8bc38f9c25bc3fdcd48083aa766d49", - "68ac651f98ee9f915c17a9e48fbf10c947331048eaeb4902671a74aecdf8931a", - "3575de72dc5846291153593392b36a546b924feacdef6f84fae5a32c243513d4", - "45c294e7ceb0d2a81fb1cb4f90ed90343322621b02e745ff1bec1f313953a342", - "40341ce1417ebdbcb4b51579cb640b183354d9f36f1cb81de8b835d5a0c24eb0", - "e54b104b5b7ac8970e321fee3a1cca28e7a10c4f2b74625b011d27f43841fc52", - "7d83696cfaedd9400766b6f7a53e0a6fbdf41059ae8e2f74ee5d4544386b118a", - "7ac3e6e32651604533975316674a5a550789fcb1aecd619a5686331e5c4cb347", - "552c1f88c74641980b3576e9349aa0a8f41f81de51928fa5e9b6c4d7d7129a36", - "f5637c9ffdf8eb85fe60a8469b5524fd0712102430bee71b0a492554494bf0eb", - "ff05dd5dd0966d34ad0fb68887d8d41a56caf69eeebd272000a263e8a144fe63", - "48c55ab771a4c095c0a9ab6cfbd623498cd9f72e59c44018534fd7dc39076e92", - "1f7d5a845239acd44f12ce6cbf554460f200f6d1f9a5a2699c863b474ca386f7", - "bd921bd2877ff0c4e2fbd8cd8bbcbb5c278d09e89e46d76c7a57adfecdf56177", - "52bac555410a4ca439d313cb49bc9e2e6dab8ccef418063b8d4b607e903354bb", - "95a4eedc98a284f47e5cd261920640a761cb6f8e2c5658e250ecd06c867ce1a6", - "0abfc88f0072a37a149188b3203886bd8982f46b5a6973891a0f3fd1dbef77e3", - "2c50101f1aeb50c1cf7ee8228b0fd09b1e75ac06fbe6446fb2763dda1f69ceed", - "53835c2623446d6bca6b1102586e7e6a02f91ebd689633eceb8e090fb03ae5ca", - "1f2bc23ffb258c46dbb0419417826bbf4b43ca5fd3b0e646e8b1f372973a36d3", - "d7b5ff7992f1d2875defa782b9e0968095ef98c050e7cb48422626fa2b1c7152", - "57d5f3567645a14fd2c7dd635dea1346cb42e8a820446a3c2f8b05404754653d", - "ba839414dd9d308477d200ad707d5abe72d7418f883df2f1fc43f45d5c78c5ab", - "0a4773c1e975820a32d110b841707ddd59d7cb3184c653ed5fe3bb01017b929e", - "658646a9b195c625e03a752876b6c825e3ea755e22048d32bd55877bafe7c500", - "2caad538f93feda5bd43e156582d2d539f86f38f000b1c358664c897e54c109c", - "da666647078d5f1b4717555df6f240ab507899a954f731512ccca5ad1dd3ec9e", - "8f383c90913e59caddd99c44421f42339ab8ef2d218b9ffa6b1eada7c23cdaaa", - "b090a370c1c51bcc64dfffbc36cbb585b94416810d40294607899c7919c72ee2", - "aea6fc0f53241c4f3cdf04a74c65cf1daef5ec81c76016dc67814b3d0c34b7b8", - "8371601f006efac67d891181bbe3a970357d57283c0ece067d27726db7c72052", - "93b38aa52cd0c97561aab858679e54c4d649ad8d21321900bb814d105c259399", - "bebc863264d208d7d121a6eabd00ed21d51553098107065d332ea3ad5e064e92", - "63515c4df9daf88fe68b5ab8e0acc502fb5bfb0e266d18a3f4d5c8843f7541ca", - "427af0360e7806f4030b6b04890ab0d134a62d236a756540c4f90496ede537dc", - "eae540004828bb83a8ba7da874ff4f05c2f76db69f72666f328fbb10fc602f56", - "f48d587347b30da46802f651a00c86c4689c626957386c108a48f043b89d5f54", - "d0ece9f6f29bb3af11a0e3222d68f0d32da284187c4595262b0dd704105211ac", - "a04124d41c6ff1f3c90cb35e73195be4d65be3382f63e02616d0208cae4a3aa9", - "5f90b0221ea76019fc7cb0e3da908cca2a49e23b5215d2b47524de296de977ab", - "8b2392a7dda5ad4db3225667bfcb5e2f1aaf144de974142a2cb99182795982e0", - "6c4111794d2df215cf92f165a0586fe079e1d1fdae0f1e5d052d127bacfc64bf", - "e7c3afa175e9dfbff693647b16e751232b5475318ae40ea2de64da4697a6ae01", - "2c3d36e47b0c2aa9459086f1fdf4237e3f84203d84919e375eeddf76e19a59fe", - "a8c3ca6257ee1ff8dd73c3fc5f3d44e3de3e624027c264235d8a4071add28538", - "1f390ecf0f91e2454755d145ed5c559dc72e3ab98148a5b4c24478e4daf652bd", - "95660c5c92a3ddf3155509b3bb1deb14479dd7b2f704b4d7d7a52ddff495850a", - "de9004d03236ccfe2565a9402973b1e9cef3804898bc82d135fcc8d80a66b83d", - "0388965aae66dc0eea96d21f85ee97a0a10ec663ffe687d7f32fdf521bb0d570", - "c58b570e5534b2de9a0b503e9a7a78cb5510903dd25a9929cfeae450b5176cb4", - "2f17629a75a758404a378fe95d1ed4f1b0866212c5dd4732968bff78c0e6acf3", - "1e758a25a1d1348463445d11871bb41e15277b09e7031c0976a7bfbfabdfd64b", - "4852d0bd8841edfd630df74cc7548f7679a9b2b4363711bad02a1e6fb197322c", - "875c8e58ec2205c6751de51760fdf6f4d3f20ff852ae844858c67b08068662fd", - "1d6893d581c2051b1120472d7b7e840c69d881b146f277aed310e2334b4cbd4c", - "b94ad501ac6ad9cd88a51334c186eaea15e4b791bdfb6307094cefcb29b8b10d", - "79764411fee3980af194de95c8b4787f61d44fea03d95566083fd60f7c2bed8c", - "d64adbf819ad55abe62071cf742a41609365d496f9798261ebde67ad911bb351", - "269afc194b82f3ffd17a1783175e1c9ec29ee879c532262fec937913f3d43a7a", - "3a41cc24251e2c50bd3723e6dbffa7384a8aac3556498c8137b8a5270e5761f5", - "dd7530edc5b862c38928808ef162e3598618197b34e3cd1e3777deadf0a45f2f", - "34710fba0a508274e182e5ab8389956043a71322f272e6ecf62c51e19595867e", - "a4c4743645f0b4756f8b215a3c5572e73f9b127d1061e7e59293612c63da3ed2", - "62b0b916dd3ba37426d54f7948b4788d04673e257947230345c8b18f88f8ac0e", - "d937b356a60831db1a625b77fd67649878754d6cc786755703f2257602b20ba8", - "cd46ff043c21a5224d90ed713e3e109a263cba33b6322885f6b57d358690eba9", - "3798b76e7e4b991e067140bec27e70188fcfca875ea1c78085d5606dc8b64def", - "a6daed8f104c277b54f822b80153d9176368da8b8841df2a7409b165d7e82e62", - "768e6b7d9fea1ea72110529129f83c454e5c8c9c73b7b4d7a9f42244e521ed60", - "c7d372859b0ac28541dab14f6fb7fd6b9692b73a9d591d2fcde60e6521476738", - "441d8ce747604ad85f80226f004edb5de2e522d756452322923d1c6a3ceb9ae2", - "83a5842390b54f5196dfd957223796a33a52d7fc380350e458134ccc5e8c0ea2", - "101a835154a1d2a9b18440818a9f4494f90908eccb3b95e0018f6f2617c34e44", - "19c9834ee4b6a5ad9dcc44b71765e3185452c0ba7399980a2f25a4605d614882", - "096e964f509bb10b6bf2e12833f1e0d871a108a8270723866835657d3c9f9fda", - "d0b8ca02e14bea9b1521086b740c5ab1bc734132695dc999e4a63697b42985c7", - "9ca3ef0edf24f68b654360fe05550bf292d7ff7e1ce9b1b3daf064da3e3c779c", - "ac829468298e65103a8a2dc398aba823f025b4d0c3e2a50a806340cc9c027a74", - "0b760716525bcec5a2a17e6b2858186e376e25b4af3249d02d71c06618e88805", - "4800e0955f11ad550040b51ca8e12f1e6a4ba3abb623bee4554347e1b62f6315", - "f8d9712ebfce2f888584e52e61edc421c6cdcf27b2dbb37a2ac5cac95f3c8475", - "acfb01ce8098483cdde34520ec37da7ff9ddeac433d90731812b803b2a676f4e", - "c0770268076be19e1eba11ae31b4b51189411a8c1003d86e63764eedb13aff51", - "c3a354bac8304269a5d7b004fc62f8745c0003934cd616204cb813ca16c3eeb3", - "396294d9d02656cfafd5aec638618ad26dd82babcb986aaf4c22041b2ffe2935", - "feb878cf7142bbe353041fb127068984fa281d2a3e634a60317bbcdd6593450b", - "c5902ecfbad5a8c71988614c593a7da332e6286d2c0974331a72edc77ea6f13e", - "4ae3d50f6f889778adf2d9bee4b45731b0a7a7b334501116e9bea9365edaf391", - "253f43080fa349dc9a2e9a871dacefff0161030c0e8660caf9456d17eac3928e", - "8361e8a565c5651c3f3e1c678aac7d1210591a630a9e15012ffa593bd8ed9d23", - "3e9d6bf02ced17bc777a0012a19bafff0304bb9bac34414c412734d588fe06fe", - "531fe40490439cf32e77f005b43cab61e087fa7a3f2536150b8a26a55ec1bee8", - "c4e18827c8941ca98f9e45682b5517ce1c1b00585e245d931cfe071bd70d0ae0", - "4ff85fe96e97c502faab6bd519e6cec722727a91ba45c30e93d1f6ac09d78e79", - "e67bab5968ddf6dd5f012a4be9328715291eef5c557af376a8d8659bbb8b42c0", - "de3a3fafa586bf9a8d9461c0dab43eb23cac0e151be4eb1a02b3c2fa27957041", - "ed622b52468790a308dd2686f5e47b32b9915a71bb9acef99e816d7f9dbd9c63", - "16f8586e89329aab4cbfaab36f6ad9c71e45ea666e31ddb84ed8bc818873c65d", - "2cdc4ff4287129e0f39bec305651d4b04e2cca22b8209e626db05e69093e40e6", - "1026712d259fd70bdc2249a473a4c8f178fb206b4c3ddf061590061832a10128", - "19eec84977e223e8845a08b2b28628d5c3e69e81733590787dd718802994a0c3", - "e5f0103804ef104c59ca741a571c9add9811bc791a906aefae17ae2573b9c7ce", - "a96c378a695b308c828a843bb4427c6fd75e997f44c3958515dcd55735612a1d", - "a5ff72f2051805518e6b79d9f98ffb1e5f62308c411ccf605fa80b51c3a14091", - "6c2c91acf858d9c70ef971f0c89e94cbe296deeae6ccf3ecf1df547eadb75ae9", - "6a47c9fafc63c7828466d44ef50af83534844b1ba58256b8f3cfa3fce0cb4ad1", - "96187b4bd8ad27cbb472e4a267c5d182ca2bdcafb92e5a586c7a1d6a83486463", - "6af15b511f42fda7899fa5bcf3e7f59a3953579249add4d817f63b95fd357168", - "a11e313f6b59a56517ba12d2aabb14c43af2c531dff3cdafde6efdc35ef78fd2", - "aa2230ccdb04a6bdd455337de05fa3349a06e49fe80efe260ec7510fe15ad8e9", - "8116f4131a97a105bca25a1d4e07bc5a8227e3b25b65ed47a08a61af1cc84df9", - "2f8e33dc405927dda8cc7da85e3857931d467fb633890214398502bd9a4ba947", - "5961ca63a60f8a9932d018095ce0d2563265b5b4b02da848264d43d12abd5f31", - "95e73282cb6d361889760033517d2624b0ca9f9c8d627c8e22b9e28350d5b672", - "b1c2d7c741d5c4b45c5ad18ecf0983dc73963633ef81772a68d2c84644339644", - "f3a2d6d2c8a56ebba1936f52bc59442ce1895b3a5b0a2d488a6623cd9e2d963d", - "9888b764e4a23a012e429228ff88f1411835f03e0f2eb8f5c55d84e93dcc8e20", - "fe1be69bb9def1aac7524f55a9b10244cdb5bb8895752fcfe31b1b984a783f7e", - "c8c7ca73c4a2cdffe0c9e48e444137135f8f7eb2de2aac3ccc760f04563d52ef", - "33b00e5fbd5f216e92dccd3fd74ab85be175265d384d5f1e7e1086e1b2e09d2f", - "3185fa82b3ce107754e7dc9b365e5591f8675c7a55679b638704e27dd7dde8f0", - "11ee75ccec3f7eed5c8c0f814a499c9d2b69d3149b45c86f64d993c70c1c1ab1", - "591706cdc16bd4494b0412d4c1906e590af6e9d5a0ea6ad323e6ab17b143bdea", - "3ab90b2a0d347ea6797a0904a5a9fc6b414f0bef4447b9c464df70f6f0fc880d", - "f1088047adeedecbc90c4d85935968fecf076c6c6390ae6a26913dbbbffd063a", - "e2539d702fffeff6ad173f91f90cceb1a90da8b84f514792a4d852f9e715375c", - "8107e8d52a2413ff7e338a365a76722ea02a7e5293a082e0a536247b3b7a1f22", - "b57843e7dfdd725cd35c14b8253712ceb6f1fe0f87e923dd4d1591329cddbf21", - "8eb0a5f9bd7a5a6387041df19ca5de6f5ee0d560676f3b35f83f47bae2013475", - "a28c3111b05b178f90333e3ecd7ef939e8acca66dc19ad36d3040c89ac94924a", - "472aabd065af7e7fdfdb74429d2481b3cc71c5b7da502788817d0644a4d3af97", - "119e19b5781b6996e5091f7d52877b9974838c7b87f168e67c8d76392d193943", - "33e93f65b09539fb7257b7b0482a8060bc69378269c2e86fbbf31a98b4b3b8d4", - "6cd4f5720d69bf856edbe0d23750da110c44fadfd9cc453e8a6541bb39ae229d", - "0da157713f0c191b1f1d9ec02b63270b780fbeb9738e4e8d5105205efb637f43", - "2837a7023fdbae14eaad474470937f5b5e31839b243470eed18e95f7d44b8b05", - "5677f63e9857379a2c22f220c24d93ccb48b0d5db30e30330dbe53fafc702a96", - "9114fd8e3ef790cc5f219c4d3183a8a385cce8a5cfdc5be0adec77f207d52e91", - "49c681e426af464913e56329d895927e11a831042f1c0eb24a9112b245ce40ad", - "811c8ee2562749a732a5d2826c41e957fc85413ea246cb605e912ba106851098", - "99feabafe554c3c54b74e841ef18d1f52d7810ffdf0df6d4835ef1a32aec56af", - "f14340431aaab58b62e48d931610e9c488adfec4e9f281c86065b9233a173d7c", - "84144010f8f1565ef199ca1f59df2e21d8206e32995974e35589bb5ed41df3e1", - "90cbb6673581577bd54dd02ccb228d2d11d45f96d33c1e10055c1890e299aff5", - "2ffb42f8e500a0caf34b61024128408325d747421c8b49bce9be4c3329b252bd", - "579455a09647e463484c6c6339bd27b64a68feaa58031a9110e27ec4b96f0559", - "72b3acb6a818853bf79bd1e9342e03d3043654c022cfe6a8ca2866b6220b3829", - "5d8bfc36d81237e35e8f622658483cfe824dcc4b645aa7892fdd3768f953f88e", - "4851da77a8404b7ec3dfce689074af3ef8501541dcc4f952424e10ee9b29856e", - "e9c17f6855baaed04386e45160c3c0a34fe9b55d013e993b73af0f1f3189a6c8", - "3450ccf96482e85a7cd73e04d3f276ebdf5816ffbc1c2d1ff02edd73dca12830", - "80ffce6e0c4c2444b4db0ab012cb35f22c71cf175de22b0413722b6e6db7acf4", - "a04fee6e81529440aa9c58e8e0d0ea61ba5f417b78a10fd9649579fd8e4c058e", - "001a2694550923f0d89f999b9c31136c619fef447dbf8f03d99a8d0090d75871", - "bb4b6b96a5512750d8b2ea6a44c932905d9d1e32ef480c11d7b9f79c7e4427e4", - "88f771fe6f6fbf4f28322880b975fbc339ed3b79ed6e6a03c96219095c64ebf0", - "79ef9f70e492f4134aad18dcfc92a0f2f5cf21b7815113d143c060dd60017b5b", - "95622ef9369766a0973e389b85ab9e771cb17aa6449d38796d37df74b14ef0be", - "c2bf7c5c7ccf11d1f00008528308fdea631722a87e4db0ec68c29dc1ed874845", - "ed2f90b207e2d6fbdd6fcc8dbfa344dd94b55643d7ad58112316cbd88544070c", - "aeb9a2c36d7de783680527db1a7d4aea676c5de860c31dbfc8df0f1050877608", - "572de28b74c7bfaba45158845e7589f30525bb1ed645c42b8ab750e74fc90b0b", - "1762da738418999a5eb04e1f34a2e6f369de1da53d624da36df59d0a353a0bd4", - "b667871da9d5c284048971ca8280cdf2ef34857771f64351875975b72b85ad22", - "52254821e28be1917be450502e47c5cb0ecf8177df349d988695a4a776eaf56c", - "ad6c3de617d9dbc13c4421686e8deecc457a6c2e819b3d33ea4b7b4ed8c65123", - "3a77d3082ce955cc6842306863a9a9e1803aa50bb420e511e4ecd55a09d7e197", - "a1817304dfaeb80381e2f7c6bc608fcf09d3083903898a13d22b72e050574c25", - "38ccf860f734de503a0471bb8a3920ad067373e59b63c90f9f26a8b11722d9e0", - "188a874e2ec546bb94741555fa3f7982d53a98f9b7d2130a0246d7dbe7844897", - "0c654f41dbdf060658302ce02b026652f665d1c94dfbeab1a1682db58375c778", - "0e558bcc6ae552188019c7f7bd50551b123cd8e0ee3dfe0bf81aa3dc5431a302", - "e745ab88ce7a85c6eda41d89ebee682888de3e392ba05ee94d8ff0c180e03069", - "ce587eeca41ab25cb998779d97612575e21cc2c6e71742e6873c36478aa6ee8e", - "3c66098aa8db28775ae9a83cd502e8c94435d63eafa6fa460b7f92afc977ce7e", - "7f336ff4523e54f1c084407dd62b8259fb7a04ff4c9351ffb3d3429e256ee4a5", - "ca7dab326ddf4c8bd44093718c0cf49e0beee794668cf189247c774fcca53d57", - "028b3cf09192600943834bbdcb0e64bb76710842640603847cc832c300a22c4f", - "fa1ffc223f2b18d3fdd1c666048fe1351befcf0a5a5cbb43957f1fd04a13238a", - "40e03d70457f81b7ab8088952fc72423c8e9e7ebc2a95a4f46800cb552435ffb", - "1416f49bbed7700e904ea9c053d8382d5e95e0b387bf257cfa51366acbcae108", - "69b4c3ba4444e8d0f705c52d75cd824a47973cc606db0ae1ef5bd7ac629d37b9", - "256da54b246ed3d8b910e05c147c9d077a94d195c87ba7e8e0754fb172924dd1", - "3b8e86e8ac96fbb041b1847c0093cf8865af2fece5b5cdf1b7304fdf72abb40b", - "e01f6fd93227de4e750a6b6daab41ca04dc245513155144a9497cd3df1a941fb", - "d38fb60a78fe4de22058c552c33d65451923eeb9548e82a81104815bc4012eb2", - "dd08cc8fb08c70dcde64e2e4dc3b1cc6015956b95b2f73381ff390e4c00d07d6", - "af94d22f5eda033eacf9819d88491fdee068e0cdd83442c8a563cc683777008b", - "dd340d553094b08ae612635fd10ebe32107449142ea05f54c1c85ce089f42a1d", - "b5eac9f18c6f325104980cd133e51d3c1d128b04e5c1f262324ab69ac4b6c290", - "61961907b361aba4be8ad5d5c5d4d2325c305749c5ad63bca1c1b0b9c075fee9", - "90c3062488b7a6386e12e09c6e74c039438d8273dd86540043cdcef94fbaaa80", - "9c875523f53989e9fce90429eceb55c63c6fe676e20362867135fdf7f2630ad4", - "f3de84bea945c4e95e55f10aeab17deddc6f08ee21fca1812dedf092c4fca8f4", - "12a4875b61b1b5564dd1ca820aa68bfac5c41977744b801dd4f1b81dabb4a722", - "726e04c99f492f96d70947a6aaba12313f506ef6ddfcbc0791af5f58a78670cf", - "9a5d0fbc80c8d2c8d91346bfbbb54b10ecb0b4756a463edb3f321f6b2c9c1ac4", - "243d2ae6f7432d226c4d0337a9ecb34b47b64231ab49f144488d9a09344840af", - "0d3b8ebe7f39cb7b2bf2a94ccaf37a13270af61a75b7bc49afe5b47c1c0bf15d", - "aa7aa69c9027aaa12bb8cb039787b346555c97d0a886d3d895d3422e18f8a276", - "6b26c1267261bd61699c96e9c5e200b822464deb48f549033dfbf3c0c64805b7", - "a0e2e9daa7c70b3ef09acb91e2fac7fff7f495bbd4a7b2c77c1f27904098b9fc", - "8c60c92a35538d20390f69115cb92116ee031925d3f097905594d4dd7f527023", - "f7163225e239b4517f38def6237673b2a9a58982a322818155b73ebee9d534f2", - "771d3bef865ed35507cdde9d4cb5f49c495daf599d6f7924ebbb80e59483c676", - "3f634b41263311ec13572c2056a80dde7a8b4abccd9e5aba5c3e835f28b07994", - "681cc29e55f82dc0975c89e21462d75143b099f18f6b8a1c7be7a99f17f1b935", - "0abf47cd9e9e16a5851159a1b4083bbdce1f44ff149a1d29b730c517ca392c93", - "1d56ec81eed1ba7fa9799ac7d927f6a19cf93cf64c59b2d920009f79c8fb435b", - "a46cc7b6c3191f6119799fed43228e6cabeb220b0e8087c8d07a08ba6f7ab036", - "ef0f5cad935252aaa3bfcbb449da346b2e660563d8b7cbb139a57848a8454a5a", - "e54609a32c9c2b0804222896613fe4e4616b7ec74f7a61b812e7cfc04f7abfc2", - "014d4f77b9e99c0fd81da06cb50e2440cfe5c5fd2213c0dfb1a4e443f7573e92", - "724cec88e4086691286c092ae25fd9c7cecf4643eefd7d2033b050238bd45351", - "8938536f34c9d867c9a343756cc90e4542fad05b690d164fa3ae3507b876ef34", - "43e36ea83ca759b341a68f9daa222a82a5fcb823a249d3cadbf91146795ac95d", - "db53dd65816d2c9266a7d65cb40d74fcde4aaf53328df3b12d1e08e9182e0066", - "b2561b60dca8c37db141d4063dd0b7e3e2614cae5c3860fd5ae173ef98b1e386", - "87a3a2665e68a6403e4abc3f728065ca6087bbf8b7475a87847de2e09937694f", - "8b4943b0877853d394fb5efc4c16079ad8d588a833813a60d4070ded1ddde6b1", - "d9d809275ffddeebc2cb28230f84a13dbeb421681972502860f4857d83660530", - "216ab0489286bed028b94f6f9fc06f862c0938df16f1d0caae1bdefaa7e445ff", - "ceeb63a7716c47cd0a193b7d0b2ef9af0ed8841d5c4c50e19e6d05c922f6d0c7", - "6b63055b49d64b39ac07f9884913ca8aa2440dcbb12d2a8eda2667727f122c98", - "bbde16878c85c087cc76fd9970d843cf6cdbfe416d1a956fb75ba712ec475358", - "b18e3fc71c14abd88917ebfae6484aa1fc8b0391a8036c6dfbff5c7888dfd82b", - "2189ef15c7aa5f17e360479c3dfa2f31bada8ede90486feabae28eb37382bfa4", - "64adcf9dd02ab0eee272aad3df20bd05d1f1818977b36dc9fb4500f0bc2944bc", - "395b5cc776ae52b0c0f24a54f11be814b7689b0327afaf8bbef0b12803e5e015", - "9b097c559bb8fb372f7e80744189bed53fc83a0df87d46d21c9b0769468f198c", - "d75babfe2285378757729f6100eeceec43d7922dbc092a4cda2667aea6314cd7", - "74ef37fa4df24b03aa96128e4488e0b3f4be64b2207598789f19378aa925e385", - "9d84ad5e629ea30440d492abdacb56b0af95195ad38d46664acb72f7b65583b5", - "fde43be1599082e1c81308dda8955063e886eaee5ad7274c77a1557b84dfa3df", - "f3a09347f89d39540baea04396ba8102292568222e2d383870ddda801a54a92f", - "548b84434e342ff250ef4850b7b898c243fad9aaa4b2502154c1004b3360c7d5", - "e1dfa624a0d0c53f765109315b6b7e608bf19e2dbc1fb590ba449ea367590db7", - "85be15a092d3401317e09d42590016d37598e01188e36c381938cec7bc9df465", - "67adf786c206db8877a8683201554274a8b80b1ec5bfd26721f2b387335851b6", - "68ad81b0b79406e1c3d6a8815db279ec9f2dfcecfdfc48c96c95d64431eb281e", - "ffa8a46228898b33339005274793585423b20db4a349050e11706b659d78bc95", - "890e1f2ec67005ac92931d0274cb54130f890c6c50d98e9cece8733155b431e8", - "3173d97757a295b993a3798cbc8b70f4c238e3766bd73e47e1b6ec8e139c8b30", - "356ed97317737b373c9ce387bceef1a89e5bf7036cda62e97f2e919c6146c235", - "eaf7df93bbcabed96ab91253837a920e42f7493be105ac8f95eff8b42f6300e7", - "a662f970aae2c63f2503cc922a8d8eda4a9eefa0d14f949b8aa91f24e523f728", - "b4e1574e9c36f02cf61e96dde4899061790b2627f784f9d233a6a40da147e875", - "61b0a90d0a13e39c6d77b52c62f5bf746ac3d30a6ee2389d143db3a0c7f34696", - "30b49999f4280cd255146ade35bca7c525087016394996c18f5bc44362b95bf0", - "b81e2ae653b9e974e35ba7e243af2f598b7b8f3b477b851c07d458c8aa70118d", - "f7e48d467ca09494f8d78f695eb2418ae5f741f278794e8bbb27dd4aa75a9d55", - "7eed056bf908a61aecb9b37913952c89163a961df98ca2ca36eee442844233ab", - "36d901ce638fc759f109542f5806778b25b8e789e1d2c2ed0c7ed947cff258eb", - "1f7b9d7ed11abf333a5803d6bb9e3b256d6d583228cd86ac2c7d170255c33ff7", - "e0ed260724da422f19b0ccc9161b203b0c2a3657750c0fe3c4c55a2156df59ef", - "5d9c7e0998d3419698bdd5066e2bed231d1c3ff9de512cf599b3f7672ae92023", - "3148ffbc12ce6293015b9aa69a74bd9580fae6603df57cd3750cf1750e69c719", - "2b264e1a09797d8f821533eb22fa304e133a0db75b6a565a37fd0f95bc3e8a71", - "cfb70548e3f332b65b7292d390b813b06773a3376d3f4d9b014e480a67cd9896", - "447ba70779d638d0be5256e31dd61bf3215a8ce89cd403cca0ef69026ffd4c3c", - "f5d304781637849ca33e24f63396b64ca03ad0e2261643503090a7aba93dd56a", - "b37c8d5d4eea75248c1e7b410664b58ed8c6b43bce5ca31a5fb75c6b86853d4d", - "2fab2c728ad009d66716bd57c42f5a09e252a82f28a5996739ffc0be0eaf39c2", - "d6b054b21f7b10ca8555eb95113acee398b90111fd737ee3375594ed7066826f", - "7877e9966c291c01ee116aef069b916144f538282a65247166ce6aa3d1f25909", - "8f05b5490e11498a4800a0f87803b0628f35a229530f09ef1b8065bada862b57", - "067c506eb360f6b85e563b8a03d01ccdb62e9e90bfdfbca97d059f1d586db6db", - "95c54580523d8bc14c7c1b1b0ec912e51e79a72898633235f9bc42df75970784", - "56d6067a288b456176374479d4c0b558ecebadbf69f02bac0a98bbffca0c25d5", - "13b76f3eebcf45befd4f9b245d73ae6be06a7f00c8f082a21878e556366fc082", - "bf22bc0d9a6216e6aae801ec67968965b8dedad4e1da09d80f6954b784ae9954", - "ec45e18de2d10b47ac55b0ef63dd65acd07cdde9176c3ab73e7b83fe369a2e7c", - "8711b1c84921a29363d9bd9cab0a0e71b9a3e6370dcc607a9f19968008084c79", - "b7a9981c354c79b93e0bc4793f37785e782b0f54bdef879fe240cd034632ab95", - "63c6116ad37ad68068fce1cb9280d7ec708ff4d7763c28799034a7520e556df0", - "158f5fd7d5c0fe10d440ae8566b2f4dff85fbbce0c7bdc6b3e897bd9a32b5109", - "c9e114fad4a841f2367f041c56b611f52e808f79b15c82391fff9a68c484e32c", - "0000816ab3a79f80686d4bdd2218db659d1d26ad13ce6416478862dbf82ad384", - "d7f3a60c0dfc76df7365ad504d59e82dc1c3bd212bb905a94470421ef200938a", - "285e169f084c2ace8d607c3b43e7ca5f9398d3c21f102d93da0c37e2f93d3292", - "566b91f707eb867b22c95865def8c593de3cd9abc51abdf0d7ff1d45d736eaa8", - "f67ff864554b8433cccf11206cd0069211924f12a4d41a07dff978d197dd579a", - "8e4004d7949fd7a881eb5759929e80b4672ea611bcaa1cce74938289bd7ded08", - "a6bb6705619d82bde88de06f0b2d37f521d400e79579b4a26b09ff2f79a02a0c", - "162c964ee6ecbc8477fe7fba72f6013914544ff18d700e5f93241f22d2205cc2", - "673ad72459bb69810411a6803d7b22251a8ac8427c4f2cc2caf10bafc9a782e5", - "732c7f83cbe92a3483581b5463a84b6997eab60400130ff740c878a610491240", - "813129773b9930fe521e7c6e6137a29601f346bacd733130efb2373b06c4b01a", - "5603ea2029c13e6347158bd46f628c7e7030a16eab72e2b6f70c7d9774a24310", - "c6ef4bc8aedbc592b87436eec3992c1b1bb0086962d19515a98d9cb1509b5f12", - "7b3fb9f6021f7d2b9a55495bb4911a1d68ef868e2eeca0bf8319b99c22f549ef", - "78a6cfc96b1b0452ae2c9064ae18dde26ffef2581a67041e6d3128843b673d73", - "adefeb11e780aaf29adb4cd036c9f70ad4b0d3a6722b428b3c6cb993d5b6e0d3", - "990dfe75f71777b8f61b331b9c8a94088b28d967e4ef1d22965d447f038124eb", - "1cc2ca12e57ba6f32bbd92200b98b24de57dec3f8785686ccce3b4b38328784a", - "a4647d523536aec136596006611e16ef181101bc8405dcd05b50674a628f8db1", - "63d12b4a1ee82b9ab7b27e1822e906d750b7bf621425ba53f964b7078f243585", - "130beae7d2738c545e2120a1c83293fb938e86d26d732d254840bb7b8fd8855b", - "cad238d820feb5e7a41acba27fa7300bbd88e1ceea76a0fd0bace27c66f2fcdc", - "65c3a706d7429eee2e02519c1378b6f81374332e97ccc296d6cae84d694bc0a9", - "114b68babd6f56fbb89d8e348f3f285bcd6bba69936d2a55c86dfb6746be618d", - "a0f2a509d2995a4e1fb67722a6b276befd3b2b0518280a47ce705e791f2edeea", - "2af99086f84b6a22e89f614ca61a14ea1d761d02bf217a11ff4973bf5cddf0d2", - "282f41256d17c1ed83027d1a9b0cfe1060b9117b19ac937d2839c4de05a0d41a", - "8431052c8812aa90719aa5c77ecc42094d83d58c984d6467216aef032ced3fda", - "b27437efbd0920169ed4d2d3343a8a249c30a50798ef23d03785c2f60d91a644", - "9eaeda1a3ffee445ab1b43b31425243eda2576346c21e157d7cfee278d576609", - "9cb6cc2616ad359419733b52cfdb18e5647a4d9b40027e82b07a3e471af6a1ed", - "444b3890050b37cba934c75c0fdd882d755e105fcaa17b8519a22e2db299e089", - "3cd86df2a5532ada944fd68d27665b81d48181643b5752bf5d2f517bab8f76be", - "00c1625b43941daa367da851f6b4b8e8d1cdad43a99cd0701835c91ab1af0e9f", - "85e34d3c53b970e8bb2846f2e8e11b8a8c943e044ba545a9d4877630c7bb520b", - "9cec91457a07eef6115513cc154b4193235dd24a8c798ee8b8829bb0b028d6e3", - "80f6d71961446c88ce9390fdc380bd121d7736d66fabc0d90d6001eec01e1583", - "68d036c16f7c4b10d527316b2dd3a6270dea9f5709ca18d800d57a67fd45a02b", - "d260cd735566dfd682fcdbc0bb0ac8f81717a4b4527a9a85e0925a2fd40deba8", - "2f03a54008e2b53d9c5188e3b722c66f575639e742241f12f210407a6db8c7be", - "7335198146f3db909248501f4bc43fd7a31cb8dee20777fd6de92ca506913ea3", - "f3169bc5ee9665f68a0cc54050959da1c710f14bacc00711580781eb1c63f7cd", - "d8b14f1ebd8a71b3eafee93c2b1ea1d3ca120df355fd2ce358b7522c14d90b1e", - "5e033714b5c438519d7465202de68a7b68062cfc9c435b20aae3cd930b01c0de", - "422d14cada51424be6c337124f37e03420991d3e0dcc1bf2b3e9258da1db8563", - "53d2f4040c7a68fb98f1c17cbda0a756fa0ff8c687efa279169706e6ff1f7c8c", - "5e2a04ec28d77d192263a29b2429e80c88752f4a288557bf9c755d4fd102ea7a", - "2b10bd90878b3f216976895823c585215cd49cf5e456614f71aa0ef1f49579ea", - "190c45eceaeaddaf1917ac3e87059631c421a468b70cfceee0abbef4435a9ef6", - "45e9681dc22ac14235c57c0b389c9967af1aca323ecf987d00d3aaba00ad82a2", - "34bc908ef7387ccbfa32f00a0827647e4cccfe214888140b13c9b0853fb2dbdd", - "ba58ea1b0f503e7e2410dca7f9209f0e8a5cf30bbe78a746d213d932847c0227", - "7541ef6e3475ba40554a4d309a799b5e81287ca6e1bf4eb616edbb64712627c6", - "aace9838367955004625b426ed48d405246b9df9c1c6a581ea12d441d1b008d9", - "95cdfff854e6e1623d6f1004224eceb09f5d307e847458f12c6b409b4593579c", - "c5dbfd412b7c6542cd0af3bc573f079f807d44476685c91865b736bbb10cfb77", - "767ae25404bee2c579e43718fded01e32da03083774fd622b7f752d5aa060c3d", - "c36d91e94bef36f59ef09b0192bcf1c20bbdf9f4e94037af6e5faf6a2db34bcf", - "7685bfba93033b4da50885b90f146a5f2fe977a381eafaa1068a795d2eaad798", - "bd0134d6d2021291af3a07e2fa45f28151f9f7daeed1dbb43c34b8b2e4994b32", - "a5c46e010d6d6729a8330d44a77fd657089e70a6cd53b22c68dedeed81eefb13", - "cd44490c72b1e831e132cd94c5454d9568d95f9e1041d7991c17c99a9108b1a4", - "c7797f125341dba0a793e6bab60745421cbeba4f215c38c45dd32b5ba2156626", - "f269dedccf2d5fc2950fdadefc34d4fe6e1c972141351917953a322dd7f9d30b", - "a18bcd31d91959ae5eacb32cab5c66d0f6aa49b216582ec99a45128971c473db", - "577a565fc705f2600ccf18072ed14714810afc64c664b3dfa173d559f20d7218", - "27ac99d5b66c74225b753a9b0f3eab34fb6f07966ead84fadf5f27bfe5156746", - "95f76fe8b988e154f554102dc3de634b54af6fba938c200b5ee356f022ba4368", - "5574e238eb4d610b25a8d44bd1d428b6aa3edd768d42ceb7976a05243e1461ae", - "a14afe5b6b98502194a027e0ce6c1aa27d99edc069fe8b394cdfd17e4fd53395", - "296ef7c2520c31f4c168c451aee717183796f753823093fbdaf1e9a04563e757", - "1f75d218163462545dc53b1823d5e2996ad4be2b96b37c223fe9506bcb8ec179", - "dfe410d6e71971728189531844f56a22a84bcbcf9d5de5368f48359e6a393579", - "6920d024a65b7a013974691443a9f41b082ebf3a040ae2427e0bd4248702bd4a", - "defccc8a211095e4de2ed356b6dd6cdaffb7379044eafd68a3cc6fe3218a68c5", - "8bb069e5471836df07f9917877122b196eb799b22798b3397e3334e5c657239b", - "810f94c5a3ca9e27737ed459259595eae98d87930b6b2f8b855a537277347965", - "b7d4776437921ba528c1d1e4bb965ff5133128d658c0ac4c487d022f88dd93e0", - "038168c617ccd547768a249be82ed15ecc87fd6f11c15a05b4e2cdd78d864a35", - "a93e8abc1503bd18626c5a57eb4842123fef3fa21cd5f304cd8bfbbd64366b3d", - "7975e52419b3dd56bf11c6fc3d82b68c839514687875ab46e79023b0e48906d0", - "fd0683d151a0cf3d567ae88caa88c124148e77f309a50daffa6270d6c3352c80", - "fc98b2b66afff83728b0f1fdbe1a8bbc3b51a1a0b07aced5d69cfb3c97c874dd", - "ab7301fe423f5f1114b8d5915555f838bb54db408983c763c3ec672cba7ef90f", - "5c089cac9e6f5e82425dd876e8acd5bfc61508c6ed79dc03cdda7027a4f92028", - "4fda8695a9f76f9e7e55696319d3ec399f4ee8aa2f2845d139787af0cc3aaa2b", - "20b285dba9b8fc8497fc883f855495cf766a726163fd175e9be5d6d5dfc699c5", - "c079eac296ca13d1074eac46042261897c9311f5f818f48671d1f2ac5af48986", - "3027ffea304e36512da33b9e2adceb5e9ce3b947d97d9c472f3e3b250a36063f", - "ff70c2c8a04f58c3d08e47bc27519390f76177275e1cbc607dcb2c541ee31d5e", - "3dda0e075961a1e6e47c2ab255f442fce5a111922696de360d55b994707685f6", - "b81421ad8f7038e99de5ee023d7329e8a2487838c0f4ac2f748864818e4ff676", - "01067cc26b8e72c3b7f1db9d028ec87c5650587e4e699a4be815e9cd245d5a30", - "b438b2016e12fa5bdd0f2c4360f320da76be54b08645ae0ebc827cfef56cfd24", - "342260828a8a0d9dcd0b4b805da5ee9f90e5758b28fe62613fd168212cc11843", - "fdf205edccca110262443e67bb046907ffb04b4b872db29be557d82e191bf140", - "4ef45636e50beb37b0e3f263cbf10cc9ae42a37405c5a887a69fcb833ae88c0a", - "c2a9d8ea3edf5bf78d728154ad0e193f87f54456a14c5bbaee81bc19c6734f9e", - "c8c013ec9b838e2dc9d456815754f57dada121075c4ac6a4114520d74ab44e26", - "1a5329cc464ad512211427d66261002b3bf97d0582aefd8ac36661c18ca50fa3", - "9e3f7c2866bbf90c3de50ef7e3932751f7c3550424656f4231466ba1e6028733", - "825e3a8121941e8462635eef6235ec90359cea256f9a76be592f2202043b4f2a", - "361301a5c80f5e598d64c852aa95d8e9847842ba8ac40c94554c6661589bee3a", - "67d1ff9ced2ec73dbb8a0caa190a66d7eaf8fb24aca286178124dfd88f5bb01d", - "fc416cf7e3c9db440844760ab72e2d46601259e436262823aeeebda40552a9c6", - "1fc18ba133cec58a82fbc132906909ba02cccff48b211b62c85c0e9cf682af9e", - "7aa2da5c2bd53d9dd25392b37b0d615adaca454f2c204257361891511553f910", - "c5fb7a9c908c521f2bd23620348e1692994cfc6ff8028acae605ffc60acf875d", - "5e3b90ffb3451259bce9c9bee662fa7476cf6fb11409687e60789508fb106512", - "90856c6fa396931a2bedd58cce36809c4cdac1b4f7ba7c849fc74aa4f164e3db", - "7ad436058be00dff8e572679c12b173f2a0aabed6e712d76f5546f2dc65fd80b", - "7dc095e2d24129c552e611cf751b856729cd39b3bcd8f074cc342823da72898f", - "6fe5c0ad9ba722a0d2bfedf20633c0afdfa3e0c4990929c479476eb38d84cd9f", - "ed51b5084a438ffa82b8666682f43001d1af6f27d1f2ce2fff984e223b68dc14", - "349c67155454a5cff920a26c24307ffc93986ec38b0d06f80e79a9c8de192649", - "d6495638f5b72fca8edbb207281b403bbbbd6e81af1f7d7425a9fb59238bf005", - "cbd7bb4ad5cf2837fe199e88f4ce9def81107516e278a3500de7ac18e8c86b07", - "5dea7e9a1361818d448b5d741b295d5e6452fa64bde741538106d6ccd4ecef0a", - "3e6a87726bca481368ce8c5531abe6308fc31d9195b6f5ba9a9bba4224ba0013", - "73c44dff675d0376c57dcd276ca5724105120c8738790c45829687168163f1f9", - "c96a42cc386696393787b87340747ad72a95b84be30322bdb079436e00217e7e", - "4c62d0e5a623f7fe9e99609706495185049ce909479f92bce84c1937a0bd223b", - "828bcef2ee3e31b5cfc3ee961be7fa0f28dda6bfa244f76e4012e1af6cf220d6", - "288ddf397e24af6b2988fdf3a3745f9c11b164eaba90493596760d9a87a32f27", - "0824c6cc38bf9dd2186d8f403b18cf318d82877194bcb166ee43f166e861959a", - "d4e6432d21bd6c162d7cf55a4a9d57dcdb92737cad2f165b073ca2e4ccec1771", - "404d6faee2f66375ddc292957ed48a57be59627b255d19ae49dc6af2fcd89a0e", - "ef47a7bb53bc8e66b54aa8b9137a7c13c1d1b026e94fea178771c9ae4644fe6d", - "9249db6f2088561f6980d9c828fe82d57334c8d8a613cce94e19d540681c0a34", - "496acef4dc78e3331188fafbaa5c0d9af99c4b5ae3eee84340dacc99def2c2d0", - "908e40e0620b9accbbafaabd032872776bc300c593bfc74a2fd64ada7bf6d7f9", - "cf35c96a6bff281818a54b70d88769fe6c92bd4000611f7303f75dd3f92aaf2b", - "32a79ba015af373321bf81827e71804214230d3da3bf9fcdc217bd65d2d240dd", - "592aedd1205d7b746fe79ca3f9ce54968cd25012c0d19515733891be26403aaa", - "3eec02405f0c0879bb823b44187474102253620798360fcb513855187830d09b", - "d085b4d5b79e025ab12d7bd282074d8c53f65bc283fb3358552155201dfcb23c", - "592734175b5be274285b8efc34343efb88038b2ee16f7a6b33cc944d5c53973e", - "6f4d22201b6e5fd2e676cf78dd996628df08be1e10550e40d3b543103291e9bf", - "0b46ac479f03459cc54eaa4b6e47867c8af889b9a076ac29f9485b58562e3566", - "41231ae4c0f81c7552edb1e41be1893af1bc9511bb6de9d40b7857f891631715", - "40a9a464d51c63c52941a1d29f34855f1dd24505313563a54927d2072e775094", - "549afa08c6045ed849dae979d724850308b26c91936a35d1deed0363f41f3392", - "f8c429a98c3db7d68d02eb5e34d97b18aa254911c59f863c348ec9361acdd4db", - "bf65602a06f49354cf6f5ea0d76f0a83c07c5b2cc58050092a088a400a9fed04", - "d9cf82f48078d29324f92ec4807184b7a0897f17a83c4a4dc7d22e1936dda8ae", - "00563dccfa374099eac412f42c675fde90eba326a1210d671430b9ce729b5947", - "07118d055c2539f83056d2e715278d5cdbd05cdc714837ffad040ec46efcc260", - "fdd0153e46244b2e2a161badfe925ea79e350d7d476e7c587d26d9e818320089", - "c62568afb20ccf77794221839a4f42db53859b4698d1afafc711d1ebab7d8bbd", - "615d2b5b7eff30a4aab75aa70cc38797debc4f7d7019f2b3900742e7b5a07839", - "9c2299307a9b899f099d011f006b15921973e1efbb14cf37a4a03799a8e7cae2", - "9a3919b6a4fd65706f4fd3faaf2d8a16904db25edc2bd7c6e47e2d09aa4b8fb1", - "1d3c26d74eefba69af42855bec0a7ed785e7b7fb00d512948088adfbe8fbec5e", - "3e64d6eece7f82181d1e11e6946771deddd1b3fd9ec18046ee14b3dce9926f3c", - "04a6b50a12a87d93f2f42053840c9948dc00d69923fe497e86c0f29966358bff", - "8b5fb83f5eaa521543a7e4a67cbc0e462fead8cc8fb95af212bd9c4d2fae991a", - "9f8fe8fbb7016c8b90f070e3dbb6a2b4671e7e9f9bdd4cff0c488f42d450f6cf", - "33c59864899c0254febffd827293b728e9ccc9610e37f29b88c74af50f5e32bd", - "df911d6a1c1d2dc93db72370dbe2818416c67cb78d6b5671a93029a21659debe", - "b6a1999631142b15f75b4c4d69817f16dc8f125062987934e2eba63471c7babf", - "9e8fb380d45a3b8eacc603b15d8dd3cf5d58f7ef4a31cb00844b4a1c25ee1539", - "2321cffa0f0bfdc577c21535694a7245379cb08c0905b14debefabf82e1375ef", - "2c42ccd01eaf944bfccfec2a2a230f18b73a810492c6349d682c9e59091b59f9", - "04cf3839e42c2216512166c06ae1a18edd1473045ef307cc726cdf68069e64f0", - "65107f171f2ec220a57b0add43c512c50c56632659e9f60b777f1c31947ba3dd", - "eda1815b543ddf21ec4bd12deefbb118c97e5f4f4cd04976ab463d69c2d2ef71", - "de2faa0b2e8248b9f06068d34c2b4a6d577fd6ccae3d6dadcce253bd9c615d0e", - "c96be2d6ed5931e2e6ce4c209e6b273ce6c6f6627a4a0f1377839cd08bb17a0b", - "6d05db3da8ca4a20dd7774f11d6df6605b98d1cec9dfdf2cde3328fae016b8eb", - "0347b50e6a030830bc191948e372b53069d920ed6ed32baa60e1cc960f5f1774", - "9932328701d03c401d713259382568300816ce1c9f694bde1b27a8dcc5565f9c", - "afc135e5652fc9a2b0567bb4433c565b508d42edf56537a605704dedf0f8b238", - "2efa656d493cc2558431b6c02a5a51cf54b870bd5281072e38e55229aa6c51c0", - "75e96dec2624ce1de3a16e4ee03c7314e4c27d210f85cda2c80ba3768730f5d3", - "54978dd602a804ea48dedae4e46406549965fe733a6f50551fdbf8a8cb497afb", - "0ddb160bd14d48eea36813780e0f7c05e462429e72e545ccdff62b42045bab52", - "f297dcbce0a3205378111915c728b4baa2e864dea2dae8857d387a3f4d5367a5", - "3c533bf5dee5060d73c6c6fea877ecbfc94012219e47efdeacec5e926b7e4d4b", - "c6254b801ebee8503c60a9688675fadaf7fc2a5a77f0c56e3e722cf1caca9b1c", - "a35ed023e76ca851e694b37d2ad126e6a2e5c42295eb37f5ab9c36f10af54df1", - "f90e8dd7d8948184fa3bca6aa62f10bf58252f07f4ed15e09f4ad0e6647ac991", - "e94d97f400cfccaf39ef216f4a4323727ca924bdaa2afe57e270dbad4073c286", - "5dd8e347c1a101aab3d5be20e0f42df68ae63420a60a3eecf0ba1d5b92e5956a", - "247f82fcbb9c988d6ff4804610653cf245276116d4a7da0404d1ee0e9651dd21", - "d55fac7d29a9890f94d9ba6505ace973e17c7a731a5fb7da62d5ea56c01712a4", - "717a50d18d5c04d632ac4ce32693a2191cb23c6b157f67800cfe8dcbf84895a6", - "eabd54580fa053d7f22759c340d64834e4209a262beee2af4834caddb113e345", - "1deb3ef79c5e622f989497d9330dd32f68b053a0d69e9e876f0392f4fb96cd1f", - "21cb55d4d00f4352269d8b4bbac20dab3c1a1eb5b4c4a64fb99117600303b920", - "e62784a46a20e0ec77bbf4e7f294c31f3d88229c72c3f036d3364d6c6db53336", - "c00689f350b77125b035431a5af94283d02fe7c33837ab7bd63a68ff8c042b68", - "8ab79a47cc12674c40c1d848bfd1100b5799d20c4284bf07e71914b7dc9228ca", - "28b05b08ef42ff97f8ef0306a173532a95e72df272b3b97a4231b5973daedb6c", - "f58acbf97bcdc2bb7109e4f3026878e27dc888c15478e8fb11ddcaa53fc89539", - "c22b639bc854f662251213562f0f7a4e98dfafba11e9d266114dd3c13ee9de07", - "4c05edc9671a1ab545df67abf7d85d12b7f1fe598c1a4cc203d24871cc761486", - "e4a212bd25f2e5830ffa306961cc22ad6b7f7e6d498771d78accb91da461c13c", - "cf41189361db8e150cfa331a4d8df3c530742d3d4e1f22a38d3f601a486abde9", - "a831e5a85964223af8d6a28356fbe0338fc037d19cd1508a3014a9a577284ab9", - "a42bccfaadd6d97450fb2b3b4da62d56929f18cc3aab1a5ed188bcdbac5406a3", - "6133800351249d37b780aa612bcde446a00af92f4ee7fdb30ad9b5009e21e3f3", - "99dc255df21d65391f0871eacb209e296fece1eb2082cb32009e19db369a416a", - "66c9af86b97df3aaf191e26aeba886e76d01618e60b5ff4a597ce98496aaabf2", - "ea3cbaa99dd4e60a65b04971a85916714fc3d0e8a8b6b64a85933fd92d6e25af", - "551b64de9f4171ef8daf601337dea82a28aaae6047a762dfee3f0962cd7dec31", - "ddeacd48b058b55452e5dc6b1ce5b69a28d162f8ebc351f4d01a36d91270c953", - "6ca65096375d1ddda35605aab4071c1fa2ecd432367f116480a2817753081f19", - "26e4e8712f6ecbc6fe196fcf65417b1fa473b87a6b40ad938f85aacd0ff9a630", - "6fbe3e51b078426e6bab508048e4c76d466421ff223d1c00865dfb74183890ea", - "25e689558352dcf2f7edb4cd561370ffe31fd873c8ee36e5e07e0a51bd36cb4b", - "b606449080d7829f3c7f1f7f7ef45d937366cb1f4d18931e16b80ed52e57a067", - "68c32720c1a22cea5aa148a2c493f672d6bca94f4b1c079e0c74257166f9d03b", - "1076727cb652595dc75356639eb81b96a2605ac99b879f9b72f0d6ac7c1b9a6b", - "db7abc562b306f8a225bb96807e1c615e0491a17aa6caa1ed41503721250a4bf", - "45cca78f7744d10c829d1486f9e035b169bf69ac63087c2032040fb5cf7dc3d9", - "e70a1c108bd86ded110e95af655fdd958a4140430b64747141c4bd1dc70b5a78", - "fa2d12f42ca6f26047e6f12715f05336880c2ab25899b87bf6130e6fe6638386", - "28c2cd0561dfdf92394813d5049cccd35e4373295f38d32dfe736d4249a9b23c", - "41758f2c6a1764e5e8bbe2a6a77762b0a534d3fc07cfaf93dd933e939ca6adc7", - "2b6ac094d1a16f5abaf169aba54f6b740d287a406101c0d2915a1945f311730f", - "3d4d1363bb18e508f969c27cba8fd8ebcfe36a49942ec075f6e498e2ac7cdfe8", - "914fff5b26d80188491bf5d38ca526a0da2c1af77aa133d6066274619447054e", - "c7e04f5d687b5307e27353592c6c0d16f9c3a148f1f6ce9b27fd70b778639578", - "5b85afdc980ec4b5f42a36e8198331b9ca6a84688b4602ec21cb6876997290b1", - "d6474c390a6d1d7b1e017993b2b4f3cf459da3ec637598f2d3fe85376606692c", - "e4051674377c486fdb68eecdad65349403c9897c6bc6a51c4b15c2c023df2868", - "0d1fc0712774e01a382202456089f9da6f00e09fd7f3c3e8000067fa7d5d3ef6", - "da52391cae373a485693c49c9f3f992c0be204f35286d13ae7d56e746843291a", - "1d9f2e284694da8c7eef4c32bc02f034b9d284e98a523296025669b459dee4ad", - "618f17ae22576cd15156b42cbc9a1a151db47292ab599ea77b03aff5eb2c30eb", - "2220ac17699c75d155c0e347f363ee55df520239d2b3d4aaa3938bc803e1f9ff", - "0e9d6d02f6f95881ade644bca39c38b5a1873d5f4fb87416c4f9befca9de26db", - "86661887a77b76b9c92988ddc5f9303846fdf6fe19657569a2bfa3d0ce9bad61", - "3aa131ea836360d4f8a11bed8a039f38a13de14ccee4fe92b3c11d80a366788d", - "5b4c676139e846a671cdd862b942b58151392a133ebe3d261ed1b2973a74f126", - "2dbc9701d43e97f278572fa6a2ea6a5deed0578463a5300df61c22ce768b2721", - "40fd87cff89e8f41a563383f5f90aef06a4c732386d56a224bb2dcd07c468895", - "bc9b82594c32aaee97caadfcc4d460aad0824adbc75020565254caaf73659d98", - "573048d6130f1bd14f11d8faee7a77f2807acd805e9943146cea5c9c4d3bb42a", - "eb7ba09a6da56f306b7a8ba9e54f5646ca0246bd6ea5d2853eb6a5051591ba5b", - "5e4a6d30be55092f91b43afdffa9a92c0d411226494c21bff66c396919b53bce", - "73b9442bbf4e712764c7b1e2f7259125ccb95eb038815927037c4fd754448e62", - "3d7a10b25c901920271f42c4e34ed640515600e4e79213bef50e13cb4f549cc1", - "b7ab0a1b9d1548165c74d0bea4a56136f6369297c540533e505a550a79d3004b", - "faa2fcdce1e6ff7b0907dd1106888a4156647dc60191b81b2dcbeeb1cdef9315", - "f40f0d9af56ef9b924bb4d06f2f00cd1ce860333ade253756c865bad83901ea0", - "392d2d47a51b69b0e5a20f9700af3b945533d35d06181957b8f071cc2aac5d0d", - "057d8e3d7eaad8f3b5baf56cc4812b9e85caecd1cdde5cafe90ba1edb7ecb276", - "54ccc374a6547fca744aeab5ed000bcdfc7e769cbd0153274f062fd54a61f6f6", - "fd8b0eb75e8b321765c9594dece36f8b536cdec52d3bfe1b1881e53289310b2f", - "5e6f7af08bd23ae0c88c241b1da3aedefe8620561f9c2dba7e69764c5c23e21e", - "e29bf1210732fe638c0cfb9f55d4d985f4d67b620b40dee6286cd94d9ad097f5", - "6df2c99dd4a00283a7d72af781baed4a699b54ec4fb23988e5480e061a263ee2", - "8021a23416bc7b0ce73d6f24c1088728c52356463b754f17c57a44e44f52a1c4", - "837622fad24b64b24ff3c1a12268958ac21f2e00f62520850a3b8da1174426a5", - "49ff6e28fde5d7f0c6d5c520412ebcebf53550cc549fc8a0ac49a977a2c64307", - "5e25ed1b7c5263a65dd02b017b784f5858e8f62a8dabecb430d13bbc85bc663d", - "36d2a5181a251094bb837d04fbaa9e48a71c009c91f50bf79929883661d50f0e", - "c60c1632e7b8610a7a47ee0ed89f8d4e6b05efe394ea175c3f3619ebb8372113", - "d9c297fc49cbc60fc5c05a98a10c599831a5a1b93831558cb291d73205e056b0", - "d4c8cf2d3147dc33b900a2f9c1ca96701a41bc22aa0eb897b4699d1a71c06665", - "1063529b571e67a8f57a24ec9f4ff7addb75d660731378fcbfde65a2c1e2473d", - "b1161ea2595cb7e712906aa75702c8d9e0b1d508b64385712ea18d51a0d2ca97", - "d07bc7ebcc0459ec65570ec4975c69d5b0c0906149cd411551b971fe943bc752", - "87555b430926752b31ed16a6fb7678646019cdd1d9d10ba2721abd013342dade", - "665d34cc11324aa7601cbf592ea48a9d5db9451474603c857f343e63c91cd897", - "4ea1b1f79be9766ff51a51fbcf0713780c6dda1195bd9673d273d5baca019cda", - "5f159282291a2d70711296b591378d0308eff5ad3d04699fa02c096a04a983ff", - "7294fe99402fe36070ef67857750195a2e1d2e44d7a8692f12fcc7489f52f003", - "516880d8dac3bb855523417cea09fe2ebe62281c8e92e6cf9b16ce4afa14e4c7", - "2e78000c491daae92e78d3a200fa94f9d9b895fbc7628c02c296b911a705160f", - "45085dbd2deee8c7ab68d77e4c9ad885b3305de9be4ed0e930c0aa8d7bcf14f4", - "7fc6cdd71c6728db162450929d5cf7377135f823d1263a3140e9fc11610025e1", - "8c25b09cdbb5be2a7a83f4a4edf562646b3b33d08651eead2904e0bc7ab2da5d", - "221f0cdf683e85fcdacce54245e441440f189eb060889169eaefab72d7b39ee2", - "99842e8ebcea7e7e2b7f2b2ff32254ef8ac894bd6cc006cc95791f6c05bf7a45", - "8e54f34c3d4d80d8ee3623cf86d65da8ce6868eb5fe35290d25fc2f1f26ebfa1", - "21303c8b118c6a2000e21eb30f4701dc0ccf303ca3c4367eb7fcec4643a2a7cf", - "d2be05609f813dc3d9ab28a7442f95813071a4bf116f9cbe10b02e76da9907cd", - "93d1a8a4a3d716bbcdc592fa28509bfb7d692b790c0f790f7a0bd53aa815aafa", - "05f23a7f1e719ba62c0860e642919dae526245c794cc45e9f8d8e1e1f2d69aaa", - "3f18c60087e8b442fb2088be0935c95819d2ad03c955760109d86be100d6a81b", - "c22734f8e34c858cd5b5efd75ce85d43c12a5d81aee8e50623b1303c794fb331", - "d3f4f112cbfe14e3e09eba4810a2db1840af165da3909e8040d3ff68d6006f4c", - "6d4378e8a68eac0a63a3f1d185b5d602d17f5195605d3b3be3ef8048f441a5d3", - "df096f10db60051e0ae04e9f25760512f0e8e2ffa2c3ce1f30d2626df14dcbc5", - "24fda44d0a0c5ce6ed6c71b11b9814eb3e34ce522ddbeae729d5fbb953b568c9", - "8b953e4256edbf3de75d32acb47185685a070ceca65b79692aaed070d720aef0", - "dfe8724285ad0baae1b889ca79fc27c6e279b6b0f336d2f334fc649ae96e6f63", - "74a09b1fbcd8c2e599a8db30772aed776632c6442b17d7382634ba85d6f621a3", - "7e0041a4186e3af7d1f3e21ea56cebfbac204118e3896229804c9550139a8b12", - "3c6c4dceaad57ae41e49c4a369519da65c93184125501096655590ac312e23a4", - "790db7bcfd7f5f87b901b6223893c6f3b8a39e96c4f5430b40ea596f1d2fce7c", - "3c88c54331148d85153f9062355be80f74567dd83c06093661df5452e597e6db", - "0f52439364ec96ec57d2925ccc8f999e5af2859a65ee7da8e37c42c82c9db2cc", - "e7fb9cb25fd2e009b579bcd9b968aed92f798d49a9d611f3f9d438fd8a5a4944", - "535f47c47fa12b8275f0dcb0bfd174c38f195dce9c95521a9035424bf975126e", - "7a6fdcefb7d0d5925e827513300ff20fbff1a6f87a4c58813a112668f08b418a", - "461215ec7780cda8f7fc11b1c157956394fcdb7d893eb090ea5d4959ec7b7724", - "d3ff5a84d8df144b811d5246ca3b38942e0e75ac9f7c348ff92cba2c4bb37ebe", - "546fb53d76c1045fdf7ccd0c9ab7d4d9eb0ed81cfac62130bdc36603953e2a16", - "19e58a9133efa461feccbdd397fe3f0c295340dd7a67c15f849df0e7f386d541", - "47a5977ab59fc9b1359db60a563d48a238dac34419da9a0737c391e5968451e7", - "efa500450d3573b5f1ae9229768203686e84e20cea157e644a27fdfd35ae99d2", - "a5cc071e684fbdb9dc9e9bdb0684c2c5b4c22f90cb6998939f362157751cdb9e", - "f08eac8847706c3be08cf988255843138609e08adbb8880f7a5382a7fdecc596", - "fd795cf39c2b3038acd8ded496b4456bc5247157e2a8cb51fbd719ce310521e0", - "d135da2b6ecc3dd6b089b31ab83002e071f5ccd79a1158b480158a4e2bf15799", - "e65add6638953935ba36ea55f74c43fa9ecd61103c134ef6d6a6c4966cc57192", - "23e5159c6d04bdfb0ea92658f729a79456d5ef52e56d82e3c68aaa1c4338b86b", - "5398d06f1e765eba82424bb8dafe7798ef78234a89f216041605b6984c2da48e", - "0333bb153f4e30880130ada1dd726e4bd61bdd16972a81118357631b6022e419", - "d6864c70947ab0cf7b177371766b2604d310d82751c65a9b6510e473fbc8c672", - "c3f9ba8d1b2a8d2fa0e3067f9a6dfcf186ec7a5e34506cad781b2fa7a680dfde", - "5bafe2aeca0ebd8192f66e5fba47fca551438959f46d4454bb24e7103778b96f", - "4156ef6cd2eda0b0540246bbf5dba58ac7791ff21c5bd07e7a38299a4874cd5b", - "532f629ae7df1a349ee505bd4e0f46bf3d483d0581b72157ba1b091a209db97a", - "d93096966ae2adfe619abc23f7c2b4853d18d40d484ec7dd46ebc7d1f5d3e7cf", - "3870a3fcc6c7a47509c72de60a093dfacfaa61a34f7b5b394d95306b2ddfb964", - "029d54e69beb93b0ca437d6575d1d141195d6b4bb0a11617fb09b4ac3bb17391", - "44987360bd04c49545272468910edb12b3b0b129c99ecc19f378e3c9a1cd309f", - "6089a71d5b620cb346efb47880b8c8aab2f9bd4561e349c03e9e146fa4037851", - "2877692ba0ff8847be84acdc8474a970765dae1052f91473a12a3204f5d56865", - "0b3c3c8ee888f9bfb25c5a51b17203480afd83c8f432375d2de870eb6c4d2787", - "f44995f08294108986fdfa318a156081785fa2ce957efb814c76db3beb12c84f", - "f91d0c0e48049a706b0bd3b15e0504350579e2c12d2a1fb3cd702283827df527", - "8f66d1c421e8c4c23efd9dead0980f731aeb6a9a56ce94ba93055a76d37aafcb", - "ee06c123c980207cc80603d65b9a3f309772154455fd2f32ddeafdb6a0de0385", - "d09dac166d4bf0569fa8242e859ec6c3e6867d1275f4416135c9f5be7b587b0c", - "e94ccbcd2547720eddd49f18c6ae5e29ed1930e9b88d1a43ea10c97f1775387d", - "19ec3d2cac97ca1bcf5a37e9820290f62b6dea7561e5123c6c89b951264fa249", - "17bee71209940fb839a5d08c9f018a08d085e0f4c75f4e4371054c5e4e251653", - "ba3de30d44f9931e695c072293dfa64ed26731db9c11c3e1d6561fe42d1e6b98", - "75eb79210b1b85007e40ef0ac7db58812d21846499e2a351a8263d9de3199192", - "e3a1f23bfdda05259ca555478ab224f14293a4ac565ed2932782ce79d83c050f", - "f5dd92c04c488474fe111751f7c10b7c4406e7ddb768dfc94d6ec23fbef87b00", - "46ae60b3be0d1a2ac89a58ac6dc34b3df269247310825efd081430cd80a5851d", - "e73e0518f126b0986a640f4e6ff0a238b62575e0743cb5c0d484f129eaed61e4", - "e9a2572d2e77b354a630a92325c9da4a6bae9aa237d9870340d63cccce3dfec4", - "29d779b1024e04c3b7f8789a39318b09319983bf6fc1907f518df32ff4468381", - "2ad6c6669c7f60bbd548a0a60beca9af3cf69a97ccd3e6743b305adf8821d940", - "b56149b4c9f12220d4f4b47c2e8fbeb089b078bc6fc2eb08a2241f91bdedbc75", - "94c65efa5dea2dec73f8a4c76630e0f64ca8fc96bcf2ae933d4da8230d4bc97f", - "fbe927a90e4d8ea9172d36ac42d99d8590f7b74ac8704fa73ef571e8fe0a654a", - "77e0973dfa26dc63652ce4b740be4478f197e14df376206dd40a2b17260da41f", - "69c3715073ce8078ec60778d8dd91e71e0bbdf670291fd1e0c8a22bc8fee69cc", - "7161c72e093970406f13c8ec1ec9925f971fb53cc0f3972feb55c73bf8d13bef", - "4727e0473cdee0b840392381cd0c59efb6e316ea3ca0f7c2d53ed82616b234c3", - "ecec4c1d93768af9fee5e898a8df0ef764d03c5c95e6b94675844b5e2cefecea", - "077b4a0fd51b917a76c9303cc799de438cffe62055004a8f7f4e6839f9fae7c8", - "cf6f755cbf8de9ab9dde0a12c0efe90969d2765c76172e27b6ad663cdac8aad5", - "f7feb27a9b5f6dad29b9260c6f9381bb7c6053c8da911d42458eb4d2b4e48693", - "5953d721be702be9b836660662c277605d57f6e8f1cace7b8764fb11cf49fd75", - "c4067b6a96ef754cee184485a03c1ce716768fd5bcafc72cb8a2948ac9ce469b", - "cfc2f67dc22916b1b60ddbfd78a16e7850ea5d569f89faf330837c3fc8af8836", - "a443d1c1ed79c3b49b4107bee601c4a77f3e5fe0d6ad581223276db13084ec8b", - "b188291a7885c6b84d1d9ef19d51f1e02fadae7f62b29ebe5764bd91f1dae553", - "343d9637e57d3849fe9d504904b2de4662bc684492b02a35351bee33033f856c", - "f88d99f7069a98c825f94c824343b034fb05f8a97007269ad275a43c7b65e42d", - "ea3c63e8bb2d080f58a3f65a1318bf238428f570724e21e25dd0c0e377300fe7", - "13ab07b73b25b5a701169b8fa3bd5efb292a72dd7da6f214e6117dee01acd684", - "ae0e573ff3ca2e73bd1595771ddd4fb2a7a30aee07f3aba07724d86afbcb0c3c", - "d3ee41f857bf72f50823642c06185f8e73561c2e5d996952046368baa44d4c0b", - "1313e4995e1b66953976230af565dbcf41c6676343cff239b8b5ce12de2cfbbb", - "d5a9a1bba6677883bf1f90f54b4285c8a53ef2339ff5049fa93777def8cd0301", - "960f904928bfef535913063abe8394575d42d5e336b6452752db69b5f93034a4", - "a7b815c5681535e008995a6df7bf1933ba5f54de0c038b6e5aa876688899d353", - "3ccfc06940f96c1d763939ff4d79c62c8192f1a3f7cadb3ddb28fe0b4eade8f6", - "fee8c7a5e09bc8b4b87ac3959e9b0f423d9c51c0971020fa46998f21cb3ddfb2", - "45e4abfb588376b3a7ba4702e810a46c94a13d67e151fae81ec0cee02f246c2c", - "fa620ba52afc6520f96d4eb32a0e289a50423ce40171f7d794aa40be03acd723", - "235a3f991ed27d7c709d19c0217f91a08c585c42e1c6055dff01098bf8f2c4d5", - "fd2418b74f4192b6809434cfd53dbe15f4a6ec6e26b2b70ad8250b2f24937b5d", - "f64218fdfa843a5e4ffc89722f113e7b1b694ea9e0a7f86c47c2015c8cea5cf2", - "b9de680e51510aac1a7a8160597d2b40fb8a2e254b8c7e20c9beac8bd0e1bd48", - "fd174df63e54259fdb7f1651f2db6b18cec7b80104f6dd10bcf8a6f0509b6b8f", - "c6b732643cc24d0386bb113ac1df217f8f919da520edf05b55d149f5663268da", - "8d759d8657108907ea017db232c8e25e0c44a4336ef02d49b85533555975748b", - "293013445412793da8e38fc305cfc77fab4b364e7e6135bbe0a54fffc4d247da", - "91dbf844de92c9f490471f16049ec931f94a236a9644a423245cb4945accadeb", - "30c5d1205f9ead9326858a3c989d25888ed6d6f4e2c699438c654c65293bac2b", - "b76525ce2a7e6b67bb82ad365f63f67cf4818cd324c195ca2bfa9617727f404d", - "773431c9b2850565dd2dc9268f75941002efa00acc4e7860119e2700af12dfac", - "1df60cd0af16fe980ac060b586648f916bb85f3975b78d482b1758a695e5c304", - "e5ff6f896219eb0c76aeda088d6d1677c12584e2d35e4c43a15e57d156b257a0", - "781def20335814dbea97eae9eb92ff65846a7cc38ab2adf52bd8630796dd84ac", - "1c32cc0815813208a5d1669eeb64cb711d757f59a287ae27dc34f11d7551c13e", - "53ed488bbfb03ed0dda805cbd5e94b01ea47ee87b7b30c5696a4ebc6e6786b0f", - "f59b6e57af225169966320842549c896593928dc042f6663f266b20c2da34afa", - "0066ff972b188484823aa687632abf701083b8cb134e4b049f8f54dbb1e900f5", - "66ea7490028218ae3f3aed0215d55f0d4d7c87426371366e0053118eab702458", - "1aebfb3ab0ac840ad8ca20b65b03bb1cf4e64eccb588f375a2249cb04bc523de", - "d7765c96bc53c54d3a6fea639612522d7c6b79afb09fc1b1bd2b62c1106676b3", - "a35a2fb52ae35cda05cb2ad9967e73f52741cf979766f07553d58595404a4f4f", - "14ec4ce05d4bc006017f17ffbbc6f75a2d68197932e3445deae8642c6ca8dffd", - "f209f3d689dc0daee8da91624be1e7829058a8b8deb9ae6f2806d7866d37b090", - "6ca2a6c2843a2152ae4b80fcea8e5775c8d4e77f3a600ea5302574eb725c8b3a", - "68953b3dbc6901a106835415eec5983e8dd1d6e76f8a2a500207fd508578e498", - "231e36c574f918b3ffcbc6a36da09b9d1aa6577038de7a535cfbfda01cbc1371", - "455dcf26ac7caf76ff50bc7931c7cc05f729c377e27067a2f9f02ac7a56dcc22", - "1dbf9a2d99f2f2b37898b94ad9224e6959577aeae5c5e6ec4a99d56e27755f84", - "f2cc46f2c7f2bdc7dd09198c128a88cb3d0bab4ce42108910ad7bf062afa68ae", - "c1a270f296d07400371731c63ecdca74f48bbd97cb414f8ee0fe15b2ffe404c3", - "70f0c53e507b50902cdc51fe5d08fdaad4170474a1d1976c502f6aca0f5ab1a5", - "239dc64e9e8d1d94d2a4c2800f686252c0eabefc342dc344bf0df936bc5a52ba", - "6f57187f6e0b062117df04aed6d866331da955013d0ef8b4eeae702608f0b92f", - "decb2b0f7f36e38672dab1a5fc162ec7e0f29320661caa5f92e9119ca9dba245", - "9797e4e55fcf3c0d2e205eeb984aa45060328b281628799ef0dc9902c929c1cf", - "229fe4953c1368ebcd0597486404b213d6de6657682300f1cbede363e2e14e19", - "36d1cb2bfbc2ac33e446b820140fc7dc499f37fcee14fbe602ce06a3a82b8a75", - "dee9ba892d0fd1eb6b5b8d43254076871723b2749483f8c26b825bb9d7e507da", - "ef860931a84f702cbee5db9fe025abf4dcbce7a753189df98457ec16a7684bde", - "e8ebbd87e2775c3ad2fb449472679edd8a8c5caec9a08102d655b8ee36b8a9cb", - "71d3336e796733057954e7a6f21d7e3fa30ecef46c05be2d57bb8f4369948338", - "e754ffe862c510fe65356dd1fa665adb1e5cdf72964d6da597cac84693f7ef53", - "6ae16ede3c44887f115af1ce19bb42ca3afd6519a395f66d8f50271d9928164f", - "314936ed319c36bfc75e6e7fc02a3d3176146aae3d6003fc23641627e8088932", - "1afbcce3ddfb0484e54b8ef9e605258b89c8206a6ca7b5fab534f1262bfd49b7", - "57d40cdf77fb18c5b8665546c8a50cb3c80de5436960067f88c430dba0ca1647", - "7cef62c7981400fbca1fe4a83e2c4f06391abd9530850ac96d3fb039e44bbba2", - "b69366aaae83e84276356593c7476d84909659ce74485a20ea7c345e323306d2", - "a1af1af575dd10959e7f3ec2e8339be509fb451954cb2a56536d4d9ae8327a8b", - "f28936794fe19bf99e3ef17a3641d2f61f6e1f30068eaf35207ab767ec6cd4fb", - "0f7471bad01b3718312e8c9f6faca0bcebc4dd1afae736562ec3b2509a732852", - "8ca858e87de93acb3ddac7f92ac31b93c4612a252f6f8bd5f5ae30f73580d92e", - "606a793b7c6e99251590f6f3095ebc2598310e5f51c121d18acb5a0e4c866911", - "74f35cca9d2ff230e40a258301d2f8ec45de9c649b42a041be1af8789a1dbbd6", - "efe971c5b719c84608d3f2185c195f414b4598e6a0256129fc1ebcb2cff157cb", - "f6c3e9f6a0762ee795244411b5d9e2ca6eb48e0788210311312875e91b609395", - "09af3530c14204be23f2944dd32f758efec1966d2fcabad7bcb56adba2f30f86", - "2d2fed035be259d89b72417d47b5301cd7f62149a29950c887d4357b2d3b3c09", - "784062ddcb5c5fdaaa56393def65cfae86526727da631b00371197d5663a5e79", - "057cdec4b426626d2a79f10d7a50bcab8269685b50fdbdb65c9a612a7dbd9b31", - "69efec09d235fd336b1de10f425bee2a3cb77f38881488bbf424a01af9aacb40", - "04abcc9ff963525f5d28ac9d3cf8ee84f9c340ce458d2e67aa01599439e789fd", - "9dbdf425e49d95bd56e6bf787cc400e7485a6467af3a92debf0d9454aebe9fbd", - "9beaff622bfdf61b3265563b6880f249c5c5e068d94790e4114537b628747a6d", - "1c130774994c102902e7750bab8920784c6d5875328be65f410b666153c2df61", - "f0111f89d87a28e3b32438cf22fca8fc88a7b601f26741d726243b9c74f41561", - "267027a570db5863960b573d1a4e8473e1822b078aaa7cefc1014ca830af95db", - "eb0bcfd70eaf68c1359ea3b38798d3271543fe24ae1ad31b6a28ec1f090340cb", - "52bd1b5c931b06cf68a31f54406b5907314e20805c7076837f52bafa56d2c494", - "4060952acae75e322416929d32e29601dd7555083b96cbb4fe5ddeafed618163", - "8554308d0dec06871e0a0d84a14886f6005336574211a126ee945ef7508755fb", - "fdc9bd522c50bc44bd95722e404256c36add9ba4a8be4011cabdd7b781aec824", - "666eb923c57d8c20b77cb7d22cd7624fbb5153e34d252c5c8c5b87f5b8cf6d22", - "6b6e8710f1c9c11abb6f992c71e89bff0f480e57973a405bb845b86d4ab3a734", - "c327200cbb46c36ee4f67ed134be76a9b37df3a3169af5245e5215df9fc431ac", - "d7743331428fe657e8a052f5cad9bfb884c5564a09735fa44af04754e0e9f609", - "c76c3472e0ed8d8a7fb7558c21c8ed31aa66670cc266936aca523afa3ea59142", - "866ca87298103ded7c019757b0717d7ced787aca80dce73311de17ad8edc4cdd", - "b2ee43a8ec4edd6c7f4fb569a4c37430ba7ea65de2ecb626d3efa6c347433fa9", - "ac871889d8857af1a96580bda5d690d85ed77e563e40b61fef3e3bcfbb01712b", - "f34ff83e8d751a01beeeef98e47fcad1c8b2d6f510529a03536ef12281fe306e", - "9c89fa63771f0fc3b0b8d0b4251ab0e21e95b6b1e40d8581b76ca5bf0f2090ac", - "b31e39920672f4cbefede5c4ac4df3180f07d59fcc43e5b2d91ed68bae33daea", - "546db0294d48d3bda81a474ff67db013383a560c0cc23c532b6c9944aca1f78c", - "6f76c6f4100ffdf6036469db53cd9cddc3e78d8d206286bd064977cded08501c", - "baaaa99a13bb235c2bf26082edff8db45b014fd8ebbacbf18219466115a49a44", - "9d8f6fc72ac92134d2dc00295d1093e2f680ee5d19e8d2b22fdd1a5e9ffd1cca", - "0fc7c46b2f3b8f456c9c356872d9b315495ede91c43611284d07e2aa26dfa3e9", - "78f819744d62ddf402c71ad693011bf7b223189a1d32047137e0abceba4a53de", - "f17840145e0d475bf493c2318db5637cd3e412a2b0d5c53c46718c9603ed9fa6", - "fe3b5fb20c165bd0915b35aef3790ed235939999f4c8d431a521878799563b9a", - "06fc2dd2d74ef179641fe717a30a8056ced109189cc1af80c57e56071d721aef", - "98decd50b902bcdd8e9a802295c5a25f0554721777002bc67a2619c128bf1a4d", - "8c9b374dee133ee9549afe4b881b5412c875b7e30deebc1cffd77028f5a179f4", - "c9ce81a19632c166c781f243464205030736790c4752d8a4ae05e485519564fd", - "6430bb785d3d7359abb21670c4bfa45530eb4e9be362d9cec8506f7380a2ff98", - "43c5b7c242f7bfbb842a8bda395f64cd89f2712a496bc9cb33b2613c62216d06", - "c538c265ba265449c315d256b815920697fc18ca17007b40d9fce2c8b6049939", - "3d14b14f5f4dec4bc72010b3ca86a8d72a0b98c76c80c2a560542bf5fe786528", - "0d4bd00ae4563ff1a31028f93245570c808f07de0a19123c7f0f64520e7d99fb", - "bbcbb44d157f53aff3d4a1507904eae22687d445d3346a978a97dd6ad6163e63", - "35552f13a8b222a68df8fbee9136920fc92482c8c26c1c92b9df2930842d2c31", - "d6dee563398da3ee948d7651bc912a4518f35b3ab6f9fcc383702c063879e45f", - "61fde95eb36528d59b6a2e198244bae7a6d922de1b1cc5429368903f0d353539", - "127868f029f8e0e2d672ff26621dadb5a04458c7b51b94f7da343f1f2ef805bc", - "4c8e724a4b91000c0ee70a7fb463a0f50f6e42a9f452a264f5e956da56d73159", - "1449d7afc24196c3286d222a0592a3e10ffd673478dd43f62058200da4e25494", - "4ed603911c1789c013ebf0769384cf9c6742ada7436f7165b47ab0c1bba1f2c3", - "cb43ce21652bb956477884cc6a28fc831d89ef4290105c453108930fb2444e1c", - "59630be56938adb095fba25b745d1b2c0240d17123441eb735d03628de529b82", - "6d60bff2d02acc4e81fbe8cf625af54f9ac13192b8de7bff3d66dffa603663cd", - "382a83b321696904b5d353ed599764e49f621a148d84ee4b5d33fb0866402730", - "ac7b9a5e9540fe47a913290885577de6b09e9aac705ffeb54b2d0b7d52144001", - "38b1a762a873ace6618b504d5b5580d70534cd29561a62318492a9413e0e822c", - "9e30a524c6d364bdbbc1fc4fbb76cb881e64c88a3c3f8f8b98702eef9c3958b3", - "79a1865f8cd2f928caf1fc0e35b15fd724b9f00907a5d41d80258442f8b319ca", - "9dfae73e0dd14ff9c051d7174bc7bc198f9386a4ae21d1ddd2cf7505819c2bfc", - "ceade716127239cd683d3a3a6bc78c601c7e7f4e4e1842d294c10f1b38f84d99", - "fe56b6560d561db98b9ca98c8aa5c9484ceefb4d7ab85b1f400145b365fe4187", - "5ff6e608dbdc1691b3cd38cd9a1b2bd6ab9f73402cdd20f13a05fad19ae9b2a5", - "dc1c5704ef7a342d664254b8c881c32dd061e6152f7d54dedd784f237ff95c11", - "b55f2d305e1a6f53aedbdfbe64ecb611fdfb220ca998c9aa0d906a5f66d98e92", - "d689789ca5eb32f467ffbdbd36eaad536ffc77701c9267a9c52dd3b95b28f225", - "d842fee04294ae236c668e9cce9edd46b87957f2e2279f6886c58df683bdbe40", - "6790502e3626ba690e8f669bf04af69191fa7629820be60eeb28678c6230fdf1", - "578b761805f202fce2630b10625136adb1acf751252e755aec71b5f9b28219b2", - "436d46a3e33d0155593c6d5c3f46a199a90549ecb7fe8564538d5a493e475351", - "b9d94b042ec3cc4db5d560fdc27ccd7900ff332935313c155eb3f695c237eee1", - "28ad7a8113a566a94dda55bc4ab012e6c1f1d10098ed320208a8f81620458eed", - "35635fe07d40d9267e90887dc3cc4cb152a73f11453942c73245d86274e2863a", - "f75cb32478de5fccf0a7bab252081f12fec3c5cf5f409480f40287da4c12b110", - "11387f221422a94bdf2051199d413d1a2412575e8b68a307cdbcc3666075c95b", - "73f9625009b16a5d47df9b8188ff0aa075e232168965468192cce6624382c48d", - "ecc45b532759698cc84abbbc2aca862167fb1e44a5e122e3ce5e9e1609b69bf1", - "017309d6f660db8d1e4c208c4852a7083b068715f2e9af3bc126f468ba7d230f", - "b739666c84175505d0783bdde8c42e7c3e85d2bd2aeaeb9eec49e16458a5395f", - "fe8219c7ff2bddd59d4453c7830bb92f2c9c8901dc9bbfaab51908a42f178d00", - "509739d3434cd9ffb9306f425cd91e07f50cbb5b727209beab081e9af5618f6b", - "5e1bb7b6218b641ad6d989ab7c9cc1211ca659f8d3edf28d9f7eefcf447c298f", - "e3f1abceddd8aa3bdab13ee8c04e1c559980d49be3f0ec4d04ae71ded53c7370", - "62bcde71f648c8cf49677ed181fd80c598e42f1ea5433b4eda96108b74c0388c", - "bcc2167298b64c8ddf2e398999729249e297ede1a0712f28ecea29010ad0e3f4", - "98d7568d08d0b7f74de23dd0dea6aab728ff1fe9592e2e2a3384e0772b128d80", - "c6fef00ad51980351058c90ee9b622ae0459a8dbf954d86b98e405033b9f4d80", - "e16409a683edb429ebdc7946bf8c69241ebab2189abc43f050a0e6faa5e6a15f", - "f6eb348e693249bd8c88c45348e29216ee75ff6aa0fa1cbdcd50e81737de2faa", - "53ac123661490604cfc9e1365f0e4143cc18b574e3731a3d170c71b5dfb84065", - "ddff628fc0d564a36c073dd743afd00e869ced0e09888ac22cabe7cf51eb7d63", - "baa5b82e8836dd00b75b837a59778684e2f4a7c949509fbc6e4a30ef81376599", - "3a1b88bc94483eed678217c0320b5246a64890c2a3db6fa71c2a4acfe9f28f45", - "3dfe8057604963c25f94636c68fd37b96e448f30f9f61668c42f480b49891d8f", - "17b6adf2e7f8b632e37ca5a8fe6105a53210d4c44f2da50df1ec3f7a838ad80f", - "32bba173bd9e59b11b83c6bdef71aabe550a8a8369fdfe52148b710190c44718", - "e05df1e2e34bb59bd8a3411acac0450aefc24c4518e11a22e93bad431945fd63", - "82dbd7e9dee3ef84f63b5d883cde341a64312a3e00f253e183eb30876f3bcb0b", - "7b6a760a17275d812fc9494acf69abedb15f28aa3c698e88313c573fa912683b", - "c706b55da57c6714bfd224e67334efbc8bba14a6062432a50b550da772ccc2c9", - "a98ce1504cac4bfa77a5cdbe3fb70c68ade824c4ca3e34bd536145e91205d3be", - "e211edd0f463da4d3d731bcbf8966f0781dc6b15ba52699c9ddb6f9cbecde40f", - "bd7874729e72ab4bf389cefe0aa66368a9185f3382cb07443e0de31cfe87d928", - "a7e5470ef97706ea3468144be9d800ad26e6264ef744fe3cdf0ea5ea1a2f341c", - "ac6f5e8e18ff41fd17b78bea7de49955600a59f598dd8e40fa6f25bf1a179fe1", - "26476483c945bb81789b6e426160129d90797618056a7934aaea343d410c9ad5", - "1f86f6b5ef2e3c2301a8e11d052004057ddbfca61e3df2e55ebad83a8bd475a3", - "003dc5ff53d3fe4050ad85aa1c90e555baf3ecb5127240a6357d8e2f6a85eff9", - "756575cd5a86dca6c8ea805650a295c4cf724e3a78327e63f63f5a8abca982bb", - "3845fc8e0225522f1c54ae8e0ad53c7cba90b2c473a08ab74dfd6573739b759e", - "4700c19b027f92528a8da4d578056d17896f123de30e72585ae5567946873c1a", - "a84ce4df7c8eb191b1977606e9e950cb6a4dc63e68277a9359effeb7f5c1f9c5", - "49a9e50ec1b64d803824a694b38deba759d378ee3ad37242250d34da78123d25", - "92953bd6cf79d80a67dd4e86000bbb8a2e05aa812622079d9e20587aaa098761", - "0930103ba4eb5e70af3e5cf8a08084f9234cb536370fe01058b7227fc7d402da", - "ae293aac62147740bd4e1ef3de1c1d0c8bc694ba20a0bd8e53b5bd6eae06ca96", - "a973ab05bfb890e2af57f83aca93040e8121f6a7202318d30516e34586ea54ae", - "7c2dd2836b9c54cf0f848074aee536615fc02b16765ae4fb6f10fbd2d01df5c7", - "14407be97d8361b4899166d441a858429b39ecaa0edcc74f5081344901e2109c", - "aa615a22b7f5cefd94f35e51363b0327740a9ce4d7a141f0f6842aa2a7840140", - "af5d4b096a7b0dc2fea3237d821389eb69ab18abdeb5eff49b4e999a06f0a194", - "acfb12b1f35711451885da5f1921298c65958fdb68dedb1b848b10bc2ca05ca5", - "e0670601ce5ee3bb5b7e937b846252b9e3bc4011c4fef50d12a752fa8f860bda", - "f89207ea5a629fec099ec57b444e69be451f94afa15bd354542bb011a6dffbd8", - "61e413000d5f949e9ea365f6b6c23c1f2a256887f5ea11bd1b697d5ac34ab822", - "4b566d6c500430ef64cd0f638d43b08cdb5be07ff6474af8c9e6cfe459720f95", - "c3cdddcef57ca9fca1b64358880d3fe4290a5cda9bc0170b82ad955654c55d9e", - "f40e048c8cebe8c158fd4515ddd5317e003094b75f6bacb4ddd0f1c7652b258e", - "9c557ca0aa46ba5ef9f11bfaa73ab59cab8b4b92cde918fe02f9602efedab315", - "de658be95a9eb5b916e228011cbc9eb7ae3637a938960c3e96f19e2d793e1460", - "31aa4d208b66773c6dd89b6f36c4056108a0b372bc6fe4b3e15ef0907ebd0a2b", - "21b70a1e8bb2ff05a3eb20a7ae9997445693e610af07543da328af82b1919e8a", - "5b801f1b309f18c78b6184e2f64b87cfc2cc0f5bee01df6763d4de01c54e5151", - "8577fa23a0f11e17dce9b3292b194099bc30b54f30ddd47c41a8244a9f9d747b", - "e2f7b9101d1d9e64e923cf29fc930b1bf0047e205940b514f8c54bd30275fbde", - "5b0b7a869ce33b8824965180a28da364b1b473a079a4967633f1d393ec30eb08", - "db8f1ec3aff752f10778a38a78e0f95045b3d778499795e624e9bcd42ccdfdec", - "7d7c853582cad144a541fbd0591c97fae6ac4b91e31a6fd93a886def3b70d1c8", - "ebdfd83071b6dd59a797a66659a923155427b178a6f4ee1c320b618e6761a8f3", - "cf5aaf27d42dead1b9554b2a4afdfe5d130e0278fcff16a5d5b90d7abd41e429", - "901a6c4b6e0292cabfc04cde66f9bf69e7be2a977298bbd3bb577739f9d78396", - "60f561190ca8301e29060be3ccce0f18ef79dc9fccb1c36bad33a33f54c4e038", - "f0b6b484361c89726643cd5efc1c668337c3c85d63613559505b7c526337b515", - "5d14dcfec0ec997671c7c607a6be9ef6cf1e3c82466f36201a980d6202bd71c6", - "27d26e6e136c853536d52c0cd2caed1008db8549a8cc6ee2aefa856d44e400d1", - "b2ffb55a9e44698a7ab24380dc3a2fd2fa18bb8ed458270ab2ba0bdf8b3fca02", - "83214a53b3dc47c91ec1ec05313f7239bf1c4756c2b26e58f556ff3c83241190", - "7e9f03d0a03a53c1a6e29e17cd61931273f9bf7f49ab61bb73d108d063867165", - "592c4ffeffad237785963c38eacf5daa5b9f58af605de5fb3c4ce5380c07ae0b", - "0815b41183ce70aa526a6d94e8c819860cc128898a02164c6c1e2380d048994e", - "9b9f8e1bb728c3d80b8e698ad00935d48062744a96f0849abd6b852d8800dac2", - "863f8384e27b36eec2f4d2e45436c84820b7828fb505d1eea23b5ed378feb32c", - "4836efce29ffb7b866af553d31334ba398be2e4dffa88064e8d06370c5bc8365", - "1a03f37530db5bb0d1eeec90cc4157101ebe0b9db7de6a062489c3d8e7cafad2", - "648a14e1add715b69070e9ca9d259feb0e6b704fc6c2af228c35a2336b771708", - "fe7a93b58e62c6d7d58190c15ca47f2ca93602d67b4e824853511cd689d37c5f", - "9cf113291b62873262483a82e28343cdb1efd8c9194b624caf845a0868e26039", - "9343c844172531be92f01807deae7b12c1cfe29fbdd9b4ea692d8023ac8e290f", - "2c2fe121ed60d97d4e9abbf7f224bc91ab66e201e0fcfc5e99456492106862c7", - "9cb1ae0c48573c7a326fd9c26fe85ec71d29e76e33b4ee4e416cf0aab5f2f312", - "24ca6fb17d55e4f07d2de0f8ea7039bbc9c0b984206ae8c4edbbbc96d59cedde", - "458a48c4434f043cfd639a66c2a4a9c2b97ed456af37bc264f94adbf7ef744cd", - "57aefeacd4a10123c85e02bc0fd4bb5732a2432b6a64f7113e46cb2f4b1b0525", - "68ec8d507460957e5173e52cbb91d1de8481ee537625d1e170da5954b5c9b257", - "2ef8942b6f3dd8690e8c572f3cc4539c7ab6954e22d04e4c82c57e3fc78f03ce", - "36e9776a358bf0591adedbc1fca63d88dab8960f3147f31a3a865fbdae16677f", - "7e354f550864746484541ed7d416da9bd0e0b47421962468e9bf9f7b35c0b496", - "58b9b9d883eb7cbadb24f576e8a515ac05677be01c6656779fad9e21b9c4f93d", - "f0109bbb70c0894ae9d374e2833785712549df8492e4556404da8256e5b650d3", - "0968617df9edfeac0ec4882b4a07d9e4ae27c98cb61f77376b6f5f8a7dcfdfab", - "3571d8e1d301034a1e8a737dc19d33b909b3160c436834fb4f18321e1ba0a41b", - "df721d66a3e0db0d59ec56331d8cc6fffbf257666436f6d0b63e96acaa6993ab", - "0c4ac8eec51579d95f832623f9d0449617417a66c8ea2eb6823a6680b08292be", - "66504e0eee689f87d8dcfb00fe294b8e67861c758a8b26da9cb0643e177500c0", - "265a86c7abb4bf626678df1b7fd80ff44857e5acecb738390be73883ff9d5f1b", - "b605dc164f65aa40d32a5a8dfd9dc86a88c3ce96130f41ab10f090c9539eccf1", - "f19f2b706df6ee554362a3148daead1debe98c87bb26beaeb679f3fa2ae76f2a", - "d9a4cb1db3ad9556e1c2604df0bd466844f608098c55136210945e67b038ed29", - "5f565915f430fe390f6c275bd460f5be679a9414d8cbdb66e9a6ee6eb5df3070", - "f5c9b2e1126d5b80668c82d5e04453b27337c1fe5e583128aa8d631f265d6339", - "1502e1d8f82234d8041ae27e7289dadb9cbdf31126aa47df4c263b48db2349a3", - "b3d8c35d7d488afa7dae0b57912340a471006f998a5921001c6437dde72e57af", - "ac078343763682e1730b9411a89fcde0128babf297dd69a0b3a642b597bb513f", - "6553cf05a00c70c34605cb97221ade02bf7ed9671478c919f3b0d05e2963396f", - "b9986af6454a97e61bd5d5c3442afcf3a4d84c45e706391c3354a80abfe79ad5", - "5dbefbed4ca39b09c60f80996ee80adf1fd13bd157ef1c7b555ce56328695bd4", - "3f7c801df335e0babee06e09935b11a57a6cf69e535dfd3e7d27e48bc39d2441", - "5c322adaa0935a05d91eff56a8cd732686328ef3708825c14c1b17cf6f5b08f7", - "5d588eb04bec7307dae7eb4806fa6a7f7552a634cb94e85333c14416a7e5e9c6", - "79069468c44a3f016b95444beacae25b0b9737f9bea9af6770fa942f0941f34c", - "c38bccfeaeb0d421cc4da7274b85d30b9f4b3c88ea3a77dde9b7dc34188eb06d", - "22da17b97cd2f9ded32c5e2ad09e76e343de026fd45767fa09e739d08672e8cc", - "22e21daba3538199ca077fb4932cfb87896162452a94ffe91d2ad3bb858e2013", - "f8259247f7370d31375440ebc2e50ac95a17474f7575295b80241569b821610e", - "9b16d7d38c0c5e85054d2ab8cfd87b870de1e77217c893f8fcf2fd98d5c0bc65", - "e1bd5a639e32df8414ffdbf0f1127073912d910f1d6196ed331487fa4a9ce7a8", - "5c4a8d7c0168c92e480b35930ec60a174d29d23c6d459a35641bf93fa9c108c0", - "ce9b0ff2238c6e99ddb2f2bd8a29e5b997fbcbe4fcf59754d3aac240d806b493", - "eb81e6bc04dd11a9bedf04ad4a167a66b3808d9bdfcc37e59f7fd191aef7314a", - "ce5de460deafa159d48b6166622f81ef64368a6f9ccf6c850b281bed2da86032", - "bbcf38f13c72b54cdb17fc2b07676eca895d76439251f17e3f1190d181d08d4e", - "70f847c5d7164fe1bb12aa21518bda79ea5922a99ec87c0225c09531c660584c", - "5b3d255f7506c143df4e45443813d424cd661c152c4dff45ae52eb00977d142b", - "45fd5d64e7a61c0e4f345b8d84c1d3d7c35c6136faf7298bc5615a7eed9ba0ac", - "4197167c648333e54561cc32bcbc19b27b3f83c8db1bf2d07a9757bd5570e6f2", - "c103cc4536bb08d4b382829782ffdb0a7125eb24e86539752517e8d6efcf153b", - "124b0770a50429b5870ed2507e72960f024914a64b97a5b5998bd25f34226ec0", - "158524b1b659702dc52e7dccbef0393755d1026918021b97dfc9e89a14b89efe", - "405a965713c4c1c1fcff82b68b773c1d31b15293250b068ed40ab557be658337", - "f7192cfc66d11dec09e5085e9af78f9e41115513bc6e0d264ebb736dd939008e", - "41039c536c201079b667acf6a3402e0764af4686f3dc39b4885be07e80881e98", - "93faf91ea65bbfe43947242ae836c6f17ab99876c0d53a455cc4d2aad76106c2", - "2d4da410c94f1f1776b9379e12a3caba8dd83635e0d6a8c4d9992b081f6a9d97", - "3419df63148e49e70cfa659d222de3ca882298373669899f6a8cee8e19f2ace3", - "d5b4f3373851c0562068059251d5dd2b4cea4db85f8d879f50f19f6e4c5b15d8", - "b96e263da2db5f2f284d79d6d380752b612451ff9329ff1d978e96b2a77321e1", - "e466abf5324d9a513a1393d0a8f20d5d83d4a239cf7a14e8e5d81518c20591c7", - "b1b127bf6635f110a7debadc127fdc1f7be3466c388931d11d05bc54c4759794", - "229904ca630236c01914118f1998f58e611bb7e5dac0970bc38164f1dc4dac43", - "e468cde3c27327c0d7ebd7ffe8140830c6ee3c2c8f5e9587db9d0baf8ea1e9ef", - "42803847ba90343527139c2c8c0d19359615cc0a224310a379847dd5fd88dea5", - "e6df90957ec7ff09e3ef205f96cd67239c6e832068aeb6697d5b4331e45d648c", - "3cd2d8b050cf0051c32622aba43960f2de0240e9e6872e101749875831f7347f", - "1ce01118779f513d3a73bf2ca8255c0ccad701cbad412fc3be229fdf42de4c43", - "3237312acf4274a178f0e4153958086e3d333be8e52bdb92acd5e0089cecdc74", - "bf7c06ab5b18cd43345917aa7aa21bae992945da2a91bbd2efcdbec217338758", - "8e76b9ac6d48ed9d27b0c8a523972d683d1e9b7740885e4a2eb6af0fae7bd500", - "750c806aa13979ecb55e576401e42764c9bf6a9e8f89278cd8ab4542303a67c0", - "9aae1a5195c525e993cf71048f2e315269e81310328969937dbb6d0dfa9bdb2f", - "5676dcac15c4b579b80b0814d823b3dad4473b73307f25530ee4b539e9faa08c", - "d62cc2857e1667d728dbf8617da8228aeda336270dd59db71f92a9516a544261", - "bfee2b9dee0fec6235d57fbd3cd2c30b5306356b6f499656bbe19308f1ed7209", - "7232136c6b53ebc71e99e476a619c7a90acda8958aa5b040c039f2fdb67985bc", - "f958846b1ee4431adf2c43139b4790c27499b2e9b2e980ffd31c0f3661b71385", - "743f4c2c4a196683b971cbd3ef6ae430bb9ebbcea4982357c9e6d4596f29f963", - "fcc82fe2e6b70ecf001f4413ecf3c84f267346cccebf44be25814ff42d45ff42", - "c1f3d3fbadedf2765656cb1b53273d2e478e23b0dcfd83f400fbd74aa566e58d", - "6b2995f1528cbc68ad01506f8fe6bd041f5abec0ecce4f361331efa19249f702", - "0a1e70563ffa5c34909c38c0fbe7bea98d51ac73f3427cd42539b495f70209f8", - "3dc1354fafbc24f28c942c75c3707fbe1e043ac0389bd1bdc5692d6d2e1c0acf", - "b151d967acc8ece63637cf46c7048024baae32e162d1a857e68f9b8c921ba32b", - "2caab4c2faff1ef6ede198c7e209d60144783dc84eaa9595176f818d4e609982", - "c8d87eb0eb191951e84c2d009da11f4109c92c3f58f165dfd7518945593fbe08", - "2c8b7ff666ee9186323cdad24219b7db152a2c464a340c5dd25400aa0fc690d6", - "f508dd26642b897eac823f89605021da127aa6d2d52a8df9424fb84fe40e0a6f", - "1dc066912d0474cd6f2a8b3f157210324b5b0207c0c1e3bf60d4aac2f4e6bc1c", - "0228628e0d0673c2f3f4899273576f3da8699693b9c47b85fc0635e5ea0a4fa6", - "1739dce99e40b4c1be4fd44f4a9ae0f83567e10bd77971f848ce34fd93f2c6e4", - "69928d665eeb47431b333c0f735a4ec6c43c2997f1ac8b145bc71666d2c11f51", - "daaa1331fc8deadb95625dd01da5ee662d7a7b0c2ad17f5f60a6fd0d3553dc75", - "c4c09b9adc1006d3aa947a3a8dd4f209ec9551165b874d5b93985ef77295e848", - "e4cfe8f929d0222548f28b40b3959da7c63c3043fc2492323067e29e0b98417f", - "b0a92573581f8692fe3ebeba1fd889b133f34ab8b78585d44eea6ceb3b9809b6", - "3d2311051b363f56bfb2fbf318544c9e4593f48a6659291255c00bee55ec24ba", - "1926fca2ad41d0f64879166d659246d78877dc8e3faaad46b56c2ba0321ad250", - "933acbeaba7dd230d206a5e39f9326c19bec1ffb4d2ac079e8d645d396d280b6", - "c0665cff6859a74e0f7520c3922c61059b4e81ba00671ba51cab720949b053cb", - "9b9e4266376d1f8a2f14fcadc6863c0ea27fbce97879e4b7bed1ae3ffe85b045", - "208787c21cf6ece42f231c3dcdc1581a5caf1eb027eee38596c15a51f48ce8a4", - "0ebac1b94bb4a09ab3b1a0ba05f44400da1b0dbdd02ba33b8c925c501e6964a1", - "c66aa8c2500e83913ade60c9f18b71dd153d92c678fed96df983b4abb4424d60", - "816dfe171eb983551a3ea6393b9f381999c77701468d7dacb7f08ed1efcee5aa", - "977c2503cb323cd56410b4be4c0f3b10593aafad5e54a62e02a66c322f5e8aac", - "7f5f26a32d9e1bbe10f71d3d0344398ffe593660405b6220c690173e6a7a2bf1", - "9e0d03e261ead5ad40e30219de3a2a536994615b7b91f6c8b83affb6395be111", - "ad6e14d083d2d5cbf1ba5549a6b18b4a1b12b5b3c962503e492b14735fc3ee1d", - "5f875189298f8fe8677bf051f18e4a7b1e55d5c3119768c0479190638510af33", - "122a7277f229e6a484ac4f284dae76573929f09a202ce0b54702ce41fd911593", - "fa9353da8d83ba226050c5affdcdc150f06918a62813164e49a014bdfca4ce16", - "c80c5ec8841ea4fe6434f2e1bff5965607acdca82d4972ad34160554ab218db8", - "49ad47d39b36e7b19f00fee1655ac46ad199c93677180fa79ee674f98266b3b0", - "57553267d0d6e328bcff5acfb7f2cd5f988a3c2b27afd37bd0f9474c4b2b27f8", - "590c250a5851450ed5f9c499f6531f0879811d3d37861509e92703dcb2333bf6", - "a20fb9df2dc9c16dc8fb59df9c23c108ac52c620d296c122b5086c8c47cfea4a", - "d53bedf8ef5a46dfa52c8b6c25fb99daf65dcd671c9e5216f29f8ee7cbf4ab60", - "df2b77a1c4985a10ab62b04d83cfc4f360904ca96c9453f2ac7b01b2aae64a98", - "4eb4bd76811b7a5e7d399fa62738285fc7b97136577354501c63ed2ca5470489", - "36f58f7d4b5d4a7edbc092edb2e418db5f94aadc4501a125a97f88902778c3a9", - "1cdcc014655846586af0af60b54e54109a7d7063cfcd4454478f61585cba7a9a", - "585f211e1b77b7053f80b4d01abc3a3a8dd7477933fa6223301ef71ee114ba3f", - "991219e4cf1c796b024c08c4cf73691a1bd25a66e6e3ff774d3a418e0338e217", - "70d6f471fe9cb4a7e4aea05940d658fcb59b1c6a736bf4516502f1953e88ac7e", - "ef4f7108bc04881456c4f35c9b03d834f58cf0e5edb21fb79b2199a4c8532fc3", - "8d6294ff2e7e7a6c820568b4b6647224dd98b3bf59cb3f757f167e8bba298eba", - "dd786dcf4e69b027c0f2808f6083c194c748a252087a1fcd0cb5beee4f59af54", - "a7b300e88706923d4b6f84d401b8eacf6895971acf3b148a94bae035615dd699", - "f554f8d987736bd3c0e414995619b4ccc814ef7af58f2cc665b315a9390459b3", - "6bdfa6d2c18c7e69d3cde6dcdf8ce7d75158fb89d6217947c5a7d5913d820b13", - "8b4b17a1cc88302830b29a1d82e762f01f1c46ead44cde29519ed0987921ffb7", - "8360468487cd405332389721b7d986c25e075f702248d8be35dc079ac6fb55bb", - "9f5483e1358b2d7ed7cef3f92fdd0da69156ad21ccb4859aeade594d56903e81", - "879224d78072853877370314c843337c59709c8d8a713805f05a767039aa1058", - "ac22b832a30134e354195182b9fd7c6592975e491d87a88d5912219d8905b751", - "851a079ab1c90de8637f2811121632fe6f59b5876019290bc3059c47e29c166d", - "48b8bcdc8a7a939b5b9321454ac44b69990e156e81815c2a2ba3a1517372e933", - "2e7ce79ea1dc74edf9353cc87c1a0af36e210d83c2adb1fc031fd0d9135007cf", - "196a185b9be0b607bdfa46f276c636a0e5fa8f9d20577fb6db34735da56d5cc6", - "6057d0b21210b3284a49f378bbaa0cc4885ef76f3c5771db8431fd3968a6c131", - "749521895b404e80ffbb5e9ad5a47e737d1219d7ef90732076c72804dd73d549", - "e2801a62724fb47aaa8db279f9c641fad5bfdad512542b8569a03a75ed3e62bf", - "12c571a3f2ae84a3c92c8e0bee0a2ad71ad053cce82f249f78ae9f2818d8e225", - "a1fdd7ae00d5e752e8fb29666e32a9d8faa28ee33691cd60d84ac7a81a72ee8a", - "447195df8a4d8d48767dadbe53a2ce301563b481ea03dcfc3d30f6fbeaabd89c", - "679c3e9321fc0dd94694d21d316ab9f2847703d73705ebd66c4dcf631c4c1b2f", - "7fd6813bf41a4d180b9fb919bd9a28903d4bdbe17afedf0c7b8c43c89114ebd5", - "cdf53cf190775bb13ad1bea133167bc2161951bb1e0f9f922cc3b6c93f90dd33", - "d501b53ff52ada24020ef528f1530584658974110f5f838ba1b8a20a6a25f5bd", - "107a5c86f5ef3c1ffec6148a522536c31f58d461798615be5096af633f0d2b73", - "e3afeb155b27d878748e4f02e2db709bf6f1493cd5967f2a7ad09664beeaa5dc", - "aa4596d7d6849784d09415abe40761503c0e75869d2697db4b092442143cc67e", - "c110a14aa0e5df48c5992604451f92d5b5f01c298e814323bc7a268e2843a571", - "ac89ea7db66b74b816b3a35d85c7619ead952080c41d20e8b76abb4821d00b22", - "aa11bee5db8e893b6000994bf325b6cf2198fd6a1fa22f102b95537da8c789f3", - "eb94dc35d68c905da67c4e328153b1d5a0f99e6f8575eaf3ad41c7af318c5b9f", - "0fbc0e21e87bbc8e7f18a2f6e1bdb3fa1f044b926f491222e514d080069e180c", - "3bb35ba64940825d806d2b01786916c82bb4889c2f329752e906f63aca395642", - "abfb67d9a3c23a2bba1790e0ded579b62b38897e3eafd43eecf222b67f078ee1", - "8ded78914a0fe78d5cf6bf26f9a52131fd43291d87a55bfd7504cbe4df869b57", - "1bdc35e4c7e17f56bc66d2a82f3d2767279720c5bcafbcb47575217ecee5cf56", - "2f45ba99fea51cfdc8da62e65817312483b0e0c695d5f99c2656650e0a8b4360", - "0f780fbd44bbf0b3150397997cba363a392aa80a143159e5f279b5a5db52cde5", - "497a30164c5608ccd738111500bfb2d11646d479c8803c78a766634767acb0b5", - "b4a11e3f0ce7607dcd8a1577be4bf0259e9d10b8a169b9950dd343913fb40d66", - "56b9530a151aff2553649277adf35b512fd151a49770017d2065a8d53c4cb5a6", - "9271c308df76df205b655bf209982766168c8022d6b5b6aa57a3ad1788fd0c3b", - "26bc9aa881751bd1768d0f23a38906165e9dc8812f0878991a6f6a37660014f5", - "3b59b396620f45e1e26cec500ce2f1edf3eec5b85541b9f6ae45b227f93258f2", - "9b6d9b754e1cf54dd83eb2f6ddec1afef2cd89a096b05dc24cdc8dad2933705b", - "c007026a38b6e678048164bcc295d15000ede114c6fa8aa66947072b3cb30a38", - "bd87abaa9d98fe25b9d6482f2ffa33651a1ea9f1b2006b35cd98ac446eadd1e3", - "ce80ce0e1259a323985cae987c7fe9acc2a1917a3369ed475b9c933c1b8e99b0", - "54dbe722a817fb1b828e886e97017a799198f83a67d892b21c835f4d78c16a7a", - "26adb998bd9b2374712596a0fa4f42b9a6ff5392c3889a73cc68063ee2467587", - "1c1c8b0eb34dc1dca3ed161bd2de3e30a1335a2a47ffa55440187776e0b46ac5", - "f6a6c2951bd7d1a281467b297eb1174935260b111b154a1fd5ab0419ec1e182b", - "c0ff43230f2b92301440d8f045597df8ac87cd1b466510e6479e5f96d4def38f", - "78b95258a61fddb9e117832fcbb7a32f58c2d7631b2e05ba630ee3080b9a9eba", - "3e4799ee0d7f08b8fb7adb00a84597b9aa85d9e173c3469df1e73445543cb2ef", - "1fd2b1658c6b7be4df7f7166d7330965e15f9db8d94719840422583be032cbc1", - "fca9cc96247b7a35b2f6480b648affd11c5e21d0f2acf902b19cb7021b9ad67b", - "3d68ad289db093f658f31ef5ea1f1c97555c8e0aa393a6167d116f7f5c4bf546", - "bf9df51a6347e4f515933c2bd1e5ffe27d7a984cf894aee0e450c9b8fe079d42", - "a945a679600c54142e88d068bf189345e2a23e2a3ef2cd3b2511af304b65c42d", - "69194b54bdf7554176b64a4597d29714d85f273e351cb5e7da3635d58bb9af47", - "fbe3b94cd5707f6e66b48f6f47c086be7c2dc26d0e37af4282e7dff061aabf1e", - "bcbd40939e5c1394ebf6252710e7e9c6b01c95cc9b5b80d83310724c7f3199e2", - "f26c9b140d00c9318ffc2bc1ccaa6d7bcfa3d0a89baa357f297878eb0e570ea3", - "756ad04c57ada3681035b39cb71bc02003fe4756d1e9778a586875c7bf75f834", - "64e021bff7c7eaa2cf12ce168b63bdc1b9d773d9f7e18b9bb5b8ee613db9141c", - "a3f019d18760a561e09b6cf92edea1d9149d926c44c63e61bb454366a038be9b", - "b52ca2e6a0b1b9bdeb529da7e9433313f438419291e00e163124ac7a3d0d3eab", - "296dbef5511deea5c5c66abf653a543a29c75629cfc3f9108167122d0ed2326d", - "8c04f58454b9e6df0d99f91c86a076a6270f915e63de8808fc14a14f26083d8c", - "31ad9a329fd729aecda97a7b9243268c847f26af18685227bb360497e9e57ce0", - "e00c54ea16549eadff6917b1525791a92719378868c13b3de8fd3d6633226825", - "499b477e8cc5e70e36d91bceaf7b27febb0517ef450ca3762473f807e374c63c", - "136539366ac39dca86a03439346ecc51d277880ceb4af2cd79a8581ddc6ab9cc", - "2b14f505f33a9bce6556278857e74346b7a22b0d69069d5c5274c23e6cc6dca5", - "19244f474b33a80dda41554d664a6391b6368849da4660b09a544f6971fc587b", - "d7b475d308ecff6d82739ecdc1997f6056a2cf04526d6debe574e3508f30509f", - "10024b1d2035f2c7dd53d44878859f42f0ba54f4ce95b018a20fe1c9b862e187", - "9b6b1887fb626bb0d517232d2dd9b61efa253f7f400ed4b93f3ea5990075f415", - "83ec5e43efdb1bb0f566db6334aeb8bc23977f2c0b3bc896cd53dc5d285dcf55", - "89f9e3b59a72095b57e49be9484ec69b21bb435198963b0339ae13001af824af", - "913a187f7723444322059c418e4d245dbb22b20b6cc2ebb979acf35bf3afbb14", - "7913039ee482c5041f97b2bf29ce8a5f3a253f449657baeab4040d29f27e3555", - "1f9e693ce7405629d047a088b3f843db6b31116b08a548d79dae1250b9887086", - "73ff63954dd68342d3a2ad847f45e87ea9cbd20f9b75fe6125841f30759ffa93", - "6080ffd158d99dc3c8c2db52cfe604b4d0b857ac6048151fa612c7c18159abbf", - "8db4ccb78d8e42e9e761c2075d7fa2ebee28c90f7456fa8210aa5a4c210f6cd0", - "b74382e5ccc83bee35b44c6c413382f5961e35bf6e1e950a8a7f65411b212315", - "78a56e23a401de253bc3be64cf774e746e896280c0aa6e06a258484a636b6580", - "dcca224d4101377a7eb05b597e5912bb2960e287bb0e660ada1b09e6106564d8", - "130a4e3b2ccb44364923ac1f7e0226421b886116539752011db3aacbdbf2572c", - "18e7fc2790012131091e47b0e8d004f0aaf7bc670d7193792424e6e78d0d7c97", - "f5f78cd5eea23f8b938f5462e50ceeb1b74b088c95e89547cf4cada9553ead9e", - "85f63b627fbdc27e749ad8df90c31d7baafc9e6acfe4cf1a76623a2cb7546297", - "f1cd8e8832479a02b2c5cc33b7f89dcf5102f0265af9aafd452c6b1638a6f9b8", - "df61b78ed720860d6e68bb0589ee48262da9f455dcbc3b8c7b251d9714e5828d", - "0538a1a312546cc916b70486754bd784058bd5bae2c3bb571231f1dbc42ceca4", - "ac84f8c2d73c7b80ec706c77899752d0da2857b15ccb658e467bd56dbee3d6f2", - "18f909e3e70613eb5d0ed5e344b66bde2f0fca24df16209e1da5dfd8a34f5818", - "490e45ac842f200b62cef4d35b1ad5be889ab3749b4d932f53ca58cf4745acbe", - "589bdb81c50c51de4b83db051b510dfce777675d755402493cd99ab66d55372a", - "d6946feee681e0405a510e80ca7e43313aaac17437b5a6ef58ca161478325a91", - "6e5d65f47f3b89f605362e47fe8e89cd1211a4a56169a0146a10d8fd25bded6e", - "35b36291ac0fcba332d0faa1cb9e03d74d10afd1325088820789151c56b4d4fb", - "a0a5eafacddaf36d044e74438b4e2830ab142824712375d59e130fae4a5cf30e", - "0a554c822e36f54d79d8d5a2be93b3111e9993cbad7ef62410eec76e974907b9", - "20c8e48e6e1bb300232e1c631969a98a6e1987c3f76661b794aae1a0790a2c4c", - "9f50f9a3ea8d1f464cf04e156b483fa6212d0e0a7b245f6bac03a5ec6ba18911", - "c3448a56b3eb2d72a2f84d74b7ef550070b9a22c0d96ee37d1dfd2fe7a090c19", - "4c0341dda1e58775d0f60bfe5f7f3932d4b8298a6d13a3790fbb03d25f5c4d08", - "0f1a01279e95ef743a3ed9b91f19da27d19554be96ad7b3c799a34bf1d54f1d8", - "86873d44c71d8286d60d16387d5c6c2551a2bd024ae193f7ce134bdd81b0bae7", - "4aa82afac57ac68f787fb7be036498d302c7ba21e6a397aafacf55f0169f6006", - "7493afe01dd6687bb03a9fb203ae14794e782c63f0fc31d3435dfc7560fc7916", - "ec53f34fd4695c6fc78c7ca0167c47cdd3f98cb6cf02f61c38800afb03332b93", - "33666a505b39928a7e98a0d49f399530ac3b592e5146afb44085310f8bd9a523", - "61b3dc033b134872761bdae79f31d9c9f4679df995b857b4afb776a1b8fea379", - "eb6033330cffb35954bf0de4a2289787d8ff1179084b9b4eee9d3ce01100336b", - "d727a9079a06a04385e2f39715b7e3cbc41e1014a13b27a02dd8ec8f6c16ca6d", - "b2f8d17a5d0fdd63a633596f49eece7bad0f1844f312eb721aaf264112a443d8", - "c0dd1a9bd7e9a5efd58b2a600bd5cf5d44f07adeba3e246e967cedd231e26697", - "272b6376b75aa674675b31699a0a345659bb5e962403767450b93639a2939217", - "97aae948c227f54d32d80ce4d7a2526147c4544964816c583e69c3e66b182d18", - "352d5ef67d652660f0f993680ea574ae94369f5c70583f02afa81984781672ea", - "92ec7b6393174e32a935b14e1ac52932c5c978cfceae2fb08fe1c9f9d86f232a", - "d8c6526dc2f9525acc2350e3a3731b87c69dc1ad23ca6267740e4b766b2eeb08", - "b16150c9472b58c5c6cdba9e60832f64415341313b9f60372114b07d482875db", - "de4b423cc5818fd95d5310c68f931123424a10567b13bee34f895c6270b04c40", - "f20f7d7287e6abc2ba8e31a3441d2608a85a15f40dc61761bc1cacbd5332642b", - "69bbe9ade84ed0609f42b994729cbbb91169e4d6767cf8ebd795a3572e76fbbb", - "8700e7b149da5a6953e4773ab9a32e00a4a89ae5e0a65fe6eb2ba1a43a6cb8f9", - "48d96db866ba838c1b15ff35bb66f475631ed311feccfd772dc54b1659d38146", - "82ca1a731f559aea4e629f0496dfe7d190e9687f6983ca08af060e7bd3ded26b", - "e953255ae9be004a0e3c8e943ae7cdeeab930b2bf7fb536342be792335800980", - "33e3672a299af60f6a61042bffb2d90151854e1d7be3bd242ad300b937a0a44b", - "659d8f5e80ea0c6800c7d2753bb0f456b45e4519925de9e1e2a10a7a02126c4d", - "3af5b021438fc83f689ff93f16e84bacaf4d78567c314f5320d0bcc874764690", - "3600dedc1a21e098409606b595cb1fdefb13019a48d3bef9e2609d4ec3a73634", - "e70ceb9af9c7c2f6a2a7afd544d8ba0466ad6dfd8b81f8cc04b3494b93adfcd7", - "e76ca2a303938d65531900ee2a44a99532a464ed7bc7c80b5b5e26423c852865", - "a32ff84c5eafddd39c19bcfa401300deda485fe80060ac2df80fb5d5b3b4baaa", - "cdc52ac540f32b0f231d9ff971e7a6c7abca9526047f3c34b97978b59b0cf280", - "ab2b5214931529bfee4b1d2446e9afa21b57f59434cd911bf1db4099c0cd298a", - "19b13faf3e0fcaa32cde18fc1c3724fa2d7321de898b14dc84d32353694f792e", - "fbbb3b25eff93a7f619bbda307a796a7ebde6c109488ea5937c6c2b5efbd2ec8", - "4115f9bf1247e6eb2b63b752bd5e658481f155bd98f74b22afb68f98e7396fd5", - "59ec4dae98b9f27c92d9c4cb6a86fe4766f8b9b8ea918b8b56e2fe268c9df58c", - "697ec831c73df5f58c0bacbcf2b4ef8bc6e24063dd3d39012ba4e17eea6657a7", - "2bcac37eff8ae670b792b4d0dffd5e7cc385ad2782f69a537c25eceb398cf356", - "36039eef4b70ad2b2b5ab576011a9d7b1b878dee7d474a9c15516162d248bf97", - "e92cfc8f93dad67e4586abdaaef6a31d3ed3ee789d3c92b80e545bfe5b6a7f02", - "8fc65afcf47ea08cf933fb26ef0ede8bc5dc21abd971a1bb7c328735361356e3", - "ace1fcac36fb36c754ebcb62ea59c28dd471c8cc0d04fd2f2dd0d3d0e1d83cb5", - "008697f426c4851672703bd609c98ecee3271358e89e669e5ff849e1be0f909d", - "c702657c8fe821ce1f75882c3c456c6b0c7531cd9fe4739b582cef748cbe9836", - "09ce53eb7281b32d7a17f119b25b8d35d30270c969ba4c2e896a126fcec03050", - "5404bf485906ad5ee02e0747b4786722e6899a67dddcd80476560024c43540f0", - "dbea379a62f9e6890e65cf220fe3942e4e4032f5878a09c0cbf36cc6f51915ab", - "af1be4c489c0b8c443115ace636f6070a369443e47a808818c3a783c367eab2a", - "923209dd8be6b6220f4b6f03323c0c8c97e8b384ff40f3c66865c163e75aba93", - "43c02d5cab0de99d0bfdc54af500a26508cdcb0f2fd5640a8815821ef6a42905", - "da3a9bdc68fef4a6b6b1ec5e33348519bf36a8367f5a241e701216790d885c5c", - "032c7fa1b1ade8438057c85d66e52d3eca85dd155226b29d9cf83aeee85459f9", - "fae4a16e65a1856e2c9fd5168943dd30ed44fa3d9bcd5648e5b1d634f3571b5a", - "1732a64746dd22942fa35ae21ac797245648e8cc17b7770972c1e858a811666c", - "f25ed7522f5c074ca6f38a14a2c188bcb409ed2ef8a4fabfeffaa4eae520a396", - "cfacace9beaf15e175ef4a6d1193c91ff3aabfd5970c13308ef93444f90e4cf6", - "99f6f30484d7e42f246c0b8adfae68a5d82038e1702a4c4b92b65818f5501beb", - "4ca6f77b8ad769d1b56d603158240ba62b11a9fe4760978b277a2bb9385b6172", - "4f2385db8869570246872ccaf20d128fc43680868b61ffba6c6e94279373fd33", - "a15f85b178c92cdbd3b99116251bd93f0f94dc1a963498d581fc5b9d110c0e7b", - "830d8be82215442664c76bac8ccb4c9307a6f0becdae342284c40aca18326fd7", - "33ba7b06cab51e0cd405f8e90a84f235756ca98ba3681a9a1bad42d411a07097", - "c828ff53965653411bdf04448b6f053f436ed83b404c5b0f5c789dcdef546c93", - "a0e738b3726555416a5909d626716ea5380e6486e29d9aeafdf8dab5a4f76b22", - "f87c57fd83cc97f6d60d7b3d109235480a1d4caa37c1b1ab60ca3fed83f8ddaf", - "64e8339ea5e7fabf6637816b83ea442aefb979394a29c0742e29c145c643c6c0", - "95f5adcea7df8cd4c7eb03cf90e23b936d9897515643ab99117cd5fc58b267ce", - "d81e71dee15450099d27e07b2c0bec6e9dbee8fd00589b175a8bc7c763e7c3d6", - "6c5df632c85a7d53124eb9d1e1c5880a31e66ffe3b325cfd23b5805b9687fc60", - "fe9e435772e758bc0d0f5eb3684c4e8ed1ece1e73c73e42b77ac796bc4d011f4", - "57d281c4530bef7b4ff99371db2b3dd342da09116174026529b439745270c14e", - "84cae23a949c439caf8ca8c8153fc99c812d148287190c81930f5bbf2ca8f490", - "440fd32b6328f41234693972f657f65af2cca562273275663b5cd685a21ec5c2", - "b964a247e07e0fb04d4cf1b3d358b1100171faa2fb0fe6dc91df6d2e94b1ac46", - "c55050416d46eb1c36e73a87c65cff76bbdfa70dd3e75e6eb8cf41bf08db8822", - "d2e2b3f70d5d79f49c58390650f3ab220d8d09505a75928049a83df0f16ff1c0", - "73c62d06f03558445daf05928c965130275ff3e81f65d4d612d692c7a3454776", - "475f9476b9d5539489d62fafc5cb14a1ec9dbbe211429b329c1242372daa8851", - "2d8b1cf6b268777e47e38f97f45d8320934e24e77156139b2f31c6834222fc76", - "ccb961a7663808ac9d3204a10464bb897b93590cb3e0bb441065bd67f1bebbc5", - "af6ae1918d97272a2d8a0dc55697519826338759607057539906ad40b19bbb7a", - "0f56d6dd786fed37766fb331c7ae323aba1f2257c1160a09cd5fe4fffc2d19cf", - "1790a0c84d4db650ac1028e2d6168f8501ecce4414337ab56f86b21a04aa5b0a", - "32be97e529b28b23b3a5f08e0e443295c1ec033d8e6c824ae9975b7ea66fb9ee", - "81f09700949e9509ad734d867dddb4d011b2d83c7881a1c041e6df785e82e55d", - "cde7b22a931d097ad5bb95a118cef6b1559887f9c04bb11223ed32c98dac6e71", - "6bd1167f73617654dd53555f8bfa6ac13e7694d7081a3d69d9728dc59fa0c7f9", - "e84287e9d3c4fdeff39dab0e77270fc930807737142d389fc3d5e42521765eab", - "9c7fcde6d27948d1435f4793fd7063f0dc8c3795794c9433cc0d9e11be7c9b84", - "d8ac6d02b4e75b758d3bf0aa1d05209bcce9a63751211fa43c42911c5fce5192", - "0a75bef0b10fdcb7e26c1d5af7ca1daa6d2a0f86b5291071f5a09cb8abf566b4", - "f70f28af117c9724b3d22cf4a6894ef5e0eb4ec372a78447b4baf2f0c5f10d10", - "3ac4b9e6dc9437f52c1e222ae94c14d6af232e0835cefc706ba347ddf7cc46f3", - "64a845cf829601a958dcebd4c6242098228e7f2e49e50eeeb1aef9730f6bf7d1", - "3e8b397e70e5f229ee736d3938f9e389069f41b1c66534ed35bab77d41ebfa3c", - "11d92b3bc443ba5aec32174659f35e1f0fa2411b18b16fe97d08bb0368e20bd4", - "2d3cca1eed76766e1fd84209d5caac952f3ded62b94b6a13086a82eff1dcc7fd", - "62e8166f97c4793370277fa7d061768cffa760d113d94da6130b94b901a74f13", - "28f48d93ef2e440733ed7ae9e28786536552d928d1b2dcef16638b7f6e7d1c61", - "80e9a93e4439e5870698861927ec97575f3010031f5a50a7e43eeb675a9907f5", - "48e357333fc92a8da76381077561f860b89ce93f0e28e0fa134dab3fff325913", - "b44ee003f33b5480efbeca9b168fa2d9b6ac3d35aa56b69553cb49cd3de696f2", - "93962d23eff2fab8a474ac48c45cabb094cfa733624c4d7badbc5fba70069d54", - "be170e2a1d01cb70344964a7632e7fd3754365bf4bb5e6dd5e870bdcd824ebf7", - "86887aae2f13ca5d7dea5a3b23a4b013b0741d50cd5c4e45ca6d0e5919691ea0", - "d2adece45e31e5c8a5044d2c55ac4ef25e768c241d1bdc2d74ee1525a78eeced", - "d4f6b1e68a801550df22e87c73522d5928d86c735ae7cec668eb9a79b0ed5ee0", - "3509d5c4280d7e5da33a2c2122ba395040d10402524c549314e266bd6c4d8cbf", - "9e15a6efb64dea0c56415c794ff5c7c2e8890d6e6143841f3253a6d1aa1b3c8f", - "50d9c8dc57bed5d959991499e01fa93189d6c5ba7b1d3d32ecd99b1324af7f2b", - "9d683b8530df3b65436b457b447b49ab74de7e3f2d0d9fb7440fdf9552d145c8", - "f5beaec3f6b3d59ec0aa1c27a9b86f3609c2c0d7a3e9054ce88ccefd362fa08c", - "0330b0092d38804bddfcf9c6da3852a9d1bce6a2d56cc66dde20c1b105160f09", - "f73e4a815e3b6240d752ca39d2d4abf941f9dfd1ed4fcb9fc72ae5fbc6fb8aed", - "534094a06ab49b850b1b32832183cc3709b4adcd444e3485b1139bfea3f64c56", - "6f9bd4c1a670a086e435bf66c923f9af579d1727b41be71318758e1d1bfb695a", - "ddb31ddf83a75c6eee80c771b8b9cf616468db8b9ecb6a89533907371188e054", - "acec2dca569ccd6d66096dfbc40653145f2198b31bca80f244679ecc8a455fb2", - "65bc0152f8975b7a4a04e6c27a2e3940d2f6d739fdefc865726a4c8bff6caa97", - "8a5dfa0f71b656ea35ed433b80ac9ab51d5e038f4eec8ed9311bee0315826e40", - "2fafdc1dbc19502cdd796627ab96c914cbaa8c84c2ddd7440bb47c370e73f4cb", - "c86261615587b253023e3dd9abf034c9f9ce9f47ef555e324ae9ff8bd6ab9739", - "3664129d982976f76990d73e05f75af13a0fb2d6558a25769437a8379b33a922", - "d277aa5015ff54c0fb04231fc698738086d2a2164a5eef4b4d3c2328503c1a7e", - "523da39f8b0e2978a5626a1f6210af1589c0f3cfb12f1c50d3fac90bf8cdfc5c", - "6f7d434e7765c09ef64bd3f65d156eb9d398d76fe785c336a33a0a52f863b5c0", - "a2b44e4c2ea60b8c3c05904a0c43160838fc40238c129fff4f9a502a3b1c0e96", - "62866578e0667218bb83b1d70c3b23c2f318375265656411f7707353fc8c1430", - "205e9597f0dd5afacce43e67a3162282a3dc3ce73af4af2e1b7a0f85775dacd0", - "800b9f482deef7a16f39af0a7a82be631a8812a6a3bb62de60e6db970918805b", - "c35b927a4e0781323d7d0ba5d51ff6196d17871ce687330b80e85d18f124e78d", - "a7c5a32341018552297a1c8c6d90e8736d750cc8cf92ba9d395fde21632ce82a", - "6902ebb29ade53e4f99c7bf6cc37fc2ee38701d86d3e3ad65eecfaacfe117e12", - "ddb2997f1dccb9f2bb2ac0db15b912a0c35a59ecca30f0be885bbf2871ae1670", - "8bb9753c76127e113c9c40312c8833e900c3ab9d5fce709f35b7a577252cd3da", - "113ffeb9530a216f170951afb2833c3985596da075bfce992bcc63fc515e3de1", - "72f7cdd516439c2dd1f1e79d097df4f616c248a2e0672348161a3153cf64c06f", - "92502af38d51925151930812b7cecfab4b1cae8c8bfe27fa1e04d26191673c9d", - "cbc757c3568137fcf9bec37ecb6530ecf231913b73f730817841097c9c8790e7", - "e9234d939547c789279a806c02f365f643b1867a74d89dd89045b6515c9e9fab", - "3d921dcb637e79bed9d5e905d70f205823cfb90dee58b5b9a5dfe6c7d934e3b0", - "585412d1e6c6951dbd6b3c5a0091ca1a2d4c9ec89a9f74a1dade4c894a00b307", - "b50e52dfff180bc66e46b4c68d7503d58ef6fef2a978b4cfeee36cfec82f589b", - "9e6dc1098a6f4b7730a44d9de9337c448fbdf96e8478ab30b3e4e708ef1e0e51", - "9f4a511b599a95cf5e8c36d14054894c3cd51ad687461cfe26d652e189b2b27c", - "7fd107eea117b22fbf98d485164267cd2aa8268b34d7792a3021a5dd17f81ebc", - "f6f714c893669a2c2c9e961bcfcbd5e37abf9634940d3f28a413ab7410e64cd8", - "91e8316191591ebc355190c90d96c8cf96c83dec291f0886aa0207f259048020", - "ba51ebb62ec386c673792c718ea409759c4fafe77db858cd3678205062b2f666", - "7979192082cf4c64a25747ff8730428246f7e02f201ab85a5c7ff066c5186a9f", - "944a8bede6b2a029ea9af595c1a6489f2d7a798f6b0b2b7fc34b5e1fc4963230", - "fa4e2c7378d19b12d2b030129f994d48e3dd6b3649882c6c2ac4c207bccfe5fa", - "00dc0a3a4563719db479dd631add276c13aef23e52b9d94cad28a7b40fa53a83", - "110fe8a51fae1e152229e49bbca92c464cd460c14c1ad5567cfc2852a265a2c3", - "f6fae5af40a64249fd90477e195d268b5ea4e63c9f76700fa16caf18d5418e8a", - "3bb04530f223df9b35e5f1afe67b35fdb40e4443e29c0bb1e9833867674cff8d", - "4d0ea850cde651cb53ee7ae15395085ed97fbc4e4c937820376585741cd466f6", - "d8e699d778093a20dcc69916aff1b2bb21677dec50683d8cba02f83161de516b", - "4d3ce135a9e24463cac34e0ae3014bcef3234a23544ba28643912ca12bcfa4fb", - "1c04a2077450a650496d8be60a7800a1a9000934f4b84c352a4f930ae6b53238", - "e277696d5fa9effd893ced096227b5972977ad061f80dfbf36f5867b4dbe7db0", - "8c3f1423bd3143166a67e8385c472b68a1ff1413172d7be0d8c3e7e8408e6ed2", - "342ccde475ed919e6709bb9af9924a89685f815ab440814207fb1384dd9c8ae5", - "f2ec4badf5fffcc2effac43ffa85e9c940367d16542d4ed2a881fa936e222d39", - "8e9084e3058230533aaaa0ba2bbf79010e323340825907da031ced7f587c358c", - "bab2141b95fcc1a3ebd0ffd6050b4b1696b52cf16929b6bf357625cb727b3dfb", - "25957d5425b90c93c3c7b533531f0cb3feb75809559ed7c10b008ff8e90a7e92", - "01a3429853de52ce35c19789b5561b853177f8c47b0fdf7a73fd162861485e73", - "58511931d85255a4bcb96fb4d2b0532f5d1fb09b2c66d61356fd24d3c3dab957", - "eac211d977c56e34a35a4adc1415b25b926903557c14649ae9dd94b212ac976c", - "0ecc8dc579c4ef73877b1fe71a25c51b4c2a5d8e156cee378b3eecc585990bfc", - "d4ae4e1acb9f9ed7f13f996ffaad0a354ff15147b5d21978548f853b26e87986", - "037b5a9ab09107fecdd508758a699235606fb359ab01d38238f28908f836a210", - "30f08d69f6a76b7bdfafa197b84a134bcf46c9304204df08f8e28445697662d2", - "5017ea43e2f03784034351ab8c1ae74289999c9f00605ca2677f7573d964df55", - "52b667345899dc03cf2f78cb73852cb1918abe9aca27ef36f47f1b4f7fe93605", - "c616efd6e5ba736616acb0dca3d56458d785670372a0bd90c60fc5a4fc6d1716", - "d06b1b75281cc661023204af8ca2d1dddda9f537e9ea6d12610131dd5b0f80cf", - "b77ecafc3e4545195d4a8ff4640f284d990b8213e70ca33cbfadb273591a8a39", - "a01212981a828b7bfc70c1989128d057376a1699b7154ef6cf950f771be602cf", - "a1f74da21942fb4f5c6f364c55c134cce8374b3f13d4ca30073e0a5414a1ac9f", - "2553654bea3c0ab978b034b86b1b1e04b747f0c37d7b12b18961705130afc652", - "19eae12223b2012d6e8494f426187a8dfea222f3269270eb624dee4208aad20c", - "4d0c5ce054c74cc32ffaa328c19d16999d4cce2a7e07abb33290d179ab6271ce", - "53b5c74b24a5a4bc615a374489322e59336b3a4e6bd1d45b08f5ac1f01cce5de", - "18d5dd3456a263b6c05922f493152b215a4338c940c5c221f5d77360c4760271", - "874693d7dea85a2222d3bfc41ee2bfa66302f60fa322e4fc137010ddc03bb2ad", - "098d7315c2a1fc76dc1b4505a0102c0fbb56971b9a992c4d370cea3ec67387e4", - "7c2d5314160aaf68933d2e482dd8758b5145be279e31d0c07ce96b065f4882b8", - "a451ff4cebbb006a6dcb3b31fe7e5b11807a08aac11a80546c99077bbfac18df", - "1de729a88088cd42559d54b57986380cfc984451fd88fd86c5a5425eecd49f28", - "82e852d9d4dc927f4749f6c66d6f9ec8ad7d4714b43932f6874373a9b97b92b1", - "749d7b3479af7c0524406a841915ecdf3a26b4e80c7bf42f94c7b74210726c3f", - "16bb55c3a9384e5c1cc095e735d846e80f9aa06f0c2f24b09dd9d6074152d4fe", - "d72c968a28edf793f03728d7f02d0a6337155536a1a437401a175c45933c7de9", - "9b1831ee428e68bc5a27828f02c50a754961e7d3cab37d03df5325158622dc8f", - "959290aaaf81d613ff597700c2022f6c4d805aab82a35cea73c7414ba6492a3c", - "f26f90cd6164b5cc195f31bed93c54b379e7e06da6d027ab3a30a23e1230d299", - "325dba3302a31c807ad5117a7513349b23dc415629d24a3ba309d057b18cbf35", - "bdd9dbbca5a0202952d530d51e94c260182d57ae5f44bae369bd1f620aaf9880", - "54f9b3113d6d2ccc31e6b9102aaf104889cdae75670ef8b5e7fdd9a541ee1ecf", - "b41e43fb0fd9e336e27bbf6d7db9316fa86b4259c84466b97d077cc8803f5241", - "feb8d3da49bca7df7249cc6b9e507399e96cb4e27e508fd8c94ee45947c11636", - "4cb18133c9b21630f679a04167f40c8b0aad6f4afca18fbfedb84efc6f477b47", - "035be6f23f4f2c94889e94e1a10abcdb215b9272a57a8d38957beaad33c837d6", - "72e9141033bb2b7e3caa9c26a36136887bcdba65b149daa9fac65f22fa2b1ce7", - "86faaae65ae65878edade13dcdbad599a0ead13d662acde4dfba3549b44f3d73", - "afa719ef88b83d068bd2420278f4d75127a6f743c3ae300cf4675898e336f6d2", - "3af05688b874e8aa3e1a053fe0171935212fde43a2123234ddac4785921259fd", - "e6bb66ac903351461dd7968d6ea1977857405dcb1610eab149fcdfa8d0a0071d", - "0aea54848489c0585640cb8ed92554c90dceb005f1b9f6fac9861e9a43095040", - "4d1d63e8fb8b3500f1366f3952f7aec742449de5664f8144c261d32cedf9ae91", - "ff7a7f082457b5676cb8dcec7f0d31e169185ab639f8a211dd6d8d61149a2828", - "1a9550e43061ccb4b004811dd7af3913cd585c3f65330c6b7927fa90c0bc8132", - "9326d17de38c7e7f20663333ecadd0e8f80258c6879a5859536bada383b9f326", - "df8e97aad56d4c9616a767c89d6d34a882bff574396f826e80b9ef50e16a1155", - "56b22254f60387f46ee5ea81f668b2cac0a44c2cdb71fe43a6c1248f65c4ea95", - "3a2c7a2dfa828884c4990b1f46e7b9ca4431dc6f51f54a2c8e43e5649586eec2", - "f1336fc251b60e3297d95e7698fa8febaf2662920cdb09b7539edef43c5614ea", - "25f1e6d7c9e50f3444ac566f0e035b0176fb1aa067ca563bd7940cde1b13a03b", - "7a7075cb596ee98b74ac62df5ce77b398a706b9d86dba9d4d2ee95723771a4e4", - "0789698cd668a22a441e1f90cd817f12ea51f51488e315f1c567445c2f01b076", - "ee62eefceddab3d9a8dce0e2afa726fba6f146d34a52186600b8baa9c9204bfc", - "f07fdbf47676c70b81a0bee2f3fd70790007611f237849f383930dcca11b1023", - "f8e8b889d4c4567c2199666660a5325819b14bb278419ec2cb7fc6cd92da03c5", - "7129fe7bf775bcf2e582b2c5ece9290a493e641d2d198b6a0d05c1f7c9ab1db3", - "31eb6e292d088bd0a611e2f5a30aa49fe6023a55c9af1375737f643030de3953", - "6703ec1b085e53b74aece81000246577e7cb9d46c38617f3d798e2097c0da77d", - "ffc20c631183bf02cf043edfb38e6985a2ac88a845358aa94761c832348953e5", - "6baab18e1b0006072df111e055cfc8777eccf5df8a0a5ceaaeac2f2c7477ff81", - "38e40d6052e285ad2429566e27835c821b3c76bfa0357a321b11b00ce9432dea", - "e2a53effa6249b7c2d1cd579f378311d080f5aeb3f3d4bec0500311583d558b4", - "958aa50cd9bbfb1aa79d91ce705ee6824174d7972060320cf909c0e62155d1ac", - "c5f5e48846763f521bb6e0caf0ffd7f510bee2c83c81f8c18a2eaf24e7bad392", - "445eb57b79b92bc8d01fad0a1542a273f4cc58a74198d7fdce0742b7848540ac", - "e13f3f6eeb95122a668ad6413646090184e1ab1f9321425fd3e8912cf76cb8cd", - "a9d26884dfa64e29047b6d1ba47124204abd931b412410923c759c8c7e85fee6", - "34e11d51bf1031c8db160af1a7d1b82660ae2d4f1b24b907e94dd3e907840e52", - "1f48ff2a93db1aa51bc9f4cb3f51ab5f219765e45332f9a1794c799da013705d", - "da9752c9058b34285e60611f3a04dc0a62c9a6ef15c3710eab4ad0a4d0cd4112", - "34ea72b1b1e32c09147534d3233cd88a095f2805d4bb59ce2af18944c55bcba3", - "d21b00a6a2c09285eaede649883183a2cc804c9b606191f0f4f25e9069df0c75", - "a2b40fd7f37840a70b86255b49c298d4767a463e21cfdb4058fe1a14c59ae51f", - "528e33e86e438cec97a6dc716e44eae5d9c61b3a7d8cc2069823267824428984", - "1fbf2bb79a74229042d6ac21bd6803cbcf323d71f947ac90b2cdd34b133389c5", - "222b30cdc0fb8067f2e30c57fd3a86230f8e785be1260d31df933b3691af734c", - "fd6ee724f1b76e8e816b0d49c3da2aa8d5df493dab872703aeef4bad15d7e6ce", - "9f5900f17ac9a7bd9ba87bf2fe69dd3e28e381ca9d0f7dd974cf4f8c9a5112e8", - "fc9e88e648d7223c7878271da10dd97d2cdfd252d1afbbeebd997f8d28adf978", - "e8777fbf4165f346e3ce8fb4ba30cc0275926111555ec1f2f4e97520a57290e8", - "7f721c0e206822bd7ae2dc454d1e6543d2228bb8f23030a16bd61750c6be2cbb", - "45d52dc2eb319064f8bc955d7b11330604130f3d15e377531887a8601b204468", - "31992cc15b67508a8690bb9773ae317d91c2b58e2f2327259302de83e2429ed1", - "e8923077663f8dec885b80c41aacc16d93d779df1c76d4b7c4d10a3343f0a173", - "396ce670596e2051d18a130d4bf193e2d008c89cdab5cc08b3f91dd30f045bce", - "8e7d2bd92e9a52b276bdfba4b085509720e3330f70004c22da05ef6efed85acb", - "501e1e4ea0a8b79d7e7dff96eeee5680541a475c93ef0782e0269059b3dab5a3", - "2999b4b3851389dd2d5dc0742dd054fdab37c923b6c3f5be0e97b9e422af33e4", - "8429988882cae2430977896b4803afae71abb2f0d3ad2ac1e94f78cc9f788914", - "0916a6449f37e4317e1e78f2df875c4ced7c61997fa84c3c8df87ea3f29de52e", - "0d6e26b6d3aae555a4e8cee2451721d04168ad500eb4a6ea794da33268ec4f9b", - "a294a2a46eb4c8e3205f8983259e0472d7faf7de2ce3b6613bdd5929d1fdef08", - "000f622d30bb474803ed79e5de3662ad8ce41f8c2989c1b2fc41f56b3f23dfba", - "f0113938dbeafd35137d02f271f31e74da4b9cd89f8dd7d2343d9d1dd1521f9e", - "180ebf6d37662b4f49315068751d63a640442233fcebecf91c8cdf99aee2e1d1", - "335ad47655f9621e6b2814fbb5b5d17a4c8a13981bb54225368824f89b057d3b", - "cc7b38248fe8b27e2ece174d1f3a3febec0a53f6b731fa3f776f032cb6b5a032", - "3bc400c7a96b27b921e17c6b1e1abe52b6cfaa32e7fb2e3be6b698218c0b95e3", - "d159635c4fdb0c9827f46e3771798c1cc23427c26042ba95c3b5580588e230d3", - "ef7af0c1bd83ef5c3d4c608259cd610e677f3b0da238a506507944a116160972", - "4e1ddd1c4bec7e284725becb1fb5fb296537884ce009872c7965107902dd8f3c", - "c71a8944f96234314b2eb5446e358af76baed285b68ab9d038ac816ad894f2eb", - "06867e551ef511f196c9a592dc4b94e381be4708af58919cdecd98d8df2e935f", - "e4f776689225afbd266788d6bf9f95835d4248527f889be8a54bd359e7669bc2", - "722a5de0895aacde33ff0ffb816e33ca1a8f9089df2fd2a2a3b72b96206ba895", - "c1ab6da95249bd4ba20733711ba1935b7ed19fdf06a36682a025114a862fc468", - "a774c3fcf09301d8c667f15e39bfaa6b2f1d7741fa979ff03dd1c67b2c104d5d", - "0beb48d1605a7045136fae9150667ba1a7b38a027028808cabf4c6a8299f1139", - "01caf1d82184946c949939d5387272d4869f08ceab45bd2e9ebedf38552ae18c", - "b7a8e09a67fd2ef0966a66bb9141a4b2faf778d0c9fce0357bf961af7a212d3e", - "b8838e040be3649c3ba4a7579320d702b7b9b3d64aea6271f0034ad68d35cc91", - "110817b6d4ab573d3c3a566a5986b7daa43c3050bb79214e7233e3f656125f79", - "a5d73d68555e0c63d707a8540718d40c9ca70b2ef9a2e3631507e353ea4c3233", - "24d4e658d6a3cdabb4c39c3bae75e2e1ab6477ce9aed26ef16121263a7dfd371", - "bdfa8cd84eecd910765eed8c5b8721314c9089058469b06348ca890a5086de39", - "2d1f682c01150241b206e6e6b414b017c0e4978b0df99d70504582edaada548d", - "385419eebefab1ef00aa175883b2a76cff22c0fc16171bf7516415c1fa6b2ea9", - "7d3890e40bd016d1dcdec99502ef6e86eccd8218f2b4e7c65520c5086bf8f886", - "4473eb578574dd4e3e7111f139502d7c4a3045b97cd600fcc1c07afe4dd6a30d", - "78542d1721c7c169fb93fae857a2d8227120e81f04434e5f05c4b8058ac4194c", - "3a0fca5cd261f5922f23b659ae7e34d0cb57010d0e989e349f2fa92c35ae6c1a", - "2b551ee7cf0d1043736d0da22caf0547bd3be129d767d149148cbf521f2d3e52", - "c4700356678430392068d99b99bca715ba931053dc8027ab7b037576a72cfa68", - "0f01353e2034c739d379151347b5b9efbf61da7e62895c4943f538dd6145203a", - "59913d6c031a5a9e4a3f927d77e6a11b3f0a1f1198dbb59d5d6a6e2410bcb460", - "b21d0b6ba4448d168e2afbf73e69cd424739064902961c0442c66c3d4096d9da", - "c33bf1e3cb035df100a261412a827c984e8e189622a2e4a2136f099138ac4ed4", - "e6af5e4e0b70dd686eddacddc9514c4a4285fbd6d5195963e67212b8ee1cf52c", - "323ff3e258e34661f715acbc25e7265dbf9cff880a975c16e40fe9d552caeb82", - "5f80f91b439b54c4bf5a5c57e96ab083f1108e4a7a486ec055d19feb65de9a44", - "5a39428aec67ba172c13fd4c12b14827e78071ec702679f833468fc60412aa7a", - "3caf3e8cd612cad90c61d5378a0a15273dda2e12376c2067f7eb3606e9d6a2ac", - "5bf77f6d18273a67e89dada6cefabcf0d8bedcde8dd5f21e9bc3283b711444ed", - "910b06451eae03d06ff342cc881449e0af70e80fc1b18262d7c4474c3f87e6a5", - "075271e847304bb82cd9dc1d37368839a6a2b36a8d81fe1413bbef6c9f92dfe3", - "f7e513f92cb64135ccf2fb61b41d23ee44e2715f2315d61cde4fee2e7533142c", - "ddf62ffffd0c83e1d0565454ddc91e4c1a7eb882d1f075d165cceb136073f75a", - "b35529375e5d4f0ce29c5d01923636f669b1723bebd91981a394abab496e84b9", - "9f2cb2169f4e40f700ff66f192c77c44c69e79375c8fec6b9accc3dd9c5ef1c7", - "0c64673c7310c96622a97c8074b508dcb12dc550337ac02e833a8a41b657e84b", - "59fce729486033f80592aac73955cc624da339ee4edc45065d70665ad19bca37", - "4b9e008368faa76b433946661f90bcc575ad5c060ca14fd38ef909827482f13f", - "2b5e4b23a7b04b453d10715f1bb99463225fb65fde2fba6ae5ede5ccb50d895c", - "631fc149a3872d350dcb73fe984e39caa358728d8294daedf727e2d26cdfa296", - "681b88e0a6eac690a938f771b2cfe6d5a3d81437e88a4dd5b56348271b55f90f", - "4344eb84bc220817cc819e8c56d1395f6af1a0867854e882d7a3c6f2ff2f38ab", - "14cd19096a5110191d59b624b356967821504ec054ff01ee1d03b1c6c603cdb4", - "7da8c4746b62726ae93277e7edba74fb898214117fedbc693e276f4a384bec8d", - "65034b4b121497458cb009dcd1c278e501a74b8eebe0c22b2cddac8bc4bd270b", - "7a7a5d44b2ca10a487e0b68dcca25e2ae81c56e0c234275bd75b5c76aac8bd7c", - "a1c5205545771be528f88dd60f277cbe42de08b22451b47907ceb33f0338e207", - "b8ce0193c7dc9e472784059fa59c2960fd5b7ea09aad2f114909e18ffb43e47c", - "de425a8be4c709f837ee0ebe4ccfbe739b4544f173f4505d00b03de14f30bd1b", - "7c1d2dc5066935c95b7013fa7c2c8f3436345eaba2f36d22858c8eb3f4470f01", - "684f98eaedad98a0a367e6e8dbb2f84932d6f1ac6b69ab7761ffd7677f84a3b5", - "7183f9dfcc18299025c548ed07420e04aca3134bcffabf10bea6e002a252aa05", - "14ceee95a0ade1f9c697038444eb4b756422804b70696b7249c8d151000ca21f", - "192acb0d96452b661b7a0d98162c877bb5e3342e140eefefc702dabc2fdb687b", - "bbb9e9079afbcdc77973de9a8cab28170888d60cf777535ee0cf96ffe704a630", - "f14bf74cd12ee95838faa535929473150f45cbe1799bddab9dcf903a55110015", - "d6bf4e99f8161d793618ef0811be6d550836ae3dbe640e70f3a6cf5dc110806d", - "a696bd9bc29af514f3f70d224fd48e9cbf08139e65b4a25a4d3385a064920998", - "d08a1fb57c5d2421a921528cec15557c6ae678f5174a7c164ef45c215db3bb9b", - "53655d264990b93713978e7a581cc2a3a89d0f89c4f5402f14fa20441df1a5fd", - "1c206bd19fb37388a5275b24dd19bcd7f616691f2bc89b66873f5c1f43a58532", - "1e153cd650197306d326e34a7011d52c4e2830f4fffc84b805a62c827290fef7", - "f7907f81a8c9a6ceb931443121a6fdb1ff3a8f21f8d3d2fbe7ac965c644a59e1", - "fb77075349a7a6ccccf9bcaf1b9c20b971ee08f3c895a1a6b0bf09bc17b4a918", - "456fd30501286f6c7c2dae385720a7f00b0946f0b1a1358c0a2757785fe16e22", - "87823da82cd6ea4e2ab1ccb2d46ecde99e52e19e7f2aa35c4f83de01ae262b7b", - "57e81dfbba0f925a0b5a4c4971ff6e75e37fc5944b6ad05e4def1ff4f36263c7", - "36f228d966b8043051c3cbb851b16e8dbb669914a49f1ff4225eddd1719c9176", - "888a0242cf8e99ad8b851ebb95cdabe1e6052dffd8ed2e450c263917f9562e13", - "9b63e1bbfef0b23f2357a3540cf6a24b09b57cd5111dff9889eee4c477d711c5", - "0cae8a984b7591dd7869f5cbd4c2b394f93af61880cd7aa0712f731188bd7668", - "b26913760af7d255ff30e482448c7838a34d6a4b05f9aca9a8a3c1de8dc311bb", - "db6553cf3c164442df5e3cc396809adfd2d0fa555faf282883929880bdaf2cd9", - "e15042fe306a47a4d8808a3d6d5c28d5cd69708057369c4c5cd8d079069ed4c1", - "d747c4b2698c2c9d361387d300bd79bbfd8bb363e1f2346721bb440b183af85f", - "b8d0466700f35c35ecfe35d30e365bb67f424232339ad2a79452d15d08bd7e7c", - "780d7af3be934f7538067be29c2776cba8d9e1a45280805c1bcee955ed9680e9", - "a90762f3eda08f686588c1db223d98575d65122088e3b7a1c1beae5f767db079", - "633d0c374a4c099fc0d0e9f14ad289bed31936fa842aa7ad3c6a99308303a07f", - "340adae91b476a7535d7006bb97e7136a599e96fdae418159c98b30dc42ea0d3", - "db6387c9cb7f4047496c6580e3ba4c2ee4637d3fec5676b14b39cf851f37fa33", - "62410d7f5f106db98234a04af2e87c2d4af4f6bb36a446bb9d67bb38398c8c16", - "abc486d056691d5c9c38933b7e3785c1c3580a2735e8f19738f3b75f7948e096", - "ba2c70bb91715a1f15e824ba8c1b277ca7aac7d4d173170a99a233030e3d420e", - "07941452a504eb1b4e6f0f98c10e97dc93c4719891228e8782f4e7948a12594e", - "3aa179f1d4bcbcfccfc344c029c2a3f3397a1611f56cce0f551d091e1735687d", - "cd7bf794a9bae15ed4d4e64e5ff4ecebf962f521aa0640e091861594f2a97a25", - "69b2349f3fc0587601598ec6d8b0d1f452dd7c8b109bf405fe33c38bbf7fe0ca", - "7f3b05550178837d3abde0ab293d5368badead3d129513f9187d1aa6046662c0", - "22c3323a2b3ff747e71a529b1b1241030ed2940e1900930f3a1a1e4b433bb2bc", - "cb27eb841ddeab9351de8872227ce3cb8a2ffcb5ab3f4530e5c769b14f295582", - "865c1e19816071950bc634c8f696594648e785dd35670bf98befa8134a48ad22", - "3be2236038da9ffe8b57e46a05f2829bdd80f00e24c12efb1b1c983be692cdfc", - "62a8ef0ed1684bbacd1596daa2f3ca9162282d7e31648bce9d8a0889643a8abb", - "76bce602e79f8be778711931abd5f1c15b4ae1ccc8065b5d91b34f525ee2ca8f", - "562c028e5a32fb985c55a5db0a3f5ded7ea8319e6f806e2236d41aa73504d9e8", - "dde1df9775ef3cae8a0d0741ae19303581021a20c5ca5968fea6406e3c405ae3", - "33ea580fa9245dd745e247f5bb8855d53ccf1cb617866ea9d583061f54db9dea", - "413509c8c168d18e55e35dbfa4b3683bad926cecb1a94c035399da36ec0cf7f5", - "af212e5b29b807bc2885205e8514fcbab943b1227a590c1f9b608a94bc0d5f50", - "aa282bf748ac883602d69a6e386d2a868ec22be33caf85b51cce1fd7a6d98ee4", - "4e599395f279d25858fa955237b00f03b492531f3c52cfbcfe2ccd49c7168f97", - "012417529ac4a1618d5533e4ccbcd9c8f64da30a6f7dd41a48ac2cf3d0dbc6c6", - "4165c16214d744fbb2689e87a7617cc6b2a2166e434a493267d83273dee93a8b", - "76b6d9268f96a9bca4ba445be87cee3315075acd9689984071a7b204f55066fe", - "ad7cb5b9f4805084588970d80a1347f9d298fc29ce264293e9d879408793cb3a", - "01fa74c43b609a5b9c2456bceb16a1d287b234a0d8b880d59b9271e1f2ac6ef9", - "eeb0611f406e6a0fe2b4ec2dcd809e5b4ea53da0bffeee9932f45ede9bb74662", - "b1178bb5fcc743e652c077eb5c9aff1c0dd2b7b3cbc3f5daade42dddac4ea148", - "ac4128bdf1c1b9312b815fc62017118c59d00f1d6068408a5325265a74d35635", - "69bc1a7219597fd3c44dc872f3dbae16eafb0d2896378634305b2a05d2c2ded5", - "246e929cdbbeba37f9d811a28638d8cd5f13dcbccdc1f1c8e845a74b686fec9d", - "aea15d8c68d762be457f2715a26ac53096e34f1b914643d53d78d12aebe79e31", - "d87f16ecc8c81c9451c2068031e6ccd136b89820b281bd4af5599f64e6674157", - "2dee70ce44d7c8a45f38d676a7096709eff0f34d8f9cd47b17892d165a79168e", - "468fbe934c3da5d73dc9f76423d96dc526dac18767c959a9adeedc56181fa0f1", - "6637f52f951418ad7a02096074c771d3124950c854fc270b52787fdb7976a1f1", - "cf7993a0fd3f6055534bd821d9a3d96a8376d27a2756eff657542c59f14d5b0c", - "6cddf5094869173940023a2056709777e15fce8ad6b26e853e0f3b05587df14f", - "9a9e2a43f67fd8b6f5aa908af83f85cad1d436257bb7b2c4866ceb41afdf27fb", - "881a309a018644b9bd6f9886396c058f8e25c34f2c2d9cb00318a34e86d0fe5e", - "636d2f2ddb90d1898382311eebd43720450ce1c1d07d22033d52bc21d9e26070", - "986c71f821a7e3147d1aeca4ad6eb6e8de3c6d014c355be6dda5b6e3cccee222", - "da337bc747529f16657625e997ebe9bb3c953a27ca534c209c8cfae5873a398f", - "ca4e8c63824135d3c8237e378b8204cadb8e6d109d4f9bf64aab3f3df0b538c6", - "8be00ec77956040651480879e082ab5999149e41be668f01c88309fa06361426", - "9b868fd339219a13c483dbe2f74e1a3f1c254a77270dac96b3192e2916f0936d", - "4339d37a29a63743dc16cd9fa6ecbd0d22ab090909920c5b54bb858e78005031", - "8dd15eaa7d5b2a681e2d8d685ffdce9ecbad45813c1138940bfc4170928f5602", - "e488dbcab5ebb85e1074f593e4417636a7c8a2bd3486ef0632d8481649832d1b", - "e65dc3688b6f8257076472bc41fa749dec4bf9ea0912e6ec32dd5bccd491ad3c", - "70e471c00ca3cd7bb1b807d80e3c33e6555d7f603e933a54b6f7ebbd25d53c86", - "ccedc178e2d1589a6c2177950af3e02f9e32aa1eba0e187d1849aff943df566f", - "c28c22cc89037e0ac200e52acbd78a5f80060c25cd227082c4500fe78e0f71a5", - "dd0c987d00da8332e80e56a118f4e0b74891008bb2167c6a6626d63a6dadb21f", - "80eabb517ed51bb6e249c438f1e596f18f7985271d4fd561bce341f295cfb0d6", - "108e43902a380d2c0286fd62c68c44bf99f657b170a9d03fbfef69ad6feaf21d", - "283962730ec5dc25f31ce996d24abb14874ec60a74b2f0f22be40a3f38e12876", - "babd2321112f24a4ce8a3b408882a10405786046525b2f79d91475d1f2478c2f", - "33a6143ff3549dcc53c6a6d3e2d57532a3224f3eddd6eb5ad759d2485a705529", - "7c7fb97d5dd8ddb2b36964e5936a760ba08f6fda151cc72ead9974c6a190a483", - "69217de530929f21ffa53b91b44ce5377717d2a3cda6421201463c0630d3a305", - "c5269e1d46c26417a3cf6da622a0ff48382ecb9b6166a9139e63d1ae4bd1477c", - "e892e5a5483d6a51d1f01ccd27d6203ef89df25d0c02eea87e72fc3f0ad18a5b", - "ea80af8049a4d93016a5fbd7070e363db4f0cd39a19fcc54b5a76af4902df963", - "220e58ec3348627895c5e48ff7f491642032a78d4a91faa240837e49246c299b", - "439dcb0cd1868506dbfe3292048c48b7ad7e66a65dfe0cf3f5b6421fcfc3042d", - "ec7b209fb1f7d2180ef593193f6e666355fcea56ca16780e7973e5013a16aa0c", - "83c74bc5cef361bd9e500a8469be7da3b8ff9939c8b2890265bc996e749449c1", - "e6b77248fd837b27c17534a88d65ab81924fdd338b956f74ce5e77c1e8f030c2", - "09564b94fa4687dc8cb28d360b3a9f7488354673b475a23f1b5ed545c83cbdbf", - "55c487427843ae81d6b96018d7fe5384f5fb8f94f16a13dfa03ad79e9ae8708b", - "a95d5196be06331f4a324418c5ae16b0eccf1f259fda79c479efdd8287afa731", - "dff50ed64171ba8bea1790018e44907171bfee27b0e5a939aa329535cf5d86c9", - "fb9d66c9c56eb3b1c908ebac5ce76eabf90a979dc579ac35cb883f1975d1ac44", - "95d06bd4dbec6d659d969257a54d92a964bb63d489c7efd105c0f79e5c3e3252", - "dc94c511a5fc91097e589399c2374711694ce5507849c072c1e3584e28f5ffba", - "787dd39331ee92ad86a8d0bd641f836a9e537efb3f69593055d5f49637bdda74", - "a0f831e23cd0e21804d35a06640304145d8bb4199bc04653cd633d547408b661", - "4bff81fa184ceab1a2d6f081e79fb0d4019f86768725ae7b0a3df6c58c1c8cfa", - "8c34c4ecd74ff9d84f35686c098391cbe84b568a920497b651dadd3361a43fd1", - "2bb0632fa6c574262ef076ea0104af0172802f7f3dffd782ac6801354af95c28", - "656a27674b37f6a223ae7dd12917db0b1216f7cf3425cb9f1e988462efc99e85", - "2ab6e327e5eca0c2857db76079e335b50bc98b3227bd3cd3f1c9bd86277f9f76", - "fc51bb9ef44a07ecf74ce3108d88bba83ae3dd389eded7e4a4716b42bf2a2ab5", - "3c69ec8ec17880e835eff06138b0d462a2e9743a099c2246e5b9eb5fadc167a6", - "6daddd0f8ed3d046d634d60d3fbc0189cdf3b8be62a8a9846fbf30b13efb62d8", - "c7428e1f7809edaf573f803451c85642709e2f9063ff0755dd46af60954d62d4", - "87dbad5c75c6f321c54fad2ff9f44da05ee99a9ee443b8f874a518e6b3e472fc", - "e7fbd246f8ed623589ad81bc1cd0641d4fa991f1fe178c0527e3a558a72aa9a0", - "e0037162fb401ebd294f8925c417a48689c2810db7bef7583a1d8291c6243470", - "cead4ff6cfb779339ca30463e78a9ac857dd7fbb9ebaa008227a04b8b74b3d32", - "d48dc6d132768a40f4e56d6caf6fb34ddc0f1dd9247e7c9e1f8a64672d0c7d59", - "564c63f1818d6c28f3c1c3e907741bacf617d1377eca0334992a494dd01cfed6", - "5e8eac3696797200b5ee04f3dc34b407c5921442686794eafcaf5076b837d7d4", - "e443d940efcbdf5ccb5915a65794248b88bcda82b79ccbcb552708c460b5d062", - "da798a462a77e6ee67ccfc61937a1bfa68826b5720c7baf0dc38d0f53e5504da", - "9d9e3f128e4bb3a3ca7cea2f34e5164b2773e2a83135500f843efd32b37ac49c", - "ba23b6d3579cc4b5313fe7cd67f9a03ae5253106c57da308ba4187c03cee1461", - "461b08bc36b9e0194270b361babd832f1482cf3164a743dcb028d97560a62008", - "f507b5aa7dc2dce772669e1c6ea60dda752465b419a7814d34f905dc60f19637", - "b2871db98caaef1ecb81bbf9b272b7e156c51a69429376e4da7507f4995993ec", - "07009a883e928c13bdf079d9ee81952ae9a0f583ff58b9524ab209e843575265", - "6fcadce4dbb52dcb8d0d98185a948b1d27c2826c8d82919d37cab0671c03c154", - "ca0de07aade8681842a67b3ac600140af7b52ea38098b28c9f69a4c15069f22a", - "0b0f02b224c3034cf96e2f484f93f3ae81fe56d093fa7c661fede640432c124c", - "37e9c2c40514e5a12815c733bfac5b19b85d7831b2b9cf8775f1794167272913", - "869474bbf9d389dad9cf9c04f4d9521faa10bb9ff3b5dfd85d5daaac4a2224d3", - "d8982748eb016cbfc25e0262828551fcc9e1f5ddfa35bb054af15cede395e72f", - "cce37c861d22fd8ec4c1e301cb0d454018b41afb15f4f1b36e2371176443210f", - "5f1d32ac1c0e73abc5ee2e0c274b6d48e09c90e09dc915fad85a1fe32ebf387c", - "629b8ebe40be946940a3b0d2adccc7844cc6deaa071753ad2ca7a7a05e76c6a3", - "1cb35c99004726cfa907c98da5dc50187213b871cbfe3c578bd462e3db98ccc1", - "1626e1f724a731e9fd601553168c38ff07cd43e48fb03780ce9571ea6c8afef2", - "36acd6ea826c9e6bc1782128ea75a18330d16f64ae6cac74cc8e9cf0b1f2b1c1", - "68cb1aa0a392fda7dbb5dc01aca20d8809f4a0a53d6fadae58c8a8a109b37474", - "1970bce571ce3b1eb0b17895cca76ae92889b4d2521dadf27b79e5a7cf2c3905", - "6ce3fac8bc54a0c2ec14a2f72fc943304415dec6202a2661b76d19f173c51c9d", - "2858b915a5784c41917dc913a69193bb376c3fbcd4f1c7a885eb8a636dfc4521", - "94bde06bd873215f6132303bf1c576aac18841fecbd6aabef7f3848c01cd5736", - "2939ac4ad9239ab6e1af24e7ef3f1f63fd13e28df09db9cac64c260def0810e2", - "51aea5cc2052ed3076357342e7d8ec66f7e7f224a4782022d7ddd959a81dbb18", - "1e688e36a1c8fb9331a3306ab5a5891ee9680688238e814cf23a867e09938bdb", - "c9d3c270ab896884abce0a6b2ddb5d1b028316f55f89a4a191c40416bc7c9f15", - "5ec2c0ced4100847eaabff25ddc999e296f7d0e3ac19209d38491c872823a5b6", - "dbcb98bb97b8f8cd5efc7cbb8e71f0aa5a3dedf247ef04e86694de8b9dc43a0e", - "3be04b2a50e02bed61701a7c2c91a1223a9f835168c3af15eb998a35b9cb3f96", - "6170bbf2892a308c3e63fab8216f407d88344871d655568d6da999bc41a33b9e", - "50f8543dca74f1e9b201779f14e7df157957e52a417ec7a2735ea1e595e66a84", - "dce47863229bd271194f2f36d1edbc0bd2ac88a8d22ca965fe2efcf444fb2e4d", - "607327736f074304813f8a9fb81f176dcafb065fb24b0bf3fdf632349d9b063d", - "5bce8f3b0d3f4e8aadce8e79d11a423836e7909d4644e0e522a605c4d3b42561", - "cc9067322332708c1b066d1325f8d8752b4fc70fe30d355dbf89063becacfd86", - "d9b4b4345e55fde082499acf77a584f8a93121cf256ba3b353540ccb576258cb", - "e610b5a3f6df9b20225e9f94d69fc919399f38803450a66a2eadc8515c4f5a71", - "ba04d50d8d40259f704110b519975f83a2d45d93aaf219599f46ee99f455355a", - "549771ba630f39b1887b6de565e21db67dc772cf061e15ef651074bba143f9d0", - "359c2c392c2a1df25336789228bd376e85100a06f8e25cd331dd925dd76c6c54", - "049e0e44ef6e23bfaf5070c85d81010f895f8ca60bee0652d9cff88130f89f71", - "dcc66e5d138b9e7dd316f45874a34ad1af415a190d6f64ee965723b6717f8234", - "e8090eff24a908964864352bbffae23c5e448d0d7cbde6be25bd0dd316e094b1", - "97084c957249960e13fd27f4876897b6170a300219332f298e11cafcf6762dca", - "30323bbcdf5aab05bdd224c16e36426157dc129f243169d16c2da089c54c3a57", - "0f249bc9dcf9e05a629c4bc047353cd241da94239fe4d4827b3bf30f98b1f891", - "a25b4e13951c430d38f64b6703d1a5e6c5a5a10f18a9b152a4dc85f54261f87a", - "ea9585e903052fd24fe664f90223b0c705800542870cf6835630010d63f3026a", - "39a836de516fe660b2117d423df66555f65eae28bf4f146c304ac64223679544", - "d64d85bae367a598b5199d60dceaa1470893a43ba2e1b1fd7df6241d838b2a02", - "bb003cca4057a6e1b5c89efcafd5fcdb662e00a4d40be6b75e8cb4d03c2e2cc4", - "2c50e5e0308191862da7539c3d300069bee2c674acad0825c3b311001cb7e03b", - "a0e5009c38caa1d00e55a6e8e175e6c3bd8832bc6a235e5093731749fe0b76d1", - "d735adc79a58614e7877b2aef29cb9217106eea1c60f39c1587f31572544a78e", - "a27361b40b1a0c3184b5adec459b674feb208810a631b8307336803a30b103ef", - "a7fd1900d127761f3e81e869a4d8259a6d29330ec1a27b70aa16d1327d3f8645", - "679beed7da04a1a12afb360bafad800e1ca161512e745093e2e4021d2478bff6", - "1d409d5d73f184e4f63d9e0ae9f407b8f08f14d74331bec50da577b4ac25ad27", - "0a59f389258db4820397f91d04ff8ce56175a5106512cb4e929ea110a141feb1", - "581683f38ef698763686d2a59b8223664534cb973f6f6e18332963f293cdfbb5", - "8ccfaec637d62209ed3abc984925b45918a889005673b534378fb9f50c475487", - "1736acbbd16a4f33d2de78ac64bbb9fe114a6889d18b9db8baeae96c18655559", - "82983bcd6476180ba5e434683afa2d092ae15d8bbaa4cebba7aab8436e7c1476", - "e0490efd2a03507ff2e8ede93a3c0b47c99aaae313b2b9ab32e97f77cd4a723a", - "a27ea482851b8e619c6d9eb12fd27862ad5cf9d2a482b714c99799837680bab6", - "301569a6332ef7f87eded1e952d0cab8d6538ff41811466c319c0a8a28b1d839", - "c60d773ff5abeb8933aa9dd5ed7f74c12dd5f498587edea68cb21e6d3e52d516", - "b424972633b20879c75fdc6add3a7b2cb50d3484f3a4136f145fac0a1089fb61", - "08d587568cfc8e89dc3834047db36377ce08ca95552e0f5873fe2e649c50eced", - "56d4c48a8c1a089c36689a5fdefbcafcfe5c0ef99f5c5db9ce211a64678694c8", - "6dfc67fda6a2c23ed034477050dbcdf22d118ace2b7dc319c1cb676d1c7555d0", - "a3dbc294a961d6944be90dc74db1c08ee916eae4d187829b346643299141640e", - "d12c4e2cb598750a0805ec540fd05d0c4c93d2b249c8064fa333d0e3d0f809f1", - "e1f7982b6db741b8d08e08bf0df2af730c97094260d44e484649839ee36ce1e8", - "5add5100cfd4b19790ed996468a55307ce2d1a221bcdb0445bc83df15ae8cb7f", - "ecfb1adb9d40dd57c6b34a95fd2cf0683e4babd75e8fc86b5db5f9ecfba18a1e", - "47d905de7f739d17039e1b3c715b23cf2ec128f954a7e2bc05c704314ddbbb29", - "adf5f63a7ea482ea34de5ef9fe3d0bae5955f95c2338c0d77404250d0e67742f", - "5e01ec67d13c02f6ba07e4f56566c39c84c764e13520035f5de9494f14113c36", - "8c6ec7844466b0b3d801ae1036c76d9d682642a8ac303756126de9db6fcff494", - "7b45e196506196842c1a943072bff92017ed7b6e47c8c879c716747de748df27", - "49d86778f282099ee4fa3ed01e4602d63a06dcc759c7db3e42b686c68f1d37bb", - "fad44cda0bf8fd3ed6d4ebd33b3768e984655ce66df6b38a5bf8f608564858fe", - "e26c8bd2a81dcf80194d370319a95f6b368a523a4ef1b0b4455040ad358cf61a", - "18f28a2c813fefa09b382f4dc03f52eb350a467a3c77750abca0b238c779b610", - "82d1582f624c665bc2be362eada6b52659d42e1195d42d17337c685e24125363", - "2840ef585e04edf8714aab1db82b84c9ea5b04e0f7c60809657483722dde2786", - "4a56f23e1107b04722e000fb3638087046dcf2837ef15b7b0c37e3689771aedb", - "1e9c6896cce2e1ab6d62c39e255197a15c50f48ef9b75e6e56ddfcee10d98580", - "75acb1dd82bd0d62d34118d8f4f35275ccab0c18de8dcdf34239b219b128f996", - "cc7d163eb1be33f655adefc0063183c79a06427d3ce5ab1fb3ba7906ad344c4e", - "b808348d1027bc6260641e29af3d88afe70a50cb49678d42e914d1856463f052", - "8aa6f25fb6e55c944b862eb408a6f9c5a372d02003509ae7d8c26a1000009794", - "f6117f4ce1a6c8bdf492fbdafa83fa16b78fd81b54f72769bdadd6b72f1e1c4b", - "4dd5cdf68846b359d7a1c90017feda569362c970967397acabd32cb99f761543", - "18c8648117d71dbf3961adf0e13638cfb1000f1e8ff8522888702bdba496ebf1", - "573658f01d3d5dce927d4cf80395beaad940a5686ea8fbf6af44a67e63b6636b", - "3ffeb7f1e3a8f51ae354e70288453a2e1c3e2e38f4598c826ad7b228fe49940b", - "a32fa286cd6d01f19d100059500bfe3e0eac0ba0e3af5ea1414ad7496b997a78", - "4355d883f93cfd21d1a3d9554785029f810450b904eea21a4d4965df3be6ae0d", - "7f254a4860a0f11bc318b3d7a185f97100c721c4abd77552dc6c623bc857c80a", - "c555611f55cea617e6c7bbcbebd86b7f3e38ff20103b7e1f6d318b8fd9f62429", - "ca405675e69708aff38d76e52a105ebd4b20d79c3acea608379a1232292e2dc6", - "34759445025309728b9ff14278a688e0281bd29c79781404f726384ae773680c", - "9abe9b8ee16c66d0f03abd3067c99d3f6ac12d4acd206dd4196fc263f40184ea", - "73661f0352a9b0154325f2a03ca89b523685dc8e7ffc75e90356271bfb4fa854", - "c5375b42ab6cf86fae70edc8df0425ddb7d08ec575e46a7dab10329341cb2dfa", - "5e86d4dc4c016618eb05b4d84a7af2094556e6ad4e5887335e91586b8e566c3a", - "ca7b7b62a0dc89121e46c187671992c9612b57eca56c5ef060a8c0773dbcfa04", - "d6c6a58188e7723d156958a2c5bc8664e5ecefb214833262ff3548071203f8ce", - "0e71ae55aee9dd4b0b347d303e359e89aaed6ee01536c2269a09813124599a4c", - "20c325be7929689a504a52ece1f564024c3a510941b732a710f4b00ba811e352", - "36f9613110cda7f69ef8ae39d7ea857e34e0eb0ac859b54716247d6e0ab61453", - "23f261c0d9d9e0697ed797d6708ffa73b889e5d0949cd8d87aca1c532ca4b3a3", - "1a89fef6ebfd17a4b0bd15f9fc9046d5271f888adf23bf5576bc1c16af1e2080", - "85b44f9fef590e971cc00aa5b098137dbec5c53dd732eadff14ea4a1e92fc1e9", - "5935f39a811dfe1e28b663e998e290a7902e228f64e6a43ca25d78ca4d1a86c1", - "1f21ffa55f9a4c94b7231674327da978e5c4587948ebbef3c499baa7be9e1f66", - "aef36be388224dca001310239b74f8918d44b9d3c82c342bcf6f7d4b5c6effcb", - "5f11f74d7b4e3f01680bc43b09c5555b412f25dcd62498c5ae6d9a91bcdd0a45", - "ce8be24011d214d0f6507b79bf0e23b59444121a83ca85c47fd33edbca672b3b", - "58be49c125b6c3c6e5a640926380bb508b5ac71eb36462ce709f3a3eedfd1b62", - "9a17d907df6aef1e3209e94969e7dad0cf1dd853eef2257e5bed57ff5fe33905", - "ba268199847cd51e5eea1b46e307d8a95efc546ddf27f3157dda8985e2fb01e1", - "250c84fcddea6d3b3fdd9e1c6cb24e58347d13cabba3fb580a2d8deebb954806", - "b4050180f6bfbaf8c2901f57920f88ffc26f7d1ab578fd31cc661c81b0a95b52", - "94cadc179b8b9eb25e5f4e995173a8da166f2d62e999a915108453f4735e9414", - "aefe65b8e09f06d3a42bf8e687f27585be1f7030060cee5fd4bd14842f4460ee", - "733744e00a1f323f1a1735578790a00dce081bae60879f9d1c50fedeb3d68d82", - "e63f7e50e1b2375ab452c0df6e97a01b918714246eb05bd9fec5caf0bf4a62a1", - "536f75de3b0406e5e977b4ff253bb9ac347775ba3c12c34e24de7fcbaf3eae65", - "a16e7fb3d3e934f4540e0cae07815a59de03421ed6746b59446093a93c251bca", - "c40f4260eaeba06847365bb4157595ba1f8df5f50d10283f08cfdfedc7a56377", - "bcff7b434a91ccc58b673943b767b04c6939f3d9069967c8dbf9fa4b18a0f113", - "2d8c8f7f54b883603e59f6f1d3e5d0025db6d713dd19a33c505745b67f7673aa", - "21b1a8abb659e534e0ad74f931b63092abfac2c82c3c1c88f7ffbd14576798ed", - "8b4875c3eb999881ff6d6dbce37d6991967c3b04effe05b353b55afd0972d8e3", - "6a44c8465db5db58097cd96d3ca38080b57736dc7e9fff114b1220f953769361", - "f0b791f2eec00c4c8c2a3778c041501194417b8ba3775d4e482ff50355ddac5e", - "fac6a276f7e159e46e1088d4977f8f572cbf2a806a600b18d59c0ae9234b6408", - "4c8d2da529cc2c97977f7d4e3aa4793c976b19433e3b831a986a3f41bf5afe87", - "57fe612a01a5c9c1489ed318836199f2968531bf19c29644418e486604dfa6d5", - "4dc9a90b65305ef2ef043995eabecc8dd21f67d06d6d7af9e51785f6b8e418cd", - "f5f24f534919c9493cf675f3e9ef068a249b4e5fe31ef362bee817c7b138ddf6", - "6fe71f74dc4739d3f0f0fb7f27f2b63744090a725ebc89aef71394b325bdecb9", - "45221ba3b735807ad7a4d1147163b69b0ca8fd40e40629348cb93ec557aa82a0", - "44b8ea93636f54227569dfb2a268b257db7d25739f226239fbfcae7de78e08b2", - "dcac6a797f83163135420848b83b2bb828f75e1e37ac3b066969d66f57e437f1", - "1f7da71ff997f77cb6db229de02cffde7acccf3c8406dddacc19a39fac059887", - "5f8d74f9339cc544b64d21e0fbd9bab6c6191fa10079b66651cb20e644da3878", - "c3dfb71fb35f12601c1bcd7d15a13b852149b54cd6549e2a0af61b7204aa422a", - "e9d1e20cbfa29cb0b260c464d85199b612167ff95a796b81a352bae84991d3f5", - "5621d9fdcffe7f677e466ebf4cf84849ff9fdb6e29f43acb571db1a2b69c05a0", - "f8308a47b6c48a51c6fa4c9867dc33ccdb9d4389bf9e6d85ef1052ffad56fd0e", - "2f1e9cbf61ea3746d2a03879c90fd1e0efab49890376e37bacdd1f7e49b1411f", - "88f306f706239cc3dba6399086c2c5678b08c02d41e4eb71280929c53e8b663b", - "9ac00a3ce506c9916ca068d8e55fd4aea71bbdcdde199b070626d46891a07249", - "f16789b751601d4154aa21982cfbf0f702686cd771ba9762ecf7d1f61e0709b6", - "3eba5bcd067a29992e9f94c037dd4e2ee7c465fabd0aa6c08129a78a36492793", - "31584bcdc119b00e4b32ec685bf1996be7bf877c03bfd51a9715db7c0a28201e", - "145ef0e3a5d05124f26b59d2316ea95bb9883fb0c8b88d2e240c39ecda4230c1", - "af18da2feb89498ea9427fd25eaf1ad5175a9c38fcc6f3cc3e0da9caafd70122", - "a9dbacbd2635d34019ffca0db5871c9d2965f0516fa2afd6ff27d58d02d4821c", - "aef85283a26e44d0940b4acf7c10ba6548042aef103549cb4691405670b579d5", - "f2c409dd89c92e0642e55f83cc07d25d4957ca3d720a0aeb028999344037e8d2", - "99d1197fc46c8f6fc76d7eb264bebdfc779957fafea28b58c63eead278424d98", - "add9683a658c9953f6a5443131f9b517a0248a38e651e7ee0bcf0f621166a3bc", - "09aa0b3f20fe94bc5e92a69f75765c8cc30704ac16472b20ab3b956ca94ad617", - "c872a2a799ea69c90860506655523a1e6149559dff9c3509cc40f794e753d5dc", - "568d6363d93650886fa49e6965b73dd1ef6c76a180042ce3b529478a353f9efa", - "25866bf6806f03fbbd12e72cd8aaa6b0f96a77d25df59186ca275ca1616f63d2", - "f4d1d4885353837fc72cdfa92314f1618e2055db67a5bc85f96d71b9223b0494", - "e1a45cc6c4acec26f3b0004d541e12f1d1dfa1f25eed2070b2bece3772a49c9a", - "f657f7c07e33823d7fc0d1f4b27b23e9e4e8a51b4bbe31c11a4188f3fe18d273", - "92e97dfd2188b8b2cf8911718d5dbb36150b40cd38f67243df4d576479307b78", - "1912a6dabdbdf0021db3f88090bb82f6b3bd38ca562712caa1e79cec64a1856b", - "f6367bd54d97f82c041eff043587e3154bf41cfa7ebcd886e0429befd5fa0f90", - "5fc7dc18317cabcc9ed73641501efc5efc7ef1cfc3d50deb8e759339716859e1", - "0c057d58a1ce2e27a28e5243a67cd81c218cd84573fde0e827c6a2422d6dc679", - "4481719b1bbcee4a3ce2bf6644b223b3c304fdd6d95a9ab8b112d8826c30c126", - "122cee3fd2824311a11667d13eadd745219804f98b7fab7a289b5418c14dec31", - "a445b2ce45061eb784ad8ce2f2ddda76fbecf4d33742afc7cf866949fddccf6c", - "0150e12afc67381c79d990d58ddc80b33a4b72cd1b5dce5f3e626b79072bd274", - "84b94a60a31e41d98e502b7cb8dd6f4adb27cc276ca2a9a564c56e7be1dfea2b", - "cae7d3d878ae4d0463bb8606acc09ab3a0ff14b08f84f195a1d7c5718cc2da0d", - "b7475826bcb43d63458d7c3ea74c107fdbbb845298b4f00a8c536caf48790b2b", - "09a687989faeba2cdb1845e48f093764dde258b3554b2fad12317c6bfe88a6f8", - "16cf158a23c6f51420845b2474e73d736167f7fd6b9b9791813f3ca8f5c66879", - "1b68c8abe81d64d436e27422cc44043d7b1842fdb7f28c3832a585ec43127b92", - "838197691c93533e47368e8c5e75fd5cd2de56c974541ad8b7f87d897f08df67", - "9d281319288d9695757b39f09584c24957d9c4069636b073f71a582b16247793", - "8b9879879f4627f2766d9f996687d56754505d47ae9dd7f73b49b240e72af5fd", - "86b362da24da446e9eb04cf39e9962a11b42d59770601e4f9f1224188e89f22a", - "4cf134c3ed7b5367c760c3b6866f3ffe1952c7c99c20372f121c92872155d6c5", - "2dad7ec52baa33682e8f2fe4a165072f98fdb654143c45ce6d6f5baad117d031", - "be4d88d30afe1a31aa01c4421b06a2e353194bec91bba6e87d006c4faa02faf5", - "881981a19ee5c03af884116c227602a82295c9e80e20e91ce5a103595cb35c9d", - "993c0deb5f3078759f4368dc549cd53ce30046602396156d7968194f41e7417c", - "d437d4d771dc7d929699e86307cae895db0d50252b909b659847672193d0a2fd", - "c66b60d036cd5deb5aaf5d2bde3c3e6c6a248e4af4b523af84759d85d159f3e1", - "50a9e715d70aef20e62d5496a2221d4c2f440f9fdcda54192df525632d3a1c2e", - "041e768e1627f934aa6844c1411d7ffe90cc8ece3a4886bf4584768648abc9b5", - "0f36a2fc9a6fe1cabfa2aad8b08f77b82e0b27f09520ce34aa81e0e7d0da2252", - "5d59f19812f37c41fb12607560bae288f5d7878a08bda9029d95fc101844ed0f", - "4ed0298809886235430181f62cf5011000b27e35645ff3e641c6284c8a0cb93f", - "e229681655139c76f11d57479c74b88c083ee74ad2e5c9eec5e6af1cedf57bde", - "ca033d5a9aa8f2930338ce569db1d7a677e4ff5b40fded25a5c1082505b140d0", - "dc79a70d64f6c30d5f4ad8a2693e93a2b036a3d843f0c0245e42427d1bf7aca3", - "bd17d66b579f732046b837a05d6651eb8f2354e496b1997e14d3907262e38439", - "bd0be229e21c6818de6cc6e08b1c470e2ae6cd37f56d76a621fd07edd4b4b282", - "3d79d50bd5bf88b555f3a57aa64a8258690300a89a4778f98855b16299b4370f", - "d33be1a9e035458a2d56c03b3b4233618acdf6c1b37eea6952b71ac6f3ede034", - "65a50413af0136a9a45f2bc86e6d3e4a401d4df51f4a6d6a3bfd77f389ae84bd", - "b2eaf1dc400844d624815f2ad0c68a92a97cf7a736a7161a7f04ea4303e9d0be", - "c89658272e49d0c56769e95d79df9c55bde4441cdad23f387bb6f8607cf075b1", - "eb8c582e3818530040380db652a3ad9f4d800cdc36930ba6680cbd1c7d102df8", - "c1f8ba8cf1d04b2cc76cd2551a7b8dd76e729fc63e162ed87359e2d293a0adeb", - "e7a7229933d370f3bd1ca2c84c4650735f5711236e9fd5fafb2c32b54f2ddf60", - "2e1cc8c239af5b57ff6b59ffd932c600dc057eee4154b53910245647cf4cc13f", - "63eae6eee4f25be3e24ed3586857768d38f5f289181d1c733f46ea1b9827cf99", - "e665d23228aa961a2b828135e432081e907c576773a96f3f4c340f3b1276f5f8", - "1f578b997f30d4818882e36f0c76f7b47d668e0c529934b4faf5763043c23334", - "809e6de33af768b49ac5e9040452ca8bed30177ed80919a57968de4fec67c10a", - "5fc0dae62465ae56d661ae95613bbb49306af3959cd443f42da88eb12415bc4b", - "6fcc12156eb9faf2186b65217c5e0f70d772498853497f30bcfea8ee6b92a0d6", - "cfab0cc5a6091062b1d833c2f4f39fd20d68ad15fc54a32f2d37c29e27a10875", - "b3c74d15e00a0179514307ffa278ef4b20b231d99a25f40df95c84ba35d1202f", - "c8fc9a065aa084d7ecd28545d03440c99a4b0951e25a66ddc525191c38189dc3", - "4c1c28c6df8632d6ec1596e5be56dbd282be44756b1ca70168eb954729d5c4f0", - "8fa4b7992459dd60d068dda4822c3d18dddd4c271723fedd2e494803ceb0145f", - "62555ca2b337a67b965788bcbf95c49afe292824e6a15aa93fa9aa2b793b6d7d", - "8ec6aaad3ac942f31c3068d65b35b5d74869ce6e4a74adb130484adb25c68f7d", - "943f4c57d3f709aee74e8763225d75d2b8baa4c9cb59d32e0c7b04806bb32c39", - "7936d91a4f11b0d3af6190c5074ac0480c509399238585363038627e24357fd4", - "5a5a64a57651c5820a1ef8931102d19df9c6d95b920a90caea1e2cc8c1d158ad", - "5f472953bdf8a7a1f3439a53e0faef9edca91c9199526ad3c03c30937203eb1e", - "ff4c8535b323115f126b34c7d5d98fe88cfad2bba30a29c9bd9b46badfb6754f", - "ea570a3c1bda7d347f3c4d8b0fa84d17fa7cde9f06208d5ac956c7e22fc91e9e", - "035003026bf8ea9ac71c9df7493d1f358e1d11aa5e80308ccb24a5341c21cf30", - "8300fa718654633509a4efd1bdb8053ba53221b265bb8e5f9d81a1cc9f966c53", - "d099613d62b64cd90f6d6cf5936ce24c0cddd8852b350d2a2d757ad7c1350408", - "4339b40ea998c97629d521a452f1e7df78d047ed414d42a0de5e4830a48dbbe6", - "08989d1f435940ac4c24713d97768e137ac6f5f7ea1956a8da137e0c28e83c6f", - "de5a8346352e29983bdfe9d18326dc33ee8955bdc5ce3b5a15e0470eb7361c23", - "3bb9df0929c419385a7b4e1226765c68fa2077de763f14883337ac39129e0c74", - "5670ec60f504b8d7b229e433d4d599510ade72145db7d1ee4ce5c9c644e6b2c0", - "de49ea5aa10cf852deb715fb03b0e14888c3a2c0589fc97b80ab2c0d96a63d8f", - "6e4ab870e3dd5ce440b45ca24ff0b7c331a1781009a8ab30ca8fb2c0bd14b6e5", - "c3ab7e52a5541c6cf175e5ff289b5040d027f7820953e9e53fc5f7a9f57e830d", - "a508239e0f1b656732883dfb76f8b992c198811c68f0d9f848350be45432c6f5", - "189c802aaf09ded484967d637683844631d61c7f83c12000b8a5db9118fc2aef", - "307d26ce1c9eef2924ea6897758a457294d159fa6e31b8795910e3dd917df1f1", - "bef8382b4990c4bb3a952b19c780ce53296c3e9f76f8171da9c20b931ec71185", - "54ab06f6b3c87e279db1a5d0cbcbbf706848453606159c404b022426a04420f2", - "c66325153ec063f90ac76726b48c888d49f1e76d710c642b0ff2b6432fa4fda9", - "e0327358a15d00dfb760a8a11ebb2cff6100921da4fe815986b1668135d2057d", - "69799c1016ac84d72f8e38f33ea6bfb7b45cd190711616782ea78791328770af", - "2dfaaf21740fab88719b51a26396d720df7b129d6570c46b82c4505552d7b30e", - "abbc41c7d904e9478c1d22281f8767fdb06991e6975b994a550c503eeba94cb7", - "2ca6a7314d936b8abd5f871fd5053b936f09fe694d52cce6213933e870442fe4", - "d567adf51ab9553ca59c5fda026c7b4125cdc24498ca8a61ea1b7d1c66d46f3e", - "73af3ac34c57dc66bac71100fd8a7225faa699057b4e3b87a8e850dc4d9108f0", - "ae06d44375a46e7715d10dc81ab33f88c25a76005a277d5c1efde0bbaa43c659", - "7bfb540eab5c270cc8e056c03a24a876b2309a264f7ebeeacdfa5a807aba59d2", - "5fcabcfa7d09b51a9da570d3b147f7c2079cdb2f39f82b851e5eccfac0ddf420", - "76e8b4cb88671253389c57c4d99b60204154d6492b797def34fdd9bf858fd2ed", - "da2a9be432bba326ded85aa65a5372761d1997eea0f469e32b474aef4d48e1e9", - "8f6f2c1608cdefd0fff2c140239f7d7762e4525f5fd5dacc8551f194ccaf39b0", - "3901d416ceb7eab6f6d19c01ad3bade05b0898384138a23744b3e80bca01ad9b", - "fc240a6d6dd36d6fa95fc4c75dc7b92f3f7b1947bd4d4197f1d1c99a2782c7ef", - "81703e11660e7c11b2ad0195713d218250622a59a60c1462e9dfa37cfaa132dd", - "1157dc9a45d33f05e22a25f6e47e62831fdc45da5e306047ad97e72b90c79172", - "474692f498067eadaedaf264807340d7e44679fc7c894dbfbda9386944debc02", - "7436cfaaa5962b6323dab4ef796c05a9a48e4e2ee86ebd9137a22348ef1bb78d", - "267092da12ae0502235132a4ebae63a796700b24ed09846f87f584dd1c0dbfd8", - "ae3a657959ea9ba9801802578a361cc3fc8e327b4c43e8f2dab93f3e11c9adf4", - "93a0e7f999b29f4bb7b75ff85dd20ea994f0659a940256df6597c07ad5518474", - "f3a812c19c0f9649cd655d38f7a8a377979da042ab0f8d3720abaed1565f7f80", - "fafa5d47b788d28e96d82b29a58b92a6befa7348374c87542afcfb916168e5be", - "638f2d496199d4a52c9b956e4aafa6996553476534e3eadd89d14e6f8a274800", - "85101ccbd3d2d9ef8daf683170e07a6349975d327e26739695ba68699c03e75e", - "86f2a64d32c4cd844bb9f9334df513c40561fa90c62d7f72f185d4a3270182d1", - "71eabd8a91a334db2aa3e65fca061d0f606add66dae9ac4508baf60a951c3583", - "792639868aa2f66ce8c7df85655e0d0a529b9403a0990c1bd007b3aa29964b46", - "79bee52a0092575d300b07cc27da864bfafb4d622980d340ca6457c39ff42f4c", - "04c0a3386f29af0371b88d1a34972b31be3ff606c441f0b4c3828c468b9d138c", - "b1a6fe224610a9a8c758e8a89a48d2143785c22ecd8d0b1770d218dd9ec19de6", - "af2c51b8f80f6d19b8df3a6b92f817136ea45f24dfbb9543e544f29b5a7616ea", - "df01964cd70fc6591d314c70448e78e9556f67c3c33663bd1c7ed0180c5ccecf", - "ddf3ce583c4abbb9cbb218757075b079a911bbd395cd889a447949b969370bd3", - "7c5f3ddaf3e515016c89fbc9c01e2fdb77226bb36f68123c2dad74c6b84ad12a", - "e5c025ccdf74c3f9cf590385d5108296701bd2ce1682a2861c3aa514f5d92dec", - "b45482ff25ecc618d887e4729eabf7fe6357e355fc9bb7dab16798a17ae544a0", - "4e9a1a5dac4a71dec649ce71d417a55369c030b842b37466d42536f8cb2532d4", - "c7d23a9123e48052bb7ec34afd08b29bd5be028f805914171cbfe349fcc9b870", - "c9f7aece010aac30d55e40204ff93021d19d5e9c382d81a5c409ac9fc4b73aa2", - "1c5de693f25ecbddb0f7c1ecd0c49a45bdb12dd1d3c60e02589ae228043c27aa", - "df80a10280d738d2f25ce6ca019015e15e928e399fada2b4cd61465434a4d0bb", - "339cffcb3d31ba5172998eae52d333ebba71e11da772ad27cfa4f95c88b2ae2b", - "820cbecb9ea0c6eaab8ef1717e3513e1c59017a504c6085acc74ff3a66056dbf", - "6cb262438dc3d81d00f723a61fcb79d7cff533fa22900e242714590419363fb4", - "88d7fff5ba24edad282d2a5bd6df8f8929ca414611a14fc99f32023817b94daf", - "387489ae595592a16b10f785436d77841a925ca78e1baad3161196cb3b762cb1", - "4094982cf531479dd67478bc17899fd1f1df47ef3b47b8cc5ddddc883143eea8", - "52985fcd0f1014180b5b9f87917c0c2f057340abe92cb27d8680b4a7b4deb09d", - "41335cc3e993d9f93ce72b7af38d7ab275e0ed4bc1da519b6c7616666414433a", - "8d506475de9e1c74cc606f5876f6a86481716cb7b6311c0a183514242af0fd0c", - "29a5737d4185a18cb540ddd0765b8e0eeb851446e31d9616ff82b1ba517d9027", - "a7133bef32356b5ffba320fa60be3b2eec12a9424295012f91012d48c318518d", - "195ac4327710ed58e6d860786e41238bb3d16e956f4a07b5493a9cf3bc1969d8", - "c5b3b90b5157811d7ec618791a1f35c049b0190cfbfc9aba9bf263bd83e2476c", - "893e189b61ab4ac9eb3007eb0ac353a19dbad317d9096928355d2f27e1b8eefd", - "06c0c55aee597a5223a1c718a6d239eca7aec17e207a376d57cda5675a72e517", - "1badf8a10b5aa2480df2ddec60f13e4b98413443106e231de21ac852136dc854", - "c73c6f0bd3102ec760eecb05785d8cc360526113720124aaf89b5fde7a86edf7", - "48b4a43f51dff74542fc0512bc171540eba0189cf5d0d55b2d9eb401aad0c993", - "bcea649b77cac962b5284738d0dcdc46d196ae48a155f2ebe1beba7d4d017e2a", - "7b59da86b5ac03ea58f0115843d885bfc478c03fc5198dc99da62519c19241d3", - "04520b4ada6b0caff6195879c9078d03a05d1fca0e9b82c777d42ceaac4524af", - "b44463790db2af88bf4acb84814769e6eaef0ec91158c8edd04413bf0627f102", - "a96ddb7db0c08abf8c0e039fc96ee5c3a04bd021dac40a4bd2d6d882f25f43dc", - "c694b51779f258fa1c08f45f52e58db63d4f356412f48a1b25efcf1547cfee0c", - "e33b507135c6fc22c3f126054cb63b7f4f8109079886120412cf4a0b23d0adb7", - "f1c53848c5d1348fead5dcf0f516f3e57c851cd9842dcceea7d4daa2be1649fa", - "a6d1967af75de2cb25b819a7aff084ab41d346bfe975d8141664e20b204faa3c", - "7ad9184b5cdaf2abb578dabccf6447df4be9636915db1cfeb33a16cdc3149a7d", - "c92614e8dfa93c137a9debe105112807ca57f04f27e1bb38874164cacf3c020c", - "2c9f6a131336441138afd19fabcf6fc58751884e69fa278b93964a05e872a7d4", - "4deb5478ba7557c282dfb80ea3a6e6d71c0e0627cc3fbf10d34f748b74bf5667", - "73ce83b58514e1adbcd695ca54b1b2b49736cfb7f56a4ac7806baa13461fb1f5", - "ce7f3bee71cb306b45f428d083659a3094821e6862afa6d44b8d1c1017cfb20b", - "f0d1f2d7f8007765bf5a7ce8d3cf0145f7d8218b3f6f76f4fbd24b61ddb96f7c", - "9e527ef85aa4d7ebad37e93a63d803928a5228232ea88803abc7927edda86968", - "6e8e9e028c8134140053cbbae74769c49c0d183d4c65bf62baeee8d4200cf72c", - "419d24aac53b844a947c1780cfe4d555b1d2ca07988b33cc004b3eb90648acd0", - "fbc1b4cd5b195fc925caf1dbaa050702516a92179c1d46560fd6ed479783badb", - "7cfcb538ea56d7a51cabf0af5fb710dcd84ecd677d82d8dedcbd305442a1f1fc", - "357d9f5ecfa32b8b8061d17be2764f8e4fff24de61f7001259512b2a3d50676a", - "96b92ae75f812b7812d29304b8701b8352caba903187ca24a831c93860758e28", - "f696cf08f635397a03b2d885d73116bb304cb0ffbf3c5b9a88129dd75605dd3e", - "325a77301148f695d80bb74120aa5686ce6ed8602b010661911497287d8cb56b", - "e8e8fcff077e78ef3f99eb9e25093c52cceea47047b6b87eecc5181a56d68649", - "652b988689248bbcfbb94b414e3be1792cef1eae1c6275538466724dcdf90b92", - "77cad0ac96d84ea49bb0f97ed1972fa0d116142b2892209ec32e1b64008c177f", - "3b13c094334091bc66c08294b6a9ef781f8e98fc8ae04a4ed24457bb3141d588", - "4a2b3780d2d78168a908903212cfb798fb2abadccaa55fa9378acad175afd829", - "9de2a4c007d73cca710b0450c79cd302d5008cc4bdb8f381104828bdb8e43b76", - "f66d8ec38929ab56fcf3dd3d9278c6f32550532388c823f455737a96542ee7e2", - "d7dce80c4a0fc786334b25d6fe7159cbb392d41938194ee352827bdb8394cd0b", - "a2aa63bb14d545e8e6af0fc383f794997c19e11f532f7602a4cfac7e08590d19", - "ad1fbb90c6b06585f83862e5276ddf2b841713edf54bd026aeb91febbd253016", - "ea523b2b08a39f2170a3d4625cfcb8edef53582be7f1564b7992e2f8059a01ec", - "44975936658b512b9a13784bd4d1e2a013bce23330d9276451ba310d5b4f02cd", - "7fba9396b87747df5ddcaa16c44d8ae5ba378f284d46db8239dff73d60f212a4", - "e15bf90442a6c5a6dd6dce0ceb50fff7188cc17a8237e3f955ab3f97658175eb", - "bf176010a370e7c72f01987efb87334c9adc171bbf45c9f51901ba1a4fa61ec8", - "5026ee7d7c0ddffabc458d25130da8dcd2f4e651eabfeee1ff9513e03b43cb2c", - "1d5a174bcbd04b55d61f12c08f8c679726480eb56ae85c227f728c0e6005d280", - "cc4eaa03267f691daebd66347b6e887132cd7cdbbf2db5f95b6cfcad596b115d", - "c2f8eaa212fba1789484836fc2ce5af854fcc583f2583833d3009cc5e871a95b", - "50706412a0b073d2241e873bfd7f2e061550c02a42d2808d431e10b453218767", - "0bd02cd9d88d9bfc0116e83fa29b45400f7cb2534689de5053ae09efff9cc98c", - "04595d3c51e94bac8e9f19c62dbb1dbdc026aaa80c0c19cfd2b5910c290bb33d", - "cc4134b29ff9aa0b658f6d236287acc2ef5d005712bacc0d74bbdb5210ed1c6c", - "f1c25dd4a4f362a3e7f5b9cddfa0363dc00582391022301db77ee3d3e772614a", - "d2896bad594dbd2be465c6063607a530e484ee4fdd054a3300515fd641a3229c", - "1269bddcee63f6e656ef466c7292e5d442e612a38efa4f660d4acb41b8afe034", - "150dc259f662eb4fd2c3db04b02c4f91477bd17644b59f1d5f73eb42b69e30a5", - "fbb57394ccfb7a25125f1b97a06a962a75df2857d055090368b91490a230b90b", - "5c402ea4d014842265ea8c21750adf9f685efbc79d6c95ba8ce819e4c4dde51b", - "b42449eec0bf70f6fd9d7b36b890aec44009ec19d6d3aa99bfb905a3f22a1666", - "5e41ed162761da791fb5fec8f6441c12b1f3f6ac0d24fabaaaf9278bcf6f58c8", - "a22130819079af8ac3917acc6b51d4d33593878463f3986c89c793a0d569c4d5", - "9381374bdcaf533afea03a0bdd1b06779e5b471097699c2caabf9c998e7a65b9", - "884e3af49dbc64a9cfa0b70c74f8b8dd269395143338aa3d98e2d0a02993b105", - "7b91a518d5354eb9efd9290051990a401dbd480b8a0bcc31edef723936c9f7eb", - "b28390e68170e49c8e224ada03efa8badb7041a973e36f8cd51f1f2eef1c50a4", - "27d6af3a7795cac052454b5d79cc0da3f9898528550d26ff50049c2933aa1686", - "bcb310f512b0a526d0ffaa58a5422c12f381b45bb0d3858a0b205e2722893544", - "05c089477c798f26eae7c543fcd2702a37c85de3a7b102590db79448b070971e", - "9dfafab263f1088ef34f2528a9e75c9ba5137e5124441e33a6897da1a49ec3aa", - "b4a79625d2aadca24ccec2b262523a56a28b1920e57243423d57dd73c0fe2efd", - "f666646f53909ab6700b0928a05ee428f76aca621d92a731e9b5cb228e949596", - "11b8db993ac2ae521938110048c69ae2db583c3b803f347cdabaa06479aa8d1d", - "5408b99e17ee6ca02388eee9c35cb0c126a2eacce235ca1377430f92ba57dec2", - "a78ab9af5fed64c17b1d885557c6e6b86394dd00ea7d7ce5210ebceb5fa5d0a8", - "5e122db43934b47cc534272fe1e49c153a2e2941947a58d9b7192ecebc6db506", - "e67e19c97a72db504475436dbed0f44af0e1452add7c3218c465150ca261b662", - "c30e1f34f4d13937bddbdbc1889c45b149fe014fd5007e008b30024b8634109f", - "41ae5bb9ed07b7657141891780c2114e8371aec27ed369f8a26f063eb7dc41ef", - "8334ac6f94afbd045e40b01658d400430f7954186e7d7caba7be5cd1c8bf3ec9", - "34c910ba42511922a2d9da320da54d536bd136dc00ab134be7b65d732c45980a", - "23a7077eabb535bdc1c16818df0e20bc01417146695c68f22cec1657082b3a37", - "9ac476e1ba6a0044f1adb78173cfb46b83effbd85a9d77eb796e6395388bcfa9", - "2ac6b1f44c2c8bc71f933e6b7c111bd8d594f71370b1008c27411dcdfb53c048", - "e7298fea1f35f71b27963c5e9d742d3bef12240d918c3e05dba7ac5e598f5902", - "6ab070471efe41c71cecefcfddfa9be230d70cdeddd95015ccc638a667e907b4", - "ea2f72f75e434f23faacbf966f5c10450897678cf9504047d32cfc79a16f6cf3", - "750aac5bdbd2d075dc23c38d244b918994eea16bb44e24357233980912c92586", - "0757ba95f0f0d75db8019a1b7141a5283819a3b08514fd0f91511b63da5c1c9a", - "6aa71eb49472cd324ac89d7f9704b9411d60a745ca712e15fc768ea946a730fd", - "9ed814d03bcd0c732855c9c86225ae4462e3b2c2c67bee7d483851dacaff014d", - "17ac026861c7db560001a8cce3488c3f7cb75a4f1c269612afcc79d694380394", - "a27f6b75f6db2fff3d31ed3cfdc5641128bb2c873c8b2660b42c3b79afb5c439", - "217a8704db17407ea0f70968b285cc72adcb76b9017abb87e0232136c21dc75f", - "48858ad2abc8a7f058693939abfe00d4f22056e41982eb8eaf7823933a0c0774", - "8abf530788b87f2939aabcc981416bd6e571ae322046f7b1c0e7a2e7198d080e", - "3a6d175bc7551ef366de1e9742430f996c22781abe5003899e80876eae6ab9d2", - "57d6123866cd4407b07e615339b8053f7067ed8c1f9209f524ae303004ffc96b", - "39ea46998e25511ff4d939824c1d0bcfefa3291a1920bf9f9232a7471e95c8ff", - "5d30d843a4f5203ceaac935277a61823fd7ddf6793dc37c154d0b2ae7cc91b94", - "f9865336c502c666f945aacd8409de18acdbb06f7645511c5ba47488381c794e", - "2767ca47de77c4b77416732960e57c89fbc1fd81383be627595ac8887bd82f25", - "2e7ee913890212cadc24e18040186b4328ddc50d3401b9c2812b96514e8bb719", - "68d1bb640ee629b429b7ef88e1d3cbea225d1b881b77953146ede3a43e595083", - "d8e8ac5e1ddf78a17783977a69b504aad72ba28f14692d1cdda64d4d38d07533", - "f050b367ac6daf92a57c1539ebf0b9cb32880ea4beed3c726e18a966aa93a872", - "ae185f4e218fa0eadfd2616bd7c4dfa49be44f05d0a3f3b3cce915962235b717", - "3db5e6ee3297cc8778f2eed7086645355b59b5b44f9f27ed2927de8a5d770c84", - "5e38a750918acbfea01f5bc2cc08dd6ca487507c6146efba765d4c884388141d", - "93dfe828363402d9bfbfbb5180ec781e9754b4f7b01315074069120d5fc463d4", - "d049fded26854410185bc58089a039333100407353fb74e91622fcda60470fc4", - "c0acced425281924e821c823d484600d4cb541a27152cae099363f8a4382dd8f", - "d0fe97835ea887e854a8a0edb0da2a72e8e3a0312c559167e3e10446a0504cbc", - "364a9a1b1108f6dc254483a95a67831d49754418d06df2ccc1e4abe0bf7f6ee5", - "b01e4fa782fc574e64cb955bfd308b9f1e15d3aa808858265d2f6cc90e495f47", - "820f7a22b68425ed32445cec019dcfe8c0d0f6b40d9a95c3d84b324d49e38a1a", - "1a659e0f0658fe32f0e0023b62f95f77a06f76513460312354f111a23236cd81", - "ab3ca5c7b19f3d1e3e97af14eeddc62ec1fa7c71a854d0794133968f2c671300", - "de8cdd55abd95a5d3cdee6b4534028eba8697c0fcb5b326d35b234c39cf3acd4", - "59000b82275cb12bf2e81240ec6df4bff3eb58005f8846f4d8848ac886a46c37", - "405526ed2c8b7b6e347de84367d154be72fdac110b851321d5d6bd6a48424bf7", - "497421a5c1e6b14a214087616af26f0f536c77adcecc47b9da911084ebd6a884", - "d784d9aa9821819532fccdd2cf82f48a5215bece3cd0f3168a9f4f7669e357d2", - "a8090c72cce1b91a826bb95316b061ead66578518d0ba0f6120797470799830e", - "030f107499cf9a8114a6f6fb12dc8693e32e57f395f8a64bce6c97c8c6739378", - "00c58c2d0a8566124ad763fe7b4a8aaeb463bc3e2def7da680d02602ce20e7c0", - "bda5b1db38254f2c3f936a125e63e0fa11628f103270aa47cbb894593b4325b5", - "706e97675a78041beace5f6d49f8c8b16372b94a93ce5fb1004bfe9c99b8a58f", - "fb2ccf3ad68c58f95e5e065994a9eadb9bd0c6c1dacf98ee74714f75e94a85f7", - "b3850a08692b0e2c823b6f87cbd411a9f6b376fe3ff76b45a1ee5f4a73ff7fce", - "babc1b4f4d3eff7b368f7972fe179e919c3fe08c7b7bd86ac106e8d98a76e294", - "5499670b03920891ff47346bca3d1e19f1d3f3aa21e8a3f3f43d1396525187f5", - "b2ea7408dcbe2732acd782eb15df56e9820af67e82d973a49edf8e6ba30a0ed0", - "576f1ea2f7121f405f7091c4d1c4b3812b882db5396432425040f01ab3957916", - "d53019b4c3c979a2c9b3fa2d41dc5606a1613afe42299e2e722ca0c4b25afe5c", - "8cc14c34728b189bf73950e0486c8e081cb2ccfa86b4f5dec17a77114686eb7b", - "86ff31c3e3e2e959253b4712eeae7e5a173659522c29f52094d01cefae00ec79", - "a703092fffed6960772e9d1129d79b4d917551f51b675e3701b1cb7eb4d461e8", - "0733fd6099119817d32d5803caee7cffd970f516a7e3b0241b17427ba840fa1c", - "a8a129cba64c25607e597e55201501497c4430c28c6fce8930a54820f60c6dbb", - "0a3d7e2446ea8a59da2c8b17039e8b71f2c94476c687fc4adcf1a7e6d429cec6", - "f5276e8097dfc643570cc47dc2a676e32be7b7146afd9367fce4cb2cac00086a", - "6cc20a4897f0d07cb31a02c9a0fb0691197d3fe0884c0683ab7883156c47d4c6", - "a7cd01ae4934d52554e409ab778149b443e9a921d731d680bd89272fd31fdac4", - "edbaad8269855515f0a999d061416636105e9e698da97e4a370c55f84e29e95f", - "666fa3c6cb60ff2cd3a7435a366e868fc2ab94800aecdb0444c4305c9d2d5d43", - "2de0614cf3f90fe977a7e916f35342cc7f35f37aa7981ac5a8082113ad3f133d", - "cc7f517610e4c4728e710e2fa20ff030d553baf32d8b9b3150b04e280a85459f", - "f5f881640363d23ec2e1a93b76ca7f9ef11752bdd44d13bb64d435ea637c0f22", - "fbe8e006ddf1bab8c99078e9dfb48dacd6f9935675cde961617b074d585b1a7c", - "00249232d5452d8bd9ed52e5c010be75202706407d438f8b4d3bb4b62e03ff70", - "ac3a5917caa5f816b14b7ef4ac0160e78b9e4feb4e291be287f1a86128712534", - "3cde0afeb5386e1722d79236f7b2be985de8a34b3714c57763c13f1782e273e2", - "04c0433374b51bcc06781fbb7b1d700ea7ef766b1dfd844e111809dc3e8b6ca3", - "fa31a7c885154e5f30bffc59ffbff1c9130b9aa68043fd66f58b8a2f41be65f4", - "945b31f910c3d3409555127a0a08f17da366c2e1ca7348f93f55121539e157a7", - "20fcd0e77bcf4076ce3a50769daa42b2e79b75b04abdcdc5f750ad46f71f79cb", - "47267606e394e5bf1eb4b3ba7366043ced24aa71753140e0ea280e07a4051a0d", - "858341e0eeb2300892b62abb91b53b60495cf67aa7391dda8bfb745c6ba602b5", - "eab39dfcd42d0bcc3face27a0cecefd8c67d7d66a7251cfb69182b3a9f03f960", - "55b35ef694ec1d2b3aa7044aaad4dd0252e4364d96e8617f82286df0cc9bb969", - "4087c5ea087c77daf8c717266fb5b03995987245da06c51d9c3b300f7eb1a276", - "77988051dc7d832e8d66f9800e518ed844cf4e9a286863e77f8f583204f344f3", - "5b43a928a73cba876ab92c674a935c4780f2f4d3f3420945bfc88ae9bd126cef", - "f83d73f0e09489d6255e53ca490d8b786586c52d055c617805ca30f64a24258f", - "467d4bdf95ac54a160b12bb25ed7017588f35678bc9e7a75274cb1fbab4476f4", - "c8cb8f1dbb73d5e26653aa1c44d88a94e9eb1e3e2d8400cb8b8840811a68e00e", - "b7a266dc17242cd9b2f4dfde922a42a5b3320012b0f546e7ac1961ca4e97c0c2", - "0d7198dcfc01a9e53c59a2bb5357f9abfe1686360be18e3619a9644ba510d55e", - "2af3e373d57060cf9f533eb0d6d24c971d9cc3c6643d6d7d53000a85ec33cd36", - "b00b9da0619957f65f3566eafb41d0d9170527030c877193bfe1227468a24414", - "a479da088a8442f6f29760d1cd808b6c0d77c1d4d088807f889f6d399fdfee8e", - "a0f063e8c2baf6cb318a7c27258a84b3864c8ac68a2cc2861ac6e0e8a60ed949", - "e907b541f6a803a806d79dff31573a28c3719ffb3464c2c342e37ce2906703de", - "e90675850a0ae18a2b100d50ba5fd4a0141c952c06a74db62ee8b73c36b980b7", - "8ea24ab6953f637b724dc41a7b919a768f7958908a12b629db045c4b889cbad7", - "fca1bf600c22324b73b7d2320f734bdbeee064306a657bb8eb8675d52af7e950", - "e067a99b57f34a0a7379a944fcd203077eee536df013d3f5b3495509947e55c4", - "d1cbb8e78355e5adc57d41fec2ad844e5cc7cd7a8e577dfdad0e980af6d711fd", - "09a115d63d450c428ab45f98cd38c4b4684e6d502eecca6d0fda21bdb79b68d5", - "2cdbf147bddb5c39fc66fde78f4b22aa929ad49b873095ba2704eb4c2d08584a", - "9adbc826b7760bf711d914eaa15be5adc54841e314449f95ac8674186c10c6a5", - "0ebcc8e81a230dae968c1bf0e178c633dfb24e833fb6e7832cb453e2ab51d67e", - "2194b72ea061f84bbd8553dea0cd294b02fcadfad23e3681efe8b8bdc2d0b3b1", - "5a63ae8efd66da83ae912d9a051dccb438f8a16774a8de4d37d3f7da2e53854f", - "e5af8f2defc95bd29e1dbbe71b18714839262b1ae6f0f59260bb32a868079ac8", - "468a78de41a50c5a0f2d2a8f6074cc6f4ad963c68f80486da54fbe38a4859852", - "0416e9b45abf66eb3017771c8e8db5662c541ae8dd7259e175f1bcc222986fcb", - "afae1b5640659c6019214523f9d1117ac5d4fd81da003b01db4c27fe4d503e22", - "30b674ed00f1a57cddc4e3aa68e63d5b71552d5bf060f47435c7e563dd254a91", - "6a5a77da298e86960662c15b479367ff2e2fa49981cc9f110cabafe24ac806a5", - "e2a7b42ff613664cd8f1da0ece6be7dd673ca93463c70f92e228f2e282940cde", - "448fe93be35afa50520b72c39fd4c9a02d6e2f8905d473b2f100ccce3234fd25", - "d2fd3f5880c26488d9b110dc37bd49c116c443f90b438ba4a1e8cbac38fb64b1", - "5c461e27c6842f9a5ee5767468d39f388ed50f49e7a487fe4cf8ec17adca8352", - "c06a873d159c6a3b3bebcbc714456b47e99b47c1da6788114ee5f57593330c37", - "fba72e81f77644dc6736b4db7cba387e3e6bd428e207179597802d3db19901f0", - "8404ef9bf6e6d1f4a907b844af4fe04107a49b18da9bd179e07ee1f662fbea50", - "fa40ea8833ce854f3292796dbd364425a73c86e443232c8b259fc09e8e56e6b3", - "a82cc009d5a886bbea404c9538d87e2b34231d6556f2db7a2e2a67a7013b5a48", - "dfca3921417dc4e18167dd865a838348e4cdcb8a752e1df448b6be6b9b7c72de", - "389450cc24fad4357d4b4b56e381b0243859e5d95fbc86b27a92a11dcb89e385", - "94a347037c136a649ffa77a4e01a6555bf7fcabee392cf3be5e6a4169f0363d5", - "26e1db6f1c9f68e9ae02a82465c9edd36782f54fbd643b3814dc50b1606f50ee", - "d49e2c64cdec7d781e777fc047e9de3d9ebcc533392e95cd5709219059b9c361", - "c1bd1895a506231cfcf71727b646e6b5e672c06b2f2a2015b206ef74672b78d6", - "32b499118d820ed9f18af1690f6d6137c6d1845cac195811de9361ba97c44caa", - "b22dc4eb82096e782af67c12a16c95ad33991d29420e3639ac4b761fb1ec2771", - "5f306682facfa2cb115040e99cebd25e49ae3d9308b3d7827aae2049d0808815", - "1f86a9891f1605906438aba1538a2bf176a8b1e3e03f16b1e651ca82619d9ac7", - "bc6e03b745271951eb0ceea1e524f4b23890c309a0e717a58343428c71a739f4", - "30d7bc489cf3aeeda699b7bbcdb099f0d4566396dba0e8c652b3df76404551a6", - "338ef36cb8147bb0d50ca8b9f29d77277df2411ec919e9d47d6c213013d46504", - "1461c38e4db4751a3894e13ca90773b13cc42f643f060c6a0e7e8303604267f8", - "77dceb58e9d02095800a117b0d62a517b564d31a18af0fb29d8ca7d363147874", - "09268cb43eea775861d465b8f347fbdf08ea55338034bbe8344c2c6f603463d8", - "ce5f6fcfa51196c646d4c5ae3fb27afe8a339121c94d15412b64ac6f09e23d76", - "0f346a3b368bf01b5d64d12da95fe5ba56d3aa80fe4234da25e370a73da586c2", - "f753d821e0382803da0e70b5d6c688c2521aea37d1414e793e1121606b39c165", - "146716d7097faf35594194cbcf8420aa3f752c7ea7d33365d5f17191933d044f", - "3d6276bdbf2aef2eaa8128e975287aac077cf809bb4bf2dbea46e52634f4211c", - "025c605ce7f97e9c9abc4eb2a0ebb637ca14c5d1686dd35ec3b65a97d525fdfb", - "52bfa38035c3c48ceb56d7ab6d2c3fba43d994c0562bfbdaea10a4c717459578", - "592139599ba423f725858b19478388396fa47d38b4ca8649f2ca2093e0351ee9", - "4d60aece328e3da2333e5b7025f6f9a54e4109ebb3feae7c5f0a9e9d1536f4ea", - "bd22d33b61b24d930c7e0a77e1b932c34597c1ab43a8226d8b3662caa4fd9283", - "38f290ed15d44e4292ad636c69036a898df9002b26a03d261165cb61aeb51395", - "3b2dc9362ea433accd08f5a3735d9e8ddabcc092fd9e6b1dcd0b6d45e4aaafbe", - "878378cbad039eddd1f1f82f23f30b7f54f7c237424403687ef40cd54b5c71ce", - "abd46368f24aaa75298993c561cb32edda0431bf962470cbd999950578ed6c4b", - "92c3ce80e52f584447e9a9e015cff7136744a9c99e1822faad5975186a46f514", - "eacd2cfb3f1a90caa01e1bd6985a408a5f85094ea4db4b2938288832fdd3ab64", - "9b19b88ae227992b3f9bac7026521e42c6ed0f5f5241e99838932d270c156fbf", - "d243b957c88750c6549a920254117e9fbe476d6d52e9f8e27b01a2b60e0c6839", - "c2962932dfaad157d3e47667054190121cc98f5601a7abb87896f5e863cb0960", - "9077ddd96fa3d70c49f283988f5dd68aa6175c7bbfddf0132b465b916e984178", - "f6b70c36f5910988ea9b5805fd80adc0113e70ff687e847924412ecd9bb6dd0a", - "e165d4592bc547fc1a5f48f68852977459598c9a855a6bd4b307366b790b51c6", - "ac64e28bf9ae134bbdbabc3f9acdfbece6fae07ee45ffd1e5afe1891d27e6c7a", - "506b8fee6d01e6fe36b8c4e2d0964d3687a53eb1e35fc33df846f944897e3b34", - "016d5850ea0b461fd36d113936b213cd4020f6b5e0efe570443e08eff3d78035", - "77394272ca1cbc220fa8d0a9ef4617ad4033872daa45e762f449ae7ad696fe37", - "aec349b7fadc4ecab720c74ed0439f821667388eaa25b37557f16bbacd3e98f0", - "47f3488c99e4096be113738e3cc88b98fce61e5274a42ca71d65b80f79264abd", - "ffcd59446ebf8c108d2d317e23e75210af691fc1cbd35af25467f42d93998a69", - "1fd7afe2e7b2bcdb31d66f7c2d67db82236aab0ede5a5a7089acc25410612666", - "c64ada9960252d38c9919d606b41e622ab658dbf464d240ce4c11fbb0da9ce08", - "9784636e09d3bd8ca92bca8de9abbef0421ff868404c634e84fc0bc2fc23b3ae", - "0070bf37e73b4657e7007f9877bcdf4ff9913a2f25a5a321e5280aecba07c380", - "2df8925294be6c59d4a337e0adf65aabbdcb1c713edfb05873b7800fe4e06b6c", - "b4fe1e506c9ab14b33edfb564317f7e047192e68a4c150e7781987fbaf205f3b", - "7481fc5f8f66a7ffdda3bb3321b38f9bb15d1d3b7b25a60b9198de6564efb4ce", - "f2d2d262814b6e20a05263288e06b0b5dc2c1a76e5ed48bedcf11fc145f22fe8", - "d4584d3a5cec87b17695105726dafe5fc90eac645f23d72fa499b04d7d948ddf", - "65b52c8197c243e56cdd84bb516e94526d16ae4eafad009c8fecb5a054829015", - "d3da9ce330760e8e48aa1c24d3516a675b5b197e1a410e4826295df83eb6ff44", - "9436bb6f368dfe192d92a8f45e2662c592d4cb951acc13b5d64ce35c473c3b47", - "6cb4915caaa09730926a728e501d02b89a7ce74d1dba4a98fd38bb49a8e25a67", - "ef72ac7befeed9d40cbb90072afdfb6f9ff3321ef365f73709b646f46d8faee0", - "39250b09be537963c4d6dc8e5014e6be49408bab352fb1ebbb6fbbf337de6f5d", - "3d357c8063a72564ff00346ea218d2cd622c927dd0df954b33dfed24a5aef418", - "3bfc4bf5a50c984bc8d3f6cb255861208708f8936c37ec9d94c95376430d5fbe", - "1c72a4dd8f60bb46b44c6bd11fba39f9836a1c1d20b44f5179a304aa933bf6c7", - "80966fd1ab3de7e555ad81c184ef7492d27bfa88bb4e49f814c0f50121b90fc8", - "2bed0fdbce5b042ce9d9e4cf75114a49fb0a86a291d3107f8e10d29293e5932e", - "55c72d8274bb1ee233def60bfa486548e5b78b4495dc7bedb1f8af69ed7e14a2", - "8fe07b317973a41eada54e74f2c65b5611e445cc545cfa36401b7c9a273ff11f", - "77ccf9cd754bf4fff4e26763e522c00362a32f4f3da9dd13de51bee6ba0d6798", - "a7dcc597e08d9d0cdd114eb6af75e7c5446d20d82d5cc4ed5f530a1f18f7b653", - "4ab08f84503500e947d4ee105834a1a8c49e7da2e04eeae04f57c0ecc1798a35", - "1561052d43a611bba383d4f800f05b7c194970d11a78c4f886a647b0ad587242", - "a004c800aec2e5e7f544284f137da3f67e7954881bc2c14556aec37aa8cb8ebc", - "0fac80a9c10ffc8ad40589f3fdbea61e0719f6a5edc5164600c306220c6d975f", - "1044cf60cd079804fc944ac720ae74853bd71062180f4a9d510de28d51a8f341", - "1d465372025b5daab2944c1df372005217ffd621d3fc75302fb5476a039de129", - "114570e59f02fdb40dc973ba42da697901fc5fdae99f9871b8060dbe99c65c8f", - "4894b9229e166d958f6021e3b5b886e9592f1ef92b4beaf44baa18d99e9d1993", - "7028ecadb518c07c98ecee753873b93d48b4f823c585c675b9405afa62cae77d", - "282e717bb8eea36969787c04d7f9845d5d085b7e541661da5fe421e3ace1af89", - "abbe9a17822a04c83645c1011d3684797c5b0002a109a9329d60de00b91b5773", - "72506ff1f64967a37aaec1607b05f8b17e71f37d875d9c31414301f3f13db3b6", - "396dee30c97a8c1aa0f527fa060b505fedb1686f3a6451d795d92a53554d658b", - "ba2637a9ab721dbb9a1fba4400e5a2b7f296fdc2b8e70448ff38e49859779034", - "de70a2cc23cf079e0dfa14f97997ea3a48cd664eea4e5d9acb8f3c56e98e4849", - "50ad833ae2a1aaaa2938e6b31174926d7ffb493da513d7c914f69139645fc705", - "47edaed7b9d01e185a2264200378f76caacaea9eed005b6eb5efdf38d1d05c56", - "daf69035461215d7b7ddc03cd6909e87eb62820e91472fff6879fd8f1ba01273", - "d27de2d8bdc54c91c71d07e81a61cbf74502a3181e3647183da37d2b183925ca", - "d14faf60cae42155a2c9ebfc33c7813930b8770ca7c9822ff868f17eef3b0d41", - "167136be650d504e48156418a89d7f9d7c47d9dde177011cf197c2d321461c60", - "9c1e9d7002a0ce602b5db0401faee8aa7c70ebe6fb14bf4a7c909d8c08efebea", - "2d3c406b80d049f743c3ba327d73206376ecd8780320257aa387f1d7f4cfedee", - "3493e7f08d4940cb6bbc8d2b9ca181b9cf0a60a9dab5f750c65527c7da9f1f4d", - "e637658e1bb6f33ab69b2209917e26e96293c6be37939aef385b110bc9962a4b", - "a0a62e27098aa6f2bb5acece461fac87ef9a355106a1b4a295f7c48897f14251", - "ce51930f7abad2286a52f31f7c42b84c033ec87d66f8a524c03e1f9def0a2467", - "be07b81132cb00380b45fce3e400d323aba57bf5e759257fe45ce802c3e947a1", - "1d51b92a57bd4816a7aab43532dfb51b04bc21f76d4d90c58512ffdf6a5e0311", - "58221b2f6984c2318b94657406c6ba60aa13626a9f9db4983b9e8bc8736a01ec", - "a563683a8278fa66e4ce855f736ecab892d51be7acf500c86d039ca61d867f31", - "30f542eabb58da971f9bf407664d4dac39942ae2cd5b11c2fcede304d679908b", - "2804e792b6558447d5ec198bc714081019838c9452d0c56a697b3575018c1126", - "6572062e012c7a0a0c7adb1d763b66401cb469ce40cd191dd780429e443deeb6", - "55d061e48d94e739129fb281a87c33f8d46bf5acef835d0a827e48bb4aaf3adb", - "00fb7733a1ae27c8f8e605b36bd850f0f594702e2979a612c99131d4e88f7792", - "4058fa6a75e1f083d0df67ddaabfcc2246aaa009ef8fa4dd90d316e39be1015d", - "f57e1fc1be3ffaa3d7429c91fec55f41d4106ef4b0857581c83f3b7b8dd8ee12", - "0341a03d569a2de12e24552ff6123f6d6899bcb13664eba8571550537b34ebec", - "b12863d40a410b61deb0737c290265ccb5530cc130e48d516bc25d32a972f12a", - "18c09f79b135db085e3fb1266be1842849a637bdf20111935a7821fb6853ddfd", - "b2d189a1397c2b7d92c563267995e7b64f7b50062189e521c007f654e2ed2376", - "d4c84b8d14c003faab9f222520076bd2df9f7d0cdd998480877627fc68de531e", - "748127307e80e21ffc19dee4172e4319209ca3e8e0c61e274192b131df56f899", - "fcb254391c4c3c749fd4c28e0d045f06b0dd75bd50665951e597452ac51be005", - "8d8fbac8f509a01616fed000b432246dc8c188f4c640b66e8d42eff0f9107016", - "3958e588249fd9fd974bc059cafb2fe8ce0f68e0ed205fd2d2e72ec7bf2daae8", - "25ff0aaf4c4c262adc553aea6086a489ec684a704b1d45dd2ad9bdcdfeff4b73", - "c63be7f1018f48c23b3f27873498e1a93e3905d4d89125d63470be1bd6bb6b67", - "b3c78d7404832f07c546884ba2444c2cb2414b27a5f91bcbb0120029d11d5fe7", - "207c4a61ec87190f68b61d202d71d6b92e0de34917c4fbdfc9bd4d2b81a9ca33", - "34cf5b80c00ff5662da72c49c33673b10ffc776e5f701e6723a870e4ba136712", - "a0733465ab3fa01358766cab54ca0ebd14f3c0f97c9a2e07e1c78818024c419c", - "b641befd77daed06e6f959f972a8902accc336dabefbd24342531315deb5dea2", - "0f989945bdbc5869bb4fdeffa5a197de5237fb0e0dca5a7fed7509aa7674c58d", - "c090e3266a2b3065e9eed3766b1fd50bf65115cc7c63015f88439858894a3b59", - "006db8102e67350e00ad7f923e97b73ac55f6c0bf8cf9ed7e8fb8efcd3950a08", - "9b934dfcefb3cd3e80941f1baaa7b22ed7e151b3eceee0d7e2e3112f6bcd17dd", - "f36c5e8ec748f348bc88e1e12576c5b28d6a30e8f9f32d7ca046322d5a296b4d", - "517d6b663a04427c6ec6a72a1cb399c92d8bde809f42568d22f7384ca532d1f6", - "9aa5a40dd2471cd63ec506f58b28a66385a968377f4bfba8036bd8cc2764a4e1", - "886849b7d0c63cf97dcd01d300713dac0696b266c6cd338c50608b5f62b34714", - "24dab00585c08e529a2cf14072160f577d08221d5bb68c26184fbb4e7d2d555f", - "578fc5aed6a6ce5aa15ae5bbfe6be17574642b864e6fde1d14946ba2eb58aaa6", - "b12e76d4ab679023b067ed43e50d19a7b6d8bb37fbe08a8c1186f6b0eba0af75", - "ebccd6a82d665aa6d624ae285fc5123bf479d54dbfee8f7c2f3407e8b1385df5", - "b45bcdf9b5059e0352dbd5d4d0ad8ceab19f01e3492123bdefc41a03d892cec7", - "3452573ef5d2891fff96fdc0167d9e7ccf56f4a86c9f606548dfcabf7375ebcc", - "8bf8a9eb86206be32d4a83cbcd6c442b80c0d2b78172ddbdbb362f4e0c88ef6f", - "c04f561681b9145c27c8145f553f7e60afb6bcb08eb937acc5fd69f118400089", - "226231e9fca0e6aaa4b61e1abf41454b5576835c230efdbd734f7d5efd2ae232", - "bbeb6366979cde5b3ccab19cfa517ca41f86f2e52645602008ac93c081ad2273", - "0fcd73baaa9bfaa08a4a53018420648f5c2cd16dfc1a021bd2e123255e794361", - "15aab9a1293a48353d6231d8b09ab02a628928d9433dc2cdf066dc47eafc42e5", - "8df28a26e48a16b71a2884b1f45487ad4f47ad725034e24584d23800f43f44c8", - "d0cb83eb20163ef2403e86ae9c3806038b35cb6c2af0d9fa778e64d2e2548f22", - "ad9dd52630ef862f210c2d2e3c90a8c3d585c2b36c780e1a835d5e08c571b842", - "05efdffeaacb778be9163d76a550af52b29c8e373e0644051fbd73912e67c8fb", - "4e8948d0387df3dc59fb6327f0ebbde4c271a540ea2eedd166faf0560cca0202", - "2bcea86759f5b6d6a7a9b9f3835e3ede299661e98d92ca0ff272e30823393524", - "eca303b3cabf9a399ebf374a706837dbc7bf61375980c7e00083f31ca00f520c", - "837368b7571651cd756ab67228d39a1285403fa38398035f0e2df7d04c42ee67", - "e3b0635368cb65c395b94aa6d70073265f8511e06080e4c0963d72b6ed87b4ec", - "698f7b6263cbab03bcee5e56071f568d3c6fce560265d7c11c70e83ab74bb0f4", - "6f816e72137b4ed8b0fb9e3e0495909559e551f7447eedfa64bdd0d412995d86", - "29b8d220afe04881c927dd6585f85447662094e25be7af070744185fcd6c5498", - "9f9da330dc134b02021c3a2b3fb24044da42a10b97f4c445d74c3fee1550c0cf", - "7634a89331829064a0afdc3a7f9003f9c92eada6e8303e345d758bf985f45269", - "52992c9c25335778fcbee94e0bb51dd3d78b620f6ee057c3aaf680ebb112945b", - "d14dc949fd46289f39fb60eb4e8d0bd18bbfbf230e66f353c84ca646abb9dc44", - "08dc172ba3d2843dceaa43c5edd8ba421362731a8b050553ecca88a688326ddb", - "10e506f8a4d76fcc68a67acbe721a253c15e1e20c2d20de69224ee1c09779984", - "d4206afcac574365c6479bd511f16ac8195ed906987618bf4ba6233477e9a700", - "d6ce55f47787246e0a01d6fea9e51c51e8bc2e22deb60588319992573ecd06c9", - "53f4c5442234178b0c5438d2626f3012dcea6a85b10ef637f4b446bcb4efe962", - "eee5d7f8f12e639b0ee35aa65aa4e94e44317217751518256bdc0236bdea6292", - "ae7000c4bfc74158414e3d30428ed3a541d854236d7861cac0a87841cdb997ad", - "5cbe4431094df3f364d5d3841309bb068e3a231951a6bcb41c0042a1bc5a7e27", - "833d431d1fc5e429bd020de96b17ac9185f6840360c0592f3584e47f135566e2", - "ed89548af8917b61922b17b17029cbdfb09e757c8cf17ba0b45a906e32d94751", - "53c7509ddefb07ef7cf7e232be44d633e9aab3b91abc37d9cf5c7200c86c1285", - "de40c372ab756f935df595bbb91fb972ad10a5c889095fd5e8b59acf9bb2bca5", - "db52507f28dea4130b682343046f4a745991969e745ba6a02ae2684fd9024593", - "3e82e5d0d13076dc219313c90ee07ac74613c60f49ed4e8d83c5edcc26617000", - "48f3ed90e4280a2a874f14e472543b2c246bc27cd00c36d31720ff15eb4f0e24", - "71c961fda72c5366331b371c6495f75b4c35b016d903c8e0d68a8bfbb42b309a", - "0a6c694f22cab892c3abfb42a53392f9465a402a23a8b0d01c937deb24d5a006", - "48273108db33f1de25511618586bf59922b3645e9ca9ed3f71285dd2c5752cd4", - "aa79e4b3612199ecb3e2c2cd7c91ece844aa9e7a526f5b038e368a954e92b7cd", - "80d80bad81fee923d86925390759623327f458a4b5c51d9483456f41e06bd234", - "af7c8258bf8d691c51b1f39b5da974196a3af865be30f18586c3880e3189173f", - "c8caff2ccb7b51bd6c7cd37e3fc61e864caef1ce5ef1e658bf3c1a807b173c9b", - "05aa3ad5b02294c8e85d5b94d8180ec1cbc5764c47868b136a48d93e9202a43d", - "85083dc70b85424bab2db285c12dc980d3ff7abe95787907b9f38120e670f06d", - "61eba4cc8ce6a6386dca170077f723c96e2c5667accff1b4d1a4117d937a50ec", - "a59ad24a29822e3e952e0aa2bc258649811fb9a8c85f0029f7a0684849f739dc", - "358b83a985f2ec9beb40393d1e4c06bdc60a7e59b2002bf43bc4e66ba3eb885e", - "258c0f1ddc40d5d6eb72ebf2ec9e4721b1f6438fbb20d36fa74970ceb6bae721", - "7d41b48a140b17675f216429587024b9328506373ee7e99394bc03a9f50d1dda", - "0a6c585f3e4001e9d93ce22dd308e63e3c49455da9bb5dde6550f0fb1a3f6ce3", - "9055f584827c23ac2f5acccf01a790b8e6f6d4f10c56ee73208c2b91324c4e36", - "90689bf6128f3ab48db433faa0f07c556bf30786964d362959d872043ad0df86", - "d76ac246d3b3386a4dd55bd5d4bab9ebbaf38af35c2f1fd1610ff1c6a3cfbdb2", - "5ee9f7e5e559933b0a31ed23649f0215d89896424432ea000f2ac53f35e001d7", - "915e75a1c743f9b470d5e84c84361c7457423a600c17f42caa3a25c41ba253cf", - "5dc4505c882d719bce6333d1a001b4d8728689ead7516e66c031f2090bfe2749", - "0735036ddfc095cd5802b149f5c70fb2ddd77b08840c1e82575baf6969a65b1a", - "e9e228ab4af15e8a27ce83b745ff5767f0426503e7cad3424547984b3dd3d8a9", - "6d9f21807662a912eeb5a5db91af114839e73c36ccbbfb48694ebfd7d8583887", - "6f6929a2a9f5f17a6fe35f50e16c71a6c312477c5395a18233d3468ba190d0c1", - "e8bd15e8b44d116d5445f0ed7cf9ce30034be99b65f9647121a8c14d83963f95", - "9eb0cccb6046376f98a3d5fbb3572d535578c2a2f004cdb4cbb4c2db6fad4c3b", - "51de23513f02b5e108fd7c0a815fe7114e5761dfe726ab74be3ff272328ccf88", - "71582e53fd952a0300dfee3e257d7b0049cc9337d93207fbed20e07f54fce075", - "cab179178cd7b94002a6e3a5016e1a86a6d9643b98146dd34654653b5beccfdc", - "7428f7de3136181659bfd1b72177eb670c1822b071a46bd10dd23b9a0ebee749", - "fea9fc5a5b4c22ff5b651687944f4a2c80dd44684a82bedab17f6d9ed647fd51", - "a36d57f9f88e3ced7637e04f1296daaf40e25cae32bdc5af627601f87dc79e7f", - "be22d3f3fe673cfd0616558a0b2e37d084c8242a35192aedc2f28c1e0874687c", - "0dba9ca98ea7dcc67c4ace2c84a1b4b588ddcaf083abdc51fcbed2c165fc04e4", - "e199886bf4fa9ed97ac71109c296fb3e2a2a3f1e98b6a94517bcc8aaa4bf844b", - "52f36022ccb8e8ec45f5f81dd47c32f6080083bdd4e05d9c355d904fe6724dc7", - "d7c328f7c4250330dd14a792d745e3a7334f7b75417ffc6cc44b71eeb6e5a0cd", - "18930abe8e6836ac6099d8752957a96937f1e75664d757922ce4d1c65c5587ff", - "624d3d84e494e3d66e000f4025061096c49787d2c716c4596c9cc3c10b4f88c5", - "5c2a7785a8df1e356556ed38f630065b0e6f6758e6347dd52f2297a9a4be4d92", - "b84417d011b3722f7270df4f3125e23d5c0794980744e731c0ab7bc4cf8ca2ab", - "e8470ba7fcc12b1d62afffd11abffa44cd0355a81bf48e81c2b60458a144094a", - "ffc8b343d6fd8bdeb17b5fd544796e1974489d4be567732cbb7d07c19c6be820", - "32c19108f03202b1c8566a1db39cdfca5ff177786823596dd837fc92c697cc64", - "2993f3d32cdea7188415a793db4876de660f086c9e56413e0044ce8462f60aa1", - "8fc1db0d600d3dd5c0ff66a651d7ecfdd80d46e679dc8f6cb6d5082c53e64933", - "a61c51fc12d554d9b8c474369aeba8006d0d09322ece6fb1435e52391770d320", - "cff93018f9f80423098e0d2a240e26f4ea07755832177073c9725df042586e4d", - "0738f3406f9494956cd4226f0e65b81cf28878e1cb29bf916b29c2af5542cf1a", - "ad829512bb010978dd39c9f18edacb7b2222580f708b7f40f4cb0a542360c912", - "665582759a0e8092183d78b986c198706f138807c757f2a16196b97d596e6afc", - "4502e4f1cdb8996adb12a286bace2fa2c0a040fdd2e580b5c0fb1d7f24af7b09", - "bb590e31f7233c25a42aa932ed098e5874f984fa1de7c671d5533e62e77e177e", - "a140f48762624f02b9b01a0be419fd34a37c5bc3f2c0dbdf0d8186f274b2205b", - "ea346af111370aad2c9ec0c93b59710331e9af5818a36942d58a8af2331a3de2", - "bc6a3d6c8ffaeb1943cb57a338e70fe8f828f09e7d2fd6eb709425cacd0e856e", - "9698c067dd570cc0ce5b0d5bfad4ed472e4ece0908ddd941b478e69e86934bfd", - "de993c34363159d65e43506b04ae459440f2800eefdca27c980caa19944defac", - "fff2757ab3541658115720b156320717150a2dcc0bcfd89d52e5ecbcabb2f859", - "774b0bc138659c749980f751bd12ba42d81041745178492c494d0de2dd5a0600", - "4ea0069c4f8bb50faa3674b3aeff28cae8d80a24dc292ddeeea68fbda0696b01", - "44dd73e9366af9a668d4d30f38cf7c5b2e3ca7c45674b587999eda64c69d1f35", - "3d93f32cbc9e4d7e3c1d4ff9cf977d5de9ccdf1f859612ae3016fa7a2f22c22b", - "56cd2607adbc22d64bd809ff274366347d822f83d63c37731d11e982b8cf9942", - "d76451469df26a3d232da3c1e31e50edb3eceb72618e5bd27880ec0ab572432a", - "91089eab7b750417a7e26ca86e79a94d444a6001c4f8d39a6c3ba23eb93d3fb5", - "088ba3c5fcc0359f03baa15df191298d441b5ac4919b915f5875c878a7811cae", - "5f6b9b16f68bbc623888af133e54029b5a43a59947a0f19e460276977df18727", - "eb105e4acb89c0582ecd3603e519f265d16c0e0525a9d58bbdf1a0c5732e4508", - "c7eb33bc16ee3b76072cc107e132d1e7b2bcb9e93d07580abb4063526b7abf32", - "89e5cbe7152f23b21b55e4ae1b648fb8599fb1be5a3da5a1efcb10aa2d762985", - "4c3083401b6dc2d2be5bf70445e5624a479270dc94cd2cbd6ccf8a73e00f8cc8", - "2408a2cd9adadc48c3289d5d69c8afe2b02908c79131cfe8d5ab4186fb6798fb", - "513a6494151d3367715d2d7c03433189b9d586488f61d14cb1d4299671dc52c0", - "a96ffa03b968d4de0dff06c7328a639aa948fe5966e34b2aca78e6a2b4187e96", - "bce3489270a5f9e18a5d780e203dc7a2b2320e09c73b38556f69d04ad65b8ddd", - "b41717015057aca2f3cfb9b3079afa3b43ac21e1e9aa94ce411ebb3260df35ed", - "61e5d93ba556ba1f5ca43297435a5fb6046adca2a604225e490ed7adb5b0486c", - "4f3e9cc53fd778c3ae9cbc2606cc4bb198d14aac2d69c4eaa7cb0712a4c38ce4", - "a70d06dec90ac56a0be4bf2e2f8fe4fe2499ca1487ba377ebb805116e8f6d9af", - "cfc3545ac7cc50a54b138814d9f9d075976e0ae34fd5f716514e43fd2dd51ebf", - "716c29bd42187cd4ba2d3cd100e7496b796949ed0dfb98fd9cccc531e679dae2", - "7b9daba497c4da0f7405f0b7e263a6b7a560c3f55611aca6e1d930352ba3e977", - "11e9a8d31bbd01e5797f3c54b99090f0b4fa7c3bf0a9efc1f179c6370b65734d", - "de9a8a19539819b2cdc6a7620fcc0819aa11ca15838222550213a77ae6cf8548", - "1b70dd948f32f6b54c70dc38e7e5dc2fa6d86b3d38f341342c33ae00581fa815", - "73c30450d9abb7e9c045fd72259186e0df85175ac4bbed389a69a1683813434e", - "d119fb0d6fe969ccb1c2286023f416bff44d7cc3211fcaf087c410f1c756792b", - "fb5c4e59b3892b6a9d0d537f504e611bf972e1eee73b8368591e043dd315e984", - "35a65b0bd8d4c8c18032edfa92ef8a22be214664ed911b140e4740283938c103", - "5bbd733aa2aa45fa338d75f656c022ff2cb78cd53c05789980666bf67f7579cc", - "2f92ed3982c1864da7d2c497482e4c9545b94f2a5c95f5ef767819dde6ae2b5f", - "1bdec2b56bcc4ddacd5063fafaaff86bab2a4bba66aeed1bf6a5b7bd4a04b0bc", - "2f0b4fcd32636b13ff0e18182ced759013c71a5d39e94dfa063dfabe9ba77be9", - "6664cdd930ca88c752a17400da3e332b3fd4cd40f5cbe5ff16bbd236e1668735", - "9c11e510a7231dfa1c661dacac6c8994c699fe67526c06e7755f75e581be3417", - "ae0c3c27cff030ef82e1fc6d0157527f043c606b8971946d6c8218407e007d82", - "c4d8bf4c22b0c3e235475c585b0b40b73165a37cc34e64ed2b738d0a0a5474d6", - "0b3533f97b58473d6a9dc900cf3e81ca3ef6b67bf90b826a21d6c8a54fac00ff", - "0293827f386445296d98f37e66c33e6f2ff6082821b57130d863fe9f65e0414a", - "f61f90d53164d887b60249cc8ea2bb10738bb0f2aeb47fc82bc2f97094a8e926", - "9de2b8f483304814c4b43463e1a393ee2ed1a8072f1153ab2a4740aa1a2ce03d", - "b726fb12a8b144a09e75622acaaf86002213271dead9c24850f5ae824996a582", - "eeeb7be49b0aa10c6197d581dd860bee1f2eb5e12e2a692e62b15216f4535ca5", - "58700da4651d511d5efeba8fa4c6a517f9069ca6f5185efe83de69318a9e0595", - "5eb4b88951a6ed52507bc1e5371cb2926739c5f1931cbfc2aeded3137411c7d5", - "fbebdcf3b632d5cbf4e30fde66c0aee751993b9becf34aa9bacac9a1dc3565a7", - "34bc0f9f4b97e190956bf6e6da1a7155f9f43c7d7fa7128c43050a8fbc181336", - "2ad761afb24e05f8dbdacea080e664e97807f3d344968a031e7846b18b0a79c6", - "b72f64d46fd3667b9b8c89b08373a94cfea7040a1087a0a8fcb0cf214a6f3ee5", - "1695a2bc5943c0d7e3d463103eaf9446fdbbc6d547c5476360dae9ed7b4e8ac5", - "17dcb05cebe1438a1a27f5635fe5a55acf56fcd0271202e63111fe7616057413", - "c78c568fcb0d8c0b9a54e3a5baf25e79ffd35c3fd1df82219b7b9c908b03a708", - "1f80423f3b47e7d751d3b063814e93a6792395517f8806013a52eaccf3626715", - "e25377b08d9a6bba287da49b617f2f5cf5c6c1d15ae8a70a34aa5b72ba236ef7", - "eeaeac862fc7362cabcc23bfb5676d5419e2f7b693a7b65bc4953b55ff0d329d", - "cd68a216059d2c2b52c0fc2091db1c7fab0cc3d690c31c910bcd1c6a65fdc623", - "c99ea024707e5d72031adc822f56e2ef2704d164a6986112fef354028328b655", - "869ebc6f7bc635e0eb1d3823457559cd7e6f7702db81c3372c5dbe426f5c35ad", - "e425e47b1e7a1601fa274d83635d9040ad158b42e9f0ffd4893bd77a2da34db1", - "8c979abc3f822a91d04a974ec22f295b072fe2f38859f889f82736100f203243", - "9750926e2cdb3398ccf6af7d8be6b09d46887ef845adaa2c7d92c7498f5de945", - "e89cd42dc50295e1e5dab63637d2bbfdd51c2375ebcbc9d520ab146048323aa4", - "ade22eb5425c5a9fbdc3525082331a20becf0f8cd992a203eee1fbe030166442", - "af8cfb3b0cffff1e6cdc64a2df81a904bc60d7761c96a5f156b440a873f4eadc", - "d903c098015851d0750249810b5660b57cc8437736d5be6bb3faeba34be60815", - "8eb9a4f4fbc1463190f583ca1adc7bff5f308479fd7bf53b1bddb6fda68fdeb7", - "eda4c840ee9a61e9ca35631207ac70a40ab6c79651c28d10101d7a63b0942bed", - "53f9e39144c7116be733deb45ea440cc6a2f3bcea16f49904409c9c3260eea7a", - "914863b3505498f06f4be70255e24b9d36181181ab17e2845947b424de3816f3", - "d01bd049dcc272ce4e225981f0b78f74c774fffaa01d0cea2fad422cf0ef7e73", - "8d46a447c1f77871d5889882119a18da5a2fdbcfb9c516cdbd3af8b9caef420e", - "15a939e6c3ae59541a851e02d5748b1f1aca713067a044ef8093f525cf01bf07", - "92c5eea7d9b4cbf53ace6d41749df1c3dbd50cfe76bf59443b64de8bb3b33d4a", - "6dcf7e0358346f2855ced901327e7e736d2975a9883e92a5778f48601c1f7cf3", - "ae98bc0faef314dbc71e2f862daf59e5da80cbaf3eb45504e5cbd0ec4eef38df", - "f18193b0b82cee3b64f7a4db60334e282de945eef90ea595783b1e7cd3165f34", - "18c9dd3a3de62f0ce147722b939a8b6b9031fd66f1e53988cb478d47c092d2cf", - "1211acddcbb10055689be89c147f9650f9e448d6f99f95028e01dc792528a055", - "d1253a97b419d0dc229f61849441449f6bd8b115d2a3b0e72c5777bb2fd85222", - "127a46354cef48d30c638ecc3062e8b0b57e8c167ab9242fc6bdb6ac0f4ea185", - "95aaa894c253cdbec87bb51e13eae4dcf89ddd64622561458dbc411cd426736e", - "28823f0c17bf269b704fe96ee764f84be947e87ef591c4daee4aea402adf1edb", - "48adf3669221c23215d16e9985620321b0454ccf85cc2a5bb9feb45f0db5a61d", - "c00e2ad48b00a96f3bcd0e0c79a49cdb82f741eebdf0202b004b0562022549d5", - "e0824faf72babae0b0ede2853f2d548f782e2df14f1a8ed5f9d4ce0290b4c760", - "716080cab64c6bb5bb79561b8d919701889df7626043fa9cc00ea0bb5a20fe46", - "a4146d21aa48a90bba9efaa67171525ac6564b9b8ec460c283a188b7f9cbe613", - "4fb78ae6f7aa32b08c08f36ca4aaa8240b46f2674f0ae2e98c73cd149b994deb", - "658603246f4d91913a717cf0640d0a1cb7753b4d45decc2f171705e0cce08f35", - "fb033046a457457413100401eef9aeb66c3e4859adf0d73bbb96310dcab40abd", - "ec483a1cbaffd9505ea50ed2140d28dd284fd2b810f6b4cbf3dc7c8a103cf890", - "1644afe507a9383c95721fc202c6baf6ce4d401a9e80322b3f7ec99289640a73", - "777b53b672603b345c428f2c183bd3e0981c1b7e35983f55f5b64b885e64f0ec", - "ddf182960ff383f1a8587d20f0dff83df3d101e2680a998c922309ffdde37d36", - "67ae36c2e45e97e3f3a4116c71eeee0860c22eb183d887dcc957d0421de97af2", - "9714c1adf0057b202a81dc91fc1219e62d39dc590891f9b9cbb982bfd013eb01", - "8a9a7c362abcc7809796f6110c496df800d7f958ad9fc2202e8b6357a6affd28", - "c2035464c111b00393dbabdd251f3313a3223af12b1264ed9d340fe3c8d13306", - "0f8945f6ea31bd542c604e8229391c79dd65ffd88aecb89351401f11a0f3572b", - "cfd0b7c8ac527a1a3e7840878815e164c34a60b8b763b4048cba3b9ae7585c26", - "47894dea9a67bc7224f1acbe1c7ee1e6256543fb901d7cdcf3795eeff2b209e4", - "e9767d0899078e7120ef227f078c688ee84a05eee10a73e45e71fd0f092b32e1", - "3b26574a725968ed6fe9131bd5432c99284a3a4dce5531bb7a578c30474717b4", - "1b13c0817c7325f4adb0defdfad1bf1a4a8f86a14f7db8f0b0331499b6a5bf0b", - "cc47ed9ba6b4f102f747d50cb1fe6b3ac09a308088ff5eb6e32ac2bd80399b46", - "6a6683113a4acd4227551753b3ff1c7d2b393465d5adb702f476a6c4523f3145", - "5f98afa017e960f547c5dcb412c7f4778e5a5efa5060aad58f2eb32cb90ce9c0", - "9c8394199cde812a952534b6e0366d2d8f89ddce47ee12ef16e2fa18cef25b0c", - "294cbf956a927c737761798aaf1b8afea01990b25fd9d85620fafa7437cba711", - "00e0bd13e1678ba1c76eab9841a89c088ec73b1a68f7a2d81f82f5008e5f6565", - "59e0dd286510cafddddade1cfb53a99c77b35589d22324ff442ee9b789529213", - "5189b4f6c8c1ac8e1dbb36c5068a6f2f7c33bb8f63c6085cf87cabec2b991f6f", - "77a1e12b24e98519adfb8fcf08c4f412acda3321c0e393bbb7e79f7cf020bb02", - "6c6da1f34efcb68aadc920a248ca3523353be403c9071f671d952b55939daae0", - "c21edfe06ae303aef10c86a1f2523a4aec8e13f084d04d2aa70b6eb949d43a4c", - "12a9c420498c00892fa4581a45d2139ab5a06ce73e0cc6ccbbdb1ff16536f0e2", - "500d3355141cfb28b1c40fb26c9d56dba463d08a301b33004b4d229b28e132ea", - "4f49b60bc28061b520f160d7c44878b9d86c333a63ddeebabc2f38666f070861", - "2de84b0377cc44013f6725b3fd360461174335136e5e9433db9f71e718b105e8", - "2dd5a3ef0d7b7a69bb09b7620cf48b8a1a52f9f0f93e697dbc561541af782606", - "cac6304ac47c6bc901d7ddff96aa35a0ccaffd7315e939a01fe85e9de18c81c0", - "1db3da7b429fb8c1046942dd195961950c74be2e9514e04ef6ad9f3c081dddf9", - "2286f8175555c8026ce9c1278588a95abfdfe09eace57c1662c769a686524853", - "a7753e80638d5f884ca9ef43ccaac0732676c4c6623fd24c9d7fe998c7e47cbd", - "d119a55a73a84ad21c973e0cbf9b91176475813f7d65b664bfe7c843714f47f8", - "bab81ec0140dee995341f3b5c0fa3d2214166a6130836dfecaaece44d212d1e3", - "c92b073ee33348ec3311f22c1e266c0e8c520e03fe22e69bf8245b2d0d6fa5e0", - "a52ee63a1c14780e8512c2f888a88aea9e9beda2106747e0e1e4c52df3ff2d9a", - "c16c7e489f3d038b6b7b5495bb4761952e6a36da7caf4f1a1ff122addce583a0", - "835eb5219e0dc09100dfb8e79efe45b36ddd1b220f2f99d3679cc97198e4e5e6", - "3058079db36f59c173e460b47219d6ffba1391d912b68b94eef1948e2224c0e5", - "9fd4e788a48b295833d2decb21512a804a0ee6b86ec19372b1a57e988215f60e", - "b88b8a1a362e1f60f8b852eaf2c60ec02cf49b1be3d3f002992d70f481cb072a", - "623b19b5febe7c145323da85e4f2e9b2f2bbf7c57a54b9721c640e0e72eea668", - "63fff0b754a8bc5e5aff37f7ac48a08f7db1fe3a877c79085f191c19d996f1a3", - "5ff912de6a3e932cfe201a772680db688821f74fda124b0d9852b89da5b7da8b", - "8647a7174b47c366ba5ac13b00e3223c25cbd0c2ae0771ffa285444ac463e7e8", - "20e2a615cca1d05644c90b1547981ae71ac194fe9720263f643798d695c311a7", - "0e3bc4c15f562ff98439e7ba2e8e591056093c6e18b6138127d819cc87b5547a", - "d578f29157f424c3bdc6082ecd4bb70cae9be1cc2a54ad71cfb3224611fff730", - "005c3558dccef31f2327ab76f0d98e1bd122b97ee13ad38aed2446495e2e6e54", - "7a4b685fd41b4b499c3226f86d49290df6a406f9891d28be2e61a9261a88bcf3", - "1053887f99cf38bcaa1a669cbce537067e3fd08c024cdc016c5391e80d143a19", - "959f4fcfe619baba42657ab7322affe0721007e82736ff7c830aa63ceab7df4c", - "7ca455363294a8853146fd87ca52a8f5e47e5dd115321cc6fa0eebd56229de30", - "1f52275eceed8523f671753c66caa2ccdfe667a6048425399ed6a8f1270f5ad1", - "ffbe5b56ac761c1032660d439c61b59816da8f89f15bd602f426900c8826ab9b", - "eedd380d992741220b759d2b9b42e69c17803163a8f08904d29ff3c5a3c6ba8c", - "508d4eb35ab256278e8a2b3b7b7ab559af5c4566f7d79dbd6d751478eb239856", - "faf69b2b3419990b41c0930f5ebff1bb2bb30560695414c1512e435da55d4ad6", - "17d25cf1109235050dceb200817e2d7a4712b780aea2ee4e194af79403d4e99a", - "a2d15f4f1bd1865cebddbf4e29b995ff600adc582605e14723d52f7f776273f3", - "befa8a867e398d91bd947e5e58410213d658170ccab56c016a00c075a29fcaf2", - "66cc1bd5439660dfa6b43d60b2f0152704e527210abcbb632215c607aba87264", - "517d5a51854d9368ac287036ad395d78e4df0a2b6398b1785cf69a271058bb92", - "1399540774d2b9348c450f649e734acef240f8947de5e22431945420b17333ff", - "17766753b7346e94eb109bcfac32b26cd8566e8715a33b8a2a3ccab41fe19a5f", - "3352fd80c844b5cc706c6ef950bb45afde9c208c50c9d181cc163c69d482620f", - "86ff95c95a07f5e15dcd785f64ba42463a39cf974fc9dfe01855070d33da1783", - "cfcbc2bc2e88d6f498bbb06bdf52344849bcf61f5d007225c8ef70a341444730", - "c76c42563c924f01a3ed93d5bfcb4cc94c1ae03ecfab129c961f13d37b698af2", - "f47e6d50970a1d0c7b0b215ffefd93cbe077c73a925d08752073231d96ae0c70", - "08826349a45a17fb6241ef31ef3690992311d43e15c8bda470050a4c367101ac", - "abb72976c54483f387b47c663c21e03c6858870ca39f4298ccfb435060b789e3", - "278f2afec227b84df3c6811f3f912fe8c65a671d11ab49f68a1d6d1284b1f414", - "3a338f93f0d13f1abb46735e0ad8e7f4a73e456c7123234f328d7f1961490045", - "a554a6165b6efc952ba456d3991d57a044d1b7d6cc53afa522af81d1efac6e95", - "5836e1833b57eceb7d1ca138d5e69bbe7f4c6b797e86be48e34f71cdd832a34c", - "54bc875f113921a291d2a8fbc526a2d822976b07872691ef2802e2bc5ce2badf", - "574da78179ba890af04a98fef060a420ee95866fa6ea821442546858da046c47", - "70c7b83fb01d040285b1f94535eb86c00e896c237282e9224ee16906c47ce364", - "aa5f7f60ff6ce72b0e11e49b11be2b4fd609650393dec16355a864f97d9ec6e2", - "c47f9b6a54299c9681f470cc71cde8ff701090084d3d09ec5d2fdd4b50eabf6f", - "bbc52b523b46a9c65b0d0efce789e38250f71977512a175ddcee18c8d2a90088", - "629c929c15871e4ddca50861c7f796696b0d527b9dd8019b9270548b5f544f95", - "ae823e016ffca4f4a2d15babd6a1c8453c565a7ade521f8cf67ecff310d647a1", - "794217d4aadf84d9a211886ed7a97e115006bd495c136ba1dde7283ef3d52191", - "09f94a34a1ae2bf376528514133461ae319c9ffa68974873b4d45f74461a99af", - "0eecf4be71768fefe50fb8b92635767f667574ede2a739df3b1c03fd3222c5e3", - "3d8cd47815371441eda72240c3d3bcdb9e6a2cdfcccb252563df95f0694e7aa8", - "0c34e9140e6f8cde95a774f186aa9c9f74ff3cb6e383521b3e147b503a1b6af9", - "9afa6528d79be0ac837be5204248976a01a5a228b1bc57f7ac230027ed1441f7", - "81ff43fe6135f393b5bc71ca1eaf3e878bb07ef564eae2278eab300858bd28e0", - "f311b46af8b8203e43917b4fd6b82b208dcacd3e53066adb72d95ed09231a378", - "ffa157249a977ed106ff8a065db63145788317208e2a0674886329827150b103", - "6a76a1f489f3f0d9de3f21b906c96e690300aefce61170ab94632bebb65658eb", - "d3b5595bb49389dd92270bff28755f0b6d6317fae59c27d91c28252a3e654a60", - "27d9632ccfaeadf69abbbc9072f4a7a7b9b9a16648275eed37f1bd593caeed65", - "1b507b0c9f5247235778ac37bd239b0d01d14e04a567436c97a3e04fa935d63b", - "ceb8a67f0927cedca42a3184adf9626fe7735893bb98aa3063f4c94bf7bac25c", - "62dc04ec2c52c995b379daa5477a18fdd92fba27dcb6824aede5027a790cccdf", - "51cb0a9442881d3ba1adad96054479e1c943df5b0bb63680af3712b80e0e99c3", - "dc3d74e4822c087d6792056ab8dd8395c9f2b3c6a823adb217a3a2bf7e125f15", - "a7b1dc3f5041ae6f5a12964ea284b65461ec19fa16be09eba8add721550828e8", - "d155c5838ab4f40bcd959098d67a708a539cdd7985bb7cd52e748afee17fdf35", - "78c09162019b0a65b5916a3610a32e9b75f29a42285dbb4232149b27885f236f", - "687dc6bd43fda75eec0992a936bdaeb1d22b8a5493f3197d0d213bcb5f0b7fc5", - "e1d512e8a83c01f78192e2b79cf6de721bbdabb5c0af1c429c76d1bdad22c10b", - "6aa63e8ab68e8c9b55f1f52cecca3240611b061191b5265ea6caef71fadebb42", - "b3dbf52f3409bffe1f810294a27066e573e936834bac19d233306f4fcdd2e357", - "5c68f463006ae274e63d0b38fa0f3aa1f109901946d870699dead08a7653834e", - "12f6c7544bfc4245985fef2db4046b3d3f5b06e409c2c61a59e9f1fc9f952feb", - "5aab39432027f65be6cd513d5232467acbdb0353f3605f1161a5ed14978e83de", - "b54c31c9cc3608e20d6991490427ddcc4c7beac552b89e46feb032c0aa6ff220", - "0c34c463530f1b067b245ca5e5da7a7b346c079209b3259e8a3b4cfb83fa4b36", - "7e8162729b29bf5f1ddc7b91a2d1f0c90f7f5e7139301c4f8ade7cc2322c5b0f", - "a264d123988e149dcbeca08e7a67eda02b2920b988d92d6abe3e4c4c1b940517", - "0301970212d5bee97e667a7a87a0b2f8ce3ded858f355e41c63d95a48c74037b", - "a824304bc571cffb08f30da7537407829d9f7204dc4e5d2c7515e72542d6b8d0", - "bf8b729a0adaeb8112c4ff4688d0c50678e332cf7ab0add0d5a825f4107966cb", - "3bafbc039b7ba40a848d3f2f4937d654e1ac701f9c1c937d752cbe7d4afa61bc", - "a46bf38db67f87cb49ee3790ddaf82e9f8bb7df952296c70a08d34a4080ec72d", - "71dd46feb3f636e96872fec91026481b09ca45940b13b08e29355220b5aec0c0", - "f87bb97b77db748314b06b81362c169c3c106c151fdb62ef81cca061bce41cbc", - "10ccf951624263b63a22a8786bed4804ab672c0e213331720c0bff213b6b9d7d", - "f4b943087b14864d6f4136c607b7eb7da9451228a177cefbee1d3dbd1a379413", - "c04953df8a77bbc55eb8ce1690543d6986a292f8872857b86442a5e63b5dbd29", - "556e44fa9683f691c2e279cccaafd8d14869669799f84dc0ee4a45ea69af3d99", - "38c8d8049216c9fb9d9b4ac45983be0dde978f9db7642ab62f49d08170ee0f44", - "3165a3c2279b7e1da2154c37e609751289e0b393cdbc14aba0df76b9ad786ecc", - "9976989c745c9c328a226374560de221f4d82e2895785fc493bf7941244ec71e", - "087fded859c0569940391f27d47a3e5b042c1584b2881737415acba9347170dd", - "47df6307e9d021524269667ffa538ef085fea2d8e8f93f3ac6db6f6b9a29c25c", - "0d429a26d1081a45ffdfca615b8acd85b6d734231f80e35cdb6473030e3773a2", - "24698dd3c0c9a62624b7732a9a24d530a14ae46b86cbafd3bd88b0acdd984e29", - "360daa7cfb8c7ee85b3daac177db36e498f6d8d9e8df7daace0c11a9c0741530", - "5bf36d711ba756889708dd57f8c2d939f30efc8bd7f570bcfcbaf4ed96e00ed0", - "4e0874f917d33b8a48d99a219a401b4c0cbab20630708bdcd18bc4cc700b4905", - "4c2fde7cb699cebcfa15ce195c75823e8d3beb668db1cead25bff308edada47d", - "cb0cc9a429eb0f36469b0ba169516cd465919a2ba0405c2a796a13973b8bc7be", - "7c76590dff0a92174a106cda841314dc727f63359dac6eb95da90f7ae239c7c4", - "94b0208095117b98ae5062088f0da0960ef199c70cd11d469c3831ce161d6608", - "009e7b4b637db77d1039ea7964acd20b8c64f48af7091bc4efc1dc57bdabf2af", - "2b02494107d0096100c3bc24918c7b7a3d60d43a1f5f4e76bec02d373c1ed368", - "d625f7dfc79270e0c5ef6ccd739050ec662763e02f1c13bc5e54b3690c462d24", - "4cafd328e2bb6ef75c4c201c6dfa918a4022d480ec8351370b66886150f0401b", - "63ce2fe332edd20b699eaa9ee098bb41a68f27281998ecfada54b396a9dfcf8c", - "150685590b01010370012554a2ee02fd405a714f895670ae474f23f27673cad7", - "2954491225c6b644875d687fb4503326b0eba8d217e30c53645715a09c0668e4", - "41496edf3f250e775f269dd53f437fb6229a08aa809245a5477d035dc155dbed", - "bd595eeac9538d90459be4e067ed8d176a568c31ba52092bd27043ca4ad77119", - "cb6906bfbcc457ec463ddfe65c974b103e922b46c901d895a4af33302ca48bd4", - "56869f8c090e12534d00507ea6f8829f1ca4b497d41ce4138884752e4469218d", - "ddd8558071270b3e9848ba344ed526d8fe9fe8f5b489f260fcd1d6672eb47c99", - "95d92699573db8eaa18bad1089be11dd22b1edbeacad466f82505a8af27219c3", - "845fd068960b9600dbc182e0b83dcbac1e0bb91073128f9f97950da64e9d40f3", - "c00418956ac750b48d555b07a6b5b337e45d4da4c5085f5760458652b45b8254", - "30bf6e8c704305f739d3bfd12174014d87dc1dc681b5e53c9978044caa30b5fd", - "f00895238b000dc99ed27569ac9f2912d455a83cd91caa25b85f8b4517595b2d", - "f76b04b3381de900941f729787e5bb7162e26146610cdc4b7a8d94fa84fac397", - "39acaae58c4d8649450b9bcec3ef1094b12d023f8344f29510dd860d550b5ca6", - "6e9bfd92047f3597d60e2f06fcc3265ec62c49e27b2ecf190745259c2aef8ace", - "c6414c10caf76082ef8781564b48a73332553d7ec582605b42171d07549ee002", - "976447b9b5f2d2f107b70ef8498e1e425f659495a62f76093712d5006075437f", - "9014b0472e4a1c693d3b608a6006a7625b41ac4588e63bf3c6dc1c006eb2524e", - "768ba8d53fc83afd1f9659a6249db86694e42ff39b81df7af76fc352518789de", - "638705d28ec2903bb0a596a11d5c7968f83d87f5e5a323081de418e73d08d6db", - "300a85e8c499707bc6cfd0332d0d52c683e34017e1c47fc25fff8dfdcc94989b", - "d750a90d282be9738292bfe7607b0f7f39a35bfb8f1a2d881c7a952e2e848177", - "ee999851ef3a1a308f77d5970f862453f0be9a791ab956bf4215dc07476fd911", - "dcc25e6a8741058fd68650e48ed985a90d3b7cbc724393dc2955b143d17c19b7", - "aeb0fce749320cf7b57052b7ab1495ce28b726a6c58bf65dac18217672d5f941", - "f8ed8a518c313137fb6400c2c726ae649a520e93f88ba574644a8f2de57fd018", - "42a52841d87ab53916d33346a1b0bb1ae6aa4206e0c3f48d177100d4fa110cb4", - "b8162791c93dde00ec3d75660ae80f60b14a8f5311d6d624b993bca1db0a1df5", - "2877219a80129c92bba3562b461aa068ee20a36dbb839202b6e1aed5538bfaa2", - "9c4498e3ebfed739e279e50a31027fdf174059e0e0b0c66f8e401f5fc1f11c5b", - "9e1f06e249f166bbd367010321ee062a6aa4eff7917410278be6f5fd0d4ae550", - "d51ac023f82a36c7bf7076fe1c720238c6a3a4c0692f1d619ba5d4923c62448d", - "df5711bb6587f9992685d425980f57646e828eb5168def1e970f6a7659a4a6cd", - "27d18c8d9a2f8f5ab891b08d54e41346682fd66cb50cfd8f953a67d8be993258", - "dc3d834bcc37db5950895103940eadc9ed34af1a1bac6799c95749b8879167b8", - "52aa5dd42dc836bf2a972856ef23f2998e9a80710db1659c94056c6edcbbae69", - "25bd6d2b8eea0fb14455a0875ef181c56f27c7e8c19d377364ed65835da1d8df", - "0e692985873dcdb3c75aa87e7ad97b35c518e64c0f166655b2b2566ba55ad57d", - "11048d7e76bdc72c075ed7bd72e578b3e75b6ade8f7ddbb918ecc80c5aa97f94", - "97d38e82209e15d9f53c701cd65173022ff6f5aaeb086734a8350af2f0407465", - "42cdab86e2ceaf72f70f7ef699d65fce2ae99f864d9922cb62b991179724eeec", - "03e048d1d6817e6f0fd65233c750de2b5cdf0b81ef4d7fa1e5f7a16dce022cec", - "ef2e0fd8033c7af29f31929f5510177ef0d4ef1da16a30f436b8fc4d7972122d", - "dd41a420f880bb59bee39cec67f146efc47f545fec8d9f9ca2de934c08cd1457", - "21c453259e5a33517a3bf4835d0725602de38fb543e24dbbc354cf5884c9e411", - "6aa18e9bc71501c3ffffb11439c9437a09bb12f088e1853fa03f902c042f961f", - "fd9f9379be2a0478121761fbc4655c624bcb3b6ee39b0e7250ae13df9a6f3735", - "fe305251012c3b1c9769b419c008378acb89ee524fa033ff0789c19630d86fb0", - "14c35fbd65c2161ea248606a1f2246b1db4e4c82d91a79f9da492a981f9353a4", - "2b4d84f57c4b59307f461b48b2c4eff67596a154177406f1e036f35080850392", - "08a6fd610637a2d43b5025ab0bb188519508343774aa9db8118464f4285230ae", - "d6e7ca3397d3ecad98034ce62ec25ac845dd586939dfbfcb5efc5599916a78da", - "546e508117089e184b8a8f1d428de33d0b27c039bcd16a66082ab83372a29257", - "9f6e8bdbd7a29a1eb283642dfcd464ce8ae5ef6c6cd85ef95f4bfffd4f4386e0", - "7f60d516a41b87513052662ec859092b7685730ecf927a257ae51b318d73174d", - "52bb72a0d14ded8b48284e063e90f3fb3abca960b948ceb3d2363c2e2666a308", - "ffc00ec095499f052e0e9e3156204231ef1745317ad3c921de01b0c3f53ca4b4", - "ac4b22e74c7a15a5976ad2b5b0dc238e3f59711c556e683576eb94b9f31c16bb", - "138f9562f751438b7a19cfca45097bbbb395dc61a8a6cd79275ba2787865b052", - "7fc874d23310fa2c54628a3e8224e3c402802e277d7e05815f5681e92ba2c116", - "c06a07fb663a9a4e5db6d1adbc8257bfc0576263ed8f295f36f18ff7b720b824", - "9e4209e719083d5462099b059c3f753931eb71695cb98de9c20a11b21d2ed1ad", - "f47386ef91b5a64e885518ad8c3981b2a25ce535811b7180f73c2e8498f10208", - "6eab6458d39b45ee95731a066ef5d98aa1b1bd80aee5c858e7eff506dcabc906", - "4e2ae7d66a8603a789a4753e17ee76fd3eff885c921a2a5cb584c69eb0d813c8", - "3a373176dbcaabbeb8151aceab36899294144982b717bcfe050b6085d5214df2", - "4c941ab6cc56e9e5a9f477ea2e472f988c176d04c9aa351692610531dde00b2f", - "d7493d026eb52a0e90a62cd9aca86be13368a8611671c2efe27086bc25050164", - "b258f01b197af909bb11580abc4fcf0e8a967f4f413a0c57908a0d60b1fe956b", - "304cd0c7bdf2efa1072f10b39335aa7545032ef63c0e663a4451f6cb6f628e30", - "ad62f09e87f46c23510c8bcca472173663752db38c15cf641f1c9cd0f1e6eb88", - "36c6a8fdc44e7cb58a316cc443f7a71ecfa84c294c6860c808604031b072fdec", - "7c29e90c26953b945c55d0255bd34a76465acf6fc5a4b92169efb12e30f8e5d1", - "de8b73b9ab7140d9ccb49b1d7bf17244f6295d9621803cb6c35d2486f044779c", - "969c805a0823dde0d1f315d7439f08255b924aeef0b74e2513d97c9c46e6f105", - "ebc81eb1f80157e6b80d1c41a927fe72b326c78847a4dc61a18158d224a98c7f", - "e1c2228c50eab56a13f51d83b6d252fa45940c1a5c06edf518ae09ee33ce8381", - "d7589cb6a2551be413ccebe1f1d18d21316808980008ce0cceead6d4b0c1c061", - "2b5736603cfa4df65de731ac8232b59b2bcbdd77d2130b9c59e3dbf371712bb4", - "a0705dfeb318771064056b3fd72699f1dc45f9d995d2e2baeae072da38f809b4", - "8010def5ad2340a6b794471aed3095f6948a0a80f85ec623e9c41edbb78276dd", - "29fdb1506b8260175246b95ac4eb0ef2dcb7607b913134338125c6ef3694893f", - "834c883bf9c9a2ddcf84ed4b045a0319f569002dbf984af062fecbb356b4103a", - "822c79dcd0824ca2a0b8c34f09f3c451b198538ef8c710e42ac3ef49e55526ef", - "5aadba2fc13ec4ac67e0d04143d25de8d701ce93ae8c6af824f3a74d826affa3", - "2674298b6cd548a39a01b1d3b956ddcf5c172bb3c9e0cf8d481e1ebebbd3fff4", - "40e6f34607633d8ad57c461c922d9b5159aaf157ed57bff001bc6c7c940f7ffa", - "ae0c7159b2bce3f19051275ddfa9f72a63c9210d01f056a5c7e98e6550a45073", - "ea0ab91ab0b00fa8125974c247e32285818cd78bc2e2f96777d5d1385059cb17", - "3dcb3bdd147d2cda161d06781a93d11ffa61f887427d8bfaab7ae85957d8f51d", - "15301c9bfebfe641f8a5166ef532e10dccf369506631523c91e3b5584ad872ba", - "f1b3554b40cd021528686438ed6bb036727dd0fba4b7dadd0f5a948d7b54cd00", - "16779aa59c8570be0bf76c055e33b4aea87b589c0e640e46af1389d1d9d1e017", - "984607bc1f7c3cb27383a841ab1d97d07de68fcc1011846af5b3dc6ba320aee0", - "427c6cb28be38b50697c1347998fd75ecb480424198cb234257621eb2cb6d2f3", - "329340a00dcd25e3c21436f1ba0ab7abe81dd0cede8deb1962f6d3bd9441826f", - "6ed7bfb462298ead3c28f4f28fe12f31bc6ba3a7ce970b1ba430cf9ff383463e", - "f39a60d26aefa7f878b8ab56212dc94cdac79ec909885da19f6ba41c5b43061a", - "9a476039ae44d0cb3eb0889e4cce58c946d8428d2726c059b003cbcba4ce91d4", - "940e04cdcf3fc48880c790a09db5f85965f310db914aef84d0d9e2fd3a106ecf", - "5d24305b36d5fece23ade92941a67a19e36f7b4f7cd3e368a80e8cc248a6fb38", - "92b2c902886ee50ed858fc299f6ab371c2c65b240d33440a84b90a02345cf3fb", - "512c1f552e1fd6f73ad29bfd414c6ba4c2d9a357ab1892aaff3f7eb44bee7a2a", - "88d8bd037c374b2ede5535882d24db9bfad3fcf4bbcd4598f8055410fea9bebd", - "44784908c4a7f9c7ea9d620f0d0e4f40dd2d7235fb2316786112f840cb62d0be", - "238046a7832ccf41625494aface96c3bfb17109a5562be28c756778bfb6ef41d", - "d441b4d4b2d078cdbf82c29b6aa967946241c590b99a81dba237d8290d671549", - "7f88bb13f33bc53bb4e62039d857b0b5d1078f8c41de08b718e50ed5bf9719bb", - "73e9ae3dc5ff997f247f90f633ffe403168fbd1cd62e28113f1953d6b47cf39d", - "de9e1b8ab6ecf48767f64474a34c106e5f6af14a1b8e21927f634dec54244a46", - "9f9405186176fb4fb8b592517d912958e13e130c480f04e90b89a05df64b683f", - "2f903a652502acdf1b4f0e6296dcc0344521e7d533ee567d777ecbced598aef4", - "24759056ea9b5ad15ad185186886a9f276879ebfbed521dabacb49810a2b6f5f", - "838eb027caca78bc1583f185eb28bc44f8f5a28657c8cc1c217dcb7a9b1a2ed0", - "49f6ac17bb495edd44a81691248fe5767d14bdb01d350fb71b2ffbf0549a898d", - "63446119660545b10bdc5c69f8ea270ce05f3089551a4e4bd537a28799e93038", - "68a7011025092993165bec73e9e6799edbe6a819cc84d8912b9f1b117f20d407", - "04f0822a590e442e965a64a7d186169924113e4aac7400d5546049dc75d7dff1", - "6d981cf9e0417cf32a4fca6373ad42cdc9356a65ccac179b1c43a3c7aecd0ca4", - "8b1754bf25e85e995cfd92d1f588e1500324751f94512ddb69c59a90b95b301f", - "cbbd8e7f3fd16ce631a731eb634464cc574d0037f8d01b6c224d358f763f457f", - "3aa669ac53e3f81c68ebaa847ec7a93cbf9a47bae1786cb7f8ba7a45302f48e7", - "89f0a6434d48d46c84611843346cfce7bf6d5be18daf5c6d2003af21d6d66e71", - "d672ec507967df0a31464b194bdf00ae8b36bc656e290e623b0d33922019b4ee", - "fc35ec9e142d91662007c362dc9215a962d78e154b8888391185cb5af3fbccef", - "943d4beff8e690572753e155c76e3e987c63779e235438160d48f5e057b7f7b8", - "93aa980a3d8e3188aede2fa2d016a5d376c0cc15653f435e8536828eb676512c", - "ab792776c9eaef935d72f97594c848d1dbd898f5fbd3462585fe73bb4dee3f63", - "749cf1d6cec2345b2535fcde52f6fa87cc3dc2c68c1d9f20e8e5438a1e1ad8da", - "1f6ad3ac307c3461d51c135ffe15264ede564d374714cf75f2b5b423acb666c6", - "2051b7bbac84377e241a4512c2ef72746f7804a4955ceac1c428193b32d1a544", - "180ceac48a318ab318eb27281d0b30bd885b5584f1d1b9c198ebc6105627a6e6", - "6b5bd8d9b9425b3c4223c0e7c037e62ba9579f056a4654b088bfeb93aa66364f", - "4917afe8fe38e9c81e17abb7dcc0342f308c940e45bb91d723a26bcf206d49ab", - "31935d5b2903ec68030dde30f62e013efae3baa1890f18bd397c8f6186c96cad", - "4d33b9c0fb1ee223263504ce1d6cb1989d3fbaa6d8dc755753b90bc415c54c05", - "f87bdf83e6eb2f123888fd27651692684e2b6a3c939faea80dba868d35e622a4", - "3ebee7a95d9c58829c61f7a3046eb0a4a3d9919b3ee761fc771c1c880fd6bb42", - "0fcf4ed239e700b195991c912a730b57bd3db778daad088a7bd1b908ab64fb7e", - "d241fe36b6bb9e90348dd7ca873c56ef65da5f8e40f2432878849545cbd5f560", - "7d87eae98609b4b83990222f6264f942098b20660c299b37d300e361489b5c3d", - "01e65f2557a5a78fba556855db253b2e7f2210ef4225126d9aab78bc925f6cf0", - "48e59da5f2ab16bbe4321b77c7e79451cfdba236bd4561ba2014d7f2c7b71e2a", - "f9ff78c128a990de64ca0d597a2e746df5c315111d2ceb256072c4251e53316c", - "e08c916852c00e571960e5e4de95d9cf63c6a76cb3ac3916d28af0a97f62baf9", - "3e4df3257159163e22de1acf9961f38037678d59a9717f4c188162b74a4a3a1a", - "3585bbbad112135b339b848c3d4002b298e4b6322f1efc70e49f2851a4fef9c0", - "d3222ebb2c8b4f98921f0cee87fb2ed043ec2e4d3a782847fa89691cc3127637", - "59226c2cda573dcfe48b2f13782a4b2209e9a4b5f15a3bcd58adfec306579025", - "c939b35bebb27abfb1644ad30825f5603e2e000a78de1612ff9d57e4cff349f3", - "767c756065f13549e8778f47fc6503bb9ebb2724defed18f25a344a2db6a683f", - "2be9fa9cc0753e6d2258739675c8b843e4ee39b9ad6a1f0d40084df67878ecde", - "3cfdb6dfb8fa019e3d9be39323f2ff496cf183ba36da7375a7bd0a46cc2b3764", - "b393c65505286aa92282bdead01be7cb78610423aacc995c72a6f0ff95d14e03", - "5ec71ea59629b0b3d371632a2832221de55ed53190d4517f4297cf0974767db1", - "193e29c868f5c0f65ec08d64e80b5b648ea8bd300ea457caee23da04fe19ea58", - "7f8adfb771a6f906f7c0e235ed3f3340c8ec95d116011ed58aded859c1c8c26a", - "6434e276cf5785e849353280443ffb241a0f578e87271bea8905c3c11c3a8acc", - "ee62f469f5fda983c1267606fa6e5b1dad589b5e3682a39410c658ef94de9603", - "926b0c54c674da226b57b2b839fea0351e1ef7d05271942189e9359c06c2c921", - "95a737cf02863ab1cf514686fff57e2e92f8cab559f7bfd789b9768c5654b4b3", - "0bcc75d62f3dd5b63d0f865cfbf7c21169370332718be0f628f63381cf2b920b", - "7dc35a67cb4e7fbfb9621131270613633c0b486946fb919b2c9351d5dcf514e3", - "93cb66f01443687987ca2c77d6bef5ff30ef15200562e21946d633cc86ad492c", - "68508a7548f90c711bc27620123b18c1db0df7c118dedc460c9db54676ec2bca", - "6a985f9c8c9ea59f13ad779ddf5cc34f2d7fd2a57667547588d9d2430b16044a", - "3e36108568647931c24c04f2f59479e38e4bba460724a85a0c673c13ffd99aad", - "18eb6780f96297cb1d955dfbf9e990f1c626bf0bf27f61a82a53404196799088", - "43daa4830dd4f9cda7a04ea652e6d5344258703b58ecce45849c8bfef1d0e647", - "d8ea7d4e4b440b3c805717793f47f12d83bee201a9f5c1afbe4081b43053c176", - "dd3ece3532ae06a2b2d6ce08a16b89be54db3ba212aca308f55f992dcd84405a", - "be267b6599e00a0580e17815c4c0b03d5ad792641d99153d671bf9228e348769", - "53cbf47e9ad3d0ad13524e0b1a36d3a979ea0562af250c69719afa52c2f56d19", - "5b49deef3f6f1dcef9b9bdada8d4ca74a9e14bfd53ceabcae0698976c8303387", - "20d2485611fc49195df4f1ece0c09ef9d637191e6cb3997773834dd3f4f7b19f", - "11b4d29c5596f2d3f9f949761beff506d3887f2ba6474a18e17e15cda419cb51", - "cc70f0baadb8122b3e81ad0d17117e24ec2dd321bc55ea5502e013d6925afd51", - "3c55a7583b79b9c120c2081a8d74a7c90e267b55942ef801fb48f800a31b2bf6", - "516d9f4ba57163f3d1903c50b9b7e884f357318d3e9a596a48017983ce0a206d", - "31aeb048499ed6b292c227a694fdf01b21b7d19f7454d38ff6dd93daa894f0b1", - "54720e2762e913163d61ed10d95db8ecd74b506a925f6e8e996e1f45ef11fe89", - "d67c636eec110873d1dec40a5c03f21b827941c19808926e85b9af73929f9209", - "9a8cf39983296e022aee9b832ca14324ce9f7a092207cc7b1f8645c3fcaef4c1", - "9a635de1011ba7f9d2c3e523ac800f2dc85832b7d5cf3926f47428f7954e3355", - "761aac24cab059a32e9771fff923bda4d8d64318d4c7bcaf313498d8950987ac", - "f8bea322a17f3eaa4bc33e2def8e6ee738ea0b7d71f39d85580c3206a19997ab", - "399bd6da04103ea186640c2fff58efe3f53be30edb2f8f3205371f899105cb57", - "80c9c28408ba19af8693ee8ac624442b6d1b95ad9c19280994da0cd75c4e97e5", - "1deaf82f829964227fd34544b2536af08a1f27855ba025eea826d9c355efd898", - "54e1763371fcca7fb278a0fb55e0fe232f59d3cf6a9403125c1b380798c282e5", - "cbf2d1b3ed263e5c75b7dc58861f498b18abf99d56cfd4fe1dc8f8719322030e", - "fb178273bfd2591e1cf8e839212b4ab47865b224f683c1920b1e2525f10c540e", - "7cda357b74fa9b73936e932cd9634b9349ac7f0fdc4230fc365f1abf1dc6bcc0", - "3b4ce3cd4c6d01b302bc8e3a00f4aac3abb93a2ecaf8fda688d4fa34dfe44106", - "204b4dd62be4aa8a83fbf6b53bcf084a2417a501a4ace8d993956de526ffcc13", - "d8fa6ed4e53be42fd362c4286447b929045f1e6bd9e060e402add4f0572fd7ba", - "688262e1776ac3b5a78f4bc49572946e930b99b60ed4d7ddf1828205652d5be4", - "8b0a2ea0d5f50e39e8806825f92f0e6ff4d5a56dacb6d79c6c50137223b992dc", - "3156d0cff0325c6e3f11105d9de5d64fa21f46fe7f41ad5c3489d5561f408e2a", - "78e0b434a923a909be95b19ce64f7b859d7d2dd77d085d70711d8d165e9760fe", - "16b2386ba4fc95fcb1920a2be22add98eb98b8c7dc3d96437654c47d4eaa0cd9", - "a33d1db5784f89503c5fdb7400ce5af42deba2bdf04713da55f6b212a6edd1b2", - "9e6aa412530583cf1af3c4d331ddba4c12ec3242bda5fc2692398aa5926cde38", - "86ad1a9b65991896787bc2e0b6deeef341b905aecf00d15445f1db369bd53702", - "364747e10b415b9fa4e6157aa97fd5102dc9abedb2e225df21556bd7b29272f7", - "5b631a0746e158c8dc703a820faaca9fe16d676e7f5e73f45de25b04e51d5e52", - "1a5cbcb8febf5042418df48e47dd9bdea15dade04dc4be7499b053a52a100b1d", - "52736a2d191bf677c5fb0d7bcbee9d7891b0e78f981cd2748cd927e6fa3c700e", - "29a84451bd57f5563731063d99ed4d8c9b632c2187a96aa9f97afbc065a324a0", - "275064833e10ad16273288635cd150eef81b4a4e8a8fba33b76a1ebd90a56ab5", - "756997c9b4db26d2e6bcfdc12290ba959b6b9ed70e9f281549892922da948c6b", - "58970897bad81b1c8855ca390fefea85312e09fe02e1995d00b0fb309421b197", - "251b7c31258f944acf78ea1b8568dd3f464479af23c85e47382c51d3fc9d9232", - "9cf6f9e8b3d68d8da948d9ea97705378ecb5bf0228110e962e350ea95f724122", - "6913c68758d9c7825817a4d777ef2031e29e98dd29e2cc16f4a6152ee71ed366", - "fcf707dd061afa0190683d9efa9bb43c947a5bcc13b2c1a7cf1e5f256fa4805b", - "7aa974dd22002b0ab637ef950f2ad3289b415fcd3b097ad34834b8944c546cea", - "c5dae3aa9e42ef8ecc1a0c432798b979bc4dc80e5ecf84c641a21d586ea6b6b4", - "767e75557eb56e32e7d34fa630a0ef2399056c3c503e03179f5947ed7e16728e", - "b680239d70f230f005096b83343ae3dc91ed91defc36f6c51fcb7268eca21cab", - "c6531fbea3ddc94342c66665fd97ec568f0acd618371abd4f10354c6e0c7883d", - "30f0e61ab159047ebdcbac9e4801e5b8b8a9cc30670211f8629fff4a31857428", - "9523c214b9b7e078878182c39df27efb5a1f490e6ea29fe80d591cf20b88a4a2", - "240147be1d5bd40556893f6f3b3d928dd26a51c5cbf1d90b0816169c5e3ba48b", - "bb94e2cffabbf716025edc90b63e48766be329572b002fd170e046cbd509949e", - "c2bf87305686b194ada413bc33517a0ca4c4531eed9d1615bec67d5a00c5cf4b", - "95d743d23f3607d9f58ed760d98643a9ad3f29027e4ab78d1da8ebea59b54de2", - "d6b85bb9e59f5cb6081742314f684ee144b4ef0fca29da7403565d9b3b634975", - "66ddfa2b4d684743a87e97f21efbe0c0bedacbbbb1b8de76bcf049222cb68935", - "cc55cc5007892da26ae245e62e6956c5d21d7aee4dc0ed3606f9bfec6d277666", - "40e788d2ef3b343ca60c2a5cd76f6557511d3519d2c6ce8916b238098d43e40d", - "1e59e9c799c71251a8a9b8e80a347766beb6313570bbd47830de8e5df92d9f82", - "2ea22f6b48932209219c71ce35639f5abd3bdc4c06a0dbfd1e491e314b36731c", - "3914b28ef21210935fe90975248bc2f045a6ea9286a5dcd46e1c66f57f1ee9e9", - "57c17fc0510e40863a7e5109ef96f956cc36327b7416ab20633c0f53a8ff6ab2", - "05698d682a657c167a48f8fd0f5510cbcefb682df1fdb6ad2fe4c987fbc9a072", - "26456530949026a3511662b28daa64085520353bf1e937f362e3d45440ed68b3", - "e2f4479af31e86ce3ee97f7420b42d990cf3bf9e93f400b1ca1a11a1684bf481", - "b67e0beeac97f92034e2c48d9c9a3d13a2b44bc0f70b59c73811f7e361066b02", - "e7739c00673c564acdcddf5d7a25f51804fec18e9a774466b2bf513f0f4e8776", - "0f7856979d1197a2e7bcf5374ced185dfa6db23970152226102be5d46c820a84", - "855b9ec50139bc66e6e3907aa598b25b790297265a8f145cd589c515f90024ae", - "4bab364ef48f0980132f3c000ac8b018087a699a18577754d89ca2764ffa5625", - "6ba8ed19e185d4c41a25e015df833795b8f7a94fe4595cf0a83deed9d26e68fb", - "74ac71f43de81260259a176e975640fafae3f610f457d97e972a2ae2de9c3905", - "356854e272a0cf858bb8643470b7585dfeab15d32bb426ff2d1574e6b1f53072", - "cd1f4c624bc9464b4eebbda6f4a0ee8281f4d9f0921038bfd0e296b705c7dccc", - "111b5efc907399d08551bb44a7f636e7ecccbb651c14f7cb3211875bc4111d13", - "48d1201336f430c58622b35838c68159bfe6b4af09b11e066c21370987346f89", - "4ee0fc8258909326c731fa05d731755ee0c7287b555accc90d555104cfba7e38", - "e8ad36ddf12e2fda669a3acc197fb0a5d3791a3eebf8c9a55a1695d84f6b0a1b", - "1301d0c014b94312bc16aa2b3a1c3382c540918cac7fba054224b594716f2ea9", - "065e3c9b00bc245650755fbf8c7e94ecdf179f626d0516470b2abdb7acbda7c8", - "892141ed09298132819353770fbeb6e2ca0ede283c9fc12a8dc5d907625496b1", - "da9547941be1a63ccd1d15a2c3dc8588f0b180371806284569b82ffeca0f972f", - "e2c3d3e9b00783c45d4b20f4a46dd71733b66d6446fb8506da7f10b81594eb81", - "cde9149ee5ed4aedd2292eb6a23a0df273f6e2d9fc8de1da37f61b49c3738e7b", - "154ac953f4c38bac0df0cd06cd527d356a0f7c49d38d547a1b68d2ba7ca167f1", - "f01ac494dc45e17b3b45f06a71918ad182128c88aa58b6bc802b4c380a9dbf82", - "70daa670f2cf08f4cf724965742105471bd5c14eb5c7bbc4c770ad0a6d85458f", - "29df41082a21a2eb602ded1b757cf636170707e71f9c705decfad96fa1820cf9", - "4db16cd28a370e5a009af31f7af80838cd4a8417afde67cfd01165efd69522dc", - "0c17f89a891a4af39a6078619e3b08eeb53d12d50e66cc8457b6afc53b1ee6cf", - "dff215b04c19de7c45313d5170af297eb057c2c6ebdc141139d838a58ce0edd6", - "7f646c48079186637416c3c16ff8226fd7aa142e4df0055cf1b9ca702182c440", - "f169efe48a9b62a031046772a1b6fbd2795f2480bc6ce84692ffecc05643ad57", - "61cd1c19a309b472c48f6ff3d8b38715f559d06ee53375ea31d94f226607b0dc", - "96c661d7adad8bb5e0d308925affe7a2ee207afa5e97c1298d45fb237497e4bb", - "bb319b6418d2fd3d22dde332cdf6755aab46089758fa7a0028f155beb654cc0c", - "fbe795d663cd52e67fa6f6c48d31c747b426b2d24ebc0fb1e6646fc8442da37e", - "c997a703ec5a18ae993f69f0744d36533e6382335f3871f5d7ba04cf46e38e7f", - "7125526661bae418c1afcbff0b5a916b30d6f592699b72ae350e0211fd5d1d92", - "21ea3cb853515bb7f1e117cbeace44f27dc6f3150820b35807738bb9d115f897", - "24863643d5b982af5a53248af84de8fbec37a8c62dcca8e3d38aa0635e0f90f4", - "6c7497685d29e212e968b6010d357d01bfef0fab3ffc4562aee56105dc61ae09", - "124768086e24128a731fc377ad91387ad863f1cc2ea254552379810994c9fd16", - "547b5f916e27b3e91bbdfce9f1972d7a09276fd58d984ca103ff4b57383f0314", - "8f87a890b9308238b63a2874f0825174580a4461fa348d3a8eddc93e4579680f", - "d4abdb543ae036fd97ec1de20286614c7cc09db669e96903d17d667e11bed800", - "43e97e7a8305601e6d2667b50473868505c7a13cf38c0b2800afbd398c25f93e", - "58af94bf83b4a8d47e85f18496df5bce4bae76532fe177defb2930ac117b8fbd", - "30160702e766df5321aca2e20dd845335fa001b5d4a62c06e147f5bf59caed11", - "aa01ea0699b15726d05b7808831e8207bf2a1fecb38468350069eef8a05de84d", - "b085592ea2ad2ae53e9e452de44ad09ef469b2ef3fb4c8b717f1fb2d94074a2e", - "0051771e501d14584037004eff80c480a09ca07dd9bb08ec0114405845aa730b", - "49520cc41046b26172546b96dedbdfed0b33c48644f3dba521e4e242450671f1", - "cd292c22ed2a3da1cd2ee0280768b3b8eaa1ba971cc7be8f1e7b6f47fa8b0e40", - "ac269f8d4bb5227a33074c886bfa6700959e1834b3c11579749ebe16df1ac6ad", - "3c509f70e6092391e0afada9625a357db34b8e60737366ddb4f1b463f1852e7d", - "dfa913dcce4a9cef31a2bde35739e2d108c4a80798a1a72bf7d3ade7714b7796", - "4aaad736b2b5d628e1d48de734ee252e0218e7798d9117b3d34f6ae37e5e0bb5", - "c611cf95e0d0ea280c2f861a3be4509e07bdc13243ddba132ac505d6d63ebff4", - "9c9189e7d135e9b3d72df6f7a18dbb2de09181c94812c2fe0ad496c82f320c24", - "88a87b807a7f8841d527aad82bc7108435c1f30520df4eba1c0c560615f3340c", - "bfada5019beae45cb885e8773383360d8cd37c6d8e461a5d946468535c435e10", - "7e5499072b4a2afe5dbe755cd02872dc84ecfc5a5ca7b92349b003284ca0e9fb", - "5f69246fb5e98cba41328828368ce1ceb74f9b6154ca1ae265c209c262781e7e", - "60ef99eb2af7f1db991b52870dfa4b3acf94b88f481048b3d122b51ffc1f7cb5", - "89cf2c0003d7287513855e062104ae2abbcee10115ce27f9afdc852dbd05afdb", - "4fb988893c9e2cb432dc613678f68c0df8c4442be9507ebc8a0b7184faf7eb4b", - "215154762e6a7ee948900e69da7cdaeb25ec00311cfca1d061d8006cc2df6978", - "71bd88863cba9ee3a2d975a87ab9876ed5d1ce7cd220d1c28979580eb3ff3d6c", - "00671fd4ffc6abf05f2b3d52ddbc8beb9c49e0b512893aabca258804509f201e", - "1ca717ac802f8f05ccb9607de840849342a5911c5bf209f7ee1d38898719b7b6", - "fd7deb3c6d15dcf2bd4bcc80e4efe01c02e4eb1c62c8d8aa5b7ab309350cb4b3", - "7bb8e06f02d6894a9caf3ec722c34807beea0470642d0a6a7b2cbb157dad6258", - "40b70aca4d97a132939199a43166285b4256e45aee892e35e62160734e25214e", - "58b4f9b4697b69839b20466e4d4d4288d10289cc66a3b1f03332dc22366e0314", - "452b275120ff3ed9e5e765f9b04d8112b1e38374a1ac5e3fd7bf8a7b3d32c026", - "b7718275c34c65786af0d8df2b9ab3c6e113aab186ea65cacf204f6d07128588", - "416ca993a92093fe2d84772548c810226b3d1bc778d8b7a63b08e5b3be8bc866", - "3e506b72b82564a4894f43628f2c7ee405cf6dc7cd99bf9820274ada72108415", - "14aa08e69b3254817b1da51ecd8382af4610580d52a3258f2454bc72846fd74f", - "d78226f09b506a18c8c270f49086822a3ed276dde6c024dda9f35aad8aa8d9e6", - "efc91cc8ae0d0a1669111f9cde0750162ed659507e9fcfe76da1c4ea2b630b8b", - "44abf0d2c7e0530f50e730b239c0a26bc6918c09028954b56846328c4948df0d", - "4b89f24ce1ed6a9554a5a2418b8eab0c5914d8628d9b7576740a39fbedfae58d", - "9608c67bee488464671f94fe1e46bcf1bc43d9637648ff47a5cd98937b0cf697", - "cdba2d0106c84ffe97dfd94cf19ca55698d70d9126d370060002a74a1f525593", - "5bea7c0fea58c3d2cd2221026f0bf4dca115836135dee894c837f7d3a4ab4fe8", - "7e365c9f27a20868c3aecf3dc8c2f8f0d38d1cd23d4c46f8dbcf786e70fb9c59", - "c23d87735ce1addab308bf15bdbeb1512625ced725ffbbcb1ac229a133a4095e", - "781ae60d606a068095ef966a7d891b7e6be1b7015267f0e65043447e0040e801", - "1f6cc385a5d783a4c18c8e8b6405969f59c137d442b763f0bc37b9b4b89b0543", - "67642f8b1b3f96e7fa59432b5a43b24ef85950e14f1738b5a950fc2aa4354e9f", - "0fcb70180156c21cc6954a567fe110701c450fb7c39a7b8907e0cea8ee3dcb33", - "4ffbf578030164d56d0c3b36f4f5a5ee805cd43ecf442fc84497cc2e8f156257", - "d54c6cc96a78f71645466403d21be34fadbfe4392a2566971420e74ca33430eb", - "7307cda54e1b7f9fe8e50c46fa9896f8017a3104952d1cfb48c55d3452bde533", - "9fb58d63a0fd4bcbfacac069b206c06b1955861fa75cad03765e3b8461828135", - "167174564d4427b9c29f34258fe8f90af8eaff75b1b2d4648eab3fca39ea1439", - "a5313231629e355b54aa64fdab5a1056f121c1d424e125674b0da225fe8d0a2c", - "4ced247a140d3f325fc441cac44bd67f79bebe49740414c80912bd317fdc9d93", - "5d4f874311df93f82f9d202c4b2e4f72d0bd28f9b046f1d65c5dc761aaf518b7", - "f2ddecbe9879d657e45c09a059bde787afda63ebb6541772f9f6633fd2f0211e", - "73082a139d71d54d345d52fabddc5cc4a9befe70d766c1b638521c1e6124ac2a", - "32e0983a75bf21a4cf2e802340e29c5efbd8a4c88fd533de6e7a1f6382f6677e", - "97868d71ed207c7bd0b26206b7d89f9c8dba818bcc5263fab1fc8000c3d4a459", - "aa93664022188d595c01d914187c51b6ef9b8dc1c82a19add28541f0c7e77e34", - "b40a00cca84be95888701ff9198c9d8c9ee361c27f9b75ed62b2b83bb2f302e8", - "245650139c61172ca64d1344f6b83055a4bd1a14a2eb82489f3b019a771fed9b", - "031aa10a3593de088cfc432b27ca4f44b75ea9297b3d7ed5c07c8a160d8a12c8", - "434f4f8e277bd68f4571dbb527325e21a1f1d7c23e8e7a906801c832787ff87f", - "b41e55da293a1d93ab643ed9894ab6167e01c24368c68de3c1a212869a1846f8", - "6f8a9ea45eeb63a9e311418641903e48c162444e09565ce7850a3a06514bd9ed", - "1684ddbfc3ec77c331353936b7d80d6180d85fc2ef9a48ce53f19d1b378c2898", - "609083a8a69e83d24db06849b729e1f0e9638f6c21b04de9655890fec1810273", - "a5dbfa1e7c8b1294930cd73d630376163b8aa4124c6e342a10da8d53d9a07574", - "a163e76d5b1edfb28f53db8d0c3bd04e59fc7257d2a355544fc3cac5ac064b37", - "7f1b63d721e5f70c4d83e0dfeb64eda647313ee44da5f413ab2b651a82061cee", - "b34d14163cc4799003419f2065cfa5aaa54bea586f0dca7fcf1cf26b0d49c141", - "e885a91793df08f82fbbb6055a9c155d63491e77a2c3cc697a54872adafc5201", - "f7e6bba9031457114a8f37110c2d68f6ea0cde03f7f9df172b06df46cfdf892a", - "63eb00d66855de781e76a52ed5d32921961d03f0a3a6e1b76e902b60d9d0d2f0", - "d0d6b114838605425da085922742d6f9e1905680b993f9f8373b4de3381f3244", - "1d79a5def0c61881a0a602294fd0fc9a33f08ad78ea300d10f8ce5ad2183a95b", - "91f717cdf2b7f5c69d09d65fd54f549b8b8f48a8904f51ef3661bc6dd1d83679", - "801efebf2a6deb083c7b40c9331961765b672d07cd5aa61d081bc5e8beb2533e", - "a7bcb4601087808e7e89c4dd4ab4f0f1c772da6b6abdb65cadb41a011db08d5b", - "cd6ad26721c30cec02be8f7832e297372abd540fb184ce1a699cba72c154f637", - "5ada08398cadd73efdf9fb3191ccd5fa3ce23b76d38339869a5bbe6b4fc0e58a", - "ed801c5d1f7033bdd27c8c6384a4046c30631230c4e1b518ca8b4cccf3c84578", - "8372104e42d2bf5c8fc5c082f76d195dbd56ab882055af29c89bb99373f7f47a", - "b81aedaf94edc9216f5e807f4090773194283b20e35e9b1f3e79066a2ccc39dd", - "98c3f7cd303afb0643477c2b3d1a5f6b0c00351edf284b27844febfb5558bc96", - "cd06df63dd0fe216c33b78138a21dee38a51402fb766942dd3f6024099c79114", - "07dcd81ccc8ce216acf4052fa7ba8f0150371856b78bea134f1cc34ae087ce44", - "2e0077542ad7349cc2999d93f49f72e0b06f0121319adbccc0eddf346d42267f", - "6a7513aadd83d599d715316c10f650ed1cb744bf918885b8d3ea5a931f4879b2", - "620316b90b10a15b8b5061916c9d56f2b41d72e354375acbd3890375cad326c0", - "c9b38c2eab663e380473210d93995b352a2178879287de961c9cda31e72d437c", - "01fa356f10bb661d7837a0e21ac0e9e4bd770be60dd52f7c4ab4d451077f2a58", - "5c4d787fd99433063ca5765235e23bba0b2a7d5941d99463c2c041c5ffad4214", - "3d9838cc37790ed580bbb99092f754e47306afdd6aa08d6b77c753b378d76083", - "29c38588d9351cf469ac5ee677d1143b3cde2a7d9a17d419261be8ee996439c9", - "69eb01cdd80588ad669610d2373498f70ee5b615debd411240e32f2a18d42ff0", - "97df33e50e6e35fd0bd375b0622c25e7a569764ad80e776b35086c624648c813", - "1ad97d8e80b0322c4407a6d7c508240021afd94f443d7a3244f67c4fad1aded2", - "abb88185d543d31c781acbdb79f79890b338860942821b72f1577d8ccc39c4f4", - "983e48253d90f04c0ba0a9d6db6eca6f49679ac13cf5e9cf677112d559535448", - "5d74539f14422367f48e85be4798200e051509c27e36ba66212aa3979fe34cb6", - "27df5af045082b0622c6b875e58fa1c69b7131ee917f11482adae054a7db226b", - "a9c5f912b4a5e9a48d42cd1e8b0e3acd1e7b547b01c2d4e1dc3966183fe27056", - "70c9c06c221c601440d097eedcf5d68a75ea0b52d95c5e05248e214fd461ecc5", - "8b25bd9962ce4bf7163bbaea83dfa7243a972c838970a7ca57ddedcc1ab88a4c", - "7091dd355ca786dd125dab009931c3a958dda0e0f8286e41fd007d5267d68777", - "1eaee464269bc79133b38bdeb176ba371729eb5f14011c15f29521543d031463", - "389a665d18bbd7943e82cf1dff61ccf84d900cd1cfddb755f7375bc63d975b34", - "c0edd70d2475f2a4787656cd42aaea32b676280ed3098663fcc3e0ec20e8897b", - "ccc5b5da9ab3168503d272a29bb8058c7253cfe67733a787cafde7ca4550897e", - "a71a10701890e013bdc44e8f561f17959d03f81ce85204196ce8cc576a4272f9", - "965f73cab4e04000944ba1cf4ea3418b5025e846a1e2acaf7ef7e672600ab0c4", - "5755554973d2ad270de0642bc4dc9f7efa207659a60a596509359267e7dbabcd", - "e816366fe465560b2a6950821dcb28c46cdbbf84723fe0b740681d348afb11c6", - "2da0bff2f4d82a5fc8b802f13926b8e25c98c0759305a45ed499aa490bc0b315", - "b6de46efa77f02582fcb66225bfb24992672182b01946b241671989c3b2c3715", - "e7361cc1b3e091853cbaf20b3975e712f92978e5090ba173ec1ff3208fdebaa0", - "70e0c5a4db67c79711be75adde791003f260249ec500cc4383148110ed4c9120", - "cf1ddb545a9026679520bf6aa602926bc7b6f79a808a4722d235147b45527448", - "1abecbfb2a58d69d0ce0c5d99180cffe78c42940225ae21c66c494cfb12dd6c5", - "99de2ff0401403d64bac171735e501a9b10cebcd816362f0f7a0b98b7d10b6a9", - "606eef6889e106d5d6fcc1329432cd39d04fc11ba270bc9a67b5acfe557a8072", - "d650359a9e97fb61ea77094ef00ed87215ff3afddd673619917f73772b79079b", - "be9c387a096448b272a68a79e1d494e2818a5e8fc27947fc8072a113e27824aa", - "82eb70d1259473b04412f8b079ed7018cb29232da8171c4bd6d8bce545f0c1f0", - "d937e6408f6e754be1c040b9054d7d8b10ce2d76fff41201c777bb949afcc72a", - "f789b803bed6f34042a209e2ef3ec5ddcbc0d58f7181cdf5bf66b94e1168101d", - "02359eee9f554aa2c1c5c92b5478c04aa659a1408e3aebd15c9078795d4aa314", - "40915e9eaa497a6ba3072c1b45e4c87e06fe6209efe9bee91a5e079fd5da5132", - "169dfc3c57a601137631d2d0106f31c488618f1d7c437dd1723278ed7e953a91", - "3c14d464ceee8fb9489f61d76df6a50f15394d4d3148e77a78c210806228e9f6", - "088afe77c387b854c281af7a66c5508c42deab033e3f5f3613d5ede25c1ca76b", - "f8838abe20492e1262c613782dd1942d91379353014d708a84cc61a19613fabb", - "0f9727bac13707c57557ed0ec7eb6b135255069457400e9872b4703a5735dce9", - "5679aecc7f7b6d3f60618a35728fe722dce092677e7c122a950592c7866f5489", - "71dc021f9f7e28ec2affffa9dc13c88c939f567fc7ebe1a4b0498690cd523d1e", - "2d31ec8715d0db7e0530ea54bc1755cdce8c7ef29dfcc43dbc396964ece95e31", - "2dec71b3bbd4f3eb1098259d2670fd7f256c293e2771e27276d9e19f75a6e22c", - "e80850524649c2d9cf0bd9eeb14c4f9c3ac46c3226bd117ed6a3bffb9c25923b", - "824603af21220c077a1c9ab4547aefb9e8601ec002edd29a291cf84e79eecb30", - "e956d40ab9ecdd1caea936fd8d4ae89c2cfbf5a22383e5ad0b49c6c6800f4577", - "b923f982e5da6fa7158826661b6ab4a91cd5681addf6bc3b3a00d121f800a277", - "e1f714825608a7f8730f415902c4084f452b134777182938e5360c2d895ce02e", - "3920c88878bf01e7bea351539755ebd83910fbc0d057a46e3c88eadeb6a20e39", - "a5385e825b0ae9a8f97fee9cc528658c5b8d2ad09ddf3aea7f4e5242a6008722", - "0dbfaada1a1ea30cd006a3ca846f4ef9ce30000ea68fb175a9f49ffd43bb1e99", - "280063901c213850eba269c7f024622d66412f3493f2a5c5263ff5f9e7599010", - "a235f11f927f8a68175534463be4a69a6ef952e3817f2453a91a2360d23d4972", - "ff46b3ee7e6dd0bc133ff30963637e7c474947eb3bc1d201fa54377a1124585d", - "5ecc6bd36229b383966a0c066571411bc2114a8ef26903bcafb2594a192bee7a", - "fc8f1b7627f3afd988f7fa77d6eaf51a05a950daac2af6d01c2c15bf624061af", - "2c6c2382bc24f58621a47d3551cefe0887093009d63b499ab6828b7c1bde5485", - "f505b40b2894fd137399b0445940a9d80d12440b82393fd5c430b5a472bcc13d", - "f17dcff71a2ec843ba222c0a4feff5382728b8b688921b74fb19f6afeeb79323", - "21d8b2532286c8e417dcab8a53b1e4cd126c7bb1325422b392cbefeb6078dd13", - "f830ec47265476361a072c33110abe1276ad2bee6937facbfeca020f3ad6d0a8", - "a5768c4125d636445ceb6870b1e2ef04b0612e010844a4bd438bb060622c0dcb", - "e7c3f08d52d81db5e3cc8edc0fd06e7a136a24591c191c885f215131d2659883", - "b9d3f9457ca440f564f3b3573cf79a8479e181549101d66fc0f14f3a9ca5d1cc", - "6521f74588fa6f137dbeaa853372bbee320b3e071d0b48741a950955bfbf94aa", - "3b28a28044a79ebef59981a9316225befe21aef6522a60b39febf41c3695db15", - "d72cc320c1ecf84481d0524a75394705f389bd331313019ec4aecaeccb4a165e", - "0c09d45f9a27b07ae55e30e0306c0a2a1f47e1da6359d2cc12819ba661fcdcd8", - "48253015557a6904efeaeaed3b7282e43307324d4b6efce710c7b7d566dacf83", - "f71b14fa2f621b0ed0ce76c5431f44c47276a8d83e9de15e91043855f7449554", - "30c2d9fe6509c6c3e44172689c7220e03cef46e650cff0616fa1977eb758aefb", - "c38eb98845d2e52b8f3e8d626909a3fef3f83e0b29f870806d200fa81c58888e", - "7c06704d8644c92857315f5b0b0609d85c2dadb478792d2595510e6de829619c", - "f9a6aff9271a9711fa728b4d880373ea62031abe5179aef794206da72aca82a6", - "cc17935b161ac2c7c2a7222cd2b566c70299f05f337317cf4342404fd9bb8e19", - "b84d469997cd3865e10c4a13d4ed59ed618fe5859c40b81ab88dcc683e0e0e1c", - "9b631088e377755cbc2a7c30ce45b1c370ac5ec6978322932d4a1f656465350c", - "af618291d235251ed29401033e2a4b5f267001655974d1553e139a221b15d1d4", - "4ab941be836cdd6782bacfcab3e317186bf637beab349b790334440f9e6e1d70", - "523d34713f732e7151eaffe765b0b5960945b180db43dd429c79b476f54c45bf", - "54194931396c1347ff661a43b0e96077fe80e77a6a28462c71f35aca7069fec3", - "2db859da0f6bdddb404ff8130be0c430f817cc7c6cf6101514a2881aefeddfcb", - "6d1c01a8476bc4bb2761a89db96ddab2ecb9a1cfd6c99b66d7b5a36222acf2f0", - "5e3ea2631b806bbd03348f0789633173ceae61a8ae5b41b96fccc5920bcad02b", - "38471a5c5141a0156e8104f0ccdf6c2ed1d12b7af856ecf951131691a29b6ae7", - "2aad0dd142677818b4ea4f99f309a44a675076c700771bf1a3527a036c7bdb5c", - "1f72499149934da9dfcf8397b0ecfc9d2f4f112dc65180761934ca413e0df8cb", - "1db6d507c9a430afda2a95ff727ae8a2da39b4ef46d2bdf8a6a9189cf3b60a4c", - "ed509885a1f3a54ebf1f5c88486b7289b29ca084f798f090280057c557326489", - "38611e410b345c90c4f45af0ad85a58d6bec02cde7aa1dae64036f4733ff55fa", - "32ae7bbc8670019ad9c618e692c123b7da62527eb586b2f5abc6f7578064c9ac", - "2a256f6bead4e64e0cb6b619acab55518adbb972b856abcb0c3826bfb63e93bf", - "20e905c25a095ddee8211194d3827aed21a45581b409a799d310c8fd8a4e2414", - "9b8b17a5f4a1f0072987b057ee5554c9ce83e38ce82795123cccfc001d637ec2", - "54e8eba5281a9d1db1a7096d448143536a6c8fa142f5b0a400205cbeda27b2b2", - "619320fc3be51a0d0d36712c1fee0848be4a8ee29f6c739b6194e62774b1dbaa", - "5dc4060924d014e707710f01a62b6e5765b2c1348ad894a5681597230d69dc14", - "5a7329bd7fc59aaa4654db6e425670ad01e2855937b81c5e5a1e451fd070b46b", - "137d469b52c787cff7c70f6229837dd13c6b34467e9c1e8492303114879ee2ed", - "222c7cb4475a3ee8ba3b29efdfadbd4cacf30f2a77b4e6421534a7bf172f1ef6", - "b11b0a1097cc18ecc48cefa80eb3968ec213bf7950d7f7b97ebd088be20d292d", - "67ae8f27c3547289a4f40d5e0a36a9176df0e1d2a842a49b00f80049410f6965", - "8412ca7299df93d2e7f127fab85bfc68bef6ac30e9861651a663fc8c862eaba8", - "d49d4d33d329a46c8473b76160a0405c6dcabd67e0db02771e12b6416a6fe91e", - "4c08cd4687c377f1ed2b72e4f60c46e565193c13928722b8247aeeea58f70cdc", - "8d68a6b1b8916bf6e58639856c47ba716a23910b3c639d43988b530ac221cbd2", - "6dae7d6eeb2893ee8f125fc1cab27d98fc56448e1d355a22657a0d7bc265283c", - "16cdfe83722503b581294fdd81458ca9476d8a681ca23ad1135d76cf5e467222", - "0214d833958e1afe0ba1d84abbf0b7b0e70276ec98b9003cd7c15076972d63b3", - "17c7757e9049eef3a3a8c1c014c149eef660cdddf65f27c92f1f50012e32cf04", - "ca9c2455b9649e02ffc762173a4f66f2fc94699979eeb77bbe6ba4143d9ddf99", - "7f90453b67b9010b8b7d74f3e4dec25e56c731c6e9d9fde2db3ae83e61c346e8", - "ec7085d328dafa7d1c2761054cde636e0153f362a0de91a189cffbb40aaab02e", - "c5a9d4fd3189df0a652c72ff4f248a7fe9e5e20dbafe54f2c77e7e7199b8862d", - "82a070e641ef3ba93330e63249f68f51438773627d3c79377020d988e351abbc", - "15b94d1db49feeb70fc171cc1aa5fb801c8aefb9762a3112c7f937100ee571ae", - "e717d78bbf4cd3180aed173591f0838f9b914a4f9edd7193b58885041f1f39d4", - "d16276befaa2f6491d807d8b6d97fbf53e4a8a3cc9958096f100df00cce9738b", - "7f3ec7816da03142232769afd2c7aa4e82e2b7ab0b990a29bc187f738dd50ec5", - "eaddb809af46d73a3c375e18978bd42a59eb538f7a1a46c4c6cb681cb0503a98", - "62ca8e41dc354c609ff726f2aa0b518e89590952cf2db45c30943a3bd2632b41", - "1fa8b443d39d768bb961f17b2109aa8bb37d466a30328ac412c79df9db482c63", - "d6977c8e155e854801632bc8cd1b3fc29fa531a98f5ba6508e69a83ae12b203f", - "16b131ceede84684fa20a65b3c976d0a1eca0df7d600a31715f188bb00fb2c2f", - "fe744276f9d6e5094c8d4f912d8b74f244e023726312d79ed4659358707e8f44", - "67b03572ad6fd3aa0670d1ec12a15b39479edfbdde252474b7cccaef888fb287", - "79749342f5821fc5d5c88b3af6e31f489810b64247f168177729f8a913071287", - "ab0a0d02e74d867c99ba7983301187c81df5abf9535a8cdc5d356dd2890f18e1", - "49fb88ea337c5115a9e2a66556fc61f9b24e1fc1c8848d17ae03679e3753a10e", - "54cff717bbe96c1f07b73cfa5902157e29d8acaa48e9ed97a6785308a6ae468a", - "89f48bb73dcbb808ab7898756c0cd30be55fcdbd3d9a053559b3eaf23788694e", - "a32ae675967eb2d337053d7b8b122d334c1b60add318c5b0ecb46e5d8f07a91c", - "c8ea3d625bdde6c884e67974f0ab46a3444ba6d3566571de7374f323d1fbc4f0", - "704e8eb9788cb704299f076d65a6b05db2ea06520f3133d3f5feb93e488019ce", - "7889870bb53642cdec05541a10d8a61f917288a43943ae9dc0ff6bace691a993", - "d474329fe52e793ca30efd9a78b4a1847f90b78da039f53c6c5b494938c0ece4", - "f4a7fb3eada4cae3f13abef2c4cf84287f3a853062029c42c743820049ad6c1a", - "ecaa1baa3c48f90bbb0f37405057e40af916ab041d5a68ddcb7c591c5eefe97e", - "4252321cc5de29a3a23d3be13c611a7b92bb40fde9ab9beef3d4aa30114a8251", - "6b93237428e95f4ea756bfdb860efac6c70b7696f15100ae326eb52ff8da54af", - "ad16c17be28fe2d95570f934313646137cd6946917d40cba2bed317c721eb17d", - "587262338faa8e10cdac6a12e22ba0eb35a0cb6d59a81d3e2bbc7fea4ce51608", - "b6420db2a90e523f7dbc61666d8280bc238af689fd18c9d96b4408f1c74c7068", - "5321666434f3ec707665978e376abf3ca24949f57da1d96fd3fcc7b7af29110e", - "c8f500d3f650bf48b033fcad11f39fcfc7daede6ebcf4bdc67c60fa032326e53", - "5c4ca48dbdaa366d3da1330dd6b5000321b5f710982f39b15d40c5832f0a2709", - "30dfc76ed73390bd47f5610b3d45fdc35262b39209247ce21a2ebdf85e61c354", - "2277717e4e233f58c09c3a9bb35aa86faa12c444b5f8aa240971d929e0bb8de8", - "1e98ff82a61a86da045bcf1d2c9e1b0ac4c98d5e8932c04c090b71e48ebb0088", - "7d95729add5794e754672a59acee228535ef91a2a8074048e580853c99a00b6e", - "efede9dd8fe0b98b5a5df5717d887bcc8d6b35b917008233b74a3b8bcb727aea", - "0f5270944b4824bf8289295beb637e03110fde6dd1cb0c3162453bf20c18b442", - "54da07cef3104ee4417875b89eadd042db059141458d3dc0f2edb98030c863da", - "21107048be5ebef0abf8426d9526d102b85f8e4169ef9a01cd4c6d1cbbb943a1", - "646f6cd54476a57b731b60c2959f6426df5535272041cb81710248cb5938389a", - "2e22fbbe6417eb4357f7dbafc97a0cb44b58997b04c146bf38e7bd72f39145af", - "783c61e37c605b5f88421214129c32b7e4e1097e7bce1528cd8f3a68ca453faa", - "8d002c8e505e83b181f7186be96c42dc22ea68147957ac27802f0f54e805cbeb", - "b7114f1b6cdf783ec1eab767fb5ddb85b72448874aed0f828ebf15d9eb43920a", - "79d704e97045684878494c6b0e83a2e93fcc0a498e8c46a8bc7ee6ff8cc4e9fc", - "16839bd95dc76f0183e8e626d99356bc3f14b4126d35a652b2ea642d4e9c6c87", - "b487bc35b464c58f4004a0c2b6a39a80009b1fd3852fc30b4c212949b70c7064", - "353a153c39d1dd8bcf44fa796c0add2b8faa91d6d3e8effb8797b6d1ab1b7eab", - "17a66078a4cbb508c211508f23f4b5812ac1fb927912d02bb11308d07c1e3c5d", - "41885d42cad9c3336b89ac0f54f7a7e38b0fd1bcaa2a62b006a3d9a4cdd12f08", - "4003984680c541bf73e1237fc7eea77fe8f4bb35b6907af92800ec8134bcd2fc", - "7551850edb13f4cb15a31707da8bf7d2b51117405c3fd15065a7fc1f8b7835c0", - "1acc9ffe4c3e40e650ed70ad6e6de57d531479b4cc4092561f25a5814cd94602", - "6bc3927f851a4e83c3f3f5a919798eec7707f92cf7e2ac734b195d81399e426d", - "949cee4c7e00e68528a48ac683b14f8e58ba9cf0414d48aa7a8efd68ffbcb810", - "4be89eeeaaf59e89322082dce3e9f66cc259e14a86f64737c2212de7c5190143", - "a619bc2add635038270830fa5588f7cc75dba676d08ce7a047c072d5c86014ee", - "e56c92fb39e37add51503872ef08156192540929eb26162e746d7a23c2eaa0fa", - "8d55f721d93dd608ddd1200f0b2a82c09fbf373bffafc002742971e7c87ee9f5", - "40182d46d845f10f8db7ae06753dd06c438efb8a1a7b74452fd050fd6a0cb872", - "dc57d47eb8d28037d88f46bc45af41aff39a06ec08a40bcc0931c62088d3c7a0", - "e89f9cd7ed638914fd350c9590f6c171e58e912fab95e5ed5ba89318f28020be", - "3dbf040257bf0a003a262f9e491a8289442b861e888e420491c07c4f6852b063", - "6dea8483fe2263c6f2365bb94650f523b6ee7ed2984b1b94de4171fb60cc8a6a", - "3afd093894869fcb6de8641fb440268323680bbe2a2b2db43d13b73aa8fc40c8", - "c7bbbbddac33f4d55af013d94760f8a44a18c7bdc70fb951a48c752ff7cff644", - "32922b494abab6c12d5de4700d1fe01d057dfbc5c59ef181fd5b7aa69b2fbff8", - "f0ef8f1294d2406f4b2024a0a0b77280a06d27e4262a2a6c6d1e509a661fcdf2", - "bd09a71ba805d367579d3890c12efe85182aaaaec2d60277d06ab6f215ca3898", - "b7c80350c5b99e121dc9f8cb211569f4edb98ab54a9c964cd2034d2c924b21b1", - "d647d0a80469c8ae6e12365911bcbd0d191d1568bac3bf5afa6e1bce4643d2dc", - "156426d115cc04c58b928bd6f935f697fe6972f83f0f0a7f16d069903536b06d", - "c8838b7bee56c3b188c23e06e084d773e74e7707709ed5583784016a7b1b1146", - "5206ee9e0ef01c801d3a200186ef9b65e3736abb05c975c99505041b4f35934c", - "de04769578fab8da17fd3c05e1330212530dd20480cff6e6d9c8077ad07cd6bd", - "b867166d369fe047ddfb20e140cfd249bb25bf5d253122e34a3038a2334420f1", - "e150ee823103af45a850f15967ab0c5dd34d4fe6c835bfe66223155f64c59943", - "96d009be778405c9b66a26dafbfa70773b910740f46bc22842dcf1e3ab61b37f", - "082fbf5ac0a7d361de0a3bddacaac1deb0a859866d734f775c17ad0f876354c8", - "53b688c43a0c1dd15f658ed2a2df8e8502eddc842a3b883cbb1aa844ae4c1477", - "d54ad0ad2464e95dfa056d22075af1f94a9659cbd569cb7ee16e6c86d4c849c4", - "c26ca1e7920d8e272e87a3c64bec37c3a01413dabc5b30c85738e59b32325d55", - "aaab0cea97804e2608b67d4e1be5c5c6163c20804d13b31c221f7d9d36bca3c2", - "c76a067a5c0ce7ca716fdf0c153141859d7b5e00aa1b77535ff2dfe52c710dba", - "42b0a79b004a13fa86d5187a683d7cb6966dcbb482a0d50255b543996553f89a", - "7a73d537b8b3cbbfd01eb974739f9ff38963e0990c31657ed936b80582498054", - "118332c912ce100cc844ebf93549883c0e858d51498dd4ab2d421596f711c19a", - "3f499c5f82750722f381417254ca1cb7853df400aaa5c8c770576cb4706cd77f", - "7c1abf2532386e0278e80d8694a26e475e5844bb58989b40bad9aedbe24bdf55", - "507e3c820de3390852daf022a779f3b2e28875ce3a998c1052e9e78b2965a8c6", - "b39f5c9a6b85a176726548278fb828d1cbfd0739024fd08a99b8c69433c24dbf", - "ace207de57a5dc858ca9e8a4b32c2b4f7b4bd1061ccf86d99c0649e2979763d0", - "83605f6e30233ebec761fc46aaaa0788795b683235ba99b298f9930fa875b7ef", - "5f356946e872ab5a39677412afc51691c71f34ed1a5a2188d43b3e8611c4675f", - "cdeb9df7e8d86fe8c83992a1432de24d1e7e61af2fe2d07d28e05178cc66af33", - "844be15bce37e5b627143996d356a2110eeef9c175462b0ff7e7decc1e3a7c32", - "9755914137f27d9a1f23855d19440fca7e392c6c9856afc790ad4233f09583e5", - "209ecbfb06df5b0306e29c24267829e7b774cc69a7af052441c38d355af4ec92", - "01be5f9153aaec52583e7583acf4010a1900570b1c6f1280999f512f9a494cb6", - "038d03bfd9a2f915a36a5c14a03b48788e6649276a7d0c48c385613ffd821e9e", - "4a6df8a970865863261ae3da102e3c1d9cf39ff8b8dd38af40b0be529679a03f", - "09b98deb6298f629d64aa4265c67710555caf18eafa836ecfa03e04f23f72d81", - "4d6bf069e83d9d2bb2d694fcf32e291200cb945c6f6954cb502288b679843807", - "2a0356b39e3712f717f864ee5716288b5d17ec39597e76aded70d95789eeae59", - "3f624da72b5fe26b2c1e4a5f6d2debef75854a5bf7685d021466d05c3416c833", - "2cd34c50375be5bb8e4d6a58147c37869784ba16f327a55d6de6502eb390ecad", - "5ab5db5a5445a26798b79937a941f2ffd9c46e3d11860c936c6ae9dc0dde681d", - "44c3d25c4cbd7a1ed3b4543be3ff9fe51e20c25b378fcd5b76af30c89bc277a2", - "753bf5eb9ee5ff5389c888306864c7d0b014cdf47c1bae2667a722e3fcbdb8e6", - "3b584e6097cfd0c55437bf31190dcad7af6f204df53bbff1254616fed810b13c", - "28be2922302a94eb0ee49545f2e07d063b12de8b709da85a061917c1d7b028d7", - "827307ba0a115bb20a6e7318d0a363d9980e3e161caf0f233fdd6f2b0ffcadf0", - "e0a8ad8df7f0fa52bee3ce81d6cd4568996181233c2255b40071b70f7ddaeae8", - "eb78bbc0e35df4f0a3eb552c70917563c69cfda3ba5852e446da44f21fe4afb6", - "296b77ee786a29e73ed40ce4bb62e446b9dfd906dda6b947ffed160a3dfb5bec", - "9432654b9bd806522dfdeec0dcf4edf2b333cf95401427676a83430521b6ab1b", - "f588d93884cea1a943657324d914103f82fa0a4e0f9e2be10ba1df0a057f099b", - "3c7cf283e1d25ae1b5785bed7317aad5500d1e0d9bc95b6e17c23fa579fec72d", - "7ae8729ccacc73eb6deb926299240427c2748337af47b3a6322812befbfbad9a", - "d7f19a1ad60d3369825f1e6efe64594aa75005fa3593286271be371e11629b4a", - "b50f9d26ea3b6624eb1c0f6674103e364e59d14d4afd532a88ef0419d42cecb6", - "bae196f1b168f57e9c92927ddbd438dc898c87c87d5d8cc985a999bed133bb2a", - "cb3f8a92aa1393cf1aa40bc3dc9daafb98191f5847932aaf959b723e87f8b572", - "ef9d03571459ffbe8559b9a56d82e162f0d20d0b4411edbe54ab79c1c4f4e470", - "156db40d5100a9d8f1bc87d2e9270e67aabc4d86f8bf1f9dbf5aa7d8e9fd47a6", - "e9245b2fa58c23dfadbe605b43f210e7f5dcf8e65c28d60970e9bf3a99fd97ee", - "0f4924e55802227b8802ee644c5313c6fa06dad162d1bfd9638567dde1194289", - "223c53e885aeb1afb1000d55e66bc2cea165f177c5c9e476d1fec670a01048fc", - "2ffdbfd0dce201a33de44a4b8e4657809ba70e2d6f4675597d1461876b6a53d0", - "023b8fb2d5196c159ca45b6eda4b5d367f07ccf9933e19d59b2a5a2e3521a99c", - "663f4a454dabeb97aa4894f99b88c0a85f4965ef44e81e09feb75a0d37109dc5", - "42e4408078ec998e70e8e5b72b2b67118122af0e44c920c966f5f47bf78b5aec", - "726926be1d0e198e6075eb5a4067ae3edee78c495b603f2308812596a007e436", - "1670ef082c5ff3f5af38b85c4ad2e6dc98c8fd2dc791becfd246203079e59ab0", - "9bd8f3e34bc9d10d300134b4f3e411adc3ef1bbfa60d279c52439d60e9ee98bb", - "b4f6cbf54793ab02cb0135d55d2584df1b03a7659276e82c7332e12b8ddb719a", - "e16a1c8bbea41551774fd2c6c5186fdcdc0b0237903f6caaed8c964ab65417b7", - "891badd0fcbf1b547c40bbb1cf87899dc8c28ea13e903f42c1d0d29a7d920e38", - "cb2186a1ea03b62dd4c5b5b2da90fa51c12fc32836ac3e971aba194352969e7a", - "0f788f36f54a5560b59fee6118389902c720f33978db195a8e3c5c6c032ebcb7", - "4843b3483800fee7628803aa180dd6972f675b414df18490d337af31a47fde97", - "20836ebbe09613e8ba4fc692eeb0a32e46ec146f1fbc977f3b3e79f629b2c8b7", - "9a968930b4eaf91b746e009b3114c1b97dcef48be02b10c01f6612db027be98b", - "52834a58363157dc06aa565d6a896f238f99e930044f49fcf37fbbeb1ed8e648", - "e2b7bad7eb6097873059b9f0286b1ee86779645173dac896d798c36f3e685083", - "5f606b9399d39a141e295cbb54a484c71ef68c1d5d7a661d09b9eb9f3bd3222f", - "7928f303b1f9ed4b055d62163cb40abc49a03408540b954e88ffc96de6213b3d", - "795fa4061270081a70a0392e966e42f1cfeb3c9ba1686543c2fa6fd853224b78", - "280c556fe18708744f53d80cfdfbe1fb94d78c93239869aaff18f9f2edbccdb0", - "f0a577fbca018d762a68295c4200f5e692dedab8f77643eebf188dd3c9a2ed89", - "f027b71f12caf8c2cb40cb3af258e8dc412edd37b8c313682a4309f8e8580e52", - "7ee00c1601d5bbca94470f43736076ae0c16f74ed1417fafb7f5bf8564acb793", - "a1fecd5cb7a39f2d0ea5b61d455e6551ebe041ca7e890f72b90d7ce246ac5137", - "8714ee31b73709b902b4025266d871cfc04e2bcc2975af4f9337c320895bfda4", - "7e754de1c66ad84565e67c8021745b9255d5946d642fda8aaa072abf7c8781bc", - "a49b33b9e9a3a10680bb3a5b47f6c675d21390456f46ec990377bcfd15921cd6", - "9bb161bf609783bb11ef3bdbc7b4d883c3240bf88c50a181842164e10b4617c9", - "c05f705ec1e1551f217f343680a827dc0a2dbdbdbfff0001c3ca9a8f6fc42740", - "51249ec037d41b68261c7a11a4883cb80f71f304c27c3aa6914ea17eec086e96", - "106d855e8d2fc143f1768d4ec917874114f661b7ab99a363a324f65dbc58d570", - "8cc9c792337447040dfe3dc77f57ecdbb34f415e641bb19a875d292ef0390292", - "c82b06f5a0e12fe5f95b2963d0491df8301c25c696a3b060efdc5f9432ade6b8", - "04749fab1b45656225ca7b2ef3429df88d4db50bb9ce99bb56044d3eda7ca9b7", - "cdc505224940ef6742134ba2752cc5de662201509665f9595b1d3dac63553328", - "9264563a7ce5956f0b9cb9d86e5722a991ec54daf4b7e8a9bdf02768028824b7", - "e9dfcd527ae8145f0e4bd150ee5bdfac73ae70194e7e9502bb8a9d6ce6e1242f", - "44873e80c24b607c11533f77ac56a232a85178a6fcca31bd1360e3df436aa2c4", - "3b843edd3d8baa2ba2b6d890d436b6453822e24fee4763daa6ec24c55e67cae0", - "c0e4da6ff0f47eb45b13cc47be98eaf62207e13688f2b0d6d29720e1c1ba9e3a", - "3a12b1ff4b6447988f6a96d7e2342871fa50b8532ad307a5911ce02744f0f266", - "99b9f9ceac7589ad4e81bd04ab61e444715323b2d094c63f0e19f13fc20290ac", - "712ffe39cfd26b18b80862607b31a98645ac4253d8a899080740fb004013f035", - "4a0dfe2f29bf338a18501421291f8e6c67d3e7a994f7d22cdc08487070c1d5a1", - "51d081e35ac7e548bf008733d4e96bdcb5f1e43648cf722b42eedcdfaa4bfb30", - "82017760682d0a47090dc2ec65004eea31a30099165cf15e8ab415d4929dc91b", - "0aee5a35558fc5ecf15bc88eb5e69728fbc3adfce9e0af2626b33c0c154dbb94", - "dfa22e3c03ad3dac573118839cf96d4ffc468dd02b0b8f0695e018b923b54dfb", - "e4516eb232eea8b96d93b52403ada8bbd8a6a388230c2e9cd2b6d4da52f8972f", - "981d4b473d39da826e04eca76ffa7819dc4656003d75978d0e4ad1177475c65a", - "c38c2251476dc8cde5104f76ccff260eb85a3374d16b795f0d6996a8c3fe5cb6", - "9847021d5faeca9dbcafc06489ea9228ddd754276ddacd4a13e6c849145a9493", - "ef2f27cbee10a7d41d745383777cbf082226c27d328c4d09b7c25c439aa31b4c", - "630e17d0e941fc531100b0b6e34fe0f2eb354dc978412027e2310f8d025b58d7", - "a9c1665f12e02e86329d1565ed445ca1ba762e159055ba7d1a51a2221c7e18c9", - "acb63f5a89e30b2e5d803cd04927755363fe3b21fe310738e48e8cc4af11b59a", - "b4a156dccbcdc5df8ef89486d7ecc031ebee0e4428ac9bc583e4b61c3be9479d", - "801408503effc1188fd6f564e5feeb4d95a6067f8d8005e38ff8fb1d465617d2", - "0f6227801876c568c82ad90a4db46a4cecf608e6648101252093384aa4a46446", - "df4f614d3d5db6c2564c21f5ac9915c34ab957ff807b10ae1d8cfeb2a2cc068b", - "7e837896a8c52ccec8f3aa4f895a2ef55e0c8f2494e23eb7f663da9ab582a9f9", - "cfebda565210aafdf7c98789e4235d06d8875dca99ba2faaf16d4c4655ed9f76", - "53baf09bacc0dc34aa0564981efa0d7b734546f03100f590bf8a95594b812980", - "ecd6c3c67cb69cbf16e68944de55767490e09f55dd41863acd72de0e836d9200", - "d36f02c1450e5715dfd145bf5a9321802c26dc3f7942a255f3c68825a0b0f3df", - "1b68f93ad5040e78af46b05bbbbc06cd3b0bf75f4b7e3b24299625243ccadd90", - "0669c86595ccc8ce191c7f2ec441e94991b7771a83f89e935cf7a05be7c2b93e", - "8f15716277198e35947ba9056a1f2ec421eacae14de90aead5ce545dc558a36a", - "ea63689f21809986bec64d7434adcf52eb039d06b49c5c422e959978ca1950f3", - "5b6f7884906497f402c865515778066b75503d38375095accdca1a55f165e2bb", - "b5f91ecae004e242302e7d2885ec34b098a1c16eed1c1b03ad04e1664369cc1a", - "96b97bcd1a7a1e6ad588e5ab2ad006a790f951ea07f84ad0db3193871bde05b1", - "e17f23ee35cc5b736f550005a7500934a6d7423d3f70c80c670656ae12424e7a", - "55ef8bc674d3cac544e340b21f691f2fe1867faafe5f79198f610fe77ebe13d2", - "0ee5f7329e7a6dc6edd3f8744b6ebbc8c41c59a5859a66dff9969fcd3d0c1765", - "09017e79ff5cca529c473e5961d36230e2f4b61e0881d73b473900c7f83816f9", - "9bbe17a1413a57f2cc95c1220e9224917e866a5c8a3cfe53816550634ff9b7b4", - "096ac82efc918151909563e43a3dd4e355f2c54cd39b59e6f3abb26cb310fe82", - "08ee9f0fe9436a8994732d3e8a8c6c65a270b8cd555f9024ae0f0877e75cabda", - "16b5c3d2a93ad7a2c00d620db0daaac8eb0029d9df5728ed0f834f921cb5b83a", - "0833ac621127edd27a670923bf35f73ab3f5e7ef06ea2cafefbe5f1e243b44fd", - "913571f616e4329923f498a48aee13eaebfa7a8f83fbce8f4565101ac610f884", - "234b51694056a8e9ead10c931b24579f3977db27593e2722cdf3b24084594319", - "582dcb1f68220e4a384aa9b309de7f40c787e1f239d3f4e119fc0584a092cfae", - "216fce83f1f80ef25a6c2e0a851096ea3bb2b8c27b4e1ba2a7ab5d3b0dfbc44b", - "fc3db2f981f6dfe6feba21b622e113de663d2b984fd3b17eb8f4464f3b9e7278", - "391a4df73cc8019328ce6e2c9e3de518a86b4bf385501a0a08ea9553c31f542d", - "4a7359530f400c76f755ee9dfff94b4431051ca8081b74b321d6b3a0dbd5140d", - "745ccb3503bc708adadce2f2c51d8af12978b015f5d47ab3aa7e3a095d69007c", - "0f49bc46813ff4d8fe32b04dd9d76d1d6c729c921d6efbb4c9055ca92ae68a82", - "d5ebbc49a58d949b8de7fe5000fa62ca1a038769681fc1992660fc1e65f5623b", - "919cebcbfcc55d14b3745bc15726c780967981dfbb71a2d2a5e28b571bdc410c", - "f835b595bff5d159bdf6fc9d14b323192bff02678b8b7264c78d860d73eabac4", - "94337424280642e1f8b1caf3e78ea41faac3b16648f1d2e24be97f64900ae42e", - "d2f17092d1c15f0222d7919c1f467790f5e89bdc1340744cfeb91cd8f5c010ca", - "c7bcdf7ca9efe3f08d54c115f2d9c39a67ef50bb59db9b841fc086a8250a91db", - "aeb4fd643dfabda1e86e3f4b8c7451b68b4889c1dae8ae7296c54138675a37b0", - "bd89c924e34317b2b58580650ee10e08cb558a28737407e6eed460df6f1dfa01", - "2e221df44065f85425b52fd9c396f5b3aca9e4ef2aa2f2d3f63771c4be41156e", - "d6de726fa8c81788379b3e6f17e178b582986669ba23ceeabdc2ce6762738752", - "a67abd2d9c524505d146b91a5c136f25de876ba96663f8ddbe4c358d423c275b", - "32a45b0d18e697dea59ae211e72b863e971516bf7713dc765adecfc440dec217", - "764ff698da6247917add4c7ae9246b1a9cca5a7ef7dd574e68cb1c7c459c7d04", - "44bb1ffcbce1df1d37fc7329955f2d3d0ef0a8c22435ebab1e74d1468687d2a8", - "b692d040387fa929b2df57eb756a81fb17bf34d6f011895914b96d2aab8333a1", - "fb0badb7ff2c0b275df37fbc291d422b750b70f4968cf6bc5aa72bf70a388b8a", - "a9bb5bc9c553e353d2302a0f234137b5e1998a5fb1d8faa55e64fdccb23365a2", - "f0bba52e3dff756710b1ab6839274a18abde44b8507197251ca83a162f840273", - "c669092657badc3d29d0f0e908680413cd8b68f92037e3eff8586acb0a72b8ac", - "4f401cd70139d3098c77b2d984d11f62b31b09d5437dbb9f69def73e481b580f", - "bfa4300cb6dd6675aa6bf111866ab372fef928dcda49244b587321c1abe6f271", - "089ceeeeb2513b7cd0acbe2347c40229ca5eccc2494683c943fe10d1e916c3ca", - "7184d200eac60eaf4394ae7e28b884a084a70c1eca3b224b3bbdd2fefdea1df0", - "2367dc1a0445b1c15348aec2d6eb5ede86c31b68c91e293804bdf2d5fcb2b693", - "9aaef398ad4e6b30f87f3983e8eed1f080765a24e5f4273f4727099da91d803a", - "5a7c45b3cd4661a255ab063273090bbd9b10bedf1bba0c3ad0758ae95f25577a", - "bb153976d5bffac646e4d1c33150cbb727c2bc7f342b5855c3c9d0c016567f22", - "296b346eef62046f1ccf8a1bfe9494a801cd2db79390cb1608eadb9c1d620f97", - "2608bb2997a4bd6d595a9adf71fda810b1e8ffde8a9eaabc85fc681071191f2a", - "1c5ae2bf9984b09d86f7d6913d8034e970d868096ad1589ecd3cafe632a49484", - "916bebb7e2f517112608b8f243918904f061239807df7d6487a0b0189e410663", - "bcf03f0674ff5371dcc88d19f7cb9123d99fdb77ecff9fcd84c7aab460705fe2", - "66ffe84ade7d750043e7445c414f722ea797ccae25a57c70d7c671db8cde5cf4", - "32853ca083fff04af7bea7f0b4bd1c3e992d6d19ee49e52cb5667a08b352411e", - "3fe71a85e8330268d754f37dd31eda0470f0c84bf186317f47c426ad7d6ed666", - "7de19c0298e56f3ba244d312eda419c346705e596eee5373f2d0970031d23666", - "7b59f5aa91b44e26341d175a70977c53ebba9ee72cd775489020c26b9c1259ce", - "9ebf4e284f8abdad579833dec03df5dc2c8dd64d142369313ba3d5eb2a75f026", - "20d05d563b7f2b4c7ff64718e7c8c55f5cddde15424e3749584850e43dedc181", - "0091ebaa3926f1397da46bf059b269eaab4568b22a571463a6f3afc36ab543cb", - "0e2318930f2561202904a9a9f16fad1dcbd996a11bd6bdc128fbab4c0bead740", - "e9268cd364e02e96ef563305abdfe03f34db545c1cd0a36ff1925b98f47f92f5", - "a5c8a8c34215009c0ac36a7034caeec330fbe4c31c3fcd528424a21f004fd7cf", - "b0e870497bd115ae7468144614dc0ae5714bfc7319aaa3957fa5794d54568761", - "18f4f163b37bf8bcfdb20a606a1222104a943498b9e8b4fca25c447ba1aaf42a", - "b050cebc9797d6a9139befd6e27d0b5a4ed37fbae2673357c1b02f68072a3095", - "fa72c721c2ca530544ff17e22b7fb521f26ff0cced393488c670632cf2f74ab5", - "56b6b41cdd50a470746e4d3a2c1215c7bf8852b49e9958faac6f81b9ce75a895", - "80db952750660d2731a9229cb4d54b9659aeebd171c69ce326a83067b4103b0a", - "42a258504b6022ec987b37fb468abf044a488c3b1152dd1e01fd92198fb50a9a", - "ec3c8074dbc8c0ddf94c2871a7ee6e03d37c85932021ea5341d99275c4f932bb", - "8d7f03afd286ec901ccf161c146d6ebe061dab01ac8abe47cc538751d32606e0", - "0edfd73bee4f4dd8ae3bf8428da647f49d2d418fbc842d424644bee27a97fafd", - "1090b4af2b24a75717e48731afca34b4531b9dc284e6a0332efcd2585a5a05ed", - "1f3481a768e823486918a5b7652a046bd2bbb35cb8f1e95415bf7588ffaeb191", - "470fdf129f3ce890c237a9d119c794bdd254a98b132b7ae5eed6a2db92fe3efa", - "5c4605f7bbdf10c1b1b3a8a9c5ba2fd8609fa4dc8685a1dde339bd255fbbfbf3", - "318d1360a79bdf732335f3bb1649b4f3b56147eb0f93ede61ff8eea1dca0a6bd", - "fc45d8099dd4fa00ed5c8fe74714e627b1e03ca1f4de52e634ac470bfc384286", - "78bd5164164c163eeb3ae312a4bfe9969a79f54c439d261e4e7436eba3bff0ca", - "03456a33187130e1941cce136bedd96076489ba158baf2bcbde43f63db5fff0e", - "c3da476195fb35fc90f6fba0bc2c6f768da5a2a63afc0413fd071ea7c38fdf88", - "19e30ecf6836e6ec6d622180f0987a63653b4397af7eeda2c9e8a9330e029030", - "ba42a5ba11c4b125297213647f893cfd24b6114bde11d76df29109f304a4eb51", - "14ff0c9055f7f2bde68de80c4e279b1381750f01067d2c94120f55a169495ed5", - "b331679e943dcc77d54008666a7fa810989430c6dfa096665db39d86e9a933e4", - "92b224817954ce58e625f02d1494c393b796d63d3ebc168d1ebe9e5da020c85b", - "7e768d7704f885cd19e1a516b97aaa8e563c4808cfc31a3203cad023ecdf2d65", - "48aa7ed06ec1ef2324fea129a2e1b353e9ff776f90292eef292221b651eda77d", - "ba91b8cc497fa7b4f97fcba2d5ad761ba327e3acf5695f46f44fbac672099294", - "810ede5c925fc295984547bf21a595a8220d49e24c021e075a3ee0fedcc29b47", - "8276f5c11f087d28b245464d2bae572924f3b1b8a01ca78e801eca1132db4b61", - "0787b4a30cc7f147314dc2f925a286ae71cb0c310cc9e0d55ed1dca1c65bc91b", - "7a63ceb308686926e816bdafd78d07d2fb76d529ae8afb365f7cd3adedaca441", - "6cc119095d9f6cb8611a358e024564f8bf08f6d8996302da93093ae9443f3b92", - "22f281eb489620c4572cbc00d186cc917b77d6c00cf44e376f3f86aaa778447e", - "2d7332f7d7ddf32837b26637e582a629d657fa74e4fd67065315f48ebe76e53b", - "5a78154f2ac7ddfc59aff5c8d4077c4fbe88fba07786b790273e3843da4bb2c7", - "0dba7e8b291e5b384327dcd1f3faff36c7c2c92f26176574e8c1610ecf718896", - "84dc67d190645aa48587f62549fe469e4177fe86880c4ed9cff802df2f3eecf2", - "f6610c4e274a89e27e7e49f42426c126bf5ef962b6ec1734d7d5b3f0bffb6485", - "e5f9de29cac5c47e87003f0296a1d1f5b62b405d25c26676b3dbfaf6a1ffb493", - "4465617c172187e4ce103d5deb5705b2ed77706f8f8e669c7955966cee3a8644", - "e92dfa7e94976a1ff06f8c572580fd597c216a01c27dbc168473642112b24d83", - "a509fa6c0590d9c97cad5d605047d65ff36b0ddc6275b5e15c6819f9cb800a33", - "1085218f508ee4b3677d39a867f8179abe1f431158d3be1e9903b6ecfbe07bb6", - "0794a3e5528c31ad0d211313ed39dd5175d5fd5f5a97baf64cfcfd8c3428ace8", - "7dea4eabf34162181374fc683b5da91acbeb0586a8877b9aff2c6761bd668f30", - "441cb44993fb42748044725d2190fc1cb3efd4b9ed5b9249ef19c220a87bfdea", - "3f26df215ef617ba4443099ca13893bceac0b4d5861fa187519f89c1e4b96672", - "7200be2171439e8ce0eaf52898135685ebfa0dcac5bcde7fd5dcd1dd99761a33", - "3617fd78c73fae15be16e7ebae3b3ca2ece8104b6e27f5fb10a9fa88c63daf5a", - "b5671155de5c38d77be8e5e03e078940b2e663aef38e204c28426ae4d5a1a715", - "365dd1bf379406e559b2b15204b0f6f8604fd8e556d9b7a9a0cb4c313c2d7aca", - "404e17786731d552c5ecea2e6175f364146ab482ebbff014d05a7a47b5bebf12", - "dfb22683090f2018780d69397cc1b2f88408a6f33678bd3cbfbf1ae07679981c", - "894213cef98093525fe707e10fbb9ba411e1a70e553efda94e24446def3bd67f", - "20eff3102f7953bc782d41b392da3625e2c043be4ccaa4c62781a914e5b7980e", - "f770cfcc0fcc9319bb808c46c2e364d112429c35132b03e7deca52e6d9db9dda", - "ef10ce521f355ab67ffacb03925da3e9d9b811197e0e941dfb8c1baf26655557", - "93498ee95bd2c4d24bad95b1e102bf22016577e85cc70723ee539587e97b9d6e", - "b7f0b6e87860edc2cb3fa105b42738e7761f6a51d228dfb24e7730b0fd11b309", - "8591896c0946df5273a3d54b1e673f7cadb5c5758457d729d4632901e03e3494", - "31edf5530764679dc989543acb8cb470d3fa337e0537da554eb4164ed4e7f89a", - "3e50c089306f4490ae6dcf8e29667bd5e9de5b532fc50bd6108b3428400a596d", - "1d9023265ba74539def3b0ee573028bba00390fd40bccd4c2d16d0c4cbed2cbd", - "42c981e144806347336f24653842493ffb5a3b686a89d04978564e72663b65ed", - "2055ccee63f5543b8f68ab3b4d4adb6fe1b27f2bca6d4cccd1cd9c81a4a1b728", - "f96a77e92ddb768101885453c960f3529b2537fe42909b5527d4260b1da6e8d9", - "d661c39fc0ac5d3ab182fcac987083c8f2cd67906f50a96eae601ba968fb50ff", - "9762509154f09ff0bb12b7f583a2b0b7fc9fa5801371988f32c8d59c1d2a8a41", - "b4f7b91e0bab13518afb08bb8fb9f0a97a1c68895b4d4b1acfad915891f49c3c", - "f5d5e9f2e6af7f8b4801ccca79e4282210a51e688bb8753f9d432577b496247b", - "9746a5992ffacd1ac44675dd512a7098d286bfc1023f677b05c28adaffcbd4e5", - "86c55434bc7a15907fe807bca5ea895fec0bb87fe8dee1a5e0d2a5271422bbc4", - "ebf09604bc6be018828f217cc86a45b32530b4aa47f00eb06bac509a880ea17a", - "b79d33caf79678963951b188f61d9d0bae6809fa450ca5fe0dfad4a706372c1c", - "fb2ab54e230c8876866dd2d95f63654eb04dc3716e702d43c465f49b35875802", - "bf5f28504ea61a766191058689600f1a58fa3105c3302cd47a976d39fd493998", - "0e68fbfa4598513b2863c729ca29f2a46b369c57ac3df8dbbca33c7dd58b7812", - "a1dc583f1287ba1843ed69b66a4345d7979e096109580b63d7cdc92f4d58267d", - "ce49044a3f49f56462d968d5f3f8bff4aba7abfe859c8ed06a5ee310e8c915b0", - "968b0a209e2c95966ee47f64c302bdf3ef0f8793e92470d1bd1002b270b3e430", - "c11a0ea8d971f1328c442a3b74bec636884e9b918a2433809d9b36ed0c95a835", - "dbfc815428f68001ac76bd82916101f95ea727b19c978c614b69d03ad033f541", - "1a7edb522a59a9f44ec4b7d10907db38311a9b7f54f8092e2aa893bf1b9c44d9", - "3d396754d966b61ab7904bceaff0c43e07a89c7dad927953b64eb843fe4bf11f", - "a10c8a1257afc3077984c1c118ace2da76c7f2fc0f89d1333599bbeea533cb3e", - "60ffe3e6e1a0ec79cee9d0438aeffe18f3be0bcf356058f950572e9ee4dfa5fa", - "5d9610b0b3c16c4b7bfeb899395b602ea14167da084e9af58165a1810a06cb47", - "92f81ec4fa0f53feedc022e04ef70d084a3cf79283b5306205e68f2c07c8950f", - "779b275d2addcc6badcd4704a1cb0aa35fbb3cbf58cb02790eccdb7ec9f3763d", - "a79d751775e03e6a1e1a38e9670947c1e8bee83487eacd2fc9106c7ab659bfad", - "79c9bb304ad3a86e57574bc107e9d8e813193a32d9978ac3f29bd615edecb80e", - "4c3fb418d0b149f33272fddd2436414e9993b8d903f55f1f2f242208f570a7da", - "2e153e2b756be4037e5854c9220af221cca561251f8d213f51985a0938ac1e3c", - "f7c9c5266a8b7056812a3fb9ae2f177cc278d732014d94292793e3a46d39162e", - "d26f39340c2fbcd6522d6153beae0539aa954fe98c51ed515cea0bd940b0f94e", - "95382ecc81c122cefb0823b4a05d74f70a25c78f4dc704eeb597482dd0df0e6a", - "6cad99aec68c55063b9c54c6e962cbe3079f50e70e47cbfab517dee5af2f9420", - "56f30dc9262dc904c1c46ce6d7ad52bb3180276c5532e8b92ea35e602bc29125", - "9718337bfde5bfa88b4b53edb0ae9abbd2cfede2af620bd88337f2fe8dfdee97", - "f7878a5e4ee56d9650eb48f498c45c098097162f536e1747323efd53df1de4b4", - "2adfe6e59428cf1de8f127366e7133deee7794934bb24b022bff400da4f204ec", - "1a3c7471a6c3d7a66e45efc5bace3ca1242c7c752706eb6202b9a0be1658f743", - "f2b7e7627327c649db5b3b960b84bc1f57f5452f5eff6548fdf6193627131504", - "7c3890ed9b2a5fca13dbed407077b7518db4289810979d6da02224c4b0a18b88", - "f1247778e62aadbc2ca4bd418fadbcc69a91302e3cef621bdbd50fd691738e0f", - "63a9dcfee4e35940403a7cbdd4014d1bfdf00348e839c14f9403506498c3c398", - "55baa765a1305339830c86089ffd0f484f9756782ccd5e64927f5f493e800b88", - "585b6b79eee0bdb5fe034d9db8061492e06c857b0250c6eb3f1462f59a4cb0de", - "d59e573cb91d64bc4401718e4230bf4acfdad13c8a34c9190779e2f2e612232e", - "ac74ab3816fe8b29a3cf14cdd5dc9918e2993fe806c4b2c66fcdd42de676e2d7", - "562fcca64f490bafdcd72aa071b5ebfb7d028625a9f338c3c77db72837be1e9c", - "665fd1e179ea0c1b87871d46c1c941b36d43835f179d17c81acb031a8aa0d924", - "7d9b0068fc657d4d38575b91472298840a25f847860796542d81523683183424", - "9e0de47fa2bb138245f8063c6eefb3bd7c15d873f5a387223aab0c055d67c777", - "2fd0b3bebf2ccc92eb0581ff7b8ab5b2970a2fbee9e83de06282834fbceb3c3b", - "660a0e1ed41e9620b8eba7ce617ebdaf0c47914c3bb45edcb1b0906b9473f535", - "808cd6bec951792f8893b34ed686df8abf1f70db130d1f924975ca7094d7124a", - "48f2f8c3de68455caf4586731ca40a2fee391947df25ed496b61de94522b17ff", - "6a843a9f5e1322885ca997bf0dfe824f9502750dc1270f0bd0c498d15f25efcb", - "09b0b384cda2e62b720d5d11d539023eee3d9dee31d39dcec16d6e20301520be", - "8c7e0792e7e31a271a38fe66f8c971c01f5e946b594b1e85c112aeca345c996e", - "374f471e0705301306c3e6f3ed1a25034424cf2c1846858a002d3573ffa5a7f7", - "edc56b1d37844e2f75a93b3d34532b7629e1c969e2320852bb391049a0d6d91b", - "e3d7ffc61da343dc6c96c5a834716a792a4b46f77c15142733b9265f7319ba87", - "3bdd36bdd745eb561a440bbe65c31460fc62946f9dd6c3b9e1e18577e9517604", - "a74f992ff383c04042cfa194d7372ee55d1557a8ff0192fc3d1e774291b32f8a", - "f8c14ad4ab6841d03a4fadaa49216b32d9bb50a2ecf6a106d4f0ff815ac2d57f", - "e591ba63520affc7aef87c3bdf3c6499873a26c0f4206cd991602ecd1c5e13cb", - "f08aaa739d711b21ab6993d1bafa67fd482fd964fcb443254c70447ccc43eec1", - "ca752094d43d59743ffd9818b27669513f53b5ceb54e0e8bef97a5ddf8b22e94", - "4b9a8ebb7fa686d51744b3513652a69f608658daf3996b3eabc117e4827fa34a", - "08120e231364b5ae6ee4e2a2c5e32797ebc56c913c688d7ccac555be41091576", - "1e2af31ec9d6d4c51e405d88d167162b38757e3903820d889c2b21ecf146cdc7", - "50197877f2049c95d64e9276cadd7274198c539f3cfe3a3e1e62a1703a475ab5", - "4c0554354448bab66177dbd2ca9a228f0228c6382342ba6c2cfb734fa67bf336", - "c4e0e96a9d3d63280cc87e86ca27834bb2f7a2856702fa1b0f90772a3e4a9180", - "a3bc1ec59140bdd5383fda94abe2270674d141cbd0b11792a8b34dbe18863403", - "04437d5ddcfac88eded34ee75c8c81f5daa8763dbdcaa4866fc2929a6e683f56", - "53abbfe817b6166df7bcde1fc6f486dcc7ac3ec0c997c3cdcf775292789fd63b", - "8fb0c04714d88a473f3ae74f98addead0487fe930b5ec6cda1c85bc66838b3d3", - "178decc943bd6710f663f5c5c476f9495f0365e0d60db33a6dd528f927e2bfdc", - "9b3f7d1528ff48e39258caa2441811ae8347cdab904399cda393d92992b42136", - "24c07086473b09b8c15b963bd5f3947eb9a134f3d344d066f9c06d6ceabae581", - "4a789adb821ad18cc02a380c02c73ce0ffeda19e0e6525aa99d13e75136ab322", - "dc93f80a1d4b728857344a079fabe39deeab39d5f3deea93199bb99ed524552a", - "762032d0614187fbfdeee1a4ff37d6336145104b028309924532d844df14d43c", - "bee4161ae6899be42249a95978a7a57158ba78c21cebe87d995b6c8485318f02", - "66920e97c10ccb95bd6d2ec63074f95acad98c95f4e0c8f3b21923346d906b1f", - "7bfd3a12405d7008b92ed1985fc50b115230352178ae5fb0db644756385a4846", - "50d86a5a3a7a9a37cc229097cb371863776cd576e11165feacd0809e0af494da", - "77e71ca496627893e408e150a373d38d1b6f473aa6322923ab74e86878a645d7", - "afe34f171f7ab8d06be9fa4faf2d2e7f205a1cdae53eb431d6cdb6271933abc3", - "7077f09d514ad10b99152ef42ca17fec8f2bd5b437b1a1c5ccb371dbd3f8702b", - "29f95a41b6d542eb0bc18a13653847e09281e51363a55c2c16f1ce904a8e4ad8", - "3ce97b6e59eb0f224c4135c9096f32bca5bdf47a1261ddb191aeee57e9531d5e", - "5049dcf0c120d0d77d05caca8f8ec18e2ec84278627f54b94a6cfcb226a98320", - "ada95e55316ee1d6cedf44a5540bb9d6e083eeec919acc74e00095e131a9fd1b", - "bf177a73d453279d06bac957ef734d92d8f5cf9af524fae01315345b5e086bbd", - "fe479dcb27f1034356bd2b7a7f237c52c2217bbe13e5b351b05cd3aa2c552cb9", - "4bd35b5bf0bd5fa39d86f6aa091a5e8008a2247730d537f28e397271925e3328", - "ab89e2361a7a4ac20ab43d567443e12e8cd993378fd0d6255ff37ca737e9ce27", - "5dfd1f666943d2755af79b7b6bc5e518a4759d04653e7d254382f6ee45086700", - "8adba46ce66bfbb86d04b15851bf35f40676aeccc74455ff4bff586832c53b9e", - "bda73004a2ba23f852dfafc1892a288dcb84880549dd27ea612c1269cce806d9", - "999899d0c8c4989e72a13ef2df726421f1dcbb6849a16117f43b5c3173fe6309", - "e83fe4913be2bfb7de117c676131b49b1d4fb9c043a6d9d207f44bd818b546af", - "824687d3552f1d1ad1905972eea121e9793b6ce60f09fcd7f80439ff822ac7b5", - "7d7d20a3f5ad59040d81a62f53328523c4591016f400fb0e6107630734f7f84f", - "f4af9630e2b3b51361079e0aa39c60889cdf775034719bfc42afe3e11a60c5b3", - "b61f58a9a2abd31b25fad6e3223e3a51c0097491140a3fc37745bc74b8203248", - "5d3f17705a1baaef76065eccafc20251e4c2e2f5cfc98ab1a8ec19c075e938a3", - "228385f03ccadc1cd3f73d2d6fb71a9979edc6e4671e47d37cdbc2cd336dcbab", - "ba2539204938cc0272e9127ab65cae5efd95fc6d3f47c4aed926df289904adb4", - "4424bdf2e317792c3eda529d0fc7299c93270be22407209abf68bddd6fb33877", - "ed21bec55e3863af74a8c6484408ddc2119c15afa9081d0a824eded25290c2dc", - "7a5a8da3ff36cbaffa158fa12b0fc9cd2aad13db001cd4b61af94ce64b50abb3", - "fc3a9eb06254c65ba7f4392274ab65365885088bb2775127165884da232a69a3", - "b45571c077bf8e4f1d4e1b5cf62535645a5365e82be41e7f9b6e994970cc488b", - "aa565734b64e368f1414728a481228a471f29f3af2a0d03c30637b8dce25dad0", - "c90255eccb0511fbbc16a01645b4cbb57bd0eb78b34284abc00d370599d77a1a", - "721151f5ecef2f64c580e2469ce353e433d220ca0363bf74ae2d8b67ba35f358", - "ab255477a71f2a9c0d58eb7ecae6dce39755ef331787fda67bed647319688442", - "dc6da00fe0cb004dea00ca2e3f68e53c25436ee4799ed431fdc9c6df175982fb", - "2e04fd419ab1a25bed13264428f0681d36b9cbf65a5282b99f330710d2db02b3", - "7eee45855e8fe815c845a659dc874b23de3c7b8bb1c4eaa4643eecd3935d6a33", - "8a53c065f4e8d61e30e407ca93ce860f8c6195845b5ac6fdaa16ab60caf1d2b2", - "0780fcbeff09db826b2d15f9af6493ff34077388210118a42ec07eacbb877388", - "9c79eba9af39ca69d8a720ea2480937d26a846da8b9432a7c9a84c777a846c1d", - "18ff2b159d05f1f4f56978f670ec73e729c90486d95e1e69cab1bf410cff4569", - "91800b478cbaf351b44651ff9a499867239d0cb55eb19230c2c4f640b84bb39f", - "b84a36fc01daebd5273248b78663d585ffa780d615a20b59a3c1a5bebae13aeb", - "49754e1f579c3125ed0d594bdcb5cfaff4a400805a611bea2f7852b72a36cb82", - "91be5fe972dd0a2f810d614e86a9f86cbbe22e3b42ce668ad04fb27e482e77bf", - "d1fc07f2454bbf847c5c590952c7e2726304bc8fd3c40d4e33a66e1d5113264c", - "43162e62d42e1251a7a7277be38959c93f2b37e0480374d737b8995c023edf3b", - "15fd481639f8c39fb04543e9cd723247acedacf69dfccab6bf555ba4d3bf0525", - "6a0b884ac7b9bb29a5c0bed275f3290dbd9f208cfa7e1b385d19fbeea6a359e0", - "70bf8d3224e347c1948c96b3e95b92af116cee23b8008d7f3e9d2dc077d74b6c", - "cd6f7003fd15317c22485234ec7cdeb3b558d607faaeecaaba1f635a50262339", - "281f9ad4bfb170ac279d2b0f9a32b0e4a068a5b028cb55ac3154ac11022478d3", - "e5fc0c385124d182607fa07cd66d936748965e5dd15946b8355082c50f79a603", - "62f598c0a9774531fa2e95d1aaa80ed283d3d2b9761116d414c78e50dcee75a4", - "4d8e2751e232f31bf060d7fa05762c16b9a1479e32c9187590ee3c06538a05bc", - "0b3a13de32715b1d8bccc25f0dd56dce4125026cdb8a715d49e422f1830c1d8b", - "a28f40d5df29529ecfa9e1fa7cc2a10c709e2af64e19679a63b8f96530ff1db6", - "f2adb5a6795ec6691cdc390f0878748025c9aae7f69d17e0ca8d256dc0e37b5a", - "93e0c220d68504b6387566281c15ee0bb7a71a849a21b1e582a4a0bba5795382", - "b45f3de971372704d96d50648e6ac09372e05bb70643d8998f43b99bca5f1ffc", - "63a255e3f7f9445bfb17082f57ebf16da2804e2309f530b7f1d352cd118f3a6b", - "56bd43a69a09d2e74961649b9c15445d8dfea0b78a0855d1246603b8a5c187a3", - "d83791c3128179db04d9ef4859dd680454d37bf271617de3e882cb779536f27e", - "77788a1b4e579aa3ccc901c195b9e513ab45206b061a9f570b9e4b59420b1378", - "a8a1afef5cac9c7a4b0591d90392d82fc5a5bdaf32e02c8f2c7afd22a18f5367", - "a0573687ac1184c75d5e513fca8e922c156778e44634bacb6bc6811a6da15bc6", - "e4507c480d6b520b8ac7bb69c8e7a78834618261c6953ff633c4ca29720a885c", - "2b286dec8804717702adda27a41c406702645ec503400499ac2f121de9822e80", - "dcb01326b4b3159f888dea8722907ca5408a931bfc707dde559cdf2baf078f51", - "b7aad4f5b6abc4872f9c54626c1cbe15e382cf754b4c4b9ddcfb62a9cc3dfca1", - "d4dd2ac290909ba1a852fd4a5d5b8d2c47945dc872d97c6ed70d2ed8cf8c442b", - "dfb9720a7e9c1872a7216ec2c123344ba7fdf98bb151dca920497a1cd9f38d33", - "bd9295d023b9c037ffdfc44768bcdc3c837a524dc9b32c3b0cf30b2faea72bab", - "ec119f44f436c50a3f8c51941da65fa3792826e720a83924437954ed6c49639a", - "2d0bd450c56258e40da726e4bb135d4bec96b961adfaf3965066966e3b9fe279", - "721145333444063258b9887d3297fe3456e7267d754fa1559019af1214aa6688", - "a6c927a80cef4b2c0b4883311fbb5102bb53bce6f6364b6c0e037106c28d7cfd", - "2c266b363e6fc62dff6985e163acf0dfced5337440e0bf24142e550257cf6229", - "411d4e4e82b56e0f1a7956caabf5c532f0e4bd810c521abf03f9878c0eca49a4", - "f2034acc2571b617317f2dd8005abbd15eeeac2d2a8d607290deff0b86236ac0", - "305e9d96e3e4174f814de551295dbceb7de90a7d3c5e7b599aa09a9b70095ab2", - "884f9d70dcc0a93f50d0eb263dd6b382a6155285ea83f8f6008789ad3481c485", - "6e2a4976629fd87a8d30305abf16f61095996433c8699e37936a5d987234f573", - "d399ccf8990eb75e1d198e91da88994806e3f3c4e7fca2631ab7a015cc34b74b", - "45e062906ed78fbbde2abaddc1674b08c70b20dabe034e729e24304f41ebac57", - "bb185209a8eec1f1737ac7806b7c950066ee9f5950b7f09702e367f3c5884a74", - "209da1a6992dfe9bf6aeac06c234867e8f27c848225b7a322ad3c86d9130343b", - "ab584aa5f4aa9a6683be663784630c3ebc2d862914b3c3a6e3e7fd20342b5a3f", - "a438e58d05a9d7e757c9f21dbb4226739c105a46abcbd4c830f5d36e66d13d62", - "62ed0e1ff366efc482dd42ac91e103aa120cd0352533a4e1cc5ae451b4f9efe7", - "97eebe5fdc424d4080fdf5e6c78fd9965bde86b815dabea7ebf0cd09652641d6", - "32e8f5118c75b48ce67e8b727b85dd2dd77e47db7e468f9a86ca475f9dd137be", - "51fd09ac16ea5b3f526130d3bdf4ee86b3d851bb0925059d707199f74e4ddbe8", - "73df92d3c2729c6b6df64f5bb7afc0eeb23051ed639b3cf2ac050d7eab0badf3", - "05c8ac018aa383985e49c9364ca170c4c69489766f5d8d53b8c5e3ae440e5a73", - "952761cf500acf31059bd63e1421fdcf2cda7e47d20b2b9dc77bdac4d11d195c", - "7b76b75a5f36ffe989e6116051a646fe1f33a3e0ec8880830dde3a61864292cc", - "7813ede42894053a3bb6eb93e02d19dc10b904d4ea8c3fa1081498547d242a66", - "e69ecb1a2b2f1c664ca0d933373b341ac2eee384edcca58e8192671e649998bc", - "80a237cb73efc2d4ad7fd045226a6716993bb32e6d8a4653396652c1ab949f72", - "b45f6f12c332d8b3f80035b32bb41e6dd86438a8cdc9dad94e013b5352f66134", - "1d06803d19297b9d34f6e537d02f736a239dac988e823895e3d0d1802cb447b4", - "5cb2d19abb35dac0805e9aa129bf9ba0957c3d1da2af0375899484fdfb5ccb5c", - "06796a4f465a4ff96468bbb09db00a585dcbdff6921783b083badb227d683da5", - "d726eb3e1def57bc8df2910b7a15f6da001f7f7f18dcbda62e7071aacbb8c03d", - "217c388021857117f16dd6a399fd309e43f4ab1cba8bfb41648fc9c7a5983885", - "e137e377f6563645932f75ff43c46b5f63e44ea4aa4ca7bc8f32cdaa7e33cf89", - "08b811198678541f8299494912fadb19cc8bcb36b7ff3a8d85ec956097ecb8cb", - "56efab623e538be8acd6e0d3f17fe77e6551310f445644342292cce9e93d7aae", - "ad390b9346fd248301c142c6f1fbae5f7c93fa1246bd454f68b35857872fe6ca", - "66aed0814179be95886b9f29725df2d5ec8a501ee611b63cd69cbbafcb0c403e", - "bfdd7bc9deca7b3906befb0ba81a283a975bb128c346a676b4e2e9342a514d10", - "f1b045650d066e252b3edf44b8d471032d48ad2a654a5fed462227d47e6bf9a4", - "c6116eacf740c83e2605cc1eeb9f0e676b4a28eddfa891af6bd440502eef2bcb", - "c67a0524c56ac6a872e8d25c11b086d39a7cf70db88c4d9775fc21d016719ed7", - "0694a7721535c170ce6e35969852bb0a40cc4237570e1f4523921922c7b5cd24", - "a8f2b70eb98e70242858810e6f3756447d26b30b62dc63e525e82d22da6c07f8", - "d24616cd3b33ad177b607d5ec562442a655734cdb4b32e44144d3b31896c7209", - "fffeddfdaf4359b10c730894b33ae4d07947dab122b2f8d48f36b80d9f30d426", - "35afee6a295f473c5375af58e4fc1185620913075cbff92fa0965d02a3951b0a", - "52f31bf14fe20dd6de477b3eda8b0b4ac5319492c0a545433be121df7c6a5f92", - "50ec4cfd981818e05edd352d11b983403ac484e53e370765f34064c74a18acd1", - "685aca37edf4ce5eb1b7bb1d7d59ee3bb90fa5695afea462cdd26c4f78d42d6b", - "f0b14b9a990b271e3643f9530db32518f7e0cf87db6a853c97110c0770db06e2", - "d0e229107c8bc0a838f464aa28d840ff503a4f3a2e2228f9ea84cdd3b9738c4c", - "814029019644e13220e03be454d3d88bf613b56d5289dcf6f4a0e1e1de93c6ff", - "ef1b8807436853dba7df6522c69b0c04ce9b14b745babc4f5f69e5dff9f5074f", - "f77a3e989b6a6c1e63d55d379c20d0da2ca50f1bd233931e50e51f871e9adcb2", - "64c5ec0e667d1697ab82ce32daaefee54ca85d907b961e3320a0bfa5f23ab019", - "652839e27b535ce5d06141961bd7920acc40eb068bea1adfde6487be9e4f930f", - "4f7ec0faecf29421d7e936f4b813ac3f09f82e08635331be0cb2151536a6c425", - "05763ca10023647492e14472a258049d6b58d6924cbd6014d59dd08f3c92da6f", - "a8c8131d9df11d2423fe138fc80efd54b71484655f76f97178dcf0d234b956d5", - "9854eb230cb548de219f0c5322155ddb12f8554cf8fccc26931e124870ecdead", - "2c7e51ac2a7398b911839479d817902aec7575908f7f6c217d94107160f31fb7", - "ad75048284d0cfd990fa6e3cd2d38520ee17a7e30fc14c564dad56543a494021", - "a493f530b2ca53631eea733e44322adedf67df42558ae0faa1faf78919aa33b4", - "63d772e7351af01d371790b8c4a1ca109ded4b8b97e45afcf890e1d51e751703", - "4a10bd1956ffecf68522a95a1b3f545d05cc69ceafa58907634631154ac0d029", - "96a6d6cd396540f96b51d50722c0aae8f2edfeb150260ae63b7f78bd2375a45e", - "983a751686ec3e9d32a6e52f087a34860459237a75a9895a73537733da0603a1", - "6a38d0acb5e1146ce63be7f4254407b500203fb54185e08e9aed146b39456d8b", - "22b8527ecfea6dbd7d5234eb3746cdac5d6048111925dd32eb80bf041102c5cc", - "07c07b7a0d7e7a5637faf96335519478fbf39cd5acc9e4a5aa7c963a631aa919", - "c5233e9849028a2bd178c5c0a11fe6106b903d8e0b097f043256eae49533b8ac", - "768d83d1490fd63e4f11f01ba1b712b4068786de32b8b49854dc58483ec9692c", - "da60a1ae0c5b6ffd36ff183e01c3a6885540ffc8835781e5ef9a91c92b6d8cc3", - "f00da6976153ed439314c327838e8f9803aa04300de902df610c6c1e49863bf5", - "c0aada2b9ce020ae7991fa896d3abc9a0cbf5b23bd7f17e682884fd0c0b3409d", - "ec5ae19f2d6bb0bc85f24b933a3e81ec1675d674a47a7e9aebcf896ae1cd7b95", - "368f8ba5060d8dec51ab11663694d7efe426955958d8eda68dcd137970aaf5cc", - "94abff230c227830061a0ef7750ea35a31e523a0d6b65a0d5faf2e2353f07ca7", - "21e7403a373fd71da7ec2fd97c441fc5c86462be0c0d1225b5e2ace071c6f67f", - "eb808e14488d5ef021611416e7b066b6cf87742fea236c9003506f41cba4bba6", - "b431047b6f66f1ef4f481eaf03eec23a096ae916a6e44ee07e03f60fe66dda59", - "1b36b6a2af838ce2258acc1168e0bb6bbe950de41966369e58e749f6b4ff6775", - "34412c4711613c6e4da20473f065b44e62a036e95c1da0ff4819c1ae842182a8", - "5f877b258f76f0e87f64d68921e5ffd0c7bd5b7286b01c2d73dc490adc8f7881", - "5a03a563af05f4ed9518fa34ca0b0fe5ffea3aa622c24d96192408d0d36ca6f5", - "8660fad937df0b3e93e3f43d6a6c30cfc3e8e5b4fe31bb87daffddab76f1281a", - "a3caf172d3d8a19354490789ba3e6521b5a341d7168b87b4d0887f7fa8d9e4a0", - "b3b4e79bbfed081accf33217c3d3b85cdad7e60789f333bf78e5f80c5794e136", - "a44280bf10f859c0817f4b9b60e8125045a0102b330ad15177efe9d627758b7b", - "286161b8e279b1c956acd8d6273c7961633b3be06d7c8dcc4df30fd6f4470dbb", - "6e5fb6dd56946cd03c5548c35adfdb4bdd540a9fca016c62f66b8933baee0f15", - "e48ecfcb38189b103f389a719b782325bdf0f5c005871ea91cd11a52c30ac37e", - "88dda80f282f8e90b8d9a3917b7d9e3184e76b9c423182dad39110e9fde6b9e3", - "0db915512565cc7ee20c4ba7528b3005e343620b364934fdaf446f2ed0816f1e", - "1eafbb159c7635f28d9eb4ff40c4907dbe1b397533bcf082d985071388f3157d", - "d665944bdb4efcdc5abe27d15268d75534aab7e4014f27203b37958d51ebb385", - "cecab3955d0e191e04e44af93634fbeffa6f8f93dc5e15f2e2fc351eff31aa55", - "1047e3edfb25be9c1b5d4264ce73e5e073cd93667be28eae7decab76bbba5e1e", - "70c7142b364d6b52bc20c7073cd9bfad0144a1dc9f7d99450914accb4c492553", - "598fc863d5c4f9118b4663aab802cc509675f886a085f14fbacb3314ac242d54", - "ef03a7f1ea3d3128219aef235500a2af580eefeeea26f571d414168b5f58dd2c", - "b7cf0e2306753a919ba27a982ab4a778a062af81586d90bf7ce6fc5ba1b602a3", - "a26d1d6c1049b5fe3a9637027896b85eb70f835579f26d277d4ee50c897fa6ed", - "be08223465fef7dcebe8b316eb96c43e0eb57c1a89c7ba22f2c89c96c0d061f7", - "ac6b92e539440dd5b6b2f12a1827bfb8a88ae36c90485e79e0bfedd4091e38d8", - "60794193bb18fff7ab9ce222db16dbf40cb871bf9af255b8b4979589c9f050bc", - "7d8a2bec4d005f0a2cea9bcc1a70daf3ce4a2121c6186f7399588b5e43c1eb3e", - "01bab8ebb49edacaa8929623aa37961f1d987d4f239d47f6f6c81bfcf8857d11", - "9b0ed43ff597c64fe3b5819225c7c3af846f625402bc3208a4b1c525c8926df4", - "c59dd3e7db06829eb8bef07ca5207f492380a31b798733d5fcb7def7db67cdb5", - "d5e55ccc2ea1e0e13491b6d9140a32e9763b5aabac02c1acf49165316d74f422", - "97211de6b1caf4bbb3d256b42b97e2ded7945aca498d4f099c4cafee9efd9ad4", - "70e9b230dc7f31cc5c90ae7720d5c70fee767537a1a6dfd389d12cdcf7ff4e37", - "9cc79b0e38847154f691c780809c8a562fb7f1524e1171ef78cdf3a8455aaf53", - "94dae642a8779b752164dc12a9c10b1db91cc8700e4f816d810c90ea711ce6e2", - "d89366ab9014f8bfbdbf5a499539932d3822f979b3c64543c71575899f216f15", - "f56087fd45fc5fe66f7ae6d8d8f337f7567d704801b0487a885f86309ba43362", - "8fc2d61c33234b152e7d75976fca02303215aba90bd867754c61117813ab48a2", - "a9160b75aea6dd2c95dad92493ee753d5d300b8af15a16c73e6f41dd9ef3e92e", - "2b6707247ad6064d4599983c1d850d3ae890850d965cf86593dd8d55daf2cfbc", - "8917ec55d2d292e0fcc50523908cad2165547e9d95ff9d7264fb2788e9f29e6b", - "b12c1b03c434dfe722a447333ee772fab11697d05bc729b9bad222a9830d3c0b", - "baa3653eb692fc49c881591a2e7222243565b13bf2be7034e46d8dca344266a6", - "33b86dd1dbc0f242749b33de2c0d224a78b47516d257e0ecc97a94f9810b99ea", - "260572b2ac333df62736f4f37aa505fbd0c5ad851a4dd5327cd91d7ca98f7bd8", - "1b300fe08c990ac35bbbd49bac8a064098742582478d2164294d6b316ba17694", - "8b17f0c3afd01e3142a52c2ffcb680514d4df7106eead065beafe3f3f8e39c69", - "e1250c7acc0209c28c3e36ca5bd7b8303a6f79a435af0375138115698c517f44", - "efb6a61b9f7336d559b632940bc9bdfeff589c2be3a7dad6a42b7bf1afa5a33d", - "107bef76ec28642ee6976fbb329a89147c6f6d863055c5e01b383d653dae3bea", - "2c4217f2d895a7e8c8de6a176b733b9dc78c0de0d239195131166112e4b5f9eb", - "7e22fddea760b0d2ae5f65fd4423a9328356301aab770953172bf81a7166b35b", - "03129e4996e267f8e83d1a9ad4f4ff2784a8336d6ae1ebd9dcfa6f4d09d97c5e", - "69084efa12c0e8a39394ca56d7bc0e2506497a611937932c67405797a9005387", - "858779f1852c74bf17c037d0b516ad352608cbe66bac8a0801da458b753bba41", - "146a58bf743abf43d0b0eee4716e86c7c47e336e24bba963137406feada248a0", - "b438047592c04d8ec388f6ab5ef3caa89f80b79bbe99573c850bcbed05e45f25", - "a22f073c5881e5994c2fb3641e4d5e759835ba5466fd74cb2cb2b565dd6e9572", - "5116cfbc571581662a164866be8effbe5e9d184aa33004a5c152bdfbd285f797", - "e74e834383e1c0082ba0e7f6b4637f3768747db59e63738f4220b83a4a5eed79", - "10537152c833cf0e4b5f68d5934ba790dc0ad5a0032a3cee506a83444965c931", - "68561086f4cc2a457e2091f222335a378a87f85cc1fac2982711f46a9010c063", - "fb56780d38bcbdc8e1b49511a46d49395ac0a7c4980f50936a921b9b53b200d3", - "ee88b3fdf379fe498305e55448e48f62492f3590aa048fe7f1943f81e611e106", - "cff1549dc4b59ab3e5aa3ae82bb7c8ef00d1a89d8f33401be23baa51cb390e14", - "78122bcd41414a0ac816c69742f0c44e991beb4b7194315946b7cba5c732af10", - "951da4471c8c871f147712a5aba41b29a02913d52a384a8bbcdce614fb677d97", - "8ffc8037326dd2af20aaffbfa40437cb3aa1a1b5f3b39d9e75efab41d4bee7dc", - "a3217ad24d2575bc22ec4b8270fff05bfffe09511e33ac843ed1ebfe88bb1a85", - "c26b9c5b291ea0d6bf1604d90490c7301052334b30a536ca58152305955288cd", - "e577da3a1743248d622499af8a2e7497ea1a9bf17663964cdae47b42cdd7ef09", - "7ca8fa89afc6538d664d3a2fb55366f6540d10c9c1295229dab6dfc5a81e7b6d", - "c2196819230d10b673f044f4e509c8647ab8bfeb8ebd7d8ca3ce2e2ccf452f02", - "7721b5ccb08aafea3af6e7a4e8696ab98b1b8d165408937aaee1c7f5371fa094", - "a9aa70be9ef8b7f2d94e0b64f811483126bac837ae14ab48bba7d0b8069b5b8f", - "4ce81dafb0f350585082e6d4476862ef894d54cb2a36bd0fe4ceea1016fc908d", - "683b7fc60ebe9d0939464a0588963fbd0c00613a4cdb73cd3948943897325978", - "e04962356b9f3fb3f5c8fd84414c9de10358b5edb4f324f98739c17d83fcdd21", - "4ea0cf630359f0ad3f365dc1cf1ea5c52acbcedbd3cf28800e2aeb453f886901", - "58fe8eb50ed0f61660f239940696d7893d025ef61b000c0f7c960f03569c44ea", - "65d2eea684052669ac5934ef926c79f58b2203c3e876ccfc81da5695a76cfca9", - "ea36423fa47eb6bb18ff062d927ba1d51b1850be477b7e2ede8066c7140d284c", - "b1ecd2d6e0b2997c84264e66f02e02bd5f5f21fd8c400520e5ec93f6af3c927a", - "624598da8ba8e19194ba7f838bf319f1b902d49030b734166b1fabfe8ca8461d", - "f38c567e7530ea1453ce59dc1bab62e66657e26b4b946756c1313cc7faf2c6a2", - "a6434a11e462f68d27844dcc9fd97843483542da6ab59d671f3c689d21be5cd7", - "8ff722f5492d22c577043ad86414930e6904023acc3a8063382fe23dee912b22", - "85f0acecb72e828e694ea1fec1a5db1fed223f015dcb8828395a3d892876294c", - "428dfdfb233bab857d79a01579b297633e7bbaa86da152417395a5568ff6bd10", - "4eceb123fdf09413703c619f1e744567c48cd7192eb9b794e53b992b68cf3b92", - "3b2dcf0d9d233af3e987b613d3e537553d42d16d9117ebf13b64c1c3dd6af851", - "0fb682e14ba6ca855db1eedd81fdd16266f979f090cd4c69c94206a09c8e02bf", - "bdf22ca1a0aa9cc7c674d4cc5ad5a3e8fe1ca34e02f552f4f231c0302a6c4d1f", - "3e3d910d24bc24b26407c2fec026e6b653365d1750531a43b88d695f54988769", - "dd872607c02c31cdc97db7348e167d3506ea9703a2479ce14924a7c6fe2343d6", - "de810c1a9e03b4b65ba54b22f4523df71e968d72ea5754efc6dd150d0d66db23", - "562e9a5cb862f63d0c4a81229e639b04671ad0e3d4c47af372b4864dc6464525", - "758b1710067e5f1fca939f3a0feb06dec6d403b9b07384460bd98b4071815cf4", - "601032e0b6177f6f8e2086671a302fc3f0caed373f2341a4948925d919af21ce", - "10c9c903fbeb3ef0783e1e033b4125433bf18b2744c3bc7545141c5a2979b795", - "9ee25d3910fa32ad63f282681b22fd6535c36fe5ca5435abd8945577a84340d7", - "e551f8cee8e3874fd0a699f5cf37103dbbeeadebc7dcc4e8b88252b3314ba4a4", - "dbbb67c0d4c25f8e55d7cc6cfa18e3c0ae05e6393d46e34d2478c975a0b70065", - "57cf3a1047bd9f67fecec74c802e30ad896f8f50b2bc79ed76dc7e17a06b7362", - "a1a3e34663bd719fd1398f6d9440c113af564eb00cd864ed84e1677585f8b31a", - "c44124e8e8e641fd3661d813141b36e6cf1a74bea62c084c6485e897605dae46", - "a3b65dd0e0c3b7c0109e02a83b1924d54f5cc345e3d6994017ade01b1489f539", - "70f14da4da0e3ae6150aa5ff1acacea57d20862512ff976ef0f8ac35c4938a1d", - "9f6da2d51544dda117adf0f266fe1c8cd7a4c0b9ad834ba6fffb37c9a8091ccb", - "8b0e3f414e797c6e603477e3c2ae195b2286553938564a7f4f3a2e8de0163899", - "5821e74e9b4056447147a61ae789a50867ea2c29b810b712a72de2b2ebdaf92b", - "f0cb6a760cf671d9ba89eca78fe295996c0865fe2643ceac6d363ddbcd574b54", - "2611323547f94f39afa3a61a457aab006b9118cfd2554ab3e95db40dcb1a7733", - "d12c2ef2c96805aa7d92baddc7b273f7ab12dd189d411bc52734cce72f3d8bc0", - "e3a751a61198fff4eb254a9fb9f28a9559d8e321d270c16a4c6d85670e7f701b", - "7df6277c542a3339b12e54080614820c3ecbc9773c120ef8ba133c39014df4aa", - "26722db114b32feb20ceb4ff0684786f1d1271b8fecda7d403a964c5baa4837e", - "3b1a3b5cb9f98c3cd80ddb61ed46a7f41e061e9fce46b4242fe1979e1c8a4350", - "cc4a1d76cdb730d574bbac343c25602e262ed116f03ad11c1af461ef2a1c00db", - "f38f5f5fc8765a4113f9625a391f2294477e158b2b6508e9bf82606f5df448e6", - "f468c091bbbbe56e396bcee36e6d3b62e6849154c03368b5408c49c1b7acdcb3", - "ce1d18a005592966dffb7ba47256545a6389950f600f63311420caf495d28d1c", - "2f05418820736131c798db4af2f942b1fafe9b882a20c550940c210014e7e0b1", - "bd89c81736450bd3e97144dcd2af5264a27f123c43f40b25729c05248efc8b2a", - "5fcac63d083a3e0a0a777ea8289be38a72df338e3b774e1374ef32586626af52", - "3c381eb787184c61f2a773c24d73d0d4e66a33f3c82ec9e128cb34f5aff21a3d", - "243151c7a73402258f2fb91b07035857a5e67ee179c31f13f04e0f5e512d626d", - "93791682c4b7e3b512db9fd611eff05a1bf2c5ce303d388cd0e9e65b9aceb6e7", - "a62404ca4fcd03752dc7b751e7503d007164c34036491383c5a12722bcfe11c2", - "69a9cfb689f5d73544d00177164a348ff6dcb6745da19c413deb60cd4473bc18", - "f0da2b640a3fbdb622122078d6e93077748a6ac47b9294c2f84a85efc2b77665", - "a4fb91d29b9912cff2560750dc637dd3722d8ccd8c6d15a91425b21b2c7d9a25", - "43078885e15e0f7d5c8c8f0004d24c2a942799897f9a47c5875f286288f5cf19", - "db3e54395cde858ca8b146ef1f722e46f0ec27bc720939cd1cbda0345ab5e30e", - "80f07f20e7546a0208d099ef8a9a8ecdcab258a43eabf96c05d2d6dbab82cff3", - "3c70ce1437aef8d3db7d0ddb984e0468089f3cef9a6f3cc6f054e13436974358", - "cffe8a17e848b0956f0f6d28b6a0a18148ebbcc377e96076ab4621876d3d42d7", - "344666401ac788def71ad2e276d3386c6b6cf0e1f0310180a0a0544c89479bfa", - "039db2652a025bd470299b4dd2c83ac4c98502f4add633cbb6de05dc961aaca1", - "bc6eb95950aed9d8a95b3a2c8d0e430a9f578aff1fb9652a9b56ed6dc62c5af4", - "a7b2a889f8870d6fed4d126ea127a566f8ce094e6f1a3f6682ac108633c23138", - "383492293de7447672c230a1f9ef53a16e58d2b26d3dada2ed36db9528df6da9", - "83609954e70e777901585cadc031781f54e699d95827d24d030808e25f31973c", - "033e312604ef250d782f756d4a664b4ff78429f2b7702eec74b9939014bdbe60", - "5272d54cce0433f4b219ce5bfe8d74659d79df0439d03faced8fc7124a436f5d", - "5cf6fa9cc044aa9df967d7eb7ca3f7307dc42c9dbd4b9ffc8863536d5266d6fc", - "295d0a823d39f9bacc8624c77e09cb736047461a5f58990f94f10d93a5d0b08f", - "32b27ea294a7bbe987e442440ad99a1c526c0d291a2d84cc8fddf153dc960c45", - "71ad02185c21cd9faa78e13fb715f3d6e02a9cba662ad582fa7a6f4ac6e0b74f", - "f3cd3d156b5a36b7bcd90c945b5691985a64002c90d70be66ce739bb1b9d59c5", - "3bbd1a9a3bf92588bfaca50996518b4a1c71a343a25cd264bbd89896cbf6247b", - "3ca2253c0b068a8df82c79450657c9c6cc540759afaec740f79b110674cbdf99", - "adb064025075d85cac926e715a5a8ebc0a76d399b6dd7409e88fde024d566805", - "d3579bd50e66802208ad95ea9e85429028e39b805ba385ea12453e26519fb989", - "f54500c5d7e561d4d4d0c3f45a1dddef67bd166f45661d19cbbb90d2faa0fc6b", - "a84dafa0ecce534a79be1fc54ae47a88a323e7d74b6a764b6b57578747eec493", - "a1ee93765bb0c0a2181b04965ec8ad82f797178ef922b47c9dd651e5fed2f34f", - "269b4c455bf738e4ae285ef61c936ebb8e333d5d4017a24756e6cf367d5dbb4d", - "06a99ba70b92fb7412af6ecfa06b11b769e2ff638071e2fd1ae8ffdfd96a7ba1", - "7fcfe6768aae9b6bb45efdfe7daef4f650dcaa9aec24ac79ce3dd74b7205b0f2", - "b9df803261e90e74b8a2756895664c009fa6af3609f4978f12b4edc7a84de8e8", - "2cf0386694f945624833555b13e72c1e16cd4e64ac171ec14df13339cfd20d1d", - "aa56fe22ec7eda0167d03ced75ebdcbb10604fc767ad59ef1f55003987047a08", - "a61c9a5d5d291a86779f11e8f3bd1617516eb4c08bd07f804f68c7c1d31bff9d", - "05151be3a43040b515c6cfa9a06177e6b56c8d2e1233a52ace6db560ab2968d1", - "e400c0594d3377b74cb459fc364ba04337f43803d9c6fa9b0cfd44ac4ebb9021", - "6351aca2e676011662909d8a216c1f56b8492a068ff40b542c3aed0b3058a0e8", - "681d0f4cacdd94d535d22c743b5561f04af5f6b00fa65dee2fc42fff33e6c078", - "f1461c9fa8b5c7b68c39c25b3b561a317842ee4383ca75fd221dec84518a1979", - "9aeffc9599ced135a28381441727fe57a2cbaff9f8af67dd7c3b5a58391f24f5", - "23bba58ae08f737243322b6a10b7e72d7431371d19ae178b5f6f8f941272b6ec", - "b6745da1ca2441f578cd53df859f5c2ca65065190950678af43f16018f955432", - "215761a744c882f931d65a118e3cf3b045c5d649009ae5dac686b114a59ba97b", - "f004190cc5068c94239c413b0271bcabf7054760224400959e2bcc6c48349c64", - "b701138dea75a240178e11a07c6a787d5f8ab56901c060045c2c45802e82c82a", - "ab42b37a878cc53a044a3c6466fa7ec81303a5d4094c1c85e34c15e4d5a50261", - "81eb22189f75fcfaadea7b3ab8d2e946d7484faa618c349756c75ea5c9db5e85", - "d0dea45284fcb976f6f674836a151f1b338037f63dc2764826cbc3c757cb4818", - "3bf6022f8b0c18ecd06d48226012529c642a29304e2ea0ff7f88b158a46f50cd", - "8cb13da58f413a8e906e224074bdfb0ee16568b2e7f83dbacd0ad691123b49af", - "a485dad0530743a4422a556abcbca245b6d521f661f9f5185eeba1bda27ac061", - "237995622d55496a2715721cdca00ad1cf81408edf377e1e0204507d59c3dc7c", - "2b00db5c31fa5ad61c4ebdcdc0a6151c1ac16f507ef8720c58587316364c9b74", - "8272a68f90d33320770083cdf5099d54ddc79d60d6271cad9b7b122305aa6945", - "e37def73944df9cf5b08ae10de4925a7fbf2cb925127870f0481458d0bd65a76", - "c08e024a593eb3be41b0af77894cf6ccce501b5e75aabb630a882d4f2d243a50", - "c93b13da4e31efd3f621b6c829f792c6d408e4a22956f3a7b14f74a68a2c01cc", - "76805997e161d11b5c37547375da6f9cf5427238b930a304a4c69eb1cb8d639e", - "a9415c0933afccec1218c840da5cc7dffa6196444361472eb491858ae2f696bc", - "5588df6967d32465ab49894bc36f829d7dc4521cfa63ce61d89568a4dd6ac275", - "dc52fb84aee40306dc11deb0282e4ec3cd55ea3217f8ac6b7299f2e494e6c9fb", - "f553d233195178962f682256541a8662f269489f808e67b02280138d2e494916", - "1590e77ed12e00488aeab659498c4b67dd3ecc6792bbcac0229cdfff2b581d50", - "7fda6ce502a3d81b6e5accf91b9d87abc1907bcc3cc069306cbcf40da62b53f0", - "bacd77baddd36ccff074f5dd60cc606faeff673a0f1128da033bbb3b1331de22", - "fc0c43086b662f89b51b56dbb0b1eee8225b948627ec86a1cc773df8ce97a83b", - "1eb5f844d3b106b972cb0e02f0fa90a2698e1e983393d851f487229a726a7964", - "50ddec03fa8529f41fe36b8d6217a06564ec4ee103b4f38898f72bf50e76b4c9", - "53f37d87ad18fd780ceb0592c450a223006954918789e97ccd4aec389e45943d", - "6d848240a66157739743e9c18dad9ce0b12b1dbde7869ef4c69820287180250e", - "b4f021222cbf10f2363def37b794e312f4e146590bdf5ffc0c915c44ede74dd3", - "baf668a7307fec567108932b9d34d42a4e5ce551d9b68a0699bacd254642afda", - "c83d842db75334089eeb99e3cb9dab8d17fd6c3551a852171bafde40ac08787a", - "44f9a4fe09c35d46b69f853e101f2601119592f9419c8749c86956e44be0a0db", - "6a0d39812bc8efb15f0b41862a4460c4bcda3481012c2148da21f5650ee79f68", - "d10f4b62d101e8a674c0c6a5fcb7ff5b053d614bb55d4e8f58c3b02dcb57a8ed", - "af6a5e648e8d82a0000a04234a4e1d0ec765d62fe768fbf3c806e641d062cb4c", - "6f04f7b77b8af53c4423e54ba02f1676210bfdd39e7a9eeced75f8e0f9c767f6", - "1db42f2a7ca25b744266d5953d88ba884970cfccea40118d7fa13bbce2a55649", - "40c90ad7615f4bd74163826843e1c2df44ffbabf419803df92822dca539b0587", - "a688721c9d217e9c344efbee9fb34fe5ca10a2b85168ab4396c49fca7bc19a77", - "ea9b9bdb042c208eef1c44114c9657ec5b22d5ab282a42b20b8fd91e7c642a37", - "cf6d8bce26cb5ee09a51f9c2442590443f0a845d96b55edd1ad812cfd1f155e8", - "b1de24f6ad06366184e22a1688654363f17542cf4dce2d971c2bdb65541d0246", - "2f14eef835441ce4c66ab146f285e43aac044a2b79d4cbc645cb2b4df5872c2c", - "05f12d1c3ff4f3bbcf11eb73c9cd777ddc9ec764ff798de2623aadd0ccc1b169", - "5ae72e5ab0bdceda54723a870c07c1550b3cc76ff508f7f3a4a179af1d88f7d6", - "c66050bdefe322e3df204dbfb38bc444831a4007a5a2f3dd348b06a9bf6544d0", - "155a6f117d17a5888020d06aff37ee0a2783a69e7a614bcfdb517067410ceeb1", - "186316d0b03fda3ed1599a57129f6408a2c22a004770d1e8c9bbeb5e975c43d2", - "0f9b2d7bb26694031bd8f5f21444e00cc52a734f84ae0a786ab687a8106bdf79", - "7ca5e5416819117333cc6cb575e26563cb554793f2803ed61fb43740e8a127ac", - "179c7aac5fde09fc998b2d934f2e96e33de2e2d43eda56005668e4ddd1dfc750", - "62d3d442af7f3d85e4ed30a145f6d5bb391b08ad74da40dab53b3ac2b3cdeb94", - "8e56f6cb499cd4ac40f6cbc5ed0ef62e16cee636e4ece101a19529339bfcf412", - "1cbc97a424ce0dcb23e09db37caed522ddd5a7c6403ee6d9bbec95056c96eed1", - "3e135a6686d6ff86f33702a81559580a7dea629a845f8f464b324287d10ddd0a", - "c4e4ae5d342042b95e3a2d582691a34ffbe06f90ebcb7ce93cbb340e61071cf9", - "0b62f989b1313a6a63803f6b63b38f099cd042d1529b9bc33ced543cda07f124", - "2daa07c091aca46833079055c099d8532fdfe8648809e7428b6e10500f1f75bd", - "242b752416b2a54baedf3587baf8d2c54024048d33e2c5e87d50b90eef8524b1", - "06a61e76a9a2bfda60ea338eaa341bfc8736890bd0aa82608445481737026554", - "2af52b2e46bba9f6200f888d4bd1eda1ed3b32055f5422b209a382ac6859e944", - "8c0ad49e4ae9455daeb6fba8a6d24f38cddb7779aa054777f56792f9c9ed46d0", - "18feeb1aee75cc9d082375cde7231e43b0f69b9b78c3f171cb7198c860d8c9c2", - "251ca7765631ed4ec00e01f515dd44b935f3daa5e91e4832e61cd7419d50457a", - "7b08a07664a2296ef6a6c76fe86e4a3b181f6dad9adc4cc128b9db8c480a032e", - "b65e6e636d2cc32904f4906ff6130d77454ad926f6ef806afcedb0a3e04f65ab", - "a26a7c354d62bc16c2a3cab59fa9f53ff6a43d3e4b618ec0ab22dfab83872d31", - "040c36dce1c9f3a2c576d47ed4e3aeb577ef24fce2daede65412bff0fd611f61", - "105a6f389799c7b06dfd0e7f3013d3fa2504dacee63956885e158f00ee279ea9", - "e96f44748c926870b85762d488207c91de195ba88e10af4f2105fffe724466a5", - "02ebfa9cde999111df92b5b1064bf871034dd93f149c87b15e17ca8b25f64837", - "2aa4365d9c6c94914a83b4029c6e38d9a6ceb52292295fcaa0587236ed3088be", - "f2c1e3ed441bc94869d6b49ad5d0d773b97aa0df0139f16b8bdf65a1bbbb0578", - "51820fbc515100fb7c86ceb1d7ad821573953408da81d23b02285884f95d70fb", - "c9c347b2f7cd49ed698acaeb34e9d201e6a86f4148c758c14557948672f9750c", - "03b5af082592126622c30ec46c75f322d32abb0dbad23ac8164b3d0e8105d12f", - "21bc262d5d60418d154d32886b5c323cd981ddbd5c74f0f80913869a25d0dea4", - "f1484df014a0496907eb03158bb51ece7df3a89714cd6e7f9189080716638896", - "27469020c322598b91b72844f373688fa7474a2de5bc1850a8cd34c99fa3bbdc", - "2175e57c4c2df08b288cfb4edcac461a609bc6081f129fcf5224fee2003ebc2b", - "f92f3a662a59895d58409e4a1f1083fb86a9adfe9e46beb48169e7220d2b0b30", - "e6927bc5eec04ceae3ca4011880eb2b065501f32a97b873431a033508fc0002a", - "5e0cd7fbfcb25bdb382925537e1e1b4ab99ab1c303ccbebaf8e1f5b99a6c2ea0", - "4291aeda74280e42b2c8a4f61ef4093abe7cd0c01da2445a40bf53d65de95461", - "49879798ff705607d27ebcf2fe07eb0609e5dc7404db5c736542ec434513fcc1", - "73c7f83d5994fcc0e329edab793dfc5aaef657cb96bca8b82e3cc4a5a8222136", - "39c6ccec50f8b4e4d8bd882d066f95348a23a9ec4376797094fb2d912e9773f6", - "593b5dbce02701eb1f87a94ac471474547b70c616a8460cc6f7b1eca51b2266d", - "6d883cdb1f43b0d9ef82a81b532162c285b3223284e722d4750e75e888786b24", - "6425fb357d4f8423e3f8a2127921f50eb40873ff9fd368835bd4bb57617c6cea", - "62217b77421d6271dd204b39ad4791b923ffdfdf7a46797c73259ee6450dedae", - "fcaa0cef8953dcc38ebb5689b213bffeb65f8cd5c96283be2681f56b70719ad0", - "4793ffb8a42c9856f00407cf2ee2f0b7398b453920778f8e4ab04dfc625a77fa", - "57538e4824df89d9ac95d6caaf172962fe495329914b962b62acf970421a67f1", - "64efd8003020d527c257c988c6f504e0276f113d4c7135e67d516bcd68624f42", - "4ac3da0feec407141387e94bab19596ad864145a7e4a9b39025c317e5b3aef7f", - "1e5c1a9eb12b974a129b973a4b685d332e9dd4d8f4536bae9cb73d4777a9e64a", - "884e620a668b50c6debdcf294e4d581713f2897804981c62e2a53e86b0b15427", - "bb9851213a1a5af9496a936ff8626114aa0b8b2dca700d26cffd746442f5e0c3", - "24be173594bb18592734b4d49ca6ad9e5f3ee13ec2b1c0d2bbb6d3c910fe5d0f", - "e9898651baed6351f1b420cd6257d5dfa892563d057a68f876a555a5fe0f363d", - "bf81468b5ce552e608f161c35f2095728fc7122d9a78d1d648405dc0d50ae8d6", - "5f63154a45c970162ec20a56a9d068f7185d921e0cc13de84304219727be4337", - "3a2ff2e6b7372d8ba2552c5629810f13a68249a9e0d16c761fc94d66efadc38f", - "48fc7b6be6c63f8878765c3ae468414f98a20bd3c7cf4eeda62e68f62b675252", - "5031ff3cacd6cd8f7590a01f27fe80486a846f40d55f12794a71ed51f0a3aca1", - "33a3389d22ef4c965d9a0ef4193c71f8b924f15736013157956240cbf0327b7a", - "eb2824c1ca87ba4c2aac847a07c861afaedc2cf5dc26be3b0015fbe9aa452f7b", - "90416ed46e784fe7c87a5913ad59aad88f55d9bbed807001d9bd576a59441b7a", - "82c27d4da8560a932b77ab15da0a2e1d237238b8a80c889b646cc37f6e678c78", - "368c876b0c6a5087c695c457598dcd5b0bb8acf447beeb53178f7523f4dd78b0", - "94a79a7ef48db3b114bb30c8e343618e4c92836317da6adb52183142e39f0c03", - "cf020e8a4c563bc850d0dedf50d8eaf2bd3916b04461fe23500c4b336ee19981", - "221ad04c707b760a5d7ddf7fd6410bfebca803015b1a45fe963e995c6b0cebc1", - "3de95ac9a75b0a763d1afc7359c0b5d89b9eb81ced953e364405e81db86ed212", - "532720a42be68b81590bdccec2c3acab6061ddcbcacec43f6b427fab17fec0b0", - "f9c05509df8611f1f8a2d9fa0469225f3f4844d5e48eafaa5a0c4fd5664dec94", - "fa9f6eb256cfb2b220419be8e159d8ccbf7f8047c0441711d9645dfaecb134d4", - "e923205c1927866638e49ec7a61fe103b83e6047bae9dcef6c0b961433b7b698", - "2b600e2236b095e5f18b5c898ed1f1a9caf991a9d86805b5c83376647f1d38a3", - "eccd79145b2f75542786216fae720835daa77fc7f84d7f3ef249e181d9930e32", - "df4e509f89fe3f4d81f93d1829b7bc3b515658658cc6843a2017ab1540c772cf", - "47fe2f6e052e22bc19585d29f67217e30db11ecd2ba77b38440b38b12b21a86d", - "57057d6eeef0003fab728244cb1bdb3cd6a9cba93675996da80c0b24e1e3c309", - "37cbf945c48656e7bbc65a845bab605dd4d986216b5be6129f49e4bd7073859f", - "dbc760bcf91c2621dda66b2b6d6d5fbe35647682918eb743bffadd3713fff6b9", - "e1f7e42cc3ccad8cc69ad3fa411641ed6619d4beb301d43d8a4c2e6096a91002", - "7b284e9b254988ac41332cc9e0ae203aa8582742c425701b4182753e94518aa9", - "77ffb35760fc8ece76d762b15aa30d9b7ee09d7c27557a71ed8be5153eeab5e9", - "fe657572df7d1993fea7a0fa78d7daffa632f651e19582585c6a1131615372a7", - "89fbb5d313f66f9fe20ee560a28c40f98b7b1f74e3cad4da8fecedf23d797ec8", - "52ea365e38555c4412bdb1c9fc9261b275768f7c0e2f3d7e828ac05c534ed978", - "b7e4ce4d4133b3b6ac5bce9e65168127ac6b99bbc6423a71bd9b6743e0a11b71", - "ba1d704b1a61f08ebb53a1c4b052670da8a24e2a91d8efd0f0386473fe2395b2", - "7c7620035de7a785d9eed4258a322611d576d8293481522aea5ff5a0a4e97fbf", - "6f96f1945f5a474b013b786a0f0ad7fa481548a421264db2e01750d76b3958b3", - "ba1496abab9667b7bf5d6cd1dbe8d80b9d71734ff9ca3a4ad7259748ce7c771f", - "bef87d5843cd8fe7798ca2faee554d233052faba0b2e14a7410ee782027ef1ea", - "0553abb12868aec54dc54ee81d053075733ba3eaf24c922ed0107028085810f3", - "4b8bfd437dd1a7e30f6d7e04359c5ecb0e356641e6b76718a0448b040ba47661", - "ed210a8d673804e31e50d5c5b64211fe492f146d384ee64039c04b97f996fa20", - "74ac33f3e59d265b9cfb253aba782a431d0c6dceaacf5bf46f8dbb18361e9d74", - "885aa6fd38978142dd52a1917ce96bcf3ea1ff7b1f8dc3a1fd01377d99d92952", - "3113645bb8dd34db908027ff2c5c21acc02069b67a75b3bed0399dbc9f012308", - "f2447f20fda65755fc71010f6deb9476a2570cc2d3d25a26646c22d344b32b68", - "ca305c2deefc414bbff09babd560b0b447c2c6302e0c0e732579db4ebe1d206e", - "bfa0a6ed71dd2669e079a983a7cd10222d1655c2f641964b47ffc65441d50268", - "99d0d341f45223a7a52bdeb50df8462b77e9644a890b28aa00cba2acdda91eb6", - "3caf2f47e58688bd4cebeec48258a382d032ff22fe8b191fef12c502fb3496c0", - "e9aeab24e8835e769b9772d4d019f43f335df3abedc69bc675fc46f2e1809788", - "c2d184ee58c61ee1118a8881b6f93a10744e4c5f0b9fbab6eece50be65a17a97", - "f86fc1a8fd6d1e97c3857c3b61e17ffe5c7cb385518bafb83714e8063e546b37", - "29c38901d22cc2f554bcdd2d738390224c750f696415e71e8dd5ef561f9dba12", - "62697d11e5529342b87eb5bbd56fdb378b76a09abe9f1ec64b4d311fc3ad7cc7", - "2631dfb008734dbc614d7e3f165e4dfe4ddcb2ee21bc129bce5ab65449bfd8f8", - "60452ceec71819fd290a374c57b289d18808e8afeb100d2dc4f2aad052e8d190", - "d2212451cb99a18ea83a937d2b2e5db532a185fc9bbcaca0310ca421870a7003", - "666a5e666d20eb43ffed7e3b6d4bd9b3b5977d2df6518c7250ee5b7b42cd40c7", - "5c959d68ca7e1bbebfbe435f56a7516983bf5d4f4fba9a0595f393f94b025441", - "5f4af1415664077f444830a9640959c2524d1c5bed86462251465cc591964b5f", - "894dc5ddb02a0a076e161f6d86d071c7875289605f8e01f7973ef08c1b5314bd", - "31c4cf050bce4fd4b88e74c282ce6c589412e9e2e6b2b63fddc6c8d2b04db580", - "ef9f4857009cdd05cac240d52159f80936b0db664665880b31c97d33c0afc54e", - "3305b1e47336281556e97ef933f1389b01bcee4f17ce1ae1cbace56a654f2679", - "282f6dc9abc86f4dd59453560649650666bb0296cb1ab47c8687eda0225acbe7", - "9b90901bda56953bc51f7bd257c2af70d9bb9f1ab96e9cb8cc34d3ac4bef3cc6", - "253454e7dfb2ea05190bfaac913c3f2340b8a1ba3b82ffd26b8a96744f00919b", - "183b858dbcf46324998194837953b825a9b1fdc5f8ae96cb34eff96032c7f218", - "077ffdc7ffa025ba244d6c46a2f9e0cbd12a8dced4dff51a472ae24f70f6b272", - "26714868548021c823f4519c6030ad33356ed2a434d5709e0e367ff222681f07", - "b8e421d09f26ba3ea41a0cb7046b1afaff7962c9613fec5b2761daea8efd40db", - "444623887aacb2bfd88e1602083f0133310bf1bc15d9f0c946d6e6c89af0f774", - "2a16c4d3e8b4b59394ca230642bfab96fad3e8f65061e4f20909dfeecd9b621b", - "ef5ff74a87554d8c0c6496960cbf9bd7801b2da4f0ea1b941c24b4a82a4a7cf4", - "b3a4a2987d6c6dfea285942b8b5489170f1b31199b6a37c1a0d24e1e20b82469", - "c47d3c84821554bb3725c2b9ab7537818ed163929ee63a50ec3d97bfac3a3196", - "3a83f21c9eea9b5661ed2bddac39437d86b474e5f5e965b442a75b6caf21f0da", - "368cb4bb4ec4aee48a0868f32bbbf555abc98bc2a914d490e22ec9891b3f769f", - "dcc636655775208316d800c98e6c11129f033908e68ba6115512bd4e2e502a59", - "24b06a6da51ef3c95b91e10578b0341e1dc4d90b4c0aa80a8288583dfe44b7a9", - "d004849f18464773663e308d778cd8ebeefd7218a602f80d6de29792b247c8e4", - "948af856e8c913307d9e78ddef68eca21ee04d7f3d6426a0874226a824f9c365", - "adb94ab708740dc6e903696affd7e01bf6802a275cf05f8def55f04ee725a0ee", - "e35d0842945ce4824e9591f2338e853e7a183b41df7f98097bb79a0ec89c52db", - "cce0f3808c2b18e23bea7429dd639bb9e0b99c33861bb6ccc14bd382975a1378", - "1592fda200eec0477940401a20ee5e9b193558b2c9d9eb24e55677ea54ef40e9", - "ac3e21415efa41e1be00c8c4c41d7b47adac761a54c557cf489bb05319681564", - "bd3b862c5bb46bcd1df18dfa950f6ef24a6248c68dc9731671ad8346eaf2b4be", - "2377d82c39a86d67c07365c3850bf1d7a02c9a8c99d1713a6ff15901cd309477", - "a008c5d97389f2bd4a1a8673e72d076c267243a113d30aa201989a1a5b02db91", - "57753c96e490121c1c9ee6cdd3ac3fcd3505c1a6499f46775dd7a2504dd58bfd", - "798c5db5f8046226f068f9f82c114b747ec5de507ac70ca0f3bc0551c6bc9010", - "ea0ce65dd6b4e7068963dcbfc04ca563a389a63c2623383a2d47025bd0e3e285", - "ec761e6652772c3cdcf4c9b779e87ca45c36d6ca8a7e51306ddc1c1ad6d9c199", - "19a314273fd0ecb16f59f5c0e24d55005af7ea6785470fab1dba7e9c00123a5e", - "88d29fce4f906dc8950b9d16d1f9d25771b801a6c5e4988b8db4baabd2e137c2", - "d5704bff25dcf45155ed9371209684a80159af67b71e72e5d7b76ea139ae8403", - "101c7be70f94746829db8ca7310475f5291c5def88a3ad05b3c64c003ef542e9", - "d97030db8f696d1fa747e8556816e96007278000bf9200ee6ff82b95ac69a9a1", - "fd5d24e1f15eba1a651f2ce743b62d292b38c807f2c864785e08f96917c31b17", - "262f2fe0914d14433d3fed4bab173f70386280ddc1d0f519a5f566342cff0d82", - "86c0ae8894876883958209cc61e4a05e31ccce95f01fe74522ae2a39cc234526", - "c87638b4c5acc87780564560ec068873a7a31489d532b83d0982ec0480c32034", - "25817a07757c1d7a084e2c37470cb55cb170c648c6ad9a69bedb70e81c021108", - "7e111777722d687fcfb68b5b8954f4ead2ed5ed5855a567e39e534f54f1beed6", - "405ca3964a44694188f3f50726493dcc560fce3946973ccc1e7663aeb71662dd", - "ccad32ba773c01516fb100f567abf54022ca1c15eb34c45c7daf80b1d1662969", - "5579d9977b9c241079853946ffd67a8d1478850de5d7c51ec073d94c45fa36eb", - "19afe5d1584c7671b848a51b5ae10316b2efb3917db3be750912ad23171fd069", - "a5b8ef6ffc36329172c5a11334886fa16cd1b00a0982ceeb0bc7fd1dc0990df5", - "c51a294e7ba7387cc4efdf1e4de45a99f3bfc4f4667ff753b55aeb194997499f", - "6a21755b612aedf5a62d3f837f1b63e93a5d5961c537067a222cb42dedbbd190", - "fece92daa6a7f9a3b8839b628c83cf43eba3ba8084b295ffa1cd9d9c1229132b", - "73348d987eda7adc72c9bc3960658cf43727d4bb0f8bedc2525ec1e4418f629c", - "1c9622b27273bc13b0c088b8711a840c0b4d5da0d3a10c3b279e869859eef6cb", - "c7ee6f943a390379ced6de23664761035594edaecebd31300830dfaca58fa488", - "2fb89f87ad50756510211a06dc4b7b3466eff0dcc3163747c7f75c231136ba7c", - "2387f2ee864edf93987a8c5804c5b9bbc688c3619f0a7fb4db53b9dc95c74794", - "af1970cfc8203f354388bffe64012f91b5aa75c00b252ec299078e0a366ed0b5", - "5b6b4a8e24fe3aa7dacc3a9d8b1e1b549f99f078af5bb0d5ab5ccbbadc0a9006", - "6ccdf2c4c40c1167ac867be4f10097e279eaef805a3aca985c205bea8ce9b5b6", - "03d34c38f736b0b21f4b6e7cf3a9b71112f801fbf2c6bdccadeab52cd185be8c", - "15c7819f7d89ac64258d1d35dc4fb8adf207ec65a058e06bb2d534b6fe1c2730", - "0ac0892a3e397653f5c5ee7e0a6f0d53d4e218ad864ce2af1a2fa37ec8b82ba6", - "9859c3cd9deecb90b5a66818d9605c387cfa9228e349b50ba2ae7d9574dc75ba", - "4a2aef67cd37c36954caade2b4369d35152f9744c9d075925e85acef9cfd17d6", - "e1156ac47e861574f7d526289f47bd5861243ff36781cd70b7e822536718ebce", - "19cec01b6ea4b811dbd3d20e11fa98118336105f55e7b2cd820a52d53199da6f", - "80d3e15be8c20f8f50d5e8bfeb340270ea4cad2acee4f40a1e81b186ead656be", - "55b9ca53389e86c9f9895fbbd53f3a483271fae34353eb7a734db2a555aec006", - "168de3d947a84e83034de2ede6f5ef7043c79483794b006f0400e4e27b6e269e", - "d508110ab11d2c2b60c72278581c1031e30f7b4812ee0805dd1a4e2c496fce12", - "10023b474082c9e1161635b5aefb30c872d6fffb6d9497127f6a3adc4fb13384", - "179eb1e3910ca0fc0a220bfffd333ab322e0c4a4a498a97a71060e865db30bf9", - "4075d8b779a0c7974aadd304bab1b9304fc29fdd32d87615d73d30367d82102b", - "5d710463803e9453c260b7c8464321ee02b54d5be61dd237fd32ccf86fa3f1e0", - "ef22065aa37d4bbd8e25cff6a738d0f50a3c819cba8044a7e9347ff2fc9121c6", - "2b7abc05eea7c8c62ba448808449afbc038522f730f56ad952c489204d7e4115", - "6c5bcd8f1bc1c63026ee4025ae5b262610bf4d61f206769e36005b5f539e209d", - "fee7866b91fcf308a616844444151936e13a8aea5ce84a27961dbd3290786416", - "7b57c1ec99c1f6f406f67a774843cba00a7bd4f0b459d5e4774068544b459898", - "c53f8b223add41497f4f1a0da8d4be41a673308cfcddd5eb657707f496e811f1", - "dc51ebfb69c06f1d41be06339b489298841c9b815f254663b3d8d5e869828b7e", - "3a540411f4ec673388646a14db2b2ecb5d418a10ea2102e7670bb606b7b395a2", - "2c17f2eed1b7469967eedc0f1be3bd642b6d867966b487d693d5cf5a75944f32", - "1a7b70cb5f8dfe1e87d8c376d66eebb42a3c1ad9a00d381a06a203a0d2eef0b2", - "728f15dcadc0401bbaa5bb78230263d0ee09aebad5e8b54abb8cf0b2a9514a4a", - "353bf073f9e657d66ba426e8bbaa04ead63c6671cdf40d9c4c4f5756a650f26d", - "a09c48874f27d2d28b86bba536ccf86f1beabeb4d8afedc0aa8922f53c78e3dc", - "579a1332c77cc3bc6b66ef303c765b678327bb34541f423d983ac0767ad2df14", - "6c8aeaeeeb69b87820413e43bb83ea0f9d334679e6e08a6cd0037e8c40d709b8", - "20c6ef27a3509acaee530f0fabb7fc1f11586eb2e6e01012e065f882ae0be517", - "90229ffd7afd11a814c3c76be48154cc41e6de545c64f03c28e4960d50f9e794", - "e9275f40bcdf5c0427828a46536553692368e1ed8cea7ea6ec0d007165bfe219", - "afbcd5ceff428f0e8b8f8375674cbd4fd79600aa9a57aa9d7c953b6eceb29dc3", - "14b885cc382460a3f2aedc9faff1761dc4302d693a38fea262a9414134f1e400", - "cc611447f9d552f7fcecc70c7db97775b7b0eb1ff8e63c5ceba52114572cd6ba", - "2a3ab420b197560d593fc827d905433006f2c4697eed3bf50582e333490e3838", - "c5f00e7aed7dbb46c8d85af5d628f7f1e0ef13a6dbfaaa15fafb92466e027611", - "1a4f226409de731143847eac6957b7c437651a5621f97721ba975d1c9228a041", - "87de6638323654503f80c01b54eae5900140a7c509c3039a082c7c6ae2922651", - "b1e8cf4ffb16d0e66d314a5ffa091a5ffd17ca42eaf94cc35551361e55bb91bc", - "55743bea16da070be49a03af030ddef3ae8a9e3fb462e20fa8a6a8adb6b4d219", - "4bb9739f2cedce321793e1027d2f40a0f359fedbd9ed6ccb0f95bedc470db829", - "53e21a2af70c52c7d1ffcf8e730de7d4dcc29376a32cacee2923b13b587acddb", - "01bc386d651f204896a8d85f29965b17af95747cc36468af8e8fd9c3f33a691e", - "28b1f621e94b590bef9117dabc78f0f526fa08aac9d58b4dfadb698061f4e51b", - "65be59840d38382a983a08c70359b0af6b166b64a2dc9bbfb103205f60b4c57b", - "c20cd0fd550208f8c96bad9edbdfb14d2b0244430f5ef0135db5dba46e8283f2", - "3c6665e51663f26a746296156f42e24e60907bd43c5e982e91643338e3087b7f", - "b928866bb736f601e82ab067f08c965edb71b1d840d6079c4eb31fab6531585e", - "b3c014b1ef4cd4d0e8e58179cbab55d59ec67f8dbd8ed37af9c2f22b1559f713", - "693a55f64b1f563cc00e34f46170ece861213ae6609d8aa2cf10b2b6b6872fb2", - "53db4a359b529732b135e74302a09ba785924477fcb7c7ef61cfd0d242aa1ae5", - "4bc2631bdb6fe0b185d4cf737ec88a04464bda1c390e18273881abb821949b62", - "49911c29735b71d7103641e01c5cd0f21104ade006f55870f2436514362e8a87", - "b3e747e56265c2e14cf7d045e9b464ddb37faee8a79b733ab27c9ee2388a9a25", - "082e3959f1a038535aae1804bf008dcae9d91c396f34af19b416edd1c0120bcf", - "7f9458b95b84a82c69cfa7c5e6d48a58641369e9c699a2538f8c37df84603afd", - "7ef9c611939f41495c3f4c297762398deaf208da33b358cdcb369490d062a132", - "eec544eef46a3fdb5b5b057a0bd48e7c30867e269464e84ba8d336320c729b60", - "45feb9ad8153d8c8810a6a635c4a8f5577f07252472bf00829a6f7f04209d849", - "ddcb2bd1fb8e9fe9c613dfe21e16e05e8f9dd2c09edf71a8fce50bc7d53f135b", - "8a0d6a0aa9c3e9aa6aabcf1ee69ee49fdda2e5a72bcdd7f605deefb4b8bccc8e", - "fa89427502065f72afc1fae551c7579a3e5ecd15a27c838a2bdef904a20070f9", - "8de8cb031989c0956c178fb71915af0eddbb1fae7a4691ced10c0b715d1533e3", - "56698fd53ec1f18ffa77d2b3fb490423868842bd05840e6135c034193b9d028b", - "4f98f5106a38030739f9b2af949fea457ae8ac4538707dfdf2d11a057b480b13", - "5c9f858e2e1178386f790770f5a654e59dbefa784a94a5a148f2d5bd742a6f45", - "f8f8b0d37fe4e4cbd088db9b9edf27e4c857d21c164f46e74c87aa56835d5525", - "6317534b9153d35079d2d837159c49ad7d022bba199210cf356681447c992c42", - "5ec455819ea4684aef040e282381c7b2843fcff50624a5e0f0063e880deb00a5", - "d1f481f3c69383930879f704fe28d5ff95991c07dda540751eab95a8c1d1270d", - "9349d914538b7b74fdf29c17010f5bfc5234072ba89a58b65623aca2c07c2705", - "54d0e42648e728469dab93db2273628e75baa565e928e21e87441a1b0823cac5", - "185ff37d9b05c0b73fa9a233573c4d83dca0a83f316a37bd38637c43efbc9566", - "83ba1b984db52cbdb4053f935934f5b26b7211cb2ecffe74d448296c5763f7a2", - "af6b1369173ebde384296240aaa313a02ed261293a417cbfdb5b3708f7596106", - "a5630998cf46c90c13d74002f480d4e3ec690c2ca0e952b4b4171151b74410bb", - "ffccbc0194d7db37af3e1c2ddc1a8cd670644e31687abf9889bf22158dae5831", - "2d66eded72fc8eeefc55c4682d2f45e374d620693adaec834569ffb22b5695ee", - "35894ff00274a7c42a24c59dd594296466a53746b9264c1aa420d8a611578075", - "c6aaec4cb72ae44648704b3407e94a6a5a19ce52c85489d098fe21e6249b1c14", - "755bbbec26dfc96997a5ab4b4d2801b98a59f3f1f9a7be433546e7def3b14cb9", - "980ed4af33d6936945d8513639216d5b6b864b657245b5eecc2e8ffdc1eeb079", - "756f29a320fba89e629f02fd730b47012c81fe0dce4f1deccc35432a43560e27", - "28c69fba45d6203ef5deb5f24fb12e354bfd165bc4a6834bfcaf4a1373270a73", - "1200c9df6f095a332aa1d582e5e06b2d25f2def6729878a1a7364b0fe62061be", - "da616e46fe974ae91f5d04ca54915e3f397a0265287fa6637504ec12998c76cb", - "33503dcd1b2deca81997a67c0a496f2ebc618dc27e766a60b46986cac2e0a04f", - "1f8038c6c044cbe3f533d9cb5c3bcf5b9aa1b2b04e2a4d5f38fe0f5b9f68ab32", - "2d989f38c8590a3aba4df255599a876b99d9d6960fc2b4f357fa642ad832abb0", - "7b9f6461ffdab34eb7ab57a1cd96919790c00844ab58ddedcd21172b427303f3", - "d3f921beff098ff090832251e881ba4d1fdf4d860f9fd80c0ad93fa2fc87100a", - "ef9b4252e83146e287c8f80c13a957e1a76a1fc15043cb4cd0bf8de56cb01399", - "9361875dc6abb5464ddef27df25591da422e1d534f1c65a9ed89f6cdd098bd8e", - "9fa8c48c21b6240cb206030bb27d07945e84be93eb84888296dce916f288802d", - "7fff6f8883e34ea6e9f8c91611fc0d6b60bd148f7b6b85414dab33e776e971fb", - "1ea3c0510371669eba1c4802f3ee2ced89f35d5d9d98560ec51df570131f4df9", - "a8e37ed144dfd7d85dab20bb1239019d5ac643b6e6640d873eff745b3eb873f3", - "cc7cd503be35dd2f5998e7eff489d5732fb24f2765171a9a3bd5ab5ee43e6cc1", - "a999f290012df6b98a9e4bc564897b6da251a6a64b2f25d35d22525e387425fb", - "b8c76171116abc57aa4b303b3c1dd26ac3e2394008bc0031fcbb61ca305d90a3", - "cf6b7679c2360f4dd860eb0c1b14f3925483c52b3e4388e5b52e38fa3ee35b00", - "1c59addb4a382801fdf5c3380f200fe7b7c7894443e543a6d7f91e7a5e5f9e06", - "b1552a2be197ab29bb794632b025c60cab11d9a5530584d8ad1011ad59806cd6", - "7503b2f501c4cffe5a456853bf5261c9c032e28ad569e5838d706b910a971d38", - "97dec46315f252d4de45939eef5b0f511a32e081f9a23248dae1fef0c8192b47", - "c96b994816f1a2017c987739e3e765e19b1f4ad673be1dec50145e7c2fcf9e60", - "b69c5862844774cf2d0927415f78b0ff95aec7a85c19d47ef34287da7cbed4b6", - "a1a746bb5b27acf0ce75c331ad3079f482420bfa9e69ceb5f794e226188d12d5", - "12c0ae0bfd14d7543f4ae45bdd8e4b8d0edc2ab1c83000746e81032fd39e894c", - "187aeb9628077266a3e25746805a01e86b3c6a8edba18321c303babcda8cd4fc", - "9887621dadc4f9c4bd5f8e1bd3e0ee67f1283b90d68189ef1dc23ae99ee11f4a", - "d16e2ff981b8aab0c959216b30c6685a9f602dafa35cfb1017602002912424aa", - "31d0bbe424130987435f7f2b44b7e116692a1b06b2dbcca1640a7469b1d760ba", - "d207d865e959c6c5a9d02293147aec302ffbfb46701ca1c5307fdd89763cf4eb", - "ca52f5baf245e89a3304dc5663195df8a856e98e5ef8b748240c66102b292160", - "c64437a0b84922fc97d40a8531384b3d0c873bb6020d3cc8732a2c012256c88c", - "20c67a76c5724b77252d1a73cf6bc14478c1fec2dc65f262923397a53b71160b", - "3b315a5acb072ae895cda4f5a79ddae39a60c713317b73c9b6c02d494ccaf820", - "048a8f6520dd49251063b7180929bba5e74f76bb05b634ac3b0b5d95a0f1e66b", - "a18ef638670c1503bfa6a9c7bed8a0c0bafce22baeb2c76f6262dca5a1e2cdcb", - "ad5c62123d7bb3e9eb4ddf91ed1ee4dd051d968b64d525d39055b64e80ceb777", - "e554e9646a4605cff5defab44ac484cd1e4aec6b319480440ed85a26d7557a73", - "c8ada55ef77aa65467d0f613cd4934d523e23a5ba8f633e40b1a8ef100294914", - "bb0f8e89a6f2acccbbbbc847f541073c85eb1a6fbceb0905b8cb08c92b9cf2d3", - "e573889ae0c780f88bd6a8bd74e1b6284ad64925fa3c3f24487f16dc02782f57", - "c4da5bc6354108b9b9c355ee0ea9d7b7099645e63340bb97e3d6e782171a8e9c", - "73ca0d1acc4757c80bb8af89058481526d606f780289e68e8605629a72490914", - "64ecb383a7c64880c25f1308cf5d21171e330364b054e0ec997ebe4d597db7f1", - "6e2a850f0ebffa66fd0eda54de8b17324379934bb88d2e91fea08155e02bca6b", - "e91e553e39f2aae2c93d009fa69a7dce2e73d90a77b7732b43e2a85a3c24a124", - "518c148603695d8c83c77ff6e85ca1e3011d4f179ba5a0f5d4350432fafecda6", - "e7d1bdce3fd163a43cc6801c6b4008ab9cb0fd59cbe651dfaf7262d617eccf25", - "0cfa67a9e7005c76f41d0e1c85457ed5a31fc5a03a77cd191a64a73fd40e6891", - "a2156ebb77b8d97a489a6d778b9279175c213465c47cab9c3279255cd0dfc176", - "74f894206f7a3f5f04cf14d87693dd8d2e2f424d98bd32c008df621e3567e579", - "1564d3d31a59260d9cc8c8c7396ac8bfc5983ae5e682272264288f596c88a440", - "f74762ca38a80bded6d5911fa8fe922e41fa4fce51dc52ee54a53201a0840d7b", - "8c22d6d907afd88b664263596f71af5b5b56ca7a3c20acd4ed882fa2a272a2f2", - "5e3dcf137038275caca9d52bb080dc1d5b351b69f0efa59d10c05a730a6c7a1c", - "00b16d8198803165c933c241d54cff34f4899a2d1c894b61534f902e82346940", - "e23f142ca1c34638ac80e2164fbfd027275fb49f629f6bca384cce91171c4323", - "3fb794e9ac098485213af85bd393079f8fa47e2bbb36d10d101d6366be10d3d9", - "4123a70b98f37c2feb585ffc4a652871fc853d808d10f8aaf7ea0d4248f4f610", - "5de9e189d4986781cf28f151e1b9e18fd5e23562a01846db32eadd621be73706", - "ecb030e8acdfc3f9464a65202f1ba11944401ccc492beeb6f067b94ac3d9a41b", - "c8191284ab9afccd12333249883eb7a30471999f3cbebcf52d63dd5004fb4502", - "20be1e47dfc5bd1458fa0fa1f7c7916ba38acd79427ea634a70bccb371f7e0c7", - "5baa87107c40b57c397c1301bfc90f763f7ef11bc4ccd31c413afb12ed815a9f", - "046a7b6725d176c32ab6b3839c2e069603cfa876a2ab4aa6f84dfdf3e82d9feb", - "37076610f17c1aee7fdf89ed3a0b116961432bde20a82291190f527a8bc02d4a", - "41e415abbe25d079737b2906ba076e123d02ed708bc286ba71e740b55ceecc4a", - "513a2012118fc3fed19790adbed98bcec36875cab45bffde758b105e0e841ba3", - "6b4c9142051256f09e993039adc972b0826d505ca9d889ee15a252a3fad92efa", - "dcefe764809b5e772348b4e007e50b3382b97d10f7f32a13ed07f0af8f72e15f", - "57b3d5b9a82dd7d2c01b721e9191f76c50c001a908a50f87ee5bc0bf85cc0e71", - "82b68e2180bd7fd32a2b90b7a3b161417072cb07fa87b0650c7f09565fba8401", - "8aa961f8302217f6fc6a581f1e0cad67cd3b1949fd86f2d339a40444f29b1ac8", - "488e393601462e078882af28033ee425a1c34aa0a68aa1e4166912bbc7927d44", - "dcc2bad9cd131911f543a4ced4c431a765345e653bf0c38278dc73a57e61b119", - "689a6dec0e844416d29eeb599740f39b0961b9592899c9391df60bbe8ab613bd", - "bcf4150cbbb713b0f8b600bab605b984e4df6f2131ebf511aa185988a2d6de32", - "c3775f5e6b480f018ed3289f0041d4ae3b31a56e96da51051624932ab9c721cc", - "40636810f4f60fa7ddcabb6474c3149de6fee391b6bf609f64ed963a97c720ec", - "926cbcb738ef60d1d28384541bce19ef19f7dc37a6219f7566d4d89ee03fe2a9", - "8f18f72d7f7319e713b341986027f745922226c9e644eaeef4280ee69e9a0250", - "94ff2a5e47a4366ad8f8607ad7749402459141e89ee87ce56d1f92995af0eee4", - "b613897e2080b8db1dbb09d84049fc34d133796090737222736cb8139d0fda1e", - "f358f791588cec1b190ca2bcdf04ccedf1a0426675dc9ed8156ac97abd8ed43e", - "ba88e8c63a67e2f91f12504a3c2db42c26d40847e7666f001ff82d2b7317d6be", - "d4bc1d560d5e6c5613d8cb6869ed10d4a8cf526cf1974bc1b494aca8b0c3a657", - "0bdec6a3ff0bea5cb059d3e1a14022561758fcf29ad65137656d62f2cd8bf16d", - "fc578f107f368216d368eb36e2a023a1fdd3b4339ac754d39571fb7fdf8b6a52", - "acfbb043030c323400c47bfee004d5c686cebc75a14e6da2ca766ea15f70f7ed", - "b4815dfa384d00ceb7171b5148d2c874d50a8f8c5db06fa0e407c9a97471d9a3", - "b5879bee51a8a8aef4203b4164e8bb9d8effec7d65c1afc0b9177f3c7c0faed1", - "48756c311d9dc4d969bcabc236880df5538ff4a2a048d098fabc75c8a92f8d97", - "4c525059b99e19bf182ec73a02e786039a41c0d843fb2eefad19838f00118ed3", - "458b9ed0cf6fa995bee36ea96979cc930c162c10c66cf45683725904a226d19b", - "829f3b550c38680d17d0d15933437fb9a1af58a1c0b23dd86051bfdffef2f96a", - "da1a385e0b63e7ffc4fc6f271bd2ad1784b400a490846f66b9fe381485371493", - "bc42056547eccfd8e611925fc07738cb768b41be677b207168cd2c5a9f5e43d5", - "c492a6998a34a231a311f462824d85d44125c88f2922a39570cb4b12e2abb6f6", - "beb837ad038aab7cda03dfdc41c2cff9bffe57719decdf73c03c84163e344438", - "c62b7a9aff9ba029b04c4321f79c4144bc98ce0378acb8bd12376f0be42e4fcc", - "49daaecc6bd22a4bc3f2ee77a61e798253e750a4df8938a4e9c8f19f80391fd5", - "fd4450e799534663cd490c82fa49c6cb0e02aec6b35832c8f8f66d6b98070140", - "044f9b6942133d0ab105b191ba3fb991e9dc9c1b266bdf7e9a9def8d8df80bc8", - "7198f99829484f3c79253999258dae8466fd79afed85216577ad236aa140d47c", - "ca1d78a19f6a8ecb2f04031d15c55b5bdb4c89417c07ed77e4d7b9ccde178d84", - "779b8426c903320da346af703a598e1eb7cb2fcb37e9a6d596b7983145571070", - "95fd9fc07eb29ebd39f2deefdab9fb1984bdb69604b6135a8064e6d8f5663523", - "a7675d445780b06e1a5800bbbf371bd84c4732aa16fdc58f03cebbc405d344ad", - "5e899b4043c5d769036dbe0ea5b521bedc0af59dc97a6d1796c09b6aae85be27", - "c8a48af5f776bca3966ef6c60053104f74033228c3b75c0bf93a4f90d14086e7", - "9053503f42cd70cdc32a58b8b41499c2cad683f2ea92022d3cd7693673cceeca", - "26115754ef298de135d7c90ac4504611484584e9b60bd327c43ef2e52d607f75", - "ecbc4f4d9160d38a73c0fb14b35a5cc2f37839a4f7f453dfa2b6f46e84899863", - "259803744f84e2d7188dfb9a43c6853b74148fc1cab1b3686c2e035e27618bc5", - "af02b63fd47f943bff19415ac67cfb40c5788ba326c85b9bdca3be0b85a77c3d", - "8e49de22d62b2df2a39e4f0e7cc77b0fcccab5c323ed8f7357c645716e3d84a2", - "2da296a9dda83ddb43731159a2f84848163a91af76f41f9bff527ac2cef70def", - "5b2637fa2bc78dfb3a6acdad7e8337e181ae8cb40aa85972a65211943da811c9", - "b17e2747ace28973ffaca56cc2feeddcee5efaba0f383ee1a42a919ddfcfd01f", - "a31f7779e4c00fc766a66180531ac513b6e80b1603199b082d05f72c4d102fab", - "1adca436b45c0d526f4ace73f974ca6f286d8063bb6a593ab42596971fe1ce39", - "25cf5b3056d32da235a0bed34bf690838718b4934ecf3f35a73b6a13077e486c", - "8141f01f8a18fa0c4920385a3a84330d6f96831ef3669ad96b2e573fba675437", - "586f5db129a76184c78f2cf14940b75ce92a1e77a3d06b09c8cf8c715dc7f6e5", - "b3d40ca0c71a9f617239d1c9f0b98115150c1466ef4cf21885dd79b3be57d16a", - "e52784b59c4064b2b9de38c3a93bcfcfc65c7d103574acb339e36f3282ea07df", - "bec9655c6757317640b97f72cbe501ccd3fe6f2fa3b024c11966d9dc2c3258ab", - "ebcedeb3c5153478ca8e504c8116253ccef7c3907a83819e6b6b7c8cfea01e38", - "b93b5e5159e9aa6aa3b101d657a19612741fc231cba723746fbccd5375dee2b2", - "279d843ad2975a92c0c64b1b031dcffd15e7f30643ee71af3d8976002f7b1ffc", - "7d0355c3199ba22430a1030a1995d118341f870bb024b1b68a144d0f1b37f0df", - "4993f62f12f5d80a6c991ecb7164dec5079b5dfe8bff46a68b6d16d7defeb4f2", - "763e9f5bfea48154356e7039acba8d030ad7f5b22c573154c444b75b4a553637", - "be88bb24b6b9900595baa9fd81091dc88dfc7b407d5f713ada1898393f7a1fca", - "39bf354eb5b8a37f8a826f2d6f7ec7b24210740288646b635ad63e1fa2b3d702", - "6f1a0c33ffeb175887793aae0b47e6bb83aba8088f8114314993fc119ae6856c", - "7df34a610098084e19fbe568622af939126d181382091707619aa14e562536c5", - "4d28f834fdd85dda9f46d19657f4dba7fef8e7ba637dd75023775d1e0383b9dd", - "deeb07d5379695c82af780463ff22c067e428d525ba910683882abc73512d669", - "d2f9f873f239b07abfc8f6e788c64d4d94abcbe8fcfa77365197bf190c2b0d1d", - "6f10153a450351861a3ec6e6ffb30aff603416bcd34699034ba8968478c61eba", - "d537fb291c0d8cd43624cf4223d781d59604e953f22ab8c46f769f9145d1213b", - "3185a76a1e4989ae6ea9d584298036142fdfe41a9817bf8a4b34a23c0495c185", - "8009090ca232c306e0eeded82c08d3ed0a27c5d72d5b2b8197c795a4546b4d6f", - "ceec19ff4ad4d0381aa6a1c61fc44699aeac09903c21ca8fdfd921ebd03f2251", - "8eb0af679d8be2d599ff0a6970860b7dbbf0c09bc6c64ff08af942275d9e3125", - "29f8266199244176f60cd938348f712ffc855f86ef14d201ec5d924d6b579d38", - "37e0f633ca928aa95c72e3e7c9e46dd2e1c57f29bf80535cb10fdde17b8ebe6a", - "98a35aa7d8ec11e7fc7a55297ecad16ab2be051e263159f6c7ecc3d2cf06435d", - "c7355ba2b0a6626f3af957fe10963b897fb83e17d7d05db6b6f3f26253c364cf", - "110aba46974124904128423355e2edd855fc838541d8b3f1ab1b80cce018b87f", - "a518c6734109efe35a9b27f4c8752f782d60014b2fd5bca1fc18deb4fe65ca0a", - "279fb5f539b4e6f8c9e442f8e5f3fbbaeb279f022daee968a476aa5aef03aa99", - "e4236b07da21b327fa4bf6dacf5cf06d3fcf485ebfeb2932c340795eef36d0a5", - "9a6eecf2afe3d5674a5746a6ae613b7bc72028a072c5d172d733fccf8afc6c27", - "c5508240536b1f489e3cd3fdb41f8fc14e872fdde922219661819ac908a12991", - "35a257cc96289f59fb2165f98b8192a5c066d3001ea93f043f6442c0b71844b7", - "8f65a1b673585b44e3e992dda9f91dfa4a389aa4ceeeb48f1bfb179617b0a452", - "9d3911d66bb0a72d995e4daba31e49fd49f7d2b393e99fff21368393cd8e595f", - "0c9aea2adbae070fd4547b9969419f94f4537394e419a29df9b0445fabf59d5c", - "1723bd4c09002ae8c01c81addb71beee8459451c477a84659fb1779d867c3868", - "b5a72d955993b8d9078d82c1e0106e1154afe6563038b3f90a8fdab3abefc01d", - "bfe90ef7cae5037d4213f0d1c2fcab6b79595323832509509eefe9412040b5d4", - "d400d3202b4c71f8ec050dc1d545c07b27cccb616bdafc39757e91ba263194e3", - "a21434c42c4e4a5a0266ef0bf673d4bec9acac55eb1d36058e3bfd8625987646", - "17e2e401753ef2d09770e0aaf961f7ad8fa921325c921f44a84ef5c804757768", - "a609487d1483f34b050581b62f3420462119dfd7565868f91185d100769442f9", - "83aee972fd41fd78aee31a3b5aed94bfa104092132babce696fa409fb0fe61a2", - "aaa6311a501ada20035eace6fabd5009a474404bff9582e9b910ee65fbcbeda7", - "2c9c9402829d5bfff60950270131021452be355dc56464efd5bef88c056d0ddc", - "3ac98941e555bf30545fc58aabf3e1aff6e2c5874ec8092ff590a93c81a50b2f", - "c125c2dcb38475a1d01b62ab54a5b8fdf3488a3ecd134ce398155391e1484079", - "d4332e1115fb9e9813455923b81742fef4c71c938f12f8305cf4d7cc3d6c4b60", - "9d47c629bec07b82962a7f0aabf28a17871bbafbd810f78202632065eb7a1a97", - "6b8f772271d0a905d49967ec1201c740180d33b6af658caf5534c4c0c3778639", - "0e88ad97a8c568cfa400e951c69616785af5d3de0d07c57d63d7faf02fed5972", - "89875b9ab56b2151a8ca23720eb3c8d1ab7f7d7e75291cc04abafef3f3b622b2", - "703936e756845ff32e276e1f9676113f7ec59cbd65a35b42e7546739d070ffea", - "0d4809af3ab1f39b76eca25a497408926323abcb2adb9002fb943d0bd36ec89a", - "9f53ef0f1568cf1a5518c43a4033494129bf5c92b8f9cb35e5df55ead12ab076", - "e4e4cf534c8e2f71622d7c75d4de9bc75c9e384184043fff1d5cc45406d6c09c", - "4a46e9ea43b366fb2b77a6d558c921c68ba39b25d7cc7510ea5530af817612bb", - "3734a2933865d1f78345815085f146f15607b259ef51e97a926dc71770c700ce", - "3dc2525111eb0c884b1e5407e1497ecddf4908fc8641b4428de4052687e32f74", - "daf4bce271fde5cece34655b43ea66a0751bdded28a06e3e14836ab33c77630e", - "5eaacc9d68a7b91a3304bf29959e6d39b091b94b5cde75312dc94ca922130b49", - "4b047bc0893fb46d16d55bb3dbc19125b77f6e8a939fed23590dbc3010360c0d", - "b7a395bf381d163e1d1b52d4555612332c8afdc1c6af8e37b23b082e8eb92283", - "1dbf38c1de48777982066bb4b186e231ae367a67fecd022e4c80226a4abfb7fd", - "604b55765ddda0db045434e4805fd5ec9f6aacf8eba826340fd79075b4564a1d", - "508b3d28c7d0bdf4a6e07ed2cf0d454ed69f5e5016d62dcce09fca4bca9e1e1c", - "c82d37026c337ce12ff819ced1fe50eb1483cb9d8bd46aad2201c8c599168dcf", - "3b3bb1b15a77d44f9b97e36717ec5f49fb047816d745dac0d3ef819e4b0efba6", - "e3f77672d6729a718473fc91570f1ec4bc8cac5b6beffdc41ea8229871dca497", - "6cefb4f8fcc91e56fc64e1f720e3b1dfef9644a0a96f9c657b38cfe6fc06af64", - "8c84e785f055d5fd2f5bb0e43d55b95318515f1199bf073b155138346dfac7d2", - "86c02c745fb6f1abdacdd8fd18e08313f08bbfc83ec0ed355fda83e49fa73800", - "7d6e3674a695a4c014168ca10681f390cba9406de5e9948d7a23a89c15d6bc25", - "822e841ab894e7a063c36209a25ee486caeead6141019b003a05ea99c615ca20", - "8ec905cf7082ddbe8e5b4691d4cfccfbcbf2ec1c7fd50d71a4a2a86a6c14bff7", - "ded36cb01c2ae87966a57be31abf63dadf45a9e7aeb32c1bb1b165e5a14e804a", - "5a1481fcd71153221e0ee5713acadc46c28ef6124cc4e4d79967dca3dbc78b2f", - "389e0e4bb707536dc31f9448204852efc65e56211888e77fabb8a3a702503c17", - "70fa9494652f2c0499e2a5eb8bb9e5d9b381c138da834deacd23e138dc47b5f8", - "ee07093be030356d7b82e5d35a1c8ab3bcb82f104012a8067427c1e3d97180e6", - "5b1578f75efab8eb37e75be18876035d64af0f12c363b6768f73f6d2e6fc43e3", - "3fa9f0e96bb8c34ac1abc5a99ac886cd486c02e106f225e78f73253b5d26e2e8", - "28ce19ec9852d2cc78ab58a19f7cb5a9764dc8383f0c70ba1e910857b3ae533d", - "ccd2cdc49711c69c391e1dc600f269526af4bf525b3425ef2f12c1e6d2f90ac0", - "43e9dec5a82492fc9304127b728b76b0d4f902d4429235aed9b0fd5d72d4f7c4", - "a2a20d57309e536a26199aeb97aeac7eb8e9b4396138eb0c827485ccbdfc492a", - "28f8509f2b067a96087957294cfab805e68a097ec47b3e4062f6910484111c75", - "0840df239df2b0d847c8553e4f37d5da4bcb572381802bcb49ea8ec435c62abc", - "9eac029bbf05baefe5d857c9a99c5e3f66229ec972ebbe7dad8524d9897e3708", - "b017da4d81828fe2b9deaeb6905e2982dcdbfde86247c9922798d69e7ef27e96", - "0337c6fa6beb105b2a6e2dfacfe957003cc478a426e56924e1cd83bcef3a08f8", - "d777769f2afb480cba6e315b8f7f9fa9da6fb5899c093a98c8b565963d8a5cab", - "8cc3b3f1f854b551531d649044de60ead168ec11cd99435ff104fa8dc5f7b962", - "8c4e35593710681200d85a46b92580a6065f38804a5746e7db5f47bb6774c4f5", - "e630f3de1ee2036db5bed62ff08531f9ed278c923a18a5c95a12997d8c8978d0", - "1aa9277b27533b4eafb9703d30ff00ab33f8b1a64aff48397d1c3f1ce96168bb", - "8b11c56f432bc7e6539c8612b7f31ce42d30b37094f868adc9a3b1d2f6ef1096", - "8f77bd0569abd17f8dd3a5e8e0126d547b9ccc646262c3df52584a3618be13a3", - "2f915efbc5479f0abd523c38ee00f0bd23c916f24181d0a21d10dd5b85d67d3f", - "889b35b295d3ce369e7567da7c7a3244406c9b524eb8b5b3b65c6963fca32c75", - "8adb4a6011305a4db3385c7c435e1b4e3f31b676edf54e67067208ecd3cccb37", - "8fefac0817aed2fe0d7f27944770e778e78b49545251fa4356cd42ffe2173814", - "8e366c2c1c416ed23a74e9f80f59448e6d6193c6be79cbe57d1117fcf07ed57d", - "4857f3c11f3184214b10b52a8495b434d2430c73ff7c0b0440f3fa34643787f9", - "c0bbf2986f1c662146c2a559728acd251361adbc3dbf4962e4cfe2568666b7d6", - "49b0e062ab2ad4e1ce00c9d74a95b8d7c3278041677f90a3dc4ece18a6c0dca9", - "bef4159ddc475d9a81a7748c27a2fa3e324f8fb66cd036ef044ff9f775715f21", - "2ba541688dd97e28f69d84bc485f6deee2e0285e2100e3787fd26bcff9194b47", - "f10a0d28a96b094b1e9518c4886da9e7c0fcd5a21c9dd5f937dbe0d53861fd06", - "a1c57062c39e86667e8a637488bfb09e3f64b0b78d95a8e9c39b2703301012c3", - "3354a23b21fe58182a539107287ab53b6c9dd15630e711d1ceb32d45595689a4", - "0bacd6dfad0828cfdcf0b61d638ae031b6a659a79f9aba1fb80c442ae50dbff3", - "4715f51c55f96ba3f71f0fba793e5ec4ab52653cd005274bc16c3fde1acc37a9", - "7ab4a5c021a2b225ff5dba38eb86989e9f47bd2ac7004f9a0cb758d523d99aa7", - "45c9a362c5ab5e7f211b092fd94c551ad99736db9da1c717f280f11ad45af3c6", - "db6fb9112745c63d5be472788d79227ff708ab00099dd22080055755fcf4482f", - "aac5d460b3fd5d706776d180d49c4cee3c4b57996699af739e2e0814bf5ba4c8", - "27f5d4ea688cd10582b59c8e7f97b426a1d4fea727c5b18da638dcc323c5aef7", - "0a50a0845db237ebce3783ae4e42682daa85adcce11868b712a4762c5f237a7d", - "881c28c7703b38684e4b9632084b69d02b170704cf893da2561b187e563f756a", - "9310aced56a4fd4cd669b5d0ebbe5312c3fa7dbb3084412e3a9da328142d6afa", - "a12c610838ad6e601b9964b611cb1eb2b78bb68ceb33bb8bbf31f1d2b84b9d80", - "b5fbc27b68de538bf5ae4cf49c919f5575f9701aaca7e9001e9ba5b4d7c90984", - "0431bc34fd408fc1bfdd59a62d03222dbc07de8e6612c3af8abb3f3011181e36", - "7a6b6f67399ba26175fe033b9cb866a11b5536bdcb5a97766c3a896b26d5bf8b", - "c41979a22f827de7be16e5fad29dd7649e5e3b67a0d4adf331b7511f5076c41f", - "fee291a0944ddfa96d5e0ee8f4a06495ea02c364f497ff05c49e2a3004352626", - "553b05aecf97ddf58fcb9a7e119881904c56878b7933f64aefe97a3e0a4d7de9", - "e8497bfbd5d9b71a9e55d931110cdae167d9d74cc04720c08bc3709d86d84896", - "81dbe218bbe2ccf141d915d558484f74eaec421191b02a1cc7bd1c9e1ca9700b", - "74ebaa39b04bac2f339523c3493f3eed6d282bdbc138310fb9d2a653a9c89fbc", - "4f203f2e726c56f59f2ce816417618c89d5f4f5f31b66322673afd1a9205a093", - "c91c04fd635da390dd6ef487c89f8d2f058522f7c4ff99fbb768c1347e02086b", - "324855637998826b261a7ae1170d03101687395dff5c617c2dc9dd1044c9a7e0", - "2b8ced0105081b718d484aa865485c1da93a56d65785db97a721e02ce1554ff9", - "258d0424bc89bde134a2cd9792ec3599e52b10b9030772ca77ad1d5eb5b0fe55", - "fbddd86f8ecccf0c4d3d3dce3abd939be2c31f159b64cee577ec9f32efff8e93", - "3bfb7e101c541197f256d2a2d5c1857f182fde067f884d724f587288b39ac374", - "63fb8e786be7d5dcac11abb559e9332f0307cd82db35c58e1a338d5572ddd2e3", - "fd6970b51ba530a89229bac90564b4388930676192c8cf6fb7b05d76d9ffd8c0", - "a937d8a14e63d315151b2dac05683041a6a29469c5f76e9a6362dc9ae628a68c", - "e1ccbe09a7384e66514a60ed3c5a1b68cee3dff71915b249dfec739bc19c37a4", - "651ec885267b97e9cb404863e93cf3dc454c9f90acb4815027d4bee0ca283fee", - "08dd477d850b435d2e32e7639f2321ddc05f7be086016e616d68b027b92e137c", - "03bf7d2d766cf72eb040fe00540dabd3a324123b581405afbca05d5a6d3d7301", - "b489916f886659761702985d13679963e322266c1aa1f99e5d49010a078cc420", - "27431f20cbd66093dc20d41fb7a342e4eaf44da053f5e3d3e6fc813d53f5e240", - "447263a0b83751d9a7cdd7b58e6ba507565a8e483d6f3c3cb6977e3f82771b63", - "71a60b377155f333049623dde42ec435498a6aaf37879e2f01ea74bc431dafd3", - "ba9e617f63c59f0f004d0f775b88cdb3669f3e2a3674a395fe015474507f44ee", - "c8601e767cdb4e6320a2e3ce3782b39b036c1779a4cef84fbf05caf1e21e1d45", - "b21d96f2d1bac0f600800880b9b899b9bccd8835c16af7f2f66affcef168ca7c", - "2e15d9ad400b127ee27fd1d5854c3b620fedbf8f2bdcb5f88b4a5bbdbc4e58a6", - "f64706419df1aeb4420a4af1488daa178349a3804032d9ae60f994a2e261efd7", - "e45bd2e0203466bdfc92c8967ed5e8c83b64374a8039c0f6ffb578adddf0a5d0", - "91171b68d5959fde5cf6d4f8096f24186916f0bfb49e2bbffa8ad04ccb40fa5c", - "35f483dc2b6dcc0f3a2f51c92e0a08af84a601c38084cc3b1d43aed81d83e23f", - "800de72ebd81b9d72f776e8c7ef62fed0db6055ce678d2e83acbb98f12472f48", - "2eb6aafecd061382696e2024dd328de68c5fc1a6a761308545747b346cbe4067", - "fca8e4a8d24a9543091457ec10f5accec3acfb3fb6468cf32efacbf84d3a441a", - "cc74bc438010eded52f0d22ffedbb4faba05408663cc881dfe03389ca39556ed", - "d3f79a40c1a923430bf93c32b16a9293d07900f1700316ea26e8f965889ae417", - "39f732f42d73aa880dfdba2a5f97c01ba4cdd8b95f7a4234fc3d3f75e9f9e2e7", - "9c9188a0dbd1f47ae12ddf7271c2595f16209fb1ab54c79a74def90199ad2e00", - "31e876e21cb458303de00478ffda5a3b3670cf110490d29ee3004352b1bc5995", - "dfc0739cf977c310543a0ff614b6ef775e51bfaf111291ce04710858aaca9bb4", - "93e6ef0829a2d8f36cd03678259e29de67b652591787e32a9de1c748d31e24ad", - "148dac880094113bf763c2bacf93f57f4fbad74fb65790a76e3b7347006437a9", - "c46898e13863332bd688f4651ac1e05854cdd5e51a49881d137497a442dec497", - "d4d5f8c6aeee8a271cf88d600a40bf0e534b189db1c623980dc88529e2a89f70", - "580e00248388bfa6f992c482fb799e01db231a5c6b87800df2e1003abd9f200a", - "e1521a83310d60b1bcd9e0f8b7ad412c497f02b7aec11f58be3cecc33af7437c", - "591f226f9d297009c58971648c001fe312e98c1e43f4159642daa5fb632d4531", - "dff5531080ae217a90e6e57478f385ceba1357a9f18dc6bbfd06f44059b0bab1", - "d48b88b969a0d87dd4dd517de42da8f464964b84e4a5767ddf96f492d85925ee", - "f555f5199d0425e2683b58dae1b57de25b2681c4d3fab3fa3fe64441d999176a", - "a0de60969707cc7b5d457691af8202ab0732325f31877a14f889967b381c0f9a", - "010d718e33378779583b3d4f13aa4bdbdbaec91fa338a0f101bf01ce94f35866", - "c5517ddb3a751fb85300b40ebb85f247dafa8b9dde9e41cb4fd511dfabb5b813", - "3dc764168f31476053e914ddb0fb0d1247f7ace009e0f83e1064a40a8ca0769b", - "e5941935e00d21b472dc1d4e19b238f15cb3bf5c7be102dbb48ed6e934c0ac94", - "27b5b969cc003cce8f3636e5534c6913b4c2f4c53e3678863f6d6efcac37711c", - "a630987fe6b1ea8088a88f3c2a4271fab3025f686c3b6095d613315588ffb7c2", - "9f489f63e775dbaddd1c4061ee3a475d30509b38aa05860ababce31d90fd1141", - "5a1ae9e9f6bd52107af906b66e119b034a4a6a4c1edb4ad5172e5a86c035466c", - "bbe61b0e07a21c43beb9426aa3a538a62ca620303eef9f7c7d81535a61476a0c", - "174346d29353ad71e574abd9a510059b52ba671584550b18ab782ee8f34f4c2b", - "6208eccef6603f41b6259f0f0650cd1c088968117acfb953bd91c233745766c1", - "74020c9514cf17ea8f7d6ff2e824f1a766071270bdde0acfbd7cfba3a3d5930f", - "921c15a8cf7ed96cb18dc3c2295f0f26689763f611fcd5062029fbb96d8c9601", - "b072c318609e7bd28e988c4f6d901d6ea8990b50990dd4a851a8aa0694dda434", - "160a769f1cf81dd5da61125a09d83a2b7d82860a3c06a5ea0f87827b0418b97e", - "79e3b134fe905aac6526c96498ff59737351a203d91aef4149a2b5e5b2be4e45", - "67e07e2fa800686e8f799782ac5fa0d21dfda891f6d276722db4a2f8e29df64f", - "48d61e64887547c86adc48ebf8cd8553a24dc31080aef7b32c3bb951d82e7daf", - "0b640ad0ca67a2b207425aab8260fee0c98dfdb8e260d309737fd221c233fd3b", - "0abbb4b8051883305fe6835968ebc0d966ab774637f85d00e595b4921560e728", - "6c0dad362d9d2834da221801388fc8504d7ce71f39a65a4bec33701eef77c627", - "a0de27812e49753c7c9c5fa9fdaffc2f14ec5943723f604a7d391065323124ec", - "ed9a913086f04f6a8b6abdc7a19bc8afa25546608f9cc8ded8311829aea7ab93", - "2bcb7d5fd41e1d57b5b936179b857bfaa47e0880490aee2b577246018a5218e4", - "dbbd45cdcfc4dde09656fd943ede736d57e693cf11d6df947cf6f297d0a24fef", - "54f906851e7378e24078808d184de40c843e7c64bfc7c5640b06d829de8dba72", - "f3f9d46d16bb63c049071a0a41b90eba6961c321369b100477732dded2590cb6", - "35c82cc89a94417c84025bfaff0158139160cfd747b3a3557ae10c9724432d71", - "81e74839611ae2d18e8545b71d639893409804ec1e212307b94067e719280db1", - "6d6af252db87b7066bba89360adbee0ef2827e9ba1d8fbd1049012213a6fdc7a", - "7b7a9c3a4c077683a2043266370e9d8769f959cb3332946c55a986daf7b7ec3f", - "15101d94bb40f0ec1bdec4e3f0808a2c4f252a527714dc44a32c49148b298712", - "d32e0621753c149b6b2a39e666932b7c6f8072458985abf3faf31ba24cdc4a1a", - "b4d220f6b90e88e0ea2b6b06942cb9e63487ac51c232d0b0b07b60ea5a4e96e0", - "a535b15d67e6b86b7c49321e0e9f0e4c54a738e14ffb0308d313b6894ca71f44", - "30e6765ef0ae4e81969f2df274f43afedfd7800c75f3a841fc577ebcff0cfe36", - "41e25607a21a497aba98f07e69fc9d8b428103602678ea162a3641c4634fa81e", - "17dc5fae19fa3c6b75c144bc84accdcf53e5a51f74ede3cb74971b5311a9fd95", - "63b368651837a17bf2c181c08c1a27efcd05bbfa123e7eb1b2439416efab38bf", - "54d53be099fceaf0affcba75862cb96adba0b4479f3438891a28b96e0a7d0eb2", - "d5d799fdcc4ca4dc713f855afb1e2cbbc45b253d8885d23104e0684da64fc065", - "bfd512e946625e77486d852d1a05a5c623cc3922b3dd5ccf38e3ba5c2db04fea", - "d9a7de65e374e7ab3122ac601d5e5d888343b64d84ec78d9ef28470062a3eb7b", - "fd14ca40e788884090b7458511d624ca7ce91cfd5a3fb311a3b7b68bc49f2321", - "96b17008b30833744b06c9cf5f6cd69edbc072518a63d7a7dbc34492ae191fe8", - "b658af1dd01c851c49deaf94062f433feef0de0c0783910d256334932b6ae728", - "e33002917a4ed8c90d4c846f97be71442722feec8bedcd66f3b7e529656a53cc", - "676e7e0755c2f61475934b9d01582a14fd9dee06a45cf1cc10c12af8d8c71ee1", - "c4ceb501afbf2d9d1f03a42f282af5d47e68df325c1081242a6acbd3de517d9d", - "430b2363d8873cfeeeaf14286db1e28d37d28b13342711468cd1165cfdca25cd", - "4b8e562f82b260510f117fdaa6b1ff2eed5659646a955019aa910b28c99d7ec9", - "da7dfab73dbb428a306b9d5484a09539d8153d915dc93d27dd266a27b2da9688", - "e7f59dcae6a3f9063099921eb0303bbab22581e328393b20fb06e7292002ac88", - "8bf415b1fb1102a6730f073913925c4a3666e1c369a1d00a71a41543e1690283", - "1ba53588501959d2e8bdd8bf3e156dce435959d8c8638dc16247a5b12133327f", - "1629ac2dd672d31384d17c71064c537e60f3dfea1080638744926c4e83bc7f95", - "86ab3e9ac1b61048f7b6becbf45734633c19237968616f5c7aa4276f6083f003", - "9331bd63f65d71add6a27c6fcbaf91a914b6aaabb6b4169b949d9e7546ee433e", - "a9f7c5e475655dfd331f73d936ba0afe8345a6a47efb2a314edf58216424c71c", - "866afc17feec1e3b2423cceb62722ff2b89a450b62533377132c64232c44030d", - "eee3eaeecc0c7ed971c04ce3a99c260032ea2a6a1d7c23c812f52f2886002c8c", - "da38cd194ef84c8f3e2a2c3e828064bcf91f72223a8dd0f447857b21430b997d", - "79c8fce63db2ce871548bf84be84abd33da5068bec9f043285daf64391507250", - "102c86dfd6ba2b9a6736245395d91795c86628bc99f926cccf3db84facd59411", - "500074ae7e15faaf2774aa844adf19fcea9d634383e66fe2f9dc898589f06f20", - "bfb28d4a4513a903de1ff05ef2e0d3dd805eb678650b252a0cd02a98edfca807", - "6497a7b2d3bed7624fdedb0399f4a9206e0635eea375f4e5b832c57beff72b61", - "17918e68b2f2b2003a1ff8019f1196fb14ce8e0451156189ba724c1846b1cca0", - "fc3222387ba956b4f343c227bd53b46f1883d5450a2ecd4e414da4197cd3fef5", - "5c9631f5f920fcb8e2c4cec01ab7f7999c5ea7cdd72f05717b83b1ab8d3c013b", - "3fad34aaa498cf7dcc62d7f022e748963ec4ade2340f5f1faa396cb7693ed4c6", - "b1505b29a45527427cc7bb7cae9eda4257058e82d880dd951844fce3118112c3", - "bdc373d38ac8dbdcbf52bc4b5b220e415caf2c8e1971829afc167b46ba262db9", - "29c1460eed5638526b8071d79b03fc6d321e07d3b00d14dcbcfaa505f3020bb1", - "9c0f66b995fcac6fba1de03a538fbf2585d815f01a942ac6b095d93cd362d607", - "0cfb93cbc0f180d42c1ec03ffdc2f02bfcecb5698181a5b7f62a8ed9fdb267f0", - "9b894b710883f7099a86c5b587bd0fda2b18d5f7b513d99e2f56d1414abae659", - "0c4cd9412fc348fb8b27e7550a070d558073b9c9ec0ad8ab56b2ff5316cf7472", - "9137b2445093255200e161912d8ab28ec6cad01be1b4abd19d2406fb56dd4f31", - "a516c11c34b1e2952ab42c95a66d3414851da12e81d872182ad16afbd5dc3d29", - "5ebdb6a57b22964e1502f76abd9759b71d5e02e967797dc8dda1f703f5b1b836", - "4e3abc7ea6bbff47bfcfca8dfe239b6bb2710205b55949ac7640fa95835dfae2", - "b88402e656f038a2c926b8b2502c98391acadcda21f68835db9f86fe9c70d065", - "e2610878b507888ef1642436d1fd2f60b6aee541e025e0e1e74b7b318cf74744", - "4ba738f9ea589638ba1f018f63e7616b7a43ccc7ee0d506dc8aefb0b10ce24d3", - "a3669137c009f9aedfefb8a7a80accadc72f7f31702a3e4337723eadd01fa9e9", - "74caa600527116c5ca3b111c6b37d42ee727b64efbc0ed3e700a5c589243c46a", - "64d22a38f1d62735a4d8caa99ee8af4aad0e928fc048a4281653b47d7d2c3c65", - "66534074383d7f972ebf9701f1f3abe8c03de01da45d0bda63f7d6a43b64d655", - "00921968db69802dd57c5ebd5a247d6fad52fb06b3aa9f58147ec5a54cd387b4", - "5344446aedcb5d4adffd757bc6dffcc6080de820c183b745b3bde143b1144cc3", - "8d9e1f3580cdb176529bac393c874664795d95e7479fb6622dc0651b5ab186f4", - "9f81bcee06727faf622b43184b5cabeba542514f7226de8bbaafa5f77be549dd", - "1c7cca9db6928cfad1728c11d436de02ffb4f225605de85292ad5658d0f9a79a", - "1852788ac7d06c4c6c0cedd05754ac9b05bbcceea399d1fb8ae98873fb9d0c28", - "945c95521360cb8ddaef3e01476ffd61b0d44cc0a5881b6578a845d8c58cacb6", - "b3d846b9fb54f88a705d4fa4b2e53f5870d63700f1bcededcdb8f9c1581ffea4", - "72433a978b930513aae3850a701dff2b39385a344a785909c497acb3bc16becb", - "e6452595187244cd333f269132ef009db3dbb5f3cf228416fa6f631a75ad380d", - "a3622dd984a41f64a22432f10fdfab722955e28588b26ddc206adf6114cc6d1f", - "99aa75c216de22c8016941e7af045c205e689d111ec1f7c603cdc725fa51ac85", - "64b74dae8538a1596374f4b43273bb25b1ad0440e501aac030d68f100f9cb8c5", - "3f79b4e435ca7428443663cc094c96d2ba6030981a29f17e216679b67b3d8181", - "3a3abf76cf6a6a0ee46165664d682bd8b5156bf7950e696972f8a545da46bfb7", - "fc61e2b3a1ed330c6cee02be01fbd383a8dea3d8d273bf94b81a73f169b85a65", - "8246b4f46a1eebefec0581f22574e5157b9e1f65f901aaca45807b6916fb32df", - "907240dbf2c2198c5730ef8a6e84e0f130aafdc4f9b363ab3ab81062098dad93", - "9bf79f79be4d2a1e6aef292327c321f53ce566404c1d01b1c47bb3ac7337c71e", - "4dfc2de5eccc1d531218fcc9efdfa08ab857d693fecf1fcdb0bca49452f1b201", - "3d693abee8f2ca4b7c6172c886168d871acca041f9ad64f36183ebb3012dd89a", - "1f63d5b66f422250104c0c8631c10d574d3084eb30d336b4c4467d47b748e6bf", - "c9d3977cceec60789af1865eb941191c2b0732e1aded296405e7a86761e6686c", - "b134b4b2547c7528bdf717b524c44046a3a76d28a5799108767e26c426419d1d", - "f5bb6c952fb05bbdf5fad55155083d9755ce1d6a497d43caefa83ba64533f432", - "677c356143f6e91ac3a43374a4cdf2d9ad92c9cbe22f3068c698d39a88112db1", - "27c1d07b6b8a21c30582b61d22cbd9cef334901f270435b8925f62a0b926b9f2", - "790bb20adee9592755e8691dfde260e9a6975f55bf3bcac55be4625f3debfb84", - "090ce03f79ed9b92131a5f13fcd83c08b719c29778733c7f37e94419687854e4", - "f49c2f1c63b53dd582cef85596dfd68e360e3a853a02a07d82402b919ce943b5", - "176dd003b199f63637f26c77674965d6ad7f568f27168ddee99c6e1d9d7556f9", - "78593aebe1784910bc21e46921350ae4dad009b4089f066c74177531b6e0b4fb", - "f9465c4a4211cd900a2a842b0ef4885a802a43c25d29be9e977202f5cb06da52", - "c6cf36b79707191939ce2a5a4648c97cd2d89ddb9ac3ec8db13b642fa29945a6", - "279213a8b66ff934652bf192cb7d17529bfb39f7ad10f7534b62f66aa3c103ba", - "504e34a4001518c989ba2c2a1e2d4e94d6482e7115a33c866fd29b407a94e7fa", - "f7c7dcc8988e7ef4c146f8f17b1570909bbc1c9066e2796f18d59c95dd22aa91", - "5234029e90828e929af8c832556728380c1f76808f61ad659a6536e1ead529a7", - "8be00293bb7b7e9b524458507f687c07ce3884c29109f6d0c7dffc637729b9a2", - "ac3d94548137758f136c98fdbc999dfe3bdc04bf06b746ed094ec881d0a7617a", - "54f923dee89c6c99ed873aefa0cb828333a92a521df648e74fe52b3f8e815919", - "647acdae3919e7abd51357fc62aaa847265e9cfd5ae43d2b75c2a0aed2029e18", - "f1d082ae807cdedd69b8aecc0385c581cbe0b66c52ca5d3bce8713eb126065d3", - "6bd951c0edc8afb4239c1ac56113cf4991b7659fd081febc4285543aba906fa0", - "69de2863115997f3c4e1626fcedc8b95b470167cde09f74ba29f5b7268f69538", - "0e6f5ad151554cba3b02f6d6ec65b37bfee01cc621f8380474357b31fd61da2c", - "c790d10083f85087f164d1ef1682889fe06d52fa48fe0504f92b353602c60eda", - "6ec53dc7683dc8b1b7baaf247ac72fa88ed609b33d30e559a7d1b604a1dcc9c9", - "23814ed7420100f56febbd5160fc323a2fbbc45096b240f69c58cef9e4a01db4", - "c92dc86eceabea773ad548dafdf076204e49944808051c4d8466ac58fc0f43c7", - "0a492003180ade17975383cb56b2a84f8dd58668cf1ce05b81ff1db642fe24d1", - "65d44bf4e626daab0ef163eff69c1fd218400837dac3ab0839a0e7ee6d2c9405", - "92fd731b63ddee1920e3caf9467425df084a03ac2f0ce87e4858c731111a2934", - "50467efd01acca9f82e0ec4a943620b202f2be1292290776de3ad143e6365581", - "aef69a0e58acce5168d0a1c47c16a0903718a75a14d4c5fc1cfeb76998376237", - "6b470679ca01bbd0500e88ae571a7ba9af6d7d8ef8c005d98d97e91fdd660a1a", - "2748cbe527a103f944e3a6be676fa662ac9c8221bd50874c88a7202ea1e50536", - "7697aac046e5847d2237220007611136a068308b2214a3c0895592e7d4bcb3d9", - "5118bafbeb5b5ae414f164702bbaeb9afb6931b2ca1c03cf789335d0db164a05", - "5158472404dac987543c3ae2004486058d161cb9bb76d09023b3ee89d7e80357", - "f4584273a69706c2999fb24f3096884cfea33103577e7a3c1a015474a061f6df", - "3ab69c183813844a3330832b905671149b0fbab23009b826b80600c1cf1f78e8", - "061947bef8945f1cbdde35494111cefa7a67d147de3dd9f85dd1fdf254e56427", - "5431f7710e6fb8853d7252586ae6d3bd87cad450356d6c78c38e6c8893bffd06", - "898ab14a9762ee95dbc6b3c20af4ac12bdd49fe88ed2350673d8f8900ed769eb", - "a0e42ec4667c74e1b00c4970b8361c7d625e4290c4fab2b22d44ffa95c52a4a1", - "f0d1b7f315d8f06b292bcb5fd15fa3a917abf849615e8b1bf806c63ca1169c66", - "f5a20f4c2b0cd62deeb1755ed2d5cceb3c497d120e10439cb2a7d3c0f026d18a", - "ad1775fd407e859f960904bcf45aeefa1c377cc443e3cf2be6968aa700469274", - "aa6aba9acc5ffae66fa907b105eef6a49c8514efb6d6bb2dd4a77f8f991e8dab", - "ca7c28fb3dc590437d0198614dacf3cd6c72941b96f3a66cd9de4c0940235ed5", - "4b956e62a81186d3997287c7b86e5d3503b4d944e8a3e5ef6060fb5a0215f78e", - "7e16d614807125f03b29fee1b3fc48e993c460eb5a397e981d9210d6a2e5a519", - "1e0c3920bb2130c06eb2d20a085516891389911483223741202036e3014a56da", - "6d8ceb4dc0f23ae882454940b43e8937d7f52be0314ce2d9e99630671b0c5b70", - "f35ca88a901b26abd9211fd68deda9a2837d61b37e8aa50b025dbe83b683b148", - "80e308409123389289d8d9aedaf74b8fc2dc09aafb7dd0ccee9a5a523852c405", - "0f24e31339bcf6f4fba8f26b324c7bf4bb62300444d0321d906e208bdeefca89", - "628754b4ee10a8bde3363d384597120819bc2c8b6c8657a581679cc8c398bccc", - "f0f416324a59dee598b9b60e3a376f0cc35c144d73473e7e278694fb66c8eb27", - "bacb0d162c295a08126f29ff42db62dc11f2561aebd0593a6c5d648b3c7078e0", - "50599744116193ce355ceb259849f26a14c78877561d1de1f3a7b914eda1df9c", - "701c2410f9ec0f267f28baadfb67cb446ea4056addb2de36ac584739275d92b3", - "f89cbbbe03fad14a4f94d6bab06ecb2641ff43ba3a9eef14143ff9137655ac71", - "a119dc85b98f4d1f9ee5ddf4c0dd43b2825254a2f3f0382bceeb92d51d504bf4", - "c71fc01515b549bcc91540bbcd36e05209820a3acaee2a4da3a9ac5b2a2a1d20", - "1e54b265864db60178cc4e2265538650d6266b8f6d0ab5c49ef72aee2cc6a09a", - "10bcdbd31818661ea10d36030bf36c14a3b8b502d26d2d2d9e231d910e7248cd", - "ed48d8692a0f84d234ab3d50859e06af6ac38b9fce3022b2d0b7fc1abb935f47", - "375b6f9180c2d6807cc3b42cb08ca25174f739e244d2a7bebbc8433204acd335", - "f59bb75573bbfe5fbf58472e45b962d598d40df878fced27fafd04bda9a4c6dd", - "66036dc07c6d2cfc8d2e3c54be2e61bee10ad830f87a19b2a539806e3bc803ae", - "b16fc35eb1e63ca0de9c8a1cac83b6d82139f452611cb7bf29825a02f7303288", - "b235db95b49f5762fa449690c40ea2c6f25003eb42c69edc8ff0b200a19b2066", - "2e59b055714dcee9832a1f8f4bc80c9052fe89c091cf6393f1bd04d894ff462e", - "707b71471213554d195fb79d4a301df972b52f9b25b9a2f5984f009c19b322b0", - "7a9b21d27dee30c50da9cdc573e5559cf1e479f533a0dbe45935ec16f1b18d9c", - "bc870ee85d0032e88d465abdb2bfd2732b1059fe1c494792ea33133d3455d757", - "a9847edbb2dd91ad6191bb15d5ea476d8470e42cc25a68637852105972942f87", - "c8b2533e03439deb1d6358af630c31125dee6cc94682242fe0802df678b737fe", - "7a04648a94ee6c649efb75eec810c54cba164767eaa99ac62c95c998fd74f575", - "7f267e199e1a1bf371a3c4d45cfb5344d978ea992155299f9a83efbbb31917ba", - "825f13bab15f208b1c1ccdcb971872c7c3cf27492b37d0385466f436d0a915f5", - "5b09bdf33bc30fdb5bed918467ca240e1ba3192dd6f759c92f8e4a0980a74158", - "7863021c41ec0f0a5bd3e2d794cbc6cc41189a51eac9d23dcbffd80c619f8d4f", - "b8f40297c518ca42de3638b58f689bd9166d34567c21826cfcf020a73cd36e44", - "871065bd1f0981c81837d91a39fae3213310202b3c96a3cc5e032aaf7fbeceea", - "ab3dfb082cdad1ac03ee2f84e1523b437b096911546649bdefd9bc35f0c77b22", - "4be71b30445287d70cea79c7ddb17c473c4bf4d498d9451ff62d093f725ff34d", - "ae703b1ab1938b0a62ffa1b5e37dad95ec4fdc0af10dd937f4a28a93602514a5", - "274801dc8b38ddc6efc87c4db1f0378028adb2579c71705c859e94a1aa0cdb99", - "ee0af1676b689e76743fe36596a2479aa883e335f1e37ace686b6e299aa583d7", - "a65c7f6deea9a8523a09e8579d2354381f33b00ab66d8ca25c004b292782e430", - "6211a09c2491cf0f3c0aa87ecd6f3afdf69c4c3f2eefdeb42855a318ea2e8a86", - "437cde8c5a2e5ac56c6f243ff4782b8f076622d522b1651b0f665340e37bb00e", - "d89656d37759b7c55a86d020ce06ad977780d62b4f682259f679ed6eccda761d", - "a3ac4b7ddf16905a213a333d78a2aec974c7da6f9e4ad52dba01dfb021bb9181", - "998370a2da53628f9dbe6555b399126e0a5f54b6725c1726b6db20ea4236cb83", - "2e0401d5b0dff0afba1952668bdf836fabb9a3883f9736a22b7ec3d2c8e8618c", - "98a6151d8cf0bae809dbd96221dd8480fdd28003d8e5932f24cd3f1a4f6b6189", - "4c56030b55ba96f6afc02361b7e1af7a23b56bdc59feef5145884444f998fa80", - "0702441c8dcee47843151e3c3a2bf08222ff371a469618f01ecfb81b65953e00", - "fae139ad5675e97dc12cd3a972735032430bc027c35d83f8bbd6677160fb1641", - "881214dc9260b89cd0ab7eeca342e6338899dd9655fe57de0313ffb249b39c3e", - "88588f96ab813a4859dbf496a8ea8c59acc2f6b192621b6fcf6aca75c1fb9c9b", - "31f8f8827f2028ba4c9a3f469609743c57c366abc5e904c86b737f73b7a0e46b", - "cfc660a86400af88c8fd6585fa2399ba3ba415ff2501ce213631b23d5f8e036f", - "04032420249af0520e78f1cee726f470ea9d8d75f589ab3306bb82648bf15e70", - "09229c27dd7825e2ce870017b675e59c3bba77a58269995dd1b54567029c48fa", - "3f73f084287becb03da36ef2ba49777bd28f2591e96cbfe439e6481a61e0a1a6", - "c6bdc4d801277d78625119f055b1cd3e5ef53dab0b67da108361939a7b987d03", - "4ef0c67ccae7176d92f7d31d3361e7026a6637e1a1bb4ef0ca5ac14153d85d6e", - "d42259bd6fdd9c8ad79085a5d430e110ba05157602e44895a69fba34036ea0ac", - "35de60897c51ad5945fc94770dc2acbe3be98bbb2fc2111fa3a21e107e7c01a0", - "cf9ff76447e087f7557bed2f0b88b8101451f5979631f8988fc8b64c0c686226", - "b485c86a8b346654985437d5ac8e6e43a8fb40d8971843f6de5e9d0944927a0b", - "f8cbd57e3da647c9c74ae8c0bbc32328e9634682eca63288a6a2a85642be264c", - "706f7635f89b17359d0bc6fbbe614ebebd734a9801130b33a1002dcb7fb7ce9e", - "81a1f7165bcded2c2a093ef08666748c6d12672c40d123c54559985b84afa908", - "134bbc1596b0f441c21d806dba5512bfd572dd09bfaa900d20e952e8dee73667", - "4d4c11f7d061f4798f32c8331c2a7bb29e9250bfdc523caffb5a2d61b492662c", - "250369829a4da3fcea42b21350bd3768db628527bb82695e4c43d9f888875603", - "dc85af5222bab4588ba76ed646b6ad0692bfd3139daafc3df72645c546e25447", - "9770efcd47287851cd4d9ca3376f04c34e28a5d80de11009d47d57bf8a9d7145", - "ee8707b7d1c77d31c691ede42b351aa5cfc433011276f7a4ef95e0543bcdef7f", - "606583656dd6fceada717c03706f613999c6f28ce9b6f8db18779f13249d6e8e", - "aee7fa93cfa26f49f656e39c2152eac1332fb8621451dcc2a7c23c352898a55f", - "cba9c833028058a4c73a1fba78024cf9bcdecf6b348cf66dc6d7950673f5b99e", - "592058f8fa8d1702d52423ad40d280e478ff4706b3be4bd3fd6f793fd9da0f6e", - "742a952ce283037b64df1b70370e0e62977bb536b887e607695bfa9ac0bee3aa", - "e663c7576825d8693f6d2772ae1edcca6fa9b5d3fdede443b99d55e50e25019e", - "96875b59496b2f3a5da786fa41d486ebfa738d453885e8c243914bd55be28a9f", - "7ef5351f550bc109c6178914d17a1fff76e041c504a7426d800f0b2320426789", - "1ad32a30538d8c02fa5faaec302712de88c36feef3f453d9a8efaa61ba80336d", - "596ffe8c13b57c161ed4720738f29df4410e00b4a9b59b71c00627f1a1035638", - "83aceaf58dfae267f06c84e66e31ac18d862655d1c081b5e3e120a17d9575693", - "67a3320edef1a395a6a51c6058105ff94f75420c11404126da4dc5914b73779d", - "3b8b56975bfd899349c34c8ecd91e8554e6ae882bdac89e250e04374391df65a", - "d471bd6082526e7e9e0c487a1a5d3e6880d4b73728f09de596f3157f73663fe6", - "5da7164f3c058a5f725cbca36e1c68aae5a91ba07c1cfda669c2c49138f534a9", - "190958a14d118e7e30e1ddb5509f63f3ae432830ee9ddeb9cb200ebcb3d598eb", - "b56046616966eb555f9e64d21e8a3b5cd695d0c838691381bef1138143734517", - "fb1474202b2d57b9199fbe25d9d1f866113dc675bf80845bdbe92c6a23d3ac04", - "5a8532bacbf6d3239bff9ea5ee1c62a22c6f064b12bc10d7a76dc906ea50c9fe", - "db4424ce214a77a065fbb2789c1f53894fcc7931bd04e94e6cf183776df4e459", - "55603bb865bbba02dc7ff70ecfad1de96defe8098581874426998c3320b0b479", - "22387f4c8f92fc6b03b4a1379b9974826436f2ff6f302f99244fb5fac6326234", - "51dd918ca13806db08e66f900bbc14ad3db70695fd535ae96060843b36fb3300", - "a501a73e590935bd32f0158d952e82537b77636c689e0cf7a866889a2a042852", - "d2d548b21bfda837599361c6e7ae6bebd6c9f7e53d3948479226aa9e72ff117f", - "c212b9e7146ef5c3fa07ff84413cf598f787381fc9b05a9f44513cc2c13a48ae", - "fd3914edcc72eabc77ef28ab6777043ea4e42657115ed2493bc95740fd1ac8f2", - "3fcf8802b62bc654f169685b96e8074d47e6ffc9c9a6f9c5d276a10a56df761a", - "4337e5bc83a59969ee1427f50887a5a5a71f499c9885a18db816ced77299993a", - "66a2f206c953a33295174205745c8a0bcd237fc450954ccf70cd6a52984b2d99", - "df81ca1b8449bb7aad209be789db83865664b3337f57bdad9253ab206965075f", - "d3c7c1c6181b28e7008f9da06f49d69eb1d0b031bb7d475103c3344058a2942e", - "6d00e80e9b6bce97bb43a8625d162bad9516c4a8e145f8aebc2a4d2de057516a", - "9ab0b7155125443514a0177d1b7697c88b6bdc8140d0d95f34bcf6d22b458678", - "405e7950cb67d8c16473391fddde9c9d6f110ccae3d9d67287410de7aa406a19", - "f02a0de21ed74fb2a588c4352f30d26afe1fc99da2d0903db11b3c5969f46748", - "8b0a3494008d1c579a11349b60decd44814fe2f5d5ec1a8d24588b56f936baf5", - "92dbb589df8097faba65c10c0f59091a6aa80f3137dae15b87962a20a590f774", - "6d0d68e51158919e24ee13b045824ce7f4f61e61bf8c09ee505ae6e2dd54b358", - "6cf46580507129fe23394019290f04034e2a8137f1a6eacaad24a557606682c5", - "6df110f7f5fc9ed72df02e2a66014738a23a5f738aa8343cbcb9b35c4c779555", - "a3ad580fa817902f47c7a987e5d25683579f9f73d6d754d92e23c06a5da8d85b", - "a879f769fe19a91d1036694b7c19d96c9a7bf3c81fe8a51b8f0e0594e0859af7", - "0a2a7b2ac46d90983517624044b8a507b225901abe8c6f75936087b629222acf", - "96575d0ee0834dd7d25fcf20f5053a9b2b996a402eb45e698275713e1f747f01", - "46a770a07c84c535fc8ea794996f888af2b0cd61134088590bae8eaf6f427404", - "5a00fa794706e69a36f51074ffcb8793b60b8575bd487bd1bbdf0df012da5478", - "5c1f90e954bed9b7ead8e92577e27debdd1a394f636ae447f31294accc8fbf64", - "984e1fa57224a34d2a256be141c284d4a4fb929875f10e0d1a26020dc241a880", - "33939630247e37d20843ea59837cb22b26731bd8d23d34b09abc6d4b8f33a496", - "834c3c44caeb333f56a735480e271c7bc0788347fef93c15a74874585b9ede49", - "aab698d20879f701bfe72532073ae5647510ca9bd34a3e53d28c70ba503cd31c", - "3b6d931efaa67ac183fc7dd95eb4b695a92c91a97f01e183a9d69fc01ada2861", - "be700896889602671c7a2cf20fc58449fb87a7730e347c09a6ad5ff93ce67654", - "ad6d8c22a75eb2378debf635895928cd644423af11724d5aa019b4c1ce991a7a", - "aa282d5525e61644ccd5dae43741ce3e1f58056665427aa6e4e894c809ee32e5", - "16f7e4f789522fdd347cb1563559d17953a6954bb57fc3785ae8597fb43d573d", - "75ce4fcd44777909ae205edc56987ac05b4c8492a020e7e94ff7a8dd4b04ad0d", - "b00f73b7534bfabe1738a02e2507f0826aca6a65b88045e3f16fe1cc50024456", - "3a070df382a87bd907085ad02d97348595fa61c63b74fa7f6c53e7bc51659aa3", - "2b26fbbdeb87ba80ece5b41aac5b008c91d23580ebafdf4100b382292f278b80", - "ddcb9c838e491769ef6bf1e1a557d929831682b396ca2cb10b2a0166a35baa97", - "3aff62b9ce5a109ebeee24c278089dac6f2bb4b12d814b3b14a0a12e6e278a68", - "79131b70fe7f0b5b5c8a306de21becc45eacadb010b5c88bbec1cc608815a642", - "01d17be5f7bc8fb23c9d8f840acd3ac7492e411a72d80d4777faae4aa2e6d1b3", - "f1d13c97d8d36a0f673ffa737760804714cd64e9dbb01518815fcb00c96a87af", - "f25581ae5c4712bbe465e736debc500749a44ff715362c28a7ece3ac96f755ad", - "d50f1b843a1ee6542403b606e2dd15c4799ad695f4a401d12db8ae357f07bd5d", - "12ede7d0ec68b1f626691033a09b5122a43fe7e173597de8f1a61aa4d15ed1c1", - "6eb080b40b91fa0ee674cad3917ca52b0e5209eb3c6fd152c4f8a39e99ee5688", - "cb5b9e38e6833de9295185d80cd6114c1bd7062178f566d8a2625b8bc448d8ca", - "965527c4f85c55ec25ad98c21c6cf6ee22f2303d9cf3eda7d2c41923acc97717", - "8fff37a52445674329232591fae27fb5ceae9ce92c55b04e91aaca5a4bfebd48", - "86614368b50d375b1a0ed3b12ffc08e1642acfd52ce10fc94411799c1628cf9e", - "c2b2aa7ff485bb138daec8da960ae65f47b6a2186d166197369e91997ad64e66", - "17801d509719cb283db84b049747a7d7b28634a388d629e3b00f31a63615072d", - "da2c8177729a1cd295ee6d95c4c92260da21bf5dc965d4bdb296ff3b38efd965", - "058e34ea5eb363f2a173c1ecc40448272259b978866139674eecd123b3ff9432", - "b5a26c320e31215868f32f23dce49be09fa0eee6e8d922a29f1990783ffe9e02", - "55db899ab8ed958167ae7cbd145dd68979e0c5c3534b0708011ec4c3ce29a1e1", - "f886d1d137e4de5ca5b56c1e1e8bb295f6bd6f2bad6d183f13c43e40b1a0970e", - "6ccbe2cc171d4236f86a41a5ec8ae2659ab24ec076fce1c48b0eb6f424bca8b8", - "398602d97276deda1cbf5ee1bf410e9fa3c40666e8e146eabd01c45a16b92bc4", - "1a2efe6d0965d0c9f05730a81ebaca100b48bf6734ff2032bc8e6b68893fd656", - "f79ff8f9f8f53d4731e9f9256a7113252e63c778c6d3d044478d73ce9ebcf594", - "6833efa58dff0beddc9d2e7867e16470bcece19aff27d0ddf6f716a5fe1e5031", - "771c981a0732206987361352251612a9a3cf3b95bedee266e8771181f6b571d3", - "11f953d8070ab5fe02911a0abeed56ef50c81b99b8a0581fd23d846194b28d16", - "cbb46f4ad22094bd10d932d0443397fbac4e87993e3ae9f28fa329d29cae0f5d", - "5b6711808d7507e61a99d0a97bb912233f61a621e7c8de68c971376614d46527", - "2bca79bc87383ecfd4fbdc640154de326bde193243899dad45c1b90a32278aaf", - "0f090c2e5c28749dc2f10878f1a20954feb908cf6bb4556df1ee3c32bf5e8ed5", - "a4c08af33e4dc3887e4308e19c0ea2e6ce82fef41e2f7c83c640ce6e205c1892", - "da887ac31fac375b146b989baf070cc388945a2015e0f9ea5ef58d0d823f9361", - "c9e6e2d6a23034757a50054e0ceb983d5bf6e2acd4022d1b5c2b90b39e175c89", - "231920d4dda1c6232235d56ce85b00b8953f243b35f82087a60554a11da2a035", - "4cb694dcd4d7c6f888f864b15aff3c02ad7979797f0e5a9d3d9abc2055634d8e", - "6b10a4fe2f756f9a0ebdfac6277999d9e4b92fa746c60765c3c7afbe65204843", - "0810ad6a658a5c3f0aa33242954eb34f5c05aa241eed6116ed977bb5d3736937", - "089660e620477b4ed27c7c462a591576722729ba286d57b381a6e506bf56538d", - "160dc785d27f9815489b83980cfabf1e89ae645247edda984de8a51bce53493d", - "ce0f084a8021624a45bd6e194df8f73fe34144fd770643fb41dbf1272ad33924", - "ae87cab1a5ddc2c6440a2aeeec20b2c88d0cf0f7927b8b601928d959173a8e7f", - "c3c84d359425a8ec2f24f9524f68635c385343497d767613e4d4b571687b7c8a", - "5b378ab3a15000d39412cf9167a7dc89811344f0654e74ca43490620e050fe93", - "24dc7cde41535aae18f3d2eac583d87640391755b1fae6b65ef31ec1e4657e14", - "496a542bbde0741bb801407a44a3766410fe3c1b4cdffb0f01d564f558736850", - "b539136c6e3860859d2e8d2b6c5d2286c147acf5b75143ebcbebf784222e5afe", - "ddfdfaaaa709c3d6f758ef64af37839c7cf0113e0d6b9ea4b1db17968399c2fd", - "64a9a6ebbff49b1806091438bf80cea564169ddef098ac8bd69d8337fc2ecb90", - "486713ea909a3d7d6895d0a7e8d1215ab67a4f263a7b88fbfad10a269405495e", - "71932119e1bad21cb588ac0f40b2f9dbc750b88e5278f3a0b0f83cb6f5fdf16d", - "74850d8df1f38b5e0ca2a3f32521b87b3766b5dee15f701323fc3165994d853b", - "dcb7efed06e983ae4dfea7d950e57ad94c73c6f622e807d47a58fd9dfc997b56", - "5593b46bf65b5560fb0ff1ded6b9fd11992bb0a1a42b3676391b49f45c846ae5", - "4847941243edd1802444ef3f2b208053852ae319e2cadca6c36746c2ae9f8dff", - "ad44fdfcc33ca9764595e33c7d1d78fb7a7be8ff58a8566db50baa4298e6114c", - "a9b4cf6e4ca31553cac9b5a42ebd52e1b4a84b61c9bb5b0bb024baca602c7a0a", - "30c21f9f571c80ce60ceff267e336c03a8b92896af02be4a1d6c9fd7c035732b", - "33a24af507b34978e6076daea54fa690e22d1579cc30efc4a4022c71e6114169", - "d7205df2b8f02eedbc86f7d8b44f591145cca1ca67b68b2dfba2063983ce07e8", - "894799814c0897b57d661a8ad91c17e27abff81a38f2538fb8bc923e285ab400", - "0c0d4964540d566c8a122168339c503ee2765f55edd16ab0eddab3d63256629b", - "f4991d9b7b7ace0e7408a5a3edd0cf77cf126326625898e4fcde6738914c84b3", - "c5b768662b76eaeaa377e0216733b13c6f5fcd49afed8a40bfbb8b4069842632", - "797e4a4c748c8515a99a7c2b877ea6789f74447cb20b65270758faef0800b9ba", - "f8c77a018643a416dc8f9777e6611abbd0fa0b25517e53cf7105b0cb691b2e3e", - "fbe7d0a5a74bf3275aac8da7bfb5df177aee81ecd4faffaec7b78653e8af1e6c", - "5a728c2417cde46283985edf712f18545a2d9e76ee59150e7674b41fcae3f30d", - "f159d8f1108bbd98c66b6aa9d380acaa1482cd8792dfe3aa4897c2a702829fc0", - "6dbb23e2bfefa009268abbeb74927694ce96c324302bacc669dd6b76a63bbb07", - "492fd7713d03cfec60d0af31ab94808c18a1fffbae5c33db567c15517614470a", - "639556c10ec80938c80164fa0bf6e9847e4b23bf8845f8d4771f326045ff5850", - "c8c6f671a21e4f762ff63388d2e3b696de0f60fc0312b9b464f374575bbd3a8d", - "ab62927609e60bbb0533122484914f2462a25eefa72ecf7a2f25502e4c12f4f0", - "7391ec1a80b1a3a2e76fec47212345139eca7a17f08d8b7668e34ef076be8cab", - "c19b7757698d47b6747a970a293c7a67bbfc6e24944c0f2c964b0c1c680d9368", - "651e0ed8929fca5d9685b9e98c7a81c5059dcc4cfbe6911f23dbd3c062c3d961", - "28468c3bd814e2e5d4b0f5350630616b144f4d504bae561808a9bb38e48244a2", - "aa3f385ca36c5f56b87d6710e69e042cb1be6dcc762ccea2c860957368c29672", - "8ef0d70aab1bc1ed02abd64f4126d24455cf9b99b5ccf25de4ff3529e028c9e5", - "93c1edacc8260f29b4fa71843d77b123d996161a2951b8eb0dc6fd8ee28d6073", - "36bf78939a374ec77f271977cf401311fa0ed5f15acc768ace7e992daa282291", - "cd41e792c4b1a5c6635ea74efad7147091ccd54f1988b0adec2394782b75e22c", - "9b2650fb8bcfb8757e72752a1ffa26b3a94aed67ec480913579ae1fe48014c60", - "3c6cf6e15565d0dc3aabbd8d2a9669a282a1a6ae02f7245502cc7c4f8ad61713", - "901111f234e31f190f713631f3233ef5e1ccbbde187056ef90a7116e1d0a4877", - "3bcb6bc841109b8d3cb4a131ef2948716ca487457a78efe79e2ea8567c49a00a", - "fc402f76b62fb8b1525aad6dc53a17b021ef10c9d40dff98588700475b3d106b", - "62b684f68500fcaa12ab6f236bd5ec8f0181a380c699e1e36bb45570be15b939", - "a80059d0750b37a956efddd32bd215a294a671972a1eb24f6449ee707b57c45c", - "664756a57169029cc11c53e2e070e9c825a27513c60d423556a6fa3f59a3a884", - "ed0d26bd651c211a8804715e6e353077a8909efe2cfe965b281f4120ed27ebae", - "61069c53b7fe1c81743d3c8b4278ec348942e7e28b526f6fb6fba9bcead3fa23", - "e9bed15e30694444a1fffc54e9fa6637e14cc9e5b5439a599d38071089bc32da", - "cfd4c089bde9d0b07e16365a592b2cc30bf3b4820413df7f2209b0d73f90c292", - "4d797bed770b1c63e3a318c02e465ae3a095a4e9e4caf278ec1d72913cabad5c", - "ff65ed393feeef79b9f125106869e5acedf9df3579fa241a2d5fd6f0fe3af25b", - "9fbddfcbe6fbb6cdc095e74dc3f284199d5de61534667bdf8d327d59cb4963ef", - "dabdaae7e46f3de3f909ec9d3197ee6e94744e84e6e8f251dea921326e23ea3a", - "f89077c8ae7216de6c0b89535a2b9be393d2e84a31c21cd7e8f831273b0cacf3", - "778ed0807f6bb5ceaee91e18d29871aa991ce588d691f3bf46c4e42c0d12c1c0", - "2dfeb36cbcc32f75dd21459797b5cabc1487bb12968e437fc5e2d41bb945d22d", - "1ac5f4d9f8d886406e6a09d5d4d9c8ac366aed0aafefc0c41836d645b7ca74e0", - "c0d219759ffa7838229a25630992a8222e6de163d18bbcc453599513fc72063b", - "a6839b19cd92db7f7c35ebc1afeb1f75adc1e99f8778b276a13ccc39e89f07e0", - "b8de44367079be90676b1fb4356a04ac82e64c85228cd4dcd946127bc2df8160", - "1e70af5f44acea02399db07229b7c9fdbda09ccdc9587dada0a4a9b124446a80", - "a5c3b094c9bd04980ca8fbe957e039549f5dbef957100f0875cdf3dff5b8c282", - "fe411134031654a713187ffc7ad75601948db1209fcbb5cce9a8a1f4956a1d45", - "9b156631b16c2466c9287a34911c3a5d611ba05ebf0a3f16ecf08b98755959a2", - "84c45d5a1cca71971fd1b13c0b81e4bfa30c7263f4a929793207e5432f69bf24", - "169d89bc030ffe1ab799c8c4f7137a3fe37e0c2424ed63ebe88476fabde9eab5", - "dab5d20886701e4a9a7da87fbbaf4fb447001edf0b9588c1e8a7af59b727ce66", - "23eb3579af3836a4049ecd7f68a5bf34e20435b7c25867aba83813b473040997", - "0e4abd61fe6b6cfbcdbcb1de584d9cf2a3656a8685ef79d10eabb015b11f9117", - "e5e821d91134576753a06daa362d830f3d1500979b730d9f16468575b19c0d7e", - "b406d9fac9dee018caf70b61924d5a621358b75de58f1c99a948ad327a1eb683", - "487f632ee67115cf70b9f19e6883367dd7553e4f9f4e0124e3cc0b6be091f7b8", - "5d2b9340cd6a948222b28a7b1295a349aee4e067f5a8ddc8d0175e92cac508f0", - "b0c9166220935eaf5d731ac4a744cd955c0513d155f99fc2a5bb440ca1d3301f", - "481a7442b658853e93a7333c8b075009c0448d126b0f035651cc88a3dbcc966a", - "070d2de8fc34e55453e75799a8499f1203a2b8dd7ba509c45e64d6772264ad4e", - "59219f664e6bff5a66e0077a1e07df534c2e473df6734b0452a938321d42d717", - "a663f764538d7548e181a6844d0a8beff3ca1075cf3e4d58dd1e8993d6e74055", - "5ddcb43d204007ae85ee6de13d276ccb74cdb02d83a2a4b3b0f16de3906fc126", - "e62bbb689c8c4695a7f76da63c3d49102ba16f77faf07c199be50bb7981a45c3", - "5620f595119023d1878970d073a806f74b570bd232ec5e3c0bea5090757d341c", - "e92c0264c09d1515d24c7defeb0e9d444d6b89786860f5e367c4f45e7ce2f399", - "fa7484e7fcddd0ac9fdc60f1b088a2d3d696348ebd16f61ec4739d58937286f1", - "9bdafed0281d8f5a0e099f30d7b69e71662fdca45978def4a98a46e070ecde09", - "afce434863527b037b63cc167c8b571437cf14df5e8738dcabe6eef03c096427", - "bb260e2a32492e2e87f6dad7e9321bb9f40ebd063587e6708f01597720a658ec", - "2abc25fd8a07ea5766fb90106a73d106f481df771d30d9116a4529f33a19e3fd", - "f949a2a3bb7d2731ccd2ee31df7b39d59c8ddae279afb7aa2b7cd5c0e9a3adae", - "52c1944f1ae4799ce88a39b84ecc28e3448f854cb5698ab07ae6b473a44bdfa1", - "f72bbb298a2483c4236754c227316769160641b0bf1b39f167e811a0bdb14e96", - "fad1262164656523c98fcd8a994c9454545bd8682a5793398dd4c40fd543cd86", - "15be14e084b426c89d13571b4dfe6d6f492e6ab0863664dd432c53ab5bbf8784", - "08ba3b9eb592dc21c805e6c04bd433643475245a82f6112cbfbdcba2e063ee2a", - "ac4e31c784d3642453f2f6dbfdb140b84f99aa0a912ebb903c1e6e027bab6e9b", - "b3430546b859f2585a65556cc23bf29ab2e33a9c9bd023e3922773afee15f802", - "9f07561c331e22a6a34fe542aab43e1b39386d82eb45ce994e36c25891b2bbfa", - "e46ddd167e6a378ee0c7072c699ea6958c69ad889df2b164eebc344ea7dc3544", - "94900b46cdc6ce3727cbb0b8c26b7ea87d35c1d251a01812f82ed8caecfe0738", - "450204df4dedddd20553ee279e2aa5269c651e9af9b09af29894bfa30fd33573", - "1f8722015db1034dd448079534e6bee6211efb595681d995bdb83fadca123eb0", - "f1205ab546b26570344ed9360f6f54c5e8471fc471f631ac096ab969d43924e8", - "9c5811d517626c5b526c723d4231661fddd466ba34d6825ab009dc8cb519a952", - "ae26ceab4ebdb7cd08c64f35fd5b004f784b027e3e792f3f059b7ef3f41241a1", - "19cb94c572b1ce35e49d92f35c1b9682c6eef88e5093060671fbb2ca905a8835", - "45d449f95bfc9080e260fef5ab62907453b39b796042d935daf7ee293ada4236", - "58c054d1daf84554e7c98c52e42c0e3571715e2c36a14c54988d35ca9a4455f0", - "7f4d34cd4e28c2b99a2c55dddb138b31368ecbbe698613404e59bfae6639c766", - "edb655fe7f5cefbe82575cb1216fdd90ce7d465b55f4e65a4a1950e88de3e442", - "3ef891f4fff5da11a40eae0754ef5d7d04f1336e7ef3a637809d515aa8726d58", - "cf28259ab268d95ea32d7a8b0b1638d07031d4186b5b31fa71afe05dc4d26b6c", - "31567ec7cbe1b697bf5171f32d8ba4eb29adbf022352d1088710b9631d346073", - "3a145dd9a2e2cd499843a80e954f88b4f1d7c5edf7c1f3cb137414f24de2afb8", - "50debe8b29bdf6391b5cbb4080f449132a48ca0cab2f1165934bb6d683013672", - "fa0c3235531636e70f1c43fc60f697ec03181eab879b70e1bebbde78665c7ea4", - "80d1f0c98dfd4cbd8c69e28b0c392877d044414fee2689aee261587ee342458d", - "d9b9555a868cb29f107d5c01427399735a72d98453e9472aaf24f6739caeb90c", - "97426f58b5c7cd06a6360f32dd57b414e77db5ba515947fc3f08c85e35a97bbc", - "a73df4951467f31423c2bfba9ef00a5893843a9bff219613b80e0ce5f422eb19", - "45f5df70c213c54fbd61ff2b4359ffcb61e3bcda118e6d6f50cf8efa8456c760", - "505e0adfa321ee7c22b9f8f2e3fb5768d1797617f439c911548c0bafc23eaf19", - "bb350e704dee68a32bcfed5a01de191ff4a8d1f5ab218eadc49d1c497c547d2e", - "03ebb6bda262b8255b356e3af5d95b581b5035b3ce2ccbd7e6259473adebfea8", - "ad4cfe6a38092ccf932b0076cd55945e96afaf004cd1d9998d64d6d0e79943d3", - "b9bf5a347b6cb46a39c9aae3df866e64693dd3724c26137459e2dc84768bf8e2", - "f2087b2cd684b08c5939917db7ed627c5c3a4aba493aaf3e30d34c9534803335", - "6c36774563ff1590fe4d9d78960d9726faa55cf75a5ee97da0c50bef73b42367", - "50b310cb4a6f8c8e849fb21d2aea5b844ef08f205ac4379f5a357f58e0cc09ed", - "6f9d0f83b32d5b343c06da26de6bfae20cfbcabd6b3b9fa9d89bd68fe20be6e0", - "416005772bbc4a905aa356b6f339d583b30b9f7eab95c41f769ffe38cb7eb420", - "9df8951f99cf808ff10498b2217a77aaa2525e01dc6af9e78e9b0e23ec195a2f", - "bd75afe57af440642e4bb045643b6db600a352c5d0d7107cd78b4e467cb4e927", - "3a2af3e027373a3d5815df1d3ba85574643ad3eb7ddc57668274270e5937803e", - "42839184f7446f2551168ef97928cdaf6c742123d58e53627dbd2ca2f78b986b", - "d86aa9681cb46bf8bc61c5d579556b87bda87536dbb524108f3ebb80719c372f", - "f9f24f32e370896db49ef6de93d687c548b67cb9a5e08b97ab50452230cec333", - "c364e35d74a720fb996aa0ed0cc809f946d9570d0453bb67743e1e7ddd8a1bfe", - "fb12bece1744d71c63289aa844ccd9bf5e78ff60b10d8bb8dacd0483a94945e5", - "709ce8576fbb92540cc8664540fc90156626ada9a5149a1f08e2923d34ced18f", - "0f5aa800e9315934e715e09d6d39b51a087f70ad784bedeed8d7c1676b21b59c", - "1db2b40122820c53c0472043a5c9076b8c7f6332dc44de5741300d3fb4af243b", - "ddd4c501127f8d1ec48e4b507e01731bee508f751221622be188a31ea460ccaf", - "04ac02b5aedb6d0ae2f75bc0deb3282a5901eb6e4209c78ef6de4f525d350d93", - "abbd49338b34d277f3cfe335b1d05fa8f545cc0a4456f7a9661d703b5915a449", - "aa414f5239e4d09e2842326fedd338e3ce44e022d0371c9f8c1136bcaef86cd9", - "d8b91170b9f899cce0b25128aec65014809ec543d385a1d77ba1417f96c091e5", - "e9d897f95845c7760b6108bb46034d40b7fca3f51e56b1b9224d041f45d8680f", - "8a69ab2b0e2b731ac20b08b56e27a1a3c4c4478e8c912a8d4734f41948963e14", - "4d711e69f8507f9a40f808bef3f8f1de4f8fe666d89f5895cdf54ed6632dfc55", - "ccea3543271b59a71045fbe01d565aa8bd1004f6463f8f26f6ac595f5c5f1959", - "a82f9fc6be89e8f90fa008ba1797ddb6bdbf217cc9ad2308ce06df9a866c211c", - "6c29ba3ad296617c8979c720abf70ce29086d114377a3625eef3d0bba8244ced", - "5999089ec28133c12fdca6f340e85dd5c870c7353385e6be55c03acc60284071", - "1b9ff11eafa559e997226a4749dba93c5586e3a5375ebe64525bdaac89feb81b", - "462fee9ef794a05b1e0c0ff03e4c9e6dbe019ee68fa204d8bb855946e88ffe98", - "ddd0f075980184a22dd811aa017b8a4a3055ca18324a8453f77304099932727e", - "bd710e6b56f49562ae98f3f96384edf92572d60266b9b6562a8ab533440f29aa", - "866d745b1b0ac79c549cfd8df19d5735afdc82e47addf8271ce12aaa0555e9df", - "dfd0fb40f378a81631877bb1d108a0ffe8d1e69e0d2276f5cc5c4e778407febc", - "9faa3addedeab35d7c1f805409ed2c31a21398cfcfceb84cb19053a6db87bf87", - "3507c08b85b59cf073151c6827a1fa197a310d36e0c0cdce06615cf793fa6b54", - "ddce12b5fda8d905dd17fda0b15bc7145e056e428898f39cab25013ccf97170d", - "566ab929e733cb4fdd00121683352134f31122342b9d0e37051b984a263fb376", - "cdd0ce0452411d0035bf45d34d5a21852b670efd4cd4cc13907b2d278762d3a1", - "895ec45cd0085deccaa1ccdab71636ac5e07f4f8732851122fd0a10d7a851664", - "29a12961adf117e6ac58d2397ed09a63658a01376c4e96e0f4bac3dda6b1b398", - "b10957b3e5c4089bd17c70f6bc9dac63fb85a12432e3dd618b303d16b3fad22f", - "418f3ad220b8315151d8c14ac3a45947398ddf2bd777de5d46a4b0afb827ff11", - "5e323b083680eea0a21130b789526bfbbb3bb4b4ad81805d7aed9eb132244c4a", - "f94faa52180de937838cc8a1289217d18ff69c39d775f8da18334e5c948dc0da", - "281ac9f8ca88aaddadb766e590a46a9f7c8851c5a0d96f3332adabc31a454e76", - "a7c23c8c7e0b66f34fd5d8762c3cefd30de41fb534ef0235344e46fbb5628663", - "cdc891069bedb24bd20951932b15cfecee2ff7541631dc40143235235399fb2a", - "44e2e46b00ef6e04e2bc31b0c7f8f543081e699ce3334ca803b88db668f77b7f", - "573f0a1e89dee8c84da98ce6a2d7f1d99eecb2bc3f99393d43686501a76678d3", - "6ac3fe66439472782dcbdf25e2659f48198fe880d884b8a517ded689caf60c3e", - "3b05d16b9876c6667e5098787eb869b5d47479df3faa33e2f9fb9352c30b85e3", - "e224a5191db1d7f737a0bf77090183f59d9c22dd2e96be4282f5f681f33c9c27", - "08f1e7cd452a8f04c07beb347a456c5c8aa13f73cdcd0c51a08a4b1c5f5f77c5", - "110686864b388aa1a5d2f30425225475ff9ab09ccec98894016464e55661ca11", - "8941fde570245cf47d0bc8802b64f171c30bd74b8abe653af593042109db3bea", - "e83021020de6321f2e61fe6c3bf0a2183f1dc50e761d25b47fca94634058de8d", - "7f9b8fa577151d2f09d8b487db07fd98d849fc8dc7a036b61dc034930389b710", - "b1c59cc25a62164a8705312647c72ffa04ec4715ba0d31f32dd3a7931b8e36ac", - "bc2f4659abf3b58fe8ecc2990ebfac792c903d82adabb847bdcd3897bdc2bd59", - "75aef10f6e0885a277362b505c26360c12f6f6b6618aacd95d00c2bd973dc1be", - "d2b17d1f4d873c6df1095ed601640579a6333bbab6f8b9c53f79252f18143838", - "141c7019d992df75018fdf8649709c244da3c742c71e03e1ab16ea92ce32bf6c", - "c5cda9ef4b7879c278b3157c566afc2e211a00267e04d42c4fc8879f9382e916", - "f7829cee90eb20273fc6dce57903080aadd7ae12b3734beec1dd4a4a4978b621", - "2786237e201dc9645253cd78caf8de27551bb7295fd456418097d72c1a07e9f3", - "d4e2d37b2cec0313200e78a0bb6dcd67dd8d3128107773e74cec06c87169d105", - "220853d2a4103b5307623fada72d1eb857e61c3db8436e688e416b916c885662", - "8ac81a77f3bf7922155dd29d3f025c96cdf88caafc0e799862e4c612d294e00d", - "23c9667b68d55c636135002ccae205d41c5aad853e0ee2417e1d7cebeb0caa3e", - "3cbd8dfade3d18e92b843436abe2031a48a9e75411e686fecb5e5fb266fb1634", - "a731f2ecc72fa706031246d5e6ff57c40958a46358b8db23bd5d14461fdf736f", - "510ce395a241b5a3c61c7b91c662868e77dc2ebac2b1159e60adaea8dc7a7037", - "4dc77d6cbbe399154c55c6a19bc0404acde21e76f1a828bf1ef785ce04882aad", - "2163faa6290a4ee2c2a4878a66b58597e518a096c65268ea8226888580f06e6d", - "a76922f9ff2acb30fb13e120939c077cd43f8e79c6e2542c0ced6f05219aedac", - "1d48632150be0ff8ba994001fcada29301218319cf2f7c6570fe7f65c9ddb889", - "b8fb105535471f39082c529279ca5afbbba5653fac10091145db9004cc813bfe", - "d2f209410b2487ddbdc22c1c309dca323db7affe1e57d9676c60b6c546ae7970", - "27673e1f40f9f82c6b9e3196c9cc1166031236a2a42b0ad96a7d0e4e66db09bc", - "c085b41911da1fa5314fb380bc875f20931721c0d2661a254b7a0fb00e3555ca", - "eccb753bbc35cdc757193e6d25e2bac2332fe965e460b37dfe2862bbdb14f461", - "bf5b14a99449496510bb5ab97fe5bada74c6412a675142cfd9a09ab14a93962f", - "3603e07fc6da675a3bb04974e833aa9c627d88ad86158527145002f1f3b715e6", - "ae6efe8de15e3a5af2588c1119b8535b785533eb74002ec8086a6f58c1329019", - "29b8385720e964fa50b23bde4534a2cb30612fb0d3e9313edc549810e0d40b06", - "412de6a2c225f034750353300aa020b3e79e6140cf556674604dd387921aa677", - "a83b3db35e110254e8c735252803c593caf947d45194a646498f238e53221013", - "ce79e5e6e2aebb8b12c4d491e448b22c4242940dbdff5f04419d9f851d6ea4de", - "e44acdfdf8b75ffb5710882c42d00b49f6ab195a5df87f35af404fc78aa66dc2", - "577af3ea6512bdf192e91dd01c61e6a11ccf93bd09ae413accecdaf796dad332", - "eb468122eaef35906f3c44f3b530e5c8494208acc69925b3ad9849c628eb4584", - "75012c1e78ec0930417f782adedb17b0b88c9ea00049a89661291de9758571a2", - "a1179188d7b04e113d7360df44f0dd895404439c6c1b7b8c1e2fbdbf897c5902", - "c584c132d9b5d00dc927f66e1fcefdb085fb3b3515de5ce310d2cb9b6fe9acf6", - "8e7fbfacb45e738b9aa9ade004361dff5e700283256c7ef14ecfea804128ed31", - "2a3260a2e69f2daf7e02ec04b92f52baa47a9bdcb5b2c3c2fb98d0dd7a17be88", - "ee6faee3202027ee24f299a719f524562d38b0320ea1deee256c8ce28a9d7a31", - "bc8220cea7e2b55d73ced068affeb1f20ec4b0fed9db852417677360d7c3a4a3", - "04763a6111adb53e1f1ce58bf557e1b51b635d41be03164266cc99bbe6683f4e", - "e410a57bdbd619467e4cbbdf273220a78c545d4c96355af9549d4db4b6371dd2", - "f0134ac2c2f12f4761b12c27b0d7f81b7bcfc613153d24d020429cc01b86a7e7", - "c21506f9766dde84edc976d7d30190435da15d7d9510cf07609a0db145486388", - "cca91ccffd8aea58057119a8be4245a2a97eeace5c7b45733fe0a85e1bc05b62", - "cb7eccae7fe5175eb5fb5c19f128de7a10bb72d7eba6183dca9099d42831ea11", - "19d3ac8bf3eab42bd859d249c53c040384610341abb6802aa1e8f0ab3fbf3016", - "b072411ee71ad826173908a85a74c83caef38ef750c6eb7040b49759ddd16b21", - "9530936de236fb8ab7925b954b0f8e37fb5ef5ddd644db70591b664e0b3f888c", - "bf951fbf2dbb327837ef45bd25d9bb495329652bc71665d0e050e041bf708fc3", - "dbfc25e4e5e5cc83470c7d23a4a82de2aed29f3acd52a90808b3ad62fdcb5ce2", - "fbe2dd26e87e06d09413dd11258412bc04ee3f9d4be23428a50fed8211354dbc", - "5fa3001f867aee5e1213010f97979fe508d1a08b53d688ffadef0e711e5ca715", - "a2dd7c29e8b04ab3c0775ffc8f73005d98e1b13359c7441618f597d87ff78f0d", - "da8e6dc764a477486f254d0a6995375ebed4dad70e8f045340d907bfd9c7790e", - "6932ae2c3898c73671f85ceb610aa71daba93b8d6979a8c0f799eafce0c7324d", - "87426c8630869989daf34b61fc7676fd86ae3d9c7e4c889fefad8023fc8259b2", - "468f12642da7067c8842f07505fb0772963d78b31910b7dbd812878a4fbc424b", - "8d53c2796b20ef387b3d377d056ba003bac6d467a43228aa0bdf3e8eb89a65aa", - "6779b85b564b05f5b4936d964325be95663d76d99afdcf927927b2f264c510d2", - "2baf7d8f4313e70e2f5aa1c33e2d56d89580d128f723a0e715ba1a54843a67d8", - "db6d773ea0f68a64c1e2da208eb5a33d3078d4ee9220ec70ab94f9a67efa8698", - "3c0f9b7dc06ef3a220e3235b95db81c6d62ed35df9af682d127239ac8de12a1c", - "507b3102946f4b81144c6b8c1d3289d81873c45442ffe42db17035fa84f06c3e", - "cad62b081b604092321fa9b24272e3f99222c460ad5abf796600e1244bb9c32f", - "3c7ced4b1b76b861ce6c9e1a2be1b0f937e102f42e8261f19f5c7aa0912a986c", - "696031f94fa46ba93c539a1ea2f3ca0046f93d505dda43a571b727e0f7269d6d", - "e53e4431f0048c562f6eabb3d6662886074df5af8f54e3b4ff3cb18d8bc31ea3", - "ccf8b2ee23a544559aec2790571005e4e72c4cfc66a35ab6b3995a96b52942ee", - "a018e0f59f217403dcd6193fa233d632acb9858ac0dbbd14b3a3b7263820aca3", - "2c87f37bf1f2b4dbb233112d2588ff85ec377a713ce8dd7eac7755500ee35ea1", - "963d28baa3aba780f98c8ce01e68da77c9afd7562432b334557daf393f865670", - "e5bbb6efd51857f6128bbba80247ceaaaa5e7abbae90b2fb05d6678ae164f4f9", - "875432b9ce9595cc62406389067a755b1f1e50a50dcd334f3911727a0bfce5ea", - "2e77771ca436920e507a13bd97353310c5fbaccb6e1d8a2296dd94f19557d19c", - "c6d8406676a60c13b44e130bd3b2dc5d0fd23a1d952b25d6f7e96c6299dbee2b", - "df536d2794d4fba0beb5f51dca0d124b6357d030ff215b9c2abbe6e0b6b3cc8c", - "38f834b462510921053ea1940903fcabe82b9cbc2e1fbe2b975683d6c92744c3", - "f15664a0d990d3b2bcc49ef8d513c7d5345019a597840c86a28e2a73aa9ec00b", - "763cb483d53be30abd5ccee8ed7fdfbef14bb648e6b141145688083db4b827b1", - "fec1ce610d291cffe3f8f69a38ba883b79c23017e56cdae247c1a5c8db3eb45e", - "094e6858128a72e68ea5f9a94ce868317d7a5454fbe42a0cf599619ea8886b3e", - "80106dec195bb1a021e7bac17bc41ce91a07898d3ea0e8cf42c798ecb06eaef5", - "9f6b425e36d39fcad8671173ec0a35bc227a19f703a380320cf5b947cf76ff06", - "8a681c26588518f8cf8dcdad1db838b1fb46140dab6675b75c6a6362dd737723", - "1c9958274dc39281f2233e62a838ab4f3cb90c7d68bf1299fd2b8dcbb2c904ca", - "6ffb0345e406715995e416a80b9de7e5d583ffe2ebf94a4e5d3450838fc95d67", - "e75fd503a5be33990a116d33ad31bd2ae1b5c97fdd6047ceaf6dc8e6126f41c2", - "9a4bf388f8b1a7ddad89b03581a2d03c08dc5dc801c61c0669e3f7908146c71a", - "0895eb2daf0820b8ffa673788ed64e581c8da9e246f66df5b94e724320cc3ba9", - "88609215b15e7d8d95a2660958a3fa0f80454936ead2615045665da4cc5b38da", - "a1bab7337cb907db5b750a08b6e34df4142923d18d97d1865509895a1a623db8", - "580d81d404a3159e523c98789ae07a252318b42adc3cb9dc8af71088a11717ff", - "a69099c01d0673444827d2f7f37615a1f674ec7d435501701b400c617e191ce7", - "b731c2354cdf03daa2209596dfc0c804e5393219efda56eec3203bfc7d9af630", - "c8e85c2ee6110fcfe1fe338a1376bfeef24e6640e2db4baf5e2920016dd6db39", - "7c25c6161078d115791b6987e58237afd57669f6872a2ff1a8ca830358d5cc0e", - "81b41401a8fc1ea48d693cb0fef73291d0fad846b88c15f4cc1305d37829f277", - "f118fc34233548cc094d6c287893007e2f56850957b5c6c45ee83502583c7395", - "8d41cba7351bc1960ffb7afbaa61bf81254260bd7ab7273138810745b20a9e61", - "5ee1d457004bae5a39ea82446faeff81dc3d1725f7cb2959a791d23f38916b4b", - "436894c4f6750610f2879567b5b6ec1c02593d700c2d4c35b98ab1a36187718e", - "f5723543c829e214f42610545ae28afde9cb6d21eebadff08eb11582a72b0a8d", - "ed7c954849dd97647cb80f8fcdc967407bd0ff8239bf3238afeeee90de49e032", - "1e9da0d755547821d7c0c604282aef723319769411ce9848b802707718df14f1", - "d96368da27641742db0e621b5a17b5e18dd40d8be03a25aad43883129ad5b278", - "3479727a686290e046b94c04560ea5c3877ca3218f02dc48e7c474423bb3ad1e", - "7ff2ebd360aa425830d99182f8e71ae1cc1db407bcea1915081496279105fd97", - "1bc73173f4957348cc073a354725074a36c1f5223eefa50f81725ad26b328b2f", - "72250b3b9f8547ef94de64d0d7323e7c02ad894c20b3b9a9d382658d885cfbf9", - "04795a98c49a483bb25d71514e11efe3027792e2d892f0be99c1365837821931", - "8be0b2cad452c0f4acb778dc316ce70f1a5b02a484d9841a1a0bd45c1e8291fa", - "dff6edf93a2e1099e3c2e333da42c602062d4e5cf42b90b77704f21454464996", - "9438f3e693d224851e0b877396a80110f3d0ff541cc77dee188754ff1d02f972", - "0cb4a93f6d263fdff5682c64a251d8811d37e098fb23865972f9ee9438d5b766", - "da418e9a08f20da31ac550e73d9eb075897ecc2c451061e20486e475ea947690", - "84e8e32b72842eee01a643141e48b6cc5a0760d0c957fd077859f9c7b8347bf2", - "ad43d36e7b92af22926715259f567b9981f2676a6bb253b740a8d58768801b2a", - "23e5b185f77ee5c994b7692efaf991e9194705f7df5450ea657fabd33cfa8617", - "0e756f8da32f4cea460b52839a34641aa6c0b8ea93137912f7ade8d5267c526b", - "4b71588f5455f5f52d220f36695145c9602b5f4b6ef404cc5068b1505b4d7db2", - "51bf503f327c902af6738f48f0dc2751da0df82b32dc1064b7090a12244f45be", - "5107022b6368f9eb54ded4254bda9e4a18c46c4a93203a570ada3ba01a07ca74", - "9cb36dd3df218e2948fd0aab6c620907793d0bbace034e002520a70badf4d844", - "442b6c292ce5d63cfef7c9d6000e0d562f2b3296a6ae6c921b1ba14186acf109", - "9e1df75c844cbf607d036080237f0edd341e8a2ab80c708de9d2199bfc73111c", - "5b9a7a88156150ecdabddef5a1ceb5086f5efdba5cc1ae3c3626b1694d8027ec", - "69b1ecd0c0528431cb04801075111fc7fa80ff8e40f5e0f95fe4729ad2b4b396", - "aae89f6baa1bc204be26b914e3967d6c3a8710e9630c0aa1600e4564ab3e9f0e", - "c3b5a37ddceb9f340eaaeb32c711259ff7e8794f8e5f4b4bb18c0e5f895ec1df", - "2c143d21d38e4ab2d46aa98d4008b099eec82db1dd221eb8e9f639b32fd2092d", - "e64c7c665ad738aa5b5c4b0c9efba90dbe37399640e235d212fa5e430f9e7877", - "003498b3b81d1aa92659c8b9b6f25557870ee05888f06fb369aa25855d263ef9", - "e01c18748d04bc27fc8ebc49ee0b97c3cfbd7cf333b4b3f78f396d80fd8c2be9", - "acf55a028316adacbc4d40e9a8f648acc0c0ee5652b6fc8df87d5a9a225d1662", - "c3e0e3d9e12203a71efa2acadc536e5a7e73e599c534d5c28585989ba302a413", - "fb2e779d414f8cb5ca505731d258c9a7043d5019d1764a9ce4fc2bbe6549a4c2", - "d9b7d8d98d68dd1594948243faabeebe8cbbb9da849dc7e26c1818f815164e32", - "17665819438dd99ddc48872f08b381d99ed97ab93fccc8316be0aabdc0f64a57", - "0fe54a8723f29459539ee6861598f98cc00d0e66e3ae2dfc885fcb1cd2c68ca6", - "2c2b3b74f33b3482b846e5a48149fb100b921892b90fbe74d46cadac183ee9b6", - "c9e2cd224d8d78caa11b3b3a34bcb90733e3cb4113b9c0820dc897a1057793b0", - "d868ad957478e930c7eca535db7ec9ab140e0a83072dca4317be6b19a483dbf4", - "7ae9be5f327cf7a5f12e5e90e764dbbe9a22d25352ceef507b308d4e667bd155", - "4abd107a83dfe28a76d7fc3183ed143745d988a16e95064de3f1bbb03006b01f", - "42a9cdfc2fb16ef2d13f7f750aa80639d5e5a585ed061984241b7cc4b5353d7d", - "0ff9a076dd80ae286e77b559295c90bed79dc9bb254dabd015512c3d7b293608", - "3961127e61ddd17f9d90c8e8240301fff10d46e9204f5aac33426e80afa6498a", - "554f28ab2e619ffb95b39e2edee619e3a40718c924a681e2fe4b8f3be82354cb", - "f7249d872251acb7b417151ad2fca8324932308738a407fd78da0c772497f5ef", - "2a7e14645a977a7c39185c4f01497bc4e186e17dd374693c59bf120c133a1d9f", - "3d7e4a8796b35b4af07add083a67f7b7effed5f43b08a0a9a7ddbe05684ca4c0", - "2496e114218b63f81f768d172c160d313e02662bb7d9fa3d43764a8c3c180a5d", - "2901e6ed7a8ac7111997b7c2aa1daaf48af3682a276440b4870b3552f41956a4", - "81b017740248344cef55cef5f8463dd9c9c1a10ddb5abeb5a66835c919eb7c26", - "f463aa9eaafc35d0944bfc8651227cbd5ace6d25fe8c662037931a2277b6476f", - "a954002cca659848380354d14cbded5b08f1caf189d858610de2dbaf40d2c3c1", - "c5f28d8f7f80e570fe1be4374b8b2900ff78e970100e32318afb7f095efd80d5", - "7ad63dea4e8b360a6904f76592e373af6dbe83ca8affc1b08b2d1839b7e06e9f", - "be11c30d8e6653435279dc112c4dc33a9ea040a0014f40bb7c96639c88d8cc3a", - "23834698ceed38cb2949f520035bf70bbec843d470b0b60bd732fcdd8ed6b1e3", - "d49ab627bcf688e3dc3080cf4af7b2e2d1e984d137801c84f7c4ef3b2c93df01", - "466b01f683516a6e9dac05fee1d56f84bdf7255caa274d3fd1f3291f32c2dd62", - "50a9da4e34df0e8a35f1e680be1c85851ff52a519fbff075307484bbd6b99b8d", - "70f46079607908c7415fb439570d6d3549f1486bb46a7eb0d25be338bb100cd9", - "e88402f6bdc12790320f00fa6d9773cd006c8f2d75ffee89e7203a0a38a5977e", - "0c8d0a0ed4ffb6870d837df77024dddad8666ab560e46bfede53d1e5406775ec", - "39ab9b77bc459c09bd99197b66baa32a749c80229b528e5906bd031323fd5b45", - "e79a48ca41d97351d55f6e05a4bf8df23ab22e942ad1a86c955d8bc5f81ed6ea", - "732540d3ec49918b756b8317bcfaebe7acdb4e9645a646825f1c595bae077b68", - "2038140d49842e8358199d72b9ec778c7cce9be54a0f68760f13a313f309c1e4", - "4754bf445b423850d31d93dfec07b4412137f906c4a05cbfa22acf4b117df134", - "69ebb5d94634b6b6dcdfa18527d22d3c65b47acc1dded48402347f7da4b0e2b9", - "9fec7252d9d8376ca78308c1b2367015b5cb0e4afd4c978b6fc5aaf2ab76b074", - "b1b76f31078bf3a2f86838eaefcef54a955d9059edeecc617c21f85d38819a86", - "a5a5202f0ac7482146493196bc9657bb941fb1d3d9b93fe3c68485155019ad4a", - "2c8eb816917610c566f4054bb2b3118f03b6d9a84ca94c025544f6fa4d790a90", - "ee3f26a7d34ff3bec9360d3045178ba7409b686e5eb6d723b8e01e73a86ebd58", - "78fcbba41ec9c76f7245cd4a014fea88ce051635c14397dcf6def0a0352811c2", - "a3821e774eb5012f5c8ba1741a40b431d5af9feaa64af99eed396e9d42c4674e", - "1909032ab16303475f367478224ae1ee03371f2b075febc2ff16baeeeb7f57e4", - "2c26e6518391bee7a944a60f31dbc503a2a69db746f663f8f93dabf332103fb9", - "4d921222cfa8d1f629cec2f3fccab3b4bc55aefa72a6658fb04fb1dc6317935b", - "1e85e1fa3eb8e3e66ec9cea5e7a4b080b0a67529c0f88e8ab91a24374b9495e0", - "4900fbd2bed4278d4b2e99c551b9173c37c5e706dc4db75f175593240a6092b3", - "a961c9870eda5c2a944bf2d52445e7b4e02edf81f26be0e96af4839c51adc62f", - "12c93dc73ae8ebfd2420e07d29dfc724c257b9b5cf933a513b58ecec10f6c533", - "cce66489c66b6a67f8c0f8bfc094d020e6c0d140c7f8257e1860f7312bdacead", - "687938a5624a91dd459d58573ac4725b98426adaf935c4956a0e015c0c0fa110", - "48921b69b063359ea623a90e952ab06c8352aeeb78d8719205d37fdec609bd54", - "47869b8b1fed6312e8c5c5dbb6c1ea6f151b665103d2ee5f64729e75f17631a5", - "c3df74e51d38138d229fde062d27d9f793acd0ff2aee0715dd0b9e71c6d6e388", - "040451a90322189b7a1627d9ec18e5925ded9fc46a478d04815de2f1e838781d", - "fd6e4af94643f4db518657eaaacc8a002da8eb5edfa9c4fa7700db24f866464b", - "bd050869af522f4b19b5c7a40d796cc9455b0221065b1115aa20b2a261d924e2", - "5d761214d8d5dbc388a558fca5ad92146db823aebf6e464b933061acb0704944", - "c3ef0bd30b37a00898bbfaf060dc0dbf1616db0ede3ca781681f2ae837202940", - "d711b4fa80e895cc8670d4ec06790911462a94ae48150781d6c6d445b68b877c", - "a5e9b0fe4138c380cce2a5df5fa2d9173d4243d612ce5b4c378fa976c8e7fd0b", - "9569109efb85980bd1678f745f7cc1fc8eb15efb97d2a939606360568ac50615", - "d4a8a12cb5c67a94da2d4dba6ca0e134623817d125fc3884b9a3e0971bedffc0", - "b4dff46b9a777d9d7b2d125ac08211035d4c2e99a018920bb6ef8407073ebf45", - "c7a35a0d914eb9bb0d368d760d5b5121515746c653364da1b5b00667d23402ba", - "1d0e8050c8f2a5a3a8016d7fc467c63b0ef7b029823dd6f1331fd7646eb30d40", - "593b65a606d89fc1ca3faace0a24c46a2408e4b92b247deab8b36c7a89566217", - "251b23f76b92311d70d00790c2cfc4830fdfb2717faa8abec69b1a57c19d0e43", - "3947e59db0c71af51ca4ef4364857ddd3a8ab35983caa323b2cfc3b41a8539ad", - "3bda30dc584e3456066ae3a176e77f3eb29ab7496babf31b864bfb05418fb03e", - "4eb46b4604401166db79d86d2ba8e601d97862599d62182c80f733cebac3be51", - "a56fecc4be1a65c1981468f9bfe420da35529df9849b59b0260876e054a4f889", - "f1362876f4157e4762d17332b9733785e000e694d69f368c6e9aa6f161b1fe9e", - "a952d0f8f446d6b0c80178a319b700ac2aa657cd1dfa28c68e3c718ef73482d5", - "dd701ee68851390e25798ae2d4d5df26af513923b3e01c40932df193e58e502c", - "866cec5ba5c87cafa19aa2c249c7f89c51e7b210329d88ad9a3ed807803dc36c", - "e25ee85d96df976ccb3b56b642ec841f9ce1cb6c6a15d0c8ce2ffd3e94fd4ae1", - "767dcd04f7e4bf38be62aba540159379f1cc9c39e96f8a7e82999356bebf8fb9", - "b290ef59c0e899d31a4d16088a92afd673b50718d201a4ec2d3ffe368f70309e", - "c8b960c08685d818cb54588f258322584b678d8dc94d9e93436888e53b5cd310", - "14a3a6b575376f5407badef0e6abff3fea0eef84d1995eb6c8978d5b06b745a9", - "5435f9fa13f60faacd27adc517c7c6aa94a444267bb5054e9a00ba3ad5f8976c", - "3d741fcb8773a450e20d087c607aabe6d1950e0565b7c3c33de4db6dac323682", - "2ca1624ec7c11e0df47df30c1ac1771b62dc1dd6266f72e0c4395cca90f668d4", - "2136cc12de99b30204f9623957cd8fb84ff8e652694ad65fcba7e1fea43735e9", - "762ef91696ccd8b1d97a8db5b7ea7b0661da1aed9eb62db09bfc5b882fab5788", - "9384e4138c786437ff9604aa7d1aaf11a45e99296b87ce3304e136c6d2496cbb", - "ffc13d895b45baef7855eab71b2167125fca71c699a56a197d031c28004aa96e", - "46a751b3bca7b7a5833bbda8661208ac11336a3cb05ec495411d572a0ea6192c", - "7f787b5b90217fba7c724213d1a0763405f8f2289efa8d9869b1eb4c1a6364a6", - "9a5cb38cfc11977816e4cbd2520575e31db345ebad20a163ea3d5e201af2ca0f", - "212bc1a7d96ce308d86540afaed4e10acd2ecd8e2f40cd708f07578e06ff45ee", - "771f83836ae5a7e44d8ff7861117c49d6ee87e1790b64d3ae9487c070bafa5e4", - "57a8e733830a676f17763cb525d0b760a7af9e1250474d63cca7b24b5c9ed83d", - "439be88fafc0f42b406f74df6327cbed7900482174170af6c602a3527441858c", - "8c3e00180f8687b4fabfae5d219946d0043ab90005552298e7578e1de0f4d36c", - "bdc0a6e51181f695ec257a6fe93e355afb1a5cc42d0907e1c2a0a8515544b167", - "eb884084d84e012bc40bb6c2edad264e4d33981e00e3c55108556cdfdf1d1294", - "abfd5856f89634aa3a0c927c37bf73d871aefa64fc385414c990b72e3f82cb4f", - "4880272acf1096a5f377c1afea4fdaa6c058c0ffc2330b8886293328b6d90ca4", - "5e9d5c0f545b5e8ae60c2feaaf7beeeef240b77447d53d182a7be97b95425e15", - "8b299140d64e4f34de7912c1c177b6bc9ae602a5341dcfd7af49f70a01859405", - "c232e8b3a34da08a6dc200e9803a4052cdd26d9490de1a03a5e5e37d88312c2d", - "1e7ea1306b44cc9195a294c2838ca4d0801d9dd2615564edd126808d58ae0c68", - "88868850ff9c72f29929517df5033fec6f28ea962a759b45cbfb691a2947d066", - "625d50c38b80eb7d1102c5db5f0b7bc226ff7942b5010cacd4ee567d15164fe7", - "e6c6e0cb12d9e7576e6a75054a8cda2198d613d0ba54733aaadc1faec5364277", - "ae1071e29813638a5bb47af986fb2bf3ba132f19fb245cf013e820cebbd1b7b5", - "1ce0e348e604feb55a2ebab7e91ca9e86a2d7453cec11977d141157897c44fff", - "2fd1b0a63bf6970d8e88c348dab829318eab899b593837d24bcd751f062c8b6f", - "64d4ba41ddf438741988502faec23bbad2ddf37e3b7f3afc1cf244febc28df56", - "80dea9ba802026254637422b0b2e09b6860747289c24c333e40bfff23f13c222", - "2468ab58a31d6bf8d1b33fe60f1d4208983db68a4e65dd0a18c1fe72bed30b0d", - "c420c08a21a54b6e6c91c7c106b6195a9f37a634cb2c1fe4cea2795bcd2b6dd8", - "45df7ea80f3d64366ca6b14f4e9bb0bdfa708fb224f1815c9bad4afaac3a6c38", - "cd5acf52a8ac8e87a7b8f4820c04e1ec7dfbd80ab85848bd91a0166451953fa7", - "ef23c4270e51fd5626932b8b05c382465ed0d3419305023c7a11db0abcfd4f79", - "784559628901fbe21d7ba8f0a40db6e74d76d6dd5e3271107c366d2772e926ec", - "67ef2b2c1c2fd6e2f34c8ff744cb0a2a40afcd2840dcbedabc2aefc36b969460", - "214878750715b6c5f5b3d220d17862060095fb10a22e671ec396e72490aa5218", - "e7cc4d0b1bf44b3d4664fde52ffbb1d61634522965ff71e960bbd4689eb35c39", - "cb89e7cee9ca01f3eebaf1b06cc3cdabae75aa70fc1cfe2e74fa605af07af94b", - "74f77316913a4ae4149b440dce02cb0ec1b40d4607fb602c7f28b03c683b407c", - "de8fac6abe76506f023bbb937aad8ee7a6ee53a7b5370f08c33610a556f7017a", - "a15b18111fc84a567a0084e78719756dc5f332d5db7d98f0a746e913e9c2e133", - "a3230f00b8680014e684ca32f9ed0e61b8f698e1d15df022b9836704c98afc70", - "5c1a38a2b7c9ae809deecabc814a0c58395988f668c8fd87aaf4b0c24b2876c5", - "2e6a8a28bf1f25887e41028583a92321e7c898980006968995a2f1eabf112d28", - "0593c9fad83f349966dad356a2e8a4346462e24772923bdf7d2758f83a119964", - "5b6c515caa9c5d7c58b2b3402e88f8adb548b5d18a89e4692a36229147e85ebe", - "37b4bc6393c3f473df266937464f6893af51b38fbca73bc00755e40d8c9a58bb", - "93086be7cacadd621c659b4487b9dbcd9cee4062acaa1f9b9a529753c36deabe", - "7e707360f532b162162a5d95e3a4845b9fdbabe593cb1fd5a33bfc13ac66ddb6", - "4ba70336082b11159e4e4aac10d0406baab95214e9985100a1d23a78101d9558", - "47b8c57f840e363b4f7a94224f9c91eb15d51f9c2861d288c962cad1ff38ac2a", - "3e87925cc1e2046ae73e8d15ad3cb0c859d7668d0773ece04c0121aee1fcc497", - "35b28c6aece234d59fb377890719e1a8f6b98a3aa74488bce0fad2aaa1936646", - "c1ed72c5b1a2009a18654f22b51a2e2fa8fca835f32fa91b26d4ea0b20ef8120", - "65e7a4980845d27293b30eef0b25321a8e07c2ed649f48deda5ea23f2257ff66", - "2f94a7ff30c12df0569bcce79dbfc1a9e69821161bdcfcd95859b6f42a3341ef", - "94f34ac250d4340b810ab6be0b9c801c538c978fbb41b162cb541130aa4a8588", - "e94e932623fe3394a4c3107be0f0bc514b280e4dd3ab2f97cf6d0dbd62e46f69", - "fd7f76ef706199b19dd9403ea67630a35e4afea7e326ab6f4cb34d4117e3d619", - "aad9613256a468a0b66b606c1cad8790f459d488e9e048e65c542cdf245ee109", - "9f2131f6ec3111e97da32a18a52a1efb82a0b338bd8a27409878da54f68616a4", - "19d610a599f6ab509026c75f850a6667a88978926d70f2d4b30ae3482b6a98be", - "3d5e54a56fba859324a59aecf4a275be6049c7c1856ba17a0bca75f052155e61", - "0bfd69a5b5ebc3a777bbbdebceae7337e0ec4b2ff49a24068cc181a1e914c749", - "d36e2cb84ef6d90cb2123125edeef2a4dab99872987068eb4859cdd3b8fd57f4", - "50ec43a85499737cfc8bf290b1f753d6a74da32bf9dc482e15470d8a6a84e31f", - "669909385cd999146facd4850ab7cdc2821974a55f4d6a7d47884d9ccfdb5905", - "cee62902bf929ff70d4de53243ac4518f275408ac1a673fa29a72ce8973325f0", - "9097b257f4314798b6ffe01cbd273a7cca10a55a7a6bb74b27bfed01ec7df057", - "4f8a58425c5540ff35e99923ce1cd0a59da2f9da4e746bff1d1a387b55b533df", - "601a489e4009ec6bc6bfbf4f7d91b05280b4f6d8ae987969738268bbfdd13d10", - "b7f5deb17a4c4c79d4e8d8949ebbd7e43888c1adae05f1f4beb73c1807fddfa0", - "a41dd703891c2ea7c5759b8cf70e277f5cf2bf9725c0d94269ddae19d4bcb438", - "1f4b18737acd9016e4beb24b87e9c037121c762a27f9bde3bd35e414196f8a78", - "380ccf27babcfd6001e23fc12bbd74085fcb761329a5c54968fca3b184d8e496", - "e85453299cdb25227e712b0943b1d21d168324ae888bcdd4237d6ecaa9274a0c", - "c60c0a8a07a0e2f50a4b07f7b71a2e6cf67442ebf4d6e4e14e7d2c8cf9fa928d", - "73a8f59f351d54e555a2939af4523a0de960354a21a2c9a6e5b651120d607690", - "6f5eabaafd44ed8c8bd2a6579102280748789e510019d905764594b95d97e7c0", - "2810c96dcb4c52fe274d5a28853fd096da7346e6b548eeb75e2ecd11826b1d0d", - "08814a8ba0db5bb30066ad43ea3b46ce6ad50e89c741b3616af48772fbcd51c3", - "973125d5a122b507c5fbd31bd1e7d8b2f7f3b4050b922712cbf4b2d75b57171e", - "8938587bd57e5ec5cc3f07cb4e7d59e4387ffa587cee5c11c31715d7ed1fb77d", - "5d2ff4e112fceb0c1fc98ecc4e812fbb85ae6cbc78c1fa917548e0610cee16b5", - "326951c93238f2dd44903099620b8c9b2e965aeffb0fcf16d15d4b95fbaeb72b", - "ec874de0176ea63e2fd0c70d7812f651508172e0cea276306411fb7c18dfab9a", - "83afb459217d8ea732b621f30535484a5bcd79428ebde8095b0991e2eb554e46", - "fbcc8d94a651cb25d7d4fe77b74581ff043245cfb6bfe615281b63525292a9bb", - "9d95effd9898329ea75006acb5e65033ba65ba12ba45535dc3aa2b78def193c2", - "b4f6b09cb3cd216d542ac6285312a512a9bef073c203bae1195e54c0bd29bc4e", - "dfbd88d079ecf09b57e3f20f1f630e778660afe304830b3d1f7bca84479e5452", - "f4c0e617e1919c6c080349525952eb8df610cfa27ce8cd18043fbac5710e149b", - "191979cfae693213fc641f084134b9cc9af0bc328edcc772f118b93b38935eaf", - "02476a7600513704eb8036ca79140d0817a696ce639d625cfe46e83654577ab2", - "7f6814a3adda919cb94f7b628819cf49b7f78c0a5c9efb69b67954539a0971a4", - "1d2c2c1ccf6621497707ee0823441cc7227960fb988a9270bb8ae8bea7d28f21", - "3545c716ae07b29125c3bbf36581522b0f5ffaf31c9f823ec27610531401e65f", - "91e98c4141023a86506b86bfb548c0267ccfadbf534a8cf7e9c2a2ffef427da2", - "42197ccbe0a69fd26a76d9824d3ffaf352d2cb341dc7da56e485d139fa1408b2", - "c695a59e87ab6521a2effd0bf0aebf801dff7dadb90e7e239d47d3c7e72b1570", - "21f8185bcc1593084bb10e742434a42fe441da37121352594b5fde0c64e0a067", - "c76be640ce228ab1ced870f6a190db20990f554c1f6a8f35475b41d99c9265a0", - "b38ad1e46e2d263460ce53e3cdcb1d58a1658e69e535e7829ca6d2170497372c", - "42891602e8ba6c1bba1a1f773249a12c4a036a9b84a46dbff28e4eda248282a8", - "63948359ea90b2a9286586e670601cd9ec45a2994b70a5b12000a05f6294e1a3", - "c758589c0d88563080a022cbbb0d24fa4e0d294fd0653ff1d3120612a7f56b35", - "dcb54d9837fe25a31115167731f72203bac44b6d176b515f8007bb37ca8ca44e", - "0fef14fdab8ec0a0c13261bd2f6418527b3cb2967ba640f36f9c19372895abeb", - "60a5635199538a8242f7fe0e4e7908fffb5142d03dca6579581cc8a4ae6a13a8", - "4532e3cecaf734fb14a6e1e443708ba0f83fff9edb139b2f615a9c118a385df1", - "6db8da6af215866d57a994c09a2148088a474b33a9d3a7fe224f0ec16864f89e", - "39853c539fe4bda0d0cd5de7a73528658b6cfcab92d139e5d6ff98b634e2e483", - "6ddd8ecff09482ab68053933c4c39a0cca57d17ebebd0e9b50acbce80ace1e2e", - "1887f5ab5dcdc3fb4817a234abf65e374bec79ef4baa392a1d62cfaf5cb6881f", - "8d110e7ad07e27fd5bfd2bc7b9142c1df5ab8298c6ed212d92f2bad91c8fcffb", - "976340b0fca625a8c7f061c007facf3441bac143c6b6f891025a2242e4b2aed8", - "7dbffb438b0aafd21239b9a49839530c02db4fcae1306c725a877193a78699be", - "515194555aad1a3b2977456b90358c6228b5a7b4c3be5d2721caf8f6bd4d2fed", - "44ad39f7dcab38fcbcc0a0cdd85006f443cbe39e160579d8786e990ce5ce890d", - "04004d255395873d7023f8f6d07ac42046e018c368f631ca677b8469e2dd856b", - "8758ce428d5439faa6751b8b11b4cff0142179d5528efa5ea1cba71436257871", - "d551da3f20f296c85492a5c4baf778983076264652ed7a6acfcb4018b3b5bae9", - "b9ee8dce41b806612551b4985198b0eba26e8a0298426ee326610b016ab64d02", - "8f608b3d2ba4d194df6f0ae74972ca81c80da6c03427c0d44a033bfd9763689c", - "7d90e608b7d3db8789c2f4bfd3b884c65d41fe47fa32efccdfff8b8bf44f629c", - "83762f8cb8d49d075a78c236dd3a1bf1bcc57675807abb445ec6d4a6ea9eb352", - "8b6c99973e2a4021f5a1e92dcb1ff158fb8fe895d6dc67c41f7d72cdff541cab", - "b27f0e1df3fd7c5291d86fdd1b8bdbd48ecb97ec1f24a011e04d94b794350242", - "d173f3775ea132f6de81bb13c6b782a921b0f71b944d304f2a2deb6e7b172b40", - "88e2e4033803e5a33f47933a6c6ae1ced8be49a2d97ccf54efc56297b555b8c2", - "ae4d4c833993628297cca2ccc2093392158a0f17fda45ec637f8d85f66a938c9", - "0a8e2fb0fe4fe46867f1675efafa4564bd2334b781da8c737119d689df4235f6", - "ec5605d1849adda847291bf3b879e211b4d85a03a96597e67846cc417ae81620", - "ae25b004febf6271069e52696768e6ab390fc59ccc8ac40343be05114bb5e9c0", - "b40a579946249dc32fab6c616e49b9228e0b93e2f0d74eb194dfad99ba610a37", - "9334d7f734d4a79e3aca7431f0a5b9f619b30cf0b1088625064c3a3289050a7a", - "0a94e21d4096386f7bc116489222f4e370be3fd5c67c4829fea6e17b79059761", - "ba9936eceb65633f1d7c2832103d58f658b7fa0c152f84f4bc068e6254c80c5b", - "caeb25cc36e915d2f82b5e81960d87421f01f0441161f456993f22ec5c2faddb", - "67b21db2c1f0125f620a74fc7bb31405cd0b8cedd669bafca858b6a6b75db16f", - "ce0e474d2d072b8e6b6d8efebc6d6ada29660bff69f639055306aaaf01d962ed", - "6717c88ccbbf6eb2b1a7e3dd0221c5d3ee84466ea8bbc6cd15b43a90c986453c", - "140f4df468cf9838267a48c3aaf10c3501d98a467a57f5f2c7d57d4543b17353", - "0ecd4196f329fc7fcf531381a1474d200f15f486cd055e6d73a433165ab1b0bb", - "bbbfc1dfbf7afbf648e072d83c4c437f3ce415a494d6d8d2135e1571d8b1a675", - "0cbf47e363ae268789a98744196d8155e16a363d0709901b7a4c30b2ebb8e168", - "3a9d41bc5b9f2b19ba0ca4094511fec4a4477718cf8b63d83c7daede71303a3e", - "172884135047e9eeac998042f0fc40b2870e13a3e7ef7f743e35f3b476b94fb9", - "266bce96fe62da666bddf7372a48ecf894287715790fd5f92692c65e09ad2231", - "d2508487bb142ebaa1bb7f12169e896119175d648d7f92c4a20a38efd3a62baa", - "b4ff1515bdd5655a00a6b10d48a68d93a06b5d3436f9dba490c9033f91ffc9be", - "4bd3bc869b021072c170b5526d81d17c1a5260f1701e44eef8d479229702e97f", - "5687e9d4c811ac10b2c7f225682cbd872f40fcd046620c91be0b89a7988c2228", - "03ceda40469d9fb05a566d9b5875d19b6bf6ecb5b36b0b3de16d4234cc7c1aa9", - "c1d5b2eb9df587ad2d0c2aa0808102b5a62a7299a8af6e4a336cb6b732f8fa08", - "881f0b3302aad4717e3e5fc2cefa4045c68920b06eefabd84f28b051a23cd99d", - "f19b66ecccebc063efb494cc80c0d6663956a638f951f7407ff2d977122ac7c5", - "943eb068374e3649e1fbe7cb18a6cd7d5665a52def420cfa452cf26009a3ace2", - "ad9a37f12cc959e0a83dbaf6b6d72af5d62db6ae3988c09ad3c88f23fe021df3", - "85e5e96add345d02e70d90646bb8320ffc038c1f302d5227d918786e0de4676b", - "763c306e1fa28c81db6a97c96914d6d0e845f779348fd84d777abb467d517d8f", - "ab0bac1fdb5ff9d49c61f181fc5d0d240e724d54f0f45188ea2733ddeb56c609", - "fa1d0158da39f95c3755b0f0d7759097ecf182decee97cd4fcd38366d777ee85", - "97006d0f92d2d76816ef00d6e78e6e2e18fcf1ff7f255390740b652596ae7d88", - "6367d18fffab734c3368105b8d6e2cb55ab2c22c6b49474b4fdcc847cd2ed5bc", - "6331c2a985f44ce7e9e2dc9ead4b1c6ff79619ffa756ba7ab507a08f39fd87e6", - "25f14bd8e8a24e4495680947a23e06c6ccca48e449e5cca6cbb2f44285852ac8", - "d1bd442c19d8234802426e2fdd337a4bc5f6d3228db4647b2d0f1e496335cd36", - "ed39c2bbe85c3778f8371604f477624649262304f41c7189b47e668b0663c991", - "f0de401b244e37f11876550d547254c024f3f464bbca1907da8f1d539905cafe", - "3cafb4783a32e89630c0db62020c0482920afec1569e8d03d167bba613b035be", - "3e77bc6d2b5ba6210adc1f47b81c29d748f4bd6a121ed92fef5463a59a23e6f0", - "00dc680bb4ae1212c3d16585fb959333a7f492f2b139677dfb3936c32be8ab8b", - "e8d5c3512378ae5c1266b332bf855932b3f6835eeb4651f5ca9577a4cbd5100d", - "b97f667a6479c3f0abc0e9d11b19e5130bb534c93af3b5b344d8922e98c08ce1", - "15b67dafa400c14fdb316e393a19d7ddc2fffde3fdcaace9338e8349a146eb90", - "2db6864d3f03015fb8ef0d2ff920808e214ef1ec527cdb50379b86dcfd09ca84", - "5245cf59386d35f8a3de281a07cf49f41d1ea2b7329fc7c6f4a450be5ac9fd4f", - "b265c997964b85a88a789ca7a607c242357a0fa995d02ea47e5da6616a4c66c4", - "8b8a5af74bbcb34a315bb19408e2e38e78c86ab15a99e4d2ec0168a529065a8b", - "512fd16037200635fb34c230bee7b65f1045510aa06af885b26415e5c23568f9", - "372ec6f8ac0a4231dd832f08ca30a733e794e40bf4ee4eccc4bacb8dc4abd14b", - "202e1b14b609b9edd2bab3b910d18a0b7dcac0549dd35ec5d703b2e3efc395b4", - "93dbd1068c011785f314266b3a15e857f7f80e9933a3cef5c73a52bccb7abc6b", - "57f984e01c2feb387e285b2ed6274d5d88878849f31b2c122337f30295cdb069", - "650b887a13723492b1007c91fe09e7c02523912745c0823f9dca48913e5cdb46", - "4b19ddff304724af6051cc53b1f0fb01e72f787f09c31469f2a30b409ee40e04", - "bc03d062e67fc30bd106a380ba42c4a34fa4f25d72dde8bdf5a3f0099dcaebb1", - "099f4e8bf78ce2cdf1ab2a2faf80978aacd14b496008a56499149fb93f78d735", - "476c8693e20cad574acdcabaddbfd24fe1dd2287b7a773ac0107cf01931677b2", - "cf45924e6765362a0d99dd0fcf2d9847cd425cfc509df5bdfd5dd9e97a38137f", - "ca69dba8a611465f981467201798c994592991b0ee9dbfc6d8f5930df0a88829", - "ddf56e9f3d9ec93161207f9bb1c30b6ff089244c7cfd44fc87c33fc0ce03660c", - "b6c37d983413e27fd3c3ff223549a95bb3838e102c92fb4e32f067a7885a4858", - "75e6d6743188dfcafbb73c1250ae1ed9ef0f2793969639d9b34b2087db831da2", - "bb0a0db7bde4d41e2d2690c3bfcc45e76c2f2cdaaea0ffb61b1d3e2c7148d054", - "caa2afe4ac90683f389f02908a600e6e82c2df725f9ae21127080a1c8ac0e433", - "fb1ea518108a747af4fdd80cded528fe8cc47b3868d4118634a9ce9a19e099c0", - "8dc2bcb4f67dc31e0d853dc88b7c08b177d93265e37818982a8b8cfc96f6102f", - "9f7c4039f2eaa3f15b56142893728415e8f853ea0fdb44deb0dad59b7608c1cd", - "76900d7a9d532c8b52d85542db78fd7838f5e8894f2b5a319e8a70e4d09295c6", - "d7b580371e4786a06a3600331290dc8f4350bc6a7a19282257dd6a97aa95d8aa", - "812dfaf5a171c4f83bcea27053521e760dffd5b544d87ed3be0a82094bc0b6d0", - "a864c649d1a5f6ca40e535b5672e6bf377eb7abc3e9d95547f43646703fdc59a", - "e4c499704283c49060badf22b94984047e8046f4d0909b4ec7ee29274fc4170a", - "9170401f7e70d28ef35feefd2daf4a6d6b2c440b04f6c180ddcd704361e23799", - "8e08c597f300dbe948404967d86ffae14b5a879b296871151d920581c6c4c634", - "4e7147f3caad4df0bc314a5b756efef259d002563a64eab9d601ee350f50fe09", - "517a67601d8b98381d0f6550b5c9898d0db7e2f8288a6f236e3b74eda0f9ec35", - "df8ad2bb145f6841adcb5a5bcb41b10a63fd8599de505e2bfa844819b78e37af", - "7954b0385b62b70f488efb29f691b9e674552ee8a54c12fb1c57fa52e07e01aa", - "b76a4aaf591e51a1d20ce6c97294fe766002b0167690934f5f2e872a6780a237", - "8abdb46cefbb9d11b442500b6fef95ab985f2e4d9b75cf5d250f0a7dc8256900", - "7f474fec8ddcd42673a9217525de4620c5eafd2ba78ce352495dc4a5b8a37366", - "6b85a16ee021588ac4e2495bc2cf59ac733c521c34309b635b8ae6c5968c6477", - "3a3f585edf5689af5caa75ad82af46d807295052a7a0d57a2feb5af89d17aad1", - "7048c7727a07e83a859046bcc0a1ef0ee815c7c4d6c6d373cc905cfbf0b50613", - "b0ef918934e7b9547e273d6bcb3e39ed6e6af891204dd756b9c4c55bfad351c0", - "a781619dfe67d757ceb4682068d7489ff9530f2dd6f009942503837f24ac9a5e", - "efab7227585eb084d1e4f600f9ec13e9292149a56c9a95a3b21b08c68336ced0", - "9aa59554ae32cd919a083aa22ae58640c4c624fc1f6c072af769b4568efdb5cb", - "4997495c1345c1e3f27a9f35e9fd051bd7af7037ebb5a885b9da5a9a18d6f74c", - "dd051e1da2fd5b440471ad65f697aa1ad406ba8abb95893c8cc78566f4bb07b7", - "590e770cec90a5873ae7611479b03232d5305c41e087afd0210b00531fddf794", - "1a360670f9c3a44bf915d4b7e97c31ee06e581399f6ac3ffa6369d7bdd3fd8e7", - "f9ada2997c631b5f3db7821c18310bb93ded0812b5924ed5f629030f6c08aab7", - "8ce0b911dc3245f82f4e8867cbdaf622f8b0b796f2e35c8975493bbe73ca6c00", - "aee571eb82e09d02812b5215a0f5b437eccc253c2f9772d861ce14665b0bbc76", - "e516afbf7b04fd2b9a7448f2140028fa852d49958b7d791c9d5b52617dbfd13c", - "914daf329765dbba6e9076761db5f060a402fe87d68e770491e740f4d27b10ac", - "9bebd9718cc8319e79215af1b13829405e530c39a84a1793af48b980ff272069", - "5ad2a7137041fa22886c89d1ecbdf15dd25d0499b1aaf2a3c025cb822feb2b11", - "c5d3a85c42bbce50bc22636653ec93713d8c2cf4397424b7f129f0aa1cc5f5c4", - "43163dd39721321631ed44f8ec3365a6cd7d3a16dbee1be991cb54b6b585aeb5", - "a9aaa22037d18290bda38ef286ae3b0752191c50f6378eaca314840d1d862d7a", - "2bf6254923835f81e5bc13e1f46a27020431815217dbe0dc53050fa0d32c480e", - "7db23370e2029011074182d4636eb8a9dec5fcc2b8cfd0eaf94449d0513173f8", - "52ca1a6064ec9dfaa84c84e3a4440dc201ae0faf1157ba5403b5ba6ca86053b7", - "552c169f05c2bd43d3864598d6c3a9b21196d89c486c9056d9c2c8b6565e3975", - "ffc57a3cc6a757e154a0799ad8ef1fb7ea3d2b9abc176847cf682cd72247d4f2", - "68e407835385da17063f7eec71e13637e21fb01ec677b03a3b4d348f55aaafd6", - "1233d985ab424c3544b840914771ff812855feba5e177e1b6c662894d40d5ed2", - "1bd471b04c9178f66129b8ac338ed1d58419f3b9e7f0d0935178578523b8bb69", - "791a9b66927d94fed71128542edc4b49f384db4ff1ddf9f2778441e720b675dd", - "02dc7b826a966870dceb6a55e4912b58b9a52c645273ee1e2cc98786a6285ff5", - "66a4e5c756294551d321da8b72554528d13d63c5c53bf24cd535e1e92e8603b3", - "c45e2247c7fcb25ccab6201d96df7e9fc5e04b5c3b76df22e5fa157c31a04110", - "078daa5ad229dad202da66fef5696b254127d3286d4af74e620b9a92b6b7a786", - "b6043e5d30d3e9531f61f866b6eb048ec3a3dcd43378b81d5a61b88ae4a95db5", - "c63cebce14951efcc7594c137624346c3559142f6d8178353f21fc995c170de4", - "73fb35b52cdbd7350bbe00a4459cb4b1a1f0b7562f1ad107a7d4086df980769b", - "c44176d4a4af7798c1ffad157291563dc714a9b27c245dd2d734d215d5a47288", - "ac917bfe3b38256ab0aa824d5691254ca39b524355def292bfb9fc3682024e5c", - "b55a2f70dc98061ccd2fe384f2228338f132cbcebc08587914f00f956e04da5a", - "02651bf1742dfb21d5b1e2c7a6c1baf5c48626193dcd89f3f7794f7b0a1ea015", - "76eb94105315999e34e8f0745bece64ed86178e40a99cd5d5fb018e10edfddf0", - "d23931786af7b29bb9bfe24ca96974a7b7126f91ca92192799e0a594851a8bbe", - "fef3e4ec750de65dc5e771dc5335066295af83fd831f52d383d54084dcafb939", - "74b77639baae083d5ceeaa27149452daab8c0150ee585b686b9d8fe00083ce2a", - "5913f28046e5a6fb02590028df28db2e56dc72816b5c8e28b3b0544e8cf04ff3", - "c9ae940c4596d95e59614d59bf7a60388430d350f931210476b8a149d85e553e", - "df3851ab3292fda21e6714784a4ace4669e8687f0b9b68d3dc57841fac3d5c4e", - "0f1e0030a44ec5342212fbbb6b5259bb458791902a35aa40c7eccbbec419a7c0", - "dccd5ec1eced10209fb7131c010a4e900babda037dd3d8ce024d51b7cc39da1f", - "3f7049651f7a2ce7e142683a12f93760fb97f6fa7e855239f8108d8277137948", - "7e2ebd1ebb179f95a8a73955c4794e79ba19fcd706058ef5090b579ff47b0ba3", - "5121f76c57a6e1be71d6722cef32bd13d4427372ceca94ef0672b56f8ca6ffee", - "3e6f2c933f63c9b55523b3ac1ae4771d5f48523882254e8bcc85b04ed30b341f", - "6712745213e62b0f00cd5d47bd3723203a7dc309f016a363ce550ff240b49dc6", - "60aaf91f612a6363040d20e3111fbb9e82ef2ab1790598991e80ed9004835fa3", - "b0d3292ae174958e10deab18749639a8020da6dec4a9de058bbf4029090873e0", - "f55b827d9a54bb839ba856a38059a975fc3c2bc7677bd59cabc554985c5bb11d", - "ae2e8a931222152f34647f07a2434751a46351537572af1d07a17f612fec47d0", - "39775cec68bccef88a6f131d4f409a64715436bdb4007662c68ced95d6d52119", - "9af7056999180c3f52b8c3dfe2df52e8cfc1d2a045cede24a3f609dbf32cc10c", - "4eda6eec6bb4c9c228a36f5dc6dc2ba426cf8018a0ae10d1b052a198e0f64024", - "537c7c92a5bb5d13a07e0456b2a15c660545271a162afd01ea4f735bf0f8a6b1", - "6c6a2a0b48fb56e8e84d2d38b18abf6fd2d9b8e6e0ff36288494b1571ba184d2", - "5609875bb9c93edb3ae5ab9ab994073fda0efe9b48720b12e0e4822e4bd0d940", - "b13c8081861f8438c60553cc58d20aeded662b44ab5bb19bd28ff89ee9c24b9d", - "c320db7ce61dee03651bd545dc3d3fe8de20d92cbc30f876dc285bf48f210821", - "d8d5436dc8282605fb070e8d6ca08d26860cd376a4db582b89e6c8decbc34313", - "7acd17d1551f24954008b3fcb737553b4862ba7036cb4b6c4dcdff445a159522", - "b6309d857f82613b40daba224bedd3dfdecb584cea101142f5147196f7dcfd28", - "dd50e980af9418e68bb6df618cbb064f9cdad779425f67d7658a6b33ed77b016", - "3bfeea6f14c05dc358afb941b73efbd8f551fc8c748e1fb941828b1886234774", - "5474e9ef092b73e914ec96b92d32ade0d30bf8242e9a2f61852d53c6da199083", - "b5ddf8bb1f63028a5717b29fbe36e77de4e8b7efe7502e6133966c0271e86c16", - "f3a1c358b4bb60bcc79e7ca3a84975ca316fb1189d534dfb297839b46385c2d4", - "e1e2199ed88029bb5c853387bb88ac795905c9958bfd1977c7a692f974c0514f", - "8e59dab3cbaf7568ab8bf828c34191bfd7b3fbbca194d535453619e98d49487e", - "cc60e2d7cb865f0889c54d37fae238ff4e5fbb5105c8271e76e37cecc60f7148", - "6cb78ce56d24d168eadce906d85d6f3fc0deefed13dd7d53adeefc457d771d1c", - "2b5998e47b17b7c5067039fd44d65ebbc9029719e1c8afb4cafc45d34e57a671", - "58191498b62eeddf1df52ff02fb5f663f363b17ff12a7925cc4eb857855a9578", - "6f614ff40d015a8c392f1f189c131f5f09593a6dc0436ca97fe052d7d26cb445", - "0b792c7eb30c67ba0fea35c94a7ce507805535ce626f5bd894628aee383a114e", - "828a97eca9b0034c77e2fe004fd2d214a319b52942674e6fac6a20caf0dc8d18", - "cfc7af9daf43c25b87cf963fb87e60e3bb6dca3fabce56b8e30675c7116b853f", - "d81b0dbd8f46cc246e24df144fec69c961ddead41caddbc5870223d8f9d12556", - "f81b8d8141532b7a38d7507916185bcb91f1cba4f48371dcb3b1a260e82f011e", - "cb52b491bed4970c297f1b0e3616793eefb249f745788af14b93cb5c417e56fa", - "3625ad7d11a0129d488a018d20664772321c27643506b7b9013e6eebc131f658", - "c1525404348119fdf0129d3b1c30294ce5a3e8d9ef9d95cf5a8650dfb85999a7", - "e2393e0c45fa6bb46b52865c818412e21d0b70e76c68d62c3550b64740329f0a", - "756a5186bba8c59e3eae0d703e977bd424a8ecb35981a66d90802d5eb4da5e41", - "b7936e9d70c3a49800c6a6fae1f72dd001ef8719d074dc0ca1ca71f81010d917", - "b157653974c448923b7c18faf866af683e6b80a1aa0ba04d47d967e5664b7863", - "957cf05027f83c3446111d549971d7d83c3ee9044e7602a77877cb6bf633753b", - "b70cbfd245297eb77ec688507afdf7fe8e3eeadc8a761276a49184fb710a0e63", - "5a59828cdcdd864f6d08097c4f37bfe860f3fe67432e0f36dcc4f974204fc4dd", - "4c44f429c2130363043b779bc48ad3a37766367cef13caf9cfec25b853f685be", - "c693e546a17cd8ffad7f2c913afb907249da20638a2e7a4004fb0241d3b891d0", - "d5ce9b38adb906d20d396ce54e17ef0a9b96e46f63edb8066778982263920a0a", - "2d77ecd80305db1d990afd897886da0b07f144b8f6a4b2d35ee49f21a9d606ad", - "ca0e7e56b8320a28ed179a915e6be2fb789063e936daa7dedb14dc9dde69412d", - "ded50de6e31642b8ea9dd7bd3c9b8f78f343f1a64c4a2d5f9432c1ec2e080cbd", - "2544e85f30b649848715c41c486c5d552b2b32f7f93ed9a0f0e2e78e6e45bf8d", - "d88bdfa3f00dd349a4df1d936f856719f4d15885b9df4e87fb31e8dad0f8d485", - "0204695d1b35d42f7a0f15885e8004a634299e882b0399b4f1c48462277d4a68", - "4355426aae400260279818e32bb2b050b4ff38f5fa5897ad4ad495c6529432e8", - "62bc27704f2e7f0795d61a7c00aa69b8b21ab216396fc437689f519873110ba1", - "4049d4fbee8ba5cd0f09941f34d83dfbe0451849a0b22d8cc97b2479383cc1c8", - "2462453f9baef08b942ce6aa09eac7c1ccc8c53e49ca5b0bd484545eaa5675fb", - "70adea01fc9fbac36a320bd7501a7bff9f6bf5e5dacc2b780179af8d80747c5c", - "cf955b221f4bc26d4e166543905ce6f4629c37a36be43065d728aaa11f9c068e", - "3569238ea97f4bba1c3d9afe98432498e24a0dd6a2c5e0fafc0a0c6f330b6c76", - "8366882d77a7bf3ebfbe9a5c46ba60e20dc5d8e71af6362b5baba9bd3d7986dc", - "42b02535c7c136ba6ac4d5d56c5602da8c7d3bb0cab36bc5089f38b0bec7c84b", - "efd5a5e945aeb3aa3c88a7246c713890c6f07a77ee4c5d5e9c221af797d325d1", - "1993f04e3c578226142b2a66c48f5d6b477936255cd0900438c61f7c1d196376", - "90cdeebb9ab70a2ff3199270f46138faa23b4e530e4a4dabc607957e580739a8", - "f498592e3702a29911b19761982c5c823e96a217595f127aa612d5dedc4d30ed", - "8046122e5e03be97f30d9e994bd5405eb658ad42fdd6e3d722346fd770eaf17e", - "6693eca842817c731ea640a2f4ba52ee33faead6d2409975dd1a3065c5f55015", - "bad4646630a3b7ca8c176a7d9a66522c23555a4bbfc1366cfa22dd1f4bc71ddd", - "7bd33e0f460fd50bae3e8b02a8f168baa25a24ab644feabfcc44bcf4edfb9e87", - "75579c358269f756d90e6e6bb8f12038b05c4e24a6606cf3d73bc288b8433d5b", - "0df8810ffa906e89caed6cd110e93494b7072259b4f5621eb6967352f2f31b2c", - "dd113520d540b690a8539162054e9a2881c9d4ea153253def230bcfc74a8b0ab", - "976d85a921abc0d450463251091641951d9287bb99e24071ebc0b72184fb61a1", - "467b6c943e0688657295735d243602cd39b14bb0c56f66a3ba7490f65de0e007", - "1b37ddbc6080a5e7c3d0dbac42e15369e6e02332a9deb781bc7f5c764272eb97", - "b743f7b32f75e3d6be3267aac90a6543c41934edbdf7bd02dab467b809e2b6e9", - "80a008b7e2991471f0ae8712798f05d6cc403b67296ee713b6809db3b792dc4b", - "764e5813709a2d1eaefce44511d8b0bf25db6f5f1b14409c76fc1ea009cc613f", - "0366e621b0a3815d0479c5327556f0c9a74836223bd5f70235b9d52c8437763f", - "90ee8dde3c2369865893a3e30866b6060991de2c9f423ee20962242ea14b7aea", - "7adc8d566a82981d1db31a99ed0b53df377344797df52d84cbefa38d71a144fe", - "f007dd9bc35b926149a978c35127f9e3fd532ebd3240e735969a7591b79fdcb2", - "48d4dc8e02ced895dcbd6bfe35c9dc534565ac13009bcada7010687230fe19c7", - "5cf684fbd2b1361ec091d279372a3ebd14afa93393e937a08f1bf6e4f79a1cf3", - "9dac11023ee8358614aff2137e651c56d807b67986ed51b5445e9c3809042731", - "f252e4b43a62785cc7a1f7da36caa833b799ad75dd73b87dee34c8ffe7d6bc18", - "64b102c251f3cb3e430454f80e8aa160282f85ea7c83a7134597871e17d2f4e2", - "7f1538e9a09b51a54a7ebf8eb2132ac94555cc2cc0fbeaf4853f8a83b1d28e54", - "419b05d1f85e60fbd623c06578b83c7ffc8630a7dc32fb31c8f3daffeb07bd78", - "5b5a84e1b07bca9bfa2520673af981db94ba12a271c78b4bf3bef8f0fd7b9656", - "7a8d9b02be0a845ef3cb95cba88d69c7961f171ba8fe78b25bc4cbf212b64f03", - "c013ae56a13dd9235eb39d935976859c36ab9f6f4f242b4117b11e8075469718", - "34431568f2b8c440b80dba867799631ab3b2c2a53a106a5b04c8e24141fd8ad2", - "479e8ec8b237550160d8b86095ec502998f539a8d32d24c9ec7afe09982da4ed", - "191e299ed905ae75bffaf0fb38bd45eea933d041ca4203c94772e3af7cfd512c", - "3dcf9966d6b0592f4b5d3a99971b7e346f9d73f53f8d18594b966f0d67617fef", - "eb0c2c9fbed219c56fc054bc4d2fa763de30f6c21dd41eede8023b849f7e48db", - "8f588512ca55ce7b212c75ea2d12aab001018c4040501fa426a3d7cfc35057b7", - "e7871785e070e24266d0e6efef759b2bcf88df20137c1260d7331327d17bd24c", - "a7fe6b189adce3de191d8768dd16834217cca475ec78f0e0ea59f16bab2918d7", - "cac68aec15e9e8bf0ce9cb10d581bf74dc0b10be0210eab319e3d867f3da27a3", - "8c4c760010686bc01f3298a826fc5cf4ed9516ed67aca9e18f22bc18b81c67f4", - "cf3d16e05e96282749b176089f88ab489de2e1b27174e6439b6688e21518dcde", - "ebb4019bc37ecd669447b6958595a57f0677505237fceed7199c0e032d8dd585", - "744d47b6cbea3b89c545029e669b797fc00cd5937ff98bbc7a0d7363d84aa1b6", - "43d2237458fa19db9cf95757cb315ecb8f0266cffe2c653689fc5fb029b0f306", - "7242a3c4dc373b9ab9a0e0f660bd0dd91d7289286aa3014f7803986a26ee84d8", - "9d5d7bdb62ac323d9a3ea8545a4abe13823a71f901e20b1962a564472b10c258", - "c49348a070ac56da3a64235f3eb7c998327d97c9419c6b621876f08756ebf7ca", - "7653a53d330b889276722a47504fd68f9712353b81ec8364767a638b6edb0191", - "f0940d279f135827fa79762a6eb6a4a61abe52c219eeb89ad4d20e79bf5a57c1", - "38756bcf6a6517bbd5c10860c944b2d11c6d0838f9a31debb34df9e0621bf460", - "3b46a8884cf123eb50bc7b783d6286bdd670957761a5d833bedf054b909a944f", - "00af117dc3056d91a696633aafe7630f1122d32f847a936489cea56777bbd258", - "b3bcdc7308c109cd0d078da00b4d79a578d6d23cb129a723b97449e2a1aeba12", - "9bcd633b0d8e48b6a645b2442ab95204096eede4484146dd08443af9eb12ae6e", - "8e53b58232050a6aac0f682d7a57a72b4b46b1e9a80c520114f51e2253933526", - "93db148aad318aee11a02efe0560952dca4f4cf85dae98a16750e874e611ec5c", - "53480af58eb480f11fdffbb5b30d24afc5141033941ad066bac1c01b5e3e0ce0", - "6a213c656f378580f49836e7987ccc8f09ddd50f5cfa35a90ab6c17361a20d57", - "f912f2bf8c6a87f4b7c3f8c44f0a145b175d6fd2dd4dd44ce7e9cdfe18d18ea6", - "884598ab2f394eb95021ed1d091a4c6ccbc532f1939b66282d23549f7f33b021", - "244a9cc9d4ed9dc759218dc7060b349eb3ded4a9ce210d95ae7fda24ce54d46f", - "43b917ec5f2dcc88f71f1aa8db514584c26c11dbf6e9b35cb79bf80d861c30a5", - "4e465881d66d7b1c008768dc07d64364e074eccb1d026769a57d3afdc48bfbfc", - "27ec287a5a2f2f47fa0e12f90ac3216a779cd4752ba903392badfda08ca3cc70", - "28ee4fcb11649e7c7037917172d87c3c193c789d47b56dc47f20e15a060ace8b", - "d353f34add58aeaf008d02a1733255206ddc05f75453a608f59e280a14bf97f5", - "b3885432cf0e9a2bb8920a665b30d704ee59bf9f8cc16630b602f8542b69983b", - "f286bd119cb59e9409e4ad9af0ec65c40ac2d0f7ddb391436fec91e2c89b6dce", - "7e963e412a861295710089b8eacb2a86bf70f1737b7f29cc33639ab786223a95", - "988f2090b95d5b6f537e38bc666b38893cd10ea2e854eb3611baba08a9eeaf03", - "0e82d5f6c03c9eb59073386b421d813a8ed96a7c7143423ecb1e6c29c4ec4742", - "435030090526c7e7bbfd0e2f3c63809257c6daff026452718ee427665582da22", - "be3a6124d44938df681e40a4352c4b8ddc9eaed8668e03b59b991ab21fee9ac9", - "4bc26e5feb65489b5a1c8d1ab115efc1db6952b7e2b0efd9b7f12afe85c705ef", - "3641b59bb0429a3adfcc5f742dc7e758573d8a47c02a44c7ca3cee65675d71f8", - "44768d86feae360d6122026079c7a4f8410eedd05325dd14bcb0f016e97b8d75", - "e4362d61dec4c0fe39ac485881ba8d4a2a2104fbc82a50a36b28a9968a687942", - "3dd9d416096a0882f46eea5220a9276ca32baac4fba6d7ed148af519e37d1e8f", - "564ed05379e5ff194fd0f40be9d9af3dba1fd83982077fd45d2aa78f78bbb3fb", - "aea12ef54eb36805365ef112d78b57aeb7dec2422fe71840a7588e0239e8bd41", - "461f77f527a3aca1fd15d533b0edfd925f736ac08ff8b5f12bd3cc96c2f9e71c", - "2bf93c54bc3bfef26ef0904c5e71c860d1655b62e9d5558db17c9bca829d3672", - "cc01e267439d5d6b5438fb6d5cec739f2a884094461e1ae2237defd2dd9931d5", - "1fcf8ea447f5c123b78d471aab5dd3f36fa0e142b7566157ed234fcc6cd09700", - "7b19ef8c59701877ed5f09aee4918b639c16e1488e459a4535fb6e64fb68c2a5", - "9374d8fb0a5436f482c949e69d717a6ee0bb86dd540f7f9048b919ed9a8d903d", - "68653e2733e0eec87258d933c6fb7a750d045c9edfbcdb69f79fc440df15c53a", - "f32459d739a0bb7a199803900042dbe232916e118e89938cf7f2eed472b9b366", - "9a9ea8034e54659682cbf47658011272efa07cf2f87ef8be4c2d524365efc47c", - "7b47c83c0c2df251407b206fd7d230b280c38acf482e3b67cde01edb154f0c87", - "23ef0eca68b8cacbf21b200ed62fe3afab0719b7b73b172d31670b810bb9afad", - "124fb169cf48e2282d8d671331c3280b9386160e58c9b2521133dc53a7e5e03c", - "aa5decb81520853740fa29b59d654a331ec5a58fd3c3992c43253d1f66baf8ae", - "922bf4f893f1d734f51021a8bef30e0638489cf48ea6343905abbe9081281a15", - "bf39449071074be18292f650a6b8322c190df5f75d3273fa43a9870b2a388715", - "c01d1cc5454183618b9ac6813270311280a7657b7b4442ef6809f14b71f3fb0d", - "22574d1b3ec1630f5a24285ef2b79c059a8a739e2e4e80f8c49f6e744c29792d", - "00e26f79553babde7bdc4c4b22097d3abbf356a0e0cd7b46f887be5229db9d5a", - "b773e5d8a3780785d95870e818c69f8ded1294f1b486f4227fe79a6c0f327e35", - "ffdac6b4c55fd7986dfc6da52cc352c3cbfae8b4208abba9a349f75ae36be0bd", - "defe36346a82043369138e7c98243eeb92185366d569797b090ba9fa62bf6ddb", - "8a1969de5866b2367cb70138d128b7fcfa8f1a80609117780a94d9210cfef2ff", - "2d59c53863a5411d46ddb3b5bc5706693d248a6fca8d17559884f0deb453a94d", - "a24136c4c800008f381e21f66cbbf163f67ef96d1852686257877ca2614939ed", - "3d15b9c01ca345e9b147ad6d26d09b8dad7373cc024bebc6027a387acecd80ae", - "b51aec684616c35cf92e2c4d690c00d1d91e76a085a028b0aefa266249a39a81", - "4ec83049d09317ea0b2b547cd2c000cba226c9851ba3299f2be44df2523b8868", - "3d40b3a3e230212f2627b257c03a11ef52b1a0bfb446f765e5684b4840f23254", - "442e048bc42401701656c7d0aee89b545b0f81fdc6a55be6043fbbbb9a0a6fb9", - "08861b40bb6a91dea7239c4503f3c8ad2fb70c77c0f18c4dd28fa3add25b5645", - "5cd53abd1db8c14aebba2faa4c82a46e6f13b221e3a22a8eb904cfdd6ead987a", - "c74551baf313c3df5ed73b381c43feb32d8b22d51581c614eb654045fa67f0d3", - "96c50bb331e1ec918e07cc0f8d4b43f7f014a582208a91c4df46647b374615c3", - "ba0f65447b3a020c63fc628b0fb6b68239a28e00137b83993522848fe8289ece", - "1245d40f7c4eece8035d3999f7b3ae81e8202fc9b2ae14a6ac38018c6dc46ab1", - "3027bb46fae17283b1ff528c8cbca2fbb0ae92322a499164c2cfd8db99aef18b", - "fbe8722265bf06e07af1c8a3bb68bda9efa484d2bb8ac2252a475e1cd873919e", - "63d60344a9e78ddf117d29333723ab38d52353e07b89d235876504cf1649771c", - "3bcf22b264b796f4fad6f48c6f02fd313b29f497f620fadf17bdb063c8b94ceb", - "b2c6748e74ff0ff05d2e0237a25500c28f22202dad6c3363e9a78b1ed19ffc79", - "d4033ad416f33cd45c2a820d5940e5c4b6527abe58652ce5fc5d771f6a20898b", - "973a6f5e080b9541f659d2c032fefc7a05b1dfb6411823a3481042913d698e4a", - "f7054693ac4c9e9434df5de10cde6728c75e79152d5f4e07135d4111575262d1", - "040620838651f48b25abf87256bc9ca775d6887865efc03d0d3778dfe2826a7c", - "9a8a83f6d5494c6beac250145c6c82e6921d30a4fe34d068d3b665b8e3493828", - "2d042f04317171d173c5dcdf53453611318690e6743bd89f2dc4089fa3af17b7", - "86577acd0d5936f6a477ea4359769903c990778d708af42eb226b10e9ae4fe1c", - "357888b63f92e124359605b8974b4fc782b9edf75fa27c9e1241df3918c88598", - "ba86888c21362cb3c883c167c68a801d0b640893ad474571b35d2b7d14c81b54", - "597fd6dcfe0b193b1ee0c7fc95ec06b285f3cab3ff395f0c41c355f85d8ddcfa", - "1ad8adfcc4d4b17d7fcc1a5b00ceec1f172678d89977d0fba0bac384210ef0b6", - "49a0e9a9f2eddb891b976de2918dc1f654957c81e0b574ccf2dffe1e4db856e9", - "c3c6774d0881877b198c50e55dd45916f08c66722535eb0a074804f61573966c", - "f6a7a4c15cab5e47bcc45b0ac7eafe906ddc4ef76b72193a30e1841947659324", - "5d05a43c6d3c120b9195997691909910b40d0dfa90a22c48558418ece41c228d", - "1f47b2edd6897275d4a50072950f333a66fc02bf4a3a103c6da0363f015001c1", - "50c1501a09a8470d60fb4c0442c8374ae2e396ebb6cbd11549e7d02ad2c21093", - "7ad2a8259cb0e294bef5b0af2c463ed2912ecdc0ae8f920e3f8dde85f51c3f47", - "6dec82869c2e9a1b682d8877ba4b93ce15357d46b7fabc82273fb13583670335", - "01828e1fc804c4fcda1cc39f302adb4e5d10e73def2a494db676ab566ad28926", - "ce005d6f23ea67fe580e50ec35862fe7e9e6d4445af712d15e91dc5fab22d7d5", - "85a5a7ad668e31450a4e843c3fb12429b5b58f305de6af2372cde60c66c4f1ac", - "20b8fe8fd1840c23d5895aa84ed66309257f098c9e6b52661f755c9014b05c67", - "3d0365ea73a863b537ad255675db35d9afcb52099a076b9949d1102ef5c7b8e0", - "0cf739fe2f1f06911cb05b6f9c0d0da8af461a24e52f5f395bb0241df017766b", - "7398eff77f43775fa3a1afcede1df200e9ccca4152a5fe8d18735c29a9963e47", - "2c75ec2005ad63018c562c816de2fe6db1e883429e2eb2d950bad71aa6ed8ad2", - "cc7f9a8c33b0e1e589520cc2b1194487b48483108e3373fac2e3135d7a98539b", - "41dcc4a7b275aba62ee0bc37e7065414ce0f3a5b57380c4d5570254630a159bb", - "8b87b7fd7401785f5ee337f0e66db48c8ace5649e8ea627c98e698d667f091cb", - "4354aca66a231f7c22b265d8c8933977fc368f00e3c127d1c5ac4daf77b20eae", - "ead92e4cad8dbc67f684c65f7649e5da7fcf2704e34f472ad01debff41bf68a3", - "c09fa987ed263a5e01f3045852ea61bfe1ebcb1426149a40e72f452abfaeeb91", - "f67b7a85b541f58a90a81d65c25dcfb645e3a78b3970a5bbfc41e39e3cdfdf3a", - "7897278d3999d0a5a0b26cec798da224448abb14105dcb11e93094be551aef3d", - "8457122ba50fc10831b60eb8a2ff855e6efea4fb47a906dc324a482bd109f30f", - "151e369341783f584ea94237b700324f0f385d5dadf80e59c4d4efcaec8817ff", - "b1efdcb75a1a897f1849f6d151a56a12c5939a487ea522b4684695a38feccc92", - "25c65e0ae31c06d5b653d773098cfe752f5f43ecc26e7389eff1f8f83de87c6a", - "5d5944e1e6aa628aed129a0c6326237560e53525a6645afb9f934b402784b78f", - "76516ba5c314ad8e2f7c41c5f24aa7e455fca3954a425cfda13b00c84ef07af5", - "5b4b629466c0ca64aaf7e04e588106ce6b428e3b4b6199aa09ec04880b08709e", - "18faf203f3b4696159c28e9764ca021147dbe7b91dd1706fffc1530f5606acf7", - "6fe38a342910441567034dd604b74be54e2ce95993f8a070af7265af72d5b105", - "6d2c85d28fb5708a63020f9d6930bccad4e6017f3be8926c2feb2a0873b2b396", - "2cc0831c612f51d5f379bab9163d3b6784bff188ca73959a860fa5218f513bc6", - "02a358b3ac8b72e0dbc07cbe79e59f687895b558e306f2e645595ac657258d12", - "5a90b1d42d19b3dd537d8a55632abac32ec49e92b8d5c3689021a26829a23100", - "60a7191f629c8de40f240fb77a22d952883087bc7597880ab19f66d8bcb23e00", - "9fea81409e130444224ed42b15846ef7bddbdb811e64975c099e9e72318a9d46", - "32ae80b4cc7562fbf2b76f7ff882deeebc478aa48d265b03b3e00364379dc4fb", - "5a0ceedc68a5bf7df3441c9a4bbcfa12969d6230a4416e880fcf2ffd7d649e4d", - "38fbfd643a9944bfdd95a4b17a53814276028ac944de53929a5bfff41634cd6e", - "6549273aa7d94211d0fd5fb5997bb95fffc14ae436acf192be3dd20cba2c09f1", - "553e663241a5f1a25a6c4b93661f13068e842d62f3322a815d4917d08c4eae3a", - "3f966243cc64935910c2d3edd1c6f4dbbf26832f285fd351f36d44cdbfcbf671", - "b6507561f8c9a9298039627ebb423432af353f276cfddd8d5b0e1e108a535659", - "47c572e0bf810ba14f5841c46af901615c9da6200759aa897d5f41678268bb65", - "1245f25d835fa6782874614409411fc83d5a930fe2b8606c3855b2f361daaf0e", - "c7824e18f504cc1e3ba52acda83d881d7f183c96f0d77c0d3c71c1c53ea05ad7", - "34d82ca4372b7b8b62854f2872c1fb982bbf779a2863d3162d1f09f93bd4e56e", - "f0f869c4360773099599cbdc114f299f3a96e6cd5e83b2d132f5e56c5ca41bd0", - "b380191f0fac210fb3960e5084b0037add94dd785ad3579149d6e68e5d5507e3", - "7079be504eab3b93f2b192d64765c7b7110d6150f2ed3c0b5133143a2242070b", - "2e2b3519754f73d16c42e353775aaa172afa9869d6c287b229ebae3d5ac82774", - "e0aa6e0b6ab35c2ffbc06b093661ef2f9e9072220d209bbeea8452788ae25c05", - "bc44d7f8568dca2b6b8fc2cfa93ed645825e39512dd6ed8a0f7b09f5926c9596", - "6cc8964d87b3cac93671b84cf8663b1c8391901116064da803785a0fa99d15cb", - "576a37f042eb66db3a9165f51807fc397534bbad9d425bb6d3677ab3f575c0f7", - "faee9f74f70eb9dad18108903c0474e0797f854665937ee119115f9ab8b3bcf5", - "e0ea7414bbf41557bf00f33fd7b4a771384b729222b004f6316830e4f54b30bf", - "19ac6c6982d6612d3ff8fbb99fcdd3273a74548355c91ceae2cff5ad554f0c30", - "6010a9eba89c9a9f4322ab8cc837f7bb99e70b1030b29860704873a0fdf90b92", - "5516bdb360331d72e72178a6552c77968f2a995d64b43babfcec83cd670c563b", - "b09ef7c0f7c63d34f5f5bee383776cca7b2f2dce2e2edae081730447524dd99e", - "8205aaa492cea0de9efbbc2b2e30cf8f051eb3a6d52be89a14f3e4b5c619e8d7", - "32aae296c12545f0bcc202de29616e67681c5af074810a0ac3c9b56ffaca6bbb", - "9b896e473d80d990820e4bbfa668d795aa7912775394b7f29f854759581a4579", - "f72834cf47b5baaeb8539460c968d0f6d405bab72005130ff6cab54498f20f92", - "5e73052a35b4610c0515859b71b0ba5eaf409d1bdab148e03bcae66c8d3f35ed", - "3eb082d2c4c6c14985b48a6b8a094bd0f4d3e6898c3495e4783b98574a58a19e", - "e264b86a600bc219c3da06af14f9a3d72c306e7d1b6ffb3e7aae904d982990af", - "499be683e731fb7548fa440166274aac409ba431dfc3c7e74f71c2a2fe6ea701", - "5c68618b612f52f799da624960dfa3a0f4227e050d7dda64c25b66f51cceb645", - "616dbdca625718a02377c618e274c53292d69fe7b33dcf89fea041730b04fee5", - "2072c529b3e38809ad22e1aaa1fb4afc0efa3e56a00c0ccf434c9e5916180cf6", - "b4878e4fa95e20fa6cb4162c08a0fdf34e1b4b41f7a7e7c7670a288454974ba6", - "5f867ea666213b657d9125d2981a3a50dcd7b1e941d1a823600e71217849927f", - "90e596225724bac212ceb07dc7b96b4fa2f1396b0a9c59e97665cafd1c77707b", - "6225848c0bd7d4b6004463fe0b765ae87c860c5301b55d320137c3669a235e66", - "43c88ec41047dc795f940488ed2ec9734bf3a7897d7f04967cd52e54c5df9b67", - "0cfa1bac56a96e35274629bd1af328abd7775b139092f480195fb7336a300819", - "e0837ba4050969424199d67aef064cb8f9644c62f933c4dfd9b3ce0dd3ea8f20", - "e41ada755f29170c6d0acf2b7237b69e93466fbdba8bab1a9782030736261aed", - "953b7bbfa8d5fc90d2f42f57dd6c1143537f770391c28a7548dea853ef5972dd", - "bd3870ef2506aee8084146ced91bac2156aa7793f02b1cd147be6f1b3ba1f4b4", - "3a7d6b71666deaf9add614af53b687060431f708da49e2d02cfd6b0731693af7", - "7c2be60b80b96371f5e09cdf3bb0d673e85a01c02b52df06943289c922416e67", - "9b2e8ab5255cd3c161e88d68e2f2fabad563a697a1bf91e03c34cd9bb1d86621", - "de6b2dcc95071ccfc0fa7b016fddd50353319e1e3b9049db282650a64efcfc47", - "87699cc488d3d2ecf674cda9d0ea523e1df67c68e18bfb0ad576acafa093a349", - "a5c305dc6dabefeefa9c39c9746da6f1bb8cfe2f20a681e0e7b9e0746715003a", - "3da662ae46da57f8c7eb13ddd2bb33bdf934636af0440d0a57653e434c528a67", - "c779f9c87e8e91d17f60af806c27ae1bc47e362b1e048dc9ebb98ef597e4dc78", - "e8a60f34d426c6daa53dc8b19354fd4588c32310526bfa49ba7c0a2b42bdede5", - "a0d0bb8ec19e82ddb8ca5e362bcdfd2799fe3bdf2a645b246ca838d22851ba34", - "35f0894f12a51607b1b359d76702f27cf3be79ea538a902d6df7a4a7680d6c98", - "4da5434f5a0d0539ecec492ab42460007ab4182863f8591ff8c2da6b5a0e0944", - "a4c37856a3f19e673c016e21204943ce58dcd9455fd0fe8eff1c711809b99db8", - "26097edc210cbed348ca2fcc9f516a870523a44a803f01917a10b96d9a83a4ed", - "e91ec13fd4b288070755cceca36fd20769cc182cda886f9a88c864223176828f", - "294e2c463f748d439d5e3301bdafc54b4cd2329588fe230173c864a309741ed4", - "c7246be9c81402cc5736696d6bcd453f02810fee82fb89232e356b17eeca3c54", - "dd383f16d3abb913e2814776e135e345082b0f7ab0238e80d2c2d158b22f54bb", - "78e1ccb7e98cc58af831e981ed6407859befc3c5a16746f9943fb035c97175e9", - "deedf3cbcb5f670021299b50ee57598faa33988bcc9deb42b01a4089a4525890", - "8a67d1e9c2fb5cfadcead4c83b27e4a1830607d8a87beb9d69e2a688201dabea", - "ece60526e74951b0eb88a1486c63dc4ef782cd07e6c663a30eeae5a147ce2cf7", - "1f2dfc5e4b65f0fbdee8e9709b13f7d4f5d143bc1d9244450ff4a7999e0763dd", - "009762f7d15de626b02d86f9891a5906f689662469e0483c7b1ad129173f8200", - "c845cb626957106562e0ee95aa930bebf448b80e95c5915fb175846d8c2c6fb2", - "43027cff18a436e31069f674cde8b0c3d9b61b0de42ff489e800de51799b4e3d", - "d5e1ddfc30bdcd0a775f5a54f7fefb740e56b17eb48514e6012e0e17f63c632d", - "8781f9ce2e91cfcdacb8bf13de38589440c2f657da793060d29a848d3dfccaed", - "5e134afea59707c8bffa544ae8e2a95cb97d1645f840797d690c11cd5166bd76", - "d2828e7c988556349c4d3354cca8d2ad13ebe4a3e6c433213f8e637985fad254", - "2786aed2e13d43653a9c27aca35b4e5297c8b758914afa9ca2797d15afa4b37d", - "8291dd6e0f651f4e354e04091257ffe1e312a4db2c2dd4b52a1195f6b3204396", - "bd617b9584de04c5c5de0845962c2f72e349f1393c17ae4e5268dca6ae9feb3a", - "88769a2c455aafe7fc7eaeca7134cab88cc39f4436fc9f90ea57d54ed907ff30", - "f1be7f51c110d94a2d8a631589b9fa56e8c45d90ab5f3d0a2ef12fa428bd9071", - "1c63b68b234306d1bb4477857ca98f8bbc4b9f038a67b8bba4010e5e24f4e234", - "73b663d9cb060ebab061c7e2dca76af537a7b05221341d9ada4bc00ea4252493", - "bb5ff5272262ab5a9b7736c5aaa9034f55fc2c5dbf4011e41dfd80fcf83e186e", - "55139b777f3cf26675f3992c37ad6b5483503bb540cfde821e4f234a9eae3f4e", - "533096e6e5f96ff76ed65c6c1d71f15ff68e6f6de2011059e6f9e837a9e58f31", - "bb21b9a48513ae6355c110399e43ecac4d0f99155181b14c4b0fca7b4e4e2d9e", - "2d221c4dffba27d86073ac81ea1a401b6d6f8a8ec7f02bc1a093a307acc6646e", - "4babd50e3a7a0827f33090c4ab5f058ad9d42c2d96e0989f2124d68748efe7d9", - "a43f3d5e28fd12d7c13fc0b67e869b9fe4651e132cfce5f2c51e38446637548e", - "f5f3a6fd1280e120d089775e0f2cd20d59b9e7d80e51a953a70af389803ba632", - "3175ee1b6cc159a7ba9d9c097c0af47be3162cbc1239394ffd186fd13d4e1560", - "a55c08adb20e15ec07527f86f422229543aa6de3674fa9bedaf8d335be8ab943", - "127984396f38e05a899cce6e62d32e72e4a9885aa98a6beabf79e076af36aa63", - "a785f59b29b2521edf1c5079d7f5313558abce3bd84266080525feef76fa4040", - "5692ddba7b8d7cc2db434f40ab019a1f8b41432dc8cfd664973587a677a03710", - "4f1a8a07dd2547a7264191add2285a02c7872699344ab0f191fe0940c4fa15c0", - "2b9875d89b8344daaca8c828b0de552a8d9ef46e65db4878837146ccd93be967", - "62618551a4519f2510257b4a203d911e4f1bbc5106413fbd27488c676b7e8a2a", - "21f3c39f91dc6527cb415e03e0ed46051fa692f730f3e70aa400f6eb831a6609", - "380cd0f11a95b3bc71bd50d2f32595d290d9fd38cd6bb3af12dc3b2e9cf0d898", - "880b6ffbb319b40723796296b4a8bc4799f379046219d762ca69e594b192ceca", - "5f4ea9e0711fc65776ce1f3658dd3555e0e873c01fa933b03466ca13861dda01", - "e02ea1b7d85f15fc2ffaffc384fde7bd580ef23d86870e22196832bb84dd384c", - "540242d6f3e3bb9a8a2411d8ebe5681c4a5ff612bb83473a73c03498ae01c13c", - "0afdcafa9853d42fe1cac173dbbc08095e9b25c6956d58d84233f1c431fbdad9", - "516fb4ba08df77eafc22dc6ed9d22e6e038a9a480b0af72fae2a243a0b52eac8", - "3fff1793632191f49a74e483b1eb4dbc444a369107d066090f5c562f8cc0f4ba", - "eac8809db664b297edfcff5ec96269f38da2a1e2319c1b8ac70a39d52ea17813", - "df91ca7ea1c48387103d932aaf5583123eb8d5b92217ffe59c9df6dc1238c8d4", - "f75eb891c2e2d7364fcc38c76afee6a69ad89b3b43e4d84099e7e98778b4c5de", - "6ac1ca5d52a0c75c40ad39ea838f26278b56b5879bd569cfc9617dc7eb37e5e9", - "663fab8c51d7d5ccb98c500b3f0c337b6350552643cd2189608002dfd4849e40", - "f109dfead6210df45f6492e39024684cc6a59490fa26c330d12b86cd2619f0f9", - "ffdaef5100f30ef0263ddc856e03307c2eeb9665d321826451c525837728b323", - "d40dcfbf29ac7bd3a646ca601be9fac779c60a1f5d0a598d070405e86cd63dd2", - "3ca471ea2706930b8cb9a77abce2be528f0cc78ad2aee49e9baa092f9c4f0281", - "3e300d0fae7e96817ee902905ca6241019260b2c9abba7d55c92cf68e3de49a3", - "4796ae38f027fabc86ab2791072267a500d69bcbd670237e629f61e83a73abd4", - "a4b7bfce462e8767a8c327f61f289b13e1eca60722dd20f9f760754540cfcdf4", - "adcbc29cad90bf6020a58c538ea16fdcb1a40aef3f82878d7df2ca074fd09b29", - "0a5190ce379947796f5868dab138afa808fa9f4b0964c56adada07f4881eefd9", - "f8b9f5cfcaa989fadce6e808bb06e56682b34cc422b6730569d41509ab8f0cf8", - "f516b689290e2b9caa7fe58b596123c7e13b7330553acd5c53bf5ed828a39c02", - "0075db0c396b60e9e286feef53fcdca076724aa6359434c6a4e713a47552dbb6", - "e245ad660dd40e4662d3fc7304535f430792a23079b9d4b45a6e2821ef2e4c32", - "8ba0b28a25ac42b07123d8195f4cda82777c3394c0aca67fa4970f09b6c3569a", - "2da3e0905e1a1da181274a9693880f1d60265058397c3dc42b034690315a8ed8", - "d84791ce0a06c4c875c24ecdc3e7af8f4102e0cb0d35eb23b8637324c3fdbec4", - "4b43e41d91b706c336af18d3745f4a8ce39fabfba9d6514d7f6deb5570aaf40e", - "1f0f278edff7db5bb43fc333d1d195603730ab2a68c2318640ebaba0c6ce7377", - "a80b2331875e6439596adc315102271de6ac1619ff99ee6ef8c21c13dd6ed9b9", - "04c7466ea19f3c1754f42fc8bfe825b550e9aee041aab9382373ffd61b5f73ae", - "dff85041a9526dd387ca025070bb48b074ac5cde742ca9cbb498e3c4a55c134b", - "0f78b489e4ce20e2ca938b15f7d534f63636530449b1655ca4fee7e8db1a2e5f", - "6a6900c9c122ec56c27874226e6fcfa487ecab2a1fc6ee93271ffb45b16ae6cc", - "3a700d3c5af4c93d6aa987c86a138ff8b1e4ea6d21601e6dcd553d369961b66a", - "7d9ad40b6cafba198a0c31fe5b1e8d8a7396db9560fd86ecf8538257c40c7209", - "e63e367dbf768da7ef1f5f5b92bd2e5cb2c2b5d23e8c3b30250e2b2c39ebdeda", - "83f4519bb64580e94864c80d7ea4464acd6c6076409b2cb041252f2537bb7332", - "9616f14bc8ea62d72fe2e25c3657549385a1222050beee55232cf14a66d03222", - "74e2f3034a78a46f1099cccf8353b9521e342688a7fe70a824f923db48e85e9d", - "1c1421fea68077861b75bbec2c5ebc831f9be502a0161651b76d4614b095c277", - "7096b7f8d1a366f033074dfcfe34547f9ef636adb5b6d8baa7dc0f5e6963261b", - "0bf0e6403a07db7002a96cb4524a28c68601cebf4cc0f7bc4db7ea743d2f9c59", - "002fb7223a194eedc468c649a7022489b0acbdd578f1c26300bbd265c248a546", - "38a259efa3bdf680e1538f72879e10831c400e2d2b56121071ba027d709e079e", - "4507748aa610e1f4f2763a04aa386d6d549bd3415a720d22738fd2b44d20e128", - "58e3414dad9aad1e02b32d0e21e6c4098c2a0e17e2e3deb5bb7c1a98a6f7e2fa", - "33807fc3661dc35a8f3534d44c874252055cb9f2bfce710cba0414adf481229f", - "3f2fb0c388f10c76c859c1235c7391f3b041c5e35af9a69732bd4d65ddc1ff62", - "3313aaf94344770b115dd5f6a21b8420ba0f7ae08f8813f0ff2d26c7c2740211", - "7c61a14aacda71ee036ec3717f9116cabbe34236c5318175c3b04d221f0f37cb", - "4a038c23ae38d27d34b2fccdd8bfd85ac64c1b0118e3fce229c980c0c0a774b3", - "b86bdaf2df0c66fd34ed7989712f9b0ad52ce68fa551dff60777329046e2f8a8", - "62f909e5bac5f4711288443d59ad2c5b8e26c8b0dad95dcecc382879b7cd2343", - "aa2801fc8cee6466ae805e025bd181625bb8731fe743572aa655041ea1408b1b", - "899994172df0b33da13dd785f4aca617065e5d1d92655501d1d05765060b279f", - "0ae33fba0c9af7615207750ae2ffaa06f25f24bc6487e08ec2f6bf84254b2975", - "ef548b00ad639f4505bc8a10758312e86fd4418dd5fc97c9638238ed117462af", - "25032d27ceafe301e0f4e43239e505f7d9b688c7dbc9ff377b1e392f0143115c", - "3171f9eabf659d55d436bd47871ca744b14c3e45828790e68c8bdafb65149fa9", - "be4b6217ec8b808c212e3723b4cb82b2ca951b6f286db7cfd10d6f9ddec60dd5", - "8f036d6bc08d703138aa99d627435e0c1c442d35c732244049f8c5791393cac8", - "0c36b6a11d39d6c3a862df78e0806f0f17561926423d067d4855f538ed438e08", - "f402b7ab185cb9d3bb84b35ee2b8065576ee1ab843cabfc98fc2b737643e7a86", - "8d72fb97e61d0659b3854e132175d3047cd9f18427cfe63a42e0a4b25fe62b3e", - "a401ccae6293133a66b6d91caf54f6c37978c54c64d81733cf35424f4c6afeda", - "5aa525654961be5003d99600f1526eb6351dc8279ac7901d8e1f7223e44b556d", - "e8af4756314bc18e1bb293a3c9df8fe20d734817f71f8ad7e74960336f013f30", - "e560763417f38f5d9d6574315f5dc3cfdfc3ba3e3f9fe898360fe4848cbc7459", - "71aca6e4fc5894139b757accc99ad974803f7f9a7a1c80365d67c5f790f02686", - "e373b28fd1fd52034d5190e161af5eb07e8d59cc567f0db89079ea5f657e2a69", - "5a60dcba2633b1e2aefd85ab107086728668ad835aeb997a260158b099bceb6b", - "eebac3147321014d2a63b84e040454f58d9e9d4734e8ee3dc535e8602069d37e", - "b68202a94b58a79e0d85e019e1ab8ca1f6027269beb4d6151ecc86edf299b9a8", - "1f9a93713fd5fe42aca11e9278e3e155200876ded4b0917f8cb5facc2d6e28e6", - "fc018226c786e29f303cbf27b081693456af0b04fc783ece0c7a66f33f7fd95b", - "64c800a5d1b45fba7b914bc91dbb40574a5c3bb3ef94c9083912fb1a186e9904", - "3a9cebe7088a3dcd146d6c91f926139ef02c7a081ff1aa577ccb33d2afdbfd87", - "db4007c03f2afbb2d00f6eb24e7d2a68f3daefbdb9a57d1bea377eb8e1d26aea", - "499a68a6d804147e6de61589c0bc091688da3b5440a49587cd55fc9e12eea510", - "fd95b2d41d66188472debbdac2fa70e539732edf4cd7f1bb051a08c5f1d5749c", - "82e354c05b2fc06351a3d6fb8399454ab95a04e79db19960a11de7fabac8b9fb", - "518f35568ab84d9e8442195c84c5f077e7e0f949be6189251e93bddb8a2b99bf", - "3535bccb4485c4237de17d2e4f8ff1a331af921fca62cde9f8a9c5b15360b7e4", - "47a115779a4543a72d372bcb769f9f89f0423d0094c8ee74cc491f323d15b21c", - "e5b3b4fef867f135822165d11dae2fc6aa0866a97e077ad4d4b6ca58f081b4a0", - "ad13ca4fcd198b04fc73f5d62abee0e4447fae12ddeafbf19b83bb5790730864", - "2a2a35868ec428d4d6231f47d6704f0749d2812660a881f2f3a5600896c24a88", - "89b10f5cf13cb53f71986c8d73b504283174187eb4eabb24e4c42dc59082369c", - "317235a6412d00dd0f938fc6b7603def2037eacd7231760683f731dfff820a6a", - "ae490d1386da1f01d95d36cb5a1dabd51658a3731f6af679279ba091871dc62b", - "d20673c401bce9ab76957c9c942596d9d1689bb8e3bb3969152961839c35cf75", - "313f6060aed33b77991a3969973cc9ac66b961849da885531d8a34b384f56880", - "311f73c2b3c04b5f494ae22f226ed53c2b4c1adf6817a621bc1dbf81831b82a0", - "718fe3563162af7c5ce74347255fdce35b841d98193fedd03d0412cc35fd1393", - "449960f176af6346c0d8a97545c57deab25dfbd824aafb8426d8a6dc2f84fda5", - "14bbf5cdf5190e004458115a70ea1b790d858cbc9fef90563959c97113458fb2", - "b28bc2880f88e6c20fa3e5d1276738ef10654f98f32f55e0d45de6138538d9a7", - "506980a7f31b07ae81e8d2b41964ec569b096e36b5f6b36340eb440a73f1effa", - "f4e0029b6572979f86a158a39dd72ff2f72177820af05e8d9b6dba5198608c75", - "ada942224b359cd4266e40639e84da8bc13464ce98765f3656b9163885e748af", - "40f7aef6c8de3af298f37ecd39b610c0998111a36372cc5a4b6d4f96f71744c1", - "6237368d40a77a154af859b2d35ee4a03212fc46f99973a14b946eef7bfdeaec", - "5cd2430f97439f15be95d125af837ded7ba31fd89faf244860620dc8fe532bad", - "363e0dfb6ce73f5d7ca736a64b4ebed5e9cd0bc5f80bff156a460fd59607131c", - "c77292e411ae826819c0f859e1ba2dab8d238ab3cf146f5cc7a2c173241a4fb4", - "1dbaa821de485db98c42939bfc6551bd86485a7a0f6133e31173e3430478805d", - "2f118450d13861cf651a60b801b4186e804e4934113b7dbd8600bcd1d3664ed0", - "d01a2612747dfe1d15b426314a7eb7e7d906afefdcd21487082bddb22b377f6a", - "c42fef9bb03d89048f6e52e89574510dca23cd09d14581edbe4dedeab2d9558b", - "1641ae82ca2ca0e7ffd9ebe4705b1ebc475e6e383afbe1bf748f8cfe1a0eafc8", - "5a0e2a4c3d0d40edc56365dfc267108b795f4f80b4ef1b8dedbbf8f3ec982913", - "02cb6f757251f35a8f021403fd15120403cec9ad7ac62dbceeb2142731dcc601", - "41a86e79a0297d599bd9b703004cd136d71ead154d6d5d1d9c3070d189d3026b", - "9ce922f1dcf9e0c0dd8cdb8282c467efed207476bcfff52e92d13c48308c9627", - "4df91d7159cddb0e03335f601f6428f576eed0acedb7e3e42b5b3386bf1a101f", - "1ba572fa6241be107d1fa77ac1d1015dd03ab0101951d4272298ae4a40fb4d3b", - "7d93561474548dfb842b63f25cb294b4104bf35ee35aa55f102ba4f3db20d892", - "474b1873bb85d5d83ffdbc8f2d527b5d5750ced117e11a73f42df6b6e48caa75", - "6cd6a8b4e9f5da1a544629bcc53ff165d7c21181900d8c9faf4db2d127bf4303", - "60a1f89cc9eb2f1c620a3ef9c4f5bff8be2717cbf30b111c9e0efc15ea113f65", - "838c1b37df2e6aa3ad834248efb6902ac59fa6d3788c0b84fe3c478b42282f20", - "8ca3a077b1084829bd856b26380413fc816002964f142c8b9c2d8e741ee73712", - "bab6116e635fb716d71a257d5933ee35b7aa608d023947e78d779f7371485b36", - "f615efb7cea7fc61478bb90e96d8542ad0f4ce90b8c25da3d197166de802f588", - "4051d3960f9b17311f380fb31ffda155f6e9fc958e849c9677d16674b12a9b7e", - "63f6b772bfbf6355c14335bc5a4e285c1e90b57ba853d5227534b9e61e3cdf23", - "22782eec8efb1ff6c4364a15e15a36ca3b54132f346b927a4a0d60de137adedf", - "35ad5de0a12d7041835b06b05f6385427c7ad4c9248c69b255c9f3a27dd2d3d1", - "3b9838aaf72d48a86223aa064ac19b97c1f21494096bc1e27f800bb7d6c5b5a4", - "07f1ed57ef4778199c543cc544e043afc01ef0f9d8a41189912fa4351a8cecc7", - "958944b6131874fd3e24e823345aa0d73c31e2ef05329451376a139d3165d8fc", - "6ee7df7fef59cca9d3359042052947067a111857e9e62ac59fe99116fe242e0a", - "030d562739fb791af433d420ee769d47d4aa84c48d1f7aeb05600fd38387e3bf", - "50848863666877a0384ba8a7eaa3a7a7452cf0065a0169105b9e7e77c9f3e2c7", - "f45b67e4957ac6ab21ab7a4d961be13b7c10f8b652fb121a6b74d39a99593329", - "3e21d364b725e93104505e22c312bdaab3e1f11ca3859286dab08d67e28da88e", - "58dbda3930b9ce4f0d89fd560a1f2cf194d06f4c02d9ee4aa6ae10c50a4c09e9", - "89b994e7b82a8f90241254cc48b934232e2459b8ed53f65a97bd5f5c9fc45a0f", - "9e1809f0db2f507145224f4939a51120314259f21983a771a7ad145b607b7ad2", - "abd811497cf36158439b89acea61ad8517f4beee8cb0faa2a1d7176e156b74eb", - "ccd7de6282b039ec1501301a9f2494d83692e85ab2f4ab0ba0843b0d149b3f55", - "1f04d86689bde30c84c432a8c3850764490b084cc422d8df7eb93d275d5d742f", - "312bfb04effb97059b2b464eba0267a5c39db1021833a4f01cb4b7a6c32a3a08", - "52666f9d1c8a08b5fba59ad1f2e18487734290ec276ff4985212219eac405fd2", - "360afe3fffa1525b82726b621e48de49b395a9a6bc9646c0d506150a3b8560ca", - "32d4786cfe2df2ebb5d9be1a55ff4b5e94829e0bba1f17e071aa3f9f4ff9d899", - "cc893db4e1b866c670c7c49ede08b09bc8b7088a2dc8056679672c6b5c5c3da4", - "81beeeac27a0f75c093aa5d1491202a1f99c713475a1abdb84a9078f2123ba01", - "663ea498674d924585b78f73f4588f739b824b7c8c7e2304c8c39963bbe19552", - "6cbadc51da3608008232448c58fff6adeb430d08dd3323d32cf537ba77aa1e7a", - "9463fd4a1ab769f9f12b17c21506802c59131ab3284db297840c0cfc7e08a0fa", - "a2f2a13210aad7550450449811f13f0e34d1f12a41caa48423ad2394c5cf24e2", - "41e2e8584465a367459464987f3e02a60c8c91272d4210fc2d6ae43db066e9bd", - "a9833e7703b9a06715886eca9bcbb0a02b186670f999c16b4e5c1f9abc644c4e", - "5a48c8fda0d3744379d9a86fae2567ae927adcbaea360e094c1489de5529723c", - "c46019c43971ef2bfab02c0b9070e219abb2b985226189325b4ef1d28c8af0d0", - "f3dd1f648ad38855830820c1bd64ce641704c7ffca8254e3b2a2a938856c047a", - "25e84fc18fc616e741c3f05ea1a9a96dc04dea654771edb4630cd1cd4ce0a60f", - "0570a66433a0625775287a906c1004cc5a6db62617ad720667b4220d1ddd6dfa", - "3a275c4ea3ebf1c74e2e7e2cc884a46a680a4c167af78b0d242fa55f17e87f6a", - "94ceb62af512d48ea9fdbea95c7437a11e2a5b167f76f94730b4dfd5452d99a9", - "8889bfd6e95786157998969026029f41653f66e597b2e29e91969ac6397b5459", - "432b543d8ae7b6acb3a63e330f08fe597579fe84818d768c0edbe139cac6c316", - "536d52803f3bd5c57da44d8408a6e9afab0bb150fe1edd9531f2f58d3f04039f", - "5db14f862eb05b736f8b1d3c06191a9daac433a550fa38d8f3c0aab3e388d30f", - "d88f092f9e6ddd006af627f5fd8c85fdde3de21395f17aaf5b8ed1906cd6824d", - "6cdc84b6b02429c54ee963e9b724caa04f61b37187ea622aea5238e217a554b2", - "61b8f8f0d0ec1fb406e6aaf5a2ebd24d23ee760d758fabc7e16230b9df5b03d9", - "281d876ae41d14aeb162f93941485154841600c23dacf50b9070c9a03102554b", - "35acec03a2c480f7a2c766707d3cb194337ba673d2f556a45366f1d1ab6db451", - "c6432a045b0df0a92835f8cadbc538475373423ff88033c2a92860e01311e52c", - "c565d061d532ae47c0cc30f40cafa3faf8cd6607899603b5bed99aa20ebf15e6", - "231e489e0dcebbccf4c2a6e829777bc80203defbd7e5e3c6be4d3e5415d4df9b", - "e84647fbd04a81adecefaf7804a18a4578aa151781de818c95798f562a1e3839", - "b68dc08c572089eae7e34fea80eb02e029a814dafcf654461b471dde532761cf", - "84bf06641c6b93968a4d55290596a115d9bce7131a190fa7c12ac03b10b95b48", - "da3f8ad7384d035c1d3a8e0380771b5921baaa6f82181e69abb0e00ecea36b22", - "343a4d64581b1779fedc701a31604219a1b44b7c1cfff48a8cf2a1e72c02edf6", - "23a789f1b74c9fd07c7d62871b52f2003959fbe214c7deafab4e954a1d0c396a", - "0126e9d23c133629be949ae2001e615a1f96aa73bf7de345232ffb38f64acd4f", - "9ee2787b33aa7720dd985b4a5f43254266b4e2732fba250a974d587ecb0e123e", - "94c621554ef43cada56175a8bbece4dac087482ccbec26dfcd98a1d95337f75c", - "d717a0ee83dea77e882d46fb05546f3199c85fbe1b8a9287fb6f905b38b46cdc", - "7363c30edae9f8e914927e4be7801c21c2663aed5dddcbc4aba052a6c43d61f6", - "d792b4e2d2ec8ea1499d5ef8b6e7306427c8fcb59b7906edd65c9539ccb5844a", - "45cb7d64f6d3bb615def45ccc257705d41789235180eaeb2c7c3ac4386956b91", - "61155f897b7ec29fdf2b4192b05bf36c69b834888317955a88f1afcaa636cfc3", - "654dd150593ca4a59989bc60348b6eb1d0b6d38a7f5b1d9b2cd0f46b151d3a9c", - "cc0762b0b55f4251411d72791aecb1b0bd99b579e7a28d8d31ec2d23b2237589", - "361be8f8bfd5b2c03d9e2c47b5e29e7ce065c5e74096c9e2b89736559265fe76", - "e8ac68bc16e6b8bdf5d78320cac55965ac88b22ffc88d0d5e05079b474b179e9", - "2c696a5c7f4ee87921a5fac169527d61732f493a59d7db3e5773f81fd448cb74", - "2d167f475645202dcc990c65f68364f241a8605761738fb268cbc5baafc8e0a2", - "fecefa92ae6d722a9177f74e2d652f392fe29476ea3e68d710a621ce271c78d8", - "c4af1894102140051441663b0ca077c2b33dc6ef8c66097ac27f6cdfd667cdbb", - "9f6172b0a120b603c06f33a2c6e73b214ed50eb9eb5f9501204111f3914761c5", - "2ca28659d4d045b314712e06c9f4c134436a6c339cf3176abc88108cf1ece0e2", - "21f2205faf979ecbf9d45e26f2fd2f0a8c038c3dfaf4c008749fcead5b1e37e0", - "dee30050bea18332eaebdcc9a542c1d99794d6b6c38b46c58fa2b66a070da252", - "ecb75680c55607679f2c7b99efbc3bbbcae5d6352f33f5f46a6875439fafd84e", - "9748c06ee15e64ad37b2c4ac3fbf6756aa0442accb9c99af6528a6b1e049f4c2", - "994b57be8f931f8b9d43a7f54107a5192e0399c66b059ce94c3890b8cf1bff78", - "fc062146197e6ca7b7730ce91aa2b769b269496544f301a9c85e71785239ada6", - "cbce3048eede49a53c7cd73aaa1e22217404af079e11210d8eef1fcb1a0b608c", - "78644f878995aa9c4ec57238203e7b55b9ea041198a04179fe3547cba9dcf05f", - "22b472f37f29c1ec8c56263eff6cc11ea1351e83950f672e1477a5376074870b", - "34a2a2eb5399e0805f5de5e88e7669f9fdd806bc7c049953f9ec8bce6c96d208", - "85c9ec4080663699fb9b9dfab9fc97cfb4b805291a490924c3bf339f60171ce7", - "6b94bd76b477a083789cbcd7e816d6e7408306da4daaea75b452f90b4d660612", - "756df9ae245703dc744d9faacacad015808ed8bec911d53b2825c82e40af203b", - "cd2b64b1330c3b984473da9327a6db80fd2187766ab2f2f306e49aaae924a788", - "afc79fed92ab32e33011c97fc8d3378f6af040a739531d8d262a269c5873e1c6", - "4c9ce036777a35a267baf63bb1563307bf6743432528575cdc351ebd44c0787f", - "00c3c0e85319354eb2b1b5bd37c83f8066cc91ef4db4421b5641e4587d3745ad", - "3e5a4c127226fc4867c2f6aa5f1f933130a6df087916190b8b739342ea656b91", - "db78616eab289e4ae3949187e46e3e6953d257019e4fef9ca34fe00cba429ae3", - "aa68200fb5f784905d566bf4b99eebdd958b12af8d6cbd5991dd3587e6367fa8", - "e82596b7c856f94e82c57e428677c69d8f6262c1b1c5ee07c75e292b3ee79d31", - "559558f0d0e77652565cacf5d012ef689e19335adc2ce877cdaf4a5030ff744a", - "66b187dbb2b070669636ca877c05cbde149309cc6964ec6b82fc1d45f00f5373", - "04c512148e3196b5b0d69eef6c9bba47f7fac4ab2a93d2994066f9fdbf2d9131", - "c73f4e647755524e758880fa6cb2a44eeeaca29ccddbe5d5fc8ac296538ea9b1", - "b4e726a58dac0f62b261286d12f395e2951d86ab9b93e1a2d4ffaffbdc4c8b8f", - "1689b8cdf373618cabb22adc5c3ddf3d66c0bf011765cbb5db358c76810a4021", - "1b073d3111066509ebeac9465fde3e44359ac651dd1918b2e42b24a39f9519fd", - "4a525a46d9a8d87836c7f92216c75019ba21e01ce72a2f9c40c879405008a44f", - "07d1b20f866982fffd2dc514e09d075da18fe41f0d55f9f6bc3fc8b0e1b8be98", - "6ba3d674fd920fa8948114c6a4276cf273b183ca84ad04525cb00c9325759dac", - "1a858c1fa0fe61051d9950df7723ac2670d680914746d21f59647ca1ba2dc5dc", - "d6622e9aaae8d4c957c4a92ca1631fc36e6ea1e0c78cd752482b4c1df709b974", - "bb3b9dd98ba4da962a52d09b669c2300a775cbff6354e8cdc6b610505f5edaee", - "fdbf21cb8eb1743fffe26ed3803240c23b025bdc696c5ae0d6d3cf2283996fff", - "c6993eb008f33d88a5b003f5a21e86ca852c5d106df3a9bc34c2f16c85d11c92", - "c5dc7568063bef9cc9aaf52fe4b37de6d3de3106272e4656d1bb6e399ba4d274", - "411dcbdd68f17a0e236a6566865943f9073b440bc10f60122d144b3cf718799d", - "45f191506db064c309e40902cbd2e2e7b347caed22ffaa32f0d733e598e2a50f", - "8d6a7f305f21aba016968750711689d5e9521976d008006d22235246ffefc44a", - "c16a05a1447b30e1a272d5f7c2d766d985b67b08074d024a1005209134dad2b0", - "a5a9cbcbe807d1d5b3867484e53b15911079b48fcd1662edce4b6900550cfca8", - "a38fe98b8eec061e6bb702d863d8364e11e3e064fcfab0898c09c248e9d0082b", - "a86ca95ed926184499084fe26331bb7b79bbf1718c5cc0d691f2ef2fa7bbe581", - "9dfe02fbb0e32c7859aa2178060cc6282c4f40ca8c2cb23fc0c8e0b578a03674", - "e9c1e962f983c3f5be7c7761cab30e818be3bfc86974e2e34ef75b6e65112b11", - "087ecab5af3482cdd77565db7e192cceb3d4883234d3768c1755e0705725ccee", - "63c9eba2efb0d2e86aa92c7e92967cfb2c27a13ede50a6ae0fbd5a15cbeeb22e", - "ed4b7cfa8772ca237c66d4fcdf1d169d6f248e4278680a5d478f7722e45c1443", - "874f826a818e4dc0e6d6749f07412b530684bef87e44b8b5cd91179ea4acac1f", - "1928648ad0d44a3b1b868b7e712b94d7f0e6e8ffa3cdd3ad4f4e71a8073855aa", - "8db586bac2ad70a837f135de4d16ab8efe0708d5fbcc63ba704fd1d515aed2b1", - "27fb955f9d1dcfd72b9f0ef60a430a55781b569f6155bb75d9faf49eb7809ed0", - "eb913bb3dec9421c7773b0b82799f0268fde97632fc00f1ba3b37eed45b0b767", - "54f71c2f1950cee5633c73482738a9b80d7e1938d2f0029b9ddeec77ef317267", - "4799a41207417996b7dca578c1af1e58cb71dc56c3a9de7e39d9bb76d8643e1a", - "2ec7b39d59474656585e8a849db6056353d5fbfa7196946b2cdfd5057c715164", - "50f6f054bf41334a3c352608e328d05bf89ad87dc72cef5d52d2a891fab8de60", - "d06d5dacb287b464e88202765a1b9d511f20ad751a3c8cd75253d1c66f19c2c9", - "68bbca67bacea392918f5ea64ec1f1cfc6fe41338d9e27869bd7ec15c94a0582", - "9c6b27c466cbd8732f00f8249031bfddad9372d5acafe13785c2427e19bd9a65", - "235431bc167d9fbfa00e5d3809cfc4ddde1d48ac5b4cdf5deb642578151ba994", - "ae16d32f905a2652e5e2eaa78defe71b72c45b962a555c7bd91c4de381279612", - "46e6793b0b35c8e12532306a8b0a9fee8824a9e52ff0a8af3c8bb757626cf0c1", - "8a6f103ac255e393172cbf2e1f8024d665ca1ef3b52701ecf81b1564e4eb0b7d", - "f0f17d50a980a1dd4e246017b50552059d6bcc6250d728fe810f0eeeffd0ff02", - "88a439d427d67f17b96c81df83c5539333d0230a7f990e08cf23ca08872f2cd6", - "5036f15e35b6c21a2e04c9bdc25c1f057f33aefc9404f0f8455e86d0277e3ff9", - "fe955a19c6cb780156a13600b33f490591fe160ca5abd9891e3eb141acdfbecd", - "52cffb12740673b3d2c22c31608ce48f61d32a6ac9dde5eeeb52a29470cedba5", - "9efc7d86911e67438305f60a81f08063b93379f1cf82052dfacfddeab0ecea8b", - "4b063329382a734d6817790683e6b31698688adc89915e1ff1f7a5c2e0d7a0a9", - "9a51e7d61ae7289d99542c17b9dd072816c6832b321cfc5bd22356903dfdcbff", - "f2aadc51aa9a6013530647617af86ccb21d85b4db36b2c4f6addcf6cba49b13a", - "6ae9b0b73f3ee8a874467a5b4ff3236b4869c431e167186229fc24af12e76a11", - "3514d3fd69566b8bcd8fd67b07c7f41eda29e5bd220c51e7b9818577aadf14d1", - "53821236946615af2d5bc41bbace20ca9ff6394284dccbeafcec215616fc5f3d", - "8feb8f3445bae18f0370cd687685622fe8888dc79f59c49c309d7a5df01d2f6f", - "86dc9161889104069f238eb436e1528d4b6462ab338a07a38542d5eb96be865a", - "de4ad887d2a7113d5c9bb01ccca688bb1177c193b592026f2bccb3d178a242bf", - "974686da9b2fbf0a85cb12aacea1eac13c10f90d7be85251ac31e7a4390a2b5e", - "82b7f8c77ef2091a66b53f5ea8941f8329b5560aafadd147396c61acb6e7d317", - "7a58f9708c6ac1008c6034d7d0a9034ca26806a9a832390f01dbe2b0c44154ec", - "d180c95dc6290ba45d76d80302bbb26ace28d118f1fe533199fd9e3624181067", - "670018532286be8d27a676bb754e4f9cffe1477b30847e1561d0f2860b751723", - "0884beed4b727b7f51cbebab57c6da50fce7078c4ee0a6c0eeaf503a679aa73e", - "2c9d38a4ddb1fb78169bed6783cfd34e13ed13e29f5a0c14df63c57ef1660dc8", - "1567743965a74c849962b08e4ba8c94896c4dbbefef18b2f3e354a0f10626c8a", - "1bf4125ce2630038aa122798849f740a11666a5fa308109e8a795085cec1ac20", - "2f79c7b2f08e00071bda7258a90282294ef71b75cf4c5c1aca272c3077b672ad", - "969f7394759586e35738dafe04a3a682671b3bed8539f9e2641008c4c9282aac", - "4e6bdca23fd429ec90a63c1b1ed7c000659ff002b54fbf343b76b4851f28b133", - "75854ecaa73561e072ee55e1d013b1ea492fc9978fac44b10858948a55379501", - "56c024a4e26c2f35f2ef1cb39fc5c07562e3ec8786c9aa9ebd1f5fb4f694f4d6", - "dd47b7d5feb1826c4dd2109cd541e6a019dc858100b5d16058d4ae73c7172e46", - "778001fa779aad56bff070c7689c06544cac60dbf229fe68d5e3c052e20a6abe", - "ede0720a2a08da12a61a7b38dc913c79791df7a80a9c5685f995adfed243bb23", - "263ad8fc1287bc2878509e5a77d41b8e0581d0fbd9f2ef0f74e65d59e94dec1f", - "a848aaf782d72455f73850a06dd33511a7f81e69f3d12f6afb8da52190fb6834", - "730dc4e24dcbcd8274a1e905c309dae5acc7f3b33a1ea00cf516d6e0e09997f6", - "87dc4e1af49e0c13942da4b776dd9852800dab8fbd061c1662811ba4d415a9cc", - "1d9177f406ac5de381c09bae06d9de2cb2ab72d3ace966082a9905b4044b4476", - "966cd5ff9122b5b670b04128f9944faaba692ee794d7e7f2a99c8930ab5f7925", - "6679eece47f6c91885a073f60b8e432c0675147f7ee775fe20162491b9cf65c9", - "659fbb18ad69fd1884cd57d2b63a21dce31aca45e393658900e7be4100f46352", - "1da2555871c07aafd3b9962cf31ab3851d80632828be10edaf689f1967c8d48d", - "6d22a1b4a16eecc5f46009f6f7c8e014e96d7b708220c774a91f403391ec08c1", - "8e188f29583978bf3e29f18ecca3d540e9e55b7985e979b6a0169ca175ebe396", - "d0c993b4343c95e9e6ea5b12ea860aa80b9901f3c2c5f6ffb4cd5b6d614f8817", - "5618a406c7f4c933803f334f5044787ceaddba2a9a20c263b801b0008eec5784", - "4c6126b905fceed09c9a7f7827af3dc91698a55ef28a53b53a90e372d7bfd17b", - "9c02e376f63c6d01a7588b55bedeabf8836099f32c830d6ba5b54fa7404707d9", - "3b2a3df66736e34d9c01aea38a001bb777ac422ca596bb1b0990fe72f366b30a", - "49006adace87ab400d327a418ffe1b6084d25809b795a35afa16f5e6fbae9aee", - "8f38fac82a73dbf3a0ab807450c81a0a50a05c330e1afaf61ae561f84a8409f0", - "bb9bdcb06a9913b1bc386f3f9fcbe32a9cd08370fb444361cfad2e794771c5bc", - "2944c82b581fc827a9459a5e8d149c44922afca6d1e2246e21640cf752f0dd28", - "2d320b88cd9f972db0afc73e79c926a409c978e3cbe6508eb3adb7b6389d4c8f", - "ffe80ebc1e81fc6eba5a3b5af3222e8e2e24e4ed34e70e92bf977e97f8eaf544", - "c0f6507c107d73087ae147a458fd42cbb6c4f76a929adf7ecc73167c9d5f3e74", - "1c22459635dd95eb730a7933a3e861a32c311d7cc737e2e85166ed86e9f714c2", - "f39e7fba3033337c6ccac0842fe98e2817b7dcc11c1f143c02ba5887e7b3cc97", - "41921056ac31a4832530ba41e50ceb2f36128e215bcb938ed1a21ab84a7b98d1", - "b266e9d7c65815c86c69ac3ff89f4c8a71f5c64ffc057f703d5ea2d4a11da1e1", - "cc1094e6d4decb149a658a0aee0ab3576d5b656b47875b0bf0f75512dc9d27a4", - "54d524b1b8a33b36488868efb204c92b932e3c0d50c87ef950cc96354cabbf47", - "5050ffb510f10762bae87c5d97afb0fe9e8aa10ecd77e240184402ec9518a64a", - "d10f683ce2107c463ff7e52e37e5fdb92d668336beabf364c3bed03cdfd95930", - "fa27f0e580be0e0576b0a7354b1f8bf7be8977f8deac2fcad88ee586e5863fc6", - "18500ac8cfd1a373d03134e43c1311a76580cf4fe05c7ef193a22b76986671a0", - "fb7d3411d2671608673b1e65259760d14cb3945e84219de43a3b86a3c968399e", - "a2e62e84e41c0113a9fdea54e2cc9015654b56fb483a01c3dc4f33c385b79053", - "cb806f737e8033f97e038c22e56b0ac3290d306584b744a9508108b847017cfa", - "8b45ca64cd0aea1574da5912e6cdb3e00ddaccf2a8d7530ed70283fb37e35025", - "90ab4e9a3f943f4577f2e5a82c0782afbb727f89086cd367ac601c0397da2c89", - "ee806469548dc7d42209dcd22d31ae13fbc2c906951cc8e4a7cbbbd8b6beafb2", - "f50d1c6774c07dc9fed05b2636c5d443b00868fc6aeb6b9e70fb56d68ae09982", - "57cbb505bb6ecdf6dd5b332c53fd15ab0305ee5cee54d3c8bc53d1c158602fcf", - "d34828fc3ebec979a26059ad878a70cfca74f4c7d096688a8df65ae666d2c23c", - "89ab1bee9b73e295a285fd6359fa4bb6175805a6ba4aceb9931762a74409c4b6", - "704d4ca395b9afcca47b6afcabc52d0a19027426e26b51b91a23a97b5ebb509d", - "1dbfba57a014b368ca59a745025cb0000e29285e14a81246534c9d99dad6ba3f", - "9f879968d8a3e9c29f52d0f44e0aea5ac0912aaf83c761587ec63ef2da9cbf0a", - "c1e0c743a76832c56f148ecef334e11ccfe4374566825419753fd867d7894d5f", - "89ddf1f8081fc4b8e270f1a232816e74cbf11363b3d449e555faf3fda9a4d86d", - "489e19196f77785773a4e939f525c48a6b8ebb328a31601425047e8525a5efab", - "6d069cc1abbd18c54410812cb8169aee1db6ccde09208f6413986bd4f66b0f6b", - "4c25d8c2d8cf08bd9c95d57b2836c4bb110050c5606b0842b511219192cd6f68", - "02334aa70707b3b032c41919249b683d1f8e01540572e8cabe54468be8c566ef", - "c192f801615466d563626642f194176ee53955ad03b8253f7e310f26161e85c5", - "ab20d2553dd4ccbd4fde6f7d9945483a0d9bed546ecbeb1f04f601aaaf3c8f22", - "d49722637b3224d24f13e6e177cfb1e5fab4e881a6573fa7ab1573397e1e1a5f", - "aea85d08d6ad3de39b71957cd6136895a9b977b345de61fb532dd11ec0263f9f", - "3b0183cad2ff6c5bc406e54b9b1ed55f1afec2bdffeaa4ada93f3237af5fe3d3", - "0e6008b0663d4e3830ba354bd8cdecde22188fb3716b3122304c752094a577f3", - "4bfe9030437f16ebbb6bfb795c24e098ff032e194db20ada67aefc7b7b911b32", - "fd2a04a2cae3af1548bca2c236994220172fa90c679fb685097d2c0aab2efc59", - "e4ed2fbfb1609850ca019b2dfa317523b5c633b7e93e530433cc385e6e963ec9", - "18d7c44d7d019ea946860732ba82c658ad5725261d00f45b3f14a43f34d0fd51", - "b4b4b9e221f276d3a44150b6a337ab5fc414b65dc8ecb8c165e4fc7a6f5d9a5a", - "0f579a798ceaba7254833664029a069de7222fa2a7c06f62076e3f5394b51530", - "1151e3dd5c603000acb4cd6a136dbecd95144ca4b8f4c760dbf40c1c4163421c", - "f151fdb8d5ae4e7d84cd7e05557ec9e05ee339eeb880b9a07087f2e4c080702f", - "d7e7c622365b14e5e5d124b80dfb5a3f30083bcb39c8a16843f96939609bcbf3", - "e156ae6a1cc7f9a8bd6476cb19aa580ae7a44e8f4f4eb7843b8df4f6ca34428d", - "da1f9bd0922b7dbf0ee09ac911fdf1be19b8171d4ac43708dd40d3906f3725c8", - "e2ac2c5bda20859693007d0548fc2e46869dafdb1bcb714f82caab79cd2a69bb", - "5e31e565f26b43e525e5ad48949a31d92424a1785493fea89faed62a044bfe4c", - "3197eb825c6a91c0119dfdacf72c731f4341da8fee01ae40ffdc802a0ed91cf4", - "e8d1cb8b483781afc9f7f5462092b7fce425a84ed03a58b5bc3da42a53986aec", - "5b6e83631e466937a2386a421390549253f593653ab90e4e4f215dc39fb5d16e", - "ecc69333fdb79121b3420ca0d7a68992e54e95bcafdf819b50797713680ae24a", - "cabddc08f15851e7ff3ebbe7fce2c6cb5a7211f8dc8ab1ff165125dd330e6bbe", - "358552c76250b08c775f4e3f17f9cf5f928a597cbc4880d63cb8cbdd038c168c", - "b9b4361a2fc2850f8a534bd47bf74832c314bf6af8bc7981ea198e8ed26a183f", - "535bb6ebce920cdd86cf35fc36d92936aac071c187504927e463c47b1a2527d0", - "d567b18beca2b8090556bfd8bdc20868e04157c1dbf46b0f4a17405dcf70e3f9", - "26ae75e5081913ed4dfc6b7eb2cf364588fff1e460f899afb9d445b2cbdb0f2c", - "b9db2eb1bf697f48ac45542cf50c7f7facf651794e6d71015c161a24ab95f001", - "4d119dd86bc79777d3ee3533f146fb47037ca4beeb23ca4edb2b20610c2f5051", - "cf0b5688abec1458608b909c5e236c60069f62da40a68ff0a94ba4ca94c26d62", - "09a2afe05e43fb3937304be7b639439cd3e2737703b46fb19592b86cef3f5179", - "5428cd3357c5112801391f327aff5e80599d5329855a5dd43454815f69178f25", - "929c555d49aa49906771cf09294152a692dffa1954921e087f38b4ccd89b764f", - "5601a2cd9597b84ce261660da27e4acc04021abc29457e264c8c9a9f693c82c4", - "ab1a1b42bf522fa7c5238ed96b39776d40bb0fbbaade4faf66ad48ca7b92e9eb", - "edfbd0bde174ac9bfccf5084831b0486ae0ad112945c2474f655e02bc551d0d8", - "e3f2d6e016874b6a384faae54d004a43a3ae6ae45dd675e11207b12735afcaf1", - "e86a39182f96d2e6a474cf9da30629ac6d4f0111cbed06e5fe938af3f21d68b7", - "5eccf6e0c80da5fbd2a982623d57386994f3a15c2bc565de7e78b3f74b6f331f", - "82d90ffc8ab6edeb11b16af248a0e0e3197a0ac448d30f9a8e2e39a92fe9bd94", - "92a24761e6470c7a9214dcb328682f3c92e91489449b1ea0b26d53af8cefb9af", - "7d4cb7331bdd9201a62cebeb11871717750564036000b6f11a91c0331cf3e1ee", - "ce9c06545dec24d222f0e65b2f5a2baf7ba757c5e59c4b14a3f1b5cf3f6bf176", - "a6fa4d376dc1f5417d7d8162a15685eb95b205704a2c36c4c46f5feb9a7b7d85", - "13efcc8102b2e8ee60da4061379a8ef2721984582fdd98bb8309819e67bdb57d", - "88a03cdbb0f0930e8932c64cb5ad7930bb1f839c148db631e90574ee32c6ea9c", - "602c2d8b2bec56243f450f1e044fd337f92364820ac8624bb8b5186f64e54bd9", - "5a9382f6f57af5c33fee25f1d8201e2cf90bdc665c1b2ee0d44972074c6f721a", - "aa61ebdcc9c6c6ba43d20d6bebaf1fb6a44f7421286d50520407361053569da1", - "efe1d425d342569b4b680bac09652dac53939fe8ed55c8ef07c526ee2515a808", - "a543dde0c8c517e48a16f5faeadecc55f69df51f30285634fc90d31bf56f18f4", - "43fb79a7e832bf446bb39b87dadc6b0ff1b0abd7944da69863251d0ee971a234", - "540826438686e8df3f1ea9e5c836038c985c88a53a326b4ea565b4de086fbe53", - "9dcae044f2aad056da038a17107de0fa513d9c502dc89f8c06cb6a63f3488a16", - "9debcf628bff7152beaa262cdf7fa41dfd590137fa69079277a437b867ea117e", - "835262198279f7ab7b943d1a91b235a2bd7c60fed3cb871a8301ef12c91463e8", - "34ece59e18a5e8d0e79cd20461f4885cabd003e4a9fb69db46134f6bf2b253f8", - "72b52050af2c2e37287e7e6e92a7abb7c7aa897324bb2611a20406edbe1a7c36", - "f04f58f236e47673913b9d641adea1924682023989ec9f66108f03476f0cec55", - "8e8a05e665d3b2380edb8ed8b9deea92bf377c1d29ffe94d2d79bd4628835b90", - "43914fd54a0883dc9889c15287c64b96b1ac708b0375f998a92cb3219fc3443d", - "50b94237574d23e1955d85273ee35b6d8eee0fd1210461b38059df4fe2a7e47a", - "efa5e35fffc56d4f2d5fd33b816f98584a2aee45ec6268f35dd650f3b4524dc2", - "563240c066abf128c4ff5419295924723f6275b1eaf18e8b77d365d6b2061f1b", - "419d49294783fc48cef2ca6c4c98872a43d4cf49fa34fcaa71a608af026530e5", - "a6800a6f8d92aba20777d81097b03aea5510bdce3028eb95f912fdc9d61477bf", - "010a83d8e95ac2d9c85548092f28bdc5a9c486ff4971f1922ef56f2c4168caf9", - "e3eba91b29518bbccc9691ebdff654318e090d295c83368aa16f92312511ebf5", - "f8e85bc80329e7309e707d0aaeb69e25ca66c829d178c4ff64dda41ce9f0bff9", - "aec4a52f51fdf7b07721b51454600fc93f548259216a6957b641e38c8b8ea877", - "b5aa3289c96d1f50902e00bbc3c68214342568250d1ac4b0f2cabe2aef1dab1e", - "f9a32eac45085e79310cca3359165fb4e58468cc58ca908b5632894c0c975da0", - "d6ac75a8b8ee8540af3489a38cf336f48a21a07fba71b7ef5a22eeb8677d7aca", - "57347778b1c45495c57b70778891776df9610ec5c6629b7707cbea7dea18a0af", - "7d7c96b4805520501d4d678e5234a18591d9fd5c6fda1901a368b987a33900db", - "b363ee6f45cfa855193b9f0934d9de3887087d6f0c07c9cd90682a7ed0c6b813", - "e1ad3a6a484b055c90c0f940ecade1f97aaa965bb9874a5399256bb2b6eb3f5b", - "a6dd5037fba21e51809f1decceec874acfba72d44c94682a4da5989cb23434fd", - "b46dbf9b402c5c75106b13a3607ec676274b50361207c1d0daf783a4e60acf79", - "ef00ecd084c66d54a15023f9ac2defa3e4884dcaa7dc976d6aa7d9c3b66ccdfd", - "81bcf0d281ffee786df43dd98c02a5db66e48cdb290d20bc1d8e91581b25ab4a", - "b2b03e8bbd02b7c99d33f9df5bb37cb883b68f6c7b0ad1968bd1787e12a3d365", - "56457921bddbddfb203638b9652ffa3df2f58d49d47622ad4799f4047a4d26d7", - "c950b18f08542ecdcd467cca0cb66f7b7c07f27f07dc9dec653143b99ea48672", - "9233b2226b42b182c1782a14bc344d3a50d08fc25470d09ee000811c4154bf21", - "74a8186f965bb3f6c6396d2460899b5746b80ffafa2aeab8b115ef48f968599f", - "90e7c09a28507227ae0d8c8a61ae813c00dabe68208eac35d71a0d3ef1099dd2", - "efa2fb515924a8a3a8abb8d2c7050410cf91abb5a22fdcf6c3ee9fc1db26be47", - "bbbc1e5ea07bc8c7bd2d43dc2e513bf06f2e9e3ce8eab20dbb2355782fc28d68", - "2bb92f69f39ecf8a3deb3587f03870dd0d63032562b181ab8b40b916320ae2c1", - "cbda14148ce65453cdf161b0155d79549a65ec94f6844e0265302ee7cb771cbf", - "598396f0d14060092505a5f986684bc0c14ed5edb9a32a033d467763014cf312", - "e5b6f77ce96ead02f2cec7be8dcd3930f101e4edceacd38b58bf6c2deb6bc477", - "fe6c337948386bcdffad712fd261c8aa66e2651c947000b3bdd7eadd8c93e9f4", - "5fd9d658306a1c688178b610cb140058b95bbb5db0d2ab562d754637e72bdf85", - "56cb168d1f743bfb73962ce236cea2c6fc73e19a413e15451a1e6256a09e589c", - "b596f78ebd31aa9c4b683a18539aa91ad7f957075c1f1145f2dee8d2bf6dd913", - "03e0dd530357f010197b2905eaf194ac8c40e15c4372cf8ed79352639642be92", - "55115ca0f7ef88f39a27165d2aa4fa23189b858b3b1b01f178819e699b702746", - "c3fdb1e06f5834d0dc450460b5342c6b22cfe604c0e3d45afe6bc978c9c7f985", - "5ae92a0bf1545b3688149280ae97dbfac9cf74eac932638f264ee2355a97f07f", - "8d26486292d13c7d65617dee31d213e81d118b49e973f22c1e1dd49dee688b9e", - "4bf70c0e85fae946050cf8b416e171a838921dbc6e454aa77b762a1f52d19ef5", - "fdd6660736b60711d1704a85c7dda8ae2601fe86455f9279ea1bc3956898fb60", - "734e2f5963b635988b6a121d1d15f256f0f536be102a42707a06010818fbc29d", - "bb33a1dc5c1c92d4cafdef2d28fc2bc84ca71ca8e0400a325a9655d0d675095f", - "419b317e6e25a547f6d456b713fd9e4a3121d05402f41bfc54edfb4701defc70", - "8bbadd81bc3258aaef0ca07a97cf97e318e35658dc8904219ee4478dd5e1f758", - "0663559bbf02aaa372c2be249b8fa83fa9663d4fc9be6f3505cd4b76de49a51c", - "bc2991584160bf3d6a349f637d68098b80db8dd469c8bb917141af2e4772fa18", - "9157f5a618809d4a03cfa9552e63c9c98236a7aaca68ca26e321fd0af1e911dd", - "8031705cd2575365dfbab2e45ab1ed5faea22332cae9d39f0b41af12fafdede8", - "bc9d1a46681514ca5bfef74d54a5df5a68c2c70ecf3ccc4c98478a673b7f4188", - "c8e11ad453faad4febf083f9195c28f9da912ce2984ab0b75bb88ca020e8f764", - "53c65888e027d84ee59ed87c32b33911475181ea1b6e741ed07b6143f05c93b6", - "c88d580ee5b36c4703ba743aac2a4359d3706860791482e52cbb09566e70814b", - "a9484628703db121662b8c2eda38730ba1426c1f7892482461d3a571de26474d", - "3949fed0bdb09b264f9fd41f507fbd3e422a9b799c44758777644fadf1fabacb", - "030651bde0834da9e43864000c0798f414ab1b8c0f37a0a7aa00be0bff2c5c45", - "42049aff0d260f405ff6bd800bf128c3f48eb2cfdaf7d17e2f8153e6ecdb8d20", - "79ab2521fb19ced7b9f5854896870ca4b1573de77ea63a1aaca8b730125deb39", - "1ea686a5ab34a58f518793094668157013cfac2042afba0e51a154cd727af77a", - "ed7b62f59f4e60be19b2f4bc3110b8b0fe8088200498249fab2a36060b30ac60", - "2c6f5ea8ddbd3c14d79912a49d0c237d96c27c0a739beee9e682024f7bd5e4cd", - "9e2cc4579df5f865cb6403acd4dd2638af8575497b8adfee39452fb613c0ec56", - "8b53d7bdd67dcaf3535515c6ded7ce6c4283b446abc38616d54d04959cedc246", - "b6bb1f9b90ab6263e74ff4381e835b2edffd020c90e7d6a56d5717cf120cae3e", - "b9ba887bdb5331d7007301b884071c136f40819fae55273d63cc54f938988f23", - "17396e9dbee20de954c08ba501ce1a47400b7dfdb6a304b22b62b4b88521ceee", - "aa5b779b3b686a0b011b2d7f22ebbddbacb3af9098e3be02ef176eba1aa55b82", - "b46d25b01b777f9437b46d3bb8c2e0a98a9e29cb11ab9a70af518297bf2ca393", - "1112ec5a8194ed6da2d9cbccafd1eac1cdfb47bfc6683829945cc941093ba98f", - "74fd7c24e9fd7f629a9dbd5af165e85bdd059eda63ebb13c971063728a202084", - "590b1c79c482f2d3fbd8e23792fb35adb7f95f78440d06d81efe31d0e6a4cc70", - "50e2d9059c1fccc9f4a2d151042e55194bef6d131578d5ed9a3d7428844d8257", - "fff075103edc01decf71c677fc9119fd8daea81629a2dc37c14ee793281eb8d3", - "22c76769754f74df3257983d6b5c08c38201deecf997bc7fe4a8b55977b059da", - "d0e7ed25c2d1a0b4ca7421b5d852115ad6263621b6f1d1b8b791602ba5b9ca59", - "f17144245e1627a1c315dff216a1dc1eaa530d0da972afd0feab92604d7aed38", - "8e1cfc6ce493c330e07d6453bed165ca417782ec49846e1a614b3d003bf1b28d", - "a0d9ec97b3bc323b9b65e5cadcb5dec37b32153f6aa90dd523e4614833a2bb62", - "cf69eefe9128ffcfe82ac65946e9fac1739d1d12838d173ea159f1410bef3ff2", - "28fbe05d2e702cf2810eeaa382697ac99dbe292b4ce639acd05ecd8f742a59f5", - "83d10d69dfa719c4b78175a3b2c5663f7b4ab65a747f3693027c23304bc654bd", - "1b13215b3bda4d4843b684d29f649f457d5471d6f8f973068f8f67f8feb4ea7a", - "cdeef1500721dfe0c4ec98edb7de0cbbf997097578cacb597ccc933ee0d970a3", - "880a6344a402627a13801508890355084de40f0d44e91f26e2493f426d2751b1", - "b432fd07da86134229b4403696d115f34bda849764040d70ec52aea400fba502", - "03ac639504730abca4803231647c811a7137a31f38e7d7a470aaf884bfac15ae", - "281eda8ba5208b64e5247bcf8376f00f8278614b8e3f8f1cdcde30b02e751f08", - "8fc2a5a8a67b6a499e8d29f1154ef1450e5ccabe1f93781a45d429429494f00e", - "b9491faa9baa3f942225b64e5f7305e504fa2136acc03dacb4a7b250345f43b6", - "a30744d36b6a8ff373d1fe1baf9052aa2e3b2e63fa9f22864e03cc6682e5c7c0", - "c4aacba4735f7f9ee1d287071e00592a9391adc627c16a706deefdf2ffbd5651", - "2dfdace43dd8f9564834ae4d01c819046dc44283c2945751fbc32948b61932ea", - "ba84108ed4bd615c4de76a37b59a0fc3aeaff2f3830e177c35cb6fe30ebb0ece", - "8784be459ab8d97034ad6391116892b095df2c623bd011f9deeaa3869798553e", - "e9a5baf22c99e5ec4db1fa9b05a83fe37a32ba28ee51ff0c33a061679e260b78", - "f75621e8a1dade641d5f2aebdb7c2defea493cd69ee9eaaad39be2a779f416ad", - "f0b7ea641542bc3dff3a11e1187163848b4f8e6bc66209e61c896fc4ee70e2e0", - "61dad862f1fd60cd2adce4efc8694d5ec18fc8b88af01b935e0313c5aba097b4", - "5f780c615b5850ef233f45814605e02221627d19f885fe2a6f09916730c12ee1", - "072d74e9b819455065bf8afdf4247311e234837283d7d6884546c0ae9ecdbec8", - "2d17f43cf608405062caa79e94403b825eab5bc317b69f29dea05509cfe26168", - "18b7ad8448def9fd17fedf874b56b0b7e2b960a2c9db4dac4f7e25da5badec46", - "9f2805ff46debbb2c92b226223f7b4f1a3e65c9aed0918de504cefefbdf2f24d", - "63acd445ae9814662ee2735372270dece50142ba836b106140598c7d7d36b4df", - "59d06c770d49eee1ed1487f03040b4f9c3db25f77990af46e76c1499a6ab9b9d", - "984d39631446238d669708c36d0d73e252549306acc1ac936aea554dc81f4606", - "429546551472d88b78c829a00b198adf1c61f1ce882c96e3a448ee678131c34d", - "0b91290379587e754d0a1974817dbd13978b168513f5f24e0513810ec6212347", - "392b58ed59d884acf47169a07541fe6c6cb86d6acde7edcb354a958b6b472fec", - "4f871f88c7ece63b4fdda573daac7c034e84ad027fdf56ef40ae76af391a4699", - "e21194a5a50ecefc0467c3717b70a22854d2f6e5e9fe03545c4ca5ace5978fe8", - "e10d058a21c6db7b8559aa76c74db55f6cdf3ba373a45d0176c4f838b8ebd0d4", - "c9d56b4523d22a5f5ff2f701a4195d3b7ccfb39a43222b491a90ea5c82d31ad1", - "a6a8a4ed6eaf651f00c83a2c92c00b36d3c87b8be612ad24d0369122dda2d7b0", - "6a612dba5458535ac7f48bf4927c339a19141a4187d40620bd69a76eee360a87", - "930d9c41c0c00e3cfc539cb8b8370133402f27b6c38e30d2dc103b78786799ba", - "d4411b7396305df420ae1e230258ea8fc1427d29eb2a0ed74161c2688f2239d0", - "c482fec95c1cb4b7e82fbe469233101fff6c4d865f402ff2adf7cfb03d85e334", - "7d6a711d61208310918679156032d1b6e73105ef6454213f29e5bd423edd47f9", - "fef88e10e3c6d7ae45211caf5f9e61e67467afa6e780c43475acab27b74e7047", - "bcb4110fca16f23aebcc29f7d20eced427ba53f67099b8e8fce1535f131ec1cf", - "d725170501e44bfcf8f03e104c7fca1fa9b56721cebed2726b8f7a350ce5ffb4", - "25206aeef94fed2d68dad8710c1faf9b164f02a450a3e87fabce594241257a82", - "4b40f15843f08f18e0a312578d22d09bb6d2518caff7f8832fab1ab65bb37849", - "6e6d7493ad3c13b3736fb317a2d46d77e434e8d50bc985d7d45af16899536d2f", - "d9f43b51128b1645edb3a0d0eba1bbcb3b290505c57ab0b5e9800b95d811708e", - "addebcd089e1755144eedd617cb44fd61ec62fb197bcf1652bc470c0b05b0134", - "a4e3aa1aed73f46a9ef8859fbe5153599c37693539cc379eba8ddfd252b1ceb6", - "ef3175c6a5ea385fdf959beb1962bca290694371650295e508e6522e168333bf", - "6a7f0a2959c8ac91d7d597486e5a546f1fb668786b141107877feb636462cab1", - "649a6b07d1d1c3db3e79214c3bf2034d8f6f0be15800b18f89627d76c8b31736", - "5ef1377f7ba65d48cae42389880aed10228c8c6d6e219be6722391c1559f2048", - "cfec0b5de993e0fe0230845f0ca36321bfc2254086d13e97fdfe71d7c6fbf1d6", - "8ded5233dada1225378e6ccd9c77703735fa4e2551e0df53ac6dde753b4ea3e9", - "81ba73fa2a1bffb16a1ec0ca25a469c6f3d1acd6203f234586daaf792b2bdb7a", - "fc7be4613aac9317740494f3c7f935605ffe776e75dcaf3315587a6560336dca", - "50a9dd4d0c0c419d8dc4dc6046e3359bb17c45da5c2ba99ecb27c4cdd00874a3", - "90d16ede09a97b2d34f252b553971904d1baf80e444fc0c01b49dcdbc4ca7fef", - "1f13d5af8dbea1cda999e3e9d68111e1569b576d6e304a54cfc5d81f257caca5", - "f83da248a09dd9862111a40f213df774037657af87bc6e2220d5dffd16e9b5c9", - "dc7f1de0ae4977bc9d8a77ad5ea36f7dbc1426b248262712578457194bf42860", - "8e6f5f3cef4e164a63f8d4592d9030fcdd746f418eb0611c08675975bbcdcfdc", - "e8f9f298cccc522a8fd59dd3bbc031c1ed26ccbf6749c92bef10f7ab458f9274", - "8365154e81f7f92167f9ccc379383ccec75cc7ad44120dd224e08b3d04c9a9f8", - "a76a16268761b81317559dfd4d988585b661e9680de16817bb79101f9cd36199", - "6cfc2b3a204385fe213dba49fc35d61b204a8f5b9ad910ab117b400112ad4a97", - "9924929ca4cac230ad0a5301ad99b272d072876e225e4a68a1692f200aa3b96f", - "3d28c23dfe15011d7b4b5a0fd84f6b34dc960179f67dfc8ee07bbf82a8e411fc", - "6335a837e3318198e13f0ee8db39e707ba675afc1f2b5e6774826c7e806bdd2c", - "7b7bdcba036cba9c4e0e69bf714611046c36ff50de8abb1237c2e6c704103c63", - "0d9d2b4f18cd7d11f90ff46790a50ddb75316942e2c64f9086f4a1b4aa583ae9", - "7ab5855df9aa690a2bccecdfa8ae1b515f0fcaadbfde1201ea5d706290db3645", - "d1609e07e25967651462dd5e3f207195a1efb1f0f3036b514e4d781bf3dd21a9", - "011124fb272302e8edd6ea245ab71927d0296b187792c19477ba3ceaea00e1a8", - "cb982fa7bfa3c1bf44a1657ed9e4e117f4ce3b4e0d0b8c33aa046519df49f687", - "66dea0fb63f1f6c6618c66de497a0f31a6ec4130916a1308c487e0689cf6d728", - "50e12d127a40e6e8e613747b3fbe342f1fb6b9c5e3420c2883d9549a02bb6ff0", - "6b02e223492f17631542bdcff94f4a690644cc7379740c555ccae12498bfdc8b", - "f48ce903bacf9322c1cad8c5f8ec5068e4de0a87f9f52c56b77defee382075d4", - "b3d9d9449976da37abb82112d528c25c9dec18cde65de9ed18328216b74aef04", - "1f7a7488e9272d4eb6e8927bae4fcd2f11b1e488248a2e5cc11686863828af31", - "8f2cf5126a5886b69c214ae7bb1cf9d448e40a7341b4e3c1f9a2f8e1ba518fda", - "244671e5dbe78f53134eea387b5b6b919afbe8472a56681bf029479cf5a3ed15", - "c59a66c9c13c611dc7ea6cc214d6acf9ecfe518366621ddf12c4e7b6bfc2ec49", - "85c9cdeb1076c25bac459d95dc95a69b68806d012ffff057d5de60d156f87c43", - "bd4144b92c3bfd8c5188deb896caf63c2ffe0b2a7e8723eab759bfd52269ccf0", - "0c55f6e51ee7618684121b669386daf003dfb5650976002e09a892f1fbfeffd4", - "3f29235517064d0129f9bd489d4e22734b617bcbdbf15e16f067a48b4516ecdf", - "94342ac4aca2fbd9d3bb7e9d8e9b3b9c88ed126020a7b8828e267ab516ff01d7", - "9ba98e19158014a697ffd6c6616ed4d3fe29f4ce12d6b1d94c54aedd0909e3c3", - "a8760ee9f2e15110dffa42d0a621d1032356253abaed4300a58ebf840cebb311", - "138faf7ed372c9be815d40ac29324ec22d979857623fc0e3805f3655479dab31", - "286c204018703fd69ea4063fad1d5272d8459a79cab9b783c0bc08c3e5d25b13", - "0c4fa5ae76a6fb0ae0f527132d9febeab7f27d7e7ff38ea2a0f94c7dee70aece", - "61935a4003310636db795d4ea9023c0e8c8a04fe14a6e194cea04dde9e12d444", - "46d70874ca5fc30ec71cb3bed757a5b22780b1594d6b911ae085ebe738f4950f", - "af50386d17fdab88d5f7b967ed4c53cbc2eb8bfce2e3f4ba9952ee2b6c7c2acc", - "c68e70d684e13e3cfa439cddc434693ba36795ea7f1c0f9a3085b6773722379b", - "b9e41bc52b210024445ffc8d795e3cb910c0efb9d022de019360f66766d74851", - "ae283a5f6a2d9aa9d7612435577ba8690fdc7617c286a2e3e326f04f4fd72fc6", - "13504ca7045670456d71caa5aeefc21f7d8116fdb348b6671ee407f793f8a634", - "0a622c4bde62b0a21b1a285dc00421d6ead244708c58a931014dd8073250d6c2", - "9c2fcb000bfe324d140bb4eb799bff6096a8d3ac3f2d0312b79e06e64bd0bcae", - "bfb4295ffb31fb4f98caf85b9624e28c205f352d8e87017567e1ee2aff31ffe3", - "4951b55b5972138251998d7eabb9042c98f8e7bea8865012605f00a568ea2b1b", - "588a8443a9184d6e0f4e38c9c8a122f30a137f247d5b84cd94ccde225263d6ff", - "2dc6c0018ecfc75c26754170f355cb25c9fc62a7503c3455466dd2bb50eedb4d", - "eaef03ebb2cebf8800f3a6c0c8f9c3adccbb0fd01bb4e09ec1ee7058fccf929c", - "dec68708445b4189d132631e38f402ffc03dc3043e804e466c5c5e4a824a15ed", - "64fd9fa38855b66ca6f3a32eaab4ad11d68c465fef172bd79cf10937ada9f89c", - "35dd9bd64919a9a2c750f6407177a376b55b6aaad9f631a7eedb8735d7cbcefb", - "5940995e1f171d2cd3cba76cf18b58b5b734a8f5963e5614ee24bd0351d6fe21", - "7c9d07eda81afcb0a9c056bb9d45c2533d9cfcfc3ede3b4f8fdb92b2031cdc77", - "672dfd98b10bcf66835527d432d1904a80f360c72d2abf7a0d3848865df62773", - "bab6a9c13739ed9554cbdd91420a5e256b26ae7160582db5bf30b5fc545a26d9", - "a1f537b7a6c5589f2de0548cec1b44910422a9738da82e25a5b04e6dacf7d453", - "cfd2b2e9e5459e5556aa0ecb562547fea0e49c211cabeb5547907f4a3eab357e", - "2c8009220d03f3d94a2514b579c48d901ada2f53e2eadc2e6da64476ee31a3ee", - "31d6ab80ba9468c9cecb03893185f0ac24aeedb2e51543b2f3890aed9f1f73ee", - "95e169af2afdcb837acc4892411eddc4931d86367880311e881e36309e81a4b5", - "c776477693846e30e5a00adb3daa8cc148b7cdad9ffc75cdf159e362fe9c7db5", - "6074efb101f6f4f9e13aa1bd9340f6b6b799633e18eb4fe7802b3f9014d3802b", - "6b975a59c5bb097e331267bc86b612d8d8e63f4ae8f27038407672a29fe937ea", - "962e7dec4ca6410b7f7fa84b07639cd99838d20145b21066e3ef2e221302e912", - "1d2fcb8697c14898e56ba35452c443e911c038232697e72459b74b552e3129fa", - "ba17da53afeb979e2c86e89825e16188063cb3bf2ee9a5bbcda66fd356b5f8be", - "32a20e66f81a7529c4092f8d66d0520f321d0ede4a5e175f4d16ca355acbf8c2", - "09582d4f3c8b765480639401f0c164b8af0c0b1c5033b1e7b08e036958a64203", - "6402a7c095061c6498e4432b911237d76d81a3c7c227ea899d4136a3faeb3850", - "6f10a417a9a4adfdfa957b04dc4daa7ef4d045474481848a3e3428f4bdaf76a2", - "3aede796a2aaed3730f5dc3ea2eb632d9518f0bfdc17521560c23ab84b1d8507", - "dad017600f083ed1c44ed4cc3ea3a818b42f61b0324436d46046c108bd125876", - "871d928adfdf4bde42bbe60c82dcdea12b42485be3f129ad215cb34e61732b02", - "9029a21ec3cbef7e6eeab9c43999ab799e95cab736ce55513ff16e03ccc8b331", - "a29d339087c697ef2dff310926867c6d2de1418f6312b6757d863a9b8dd230e0", - "f9b85adb3bf2fdb41272ee7119b3a61a82fab4beb1f06fda2aac7b5d676dbf67", - "2c2b338437f0ca3f60895b16e706ae6630ae087a3e390e87c7502a0db64b774c", - "7bc005cb434b5f3466c2c1ccd03477b3906d6b1b6587baab11f2f817ca1b8223", - "5104af1bf81d95c2813440540bfe9f4cbfaaff58f0deb19b2d37d04645399222", - "debd719ab0e14a11445cef05b05507627722939b46cef28d3f13903149c6b1a7", - "19dba6384ecd50627a2b515bec7416f70bfa763e204b89f24b73ef229cc22ef8", - "f90377f7ead4e30409f0f2fbc5af178a8a8f670f9b784c0d3e7f871c49d22755", - "811e1db7867508f338a82f4a78d0558ff12809cf7d90ba011b2d782ba1e3ac12", - "b026ae574875bb7912950351330555590946e0255af78e062906d500a06167a9", - "c17586e4beb41c07064b522062c5addba1ce55ff2043430f64eb2a33dc0a6ef1", - "13ac551f262ca325aa0ccc46001ba7e8a1f4498a61bc11a441f5285aa2c98f95", - "ae9a3ef7570583033a966b00358682336525247b2041d13df5e1491acdee8f6e", - "ade6834429afc69c578b344eed4458855d278341ca166134dc77dd6cdbaed418", - "5593aa51657928c42f4c689960f52e0712cfb2ef0d05d32c99dfa72f074577d8", - "48cd1813e82e59c18f1c0951aa048903805e42d86d1974d93a3bd12c88159276", - "eb3b08b02a265f49d411c0381b318689c19110c8a4c493ebb6db496aa8c5bdef", - "36e39cdc84ce76d2cddba0b49f2287a31064f5c44f5701afc36b89e5c5bab31e", - "9bc4bc9097b5702289ce4e160c853356be55d55cbc2bc5fedead04ddc9b21b61", - "9f2584857f570be4e0cdd6e1915cbebe3c78f7b4c857000d0da48302f8930de5", - "33c0ff63d7dc9fd72fd420e3e5be25b72bedc4e94d05a83e147b0775d8e1ed03", - "235e506abfe96b7a3c0eb087d5b96046ee0a48a400156bbb85b10bea0800c22b", - "c196d9b4e676106a6437a8990f6bd84c5f19efe8bdc151d919bd6d1ecca37cdf", - "47db91bd123b4c0c4e9f360bfb80cdda847e85e21cc4000712d7d7585c2337a3", - "2099049cc67040787fdbc30530bf4490118157e0a2765b7d3b76284bf3d42ecc", - "a805980cd11e4d0e19473223edb37edcc61353ae875abe6ba5f7126749486b98", - "cf36fca991610d0ff572d04aa3d065cfc031f9fe0c15c6de411c7727ef82712b", - "2d2f95df9cb587c2cc64fee0b9aa7ba06ef112e9d97be0abcc35b654300b98ed", - "6a95fb3273768b5789a6edf590f321d5f38d05fc18aec1577910724212721718", - "c3c3ff745bbd87b1033d6980a595d38904ec07c4820d123f219c0e6222e1e2d9", - "64476208dde1651116153a084d77d788a5cdd5ab50966c80fc826686ca87cd61", - "bae328bbfb369b9e2e9326cdf93e26a7b10293fde49cb63a1f70c8620f164384", - "0dd9c76a91330886b0cccea2c3ec6af002f35785753c0ffbc5f10a557dd5409c", - "e6617f620a6ad843beb39bd8f7319f695ce23c62dc7da44937319b15d44c548b", - "343c3d102441218f41e742663e6f34bc6fad506672d79bcbec0fe9d583c574dd", - "7fbb6b8a11f4d6303497bcfaa040a2fa1caca30557726bbfef49f8641503efba", - "ec65706d5be5028bf9a2471067cb95d386c2a23ad12807f5af3388ac52e6d32a", - "45829cc0b075f2adb583ed0ad05554a6cdc9d12a6b77f676a31c6649f55c692b", - "3654918c539f9af525253e2675761c73033bfa1ee2c86a5d2c0100e0279211ee", - "1b80de41b682caa2474db24e55f9ebed41e85b39d5b1647762a2fcaa42b6b8bb", - "d564e3e804950e3c85941d87e1d058f3887e6137e7e74cec76976d28df7c3a67", - "04f0125c364fad992f4ea9e1f022c524aec620b496ddcb9a29e1aaf572aa904b", - "16b9314fedf2e9987727ca1ab725ec3c8f87266bc37e8d92b2bdd1ac51a75644", - "090eccbe0b6ba203177e63668ec5e8ad73ef3330265b959ef2568c78d86b6a77", - "390fb4c01d3c0eaa1f86fe05b86015e934b64a5dee3fb6b19706845169aaceed", - "f85f375bb72d9b487ec8e16ebf5b1fbec96c76f6ddcfe0e74633909ad3756fc1", - "3ec941021c7c96f614cc26a755ddbb368150def568207bca273e26e014dfff86", - "18b5d533bf07f0d274f832c5bf24969b07077155acf2de1ba7f734b1b780e79c", - "c1e308c6efd688a2df968a0c433cc4074f4b182016aebee6176ada114fbb87f7", - "aa66a76c18830e8cbfd3839b16494c5ef9f67a8f219fbf19af08fab444f067ae", - "75c99038f9d4dc4d87f4fcbfee575e66e83140a187dbc28ae17ebd55ee62d3d7", - "ab6f7693c93c05f0d613c4790b1597b7c03167272c929e2de1b64a1fea30d80f", - "7f279e901c8f93c8dc17737c75ecaaf234425734bdf14afc8a38965e7d5df30d", - "11fe28e8215f500332e73fd7d9e0716d6026f38cf6a87831c8548a31d746d307", - "9b60e57d557b271edc98c85c811f3bfc26f257b25b1b4ed258a5e06c5a169c23", - "ac941f17d307188204dcf6930d2c37fda65c5d2f305b843b83c17d7025ac26d1", - "37d7c662fc8491f0b93488c8643edb796cb71210ef13a6698d62dbcf0a96c595", - "23a09dd46c4c94c6bd35c71c7fd5fdd906320ff7bcf0d33ab7fdb7da4f60f55c", - "b444dc10a3ac2c23fe1000a49cc21a42a83953f55275919f3cc6763320c24cb2", - "1fb63971c5b9c9fad3fdd55f85c3b4930d6dfd3b186928d8c731a3c700f47d14", - "49d9bf3c64319fd91bdf01c0fe1f8a94330c3c899c02fbb543dfb4964f68354e", - "f831f9a75fed5157f1b4ab8b9cac64db6741c3d782b173ef9c212ca5b1a66817", - "ca1771a731eefb4e79d84848868c002e3445fe1fb25816b88de209a5bbad17ef", - "201bb2f61d84a34fdea7a8f3848595c5b01f433655df3295f84cfcc2a9c00a1c", - "e3e7870051a4313fe0cc2050413f38084952ea125e149635557bafc7d6dbd751", - "a8a2025a8a15df40083ef43c1402834071843e12c820e051f42c5d88e3325dfe", - "98ec6c0b3803aaee178f4e016bc7b823fb9d8c22aba16fc3e904056631a9afab", - "c15db2a2f21f70ea7f132bb5add2f4c8b4ecc89dc020a2e038a4e4873ca1dc9d", - "ed503592773c7c864ed51992b01872c855ccd6e56de6aa73dc44980c6fbae98d", - "2907059855fcf6454f011ed105b672b3985964864804097c40fc5d77751cf92f", - "03c38094588e091289bf43c6c7bad9ac7126f27c933423d1e5f254c1c068de8f", - "e545f52206416e90095cb02e01036f3399d41978f892b80a0b5995329370771a", - "c0ef88dedc83d6a1800ca8f9a9ec55c1e5046d49013d5fa8496173125e98ab61", - "e11d41bc08fdcc818660ded6f048cac1fee56b1f26e3df2c05a8dec67a4378ea", - "a6b1698d7a8ddb6ed1fc0500bab65fbe31cd652ae4a87487a45ca99f08c0edf3", - "d68d9e418f05c78c907e2c8b0499bd35404593962a2a2c0c8e93a088cefaff2f", - "7f814416955cf117c9afc8bdbe6a545ab2accd037f06c559a3c72875ba99cfbc", - "a2b63af44be567d7751cb8c45bb3461596dea030626e2dd79c02ff79e6f16644", - "5b626a20ea07ebe2cd71197dd5f4e715452bc494d5b1948b0d949f77cb328a68", - "4e731088a2c542e16b225ad970b27b91bafaba2962fddb0dfb32ecb8fbe53ee1", - "46b929f61ea0758e88dfcf0bf7c9e7489a2e3ddda7919cae90ed047d20beab83", - "0d86425ff13d1c1de57d30e110fddf50a865d498170990933fbf767d14597d30", - "0a9f3fc2004e5eb197576a2552931bf28920ec8757da1518c77c9340e0c2ca8b", - "b11a4c49ebe4be93a10bf7ca40a76abaf2c1d53a8777cba5947b15a4eca71dbb", - "016f11b109c00b7179163162d01b917b07b516ebd7e8751a427d51462a5360c9", - "c7ef7f16337771bd2905732decd73cf30551a5e13a06e9071a05ab69e1ca88c9", - "9532ca9ea14319b11e8a26300e2f0e5273071bd116f10eb6c1fdaeec51b7aae6", - "13f8aa0a5743b419700eaffca47b7c7a7cd2791af8d18eef8df433c8dc2b7202", - "e6a8126707806f5d20450fe7864b23197dbd1122b03381880e745763b80a8f9a", - "2e20be65495fd19a3077028c7e881ba6a9a4e897a260987b0c7396f052ee9480", - "9a5de48043140cc61e7d873dc561d742cedcb44a7b309e16bb2632f14d734e81", - "f7ccb6ecbc2d6925a40d73b761dd59961d4c0894dfd9641b2efbe567865574f7", - "318d835411f8bbbc6a8e3e1b903051cc82b411dfa840fe1d7de277cab8f60285", - "8a9aa36de77c63183014ecb914a10fb794dc59a09f6185f3688ae299c3a87a59", - "7099407faf376a56ecfb1f6685480f4764e45e5537815382a601c18c5f1b1825", - "fa16f6d91c10529678603cc4921fc99f23fa0507af9d3afebe851962873120a9", - "517f7c646e4dcbb038cff35f6e4e88facb9161d6db906e8d9d6d5f0ac9f40af4", - "90b9b2ffad3164d9804f3fe9f1bc61624e041dda82a854f94f78530e34d9dd08", - "91a2c934e680a960f873b5bccd367c52dff017dac56facd4be7c2e0c05d01c06", - "05dda0586ea56deac9451500560437c6bc657b02087a294f4cfe5220392d4a28", - "86a1795a0367420e40cb827f7ddbed7f2e0c88b5931a3204af612ae6cddf4d92", - "f9e1fc73de3413b595a236db5e2feea7f25b1331ab626ffd28bb36d31d8ca66a", - "a3349e6f1d1bdd26d5d1ca47bf3e7c4f20c8033bacd455eb33f4a50545cc3889", - "8d6572c29c49284499c34de7bb49e6a2752a4d6d1a6ace9113c46982ff0b3083", - "ec5fdf57a5f1bff51c3de3fe7faa8c1d532291ac60f3c5dd4370eb6803681e3a", - "53efa55e9e110fddf2e70edce0107de23bfc63d61fd7ae5b04d2e70700e0406a", - "46cdd51efc301df9b6eeeb8d1b84a5f61e9e1e3dd71b768cad54c721922bbbd9", - "7953fbc6803d6a8142680d160ad2259321e2cac3950e6e7f97a08f8855b161c1", - "7685ec21f4530b9793ebb94f49f2ba13345c0e1f1936865245d6119846de0c75", - "c922d42d66595b05826ae8604f6dd3ab93cc9a5a32015c159dc17fabc2a5ab3f", - "96c86862f611dc03ab49191b8a032b23c7c0159a79b3b9e73d4de02d3c2d2570", - "5058811b7bd1cd468a3ce374b6f61ec6dc90178ca92b86ca69293b9ec8eba36b", - "095b4469a5905d8a2889be8536e02b195d458aaad1c5dfc16d79ef5489d52740", - "35f1d4981b79ab75f2b4e6b2bd7df5db317265ed103b1c45e0ca09220e68495f", - "92b23ff0871978700a4ce5d230cfa24077f3b493b0bf8a34bed5216785ac8ee7", - "e4c177fd962f9e1d78da1cdbdfaae233bbf42b28183aa482a6cc4d2b4c93caa1", - "7d1db2888b2a354afd4cd457072d98a635223705ebafa56c03e735ba050918e4", - "e78f8dbe3197fa59aaeb8261b8ea92b108c052e67a70fc9fceff5fd8d9eb31a7", - "11b3eea5481722eba7e3ee270f9cf05d66a7f06347724e22588994e5c1b50b18", - "08568545c48f0ba47d116b23f8193d42a47ef4cd06a01562252cb305ba91b6b7", - "bdf79491ae87ce46cf838115b93c011068e36fe1d19e454da57b87caee3691e0", - "2d9cdf780c92879314acb88fbff3c42fe2a234b77b7d4deb4f8a77dd2991d760", - "56f0919ff65abb50cc59ea6f8604d572783b95962d3d97d418a957a6cd7fb838", - "4fbee1f625abdbd9f4e5b83e5d55392ab65cc0f279c070fab1d3e15b6aed011c", - "708c1408ec3c58421e31064619d697e2c9480b65cba7d2691c2b58b3f53453ba", - "76f4e42bc9755a57cd54e443d84a096c096a900ed444c20c7aa29ffd94e3b1c1", - "994b5051b1afa74ee502ddce8a78958cc1e96eb6c5ec39d64917056bcfdad09a", - "e2917407595ab7beec2a49ffc7f49495020116f4688628b3a8475c887d4466b2", - "8ac52ce3d1816538bd1fa62ddef32715d7d84cd2d5f28ba0f4112fa53dc82edc", - "160a3a6e2a3e563730077442c679e7707a109976a0a3899160c81456ffe965d6", - "e390c40dcf8243f20dc7550f59080249ffade10987de036a7f694eda5cb3ad07", - "1a415b44fffe1c9d8a0666e4f20735e8ab3afaa9d8159c7460c651e10dcabede", - "237de83882c0166f9ebbb0a49956f820db7b9a65250506c242b5c2357ef259e2", - "910e4859b9426da1da687f0adddd52433bdf77554893276f230087af93fdc73b", - "347525430f9cf1f7ccb04a3afa4e626f4dde97721a7775236f4a9e8a44ede941", - "40a1a28235e51a84f6baccf68c620fdc2eb1db75a3ec5870bf5290a8ba8de3ae", - "e29e56fe43798a71d29fca0b92c1aa6f7687b1e0b86884bb9d93ad5b11414e12", - "d27a468ff18460c20addb6ccdd85ec4eb389d804217dc99f7bcb38f8460dd758", - "c3bd355a6a6cdc8e02a232d4c2962629c467bea4e0ca49e76c8670f66d518acc", - "af98e09074fec476505aac0c913deedf35f8a5108fa93300db49aa9f3810bb88", - "787eec070ed3831a30f42b90526cea98e2f8884c370bf9730f846dbb1356eca9", - "6ea387a0215d7fd681087131383389e2d6b7b4f34229780b7040a1282d46a401", - "59568cbd49423dfcb12da31a11b4aabf6f59413d55b523e257154ea146ab2d32", - "13157100fe9af6a4cb33b0f8f4b0550b03cdba99c61c1e00a2f552adffb3f43a", - "5ca4c07e8407a043c4e3f262936033b95827ae50ce518b30a044a168a573ca1d", - "8520c0563e9e0aad354cad333f9315017d5329cbb0961ce99d6d2f7755f4271a", - "35935e8e859c11afdb12cad7fd5cbfd21863961c06439d2c9b4299ed794c7213", - "62136897cbab95eb00b5809ce66158031b79528b928e088e7d2e6afdd6bab3e4", - "32c8846e350e81c0228dd29faf49bb5e3e152c80b8f32128b1bd1d7f35cf8f52", - "e1b2248c9bec1495f9c7ad197c5ac48b9891d29d4f77918aa5c47f82f6e29eba", - "cb4339c9b784a9bfcc2d1658761b5c907ef2e9ff52a8d1270e9807d8d20048d2", - "250323b239ceb7dc8553928f467f48a276b65baddfffc2dd7c066ee270791bcc", - "8ad98128ceec27301c2455ba1b7ce6ee102c657a571896ef952ec52dbe729f62", - "a2dbcefe355a9c855f16f9081dc6ebbbafd2fd77bd469b2506864a83f4f52915", - "c22a28420647ad584770dc96ed5c903c6652cfeda8efa59cb3f6b0bcd38c02e3", - "ec37d1d8d7d444a1573750331ec0cd1029e61b22e0b62e3583cd6a421c9f9d4a", - "dc35a241d3fd979a819646b027c4e6699664f639e22f27a4b75869f6aa2c7918", - "57567a05703d34e92a4035047860617462146d2fa68f0574cb455a464c1cafb5", - "6fa2950a85f32b7612792bb6b711af19c16caff297e871fa6de2749b907d4ea2", - "ecbe62513b27c6c18c381503e13be2e9caa969fcb9d0537d6160ec31d07813b7", - "4caf0aa3cedf8e4a8d88f1e537f3db37183711bf112493cd596da9c0d9d23ba5", - "76abf336f791622d69a93951dd924118336b37d2d333e318548d5296ca8a22e6", - "224bcc6986d698efc7f6394f160278cdd0f4143dfdb819e188a0c57e63dc47c2", - "709dc0ce8398733dd95dd1d50fa5b7f29fc3aed8dd3d288664b7e059e615c27d", - "7c2e7cd4a7be955cde18663337b7af72722607a253c747b09a21d9cc2845d121", - "ffa7a15281aa08b7fc7317533a0353f1cfd35f1c68a3deac7dd85b18324cac11", - "6e59dda7b6d1df180d0d94de3fcbbc77a79017269f240297cf434fc6985abc2a", - "79d8eb1b989f98fcb703df64c2964e890602b4a37985dd7ce4ffa61820b213b0", - "9db85841076a2a6f5ff1b0ba6e10e1d9f7c63a78897544e7a7ae1cbe53d1feb7", - "0b005d98b73d94e799c85c1094ae8df2e525a469f7d2107d27d6191a466621dd", - "79b98615e3da642f60d99a26981946d3229562768328965a580af853a408cc1a", - "4fe99d1b7dd1e24562641bdb5f3c69c949eb73498cad308e035dbfefcfcd47b8", - "a55b1889783ff28b528bfbd0937d9e649cb77ccaabe9950ebfa65465ce0a44b6", - "6ba8f744c70cb421025da2d5cbc6be6c43861dc5f6707f2ad9046c7e79874bc0", - "0b0940ae6e2d42e5c7a5c8cb03089fcf61475a23ed81361f542747a9dd0f2a6e", - "3060725e8cbd60441e9d4438759980ad5d952144191f9b37154b43967dda6190", - "e12032d97b56a173d498574ac7dd9d531570c67555b0696bf5b7985aeed79a79", - "553f21f0b0788342d382c456744a25352c1d1376f715baeb09546c65eb4168bf", - "0bf1d6b110656585d851ea0a33ff129f816599b633ed68ff670b5b18e482440b", - "46c669a6ccf0492ab28cd407cc7f2027f813877a72921f4d01f12d15382f7a1b", - "21a6623b9b59708791ba8948631ce502a492aa54808785b173e50fcb4f16ac90", - "a8bd3de9d4e0dacb7fa44867f6288a67420fb59a5d078a6b8ff9f097d0c9c626", - "802c0e6513bb4156cb6a10fa58f5e688f91d5eb0bb24a6952daa34597045426b", - "2a134f1909a14fd8fef9d3adc526ba3314212b509fe7ebe98ff9f8fd4d348a17", - "3015296d3571f26bea7399b43290b55e86a290f60537e967fddfd37772c843f4", - "2248750dc04de0db7c62cd9d90352c147383e20fc4e3d844728d81191a5ad32b", - "e957258bfa1b25f89cffd6f85081af7714c3fc0bc26fb5ad843a17ba124bcb99", - "6b9860202fc3b9905993ccb67648754afd662296542eb172ec26281471154a46", - "7c239086727af75855ffc51b82332834be2eff2529ae7b7cda23e1fe8f68b843", - "9f226df81493e9da178a076850d76a9257e9049f6999be2ef45eba2059bc8a79", - "10fb8104ebd39c7062df74dc4fd7fae79095b30e779abd435419abf51cd5f76e", - "2a225dc4ed895d39f71aaf8d6690da7c76a0599fca278bc37f303c9dbe67cefa", - "37a11443f4cf072de23e34e1b106b62c8cee93afdb80684938d2a41c853e00a7", - "1d67893c44ad5f361334c6748ca971ee85067b49dbb45042071d26053587e450", - "c40ab90a874ed1f7d27a13ef8edce6314c60818f3aa3362233a8b960c2a752d1", - "fd5e11637480fa07d24e21444c538e0486949890202fcaf2b8379cc12fc1266a", - "1629d4f19acb28221a5b22731316e3fb76226a184e49f419ad22a3cb1bd52e69", - "5ff1b01424c5261cf25112342ad1608d85098942bb41140a2e3160cd72daa2f8", - "837ec14349d27204aa3b34a14bddd26c8f21c87566d80d5b476d04484223addc", - "87712bdaf4e01678ecbdb52290f7c7b7a5b5d0e2c46373033cfbd732c67be4ac", - "381fb4aba8bef1cabd6964238beebb279fb35b6ff3c1350684ad836cc556cf71", - "d9623993f5d86f4d1f205c8d6e9be5322c261fbb4fc342db0be227b9faf8d75d", - "e49817530320d8f9d55fa17303e99540e407f82adb83df38fc8ea68649ee6963", - "a77e6ff681a7e4b74bd2dd68a770db2617992eed9d32a62b0378c861fc79062b", - "2e8c3a7bd0d986b0804352d68ea15030226569419170826045bcb3d5df8c94a8", - "9f39dd61d48635a6c9a411fc62c12876600050de9607a3fed3e81edf3192fbaf", - "e847bc8590aaa0d105de02cd94f2f7f96083ecde82fd0bb598fd9fee4b5d5cf5", - "ec0b6150f9053a2cda922a1e08213bd218e29afa1feb0d7b14695dc9fd15e15a", - "5a0194ec82788d607b0b1df02547e60093ea0b738086e82ecea08a17308cb11d", - "02df0864433e9c9ff2590240fc041ae0645024ecae1c1e92d27ce23badefc2aa", - "39dcd0f7379ec8493b0fd70033d3eb5e8189042e4f7e1a6c5b542b57d8348c24", - "b83b6bad96f58e5428595c047ea0600ffcae79459d601e90a734cfc6ab8affe3", - "30b87af4ff66d1e2aa3ec2ca516b18bee799a4e130404d5c79904e3e038014ea", - "3a2e3d59ec700552e04ff08ef98ef57cd42b3f2ea53e59f250857a3f7ed18d76", - "4ed8c88929e57c774b3beb8cffdd438faa84fad54bd095ebfd9d5a084209870e", - "146dbc11f07944549b7e5c80a72f703226d9c09394d85dd60262b59d3ba92e13", - "efc94331578c7d4d9aae9a49986eadcae476885409ffb93fac6fc316571cf083", - "c4384ad4fb54f33f11a1721f6ee04770a224d8a0fbfd29d3b9b8bed8d149ce9e", - "373702fe84884b0c6d23cd8415f858b22a9494d704844eeab3cda44c1ae9f4af", - "7ca106504957b767b21bcc3fbd6835726351c61b3f96d329140a568ad6fc6a39", - "06ef7e62aba107dcf800a874124859d9f5cf4026b7ff5b5b1fc53debfd1a4554", - "ec7d1fe4254e31170dce446d5c062c61a618fbadfe4645ef937ecbebc1b9a365", - "da97e3465e961575aff3ae6349ad40fd6c72f485e2f3896b9ee4339738cf8e31", - "2a71389ad53b6a070d9bf39d6b2def64e038771744fc81cdba8be6805f8336eb", - "0f926b388a4350b5c0511df7ddf06db8b2ca09b4f89ab5a56aadbfe85a6c521c", - "713bfa17399680d1a72899b5e869de4c7948bd69a1692e8f2d114c6061f7fb56", - "db85253b314068d9f70f97e1207e53531952e6e35b7569c4f99fbc963855c2e1", - "19f268a46341635ec5e78368594880eb1d3987d9416664bf0e2c2d446d639ca5", - "6ab0494533bf1c87dec8e84195b57546cfbe1ff79c89b23d28dd7d7a61082c3c", - "40dc46ca5b15062b3fdfba2de1bea177610b1cf7d9a84a6270c5892ad62d7a53", - "00fbb29130c83935897469c7009b3e928bdeda4181b0b702b95422b4bc3cc0a7", - "68a0b54c5df929835a1052134cb45eb0f92364d2af41d4cd6a4bf4c35d6c0b06", - "18a2c1dd9c8912e122d9975e320965365c7e29f8b502c6842547e11f3820fcf0", - "73d8ccb27689ed453096a98b69b2abde218677f0db342280a3ccd8009d0c09ba", - "f11ab52dfe9ddc4a9901cfdc3f3fbd39f9a4e784917a4cfcc062d29ed058ea37", - "991f63e6433509d7238965ba38ca8cc93b668ad21a7294fb106a799db078144c", - "05fc899cb25c3c177192ecb9b61133214f6e7d2ce5b0903896928b6ef34d86d6", - "00f66bddea8f43aa4e084a6b3a39cfb90403b62a312a45531e186e3fe5ca0f55", - "b741475698b1550d52b004fcbb9bf40f5d37643c21b7894864fa7563f21bc936", - "90211b95adc1daa19faf47dd5c739d115d0e703c8573df50b089153f25a6e254", - "605e5467e840caa3197cebe40e4b086cb7a3218e99dca25a495bdcd93e984a75", - "22b573fcdc7728e2879827216af6b66ae2bf217f2be3a4be9016087d1eb99786", - "217022a3ca4e4a15e7d1c510fccbcec67d2d9dad560a1290b53e7b4fbaf94397", - "aecf979bd9639b59cf201c47bbbdb87614bc8eb5cff0aab9d937bdbb95f2e8c8", - "2b07ea29ca1e27a811284a02cc2c402b58bab317fbfee0f0c6321e65cb28b49e", - "ff0c584ce11e37e7ea2a2b9c5476c8c13d9b8d9a003e40524d4e5cb8c54258fd", - "824464bf33a80d8598b10ef890f2ecbdad5bca292e92710359968ee7463594cb", - "6fd7a44736bd63e2eac92abf6ffa318422fa87143bb4bf68da5db808c19a85eb", - "79b2e95c92e2a897a1dcd90dc08797de0a28d141faac7a1be94bc192353fe60a", - "cef00dae8844adcd7d179a37270bc85aee7fbae6fa3b04875f4622b087bbdf2f", - "66cd64242acd5095904b97b9f93722597d8114764136f8fe227f3e390daf4581", - "f3a5536eea7b2c29ae7cf714ac004021f86035806c9ad24a6acf1e8a19cbcd34", - "c617d8c521ebf74859b49af090504bb3ddc003f30105f2235b548312064cac65", - "726f7ec3eaea02cac043cb2cfe2c262bfaa207098cf2773bf87636d6e7085f91", - "492aab4c6273c2fd828a05bd8f5685dad9fd902e76a62e99e9c2594157b55d98", - "b9400149e7e93ebc70b02c9a2a18d5e30da6a2fe770c23381690442d298b8fa5", - "4e6b459fa85bb8349b5743760bf626fe7e68ff62729ef09b0d8d674a3269d18b", - "69561b664d6f470b86f079b1957c6ca2981bacaed5f4a7a5e6b603f8927c010c", - "de3c94c0b85fc2ce6c871c98867f829eb63e0b2ba049c2f0b0a23aa43fa6a9fe", - "04400fa048fcf92c4462a9837ed80ce5d29bb5be337e53d1c755f3de297bbd3c", - "073f119be2130b63ba2b6723010e2f313faca06d3b925518824bf0f8689d54f4", - "720cc4ea20f15fa095985eceb4deca3bd98f8cefc26a5d541526d64d1dfcc59a", - "80a0ef65fbc322ea30eaff8d5b2fc680ad6040ebd19a0885ad511b02d2e5ed3d", - "945a0017ba58fe562e4d6360e900dbbdc60d5ea2e376697e0c32af0cd23a7537", - "a46ae643af41c7bce30cdba66431cbb434e1971acb3abded2e1b8b35ddb63467", - "1525bd774c7bd41d84ecffe5db3f8082f9b66a125ff7affd4813839993e7f467", - "30f6afdfe9c0fb19f84561e71c3ce78c821b6f4e97b773afcaeceef3cee1c726", - "707131e5b7d6bf0fc193838ec76fbb6b01fd6612d611cb300353492db14d666a", - "9bb1333b9b9ffd930c680c776c1fa00bb4d7b7395572007cb159a4ce42b0883d", - "5914c84a955e0c6b4bc50d4ace93aaba249b1f3b621ba6302262e54c7e352947", - "181219c395782be76dc6c47bdeb0b77c26e16729142d4f1c1d93fe1c2eedca5a", - "55c70206971d96cc0fbbb984b5e6b6330624f5bb9042e04b409f9a99d620d9b1", - "8fc935fb59644dc7a5b9fcaed94a156eaacac0752ca3327d04fa4df3dbaa2b9f", - "89d0f5117174551bd466c57af06fb0fac54058be7d4739bba47c40edde9aa002", - "45b5e802e021728ae796feaac482244f328003af815598e477afcb35e47f95ff", - "d414f4d8d04d09e97cdd322d08af4c752e686d49ba2123b8d542db2dc8a834a4", - "cab5a398a9463a519bdd2ab560149199e01c9084169c80b10dc56322ec78de2c", - "b5fab0d1fd882fa58ce1f58a7a81adf82290381f9521f056eb356390ea9dc7bd", - "bf89d49e59e159ab2b971e61417ba99a85eaff2c97dd38afd6853057e3572c57", - "ac6e923fc3d835cc5ab670b38b849abd2dd503b88de7bfe1f80537414e3749a5", - "73ae76fa0f442b4c97e209782cc200ec931d5fbaae95ae2f1ba90e4b2b2435ba", - "7b1f66af9b555185b91149b6ba65890a1ca8d628ba4dc062526e03be4b89668e", - "38cd9813e2c82f49cc3ea1f5c8c8c2ffb11c288b91fe5ed72364b96178b45798", - "c083b6e8090cefe7cdf083c407ceaaca1bcee4ecd0a5933570d81e0fe75db5d7", - "f870c0b58e0a2b69e8e71dd90bd036f990abd5404f982480f2dd6d4f44c52e54", - "3ea1d857cb0d8c8a4f15054e80b7da92c8c4609fba03cc157143fcdebc820248", - "fe7bebe158e11f473a54af03558502c4b89a6c0fe51345456bf18be67ea5cffb", - "68608cb0d5036c648c5f0486f3440a1be80db46096f0b8223dc4afdca90f29f3", - "2037f5e3113ab318eecd84e28086491670bbeefed4faf889e298d69841ba048a", - "f47925a5d78164c66e3a4df74bcb299bbeea5eee21dab9f98e358d7dafb9a1da", - "1983d5abad19d5bbd4d9721bf64e4c207e57ba9d193b44bfdea47f2b11c881e7", - "317fcd2c3e3329051ab0582419af1e89bf81c858a8ac7f9fbfe86143be89fdfc", - "fc1541e547d84272cb0daedae852714efb8378a32530993b7e1db2c94267503c", - "9b9fb4206b997ab6c76155eafc4d09a780459b09f53ee5733ff4fcdb878fa7bc", - "1aec9d8f4d6e1781f06a55fe77370b345197eb4f0c5f130f391412679a304289", - "fb3da82da0a27ef77f9ba7281b541cb6c46ec9697a36f804c81d960a67e76c2a", - "619852d2135fa0a5767bb1997ab1766b58fcc7bc8d803a818ce75c54eb0b79b5", - "9939ee0704f6a117725b9ba6e023ec07be74abd85196df6599b881f8a1e9933e", - "d0e7600377634ac7ad8ff42ff809212a7e93cfa338d6bfffa6a00ccc070308ed", - "f04bbc2457466a0b00ddd4947cd2d8539288ce158469389d8f20b165f03843a8", - "40f1004c45b4c3e489c035ce8434063c6652ea7f6918956cb6dc08c3645c94a8", - "2dcb33416b6d991ff05dbee8be969f9667bde38ad78ea42bd155e7b6abf63b46", - "0453a73d7ef8cd14f3fa21736e773aa7955dc29927370d3e0959078d50461789", - "87a7fcf2aa13e7ac86f57a7d5fdc6bddf189e3752ac680c49ad78b9bf0536007", - "b528aeae991c343a4050a5a79b822c9b930f2d35e5d4c497021a440378d97256", - "4fd56d54bb0fe93c389ea4f5a02f8b07aee58928abb05352912c91f050507814", - "62d06ad09277a5cfe4017bfaddde60e7041d5d3ac7dff87c080cc19478b8fc57", - "e36fed511f19c8239d378857f683286c2151231bae3a10d3247e56e1f649b5aa", - "1df1d44cf0ba91c72ac83c087f35a4d6e1ca2a2b8e0890a01bdfc4d8818b6478", - "919e461b228853c9144b3eb34a0b048613be1dc5aa2a31aa78f0f61a975a3ad0", - "a1f040b702cd65b1affef29de2968357dd600a269f16ed781f549532016c5cfb", - "74ee64b0d5e6df2e46e6e22b17dc017d0ec2cae786f498397d181ad801380752", - "8065e8471f2bf43b1d4935317618056039dd0a694c5a92f68a371ff941336881", - "fb7b7f7916a977045e62ccdc420a81b0ae8c977494d521784ed9845d35b8432a", - "57890737de952107408dd549fca71e16c3816eaceac051c09d7e65837915fdd2", - "802d8c4523209c7a088309db13e1e44c58f5cd1ea592f70907a2972a31085345", - "40665b1080e7933c91360faea2b4cea6997f34ac38126811e1c7106091f0b984", - "15462b3d25c8af7fc5c6f8a5d6bf525709a27ea9ea568be33aa958dc7f39aa2a", - "376b6d52a4a99dd09797be1d2fb4ee73768b65cb5a06085070aff36a0a59e526", - "a30d49932c8f4bb00a605c68bb990ad47ca9bee6fda7ec3dd7a4f2f3e8a0ec69", - "e0f52068573bf68282a97c2e1bacf5b49acc1af3e0e99ba4fe9832806331748c", - "0d8b956e65095317dff177c96f3519366c992d4aed03a474d4fd86bb67bc7e15", - "7ec16df683ca5d6418ef7b68afb9adaa3b60560b778e3929031925f8ee8a4447", - "bff6fa975d0ed76a6c61d8716a13262c1b79397cdc17bcaeea3bdf537648312d", - "fd1e6cc369ee545ad952b9894b79023159418d9cd47817c98179632e2c2d0118", - "18aa88baff6a9a4f3a823bd268b06e9176d31aca791c7216283596a8d61761fe", - "fda339f913766b03c6eb85d6bb4eb76f0dbf7d21669e1a9fd7e8ab845ed4a208", - "0dffadf89fac4422d25f5db0942d9967fb2f9953ef361fe6814008a60aa7a2ab", - "361863f327ccdfa044e814c9bd5bfb32ab8da3708b94db7c6801a4658d8bca5b", - "a41fc94bfe4a5e1188127ef9ad33863cd2c5767775e0790cbf7e0b00ad14bdc7", - "06d4882edfc9f78ce2b4e009a06b4160c228ec5937533bd09046c816208bde43", - "3236f2deff5b0bc98d8c332487a5112f0bcdff793b8c327f8e4f83bbd1190e80", - "6a0bf89764d2708e0e7b7aca49c6e98c522f936d191a31d4586f4238f8bafa61", - "76f1b2275c28a4206794e7caa16d93e72ad78f03cb80fd358c4cf8db0df8ccfa", - "420af8b1ef52c9dc0e99b79a26e5e08d1972a310debe10d0e9f92b921ee8ed78", - "1c416e7465b61cfad3cf5e882e4c91584431a7ef75fec8e2c360c2bca075d73f", - "45f6d6f7e17c38845923ad5dbc909cacb15b1af5b03138e59e668670da48181c", - "db59779a4d3e387bb8c24244bdc99ccfaf373ae15a4e524763e940505e04d6a0", - "34d21752abd48e72e9e8e0ce03eec31eceea51e1fa54899c5cead4f56362ce9c", - "be3779a6fa4654b60312a8cbe4ea98bd8442d60fca8edd62e84836680b5e5f3d", - "53b6353e2003075554e10ac49d1342a23e41bd2202981859129a127ee48ca281", - "5b18df7bd3d8af69e850187d8f02d7744915cff771c5ea1021ab7883a01bf48a", - "81841ec804d00452f457e5853026113b8b7446839c80f4d7aa998a26075be860", - "20d159192743f9f4c3db05a0eed0726e47ecb3736ebc779522dc433046c7561b", - "8206cc8a142d29fac35ecfbcdc2a7a4d08146193a06c5b3f2cd70949db1f8ee0", - "58f29a3d274352db3f84ee0fa116fb23f2b99c44745c14fe84bb06b08c73f136", - "76c1e7c8fceb99a176bc9e5d21ffc4c11b76af1bb24ab8df04225394971a9ce4", - "db4b704733a2cac92a084166cb53aee6c61ea73eb43bdb974bbe633df63a251b", - "fa9498c1f24ee6c4c37668b66d4a1401b44e66fd04765d2512043f4bb908f3b5", - "66d24fd836e465ffce26ca032accc105214fe134f02da1d4671b9518e7092248", - "ed7c8a0a5a5cb476a0b6669b47186b06b3277e54eac4f0104b3bb4fcfad67a01", - "496aabdd6637fcd7df1beb4b977015d9bf6ea0cc44f064d736b243c1091842b4", - "47f9318485f70d370d053235f9f0d828953bcfccd687bed8f01225b24fcd039f", - "3241898b60793c4d4d91ea092e4d2603c7beb7229087fb12a3c1154f11d6a319", - "583d80edac302dc4ab9fa8551de98f4472a17b3fd4c95a07df18f444a459c967", - "17304ff562e2acffaa7834303dd9f625cab7ce75ec32a006d90483b9268cd721", - "0a56735637ab40649862640929f72c6b33718fe2bea3727a62586b5d48d10d31", - "9a1904b981271e6143dd8524b3963feffd7435a269f00c5aad88a1621086554c", - "a9994a5b2ff5f0cd7eb7730b97b6144b79b2bebf2a1811206c72ac0f37d0de99", - "e356fd6fdda9ee6cd52dec089ebc54a36fd334c3afbe23726290c00714862f85", - "a58d0f8352888f281fc934b93fa6d1eaf07a1b8b985d6fe1d353b93643e64130", - "def2c4ce42983f72271516e8826a78c20b05805296469438eac683b25e503428", - "c573e5dca3dd3ae88efda96e90393aace6ecb157bd063300d4eb95fa2c783f33", - "b17b32e5aafb52b5cea153652d036c68519e4e3c493f29ef45df5de0c1e5aa2f", - "613f6081ce262e5d463dce76f7201f17ae0acf881bb797f1e23eab72c2d7d405", - "1f3de830964e73d10c068fe1ddd0787bdce6b9877e606db07c63da63066ccf28", - "60957ea1732e1a17f3e4c8b605113e8e7ac5671edebd54a861741249509384ea", - "66222ab21056f3fd9677109dbd2391fb2eded5596b3b98d7f45c2ba03cc80250", - "bd85d4b36f3f9a4fc691fea1ac3c884ad5aba75105c2b2eeee68ee17b0f66b5c", - "ab767ac854972addbbfa7f3029abb2326e5cab0693d9223b5858daccf862cb48", - "4c8f975ff209c28735b39088b21d993880385370af2c85a9c58f98a0b29b8750", - "ff8c3ea62f57a504ae2c1844136d54914797aba8eeaa516c19cea3673e2536b1", - "84849fb24ef63f6141b259e3af78ee342dbf6b8501971db436b5be1487f5f7fc", - "3db254616af1c0e71d36b884f89018c087cc327b92eb12d167df9acfcbf37df2", - "e4eacdb717dff3bd769b6c10f185a757f1c74c3715bcf74a0d528db78c86cd2d", - "7d97ea666ad2392ebd73612d1eab12205ca4bd6862de19e547b00b8cf216373e", - "94898a27d68bd40a11ed6d1ea7253377c6efdc6ac8f9075b3c1a959b4b7137d7", - "246aeede9d77b2001916c27bd20befa113b48c34af1700b977ef5479ee877408", - "943c9f5b97462c2c44f3c22b555f29b7a138cafbf31071749af843d67ef9efdd", - "904d57464bfc5187bf22cb4f89b17eb4b4768c032a0bf0064b9fd227ddc939ca", - "9c0ffee0f44a24e82b6aff6cd53dd921b2043db3a7bb2f313676e7b31c4789e6", - "449e5efdb294c4a9f138af4807b662abfda28bc68a76eaec495f387ab2eeb52a", - "b599cc6cd5a8da38fcefd62b112f848ee494c23e6655c80195ac143506740149", - "268f78a45c5f6a453bd305a53caad0792a5c173fc93221494f2882b88332e525", - "b3494f16b352b9981d87d243f59f18d0d782c5f40ef447b2f7c3308abbc5ebf7", - "b32466b8539d05c1f23ee8d4d7c7a9f601b0901deb87fb79ea6a3e720b22fd11", - "e7585670877cf227e31b0fa91515a518229db983e59701c89fa21bfd58959be1", - "d2562eb3a0b1b7d581e891e3cc1732a0ddfad2c42b30a2ccbd6bd8ec10f6ccca", - "7e452b0650c20229c1f6fe5fbe89cf16c552718daecd7e9b03c2d88ad5f4f574", - "7c5697d3961303d6e2fe4547a4de103dec82be08448e1978e45c48908f6066f9", - "1b31a2d90c0ec537fba9eb6c27d7e69e7c872b2821afb35d9514e56ae644afbe", - "d5811464c32d8d25a19c9a18dba04334ab6d9da1df42793427657aaf6be62768", - "72b116ce77cdae4e28a0c83c49d6ef1d4ad32d48445bd812f9f1a3d38a1e6741", - "e2d62f2de0889c800b135304d3b0926ac31f982345e2d12dd112cd0882f02c08", - "ff394e11d4fc1986c9afc99b3d5a61fb635de339b636133a81de8fc7bc5055fb", - "759d86f722e47622cfcae6d235b61a8055058caab8068fc73c22080333d185f1", - "c9595971cdf29d724df04696cf43cdcbe4752df21f72f3838d8bd82f5bde7e90", - "d1aa2abc0275aea8da2dc0b4019f439631a1145fbf9cbcb0354508f82ec8ee33", - "fef44c03f3b4cb1af43186a1455144726ce2214c806ae9c8c9e034c810f65fed", - "7bbb732e92f03700b2ecfd72fd3bb35ca9ce8e461016e55b621c6546f1d4cae7", - "ad2d0504d13481042ffcbec1296b6a082cce9bed7f2f090c708664302607d929", - "1f09fa20a17a28e9f9f6a41435e40419823d0c05eb6d4451e6b6c2a4d7d9183a", - "cf9eba2d31c170a598314c78d70000d0d19a52ad6082de97f52efd94ddf2ae0a", - "a81c98f7582e5d4be6401f440ef7e3ef8cb1d02d01b5a71eb790091276fb6f0b", - "88744e36f978662d93deacce7c726bb201417bcae405f598431719c490123124", - "12c83aa2e7b19ea1bc2cc08ae04dce9155458a199573dd7890bc2cd63be8fd26", - "f0e61065c2f5f49fd2139a7f2d2adfa79cd243153171e7546234d5ac1e1d29e5", - "0ed19b31386be6a6b99422f96851bd9757c69ec9118af7792a9eec436890bbe3", - "d8ba96e045c2e84a8ac3062fccd9e1378a32899dd3470a76037809c730dc7fbc", - "f2c7d67a3d8fbf8f5f2e8e6df060d08c050f28413d30ec2787e85d85dcfb38a5", - "11932eb80fad11a7f56e06a7761ec61eff54a1efe0061be33c85c2ce4ad77c3d", - "d89a7f315a1cb870aa5892a2a36cbd87009b89a7b3ca529f7fb122c9bef5dac1", - "ebce59a37bf0f2a62ddc57a726d99706eda02d36cf3a1cd04b3e8287b66dd53b", - "bd8d69b582ee1c4635371c4774cf1ff31b1b9a5261029351c011b19d1f3049e5", - "4525d910323faefb020d3c9e1f983a0ac5be2bc9f08dd263b5abd749957511ae", - "3b59c41220ab9993721e7af8c83540faab8b73e662eb67fe8cfe96f13f7e07e8", - "9218b22f88970fbb3ed6ca2d8e7015a09623ef52b33392ed97e555fb4d4c56a8", - "63e765b90a28fb14ba257c0450034ee5ce690335d9999e0c58af1cd937092380", - "047d5b3aba8e85b61c1ae9eb8ab96bb2b0e1dc6bfc780fd58d5132dd0adbb728", - "59c987464badfc03b7c6426c0d6af99a73e3930354562f272ef72e2472f1d252", - "ec5dcda7794472d61f6dee750f4b45c0faf1ca367d9bead7a0069070f780931e", - "47f181ffcdeac5f32c897af0f525c5ecc1ff887916901c153e20946486298237", - "b3ec9a5ec78ca523bdc6b37aab3a8517f593db007731b1eed6e0bae4a66940e8", - "9ae73257d2b98a2fee69d7436ffe532bab390743233f7c148d1dd4b36d1a8d67", - "002cd0cd4b8522917390b2d02288a6db25b6ff81cfaa97491cccd77cbe5fd6b5", - "79f0121f937c65065687f5e0c0c60243aeba29e6e57b52d6982d7829e304461d", - "b987c8ba7392ea29366fe7d2f88d2bdb16742213be47141b937ebc69fe692857", - "5ebe9c6f39114854549018ba488c877e76441f0650a9fc91ff51e06936310f67", - "7a8e536ee0ad18b35adc60d2e1a80d2f2725e7f0ef639f334d873b3d093ba4cc", - "cce0142f6dc06ba03a5305bcbd226927d35cad9819550f0f8386bba39bef3048", - "29186c1e3bc11300ea6e462a39dddab9a7866af2b80cde8305765f9970465ecf", - "c61e07b2cd1758bde8a50cee50952c9421e2b65464bd49817c5fa3b0de48f3e2", - "77f797102de21ed898dc90973f187764cbc98dc189f108541891ea5524e2b234", - "a567d7ec2b8baad023f8cb102e73c31cf3181c175ce4cfde030757f03a5b6e77", - "3bfe7aafc9cdd01e2cc6f3e335f7f461e72c178f8d861bf0c26afbb9953308a2", - "3bc0b8a0bd4aa42ffaf573919fd53e4effb538680d2ffd7e3cd96f40d55869ea", - "8f16aa1078b0dc732489a2a2977d3c3c952a9bd70d70c76817e6ffbcd2d5af61", - "b17740826eb039798b60c23b22ed34c7a82a3120d11ee95cbbd4a14c0f6efb4e", - "04eaf7b26cda9d27648d8de05b3983a3e7cec68bdd95a3278a128351824ee580", - "b6233d6ff4f1c96bde0db6d4c0d4e289eea2d3d8d69ff88cca52a42b53f80894", - "2c2b27ecfb1e67e1352066b43b690d31af1a930f8cd6ecf27d120d741d8a709d", - "633cc430849ebc40d2da53f676e5f5fdc0caf785b22ac4ae4aa514f71f549c9b", - "4e866f94e35aa2febb7fa7e0bb20f0ee1e8d42207cb39a59a71ea0b76374cf6b", - "2ea3952284f25fc7f146a64135be38adacc55b4d66c4c909030620626016c052", - "5302ed4af55c0f5e3449cc7ab14854202a213ffd3c46f519638113dd739c4f4a", - "d4a5c1619c0ff5ab03a87e26f2e411c4be4a05741f9aa16771ef1f6eb034882f", - "314ad09ff7b994e932a9ed93270525385e52b550c0245e83f3cdce699ecc6449", - "d8cfa415f442c25544eb9f7669b9ad3569391547e608e7f7b9eba3ad89ca0cfd", - "6a5547ee480aebfbca30bb7132e914a83cbbbc740ebbacbca71efaa086b17f09", - "524bf8f62d9e745fdbe3c02f502a2ae1c6429fa0f1005bacb0c4aaa7343176cc", - "624e6867283d57afb718b53fdba4cd3082399bb1b1b7e5596a1433f027768a09", - "43942b5dc5e230f978555b42aabda9d5ee508ff605d2089ef5542966e19fb4d2", - "e66e5123d0e5b7638172f5a969ff5f280bafc3c7bb028c38d4ca9777763d90c0", - "c6b717975215cbd87265c68c1419e56d46eb225dac8623bcaceabce6773c15c4", - "71970b628fb48112981947f6a7d87f1313389d05d03b16e9ddc88903717e4a28", - "cd8fe3830542de0efd967c9078d1dbb67584c351b30aa05a222843477e7343d2", - "194f7877989cb70e3ed5e28f6daf3015da6c7eddff35a746c1c146f2c74e2764", - "9e5c8d79da6b347a425eb5b8fafc9313f95b91372094a80ec18cd0ad9d5726f1", - "e0aca9804136da390754592a15c13101d291e200d7b145a5cfc9b1564b8d7b7d", - "0397c0c266e98771218a54b03a9e4170e97a66955e7402232445caa0c699056f", - "9589b2a8f2419d0f3be25690e0f70d84f958beeddacd592edd3a63cc26aa0460", - "25c072bc9d8d948e66cd997414c29d631f0adef6b66213b83a81ea7701e04054", - "91300156bbf276dd99dc61c573207a9e61c0b9581c7f34e622676aa8d94857bb", - "c4105afe72d60f26d5d017c37570f15f326e450934b7df4b61453fd712c061ac", - "004db7daa9865f27508866936a2b541d67663cc3e496bbcc80a4f516a63b5e60", - "7bcbe7e897689e86f8ca4a2b80a1088569339efa4b0ceb2efab93bdc6e24a0bc", - "eb25f2199cc1fe72f1bb67064ff64d9025d3cc5159ff8e263774f8f69a4435fe", - "320b19723e130e56f8285d83e5b5370ff6990517158075d423b09dfc7092d6fd", - "5eba57890d135bcb7a5fa0148c5e2e9064736807543682617d331f7ba45f7c33", - "da1358ef02b1fe302da3e33777b2393436c26a1826beb03d8a744ceac4521cec", - "81d368903341946b037489ea2717e1c47b37eb1615f2e3cb29b90f1a0bb9a53e", - "cc90d292b041b3cf0a4bdc4e88d731c668934b90e1358ef809ba20478b2ba1fa", - "038236e0ab3d7c4a4aed61c509084e84aea4eb2e1100fb0a72278ee75ccbe13d", - "fbf3555e888d2498e61d54fc7939702bebaa192be4293822442e0f8f0b96eb29", - "4edeee9e9ef59288f54667da733aa284e9e0784600ba463a2e3b6196d79ff7a4", - "2e1ca733a09fbca5e381bd04a300dc9b73b83d7e2a57137ae3d0dbe3e6e4d139", - "157b9517440611f3f07baf287d4ad7373d565711d1c5c9bebc30f37f754dd34a", - "0ffacf77fbe640666221d063ce5ebc3659cf20c3c1001b1c408de981946af545", - "3ec6f21ff7e4e6b64f7b2ebdbfbf282fdc2019752de0c86703b022358bab3401", - "662b447ee5e9db8d0b6fb5d34fdc50421a4a8f3d944e8e1f91b345cc500537e4", - "ce114a7a7b460e4d2eeb6bfe6bb2544b5cbd4ed1a2e66db49474c2ac3111fc25", - "4ac705a8423dc1dbf28de6e425ab8d98b5c8cc651881163049742acc9b200431", - "8c482134d1bc847ea82dd6ce55dfde4887d2850544b17e490d493b36a220a071", - "057c0246904e55639e0650bdb1dea6450e23b27cfa560d111f85c54a68fff63a", - "656c80c658f246cd13e7cb9b8e3c1141316d736d2020d5afb9b355f7f2c7a0e6", - "115ec0a30294dfc1950b19e9b312c570ed9c73d7df46df8d59f497c246b96a75", - "432b12a29a296e1acd0b97ec68b6ef59048be744ad0a7c25f526624612027279", - "fc54b0051fe3ed7a6a3aca2a33fa9fae95e45578de3606c15954e405fdbf74f2", - "30b248ea76a8262ee0a9ca70724b41a90a855ae9b76c9e68802290015f161be3", - "39c59a46180bbc53c976e4007447ad846c4496825e2a045e8de6acba10ba04a2", - "885ef4445c91e210af8487bfda7d1eecedf50b027a37476b369ae7e2d42565e9", - "62d295f45500ec074b9f9ff1869e9ff5007c2c79f1ca7ae14b5d9966448d44f5", - "b46c046bccbf4c652c5827026eb9e0cc3fc06670d919c972531fcc7e8b860016", - "ea66d859c2dd61078a5075490fc49aa93105a966b890259c06e68f1ae5b402eb", - "ff1d40387b4d70db8e6e679101b50470d52f7dda2bd47217bb3cc7b6c17b5e1b", - "aa5a15d755564a4a94c43faf82dea8af3fd6958f9ca413865fe4adb5ba180beb", - "cf27bae6918499c7ddab8311c6eff0f165fbebe0896b5fce7da7c7a8378ca1de", - "c82f001208510914567dd1cdbbc98d1bc05ce4975ce6dd5a581b40ec539e6cf9", - "d1042408b82a661acceea6208f22cf473b053f28123bf0ce2834f6b74e185186", - "32c1b6de20be0b382e7afec53420cfa0bf83050eff09910ada228035c23b4d7f", - "40371ce4276688a5fd1a0c5ee92b86265aa5388b7e702b3d924717ba7562a2e2", - "0fb462462d51257dc04c352806ebf68d5acf666848c9c299793ca969df19d35a", - "50ce3c71a71411e52c82fc3a679d5f9375193994c7e7e6917ffe387b3dae42e9", - "76e492ffbc7d599410aa50da9b3736e0220eb2f2e5bb8b97b096e6a26b0eec10", - "947bd4c7c9e5566314b3195925ac8fab24970c7b01545e050c80bd495834cf3b", - "fcdca80b650812d2587a4eba67d8c12b96482101002f5f2313d14e74d5a4d4e8", - "de17806d033d02591f1a7a57216208b3a0d67d36e285460d0ba02010b5f57762", - "cdf49cdf940057d61ab7a382b1d6ab5f53c3cf29380016709bbce74c0685771d", - "c30d8b54b22d87d7062ea9d5dac8c01977db64911287b0d728b96759a4eb5e4f", - "d22386d671441d17cd5ccf0fa2cfe4476ae75d735ef9995806ac2b1043625117", - "d22ee71b93c1399c8f99eb9ec17e2facd36f14a47053e25f47a28b3ace15e1d4", - "da0cb9c45707ae2cb0e928671aa129cb53384558f47cd00bcc57b4ef32d5858b", - "7a5f4306719936fa9bce097cabb0452e9e7961b21918a5764722072bfb005cd4", - "62cfceb7a88e992efee6d072128dc4fca69adc954cec2bd064dec1beaa377791", - "97d3076c8f957bf23c7040653f0a560059619e1cb52cf38ad0ef8e742b5756c1", - "5b0729cfc825a15f387ef3e7fb7653b2572fd57f31b76a7f3bcf5c7212b01e8d", - "5140753bf194589ff5e88c43a13db7e42449ef3f7aa4a5a0674b4c2ca031d2b6", - "868eb1e1d36dbac0045da7224245552d5fccbfcd88cc036c4cf983e7fb4a4839", - "9ce4754d6d257cf07bca14a7ebf988fbd9eae09f697aafe88256a99d4372ff34", - "4db11270cc9200b3f28f026afa1ff99a43cc2a514e10428df0ce1a8960d5b6d1", - "0ab15a6170b17819964f5595f825b8b2738b6bcb5aafb62c1c14d6fc8589c645", - "e6808d05c1610193f81663fd18c0a3537d9388ade8dbdc9e52d78e5610300a67", - "0e080f5dbd8a8cf47ccc02fbecb0033350bbee0d881eafb9cce5703dbdc22865", - "f67b7f04783ea3b9b36bccdf5e6aadb0133d6f03f1006bb0c93e5ae883f309c9", - "37588aa03311c0a169116278bd4725841965f73c320b22052dd3c9fd4f2c5d57", - "9f45330b345f7236d16bd67e0a32b692bf6593f159cbeadb8cde983dddf6d104", - "9158f42f5985c0fdb8a7ffed5e663d60c1b780063e0021c88a4efa869788454c", - "8af949b3f7cee317655652a315c3e2c9152a0ab2673d5d4ea76daabe85060c15", - "cf8064f54b97c3e0eadfd064683998e172e6f3bdbaaa8041885cc745b97499b3", - "5a1b76ccd128054e58bc404853164f18695ce1ed887457268bbb3056fe31bb9f", - "8fac92e9f79bc381c326ed3f0808fe4a25e68f8d5ba4d6c907f6de3013a8c91b", - "464639a69c003a06b4a6312ed1b438318400e7bebb28e10bd0c3ccd942075573", - "500067512b942c396b2a9232fe8c68e76878e3e0b0a1a69f5e2239cbfa6761ed", - "0206b801d7c751cecb8c3aa700047200ced318fef5239a8957addba45aba9bf9", - "02b9c163fa1b0c265cbf7cffb1e2a5711b06d241905edcf867a28b6092cbef2a", - "cacdc8dedf1cae44c49d4f1291064146d49f18c2781395320d99294c917b83b0", - "b7eb89e1902b8aa3df4573bb9fabb87336f96cb65cbd2dfb76b88bfc7c325293", - "96715c3b80bc5d2ffce83988dd07f5daa16ace990ab2661d470d2e974612502a", - "b0539a23f5008ead14f7fc792952e3cece502eba5f0f9f7a94f492701e9a3faa", - "7715c64266c4b5d06094e4ae2cfd7ff471fb57c5643ac7419772093a5480e1d9", - "1fa73ad59f2218106be5aadb6c68977971b90204f389e9f5f4c74759d6196734", - "99db47f6fb84943f5087275f3630bf0986d239fd77dadeb997493261e57e339f", - "8be0bba58a089022adc70391389ab596e710128a4d35f1d1012d7046325976c2", - "cee46344030d7ff9a371bc9bbf9a31d38edb66968a53b2851fc94b107ddcd1ef", - "414b3e17a7416b628b04c6ba472a0e117993fa0b25f66d0328fae2930f13f7d9", - "4bdc7f89ea51df107d3c418dc9932a8b958c2da36a7e79c1e8f8d2d699bed354", - "e804fb8b69c9bef6d52d3a5e8e632f4b87e52f485233fb0b2d9e3327e3da2731", - "76992449c3ee03ef37780d0800d021f598c8596a9a4635fdde88099cea28b5b3", - "bcf8ec3209649ea9150fc0fff23bd71183a1b6ac1475ba3580e4abddeff89b30", - "f47bb7726dae4696ac6162e0dcf96588b03cc20c8279fd2371a3fd2c1022021c", - "57347cac2e2bd8e5d4891809d87d74d4a5b6657965307d111feaf1f771062872", - "878a344dcc4ef59462bb9bf8fe0671025685058e71988f192dbf4be7e15f72d4", - "a7a1c6c46922d18076890e201bc174198a9663ebff573e4ca1da39a211b48247", - "8b7f818c9024ffe89ddddfbec2763649240b4e6512a1337aeeb3e216825e578c", - "ca7a92f7c5907656aefc201a97f03b8254a1191fc5cb5ffb5bc59dc3828efca1", - "877fad63f8b4fcf5e8ee0d0868b3a771abd6edaad84910ac058bb8f887762c3e", - "0bfe3fc6b7a87caf95fa5c8349d5c334bc386768f39ef7825953f84bd75f77c2", - "e91fdf519639eaf66ff330edd69992cceb1924bb367004b0587f4a7b0b8959ab", - "760d0ff313975f85f7a2a2daae29eec9add05da9360420c454896d5b678c247f", - "fedcec440ec2344b319a133fc151b5af90c0a7e5aa7b975cdeeb1c1ed96b5a91", - "415e8090412bbc6bcf5cf8bac953981f44538ba8acbba4c84e7f47419b56f3b2", - "13376537920fa1bf8bef99f1c644a7cbd7f97b7e8108350ae1b94d9b1b85e8c3", - "9644812c4ec04440582e6edba7c4473d5d60037c319af604667b054059c610b8", - "9bdeca2114d9c16eb48f42968ab669c5f0944b3a898756999c4ab237f2152b7e", - "034008cd85afecb7e3f35736f5de1a02c5b0f5821fda457c3bb3de977bc3da67", - "79d23fc690f4b748cbeb7667414b6e4284089fa79569b8684480432cf6876644", - "b09639a7c293d1a25ff82aedf0cc58843fad073f4febe91e054aef848fcb696e", - "bc56fba874feaee0a08b651c9f74293fb2ad8393913e6847f37b9c955e4bac43", - "8a083d8db2b14807f32a19f92f399b693c76718d69360491ab0b0fa9098d154c", - "6c4bedc164fcc94f892d28fadab66c029ebc975e37c52b3644c74d7a129de99f", - "59cd9456057fc54adbb553a0ff8c61fb48e5d0bcaa4d15c34900032fe88b8741", - "8469054d5b1db4fe80f012ad1e57b2957d20e11a56b2af87cd23cc99d0b85254", - "c17f238b1832a8ed35f8db0bc780a16f74a08f507839f1d8147d5760268fac0c", - "be93e18bafb925183b4bd72ab58a0a4da7b05b572d4c28c052fc974b148e36ca", - "7161fd87ff00d6e8f5612f48835a6bbfea82fcc27a24d1697530deb0d7aedba8", - "3a6cac953c01eacc74533f110f03590be92d181b4773c8e245768cefc451921f", - "128dc755165f5cfa729044d15719ff200ba7ad7db450bc6b6fe63bbbd6b93bbc", - "686a761f74d6285b5acd60142d25e44808da92ec543ab8623acf6d4a64fffc8f", - "05656a8bf11681f95bc59d0fc86e9a815bf4f9fbb94dc84328ccbd3156a3a40f", - "eb322840ab9474bbe0f31012482c64d7731fd06d21cc1a800be9cd352e83f338", - "3d1f9609d6fda817628734a7bacaf23e10a3ad4c4693ba893e15a2dd2c231a5d", - "ebe395772416b1498fc3a5bd3dac63db447dcca1be0b53ec996f3350a0989949", - "c1b34c1bcbcb1be4b663a8060de7aaa20a0201bd995a095608b56337be85e25e", - "ade8d5606a1b83d0aedc1d4e4fbea4bf0ceb5309d56834b51709b6e96c661e0c", - "eeda64e34671f7d7a291aa466308c6508b4241eac6e088fb95dad25162e5f795", - "b32c8022dcd2d55388886a1651652fa2f97b02859c9bca1eea22350d8833eb37", - "21f2dbb7cbe1ff228ac6f780ec452a5082ce3861aa28c5ee35dada045e1fafb1", - "44d98d55d52c6dfe5261fd4bed14f5d8c83de0e6ea509bd89f52adf934111a43", - "4e41d812b400b4b6896f3ce08ceb973ba7edd71c694f69a8f1e0e135f415d628", - "8bc0fe9590ea7d6010ae5f533433f64c4685c13e55a10f59a8bc4c501acd9375", - "95a2fde9c92b8db149c30d2c58b609b9e06c7799ebd1d041d26db9995f3a5702", - "32a834c270da8442907662a5fc5b46cecc30e1aa1b44df8966dfe9295cc62a15", - "375ee9a5c229e7056b937fa51323f5bacfbb2d8bc5324f882396245e076f2815", - "47f2727b5d3c73ddd858010944669d1de3c76be829434814587f690a2e0e4ae2", - "f73650c84ab154aab85c4bb42733006426f7adb94baff6553bbd27c6a62b9d75", - "2f4b29cf65fa4eefb2c3920f67fff520d442070db3f761d4c5052236e9c74322", - "0ceaa5d3f906a4809fc2cd46692f37979266f3c0005d3265615475fb70653c2c", - "c3e471aa01e14f943895261d8fc23f49d6577944ce7f8f6ac481e8d367643720", - "1faeb63ab995b2a63e561c1b232c15b292a03d110f9d173e88da2ee43190af74", - "4506410e05d31af19db4d18acf284d6d9cc19da5d1693d644931677fd29fb0df", - "a0cf8c88d51a74723f72bb538f4d839269b17cacf99c33531aca21875398370a", - "524ff020c58397a6dcbd0f4dff6b983633c80fdded1e7c2cbfb2272e0a562a30", - "cdcdbe5bce4d98058a300f1334a14daa39d6f9c04636930adfc250c8e19e891c", - "e5a6c4f6a01eea4bae3e4389dd8fdf5ab5080b4a9e67f71fd4b23f70de377386", - "713ce98607c939074fbd1bcc954a3e0972cc628c53035342a2d1a05c9ba4ecea", - "b142abfe3ec94ddee6bedc60f75873a3888411450b1e8647f6de636a1d0165ac", - "c466fb02ddc66fecbd707169fbf09d2881c82b45bea92159c42318c7c403a9ea", - "9409b0307be3e51c7b7cf6a6a9d782b6a3e15cffafcfbf2bfe55155db0a8a710", - "d512dbbd78c02445d52cb467ea93397a1462b3afaac5e9ede2cd98d9c1461718", - "50c311917923b6626c00da51a1bf67ccb8a075a7edd42e8cd8d3dd4dc4a3a6fe", - "9264c9e9952a5da591ec1a9eb2d8cbfcb9bd466db18c4722038a7a2a60d98b62", - "da39bc865cc33a41f3a563d7db09b369eda2b67cc623d7c2f736215798322f07", - "3a77a422ec8e6ea9a8323c7af22ca1d22a650e1397c7b4b05838b67eaa7a8be7", - "d71a879632e1123ce15a3e82ea49eddcf3a1c650a5a2debffda4d991b8ef1744", - "d90be626b27daabebe6e134eeacdded9cbd45f486e597f8224a7c7bee28bca6c", - "5e29f72fe0644ef8b2b629e6d89601ea97e017107f8951e1047da54c687bc3c9", - "4a12a1b4252523ea04795a9d155cc1825ddc853de332fb19d31abebd0cbf2609", - "14b1d00afb96cdf9a1affcbdcb0d42c105cef38e6b33e07223c7868930fed35c", - "f248c05bb754eda7e1d528f131808dfa8cf89c3fc0b3af22a1785ce0768b6291", - "74a961812ead01226c48e2058df41fd880091165314929c1bf8c6c31e74b935d", - "5a152c7d60ea61bfa584b4953c914ca2ef3358301915a8996dbb2ca66aa1d518", - "39d48b945a8277f05a798c355af244749f7e13bf47cbdd47492accb3399e46ba", - "1c03e40eb7cfa521459d04a1e4bb06a9c556d83f1d37358932cafc49a227ae14", - "83048117d0e88cad73aaaffa605b3afdb1dadbb1416de3972f4a48f03ce1b777", - "aaa2c698d6360c4476f9e5d094265aa1f0bd6b65308266927ab5caea5fab6b07", - "75b2d441f30729a37ac586a444c0086c13f41382a9f49f6b7a317889adf724a3", - "93522908cd0eedc81822a7110feedb0ba2e2622d9b905ece059908c1fffde688", - "04d659bb3169eaf90815db16c566f13df07c02bcb33c820a905de453ebad78c1", - "ab98623d20041177f2c93aaaad6bfb5f741025ac0e831965b380da0668261290", - "50902b581709d9c61e75c0adceeb15faf5e38af991a9415e8ff7004e0a2a7155", - "fd94350cfa4c658eeef6a1afc655d9ecdef975928716e351d4f558c5cf086884", - "0e513b3b01ab23b7d374ce8fe459bc446e7db1317adc4d3d2a2caf67cb9f4d93", - "06f5e7bac4e1d472f81670096593f718e700540ffd4f3f368662ee436f664bc1", - "31245fdad9793c224921ee3ad39bdbdb59ed195ce14fb27c581e6edb24dde9bf", - "43499b17cbaa7a7c923c00998f0defa6ec73f824c01f90f8c9aa3ed8ab9eb2de", - "58fabaf0ca3f4a750cd3555ae7e0ec3257990c3e401a498cc41474915af8210f", - "af565e3d441e783f5391bec373cfbaf73ac004479bf5e02d0324d5b2a8e7b75c", - "b3a65a56e8f1c08f80f3ce335e9bd02f4bdee49b6d852b006aa317db36f20000", - "e0e4697064f547392df64965343b1a2b07bd6ac236da3920253ab48aca264fae", - "9883e86cc94e9760a8854c590325e00c504c3cb27a2a4e0880ad3ee85e3b0d1e", - "30956a18d0fdd64996d7887ae1232238ad6689a345c1ae11e6da4efd3bc74696", - "88f1d61246d271af34f4583ac43d941476d8bf36f92bdd8c32174167924014a8", - "f95af0200ee46e19de98a72631d37388da33671090ff558b41b47467c45df071", - "fa70196edbf67bdf78d1744ce1453f16880f1e4afbf910ca2fb1905b98029b46", - "03ed99e88fc97ac331c247e952bf246919a7821f017b47e538a6079c4baa36a9", - "f99da1be67d7a7c54f0817f722651dc27af5d34f061002219aef7bc984edf697", - "3112d8e51bef61e4d499c311197874a81f4fd9d5ee17e85ccf8ff9531709e012", - "aa5db88b88cc75c899cd8b760991ec164672a4bc4000001cfa24da011793007f", - "b39da43992c8f3e25099950f36c8eefb936ffe9ada4ad5e7aa8ea2ac3bed5011", - "62cfb7a9ed78adfbb416d4215b449bd4b75c86dc26fe19f82459425c4c4fb108", - "a371a018717abbeded4e54c2c9406bd01baf7ae7c64d2673d112a67a0f88dab3", - "1c963bccebb0ea98da6a74918e2fccd08ee5672255debc4ec63d74c081a551cd", - "1b6a99f45832c05c70f441313513704a5bacb2a8e419ad997b96c4a2a8857483", - "d51ae3bdedabf0f7678d2f86aeb2547ad29963b3d9a7b9600b78bcd779c742d3", - "d5cece0f184282dcccbbfae8b3c41ae6a64c9301a9f8b76af5a13330dc61830b", - "7f7cd5d34530d9fe3a443fb197f0fe164f57a2353ab685f395fc180fd77016b0", - "0d1e6115bc88b1701c5925bb5165472530903c4cdfd34db873622334dd553f16", - "0608ee1e3a59cad1ec39a3aaef23024a956bbc06e7a38b746815a267d780bffd", - "7ed2de2833451026b7dc764c50f209a4d98cfb47e084ca2e68cb57c4581737b6", - "19692ef809f8c28a670751cf04bb9adb33bc5b19d9d56741bbaccb4f16b51f68", - "0df6347f73ac3fd73bccd881db1349c29af276d4cae04d6a7060a324182bbe14", - "c84bae747de75ae45baed0983337bbcbdcdc6d6a464b965379b76fa810619b5a", - "919880daf24ec96b301967e4b9c967fa9a23c0930942b61133ecb365fffd9a92", - "bbb00edec2a10bbce7c369620729dad97c2b97b044438694f0a3aef92e39e28c", - "eebd2b7747ad472b05ea3b7d7bcf5bf3be956535cda19366961ec8e576fdaa0f", - "a76961c6891bc46721d5fca6817ee2355e23ed7c296b371f97334b9a916f1614", - "32da40fd4499f580b851e73513800abaf00b4d9a14f3a6a97000ae83ec8891f4", - "13a5d158e5c610f17c443e2d85d9452d5e54a93992571e2cdb788f5638b85530", - "33fcbcf6dd7ad4fb021fb46a157ce4717838e9e709386f04b16b64f358c82376", - "66348bd420a919e600c9b51d24a9929055394efd758051a3fbc164d9f2c51f70", - "289fb92f4893616a003809593a487ae4824800fbe114c50d2a1077f5b43b0a60", - "a0d301ac44c414173b334c425e8a7e9afbb1e837a5396f87e5a67b9668d503b9", - "f535875bd71fe89861e6487e74232427e6c86400ac57ef783a6798a9166f1801", - "ac4217b1d4df9c3184f0fdddd8398b9e287363f41e63bc4247bea51f99e37985", - "673a8628a0fd70461b3b2f24cecfb60eb96c0005da779d980b3e13c10b1bb7ca", - "49d81a91f500da1fb64499c989d6ccde218b09c65a9b8b665e61bf4d4215e854", - "e993e6e9c432450b956bfea382f292d8320915b62115185684d44a342863c985", - "73c493f31d114b98ec488ea4ac3a54e0c3e63b75a2643361f983034a4e14ac55", - "42deac7d1166f8c67b19534e1eba1662c9a1467d0af9bcad216d6d995abc0bcf", - "a76db733fc17ffdbcb3631de44903ee947c1cad5417158081416deb3d1914ce7", - "e10848d9d368effeb903a9c8ee5a1620ac6c21dc997af2025d9fb31abacbb829", - "baca6762e7757539e7fa602aaef62857282fece95a4722fa5e3f6c5a5eb9c122", - "ce6199e00bf13c22c755d4ba734bb452038253871dab1d81de52e7b49ccae6af", - "61805e3aae63aa9eeabdcc750a9a34f8b5813b5d729ac114e7cf40d602fec73a", - "c516ce4ee936ad98b0d2772a8d8ebe8babf2bf423cad595384a4af0c259757a6", - "fe94532f69ffd8be2ba5bbdd990cddce753d0c8c9f5cb4450b1eb7cb454bc6f1", - "91a4fdcbf30738f66375a89186d899f822ed614c53f634ea6419316eddefb55d", - "5070aa44e6107ce6d09669e6a5931ddd1d7f269cb0bde2284b64529f29516f0f", - "c1e402ab07c649ac0badf95ec84997933eaea1c3b0cef4380f1bd81b80db2f10", - "b2ae7965f89310b0e3c03b69a055eab47cfcd11e782ff1ed7312888e231c91f9", - "131833d5b9ea55df1149d305e589430481e996ca33cf108965cd86d619f64bea", - "756d49a3ebe0b5c72fc898626bd45dae5800d45040ae7fc42498b769708d1e2f", - "469daa5454bab365730a6348080a0410c85186eb1ca0e684758ae6c0f9b18cd4", - "65e304424067527a76afe308c0a50af89f1a51225648e36d87ce535d67f45358", - "b33bda11672677dcac807cccc0e9544f2f579dd5254bd20136ccb838cae3d5f2", - "ee1fa8f3be69805bbfd1895d9783a475eb6f62e7ee5abba7f90693c3b8d70805", - "fa3c38c0875d72d6011a37b86c5d5598a3ab1ed260f6846360d840c87264ffba", - "42aaa829ae264524cf6b00970a76faf94e6977ebaf5aeb095809c3ee213895aa", - "143132562b21c20853c97724a5b5884ce4ac9a918fcd9954a4a359e5a9c57fb2", - "a132853b9687dbe6acafaab883d0dba451241dc8673e1796d8fde679d2257dee", - "1cf2689f24610992cee41e669926bfdba4f7ac7cf0437d722208c8fff14ce574", - "654a90546d47b53d35dfd74f776959541445dc01a24e039a16f83dad95ff247c", - "0e47c8763353b6014ab9c6097e6c3f2b0b1116706f1f927311597c5b19c9be5a", - "d6514c9085c637062d4a2f6fa41dcbce35dea185efb033311d607aac04176b6b", - "ccd6a9efd8116613aec155c237e862442f0dbf36bba48c00fbf03c1fe392dd64", - "96b9dcd7e0d7ca0200d6df6b13a06ad206c2c10126fdc7f6d840f598b59d7858", - "36c6844f6dd99057534b7d266836019cc0b24ceda358ccbc694a9f902a6f44c6", - "0fdff8fab824849a967fccf58625ec0b9c112e7e79e894784482a289a1ec8ea0", - "26b0a58f8658ce9224b9a02a837ab52a3e5d81b1fd23f25089da3bbaede38c1d", - "24a91d93aefa4720cd032c34b928575ef7e18c2451f885a3876272b955610139", - "49f40bb1e3c384d7771e0b6972e1f5bb064ff30d6325558c65020f0c3c6d0ac1", - "25c35bd4bc38b66459ea90406af1f84768e6a7b79a31b00cf176f81a4eb9b234", - "91e544403cde149b480dbcbc2557f61418c6abd0836032f8bfff5187d37596c5", - "579ddf42c0085f6d431453f1dcbcfdceb23e5fda90b8ee9ff94d9f34ebe29f6f", - "1ed92bd0099396c48b4338708f131927a7d24c9a7f28b1eb143443c2fb346424", - "8cedc52397c9b48b19a134c3fc3949624fe42be021476cca666c1b447f527ee7", - "e7b86126dd2a86693ab028ebef151cb0ba4bea6e5b34aeae8287643c4e19f598", - "3228033065a0ddf3be3a031947302fd79100c3e17be8ea2e97cdb0f25e3bb672", - "44cf47d1c8e742b24ff93456f11a2dff46bfa891c4197cc93d0f5859204e6e20", - "fed7bbf181ae5370cebc0c8bc7a34c1d878f99ebf2a21df22c565c92d031f040", - "4089bbaf3e75b28b12ee783e236b4db48a02c0838ac72da7b636bda44d5d0d09", - "ddba2b1175cc1242a9b49c1b2f1d18bba279aaf4771cbbedd8bb0a9436bb14df", - "6eed42ba0a0a864918eab414b36cf4fb67aec7f278e82b5bf3e08a944af3386f", - "06d75869b33cb384547bb1677ba70b7cd4b862e8e52c54818f00ff4954ab40ea", - "ff40f5d43f76aa734356658d681ce0d204adeeb440a857acb8d657d81daec2f5", - "1135f48d70241f0ee9c984f8fa28c8085b4e05272bf5f877b3119fd3c911f516", - "5852096089be42528314d1bd5cc695a587aad87c7faaf150377776ece8527d0f", - "8dfe26b9ca945320f5deee28e856019536783776120eeb59e7e6101f90427982", - "6597084baae0cec1185c2060b0061b99278e64f58990559b8fc26738257a684a", - "53ddbc1f0dabeb11b54e5d042bbdfca477205bb3f18079f458f1690e21206d2d", - "13e34296c083f0fa670aae4643065c200f77e9caa6c42e6dec7f4f444412f3bb", - "a1cb92456624b741b6e1e56463fa4d1dd9511c89eb87ceaa2c5df9b79b9ccf37", - "3a61a18fd54fc0d9043a414543fdea3d4f11ad372d669eff9f765e63d8602df2", - "c4cfb5eb8797f0158e74422f99c2063bdfb4e72f5677abd07440c72a35dd4d3b", - "9801a5a4b856c9d6b8ec8683e0a2dc494aed4b858d921fc6002e7d51ca306499", - "03a8c5c30e991f3684ef4afc26bf86362fd49e91efafabc06a1ad313e855595a", - "d5720a3d43b352608ea0f8d7cc6f9898e7ad9070c29425b91e3f768568afee36", - "0395d2d6cfe38b6f89f68701253d530d6c45e66d2dd79acbf22dd9e445b08aea", - "201466486bd67836e997de84a66212346a1e42ec9f05e66be613e7dceb9fdb93", - "538cbefa10ffbf59cfe0423dce4fafeb2fdbd7ee1f7fd05a418017097f5e71e6", - "5a773ef29c1f3a4066c0f22e7c70ceb88d5f7566b6f06da5330b4c35dac6a088", - "2ae10d1f7bcc31968dc6162f9be12c26e4ce584f83bcfb8a84c8b1f0d16d071d", - "fddfc9abd25561c18c48882caa06afec7cd80cada9cb7970afc274dcfbbb0b07", - "560acaa970e7e6c715320a9528dda0008d1e0c6adb7a85584687752d21e6fe60", - "5d82bfe7003ca8a5d8657efa26afd8057236c79d6a51990b5a09884ca9d185d6", - "9fdc73cadcd9d846ab3b6fadcc730071c2d21dfc78695ea8db7236492110c6c4", - "48dad5f789c1f13c87b892a73f0dacec7edb651aaabc05e6ca6f6f23f25be2cd", - "d5d469addb7a47fdfd8c477b7fb11440caa0cbf46c9a0f8ceb770a54f2aa09ea", - "a1a2a8d3d356cbc7e2b6229b41e9b01888afe40b9e6f0a9e84ccb0448a21b4e5", - "cdaad115443ef742026e2c38701f788d35b4196fd7bb2e6b7da9c9af594a9d6d", - "586a55a73133422491b61e86aa2f3cd5be3a594f0ac1a020b1ba7869256c9a4c", - "202f817cba8b07ef263298610d3bf6afc0d38221ba6f260515dcae5a5886d82f", - "a34bc55fc86722f361c463b556c67ebed87c3def6f5770e9f45927dbfa9931a0", - "b7606238da6304a4dd3c027c64ab8848a3345014c300dc409d34d02a958e1f6d", - "bb07e4c8a780ab300a1eb40636fe4f041fb569011d52e07dd7c484710807f6b6", - "c196bd8b97dd31095c73a842fe8544e2ebc586fbe0503af1c9b36c2c0526bccf", - "978501b9eb7e46b602881a48248fa4e9af9b2447c97675ecb4c95d732f1568ac", - "1af22d3f9d15bb9db94a3ac2c52567ae7e8a155fb5e5ce2e6d1dcac923445378", - "1dfd1c8a1eb07c74168838f03554a60e2ba54a0c3e84793abcbc3bb70ff50443", - "8a86ff91ab47c46c13a6d2d4ff73a164bdd898b65b63c4a02addff22502a4ab4", - "154d36d90baf96c7e3e9ea8b6775db2207d9d84a5b93d34384f93a10e762313b", - "238bb848b40fe3ec8d1bb6d7c657b72ef177dd385bd4d569fc060f8115535739", - "a3a3daa4876a7d7472eea500061fd2f57107d0f6264e4b813929fc94ab6e02e3", - "c8f2944b3d5bfa21cca4d694fde15b52508159ebda8f3082b92de16bf17c4f60", - "29c46525b3b9f43907750be4ce4b561291f1045093b5d6e10d6dc7dc442e396a", - "eda74fb97d11c9931bda5bda897a7e52012d0456de365dbab7ceaed691df56cc", - "544a9f1559861d6bea0e7ba3336daa25a600fdca302d5f399f49250ae5edca96", - "442a8db375d279a887ba1656bd98c342ec213f43f1cbb837a9fe772f0631bac5", - "dd274820a314bb9096cf2a057340e19b3714217d1c8c596a6828bd5093667bcc", - "75d5e9bb6271798214b7aaa64ee1e7ed77b2efb1035b9ccce639b1b8c370a905", - "4c5694e1ee8d871947ff3ee0d38c8231daf6310fd81ea165590b145b5662efa8", - "03f79567da104684a21b5af35d21b0ec07aeb414921c3eccd8aee27cc0c3fc81", - "f6376e69c2ef31d99a3daa22b0a588c4e6f4f83d172e2a39ec968f5446379ed6", - "d5010f1bd76cfa0ac18ce8899056c583ad1fa426af37f5106665f8d5c9a169ed", - "eec84eb834ddb4d4f0cf18364e7590d28f6d034851d6c4ab99be991e6520675f", - "c40b518909634dc99867408a6e6db5e5bdc5cfc2a997ede098d743f0395515fe", - "20c62e75f1e32ec8d8a03028891fd674ce2f4ef7e91b19374a260d76f0eaa6c1", - "7a46e8ebd85c289a9b769a1e05b1ae4d55896f910ab8dd72126dfabc285c1e86", - "184b8afcc0723772cf6de8b6b9b023dddb1b8c28948a762befcc629ee031adb5", - "208dc93767a5bfcfe7cb78f0937ce24e4a193fb6901dc0b48e08f2d299d9c3b2", - "faa26f6d55640d633a2f4c74486b7332863393e0f90422bd4a159effb48ea5ac", - "8f62fa4ff6c6aa91a78926836ff5d431083587d91af8935fe1cae67feef841ba", - "08b1bec6dd1969412d28d353add5fb844490bb9503a04f60ecaed58d3b8be841", - "13a767b8f5c177f0047be9e451d3e0f77e751442b890aa4eba7ee516c26181d7", - "1ce06111d8b1a58f76144ea870a0390ce78106398f241de209cbc4c2fd6849f1", - "07d9793363c4e653479f9bc977459e2736aac742692e31463842da8680448828", - "2d755a5df1df70cd446ea170918825b49b1cb16a724ee779d40ab4f1c42c01bb", - "050ff4594a213e43e981014a4a382475004fe649bc2a18e1be2d109ce2f38735", - "d908beab0e47f8c9884aceadd48a9ffa8f96e972baaf21b481a9522d11729b68", - "0661b5a0bb72a03eb9b409e4847a8041785b1f900f75d6af1d4e16840837674d", - "74b5f16d59f7ca31b6f322618def07940832a50bd6ee5dd74cd89ed2f6dae989", - "c6bf956a825685a96668b065ebc0ae2660adcd50ceec55001d644ace15dd7fc6", - "2ade4084c7952d6a123d31a916413c3f505c34924541995dc91c4b0cd01d4c8e", - "97298ecc2e15c81ff69231f7d23f0d25a24b1ac9a0bfd430ba77668a4bdd3b9f", - "215fb669ba3641f6bc33a9d2680dd0173fb5b349b7c00401026c6fa732479cde", - "ddbf9839bac9237e2e54f6dba2d70e7ff0614d5cad485ee1e55485a3c3a8cc28", - "b830eb3e4278be8ca3dadcea4226e18b6ea4e906ada64f32dbfcafcfe91dc5f5", - "1426f0a639798438dc73db83e06816b692d87cf2f0f6a2185d7f8281cc6f0967", - "6adfb3a5363466bc359c7fc13de51a1f8a809fec9ba0cdabfbbfd09e0d8e0c90", - "0af2f30ace2d5c4d3ec761165b5219ac28adcebfec11831472a05a87c9827315", - "c85b40a883907fb56f5f3b28d2bb91dd2b28784fbb57de444636949c06442aed", - "7e23631dc809c4af5302390eb205d425832d5f1e654edda1c25d69cd00f4892d", - "97046960dd673470063513830d43c6269ce4b7256b186e22677ae5827160bb2d", - "185e71d30f0ddfcac7394adba8c96787625ed3d193c2dec0fc02a68b9c447e7a", - "f073d3d51678647a3a6de74c6d2107e3262c24c9965fe872f2fd98b68dfa989b", - "4ee469748ae7c4b3c1dad102d6aeb26235bcd70f619f8763de71e202f3ae8e99", - "49f9e9f3c83579c517bb8a40b832357eb264c0807a80d0739e077d30ddae74bc", - "fe82c6024e7076dc7711a5b85071013d2449ddbce95c7c9e56274e5549db2bb7", - "1504907b44de396fb7d09b3c00570e45b2b4e7a5e7232fe79a733f23725b8d84", - "334dc058249ce6dc13e38d27b6d0950af96e786766f28b4790c12716ae311112", - "300a11f39297aea3cd56e34c2c5ff30ce8a8f0761961ca8d6917f1f4e4dc8bd7", - "30ac4bb44ac44d2983466aa69cf4b54d057ffd064ede44653e4262ecb60405a1", - "459f08b7035afa8993d7c2196358c4bab5b9664ad566dea40ba5dac8f436fcde", - "5b97300280e38fec0b6e76def1eb7dbcdee341bdd6c32720de9d77cf859bdaed", - "09ffa213fb5e7798ccc191b5dcff9f48feb39ed9178f2446912daac20a9fd422", - "c1d1a1bad9b4759f563c48e8ff22f31f147598a22ef44a1a858f33efc2cadcf4", - "a2b8945ff03c606ba6e0ede97316f10befaf5847433da99d54f564f30087a371", - "42eb384b3f5a6f2f4f4e1b0aa21851cb914612ea6dbd7c6259d1f7f1fe23b3bb", - "a02487661923cffe7ab890fcdd14134c65d7984c2182e081d32a6ef7f28e58eb", - "3d111ede56317022d5a4dbd1ca297c11c01627a81d5c50f51745d4872fd27db0", - "df3be150ee6332004d2f3992640c0a0f58a912eed940de7f1ee7be40086fac2b", - "e6fa2bd6836e4c4e20e2f4e6dfa1deb2f977fceb3f4d50a78ad69bbd26e37914", - "304daea83877755ed4a46845ca36bca36592d15038dc55d995766754bda0506b", - "22c87439d9dfe1ff5b36c241126a3fbeee0b4fb7b7e3b2b1d086ee30cccee838", - "f6eb019c1508ca06d34089600432938059ca3f3646b11bbf21a40cb9992703fb", - "0f55489909df1326a002c9a81cbe62868a22bd53f395304188e9d8fe704cebd2", - "5acab3ee6c5103e049f1e0590b0ee5904451157e0458b47d56672a2200e92902", - "fc21055b78115df03287ff17b8ce5d1a7b9471d646c5f61b54477164eebb4dda", - "ce858287191b471864c255cb01b7dfbfbeb6e383d5be8152aad3ed0ecd073f92", - "3eb57e9739fd02e82efa2112daf3fb1219b4e0e0c06a8d9fb6c3942640e08452", - "93ba3427c20c99231acf7bcdb271666354931bb9d86fc74373f77e2d655f4f2d", - "67dd4588badaceb6f63ffc4219b34bae1f79806df5b869261971aeb1005be9e9", - "1572ad685405f709651a416eeb4d2450c27157b566b2d5e19a4a3945369a91c5", - "764e80493fe9d8482c4ded2fdc5e45d771e64683563555b008dd436c51bf50f3", - "b2576b157f09271fd829e67b652d2782ffb8c340dc11aea79dbb876a8b37b3ce", - "38f4e40371b4574eda5d6f27659e9d0795695bfa2925520638c9e055fa158ab7", - "3bedb15dc3367dc84dcd5cd36613968202ed7b6af4a6ebac9aa33fac52c47211", - "5a792758296295c0e29e7ccc163e0de0852dd8a9b7a0bbde45c180ddf3a62336", - "e16d7425c20d8c172f315391822d8438bb385fba253b47e5d85af19a581d44e7", - "53d806b9effd9ff82aba88ce3ded910d5b4131f29ac893bbe65de2f2f67122d0", - "a14d7216b86c6c86cbee5eb59bd157955337b7f0ccd55f87e0bf6ee58662f9f2", - "ce625a85c8bc3e612e6a7b7c6e2f998085192c336c156dc5cbe5122a14820a2e", - "c4669fedeabcd339b88a7e9df2aeca728a0ddc0d54f3319c6f6fe32e81c45d79", - "4d5aa615740903f74b2bb3a45f75201d957a6e9001019dd6351609a8195734df", - "da93e6764252252808048cfa8faffdcf40ae855b2f46a47f5ed5c944301bf8b0", - "f6a090c95ac9c1a1e759deef8f5ade0836106cdbae330f906529dd521b05bd64", - "d19f2f2ea998b0d7ff94c0b4ba622dabe00c62ef614b69ba5b134cc120fa0722", - "802bf54c8a099e40125581a1136da8b82f9998b827412e9b3e73288eec3e6976", - "5de0e4480143a8541a5faff9f5254d00d40e424a4281e4a56a1ab8bc13c71dd4", - "5e432fa9a6e021ee6240f3213d8e5199c91634b1636397163134bb511203560d", - "9be421463d4d8eca5ed40c7bc74d4e904206631035842b9b378ef8c0bf3f36b4", - "3ec0f1005a357b01b601e13462f6681433b9874fe1a2771a943e3807373304df", - "b2e4ce5817ce9bfecc5933876f4fec493c7ff56a3c93b903d3d589149c22ad2c", - "e23506c94788b14a84519af59e63645402ca0573f45071b0dfb6a345f9b50b36", - "6707f85f069e9ce70fbee694fe74b24303ef4c151eac8cd65f2c14096a993434", - "81a3a5d1d55f7a1f6ed45f0489606f5b5e736011ac174f33523ae0331d3dfe27", - "a18810bfc9534a4a549eee741fc819496a7ce8b7a64d344faf029fd65478ef7c", - "91443d65d355daba3b883f730c72ac7495570dc9949d914c8383889758801c3d", - "1aa055e60b7f1e4e9b7a78b5d0ecdbae33256df2bdc82310a1fd70af5eaba0a3", - "7964531797582c661caf399747f6eb147afabd0baf2d683981401e45a5ecb27b", - "7adbdef87a2ebb680a6404c9c7431456f48f0bc0865bc806d2997d27c2b524b8", - "a5b8445c9a70bad55bdd3ff942ddfe0be12f8d750bf8422fc2df924feab76a6f", - "502c464d3d3da12a432f5f62f86fb982dc2aa6892c911a454a555e168be3f323", - "35ea471846b32443ec21dae9dfe3a8ec08201bb2b11c5bf2cfe455637ecbae27", - "9eb05860cd57866ded978fcd9e9fb6606186cd5f7716e0da7450c20dad7b7827", - "741ee35721a4da0581b858070670b594102df01ccfb2558185671a688e4050c5", - "35431a0d877f4483a9e5ef242ae551a0a22157174f41938407fbf76b640b03f4", - "2ec6172cd7bf91a58967a46c67b442b13e6b1122b8f536c39990928a1608273e", - "69aa30075eaeba8dce0b68ee0f49427b5538a349c793ea3ada4f538055d84de4", - "36fbe6df31562e7d5abc2d8e40592000f0882dd3eba3aa1b93f3a86acc2c4a2f", - "26b70a5a25e75509f5d4078e190346b4fb9ab28f30d15b9b94d18b0d28837d1c", - "c14c1e90555469b6d04183287011c8dde6345daa0a3f117b1fca2d2533492670", - "003d2c27301bcb5eb470e9bd6391ec5546e1e0cc9d5f9e11abe4f6e518489a8e", - "3df7e9d141c1a995352c14b1c36547f3e25c01d245b9785cf0b6cfb17682098d", - "2ed4ccd8bf71d79362c60e801838b1a0c70d3b2cc6e0b4d49d292f85f096fb8a", - "5092d5c877cac1c58da3a47996bdc7c7df21ca853005618a947cfc99e805f721", - "01d4be227943f5d530271e44dbf07b88d50519d68faa771835da096e7ec6e339", - "d20f892c7deb40dc2fde04d0d94ab638896926f292eb4429a79896009a1395ec", - "5dcaf83f23d27812fd1da9f86b655345bc75ff882a50bc249c0b1df192964429", - "35623f3339ea56a049fbb104d52313d7455690451769a8a3903032b892a43a55", - "5363d36de9f4eff57450bb032dfb91721aa69986b262c0c0ce29686c76609bac", - "97141fb8dcb22f2484fed5bf8d13b877ad2c61a45349ac5d1b6761030239f22c", - "1a4e9b8ca64094a0be0feb12a445a56d1119738461e527e726fad09194483333", - "c5e36248e970e16ead388002766e6ead36adea1617d325351e6da26cefcad819", - "c56445b8debd0a66afbc15c2d0e5d9e8a4364a3180f80e28189e7b1a055ffffb", - "48995650ea7a2b27fdebc7869789d494bc5453db46512f230a32fefb3a471b53", - "36a39d506089325ae9dcaa90453ef4db31107c21041a7ac5cf87a4d9ae2f4e32", - "0e6256da6d0a1d644f866137d37a4aef1a6f5a99c82be13376d8fe065b4e3489", - "340d2e361fd0cd8118882d2e106487a50409a523945ea56329dedeefc0392aa9", - "7749ae8ce3937301fbddc72dde967eaaadd3a633ff534901ae2d6100b1e16287", - "5b70138529f72c00157de15c65d5592f2c082659c228f193e3c4866141cbcdd4", - "a749d762f2262b1c0f2164ad926789e6cd764ab1ef637c1b0bb9a3a710be781a", - "32a7e2a4ed61c8585c17c04ab786b4cdde8969cc9b9aeeda865a5238abbe07bb", - "086af4703cb4091c6c80c0c8fd57e07570dd67a53161d8f51845ca09b4a8fc02", - "e7dfbce3787bac09eef1f96bdd7e31f4c89020321105a490fad7466d309c1025", - "3abdeea67d60d841a90180efa7e613706249e37eca117e5c5edba99e4d96b1da", - "20cae65f1d0b0339fdf59e3be8ee541bca8e2846032f09b50d3e149e319629f6", - "49b0ef4f77a2d03cdccb019c8e8439826b20f4027135052d9ffe5f0f564e5497", - "0e268e0fa40b72d7ec3b6f71d5d3814c996b3e976b32642990a33f3ac87a893c", - "5dc32a5986c7342c2ea03c423ab13928d8991260ceeb927ba7953934dfe506dc", - "da98dc1549f9ffc03ee559fe35036f2a4ae13f5e2dc0eb7bce49078dd592fd83", - "a647013640660d50e8bfdeaed2dbcdcd83971800a4f8ae04d945ad01770a9869", - "7d1f67160daa6a923b3edff7d14edac156d36e6425896c0dc22792dfc51d47b3", - "1118a9ae0ed358e18e7109285f49c51580e8b0137a0a7cb5d0639ed68155f5c5", - "4341298d915c6eb4e92df49b34fdc5ac8d69cef2a2536e2dbf2a1c47ea1954f9", - "00b0477965e9f106b908110a7242f6548393bed1e5bf2c3586be5c500ad4a99f", - "e2d331414509a4324c62cf9935d513051b792cb4a20d5b17dc22311148700127", - "74c6b7db8109c365a4eb8609dc96767df12d5547982c5d82f6706c656bf1a84e", - "63ce7fb0f5eca5e59ed5444164fd967059c5c53f0fc3ceaa3e47cb2dd9a0153e", - "a3f8a78c1b355b8773682ef68bca4338fe196d28c08d54dabd2158659a244b88", - "f78c6e4a40b74c501a1eb616b5cc94874edf5b19eef3646602fb54ae631abc64", - "58eb83c2878d28511d783dc7e5582b42443920d04601d2d0958a035fff5c700e", - "6ae7dc5e7a28cd9c82db5033964fc2b9c0e24f33316e3fb726e4877998ce07eb", - "51f62ecf21a3f50e33ae6243d77d1a1d20ccad485ca9189fe43ce901acc8f49d", - "373100b265a96c87cb8ff4571ed0620e1dd3b262626cf0761f264cfbc1149d7a", - "daf4425717ff40837ada1805dbcd24df3b46b55b31d1fded0d1ba355cef67629", - "b9d30d7c292f40a9d1422724942ea7e2c588014553a8f0f3d0f325be30339f70", - "4c8bf67fc032887fc9b09b4510d354a0e5309c5983247b4737fa49d87268b2c2", - "0d963209854f07292e14cbc3ec011c8902688b30ecf0269cc051657a582af9cb", - "a9df67851154e19aaa287df3bb3001c551dc8c9d2017f238408990936b4b2003", - "aa2e276efdcc0cba6f465409a5c7a4597b977543d8d1a0a2e1a6510da6f2a9ca", - "ed022d9442b1e47f9134358260cebb066e916350bfcfb7dbf7efcb3c9a592353", - "075c8a2ec5ff115a1eae8758dbc6ff7408885c27db91382d7bf9f0a8ed10d1a4", - "99fe4410af78dd9f62bc517a3a2d761f76f1825306c3cdf1494c06ce26dba806", - "1cb6a47ec05cfb4d33a9072e17c3ff4faf739e9eb949b2c79ce72c3feabcb96d", - "a7d2b6392d955021ffb6c7dcf0ae73a155ca319b4a17c6266781a38074dc1b82", - "eec029a153f7475580eca3ebd30fd8959bccedf7a8c21976d85baf4e9d7e4b76", - "c1640c8ea6b30f5340b1b1473571d7c4bdbb08420d0269436bbcc138b30ccfa5", - "6fc0b5f710d8e7d7d8fb13249b5efadd914b98d3fafe7fe58e8fbb2deff7b7d3", - "2c883b6082ee08785e02b8c61264a425815780263971777997c7acd2009b3ef2", - "c0f3103ed8020bf873ff8ca34620053a7201967d1e71d59e74af9f40cc3ac571", - "f9b31316e9614e07d0917c86e79425a14647523d569eb6c49e1383e22cf8d734", - "7d9ba331dbafaa0e47aa514c3cec544bf6defb6e2fb85f667c67988b20cc0f91", - "66be98c77033309d14c9cadde303444960038285940492ad847812e48c226223", - "3a712081e43b6befb64ab633bcc7acbbb09159d1e1636da6e60b6bd39708f54c", - "8dc734d7a4bff4571628a0d045050384326e069e791ab223de3b9526edadc8fb", - "ac30b1a0d56e8d3305015b6feee616d6e10f3c69ee7bbcccb138076d717a6f9a", - "00b04035a70a0a0246d9d84c19d4fc42ca88af733b38f3667978922ac3e0fc7c", - "2269d188f5494913e576cef8328384ad90ef43a82c3d00ffa2a48853d9dd711c", - "22dfd1b6ae6ca6a62815d220785dae073413cfbcef5cc2001d3e345e21c9f908", - "8fddfb41df7bbb2a5fabbe7632fb524c8db76836892aedbdc81079e4d90c12a0", - "2b829f87b8c6f13ac9b28771ac08e66bb7add8b36ff9fff67a117ab967983680", - "b37f44ba5195301c2d5e485bd379c334f731e29c89cc0b38d739a410d65a1a64", - "0d369ebf50a78ddb70a929a54c5d848ed74780327c215e6b8a1a9f08871afc60", - "c464432fde194a3b965ba97359f3ba489d21ac543e17c454ed4b5eceb8da9000", - "80862ae66ce14c1065caedc539103f9e1a1f58e0d9d3c1764902995b5159e573", - "cebfc772a999c64bab6526123ad24b5eef51e52ad80b824e8842c79357d5c506", - "29d7f8cb7b7b16ae0b43603538bb6fc0e4401b7428bc62b4410557d9ddad6dff", - "4842481945473320493e925d6d72c1dcc136bcbca9d57f684af6e42b467bbd6b", - "66aef319d78949e25e526e4b899b8171349c04d0c83334770cef6aaa7fabc30d", - "2ba08dd0c9637f1f63340520f1667dd1526cee6ce3870169f96e132d5f408d25", - "f1a784970214e768a54b6dae5b2586bb19744ac3f3606374492af4b371187991", - "6dc616ecac3ca2a17bfb28d44e98f4735eb6e4521f3222a8c641811d133254ca", - "a3f7a7c4b75a5b7b2e50898efa1a0cab4d1b08635fdb31d83d45f7e37e120661", - "ebc5760c44436355e2b0fbc3bfe2cc85fd90a6ed1732638f1c59b142979ff0c0", - "138856bcdaed766d7b203a7e8ae5b8c0fad9fb491c835e0a97ab00c9d283bd58", - "295bd1e53ffcb2beacc35dc4c0c1d0f71ef696f49d314c454cb9708f6d7f2551", - "66b0020886800b528d0ab7dc89beab0662eeb17539d85366ba0b284080b6acd5", - "4c1d5a9e2a635cc84a49d798da341b4b377c7f1878d473dbc346aae36357bad5", - "3422e8f5a87219208660a6f7487a8e16a6eb95548290140927d203d459c9790b", - "f673535c2585cc01c372c26d85f609ea214268a1fd6bd069362cfe933a03bad2", - "a59a765e899cbf9ca440b520bd64161ba75eb1a9f237518eb01748076a535b83", - "4de05218b0fa0c1be7d7910d5ca1da65947d5865540765791c24ce5967a367fb", - "1598098884568e4f748c6528441ffe9593c227f141e7e53f19ae9d5f97badfbd", - "c10ed5fee1761e19b52242291741b68a39c4397e41e15bf24f678c6d334061a3", - "474f3da89a173f1b3c338d47e16439636e6354c909186db9827bea8dfcc53e10", - "866f3e0103cf45b3de468c4c6aed34d9d9ab9f26e2c5871a44f1af322744f36e", - "07202b8a0cafa8876ecf5672c1a696626cd1b1da1fe0a63b1e9b9ee3666f4b8a", - "5727c92a42975664f73ac91c5cd36a757ab7e740b80bb42268f76ac722953509", - "b1864b7e658aa83ce649d4cb50096f435b8f463b65d5288945358205bacd35bb", - "28181bdbb9021dd227614661f77f7fc13cc4025ab3be515811b8b95f67947f8b", - "c7dc3ff1c359af9cfbd2cccb9e9cb59f22ec928e074bc4d504951c0e34a0dd31", - "0d5b22337471f7f13c2adbb3065633f8598e3d331a63c486c2b596bf6910113d", - "352d45be2f3dd0f7650850a0a7c8b382246748d2956f2c378ddc43995a5e2554", - "29b5b953cd4db8bec3c3c6ecbc7e946b42b5d75dae5fef5a326f79b0a80de60f", - "e8ac41404b37183973878f3ed18bec8a9ad1164cea4d4d7bc60010862e0ac207", - "46387ae376ebe4c0746f4bddedc21a4adbbf6e18f1196f7078f7b4f3e2427165", - "778e8e872d3a252718ea0f0c87268f592e7ee0062c885a9cc77c561e84cfbea9", - "1416107c8af2331ad0de8616f8133ee26a72825c668fe72003a71e0e1a9f56a1", - "f91c2d822d757142112c4e21e525bb633f65146e3fd4a0f3aba9ba63baa2a756", - "d9728ffe22444f460d6518f5824e74e50821facae324e7c0137fbee11fc2ef76", - "5a3a56312c3712fac0322825ab9bd5fa09ddb1bbc0f0895599f63be38ee10fd9", - "cf2e4546bc2799ba5487ba68f10c3c7987e43aa455c95219109152ff35e84b53", - "832891be6162267b6a2132e92224d32bf0a644cb696995d5f13857ba39c9d5d9", - "13f56d25f10c4d3d97260f70e949d93ec85a41b3f2effbf024f24d9d2cfd2e61", - "2dad0e05f1d84a78fbce5b639e7d0061ea7493d914462538362921330d35382e", - "0bd2fe7b4d72606280a544c42c34cf476224d3dd5cc19f188c52479ec3ab599a", - "6b9833f1463b5d63870ee81044512c1dd767dc7d0a8611abbbaf2b346e939bdf", - "739f5970aee53ebc9835a6a600129397c2c67394122742e235510338a750addc", - "ca4e764ef84245867655733353ac78161f17a4998ecf5f2bcba36fb479961a7a", - "51fd688b65927414503d490375faf55329770e38fb8efb54675a88292909874c", - "55ce2e49eed9cea1a455f82c20ee9fffa744c974e5ab039156adbda38f548bb8", - "fbd77f4d0302f35af0c8bc59958db12c7987b6db17179eb4d0eff1995c75da9e", - "4242b0fe394f76d55a4d68e97706b04ce40c3a692e80d27bc797e92610c15282", - "332c59a9cd5295ea86750f69fd72fdde3851cb437e705ac0a07ba2d146208396", - "7db492cf16659356d361c2bf892b674e042dcf5f8c5602d6ba9afa483696ed5c", - "cee96615f657d7da688d569721d446d23750bcfef1a07975c26f08146c9079a2", - "aff38bf4fb6e9e2a15e5fb3adc7a3864f34833a95deafec0204a0dd06631ca24", - "9c433a0e70aff1669204bb926c8b4cc708f71505fba5863026688e2911f1c5c6", - "0dd833d046786635c1f62e5916b10dfbe4bb1f1c4edb320e2c4fa08db455735d", - "a6a306760005a16c186e5161d8b0aa3126afd8ed84ae9d12e7b236adc127fba6", - "cbc2c3edafab81e9af32e4c3eb50f0933cb10b4ef85c552226f9b5187e36ca8c", - "b0ae6e42cf840a5e12afc5ef24df8b1825e174d976635839fb67164c618b87a7", - "50c19390bb1f9634481c36e84eb3c5ae23214f21bb081aee5d57c007e1543cac", - "5ed209d78f8a051f6512b9adbb5d4d7c310afd4700a7554535a174626b7c8e2f", - "6e4264b654052c25b9b603bf53da29005bab480b5afd30b61bac36d6a285095c", - "b9c1f73d6adbd9b3fdfcd47e03d90b4a74d82026c52e5c32bfc2e4ac3239edb0", - "cf60d9de983c80e97b7d7626b935501e395a261ec600a45c9e2099e01da0c4d9", - "15d7da9469aa628ffd8e7ee3f8d00772e8d67d74c822446bd34621ec894066e3", - "effba9e15b3fe62ae2b9ab901ac18c17f23a6c22725f70b3527f08a519b29636", - "a06bd885bc4883f4044067f6699a0186ed049c81b7289d0fd1dc3da679fe66cb", - "ea2b260abaf19e2073eb38dd7ac9f78ab88fd451676c6a6dd0595c6cdf1fb329", - "00fefc0767f1cc0cd4acf527974b909354280d291a1ad8e00c083aa45868e9c0", - "6dcc79e64331ebaed5d29c1cd31e15566bcb33b0996f2f599729b297fdbe153f", - "f04a4dbc456d35cb6fe7dc18c5d9f902d49908a9d7b00c87c74f5487ffc6c63a", - "7c7e8a11af894d4afa507385be273fc1ae537b61c00af4d6027fb759e3636ac0", - "1f54f70e70a0d3eebbecb2b1c15894cbb47d3c4e8f6f3f6b1eb2c0547aa42b96", - "e73400f45bceb843ed746c85932ea7d4ab69a5a7cfae8e54b218586e99eeffd9", - "3a1d7deda4529836b86eee5b40d16feb28de63795a7728b61971a92beeee6f81", - "cbdf6802bf7e832fd8b75b073a26c4b6c541bc7ada9f806b27f7a4ff4a8406a2", - "e106d1b643d1347bc7190eedca7b9db15d2fe53b861f9e0da5da2e082fa0c7bd", - "13ba66186c1bbae618a0a0785876860ad553a5ad6c5596aae1ed0337aa1253b7", - "f39a370ad0412af8767ce3b6da369ea192ae73a64a2461075b1cb64cdd97d657", - "3ed18841aa79870d56659189ec9712a1818eece787ae566c8fb77eafba561d46", - "545936d4dbc410966daba976c786a213a58d4f73265d9192e875fa896cb7470a", - "be8b729f2ef37c888f554d2916c58c561f15c5b61fad4f290437f381b0fe7de3", - "8332e9f6b89b4f09996c175009c6e70182c0c6b712466306bcfe8abcdb822182", - "19f913cbc739da7e6b4f725b69aca0d92faa05db8d6b7bcc5ee46faa9faf5fbb", - "04fc3d8df6cdaaf0a086a5593a7752aef21515892356fd56a083b7fdcc814c61", - "7b0fae022876ab310d565a43c2738404392bf08a2e05f0af401fc478a805d255", - "f5e9f377628b873bad1cbaf3a05ddd7c3004924893aa8ca838e0b8301c28b0ac", - "4dc66a5e82ad887b1d1fb5a578d463ce8c4b30951e4396b0d638213951650b0a", - "c45faefa0eba8233c86c58656b96e20193f98b81946bbf82a99c9a211e03097c", - "6f52362c9aaebdd0c3d0f2b754992be4dc3be9f027650a5b2223d1f3d8bc4449", - "b612a5782ce29f63b6cd7be4d476b7b0c01cc2c84b934e6e95f0701e62b6c232", - "fa879e21d768e9d3387eeae237a9bd0a726cf9f1b1fa6b1c6779f7419eb1eee9", - "f837506ea8223ebd6b4fe7f2ba13b208aa5085df70505a703364d5e802f3d429", - "0d1f1cb899a97161f380c92a09ed7411d49d343d6b981d1a9453b4ce246e961a", - "01299642a9d43a1fe5aa3ec47c14b6c57c1533a2a819b96d0a28582bc9a55e20", - "700719deccff61359fb4fb95f0c43c1a61dd5e5398ff1080b4c538f80c43091e", - "e8ba5d888dd0f718af14833d5d7b43f594708ebc5308a2b8687aaf52b78880d4", - "e3f065db0987b0b6cb5e36ed6e44460151c4adde4838a45095ea8430b6e72dcf", - "8719bd47aa34b2622b104f764ecccbe457b938a68244b05e333ba5d42a8c985f", - "c35f4050010892bceb5a598ac21560a911f4227fb33d694b4cf1b78adf434fb1", - "d1a07e7e44e9f111240b8f709924a498b8f7cbacb2c6a56d7b2698484458e7fd", - "2d13e1be3e1f379b7d839d74266cd8728a26d1cf8c400ce776b97cfa68386dba", - "79ac068ef51c4f263f2883d21c6eb4ec55a99827ee619c198e9effb15e8903cf", - "49e39906a42eedf84437ae61ee37093a121e1defd07de613f8ecc91660bac97f", - "fcd053e9b53d543fff4e7959b253ac37ab837538683946166e79f2eb8e42b8b5", - "e8e3f2d7ac2f28e63731948e3fc7ceef905faaa0f300b27fa47a15f2aebae65e", - "19ff8488047015ba57e78b4cfff16e57fb39a580f0e75963836dd236348aee7f", - "a9068ddcbe43a800a74434831b3a7dde6a29f638cf68fb9770580b61b765da84", - "5ce1507008041ceafde414d95ad1a8eb7022b0cc36641a924b712018d66384f9", - "fb91d24ee6c1d128cb81adfdafd798da197c395c3082ba99db657901e457408e", - "f52c1defda8f64362b0248460954ffc9d64f22a8a3973eab85c67d491b8669f5", - "c5b99772df916c0119583c651804f906a0190df422b8cd0d4cb5674c87e4e0d9", - "0f47427326b5f2b777dede7458083c4fdbd7cad5199c434dd8571cffb40dfbcf", - "7c6c805e64c3b16b4f07c96c53d0b4cae7f20b87401f3f6013e8522483785e8a", - "10eceb84fe0a77ef01d21dca531a6c6d9c0f2ed701091399b170fc879fdb531a", - "56c8965f90ef66601fb82015b4bb97418b46ac9c69f2c281f2c5f3a3ecb0296f", - "c310b69cfa6e41ae51fe0d34fb14da35e10adb1d2d66c5597a08e7ff8d454174", - "148d5aecfd31c7323fc0352c7a93fafb207650bccc747fd968c0c5ea29d467d9", - "76d63c3a01bba60674a6470f4173795af85b148f076bb99563dad039682bb60f", - "b4b78a1be3fdc954d550896847673e2e061c65aec44f9f03c432cb443f530732", - "d444adb7d67b14e89c43265573d116bdbea668cec84bb170d05f353e76a5349c", - "64fb5cad0fc9cef50b5d4b392cb8e47b605f7714e951e2a872d00c6cea3651c5", - "f3f6c477ceda50b04fd2098ec4885ff859a82f11ba630cbfa7c9b8cbebcef907", - "4ea32b1ad149aa28a54689111e630bc1a599dda2674bd49ac9a455de71afd5ff", - "4f8256dc217c2293780acae275fbb191806582a993424c7523f1a82aa2bf04fe", - "a7af5fbaf59c1ae74b4565ab55b7543ed0f939165887d0912a4b7a0a998b734c", - "5d17a61cb0dfa8eda669486fca6531bdf422fa4a56f26204f550426247c63b98", - "b5832095d8765079ab3a124f85c83117a4b397dd8d543a07df813912d0acab01", - "1078a702e93a4679bdc3c186da7b769384ab651f12bba11e074cdb777be4350c", - "0634c8a05d44d98167792ac68074dccedfd1479295509e05ef043e65d71ac269", - "dfff5543a0b6b6d1855038719ed826ed634a7aa58c4d17e18f02c1840460b709", - "d9e16f932dda53a08854e8be3df3c5b5aba1cbb92c7739bd326338d945bb0f70", - "e256333e6e58ba6797a6c3665647a20b3e99305a3cfdbab043eb30907bf2ce75", - "b753009b4ae3b34e07bb2a5561f8079963243cb6ae92e0af3014bf53230e461d", - "d2f8510b03533d4bc18b666ba9764110018b8cad5d2f8ae153851aaf4147c89d", - "610e9cdb591ca75481bed70cf5649ec71c888f0f6f1cf5dc90eb07f13eb3a3a5", - "ca004bd190d6668884e6fdf72a3483e422702069b9419a9a80a7945d254477ba", - "501bc5fade678ed01699eebb008a1b6d41c3470aff6b29469d1f372bd43dcee9", - "437b0af54772aaa1901d7f0cf001a83002ce880578f584ab2d2bc059c03070fe", - "eb0df79b0cbb33ab624cc813aef4f65871722a720ec379eb7c231637bf416cf9", - "bb7859b0d4927b4e32d37fdc3af184bc2b7a121ae580fec72d66d1fbb2cdae1e", - "2b4382e999a845ea609c595a81e17abcd500393e4e64a379097ac2f0ee1c4846", - "754199fc2af80e726155c75857f3c1308f8c4b34c560c3d7f7d5f637f6e7ed3d", - "ae3b77d0d905a3296e28c34ff66408c61c0e66d8cf9d961824a0263ad23deb97", - "ab30830d16aca55acf805819689f1006697ea243c54af228010edaa04bb56f7e", - "20c93719d5f56505b3181ba3ece973d4d073d99fce08659e6e4bcb455942ae5f", - "33fabb8d8d4a2ae54887e8d3c2ab913a8b010b95d8de1e55beed17eeaf2087dc", - "5c49a34bf9701478a94896fdf0268e66d06eb66d2683047a86de9cf3433feddb", - "7ed4089cdfdcba96bcfecfcd38b6efd507f9f0a0c9febeffd38c58154eb2f9fb", - "620f688d65f6c64ad5a97489e01b7776df907b81c44caa87d3710acf5e047bc6", - "66110d19c0c937d83250c7ff80c51445ae6ce4783d83f63e77ad49a98248ce8e", - "ee676e29b187b7a805b43a6b98d0c77c08b165e029421c6367b4c145c4806a65", - "e900fa55547ba8f7757067ba2ff43d58128b7c75159e0d6cad960069bd0d8a2e", - "1e7965c08309d22f46f619a8bb9879d5967d4884c81f153b2b129af0b3c2a5b2", - "3b835f1c136e0a99bd00f902a6bdb394c8182fddd2dedd6df934e04e86febd6e", - "d95641b7ad6c4963c8803fc15164fe547b89a6e749ba721ebbf82ea644f261d5", - "a7bd727c21528b5d5f322ac8cf628644b0a751ded079690ba75ba1354c89bba0", - "15c383edda16afc8f905700bf1b96aee25647851aa7acc99b341893d1efc4b95", - "4f697bead9389109f70983449c2f8c1fd98883ab633e12b4d124989ee3e96a67", - "26951aaf96bdc22febea0161ce5389e0a90ad234df429c297ee9525015092911", - "67a18687fcb92ddbee9a575f3f24658748cd2e713bfa4f6c39c91499d0562e89", - "7302a29a49c67a26467e199fa56680e6036dd3010d7be80640f070c64361c985", - "0a1ada87288ec35c2fa111338ae8be3ea21e9325e0b802c163d792d393813076", - "cc6f82c00f7acf2d047614ddae061b1ac8da036d013c3df41ddf26557bf67c49", - "442cec41225aeebf321c16f94024af51f5f395a2738da9a4a189e938c4b4ece0", - "1debd1f9f81dd66684c6d7082c228426c8109449d52226b1eadc2fa213becd09", - "3315a12e5779ccd186824228dec4e2aac1dfa780eab499df88c5db1767748b3e", - "234f36acc850c2188b3cac2ced4b6ce50678846061121015f30f579028b0504e", - "d561babf95bd8c46da11145c3d50edd746c9fcf714b1cc6cd6f549edfbed88e4", - "0c4dadf208a0bdfea5be1e0dd6bf1634e087b1d1a0401bd35974979a4d187649", - "b63633664fca880689105ad52b50c58c76708b60bd92e36fc9608b32ad14b00f", - "b7fc65bc6ac99212ab5d9f3844374ffd23890aca9a439842218e9bf8e243bdc3", - "e9de93e6b82caa17e2c0ea697178218f8c08b2feb818cdd39095ed6df87140ef", - "cc2f7d720b59a5fa57074040f6153acebed7a0013312c0a67a8ae00394fef470", - "e4ada5a20673270f72cdf98ac5e704af4bcc6396a71614c44535becb275a90d1", - "bbf0956211931b524417e3983bea609e14e45c6f064a03b0259a8f27c5a928b4", - "0ee9cc138a864fd00b7bd750d7a7ce6a9c50d376d5c147680cdc2b4d47f4487d", - "cdd0ceeabffbab145f633726b4919cd526958d0df587414b6a1b5dbd62a30016", - "a309d75eb11b6ab67a617c066246dab1e6814cf63d3773ee35b03f57f3d83153", - "d4e9ea8b73379aea625e9496f0d3765fc82d7f8e72485e3bbf259ff703155e96", - "c3296cdd1997a82a3cbd84617b80f223f724dee7726081c475ed0609cd2a3b00", - "419149e9f7d29a7fb55d639076f1122463dcd3da09cef424a5ab1ee582d8cda4", - "df93011a6c2e2883d1d8f9a4500fe0f746bca0be5abbd702d5da4628161e12ed", - "892f929d766b36c83cbe51acf76f200e31fdf1d03304e7455e632133af5d0eb7", - "f193c35baf25cf961e20c8411085da2008ac4238a558fe4bf6716c234afb90e3", - "37bfac585b43d47461a5ce70fca39bf281c6498a71e4cc5025d2e5bbd4057aeb", - "3d7bc9feb9fae93b892627404a1b447db4534b8ed2d2b62a1c71f717c0614eae", - "4d535fc7f874defd870324257d48215d56483764064fb9ec2b14cf6839343cd9", - "ba0be64149b4c123af298802a82654a6b9c322a8c0caa21433609ceeaf5ccfef", - "0dce23c3f42e9317cc80d19f0f238487ce2a9fa1b33e603cd0914f942a634c39", - "620200fb5289500c188a477c781bd2d4aacada816462edec7589f95c1e853c0b", - "8903b736d78c8c3da5f0565710a9df589ece833ac2cc03411c53ab97d9db2bc7", - "271c35654ac0d5d691a67d52e312b5a96600f792a77815f57a6ff181d4ba34cd", - "732f626ec9d10b1bdedef3ae61a845129d39f3f4e730d0a3b78b4259a9867ae5", - "ff8106a8408d701cd6460718bbc5c3a203376d1adf3d362f9ebb810a679b6794", - "1e73c4d74b5bdbf956db935dddc8ca8c9d98b9d6a2fea5cd9e890b81a040347f", - "1fc9a56a55b73d0e216d5080769332d02acc9c4adc7b183aedd86564414792ad", - "7c6c185eebc216d87aa60abc311015c3a946c44ab4c29ba6d00cae39f930b6df", - "11427222aafdc1f6df2d50240db0a6002120c09db5942ceb39d874637629cfcb", - "fa3d74b2c3d5042265f5a006e3275995ebfc74fb6cce1d4ea0aa77d28dee3017", - "504ea9af28f8e3840f4897e2639afb001b377307d2ff287caf0e4b2e584e1da1", - "e9e5983fb52ca504b9b198803e079e61f2f69d87c7047de14cc2745248dacff7", - "9120cead5e05ab31494cd3e21ee21d30038f07423fd5945bdddb0a1efbc1cd08", - "c1ba595c73c342d1a89bbb0f43e9a4fa2377ff13fc104ba169e4f08a0171a4d7", - "31a07af13837bd9ec8bb83f9cc9cf25ff092136b4bcb4584966f47ed77e81d6f", - "ca112ee1dab319c66bfb3a3bfecc4110d44641fdceb1bf10f596055062160b1b", - "3822898da142a2219cfb0a9a643be2e1d44b4041a849d3b2ac8d13219874f3e5", - "2e9ce8f56153ef86a67146516603de874b968ccfc9cf6b81699055c2fa1f7db7", - "b38bdb7e8074155fcf3161ff2a48369f55382ba9acf3c429a32e45c722d5926a", - "771546d7292636c58182358d35a53010a6acaec6525754cf8335e3287c5f7e2b", - "2419865215f8aaddd7581e01b763f0f3ad2133b77715652a61df8f8bd4c26c7f", - "5e7fc25484415f1321c650d15e369cc7214dd387c82902362934b2ddd8bce7c4", - "8af3c93b1462bfd2b9531a49da779897d67fd68fe6ed2f8053ff92880b11a1c2", - "25a26677f2e5eaea6f5d6ccbd6b9f3882ea345816fa343d890becda8e6e715a8", - "22f239f9d959a0547553c7d0e2bbe8ba6eb03a1930f46a825fdc1a9e2d309ef4", - "2b3d9245070a2a273602c06a98a4e080d3e89ed688ee3fae86d5179ed47aaa70", - "3168c2e45ecbcb479b5fb63a2cb5eefa37be1865310a3e75389660d3e619f036", - "7784ecdbae1b974ada9fd6bc552be04b6e7c851d33bb89db1eae60bde8e24951", - "c50fcbda236f7c92b14987b8c58679d90306427d98aebf6a850bcac3a9a3b4db", - "651e4f9f098e59ad181da21c3c5380306fcb777ce1c8c4d2fa8d801f333e1d9d", - "cb1310da09b678e61617efbda565c35297771911bfe1b7832d4086c757235983", - "7200794b44dc54f9a26fd037ec535f2d160c61538819d92bbaafc0562c327d82", - "df60e47e0a6af5fe3c64175233001d2c56a6ae23010c9325add346005c097087", - "8813189ca5ddc9167ff9303f0b5f8f477161bb25148026a9d1bb7d621c85265a", - "b5e30bdf52c4de8f8cbf4f1b1b42543418407bddaedee9bac1a0a1cf10d2b3d3", - "700c9f4132ea8dba5b17a4ec62838926df396797aaf9c5e145fc2d445ade8681", - "a7c6c25d39e27a2ca243985baae30ae608bf267660cff3da7b0aebc01c96b01b", - "14b4710d2f046bc43b22c4f84833411d4bb02323c1827a4aca497a6bdeb9748c", - "9bdc4e6ef0916292848744ad13e10eb56bc3d2b6a2e1de7f49ac6e764e31f6a4", - "a7331e62c6e4d8d84532c8c628d937aca2e3a91a87615890481d3685a9d05906", - "6e057a7e3fa12d7ccea7ec4296c3670e01bdf0ba311d78045c772227e5d06898", - "4cb1f365f15715fcbdb4090c3e6d1495ea0972f022ada7de4f6fe12933aaa8e5", - "0b9e8d6be103f5675eaac1b1e58c7e1bc036f3c3abd3c1091163dfd988efe43f", - "17eb69574308813a8bdde4e6b55f99726de34f4580d197c25632c97b566ba30a", - "0119d7cc2318c3149cbda7a0f73a1dc5fb9287321806744d7b48d3a1e38b26cf", - "6e3e5698348e87189363c241f16a70dc7f411746c5b77c7410f3577ef1fb0cc1", - "569750ea7f3c7f8d46749586609826d660710799b53af1e84b4bf541dd1e54e1", - "b72ef3ea5ea0d19ca0752073650e1e8fd01fda0df5853fc9f47e120d7437b8e2", - "12f6e66ef1c84d72ba46da5dae4600ccc7ae3c9ea76e4cd9b9aa235f435c7940", - "20d0b785d66471487d41a1b2650466410cbaf34afa24ad785c43156b5a7729b0", - "e965d0ebaa8debc79fcfa00b9cc8439b9198a5403ffd7e36e387ecc708514211", - "705d295881c50bd6668a1b162eac816ce7dc9d9b9710e8784d29c47d3e307d46", - "b87b240fc6f75f3ecffa14a72a3eff3e7db6d80f19b6d2a97ec07ffaea3b05b0", - "bd7ae10760be5276979315e628315893ad5dd37d8779b8749d85de3912b90d91", - "8fa333318295a22ac99658e1e7bbb3c456aa38d5ba2c3582ca8d4e066c618045", - "5676969228f2fba5c85957a85a5c57a2c5e2944643cb4ce99b00cc78c0dd0764", - "1be040f52d87323815354039c0b34d3511518e3dbd915e9b89a75e471320f94d", - "672e4650cd1387209fa1e298b9d2b14ba4f22f660cb82994b74be3ca48fd4f85", - "9a88989a9da863c58d811229f83f298bf24c865fe071e08b87a9d2ef12ebad5b", - "3cf0d2eeb229fd7dc98960a91c274c7f5564f5dbd269d3c7e6cf1219005ce75c", - "aa6292c4e7c2fe4ebe9661ac5afd6e4a5adccc8bf548fe95c3bc8cdeae173bcd", - "9ebc37f23bd62012b316d7cfa2c1e0e6e0dd33420b6d217d7f571fdab1bb8815", - "8da751295b3c449e5bbbeb5204520d6cde732582e468cfabab4fae6022b9aff7", - "4115192243998d25f1c8b09d7beeadbeb038b8829880c098f4835f00d48045ec", - "fefd5aecb181cd41f96f56d06693776033a0736d6b6df4fae99428f862000e8f", - "001951e5ec8fe1430e876784348ba9dba053f8a6a82bf259878ee529308a3c9d", - "3e9d0e3c9875de0bd7c96c25b7ba6c683bdad82fe0460e463bd566ee456426e5", - "0657f68d55fe24ec5471133f020b616e2c5195a988c1e2d1b5392cfacd114db5", - "3103030631f965f0b252b2f00fdb2c36a1097e4595eed273edf79bce30ccc29a", - "d8eea73b7a268a4ed34d2404c0306b74c3b3d0c70d046308e34549684ad19a6b", - "016128acc46013a0dbd934a2ececab82c26f60e58bb1185dbc897c24b74d8e97", - "763f31b272afc0541c45d6644a1b8efa65af170d811ab26444abc77950ed75c3", - "e6f68f0ea083ece2f3ba743063b089e75157cc1ce3a30b5a5ee7b83f6f8c1e34", - "233db7eb8aee17f10480516ba5c8e391c27254cc31ea3515fedf4916e87e0978", - "e0c73717cacf65180fde0cc0762baf30e3fc05602c5aa676df6e6a19ff3dd06f", - "0f03d7cb02f8bd7843f7f0c84ea24a8c7fbec18ed9dc65f8c19c347511034bfc", - "8e5f3aa5ca6fe7c77c392f8a9956adcbc09a25f014295f2fd5146b96acfcf43e", - "453e878cc91e3c7eaa86411a7e5bd6cdf466a91711a2a15798ea0e555b6e3bea", - "d7265f308166017f9f2c67c46ef94cecbde86a43e3994ab0799025c188d4403e", - "47afa7bf5c736635ad901f6fbc7e89e8feef17260da62bfc26e67c227ee0571b", - "87f130f1230b657ee0d19d3cda28afcc100187b02b33f5c71f63b6a595673f77", - "1a49f44df524a17852f55dd2f86b4bb3efbc4d318e21d44619645e9a2a7f79a1", - "a63c2348b76ea5fe2609ac7ec4a8d50c77ca14f3270ede9f80fba6b92ff75d27", - "3210ac5e06301f9459cdf21b497756c3e847ba296f028c3136851fb7c3e5e872", - "8ee828ada67cc3b9a53e2ba9621e9614affcbf6f2d9fa2442b2a7543c215a80f", - "4300cab3d271ef0aa87aef555d546a92f09dab7fe58f0f1ef610dfd3bdc922e2", - "0fd5806fcfca65e48ac95bf6ca4340733e2c2a09ffa602d6c6116b7a6c9006c5", - "dd378f4e864f05b7114aff836c13811359c3766e707a3f9ac3ef51fca839140a", - "733c2210da8aab4c7fc2027559a7773e639a9acf774ee6782ce4d93dfaced79c", - "9f15ace5b8e3d5ef056f52469b414e2f390d9e7e99943fc7a94f21e22cefbd59", - "489b727a5f581f20f365ce02be41ffa5b64d467849784dbce1930895de451cea", - "e3cfd53bb86fc843b7e94ca41ed6f15f67c6a0480dbe4ed68e961d51d4a2218d", - "0f19e4d3780ba7b631cdc3af649eb3838f019fdf5f9d171c4d8eb1d5a0f69a0b", - "df0c50cf6c4130d2b478f0c13e4d9b73bea6ff449fdb7c1b77cc1c82d545ee66", - "78c77b352ca7ad8b1fb32a7a8ba75188df64dde5c48a79c750bde8c77c93c4ab", - "c0114cd054c01caba00ee8a4809195e5a0e3157455f0a9620f3bc481d2c5c25c", - "675b78397c0cf03b998b910035584ad252f3c377b99b99bc02cc2056599b56ce", - "c8877c60fac2fe1ebb736bc66734e5be9b0a1fa03c0ff7f9ab5015b0e68eecee", - "3d563047a51a2f7100cfcf311c85094f9ce32dc7f068e7f825c084e61dfd0ea8", - "c630169f9298af3b16ef0290284504eb1104760b1b92ce009f0fc32924ca6827", - "d8957fb93cd9613f136c2ff1395887a123bcbaacbde65c62c2ef81a061c33ead", - "d670d4abc6089cc7ceb4c4ba9fd2cefef18ef7f54774044686d570e2785df02a", - "bc17711ab8ca2b1c232c88709eb1d3f0e34296e8aee9f7dcc12a5b70d1cfe67a", - "ff9dcaa08a20272d7b954a01ad7318659f76261b846a72287dcd2a49b21683c0", - "c44ad1102439f4151b68ce964e2773f41e6be42524f757fa21052f223af88371", - "e7b3e0f5e6fbd8e72aa583ab0c4e2ee45ad0aef2e27d6c345e77f07e2c0d4814", - "cc7b4364915ac0101dd6a9466fff060941cf3a67ba19c62ed11e3d4aa519f1d0", - "245ae5486840ac258754dd7fb0106d30bd5165249b017051e3a6921f44c7a614", - "de53f2a34035a3d76668c570b619ae053426762d17a160fcb3cf64d3b5137445", - "2a686126ce622faf1ab8a121efdd80c16f321874e86d680d052e40da7a2a2c8d", - "e3420dda3958d6eef551f7665659e4a5377ea08c9479bdb0ac5aa9edcb97757b", - "036aa6403f2a1a8a2d1c81636273771749ad43b816b52f61af871fe86911b037", - "170ed5a500cf4332701dc8b882cef32285dbba65772f2b91038351d9d8bfc788", - "b92f2e30b76eed9615c124ceddf517e0e47744acaa5b39f0d247fdd2c71a4d75", - "555806a0f0d49b2101ae6eac58f72970410cf3bd1e8e3d3619d9309b2e5c4c21", - "463a1eed0687a47fb809298861b1d33ae50b6edb147df79f320aca86dc1c1b8a", - "c199dc51ef3cc89d847f758175f12704f2709178dbfe7ea97bf6e29a82abf0e9", - "0fb3f56f6aff49f9ac12256c50ac994d5a4d58f019658f1ab430bfc8ee165cb5", - "9dfcd962825d56180173fb5be9ea7749e5ba6630054141beb01aaec46cc46f9c", - "9a1d2ab8dca1d6adc6450270aaa8f1c5ef75ace57b2a330622c18363f8db0c85", - "f14237a8549584aa44a9be34f7df4bae5308e455ea75459f2ccb7f81197dcf26", - "24c636dbd398b27853a6ba7bd840c25d807329c8dba32d4515643cac7eb15c0a", - "65811f65bd16480b08d17e7973a2ed186efdef0640ccc64ee460cb2e13c62841", - "417165c6c9848fcfd8dd9829b7f515660e564a26e49f9b79d64caeca8771346c", - "a2d9d3add8938102f3db99f114206bd8c9234560578851a52398b620f8bf95c3", - "6eafc960f4060ca408da9079adbf4def8980369495820a31ee23ef2796dca26a", - "03e9ea6147af42081e42713b110910c693fe58f8e9f5cbfba5a7e5fe712576da", - "ec4d7830f8db8f30e0b2bf3c7538b5be0731786153a3264df998e7933b55f236", - "11a6c653a8088262ba60922bde6f4156656e2d00dcf22b871f4c818db7ba7893", - "8c3f39cbfcb0906c5fc03b4ad4757ab351ebe37dcca13aaf32dbc47a5ff6d7e6", - "08474c8bdd5872253d01a8fd103c15ff668ba78e7b44268de6666547d0d6b789", - "ae7f2ca311fc980f29f80cba3a702633087bf102d2f658c9516a22aa57a0451e", - "9a0d23b2c3c990946f6fd2fc019a5314185f9a9c5c7480fbd54cef9e9ae7f94e", - "17b360c099355eb7216b1583f52e31d6330997fec0c4ee37cb118802e688d3cb", - "37e1a7d3d0fe4c54f8e84f1a3c202fb00793825ccd855e7a4dbde606ab6bf15c", - "e3f6229621b212d5afe058fb58eba712d91e844ff8d5dc4b29d0919198d98db4", - "6c77bce562c80611e41c813639b316848ead54fe1771d5279c633c27ff91cd17", - "8735dff9d2dead5eacdcc057853ed61955c34eb4128557472d20b88796b841fe", - "1354ba41273ab3a1569428a849efec8fb454cc9028abe9a847ce88e62d168ec0", - "018b41a65cb9aa133dd4d4b6585d3c06b9ac73817cbcf9edd3963a6b9539d555", - "69068d65a54f0736151a3e417c8a4b94a8f89e6baf1e49a6dde410b844edc0d8", - "a76d745786676e09effd1d6327d92fbb28d574bb79985dc08ab07f93218fd804", - "1aa85a2dc9db823f5ef1cf83a35867d46580d7cbfdb946162ceccc4fa180f06d", - "74ac26ae064e039415dde44feab2ab8a8440c5e42300cea9cc31e4632771d5b9", - "46b980a4fc85a7b4927ede2a4d714890c7e68142701fa304e4fbf78b053fb557", - "494d577650dc6f1d7085ed9d5860ca6b9243693275d48a5507c739cb36023e0a", - "f2c3f37c9e47db68a182156ecf0a3b32e3d06ec676be2d92d4501ff4f4568207", - "704791ffe60dd215c188e04dee839b9353b9228bd2d1c54556bc384794baeaf1", - "77ea8f8d48cf6dde6fb2b4516355136c2331bc63e363617ff959c9e6fece9d20", - "437dda697002adae9f455bd1780dd95a6d1c25ac7a61b988e79b395441f600cb", - "7ba266464caca5c9959dbcfcdbb3804ae8df8168be5e69a30c68840735654c8f", - "56d9e031daa291b2d6e2cc4286e444b438d383fbb6dfa9b64b97c02ac10c353e", - "4f053be4dbd03039de007cec5d67d5adaecbf349b225f741e47b607acbbc24ba", - "cffc1ff4f40cc2989e2fd659655bb80064b1aee16ed13011f98e1f980b6d3d8b", - "837e660adda4dac4824621f34e4d263bb579b28440247cd0169f95ff8baf6247", - "6070e2a98d72726e67a7daa3ae6a9231fa80bf0314f7c3d22c0d7e7758f3f980", - "0618683bf8c7e6bdb833c8b18179b70c9d2c35ff24c8aea5719725e8e1dbbebe", - "8a5186712b191d46dafd3b4a7ef25c85b1e7ca19a0d4766fe48ec32df669dbf8", - "290233bdd0a7ae7d395032fd7af581f7c5056b584988b851279b4f8589e2a98a", - "8220cc7834e1839257d882a26b6a7e2fb7cade1c0bffd347136d7dc34fe666bb", - "f017befd79af52b3bbb10fad1ce0ec07ba28662e381d4c36fcd27c459e59206e", - "19f78ad809fe0446f2d73c30287b63714d386dfcfdc12f73ed4dc816414e2664", - "75b63c5f48cf2dc94fd70aba291473f588c728fc69047d2e78f5d8d015c063da", - "6fb6e49c6b0166011d31f7407ebf2f200d4e443891f914519cca86c2bb3dd18e", - "1e3a0aa400d11e7d8945381ce38cfeb5a81561fe98fa812e7f7fa2e1b09a0c3c", - "a245436f0b7a6c82cf28198ba668a1c5582fffb3068ae5781cbb6de34f74ee53", - "a3f1983c28fa98b7c9566fab78ecb94bf82e94c610cac132ce1ad373a8b339e9", - "49ec8d80adc42661a13cbd0c28657ee94f5ca47ed3ac2306aa7fdbac81c09e48", - "a75c83bc9e5ab954beb6f51c0d92f846cff244155cc8080df64ed9e3be55aea1", - "8e27c2607cd6ee1b82c0f14b432af9a263b3358459cb7621f0e02f18ef2ee8f5", - "2e9ac02603cb181a06d46ee4f79f42c0cf89616b9c2503fcba6696901f1e3040", - "063c399a98d09000fe1e05b7e7b764d7e3f05645e79a2b8447ac0c70d0b9d34a", - "8f79dc637453e0f94378a73c5b71bcb308aab6c221dd87e49572c202b4212af7", - "71f04977d7e11738708620490b649734923b872d6c5d3576d02e0155047ab658", - "d850175c651d589944c0618aadc8bafcc24a75f976f7e0c431d948f0210bf76d", - "fc61b86b0b3c0834ace37844aaa8eb36b3aa347403323db6a07ccd8bacb8b1cc", - "72538dca438367e40c0a316611d59d622412b8c2bfbd95107b2690dc05fce709", - "b9ffba734098f644b96d00a205d776c28c5dc5998687621227cc5c262d2d2457", - "eac4a261979d798ff44ef745724286736942003ced0f59a6efed4745a8da5447", - "f3d115e8d29b1a51a92fc2658a9aae207f4034a84b0f4bff31e41dfee80a4bae", - "f424e781534459a20a71a84ff270b1e28b357d12cd020d0199b4c6715cf80a26", - "8ede8b69479d9533c18a292f8565f11b0f5244c17952e6f1f1176a8d809ca49f", - "b6740404647127897158f4abd051ad3e2b6e27926a5e89cab021c1c6376fcdd8", - "66d63413b3eb75dc0131cd78198e166bf181bec391eea3acefdea0621955301e", - "0b17104dc16147b7b4167a3bed63cc0233196c546c1cc864e2c056ad282dc7aa", - "37689815c161221821b66fac562ec3c84b376b68925d857082861ec1d5a320d7", - "e2f6a399c5773a9b8fb2742ede433183256719caa01a55fa5a5d0e2c4fc2dfe0", - "72239ebe096cb35c59be59c128e1ed635016d2b96c1d7a89db92e4a6591719f7", - "bb46eeebf7327c61010286cfad04016acfed548e9789bb8d686fb48101e17f63", - "0471b4190a975a3d404fcd5336c6d598b9df6951ec349ce5a1ac565815f4e546", - "acee7454455b6c1b22cfade8bfad1c471d2aeff511767ebe4cea2f25afdef279", - "189c6929bd7cdf1c2fc4a51f4bae187315db790e3bd0a065711ac57b738055b9", - "34e1c4df66c6d32829b4859f9235294caa00966fcee771e9e1afbbefd69f3d67", - "5ac4d58e69459eebaacb3c71d8afe15250a4f826a27fb09bd5b4424b6c197baa", - "ba8486fc78e760e1a0e5a68065d4ffbe44ef45a754e4c99afc59080b869a939b", - "a5437a5b4d3fe6ab1812a8e714f1ad6baae390f14967bffb678a07a86458a4da", - "6b3909ce66d11c7713af62111cfcb92b3f7981f1cfacb9b8ac658fef1f77ffcf", - "7d09466f77b66a600d7d8d9f64eeaacf8b043fd67e3991bafc86263a087c8550", - "874a0ed2ac947336c577241b31e7c71fec00bd296c10bfc621793a9748f752e2", - "2f9437ebfd7328dee5f2604df84a90eea1354215ae8a08a663a535336146a825", - "e41830b04ab7006ac0ac04fab245623fd34c8d99b7da9a517a866f77740828a9", - "c4e3dba435527e260b37fa20ff0c007b9616f562c6b5b39e626296d5a6b720a6", - "309aafcf052249534b459f36b57cdfc22e45f442a522cf3f55ccd1379085e7a7", - "b84dbe25e0bf0abb5396ec399cf5db2150b4f05c3893a54502c71038ab4ff113", - "f943fa26d03ed3aff86fe71d6291f448d0b7ffea36d024cdbac5286c15b34656", - "4ee624933c090ae105dd40de96e31e8e60ff39b55669acf440eb5cfcf2d858b2", - "53beda29f862d908b71a24c584ffce6632c067e7cadd3038f6ad4c978c36801d", - "a0796437c3258723b06985b2cfce29cca19156a2098a59594ae498b5e44710e8", - "b9a7b502acae8b64dee3c566cf4877d3892e6e8bb3ce42111385d5b44aab5731", - "ed2209ff7830d21291737c8b25e211294da90a20f1b2922f275bbc8ff3559a78", - "9bf7b4a96475ee424e1a3b7ee89d4878eba2e52dc173385bb86f06a21e299207", - "3aa225f92a7d3fc152b01ab7043a52bc780033981946c0f5adc24d594b1a19d4", - "db38074b0f6e26da879a5cd541095b7e9cfdeaade247cdb80ab7e6f94a5e36bb", - "b3cb8a5d0736425aa47808c00f390423264aa9284b5bfc27bb7436b674a12cc3", - "158ba1ca16fdc93ccb1c7c448b13b241adb4f031eea3fd9baf332758370957b6", - "ce4063123855038f5c16bf156ca1670cbd61914bde7aa36ad1ca596d0aaacb8d", - "86904d46215c4eb4d92e0c12250501188e4eb806347a57b9659e1217eb28b842", - "73b4ae85ec8513417fcced3e88dbbfb4a129be5320b0358293623473ba2e4a38", - "e15af28ba879ab4502a6c3e74175cf4d8831a6ca1f29d2a672c432538e2ff564", - "260f1ef78eba3e868a75fc3d221b2abeba2c117e255710d510404ed219e97230", - "6c7a7283d9584e1fc01ed4c307b510d400791788c2f815767ca3a03b396b85fa", - "7862225a3e474d7a86abe46d49c91dac95117f97940c735ace53ab85be2b8cdb", - "8203766cb147400c2e355a199455b38e994cdbef36f28bbda92d533ea86f3fd0", - "1d23f44814be1531059e63902289d0cbcaff81c763520b2d4257a2ed6c0a3135", - "5bd14d809424c07ccc63dedb3e23723df4f0a0927dce529bff272eacd33beeb2", - "85c248aeda6dd9bf1b25b252240e3ad2034588f5707b58e4bca1cffb557f5fd5", - "34e0e103535e93421966044d611610f5ca4c3f72faeda21ed5a839fd00a7e40f", - "796eddfa3d95816903182f7eda62c2bb2a8a26d2b0f74ade25946256c776859e", - "9f71530a89bd86180f5c5de6a3137efcc3fedc162f6e74c4209e7b2b7600cb4e", - "57a6ff118121fa699ff2f09ae3dcb3252fb82975ee2e8fe81728f1c27f774e66", - "1bbc79bf5fb0bc7bf5eb5d41b0c1e031b7069bfa34af1685dff979308f8d3780", - "273ea56c4d5558187bf00e746a9c158a5ba54a5bfd3f8f205c18c044f4dae65b", - "f3447d88dad5b2cf96623fd307e324720c9da9fb30b3bc041e4a63e6e21b9c44", - "ea3b92e684faec372106ef7a839c63180c48675b701cf6bc10974efffb259505", - "3abdb57ce8c42cc1878ef92d0e400540f3c316be933ec77664e0ae603ffa7a10", - "2dd43772a26fa5649f6b69f7914cc8880de348e5b39a94423a33f3beb4b51a74", - "a5227a08abf1ca4c0c3a125d99e477a6daf4d62e21ccda84d8f937c3a672aaca", - "3f094aca1b7981aac900adf8fcd57b319f364fb37e2d1b985c91ebe0d0892288", - "d914f3c9fae3065a1654186f94f3ddfcb4704ce01a2a11aa4764a858e927f9a4", - "827502c24f885f24caabb485e8900a1367c26b7023f2ba367845eff3be33c48f", - "4a5148ef1675160e4baae968e5b12b03a28e8888cb17115c5ce51b54f8351786", - "7c78377d9901ef5bda160a7dcdecd24de23731132f9553d8a8f0bf486bf949bc", - "9e18ce0213750e775086bb3116bba596ae9dbc5ea5c0989628e9e30f170b1f87", - "ed71fb0959297156fa4af26eb3d0220b6a5d2e206fa5beaf6dd8dcf3d2481c6d", - "37272edb25caff9648a6a7bc219fa85899b81065282af0d5a12d6c417613ff3e", - "8737505a43f5ee67d3ee1ca830b6542755fd3a23e1039234be1fd22b1cfa13c8", - "17952f136d96eef01c11d67bb1e58708619c5efd3caf45f64594954747fde2c0", - "48b0b0f1288c80149342745968e5044fa3a978a00982046cd4ab4cd3fa16ca0d", - "e47b7cbeca82fefaa5761553f43e0b61a203de1c7a8406e10dbb54151a65436b", - "953860d549db85f5a8f606112b545ac25890db7cfcd56b8ce859ef4622b66723", - "01bebfa106116962eee71adf586f813fb5bc3648559494e1fc3f5064607f49e1", - "432bb3242740320a38c890986aeaacbc20c593c0a384b9db9ace9fcccd914d56", - "8216d3818d49326ef217eeaf68c7f273b2894c70fec1bb412d6ca668b79c2b57", - "3a4796b33b9335f6aff4e7f7210c7c683037128b0c49c8da07db2dc77a5feb3c", - "f4d136ac01dca3321678b4e473ac13938a34a55161d43e591e0e4dd6ffdb4377", - "39193ec33e502d8f57295d1998cc7adfb7b99e173e4c253f63e3e0d53357a27a", - "b162dc120ea0d62925049099f54d12254be00df1a4f904d1b88cd4c23d49d4b4", - "709021a91da08019932733446cc47de9d0d1213c685a2f6cb18bb1a93ad6ace0", - "b8541e471cc62677e42d15708a79c0561a0ef9bd8424515448cb37807c609b20", - "89f9796bf31661c42c5d79a82fe62b42edc9b0490808e6a7f78eec3e973e573b", - "b00f596f8801ca699fce6edcade4f9056b5b36602c7cff3e6a3ce949348c1c0b", - "c4089839d17ed208e586b59d9ab0e18074472b11042c014d954787517d2cd424", - "c8266803e01d954ee725a6a5351693805de7c2cb23126bec4b711a38cabc7a3c", - "3a1a52209cdd21dfc7fb90bf28f2c4e0e4f227356d637c8af41f0df9d28e1146", - "28c770f9a55f7874c85ce31af007c2baba297e595d1b846b84242fd785b95232", - "65c602a1654cdf523aafbf90842e601182cb4e443a31a7c20f9d90380fb22489", - "8787d565d7b74034899a65c7b2ac41b0ab64ae48edf5e889c9ce0d9cd114bac1", - "0fa9cb98618229501c28d91fb92921c00e36dbcceb074140eb463324c2c34012", - "10ef70412b19d90bae06952dfd40a105712e2695c1308daa931477a51604da89", - "773b184e1352a44f77df96857055304a63461c0a1b13c41f76465fa4a945537e", - "d4840143f17976ab3e6a8650087293566071744093e2bc79c594b20695ea3e02", - "eb9146fdbe6eab0bea532e69398527768edbc4e4822fb5c9ab0e089292de064d", - "5822e528d94ee72c396a5833725fc70124d5ebdd76db09d55af0099e1922666b", - "b28a668a4269f3c8592ba2e5ce442507f334e1d08db7538bd67500f4407b5093", - "4b0b0a6b7626ef7c00fe758bed2ad9d583982194ab97a1c1f4ef98c01c99fa89", - "b591da8b1895f513f19558a5597815db7bda88954896534ba794011b9aadd7b3", - "6c0052674cfd053fc0c8cae37db23662f9259a1cafb9322cf2378dabfb5cd7d1", - "513e3ca6bce1861490d3b4ed2e06c765a9bda21865f0fa937bfdab633d83c53a", - "1b690ea9da3ac9ae4bdfbb9314bb087fb2aec8b0fe2bfba40584d4cf7be3cac8", - "856a9af60b540994edd8e938109b45a7410cb845fdbec2fbc74ebde6eaea6f76", - "85bc616893ff41f7cb209d40f0f68f69cebd86b9cfa1ea5a88f5529747d723d1", - "e035d518a68db74af63e4347effe25b3a7eb19a33a43d04274fcb15ae1f0445c", - "96459989e6d5e3d434012e11bfc48e00458f9f3e09bcaa811852729cd53af465", - "1bb4656e227a23fb304158362f36fc0ac8d6a6e2d08e1e0678e05b2a792aa840", - "7dea9ff8eec204b9578a032161b0c00b21c31b8a80f3dda462d872940715c728", - "704db691a80c08fd5ebdd021c73b6ec20a13461bcb79680a3d8ae6d80829a16f", - "bf149e8df2e5fe17b13b1a74ead3ecfd7add0714d42b24b5fb68da572d06465a", - "4e45f2e076b0ff5429ea0a93d2e53b0a7c8f6c0489e3a23f26e9ad1c23538463", - "32aafd9b484196d0f3fd5f80d535030e774a6146453c78ffe4114cdfb62281d2", - "2cb66ea3475697e41da0961acf789269182a06fa1c1eff54c6878d3ba3d8f12f", - "d67c53004b400982cd1f840d823f5ddcb5b3426d8cead0462b0ada221c6dd479", - "fa1906575c7c9849e755da7143487186c66eba517329a67173d8cac169fb5f3b", - "809508d5b3feb091315abae487c6da57f8fe87e7b4dfe88372db269823b549f6", - "3e25cdf18a8618fe928af77349e2485a52b51316223e57f5a846879da01cd58b", - "01312ac86680c5fd4c88248ae3f0a930b2c9b093653f5474d1c1ac177e4dd8f9", - "995ae98513f974c39d12e0d96c95884b8eeb99defcdaade75d10269fc30b90ed", - "dd18804b301b3cc6c2ab87f376d0e092bce93f00db80155653e2fd1ea5d5f5d9", - "2c12c417db5c3dd978c3ffe09f6f524b08b4f9a550e1de7ec0ee50e3476aeb7c", - "59617ea724321d76dd39e601d2dea9223b063c7acbf63ffa428d8a7113d76a32", - "1805d189e7db64d12a1b6e59265f469ed87400eb150b90e798c37a0a984a709a", - "61dc34f2189e389b9d4ae080abc30d0c40b0299c889b5a2da835948d2b09d2f7", - "484d3ea5c6ee57823cc6f467d8786921f2cc760cd2045a7eaae399671abb0e89", - "b75c2e0432e2e87c8b5c24a0af02d915acfbb5fac59c8fe62c0a7d1888bae512", - "140a82ad56f8be75f8aca43c6a47fac32f9ee3ce6dc5053fa2030dc88d8a702b", - "c4b54b5a3d51e59e218aa49b9f0eb5dc1aa13d76d38c1d9990dd9ccd25d72fa3", - "e0ec201c2e76eb9347546a51ce0566e0d657332f204fe35ff4e419541cf79798", - "d2ec9c2d048010ada03bfb71ac6bf6d47182d418a01712b7bd223a5cf4a90267", - "7d3adc9c62ca98fb0cf0bd4ae69566ef64885b3d8173217d6e899551a0cbd5c7", - "8b9eb2c4d428df656779b81311eb5e4d5e3ded6dc36eb2da0242f282430369c8", - "0de70b04e28e9716f3e1ac3e2e8f8a53efbdd868377ecb4a9694314bdae99300", - "3267a4088182cf514da42d0ba684ed23c47947a813deb6548fcd687d2ceb3558", - "3c07e50eb492aa67cec3f5208b1821ab0b04d494204518a5a9a68eb888b08bb2", - "5be665b7c2f95bff5d341360f39e012c981164c0a72099b0cb9926d8c75b9767", - "a3706899666f2480a160e5670ddf9065fcb5a7d2f646154ad424c7c282d7bdfe", - "770af403b97d1f86174ebb636c34c35065c82e8ca5203fd1328674e48c7efeba", - "8171a91c6189fdb118d3961f9cda7eb7e4d1419d73a3cfe48afb01961871dd6d", - "4c804fb94ff8ccf050ebe5f07f787fcd6a101db3c0d79f32b708a199f290d334", - "946b0ee7ad68fa8b954434a9365fc1b4cd6dcb54ae604ab6b0eb474823ba7d26", - "2c2c26aaf5c2830d38a826e4299a57ec43f16cc21ad08108f2175441c5d80f51", - "28ff429a9e5491c82a94fe8b1761997d16f4a0b5ca66494992ed782e331ddc0e", - "fa320d54031def06723683acd2bbfe185dffccf1c13e7e993846cf6b51e71e09", - "c1204301783b8baa92307bc731ee80b390ada867d381a7641d291a1f9adb0400", - "3131be8b6d943a39e96e365079416aa8e398eb466e0d886efb89dda59492cb3a", - "95bdbf1acb600b196f3fe13fe83dab3202d7e7d786114cb568abe43f1bdfd01c", - "1213c234d5c242e317ed3b387face2fb8918b9e6ea4508d5e3f4d6bba8b7ad9e", - "cb6c114e5a56e80568524dda39346aa96bffc5e8ec81b18e7ba030a158451a2f", - "2954087c2edd0f05119b1af46a0c634c3a2bae17fe5ba4297159cc824802673a", - "75724c3a1a6d2e2e89287f36d97405ee536c27619c7435342816e23c12eab596", - "2390c5a79a8ef9aabce8d5018bf96345ed82e42c8c2174a79becf123ae32571f", - "fb181ae912ab5bb0651a849a80715a1e7dda61be47d6d9aec22dacded406342e", - "7ea016a4858fe948991d183df4484441da00c66d05ffab415b2c77f64df10214", - "6ab8fd7ce28e9384a805d7e70800d5f67ec53b6e766ac166132925fc4a51ada6", - "187144d43f6cd721cdf4182d3a6b78b873b125e49a105461a0ebeff5faff2deb", - "ae166fc44d92ec7c3cef4fcf14299b430373ad8f66930843fdc7f6ab33b496d4", - "9708322cd1017525cfc34c275c485eeddd92dcf89bd4fcc8b1591378995bbcdd", - "180e1d7998f0d24e569fe948c887fc3297a98f51d5bc09b805eed2eab0ce31c0", - "af459041567dae6cd1d4ace0c4aa078f371987bb1a01f9ae980dc5a524981989", - "0d6387173ea36bb2c80c4208c7dd1df7444b0807d58f99cf78158f59a454fcaf", - "0aec38f0449e78a69ceb241ff39121e52d8fa31b5d08948e9fc6f7162894da31", - "86fa7c974c2fb0978691a490f22c695eeb30fb3b407574d6071fc421ab8078f8", - "e431a706c72ae0a1ced9e5594b7903705af1f223f02680613ab76829acc83b8a", - "56f62a5d8c05becd3f6f5f53ea7de2cce49395d3bdac2efa05247489ad7ce6dc", - "01e9a5bf07ea9bd7221ca6c0d1229e699821a155f57d142f82d2588cbb75009c", - "7ceef9250f952e0d53ae0940ca12a0703c704ee4a4bb9311620e3b9cf47a135c", - "bb5e806abd40d02286c45dc2cd57eb143314bd49b0d8a22b27bb457a9926493b", - "99cf30c3c03f39a6dead450abc01160ce9474fdd8d6876a73460da122d22bf27", - "78c2efc88c994cbd1608204d07f4ca21135ae01b7fc8b1bb1599daabcc2c60cd", - "f0f278a196b8c602cc9632d7e3c642b7a266611b57a433c482949da62525c42a", - "28d7aea687df06dbcc7aaf460242ea6e99c05f3cbde00f9a0e35a5329378c56d", - "db9a19a8e8d45a809a1c6b85c33d554a3f7d7833d87d42cefddf612888e7013c", - "98422e0101f8d6f8f2bb579ecab30cb06ffa3ecb161f9ed50be2fcff1af62150", - "69aae0f728d67f59475a85ff1714c105e12a8acc169898a50e72509d1ceaf7b7", - "3af5bf98271b8190582777afe4f9db27a5b84e26c5bce271fbe9758bdbc11112", - "ce4f52cde0eee5afe00269e6b49a4a1733f885ed1a4673bbd6f3367960218e66", - "7736c48e45207f4c1585d4680d3b93703d85fd65c5233cca6701af6cc54cf7c0", - "b5c6f1a1588f31a2d4633734e3e9d64ba1a18d486f25de0a3f78c55c41a1e702", - "10fe86f87d69ac4ac14155b3a0ac6b4c265d91672c0a6986d8aa848c98e38544", - "1553ce493943a71656eb6ade3d54302c475ca3399cfb57e55f131f3cab8e76b4", - "66bda7319641408d108c5cca08264a096ce80e99bf7f740731d5510a89ef84be", - "74ac67ff77d614c1d5d6b5071f1db8e4e68f66f555f5e89669693f956ff9029e", - "ce62d84a2d72aec284eef5713b32d1e044994fec106efa4abfad838ad2fe8db2", - "48229d83e06fbcf00146c58eeeb398d943423050e42751913922ba4421f3b37d", - "42898b7adfb5720764f1aadc311aeced59099ac5d3b82784ec31e2dde4634269", - "1cbf0a74c23b0a3e14634326f39cc583392c528b5baa00e72f041ba13644986c", - "ade6623d92a8350b6b1ca4b3113844fd79b7d8c1d9aec0c1f42bef387b3cbbb1", - "aa32ea3b22698c491191ef4b2b2d63f8f68982632a579fc76175acb6da7f95f5", - "e863ac5f54fa2008e1afb61192bb4d6414cb812e66d1e514e119dffe3b125a66", - "5d9ae32ccc31dd99fa508e08d84b251ccb347592f26cdf42c25646f35e1d82fb", - "9aa4f899b3efbce25cbf20d8fe94b12639f303d3e4dc693d371dafb871d4bad0", - "90c92df9e273f6d66df0e06b0c985fe34960a1e4f6dac970e49c26a2abee1e62", - "8d06a6b7c949c5c60120fdc626f15739d9b8548e747c601627c510ff7e8881c6", - "0bc53bdc4bed99dfa3d67fd6b7e7a640bac02f86dd97c06639ad9023b8323af8", - "d898cce04d74ee539800a32232ea9fdcb44368d66219d1617a46dd148d76f880", - "da73f9f8f6983b848179966ea982a316fbe682389a5c4c6ec3573c1816a7984d", - "b7071a668f35e260014e5a13d8bc5f961b51b1eecff41cdab2d8e5a1016a0d8f", - "ab6e7c3ef8e2fe352b770e431c46dd66600980c14ed8ebe259be51f8e8eabcea", - "586ad96b7ecf4ff3710fbc12ad550203e0907ab4f3a5912047c2895ba0dcb74e", - "ad1e5d03839c80ac82a10b7e4f4bc8079ecf8b9847b4cbcd9174fc5c090b520b", - "a552d93ade907eb9e3fa41c072864b5c159d3c540631accbb5f19a16117f3c34", - "bbeb0e860fe130125139eb2f45f11f4ee979bf00b7296a562483fbf8f6cf7698", - "03fd21e41bf5c77ec41d10fc90a5b84b32c31ed1cae00c25664f450dbcf0da41", - "9fd815c10da67ee9f64ab6261ed88fb975030f72a37fe40bd47fddafaff91bd5", - "08f876bc00a4653d9b6aa0f60275bc4078efebe1c29daf32c4750a239696b2c5", - "3ffc21813fa90d2a1b9daf15d23e7bf110c2b16dbc71af78bf7cfad2b36fc068", - "6524465e4c94c587c6d1d8b82c0bbaf5db8a487e14419886510fae209b5fa536", - "76e7928b434bc66bce735f68049354a374666e62542597a86bcff503e60149d2", - "0477e638547c45f33d4c05aeb553c82522aed05c0bc5bdd48affa1360456732e", - "8c0155210dd9bf2a99bd335b1f38da8a2c26087f5c9f2dac29c98a04bc470b5b", - "9a09c08ca6ca2cf61c845c6cf614853e4d4048d1c7c4cb89f80d4d6a48783db4", - "91600bf8bdce943f087cf6c82175199b2b6b2d469b7aeb22523d346666df94cd", - "4e6245afd97eacc02ae305e5570fb4da537a4d0f2d5dc9a0ad098d27cb0fed69", - "431de536939640a1aa61be6ed7bc6d50038665750274184112c60257eccbe6fd", - "41abcc3c10a8ef04053c0794898a5c85c7e57924da0a32a0d5e854817de95e68", - "277c9e1637a36417189a18007b31957482c0374e00d2fc452a6d8167ff13cca0", - "1420f7e44a1f13c33c99674911792695c04a500402537a6f41c41d2ec9545b22", - "bb9a710ebf79ad558bca658c6236e101e80de335e93d05bd50f0c749ea5d4889", - "95767d052e4cb54b24e51202f0d437323ec130de642964048df99dd5df6a7ae8", - "74d85c38f7ed814e20622cf5e847fd41a83f82925dd9682aec7ddff6b2271902", - "c3f15d1da19c3e0ba70b6991c92f5a6c74c7cd32c30d8aafdff4fdcdb8cbc12a", - "2bb8da8a96c2e399ddcdd86a1db1318961e3af5d299a21c38031ac323c57983d", - "bd3d08a20e0ae8b802e70649d192f58d8b66ac1f5e2323faace3fc468013fe30", - "428153973c7ac5827b84690af70feafbc845e052e5724e042af76f9efc0f89e6", - "b2fcb4b39725bbc56762e34189f9541b7ef7f6c788ee0c7614f8ca3a77efd8f2", - "a1f6ca4af93029e5c1067cffe737ff7f7ad352eb8bffcb7c5e622bf810ae3f6f", - "f30858fe95848a5be3fadd8f74b3d5a4210d2e3773e268c52825238d8cd99264", - "2bfeb089518efdc2f9ed77123732a52c5a32113b5ffe561ff1b16702a05ca9d5", - "306c64845a968267b68446241d891ecb8ba8364bcd285a8b1711b3af0080f29c", - "ac748495407e4e068a9c6c69fa008b42f4bf07961c6399841d55d8a40d99ad98", - "c664bd80375c794856406e9e0a5c92f3290f325f261b6e84e2aef5b958dcac73", - "143579e77fcbd1228c738a6a38ce0e980aa75e28a8472d65d3fba2344e18c098", - "eab64352095a24828a3a589fa169b223087f43fba09a166c42f6ec87df27ea65", - "2a448bf9c934ef1ba9d0965a2c6930b023a383a10d7925fa0a90b6c0ef16be73", - "a43de0dc782d5823c1446884fa5051d9e354dfe16cb10ac7ae8c14723d0655fc", - "1bc4ba9c5138902c9e91a00b0009479e897279bf473edcf54bcc46e9298c5c81", - "3193400d50ecd6ac85b03242cb6ec0b9f91d789b1a0bef1e9b0122c189bc8453", - "25e25aab7203bdcb8a5544c1965c2d2ca87bda4f5103ecf1fbb2a78156c8b663", - "65df75083a1c663db56798c3c61adfd38917f55cdfab011a718a55cbe8d5683a", - "5f3bae9383e1d9334c99cf2f492980adb730cb15f2377e8e697b8a959a6c7c6a", - "7ab265fcda3fd1f80a4d19a6b42e1d24fcf6775c074cd4fb35cd4a0e701a18ee", - "565879c7be71ad06a5df653fda0303e4b5391ef75d08cd1bc21107ec3db38697", - "717c10504ac808c26d8a625c80540b4d346e296fea782369ba0184aa891b9426", - "908b362681cce57e853c51bb6a5e0d333ce661937658485cceb38779aaeac1a3", - "455aaba3dd4a4e43baf1b944ad58739f7052f3c96319ea775f1001d71880e3b3", - "e12e522febc6bb8ff1c6319e363a3ece66ba5de792051c9cdce5e54581854321", - "f12c93a9d6ae495fc33f0290c7850c220dc1f6eee48d6424bda20aa29bb372e3", - "8c58adab58069f2dc5b161405ec8814dc1de1417bf8b55813ab7e47f155244a3", - "6eefad4b89af18df364480eb1916dffc834b47faf3bac6a7cc472dae53f8580f", - "527f930bd9115614c6a065a41fd21ea93cc52ffecff3d57511898843443df25a", - "41967bbed9d251fcd6779b9486d0d88096fec54bbfc7a3db3115125ee8bc706c", - "4e0d7373b7f071d202590047c9247538a5f72dd1955f998fd31d12248c82ae5b", - "8e271a3cd1a515e138d4ff683401ba2e9b3c8675094493cb3a580b8a185391ba", - "41e96f6e823dd46f25bb0219c6ff9bccf418879d50f9f426cc40028d115ca785", - "38171218efbc2f1e35ca3a075dfa58e06cfc62e3a84db335eb6325b3eedf1f04", - "343221b2d2dfe942e05a5250b9da6cca9b6049782bbe4d0cd90301f0507590ab", - "56241ec031e43d442b9bb4a93dcd3beb7bffc7f19ba6ac8599beaec4eca1b029", - "ecf172b556956a5982fef5b390e337d67410a9fc8a746ff628f4cf7b66e70cab", - "e588071f1bf8042b02016c0963f529536e5e95119753fc7a1b7a1c78df235542", - "6afa4c93d2d2634b69ec7c67dfd49d83f4d1afaad46b2d82f10242a9ac4fd7b2", - "ad5cbdb15ed31bbaf0c072cd3b6430e5cf79a916d5b2a786ed6b7ca669109863", - "0d846f1f6beb8ba7e561b5c5165605a755c71f0037c44f04e153666ad8da4605", - "d23e2b0d924adf6e40f15336c5f0f530258b7e1665930f4399d5f91f0d7fec51", - "82c8d556632eb7ea2785bb5db1fddb3290c1de2af4adc52fe9e973fb0243e654", - "6ef13147215ee39f7d45ceac810ce34ab3f2ad9fa58b4e3cf293d9b49853d111", - "6012923f401a516b042f4f6d6a4d33f950948b666e099da85ee398c16a78f8c6", - "50faa4dd521f8d0e4ba859b455e141ca98c7859848ecd37beac086a02d9670da", - "c6a70f35625785aeec189f9d8327794565c16ca496523d562389650ec9f73d84", - "174754f0fa1f589e1f9fb68ccdd0b2788cb7d9c8ba89ebbf29827f0df2323fdf", - "11902125e4bcd0c85193d7a243228fe5532bba5e65f392e583da0f5279a5329a", - "1b23c77c5add0040ba675609f3e380395534e0f294e42a414cd14c26946ceaec", - "694a8f1c3a057d096f1b3976190ee802c57f723b4da08ec916681b9595f95f8f", - "afcf6fbadf2cf2c103e8278ebdda0bc9656bde55927c4b2ce49bbd6c930b4962", - "d6ffbeb85b8d3729c647c13540971af9bb9fb4af5fbce6a3c7be7e88c64021c8", - "6218411f6e7b97bba7adab2a029680761a74cbc337f5b1ae1afaa9b2db9399af", - "539581ba2f87f6ee407a5d13332597d41a84c7f152617a56d10c8d38f0f51142", - "dd8ceffa09e7293e342f9ce11863358d7818ffd409aaa7734a176ddc88c1fb7c", - "6df24aaddc2f42859152ef9fd9d884c659d404389f827f3d5b25c12e0204c131", - "47bcafb5dbb5753c683d678d50de967fd1bab909ce86de753b5856fadcf0410f", - "bc1c05f7719ba8aa52cf7a30a1ee172ce66ce685de2113107ae6041c550b61e0", - "7dfaca2b2421b4ef08b6b917bc8c3488f91c20ceff428c6656223f1be5c0d412", - "9c21f4878e1f35a3589e0ef60cf9086fba5e082a272f4ff9cf2f3d29f7031bc0", - "d93d1b9d12b8cef0d2b17a2112322abcd82f52519f72e9645e73f485f3ad1656", - "95d39b540d4c0edfc95a1209c3e79f123fef1432e16cab7c4ec8fd5f478f35a5", - "1560ce2768deacdba136ad6f3829df485e25ced88c2184b4b2b12a7051d83db9", - "62ee9b642b29657a82db8ceffbf6d8fec9160eaf995cb7e4225c23d14626166c", - "21d8dd0d46cfb3934455a106c7ac9887e1075bf3f5cce4082f8553b2d2136e82", - "f1851b077cc2b97ef09bb67759898c93baede5b9c07928b34a3736d332116bac", - "615a4c47b3d051df3250ff3322b07970324a0cb3f71bdb84914792950c0c7de7", - "d70a9eacd8bcc4343219bdc6b44884a80ece96e793ac02f43ee9f8c0e5c9f8d7", - "3b0b2fcd0dec8a61faab638241b53bcafefd5c478c51a531a8a3c299894d1443", - "7971258b0c85f2021887e3529dd6676c14855b75bd59360242b995b775cb0397", - "72bdf3da343d192e17b305742b3cad6aaca9283dce741e193e84a14ac9453c48", - "d729de3fa2818cd1a86077bc238ec3d464fa8a0d82505cdfd23f7e9f3034398c", - "fd319b65542c47e75886212f93d409ac212c55e2293327d70eb29893499309d2", - "d7ae0c901a121cd47421b06671b228a74ac8bf550c297b4ecdc493ee64bdddb5", - "71c8fb28a780b47c1fccee5562d34620fdac6a16d1834d630fa14b02d4948de7", - "4ec97e60b626312b23ca34bce7b6018fbb952b1e0ba64e8849d2c6d98b9da7b8", - "aea4e79a5b7fea0162605fafcbab8f19b3ffbcd6a801dcf3ff6a49e4297de2b5", - "e00ce6dcc72fc93ccdd889f214e43021a83c73e2bacf689efcc64a468a4933d5", - "9cb08a580a459bf32a89ef5a10573da7d66ab7e51f41916f13a3fc3e85ee7eea", - "ea02bf2ec02e33ccd24b57728c66b76903bfb09dbf43b838ddb8bf8c37432d35", - "f8c7fd525c403b962bd315723e52bd3b96ed3db741464347473dcd71a00a3023", - "b2be02d3a450d8f36de7082eda16c6279a6f328602b0878064897e2d1186c0df", - "c36683a381d40057d2eecef0693b1bc2d3d2276f97edd0bc971ea768e89818d2", - "e128cf922d71fdeabe003f9ae9cc0cc28d71559b78844fae96cb9d8d372e04cf", - "638684aeeb540dcc759beba1f8154d1191eb2e8b3ba7993af75916b2d0301c3c", - "192e1d5b6477f1bd10331014adbc7f72db5e6bfdbd06a1e83407124fadb5c89c", - "2c05c86a0683e1e1b5af33e7e13c31cb2042c1e18269b87c8e3a0528845b8cf7", - "b9e285c2627f87b9ed9c706ed75ba0918b7a0e4fe5c5fdbd2dc5e5684d820842", - "b0aada5393fe965dc144b8ec89544235228cd226817c7b39fabd0326cb008029", - "8cf14ec32be9268643c95a0bdc38aa54bb5e8f71406bdb3a11865aa1713f9cd7", - "472fc00ab207b656bac103c07ab4c96fa25a81db425028087f14627902c1f4ce", - "89b4bad4a01d32ca07a33b85f0d7fd2313fca6ae815888e907f068c8091b8e5a", - "af2efdabc7acb4acd4d6f127b77a031ba1f41ed59f8f3dc010d234577105a590", - "41eb4ee7765eaef183c8731f81b4770423b7893d007ee1ebb9c3045ccc278079", - "123342d5f4386150475b9f9cf91483c2fcd0301dfcf6688239c5158cf7ec6e1c", - "9ab6474bedcc72ee250f716f280bbb369c32506664e62123303486c412288d15", - "acabf9f8416ce238820560469d0a9bcf349b4da98609d745d2034bb1c7163652", - "af9981e87a0f34aec5900267736fe3523e7b4af7c00cbcb223a6c602a89ff2bf", - "dd36a5e7dd8e38888c8d6306004ca56a1f14ba15c3ab38d72354ee654e6ca484", - "9021015e5d6c699d2418463c2140cdfbe92095a7db61857ea79b07aec5e407b7", - "b044f72fed5bd66f7a4e3c6dddb21976065128307ade1ca227e2b5764b9f898d", - "dfb88d7834e03d157a66ca7950e7e1c0c9f3a4e56c086c3536ee78373b553070", - "35fb8fa8cf507fe465357ed6a036cd215f1bde99f0a916db998658e344781b9d", - "f706a3a3d9ebd0c580dddb042d02742c603c549743a934e0deda8404bfc0133d", - "d33a02d9d17225d1cfac10a32d592408e06004bafcc66016bbed0115f505ed82", - "debd60188cd0ab6bb2b97470635fe116ef6c08c7bd91182bed24ce6f3c8e4f28", - "d493e2a17346bfa3cffec855ca8bfec3fc4f6b2089b92b3687d7bb12f88194bf", - "4666dac02fa89093af48bc8fb45189e8a24e93f436e0f4b9acffe52d543e0213", - "a59fa3a2c0260e2e1a147e8ffad79194c5f53af5c816a17a8f049384fabe1df0", - "23afbce78a8f1ec6926fe8d3abe60c287a88069854537fe204995a0706483c68", - "a27b0f114c92da55cf89166c698f0a1767260c0f72ec69570f566ab608b7be01", - "ecda18f2e1c9a18a2f9685373167ff2e6f73abe75d3a4a2df427004286acf778", - "9f9de1bd250400f4667ef33ba8fe00d0d5ee7cd340500bca544bad7419112c82", - "dda8e8f6f03a1ec5440ccee063fa0f22ab62a4d5958c37cda5703b470ea3555c", - "e96806af36b023cc7a6fb5b4b3d95b65709a6190fb49707098c59fd99642f247", - "48d3f1178d676202cc4b11b18192bfca9d1093c0ab307b69fc8be235ddd4ebef", - "0e024832346f7df8c9811790a479616395665cfd6fd27398cca46c013ebe4088", - "7dc276cd513880ec1dcd0fbbe72d145f2f204144d7e1243115280af5d1a678d9", - "23d92a79318c2e245fdc95cd09f2937a9557f21af6da47143a3f3a0f8cd28a4d", - "c619f5b4a2e57f4e7d23ec215d23263f9c6023ef0906bbb4792984f87cedb88e", - "f66074e7117058841b942de9d004e8135e8b86696ab1dd7ca5c8269d37e41d58", - "2dcc55b512139093beedfeed9965a852bc85872e7397c29dad0653fa0dc39aad", - "c71cf4e871af35bdd934616fd599fb951cf8fcba024f7159b3cb89961fdc020e", - "e86cd4fc0aec048abaa368e87c0435ac6c0845287e1cc629c6a939b6cd4fd0c0", - "ffc044fa285b2d44f91c7a43863172a2990b5fba62d8e6023856acff807c560f", - "e1cae7904579fc22daaaa5052b7dd2551869d444c79e7c82d99b47a49dd0fcc1", - "ffee6e6e0a7e3dad8d3db5f80b59cdf2c77b9765cfc274ef2726f4dee1cb4cd6", - "7749f5cadcbffb3ca1024ae64670f2868aa198df5967af32744dda5dc3bca30f", - "4187d8b7d9e8d5c861962c0c83265610c8aa419cf11719a768a8ce52c52f17ca", - "7dbbeb9b6665e6eadcb1b1cb6a6dc252fd7956fa115d7b3494af8979edee64b0", - "86ddfb9c99a1860a3dc67f13e88968bd52fbaaba89572cf91b1294699882f0e0", - "bcaf223380d4b69db936cbeab714861108e4d3154e093a4a4333aea4dbb7489e", - "6bc5a58045492f78bc0b2fea1ae8f52eb9016df9471f238a4f6c490bbad6a2eb", - "9f1ecb7ea32b9869dc333da2e892711ca7a03362444591001dc21bf0086ddd96", - "5c025d87baed84f33ce221a41853fea8553a24615b9ba46c8d2b19e2e24e585b", - "f3145b34c7ae224d34c32a49d0417e1e2cd4527dda132d6c0ddfc3604789aa84", - "ed0dc6951a25a7d298f30fa99cc93887aafb5d29daa9ccd1e478562e2e43ec95", - "d44eb8a6ff7f0d10bd55acff2ddf64c236aaf37f7bc04f5d0387bdefd018d61f", - "a3cf0b1f8880224310b9ede5caea7bf13aafcbf40980bf9ac94d509c3180312e", - "b0502dd91448eac3168787fce113c1828f7a8f0200f90f66bbf852be2e38ce75", - "a2318da1704b4412d1c4732d01e0f11e1a546e92be3594b2ebfde3bd46df4e12", - "59f80bc043ec5242621c939fe5832386134bdbf2030a0a992a1b582f2f2b85b0", - "4c0fda2c2444ea32fcc30660143f02d38ae9c48a2174b3459dad0f809000e6b0", - "f703b42f3a56ac1e5b472049261dc223c2323ba95cbe33b17a10e190bffc473e", - "5cdef61b436e4683edc30ba90bc8f2f297a0728522cb520b7a83a6bfacabe638", - "0c8c9b2931d79490d56a6c87ba6d26e65cfd68b98741a9530465f97bf210c482", - "2197edb0e09e94f0cabd6a416a73d339a245a7b868af66deb1112866548ebbe6", - "7e64cd3d3096ed484e87691e9063ed7cec0c18f532ac0363ab974459b7dca420", - "8cc578d9bc12a41b472376c37d293b08f9bbbbfbe731bbb5d57dfb886f0cb6c3", - "3d4d2aa00d9d0aedcaeb7e327ae5e27246054560679ec3e6612c464ce078af76", - "2a78bbb2def6878294a5f19f47e4ed04cd0bb679a206038bf1dee4e9ab736681", - "504a3db0bdd45e27ae5f0757eaa9fb7deedb521125b5533bd5aafde8d72a5694", - "54c6d45a29d5e816bf22786feab7fa8036c46289ab22bd64e40318800c6782c8", - "27812672ff738168d3f46d5dedb1bc4c51fdfa8db2ebe80fb060cc014fffa67d", - "2f42672707b122fe9e5d2580d6d785165709ec055bd1683dc041ba032fad66f7", - "1def9185bde87cba66dac2d0c3b6f980fcf4de13df545d1168553e2a609e4cec", - "763e8c4897cb9cfd7ffa06f3717dde560fd18f66f0320a8158f33e1b72cacbfe", - "f17129e59e195f8a0cfdc3f9aa927432802941798fdad6c7debd4f6103ef8300", - "1f4c43015be67c8d9eb6263c771f48be1811b9e3e9f79045099141182b80e35e", - "ba3ba63938823a001edc92e5a1543648caa52c1ace5733b966362cbd7589bff1", - "034b59098dc4bc968ec5d04715576c71a80dfdcbc7974ec4d8aeacc09c876803", - "46bac2959b8467a513624df6fb2bf50b1efe97848690f580a5b10fb5f90101c7", - "1dcef727930e2c27152061cd218e7e6c685463633195e5f74ac9c9832afb02ad", - "7ab93d6caa5dfe78cfd152e8a1d1b753f2e4288393b7bf6f2668925bac9999e3", - "15f392e865dae397d71736805ec8c32264dfbaa5d74e9434257d002c759ba629", - "2d65da7e25f9acc5c3833704416595098bfe788a3d2187c66577ee58f26143aa", - "5381d0dc271412f44da997ec6ed71f41d4bd4afe95c2dce76534b00ef20466c0", - "48e43248d2cc0c7a6b743b11605ad0b3eac271d0f21aa98daaf0bc0596b26ac5", - "def0c6169846adc407f3a62e42463918881946ce7e8c2c7fe9e5662060c2f903", - "e38377e5ec7c8d1d3570a21a2dd03357e15193cedaa733566681fdbd16786f2d", - "c5960dd4748d119e47293b28bcfcb8737b4573a13de5e8c09abcf513d621e638", - "dfbb7ea661aa8351222afbf5e4e326e6165206734e584ef98c532fbe14d33bab", - "18cacb748668e23feaeb93311d0cf6b892dbe620a48aa0c98adefa44f8e49536", - "1f99653dd4b8579dd5a045635ad29645741b889afd80231ef60f96e994ee0af5", - "df85ff178e038bb4542f2dedb1332e0ab674f1314f10a1eda13ae76072b55757", - "9db145db281841bb4f45d2aa1b286fc43fc3c6de61d83db811b99c20b8603ee7", - "fff9630d71efd0931947a965924401e90fbc6f16e168ff0a6379c7f4bec04e44", - "2217073813a88d7a40c280de26c2d711999feb6720dce0d4ae93d8decb3b14e4", - "272e82a5c593211654a1dd8569b5963bb4610a84deb4ce7ff07f1ef3b7614245", - "0842440fcab868c6d2a1a98b54a287855ac1253ae7d5e6fa24b42d664e2a0e60", - "a8145c0b0c34025c2e95f05ef5d72fd71c25397e42c631206bccd31e666f391a", - "c59c24384a2c0bb034695520218968009cac9c4ed7a7092db5c30af1286bae16", - "74293c5b69cb29bdd114ace3df3010716704dd0349e7470543504cc8d7579ea6", - "2a6925334baee5b32a378629afda1d0f5e89a767759f0ccb685493b8534095ea", - "0885c2d0e9d12e12bc6ef9592ceb54b1734b0a7947a5f7b8c763b47e4b9d249c", - "eb16805aeb7fadd464506b8a61b8717a0de770a21702b92c7f9ab911604dee70", - "f5b3948f20ca31546ddf5e8e49855f4dd5cf8842696d63a90e95cb40b3dc06f8", - "16facf107a2bdfcb0cf0c2f92b5e3ed2b51eb57ccbf92d763f25a1d595f94a55", - "24b02c48aee00a4d2cb845def3bc0761f3fb4f262be67228bf824756ea23d511", - "8175cafef16430278bd4657d71108fe63dbb80e76615b9d0cee1f5a9e5993b03", - "0a73f27fd645afd5495576d03aa68fb363a675a156e849a8548cb9c99e08faed", - "739679b2855581267c7d768ab5307cb90946f6ae6e5cd53b9f51c648017e0e99", - "4f94e8029b96491eb06fa8d81bd33061b255897ffe0acfb813b2163578a4ab4d", - "7342c1f4461ad058e43b2d287059abc930f69b80e336a87e2f8e49d132dd9a60", - "4468587fb9dad0506be344a37483fe96bc10c4c26c20c5a7da127a3bfd287d78", - "f49fcfe5de7025a00832f5f29270179bb7133c814ec04ef18100c55211ccf772", - "03caecc37658fdd86e64603658683d73bedaa516dc424a1fe90b19196f708c86", - "a20cbdd71de8a166bd92caaf7d3d8b5944dd079c556e0a52cbcdb21f60c1a1b4", - "701c8c3f8056fddfdd04bab5dcdf5d280da937b251f6b1c0d89333bfc3f0322f", - "666571dae82f2212aa354ce932e1d62a3a474d16e5bccc4c0e1faff628dba328", - "52bad547b71d18a6dfcf06968dee61a4923f50d07d2253c29a6c25c229b76a24", - "5c4e8fa25868cd4d73c44ecfa86c4b70eeac2abd90848c69aae549f04b01904d", - "39882f72f2d94f3530809da56dd87b7f085eb118ed7206f0e62968fe56b14d7f", - "136ee5b9b2f9ecf61abcd276c47dbac1ecc638ac9b9144f191ac1558b7471f14", - "6aa1b4b1d1836f1a2077cbcdbb2e1ba4b77143a35332bb099afa3547ba8556cc", - "79cca8978583edf397c0838a79a503990ba1d05ec1290fc187fa88db994a16cd", - "4c0e575a07ef4f05704c09cc672d0f21225ab1dd341c191fbfdb6d52d033e99d", - "198a96320599381f3e84a63337453c2c313eb42fc7b5039acff3e286ee332c22", - "12422bb43752ecbfe4828e1854b92247a81b72c1913f07a4461071f2ffd7341e", - "f5a1f7bee4532a9329134435d8930f7ccd44d2f107d13f592e4b5d6488840cb1", - "b36675a276ca7f4e71c97de7ea8c98c08eda256c9f829f089095c8d3c9d22240", - "b28147209cb6b773d03dab42ff06db45b7e2567ef705a5aec336b90e38f17fba", - "85a7d39fc12ecaf3ba461bf5d461d81641762e96a108f4b4917d83501594c75e", - "9f3519cd41c0c4533993b2482d160647fc73ec84d51382202fa3bbe9bb631a36", - "7fdb3a882b93c93e03d15da255b8fa00977586854411512e2cfbb810fda62db2", - "82139dcb3f4b3892fdb49cc860a0205ccf2566d72b9f9c7804910b11330aad2d", - "b505d7d1f3c76269b6ff8eeac7d12f7f1bee8bd78cec4869b3de7c8759b39952", - "3254dbc7a4a3235ccd88fcde7659cd5d9e0e6dfe689f73e06e023012c6954010", - "9f43831bc8a5d902fb152a9818e5ab2e9dda78f4b10f3b9ad27d73c01a01acbe", - "b5faf16bf03a7eab5758caa0be0128d04354278af7e9921fc0518c0b54565121", - "31698a55aa9bdf62a26942701afb74d5d12709bf8afd1ed3c686ffcf21ca5075", - "edf4042b61784580f136bbe0930cf528091016853d907635ad2df042f8a3c605", - "c72579dc15bb6a4c8cf5f7a11fd7dfd38fe547c5d1d9a163f342140d820cf6d5", - "d341c4b5bf1df555f971f737cee2e1de8108c0bf70aa62d2e214e7bf7a2e7c8b", - "1cec7a8147d846374267b7b4eccb2190b225804ff35f5220454723259ff40a44", - "461f951a8b049355f3c42c76ffd47ea0860c550c9e625b0c9de2966bb1380d13", - "3d878b5743235ce42eeb627290b208087cb435c9d1d245c6b6cba88a00001c9c", - "bb9249b36bcaa979d5781f210b865e0bf17cad213eca2c27d34165fb570a6f48", - "011ed1cb75da40395e6cbc16d192a3d8145fd3e2c59565ea44464cde922ce46b", - "12b2397fb430bd85a375288f279bd79153045958a82f3b5f28ca60eda3628ecb", - "1e6b6840099fee57f0646301e8f2ea6c0cc1d7edd695fa1f6ec45ab971bd74a2", - "0c28ce9172f263db6a40fba3acc46dc7bb0ac8c60e14cf02630120ffc1accd2a", - "fe5b7fea8acc5d78aca817fa9a16d5523fd696ec662c889802597c06801133cf", - "bf29c22e6d1775907e2f489f8e8bbf496a9c397cee9871b82b5182a64ad8143f", - "7586542bf7bd99d3fb4b0f79b5a81a2fbebb80f869c697ec9e9fdee3013c2fb8", - "acf1e3b92b2dbc07f68a6b0944c20632945eed13880b9a8f52e5ae2c0a148bf4", - "217c5adbb80e01d4b80bf9cf046835b71d0a78638abcb2d4064ecc6fc331750a", - "9f10cd6f33d3775bf3158be8c4cb8e7d4ba25e8d42bcf7613138d5b3b009e3b3", - "2308cda9e39a078427dbcd47a7d56530ca9d52a66320ce3eae09b8638dc79af2", - "69a3c10fbb24a8a2652320265348a726c09aaa714f14f10491243ae60973d141", - "4b9d8f104a78cdf18822549691cb53f7088edf02dd64874260e037f3e57afb3b", - "609ba52c03a3904f1ca18b9823de6a0458c57df5e0b746c6bc47a87d9ead19cd", - "1a738cc7808ca02cfc09be331b5ca57196b92eec8cd8d9a2eeaa3e4e07d64c3a", - "248b166bcc360f7f7359405f13e3dca3d1c7443bfc402ed6536de4bb8c091007", - "8bed66137759c32ff719849d8966a957aff4195d45941b757228ca1a1ec69f61", - "b44d197d91afb04e6991933a9384edbe3dba0124d9f8a9c0c7dac6cf9208a5ad", - "ed0f7dd1ea79c415c05c16656bd728ca4d7bce052b1bb99813bdaf42e7a553c7", - "15a8367ffdae521bcce9af04f29e856c3d6285309eeeb033b702032d0a7100ba", - "2a5a093f20ba58d1106fccdc80c6a37eb5f803162b63e2b5bb8906baf2b2005e", - "518e6feed21584c5f41b672f2a80b44d7a4944b8a0b24a5857dcc9aba8cc51ec", - "55ee735d2112ae4de3d4572a238bde0a49eb7a295492b2b7582232ce4964c282", - "fee27f41c0b972ac09516f3441f0d97ccb62ec320347573b0ae6649d72d78693", - "6855dcb8b0083efe0179802d7e7f00b6c02f76840e1c4985f5a16364b6121689", - "eb15d7162c0856999e9a6290dd3b446a4eb8aaa692d76ec9e91384678cfa220f", - "d421e9d8715c9c49457e9ffebc6597577cb6f8fbb91a16c41f84b7298ca4e661", - "aed760653216dcee0f45d7823f181077e98215c35d7e2d94dec5f461769c3719", - "e6349a31774a71e75c49203526a82b7ab589d30b068e4ef567836b979e091f47", - "4024725915f2945e7be5429ce9d2799a633309e848d12ac872b008cdad8031b9", - "7101969000d9c1eea3d9f2d861149ff8bf048584422229a0b36758a17113545b", - "be565adbde308233ed2a09f624e61c267c1f9d61e8a5b978a3511896bba7a384", - "a84247f641db0133f9d8aac2a87e10bd0bfcfd0956fb8c0f70f56c7dc4b789bd", - "32d7971f7dc7ca2399629d2d6834904b40b39c830753d0764c5ba84208cc24b5", - "8343485796c8d5b4d1a0c15e761ff51539a1b124cab63951c65b934f6d7d66fb", - "0cd2b5d09dea7fa69a467a7ec8a261a8c1e5ebdd74c980e85c2cb2c7d783a298", - "c26451620dd7d47e88b68dc1d0b84d73b2b0a2ab5849628d420f0c37d5208024", - "124fd6f30ffdf4d869e10ddcdb64fe6cc6d14407c68f80f76fa8649ceccbdb88", - "f846c59cdc2e1d67249123cd77d09f7e1e4859b02fa81ac70f61963e7e112688", - "47d6bdb77542ee04a67b40b6069713500008dfff5c7501347055407afcda7f1e", - "efdb0aa2c5175e79c8de47fa4085f3e7e9be7bd7f23a572c73d54ffe353032b4", - "94d3ba79ad1d2eecb618b7973426ef75df385e8881c3ee142e167eecf5f0d5a3", - "44a54026f013bbad353a6b896456a5dc8d27c6b35d15ece1fd0967328ca9d706", - "3baab0c493d4af866b61130c71082c881e444a8199c1a764ed44dd9247a71e01", - "95ff68881cfea23304ee698714fbafde73053fbcff4a366249c5622199bf14e0", - "ca33dfbcbecd50eb1d31f9403bfecb0c7f462a8356a58c69acabcdbecbea21e3", - "9e1866fee8eeff94598c127d11526e96b7b00c147330a51d21c5b6dae6567585", - "8ada1f4902b3e52b1df55d9397a9e9248f0972d896bf11eed34a93b03c50083f", - "fb4388aab442ad1fefa9b1ccffe59bce33d8c36fd1f25f1bba86a715fb2b2e58", - "170a9cd64378ea544cbe271887942f253d2d931b3be1ee5177c4df07918fffa1", - "44c1eacab709e832c465d372ccd29842c9f8fc87d90889c194601f146399440f", - "04173df9fc8444f316a27955ddc66270951351180eff3bb291918c42cf4715d6", - "6afe36d13b7d489113941ef7bfd40a8241ac10f872fc2ca76dfec039c6c282e7", - "0a66ec9d0429a89be1b20c66a12ca3da04defcb51a2bffadc9c7a79cde7d27dd", - "c124ad9b7d0607b98ee13094add2e4a207cd9269107d81f666c516806b6b0090", - "d62816033c7a7dcf252a49b1c3b1c8691b304c5ae1fcaaac1db0f61f1f2eeb4e", - "3aaae66b20b236851517051bb2b545b84aa0729f7b2952d6015835ae5123f6ad", - "6f3a0d6d5a88e629aac1a41c4c83b736a91ae50a623da2eabc161a85977f642d", - "6b03cf124c668b935eb2377be462b5b1cb46fae35c098f3bc62e9e9716ed97ae", - "04fd9ea4183d4bd80653ff5fe377f392dbcf42968936b78b2c71065ba498db96", - "baf7bda4ee1cf653b19937443de43dee0415f4a3c5364c291d390136685ed8c2", - "24db0269fb9310d117ec4ec62315233e08f97627bf887409c099320897bd88d5", - "0ff98cc385988d12c3df00bc51c7f81799c82b5ae9d99fbd6f70b8ffc09ae59b", - "0ffd8013ab9d3aa544bc6566fd5804c83b658396ffc373eb5413b11394b4677a", - "de5bef69b45ab739f2c00c9eb032061b58151a808daa1848bcb8574c04301e95", - "7f8aa539f5e51003b55857e2ea8b821fca277f97a3113f1ac75af7addb33a0ff", - "c5fcaaf523de2c1cea87d41fd48b3220b796605275cfac7c358045261048278c", - "9f443d255b5ac733b423cbc9c002bafef6a413e221470fbb4469d1e272eea509", - "2c934b92f6d535f464a1be6ffa50453b5299f4c287e4bd7972751b25cc5dd93c", - "08d76b654550c44f7b866a1127db4ca989ac84e8fd19aa66c340d97a359d4706", - "9411487c7f709eb1b542aa39c7f13643bf54a0872ae0fdb8168a5b6e774b901c", - "ac88aa84e980c8024626aa33ddc138c14c0b8bbafe68f8b0bbbb824454aaf934", - "970a29a5d44e8a19716e6db1ecf903a45713bcb0b14f7fac9d94ed811552d415", - "8361c3903a16dbd45dea1955d9f09964bc2e2f394c9ab373611834b20887c973", - "d64872d0f833d5218abd440c5bc48cdb091c6f2f06cc66ca68f5bae6868834e1", - "4f7908816c1c7ff307b9e3ea3001dbd882151a6c4525f8634c1f12d3862f4307", - "29ca4a811972aa2944251615258c4df82762a8e2845fdf66a580e3badde9ae9b", - "209237b6db326c433fcebb5598a14ba6b3536c0683e97a6ed66edafb440c4123", - "4866a09022646180ef5b7e74cd319b06b6e4870dde57e5dba7d15e55b0a274f3", - "7b64df0fe55116c43ddd7c5fae9ccdce9c7a2426b30fb168affd5916f909f7aa", - "a04ff28d704a7f85223067b9cd01043a6fb5aff27c26983fa28d0f256fef02d9", - "0f6b912e9e5e0d9e8f3712cf7c042eb37e441f23729f42de27b4f034661b1c0e", - "a1839b30a13fb0f5c247c29e68b111fff3071e7828b71a00987a2b79eb1e1da9", - "209310fd50afcdec3c1845796175c9615911f606caa552c1e6b1935d007d5a22", - "d59f394b1f77ec2f19e293d49ece9f7ad1774b98b1666a027c8c3e644fb854b6", - "1ff61560e7e0412c282549290c5d04f56eba27b1e6b6817c905d935c5c7fd809", - "d8aaa47fbd6b85caa5d24261d6f25ef9ed6e2999d2d8c2ec2e0c3e0f8f2e5564", - "a25c7c6d37c4d14921929d390fb0eac7e6ce65ec7532c7c03bb3d30e64de8af2", - "d3cde540c0ddba7ecef816abff99de5f943dd08bd98fe4fcce1f14ddf043ad40", - "1acc4fc40df59dd3c634200c32e7bb6499a77ee95ee0a3821755e15e687fe8c1", - "df3df22e0c90ff822d511cc209e99e53389f98fe41199ca9e0363631a998816d", - "5f3e0ca1c9e8736b422bb2063d4e4429998f3dbd40b713023924d3655b374b3f", - "8ecbced7257217e96c2f9e058afbd0a3a3fe97b319ff84763d2bad4d0a2ddf94", - "ab0b2c2134706b62251564e97ad1b480d411f3b7c0b60a67dab87ec511c0cdc7", - "740f173b268c253b8c608febdb310832bd71690083fea8a29f8f5147bd4c73ad", - "86d346270bdbf7046190bf57624548d3b6d3444b81cf316ba5bfaacf84fd2ffb", - "50c9b2eddaed680d574a186b74372c505fc60eb311a9e6cee6576a0d2137acef", - "d7a5e3ba4eb81aea91486f09009fab683700edb8c064ccfb34188a39fc9e6ad6", - "ec029aceadbaff79150f06771a4d6a58597dddc7f266d3d990e96dec65ba0271", - "77d755745bc8a0706eb41a737e415a25ef96b326bbdbe7249f2a7387522629bc", - "2b9b16f5e5f67a2682f1102f8848557a6adc0edb0dff9841dc8dcfb52674e278", - "90ab42e65fd1533dea2e1c6e692b70d24134f7be81938c115fd3e143a35350d1", - "c0baeb725223a922b5b0eb9bbd1be62c381355a6376f2fc73de3f394095db354", - "231796ec0cece731d052869dd4688a629ed3cbe17db6a192c267abdefab23eb2", - "af70a0cdff79c902ca9332d1fb4ad985a8ec2ab14399f23274c45b97c022177f", - "a4f96373befc468e9c44ed3a5b1f7f3bcfd9b91046d11ae1645918be2f3afe6e", - "60eb44f00945b8e1fa27e8d92f44266e969be906835ec2b05f4a0b11460d5c5f", - "b3a3a3dafa5f3453a4779583512a369e8e5657dd9101c615d9138e8b50dc48fc", - "fb008f9f2f7e43c4a68a76387649a35061cbf3cde84f47be4ca849f08c53f03f", - "403290c77f772e44918d9075c0d205b315d05ac0db0f49717f7a035f2c9e2e1a", - "692b5d7d16d34775c7af028236f7a08828d3229988c197f49cd2c2901e9d2fef", - "a68892b4796bde33b3d2eef7c8b19d610b2d75f038a1fb819072235930b9eb03", - "2c89b47ff97e66f131a81208d567bce0f9d873b8ed7bd03f7001e52be7be30fe", - "863520744366c58908ee0812599c81bcf7978282f800889c1e52c2e0dbf21144", - "4bc4012d7926411ac49bf619d48ec676ec52ef87ae450a7b85d41d6afbd12baa", - "e89a9dcad617dc418b04a96d746e60903006d562fd28f714c0aa5fca872308c8", - "e5c8a14619003d14fe4e1361ce33c0571983785d7bfe8096685f7c3f69cc60ca", - "8d25e1ee836e134ab73c939f060e1aea2d96a872f11628fb4481468b375f3c16", - "adde1ca503efe6814b813917f69d9f3eef9f97ff18d13afc8d838fecc2bb0ba4", - "4251d6ff9cdf1219fb3c45ea54ea147cb3eb6980c7f415836da8d95cf0860b56", - "e1336d6c427884e65347ba0ca72a14e63df298b58c7ab0cbe6ff539b9eb59571", - "9a337e1fa0bf21417729e7c0eb90a3dfc40ca0c47aef236d24a9d20241786329", - "bf1186e59d6b0f0546d573595d5d2adab4f418c0d6f684f0a33303a605c7d50e", - "71593f920ee459d9eaf9b391185fac93ce71c396603648d798c5fd56b6c3d242", - "1e67f0ac3ed7c418b0f35d8c1956fee563b0e61fdeac95bcd6951a47544ed28f", - "c05ee548b72eb2de5af9fef492eee2e452b610eaea3d50fc37c2164d4abb67ea", - "74684e09bea4786af3ab08ef3064f808ef5bcb6bd6527d156750a192f28a4f6b", - "24270838c2ab3f5e615e82410b58c1682c204dd62c457e75a3c4f1cb09cc98ef", - "a55f0c4e1999b5c9eb23d7515e9570d19fe5d9b8630476bf43e282acab374aef", - "1eccd09c4fc3abd6c7eda7b13d86f4b842a760e6b1d606c219dbf1b727b56625", - "803c4ad2ddd3d7a06cd20472188ec2fb09105f8c7e22a5b60800728a826fba98", - "a7c9ec7395c2cbd6c20ffa3edf0af18c5009b37ec81b49dd6cc0c15028461cad", - "9bbc6c3cf89494029f4fecf3c08c5541fa5b7407eb6e03164959bc44c5d71d99", - "4c5a80d9e18a5e89e0250a886326e45744109fefa888e52558bca2135fbc6b21", - "ad03ef057e65f43f0ce45678dee8d55e80cd67d9676522a552cd9e19d6dbb34c", - "2cd1db04c4fd06ac4a5fc1f65a5e3fff07039991fb409a88b19275ef15d9438b", - "e91d3a45c6c3165e99a36558a580c0b54ca02e6bea8e4d7e64112a04f33ab0f6", - "e8d06caea2fc7ca7b5e268826d50e5af688b178ed35fa95f6fc6e75ce0f6af06", - "1d08c6b86b768c28708352532a83a5d7753516ca06a9c2e71b97d3ee088f0d2b", - "99c4e2d9f6ee022f1848d211b8f00d4122386c264c35502856a414501b103967", - "2c1e209a88646d31204e427240f0ef01190a18bda3c94739a436a0f72b1e4f7b", - "95cacf4fe0f36550e83172882e612981d7b65d44e98017cad5bb97d2f99aa2fd", - "232666d2ac6c6ccb8a8f672d8b9c156585c631fdf634b6ee43ce99ee3231b62e", - "b159fc39aeb9116ca38f89970d0116c64ae8c150f5830c0cbf32810e1ef38671", - "1b16cf47024ccb8976755f8f4df4bca2f51c793ea9b52f2478bd26e89ec98f8a", - "34fb960d2d886de5ba768121070f67005e29b59050aa98fe16ed83c5277359f2", - "09d481f358bc3bc931915dbad280e1b01c09e6ebe8aa251fda0bd3345fd1dc5a", - "3012eb6b882710a084aba8eef303c2627bf32ef6e85b1d6f07ea4247355d93c0", - "b49f7136811ef95d407bd97de3435c41429c563ad5cd5bdc354dccc20211a1af", - "189589050eed92ef3fedd6a673fc42bec2f2f01e59ed776b66279eccad5d9a88", - "cc3210832f60f7b264da733d0ca688a4c03a3a48a92b281de08e03482968530a", - "d9fcc8b11a9f34f8e88fbd9a61a267d1d9ba25a886c4d5e38bbbfbdbf2630718", - "5f9d905d9229c0bef9b504000030a28381dfde6704d0cc210d295f797c1d4798", - "7fbf266ca6a945f66e4b26b558cc3b8ec9ed0fa8d06a1ca807ad7799e6e299b8", - "d6c2441b2a34cd9e526d3c3fda300220cb9f9b3dcecf80ff3ebfce5f093dcf77", - "febcc1220eac30aa003f6e99c621d226a9574e2b10312e4707778df5dd94bc06", - "4c5e8a989acd649e57f2711f5cd9eebd596de484aee8754935658977dfe8b307", - "45aa419a82848c1c6ded0fbab79c51c0b0dd7615c6019a684fc2df7638235cee", - "815546241f538fdec0b82dd359012c00bc17d21357c484cb712de7bea9b7f779", - "90ca8ba860c0131f592fae56e89e2e98ac5c87bf68efa5c395cb527201588f43", - "ef67ace9d366d9f3dd0578cd4c93fc0b5ebd549d913e41218ab6f46cd956a455", - "d85749d93aa44b073110f083fbc59a29c9c613cb41dbc53b1d21588390069209", - "97bbd6050b70361feb64ccc89b569de9348ffd0c2b3e3fc33a00c1d974d842f0", - "fe86716ff670ea6e39df265e4997c576f4ea872fc46e7c90dc5fc97c7234c1cd", - "e1f4c89e8ae6d6f69de2eb70a0d70dfa297ab2d53b1f63fc01c6165fc7b15210", - "eea09efb3c23e72f85ac4695dffe115c0cde52b01546f052897ce81117164e46", - "ac90f265b96c82da3f7cc37db7839a553aa34cb8eacd7b5a9d3f810d79494c41", - "acc8aaa5e9dd21f533ea96080dde1f8fcde91a6bfd576d4686f0af62a108acf1", - "47680b1d7a83dadffef99f2fd8e9a407349bd7f9a4602c14f4b8014ad6327bd7", - "9cfa92d86652a2cc550217e2242246f14724163fd8e3278163835bf12aae0217", - "684f75ed85d7724aacb1f420e0491ecf677107e66b492cbe90afb166ff98ef70", - "36b4c695c217b0b1aba47ba314128a3ceb35c154b9625870700155b9d2872695", - "697915f3f29940bc943369a577c8308fc32450ce8a2b6a8cac90027e46816f15", - "48deabfb99a37b4802fcb2f3ea0123611e9a81661b396c7ec31d87a1f78a6fde", - "0037cd4378c00dff0057103776a9b4d41d9b2533bab241f478d87b4e6d3e177e", - "e31c80f759d4fddec1d17eef8b4633ef6a0eae055c0899531b1f954d4ee035fa", - "aeaf8ab10cf2d787a287cbef59add15ce672decc55d3ca53810c3c0c8c045f62", - "576e83d207901bd1b9eda37c6695a3ffc229a05cd19a07f3d2283d4803b347ec", - "4c4231ed7e6fc0da10575c64e9deda1d84c1121bcb60713401bc1c0f6e2c4988", - "012e323d392d57b0a6788d61f914d6ebd4134aec493cd12cbcf2b670fdc4e991", - "34c31221bed5ff9ac1358941bbd396c8c306883e28a1d610202874c211f5fde1", - "4f0ec1e9e7ab662bf973343b3ba16c9843815d8103f1991460aba17c247f9d2e", - "0086cf7a36b50eee8e87e0fc70ed3a689c1ca812526f1320da5a932e85f290a7", - "decfa05ffe4b506936f231519fbbeabafecd833ebb798c37576d9b7c8a85e6b3", - "4d5ace5b89f3bec63185ac79b97788520222a6d80214d60fc47d31458d180d1d", - "b2a49fb722bf03ef51771f69196d948e16ebbe1200e1a46aa92cbd7a4061238f", - "738a95a3df01a206e903c0962fad1e5d65c1b12dc214c652ac55b669abba6cb2", - "56c574db88e83153c553222a09ae1dd824b575828bf8b7dbc30eb98c5712ea05", - "df1561e2bef04136498107ce36d34379a2f979570d6ded9b7a9a658793667ac9", - "b22e0dd4992780c9ba85f85dc60e6273cb9119da4dddfff2c91bb0a78767e661", - "73d08f6cc430aa41bd063045f1ed792323527202abb8697240ae64fae12c758b", - "847598448c4a7eb9d62da91dc7ed30efb3b54c060691d992492584bec6acf666", - "29de60c157019fb2d5e5280ef911d1aca2ef51e39ccf217a0a974a6d7c0dfb9d", - "f65db7248db2d9c6f82f77b46884f8d74cbd00ceb6b6fb95b9a5e2ed4a388a2c", - "5235485506c610cc7cb4158c9aae0209b138721baf4beec1d94d094aa873ab54", - "363da3cf4c6da476c3b9e8bc1e54a6e0cbe7c3e5d27713e4c4cb5b6335b7e04d", - "71ee0bf5b2380c292972566946d9db1809832b4bde561d2071aae8df07d8f8fd", - "a4c90f5007d9fafef08efeafe8582334376a02b19d34f7fa78cc75a809efe6cc", - "d326029e3c686706eca2b12717ea4c7bf80abc540aad8545cb62ddcb4cc4dfbc", - "e182f1bb7d41153b507eb8d9df833b3cf36b9373e1273d08c5da1200f7c92690", - "7c52734ce4211f3ed85e6f09284f78511aa3db2de6ff3045ddec162f6765b0e8", - "0c5af2d36013f64fec530ba0558a40ef712795a0b1a06afbdac192c683b58155", - "b12504b36bb9d25039719a339e8095555e8ebf6793a2bc48ef86a34d1e492746", - "c763cacfb16e770d53c60828a82cf25d251c9e5f98590d5537ac19325c915ece", - "fb036e7eaa1489b49ad01b40bf5c294b3864c8fae6a44e21b4a80af6f2bd3f13", - "c1a4546f73c5465ae170755e2901a762c0c53a383319c7977b0d367d15f261c5", - "3c36baf9fd9db59dd8bc444d1968141fc8ea8722cbeae28a5c2ce3a0dd939f2d", - "d3e9ece0788a10672edb3f23b01a3b2ce775b1a5f84a61385d4457842a7883e9", - "cb40ec18cc1f724606b5bd4bcfeac99803d5667f96e8ccc2c7ba81b0976368c1", - "b8a9b2e561f860b9a3f58358faa7af6f628cee3dc42821f354547c4461f3dcba", - "76acf47c3a272315cf81f00880bc2bf97698a0ee911732c806ae3a3bfd312aaa", - "e054b6cae1945bdafc10d9d862c4b043e10777991c41ad4e737e6bf0e4da5472", - "b7913b3efa166ffe108e06d6979b236179e344b3149f5a37aae13d73ada971ec", - "5eac6fb492c8c2f580f10f5711639a7dd5f4f84a1df412763252539f4fca5d34", - "7e8393ab06db0b9da1d271b27fb9ed383d1bda15d51698970d3d8d8f04645b71", - "aa5f7b7c7a2ff12c4f6abf25cb2c413531516ceb868a8eacb1249941aac77c67", - "8b8c4737c0eda6f10323991676aba9f67fc84df83da0d0ca40455f2fff369b4e", - "10f630bb0cb4e77ea85172351c566d5ea3bc86e87903b91a560e759f48980a5e", - "2aa46849bf0048ef9bd107c72278f43aac18d753b3f814c79c4ab67b0eee96df", - "d21f1dd49df3af94799fa3366f874cce587640d20b87da003da6f53104d61f89", - "3c1a8960392109068f86c6b0a94ba7964b2e9e53719b8b22907ddf1229994df1", - "228a7cc45113bb79c74ebf4049e34083cdde9a5fe39f1a8e57f16078aa246aa2", - "bddde0854b0996326c5e21763dce1edc7ec59637b7ea9fa639e1c423374e1ee9", - "c5a73b07c6651d1fbc55744da30ea8b0866d01e3ca343560f35274a0d683daeb", - "97a4845a98785bd8dfb35d183e751e27e84886c876caa18cb7aab94fed3bbddb", - "465a8123e674f7851a43857c6523a06686ab9a23ad80aac1b11e673df329ace1", - "a229eb47c37472cab01b2b7306424279e7f5d36669d8fd3052da266449666a33", - "92115d18b168c93437e3ee842eed8b5f6f784214da80a3124754da0ea9dc3047", - "923616ce835189fd1113b23ccc64ae8c58077e98e10c7ecdd8b6099ddacbd7fd", - "7fb929e9f099d49fd281959849708121d242494acdee0ecab5a9318cb92cb2d5", - "4c44f373f72e902edb77c7f0daec4b0b753a777f41bac14d41782c3bbec04db1", - "464dc0a48bef96225ced715c447de94fd0411c883314bc92c949dac153a4ca6c", - "b5dc312d260089f56f51c38f5983e13620b22bcafdc75e7424e6ec9f69d404fb", - "950efd20f2e98f5e9458558e760e64a52461cc6715fca46c6467bfd382075db4", - "a29adba52fce6029650d148db7f48271ce28a641289c558c01ace9724e49263a", - "836a02e2eea17546e4ca27aea64ce6ff152cd3fddc7ea0ffe9b13d8eed23a773", - "b3eb880443da54fb715feb49ae96f805dc31afc16b58a18847862b38622aa259", - "ad27207762fc55db5e0d1a40839af192335dc6eeaf4b2ef34142a3bd417b1c97", - "76f589afc3f258b8fb44ba2882510c49a2b6c424e2068a7931333c8181e43966", - "fa372c498adc818b1edee3cee4f4052ab4d476ef5cbe65e206eb5d6b93537a5c", - "514a5b1fd9299f484dc943db2d41641a7831a34b4af163b1dffe08dbfe9b9082", - "1ef4c06f055e41ea038879167bda4a1ae5caa5aa599174ad3713fa2b2e950eec", - "f0656b30bdfcc23e56c6dd5b8b59602ab47081a635cacb208bac41ce34439cfa", - "d0bd7c932cef15c7cfc92417b567b2c9efbc57acbf80a6ff4b2fd1edfadbc764", - "5ff4ae54f5fafd8d12597effd5519af87058b3f6505d41fd144965d638b3a70a", - "135e9cfb3885fc2f0b54f9a7e70d6ed0d26cdeff1f2262bcf42226dacbb63c23", - "bcafe2544ff78e26d3d6bc7cdf6f838c70715ce77173941d56bf9998cd39383a", - "243997bdc564eaec1905453ef7e96edec8982fefa04bfaafa122bef363b65ec2", - "bd2ed3ac8a756386dd0f5a2b394e43bf3fcdb62fd09209be2a1023cefd1c7fd8", - "4bcf8c2feb369388e563f5492920ab3b3b4593ab05c9e690bfa3f31b02fa4a09", - "2a753a6ca20126eed603bf6b90a01c6ad83f29e374115fbab8b2430ec96d1e4c", - "0836c42ab4b6ea9c1a3944c7bb274918a095daf93d152ffcd22c9ac9ab27c15f", - "2991789b52ff60659be234c3cb90ddafc019dd85803bf51fce10580401253cad", - "ab09431f105689551915958df61515e3fd375c5959bad9f245e5b90cb198e52f", - "14148d0d3a02eed40824ae1e9a627835285d273f83a6c461400d5c490b20c887", - "16b8b6ba1670423e985ea116baf0aed024bc7fcb70045cf9d5c3d4eb6db11e9a", - "bffd2db2b50cbef66230e5b7cfa8ecce928e8398018eea5cb8e84fcd50bd262a", - "a92e82747c327698f7a32e0484736e4f559ceedbee892cec817fffd5b72cb366", - "3daad3fe1077c7be2c299a48e1109b03da7e16d9f5dc51f221cc5d0ed9c7421b", - "04b00d3fa67ee7b20d276ed803b36811f885b621285163ffc97292ef4b36ea9d", - "235d162567deec532686ad03c67e8ab764c0c4eec15f99729bc5bbefd2d1c96b", - "ae02741eede27bacae4cba845f497d9d5e544b0ded39d0b6c5721e1aadbd4ecc", - "f172cb74469f0e7aae04b4136e7b1882f1854209cb0e08c9819907953809b57e", - "f9692b45ba6c45801b0cd42c4f1ab05f46a31cafd3e091cfd288cf1ca5baee2f", - "f4b649d3361ec7db9c19bd0c38501ee147546b7dfbc85606041cfac86449557b", - "34a83c644ca64df3619181bda9f2188d3aa938d10ddcf50e1fe845d8a9d555b9", - "38568dddf6e994d563a1544cf657993f6ed4782bdb08ee5864186db295325906", - "2201cebb91b42b21aebb10848ae4dc68c313823c22f437e10cd3588f5764264b", - "596e3cfc4178b8d7bf82c3dc8487282771d5bbe18424e798c1100181c31dff1d", - "5fa72dd2fa48dbc04cd7bf0e43f65a9237f198d4a6fc0204ee959824f1b5f3ff", - "dc7b714c10b662dcf6d2a53cc2a35918c4c1808b63e7953a61541436f044c707", - "107dfa0be2cdcdb5c9571c107fb2446db04a1f9f512deff482d70a55c03983aa", - "ff3f1ddc9a1f160523f11a4e8e944b28e92cc33a5ae79c9a52c5d9dcd1697d50", - "aa0075bf039aa9de57b0b92fc21f3946402c5d6f8f86b79f37367c2de00168a6", - "936a7681447926e62c60db3341a414c0c50b98f6aa8486dd964f96b866f4ec20", - "5d178cd256dca3975d57b0f1ff83a63443604b878b900b39a8f7be5cd59a9314", - "ecacdf4c283d3bfe7203b8d78ccf66a31e63f28577d563afd9c1d6a63e27ca5c", - "f0a7c291379a89f9510ee40d71836954d9192688a7d8ecedddc33a771d4cead5", - "9d6016b795f0dc8325e32934210441e4698c5e596eebff05b53efbd2b25eed09", - "2937e9de8ae29eb982bb243e2d86462dbb4133cc71fa7a94c7b1c299fb5f8d57", - "53a6d3345e5d1525e5a17cf73a2b39af121829b55a72e043fa4811eac20e4f8b", - "7c8d83e3018684e8d37470dd3141614942970a3e802e9da3136ad6723bd19177", - "bcdfe19c0daa6629abc6d0d2d795527df39a66f23707b633964af75041db24f1", - "5ed8e1445d84415c71217ef3c6382d27fb47687cfb9014ebbbd557eff996b19a", - "4c352230108d4f493655dbf01b16693b7dc387dc6c76b09e918524ca0fca7907", - "f1b7b74c0bba521d440b970dd632c8c53ace9b673a2b95fbec99ea59c11aef68", - "eeb2c5cdf8b0531deebaa741e14f360f5d565e17369396d3940f7d9917127786", - "1aa9a6f55c0b747063fd60dd3d0ed00deb13919f361edcbd5c492b718a73a600", - "aa53044c61c06ce8bca13b24962da62bb09e5c23886e1150350a419237ad9a2b", - "37f66d069216797d02c14b30db1df466edc0ebf0d6c57dcbafccc7ac01290f1c", - "0aa860ebc01c32f4a93e7c6b0c99c04d58c1da68fa1dc85f50dcbd0fe969f58c", - "61fa339291a0dd8949d490742c94679614ecccbaac105cc5d6e74472abbc9962", - "c0f750adf2b04c3758224fe5f16b72877b476a1e14d105d0f682e206f4986f45", - "0a64203812cf84316e71763254eed3b3522a70afd598607e7e4cc0174a4015b3", - "dcad0490ec44c5d672414f3e83048c53e64a1cfb5f6a200f27ab2067cd23a460", - "bb91576ebf99378141f5f33190dfc4cb5da77bb3eae61c6307f765a1569cd99b", - "f4008531950d2f020f1ce847db5aa806b0467a9f0aef089479b098f04b87f1ab", - "ebfbfccf729fe8c3f419b60898d7fb271122e1eb7ffccf3ed4dcc779230e11e6", - "06799ed498711eab9c53ef00d726e38535cad2cf3c590729cbc7a784abba487a", - "e33ecb0e25f1644311537e7e4fc75de8c43cc5b9bdc93ca4cdb92e8fd978d645", - "e806e4bc27067c881b273562bde7bc7a9fdb1c092c62447a260e37006149b0e8", - "bf66373e735b3a34e7d74e7dd531bd1f75f389b566e66856b82dbcefe2feb7ea", - "eb82cc52e8f353e87e39a80f828f6ce897cae6eb0cc68c80b820dc9cf96f2f7b", - "74700da0d8dbcebc42a8518fc8ab97a22b3075ee487bdbb3d227cb7300d77813", - "7f64fcdf40941c8404dcc88a78ccad2500de502ca0419d1bb02e9439c0191b55", - "405454fd809ad873a00e5786a777559cf20cf144c189922d5d84fe3944b2cf45", - "c2c7ba32d42f77d923319fb0315af1aa07e32dce56e281cc412cfccae5399729", - "4453ee034f4e874e7c6d85e29f68a2da805712971981a5c5d90cb7016eb1a3b7", - "56898598705b834f8db546e1ddca6f4bbcfa5a287e37012360dda726d11fe85f", - "d75367bde8b841c16fae610c40a6eca035f0775b1e29ce55d5b108c2e1f6ed72", - "5ce8bc584a2c352aef34eb581d3d0d78316cfdf43a09454fdfb4d9b8ccf353f8", - "e94d1e06cc51969ce2cf4a653e45e1b583d7727e308c0b87cba1ec40d5660c21", - "dd51a63d640b1ed0ecdf0fed81cb695531a421b0ffe983f9c2c491743c73d789", - "7e1304bf15628cd93e03112607263fa3bc9d5b77ae1ab5c7f32f8575eca67b89", - "69f7c1a5a08a6504a4e5a4c7d2bd3494baba5ddbe4b338714445cdf0fdb6d348", - "0ebbdb5c3b1d40d5fb742629179ed8da9b2d32bb34a1f6f8632c460f954e7d7b", - "98bd7b48d2b95113554dc69d8f6a0cc029deee7363f33bf34cec43fda7aeb155", - "20f63b28253be626672c4351fefc013a732ab13155b65889c5a4c764df626133", - "5bb964dbbac4942fb156f955426f7df78236332aefe8ca5d9c8b0ba459364ec2", - "e38342c35089944b7d0c67cfc8b0a738cbeabd144f454605284367bc3617ac65", - "c90d1422942eff41165e942f63e052bc74d1f3ae76d73ee60062cb3ce352c4d7", - "7bbe8caedd24a203a6108400de5e64c86677dd70fdaf580770685bba7e00f6d1", - "73ce38167e9224702e692b705faae3fa06fc41aef7e7914e2e2c7d1bd6574ffb", - "0f2a4068ca07128e99567f74b00b69e0853494a27e606bacbf2331a48de2b501", - "5a50c088446361c1db239231f69fe853a3ded74eb5666c4c759af237b4e4a747", - "eb7fbefc22808a5e15193cfd51ed1276782fb8caa349c99dcbeab00a41447249", - "03fde60888ca1de90247c6a7d8207187af72d720b6fc40914f5fe4e2ed036280", - "ff9dd95b834a3c1067c44a659dcfdfecaae8e7ebbddbd701cb6f45cd04604159", - "c38c2027d23f0104d2ee64ca05777189c78baf14a45244faf22ed1442e90561d", - "18c52baa63e799a8702f4c526a937155c3e7980514475422c48df5130ad9c589", - "d2f908b14bcd69c02b2b0750dacd453753209992085cb65f40574777bb5d1565", - "afdf2bc87a7e352417f7889b3514cdc5d7c18a68394dfd6ac55cff9be33b5181", - "623d95202d90dc857625a9ce95edf282884c2dad178792181d340978349d0913", - "8cfb363f14949cd6fdfb0785f2dacd614799b19e601e2e00e904b568b5736ded", - "67fa22b9fc35e01d2fea2ac88e36dd7a23ca5e3309ce286f49e61d40fa9a8040", - "223e3fa89f69f6ad088c29e701ca2bbd18c097917eae3bda8191e149c67910f2", - "a4a3a4d4c2d5fa355ac701f77c49b3934a5511969b30d2f6288eddd067ec368f", - "eb0e568a06d43f93e27fdb50813658ab064a0d2c4211068c4243f9526dcdc4fc", - "f142a69ba861106affc3a21bdf3414791fa1d6eb290c08ccc66e5fc7e3ecbb06", - "ef9d616a94dcd324e89edf1cce72b11fb8e55b8e6c0d342c519d96138b5fb99b", - "265ee079d50097338abbcecdab02a229351554e8f8ab9373634522f25562b15f", - "762ce5fd44f30b3d204f9adb4a592cc91cf29adc881ad44d7f010ae7ebf7a332", - "5348c6f3edc53628874375e1713cded2c43d75ad97715b5e048d22d6015c2a01", - "9fc2082ddc2f9cd2ed4f96d6a0f7b725fc12c7ab182fbc18f5df252aea3c61b9", - "91082632c2603673228ff4c3804e0e728f80d630b51877fc6c437befffbdae1b", - "4d20e72c47c0d2cf2d3648f46f17b3fbbe6b53783477a0ff8db5b6d6a414f51f", - "f7b3aa9b9fbd34905b0d7a6c380cef53b8744f7c398e32cd27e1db6ecdfc67c0", - "e87c8869446a5102b5046f34d4b7293732ca5befeca14d9eccf68f4e4c9fe507", - "3fbc2ec5c740bc90ea3fd491110560c5e7e5633544f9a0fd1aefa8244920cf52", - "539efae676db0133f34aa570c56c364de2ece4e9bbd1b4fe9166f92085e45698", - "2e56c41e4eef52924c779671e9bfbaa39950f4bf863ff14cac5b82065c76f0d0", - "aed95a7431ec3cc0d3db3cb03ddd7d8277ee3bd55ac9b74a47a8467a899c4b58", - "3984ce6a886fde94f002bd0e82df07a6659660e7ec7ce21e58880d42ed0041ae", - "d8530e53d82d8a5e2c61d657782fd3f62de121a5a6bd37fff2d72bcfd44657a1", - "adfbb766fb75c789e17dc787a0834cb4491b63fe395b6ac0cd894bf220d72e28", - "b41f9efe448ee2acd7ba66f318284b0dc7ab6622f7e94956e2a12da339430b94", - "2ef4570340090b3b92cfcd22db83dd2925baefaf9645f669141d642444b9da67", - "5af2145ad99b5a3546ceecacfc133290819c178c656960e31395a975b223b241", - "f68a8c99fbb40e6c0b351dc0039c145374220393d2f28d0ecee3f732720f47df", - "362470a9998eafadbeab02f7b08a2519d2e9adebc5d7b34cfb187063b7230618", - "8cd3b6b03ede7e8b0911a7ee5fcdf2f8cede96d396b3a930eb77149451488068", - "52894134f47c8c67efb3e4dfae8bcf285a7dc87e410733bb7da25a02cd9eaa46", - "f4586a6f6c546327dd58eea1e3f2c7971830d2bb4621bcacffc19941706d0895", - "5137fa9789c59e98410a06d138fa0288f0cb2eddf3067a4aca349271a1491612", - "c12e5572edacac4b0aedcfe2a67564fefc7d3cfd5fd16a2f8d4080854afcdb79", - "2dc6575f3d856fe362e28b7498e8afcad227e82086c1ae25bb7d07dca0fb3130", - "7c13069da7166256b72694ae7ad2c45b00aa5421c35039b163d89021a7e44438", - "fc790110bc961460b9994ff6c6d4243392438428c1e7e79fa36f0099a93fb690", - "866085431334c18356733195979772f1790631927f32585910c7265bba2d6b02", - "77bfb3669082f0a4a3cbb42e660f8de4b378b9bdb5e2f940cf14e0cf2dd84191", - "0565c1fd6a202b85f64aeb99e6f1f92d708fabd73a4959b747d7fd425462ad11", - "b73271425fd348cef5a61a7ce405f030fbdca1453abbf83bbc5fff0e78a5e828", - "93a41b55ff748bb7dda77c1cac5b7c82857fcc9d3d7070b7088908f5109dab6a", - "269a114e30dad047b2888585185ac1568102ba001caef976a35e23266e17ac40", - "9fe3ecd54cfd8262d1f3e6e07389300a84308e11fc0acbdce1f71e678a2353ce", - "d67f13e7161dce0f25900451643e8a614f1d894dba5cd682787d707972f7c91f", - "1c6fe9e6838a8bd58dfd459b32dd05366f9b9734f8b7bb6a27e9112e6ec615e2", - "456c5897086e17bff6d410ff4316c581f494980af7f54f8c01e0d7c883b7f2ca", - "0fea2d1f6421a574869daefd1a48f7c694eaf4c732fbb0f76a5bd834777e6cdc", - "e86c7e24a24b627b325fb9a4b412e0548d4aef808141b483f11555be621531e1", - "b1ad2e0d054b3fc85f2c7d64b1f354e0f6d010db8a9905aec3b7a7e85bf0843c", - "a19b5af43881a813a7197589659e38b4fd5a0664366c9b7d29103c1db9806f3e", - "503d6df82ea398133f627e47b3a4847e3966ae4596a0539546b78fc4d97f76b7", - "4879cfb4878b7b56447035c679e38be488709f8f423d1c6de80f36064f052ca0", - "456bc262e43ecc0239c9f8efa4a22b69109e2a9b14f50a8e3659a9b2163f7a39", - "a8bc599b65016c1892dab0d6dc4ced966352da65e90c9e12cfc13d8824e41c82", - "7af598b0f115c1c97fdaa3f79d1b6968b58150804a5b299d9367db8ecf52ff28", - "95d350146a6e7df72d0dd9f76d7be538ab55b64b9c2f4d11e6858232fe501351", - "7fe03977a0aea552f15d7867ee55f906ea8e19197bd53c17625e95b438d622a1", - "6e9464559f70fa5573d7233732ccc32ed673e55d286d2728bafc67cd05910c53", - "4b2346c70ce36bc8fe655d8f74a25a235889b8ed094e1c4fed75edaab3057e82", - "86efab983bbce878bb60d3b13d2e02a44ec35b71c5681ea212ea89c480da3d38", - "9e19fa1f8a3178215717cf7dc5496ece9cd6b118942c93d5a2af135811ee7db8", - "84ea2d7fc6427c2dbccf2ec02c97b498e72ee5c532ef97ac95c9ca3092ebab6e", - "0c0630548cad8809296c7fdfb6d9c95db04eeb82cd2feb2d589fb03ba564fee5", - "4bd1f6159bef75e832723ab1dd6be976dc1c48502ed417e9983d97d7642578d8", - "124f1ac154956154ab1537cb2de0c66352348784bc41a861bbc44dfc122540b9", - "e0ae169f3599df3c898c5defac348cf37b51ccb6d1b70ff3fc197777e0e476fc", - "9ef3c10f432017ada5ae715d73465b60bafd32af340c8cb81d76231a2a1170da", - "ee220cd76cff925811729cdc8e1f9676fef397a76cea658011de4914b8d8e9c1", - "f03add05f7bd2826aaaa4d75fbf2bfdf506f546f6fadcdb8ab1e81f987f1450a", - "c185a831b0fbce1c7561e4505be21e097077bf7b2a70506279c7980c4f94bb2e", - "93b5aca1cd2c1325122520ed1055d0be580f4150cc85422dacbd133b9be21a1d", - "9acef03ef404fca6181bcd138c5771bedc4fb82036301fcbf7e9419a426eea33", - "8da6a1464199c01c47345f0d04ee51a0a19030380eb6f262f8c11fd2d737cd0c", - "908b909cdeffeb1b9cd015e9e8afbfe2270d06ee3bf4a300b7401fc540d2660d", - "a5583a98adda4e20c05fd1f0a06564afe72c7ca1f28df553e9c1d291041f9908", - "0b5edaebcfbb63d9660e118cc8fa2c6b78b90a8995e3b7cdfe8262c6dfa46820", - "5fdb2db02c34e2bfca7c235862830a0348726695068f01704b9bbb950580c757", - "19a62f1e025287a64a858c27052bcd5b404d2e6e0a61ee9245592fd8698f8100", - "9ae2bc443c2ca924c3eb01a28d01976fa06edc57678be869613aefbd0884efbc", - "5f7481a92a98e4095bea4f1a50d2a68e88f1779cbddd2326360bab984b6396b7", - "e02c74dcf4d07185adb1365c3246ed37edf6e5aa9bdb28196ebcf533d53a31f5", - "fc63f6976c2cfc82dac6041f7821ed7395e1bca7add5757ce6f8dffa5f07653e", - "52a65e1fc47120bc14f487bffc92332def7f9d9da2f4f72d58822806e6b65c07", - "176c22e6453ac6a94e3da8902a3d3933b785881ce803cbf141f0f76d238ec667", - "287da297f7cb9c148a1f6f4f704dcb1dbb6b7dbae5801bf0acd1aae0c412e6f4", - "dcec8234f8e0a6fd4eadb8ee2d883397ae6ad444422517a9c819d4eae4906625", - "42ab303b54187b1017c6f0da4764528282b45b26f5e4a8536a9a0fc7f383cf67", - "b6f7d82416dec93b9bb2e268979a286b65d6f45088f96c8205404e4f15e7b568", - "49df218c49997eb0bc964246aa8bad8540e788e8c391d1396330223dd3320e6f", - "de31dddab9dbb3ae0e9d398152e604b080360274339335b50c73a2caffd9622b", - "33b320aa0cd01db1df733316266338c73499968e88df14370187f10d8d1387ea", - "8c98af8444e694f3ef53c0f9464db51204f2a36804d591331690561b2a180100", - "41f9b0fbc8e18ad1fbf16a4ddd7b1482d97edfde14bf6da89681c4e3d28375f6", - "1d96c81935862c7e675a8ee67cb4d010f26edcaa00d7ee7ff4f4fab51c2c1973", - "083b02a972d9d73260d2ff27750d8153f8cdac8eed0e4262b7f8977b4a9bc76e", - "9bef7ed955428140fa5e852a2e8eae8e3ea018a00b7a31a204e9dd9d9d1ab964", - "b5370504e5f48381c39fc051e41574a822a65c977747882c021bd5646f910709", - "bb9fbbba60b72972b9ad388f424318b6971c45bb53470bd24ec13531edaf2bfd", - "db8d30ebf54e52f6db2d83501976db249052ade22edef92fcc5ca7900ed1eff3", - "19d6c52de20910090086d1d318217995dbd7b52cd648f94a8fa8a0ca75e1c8e9", - "4bf55f05248d07f00cf35212539b4c2cb3f9c50f3bfe2a0d6a46369a2ba3d28a", - "27c8fb7f16201d2a94243245d3b67c336040ba9b53aa5aa8d42b605d71c44725", - "f455fb1edf0b3eb2975e9632189f6b0c87ea8f0428d826ae3ac7120f96f1d863", - "639faf4f5e5d7af3297f633e837e2c62ec87e95dd1ef5a825dba4002418a6ab9", - "5ffac343c89cbb14ecdfbf0450c692ebf545c7201841c6aae7087dcf477ad2af", - "b17cdccdf30daa3eabac75a57c35dbb30bd2e876aff7190fa0421e5210bceb11", - "02b73b91fd769836845f1657d575be83169ab955e2d58a88f9a316539cda61d0", - "1cd15dcd2cc025f042c679c9740b878e7c3aa96bdd2ae344ff7a60fd9ddf9211", - "ab74debfa8a569dee32fbec2ada4d9bd1fb9a69e9fae99b5cea36e596bc80fd1", - "b077066b17764fc002b8eed28657c991d611945b4d3eb0687ee1ff9916e05836", - "79f79732f6793702136b099686b0b66934b61bc74d0c4259b033985e6126f10d", - "4b503daad8e17fc96d3fdef16f1b394f217d3406b5178199e67c8075f4abe2e3", - "7970e5fb300cfe5a2f299e0ca1052590000f90ec8c4642f757144f2b92913349", - "b892dc3e4c78d643b21d4806c4cf3b673322af6c2be626198628d9b2c4799c54", - "64c406e3649143e712fe27090dc3ca20184eccfcc496368ccdee916442534942", - "46dc39707ce45f8e8c8324a067494fab6abcbdbcc5ac055ff550e26524bc2c8a", - "dd6721112fba5dd2247ea23bf78c8ca3c2711df1bdeb5bfb5412e7f9dc0d266e", - "efd0b45ef1071300da0a775ef9f52bc8c6a664c908a929c3a1de2e82c29ff4ad", - "9e01c20bb1b8be429870532086b60145998c29f21fd8a2eb834e410ad9dbede8", - "503103d778212857acbba9299dc5c0229f0b5fda96b093b717fdd028aaeec006", - "983503d1e383d6a114fe6df5a2ee2e5987f32511c4561eb6f6a7969a1ddb1a1e", - "65549510529123c1890963bf26df1bc13e09fea4549b936f301ffe8e7779d477", - "c0a3fdfaa07118aedb36a6d126c77a46d569f9935f48091df0f18ee23e37dfc8", - "5576f569b5863366153a3dfa4188230908c4ea3cd9753827c5dd02b2aa7f03ce", - "fc582fd90232c3c864697b3269a0151e3ba20f30e79ac7be33d8574898ec897b", - "2fb3ed592fb34ef8533bac20fa968631cbce9f5dba4564a0f4e46474332b1ac9", - "61706c299c5d5f8535c5b1db21d73f011037ad9f988c141c191d520d9813ace7", - "f31d2d96fcd3745d09cc1d35c819fd6d535c945dfd83e44a00d1d3b11cbece73", - "107f050537667b8f463effabdda0353fa471359859c01fb7c2d7b2f4010f46cd", - "34a6c2478b774fe436e8d3011d6d591cb2c7f9441b8aea519ec7614803131b41", - "e599a53cfa2a59b436820a5a7c57641cb83c20cd00c6ac16de2fac435d4ca77c", - "84e2064c33ebf123960771b2e29f4dcd580421732af3de2e093caf444b3d10a8", - "6b828605c7bef5c44dd9e4cebcc6baf58cff86581d9b5e04b2e963a62a9068e0", - "f1bde7b884e53f09c13220168523e7cdfca30d424813a659c18956e9ebf1e017", - "d32ef4142500fdaa3b046f979d77d150dff586be64960415fdf90c1b6befe901", - "51ad3f97509d17a22b5c67f6966e05fe74ae32e3594cb5edd2b989b4be9f1fbe", - "13c11efea150407183f26657c0a4e5b06d3ded5f1717253a562b070ddcff4296", - "e57e7b1d93083d1b01ecab41df8090b95a5d3af9e84da947854af5671eeec1eb", - "2524e9f91dbe99343ad2ab49554cd93c70d8c2f5b19995078740f4018737cc44", - "e5b3909ec17af5581ac75099bd6dbbf2dee60de515985fe5988d44229d7f6ea8", - "58d292f5c67801674350f058400eeb6c7c22f9f8a3be99b0785c2d1736f9780d", - "8c3dbbbc5f7461846c46f1b4e2efc69fae9c10be3a1545c1ffb4bcbdf6808cc6", - "5143458fc1bd55706793115e167c882b3bded59d125dd6347e7b0d41a6e0b67d", - "4ea7eb60a5930e9c3c44ed07ce4a38e6968221b251ef13fb7e22a9a225841990", - "84c73aa824d84ff804e942541e2043314ba6abefc153804e97f5fccffd0a6057", - "ea6b32def1d07d03b4059891a15c975b5b2cffbad9a51253ac40cf8d0e76548d", - "65b8d16824b06e8e2439ce7e00dd551114f27642242a38172a6ec5af158d6b2b", - "47ed41f355c66d35c55fb79b007fa171b6d252c0170f3200585f0a64e6385ac9", - "dae73391396570f1051073217f86e599d561799770d56467b6c4335ea567d92e", - "b4ce6ae3ff7f2df5dbe5cd64e9be23d6518a423d81a39c869ebaef6bdbc1d6a2", - "d9e00ec07fa56d48e083ae9ba0f1d3e1207b0aabc9ad2739f2e7e1968849882e", - "5cfcd32745e265873aefb220055a222858a737a87addb51cc200a0be5be473fc", - "b556b3babb91c7fd45e8225254955f82e5cc9565429ab15408be9bfff3c0855c", - "d58a93a5f4fa3c38ef1d3d1cc400883bb721cfda9fa9e73920c845dccef7c7a2", - "0833462836afcc5eaa685576215bfe73d253f967143e13a4e30b6763126bafa1", - "26de1f1df0f8ea674e460180a5ade4f087b036264a5aa918051866b4e6ba83fe", - "e54653b862fb866fa4225fd4d32c27d6dd622506360ae6160b92ae1a7853f793", - "fc7c2797a06335a3f594aaa3d91ab0d0b1a8c043f65bd58311da659a804dd64e", - "1af8d0d4323817afe309166790264abb40eb8bee691e70992ce0d8f53b4e1e04", - "f8d651d15dc293271b54a1052651d627f98db561222a779fe9af68672a7c3999", - "4b8294388a3a04da9d7ed6ba4674ab24cf9e67d1cec19e6a02be798fba47b4d8", - "a3d0876565a3472d0c963cb020b5997bd61d8dd2136c569feb784a49f18d6cda", - "5dfe58f2657c404d4fce967037850ec9337d536e79c1ccce54bda73e0c4321fd", - "783ab9d8b9740d200ab9f907c4fae753949297831f17b11d4298978543cbf736", - "2c8852c1db76a18ad0126f76d3f83d4eab03d72f39b1e0ed589fd2ce9d9fed22", - "483ccdb8dc4765a023e5d5effb428ffb90adae9210a6e0713fa65b079d7a8d32", - "d96976623a1bc48a578193501175bf56af42213d2e07e5bc742c5c7994e28290", - "a8ff1c0ff4ed39ad0a0cb25442d4bef81004e89242f9bcc67121874af0f6e51f", - "f39d6a2236d3705053ab28cd06f6d902af49f19e629711d20873751a4b916143", - "dfc0a1fa5bae6efe61f1bc6b2b906a2081fe646bc8efcd5578960f40f29fb472", - "5fe666afc8b34939ac2aceea2c72326c449c61fb63c7997fbc68f91145b41273", - "cef3da26a64fce07304cd70d766b62ef7094e690c5eff3445bf0ba97a364555f", - "83180158be8b08af94b49907befa25f665b2623255f79a16f72a9724d9c68bc6", - "43e72efcdca536e20818812cd3b7fd02892182e9eec0456c3a9dad6d3ed17d98", - "8bd63b8d0548950ac9161e89d7ee21ca7ddb559fb946026b8c445a7dd9904f13", - "875cbcf7eebf515cde2fa090017cb851a66719c456635994183ca3ec45b7150a", - "8026ab09c6ecb00f0c5988a5fb93dc35963f0b02667a7385a5af25c76e0abf4b", - "897581b9745ed637dedfd77d47e362d7c205f942501bec0bda9326816d56f28a", - "c6ded61857373c1f3c9ad9749b2d8ff73b89659fdf78ce33d83cad66cf672866", - "99808c5c10c48009c2fa8299599895373257c13e0e3f0ea7302601a3a70b9845", - "d539c5cee9d1b91cb329445a9bbd79e3fd23dd3a54c7175ae8b871bc66fefc47", - "052c36a7324eac808bd717c1745bd9ebe6a4e90044ed71149d1474148ecd6e22", - "cf287678ce01c65d3684adb9580e87a407b5d21596261bf6f2ee64abeb07bace", - "54e1d1b4a5db3fc2e7048ac87c1bf76ab3ba9c7575356cbb1f097fceb4765fce", - "66546b992867b9502d111fdc6a555bc656a9fa2732bbe516dd85bfff252beda8", - "be7d6efa2d1d1e6ba0f2feb86868f910c68f521be15db3ae06ec9eb4f1f348b7", - "6dd783c3c2c358950dc79c5e86955fb3f441abf94c3860aae3baf09d8823feb4", - "afbaa0a24823017803ff0f7872371798ab9f72619c5384decd21d20e063c33dc", - "c7678379b9c3ff4de61fd36e9c0ce1974778bfe6fa663a02d48a732e696771c5", - "cfb31ebcd17243faf397dfff65ace84fd7122c41430e2149c6c949ba8df34e6b", - "dec139ad632e66a4758592fb0a1d990887c7d295597ee684d709187a141d0558", - "0d8f6f024f5b199353f34d1d63e9a8e9466e09da3716f72f49aa99383edd4128", - "60eb3ba78e3245fae6091b0dc36b102902e95b9f2d99b3dbbbbfecb98d900841", - "c41afcba30ea79a6d16409c74c515192cf7ac95233a59143abaa5138d33def91", - "2a4dee3de0fca7f9debed8f8019e751b5a6a0003920dfbe0c04a112405475bcc", - "d1399768c95a25a272f89783a844ffcffc15c8fa1d8d3b4961649172677dce73", - "e085b268d83ae8c5929be6fa4924edb84d8f04732662790b824c47acabddcb7b", - "d9260d2c59a3ffba20bcf4a5324030481fd743d1e35d9529ff243e69f731bb93", - "41d600011b42ac39428896b29c74758fd564336c089665b67410ee9b42bb81ce", - "33faacf7a0b4068151638f5e054c6508f6faab60388c0391ca77aaa239896d9b", - "2d2c729dc995133b858bf36891cf1acf760aac7c1047ee28418f3246cb2ce6e3", - "f7cf87a3a50887d1227fdc3a3b92e1e4ee04ac2060cd01cb766c817a05d94e38", - "b3ddc458b8f2692dcc42c76f2bca2618209af53b60739719fd1edcc1e89090d2", - "6a7f2266b8376a388caa3b3c143a4104ff1a5b1087a3f50e8ae513e0302d8f4a", - "d09cec94f75809be78187b40d058f2b73bf7b0afdb6169398ec25825db0c679a", - "fc3572f7927706c3f469e77605cfea4644297eebc9872da3a266d1877253333f", - "a974e9dce56bd56bec5a8d47924b882e7601c9e2aef6d35a114426f19c3a832e", - "3a2af9294369b17cdc677b5ff330ff2db721fa7cd8413eb20f40125200ef9fc3", - "b160cea396578730331c0829023bc53e93e0545b4a4936ab1010413ecdb5320a", - "51cd89df6873f1b5d4a9fc5a01cd4cdd330c037ebbaa31ca7eef06bbea0c0b88", - "3d05d6e0e993165f5079015499c5b45bc897f352b83683f6e14fc0144b439b7a", - "e8531f16a3f33a5a7b285ba07cb0f3c4c3ca278c9c3fbd205e2a7e84d1ea0b19", - "703dc7929a3f99b016d469ecb09f34a8f4833ee78b9ed45ac5da2afa90d9cfe7", - "065c232ea47be4bc897057ff635b243929cd83025c6eba8633c8a78148188354", - "bdd4e7645dd94298c75ffd0f479dd8b4866ad91988447447ec508edc5887f165", - "5e72876cba1f3e8a639561d9c11b034c4bd092bae4e84e6d20bd83d8225c98d2", - "bdf75121d7c7d8b2fb38e3472d2e3bb0682a8bc8988e4e8f65f22d22e8f6d9d0", - "2e5120024b984ac8ecda6e9c5e988519f4ed9ea7ff1ba3415222f9ee6d91f9b7", - "21580bf698a0167b0a300cb66a69e9b29407b6cd23e600c3d697a30599ac0c35", - "fe1e78e6fcd31793af311cadad0a06b0041c946c9db04f5210be486158158bb8", - "d7fb324cf83885f377c8b5d89c6abcf6d4bf3216101b1b63f4f09940ba4ded25", - "0611df14b59d8aca9690c1023703de6bfd95796527981d6fe283a7e8077ce759", - "32ac375e84d5afb2f1deaddf6a57083ad3bba56ca3ef8e189874be5a5892812c", - "f637d5f6b4da9fa7892a36186237cfcad4ddc44f8b4c71af7b52ee1e7f3f9b1c", - "fc6dd3244f1ce6314f1a3f276e028faeff449b808955aefc6de30fd5b8185993", - "9bdddff712923b22410a3777ef5e4e16acfb444eb2a5d58a6cfd05d53ad48cca", - "7dc0b6f1097b4db56c02c04c993f452208e4563ade8e594162b95673c4370a77", - "76664232a3b5f6a91b0f64770590a291347bcb5387c43a768c34fcab994e0b15", - "51990aefad2999da7efed0c77b8df266187c28c2fd37e4e51b15155a6e76a81d", - "963d14041242d7b91e2effd6ff7728fb7c2f5a2d1688cb98f3b904e4a38fc4ba", - "37b220e99853d0c4c1efe29c351491de1d607a36c433f4f6b132efc60a1eea9c", - "a0976e880e21858d86cfb4d8697f2b4d4de0d6a7fc99ae61cd96c2727f09f24b", - "21f484efc59f34e89b081970a6a37b5f63b61be3bf1b1872ba93767fcb5bcf3f", - "15730ad73e9aec5d6f5d7237575a6c5e93018e6bd4489e28d1d60174ff669f72", - "97bd3bf56480996e2b405d603fb1f931950acc05fdb7b250dfedc10fec3891b0", - "7b316ee8d760afb7706a51bbd744774916cf6c0a258d99e3084784f23d3fdf5c", - "0e335f33f0d2ad0ef74c13754bd70ea0052ece13a58165eca16b2344373410d0", - "ecf808d3a6ecc72e767d764e48108ebeca51b69062e8bb2bfea08439b258c7cb", - "f28c6f84c4987103712ba473a45977d80d96ce0285220522fa2257b0375b634c", - "9252b2c477ffea75dfcb8e8b46a79f871ab8bcf96ba8ef6585b411dd99b28e66", - "819cf47ccac7db81ae28b520100bb98dc5c22b86a02f61f4529ce2ae981d37f6", - "ccfdc2f57322121ad2de67cf182909e84a383b2678aeb566b46d9272684d2516", - "4e2ecd1de3b840c8aa7709398aadc6f4cbdaa9834e11e09474f7e290bc8ec656", - "8c12f35596f92cd8d80a5a2ec68deecbdb4dd58794f0600590f4950ca54d5c02", - "dd0c54434f7ec377635244b73e77438dbaf395cf6bde00beb7eee8d1da18bb51", - "fb88539d64506a86874747fa25d5cc295a81debaa53f28603c88f95a160dc733", - "97f11657794b6e18d0e37942e31d378982482483361d8dfc44473c7be27e84a1", - "dbab7200e1767de351751ebe3ddb80b63fb18645c3cb0780d41f4e2b293109bd", - "9ce04febae067b8fb36350bd1952f70daa98fdd24701c1dd5cb4891a8f8e8166", - "5ebb651f054dcce61b09eb7d5c64ddf52b1463f5d9982ebbac64bba4e0700dd9", - "2419f8fbeda2aef45a60969fa58a78d223a4ccb4d5ad96af288e53aecb7d9e39", - "a60b9001e072c78e99060862291d4503db09f462297076a9252b52894b826681", - "028df3b6468058fd17ba783cdb04e082d344928a641f0a529ab5fb4f8c627dc3", - "e83f09b4221c4e6268d16ff928faefa63559cb5e792ed7dbf18ce1d9d2075623", - "e19e4d796604a6b446c165565b971050e7684573b08210dcf734953d8a60d586", - "4030d827a87cca8d954e13e741bcf94388be520a53d03e01e1938f0d7de406fb", - "9f68e0f2311c802762134fba96278acf8aca4a03a92f1ea2baf92fc65d9dab90", - "b3cd71d9d51b5b55df9d55d64a46a0c10a95b422714df793d4a1bac68817da64", - "e7d0fe4d7a67719309ddd251b4dfb18c91b63a828a2427c1d862cbf9be92afee", - "c9240ae86e8e96f60d11aa2646186db9a30e122fb4fc41fc72f4ba3b06b74355", - "91138eef2c834ca6f1eba36fbb8d7ac00d052ca8a0d14a03c648036e94a61b36", - "604ca1d1c2136108f07e47bd163c700ad95d50764c2d84d9853003792c1c6983", - "77409ea413c42f28438c96e74547a97305b3386dd505b9057d8ded787d0e4da1", - "98548789665f2c4a958c649b194b06956f954b61002060d0c29f00e6002e6db2", - "62177bd2c83278f1282667577c4d0998f0bf37f6e845c52d7b688626f2c49673", - "d66114b9413e4b4261c87f27bf8fcd86d22abacb60ad9effe9de1ecf5ce7bf3b", - "6d4ca6705eb8ef1fdd63214794c74a2abd4300646926c6d5889d1af52123f43e", - "bab17cbf835eaf23bf9b1f0d891d5b2a0e6cfb595ced70151e88bda407443dff", - "73c743364e2bb171b90052df45d7ab5acd4869b74c55dbc16dbb53743b4f3acd", - "d54d9fd61329eb9cc72dd4de512779c8d96248be22ab3aa22172094bea23b165", - "7f49865662f3accf8501eab3b6b9184c65d57cbe27e2a5d93012c7a2b9f58277", - "9f3aa3eb30881fb96b8f5dc296f053ff505484c229cc165b6ef8b67738d9ca39", - "dcc37be9e386a6c81ef53e287e7de2289e1d297c8983c92dd2a8978b1757b4ae", - "99114ba9f6ddb4c5206f33742bbde51fb4f052d89c82c8d6885d53b5592c81a0", - "921e34a0f79153834b8a5729e5c12014ebf55ad2a27b5392429ad3b508faf927", - "9b5eff9fbae91eb0f71caa2be574f11e198d0c36e72eb7d694d5f60faff4c4d9", - "78b90c1f6fd4028cf0ee91bc52a9d9ee0bfccad3fbb9ed34025049c6ce1c8451", - "eed7c0fc38e5843f119ecb022adebf768efdb8613d6542c554a7ae7004b4d816", - "a7b0d7f3d2de9f28c1e247016344f3b1dd130110ebb9956955c10ea4c52e10a9", - "ae938c758318cbc54b63dcd5de509e832aa4e240bbe4084ab2743f0069cbb512", - "698d1dbc06fe83e863c43f782c087c51189aa7c23d8982a271869b4943b77b08", - "6c24692c1787e2956ec03970450d2b7bcaab79be27af3db76400c43435e6ed84", - "5fb2114390ccef0263019d67c1ded94ba5d058b3faa55bdc9d5cbf51220005e2", - "7ddf20551d075f987919760f11fa287d63a393c07ec6db1b81c5b26c4acfd0b9", - "278763eee61727bdb0bbb8adca8c6b14e7f22cc20f12456e6fd9d5ac76e6afc4", - "5cd1095709b7729d270c09d20b46a2d301432c15c44d0f516d6bfbe1d938f885", - "293108e187dd7b768bec6aaad03924954db8cf0e79264719aa375c9c58135174", - "7be2d8f821d812b9a98453505f6265c4b58ad35f239325e44c773b86d38212f6", - "1b76cd1d7be5ce05f3d5fcaff65760a4178eeeece2a3c60faff49b53794aefb6", - "57e5f51ca11f62e1fdf68ff248b226227c0cdee560e789b4d15b7ee241eeee32", - "aadfc2f93ebed0ae594287d973e438fda666a1e5d940ef0fad1c3d943e6205d7", - "308084d42f69034474d661bf85b744aad1f9210948289ef327c326a6a28bec32", - "b95acd753a964f5e83f6c7f75455f748cadfc32c40fe2590299e98eae68f0af6", - "26be6d3cdc4d478e6bb2b908010bc5427d3d5ae8eb2295c68578c11c9cdf85a1", - "f20eb6bc93406e6ec8ae7d9fd566d8dbde1ce2a6b62154de967826280fbe802b", - "00fa4084eb0ea83801cfdfae26c3b730e5733997ca0af0962bf296bd5e8a2583", - "f559bdd81df366db398036ff877a2a98da8719d514d9d7e74a7b03cb4055f6b1", - "c9986b445163e1997be4c16d284e1dd2dca051bf243358938373751f3bbcdd9c", - "78e85593adad652f340d52252de5792a3dbf6650af7fcd14f39fb97b7fb0d1d9", - "a2e7a8203fd844f48db66fbacca96a84bee62ade4812d3fd410afcbd5bf202a8", - "9403a6d0fae2c8a1fd473f544d1884552ac5e848796b2dbdcce1bad49accd08d", - "bc4a35818dc2c935b9ce4510196515085fbcf03d64ae712dcf399420e3acfd80", - "bf6463686de70f7821d41ac0b5ef89ac198cae27172795c2c90efbb0f2c0393b", - "154ddff42dc3a920c748c45a411433724a4664c89e9bd5c8901deb16678b1ca1", - "625ac341df73b935145594a9f7beb437ff1d1aa549ab68b77fe243669dd6cc51", - "83a274bac59c9f4ee80e4e9d8f328b348feb43fff92d66fd32d10d938e32039d", - "60d91e6444069e02f5bc2d2d5a79114e8a8cb2f2b925598970451e839f0547f5", - "b67656ca41ae37522110de8121c3deca044910bbfaf348f6ee52542714dd84dc", - "e6656d676aa6ac23ecf85cd99c11fa1aa24238bd05b2bba7d42c963f0e9e7ee2", - "8beafa6dbfdf75c860685293065ec4378ae85cb7cc53749e11b7e7f19c676af4", - "1c3602d0224f06d775d6b82825c8b8fc9e49935f37b6734c48797083e26c5131", - "c70c3d2fa08b9783e681b611a640f462d70ca295da9343d7d65fc73e4b8ef4cf", - "6e782378e634386193265525f5128de4a0bcf41450190981c4e0760ff248fa83", - "5dc6ebbd38f0055e0ab2cc9721cf5079d76b8986835b7caf75f82150e3d3a32e", - "7e05c0846186805dc9db30250bbaeaa286822a95a6d48630fbb702f087a01596", - "a2c259f9adc3962adbb46593c87f22786a24f00baf612232f02d405f5d3d6a73", - "79090c5febd748870e99c0872335456d0f165ccbe137e6fbd083d6b391ce6319", - "9fc4d11a4c3be8fa5f0142dbe8077f05f8eb81aa3b0f2a98144db03019b0c732", - "8ef3e23b07906e7e354eb1faa9bbf8ca8297a57dfd04c7abddd3c27b2ef23ade", - "a378122658af4c04fd09b8b6eb506a9bbadf616a98454fe0e67c3231aad155f9", - "5db13d52d4098291b9a1f3cc40bf5a5e923111cce9ad359dd6670d9f0dd00b09", - "58829649230a99de1de922acab5847ec13edc0b9503b66c0cf3da848d51eed0a", - "c226c220f96ec065cdb8c75495a791db76a5188a03a02665e3477d67ac07ca36", - "ebc7b1e2adf7ca0577b571810b30ff0633fe5d3f86f7e552d566726f6644dfa0", - "b900198908aff10af8cbe7af58e91d476402c8cbeefa981cd1ee4545b926a490", - "aa28ecc74e1e4710e0a894662c9e530e7f96570b642e8dc3cac108543783e748", - "f000ee9497f88d980dca424e96189332818baca300d4e2e13e8df33f6a7bbb73", - "7cc16b097238b01ca335d5c0418ca48ddb4c7b754cd6761c677c360ec784a587", - "1b98ec44858409c98645aa2fc11f6576dad01f46b0ead622387a27e39e1f7add", - "d33f76c24821a87f0cb0832d6cfa091a16327fa3617f76bd20e9b15266f53acc", - "15c1788b42b7609ff47998d0b03886bc095e7e92f239de765bea621102f7146a", - "8b8630358cf53ed2e8442f4f19161f6711fa01d71e4a8a742fe81f423caadc8d", - "f2fa18f024a075bde515e66d1700a98d4eea36e7262dff67902b9ebcff21f0cc", - "a390776508bb405043227ffd326bbef5b6835485fffed240adcfea53a1bc155f", - "63d103f3991babf035ff22842c43c7b44fe9ed786dcf72aff0b28b67e10ce51e", - "b6d54d4d6096504afc3a305aec3cdd9d05026cfd37b1aeab835a96b4dfa241f7", - "40a5f45d702784b1336dcbb6259192f95a1a6117658e69752123c49dba9949ce", - "0ba82b0967386cda76c1088b65f113411e12a280a2c52583bdefc993b56bd7cf", - "3bf164a0e85d7f8e205e89b6e9f77b19d7bbe8198457cca2af52507960396969", - "2ea635f2fbee20c65635b2da2a0a9f7be0be85b6c058041be27f5677a7dcabaa", - "37551a09a6e0b536554d2b572759992024546c7445efd2ac47276df781142014", - "a7596fb6acc999f9f7ebab65b8b44db268ac447350bac1c2d7be3e065a1c4583", - "3739c554f584fd058121d4cf3312e800189269e34bcc49536502bbd7ef623175", - "fcc2922ede19549a065996862e8828282da78fe512d06913980fedd1429d60b5", - "bd3c3ecd3355dc4e83ac6d85e7abf670f7c16ae0854a726a9f29af98ed1c50bb", - "eed8891a972a2e96bc8f2d9be7e41bbb8e480f98726c45bd4dcf20eb28b259fa", - "80c3581b3a06e0a30d99776ef465ebb5e7fd3dfd66c6d45627a15e35b582e569", - "0a8bf930b84be0d683e24abc6124f567f4e978c2750c15a9233d86e4be574c24", - "b65aa73ff75f9b08e985ea7c94005b4f520eff48cb375959c6842bfa397b4dc3", - "50e1b5fc85bafdb82cc9e1624d48b7bb3048a4e9f689db1335da771afd7e91d5", - "15fea05813dd0d4a9e0a5ab35853965b689c2de020d9a70747d5e4d2d82b5c17", - "b1959c28f1925aca6e084d3d8f4a12aef6c9a3132a03cd89222662f0649ab571", - "c4856a656f7418f552b3d091f80987bb759c7c2627276f804f82c498093a6288", - "051377fcee877043929a4327c23e876a7ac1ad2ebf376117dc677e442df48fe8", - "0d0a7db2fca5a20e806c0ae30ac075b1dabefe75c5084e625bb6d67ed27c37be", - "85b07c30ab63255f09a6c0ab787bd05aca7398b4ce314e4a8d5005babef2a1ed", - "611ef3a88c12218babf8cb747de6facadf2abe3b6480956a545e47080fa120d2", - "8055edc6a8290f1c89f71c1268dccad42c63e0ec1476c3ff0ee79a14b030dbbc", - "630e2a13b75bd306a84157f01c4e9fcdf442f984b08b80acdbbe3de5f38ba474", - "bd39772b9950c91fdf9697e35fb0b306b0fd2eea9112be3617b06f8e9ecd023d", - "3bdc2402d5b4af05c90e10981852350566e7eaccd786456aec4323377136f47c", - "95e3ff86c19e2515461cc00f646961a9b2eb26384f86c1d81285a258ddb7f493", - "f847b59481178b7f5dc004109c350b85497795218e7805738219b31926b82828", - "d3f9d55f0615ce9f857cc50659a12cbb72b76bde7478560979906da59ad2528e", - "2b029ebd3fca344c17279c24886e9c5991af464d940b4ed57f2e2f7dafd4691e", - "aa6187ee57795c3e61d051b989ef0df592bf879c86ebfaa53f0e90a3eb440a12", - "788a12362ac381f6b1584cbff2c9f9b8504901ebea2a932017b6e73d04d33802", - "0bf38560371666bd1fcf40974daac03e8e59506cebe30a34fbb8ec9693224fce", - "873b8ffd1dd1fb04ab797831992a717975eddc5785269e4d82a074813c164fae", - "212c737e400736cb0c437df3f72a1735a507b6e4a25293e8472a1c4bfeba9ac0", - "4e9914b5904edbf5a21fac7890aaf92732add358578f305390aa3fb3024ec0e4", - "dbef97473eefdaef1d21094f15de4c4d65199912ce9efe088fe167f7c0cbe473", - "7b7900aa3ef4f385835ce95d02a55f0726a295b68af01fd8af1d2ececc45e7f3", - "efb51596c9e0d6f14558a9879225405c8fe9fb44faa4f88c12df64a068efb6e3", - "54dea1c0efaa5c0aa2b5382d438556aebcaf26931a783c65328b5d4dbd1150a1", - "517b82e5696abd9222e9cdd8a613efb1015b357e5bad4cc24723c05fe16aee67", - "442e4a4df2ecaa9fed94157217216ee4d70d1b3958cd88196f30be526eb91316", - "e55d01189bb2d8b34ae4a19ea284561358ae6cc0cd37898546b369c2e7333f0d", - "d403d966291b3f196d42d1167c085a057186690a14e68deb479d4307561e6b38", - "02324446a12341a7f19b4b253a5285ee4a7dc204757e3e221ddb53f987582d2b", - "9b29a2164b34f248f3eca005791f347a5df057deb6f90e9806e54c180e5e768b", - "54bc36eb96f019e28e608b4e7820db5f6db3da4150970189aae8d815d838d7cd", - "244203744e611309e3403f3f18e166b0d257682c583356c79a5371d82261dc23", - "3c654c4bf709b91e8e0d56da37ac1a908afab815d5908dcca4a5a0a5cbb153db", - "d5023479f5ecd9cc1de5b124ac1df027cfc0a2c9d5a3fe0a3d9aa010f4b01f09", - "564c2d79fe2249478b9ce4fac4a0ce2100fb76508050358af6090d8b66d4c4b5", - "b7d7bc491fcc87cda16b5211e82bc788a4e965fe6282056b59519bdec3435b04", - "28b6e54c324ecd0fa1caffb00bbbb1ce507554a244202fd4e9ae56b01388f2de", - "188f6ba7d5b12384391c124ebc1e63c9abf6cdb04966be893ba84a3399c80e37", - "aaa21786ca9002861bd6e9f79dce26858d64293a98d0bac1c7fc6f71966e9d37", - "afdc515477612f29401e3ea91705e5f0e921c932ed0f5cdd3da5896d7fa8c0c3", - "e9687c4cdc7582bfb46dffb77bd47262a6a807de51b081d6a0e9d15df8c2a574", - "d0cb3fe6e7275750ccd6c6d98470bf60d96b0b2524493a042fae47f02139c611", - "7fb0ad3c90f3617ef363a2a769bdb84f13cb20ba8794f5022fc1bfbf950ddb8b", - "ffd4c9262e023e6466cfe0d7373405e19d2dcd18c00e3c9ca729ddeccb0c7c8c", - "fc8df9b2907e97ec4bea4876ebe3bafb367c2fe0218d66435ac6b733250dbccc", - "d8206b98d125950b7eebefb4cee91153e67edbc3633072da2a5cf3f8e56f55fa", - "c452d6e5bce6f4a9d2449fb8bb4197da17fea34e80ac894b13c6ee1d3e77e80f", - "20c999e4a815b5685991bfde3944abc906e28ccabd620351a996d641185fc219", - "fb6072fece18f3a34d6122e1c9d0916686f57c8b470b34717eaa5a2aeddb9999", - "c01f35040ff8c1579e75cd6dbf9336e4116fb305b6c8cb00920e2a978bdada03", - "d8807f5a895dcde7dc014816506976e8cddd06c3b3f606fe2d3928c61f8b2a44", - "a1a9f28151eebd757c3ce463b2df48c8ef2d871eb5a03528f044f43017979ad6", - "aa5208721b12265fdf8e057840e3fe7df36d21481fab68fda99a6b4ebf1cd503", - "2c46cbeff262132401b79e6bfb1400cf13e0e0b0a3ca555831337b2a085fcfb1", - "67ef0395033c1e8203eee16f457cb2ca8b649280e294ea8b26522822692b3a4a", - "bb69a94fbe5f75b517a1e78eaf04594baff7595cc3dfb806e35c9c6ff4f1d8ca", - "00eaa30b7b8b430b821f396a96a792552dd35ed978e6370ac40abbaf86a93d0a", - "b427d28a77f3de28c17d26aa37b9ed8f6ff936a047d2662ef906f9cb451529a0", - "6c061f927f47a94f04b718aa2de12562be5ffd6648ec35d3a6327941c2d8a838", - "9cdce546309b68d751047063f3e49029f8cd7fb98428a732b79b2e0678fe5e9b", - "a31a46de497e5cec355d253b9222ca0340673f0481dabfd811e619f6d451c7d8", - "8abb750769a1ea5d8528141a32e84b16fe8ce4874457a72ba36f4ac55a63f1b0", - "779f4993ccd3ce4da973070bd797c7a6db36c430306a6e5a80e0e7105aaa95a5", - "0defe0d0f36b501f3d8063b378c6bb7dc11619e690cdb910ae6bf10f2236d576", - "319df98ca6c6b05db72d218d5e813fc36ee2e52b6c4aa22bd28f91337e5bf970", - "836584883466ad66be868c5c7d89b9ffcb44f413f95ed82526de0d30bdad7213", - "519c4e6a427945672e9e417f5ad77830d10dc7a06dce7dfbbff2311ae57bf31a", - "9356c987f5b08784b988647c1778729c6624510f234d8946b714fa77efc2ebf9", - "7996d5c7daefcfe0adf9f9e46f2e0899af5ed14dad4a57db60b123c6dd2f9793", - "0cfad621ffb5882fd1475aa3c935a316e9d9bd2292c9001a85998c27b1be22a1", - "05de49c6cbbeb2a5d1507d7c95fd2351c3718cb718823d95818fa12fd59159b8", - "8cd7b154be57fb07b9d7cf26b23fd9323b91781667522f13a45dcef2683806ca", - "b976803dc69cdb2daff196a87e0b7e23b5e17c1e5c23b61dd2ebb8f271ee82c2", - "159f4d5d47ba6bcd869c3f2e62073536b603fc6b174ed580e89f76d996eb5878", - "a0e5ad425d5fa921cadd19acc3424e1581fff1eb329d47b6cdc3469ebc3f1961", - "5800d10a37886030bb601d112261a9560b8731d384381f8de8c3329d8937956b", - "7d97dbf7b33187a9488350317dbfcb0269e9c6830b6c5fea1dd024b921cc5182", - "62327b2e4452cc754c039a3fc9f02e7728f2f13ff0f01ec1c5f38d7d3e6ff2c3", - "f650d035457763e25223092df29ce2bbeabcbdc30868664db8c035673bcf0350", - "318ad6da3fc424b5518a6c68ede62a76baa3dce2216297a0277b1d1208ab1797", - "cbb3253b973b187755395f3492c151009bcf90110d2d2ba6f03c39e85faa5d1d", - "40c1fd34adda31665a6bc31a03cd61e7cb707a8c124bc89c6955875b9737bc5c", - "7f519ebf4b781c854e9eeb1a53c5d7e198cc7bfe7d79518e36dd4dd5b96e97b4", - "73eb489eae5a1607283aefad73e82bc5a4fb25511c8f1d789fb16714e7d4cc46", - "ca4394087a3e89f879df14b3020a652fb6451aefec13f2145704114b485ac4f7", - "49366cf569bc6dbbbbf5121f2eac13c60c8e84a897b86a6a2027d7f7fe431ae5", - "2d574aa5ebec2bdd8fbd6cc2f95cfaa7a38e8d9e23c57d1938e4710853105f9e", - "fd124154144e6a55adb49f3798f8d6d8731b3d00ff186be83fa6ead5df3b7711", - "0526d49f528b028ff7ae4a3965813452fd6359720d797a06b1e5cce9728f80f2", - "da19441ee8ea6d865c4ee306e831ac2b7944dcafd9109c8c85b4aef4fb16e960", - "e0f22fde734741f6a98545561d822d16e4d9be760381a184b6db3affae4cf82b", - "5cd7e46459b013cbf764d1fad29e3d9b5437316a39c66a0e278acfc215263d42", - "33d2248d668d3ca15b05b0303b486296afbbbfb5f563026b3b6cf5adfbae6d2b", - "80cb4164fb1715244221763d9ae06f4aa7eac91ff438a9b7101aebbaed49021e", - "0116f148e4ecea64cc72a1205446be1ad353b1d084e4f5a2881c56aef53bff8d", - "a44aa8fce59d27ef48b038747d8c5200e85afe4a3c1c806b4ebf3a3e36dc2568", - "847dd631c3add926a9dfd71df70430e35ca22c189a18732442a18f3fbace1326", - "519ee544a0f627a36cc185c51d1fbf5464e7cafc0fd39080dab13d2195c86020", - "e5a378b5b0f55248a605ff30c59d6c5801896e7f903a8701b7f4af39aa3d2b3f", - "855166c086f0aeb6b8a91f0b147a7c0599bc99a1d3c4047a171013c7258cd13a", - "b0090a36a5bb658409dd9b6a23ec897fc3c2af18a9cab365adaca746609b5ff8", - "56be7f04e951d77ac1a31269c95eb3425878cfd776312a2819592400c161cd3f", - "ee3213854265280f819a3d1be371912ef82325823b664d817123913628c822d2", - "b55c9092e2f4344361f5bcae74d20bcae9adaa360b8944138eaabdb9489491c7", - "21cd911d6f7025320de5ef5682610abac562a3701acf1feee0934b227c819fd6", - "314e955782c2b446d1e0fcca23019de923578b7b70a8807e022a7a088a736104", - "69962712a922dd51a368ca3610474252e23e6915403735bd915372475156cfc0", - "f85356379c75f0b6d9d0f2e84a9d29bf25c2626c3860714022cf205e08d25de3", - "132e745a577fb2a2361eafaf8f22d731c16ff4bbe5b6054363693b5125cf6da8", - "6b4bb3781e4189b727ad329afc7ccc3ea920e938cb1be2baa5fcd711caa1bd37", - "44a41d2fa870d3fe0bb2f8ee9513d33247036539b0cc8a8c0584dd44927665db", - "c958a19723446bdf2df059be664245b83935e6fcb90f01edd25e6aba0d79475d", - "afcd0c2f8806e4d0f433192433be88879427d7b35726817b02f29d3a1ec3cb40", - "451850a6970ae59c8fe2b3c5ba421856829d27870fde728f420358021a6911a0", - "f501e1abfd9d6850d1deaf7a569f52c910b5331f66f9fd5d392f0488d1987049", - "3deced9d9b494a420ac4f2ce3d1ee0fee86b21d2bcbe3e971e20bee2ab11fbd5", - "775417d021489eb671bae8dc88fcef9721ed9eafb8c3b2571fe75a89dd107754", - "197fe249c6fb30f140cec020c51d8053e56c279a0be879bc28bf427066da6224", - "3258f3cf9f7b53bf929b3944e201178b63304ed2549892331bb15bd267bb431a", - "f9c186dff4d0ff0e0665fb22680d912ff8b531a0cf6fcd842906166ff7331a0f", - "9af9b4e0852bc07b0cfd6c42b7849d7f52a65ec409955412f4f053a0fb2fa73b", - "bc39a382bdd62992af397c3f962181761eed6d312451dcc0e68f0d966cec313d", - "090facc120aa97114421eca7dfa01be519076c937b68ab4a54877ac9f4b9c412", - "1447e8033a8771666b85a6819400eb2ad2b0d4130e9890448666d7a3043941a1", - "e920750b15e8fd8d19f7190b441333340a511feef512a885b1b11351617816a7", - "969e2bc8c8b1cf8eb7bf93eeb909400f06e5805e1f1b3eba10fdb5ca2954f5da", - "1814d07a9acd9e1a786ba05468d6ba698a3b5e3d6867a9a3bf6d4efa5c757a90", - "f406e01806dbf36339b7cb4692d66ab0591e1285e8895448254dd4df9672ef84", - "55626d20c75f67904357bc614db91f36508e770c0305140d02c9b1b74a4a1662", - "0558c49b7d551d54bb72b865fb81dc23b0c517888d5bf30c66815c170248f975", - "2964c3238bdd79ac2027580c64ab35340598bc50696facdaa8e2e00905daa80d", - "654372a6f013cb7add4c3e2c6eec4e465afcee94e10100633d6072b87a217500", - "4830a6fd5beaa047a8095ee78c3113aef39aae75cae092cecdd842965aff6d32", - "d50a0a9cf183beb3991899a0462e17d5381ab927e28b27f404d091381b56cda4", - "2ccf35c05cb1d94031d7ddced2dcf68076d0f660adfb8ffb018f5970f31e5527", - "b36e509abd3536f2f63e8385ef20a76530a1bfa7413797b1f7293abf58f3186d", - "d985763c12a39f48525f3fb5725d29aab675f8e932b5c404ea67f94a7fae59c5", - "4b0c2df008f1385d2676d8143c9fb8b9dbf32e8234fdf12f802b84b075421d17", - "644063950030bd8c421cbab4961ca2237eab8d86e33dd36f5e89315d76ab98e4", - "98bbd43c1b7bca9b0183272678f37f0334932eca08ed5dbd580410f2e6a95836", - "147df4a87677c1ef6cf8ca305ff3d49c73afa8cc53bc5d84b38a15a5ee809029", - "79f333a244870fc52d830b0cd035d456568b4f99d3ec6afe3d54492c92a884bb", - "5acd29bbb735a4a41ae0983b4feb61dcdf4d49bc97c48ae9d821fee53572b394", - "ad15185d63692e5492b39a07684414b0c06ab7d50a10ab9127e7bde0a220d23b", - "a0108f2af78d67cfe65481538b5316f8d094b9532eb85a242413b0fa04d9776f", - "f5cfb9827115c07fc256f55756237e0f34cb870499f63820866e15b610fbbe85", - "08de9e958d14f65f470ce257ac63f9d3a170e790a2def63befca2158a9046ffa", - "01a0adc9d15d7680635d916701e5619c0f21a1f9b0fb8f8f2258f059538f9516", - "027b1b6399a084722fd0f6ab9029aa798fa9e64a9eb1a34402b9585437db39fe", - "d8317e305d4375cfe10cf35ad44cb06efc75eced6b91f7f030bd9baf73ddb399", - "2a718fab9cdadb7da1224011b41c0d388aedd29229e37a72b4393d665c80382b", - "73b4a86876f2da4f132eb3824176ebc21caac78f16076103b442509948483ab3", - "0a4a374a94a1c1865972964462e75b64d0b9661b7a05083ba3e23c7690ca9570", - "052d285c5825bf5455b3a64c7220192af68c3b32e889b8d355e5029705f4b3f2", - "6f80fc166ef069da06c4b0a703bb2017a3d02251a90c9c65d0e4ec8633dc4626", - "c9467891919ae4bf879f1a5461597a1a1b37fa1023ad484d75b7f5f45f570876", - "c893b19447aa954ac8df6be3a5db33b690759ef448b510a15fa27f8d3657908c", - "efc97fb9d452627e7e4f3d52c92798ef2f410bab9ff2ff473f40ecb48283cbc3", - "776052222072e2c9b226d5898ddf6f19caf85e701fed757e0bb458a4d5638087", - "2824e559d45660d09bb9a85cf3e2480afacff284ea6777ca6a2588e51e9b5a75", - "731c77b7c821870251c676fa31a5541d76201e43e8dbd43c18dad880cff15e69", - "96d1341b3bf492423c20fdb08b7d11b56eed3b77ce96d6bd717713624ef67529", - "5af84fc9bb5de0010cd78748fa42138b319f6ff2583fd4ab935cc90c44f0a423", - "f2146bd5be94ade7d6fdc14a05a968dfbe40d942b551383bad29a7bd074dcdaa", - "ef8933695c79a0835d3e7378a2b180d65e7892f421b33a5932810e746aac2e3a", - "d20884193c3377adc64bb5290b25727ad105e31d7819da01ef3fa678be79e759", - "9e7e597ee6c30cf24e6e7d78897301dd54f4b2450624500db0a1e6f342e9c3d3", - "7984631576f563537ac4e1da0f94ba1239a2e41eb6afedb057eac55624ca8b48", - "db0fbf967d6d9bf798259194278cf594fa57e9a28697fb2d2dba2b894172cb6a", - "3a8c70d0edd6cf52ddb60e15d7d36dd0e909c316ae91d73c4f16e57b30f478ae", - "54f57b591d23569be097a85d777860bcd23fb502047f0727c49973a639729099", - "2a69ce8370771169d5da082e82b9d2a45ddb88c3f711e1bb92de313b2e0a0e0d", - "62c985ef6d9249b40bf7575561ff80ed2e04d52f71977a4645036902f3817b4c", - "a42973988430a5a5581fd7577bccd98a184ed6688608cecb519e824127b85824", - "b4b15fb9db4b579e5ae168e8ad35dc2b84bd0bab12e37d2e8b1b751140ed7947", - "d5497562f15f006ffafeb417cf3d4665b6081213f87d5234e72ba57528411f95", - "ba3585fc57d35c43c808b01b8cac49caa4d74d9421561d756af8fd176f4d4f19", - "6625ec4744087339d21e27c0d2d62cd737c9ad2fad20179f09865291671193dd", - "9c4279bb9732f152a2fa505d168d682daf5c5330bd38161d1aee100d979bd3c0", - "c84c3d22c85fd8c907afd8a3cd367596b191bce28ac770ed9a665d3670dd9d63", - "4d17a058fb474d0ac7d5f6ab72a8d612f1cd0d714908fc9debce2c5536a17586", - "3d584ac8a49a7bd89134f6509d9d7b92a08eb3e8c1aa2a1b68fdea234a6553b5", - "48ed425e03c444bf1307539bfff2afc2d90b66639eb35969aab287206caa17b0", - "1b341fe82e32650d348125c78a4775856346aa61c647ab39da5c7eec53d8c872", - "85fd917da56e70826ed66cabf6abbe31a62d12e12a064a2d33c31d42216ca12f", - "0c40ba3836e363ae037fa12789e0e2906aefa8ef8e5b8dea5cf5dae156f21910", - "799ff62f1ccb247c3d9649b91ba449e6d0eb22131b77858d36de1dce3d423764", - "6917a7289120ef0c757c86d1264ba71f7d8adcb5238b1236b5e7671d5a95ce75", - "e582dc901ff17710abea59561ee4d3cd920f2b1dfa2936db9b11b5bfa3478e74", - "1a1c8149f2994b4543e4e918ffcf2cff0c53d52c0c996df2c01c21212cfe20cd", - "9e244ec10a6d491fffd01dae5cd6ce5da66a7272ac35cf39641cd8714de9c422", - "41597c6a16531614879ae5a6fecee7db36d85d2fd82af72872d34d78e69ede0f", - "5e1f2a71ca30ffacf41853fd9ed070b4d9a4951d27222533ca487fbbdb1ae6fb", - "30523980b602689d6f18b56afceea44ac74cca17016bd3c8f243fdd0c5203951", - "ae4799b063bab1487c46ab62cf0403a502597accb63f1c6cdebe17b5b37d5920", - "ff0993145a2a2f533a5939cfd7de9db3781ce981b717cd29903e34a6470269ab", - "db088b0324df60513c0b66ca5545afe39c17a3bb433f71eb58af574f5963fbb4", - "6bfd1de9c5ca3a041f2d06a00c0f385d0e8c2b9a249f0fba27dbd5db2da1a9c3", - "85ae7de2cdefe442bce098b3eb3c0367253c6c33ae2d4800b4e869040de12073", - "af1978132ed26ecc52613ba613c0b829195a16cc9859dba13c4b6f42b2bb0cd7", - "81d8691fcca28805bbd45609f573e293bcf27f4718040c12b55f4ad387f8b3be", - "bc62303210d6dc7264149c9008e731217150fc8a4640b8508ae6cc264c1280a8", - "d5957fd2a0a68f9ca4ae1975c94df2179937978cdc818ed5badc2d50c2e44a23", - "6dd46fc9ef348ac9a73738479ba59a55777aaec07a93264a4a5a4accc9b0248f", - "133f1f4105e2ca89c4c23ba6f2b1fe7f3cbeaaceb53ee37327fedacd3d429885", - "3564967df7c46499c2988fb9e72c772cd669acd27b5df25ae5c139cfd74e3362", - "872f35a71ba07a97ad9bd35f5d6d2b485b728657d54e78c829bd40a692b884de", - "1efe8e36ede77c91363ce563b1b3322a5006b4e98f51c35c8216cbcf6850722b", - "1fe6b8ed4641eedaa5e15a47065bff5fd536083418bdefe09c68d7c0badd9788", - "74085fd6034e255dfbb96b617847b2fbe93f1188e7c1dd92d18d7527844802b6", - "ba7c5811afee220741aeba9b8032b997194d3b6a78bb191e8d71ea0222a2d05e", - "e4d222add3eab1ef75c7f1b1299e9474e91937ca846e255ce6fee3ad719248e7", - "2ee96a64eea3e562aacee9d20e9d49033a1563524fbfe37fc49af55eb719c72d", - "c44cdd12d3d35ca4659c17a4c9051564d1832850410977c1cfe8aec7d205050b", - "daeb4d7e10f3a9484409b53cf6fb20fbe11ca356fedff409fbe3d223b76475fc", - "b2b684160f37ba8019479bb0321727eb58caa2f5728a864d4fe9052f6fa049f9", - "86354b47e7dcdcbbc6f912f7401bda2b5c6e80e48df174fb106b0c2a611755ff", - "af5175a1aa130d03c0b501a3a9b34fea82d1c3f7f81ff9796a36d10c6937da2b", - "0d4b0c7233892dc25a3f07cf7742252b95f88a843e75551e325b58fbbe8ce258", - "ea24182456a8df9b919401a5084faf91ad8bdaf8aed61f167ef4615a25dba69c", - "f61d4e62e66ee2c0c5d9bd74bbbf22ed72efdc5690b10f3c455fa9d7ee4b66d3", - "954bebdf197ca054ad08aabf414e97a33189dd415774ce14cc29c8335721b7cc", - "4706e234e728f8e7760060673bdc5d40e56e320217c7a306055fa95e1fcc5bd2", - "6378ec1dc5c73140f31a474c51262647b4dac8b551dfa60811b8adccc65a91b6", - "7763cda795b6ad3e758f17a9a7d1574faf5e70c9e877863954f410e1766df763", - "f187ef27645872383e599771465c6d56399d772afd0d7157205404a8198af63e", - "2a63a21ae88026c329c1d48a0446dbadb4b920f1ceba88d15e6ddba28c631087", - "e85bde62b0478b83bedd27b8d644cc44a35abb55cc366d4c21fbae3cd340319d", - "5c72ff568ccc8728910666d5af5fa4682031f9796a37053788ba5190795101bd", - "48a658624db94f69c55918a0f40d92800d5bc1f52341fdd0e111e6b643c1dcfa", - "643690f7f089f622e00425b359d4653dafa8424161dde6409e967c6fcf8e2702", - "ad3c9ad1761da121a3ef2c89e63f41dd40e9efd183c8446fcdd5982db754b5ac", - "ccdb2e02233a7f83fd70d370d45c4d15d2cc3a82bcde9bab2db32c38170576be", - "267e2e702407f7beae0cacad9d023a59ac86ed83c02474d77003f98590de328e", - "a429d0e69fec9aff19e08f498799decf6642a6f41127f37462acfddd2780edd2", - "f26588f8517d4c6a76ee46a16991e5295a0780acb8e2b9911049dd1cc36c3b63", - "d6aa998511eb26c103e8556375aa53b382b031423c2e35e83347e75088ce7a2e", - "9d538eceb3b412acaae38dddefaac64d7d5fa4119137df1764a3d97f6f263c17", - "007ed3dbf90590dd7fbbaae46e3cecac7303dbc07a4417647cfc88ab984708a2", - "9e5a6b8accab5f32b984e3d01a7e95083d7e69819405540c28e90c241a7d3aaf", - "0aa400ba9ddf6dbbe5f0ef773965bd72654ec44048ccdb14bb8e467c7eb30b65", - "a188a69bd43594645ee0dc20a73453d92dfa2e9caac340eec528b91d9e8b52b7", - "15083d0599f0cd77b440aea3a517c2283631f38c874c09eb4463c7a083ba57e4", - "d87b723ca28f3e5063322b141e871e6f61901e4be3fc2ffc9c7607acad0d44b5", - "7451b8f1ff97d521fde20631493c3002dd9873c2c4c229c6073d23c56d5bec71", - "19415bd11878986228f45983f79cdde069e2b962006e622ea6d3a38702f7275d", - "f6a0a5cb66a13ea5e969bdba87980ab5dfe99d75caa235be6898436326629ecd", - "0387c7e38a04f4bee60235844ebea20e6e9336e61a6dbcca01ff110f77f00c50", - "2e426e77e30e9d77d71b333b667d55b397442dc3515293f4f88df3cdfb1c7c87", - "999259520a7d9473e046be9247633cc78608bb98c0d73bca9e823d53940b5003", - "9cecb929b462a4e6ef35308792fe64637df220d02311a1c4b239f6c72d15a1ae", - "69d24116885f285fed6a6cca8254464b73a79bfa363cb313033b65ea5bcca971", - "6ca663ab7b2610509e49cf76111b9af51086a5d3b5df6ba0b034f899e4b7c2af", - "a8e12d33bc61bc9b0ce0b8486739459d366899e50524bfc94a912d2ce1b0b5b7", - "1453ab574c7dbd5b93e9ac97aea616a1d046d100a30d87a66eb35dbae8cc574e", - "f4613f744572ec1a01efe79e0f94b4237b0cca16e53227962e613be132d90e00", - "cececb0ce622eff3f7f5d1f966e639a6a739c75fe6fa91095e49f5d3941cc4c1", - "5ac4a034e2d48194ec903140ae0e074c07a5ea8b2b0b9c4c51ffb437611e14cf", - "ed86d98ce734cdc96e0c3d25dff7bff4385625308f6b93ff45e1a0a0975087ad", - "7808dbe2dfcf0c350178ce20c919b3e0aaecf4aa39d2715188b94401093ebfa5", - "cf0cbfd4085ab5e69aefbc946037fe2ce8a5cf86aa1524b851aa08479ccc9bae", - "f307cd6dafb911eea26b495d2cf86f0945020a3294d53bc991f4b80a518bf8d1", - "33db63c00e1f3e7e2453dfdfb479445ebe0ee8c97d3217f55856687a20ff2e7c", - "b315104b2ebcc97dd89843afa1f1110fb21d59957e644fef623fa803235c1fa6", - "224393c04f684d2528ee0ab31c40f6d755360078adad528567775425ebb48750", - "cb280944769791ab111767f756ec5c380ef539f3a4cfadc1de2381caac136cd9", - "4811c6e850a46f7d8b628ef8152a2bbb8985d5e0d8882f1466acda9d172764ac", - "5075b0c53c37ceb6fc224d4d698db70870e276ef708be1fc0aaadaa7a29079f7", - "24d84ece34ed7290514fe0edd1a78131df09ae5ab172ea5501d6427c4446637e", - "eacaa6acd2e9414d3c313328ad1caae4cdeeae54666f00f1d6e45c6b7f7b3073", - "570a8cfc125aa8aa9f2a9c1c74346fcf2627318b1f4ec903c8acd6a89a4f78b6", - "a2f737b09c9356e7c35d85928db1b6c9c19fa2b9b1e56607c87f7459ce8fce7a", - "207d5085aa0f93b05768fd7323707f2b1943f708e3016c20dbc57f9e43837751", - "c742049152d13c07d564b3cab85d8690f3dd49c3b03553950b1a64ac66850610", - "d046e135f2d683f3120a919b0035b1b46810eb94e964bd986c782bc6ef73ef59", - "bac31a3dae51c2480c5e99ea9ec0f95195d8812ecc236651d83ff50a088f4707", - "f70525e7b58df626cc83344ccfa996582faae0fc65aeac0588e904fe9dbfe64e", - "54b1038dc4ef0beb3279b33ac1043af0d2a37ddcdab4fd8ce62a24b9b76f1cab", - "6b9731cb0cec60ea15e882f25a6b1b4912b5c7c5186347a36611e9cc30afe434", - "766f0b5b6bb5d996d2d14db52593b49257fd1999c505ba36a43cacf3cffaa5f4", - "f8269c070262aabd9e60be8aaa06668a4a0fccab490503154b7066923d9cd732", - "4c9b91d588d892156f73083a8406f6ed734f675d17ebbab878cec7a672d9f5eb", - "944fe47ebfa7a9aaed98534323d996d6fec178225aec596f42e243802cd09427", - "d2f3049e4fa51d830ae680a25650907d2060d0ef25ec7f96e90275ced8732bda", - "fb00cfa8530607f710aef504295b59d2b9cfb3699c7c31b09c347be18283d6ba", - "9d608c76646c7a89122872fb47f1429fabb63b5d4ffc406078358d81593a8eb5", - "d4bff41286f088cdae0dced9c78084da0ce3393ddb1e3cda5b665cda543bf8ad", - "b3a701c98511cabe9e7eac90eee82e9d9c1dddcc4f6b0fd546066c4b3d06e58f", - "5faa9b87f52d26aed79b52fb672aa78c0ba978da1237f6f1a5b209cfdc3abe32", - "126e78055da939db0fb40e48f5cec015a890de4085f7084a23a9144ecf8a0537", - "6fa249b00cff87cef1784a853698de51259f2e20d345caa2c08277e0419a14f2", - "ed0294e190d98ddd729ba0583e3e1ad929b01bc32c4a146f599aa3dbb2761414", - "7d7448df5febd29ddc5930aed26a44c5ba9d13ca84f8684cbf7b164ccfb6c949", - "a50b75a8794f1a3bdbd06d47e9ccb4d6769686481927657f0be9a77993809798", - "e365dfe1117e9a21e49b56b856266f380bed2c719ea63aa129a23f834d25d62e", - "5c31b55c77bfdb13af2982aa17b9dc8763dadf61218e69415c0006363e694cb2", - "c59f49c8fe5ecb590776acad453f2d4b7d667ca7956f63dcc25f544f002e2ccd", - "29ca65f9278cdcc0367c54b74bd568301cac3ca07166ae7583b87e96b7361a42", - "a2bb36bf667b9d1b261e814b9a6be11f9c85cfd01358d3fa4f3a28a079776a36", - "eb44d2ec3f60252d4a3ecc85b45568bfcd9b86b33f6cc855ce49103c15287226", - "6621c188210a0640aaef63ec30081d2f40688c03198759c62273c8fe61dfe873", - "97e3c6986f109efdef6ecb40445ae823e292a4ff72831b81af1acb0a28d8c115", - "a403955e794adbf2c53e1ed3a995b14243f86c1f0f35be61e96ffc8da065c5d6", - "1f374af41837394cbe5aadcff95abe036f79513cc0fee60951bc1a6a0bbe8d3b", - "aa25a59326ec8fd5f742079f3c53c9c8ea6af42f4e1bbfec0848a43443d086e3", - "d06360ecb55c2049810717a67da24e89f3b296dfbfb2e1f4a197753a9a5f1b86", - "6ef1b5ca5b7c6ccfc8d269b5fe76150825b4d9cece372ab93acd7215dd42b352", - "02f607c21062156b80570997cb458de98e81cb727398c02363efc103fc654694", - "9a9261336bc9fe45555012cf637e7a0fc39f995ff4f3af1ef012402ba01df78c", - "415a075de4dd5ed0ebcb18cdfb101be119c6355d56e1bc480ee59f73ea0918bd", - "6c62f7a2d77d9676dfdd35061127d499bd5809f9696257750544dcbe7e0d3640", - "fcddf01385f88e810356b93a267f6fbb3b327f0ec446e641717e6e705fecfc53", - "9638be9465607096adf1d6411664924c2ebdb3795ab7ffdc1f910cce021628ce", - "d0190fa622d2ed56ec5849c3bed8f6abe6b6d4c5d4e244d5397a626418a85c00", - "2ddfe045cac585a6b205135dc0ab72a4bc4f2448d9ed9c33e30f01c000a1b3a6", - "8e036cb081eb186edd6f4fe0ef3a7c56c030001914859f1be46a2c493061f217", - "fb320816a65cca9d6feca4987b2e516b099276c9a05e561ccda62eaf7b7cf2f3", - "00a767cde4f2e413afd94c96641edefe6d51a13552ddd09b124d430b6048001e", - "abfa24d471ba56223616697aad13d27ea595c142fbbd7304478203fba4895b2d", - "7b396b72e25a93f95d70ba587cac629bbb5cc9ad60cc32b595c5940bcebc851e", - "b6c75bb83267b9efb7233225a7830537b38c6b20f2a180669a24576aa80d92fd", - "ea4ec51da5d85bcac5392ed47d6bebad5ccf86ecd452bb0cfd78adb16b160495", - "8a6e7301ade998a28c8b8bfb1b27c0031791143752c3e543a433ae9e257a0398", - "221924999ed08e4be1307e6f61c399eb1a1de9d3f6f52c554a04b104557ab9a5", - "b8bab9a9efb34861e8b03f639ce85e9b2b064544928b97ac883b558946595a0c", - "86b9d4a9180f9e87ac9bdaeba2a74e4bfd6d1a00dca6b5074b1681175b98f827", - "20b8e3bfa8e26d78c6da01e0b788ba1c2ec537935462083d0f9951e05b51086e", - "2bc1536e56c487efd4c94aa2a50c12141a62b13d3658860320b5a8c22ef443ab", - "1fbf0607a98a49b43bb6e5b2b3fb7fa791b66e6164e6e3bb34e4cae03b0f459c", - "c246fd876330ab6d3cdf3f1aaac7e290c8229b4f10de73163be468b80262080d", - "1a2d8a96927e16821fe6edd271fb8dc5b0d0f1b1f3e744b6de4fe79d57509892", - "cdaf2ecf5005860d729a837d85930a8a6f6b4e3310f6f87ed73a1746fd7e5515", - "ca2284e82b264c6da902d410af55d2dd195dd07c5c53343354e38fe001690f8d", - "51befdc75eef513ae28374ccf686bc3cd2604d9736f221544a292f22be5b3c6e", - "2c7eb8064b44542745c16e6f57bfb460fdb2405ec300a988e7507a766ecf2923", - "f5ed9ec0b170c1c816f3656af13bae7560dd50589078962cbda231890de82c1b", - "4246157d406b8768c8b082798fc539a16f9914c55c1d8d889a5163f18b4bb15b", - "9f2d7deec74424e3c8abd923185be3681b47c99297a7c2f6d94b8e39d0879973", - "c17e0bd35a22c45fab8395f2c7c0dfd74968fd05757fb49d74d77610e94c6444", - "361a573f87db06b625adf6ad2ca59491ebfc01761e4ab2bb74e3ec50822060cf", - "0be397c1432d39051120b7cc9457c74e0bf1f9b1fe117225e14647778ef686b1", - "8b588a72dd4bcc6be2ae81c725025a750b23ee7e412f75ce0beabcde1248867e", - "ea7d194782e8f0af1f57a15fd988e26bdf0073d5728f4300420b7df6c2504a23", - "a92573639f3001fd3da63fc6d1839dfe356a7b353fa30c7026d4892fd8197b8a", - "6fe7f02f84b88699860e2ddd08bd66084db2ab836c79e8667fcddcf8dd682313", - "988ab0208f019c0a83d0fae3653f9da7a28abacad1f2f8d4d7a4de9f1a25dbd5", - "efb1c70e608c77b10c3bac702a1fae84a13d28145a9d03e17722cebd4800c42b", - "b71fc5cf5398e11b9f0f7ac6b6ea2517c555fd1cd4a5a24d441c0275ef2a44ab", - "dd1920190149535a97c0764a0f6306691054a263a22b4ece20f68f80dfc89390", - "a4fa61b0a9159ebcaf2c5d4a03a21c553c3034b19d3eaf376a1904e4f1172e08", - "47e49c65a27db714fcf58b683aa15fbfe8dac792c3a79b496c1fbded1336a63d", - "1c1167411025410065aa78429ea9d8073830a6a64f098251054eaa1987312500", - "0878aecde1ffabba94fedead870dd5580f19625c4879f4102aabe01357a7296b", - "d561700936b7bbdf806c22ede6b7e789c7e5b6bc91a8f27da655122827476428", - "2ddec74865564684a4baedde27ee62d4a5349c04ea82968ab1b5f68be9558211", - "a37c6ea91727a8559171f1e67cd519ccf3d62a821a3b7fe723978d1c23c5acab", - "f7ce40dfddf6e714f71c1dc5bb6c3a734cc85cccbe02dea41446ee1f7d3bb440", - "0dae189eb574c1ceca5a83d1365f2b3f6087ec15519df36c751ecfddca335453", - "26f1fe3933bfbbfa58548202eb9c93b467def6d9f2961a36c04b64d0e1e4cbab", - "83aabfe20e50100f323661c182741c7c0cfd44f2810868edf8f54fea844d1d57", - "2f670ebbace03604e8f078436a4322e4adf9c4bc00aafb29da6950fad06383ec", - "33498b13b1a5f42726c7edf3e3519f4e346aabbbdeada4758e75b8cf82486d8b", - "c85041147227f5c0686403b9ebffdf5f1b05837e07bb94480fe847cc6a838169", - "0650677071c9a9e65393ffe9feaa883495b2d6423d2fa4acf959c6f1a6b0d5f7", - "85bc2cf1824943b358c9a3c835c82aa66a28c0a27098a42163c5c25165a7cd88", - "8c2027f6834b852a244e19f4a878eb728165f4e8cae9a1b9282261f918167648", - "36996252f3728edfe20cb04a297884b0c2702a84e69db809b68db9481e7d954b", - "9d8904cb0bf0db547c253047eb1ded239ed55ac9d55b2997cfcf352b1290830a", - "eb27afa3abbcc41f48438e8e899cf8a6d8228ad92bd3f290c97e499b3e50ca1f", - "6e53d907027170afac04f80c7aef90c106cd10f11471d5367acb9511972da26d", - "3db016f8ad009a0ea28a1483c8306504580726225eeeec45d7c096daa2eaa9d1", - "ae88c1f9cc0f251f68788209be61326bf8fdb18c3b7f0217a8412fd7eb6bd227", - "ab054a998e7f1f57559a53a2dd66e978debb79661f7f5374ca7313315ff2ff7b", - "ee25af812c63d308ee08eb96fda6ae43e5ca0d98e07426eddf1a05a3f4c13009", - "89a513faf4051d289d146b653b94fbedc3bf7c9f6bae9c92e2c5c7df3245d59d", - "9dccc58c4efe4cf3928365c92839bf6f76b10d721a3e5239eea1b1146e44b219", - "7d52d7fb498dabd4114774c68817e2f2abbc6749ec41a501b8dacb58ebd12f2b", - "d7ac3a274070e30a92445eb1b20920b2f02ad3b07a3ea75f52ffa80481148972", - "3494abdedbe34769eff3ba1412d7d0263c4578539c6985b7f3e2b20b4164799f", - "a6bcf450a817e923884a1c51233770331e98e430d146187a854bb770db61ad17", - "d6aebedb3d4bce88d342518a67ff9d09db0f76ab6dc515d4bc97dd53a916efea", - "027661bdb24d9cbf42c4cc6d49d94e9a9dcc0805fa34d448dc850c05215cb8e2", - "cb450f94ba659bfcc077a7e345450dba294f3f8fe40d608b7c6b7c919b517ec9", - "7c373e4c41f66c97b50fb1c02556e539ffdb5b5f812d9116b6664bc04ada7944", - "8783554d0767f69de4d0241d894c0185d3bf0a69aaab98421e5b0a046df70976", - "4a0ba0c6c90c1cf521c0b7ec2e6fb1d2b8d4ec302d255d29976527acf5b3e6e8", - "837f51a58e4ceb540dddef2391bca49d7a650809bf1d8db28d582886619e7a1c", - "59925d455c829732df49e18e8d87ae372aff6c3f3043c28a8885ec769cfe0479", - "258b321a306b1de390d7af35813f97e037469965dd61d216d76bb9dfb984f90a", - "8f270bab567aea96d16678b2bff34ec40ba6c9936a67f0c87321cb019f86b91a", - "f79f6099deb5bf69a1924ac4adc9f11f9ad744af89107708128fa97abb44f46b", - "c70904ea2dad081a08aef9c6e77db407469e9b924cf47ee42cd5cc1fdc90a120", - "ac29c287346f7f3192ca4f315411635a1d712eabcc5275f78e5b6ec91bd31c57", - "c1ece067c9bd53edd27b688e65d7a17c9fd1f650542427121b48f28cde8c051e", - "177ec375057113eb1669b236c38e216a90fcf9068b1761e63c4e0bbad075474c", - "301b128dfb5a02fe2513aed8a951d3c402d1f8d24d25a592187fbcb2704aab07", - "fcea2a01d08d7460d062723a71f0b66a65f913d1a50af0535c1b74544661dd50", - "447a2f2a9bdd894fec73f00f6dfa48fffdfcc878e459d182339771e6eae1aa3f", - "48afd890683a27e586128528158ebb84c7980b0cf9234065672d3804549e85bf", - "4034ecae824336eb528ff88c4549201a752378d0ed274575dfaa4bda683ea92b", - "48182796b62ce95da88f8d92a4f6aab395315116927036a34e8b17ef3c85dae0", - "24aa86f6b64c84cd217fd68597003cf4c36f413587231acf925541a421ced384", - "c5f3445b9291c8d437fa0891ba619bf6c369b36d2c09cb3fef90a9950ff126fc", - "e1ac16663ab01b24ee3e1bc11e9e1b6371861deaf7ec2ea83e12ad97df25d8ba", - "6d02d019b329b5dd8e994d70079750292a8509ad129023fdbb82af7b1852cef8", - "898cf29d7809701e268d4321c73bffd52f13e9777404061c48120553443f8708", - "decda0b36216bc5db725954b07965165bc1f24e8f351a0f44246c5270a673f72", - "7bcf4c54aeaeb97963f7b707e1c2ec9203f5afbbdc735113545d2a1fc0a77ad4", - "9d2c083a3e9f48fe17dbd1a4bba5fd8d82987d3f042f122b206d77f15c6b3e03", - "16625ebdc5b99a8e8bde8971e898745ef4a6dc6d1dd2018065708fa3e088374c", - "10cfc8cfa57e06bc55541159efee1c3a1be307d0693d68aebd966a45eaabded3", - "e82fb365909aebdda219e7f93e8ad056983cfbf9b02c9813112dc8697b0cfdd2", - "cdcfce9319135ff558cfba80318e7a7825b3615ffe258a9570a2f02945a46284", - "d7c9400e998a6c85b276312e465253c1b8c5a3d85208fe156e775eaa14c2d528", - "960daffeebaee3ded997e902b379438a34836a2afe0163d956598ab6432bbc16", - "8f55e86d98f214ac0772528c11c6fe8c465e400341e41c6381dbf49050d40574", - "0e10b25cc469bdaa7114873d7d846dec57e534587e4448f9fea21a17ddce9a72", - "846c55009cd2bb60be7bc36e43bd5692208f58708eb0878a2c404c3c9c9d65fd", - "42d693e9cd3002770134839c3107b3b5172c5f47e23bc45781e56287b9ee27c3", - "a39a28c1ae1b89de9cd428dfb826d59388b9d3ec5c119493e727b4e13975f1b6", - "fc4c7948ad4025ca84bd0876a7757a7bab96441566216d7d6103d3a94e546625", - "2122de9f19e358a3fe88656ced4fb770fa86021f2463801f6a0287475c05efde", - "e907ea17295e4f02eedb1233037adaf1bbb03685d64aa7aeacc551e00c04c851", - "5c1d2272c66999b1b71140c6477c59bde963729b3067a573f869d1fc0c81a196", - "05b6e2fd7b4e62c910f34eb4c15d47d71b73c07825a65cf61dfb2bef296cb719", - "c219f8d83ea3bcf02a9cfcf34ad4c47e4162ff35cff2c0a6bbe230675f241c2e", - "75407e87df01e05776cf70ad03f072dd521389d2516878da2a21207020301509", - "2dab0612e18ec58309a76cb88ee37e8afd3d539d0013cc274e50d4addd52c0ee", - "d0b104f52ad195f501ecc975b8d6b4479bbed7473a8b127a0b4a5837b58c5ccb", - "794f612237d3ff344766cb0b02f5668cd1c5c0bac2821837f91a9198f202f599", - "46ae6ea975fce17f9ff21c4b62899b39154913c67d871e5acea39be7ff74d38f", - "3df992462261680fab49c8bbf02558360ffb6c0140e2a8525657d83c040ad95a", - "fc99899d31b26d365b95447d718fbb7b1012621451b83200c7a41d629f031ac6", - "6f65bf897721707a2902ba6966ca47ec359f1a69cf8f461d36865848e92bd1a4", - "e03cd6824d9a43583c7a47dd4f23d59e64afafbe4c62f2a312db151d5f0405cf", - "122cfac4061eccacbe43fa4e08b2e448d427b59c2448ee0145149c01895c7444", - "44cca7e1717e318e74ea9ba2b55cbcec119376af9b1d0b6736f63ff3a19f4dd2", - "c58029b26c5a86e96e8a24b12789307a314bcd2c330d85821e4aa9327c5646c0", - "23a6ac562c2043de1f527030050a22b5cb7ec54400d64cf596b8c7a29c91028e", - "256613c4ac2a0afa48ad95bf698b89103ab1d8996abbc853d24776b0c69116c4", - "0cccb839903aebb6ed71990fd0347819d3b5c69b0a7bb185bcb679f8e01c6ea1", - "3eaccbfde1e96e2d28eb490ac717a93f8d2950fcb3b7f0c53fde380a1df49319", - "c9adf2e7bbea71a49dbddecde70c1bbd0e1dcf5e79f0fc40092ab4fb0317a4ef", - "10dfa2d15ea59e264190811d3f29e21cc5edfbfe67eb005c6e27e4c008cc66fc", - "5dd04e0ab169268d38bc5a988c43f4a104cff2e2f1f8718773895c27a4ded941", - "3737c0d3bc29d1afbe06917df986d3c2c4ba06e9fa3f56231ae5d855069c6d4d", - "f9c2eb3ed5e69550bdc919722d250b5016f5a65fa5d76b2f6922fa8a766300d0", - "53e28c1de0b1a0532be9cc594d21887d01a454a7db8b51174d612240b0cfb8bd", - "f0eddb0fe22b11988f5a691a068e9791e1a91b392ba8e80f0bae8fcfeb166f61", - "69db29067b4f4b37691e6553ac81ff9034c34a5bee1acc1e174a567346f5f69f", - "ee281b958f1cfb6ba3f60dbf87753806301c3bf22adc376760327972d9be249f", - "93c8706b30364b175ba253d39459b0fc4cc728beadde2783defbdb2e7fafc232", - "a0bdc9456fb1e9b82a89ca877e7684e0a006e2d9500335d55107c9d5e7a766fd", - "5e977cfac4be8946cb351e7ffacd0fa7d33d6cabce731cc9a756f2a820982549", - "9e0836681f940a85398d3be94e12713c71bda366d60b6f2b32d8a48970e28935", - "d9c3e960d7985f39e832b53c08bf2431005e2012ed5c6ad69056acf096b047c4", - "efb3f3548c81ece0c5d5ae6af0a429ba2768795caffc07dd28257601d94003e5", - "f9df9e4e52c8383f5f4fb8ea813800d8927b642e3a4b5c9352765322fb019e77", - "363c71e431f9011016647e1cfc00b4ff8ca341be0020fa9ef242c016f41fc812", - "cce03a14361331609a8cd0a84e3daf63af8913054a63fe90980eaff24931fe25", - "5c4ebd856a2adeb734e3a4681cd2c4a09a66596340a67ecc861103b8ce4e2a8b", - "31523c3e59ffcdabd4dbcd84793c26d3670579f6e805bee07d1862636613d30e", - "dc99f72f777334701b15fe33fe27e23e4b62ab590007c4cfa37099d1789dca23", - "e716c52858c8e99fb0b1232dfaebed0fa3b6532260a66b4c52e57385969dc83f", - "613bffe0d231bca12110e863dec5734cabcb1b84eefb05d60224f09861743e31", - "850628b626069021517bf82c877a9421a5be0468ff55e540349be09f4d2989eb", - "f0cfc813ab9428276a944d2b5f8d8e412c285446e2a3fbc0ed7db131b1370343", - "cc535b0a6f40e2dbf6b18fc517ab5922c2e45019c1a3e04e0e2bb071af0b6002", - "68f36190549b9093e91f49141d87892246ceaf8f76a37edbbeac1cb8dd55945b", - "0bf442effcc9a8f1e1f0ce5c995e4c1af66a0f114a1acf2d5e3c74cc6943f406", - "5e794bd9de8a6a9397429a0f814e9de5ee22dfbd33424b45f3ecbe38374a7a76", - "496fe9ec2f6394600dd2b7429bac718e8f3fffc320a83f17d85ef74f93373cc8", - "7387df727d42e7f90aa1b17bd15f687fbc68247e25fbeb79698520d1f6a24734", - "c28d38532565bbfa94bd7f06b9740641df35554855042934b9212807ce037eb4", - "d66cfb1f75cd9b6369394c92e228939ec6f940c6fc12a1edf312ccb310ce225b", - "95470cbb2cba51dbd0e5adf877f50736e13d20fde46dcd1922e459eb4a8e13ad", - "b57b1f802133c2fdced288271dd8c569fe84be4ced4b03118e41bffaec7ddecb", - "7ea2caf9f008e2145d5784ad4fab79cb944f022e4e800a0b6d490126fafd8a95", - "398badb4e7d41d63648703ee083f26e00f4327caecdef9563ecff2452c6c401a", - "afe9352b029ef643bbca518dbeb1ef52f83e6603602d54bc1ebfb2b841f8e734", - "d7518798f3f3257a73ccc778aefc5d528327ed22af223ec0df50d8f3c85ae92f", - "689b299cfe7d4f29f2f822605aaa0c2dc7acd59da339e90de8958fc3ebde80f7", - "22a5e401900f0ea4a23a07840a26b53e4485beffc4c2dcf5493f236a11d503a5", - "127c44072c510de7b6ec26f871c7c59f2056ee0a12316c31edca508a8dd1d87d", - "d42450c28a60514a43ad624dfa4bdc6d8f60597dbed32794ee97e158d0b9f2b4", - "6bd2be638c4baab8ffcbf5f286337afcf20bcabe95e4fbe88c9b1e808d3bc410", - "afb5a011c9b0d2574c6a8f5db3d47da60769ea7e334980c645bad57f110f2d48", - "32635cbc7b231fe98dbca24a8d43539abe9000a1296235fa89cf3bcf7e3ab1b5", - "0dffe55be1008afceb618890731fa42859d783a3b29c3a92e6b1727c865e4832", - "4c33f76f606e6ae8bdf0267b56326c29c284b4d3994beb5d0d39da84a5d1316c", - "353a382aef1ddff2842fcef76af44a67ad4f69fe5ead9d3a042e059ef1709260", - "89342775892fe797d2e058f8348756f7fbe66b5d23ad3d9eee12d31082ecbf85", - "614d9b58e8fe2f8d9c6d4d4e1390afbf1398ffaee04a820b2bb42860bcbfbc2b", - "92a27e87335f1221bd9b4dff7782102a5975940d6a7b0a14f578bcee3ddb980c", - "684c34ce7d483897cc2083c1df1002a9bbb68555d3f5b6028f05e65295624642", - "80da5af7063ec458c0b828b56032978f05dbf8f6c6443bb7a89449e24e25ac6a", - "78a5c03ded1a2293f8d6b9c82ba93d9212134d28898ca21fee290dd75b5eabe4", - "9b478f11e188d92bc26b532061903bfd9033e4d556accd0cb3f072c3a1503ecd", - "3bd99c86457e11b687f28ed07f992bb482946cefbd08e7b369fc3c3c76d34c3e", - "36e8c9a9a04f5cec6584bdfb138879c23f2593ba5aa5bfca04004167ea6165ea", - "96266cef053fe61e2f12c74ec72ec1b978240d8719c59110fe50a2ed0ce560c5", - "2186339aaaf510b4782821a179bfbd77e0a99a5bb1b43b112f056a100df56eb9", - "72271a0670ebcca538f9439ce7b5a0d43fe9dc6c3b489a988ac5e2a4567586a9", - "2d8a79a08fc8074ae1890953b5aef88c183e95a299c2fcbf829f8a3584cb1600", - "c5a598e07d5ca37cd4b83da7e4152a30f4ffc43c542daee7853007a8eefcfa62", - "02961d21263d31fc4aa4191b14ba31af33244a82143e2d33452aea62ce979174", - "48d57b70a737c02760f26c7ae169ffc91d00bc2b77104a6b54e4549f81ed472b", - "245fa7093227083f0cd37905a10e761c904b5c59cd5c988810f06d1e933ba837", - "782aa6690ef1265a9d56226de395ae79c53716c76545bdc7c06e87517dc7e74e", - "b1eff03229839025c6af0750cb906a8f7d4cbf5a9e9dff287ec75ff76353255c", - "315397611c757fa360693cdaeb5a1cadd4ee4c899da8ba63771a36b74a2ff937", - "f2a74350847ac2c43e7caf7d93f99c1afeb94b032466769c44160b72bd5253b2", - "8bde017595ee36e959067a64263bddbb03e3e5b67d1b7832b2cce73f4b5e584e", - "351c715e1dbc71910924bd0e4459cdc58d35d0ae00cba15f8a14a8ac96f44235", - "ab7eee5803a595db5abfd69ee37adc5d3358a4ad2e40b63ea16887ff4669497d", - "e93d86f2080f752cf657cfc02ac3c1c8d76e1d6d6642927e61b3ae30a0f4622e", - "1afb60e95a20e57b0bcef81847391f05467b4f388ae4bab3e082cd7cfab82a80", - "4cf4eacb6821a6d4f4f21596de319fe361a90704852c7ebdaf651d2dd3a2ff3d", - "392de00d75ff51bb4c56fe0fdab8931d515bf5ddbaae4d7061a32e2f355c15c6", - "6ffa59a8d57df7d5716a83ea0db2b8b68a258f28bca117ec8945e42a23063d70", - "aeec70a05d7463ab04c4a52d223b8143a1433ba941727091e29fafbc7abb31e3", - "d6f857651921730b5237498fa65834466581349c5d723569e7ddeeaafa947a1f", - "58c78951b6eba6abe47eecb3924ab7b7bf4bda0ec02882c1045d6591ab473795", - "e8448b52281bb406199ac5e3556d4ab23a22b3b69718a4d4356fd3d6accebaf7", - "46c53e3a9d850d262cf11b5a5c18cbd16dd34fbad5dc6e0ea84939c460aead2e", - "dea30755a0abebed5bd5bb1710f399268649e57e4066cd03f66263ddb8c596b8", - "e5e365b6d10c1a457873e3b1dd20b87386e38be6a8f1af85df02bb375a843990", - "dce672ba7a594a1ca9200e4f3c8fc3d433a6aac2bcfaef40498f7dfe911b7c5a", - "0fc72a0d2cf00e1444b2196d5703fd35383cd4a34f99d670e2dbc6a75861b399", - "426a7b9afbad0339dd8a66271e1d71ea4e6f88de8e7160d4bd05d6b422bfa9a5", - "1e7f2055e30b917b96bee90cdfdf100eea5d78eaa5dc363ebe7f7a5c9d6aaa6c", - "2abb8b3b7863527317bcbc1a7539334284c71d7d27421d4b9b394dc103865250", - "52cbacb7932344805da35134fa9b6d3ddd5b40090281deea26d1329c38420a26", - "e401d47777e58b1c933aaf2fb9a1427fcfcd0e572cc564fcdff727b7de1c79c9", - "6197c8c24a09f39be6812853a9ae5e6dece98f3636a7f7863dd6ab9a2f230668", - "78629005af489b32655d266cf60feff21902b51df9839d61291f5235d5740adf", - "91136eb2ec059972af42042fe3c26458cd65f2227e57c74e32f9062f55505adc", - "106349c4d2c6874db615648e9f769c73cfc80b8bf448a934ecf2c2eb7bc438c8", - "f03fba006a7ecd64d71df6a80155f0808ccd915bdacfcec944097f39658f9cfa", - "79baef52c5774b2b1de730c110de36425505c251603ab5830e14f62846aa2843", - "fbe3fea88a82fb480c530e9fc408b705f212f327b7f226fff9d3f9d34afbe1fa", - "f7dd0bbb7889fcaf83889bec55179cdf077b23b657704dd296e6304ae51cf20b", - "c87efede8d9a558387f2fa93e1eeeabc73cd98891149b31296432d1c46b19404", - "04220943b2fc4331d77c7fada40c9d44b898688408a1b97f687d991d958fc22d", - "e467a5b9334ddfa2aa09f524dd419b006e7490eb351ba86f131b2b96a7b11c7b", - "7c42029636e6c137e8b6830f2a7a111d9b873c33ccf0e1a0f40520cd4098ece4", - "8ebcfb65f27dd60edfff8dd942450c75551ed5d36351ca9e5a6c1c1121e4e0da", - "ab7e5550418e87570e51bd432acfaf28428cdf87fde7b373efa7d1c50cd1a1f8", - "6ede899c5a4674ba1891df2b94f7e4d72aa30c0fb3fb86e7943b4ac503bdaff8", - "492da8ae5e0ba188065d2ab5bd600ceda2686f3f46f5d87d93044450d3fd005b", - "1ade7c3fa17e57fc34199dcdd7515be0d664b800b0efad293e9d74e4a024b65c", - "1b321d890d2e73c52f9d85c119b9f473b0e2a43d80693af139cf214f60b436c0", - "700703073827fe6009da57c486ecc2a52a60bf36994796bf3a14fb35edc2e8d2", - "93abcec553ae5a22b3ba32aff4da7239318f6d58653ac02f521f14d1fffe1d8a", - "97230baeb5246d524b1a18f60d394df4ac4efb821676b3723bbf4342be1508b1", - "be5cd65c5364879a267998fb8b348cfabe63bbe2c9c34e49f44ccba8b5839eb3", - "693656f459b3ed3e5ca040658cd394e5c6eb16d416e5a1070b463f02985f5eb9", - "be26f11e7f7b19cfb6abe02bc11bda20c6f04e62d909eb6f0a5f0de26defba4a", - "a3e8583ec369a27de0b6afb08c6a554f0e45018f35db7f0a1adf02d93c91bfc0", - "b9081045091d6ce1591a6503a1a92bf1a9cf02f78114baad11aa73b767bc7f5e", - "8a8a53a265481b07206bec8c92e992e5e550a5f7a22e299331ab7f840a8ba437", - "42fe45a1232110fe6fcdd21b07801e72757bc1ed851c336ec60d171235350614", - "755ef7ca36c5a364905b3bbaff27b40c482f44e5ebb43412c90d74917dae1b50", - "a475aab6c318e3576ba8d48d5cb735cbbdeaa059bbfc1dfda383534e3cbbcbf9", - "46fd7dd070dc6ed5f9a027b8118ad7f67288003bd5852183a81f520ce2763789", - "2323bde64597d143a590d9102503511709de5a5c6a2899481c7addd112fe8811", - "103b8339883805908f892e97e0b36f85c32e4ae8131b4fbb9c164b6fb9f8a3bc", - "29ddd470dd0fec4f398e69495a011a74cb3dcea65f1c4e2e7a4f5a627f03f1fd", - "d81a52e2a9fecccb34580bc60e72662cb4998907ea72a4d29e4497de4a881b41", - "fbebb42d19bbaf0319730e20a001570cecab975941369a372cda921e31d649ab", - "e7b091126bedd3d2cb733c9f038348ba5b8f13d9d61d9712b30c2e8f03028716", - "2cc06f7f5061314c99df13aa3a1539d48b9f51a7979c39c46248ceb581facf7a", - "1c23e638b470ef4b430b7aeb0c3eed43768b5caf9b2b84ecdfb14bf8c6de73c4", - "2430861189a82781d3bf252ce4a14b92207c8dd7f33abde2e9f1553c30e228d2", - "2d8212a89836c2d44cdd57559cd054049887fb4a931e8b5ebacea249f44251ea", - "b0fc6ebe11d493855e2316c67786e7698caf44b824e5e92e91edbd74736aa068", - "e0dc0bc2c095985cdde60881bf301b67dbf9f1d71fd1697cafa64dc00259227c", - "86c16e707256ed6ca0829489f04989ec34b036d65e9821c4e0ba266eca0786cb", - "c0fb0330b228572374b2716988607429a89eb1e61b6a4563a2bb22d017efa60d", - "1ff9427b94de6a650c7502f3ec6f2ddbb8f4451d35533a465fbb21a4cb795691", - "594481edc5b24e04fed085239e4cca86c1162bedf54787a96687fe2ed92f533f", - "2656114e7749bb6fe448f17c0ee4bd6fdada190f8cefc6bf44c64e2e668f8d2a", - "c24d6f127540c6ed70b089167a66fd0bafd0f1ecdd08da5f8d099c3b5b32bd99", - "daa1631b17cab7230c8531841bab85036b66dd17a1a304fdc497c0ba80a61f25", - "52dc84e6ed8c763571f1574c5fea7ad305e3117d749ffd9eaa92ecaf24d38f54", - "87fe589653e9ba80f82e56af5ee7e360c8ca451393c9542f2514fb976734db1c", - "137a3fadfb8f9c9b1f9220d6b2608110c27a99db442035b199c6940be6371d7e", - "6e9efaecc82f4225466cffbc5efac97e1fa8d20af7270c52358d566a6e1495b8", - "897c8980a070844d7f9726caf0ef26b6bdd91e803a3da88d458a166874ffbffd", - "7a9bb3ab5a617d25ff308b305096ad451421bacf9d7a1274c895c058238bb352", - "4451d53840018ebbe7b9888a2c6a8dafc99cb67b965faac374db759a2d43d3b5", - "f69182d2ff86750d319292bb1f855b5cf455041b30280897bbf419a01208d165", - "7f96a9c30ad8385e011c5eb89e3698b581d9ec1d7ad2d2ec06679eff159be2aa", - "6e1d7218f39e01ee1baf97064426df5b1bd495b35247ba5ea4a87a09fe542e4a", - "032292c79f6d4ac7a2d10e002a353d660f47e7a11ec0f184194e85a1bedb0fcb", - "eb6a15783896091793b951b12234c590f18e978c5fbba66cd430da222b961459", - "1418fba0a14b7ba5185cb103b33f61df66a85687507f0ed61fdf4ecada4898dd", - "ad59b0f59000ab6eb31cde6f148508f474f01054867b41f49e4e329a7d7920fa", - "1c32a22c8e87b2b2f62a0409983183e943621cd96e9289ee638c6ec59da92d58", - "5f3c2506cf37f3cccdd0e41d04c47110a8301da3cc3f88f16e03e1c2187b695d", - "c60f64c1096b494bc7adc7fb4329ef5ba785f49849749432d893701729e7077e", - "e61dc73f4008a95058e979c6c19dcd3b39fad674aeb0ee716fe4b2e9f2c0f35f", - "d33993e77003d295381ed3ca8700fa0509d4f728e991bea7f3c43173f9f640d3", - "0f2a3a44c37296e7a64f01ed37d5d4bf32f68d754ecae9cd54a5d29d88377e87", - "ee5bb370dd841c29ba465a7ba512c1bca663ce727aa3873e946773b3c9f9a395", - "805ec8013f10f10cda335bbd04567833517e1a7c85d743c549bf9e93adce8ff0", - "89d1afb4dc04a12f83105467d17130075e6a9ec09b52bc551fd756580ecc6bbd", - "c7ff5bc6f2b14cb495d4f441ddbaad092dc93df16f7bd1d5fd8b5884d77ebdc2", - "c0e1bdb24b9e48001bd8ccb94ce5f2da1ab93f9837fdf0abafa4a0f41bed2513", - "181f1e99ee0cc1b67f9e55d14dd09338d581f74d33923907e25bd667bb05c3a8", - "ccdd7a70966fff593c05fe1d9c47f1b0b8e218d47b0e3242836163b0cb304aed", - "e66027398e1b2192e3549aaf4bda0f8363c3022d19118fa16496743409c8fca3", - "55917e404e5e60481a0cb8ab733e22d45e2ed2833e464cda61acd1c4a8ae4f48", - "4b8c60239e88a7e3c8b580a37f5f9916b216c469cb262b598b03d4abf9f20ec1", - "9dac241d4391659f6453a45874118a3fbefd77337e976fd3b467bef74a6d75df", - "7cead07a3839813ef04d387b920045fb96bc4be1c1c98111ec66cf39bc06d380", - "2eccca1ce9a42269d98262f47fb50c855a5362887101a2c029ff410d161f0d80", - "482658bc412a4a251f31494785d6f87685a30cf9e3b7ade23323a83131649bd9", - "5fc2cedfe01ee3ce13aebca9f7c10d42affda8c86f1d147af273e835117b3f64", - "5126c454d1be118c99fdfc35df0694259657124befbf264c87488e1d0cfe189d", - "8a9061e2177f44f7daa7ad145b2d71481bcb3d9144d40cd6328b7e25e57edfd3", - "eabb1fe0c1859e3905f4a6c753147e49d52e8b8c44c54b963279814295807edc", - "f0bf017ddb368d619ef746059e110299234cde42b8c6748f629ddb55e092c06b", - "972207ef61c5b7f0ee907d19f475c5f83a67f93fceab3de5a78a334f7642f5d6", - "c3b3b9f634965036c53004aff15aac21dcb5dee1bd116df34222ce5e47fda9c0", - "3c5e2c41abb77253695c1591d44bdee546227a7a341069f0274e39aa99a7fc36", - "915e29973fd923fb02375d6e5c30645fd3a3f8be99f11bbccd85e0b5d9652321", - "cc1c3ef1c434bfd2214d8f8e5667d9a0b319969807f35f33f721a3b8e732a560", - "4b7100de5e99b6d951ab9c60f83102834afe9703deca877085b5619b1a91c425", - "1db9f90b9badf97c86351798c69850e693018e0ee8e6d068629bc9541e168850", - "ca7a4a14b991c7d262e9dc64ee53d331f282ff241f77eb7c28d69ce2ae6f2739", - "8b69d10fd711e2199d2c33d3ab2f1778c681650f595006be2efa9dd1dd7bae44", - "7f7fbe86ba6fef56a03560d1a913f0b4ea50c8ae121a13fcce109ce2e5a59288", - "904add0af1dae2b99b21c186baffc1ad85884e3e53898af9ac14829ddc81cfb1", - "8aea3e3fea75107cd40ca4c87f77460c1da49c3abaa470959ab86c1052ca0c3b", - "ccb07581b75dc15c72f11a948f8a37676a605257d18d2addd1a32512cce73dd0", - "b098e41151238d4f8ee6c013e70d27ba6dc23520015baaeeb387c360bcba752c", - "b0fa648cecd57711ce76a69be4b540a8fdda6da609943cb6740b36d807579685", - "3995762bc0d2d29ef8391e12108d9fe4ee6d00f7cbcd6fdfc83720f39b780339", - "6e16d1a40f18d38d8e64870dbadc0a7efd28b35f661df133a2b80c9487507772", - "182bf0d8ffc8dbc2dc1efad37b0c41700b6304c1a229b51ce54c4db17f1e90ed", - "60dcf024cab0990ca1b6368acf9672362fb03544256f5e1a4b091e2d3b09244f", - "aae487eb1abd5047ab08c61259de7424e35cf9ae91382cc5de823318a169c53b", - "27241fd8e9344bbab4456d8aad52983e4db55448f3850bb27f2e57856ef513aa", - "808408397657de38c68adece990753cf92c03f660073ffe2711d08623737f934", - "568ebc2e844cd2b51d436d62455739e0688d103e0fdf9d7c34e7475d2572919a", - "f0eaec17a2bb7de03faa60c463426f922d2d89e16879519c07336ee570ff37ef", - "7331462c6f02dfdc53a89b9a582ffcdc5626bfed18461bbe03d742aa48402e75", - "dc7be5a397c9116feff74e4d342e2cbf1dd82c3464d363faf06a3d37b39d8ce8", - "4558a79cb670b817d78e462a235840d578dc9dd92b088e5090bb6402d25ebbc9", - "12464b6c51223e1fc948afbc268cfc2bd5e7f986b364d8a13d093830a2025261", - "27403cd95dc196453735f791009718230b09b4686257e3cfd9f0e03718d5c06a", - "89df862a480a5fa80226499bbecf1d8940e90593ab97588eaaff82b2abec534e", - "68dde459432378be21ea516a4a9f4027fb89bc71100ec9e8fe198237ab56d375", - "d28ba88c773daa56be29eacec008623b49dc4d863dd36e5f70bf2cb317e906bb", - "585f4dccfa4e111c307856bbee9848fcbf80f4f23025d2b5adcfc971aae2d7e2", - "a4c98f2c5e8a7f557b04d1db9003f482b4e44d6d15b5ec187fb6c8b1553a02df", - "d280e8b28c5cac3eeca4dd00297bfa6c4f7ba3481a35a1aaf6d0e439f9b8d3b2", - "115df1986a23fb17952b875380fb5f8338e6286b43779d4af0123b34ab3030dc", - "8e027bc3f4b89b06fbc8e34f3bfa089b7d25b0d16ee11c310643e6acfe6a1dbd", - "dc6398faefcf873832db1e0f7cea285f81d7026d81e69536d954e6e3d9e4aa47", - "de576df9bdaea3ce6efc24a01942ac97445f0b2bc17484f3749868cebc9a80a0", - "2832de0087185ba772cd6b93fb510234dd7a698bc8fa17d15d4e25c4bea47509", - "378781e7ac55c9786cde4b62bd25d6633526485ae249c13a2aabe59e46e7c17c", - "26d1bfb5e6c0cf8c1e8463d29c93362a658b21f15cc6dba18d0696e6511e3a7f", - "29fb6a1502b3f280c0d3e70af36e4bc4a1568d9e308e83fbf3033b767eae264e", - "632ad3dda5aeacc7680f6dd89663f371be01d57cefff425354859ab0b064b022", - "9a0433d0c14869fc4424aedb774451a14daa5daa7d39454c3fa1bc4f780b8434", - "8cb9b39c09b4ba10afec511643859debb6d2373f1b4a12a60c7ad19cd061ebf4", - "61b20a5e1c35c062e23e0f86f2931487f5aa05d982bb9e51858a7e49a0bbaec2", - "f54e2e336b67a7f0190a4f70455282db32342ceb2ce9416aa55739dd9b99b47d", - "a51e88e0ad3affee8263e3780cd88c71582321f344066f6eeed8a64aaeee9673", - "a8a8e94fbfe142cf1b81c466ea5e1c65117c04e86f4081f83c675e9c79b60a7d", - "f2677079cf0ee2663feeb7b3128393cd79e066d302c7984ee7fa3a27484260f7", - "dbb20db9557b23145306bf46452e506683306523c879b540d40263adc00ae771", - "f98df38b7503a5ec8315494289f3bea2e6da5d73a9debcaee19a9fbf86972bb0", - "2d635f72123c67d07cccca82fbc2f5ed9dd7a2582cee7b72374c4056638d2c60", - "673cb958dc5dfbfd18934785de2a629737d00a15cc3d275477697d15a09d58ad", - "93dc8e04f8ac115b7ea4e9284939d7b312832794decbd037f2ea7f66263a5be1", - "1c3ffbc4827f1824423f95cf5380f0d4241a9e44435193759d2f4af410e7e9f3", - "48a4fe5b2c2d3b5b8efd4bda6871de1777c8e0566bf5e65519f1dd55fa812fe9", - "ba7fc3e0fd0ef18763a02fddd55205b56b043b8437e7cdd8bb4eb9a5190b74b8", - "2eaf5e0dda3ce93387483d88b8fe30f7d1c760bc39fdca1a880394e04b45b829", - "041f12195083d6cd71890af2fc983786965105502fb6df7882235bc469a2c3f8", - "15f0107acf4bfc68306d9cc3d2ca67334ca02f872b7a73d20b520abab09e1c56", - "e35d1966b8af73e07f44d2f1b6e46ae736fdefa7bf9c655c3aa41ef9d258426e", - "bf449139f82e483fafa7b0cd835f739cf4a3546cd1e88098d0e79e3494d9279e", - "add9a3f7ac43430d11ccede87100c30d8452cf10efc0a514a21c67a9902f07aa", - "f3a83bfcbf6aa439feef2c70f520f872c122c78fa64031863f7de4f0f56d26f8", - "4d28de7ad198a6dc2930e81f255dfd7787f449ef2d06f8c3c516b2abd078bcc4", - "1b1dbd8f0b10c9ff4868e48c01d137702f0cfe757c3ada5a51f361f31e24a80a", - "de85d97bca00cb0810a3bbb36f7e402a0569a3b626cff7c2698ffe99735838f0", - "ab0dff39718ae8f5aa084c62bed86cf529ff5370f8c89a831e04af9530adf7c2", - "56971805bfba489c54c1c2b3caf335b29a2fc52e03d6f58873033f76bf6eb0ab", - "4d0dbe20e874d4e1475814b1fc5c865ea6a97680d1b43b033b5b8f4c067671ec", - "b868e74de850fea1c93ce41f8e5ef76fd884575bd27f164d2361d7226ee37e2a", - "bf50b6c7ab30fc217b99c95cc4533898df6a36fa8e541030c778229876ed5bda", - "953e4906df919d9e8aeee467576fa48415650a549abeab84fcd065ee02e2d87b", - "dceef1446411fcf39e20bf4682b92d5103697bee6c44ec9a3c9c25984b4a0205", - "be0fe43627df26770a69957741b629a9ea6a41bebe6a354dce82b5f0a679ae21", - "67c3087d4caa73f08ba5d893bdeb00c3d0cc5c1b6151b4a2979269beeca3e259", - "0b337eb4d7a8abc3f87023c2177c2ef9c5ede1b3606681c22b80c50280ba21b3", - "48b5b3c597001af4631da29c10ba95310c724f6e1c59dcb8034290fd69fb74cf", - "e76f64b00a5ec6d22e51ef7bb80b654554b80623e35a8b067c7f7052dfabac0a", - "df54ba9c2aa9b74705dec262c1b05d514b601ea541c3bfcbfb9ef20476468f84", - "37ea29b306c68e312ce5cacf27a9908a4bbdac579c5da2d2f7203899430be1f7", - "99b7db62a635a9ec827f00ee046301063f4442256b98cf84613b55540642dada", - "65ac60e8160d9726df9857a160986495a06853255ff9396cd43dbb6750801169", - "331c0860950d1402a4cc9739e9946ad1f037b93f7f1b5133fc9692e976d8b6ad", - "38ab3b21683eff11caacbfdc60380bcdd5d677e493e251ef98f3a4a33976ca1f", - "1e0d919036ec5cc380f7bd7e1e806f10800a8200eaf8da728ee601bd2b5641c9", - "398c99bd768f6104b130098deeff939dbf4f88e18df49288bd59fce5f28c3693", - "5de3b7839bd46edad2620138d70024e249744bcb715ecfa2465898238c6d9076", - "778b9289df675239ed0bfa567f4ac70aa86a75391818da8fb535eae485f4b387", - "da32c685e7ae0f29d7043fd2c7a6d2763447f202ca948fc358747d4d2a026973", - "a319f4127e643d5f79afe28a8f68e9e2175f2469adc14c9e01b8d97279b0a6f8", - "c2b85c868517e01df473955e81cd7ad0169ec24e496381c6fdacc481993fb97f", - "3de586751c8540e78298bd7f13f510fb8a8c2576d66067ceee1c3ee0238c2a73", - "3b5edcd45373f6d69591809d3d760b8f319650b38e3bcb88b41aba87da8fc1f9", - "8825cd50992deb5ec902b9459042a10fe92524fc0c8996e580e0b7d5f9eb89a1", - "605df1f59fded3ac9034ff4fbb099d76ef0e95ec2ac220eb6a6c1bce4abfa4f8", - "254f34ff8b8a2652c829d365afd257e036a35418c91f843f57202684392e42cc", - "5fbd335a199b550cf84602154c2bb6e7cdd4c72c0461868b533c1578fd825444", - "ee271d50a02fc9193a5b86a82aaecaac66057b7d8b05090410c617a0fc916eef", - "9cab609a6b8b0bbd90c94059fcd865dc4d55a4d08bea7fbb9651d9a2b298a21e", - "19b75e33ec90577817b503f703d9aa7eced5009024ca621caedec04aaf093479", - "156a8c96b2fe8b1b23b3c2938ebcd0394bbec5455da6b80fd216256625e0abc4", - "c8a5ed62f349275219d06455dc05def13b9e03cf73bdc18737c7ad614eecd45f", - "ed8cfdffb95f94c939770ea669076fdf16c601f8664184cf72a6dc75a5fc22a3", - "aa9a4e2c47b9fe94f4ac20dbdae1abb77ef17fcc75e1a51c549319bca1e87924", - "b1106ffd86cb1bcb91bb0a162326254d023b44542baad2875f0abb8f8a994f69", - "3c0077b5a6638f90259a6361a4f2ff3d3aeb5b2225236829a25632d63b79aaa8", - "8deb5b1a60f2c8ca78f6ee282dff992c35e37eec543b8bea4256803f034495d1", - "2183393652874e1ea7444a3435a8739435b2547514c689eae892cb43abf14850", - "fbf68067be2f618c73d6664400a5736fd1ea14bb3eae0e007b73dd2f39a6dfdc", - "2418e554482c5283e6ab61a8fb5e453088152ace518df5dd03cce3c08e4cea14", - "f0389fe1a2d8dbf8f6e0940e83e1b04d03bf304c9646f3676662570a3c03a038", - "85aa9fc00d3a2e53e796fc225535b2b37c9f087ae839082d4330b81035a139d9", - "946f6afe2dce5cfe5625f4624c456fd17012cd8cb7a39108801c88961adeb8d3", - "dca88976826de7434ad2deec07e032306e92b92793edd98ae0ab899511d83352", - "09f56ee7c007a86667af116542dc2f4671605f5d6251ad5c1d8070f47ec9608d", - "7d4bdc8ff7a942c969d8a155fe727cd6995aa4adaed1422dd3fa978ba933f8e0", - "43defd5f6d05f2373e40f823efc1d1a39aeb0ee6ff4bda94cbcaf9eda9057901", - "12e5382f8d2e4c0484b4f11939d4e7f197e9d112f32f1edc5d317d151667f813", - "4be4f453f42fb92b631b93c44d2c39535913e69b12da2db5bfd6d8500fb9f04c", - "2566182e2688b489090d52efd6a1058accfab5c3f9d3b4c7f8306f7bcdff83d9", - "fb0e89d28b5a7a10a93c414386194f27f5596c6e7cc1a553b05e82b968ad1be8", - "ad3f19a53f38959d0d054a426be75433b6f9d9224a982a0da6af2d6e18f31dc7", - "5aabcb12e3c663c361bedaaf87f32c00ae618b05c7be91a539a4de68a35e1d75", - "2b1b39e83902477028c60aea994889cc71d4b5ec3571ed5912bcfe1cdc210cd9", - "1c5a33f39a1e03cf6ee5ffb2e3c163937e98b386593d6a572d960a2dfb994d6b", - "fa522e267c2979640d55d90b5e6c374b6b84a9d4fab8bfb0fb06fdc9819467f7", - "6e6b18b70ab427fa8739eeddc630959b4745f33c7ea23ddab476f85bce24a869", - "cb12eee06f1f45d243431d7525fabd723c68540e495a013ecf1f13e1280d8d0e", - "07defcf71052f53e7e2e77866e599daf78c1457651dba1c65e566ce2ed35d3ab", - "fb9155399ea5eb0ce7ee6716c45f9d098dd56c1967a7461f2dab727dbb799a5a", - "e9535c9db9cc8ba289d7bd2f5ddbd150f7bfd0c43563fe34dcccb7a81cd8b9af", - "8b50e1d539dcfc979a4f8968a0b204df38bbbb1c31ca7c8ab0f1eda24e1c430f", - "b295a29b15336a94b463acacd60fcee12fc5af0614d2f8e43c10164132173f64", - "25e3f8bd6e0b43f5322fa1d1a89d17ca911f161815b132bf2de2700f11756d3e", - "63962de94e24e7118a932a8687bf6bf9a8ddb431dfdaccbef235cc88bfd526ff", - "2c56949d29e28c8186c58192384359f617c0ea621fca0bb0f5010c58076ba53f", - "9cdba754a23f88bd241ad14c05b2c9affc46cbdfdc816424199efcbad79f701a", - "e2916263ba23edff89f013d7cbfef65f6c873a53b4dafbf0d8b73aa4ffd812c5", - "7d481fd54ff4484414ed7b80048bab5d1b3677438b45916aabd3fe25ad118918", - "35bdbd64956d2c34e38803f7c950e2bf1e593583b40cbec01c2e0b6c6ae15400", - "c7aead566e5ca81090e3b280a1f147cc7b78a365268f95c7bb645f489d7d0d5f", - "ef5b7e93d5d4fd442ab5a6f6aa1044e01d293f157a409fe86ca5abf96fc85ec4", - "4854d1521ea50ed8b9b4662b6d2450d0980994975c9c45eca7cfdedfa0e64c46", - "14161fb8da947264be18ae6fa873670e1a8e2c5ea2a0c280503d980041a06524", - "3490030d3b42e98d90a9eb233da60ecb87e2a775a7a5fd3dcc9036a05dc80683", - "3dd8acefc1b265a9bf5437ce0be96daffa2cd567a08a85f3c0e851ab2a7b20c9", - "74297572df0025a16c69a2edcebbfe5144c2b6d2b89e5f98118121f471d53e0a", - "ca5d3ab5977b743989b48d4960d955e17ae75b6e88c267c9d433466c774e2394", - "1936b526f7931c1e14cdbcb67cde3e073b8e9d41e9137f50187fe04f456fd1c6", - "8fcac17f3e87917cc4db3a0e82a0eecd80366001f6e6943ff8b6fdb868b516fd", - "eecb808a37bc9e21ec3329097cd9bb593e3eecfc6fec7733b8dc01b230725a44", - "748626b074087508282acdef871d90c4a6d8a085b33f832abd810fe75205f3e7", - "d7d78ca9c9a0fe5059036d2bd14e7f4f5e6d80826ae4767c9089ea22d201e939", - "33455d34c4fce7c7f46903c0909ee96da912dacad8cf0730141946274cfe6006", - "100ccbb2492a4c434b238eafe44be21ee735e03e63cfa5558f84fed87031144e", - "7680138778228fee2675c8fb653aba33078bfbb78b90d69cd8defaa452c8024f", - "6d307612e33101fab11efeb8e7e0c89bc8c9c64fc90e3c652a47576ef0bf3472", - "5b2d749e5a5a6eded35965853dadc0f54869987d9a43c7b4085cdff0d9d4e194", - "d8dc76b47eda8200f230bd09104e206675a278d15a8a1413dd886176385887fa", - "cc83630b4b2049bd7328de45880af24d78f2e42b4a884fd186e167084ef27e73", - "49f311be1ebc4c854b3afb614b3af82e1654759abb9301dc52fca93d8ad3eee6", - "253b45af91365fcb7e3b8db58f8f7d0e926d11efec514ea187a9246f37f07fda", - "31e4b32939f31cc56a75d32b57ecaf80807a28bee008f326d60ed857a938d351", - "0aae809384f6aa6407a95b808da1e1110078f1c51af3e53a7fd7c97c9928a9ee", - "6c49ac4073153e2220d4e8f6b895eb65ab85fb4892cad049404c3fd73954211b", - "cb95d6744b5fef9f48cd83701e736640f0eb587845c4a5a356b7b57b674eacce", - "86ebf33c8110d05e0de5be092dd6232c5ea01bba4233edb619349fb889915834", - "464ef64a83a637ca091af24a81deb23f17ea4bc51620a9dc17ad3729ea45f2bd", - "59576efbaec22457db2ad13bbf60a06efeeb2c7aab8d730e1cf6cdebd1f2cd4e", - "d8606c4a34af50c0acbb11e4e8391d872f725cd6a009154a3b76bb685db8d349", - "296ce746c476bf10961d930b951f892a3c1ce8c7705f3d4e30ce8f368b7b2c22", - "cc0e978684f11865d49835d920c46ab100ca225719ab4314c33001efb52d15e8", - "0bec130a951ee6c081ba127b0107fc723c8a8bcdc419ca62253f874ad138b846", - "efa482a07d4439666d3b6beef67ecc7e57e167acd61d85c842ccca1d3e4735e1", - "01ed0097420f510bde343f0970ec47cdc637f9fb244bf13e946759e947e3b56a", - "2f712d3ffad095bb3f6510f7f1e74f2e2fc438bad41271caa6735b4a6e155307", - "eb0606e34a9d96b41f847974bae577b39f700e5a350ed5eeb100f1d4ced5a4d0", - "577d451b4cd4ccaaaf2c4b43040cadbbfec05ddc2ccc9ca11257a9b4b8ae4ee8", - "f34dd33d79295aa61daeee9261d8aa16393268134b2ead538afd239c4f91150d", - "5fa23a9d7e52320ba55dab396b92de4bc54aea2b5bb0071e126502e279ba2605", - "37986a3158f6d547de59173271c09cfa91c0f22a14de66c4d4e9dd85ddf51096", - "e7b50bf602ab1819d67980fedab5e7c713ab8fbc9b2a5178cc0d4687c6de485a", - "8400dd5494775cce71c43ec12794b0bebcd800494c0a4284d025de465f95f59a", - "eaf7bd104d6e648005e304c08cc123dc3172a3af54718b701b8897020d3f83d2", - "7a58f4cc779d004c182b97df223fddc5b6472911825d9184ea93e8422d18bd5a", - "8cfe251f55c6fc4fa10ac25984c17f89167291b530d42003ee3e28af9c7bd623", - "b3d5d1f4be4655941f7886188c8ca803d888d3a4dfcebf5287cef8cd25f43892", - "af598b1c0ad7593f6e2d4f035f12e86100c543d359bd8de6908e926f78cda633", - "fc6b92b38d8a9c90761e651641654859dd8d0601593e74e5ed6466761c71497b", - "75113c29b7a5bf7461af81f1a1f13f7da820b1710f32162a0e655ca0ab1e825e", - "923435eede3e49324b0ea8f99efa27ceab324bd0cf1ca980830ddd83b253f934", - "e206f29893598e51c4b61960b61fa86d9672790c23deef94d3836b82eda37d76", - "fb16c439268ba06777f062c948be88976f4115513349b1fd0a0ed0416f0a43c6", - "3db6fd451b910a0d64e2736d29b5d37af77f7c07db6222678b9f32b554e995f3", - "772c7f188ad1647b31ad3c18f63556d4cca6e16dd72de577005a131409c84000", - "d0276760ec74ffefed200e697aababe716b2539aa54e62280ab66699475719a2", - "e6c29237fc413d422355f200499ae81d3f2b6cde39508bbbeeba6ecf9e5cb67a", - "d12398c3a1a04348d7ee8def12d78ef529640a423cfd5bf77801a93bd0be8e01", - "495e695fb083b9c065e92ade4d5ab4bc9049a993c50411bcdd5ac2e9f8a75959", - "93852d333a4280771363211d147f00bb122c725638c216a64e6f8bbe8c8657c3", - "906cc1a0487db72dded156aac05df37edd3ba634df37b187a1e0c9df90c84da3", - "0b75164041b24cf520f44a656d3f73be667e4e3a9b80a2183ff529628ee8d531", - "27f4b98074c31e5574bb6f60e29df75e138b8cd3db36afac1ace394b608b5389", - "0b2df580f7820335e6880623b3fbd72c26cc3e3d48a8104eb851d0127acff8f1", - "01129c636d6ba272ae6038c96b593ee80b3dff0b636b2f096d01d872d2b1de5d", - "c3f4e66a97c2221b1b50d1c07050312104e541049010357a01638c2da6a69c5c", - "e59b2e0b5bfc70eb87840a0f42c8de750d35398cd2c521de3b7f8373a3fd8150", - "9731be93c466f26a7a3c31d16dc9d827e1184813d8a98c6194fb5e68ebe8bbf9", - "a44b66fc68facf719f24e819ea54386416a0e5b1b53d1fd1601a65ceb84c374f", - "4bb26a7ad46140ff6a723c72c78142659654501c9a18045c447ab4771aa5f98e", - "19e388e9a8a9741be7bcb19e2cc5f93f5dd3dd4d404d257caed35e4577d6d9b2", - "25662dfdf13ef7baa451166a0593639dd9ec6673fcc01e1c08be80c987a0efe4", - "bd57afee54c38645dce2be859df19e6d6908320329be5a5e752fe6b9f72e5bbb", - "4b92ced53dba0aa101a6f0eefd015193c539d29451ead4b65ff55ffe888a0ac2", - "cd710264e5f8c4ca3f498ed1c07f546a019dc2d0ae2e998fe61d51a6d72ee474", - "785c4a60c6d2425a55ec488d9fbc162169a9469c8e660bec19be0638f51337fd", - "a0e4a8245d63816f7fd4a1bae99ffb6cd811febef7e461f609dd33803437178c", - "ca862946e7007c577b34d69b5506d2ab4e81e7d37ee5e7019f6985fe4f902f99", - "479ef9ee9d371d3bf544babe0a3c7182bcf10169484bf6763f2afccbd63e9986", - "8ceba2e95c4be3dbb94ba84233ad12b3a50479d4addfe25778a46293392b7072", - "53f0133c4a985ea80f6ab8648bf3be4135ff745e526da3a46004238cc614e2e6", - "4f262429537623ada85b103506f91019b4a8fd41f53b10155270e8150d8184af", - "c45ab989a062655243cd115109b035ba52e9311a0a58a16faa5967db19410245", - "e123a58e97d1f83b05212fa4d0f87360e43982283ac17d8a1b4df1260540510e", - "51241994e1bfe26b3bb2074ec2a55ae379df920b98ad22deae22d8ce49d81bb7", - "8bd9b754d1aa009141ada6f86b65a72342caafdc1c382d59c5568285e18225b8", - "13538a9b9555f9f472dbebb79db30256a4bb63702b5df0d5b5bfb9b007f16afa", - "78a4568e2c3b7b7a0f4576e47f4d23e214d7f899db8cbc0bcb80e269a7dadfa0", - "9152b3e62227bd77af14b9aaf69cfa9760fbae19b56c5268daa9de568e091340", - "5e1613c8c053f7c3da28ad5a1d118c7a9a7828d958809df7160517d47de3ffd2", - "9f61b3173489cd32b40c8bf61ab320329dfca8fedd2920b30fbf2b2c04129f7b", - "c64d1173da39089080915928d6357b1a7de09ab68163639920fa983fb9afd8b5", - "6c4d2ca8d70bc019a3bd490ffd8141446f2d702ae68f4e5773ccaf8509ed109f", - "f7093036d0428b28eb110e4fb71c8769ed8218f4722c451d5595b65e1f7bf7ae", - "4d8e7085fd1902092f58f3890fc44fa7944f4cbd3904a6a26b792027c6e1f935", - "992c0cc6d1e703fe58035d1100ed0b187cb08ee48494db032e39feda8aa2118e", - "d338e4d18926e3a9a2560fff0ab3d60acde53496b3f213f60cdd7d74763df827", - "a50dd8b69dcfb0e64a5248971daaff06c92cf33d788bb1be6ba6b80ae49f8ecd", - "a84f246aa105b388e6dfd05789e5257a8982c70c53af79dc4f119ced4826fff6", - "44d83d97930164a663249e2b71b32034d7fab43ddbc3d092d1dedbd4689893c8", - "2d17804b986926aaee1c0c63d6b946398b5187b7d5ab1bd43219d317493d0e98", - "22e4d05a39ed33e0a999ffd0a20b35d246081fd1e600c3bdb06acfce2b4f6262", - "7765fa40726af07f768655608c032582f302cc6ed21c76b757bcdf0f854533df", - "57de8cea04cbb7940d16f17b6079af6630180330a31ba7d7e8469093a84500b9", - "dd2187d73c9d2d0a941f883523d696c56770cb0f6caefb79e899a6170ebb6442", - "a86d3ed6409f2d72deac611461eee67e4f2b3400dd264eab162d5df335275149", - "c5d4c1ee2415ef9b9cd28c5dd1d0e6c2688edadf647a7d936236c599ca3763d5", - "cb5a2e463b1fa955af7f4f77cabf56c3d1957302b26355dcd9d50e566c0f3b19", - "3f2c22d496e2795e20183991da66c577d8ed57ab4519f7df3c37dbd29dc91a96", - "a8690758281bd670e5b0428312421cdd7d0a703186597f4e650f4dff517422a3", - "b330c8dba9a75540cf4046b78f835e9c8722d7a4332217ddb759fd2e4b3884dd", - "a2cae3704acad9d04face3d9898da8422c5f017cf4295439708697376ef52aa0", - "be8ab1826b072e8c203084e68591dbe2b8697b5cde9a6e8901ce53e79c04fc04", - "d55a43df0a7324c9de176c1d0744566de17013538909b61e063cdfeb6cc1f08d", - "72288648594c22f2fc41daf6b6919eb7f4293845724cae182da7adbee974ea4d", - "52dfd4fbfa6036868786b5b430f880f68d0016e2aa154994c96ce84ad30b46e7", - "1d6ae5de6ac8eb306fa0df4cb9026f3cb1a261c3ae07d95c6e76ecd9699e796e", - "5f9f6e96c3239f7d224ea012b30e32c5f662d3ea5f86ac9626048430ba7640dd", - "f5032d733a10b2b98d50021cc3be3c9716ab7ab1720ba998880f7e62737f7306", - "a2d806103bbc28926161081a35efdf54a3656ec0f0ed5d99eca615c9e21a448c", - "038eb3b2e62b163ecfed099ca5e35dbbf22321d8a962358ccbe3bff6a13be071", - "677783c04616158cd39246fcc6c75188719d249d81b29f1dc34861225161ba01", - "4bc663034de8d4a7ecf3686e42db329cf108bbaf2e378c298e6dbc8965c5f4ff", - "1eaf67b341b4ac4a0e7f63054ab786b568f9b1d32cd4213fceab59298f58fb7b", - "5449ed8821975653941fbc5f2723658493d98454c6351a51265a48cbb15f699f", - "b77adefd002416abb6aff6cee431016021af920c37a223bfaddef39252dbc5fd", - "bb2d8f5efc09296e606c83015b57d9406f0216ff7c7aeabb6062e4bdca6f79d5", - "5574e7083e6eef310ee115a8b7d0955cb0dd8aaf516151cb5ef03c76313263c9", - "74ba9fc3296e444a616e50e833469e960c3da09285e090dd26e319c00f17afb2", - "b4f44fefd9dc4b9c15457dd686bb326dad7cefd3428683b2df931393a602148c", - "572bd552318ee671f1071685fc463b19172036755c5b0c61282cefa72d8bb5d1", - "44a5839cc8ee63f52d98c59285cffc57ca8c03d1b95006531e60be0b1d85be5e", - "4d098d673376ca9a5ec41ee843c01b6137c4419c4e6ef7db652880d8a026febf", - "334a48287f60a4dbf334abab8a69a0045b3f1c7f94d1378e08dd8d5666106444", - "fc8199d40e29e27e69bd1de06441087071a7e4673208e5db93aaf32b36cd9f93", - "8ff96baf8991badd75e0b165186dd2de7a585dc13c2c39ab87c2b0a55972f139", - "18c2bd8ed6cde8581ae1aa9b93d46141a400ea010bd94a4049170b112bb49c94", - "e95d630c360e8df6cc9a587be21e1873359972fe0f305a02c40b4d6dc96c1b77", - "5a8220d7d509eacc14f74959220810fdbde0f98893956dd6ca1f3031a3c56bee", - "f619d300f80a81dd29df905911d92d232501bb4f3f4b083a66821d3d7891dcb2", - "6e292d55c02b19fe30bda29d443a79e7a83dece6a3d413d00249ddc14ea4bb7c", - "ce34cd3393b8242fe7b19e940e866f1f316c3676bc930a56a838e13823a51822", - "f560be2e24b2d1e9e96e1ee1f77db0962c592bcdd3954e24b33580062057f253", - "62ff1ce817a36a51dce74257c06907d6de5adb02bb0c3f65941cdc93507ea018", - "d37aed07f5cf9bb7d246f0e7a78d94767d8e27fea5dda0498dfcd9e2b7474fb3", - "8d7a0252f31dbae655acefe31c547b29b156fac5573541c65de7729175028701", - "bbce93b293aa5c89c29e8eacd1de143de4644f28fe0c36526085d825777e56ff", - "23742540c157c565f3961d2889bf5f9b9186399077e7067ee81dc117990eeef2", - "e96b1f05b4fa52461d272bda4741895cdb63ce00cbbb192233bc2ca939e17cc4", - "681523eb11466e3628d4dd00a20e45ecb3a368ca8dd1f7bc9fc17109030c2abb", - "2f3dfbe4cde8e3d8991a5e192e914012427d3ba33cb5c725fb52e20c837770a7", - "18ace5754443d810c37389b7bc598d6dbe44e365c23482bbafa3aecd73aa2657", - "20bd64736e4ecb4c234888be09888de305ab3f6290f32dc926942dc764b66922", - "af31f7ea92313c75fc9a8ebe004f9fa4984d7b01cf0585d15ab1de5007b87814", - "9f2ed8567867d9ffbbfc0efb63c514f4de82888b2f1d526e4c0826657fbaa93f", - "f4412bd9606bf369dd025d049c120dc26c2f9bdbd13246258ff82950889d0011", - "4fe2426ff838fbeb5eb75b4b135731b287cd93b57259d357e63861fafd3ff94c", - "8a304a406e3399162b784e92952a5e0a8c8feabb7dfce58e7861c059378af800", - "52c6b7523c99fa8bb26063702a9a87fe75fa36b0fe0ca939290df61dd27b2a71", - "f0b7eb9190299604fc227895d58bcf8ea8e63ab31865325a782a4e9a842f6b02", - "0564fd25745829341140ab5db0e51426eb8e5c93331186e090bcd9f46551fdf2", - "58e31bc0824abf1b54c9c7d629733eff0c894c6977eeb71bfd0dd2d823ac3ff5", - "a8471d0758b6156edbc221020d9761ee1b42d40608f5cca688a3e33824d76ae0", - "f2bc580ace44116cb07ce3165fb7a5fef98fae12cc8e133c7b9e0524e8e87026", - "63074603b3c4edc66888b8eab928a0850f4e9de861c1af013665273d07e725cb", - "e671ac8baeaba1dcce5c659cfc59d288e7faced3b34fc452106181a6912649fa", - "7c664db4b8b3e461339e972b0404e37a1f9b74e8c533647a2beb6f3122ba1753", - "4b9268dd97c3ce5e154336142faf94bf7e7f38087cb4fde611d70db1975a157e", - "16116257b0f07da8fb05ea467e842c637ab6874c7a2f32f41ef36e072750fd7a", - "2028c4758768ace294a3f7a422f1ffa005a5cdfa0eea5c33c6e11168762a8c28", - "8c1eb7b12154cafd31cbf681914296e72e464193695b5fb75ff7523974005e63", - "5bbeb1360c6d4cc51573797da5a519f7988dfa1fadf167b629965de9ea022c2c", - "545923fe6a813cfe4bcaead217c30610582c84057eaa44e0fd07663683d6245e", - "ab7e2f49a4a6a8c9df77e9eb3e12e258381da1b974f7dfcc14f8c814adbd6c47", - "a59271b0f1bc1fbd2c702fb9d0d6e6cd8481e71f10a480147fd68bd3e86a4fca", - "c0cf87b9f5c3f6c4e8146d9b962094bfa338bfb19ac1bf1fc6ce2404b13857e7", - "d0fa773f685766be459959d9772ab9c5b07f89d05c321883ca171dd6f8bf3d22", - "fc3c713fb2a2ff40bef2b2505bcafc9e870460c31cd11c9a5966e651cae1ac61", - "44dd72160508e8f36fcc53df2efc908964d01d93acb465189c43a74e58ce6b31", - "c44d44deee143ba509e6197114778aa9d571c7a78a0d95c0bcec783d209aeb1e", - "e2f9ffe7359f7d714982b1dc10bbf188f168dfb4ea86eb05cbf050ec565285c2", - "4fa3efd6e7029ff09b710a9280464f05990444833dbdd5f4d50a6aad11c4000e", - "f4fcae0ef161a0a655e914dc59018bcd5fcc7b64ceaf881b62f63b2e6ecd6863", - "15047f769199e4cebb5ca6ed90afc400f954dd7f05b2d33a737d0d50391506eb", - "1d02ba6e92fc014bea0a887522ec9522889fcf5a2fa4ae06876c01944ed83074", - "c6d9a27e1f594f0d8ed549069254413faab3bb376584abd826c8df52e4972d43", - "23cd400afdc980f07779495e52de8205195f23f8af21aac5636a56ddf2563c09", - "94ad39977a996893c0922b6917533eb4c9e4bbc5597a2a21215b70fdd73c7379", - "9e559f766646b867b0a86eca51477c7634ffe53a3c74c7d2ecc0413d79dd3a3d", - "c50fb8a760d02a22031c7ef4a0767d9f250ec0e84275b191058201d35d959f89", - "0cd9aaf06ca6b37eb1ceafca5c37123f62075d1eebe02714b279c26825980a93", - "0304ac8bed9b331ba4d08e73d45eb0ea627fe1d2fd092ca3161829ae2cf5b019", - "2b6d4c5330637bf65e9f68c110aa09ae8f27e943bfe0c17a1b611e7b883b2ed9", - "d93ee94a698d009a5b8f1d6df15f92ac1b3c7463611e11bd7de0cd860b36a6b2", - "c3b20937f35a302fc96e7e9b7567b855b36d5192f4135cd9e714f268d9e06b57", - "d8c713c30eda2f4f26afeea383934cf80eaa921b2c3c43f6762b71b6b8875305", - "f2ad64b962484a4a29e45bfcbcfe3a462b9c6826debd482709905ed8f1fd1d45", - "8924adbd7846cf2cadc67bc4b462e75ad616545b23c3176386e38ce5a04c5f13", - "4687decb7f34ddb8a54bd6036e7fc6361a5d5bcd660b3ef6cc00b38b3d6f6f5d", - "d65fa5574c7efa154455e272b46cf2145c69dc9c733b072f3a0ee035523c4527", - "15e4694576d72b87c68b5234037f55052e58ecc6442cd2b6c3b32531cda25a11", - "af40caa2736f1affdd3a8e7ed1b10effa69d7f78a6df82a033cbaeae02385beb", - "081c04ffa2aca5f0f0b7df4d6a7b15007735d250ab682b320e2d78cb6a854dd9", - "72a2353a6544706d82603cad1f4e9c6feed15da846e28e6dfa6ae298006ee040", - "b76c8c3defafedc98bacac82418ea1667aae68babc274b14e71324ac938f94a9", - "d00e9ba01ce032458184871998fb468e71a3dd837dcb4e2b7369b757a4fdc199", - "fd3dd2916206db5843ced414335230b61df6433ce136c44d92c5f2d6b33e0358", - "e257028454f20946b24d7f464dc3dcd937d36e01c4d4c68b9836f01324264d13", - "1f133875afd21d2f6c670b3e5df5e0091eb0797f6926b3e22ec11096485f87c8", - "a96d9ccaaeb815f25b8c426f60888a2812e9ba559ff26e0f411323d72aedeaa3", - "604bc797f23043612a42a408d58d5222c1638446a57a2bcbea3aef929a6af91a", - "45e8cb4fb70e96051b5d30f4663ad39f9d3b38fb2efc02baad8059e7224af7ac", - "7c64490eb0211b00dca319366586beef5c87e7ae223ae5642040ce2c2fcd5ea2", - "6f2e0d1ecce9a541ad83e60ded714137eee3818526b3d2a5a8fa5f084afe8552", - "1080f37e2d5468b80f2ca11e87093a6e406bc0b5f9f38de2f307dc8c23120ded", - "04ee3b8592e3d596eb342e2c0d8d4847c2c9fa39bca1e69cc05f2d2b8619cfa8", - "ac2089f95b10b5759fecae9c87573ccaee7846bc929cd3a5979db17523ab9754", - "c24dbd35c4365d3f9e5c523eac46be02fd2e8a243834bc9b8626c3a2685ff979", - "c563f4f73553cd20caa4ce52ffceb56a015452fbe5dad120f77bdb4fdec7315b", - "0e218d639ee879b8e3102d5175e0174c1409e815b2c7cbbd093a8c6fa0d52b5b", - "3aa39241f42368ab4029b7ac139296f41802ea5e049e080e835e92b26b95dae4", - "80652a46c010ca74fd64b9b5aba9c7d3de98cf4ef177766eb8fda0f70bbe604f", - "53016958f94aaf7ba0d1e12907f2a3b9d5851ef6964f4483227d806b0df98a66", - "7881cf33441c7561fb3a54d536cffa6ea57813a758709e3872ffd19ce854d1e6", - "0f38cb900c517e28b362747014c65dd6bff512c8d484a51397b16cbb0f74c043", - "0ea6009eb36f4ddf47b43c3ece6621f9217bb7980c7e1582407069539832a30d", - "203a96e836e4f1d4bf159cb83e0735ec8d0b8d0d255ef6e4a3117cae904247c2", - "027ca543ad13dfaab6fc55207e766b2c97d9d1d99b7117acee9dd180127a85a2", - "ba957226d80a18ef78184adb0feaee240aed9ed52938820a9854bf4111de11ff", - "d905c62bb99868950cba6bb1f1f8cd7b341a1e15dd78f317dd4bf919815184e6", - "4a5d2bd4b0d925b67e64604876b09682a17da86cf1d58602646a2d0d64d45cd3", - "1d329a66a73fff7fbf10b0a6a126268c59f8c94de4c3d21f5679f665ecfd9c66", - "db1f59ded577a9453265f9d751c2058727fab5ceb5ede236a76d95651294d32a", - "75d4581fbbc8a3b31415941f460951c3c3a8b90a193b3cfb0a1f18317b469b21", - "3bdb7f5efc617038fbf81abb72355dc4fc834f6c220dacde2a50b4e865b0ca03", - "7b7f698cbde608dd14ce73d32ad26518d3793c06c875276c8b167b014526cb5a", - "9cf3c30ec395bb1fd3821a20f2cf35ba7b23ebf19f051f21f349e3387d1c4491", - "92586558d241464f0b315e0a1b242c85cee89a4d83cedcdb821bb32cb81cf92e", - "5f07adef735bcfc8c6b1f78263fa2c5e79542f629fe19d26fa181a2a84b8d153", - "11ffdb6d6f6395cafa2732e171b54317c542f3b8f77a21d1e35ba952740fb35a", - "ca7b895cd5700c7fd02a0d1abe414d558ff72524a33c66ebc642cfb6c9bdcee7", - "3487547647b21fea6737e2e4c57810a89728e4f6e142df4d59cc2bac15fa1d15", - "7174e021880454abd391488ebe9ab04e562b59003ee380a2a0ea3d9a98763d13", - "69b48b109eab5d25ec04c464bf650e73dc9c3f14ea40a016615d31fd7a9017fe", - "8d9455d7087d2eb3585a22286d61aa59b6a9dcee9d2fee80793a2659a4a7e91a", - "b7d129b888f7c24802ab1fe2783cfc52a789d11ed0843cf0280970ca634a75c2", - "86e548631f2c13ed260681c620ddf769f66b9146bc9dd11cd3838fb201de5ba5", - "e21c31030ae63b5d33bfdbca9ab0fb5cac5b9e45a42ba789e05d234e7890cc96", - "3aedbc9d55091f3fb4b378c65d063e1fd939987ccb82e1f05332b73ddd195c30", - "9f56690f8464c637dbd78c2602f20f7531a03877553227668123efdc06251700", - "caf6831c7e0775f07db7089e27af945ca7d23691bb0bfbc40f1c25eab601d2af", - "0c65554f5a1196dbfb949984cf5adcadadfacae3ec8fa1a23614a2794bdfc1b4", - "04045b88ad97d36c3b3750bfedd4ba1c8811ccee6b0acee4e43863352ef345b1", - "8c6d34b3d3307ff2c748ce195a6ac49b165433284f036d11c1bf17a870487ef8", - "80c5fa1a81596a3931fafcce21eb2f622ad49ebc7e8aa5f051f400c911ec90e2", - "0d89ab2dc733d0db0e4260ac4a5fdf557323beb7c6f1083c8d7a767b9cd97902", - "40f944b176d629a616742e8231597bfa236bfd45687a5aacb0d8d00ac88efb32", - "ec14d1c92981000ef3b5e60864895882ee0dc8e439599896475504c49c730410", - "76b9752a4342dd5c7e8fab7c83a30dde6a831c3a08167f4f417bfeaaf8269789", - "6bc581023c7344ce0a8763f9726209fee3653c5064c65b0b8f79c1373c58e604", - "1da942db145228dd3b8d8c1c684d1c875f9100589617ad8804dd40ec44be21bd", - "8f24f29a3c17035395ff7b2f83a560ffe17ecdcfc6bf5d02536413ff172e5f75", - "d49d6ab97ad238668a6ad68706f94bd9e9fe63454274542adf1245c34d25f5d1", - "386de2b28c72208a95ed17ea7b371be78848768b2f90e144c98579cc771a79cd", - "4b511b8ca0ca5f17690464e6711177fd951343e88e06f403f480fb29c41b8e90", - "6def9a32aeac3ceacfd6240226601e87f0391d6b18e153d662d8821d4969fe82", - "3c6c846a54603e75333fc077dae7b9de0a18608a1af096ff84e493f74ddff684", - "9e01fee2676f5d17472e7eb761d6d89676ba321fe8870e8118b32c7ee337b934", - "cee69bd16499c2cbbd3f8a53c0133a2ee27282e9cd3acc876ba9a2b5ead7cb85", - "cf0d3c04474fb1a51d2debc07ebff246a3ce028f8a131d072e6173c80859f457", - "90a9a01a9cd8c979b1815e50f1c2352184c1448a600a2827ac2238d93454dc37", - "8bba0cf5886c880483da9aef476a52ea701f9c785ae8f442087491fd8c5b51e4", - "af54336ae23d54ed9d7424a61c79e96881c9f0b3a2277e1f889912cc28749ae6", - "4ce1a92dc3d42bbe165b48ea0ece9b95cea5a55d3f681590bbec4905be06546a", - "a3902503f790e719d2d5edf661f759baee066c5567802f09e2012d94dbdbe025", - "5930889706add87e1c993867b8fc87bab697bf02054d02985e9c7d4eb329bce3", - "f782677d63d5519e124e853929f6d309a86193953b3063fea0b24e7e926ebbaf", - "c521c2b2eee02055726009cbc048c42f51b102c353e69c750478d3c6bd9fd489", - "d604087bbf71b0a15b6b2c43fe9141d50f42ea1d464b3cb4b26bf12e2c154401", - "f5fe119c879daa855a8f933998d4541e61fbe1b97180d59b9c6e213866bd0ece", - "57f7819e10c910e42f12a9a10575eddf6348e7feb110effc187a74028c5cbbaf", - "980d7146dccaba7d9f62a037dd6f80aaf042c397849d05a9d86b1dc2d6df7581", - "337769d575893ad36731f8b75792929f650bda2bea9e9eb1ae89c503ff68ab84", - "c53ddcbd1ae435a5cdb3540ef6914a07074cfe1acb338a2cf0819bc629aec428", - "a50a10554a60306dd8c4bb2d81827da71a10262c42ba848db8e36411b403f4fb", - "b6fa6cab2f2f044201534ea937de13251645ba308cc94be035d8569060a46c5f", - "055a8b1f4ea4931e370476f1d1f48dc9834f4905e7e7be385b6e2dff77ddbe26", - "a043cc7e2f6bb0bf4207b95a5e42a21c14f527adc43e82c7e5cbd78d30f234e4", - "38187d7658284f30d6a9b17b045c9b743e1b9b1c5a0f6518924874abcf01f068", - "d0be94516ebec5e6afd11742c6bb911cf86ca08c5cebab10c61005af695784d5", - "442bc7ef0c6d1d6f2d26f8f96e9be6ce04ff47f2fc28f2ad9a5c6f96261f600c", - "44f714332dd57c4acb9b53efc6817f7b5173687e7e2806f791cf3358b6250066", - "7b9302bf945e2956709ab71ca489c35723b6c87a96524c189a1577e97403f2eb", - "678cb0ea5c6bd0252291d646661dfcdee3822b53e7e7a84de558547be1335d1f", - "9df3ff459f160c34e3b7140128e6a293154b7c078bc717a1e618d6e19ae07fdc", - "a4d1008cf2b13202899553a0f807bf0bb33585414a1f18c37d8324d80fed3d84", - "2d2823c3a6ae1559792a50966e2f08217f95f89d4d1eb5abf465e7b352cd94cc", - "70da5d88bf51864be87bbf07ef39e76e97c28607192243d172cac1d3bcbf4107", - "78df38b774e8920a317077b80534743ff66bfcc5ed1030a17f61d7b944be38a9", - "c4ede4b1ac200587ba71e4f37fc78b072f0445413ef0c8b0cf913e36796ca84b", - "68ad59f50fc39d68a4e4634cd3542571a5e8df68e227772a2ec80b26b2bf6aa6", - "57e12c70b169bb8663925932cf9d20ade8ff7f498ce57f5fb6413a3142e730ec", - "650bb7fccc37289c30444cbd6a7df1c576cd3198a81a7f40faaa0609f47f53d4", - "d83836f4247fe47535ad56f0de84ccc39bc773018e292365d968015769f70902", - "03497b658e6d264965c4b343df480b64f0c60fa70fa6e2e5d48b6d01e5b5f5f9", - "2c91326a43a408ba77b9c0cfd840333a93607a3f43a852579e2206e53fc19403", - "9c51de4b0bf8fcc109f53a7c1b6f3dee4892b2cea9a943b19042f61954005572", - "ad2dbf181e59d0b32c7399283c240be2da9584b50d9d30473c4e767847f43c8c", - "e233aaca835ac1f07775b85afddd2aca1c79661ae30078fcf9adc6d179d545a9", - "e8c0bd791cb3ff5219f44e9cfaf734e992d9d9d7bbd1dcebde859fae7b704751", - "3099368f87262715667022393865d1a2bf49b3974341a77d23fd6bc423709c54", - "2f0171709a19ecc9b8d3a6dc9722633bf9bdc498184065747e21a21d9c8ea49f", - "64e0c65336ec548d5fbc066c6d00692de034d8b8cab6e6d2f24141ec3e3ef0c3", - "b2093b0b296269b1faefa2ee4275eb824502817c0f409a6ba3988b48a90ac897", - "955f23b31db8d6b5346f142643997832729b479f6bc739bd1c7226ad5ab76ca0", - "6323d61359d7a1ea1fca2dc5efbb3de78349d8356c0ad0a7f66e6241f03cc793", - "0488079594f000fce08f317da0168352913abb99b8267a8d686bc869cfa63ab8", - "b0340a0fd96b8fb8ff63784c7068159c6159b493e0727f80ab7d144c62df6f17", - "122c3ecc2923b02b6ebf1b2a62c4df193ab39cf717da71a8cb061946eac31d98", - "0d1ba6e028a127e60900a80ffea9f50b30637e579293ff195d80f211651156fa", - "0c05b505c04dd64231475edf4c2c417487973cde3ad5928bb6921182301f29c8", - "02095adc5c45763fcb7a5181cc91ecfd5e0b45a665f64c65ea2ede5884cef9dd", - "1d8626e29849f786e534ff9592b7fc196f4bf012d5b72afbb397cda59a8a67e7", - "4f0ac549e9f77f28874429b597cfb51f461af1499f82bd13d510f3fe5d0b6615", - "8abcd780f4a3f218866d00df8d8278fb0cc4d88f8070572297503799fb2b384c", - "c7b1059a8c82de3c10ac2c1023923e180046e6c0edc3c72827078b403655df56", - "05904c8a21c36b262941e1baf5d91b955babaf212398ce47f0d05838aaf874d3", - "9c1b9b6cf4f208d6a31f07f6eeba59310f799ed8dab3525acb6f5eee430a6f00", - "40752b75935cd457ea11e08250e957ac1da15ea3966545524e0bd2a4dc573047", - "eaed1b737dd46ce01552ce3bad678dd3248c5fcff04798e0e0624ffa008ee199", - "e9891df0fd4b0910f186a014d4e45a306fc033901f13abef929e9c29a4a06bdf", - "6bbb9190c3f5d14a03bef2a8c24dc0de12e30c0a7ff7d0b0a448af2b81f2dcf0", - "ca06f5d50466b786d1c85a7062bc4bdda7983f2ff8da3a6dc75e963481d00ffa", - "171a4ae7594b716dcd74d1ae96a4521cd37f997d78c99e1fa0b453775b68e5fc", - "dca10d91004cfdfc5044d7b7ac02937ab864038a300c226b432f87db6c39769d", - "e2636f6171de139fc5f978e5d256af315e9e24164207ee89585281f8de2ca349", - "bb5040c0c018f69caf3aaaf7dd94d35a49c50e505c2e27ba9be918ea8487d1f4", - "3eec02c2f152201b7a3e6ef347fb9298384e051904c7c5171d988e33dd9c566b", - "4748a60643dc8bd8f81239402ad70e10f4101ba77f35c7bd311785d015beaca3", - "03ee68a7abeb7c50745328fbf06de7ba634417df968a83d7265bf21cc0d15678", - "4bfab63cd3e431caa75685959b9413e176bb500a05d229b9a698c7590b534563", - "296a40dba2e7e4c6cc342d86afa0ef016be99f41c7a089e003c09fad9e5016f4", - "8621eb5d44b31caabe0eb6dc21bc8bdc504671045d91a2239ededabe5ed8458c", - "09e711314ffaf65d23389f2069cc665cd066e33813e9160a5651453e440ff50e", - "d4b3d85cde39a41ebc16076b174976eba2da063bc23ffb7b86afd91c01c82305", - "b9e2909f759b7af2a0910e51feffb832fb36b144906b207a6bb41198d39b4a79", - "3fd779cab8db9e3f311804da36ba657882ab32bc7555eb8eee19b96a5c440fdf", - "1d5c3bce51b1d7805eb270531396bace5176ca043f8355932129a0a1d43e7c27", - "278d607730b06c6d806065bbd9521c5a36b2a231b5511e20996b5a37cfb73848", - "d918ac90d0033510c60d6e66826448ccf80d2f7a9c781be0a0c249bb93b7bc98", - "949fdd818b3fae6b51ef5998b2075de575b704ba62d7e30a492fae55125bfec4", - "508adfb276fb3c94a0782e3e4e64ebdad5e412fda7505c212390b9f6911d615c", - "1ea51cb19c5d2d8440ee162c3bda55b5b0ae7d6d4f4d5bd1afbc2cd42803979b", - "bc6d70002b4e8da93cbc48f299a7192362f4f3a1dd46d602e79982a75e1dda81", - "8651759ce8adba0f2861c8ff7efbad762846072ccdea71af1e78973a086ce790", - "e1c8afc678a32b4f3e85052629e4538630f613d4f6f3e78137142628923f25bc", - "2190ebc01d50257c45a410c8d0b9b025743faafe5ef32665ef20842ad2a207a1", - "9000dd4ba436f86ac5ac4d7f8e21f0cd113b1fcbc9f2038d214bd922a58589c7", - "4930539ace9e90608eb7b440405f5bee36d630d27e94faaec93c2103f4d7c82b", - "6e9268a62feb3176c2a81d785c063cbaea4a1697d19d3023103d87b503e55988", - "cedf3dcb5e2f159d70dbb475b49c6194e2809fe0458609544b82621e7db8b2af", - "7e3089faf042de00306c3a3750e1edf56e83ce532f5601225baec27106b7153c", - "8cf3f00a3d3d71a1b75d0e4781289c89799f00eb63910e2451f196e68972dff1", - "9a1f111f3a42175306a3898263ddf044d907e3843a7a23c429430812351f5224", - "338f847fe8eb6f10a0cc1df6cca8107f99a13d75bc0c6c8538d1b189fe4d28c0", - "132dd68e85843f5bc0ce30a0cb6d05dbc66f51a7dd4d1cc5abed37a7da20e536", - "8cb9aa9031c4b35028b6149c1ec4b1a467d01bb170c7e1c52acd51da1ff056cf", - "4fedce1878c2bcd920ea7daf716215ce798e985784e0684847e04eaf4283ae2d", - "00e87bce78a8c645b948286c719a46a6802e32d80bb286a06199cbc2b5a6fc9f", - "e499b8c3a3d7d14f6620e09f81146a686f845f9b3185f289224a5a6bc55b50c4", - "c3c81248544ccc729084d92811f8e84f28adea65e2674e64277029c8eeedbf01", - "80c0d157a241fbf115327e9624a132b82902c93c46cfb3f487c3b06cb8b98482", - "075d063e797e18a8b8b515834386d6bdd35b86f8fd57d607bf6ca7f796864443", - "ca6996a9166a40919080e0df6dbf261d52d8d09615f0d18e6637dcc4d2570f8e", - "5cab63cd030008beeb1adbc4ef753cf969ace3af7c3887cca742f8890d4dc241", - "f02b32b233d035b2aad37191239b055b45462daf542920700a51eb118bc9162d", - "0a6097dc6bb056dfb7c3203874cdac1091855a4ef8e05e588c94667bfa88e22d", - "8c860b6f216f6889cdf37072e2587f4dfdb12f54cfa813c9715049db8f7600e1", - "a6c938f4d1655576f7909607165e68ad44d6e24368dd645184b91c6058e3dc27", - "deb479d5192f8b1ecc9e17ad931f87f412b06128a3b265c3e576aba71049e65d", - "f402ab433503ee31c364d56c89d4bbb91a36de7ae30f4f0e1569be7900250f5e", - "cffa4eb4dd5691f0b042c690f19377de0850c10943d73c7c1a222fe82e1a4387", - "d8d81e2859533d35a882e9a11f424bcf01ab343bb0f97b10f715ec46afd7b1d2", - "76df04fd97996f9f893bd026f0070f8e0735a2e785a038b3c7d0267f7f4cc1f8", - "00b84581d8bfc7a9104eeed7b7173ce63598dfecd15eef8d89e046e60d80207d", - "0454af82aa7ece5a27e95b443da9f7d6e511122a88455162c4ccc8251d30d30a", - "5e0deb5a66b9fdcacbd19c95dd46ce98bfb6310bc9b1aa78741a3004ffbd3cf5", - "f96e44fa2b664351f047e0fe645251ecb663cc436d0f355dc8fa7c212be5e949", - "2305b95add565246582270cdf0657f2f736e98026f6f2a2a9232faa80e9e9ed3", - "4dddf24dc5e0be0009b577e3ab490749e0f1481b191eec369ee08e8dc1607432", - "1bf16ce4de677f4b057ef2bf8d80e712e9264673610aa7c1b9f08615f31733a8", - "d7620cdf23219635d8d559379f0ff0825746958b9d3b17c9ca7f5f5a5170b7d4", - "c70360d2be965c694502fe8082f767d3859befee12527247d3c775e8dbad8346", - "fb965dc7e415bcb375af7b198a045faf616ac4b2b6658ae7650d704730558e5a", - "5e35b62872bba329905afe0b3f0f43331d3e954c3aa77517ea84bdb97a6e233d", - "85f5cde87a2248131ba2cf64df94b22ff7e2daefbfb7238dd9bdb84c7c1b660c", - "e9ac28c87b2642fa6628f8c4df5b811cfd02f4a205a4b86f619d06ff9182a7e3", - "e5725166e85db80677ed4360d59a18b8a588a8d9f58b50a0abe9250ca7360c1e", - "7abfaf9f84f38f4eb9cd3eadeb3fbff614619518639b617a7c71811b7b4d889e", - "50e2cb9d7aa4d296421c994bbf1275eabba52bfd9f9d77593d00f968ae7c2ff4", - "1d353b0fef1422b856450fd556f5270ff83ba721004eeb66842d9fffe16e1e04", - "6e6269d8e9b4748eb52d2321acbc23f67a7bf4e5841152420a761768c75159d4", - "3f8e9454c288dc9d0ee86e4146babc1117e426f746150cb51a017ebee3adef6a", - "8caa9024be58a440b13bc84ca36461f1a1d373facc26ef9ded0c3bccf5b4e4d6", - "cdd1446a15c8a0d9b824fcddd7aeaf7a3d599428d9eb1cab7b393e538626db4c", - "c7836e3888e7f57479a77c4e6590b8ff45756da01ff7373d6622358391598ea1", - "31043de7b1050646527ded7d04e2f0a31d8c447123c0627d1ae3b6a81c52a316", - "d03a6a9912b228fd05a693a94c396f517a4feb3c3ae220b7497ce9053b92708e", - "a50afda32b63f652c243eb32eb2cf54bb01568def29d5c1ac6a455ff57cc5ae6", - "73e59c300af0a995c1d17bee8547b1ab4120713991956afb9222ffcc9c38ccd1", - "526e02553f98f14eced304e97498d7544107fd53b64d03315efca355651fda10", - "79b65dbcc3247b1605de3eea6badca5bf3449d02273c6ea79ef5c52acb91f3fa", - "1a8009d0831137e78d21b7f2d6f97671948d1f0be956a9d35d8b546d2249f6b5", - "7c0cb1596a639c33a9dbd9a53df41f3d4ffb88ccb0c71681ee8ae219db6a5288", - "4750ba51fca6f72e27912c14617a368d762fa1c2a3698f087a279915718311b8", - "f88f1b2117ac79701769a43adba30b1ce47ef3fe5948fc8f5bb1042d83e44066", - "914a4283342630243726dfe2e1e8e09c87cab66e916bbaeca35981c0d774636f", - "46048fb0413422cb4692779afcf35e3301c2887d11fb4a89c3b9f595223dbf9b", - "80bda2b422be0500d2e3647d577099ac674f4324cb7350e058379a5e5571804c", - "dad19d2042b76b585e661050ed9b8d70ff9f784503e9903cb5f0050066c22706", - "a75e89f026f72c5cd976167d4de895c0fe586f37571eab70b0d45c7a4940a33d", - "daa87b145a32c6764aa7a5f1a70d562aace9b3aadd70ba8277a437eec5afd295", - "18d4c8cbf6bae3497c864c3481c89ec1e0414cc3e4acfae32bb8df5abd544c9f", - "df3b8832404c99e006d6431253963fd922cb6937f5a529eed3b660f13e63949d", - "ec83a04dc70f8da511d7000a76a2e93c038532de04454c5c026159ef9a6d6dad", - "afaf4cd08ee14a809c983b82b8876dc60c25bb978fb7ea13c6ab4e44b17488f1", - "0a2a2b6a42743ea6e9f32552d5bbe84e1c400970aa29c2ca07b02732c5cc5f41", - "93e50e107694f3c2d3210807093d5793e69c289ec5b58153339485f94b4c724b", - "71da4d4c49e7a37cabf36e154f09c4d9e57e44d181b7833af1206eace9c22292", - "c5feec014248eb06b60bfe9c1bb91601df9308385258c05510732c997cfe76da", - "46a6f3dbc298aa9155ac5d21b0788c05988bd93260749fe082645bb2a8587b29", - "c89c3aeb87ad631a515e327dbfd1fdfa90f040c23dfa9cb3921269c30277cde3", - "61babd5d1b7e9d73bc46519728c69a1d8b1566db5467b22413ede0f155353bf0", - "705ac4fb8e59c75ba8b9afd215c48ea4dcda48aea3d494bf35a8a1896d3189f1", - "864765d1b817853793a81e77121559041d89b79bbd03c93a16ca4fd28306241c", - "563e8f1e466c1ff1285a653fcfb4b804d884810ced5c690cfb9eea9725a1bdd6", - "02ef4c3d6a502c6adb7810b6ea37897f5552c75738a5ee82a47c694f91bd560c", - "88e7fad3198f7a3eead9ca564304484c90f98b64350c32627fe95d01bb8cb22a", - "597258998cbe873ef30a5a07e7598c20fbb0b8119e20638803cf672c6e5a60ad", - "b6d8ee2ce7f40a1ed5d52524ca3b1d0ded816a9222060df064aa86b0881305ba", - "ecf093635033ebfc73aaa2432d36ceb1253ab8fa9041e273349c11af08536568", - "7c80f53704930c76e8fbcdb72bd53cbe15b40dfec8a51458d6f13df9c1c821dc", - "de72752407e5c65a0892a2b4e6bca0f801dfed5d04cdf62836056d65c9167a32", - "2ba701457ae5575d6c4b93f43aea159c99c621e61818cb6809d67e0c0a525754", - "59916dd58605cff8dff2c99e0d1df780540d847cd8b84ec876a09de660ea1c40", - "dd38009f33416836ad372a2b993f07b1c6b6bfed5989b1ed27d92367094692c8", - "95e3989c9f96da69a8255fd7b837549e2d15061b926b4803811b768084957dad", - "cad427478af403e2958571f3e9e4eaa14c5bccb36a2fb65cbf3a12927bd38d22", - "53054538f358b0e3e5c6422689a87ee1ce4d707c84a85b5bae6e11d3f736b7f1", - "5d55e62b8166c8045e659b391028aa2cfd758b76d893eb7b4400c0765116ef5b", - "b3d13afb2b57aea72eedd7c9fa06550ac84188c019623030d6a0fb819f62dbe4", - "a52545c07c9bb325c5c2e83706c671bfe3b51834de95e1def9fbc69d610ff775", - "43ab2ab69ecd9c4fab8faf7b45924b2df554ba204b9f77fe522cfdd8dd91284c", - "633d7d81881269cce2b44903225d6b971e4c64d5881bd0accf20569d356dbb25", - "9b9f6095ae325a6917cd324a048211bb9318f0cdd7b28973ff453ec41830d6ef", - "9877abe951f4431643e6deb41fb1db466aca34a7334f521c671f645b3df5e5ed", - "4c393f14058f494eb6a06451edb852552e43d7811d989af14309025e05d09272", - "283452d2feddbc281c536e29a4a764dacdceeb1563d749402c5e34425b867aa5", - "7c83c6da1e4882d05edd87b1f08e167a006f98ca7894b986eb4eb667b984171a", - "af730d75717c1540e328b707dd93e03e52a64e9e0614d3d8db0b9e5acd614bc7", - "e10bc9c3d6834201832d752130b4b96c48fe678b16af4a9cf8ae8b1a35fd2f83", - "aea0b43a80f4b2d544d60c365ee00cee10de876a83510f0186288a9bfeab98ba", - "5faee5b55f1874d8f35e1f3373babfa785ecbbad6680869a6b0de61f5f557228", - "0951449de47a50ca3c122df673a7b3e77926f0706ac59f8f9f59a924c75b6cd7", - "42c88975baf8314253487be05f2ea0f4ff00cb786e22660088ba0429e0c3fb85", - "42480ca9442d1a4214446c2f9ee27f98bb1fc85be638fe47fae934a2dd5a5849", - "e5ccdda8ea87002c0fc157798da1f1e31980056e83fa07bbc0e701e4394a4169", - "583eb1b69ab6dd19cfaed3cf88d2f34365a0015b5ee59a292121bf47531c96fb", - "3d5f1d8d3e57347afc4623ad3e79dec1bee3dd5f0b7818513c8af8a974a8396d", - "0c97ecf4d7df7a341fcf0ba73389d4714ef0920149911b227c8d531fe2d2db22", - "ade21a92e1d7d8158b35d5518136f95824b03f219aeeb398f27791be504919f1", - "05d5dffc8bdf4080ceb84ff24099936d813b2b7207eb651a0218a999f2ccfaf8", - "a05a557c1a00e12697d1a1baabbfa96f6d97dfc2681efd249fb4c406e772fb41", - "d1ae4a9b69c080c641bfcb268aff4fd09de3a7d6e4ba4b13f30880a9a6691214", - "a760a38dd3a954dddfda66cffbed68a2e65f3f682a517c4746516491a640544d", - "a806beac707a17c965e4146d79fcb085907f9198a89de14668f774f3f41554b4", - "3405bfe244238b0d3cd120a241225cad8ab6ab4a9a9e5b45ec5e69945d93199b", - "cbfd6d4eb99ab79519927d6e21052a50f59d9cd408632bbb37926926f98c30a3", - "a521c2a4dd8677ca992a0668d691c5a2d58e186fd584c9ddc4040ad24036fd5e", - "18b39efbb21ee1f61abf29b2390fdef4f591ff0832ed479588f3f7a3733a7b64", - "7e6629fd9af08ecaaf96350fe3771f610f514cf0ebef084a301759de639c01e7", - "5a9679355c6b75fb36754070728682a80d7cd8622e502bde10cd2c138f67ded8", - "eb10a2b7a10f74bbdb703554310a3f822ea7f84beb2b056f97d6c5040050f649", - "cdb35f0aa7168058b5efce9b484171c9eabdd5d19de08542ca58d3a3d95ca9e6", - "a748b8c99e2df2b3c86dcdc8da3c1b0896c59b3146f01ed21662a9448669a709", - "a1db6b24df7bcf1e449c0346abbec68d65367753c046b3b259e5d15cc3fc9118", - "962997889cf62602c1e22aaee6dc0189f353307e75559f72c1d8c2a3d859c9ac", - "27b997b36946bc846248c8d4fca98281a65a0c1cf25fe31dad7e0741924f87a8", - "da2b2b58b11425572798c73fe71cc082a93c72fa3f58391df500227d9ac9dbaa", - "d65cdd3a4ec409b8fae462c91018c169a8a99480e8a34af8c536da15f9585b6a", - "ca2b09fb1dab1d3bf7257648f793c8640ef0fcacbba700a52b45afb5386309be", - "0c1553691773daa262b9452d999c5e427944e6e02937922ea98be55ee159a551", - "e272e7cd0d34456fcee95eb85b7754738f5e98ecb1595736b1fd3b210bad5690", - "6c2dba56e1ca30d3215b30f8471692fc39c5df51fcb66a625eca110df882018c", - "d483b8b2205d592dec16e474cacc04bcf28409ed9cd8808dcf3eec351d8995fd", - "734ef7cf055ec51a78ea5e21390c2a51f5adc4b934d3d482bc237441664ffed7", - "3a9d7f88b501a09cc6cbce5d5cf25c4dd9d521db689c1af54f65920bea37a12a", - "3954cabdef7d14a8498219aaa6750845ae923d883e01ea9c3a8c6d81cf3f719c", - "51e7f603f2e480f1d63e83aed2225b636757cfa9ce2d298d77bf1184badc94dd", - "72a21ca39d71e1116972a9f2dfe9dcaa75d4bf87d65f1c5447b0e861599daf1e", - "63b69b382a3cd5313b8a56c5e2982019653b9736f64184cd403d8cac1374a5c3", - "3d1b9a362c3d7e71f9e005a29dd453c2ee405311fbbeed0ff2c0e680b9d7f36b", - "af30f453f195d4733a360ac02bc85136d33e16892881bbf9750c3e1c264ef2de", - "878e1b200d81ce6bb37c0788c5870742d8afa15b10b2a7c2327dc4010a7fdd88", - "af5a9078687843f03fffa47bc23dbd821be349376b3f9a5923ed63163887a13d", - "92ea741fd03682c73522512c79b20a7f403e10ee541226b553614504ed69816d", - "e2bb51785172b42abba78d2650609bdf17cbd04952678e5f5c1c1976ac40abf8", - "b527ed9e84c5962506a0d8436e247b70559f96b6777a11c98dd03ea549621633", - "cde43c6cbcc3bdc20621feae751f4a15376e3292f548638f23f5f8a7e3419954", - "6c1ea7bab92295b9311514c62b315ef9a82052674960e0b61787d89306c9678e", - "24ec9f6694327300ab84f119764754469be67d199bdb3aa1edfe99f4f7249367", - "e6d0f898a83437e1c5fbeadf994ac9872fa8252759199e3fe8d8866df260661d", - "587d09871d299e8c18cc8f9a3e42407fa9d1496a1b0924ade879938ae5530915", - "0e69aad1d11d7c29560c9371504c9df2439908b9f3c46b7c1568308e8b933069", - "7a4f0ea3aee0f1f4f2281981188d9efc405ed3d154f82d69822a8cdd81579a8f", - "2bc465445e0a66b317f6f619fec1852e7e9cbca4da0473e7560d902eb252d100", - "c782d4f8ae29043228148ce4c1853a79b0e0f7b9483e494464d9515146f02543", - "3fdeea7bdac1229f1b072f3b2345b5dc9812fd9f8db3e3d344b6ab05656bbcf1", - "71cce4e5343ea55a5932131d779ad324dcf223ffcdf53b9f788d9891502a40d1", - "369488056c4569079008ed52495d2e9f47e7925a260e0e3723eb7038e951d7df", - "d5d72f68abc805f235f0d7fbc1310e040474bc55111e63f88ebbcfd79eef6472", - "4695101537ec2614f5463741fd366b8e943ab01db46ba66ec5c9e4621bcb64ed", - "3d61967757babe5188e11b4b21b3d51e64cc48c36769b74eff8232500ea1f05e", - "4ec01c4c010c0c7f1cce642b53301e705e45eef858694a29b737384e359b8bcd", - "33ab9a7b40b5d22dbf82a3745618f7bbbd42b74a0cbf7aba95a587f6901c82e6", - "ff91b57004f68d40b42a3216979708b36fd53e237c3798d229998a9b972c2d8a", - "830c97c2fee62dfcf430e4aacc33b0342c3a11a5f567c5d5288132bb7d334197", - "75b0c10b5b227824bc7d182f3c326b88d56dcc853815fd92066a400ae1171747", - "26d5771cdea1a30595f1f1e4ddcebfe35e451c4b9152eb9b44f5312b72886f86", - "bdf185a443c763f9d7758e6d1dab828d5f15e5f0686f0a238c839a4d40d0ba76", - "8aff10772f56bebf0ea4d0973dcceeb4d85f28b18c0bc6d11ff1571cee2078d1", - "cfe3476054cc6a7158d4b3c7cf08de5d34d37601c4bc727f29cf53a3a32dd8c2", - "bbfbda7642fac1304225e8c48f34b37b4f4e507dcba1075205a7ebd0f3d500c6", - "ce02fc7ba70898e148ea7cd50110ea4c54cb06785e1d7a73175aed47a68508a5", - "688eba427bd81572e566db10b72c686caf25596d74fccf560230086827d4955a", - "3923fbe325b04d7bc9e0f8a9f5d3be2c48b2fded3369cd774826be78daba5ce7", - "4a366a4c5699cd589026cbb5d3bc56b301457a3f701378b558e44f3fa377c69d", - "804f524f9e93b548f330d3b2d9c84efa2377c32fb898b4b6bf3915aff36895f2", - "8d639e83f3c2fc6f4fd8bb6be7d1bf4df334cfaa513a8575fa61e98a8bcfb0f0", - "f65146655a15b0b00716a112674e4d7d2e1fb29d62dda38b666fd4dcc012cde2", - "272e9bb5b4a702e2123bd952d0a48c13d18575ad2d7cd5e3edcc26703a5f0af6", - "108eaeff63536661e712a43d097d50599f10cb43f3f6ededc9885b22580849a8", - "dbb978d568b07b61f319a1e8af6663b8825fb55dc0516a409936002be13c2c92", - "7003e57ed7501bc23c690d8b316039605b78bbe824a237701a9f1913a585420d", - "5569d48637494e9dad67e4182a3273b00c14e3773e63fde04e1aa2f21727f245", - "4a38937f7e504ff97d840984792c3e1f745b1782f43ac508dacc558f931e2dbf", - "f09040a8ee40cd5cd5250c708abb0c3e80abafef1b9de12352e052ec6b892e03", - "942cf175e6f76adcb13dafc98909d5e39da6d421b0d65e54ca94923c35d7ac02", - "a1a436854227896087de82139eecf8502b0f45aaee9e705d4a38c912e5a70d5d", - "1da9c95c9390b9abc0bf7c24167a9bae0df015e483275ff5800ca65946dde353", - "7dc8cb68e854caf8ae8c91d33aa91e8c6c1ea3f8bfb1d1082e151ff001ff08ca", - "14d5dec3d6aa5991d179c5a3c3c3172abe5c078bec42cda38367a47079bd108a", - "d3d10ed0df65e426b07709f7b7bf6bdb35a85235c6a08c3930e4401e23cc418c", - "f5cccd9f31c0dbb74935a835cf008cd59bb9ef7f77ce6244956e007d2144a061", - "df5724e1bc0cbcea3f574637fcab9f339d8fb9b5ac95f44a233e42435b2e004d", - "5cc95da3e6e2f1fbbed88e239819020a7f8d7d8790026343180e562656ce7222", - "f22ea6b0edd8a42cd3bc099130e88573c02c5c7097592c3638f0ff550bb640f2", - "a7f687b03e4c5fbaa9d8ccc79664044c36f0f171f551254f97a134aa5cc70f5e", - "68303c27c80f730bc466deb769bc171a4bc307247d58be090bc7b05d67751a07", - "e5c3af1a2f5c41fc832f6e0818e34f37fd6506338961149b03de56e74176c1d9", - "9a1c0fbf60b803e3304a928f7381733a90aa5ecb5c963e0153d7e85d8c89ae0c", - "88be3b2fc61a77c032dcf6ba0b1fd5679c47e926259e956ac4bae8235adcfb2c", - "09990c9af8bf74cd9899e363f920b690c11f58986a2183eb2a568d4c8e72855e", - "115f98eced994820aa62a3de965001bd4c704b7a0338e5d34084cebc1bf76b44", - "afe07f99be08e154361b6e8b8f8db5991198a5bfb35b23b10bf6dbb7b6498568", - "0ec7a3050cd5802580b8498107a2d368224021289a8366434fa440dbaaf31cd4", - "5280f939a26bff56386d595d2870534e5f4112dded1bec444ee3a63ee558ba03", - "ca0c0602d80d65176a20f89f7949918b481d2bd8edacafa57fe6fff0a09ab909", - "c826bc64c33d7d1005b215553e3e35ebe1db004c51a0810ebd0c3b854362be55", - "1831d57ff9116c736b0d200e287c9498af421b6b2e44ee59294549b23cd89502", - "d7fc6836161d4bd8e9a6f5a4d4416f1701055d0a43b4ff6009172429ee39074e", - "7710bfd9ec93ae93c6cf545c0a78bcdb6db28820f4c8837f797953ae267fff30", - "165a873d9b8c1a9a28a0957d0f43c4c3190f84478d51ab69d7a3d9e8998bba1e", - "bef9dc4fd7ab5db0a015371d95c5dcb0624a1d0ca05f70be8e2ffc65ff52fc84", - "0f39d1dac567f69905e976d5f52d9810be5683e1f95231bd31b4fdaefadc2bd6", - "fca3f68a0bd2adf92707f4b95d3204c23ddbb06c60fd33256d9cb5b7ccbbb680", - "4e5d38bcca9078e59c14505f774e7a0552a52c6cdf6246a26444fce3a06a918e", - "65ac18823ef302fc2d822ad7b7ce8410c05c3c47ed4e7fd19676c36345a18bbf", - "fb1e9a96054dd2f11b6e3a70095957ad76b31c1e48885c93a604255dfc0b3a97", - "e75081fc320c3e213b472c9052d86ddc9e49df6275be8dfa15da60dadf1ee1ca", - "adab5385e3be52209478eb4bc9adbebd6c70d53f771303d107b62042a2d01078", - "b68324304ef0d1028b63dc9e30f34e98d96992d240aa4f84d5acdd1863f089e8", - "11dd7bf931d0b192225166746a554b72e32ff532675734ce492297221f2e7e87", - "def0cf77ae3aaf1abfc0f5fd842c0347f0ef5d21206f156ad37e479f1187f75c", - "7dabf4ebd2259c6ed13c197efe8210788a9cf90a7f2bd17a36e5420e17efa11e", - "305c586c6c0e1eb1628cd6207ac52f4933acdf68aff81dbf6bbc09551131c811", - "24972993565af83a9181e46c7075268f49eba2b47bd59110fb05825ef774a481", - "9a52da0df629a76d3d960a96dfeeb0794b9e82ce74e6ed1a4e3782ebee8bda53", - "45452b94b7d1d4e38c2eabc89c57f034dba730addd479c62c4d0db5e75b17edd", - "e89bb3089d99be2888cb414e396f95ff6c1a7c30c947ddf0602be4243ecd7022", - "9ef1bac9c55abf441a3a5bdf4ff8a4233f6da55d9b4d0ed24be1b6f7d4299997", - "bea6f54b1eac12f20318e38c8e88abcdc32686b1b6936b7b4cdcdc16cde467eb", - "b8ee0f0a6a0e41f2b48da988b13be6a6583c3a9ba107dde6157efc382120de71", - "555b7ab44ef843bdc64c1192f07e7dc99f84e7cd051b3d09c475f8ecd0a8f912", - "07dc2f46e02443ba7a54fc9b5becd96a29db08a515ffa05d57bcbf11e312be2c", - "e30c5de7754fb2aad49ec3736453148cd84c5566cdfab27584a38b0908380e93", - "6c83f4ceb666f3fe86d37d1eff769e26cdba2c88509ea2dd87a1d115df1ccdb1", - "1e1a83c4ad3bc91c918db4883221c08b0bdab10dcb0a965230dfc63cc8886d05", - "02b11f6713121cac7ca921c2e106cc6b6eb3c42eb9300342984c313032bb92ff", - "1cbab4e76386893ff5d610b859a70932867705f5f6ae9d9392f9ae22ac0a8eac", - "21514ef7c1ba49707bbe3106eff1ab582a14cbb56b4ed7eff30e95c2affac540", - "6c94fbc2fbbe7e4ca331c8a18c2b3930eea111a2e84ef6d408e9154d588ee62e", - "29a42eb4bad5c60efeda66b1a008d91173d91f9212875d564ed2cc5a995ccb46", - "e135e02c96f02ae72d426de028550c6b8d2f8096522eb4cf9a25507bdf651ac2", - "4c75092e54d17be9accdd68ea6d76afd94eda0e2343370ffa3f0e820594d4491", - "b7026ccb5c69ce7166f8dccd3945a78328ca66d7583c71fd2ed4c5e3bb87002a", - "010ba06d3ed1667f7922ef044606703815fc038a5a810fbb8a1417065341a6cd", - "bb9e538df2c704bcba7ead5ded937d1e16d89686f25785b84653e54c1569a796", - "8f954de9c1d5f61cae22b10fc1dd9697c0363221fac07909274ab2055e11cc6f", - "3a18c40cc7c469469af3c2aa36fccc5e5fcd94aba882091c01170f9f3fb807fe", - "ddea51acae298e6eaee1a9d6243e36bec951230336e798c290b7cea36589ebae", - "7fda5782367c724cddbc9b4604d5c85720b50ddf7046a9b68401524f2c126a48", - "24f23d11e88ea167a9604ca18ac9b93d16be96ade6a12f664fa8e88ccdbde601", - "c04e7b51eaa85877cc29828b7c6e9f120776e0bf8fa5c0a49d0025a1dab5f210", - "1b063260ce8cdd91f3815ac3157cf8fb7a3324c89b3018fc102258fdb8ce4a4c", - "4b45f08c01014dd1f524699d5053062f75d73ae5ef86fd3a55fe48ee5eb59897", - "6eb3664c5e6ff71ebbfbdcd677eec6cd3525ca144840ba2f71b669b4255a6387", - "12d7ed233b1abc9b58d20027c0971c0089e815cdc92a582b0e203f45e6d52ae6", - "62ac75a12aec5c9eb4937f1c6d91055d879bd4dc82bd0bd25d226ae029d8c52a", - "141eaa7d4e05ca024a821ddc455a9f7d0278b4d364840049bf1c2cc558fbb2d9", - "4ea4690a4bd0dee22ebaa8136a49c2a2458e98170db6bc323249b5f169d29ac2", - "4bca6132db5d8effe3d1eaa856e59d412deed6e0e012d6999bc7f9a77de5c760", - "7ab00af0ee44670823c42234b9dc471dfa9993de85aa2d0e64897f3b1c66d0dd", - "52272c409f9bcb4e2ceaac7f58b3c9ee5716e7f73146dc3c8785eb1200044fa3", - "cca5e76337222639956a7aeb18a013f6b1fa05ae52dc2c12589012bd478431db", - "5c5281580dbea52bca5ba49c0968da27293f6eae0f72fa3cc35eb9d4302c445d", - "908cc285f01ad0fbcd63b7b1945b004dc97708414671c509ef52a070f4516919", - "bac0e4466a90629fd76ba9d1f6bc0e8fffc848fbbd6f270f03675178a23f0b4c", - "8ea126bee1f76400d34d64b4de2378f513b24fe911e1e7d5a4edb1d6f4b47662", - "3c05c779c785c382095ec34b221a4c0c36068bc816bd0098ee8d4691dcc64e53", - "8b6ee75591900c7e9af97655a33c73a0f23023c9f6edad50babbec783096c591", - "2b1052ed14d5504fe9b41d0a8ff5ada5ab20ca75f5feecdd96b98beb36f64f9c", - "e8d7c4ab3e36dacb4827b924b7f00bf6c42a4090a55a1dd00ddf63c35d8434d3", - "1908b447fe9b3e38426756e01a4e93b6a0322f897d97fb0c7b782fd28757bfa8", - "58bfdf20fb4fbfd3d9110abc1318d6f426618c79a5e77772aaab791d832f3815", - "4ccc42c4cce27a86273bba5ac2e81ab271a8d144ee1a8a6e1f07a5478e06ff67", - "13f0dcd21dc8bb3f46ec304a09bb113f4fdc17f8a40371f1ccf2f48960ac4947", - "c0d00a2d29065f38cffe09398499f8b462be5cc087626b863c82f820f793849f", - "f19bf502c0f6188e0c34ed2b0e3892e4663cfee15d1ede7e8e90173f683da3ce", - "004ac3d2cca2d5f6bfe712f80714f7ad25b6d0f05930a3413991739cb3856435", - "29a11dbba81d34767c4e7f6d432eb36f91fc877bdb56f915cc83c1bcb6f42d5c", - "3e4e30ef381335a0fd07ed1c8148804e85194396e2261c76719ceeade3a29537", - "d22d229ca543b2691f2e13c0f845c83345ab7511b6a1f05704980cecc29acbba", - "f1c67e42352499c796a0b4101e238a2c247e7a2c73b68238a4a9fcd3e87b6890", - "f8d3b7765b3691aee7b8f187ccf73bfedfd239fb59abbad20a1b368286eb40d8", - "cfcc5a6469a0d14988e611f1761d1994432833c20a30a4d6e399be36ab34f600", - "840671ede142260de4fc9819437beb458c3e9776e550fdd73652e2d18dd8ba41", - "5e3629c643aed5af3bf91f434399d224a2d86e225e357c0c6731f38f06c45364", - "6472971edc48ad93fb2aa954d70cc6e2a83ce97fa5214cb1ce4c4d904476b265", - "8fe87f1eb4263acdf3d9002c1587d7eb85a5332e2995e67b6b68217582955fe7", - "858967c17d5a1b9e3c846595fe3cc926c44314df9574cbfb769e29d0543c889f", - "e87d01631ee07838f43839149b707638ccc38997189560c0eb69001d5c0a7a4c", - "2488f3d2e8194af1aeb697ad18892ce40097fe2518ea43ea0e1c81f1fff03451", - "a9c580ff0ee77176058ea74f3beb2b4b058821fca69e7b4065191f0e8408e0e3", - "739d615e9ae6f9009e9332f731803e4618907cfa70c5a885195c1806d84c61d8", - "09b23b2e659069062cf9f321f9b3b027eeca9234c00b89dc24e2db696066d0db", - "3fd9bbec64ebb81a5970bb079b7563366f9605c7e73920bfd0e783ab9d199389", - "7ea61c2790d99d2b4e3b7344cb8fd9df0dfbe3387570fe017de23c476cf5e476", - "2643ab95981d07904f5d5b6b7a66e3c8690a03834a84bb75be41bdf0a101e692", - "22d733dff87d325612b397e7d514446aaea5c0860a4d4e6cfec31939d2ffbbb6", - "2819466384d1df7656a0c2703302e2aa4e11adc2a3adccddc046b3bfc5b50d99", - "7e16fe1305fb713e2b11808f0d73e6c130ebba7ac767cf0c65f3bb864759053a", - "f8a01ba2dc213cd43ec7f3d0952b62971d22c4c102af19c11cdafa27f77666fd", - "4f365e93243fa327b407a65264ad4b56c23097c68db8a63fff849d8abbfb3d44", - "a013eedd87b9da84b41e2d375cb7cd737e1282322a62c5d7a62d1047a2dd7586", - "2542935aa0d7c02dd8c9442b8fb40a0db3397151f8856f557ebc65652cecd10e", - "19f699182eb7aba989f82beb6122674b02fca60f3aa9ae86d923aa9fc553893c", - "12b5787c9f4e4466ad210fc222b1569243bab50f6d426f741704541aa09cf615", - "6b1b54edac5e49e8a60ffe5e2a515bab49d373f9bb600f9ad1625b4ed2bf6fc0", - "6f5305d059baad662e51ae8efc8818f1a46301b7ddf76d587a6ce391d0394ed6", - "455c8cabd76e95195a42c731c157a0df5ca6177f22c6eed76d4d581eb9990f68", - "e9f4def435e93128171c506b7d595c1e08c025de33729482670527d159cad866", - "d7e2acb4d6dd51ff57cb2763f0404031dc5538e39df8eaddba06969b5cd69281", - "4c8379219ce116c20098e851aab43ec18d0263d481930eea4c6a9faa26346686", - "ae64eb73dfb31ea60b96c987526465306af891f264b383f2e3180f57edb66894", - "9f7679e73a4937dbb3333e936a2637dff5bceed398b675d7c44182fccd695d84", - "889ea1c0acd818c75240085c1fe427595bc45b80b56464151c781fd41fae0490", - "d774017127a7597f45c161c5925740629440e11d0ffe674782d9f9f1b424665d", - "c810aa56195118b35e6ea8760fb33e752375d4824f44c6265aa5dbe1cf3c0bb1", - "b6ccd6bfa01911edf2b9113664906a935def8d2ab946a6383310e9a411f26bb0", - "8e9ead6f25d02b87e74d0456b280f856a7cf469eecd1d950966d3e4d08a67b13", - "79a9c812667bd13a96fd5cd6ea9f2fed5870b68615455e3420308e12940d5211", - "644ee5ace40e2fc87d7b4421ba556a12707f32eee91d7c75f63a6db7ecdb3944", - "5a8505e4c8e8658898d6dd4af214cb7fafdfc149415185447852dc1d0717f2d7", - "64045365c2b35f45e0be3c6634801ff344267d15c4fbc09f349e47ee5d6ccaac", - "f9eb02dd6df1ee6b256acd1be1922e05c61f32b896026e9ded2ebf84aca921a0", - "04f92df36eb97c6cfbbb116a714b23b1e09f8a2fe93fca201836016a91b3815e", - "cc955786beae0097927000828819c023f5c07b4c58a4a07d2aca10c6206d95a5", - "c28b01d2292399c006a22d48c1cdec77db6aed78644345a1db1f945544986606", - "63680504c8e08acb87641e787ccb41491079264f4cad59ac4a19eec77559582a", - "0d614ade9ce6ab7b569cbd2024f0e88adcf7b58b471be970328545d13bc55a95", - "3d672480364c7b366cd9d237eefe1e16565e909e095f57e2d26c3a750171cf27", - "aa34afd91907caca1b2533c413236e06ffbe8563d7975c8e15f7a3f20b98260d", - "f6d24bc3bb01fad4cdacdf75dc532b89867153777de20ce8ffdde7ed7c39017f", - "23712db5d846fce3959a5391f6dabba54fa5fbece3ce3bad6e3b4f367f241889", - "a871854afbcce6c0a73868b9cf86b2a58a284a0044dd724b12b08e2c8f4aed94", - "045c6184eee649f900c2d7d355acb9c3967dec20858bf0cb99d517a94299da0c", - "00f752b1e3b9a118d4173f3d67b7c6068894c4eeb789ea2929fe69e29b493ab2", - "68496ac0f9a3a9a4678eb55527b499b100dd04866e65dfaa3ec5a74f8b618a2f", - "59207691ec9047f01028a67fd5f95c82cd6410a58df70a7da58f465ccacca613", - "4f86d04bd4df0e35caf9afad6e1207abbd0b22e20ef4ec9f38c56b32cfca714f", - "38876b263764f8d1c4e88201a54f4a7a74d0d99246fb3c998eeca5a3224e8592", - "6f7f34e977ae40007d85846a8461b56d13033324f5818f09a04cad7fd8e5d960", - "d3dd2df426d66d2e9d9ec51fcacf45aa6a1f28a049ad0c1fc74a55278d573ea0", - "85b75a9136b1d89c6614227e3fd9dcafa0694e86083c16203f09953c978400f0", - "ff2eceb7809bd8dc00684bcb1d4a6c6d0a4c37ca9090a9b966559e27341b12e3", - "8a1cffd95f1ccdf3f50f99207b71ae01fd8ab39abfecc428605d2278e3e4ab42", - "2f368d26efa457e54c5222f911fd35b98344a29ca5a04ff31c6b34abeb625622", - "6b3b16a018fe8127bf823af9719b882b9bdb441a1be14c34d6e445bf49bb2659", - "39b2d602029edf5e89e87581baba3ba6fc6cfeb98a3b774e79fdbea9ab30c8a4", - "dcf9e49a6cb9498c1e2207148197b5aca3528492005dfb59292726d8a04c3b54", - "d9f9b534245abec27dfc47dc688349d2f65cb6f6e48457b9722d3f33b6f34a0d", - "649b3863ccce5446a1083e7d431ae558d3714a2160ff31ba050f8f18dcf67a72", - "d371d791cad42153b5ce3ba05ae13ec4305ec810fd16547b9f465f21827fbed1", - "1fbd947c0744d3ec6b319a7d64bb8a4ce3ea366c43ea8c9a2cbe1ab09b932358", - "78c920b099e05693579d9151f08fed38f311f83e0a910365a3221b15675f8da0", - "f3e7f5dc9eb588703eaa733e5d976d40971a0e50b6e5795c89a608350219dc71", - "fb1b2ed3b18e792a58abbfb42ae9ef9f570baf3dd326c6b9088f2ddc314ea5be", - "a1cd52ad91c14b3d228907661872078ecd843cc8508c8472f97efe6bffe65bfb", - "4bfb46272db1ed75cf45d3abd8f84c135dd05a598c938a6194d6173dfb2ebb01", - "c3b8eabf2ca37dffb0c375abda6bafab0652f0bbf2fe9c9d7da52d1195ff98c5", - "dc161abad82b65ac79a04a3e533f13e718126f2cd82292f1acd1d89bb4f00583", - "aad6a82ceee460b0a87a96d5b2a75090523280d8eeed21f06147c5db46aca240", - "24cc1c062de3eaea928ebbd2f48b7bbbe838ec4fbc7b00448dd2b2b9262b28bd", - "62b6dea33eb7f28fd3b37fc0cde472ca0a368147ce2d29eaaf39d6b14b58bd33", - "930fa707b2829f4d360194128f40647b031125a5edddbd137fd79c7b36021cb9", - "639a59dded5450a9cbf840c351d6db1fc3189d89db2946327dedb58b98b3be95", - "7a992c717f14ee4ec7879891f8d53038829daa2cde18b94b275432c8f95b86f6", - "06beb4f78ef57cc21afb0e11d219ec1c245a5b9d2a531f05eee9b2e2cdd15ac9", - "df9f2e02dffdca7a2f17b37b013d2cfd837ba863d491a75f3001065f769cd001", - "c2f482c026b7dd2d25351d2fd45f0a52ba97ddb338dd6af6d01b85f43c361188", - "d55664e151c9efb8579a1035896fe60340e1d96cc80aaeec9fd8c05a0960a529", - "8a866df8875329f230ed922603a82a1ebf174d9f467aa04c0e88a9986dddd454", - "dadae9589468f84bca52727e4240ec887dbf206e2f017394260595ba84d53449", - "864fc8571ff27c35fe28f87fefe602f83cd90630bf160c4ca00f42125100c35c", - "5a0f92f754eff49f3a21b6a1fc891d769959cc3b17177b3e841c793aabdd6790", - "579ed8e96f7e0c61ae3197c2d466ec9d03a467b1e7d98f03696b90c6c9cc9afe", - "337e370887a9a3ab51230b2c9838959aef185bafdcdcb19941bf3c53f80973f9", - "31e0b03e6cd83279987c1e7b0793176dc10ecb4a933fe6d56d6d5ba2d43f0756", - "582b4693f5aafd9937cddad28280877b7b3fbd9b8006e4d6bcf2b2a12421ea05", - "75499d083a51e84c4bced34c322d15c3db77e97adcc369e49b50e71e154fcd31", - "74af76d29550d15224b110281d2d1d7145af4b69c6c96bcfb76824f528cba9be", - "7960fa7e5eb0bbe101fe4d789cb9a8a96aa06160a4d5d384fde18a1bc4c7f4d0", - "5368597a57ea91fa0294782125977950ca0a33f5778ce0fe3b60b0e8b6d6bd99", - "41c421df4b63d43d16fdbfb34003b353074b783b72af53baf420a1cfff47ec93", - "cd5ac26cf7db9e1466a91556f1fc594a458a2d6504e43f309f425aec80dda403", - "307f5ee240ef184a3fde1d7e8e38136ab5076e3277e5bfc1743df5f743d080cd", - "a6351427321d4fee61710eca85c2fafc6c056b8427afe2f99374a66022f8211b", - "65406dec9b3073b932d7ef0a954ddce52f95f8530fbc3e117ae1784c7f0ed3e9", - "f9f5c5384c29c08f1cd1f8adc7e33f00099fdd75f653906e5f9fd113db49cc4b", - "62ccc7ffd170acf50c087455d44442284ff4db74f238e8fa74e3bb6a0a9c58eb", - "5d4a67c23dff4d2d85a9d60f6cd77ba13d461eab786fbc887f3cf3223a7c55d1", - "80643f34c73fb72dd7d8c57c19110286088ce5699bf151f9be6b9c2cab12d508", - "5f9782eb4bf626fd9629d8822ca74b7e13b57d3663477625ad0955b16e055b98", - "55aaa1adf67e06ff47cb50864974a9ed4098d1431bdf3d262557a94f4c5fd5ac", - "9459fce5870b499774b2984a8062ac3280b15b21ac6e8a76c40a58affa34bc0b", - "6e5d50c3d036106629a8388048d803bd1f8ca8568930a4657879b7013a533ee6", - "fcd2b65ce7e21aaefa584c9117bc36a337dd1252701d10c2689332fcf202b819", - "34387862ca3cc2e07446ef9b1ab4210a2a24c9e447842cd85a9aab448d5e00e4", - "2b0d265eaa9a107bc981ad6a64e68e911e5ee4b955fcee384f9e6a8241de34f6", - "987a19cbe6103a0be7520a50b59b8333e95c41617a98531a6a4c23c67b0d105d", - "1f1ad4c832529e3aeca64892940713f7f95873c535a7af081fd078605b50320b", - "60eb884cbfbbdb0c2945952fdd055c636791225e8a088ac0be431c820bc6abf8", - "82143ca8d316cb7b11579ac8b68c744fb41aeba58c3246b154ed41e489473a4a", - "6d176ebfc549e7f2f212085d256b72763fe93b936f86224b9e53f2b547eefe10", - "9e877adc89182239206b6d41e30ed8d5ce028a0e27586afaa55608853e8bb906", - "8b0f42e0b856a01a94cccf7351a717334ba387d3345633f59d12f0c2c81a828a", - "fe989d81b7f84d748a86b03bf061464aac2a12026791ac99449b5ef799c46c3e", - "6500d70e7fba67f67c5a5bd8ded376a33c2ad9fedb0234936eca127bffb1952f", - "1de5b443537c73bc473482d3b5d5ba89e1bdfff2e7a8560a785b1b5f90eb431d", - "54f8efd91300e413357015d50bc9cce4e91039115999e2951873ad0a9c088a4e", - "04d79ff089b7bd9a570ab8c32f138d4027297aef0084ace5fe436b4704226b6d", - "ba1ed2a2c85cd55ae1e242b0cb333a35a60273d668b955a6fb5f63dd5da2cf04", - "148b0b5ad35ed03578de41bc5ac59e1102058a7aabb59e5d4253a64583d397af", - "063bcf2eb1cad79208342dd2f2f437f2aa9d4501dbd9154d8d818c4f7ad67950", - "e915dde8016e06c7c13e0241cd7d57b05305459baab312f478bcab69295b2a5b", - "c2c2931526f7af4e065be573f76af446de8aba957fbca1fc201f5ba92c62a6c7", - "d365ebff388021a21bf3c1ca1796b792d2bf28f0328542cbba8041874f019bab", - "59ffab2ff0c6ab48f9f76ab2d5371405cac76a8e783f0ce08d941f6d4cdd3d71", - "80326dd77372af436b442dba8b475b8d0081cd6f3b5f780cb19dc730796a86c6", - "1352fe87f98bb16b5ed9d6d375852f65f90fb94a473f0750207db2a68e70ee78", - "dd18c2ab3a4da8846fa31d2b01706af2e690821dffd5cb2345934dbefe1a14db", - "14ffe6e4690a8a21d03def8a92a3efbd88e7d9a8ec7e074ff265356399513e97", - "5ef674f54853e2e7f0159463d5850ea9f32b40caebd3bdec58e2cfa7de859464", - "8442644893e510dab7a2e63ddfb8ab8b0ea6b0adc032262b6a4005a981e76284", - "bca4f13683b1bef123cce6e5ac1b476896486baabbdd2fa30c15530cce71d4e3", - "e45a96d4403b59efd1395f923c7406af1fc93a44f47bca6697715099f2e17676", - "6ff2b7627a1f7e80b3793ffb4d7e350240d59f921a1f343fcce325c5005cad59", - "811505665b47c3e58559f575b4e50327270131ed9eec6eaffaf9b3a8afa2ac4d", - "29d93e7103bd43abdf95d46d8be3aeb3014de3d13eec098ad72e0bf5d3873c37", - "52781950efcc9d7605fc0a56dbff7e88e3724faeddb97bad26d064b04d4f88a0", - "ff29a8907e3863e82681cdc1909acd0bb5e53fe81da33f41db7357bd437f1b04", - "f1f22d5d1182a189772386ba469abac2f6c6de2861338fdc7882403467d8af80", - "5f04a08b55527cbdd1641003d230f2f61110b3b56dc979cfec448af6e8a362e8", - "211af866d8e1bb3362c6169964f67260d318f6c70c2292fec1fd9d58c79c44e8", - "4bff949a6c6276b005f02eecc8f728727b48dbf25d135e1f33444ac888e40b7e", - "5f649dfefc6e63b3ceaabcd6c6f302de5b79e7e298f337266455bd0499a71aed", - "db64691b3a7da5e1a20a6ebdefddf5fc34fa27c4e9c46fe7e6eb2bc873a0c989", - "6e00dafffe880010862b6a9d64ffd2df652e7f9fe1fa17fc87c4fc38b945b52a", - "7553a329027911d3fc98634ec3f5fdb230910286090d110de2da83326591190d", - "e7d8b3d50bfe72fb4cc8ca7f24780aa3db1084cf12dcf7775c707142f3a7bed7", - "e290be7d45a53406b5acb70b2088ac9dcafab13876517d1af3dacd2b9ceeb3d8", - "29d8dcf8cce351cc4453eb2069d42523888a6378fa2a350b87658e82dc146af6", - "3254b223688184a1bd6a4ad646a405e7c6432898cb6a086257fe16b753cd034c", - "fdad02877dc11adb36104a97433acc4b1f849d860b5c938bd78f7af685377c47", - "500cd2222fbd589e8069f9a6425a465525e290e370d32e251903e39568f4e41b", - "f5522adbb02f547f53d18eb5826ff0f2f928a03c664c5b1130e0d78d02377842", - "08af994126425dd05f629b1e025fbc53dd4c1ea08894a5b5218c4224bfecf535", - "3c482e503dc3a2aa50e3cb59dfe2aaf50f2a47198d21e7f9ecfe48b73078c79a", - "dc8cf03606a6dc47628cd8776bf48561c2f91e39b995eccd849da61e83e14ecf", - "452d10fec7b7a84d842232afb41449a57d710a247fdf68ce499e02dfeb6365f3", - "cfdcf5558e9f2d9bf909f51cf08ef151083c547ef00b9e7c44f8719458e19134", - "cc20e710f114a4fb214518278a7b6641e3c0ebc85a0c44d3bdb785e2626a637b", - "11381963d869317750b66b9f26f72d1affc070471b9c798d46c94e656b2705f7", - "b2e1efe34c88429ed707fec036a9511bd4744011ec4cad4bb6a45a7f9bcdbf41", - "0591c0a7dba728e0a12345396c8fd9ce5bf28c89f2ba35c9636e90e0f9e0c533", - "ce9aeab508a9b0e8d566dc7abf5fcd30867571ba7e7495b7a01905d9d36f63ae", - "794edb18dc61e6f81429740684711ee6aa586c2ac49d983f64397e5302578092", - "610621f01486a10129074deb83609d0f9d3d6eb2ce55413c95638c537ec64dc8", - "4a929722e6f79ddaa43ae604a06823af24931b1f3a373af801fcf546b76f0213", - "2e730b1e880969a69a4b64aecd541f13e8702f79b3a9392e3d1afe80a474060d", - "aeafae00ffd8f187cdfb71aeb3676be755924a144d7ac0ae768657d3fd1709e5", - "01dfdff670944562e4267d96f73ccef26f2e9448b246518a654c789fb176651f", - "bcbc8ef53704b70e3153f167c54a0b589e9435db2ef527c92983c87ff98bdf92", - "4f13255028c7f8d6abe7b246a927ecae1914c44c55ea6110412add2c17f037db", - "c54bb3d79a6a81efc5329f5102d6bed492950c1517a4003d622eefc90025be02", - "50c6d0a03a533973b1cf6ccc61017453e5c79b6067479ed02b5d856143576320", - "693a80fdbb93ef1821ae9ff21cbc0202ade440858c6018a5d984c8847d9c1e13", - "c7e00c91a25e69c9e3fa456aa686c3cacfa82498e63ba74e08b8cac756afa761", - "979270c56d9f8fd518b126c25b31db0f04bb3eee250a7c1d7f15811066bac3a1", - "cbdc04a13fbaf69b0a85ce9c750e105d8e13feb538d8b7ee2a025875c4054856", - "61420bc82a2e12298ae099092b7ae46529d2c6a493abfd01b32f0b51d69df199", - "c1d3ca3a0ff9eb23ca937d529a5801860518136f5719f021bcdc55b5747de1d8", - "0b8418778f665fed04c208804d6c3a1373dd6edbd8eb1057447085848d7e3817", - "1d0259d6329587f82aeefd4ca52a969695365b100708df1238ca16158151367a", - "af10f90c48fbf76c1462cd9600e10c7e8e1b708e902ee5f5e2563b188da04fe6", - "a0c7ecfe6c7d1458252a015ce67b694ec098314606b2f25a4f19f91248f60c4a", - "6783060e9648f8a42d7d3be51f5bac1ae036677a5b4c5fe430d1ab61fea50c15", - "9efa31398cb3de63597914f4846fe1e22a43ee57054407412d5fb1102163b43b", - "f2335adaaa0e420470632da2e80d21d567151fbdf104cbf33f4eac8b631c2e0c", - "463bfe3a6c067156d8469a13a21f8d38e83497ae07c47196e0a7420465985ce5", - "b4d5372a5b5a266913491a097884730295089c17e26e6d1cc520f3979efffb46", - "34b5df2ba54b1d362d0ac8da48a425834e565d5f4b508caa4dc27d4953a0ac2d", - "2892bad03f0c8b38597edfa1b064a4ea1f8bc149786688f45b08d7d3802a6016", - "5581b66a8588d5775c323ff49e5a46937edf66e38300754ec10d5fc589387fb4", - "51becd8395cd940462ef26c147b971fc7bbf7172d1f39f6bdcef8107fce87d9e", - "a199dc4a43e7392676a8163a589bbb0b68319aee46ee515441c87bbafe383132", - "9174a48042f965bdb4bac7bf1de87b845393028bb3ebb75a72f789f4183279e6", - "c20ec80f95a7791b297f4efcaecb25550823ad86b7dc6c2943beb73a4e7a6951", - "ce6693c05935ceda6876a2904b2581b9a76147eb62c3d0eb01b560745e36e025", - "e5f657baed4f11ed3a2ef0bb1edabe2290e6d9b233896c24f437bdbc76ef02bc", - "f8c26457b0c4e39255a4efdf4e185582415f73146ca8c2ea9eadeb5cdb1424bf", - "6c8c0e6a9bf866c07601db7250fee9ff7a5c83b1fc26549735f830e343bc2355", - "5d74c3b14383b6ee7d2e3f08a731796f1973ed2d91ccbcc51187365d0bf81c89", - "946698eaba5a2c6c284bf78861b038a05e276cae814a0ac4d9eb9a05b413dfc3", - "5438c38037cd46d55ef6a9bbbd64bb6ad4127425a03cbbd3c72a9649c7a669c8", - "68b7374c71fb7b2f69981b7d567d19b0ae0e7382b8a057e1df36743699ca293a", - "ef89d5f2f6c9b2ec74c9aa41686ffb57b8122fb48a20efced6834a1a0e27096a", - "f2739c4b39f02cc0854913a5c92455dbf8451641eacee2037e89a50dfda586be", - "fc5668813d9cc48231a522c73dfdff69649b62e2ab9a8a9aed91b2ecf3e7bd1e", - "fffb7b9e3d8f90ead9415a89368db84ff12a4a93356fd4b3ca24367dd14f0b86", - "ff9aa339bc4a74f0cfb95066e1f0b33e646778c6d72552748f0b176bcb08de7e", - "39790f6bb0aa321e59b1f94c963096e9fdca495bb7f5c5a38ca7a0bc771f4df3", - "752ad06a4b9fe99421001a51094c411da7bcd5d6d35d756959c1af0a0917f9bb", - "4466cf9529864f256369f1a007ab91f516a53f5da68a7da3930710a5cd3960e5", - "39e35e32a8dd0e925c57176a678ff674693fb5bad187726bb67ea5b55ca24981", - "d2a61989743194b5ed5df2efe99752da261d0248a2ca3b3bd6ff3fafaf88fbc6", - "60ae00c356ec82db34702eb23ce4f36a2ee0ee7b6fd02b45219d1f93b0c5da75", - "da426b44ca2c34a98eceafbe9a0877caa51bbe6d336c94d109d1e4ae0e13ce6a", - "3c1b708cde71669dd58ba4a4715069e7c576d7612d522fb92ce3ed4b3f37ed3c", - "11b53dd241a3640157a43eb690bc53fa91fdb7cddf966beb1cea22f22b66c659", - "05f2f7aac93856fd6a6096fc767a4e0e14315f4ae8feeb2da25e7f3f25624aae", - "2d7b172c3ddf8fd294dd7fb98bd27b1815ae48c1835448024208ea1c56defea8", - "ce3c3b918a4ce7c6b753ff08ddb3a433922b621e0262137e6df29a2bcfe9de9a", - "657abaab00c62e390ab89549afc17b8ea0f659647a48d7c62a61fcb807aca136", - "6fe931e8287631d93d7d1bf545c5ccc2a4d48c829d79532b5bdcf76a27c6a0b4", - "4cfa1dbc6b6d2af8f21a67f7b53e2db5bbf03ad567fc6f6b6775cecf3d80437a", - "25fd34a97cf51b4138b10c8c441e09336aa99f5f1d694025d99b35f5dcb7d424", - "129b105c043f55dd6a2c1206f2b77430addb219ef0a0d22209790b63dbf6569b", - "d913cd34433ac0077313370296eaffd65e0db6b9d92d5fab2be6b4e823d9e2d2", - "cae1c13addf416acfebfd83e80aa45f38d99f2c6185aa0f8b45c69f4f0f1700d", - "164d380059dad1458847c842f0d1ad8993be45073d14b436331023b8a82b615b", - "391aaceb411cf490faa6afcf37ccf32085bba543355df4cd3baacd0899e1557a", - "17161d99fde97584559cb3fcd3cce7e204718c0cc1cbecb6ee375530d07b9112", - "92944ba3776585cf41a1be4c47fe2086060ba2ca784e26f5afe6b9530e0d4728", - "a8e774c17766cff74d6ee18a0995c74edf27e08b10a7a20237dc936447f0b7ad", - "a01a4120846679b0d1fe014e652bb88f4021c00bc0980dcf57d048a26a11496c", - "cb78eae69525e00bf3410feebf9ed2eecb694f416dd285dcf4125599956cba4f", - "5a46913e01ad6dee2ee0d7faf806cbf6611c89e5f79ba13a560e6ed9d42da8bd", - "ad13dfad5f4dfcd411d3dc7070fb4faa6249c3d55662c286fa3543c8c5faa333", - "e4e40df9b4183dd5299a9efc41ba0edc7c6788738fa2d4f0c7d161eea75c563e", - "60f90d78a991060311f4ff8ac53eedba01a4beadd00eaa58bce36db5bc34f906", - "0d472c097d57135f7626d6e57e5ece45b77c223fa535d354fecee340d9ee200a", - "5b3e264b22d8b86682f042f05fb65f837857b8ea19b05bd13d3f9d21d5ea1041", - "35182594efccb4fcadba1d955272b7eb41b7d46be376b80b86929f0d5a0c089b", - "b0acc41ea69bd9033079407daa8562c6b229246697e74c0ea53274d39fe35698", - "b54b5f3bcd4c120c931b2237845abe84811cce2c2865f9c6d020d3f70d532c92", - "810956beae7286ba0fc9cc38bed23c5d0664a872213695892cbe3ab81b8535f0", - "80067237ea3249b8fcc7c732b83cce1de3b65512ebdfb9e0d972ff99f9f6e866", - "c208494bf7aa197af205110c2f403176a02ec550a397ab99d5bfa3673750729a", - "b9ec197d9e9e6d85f9ea11c1aaeecb0ab9e37a748cff3e94dd973b33eb4ffe56", - "c0f9b8b1d4a28100a4277502fde909779e8c5937701f6a18101c67b8475c832e", - "9397b6cc7523800620f15338374d3a76c39f853c72613e1897377d5c1b74dab4", - "2c6f561659138eaa46b6ef021215de2f0fb2bfd6fcd336079b18f19dcf5b2b31", - "37796692d4a28eebc4069c695e4a259470a2fc4d9623e7e333e0dab8dcb1f9f1", - "c62b75348670b035f9aaa07821e47a0203deff252ec168c5c351d26eaddac6b4", - "7b78dc11ea3570f539ddafa54f83457d0dcf5a611d2b0dc321ce31b76062f879", - "c00b3c65981c6f08724e71d4542df3597be71061b25c0171e1d11b54be3ffd3f", - "349144dc222fd101dba2f32d9478b9cb984b2977a0a835074a5c57b6fdc9dc5b", - "cf36527494bce83326d4cf7ce06119acc2b325fa6b9030ab4ae0d9d9feb03694", - "de1ae14a5a357e61565b9103d5bdb5434e325fdf625f58336eaca277c0902da7", - "a4dcd03b9603e4991ade02d28f00fc31c9439212f72d5aaa7d7f40740eae98e6", - "5604d3f28d04bbd60f165954224feb593d21f5f52f91320c8346fca00983a86b", - "950e3a9ef0dc73c58506cdfa96a833e8d04474b423e443bc50a25bc08a3f9858", - "f53cb681328d84b49648af2b180e031dde02531b729052445aea115091c7010e", - "2eb6ea7d71ee64cb7b99b8fe576102a66cec212d409b113cc304a526ce49d2cc", - "d9e092db48a4746250660ca66b56a2c908f8657253ea44a4ea4cbd426fa59495", - "9a357d4b365255a2627950183da3418f08e92fb7912e7742a18ab387190ca322", - "9ec56e3587b63921121d3c4e6c701458835af15b1be2d1deb39cc3ec0adf7249", - "472970a2eb52a990752aa672ef3f4f465d05be43dbd956e4d030f82cacaa4be6", - "9247f1634693ebcb32ed3fa18aca34be5d9bfb1f71cc6f5234cb682f753f1e58", - "08197f28917d1933c5ab1db36dc633cad17ebc318936ccc63176afbc2c9354ad", - "5862a964a4b22e628f68860a302d2d3e6de2e4e4e368761123f3463b9f9781ed", - "37f47a8ec26b63906900f644f7f5d83c9ff18dd594d414a0891ba2b205b74d3b", - "2712d6cb5d209c81cd26fca143c82af593dd34c33e8b899e6773127210efb1f5", - "3bf126c7e53732154b4e423bb4846e90298efd54e65a04bdee4fa09665a4cf25", - "44b8d2e9f194656041c8f86e232bb8fe4b061f3e37116fa5a7a38d2c53d7f68b", - "c12c6344279e88dd4f60a1872dc8f2c7dd55da462b418a67e20fdad0259c8700", - "57094787518620938f7147f4739c2e0399b7ea795baf879418d4701f9b520408", - "6572f70cafa0919eddedc48c60033981fbe7aacf4d2deccdc3369435d6f234bd", - "b30594a4f33e59c37cb6722237901e2a8a1fe37c9cdd4d9a03c05e36902da401", - "d016e6857153dc2c70e40c728d4f4b01e5d39fc649e60c56bb2737fac36d531f", - "6e8270b67d48caa4f2b5b5f244e0a55e6bb62263055713eddaab1685f6a61ae0", - "17cad887d9f9b7bb171fbd339bc01a6be825572619f32b1f2312d0e433b00e5f", - "51c94a8b99825c7b598bcb910700666e806e82adae55638acd086b68647b1a52", - "bd9f7980670c95f13f5f82ad3f06f29abaf6bf71d97c94f680423fded5738c08", - "603bc785fe031173e35b7c9b63994ef77978cb799fda733a0a5334074a6b3ac6", - "56b85c2bbedbab9c44b28fd6b69d92fd9e9c4c82440cbf8fa09dcccbd97c5c35", - "ee5cd2c372399b70a0c662aad29cc5c632cba442b3175efc27ec806e175d55c5", - "ee2b1c899112c7d83e979e61cd18385836fb97e817c8b5b64ad8313899ef1862", - "a253eeff04137445457695f5100d99060496e6ccbd44d5e8e9938cf0eeba4692", - "07e578b711a307482907fe01a6bf8ef21f2779624e0c738be5fa4bd321a9c395", - "d3fcc37b49d6d0bf08c0bf7d89974242fb3e126aa7c9a70b8f461429ed31539a", - "f73aab377b6182b0f5d72f15bd50d332bc92b2e18e4af195674bcd4ff04307ff", - "a0bda6866eb42c28e65e446c7252884726154afbd5745abee531449ee2030620", - "29a6c21518db4007aaf7d57db04a414519c4676c40f8d29f36ee2e54a6b3807e", - "b25df1f28382d33920e1a7401004566e91304e41ba716155b1558efb5c99ceca", - "c4f9db5926878ab039173e81155f145822612470425b0ed58de302484aae2ab2", - "f2ce73a59801386394b899a1a7a0a8921ec6d00eafca03c8208a3d662c365d2c", - "0577e98cd5153f53318b70911bef14fd71a569e6aa7827868a71fb3ba289b1ee", - "db07fcf4f8e9d42aa816ebc339bf69ab266e2255c42ea31a224f42255ef9af8b", - "bc6e88c6d368831b2c51f609fae5f066d7c0639f1d47bd086d9e71f725b0b823", - "00524f19896cad9705cd86a5be31b6cb1fddd27eb4f20cabf2b4279acc96eaac", - "cfcec267a20806f2ffbee7123b8f936f803672a7cb4103e7ad88703d15ff8849", - "86166d8e4a40b71c1b80b21918ea3d3fead946326b67a90e52f3bbeb42adb3f2", - "3406d954b767e51afde6ff6675709a6d6200f001c836686be4d528337051825f", - "ae6550659e6943053b169f143b726702ad7139bd883179380d263c604fac6d8c", - "b913d3d6653dd25a0635c09f41db5f8a1c77925c11aefd9f863499c81b2eed5a", - "426779dcc9db89422e92ad90499f1bef9b0e158464570f7ab19292c5e55f373b", - "82d35c4695d66788556672429858e0d9a5d2bc047b664f76b5df2007597547b9", - "54373e08f3307d328448a427c09314aa271d36acd1019fe54e4b0dd1afa441a2", - "b7ff725ab5cea26611e53623067e5a528eb19146c2cbc10ea866ccf325c916ff", - "27fdd29b07cd30f2c28652e5ad484d0fe50495a9ac0fd7b96e9dc08cb2e84fb0", - "aa8c255d0691689f4e59196c3507c2304282fd5da5828816a810757645d22cef", - "9dba31195bceed67aa077fa29f219ce1ad4ce61e640dd89f78b40654283f5cb7", - "5ce6b96d2c12509bcf48e8900e5fb854212dfb0de86a6c3f762f1da74db60b52", - "c6d056fb910d97e87fff48830c5dfda10308c80fdd8bd669656ff6ea64356c86", - "b49a9b07585891a92a16b61382e10ac173dd0134668989a7ed3d133ff9d40c9a", - "e043dcda2b30702b769268c641d39d5805c6f11beddfab7b646dd63da6e5e849", - "074a6c100bd8a16b21948be13fe980aab44936813e3242c8e9c7a823a95b9a6f", - "4260b47a35a9f76221b5a785a1f7955955cbe69d3ffe66fc19ff36dba695df4c", - "035168fc10a4a6f871201c275588d2afe45c1dcf0ae007b4b270f06324fe834e", - "8f08629156dbfca873b6cafa8280216d533629c09bba1ef1f461dab39d23cea9", - "b6a0707641d5b7ac7f175c6d65690517ecb64f746e44a711defd5574d037512c", - "15a3c7daa9edb893ee80c77ed04b9e88f37510239e16de92d0e94b86c7b55739", - "e425e6b71066c64272168cf6044a8e871b4e263a8f9d5115d0eaf38d7f99f57b", - "f09db259c6c6b320229d12b9549a467591329136a7732d0cbe5e18c40fb5a207", - "c1ce5ae7f103e1ff3d3237e5864c5d69b5c28707941c81b043be5fc5fc792479", - "139b44ac4d92992c139f43319823fdf792caf5d0f7fca30ace84fdcb0a5488c7", - "1c1e8ca1b25d57dac811b333332740e09311e22ede6c96a8e6e871c59023c823", - "8f7ee2a14c544bea10003c4a974e0c2baa62603934abebb6277aca6f1b36b21a", - "6b09af75293a4ae1349c9fa7ce1cc3e3a047915fbc19c70721d91e4deebddaac", - "26e949139731aa1f7ee90960b1b893d17bd32e9659c02e7f8361483c345941ee", - "5181375b6660bf8c544843aa3d5b020106a8714f8288c9bd1bf96eabdb34b621", - "6a8e67671fc6d910bf00a2a71e6a4a6ce79b4809e08edeaa1077ddc94bd1c838", - "0a0505af2840c4718659a3a6236ec5fb2069ba675b1de5b4e3e2974f43bb77fd", - "91810c2648ef1083e4402ae1b33564d3bc6a1efbcc62eedefbef11abf8ecf4cc", - "15fa4ccb48742af5f8cef832afb7050dea3331e2ca8f276665c02a9d5a18a769", - "13cd9879037af92a1a8897438746eedadae0766edfdad1555bc9297a2e594ffb", - "f3216c14da895d9b15ac0228537a12e50a0946d7557ae83038718b70a22ad374", - "3bb0a82f6a2bf951f450e74b22e766928ef33563968c94183ee66635809ba095", - "039ddb788ca32f0835d4a87bf017274e445d295dc32494f8ccc62ef1c5618700", - "f81b4c561fe1622581978120b64c0a089c31229240025e1d9edd9a849cadc124", - "3fb5bc8684fb8123a3e408a54900c434707a90f5efbfa16111e3008f2ba14f26", - "9c9466cab70d983635329a7b6f31117d56d71518c785300041799ff81488f3bd", - "fc224d41660803b21616d556bf4cef9c96d5bec6523ed7c081532bcb42aad401", - "c1a722b11d994804c3c9d883de91fe4d43142b2b30c93fcd7cbe838f12c16348", - "c2ded9c13d4f385578e05344aaadb9f26f3444358ef2f36c327db1624a8af48c", - "6cd958ae79ed0a619c9890da9622a51065a498eb55208a6aef679d47d59257e4", - "a1bfa0fe3e57abc7e46f064055bc65c9a17f009a68a2246c4f9d7507adec9cd6", - "01e975dd73c04df3dd9d3f0eefa5fb95a0c88a4507e893797ac28dc5961649dc", - "4f151bf5345f945b75b3ec1a040db9e0e4b7882a9fbba10a1267e23edcfaa3a5", - "6373debac2adad815e2d31f530f368739cc038e90380f19acd4bdb6a4069cfd8", - "7707d61d9001c7a9f9cca089482325430d38a4ade169b85f7546c543dce2cf7e", - "d82bdaea43e7e4660901bfd2b0fd0d5b208ab164684ab8c6c3e1b75152951bfb", - "f2f624a18a436412a527c3345d821d1e05ceac20d467f88028b51c4f69058a39", - "b1610c20d0d75014f7f9cb46a505e572f8213b2da3640bc5f4f0e8a72ad3fcb9", - "910d3bc3c67daca5881a7dfe1ad1230e24fe59a29a6d3003150e28cfb5ae8cc9", - "b0208fdc2b7f9363b7aa0644ec4e644cf975b550871b864e061ea1045cbc91a2", - "5472e1b176ed0af8e27e217fc07bea94424c3570ed3dca86f69c027ad4808c46", - "13d69de35b03b517f226b95c1156ec4e6210eefd2ea485b1d22930cca29d3e28", - "47ebcb171ebaee980de652ea3c37964b06bb9a91e9582f3d3eecc5121513cf44", - "e8745bb9617f2032c3b10a489dc546dbfc23a9af10102147a238364c66eac905", - "cf31c457f7e206cbfebd26be75ad466304ec53fa87d6e10f553e30f41ef9c040", - "7ac5cfb5bfb2caf57738ff1dc68fa3515cb6eb0bd6234002eb1a530593069470", - "d7189b0f946c9fbf61b17ac316031bfe9fe9cf439c986bf3bd9ba91cf24c2a2b", - "71d8aca646033c123aab685387b503c108ae3b5d8d0a43833a8df237d3e0796a", - "b14e2bf026a3fa5d9c9404fd0e3a4978bcb6976f1ad8f11ac730b52d79bca2bc", - "8fa96064723fe942fb211977ddba9cb51559cb527c4285b1f9a80a8be0f1c6da", - "2b6110c882081c435dc16f75e20da5407a9188961c3fe5f876507714ad00346f", - "4551a2a98e4033cb24daeaa7b1d65f25d3f20b2c4cf3cc5fc3c269e3c8db8bcb", - "49ddfa19d54c77e173e417bc2c5b071a3efd7aee50c639d85236345dd02a9b36", - "25108aae4207612d0a45eb10c3b281825f0b89339b7ef59983e35b104057d2ae", - "38c42d31d808a07ce9ff267645e1f666b4ab272f269291e8b4ecb2409df47016", - "5a5c0e4573d97fd0bdcfc64e2cb3de86b411390266c8c725fafdc6de5d842a62", - "5f004226480b1a5f53e15135f3bf4152a1dfb8e827034e74964bcf05617e21c9", - "ad1b22adede11943bfa8eb9087a6e6b512e63847e5a73a6bb46b2ddb591a077e", - "36397efb86a5ebdf757b6338dfb3db14500ce6b45303185e380dd8a4d0043319", - "a3339ff091dd48f818b712a1c4b1a78285ad2177e866c7b1fb570524449cf874", - "cc47b4cd89d2ef0ced20a81cb11254aed0860141e183084baa1ab7f1cc22e74c", - "af5137b860e6c1207e40965b1c593587f7d2dfed77391f4e5e075d7c0eb047e6", - "afd29fd136a9504f87c088daf3c3742410221682ea08f974610510061ebea6ae", - "f5e6017c5cb4a5dd1df2a79cb0acf2bb85895aec37cf82ffd3a2b785906e4c62", - "9c14df06f358f6500455ce0be5c84bfa3273a73e259ff412e8cc243f39274ead", - "715b19267527df4052f2dd65a510e6247d318d016448cb78f041af433ea75079", - "29ad49e056782b682bea92fffcd73c4cad61b41abaed3a82cf0cc16002919a0d", - "0731a5da965cbe077eabd8399941b87e674894627d3633dd7528f4e372c196be", - "07153ecfaeaf12e6122cf27da704d6c6e9f23b88c1388d2327988856b22d55cd", - "c07d5173e463106211c143d5bb1248aacb94aa03b31b97a0e4b2aa90369d6a6d", - "794b3e077c2e2c4b2d2f8535c6bf0ce7c64681ebd9c74ad10877b4800c11ea73", - "aa7714977869e6e82781930c8bb9fda75dd2d4ce7b579156474dd51989ecda06", - "72ee7020d7fcf097f7183cacfaf17656cfa882cc189deff9ec6644ad684a8410", - "7c930dde75c8b1e8491806f8ba3cb8ac27a512355c943c13b471ac78d9562805", - "0609a8c97761d29374e16e619c6c8d3866c8f8aee4996c353b4edd08c2e41e2d", - "9639ecbcd13b85bd806b2d3c4fc6255cae065e60eb8a8b83647e009df87fd3e4", - "987ecced9b379c039660bca4b6e04e72eb4ab3ef58afb8a47cabbd86455ded0d", - "c22f99889f8d18de1783ace73bf472958d95f8b376ec65b5e1be1c41f8a52baa", - "2627adc706f29e44799a1fa5a81f7fb5e094173e3916b7213e57126dbf716f01", - "2b315fc25365319f2e30735bb37cb2524f19f746f3c7a37398613a6118715d4c", - "9d6c80992430d7c11c7e8f38f62aa864dd8be60773bdc2677d24bab77b46d11d", - "54f06d77ee32f17c725dccf341aec83440a1dd843f5c2c2d98d85408ae86b9fd", - "9c1883bd8a22a8d90ba8113a20a4e922649a42b3177c88d4c75e00028a9b4658", - "d4264d7ba291ddcdad7342d4d0a47fcccd33e0853139d2895c4327422f26b927", - "855201a3e94602ffbf7bf1475f0ed8c6ad1490ccc6abef1d7c32d154a2bfcdfd", - "6ceb95f176b394d1fad3e5c98d031ea7415795ce3db284af48e7c9da291753ec", - "797bad6f9105638df3861f6d48be53fcdb86507b6e975d327c715f66fdfb193f", - "c93c418aa29774bfdd70fd705aa4703b35b3cdf316c4dc01bab6de67c759a845", - "e2a901510334e0d66fd2db026f36ad9dfaf88043389558c31fba529cb3a54e77", - "069f27b5ac24895f48b4e6f096eb0a6482c5efe2ef585dfbf4ea1c09b51390fb", - "8d14659853fdbcfcaee8a8916be5614fbf8b83d7c8540b90f373c779c74d40e4", - "edd9865559231493f0944c88f8e1e9c195c2c5f842d200b320a54bceaf929364", - "1aa6d3fa975edfd6d5f021662664bceea629566a7fe9604bc3b8bfbbe7af5681", - "0be17d4ae1ee77fac3cc8c2d80771b1775870e98088251cd2264b669e8873e98", - "f06bc4ed8c36fa874ff4a8553bbfbc8278263b192cbc97ef21bf1207be58a2cd", - "9168ff52db353875d0471928d7a05a494a4c505e4967e450db9934cbb280d8d0", - "c81638cbda16fd006f5f0d4520c161daacd66712598b99c50415972e4cfae186", - "0e82b69a219bc596bea5017ebd6be2fd07fa09b4be5df453f3ddaff759978343", - "3fc57302af35fb30c3dfae8448f39a8244c99d8f0902f8054a06273989cb31d9", - "ed3c641b577013e00de3666a1411468dfeb8129707b8659e89ee98b2c3ea42f5", - "58befb8dbd656d47c63ae34920ab01ad3028122bf854915361a55f840adb9f46", - "ff37608fb6b84dd5cf3be13e6cff8dc0cbcee1052e3039ca2e08c934e14fdb02", - "0ee68cbfd77d731360ec7bcc08dabdd60e5bb329f455a227275a63dd19e09d2d", - "a87cd6ac46d2fd6537a4991a3eee76e1273e1c1b9e42f7bd9fc2690c1465c8a6", - "a258233e14e86fc16e3e287c0b7eeec0f7490033d86188d804318af0fe0ed01a", - "3f8327a8f0d3962b872640b4c9f15d15f4052fbc383f3fc18722a9803a9fd8c3", - "50595bcf99d5bdff889d2e4f13745a8245fe4f9181cf4b6e9f31829be4eafa80", - "99be5cf6d19569eec5d98eb9ef7b128fb6321476963885cf1e65fe1dd1a4df32", - "170d852cbd045ec1cfe95cc3d082f2b3f136021c055ff16c97eafd110bdb7bef", - "a81e8520ef4f6f6d2da7e88287d1ea1ee6b5ff041d0551c68bc33ef2b75363cf", - "7c3f1cb46eafe1cd2d5a88dba93b63a70e4001434184af6a1589093af3f5ece0", - "6636392423d9c275de4d39bee59c1b42afd108e0c14bef645b82bde7325e6cad", - "b862cfe721264c582dc2ef0b79d2bf1cbee33fed8252da62e9f933556d10736d", - "beec3d498b284a7ed098edc2b6ae4d1630428ef89745264216e9f1a3c002f5e1", - "a24d8450fe03dcc436316c52fe706bdc1f7c06fe24ca0654d48139cd4e436e0b", - "bf8b9360bbd57b10c952e679b6211dbfba5e5b18fb0c23c56d0ca46d8d68f781", - "31ec506b7fec5c125bef05dccfd05644f769548c50aeafa0953d7e75e7ebd5eb", - "a7c9ac6ebf8a4b65f5ddfe8a7b84b11902d6bc3d0430491a9787b65a2ac62b0a", - "403e61704d4ba462c90a5c8c352ad6b64d31cef3a8fe33fafa6d7f44933ae01a", - "3dd58d89b249a31ae1d2008edec700ca812e1f25a2f2c515b1cc66a739aad127", - "812fa33cd16487ae0e0a92c1d6c97904c7bcd49892a80ff2af1e78fb31a5ccf7", - "09cc9ae39ff08cc244de6d3e677e296d2d7a3ca492f9dd217d133fdef91715f0", - "ccf85d0d6b467a0a9892b41d859b132ad9686d684f462f04a4cfc307500e10c0", - "d7bd612fed81897d1e44b444788c3b96031cf2c746d834d25de0050634364285", - "ee79d37218ca9b0ec5db59e50762a289e831cfa3f6b0338d2e9684e33546b27c", - "a49cfb0239edb1b810ced68c3d1ec7daacdc0565cd566d82d7142b48e2cc9b2c", - "d7a2fbbb710b8fdd8430406852d8f3bc7e6b6891bf76601f1c45c77ed838f10b", - "9bffdd77e86a39b75971fd42620ce6777ac09f453964b46b389a86f87197ef13", - "9cb9783bbd6a76c919aa9c53f95800db3c528829936751df2a5d9d686114c93f", - "e314f2717b391a30c4613b25a8add40e80e952dc0f9e98b153561e7d805cdf76", - "21f3597a24d134e6cf9b2ba0415a53b9d31ad2fea61378a3df7d6e03c5f2aec7", - "86e512750c4db5356e28cc22e5f11220d2aff3eae9fd07c3e868eed084c0c720", - "d31e8247a03ea47e1a16b34c33b4849b7905eaedf301158284ddb7f796b0a32e", - "898b9b7863386d9a829e5c7155fa3c9b64e4825909ee5317c3cfbace32989210", - "1ae3dd3721b78e85cae8826fefb2d45e0851821cb13c11b7a0b68211b249b8c2", - "111f521e2fd29b14b28f7167b0549e0b759f4160f97c5b23d3784ebb41c178fc", - "358a0ac895891b7c3cc33c9222ad537734282ff52669356af72f4ab87ffa3f89", - "d919fdee11cab95b9be6c41bff01deda6f643d3cf6cb80a46fb7b2143eb72abb", - "76da2a00ebc06bdfde3028092cb10147dc9a24dcf619288cca9f69078b61c87e", - "c3921e329664f8f61c13b962bd9661d009d3daef4d29cfd6e946e1995c74346c", - "74821ae12236c2c0de2def8da07072db911d3d0beaa72822b4f4f85d2e34eade", - "560308014e2158d6aff9f583fbc73dcfa85f6e981edea98ee2474d53f421c6be", - "2bd131942e04fb42aeade05f301fe949fceb99c75046f083dbf3755585050b17", - "abec26900bc2af2730e92d24030ed1b0f4123bb690e63c5a32ee555b18006368", - "30827edb36e98ae62abdefa560d0b0a6d44015e15dd01c7f9f0fd211af1d395d", - "06ecaae2afa707c5bd1a5c6dd657fec457587db6369d4930b02b25c0a4da21f8", - "797b56a7a3cf458f9eb40deacfddba40c2e1a33acefcd5422ae138907b070da5", - "13d5ef12569a47a62a1ed1f82ad5bb4a16735b388456026c490f9dc08c9cdd97", - "742a9b35b951fd7f28520a2aeb6aa9ce781a50115465f2c806f271f1b438c800", - "db7801129e91a251bd725aa6647f65b6588e9bd1cf5e39ac83747045f1c7bcf2", - "322e376c990074d7ea6f88e5d955d442ef9a5faee1590bb95b47be62a4ee56eb", - "b76a1791e08d8f4d0897434133af9a4106869351177cb05efe2daa779fd96948", - "b4c6c45cd968494e99c9f7b19237a59cbf63d945cb1298004c9eddd281359a60", - "9fcc33d9fc491a8e796a493eaa91f875dd1fdb6d2431a435acf4f2505031f2dc", - "78684284b3139739303f79cc5f11b3c44b00949610242a33a4592a4305592e7f", - "5529627e3b89bc98fb58704653d533e7b4fa594f056448071d0dbc9f26213412", - "b5fe084d264e4ec34455cc7249b891110af75873f9d7fc36d7b9e20fa0d6b58c", - "056b099b6d869a77a8d70b58211febbe836d7ba24ffcd64a0ee4fc3268cdd7f8", - "1a2ccc84576a8952858cf53475733f7a747b229f0476c85685b38b3c59b31399", - "f56e6c5d1a548bbc24b22d7e8ab0568fd6e1bc3fe5b1bb3dd48fcc219c9aedc4", - "49d955a21600996161647ee888ea200aecb15200525b09f1d6c7d4c3686a73b4", - "ddd9e76858e942ff22c626b03c26ec143d12f658a34c0aa46f51a5206c6ea443", - "8b53de9929aa0881103113b9f19f1ec00add9de20d2395daca87f82fec5c8229", - "24e832ec5281679316341db25c31a97931a124463f05e572330c6de724c04dc0", - "31881431acf6bd9e52c6e10e50935f0653702755b4f3a5cae427327e994456f5", - "1c974865345ac3125fdaaa68334a7e8d181e32d68418cbc3deb87cd68a40aeef", - "fab090f8bef506de7d211678745514f33587788fca676c6bfb4783dfff1eed20", - "e15b31ddf01405bb1f7aec761cfdd6f2ac222ab2774bfdd2e0e4bd4fc5349159", - "c7e424d38f06a72f3aa7b4db3502eaaaccf6d894ace849b582694e5862acb9ac", - "122ecdba2d2d9227b840c10108c2d57f2f235df048baa101f8262dca309bbf86", - "bb14c7929044c832e6ecac40690adb1657c4f5e0b479fff1186cde8af1172d88", - "103ebb3846fde91df1723dfed8bb6845c6b5ecf83a9dfc120b305f86af1bf121", - "b1c598ad002921bdd864f571f9b02a485788eae1b7de6ab0ba068feed7c1bd76", - "837f05dfb64a2f624d038dc080aef9b737b6b597043e0be2b020694b14ba0ccc", - "6de6733de850586cd6f51875c3b43c3240fb55318d290b51dc057f59d7fa1287", - "0467e89f6f2226af3be7353dd6fef670bf602e649bf28df5e49a0e6b57517574", - "127a4b027f3b81084ab52acab03ba15ca442494fbac60caf9474921246e4e398", - "3af6f6d7fb56bb2b7e396e5fead21ac95638fbfb0485780811ba21e6908e1788", - "a7efe4b5103d259310dfd227a05df28fcc4c0553a1f03b84b276cfb675b1c6ff", - "cb3d2648c8ee4f07139e4229dcd5813aa33b8ae576d48b39dce7d374a72ee94c", - "d4f9105af0a6939b69acf685b7d441b483d093cde525dbdc8bca52aaa86f1ba3", - "c3d74d94ac464ef20d1f3cb5c0da6a1ed56c90dc1d1fab9bb56d41f384bacaf7", - "52b5f3dfdd5aedf2dce5ea9411b6e93efd1e8db11abda75bb1b1d91b9022b562", - "e153eaff7c99182200a6b26302b754d956d8a0a59edd1fae984568634d6f0a91", - "f7a01d9a5e5ea4e78f6f2827d4f5eae74163bf4030b0d91c85ae0fe3ba33617e", - "d63a157122ff3710d7d06df1b3070a086f705c0897e988e023f36df38e438eff", - "8bae2388eda1a5b3735ff5307165443518b807c1306352385d3e624460537667", - "26e76efae004ab161cc7a7b8ec6061b761d484577bce0bbe28a0593892a88c41", - "8638888da3c7831e97c248eff113050629757a9de0ed3acf8e0d6daf1b4b97ea", - "7e02b9c55391d569421576776a3c376c301dfee6edcf7f2a74d2ddef09131f04", - "19ea337d4771097d0c42e45dd5f266151edc70574e2266184764f60c9930abc6", - "918cc48b6d7b31ce324acf6a68c3f137c97bde9262aa7d036c99a144d00023fe", - "bc324f2fa7b8698f5fcd2b0bb9f0fa2ecaf9bc6c6b1df01b61b6b5dda6f3a7d8", - "1ae78d1ce4074b4c29b10cb1339b84f813868af35a55e1b5d034ff26d3009ed1", - "23600e29df337600fc83d48c79ef4cdf0060e85be82ebde4301ccdc843393f47", - "f2295caa5001dc1cea7bd5bbbbadd7006c4119cdefd6d4ab05c4156b70b2e334", - "1ad9768574cd92803d704d4e062434c7f696a3063d1e32c3ec5ed4cb697d2fde", - "b929999a15ebd9cab2151a98fa9853e00a000c7545f0fdfdd9bca5e30c2ab4f7", - "4e048b55e612b24d7584c05e5268792640948ebd64084a9ba9c2c91b0711b203", - "a2c8c57a3c33879f97083d363ba12f48434f80fad46b10fed9d8a3691be31b5f", - "5ca59c9473826abc1292524d7037c93c3dfd7af457e1870f13d6f5dfda108a8d", - "c0d2ebcc591431e9c598163bf3354a0b7e9a173adf395c17e1e7133e7003a508", - "b9775fd851d9c3d7f6272d910cb87c8c1f319c1574e2f2b1338fb7ca8f3ce879", - "eccd4e34179e18b7540a4bf0dd89e8043fccaba423fd09aee8534fe87fbc52c1", - "51df2121f92df32a41471d782f96a494183dede97cb34c32283056edb81fd904", - "7b8d93a95eef899f3543e233590b39d2d47a5b264b540f2261e80361c832327d", - "16db7212faadb7d9424b6fc5a3a5e4e412a2818e5867e7138df8826ff84ea438", - "51d7b0fdaf400c27c56e36cd7eff5f4d7d7feb7db57d8d5efb0080860cd3be4c", - "631c52b8549703a5c20d4482874aa9d29207cba639b3137dc7161bb9a6899dba", - "250002b983941447ebf6407b450b30e58794d3dadfb8c570d6876c06ea6f0e55", - "ba7d888feca5dfcc416457c0e6820930c4d1e70338bc9306008c791b793a91cc", - "ba1d72168688662262505362d7ead0530bedc69d9358da186af3011b59f9ec1a", - "d0ba5d63d79200653c035d80738e28b33acb363e2e665f44d946d63420e4f382", - "3514252ec1bbd2fa96f68b7b5f9f5640b0e95b163259f2e43a99d5b045717213", - "dbb2e42488f17003214f179a4f6b2c1cc79a8a13aed223a47a8af406a512d90f", - "91bfbb5dc957b88aa6abc27256a2d6ebaf062add4e42fef700f97c28d7bf8e0b", - "53dc3820af0a98d5ef90649826612c02bf9c4f58f77d56adf0584b8499410bf9", - "5011af7d7e45199d0f47fafbf77cd069dfdd8af3692ac2b48291a7d48620340d", - "420ecdcf2b6d243a2891ccc90664b3a610a9fd308441af0a7b5192e86604ec2d", - "a5f51071a9c9dde51601aab6c2ae3b9ee6affe71b86b3467c620f76ff80161d3", - "8203846b1c503c8905a86a528927f334a5a219e5f9a3913b8e1b526775ba03a2", - "017eb341ee1a7742ea3de2f1d87755e635745286e51a5e8b67942102a16b9f54", - "f89f493537b26de74971ca1b0236aec438971b41dd3b3c4d0ddf78acf5e89c10", - "269c718b4f6da1f53fba5617e0f6d004c23983a8237c0b67c5855950fab07dda", - "2da9361f59429d01b976f312f6bccacae452c42e395be8069e9183c3fdfcc919", - "b7baaa5ff143dc8e8135cf8bcc77375a87fb2dfc815bec2145b749a03d8d079d", - "3161d69c7b648f5f491101e317ce56bf85c36eb3407a1bd784c178bce655660a", - "b34a1b71004960a3cb4e3ff909b3be75ae2891b7f41be27923d05cf81e6f54fb", - "85963da77cfa1cf77d282191e1ac5e4f009d8d1d8cba9d9b7e33a874dd6ec90d", - "c99d5d415e5840986c83ddb883a0e0dbc28160ed1fa678061dae4bf8cd0759dc", - "575c936791530826f82faa046ec20b58c21032b5fd281af6fb04c84f5d54edfc", - "7632b9883d1b3d4f6263a7e034f578d362bf80cdefe0bb21c775046dba8ace46", - "e2391e293d6762c81a40ee4fe8ee6dfa52b1a2de8a752e68a8e9d81af98990b1", - "01893e0adcff570a84133773caf48ca6e28779b844166eaf702f457daf70346c", - "6d8dc8b8d6f4037a679f4c7e938b29c7c44c4059e251651517c2838c78120f5c", - "6953a795292bdd1fef3abd8f9860d5c838c0bac8b4016a405c98f55a7ff9006c", - "d1d812ddd92256f4202d9422f9ac595703be20ebfeb71c2cfe94b04876793cfc", - "0497c5a09dd3a501567df150c16395c5ee6f8d10ea8856171e3dfff9e422f6c0", - "7ea720600a0e817076e51717176fcdd904ec360f36c844cd1ff2da851e63e6ac", - "3ddbcf49ab5ef5c3a9c2d495a72f5ca54d0fa79d882f037b6d78721892378e4c", - "63e1232efaf41ae5c99a829326354aab876ca3169d5080577ab21766091602b4", - "5086991c5161b20d93701b3cd130a9b7a16224e1cd384688e59558f5dfb480ed", - "f209cf76e5598b83c6d2a2192db9daabf38744941e441b21e8416af13caf70f1", - "59182e065c1040748869f146c5dc8771ab9f1f5b9f509b7cb0bef8d8e7a43dc1", - "ef1a645d206026c27acfaed59fd698e93018e98447ef1fa0443b34d2f332716d", - "d8f256b20ef5ff731a76614ff6d0e0c177089208aa5b9284429696b7ea8300da", - "d131ad94873bae148b1c4cbc2c036abf1f8e3984e9237b30dd4df6357c578326", - "551f8873d34b7517a670f4f22bf4c599be7d6b0afad9f3badac785db46e3da98", - "2b89c22c8375029ad2a5e04e49895a2a10d1d99f2d0b3d67b2c1d0b4f33640a5", - "3186f0689c9fd48c0bed9c4242042c3e2e0eedd8a5a0cdca2508413614e276bd", - "116f050c24c0624be379679f92e017cdc57f2de015a4982554466d3305d7cd81", - "87fd8eb45d047a3a216a8716fe5b5dc540f3f9ba95a8210542d6b4c26c6a9f94", - "237d6d23cd80cad62dca26639689c47908ca41f3025eba86f505f4e53422f1cd", - "4b76db81171d2546ae719dc8181277d1db66808323391ebae8d5de667ba831f3", - "7043c7054ce7a8b733df6b734820886824b9cd7283716988f23649db477c64f3", - "381f307ae0f77d699d307a6f4ec3d6f3f9a9d2b1e3d040dd312e4865375e17ac", - "90597a17884fae54ecd377152270498d91fbabcf6aa9765d013eabc2553530a4", - "cd6401a6e0c01ef13dbf993f1a1de2df089db84bc656c0e15e3c194b36db2e57", - "8dac7fe00632cf4bf9e2f0454ebbc2e4010750c9380701fdf2869bef3e0e59d3", - "d257d8bccc2749117186a1436c9d26c19f622b8e91585c7d61591329c09f5687", - "e16e100b2db35d6f952bfc90d7974b080a0882f8d313223aa0ba3a9780018ebc", - "2ff19433fe79ca159e259e84c0ffeac6c07529d704bada4569a0197af7b01615", - "427d05eb60d1137c95fd6450c8cbd1928bc3be5ac114da0c2f17fc8074727fc1", - "b6f3330080a9056bc27c77a9c4dc474628ffd83a0c4015cd3e3cc6352a8cf55a", - "a0d90c75013a5ed4d5cc7b9e187eee6168e78f6f300888eea99dbe0cc2f2f879", - "c850545c3753a0ce9d76ad193479fa03ac8428996cf74fe97a3a655b2fca443f", - "5f210155da490338ad0ffed5014b2c6f415e8e7bdf962973e00d1344d613ac1c", - "edff4ad88411ad70322b6a0438bf52c740731f4b90c866bbbbba43daec699fec", - "38cf2bd104e6016c3dfc9ae2dacbe5f0580483ece2e5e5bb0575b4adbd405693", - "f328b4b2ba5f60c4dac5de46581b2b7f515a8643caf85d884ab3767dc253a053", - "484545834178bc559f05629e43ed1c669f2071f91f5e1d97438a8142ab23160e", - "01548e2fb95a77dafb3c0a74d9868868a54e01d1a116635c9b24d5b6782fa668", - "2f759d23b1d4ac61aa275ca09929167475a1c31d717d6739cf43c6b5d4288443", - "e46c5cd14ceec5188ebd78b00e1817a1726f66db97877b1c43cd1f070c98a809", - "ce3993e4c4c81cb1ed9442edf15892bd927e5f3aba55ebe9585c7873b96182e6", - "cc40eda38dc7f54783d3c253a32803789db2da39d01a6e4b266e9f434ae02f34", - "31b67834d740ab8b518e715751eb14552f9a5fe7bb99e864c9a3429fe56f7f60", - "8a28c56fb430ebeb9db062e4bd72add6f7fb2e076dbf3328ad0e1776f8aa9d5b", - "270d0847f9fe9e6f6e8a3c4431d65cfb40d6b460911d0d6f90a9e9e4677f9943", - "7d09983256a5123121ae1d7a69c43e6f7f5c9d435dbe06b5cb9f9d901b2fb73c", - "04e1c24f2566fd4c22edc4d93c5bfae6b579c2bbb24ffbf1832e7eb8f902442d", - "b04e2360f2f7c0c0026611aefb229bae6d8a1661a907536f64531930bd3f20fe", - "bf1140df92ba2121c063b8f70755e6c89c33976f02aecaa6e2c7c9e99789c654", - "d03125d3e84e6840ab1d0182cdceab4dec39c855aaee31505f39ebae6fe6aa56", - "e23514f050dd3e4e0b30d16a638573fb21db58650f8b9bc01fb71512646c2556", - "0793efe38a4f8829de3f899230ae990cfc1b011359e41751df38b8db17329995", - "f4527ef0ae36346d90ef2b9fb3777bb6040fd224a6dee91cfc145ce762601323", - "e017dcc54b34d9f416d5eab3a3fcd5fecd64abadae9093018a1594a16072f32e", - "414ba191fbc95917cf2131f849f55aab1fee1c6b49a53e5408c5812c997a8764", - "d7e61650f7f3abd296e98001f0d6fab47332459406050b732919a15ceecbf634", - "d366f5e48a550fba5d0ef7020dc35fd34ab2d2be725f61afc8bf8d7518d2c4b1", - "21004cf733b7c4b70750de62ac68899a84bf4158c307b64467b74ef4e01382a3", - "063b5233ece7b38eeaf683246444bda76361fc084257435a7064c173e34ec9a4", - "1331b2e9c9cb5a53c44c78aa790a05214607331912d17826820eca724916f9ae", - "be64ea4fe57e4580f430d282fa21ac924dd7cb4257ca64dfaceafbd296009291", - "796a9651f87ab8d91811133f19ed96d128c354e836f4bfe917838ddac778fa18", - "bffcbee04cdd9e2e43a1cbf0cd9101ead0481bcbc4bba83efec86e742a21f8e2", - "906c019c7080b44a9994f6e0d0026f4da655dbf9ab81b79fe7c89c28499d46c1", - "7c8424f339237fdf4f45c7b083af6fea0e0d1709d9f58e48a250ed31aaca41a3", - "aca43909a33f2243b9eba9713e762ac427c8e252c057932c043a08eeb9eba887", - "8d172292fb29bff64bb7bf1d2021e754b5456ca11921005f18ee9ddcd38200de", - "a9e6e395934543901c351639c356e0d1c32f66a68b0119a78cee462c7d7603df", - "e44256b38adef6160d4697257ea63f6e51d82fbd37435950d9de4102ef27551e", - "77c15b8913570ba893847fa37b7914e10f95b908937a602487449c4d6dd14597", - "e0048dac8e520905a8e43f7d23f9fe3c2e71d85574c365226a616414a133c03d", - "29cdc5da3294402b727a567d24ff9091a81af97ed3f0a23afffa9a804a10deb5", - "e52c2e2d64dd6df229e66a2048f4152d5b9b600339992487d291dc7f0ba2a271", - "35cce628b228bf8166ee76a634ed1b93e5f3b2e379223332eacfc38abeee13dc", - "092719bc8a04c0027491eb4e379d5ef47a5c3e8c99fb0409bd33f54c9313e3a2", - "92bcb457155aff0af90c82f03615afdb4153d962410a7dfd4a85dc1d256d6965", - "b570a84aebac7862e82f02a367554149ad7789abe6047e668edde7c644d795c0", - "5722eb1e6b8f45890232a6d4f74b30a24e4cf60d4b41ce163148a321401c130a", - "5b5bb217a7421d2c9b61cb7f48ea0c0d398fe3b1d48dffc5a83efb9fa6b9fb44", - "3c58c2d4affeece658535c9f96f12d2f407a35813cf269d86ea9d93762910d93", - "3f4f629a127e659b2b4979aab1774a65d336eadf54d26eb465fc1abf07044360", - "d424bdeb012a495d31f054c64ed8c17d6a8b7f27dea7a6f6881a78dc3017da33", - "4d145c0c5c6dbd9859bada586691099f502daf24472e8aa160795c6a8cb7fc4a", - "10fac21fb26fc34bc324848ce71de4b283c80b416f341dd38d00358af4a23a91", - "4ea3a172f7ea43c003ec27d3a737eb1a098c79ef7403e460aee05bf7ac97d57f", - "a26b7e48fa5c5944f7c51f3b3da9c67f65c1b264b0ea71ba30d5add9fce5187e", - "d51d16770f0c2e4f19bd04a4a0546502a59476781d50815aa6a21ad7e21a972c", - "0e5a868d3dc181e772085f391b3be79f87443c896b2aae731f3c75bdcadd1ff0", - "61e576e24e4918a5a67ac7a6538957243464a4e5e0354e5f2b5fb87265fe2011", - "d71827c7444e0eae0f09f001d72a74dacec8eddf650cb9ae353cd25f875f373d", - "3e5bbeb39d23a23d8f2ae5607c6bf45d7df8fde1f01eca900557ed4ce6f7372a", - "83433dd1977d11a5d3188e243ee48824a21564a187cd90df8322ecbc92b3832b", - "75a0ec270501d2d6942d802970cce5976556860fc1948c8b6f7a50274f7f5d45", - "73f61f8037542c1e5c41976cbbc8c4518e62cf3292c6fcdf92edb05920171d93", - "223e48c0988b9f59362fd9b2fed0eb533003d388ccd6b283e49970df2d845744", - "1187ee2da296c8adde6ff7b7fb112983756ae10817941a957abee3aec650ee64", - "f39ee3d8d154111b698a573a365e454e1481d38fd3f1dd17a858212ff6d8c44d", - "b7c4293549f45b6875286fff2e514cfc54157c524b35c98238326dbfe9112302", - "e0d6dd908690a695a4f5ee19f7ccca8f5eb26bed942d41fe48be050edd628789", - "f38a1d0d15efd5cfc8b01a02cec17c2fad6ade7820c3c344b51e7e1a67c76822", - "ce957253f06fefcb7181fb5e75e3a0d7c48a73f9aef509066346930841cd4de4", - "c17b44a3b1e5170333c46e98b4a7164aa990332af2dd72951867e60565465136", - "502a2eed7d7c9f6724dd48bdd2d45fd34bb6cddf622f16eb7d33fb8573810a17", - "7e7df0835f6629d0acc6e6778e8efbfbbc970ce915c676930271b5436e536810", - "f1147a25c869f43cbd3ee98678bfe183a1e80c690d41e8ca66d89ad3d5843a19", - "909f082e5aa87e47dd8f47abd1de4d4115dbcb4a7d802c3e0987d8356af43a7a", - "21763ac795f625d5dd1ce410816d9e71e3be1d1eacfa513bdd4cb3457e162579", - "25ccd01310c388c28c59e612a858268cd3b3e1519aef4b266287df9f8a28a073", - "28a1d904c763ddc9ccb13d859bb4ad2e1bcc4b2eb3a8265990605ada829855f9", - "655a677ff78a37c62ce65336c4e84e93d2dcc34b4c084755e6c182b29d300a59", - "7e97d327639cf24a1d140f280a7d14e530aeefa975aa6b76676abf39d4141a7d", - "a9ade1d6cdb9a70db5d4b564363fbd889b3436326d31522f8a5ecfae1f3c4739", - "f940348d8b3b26f59d1bf4fef442ef7edfce3db06098adecb2b279613a33bffb", - "d853e0e5ff632c2504bc91c7ed5c1b9548581ce902be1b45051edc87b3ee3777", - "0a667edba157490e8b2ac7f96a3a566e3ab749025014f1ede6afe331c453fbd7", - "8a9e82e24f227ff2fc3bd2620e53ff29358524b74b96b7a9c6aa2e1868886bd1", - "06596785e7f9ad4179aba73c9412c72b987a490df94c86b1de2e2cd70a501fa0", - "d4c5bde147db2c1765dae72af9c5debad41c247a5fae2c7d429fa30870eda631", - "d66a975e61ff93fa578cac5e530f6ab8c3266dbf564565c9e4b8a525069c615d", - "b1c50c00e3503dba5d004c19cc74f2c3e9ae5fa96f4f59c532bf69edd47165f5", - "73a68005e6c8b01594996c746fe3a931e97bed34c0edda1606b027d551fbaf1d", - "e4f8345a496014231c050f7b1e47e661398d03a7e0bc7140fdb82ffd6a964260", - "976c8157329fa940386263c910b3ae316d5f470a64af8f1d6f3f3511e103882f", - "9f3bc23d33ea3f8a263967da62b1aef8650578631704a5a17a972d15f1a2e015", - "b751fc8f8dbfefa07592cba4ebbde9d5d36942c2059ad9bab1e74a10a0b066fa", - "a9082f5508b107ca1b471cc113a87098e26d7df9c6556c1c6c48ba6cf04fa816", - "24429cbd8691fa84957d25ec38e3316948789605bc7a6219d3e888994c27e799", - "d4b0c63c5c6e1a761fc731dffefc215ab9923016c9b5847b01a55e35224d0cb2", - "d146aa2140ddd863fc3a327491d6577a682511e59d4fae2a7225bccd027e4c8c", - "952891fd2168c6f231c243d4ac3f230eb2defb93a1dd1458bde959dfffc740fa", - "106bc251f3f7d27c8b58e5aa6d92b2cbdbf4338a47b6111f1213b45d766d4064", - "ca33244a7e5ed582f91df53b8b6e5f5dea6197d1570615110e1f07fc8af86615", - "0979725967587a7e7b99020695e1f37a970daa471a73e77d601d612d350a418b", - "212f30e2ab04de26c0d724f13a8350189807f716315c91402d9f9a45db481365", - "254b16ac5f2d7eea9d4496c02166d8e529b4ce44b0bcb6d969deeaf690d5fad8", - "e10b820ce9312bc3ba6f373c1caae3b03ede20a7c9bb0b1abd57db79a48cfa94", - "c032af0917c8ee991776b695b46436c3db99406ce602900d7bd841996fe5389d", - "162fc80de261fca7defff9c5dcb4c109a0ca148fe7d1bb0b4af980dc4db40778", - "681a90219939ac87a9ae397999693ce70ba150d151c3405016629138041abee0", - "7b29acee6822d15eb469dc40ae2800e5837bb871122b0848b5031875934d66d8", - "39b3a31abdd7c77e187990f5eb39a8ceb94a43944d0ffd52f11996d755cac58b", - "d064b9df9fdcd265039d6065dc0d0841a765a2eb246af49e4d6c6adbbf8a3d9d", - "5df41b42419279dcc5b9db21731242766ee012837701dd2bbe9a725a6ad0b45d", - "77561252d4ec1edea6575dd4787e83a18d2a53b1fabd4e2e57bb76194cac29aa", - "0adca079100ff220fcffc905b1b0204d2d2677722f0064027ec600d1c036796e", - "c3122128206a347b7093275a39e4702998ca9d8da9d5a4601c8e035a4e80d336", - "41273376e2a21c0dbf6464bb1da8562b7ff9a07c3481fa356121b23683a6ef87", - "2fdc627273771c2e2249fb0192b8a378c26da414241c6f896d4498d04bd29478", - "a0e7055dfa3cfeb5c21ec68b01a343a0af3156d150ec31d9fb0291eed5fc2cba", - "42203d9a2889d829b3a0f6d8f42978b480409192dd85affaec6cdd3c62d20193", - "139d5bf76c1c954975e1ff6b62ac9598978dad78b28008a7748f9bb97760c1ca", - "d73264b91970e7c6458231996e40d839eb1320e94ae3283925caeedd64f831da", - "c9c7b299a14e312ef2492704494884b3cf33c2e3bdc64f77119cd151251076c8", - "c782b8deaa7c4d3ea239d106d974b6e4032fb780a78ee6ddc45806f556ac37fa", - "c7d1079049c967ee20e24ade9f907331ae7bdd5202ae63e253335bbfd9fae28b", - "90c69875c0699897e4c69fe426ccd6fe3b7abbd37d6fb01ce3595b54d07cef2a", - "7188d954c607ac5d44f9d4aede67ee17eab3fe5210dab01c7cf907410b560732", - "e666b2154e2ed0371e83e9bde9160d0c5de86cf42e810698403a5fd01d22908e", - "6d3e338224cc7b6c01f1fb02fda0d73e726a5d131d9668c626403b366ac07e3a", - "d6730a38c9a1d6e45c9a499a39d7fef1420a6eb590800b38f20ff176674d55ac", - "1be0c3d91030d29fd05bb25c3e9098983e88cd36f3eb057fd1444d09d60acc20", - "9816be98034fad6d8e3d3dfdbbc4d92031227088b21f83c7a925250582bd23ec", - "aede504853bdde405faba4e0a32a03f66c3174bf62a890e4f129a39d7e0435fd", - "162caba2f56baf9e5732178cd15f8884950b873d49ae7eea513f8ca52f70b160", - "e7bb522a1ded699feab9b4a24d0f6bad29076e16dfcc1a67a5147ce67eb31e9c", - "115a720d306d9983019cc7a335e6d516887823d1d8350a026a946fbf882e36bb", - "f5b5f7b00699de4479cdd8868e4f84d365734d90a8c1f50b99cf8289d58111d5", - "3aeabc5babc753e2a42723e7b1c3d44226830b55259dcc41680a1bd5a31f9ee5", - "0a5d9f2529279203167de9db05389fcc09b4189b90fbe14fabb7ee052d7e599d", - "77f523ecf0b761eef8e1277cce7b6e115c92eddd72051ea1c1293dec5545aef6", - "22499f8ba12e241c589d94186075f3fc24c5946c64a10fa405d741186507d8c1", - "6e493c11f2aaf1fd5b2ae4d90f4150759d23663ac056efed9e6c9b97f9c5e7c3", - "4fc6601494c77144e3f5d4f90f9762451808e64de8516aa9b2ce7976064c9061", - "a5348463b195413a4947deb4e20c0e7ef05372c4004be5b140fb7c1e57f22caf", - "f93cd61972a7e9aed93ef74077354d827d615dd683512c85b0e9976727b9a1ad", - "03b39f90f8dc962d2a9f2bee1534075e563993d413adefc87ac48e6abed99b0d", - "c4a6ab871e1d29551f10a5ba34bf9ffc3d3b7e2e577a3153996d61b551130c07", - "7786f3f4e619cb242e74d0a90e5e2cdcf3980c6bb38f38d8b811deda00e6e0e6", - "2bf57432f2034f66d1756d82c3781454b05343d2712a3001d7e45439da0ea52f", - "2d4e609841df59d248c0d51418dcb1ae67f90f48879e53888b89143289ab819d", - "e2cf2ca1bd2913b3a6713d7801f711af3cae9fd385ff6d1f9fa3ff318ef3c91c", - "0796f275d990f9bd218ba678b5871137b25a27c79aeaaf30c87ed88c043cc83b", - "617ed80ed864327f4672a372450cd7234c875718f0e78ac512bbfd4dddf031ef", - "1ebd0eb1db36d0a91c7958cce027092a6334c2ecba4de5286a08aadc8e2ea348", - "86dd9246b2d8111b59f837fc43afd6707ac6a1b8921e051babe8cb259073479f", - "ecf6c0e4263e4b6b29e642a065949afd5ae2a48d1fcff2861a24c9a1de550215", - "bae1d37af8599936b806c0b34918e6013fa57c7eb3e56b02e4854ca091d27a43", - "129133a0bb275d4733b8d8ffc133a17ad94f447974eff5f598092694ac1ddb53", - "1550fcefa056d4e0567ae3734fca5dd8e72ebc1780879926bb273c3416f80240", - "771186c96da31c87c3d316b2e426f9e046c40a18901e15108e65daaf997ed273", - "7a35deb51e50a1f50d28d0d12666dca9502e2ba70348984cf5ece347cedfb5dd", - "ff839cd3e473941e372bc608a55122b99d8fec79286020ab0897efd151d420b6", - "9fd815d9fcf06a62e984eab8b3246a918c27fca400e3b3d93ac06582ff2cefff", - "d8755c30db7fd4c3eacb4df699b29798b239f66becd2ef04560dd70233a09a5d", - "2186a7147224de3df10a181a3d022a794f74529abcc68a1070c966a581f471f6", - "c492d21f1c636955d621151403629f3a086be0e2211aa5685eb67b9cacf57a2f", - "8b5a921bcfdb762041430d9d84b46fa0056868c0c936cd56218f11d50cedeaac", - "0aecd84bff0aa502e5599b516bcfdb7bc73a267f686af768d742091c52ad7342", - "2cfba1305b3e13d4f567d6e57f8184eee2df2709e28d2950fe3b5ecc366cd28b", - "fdcf2fe8fdfb14be6ecbf96e9f62b1eeb2b86545dd57b271a29c5c891c29be23", - "5dd09f54603b4902c97eab3ccdca0856b017e8191052381ccdfd0a7e6738f294", - "dcc3bfee4168502df195782c7af99a0ef1c001b8ce4e2c3df6b934075aa807e1", - "c3c3fa1b0732a9b1a0b49e6439424e5e3f2e3e35ec23840d8fe55569dffb2f54", - "7efd3b2fcc838ca581fb9e270ebedc51b85f1483719038a332e5e00d980d81d3", - "d04e63e4ecf15895332a0f7d4626084ddd67d9a76859313db714014ef99f9105", - "f6ff82f7ca55cc46c2414bc12439e1e9305c2a34bd4d499cb30da55619c4e391", - "134a68ad783f212847282be444eb815290dca8dd393fb29d8b8b122b4f38c20f", - "318331a6b8655bf50edc7b69bb813f3a6c4d51c2febb644dc141a6b52d3e5ac8", - "0b0d21f3f65a35432f0e1575fd7818c58709b71f9a01f3a3d9e5f8919ffd4eda", - "4d26da88ee34116bfdcbf79097b1ef3fa0f9ebb15fbbd14a9c2f1f916e1caaab", - "ca12b515a848e929c1ed39faf83a6181f457cdf4c7913c3264e6c3d67a5911d2", - "462118b97ff0b33da25a7983c79a5b015cda02f0d4a21ac29a736b14bdac9119", - "b50304a7a0dd1655ad552904d03587bf697919a4231fb510d1d5efd21918dd50", - "98ab5e8b87a16e79707297091cef179813ea9e376315bc9e0cf1fd3e4a02864e", - "63136fcd60267a4bf9935ca970d9c35885471f194430e7351d4163b2fae64139", - "73b322322e1327ad964dc4188613faea8958c1f83ad95efd1943fb04c35cee48", - "7d173daab050d04546de21740d2183a4d8b13f0f49088efccc712cdbf617b801", - "f61565557d9d1ddb815d79565a2f82ef89ffb611285b992181ec4faa6cab1020", - "de86f797f220cdaf62e5273cc6efdf82ac42b41e87c0504828a9617eabccc999", - "3859066ee791f26e00352d315a33bc1dcfe6a24d0f7c410885df341aadbf5ea0", - "58f1f20568fec7655bfa1a7b34b7a0c4a9268d088ec14f8cb70632468e583b76", - "5a60744565bc3c7571bc44e97d4ed9e4bbe11ff919ae63718998a6ac4ea47cc8", - "730f63efbdd1132c0e30ce5ac1b5a9fa3aed174879fe1772ef1e9eee240661bc", - "896c079225749b9f3f3a882f6cf03805e51b722b8342266393a7c8d5cc297121", - "638b7fb35f0e5822b9d11bfc28a7d646d731f0a2502ea82147f54a28d2d5262d", - "1c6cb045c31e54c836549ddd3701293ba9025c252987cda337a93a5c517a8614", - "304551448b59849e6a30f36d7131d120ea93ee90ea63ed87cddbe4a3203e0b6d", - "dfe62e82d16aa23eaf7810d0c696997240fed0eadd3a8ecf12aff5570a93eeca", - "b804b91f94ef6e8cc7855e40fd385c95d80ca9c87c7f95e0185878261ee23148", - "3c306d7df783f8a9e554c9aae1125d5d51222c9e766cd09132329abacd1b13ef", - "6dec6b3b093ae6b1165effda74aaf53e4bc8bd9ade2cab1a8b17a6846fbf6d00", - "7afa6c7e82ea87986a4132606393571b14f83c7fc687e60510661d790646dedd", - "84b7b6ef5c39d04a5dbb93c531e2a5de32758b35dcde20328775033ecd924bfd", - "99797051c46574755f023879bd19d8592bc0e1a3dc6873a3f29919cc661416c2", - "bb5a0e88f147b6bd96f84e2ac1ac8f6de98801a074160988cdc55d18d19ed4ad", - "e2af91bf419408f81ba1628c1d0fa12fd99aaad465cc19fe5cb110fd3ecd4078", - "73134391635f725536d4825634d40d05e3d526afba20d8998d06496fa9dfbb28", - "1667c3df4c7080761b063a804cd0e1cffe95b314c70f577b19d0457cb769720a", - "beed1c15b49feec6ce47250ecd649a37c06639a90c5669d845603adca34e5191", - "eebb3605d25cc79a5510f2538fe43b2cf4e4620342c95363d3e7519b9b13266c", - "4efbf7baeb8b2523d0a4aebb7ad5e404cd69f479593819dcf8b802e5cf4e9221", - "3070d292208d920e66ddc5c0d22e11bdd3ec3b0ea9844e4774bd7d3bff53ac92", - "73c33b5e2b5188e6c8e6daf36a535a5f0cba8dd103dc43a23b4c19ab465d5c8e", - "2336cd9ce4b95b94aacb19786b0083c0c3508ae8a68ecef7a4f25e4304dc0ccd", - "f3d11e5b976e08e23501718b8111f0d06dac205103df4e807f4a7916dfadbaca", - "57c05942127ffa7fa095e0a9060e5a139db415adece8da4bc658defae1ec3be4", - "94416e24d2d5f9a98fd9c447223c73de78ef51ee376eb7327542ba2f8fa16cea", - "03c09614ff14924df10c4023dbf409e9d3a07396593a644a67c1fe6d42d62133", - "8a9a896f59f8a8b179d7530ac29ecee4ade4a7f52bd7bdb0b1e994668694701f", - "a94f39ba723df3047b8ceab3e1c929e891394e578c1e9c9410c75055ab572918", - "688702aa0dee88ccf58617c8fdd0b9167ef7a9814561da5e78f7e0b41f805193", - "711cf33dfcf10e27add4590b62dee98e4f8155beb94bd00187f8db0df0db7cc4", - "30494a8040ee4121bd9a8cb54349c1e169b6e5bfb85dcc677c9e1e26d48bee60", - "11609f68d8beb8a6479e34b5d40d0cdb1aea148747f2ea7a04e1de89db43c1bd", - "62e162304a0414dbf62125a96564d3ab758959b7e6228707aea533e9b3c9d131", - "18a2aac4d1a4b3abb19d561f4acc1c4b1e996aa611527d70c97a252c18496b45", - "05cd47473915a03af5630c776e85188c9b7736b8315d8d3441d70f746006158e", - "6d942fe389b90eb03f1ffae58fb364717c50fbbc2d039a4689fa1a9836298a28", - "d40f2e9b42001c59b4f7a798ba57f0748bcec1469acfa018ce752370cf8532d8", - "c98ed10ca2413bfc69c5fb61a792a5a248b639b5bde817a398541fadfd316787", - "2590666d2522426b281204d4233b22067c71bb1d2c494a3f449732439f3b765d", - "fed542f45a4eedade899fcb9602064a10f1ffc3155b44251e54907eaa6136e10", - "ff5a73ae830cb2c050855268dfb494be92d9b741d2ebab598ac7703fb8619b0a", - "1330217f265811521e9956467981418db775878ebd82cc62466dadb477458c82", - "e58713f48e0dc15cdfa9b51a7d432cc2fa18a548caefb12e381f6fca68a78b9b", - "26b8223d476d12fbf329052b87962e43a1ac85b0b784ac237239b62b58b41c8d", - "83fddf7d5ff4a870cb04c4132f3402ab9eea590547ee1cd4916ad9579e518fc7", - "4f8ae1ca332dbfd28a767d3fdbfea0fd17231942f53fe326037fbe19c82b0cf0", - "4d1e265ff23323dbe21ce11523560de5524688b5e798cdaaac7e044d8460b2d8", - "0413b7c2b68df385bd7b1f20fc9c621ffd0386979802298ffc6594b359e7ee05", - "bd44c2c5be2d43ce4a9f1c4dda06f61bea53154c1608f804bcd080299e52a53e", - "a2558cf4255c06fafb4ffff59e8899fcf655c777333f4d3bb5b864aac069615d", - "913fb19de734257624a46e7ca87d60fdda9d7e73e3961b45212a5cf5c0c083f2", - "001057ec99de8afc6d74e9aab93d0dc948f69b9b6790052870dc30a3e084abc3", - "f3d8793da23f2a8289e2a644717400d2c089234980949fac7063b08a44e64b0d", - "9118692700cc555450cf93790633fe917887413cd46d46dfd44832aead2813b7", - "f5a835f4e02001852fc286ac6863e9011cb814482e399e47cfac389d3aeb7a61", - "e10f0ade3ed13a5ee8297e7855b1e7475403f288631828b0c71c37adeff83224", - "6579a60c4103e5f8e53d197ddc1a80da173a3d2385b32f6dfe065074171e00c5", - "07e6f5f635f1512c662cf87ca9f5972be8591f82962c2d2cd7d28365a1818924", - "dba5ba35d3e0b2ec0374df3a989aea0edce515cfca831ada3fa8d139b5f7a2e3", - "995b72f704022b2c3465bcaa741f8e2410eafd55bc14455d3ad6c4bdcd421cc3", - "0602404dd02ac3596d4b6ee79f0c17783f3fc27ca24f8609c581e14b24d3ed8e", - "e9903a70ab4039984c081ccddca68f233bb47546f9043a961f3488f00d9e5032", - "13be3ea26c40c755a9975b052c8a7ad33c0b62c512844879ed9da62af5e37b9f", - "d2f4b9cf1b6f56ac757751741962cc0854043d03ee6bc6772782c57629ba9c30", - "f7fd1b588ff089e665003d3724917cc957a84164f6e4b516b6691f58d7b8d369", - "4e18aee16537bfe4fd41a7ae3c28242ca0055b618965378591b560bcc054aaf1", - "efe45b194f901e3958ad1d3c36b3585a7a1a7c457ab706f36ca25cdfa43081fa", - "69f3f467575acac02b3f7b30155997874ecb819e54f8a09a9e5579bfb1ea1ede", - "b18e042de13bca1c7a7cb375c2646eb564c4475ca49585894eaa4fa3211f9d5e", - "9a537e584e3bf483a6dcfb3f3966cbf77d5b154fc291614d851b888d87558287", - "5fec2d310b897a4f74a6d76234dbe641d4d32adaf27c1c2bfeb73255da7008c2", - "887018dce00618791ee111f8f409bea3c9bd4ea00e0b9b610b3e7c87b5045e9a", - "0caec302166856e3e2bfc6c97ffa008aa746200469ac27d6d2eb21a0164391e7", - "b14bd1beee9dc3d10130f6f4226bad0e987577fea0d87694f1300f3ddc02935b", - "82296220f0e2ebaafcd8a62462c8feee6ad460c00a0314f315a2cd46a162276d", - "cd89eac39823cdbab98e8a832815035fb9f42895433047cf37c5abb8a2f4e043", - "b7191003e3d34895fb6c0226740e7ef87be3414415ccd3f21ce70280151d2ecd", - "4aec2d44e34eb404013d1abe2964351067e623b27f7daa6bb38ecea600b14afd", - "37840ec1c55ef4574274afa2fcbb86e5a0f39a4a565d0c3a83916efb95521905", - "90f89923d420675f499204c8ebc1ff138e8af10dcb6c7646658abfc8de5b977c", - "e7c5c622a1ccb17a91460fd1f7f1d6ab9c3819cc3f80eaaed92b58a58d6add4d", - "65f939b7281a63b0fee0b3569c328e8dcbb2e7bf224537adca37835c8b4fca4e", - "f247730299187f4433f644e6f9936ecb9c94e26fb68ad6d12c6af08778f80fa1", - "45160786cf3b9c9317f8a99f60aed281e953a19db38313f48dbe3b6736d4770f", - "24a57362bbe9cd6e16407aea94831742dba6dd3865ae4a52588ae8edcc9f17da", - "920a6cacfe0e409b512b8c3ebc2a86a3790af6a0eca14e202292357811898435", - "0ede1541737ceb1b64e27af33db770341aa93f2d5e5b80e60c3dd3d1cc0648ba", - "2a1ad3a1fecf08cfb3e9fff5cf1ba2405a1863c20316e0156f2496a028d31918", - "867f9eed6333677c3116a3680bba5028187d42eedeeb16b45881bd37c18148df", - "c1f6c2a8cff1a5d97c157c84fe022b2a0050fa5da47070e9a81dab6ad9edd90c", - "43d2ea0e5a2bb189279e92be68d3b6146cf54758c205ce5bc4f80ad3693b6a3e", - "267f94965d592d2fb901936cd7d3af1cd7fde7cb332834cca38bf40613ce4f42", - "7004266056e72e8cacab1f2193747f413138513197e620596116fc04e3159ba9", - "0c1c4725123658b31601b81992c4f0fd681ce72b0c88dcfc9eccdbdde028bc6a", - "76a26f4467907f532178ae7cc32c250592825a32e15eaf442f5680222a1da32a", - "4dbd608123f8fe8fe02fbdf9e0d2c8fba90251ed5f366ebfc6a02e37515ebba3", - "61c30c40d9628cb9e0439127724e18775255c0210e99b7a52a8b982ba023996b", - "a1f2ed78bd7cd5d9eef7dc7893c7f3fc9d8870529798cedcbbc6ecea42ce9a35", - "c3cb768d2025f4d35da0a54877818b33966857ed98d82d5c404d20b0e2a2f852", - "298449ed473806fed9fbcc4ed7bb47fb63ccc9f2a4b239da188183e6b7fea31c", - "8f70c06e66a065aea857b1d6dc6e70cd36b894347e3bf97148f006b81add3af8", - "2dbefea267a9feea1c899c4005afa4cdc64dd0706d10832fa2db2f669b604281", - "37d5dc5ae30c1826c451a5302e51557c7bc94365757e245bca3cddc9ba86d6e9", - "8d231a5541c342aea6002fcc9dc639fa6d8271c68b34156f652d70fe66182c33", - "d0aa747271dcba6a6da37a7b6140a04651208c7aa73730e99e3cd6a56fdb81ff", - "98821a1f36e0c49e007182a2d19874d3745990a0ad3810fff4934c5695674649", - "43ec53c2d64332f7e28e80cbef1b23ba362bed82faafc06d31c008963d85594b", - "006b9a3306cc2d2ec5397a0910f0f0f9bb17a8436d041c2d30e7b69f8cbaeb76", - "faf42adf2f476b549aaf8738decd3fab8e64d1430be84d4f16d57cb1a146894d", - "5c1af4ee54f9375a2574e7cb4a042900ff2ae27efaa01fddabe6fb11a8d9c9a7", - "726f6708ddb19edf2a02add525620a25bfc52c01ed26bbacbb5cf7093f459d96", - "25bcd82ddbd7f3a433465700c27b98d807622542fb2e3ea4fb32353061265ba0", - "da157fdbbb3a30c885c7f10f33eacf31120e71d8524b5c66e0076c7473630eaa", - "fa544872fccb0f7b49a95b19997a458d7b255d11924ba22d12e05a40e10f2548", - "fd7e3fc1072f508bb7fb433ea73287e6b4264d85cc55af9cfbfc9e3701214e75", - "1d1ebf3a81df58e11537a4e189b413a9255c83753206b5e4e10b3a31c369de7d", - "b4490ebd5ca51b6969cdb9cb3136367f6099c718b0113c2099916627725cd676", - "fb1791ce429019591a4a602457b71411bc94435653acb7b4ff561a3eaebfe813", - "ab801a14989009a010797ba7cf86cf764dd77c0e89ba67d00e125d9893008467", - "e68e0283bc06c1e62749ad9bcac8f379062e6cb74d3d21ec1d08564b53534690", - "090d9a6d4eb02b533fb58d62e90fec880ef61f403f51e36c4b9d12219c24a9f1", - "dbee767c52107d2dd81e3b6f8cd5f9c6caba356b47885fe472e9ec6085e99eca", - "359a4ddf0327e9c25972d6e173f419039417802151ec859ecadc45ad8dfff249", - "db90145b72b7b30a13baad1993e9a9ee61f4354a5cc6de8e037a7454212b8f03", - "ecb62ade680d270129def54808e1a1cb68550798c06d38471f6f532d665817f7", - "73ad5db1ae11989522ee723655025353d8e5a347fdef1bcd937fbc08be489de3", - "4eeecd1789adbc96f622858510ddb8d92941de72da226d343af4f12f1dbbd1d3", - "1296a1997cda7fbe1c86863ceea3c03c53a85f2fe134a06ad369ef55e871ddfa", - "cc320c3c60281fc906ee09a1338861d94382a0cd6998df7bac7c8e02d1cc80a2", - "cdaebc2bef070570bd6318eedea90c82928fa712cd2d7608dbb60997a3983bdb", - "1f75e2622cb66211481e5eb5511a1846c26bc6123359942f7b7f11d4d85c8973", - "78c8524931182a2c646407f13fb4e1278bf20078bcdfce60d093a0213f261861", - "e054204dd65540d70ff671647d12c103d5c16ffea3c7fef262f8c247a159c378", - "2edef366f596786b7b626c31a897f658f0c994d8123e97c9039212c3197b5ac5", - "fba3e487e0b0cfd831a0762aecb27d75031b45c50cc1675e160cf0987b9fffaa", - "ae3cae4e117e8cc1f827db9d6c896c5763b9a32591e4360e65e5ccc6b29fd537", - "c211d6ba8f86655e9d9f3ad68ddcf9667e10d09c6a0182e748be6498431735e8", - "0ca6852721c4132a28df9f390d0d0ca9c05dae154f85b5e7077eec7b14d4b4c0", - "5f19d3829d4d187ae56515b996c2afb7652fd8d960152c10d5b1a79c46abce92", - "be3c3c6ffa30ddb737192d4d72a6281a30772034e5f5522956414bda844fec23", - "ab0ce498b67ff32cf19289de8cd54c249405ee15fc6a944954f765276561052c", - "896c97573d3064b3cbac1bdbf56a32818df1a548fad50171d9569ad50d6c8bec", - "c5839ae8e03ae253f0db0c872dcbd9916c8f9bc1460d118c6af3568ca0ba96e5", - "1810df573af65b2e351f6ad1428ada798bba607df00ce0bad4f416fe1e10c172", - "87252bd054a6fce4b3dda0fbbd0d80116e44d821b80e1ebf29dadccf898933f9", - "e7f36e72cfa3742dfed314df602fa52698434788b3ce8855356c101aa96bd232", - "9dcb485ac5585ed6e8a11a3731eb521c4ce51803c2ffe3fed1072d154dcba523", - "3b7af9afc5163be4f8686c2d9099b6889c1f247545592d6b77ab335a932f5607", - "4e8dc9af81ace9951d27db6b991cd124ced0c23d302f9db12e0a316dfa0b089a", - "8234e0a4e4439b129f3c856bbc768e2b99946d637ec70a6e2aded9cb29415c3a", - "2d00df0c371657db34db21b0fd89a556cd3b1e6926414cfac23fc601ce8f1a0d", - "82d61f2fa4459f01b1248cc845862346dc4586926a755e2bf29c5b5452dcd78d", - "612af886ac86fc19075a94c8ba5db4bbda88a876f103dc4d18d3316ac4fe9ef4", - "d4853aa5e2f969d9b8df08cc754fa6d74a4f5fa6a117dd1869ff430daef72884", - "20f89f0a47f92a965bc5c25dc504930a56808238dc7dcae737dd1598dde93326", - "ddcb62536428a60612fd70e0949964326a5f75ab50d551742e6b62117e42ace7", - "18dc89613cc02d3c308c5e1ef07f437d4708a6fae21298f47ceaf2cbcb2d65b2", - "a4d8636fad150e2983d21c1c089db7b34e0b10b0ac70c4aea053cd88c19686e5", - "cc10583b57c288e306f030fd56c772fd86ea76c3402f710a5f8598f939ce0c23", - "be8ac013adea08254d80df425513c0acfe836fc13faf589aeeb5be5eba308024", - "a210a1695d4ca38dd2a81b66bcceeebb5536874f4874425e16be518dd33599b9", - "c39a69d91b9dd9e752d6c035fc959b8ea9bebb9d732dfd27a60f2fbd74819612", - "a43474e6ea7dfc8271803782534ad5e465e675cf01ac2a3ea117d0b1343fb1b3", - "3ff1b119eb6cae8366d16661a70bfba19eed931ee28cc262f1580f4b7f55537a", - "39f16b4b96f74a99f18fffb6973d02c8e5e26e0d444012991e6db916df794b2e", - "332de78340125fd6e51165b58df25f24e91152ebfedebd6692626d2aaab3a433", - "d8343ac0c3b6989bf05c1070978ab11061b68322e69f6a52b94928f79a5b9b6f", - "a071db4791a42c28bc0bd28d2f673eb6475e996fbf3339b59e6b9261f1a0c0cc", - "de56c4beb68243025cc8b80a8917f41b3c88ecb7b9fa577c275b4cca7c39c13c", - "fc9f656985452e81ccb8b9022461ad0175d899583422dffe6a69605b2f3f7db6", - "3cefce4ba94e15b50136c9e1e597c5033bcbe0b0145bd2c611192c8aafd215d9", - "cb55431d92b80ea933209fcee1108f4c095c6b5c71c0baec5e58dcea3808ec1d", - "c415f57c9fa0c405b464e6ab0e8772950d2320d48bc8fed40441744016afbb5e", - "d0759f50bface54a548cf158ef9b3f92f68daeac153c2115d72b1e001cc7950b", - "a05273de2c9c6c84070b2204da8646c5600389e03267aa188b591582bbf40327", - "0a456d8a3dfbe9db17ff1b5576975a561fa005cca65ca9443e63004bbb4cd125", - "19cb0c836d94751644a9c63bbad86651920c4c2995769e6b12902688209b38ec", - "18c0ad53f363d37d0a94ca63cffad67fcffcc91a824341c5f510c611c3b12356", - "1ae61f497b1bea9b93a29a34c0e6f6c22a58ea2b213a441340ad1bb59e3e8306", - "6c3cee5587edb2fea36e15437ce04d667a6eddc8ebbed2f0a882fc7de1ff59c3", - "267945d55cb6a658fc28126229d1e083560361a994ab0146740bdc09d57a3149", - "0fa0a34cd5928614ff97c3257238cc5fea6b4ed16df2bfb59dc45dfe53c050d6", - "e17f5e10d769ff46faea079955e63dd98b36b0797dbf682072aaa0b9604c239e", - "5bd2cd04a5f087d465393c564cfb471fea6e7deb9fc9b175a18e2f8809028a38", - "4b0b4588a91939846ce578dd5469e76cff9febdb175cd9cfaa480e4472e0eea4", - "5ab9ce3468d33a51ce27ea0f996244c961ff190555f9a28c181baf685be62342", - "0cd878679f5b0bbee05516896b9b9ab56d29daaccdb8297bf88d07af31048264", - "6190e4d1e66f168bdb106579189e69197c2e982ef06ad579c08ce42d9b85e966", - "85b2c8bd2cc5aa802436dc5ef533b61d51fcdf7bd2ede67e1bfa64784bf42a20", - "254adfabbd9f142e8db972c6ce98fdbf619b35af8a2b09da0fbdb6f6d182b8cc", - "44d7eb8a7f86fe9f7f1b1bbcf842d72495e648a6a864df4835398a49772f27e8", - "aa8e744b02e229fdfb122e362eeedf6fcf67ac15881d750416f8a7f8c18311cf", - "32781bc2ce4e56c9aa688f10be0b5a1035081b6b9a6ef280f84b21d1f9c29b47", - "7e37ef52cece4648bc2943db98fac71b58125d8e29a34593258ce10a21289fcd", - "33d00ae7ff06356fcf5f4cc6cdaff83d27619e09e54d61f36c85292b15119eb0", - "df5084edfad708eb2a38b6c7bcc7b6d9a58d16f365c42699f4873c9ff4664aa4", - "126ad611ebb78ff1b731e632b7a53485c4533ed0efc9d785b754a1ac665a0ed8", - "7b3518c2088ea735de61787e8c9c7639c2d51907a028da99b1470246c83c38d5", - "d1f97f7e0f4953b92cfc0c8f039d1364fd124acd0844d6b8492f878793a32190", - "00fc1eab970bc0c32bc33e0be43f479bfba547fde75b8419d5993f027d76c326", - "42a9a22ed798431f0f122ef61fddfae92c8ac9ddbbbd37c9d961c1be79598e61", - "d5bcbc8f167dabb59e832419d06b83d679ab74242154006bbbf2570bb64bc187", - "d1f35cc50de101909caad2664b346443a06740d9b9e46cf7eddf30356a00acdc", - "9a4c250b50df267f17cc79d1f95925cdfb8b8b8f4b0c5e518779d47f8f8cdd0d", - "773ba7c983496b118a9fec582f5516d41f315b33c0c8bd9a7018d41fbee5569c", - "501833c685871099d2ffc262a4da5d4c675b494b5b813ff88b58753f70ca88aa", - "ab2443ce3d558e0ebadca05bcd7797c046339ceeb73a0dec894b3576de19d58b", - "4652eed1ae7cc4572851fad77191b4aebe0df1d8da1b56396c44da47c88bf64c", - "495e06a9ddb191e7da1c252be582c98debb458413b88b47af74a52858276cc71", - "df5ab9fe115f4fe8242b348c1b3477a76beb65db9a5a0e39ec967ec8e6706624", - "8027b08f8638e7859c8ead8e4e0728ca7ea71d620efbc766ae8e2462f72508fc", - "c63d497e4427c2d94d1e2e52b0332e384d4f12e45471efb7a6027763168ebdcc", - "042f14f34ce5b4d13e90321c035d80bb3a44d20141bc35b147980460ba7b699c", - "84b1376c18e9e0dc401e960a61fd01a3690413f44ce2a1f4265c6ef131449abe", - "c07f6b4766a29fbc45cdd9077ebb221ccdd4bdfea0ac6e58ea36edf2feb6b4e7", - "878051343845101bc24dd63730efba86f2a4497d9aeb8743a326a0577182d1f4", - "9f01838e6f2fd13990e8c87c82e947a4b698b32dda195fb4f9239eb3ba05b047", - "34394125c8f44f29626ca3370e4c81ebe4949d24385820576a555db0aee18f27", - "6323bf0b57244e07627f5d7b5abc647a0eb540676ebfd0a0bdae564501f52efd", - "234fdb16d2be7150dd9c95122b3fab2b24fc22c88df42fe9b7d1bf1589d4f778", - "751e37925b5729324b0c178288806718cccd475453c0420a4387236bff264844", - "702f8d8ebd0020b69b18942a347871be792c0d0c09abe10ab17fc9a666c1aade", - "2e996f6b3617117da4ae6de81126c8cfa69f45a9670d29e5e564a6eba2e335dd", - "a95d2301fdf197d6a95f93544810cd78acfd78342da4c49cc93763326238286c", - "dbf3cd64214824dad5325b12593d84e33d52a687dd8c6a3bfb076f0f5c91a74a", - "462780ed3e98df69fb9fb62ea6be10ca90b3be4d61255ccc9c0831222719c30a", - "19c7c7aae4a18df4f61fc9838ea79daaf2866c7f4b2a09e84b2a832ef0a14b12", - "72716f64ee50e2aaa718858550fc3ec649a9cfd32b281ada7424c42ad2cafc29", - "2c7ab3aebf47f92b4ce3d0c18845d9b51b68429237789757b84f878c0b283120", - "d4f4f735e682fbf4e2f337dbce2bf337cea5c9205d71dc06d2bd0f49ed2aff83", - "636fc98cce957f5a3dce5638ce569c7610e8abca7c4e83dbec0f0a10b4d2d933", - "6549b197513f5860db6823134556723840ff58e4ba1221cf16c643ec5c30620d", - "361e5dc7c0f6b3e6b6727aa7a0dd4fea606d39f86f9a42c4e6fedd360e120bc5", - "401004fe9d6a1b742533731e5a87a9507cdbea392987f08236dad7d4d7e0c26e", - "531113955915efe4fcc8653d5b7dd92a30bd6980f70c5a495c6e9c6398d7fe9a", - "a9e7fc482a281520c9320b645ed0f4e2ddcf347cd687081c44aba07794583919", - "47957014f0c7e5a592c2fcb2c14dc824ff6f1c0c4444377aa4a4db031d6c2880", - "5768914730a71c532084d866eb876e8e76d8d6902362dd6b8bb9f928c692660e", - "1a2b7131071015322fbe4f78bfd29e8c06923685c8fcafda7dea05d21e0a04ae", - "907f43d1994c803f5b86041508c301a8537d594ad21b638619810bfecc601c76", - "e649f77628283678cbc5e1554559cf941b960d0b6a441cda01878433df9483e4", - "6dc646835bf69d27f76d0b4b2280ac7f113ac6405073f35d039b5d5becb5a108", - "dc0a43bf8ad8e6083ece684ea6a87a31cc4dd6e2da2f2695ac46f662bff4bd19", - "a06cd8def85540752322c6e17cd496a7190dca530eb9416f74651ae7eb2e0d83", - "1bec05bca4d7436bb336dde5d95f97d68b649ff46cab39c4706fa46013946da8", - "57bb20fc3466fde4c48a005205d04178093da59fa96752e25be0c76beccbd79a", - "1fe3150e5f00fb13bc19c26f9b1bfc793062c5b3418aa051b0339c302a8c57a0", - "77057fd85643dd6d14ef06d1c3d3038831c0af6f3d5572178b5c2626c2552dc8", - "d3082f428ddf0c8c5d640ebf3073181f8fb2c1e30d7226e1b74a7246b4dda91b", - "2ce0de856f6706440842809b91f555c18971c493a5e65e8f63ea25e426eacf9a", - "2dfafd111328578c7d688bfa641f32f1814d5137a025cd4afcff2c2d2983511f", - "d61969254ca74a18495bed4d1c482a01a4b745c6914537631c7f594b783392d6", - "8660ba41c20aafabbc8ac9cd0f7fe1e3f829938aea2c813d8e87b59a6b388d77", - "4e5bd24467143b3edabb9c37a285a2329c032a9bf63ad6a0a24873f4cd037e25", - "d0095588ef85e2f29862d596f9abead1d82bf683557eff491542844db509d847", - "ba06d8ce3ac805511ede0b3a5dc3faad44def116f21971cafa26afbdd29f3699", - "bc1273b406ffb81a9e692ba886963ffd1e0723cfd6d4d91914dd1097ae1a0090", - "b294cb3573d22c00da005fd1556b0f984ec1f86987250d88f83b46ded525e605", - "6bd0cefc945c40c2cf0b5ec045a6e6451989d728e134930c1969e44fe76aaf1a", - "ff1fa73ce3175b9d25918d804697b91b6ef6aa8fe08e574bb2456699cf2c116e", - "0f5a946a2e730bc960f27b36c6738af89adadfea3f85f1bf6e4827d664251b11", - "8af0a771df7c9c83013644b8d9d390fa249c526532681098a75996bbb6f4d150", - "2af3f55f313a782243ff1cde502668574ac609b330c151339625941e41a1b36e", - "7cd93cfc725ef7aaab20cd208f2f1001f577b0fcd6d9908c00a9326565de7478", - "8eeef6a0a06ace9d808b5e6ae95b773b61dc990946b259c2071b5bb6ac772e57", - "41f1214b25a9bf7cfc25922b62ec2083a21a605081de235f5f467e6b66525785", - "d23500fb5c5f577a89d5963c574974f4eef962badf8f723dd4f718877038ee0a", - "e49adb8ff29863a3ce63d812e81cdc0bd6df1b9d5e168ff641d7de5c8044ced7", - "96c86aa6ae03883087e6431c2526e52cdf5917a30df60f903b06ab25310b52c6", - "43827cc408e45da132bc578f120acd927ce72a3c17b17734c0023c3b5f9dab8f", - "4e3633c903b717fbf9eaed68f31372b0ab70df47bea6a33c0c5fcd8cc27ad7f7", - "c7c3cfd744648fb4a84cfb503752cd016c627e41261e57de1251315a2e964486", - "89feb199675b485749d7606ba3910ef6a80365a5235f21cc677e4245f12f626b", - "9d08a4772513fca4f7e393b2ee949a9a4cf3a7830a14131e944e440f1522fdf0", - "dad6b38d8b664d31b9ebdad0dd1e028f588b4495928e41f82dbe0af82228511e", - "367cc528e809583eacdd2f7f927771ca822512fac16a06e675a2b44aca616b63", - "6f24b9d5015def0739cf3db15cd3d844118267c12963b55fe7a6f127692381c2", - "28389a3717c439909dee3cfd355bfe2d1e375647a39e92b28348615bde513f9a", - "4502e3430a8ea8042c83ff46ab03939fe5fdfc0d304c8eed49ecda45458bc3d9", - "25a64c2f15e44b46aca74611498c37606878331cef754be16d80c28e8acd19fd", - "fca59b4a0d66da786dcc968af6f7bfe64d122c5ad93de893cc676aa8b5a4462e", - "67150446c5262b91d422628ddd22e0e00a35fd63ffd00dbc06d0672ac2dda7c1", - "afdc955287ce9426a3127601673a104e028ee1d762788bd62e03b7586c213177", - "33afcd2a00aa05c7cdd2fc6bac593d5e3d4065889e29b0d96f280b1dd835f2c3", - "66b63e6f3b0e63819c5919ccc737ae9cac8d030abb8455460dc64e5492b25b44", - "fbc69a4ba7773dc6f8d8fd8c67743f0ba49ef7a59ebe42751a3434fe39069cb9", - "5add32d489e3ecacaec00e6958d99e2a069c5ba96bae67d2c09bd062d75cf097", - "96c9072b0e8687f76e8e8c5b692165dffa241d0626a7ec935b9905f4d95b8ae7", - "b421aca8f1df8312c973c4341131960d510e0a1e8e78a2cf9a6eb3b1eede3e0b", - "fa8a13ee448bcd75309214404a972f8594d3ea78ec3e42d08745ce16c56775c0", - "4458823b3391c1c04be107fef183b48cb925c3d8c0c605dfd977beb995516320", - "5d3147076c63339d3aa648bdfb60c88c9c7ccc63a816a95c74e34628a03203d9", - "8a4635fcb7d51192174aa7552d3d7a5e6f6d4c511f836ac426cca0aa9a9af343", - "77701fc33641a3fdf7707113e352c1e88bc23bc1ab6ff36d76cda060fc5c74a7", - "b1fc298116d91e679468f3d317333218cdec9f5546af80db72afd5893bf92f15", - "102fd7a44428d270c4a99ad79aa9ddbec69d35fe90a6b7e46b410b1e590ba6b9", - "34eac5165f9fa9f7783ef4d15bbdc6048a86a4d326945bf82b39d3ed3c4d99e3", - "9b7570d0790c734450145131e92f5e8045c720964a93cabde55c881a37b21cc2", - "6f2ebfcf862a8f2cdf082b72bd67885b1ef9db748410b94b72cce58e5fca5892", - "3c9716014d8627d53238fb70452f9e8d3ee1f390939bc03f4222ad01df3588e3", - "705b6faacf9866d74d9b864139d02e31c6b2d4424af69b002aee680d9cde848c", - "858fb18e80bcb1aa753f8968e6c0b256f2124bbd972a6adcaf2af06d80b46e0b", - "99a1f925132ff5b57a6d31499bc15bf86c34e7c00dea8f23b9337addbf372cf7", - "2e397122503c36ba7de14484856c4451c0484e2dc89360fa55577f4921525090", - "ef19f24405eb8eb954b923dabd5d255c33c97338ea03930415c1e0d6b379140a", - "c7b8205b0e2a2a9056abb08ffe10c836c6e4de4f1176b32bdf5e5d3715c00401", - "1f187383e5ed477d786b586d85287ea99bff95825a6767a8c5839fce40d0bca2", - "fe3f6fcb6fbd0392b7d9ad179d4a6a760dd81131e5e29277b4807505a66626dd", - "59c4fd68819d65e2ef79fe12fd4b071fbb4a123224270393ec2e98aa37a3cd05", - "81a16d866c424a5be7282737b4517ab454a876d0eb7385c202aa49aba8111da1", - "8000c38bc03639968f44742d73acfc1ff0bcc1c125826668c6f4ef5dcb16fcef", - "ecb6887d9bcde993d392cc8b899700177efcbe4f3db709b7c9ab4fce9c0f406a", - "27dd9074db241acdf1b4714f86f633625667c5dc15a26049853100530d5d5ede", - "289ba1cd1722b3b190281645590db339f67dc472b1ad7e310c322179ec771519", - "723780ab80a709b5c99b09950017ac2bfc67dffe55c150a2af59ba818c14b6f7", - "d3fb7c5a8dfcc177d28909d4e6f9822d5377de4536b4b02dce541865002f5aea", - "fc3162850367fadd353abf05c4259622b60092bdb7b1c698cbc7d6f5b6bb1867", - "25f04af47a3a8aaad12d672c12b1db63362cb0536c2083846871e6240bd421de", - "7404ab8460eab1d6cd1aead967a9b1836f220c54aa6cd9da891aff06f0f3d93b", - "4499017f7e753461db1e0d2555de42daa1e2832d863317b091a54ac700de8d3c", - "8303625fd1fa6869513dbdc0db3e6b64928400f507821f5380d8300c4b7c4de5", - "0a9c709665c06efb997fa0c64156243b2cabe92f8c5d61d5065f51d94dbee7b0", - "5ac18c5f8f931611ce575ac96febb43494f282e477a18049d0730c067c26b0d9", - "8ed82b3fb27ebc4aeb87fa9072c744bc9990ef20eeb417a9d326018087d245e1", - "44f90b15737f8df2261c5ac7e3574d1ea326f1666563f406028619a1cfb60796", - "8e1f8a474f3e78867c1ee78c0973a887e62a6821711ef8ea5881437e5cadaded", - "97812375aeab7e75d22e6f86d42e31cf6860d4c01fd3138f3c0ad9688c0b7296", - "c36640475866a0faa5f93b687c5e120ef845f8867660365a3873f3155e85b6cb", - "d678ef7c74f8d3546c8c31c0ab7e3a16d7199412676dc1eb19933d6f01dc27e9", - "ababc2c24b57d4bdc63a1a3be2cc423fcd3b48b59715238988670dc555114d3a", - "ec345ee16b6f5b37e04b13face4cf895331ca46d1a657a7d8d5b0f6fb21a0ee4", - "7d4fa641853be97e6e1101e34b15975f3aecd7ba519e99b9380bb98ec4ddb422", - "820df9e5d06977c180dfdb8232f0991e8975ab8f6da4213e31007ec782e6be5b", - "c4d732569ac6d66ced5cda9573d15dd3c44930cea7652af1b7dcd9c8e4670f62", - "53857788a7b1b380d3c7c3c66a12ee0b3630cf2d3dd1f803e0d8587787516947", - "4bd622bd965a295a0c34749e38cad39f1f44f7db5b6298005c7f8ffffcacb13b", - "45d150e9f57d920ae6848ac53d18d09f9f4e6d92a1f0b37c92fcf741dff5ed46", - "257f971a83d8569f7631023a6c4a5e3f91650e39d9d69b3302480a92760c8eac", - "8e7a5a2fea09418757571efd354ee296cd34aaf903a72631ef925b8fb938eb02", - "7bb5bc66ef5520570697ca998048753a280c99f016e0144c6f69a4b36f6282c6", - "43fc7c98977ef609815b7f5a9e46e83cf9b051ef0ba9fad10709fe6b9be2aa9f", - "edf4db9f77b1dbfa5c2fab872b87edd785e0a585467d12d8f25c4892fffd150b", - "1469553fdff23c5b2b2863779c5124c4aff7011f1c5678f80ab99c3de704af29", - "7a4b564263aceb8c2df4e501db660a252a10a01815607fac2f0d4c8dca9a299c", - "3fa7ada39e2a251881c6d4c7413d578d9c5bbc75aadf41480b058c7f6d681ccc", - "dbfd1c4073ff489f79998ea74f102326f9dfaa0f7e86d749782b5945be67c916", - "97272a75e32b9c504d002f6e4681ac14e1106475992f7295a6f818a756f7dfba", - "ced1b4e2f38dc49f35e98e58b3dea179d5813c79ea63437ff620c35169679df8", - "c764898a4da6647cee28b9f9ed05add9615a4797be05bb6d5b4a251b4c33f392", - "a38b2c4b38ed2a0d07e3c9938db9b67a0224a3de3a3f836093be87499f4d4b8d", - "5f8d5bf8fc5abe509ad0d29152a20545b17c31550ec9f710be5ee3e278dee578", - "4c4cab0e508205c6de75daaa92b43f147992257991da3bc3dc6e4764129572bf", - "2817a0bbdb50c4fdc5b43a51b99f19efae65d30def440fa72aaced5641546f11", - "656257075c42b229c28e6a7d33e14f337f370cadebd7833190ad2cfbb8d941e4", - "437ec843c55a347630bbd30f70b503ecc41aa6cd2cbb77d13089da27ad864ad6", - "835a2039c46f19bf026c4d0bbf40e846aa956b83cf452c411ce54952ddc735a4", - "6cd8c7d24e93b5b6352f1ee2d1de8c8c666866f26580fa5547bb100d998c7d0b", - "4a8b012f646f3d643c19fef0a366f39d4ecf54d73ef077dc872dbdd61e50c3c5", - "6d654c34904bebb4622e767c771309d4843246c76033b1e0576b8d12a894d6a3", - "7b8d27f130dfd027b5ac75f31de0009e40ec0f5dcbba5bf0c65d2fd8093adb74", - "77ea7ad14881f396d1fe9e01897f7caed97531a9fc688d49ea83d535bd4bbd8b", - "01621490787a72a0dcce0363dfe3a488016dee243726c4e1b58b0ba784d0a9f2", - "f924fd0ae8d34559960eadf6faa7d6e4cc2687dd9ca0ca07bcf914177b017dd8", - "56155ad74c6c6ba19ece4212db933e59e0fba070e8165f1df55b5fa904241f5f", - "49eeb2cb3805830649cb220f22c0e4716cc93151cc19e0582d07c22f986c1cb0", - "64be302349d4be298012d8ad6eec29a3b3b6c106678f01f284f0c24defdfbe87", - "e626055769ae075d38e71db9499fcafbe6cbf2f71f3c2b66fd09a1ccaaae282d", - "e51ff5a11a51a7dc13081a80ca6b8da4f32d061734c1cb0fd85f0710b891f58a", - "742bb3d27aab3567c24a770bbe756378334fef8eefcbcfd7a60b66160358a26c", - "e4c0145ffe143f658f5acf7788d92f976cc6351e07aaacabc9bbb89d02c72715", - "a09ca3e0b90b3264604081099cbd2c164af665d343b93dcdb1da78b8b069fa98", - "b246fba83351ff8ce2394853da0482bd1ab6a0f01d6bfd82fc6d427f6ee767d8", - "8c741ee30d94085265a6b315122151c7d175992f2c7ad189f4f83e17843a29ed", - "d2575ee3d01083d445f518ad0222d7d5694c2aec5b1cbbb26a66129fc489ea23", - "50d782b8e49b56563c83163f6ae9015492ef3c136bc7552873a1f1d3d1330359", - "40c976acd25942eee976637dc506194588c19d4820e975d709fb0aeecfc43648", - "1fc144f565341261c8f9fadc3d09d1faf22b53e3eceeb2098abaffc47b2feec7", - "03cd58d9c48c2b052a4035af6b9740254db1c6408dd2600daece498d31114bd2", - "8233ca2d429f99d7d91145b40c22bc9a4120c290a4265ba9de5146038d2e4b17", - "76fcd18230f228b2da19fcc884939375bb15678bc89e92cf495ceaac2099057b", - "a403dd7f2f963376dfe196f7ca8c6906cdfbf000d699d6c3a250b7e423e537c0", - "7f2dccc0d7438ed184981de4e54edcb3f05d9375e1090836c577b5116c08af2c", - "8f2de58f6b963bcd99ee06a5e285b231744290cb95df365b9a28e103481d80e0", - "dd8a95c32c3483ffd541bd493a608740f2733c6c40ab5fd61392ac03b2b76ce9", - "06519bf354b993807405da6224fccb4a1754891fa0ad772536e5088c64ab7221", - "adb2e40271a5eb5713e4c69c4960f29535880b2a29a5b69f6da4ad210e54a8fd", - "44772bbdce573d51d8bca87b3c756f681543596066abee4839c1e6b30a80e38c", - "478e4f7f9d5776c35470603e94e80dea81b2ca4ec25fd489e39819b1ef4aa995", - "1f788ec7283359224041a1b36e1d763653ce5637f3b5af6d6612fee01a1f17db", - "d5b17e0e1ac35da2ecad0f3433f68fa1391bc4fc0c46eba5c1483abf804d138f", - "57ac565893f0895a16b0f44f96697b84bfc5e8bc0420a7ffabb5d51ce42dea22", - "c26e62f65fd9403fea146472e78878b788d583ee791824db7d57a6795c8df653", - "aa171cd225f7ba0e7652424967d1e85400ce7c73244dff8adaf011396d7f2cd7", - "1812c33d1c473382e15f80880486d1e1fb2973210cb4ed9be0e96b4b1a9bba22", - "5a516269e87f2f72f00e686a8bf77a107d5e6e010d801931adcc465d409a454e", - "8170b9753167fca61b6e266e3015d00ffb3f4d170554f682edfd8c2c7990ccaf", - "ca938be48938854ff099ac7afaa9f4e26b0c357bb4c0b06f38f2761932c33d48", - "5b6623495f94c3c6b85ed892b29eea47ed6a918189d0d0b95919398023a8d256", - "4bb63c7a0bec4d587b5bbe29fdc5f23649d015fdf012376d5ceb25b855073e1c", - "f509d93a6e3ff06bc1afa791836b8ebf4e7b42426c59c94a8cd4ec3d1f270072", - "c061d30d01f4ee6ea95d49ca5c20e7339e772655fb4697e8ca93bd6dc4a386a8", - "8b53b9b6817cbab9389ee207d0dc3e2d3d3ffe9d14cf8c8f1eb94bf5a9d262e3", - "d4fd8657526c4775cb3744a5acbd952738dc4186ec98c2be36a9ea713dee7084", - "7cabed9889541723dce0acf42d6bc6a609014823782abcb43f177e69a38ee2ee", - "edeb357393ed0cd514a98dba7da47a04bc17ed72279695761b3388a9f9e54672", - "fff1132dc4c7653dd05c6697aae63bc641fe7732c7550203f94db5a5819a3d0a", - "5cfe250509eac24562f53ccc5a66eecfe8fbd232337fa733a4cf5ce5c760d8ba", - "eae2ab8b002f531527620e4b8adc3bfe88f670ba3d30822bd94d18773a96525a", - "2694aee3e79fff3f7b1079ee37bbac3093f87979d13a23be99a4f6fce1b1f2fe", - "10e938850044b982d4467cbc2ce03d2f048d68b79ceaf08ebff2f4e73cb6a823", - "3284c17de4d4bbecb67d19e1c4852cb567ec2835abdda933d25017a191a23619", - "134e4d0dc16e26ae985dcf25a62dcee188ac10e45b902c6845cf2e6ec6b3b8cb", - "7d9f3f085c666a0632e48d3059feaa7042c7fba440d3ef37b9f96582a1d25024", - "e9e1c4abce0f10e079285a8678db5bb356a13764fd923543e8b291c2593ffccf", - "ed0c893642ced3eebdba9cc6e4549608177323fd15d2e26429c0098555f21de3", - "18432cb0d035ca3102c0e1b71ed85703326283723dfae62edd261360a5e3f548", - "973d019aec2cfcea352d2c6035483ea2c4382d14d1291494d32212814f947613", - "2b248ef6a6260a75b570ebd2e0b0a941f0407b1983c30058d2332dee72f60b4b", - "7b1ad45b5dc32690aef136acf73d884d623c5060e572d96e0198cbb71f85f30a", - "ab492b1d3df028531b2b70cb2621e53a33d5479c43250371558757c91fbd9e1d", - "917e58ba56946c045b3bbd0019cff792a67bfff01b4e156351f79656ce16723f", - "87d18bd9dbe184537d7339a42aeb5c47fb262f2cfa8a860e936fedf073b16463", - "db531936bde24e9b2324f5750c8c66208b182f7a6dcd19fa243195df48a89280", - "2380c9ca25f05a806fb05bc520f0e4de2a77a091dd045ee181b0c893c3f9acfb", - "8ea6c07a2c226504dba25ad597878d9c666466b2cae22e120bf8d61856c42056", - "ad50bd26a660f51961b2f545d9a12d806d9a63fa4374d0fb2e14e6eef629d1b1", - "c8e484fd70969e1c3a1172d93f822de31f8c2f4301960760ed87aef4b818a29d", - "21e33a9343a6b1c5ec89831f718f09160d992ef96049b596dc9c3b5370b76e54", - "f96bbcb545cd6f3abdc17663e216f2470406fe7e1efb50a4e201f0202a0ab7e1", - "17e16a9e4c9c74f2c235f7574636c6d165c6cf3ea498936528cbc07e8e01514a", - "e111705e29604c397a122b1124c84cd7a69371abe4f2c51a6de77735404ac210", - "28c86cc826e6bf9b902f70d903e71d4700bdf7b49e25aece53e9eebbcd3dabe1", - "ea53406973e15b4be48fb70596c59d59e1189e32c41572a2182465fbe043172d", - "1eae3944299f246937e64a1aa34d32ac67ae24e359209a9590a00616d0c45814", - "ee88d15fdaeb36802090526c1497dab360f759762fff3d024d30916662b99798", - "1611e997db569f7f48efac9755b587edcc472f458aa9e7af4d89fca29532060f", - "9363cbc5f79c6e35a5c6e65bd4091a58e128702e8b1d51eb4e91f357c9a3c780", - "65f63a5d513cd21efb005b76af65d6209a97c11c0002a9a33609bd9b3a8ad195", - "2396a630f64a5ff88242c38f866c7b690d2ce13937f6d11c008683ac9ac59182", - "e1b1b1161be2502f26fa65e7aa1b8bf380126fcda61590d422080bab05d8b03d", - "2fadb15b66b790f66c9710e776d36a4a4d07aa02f492be8d2ca516ab2ef0fb57", - "479942c532319311b6488b73d185097a2651c4dbdc74b6cceadcad5ae6d7817b", - "83767c00f8078e4839bac5dec4a5606a1b04435b55503c4ec520dffe24908631", - "4ebbcfe7f1d3619b0c2ede86f7336c932bae081fce5a9451a54a30fc580675a0", - "ab043f0cc93ee6b0faf628a4f60d8a247d6a7f3f1808918344e610e9232fac97", - "00e3de114b385c087c741ec6402abe8d0172eb741481be1b09451a629636c335", - "17c190e492f3d28b93700480ec7141ad1c09c840b019ebf4231b346a6a608c4e", - "1e218660d0af8a5e080b395e3598bb5f00ce5540f39792fb159126ef554da4a7", - "8bf3d97d4a9b4902d445b2fa622fe40ef4f9beb049f7fa68db01c116caaa0464", - "eab6d13c76aa065e9994cb493799ace62920671e2749d181a44a4fe8c5523837", - "12291a8107e16aac37bd4318a6c1c07652535fe6aa69638e03a57cc3d6f368b7", - "5e7a0e8166986361aeea4144731c9d7007a3034d0977180230d845b5629d8e88", - "646177e17d5ac67e94a3e711a9f3167acdaf463152b5f81ea98bd7549ba406e0", - "731ad3d68fac088b6dce42aa4714bc275cc8153e6c1843d7ba6ce13cba89485b", - "15509a301cbeb16f5cde516edf79657c8abe04e8a7b972c682b43d7992767dfe", - "a23839004acb61480aa2163a012796108472cc176ef0dbe366e31c018609f561", - "d6530672b09123d4b2cd36d75836944620ffbffae4341730d9ccce22f6c4e8f9", - "4c6ab81f2a68fc14b03288bea408aa9f3487de95663f1d5117b305cab0942448", - "c9109b1c541163309cafc21694daf466d1cecf574158293d0fa3167c1a7b6639", - "add0a1dc7f2b62f1d32f18b499743023267f37458232207dd2775b59df516239", - "79de26e6810e8607aa6a317b7d3cfe969ec49f162795046fbce6306da41f71df", - "67cb9ac7d2262431a492eb94f5d8405980bdc563b3e761c1ba6b12389f23271b", - "5f94f3e62da98aac852cd356038bbe87014074318c7d9fe198540a7896378d7e", - "a8708be888197d552211133609dffe559335c73c7125e5dfbd6dd62174c01a6a", - "e4e13d44336ce706bb93db68a7a090eb857173f0759fc6e358f42ac444533fb2", - "a91ed116ec3b07834c80569e6075ad45e90d1f212aa5198fa2671de0e4088b0b", - "58abf705ff32ec12d7100e8386433443f42b9c269f7f76d04a930b4eb4e63aaa", - "a391933ea3645fa8e88814a135f4713e114013ce00ad6149de786e1ec3895d56", - "0931571eb6247b0fd11bf8626a5a1b5867ab5c40294029eff0ed359736d34f7a", - "1fa6bc2624f2b72885261988b29adbbff9624941df26ce1d1a1ba58491bb7b0c", - "17dbc64d071dcb4b2c6cc8e54acda7cf9ba55a6a2bc305d4598c349b940fe527", - "11e1d20eac7e5cdfdea51223f4775f65bc7b3c6b9cec7e7a61bb8a573da45873", - "104de4ef0fcd783a1b7fc04c0e40ad85446f28d0ad24a8fe7b611ccf0a8b52c0", - "3e7c65f0ec65af0b7fc07a576afcaa839cced4fd33b22a731efc0d18b9d23e56", - "bb0cc261ec7d5be241ea4c09595a295b38dc89df30481e8c7933e0727c38276d", - "e28eba75515a8eb89cac10942e95d715aafd81255b1674ec8dffbaa802aaeb53", - "b7b12c721367e4e4ecee4a9d6ada8f3b93531cb11dfb85bb6bdfa9262416c901", - "2832d49afd4712c4fbd2cbba47146b25a107d15b42c404c3a7987f7eca63b5a8", - "3b7e678c29a831ddd35b872ae4a6625e57a7f5a5cee0bf5f08c16bce3cfc0db4", - "2c742839bdf3d01f9d529aa9b9c9a21ffd80ac384101851867e10e5465c7d113", - "383c4bacec7a4c413bf40eb06eb56e92334a5f1949c2bc2b6c9d997a8f8cabd9", - "726e46453cf0aece9cf9666090f6ad14639f5ee2ca4d69babeb2a422fc46d7b6", - "09ddee36df92be9bf97140d46673b837156ffa8c7ab181f8e786d08a13666e7a", - "028dac245d5f3a9f6b053509d6a16ab8da34996749d33e31bedcbdfed046635c", - "488a0c72229eb78f55c5c8c934924f566c3b538264c1e50cc058f0ba5931592d", - "5a9fccaa7b7f4a08feefb8d6a9d0797b97dffa7ee913a174ced7da9d5ee25dbd", - "a81b03f3b167a453b4c015bc0b7b89cccbee3c25e2b59c13bdffdc44274070bc", - "bbb25faf3df53ed43a85fdf3eed18cf77c117b7ccaadf57e697f67c815537221", - "6bcd0ec3a325189d4e8f87638e63438680d687df6f699c50eb10770a9d8a160f", - "16071409b39ce0b1fbf1ddfb890dd6deaede159b345efaedba7f5731dcc244cd", - "df338cf50dcb357523be1628bbd756422e4d6a9a6fb7fdcd834972e20918b92c", - "96a491c816904c64f50bb9507413e2f74ddac2565a80a314d087e348c1f37f41", - "713b0478391935173cf6551cc41e5972e5a8e118ebb147c6b53d81b96d611de3", - "00b737c6ad449ca9cd613fdee1e143b3536e072b8d33a6347d660e839b04da6a", - "e0275961da34e2f2495a06ab81c93418bf1da46433d9f16258d22c81e9bdcc25", - "73447fbff3c6d8ea1507f70a349303ba70e8b9639582b1dd3ad25dc6000ee96e", - "4b8e46494cb46076580a5a2d0141543878c93a72a486387ca24a8386a8fc5872", - "fab63a32ac53e56faa5fc4f524800414775460002aec80e8920b0536ab5124bb", - "c606e393076d84b3ac729884ca1a05628767db92a2bfe3be0136dcee7bf78bca", - "335c83b7fc03382bd18ebeddc7ec231e3ecf0691ccfcd7b2e0fab55066cdfd26", - "438b2bbebe8f6a156eb5140d4c78dafadf1112a0b05f8d673068a540a3eedb87", - "2b2c1b87e7a60313d0c641a8c2c992e83ae781463ca5da76cbed7245ccd6d23b", - "82ada7046f83c11c7f13a576e592ffba3489dcfc4ed283b5f19ab2bdf868ac72", - "ba623450c04d63233795d2a9c605447624e444613a22593d6b8a93f3527dc547", - "b24da88b9625f1698042e0da8e091b399b958255e5da25683f4e3c55dbbf5bd9", - "a0cb590dbc2bf659a44b9bf8e5accb4d247fb6ab4b05f8aa4060e01205d4fef8", - "7ee84ce10fc49af6c32574fad1038d3ad2305d2b1bfe32ea68ed12861dd94c9a", - "35855659f2581adeaed81f5bee43fb3d50e754dc229d270edf057d653d4673fa", - "9d57e66215a9073b8b32071c8eb542a0bc0148787329301361600edd7e747f55", - "097b046facb8402db00886e9b879b52f74a89fa8ca82ee9cebf1aa6cbb8a8a60", - "ab4709003a1be9b2ae5902743fc641003ff76f3f5b36e11bb0107100de4f8fe3", - "403f6afe10383fdafef4b81f8f272eaec961e35c7abd3fd550245fb73f0e715b", - "f476024c52f63838cf8b48ba7e1ceb971f8f3a5944175b21637b1229520d590a", - "5e996dc1633357916b31bf327146788bc6a1db4c1b30d0decbeb4acb129269d3", - "2beb64180f8a9068fad79d7765a06210e9a44117a48c09efee35a438ec38cb9b", - "1fca43047235dd6097a2efb91e589a660c1e883f9817e934ad5a29219f573f00", - "e3f26ffac030ad9145c5a1113712952a0e60fa283e54df48deaeed86a25ce900", - "31d1a5660700831b3444fbd75600c977f847b7eca1c492f1b15a1ca7b4833c88", - "c5ed1c9ccd6a07423e33afaa894f7f004077965d78e79a18b95f94a513a21daa", - "20e99fab5e0e81dc64dc4d7ce788427e4170ef75102d2b240ed77c7020777f4d", - "3422c538b698cb7563617dc7e650c2d595fc61183645e1fd6ed33bd5812498ee", - "a2b43a4eb44ccad708beebba440ea2ad3a9d36783f542dc8369717e839f1cc9e", - "72dd9aeb20a13ee5d546820154fd22e9a004ef2b87c6ffc7949fcfc676d19832", - "a96cdca9378c6040c7dec6370054c9462837b8633764fa8839425440f419b2fb", - "907923c61162c2217f02f75715fa21daa0a0da5787ca6fb693ce40dad42d5684", - "16926a5cbe66e7e480f55e91f7ca988c84f73b1e07c6b4bc663740643d531943", - "f8d91e4368e312d909f26ed822ada33b3042a1c4a7c008ff91429f91862b41b5", - "ff6427eea129e059f8e87b73ae84c0055724bdfe2764ab66a8f2b9969c8d1f1c", - "00cc74f972d3ba6430055cf2faa44a52178eb668aea21955235b8e4b3e20065f", - "95df6b6f2971e2c889fc88c82e82337c9ad6e726dab82de0153a7b39555091be", - "e40ae9f953742f4e3263cfa25dc3b2d9ea40976e8b4836ff9c224f815717f605", - "16a9b993b94d38fbb4dd7664b64f7b7386110f796546ff5dcc735a315a7e1940", - "756119aff561f701d45dbef5d58b34841e0d9d9839fe1582e11dca665df33cd5", - "deaa57039b86b435d383ba9f411416da59d4c5b2ed55d3721c60774497ffb713", - "6b4f0d1a716f05798ae6770eb5fff4d6d03d2a6e99eb725829829aad4cbfd837", - "b8328dd9b8d579f7df8a573389a4045459298af957e39d454820e775b11f8c8b", - "cdcfcf2a386d5d2f88edfb9e54950aa2a771e994b0e59d2ea844f27ab5b4b58d", - "1f15851de6ac0b2930d3e861f746d5c3c560b32c0d123eaf38e07e4809ead600", - "fb980aaed533d31e77627a1ab55c414ea698eb1bdfea2a2ad532de3a61d3e50d", - "6ee88fc60baa1cd135b9f2f1df264bd6cfabf706ee3dbaf4fa2ce2a78c3b571c", - "aa396defe7f3856fb96a1531e0e6dc4ebfd4db28a3f3ac758a7c799790abdd52", - "6a891713db82bb6d75834ec08d387cedee648db310e583fe2c2a5aa1a50ed2b0", - "11c84153af56343cb74bb43bd40dc485e6f5d3d15018ae7d3e906b973fdc2902", - "d69c827bfe2612479a7a6c1f1ca74644b4497f6a623a1597788223eb86824d1f", - "453db271dbeb8b725db8df60634eee2d9502d3b57061a3b8bc8bb5230ce202e8", - "80275f09f77e103905fc8e3c89a56db213838bf908ba8efff6bf27608c9fb039", - "1089c35d7fb53566b7172285fa5a077a4604ccb3cca85d11119f864ddfd9de24", - "71ecce6b195d02040ad8f387b5acdcdaa693295e7294afebc61737178acd7568", - "e79f1667c68c243eb71aff528a22d378b9d98ebaf0295818716a46ccc7dc91a4", - "49b31f0f1f9c0b8ea15ee48c9ef3fa1bade240681c57c5dbfb841b2b7240a4bd", - "360d98f14e6e20eb5e81f4f712227dba1d3096e0de336e8d77ad6e8224d9a2c9", - "a2d7ed985d8df83c5ee50521f6b791f955d7484dbed7aec79091bd845da5e1b3", - "2972aef25c7d91a94ffa11f6f0008f5936873ba59e663e9a622671239c23b87c", - "81d5821a34bc58bf7da7f10e432acf7a8f83cd6b717a05a32c2e2974886b6f50", - "d904fb91a3b5ee10caf5f60856879f1e7c37e0d0140a127329bad45fdacd2028", - "90a2d34f697b75e13cbb9cecc0a82c1e3299f59b28869b7cc9df2ceb50d4860b", - "27030d198f200f96ff2365c1a338b157fa3db87528b53fc326d28da544598574", - "8c62226b354b5fba6e7a1fe667ff9afd5a851f1d3effd89aca122b8a0bf54f64", - "2e108318a3368ef4cf3f2d16377f034b2f187b56959baeb8b59e7b0c075b8ec3", - "f1043d11c37eb2c7d643ce71b45f02c5f951a2dc354b2c3fb6932e6cc7649eb0", - "690d522d0942c9f88dc53ee5b885c7b52eac127d2d6ad7b82355873a1a302f71", - "878a167e32ec25488188c755c9da0a1d607560cbf8d111b29a2d132c2a248751", - "1d62b6b4d4420d77043a20ab871721a2e5fe7c5a1eb063bf9cd56e0c3b02289b", - "14741cf41d513fbb58c30a2f6560acdfec35db1fa24f5d49879919f2a262bb83", - "a3c1b82f09ae05ed465d70012058a385a30a2137d7fae48d31b4585cffa10efd", - "cd21430c22f4af87b267e293a3ccae96422590861857f967798272887cf2014d", - "01fc66f49e8c5e98073b7b7c72c01af6b8e44358f2ad10919509227c0f7a1797", - "76e4fb2399e22e127558df53166bf6ea40695afa142b50316c07a9984b81f60b", - "ead721a7c99640755e8c4b9fd908ea5b116838f9dc7cad3c106324828d69fc8e", - "3c10c5f8575ba9fed1112edb24b1aaf1daa8dca5f2ca1e6d60210395d5518cd1", - "8dc30609fdcb8cb0a877c38f1ca79ff58868e0d7ce9cf8b0c5cac3355f60e5a9", - "8f751a1ade9490acc19aac9cdb25656c5ec694ed1cbbe8cd4cb37f1ca5112d8f", - "302baaf16b186330a10843164d82e8d09f8c25f2300f26b493ea3297d65f1299", - "c897c41adb6d2cc213de3bf7159fa32e5a412acae6e79be307b3ea76c42ea382", - "29319510e2f401b5e89978fd2b182bc323519b95a0652cbfc7834a1690aea23d", - "13873d949d1b3f203dcf64dc5adc6a28a77c89e6c7ccbf198624fbf03d6ebf24", - "60f41ff265ef126a71a0b1e4196bf53ca0ef59a8f9013486f7480df8ed18ee4e", - "a34759a4fed651a6889ed016f934b23207a9ba29068298661f45da7ba8ec53ed", - "4fb9d15ff29eb739e914bb84ec5cad4c5bda08cbf8d427c7f9766289019e360e", - "1887796dae474f60f0efb81c16ea89a64fc4ac9a0639e2d24c39e0551da10ba6", - "baa79334386b9bff38539a4eae787ec862e74ca8d995e2484394431ec270b203", - "256efa4f0f063354361128a0ab34e1866f5702d271e8b9287ef3f64d3f538075", - "14d4f9494674958cd93db2a3c9d547cf484433d484508581f1e096d3f9987265", - "0fdce1b1309ea0d1605074a534be553bfc239fce97a653c5f9533246816aaf9a", - "78d8897dd3ff3181fa9839afcab5abeeff460a3ea865620033e382ae7bcb49d4", - "ab82cfbb3ae1a7850e1ffbddfb5100bee10bf7130c17ea23f20e94f2497328f3", - "253fee4a2866eb7f3ac6c181a233ff917ad5c298190c85ac0c9001b4bbb9d593", - "ea308111dd61c4261aa96996b95534622b72c896a87e532e565d1468d07804bd", - "492e85f0675a32b84d1ca13b3d3043ebc9c58d2a49f1ee9bd16262e2dd68e52f", - "fe881df9d69a7a54cc7a983f8ae247e2696c5e08bb6dc1d1574859d1457788e7", - "881ccf855abb2c09a5a70108c0b3708e5b7983575f7763af139d07b0b450380b", - "13ba750659acd11f08f00019f251ca768e8b905c29276ca92eb181ff9614f4d0", - "1defe42057fa1ec3e4059343a06b79da1eff84203f26e7a71cd62fc24bed2a51", - "9f28fe53882bdaa7d1a27f561d1f24ae8fd8316d1fe9d51ddc14380af851788d", - "642c1a2c0a8ff7a482b13f6f6abd68a828b56ea8fa47cac07ef265ed02c20d72", - "d7de609a9c106fdd6ead0210fc53e4df6e0f2305d10c4442cf11c76eae2bfde2", - "5082e9b038088e3d44cd84f6ecc4f6009326178864e80989b2151692337a9c47", - "f623e1fabe6092c33405d0d0c363f9b60b36e128f14b28e3ad1fcd58d475c705", - "e24b0bdc857d71f28a745bd81c9e0108f66f782c7b26647aa87fe3f18f6563ea", - "6205a01e069c97542a8ad04332343800c89c110b8322a2b445b0e9c9b298bdf9", - "193cd74fb213df953ca20a749bd77fbb36b9b1dc2e899f8630f3212ff42763f1", - "c7b19895690906ce28a2e8753711c390bb1aef4e6ee421aca401000bcabeb5d7", - "47289a605fde58eb815f990a0655b4db33d4ddd5b87072dd4603abdc6531b546", - "bc181c1c1458fc3af7bfb8da689c543231c5a39b35eecfc4b3efa93722c19f4b", - "46bdee908c666f7e518583c2273fe7c13c686f41afddd47e2b3b31b3b3526a39", - "b90787688ce11d58d93a71736f5883d09ccff3b5600f47e1860b1296099e2f1a", - "0873d03303478cdf0626e1315901dbe0d9d96f1da353476dc64469523e6b53a5", - "2a3ac38a0c8b0a368e214132edc490ccc05dda3cdbfd6e832de70d2ab5f34526", - "6cd504f67a536191aadb8aa5ea18c682b478acb1fa0052ffd4d38ed875f54e4e", - "16247462dbbd170dd62ce61cb5f04ec55cd016668041d80b25e3cef24ec4d627", - "304d51af4b2d0ec51d00584454a4a5b37c133f645e66a83065131ac67bceac75", - "4bd1376e135020552085983be0c8ff5e90786c17dc8fc0ace3ae494a7a44cc20", - "13bba00f73ee4baa89ea4237970b4ae2cbdbef0ddcbf3b9ba59849dc166c7d44", - "44048493673055ba29b6bc57c7c0f8c52fd7bbba6b310bc74ebf08cc03a88e75", - "83588c5a017a10801d28512e1779708057ed1cc34a000fa2c70da0b00549538a", - "f8c608e457e566c4828fd9c2daeace164d77a2733510d516de80a8d1f979b228", - "62cce9033bac4786f9679622fdf1ca36f93a54d34949451af20d7033392c401b", - "97e0621bf4b730e9fce8e8b6cb5a8eb6e49d4f5bce10815f7637efbb4b56350e", - "c328d584f11bb4a4216ba0f72ad3cadad6ffc55eaf5ecb23e12175b4c0523fef", - "992156a14821c1d81d371abdcb639f0e3ce750cdb0f91600f291c19172c0f5d5", - "b2b1286458e9c6f19a17711d3f4fb933e198651d26dd19c98949b7ad2e815ef8", - "2d67a4841d7fce95cf1ad80ac49d371d9d7ce63e011a3bfeadcdc2616424104c", - "fdcf5e181b317c6d1db358c36a7293bfec094b293bac97aebd3730f6d4694184", - "3065c07a51161d7f84522a25309e287db4ce27b127c17a2e941053e92edbfdf1", - "9763847c9a4d60461346642b1253dfa23bb7ef02aec7c253bfbe8ab75a1c9782", - "5c349e70c0aa612c7690aaab5301d7cb292f9fcdcd51edfb437c0d017da1b261", - "13508f7583dfa6f9649053787fc40e414e3f3d3321811b549ac5a866b1ba29dc", - "2b787fe8641f41c8d67c2e3f80356744258b04855e69a05e0bae444952da2be8", - "889f9dc47ba1d842ef0259d0da7bf5e54e221787a3e47e78a182c978d5c94fbf", - "adb4482c3f1ba9c5567eb553c45e3a20fc3ce7d3db6c39eff5873de1d49c1eab", - "e00fe4a478e4eaf9af478da62848b32693be373f3164ce336f81f1a4d9129999", - "b9f8424e91fe882120f0dabb71bb0005d9ae4aad46a62c31bd470200078fa972", - "f02a98b2d10b923f8e561e689ed5005e256d4b22d2b5254f8a76cd023767dd19", - "bce9c15fc113fd7864a0fc3fd1ed8706e43a580b3f122e4a794705a35e59bb86", - "1d69ee9161f4fdaa457d10d0a62278782a2f75ce103266660cb9adf6b8e33253", - "013b0f31f182635c8a74abc8b309f28a4bc33e12e6aa6f173e4fd8d788d2c61b", - "a84f89e4c7fe95d4164059287a7714cf49e2b9f9dd50470731d255d879d74474", - "50498051a890318697190ccac694359146ce2f0da630119f82280924503237c0", - "949b8c077c0b24b5ce9d202497eaa6430d1095ae92104c2d57e58d7509a8db26", - "287afb4c213fa2c693ccfc976708a3e199a9cdd95c1fd19feda4f8ed8e33bd1d", - "9da6707e94d533292acde1b83a8e3824f85eedea354c73fe2071aecb50b8d459", - "2ed759a1477222d9169ec3d04821e4bc4e84f675575c5cd6ab589d8b315a6cce", - "daa3c017a47a9aaedebbd61c9626efe6753c26ee7411faed1a608e97dfd64b36", - "64d02a5a40166704440a5ecac77938e31a8a8140167f57340d4b880fc0bc5cce", - "3d2f2eb359faaba675fe325cad2c78a6a178d9108996db84d7d4b4cb048fb20a", - "9f1385bc0b54befbd68c1675c1838052f93ca5600509a68250ccacbf47b936a5", - "c46809ffb72c72f23ad56c85ca1a23135b566a4a7c4b87f2264b5fe70fdf3086", - "bbf5a347aa1b113568b6ad27dd48d6ffb48e3886a10ecde923a0cfd71e053335", - "963847ca415796ad4b8d1f2e9881a7df3fffc6abcc465dc21c346c1b53b08ec6", - "a1ede40769b7a15a450b323f623ed77ccb69457f1c1f4505434c1cf3f4f81817", - "f8707c1916abc6e1e64888573b7ff33d876097d6e5a5a2ff617da6940b010dbb", - "012e56960bf3af4f8572b12f62058ad85d9c47e22896290b9b6f5724b5e1d5e8", - "321193899fcc63c8e4e569048623cf00e1ad63dc034b241706687dcc442aca0b", - "0ef538fa9145053f50dbc1919fa5257cac2a9e8d04a613d968c1208c6314e7ce", - "c125f8df395d4f6a169b280d84eb01cc4f336cfc8ff39950f5207aa9bf03a7d2", - "e9b43663360a728f83c91d80b89b54e78cca0cfdbc8e0fa17ed5a7e6bec01e35", - "6a4d1e7f58fabe0ab8f3b77708dcf783494af0f6d12ba2b1b2d8f005071b0bfd", - "0dd41c0b7bb0482f8c9a18cdcc9d0205d93427300a35154fd5bd1dccd620534a", - "3b8be3f5c6b57cdeafc09e2647e26fd09baaba3d20f981d051818d1b05e0609f", - "183a8859b198e951366815b4c0b17d0da6fc4178f90c4981f2e08e031c27114b", - "b3b3680fed3a16d5025e1facf894d4473e70e56f69db759e4fef3f8cb93207c1", - "33f49953d679f59b59f484f9c2c6a2bdf618482ac3d56d82b084c5121e8f2c49", - "ac3f27ff40e41c569ac82ccfe8e2c2212f62becfdc7f4e55a38d2fb52c12f166", - "aa69c8c99caccda1098b48a39c05576ffedd1b5cc27809ac2cb37b967b5952c2", - "5d8a4172e7f3e2518fc5268e24c824f7e1c1caa58254dd3d64fdc86af9c15f12", - "b48c3dfc16fda3c30af7b10b939caaca40aa66669aaf05262548857096fbdfae", - "f0f6e60511a5f104b9b6f2d13059e1f76f30cca1c793be167d331587b6abbfed", - "e17641aaabc6a97354618e10c8fc7f3d8b1ed1ace57b32df7f40cce1f40d7d05", - "8edae3d72c5d8dbd47896529ccfcab4a49e809e0ebe2fb06561dac591aa9a572", - "990292faf8e93e1adeb6239c36140f2478e833036f78f39fe5102c61bb1a2926", - "11160480163e49dc6f1934c29a0acc7948ec7c9766dcc6d6134179fd5f911f83", - "f73ea1418d069843c9b81888826ff2e62d20a554f93d3f9270bed97be8281cc2", - "8f081e28b7ee1455463b1e1a6ae497161dbb69a36c2fc24d1231f7f0c1722439", - "e7b1ae06bd5715b43cb3335e94e8390bf3bde6e451311017156fa05ac6ba1024", - "eb3c1e951b27063ece1547ca9a3b44994deacfd02ac9ff28bd2f8bce39e6dbc8", - "22cd3e1db5164651b558681250e98ae5a1af7a20fe292491eea1e84ef77c02e9", - "b9dea7406030d0734e28cbcd1c5b2300656699d7f7292426edf9bb5874b51db7", - "32d917e8b5521b2249336c009afc2c22dab775495fe64323b82d9fdc4e616dd5", - "afdb6a4a19cacaa8a8237a36459d7c8051d55869635afbd9ae2b7da6d5bada07", - "6219f2633c74f2cc3d1e95571c06624a204874db5a246811b3c55390dc9b1cce", - "1c1591d020516d1000084af8a55c03dfe0a8f4cf7dc35af3c61b368758e9bc19", - "eb3622d9d697d134b048976d81238ed946f4f9ed8fe8da4f84fb3ff0963686c7", - "65fdfabb6af367bba6f94abf0a7aa294f712577d376ff3efe0b357d5355844f5", - "d9cce93e1a70461743a792eacba4eead3d995a818af0954030e5d56362ff0504", - "e896aed71f98a1308b87183974dbf5f6e2ab3d3d577d039e872e74c8076df0e7", - "ac024873a764b004eb43a4a7632cffe34c7a8f82c5fb5c7764c9a07947070f62", - "4b94bd5b096a3f450859490de2ba1dc9747d3c6fcbf65b0480a99b9232a4d7af", - "9453a89279205d92150da43ca87c3a0eb84ab2706adbe151275f6b5e579d5d30", - "22adccba59b6ac22af8e5aee03e3b3635ad7deabf20db5087d2ca1b032b8c83f", - "e3df59343d29eedda4fad036f0d37f3b82f4b93fc86e3af6574d1ca0a7044a3e", - "78d0ab2d976e9b15204090efff08e2ccbad5023c1870e12b5914004c575bcdb7", - "4fdc53477e74833b961e10438204fc3c86a67ec1636e52b454f986140dde6f0e", - "8f6a87e9300e356b31bcdef423b5bf5628afae449aa589d9d98a06e41e59549f", - "34ef98263cdc769bae4f2697e0b7d17427dbb34a65a313a23a126589b4167748", - "e61dfc7321cb73c69fd48c94593bb641ca758d4582ec07f2f55b0c5557bc9d86", - "a2d5cf25c1d35642aa331f3decbb4c6cc8e87bf751d89b57262c8d416473ebd5", - "192251a0de89aa58977c83e04f659bce9388211f1b77302873581a8e6a0e440e", - "974b64cbb4ecfbef18c401a8fb49fc1ea59e4cdcd2e30f36b90176b03874ad17", - "998950547569988636cd39155f458d17147bb384f739bde4f1dff5393a06b4ce", - "cc2c77ed634bec725eb73e0a0526d66cf5a3e260a5092ac92655e1cb59106c6a", - "f4e5fb4080385463c2a058dc7912fdd91c6b26525e140245b115607a6419f5b7", - "dbad7e90b074bad0603b9ae1239d8cb8d8b02e00f4ead5f2028d7a743a507f6c", - "ca9d4db13d67e49d495656be370663fe71d3385aed420f6ece761d3f7dc807fd", - "01845fdaa06e333d4efe02b3bb7aacc42bd46b98fb0c68208320e849644fe691", - "cb6dc26738f28fa604fcf8ea5e9c54dd42d55b840c49d1f3d35d4410d0a92f34", - "1d6f5af7a566f843943f1271c6c535c728304ceae6f661434af92d5b5f1e0789", - "59084a001e304bff4c0fef9e6ea2847457e6c7b1d347946eba6efc10c192e57d", - "60d6bd2e1fbce80126d8217615f2a13cf1d82b29b572cc661f93bd70513978a6", - "34312c3d0430f3146fc850bf9f2c70ddc28f575f6c93807ceca02f4be426e3bc", - "2bf97ceed4e2c824facf7540f541e3caa711bc303b65dbfb5b0302849b4c626d", - "924d0f80d1a68fc8e034ed6744234991ff3b35bb8b2ae3aacc9c39b9f88446a7", - "ab6f3d37947ed1b7597832113a19f63c52b2b6a58d85e7ef237bfa0e7767cbf3", - "7687222f1c597a1d434188cc51f43599fc000a385640c0697a6820ca05525116", - "6f95467fbdbb3289c3ea83b7cbb44c049090ab9f622fd4064da31c8ff608e3ff", - "c865f493160ad610c2c8d2b440701d1ea5d862e4e15c1e335b5323ff65bb4485", - "e8c961dbfc55eb5b6a41f498dd78fc17f647b2552952c8f29990d833e1778c11", - "bb789017233e9cf506c21c8ce0686189497730c27fc0544bf4b9f4c7d1d88370", - "f1556ffa26e8bd28a521fa42d9b83cf1d89be7e7b518f97b86f1b930ce9b891c", - "9fab4ec4565b857d1fb2ac9cef447098ce6cfa9c6d94117b745645a0b8aad59f", - "abe08f55d370e90fbe16263bb5f7ccd78383f33d641f569bf3b0551f67773ea3", - "f46eaf48c2bdbcb1d959382b13aa08d20873f20546253c489e4a9a9dc1729e8f", - "f16adccc86d8b9d0c5cf7f6e232cfb822a75ac1f5d84aac51e622bce3b28dc0c", - "9114cb9e94f3ce773b8fe12019b7cedb71b8fbdeb4251baae8315c74178ccee0", - "1b2ea040716f9b14610a3b97be6dc6dbf0e256f3ad7d50581e925d4cc44bb36d", - "a61094a02d02733a6f15719438666127f5ea721e4706f1fdcd16afe577366ef8", - "6d9f1f0a31d861b571e63d0dbb4823b3bc4e367606afb560dddb7dc3db1e6139", - "fd46ab3b45a0f88e76e94f9ed6206fc73ab1324ee7b6c26caca5a44ccb537444", - "e2900f4ff8eaa51000f1d59a2b196b2d39d59d606f9645b382f93044863b9f47", - "2ec978b1de94f66c044da2b58506861eb91d4bf4f94d505c2c0f33f78e1feac9", - "c880fd03cf757e4827f03e3bad897139b2b8995568e549a06a2967806fbdc61a", - "64167c667d7d040ee4199e99d8aea2263a0a369e3d562ea1afc6ac81c791b4a0", - "be503f7cc53881fb02e6067285d3120480ce2c2d67b55f958cff27042e126f4c", - "213c60b3355e73fa8df716be2f221263052330c4b4f418d1ee36f1ea9a1f983d", - "dacad3df0552a29b5130a950aa87ef2b85c45c286308f4cb1ee2103e5212ed7a", - "4517eb18387f4ce263214a7d18b327fc43171b433a0fea49c8a8dec01bf1ef5f", - "53063cf2902ad788f6c79282a06685a088e0ed8398614f549b6159ff6fd106be", - "4f1f02d1a73d1647dc8d6f20f510bd2830e68b27cb7cd8953f80b670085d926e", - "a8d723591aa8d82189f6b52dec869c76cc0895929dea7e96d1f647738a7d4852", - "96ae55747626d7c015f23f12fa0254003908aef9dfd25e3fe99d58932c9826fb", - "d62bc6ff912305a6cf9ab599e5940e1d09f4e1b93453874b9aaeb0f2f6ee70ff", - "e023065a25d86c4fb770a0c683208ae92f92f3993eb37ea2f4016c119d89cb50", - "6c0ab955ccea2ee1bc9793c215f7af8b8ff163f6f4b2eb8a0f87bf7b4c7374bb", - "0eb4fa648f35a97aa6e5f80cf945feb5041ed5f069ad6a9daed067509074e57d", - "7294746ce88460dfe5bd43b9576c00bed29eb545ccaaeee6eed049c09004ba8b", - "5d1dc46ad2e091c1996ff906a8df91635d2c996dca944f2ab1dd4da2cde9d2cf", - "424be2b67d21b4223af1fe3fa7a453bc58925a68be2f0af350f882529c0516ed", - "d5476160b5fcfa73c210d4dbc07a2af2338186fea6d17e26223fb231dbf04abf", - "ceed51bc4cc7b00b6937636534837bdac0e5fc62ac0633ef04aacafc7ea788e6", - "4d32702138180177e8753af494a00ac13322cab0f4db3ed6b8e0c351d7e4224a", - "49a501cf3f49827d66e801af5b4facee6b6a71e91e57fbe87246eef76e13a3ff", - "ff62ea9b458b81142ae6622b6966d113828eba955a1be6f48a0cd5a3ab95ca0b", - "d061aabe97a2bad496c8930d2a1181fcde12eb88cf19ca3da9e61698cd153185", - "7b78bd22402fe820965c5825a4c0dd23a455a57df6fdf5e77eda64b1f476c58e", - "d88ffc83c22c8bfe0c95937646e52a36405560dbd2875ea686b43b2957f689e4", - "f8ef735e2bef2942ea69aa5c7b614a1d0078f7687b2c2322c8cc1f291508a7b8", - "297a891781043035ac3dc649d15cd4fffc8c2d12c51c57a64dfcdbb64b9399f2", - "194053b3c843addf9ec1565765a2bb419f42ea7affa3a739407f84de259dbe4d", - "3f37111c0b70f18611ed99ca51932e483e46122f2ad27a5492ea3bf9ce29a09e", - "935e72736d8ea8171ae1b0623ee26c054f55bf2237c1df051a0411c1de63144c", - "99280dad189f359b8696a6ce50a37799a5ea4b1a5b8ae21a17a8c0d5f15b7c61", - "43f732be65977ec280ecce1b8d4288b7d71e92785c41de7cf71da542e4038e31", - "6b7313889d7f8e7ae1b0584f4a5d00f6bd178f3ba18607a3e14ea116fb271367", - "f1600438e9b7c93bddea6ba5e51843cf3570710b0e6bda9223c09590de9ebc02", - "0c1cee7012e4af158c06efefa4abbf21e19f34d8460a23550c7a8df202b905a7", - "faee85e8b2ef01e6a72e79e1cef6f464937bcc705e5370e88404a58ccc89adb4", - "1eca0eb907f349321777c8a5569b220e956d54b35d638b999af3724fa7d4c523", - "be07108ea60ed88c688cdc36c64fbe3236895e6b4411e222ef2c1791f14027b5", - "cb3a4f56f4ccf6537dd79892c8f745f673095bc9e0bfaacca397db27f7db9de5", - "e0f9ae7ac285cd869047eeb534be6a25d4407e76e52655ffb680405739d60b7c", - "cd883d1fabdf1beeece4cd20cbcdb1827940b61672c75e80f54276891b1858e3", - "b4fc5c8128b038bf87f61dcb0dc20ef19f471e0e0e43e6a44a79df124bae4ef5", - "015ffbac2f0f83787a41d47fb6682b8c0c34b9a1a7d2e7b43788d954fa429275", - "ca2e99b9d2ec4304a9fcf815535e126182b8ddccec457035ed645d5f08a802a9", - "dbd98f8364adba34da774fbaf9a9702d14fccdb3bc3c818feb4e4e9548b53490", - "2a28c7ae58d59bd8dd43a7dd53c03856cab93712a5c54a0c8545f07e519114ac", - "e90eb4049187f2640ad9d05dbc6a20d6bf19aa093622e7dddfc90da93f087b2b", - "41d47bc18ec348036d23cdb042f3c6fc3292ae28e21c678fa1f07e567251b041", - "6c4afaa977bae4323fafb4a9902cb3e4696d19cd6f31a581e411916aa3c57bd2", - "dd81ab6bd9c57eda326457b21ee1bca6c66db52aab860679164333ead5ba0fdb", - "4717d7a7a05507f9bbd7d46f0276ea1bb2c0e1437ccc4713f97100a9e06ba7ea", - "003806698a3f03a13793aae79a30cb2f1451d595cf0b2b13477119c6eb54a5c2", - "852a6d5d98b6871c9d3b135ae218c6137e0b6f19184483e3ae3b42faeed4b40b", - "037ba428e39dbff8f22b1b6d5e386cb7401fa3ccb91b9375e47dd2b149fc8557", - "6fafb3af2461b0b9bdbec23bb0794ef81a77879a82d9bd582fefb4f3972b7aab", - "bad16d93a138ac740525678a3714eda287c2c40d570b277c15775debd4c0dfa3", - "770cbae4b56c8e0a5d0080c54590d47eed318292db71131a665a3aa758d94541", - "621bacbb4d46d2dde8453d95131f575d21b94c91fd0354224c7cad025bf77783", - "383fe78dafeca9d685aa97d1776d5f712b345dab43f600d6de50db2c31b072ef", - "2b885c03df495d631660756926d4a499d20e0e2f52860a2016125807c9f152d1", - "acc0145c9ae468bc52bc69649063eaafe952edecf3c722063d052da037ac8c3b", - "913772bb3e3d79e7f4d11fd126ea81f92a8979a5ba087f479bdf93e714c3bccd", - "fef8d6cf5634e379754714d2d72d8f26b592c09e323728f275c1ec03373d20ff", - "5d073ae82b89fb8f0471bf3903da004f9a842171d9b20eb3cbf9b1f9c38087f1", - "ad5bc76f1300cb6ac50b60e7ca444fbf08a7300255ddc9d38964ec1879ab5f98", - "328bd3908361189da58de391f86633066f113663011d0788a547b31dd0c65488", - "be47094056aa9de67c93cdc956f2dcd57d55e047e88014907b519b9f48a59421", - "9a5f3507e13806f3d5036f763fd760d606a7f4ed9fc62fab811ff1d0b0889afa", - "0696e8140fb40f337a3bb02ab4b148c7237abc1b54a5f4d5b00cae6de7cab815", - "297ed6816d20c012426ff3376953fa02d8be8efdb6803e2f2cee20e56fb1ddba", - "31d085547246eb627d849c7fc19a2fffe6a3ccaae915882c0c1e936cbfb08c0c", - "11b051786cdd6ec8c57f9cc09033dea5c369732370bdc28e779d48ed954ba5c0", - "26320835dcbb1f3656f24f30aa55db53dbf6b1b89e0d2bf21dee4b362e547553", - "e917b64167dde719bacd1d454f63b19a10867fb8fce40cb74d147066efcab57e", - "0a8bab3743d2d1b7b9155d0041e605570194f01fe0522e3206d89308b42803f0", - "0986ffe845ad7705fc0664b91f6d7f388ebaeb609dbc7ea781b5ad394e0479c0", - "fbe0946fbc42b1040324985eedd7370c1d8cdb6200a3a46cfa2be61809c8cd9b", - "2f617e7f2309f40ef36f377e6c9ab56b5c10d08ad26188b8d833af6e2e5db163", - "1b8d1e1dedf06ae59f7e2fd1aa836d367a760e4da158c7c084be67891fede9d6", - "9fc4f713013e18a68205520e56957fc4f97aaef3b4a1c30a00d0d3f37a4ab500", - "1b79711523335abe38be3e6a3eb0e6948956c6f5c8775c3348683b34a9126a82", - "271ec79ca751a3d6af6f700b86acb2c89419598adfc633d8bcfb3348211a15ca", - "343a513b4696cef9ddf8f5bba721101b46cdf5f112f0b35a2b196ab78c4ef80f", - "4a798aab040c14a0693753b001a0be4e84e6aa8637a16c5543c1386f4dc46450", - "25fb4aa3c62c8dfe649ce09d1898c09df52794c10e3d49adc86f672278bf9a73", - "2a8649c65ffb52c51a46d2423f63db71fac0ca9fdde1c1e647ac516bcf05d016", - "589d731388c1f30d0af7ab512f45a56697f9fcba35173abc49655c32ca740ae1", - "72890a5dc2e8f2f3284890954069e0420f49e9b679ddc44f367503de31554263", - "5ddda6c2b97d73c1e958d91aebf4ac86868b6b1f889ce50bff5f2e4d1a390634", - "c9fa1317b462b463d38ec59e4f15bbcecd860cfcf336f02fceb5c2a3c5874bc6", - "e3a03e5e27933d48871d4d77ffa444ecffe1c8ad2440f6976f270649eb7f3094", - "8e4438229fdd2b44fe83aaf85624f79b5f01ebedb4adb28ab31715872f3a6874", - "2b5a26fc15d68cf2cdf934231a8ea602026ca97634ca3dbb81053c3a894dd65c", - "e3ee611c6e5047aa08b86cfb70557a5a6e76d7a5db4b36854701a0eefe8d21e5", - "6c2b8030c8067e399e61695c98094c59f5bd07d6df9b56ffa27191e1f85a742d", - "16cdbe284c4554c207c0aa41ee6f36ba51e5e97f4f30d808824d176df3fbb266", - "785f45f2afa2ba3d3575b76821b48db6f3fa6a6a81fac66d4b625574343ef2ad", - "233712a73a6d6d421df93296bad7b97fd85720fb1632c8eab61069226c4e196e", - "68ec2aa806e04387e241db12a9ed8acf5474dd5ef74daaeacab914a9f1d3b6af", - "5102efde7e0b3d02918c57e42b5885e6abfdac0de3e05de0b11948c1c354cd35", - "51d89244f2b324bd2d20f3133448a5f5568c976187c1d8ec77ba8bbd366a0778", - "be98bfec16d895dc6ac364cc7e855163b9909d0126694d2064202e5721553c9f", - "6d83655079e69d30ed2f5102ae12fc803224ffd64810557983e38d8da00c1435", - "adf37eb58d82846a15d255c527309c56f5e030fac60dae0adbd7ee5ef412e244", - "cd5848bb0b321a6bfd711ce00fc63ae201034dd635ac4a43babe9555ce6065a4", - "c72f8a81504a8ca776bd554bb5b909bbee21ca884d34791cb5b7ea53d0330ff3", - "cd828dd18bf923b2478de96cd1009cf685d83e8ccbc28d8528c2015fa5b9b208", - "b959eb95909cdb39ded5b6ee63243ff3da10a5ca17b4276f2bebc0eaabe2f2ee", - "39d7b61f9dec117f6ca3d03250595d839e094db3bab5d2b17c52b8e9ef783d6f", - "e1002f19d675576eee5f8d3587a4aadaeb0d2b704e2c4914285efd5a0d20c884", - "136ac4e462646952603c03ebee8816fed50db0383facb4f84d9329fda115d807", - "1d0a7ecc4fd04e1036f0937192a9236f75ba3ecc92c8af203a0331f927ac4081", - "bab61c3ee7a7ec23f381ae0dc3c613a8f59f659fcbc76febd382923719c13315", - "da19f3076e4087cb6f3252505e9f6f9abfde5209bc5ace00e5e9eaa474b74a34", - "de286b58be8f1b8c7e70036997678d9258b340609cc50c667824ba6dc48d84b7", - "0628846d7ff907ba1b88c0529e51ef2f2085e26ab46bf01c4e1ee27337ea6bd5", - "043c2590f4584fd8f944375377b6ddaf6dae67eed6c2a8b185215bfef147bc9a", - "ffc3c88ad1fa0b7d56f1c2edbca9658c840b2675aaab78135c1f308b83927d37", - "920610e0e5916ddb51e70b8f0d82e8a9885710a03b8d90af2244683ead585bb3", - "648bb105a30b00302c654bf9403202a939df99f8d4feea89060eced44c55f5a3", - "ae492249237cc5272042554f97495e22c569fd981f2e7805960a790c59c4ec71", - "5048c7e4340ee5c76c004cba9792a56ae890f2a3a5c095b85afe4a4b97e0db23", - "fcc858b48da07affccad74e77d467120a752966a855c93c5fdff40cab00bad32", - "6176e3abcb72b3cb15f4f333ee7fe3a687226194dc5938be0b5eabc7992d2f33", - "da6b6e76d42ccbb3ec9af88f741c816d9bf3355894b3558165a421e7bc7f6d7b", - "f228105625eedfece26defcff54df94d45c0731c328498636f785b2dd9953f3e", - "1ae6ac5d498594e7a629660197b6ec64ffc3b7d114b6c69d59344be23e8bfc5f", - "baeff4c037df8b61b48bb6b7aaff1d125b93ce7db2dc5313fc5c5497d656302b", - "b4adf1674497a80fc6d7ca4782a0b2253b2864c862616e83d477a4cee6f42ea2", - "131ed9daab4f37d672401c3181ffafc80dbda4c930db0faf2caf87468adab54d", - "39014679f2592d51adf12782f1583752163411f938f11780f229d4ad1e64ff88", - "4eb23fd789195af71d1291a5b8dd5a6d69a4e86ac0d2dd531c20e9d9abaac48d", - "0aa14980d3638e701f5bfe450b5bb0930eb9d3fdd8ea2f9454e15d8c8acfe1db", - "19c187c072ab9e6efc513412025ca70ac9f2a27472d9862e10d6c4c5f72fed8b", - "1f92f48782eab99673859dd24e5395e121fa861c9da3e60bf5cc0f349695d480", - "ad1af6c60fcace8df77a30bb649300ae390e5f7bd4ecb33b2873932c8f1a9cbb", - "0c0256761bdf3507d0eaa27b4f86663442e2d8e4a3b4a88cb415a950385f4f67", - "311ba46c6bb8667f794f5116ffc3cdd21b37830b80f06538c56248d0e914c89a", - "841e24e953e80215969b23e840086014b8c30a2afed1a91bb9921c67f7f1bd78", - "7a87adef86aa71fac99d50a59f2122993a8c6b7e253f8e5268270882d3261430", - "23b47d3322639f3dec55c455c97195bb857a72c8cb807fd36965e3ff851beb80", - "b621e7ea124a146a7680dbea442077b5756a31327e4b507acbcf312a2423cb25", - "42675c8117ced71c1cad8d8638bcffa9f9f70987bb7d0b05f64291e29724a0ce", - "5e58a83edb0958ad55c615295b62310ee99bc3004afc14146f18965c159878e1", - "1a395c8197040614d2c6216dc9736bcb65e179f5d23ccb76c570d99f236daae3", - "389a9d0933e1c62c8a52c98be0522d1b9facfcd46b24eeffa63802442cb01415", - "91d3fe35861f95760b121ccc12bb8960ca8dff23791005371f7f95d5235815f9", - "c609979f9e687752be9064f4cde9fedbc570ad10e88626ea4ad6a969fec8a927", - "cd4f314202a58bac13ad284d9c2d125cfd979f3e84b51a42d30d7c10538e49a1", - "7fbbfab1cb30b453318edff7643f8a2d9b15e884cb7846efeef3db51298ca271", - "12cc83346031f941126151921fa5ae2481ef2043ee58b20cc5fb792e92e17600", - "070293a6b93046f04a1b8e0814d4234d4c4904bb1b1e3f117601805018c744dc", - "b221de0c7f76992e188a5f5d5389f5c7bc419f7b28a856c7fb04048629b2a4cb", - "e1726ed963b6e0dba2421ec1fa74d6bc7e5322a19f4b76359f899665496958aa", - "8031984ff40c2d86d796e3b69cfd29a3ccffb22c20d85a81e991405fba3d2619", - "57667632d74537db699e61ced8317f4b7f64189dab267d793fbb68cbcfd1b66b", - "a6b1268439a1e98bd71fb60447d7a38490c5ee06374db09a83c22d8ca55f9bb3", - "9e05ccf58c34c9d82d35570b3657778bb62349a5583fbd57be32bf6ee0962c07", - "a020b72223d91cb34facd039949cec728a936c95f286f63801e9334e47cc913f", - "219a03c64c74b69fb28f78b20209b3f770bb9c3d6526ca9b2eb7ff5ed9256cb6", - "5b70693c9069ab0ea7a0ae31a0c67dee379598e3992f683fb26c4ade1521e1c1", - "edec1eb45e7733698e9da69bea340d1d3e0a348c2d587462e08e070b23bdafdd", - "3758202e41bb94e55228221ed2205827e16b544d4d9138dbc95f78fc46e198e9", - "ff0b8629af1fd16973ae7805bed46d5bd45b518e85ae2882a7d1671d970122dd", - "83f5a8968f57eeb89e99cfd68bee178d637f7b055a75713f3ec130bc93edce5a", - "bf8fab68c38b09fac98bd253ee7ae8fcb1ea2219b597fa131df3d8d5d798a2d4", - "2739c875e97f45d456546f64b09f54a269cbc9088a2dd38c4d42a3027aaee864", - "d6fb557e2525dc7fc21796cd6b9a3b93b37f95e52750968ee8be1055af937871", - "2de126320a315b4d7c2e409741086e7e502398c184c6c3055a5634f17eaf30a9", - "963a439103bc4dba3d887d89212fc31f66dbf13a412345cc4886d3004cf75166", - "0e6cc3c46f19dea2d62c1e00eae83f987ec0fd53e4df9bbd272752b3ba1b73a6", - "1e375242b01a42f710cde9bf76efb0b5813359c2dc9e344fa3113c761725a397", - "e91f0942e2390b7b8a8a74622bb1dc2d3bb9d312abe48b0b0defd996b0d1cb27", - "d4d292e9af2b9b61c7134d770d724e2c8d2ad93886650f4a5de93e52d6a46d71", - "46dfd1ccf446b404c2f4322bbbed180e9b8ef2931eb68cab7c814c8425557039", - "c7afbacdc0728786b0d1939169d3ca1379bc3dcb3f9bcb531284385de8513277", - "f584b0b99631b40a4e465a2ffab7bd575f940e23d4b5348da4a11a897cc93b17", - "075ea55466450d0dda02ec3ff14f26be718528f4805588a9ef9551eabb52e6b6", - "52015be763ab640f95587f890db407cc7a2506bbb1e3e90978196f57b0fee141", - "efc4907edf787deeb63535a6cd13cee0da5800ba8914f9420719661e7ba119b8", - "6ed05b193ea65fcbbfd0f698738848fcd3fc9ef51293f320a118efb9abfd70b3", - "0e765ed586494e384d983fb98342603abf47213b45898139b9c7bb0906ee85f1", - "5bd6f248fc2f5a53306ec293ce635ab4490687218def94e137807f31867eaa6b", - "722bd7bf73f23b58aa3d91046358905b000829de8b6ba87f2223bff41fbde2e4", - "72f337cbcc1d06261c15fa570a22b1144ec1207d979a7406d5638917a778eb7f", - "d0b406715c8b3b9149818820bac1c64c399797ad06ae842e5f07ca6dd6fb18b5", - "22cd042c0555bdcb8bc53f9cadbc62d901cd24ccc5a788d4178e59c84cd5b078", - "1dcc5de743cf8e48009c168afea7780f2fc2005a819ca92a814845940413a887", - "a9329cd2bbdba15a5fdfd256e75a640677d6fc6983934a9f8680ab38319f9d40", - "0c13c5bb43777e37155fdccdb5e90285edd1ee810ead7db5c267f63fdbc60087", - "3c13b642430ab3757fdcfe2e1cd91073f720506bfb41828d08bde2d782ca0ebb", - "4a1556911c8d12a57374b91b16819dcfa5f2026d8565065bb179b51123dc71e7", - "b4c0c75cc525885c3bceaeb491be3608bd4430e93c8981dbb488b8fcf95a1c76", - "a1ac7db8d472b4426bff8896698b701025f77479c3e1ef96b94011ecd5e0203a", - "6d0b85450a90b920dadbd264b10845ba3941c9467eee69b13ec7e9de28aa4361", - "685aeccb000d060bf612b449652db6db92711247c72e0e93ca1eef64fd30e62c", - "07c6c784689173aa2940b6176f2b8bf5420c291b686c646364a90de1623bfed5", - "e394c0e709f1c6468025a4e373da39b4cba4eaaa4a229422c17be36d818bff20", - "ceae738ebe96d26366e3b20e5a519076775bef1e794f0aa143bafd4a5bd6a22c", - "944911b1c2a6b1c6af18a8d0da61da83a92d51135cc90943b7ba4f89ad6521a5", - "e0f205af059e318c3f274d10a1766c33f1c9bd7ba655d2953fa2d894c702d731", - "73edf31db3dddcb4b8b975e0309fe3d63bdbc0a6ac300ea7b033268ab6ebca99", - "cc1c5eecac5298977492fb1a4d3e0b61cd52617fba7a96d6a459757632f54944", - "c793ad862ed7e19e6d2261bff5851df1156cbaa67550f40ed217b1dc0e8a6070", - "6bf4d45e63b3928af1895736a3601d77565a5a74d6851a44536c2e62b5d40468", - "8d0ac752333c22bd11ec7cdf72ba85d812f166173e5c09f1dda85ccdf6461dac", - "9f362c79eb3d7caa287c2536fc275b35e90689a8e0703876d03b71977391079f", - "6cc55a56eea126510fa6fed5c37ba2978cf99e1889db6d09792cefc9c75a6d01", - "b37d328a9f7fef7d48c4c08f3fdff56c3ea18e868445b26daeb6f6b759bd21e8", - "6ca8a71962f8ac9ad41855597604780e2b630d5c90431c9546442b223756eccb", - "049d17a9fe9de5531d931df866dd0f43438434e59de8abcfbaebca5420c0b54a", - "5f80da494c4a2dd5e3e769fd0075b253b4dfdf9710c9bcd5c8fdbeef7b9fc34c", - "b484e05922f57220b617e1b7597c6c749813ceb11574db854fed301be09de8d0", - "79d3602c43285f30aac18f659391ec40c58d74f84349b3391574bd74d37f5498", - "dbc6e4f88cc1b56e7b01d4737896d48156f077dd82254544f2a8e0d462115bdc", - "566fa6d26500891d8912e1f37872ee4cc1a90def4d8da79cda4daaabdb05504f", - "2164f75c96f851b6a2850b9a7194136027244ae1df5e26aa620ed5c9e8428822", - "17276005a498e7e940c40c262dc547420db5bbf450cf1ca6145444a3f3e1110b", - "4fea9f77651223ed3b454059cc476b47dbec5e5666280f396b1e978cd8265f13", - "a20c3c745cd9aeb75d3a9fec30ee7f558c8c9d867bfa5d204d0b39f36779afac", - "e2d3c2474d0ca84d3727277e4d2d3e9016a37b69567d9eb60961514fdcecd768", - "85e2a89f6e1aba310144cddfb3f60ca5438fdd39ae0a4d22c25acd16bd0c4869", - "2f455fc4fdeb8ecb315018d34b86974310c02d34172ef2643e70edf7c42fa400", - "e0bd56c26c2c644d73ebb2377a1810028a37efe5d9f09302a9214b5bd1709961", - "d307aebe0ede3d04bd1a37fc3427ecf3be9053167863ea6ee73829aa7464ffac", - "d84a0c2a64417487b1bf925a54d9f966412cfa3cce2bdb27eab0d6b543e1dafe", - "44ef91a9b9546c24e040f15ab0ff7169b598bf6a28df23e720cb2378404a476f", - "bd9a38a75ad72647328b373c04440a6ef572acf33b6ac3d943d7451c5930e55e", - "8a522233abea976f9457cb877ae67f416ef041dae84af82e57dd64985326c7fd", - "a58f4fe00518be69fb92f73c06fb507020f70bebc28a00119e34734fcf3a1687", - "6d2c78ee63300b6ea0163485c997916e30c4b71c928691c010464e2700014a03", - "8e3a662813071525021521386d494c9c8b91f431edfa92d525d8934a58c6eb45", - "60aa2d1cad059d971cb7a8b98b4df2d673cb32809c94affd2d69515f2886a302", - "b26e35c15b715ae935dfdb73e34395b166ae974f74e9596d5cc00e3c61508126", - "79129b6f088a843bb0d5b0b366045acc46d743f8420d163e000f4417a066b6b7", - "932440e6a61af7f136cbb10c15ce97709e07a58a93679f95e8feaeeb2cd14b46", - "34298e786b0462ebfbd198b37ea6cd89b2ff1d21fdf11680e28e85996eb052be", - "41a571dfe97cb105ff022005c534edaea04199b7906f0efaa9fca593f8217352", - "1f6778857b238a64aa78fe22ba0e978aaa18819aa9511f4bfce3b614f8063a7e", - "7a0e26323568365ada2f01deb2ae6fc9c0b5228035bbda2731d8aaef726fd27d", - "8fb6ddb3588b23554465cae385a385d2dddd9237854011ad267a882b10e421cd", - "cfb4cdfb3bb1004970fca7cb0fb148b029c528d65f5d81c3ab7a125337cc5dec", - "36f4c3a82010f6095fcb21328e721e4f004cc4e7bbfa7ee37ac12fb6285dfd85", - "a7fb8992ff9e6dabbb563d08252f078a4b17a192ee9ff5fd4d8d154194117ef9", - "84e526e57d831d4451e57b13ba845d2b19c9393604d49c590013da8237bfdf0d", - "31d9a97317f6b7b722b24005f44024a74a8f0087ab1001205ae8eed30f3d3959", - "2c9f645ec8f926f447896c2bb60d7425686783f949c595d7863293b50cf85dcd", - "0ff48ea373337b3d3401a3f533ccf79cca40d671bb0b1cb40a3d2d7eb49112a4", - "35f4e679bbb890f2eb82cc96eeaf2d7363ba392b3b3009b6e104e7f011968550", - "98c449f3b8b89bc26af5748a82ebd178155a8d57a809e99dec4b8786f029d9a7", - "e076858eb462b760a0ee7744321354b473a711c2c74f464124a1d831d071ae83", - "117baa2a15ca02f16fd88f21227f2be555701e1774feee31ab283010a123db96", - "d74414036138df6828129f855671406326035f886eca54f6e301b140ae8411fe", - "37caaf0847542004958af964c559f989627823c2d093699e4d64a4dad6bacda9", - "91bac63c4a0ac532afdd8c7d3268c0912aa6061ec31132738c96050c04e99436", - "bd2f9a27936bd4a09fb6dce561a21637a7f29c5bd66b88d7c509b3e7d7e6d1cc", - "54a963f420e3a30f816d0c75775b50f6c323026a172759911c0bb732d15c254e", - "fba7bbb366402d649b970527b85ee8c840f3620218f1f9450aa5af647052c3e2", - "9cc60f2f38335235ac3b5702a963f863183060754bd42d709d3eb80b1e9c54b6", - "ecb3bb2ec6a3b215892dff2908aa48a450ca15fd6c4e1e11be7c72f8b008761c", - "46046730c8f66c7b0b34e1e568fb95c1159e12ce946f9a0926b88494374f028e", - "b004123ca82802e537a43d295359dd96d5f733e9666f2323df96d6ebea54e9ac", - "a68c6c4499e7aa76732c0c748b94a1d222a93aeecd3606c65ed65f34c8b58bb0", - "68c59f35afdf9b97e80eedad829147204949efdc20b6d796243960716869e4ef", - "247e4dda65097a06aa4c0ff1d8d142923fb8903645ac2eae40e3143214465056", - "1c7584427bbf160f2b3767492c2a84fa844467ca74db823533a357e84532a43b", - "d79aedc21bf6cf43d0548d8f5c76c0ffb06ae18b94e9aac1fea8b59118620128", - "77359f5a33bc90b0812ec56be145d92e2c90857e7ece1a0e12a1f8144ea4de58", - "5e13eaffcd719ead8fd3ac11a84eeb9615c2b68283ff2ae42d3be841a052e6af", - "94a0343db0f7aa03de005699c4720e44e27b16e6432aa397e2c9e1aa5054b2f3", - "7c87acd23d5028cc9f998954f8a4e45fd83a12c2623dae7c79792caa0bd3d689", - "91515b89f95b19a169774e86e2f19a43844d2fe4641d46668ffba2a3d984e9ce", - "49948318bbcc052df44f30970a58376221aea75462e3269bb4940adab973c1c9", - "ee786222d42ca05abd9a47215b53f594148a4d5d4c3110ea2890f88bb23e84be", - "2abbbc1d2dfbc89ced1612e0202a473ad3e52f3c4e8a0060f905342bf520b888", - "ee8ddb03e67e7c012bad74dadaf0bef5d7a9aa62cbdeb5e1b1ee8bddb25006a7", - "f73f2517a57853b6bbce739ac5816fa3d76e375f917eb559b52e470b88127361", - "20cfd000f8df31899b7fbb7f590d8c1e216bed2bea993dfe1d3267a3261b2b96", - "fd8844b8614ef0479bd6b3e43204c9e408377c3db209e047cfc4ffd4b8d1abfb", - "2cf3dafe7f76efcaa4f7ddae4a475d20e0cdbf301135ea9830e7a6686bf209ca", - "ba96c3a679f8a628e48f80972dc2a9353ee358f2c41ec03e2f26b47b6f2b4a13", - "aecea7c9384b160c2132ed7430fa1727f0d3b09da81bbbf8b4d8a7e92ed729a5", - "64872a5ef4004157050b08c3b7f8891710a8864f4cbba6966061234e7214c88d", - "5a8ad3549815d34ba7fc947877e67d47480be4abc22dea3333989a678ec90e48", - "af3c8661e4596c38ae54ee4864de0daba056cd6990a087f15cb0cf3cf448f20b", - "8449c6e39f79a827c36d4c4a3bc4a7336d3eb9cf012f3fdff1ddb986c48c8be4", - "1a5ee3c1546bb2adf1faa1a62888a7a0c58e77be5a9d04bfb4b91c29e046b3cd", - "01cf3f8aaeac16b27f17181972059f83818283bfd60e435a56da7471b2e46edb", - "61cf5ac6baeaeb3faba30b812a6dc46e904b8ea8493c2ff8f39ecbf4e4bd694a", - "fe3d0e432b16044112162331e17e1b29f49dee53be886f0bad9174bbe884c26f", - "97f967dec2797dc03b2ceb9f65aa1f7efd95c6a8ead730600292ec88896d8f09", - "3fc7732012f2242fadde9391966031b0d2635922a3d9b31185c114ca76fa4b22", - "4ddf67f235bf419677f3e12fb1868731c1fa833538211a24b32e094e7f43dd7b", - "6af95e201f26e83d8e09b17c42a0e88a439d0e374764dbabcab2d93c2e87f985", - "c77c5b91143788ca338afd65514ed4c3425d8dc2a7b572d6b58b04e5859231c0", - "94d4bcd3514f272a40d1037e7d9514022dd28a928db526323a50fb0510cda49c", - "3afadd12b5f1b3094a1c7c72857d609089ab91892622222c0be26be1282cb420", - "75f6a4c3de27aaf7e8c2576fdb14d961d4e0bb763d94ba6738122a2515ac1bdf", - "2b40f762a934d021b03a31143aa07f90e302a4a871175a255dc685298e3a37d9", - "a63961307ab888c83d1007b4caab0606f591d281ebf3e0a1375044088c69c576", - "31100c935b9a7b17b5b3a030f2a8e930371501fa56e66d358bfeac4687b176bb", - "355a0c5f09ce85b27144c3d67332df32218f1caea54479da7a63fe8d0ebdb146", - "33534d12a4ea3e7596965ae4dcf12272edc66fece12904988fc195f5531f6b23", - "e4f084c7deaf7cd4452bc34528a0f128b961a22ab4fd073ad50767998fdfc302", - "d2f8640ae7c9ed6b90e7be05fe778b10ab76bf42386ffd5e546d93641d557416", - "3b09a0aed043ff89a31d29971beba4a03f2df4f7c4c69be6220727d7e9010239", - "8aaaf037d4c48dfe27afbf766d83d3a14859d110ae18a124e11c3192ae758d22", - "93910a2f92f2fb1a28baf5a5264ef14ccc8f29fffbec2b3828192a9866f86701", - "b37a85bb75fa097557916f08b690e6ff8105c18fef9f624ee5746937279dc4f9", - "f046fa1681e23c155fd5effd2d71908675a675cbb4ef4c287859701a14b7f1b4", - "5398dd381c45d4cfc1d2e93dda1e5e41c0102e230a03b7c9addcd364b86558c6", - "3d3cdcd70103633be9c701a967a125bf9f18bcc050457ea3c64d0e28847c6f2d", - "98856726c9385722e4f7f9b3654435f1f8e9a71cbc081219163054e8a1fde89e", - "6a92bf2cb22dddca1070d0ed66388deea74c8bb9adf0c22ba7376a42ebda6b3c", - "fd18525e3119a055dc7b5104a8520f5ce1f79747bdcc846ed366119baa6345c4", - "736d4604c8e655bdbb635faaf368f54ddf279685f30ad270c66cd52ffa32b748", - "b8b0d24e222ba6ee9e28153f29c1bc4fb1e89d9644429ed102beeebb3d978e27", - "23ff353758de68ab1271e2e83eba3caa4a5d0df327e3694f0bc784dc3345de1f", - "252e2241dba8fc8522e266704e167d57777ad6dc3ccb23d84d9c7c729725445c", - "41b54ae35b51eebda1b0b3f8fd6bdd3a9fbedde9ff63e81fc632f16caa1b4551", - "3ba94c856a9e0f14e860bbc31fc5997a3dd17d5b221df5175d1e7683794d8402", - "aac5310b374c95d9fec1197e9ab02050fa2aa4d9177dde48f0f66e29391ca4ea", - "3ffcd4a952db93ed483533888d53e2c0bf8000de479e730a5a675aa699abea87", - "ef1fc5b2be9fbd430d5276f3933aa8aabc81a2a1da1f443ecae6200918abf8d2", - "6e5cdc75dc2f52ff261be391d85f29eefc12e03e27c90f862d3f3e4592bb4144", - "cdaf426b80edd4363b336b351cbfec8c38b44847cdbd814aa92e92bc9ec05333", - "48cbc0f0b2442788c6b226ccaa795f579565f3b25f73108c2f001af93836d935", - "15437123f5e2d6f41a527cfe8fbbd50db30e62a1daa4ff9cb5eb6246fd472c17", - "730c4707ccbe9eeb9b6112334e85074ca4306a077b965b349d70c20dc7884c1c", - "c9050f65efa05e5c128294a79e1e9c602c62595c51ec7bcce3806dc46211b317", - "209e1bc718dae022d4058759a02cf47aa2e2157c305f7b796d18bceb17afcc4d", - "23f5d36ab13c3831eec87ffd75f3bacf31974b3ec4b0613d9cf0323016f067cf", - "ddcfc37a349cb30aadb29fbf97fcd5e8b97e59bf4a293ddf588f6159e3d96fb4", - "e801adf4a206a9823c235302e56e823dedd931e77e06e5ec9121c7bcf1d8a5a6", - "0c0c4bd494f4d11bcbe9cfee926f6924afa87029ea30be926dab4c9c511c87b9", - "e703a4f88c32bb28bace07848caecd4e7b5ee939f26d9c03602630a6c8f1710b", - "8af3a6087f7b97a220b26bbc993d8f1e8bf94201e6b5a590e8c9a4cd0c427679", - "c354d1f64f06e09b48c272b90df2626306a2b747b3e046d94df0486eb435d62d", - "b39e62a2a534cc8575d775e7474216bab3c8385a4244582af667f32157a1b767", - "bb256cd76f268f9ff9b39b6845b0b372a5e1835d8322c90414494b15ef8d885e", - "626d02a0af182c8212379c7e4d334232aec1ed85c5b79e17eb362b2c0f49dc79", - "4d94e4c2f93521b49a36342faa4c2c3af1584fd1ebbf28ec9823e813006a9979", - "7ec58aa3af35bc0361c9970f1cdf35f0372aef44bd06b4373d4d1b3cb668408f", - "fa05dcaecc309dd2134bdace435dbe1571fe0fe7b8e10e8a91d55785786b7046", - "bd5c53960e3074fbe487715f29abbff4e21422b899564f6e0054263d4019f80c", - "d6b65a4a0d41ffebfde6e9741ec8a2c2ab9da5d2d52dcece24704842e9e3f6b1", - "7e2c1a1ec0e4f74bddd9943d15f57b613f75e1ab898604590b30121df659baaa", - "11ac44b4649b459b139583247f6975532cffb50dd335fe8a7d74a84fb9597fe3", - "833c80d83c6f3628d410986a4db8da93008fe7c2e110cbc514877a40d09ab2b1", - "f4244dc44f0c1b3985f47d40237a93569eb76f906cc3fa753e0a69e985f74686", - "81e666f599fd72dfd7a1fe95560d6a04e570ce01a7ea4b47548ce478ff22b80d", - "f21b00b6b2af45a20ea11e136db795f54003ce315b0b60cfd5e8649f39e99330", - "059f1ae43c62357fc28d2e7525da723132e41788438a4eefb28b48cc623f3d4d", - "d700ad39280f8a55f7f85eb92d12089e45105616deb8dff8e0f474a3a90bd19f", - "77c0f3e70d139b2a0e06eaaaa05056619844c8d461a12bf3c10f2c5c58ae163b", - "a771580d8feb5255e2eb68c08a9009a69038821a2ab7fdd614701fbb11deeafa", - "729e30b3a79da771ab7600008ffd8a8c6afc39a6ac8db54e48f2a702da3d99f7", - "530d0a35f8a11c33ee51ac696baf11b177666b0f6517a7259ec0e80b7598788d", - "6a9c02f323750e8d18485f499c83a5b99ec641fc8e6f2053ad45faff03c4e0ed", - "4eea6356d717507f96f161f43ce02b68663e2d1cbe29957e9309f9d7d376caf6", - "abcf84e596a6ae08e85b805eda6930dfa1037975cbd8438e2b76722e664dfed3", - "e11dda16a6b5f972d2ce88d433b32bf4880babd166af4de4a9b229f8e425ab42", - "498f52cb16cdf7be9c38edf293f256080d22f47978ed9fb0d19f5e8861fa3be1", - "68514bf769f0f24bc278b596cd7c7e56181461676213ca37f9814314b3176ae5", - "d2b920984d6e5a7dfc1e1272ad161f4ca223095f7fa9ccf8feb754a3cc63e0a4", - "540c7f5d192e070b1424f730bdce00a7e566e917d5ed819a719671051baa5385", - "9d20976aae4d7b93ab6d0548da242bd95c6798f920cfca1fd21f0dfb4ee7b35b", - "bcf069ab67e5de86b81b9e8bc545904b024e8948bf04e5ffe6b7cb2b5d19edfd", - "8a3673cdd524548cb8c229d3b15782c8decd14515bdc236b6984c83217de0dd3", - "a44655e5016363fce1896e066779bcd1f3079db8e4094db7f4007eeade307c5d", - "15749b1da285129f229e7e4ced23b46bfca3d6a5fba987025c89673f1354ee25", - "a6565098176b1b4ea82aea5ba507ae2e121ad6051f942e31196f6799f6c257dc", - "3eec0ad0f52ca68034f6db91f5676e59090b68da54b24736a856e014465c3d51", - "baa12492ffc019541d91ffee0b773f83d8b2b0e3570d395eaef3e46cbd2cd0e1", - "b53738db95ca845c71d16aec4dd605b4d965dff73848902e32cfdf0e9748906e", - "1d9e9e6c798ec32f569b1c491a9507965dec8fc1f1edc6db6e2350a1d7060c83", - "e675644512b4e03112fa5a423226085bd68e52d2fe244a93a1b714919fddbe30", - "da3ffe9b1c0f73f05affeb6f1344cc150296e1d3614e408a053e8fdc08bf9a1e", - "8038e8cc34392f3d9ee18449d3389718628a880ca1f5c671f4e13722e64cfc5c", - "6d10549af50c0e635bcf3ec4fd4b4361cb4f760403c52e2cae546311e727c451", - "73751ba46322ca0123f78c932b71d55a3ae7cab8811376ccb1c3b4955cae7431", - "9480ab14703b737d43ab73abc3b6f782b914de3ab62a7995ae4c3c28c30baaf0", - "4b40cd850d18b254ae58950900815380bca72165626fa5aebc2fb2e46caaf530", - "9fa56262a0a98dbfecabfc529ef07e1e76153dc6896d2f1c5eb26b270e1f9da4", - "44b875be1cd6280995b8afa466a271de27e2a29cc8c3b9fe7f3eac1e000ac290", - "36f85fee0831b8a633944c0bb075e5caedfa59654390365b94bbd45ece3435da", - "1e376ebeaee8e3eec61dcac7e8af9df49b885bd5c37eb4fb0713bfdd90b1bd8d", - "78479cf6b7eda871bf2e9e30a47fc42381ab682a87e0dbf11ef36ad9976be754", - "ef32d2c348169adbbac8b8f49561ef276d1f14fd213f4c8f40bd5fccdba4ab81", - "c588c49de4e34859db64bd43f9439e4cc28bdd60411e1c092e1f3fd85053f6eb", - "1920d8907cd6d25861302ce7d9dbb266b2ae6b1cf05c3e6cff601f81deeaf3fb", - "2a1a55423be5ff0e64368f504d811d3d5d9f6e55c04d2315bef71903417eea0b", - "e26305eed7897fa95f9b947a8324946246e2d2ec67b409c5820087effecda34f", - "6d86c806f80072ad9110deeea62886fa512a35ccc281b609a329b2632a5e8982", - "bc2820f3a8c445f23b5417c3be12f8fb2aaee2ca02cadd572b021d44c6bc4286", - "1ee91a2e688282c83e4fbb8662d0371a4af8734a50fa95997232e08315b0cf01", - "423b104aa198323f2be9c4fd05138c7ec6ab84085605a5f38cd590c2fa70fef7", - "9f7b2dee8bb518edf560eb541a3073f441d15364eb5b3b46f8c07eac2478d641", - "35efbc952741306e63571fb1d8f3e6f7664eb186dab80123f362d3a190bfe438", - "805f723ff879148d85af16f73c4d33f4f8c137c2d1b371a97d791b2682e320c3", - "3dee78d3cc62f91cb713ff6fd3697b2bfabbf1879817a67440191d5a97d2f32d", - "7c0ebb73b442fd109e52a6d414727a66cd373b3d5747f957dbb876edb023ed3c", - "40e6b2a45ca4b036bb95a06ba7969b5ee179f4f05cb38e80d2620689b2a13c7f", - "e9e91f9a104b8ebfa76f6f672b11bd82ec359ec370afbf566695a127b0e45d90", - "35abaa8054e16624b6a635a899c6c2b7a685d5217e861f35ae69a5161343ac56", - "7abca607bcfdecca5a3c2d946ed7e89652b7a6af1c6857f757c2ef08539c6180", - "7b579dda9dd495461bb20a244ab0040eb221d563785735b56f206ac1569db64d", - "2d596c97b44c030e91ab57788f67e21b958dde57092ec9e02c5ec23b2907bd2a", - "ecdac1da03897976420d5d7ce5f20f038933eaf59f315a6a092e0f89f84bf395", - "9da9e417dd322080cc56edf7e47a298082c298ae7012a2807c4801fcd8c270cf", - "d0b7ba64b411f1a9df110da0446c86736e80655566da112fbef30c22df1178bb", - "0bc8c80f75ee32632442cf7cbfac710ecbf68585b38db85e5198d728f6a34852", - "9a84ee1842d08db8808d01da4ecae198263fde9682292234ffce62bc1412afa1", - "69426dc86c5f224b50493d473cb82ea52040177913ffe406f2d0b693150277e7", - "564b16a701716d06ae9cf87eb8abd5f521883e88bf702de794191898550c10ef", - "70137c717c76dee25619bbf233174d4a503dcedd2a4c9f848136b236c8f7ea30", - "552ea86f7944061c1b596fcf8ac4852f78f2eab5718d41153686e8fae524d76d", - "88fb04ecea84c253a58e8fd98f63cf30055a92a13e6212dd854163d3825ccf0d", - "9016c7eff13b2514da0e9c15d1e7c186278cca90ecf40e3342abbffe231b3d61", - "317a63f3be7dfea2e78ecfcf2c17d475b40a90e67f57db99df6506f04bf9055d", - "f32bd27d80eab6f986a3938b82af5f3956fa28ef5f846bb6d8360cf88bdeb62f", - "31884dc36457efc7e283e915704e6a51955aa8c49a49f2813f0012ee91659095", - "ffc3943e7ae0dbce4b53e2d129b62ee9912617c1f6631b01eb2f542db5b7d439", - "e7f8bf835ba9bcb67031b0720d3c181e86b1c9f5343465f860deebc0c62dbe0f", - "ed372e5aa9204d6e7723e02eb58eb6b30350161867fefec2fda624fc2c9d5acd", - "a9e445790568d4dd0867963f913cab3fa6205e018290f4472e04f4a01d3827aa", - "3ae7679764785b6377f195385a4178360d1af0bae628b4f74134910e6b8e526c", - "8e76f5109b3c60e0bc257579f8af1c44f6af3ff3c7162d91dba4d6647243d762", - "f24771d48c2f9c91d0190ba98aec7b657e8aa6fe8e390eea8db7322c60e7b0d3", - "e949e2804656507c5bc003fae6abe05e43b8187a8d7d04f10c595d17c524d9eb", - "9663fa1eb72e79c3349f3c83b84001f1f18bb29a37f5e54c16a59a95bb7b501e", - "2a55c4e56c93da7e875acd37b52d96737a10bbd9dbde72d4b357af68dd6cb80e", - "281e7b0201acde39b78b7bf38dd5f954c571c62c4843a3c91698634ad66deb25", - "187d3c99701bd705b74598ec21d5318343c18ed54a8f85332c807c01dc1f1546", - "ba038b50c37e7b509e3ecce209433bc23bb65dcff1b8302759ef1b5cb7dfce72", - "5a11d949a06bf1da5abdc0b5268166edf7336d7aba04a40d7e846d0c356423c5", - "21f59ae47fb7879e3e870e550de3b886020555f3fb9f5cffa44dc57fcc002efc", - "e15ba6e71e3e72477ed04635ec78fe31c14e145e8d921ed5b1f674688485d508", - "1a6260e535d434b54ad88598580c4449a77aabc128a59ffcd4294def9916ae21", - "bfe5957147de84e2a599b20dda2b9abc50957233bf54d4d3a137415b9a4f3c98", - "4c846ef64780078a5f45a6d49060ed46aca03b281d170d2908c54ee179ad968b", - "077806d66f441db509e1e98f4505526c63dc3fc22746aeaf5a2c10dc5517f17a", - "1ad51e8d150a568a1441d27a6fd64ef92985b1db7c693c39cd17d03dd59de265", - "65b8ff147a2b72101839ad455042ec1be696d9cc9008d3acc5ce7065df5301f8", - "d7e27db76ad8bea240cf7aa52e91939be0546283c7ac369b3ad70da8d0f3da49", - "f7143d192e1f5c3151abd937ff13c6df60553bcc122d877e83397c610d43bdee", - "55c1a443363f6e79b70f156ac85491258e2310a28436e0100a473759896e15d7", - "d01e81b0fd9add52b7c00f6db81c2212d2da4624c5ddd51b32a1e6705ae7d33e", - "5cae2466fb3c3521cdff901652d2fc083032a9e3c8ac820495148eabc321b1d2", - "099c69c7a5d9f1fe9769487208e784f01cd27dd73c5b5863876c9c6eb055c8fe", - "49303b4974d501bc900bb447a412e4c385d6241015925b338f47624dd09719f6", - "966d34ea617ed79d78db9f6d0d2c168e7537241a8c54263c5b0fcd9c65807a4f", - "6484fcd68115be93d42a3d0710fdacddd886f616a225906352c398d5dbf367b1", - "5cf3a203b6e99e56b595f31dd4c5ed8f5ef55e6f45bfd4c37fee270c341e6d51", - "b379de4502907ed520f5adf835ae2dbb0f477f1e3e652bf147d456ef77e63aa2", - "4bde5d045eb44c797c6de01cc60189fc27820bba5d12624a5111272bc44d4d56", - "321d659828774917a735ae38fe11e7e1999c316ed6422c43f81e7ff5420d7c69", - "3680e9f6dab53ed8268aa4650d1f2713918c3780df25c70f207c40bae91d4c34", - "9be44b4bfcdc0e227071a8f2bfc1c37badda22f94f2dc4f35558f36ebeb01f51", - "5bf18b28e8f38fdfe222bec74c8d614b8c7b4b2345bd87c9ead33f6132e7268b", - "4882a0e3f28fc2fcf0a366ef68d2bf89789c34d045559197e7fd75fbdee0ecfe", - "6a6ede08aacedb8a948290d6c9fa565adede83ddc73ffe81869312477cdbe0d5", - "61ef1db92c08d45c5f642589b9edd74d270d0a99ae7b15b43eca5bf507e64116", - "385c1f78f48f28cebd97ec42c62d9a53d580fe2da6e47aacb76be649f278bf50", - "561d7d101e240689b0c84d2d95e591554ef0346289e4e215e477844160f5057f", - "6b4b8bc96ac8de437e488b204d7c564c40746ecec1b1f1c51a7a5ff78268812a", - "7f804b7ba12ae8032a0609572aa9caea39ea08c9973281ee97e746e5bb90ad34", - "1c2aa56959fa8f7ac3384d9ab521500560287a37e0cf83f0c0a93c3ea2551862", - "b8c354e628061974ba83d587be55cb86811ca1385ee48f88c943023542e15e2e", - "0d68dbd91b89dce2322e5803e1ff01b9211f96a38cc555c4f2b70d6a92d1b5be", - "766c7425503cbb996ea9aadbe5f975b55e8a52afd5b7a9b13002b03a1d627346", - "78610242c51710afb16bbaf5c72f5740e332fadf8b3ec7df901b752549fc507c", - "bac009b8037c2d97d4b5ae2f64917485962d571b31e9ff0375e8099e7c104cf9", - "1c9734328f5deaa83f485a8651ea6f5dbe53ab4bb7e32c2de87c6c5027dda9a2", - "7bc46c944b1941426f517c0b3075f20718b05a985342d06f361022ddb03a47a9", - "a5f49b423025ef2da5d63a8eb45f60f90a8ed997b76d79d26c14279884295bed", - "8c3eafc020bc9bff3638a120990dea27c95dff7f675e9e7e3b0bba3c71b2e336", - "f7596e458f689fa14a064994ec6477d9f946086d131892dd4f7cc63a971071d8", - "11dd709b7d1923964adf66bc8d116e0c6800ded6d55211667af8384bd3aec6f2", - "ddd0caf6eef739155b89fe0bd2e68b468e276d6c3588727d8bb28b0b90498b20", - "e916b22faf085507580ddd8d1d1f18b60f1e18e72db9e1d208ebfff6184e51b5", - "c7c1e35e3d2b2377d3ca7f46e0bc0505361ecc4577e529a53508f631df55013e", - "c969fc36d17d1399250168d184f21ff929cf50e8f5fa49838b8d2bf2cf069871", - "4e81708fcdb64bd96412809524f880be9feac0043df285afb4625d5e9d91c8b0", - "84fc93a304d228db462b19beb757c8d18fde9e4d52bc1eb3f9a30188f15744b4", - "ecd34917fd344623f35ee3371bb99a257b88a412fc44b6ec640367e05b08de33", - "174f17db67894f9c0790daf4fe0f57e3ff3b7f4a3f5a3b8b504797577da89ba2", - "8b14fe865c12ba77d36da805feb77731d5a4d8fa9e5a2002da06c7f0644013a0", - "ce89af6ca72040d1fb65835f54e9e697738e165a2bcc4ca7669e75655d340a68", - "c2458a9c298e89cf0b22287e519410b42f00dfaee0970c24348dbfbee197f1cc", - "000666a184170206e1cb716c97e1cb999d95ba89806d49fff43838be051d6a18", - "444a36d8adbdeaaeb550119a0a4d3ea948042d6574a4cb9e21f565b3f0930c8d", - "866b9e9a028be91536a7a6714e9a6840b86430568ba797d161ee9b35b470a9d7", - "5d1b2416846d32d31c91c85193d9b64725eab8f52dc3de4f32fde634cac10d8e", - "65b10bde7121735a01f31da6cd7e1913a6f0181346ff210b8463863507ebab53", - "6855e5869c901cbea67121c96f509672139b792413dc9bd15a10e45fd78b3187", - "700a94f431adb2d966b2733ea84af6718c5a57f8525bf937a79cf4adf9ac10ec", - "ce5e4ff133bd8c6aa6d25f08e22a8c17f6a1726963eec1a38f8df1aa85ce7317", - "b96fda826b1ae13f55a4c52ef865219f3e258a38098a855dd2a554d079598c7a", - "2b52803f303246eea4d4df86402525e529436505d1e378ca644e0e24e4b7371e", - "bfc4b72d616135b8f48a63499e1b76624f5eace25bd4449d46750d241f639f9a", - "35da28e2aadf2d72a2be194a84ad2e147ec01a1e6c3b8f48a66cc10ed783d2bd", - "90e06c3ff97a96d2929a1a9de0c8d90cd8bca57392c23f284a958130cc0ed39f", - "428b0f7335fefff6c4048a4c37a504d1b25c17fcd02f413455b9bc25f3ec4b38", - "3482168547b3e3bd413f829375aedba7a3492fd1ef092565ea1c1317dce9b026", - "c219d229a89a0fd9d50c47fdc042c0687b85753f5ced24a4726dfa7f2a8ad56d", - "a6b26a6bf7d07d8223b83c050f513be016a0a989cd3e0247a4ec50fa53551399", - "d9048e7c05f1f308a2eadb9c149bffd5f7185e34eeb24d273b0b978238d2d85b", - "630e6ce98f7dab03eede15e1167bb3468014d7a4fad0d4f4ffa00f50d7292872", - "687b9b3d18bd92fbc0381df2554679bea28e8b0d060b75cba29990663f754e75", - "f78d4bd7b074d37e427e7d00717f836a14f4b0ce6acded78ea4480a9cdc127e8", - "b13c0852af69ae433976011cf01fca84513a5f2a5f85203804f6cc2c112cb551", - "b14ac2642f18a986744ffa2bf9524aa42e0e8c57868815d1018b93facbde043c", - "39666610cbe307de0495daea98ac38ae69a95d71e1dc67542336471dca652095", - "140af613caa53cdbbe1bef09aa82703e12177a09636e42493e75ffc94aed0adb", - "dc65b92c195f1110f35acd40fa4e735bb8f992893a180703ede14af9711369be", - "d332a51f18a941775c666a48f2b75738db142ff2e1d25916592e1fab3737fd71", - "fa22d23161bba2917d4c982dfaf2da16dce8dcb85428606a8d84f5f514532bb6", - "1dba06bb8d0f0155b2da15ae9a380d0022653800be990a5b1855d8c05b857c84", - "13d899b5c802f9ce83b7f6939ffa3e05dc27689dfd92f6f5125bba973c99eec3", - "38a852c248673c0e722d9e9e7e47f1971e5ffca820bec2ed0eea061b66582810", - "c77f74fba082a986973c1d42c3ed05c53cc9fbb527fdcb776180d5b3fd3525a4", - "cf67c771d2d3fb21985438c66c30a5be3b1a3cb9cd90e65c71b46b8af02a4a75", - "d22ee4316e4083378d60e48d3ed620180cba78fbb7f65553c0a1cae5048abaab", - "0b9b9b9e7a4dd4e5989c39bef8038cc6ab47128c11f6420f25a6328a3cfd6043", - "597c656503a2b0d200091ded75df7a7a06eaa58adb952c960ca2eaf524a70500", - "91638e90622ff62889e09e0076d64111b4edd6a64effbabe9fed61a5cc04609c", - "da8fc4ea912d325b6f60bfd0cc9a22eacb5433e18fe059142742e12d3e1d3cd5", - "e32858b9506091fa68a5bb079066f641322709968cbedb1e969b407d814d6494", - "5172be4b265b75719e0697e87ac0553ad96ff5c2cd6329746dbc84e84bd9a67f", - "3ee5a7d7268471b4a96ee428a38ee9e475a55533288d944ec97622ab51520880", - "d3fabaf8a911bd50f4dd6dffbec1cd42321979e77c4a97b9a3685aebe3b29539", - "358cb3591aaeda37bf8786ad1be266ff5de07077cfb6a40c17025dc86cc8620e", - "5bfa8a3d414306d550743d6ed302f555771abf754ef83692b72e48cef25eb6f1", - "1a5c6f6f35a144d39b7e5d3598d1c6c4b9cfaad36d79f724c474179b6b6b33c7", - "389155ea891a136e34e5680562a508bee83cc187c7097a19c4ed993977c33833", - "dad7452c5ad2ab09364db27565a4c4e1d8b344936c5fa36b00d81d56a943c810", - "7042aea77d9eb1d9fa2e44d66bc8f327f6ffee28521562e22420f6b337b19e2e", - "053e94784627b2bc4b041c74d067340961ca187f17f6d2576ea0a76ff2358fdd", - "523a8ac18f23ff69f53a578c9ac6817a6aafd54e59d57301672dfaa6ba8452d8", - "e195d94fc94f6b4513d000749853ad577b47c53315d8fba8df4b65341c795f08", - "3a14a98da20163ccb80aeab486eae758b670d4155e0ffd4fbfd7ee11b14383ce", - "7a6c6df980ec4c00f933bfa0035748f13ddfe32c85a4eccd4a7fde50e0f1ab28", - "4717412d8c6f6bc0269d111792d2380741da86960531cadb8de499bc746f1462", - "1ccefb3e9ba61dc6ad0a2fe2230f3959cd38d40e6ea0ecced2b12f562a3a3e46", - "6302c7085fa4d75e73408d1007c5ca9e35942fab8019fa662b7ddddff622e154", - "ef134a6c7de464a321384dd8628006dff3ebed14cf8eb3192ed05b0f6d2ae26c", - "087edf60806a4a98ba8ce29f56d8375ba11da7feb3ebb31db29947115fadd60f", - "8a3a737bd2c7826aa52e87b4be4c54d94e90550f7ae06d8c1b6bf8d0fbb505fd", - "3bd9ec7220ee63b8403a2ea1d74ffaf8631f89ccce88a1209b20c4890e211164", - "d86f959e3c295b8fc38d98cbd9da35054348b22d97eb49a62957277edfc1b66b", - "2412157f75cd948c8a97fee00ef13d2534e6d029c2f81d81d72dc32a2e698e4a", - "f5e1e29b1d3e12296d4aa893f9dabb0a67c130f20117398c31438b66beb6c3ae", - "7f4c44f9d7bc9f646aac7203c5414f0154866f3aa1e47a326cfd2337d6af379d", - "782fd9b542baafdc2ce9e1d0eb4ea6d5f83f1513cae33368df1546275f7145ad", - "89d9089a51a6d6558bd20ef9e40e8508494eb6c8dd05f71d2af4e9b6de1e107b", - "dc357bc0c934ebb120b31f572248e8b58a74cbed6325296693b8fafe53e9287f", - "8462164bc2baaa3ac5ba0dc374648f8c82005687a58ecf72e15f0b83213c0428", - "fb2c05652d7a0cbac672fb6373970ef29009a85fcabfedacea8e5da0e59b4c99", - "4f4f9ada7f933217043313fababae50ef007ac2aaa7ccc0feee5d8c9022d66c4", - "05e086c96d279dc746d142c2299f2707659db45cda2e70d1e1b1e370063ba1f2", - "66679738e8473f8bd62cbf8b0f617b9f6fc44b78e54d02940fe52a298aff3e7b", - "255434e464d3ffe9a87160bfd0a7f45ec65e0cccca75c4491655bcbdc8c98be8", - "4de9d606b8f0022dc7eadc06c5568d524f75c86395feb4d7809183dcc184ca40", - "657af623d58258ff8c70fc1ffbf55f838aaeafb14db35fca94495743f51200a7", - "2e2eaa29b5c2d65f671b6f872f277c95062697ac1d2998fe3d2055b65aa9a8bf", - "0090c287f36f095f00aa0f06a2e0bd56c57ee68bbb105b1a2474e4e6e4817459", - "599d1a05ce049a3a373340c60a6c4b651f83e48fcd4332427803018e1cbbd2b7", - "d7063ed212858bafbe08f071775eff949071312c9c05aae504013a632149625f", - "9516f07baf11cc7baeca261ed3bde05d46e0e751de297834279608bcb87d7163", - "6734acd83e0b62463a84326b6348a1e44df7d9bff3060c5d66688bb524c46035", - "34758beb10ff5bd562a8e072d484a08bbe3816f9e51929d21df64f7ff5b15767", - "362b3cdee6ae1e01f6f57861df1a101f8c3ef2edcbd45083dbcb26403495b0b2", - "b410b62bb8d70a56a4fd74f3a84571ed003a7b111cd7d0f818ae1ad279ee41ee", - "4f6c155c301651b9d714ca9870d9ce755e4d1da235d189de341edf7517039690", - "f37867550c334fb9e86b2a234e875e33ad16e986a40b90dc26dec65d63fc2aca", - "ee489f38a90440454b0134fc832db023418ffdddb2e4fde077657506de905673", - "10bec49433f28342ab409c57e37f3fae65ae8778c60adff571782506d763b5db", - "d5915213734ca5c4728a23fdd9eb0f49e54a2fa2aa5af2d588098b82f27b2b9e", - "81c4690cb0e26a879254dc768a99ad49ea7df994a869088795a8d600533011ad", - "0d3d20853a9113be6e64b515ff3400ea85d589b57842731130434d7f231842b0", - "4ec2800a65f959b32368f0fde603afba214e268ecae602bc049453cad74e2edf", - "683c09673d854cc1f1902cf58f3b1c0469a0512d6aa79a0c5bb78b7aaa68d233", - "3aaa13fb241f558366b986bd1c85e972db1be7faa0a0bdc210066bdf2b989219", - "8516735cb353f19d5cc488424b79331dd3d7459a6e3df196eb5a76fb34861bf9", - "bfe88e31cc646a91ceadd19f5ece4fe74b42ecebc52d032d8824ab76d517d613", - "80f761656f163dac5fff28d8c06e433cf7aaccb7565a0fa8d2c924974201f634", - "b0d11763478bb058c4c9bb14d3dd1884a63bb082c2e6d85ad10535a9cd520c2e", - "54e45c4ebcfeb38e625f371138c566e98d2b25b3f0af3db6955fb7ba005bcdf6", - "e8534a53e7d933780c4a43d4ff9e216ba5a6a88f2cfa44fde8e1cc3f4a481dcd", - "6d14fd192118f8808dbee3d40792532806dda4f80775719edd53ad78362b7da8", - "a603135db30d75c5784a2d43aec9707c2c25239971556f7d34a745188d0835d0", - "1fc283f5c7b2a4731fc073d2977d7d7873a8d7a997d00aa57ac011800f4b7135", - "67f18204e1d59b22ca2d6cec2dc03634e6a0176ca9fc986d822ff870bcc64cc4", - "b3a870f5c163fb28d65bc842d25c423827a868c42386a238e810ebd29aab2b52", - "8b8a3df036ffb37f5692024086ef0f050df16e4193bae43b1239ce4ef7529e6d", - "104612832ea346334c07e31cc9988f2b789edb86eee140c80b691da822288bc4", - "16d5702e98a4097b5fcedaf649863caf21188083291bd60282ede402ac6409b5", - "089896b35912ebf710c15441e141c5b437941bc8769f668fe813f6fadd6d6e0c", - "a5747fbad5d8a075d862fa9f15a389ed0e046e84d44b8b20daed942fb517ae9c", - "997d8af3fdc58fd1f208f042be20165b34264682d152dd5047dc56da793d35c0", - "dc2d045458b0fa1bd80135bdd845224f74df205f5f064052b77a1efb2ddc3d19", - "38dae8dbec456337e1f050c8e61f5f0670162cc00e45fe866f173a6264a2afde", - "da0bbe8438ada0eee06c0210f10c5d226dff4a82ffd5f3fc175ef29589f17956", - "bc4e631095c7b0bffe1739a368868dc0e1a436102ce6d7ed43917d430ac5eaf0", - "c191b88f45023d1527152aa1171768f5574d535205ea51b2fb8baced3092752c", - "5b18763e424329ac79b7166e469c03b0b03f1cce8dfc06b4386a81ce0efbe9ad", - "0fe3465583927fd8deb8f4ede5f1f3512cde1a2c17c86b023dbe1d2e6f3d9fa3", - "e3efcf00ab11cf2b4e23a38c530883640723c4d47fb977c759469b697cdf8724", - "5b2225f93d8437bba9653c665fbd9a8f66233046948443c773be4ac1601e1c30", - "2b875b6b55cced9ea90e8ca9fe7df7a9a07cb2c89eafdfe5b7f90747217ab4b5", - "20bcc24f08e2023c4cc7cf72b78f2b73f280bd1897d282c7cdb6d78d055b4adb", - "8e73d70c7f6dcb23cef20c0c71176f5e9c66a99924aaa748adbb0689818409a8", - "bed5d0bcbcd403b0f2e1880465c252fff3865a4281591a1a9fd89ec5ff074cf1", - "d3c81b7808e5c192dacc0907aa4c09bd220d5f4990b5a64af82f84a0f41019e8", - "a36b18aacdf4c70117e0fcdc758d305c237a21221a7a7988994dc537ae65aabf", - "d29789e0fc92e1fcfb956a65bb1590dae3eb1352385e83c622a78c0415d92c61", - "3084a07587f4731593a43f14ea2cb317132eb73dced8d348d7ad1ec5102fdefd", - "9b82d8e2bec9b3f82f8acaead95be481f26ed84635a39f3e64343a7ce407f3ce", - "cd65899e9ac0f232dc865d8c16dceb0b05e85f064da1f13e5ac5b54a1d9c8f30", - "85dfb5816e4a3fb0cc90fa39e638fb688806a41b393103d1cee777da8939008a", - "8f1881cb7c0b8c26c57f94c090d973d0c1965f4f08ef2b2977c9af1885230a88", - "67533d5b6e8210db90a1863c512a6699df65ad15fd32434b23919220f1a100bd", - "21f25f5b4590d72f64e9299195c6719c3a716f8eeb5d341f15df99a2a2e77a08", - "c360f22585a3d434c9e0305add78c88505801f7a4ca16f0ae55a17150f6ac1d6", - "dd8fdfa887d4d1126ecab4760b29cec9f1bc9a81f7da279006b52751ccdb8444", - "add6edcc13eee44b97dba836140ce8e696a43f5289cdfa8a2336d01761112779", - "4d694884918e56e24983070eaac2ae3094a29fc2e3c1bcc95ef2fd6e787527f5", - "aaeec2935b46df93ac74b84dde127f91873ba9a42c9f454bd55eb7e53a0310e7", - "86550344a66852e407d964f7e3a695f7e662a670185a412b252b88e228cf2c8a", - "e836f9368ab29c14bab54e7e177726213e6d2d8d62bfb58d0352537e719fc356", - "c587f64127a37b52eca5767102fdd869843809e47a3e2def842b3d258900d352", - "b426762943d454197244dd9e3f274d7f82b6bbd96eaf31eefe6991314a2dd49b", - "274fd41c902483ed6031b9ea8c489cfe4e4012c66a36426c2b4556d234d5b1e9", - "c6c5301f90163bc467e808c8363fd8d64716886e44435965a4a76e5112648af7", - "84b15ebab16ac8af043f0f4bd4dc106332a408ac8e8076e4df337bc9ba522b69", - "218d5c3cd88720716a0cbc8c8a7b3d20ca691d81e32b3ea86c4de073dfe6f40f", - "73ee19ac4622a5f01abd05fadca7ee61f02e8a590e7829ec014cf8babf620f15", - "80e7c1b4479b4a77a46773d4bec63371533b3b3635bf830788ec987c537276b6", - "dd394ae82e5fcf6bf1754d46c1df1a10970b071478efa216ddbda619f6fe7880", - "62b709f88b42c853d0fde963900be3b9abc7ffeadaed7b3802502b44cce34b32", - "179bf0331b3577bd999f364f5fac213a07f61846ad2fd79d31a0bdf189501fd7", - "d7e5bb8d38968917faab2e5bb3618b368ff95229126f11a93ba43185f1fd46d7", - "bcde4e2c1d552f6dfe2f914d8d75c02e8cb7f23c82704429af7a225536ee259f", - "1fc64922279e86ca077e6b06ef4b064cb9ecad8f1d150046ae19ffc88747b19f", - "ecdfdd5f5cfa574316632c2e4d013fdb5715dfca09936d44b9ddf11656588feb", - "2bb57bba5bffaa6a42d59ab5bedb70ad771580c50f36b1698c1dac8e66652cc7", - "1d12936b6230c7360f24e4aa39590dc9ce44b43474101e6620eb5e880782d481", - "df45e5a0a44cfb70621263b374fd22b8ddec7b5ea0822876f91c1bd1ddbc9fb4", - "759b3329e5b08572fb6d697b4805e08ace1583deca949a27972a92c0fce1774f", - "d8681243c8378cff97a773bc19fba319c6b8694e4e036aa9348de8ec759e1774", - "ff4b28bf8d63c9ca637f77b35e5bd2f57224808f234c801a522db4cf3f9d29ea", - "29fe288f15c0ae9bb6e4636c3589c4de2c9b7abf4b55e3e296cbc239b9ccb950", - "cd62908fb6d750904d7899265df920038346585f4993b844ebbfa328b016a14c", - "0136f19208efdb87836f18b168bf808403db24efe29ea45b6df4b2969c901e39", - "4aade2e553b8b37d8e23d1b9915098bd52f607382f8d27d19eb7384520ba7ef1", - "ad5bfd66df1890b1aa40802f12d6141277a54c1a988edba065d73888f9341789", - "53cd1723a818bed44c626b4c2443db1140ff61a321167e990dafdc5d146640d7", - "a6100c90f8d280c799f7743ea84fff856279fbf4242d93f91aecbbb3498f8946", - "2d3b242981e6247e378949c4abca67d589ac8f05aa51ec570572dfcc79e4ce9e", - "b13ac04795907ad7a4b469e0b7180bcf3aa6de694331f1625e3dc1cdb3ad4133", - "4410f02b70a68f6786619b95ed77c1ab003014c5e0fd646360456f51822526fc", - "a1f3a40a7748b96675a6efbf1711c7d56c4594e15012b1f3c54ac1ae440a6e95", - "322a649eb48a1c3efc53cca68672ff73555d098ffc1dc12b367c35cf21b4e7a3", - "b44d20d1407bea5b6c58f69d1fc9a39bc67b41e347063a4859e14bcb49ac5147", - "f0f64ba4ef3329242346b7e9283a0ca24c581de6a75ca557d39f40d3894793a7", - "23146a66622bc80440492c8ff78d55caf3762085a741b1a45526cc13da60dce3", - "d93709d973ab3edd6e9dfad6f0d5361ea7b9ed9720875e922f4e1c1f373dbc38", - "fdadbf295d93d537761689e1e3235b04221e71201185c3df7ebb7ed9f25283e6", - "5771565a3674a874da8fab73b9cd1a3d0536ac1a002e10c140062c953f4dae16", - "654e65d87c6228e875a55fc752f2d2c276bbadb35c26795e8b78f0f3495801c9", - "943e495168ad3551e4086be2a81dffe4d760486e2f98cdc777c5c0570bf4d25d", - "aade3a58b98ddc436486ceacd9fc075d6ca39c4e9d455457ea2f37248bc9a08b", - "84069e12e97610b3f434fd8b30e70cd0b0cc81ca16362baf0ab14c4b7c9f9d52", - "f2ffa7275210323afdfe9fb606b492c5d0fd3ec46458c323b8b92c11dfd469aa", - "cab68c3407013b4a96571019b9689586c1e09204487aa63885f5cafe53ebc280", - "fb41ddcb2d9ddc069261e2d45cd6d09f4f4e3d9d24ce40ab7e8c103fcb43623f", - "cb31e3bee81e63d91e5d9e9c8e1d33bc73be02d3a33e1ca1ea9d35a8b464ae21", - "2cf02dfe39decb798c894de962f4e1dfaa28a356d25ef33bc8553770f8f56483", - "2ea0acb633e71872701cb1fc130695ea07b3d6875e3d06dbf23120d0ca256f50", - "5700754424755168f4a1feea4d4b4098af5eb58da47180b0bc83cea85e9baa8c", - "c32458201cc155e633d639100e1fe4beeb6290e910f1ebde08b061954e5c6c5d", - "abc107dbbd6a4c673049281fe82f74d522d51fe314064854be7a70bcc74c2e4b", - "735c528fa490ea8a8a86a85afc624bbd5cfe7adc4dc3ace2d34e2e563e107747", - "70411a95cd67e5e0d498bd6ae3e708572c7f17be354f351212db3b54290cbb46", - "58f23e08638dabeea86f7b040d982c6e5c17f4c90fbc5c4b297dea9af8ddae11", - "2362c6c59fb91bb979bd70e00da6316869741f97bf9b25daa5c8a2f3fb5ac6ce", - "e82b0bf7c9e27466242afc43011bec26c8867e36c9fc9283841975482fe416a5", - "f722017bf1e19f72a944845bcc5795c1a2f58652dfbcc40807d15b27ba503550", - "68b5e896392ed496c64785a91ba8e1d7391d19ac924599f8ecc03ee0c1fdf6b4", - "29cb51e74fc40f1886f636486060eed2e4abd5359a8336d3e6dc7d74ac3cc20f", - "fc1575c45858f6ef0d1a37e183561d5e4fec5a6789b540fab047e665291ee668", - "42ff8ec5d1130ba5eb810e1d871b7cfc41e00b00cd4973e8eba09aaaf3b4980f", - "6fab50338eafc22964785c9dccbf3f6ad1e4be80a5e8c6a474d4741c9a50aa76", - "f7b33b51fc7d700e0a43b87e7895cd06870f295a174f8107a7e7ff39caf04d8c", - "55f4974e5d7100b94c350f4266061a88f7cd8b46c0225e19e0acd38169d64638", - "0b02635fc01d9d1a2f4c853cd575e5738a7e0b52967b1a53bca4f6b62587619a", - "699bc9571b8b1d0d6065d873e0c9626c770436379c377614609eefb8399b7ad0", - "c601167b8c13db3ed09fc4d45269a4acabb4f03fa5d10412c13dee06b2d81828", - "d253bae925fcd03f7e331bc40c0f3a3a36ccefcca660be2cdaad619f045f27d5", - "a61a9ec05e4202a8cacdbd677f1bb3b51b3c1c518cbd094e15980a397aaae828", - "a95bee1b19ea0c3fece17beff8b585d863e0cf51668821732361d7cf19fed433", - "2a63d65d47925965d3e85f69c85eb61a8faccf553143bb3fc8d70aa64b2339be", - "9a103fb6cfb0d41d59603dbd71d4d64d70343190245370f494d6be6f46a3af8d", - "f42df28220e3c62ef95db26932fd04e4cf107457e2929a0738771eed0c95936d", - "20ca82ebc42c8c4446c54c913f8aa2ac0fae24d8e89650e82e6c398202fdc8df", - "9660982112cb5796fee14af1e769d1647f6704ee48dd90a23cb4b488e3b65916", - "79c516950da3588e8689095564977e49fac6f5bacd3b5a534513a463b2ca63f0", - "e57842277ddddce7577b5b95358202cd63bd4929b5517590a58ae9768322b92d", - "a5b1530cd5a14da5aefa4c3c7abb7316223c59741de8161d45a46c12d77fa548", - "d076510d74b384b5c035fb660f82d0c099398a590da6e94942542215bc6ab33b", - "1f8a2f450edd2c4a251af5ca9859a11bad6cbf1b190b789f08cab5522cf00fde", - "0d0bb8a0126d3e18acb35b4eb928d1cf8272bf0c4d8aa79406cc98e00949b332", - "52c0ae5ccebde17037538000f062f1eeed7b8c4e030665866c49354602009037", - "9c12748de19d8de77f1102b3f17159eae168ca3c441b25822d7de369b6e84b13", - "297d8f3dbfb75aea7f2e9f569770b0be0d03974e671b2dcefcabf61eed8b75a4", - "b21382465c40a25a832fff9ee7514a8a9535ae86d552ec9fff49d0ee831930b3", - "48453a03dc1310fc53e462bc0527d58a6e56c9c3fc5a897285258928d37d5cdd", - "9d7a389d5c50b4d686e0b2a79e89d1579f1a0d090358b8779d09c06ddafdd985", - "62f68d42cefeed458ef6b7c99517c5af49134ed5ecceb8852f73f545e7411cf7", - "29d4754fc410179842e1bfc9e1cb9da7d3860fbf3d510f565bcd6b1f187a6ea9", - "b6aea1ab8d00c9327a48a8841e365bd18107f4ba0d8e1c40f9641e854e42872a", - "ef1af86dadc40ad5a688697f434f4d643bffa5b7a6e763aa07b147ffd533feda", - "db467d00a99a68558e447c524ecc818e6e298aba18fe8615ef2583c5230dddb2", - "8391a30a3d124359437c6602d47b1927cbecdc76e257a881ac51aeae5e5773b8", - "1ccbd60a4fad95d316ffca9f26c90c877ef13a995194cdf580123ba66e96e5cd", - "e745fb3fc59a9cbc179b2510e9f5e62d9d4e52bb90e9c33867de61a5498d2400", - "c90dd97caeb885dbe519ee97619171c7614c92cbb159fdfe843ad179147e4d54", - "d10513d5945a73b10bd41a8b101fd13ea894d10efd3a2daddaf6a21a4e2857b8", - "df241d8195b8cd2b19dc4f0a996a997a32f7d42b092e6c5f61edaa48d96d8105", - "2423588ccbaf5d066688dd2fc4b9b831995c6d4567d1594cfa2272118ea6698a", - "a140b6cb0e44ad3338101f1bcbd42255f4310b31e812656e6ec7511c229abf3b", - "29df6a7a27924afb9657abbd3faf11bda3f9d72c7bede2b0a1f987b3fce5da2f", - "b04a4ee517fcfa02a75377e5aa74caeb92f85030f40a9b73e9259a89f854bafa", - "ad2c5b2c1c1568ff00d30412b4b11b315a24f7e0225be63842df1e96c20fd562", - "5a676dc40f73303c3708b0bbc98ef51a7b64f6f653b54a589a6ebf0b40a07360", - "145ca97bf8a8282ac0515e52cfea23ea9c0141b5db3d4ed66e602b761f1128ab", - "15f892e3005f0be755a8e957cd5fdd13c7ce82e93c149a0716193b7898b1e60f", - "57dbc9b0d2d1893fbb1d4171c68313408f1ce6c218c04455e3775540859d23ce", - "672d7709cad63a6f27eb207a9ca041d64bd88cd47db8a012e0f60996a3e7338a", - "bcc6ef1e566415ac43ec148eaecdecfb4557f8b2036abf1f6dbd6a26c7143168", - "57eee8c3d25d6036508553949bd97bc0a7fb7d8f48f5fcee8dbaca66efc6bab6", - "6702a6042d9cc84f394fc10c42a986e9c8df8570247bc27de02469ece4bbe162", - "3864fdd2065fce597a0f186f17ade897313c1ab98d7f2bde8e98a0358ae6e3a3", - "b9c3ab8d890d1bfd410be8a132646ca19960e8b7cc05dfdd98ed7ee9a68f6212", - "a681da1049848cb1fab0e6bf40b17005ebe9145ebd767b6201d16d031969efd1", - "cedc34c7c9abfb3ca0200d788a56c3c6acca3025f40ee8878c9ab8901d3ad29b", - "4fdb528606a5f4364f5751081ce08bd5fc92f15c74d5acd0ccd5424ebf8ae918", - "88bd7dfaaab3275f65856781c2f43d9fa3d7576a2991b825635be753faefc657", - "4103c6dd7aa204b7da3d90a1ba557f9b9854e5ea23ddd7315850679daa3ec473", - "b2412636f45324740092765326218881ffbcdebd13b5a495fa1837cd270fd129", - "a8ec8ba1b181980dcfdbead0942eff661c01786db77c437f155459ac890a5cc4", - "4f6bc9ca653afa12d054e66ce80a55601d6a0c4a2d9fd3987c2a7fc7b49e0000", - "89f9451564de65b21e1fbeddb95505b296a1d3dde951f84c5fabde55e40ae202", - "02f9825ed8703e72e16196dced8097b46e150f6d2143c58ec358fd9d3e22ef7e", - "fc4403944679b7330270914fcd43110cab39d3657040674374c43e5e85d9b0f0", - "021bf003d4a44f3879d18aecd9555ab044d998452d7e148962fbf68cc60de142", - "841b457a803973d39e462f98522a41a5c1aa9842bbbf5a17c3e4619225106251", - "844572ab2d37087f3c059a71057be22c4ff0751b461c2102bf3e073c7438cb72", - "7cd810ddff2db75541b4d541becea75aad10689bfbc6d03c5cc5d7e5cffb6d51", - "4abda0485a31aab3996ac778403314e995aa8375998ef22b50445f03ca00d800", - "d9e6fdcc61d051fcb97ee5cf45d9686a44c43b6205c8056aa9c16ec45647234b", - "9c74099744dc8b84de390526898bed8f002e7a63563d89c9c887794177ea5691", - "c581f739d58ff518e8b69bef1e28468f13ebe92117896ae7ce269ccd778778b4", - "ec4ce50e34ff284d5cab3106f86150c9905fd72d97452e2371b85fb654da3af8", - "9fd1d016e477d799039016382499f291533ef677395cfcd83755fd162b63175c", - "f40f8a6ec0f780619d1d6d7a995682ca27341a684a50b2e0785edb2472427a43", - "f0b3ac29a02433ba7240c5c32a4d72cd9c4bbf4ebcb22531199e21b8be07ba4e", - "f1c458815c0ac6fb64730221f23ad5cbb01e90d06a55e380cfd944821e477098", - "1ededa10fba5abf4a99c17e0f0cb8b8c1183788e5f38405e8e1269c10c63c005", - "21b3a765ce3b6a5b4a50f12325811b3ad95661dda4622b483a88ab3c2212ca55", - "b122adee5a6aae44bd38383b61827495746b1e6e4b12774373452f3d63130074", - "56293691a0bdbf0c20503e8f852b73162eae046aefe63f68575ccad4d46136ed", - "68309b72406e7171aa591c281e9c14128cba021a25abd43e7d6feea0fdd34fdb", - "db36bb6a9bef8e5ebdf95c7d9836146f24472b46495c09e1ef28dac468466cdb", - "081d71a6645ab8f170a05b1b79ee62859ef2e9b93c41b8c1f442c19c5f2cd7e2", - "52dd0aa398505e57cc1556357cf5189bdec0fd4b5fc99955e0019df8ac49fd6a", - "9c3cb57a30ee5b3f6f1edc91af6a1dff86671ddf0bada08d10f64e4777acc08d", - "56ae15f89337badfc37539be97b66ecff7c1ee3fd699d346af892c10156dc508", - "5411aec3a12461d4c69fb1f94f80b7e03988433af79d1f2a9f3f49dec19cde04", - "674243eef0a015c9872ca9f4c0f952bab25b8a40d65ab7f7ca496edce4b3c630", - "36e99d21ed6cef28b82c0e3b9c8ce5588ae2a8aa5a9c4dd10582710f0a1f27f3", - "54c64783933a296808c29630c93134b3667dec18554620c24a36ede050e5e159", - "1510e3a9609169ba86ddbdf11969d9db3985020142f819a003703e7113b38740", - "884ee1aa037471ebc87bc1d04316b2b34ae9d3652b02d63d1473489a18782017", - "35c4c5c69af3c601bbcd6d61b4f87a9f606e681938e36ac34979b0ebee1e5f65", - "6ff0dd3c1516c2db5db5708a2fc85e8c9364862282cb6f2ded11850ac2a37b21", - "36b0aec52e68df6db90fe1c92990d28f611c41356f1b34f15ada49ed63a7a3d4", - "788a74c24db29c5a4e625ca05b6efa4d8807f48b1bf20350078c161f1c365e57", - "3b6b1357e40efa87e9a7218a2d6857d82a9b9ce883bad23dd9f897141c41a192", - "39a42b2056889c21f39fda4c9d79f58afba26feb182593a503323b19af1ac086", - "059cef003ce5f2d62feefa8f8ec7f96a7155187bd542f54f8d213c7d258c66c2", - "23a436d6513c3a96d00cfb477e3d906844a9e934710ec43f1b5563d22758195b", - "40ae5928b0693ae68bd66645e61ef1cfbd568621b3a62916cfb4b84c799055b7", - "6d448c3eefc41b302fad275d1acf9d8d888de85228e645f75b52421879368cb7", - "804333f44dbd049d07edf12c77a3f7884cba8d64412bc256c174785fd0cc7d1d", - "7b7d804c6ada994d83d87d8740affb35460103462ba4e5e222d889b39823eb31", - "c4c163653937a6c176940f567bf984baa400a0620ac38ead5223db3997fca522", - "e911bdc9ab499964c3a3512a68aa3b0f439bfe589154b25ef889aa179ce1220f", - "ef91b62c6f4a4e010f43169b03329abe7ef49d18df7c089a7924e36139891bab", - "5c092e70a2c5729b0a382684e1a3a7de77a37ed86ce4b477fe1daa5222ee6ede", - "2121a3b5f2c4eb5a11460bb4ca77e4113f8f309a4767dd741dbdace79e28d907", - "b1a79579bb85f9ca5efc5eb6428c826e481bba6d4f2f65724870c4b5b6e56534", - "2aa1c55267a013724d977cf9d969260250c968b84d5a8ec576cf149c899c16de", - "27aee1ce4ccf6aaf07ff16a7cb87f66e78524a3beda1c39315bdc314f33b7c35", - "a69fd04445c2c135eeda1cd63f28ab27b395cc0e4f5b8119852aae4d0411714a", - "216ca3977b15f9a6a908211a92151841138a1adec4b772f3ac7b1f99cfa9aa26", - "915d5f1c80ce052988810efc978f776790d9ff6967664deb534b008180c1ef5e", - "909367ed2bf688b1a24c38d60be6d76b69adbacc501b9abcb4c25709253a009a", - "d2e6e688042ae9d15719813a2c1ee8735d3a5370778778c8a91c7bc06a5b2f9d", - "179109e7fa3a1e1fa6af995b2592aca67d939154f8220072e3ac0d4a2cd9b1e8", - "1c5271e488da56bb07c4630c4071b21973aec9a908dd3d38b48cce0abeef549a", - "16654fac141c443f32c67f243d40dd585581914beea38a315aeb08c8925e4b1f", - "d59418214e775992666c8eddefaf31fbd28a6f53b3418c1832454ddffc343407", - "ab08bbdb295d6cce053952831136fc9a4dd42221d318b1c172300e0ce35a7a02", - "800e6b434c8ced5f58951de24bee21b15b3f2c8f38ba3b10cfbfad7b8e34dda6", - "6e9881c30e851f4156a4b2dd093dafd537c5caa8e462b6b7d190d2bcf991285b", - "4d49a6bc4ed9e579819caa6c02b04ef4d5e43392abedc18ddc1f0e20e28db79d", - "e721220a37270f57cf51141e9d7c8057035699da38445b61762010296c969c90", - "12329e1d3092074257205505e89f546784855e865d1336a6bd55e4ca6a9721d2", - "997780c9563af247386408d3439427a66169ff4def5e652242951e3cd534fb3e", - "491b39f7fd41b5b8aed84bb146ea69ab57e239a72def962d58deba66ec646a87", - "519f2f0e17adbbbdaea10f5ca38334f8d139e77699c94117bfac911acf28ba5f", - "78057d6176260cdcfb12121132145641410bc2663b9054a559c68c8999e33a26", - "107748e45112d3411d7d5a0bd0f7558008b3158c86b93c4bf21e22df2060f156", - "d121cf533086bc3624a9f3680fced207642153b296b11f745e49455ab7fae826", - "d045cfd4874db4bf092fd3b61ce8ef94d3cb20bbe2cbee46a06677887370a1d9", - "17aae728c3fd68cfcc23047b83aeb6e0039afe25d823d543572399544ca6a48e", - "362a874edb3c46a87c1147697b11bb21e2467fb4641d95fa3a85c92755897a1b", - "e37d317506502362d123e2d31ca9449eb6efcbe690097ee20c82814fc5447e91", - "a1ecee65d6b10c10a28bbfa6e85b76cde22f883a921b2120e2b4560678c79a87", - "0cb03a0a04be7847d13bbac4371352a0461f27e921d743ee63682d2ed5dca5dc", - "baa6a6f0f9ee1a41556cf324ccb70df8a45703b4df93282ec0c67b0107b3bb0e", - "007a28183b6ed0365dd8d2664a33005c46daff7f392470a910bfc0f2c04fb0e1", - "f4a4b3b43d413c1de598fd1e2e8d393cd39dee287e0d9e676cfa92f11519007a", - "05e2b2679c87f77d297d32567e5bc2c602c9973678e2ca5c7cc3f42f34bae320", - "06883d7e67cfc96c3905a986bf2250fa94cc26da79d56d5f7a1287d032eb998c", - "1d5cdcf3cdd2f2482aacf31a89df7fbfa5cb1164fb392b484af8e888d602a60b", - "aa709c590b6e7ddc79afff5384afec52eae5efa807847749606865e29cee08e9", - "b6cf474327e852111e98578c4d45c556bfebc8d5c8cb02cfbb07014261fd990b", - "91426b4f4f60a69ee7a320420dd90b9008ff270e4083075877b9f643a38227bc", - "be817e37570b44293271f141172c3df9e8c8e48c8df3b39a4e9a9c685844d907", - "975dcf381c8c6b871c71c1c54483b3b8a561d9ab19d3fc1f2efd5272d6b88e15", - "a6f73200561b35c9ce7bf7eff42944f675ce12f10ed1a2ee5a3da49c1e547807", - "9ea148762e332b6c43046afb5b0129a753eb5da8d2fea5a1aefd46e13464d0b6", - "29cf966f67a1a29d78d6c73aa601f7684e818f24a0124bcba25a4419056e475f", - "ba56f1fcb4324464c122ecf7f7a762ad767659e3e52d552d7d2e3fb36b3487f6", - "033e81bbcb611e7ddc7e2efb40f1037f37bb4cdd3b42fc2f0b3d78bac3cd7bd1", - "2823e5393f9d6ae002d1fc52b64b8782229593ff726e986fe5de8e18db4cc1f4", - "17b3bd60bb1e300b6b1344a5ad83698c03c6791573efd0ff22790dd9806e43ac", - "b138ea413c1035f49482ff6933ec9a998ae4f5cb489640830d6e0a0fb3d07e2a", - "043aeedcb0c264d8678ed46e7420d987093f66fd51e4a5bccc6d4e91533bca2f", - "88f3e62570e8a3b44daabe68117af596de88f59e0d163a0445b6fea45e771c66", - "dd5c79e07a5d011668e98d16a07c0963ea79b9c8b75d6171499c8548e3696f95", - "874c431be436270d2871e1464d86faa167a3370ede0042457dbffc8340e9b282", - "1755f31c6daa33e82d7cce9640feb03146ed6fd043ca0005b879658d71a30273", - "42efeed37fb5b5dc1b88222ae83d250c23b59d02413e7fd2bb143f5e2ec512dc", - "63fccddc7843b5bb565a6a6ea499fc9b1e86668e43b0d4c3edcaf3ba04d04500", - "f3c4531622c175b0dc527b48a9db47792d2ca11b12cec57d0e8e72817d4db86f", - "c0debe3457127ab6f30265f75894970095e3562d10c0b65a5ffacf229153038e", - "7702bff1a8a4262c5bab8feef1325b207a04499f6a3bbc3899b290ac5e273fc7", - "7c2a12413ccf083d367016a45619e461e5c572cb79e86952a0ca8e1008d18c0c", - "d93c05bb8f2751fda3c21d25ac09dd342fa27fbe634ae12eee5201fe4cafaea9", - "9b318c0a3ba31929cb96c76656442f7eec93b3bc54a077cdb57961a84bc3fdf5", - "109347a442ca81e4fb39e23d8ffa0f46bcc437eebc28eaf43da47dba5d82d8c2", - "565da2f4d3b41173870530ca43439d0a80fd462bae5115625184f7b1901ce6f5", - "8873436a5d21604893a94c9b2d98ea59a2395711bbb64929f59ed94bca5ec170", - "ee60ce5710f61331c2dc707e5876e7e299a7ff96ec851df4c267a5f3507492d4", - "1fed09c26cd6f4a633b75e8a00138d3b79e3ff3a4be87f82d4b46af2dca3d730", - "8b2fc8afa6c2fc0966075d7e4e61842c9cc8844730610c4361f9643996040471", - "1e623a5dd2956ff85d9253d44f90e4e505d5f8f85f930e0a81f8d8aa25d39c7e", - "ff888fdfc57e4c03fd9a7c2cfb236e288d4c3f1d8930080b96c6509d52146e62", - "d760e4641855be51316c4edcf5d39e1c5683e8fc4e2b163f67b49eeab8c7c421", - "8c9a62b309a8cb7d6cf0dc78d25ba8b40508d7d7aeff7c97fdbc365323eb40d1", - "c1c177a943869688d5622da77fb972bde432896dec6014a8d8dd04a9b3ddcf4a", - "7f78246b20906b7ef64fd82e593340e102134265059832cdbd18aa900e0882b3", - "0fa5062ead47f651115a6d3f3edfbd2cf95215de4162987915bedf351d810921", - "115045c7b54be09d1c051af81f3cdf587f5dd8b55d27f4833df56369e6759058", - "f8f65db4ca94af0116a23ada38e3d1d057505c3d70335d63a4eb3374a6c60f4e", - "9f0082863f6491ca9cab7221e4dfda4bbcc83ce781d6b7b62faad9b19f8e9959", - "c55b9088374ce5ab7289cc1580b02474b41008bb94dae383dabdffd47fea3d83", - "dfa04914c8700ae2a7f7aabfe0ebce9ff33ff3f971a1944e3ccde00b895de7ae", - "c784eefcdb921aced7667e71b8e0136b8b0c6512de449cfad6bba331cfc6ce93", - "4e692874b069af6baed20a8f5c9a66067f3471bd4cf32e3060f487c147bf038d", - "061cde88575f71fe260ad229e77edd30e548083a90308428ec8fbd925485e69d", - "9a9ff91e5390dd05c3450a2a94cb856420c536476a945f0d45faca9a4b67ba07", - "cacf416972b71039f64efdaf75e9f4bd351e4b27cedc05bb3769e19110d821a1", - "e262e7ce9ca0451ac5f432a368a0273f445868a9678c866059ba7273c2a1fb7e", - "10d0c410b16a49fd42498925ab16ec28b6763e7eee1ef98c43272e87680db827", - "027d0fa669c0d606f78f6ce45b5cca28cea963981078fca92dff74857407ce0d", - "028565e580cc37cbd8ccfcb691f89ef5996fe3dcf5014c40c971bd5b0d94a60b", - "f52f0e9f2a8b853ee045f46d9bf93305904c9131174835062363817ae33d21bc", - "3496f22f6d621320a1d98436699d3b8d12967755387f991444a29845eadf2e70", - "a4119e337b0c1fc5983d995694fed8bd27da687634c7c914f669487fec455b5d", - "73db47a1deabfc4815665165d3726ff3290af0a3a7b2bfebdee2ecec4e1d8b07", - "6419861e32987db39259ab628fcc7f4712df8365e5ea0b2eefea5c7ee3134423", - "e20ef77e707cbf836e9c8d649585bceda4f6a23ab37aaae4a27ba888490b9d4f", - "f8e29a3fcd5d15fe55fbf74b9660d1f575a58ef98eb221eebb2eca089d9b498a", - "832c9faca826cb92efa645b6dc83a3cb9c58bfba7adfbffaf014a7bacd8639e0", - "b72a20a9361f199ac48b1d9b96518edeb7f0d3373e384fb3f9fab0263e2a8fa2", - "03e30c57e3df6faf9091730a837a4ec899414d7eefae948d0ebf9ced5afda3fb", - "6f0901852d1d8f5b9d4f0fc984dc4c9d8f2cd717c1d65a0977f8c79470780281", - "40199934de1ec1a015e5f8eb9be678f0f125993f8e5ae21ee79157507ab09ae1", - "fbae38c15115cf950a8b77600ff485468a33de4b71eb3c74a86203db74b82072", - "d4c20ffef448d669acb85b647881f767ed6366fc1ca1bed58abdd7513937c490", - "ad6aecf3a00324ffc1b1d1b17d42c89786ee09edcc21b7247536d4144ed48133", - "7c3be2a3da91117ece33142e05a796e1d949af0cc4f71866bc9c8cae38f0a840", - "989ad523d6b62f8c60eb0a000293816ed81ec23cf963349deb0e36cc8ca7fb5f", - "79a0940c803ab3018c1952a09679cff5849091e101f3e474b1ddfa3463f389e0", - "7515899c6d6c74546c4885f910b0af30f3dc0ac677f386047c8d0c4200787e7b", - "8a36f5168113902c549ffd4b645b2d24cf6d33108268e5befda2df643e99c082", - "64a35952a048b3ae09ec1c5d0bbfe2c98891f8447ba46a804116c577892464c9", - "807a82dcd20ce047bef0a5e11e04b3ff2d987e9cb4abb04f8fb770cef1b1adb2", - "6ecd55e2e974d5acfc1fd96f39532c1e41f451d4c88a68493e414bf9912b7a13", - "88aaea954f15ea157fd2b3e0d541e19a39f7aaf1cd904a5d1cbfa29aa397c5fe", - "0a5527f80db7db7a08a852d2f0bb693c4e5168cccf9897eae68034edd80787c0", - "6c798af2d042e1fe75763ce5a602c263b9e544979455d1f68a631c1ba335b4aa", - "054d31d5a47ea08907e2992195038c7b85ef19a7cc53a04257735cce40995ecf", - "fda3ca1c0d98cdabff2bedbfcb8c2f54bbd8cda709bb3e4bef091e357e3e2261", - "1a1ba01c8e7340890af883028a530637dd50ddf4cb609d37c2d470fa47bc4f62", - "491591bb758c8794f6c2ae189eded3bb67cc96f44797d81f6015e927836927ba", - "c00559c49fef650b07d290e8491729f2f06099e3c142b005c9d36f99afae40df", - "6636211900ba9749b06d0dcec06e7f7a6541011ae5058602bed865ff3e89749d", - "a1fc042cff362c50d9240fc1003a78cbc174b8c67096d7935b07f983d10c7a17", - "b312474bd67faf40951d19efc8ab0a10f3ca9dfe69c455f7d6c497e110c3eda6", - "0c3c19d9c878759c8b217c419bc34d09bdf8243b4e880468194ad7cbe6b970b1", - "f764d0267249195f7d37c284a313addf662a166bc95353b752948f8ac071e1f5", - "4f7fafddcac3c7d6214f8530a876b5ca19179aa092d2ad92276ddbadcd17655e", - "058060206d6ea8d39ec09c7f3b431d482af4f3e102d79b4a82d7c6f833124c9b", - "1979ae141063f2af5fc7b836e777ab54bec9a01f04e6d66ede26aa93d0f7abf5", - "def052c3227a91bbca2b0f1f321e084f6a0d0f2f4d52b30a43c46cae7fd6e022", - "7fcef0d9b8bb889d955d79c78b72051c70735bcd58fe760485cb5be5609561c9", - "a2cfb6da51ff8cfda8d635114f173ba139dacb871df33be3562f119f8bfaf307", - "8eedbcdfa69daa6b07c53bfe7f62d62d8adbf60ab321837b973fa1691a787f22", - "5ce65e8baf521d15e5756418226e162bdcee8336052eb3be86c4a7a045e125c8", - "3c687e871f9a8543c74a60c1bc0400f44ef3273ef801e447322f1742bba0e832", - "868ad40a4203cead626c9cc2e2fe1d5c9551241ac0fecdf9aa26f851728800cd", - "f8f48e174151952a8ffd70185b6b88b91ed31c163210458623535bc81c9a2300", - "f115b7c9b855471ae0b396f6605a8dada0d8743667182b8ac59a8c7876180985", - "9f2414869fc49cf8d3c739e6787594a9efb2fc8c9cd64588511522566562f2b1", - "ed49f88c20f466317f8c36958bf9984e23f2a2d8e31ac19d1049eba11f4a59d0", - "fce035a3dda0f4919e8937864a32ddcf6b3e8a637717a88a01e9ddce6333de8a", - "1e764cff73e3a2db5cc46fb6f5dd269f326b03309bbf5809a3c5514c911d80aa", - "bfe972743978646ba8d11bd92ee5c4b8264c6fce11e905bdfaca1ad8c674ebe6", - "98535e9924e94faf071712e8e1c38c4c8125b950f41afed169529466b505e6d1", - "81392ff2146b939438caa79455db28cbe2da93c5b1f3d60a6546b6a123c1acc1", - "ea3a1adfef3ffee6cc559648d1b05f4ff52c772f7d6363947d2bb1860528b1aa", - "e57437c686452366ae1d612d0509c3aeaf42e9bfdd801475946bde9fcf26a5d8", - "157d50f9ebfbb38087ea56b8d86844d3b24246ba4db699f134ece244fcddc2f9", - "abfb8d4c2eeea2b5037fa9515a937de124c0ae24143d6d243f79fce15bd38493", - "2cfa160dce9f4e40ba825b0de4fd7ec40b6cedfbbc92febc0ed1117b1f9bc066", - "83fa5fd1d42d321bb37a50e0736d73da6e3529bcd87ec2a60d35b84d37025b2a", - "6f8b11082bf0d3a3520d723710dbb9ce221a198076f6597d24a904504c865496", - "c045ea245c077fc432d070c4aad5815fd0e33f5fd7b402bb1ded796b1acd6a67", - "382bc2fe1ca0291a133e0093c62ff27c0b08ded2b375886b5f362c53cb50afa6", - "71b716cd31b0dfd22be49a938883fc9195fa041903814a73ea10cc9adfa04e1f", - "fb9070cac41a55217fddc4b7d3463f845f59ad7f1e457a0ba61c74a281b1aee9", - "1b2058d9d113b55261b23983c862dd8cd1b191ace1d956760b2bb56e655e10d4", - "c062244898f2f8291c2b8a4efc60f215ffa60d55c1437bbf127140b34ac135bc", - "56913b8ad7c0ef58d326e69c833e3d2e5b0c3f9d041b824e209d72d5a7828d8d", - "00dd88512d9a898afde1fe85a5703fa0222282e5e9b30bc8a37538bedfa60d72", - "7ef0e108f9372d2bc971efbf432f6b54ec532071eb5a692ed205805fa3eaee2f", - "246b5014f6d61165a966a43da2849224e046df379e9d4334bc84dcf3ad8cbca2", - "4965d7728a0b672edee1412751d0765e4c4661a54ae00b9d30c1dbcd4c00dc42", - "9be65a056d1c0f87802a2dcc8a9de0b5eb0792d29c9258c0d2b1211e7928b0e1", - "f65aabf326274a0e9eae56bb13753494acf9ddf2ea9f4941c55f93a84abc85f4", - "a97d78a4440fad8f4811a675b29ca85b1e43406e4f6b2f7a4debe74d47859c7d", - "ef77cf314c8d8d7b52762a13a7c9a69a282d44a92752d214c7ca2b4dda192d53", - "54ecea7c0a687fb2e11401aafe2d1cff61bcf95dd922a4081d2c1d906c6f89fb", - "d17b054ad769e22aa0467744c94905b6976eaa7653061ed4d24c0d6b3647d84e", - "a679509a1064b4220e5421cd4f012cc248ed7c26b76d279e5682b9236e05aeb8", - "8cc9652aca271f840c6e8ba99ebd615b0a224791cdd573d21768552b74456571", - "d0f4c44ce76dcb6e994b539f92d4c1cc0297c30e0fc86fe3e6a5522f2ff79b65", - "7b8012599f5ca809bc1f0189418292fd98861db582baeeaac63d9da4fa67c966", - "1426bbf50654bf0e3b72e0a2b3617cf397a25fc3a547ca9a51434c50c53dac13", - "75ff4abbcee83439bb6bec0768fd4dfd71cfebe180cbfa91721d3229493eee5d", - "f968cae08fa14f174a22db7c24f6694e21210a926ef338da1288049abca91120", - "a46e1d278babe350fb85ce795d451fb30a1079e90ffeeec813b114d41d2ca6f7", - "685cf8add8a6eaba35b21b5579e3c9a9362b478549cad2e807fb210f61623f7d", - "4a6b7ba0cef0a86c809a63ec2e3c6dee77b2a5f3d2b8511c8df25a2dd41893e4", - "4ea9ca5a8da8fb59e452cef0dc6cffee8e17f3ffe839ae5311a4b351798912ab", - "c18a638e2971ea93a22ffa78fef30fa22a3af047ef18698b91646075c672237c", - "691550a60f1c8787c16fea3cc34c489a08d066775a38b4dd1784ae5dcf7caa84", - "40da1119c93fef7fd6e1eb29ac642b99488c3137075951903101b346b60ab061", - "91c595b95c9503aa760893bf32953c66159adae22f74d935cce5b5d82d1a0180", - "d680a29da26c79c85d756117031c6a95db2d2863f52e1b7b2bc9251c375a5196", - "1923eb6bc91c599485f918c0f759d9c9ea5b530c0e6047104255e64653db6ccb", - "86789a7a29ed68a4c499139956e9d9a58c4047bd1b56431946b594433b00ce33", - "9fe86a20ac84e747e94e71c1f597146bae200945a9d392bdc5046733bcb06659", - "bb7fcb33b55651e8a4562b6bbf077c35b2822d5013773486ea4a42495feca3cd", - "512fcfc12c553b951bb56ed00b9ccaf4813ce69603403a295623513ecd8f952c", - "77a008385f58fc3ee52c82150375a4d74f6a6b6f2ec17972e273f664bf698382", - "bfc9ebbfea4fec3fecd182656be56324f5860bc084a82b5c5bd86e915f81793c", - "6e46c87fc21b19b9c878cd9c77da21c4a1f5d38a44ac53baf71ac6d919617be3", - "301386c5874b51b16e4c64a6cd51d534b5627ac36bdc256173c56a766bea2223", - "dfa86d9e088b9b581e8685d4b69bf157c61dde3fc487f83d4b66fa24f06d2f08", - "9a746c5d5a8ba69bc77a16c4196a39f029715be09996aec29364c71f67b7096b", - "bb120488b73cb04a3c423dfa6760eb631165fa3d6d8e0b1be360d3e2a00add78", - "a60751412655c7e0cc274c90d5dc5a3774467c99cd8c10d616be6f5d999b9eb4", - "8aad0e2df9d2a1acd2c6472900fd99cc9d243eecd1bcfff288bd58b2644dfdb0", - "204dd0624d7203d0c50e2fc6e360861d2f24d1dba2697d7d235ac669f2d50e7f", - "ae9e4dc965dae89ac7359c9b3b30f7e10bf8f07d64e2a504f8109c8c20048960", - "181e0edf25da0f7075b9db67bb273cadd9d2988c96a1c3ddd85a540290be8b31", - "d9c9b5eff8224ef873a3f8c76451f5214ee76b6034e15d1ff0eb35fcd9115f81", - "5a3f2080a63ca9bb2a82894ac9e3c4897d8f35f6584f2c8c8b138f8a2a9d9b1c", - "749ddb44498f30f9e21477e9ffc10684eb0c1bfdccda39bb18f1e0fc8e1032e8", - "bf90894d15054d7572950851bdaaabedcf5aa45d3ce58bfbbedc707b9201770f", - "1f77182168adc26b39811cb1aefa0f15d4074eb0b80e33b0ac818b5070c84ed0", - "c580547be908be323980c73a00ee24d65c55a632af701476a4322659ed37382f", - "974f44f4d1150b32485e9d4b2f48feaad891e2195d48a51863f9c04d123022aa", - "9e60ea739dbf197c2bffd426783bbd03e7899f39b988ec9adbd348189779126d", - "cdbdc51c76296ec503455840cc1e17eb91fc924d66e38f20c9c8dba9a5555172", - "79e4a22f120bd87f8e50380358a87de7ce392b7cf10d14a5cc856f5ccc362b7e", - "7d87b253cfba71a1e8b40dc2f53a69e2a008c12cfeae5072c6e940698fb8bbe7", - "db2bba68345543213c7bd1a1aa18d114f8ccfb4c5bc78545eaebb2a01e61fbe9", - "87ac6c33da8bc8a557e946962d8509b429901f988418bbdd61896fc0a5045f47", - "301c5b8300c9d988bf50b9b0404434f1397bd332b2ac08321c8b2443c904257d", - "c275919ab98ddf9232658625d123abfaf68678a82b82a3c7f7e1884895985e69", - "eb29c877bc34d383d5cc0c812e0913a65dd3fe1fd0de7839be6ada23c309a268", - "826e4f7122df41ae00fc3b776e28e6d8603d92531a57567e7192d0026ab2e49b", - "f7578b463bd59ab6cbb070cb63774fe93cc6b075771b186681346914ef137891", - "4cea328f06e6c34590bc2226f367fa6c6d2fd3673587d43efad3acab2f1019a1", - "9e56d4e47830bddb72bd893395956809b15f3da77d029dac87e1e7ecee184045", - "edc50c7b149ffd44d865b2abcd7c923090168035a764a85bc8c4a403c2b772b5", - "d59048bd2d1366e0e9f4c06c908be24af154e77a07bf9552dd2fa546d0f2f933", - "d2f4e070ac787f4523764dff56fba13540525ff33af22de7a79d5ec1ded643d0", - "7bffd1127d4f17845da7f9236d952eabd9e8de621a55591bdc5961c40f0766aa", - "167764d7746323a1003fbff437263bfba88aa9181b1f9759c4deda23dd047c72", - "c92b191dc61b2f1a9bac2aaf18cbcbc39e9ebdd09610c09c9e5f04fccd59cb55", - "a882888a63d937016a535bec7713c384edba2b93c85d98d4a8b36693a6f6d40a", - "b3646dcf83d5a04f3ed5609672118cfb5f8e0441510eba742c6edfb0b129d941", - "ecae7c40c0f4f0c1417c5cbbc2ad272a127e76772d31c18c55b8a4350bde7111", - "551755cc8c7b1bebd90e84ab01e8e08155fbe1e29a01e85fad540b0b4bff717b", - "468f202767ec6f8a6d2efe0a83a64be314d4777b47e8935e799d53c822e40d41", - "3b297f599ec6c0bc9b400661ca62e2725c267089b2b2520a49f1b4cd9f36b0c7", - "242f2bb2bb2b8588f97e24467acde68e95820e053c39d363f7b270fc681cfe83", - "04e6a779fb566f15c6ad530d749e30e5b08051adbc265d5ee1c04856b533e2a3", - "ec81a8cc8a4dbacbd2a4584a328b93c6cbe2984ca577a1e1a3e96308730f9f82", - "0109da117b6c53c8c5a01593a118c6a647a09cd3c00b9731ae1cbcfaeaf55559", - "51f653ff43dbc87244e40b0c4d4bf1118a5d229622dfd61ace3f88681f206c5f", - "ebd1e0a8d668ddfcb6e108163ebac61ad3937a4ac73ed685f9f28f8574e93fe4", - "c4d42b13cf2115dfb62749049d84a6f99d056b1aff41a70d3f95589bfed43cbe", - "ad79ee2da65bfec044f33595cc8f48db8a4a3cbe2dffa648f52230948abf18c6", - "e6bb72048072b86cec6436a73478c352cd723b77d0ab24df9675fd29d5bc6d93", - "89f2038509c55168bac3e071de7341ec9ec7da9377a4f3dda133cd0d60596ce4", - "fa54d8e332663ae1e2163c006b8f3e04619e2899546e1b2f42b5fde54c49a748", - "268472e86e55c6b66d42c5a71f282fa8ed791950c984149c08eb63a801fb831d", - "0b230c1703703d4b8198b2190b50fdf61f54b8421f2b8f56b38113703645953e", - "7ad5083b548035d002d8a272b6fa0c7ad8bf040bb33d6704080e196062c40098", - "9f3fc8924af814c7b0a2d2dd37ed6bf5e64c7de8a5e6a76bfac071e62ab32258", - "b11418b95663ffdbd84488f790e92717332ca2569eae9d5cae883a8cd0ad2951", - "af1ae19b691dd71b6b3d54ab6825172b6d7172da9a02542cea732e5393c8849d", - "1a79cd7889ba81334a37993ab48e13f36a4f9e12ae9532cbdf0e02a6a683101e", - "eacdc2c1ab2d01307bbb17dbaec6d4cb2cd2fcb15e8c1b509f41b329aadd6382", - "235b9bfc6ebe8ff6ac61cfb0d1afa8ac2f4ba1d62c47da49d84dbf8ee66a8241", - "bb249f4ccf113d4f6d570b544571c7449480aa90f84a7e987942636bdce02e5c", - "87cdbf10ab074f4ae6dec70676070c6af31f43234f5c31717a8330880ad0ace0", - "fc528d121dc866620627f401c4538750603815d1754b12f372dc80e769db919c", - "e5f4e02bd49e3e9fb132a533d619681ad617294759c4cece93889cef0079f26a", - "bfaee06c330a272bda0c9d7bbc2a2e95b31ca17f84e6202b27aa614913e93a61", - "425d8782328f9c4ebc4b30ce23f7c6181be4bb09951d93031d31dc1c49ebd6cd", - "6843e49c33e46d8aa80fe2e8e5b4c35057ff7d269fcc63741e582a2d7310f79e", - "05851dc0b45ea55bf54c3fdc970856d52a2b18ac9a9f8195d9d8796ba749580f", - "cb21dd3ef48c97bcc12632b363900b88686f2642c4d089f768e443f112f10768", - "d54e9a8560ac81b1c125a0784333277643e1e66de542086e97e6c65ddde32f97", - "9d727ff0b92a8e5ea65a7e6d53a1f6a149b0ff9facc8e547a3b2e676227a87cc", - "ccee295ed4e5620f4e80dce35abfe8088aa282e50a432f3e715990fc390b8d42", - "4e2b3fdb3d228e516b4984749a20b870ea0cb59386c7b5cad5e6a3a239330026", - "46d9fecc4db31e81c9b4f4ed01de90d97687d17af9eb3642bd7704524b1459f9", - "08ee21730f86b9effa97aee9994578e3b159a5e83ad3590894f70dd61be64093", - "23ab6cf6e3c91b9cbf56810f6befe3f24747e114cf09f37b20ebc17b6df0e4fb", - "0f91ef856927de6a83f10556f07ce034edd64f1282b304a511484c4aa04cc7bd", - "5db00b19885c2bd6571dad05706cb2b1c6c4ceec6221af68935a91171e32a372", - "1f9778961f295ac3134ede00e76cb11a01fa6d548280280a5e55fa8ed0c7ca66", - "70f0703f238c0ed5bff37c63ea20fbb469a09392af7195e2b6b15e1578146072", - "fc4cff8a3a92f0e329071817f9f9298f7141beaf6ec7aadf966a2569b7767d34", - "e25d49fac3da7af3f43af6fe563bfd5a7c0027b928ffa720ab1a95c02487bfd7", - "f2a0e4932a79f26e1590e998b9f0ecf4a24a4d483a7469d7c9c05a2811d2d36a", - "4a7c16a6102f1a7c7e7c3a5a4e32466a689722b887e894708f6063ca378765ff", - "c1299d59f57eeb72be2b33eac9fdd8d3ff5a2f30f107d61f925336f474ac9719", - "b0ea1f3a4a7642b28ac87c8f2c2d6b717c64e8528db90fdf16214ddcf5bdc8cb", - "b453d3cc42bd3a95bd71fda3c83e06002a6d3d827a4a0cc71235d7eaa2699231", - "882844a55a37b00a41eed5f8a3ba44862319c1e1871fb42ae854b073018d400d", - "c4949f9142b7c69ea5e0516825b82518cbe60d799e1759007ed1a6468aa1bfb9", - "04ccff88618a0f5131441e8aee8e1664a64edae0f7dfaa8873d29643f4f2e619", - "39f5a10c090f80f66b1f8d6cf6b1584ebf11f969197370b1c3e5bf0a5942d30d", - "1138d4e6b8cf14ae09b8d02b92c01ccedb8b90a6edc7b81d755e16b1c5f623cd", - "b852a9a188f8e7d5da13b510159316be7597fd6321740f14ed2aa5bf1902ca84", - "31c411e3025542dbb794453049a059b7e97858df3e7d96b96c2b3ad1e0bd76b5", - "c437acc22a6fbb91f3734752933721a5a70fc66b1c4b988cce8a37eab24d4b72", - "89c066d97c9fee4ef2edc7be877569867b0296a701b2bee95e13503a1fc33aa4", - "75fb631f5d557ebabee75b35f5ab0e035943947b8c51a6b2994f3954537874bc", - "975e85d448f25a090c47860bc83f70302d053591db1b4d9f169399512c6fec27", - "9c2f0d877e15f1e74676e21cab81e4eac352bfdc9a2342e19a4ff6071cc93bb5", - "48b84dcc75e91164a47677f470f3eec6004db67a121cff19891534b072bffbb4", - "13bde619521cc40f2f6d7e4db011971ed005a5157ee16ca0c12371dc3c541e75", - "346390e4746190e435c710b4a08d89f50537ed12afbee47abab58b1b27d62ca0", - "ec35195fd0395ab017e44a929b127be7507d0e8c588e0804d2a48aeba9d6e20f", - "c63b3a1c3dd7a47d4010091e00c96a64c005ab7f7355853d60992349ee6e77f5", - "32423a39c7dafae890eb3a561d597105d1b47ae4725bbc63a85f0c887d7af45a", - "81eee43076483efcbc506a420747ecaa32878171ba9c48f8f5bd5b5990248168", - "747772d0370cebaeebb8657357f9bd7a4ed7142218d9b0b0ecb3895abec49226", - "321456dca10ec6e215788b4638adfaae221a8ca32aabd0ca654bcc719568df9a", - "6dcf202733d63f598ca2f5213859501d722600bffe2847435168a8d5cb318062", - "aee4173950b28f73640a5615dcd09a82091c653ecc64d1b71352cb9ccd419b10", - "d4d40a19db1e9c610e73dc77bc6e563b00b1d3d20c5829bdf273457dc251b510", - "83c26e461e9eb3b4b14998e3be98e18c69589a42a50f8ee64e75d2cfcb63f8a8", - "5bc30004dae7b06dea1d952553b138c2bd2fe1d805d522819f2c37c3f28a088a", - "04284f873861a8221db83cb1767cbad77e2ce67f68aa7bef47792b2ad1aac168", - "c258eb5e721178e18c5931d81cfa97c38f5cc4d7d3d34fe3b1c0787ab6ce6148", - "62733a28025e02322b3a42ade7f334800d62e35c16c74549eb56d58bf20fbca7", - "c2a77f1c9df343b5f5972251ee13a48f3dc10876c9f50fccd35545e01ae2506f", - "d26ff3ec5523c67bf5ba1a139b6d267da3112331585bf398769fc6d7ccfa2e13", - "88f51308b7988cfb10aa2637db4aa83b61daef0a07d3c7373020d3030afac010", - "ebc00ece3f0e2121c35c8ac9a2125d0f499df4d3265be3438007d51b0ea16a1b", - "36a1e2609a7261ed091510f12a809a1804ea5943ca9f77a2aadfcd899db9e692", - "171fdb0658e66782735ccbf48f5558224fff7d1249f6584caa3d329d8b63418c", - "d500859b2e8a733d84aca4050454ed77438e9cb9119bb6a3b8964b76de70224c", - "6ffc3766c2826e2b748b0aa70cdeb541be1ba22a0e55f94b2bfa857e9120631b", - "94f64edcc16c3f595a5fdb96a339e17b2d72854f257271f9e0233928e216eb31", - "bf1cbe513f134a31a23402d57e0832969e8c71d2b438a4ebabd70f4a591ec8bb", - "ca6b0ab9350b7a1a34d5e262b427c9ae90ca85d28c9b2c067d906f6cf3774f04", - "410b62022332ed81098bd685970c810fe7b9d468cbb287f8c393c60687c8e9c2", - "bb3cad45a0173b04fcac4abdb1da481ff322acd1dd511904a6f466c7e8f00be6", - "e38cd2789626a29f0827b7011ba68aec76e612bf52c209051eeb715be8307ed6", - "3708cd6cbe752cd7004c4449f6b2f854d5e0c88b2217290d515b31ac8f00511e", - "132159d359942115f0165fa217ac101cf32449bc9275e5cf7e86db265281aad9", - "eae9e6acbf1db46810b6829a32ef092272edc07249b9891cbdbdfbd46c79508a", - "cd65f1e85ebb68af6b2533b1a926398d3c9a3d30998823a121e327895fc55ae9", - "069032ecf5e2af8c771b727101a1c89ca2834f6e9f324b062ce6e12e6614b496", - "0ec490b4ab23abb1a5c19d9c9cd0298f90b9268a4c74b898390cb886d41b1dc8", - "35e3e22af1c61d6f533eb4cbb4466eb9d9b1dced51a5470c51d8d019e74fcc58", - "6f5247dc81efa7d02384aac92a89b3edb6d91e18c20e63661661d8f2e2a5689c", - "010511cda2483faf01a2180c7ae9f7f49292e9387ab14d32d508dbd09f96ce19", - "b4cea8e154d1ff2ad45b03f0fb1b89ccba876ccc10b3c08dbf8c6699652eb569", - "b946238f16c51607272706e61483daad5499f133bfaf53316c47a99191bfaf82", - "c075393288623ee7f7a2454177f90796c83995be7733c4e40906c85301074424", - "77eb1c478b2217623240c6e79cf21ee4e31950ccfc43615cb8249207cbc8114a", - "5abfea32e64a2ba5cff079e65ce85d7f6db5c88012fe753f0bede85ea3bf0567", - "985b4987301a978d539f11be25ecc9963e4d29f09b2a22651f211f7ef40ca1b0", - "d4ac3821a1410b382587624909068776ed0f7fb36a07153b0bde4b3d4e53c44e", - "3a4d639aa6e8ca739359c681938698fb3b285f204da2827c881f7e895f9ccc21", - "a85ebf02880ff8673ffb6e7b0aaef0cdd17a870b483a53dac0f95a32484d389b", - "c2b1bee26e11da03252f24bb565316f9c408d140d9fc5b7eaf2ad5a418576c21", - "2115af7936a1495a930b60f3a3ea45cbafa21ef38bb30951e7279da3a6ed201b", - "bffac320676b0d457802ecd57deec8911cb047c427e03a1a978bc22cda0af598", - "d2798e660e181fed016d2e9b89a1bad3642cf38c3f5d9fe625a4269a8c938198", - "4d2bcfd9489638c6f21292f161cdf88017f8a6640b33e4ca9242cdc34f489657", - "0cf35ace9e810fc457dc86b5f7b9fd1fe6702827d74158dc2ecfc1cdd3fd8eb3", - "b360688096d9aca87c72426c1d15dd3f40e64477511be21d469803a01fb12c24", - "4119fa94847d7a7158447efd6814548750c42803eb8efd1b9f968f201dd3a77f", - "b2a6ca9b1c0435cef37f08ea27e9ab9f89db3af0929d4b8fd4cecebb20ba8057", - "18bfc296887e4d8878a453c48e7f67d8b6cbd12b9f5d8ba2418c2f5ae45ee2c5", - "0e2bf8cca82d1883cc9e82e8b82b94c13ea7daf2335b85a0dbcb067da36fa976", - "55899c042c4fe97aa194b4a73bb8509554c9dc4520b045321833ffeafd9167b5", - "befcf079561a7cbfcbed222c37b688212ae1fcc6caeed20a188a90fcb5a1854a", - "142aa90eb833dd1cf86b984ddb3df9b33b218126dfb0176499a47afcba626432", - "a2a4db6dab2b8f8d341cd67f1965782741d48accdb82d3b33abd154eb6b86d3c", - "4dc15ff8029dff084ebd3448e9f6f3dcbeeef7d81c5cacbc54c67125f8482502", - "18d1c7edab57bd8829d81b48eb963a7c3749ca84e96d03f3d32d4c262c1587a5", - "681fd0be1770d04136965aa66a0bb0cd203eb17505ec34520c629ebc4049de79", - "e1a67a74cdbf473a7252b7a400263e6b5bf0553aac311441737097a54291c2f0", - "509abba7ed16660f3234037fcd95edba139b7d3d131a2ea0567d225960606495", - "ed212a254cda7f301e933e856d9fad14e9467b329d3e0969551c3ef84d88905c", - "63a3fe857203673d437bfade504c518b17a33338b5ad22f54ce654c48df24cd0", - "cab93ba8e8697715629a36b382438fd02e60fd3901011b180d87e03a5319916b", - "b66e815a0258c6bb1b8cfd74714bfc7fbbefd7188444f1bbb7dbfaa60a85d035", - "0ff0497d4bdb9a38f6d5a7755e32ab9c0a055f39bad347e5e928dcdaed9a8108", - "d7adbc38576d5da01cd2c82cc09db7cb1050dd66413bceaf65cf3e4d671aacb4", - "c080b542a156662a5761f2738bdbdf53cec4a6b573b100d7a40ae75ef554a6ac", - "69bb9b628b7d5c06aa329fd653cf4ae26dc0317882b209e2702ce75ed8586ef6", - "4b742c1eebe776de5f595e9e1c54a892e29c9d6e3ede046d09c9cde2e90d6552", - "709af13ff317f15632a2627dfe5a7bd526f8c108d9a3a4562d8c20f7ac95b2a4", - "e6ed79d57a2304f4b343861acaa186fce3e92bc4249ccd94d49d240d62579941", - "94e642647b2dbd05a269119246c04b3742d84e17cb1e6a9ff19af580f38bb462", - "c7e34da04f53d4843566fdd08afab11e2e6e5f05f7b668b215e3cbec67dfd20f", - "7ff1bf2f6633ebf686a2b3f32d2edb33adf32bd08c261dad0d078c5f5b55e2e8", - "5a0a21903592f36508c32a5bc447fd5a04030a10e5ea56d1dd73f2bc174e6cf4", - "f792aa4c393be656930351d85f6839a1951e3ab190af0b3a3a35d14dcd8e3006", - "533875b6a938a4adab78d60a9854b47e4bd226ae082610f3e87246bdcf0a6dc2", - "b0fa3273283cf40c5cc7b503d93d4bf21dd046f96f45a98408c4ad5a65854832", - "8ded647b1e286342c40c351a1cf2788b2ac6f1a71a2fee8efa001f30fd6c4a10", - "c5562015f1046f0b26ccb6e72b7de174b0c98bcfe36f976b908c426064ee66bd", - "b8c3cf364acc6d41333cce7f3da721c6f6a561ffc071224d5eee453c1fe16237", - "5d0f60e214594b57e4d96c29f21886313b8639f39c2f2164f5af5d07c562ab6f", - "9a58f111d5346c9ac5e45f4b494b457327307c4a3d533a134f6cec1db3556982", - "4b253d7a6169eba8baf759fa1a2d8689761a736be4572e9f5ccee7573ac8a2ad", - "094e801e4ea645089e22627e39cd02bbf426fe4e39ab92318f4151bc6db1a414", - "0ccf395a6c06e622b768842c5e7e8ccbde02af5f129495354141a2c411d70851", - "4644e7d97602909da3def2e287cf1d2ff06a05de65a2813fc68914070d0c8a1a", - "6f8e15d3ab00fd28bfb9068194e3b78494368e9593f8b3a752c46a09a511427c", - "e5a2e60d7d21d2c099f71b30451ce560a6a6923d4e4c843f96c95e11d947a3e5", - "af1f7b638922717ed4faf50f90c3a11ccad60dffd8dbb3421fca79b936b41f49", - "7e380e9a53c9018879da55317b37608823ab863e093c67b18a5385ceb14a1409", - "e35727338995f7cf245b1edf21b493c494dcfd35788c266aea9e25d9866bf00d", - "8880bc3fa1a5c9017afdc04d1e6699448bce197282b6ce58c59c89d80f54e402", - "deb7595bf72cf45dc264d332bb402f2aeb6f5ea3f93a919d858ca478d6c3cad6", - "f1b9c7308338d47fced858a3887705132b3c2f6d21fa13bc012729248187dc09", - "022eeb1b1e1f5b8388027d2cfe3b68809bb7b1f2ac3a2c8fbf5db2e36f8054e2", - "4158b83c9b9d5db2b57dc711826c3917cd39580e4fe3d834349773c6a141064d", - "8d02c4acd1e72f8b7095e4f53833583533ef67f4882e4be943da44e50502a9d0", - "0884d82fbe7f8155b1c7285ba917a59bd2ab660a289f21807aa19f9a1985595c", - "f166ceff8ea53735f4032c2785478e7083c4742e99b5df3907929bf2ecb43770", - "cdaec22ab3a3986b9ca84cf4a68927a21bf3bd1393ad528db513a1b3fd6722f7", - "eb52a4fa1d68dff42787d730982d8f58e7038f7f4a3c8571ba92ab50d007d2db", - "57fefadcabeeae5e6bbc1e50a4783b706d399be76b2804fb6eec725c7b9134ca", - "65f590e07948ddbff92fec732ace6f3213650ea692059162a81d6a05721276bc", - "ffae48cb071472f9339440c30b91093058fec9ef8232b379d4389bf18974c826", - "8fccd60f6ecf0782aac37c5593bee83606f65c859b1802d56d48553a645397be", - "7c4eba911fd486c97939378117670a913f352ebc17e7789ec9157741ade38bd7", - "de85366adcce1556318916bad1b05e1f34860f14ebdd9eec597a7c6647203d04", - "5a058a0836104be9d4a67a59a02036069b4ba5548c53109e5e103d19ad6ca3ef", - "0e2bc57ce829f3cde826e7abb5df4a4a875294398ae7281fce25328dbc81cde9", - "0f3ac74ad6326ca31df21bbc41d11cbbd65332485851efc24d7080a632d8e53e", - "ef0c894ba89f6b50c98aec9f07cfca7c76ac4413bf33ecdbd9aae86196cef2b9", - "0592b0422f4c660aca1e96906e9c4d72e44c03dc904086b84e33369957f337fc", - "e715346947076332ae89c38ab569c0dba2138d56468b9de874e3dc016871a9e9", - "a069ba6951ba64a268dbd6ef99d4e05e2a0caa1f961bfe829a37dc8fc08dbfc1", - "a43ed9240fa55bb661410cad5c6567f3aa670719d02d1af98351eaa41148076d", - "a57be6d80ac52cf73b34663b35a75ef4c315e26e22cb56ba18cca4c6a84194d5", - "8d16ace2fdc5899e8e10773a22ab38ba8aad8ffbf740ae3100bfc7e5c1a973c5", - "227e86419c1bb659e03d7c7aa941f87fb7792024964192add5533abdd4759762", - "3f59193c675435b8c234443b297319ca6c0f7f05a003c954747091913594cd00", - "13f0e28365f7fba23d695f3118ae4b5b58c344cf657294dfeb36832d81bf309b", - "7d5e41b78129f8d6bd85772a03514886349f60f1a428913ce238c5effb9e0333", - "aafd9017309fac78935a69a2ab4c4e73d19f85432e2f69d7cd7d24775a165a21", - "29277e186f7b7e150dddd40378851ad8a175597f47402949988a8feaa298a8d5", - "8826676edd977824d573e64e67a301b7f756927971de336f76894248421acba3", - "08258aff629691683c1aa01dd4b458fda056e7009a16cb5518ca8527256315de", - "277f48c2cd385af6b53fd57a050cb2a8d727105285626f18b8c5db1ee9c25254", - "d6e093a917ea22dd8faca26d4176ac4ba38a477cee83b8dc56ead25bbd99edc0", - "29694a8ee69c10739e8ec6f8dd85dee983d5d1af8d2100056673b569f251b39b", - "cbe69a8c5238789b3ef8a4c270b4b6d4c7abb0fa1614693ad454d66dce994c30", - "414572d583b4cd90f8057aedbd857c9a4ea85dbbd3b7bf9460bb22601f917290", - "c7c29e4cf025631b6e69e317bb0485d99037cdf5e1eb84f71e67463118a315ec", - "ac8573c0b31bd6d0169f1c8b9324d377e7146744ad0e98c237d376c1f068eaf5", - "5e2b10f74f0feaa1977d6ece22878f07693c288949f318e8cb71d9e528d6b6cb", - "afad31dc2bf3c56093c700cc893048634353449b169e2704fcb195780fedb978", - "d50c46a54b3296d5fef7c8d55a515ab141f5c8579a05e3a7d724f2d6624138a2", - "4a979590dba9b64e983ae7a054c089bf2ad858b45e7c3646eaab5ecf31eea3ca", - "32e366e24c3e15fe8bbdbac3fd8c282692c4d1ac6db1ff1457f9f232f44bbfc9", - "b789572090093990416b4458505bd4566ee68b2da69f60adf97955f2ff4ddfa9", - "3a59d722124b9a5e4f7484447f1b019e6f0295ed878f66a4656a54887ee4bc3f", - "d29905d82c1163b9491f00139365966085345ffbb359cc17958fd53857493da4", - "4194a674a39c915e14b59a265f838f8f86d21a5f2fe5caf6ead5e5183b412e07", - "63dccbd70a52331dc5639e35c2706a824db662b65716d1f15553e7f6a60f7e8c", - "22068e8e640e069a6cb9dc0cf2ba1565e277c8cd316d6fbcb255f07f41b3cfb9", - "016179b633fa819bdcf5a9847cb9cd2d30be7675a48c40a2040812bf5b2ed0a4", - "27eed2b7a568e5d32e4adcf0da3a64613581789e5aadf550d7438ff76c3db8e3", - "e2220cba427088d95dda15798b41150268f3c1477f09a6d5473e824109a98445", - "f0f1635f248e333c43580dfc143451851f4bf8987cddd49609b35cd548d450bc", - "c2c469ec995080e4fdba31c31f7dda43ff9fa7d9a073a9171b564274b4b6fc80", - "24e05802b852c6d4c1a6ee291cdfa0074f95f3537c23fa777d3e0c831042eb4c", - "5f4982a7531c1004c0e86e11f9a5ca702e4a493f8a9ccde0c17241c184568639", - "2f2d9fad03d1bbe59642daeb5adb698a16a2355faa5658d612fb6cbe92bb2bf1", - "039528ee62fcbb12c54da27072a4b076716b434b0b82136147490d37098d05e1", - "38a983d85ced0e37e43509a83f8fda95b78daeaa965bd52a47680f89d3d39c01", - "a066a1166b7bf9fa15d88a0322660f1602eb2d7b2a1fef825aee92ced556c08a", - "16dc1067436f6ca5e3d13d715abffb93d2f1a394cde3a7b321fee3c2703306c4", - "7750dc391d8fef56201b7b7dc1d418ab37fc67d54b7e3a739761d0c402106ea3", - "3a7a10b3e801a8cae7f024920f83efc5c07a8237d140efc04dbcc4f539936493", - "d4317bfb9ca767b1bf364b5efd496f32d811b95be5100c471b8b64ee229700b7", - "54c03d6006c449a03fe59a7db6a89da2769bcf7e5dcdc04a8456632c46a8e83b", - "9b3b6006a87f73bc6db454b74a7816ab2554fd2a0069a5195199e490e6a6c60a", - "9f237a22109db4e67bea0823d3957d09c211eedaa325bc245764f2c9438bb579", - "eca7d4ccf2b770099c00bbf8e19a10f92d143ec27d770caeaffafc87f4c33411", - "4ee805bf7ea78cafebf3ae2d8dd56c0c376149cfffaadc14584c08bf84d9b380", - "b643ce51428af7422637ec7b60058899e81ba5f04a5a430bbe9cbceec75334c3", - "8bd014e154db8611502c66cf7069a659daba2ec8a5390623148f42fdfc4024ad", - "693d4b25b5b4ad3772757824b75afb99a511f980c89124104c5694f203633f4e", - "5d482a5db3431da83306c08e9c06d793796a50e85e0ccb5c30408fecec652c25", - "65211dae5c14117c0d88b6a3b7712ec256510c80f45664e3e1a590cdc9448f52", - "b1c0556ef03532549eb137c4af31c8c6092990e4014dc874134b524d65691ac2", - "fb6918c2e8db8291c14eb770c6219277cd38f752f8062f132054a098d78ea932", - "45950cdb5eed1e27377dba0a105e33fb3e7c8209e543a7741803d9bfe86b3e7a", - "b1d6c521fc761444b6502fceaefe48efc0660e866dbd1c6377af1f494001c3b5", - "d8d3ed2976744d81ad2ab8dea54226a0f949f8546ca405920efd2612ec40143c", - "ad6364bfed277de4c66ac889bc0ade68deeafea0639633640fde074f07ac791a", - "05ca714d354631d09090d797588c878e435f210138aae980ce2ed277b0926a4a", - "50858e082c07cf4229895c1bba2ac12be1890f6e5eb2ef422846282efc44b75e", - "d3a13d544c5ac8dc723e9a5a15549514f9f70e72d2efe7b9109a3dd432102d7d", - "b3f41a848387baf3f775bf56ec1c2688e33b13dc2029ef8a3560e534a74e3c67", - "25c063c6fb307826302939ffb029cd284cd5465aac5ddeb11d793c00ab006ae6", - "bf0d5abbba24d3fe81649beee4091a1034f9383cd8dcc609ad8704be2f6bd44d", - "d823b7d32d03c3f6ca65f56034312838d593101ed9a8fccd43a52753ac37a5bd", - "277da744fd57b314c6c14aa0da589de0b3856ac1d97340a74faee9092dd0c918", - "661a4e615700a71420b1efdc47c49d8541bbce92f067b2c8b05320e51b8db901", - "059ef32d768a7e9546b1dba9064285d0f57b3fcac2702d8a64e12ed055c2bd69", - "a1042cfd5e1305cc2d976b268471d4dce6316f9e7193d9165a65e8ff7078129a", - "65fa00fdf8925365ba2bb95f5b4d78fad212b5006b7ad270d6c585fe5e7c3814", - "fd78d6796819e1ff143590b6b38754dba73feb32f9549646add6391639ffac01", - "2a42167a91a656f2a3cf3f0e501a61c1e0d2bf1d5b4eb06c9256a44626218aa4", - "4d645f28dff45240e5183e0a12c6fb16c693ceecdfffb2a9e58646001facd970", - "edeb5ce57b97a802e5f9413815f71db49afe7c71f5d7f72803e4b2a759a0108e", - "aff6a03db39d8a70fec01c612c1ceb5709ac8b93dc7d9606a008c3e1ae0e1185", - "2a9bdfccbc3e1adb55ff7cf6f98368e211cd9d11869a34c211489892722f2193", - "697a596fbf6b477735686943fac1cc67a3f74fbcf19ecedfa71a979ed2b94c29", - "32f7777d225dfa48f06b27d5aace7ead4f4d71f0a4c7493154173225c1d2b557", - "324ad4fdee7dbb943e596b84b7f938aeea890348ad626cded320dce3dfc6f4ee", - "4bff70ae6675ed2670829ad2b16da86be503cc5b03306d63d54b640c153c8466", - "83cb4bc6668f72ec3e3c3641d946451918e54bdb0170d3ab80dbaf418b9afeec", - "455b651010a32ba2ae0daf63dcc59396770b66b1afa14d2163271742a2399e8c", - "f4e812fd7162321b534c36e816c0f899963aa7eb917e99a1b1a6db0d7ee089c9", - "be847be2bceb74e660daf96b3f0669d58f59dc9101715689a00ef864a5408f43", - "8bb35f18231078e6f97ef929a26e5f212976cbb77909d3e2b5248129e2a5a6f4", - "5aecb7d4e89169226450f4b11b2e22ef640ee60c7a0a5fb7884745bbc0c9107e", - "0e34153873ab677c4735d83a3d12802b936c9e7b43f89f9ee8902d9922cd0241", - "92fdc6e36ce740482e2f4650bc6f08e4f056207f251c67975e063112e89c0fe7", - "2d5906a70fbd98bfe303547163c3213590fdd31104e865f7071ab2268dd062da", - "16731c0e1d38c0c87d7880bea7cd33e7d7783e68e53420c066c852afe2dbfcbb", - "fef1161cd0cff50c2f9832aa2582ad09f6b27d17519a7028aa0da987837c7eb6", - "ac5cecb1bbfdfc4e502e737aae080af4deaabb3104c054141428f43020d69f23", - "aa3b296a5e41dd59589a8b86259c289b8ff7dce9bebd29a0c736dd28cddcac6a", - "02c3c626a759a693e3312c9733698664100f58eab72cc6e2f5e1fe0e48e7e4fb", - "27ec8b47a6856d392070000944ab1421f1f8d934993ada289b6cba1912069246", - "515d53cff7d80aaa19920f0e15a4ec3a4b9a9dbeebc9b8ede2759edfc50a5a63", - "3ef7b097793cf2be1f005c9b2fa9176be0a8481c3212270373290b773921206e", - "2604633c19d0e78f12e9e246d6ed9aefa59e81bc50471c69a93eed67d8304160", - "03ade754c5691f90bbf80c1100b91ed764f7bf2c2006ea5e94035e14c94909de", - "15a894277e32eeb85391ea531488b8cf1e3485e1fb30c5d1acaacb4e3a13b9ed", - "2013b6fa03c951d14c55c74c694ef2187f59eb839adc3b251c890c55d3df4361", - "f9350036c5463fa2dbdc5627cec5e1bde8ffdbe1d05f0c4bb97d5d0f82505298", - "7e6455b6196f6bb3a975a33175d1287ccd55da297e37b391db805b6ed483ebde", - "84e131cad940002a5da62e5936cf29dcdf4441ffc182cd6d1b011195e98dce0f", - "06f6f33c9d7a1aa08b76c7f3eb1c4240088a096b679eae6b6a351d91e7100695", - "087dd06b111e70d14444d5d942ae50abb834ad4078c64635bad6b587e52a073c", - "0a72eb7005bef7fa9ee4e026c57de200d52342372a35c46968d74ba60bcbf525", - "49291f6da905947bda6004d062a214ae4ff4a3d57a8dea784d1cad1fdc447278", - "0505c7edb3486d5a2f2e8426b5b0b262a0ee2c84a96acdcb53716bcb4e247911", - "785ea07eff67dd898843d0b9fd4df804e35130b2d0aa99f9238a789893a92f80", - "bf02589fd8b2356f0fbf8ee43458a5c0c1ba871f2363c76c92f44c8158818bd1", - "3f061779d1c6f8a09d68aa336f6790fc472437cc1000c1f224a64a503a766070", - "a0f47c4c931010861861bd87a1ec35f7fcb27f1a674351373e9db6f326bf3fe3", - "6cd4505df2af15fe2b36671cde2f5583e790e36f1086cf8949f4292185d290e4", - "5e472f5e22be780b662727ac9ecfe5a4c4ccd77fa3d7a87d46ba93fde567f59f", - "6897a5092c508458f662332860844958baf8833c98c54f16e3f9232a9d4b1913", - "26f5cb20f1006095cda209506e0df81f1f4d2e9c002c681525bf0d96e106c123", - "5bde9105017b91b3405f2923a4c63bca906779a7a6ca0bfc2ccc438f11ce959a", - "66f1fab6dfc1585bba264569e0c8f5e818aaf6d3559bf8807e2c358844bfd9f9", - "cd7091f72f98a5988fed5a4daf68b66cba9f6946e1bf1da0c63664d8619c9687", - "f6358c2ed5ca340d141192bf480113faae6003a9c3de39a96fa77cdb6178efdf", - "c585d192e7bf2b26e33c4dae11d08a1222446a3200bcb6fe60b61676a7738bad", - "58a947fb1fc73257aaacb7aed3d359bd8d80d093e76d50eafcf6b36e013a25d4", - "342e22a835debbc36912c30cdb22d0123b32f812f58e8dd5b1a576009ca0e6cf", - "5645c224c748fa7bf17d9d8a7df4177f37c338529098ef255337ba9e1ec5daf5", - "17be78a357d8d2e7475a6f0418350137b2833e796a63b01d9c0550272dac71f1", - "bb75ec391baad6c0faf55f9ea12f59114af64048f5054d16757266d3a00abd15", - "1d99174aca450f83b7c051f097efe8fa9db202a59446b58dd3cf42b78938c31c", - "4c4ad1227e8f5382b0c96378e27ef68e31521ca70f12ec4a4bcd6d6d11ee2f69", - "20438fef88676f8cb48d8496e1f4b7b74a32f59cf9d34deadc1081386aaabbab", - "b63632d3a1c4bad08a4e7e5ae3a206cd96a377050b721496182682bda69c8849", - "a2a620e54fa0ae7fcd1a25c7a793514563dfc6ec825c23f878bb3993705a2ee6", - "c41e0ee22e7ea73916cfb1b169d35863a30ab9b82713a44b6a1725930c45cc82", - "03f377da73e0509b17931a59dc94ad8023d1dcdca2220af24744b5190845edd4", - "2978033657a3251630a43fbbb29308e66cf199d249fdd0217f01ac1b13de7c22", - "493e22eedaa916f4a58ea609df7872b845fa67b3087d9a3e5eac237b211ecc44", - "2d71b63cb80ab4897d08ff0b1bef2260e57a0496020a5e1d1a9f7d8d4b914845", - "8cf17707820bba2efe97254d227c457b8fd7abce076962d3da3551fcdfb2acc9", - "d871546d34a09ced1d732db76671d1305e59ed945fbe0c4af266817fa72bb25d", - "e0e4cd12b7895f651db66f07c02725b082109ee2cfff83d2bd32d6d38f4f7a63", - "f680c1341b911397bdb53f626880fa09d439e84196cb854899771ca087a6982e", - "cf4298c85a54965d135aaae50daf5e7e2f1b873a36ac03cb34b021eac0e9e027", - "a07edadee809aaa201adf1b7f6f344e1751ea9f08456ee68fe45d4927fd6bca9", - "9aaf1173e8ed12fc0fe0c78e48b327cdb0a1ba8f539317d8b9aee6db235bec76", - "fdb31f4e60d51358020be3659ae26d16eadeab32129a7118266f40f4e6d35774", - "4b52bc34da5850aaa81fb4e9617d93dcdfdd8540d5c63c8a9c14358467bf573f", - "c68508589dc434d2a5a7ee31d732af3a41d8b296576d3f73ffe1af1584a8c337", - "a18e58c7fea4f1cf63fa288b6016ba5afff6e9442b5e08c1287a2e5e85c2e4eb", - "7e972ebfd91036eb839110f7b3cde693410a0d7f859ae58c8e69d48e3a14ba76", - "cb6f89b48ab59fe8f96f2aa4db2775f7ac744aba0bfedb29f6fc6b57c722460e", - "a9becd517164abe94baa8a13c2bfc525d16d05672ddf6256e2ac5844499b6fa6", - "07320db3e64d7190fe8dde4bd3de0d73cfd7c918c0c5b0aac70211b7671b174d", - "7fdaa19ee9d0a7a8a39b54fadefd8b15e7a846d2d875f15ecc87f9e916de07ed", - "034a7fa660c7d69660f69039d48432e27d28dc41185d51735d51a4f80e3b6f41", - "8ebb497631e2e30dff3194e8b705a423a5375d9a00de757dee13e6fbfe66de1a", - "0d48523b61e0bcd14372e37eb9cf4ac6b9b0f0a4580c15ef0335e0d09742b261", - "3299acbc36f7fbea941399a86f035edada16bdbd60168cb8bd3de5070014f15d", - "4ef76c96712238a1ef61604a7b2e7a0d3f52485cc9f245b79fb47b001d6d0321", - "18e32db584487f4ff3e017b4f4f1d2041d7ea639d50185e9773ec678b1f450b0", - "58393ba6628e171bed4f4313dad21585b099b73bbc11a5574f961311d95ffd08", - "bd58b355e51c536b139bbbcda968351c0daffce559677ae98d933ee3f2406eb3", - "d050eade5ac101ccdd58713a0f6f97bb75d956bc62f2ae95ab9ce2539393db15", - "85660b3f20a7c83a95a44e860fa1236d88cb5d91e37937b1e97df8d3eed356a1", - "f8688846598496a09faf599cc21d4ba97cc9976f69d2ad89417d38b63de8062f", - "9e1f3362ffaa05d19f96ec3577cd218f38a58264fe58e494661d55a50ccb7e9e", - "b32a1f03ffee17b60c05613818326bf5d580a3fe9179983bbf4d4a430a9fceab", - "18b1670648741c633f1ee5c78cda31628951ff0cb42b083f1c218816f2abb846", - "e8ed006be4fe8451f659d4809150bdaaa597fbd989d5100ab4ff8fa0690eb7cb", - "1527bc6f359224b05067b4e3383f4d584ad16f323be9069aff3c1fb6941b0746", - "c02bbdc1b925c82d13db6408c9ca41dc95a0159924054c7e389c26061fd5d7ef", - "de5c5f3415599c3ba3b1de4aa2b38797c48b53275723144fe98d68b7b25230ca", - "356ecc4661424f559582efa7fea163cf5ddaa2f06c2a0d8fa55cd079c084b7bf", - "896731b3d7b3b4c3d85103245c4c19c78d11e20c617a44ade898bab240f15804", - "2367988c4ba5757bb70ff0a2dd57c3670530ba9f646b8c9275b397abcdef6c3c", - "b23e2c86f9dd0f84ee64538d5fc2c74af0ecbc2f52ab4c5b318ce05af3ee5ce6", - "b266e85e549846b772cfaa1da5a67ab0a68f4955c143353f319a77a081a07899", - "7cd930ed31eda2fc59a66e92766253b35adb17159c4487d3d36e08c775c4065b", - "3fd5d24c3db979ed3ccec7b50a23131ee2b04506767dfb267f27b56d2d254720", - "45bf7d48d127854fdd2065a5fb69e335812cda87831227b7d23860f19053c8e3", - "a320013b0b2f360e0ef0a95124401d8d399dd80333db9d381b05a29a8bb0556c", - "85253889ea8d2ce86f3636e2299823b70609373a72077e12fbacd7e2118aaca3", - "e4ea0c390848dda8f8bf9903372a5c2681a6fe3f5ca3d10a5f381644dc900e77", - "416c8fdb8d839f9c73dbfa63627d15eb9cbf68ad30063b5236531095f2760e3f", - "c96e9d25f2f5eab2e587b18edc7b3620be5f80394462ab6edcc84b8d00a8db4f", - "3ce8c0c246ff22ad607f8584d63b14f1a12eb38e6bdf021a8727372fd100da8f", - "6b4dfdcdac19d31a5547be69f07071ffd3fcc2d36c09531fb7bade41cc0ac544", - "996c407733fb9c9be7d1a71f62456aad36d1ad3ed1d1b7882367e772b44fa552", - "daa9a8d43af38031a80f8b6dec0c96bc4375fd660719cd993c205e5d4ddcb928", - "6d4e07e8c295010792a9055d8ef9aeac93e09da6e4b238122fb9816c124e9744", - "f31683493a3555fb4fd0212ca6d3d6248e0f940f9e5d093eb00e62d807df8b23", - "6bb10a847d65915b2a91ae5f39174afdfdbd2d793ec65e603b8e41d26404a90f", - "5ef49abeeb4a53b26a23056a81f5905db8a1f5b517641a706b0e289b3a7e7a2f", - "d0a066d50ab22df7a6299e79f4f7b4545e064b1c6822b5c2e59cf2a3bed0cb87", - "f47b926f45a022449b628e067c4e365d35582aac783dc9ccb0e17c0ce0ea69d7", - "c07b5e503ba8e5fd11ce50d57c6910d5255ec8df390c79b6133209ac6e57dac0", - "a5e47dd6454378acfc8f1da7578715d43cdd155829ccfcd3cadb5c1aad2f5d36", - "48cba35740ac4c9b0a101a6771db333d2dcb7c8c66b3fe72a6c5bd90e27fe70f", - "ee2450ca4cc5492632a0bff553a1a87c58c8ea38d11d030c1c6efcbc3a46e547", - "aec12e181bc49e656e7f9b941e7ec78bd0c677e45e5cbb54707d3ad7fae1c61e", - "9d1b22e3cc6b8987d5a037b439518c3f4dc319dcb51c99736a05b180a3eef86a", - "e856f3d65feb3f1f8c65f646854d6c6acf7a2a2aa4e16adf26b35e2351459976", - "74aa43f56955f29c867d64e7e24c0cd0647dc26a419635dfb00d4cfc5d84f0fd", - "70be5fa0d117d653018ce7c55ac3331479e2aa58d259f63616977ff3a47d5075", - "50e53bffdeb92d26391dc96d352b45af6793f686a6b1d4eaf24154bcc3bc45b0", - "0c9c91083b9426be3ad44e1d992f55a7fde7220928ab803cff0098d753edabe1", - "fde174092214566397179cafe8ee58025c2cfd5d9dc87f14b1552fb9340a45f6", - "0884a7b954be50bd59282e9d3cbeacc0ec82a2e7b4dce50a12637ed24601ae86", - "5a7d53d75e87bc98b7fa786d798df2be3d29fce208f03c4c3cd90c767323b250", - "73c62f09cbffd914c4ab37657addb6827670388b3e3655f248efead959147be9", - "cc8de56cffef38976f76dfd5b85e7ed140f7c656eec64c1e78f104d1751e7d84", - "682ef65f22fc37032f2dd669943dbd4adec577e45cad45f590ade3e2da94e4bf", - "1d0e752ec65ebe93e3edb87a35c8cdab174262c55e9431f10c855ca2db71e2aa", - "a35ce9ccabb964bb12d61a6300d217877def55853cca22eb84e3d891a30f1603", - "691ce8de0ec1aa52a62d060cb9daf34cd36b66ca7b15a652154c855da7bd486d", - "f2764b818f2f9ea28030bb2bb7cf2214294fa527345cd5701399af44617d9902", - "33e985f299f135c2f5dc3e9a1b04f566409fa119a4dc51611d0c79e6541c661c", - "6d1ce3ac41107c9113d0c2a9eb2a22454f558d3441577c2d32d718ae85ec0448", - "ee7d6f10ac51204f0cb042a8b1ea39ee2eccf6e76b6cf759c675d5c6452af83e", - "452ad5822ab789ee78478a653482823f89617de10d4f7e53f87e4ba18556fd5c", - "4a94f43ce0bd6b987d37e2e8685c60d8c8d1ec86ebf1df2b6d29487674e5c63a", - "bf76ff4b23824df3add4bef81ef4b4afe44f07f679e5aa8b3a43d5f24d7c750b", - "5a70f8f9c958f9f4d3bf6efb0637ba54be2cb222c554f8e6ce2a510bb16112f8", - "ece1db38e9116433e81d6453bba3dc56bfdbff09da4ca3c85afb97795ed81431", - "5f9825d81e4c2aa4564a9da54d481105af1c8eafe25b92ef433be52636aecfcd", - "c5663fab15533c18293745ae682b940d2d0b25eb0d4cbd0fb2eb26f89605cd43", - "7282234da1d4fcea5d334bd497df615fed67d314a36e6507813a491d0c1b2b5c", - "727193030c42dcf8993b747fa543b4f8e51c5121f174cf540f4292a13935d464", - "62cedbe902567a75b73b317a63ad33abbe1d5e8c78c2b26e71f1cda9d574ac19", - "5ffe494047276d042bd051fe1e98510215a3ad74012d955955a36628df4bd978", - "c601bdfdc46b7b176b463e7070123e4ddc697466eaa8405846f51b380a674552", - "1da518e8e403c7b1e1918f643506148c5a9414c342ea02dd55e408c835e0c6bb", - "ed2ac253cbd7f35f06e85a7f8e636feea6cba2856f853b5546829bfbbaeafb65", - "39e5ac8d35d6a6bad73724a66b53bc9ad09530ab0f2cfb563f184bdddd2d6923", - "a9d421aaeb6879e561d57dd291f0c96e3de12b134fbd94a2e33083df9af9c791", - "8eea4136483c1f96fe4fdde278e292678888db9bb99b0fe1757121fef9678ba1", - "6dbfe91218d6cd652ad1335e34f007006bc8dd282fa7cf59df32de7f4991d062", - "a46bdbbc065f7374e4362ae134d3dc6f6e113e818748386b73bcd292dbdfbf05", - "0bf82c3c63caaf976db7389a3602be8366de7a2cb78c7733c04f1a768ca6e258", - "6f52ffc6e11fc5e91204d68c3df2b2393a225c5cfac799a70372b45aaa22575f", - "a92a43b24931d9bd3f39caac1592c7dfcb50be0a267837991a9d9ee3e9c108d0", - "28d4a69357aa6b0b29699b69c08fb1298d4fc8e7b7b38a1e9c597cf985054576", - "84b2938cb039414c9e017e9ecd437398610c6b38acb4427ca2e6ab910a3d9aa5", - "da56e18174d96a42b47d3d46020eccefaff1cc45c8ae21d0a3be9a807166729e", - "3e238c7a6bafcaea8d57b9c095446ab4b13f0cbbfa98f5bae7f43486e636f82c", - "eaa8a7255d165cb927e08ef95da13cc0302864fce19c19fffb519d24cb95bf92", - "32c3622d101d940ab69a38a9a318684a158138164bf9959b466aa0f42978bd70", - "c7f01a2f03544e61c1cfda24c7a874e6644d5448196b12e04c9d5cd7f96c9519", - "7baf9ba76b9bc7ca2985946d7cbeb2381fe4fbfcf71ee7ab692d125a76735014", - "85f568eba298f0959d54799deba8e9225aed600e44951e662fa7148a67df4f6f", - "3ede0d69f7f021cf7ae85791b6dae85a821be20a944d380a82821cc39c0469ec", - "9b1dbcb04b0408f1802f3aa2e4a5ec28527ba0221d037d51463e18f2eb231e8b", - "dcf3e254673aa7d41bd43bbc246a07ab609fd42cbea6203e3dbac2e9d991a176", - "dfc63fe7900c5164b583d4fcee142a6eef4b9d494ae840adcd11b77c563a6de9", - "f40214ba62b2e85a81a17020a92a3f22d6eb3f295bc7b38276726afe07b9e78d", - "84ac0fe741ae278b39b75997e0640a414ed349df5c5175b0439b36817055e7b8", - "c930c281d34013d18226fcd5ba3a10c1d6e23126ad3f111bc60b5bc3d6d504bd", - "99a9bbbe75f6f648413dbc6a94bbcae1e664b3b6b1f3caee4d854fd8d3fb37e0", - "c833c20b3f23a76d13c3a2e2220e060d14f314954813474d017dfe351b37f8a4", - "242e01a080e1a23613d50c584ab32a0860710520f9362b7fd8cf169ef3dfaf14", - "9991affc57033ef03c52e91928969c69fda6206a2271ffcec0b3f668b39df1b2", - "a9df718344b598ba21602c6bac48b0c99183417b89f1adcf370372177fa64d96", - "c6494c0131e9abccd01e8f401f18ca7fc6e15c98f902c7285ae5777c19902b0c", - "1265802313ceb7ca34e1fe506ec81d83c7a26067b768a3bc959571c77c97be37", - "3af9be6f7e09cd151d438299c10b2d044392d5aa7a62b0488495982a0539487e", - "e649e83add2dbef78a7d2693c4b4c5ebd7930110ef241c04cce3c127266a3986", - "96cf78e767658ce3a238d51c0c6f232bd1208dab98b5ec98cd38d3c9a9226232", - "4d0e5c2715860e4343bb79265c0b73ad186a71623c8b78443cdcc3899a000153", - "1a35dd3ea3131e34590297f436e3b6a679cbf53eae80b62fccda4bac0ca2e57b", - "3bf1765f9f9f423cfcbed1e620a1356501ca5a8090d2680af687d77eb419941c", - "6ac0c1657c165a9111abcb83354e1a4fec2da208a8920947cb5e5608a7cdd17d", - "6be7928d259135c89a21fcf445085eff3a2b9cafca8fe5d0643086f2a54a7e69", - "fb7ddf31632edc5e90634f598c778556d40b73ef46ef73f468db70d29b012eef", - "cff48a5ae57592314928533c112fac8a91f7c0c8a1f3b72366e7cd80d6df8e6e", - "82ab78e4f556a3eb3f5d2ad4b3e39e756fd0ee9e320146d993060c9e5fab7311", - "41e5b342b3781a1df8f55199fa9f3253ffc4ffc021ef86a0a8aee9ba9096ea3b", - "46c2c55cb91e2223bf6334b389b465a4c464f96025669adae600b653e7a2cfc8", - "47cd5cf0628db0265bc2fca142ff2ca475922f7655a7b6a829bfc9da995cdb72", - "3379a2d8613b83a52e3cc1391b298d9ff6c025f33ae6889853ef76ca12415c5c", - "6f532854457cdac9273c0c7943e485a5acc9ac04657d50172a609c534bc245b6", - "9d13997c0342739fe15823b0630b26e8a418940431158749032f915d244061c3", - "26489e4033986350ab625d2c52164252b97b417150c42f6143d8988c06b2eb41", - "d15b5577d3282c8dd30ca00748ea83f4e0fd0a459e1b37404d0df78f501d25ab", - "570f2b8c8e49c7bfaab2226a42d93aea493239f0ebf7704d743581246644422f", - "7d40a1699b13f79fd69082ec627505086911395f657890af1169bb35813cc724", - "5eae32c578b6be3fe034266d50c6c65067989eef3befc9bae04e5c5acaac542a", - "4beb9876c89bd087022e17f81f031d065df5fa8e3f8e1e64729c0ee51708a385", - "f299c5efb27cc7c2b12ce518439406b907de6a070abbb49caa89402bcc612865", - "44cafdfcc7f0d33ddda768f3dac33ddc524353447aaa024c288bbb4f3df9b174", - "5b04081584f70824efeb7ca35dc1badf5ee19f70b878d468c4a46a4b2acf158e", - "e04f186c69fa81a14750300edc73b98d8c8927c1b9727bb90ac7fd46a176d98d", - "f8c6307906688c2c0fbbea0bec2f995ba8109de6d223490726141214e62c9c98", - "86494e7fa309fb1d97533dd408c040c72a2164cf4d612ddf028f69014fec81b5", - "80a1ccccb99602c1b6422bd0188cd75f6a540cf105b64f08acf760086e9acb24", - "faf2bc3db3049d78d581db1e7d98ae9cceee54a14fdfc4da53f85d38e3df5c93", - "29643ff6a4519955d7de383e41aca054e86bf89c22fa3b743edd29ae9cade25a", - "c0c6e03973050808e5a681111aafe6b7bb8becd4d07de161d8a3a7988de2a0f1", - "c07ded9a5c661c1e53c5405d860712e67550672a463e022cb0c3b53aad73991e", - "6586e79b80970d204412f1d37ff8ddf6f0fe7ac3c63478b341c2f714f466b370", - "72ae0fc69f7616ee8edf3208538f29d355bd8f00aabd762686343eedc019f4e7", - "fb435367abdb815d9f142790a03a9193033605360e8091023be369e17f876201", - "94bfdac2109413bc8e0f4ce3ac113c27d82af6276e5790da0b902cc22fed7cd1", - "3a416fef1a993585b323e6b554c8d5bc80f88858a637d382f696d3b33b62ed9a", - "c65b511037063f7a725331c0c1e0048b406a5ac5d8fe9d5d4c6b511adc8faff1", - "0fc967f7e3a196f32aa4f38ff59d73ac5b554f63e4dcd73f97709cf622ad0ed6", - "9e10bd4d4e4f77f58bd7d696757575b5f8d78ef4325e7c29d5f16fdd23242f9d", - "b1a941ac7245910ae63f83dc633d352de13e27e3f349e955c017456c239898d2", - "a0bed97db36c5fe551703fb5500a9dd301857725b9731285b7cb9ad1f9c7da35", - "b2e981ab4b0f09272f38538108e3f67566ba78a83dfe0888580cf1b95f9b4b8d", - "ead768ab51a6cd35ab30a4a50234da3827b33614d4c64e645cdcc39fceb88847", - "b75870319a65690203d8e6a997f41876b1bec3a62ab9a5a508f70c534c72c3aa", - "e0e7501238ba210f4306302b7dd7552ed87d38e5abc8455ef22e860a81c4bc35", - "ed2a7ef14139e59e727e15b94cd2d52b83c80597d2785296d75a979080e3853a", - "64fdb52c22813a71af4d1ca8a15d650b915e9ba4a324915a0b396086ea3f812e", - "1351c11a70805ccd9513f9c2e4a8da0f316bce8c2de62e93048f4f4078254a23", - "e0b00bfbf7dbb162f55bc3a99d7b736d594b58304e138d8b829c604318404b2d", - "ef6e69074b203b0a6eb080cf93f05743ab51af151a3c52decabcc5adfdb95bd8", - "2d6f0d44e19840e2244d29a082186398233f64f2ffc689def717a81455a38db1", - "3d8b93e8f9dc62937a5f16a102799e4fd66366830e2a1f32d3a71cfe0fd1f266", - "10bb0fe4fab57f45cf77b910231dcba86e7c7333b689c0c8c8e08532ca68f6c7", - "dec1164859a60d8d62af112a2badbbfe7f2fa9d71f22f45e83bd958cd5acb369", - "d5fe85756f2d37aa990c09ec53e1bcc2db54f8ae70faab2f001b7d55bfdfb4c6", - "d7ef5a2c84cc5e999fb64a924dafefee9bb43b465c6f746bc0db20fd65af1886", - "fe51e31bfe0c767e4ba7df93ae15b3c5bab35eb69c47dba729c06d1acf1641f9", - "aaa4aa2f3f0b4b2032a687a99fcfa2f9b7b98e71f81b1fbd03e1e5ab564f0a6d", - "19abac9eb69e54c3ec5bed426dc13df5fe6ce62df6da47352f84115c65a903c2", - "1efbcde5b4a6858731e35cd9e6f66c464a78d3dfb37fd2f603bfb44c0ac85498", - "6b56a5f3f674b1ebd95e49d0438b87f6328db03acfbcc0c3a95510540d890fef", - "2c18e3562b5c4f58d9ea2eb7b5b07bbe3c41be190dcc0710c0c41f84e2bccbf6", - "b3ba0e0303caa2497efe5582262aade63932612f22323158014576f3c226ef92", - "3cd39e9126bde2c71f1f75cda9b91348cd76c47f7a1eac6726e8a6e4fd5a7175", - "4adb008d466f6861ded784821e232b1c095b48d6dc73fce7066aabd49352e927", - "c9aa82ad1f6635fcbef74b5e52b616049932a9e7e9b212bc5e5415f862906866", - "41947605633bf0bedf8fae2052324f8afa9a777b5d5905ba9e9d8e90086cb27a", - "e1fa0de3dcb7172316e097b691a23583f64b589a1cbbe9154dae5d3fce41e789", - "81d8dd271b87e848c7df9e49925faea4011f4356ff1c43243723da229b3ade67", - "cf3dd75b3b9e22a562175d9958faee6cd944faed690e0f273a283460cd18ceeb", - "b4b678a5f26f811f1b2cc446e6942fbc086b529d6a74b1fc5c25e48ee2470200", - "0c858b4ce45ffea38c886114c438d02629a26466f8bf365d5fe55b6d4d84e229", - "b1752f3e535563bde9aba24e92e623f18f661cdba1134660140e23d9268e5c62", - "2c4d49660ed81458561a6c3cf30765d0e44b6148a8287e0bd3cfce7e669e77fb", - "cac4358cfd0765e5f329f5bd03b93cd7bffb04303b8872f0046e7444bd7d8284", - "ae7a74dbe19551b35a8d29439f45c6ee97d0b0aaa8e476b23e8685b889a845dc", - "293e170396b479a650993e1055979a7150f1fcf3402286263d5363b7ae38cdfb", - "14a033b45cd00220a3c3d168914b646907e243173737c9b12f9bb0df1229c806", - "b578fda8892830bf5b1f0e13abb5cff48d41d1588830fcfb0f95bfc2dd0a5138", - "27b832d3076a1e7f18d66395655eb4b2a37bb26bc20e310c4ee4953ceb0ae331", - "f87cc387c502ae068054bc2266949d87fe10975bfc11f6c6b61ebc452ec80c62", - "5a903f5358539a63500d344917a84c25f7dcf5b903eac1ee6de4c4e1140f2025", - "406d9d7846f0a27050cea31bdc25dae5ab961e53b452e2ce07b965480d124435", - "944fce13626271f1186fa25970542194cb932c865a3485514de05032193c54f5", - "09d72dce787d7b54dffd13b6d31cf11deedd96eddf8ed4a5c0c2130b3fdb91fd", - "994bf51477806d3a2cd63ddefa2d9a02ec3d487e5da11e3d29f97ccc139e9b85", - "8494822aa7173d692f4fddf784ab2f70d1aab325c2cd389601f55cabcf38a904", - "618ec3415ebdfd3b3eea6bb752502dff10559302ebd4cea8aaddd754c879554f", - "6a33346d14de66008389767fa02a8fd865a5df4f46a0eb509294c94e11d27d30", - "a6fafb3ee6d4aef2a36459a95ef196300ed1381e3d0ca6fd2fae0fc1cbb32ee2", - "9f123880caf409c0fb531291be851771f732b1910c72b10ef85030cae3ecaf33", - "74ff18ab484fe9d5feee5f1e046fa80716c1faee831d83fc670d35628d778dd6", - "33ad04cae70518dbb2b47a708f9442e2f0e1019d218f29e532daf1d6e6982c3d", - "646be32beb70f83e9b4692947b3caa21c82eb9b59b474cab8e52870a402f3ef7", - "e0b9f6a382e65c9f01bc91a85b91d611fecf4861b24f73e3ae3efba6efdbcc21", - "4c2619e6bbf71ef232503b18a6414241c7487bed852d70308d140c9fc38dea78", - "0c428e02d3d39bf23e21211ceae95b0bb241769dc6be9b5ce902b86788a8cfec", - "161bde392969eedfcf2873cbd0bc62445987b5c21d06a5ea5d5990fdc5572038", - "4987afe70ee8a684fe62ae23c5cb0fff46bb44791e81d3fd8075d4aa8a46d613", - "3d6f62da73ae00d20d1acbf9e568706a32831b707f1130a9eb15ccc532859442", - "501956e7f3faed22b9d1cde1a1d00bb0cba92900241a8910a7378d2f03e98d60", - "7cad668d16ffae943f5cbc29b29e24fd48405b603ba0569c115f57d78229219d", - "bc9c8bebf697b2b34d12644e1f3da7f10c0332116bb36e4c49695bcdbfa44993", - "1d2839ed2c8d50d99cbb3e0278337ab6715edabf592f8d1464f75b26656ddc80", - "c2ae27b9391e815b9f4f5c56d0e1a215a268e6fa7a2f6b129ad5fd6af518e9f7", - "027c2318bb0b6d9c364b9a9372606e710b1091a3a8349a9be810b11df34aac88", - "39bc344d4ea3bbad955392b4c96d8180e048942bd9513d1765ab12351d7bfea3", - "e000d53138cbe90fd5c5e8687ec3fc886b122464374092a0e2a3ce1eb1a73704", - "ebc93a76b0d8b1c460cd03082558437f5e2ac96b41ead824f3ac74a9e52ff5d8", - "ca341455d86c78b72ab599e798f4b8eb43de01d3029813e73b6260693a1ecbf1", - "31bb5617e852b0384f0bede55850e9eb07354ec44f666c9c96aea6453ff5cb31", - "a155d345f88f453893e5b1eb2a6e5a4df0f7d8269ccca96102b95312d6dd4421", - "4895d8a22fea541f646812c4ae8b8530531dd6bcf97827f3188534e0cd33340f", - "0e666fce31c8b3b04627922ead13feeadd0ad22ad0065e851f7ce5a2cb1cf084", - "fd1232c72ee21424ccc130e6b4ac9f4c1c266c3e2825d4df6ff471a9686db323", - "f0e4c09e3de738407e7931d953601913eeefcadbcdc9c045d1c302cb69ca9e49", - "96d91c3f90fdbc0140abbd5abdf22d441b2765d1e8cad8167550590cd7b9da2a", - "dae396d22719ae5a20ff96837750b4f19f98de37458feedff35aee4d39d79700", - "016f3164a9bc5159b2d56b7be9ae179ece68d5eb1fce18cd51b96c8132454ff6", - "c6267b98d14088f01dd29bd6d44a0ec50586f64fe4ffa28af1a84555e7ec81f9", - "951bec79cc582bbecff8147bb6f6bd2e9d7f80f64b62ce596b09c0b0d9dc81fe", - "7eeed0e76e1be965b9bb987c1cdd26f60b0adeeb85faa54b608a968bfbcc8531", - "c86a78846d10625e1f0344e16fb8709c21ab7237be5994e704a01d7f4e5ee31d", - "bd6ca52c6a50bbb0315143aea90a4788f157200ccaa990321de38f96eba3ab13", - "b6b3a3fdb2f20edf5438fbfd8f564f1e3954104a1d1ed40de67106e05670c7ee", - "7d7e55790bdd428bad73c74c982918ca5ac60f90cab3ad10a772f83ca1e4b169", - "59451baed51ad0c595a5d001a5a239cb7985c0fd80d31274e15ba9fabad153d9", - "df44c70dc1141534636d84f59cfe46583197c67bcfc04b0ebe0b5c3d6936c75f", - "2b9b32a741f3ed4e17fc85e5e0459b232ca08808382a1041767539eb83511647", - "994ed42f98c632a98c6aa6df7fdc8fa941dd52509197354e80563f25ad751ac6", - "026059544ede358f43311f536516eddbc0fcd8f337d9f433cdab69493c973ecd", - "2bd5c1931f86caed74df940923dfe5ffd0f6a9562359de7d1038874928ca385c", - "6cf83b4c15490eb3fedbf685d3ad2efa95b9c0b0c4a2cc90468390dd2f314557", - "986b4d778632b5a0a28ff4d6c1770e2b71479f91da46f71b5c7463888652e734", - "1173c977be00d212d959098082bd52bd3c26f9c7c5fd288f66f1a8cda7264014", - "6a8c423902ffdaa0c3c3c12bb75068520fe3a0974ee8d10afd020a3977305b0f", - "17e5d31a5edc7eec716c0ef1c77f840c2c8b532341d96c692119d1d5e1684a69", - "9ec35830aa974b2c071389e26d3cc4f461873426674246fb27f69a3b79d98561", - "54931e1350e15be4c4bd588c579d2099a3b856a29a2195cfc4f9c0e7bad87c9e", - "8b2c45516734c2d80a91c9782ceba0392d070ee9eee4d258f66777b5745a4f51", - "59438fe80c8de5343d2837e7fce25ac67c349af722c01e37f6c8cf74045e676b", - "0e7da750a907305d9c352cfcf41cc1bc77606a2838a6e0015d90139c66a649ef", - "c9c302775b800589794214de8617361caabb91f18dff591377e2a2d65ae00399", - "f2a697f2b59ae76a47739f82a9729f15543a0dbe219d9c10216ca04949805d17", - "c20d8eb656c2ad9748e0744e70b42c9c0e0d92f5b3175bdcb18b8a529fdffe14", - "d44308d64afd502b41d0011d80c5ff3c13e6b554d3bbc33049436b33bdde99e2", - "81c7ed8511532540917184c57df4fac3b8a295010a4a15d1d7d9f6afb2e64e0a", - "7418a51a9fc35943cbf8b2d7d13caf5a0f424f5d2b4cfc031650c753b47b22d9", - "c12f684b37ac1f58379d7c04e36597ea762c72d6ed3f6de770b602571e03dd52", - "e1239ba56639f6d4697c18d5e330325ac1fdff809f1a90bab3a26477ed15f400", - "26d58774193a92da91bf3caf9c38e034a60dfba8e72c2959b00b8fa7300be357", - "11752671e6a8f11c509d7b49be18c7dcb07b4b04ce30f4a1eba2fd3deb0ac113", - "f4cce3dc63ee035276f31f9d2824a653094afd3cb45996855e2b0d3f0c067366", - "3c7cceb6cc2dc43d7944eef7e0a3d847f281a934b3d12b1bd6810868b6cbd100", - "65a8088d26e3602beab4ca8e8174350559a26db4c153f7ce00cc59fb48e4ecd5", - "5d8a08b95ccb871e3dc320a2017f5c51131ac14c6ba5c58907cf4f226e165ed7", - "287cc5953902c6d3f3bcd373e8616c31c961f32c9dcf2a683e1cd15202a082cb", - "f3fd0788b4472d80bcaf7ce14012a579cccb5166c080b7dbcfcb2f9203da8c0a", - "5371a3dcd9e35a8fb1fbd1a894b0c2c846f2150403746df37f54a8017fe47e7c", - "646f1e42731b363608b01354c2967c903971c13d2962333d7ec0dfbef9a2a194", - "3b99a24ea3ff4e49c9cf8fa68775583fffc8ea8825fbe274183c01ee0c67b6e4", - "dcb2d69c2aee0cee0293f4f7c3804f6168b10477aec376e5c230d3cc3fae9b37", - "ad8ef1dfd60d38b9e478467e7de4bfd8bc4762c020e3d9c04383ada8c6feb767", - "2e0e1024b7ff4eae7d6c9df9816745d9838ac7dc0a277550605b30043aaa0166", - "5ac8a927bb380d7fa5ee4e75cf1f44d20f831fe1b0dae000cd35cda196b57d60", - "181cfc6b6a97749e6a9e077f45f9c44e8fb8a51383d5555af735002b3c74d830", - "1aeea79e3ea5591f31db034df07395d736c2abd4d96bef848091f05956ad5adb", - "517b2b7b23efff8651c3d68154b31a11056fdd8162ec28712d5d0a91d274843b", - "a9d066ee9c57dd36cae980a3ea2a1604f24b29eb9725db6b5b618bcf5e4e7f5a", - "1b594a6e467c67c3b15dd0d908b94c2bb79f0e5f11cb4696bb9eb5e5a2a61092", - "d74bf9a9f656f5af7148e6e280a2e53650172d65eeb567a13a053d8ab2b632de", - "ebc10848ea027be773d40ea2a97680b478f1d1f41014db582010e9830bf360ba", - "aa041b9610cd4eaf725c2a54992b3ef29ae1ff69f1c637ac61b97c83b77f387c", - "c7d5de1eaa18a8a07574da4166c28b570050101449d323dc9be12182e03967b0", - "16eeb4eaadf1015b841e809682f51aaa120d0dc40130750876c3af9d445b5741", - "ef5ab637884d7727ec2464ec7ce8d34e48b99c3f64cd1d4b58ed441a340af556", - "9fbc516b8e91dc3593854a3d23fb05487332589687222d0f9a5674e835a72a56", - "3ea0d58cf1e267141b3e13366202277fcadaef707bba331e6dc315e4a56abe72", - "788223ad086e53615ccbad1c04086f543de749587cc72f91c7bc084fa4b83281", - "c9cad3f28be308bd588694c522588d2edf2227d5f50d805b059d5f0ab10bafd2", - "7b38fe7dea596eda8f3d7c0ccbfbdefb2a97f73343355892f5e07486b95dc7a7", - "926928076e12417fd168eea86d423eb6d4f06d85be9f3480101991f8257985d5", - "290e9f40406bda366a6262a842335bab9917f7aabb3e1fd58e67c3383c8b8ba5", - "0bff30085eab2ba884db6cf66a216a9a12ee5be5b5b672a8afd5c12d4f6346d0", - "6498283ef77b14f5ae1d619a7f026c69b62f3c9cc67e895ba9741c1d806cd3bf", - "08f3c2bec4c17022f0fe3ab8e73bd6a41db4e32dd50f2f5c49f5f147e83d5d3e", - "70e68b4849715980d1d5c5aa2f894627456687e92629ee943573a0a2aa3a297b", - "cb59fa376fb75eafc89b2f8991e28c960118319f17db08975eefb647e9a43040", - "6187a46485d1ef23549ebff05f2b55f20547e63849990ba612a11b3ecf5c08d2", - "ce0a5fa2227e7b7e4a65d25a0e563614c73209c7982bc45aca59eb86e99698dc", - "f1f45fb5a9042953b135d55d54487fbcf4bc1533fe67003cefe388506bee7f8d", - "6f217a7285410f7ed5fd220aa4c8124502b33f926252bc29bab84e201cd5f805", - "a7fc60166caa67f0c18244e4cd81e72a5db353a69ab7be178d7d2a38c26d091e", - "c5fd8e477a69bda49b7c62e822d213c1753a0d4f8bc39794b75e668bafdf70c5", - "ca756a5cff5098c2d26e6c318fa0a494de8d0fb0bbab5c4d1f970931be751b13", - "2c35eb13ed20367997b1c6560def71911a96c3cd767765864c593d1970bce576", - "4b5e2961d09c5b4ef6ab775d16671b54854eb654049649ccc1431c1b714d0fef", - "af1a0ceeb5ff5ac1d60eba79ebdd1680bdaa043601ebcbc98872854e77eb7309", - "db2c820d2a6eac011fc50772fec01d717ac6564dae7d1cf7de4c30cca1846aa8", - "0eba7c325483e14acc05eea36d0bc072d09a0736f847941c70c06b04065baaf3", - "36b8314c2226ea2d15797fbcab6be12550bd3e1a468baa33000423fe26943885", - "7c6b23f65e694730ff0f3fe94cdbf22468dcdab6a238f9fe334f4e403662487a", - "e98236523f8be49fc1b5be896b23ba50a27876810056463f1bc9368912828bda", - "6ce2622d8efd29887a6c903c470acd3531625096fd422c19c8d092df45492d9c", - "97863493426650d769c4272da586dd4415739903bac76a91205e977e79ab5ab3", - "54f9308ab1072f1b76214bcb4909e85d28814fc047f04de69626137ac81724c3", - "30704deb9bca64b89debd86d581bf67399ef2d8bbfbed4473b4d0f6f2859b91e", - "6470bed8e92e1fc8c7a15b51e2170fb59da7a9d639431c011cee4f037ef68002", - "74a2c0ce8e5f55c3198c5f97c2118abfb012f71557f91ad28297e3b15fbfc13d", - "003363d0921c25f913ba38ffec7df02271de97daf168b977a4400f97eed09371", - "c3347a12f764229b59a8207e7a71f2cb2b17aea37bed868243546e96e46356b6", - "24c283cff697d253087485710386deb914a3226e1b8935deb928640ec4b6f442", - "c1da72679c7e8d98b6ce5fbcff15278b7a29dc14a5cb7542b9e26e9c1447fc59", - "bcab47752eb87b94a52237dae9a820c0cc7671579fd88b4c7be8f2856887ea63", - "f81ab6ad1e9f2ea1fc8925b710b0a123f4dbf70ef32df9e7a794a5234d9e0b91", - "1c9209753d99822778dc3446deb913ad9b8f4874fcbcecdd06f2df4dee1bb93c", - "049ae00ac4cf38b5bc338efe1659ab97d3833c72dede79b7208b2a3370e6ae77", - "88c738a01fec6bfb0d433944bce8ec1641fe9c6ef28d58a59648b68a4bff0254", - "9b537977e0fcfd12783f398782337f64b2424a8ef72fc3823f3a7f3bab9cd71a", - "64dd82bac99a2fa317b12210cb12db2d57f6e767a4b03150e64cc9f86f818110", - "ac9cfcb99ce3115c6a18d58a4257b652e1ec13420b1a25f5b653506529976961", - "0d07041293d516446cbab96d13af543cf50455112a47320ac4c2aca9c9e609a5", - "f1577321fa37615aa1c697e6149bea897be8d0524223c8831c17e3b850b0766a", - "61858d6fd4607583c39b97813d27aff1b429c20c9eca863992e6ff84d15eaad7", - "b650bf234ab57a3f292d79c5a7fa210897abfd8f046b571163c8a876ab2326fe", - "fd1a1ee7bdc8c16a8b9cda39a506d9e5d8d0c9bc2e906248dde218e46d49c63a", - "755612630d9c18b3c134000f0b0da1287aa9eb2f520d9698698b0505c0077c5a", - "11b84ae79a5be7847cc5473c92e3fed1e8b0cf0ae9973288a1f453ec93494f83", - "3bb12ae572088497bec7e51d6988c8b918e90f1a5215170cf5f0612526e41822", - "83a09eccad488a39d0ee93209b3a97dc9d2f14e1d6740b82e4d818d4106d70d4", - "adf72fdf60a8cd76291c0af159fad2466a1d00bcdda3fbe6554720735dd2a200", - "09a399ab021bc374667161d31eb8eece5dde4b74da4030f48e7eeaabf45d2c88", - "709e981333bbb9da91ed5e463dc132d6b7bfd64cb9e779f7d3663068f399f4b5", - "80d69252c5a3ef6a1f0d5e2e3a955f98eaa3d942c30f62ddc5593985f098ba9a", - "11fb8b7a90198da54ba6eaa7dfa004cc810bfba5be0e43986daca2d820e2be9f", - "66479fb16a0101c61c29d3d6a515878f626f81195479384dd90a0c22c50c2044", - "65cbbe8a866131b7fbfd255ed0880f51b9a340ab9f1d562c70c6f1c584d6f67b", - "d593f192258dfb0d63747bf1a6aa27cc5091771e8af6c04756b50233f84296a4", - "24b1ddb6ac9c11253248d0c52eb0e7550f5b34c0f9c0eb1aca0e3542776b66c9", - "6c8381aafcc061425440ecefde83f5c017b90124a25b30edb8b11b8b18823ce1", - "6148ce1773eff770b49b5cc82849e5c9507894bad982803a852f82e8f87096d3", - "709ab920b91d9e08e1957b148c9699713d5d35dc85f313f72dc5463fb0075e6d", - "0b20e9b23cb6b2868350274ab6521b11ed0df90ff76a7a6eddfb03375ab6e504", - "3bb513a343a15a4c9f429652d6d01f7484bb2a3ee941908523709df7c021bc72", - "60c94d02ff9cd39bc4f698c9ababf9cdbbdd147f5b35ba1ff9fd1f0abfcf0144", - "5647b8a7050419afbaaf33b86596f1121abb2afdbc42acee0ba106ac750c8861", - "7df387121a7cff5f62a90d965fc4b9cdc7e217fa98dfafc25966b98123cfe37d", - "c28c647299fd32104ad8192b45b4fe6675de33fa39f903d262f51b04a2efd849", - "df6982856815c4593a9a4fafb6085283677dcd1421350708c5f7d915e7981e3e", - "c135af771c75372871d34affa3dcdf6855cefe46f0190933c51b3a6a32b7c9ac", - "f5fbfc25367a184de8678d9acccca86e49d6fdc23119b66f79bc6611ae52f8f4", - "b5473f661cc996230ad83bc14dc8c2ec430da4afc541d5cb70f0cc5143fb0a61", - "c8df8088d13d0885581120736afaad1860db1c26310e4050b0ef35781b76028b", - "9d1d5166e0c2838194a3dfb564a8c41ea023b5e34644b156deb78d0be753389b", - "715e003cc616629dcd39d10cc641479e39a0c5321f1a801d8c7525eda19e6f6c", - "aca6699754ff2b882c7019c987068001017eb6a4c6dfbefc795d4e00a8f46358", - "35d1965432c021132981fe4060b62f7930835433551b6644d7fb7500a90a85b0", - "597c53d24498ebb68d6296dd96f2efa77219b8785724cac52a3868f0b84ff14e", - "6ef1d1a9c55cfd0456c1e3d53755d5f43b52208df0672f85b431826b68ec6c46", - "6980c9ddb186f66fc982e7b08d40cfb84ceb3f836215f191e30f9e4f0cb89c62", - "1758ef711745f3344d602ef8df1f2654659e1b896cc913be10b7e3c0d1434d17", - "ab3428ac3725ebee3e17da771e02bb519667b06f169a03c06a68eefa766150f7", - "6c3d883bdbea9b6401f7ad48d4b82e0a3b55991c96fe20d0fe174626bde6b757", - "3bd861eaafc9c219437c0718c7c7746ef353548bcc3b48dc1070977811f0ed4a", - "b8c57f5b72314677df4d493571b7455276b4d5007926ae5651965ee5d7af5bbb", - "cab1b54b2d6498668372a0002c051d6fea8ca2d28768bef587090416fa781416", - "cdd19a1c3789edc94605443ae1decb9cf283d45c4f3f443c15139e775ee482fa", - "d5eb978ee2a6c14975f04aca307482e0d5d8457ec32703e242d843913d2f6b2f", - "a06412126ec2259c8ff78033c12ebd29ee20985b32e188c878d00898548c68a7", - "62dc173f0fdcbae955bd95441c313866182727915289c5086c3700bc4792cce3", - "3cbe50c2f4aa8aab602fdcb28c14eb36111103e47af3df959c3c6882e19ffa87", - "17cc6968b4f5777ab56ca500c6e25c2896c51b9fe0ab32b54df459c347fd3eff", - "b3cbe9641db1b2f5d10290580169e9bfc178f059533ae30be22b4adc8d1f56e9", - "29f93a7eaa843b976fae2e1cae4e1d268a44e87ec024219ed2a1f4127ec44bbc", - "b9c85a75bf5123b39e79d17e8f72425d4243b9dcb36a397d2004044a50d9b046", - "f7eee999c04e668d7fcde2a4f74b896aa2616ac41cf133b61a6081069a58f0f8", - "41291c49ca56f7d3762e5862da1d0d907f51d2dad4a87b4249ca3d3ed2c038fd", - "a91ea3f988ce13e5e532fe66a58cd7a88157ff2a181853d1cc79f07d5c1af1ac", - "971ddea36038e2f08747913acb34df7e5478cfba0f93dda05e0f3712214cc220", - "7affbf67684cacf4f8b0107b9c907119ac04826212c2b991e0afa9506a9230b9", - "bedd18322f09c175d8293c2b6b47eb43203e60ec97eb360547e2c6b2de7f9ef4", - "ce116cc9f70609705791a28d8da1cc02e41a89b488351b14599e58aebb08bd10", - "9aac3d3c8fa92259985641ae3f59910824affa3afbdb01d5d8d07e3d4a8b9f81", - "0ae323f1803d6503558d5ccf04f01992e30ce00bc1af3d72761e97957557e646", - "d5ce7047232f977f9ea9f76935add0b663741b712ff40eb0d2400e0ff4e3ad09", - "9e90813aa6f42f623782c89ad67b60f7f45b128b43f5a715ad5fb4bd4213fab1", - "4e075956fba2d22157ac10087ce0b03169ab671a3d191b1d02fb76b6d846c806", - "043eb19fffcf5de73ce7c2864424628b13eccf7fd3132bf9d6279b6c1981d167", - "107aa4d105e52f8f50bad1052a30c889cbdb6a27691c7f217109b092e56ad491", - "ba6d5c977caa0e9e0136d13e43394abb28f4e2cc5bfd70b9d5110643d25eafe4", - "2517e74c85d825d7daa8fe0ca71644c7e486d8c02f14480f13e39d0543092660", - "c143fb25bca2e7d1e9b4c9fedad2261ee4f048a8b2643d0b6fab334c66bc97c9", - "b4c073376101028455e05716d69f12f6b21e8a9200214e093d5459d3bf29ae44", - "491088371a49be918b543c71ecbf09a57423f3607bcc1ad297c8a9dc1ac8f1ea", - "c01e3d6aa1803bf1a8bd11e5840bb0dff5cb59d07459ec88721d9b2d26ffcdee", - "dc637816024b4cd3a9fab61c6d0f43bb95dcfaef2d85cb2dcd63efee3a6c9ea0", - "43f6a83b58a2834e68fffc01648243708b86bc4c5222d8906e6dd54c069efb8d", - "1d13975e8842c2162f0d15d7592239d5ddb2505b88aaaf6094bc77db5580abe8", - "e33aa6b16b25f51e0eec32ef6e8d670841f414a2ebc66dc8cb29d3cdf4267013", - "4286076b48433648aa32f646ab91505df24094c598052c26f10bef6db95bfe30", - "2458cc20caa5576721c77237e9161a0b3b550f93ba0a2931b987d07214e36c3e", - "220d57ede8c259ddbb201b280f3f0db41672c07733bb3b5f2b4b2970e25929cf", - "09c5761cb7c13b6ff1346d1ed07224b2e6e7a7244c74af75837a896a92c95e2d", - "ed09ca62a764e5627f998d068e4eb2ac1b13ab196f78392a148d1a92d6948da3", - "d6e46f7e5429e94b98ce0a89641cceb7dffcf2b133ec9647d0290d127e454328", - "897c51bccc581aec674e588525caffa7f26cda9200f0a31507ff1ec8bff750e0", - "9388fdf3f51411824917d6fbc49855db1476260cef6a1b149fb4049d45562a66", - "0b710d20a81d0831d622391438dfe95902b083c0940237273f7202a9deda17b2", - "2cd38a7cce5fafbfe919422b19d423d40cfcde7f784239fc6eea7333f393d7a0", - "587a3ecbdb2952ab17aae285f60d4ad6a64f95fa97dca9c1f0d5de64ac7f4fe7", - "91a14e227962c62d63a66346c88ff8083c68d7255e74bd94bdf022d292ea0f8c", - "f795944438c4186a0b4e322d6eb782c75c588907b847ad8fe221556f6a181cd9", - "630902b42571bd9fe18fcceac22d81c634a28a62130ca511b54b01a270e2f690", - "5a5f44a6b9e1e3dc434561ae853a4b007076a7b71bfde645b00fab1e4008fc6c", - "796a3917fa2b8555c3fb1dd0385b67ae79959e3b8f8f00f9386a44de969d274e", - "5719ab3fc8087fc2040e0151dbc3b9a4b9b7c63f779f77f28f15f1b387b848ed", - "71201c707ad54f9cbe746c8d010898af901f1d38198ebc1f0cfd1610ed9a9eae", - "a516c1c9d43daddf8212fbc1a9418b8d1a296c52456693e42ef0ff8a5b9c1006", - "734d5715007272b4a3b7bcb76f283dbb0ddecb120e5226f97a6489f6dfbb81f0", - "3dcaad8cdbd97f811fd3c05bbb81afe9171b3f5af2bd2ff0b6e43c6c1a37fe56", - "ebcee97229053b1491c0a213ddb59d44ef5db9968f650f32d9ad6598dd772c46", - "8a0ddac4476ea54fea46ed3d3172439e65c5b2770beb82025b2b63a5e52d77d3", - "0964b256dd9cc826fbde467a7bc18ab37829f4448d0ffe3fbb16d80040c0bc06", - "c0e961de1c63ed9c342aba8705269cbbff26df43769a272da2ad1fdf18d1ee6e", - "218b60e0f241c77482efe7fabbc088ac60972916f3e82354234188e3e1e9dd95", - "0f5eaa2b5b3f9f2116f6d6463762d11dc94b80c8ee6883119c3221b27cce02fb", - "6a8ac066e54ad2e4b5344040a3983642148c9d95dbbf95728e9b40f963bfd671", - "b7927c77f7bbf603842ed0e52c552829b5f8713424c19314de864904ab606c2a", - "a5e8707f2f943e29bfde2e30cb0b98e37b8a9e5d4e965a22ee4c78e772148044", - "4e774d635fe332b3415a7d28d25032cd1375fabdf417851aed320f23a512a7e6", - "7141cd9e2f5eddb7f7b11855f450912b35e8ba441b663718d9e9deb3faa384ec", - "b642807c7c2921a8cb6af3b7c1517e48001372f67b03eb26c73da6d80a3a1fca", - "2f28d23868423ffd8fb6005b6d23ebb3290cefd220e09edb32bf6218baaa34a9", - "a4693c20a8c53b18f1c740eb159ea7d1a3bdb6860d9b670898165fc83f0167a1", - "80c59a6383d84fd906b5e30790d34f2e2360ac67b11aebdfa547ce4c564368c6", - "fd034121483febdfb7705bb516ad94cc58e2d0a98d32146b026f244a8114c3a5", - "1407a52c68a1c34695570ea2a5b38535dcf25ef6908fa3d6a939065f84eaea49", - "60f8241e2111e298f40171db9cb4cfc7630cb95451b6126f6521baeb54dbc296", - "739043a8ff28f0f5a60ff3aa499e4ca330d37c424d0242f385beda774110b6cc", - "ab71fa517d78d72e3b7d8e56735f94a46c338f7c06e969159d0f8f6e3e60d203", - "822e4cc23f1a2ccb928b1cd774dd191375a72f748cc7a1534d5ad6f7a5f23ba2", - "dd2851a196fe11ff32fb6259698330fd720a342d172d232a865c64fed7a92dcc", - "f87f34621a4d020f1c24b86cb1d055789c1c38276d7bb7553c6fa860d7437cf6", - "fbb0e4e291749b9991acce004e9b0c5881098d9db396610922a9632b8fd633bd", - "b5ca8ddbdbb688afdd50a6132b15d63bf6a18c34a4545455a557b8ceae4d424f", - "76d9746ac5d80a2e49f6469408dd10a5b1c493d6fdfddba40169fd52427b728b", - "1cce79132eccddf8da06a12074690928af5727b24aae228d15a6ad4af672eaed", - "7d946ece8054583faa187276b32c19615709400b12465305d9d4543f04d2f01f", - "63c8bf4d83461efea01011113e6d161bec1a14cc9cd4245bef84a2d7aa6d9845", - "711344067a443d8d099dca2bdfaec70558884c6e4f6361f912d96a36b50ef097", - "dadfe2ae717573ee38d52782be2f645f8e1903c122495e846c622dcac958dab1", - "bf15118833db5c681f9bb897e1f9f8bddf7c3bb5b405fb8a755603ec88ba2c91", - "8cf073f16d39625c3e2d3976757142e660b3a1fdf769830db2f655ad3fbb4b03", - "26b515ae818cc9dda4b27f9fe4cd41563ad8f17cee67d50397ff2ec1b8f594e7", - "171869f0ce8db9ffc3d445a9bbf7c075ffea1b03eec93fd281aefed32c1227e5", - "e637f9a6d9c66a4aacb421a14b4867b4038a5ba46c468ecf818d3392b725e275", - "dc6a6aedbd4295f0fc863a1a149ab1a39647de134e51a70a2f3dc8721ea89cbc", - "38d414d4ee015c55c5165a3550e1093903e73d1a300664872e548183c4ea174b", - "c76895f58236aadf7137d3d5cc3e57f477faf5c4c4ab50ca986f2422a6c2a7a9", - "144bfcae046b1ae58dca4911b2b22d4de179a74cc0b6806104548a0b1f5e17fb", - "35a9693bc78a208106d41996ed805d41461e6f7c05605864e44b31e185ea3b22", - "5e2902e27054e34d89669e539772c26f8e0236c8dbfb47c55b264dba4042dc58", - "3958406528181ecd8c69a11401c05b0ce3bd1c72b9d677338edb294f2e89f0ff", - "b6d07391599946994f4653beb705481a08d7a774e7a6012bf62aedd816cb50b0", - "1f3cd50a29790d4f8931dc9d46d0f79fcd4557412b65d84bf90b5989d25cf0af", - "e23930edf159a6c513ceb0fd32ff8362954669a49060c17f9b4f3e9cac7d74f4", - "ebefb31b54e9ed278434eb6d1ddf6e74594fb241b68aeef2a30ae68d9b67d1d5", - "ad3c89411263570d5aa5348e73f7ad72f874671549f0898c807b1c08475974b6", - "b8b5c2c1de6bd0e778b2966e8c93a5b5429977ff8f3165ea920112c384f06195", - "08ce6c9942f4a239b60e8c3a34d3373ae77c7465f66f078590d338893d7d571b", - "02bfcda7568d8329e681b5e2acd4422df94b56437a5cc8796194246da8334c58", - "b54adf28e0b8547ef6a030e67e7d9c6a63f60debf89dc6f8d9ef71e0e10318b0", - "301d03317c4b0df48b6c58e3840b4d25ace16ee9e136349c669fd076ba6b1527", - "c4fabc08a7fd779d83bc6986ffe90fc29736882479f522df080de2c98e890e67", - "37959bc8101821db63017bda192168be64518d73407e9c92450b2964fd9f8f93", - "6e47aa7170a55597f25057a412c595d28eb351eb204a6bb4a35b974c1805001c", - "67824aa6c2a5c807664b7fa46ad808e114612256efc70a97e6da64546aa7fd8e", - "3f619ef4e5b6f0174c5c11237c3b297508fc337507becf150c84c78c13a82be2", - "dcc0f4ace41cb4c62599548b2cf589c672b5c8b6d296782b9150367bef0cd3c2", - "0bbbc53f187afbda526ac8ab5bacc173bc9322d638582e5746218d3253898451", - "7d239fce3302d7f2b562579ea3529f895690fa27d9d8e1cd944072e4dbfeca27", - "2bc6155ff72be32ab87b333610233af272e3420624a7ab8074496f626944c6f6", - "9ced145f4e070cc5e2ee1afc7ec633398ac64a2d06b5d88ba4e0e90807aa969d", - "2836e92fdbe71b6802235288d8c3d49c715abf4d854185af72911ab3309e35d5", - "a0985011d5f19674332c62405d4b7fa5b1a37fe578c6f7570e73dea0faa09c39", - "18fe3a73d6bd479611575f7cbcbda50d8687b22a1175c03b278a4f5e70e2ef9f", - "7875eb35f5262cd3f452fb6b6b69ab81c0ca5aeb67488050e6df2fd4afab9483", - "e1af172cecb9253e90e71da4f1236db7f49ae1d90756a83749585c9707aed006", - "0575f463464ad72809177b195fd45df1b9c5d878b4ac8bcc77412aa90b1e4e2a", - "971f1da0203e4cf66c3ac122a9d759dcae15ad1493ef143e8fd66c8220a754b9", - "1ece95220ef39d871435f83b31c31655cc2c26dc13cbc8d074e402415a21f02f", - "4d1e9e6e2e753beeb3c2631db03757534ed2f375b89777a27f87d917841a6142", - "b41b6a90cb2ffd045a2dd0e5ced448dfbbd969298d4ac66b6359a04ce36e7378", - "7c861fd59996db98ed42916ed00feedfdd46b10882d2f45a383f1968e35478a7", - "fd6b61267d37c6dd2c48150a4d878b1ee6c3f57e4689ee4b82437cca7f534141", - "5f4b8e966381be2a832d1ae1fc50c41ffa804aa391e2a57d8c8f00ce5eb5ea3c", - "28db6186da8fc8c59fab33a9d1b61e5f3b1f5d88a85142af427fc62636b8df57", - "edc8c936966648f0ead43fb86eddfd996bd59fd02043d49bb02175b3c51e9447", - "484b734905a73077962db7f182429fcda567656ad3cec08bff232474a6c4284c", - "3a719f5620be4f5b48525f9e3f9f8d398e7b838fd0990afd759bacb35fd3c121", - "6efa3ed4b0085bb3a2befb515f109221c30525ab9de0e1ad6af0883e72475085", - "5f7e7bf28744a5b17d5c92c09f2d9031d104da004ae9f0860ca17d5f77e1ab18", - "0fb35d202047e91ede202b2efbea592cfa10b2a14310f51cfd0a42ff508eb306", - "fc5ec69db92ecc55d4456ed0e1ff62d93b3d88be3ab992d51c5228748f991f60", - "054e5443981901aa3483ee638d5b0cb87aadee2b5d3cef2e53755a5d2d8712d6", - "528b27ce3062f7e9ba3c404ede0ee6b45f929b5a68ad9b356c2a5ad31338dfa7", - "623e9c226f4a035a7f93c2e4ffb5fa06a6d0008ed154342f38f237feab9d60de", - "0e8a0d464d9caf85884c30392e8289ed67d3bc1a253e416419924d04de5e157b", - "fd2c1926e34c7de3c69c14534ec9eefdcc72228efe9def4f0ad26ed4e3574a55", - "52e1e602aeec7d19e284216bcf131e70b489d57929d493d8722d695b186e400a", - "29b18e8d4eceaa1ae940d005b3df5fb34e91da9dfdae4c990804a3d29d35f5be", - "f47600fa2f9142b8e24e5758f87983a487c8fffebb937f6f7289540a747eff0a", - "31b23793dd3dc20fe9d0206a610176eb9136cc2cca8ec6c9d6c71ba35f851e4c", - "aa6520aae49f9282d158dcdff84994f1731124b6b3064f355a8911b9ce6dd6cb", - "4e3358a2fbdbb1f8a856e0a08b9268cc2c9bd0469ebd3fbc10928a375964d6bf", - "4900c602f6f37e21ce0d0276f3a4b521712b3ac5be22102f0ff9b11382643ffa", - "e4e7fb80899fc2f0892a3a2b10432cf2279e9717f59a5fd2abc8fc21398bd3d0", - "e518b04c19e6ca076fabb88e7d0c12088b0d0993f0e0ead9e1831a8a18d95e5b", - "46c499b248433fc8242dfd36edb6df5f516dddc96bbb2aee8bba6913d1d6dbf4", - "af3abc42b4edd6d17efcb731cfaa3cfbfdb05d15156775074a28f744a38e33db", - "a4e412744e52f72a07571f24d97622a5631f488b32c5fe4c8dc6dde76b8d2947", - "714c48c545ef968ca1990226583b9938b84f4a1270f3051a82f380c451148d8e", - "6a403528e6bc9f5a07538abb2780f66cb81ffe91aa1e31db91b50f17108f228b", - "237cb1a12e5c161c2ec922c968ee1ea325dec90330819d4e6644d2d34db2507d", - "2b811bafa4031554743aeb553021cb0f0ba69743891c1a7a2cc4b8fd634d1fd3", - "b4718bec7cf1246b6c422c5baaa98b1aa0457719723f5d98c46a0ff2321dd764", - "77f90327a4e74913ee42ec8127e95eb2f61af50f27f80bb63ef03bf69f869e41", - "2ddfb1673d8349cb101ac8006f7baa27e0c0a4a8aabf9986154585db11c503ee", - "7713f144c542eccbfe4b64e3fc9366a49822483acd318d25aa3d1546d0cdaa79", - "e2d5531156878c8918c75371a9dc2e17b2dd50c5fc290c637a14120df6bdd089", - "7702723ff77e1ec5459ebf90435c165e833037a67cc70013bbcccb1cadb99b35", - "aab87409dbdcb47686fb573c82f8880145ebf379f5fa087ab637dbf60ddbd833", - "490acebe5d29ecb0597c98b23366a010dfb17040f3ac5d0f8201ba66d758aadf", - "4e172f92e41daa8e7aa9b4b8c6709168947791f452d69d132dedb28a1db2ce35", - "3648ee4731702fdc1a3804248ec0b44ae00a23c2547b15db1821567f387e1423", - "6eb8bdf914dd56718c7a2cb0d3263d5f08d528badacc5814fb967ae296a19abc", - "24f251bcd563f880dc3eb357eefd4be26c270fe112130d1b9349d36d18e9a4b4", - "4dbce33f432e0913a81d208d5970c4833d49b0010a335858ed850de106b1dd02", - "42302d0925f506f49ed8edbdb1a7be425b540d0ef6f30519c89c223f9cb33146", - "61fdf0c51843ee3bf69aa1d75ea37f54ab4f6cbb01ffbfc18936efdf8f0e29f3", - "e708c1760940f51672b0e94370d80d2241bef039fbe76349b867af4e727ee662", - "dcd966ee05cb175f48f276079ac4b205801e7ca667bc89966b6fd6b2a7333f64", - "7d12531dda78fe72ae4d9aaba05c48597268d47327595687bd98a5c193e6bd54", - "a78ecad1b016240f6e9033d4a6d41ca2bbab2268fc9985f3732e983b16aa3e7b", - "1274d53e8021a5127b3d707362b6a96fb4997f26dbda2f29f892dd65d5bfebd4", - "6e8fe20830490370028bef1502eac3f153c195ced84c08e67c38b01fa6f3f96b", - "36a335b58d30347c9ca51f701e63cb1de7b4fe8baff804f09c2643a0434f7a6d", - "23d2818d3a49000850ab190db3ead3873224a4050b4e4d0d7bd7de95c42859bf", - "bb03d960cc76b330d04264e09953532bffe35ff03eada29631c7edc0de1c9e4d", - "4e27a68c0ecf6ba43e392f639b50a944c82487aa8fb5af6111e459eb04bb9c6e", - "0985da0cd41dccbf1c50c9d2221f733fcb174aedf71013349885733227bbe70b", - "841bf950bfb355ba243811b33f71b31114ae14c0623a73bebc916585b36e3343", - "4dc16186365a5d540e0e6d51fc71aba9a19f47b20a6f140a720d32a270f693b8", - "d4ee174d2acc73586b9dec78d1f6ad1f9ad84fd2cc8b7d6cbfd42e22cf7f0d58", - "3b7fb28fd64d3f1d29e806879f2741952d6e043ec7a013a1a3944efaee18e8fb", - "1eec9d7b059b4aa992bb246204c7a2df0ab57c43cf63c99f391c6e1bf62d05ab", - "baa67ab149683db76acd50baa28b8fa1e84bd0d7387ab5668cc1e0cba32cca70", - "9aadedf0b20ff46a7b83c5357707e2caffa16f8511f960f2d167ccd987abe65e", - "008a2c69ba9b3c1d789aaf1acb4f332673ece644a53b2262051a2d19d9cd3d9c", - "0ec670cb9f99a89dac484f6a01fea2bbb5368738d5be87bc8fc9708b5bca53f8", - "6a2a674040e276cb631ab88aa71d0cbf003b15c136b9ed6ca868c1aaff24436f", - "731d854c099664a20b045c538e110aeed1cb404a9f74b1583d180ccc32fb9348", - "4b637450544f81a777855b7c09eb041c9fa0f0004a2c92065801aa7e641539c0", - "f9a1cd5eaf140711d7feecb7e62475674424cbbc08c5918d90b72aae2b83786b", - "97d110d0ad8c2a9176e6e5b6f52e57077718d86cc525256487937593256258f9", - "88f1d924c8eefbd7f92aee7f88dceead85de3349c67a5736bb6c5f327a01ba33", - "256088b8d4beb4706e68856c8513fe38d7dee7aa763f4ffea76f6704fcb69574", - "26ae6015d3eb74f3f71ba2b598727a7fce46a56afea401e90776ecd6f3a732d6", - "dbffbe1352483b60977ccd72f88aed484269dc5f6cdf0629a3a22e3d81ab6650", - "c3fbec7b5c0d0c3f198ccb5a46d01400854d4ddfdcc71ac0be95d3eaf27c0241", - "1d4bbb44611f9575107c97356fcda78bf527cb2ceefd5eac580d7aa6e285a861", - "fa3661a25fd607458b7c5a85fb0d0ec3694ac48a0d801d5eff91b45427cf18b3", - "09b45ec0c800c678af9dcd3094836ee60ecec228e95ccae9970dde1ddcdbc118", - "f0cb72d30ab99659a24487a9f932d4c05b6fe7eaed73b5b9c137f8a8c543b5bb", - "45147897252dcfda1b96feac82468d39abc9ddc143a45794802c4b656d614ae5", - "0192aba94a07a96f969725c3e294b7e5129668b6e450d5f74174dd9f553a63b0", - "9d1ad9591e6cb4ae532d38de76ef16b9cd4cbaa87e38c517f603f83c274d6eb0", - "fccf45e6cea4509de60d8b3a1069fbec99096ff4f9515fe24d8f62c48d2bc96b", - "55801b1561e1d5f771aad4a6ec2582f9a176d4e033ebef7aac3068c4a36f9b02", - "929af86cbef9e28b7885b651d6f94d4bc8a5a9f5c2b0474e4de31c1108bb736b", - "372f68d47d67992433ddb957a8ff75bf8beadeaa820bd97791baa77c63e2f843", - "a90150685e64bfaa09144038b01e8b060dfe8e81cd2f748c7c896f80eb91c419", - "083c0e2bb86a0463ef8f5b2f3ae4c32087c3b34c38e8498c98e230d36c3d8411", - "dadf649365e39c9cde8ad5444d05c166b6f1182dee25ee9296929f47c4194dcb", - "2fc4e071e44d087214b7cb109bd4b6f95a6d72ef49f7afac64a2ad4a2a9bee1b", - "763abe631a9598e36e39518f663b6546b756026c3e984ec84dc6104aee046d8a", - "bb41849de359704b43c31625bdab332289eb410f9f37540c34ee7122fcafd152", - "668f71462ca68a55c365bfb9b64e0af9caab7eb114ae4d28321947b462692695", - "1b7cb78f881a52a5eeed7bf9b50650449209f2d566aa94d8a991b4b19cc7057f", - "19bc80bcf6e1dffc2a729318959b5a5e68306b8e4d5c251e62b171ce36f768ed", - "2105cb192b41fdd0587e36d866e26df0c46aced84c579c9dea1d0513536a7c9f", - "4333017d02d73948b91f5d1a20a269b2780376a9b7112375293364c605c1652b", - "292ff5d1a5df8af67e3b414c735d530ac67b1da39c88b193e7fa0f9b6722be0d", - "c0ee4d4ba59d2adf7bd31b6ed930525c6cb77f8e24cbb635a72f559ca98cb664", - "2e288bab4d557728b6b59fcfd4be47deed00a246fa90a139a5f2cd2d8c455409", - "2c8200c13aa5c5de51424a1fbf8c03632434b41a575fe1b978b7d3faeb0a0134", - "269c8f1190b44c80655d0e393fd5dcda559cf86128ce9738a661a1dc167ddf60", - "a1bfa8a1311cb78e17a9f449e9114679c9620b2d9afa430d666505c1f659d4a2", - "b8726f6ceda175ce3bc2365609608e8c7abe3af498da6747ce22226c5513acb3", - "21fc2c548b2f7b5b0a4c46df716fcbcdb06006d75c3a89385a32887a7146c020", - "9652865c71d295372b2e9d39d75460aff52293486ac01d590e684c39aee9e5ba", - "6c74ab2fa479820f43672af8d5c8d56515115e9975944f5922aec193d0d4c21e", - "e84a3e681cbcbb517f00b3272c9397014d7295fc65beaf8454e3e2fbfe1a0d1e", - "387010f3330bcadce3c3d75036456a4af0c930b4b6b80eba18d000bdff0f2c2f", - "f3705f3befdf96aeb8f40959ca802f9b685d6479c7d51df818f3389927e996d3", - "ed466671a01c2c505a92c0f15a6989c720736649724cc72e8a2fa28c29ff8779", - "180cec80de771898128214f28c6d3bcc88aa58eb3685c4c88be7cbfa39ab3115", - "247ec186f4987947685039b918e0493d19e56ea13f26cb03716742a5c9cc1a92", - "26fae7a16a1a378fff83baf1198b5a455cb5c7437c59080147d5a1e93ff088cc", - "3fad089682e70ab0d0431fb5438a003af90e64eeec6ef8d698233ecd1d85450d", - "ab19efef2eb5ddca12a8769c4ae98a2c70b97cf64ae148121577221b40074f93", - "425c3fee8a403345183682fe00be26be9606426aac0f9b4d80ace4987a946348", - "c0a7ea0b5189ed43349d75d60419bf770e316de15f4a7427eadc7186f4f11558", - "949791ae93cea0dd1684dff826f76c616d8b49ef566af10b335ebe6b47003169", - "056cf5fe87d1e79c7811c45e8cfd2bc61477f079a7c3149ab0adc57c9f0279c8", - "f29d385253499deb1e61a79c644c4018ad81d8191e9a0d64ffa4866b4af03323", - "99c578f4d2b57f46394211356063cbac36232ce3a35074841447233b0caea229", - "6165a2f7ef28894060375d6ca20489a1369c5ae74d8c9069dca951c23499dabb", - "e1503f82aa9f9af70fd9b07905673b0971fdee131be15159409eb29d958f20b2", - "e5b2b15a562335f61e5fa3b43492e0659a77eace4c77fd4db4daa0c2842df48c", - "06d674750e0a51dbc67676f3278c186c42791a9c55c8f23c0c12fcbb1375d64f", - "026f055f2b9153e5083e495c43c8826a53cf5376b4ba6393569305bde782ae0c", - "d2e46a5232d12ac5ceb1014fa2c4b931e260760e7138dd08190d9e1fd46955df", - "72dcc4d49b02f7dc73b54c3c3b4fef2d63f6a360e52d35b3bb097dae31337c5e", - "872074274ca8c5f22fe14d692141581167b0212fb092d10cc175a30247529fb8", - "e0e05e03d46e5447082b9cbd202dd6f356729c6aef0b35a7d67d939319d5b799", - "6375da4423dab0ce93b7b3fa627bc22e0d34efec96126a322a5ac3990b86d8da", - "a2135e29601c0338d92acf14c51d2604cc70b713f8263093d4910d0b4851fdc3", - "a62762167d687a2643b1e14e4386f4401de54d08f8b6a2436fcb1d52eb5cd628", - "80d4eb4184bdb2aded6d785bc4135b3d2c47720bc01563e43b50c8f34ef1e0cb", - "727d02232927dd87720c0b227f7aab1c129536abbc8e1c959521c1ab1f63156a", - "96e8025ce2eded44313b6979951f66a55b98df040e96b1727776cc348352852d", - "57f692380e8c5d36c18ac78bf14a18d08d64d1b8e594395c8f43467724024679", - "57695d32ee8a39a8ce34d405e2ecd7f1b8bfc98960a21c034179ffa2b6711b5d", - "1613175e3a22f74e9e13bb345155d761c3de678e4dee9d395d34353f03327d87", - "21bee227b663006ad8e3db399d3bf1acee6c631c9dce640a30a0f0bc91519153", - "748131d8b076d2de86f50bcf60837d8da01a653a14279f29ec55e9b3b9b10d22", - "5e71a707a618ab9f0d5f5e6f8ca0d31896ebd76c023a5718f4f80f09ca5a87d5", - "99f6d350204bfe4e44a1821862e47bbff71d5c5eee12658be965499ab4975555", - "dbe8620db3d0a509044b55440d66725b28d1b2d97b7037af1579aed66886ef91", - "19807271b347f85bcd0033c0d03ef343e85317ee48ed9cbc2295b7f10adbf601", - "f8602a7bbe5f1fc273e99a53cdc06977daf06041db46ddcdf162aefbc80dfc5b", - "ea1485dc5a331576534800d0eae60c5db29a0576ba7c566aa20a03d46c9ccd5e", - "966378074694ffa7e90c2d982c59297ee120858b8f84fba6fb38237ef6c2eaae", - "b979d2671f05992bc476dd3bd3a63ac55e7f5b0b495d47cbd4d09189014e5899", - "beee70f16431f91fef2e64f96b8a2ff10be0fc1ce13f32556c111cf628f4797d", - "35f2d2e5718541ee76e5417fb7fc5726abf047e9556de795e7734b0ed1bf401b", - "8da29fa8daadf58024f0eaf72bc70e1aeecb6b43d740371dd595d41c22c967d6", - "cc2c471517860e5e4e4fa1eb80efd44988e3efe896023e7733787afc1618e6ae", - "e15f747f75847e2fd35013f0201e2174921a1ee5d0f354aa01553c68a44c0a28", - "078085b0a32b29c1c67145f29ae60bb1d6896e18a63c7639c3c8d9b8f0e5a847", - "e400a8f1b0d0a29b0f2e302bcc2e344cd90b8078240843b3e4315bbfd35030cd", - "3317ebc00f028eb0877eda2ed41809102b61ec94376897daa737b67a84cd1e98", - "b122dcf905c1051030d0759f822c28a9c0bd83ce6b3610750faf76cc64f9cd45", - "f8c4eb441c171d504e64b46fe5fc4d312770a5323840f7f8a82bd4af1b0ebdea", - "4156726b3dc9fe8cd77e26cd84942fb0aa46b678c37898fa34034a51fdd72b5d", - "cfb602905160a688f76dcba6ab3439f8af7113fd8cbc9d0290e86d8fc3ec840b", - "b76590b9df2335286052d099c0bd0a59b4f8293393635fe8103e6bb5d5a6bad3", - "826df87b4ca5c99686df62bf371ff272cbb7ab99f1c5230ad409c9ec7e453b50", - "9ab1b8406b585cbdcda892168a0b122f0320c6b3a46211fa06c630e4ecbf63ca", - "6901e9a384c4bb0ca5ba2c54be535709d317bbb68634dc94b86a0b53960491ed", - "ed02f86ecff3bca0729965b32af0d6e749a0c41ac6ace64b3325f93b22c55360", - "1a42417f4149d152eb35d9e88e40498a4527ae00f6aab3912ca913d55bdee5f4", - "07e2020ad5e9911fed7c6e26b44f9cf5b8fa79f6d7e440645586b39ea9699a33", - "0ba74b0156826b9e1c02f330d5a39574d4d8b6ba9d97a6c621c102a78ebf3663", - "d61c7d48fd26ce312ad0e76729072d55d71665cd171a02015908fcab53f382ef", - "cf279892842d0eeda736aa78ad25ebda6114670063d526e1f67daf33d582c961", - "cbd70ceb73631ba0b05751134f7c1a88946d9af1870a21017806004a1204f343", - "43f15908cfffd1ab2032bbd357edd55be7ec0a4266572bafbd0c3182aec43929", - "886f9225ca26a7341f8b018b34ca82aa354d5a34b0ca24d6dd969cf3490afcf8", - "a094ff98fa1978879378d152c732a5bdd06a51ebeb93c035538add0b8131a311", - "c431f9839e4aa6ca3d9c6372fce48068b6fa87eedbc032c024027b30ee2fb48a", - "f279ec817da91418ba79cc21b7aa5376901c228a38109839a39eda4dd704ea1f", - "77bfb64f53ff14ca33f5c763a5cbca78e138f7f0a604135e7ce0c974861efb14", - "c47941c3f41cf0ba4502f721c44d34ed259997f6d6cfe0ac79d6a1ee61cb236d", - "cc70e199e0b0f775632ca4849c9741860083924afa832d5549a93db664f6df1b", - "ef5a950b1e381baed717557084762f24551f5836d45b908a3685c2c8039291d5", - "b7d522e8e3570d2b939b2a50d228e4722812d0bd97233c080b0943db5e992dbd", - "4465fc653e50302133fec0078f202ca4baf59adf38e00519d5cd1233103e83a9", - "55e6fd909b68e8af17496a62e78196ec272f3aba9ab31729b7cdeb6c4fc41fd5", - "e01d5231d6291a5bbef4e090cb8355387b67e79f90820a31751605b67f984638", - "20a0c7c61c950613ece77b1446de106c94eb8da714383c379ce2795c451b9016", - "d5685857f35e820253f28d73c2addf53ece353eb27c510f4b0023f0d528e1043", - "9e13b9bf730a9b7a66bf5d1859c9d8833e6e30600094277ce3987e49991fe882", - "7f3e5e77e0100ed9bec00274371e07cd2ea75a7e701565447450707ea892fc17", - "3314b2b9fa3f14371b45329985d24849ce5ba7a9e16ee436b9b8355e602cc517", - "b8c9e81093d1e999304c109fde8d039a87b924f059327f2daffb4b1ac883c40c", - "de63bf97e96cdf5feecde1407635958424a405090693d7e696555606fd928275", - "6f0139bd56a5ed03dc6469c10869393523fddfca9e581e89de31f001bffb8ea8", - "1899a76132d6957dc5aff10a862e8b87cf080cb4602273df9a7afe8ab9f3613d", - "0dbfbaf8622054d2f5a7baa66afd30a67edf553a20f953de153a523f8a051e7a", - "1f32521441aa34203867eca585f0d27d1c72e8522e927d014b60458c1b0af844", - "7f1d182ad7350f68490f032c4b5e9b7ace7a7b06fc55d6b8a678c701f3a03610", - "7eaaa1e8c388a2de03b7937542d337a7906b258a2bef411a814de3912ce6fc77", - "0b08d6779440812fe740fb572fa7de4a30b4b03449fac68ec3c82d2f43433e05", - "48350402d73c241a8351627ee5fade6b6187971ab4f60c837bbcd04acf3ba6fe", - "bf316dd14a10c89abdbd9fe9179aa0373ce23c4557b78816c04fb06049f8bb6a", - "ed4e82fd5f6852f10d6005655f1f1b8779eb3114096c5785550a370fed4d8353", - "baadf6644411866ef991a371ed4edfa2263472046fa8a741f16d476a5bb132ef", - "36755e0cd2c57a57fb996d2fd10b2245ef38571a9cfac57ca8fd7d3fae8d7b5c", - "e8219cbdba8714542ed29d24eee87264dd8c1bf1a23a49ec9218358d4a4890ec", - "7ca7a43c749bf366652154de2f15497b4ded2c55e39f42d40b007004ddf49c71", - "087d6e9ed195317d49dc4d2a1b6e0077776dd24029fdcd3533244d6f355d2279", - "b2e5934734dbf99081f936ec7a4c464051f804fc2199deca330867ef53bf6de9", - "d029946c0d2fd6b6f93f9148d61cf64da127fb162d8ea3fbceff5b4103fda6ab", - "480e729afdea526dd98ad489b4d1ed7f6660761caef6595222dd44f4e8b971c0", - "158e7d7559882fc98ccab5454ea1a9f383be711723d632f699ccc0d2cd6f22df", - "d77ab66d78df27ab1146bed3a4d988c626b53d61b197e9799c3d164920e5ed0e", - "7d5dd6e99b4c74be5734332ecf0dec9ed9d3ae0bc76abba708ec388691e2c491", - "d4ef15345035e3698fc19abfa6e9dc33ace910c44956b7111d3c5be2a7de3316", - "6e9835412e185664ca4827dd7fdba112daab2673c8980886d6e885036c4a4a48", - "baca42f46f865e0a110a31b8a013e12cdc99dae30a3a08b28dd46e64b01d02d6", - "56fe0761cea8238cba2e0d0ded8fe759dc470da3eb5faa8572cfe5b2ef4c7c91", - "d5658575e3323c3cb00b84fd774934a9e746b3c6b3acb7b7fd864067f2073f90", - "ce67f38968b870d041a26ffd44c4f01b7da4b824ea81a68bb664acccea1eee3a", - "b33f3409e95bc7c715f2064d7e5bce7fbe5173416ae2f223795d9d6ea09a6c31", - "465c54f8a2330edc1be972ba7b959fa9b1ebba3ed9dbf51d7b45931e58f9496d", - "d11a64e8e525d69b77c09baf87119cf3fced51b4e2fd85266804caf229e6fbab", - "042de5e5119f9499ff132213a8eeb01d2033ca5185e720f942ebbf8cae4ef4b0", - "b4b7377af9c16b1d77756fc20cd859384b2741e37866d6737b0e892ba3f84d68", - "8f0267dd779226f733aefd33ec54df2c4e1f02938a941d5252d9947aab93406e", - "81835223fb0afa49cd7c460be142d0a3cd1219de778545cea45ce67b95a07a25", - "27291855dce7bec8c093f5e2d77e3c2ca760ffb69fb9b9dfdb2e1e3a1d368b07", - "e69bd2bfb7eaf04849b474576af8f71147911a1e4697c7403efb439397983b57", - "ca70d2b01e8689fa73ad668d71853b3baf0abc61ebe9d54fa5284b28e76d4ac5", - "4d166ca2924552f39e3e87a2f9801ac88778729b0256c844120eefba5c76b6dd", - "63b224bb7dc11e610dd24c157d31e62c78f4a25121180d7435b8a59e63d80cca", - "93f2274ef5764e63f6a4fbd0c4f985195bc1d9e7088c1c54d32f240354c0a9a3", - "a7944d4bfdf63431f357253d82b4b97018b75b697118a1b53fba2fb76957c756", - "fbe2bc3edfeab0be92e462b7bbc575c48b9b428acb7df07e7799cadf966c2336", - "e60d9962f23aa17e8295326f5810c5003edfa9a0d035ec1886babf88fa9cf82b", - "5e0e05f433d06fd3df4833431eecd888693380c3d788f108b0d7188168ba111b", - "622b5a7d6e1f234afc16ec0b27c25ec3604b604935ce22d63eb5a367d5ca69f9", - "cd700ba5ab26b523ca290bb9365c30a58a63350546bda4b93887679ab6f5f886", - "dfcef9cdc3caee732c6d3fc50281b54cac876aabad7b7ac76baf9251eb8ba2ca", - "ce570692e7f42ea26e0c621c35c654a159e7f7dbdcfcfe3d5acc939c00643843", - "351154de8263279444328fb3c75d50a8e76900e1602a6f596cbc9b5923794f7a", - "2b6a1023f6980824ca9a075dc803389fd503bf6b81166703a6ea27e651f23922", - "a21a7872ccbea502efc8b2898fd1bebabf2bf2bdfca1ffad2146416179274e72", - "8555db59ec04d579673aa6127aed71cbf2eceae70d74d45b2937664a63062b7c", - "98f057b0c249c75b38cd2c5119aac24b3e79ded58f422ebb879d4442e9fb6875", - "15f674d2bfbe49ffb3b186a760256a7103367732b9a3bae0abaf076eee5a3946", - "a6cf4692c8175cb8b6562c71a8cac2298431985c6cd086d7b497c569d3f0683a", - "84a15ddbaeabe54809632b9b5e76b20157043bb1d241745f58bb35c2322fd520", - "93ffcebc124820c167114142887d027b17f236c871c7e173712b718790d8fb6d", - "cbdb3915fc0ab9dd345bd68012c3c75a5ffdc871c20a844276c29ff039403398", - "be99526a2faaad6fd0f9dc3a11b3d5bec21dfff7595ed170f6e37d075c75fcf3", - "55040854e7574d144f6c223823565675b6d473bf417454c255e0804bbdb60f42", - "9a8f14997fa85c61e5974a5b9e9a43d249bd5d7977fae502db64bca0671a745f", - "61020f373cc147f259944ed27126d40ce30e2bb4760e9b2e32399d85995bb8ff", - "2c973a0cfedb9ca809ecae2f42e61037fb4b61fbd910e23b7e821793d45bdf4c", - "a4a00b55be950a1802155966820b0d93edc346491017b3fc12de800b2a5cd6b0", - "d99d90d5fa4437f495b0cc23d59fedf5a3fa179f1f8db7c224996a7d28a75d2f", - "5c8ae9c2db49b0bef58aaab50cca5be8ebd09313d53da34650af03bc4c059243", - "6c55e1c619921c8e77505e1b2046f696b3858334d2cd6ac3406f6777e8982a68", - "f0a829bba15d4ad0c93b5f2980ca757718721cd15cc3df0fe97593d02515db1e", - "af0c58350fa2fc66a96b6f47cefb653a444edce5bb0b9d2deac0ca0e334ca835", - "4003b348bbad1aaa70683dfe97d84c71ffbf525eb1f43c3861d4d3061efe6550", - "52ecf775869f061cfe5333a55106c99c0f201283da290eaf32102b3b58cc5bfd", - "0b1bea81f19c57b01a7802322ca9be6510ac96be9619d71197a4287c2eebfb5a", - "10afddf1e39a61c33569e6085f57c4b7581103ef44ebecbc1bd620a9df51532c", - "84907547c94b1eb4bc203739ddacfad35040f656220c773c5aa7b68ae9cc27b8", - "f714ca18b611a44f9ba7e2915118f6e66938f877151b8a4d57bd7a5300b38a2c", - "29220b85a7d046fbb46ff3f6ad2dace6c36309de4323ab90e06ab248f6a9049c", - "8d4e8bda3fb27a5b459c6957985b18742d433be6eeb340b27cf672734779a39b", - "49c9dcdf303c9a5a467e03d49280b9ad9fd0016692f4a520c006f695e0b9a302", - "a528534a5bba11ed359be41d3f60d4f06391b09669403a65bc2116efd042b3b8", - "905f0c209dde0cc182b5e0be87304bd3954e063925a038dd32e10078bf8759fc", - "c3656dd8776c8672a3dc1b6fa523b521b2de21e26c54d8868c5becd27a7129e3", - "c30272dfd5a8f343850105de38142250b9f321970e8d8b295eaf7f0aad870e31", - "eca0f607508f688e0b87e4f9583140784187b6abdb44f54628b811d43e832d7e", - "f2678299da26980df304404cd086b6dbc9997ad74a0fd9cd7fa5e1066ffec3d0", - "6fb1a93daa67b09de5f6b0f37a29e679330f33a909d27fca48426073b3643902", - "62660244c0ce768650ac5ae73bb692a888caf4404c1ec2396ea61d5c0210ad2d", - "602139cce3ef24f57c19fc50843a5188f752c6f1f296dd047bf57813e9da851b", - "f5fcfe6dfde6e0382b3ee487949dbac7243b8c1130287cf54b01f1bca22b4714", - "b4a9a0ac75392126b9801829628638363af31f56c3f9075a261272e18066c69c", - "6bd052e6481f3052d4c9315565ca8f26f1d43cdacfa06f28c5b47e6babcbae76", - "1971b7fe08c78ea3f12f64a29f4f62f75403d8b640c5b316e1e203a879a26644", - "d63590b0942c2802d112a91ad0f2f02e255bea0b6583c938d3f1f03fe0633a84", - "55d99a80a86a003c0eb0fc8b75698e00ebdff0be32b21a1b82db0871b8b27afd", - "2ee030637d04136d91f4788cc2ca8f1f2f17ec8e2b196c78cd639a71e55b57a5", - "6da19922603b64a23ae4379cd029df23e44ed9130ad3d84e19b34f78e83dcd82", - "df731b61a329a655fbe8a3a93f0497a62f10b5477e13b363334678d30e349406", - "4c7c2ccbc2f20c8489b84b8737894a61defdba87fd3a68ce786d1ac994ee7ce6", - "efea9794fcdc031accd2cc1d5978f76bf8407077723d20833ca0a1f3142bfee3", - "4a00227f11d005ee5a337f07aee282a13325bb42b42a50b10132522e275a0dfb", - "ec7fff23ad8fd7a5d95083439d8c82727264b2e9cb5d821dc0bb00904a01016a", - "ea5c233065267472de65057e2835034ae1466c73b30f4ad197a27212500253ee", - "4e52f4da220c45ca91fd38a8eee21940029958eae460e63e7ba2f0e3d7395333", - "aaaa25d40084c87bfc1faf053b93702dda926f38287a647ca4d59ccf4055f7d0", - "dfcfca4d23b88a4f7f571b040fe691a06dd81687b03c741fd5628872f1ef27b6", - "06cfe5a9b1f174a81a914c89374cfecd636bd7a67f1c561b4f0842887be72f75", - "b216ef128c335a016ae86b83456e62a95ff09fb5c90436c24ceffe6538fbc0fd", - "d9ef7347cc5c63f471e8642be3bbb0aacd7a786955b08303016f7c60d38151b4", - "2a5472d5d39b975426509587c3a6cd92f718b53ac47e749c6827ded1ada16e4e", - "3674416fb9e503f351b9cd1a609eccc215cc513f0ed10a049256163b81e6178a", - "ba65532c2e56a2b0d108ad8cb3b86e26c51d62e49c41b1b39bf0be69556709f5", - "8ee78d23c3a260fc818223a710ab68d454756ae28bc7dfc98fb7841a2e9af3d9", - "9d9aae5620aa0bafffea2537e717f41fe23eb5cb3e3ec26c02440c1ad27d155d", - "9d2b7d1a7f010900c192ac70651c6038fda6b1d12b0aebe3f988c0a341393224", - "827b6ba6b84a978e12160584dcd784639f3e8b093c0da9a5b28ae590d9c77f6d", - "5211e246d5f1cd28ca7f830ec4258320297199a20d1b09e513ef1875232c6780", - "8f7f1d3e620eec07d5dd79ca20bd29dbaa032c0bde8d4fcf3ad16633b1ca9cc7", - "4fdee261d1d88394f951e5762ba14d8bc558d5ed1f6e9f66cdb5b2d014f8349c", - "3094a04cc3e3dc6487a1d37b46b13356b2afea0d5a731942ad638e970851e270", - "721229d8c44d85ebfe76a7ccdb9f798ad4af65162087ee0419d4c9db896be70c", - "4ae72e82a479d959d30cc3cefba274b56393f48cdebe0b4438f679ed47a4e836", - "16b7bc16ad60a5e8cdf66cb147dd35efc318d2b79e5c54a8f196b672af2784a6", - "0b3cb2d03b823004068d85b25066c25b8f88b88e0911cd1ed7b6a9960a1e0623", - "30824264ec84c380f5563d457a5d8d0734002f8d115f294b17ae42075753143b", - "1c1e7133f1b0ec201b7801c28edc76274853bfa559ac3bfc87a3b754105efc55", - "00594ad479985be18674b5dcec9f91bfa544db02b226fb8030d8e0382c430dd2", - "0fb1a330434e8dcc3f9052c9cbee99525c0bcb628696827357a834a24a134396", - "6adec1119f1c8367fae0b8275d91bc5b8f82ab666a0adce16c3254e02f795cc8", - "f275dc34838a9d85508f82a4e3f2e813861ed4b344b296b04fff524ef759d3f2", - "f50710addb9e562b1d0c7ffc020c1a2d136e9331b816390882b4a8ad5dbeac5f", - "9c8fa8fc19c8edaf9f0004ef89ec10573bf71a8b581a82412c8999bf806d1106", - "f6f6aa775be74fdb783f2c72aef37186abe5c6ad0b8ac75ef69332bf9cc109f2", - "b85708d556465890b50428ffd12384cace1298843eeb620932fd674c60d660e7", - "4ce649f940f9de80d068f5f330c91251a74c8e92b9d13f85fc9d79e39d53628e", - "dbbf779cb77ceb7eb49333a33fc3e573b7255f1a75333864094a2e895e285b4b", - "934528472c9ee053a720fae5e384c3e0013cb696b555b30237bc486c6670827e", - "6b5fbcea65889a5ff3593069ba027ece2cd446c663397f41d2ec1d355968f78c", - "e6b4e6e3907bc1844797a82160586163b66d9c2fead7e38ef9ac8f516681e428", - "f0780cb5c1c8eda14752a5ce8e38727d172d2eeaa7fabae113fb60f7d5735aff", - "1d2e82f5c0b6db51e979cb4b55805da0f1050ff61d4e15a7ebf5e4b1ffd36545", - "5dfd5ffe73497df823da8fa7ce33f318598148ccd7edb4960df666db02e681f2", - "8b2af88b80370901128596d8da5af2606584ab6d81b9aebbe3e49472a9c43258", - "040a11b6778532b996b4a1e24b8235e89f5e20058b4dffdc538db4b12c304029", - "51c38d5332e02ffe6e3dd1533fc13a53c456cd4323c58d7f995336613acd950c", - "cb387b691a1db249ba0e8afd8f674fc75502870f3946dc6e8f82d47ebad53636", - "d0cbffa8d4c8bfdfa6b73042a88491ebad9ccaf3beb6ec217bb8d162a337b6d9", - "2e7fccdfe9355f36c06f40fdce862f69ec79abc36a4166717ce78d8133a7b8b9", - "7d74ca5bab0afab9cc51434ce1a88e945801c320cc40df36ec4b4cfb3ff0bacd", - "38b6eafca9b91a091d149e8b8134edf5d5843601ef962646201b5cc65de314fb", - "c26d25a4ca9523a7019f3b4cb8322354259a105d720d9676a855fc7418fe6af7", - "51f6983659b6bdf00160a8f5a079d4075021e6df2a404ee6ff4b18fc5545fe2b", - "72d306a14d0c4f904dc50e3c7573366427757b6fcc16950ac7e1e71ad5af2a3f", - "03d2d0dd265e8310199efbf1fcdba0ee3f8929d2c570e52988ca87ac3abf0721", - "be72596225ce3f4ba54e49264ba1aa695014f971f231e0a91f4d7cbb4d71620c", - "785d7cbffb6ca0c5aba6fd7f9d759a73a592445dc173fa4987da2b70890b489b", - "cbb16b4b6fe28d199c17a4f3733f9546555119620ba244bbef78e2c5a8332c14", - "cb0902533db179f48748d80f3dd1eed96150053c2d273f13172ca31a45887333", - "ec89e354c85bf643f9205a4cd585a69d62862a2df31a4adcdf35b734987e196d", - "edf538d9675e94ca9ab0b0938364f6f3b45d7468c65d347a9b1a299a29f1f8ac", - "8b3b6968efd5f1419e6f3858ca6181795f309cf4a5d150e08f5ae6ca3e0256e2", - "5484f04175a6baa411456df9fdb9affd8ee8d92ca6ddc271f9ce9c351c31c755", - "c3f4259441c03edec7f41288fa3f1d4677717ff0c833c57a1dea01cbc075103b", - "d24cee9a8abe84e3cc68ca24f86b59578234390213bf6e85f10669da15b01473", - "e38005b724f03ac2faa2be0e5047afb0cc92f25dada7b6d8b30b849c63105161", - "7344586fa0429628540f7d3ab44bcf6b35b3af82341e1115c30b919b97b776a6", - "75b74d2f69933a19ff8be2fac0590035e3a746c13cb433fd73954e669ce38fbb", - "927197c37e9e8c93c0dc066fc3c5c3e58d185fa0a4fa7f8ef5afeecd6c5c0f52", - "ec8b0d4392db5975ab9def888984617d040df2f7e744a81f34d5fe0fb18443ff", - "4dcfb0970faa7a612d468d0ef93eadafba515bb99ea1a9c4601cd0c66d855208", - "8ee903cd6dd47751beedb828958473fc44b65ed50aecaa8766304a8dd3de68ef", - "ed99b2e24572c58b116497e4b38a3bdee130e5712a64850c7ed79057c8d33047", - "91bb0d593f5eb2bcb75e7f1e338cb104a608a11f62607878725b9483a52d0f82", - "7c7879d7a5a5f3462bc13b0d3731da6cd7a4b65748955ed7bd64374b9f0d6fd6", - "0d2245c6bc50f796bbe2f80e14855b581a9c7b8ab6efb5629bd329d9a97219c3", - "dda9022a53f6dfccf0c70664e1f4c34ecefb2e8ff980f9528331c8ec41cd0474", - "6460162d79580d97e9fdc5fc8c4dfbd2ae6de50e2e81da836e5e45c15fc0a93b", - "bc3e0234006b8df875023f89ef02b2439fcaea35110cb07e35ed95c2079348cd", - "fee7f55751dca342cb6ff9a7aef4702bcbcaebae1d7e257d7e8b1aeaec221df4", - "46485c1736e60f52778240835c84acf0aae2e403b70a15971e429cfcd81a7a3b", - "4ea2e4af6cd174cfde3dfc2353acd355e21edcb88dc6b7f907185fc8a2d40aa7", - "12a2cc30d31b89c3c1835d7a5d6f4e48378fea0cc7ae45ddb64c4900cd90b94c", - "32cdca2c4e5b30ef72a7c34b94882daa2cb3537e5d7e6d228956d1919c9e5764", - "f18c42c33f3086053fdd843a369d6f94da1ef4cb94e56734685ce3e8a83698af", - "54cd3200690dd69a552439b97d2c56285647226a6a2ee7e2610c3797953b5772", - "c6e3005c5fb46187418b262afb40cfa5c596f65aec88b7852aad1498f1c3041d", - "57dadf3a73f2dc7f20cd32a776fa0fc8cc212c126dd416dd285a407aa5f1fa50", - "3c16c9f158c6a9b4413d9f3603476789f188e9a0072579b6483fa255f7866500", - "44f0c2c5551c73072cde71cc765d5927c19711747258a67c138cbecf81fc9bbc", - "9cc59570d10a14d7736ed3d3e8e98a91abd40efa2827b1339abe14bd1a63eed0", - "4066baa9d6a6cfdf58ed418a79b96ced1c47c4a5382a493d7930cefc4fc6981b", - "07850e35a4b20ad12221fbc93731337df6d1118d43aa526b5bd7a1ee95734e54", - "1737c6facb3d51bad39fe12c2b09f8313a9e32def57172ce174943fde09c1aab", - "3b9cd16861856a5ec5597e0e4008465938829a3c56c0b560d5368f106230c67b", - "2ce29acc61ac753d9ec31ff9d5d817f491b08f1b77646513a2a94ee36d243963", - "78c492ac3da5970a3c31205fa6ea7104c482b30828f705939eafacd4d9aebd08", - "74386f2ff8433ca213ae6484de2e5c6400911fe1817ad45e5a8fcdb873cb5567", - "ccd1363f91ca48f87dfb8768424ff60a997dc722fb62b0f3c8e6ebcf55ad7081", - "5e9806b5884bd8ff05df317fd0acc4b06d576055562d6900119ae18125b1e499", - "2486a753fa3478c9aea81f3b6820b5cb4abc10ad49c84f40d6e0d9b97ca80d5f", - "6ac52dc2cecc1b4ebadbe150e4a6e1840aaaeef33d32b26a461a56a9024caea9", - "b93734ebb9261b20ac8c06982bf28ab854fe48f5f6d61fe3f3fe3ab521cabbce", - "8500654909ee52e54a8317d9638de9489c3ffdeef66b01d648711c4cebf5111b", - "bbacf5755fb5b82a6ceb8b6976b67342a08b3a3dc6d83956291b451aabef897c", - "00054245303714c9afe5b6ac038217d1e7db7779708d020bb30573ff105ea7a4", - "dcd0384b1c9f31c292850b8dee1cae0b1043a5e5b3781a8f860f25161b742921", - "309386e7254c30ce98191be01137a65e7ef843e6d516edce93709baab200aba7", - "05e25dd4470b17f6b4dad7f4efc4e8e4ef500aea82a9097473e7b91bc463a9cc", - "94c585e13880456df7e82f6d53475b5095bf2c2f928cc34792a5430e5fab2266", - "e7fd8a99c4e8b780e1761e6600d4a33fdf73a10b4c8cae5ce982f9b3ce702674", - "0895f8afd109f8d3ba03d6cdfcf6b83689c460be9dab005777f927a77dc07a4e", - "99ed49f01a668ee316db084fe803c3d6136267417a496a926e7644a64c25e120", - "a67cf17388bd5480cd36d54fa65e7f9b137d555a5eac57638b381fe1ca7ebeed", - "947b2b0ea38330a235797ba2a3177cac726c589dacdb417fa17a8cbff86c2b1b", - "5fc9d0071f840e42760d39cd328871b3324a600b07d10fa332a52c9efb495b2d", - "910a1a93dbd5669561573b0d52e62e2ed3615b9c5fb29cdb16f86e59ec4c42ce", - "036193d9133cd1cdc2142b19d1a5c9021f5a90ebc5a2080e5012bcf146d184be", - "d50ac48a47356a2177dac3b10174d5f9016488fc3d619ba26f5a954005352eec", - "57fff06ffbd56e28fe36d6bb7bf5ae8fd182450ad9728a65b3f16e787ef7f9e5", - "8a289d4f482052b873dd691f5e73539f2ca0e237c21fbae565c7b603a28eb281", - "d6084f519cde7dd6ebd645154d2224f8a8e5982a08913e3d6e4d69d8178e8995", - "ce38260986a1b4d6b8a8c9a47a354dc6b31da9af20bfb0e1f5e7db7bc7a9c899", - "77bf238c4da9862103296ce1a5536391dfe8dd22954c049a69a985ba1c5ababe", - "066247b2fbc39c4154702be32b68f0c59525dfe6d275139c56b3c10fe0d68b39", - "1ad372bb67ee76feac0f87c46f0f1d421380fb571c8949a6bfd22effd94eabd3", - "6da703a09c2286f801ed6ebc160c24d4418b18f22b1f111d39c60252bab46b22", - "6623c4005017ba426748b18ab3adef20904de8e928842e0af4ef5fd8bd2fe33d", - "f1aaaea939c94b068780745b2be1ec59109bf215e0ea6ba68360491e047aeff7", - "49384d735641f65a6c732717c1ad0f382f66d70e5907dfd386c4e7248188cd72", - "155e8a7d7f5cdb71a36f51c4f88564e873489beede96dc3d4edd1f8c6ad64ddc", - "cdca715c425f41ab5b54c93e0ceb753cd80230c083aea32c585c5ba089f1871b", - "2c04f35515840291f3e31c09ac08a3af387b3c8d7e078519240a2d0c0e04e54d", - "1b4bb7c6943cfd105327c2b082c06261b9dbd379c2a0fc150abf35384be4d350", - "73d9469de83aee908b35d55da3d767494e35bf3877bd896ebcc9e5a9d1b53642", - "7e014f200f3615465d1ce80bcbbc3b006e3c82b4ae0220cb7f65e737882cb633", - "ca68725ef8e938ba139f4b9df0e03f190fdbaccd26ff6da79c0d8e8eca763382", - "8578b1469e772daea6cb93152481a7e21272ee3899ad43def9ba330d0cba50a5", - "35376e48812adf368b61adce3e0b1d36234de3094e974ccfa876b84637ea6cc0", - "ca941ac7b1ed2c6ac7aae51601203bb8a9f6a97b87636038b83eafc60f86ddf1", - "38fa7e3c7e185c08a7ceaae05a22a60424ccbbb1923327492c2197ea34a4e6f8", - "ffb6faea2840958db58c3ab17b39b2bfd37e3cc9f6b2827da257a10940e5aa2c", - "fa36d8f03cf746525a5b87b875996772cc221cc92e213e43eeb753d8a3d3e72f", - "0f327fefbf3d7d8283c9861f5f2942b0229e2e016651ac070481688c554ab191", - "c9005fa5bddaddc3ce11ed3ecaa95a313d8cf98f4c3a7c8e67f758f99da934db", - "e1932f175c65493d6b55702cf349a2d6c5a501d46c23717038754727d0450faa", - "c44d77d9a12ac21098d1e5e8740a9df64fdf1f8bff954e8e564430f9b1ae5524", - "5423d2e857854d06a8722282bf2f936832f27b7166c2d1c8f83429e5afdf85f1", - "3c0ee7bd821e93cd75d1f4e6c83572d6761ef510da75d132e9bb2e40ff64e904", - "9df0c93389e6262432286be63ae573180b3e43572ec3fbfea12c19fcabd3de0e", - "b48498ad30f319c57e93f7a47c2c7cd2b9b382e74f3aeb5be7b9ab9d62b55144", - "bad51da2aacdaf040575439a5c36df18b934313eeae2df7731eafb49ae71c1de", - "71f6509cffb7a3e974f396f03e39326fca67ceca573a7dfc323e01a24e7c2ec5", - "061f566dba81ecf387ef73fc034a09549e88386a62e9c1ec9769975dc1c54aec", - "f0f3e7f5b88426f81591a4f4c706f882f1bf79d24ee8b9de215fcf49fcccab7d", - "4824cb2560201996f8c70f441b31081589daebeb3f3e134a5747e9a65d0d2883", - "d32d3dde2daaf0cec490f66e4cf369bdcfe88329d03591a77f1789e060c06ee8", - "931457292e292e25067e59a761f56235815011269b01baa460ce8177827e818c", - "2259cb820b4d08822402bee05a785f9ed23ca12ae151fb40c5380dafac59d8ac", - "2c2d6e75a941004f3843c2da7cfe08143899f34cce54c1dbe55879428d619762", - "a24cc948c9d1c3779d647e38d621731ebc76bd79a2d9b17b074326c5e1c1a7b6", - "c0ec10c2f3862eea90f8eb6ca17c9dce0ab55b95743e9e811bc5b03ae01cae05", - "854231e5648dd1417ae367198027f5bae672da51b6e117ece6a6bbfcff458197", - "7982106baf74dc172dde8515c555dce0e878cc0c584e4b36996aaca07e262351", - "5013773954f8d235c083d60c7125399bbbf270f6c20986841a22569f718e34a4", - "f82230a95dfce05e23b22b75ea56b362884b5073011dff7c20d6e1bdcb7c808d", - "423512b543935c205ff959308624c0e567ee6926d2c5a54df6d63f628b03c5e0", - "0833368d592fc43061877df1d77eff78234a5b6095fee207c1b8401209b87a6e", - "89098f5247a0373a305de5aa5d2f20777eb763525ccd55178d52524ad79ea6da", - "55c4677f55535706849fce5c99eaf60c45701ee8ff0a1470976212b59825e5a8", - "9fc209610c0ead01c4443066cf6cf1afff5c5a752c604b032946f4092debdef4", - "e1028053eb7c493efce0d26c564226bdd3962d883dd86d94771d0ed2bdb40917", - "d1bde2cc96c0b4f080ee3bc265edc5107b13ab6754d7b6cf6278705957f28feb", - "0d4295a0cf7a7c670548c5c7e1ad397a9c6ce2a92232b56d02778c20e0e7e0d5", - "4415437668754f4bd3cb420e878e87c1d3d5ef6855e87be0d3b4f6b233973bc7", - "1e8fbb3da4a401f9f1752731309a1c2b8c8c14b45eb30770ada482ce11b88de5", - "16593a61fc0ab3d4c77097205c9786a28208b786f001ee4b7dd89a332c3f19bd", - "98c942ffe3e8e8148088db24aa117f2e0bfd95d40c4d25f4f63c13309ab26f9b", - "30a3d58b021b8cd7f00b9adec6525a1ac6fe5e913a4ad5b5e8a461a0720214a0", - "55d5611829f6e458d7c95c8d69d636dca5fb643355c15ba3a853b6726a91f2c0", - "492d8cef47aeae6eb0e5263d83c6d5c2cccc71ca9d48d087cc72af236e4e1fc3", - "5e6fca99d3593733db2671796c6deb4898245a493cf03c4d1ac7b8a5de241214", - "0d9347fcbd1e0a99c482260c15f92da9b7d79d835d7486b1c47fd94638e47700", - "90e7980f47fa3c916f6dd056971a089b8b060b717f1081819303ee73c5097d58", - "66b803b37e74fcd8d01865e00fef3835c345eb4091bfec045bb6946ff0df5dd5", - "9f89a421214ad6320ac072f957138a8fe6d6a8dd705ad5600453b3f13d2ded00", - "5695afd2ec48afaf9c1f2968575cae11fd0a679c6e1a873e9e4f973c432f9ab9", - "1c11fa696fe294828b9b49a0f03c4584f1a4a964ed3688166d0da176a32a5c1c", - "17e097c98c6134b7f95915c1538ef2e9d1ef35e2f41a3c460865231db0d309b8", - "2d92977cd881c2a6440d6863c9f95eebde6729cf729f3c46453726d215b6b4eb", - "191664bfb8c7dec8459b811cab0f4ea246fff847e2643896460d2353bd1bfb0b", - "cf31be2d547463bd47575e9b103c926da6b26c3dd00f56df82fcb933b572f9cd", - "3efbc1ef3366b7f1d0b5c1b43d7e84f1f228cc1ce31ecc5da1c6e79f8a14566c", - "803afbda86b5465acdba6170d154dd6ea71a2583145b57b07bba212250a57fa3", - "a5fb758b3e4ffe06af8294c5d0e4af0c36580525e1dddf9d30d8b60796a600d8", - "f45d4648d1ddc82c61d3aa53cc1d94857bc59f5494982c9f1a25facf9d52a677", - "485a042e9bc5215124f03a078aa3f831a686ee151c89062c830c420341670015", - "28c16f119952d2c4e0a9c646e4ff7a3d250cb1b8e4d0fe21d8c979b4aca35443", - "33d6fa2b3d0421043869dbaf45b5aa709819ad54a3568d461d084c93ba45d30d", - "a2db7e80dc934b25d76d0815a7d69a088783e20109255172e74e10bca4c78a0d", - "656bd9a73ef100187038b3bf441ceac23f3fdfe98b7cbd1a396ec8c59260aa52", - "69c13e1f20dcf1a6144269042697f206210e696e97a9204ab9b1d02af1744282", - "01479b1dabf6d79814577f89af2e5d918312e5e7dda1284fe2b2036698cf1c62", - "694273c499481fa12dcdf48f6fde2a3e602f5f80486261374364a6b13375ecf0", - "127d553f481a4076ab09bdc0d47bc540d07511a253522cb4d11652ef1e55292c", - "1c7bec9bb9140ffcb51fed10f0141c122a8cddb62a6ef2568077ed7f9449936a", - "5c2f6e974b421a91d45d27deb303173134e904446ac6d43b51b3349e5fbfe398", - "fbccd8fe898ae038c8283d6964c13c6ed41760f5f478d1e5b4f6ea9d4ca83f39", - "8f55a0662f71d95b5f8f6c084769389abb4f4a0392aedea95ca41164980dfd65", - "71a43206b546df4f019670d78ca04c47ee106eecb16a09344a66732593eaaec7", - "7c37a37d0abcff3b5be8792519f1acc182e7da65e08564552366e8b37eb2a127", - "7d8d32a7fdc462b0cf5ec8e8e66af644f07c76cffb9a607639e52bc9700e54c3", - "770ccff70fb5f48b3d23d0043f9b8e4b91e6d13295d6e356018af668f9176f03", - "0cf1ee804d95c37288c446d7b7d5ddd15e87e89e5bb245447fbe0c53bf560f2b", - "244e06f440d1ac6185b1364367b5af9d7ddbd320d4b502907d9d891b7b6deaf6", - "c13977ef327c5e358827d868c54e8d0aecc1090cd3c465b5c84720e0f8f18efc", - "58853adb12f2fb4cfbf0bdfdd3f60d4abc66cd4f9418320977dc4e746c84846d", - "47ba0386987cd163e4c354ed50ba2814c769eeddfc84815000e2c9ab96036656", - "2d47e48800b888fb7caf8f43fa648461d8e4557dd7c15643fe3e3ac52a1efec0", - "a57cd8423ddc60f8b96849d2f5df3f6c2b4e7289eb4cda4d75f7275bb400ecdb", - "39b862cea324a1ec9cc43a2a76066cbe4f61d73779b638240b1aa43c6b678e1f", - "705a9f300681850411aab6c19dbe85410e452feee2db19f6d76355dea8f9a47d", - "7136005f9f78851e14ef6cbb8937869d6d330f8504f1d65d07a85f076fcddb53", - "75a24c9a76634f43c649f975a01bf75c338e3964d7a9da6f99b14496e5425856", - "cc83ae140d20b7eae81b965cefe26e239beb880c25ea060bd2c39ab633e07f67", - "bdfcee87cc60d3ecc13f2b3b718dd84cc5d36a3113c81434e4118c5f230fdcb3", - "f86a2fa3c0d0de109299073d5a6c9219f5ef38679cf3693555203dab6a5b3834", - "820d5b6864600b68ce5f1770dc03f36484d202ba8feddec912827d00b5bbcc81", - "d2681b5ef3a71196ec6d4ddd60b70ff5903848c94ea908c3a20269e9fdecda57", - "a83399431e2c66e879ef8709ed86cdec2e4032728f2e2140f1280b06b1199d12", - "023ae296aa968abf609806f4136871ffbb767dae8d984e9ce556dd7c2b88b10c", - "61d27e58c9309b2741dc1abfec50b8ad4f7b36309c7a30bdf53cb05f28030c1d", - "c0c0d6eabba651f66b4705ad545d731d426fd7660ed406b8e4fe28446e859f33", - "cfe57b581f2f598c91cb9cb1c9793339f2d26a9c8d04c37b3ace9975c19eb5b1", - "e243f66cb0f695844fcd292bafd5617329de0b551f17b69680396516c5bbbe63", - "b8d10703e4e2a51c4e8f004bdc3645927d3afd55b4a4189f73a8fb576615f43e", - "ebdc47de6e0dd7f5b15cd8236c5bc54156523011a0e077b97b4cd77e999c3ddc", - "ba3c1437335adcc0894fdee1b48ea229b64948da803a49aa27819018ceba3f7c", - "a9532e2613415915344451e2d65c0e1aaedd1a94eeebeddeb1f2aedf58f3deff", - "48295b52d378e80c6155b1061666239dcf62d9c1dcc4086157c480657558b1f3", - "7681a5826d5b215acb4480e01e2c02645d8dd8da7c416221551bda3a214d2bf0", - "7bf47a7964d3fd1cb3b828a019fe2bc55885d30dc258149e7bbfab223e6c3753", - "23e2769f71b1b356a866747dfe91d081732770a2836541490d8c58a2e7002dcc", - "351f02cdc90708b909166890faca38b3198c66402dd212203cc93df6f0a58562", - "c77509bd03c0e74d1e6d575f1ac545f21227dad5fd0477c6cef3dcad062602e8", - "d01635610090ead30bdc96353c54bb7aabd75b6b6f2c90bd5bd608a5bbad6dbe", - "c12efe2d4f122ad31b5c6bc33e279c4c1a0695e31e785026b53e20265d57ca4b", - "e00e9e3ff559c23b1b05e73b71cee49b470bbd07dabd36c53f816a18af52c835", - "4e00437ad1a50b72fa1cf45a247675c1f470705ae65b12b83b7cc2f09a1959fc", - "1cbeeeb9db60306b2f6a9a14950610a07bae93ba5170fd9606b9e02925939b7a", - "73ac179273c922812adae6a5881b74ff967007384d935d223c9b3f8ae38def7b", - "7584a6f20809ffa7bc93046d764fc42037d57dd668ebbbf089201e78859c8320", - "35328c740a270b8830018092c7a2442f0c2e14e7526633a3a4f77dc487e4d8e6", - "9233cc38f219fc8631773532c7ce87c2de10e98837e80b019c181807ef7d5670", - "cb76475745215dca4ec2ce2ba8911a6a87c3648708bdc6c49aa5e873b6807bc8", - "ccbc5fffdc1f76a4214337328cff67b29f106fdabbd3670709f173bbf1fd7bf6", - "c32ef53dd1b8e2ada2d6e0de6468ef41a8f38aa171d34d83b912d6b6a58e8dc3", - "027391ca6eb18ce55af2fc6b8e88edc8d4eef0d8f927fab5fc34ff916dbe8d4f", - "1d664f14cecfd92f4f848e04e98beaced7c6d8ff44febeb6f02bea5406f719c4", - "1ffe69221edef190a8c2ba15d2b49823a4e6b5efbd0d0fd783e80af93cb38d30", - "9699073e3d0f629de569b08dd877a8091f247a730697bf5f884de4e82f2c4d86", - "5a33f892e35df30ab173e5d732f1cd245c7233374d9bb5a8876567b165bca0f0", - "b12b9f91c9d6ee298728b9c11680245d8d7b5d00c7a7bf59f00f06b14a296fce", - "57842e54b545b76f97f65b4598b4410cdb76e9ecb557e7fc62bfa05405909202", - "33c8531f10a77b5617289ae591c764aab1da39192aa52c2e0bd86b96a833ee96", - "0d295e2f34e59408b955ffc9489e77097e3fae22a990f10d4e1641a6c1daf0aa", - "cf7278ad16f8af1f7014ea7901fd43c80340a7912998dbebadc667151afe859c", - "05ad5bf4212a0812f0c47bc4779b9fec543f972bc9f0d8a2fb46331d0f046ba9", - "d1a832e31bbc481b3890735c2601034fc247a246825dcfc029104fc43079774c", - "29ec7f9b5917ba6cfd3389a9b34de5976c6fffeb27b68d8f3e2ebec6a04f61cf", - "0e5d46655910f4e7ae4181ec24d7eb820075cbe6d3f452307e6b4c41b779a326", - "a46c7fd7f150a618e1c10597edaa651b261ba9142794889a98ebc03ed9e03491", - "936f4e758acb959439bb4ae3f35f587cf5bce351de8c7fa4b8198a8e19cb4d99", - "1c2348719abcf925b163f6caee245d8da3e35218af33b9932199421d5c9c78ca", - "28be3486b34d72a8e9f00c9ee6402d9756d2f783910472add91ccb65d3a4d2a0", - "e066d7af8569dfddab12278e03b336c765f999f31d541ca143c121543c58daf1", - "bddab58ff5c38c0bc57c26589d92d664b1f50911fc4a7c8e388dc9a11a908b4c", - "3c380d180aa7635705253e6a271241324d807e1c800f1eea71bdfacededa24e4", - "160c6115aa0562f730186487437b6bed0c038e1dea9d23250938d6a9a99ef92a", - "6d11ef8f3721249fab4e45072d5ea45d24ca59e8464c44fbac61d18bb9d1dfdb", - "1299064521593d9f160d0f9851a5fdfc7b7a9c933a4e21d42439c68d2bc9ae7f", - "c384259785db0504f96abcba55ba12bd2bcf4545d92bedbe83b3d61fd7699b90", - "d46f16d0d8c45e97134189e4d1553266bdeee8940c1a9e285bbb8e6414c53cf3", - "196c3d1737fce2e25dd976dd227703ed4d0537e22febf34dd3a81cdcf18f4573", - "e90b92ae2332663d5c3fd11dfb5c43f034cca7a1e410e597b0218c34c78c3273", - "48fbc807a72c2f2c6c2fd6b5aa0ab59f9f192fd23f9877e11c8e9e1bc3fe92cf", - "c2b387df1cee03c257676f55be114eb8536f73c899605f29182c854118f0ee52", - "2ab2f8be21a04b3b509c2f2e5adf4709afd8f1fb53405d843e8d361c59b639a6", - "48738db7c23563c3b30baf65c7eb14235834d1f82f772d222c77a3cf3fef42a5", - "48bb8f26a961b406430b35eb709b5f391aa9ba65f93136acace5dae02fc95b5d", - "d9aa61a7d5823565a32e51f8c8877c78977432ddf6703cb9ff105b546d1629e8", - "04f10de243354637d1f74737d2df3b699312d104b966f608a96803fe66106f70", - "4d92c14fc60fa14825a0b34c66adc8f79f6cb9d7aad28596206d0a5a7380450c", - "d887e1d321efd5218b3ad900c1037411c011526049d14707987b1cce62aa638d", - "c638a23a76c7fc42d2e0c6ad9d40a1f68f3aef3edbbef68c2535da0435261ddd", - "23a0d244524ad56df7e349952179d9968c74923e5a1f7de0abd99851bbfb534f", - "1f523689cc6e420fbcd307359aae8e4e8adcc5961ee08e54a9faf6c3a5127797", - "b72d13fc7bb1ee48f84f8a0e57673aabd02b6ee248fbeae6057b252613b14c48", - "0058dd89863fb66c9eead945de3ac4950a1bf60a3bdf15340b509fc844d1950f", - "72c2914a1caefd5d7cfc67256c749aadc3c5e3fe63ec8c2474e2ef9895a5abf5", - "38f7d76220c8cc615f7f37128834f1e33e7ea306c8498b264464c7e288def503", - "813e0f20925756a0872b7f44d96077c692fb0370a36c66c33bc5f893cdddb5d0", - "acc4cf5abfcec72288c40bca608ae8033387870144b7fc3c79ad94968890d0cc", - "b1fa4b35ab77a8f20ac631de76d2979f4c1cc456337b5daf91b18637bcba9e4b", - "8883d45d2f7020b5e24d4571fbe89d36cc2bad4343aff65c9fae1429b9b25479", - "2dcbdc8cf0410eb64b3c491b7ba6afc95d000742f663be59221e214c02b1605c", - "1fe32b251181d4e01cca8f7eec786351e07e10cc7794f09c9a89c435268a0594", - "f24342c67c2837585b0b17be1f8cb074c2a84016c45d0969052c7d5a16fdc743", - "a99020d2edb48c2cf4d9b68da7e0880a88fcafd54b619a07611de18f87d1cfae", - "a9fd2f0ffc78c653cffb1ac5ba790e5ef66d91435cbe837e9559335007c223c4", - "3563d878f196f64dae7cb25c72e58fdbd57663c691e13ec3bb161e171863e68d", - "a617d186c2ff86549f7fded03654e7ea6559b8bbc385729feb003d3acc1817a7", - "b4110e68a27c4cda2e4b64c41f25400e05f8f5d047acafa0570ccdd1cef4c636", - "ea2d16ca5ba2cf8c572930ecb78d917990cd5f2952be644565f32048fdf0bcdb", - "cb391e87df6d107f51a98917f1b2fb7602d4ad68e108659c9b4182a71feb1d44", - "bedd23129f88b4210521fb92d90bc67af5726eac6dc77589a064f208621986dc", - "f832bfe45bb768a6215fc3094bc5a8e2f993b7b703d3b93adcf66b03a3c0fa7a", - "105b21800031ad2604938524f2061d36c6843553ba907707bcb28dff10fa8c4a", - "8c1d8aef42b45861df0ffe58f73f9cf58dbe64b3616812c65334ca4c6cc0d1d5", - "811ef7f5bc386989e272a5b0c8466e8c5fa04f4cd698c4a00be51494072f11b7", - "c5c573743e02fef1e4a43c9e47d47792a326aaa6dcced8c4c4dc36db1b43ea4a", - "6607b6e79618a6b51e6648dfdd5ff26b85d99d1a98305d1fd57f3215800c4f17", - "02cd2bbf5c90320ee50214fb637c66cf4500a18a11b87c1174219cc5adab6a25", - "6f4f24d27e043a96845ef7319cd902db55a335f8e872c69e10fb8f4b9502ead8", - "fcac153c0617ea80253426cccb41d1bc435e6f5c272249229aee6cd4b909851c", - "d4cb65635e4e7a8c0dd920e3475ddcc9aae7b78743941f978f74508dfbe7d209", - "fda34234a2e111fd466af503fa2cbc098a71bed18677ccac9dfb38bfb6d5184c", - "2f846cc00940de3ec82666800b743d9673ec8f1574f44cc6d1ef27f001be9337", - "355084b83a2e4750d0d7bc4c926d5f301c2de68312d049f902fb43ef4528abdf", - "d01d2ec90870aadd51dc49718cffb94c07311a36e6fe1010eff2fd695f501bf3", - "01a7852e48a416c5d2780983a31c97f328b7efd4cb5a5baaf7776210959d48b6", - "144834afa9f65273d25da8a3141da1e22061c764545d7f72f1d7b8f2f8eca0ea", - "7cea7bcd0264dfe2d00d5a866e8775cfd94c92ee18a2ea9bc05fe96803ebfd0c", - "5259419b097fbc7281df2e8543beb7ced8db830674826cd45cf19add27d6ef6e", - "244cac353a96274d08219433277511c2282c36a1368087988755b84727eb0662", - "f6a3226bc35937d5d607a2fe9f532a26d7cc6b2566fd48b84961e1add3d1bc1f", - "b135d197f3785de86175a67fbc31a569a6abcaee603c8f5a5148934bad163495", - "2aa9696c881396ffd441fe7fde7703d53f4d48329a9453062226711f401fb3ca", - "6e98beecf8366d8f70fd29ea259ea05f69b46c416c0b8aa2e9eeb9fbcfbe983a", - "c65ca4c7fe8d5919ee66b023822cea2045c653a529f5c7489d8f947dc62ec55e", - "ead9c79e7d8ab3c4a41fc1f4cd67cd94f41525f56911b7f0b4c356b0b9b85a1d", - "2b082a54be16f180d08f4e0298bc38241bfe0c3fee56a5c2c451ce359c5ff9cc", - "dc66278bf1bd6452895bf422b316431927b064e230388c7f0c8efb9394b6f651", - "c366f06e9128bc69bca481aa062fe55ef088c03e7e6b5ce33dc0eb3ce43aea59", - "ca0186a0c2fa65e67d17dc1224def9378446bf363982fca4a448f3f227618f95", - "ed30e1c3c85f07b1e83071c9e8008fa4241635aa1b5695bd7874756728f7e87b", - "33fab6eba811f9b614363d6c0f22b3ce62e86705c91e04e53f0b2c0a673f9e69", - "3e1acfb2351897149934f34fbf061d2e1de1798c73fb88390e0a10a5921ec5f4", - "75f0ab244dabe1bf50d2e650ecb9d80e9224f25b0488ecea3bbe78072a828182", - "fabd4f51a406d7ae84177e5d77772fdfd314963e489550d2ff429992e3ef10db", - "8e439cf08637871c8f35fdb79ba61ecda416a9183f94ad35f664b46577d4138e", - "e4878655050e114c5e816659a17c2f69b6f525b3f944d850262322b7d788a4dc", - "514189c09f93f245867f929f48cdb9d5caabef82f11d0fe2dd0b11fab68decff", - "d5ea9b84f16c4306a83e5aea2336ac09d3db0caf9efb0964d6cd705e0f22384f", - "f2686e3bfd58ebf3094545f930bbda6beb042daa60a7728f0136f4681f44a9ca", - "8f758782efe5b92c5d0bce5ff078e20d2851971894d88209c9b99768a99e7464", - "ae3198bdef3377264a70bc48307ebaf4e569018951413a55d5e0ed463351353b", - "af6eaeb39507ceb3cccdda3bdbe7406f36683333684724d98ca3b44356d091d8", - "1d2a5ce7330787df47aaf30ec7f86be2e182c2efb86421eaaa9b1031aeacc205", - "08a8642539a9ee4f3fa81fdb186c871d61585cd32feab6b9d1407d575d76bac5", - "8fdbcb456202a0a7cf1f4f9d3d101779a388a5d3126c1fe3201b51f466d669ad", - "9ef077e26981a53b7e692a1ade7b612ec08e58f66ddd2e2f5d6cdd9800d71c68", - "2e8b84713c01baff003220936ec3b0fcc081dff750bb3dbe1f773a3b7575d4f7", - "679baceb2511a52341f3fc9ebb0b47a18e276c41dc10bf3e7644fd55839c0000", - "7ad73ce5487594840b3106fee8c8d70bf7f7793660442e3118dc01e55d689ab9", - "ce2051c7f68422f81d5825d34e5205a351afccb09e8799a8e314129f95889c8a", - "9ea84bc3c3ee040b12ab58711d405eb6d154c253c6bc9fd23f0c4ef20ad0eb70", - "9178ffb69b711c14aa4d17f45f93e2ac28e7a69bf851fdc3109b748f6888f940", - "a63dd41d95166c7eb8b3146c2325421cbb0715fce42f7360e4bf822af987d6fa", - "7b250dc8d5170326818094366c7f967e26baeb3e33cb5e5375cbfde4e77d29fd", - "e7ef57b6344e5d8af4b00a7dacd75221eacb75425235e78e4468983281af75cc", - "399b48f2d107d6d4b21dfedbccd1f4354ac0ef9655acdab136b91ef2e170b910", - "ea1bcac5892c336317b515d657597df89265a7d68774b983ef397e04f11dcdd9", - "4bd802b4531aab7e8c2a4ca5cbc10c187e1ba641b595b4917ba392f71f3b193f", - "e9eb7fb35fe83f1b150ff5ec9ee064bb7fb41ec44b89205442fa5f96c35cd3ca", - "ace2f0b496ee304d1da7de56d632ec4e0cab33974e0030df5c5eec05be443569", - "d0dd7eb5d8736ff15be05293e48aafb208f9d74596c39d07170a9f6aad8520fb", - "c59ec65857deb2db9924eb46d171ea6e37d536d1b75ba2f93c18c6905d0ea77c", - "5c2ccdd34d2e45331b0447836fbdbb07ff95f1326596527c83765df3cd54b78e", - "04437cd15e9a562c83f7c7200cdbe71ce24f568730cebaaf54783ab09e14b553", - "5e650c93809a64c90e6ce0733c9a60d01df0bce0142e3e9e2171647728898523", - "bfcdf5262ae633c258a4b875bd0c3ead9052902ab977e79f013792eca42a46e9", - "9075622ecdaa6f9898a3bc5a5a1d90be1a05228c73d332801c96f8145f854ca2", - "99515189ae156679ec10396c1dc122f6cbf5f69326bd9ed1ee28bc9b24e493f6", - "a63a60a64b7c99f1d0c91504d046bdf9d8fbd524400c51389d5eb8b3d20716c2", - "b52f36f882ceadadf92063335d082aedefd15185360f30da7a3e902c661a721a", - "6df7fc33f7aeab616583b5dea7b9a7d3034fabe6f99a7fd0450b146654990e0c", - "b1acf0d3584f05c1b2748ebe3801b8d3d1afa8ffdefd48e8d0b42d7a4f098425", - "cd512aa1c7cde74c6a50eb2b9a8418662db6cab1b53ef0deb461e42003eb8e99", - "47f39933d4f46a1a3aa892e8cad1408af75d695723befcb7499b172eb6f332e6", - "ae266544ed617403807a414497e5e84203df61f12e7842009873729d3377e225", - "3823e4d748ea0cf8854ca44c8c3697ec6e915b01292945f53593858e89979331", - "80a14f333227e13193fce37d72251fd64c2caa3a10a4898263b157e209e3463a", - "492ff31ac3ad974523574faaf5669b41ae14af7949ed894fea1e1a47b2d009f5", - "c68ac8abe3931c563a0bcce1d86e5208dde2ffdd80bfb4e4ecdc27a6a7719d88", - "77bc375e0b265c291ccaf38fbfd18d9366380115bc3c9a4fe88407fd5287fe63", - "a332b31c5c580684cf8962271cbb87ac0ff1cbb6e3852a54466e959c055c1e80", - "1564539fcf93cf824cdaaa580e8d809696d5aa1c5967f09b676e0244ec11aa71", - "e5d59211d361dde8796636fb1576b53a4d67adf5d575a6fa05230efddfdbbd53", - "4de2884078d4a5d0b76be6a8c1fe759ef1fc37fafa6c5312a282fe3f7d451b28", - "ee840c3103c85a79729d795921e073d16cb725f0062d501b62ecb6526aca8ad3", - "c189c1425396a8d3cb201d80b3956570c4f1d8ee507525d968338f807d0baa62", - "3b2ef8159fb77d01417e6473314b25d34c4449761aaf28e5914d5d28096482e2", - "056afc78a0b15e42d5d7ec5a87d6fd35998e68c4f06ddb7171bf4d9255338817", - "0141fa4663e86496d5e5da34fe4156ee34dc54d7bf0e8cf7ce29b637704fbfba", - "44a5e1114ed6139fc3e5cccb4733dd1c34bd81df1bb92356f6aa4844f3889ea7", - "7a6102a24623c44b15d13dc87d665d1eeb61bffba93d21c43122e838519ae951", - "43446b7fabd96010e0c42a7cf22ebd982cdb3808575634c35d7e90b96cab1c51", - "1008ab56bf056311b1d54371fb38c87cc9f7c2ba67e534e55f46ade82a61066f", - "6b5c7035e2d02d36802ab3c48140f8e147926c46293385bb0e11ba6828e1c10f", - "078f3f7a738233697bc4a71ed9fa9a11ff916499d51c7cb33e1f7109f5a1755b", - "d2017c620783bcdee3d2f5369a36b5e7774202b990aa78fbc892062d70b41ec5", - "507d8d03b8ad5f19ef97f3c6325860aa19afd899824b530112badcb6ae4a868b", - "1fbab37960809a91a177cd28e7fbb3aa86385523114b9a4b03197ef335b38497", - "a839f676705d6a9069de76d47faad641d96d6d9b44593a5064c9775a5446b5e3", - "525896819e5f876ca58c9fc96e11f4704e9207ff455ff02d671e4b19b08b8804", - "abb6cea4baba268f739318dd8999f6e6bea2f8aaa71c4b1749892fd81b91ac53", - "0691b6d6dbb68d921e2667aa950007b794fc6c350273125e3e09961d45a781fb", - "c0102ba870c1923c4c5559a1b7c3dfd0a21659a6759258ec3bb6d50fcac4e0ee", - "1ca844ad5716f0cb97a61697c3b872075ced245a8110dfc466b92f40f778e507", - "04ae35a72c3b2478833a0a6489bef4c4f3eb400fe651323555d8d5c2cb3dd1fd", - "9a15570e5f702b765809ad715cc534f6e998406428882843a7a84ddf5ab181e0", - "45c853e699297802ec199c7fc9a38c3417511a0dc4fb537fc2dc38f00a65f6f6", - "b0e30059402fe4ae98eddaf94c698d504e6c9e1f5a0190b9e4968d6dd598f52b", - "b5fa831d81ecfe504eb805c98a00c30c15ed4536d6a5bacf9ce2fc8590ebe0e9", - "7f4d3ae9ba02f34da6971959d3fb8d680592e240f6c25f03c9d2afd2e195b084", - "b61b4e8c65a84066b4c7b3088ef5369cb448f60e174f4c9e98009349ac69766f", - "432bbe41d824548583b6bd314121a552bcd3b254bf415a976075b5064a9cbf09", - "3644cbf9278cd9014351626b5c5898f316074a3146a671e284fda85e9a3e1a87", - "b54e038f893d5c9d68f3d4b495d6e3a06b05bfd4edb622cc39da44f900c12d0f", - "1286171f2bd87100ef5165c1f4f4ee0bd0bd907e6a22fb4e29145f82f26a2f18", - "a3bbf6e4c3cb73e09fecf5a6184f0173ea26829b8bebfc78cd0feaf8b9dafe33", - "3ad73878718a56912818e3b92d86d313fe6d4cd43393e5776c0265023cd6636c", - "372a8981a5b9841d7c21a3015f48f5cc988df67e26b6fc5cbb054a72153a7465", - "9ea4261c8f6b5e83429d2fc70d2055d8afafd2defb2ebb2098c43b27f99431dd", - "497c0d6544871dc81bcb82dbcc7fedd7b7fa8ea2a3d5688409b2ac7a4e83cce7", - "63acdf59716855ba2ce0cf4617458369f74a636a8c4fc62838982e881887d1a2", - "1681de1854ea68ba42ee5febbac5f61cc2967e7ac7ffe16400067487d75c0c71", - "0faa7d93ad1e02f7404b7bc523cc06885398fa5e9b8dc896c1d2cd8947f1fddb", - "fedc22e13ff9c6bb90b435db20fb5bb69c6d9cfccf4aebf4bff1a080a1f6e012", - "2d6d4dce949d1321af2722d6fc741f65c1f4554e3818b28310003f66bd9b5955", - "98b157659fbb8767cafec551cd2eceaeb3705a634ffd1eded564f8e9b3de1b86", - "c860c0f990a98248a90c8caf0e902d33ac96afb91c5c974e0be0ced052d8361f", - "024df9dd4821dc5b1220e971a1cfb2f5ff4345c2820c9ca309d23a7e362858b7", - "b5f9f5b831e7b92946cac5f4c7e1bdf36bff43d8cc0c22806883d6b741d4de99", - "5ee7c472aade8354795ffb1ab1701ed82268ec047c81accd13fad9ab6dc10ada", - "ca4417833a3e25a35994eaea42bb40633ebdfc51d2802abd9b2c071b79355ab1", - "0e3126a7fb2b68442d413f2cdd62bed0a17f837bd9f208a17e23650c3e056457", - "e989b7e7a121dae5f1d3829c9f6f245110f928e1b1761c803681f6819fdd0293", - "7fa50d49a74e5d23972eaf35bae916fb7d3d2316413d4e38000b3ed146362453", - "df72a73aef56716ed21e2bb3b0b681aaf7e969ba1e8965c3c866b3ac9c9f9dbe", - "882ffe5635084e3cba4aaa72acd0146ee24629c69664ac850c6a94fb134d121e", - "5aa86ebfba3e27a633c0f059b1781bf1387fdc9830370b41a9237ff355d7d332", - "27f6a4a4cb298b305683c396332d2f25c23c497053ad777828f3012e993c3083", - "66d9c3d12fc930df0ea20d4c76944dbf8bfbbc227ae25c55d8cda84236100318", - "c4a188c5fe502311be045dc5633bf8daac1bcb47a699cf76c048033ed57ec4e7", - "47be0e6761e0dd694647f2e89c5c6f03727faf24e63bb1785d9df09d149c8840", - "437a00d3256c8e3f6528f788907c54a10fc547df872e1698cf1fde371e89e226", - "2a5b4bc20cf2abf42b8d8996d68650d18c4cef97f5ca029831c7ea75a8010c12", - "1c2801cfa2814d10ac035dac43f29e428db7bde086a254b729110c6e8a85f10b", - "e7178a90629a1baea684cc111ff19a5a6c999cc7d979504090a42fb42ce546a1", - "bd85513f83197353f0f86cc9797348b92feb645915154dfb805d2c3aeeef605f", - "7bd53d9741b62399e0a1a273a53467ef344fb0d22181b1083ffe838cbc969b61", - "d02d08d6c6245bbb5fb60aa241cbdd20a80db0a953612a1d231e402e1ad72ca5", - "6b60eb797be19f7f1b584aee7d7c20ff07ab2761c121868ab76e2422dc7d39a6", - "0d57af06218284a5dfb9e36f6d5d35eee54e2c65f00baa1cd5032bcef2f66024", - "ad240af30c3558c7d4ab8e81a57386f4ebb5bd7e48390bec9aee5f786c8f14b4", - "f8c626437ed80b827c5dd2ef65236b92c08c859e3a7a1e190912d94346f0c691", - "aad6bb8523c61d5a77de487b163583c4860a9cddcfecf25e445e1388939103c0", - "0af87ccc7e6681606b7c11d6a3c5c1f9915397cd8f2dd5c44c0def8f979013e6", - "e183dae72b9e7537b808802f84b9a8543cbc4a208fa9f6f57cabdfab22881756", - "95de8e6d3f32bfc39b9db90c38fa8fe24de76f478705141d43a3d6f1cf2e7592", - "920cd662f1d3e4f7c985fa78f4d33dcefd37c65badaebf30489151b12710af78", - "773e4c55c485c6abe9a3a2619bba17da51426a47122714977262fb28feb5328c", - "2321ba1d0dda5d0158ca2198b0296e841360330d5283ac3d65ec89e962c744ea", - "b8f5dca26105af422dd388bce14b022949584e4ed132b49df440213aaa680c02", - "743dfd91e99bdd3fbd8f1a676f2b8b1972e36068fe8b2159f58b4acd9591c5fa", - "a1d44b89e777dfb2cc07ddded681e01e45120d787dcb715475a3ba5da1e5d63a", - "70539c947202a106a612ca644e3b3df0e822e595c32c4f420ed7c9c36414e342", - "23979c074e4a95f9dbe9fc8b4623818fc2480b21c6b6658d770ad9bd52e59312", - "c97514f3adb3ec3aa6c57a3c21c28b62268d63958514d7ef82cafaccbcf763f5", - "bd74dcbc43c3f31a038218bca8e49688d374f57619692c95d4dfa06745cc7d8d", - "10adff30055ce18df56f4b014cb0ce811320e47d9b75ce2e4f3b208431cce711", - "9ad825481faab8e7c7c52569ee177f3de615331b2a1e14f6f545b1dd148fe274", - "94b46a669201d2366f8424fcc7776586fc61ffc1d1a8f3b53027187c1de3c4da", - "d14e2c1701d392c37473bf866b8452d77f9e1e547e2bcec0214dd3c42122aabb", - "9d178d67d2cd74aabd16c31c0509c28285740347665a2b74f76f615b541880b8", - "fad9d2c596530b8918632d7ff2592a22cbd10636c093ed357e766c4ea052cfc8", - "99bc06836000a38053244f1c90e666128670398c3441bf0520e342d248aa4270", - "1fc9d0a745185b0a40b59fdc554a12620e104e9981a4e7e234be0f739a6fbaae", - "c0ce08571efbb64a9feea91a35c1f5f06bec627d0b32e730ed8910635b2362e4", - "0a6e3de7e58aeb4745d3624756268a5a52bc92a3d36939a2f52ad14d6709d089", - "7f549b37c9c1d7fa6fa058f127412f20495dddc6fecc6c67db22cedc6fffe995", - "43fa6e8cfe4da11436727035ce146050dc683381bf3e5697452de6a400f47ec4", - "b224e2d0b6f2a2d205a6032d9f7ca8484c38855ba3b7fbf060a10dd50f3f5394", - "3bd715e600ef19014762a2f155fee9e4e42a2743bbf2cf93a95fc393755c10a0", - "bb0e14d9996624e07d5a8ea4e26f6b15c0d210470345c686c913e41f21bc50a8", - "b4f786c9d3f2eff34298b694b6561ebb9de7d748016a375bcf041f18f0b65c70", - "9fc5e2bedd780097ca9c43f0220c502d25d85b3a9377f75f4f826dfc1f65e3eb", - "3b3ee5e1580c748ffa4aadeb54bd29056d566fd26e05cc0528c58cc451557b65", - "38db223b04ee985dfe3a6c89dff7ada2beae4dc442460869ba28fa9124e990fb", - "df0a6e347c0d67d5834bd5a544b07075c21cb2cf6a2dcf548e7291e0c946f850", - "5e91e4857c0dbe172c4b28c0da17ee4640c71b7e887bbbfbfec1c21ded832b47", - "27c5df486d3ed593c334242f2c5eb902ebb508dc00036e2ef9ae77fc5658e26c", - "1b5ebc375d87ba1ec2d8432765de5befefab71d5278dfac7c2a6ee635b5da33f", - "25477b0410497382c77ecf92a5dfe90fee1bcaeddc75442b9b5b4f1bdea05074", - "35b32681a6e9458af4ca88b736b8f8a25f03b06dd2ac31be409e128c13f4d1ba", - "6214ae91b3e3d443b0389160c1882fe9ff9b29fdca45b6a82ffa8b37c81dc4c2", - "66a1e67aee598f5008edfd0e83f52a924d515b7e0b07bcde685ce4e3a4f3d1b4", - "72cbc99938c5f99d2d3226b4b75165e90b960cd6eabbe5fae9305be3af9f9fc0", - "46f53ea1fb681b8d83334b44062a638cd02fdca492f82b22592435c300661918", - "e03136b33e539563f09d0637ea3e57b1d48af959a5634c2d8991b05accee4633", - "ddcf509d587af74b05005df81b743db59df7a342a359c83bfd581d560ed77d53", - "431cae2ab560f84f64dd1b878c66c958d951d550435e729f6362769f46c743d6", - "b5ab231b31dc41f1322514794a684e607221eb79b380ac4d440f16160a603f09", - "0753ed37bd8b9f9073a8689fcc7ecd0a4667038054ac4a37ca252959a9c452f6", - "ffecd8f540141ae8460c9671e4599c956e48d4c16ac69b8a79116e0a7c2cd7c8", - "5ae5d13c07d5061fa00c32e6b498a38702976d3f06c68ae12ed3bc0be037c9a2", - "78d094d37b2c7abb551e018be487e151d9904d50d98955ad142fd9ecf4f568ec", - "0030310d305cc4f0ffce57be7d35cb565e7a460f08d0f014659c91532a4c0b6e", - "9519de8cd36cf982ea90542dc113d28088e34e22d4218a7e69e4daccf3e0e94e", - "3f08b34c73418d0473baa166cfd1cd4829d7e41c8099c2559e00a318e231ed7b", - "2af409685016881ea8a4cc4b13f56655aa07964d2546f97ef86c6de36a66f888", - "57ed56cf8f6a297039818c688784810fe083fa92166778d82c754e3cb083eab7", - "16d23f4af8385888dea9224201308013da9ac46285b0f6095c8a0b8c21384711", - "48d4482ac927297176c209b6063e2bbe728b3e81ccadc25ada67e8bab61e1d1b", - "ddab6282baf2142c5f3da188f872061bc6f6d54ba36c52e7cd2569b4c8f28ddb", - "23b7571ee05b6c39d26c134d984d27fddc7c53461ea00a4a155e3be32014c853", - "9a4ee023c23d25f5c3c06eeefd905f34ee0eaca8afe60dfa8bc52464dd351342", - "429c49f632902bb4be4ea17a3c223686fc1dfe8ef5cc9d40663e41160f4329bb", - "8f23f244051319f5d4d8360251b3603241411e3e01783884609279f6aee102d6", - "05b92e2310a5d307c1cff1cde79f1f57bc0b891e56fee19d386824db0602fd57", - "4f7a3894c0e7f258a2d232e1844d30622a5bfe0a04a4387b108728d76ce2d515", - "217021e87fb69b66d1191d27539516dd58b18adf9d59d8f0efad3ce29ec8d949", - "ac78641b70da7d1642d04a01df989e8a02277ad46388a29492f042ffab09ded1", - "5e73b57cf2451b3fba5e507c121c385bcc3a7b78f2230b2f6e8aeb01de76bb20", - "1b7de08a3dad4728cec0653be12a53718c46c549509bc10fe2e8b8ca904c645f", - "9d004c9501ed124b5561ab4fbc1b83f03f3cb8d4273e3834aced944e37e9699d", - "d771ef70e6e8f33d3b0438ddabae38851186ed862ef3e200e631fcdc45ca73cf", - "225a5444a050ca7edd9823796ed35b193d4dc2eac8c71d511ddbd8e0ca9b6252", - "6ac6a8768cfeae800e855c4ceede6fc9783d69ea00d513acb1a4bc1cbf2c00f3", - "637f6f524a9bdeb530152f51f1d1fb2d7bd25039486a69b17acc1c4998c8f9ae", - "1aca62fdafd3b7e81ed721ee9dd9161a27da592b301c7c2bde3b2dbff8a51db0", - "558d2d827a4754dd98ce7397d591a02d47fc4ba7bd3fbf46d8bbf6f700cf8a27", - "05835f841a15e90c5a0b685875e4151c2f4be1ff3b587776153bf28fe3071935", - "4cf8ca10125b7bf7de3d376d6f7c23548145a428ba56a5d939accfb273b67bf9", - "d763e3cddb17c2bd1c2742ee0e742d6bd998f072c2329e88c01477defc590a26", - "ea456822a6d7aa3bdabcef2377051e3658032222fdc9306a9d61630be4ad5176", - "ae8bf76bce5328e1b538dadd9b1c3c33355a2f234a39b1e1a659a2d069f573d0", - "925eb4071a9c9a19a9d02b8d0643aced5c06a521f20144b3e6819f37e724d036", - "bf8e887a84fd425a77d5b4e62ceb56db88e431a35bb045c02894219e6d7e282d", - "071b77457f244ecd0a4d215918b698cff1f3918c4eed06cadf30747ea7d197c9", - "5090fb3b574a906ee95f7bb476fcffc04848a64a611ee591231e3738b22fc144", - "ec5659811909ae8f59b7024b93cbf1d0e3e5cbf4c92bee471f9bdbae66bd0d5a", - "a7a3f67b0ea56d248dd1b6bd075a2853f6da93c654f84eab65799c4e1237fb85", - "40a765d915709fc0e2a189f829b5dffe259756e486866e815b8e6b6359504448", - "1acec35439a2b3a187ea1a567c59f5d4ad3e6243db327ea34130a8ea22f2fba9", - "4f445f3e6ad52617e3afcc9ae1a349954ca5b8d575b86c2680dd2c366c21e784", - "ecdb478976eb412633ceb280554ed50b06c957826325e583d690839ab8ead0a5", - "424655f61355d052bde09134f5cbcd384bf11d41b946075a94092943c4952b65", - "472a3a1851266a9c1659ffda1004390638efb5568add710f20b70d2ef49aaea2", - "563450b27a34928e4e7b2c5912823c61e6c05cdfacf14143d442f4660b927c56", - "ec5e0bc50fe5b756ad5cd876af917b3c8f9ee62dafc67bd65797bff304100318", - "249170e5b4b8d0b23823f5f3ebb6374e3b2a011ac98653bba2c35e351f423144", - "d8a442124d700b7612973f419d2819cb29bcccd4305d83dce03b3809ec2b5fa5", - "85a8ea30fc0e5054503487e034d9da8326c9f60b000b54c7395c889d8dfd7404", - "b3ef28ebda6895143792d0c90e6c1831447fec33b6b5eda0568613d1a03b473f", - "3143733b302ce877a0f43463e5c85157b112d8491cba56dc82d73b96fb22cacd", - "63a54d8b5955cc6ab477d89729df1ca58f991f98553ecb13642c34d5a2cd4378", - "4028cea679451c118c9fd4a17a36820c9fdeee462911cab4e0230a8585974c88", - "c20e252b74813f340f235b39a39cb9e8985d0fc978b8399e72ef28257ef37922", - "0eda45c3b4157a0c824fa224020c42170a5d3c9e684e0d5ef593135b20ea8d28", - "c734db2265e904846e0cdeb38ff5cea0d3e95bec553353f5bd3cd93eab732278", - "eaa05a0e0574fbb164244628a7d14d9d47f1692941098aa737059d44104401df", - "eed10d895a26fc1cee0fcad066f7b21d4004b2b9a7ffbccd0e87f7fa362d63b8", - "54d9fcab2b460ca899b1352fd622d06307e30cb98d18ee92ade44a37fef21547", - "c7cd2ed3120b2337cae22a5405511b696de7bd5409c47ee2f63f7f03c40416df", - "49be5862d25bb31d2aac0ecd3b0040f32f2ec498b2a9edfcfe449a48ac2ca9a5", - "a4bb53854041b9e0e1e9594b7ef4c00b69ceb54037063c6678ad13783b887881", - "25442096ad970b620623c41e4f1295f9b74c092a07f2d96cde5bc4a44fe5ee45", - "7860ec539f1a32f1592672f22a73c88eeac05f81eb205fdecd8c8403dae3fe93", - "77705d1b99c4558d3e10e4fc1f81872b5ae7d1553a0706b2bb56387985c63e15", - "df125b12d28899d2525619ce560969c97045f929ce817b88097d9b8aec12adde", - "36d326cd2de83e6705fdfa4e061d59678783ddff2705e87b6695faf2ff3fafc4", - "8f9b3a948818f129a8c84b8af4b5ce37315d88d2153862fbe911b33cd507bdbc", - "8af1100e88c9116930dc35efc1e5843774d689efab3b940dd37f9cef36cfec43", - "8ff873462da05f0fea16a6f4badb6234dec0d89117787b6a3cfb72c6682c4446", - "6c98c26d1d5cd39349260d0bd7e79c93fdcd1b8453f9518103825f6c834d70fd", - "27492752017c2016ed612a45b178eef3e2093ae42dd8b72c6d4de10fac465df2", - "991fd2e749bee006d58259eff09b9f6e43752e9bb68ca3895900f7fc759c3854", - "beed08124c714f4c9f55348fe5f44c6fed10b1989d7efb73f3dd76ec8e069f9a", - "0e2b561d6e09c5a9e28fd204ccd8ff7f96ccc089269a7a953d0d1ea565781170", - "6f6bda8467b02da0a08e754bbff7352929bd0ab370cf9f3069d7353a94db43e0", - "2fbf59f6873745d8029c4a564d7d7cc03233a6bbce987155fb0cff493bfcea7c", - "b7a7ba2b995768ef91773d58b1404f18e74511fa168b1ab4780e0d1eb3ba6c08", - "0f6ce9c2d9163bca52aa40bac5e0420e7973422424538f163c6841f864943c06", - "cc6f6577c66ad49edad58ca880e948dd5ec94e17f840c4f587acfdd5b918be95", - "1777ec381f37061ed3b37b52745c3410095d8ba0e33175032c508b7a4a85fd0d", - "7682708d5be8134a0bf5eba0282e57fa40304bc90eda39fe0ed1172453a3f5b6", - "d3d347fff2d8ddc551b8ad6f53787310c222ee32d341f411f7fd19f425df0d44", - "a03192db9528c764c8e2a963f00540a4aa652003e66c221dd6f087b337e4819c", - "a157cf50296430059b3f8a3c80ffcaffd84b93d83924645913d7f345eda4d15a", - "303aaa8ea83ab38c976c508a8af508e9f1516ea334ea63f503d53a5910765e71", - "73db72abde86db170533f351cbbbf3b3057f4cb286645cf02389a3fc6a2e09d3", - "072558aa0909f773a3e95fb21bd0e72baa8012a18e8d765ea01eda64697366f9", - "09ed3fc65138743b187fa08a4c6e30735a3a7eef73228ea79bf612bfaee9fec5", - "51f3cf9ee295f89849c50d0f1d55bf6534776ec54e6402914593829a14e2785c", - "185a76064f443b1e298a8657b80c2800ef40d9ddfc50e009077db90a6130bdfd", - "84bca1b906a0b0be8e975339c0abe520d789d33c1a1cab477e5f1d1dd508a31e", - "adb57f47125ffd702643d5e67477aacac870cfc498ab394fc0151aa9a5a0697a", - "dbc1ad9a82c87a977035f66a4c8cd225261a590f3d11de66d525624d8489418d", - "1ea2728ec3d793e57d4b86c32d0835941fd73e7afa7aabc647b3ad46d706e9bb", - "a15b5910798e13b1d56f628acd904ede3bbce1ed39c49e096070d00220282d7a", - "6350a6cc16efc42d304749325994315329eeb4bd195298a5416472aa8ea41c00", - "8154918d0cf99e36a3005cdc31cc8f3ef966b51f6e0559152c179cebe405452d", - "4564acd199d45f8c61d4359720264b560f6c24a2cd5409cfdd6f891589b90411", - "2dfe8698e09b63e597f4b6eebf8f7412f72ab140b8523d4f86eeab5aa1e79a92", - "29a4b3de200c8fd5bf24a7f7aad469f558c4e8201b060ee0f5c96a5f30a04b71", - "beb3c0b7ed09f7cbf04c03d96736bded2a8ec04bf5eb3eef7307a4b98429e1cf", - "82957c31066b114f9e92bbb2610963128e3732522fc9e13a5e0a6ccf7d2b924b", - "4e4f405843bc57f8516d3fc1b2eb0177d7ab33180e6dfe2533306e997afba991", - "9b908ae33c31ff1eb15776d7b4aab15f04c2018605ca28b0566d86bfa0432b14", - "abceeaa3ef007d04db70e9095fc5436dd068bbc929444c9b7d0fd8d8b1c59a7e", - "200c392ae190c1722877038862cc5574d98aed259fdbf5bcff49b7cb6e4a0f3e", - "ef04f6c36ab48b2d6f564c145a560466bca1581198c39b4d0779be5f47244bbd", - "c1ccf03a56a5521cae54d8be1abe5965db34615c126d072b5d6d12e6ea5dd0eb", - "c913410bf467adb8ec6b2abdc1e851682e0977746bc7be49649f3fcb8470c339", - "43bf1ea03397648509fd03c10429fe15955b0596b352f53fca7ed5a6074c51eb", - "62521526e10a8e8cc93fc789cb858d9deb5c2e4f53b465e42ffd633356ad43a9", - "adba7cedec8edf582139034ea337ce096bf8537d3666dfac942b5c589a2bce6b", - "9651c77e53f0d9fad7cf390f252a4c59675b5144907213a3480b516023f6e9a0", - "8e1bf5f5e52ed48c8a7b2d3991deec8da1f40e94a5c18d3edb51e11efc2718ce", - "c49983881a4cf0a22dc6f27511a13c6c881ea0c9532ce6227ea7f77a5e5ed666", - "562a863e94a1b7ad1890bbfe83a0c44f911da18b2155ebc6170ac0ca3b3f2795", - "4a6baf8cd1f25f99408ab63f5dc20624c7e4ec1206b149c96f2fff3bf4633670", - "0ed8ebebac0645e02d45ca8771abe04e1fe212849e3d943f93d57da862cf7d87", - "6e46b7cf11a9cfc0e761984e5c5770ff58bbdf5d263c17302d26c653fe1ecbe6", - "ae34e5d96332907a214785d6c82a8515cad66fc8aa8c62856d19f06b0a49146c", - "cc94c3c69690809db05c655887cfaf570dd1f3bd8f1080a7d6a7127871d1e75a", - "f77333c69f2356e86ff74fbe33b19c5c97921098865720f1530bd52aa9c305bb", - "e4343a3092582590f8a6cfd4abc74713576544e79333ea37e0441ea2b5cda977", - "79370ee48a452d0a11dac530bb9aa028e4422e222bbb6bc8d4b1e32a20db9108", - "23f565fa4544e4c33dad8dbbac78e81137a947e529c84533da5e98b9a8ed9f4b", - "9fa52bfb608c483a8d235986adcf42b1142032bf02784557ffb2903361fe5bf3", - "d304fec21f651850df56dd9d183df94fd7b053bae464b9b5ca33dff69a0173a3", - "22659e38df18e0dcd38b46de005d81a238ea3b3eb8db61a58a22e77836a02d52", - "eebc4cfca24bae2e2d83e1e118b984f8b398639aedc02929449652c7f0967db1", - "60538018a2f5725ee450c077148c17e8ab583755425afe4223791406c9819f31", - "e3806f0dab85a974123094187b8f0bf52d2ba4bd806dc215bf4b8b9a15dd461f", - "990b7053f9ec110829e2bdd37ad54cf64e4dec11f474e5bfad034aeec5e0f92b", - "a1792c751646d9f2af010de7f11b68bed1979dbd39c7fc0733ccfa9fe96203f6", - "155de5c81ead47a3beca354a7ddab4cf126bea572816c1c373dabb764fbe3394", - "b5358f0ba9bf6cc79c334501f06adb162c065615beabbe210dfdd5e98fd01928", - "479801bbf92450086da92b3763f5a8066c4351495b9fd4cf9112136080dbaf79", - "831cfc14d62b43431f37d12a6fcb88b55f274bbaebd30b05e9d00f4ed6ed116d", - "a59357f020336a69bab2d01191732c380ec639e0ff29918f3824be062e127acf", - "149daf30c72dd5e9988431ca9ec12f92b19609fd4d13d455bea4b75cb9b6c732", - "9a9f9e112efbde07c2d2ffb7fb3505df8b6bf2ac551bd3551212861f605bc494", - "a0c01f90b786efa38e45c15ee3549f45265123f61b278364402a2b5cda90bdc0", - "922cebce1ea157fd6d432322eabac767ddf890124d49fafe50bb2ad253bbb25b", - "c52746ce09478dc2cb154fae0087ee35126118755ab65e20bfba6af173645de7", - "56702407740487090fefea096a1bc551798d6492ebc74f69a053f80954c5f73a", - "a99da6f6b1163742fccefe1b9cd4790a4b4447f72dec34ceb2189658370a0a96", - "6adebe4f32131c462a96fdad3cbb6f4054589c6f05e71c565b29aaa19931cdb9", - "3447d9af902f985eb396350f003f75b830384fdcb542ef9ba5e9e3c0edfe3edf", - "ea3bec0015afd4a48fdb57c8389f7aa3558c05ef5d0981ad001132bea658c453", - "642fb8fa5b05ca6cc0a3d59408af1e271c59454a8dff6618f7ffeb71cb541a15", - "3770e79b1e3dc63d0dfab72a2d228039acf63dae022c8d22262780258a360a99", - "5e1603a276ac4a5d3d35df07163f2684139d89f9515764af73f8b8ff604c0295", - "b2fc8634843d8edd927df563556a62168cbe554026635c2f2a12335ab02f3986", - "8e2225f12383dfa955d1814cb438eca21d5881f1ba3aad353391db49bbf19245", - "757c01d24fca16f047f4777cb53cd5b117a87793ff3b7370bfe2ccb025338863", - "8b6b659a5959da5e927e64af40378568a1c922307d6a67874ad5331238bd5301", - "23bdaffd29d774e1ed1ebbed2e4b8a1f72d3e5e9c221dfcdc8a69c4f3560537d", - "80dea52f01d84e2d57926820b76117fdd1c820a6c520324cad5426662e59b56f", - "47ef524f33d3bdb0232e7b05af8851cbd886bc1f21b0daa87afa4d0d690d2207", - "7dda05f1372ab9b848975b407c95c58f2f53a7c56d13167b55a4ac331a3378a0", - "302a06f748b4bc8244421100f419d5d75db048b3dd84625e265a3061eedbd4fe", - "23db3df9682b1abe81a7b852efc3caf8f70f9de97dee70e29142ed18d1dce733", - "a4e3c86745ea675db1a0a1b82c60b68cd035b2cd2f8c49d4b6e66b07650ce2b7", - "403195322d784f0e934c19f5d3d0512b559600ffeffa1055203faea66fdafbb9", - "f8d65229841dc3a808ac54c4fc2e42c25cc9293dd9f1328a7a2c031602ccd9fb", - "be7b73f5253642f5ba2d51c3a4ee272358cbd6feb0617017eb87df831e26272a", - "9f9b63beb3af626e66d015145256c523626179ae35d79cae70655495bbc444d2", - "3beeb421bfcca58159fd5206e571832c31282ad673364bdba71e9c10d73bf661", - "f7678c5701106fa86202495d4ada6e86e5db4351ff29f563267f88f192a7bd7b", - "4161bedc82f4113fed069cda6139722b6efa539689ae320be06928f4960993ea", - "e7e0929bff14d6cb6397eabb334b6970948857f4e7050147f042a195cf4468a9", - "8fcdeaea78d75875e20531e897e2912d7b64b7bd0c2059fe7e0f4e723b5ac053", - "a23cd2a42d81f7b3447a9843fddba9bde82e67cf30b048b33d68608c1ae8fcc5", - "e215a665e86f3a72077047e99856f69842c041930970ef69409540c2d9304597", - "4d13fd1f873ffbe40ce3fa655176f9eea01eced1a4d052f4815765f7c7d7fd15", - "35ce06b1efe8d08eb49c4b8c31c3d6e20142fa635a2982ed5035f844b5a76ab6", - "e16de054fbec6057444f2c96888528e56bf8f080080c78ef59e697ea6bade56b", - "62553fad97d8d474fb814373d2bc8ce239e1ccdc8456b9302a6cc6a23c9a806d", - "04abe5cde90fdd77018dc13bb4c888b8cbb6ade3cdc1ed68e7a65db2d05f098a", - "905b13ccc928597d8e3ca95b525ffd85b076e577acbfa2b567abcb4d15d0e23a", - "001680d73b1f6446a2ec4a0a3f13f82b4ee1563dfb85e9898bbd7559c269d33b", - "aa48d4af31422a276baac56052194f7234f3ce6ba79192c068b7797fc263f214", - "91c74b302095963f065e9add9865dd3aa14814057d95545b9c23ac18f346c6ff", - "d39d20d8a617b66e4bcd90ecdd9af2f5db8037d32f934ead795677d4bfb15e63", - "acd9ab058b82acc20140a5c37d64acb74bd5d2deeb55b75ee12c3656c4243e59", - "388eee0178553f9ad3a7e939af7c0d7661abb74662e98db58c327f9f879bf16c", - "bc0d24d31f2a6b8c6b84efe5ab6e59e575fc73d9337b3e4c79c67eae52469801", - "6a23e4581b1a170857e82472426e5732ce214f3e77a7552e84d0f5fb80699313", - "5fde43cd49c28f2452fa9f83e3f9b9b2b633499d92398f9a212b86d0f84629a9", - "3d55097175f6c2feb7e795a5c1adb1239dd2c0a020ffd698e2f383f2021b520f", - "57ccc1688c21e203695b7cc142bceb4b2b98e4a65575242dce0ae64c7d1f0443", - "27843284bb3a9464e952851e3d6d8a65fd885542ed5ba721d4c5c996c4daef5f", - "eca4cae8f5080280928160f7d3a71ca903367ca33d50f05f0524d9d77b931c8a", - "eab4814df0c57454968a6beffb056bb28e74ff7c54cdc8d136238b750bc19d39", - "02f7eb52a8d367ad15d89770ab4af5cf374b663122fa1f7d8734ec7d36882bb6", - "2100a7bcc0e460fc7a3192d7550cae810cdcc6947ca5eeab2d10e8cfa9452281", - "bd79a5b9e7b6f12dcbd5213a792b47ae416e6a7026c0bf2d7b4ef4929ac7145d", - "681e353c01aa81a163abece1989aacfcd73af7b11524dfd3f1286fe76541097a", - "53af8b5519ecd21ad4dddf90949d8f3bdf63327582295f55f55940e9331feabb", - "76d2ec2cc1851f798742965db05f1cc7d85301d10ce7c217cfe388f14fd6d4d5", - "1767c41debf4eb5e59440fd33033e487279573dc9e32e9a29d5686067596ddfa", - "8f98fe355da94374fab0a6e310a65b0c10a9f676f41392bb5a7ac4d42ef74e33", - "015797e79f07e56a19653fa89e4659cb245d116098e8be1752a1f3a8afd308e7", - "5d4be374447f627dc6586066af02e830c52fca98a5c63d327952132f63da5415", - "47dc54f413290aec1bf65e70f3cf1abe0cf31f76be9f67a4af799a87be371cba", - "74e9abb319486a671f9feb1d92bd665f087fc52b07ab69923aff06a2c942016a", - "4e5270769539ed030ad7b4d54dc3d48f402eec0a4a7fb2c920ab2db0d142b98e", - "5908fb1922f907130882892eb266f17cbbac68162ebbae08eb026285680aa94b", - "b088344b8928622f86815869de640761420cfc4e914eaf1194181be4020ab869", - "548378e9ce68891a98d1d75fddd334d947891d9763c24e60e7da0915ccb6a871", - "0f6ebf81589569cacf84b47b94f68688657fd419a415d795c4f0cdbebedd4090", - "d04b7ab81025287f01b189dfc9bf90d1722f5ec25fdb197608f19e863767c3df", - "646e7a6bae8c48922535120006322f93b8c7b9ae2b77659c218db4b5bd54c7c7", - "5fabe0452ef3de297a1739f4e18b04c520b36d47c3cbfb2fdc2f63fd7c195f8b", - "a51c821da1cba05534cc078adf5e77cb2675f66aeba0347bc2186c358b091613", - "e4ee3a4eb26bb193629ad01141ad9a5a56aefe314d30b4287e11f5664180b648", - "fd46bb495a814f319d074b41bf1573f446e15c1d0a43bea8e8e88bb1b5d57d08", - "75d0be50b97313fe3e8592c62294e671e19a04fde782a4364cd230234972c11b", - "96b8c2a8d93fbf7ec63509b3fea9d116c40fd004f896fb22aa8bf01ba998a67f", - "544e378332af54d4e324ea8f7e4838c56dcb3ddcdce2591526ad945fadbfbef0", - "344a3fdc02c7c20861dcf6c7cb8ff2e966e08cf27c0c075a11fd92046f1dc4a4", - "f681fbe9bc1fc24ccde08dd3188048ad4c72a9c8a2227e4c5b92976adb039fcc", - "6b422fcbe1b4c43512a28ed28247226a549db30f43ec14a0825eb09e373bb0f3", - "6c8ceba5143da95700fee74a6b8ec4c78dccd5033173cf455084ee4a8cd133c7", - "0e72f208b7749f1ebd499b9fe1cfbc2a71f161ecd3dd46078fbbbdadda7505db", - "942556235b4ed490b010de18d75862716669e0d109f998d5831de98831716ebd", - "a86d54c1c7ad736542fdc2af9bd6428d66cbf00ab93a2b6b9664e45fc1dd3cd6", - "8c8a06aef673fae89d2b261180cae9a8641e55cb9729bec9da372c70b5976eae", - "c4c19b1fada06cb338e431f0b6c7dc7f0ffc3b2ed8eb0fa6806f082bc5ebf863", - "575b59059435820e6cb437361672af85d3ed96463b4f48fa9f8ec47ecc676807", - "c68a3c058e9d28b2c720e8086f41ae6f9b4ecd93eaa69186570af46b84c20d64", - "1e5f8524f5a8488d4926a4f5ddaa69468c9799eaa9373038289d6bc136bd1b1c", - "7c01970c3a5cdb0c2436530abec742d1c0829e7397356306500a873c833b6cd1", - "e5c4d062603f1734b8d7e5d7bb0309193dadbece49627945ff057d9033dcaeb8", - "860e95fc2eb41f6a579221d25d88c23bdc9a08e13228139155e33171fa8bd3f9", - "93ea384ac9eb9e31d46f5d222dda7e4279cf5d0a77ade3fb818172dbc6048e38", - "b56662d184db8450484d2b074128ee779cd7f9b3763fe144ccea499d9258f3d1", - "ec295da61fda67a9b09bf1f5b8a575fa51c84afe5147b4581ded96ab83edbb7a", - "0836b60468fb633332f3294f095a03cf12d1ebdbafddbd351cb014b4a5fd5f0c", - "7ef09fed3a6d689ee385fb619924220e9c2bb83355e780ea7465500bbcbe80dc", - "1bc5b5b48fae9ea9c44bff1325f7178a35338f2297f06f2618df859a2b77fa68", - "4c5b16e99e614668278f3196d714cb97f6ac2ed2f0ec0f86196882fefc3980ae", - "54c5ec4c1e10599e4eb6139bcfdf5126e2b309f488f02d16a57781919ef07902", - "7b4f188e91bb64c0ee27cee01109f222c809a019520e1e90df08c0ad1c1a39da", - "ef703727964350a5c1cec801abd645f58a7972fa3367725713e2872306523f89", - "85a2f6658a9c704561feddc7989febb1f339c3b9072734ec80e3a95d1726414e", - "0668d5b4bdb4ae6a71a1319e769216444b6b6cc30fc82fe15a53dfcdc08575cc", - "be1f7aeb9c4d1e7923a35c3f82f265e6b8565debad097f33200500d318a85145", - "df08c6020c5170505a2905097d41b7f28b208cb004f79918009cd439e38ca7be", - "53b82281fb928bcd12f87569dce2bcb07e531cde84ff2e7125d03e79efa4128d", - "17921133961edb9c34090a7757bb0d77433ade2c01a783fa77aa260a0c01317a", - "82576eef23735b09bc988322bbbdf1744a72c88df2704c55f60f659c9b1bd2e8", - "114a49f8d76a4b486e0f47fe37d44629b62ca0d459873de6f38420d6ef20bb3f", - "f741e0c64d55905800a369495f41bb3e604e45aa87d308ee151937239b8c4af9", - "c20750942ae9e99f700c2736cd48411715df3c4e71d19a4651b5cb534b6f84a7", - "e847ab01841732c050702ada4113a66c19b4bb2503be5d79735244afff475767", - "9ffa6189122f9ea425478b95cdb415bc20bcd7d1cb135327d197b43c02206de0", - "e23407c6b881ecf58af8600ad627ef394f8b995b28696e1b893f28a4647b67d6", - "422431703bb142d65a919423a5a2edd2c9cc5b024b348c01dc5434884f413abe", - "f7e0605cefe71d84aa3594ed53ef53e7b2feded5aa10629ba6efa0968a9f187f", - "f1474e7e9015bf5ca97337255b377edd617cb3a430c36669299e1ae933da85d5", - "3048edeff23b45dac7cb75b92688550d61eda9c4632fd4c5d9fb21c810de0410", - "021aef461d480c3aed4e05491c642d230bfe6b313d3d708d0e8d3c9bafe9caf5", - "8999fa2251897171485df06099f7f0584b5a7a2b60a8a511532a2fb877680627", - "8399b9660387ee413b8e02121e998988a4b37a67688c1886eb98e3d9dfdcd7c6", - "004c9048629b1121073f654c5ee4649e18d988f5e0ca54411be914a9f3432987", - "b5641b758379e4a5adf229e8a974a1779b5ac288cd83bf2e5ba03188e713f098", - "0cd6c5f37fb0d8e824979c79e943065658b8b81322291cb48a6b84033bc98c06", - "63c239c215681b61f02cd396651b929095a208cc663cf5f67a87eb4e8a3079b0", - "aac29be8ac96cee347a6fd1e5efe655db69cf832b7b7f0cae1095adca041a32d", - "e5456b0e528d63634907108b35f9a08190baa4d587e491cbcd6460f7af24fabe", - "f714c430ad0e78d2a7d279376a980dde70376c024c7ddf1c4cfc0fadfda7d629", - "f7b93515fa048a813f5f1a6dd95941d5adcf08ba5fbfdd4543266f20ea18f666", - "2d9916ad9dde026d9b2b1c324df8ce3bb096e119d8adb4a55394a5e57a48db6b", - "526b720e98c3b79482a62baf1c0c7a7e63abac31c83f2a5f372721560cbd9f7c", - "8f8bd32e219c90853950896d332045b6b5623b9d003af27a7c92bbdf2402328d", - "03697aa81f6a21b6f14221a175377a91292380930a4f96df0edd88cfd71ee17c", - "f5af014913dd4fcfbc5c1e6d4b36ea562c2a1ecc21661b3c9ceab4f155e188e1", - "e0cc6b60180f6e75fde4d22868fc4618543755bb388656363af168753da81a89", - "a0986a6a2adfebfa575a201bcc35f0eb8f01315ac47f25b7cfa64a9332ed5b3d", - "66891227896b06fe231c7eab6c70e61257f89d6c18693f04df81f9e43e642d51", - "ba3559e7b5f6b34476c6fb41cf56988bd78d051669e7874d8f31495ec847906b", - "ea53b021068eb5afed504fc5813b0980ea9054248d7739346384a56ad81d7cf4", - "aa3b522b810ddf5f83e64ebdf991fd03cf68d895def5e356c033f5fa93f6ba86", - "757478e10093555b30e1c3ab423f3e3c2a1ebf495f06a7c3d1a61eda5019c774", - "b1f75f81376af351f0537ad7d8c1f7b53df9f6889a35138182f42d781c3fcfd6", - "1b26d71cb8879d1fd46f5f0a2a0992ae938a31ca991bc96c4893dde49fd8b240", - "7e79ab3b86a727713d79b8b3d557ce74805962e837961cfcabfe33a45b7bacb4", - "95da50abdb8eb1ec3174d5465f2a6e26d532ea6ec20d8d401a0cc38fa8085c72", - "0a95205229397ca0d05cf04805ce63e89bb1cd04c824467389b589ab392324f3", - "56756705015dc60807ea06c44b010a420bf7189c7c885fe2a8a899471ab7a28a", - "ce65e25a0a848c63997e447c3ccaaa8989ca8e7def35a877b57f59b2c75d5038", - "db9ac444ef008a45957131b1e7ca592e0958fa6aa1ebf9bee144daaeaaa7851a", - "9eec5f83495ab66b6dd06a4c834d51fed211a23f89781c3e3ed131b357890c45", - "16f6242d9ec785dbaf7c168861e56a301235f5157de7cabcaea1c2287054874f", - "beb8179bedae0492218117aab2927e0e6b214d7311eb7bf5ebef3cdd68fcefba", - "eeeeeabcc71bcfa067573a6d003c5c6289b9bcd593abd309c0f2dce5892296e7", - "19a9f986b45a61cca122f44cb226cfeec2a52e290f8605d61ce81107c9668996", - "f905892666a459042113f56975b446a338364df712779efc2581f05d47bfc91d", - "9992c48c5eb22343f701f1889d5b909e13dc5a73d2254a6eb1b58141bce922a3", - "68d2d7eb839ea5cda04f3cb11a7735da8ec6c0119478719323e3d81efc6aa608", - "b9bcad12a3dd0120af2e1fce562db76528289cb045eaccb14a4ba874557b8a03", - "386f55c183e1787195161ad0e2ddf13f8fc6bb40e1c587faeaedf655401575bf", - "ef26c287d22054dd47f28cf9e09b46bc08055a72590e18cc4f0f06fad17ae1d8", - "ccd17de5074d1222d4c85ad86fefd3057eebc9565a608afda1b397bcf7ff7bd2", - "f8b6ec481b5473e467d51a324ad2bf1ece1c00985bd5e29cf499f2445bc5f0fc", - "446bf4ba8776bf4f6f47446a25419fe5355780ea427fa2d70729a60f3aa3b8ac", - "07c4e922097e228622e1ba46a0657a452874f1e91534b8bcf9b91746e8e197e6", - "ba7d20f92941a23939eb30587c9b7c593b3fd480e61bf861c59c8788891c0333", - "cd6a537b23071e93483803d7e602bf256304825a506922e85b0aea5b1dc65d8d", - "a797128882ef8541e1dae3d8e1fef1d3233f2a2c809584c5f2b7c2a925e9d853", - "a45c29f73bdd8edf2ff49f98654ecbc7af7b5dde830c238fa3247cb1220b6665", - "ff747ac232d6930faeeae0a0c88c6c545bb1ad31e130272b9da64b284105a4bb", - "a9670e73b38cc860fab866c5f47dc378086ecd6fc4a7c05db2dde2fd1ca8cc5c", - "58b7e106660d4f0fd06408b4c44ac8a480f077ccfc0666c4d661c48e7ca15130", - "ea612c76394c881b7f803538aac71bd50f915a72945ba68ce40d9957644e02f8", - "fbe7e68c41f64f92ca9cabbda81f7873810396e7151a27f2a276d70c2dab65ea", - "db2225ae4a2cf4e42e7a4b2ad0ce6a6248c0ac9a1c692885201cf7f9446ae780", - "32fc761f571e3c6697bd06247b488371d13933366dcc335ec2c3ccfb18293612", - "1c65ca027f29e190ea6cd79b1f4f1cdd4a8113bd14c2d9a8ca86387d595f6eec", - "37d2de9bd053061edb0c4b6d58d517f3cd62a5667b7991174b9a1084451492fc", - "ce757132f7c656b73a3f46c1a99c09e133671eb0b790f1a9c4e297aa1e9fbe54", - "47bed14303800fc496c70dfb2e255e61d3544a6f0d13c5b279997e1d9804e430", - "bb02121b5431c1c7f7af21d8acd2ecde8ee09ef7cd2167d1243eb77042b0c698", - "62be3279a312f7d1810ab736ccd7bb18f09236a5c789ff0d0449f74c7d5f2ec8", - "5e9d390411ac0ff40ed18c5891a985961936c9b3c7716e015f1719efbc0a003b", - "bd9adbc83fa8bc09b802d472dfc61ae1c866d9d0c977d08a7dc81a9ff4ccfc61", - "0445dbcf4012adda4106448705da01e0f8f7e25b01fa6c2de2e5797d6a790a63", - "7ae9e50bb09ff1ead25433fd46ad1a8bc03fb66c1c5092b613e44857743ae446", - "f2cb8187e3378099f10a5bea7fad0db095db39338d83fa1fea491ddf0f428c56", - "7eb9d017611d55aea5aed999c54682bae119303fad4715a7ba32431f2a8f6342", - "061b14d3754c976ea623e3c10c87bd3529273169b90dd081f06394115c200aa9", - "e1979531df4c3bf3ac57161a914cd984c699c323bafbc589d1f37427e3809c40", - "96f80fc58d942667d3554abd28915fbb33a8f96b5853493021e18ae4d749d60f", - "a1cfbd653ba788d3945bca47b850434ad2fe32b83059c7c7d0d1043569a7b1f1", - "f16ebcffa717c5fa93050de213baadf53670ff7c4fa645d2b838c579731eedbd", - "afef657308d0d0011e0dad6c169afae961a5a70d792d2ca593ddbb90934149b8", - "10b282986256b23d12d6de102ef832c4a2ee46f3aa04dd03ca25372609cf5338", - "3107076eb3bf5b34576d2824e6e4d54d41fea325f6b82400c6fda174df09298f", - "5382c4ef4202c379ab40f3aa7f092b9342891d3cdc8060bb5d7c1dd2905a418b", - "3447506fc61948d0020cbf890e062fafa75dd9fed0ef0c5830a59239c5851dd8", - "5a2fb3cc0444311534a05b373a4e59852060f49827ad1454a3a948dee5bcddaa", - "6e46337660ce98dca3494b7a8409b2fb752fb1edf723797488fb0af64c53a898", - "3f44b4e3938a1713930db823891dbe115b2d2fe8427bae39009eab56aba058e2", - "544596c46993546b28ec06ba5ebb74e85613f0c982fb08ba31a3cd013272fc46", - "a66d571331a4bc804837b523f72ed73aaacc21f8582f5960cdf1976d77738955", - "737b259cb06eaa5a8edc167542fd5c5b544aa47906d463762813fe70c5194560", - "b5ec50c5174a9227914e59eba8a7055e3481e5dbca6e895c6999b9a286b8741a", - "e2379c924b38bba1014b9d3b70b63180a759fbdb7320f87c074e26589fc66e04", - "c8bc74ba96ff422e7cdd1990a1802a1e4dd0dedb5e80160692a34e513dcc9a7d", - "2252c2269b4530bef066eef4800d366946300b8784421e7c25379f66b30cffd4", - "e4e64d61f3bd264e87db1b2700a98895c9dc5024852956c300c8db3173366a2f", - "da7843f4bff3aa1cfa28cdf04f82af8c4bedef109b595a7a16bd9b8d5cd8c4a6", - "fdfebb0aa93548b794e28678e2d97d6d9b3f0f80ab85599290d4ff156a1b69ca", - "c9922e9afbc27073229ad94f4e556817038f4a254e93891ac251195ad430dbd4", - "6493e2dbde5eed91af7df018a986b4a0948821f3bfc36d708ac214a8ea1969d6", - "84c65746d4ba296cc58082c01ec9519ad5e5a13112a121ac2a89aa0e82b014e4", - "a7405679c5174fccad06068ce495484be7dcececdd6ae745fa8ce2762dc0a01c", - "f089d4b552c1356780c90fb0512484fc7f3b62fabe6ad875c7f93ec4dcb7b0e0", - "e40da5b2f25b207f3867117d07b97e5401d629874c98c418220721d0200b1c6a", - "5a9cf4ef46c91b052c7c697d9e72c71a635e5d3857bbf4af1c354da5398ab177", - "0706b941bc0bf2eafef954f935ca83146e915049926961dab5e89906bc92facc", - "4c1c3ba508f0ac3d25cd29c1bccd232d9b26731f766c90d2b7cd963d3f70b934", - "7a8d0e19d676f514df2f089c59cd59c4e7d0f1444a894041f0171fe663d2fc9c", - "1a4b36c5a2f1b98af6b411de542d32501e02169da302172bed909ba4d39d2db9", - "0100e8f1aeef40afca9229d49623e54c64309ff8ca9bd044d0be9224feebed0f", - "a49134a2c75d827cab6d842626c67d5939d3059b91fc0c09302551ab1452196d", - "d886d4592d3bc1660d25eea250c4ada3386de473905d275d364f710cf45c6a51", - "1d6f688ab3a1377f72ccbe1b807f9d213b4559efec01addd1d4e669ba3b72534", - "8bd41e448ca9681eb9065a65d4a20d4e0ac79900e14da1e9c1d78b0b2ad2cbdc", - "1382af5637f689c3c1c3d0c420a7bf40faa0650a21503fe2f80b80ec6b44f198", - "8757b9f01e002be99de702d8792e7fdd226b62b9dd495450ba91d3564c71cdf1", - "7d61ab6af18a828d0d8e0f60533365ae53f4452caee505b005fe9f64e13ad753", - "97f1b1d864658d444e27f3b2fb897cbc017ecff09e7cf2ee3d46d0c39eacf1b5", - "312e70fce27f42ab044e250037c54257e25348a5bca4397e1c47febd265ad550", - "2f5941d43eae2d7f70af132d7870855625fe0e06342c35a60678af4810b78e38", - "a96eff5eb36e62032563a92a0447b2164e85b1d19fb9ef33cc2b9440858c59ee", - "0fd3f8a655ff764b920c7537f9107f9f523b3e1eefc918eb883279fcbbf679d0", - "3f847f345c60b8d7cf886a593d9faf88c52116bb4a74fc174d691e4e79b7b2da", - "624d54f6826c54da04b6ca5db0c4b4ca11d157a14592bf5dbf8df775029f6ac8", - "e90393501abc55178138b8e010d685f537ecdf2062158b42682d9a4a2241a3ad", - "7e2a5d17ae90af1a061edef34ba949855d8c319223fb43788b32284faea2a555", - "5dc7b9444dcdc8c9fe012221ffd16376a134a19a6dc356fb10fd1ca0328939fa", - "68e4dd0d5854d4bdd1248eebc65729e5b61ad5bce8f90ac37ddca8b494a5df05", - "e88764ba9242c431b72e8b3a1b63360934742b375f5c1b2125b65d6ee6d1d381", - "95895dfab4439b78b50ebae8cbb91252e0ae3100a2113727749757b476bff751", - "970be47b924a80bd7388ff8e1fe72adfb8bf9cc66eace04f725a6e16205088da", - "efbc4d9519b0023e2152856b2b09ecfc4381168c88f208b16bd11d98620f9ff3", - "2f7a4572f9ef9a5a76e8e756755e742a2f41ec216e475b0d3de76427c09523ab", - "3d1f5c801409a4a48c705e0e54a7d5daab55905cae736c431b89febce4648086", - "f95f7972a820831886d3500b209e9edfc6c1868809c857fce6108a7a4a9b1b9e", - "d61ca08bc12a48eca706d3e342c627a068a39656ffd85c713fbcd54ce3d93e2e", - "65b177522ae4b9b9bb0b7d1a80a85967bf78a51226b92d20fdc98a5a7aa24455", - "104a01456aa420b2562e3b596927bacdb3dc41db96df921b71fbd5bf7643d0b0", - "463c4c0cbfcc2ba4803400c6f9dfc5fbfbca52b7d654d629cf372c021dcf8cd0", - "99e0a9336fab233dc7a367c7b48f16369e558bff312ee2e3ccab245c02aba3e0", - "c14be145eb8a1efed4759629b7d00d4b687b49f9323627530a90176aab94ee72", - "ed0da3f567eb2d1f2ee8990b8c0b9e2747f09a7f4fdc98c24eed32087f12c64a", - "a8f7c24a6c9678d0695e6159bb3c1898246128f0ccfe6a756a19dcc64ac7b6b5", - "bb96477f61aa96a74db06380a1abbfbf37b4b68d0ac64fa3729f416e974a4c4d", - "22106418a2dc699a0d5ef7abd25b74ead44e9a548e38c4684ce99343796244e7", - "17d335d5ec6230cffbfa43130bb8549fd3644e734e3515ba81ca0909e3c1ce2c", - "920ad1be0d050dc800eec9f4ba73f263ee34ba68c62e002b93c48238b8810dce", - "92a891ff10a0e9de808d51e46bcd43b0c0d2f95339da0b41481b3ea8a4ef0d4b", - "d1c6f843c195e3f2bc86004e8df6bc210323d5c2e8368e5912b7c5edfefb52d8", - "dc7d8da68b12f4046bed5174d81e19f120a105c8d37fbb7cad8196b13aa28856", - "f717ab16610115c85731d064724d2b4206d889b409499e10784817ce2038d6bc", - "41058374e86cfe14951c99ac1f32d0b41cfecbd50e1662cb515b68d205c51eb6", - "bbeacaa647453567b45d657e807e836eaaa59941b704504f2284ecf58be572ef", - "a3874826a6c8dbafa2fa1ad64aa14afe8d2bcaa9bd0f185d9e506025f03f55d7", - "832b0764dd99da5a05125d8c76da54955cc01752048ba5ce10079b45740a71f1", - "f55c33b05c57ce0ca590f78aa7596163a82b1ded64735b69954dcc5a015c7065", - "3b6d288a86446aee6e2ec4241fb6d02bbe2da04eb70157b6cbdfb4b1dbb49320", - "d63364e474412baa5dd726e5348a3cfc9b436d092d7181371a251386ac66e9af", - "24a927414398fa64c3d0a6480919a1c5697e62dfa73c753131be62e8c33ab498", - "7acb2fd1d3fc9b78b806755b160c012e248fdb10652996be2e030bb6206cccb2", - "707389ce99f9ded863b331330af7db11ca2ea2f53ec46003a8852d4ca568ff2e", - "e55ff87e16e7de9d4ae57333828cbe63c5428b3e4aca6eeef95ec16c25ec95b5", - "f77a5ed2f1213ef4a0655040e922aa3e19722a321c237b6d961ab185ac9f2443", - "b819943f0676a24d17d0f13e82f6309dca0c40932dbb177fb1cfb151d644a601", - "67e1cd26871f2ab99f740d98d34fbc2d04734d72110dbf202522360959bd1dbc", - "4e8a96885665c1608d9230904797308e2f2602bcd6729ee71a8c14b8a6a014d8", - "b728a3debf1dbcc8742802851ef19bf3949bae8d9649832664d9e1123d01118b", - "f114872a8f03e68f155686e2f0dbdcf10fb8cfbb776ec41fb189613d94bb63d9", - "4b20422319e5f358f59fde61aac6cbe2ad962a8ddd92bef1e43625f00d5ef593", - "4094c82f625f6ee8201ff0ae5dbd29bb5f12efe340a0dc3ac49f33e657366772", - "391192c491856a54a5d74974edb9652c052611d3d020f0358b6660ebc9157785", - "9d3808c735584fa6f31fc55b123d570024069987bec5a9c5841c26db50897b80", - "e3e357856787f892a8caa74db05a1f12e0728af3bff4c7ab9707c2ccd5b27d6a", - "522980712a55ba5bc493125d379858e1e55be287ee04773937a34a8a85549bc9", - "2a245e37d1b85c3c60a0c8fe7a188e55b4749a84729d2655e832a3c1de4bd816", - "8568e48a8882c8e23ca1f950e9a2b0742adf3198b1b5c2b66c43b6b58b55c787", - "88429ac851906769d14c0a3bfc266e603d731dc89202bf0a798ebeb18c47c4b4", - "032372ef49d45f05fe961ea191c33ab3f49582e28d84dfee67d43d395f500484", - "85fee4303615f37adafefa16018e4bd197dcb5836c7dc271f56baedf39cdb967", - "d07a0c598d11025fa8b43418d39c2972dd63cc323dc337ef71e3d5f0eea8933c", - "f81f0c0ccadd22d35f298665a3205c3141eeca1399e02999fe54654e478254c0", - "8c65e03de3fe473bbe0f001e2c4930c9bde3a204e8d488eaec9b2ed4c68e555e", - "1c42b87f63d6aace4c6c78cd72dc3f0a004c9a6946f7bf0b60057e827f2cebfa", - "8e8721283d9478d2a46a07e44befc0cb8723c14cb01386c46a59a017ab407151", - "1f9520d68d126e0fda13f73380e8a5e682df964f18b903875dfe9a32d355f3f4", - "88e90d88bcce927e46c885d969481ce2fa6d66561fec29184a46d986bc37716d", - "2826782e5624078dcf11097b315e2750c07a681c0c14834b5a227e9c29768be0", - "5c603d93250d9796bb2a06152a6aed75d8ba43b6035dd5a4535a4bb93f309f52", - "21bfd94b42f0e6c043695a87c98efd5de08fbeaa3d57b0df4cda7088a0ddab76", - "4e46fbbd8b56b6e454906fd5b999f59da7ef587693d747046ac402ea965fdd4d", - "3502b86019739f271662af61020a69fc45c22e6d14749044c29965b3c633eacc", - "1501b4cd3ac7c71bf6b66df5d29650ebb4c4ebea00865ad31a4a41f563b23320", - "b1e8c6c98c5ca529be2dc11ed5c72b09b811bf436e9d5f38aea45eeabf7ef790", - "694f8dd31265b1bc14e984108762cdfa4276912526dd1687ee9755079df4ce0a", - "c36b38e9cc2158562e327d4a1f123f4378e9d3ab3cf9e3f6b5df1f9e0a41cd0b", - "64f8118f1e868bb784dc9abd398860ca35c3f6c110270c860b41ea6bb0ae2da2", - "4924ae4452d2890cb11ce5da6639c5d27601d9dd7a5ad4446e5cb134d1c694cb", - "5607e97abb28b5aef0ced9073d259d825899de7db146f23c3394030cf5419fcb", - "fb62a4b777dd88101423ad044638694b8bb3a80adc61e912806d7c1c9ebb2b8f", - "8d514ea20dd4492a7b84f2b239f7d9e089e998ad910c16510824306c188b004b", - "b50760d6f14bee11c397226546c951218cc1fcd3a27b3e6dacd2048e3ac4f116", - "03a436a66d6ad446d13a3448ed426fbd55a040edc87e9ea5cc14cb035a59610f", - "03ac1f286e85972d6f6a77c30e736d4a4c0858033b92a99e734216e01b678939", - "b18e469f6cdaf955c6de872b241068edb9f8bc7ca8325ea1e9af8e8bd63fd758", - "51d47385533ddc6ac6bc8d3bf4e8f14b67b3ca37b2262fd2f6eef47346df55e4", - "b7640712a3cc056c4a50a053921514d2a6807f7525f08ea7a4cd5c3111de4392", - "5750182bd0935b98508beb61da52a2c1a51167cc5b2a7af2a2dd8e751000b9df", - "332d01277f083eeefff6779b39ae9af0ef6ca25ee99c4ad7b9a2d0c0ce97d7d4", - "4571fe46779bf68675d88695276568723413bf51caf0dd40fd8a0e1237c60321", - "2079981c2cc3cea936e603d1f4ff58b2cac816a97c3428a63fbb8a1e3a2b09a9", - "1c3470ed47cce0f754b7942b0b1ef5bdb496fdbe2d647c9ad2624498dd415474", - "0fdeb3c1b64677c8d2858f4b075c7db3a8eb014f4280f509659826c75a3c5650", - "4df899c3307fe119ff113c17c023651ab14ec95c77ff33210480fc430e79fe25", - "804108f08c02ba49d512757b9a7878910afc1ea51fed79de8ae49b51359dea9d", - "a042c1bbc1a2d1556e9a63a294b6c9ee467e69950271e2a1cd9c259bffb339c9", - "13a912fdb6a8d66fa7055d8d92d928f14d20645d5f88ca548db3b47e7ed86bce", - "a3c0036f66549134a552181bea924dcdebad5a2fc1f90ba38619b995c976c619", - "398aff36842fa8f314ae6dd428f9ca00d6449ead377565c3c708aa320126542f", - "b957aeefe576828880b916abfbb04e8b846c0fb04f86b8fe1e30f05918ec6411", - "230438cb678e57a585ed42d6c21bfdb56731a0f1e4112c0730569963534ea5fd", - "b1f31df9dfa8ee59c1f6e4d4e8b336bf2dc29a767675ebb5d027c87a9090f697", - "b8034b3aa8f3654db37e4a058f36c4a987576c2b517e5ba72f66744285d646a2", - "6cf5150c10f88a0f91696f3bb0d82f55247dd9fac3f1dd640cc8622156d2112d", - "1ba81de3138f1e1c04775b398e2df7083cea716b535bad5ce90d5c4bbb5e9d32", - "4746521d66d08c6d1b19debdd265f9ab38b83fd904d6b525bafa641f8ea04673", - "30d0aeadc03ddc623e68ecff4ecdd9a4c71ca8c8729217c94b4d9e8cc6562e3f", - "d1d8c307c0bd6c6f8c91a193f1a037b72bd89191785990b760b2bb3d4aa008aa", - "acf55c823adcbc35bf30a2e03220a896d2ce96cedfbd7374bcc82632c6b8070f", - "425137f8bb00536eeecc39ff89db5b2cb145d33073e7174bb497bafee6fdb07c", - "5bec2af5542404fc994f04a63194a261cc6ccb900e59ab4d2d68fb99b05b4107", - "58014cbdb3df497436cd36a5409b19739ae59b1aba12ef065759d93509e0fc6f", - "7c23d21855af0274d9b313827f3366ea9a5f4fd95be571b73c9e8c27ae569dd7", - "d58722f094ea4d4949f1b86d257afd4cc73590bcd521f10567df20ea09ca6cfb", - "90e75e31429ea4d1a162d9fcb39a3de1af78aac724f454b1d8fd24fcc2ea1a65", - "eb7ae432207bb57d55e6b87eee2aa9534397231ec6809b8c2d41c0c001b46c13", - "708c0903999b66cb30dc7b10538efdbae557431744045fea21167664d0ffa81d", - "0843c526893563fe021d7fe91085fd9f218083525fafdca176c93dfe6ac2d8c9", - "6d7e73c48d755744d1de989e4daeabfc194a07a71152dc740b8ebf0d558a44cb", - "7089e1aa82929d7969689f98f434b75ddf7c97d2abfb0558e71172ec0609e3f6", - "c53fdec308be6c95123831ad731d6254c69eddb26fb2e0770813997db1ef07a5", - "e0bb50de67784a90c87fc4df976c82ab8c5803489b5878b58fa3b8b8f359464a", - "9e064ec769f30b05dc33b2b8cd0e4c96a5b316b2c0a7e36939380ebacd4c3780", - "fcfdff6950d4158ac82e13bbd897e227b084acc959e4da4109640f0f43b80297", - "c1734fc2e6aa70ba5276ada7ba8db4ab9326c324f5b8cf183040ca5988b69fe7", - "c0615be4b9f2c2fab12e17ffbf7e022ccfdf351d4776940ab32baa4d549dbc67", - "1626fff51c478d60b35065e997a6bba7efdc7d7041122c128ee12e777a076550", - "38603fc50d7aab7184f9be2f16da61dfd632ae32e3fbdc5b75b53a1a74e0cd5d", - "c48a2992b9fba8e17774841e580675b0da55d7a200f567bbef64cb2fa7d80c79", - "937408b8f83d87b821816d4b73de36057aa4e74155345391936a515a2b0910f6", - "68c80b691cf494c5ca55adde904cb0ff6d6093ad66222376d94b4f868d6b77e6", - "5178747fb65a02f0fbf03779a422c8b699a227e50e93f22aa214e5756faaa02f", - "cf2bee79b646804f0b87faa56168b618ea2ea1d7c97a661e7ea961d21cfdb58e", - "10541f3cb408da4971363029e322ef650617c1a0c1df89638b006e7728df90e0", - "c0f1dbba8b04ce6911f908a67dd5cea3bf65782f05a79a3545f1bfb232ec8493", - "65e956330f0c4e99b8df8836b181fa46ef86e17e9cc184b8e666edcd4dbc41f0", - "3f5c1da2f030290b5a03274a84a7fdf2c26a836aeaa127b685853f088c1d685c", - "9ce74bb4c36008481d82fa43786052cf01143486de20c9f885fbd1fa6e82e670", - "7c366290e03657bbb65d953db09db84bd6fc7c9229560f67b1861a2e99e3285e", - "45b30f4572590c6f4171a8a427956006da91183865ff4c355c20ed40648ae5ef", - "0541fbd74824e2d42b0f90cdcfb3d4a2ccec525f30ca231c0b10fa1be2e87064", - "337fd606bef0520e98ca78117bb68997a6fdc6a24066cdb08e8906617b5e109c", - "eb72b6b6549abeffc54630532df19af49086c6885c4b6cc0a3796fbe41686899", - "c7f3cc031135929eefe5dab58ecc3aeb68c0f141ac9e37a33545247dd0f68c39", - "070b1346f2f70bbedfc48a7f3b3a14e68010d7c4baf80f13db837198004fd033", - "d2860b4b26805ad2f835f82bfd33c06c913ffd779f7231a028e4f334286b7fd0", - "03f8b420aa2b371e394e845eb53ced0dae988c77bac6ada967da3f9bd4d493ca", - "3d9fad58d5cb67db9bd94030809a194f0bb228ca50fbac9b57a98ece4e6fc2a9", - "e1a17ef36d4ca82b3ab3a60f434a8b802a1888b64b9a0b98ace843c5ab319269", - "67a56dbd4faa1310729708c0e7da0baf00faba2f64cd46c7013a2ea8c71029d1", - "a6c763dc14590b6317bb5000866395ceecc288bc8c2cc73ae41cb653dcbe2248", - "1cc5b21bc3d8273593f24e35867a1c24da6f0d8811dfc1ff12eb3d62ee82996a", - "bfb7432215162fdff4f1ab3157551cd1dcab2cf5351083151ed6b2851d651669", - "188ae8390f9ad0a5da6a8a50c8c60ca165b24544375d28324246a3d6781f1198", - "7f097005902da2467ab37c1983cb80c251e92d9609ca19eaed8cf8703e7b1f3f", - "9d5b14cf2edae68b2dd971958769d83f7666ddca09ddd0867cee5ed077c63ec2", - "1111e27eac78c96819913c23554c68b5cb268b5565f6b9aec1874f61d969ea02", - "a2341e02cb062d33c0485cad487c9c242999d4113ad838d42c81667fe90e4ecd", - "7c2a35bc5cbe4af59f4238220c435d4c77cfb1e862ae6a5a91f0876beaf09115", - "d6b50991bc325e1ee76ce3915332d62f70e16509fb1f578979adf9f5e4408955", - "e3dca9f50bdc91e6076759e8bcc2c70136bde910259aa9003d043f28f03feec0", - "1a4de06ef67f80f81932320a3036d6732049949cf47860d468be0ae4b9bf60a7", - "9d002edbc9b0e41ba460857caa81e158dffe8b9b58131c628a53c5729ede6324", - "c8146626172e224b17f6c0e735e3f202d02c004d7f7c98649b3b3eeaa736bddf", - "dc736871cca09ccfd391cb0873491aba182f57f16d742cc126a3c0983de54c66", - "0745031edecdf252e62c3d69046ccafb3c74774d57ee3c1ec0308d06bc6cab3b", - "beb43e7d839484a2fd1697edbd5a285b05d868fe4fa7d07adf919bd04833af3a", - "454ffbba384c98c8213002f2eeb537605fc9e55ca18a11252cb5f74263a4c0d0", - "0d689af67c6a5da254b62753eefc5b22135be8caba18270a929fd120869cf5ac", - "3423ee3ee619f3ae32f0cd34533200a58cccc3dd4576c4ee0943dfc636af7f7f", - "dfccb848890fe85b1f13d55aaafc793d644887a34e545f37b9837d009fe73300", - "47ffaa9ef2d9c1418570914ac6b415333730821713425d97ddcae2e22fc0a41d", - "060af46a2972151d9659274ae46f9d6026073b190e280af5592422e1e758a664", - "7b42365c82f6871eacc9608fbd248ead53c6a4aab055d42bcbcefabaaf1fc090", - "9f9521ae6f92c7ed018b24b72086d6e8c89f9439e974249d295d61c505e77e46", - "d0719a5320470aa0b490bdf0a2e17b34d6ff8cf53666799af9671211ff530c47", - "bfb2c85e25a6af534bc0bc6ebd788dac83e30bc70d8c6b0f7b18a20e092d326e", - "4a2c8783576be8479fcdaa2685b750a213a807d393f3a803113ac9ca49ebdd90", - "13fb4ad7774f99c521a2803d89a87fe4b3bcf612d9624dab12caf23e9a505365", - "2823cd7db350c4424621d134ee814fa8413f00a2dd1afba234e44b3d7df8ca5e", - "dd9ae7315d814591a51c556701aa8dec0d4320fa59c3162fff2b53d5b1065b46", - "dd99616e32881ef1e1455c4283ccb4aa720b07d62cdb2c2e1d749cac3f414976", - "2ba869b6db102bb76bbaf5c1d10842ec0d0f8982f0368d0755dc7614e4d20675", - "52ee19690f2888684f081b68d7d781b676204084c9bbb07e11dc5f92fbcd0056", - "0af1141c637cc2cf63fc6229571ce80460a08e28e5836fece80e8de9d4f42845", - "b650a8e72e903a51bd5ac2bc8331b782838262d2f19ced5e36d7e15de3293df4", - "5a96c33dd3b8e997470435dfbb43ebf62c64e6423e9a96a4eb3ce4db541d2a77", - "a4f437ca349819f22a5f2dc060fe7c4f6d7147756a756be84669660390be2c4b", - "b535467a1439f6a2b9cf642ae3d951beb2fbd867deb445d1e52646e60df27e14", - "0d0d3ae1bd0bf0d4d3da48710d23883720d80ce3b7dd157ea3e5790cbcf56000", - "87001af893846f0c1cd27262fea1c19c993faf5b6eb98d01ab291950b00dfb85", - "07fea9db8fe426d46cc5cd206e961b8db459b0e3187c316201bec65a4d407fc1", - "a7c1a889612eb92c5eb938ba32f65fabbcb9e8810a60eff46bbfab66cb6d96c5", - "c6af8485c3c9a336a6fc7698880b5e94d2daf9c876aba765bbda6b9daf17e5cc", - "a88836371ec61de9592928fd94d95a6bca5bf19f48a8a02ae40ba74bbc5a57bf", - "1b6a95919f153bf62c5a79786baff232a0fc6faaf23d638350c84fb399f98766", - "4d82d4f9622c878a825cabc790b7ade70a36fb9f3005b5be53b0679c725c364c", - "46cc46ed13fa7b690aa2681606e82af554ca6277fbd1650f51dcc302d2ed5dad", - "142b2075ee1acd20ea272a62e07a57f3b8cc5c5bc56b0e46e6a9ebfa9789d7aa", - "088d45b414cc2701e3073033cdb4e1580db5024e8e1b0958c0dbe43efd202551", - "e27dc16902dc8a5fd767a5cbe69ac3a2388239e9533cd1181a2e8e5ee481c990", - "e8cda17704c3051869c12b03b4687299a246ce2f45cb3a93ebc72a05dea964e1", - "79e61f28dd9137cf458a2f44596883924620b2532bf527d178ac539b34dc7f4a", - "20d833a5238955b306041ab25098b406bfe22d885fb6e65ed557068fcef1a0f7", - "4d5978d739b5e89358cebd443396fc0ecff81b1aba070682aa705f75ba73e1f8", - "996aa51b4fdcd2365a94835fa8ac4495b61d2e529e9000bd3799374646d33472", - "25204429e66f74bafafaeb91e5aa2c0cc0c5374a46d06bdb70dd3458e4ba553e", - "5055e63c1710b1cca6a4b0d371da27ff8b9f83cba45832de04be79df422cf6c2", - "e7957e9801103a4d39670e5aca4022404dc3a30d2b5b505fdf03f266133f8b45", - "9345dec6541702353e9f0c22d7ce50c4cb8b76c18b04ac43c3a465b8043a2f84", - "5c449f9efc74b92ca8c2fde96e12625628cb091d32400f49b7e3dc44b1c51948", - "5458ef67d0f3cf28f144f8982173bb8276092ae43a71e02c9c27cd48e2b72122", - "f9bad07decb0b3544c37b309441a30a3c2dd0d05759dff8b5ac97fb9cbb5c669", - "a8e9e28ae9574b916d88d0997443bf004e1cbcfc8a77692bf872fec583893947", - "4e24ea8dbad5d6ef476ed1e29ab080a1e9d21a329ff258791e8ff64b8b6b695e", - "7cd36c8f58661fe36a768f714e4e199ae81bcbc8499f58def187b542cec99d67", - "867dba562466800f055e77043e6725954517a831debd3cacd44830d66493679f", - "2e97b9051cb5a7b9ebbf7225c283976d67fbfc09b62a7a0a033bb92327bb4429", - "862a79ed9efbbb9836b55ebcddd12fc50ce9af0c7fc222806374b918211f3d1c", - "44a66da013e8752f2219ed384dd1beabb2635d8c86c5fe704d1ee0026d333214", - "2417f4d73b36393905193c8a392f8b8009063f7f9c9634660032463e1a793846", - "a563d29f824432f8a5dcd4bb5730de8ccc22be7c07acecbf9c7df6a245e7cd25", - "fb08cea52f80a101d4e45396496163c0759558880c4062ea03adec1a282d5665", - "19d341829a050ad8a1f0b07f0ae07a9bc12b44fe2e4a6ab7c6fac7f05e13bcb5", - "78fe9e08bab8b27f6f24eedafe1c9d76fa29049d1048ddd6e002c76978d89d7f", - "644caf95ccf558c4780893b0683b61f7678289814fbfabd0d470ff270c2f71fb", - "1532d2660cabe87f5f3193ec1cf44ec0dea83d9f20b6c9d28dc21b5abeb40ab4", - "d92d562c320ff89c22aeaf6ce89feaaa206dc9b772ab40bc16585f7687374221", - "7b69c64500db3adf444cf8fcada1dec20c91784e00d0d10a5c3598bc64286f18", - "c6225995157bea4f6a5331b9c651340003fae6400b3838f0c625dd698d78d888", - "ad62f7303e38b89774f291e2d53bb8eef5dc69309804db35936ada796f1e4644", - "7b09e729767c511f0715ca7a211c936e5c99bf5637d02caf3fc30c3534ba00de", - "a1eed3631b04dbb220e764fe1ca617b7c3354a2659e2cffd1d2ab47a3017e954", - "eab8708ca43cf25de9cf9aedb9c6198327e5513b30c28be3acff88b0ea067be3", - "6e173b62942b53941b0f80457bb180cd8c8af290777c1d5934c9e551bd3523b3", - "4e91b8154adcaf32fb52ceb9323d70a2b7d5613b888b2664e8a384ff76fc70b5", - "50debb6f566677deec7b2307a2be8cdc69ba545621a533c76dc2cc0f14f84eff", - "88aa975c1b68a1c11526acdb26aa1dcc4edf73edf579d719ccd59a865f04edb4", - "06cc1a33e5ed07d4bc17ad0a99cdc20a6df5b453950d55f3ae4c92a61a4e7890", - "613e815ee312b0227e14c3052a2815522e26e851c147922837a01921e2a0a5d7", - "e91fc3ceb27d7a08caf758114e63a654e0e6034cb006a44320e23f546465ad7d", - "d860461b6ffadbe6f71bac9aa84e41024b9909e359874cfca3754895606aa3d3", - "14ac08d6e3eb7e4e1f716dcb36b64a9a5f524669b22f7ae37f8fb9046b0a838a", - "73a7f22f17596b564728ca92a9c14869c83251701064b15dd6f94cd51d774021", - "75f415ac828843b1c774c3d3c124aea5e134a283221c1cbc5125b17f1da04f87", - "e5ff1dcc668bfba382100eb3c6ee82467403ef80b45e86c51b585d65488b6546", - "9e0ad327b90034c2ea0ff572c60bd265447af59b347ae30c1b2baf9c1d7da928", - "173ec719ee93ff85c812a7f726613283440011fbca340356b769401083532339", - "01a92bfac79e18a6ec22d93652181423aaeb3ba075359668cd9ed51623e94baa", - "c61aa22b9bb834a59206a8d2a84d18e5545c839d43e18d349653c3b1a77141bc", - "e96729595297ee7c66b7889c39512e7685a409aad7b7668052b9a438f6d5c7d3", - "412f77b355b1d93a50b45419d9df708525c4412db3af9f37fb9ce5bcb9f80d1f", - "01c0f43f7e828411715820ef995ba1c0d77b9fdae1484b4be0b95eaf9e50a5a6", - "17190b4d2f60f81d784e9bcb6538e6250056b119dd1fa9390f431bcae3c829cf", - "4def8afc898441358f38a06cbce7c0efecf1740b229e9f276ab925eac5cd4ba7", - "8654eb7068194b0fe8457341017777a39d5d104e5e62fbb6765c5fc4843cae7d", - "6247fe63df583e2eeda34c1b266cfae9c880498aba8627d83939b6499cfa2968", - "576dc37684176014a9077c6b1c7f7635ba3001d03377c557a1f0d3ae8585a278", - "475575a220f2a1f276a5e6c40b66a48ee80c3af7790af6432e1f5db6b0c44e0c", - "fdf58582c5d78b1f5fbd521b56514a57138e454ec0b0d74888db9bc39050f3c6", - "66ed516f8443940ab274f8e67952f8ae59165d4bba473822d5449b997d9f5d9a", - "c1da94fb9c513e24e6cb2e65aef9b7b140187b59a0576b8f34e94243700735a1", - "c02536f7be0d863a9b6cf7117e50a2d629293ab35c12255e44800c9a9094f70b", - "dc3cfb346c9192a81507fade63384498c068835fb80d15534de659b6cc77a360", - "7ef37e25a8a7207d308046c027086be690f5e089cbf85f27ece31bdc99768994", - "7dc244ecc5cb54169f5b784ee2d8cd7918e172c7798102d094f34518174e4545", - "2df8e630c2aad9c13ad279064ca23b06b42c107d7d922452efd5899d395ecba6", - "0ea7f8e616620f1d5e0ee733ac04cf6e973b9d224807fe6a84c23a61cfcfbd87", - "c1fa6027ae6edc2cd56ad637ca587fb8baff98a6abc11bd50103b028e2902230", - "0e87873deda877471c005a9e763edb796bce27ccb89c80cd64e83b62b4590d8e", - "4163226e6c4ebd706a818a910e7029a44cdf9aa32bdb5362708cf91d81d05dbd", - "66829a78c80a6213d7249aa3788ae3be288493de8d3fa9b695ee1b62b3b74170", - "4de91033c7726c0e90a855612468bbebd3b74d864b2fb4663771567474938877", - "0e74bc464adc3ad6a3494b13761184d0f8780aefe34ca08e08dcb45ec559531a", - "5b8592cf87a3c7a9f4ada639953212539a2d6fc5e358bd2b9e2276273c7d7ffa", - "f11241fb1711ab7cf05cb6a23c9301435e10a28342982336740d824e30e29f6b", - "ad723df2b1ed5995866e674c04358c85a5480ab5ffd90e22fd2c16d594184494", - "c2cf6b1801a6b83a3d22255ab8653a12b1e52c735d7759f240f1fbb59e86e98c", - "2b4d277a83c0bd5372dfabd236d74545444da0cb5061043246de090a5cf3efa1", - "7238d088351eb7aed24f7c062bb23d063c7019efb2ad8302a5400c01ae3486cb", - "54e3841cf327c29444707b73c86a701abde61dde8de6b61d3c49f8ad0f6536b7", - "87eab6601d1d00e6511ef410b50312bdc839d72f961edd4d26c9422e164f5b83", - "56d7a8239fc4ec477c9de733b4cc36e58c9df39640d75058f299cc2817a34b81", - "ddaf0e12ba97b3a714b04f21df42ba1dc7ea9c73e1b832c6deb3220bdc22a31a", - "6a9bda14942e2c680da91b8637571f24358b58563fae41b7b27f06ee53132ee2", - "f852627aeefe22ac92c38f0e0a028069058af2d29a36d3c12d005114072b4903", - "b599496264931e7e2ae439df61e4d937160fcb861d9ee84b54b3b0bd7cfdc460", - "88836bb0456590ad0d9129e49f3c750bb939227f2eae712e71cfdaa235a7d9db", - "c6cc5a28f624e3aa4cea8fb9682bba9ea3802503beb4313ca3befe1e2d037bf0", - "0edd433ef692f82b4aa43696b85cf9940b5af01a670ae4f2605750c5aeeecef8", - "9a79aa211408a9b9ac171d55973640e3248503359023466a5b5c9f0e11d04a69", - "e7eb3bf90b9f986ff8780b189584de16beaac3aaa277ebfdf56369f892389af1", - "e779dd97a68ad8aa98aa576c398ce4bd87ce9ab493b5e8ab30c234b9bfcf6712", - "73bd75486f396b21b917d4eb059bd5c57da54257394c23ea5a56af1eacdade3c", - "7f048e0eabcb97a43c81865c7191718bbdf47eaf69f8a990a0dce74bf8baf818", - "09c206202d166afede3b6955463e75e863b647591db58a070d56ce12c872ed07", - "d034f1121830574da6c8b60ae4c9129af94e6d48e09c86269723b2220251b094", - "addab151fe8c52433a1530ee3344cd298c72885e129461c3c44fcdb77bc4b6dd", - "2b3e62833f4360fd5ec0f2a3585c57bbc9c26af8375e52cea309a3ad6f13fc1a", - "dd15434205bdbd8a25bac7e7cfb441e23b606372ea5a1cd6a0fb532716040f7f", - "1dd7276bba493b997f3192397046620296ac0a6a59904dfe372410ac5678dbde", - "e0849a2b089ed87878b7bac0b8de10a1580ed0d68707a3c49f9907ac88181b70", - "2bfb6df4ccebccae03cc621d4ba1eccb67d0b943a05c36a91407d022acfa3684", - "f4c03946d864ce980f0cc1dffdce47cea6aae827121733e930d056c0ea20876e", - "7bc532e240f60e62fefde12c1a862c7e67c378ac42b93b7fc8b1f689ae7c87a5", - "bb1d66fc3da169a12a4d24371b9ec1cf35ebf7354d25b158c4a8f4a3fb49347a", - "201ca552bd637b123daed1192a60f073e78486d942667e281968b76cde7aa1fd", - "883f6b24983b8097e25929219a586680f5b187bbf776fb0176ed7f2d85ccac4a", - "606a246e34bcd3b0d219d32ebaee50db161e25e19e78aa651479b38b10f4b01f", - "51a1042bc909a5eaf0553a396435dc6c21bc9e326a6d031a8108f196647b3b1c", - "53e98482860e2be52df19ed33acab3e43db515f07c157dbcc8ec18b384775046", - "498990c0ee012297915811240012bc216da22f6ff1bdaa9da0074240e38fd344", - "92db64383317c4b3ca7a7eacd17ef8c8680c8d9c24dd802ab97e261f6dea6343", - "8e40c90f12e8e2f949136e873e7a0518ab5793e84067f042e6612faeb4bab5c6", - "db078a1af34e9b68d97d2566657f1ba20088dd2eadfdc5f598d1a7217c8ac83e", - "cebe0e38fc4f7fdfca2c629ad8bf56ba1e0f9135a984aa55079ac8c21edd3c72", - "ca323ac5474278dd8edeba3b516d8c8a21b0f90417fae199381ae2dc4deaca72", - "05e7e4f6318f37f1b26c08f97cc51c7f2106b2057dd948fc6f0875be9d8898ce", - "9a0f0b71a1b77d4592296c8bc245ec1f79f63b706eac07198cefbc5015b8f0bb", - "83f8f677860d2489130baef463ce39983a09cf4f7e59a8c1064e370e9719bbb0", - "04a4a057d88f7440316b1d8f67eef59ec34fb879cbd9ec33f89b5328565b1a50", - "1fb6e8208c3b9b46fdf551a3d6db0baad1ce46c9a4a406c98a83258d49bb1e89", - "43ae63bac69572675cca41f3c6805fa426ae932ecc68b182a5cbcc4964ffe5eb", - "dc3cf3486e9a492d0e39e191a4e1e23eb835269354597199b027a75323436a72", - "b16c532351aec2632e66800811cab9cf78dc0ec4ac050de124fce4ff29f6b781", - "a575c46316b38069e991ee43411f7c75bff1fec07433a0ad59f5d58803b93fb3", - "a10ec5a46d5f3278b86a973b6f17e2e159da25e4b6166fd0e7e7815f2a538487", - "07072b723e65485eaf9e6e93584f443ba5b0ceeac2053e48d065fde5c6361292", - "46249cfefc303c5e98a878789f88e15902007371509ea752447881a902c1dabe", - "3d2e7308dcc37d71fa8495fbd8be7a252f9826326d41d9a5c6a2f95d8aed2786", - "8d56601a1efc978a6014f3b420b7b39767bc99111537005028529932aede6278", - "b33458a7b8e51100a959eb5dbf80777810b698d259fe52d939be8dcc889a7497", - "7bbf16506d9276fa92c0ed2c40778522c77be23657b150775d80d4da3f5e3d7b", - "3c669ac4d2c01f2acf557e1e59ab545923a32c27acd50cb99472efdd2c81d9bb", - "e556c8eb5bb3ed057a6b0012cf5125a7651c1d2f3458a12fb9fcb83193b89760", - "77f77f434e54eaac80d7d0b2d959bd0a335e4c4dee8e2fdc1aa0a0e0ea43a93e", - "144e7c5b9b5fc3ec06ee0d6bfa9e5ba56c5a3100e575aae26aa57a8869d62506", - "804ec63a84924df8e4b04ec87332a34d3a55d18ab4733db4dcdb7b3c9bcfbd5e", - "36bb6d57e7a9e2f968c63eb96ea2c8d10c60c7fb6a5df9d741a0251ea959eec8", - "bda5c76d406253aef0e565142afa4164dcff32b358ec03350b45fe5a0d40a7e3", - "352341dfd4364786266d7894ff1850204f1edf6ecc022dd179ead81d205bfa8f", - "817caa6233986cf8d630c8b926c34d131baa07ff11ea3ba289906e5293b63c32", - "ff15a432b786f96b06cf007fe15df4349c795c1676cc0a55f9de34b829e918ac", - "81b514af92f46e5ccd71fee043197f2f1192383e004a24c8f6200b3fbc7a1f70", - "5bd4857569d7e2068eab2af97cc861022b3f3ccb37ec51a81396d60a4fa24e42", - "35ab9bcdd308b359a38a7cce11bbf83264f96c5db7d8aebf7cd7c765aab22f9c", - "d20cecee07da21150cc3c3cd3dbdc7c87400f7421e2bc02ed576687a7bf1f921", - "44a4eee3bf62cae31e8d0835d6c0b149cdb714aa8d13c21ad9874b86a4d789a1", - "49d68b5d759060bab2ae73b68e50fde7274848dab68ff359b6253b29c05b4549", - "b1ceb5874f815f284990659fb86ed90a095ce9c0d4e0b61fc2ec18d43d158a9e", - "72594e3dc98e84ab61c3d131ad48544c2a256af6ff48e18f187c9709c301865e", - "9c83cf445eed87ea0be325c22e16afc3ac21447bde37d45a884ecfa0ce3d0233", - "5f7b5f53d1f5ddb59b7401b48a7fc9ef4a79f03092c2071d739147e58e5643b9", - "be6dcacb8163395d22208c100bcaa8e607b20db76bf6124c2a0f9906d248d76c", - "cffe5359ac6ee401ffb5f754565675ef826517e849f829e6496be840d381511b", - "0194ddc8cba5dade8e809ebad199d33210424c3bae7e4afdabaacedc7b10f25a", - "d4843f9b1ed78d7dcf40624bd9dd0edf8ccef2a282bf2aab38342ff5b39e1063", - "073a221936c78d68f97f5951d01902ccf39bf7178a9c570749a7b74b4f8e227c", - "570f65dfb76da2635b3d6a86cb25a194c92ba8a94d5668b34959c69672d101d1", - "3e874da2d584eba958d607d744de469dc38bb85d9260c21ac1bb74876d35d175", - "ae49b3ee9775f9da3d24449561eb57b762c13652f2d0363738d482f7fa9200a4", - "ee36b649f6734e9753561ad5546dc9f0dd4be1dedd359d892fbe1456fe9bc218", - "3d463793d75639d9eb832e2769d47661ea7f4e208e3901063097987eeca8e290", - "6a3bf16544a94be09eb7c159a8396540cd19368efc523a5be148bcec9140ffd7", - "ad27ea911d3dc829db4893649362fc2ca7e77aecded56d34c5ae435f0d06d0b3", - "8891a14ba110bb9ae0a6d7d2e8cf0113b9fa843d4347e1a6d29a8b8778c79cfc", - "0428b62784cc640adf4669b3d5f6b6f724af57436ec29acb130bcaf567c0258a", - "46218f64cc4cde5331e9c98b0a6e9ef75e392bc38cbe9196ea08d45aa06a1ef7", - "3f70bafa9fd98115b325a06ec017459c7484ce6f167c3a6db79337fc066150ee", - "a1202d37ab60fd12749cdd854ed0a4fd98e86328b055721dec5b60309762e330", - "afb3b11bd80c1d8f37a0c8599c98354774bdd6b5439db5edc5ce276c02a9a172", - "bfcf5f389cf9aad5df6b27520ab9ccbcb8dd0750320c1fd8d291faa30c3fdb51", - "ad478b83968251a4585fec8825dc83b3b5ab9e37be946069ac755dd210ca5c97", - "44fff2a669579bac00b669015c2e57555801d4cb5a91987469dc7af34de74349", - "07a66bb5c322b7df231735a9b84c20c4fcc360d6424c4bff205b49dd2142b403", - "526fb550dd1220350aca20e66f63308449b40f13ed5b5abfc6d656f6a1a7ac59", - "94b6244870cf6ee116899ea1cb0c8ea73bf93a15e3c38704f40e78c7727e800a", - "8d4aa5254080dfba3ffe7867c682981dc91878f4fbdc486fb65784f348c773d6", - "6e76b0c838bb4ed0dc8fab80819b16d3b61d0c2f1447ec8665a06f47f5214f83", - "2717bbf0f3c3ab2b00301248ee4615b2a8471eff20e4883c657c2d0f3b216002", - "1e4a668a3cf2ee16e635d739e234780fc0eace69d9eceb4332487568182679dc", - "0346438d39a6739ae6688cf8192b0e40f33a180af7fb0a4a029af8ca8b467ed0", - "e7bc2393558160aeca0eabedb066b843af1697367e53d17a8b733a5f2d2bbd7a", - "d8601916b2301bd34f46ab351cc7d6cbb7aadec23872c8e086561ccdcf3af768", - "19c7b6205d00d7404b8b2ace751035c97c390cee3eef920ce58caaa359e90a2a", - "634df670e0ee60a6473f530cfe2721a7a2bc099d0105c9cba5f7e83d576f997d", - "a3044c9d0ef2021ffcd4c927753e6a1e2c29d572a10003e318a5ab6d83318240", - "82e8c051cee2c81ed23083f8f754684d56049299d2609acbdd43dcdb53e1d950", - "69200ea28c5a965262faa803b5e8a3866f3dbddb5b239b654f558f07a3733a48", - "afe48683e382aa18528270c1c6e2335c0719595fc0ce75161c1637a1f02095a3", - "441aebdda3c54446219d332194077ad4c95461bce81666aae62d0b463d4ec778", - "ebfe7c47553c2e3121c53872a8b6d66e2a3e8fb4aa513dc97e6d0dafbc659960", - "9f00a7e1c1675722ebafde45d27640588de13ff4a07f2bfeff006d0556a921a5", - "1a6555a85b46d02f9da983cc48ca431c81bcb453a95365c0f60a3fcee51f6d53", - "835f7259cd438a0ed3709c962b1d6c7bf955f7abb5411931547367561bfe5ca3", - "37d2d7b8e6b19ae82e0f81071e5b4e8387b501ab24d09f51f202e88446f47874", - "05eb80fbc60d89eb3de40698c15ae66547a3497ca652806ebbc29b21f81ca134", - "7bf43b10be17f3fbcdf88a20d1f51127639ff0dd0ee38d4dd05353a38342d178", - "d21314f4136ba14f19d74c98e627fff6552121bd2ba347f2a3680f729445605d", - "7acfe5d855cee7e53044d2ffee71375f3db564b3aa6e408b819f5a58e65dc01f", - "f769a3f581f81e7435c9cec835c1a06c8e1471565208e4b0fa90d7c8f3216328", - "1c169909f35415e3e94b56bc8fad68aefde3f66ccbeb984adbdf5a65abfefd5c", - "644fdcfc452d9cbd0785c8b97d30fb39843cc55186ef92777fda7ee4e2f0da0b", - "61e46391fcae46cb90f321aac2ac82467b8a52cccb2fc4da8a25803e1aa897ce", - "ac82d8e2e343005ce23f8397569a26dc1e43c1872a773a4e9e4704bdc523e155", - "5798196d4bcb8a5cf88fe66dbe7bd3b422b8641835f37e96148dce1d14635d19", - "a613afd1ee679ffeca3c9bb285e7932d4deb499f75b2eb7ccee2c4782d8254b2", - "0a09cc1717e260307a50aa784a6ef90fd85f763b7fdf7c786fe858f763d24a91", - "9353bce27717a874eb6d6080e7e8abb0c1ba849e743eae1326e8c247e7d6d79a", - "a83e21434b12593934ac9b5e94f3c9a3f8954eca5dda12e45f4e8177aed3dd4f", - "12d63f33b574b83aa81585a8d1b5bcb3c8d3edcae91d1957b34d61d6358a4a54", - "eb52439564d3a388749a767f1fa999e0a5e1927adea47e340f6713d7d3a1f85c", - "435d09a17e3f4bec1e5cc83e33977805bd859a37bdff5c9a2bce3b6db83f37d4", - "e11047058810d4193f73d730f04d6cc0bacbe09209ef87be748e43ab5ddd7f95", - "8196900f60613f5e11c032412a479c41998da30dd8f39f18b65ceabdcfab7b2e", - "6ec32f8e8182210d5e8c533332e1608bd00ae544571d7751bfd2121b9575bf5d", - "f356ad23406ba8e09a9f1d49e35c2aac86026328b9965e7f9eaa6b9f0acc8fe9", - "e84daa2989e7a2e150200473c352aa53f206c9f3dbe59d2cd88c70e80467fb98", - "93e8ee3f5b181ebdb0f2a349da9b0ed2c5c0fcbb8bc974081f78a7d5859b1f03", - "aeab9e148db76264fb6a102b3ebc27f098a06bcea7c4fd22c96c73cc83c0afc1", - "6c646066fe1ceaf6b8ef895bc86d79e6564a250e9ffb704aa27e67e7fd1ccd82", - "a9106c1c8de72bbb99d84bb49d6b9b866f2236962e814a8dc339b809d22217b9", - "a10196de8bddce5b0f5b66e405712b828bbb32abb44ebfe0b53ba576886a81fb", - "66ddec649c4086cd4a387e46ed4dab25f7b8d0a54306d3fe64ea14dee0a1c8a7", - "35bc047460c932385f710efb9435fde084deaacc8adb13aaf550e226528e1f48", - "d41d020aabd5e77cd1db7fce3ae1f982a8de8e500359d1bea51cd7e7b1ef31d0", - "c07a7e3d5c98206c626b7e1c935686d39e95aedf6db88e32a74bcef594690b58", - "94cd8013ca5f9bfc6795589d8de617438972101023be9b9b8125727f219902e7", - "6b6982f03e3c1d6f95c9aa07955d79d96855ad6b9dff7c3d52d44a8fbfe01b1f", - "ed93f0c259bb6cfb478c27e0720fdca580271a021c1543a1b18abb7b36405bfa", - "8b633205f7919973ca9a92c2e4d30471cfe62e5cdda25f4b101c2ff7e710ddcf", - "dce3c360d383c492952eb24decc31c597cef7e6a4b1544eca77908616a818339", - "c99c0f3beeb037262f572e9aafd3cf86a5cb9d8b994f1daf6cd2c48490fd2ac4", - "801288d3cf71705f432c0c44ab0e03be60480c6e129ed55e83dd6b6cb06ff730", - "f48b06a24a3411561c9b15685eec52528c4bf344d9992292fc49a1d456f4cc97", - "cacbcfab1f58e6f780592fa164c4930dd2bd3c883bffbc75be404f67e64845ae", - "9f635b50f0e9ec9e806b3860acc98d03aa1e6245607dfd405be84933a9c0154b", - "bd3bb71533e9b9120974ab4238889946107dcd85c930495f0b575363e1932dae", - "2d32f283d47a97342715fea5ab9c3534892c637b61a40faf083138b4e6f22416", - "25de7ef55fd3f231582a7127a9153de908c521246188e504b10cdb5b59e75b22", - "48e4dd352e88b002f7d53b10874b7737460c31335668b91486ea13d4205f64b3", - "907448c9d31e51fa179e691602d8b9c39a0f4840addd8a14a3eb84e0fae75f3f", - "97ce1da8608e69e7f4db248a566fbdfb2867e8b09dc7ca843f54369b156edefa", - "3124c95aae64b41357f5ed00ac9906bd12eed40934b4727254ba289dee57dd63", - "f3402c84ffc32a124ecfa22c2a6de829cc923e64309837bc6eb10eb4b149de96", - "0daa3ac2f40c903a72a084feb85a821e30045bc53d7447bfbee01b6bd68b5267", - "9acd21b67922c0b19d8d9ec6c68fed8404494f60bb41ebe9fd1d64c0d3149a8f", - "04429451f01974d2807ab034ce4772ba8758101ee91a8d4476362e2e4b37e5ad", - "9ceff70fdb0a324599f6c92f59a057504d5d8e65f2819151ba68f4aa29525237", - "77859ee52453bff1a65bafcda48ea4bc620aa73625c673a2f4077711692ddb3f", - "5a6e1d4de7006122e1582656c0391988cb07292f0cf04e7f9f5aaa766e136fb6", - "48ca3cef8a209a016910a71a23174e94c0c0d13a693431917f61668b455ee4f4", - "ca1929005fef4293d8fb3f1d672350e334154484f8fe8a2102bd4196df24dbfa", - "920391a85442601574b2d558994e00d3f3c4da05105dceec9a00c7f9e948044c", - "47a30c5aab8fd63efcbeef369465d5d7820c597a52f547f70bde165468f78410", - "c7b167b232d984bc98032923a49345a1a408098abb617024ff21ea51e412a9b6", - "b1c2befe21d5ff49e4a1e79b5f98349e8498f65d3b35e9d0cf035707cb3fa3de", - "28d8a0017062f5ad207f815b3c95d4bf5a312bf8a2680db9ae3a8a30ba65a5a2", - "01d832e7df28625bb7b915df379e9254ea53b31b3a8ffb76bf84ca68736dc080", - "17d0ba0d586c113a644afba63f76ac8e371b4316adb28eda5d7d248e4dda15dc", - "165daba75d483838978e18650cd85f0b7c2b795c24450879fe5348e0a7cf03ca", - "4d9306b92b7aa5e8f42abc993cf519cfdefd9d587774ff86ba174bb352d700fd", - "58e01912e0e8391aeeb07431b5d13de30377288faf841b49afb4bf01a7d388cb", - "511eda4f6974387e4cf6ad5f297a9f5d59bfe9a5682e71f0846d116d93e4ef5b", - "ad5ceac6b63fafdd40809f14a46a8deb277b25040958aa9792c740c3345a7998", - "dcf190b31098559d9f263576354bd4178c3e02d9f4e6e7e8fe4e2a353d159a25", - "73a64f19bba91a14a076a875715bb15061d5f43da4d724abe90decc20d9655ff", - "536f602eb74fc0a92bdec18e4e6a816505457fdc3f7a7f2627932d5c124b5010", - "3b9ab14bc42a6a49131f769bbe1735388bb9af6e928e02997c3f5959c7eead44", - "5afb29b335e71fadac67768b691156835e3f4ad0913efb31bede820a6de78650", - "2af8300fb2c81ae4c07d73bb6187404d9f614395f8bc65fcf5596aa6dd48fdc9", - "831496ec0279c9a55ec1b8b64f45eb50dc5d76c434dd4b841c0d649c562e6680", - "8eb18e53deb839a30f8ebd03ffe95c7aabcef8103f3e219ba4dde22c446aee2c", - "eed5837d21ed2127baf2f2916a7b8f068bdaaba1f0e1cd9d410a3bf3098173bb", - "efd7853b2ab48d72b87031cc85b9205509858d8c8cb5ae65ba6661d35a383b9f", - "724694220ac41250fa39dce528e8ba19623856ad257ff0661e086bdf158e71d2", - "553a4e0ee3b5d06cae44a31bf583f27859caea90f5f79f5cd3e3f12927190451", - "bf6137ae15c9c27b0a7a06227fbe97baa90080eca612b94ca5bd18dcf7198949", - "4aafa0e2084a4f783acc2eb602ef15b37809d583e3b10c661f96af6ea9b5b01d", - "5cfdd88e3e4baa49dc27ebb57642c0cb4c1189ceca5b59b5903bb8ca43edb6f3", - "064ff08e43cc64951c2e0289cf99813155b5dc7280f5663e85051aa53fdf3bc2", - "144bb3bc6f3294f8815c323209eb76890c9ff8776f72e8f57e6ffdbf2e286e79", - "d30d6bbaa8ba8bfde9b5883d52dfb36d9f440a751074d6507edf4b54d3c046d4", - "becf2a7b53414766808d0f27d0d0910f8401b60411a3dbb3efb90bc9f96b524b", - "f1037e4851c774decdc17387ca15d59c67bd0a2076fe56f51237432ddaa302e7", - "f5c90c62c84e8c619b9acc406843850ab2118aa2ce86ed6e2d41a0db995a62eb", - "4db2f58f24763092087cc767b2f0ac766b9215af99a16748c9996a52c74be1f9", - "c11baf55b25ee2b84185619c68f370748d53a55327d0becaa173c582cd040fe1", - "3df73aac6bfbac5c6b0d9ba138d967bc7bc5941e269b449d16e6bdf06ede0763", - "df70c4cc3dbc6273949ca23d7d3fadecfb42361eb2dc020091491d1a1a2f9da0", - "29d16a27e8c539f3243198d5a1b2bcd5cbf30e5df19dc12eb3085248aa30b94c", - "fade9455a2ef21e014e0cf808c138096968563c7d8291d038db59b544c6d4b96", - "bfa1b7e4ae90cf99c4e4ceeb98a2766310e76cddf36feedced9bb2b5b4fa9e70", - "3b2d9498167cb0977139e8649f491b84da87cd4e2b80294da4da51f9d51e4518", - "cadfefcdad7cd497c355d1a122ee03673b9cf64155516a6450f44882bdc012a4", - "fc8d0ebf72bc913982c1db42eb8babab4769920008147fd3cd703e1c68dfcdff", - "2b5b022627bb4216ea531246e4f709a11a347185296ae865d20f8f6c370f5537", - "de559464871fd0fc808c2ff884f9514633868116af2a8c3d71d9a935f6bfb31b", - "8868e7dcee3930abe3c52924a4d3bada5781ed15cef1024912079120d391fb5e", - "796de50f6ea42d99cf1819fe92ec49425031292bc9c61d37e2ec46ae9be70162", - "2144be664672942029d272a2191dfd32ffc27258b473754f1c226ea3192e9f17", - "cde04bd2c1d122c846322a43a0630be83a38767dd9b9f316c6958e5e506d3da8", - "7c0215e2f61cd256390f530ffcc3c30d90c6dc0e61c9660a7afc95e4803449d2", - "a25e473dbda46cf105966efb45ba7c4da4746a1357c1790e20ee491476355274", - "1ceaf7d08a68aaf1875a9e641ae9dfe70fce9d57053b6e8b494f7e8da7a7e218", - "094f66c886191771321eb7b987262e32f304d3e708026363c013887347cf05d2", - "2b975a0bf80a26c88552b3410355af66c3d9177987778236dbbae4da5a525d83", - "1ba5d0a63e7752675c949f04bfeac0092845cb7801d0cd44e5cd0e58749192f8", - "b8d908bc1f4b3c8f57c6782f8129e18dd43d4872655cc0147285ea96aa42739c", - "d6e9c69c76f5484f8ad17f2e882d06daf4c9d0887f8a64efda11f542dcd74173", - "71c2c45c1d60747065c295cc28f5f33b5725a97b83b7cbb745cae3a64a817353", - "84340d63dc9376ae7c81b984a544852a781ece7e2f7aba4f05d4811dac764cb1", - "581059dd3825f42750bc2ccf3c361c97a2dc01f62cbcdf01d2c4c7091ab6bcbd", - "d3b6aeabd74cc90ddc23ece60aae38e2b2f5aa1a0db5a9d3858499510278db72", - "03754c240d17926c8c149a795226a53ca99c926f993d72de34e18fda84e274f3", - "ab82f0ed88c4155c6e23aa85c9ae00f568bad44ecab756c8f123c6bf99ecff0b", - "68433296fd71fb80f04efed0fbb805fdd353450dde09d13b4b1f3e95819b1ecf", - "33dbac2ec48a23788eae3075a9fae97e3a95a9931ca71c3aa3a03782b07f6789", - "f410ce074c299f37608754dd7246375a7fe661cbe2ab07333a376d86cb38550a", - "b19e9f3c5647f4bb4437f44c1a06aa380d79ddbb776280151552ca2ea7f24664", - "2ddc0c27a54c0a0a299e79f778af8bf6e426309da6c8c5471c642bee16163ef8", - "e7e6645b2058c1ed86bb272018fa7c780b9ddd7dfff0bc2351e40084b8453b37", - "9f9b3341b017b3b88634e8349b2decac7a9daf5149e9c5e8c9b5a74a44b512ce", - "e7ffb14c920ef22dba7bcc079589c5c96eed76d30a6245bc3eb4653fbdfbd552", - "2bb6ae9fd03926d9dd57630d7071c55907a77e152621f009c328ca540cfaebb2", - "e4ea8cc1078d92427afba6257cedcfab3b6f88c2301faed63ca04d85e57fb8fd", - "a586c1c5a274f04821fba75fd5650bba84b3b3f4a6f29184d493b5d3e3683ecc", - "cfd9b92ceebde4e301c54d3ce07d66432639c70a91789d140ea837410f0b637e", - "1826db4cd47e8806bbdcabfa8c485e364c357ec74f8afcc1e579d111efab070e", - "0c3d739cae67b5e99ae4235e2c6980155f6cd8b2ca0bf3976fe15bdc9427c21c", - "5217fcb487a7f4d609b3d670989aad1c21a33fe9376d454fb1047d53572d3141", - "096b614c8570f12ddc7d266012601d0ba89b95fe775a5cc6afba267a155ec8af", - "6a6c05f4699741d3134dfa4aa6e1f420430bc8b4d89601280de049391b3a8643", - "a057f9d97b21e519b364a1455587673f9674c4a346dde04d93349dcd9fcc0f0d", - "500c0c46329b1df50ee33731c4e87745e5064ab50d0f49aee8713590235bbd0f", - "e97d7c109ab7b3850766237ad7abade7a2e6e908265964015b6a71461a5a97b9", - "eeda492753e33807b18c9fc155948cd7bbaa074c82e2b5e8dab026346783faa7", - "789aea3bfd23004fffbfa1f55a94c4fb23dc4e79fb00eb2748a2a86e16b67821", - "de649209d84c3ffdfe463b4e7b3420172928934c11461acc88261f835b5910f3", - "e8b298ede6698176016303a34340bab34ef70a458191001a3312ef9adaf2fb2e", - "a2f72f333f06d5dcc3453cd9470a89a756738df555cacb88453b2cb6db2d530a", - "3965e692abc90ccbe1fc14560347b5a394f1bc06cd292009ed36e036de6cb60f", - "728ee41600ad0814370357e4903b8599ac4e092efdf9a5c462ad275b9e94c4b2", - "fbffd919f75b5775da721f70e9797521eaaa81de580a278becb708fe926713b9", - "28ab433eb935e3ccc96a6db44efb93d6416e9f7bb8aaa8749285c1cde96e1871", - "fd8516a9827b3379d466f1b250bd372e725f23239feec361da7120b22adfcad7", - "bfa63d07c616fa01aa79181241b0148a4950448aab43dca442674faf897b29eb", - "524a13dcadc5e3c1a36af659c828d62b8c52be632a06dc9ca0c0f227b2ad8fe2", - "a64069f0c28e80312b32234610d67b75410f089793136823300e90d4f5c0613c", - "bc4d57775762ffe49b0b08a8511f0b794420bf47849ab134a214c088bea64076", - "597c58c23f77cbe40cbf85330b1d44b3c1560336461f35153facda9a8fb36da5", - "6df78bd474f5f8c04018f88da339ab55771a5b17b3ffebe9c4412e4eeb507305", - "e3bc13c343331145b7becff81dff0f9e6a46c8ea19e92b852af7983a80826f61", - "bfe8992a3abc185bf3cdaf6e3e9ecc95721aba44965527056591162b385bb125", - "84a72711d027beaab2c3bf0b166d860bd3dca2dcd0d1f0755233410e344eec3d", - "2496b56a065d8cb46551efd5e17240a01e13204cddd2ed1ee1e37c87c2c65546", - "0aba36e04705121589464db49712fc2b5cff46e7c27dceb88015cc0de5a709a2", - "28a2c96c772f15a6314f98920b91e2b19581f23b641eea6edda3dc51bf30fa21", - "d9e39dda2668f16ffa04cd3039692d2930e694269e8639001270f58a131d296f", - "1ef0d1e6082b8a1bdf66f80fcc93ba6be0c6638a4c9f756e18c174d6fa5c91f7", - "f755104f1df03f6d829579edbdf952d9c07bcffe4fb7cc03cf22454e93baf401", - "a8f8be01394d6866e561b1e614c296bc814095c5ed7f63d233a9545cc012f742", - "afdbf5ecd676cfc83cae560b2f7755a8afcc7ef02e1e024b46be97ef2e9be9a4", - "4666fb9b405ad9ab90de6a698e4e6a5913b81969647ea90bcf48948aeec14204", - "33d1a79ea8b3f1f34ece59c015ada6e3efaba9095f52d2dd76a46b9f7a6d2927", - "38134b2322325a11ebbf457cc4550a164b9e49c0f8d04bfd9b6917d0ba6d4f15", - "71c1c85fc88fa40afa751e22655121f1e1fb885e131c9aa69581d84ba99a95e3", - "418a61d0e17ee4c4309939ace592e43fa72f150488a5cd502a49ce0b08abb5b9", - "244bab11c9fcae33fb0548c9cf919479010211867ddfa2d8429f95505c52b1ce", - "e8652233c589f6c3d8ea64b3f7535337c458c2e997fc3f65baac31e1ba713591", - "b1e3599372ccba46d4c420be9a6ed80ff929c7b669b07913494aabd634747ff6", - "07e3c60a11f8af509c7417e0eec73b9b76eb0d1c5c9ad56ca1469684bd03d9d9", - "1c21c0120f089d5fefb8e43e14cbcc29295ed4f4b511f7f88e565874c8d8aacc", - "8e911ccb2520c65cf7be864b9683b11bf26f0e062bbe23e8926a3c71a6ee5092", - "6651d5f7caa157fad140f82b65193442ef86ac7d212a5ed1d4253228f011449a", - "cf8cf00c61de521d51e2ab223ff9da9fe6012a6cb08c2a0e8cfee9b7145e6fe8", - "99784881c11c161476ba8a6ca45568046d93f72704a580aa4be33c167059e792", - "8034cb90d182fb4e2597577d741b8a2532220fda685c4fbf4594388e0cd569aa", - "2f065cce607b864d823b13807a15b5582a2b7109ef632064343910940515803c", - "8efb91b1f0f91407d4fb0fbb116dfbacc31eb16068b97612f255bc77f3877b77", - "8e658e7c22eb2957b6855f9721e2df3c12c2ad8613f4e219c40e01316f778ab4", - "07650a16037d6beb30f5b7fed4d48c75af0b42d5c5cba4fbfb227169e0bb49d8", - "93f31207809753adf6108f4f50c54b99bcefef9ce53734cce121e9237c9ff000", - "f25952c7ac2738cac1ab3b8abd6cab4a6091bf5e79a2bb8a823f9473ca9ddf0c", - "199004851bfb8e3901fe8ffc91beacb72f4bf340cdc4c1aa24a36c5bf25aa3d5", - "3935c0b0db5806ac7143046ba0c1e9342036cd8c735c0919eeb318c44ec8c698", - "86269a5c31aa8fa40e0b71ec35b83e1c1a489d56564ac9d07098db3a9f13ed4d", - "13b6134ac90ec0cfa2a6bdfc68f67ab90e9e5a671943bdf9f902d40dc3c6f320", - "0a9051fd4efd30a9767fc006f3350eadd0410a81e7f66fdb1aa6ffe29d1f7290", - "1fd708337d2e4a96a5bc3ce49a073c7eae874ff24ec3b56b0d05a1e223598f0b", - "028caaa544028d888885f191654095577f4bcaf869d3314d1a2204a52b9a6e5a", - "80e34ed01248c06446358c400e8b5a70a644176df83a14088cf2b93bfca7a35e", - "ff314c1b93f35fbb6762ab86f299317c2395617af93705a29a3773a54733a360", - "921a3835bda6985713401d7120d097b3bf69917851c0b4508e64a8ac21cb7c56", - "71d976063430fe39a7e95cde41af45f7f3ff41a8fbed6027313f2cdbb92799b6", - "768e1ff2e80f0f971f84c293abc1a065588becd3f12f0918ef5d98aa840e8a15", - "305d5f00a703acf9e003aeabe0d79cf4f7ee5cf2dc21ee068e65de41244da683", - "c5518ed37d0f0e04d2a9f893b1b30093ec3e6bb6b2d27f8a55eb8e49c5a1b892", - "f45f505c2f38778e8e24b26d90563f4a3889054ad2341ce72f84e4fda7392a72", - "65257695587517dcc6d7fa21d00eff3b92fdac625296230a838699e9143b4cb3", - "629e80f9a64f0cde3a21649cd445a5d94a316e0a9c2b270c98b2e95cc1f97272", - "ebcd1fa590c0a8d28755d9556a8a812890a71657f21e589e9510c0bc9b47071c", - "75195c6b2b7279eac4908667b2a4aad6b65210d74dd7e3e649746b5b820341ce", - "43fc8aeadf6afcc8527f8faf60365b0d1a5e37e6377a03045c3ac81c1a717e1f", - "01b81ba03adb10f6feff972c458ef74c2f8d82125cac6fd9594b25723229c6ed", - "369ef8692c9b1a6c5771461ceaa287fecb2013b6d511784435d1d6b6f996d26b", - "a286b59380197f9ef75d573a54423143f4a89959b1efecb61951a72b5f875eca", - "2ef08d4c9e4ddfc70a62c9be9696c75bfe2c8d533d0ca9aa2f9e7cbca59b1cd1", - "650404857f7bedc8aa1397348e09c11f35f5f742b0185a19afeb3d1c4f9e9988", - "bfa0ee8f42944ad59f845d9b2eb4f0e1f2df3f6a7ddbc6e7107aefd83cc71dac", - "d33dbff075133a8808579573f30ef7980f6c12f3863ab93c47f570d8fa55827f", - "f67abb65e6e7406d0f3ccf6fbff1fea280e2f686142d94f0e39d2eb15471e7a6", - "3a49a1a2dd47958f92a244dd96ce10ebd21b9601b73166e8a52f9eaa50eefa8b", - "b2f456d812b3237dc512cfded6816de1675bded3c47c8674d7e34fdba1164e4b", - "b1b1ea8f8fefc404e03d85780968b84416fe610663d530c2c50a9b4d911d6944", - "44da9812a8389b74393eacfc234269990f53f2f3f5074f2a218cde94bf665426", - "ce757f95a72288f8f7dff45a2fd2adb88d1017e21ec9ac926cd041670c87232f", - "766f237053428a3768d5a18cc9a4df4030ec7d1bf225f196685bd7efd797cfbc", - "878d0979e64e52ef3eb59eec2070791deb9ea927852165700a29c9ff753c1a5a", - "16aadd0b10e1080029ed4b5e6567a458d3f731c6f73ceb20eff8b50c7a8a8673", - "38e539713eaadeb525f4eefde4d61eab526c6f739fc6d9a28cc6ef97eafe38a9", - "be97400736258ac4189fa18b1648a72b71e24c2f0eec34b0e1d94f89630b319e", - "002c79e5bc5e2a382334954b46a1971e3664d5a9e254fc1e78913b5e3d53accf", - "f9f66665b0b7cc53f25619489063fc3cab7e468bb74d9af7954c52e8994b995f", - "6af780b3894a97552ad3239e8c0544f401e39d9d0330c48f0114b0bd13d8f0ee", - "83459b65fb48888150673ccb3875d9255712b1a9a485890dad035010a7adbf85", - "d6083274561b9468da3563d5fa4875afd6981ce7989d7d424a7efdb17772582c", - "d0186a3b7f8129f37ea506ab404ca48af46898aba54d7f336217c8109cee153b", - "83a21cbe9aefb6d813c28a323afa1a913e6b3df5c82336b3bfe0757d33ec2c20", - "f1689f5ab000b5adfaf8e6c008f866b7ec080f2611fa00e791d9a3bf63d144f3", - "72731921033897cf75e2d710f50bf55cd4b2ebb55452df488bf8e675fdc2fa15", - "c0d11251159337cefc3ffed6fa76657cae9379c5fe68b131fd349e6d1f72ee12", - "94f16f0300da530ddf0c2dd95a0f0ac300d05fb10ba1b83112f2d67bd9eb8eb1", - "80f2027aa767ad9034acb13e650d909fcc336194af9f73b5f780fa5ade8ae1cc", - "51c0cd18df6f4899ef17585647a6ade08b859fe9dd7b0ed1bbfe336293fdd520", - "5444dc92b8f12495ddaf1486b00cfb43c3d2fe992f3afbbe4c1ca43afb5fa9cf", - "5e3121df10a1826f0e6d7fe346014c6c2793f63a7ee967e8c4b8432f74089a8a", - "58d33f8d408ed185a102016406c2bd576a20ea62d41467072c3e1907c73dfe34", - "bc4ac5849d3b68333b6bd3856d779ba5da194415889fadaaab4ec6e4c40ec1cf", - "c836db6ebfc2633b1b311369e888eb4c3c2fde7ff17b340cb1db0626736b959c", - "ff7d8b4f11eac5095ca26f51daf98bf86577f9a9590d6b5499e91ca3f6c1b6bc", - "f05eb18b34d0f647e2eedd04ec1fb4b232c40f7d80fa3b72d4cc7cc02684a260", - "ccad6cd04f2ef1b4df1599d0214e17ccda23cc397508540126d428297be4d90d", - "c094755385e59740ef910c10932a6a183058b254b3de02b4664ea32e5f879bcb", - "90a63d157896d3d4b56e222f5e21d34a6bb89845d2d2403695db9e579a3b2a22", - "b1bc6415e9b6c574578be0dac17a46dff646f1997982d3a7a93f422d30be5ad5", - "f685fb0bd5bdb88ac2078d33cf4be91f414a2a3d08f4bc735d0b82dccd82ad7b", - "d8147eaeb8b805f2781215955fa6caa698d2ef982f12246264fd3b70cdc1b60a", - "4a60e7814dd740131d104f55ba09905f1ec078416e110ef30424e931f79dd87c", - "e84785094041e47c3e2000f77e969e531c0b35a8e090a02087cf4ed779c004d8", - "6cfa6ce3ac24a1d0aae98ae566cfe2ebde6e25ec0a63c2d711c3145af79f313b", - "551d3cb32fee1b927c4a62860989f7380446da658223cbab6a387b70312733ba", - "98cc785c1c76ad95442a5ec3996368ffe3d0fc4a1d1ce2814e36d5784e9fb0ba", - "f78ef0728f72826511777dbe69e874c4678f354f175f53fc33328b98bc4da5d2", - "a8edbb7a9b2fbd68aacd7e6e79f15b1985aaf666958ba73317acc7c400138f4c", - "5f21f1cb9d83ca54ac43b7bd22bc28b0b1b1bd486906f01bafc145f6f9fa51e6", - "b1d03ef69d2474c7766e245b6c8ce6be5d7a69f3ddc9baa8ba1cd41d94be89b5", - "0c398796830febaef880a5107b6910b9f6b05f2b3d40bf4ca07e49e17bb564a8", - "2c556d7283e3b12521d468665da41504c186565af3243fca6367dd9a57264564", - "0fe2639c2720849a99f7dda53c5a07df4047b296e28e6dcee56c5f452a87e1d6", - "8bd6abe552695ef1c1a4e80a7df440918bf10ec1bdca06398c1d34a348d77408", - "95689b54caf5e126620f4b8e24b57843f5e2e45e05c7f0409f302eaecd954ceb", - "efc28c79f3079dc0bff2eb8a94b85698b885a5b94a437c7cff9f3f7955ae5884", - "aba82cc1e45e4d5a9fd13a0290c40d76cc27b3393a7ae18b28cf69d347df256d", - "32799ded951a89ce578b1cf6a233a72d319621f023cf80d20f9ba030cb893dea", - "40b5f47c453d35779f3c3202427e009e0263f28f444534d03316726f1476058b", - "03ba93576ca7f60d10c088eaa67fbef3c0c05c7daa66ed74770c6ba517cf44e6", - "d3138e019e9ace325be0ffad29a3145707086dfc7af8d3cbf74f74a52558799e", - "d2c1d90fc75afc75ccfc5bd6e6f2b01f64e9caa5e9c56b6311ca002d31d24dce", - "2e82035adf2a4eeb91842cd283e223013b0e423b5cdbc4f01cd0f82a64ee2856", - "3c8b772d2ff6fdc85382869d4d1a64dd2573f98822d6fab4de35244ddb6e224a", - "f59c8e2a5db9f17227b8a10b52fead2c076ad3a4eb06b8065a56dd4d8e108bc3", - "53f11f32f5dbe3d7b420717ecbd78471b266590f3dae40ee2f63adabf3de5517", - "65913ddbcb257ba6420151f4cd9605d7bad54d026ba8d983247b7a871df33b59", - "95c2f326f3501a66fa7f42d31f0ab81b34f814f8d1c054e5cebb803b96a3e3a4", - "2c1182b22205d4043cd284a7c550f2883db70b02b4b2802e35ab2dd8da59707c", - "d0ed63dbb0039de39783ecf5de1341cc4781bdee1284199a2527cd89761fef3e", - "89a6e1e461ff67a67830679a648d9a6e14f11128d9c56033df49bae46bf53d20", - "e4f6e88e0984e7899b56c4e35e1a84e709199c2604068c13b4b1a3766b3c2fb2", - "f4b99b697ecb5d2073bc69c1b4bc8a6cf3e739958be38f07b2669937367b5437", - "395cd23a0324d136abfb75135b0ce10b38368cee44c7ab4e96c532b23d16c624", - "62271d8691e5efd40ebaa96c9a4d660259bd64990617d03d46a5bde82de8eae5", - "220b25da0bb98cd69df4786f98205717d136d3b75ff43516a14b383d404e6191", - "35382a624e29715bace95f251bde2cc8eaef21958185e52cb101b1bfa1928a64", - "564c469fef487ecf5a0cabb212760ca38878c5726bd7aceb42adee9f08818742", - "c5621e8e0d55864a93eb97a5f83fa88634b8dd25a63298294a32c9b0a42441cc", - "e6355c21bc989401210cd7daa57c7505e1fffe1c26077eda9f3343f05eb5bb62", - "0108069d55e9e0c8a34c1a666c373a60cfe8c46b5416cf4df5102513c0cd8c08", - "a3d22d4211ec43ea901142b8dd7654946d8351b14d100aae10dd753664ff9a88", - "04894c38708d0134238eab6e9e0f2cba0e43b2f0c0b11f18c4e3560931b3b39e", - "c753b350df8fbcff0bf62e3119a18ea323eeacb80221207527bc72665dc87d79", - "2c085be78b38a2e0744d57d79ebb4f5a1118565a0952e4b563be1a4f7a7f92e8", - "296ca948cda5aff2254f0ad6771ef839a561234908d54d7cc7d0c1a7d9473aeb", - "f560ed74d070237c2d62c44e98ccc4785e240eb0d088e49e0bb9dd0310e2df9a", - "f3789173ea32cafb5dfcd13b7e9a9d7088084c74e3379d43663f0a4337455bcc", - "2600fccf49b2f3faa03338ef73653ab69b31a67821380e98a05b6decee60c2a1", - "4dd9c1c6c15f1616280ace45b92c231dfe4f92c008408c7c0c0682bf9def1b40", - "6fc2622fff7fd2fa4c7e8190089c6831cbf14bebc81d0d32c9112298ffbda08c", - "f3aef1204391a8f68448ab7b916478198e10a75d0e86d394096636b1b52dd1db", - "a7e7563adeaa0e93ec26fff7fa978aabb0b46bcd9e7e09bc60e05f9d6cc13de9", - "bcbc008d06017288e007a530614e9371882a60ca31db5316a059be15a255e21a", - "dacd56fa5c2b4143e379b4ca413c4690f8e74d65270b6f4bdab4d75fcfce5fe3", - "c771ea7053136e7b9b7b06d8002d2ef8f8f4f3ab278758f3fd19e600bd4be9c9", - "dbb6275aa4f187e3e9cfd053e48d5f5b4d7cf4626df2dd2e34994117b1ea0409", - "b895804e8e56215faca1482cc2fe0325669df80b2a0f75a6f449d5e10043c4d3", - "f5f7e192aaa4bd9b40bf55cffb7b575028c52e8cafb388fc4bdaece9c53746fb", - "abeaf9c31ab0c2bfe77fda375672d4a807a222fb58eaf4548544fc10fa857de4", - "982cf16b564d7332516a880e7d2aa7c1b4fd50ed8eff8918739f98cbd98f19e1", - "2ec8b358b997c25b2e80e2a6a32e21b963ae4630c6fb14d30bf7b07ab74a0717", - "7dc49be312abb13e69b01cf460801e5a8de5c736bb3e0b8a279e5afe236324ab", - "43a808a7ed33ebac58cb31cfc262f4729024fe1d3f65244673874577c0ae9f1f", - "7f04f3ac8acd05f535716a7729855a40cf88ba2b52d37932b9530fca6a98c4aa", - "c07fe8618b35d7004bc7c07ac77877056d848506ae1d9f4326f4e4164dfa2d04", - "b20cecb4cbf21f982274c1e0ac83bdf3f327c07381d73912c290204d142f73a1", - "e99ca30541b73fb808bd35203b52003df11d570edfd6544aee8a091f45430914", - "c96b0308d2f5274c342a750503898d1211f720dad00676e1c287e5cd79e2dead", - "d2c2a87c2ae7dcabd6e8ac046020643e0ce5750b0bb69b658611110ef65f0e3e", - "50bf8eced346ca5c245cdb0a2923d363a5e2ea0cc3eed22c9adee5b62e70e6ae", - "6181e9b984b339106ef940e3ed8df81eafb077d03d125e2050453c1883c7e4a2", - "46f0ca9ae06ff17def407126aa3339c204ef80551fbaf5c577f4c51eba4ee397", - "78965eb7b760f22b35f05b8002960d050e623a3eeaafd58fbbcd128fb849b0a4", - "efa420fd6affcb0777afdd03c17fc5c78e75e983d989d23245fadec3e1ff39c5", - "57c76cf81bd761780c525b70adb95d3f8a78c060c59c6314e4574ba018fcbcaa", - "fbfeecee5b7fa1cd748c1a99c75831ec64f616aca84479ec28d52f0dcd8583cd", - "69c8e706266cc74a725dada96f675fa3fa72f3b1fcaff2af4c49404313c5d8ee", - "4867a1e2c6fb74569335e459ce1cf4261f2ff908679c48f735eeb9e981e65c82", - "7dec59e8acb87fc9d621da6300b2c58ffe870184adb6337dbae0cbaf053c5f24", - "8dde0c1da7bb0e6982dbe09f58ff2d82245bf64f20a02c4527b6c842c5e47776", - "7f6a7e80e72444cffddb3c00c97f5e00d21afa730f75b6ecce351bacd9dc9b32", - "f25869c8b16a6bfe4bc6318fd784a4903faf8977a9a8776047d3a790ae1fab2b", - "f9e577e6169073b9f074a839b3242b231145e8203ed1c3bef7192ca00cf4d375", - "93f2e6d22e6aad5d5eced21a2899ed694d07a95045e585d1174d070420ca4e14", - "659f36512c703645198b871b33c97d8fc6da44e8ce7856a88268ebe732498212", - "75644c1505fd120c3800aa709031cc52e8c6626be53a11cf33cf505bcb99cf3b", - "6c81d280f78452cd4ce3e349f39d69bea7bf2d45e7d4d71e1511753ee7c6764d", - "2557c0a13fc4842d2d3e795fac84a79551d4a5e04e81b82b86725ca2f7e50f95", - "0efe3bb191ee758ca346023d144621184f0f1567f8684a1b785cf8b0844de3dd", - "9bb20191f590ffc06b5299803a55a06e61df70938bbee8a1ad4ab60ee73e2577", - "a11e6bdf82fe0e7bc6ec7c726d7bbac71d663bdf096d67b6beb6eda2f5ee218a", - "39a4d77f5908e056d4c9c55bc879069e2b9242bbcff9f754a0daf6bfc02098fb", - "e5c605331cacaff3c0274cfce2394e091ee5623d7c0e38b1e4fc8b6c0de67d93", - "9191617a0e3d91378b4ef949cafe8ab65e882309f19098381a6249581d2cfc3f", - "fbaf55b9ae58da9fee7cb5c06c474f9e198e1f3d83ee335cf5115a028d7cf404", - "a78d2d0da990226015628df06f7c89d2da263b90454ad2d6b72d26cf1079321c", - "213df02a2cd2fadff82644eaafde9eaf2a5c40ec0ec226b126a7eceb7509ddea", - "d45a5270bf287232a7f05ef518cedd0852979bac0a9a9672d4a6596218e49b24", - "1dc520746d54cfbeeb2181ff97815169fc361b8ea6e07aae0f11d04383d641ad", - "62b2509b735cef836c6c46ee801d4fee49ff9ad30d30ac0126e5244c9764c1ba", - "bb0cf642aefde6064901e6683970107af6f1d02bac23c39ef9ba87f3417154d2", - "bfb77f610662c1a9e84b9ac9457cffd23684a07bd58de3c64816ee5a82912c57", - "b4a73d645fddd5608a027ff1067e344c95b6495a3bb33fa49dfe4090461061bf", - "61b46abd6a521ad8bdaae5d1c2f00610d0faacaba3ac7b7e51a747b59aa8201e", - "7a1b7d4fdbfa27ef19169053cf9de10af6bce6cf6c1fd3608126dcc827175208", - "1d1fa7c3ad8f382b3af62d92cf05cad82b0db9e8b1cddc1ef885f8887b63f3ac", - "14591198236fbb8cae3ddc522a08ead1d6f4db3324c1af7ae835328935515d4c", - "c168294b672d5c05ea198fc4089bdcb70d9d97dad87b570f93b64626209a9d8f", - "24fdd51a797f92909c4eebb97db39629f40f459140cc9db441ac8f7a773ecdf2", - "4a0b4d7dcc24e4e7fafdfa7b052d2cff5dc38d1faf5faa1f33b5d9e492e5ac11", - "85eaee0406833b39fadd1c3f24e0d346a761b62b6c06bd89309a74d9271fe577", - "2bd7f33085c70c9bf05e5c91fec4a11bc36b8ad5462827c5b189ef26cfa4d59d", - "b96cdcfa8d97bab985bf084dbc3a3c974b8e15a438f3682339a18be432a2ba9f", - "8fca40ed2802c4d0ff5cfd1c1f141da204631974e51468ff157deb54aa3dd34c", - "c64bbaf1158bc54ad5df7cc58f3f0c6da7334652effadfe029dc2f852af288a9", - "eb1d86c1ba314556bcb82ab837a57ddedab0c77b1dd9a59eded79d253f7f122c", - "0d843d4b1d0042a24bc5b366a992bf344b5081bc3a4abbcaa16c1da6dd36990f", - "8d3b289ff169dcc643c7afdf04cb290f714f79bc01e799a126fa0f83c3cb277e", - "9f39253c3667d40b7370771e1dc33e8d92c8ab8c8f6ee7259b4b28538a6d5e47", - "76af3489b9e80aa4ee3d0ba2d5df8364f6d4dacf33eae70ad57904c1ad3223be", - "f69b2b59cd10ffa38adc0b86d58238386cd75229fe0d84f769128960912494e6", - "01b5bfdcf07754497ccb69299c3cb26117d1dda4ca2bf99a4b1a845f040aa90d", - "4bfea69e233e9212ec6b8f5ca93f6e6a952aa217293466488d527168c0779404", - "4a3df87d8a500dc43b46fa338a8080fd873076f086f3edeb21e0499b7f30cb43", - "9e42cd04c061bc2f84011fc3a8d2e37db2db95919ca6c2907ecd322cd7fb5abf", - "0bd1bb2db927dbd22b9f56aa8a23056f7caf69d459f6c81b99e802d122de73ed", - "bd7fa8d6ecf7488248f11c54cbf09dffe88b836578f0a64184f9d3a6c6c75702", - "6f18c96bc94a4f1263da5285a6e02f22adf99be8f88041668731b2c1ec79b6e1", - "53097046dd267d88fa7809a9d8824a877b81c739ed01eeb6aa3b0fd86a110f6f", - "1a147cc4b95f788a0629938af533c1e257dad895662ced2df5bdb06c17755541", - "29a9b63df1c08be04c6d2bf658f08551327375f3eb6d90a58cfd9d29c0fd8144", - "f1d02c63ea62c79e60b537aece6cd2b7a57b9c3ccf0842111068056d2af66fd7", - "e1e4cd54a215805926c06e2445252459d3ba88b3ac71968122568b611b3e5045", - "add2ffc6d625a8e199b061592ebbd63c07988bbabac202989585f44c67297ac6", - "36768dc6f163979d2ccc8397774b03fd482ecd6864159f9fcef95876975b2c64", - "01e461f26bcbdcf6bb07374ab54737abd44f5885d1a7821165d35a854da2fa88", - "2c80d4151556807715db82d088ca630d8c1b6454e8ea51c5eeecc35386f75b10", - "a7cd53acc46af59c515b0d03ac23ff6d745788ed872c834cb10d51f5a4aa0e32", - "b2401773a326324c250c4aceff7dcfd0098847eb72fd40674efb159d4bb2873a", - "47529fc015ecc2c0b4865dba30dc73ab92fbf89288a0489605bf0fec419630a6", - "74daef9c6ea1fe24ec3fd5067ea493c3edd9775445dfa4595408c6882faabb9b", - "73c3e916868d269159bed6fb09c9cf0665cfd12e570e7b61daba6db195833a19", - "4e5eaa5f54f95fdf58f78308d42dacf05f886ef2cfb2fabad9a3ed3d2735804c", - "4c2d1731610a6fd56ec35600cfd759eaa252d5fefa10f575f16d1c75a9d45db4", - "46b5903adcdc0d8eafe336521d0c25988e60acb71651f609ec5b65cae60cc54d", - "43238a41e803431b1c00b64b27125d3397b109947cc8949f28ee7f8141bea070", - "dc4850702867777def4b4e6f34275c2132ba20e0af28162a9abb259959da8e57", - "aa04bec7b97cd407cb4ad844ed2c90471528aeef445718a40c7eec883511b321", - "d5e9d24ffb6a8d7769272956f9d85386d7b837917a0c220eda14006840b6cfa6", - "6ac5dcc19094eba4140ad7c8562f538123a3a2fd061b6764437d883bde209773", - "e5950c001c2d0bce7247d879b8c6c1858df7ca332b8dc7bf358d2af47c1d90fd", - "4fb99892fd8f086197c02dde2d22ac21ec3adb59048c575c40e5299594b8000f", - "f5cb7930e4365d923c58bdc754b91cda7f08f682b1c771210c632e2c67affb11", - "6eba34492e2e4e8afb6c50a59bb5a1b836a68051a9cf9f694888c28acc645521", - "351b599befb1ea7a95711e95f8358008d3542dcd4bfabbd10817ec26ee4203cd", - "60bdf5e19b13638a5430705668782caac56a27e11f8dc93af58536ce1e601e1f", - "32b90a27053f7824aec5cf76d9258d6e5da43ce7233930c0a4010303e35126f4", - "1a7f9e75bf833775a132d05ca342ba3330ccfe8c2594831ba1947294a85b3082", - "c1d8e27dc6e854a52f0806ebd7ba5bd171ffcb44d9d2055d94d993baf30d1028", - "39d05c0881dc2f2a7a6ed3998177ab057d30f38dbfb29b810662995945d282d8", - "d9f4188a945affdde5bbe920634ecfac1c022de037ae8d6105775d3719844c43", - "4753b396067e0ec46368893bac0e39ee6a4fc8610c1970d9503efb496cc58f7e", - "f2e3c4b8377e3d1f2830828cb54666903e30282b50adc85e96490e16182a0b08", - "484f697e1f142a67aabc5e07fc56e20a2d25a0d5ef1c3ccdb3c3c63dd3276682", - "779d50c18922dc356ef46866a4662684ce0eb2ce0eba4d1ded86377149107e15", - "b27840b9920543eb6ac8708efe2b80975e8f3ad51a27307b3fed5e860ea092ed", - "41bd6d00aa771ae0f8af61f7da9c93dfdcdd5a2502ccc5078d377b4ea3f354c9", - "1f94339d3f262dad130a0417a146e6a0eac61d044b7de7ad3a9fea62f03a2388", - "1c330515f4dfd9be4b6698dc2979054f1b5f0fde5110857a93d226ea1c786bf2", - "15683877ebc4ed80961748321eaab4bfd1f8888bf019ee1507f044f97d863094", - "eb1fe03e8b0692f9fab0169177fb8562417a9848794e00bab15b078f2607fe06", - "3db835e52bf129e393c8bcf4c916591c6d84b88dbdc38d2b784439b4e9397fd5", - "dce55447da1525d56bcd400d4c6e3b8ab779443bd6035062a318443b82e1ccbb", - "0d8452408b21029270ede6a67e51dbeb0ee9e2645f645d40dc232a2c15444584", - "faa002ef59ea128c13809812ba419f2340a6190fc571f11a698b5947097c6ced", - "1d0cca30975a9ab073e7d0bd2726e391eff4ba2246be89b0564dd8cb1046ae56", - "6db0307ddef6e03329c8a0a77072ec1d846fc232425fdcc262cbb409f871752d", - "f58b32ce1945326522d7c83dda629733653f16bfe1ecbfcaafe3e70c0a0cde56", - "30ed1a1bb23416a465e1cd96f5f39dc4f9dd178af4dbfbec22dec12dbef4913d", - "6ef0e0d86d5c6116388d170fd52ed99a4805b2386192786ba143e3383d1920fc", - "807b765caf407e2d824f6187495e05288cd5ad3d7fc6276630b9cb1782ba8c9f", - "38ade4b7101ad634940cf05ffa1d553a48a61550385987d4e3e2125da007e7c9", - "9a776d1ea252fcb536347e4ea759df3e8f7aa9ff4a42c7918d56165cffa3c419", - "30345985f2211885232241be113a80b9428b69aff897e15a1d7e6036456a30a0", - "0512e9e7d0edbcbb925098f1463c590f1d6112f07061c1bbbe5c107defef0af3", - "e6b6422ddc141e125ef8df6aae8aa03276343197991441d8fbbb5fa00c4960a1", - "08ba3c43564e3fc6de7e3730f170469938e716d9b148e9c6c45e35d1f33e457f", - "d93449bc3a59365a18327afc18c736641983e5b84e0bae68421d0ac5375305d0", - "8a94b578fc6251153b0134bbf1cf8987893166ba9f383c8b6bd732fe9071e360", - "7ad7cfd6207d19c5668951ac844c04daf534d495a279d9d0154eca1a04bf2eff", - "08974cc2cbb13246833595c14851c79babe32aa04efb61ff39066663fb6d0650", - "b0a1e5d595dc6752b3ddd1e6dba33ffb232d767800be8cec8c46d048710856f6", - "87266d781efa74e13ee0fd39a32a3b3bfb7104f480aded0f0397d71fc57ffe31", - "73bc716f145ad585873c867352f78fd95ffa245fba2b72054008ec84ce1fde83", - "bd1630bf0227fe148c9d16c98e69e195158549c7da2ca380eb03bee3eaf1df74", - "028ff6776f8e0a4e6737c865b1cd91cb6ca3243124d099e049d8fea200335461", - "4964c3f5568903e1626e8859070b0c4be604922d8b471161caefe19decdcd047", - "22f0c1d943f66eefad2816402660afa2f5471d19b3d9b81050431161ce881d74", - "721847e79d3275339c6e975429c0c5e6b4acf61539f197696e44d4d92be5036b", - "2b4230d890ce61c31fd96eb881ce2e593a878ceacdd6b4dd1b10076674703f69", - "39f2d9f4d35d05fc023be5e6866bae8bc8e1c3197a72d9dfacda34c155e83c62", - "87fa2e914f7f475d99c5fc9269d60ecfbd12cb4a94ea324a13d666f1781c967c", - "d6237890d7ac1875659d300a9730f792ea0691d013dc7c9399e9d6d89f180ed3", - "915da1a4763481ca1f2bd48621a5b3aa35eeb4240f70fcd138c7b8788af75323", - "28f282382aa503b65a5cb3f1deab8973d6810d8d6d4e3d7b78e7eca78a25a2b0", - "bbaaad1eb2e8ad49e5025d53eeef290551e16b16f1281d6757681a160d96b353", - "302bec35b223f67fd7b1067ad5e76458d86ac61213617e0a2b5f3ab031f42e93", - "3a3013c46afc9302862701438919961821c14f12de2e40740cfa19be3a5e1343", - "c5973200885274f45770a498022fef0e76efa33023d4cb3e20f6cbbc78aca0c6", - "05eee6a97237f562758bcc181e6fcc3887049ee2f72346efb4fc97037490ebe3", - "1f0d0d9d788eef51def9d373e8ae2045c736aa6e7d1319df4a4611723dc9e919", - "9325b1293319e8eba09fbcd6525adb3caa3885aac067be1780245a304e345283", - "3188e9626a1e343dca00655f839870f1f52a8d0ef60efd6ea534bfd9a719752f", - "040643a8b8ff4b602605691c0333f212dea9a5b97628e1b4d13ff17217b388ec", - "944ee0fe3962817bfa9cb5d5d7a434b42217a53a3e4f3494f912c7d7d141af5a", - "6cb8d17a4a2049a997606c1e649e77a6c2457f8cbde73f7321ac4c6dda6cdf6f", - "53ff050254c009953a729462b81f2d374d2565c1c01807fc0dc64f67a9d59f26", - "e94254ae03953dad19823a34551a2d535e9d69bf4927f72678339f27c1cb8983", - "e7319df80001b180a7d2a644c8f8f4599d11d79e3db598db6301ab3a55a389f4", - "68302ea69063e6ef3ed517a0046b9bf1853e1044245db21d5e7603d4f961e67a", - "1781a270c4ea58ac3f6e2d51f4225f6f21b00b47dcf3a0857bb8d32819043f85", - "209065906d277c1c02dbffb06efc9a5358a73f1110c45db46b2652e6ed7fc550", - "cb9c79a09f9b9c2be2d0416ff9f0ea968112b479db1322986a102f6ff3ff78f0", - "4e27c2ca9e1ad5e5b20d78e20508f6052d73f0d11a3a21f7685e6bd2cca56478", - "8e38475360e59e7970d79ee22a2e32f2f3b4180af3c1fe615d01a06c7ce9cf61", - "7ba98240ebacc00911a0556a247ce563d6e248f0e62647b97b5e98a49082a6dd", - "f73012cc9a860da943f5f83f2257ff426091800bac103958074d4c45ef0ee73d", - "a17565512bf5416537941ca09507e1dce53faad1572dacf93355ebd5584d378b", - "a04bc674a9e5215e7c1ea8e51385b3ddb272aa842e88e122bb4f6c9cda4eb563", - "1e80311fbee7b36616e4401d9e428c961b3248920cde39edef59d8c95b3574e2", - "9bbe8ef98ccf5d5c89074669c369db639e141aba0db3a596116c647b8a82079e", - "8e279ca33a0d2749cfdd10641f86dec6a076149c9115dd6dd4ac398b14521c7e", - "07a3d2baf23a935bb5be189f449feb889dc878bf728e4ee75f281750a529241d", - "d1ed2f8b2f17528708a7c8e7f4962544c98025ee6e62fa2dcb0518e434630ea7", - "4a5c016407aad2475a81de26c8cee1fffee7935de5cb0162de6b60e41e49048a", - "b7847a7ed46f658671683cd724583f0570831acca4255a9d7755594f873c02f4", - "dd92fad78135f1906aeef9f14321b424f7e046ea4b5d243a38336d81756678f4", - "74cb4bb7f0459c6217188aa3ed95301c12952eaf5df15531a1e79c82a421e2cb", - "dc289f3c565f3f9c4fd1619d59d9f6b9b940d17aae8950fc30acc3d2f546a246", - "9d83ebfae13cebc86ebb57527ad0481de92d4ab8cbc38d7723eaabd5cf68960a", - "eda8f9272762afb5d1bb45406f7de9168a97310718433b4525def5ba16a8bfba", - "7e2d7b160254974bfb1da359227c3465b504cd77dffc1bec94bb5821a5cef452", - "85004066e48e3d2c800abb04354098782d61635d6a82ff95a94e3c19542cda39", - "3582b304e405236ef1557f30ce9fac0c8e8e439dbc74f9769428f1434dd2cc57", - "6451ac2e974dd9048e6a2e2c75ecb84b8f939ab00ff0e8dc25e87100bd087550", - "daf0a30b0d42ed8270497f31553468fefdf7ca6066c83c262f6be080ba94b553", - "bd7e6a97455ac8422c84753a6ff02e562c8bf313ebac98084369bb85d3ddcf25", - "54f8240533dbbff7dce8b57efe572b9600b71e85ca70cfd31f1d7e23710eed1b", - "6bca82f269bad1532a152ae4c6db63683851943981c075c1be3dd9433b01c877", - "12297938eda23608a7b8f24f7b96c21033d9df127619e530cedd7e74f54c345e", - "d1c9e555c976bb9dc3646dba519f9fccd48743a533a10124af66a8335bd50398", - "664eb82b9a4bac0e653d66a6d04fdc12e0553b368d008594421d5372c2bd3211", - "bb2dd403a7993561dc8c43ac8cbfe4484e46f276fd776e08eefd1ccba3f9c8d5", - "269df81fd3744ae326cbf14a31210f4900b11efe9fc4ad5883aa8cccb0d0d777", - "793f939c8b4458e9881af5f68c49838ea3c9c7dd5507e88748a05cb18eb302d1", - "35655e2dc67914a6ee452527a393ecde4ae160f7439cc9e4d09d4b6b7dfdf76f", - "c0bebe8b56b351bc02cdf336423d67919dca3d1329c15a2d3bac0d130f3d668c", - "c2b85333fbdd35f5bc82d38fbda147b5eae4401ec5a6faed098807ac6d6733c7", - "47254106efb38f8e4bd2c9e5332f59c9ca248ab1ebc33c3ec5ba4ccda102f3da", - "b9cd456549e43340c9e2271ab3fe3bda321ecd1143a59644d72f472489118957", - "dc82425300870efd0697e2782ccd9987970f0a1d0f0414866e1d4434f020d5e7", - "682187b72f725bf38c288ac08b24810c68713f049053489a532538065de2ad07", - "381d358b1444f37064bb644848bc4a03f231c1e8b334366607f95f0448e5de60", - "af2438835483abd0a3be881fabf0b1abc66f8fc83e2ad8b908662267beaf1194", - "801609006cc5ea6488761037270a3fffc9151019b9656190c098dc03f9718d5d", - "5d6c982f4cb5bea746c7face9dd928444f241b8c4aa9926ce31f5491ddc6ea96", - "0e29748c2a125f405b5a4e7b2a7239fdfb4eeca14769b44deed251c44bb8e389", - "70ffae0d25b719722c39cf500808eca6bc5485596c0485e7c9a980c943583e28", - "eaf9fce96ae11de6f06326219f5c61267a6009a0bb5759e4a1ac1af7b79734c5", - "4265cd4821291852916cc39305badcd7e587c40c96d8e30c28a7b05183fa03a3", - "cd5caec5c8f8f360ba53436b168b6d7febbde6f66676e7b7268479384c1c707f", - "203350e9dbd8877689c2cc8f9f3be913773fbb2754caa09d216693386779c9fb", - "1434dcd44a3aad26266fb8ed91eb64f340b3c68bc5221cf59ed945dffe597d8f", - "3990c1436d6913b1b4cf8b9a404bb5c615736b299ecaa795852e4005a880d8b2", - "5989c12bcfdf10d84ffba37b130fb966e54b5a0ae960295afdd5ed7cdb5bdfea", - "8a07f9f87a377c42a12d8cfd9bf18d2671734268fc5c91134f380820ab70ab23", - "175ee287686b59e68a183495a8d307597243fb1ce11767a17f4beadadcd7bb2e", - "8b06f74607b1a112c126ab2a17895b6afa3a6d274d4b1ad32bddb3e5d9828705", - "26e7c96844dc89b62cab0c9fedbff448807919c381fb69e14d2a716778e8a2d3", - "f76b78284d62d879a1ab008f097f99bfe1307099cfd3f33c35369b8ed5120749", - "b4d3d7b8e052af8f705fe60cc18bc41da40deb3fec6827d4f9ffcebdacf07c08", - "3d27b4bd8b2fec3f5ee14e3813da779181be1e105cdd3ee68bee0bd4e8904041", - "9e6e19b9bf733fbd5901988c3c37a5ec8f2e95c3e41ce7939666b6342587c75b", - "0c35fd4f178d85b79249da0984593627e75cbe7a123e310f2452659a880f33f9", - "6f4dcfb96bf224ee408c16689e815bfaf7e62b133dfff7a66ea239cccb9c7158", - "9b01519531cc94e096d2b750c0ab0cd18cfbc83a14e1cc77860f3836d5c2277f", - "d0fbf35d7bc7336537ef8ef812019c7ec6b2265990a6c3103261f52237b6d6c5", - "b5662bf001f5b3c1c750162b0a90773a5bd1bc101cb62fbd03c0131bc44b5635", - "6f205c66cb8aad651627cf824b7dadb8787bd748f37b7fb4350e7c6eea9f936b", - "e2d16b5de47987925ef27e02fbbdfb91795fcaac2a6f16b72b96012c3950de3d", - "84955fb1bcdd81c6e62324ca54af4841cf6be694119926a1de566854c36b68bf", - "7cfd9853ba3ac0cb9f9b5409a16e9fafd67ed7608baaa081f4db94ed64ae98e6", - "920dec1590ebf6b82a5e6589688df856d47523a99592eaeff0361bd380bd260a", - "bfeaffdf0ca7623acd2fc691caffd3357b49a1917f9bc5f4976e14d185518f96", - "8f6c506e72f40a29d276f47559b35db9c69c7b4afb8295fa888bb9c8e830518c", - "751d69a4149cfd72bdaa07804e84d36d8733cb7ace4d94493aac514c383e0d7c", - "02a42dcae7ee339873e4f0ea791b524799f912faac31d40f1bbe215f577eeac0", - "92e920ff0ee6bf8e554dbf67f517e879867e93d60a9db9c0c2e90f10d2370b9a", - "d75d66a18185f27a305b1c77a956b94b521c5acce6ac16c20610b30d80b911cd", - "a2d9b08cc477efdfaa8741c462984d7d44965210f521bde090e1836b2b0324a2", - "230a0553329ddba187e28b3a70ad78cbbd2abc25d12050874eb2206a719cd286", - "3b7b04db7cd14511480a067e8496a68ae4572e18c15c12660bd3a190db8c2e20", - "ed5dd407f4bfcc5a88f5c790acdd861faafa82031e14b8f4508bb50b57ca865b", - "5376756d01555dc7fe15717aecb8f2a276ad09f51a0bac669f96f508d199c176", - "d7b490c9965ef48778334d17bbdff73cf1a8c46cddf85a043f3c66e9fe1a2f88", - "cf49d65e6ac3d3084779ee825266208496919ddee722dd10aee95c8610cd6b6e", - "68112c341d4507a37c32250feb3c25c98f33de598770b98348c53d2082e66476", - "9cdb3a08bd9201a9186acfb0513b1d083b5be6d5d33cb9ef9e61c540309b8915", - "076c55634b549ad0de34bb9fe51acfc9a1fc088f0c166d7735406219b4ef680d", - "91ba99c41ebce9780029637379f4f9507708bcaf8240a30dd1a6eb900b978a18", - "de3db70b557bfdefb4c320c04bd1f7a3476efb1438f7d711f251f24886c9829c", - "6038cb7d898ed6b5ed1b01329760faa672299162c6b1b0673c2f517afbdf7429", - "e0d7de433b536432d65e2ba897623235d1291692a0ec94ad368005f3a69491da", - "ed792517a54fd46d33e252b6a67f010b2edf47a3af6e667ab805f974e8dcf110", - "18472fc9a72a4f796e012c2635f246c9b9c3da721a460fb05e668e8c93a0e12b", - "c8044cf191c2475d0ca5d292629d308ec83e52f8b06b17aef88575f6ac3158f5", - "f57678a70203c71aed1e394243a9ca3b0279415648b45d4657cb7bc53d4404c1", - "cbf118b2e7a7e0b9c3ebbc99c4fce2bfab88e8d5ca064dd22fceac6bf0645604", - "ef8231e549439c479212139d1a001b5160fd069b3ae5942a8518a08938292583", - "4b025a9ec11cbbab60080752ce011179da25ba5ae173afb3fca21f430d0e2811", - "30837960945eb57cef0016f1849aaf04cf6e11895aa8ea9c82af8cddc3c3c063", - "5a6708df8ecd5c0333015e02cb48dad5ca4d291f45edd6169880dc3ade317de4", - "4c4f6a3aac8043f0af842b30ac3933cb591c9c012c03bd8e52059a01afa408de", - "be4d2f3a600ff578ea9d2cd4964029c55d749ed178f61be34afbadd8b836d6cd", - "e1c75800acae4206f417da90685ce5b7cdc2111390350986db88b5530987e506", - "9eb179e29762d7f38016d5cda02684f0d6f7b2f4195f2952015f54fff27722ba", - "f5aaf05087522b780d38853135c2c692fe0e6680f3b695d9aabb1c7ef17132c0", - "37394d1917e9dcd5cf8e0b8af0d64a2b388a33f32b151b4d1fa94fb62f2bbb38", - "9f2dcc3720f642c611da8cef20dfe77b0a4a720fcf91396bf58f592a1cb8cdd8", - "129d393aecc1a8aa6f28651be71f4df39758a000b9758926e73d0ffd2ca4e15d", - "2717434571619694041d8b8cabed9ab694b75229848a2bc9b370c750c7a786df", - "337e080c88febe35dc2175d5fce0067487fa3b828ff24c2658e11b7133fbf7c0", - "1f597527ee9bd2a8276720ec7849daebd5d4f922d97dcf38d317b9582904774d", - "4ee1952755f7d478161c7f7c341755e821ede81941f03955c82fb5aa47b30212", - "583ae60b02947deee787feb0aaaa389f5293ebb5444bfd3370842bd22d76873f", - "6079cda16b76a81639d7b0d0bf7b075e1d800a22d11a80363c7c812b99853753", - "5eba932443e7948adde8095c99b5cf7012185447f2cbe5e99ba1d9a9f2c8ca90", - "91749a3b9b73b57bd2b4c75a170681675d380a7c3e78e5ef133f37f2182a8e1a", - "3f7c733e4cb7f46311ae393694b9f5bb5651683e5774f77622bbe2e3db0fa1d0", - "1d7ca8718b3930624dbd606fd04c4800efd16a5036a23186613f9ffba5c7524c", - "9a5febd1e34fc087d13d39a56f30868cda5d8db0e567b274093d302f69abaa60", - "0e8c54deb645e610979a8f608f63206d3579cc0586690fcf48e43abe946d7ff7", - "4d40003927c8385fb97d06ef76f45df4c50b7303ebc367a0877f58b45261680c", - "18b9ba5d8446018b5f740265c91fa9c2ae7ead135f787f700505a56ebffd839c", - "da7af609101dbbe460a087559dc0f91841c54d0254b205f93e8070d0019480cb", - "89ad3082f7210923aa952c7605e1be1487ee05e19cf0555157e1fa44cafdfb9f", - "6a556487ddeee739549be902f695499166bd3d57fc3b6a7592ca05b37f785531", - "061824388efdfeda7facc405286453ba75c555b05d2d490fb8b427df967ebbbf", - "2325cbe0602cb0ccf7af8c735048bfdd2a0cf19e6779ac47a4dbbfb721161761", - "aa2b4ff9b017bc27c9afc3a1226489f113fc5e6e9ba50aa9fe0f357c89392027", - "c29cf471569a3d7e487ac19457bd119ddb6d9cd9f9d728185e41bca3641bd7b1", - "52a9ab75874ce1fecd404e5c42863715c008d43892d0c22e66c503c5a2a41701", - "b2512bdf87f35a8bfecfc92ff5acb1f79f5639edde80b3d03ba82c16fa38f725", - "f3498517948b783b269fb6201c98a4daf6be22d9ccd6095a0b1958e1f9a9f739", - "5a7b17327739af9df4da06fd7b21d1c3f2da14127889ecb6fb42422fba76168a", - "f243308d55d16fb7636139d32146a08418b15005aeab5a173f829c67bb09f059", - "b32f49f775e2663f96be7e3d4038b6ab83a1f2ac65078a6cd27c8611508f7b50", - "221ed5c550f86e56a7170e71c24dc5e673b5529624745cca747ae66b106c8b80", - "ac52c3eeccc77d84b2babc6ef6c56a648bde979e825c0116ca1205b71c37d56f", - "04d21939dcd86333293e74f86ace741d5c9ca5980c5502b8da1a697f4ed03618", - "f8b793c4ce57d5375a295cbea2929a40fa55e79a497c2f9c52ca5fd2518bf737", - "8448099545bc508b1eac4823b9998024c658872cf1fde8a25f341e27fbc9b34b", - "38ba926b9f1c6c3d182c6efe2560a116ed8328b1d76756269400f375be314bbc", - "84dca37b23aed321eff6930e7ebb2c709c3433a2ab5deaf521f8cdcb8bac95ab", - "8db41a52d3ea239e8a2d6b3d6d2d4dc0be6311a92985b1d476e203a778fb3e25", - "739563b22ddac658f405668d18369029288d8df3f377482d18add4cd169930aa", - "ebedc020229cca37686472b89ea6fb879e65014f546246f27c9a6c9f99482523", - "6e4c45e7e1de9a9ae4ad513ad51ea04d4e794522c54330e88592057a446d6109", - "888998c8a2a76c7c4c3c0938f8da1603fc0c98c84e4f26fee5f0e18aebf2f0fe", - "a6a07d89e3702f9872865015cc13f6332c6fff467e4ba7d3931ce4c22e13d02f", - "a633d33277270a54251458818cf2f02948d9ecdc89512f1b86d6172671f815c4", - "e4bfca2596ab59fce0e1eb03d6946f8df98c56f8c133678fcdae21aebf15f485", - "19e2c566130c0140b00ef10b3c8e34146e1956a488224542c61e34daad402293", - "41e31c043fe37fe0452f635da3df686e7fb4bb481185bf4a7cbaed77de459793", - "8be5575d126057125bb532e8e84869b06263c34bacdfa3dfe11879deadf02473", - "085d5a5f70b411fd45ce8af5575032adf8e34d19c21800782ed1daae6ac8de08", - "93698a5b956e2e11de6530119248d00e66e9757ebdd86bf72c5768744999d851", - "202947926923190f6123f5d4a68f2e270abddadb260f660e0c1f43028c84bc54", - "48dce75faeeb4917c6f68c3189be8d7e4912c0d09a55c7ba7a65256cf8dc0058", - "6b0bc0e8c9d82af68fc2b2c07dd9388f87706bc3392416c09c16ed358645cbb9", - "9d71505762b8cc1113bf34407fd16cd3c0c5b844710099fe9be0cbc876962f9f", - "94875e91b7b33aab9fa8d03ae5406d85d365cb1ad6cace1b93e33cd2d278566e", - "98217f104f01bbab977bfa56f152b2312cade26b868db70488f3103dce7379b6", - "245b9fb2bf1304277625a6156adbdeec7b9540ed58095310848b6d98c8d52ba7", - "ac61c1766ebc75226e4bccb95afce0e118580776f1d3c365cc7f37c87cd61206", - "4f0aa91eb9c207e7671dd95bc99388ab26a4177e17f9a152d77057bbe78286c4", - "1d2e9fbc7b747d08f353eb4f36630397ffc50886ef02593889546cebfc48e1c0", - "8223d2b6b7b5f294ad600456a83e5e576faa07765e4935af0ed71e36132065e6", - "a3df7e662ac0f93e5cb602294dc3bab4a264df2f061bc94faeb1afc3599117e2", - "82177d8b3b596d9219347e33c19a777d075a30815df79bff192548b3cdc4f3c8", - "fe8dd797d5ac62d2455db3e4b867a6089a57ebdd0e583643754bb613aaaa7855", - "0531de3dc18db699c01313172d917548ace47110f60b20f72867eecf8da7a6cb", - "f7c4b3bbbd06f0af893901b70f9db9de5c118e708cb6260f4e6e6a2750252614", - "ddba9e51e9d5826b939b6854992f1782a6bb0c18d4603af057f7d668bca84008", - "9440ec391e0579e54d0e784cee6d643f39fc2f63b9e0e69e932e82d08be801a3", - "d46642499ae5aba6de12c461fa0bd16f991879ad3e599fdfa8fb92d35aa790ba", - "6427a6f54dd4b61fab1088a2e06f03c02fe45262ab6a16d046fd19ea93ca6835", - "6b78d17e9fcb4799d18397acf499d9b43136d69864c10b4821a23f409f0c5e49", - "eae44e2476f0b150a945ab9500fc49a2497098ab34f7e8cdcc94703ca4efa972", - "56bf9f7cd11be3774f3ed6b94399092008ebb9c858684c107fec68b47a3a2912", - "a6b6d262ba772db24b3e4c444d3ba3c155a82cfaf06189d42936a0863f3937fa", - "05beb03bb1352a8285a4d89bbd3f52d6396a25af227c08c84ec6bd16c59a6ba3", - "84a393f478445921a686028ff25ded97d22a50c033d21d50b5003065df8c0af0", - "f4720f4b4a7501ab1dadc900de24137bab06a7e49dcd55ee473a4cf65533e31d", - "2b7ebb25945050b188cd742b87540c8ad57d841571adc5e0456a9c9dabef3317", - "0f1667488bf434a348592839d7e91c815866a1319cab041f416aeb07cc735419", - "ed477c6c0cbb68172fd11080a59c54b1f1dd862bebfa596441ec1ed22528aa6c", - "977755297165d92d9bb42a9f84ad2f3f6d83f378d3663e7770fb98b0511d023c", - "cd32c18671936602911d3d6132e21968dbd13b04022c019f21c11e31be8651dc", - "4e3c04e994fc632eb206c80b08f393e7562a87c9b624878d0ae4453facddbffc", - "eede01791bc89605f95f6e96284140c27208bceca0d69b9fcd3e70aa72f3ef43", - "ab7e076abc8a735386361a069dc5da9a4b05bea2b9796ad80239c0ab59d8cfec", - "b8eaf5865d5a3ccd88b9c5234f14132b6cfaec221ecbb49da9acb46d06a1c71b", - "54e8e0f0c19f95eab683341b992425dfea0ffdcb526c83356b817118d5802eb3", - "7ef4056681199adfc8ef9031698261b4b427e61a11e182ad73d7c470e8d080b3", - "3b6c2a7da43af8b30c0643d0026c8972629b65e531250ffabb99c68ff3e37c31", - "b3caa152cf963c51bb3a3e14acbd579bc0b969440bdd10126fd007dd41482fa1", - "06db313d14b848ee4e03bbadaacb40f61cf72883d9c16a8816d8691a3845cc53", - "7e5b2d04bc6c5409ae377f8abd06250709fda0b6fc8367b2777dd88b72dd8238", - "f25d567f4c27ef94bc68f50d03d2dd2d7dd1a96002017aae6ddf8f820eef01fb", - "b010ab8f07f361cf674a283ee8ec20a90c294d744735e3bbe4bad7cf62dd2b2f", - "6217722b856b184baad04e529d697a3c13954cb0209a9c6f0464e8f181a6f4f8", - "fd298ccf1bfee96ace86bb098e80213df3e9ab2c1d5da36815716d4d78285094", - "3af826686088b5ba528a34e287aa66a252c53bbcae866313a7e2598ae22e44f1", - "3e9bd29fdbae98e53bc3ffa0f77dbde48f9e13a19d677b50e2467fb6fc41c43a", - "3fd3cc2f71bfcc76d2184dec14b85cdc8f5a4928bb0eb07ba1741c5a831ead94", - "34526913176934fa39dab69e21abb32893a56505f78498bdec34dbc0eaf10be7", - "da79775daeaf070e24905e0957cadb07e7dff92ce9ac8f75b9726af7314f9370", - "05dad9875549cb153a646b49623d7fddaa8d0121beec3a20a2901ee04fe46234", - "f7f95fddfaa4bc4c69da606ce038c48067adc5aeca8fe99c10da47599f1aa9e9", - "1c04668dbf439c796ad1ce1f81226f830244e7b87b81fa18a616f74453fc079e", - "e241975fac3dfe256105ace7838131e45d2aeef9c809253aa0cd57d94d6daa94", - "815ccfda713a1868760e54dcfdb08579371163dad714582ac9f1415117da8d71", - "df51118d11fa0cf4885beb689d1c7f1141ed86c35855c316651f3b5eab6ccb91", - "299177e120e410243c228fa4c16cab8c8c9ba6aeeb229cd100e991424bd4965f", - "115190892d2dd2f7207dec973e1963489e05a070e92816818cc16ab079081b74", - "163f08144375de6affa797fca2e506087a0323d8e17e7cc454c1cedb69ebb2f1", - "e0a39512f42491d8277fed8c5cf5e72fbba2bc6f03b9ba155126c2b2ae35b4c7", - "e61b58909522b4931add4b7949aad57f030934694036d258890b6ec092317d88", - "217c3ead22e0808a00c9c75053fb217d49a00ffcffa66256bdf15a3226ef945f", - "8276b9968c0f1f20a4a07ba31232e5648ee15a19dfb0a978ce1f3dce01389b70", - "fb83b1a00278dd1204a688788e03658bbf64e8a66922b26174342c8a5f342649", - "dbfceb7d931c594c4c6423e69ce813eabbb7d0e0ec3712cae28d4262d50e7a12", - "60a4664291e7cd612d282f22f8f2356f74aa6f5092a845b1d0da03c758b27bc4", - "1b44c97567022849e8eb0847ea354fca6e7e0792c254075e6d4454ca5ad9edc6", - "fa7627f3fae16c65c22df6a19b633af82df330224717c0aed9a79d4e4f767776", - "6be4921e86d9723d8ad97457ba0ee8e0736c2a418e4d5904521575c4cfebb819", - "fb43229e62bd7b3aca18d6bc4cdf5a3fd459fbbccddffcb71f2452895f7606c1", - "96180b40f25604ab2c6d4f739d39667f764a447e04924968f3666cdff6f23f13", - "22586ba3e127066ead630a671399cad49c692d339eda64b21bef37b1aa217304", - "586222f8a49035bf10ac3dc61796ad9a306b33f0ed5f5b95fc1c1165d817c7bf", - "39ba6866843c999d3822c1c6e32bb2e06fa123eb746d0765bc32691d51bbfdbe", - "7d01f1479f4ad2ed647982b15eefd37777cb46bcf70ac775b6f9aaa9a0f999d6", - "7aa54036826c7ccc34795b9cd07333a3fdc5255e71cec10449ecb1d6001ded28", - "784d4e710fc6222b4e6ae812000d7959c3301847f2d4eb902d427dbaa3c6840f", - "b69c99aa3634f521cf289c1829f455c799d863bd6c424bae777a600e4469379c", - "137681d4844c9e33e700625a8147c79bc21655bf09afe6c6a0b5f6833045104c", - "c84172ac7936f41c9c182be2e292580850a34362203c773954248a9f65a02957", - "87090f1e607e2709d88b209d44f614f327c9b6153937a1375e301ba0a741c344", - "e7fb28ef596e507f3483dba6143617d65dcbbf9a2ff425854b865f13a881492b", - "449de70c0109b6467abef2ea16c558a2886844c93803f06e593f6a5bcf634d4b", - "45b65a4cd1ef86402f25208c94ee4d3c3981c45963e096acfadc846f61c3e62d", - "68b8a016ba1654984ed5e04cd10372f7e63190cb93a205e10dcf95cff6ea5ceb", - "6bb3de7ac53f41fe66427c80b23d3706be75b81f01ccc0d8257b594da0c99e79", - "47f809343e715871d2da9595acdcdf598719e09999d50b0b6f397555fa61f9da", - "52405a81c611c4665e70437979e57fd5c8e549bacd673ca7e7839124cc9be306", - "fd100c71a4f4dd40dac2e057246738cbc89fd8dc0719efa6b643a51dca6a6c2e", - "30552eae9293c569ee46c3942540bcc846ad31e7915409bb65c386f9f125e3d2", - "9531d6fce48d72eb067001bb4115c5a82d9c4a2f0607ea140dde249cc82fdb77", - "f1e6a5bfad3ccace001abf281c041fe436c1b90334bfd75d8f95ad8c922d4ba3", - "4703122f22d711f7935a7335f407483e31c7483d1521057ff51ea8198bc4476e", - "31bbc2efb638c5436802d08472d55c2af997a1ff2fdcba395ccbc0a9f13bf63c", - "984a7dc74dc348e26dba2ba645c5e9cbbbe5e16080c78356f698d3329a251e38", - "5f750a0df02d7b69db193e684d370c6089a6857885b9458f232db3779e85e6ce", - "106615b7cbf155cfc47704f17f6c2d7ee1e1b20ed774a2b871be4394315b210d", - "212c51e1eee20144e37a12b410f5d4a706f33a3349c179aee7dea6a95dc100fe", - "83c22489d59d58646f579713f80826757176a17a35f32c8cde6a9f6423961abd", - "8d30111ea65c36ff60e3c84b03c61135298c398470ea41c67f733d97db79c8d9", - "4553aff02816d51819beb648305d0e9394f56d2466efaef69a4fdb569b053ca7", - "5dcff9cc6c2f525f528936b12dbe9283a7aa386f9df7d9816c917f58203cce0e", - "eb93c4f02937ef28b09f9c7099c15061e4fafe7da31272c0b938d8f3187bbe2c", - "c27b91b0fa88ff4dea1f2254af39339e394cf7521b79a6828b74b3216275d303", - "ceedde81b73761b29a712a6d264039638339b162a9ab1b67a95642714925310d", - "6103c60d45732bf9de8e94b372549cc52778744230a0710a9d1c39bb36e213ed", - "07d119c6ca20579f118d51fd142ed5965270a2e796dc11c7bd3a9db4a192c16d", - "a4d57c0c2bc937c3668045dab68cb1fdd4c0dba0074631d88d1b74776ad373ce", - "2471f1b264495b02332507fc7b1a6fcb9349291deab5f00a3be1e610e22443b9", - "7ef185c5b946b77cd6428b29ee615e5bc971388adcda4349c36e3a1a244db615", - "855e3b85839625ae1208326f0d4576f91545ad2c2bf338c6e231f4954e4bf424", - "81e7a712aa35c4f148bab14f092b6db3336ef006b0e645e3a2ecd8321594186a", - "70ea557d9c25ae8812d4a84f06b50904cdcc5d0ae1a0101f06271aae18b89cdc", - "f46655d7b4da0171423b1e773a66577b26dc9a6416be0a131c5189d5bf8fc6d2", - "b7e021888be2df974581e8c41a2bc85715ca3e1eadafb5ce8e808e64edde3f4b", - "8164f56bf2cda9dcb82893d1945f6ae4c1070b3a1659afc50295f4dbb55db39b", - "b5aee3e6f26e006b6e60b499d35a34e03232717590249c0f7265c96d59bd2769", - "5ed7fb5133928129296053ce71f30dd1574fb9a6347646de056c604618f2a157", - "71fd94a3bac993c778ec8430e2b3d490ad94de86fa58cbdeaedcd1eb08c6e5d1", - "154a3db708aa0ecade169acd9188518a9d9d099687ad249a03da5e7d5591cfc9", - "b568d2ca082fa80a669d71aa44c263ff88f1e12a997fa79ecdb96ce59ee5d4ff", - "1ee4c9ba7a70aa838957b34f44848b1c61d811e0cb37691c519c95280ee5fb81", - "8ae9fc32465ea64bc9808ebcb3115021ed43fddab9f75080201315bc2bca3012", - "7f4b39054d3af16bd6f28dcbdabd1d8d46fafeb55b370dd78e4ad662292d42e9", - "e919c2afbe1e9b0b36f153bc9b8d19eb9d45e242fb03c18806dddef07018dc54", - "52c02a233c020575547f46ac2fb63dca3906725b8050d9cb1bcfd9b78779bb76", - "c5e4398d8acd4587587d21478871e44a57e140ce895447aeea32901a9ddb7943", - "38326db7149f78a6bc69ff1951bf3b5e46c9ed63ee37fabc2407afe366b38991", - "dc785855f8d1fed4e3f76c2ea40c8de5d12d7280c03caf9b7a40eb7fda441500", - "336bd8d3f38579ae67e16397c0edf4785802d4007618d5e2f61e399b49e91195", - "af861f0afe2781675a8eac6ec6b130ff7d1d6500d286d497c9af3fb99af6503e", - "543aa99868136267a271fcddea8a2a398b93518ff351d93ab29eaca4e632411e", - "8ab468e41c23aa237d88d1297803b181d00a316feed311b4c0fc9dcd6d9e716d", - "2e66fb3ddc311a573ba0c1be8b9d0606117b210671263d1b57d5c960003ff1fa", - "486ab99cf1e6c058d5bc2cdcff8c6b1b26e9a0ed05bae6244eb7d3ced0c19951", - "8b146238fdd270d40ccef411d3eb738d16bbacef3714c2045dddd2a861285f51", - "bd828b103f4bda9cb820addd6b012e07fdce7b543bd35c442a1679349421efcf", - "cd6626c9919020f28848945d80f72f5aeaa75f11c75c48abbcc59c36f01bf1c2", - "aa698428b1838160adb96679aba31cab7ba29d6fc6ff0341f3eab958b9399802", - "1e929326e2d22627efa08111e3dabe61d1703361dcec93fd281268adf6668839", - "8f8236a3a87e6fb17f57f07457715dd98fa118821a3716e8ff4bb639812882df", - "3d0677534f3d752e7cd1c4ace94dc3e4238f7f1fe04884bcdb5b50bd093118eb", - "a1704325a653bdb0cf2e97e2756762f81680f6f918ad2b53d39b31dc7874b8f7", - "c0b5dd6752bb066e00d8c917c84eee7546911613a686f4042842471bbcac95e4", - "a61cb9807870d48b3a8a512185a5f20eaa90fa599d708ebfddd6def5d4de4367", - "13da8ee1bbbd873ca5674343e9ca88f184c197ef855493f31565f371dec2ae81", - "bc42702cb073e5a92e9ab535836d4930ac5b2fbdf61579df268f92bb29b30275", - "864d17c3765daf79000fd3d67e5e461ae993085fe1bc6edd48f9f164a5f80e16", - "f7db958261a450b113ddc6aa6a82ed3cd1ff3b230af654bb764bfe7b93beb152", - "de1f319d06d0fa8b81135e46ebb7634a79d9424d372621b8d61e436e2867d81a", - "ba798beb2e7cac6d54ac31e3160145883534103be6e5e8ff81cd86899b74828b", - "d49bbed326dbb295f290bf4262b1011dcce8a044765c142f4139c31512c455c4", - "4cd10c461ee9a32bf1334ffe3912b65d540f681827ae662450067a33e8d61e28", - "d2fd0db0af86c563d5fb9789f76d2995274640288b17ab8449e0090da5d39125", - "8d8754b3dc8cd548db49ef5032b8c7a5a571dea58b7f658af296a0cc00e87745", - "4525c38b442130610964154a65d1251ee5e8439d8b47d46afb682f523cc62cce", - "f6afa91a8f286bd699f3306730a43c005a79b4875016b7cfbf2120a3c79582fe", - "4505e5dede58c5a9756fa22cdc8649fa755c708737628b6d917d7bd966978e28", - "15657bd3009a25c2a69ddb62ae2a77220f3f70102e3547ac23ba88bfec98e375", - "6aa6b86f7db42d0260e7de5d46ab7535fd56e2e0f9ed065863c7c4410433bafb", - "816e8c25732d037d6697b8829731c10d4d9fdc3c1a0a75e6ad187e9d8e02d53d", - "e37868b81d4c6a5e711a1bd2da940d6212d9daeb6d17d671a32dd8ff09b61572", - "e758c3d702b8c5849de1fefd52c5f5dbf7b7ef338190e6bce9acc120b6333efb", - "4df545c15ce74735c30f1805f08aa23acc4041af7bd4fa7e90ddf772affbc59f", - "4189ef592aabb1fd36aba0c955a982114a88837020a104a42ab1f2562e747e96", - "449f64afe3027f79c91011d1d840fdcfb5d426bab340b6ef6f8f5c27231d0c8a", - "cc12d740a3b6ba068d5b09849c6583fb062914a083fead663fe789b25b933424", - "92323257818ab053f38f2f7b9ab03989d06664764148ba0d3816a4dcab3bfd49", - "113fc7bd7ffb701139b8830db5b46dedc33750cf50a07d5d4dde291cfcfb05b5", - "89f5bb43d457634149d9a4a19b666019dd6f76170a2ba5804d5fafffc8d4ec32", - "7d786bffe99eca8e22187e93dd2ed55f3103f35635c8f4181d98903a9e1ea729", - "6e0468afda7422fbc9ed3b70d7fac1eb81ad75be429b66eec456b9748c6f028c", - "ba9a95e2730aca70e3a0c12018441254339c70ec42a23a078629794ba873f1c9", - "6d22d4ebae9721ef6d038c045e9ba03160fa92cea8341e7c5c696cfa7cb0cc71", - "ee87a13c80477ff68518da88aa411268ef5e020c9194408844db87df67071794", - "3927e80a8a4e08f449bf6bb330c2a6e7249b233aa0665ff97597d9e1baa8bf98", - "b25e93d864f04b1ab9f0595a1f37ef42dc59b5e960b8dc88f0a26ce3c9e8699d", - "c7bf2764440fcc12573a3b100d3ee13e7813b8de49de25f8d84f105d01cbce4f", - "c7e3abe175c1ef909c491270c7e079f50aa925810fb1b4af17ea10ef65b863d8", - "7b7487a17624ffdc9a0174afed9f5f1db8d6206631edf3b14b7c188e52a83298", - "467bb6614f93749d602486215657917c9af5501fedfafb543435bf74ea317ab7", - "7a31163c400fc3dde75da9594098eea6f507c7e8be6887c5e08b19356314d301", - "4baf4952e807f6e162e93e5471a3a35455fa2b994148de1cb3956b63a1b65025", - "049d6cd466870fb36a26acad734a0b1b98cd4ac81fea05d159359553696e41db", - "cd79984b0c59417203b2e27065c135b88f98862a3a484bbeab933b9936fe73dd", - "c4f63c6b4dee8a1ce2a652c5f2464be6cc4a4df318dd529aec53b10cccc8efd1", - "30caebcd04c68cfb51d19cb3570b07d385feef0da932d235ee14edea78f389da", - "f9ec972c118e486a4bbdba7ccf699588ac96bfdfdeca8d519097265e669c9651", - "a4cf18b45d24c7ce6b1d84b126ecfe95fd4685c9b43940b60d669d886b5ac354", - "28333e3a8509014054c61038ab5d1b1a2f421202de5bcb8ce272dcb9852e08cc", - "591047430a0ea6a09db37ca4bc551e175ac51b135389db2f5f647f1448f5e050", - "feaba9c02b63753e0cfb3badafcdb46e01eebf44df79c041addcc334de86f152", - "1d0aa3981314e2a8041a49802e896b56d9c94003768a1a835676a03185791ede", - "579b6060ce9bb389a76e5399333f48939f65bfad9164fca3107a2031aefdcf30", - "c74a2454d4b67ca26cdb2cf18291c66b9db2581ea1d4797b8e4ac8feeee58ab0", - "d5f0edd771b82e14c31cd08049ea1a668f822058665438445d9b00d1db975862", - "d6ceb88e38956895fb7482d3d6a80f2ba7613e1d44bb4193d7179c80858f5dd3", - "b6c6eff0334d5b7924d3d75c360b7cabe21a914937d70bf8a2f141f18c6e5521", - "666ef30d6cc515da5c51c914a18355a33c621342d72c56c53efd0218acb170ae", - "1051750b57f20e344fe5b746668b76c177e93f574515d025758cf3fc4fdf6cac", - "e7a374dbcc2d2093d994fc61ace95c886939da69eb3633d3ce1f4aced5d08e2c", - "e4fcacb69e3857e5cafee703b004000dab1a0b32181998d6c7167f03af41976e", - "01bb57c1da88bbf886fb7a589bb8033c5c45982e55c778b7901571846b0d0477", - "f15d77754c45768060086d0513ca593a14e066f531ebc7cbf1e0e8bb60a8af7c", - "5541de200812f32c98b185f3c045445dc3139287d271bc1d1f28dcb302dc721d", - "45da5106827e8e12933c040507e24437be617b149a401f3c5b5fd7a1bd5deebc", - "c2e7db0eccb1c01eca57e72c840f757bc7b4f2e50d23ddc1374ef7a34c6c59ba", - "4cdaadbafdfeb2d14c1a38dc0517b14c814d7d7f1890c554ba4b1722dcd8cd30", - "d114b061a0e25461d2f37be152ca514d84b803c94506fb57b35018a9bc3da252", - "bfc527c2b5327ceb122255b5a6b87d5bb6322ca18eee99d49ade1c64bb97788a", - "f44a5e2026e72e7909835f9a8a5b259ad2222aeca8977799e9c42b0afe98b4b6", - "5a380ff9df6dee962030482b4c64071e40ae93ce787548ff3bb0428c013dc4f8", - "d96fe879788f1bcd62f31ca7dd9b85b8a4aac2e8fbfdcf89062cda9fcb3cce90", - "1bf43dc24d271e52ba87680a9b7f052f741ca922aae11e69b87d20bb0174f7c0", - "330c88c81878e3f24b44cc1e0d3a203bab061f203666cb19cca607df93ea771b", - "e9d4dc08949f28badda1bd0b52511ad135e01ecda6c9679bbec29a58bbcdb8f3", - "fa90eb60465356ccc4ac26a87825a10e784b0918a2c5d4faebd94c491266fc1c", - "eef2f482b232d52f826564027651ae29021f3a7611027c44c09d03342f07d744", - "b4648a0c89222a729f50507b3de35211ec5bc3c86a90eba2b2494f7b1cc216b6", - "e57f2c18b97501cf192929a26edfef0c377d6b4213565489ffc9d6d40b44e715", - "277f567a1c9fad6290fcd4799f88205fb7ec10806bef040f39940603206bc65e", - "767219a696bae5f32a4be4ef5f6488898087d6e14965e83564665d80965879b6", - "fddbcd84ba1f98887ebdce4be1d63f790e0bd8fcbaee82d420fb24783f9725ea", - "3e5f14bc5baa0cabf6a419921a418b981b9f60cf3aff7924c7551f0cca528a70", - "0336d9195e4c3c123d855dfd3f60e425fc8db24fe0e967f83dc8431b06e7d545", - "168209269b7a1c9315673faee4bf74711aa0bc7d6f5ab32fdada6e7d33eb7db8", - "630e6753157408010038249da0bd5d47cf5016255f861820424f5780ab5a7d76", - "94db6ea2233b0fd7bf73dd459c55d5b70e92a64a5140f55990efb324ba0b5c8d", - "f7a119869fd6ee2a92c74040d58b5dd1223d549b5f4b6d32f8e6cdf4d30d3204", - "fb871dd602fdd7c7c3ed37472e6819f9128867cfc778687e7915afce0ccc4764", - "69313611c7662f52d400456e203d3d8136899dcdc4541ef67030a0f9dbdddde3", - "4462cfda65ee9f4b88332ec5ffa76adc0b0921e065836d35f6f0d9dec2f035e9", - "18d07b272a2831ed8523aa938da5a7385ecbe22ae8bf6833a35b9539b9fc1244", - "cc05c9efc72a3de37093b41523f7cbec8c7118324f60a14b58a49223d56c93b7", - "cde6285c67f25eec0a33198d8a85c29944e334b0f51932c173d51fcbbd9c1881", - "1f3c789e71d0aeaa1c4f1b725037dd7121815751d68edd0db0140afcbd5222fb", - "31fc06ed43e7413033cd4a1dced137001eaa0208967a5b67e5e59eafa5644f5f", - "9c42cab64ce0d3f15777dd2f6c463f4b0b677c61a6e3973f08518491d80b48e4", - "dcc785f3efebce9ef335ecef12b165eb696baa139a9b08d2e8742d85914144bf", - "f718f5d6e6e1b591ee16867c623a29cfe7c723f41bed2089e5bcd2a7b96938ed", - "97ecb97f6b4c6d8edc8a0c51668a4f203bb6cdab6df3b0e3abeabb2cf0dc239e", - "b7d33b7a25329007940403faf8758164be624cc383ca4ef66c9b90cd71fa27c9", - "b734a872681ce5c3fa7e2fb1f1d978afaf80848fcef11da2e53426c2958b80b5", - "56cd171533a3c972d6200179199e2e647689eb733ccfa506a898c6b556acd037", - "21e041dc10d5cba6f2f4ca0495f235f53b9571dd48eb32ef4f701be66e2ab72a", - "f68484cd3596260d733f8225a3a7502b2e21d37f843fc170867a6616cba09b5b", - "50566fe50e8692d254f91549e1ad2a3ffba3f2f216fe160c5eedfe4c513a1971", - "cc04a9d9d0dc0f06ed651cf2abfa09b997f3f0ec219fdf7fb502f5a6cf914d60", - "7f20f2c175ddf3420bb911f2da79abf39350b97980fea745666db04c4833f44a", - "a1fcc158dd59cc2a5335ccf15546255dd02308e0054e71c13d57927ae1b17490", - "e645b8b902d847e1f7fb971965358b20b373a0c59fc288e9c76828f4c9d08226", - "5bcdd8c3bdd0d607405a1188a2ef9a0dfd6d89b2069f38e2bb43df613ef9545a", - "83ce486436ad59795eee7e58bad945c95d6172471487713a5eec18cf09230427", - "f211448aa8ac5c4e94ab19a627b9a0843ffd2d698c3e65c8584d41b6567384f7", - "7964be679af8c83d1e3d68005f3b458a789a8bb0c8976f9d8742cf910088cfe3", - "28629ad13bf3233133cf39855b2a3a1d1e454d04784a3fdc84c9852b17e0de0e", - "71c21f4ceae19bb5deef4bfe1fd3dc1a381cb09bcf2852e337aa299a1daac9bf", - "1bba823b634290af8a5f8640cb8d3787dfb0cd050a85aa3f296d60b8651c5b6a", - "838db6abe877275f2fde34b7f03c670fe92e6a1ac0356c6f0c529faa71f4d2f9", - "aa8c66285a019ca875673230b763c11eb9fa65c8cdbe035be636f86b6a870a1a", - "0a461a3bdb24375b9ffcf727d383a379980e7b495f297ad813d370c40103a16d", - "2f4a827c4f392d5d67718e2fc1d4837aeddbea636ad81088867f69445752894c", - "1fbbc399ee11b95a8f8fbf5386344a04d135fd9f7fec69b32f4b5f3e84ea14a6", - "cd2dc2b611bd6391be1c0f9beb986072b7794839b8a034ac85f7922c5f738c0b", - "38927d6ccd69fc83dcc0df7c59fd9255694d2b96d8e11bb98365ead974df377c", - "93d70a7e0af44b6186b14bcc3cb51e72d1e27219ca3dad5ef3701089ecd42ccc", - "8e08cb225504f1f16934d063eba3e288c3f1a32f5ee1fd3f01c4943246ca855a", - "858eae5d4a43200e385b86e710cbe5e11c05ce90c74ab87740b17e4c970f90f1", - "0e01872172b2ef8cc761c7b524f802a2278067a48a6f6b4c2a36e0c5c67227a1", - "22bfe7bdd0206454e3a571b80aba47a255d584c1d373d58f06cd2be438457f19", - "00e864052e2253d53715db9cf09e6e964f2256d3d0f46fef9bb5a344ae321df9", - "a85896f127f32a3ac859bdcf9fdb5a99bf2e24bcb9bbc519767fbec5aafa9207", - "c56e1a0f685eb0139fffe9e16810ed1759b3578c4e62a9c7c8b0dddb9a8738e5", - "0ee808fd02cec1958247efc8d3f67c19b73991c24ec5af7ee89195c4e499c375", - "2ebd09327fbcd12bc1e8bc6af40843433bee0d84ba24cd664c7727b73cb70d7f", - "9b17ac0c70afef57c3288e99f0164af55b8752adbe5e2ded58cedb828c2cce04", - "193fd5fa935a3ab6a6be2ad92bb51e519c1d93a00da719b18fe909c0c371c2ac", - "6eacd960da5c36e69ae084145d203f43b187ab4b22f8e432924ad057923dad4b", - "77f2662bdf679864917b9a7e55a28b355e94d52fb5823c0349450548eb7e29ae", - "d4d9d7269133cc4a934dc614c0aeffe4e08b32f69a0bff8c7a6d697bf5c5e204", - "021468bd9bd98712068882f13b167fb47a7586541790abb723ed97c4d554648b", - "e343ec475187bf28ebc4737f1c3d8ddb9365a888930856ab97be9c7110df8ce7", - "f647e5c191a6302fee434abe38469f8827704aa253f5d25e82cf6dee4ad99055", - "3be3a44c4a5294749e8aee95f8ef305821bef84e49d150449315f736e4b97808", - "04c6768a3bcf3c955dd781364d03c5d70eb4bfe18883677e4af9ecaf1cc81411", - "3bf8383bf881506f8d76a36b0fac01583bfc63c75ab0c47ce8a7f3317b1224fa", - "3d2fcc0db3551a51ba6987774cb03a825b20597281353a16b130b850f10de0e7", - "5d2f70d56e137279824a6815ee46993fa7de8282fd966e69b413291ff1bb4c2a", - "1500f084368c6781cf87cb45dfd6ff1a174cd24103bf389edf1be9c879f0b89a", - "84a8dd02850a72e310efeee7ad35ebb047d8c435a4358fb99b428eaaa60f7cfb", - "ed5db9c5f8c8770891874e86f02a65d459b3f4e1096a25ba5580f65748e928a9", - "1270b25e1abd1c37dba3e624f2ca31124cb6d8c10bcc333b1ef1bc6d82206002", - "5e39f8da8a617994bdc59c3a0113656c41ab9e2782fcbc6c9a803a1d83b039f8", - "9cb1526c389c90897fa89f9f3cb19615c5421cd72b75da033a827f71d438837b", - "15118126b668a575d5115b74280b848a5f38c56922edb4358fd89580c551894b", - "89294061c3d1f010cfa36f6603f11f00f49e6d126f85586ec8b47e838e8631ba", - "9254315b2cdf3565c9482be22ee37d452b0631c119bbed6bcd8ff56fbdcff9de", - "22df97f34f5f5b2348f4bde8f92d2bdff1eea6f47652803d9946c2bc524ef307", - "e2b9e60dc8e48bfa41d8049e5b9714dd1e7582672c2238af6b017c4e0615c2f1", - "0eda8316ebbbaa3b4b36e0b8a5534b412f6123a285b3f680cd406c07f679ed26", - "72f2f0f17f8a154f4bbc1fea7820fe86db5f02a589b3f20c084385e4a5088cc2", - "af6c5110c7a724c6c43e8d85c497c5f90fd96f32e6d88d54116a38438f90017f", - "fcaa7f2ba461c80adb49a90c5283e1f54b303fcc110280c5cd32605d0094ce50", - "8e7c3943e5561648f5749b46214d30991be0d10e84ad2b932b293c08ba414a63", - "4f4c24d796080c3a279df16299069b761310574a5d62c23adb23f0dbb9d24cb8", - "3b80a50f93a4fd77602c2a9b6683c906039bd9308483c462daa30317efd60b2b", - "7c4411b40f4b4abb74822b3625e7d5991c8814062abcd141711ee20fb3ce8ab2", - "70aafe65753f9490ab33b695930992ef1ddd98fd2ef64b184db8b7ea32b0d26a", - "6c2ff041bcad6de31b2b599edf5e46bee43482e53e5035990996ac511524ecb4", - "5ca5d2f7eea873a6fe7c5bd175098a6465fda8d3a8f9a8d92a558fa15391b062", - "71d49ed3a1c0dbb66b756a2a334add5ddda0038a5937c723bd84d1f7cbf9a815", - "362397c8cba92ba3c7ec79a32eb3e6274f979096bad05f958e2b79f4ab7cf1c7", - "566596f6f7586d8536a32fd5d37a0c0fec27fdedd0eeb42b53b28bb7a6f645b3", - "c84f69fcd23ac07da9c7c9b1dfc92bf3e6d59a0282630ff035dcac0e9b3c481d", - "2604f9f0830133c0fd191e07541863da49ff444ef503c12018226beb2a6a2838", - "2bf6e8abfe21d9aaaa57cccce737cae0b9e026a1701a71602b908fc1458233ca", - "03efd0b2058c791f9270da9d85fadec62a8b1db26abfb041a82d62f6935d64ce", - "c7ffae44d68eb326cc771220502c909b129679096fa191281287995258d852c9", - "0cfb6bdd0fa2f36cb3ee4d3f23fb754dc6ca4db3451aa5ec262f1cc17ef2d67e", - "54af51b705e3966d3e2c876bea65fdefb2667080302e04820c5246b0473512c0", - "2ccf88bef48851b9c904d6995a5c2afef9bc902828e4c837b6d0f28925fb82e3", - "486fe1324eb5c9e44f3cf6ec2e5404ebae9d62f2496d6c28bdf2fe2e1c4ab765", - "b0b81449d2148e0f56c7e1bea4408c9992e6e42059d7fc8af6b7875a77d01858", - "3ac9c3ce97fac6c1115ff8cb4c4fcd2e14d0f02e463725e224331a2b978a5daa", - "3329cb5760615972c63c9b3c85ffc2774e4bde27d6171186a8e768743ad79912", - "3c595c21af2cf2ba3bf3bf5fd0e0493091d102210e5295d30970c7f340e30dd7", - "55c6a4b74fb430e8776507934b64de86575f471572bffe2bdaced126027c3f21", - "0c05bf4f5114d4170e91c6add05206bed8bfd31b6ba452585a0e8c178ed9e2ba", - "ddab8e2e73fd057f821a4c35b4272ca25baa6d4c038f7a1b7d58d351a416ed1b", - "889f848ceb8b4bb1eeaa0f096cfbd9e1998c82d8f8d5525e1fcaad6fb85f3bc0", - "f5142c36cedc9812739f4a7573f1e4f96fe625a5e59160a1ace6514cbd049759", - "8251ea60dace0623d95c7c857bbc051dd9dc60b9101954e370e9053ab44655d6", - "5e98113763657fe21764e6247f4b8bd53eba0d6db97125cf030092d16331b4c6", - "87a6a0ccedbe5a9fd393481528cdabbe223c35387bfc261927073ebdbe1e9a21", - "4774a97e4c70cf2a0a2c3c66a5078fa5e9134e944f741c43eb97e56488b53e2d", - "9c360ace83e740ea8dc1cba498934b489d609a46c271edb9788a0ad0318a53be", - "f04c1e5e4cba1da13a6196231d2d522b9ab48b0f6e80ca63618ed2ca987d0a31", - "8709ff9d6118f8b52f1b88e91003a5f2f7c1f05eac322d469c68553b534009b1", - "1ad8ce82c87990b1ed462ffe81165126ea76766f06e8cc3dea7d73c56d97d7db", - "c112dec470f1d2ae264d514a41d8f4f26ba00f173f168f771e7c211511e88855", - "b6907d1d9edd92bd23ac62f9ddbbf7a1595ec21dc10ac746973b6d9f9e75ff30", - "3d0e6209c7e28f3c8d01513d68b0ce3c1420469155df0cc57b9c947aa21a8f6e", - "6cb081912e8d81ef11dabb8265f441b1c578773206011a19e16bb29ed2db448d", - "269a7f6c14c2b1ae177fee638383d13cccc2d0dabb510757984f6a0bb4155112", - "81891689683fb40363b90790808f5e6cab2ca9feaab01040cb7bd8ad901c55ff", - "a12c5370d67ac69517c5cb038630e3c5542c23dff525533ed1eddbd675dfe90c", - "e27957abf94ecac711f47fa0bd94cb0a246eba1c3700153432cb97bb03a5a750", - "7582509e471b6a5bae0232f187e228ea53052e4a1ee5a113738f940426d259c5", - "3080835378a7c68ed5fadcfd5ba7fa5a4f6fefeff192c1f6101912ac44645730", - "733fbc23cd0b6bb1aff2df07c848e78f4fd266ed8023cacd26efa0805d47ce93", - "40a0df3a5ae2865ca3d92e8d61f6bcead94563531a32ce21ec5f41d60b22a3b1", - "68c8679f38fc360e9e3614f81dbdab258dcc143e7bdb69f43bb329a8dc64f0b0", - "f36f3e1d0e065424c01362114004392f69ee4cd1864a64ff53021dc93bd31e6b", - "18c4bcaa38b9494ae13509afbcc9d7fd57023a0481e516319efb4c808204752b", - "bed4aa6c82645cec4e2e12aaf9f150d4b12b52cc2e9cb223903fe838ef967f1e", - "39a86fed1c47f9f87d04d99aa37fe1c54a6be0a01901dd557c4244d209239ac8", - "a2401c7c0e0c6a3dc5a9efd9ba4d93de60ecb404455e6522d5887e210792a1df", - "899e80700906ce9551dffcbead229bde8da477a150328466d125331d5a4bab1d", - "b1e3b3689118ba6759f9e95c037cf288fae425f7bb6f046033ad34b60dca1287", - "69dc2d0e5b8f727a51121655988c5e37f340e60160629d8783e02e4c3b8a1abe", - "10b78c772e8614b4948220cc7fe7b6fad98363b2c28b3b80e268f165226c8ca4", - "6923357836a5c68c3a8d53ab9aedc67daf9b763130b1fda94b6f8f7e6b314cdc", - "d29e2d92590edd0e7b8e71a1b90d11bad1e5970576a5fbbe08a04d1725fcff7a", - "6fff6bbc1c779b86fd31fbeb840d3969ebacffa7a0f77ce7d9b65491468d00b8", - "d40b25ca7846ce0168d06afa9769c6d698d4f0ea267a5aba74aa34bb0dfab87e", - "2ad128dc3abf28edcb711131a350ce5472b134c72b849ef5fe60aef0f5188f81", - "1b589e8eca1ef708206c86e50804951ddef3e7b9ed958cf8776bfead8287cbcc", - "308f4af01cb648ab89022d76a7915bf5396ee80c72bc55dee8d88fce4b90300f", - "a2c6c25b3ea667cf7f22c3f747be89bed926e6694894df5e2b1b0da325353e1e", - "e109edcc8956d9549f1608b64705461dd6d6b700f5db42d02cbc1a5f6b899e0b", - "70fe104298a79db281d10851240d8d84585dea19a43b765840d9ab71fc867862", - "76c219b19886744444f44d733627141ed3db8b515d55519a65c1f2acd4e794f5", - "f182d9fcfb51be1bcab0d436c1473e7a7aef2d171797c6f57458c1c56b339c8e", - "ab38816b1d099ccca49a49cc902fff13ec9157885d0a816651b5a17ac18eb719", - "720e17caf4376529aaa052589e6cd9026957541fd064fabfc56ac85c7f6596d1", - "89f72a119090b5981e730000b36ad3298dd4abf43c915f91af0b3f729f0d7b79", - "38198251593dd755c6c299fa3a5519fde067bf9a376bee4be6494dd8fc63c9a9", - "bc2e8bd147c910a8b975766255f6c576fc45a27cb4efac14f834d61bb11757d5", - "57e9dd08085aa6ecd52ace0fa943c2345b6bf8c0574b7527d1df9ed6354dc45c", - "a22082b5698d999c984dd377d773117c1caaef81d40ec6364c54bc951731eeca", - "87f587da0b562b1c6f530314c0e27c36474baf584685190e8a9b806b1aa5fcd2", - "d4bb6d18e697c6950d429d9d36b521a20adf5f94b180218cf7732602d49cb52e", - "0737c94d14e7858ae0211ee0c125062bef790eb37b3f5ad244eebd4a8d0e254f", - "f4b35a41ef475154b09d1669b336e317018bb948b6545131dfedfa8ff30967da", - "8343a9028d1846a5135f60ec3cc221ee7a48fe97ae7b32ed57827876ed29b1db", - "25f291951d44d149e922a0546a0fff5513e92afd4483fd3b7043903ebec7b732", - "ba5f016c42e11d1670d160512ad2563f7e828fbdecd4f0cc7c065631438b0acf", - "c41405551fdf173254120556298b9ab35a4b1c0bbbe863e61cf87a23da41d609", - "710e6fd576487bd723512932b15b4b2d52808753a23764d33b182034bf98e209", - "b7554c7e7b08966a3516d67a7b141d0bae18db2bd0979102dfb2e992eafc4b06", - "5bbd72dc12dc3453fc7cc881e5ef61b4f6550a861e058d8e3029f3ed53c708e2", - "5920516197c6c2909d32459ac3ffe01ef7279f491ca700ea597e180d8ed10950", - "70934024a00608cdcdac21b7a9afa06032926629ad34bbc1baafff0bcc8dfee3", - "6847454db60906f154771d1a7252220d4024f3ac64bb2ebf4fcf8fd04c7b31ba", - "213e42ce260cb4d6defa704e0bc69f46aaaeb91a268d3f3e58a784e9450486dc", - "937f0d23586200c16f7bf71b6e4c7b762f86835f56398e70ba02744b3fa8381c", - "1fd3f88d1be5bcd72122e02a41b484995f5f6fd2b09377c01f17b3c4b24a4528", - "89312970f6a4e688656d29c9b26922c3c69997ea0bc19625468d6e482cf20c4a", - "5e184f3a4856a360772861181c21d4e124c89bbb7aa372cd8ce2f5cd7e11b0fd", - "cc1fe9b5bf10a1e15e685c1c534150503d7678c7e33d53621c837b09fbaf2c46", - "6134392a20bd7f8bfd47f901d0d6ff5fc2b654c268922f8e6470e6abf4a88164", - "5ac9a7daf57bbe6dd34bb2709bf856042d45463338b936db4a9108c1de724f95", - "ccf0474445787393359ab1ed2431ff0dea78236bedd5b6e20b30dbeafc1f97d0", - "1996325a0cd15d9b07fe3cdfb0e788d30f42f7b2d775556d5b11e4c05bbe5e62", - "dc1cbba0fbe47c7f7f931e6efb028b0d81146858573666f5347d113641300665", - "92f81f6a11c7b26734ae8dba915c2b994a9d25bfedf0a7b8853cce168c610034", - "02ab2ed28291897e3a0f64c14e7b77ca9f96e34661334b782a25ed0cdd67d4f2", - "4b86289f59e8fa366c120493a6770052e08bd1287923f9fa1b071add7dd8eb35", - "1efc76ef57588f06e310ae9c6bd11faf62769bfd7ae5486e7a8b69919d1ffa6b", - "c4bcb36230fecc5f967ccf9d6ffe7928143d4b1a208b21975df5d78c60081b3a", - "6699a1775232fd91f4ac881e9900ccf59c8edd9922ccb8b10adc6150bdd1f173", - "fc93127bb52fef1a75d047d3555edc112a9757a54908661f48ecde082fe90bed", - "4f3ab52d1522b3f7e9e2e4bb9764581f8278e28eaca2146eb44e56f53afa81f6", - "d7ea6a7494c12c40ca58b7a8c0d9226a77cf8a19f1ffff9edf52f2c1abfb4311", - "bc08d2200bad7cf1169f38072b52b391127229ea6494d2215063531d483e3f9e", - "271035d108dd2c5e1aa8eeb5622159b82ecc000949c8d3e7102bd97abd72201a", - "c9ce28b527bec90e90bbaf00cdc58ad8691a9490f5fa36b1cfb2c877a729a96d", - "b3afc363d0720837422f9b82157659b668ea9c120968bece071c4815d9055713", - "51fb5c51f29b17e21f0a67643697f4d0e09735064d068ccb3bccb74729dbfb9f", - "7ac368518541fe3571a156b812023993cc62cbad342970f7f090d2d50cdfa29b", - "a886f377f03ed4bf6f9615e0efb6cb41dcbdb02069cb25ae353cd25b3681f3f4", - "64d9a04d225ec40ae70197be5b6a64561c5d9da18143a00b9f30bd79aef7b37c", - "07f36dfa78629a47fba7991f378f574b1d578f6b4c588d53c818743d6e627fdc", - "9020dcb95bdbbee8d38d78a925425d1acd9a58c41404539a885aeee72ac808e5", - "fbe0e498443d1755c1b285832a5aaf8c206e5d4d9a450de0097238e94e9995d2", - "80e8e93c508327cf05b328668831fbccb78ebc6d07523d4ee27fa25ab8444b84", - "fbbeee6f4f9a6991574f1c845237120ad743d1a015a109b436fb2ebd34577b04", - "e430dc4aafe1a72c95b055c2c72e9c0db077a86c87cb4aec0bd2549a61311644", - "1440b0003fefa9312811d536634d448983db27f47d48aa616198b7203b1e8aed", - "0d55a3a31bf09d03f6881c0ce5fef232ab18b9b6f3fc1462c1a030acc8860c29", - "f7e16289a157cec552bcd7b01c9bd800737fe74bebed4d0e1aab5f2df5b58c97", - "24d356511d350778068f6c29d42c02d3fbec6f40c2bcaf226023b9e1680b4309", - "7e187972492f09c58ad1b60fdefac4f53ef36725a0c70ee66e9b63f75943668d", - "abdf4034d60392c7fce7c216c1519036b2ce863dfbf1bc90d70d7a4c990adecc", - "59869a8ba4a5a433f3b8cf19ff23323cddf5305443ccaedc13949048cf46abbc", - "99444a45c1fa49bfc06c4c47a3b8d3f2291ba7ead9d1eb0bbb79cd78619facde", - "250d5c454397b87875fab06dde5723b9a90615804205886d4821d892373ccd3f", - "4e41465fff2c7a0170eadbccc076b71e160ebf42dd828b5c5cf0b420048e27be", - "ee794756817d32ed957b914c5b461f7a48dbba959e6d38426944cff98d10e2b6", - "a90c4380c85fcfc14bbb1ac4fc9f35e37ca9edbd8e509e9ab677a3db27d2644c", - "d4788a014971939012a89479800abd3d27062cbda8db491a9f10d677166b6ec5", - "419e43ad57465a7ec5a6e8b93a95a8990087ab9f24ae99315f5c3d5b7f4203ec", - "7c610de852a99325d540e37027d7896685e2e781b7d4426eb396d50338b47620", - "3636f3e18ddbdeb1b364dee6ea3c4fcbdcb1089659eb8292c30e4efbcba597a8", - "672cdd251ad675b865ed74abe84267049bc8777243c13e94c2f54dc57b8c4cfd", - "b7a46a7e5138a48f9a8959cc7dd48993679cfeba8e5b70c4c4d664c5f7f47cc7", - "8dd15cc11b22f9610bd0e83ca3b48a5c51b75511075531289e21a7afb3704c13", - "3076c6754fbca2890161120980981583543e26ffdb54c3e0c550bde1d80e49de", - "8dbdc6582cb4ea589ea88109e3ec1b66227f7a2a1c6908196f6e28fbdf260c00", - "1ed38fec8524af967cdd4802ba48ddf1238bfbbb0ce1f9d38a1b4b6fcdfe1fec", - "95eb0062b2e94de620559a492257aeeff7aa89739b0028fefe07651f15f77f03", - "4a24741a4137e922e8a6e1b083b121ac6c8f97530326226096b061dc0276caf0", - "edfc0609221f21023806f59d1971acd00ccf1b57ad589e3b8efb7330c5b2082c", - "9e8c3579bf9e5dbc580c03415cce372d17859f1c1ad878013e09b782703fb0eb", - "636590ae21d4c046d17f75649b2206720bac5497f49ce5ec360b8069115af1a6", - "81ea532cf0043d74bf03c94d1437a3a34eee594de8f9e7c881e2ec9bebdcebe1", - "88842f5773ac71c5283d1bf557c3e0d96cd82f3d9fdbe6c2d3aff17fba3215b3", - "593dda556ee3fd22350ac7b855b611dccae0fb70cfee30e3465a0f05694b1d96", - "f462d04c4d99c0dcd3bc71dada91f5e9e043815d4c735777b812d73aa6d4a30c", - "18906660e357edcbf9aa3ef914362b6198eb89bd8e610b92832a31bf0ab5d48e", - "dbce59a2ef5cd7c4e10f29c631949d62280322e189723d558b7cf274540d4a30", - "66773fcffa2d0745c78d9b6eef97cf2698e84d2a62f801f1fdc4f34f55955ce5", - "418dd4c9f25b758a1de140e62ba5183bb7f9f60c7d3e85d5f29aa45189ebf13a", - "8ccdc39fd869c8c261ed30113ef21c84f7fbe70bcb3c4dc225c430a653674513", - "3d6f850fa0fe1443be648caee5140e8f40059f819a1ffcc44c633ac5046547a8", - "c7686459e2dec018795f7870833c65a1d804447ceef8010708828d7f43a9ef7e", - "b77a76ce6fedde8f294ab55281afe538b6184be0561f1fd188f5c448d1ebc360", - "4136e6e39efa23e6791d81de85eb35cca88a3de6b034d43c1801d20a9b8f9782", - "34557ca0f64806e74135fd1b425aeabdb03e304ce0d510ad40c537d2481a3043", - "8a8dcdebf2cd24997048b79c4d612aef33e95b812b9efe26e5ddb59a19aebe6f", - "9fe137d806faf489bbc6c3030db8bde815e1ace1834846b17505f6d65ae50c09", - "50a2f9e310eb1ef6016475a2417f17cda77d41774b37cead1702847d0db5c574", - "7a05ccb704de2aebf1886efe8573f9a0e80437a5564d05a159438d3d6ee364f4", - "97a45071331dab526a0cf33d6c372dde71acc088a9784f29e0edff9e8d3d0baa", - "4abac6eb4c4dad181fa1e28251a65430f040c5b60a43a54edc604138e3a5194d", - "eb329c5a7a09065c5b0ba10a8679922d563f48a003afcbb0bf21c56e6235f044", - "8d3f4c5fa07ac762a09af4228b871735f3a678650b6668d26fc2fa8043e4964b", - "d7eea5eb100b3d40f22f8da0f462bedc858a9e5c9096fd1c9164809737f5e4ce", - "fa927c180603e091045acdc045a204e83c9ad3262abed33b5a3f2f8d62a4f955", - "9ae3a8da10793c1b023a28c3275945ac2fe4d8355bf47cec78a9ffab764c05b7", - "2e78db4aac0602c2e3d74934b64365c3da04cc7faf99972421e52c471d439f1d", - "1ba0603a328103d176e93e7647d5f5542f390eb1e50f45e96fc9bc26c45eda03", - "a1f9181b6bb90f8b8313c654f71c014a1fbba6462439bf8cb63ebbb8a299ecd6", - "4b1349ff46089d0e42c9cdf6af06607e2d31797418ac0c2caa687c6a30ca605f", - "2caabca33003b1fbf1a9918feaf8c34ed12d06c6c6c2606b2a3b2d03a909c1c1", - "a493a6af00d15609b35969a706e146dc04b8686a806e6603bd5c07236f71ca34", - "9af83a8d3ebf533fcb7264257dceacb3f6782e4be78cb0ceb0c00f54514a18aa", - "a9a4ac2722533833085e91afa3a106a6a343310978c8ba31ac0b279b4e297cdb", - "9839ea06470d622d4bb12d63f28fa044a259934b2495809dc69705d4b473cbab", - "8404c1a1f852e694ca813bbc1c95462f62210a7b0b82fa613d37e1f3875af893", - "e7de79639846f264e97f7357ceeb076f9820ea447f8830aed3abc5b73f069aba", - "dd8068197de5fc7866624154051b8073a4c3967998f6731f4cd4c133c3036650", - "cb3ba9b73c25db730b7313ec5a0a0f7bc4703d760469310b82bbc1c4a32eef96", - "b924223d44ff320d2fbada46f870bb581c5832e7b9f0fca33cc593a11b179bbe", - "320142dd1e8c114a8615ea38566a4af79ebe2f3847bdde2403b4d28546076641", - "dacb0f8644e0870a13f73f6981bb1f1f52e1414ea5adeea956d6f85ab147acd9", - "db9a4e8df1aa505d7e57a4ecbc15f22159cb89be9d4d4098e0b6902322f9ccee", - "2ee79f5f48a63cdedd907b168f8cebaef255c141c421afe4b1ee0b5474d8acdc", - "d85d5412b1ee05afdb364622d2babaf6a2b8efda99eebeaeab1b5e4f323d5c1c", - "fd69d7d3d49e94a850da473b1a11de3f800efe2a43450292ac737855ac00e754", - "4572aae2a8b363e5aa2c9eb0a529d3563f27efd88e89e96b06811d9acfd8ac30", - "222ab5aa7c2808ef16fbbf56fec7c649700986d1a46fc9502c124847b3827b6f", - "b2fa6f08c049964bf757e1109cbf57bc4dcfef7204032c42fdd3b055ab4e1bd1", - "dfaefea0af1e0b10c442881daaaa10bad33eeb1691aab7ceb88af57cfa71ff18", - "5b1a6fd38604a09661b30e3a767427ee55cdeac11a3855225bcde6aa6f43f680", - "61117a3323d0adec3c446848f64d21e341238cd923b556d5c56f28545de536d1", - "aafd1b76abba590cc3a838009a69e32062254abf9b6570d51c49751406a20fcc", - "7ea35794bc010694cd9503d5146d10232e7ccc99866a595a0659c5f02e23a3b9", - "9c7cd7eefb2a3993553bfd24ca993d2052e565c33b4890e2ff2a296d90f4e726", - "1c207d2863bf9c61e78e83a35dada402b026c05bad0e52ca8ddd57ae9f33b9cb", - "c2a47d4f05cca0719a7384d7c238aff8e268b17d7d72b7240fdfd1ba334cd9b3", - "d47edc9fe2c777e193ebed530118d6733818df6e7cd5c9e2732b866e6f742848", - "e8e28be8d8e18cab401f43b063a17a96b18d7dee5f22a8556616976be559f1ad", - "b41c0dbc83dc148998ece603e5c2cfb944d378a29f0d188c8727c29c0f177730", - "21aed4e940036e6daa702f0781c0ca5f19cb2f1871aaa82abf5d9f7ede784309", - "1b073253fc468d73f90305227acd13c328cac9f114628bfefdeed93f417d7a4d", - "cb8a679c4a6433692c464fadae4cddf7a5041eee8d5ec6c1d498de55bc061852", - "4b3f8d01499b6b27e1f23745853e0a6baadc6c3f1d820af15a3dfe529cf7d656", - "82d50bd393da87aacda31da41a5084fd734f1c1645aade7e37797671f0a05b4c", - "58c007f0ff849841d8962f79810e7e28fe14aaf8adc6cd47f452e2e24de8d79c", - "7c735cb787771b5dbd633d8b504e7f02d4accb9b9b021427772c76555e309226", - "09b0e095902a35f96141fe75af55d6ad8f463f0aeb055c088b404b726887f78b", - "697996e35b2cffc7c15565b8ff0c5e07ed9a1ebb13aedf1c3150831ccd42a4d0", - "48332b159fc3e3d8586363b574bb91d278c3f2b07751ce7e146feb1b6f1fc75c", - "799f8944d60b6c9b708e26d07c8a7d495785ceafeea42e681b37e71365737775", - "2b8e85acb98630950108021e52c4cca6f293c12523c02ce667bc359741cccc5a", - "96de1fdb8c8372830a6a0037f27ad4e5180320e32fe141ac4c150c9a719c5e31", - "7646f8cca6dfac6dd4832cda260810b58b19ccfc43ef227d24350029cba6fa7b", - "9fe4089300c03082fab8a17fd8529c33e180d08168552f7f3c8a76e5e3e17071", - "132a175507b864c384372bd8f38baa96f2092ebd8cf8ddb489d44ba722cb0fa0", - "05d7000824f6796de94549c741ce0e5137a1ee8a6cb8a94af56e6ba0a225e98e", - "bc98ff96ad8c0352458efe05c93d6e73b57c89df7a280a1e1022ae7e00a9aabd", - "82fc3eb8ac562eb021acca43d4e450506b030a1900c7907dfceb942d3ea2cab9", - "fcdd838531ee93def76539f11dbf80444b86e8faef674e6547e0083f149da0f8", - "fd813c1cb5dd4697da3e6bdc29efd2f4435677ba04ac38e907877834ce9f4b27", - "45aaece7a296b8744c5d20b6f363bae512b73a9dd84423fde04b76cec1651864", - "10265ec77f59223c6509308fff4ca9b69760f4f3d41a4e2644ccdfe38457651c", - "8bcee9ee34f3c51e758e880fee21fc89033a796f35d952916907f02b4ee03fcd", - "781a9b58eaadb5267a02b6c30cec731e8ee5fb672d01556a49d257a26569df72", - "840a1ef6c6055dcbbcdad94a8103acc44f7a2f9ee2bc3d59550d389773c1908d", - "cffdde891d5e40d13505132200f0d7541a0d47d83cc5f2441f72d8a4116f033e", - "a2ee3d399c87f817c8d4c6788c588c14890f813ca5c1f5f47f085f88e54414cb", - "cbf1aeb4a9b3115d3d62cb7a2a2b3cd1e80d659a948383454f5c71227ef61988", - "b6e8444c0178bb26f171d623bc56f94ab49d37c05ca07b2822e916b71adf0ad6", - "c9bdd4ba4293f5571ae289257c78a470e629a748505e4dea7a69da2cbd3e69c6", - "02e63a6fe6642c5343006a3aba42a6e10f4a303665adfd37507df22a0dc7f66b", - "290c0de049d0350eac1d079ae9d367fc7c8b91c590b6875fd1b0f37e50ad6c95", - "f413bfab6e05cd5691a148c042b14ff38ac5cb2959a53fd6ffed358f28225d5c", - "d8af5d8e3952b65de8c10a1ebb3e735945eb1a79301daefe366e7ad39c9eeee1", - "9f73bba10ee6b4ccc287a5a57de034271730a4de2dbf8bfa1e73e6b098fdb189", - "fd26f85c515ea7bb090a018d878da1d3348671a019472814ec3a54733c9afed1", - "8f2f9b9bd78382f2eefd6d8260bf9b9dde6810e337c0a02a40265338af5cd3ca", - "a15d19056704589609a386e1516581e86920cf7e9d33eea80e1d47e30228aa51", - "b2ad354ccf43a2c60401ffaa030213e908490f3c6f289c80515519d21602819e", - "089ddf511065e07a656e81a95ed3967353f27c9426f02eb5d90269c7911761ee", - "993e27db99081508bbbbcc4d01df2d42c776c0f15a773f2e3213053025f0410e", - "b1af184fb8f477d0ba46ca622f3d7bf6b0a9696be33717f67ba28de05e40d95d", - "2ca662db2ed25aec3015dd59130e1cf2a2f1177ba565336c9990bba71b31b190", - "12eace00731ba2224341ead8d544bba930a85fb6747897c711a4a1b847054274", - "dcdcfbb72a91b1d1a46276bc06c27f7533456b92f5a741f6e106227c3d871ca3", - "f95e9e5997f5e00b9d3b8c8b01ee8533cceba05e0335a46d0895b356b6112302", - "ec46101d20736a435bc7f63efbf70235e9082bab66b9fe574be214f0505ec15a", - "703257fb25d141f6122a40675bbc757e09319efec9475347987f3291ef5cb55b", - "3e1f21ccfc642a59ede87ef47feff6deeea843c0b4239f44047f693975fca9f7", - "9fbc824503d306b2934bb8fc88b30bf514e1f6cd24ef8ecad4092bf1829c5c46", - "25ae790d6aa6dbb78c7c9448886941387644db266260a5d7c3c8f64a97f2f8cb", - "99b5e62a9b82b59f3b230d839890167ea2d6dbc1fc93f1281fcc4fcf0a31474b", - "f957f60cab4c83a3a809088a0002388f41a68d3e09e235f6da0ac5673bad95b3", - "f06abebc5c3d40a16d0c22f27e3d1427cc0c507124d212a93afa60b59186d080", - "f32db41a0dec586ca57a886d0bf694f5db4df09aef258cc0ef9672a33cf98e1a", - "caf408c814aa681b29f0caf5fb1b95bc904fe6e98540824b06f99dd67446dddd", - "d8368e54dd121c2360b988c3dc2dcc6bd0b3e37dbbc78366c6c5984370905bf3", - "37aedf43cdf505bccc56a890a56eac9d77a075e2109592078d7e61306cacef7a", - "52989e753f21c9a9818d9aee0e5d33ec92d71b8f0d1d0769e1e6208695ab2867", - "29e40fad801e253b7721bcfa966f8f233dbd1c3e4488d1a73ee986bca9d21636", - "bf5c22e6044acc3a527951b6446ecccd91ff4510b9ef54dbffcd2c2dcca62c5f", - "d217a289244e69330cb8304039ff4da97c7dee4512e4c3b12df490dc53f9f7bf", - "94b61324414f7d2dd77940f671859f8116239c173844717e01bab4de9202f7a0", - "f480f6d64693ebaef050b17593478f6c475472cb5b5db33653193e46bc98ea4c", - "4fe2a958bef0f1d1fd184a622a2d1ed01e38bdecc9bfa078d1ae21c3c65e4488", - "e5c11875a7c2bc16a60ec7c15b465cd2a4471cc1899ad60297ec9e33ccf90f4f", - "72671e48cd56e722ea85d00bc1990286c73626a95add10da12df2a080b7e0e3b", - "3c16fb3289624c5cfb0fe5e22fbe15e7c4045c53b55fa7c33ba13c17d8178daa", - "42042f49e2ac8d133b8765a1f961a4199681c6b0d90ca50f9c32854b0ec54ea2", - "6d50f0e844ad83c9d6431c74c2a5ebeec84b54018a22b942ba91fa0a1fc982ed", - "8f42a019ef61bcdf5b9cc27e67bfe2aa520a1a85a91e05331918adb0cba293e1", - "4abd75db4b982f6b32d5217bb3ed659af36d28dde36101481d59ba28aa20f859", - "39c8b60b206fe0b43cb58523c0e134d81df1e03368baaa5cb5f2659bd0bb3c2c", - "5640cf42b396a4c4d026069f8b7e1b40f1a3f2d264949a249c7f7279c08e8127", - "40b603181fe29e9c49bdacee57ab81a4ae4d52e571616d69d1cd185108553f5d", - "9a58904879a5a7d5fa0624b02902c63abecd70fe05596033925b79d31e61dd1a", - "60ed8e3cea1768d1f1a6dceeb6224bd19f1808429c611c2eab05ff353af0c6f4", - "f1ae142016d34ab9691b66b4b0753f513667282eba35b78e819d0eeaf7ac3ba4", - "514584e9244c925855822a35db4799c358616a1603b631e7d509cb147c6987e3", - "a54fefd75d60757a441a81f0e2e97b551986ebf5daf88a977f7360b337724fda", - "28e956852efdab7a1614f975108a5f1445f886908ecafaf35fd349b297387c0d", - "307e2cf095603011cb243c4daf1b82bcfebb3c100a76451448710d0bf313a70e", - "94ed27a4c77d7ddd0719b4a4b7d0ba5c23673e2add314168469954f5cae458b6", - "da1a3cf181b14c65d0825885350a540803783fcbf4c296eaa23e4f22c7f5d093", - "792bc2ae434a0dff7c542f048535adef36560a67508e42099f144e36784d7579", - "aa1f7c5f6a1b3d77333eddb18fb7e71d58234e55d0feecf0e1ec8f7fd6da3ab7", - "b56d0d91ea3095a7e43f0030d80fa7b4dde0ec9265eeb4572fd31d855e566187", - "a80e1f19215a93ca78f0b1df74c589eeaf069b8ad6eac3448e270030ba68416a", - "bd4bd54f13ff986e2dc41c4ef4e131e987fb3fb0ac624fe8caa975ea94ae533c", - "7b8020bded110a9df3099e5426417034e739f45adae82bfb0be84ffd7793c01d", - "d3e6aab1a28d11d8c6577de667afc4099689330c80e56eddbab145f83d13d71b", - "119a4b11575eafbde805fe44a3bb16b24b8d575789210688337c275b64a5cb5e", - "7621ab9683574e7fb94ce879e90b968d0d7b57acd77018f1fa6d40de7338e4be", - "886b55f357c309c8b4af7a922529aa57ee34a4e96122021d02d39c65a0d4d1b6", - "e9e63dbf560d8540beb0716fcc7a9bd7736f8af382f74f30ac59587b9c257fb7", - "59890b7efceede6224995bfea80bb5991a0e141811f548918fde78274002b95c", - "cb79a373fddcfea0cc68f713f691316343de6a0b98569297ec962b5f511935e5", - "57b47ad17416a5a5f8a7e1c8458f1567ad9f8b5b53c7e8eade8b4295c00cf7a7", - "75f956da1fd8427078b8b630a020e2869f7e075b647d92239af1fe24b099a10e", - "00b4a55a138c7161dfe339eab14334b204afa4728b64dbd6413a42ea974052f3", - "4bd23ff917e736cee76f580401a261a085378e79a8f4f1c4f650b23461195cd6", - "6ee292387e726cfa4270ad8d25fee821659ee0db44bcf26fc0b2392cfc85537f", - "32d81c89b1ee0d510cd3a96e07c034fba44f192a261b0874a6620ecf3c4487f3", - "a02a4aff8870e57a588fb5544e35f5d47ca1a4dbc3d7c1ec8d8e4d5cb373eb7b", - "5479ec2d3ac641301954f6567e9ca799247fd7f42f79c33545e96f0ed80b8de9", - "6515b7a85113cce920bd2ac33f10839bb0ea6dc56c11a8f3d4ce4e4d83b23041", - "8c917489c5e7cb08b3796a95ae423e7f1a196ef255dad509a43a8feb06f432ee", - "a412bcab23dad6e3a1c942b0ad9ead5d304b64bf1bfaa0e67f7aedfb32b4586d", - "83f5d375db1c9339f771786d380a8c0b8180d6fa9c6f0c749e34ebd7b3108c4d", - "a94e8cd5db93b45a04193ca76a7ea6dcd37b1a0656218b09d29898886061bebe", - "3a6e4aeda41416a9cc8d3cc7eb7c44bafe4e82b10b66f3eafb1f34f5c5805b7a", - "53a582bfe47d64da3353becd651054ab52c6ecfc3870b2d809e9c249f619335a", - "f5c72bb6c6a1c6c40b7c92f7f7d6acc4aedbc9433ab9040e0d9977afc73cc615", - "b8653ec5d28cd675c1854e9d312409e22ed25cc92306562103ab1013cb032777", - "284407447a28b11dde90e88bd11bbbcfe9a4cd194167436603ac7e138fd3ae9c", - "e6b592c2a87832482d0cae6d3cb787f85cfdd4c571f53cfd7a13ce571ad4a9bc", - "d904da893852ffd8d4ea7de84df8ed4f26ed0480e05ab6246cc8ad0a865a3fa2", - "0c91fbb7c37999a748151bced8b11981dcc1fbce18a88c03188ea97bfc516d67", - "9afa83814099672c5417a28831b6bf55f6c966c2d0de0bb477f3e498a402932e", - "d79caf5f53b93ca9113c953874f49cf2d7890fdacebad621fb14af7a82a6375d", - "cedd1cf3194804843d1161a59d41f2f17941ce98ebf4610ef669c907ed96d61a", - "628a31d81da4a6ca85a96698cb42a5a6163f8a9e86df1c8b674f620f85a06761", - "c11a85281823a3d6cf36daa1b64b34576fc63dfb0547f0696cabcbc78ec4d948", - "b7f0afe4cf0d1f74f4f5decfc13c8dddf08a7a2ffd09be42c52826ee2894c097", - "05472f49586ee327e289462c4ecfb7f2ebbe0733a28b518aaf922cc19eee3082", - "b3ae2d2bd38f9ba619cdd9fa2856f518b76edf21127d8c8d2a772f57f56133ff", - "b312829ae6dab110afd73311ee5d2b86647a538eb39449b232393b6e6ce96ceb", - "93912d04269d68aeec6babb49b1b2c7c0262af85973cafbe01b8a47c0e2d1f99", - "a9f6c12d53d20b6ed46ab94930c032a8e97ff4feb6d0ed3c176dbdfe456fc9b5", - "d855598c65fbec13d89749e199e44bbff4c28b6ceb149d0272bd36991a598eb5", - "6262bcfd9df3b1761675d234e2c745d01b9c281f47aa074be6f84de46f483d73", - "3b6d1e65f139d7b360ce51947393c873f3ac3f56a149e90b5ca9c8f796905062", - "ebebac835bdf7366cbb36ae879fcc6107848b101a0a1ef02dc128d72f47307a4", - "cea9b2824ed9f22649de5507ac56924cff27c9aeadf03be6d6c2d3a9e97f2c9e", - "200ad1b0d3c55971ef17f6dc47ee6353b0ba7368077f7712312cc25fd24f6c3e", - "38a7663d1f5314c43b9834492ddba412411125f592e92ef4459671f7c3010080", - "ab565995f5043056bbbb894ad771f370e9d13c96b6030b9415a445341ef4ff76", - "8389ef9a5bad037694fa089fbbb9f6ddd3b3763937209b03dc4abbd6151cd176", - "ba00ab831931b00f2842a330e36c78976a4c7ccab5c362ac2c6ff01759a3e8e2", - "7ac88d22b44efa927dad9a63a14f10183bc0fb3b425ed9459f2e43c635df9c45", - "7f5f3609e06118e23ecd7c47917752698ef742a1340cdf3c6ca0a1594d17ff61", - "f6879971d398603402d4c6641bf86196336a9f56ebd2826289cb76dd78c13810", - "190b6e9b70b2788a687d728330dbccf13df4963a3aeb523bfc58d624ac3fe52e", - "fba1d3eb125c4e8efda88006bc1e565eb185947f435f6afa8a62e7d6e116b9b6", - "c811b7308521d0257254f39f491522dda8b247bf3cf7ddb3c6bde67fe67c5555", - "878d73891b5d16ea0f88fb277e32293623cf6c1a52662432354467cba80ddbdb", - "f5d53da37d4694c931e6b7901afbe8fe1c0319cd1649ad2753e1dc914fa74a71", - "12445f8be5cf8c0b92ca75e25666df90327b9082a3db085735863838b6f46014", - "f87d2f5c20e90867f5102f7d5195491f1be175cb32ef9fdfd97f9a2009b7136d", - "d3285ba129e4df411fbeb98cf9647ec85bf8122861747c72215f0692920d0022", - "70e0ccc63eb4178b2f7e14ad7c8a76013c1b26055834160fab7a507dbc6bbbb2", - "1be7d37ce430286c0abac69dd850706429718abbf17f091cacc2b36379f7cc3e", - "03a0f649df2acbcb28660a32129c1370deb9ccf439ed42248015733d8aca2c26", - "59c64be2dbb0e63903a26b02e7fb0bdfbe757d68eb2a5b7dc84cae512c4ef96b", - "e991cfa7f5e50e14bc86723b237302f3d7d1391ce4a5bcdf5911a10db79055f7", - "646ba67210ccea951fccb716af18b671a16d8581296cf63134b574d6477b4c81", - "7399f1e7a5a132ea477e142e44050dd88880756cbce6c650399b96c60ee68217", - "e0c33c89804c4cf4025a29a76a9bed825c049a4ed0b103f784200b6db4467cd9", - "8f8ce758d03e6fcf9313fcab051630381381427dbcc0e7c3067004d04d149896", - "72eb5ace960d70201d1310eb097c9ce3ec5c8be55685ce388cc33825178007f3", - "1f2165b77fc7344508e1ef201f6cfaf5fa108b5e6129525b984537d64f9bf15a", - "a721e161da36dba504a5b01dafcfa9cb7d47fb1ed1d19a1e014808a632f3b769", - "62a06afe0468ecb974d805508227bbcb48369db7e6f93787b2b47e271712a1eb", - "0e6e199ddeb84d209cf6bf568dcde05fd0e5635b66219711a08d47d837c61bd9", - "a627290d2345accae50140b85e4c88ac4c7ae3c244ee752eca4225784e462be9", - "07f9e27f1933606bd2b2afdb79dc605eeca703f053ab851c54ee280ecb4f86d3", - "bf7bf47047df5a94910c2fc0f0f38800e162de26623c3a3db264dc1efee7e8df", - "8264caff70944400c27823498ed77e0f084cb56bd2d49f7e985a7e7b639d7123", - "9d032606da1464d7c70025e0c089dc39ae6b65ef68576555ca35e192b60ead0b", - "ad0f5fcd03067da8f67536856765c373eb0c05c89858ee847b253c00a05f3956", - "fb77d727e4f734013b5fff1bd10beef6aa84398772215547bec5807418e1aeb8", - "3a5e3fcee279fdaac628dd798ad707518da6a7a3d0a15def1b892d3a4035f29e", - "b212086fc7a6d7efb2c7909fc16fbfa812e847b83e20cacc3bb5c39757d07707", - "06b3c0374e77af5e2bde0f64208417107460697f4cd3fefdf9091cb685e54707", - "6ca7949b06126e38e14dd09c07d0f2a382e570d47550df41424a2c3d085dfe25", - "5e03af69438e679fb1ab1cba45127811b73513a9bc7cc6dabd57d13652bc7afd", - "56fd383468d08920b9cc1f151d52dee1ef8fd1761a900b12263b12d561aae768", - "ea1c0569a20d3bf1344426f62dea4e53b9e700d8072ac863813eb5c5308dc092", - "4925acbe00f8e13740e7a42c3e098ee958c1f11f7830244f107921eb0744be0a", - "548038f223abd545bd7cd0b92cf069e6ae4b445f9920bd27541ce3de37781471", - "a286c5ba225c2f00654da0b8d13d98e5d463649a286ed1e5580cb01c7f523de6", - "26cba61f6eb2d81b1debb941588657564f726245fa8e684ad15a181000e14b3d", - "be711441a9c694c7442f066646f25520a69f68fede06f09a65561ce2d63c4576", - "af069414f7e9364a4e59989c57aaca462b78ae66f069a05827903cf683e05754", - "c06c43d9b526a7c28250734cc9ba8042920ff86c1412ae6afec57d27a2463383", - "dd132d64f186d36fcee977527825bdaf13922c44fdfccaa694df9416bed93126", - "00364d68ce58be1e8d2b5635b77dd0d50e88b9aea090cb7d6df967c810542300", - "83f012c38bcb6a04607586adf409dff434c21a1f51b06864837065b412148b98", - "7d4a43311a0764961322b24f1d769b37618a307e4e698f54c237ee2023dbc18f", - "7ea6c7884627e4c864fac345bbaff6ab67dcff4aade91b645bb1c0e11a00aea6", - "ad4b1911e779bc61ff31291948fbe84b119998d7609fae1e75c6f9e2f7bbbbad", - "0b240fef5d6c4826b6e81aae4fbf54ab20ec23d72c64ddd1d35ab76451a41298", - "733bbb82f7b8a66322b98dc03802b1b884d63d836efd20f38410327c9144457e", - "cd38717491c840c11dfd427a8358095a7e4c09856ace897815065a1bd5cb22b8", - "64a530f0c408c6ea9afb83208af29fbbceab83fbaf81dccdc2fcc0885b2c7961", - "cf613a43d849715f754a58ec74955f1733b5d711a5e4409ac83c2265adb5eca2", - "79aba2b0cd7978789106d1ca3447fb5537941a43b903f34e80a55ec19de4dc01", - "5afe7944a377df66a154862c82180683a2bdf7d84c9c2df0aaa70d324fdaebfe", - "521b28a7ce7870a0b003d651b4f6c9469e499d15c1f96539a72d8ddd5632c878", - "8973b2dfd18a31c0380da8bad807af1026e7d8a3ca9bc1ccf2f8c4d2812e85fc", - "f3a095f2ca1218f26ab6323c7ebe2e6cd701ccf941ce5bf4926947132a8d975a", - "0f8660dbedff036bed6c75866e49539e9913f65df39c6f3a49d512b9c64cc1e1", - "d92fcb179710a2f9097902f286db05a2229a131aa6a2597457f867d46a76b4fb", - "75da98b282e2bb6d7c1036faf498413bc4f22917e2e22fb5fb3a799b2a8b3d2a", - "9cd2343eba3cd25a1ecd78343d25ec6597f8515af17c3d376aeb84c81480e972", - "428dbec678b2e9b5c61dc975af3f904c3a4fddd98e9a068d6d5ab1768696070f", - "e46978492018198a42be89f0caf971e10d9cca6cadc536ec981aac2f6fa2faff", - "5f23db32c15fe956899b48387da07b1c284c04a5da8793882fb72832c5ce8d33", - "6c757e05ee92a89c818ac38e3d61ad5bd0d47c36bc8d6ef0fe092cb1768931c3", - "c014db3e65c2060fc7216ec035ca3a185e5a7474086607099007f1be31ec9fdc", - "6990ed3ca28465077d5b134910b20cc3fd860156add9d705978cfa2ec81983ee", - "e539dcdf34044ce1310abd4806798bf78160e65e342ced134e13865a5225d39b", - "491efb025058a20cdd3d3e4efc673af58674150c25065f87a6c4038cf2738e76", - "d8054fb04dc6006b079cdc1ce728ddcf980385570892dc002097c395b74ba1fa", - "f515c27e27c9d57697f877970d3b5cb04be89ec5380861392dec42fbf491e0b3", - "539ab9e8bfc3a65536a29bf9829548e383203734150cffebe868e0b5f6acfd23", - "e9c551595b88951462a9f024963a995e7d24f83aa99a83584af03da41a18aba2", - "8380dfb9e2a56b04d7c644649353f7a1725fa1105b3cd988d1c6e9d96e5aea68", - "e53a127e59e3f36184f250ee726a6f46d0012db4a0ec5cd63662292017333b48", - "6e88c58da0ff503b334ccbe42dd92a3fe5553453536ef78e89777dc7805ef0c4", - "b15054d2de4e95e3668c5c3316dcd95f1dba79bb765dfb598861aabb2f099f8b", - "9b2d1d58ec02f3b9fe8c36685976bd0a3d1a34115bd7baa86d37c0a57c01711f", - "e1747a883a5f0d545be3d90d97d7d8112c2994158105200bada773a68e6fd270", - "24ab27835c3638c70fe62213786935c849c7463407a2fa8a28fc545dc8aa9223", - "8ffe4b71325621e0382302439428e88b03f11a8b39e5be83c4c1bb4ccf289b36", - "b5631f1fbbe25519d95aae2faee7f9b5e4911123829cd41306c480e41affb686", - "bd84f88a59f5d262451cd972b5675ebe8015c8e6a87468cdcad13a3222ae43d1", - "3dddc8933650d56e9e798993165bfe94f8005762f0d61210902d9b2997ca3ecc", - "1a53e5638e07bf1bc975e675b2f960bfbf5cc6e1c7bf37e6b235e8534a80c60e", - "83295c570b34536804c4bd2191e0473314813e32e040b4826ef9543509e53b92", - "dc679792e010aa56459a11d9fb5861185facc8c1b880f0bd19485cd19100b7ef", - "43506402d3a4cfaf7fb04fffaa9459aade9c8a3795ac788e56fc034731ff2878", - "01b02e776528a3548fbd28f339af9195faf43f06d23c0ad1b52b08dfa752655b", - "7b797755846d42dae99b5d39f90f55aa73391cbaeae94d8fb937a71979005988", - "019034aba9e49e7fb2974bae74a0dba1443601d6e049fa5cc2a727cdb5a794c2", - "08c0d2f2b7e58daf0888aec8650927331e01b0666fa21de60daee8cade01b8f8", - "ebaeaf404eace1621d810b469ccb114d0e4a13ae22bc75124de28e37c718af2f", - "6c48ef3d0b51469bd7d16dfe611d6796f422d886c6afa623406135c323065643", - "e2bb65e0c7ee79718053c959fcda1f7c3baff311418095ca94996ffe3eeb7be2", - "81c96e22ca937d9a141dc3b92524d0a474e036cd4a394b838b384efbd9797c5f", - "ea5cbee480e9bfd552b0a64b61253539a10b37e9224ccd113025ffa8794442c4", - "b49c64b31d4fcc22802982366860bd1c360acfeabf6f7023bffb623dd241679a", - "ece7fc65e907e1f6120a5f5e959bc10857a1a6a6d5e6698ec9fe4ca7e9432df8", - "ccd39b9bfc6442e672e389b2aea0ea444c2f3ec2937e835c0e0ea7f51887322e", - "25fe34260eea0aa152c6b15f25b31174e8ec451fd9d3a44cf2c7563620f3605d", - "b7b1b029e927bb636ead84c17f52097b9a805a02cfcaedf1e82b53021d4f463f", - "726570f7083dd20c66e149eba48d0bc4786e931920a3b452ae9856405b7f87e3", - "afdfe8a14c727d9f81a73d3bf0020f6134ae19f0d3b42a7aa741a35f88cc5988", - "43b11117b4c3396725ebcbb1dcd7a5de6125dd35a8a9deb292635dc2b810ca2b", - "472099c95006e794cb40ab4527f900d22351790fc6914432196904b64debe4df", - "3d0b48cffc467a9f774f03b215cfd6222e4777a43ad9c575c7e6a032f2ee33ef", - "e63cb6707a0d66ad76fd340453cabcfa1aff5a10db3f7dc26cbe0e5fc13f0c75", - "5c71e691ee5e623f18d3c5133349ddf234075d2d8c14aba06920d0a4edf64e56", - "80a85b8b4fe5a202e2f089a47137fb08a986918026f1f99fde71e91e3708d81b", - "f3cba03ab8ed66643b13662222f47a5afa30cc67361c815e1b918c0e965ef376", - "060f83fa8a039ab1a9e8789ac6c01061861c8a4fdd7794712211e02fd0ed242a", - "1a5bceff9b8850b1254803c2139244229162a60e9c4dd07c6ba6cb54f4072d91", - "81f31c5afff3420bfccffdaaf79c8f43adec70451ac0397db09a38cf27dde34a", - "2ad443f2a3428872248b7c170bddafc3ee642fe13b45f17fb312bc90bd64c863", - "770329de25204165426a021b8cc22d0cceaf7bbadd01df9e3d592d739157bce0", - "644c5393435a2208ef8044b4c787d2748909d25bd0a3da01288830b01199d37d", - "2b6ed387d22d394bd8062f7ce85021e05bef8b71c8931c041e93e75c9d7723ad", - "c04603c5575c0e6b57f37bf98aca7414f153fe670b0f9485de961c7057ed6107", - "18d99144fe263dd653f59c433b5fc793c65a1f59414705a91edb034c81e2c8c9", - "d7bc792228f3e510d2ecdcc6db8b4dab86c16bfc8df3c5e423b0ccd74e9e858a", - "333a85b9660f8fdaf60f57a2f1baf4992e647ef9e7b51296808e77622840fd50", - "2dcdd20f633715278792e11f446f5b90b15b46e48de24858b45dc6a795487f9a", - "06e35e96e50937069dd3cb2c70109971de6d0533d7fcd2ac444cd91b65d16d63", - "9b68bbb309c9cd3d52e8594c023113e8fcf9b49b7a891a7ff83d739df7ba9513", - "b20782af04fb2cd5b4dc86d48f7bf27cf8d9ad4cdebcb3e2faf3d17244a85dd0", - "711996ff1b87a0f5b3566ca07d9623507d8744aeb8f5fbdde21802e22bbc66bf", - "21ee7390fa09a28ea560b552da1a1630620ee2d499a05a5b321e7b97a781ce1e", - "eed60d6480ca6ae56639879e2e6582467b732b57126c8c7112dc1d851a2957af", - "623b64830b4d1f517de6978d3c069ca8a8f8ee36ede88cf3a9911eb5a236fd3c", - "d5f5c50940db317ec1ed76c150f5ed9ce55355751ec24a3bc4df08d58c85a9ce", - "ee691309bfa3ac0283f8d64629cb1a631d542104319a31d19294b1f205e7f573", - "971b6f17e73f70fd95934f6cb8296351ff46f32269e7c836f2f89727703d2dd4", - "bffa53fc7b8e64b02d51fb22008cd8990745ed7f801b60b59e054ddccf903f36", - "9bee28c37837893743c508e9d55c3633787478ea9610e334bd8acce8e0129a29", - "e92ef84b044f374a7505e4f8017db45af08dfc4753d023ccea6dd32196fd01aa", - "934d02fc4230864613e83d6f6ce785086f9231d1e45e4ad44a44336a7b03f61d", - "7b4ce722f8bad6032797a603504850b8a145cc354ff1107753b1a6a226c873c0", - "cee236bdcb654d2b68b51f969ae58bbb091d8d6671eedcfccb587b20223d9540", - "fc4b65c5a88a837e98b4d426f9a99fb0c844216bcc1b6c86eb75bebeaf246f2c", - "b366d73f2b7999f5c56ca18c9fb8af703cf7120f24823068fecf974418470ad0", - "95e78ad0b8e443d8dbafa53a771a0a5d56433e64bc5ca268c1524a107859b316", - "f9299e8ad156c64315af744cc331cce51cc2db60e4da050b928b068881fdb636", - "367257938a1db12e29c37ba6b7398b868e01e916b431dd812694b5a7e3839c8b", - "6b5052982d21e5fb73d084ef28eea34ca40d688780d2f59c92a3d97e6dae17e8", - "a942aefa1cf876e98ef60102ef6ec81939d73f69d3af0a5c04f2918a63d6b3ed", - "1b7f295d6d7c5f18526b8cb05d933bf7b8b9db1ab9ff9a5cb7b551abcb308d11", - "eec24d88f2d6480a238879e4948f2937a6d7d9c3eeb1147fefb32e79bb660f84", - "7de32c1766686b523b201ee82052f8b26969cb4b83bfbeffab037285233f7670", - "2d097587a6d066f75c27dfab7a4e23ec0af8aae995ae3a7e2f6614785bc15af3", - "d7c1d1284769c196c489665210092fb91a353aa3a667c73026da1bd8a367b12e", - "faf8c206c3bda11ca3ce0f52575b85d991475a76b326b1afcd155563832680eb", - "dbce4172b1ee82f5ff90103a3e66ebf017434d1b1bfcacaf26ee959c7d1b2941", - "1964e7ebf04e1a93c8f02808ec2de2347ab6eede5b2bc6578f7e57356275d4be", - "5d8afaded1b177490a15df6520e7e5d11f3d5b4f7c684af3f67795e7796f9a9e", - "2707bc2b62254ccffaf648aef2841c283b33ff117205f7aeb966344f981851bb", - "47139cbf9d01da5499226ea7a940c68ca6086790c0d3140bada3bcba0a3d82d7", - "7d867fc38e94c9fbb74842eb0267d00da2773a8f4c556b392bf52a845b06face", - "acd3c024a8147695bc49495aaafc2df8aff6a2765d609eb3bd2b23b17be28489", - "c3613c9de2390be1cd53501f0f3388ac504d02f43c83ef6e02ef0af515c550f6", - "698d586817fe7f6d09918cf90aa1da18d9735e7e669b2e16be2cb2d8b21d5d9c", - "7570d723e765c242f8c3968fb0686209a36fead9cbaf768854ab3037fb70787a", - "36147ddf336bcb717cc1a8832493d168db9e9cee515c54b43585e0ed3649de46", - "7ea4040d1322637bf0e472ebedacb0e68ac549f0c7c8f32dba0e21c58188e89b", - "d8af2ac76e97cf9e41e414b834b954b85c760f67d319a09070e5aa9b8caa5526", - "2341b86df44e56a5032284eb0e722e67bdf25b9f0ab721915a8690c7f57af90b", - "75e021b84b0b3ec4a6015ab11d352e492f160a11f37dd51d34d1254b4f77cf7a", - "4d2964ed23585b21eea35c85d9b65432a7b1fadef6b53dd080a00f3e39612ade", - "c0d6a1c5cf5e8d4caee36b26aa38631b9665febe5fe4643a267f6f6f9af59024", - "e3d4f3b9f8e497989fc363ff1e2aa2bd21571d5b7e812dc48abc3e696e80ffc9", - "cfbd8e4d4b3f00063a31846a42c0ae45e8d4a474b0129652be856f8c60944d26", - "4df4787f79ee4b617b2002abe1f157fec6e09091784f84890771c8da14d3e647", - "b1cabace6f2524a839d0e4dd4ce3d076279d167404196b062fda166c80bf13d9", - "ad99a1e38c3cf56bb44bd1e30b9a743c95ef2a4c57bbb6b7a1ab0da5cfd0a825", - "f4761ea73642b7789be52a76611a56f55769838fab3f3ca39a892fc520675319", - "613f6435aa52f5dd546d3c437ac6f4b10ffccac9b711a72d8d8572d64fed071b", - "87de172056970595df6b22612a297d3b6a2be866623f381b476149e0585416a3", - "fd7bfd3b7e09ea62d0d6d9a7d58804f833967a488418ed9ae1ac863c8beef3b8", - "6dae456af60a07068b5a07272c5dd77328385768f1fc8aba43a3e3c5610a8ecd", - "fe31b2a8e1d9c1b0fb7ed6d09018a9eb675db06dbdafc0ff0eb5d561443fc97a", - "67f12277f01122a8e37310f6e57e3b68bbe3cc382131ba5cbef993df346902ba", - "97fbb96640b0ef07dd9d027b353ad4e21de0b8b2081d1d8e72aa95f7d0aae3ea", - "96b97955f9f750edb50822757254ebda918e9e8f2b51a5179bbe43d8bcbd7b27", - "c8d2132fabada2ada0c4243e2a695540e355cf70f344c59e0d3e86333d1d9acc", - "749f50e0caf4880f48ad52e65f0662d53a0e7a5366992bcbae24b94b9958b9a4", - "d1e24b73c888e97409f38f72d53a5d8d540cb343c7f6d3576fd02332268c05ca", - "e0e18b2d4a1d667379cdb70ef741dd6cf7d5431b352aeb7e76c2aaa802c1b738", - "0cf4578cedb0cd55d42ff088442eb37b38217ea33060d382f979bbabb167cf92", - "cc259b21c23504bcd78ebc3460f7f2edb5d03952728a60a6d11ba4d34f4a5d03", - "a76ac6ae50cf7a7daf26206509c283a2c13bd4594253b664610d2beee8d5d44d", - "ef28f371517de36833c1c5eee4f35cf189458beb958f2adf19e0d57c68311b0e", - "aa2d2c482d5ebc6c5bd4dc4e76fc8e90678b2467d871ef0f42266c7fb2218357", - "3f9e5ad183ed5e47a940ed7b7531bdb1173e629f56d4cb84e4eb267361c1f4b3", - "ce82629ca1308f4b7d9c0d9ddab2dcf10a0c670fba097ea3454b1b4ee9ca191c", - "73618179b15a4e83f97549ff1c710e05ad7fc04b008b81aeeca284551e4187e0", - "fdf446b17f1aab13439cae5a18840a691557001955cdb4ad0a5f3a16c9ab2245", - "fd796c09ec02edf9e884acd158c07ab7ef740d10a3244af5399106df8bc79e12", - "e727bba4f8a003c609134994b8959273f949e7291dd0bb427239ffa7f48948b4", - "38c397859ed0102e84ee33446952f02b99a7751ddf68057db81244032948009a", - "c83394c7d88c045b9f33600f021e59c6dbdf31001f6692e0b19c0df2d93581b5", - "43154713d2f901acbb05cd112a5b6f2a37b1ef317b4ce075f53b5d3e1fc5cb2f", - "bc4849bace2ec5f762ce08a2e7b93e3d475a94ce68b75b7b0a3c7d00298a2dfd", - "5bba27ead2884052df5df27066ea9327091f606dfed7af1eecf4c21fb6a71864", - "d463100d7f670fc031e031fc8da5ff9cb3f411c739e40059ffcd03e24275409b", - "46e3edd77899dfd813a60d8a4225a64727ce9bd6ab6b3ee26e851211beb1c9d9", - "76b57ab2ea84a1e498992dbf4c6060311e7f9cf6215b18103a75497f58d1eb5a", - "398f7b772df501494b774e27388fc0fd585831bb2b3143d42389f7f9b60ce9f8", - "df2bd5ebaaf49c9184e8b7d83a6affbdc81a40a3576b5afbfcd55f1d1da7d38a", - "3d64f92b8c69659a245a9f973b94d632372a0a56ffc8b23969a42ba3f448ddb3", - "bf119933c67c0bebe64914eed6af5e862c5f5940418c92ffb4eba3ead3a0f253", - "5b8b91840f42c4f44b86e14f5cf21460f5fa44eeb40c7d8bfccf5878a41192d0", - "b5cd6d822b9e597ba94f91090dd89364fb77af8f703917c333726ae9aea3a5e4", - "55e6570381d6ba327ae28aed65c17be616875a7fefb8ee852b4f92d5e03a9e2b", - "bf49b65eaa926428bbec1bb7882222508dad8432f4dc381bf2c634a31c79dded", - "42354f1654bac89d79d6e3d7ed07cd89a6aa569c887b3685f8b7d4c7f0cf3e64", - "50f54bdfea5fa073a53e201897de265b3752269646d6aff4b1ae9d8ab7157737", - "4e91cf9394d49e3fdf5eafb78eb7a4c053f34eebef9c8d108a1ce45fc571019c", - "b91189a82480b76e8a11015efe89ff1d335b03b8c96f123c1faf3663733c23df", - "10fef046bce16d3fb073ebee6715b904ad353ac19c9a4309762b9a72f82ecc6c", - "2919fe295b5cc54eb0eef0f60b1e12a381af2ab186bba483bfb620051e914a6a", - "03295556530a3121e3643d11f19eae4c52d1aefe5d1c18e30a4df3df6ced257e", - "b67bcff96679636257f1e6a711ab68146b8a8910b74f360e8f6f2c482e7856f3", - "3e5ab61c314dd1adc5c1b2cc5d79b3c3231576faa8f669b0a27f770256cc5029", - "135d8518fd11bb40a416ee29bba5e4d6b4ccf620a5d5ceb04badb1eeaa10e020", - "911aad9d28f882603fa2ebe86e30cf05e43da27b8e8c28229189bc1334ab8fe2", - "5596267c386613a6813ff1f78c3a4ef182ecde1706271be4caa00934ece97671", - "cc6f53427f0e60cda87986b715157b415847b099b895652d6f3887a09d187577", - "7b70d7572e1efbc1bb27cf12571bd3553f74a0cdfdf8f529004f52a0ec620cac", - "7cc4308b4057e8d582f53855e02bef7fd4808b71f98a656d0b715fc64d485ffa", - "89798d179da780322aeec649745cf452298db6b6b7034c52585a2892fc963022", - "0cd0921b6c6d6acbce5778558945a2f5e90506bdbe53385be4e1ad9b5b1605c8", - "8862b194b2cc8ac56f4fecb611005aa1ca6378af63235f1865182b54dbc3bc6f", - "cfdf290f4b9a7250f2820abda86c63c54422f5c69b1adb855e613f14f3ed5a13", - "c4a3d0e3b46a389666c1093db1b51996ffdc4611d67998e47f6aa94744ff03fb", - "b5d8b624a961606096fe4388b34baca580c0421751d2218f9dcb06558cb3cda6", - "bf4401f319db7d014818b7d95980c069f8bc626307973b42b4e0692c0837c5fd", - "6ba481918d75daf62c7c377c5618551a8e02992b28cfe5caaf9c14163e14cb85", - "62bd7828a391c25a596013b38102b0ff32f4ecf57ad623397ebe50c43be59fc4", - "188ed0905ab0d9785d81a44c8650bd4a9c8fc63972c8155c2bb680298b3c9f7a", - "8d2bff89727a2fc24de4bf24d7bb95c39b95ff02363c8441a7770c241eb10599", - "114ce2e57e6931d5eb1dc97c0262e84a0fd93a4a34fff95d7077c252867d1228", - "83f31d9ceb60782ddffe34569c6bd1ca489b8a3821822c32cfc5dc1231f1d662", - "065e3cdd053b918ccd7e5f79712f5d690c5458d45f39283a4ca7e836e11177d4", - "d559b0a11d354e7c8d048f5509b52f562538ef8923520ee459f0553243fa3f4f", - "b582d5a34b8e0208174e914e6b9e94318e35e74ba39486d342981cd1f5ee4a5c", - "ccabd068ef0318e98983496aa872f81a7d89ba06badff395bcacde9bd0c2f024", - "b8fa4f5882f3331dec6c9094b7705a31dd8c5cccaba80704cf8aca5e1673b551", - "3dfc9b429b0e25d0669b1520d46ca00164386efb489b49f2d947d40e49029f36", - "f45d9dbf22cd351ec857696b031c8c55a208c59945c20ac57b7afb0430605ae6", - "95c98582fa02e40cfe9f2f46f4b85c04c2bf30a91dab19125669ab97c50b5569", - "9ae032092974a74c691ccf59e2472463df453586ff1b9af802a4980efc5b1ce7", - "8ad5aa2091064d9b81692f942efb4f9b54d216375901171de34a01fc00ca9a50", - "dabc0d33eedfa107a9b8c1d133f177e09fde5e7dd9a4e3475aee63f8375ea01d", - "3eadd2f3472bc51ab4aae55c570562b92ea755a17a80c453c572b6c9193e15dc", - "008d4bcda3580a3f1fee684e520a05eb3b53d6984643ec972a1dab6e9ce5f47a", - "75df6cb2a10adaa3e110f59c497295905f8bf2c675b99c09660d27c9450e4b05", - "5519abfedb220df5ca8cdbf5281508c5a112970f4f10d58132350dc134d11169", - "512b77aa1cf2cd03257efe470384afa3e892b18bff73e565d7e099edc83bbef1", - "0c4d38c9caed4985fc10003cdb983a219e67256e74cf1d0245fe7f69fe93cb3c", - "8bec9d8a4801e0590be61a44cdaaf677091e8a3bc555e93d69f671ea71f1bff9", - "770b92a04f0342a47b62ed7656ce48747da0f9103052d6d534c53cd837b7e0b5", - "b3c4ca0122d8361a1599ff8de92d36ede7287afd20629cd7a135195b47b5fa9d", - "9ccc2a35898d79be255908cb9e38fa668fd5a8b4eb8bb62585fbfddc00e1abb5", - "749b3e5e12dc8243018b592322eccb491ce8c072933ab5af903b6f549a5641f1", - "04df5c6f045ca42d76974ed1c0b27f278381a91d40bb49af23e5a88e3a7177ae", - "0fa4c01bf2430395c7c825816badd1143611dc12bc3898573989067b13f10c39", - "4a2565d20febce195a546b7f4867628226e74bd9013ba7b31de53a9c7da10d4d", - "b12006b00ca378541ffbe6a84b60252ebf8f3a794bfc53495f9f62e35845612b", - "e0285bf6e41f98478982351fc4771e060b7c42ae488f99c961cdf34ef11514a0", - "d696a1af3e5623401ce853dc1b8d7c13c1963b68aad17c7eec2ec2dd50b5c43f", - "0131c42bfcc0c8100dba2ac2f721f43ee7c9e6a4dd08f7120329c257df6e218f", - "1208555c89394c6e781f4f0ae3053dc001d325415a7bb83e41a00b51186ff740", - "ad75ac18ee174d990a451c461f8f48b1b9cb22efc22dcdc3d66e705907ed03a5", - "d7e1b38d5eb66658ccd3672dc44e333ad7b68e63a20aa5cd136ee9429e0adce0", - "e7a77b48b4707669352980db4a3f9dd67a2d6baebee2e6c00d6421a351d74a5f", - "7486d9f79c85a429907473d521a558f1077ae2b97c97ba9e935805c7e60af94f", - "c4657a525d286f309594f18eef5ac1b54d5db7578ef726c7d8a19acf52cb7694", - "e94af6d6f9f05e21ded2b2138efbfe481dbf3b00cdf8887c1400c5b45b187b11", - "2d980c6626479e723143a1b25696c34067492cc58c05011dbe8c60abf2594c54", - "017484db14aaf006bc2cc94d551b046c79e7993b80f3478b9d1b88abb30a1b87", - "de9524e0ca4c8d0d363cd2d8f00c0c3227eedb29fee96be4057f03724aecc9de", - "fed736b75cdc85a539b98d82f1f678ddfed68b45266aa02ca71af2ac524217ed", - "c685828c6756bfbd0779551b72c4f0a45a5805117d2c7479173dee80627a4eb9", - "86c8852ac6e76cd8ad0b4e0193b1bc0fec54aab2304100122fd893ff7e4b07ca", - "3008b7f032f08daf3933c30fcc7d99f3bae003559de132ae268a96ef7ca8639c", - "4bed68547182b3573a505756018b968c57a99d257da4dc557dedaf2613f0147a", - "ec78e3517d7bd2e2f24e25910fbc2b28efd8ffbfcdb0bca913985f17de732753", - "e26359bad5d8420738279ad47c4a2e61ec2e750744823173c0531f7da97523d8", - "3248ce897e6bb791009e236d2408a674323fb845452070e236ad0b5d652a0d0a", - "debd3da0771fae2358f20d2ea945ebecda8840b4fa6c894e596e931530c60622", - "8bf6bb51b989b109a726c43a131709ff738f6eac2829ea165d617e632d1f9847", - "12daa131e38835de0f94ba73ef3e74cf3bf96c1c14082199db21b7f005181906", - "10c2fc5b0bf7c1da36e7033c39f27e5219fbd7e1de7886801a0a744a126c6fe3", - "4f8645f6bbec8e4a4b6c8f56ce1ef3402ada79d13fca33ce49dfbce81e8894b1", - "5a24c384eba1d2c242cbcaf16ce71049840408b25547800dc71c8c4dfe049664", - "4b076bd6206f318ef45076fa9f157798122b26c7874357cd2328080dbe7bf895", - "8e0a59af5b3b84d2e0afbc774581638e0e0199967cb30473681bf37017e14838", - "e25b1bf732c8a0d88e118e2d50e92780f3aca417e84f9d015c15d8c6e511f36e", - "c7d26792c10467ede40a5013d1a70727e3d1e9452d5ecae1fc3f91da8c29ceba", - "bb88f11d26b7e3dd672dd76d32644e9cf023fadb78bb75055d4612a5f060f2e0", - "fc5fea3ee2f53cd334a992b3f354187926e2fb7f82da0375e34b5560dd632fbe", - "8c0f2c2f1920b9b5fb902b04e091a27d81507144293e22f4437d01d0e9d7b47b", - "a3048f9c710e9ecd418a96bca23b070ea78044838ed93cc0a6213ec7fb6f49d4", - "2dea145d205c9c57e658aeec6d5094ce7d6099172da1dfbe9320575ee0310eed", - "d253aa9dc41b89998702519e556e6d4796589e04f75eba526ed69346de6c793a", - "5ce57baf296882598b1f058e8ba66f63f0548445a3ab69a1dce4685f5096a21a", - "c7d60b3b20737abff72a133846233b9729b595ba6beb77eaa72339e066886fe3", - "4ded823642f802f0381c55e0e92be311d00315de2a373667fcce66e713cf0681", - "1fffed8690f4691de8cadb64396603ed8cbc85cae211fa5baa7c8445c1ca534d", - "55393cb866f95545005e4f82b6232611393ea7a27432f55fc336fb7498e8aadf", - "2d51fefe29e7e72e65a8ea362e85a5e90342005a2c121260f187367241c92d9d", - "ad12315837ded032cbb38f76651e9ac313557220d6c528524113bea7817f91cd", - "9119da76d45bebe89984452f2a8be98582adb05a07e7980cfd9eff20cce16db2", - "361f44a48843a0e0050f829590f21fa887c735c406ecbf1d5081dfd9806befd0", - "e9fd56ac29e97d8eca45d724f598bbfc4c2ee43ecfc7759b5487fa8bd068f5cf", - "579ac2b3d12f44ae52da993b92a62ecd8b29a3dd716403fb3cc9e43fd8c4f9e8", - "c62b5c3b4aa738e4b2cbefd87aad60a341006555bb12bfd11056e71877d1879b", - "16ed54a25c6a56265636c8bf0134995ff357937e566c86abbf3449af907b83cf", - "6e938c8447957c73fb758025542ec66ec97e577598eb97f9f576f29c3f31d702", - "25a9f56d3e6447c13118ad805aae108bbc608c252b591d0ce0aae61c067b808a", - "12aa8d8461787ad9e634b44fc8397b1e46fee1bacef8c4c78288da6dffb6a884", - "fdf33d55f4eb8ecae2c4b73552b6daeacc97bf603a5156f49fcaa8f9ec2a8b42", - "70031221690b15fc90a4277adc2df3a9372617ff76605e4fd6e43d6449454366", - "e8ab1709d92af1f61a84ba13bb948d28fc68d6de9f4a9495db21fc681764a896", - "fc2c61bca04007659be0f7149848a82b5580f4f30208fa8789a23914790148d1", - "649232edb9a41ce8c06fdf0d9e92817f4b493d8687968e46f504d3401db8d542", - "fe5d3a0ea2b6b3d6e94e3424ab4b636e4d8b3fe5c629fc14df7f9b0fdd3fa8b9", - "63d5d201d645b1a2820d88573891609fd213fde6fd0de452b77734ac9cf6f91f", - "bb1098fdc358876d73f9a1139cfaeb94f8e5f513ccb0d756e27bac5480608054", - "d90bb48ad5f42828fc71bb385729444d10e2dbafaf0ae7e8554a67ee26240a2d", - "d8e2e5e70a8ba16dc038c609beb94beb77c86a3f09a45d1e44613f585cf8dfa0", - "60ea0bc0ebc6ba403dc1f12111ef338917bd4e7945275040035a4ee342d2c430", - "4bd91b5b2dd201b552beb2e8aa849f5963768f4b84e1ea3822bf21fab8798a2d", - "454ba30148e61aecd3ff6da7d90ce91b8a6cbb412d3857000aca8c7517d1ee21", - "69c5844516490ff6db0f486ef229091a4b14c43400457f38aae30d64a2c4e9cc", - "cac6fc9fe1c19da174cf55bd1beba0888779e817df3230e4ad5616aeffadf294", - "8f93a461065759462c136e9320ee2320c6bc181f1997608cc679812285415f85", - "8dd1440e1e5f163c558e57655db2fdb7de5da344185c1ade142834c764817459", - "537556d39ebb7e1c8b79f9819c2d8f944fe3c6cda0bc4fd137af74ca0b600d0e", - "70ed100d2982b0f77c22a11c4dce5b31fef0a0e8739068fed0339607c03ae397", - "7b83e74f3b6ec4f2cc594e33b8b14eeb33bed4558380a3435ac700413cd6d36c", - "57073789b43453fdc6167424e859f1148a6405304ea5f73b6c3649de60d727fa", - "2cb79b206833c4e4f694df3be67bdbc27b57c71ded7edfd3c30401abf9f01c58", - "ed325d34d21b4b521714b6dc2b6c6082763d7fd545fa924f04a1a592dff32fed", - "dc18ae0516a4a7bc52f39838060bac5560311ffb942c1465fc2bacc5715d4f2d", - "2e6b047cade2909204091f2037470634e84020db77b7d6b9aaa27e5974a870a5", - "ef65e04b4702811e643b31bf5b1dca968a18f144ef3815b8e82a4eb22bbcb9af", - "96d720b9b803781a27e9853cf94c0104168525cba5503062bd6f102bad1070cf", - "97d502ae9cb0e8a70b1dff1c0395107728ab243d4b58aa963d430f2a94ac7af6", - "4a3694f5dd8970d30fe635fc6e03444999ba25239d5b4b5102b8203da9c36f8b", - "e2c25da369db6559b8c527c799b724518c9ade42d86858be5e1e3ef2086d301c", - "2a2eb17b9a92a56c3e076772a11b42018beeea351dd0e9beaf5b2b9b69b846a2", - "b3ae31317e0a78582538124af9b401f90d3947461c48f2eda0ea8d86ffa1c26c", - "e428925ca33ec5ab28a8e6259bab7f06bb595493fbdd459f37b83180bf0c389f", - "77bec0426240c44181881b5b8aeed5dfdc81292929ed4a1eaab30fe2458ce99f", - "f3f189f5ea35bff018f9df0a7641ec176820e3b49f100467595eb55ae7ce9c74", - "41ccffb1f00168a0af6eee6a5acc34290337ee365cc09af335c95311bbe11fbe", - "404db74b6ab7729ee0567c72bb76b097bfb0c28fa3aa0db156db1eacdc76bd01", - "92ef6f4407c5985a47e9791117ede19d7c45cb1273a7b4230270b6e83233c1ea", - "e88c61fcc3a6befab18c2ef327fbb546f1e9a4e40edd6f53810375605c59fd44", - "0898d742ea5af2715c5552cd53244d79ddf5295f8983c82075a1ccb7041e53a7", - "6248e96084ac157e7417a8e0324ed52c033891b94ef91e1a28d39c900f032ecf", - "6fa5b71cd76177d4510dbc82b72f0143dfb757a9115086b891171b87095c3522", - "4fe7ccf02cdb708228213c767fa4fd0603b41cc3e32ab6e8f0507439cec20afc", - "359479698d1d386c607a6db24c56cd1f2ab321c9b5635f3735f07c3c3a4efbcc", - "d5618105d3aa250e3cc4364c23f3101607b9896061cee23fbb42e9a40a2c2a86", - "8adf0d15e86d3dab172e05bc3c6ffd5778cf8bfe1688f305e2e367b29e34c302", - "2621a6ad361bdd26d71966b1c632e35ed5c8bbbebfaa2c97d316585621d46967", - "b362fe90925467ed2564566d120d2492383709dd8eed0a41fd22c75f4706f91b", - "e8d17e15b14804640d3857b10ab0e638f4d57d678aeda4a46c87bc02925f2712", - "d5838880c82a5241fba7afeda0b346662e1baf319a97b17557351840b3e21cbd", - "13e04cdd40453eb43fbc36f6185d0d2168c4c454b81db15073d66df852e8c98a", - "74daa114ffaa6317120ca5043df5d57aa90e8c9c9a87cf8153b579679f0fc63c", - "f07d1332e2ee870c24efffe0e852e3e536c170ad65eedab88957a69065ecd809", - "319361a6b322664a48a7ceadc9fe9a77b55414517d3e55872062245be7a3b356", - "4f358faa4de6f75a13cdbc43a55e206ae5bdc3131824c0ed1fdc26a10aecfc59", - "6ba891c9535b579718180669eda8996716612bb33734a1ac334dfba89cb3d745", - "4b312ba6a0c48288f72c300fab9721af17d27be95beb73efb2843418c0103af3", - "7ae69cda49f76253db105ed095caec838030b8ec37f14f8c00a2ff1f9fa8e5a6", - "41e9068690b2ba9db4cd08af42ff6f8662357c277b5cdf8adfecfb3d4472ecba", - "02daa5fdb3c119f60300450af3fe0b2941900ff712a8bcf6f815ef6c532d3276", - "6a9cfbff8eb5113fc18920e8f4d82402459a17fa2019cda7b65cd37569a368a5", - "6651a49e88a61a4e947ab86fe121b9f8a2324487244344ce366832ea3a66368c", - "4bea3da622b5d00b2d900f70edc7cffd654dfe6af0c3e09005ae105d4b443e0f", - "6e48348ee7f7a6512fa877fec17620adc0ad6100d8c2dd256709bba78261c17a", - "54203c2148f212cd52a28ee061f46da94f1cc3a038b5e01a95a4f76a0938f35f", - "c77848f80f757b3ec6d9efbbb0879dc5bd9f4e2acb6e4153905f2c3096b2acf3", - "7c3dbb65e9411eac43760f34a5671146e19f9fdc0994b6ae1776faf1af9edfea", - "9c9e8299e1c1ac78ab185bff77a4dbc738fe976c3f8547952a613cb42a82dc8a", - "e1c9b5e3b6d014b5b3774dba90a822e47bb8d571378f946308b02a502775c922", - "03fd6bb12e2c9ce014d631664eff123df0c7ec306c886dd51a226b11a16d5881", - "01bd1a21b7afd1566061045f7508144978f8c09b4caf8ed3f28d92f85922f29f", - "ee5bfd0a8db0f5916bf4a614d999dbad5b9f20c20685df7f93a75c1ef7864643", - "f7eeb97c1610e2fb90840a5f96ba204c6cdeabf7901ca8881c584f054a317cbe", - "a5e5537003967ad3b663838a52920a7104f4cd9665c84b48acd4798ecc90820f", - "8dd8b64cbcde809b36a6097483f05cf596cae9f7c63de69ed2980194ee0f7b26", - "0e9bd37a93b0e29d2fb5dccb0c8c08af7f9cb694daaf76aabae8e22981249685", - "579be6b517695979766ceff3ee0dd2719182c263f6da1335a4322981940f89ea", - "67ebf58d76f091d13ed0a4d1d5d4ceda18a33437e8ce4243c47c015374e39d19", - "841a05c56cdc792b85e6eca7768feab4743e8c90a0be45ad63a6f41493cac5e2", - "314078f0810e5ebdfc0ebe4094d638cb3d4c336948c74c597f4715706e69164c", - "0f3111bfe2de9b179464fb22b4a842cf972fc396ac3d7831270b7c8e4dc9d213", - "d180135dcd3d0d7ce26a13fa6b566408932aad675ee094e03fdeca26a117c090", - "4749256da9bee850dd5466d17003d971d87d75c2eb471c7c3d58bcb641dc6287", - "c28d16d7b69e3c34fc789b5bf61e3c0c8740b784729267ff3e7d80c91e6057e9", - "e118d0d669013a905941d9c34977b700ca05ffd0b84070dec87f1d39e5728449", - "5ad31527d219e31c8b2b2ad0a0d850af7c481e12e5eaa05b2233e80fec10486c", - "7cecc08def8ae871e55b4932656510f59202bcbd38c5d80797d2efcf72791383", - "4f4b639a127a6057bad7a9598a4bc7dc187ac2934ca94ed77ae5239aec9b1de2", - "05567c5a9d90b7104f7f3743874177ca00c1ff6764b128d1e8d5f7e6e57f14b1", - "a8b98040066909428e1d710b7b61af8edca9c6a430f6055b178621a456337a47", - "ba7d50d96ef3fb5730a658a62da793dfc19e273a9e5d4f8efaee04f9ab44d74a", - "297fea42a0fc91f42b9e41dec6771ce05928af3dadce96d5d4adceedec0c0207", - "5ab29827bf47be87f8109f7ffe1941583e98e224fc89b70865eaa7278c58a616", - "40ee378e9142b975d66d7c2602a8017ea444694941c5cc260b31515d42459dd7", - "c9dedd4122ad41fd32780c4f107e27f115710b442e305d8b694b6b8e045b9dcc", - "748a0c7ab37d47dc6549947102f9e6bf9fab31622a7385df6266d5d537ac9d94", - "7542c392eced516031f8e440495f32cd0cd4386fe9ef0accb76e449504f3b007", - "79770773d51bed07133d70c2de42eb1aee4852a3bc75962ddbe4ff9a1f59ceec", - "beaeb887ca125046b28224e15982d51f235f90f6af3c17ac9b86cfbd7dd21572", - "f5e6a5fe2d32ed4c34b590bef4eabdc9942ca76429ca599294da68e3c6362be0", - "b31e129979ea6e113730e75481db0410ab5b2f6882bb1a41cd9b8953e26b9ef9", - "96bcecfe319af46fcf3050bee71aa7ea4862381d6b2245209b416e7bf0cb3e60", - "74069dd250396b37d1b18549600c186caf4f051622db0434999d4545c452c275", - "64d4a281b0be104ee9df9914121604aac176f4dd35edc095abb912a6608de00b", - "bb95e47602e1172cf9fd871b479e439924b5148a2d9339bd0cdee98d0f40b782", - "de37d3b12e461d7b2a6459d420a15af48e9b38ed3d74ab5f85d491ccbb44b98f", - "580a36ac2e00488f5fa1ffee700062684ec41d2d9705f0e15b12fa730205eace", - "8e428ba5ee7cf6727e28527241d0190ac7ee7bd57318f46c45eccdacee159995", - "2cafdd3c8c7acc10624721352f5dc67aa3f31ce8a7603694b294c5d8344e48ff", - "3a5203f5c9c516d8e4d0f4a61545952b94f126c7a8635f1741e6b28573540744", - "697c760433dfcc8cc54a65a6eca20c5f8c2939b4c81687e9b4ada9cd9447ad46", - "77c7ac80590a6054e15309fc06c0fd10341963d11fe9ee67837494ffb4aa90b5", - "db5b855abbd0cadd8e5d3dc750e81a03130cef8ff0b84d6b65ba9670e5c153b8", - "6d43bcdfce42569fff8c4651e6592c5345b2f4e970254e4bf22db999b1242cbb", - "593fb4b94ea0221af721f895a14e295735d0888de0354beee6cef3b81cb54886", - "9fd0f37291c2574095ae3f9404ab64a0b76f889ec5f42c42abc4db5cec8ebc3a", - "6b55c7b97610155fa614e70f6c45a684c9ff3742a7af9035662a2449dacb4c97", - "62390159ea4d1ecd06e7f50a3f46625e7c25f872169ed86b06f5605c5682d3dc", - "cf887f02cc176a3fc6cf4e2624141b2aca43c92eff98bad19ce762d1406423a7", - "f81ee02b25bbb7c5f19ac31974b303492c5264f4ee5b4f8d98c563b3954c23cf", - "949f09cfac3ed381a069fe03dc966bf4f8d5b2da587db72867f07744b2d19976", - "7a363260dd9805ec5c13e46ff3337d7431f5ee41a723c35360479a4f4ea0006c", - "d7bc59a274030796a2f7abf0799462ffa25e099c3732c77b936d1293ec96ce94", - "12e401985ef6810befaa8df77b58e325060f63bfe5a107c6fd11dcda6847d453", - "7e12aabf3a3ac3cb4de78fbfe212d9d7ce5b6278eb5cd8f0f644f4815fb64951", - "45325a74028d76352483c67fbe081ce5f276d09f4ea4fac1692b71a54efc0f54", - "2dd55e57343aeb689b54894e8bd6dda9572927a6ac65ede1d36889a36ec617bc", - "98f19fd62d6b279982efbb1e9aa2bdae8320d0054c2dc6816261b2a9241b4a6e", - "b0eba422579f40ba5f144cdeb81f510622490740b87e4b4fd7306596d6939930", - "d1baaa457d2d3895555a653e459e2549a95e967bc1595ff45a5111e8dab531aa", - "64dba1dbaa9cf0ce46f3ed295773678bf4e0209d11abe64162266f3470392f72", - "7d5f1f43d3ffb5164fcff8a020c5897f978807adfc8a6379738d90b48ddc3f5d", - "706205b9440c74a70ad6361217de7ec95832efbc0ae831693cc14f77f1466487", - "56060380b18d53cd61bbea3775f5bf438193d638821ed2cb157ae86cd849d615", - "7a70c91b2934db80d074149a4eeadb51140a872a8a17b386b299df11551d9243", - "3c0dffff28c1e925b6d2bc94bb705cb68d0a753fa80a7865fd6a48b4a3653617", - "d2c98ca81410d2b6a279c63ae9044edae8497745af1c53b544f9794a341eb52a", - "b7240b826a427c2136973bde14d0dc2f93ecfe4d5f127155dfbfe8fe46413060", - "8602114d68d3e87fd8322c3e458dd34b4c74f0badbb2fb18e394d15ce93207a2", - "af79df8fc14447d1e1199c973ad88bff4a1b69272b6867d0a8c8a11008648e0f", - "79a01beaee34e943f027e90b3b55fa546bb2db3528f31f511222a19909d94335", - "6a23d56f104a9b949f61adfd01446bc47ed5465f5efd05a6657a42442e2ec825", - "8b29679860299e4525dc44ea194b517548b380504b0bb7f76deedefaf8484b82", - "7bbc5a74cb10e9e96b86265ba742b11c087d1a07281b8f8c2ccdb7cea5daad3b", - "16abf486ba7e2c3e7ca6ea861d8423686113bfeac498e9fe39b6f4b6c12d1849", - "c5145d20dfab3d0dc2ae4496ddac1a0ebb41d8d0552549747c081b93a3939e92", - "bf11d4e48342f7e29073b5384f8f8542adf26487a73f5a89cdfa4ccb7bcd1705", - "fac6c39edcb029b48b14c2953243d6908b17069d96a56473943bd58f88db4341", - "496010cb43634d81cbbe60299703fd4aa66345b5518de5033a48102c02e26997", - "dc8de3671971566780faecd7da08edf1bd1c70b21c4ca2acb40d9e2f3fe7acfe", - "3161fcdaea313da26e36f7ece89264b3f6a8d8275f71ef8143873ebe072250c5", - "66a2e55885f52daa1be0e42eb613baec4048e8c692755d896429e2ba1d83d9b5", - "5e59fe3a1c0781732fca4284465d92b53a784d486b1e4058742457e3fdd7272d", - "8c12cf02ecf22d350a7e7f369ef2682172864e77e3f50a82705a2ef2435fffa2", - "33edfa98ae5f4e15eff934a04214fa837e0d999554b78d4160053f799741d19b", - "3bf6a1c3a2556782ad7774a53d7f4373fddfdca8ed80c8e7c1ad5b53f72b0352", - "431aaedd05dcd766651d4a065e24bf0ed1eb6899b4df2c7f3176c3300f99f3a7", - "35caccc92592f55c2627688c2a3ffd4290f7793214a060304f12bb2e45cde129", - "ff91b26513a21c521c45100e4bd7046aae0c0b46f96b255448d0b262bdfbb47c", - "75415646e42181046a9f6d2a081ae25f0069999b5c9399a1c6fc923816f079a8", - "efb0ec36a19a198daa57ad409107da5e86fd0eaf3fa9cfce35887ccd6474b205", - "21e2ebc83a9f8dd4961c781578e68cac7b17278d4dc7e080e3cd9a1d79c90a5e", - "ee4228a3afabf5329a726cc34bb72ae28cb31829ceee93126abdbe1d2098b5de", - "8e4ce1c1cac976a229b2b1849dbf2c826ff76468dafe12a80e3f1f3cf82aeee2", - "ab3deb0bc35efea789c9cb8fb9cdee93d954be40043af41f16c07c02c3e57080", - "15af4364ea33d620302ccfc2b4946412e19f560faee08ec9ede68a50a93fcb6c", - "c1028d35ea25f399ee58ba4aa950106cc9e4a296681f0cb736410780fd7f8207", - "0ea789409d74a12705636463aac2c479b5e69fe103b12faf903ce5c23a4390b9", - "17eab30fb7477570dca869a4571be900b57a7ccd3acd8a94ee76dfa0e528a35b", - "4a9114f66d1e2638fb0600125d11a0d874c495a40bec8731f6fccbf2e723c407", - "a800fb5455c0b9f4a26ba6b77be3af7f7f4fb5b0dd13052918492d87aee8441c", - "d2c2d24e6e4704fb46d01ed1fd00cf6de11672eef83f5f1bb3cd9aa1db570db4", - "b8d66d6db1748421dc3d5b510586d3cb8c4daa312ea247764eb6e99e58fb26c7", - "3fb4a97d1f92f730a460cbdd128ad260b70d3d75a3c6e891e36de235bd09d358", - "b05a50fc7d56e562b12e5f8b7e9407eb36cc9e6cb2587177954d3229cb725e88", - "bdcf5b7737a8a349e02a131e38e20c4ebdcf7750bde5e9440d702f23380ee07d", - "1c1cd412d927949e1310a1a24a2a21603000a22ff1b2518dabd55774560cdd58", - "08581c9115606c1d5c432126aee31fbd7853c01dc289ad8ffaae4af1e2052355", - "78e434d4363d9855e40bbe01d5d96c2b4c3d804e759458cd3633aaf39f86af7f", - "fb1e77f96c2eeb88bd49add7b01ea3542e799050738882efb678f4cfb52ce0b9", - "dab0bf61111187c43e75d968f4b5a33bc4cae6e9d39b60de7479791afca18cdd", - "a5035f63c0bf46c5f99fe20c14217a27e6317541e903f3a268e080fd98f0a630", - "7c87393b8661dcb0f0e0a2533b20a25aabda3359e58614ab20796b67679781ef", - "46c04a304e32fe80f68729b6abdd662d67b91651b4d48fca6effb2db421ea99a", - "7f76a8cd223a6ce5f2e5f800e6d4c75fd0c988b633bc98ce5eb9846bae90a296", - "9800c545b6a3e3b882114165d43880ee241c35bd90d068ff20fe339834509d0f", - "d3b3512cd003c601ebf54e61ef895be7f7856c951ac2d31f344c4368c24d81b7", - "c1174a9537656f63f115241a4167906b269257d6fe4a5cc3a58af79f33d339cf", - "0e9dc5e6cc29e563e82b7a8a14adda6fad94408e16a30bab84ef706582688345", - "f8f81afa0ddece56462421e81e89ea4d378e192a05c3c3ae8c4372b84284dc3c", - "dcf4374298f50357d846529b0c8fa5665a374a96c091d0de6997471d0c53b090", - "7d4c44657fbc432ed534602d5d3c28e35429681c3ff1ed2c418edbe78a8787b0", - "2ca0b133b3fc8c650b5ac5f8911b9bc5a725e3d1c7afe0eb4c7ca309aaeea94b", - "3c246fe057fc0251b4ecbb9fee7f72985559f73024a3a56423710016ad81744d", - "f1f5064cd701eaa4e38db1dba6f2af093c68506ccc40e3bc910653b162f4d1fc", - "72e5022c0e18363b56d3fe511f4a896cd8a87baaa3b8ca83f14d727a5b857433", - "0c6ed70b5a209aed3e4758fd95668cf9d31e44088c04756ec9c8269b9617fe74", - "37131a34a64cc6931bee2722aeb28bde6d7219f44ad93692436c835882fccc04", - "596a41414668429c5e944115dd07d1d315f0ea0915f7a87e71c1b0eee5227f04", - "1c37669b0157d8c2fa00f0356ee1dbf153447f8191a152f59f5de992bba2fdf7", - "0deca86e70234e217add0962f0e076fad90fa8ee756a9a6377bf1d0b135ea8de", - "84e7a830b81289f8666f53cdd7720b8aefa4929fd65b0e9c7900544531e91e89", - "888299ee37ee0d4f539c201a4f213fee6d966cbf36158b11e5d72297f646a34b", - "3934eddbc08b6a528833edb223392c059c165f784489d625f8afe2d6b89a03f3", - "70fcf7197d036de2f976cde4cd14fc01e95b5dcca448d1970fefbbdcc5cf045e", - "5fc7af98c16170871f77b342a12e66843f0c3e0a217ce95388d5cdd3af321338", - "b8c9cc5b25825da7a1541dc501ba6b02392ee5efe23d73ff32b523f109257bf1", - "7476c05c91636f4f1a73e3888ecc5e02df561b1d33d96055b0f960c04b43b8b1", - "9705abed42a9f0e5e3f32e82fee5a9608c4231d3593707d55f2e2d1c2c534ff5", - "077ca8091d082376ef47a514574322aecb5e39325b17b2aecfd877a49aa28cf7", - "7b28b7e4620b9ac1c8b77be5e97f116bd191a8eb81bdaa02baf001fcca34f6ca", - "37778c3102953a94579e6811c8ae88f80498ce0b59201e2c08d2b2df0c1a85da", - "927718635d223bdb00d66ae2063855501a4bac2af66b9c5953f9b13e51f79503", - "8d7c57ad2fdecb75fb2a0fd569cb87be25e68726411bfd4091e82de52ca21915", - "e8ebd657bf91669bf82f581d89b464a0b0da4ccd22d2c13a176db123afd03b85", - "b451cbca2b4f24e56b919acb90b50751c87f6ae61737e538b972f2d5eab31a01", - "08bbafd7b7228e4a0e6281ad3c3874e8a8ed6fca7f4f9b0fbf7277e7d243847f", - "ed464e041288328bcc597ecdacac84cc232d23c5b564943a07b15bdce767028a", - "96f4c120003667e884a83e47a50b0326ebdcea8953cd5eefd3efb076a39191c7", - "4e229fc8aae5c13f44ea3e8ac58aab0db4ee0b2380fcdb819837758690676c0e", - "64601178a92d174f77f7c76808094362d734c5f9fb9ed4b2555fb53e91d7a9e1", - "0fa46d3c0cbb69c49e746096c098617f0c5516786205dd7e2b1382071c396639", - "2ef72e9329055f462c2912f3109cbeb65482b1b5b03d6888c74b541c9298d1e0", - "004ad297f290e1b764aaa34c1402c30b1187f824130c1eaf10ac72aec0537647", - "8017aabf1b49c7a22729e300703a6e81a08878ede532568983cf8afd1961bb59", - "12c73ad544b2be47881b2a062a280675744e233d0f60ed09dcea7e6a811aa8da", - "3b0776d2457f9b26d78c2b48d1f44e17bc396a70bc7af8c49f9cb3aa7dbe5151", - "b6be662f5a9d745d9a3d86680935f3e7498bbdbd0c207c255e02e56e422ddaf1", - "af29bf5316e77690d783a386a19d6332990983cd9e297599f91d096c937bc539", - "612b939b548c5076087a1325afd2b193348512d8dc959d9ef3f60c9bb67f46e3", - "25da3dfa68ac690530d5c1d8338a4345879421d988d65b27b09dc3f1ebc9b376", - "b488df3fc81aa170f76b55c053554545bd44eab33a82764d7830269d443ae864", - "6dde74479b274f432e4b2f95ac3d1da7602c7c132a3acb508b3f2e9e5adc08c8", - "15c41ed7ad89d8f6b92f612c691cf2e682cbab6f4131776fe418d96d966ea0f0", - "ea8bc392b9dca3ed3c40346d3ecbfde0ed5c98be81cdd6f45cc0ae394f4f21f9", - "2d1a10d4c1ce0e0651482e80542bc581e8e8933b4cd2aeff8d5723892fc79fcc", - "cc03094801eef8f7c9cbd1a8c1c1411411a6589fe98dc231c1cafdb6edaef266", - "432a74cca8b0ee6faa97cb0cc220c0c34916bd2bca7e53e7fab014e8363e6ddd", - "291d8e2b1ad6882e3c32e92bd2ab3c12587869c23434857e5812c2857ee788a8", - "c26e64f41fefa83b96724d6e333dcfcfb3c2d573d05515e6ab5ffb9eb75f8c4c", - "933ae3f12a9ec916f25bc232ba6fdac838919e4dc62ee3ee8d71fb41318b9d9b", - "541754ae0292a17827c87a5410068bf48e48f9547a0ee02366a277447af7a145", - "123dae9153fc73f080082c975888e4e563ea8a69ee96efbe2569fdde116e543a", - "96683d716c892b22694ca7a249972961bce5585e74918cb90b0f3c5d70d83bc6", - "16553c50d9ecf7807f30ae52cd4f149aa7b7cf2eb499ef6e6ad22490862eb64f", - "8948792064c13993edb60b5adfc00442fbf1d00499bf0ceaa9137163c6d1d328", - "ed22d51b08521547a87eb93035251e671013a4a372f42d2415c4d4e781026bd1", - "66e1b5d07005b9526c208cac5a6d7adfc60cb0dec12abc751f07a2a5a89004ca", - "1f4f1634d022cbda390e65c17a2f51314089098f99a9d8df12e60a56c4d8377d", - "29f5ba0a1835eb0ae781ee0ad0cdbd04af820dca28745b12b06209c48d2ff744", - "af5d64d58c377aa937e9cac67c4661ff2e3014c8911a781bb702a5f795dfef4f", - "050cb558f66f257429ace713c86a5d7fa341d146259c4b50ad102a17bec8618e", - "34c0064425a4e5ecb358cd3b8fe8f0b5257d4278daceab66bd98c7af9ba93a40", - "9e60ff7fb2d8e552ad5ca6678ac117a2ddb593c8deffb073562c677adaee7165", - "f575586bd6d272e76ec062e6308aadbd278672e50eed94d30825312c644eb719", - "1a7c8cefe07ece20a0d458b10fda17fef68111cef7296c1c31d5b4e6eceea493", - "69c8e683ae64345697eec01f0ae2f430f24985ab9f3f45a4271838e0656740ce", - "b9ea3dc67e1dd9a5a209416737d4b8d47ae75b33236f1a128a0ee18606a1f784", - "971bf03ece33de60279f6a6ee6aaed937911c86f6fe1046ad14e7722d2a4122a", - "466a940d935bfc940c828e5cf37e81874d10d0d339f9f30bcdb5e46580f9bd95", - "66f9357ec5564f6b56271b71e7941c822058bffeaeffee28a597a07d39444b6a", - "eb20dd118ea1af4d7d838be9bf31a12fddd170b2dc9f4d1812ffb67766435be3", - "b8267c514829e1d6b84b950304c2ab008bd306d51084169e612f2dcd2b74a83b", - "29c988f981e63b6cba13688104f0fe04d7b6dc13c0da07c620e171a6118a955d", - "dea47cffbbbd4d30b2b9191775f9b14fec7272c80eacabb04a50e2ff25b05033", - "d5e4e28cf19a02bca73e98add5d5dfa17bd48919788e4652fef60287246fa7cd", - "5481f63e2a9626e8e915ae06297c2c136c471990ba061ca6e7aae4e2ec1ae0c1", - "971b90531041ffd0ccd0d683ce1032a903c5f70fa9641767b143f109f77a7134", - "624136247357c2c1370630104e4d12016bf67dd7c3a1a66ca39158a7335e4e63", - "c9b44520e95b6e9274dac7ad131a1f5e5daca3fd38a9982bb2af51e319d13156", - "459e40b368c6a1470ce44764753972af85f07622ef41bf4b6995b710bc195429", - "5d89f3474d0644ac48f2c771ed66d3dc63b4b5119cade3725c56cf2ef2a336e0", - "a748fbcf6b604ec8120d22113a9457bd24231535ec987b70a27a0e251ee80eff", - "be522aa9611a4b7e8482f628271f034bd700d1ed776a6e873b66a6b5d1fc96ed", - "712bc9482afd5ea4df0ddec422debb79da4cce2650a413a15408ac699785ffa0", - "32d0077bd31bed7c95efa09af9a053a4a4cf327c5e2286b226054d5ae8933ec6", - "b5a16623b57355d7f96e130a3d9ec5dc8f90ada24f651bfcf0741e76c113e714", - "4130fe828e352f17d1725735c5427e5a5747ffb5ec0be2fd6df6c7999b1e8773", - "dc50603062d45a3e3d1d4394fcddd3338b3019484e5962292c46a3facfef86cd", - "1b20ca83b8484636d4f4706b2f910a21ee4cf684a79abfd78982e2c07672bbad", - "f178797f0814773f97853d0d5c5003ab1f1e31005687aaf3debc2fcc81dc6d06", - "0de7b528123c263ae4f9c654fda140f4ae5b89308538cf855ade88f98878f979", - "c6da64b662ebc2601e91cbcd74cd48de055f140c33845460cd713720be30d7fe", - "504c56e21d44d7b1a120ff4e5f3055991c95fa866dda3db25902246f41684129", - "ab534ac1fa1b953d7f2e626aba55759c1eefbce1e3679b6ad30eb2c9c2f2ef69", - "155cd8e8a04cf74005d30df8296e210bfa1b1ffc52b447ba720a4d1abf4c9ab0", - "ce77f094e9d0949143eed2e15dbabb3fa7d4a4f3fc8fe3980f194a61676a51ea", - "e479d16790d031342e2f68ab52b32bdef0ab131d7888b8e328a8c5e58e8ee156", - "5ee5c78f5660da3e5634de145095ebee33097d99ed2e1ecc1813a12faf08a6ca", - "8f179684f047f9e1f167f5252e4f0082af9f8d56ea2fd48eaae383bf6e3d6f24", - "e835c5fd0970402bc06c251ff30ab7f953127c62206f6c1b4c1e06db885db238", - "abfc3f10789fc57fc8e919bad416d20923e2a8e0f24067d2e2d6fe58f208cf5e", - "2465a43938287fef84cdf6a9fe1105e30ac01892acdc23ca5e850de288913dd7", - "7b0979fa6e58a0d61047c48fb00875823384c3f8353c3eca61c900ea9fc284e8", - "64f4dd5afcec144adab562581eb957f2269e732015acd787aca9d6a4f29fe317", - "e7971d7ac18e81150cfeceae2859e7c2b06dcc77c70a3e11686af5452de48299", - "5b5c9072739088bf7d466d4b14018cc05cd057b28f51ed8296ba99808ed4ec8e", - "67e4fe56f7931d205f8aff76e7d90cf1ba4ea44948d57f79891bc437ffc26fee", - "09f7bafe16b329e8e1e72f98a2fa75ef1dad5304fc1984ef4e2d627f88a1d426", - "fa94c10b8de67e9f715eb88fafdc6aaff5fd4ee8b240e98b6168e7f58f4ac931", - "31b1d7f654e474db2e035f47f630b5cd043747e1de0d444d397b808805a6313c", - "0d73e523bd586698ffa813b29213ceb2796ca0b7f8fd39718425c9a163fe51da", - "cf1cc7aec1d574cebf4d8b269bdbac9ae4f26a260fe7dbd6c4d95acc40736df9", - "f0deb97c5bfb8ea68700fa2decc7679fd80c52a8f5fdbc951d78a06226cdbd28", - "b810d763bb667bc0e3c04d4a8ce9d4130d2f39aa03e07ab48bc5c02bd15c2df4", - "37bfbeb3bf119012b660bfc0ba94df48f7d19a4c499419206e94755b6b320a6f", - "9e23203f279b2ce6fbe1a28b59c1baa19cb595fce22eaed7742b285074b928f3", - "2fd491314cb2f6024839ea559dd8a5bdcde9a9c036b9caac484d4402178c2646", - "9992c5bb144dfdfb63f96f476a8de27e3e3bf574d8d291f3bbcb5d7cdebc165b", - "879e7199a62fe21d9e05ad69331ffdd9a74bedfbe375c6f8ce2bb77e23fb13f9", - "47d6feb71e2d3c426349bdbcdd2bbf1ece53a022a8f4941dd558bff0260d6c91", - "715c19a27611a4a5f823f82faf5699e586353bcc66502aa2aa36c4878f06eb62", - "a29b3b19c3e815d11f3ab8a1168fb4ea8a39ee3df2800450f82b118c1e2cd259", - "c90dc0fe28ff88c4aa318bf2bc015df4638fe69b1b47b26b2adfddac3e06f781", - "2d7a0789a6ab8be2639425af611422468f8b870cf70ae3ba7687b2d7015322fd", - "3c6a50b072e8510faa42a66e86ab3d654c2b7cb482e635d41ad570acd8e81ddf", - "616b66b0dd66579a2dca596b326869669d88e39b3b10ad92a32cc04303c09542", - "419a39b808ecf27d69b0c6915ca988b769c823704561852d863029ccfca3a914", - "b76e2712dd7ca24ff70b49294630eb6a1c9563e46a00cd1426737699aa90ec69", - "ab2f0dd993c499cae99a45cc8cfb0e02101827d30e22738237cbc1db4e912cc7", - "4bc94e220829658181882a5f33a036633dca1fd37575171a1c2a7eb251cc08f9", - "7150dd51e6d1b4410704074565dca67369978d088c6a5e46c1ef98ed5057ba63", - "e8c5d93827f81e5768880a41801a0cc4ebb3d2e08d52781fac04080b09b17a57", - "b89e01e6b374375fe825979d20d0e283920f7924b24978dc10732d4096c0bc88", - "4b2416c3939c34fae69a9f2f0b553a734e1f6baca59b3a628c7238327e6187ad", - "f094a96c0b4c47eb2b7f7ef999a9cf382a3106edb09c2af90d09e0311b175218", - "1194b75fb142ed1ba45251d78a9a5f2ef12ff616c1496b9a282551703cb82035", - "7514915e685edc9aae7d5aa0322697ceccebbf1a6569bf2c2f915e968079b0ae", - "42771d37e8b1c2c74e1484b2dd292528c794595bd3cb85601216b4fa6c44b26d", - "df1de1193ec0d6a02ce1bb5a03d73d2be661c77f20da7e1ce6374ef9abc9dd89", - "672f9c9c3287f779372da10ffcddda958ed2e16f2c0c113518ebc04b2e446518", - "80d48df5fa5e269275ce1813b64a7768001f7b034b03002510d89e3dc29c0ed3", - "24471e34113786cd888ed8fb535d4963c008eb09d2f180ec8f464d98bab8a850", - "08931ea293ccf69618fe3eb1ad5f44a11a131080ea6d6edabf1a353360c6b49e", - "65d2cb648e010911436efd080a06edfed7abb6de3e373959ac3d9d9212913a68", - "1f913a418087258baa103e605c2e2cce04f2a22783c5f6d41e606eab29132da1", - "c81daaabbe3a68cf03cfbef516b7924d2279b28245e9d53d460cb9bada6b9bdd", - "bf6f22214fe38daa2382c0ed95d4d173611287cd1d25132004215a9e91097c79", - "f420c6a3c97082bcce54f02ab63d46759b831ced07c448e22277e1b67e060cd4", - "0113080b7353a45d0d34407b5ceec24cc70a8ccebacdf2a1c464a3ec7f71e27d", - "1616a12aa3fad976f58a0f90be3ec8510a5aafcf3424c2f20d5dc17192381dcf", - "97cc02d372bc3e7ae8b881bfe145519dd9216476a8b71b7fe56168b937025985", - "403f500c58c473f30a2014719c224a08086638b6dbc91f89e6e3225a5eba2ed7", - "e991d88edd886d69e553abbd97e46efcb3a3592d4fa6fe298751ac87d585ef26", - "b35704b79cff3827fc8c2be22199b0c06e83bb33fe88915cf41a8cf22ae8b28f", - "e35aaebab4a24da4e087f647b10f5bd37864e46ee660ca3ad43fd3c8517714fc", - "e1f795afa5f7cdad1189014859fe879a754db986fceb71360457ca8dcab8fda0", - "5080d955f0403d23218035c53d327e3d8e8ebc12db9484808869c487e1b2aed1", - "f4e0f83b0bcf28a9fe88caaaa2c958a3b0aa019d3a21e38045ce25be84c0a001", - "da291011d39d038379a6e4dd898be8954bd8540f3403f45bd823c962bf22618a", - "ec84995f9f9652238a3994632cb102e3fd892be65fa99399956eae706d86a80f", - "662bd0488b828ec06509b7b5d2ce738e30a6756a8542b880e6bb18991ad4d98d", - "e25e6a54b6a44086b28607911934f1ba8c270f752729d16dcd641b74ca719a63", - "5e545ab1be71753913fa6159d0455bbb30fe61397f8c8afc6a9da3b43a217544", - "16546a41147da16f849feadf9f2c47309d95cdc003209cc761bc2e6df5fedcc5", - "b6580c4bc421c7113abb6543d19cede1cdc42b821bf19933093dc902c69243ef", - "14a107b49be03aa6bb1446007ae59bf650f9ce94093af63df979525c74636d3d", - "e23385ccaba8949d3348a8a3969d63b936cb233f7806abeaf4b615d0e43acdd3", - "f96fe7db9163b60362d1a90753d468c18442d50ffbde2667a684f2c455850950", - "c74fe2468d922eafca5d82aabc02a8aaf80680820bb74991f0623a8bb5258bf8", - "25cdd2841db81126e81f2f2a91483b24139232a9a6daebd81c88f92cefd3e8a3", - "4239acde9514fb96bd231278671c98d801036320d235ab006abbb2137a35f1d3", - "70a047cff98df9f625434938bbac32adaf37b994b0edda81db66a41aa3779a05", - "2d44de83f33ad8fcaaec1db832be17edf566e6355395af0c2b9ad77b4d13aea2", - "ce31cc7cc96ab60e35b3c6fa3c19e9cd47d9194ca3224d30ebd57161135eaeff", - "a1879020ce90695bf99db9682cbc2894f7c55ce2c79177f67a2f8cd0a8b63f74", - "899805d1c06e328784a79d422b42cbfa69d5192180470b25d83b3be2a1d156ef", - "6ca450b98e08063b754fc7478885862ba4e749b0001bc0e0a825e5722509efa7", - "ca81dfd829046da33334b1726cf9238fc4345dc213d3beb0a3140b1bdcfbdfa7", - "9449a42f734680747c330e017a0806f3a221c818b770b9434edb359c5b44c08f", - "15c59f34dc4f794a22450bb1b4416fd61b9f8a62d60a9c90f204311d30edc7e8", - "04ad21ad76d68093914b4fae708332725d5a6794e8cbb89e37a279fea52a7b77", - "9fc9afef4880db9ad797db96a2680ba81ba213ca139a621d2bfed74241f2f2b6", - "12cf9888cfe817c92bc497fc8677e4b56aee9d2db8c220800791b433946095f7", - "0dea3879101bb9496e6c5033b8566273a28c4a248868a62fbb60f0bf4fc74c51", - "53070c76225097529ee8c05b2276e69b38bcab9eb07cc27914b17d74af9de056", - "ec96d86d256f9e9826b47220bf82cc26c43442ec32e30a7b9287f6bc12b4af84", - "df316c55dfa206418d92ea4d5ba9f33745a7e49194ac7b1dc61660150defd752", - "e1681595b94e02db42ef560272121e15441cb6d7995650c37553bc2bd4802b3c", - "d4b8901ba66f95c8c39b9c49a317cfbd1cfedaba478566ff7dd378b63e04abd3", - "de7569db1a069be0427cdba97444fda19314c04644dd7836a77f1a441db46e8e", - "ede41cd3f49f086d313bfbf3c65eb1737e7ce3bd908aa0311476078185235011", - "cef507c1ff279a47e17f90d9d66551277407f1bed8932e9a9c46e8a83b8f6c4a", - "a19eb250d0ccba1650f30d1ba1603f9268ea394f274b1df55932158920dc8af6", - "2e37c6ba30419e2125a25af0cf59657c6b9de92d44432131ce274de7131896b0", - "5af943ff8ace0e595f9294853d816ed58f854ec15be55b9dc8a847371999b3b8", - "373078651c218f179dc07aa90f4804a17aeb5e3b00e0815b1282572931ec327b", - "8ce6cbe7e675ccf13544290128cf704f79d31b2bd8931b55d3d766a23f6aa1f1", - "457875bee47b4d5e1a8a2fee177c5911eea8670d1ef7f51f7f0c5a2adb17f7cb", - "f4eed0a35d8203874ef5c16803b879467e2cdaf6b59a981d41232bb6c50b108a", - "db2638a8dbba27134bf7c07b6bf7405080fa93b591523b4e897f3982166bff9e", - "982ef658f152ef89cf6773ff74c250a345d04bb57e045059b87a3f298001fa61", - "d085385d6d3be5d22672b547e27f652602d552f5c6d7e6cd4dba8cb132951862", - "2b66f9d3ec0a9d7eef25787abf04b2e66e4a9571cd4ca63c1550eb1eff1b5960", - "992eee37c973aa95f46351fd56c6de3167c82fc94bddc3a87ced01ea489c70e1", - "1a9871adb20c8a407ea99f75659a87b13fa662e4b3db618b90646c6a4c6d9fe8", - "bcac58e75a509cc9bfa4976d6595e49c72cda942bad891a07b9787306807ce09", - "c6e4827eb24ef9fb5f221c31e75ef1cc52cda29ecff2e1df6a2503611758e18a", - "850c85cadcc03ed0b892983d301723ac6de465bcf3a800286b43f5a1c9744279", - "f88348a4f2117a972a3845f731ebd92d2a6b55ebb20fe375c303cd5583d14153", - "3188f6312517aad5eed3efa421f27ddd2fc1d2fc75817956f16ecb890b40f897", - "796dd5518eaa5285a58aee69e4e0235811bba69ed675ce4313ad0d36d6aa4897", - "166fd90a974bb430fdec1333ece54e138d785414a4fdea959918ec4f8c7c490d", - "21e957775f1af584eab2a49a78405a9b7fb3ed6f5d0c9f1163549092213512a1", - "c630499bf331c7c6d399c7550a9fa0d72514bd78293d6cba8ee20315ed553f0c", - "823eee4ed3031c3323e61f25524329dfa8412f86190acbc4cbcc9d6de0b30e95", - "5e6677d35fc9a21b0067cb82bf9c621632c7985e390ac3b7db7e974880da2bf4", - "e1f31155b895320c63157226d116162d908a2117921dbd3ea5c699102911083b", - "c67c78b92f50afaf3c48f2e6491f7583feaf7caedbdd0ac4dc796c2ed277b08a", - "6b11fcc033c0d06416bd98881c1f2ecba8be43a8a949b07e98bfc389aa99a3b3", - "255ac18d26072889a870fe62e54eb9845fde4eaadb7651d9e16c1ade9aaee161", - "d6541dfac3862337381d467c490073f5dd9ed6dd0ba37bcbbe308f845c89eb31", - "2543f85e848b196f6c4c3d8c12fe6b78ee4f0eb51674fa248cdd123f40e467d6", - "496e549bcc0266479b565819fa2c4cf510866966f43d568050e4de4cd157fc09", - "3f7e94f830f1eb97e0bb6604c3b700652cdc54c75768ddbf0eb40ecf4885dbe8", - "7213b48e174ffc5c7ae13d3dfbe97288a09f19512d9853d3dd7bf43c8566e9c4", - "9e980c74c99e4b8b39b927984bbbbc6d2312c3d9ee06ca4e4db7c52b55ad5061", - "a2ff79cf6cc4d9b8bcc280608679036bbf8546746d89fe03ae4a9d976560a2cc", - "2834018d5c78a5a0597df80cdb45b622f39ce036596092c22341e8ae7a479c06", - "6fb6396183f93bbebb0b69404a609849c079ebea57302ccdf6c796fedb0c1491", - "8e6582cf95dd10ab14bf805fb716d65ebb577b286717bf9a4aaba4dcfe55b7f8", - "76176512539af6cf5faef59e9f585e2baa34d9990994c45856ce7bda898a8498", - "49fdfd9121e76c483ce86f300c6af9a0c29d07a806718d53f46c2a278d1e7f68", - "4635dde67599297ea08e4d979c27b891b91bbf4c59d798787f633920b84233b7", - "3733f0df543fe50df12ef306d82d9286397df495feee493ea7bab02a57400053", - "672eac28c53632e1bcab7fa06d5ef1b6d3cee4da61929ac6068df5a186b05905", - "6c0a921dfc5c4e106a71807d500c6f55eb69914daa5b8385a9bbea613b60a15c", - "cdb4c8ea9b683859fcd1139cde73200f6873c5ad164b21458bfd5eb3eb6b52e5", - "e03a64cffe9e2c5a8e0d9cfeb0e03f161be4e15d956d4a889d8a101044dcb24b", - "3aaedd6c3980027fd027113ef084f642d2cad968516cebb46cc2f0df50057a44", - "dd4efa35ec7fbccd2662f1dd4abf6bd50e6af536843351fb3c4a23859145a98c", - "7387ead41981fff0387465c69b1403292e14af41dccee15031d0f775d341e32d", - "5de9cc8af71439879c6e1b5f90c6f69f83c7f0775ec53f1e8b890585ca42b906", - "e3cf74a3d4c831c9d8b012a4109af360feced1e2d9a526c61ef31dd4b4baebde", - "907912523b08f07709287c7a95173e3ccde30b82c6f87b007cfabb052770bed7", - "e7a46cb34db97d9908980debb8c296bc768fa23456fc341805da6448bab527f2", - "da6af996c3120d0872432723307b8afe546f593e0ec3f479a05e08754e17ad93", - "323886bb26cfcca11da642aaa33c4a5286ebd8f94e49308ca56a533586543156", - "f671977d753aaae8333c69d22b1b002dfe2828db2dcd3cc50c7a68e99da3e548", - "6ef64cdcbea630820f06cd59076ca2d49fd20df1d4a3fa0a711d644b55bddabd", - "503af179214de05ddd7aff4dbd9ce64e640a4367edddcb42926dcc5e81214041", - "2ec4676a2bf099a6d4fdf9f4b47ce08b811907350a8c1f75ef7412e2d96a2637", - "53f281999bda6d9b4129e0be23ff99ba65be2dfee1e449087795628646642d8d", - "670227c242eb8fdc65030169b0b2850f139d537754021e6c62d409131288a477", - "cbd3d410e4f6ee297f47051ab076aaf16839adce6d8dd95fbd3f39452a178275", - "96c38844689968ecac3e4dd5982657a6ed04247d7e121d2525fd2c6f6950ec99", - "8b04097dc6b8240113f61899464e55a4eea3fab024f6b1da0a5d96881725665c", - "9f910ab44375d2a3e8261168f16eaccbe842162323f56989e84c67b66d607a04", - "248a7a297359c877f7cfac7ff296d6a2ff97b3a0c667e3e2439afb767b213c2f", - "d8d6825e5f10d61c1f78cf74609e8c20987f90fdec022f2716d6c473f1080c6c", - "c941f26bb98194a7c874220e15ec158d50f230a34a7671a394fb72a299922159", - "67b0259981578c4009c5fe32914ab3333fca16931b043540f323fa6d46e4e6bc", - "9920fdb0336896bff5ace93d8a0d54b9a1a965367396eb9a7f1470537f49ab38", - "37e7c4ca1a2fba69deb1fc91b5e0e0442eba649d4ec85b514ffe09f5671765fa", - "e355eb0b5fbd292c12fd707e0c163a1317c2242a18dae53d08ca06058039df6a", - "81a54beff912c6d2aa41960860a003bb34bf5dadaf47a6f0c419315fd9a038bc", - "bfca7bb23d64c06f3e41cdf6e1888cc5d40ef5d0bd925ab4a617bace15fe0afe", - "98b12e6fe77fb606e62ebcb47b0df7a73540f09fc30a6100d2c1e2c8d9202d1c", - "f60c5c2efbeb888999f7a61f112864d26c201f039fc0bf35a9cb4ac3a11a611f", - "0cf597c745029cdb5e224e12a7aaa7f0d493cb1669f0ea3474b4e45bffb0afaf", - "34a818d3b62ba7c14dc83c507499fdd0e8c9bff0561c47402ddf4d92d0bbf45a", - "e67351147dd38ddfc2e0ef81f7a7ed1d5f16a5b92831b56cfd8f52dee8cb2048", - "4a7ae52f78e990c851b7471173a6f95219d34d2852e18261b5fb545c36867afe", - "ffb7f0303fc865e4e23c378f0f572ee847ad7d1a28325b254f6c56ce4f8b0aab", - "94ae1546f6b588297aac3a1d3375806579140780e9d61847ad2168b652b0628e", - "65a784e56b418b0a20f8f9048c44715c43c1259ba84fec007853f62782ea6032", - "07206d569e821d8ca3042a8e24b0208bfa441f7e4ee352036ea1c40dde506ca2", - "a367a888bc53baf2fd98e58a71830f7a6826ef780dca22fd97a51a316622320b", - "677857d28ae0195e290bcab47ff08e3547fd399a1bdf8ea456d1e6fba64174bf", - "a1be85653d23cdd8750cac4493ead853aad93efeef7369e64fbd5e9cbca1a14b", - "5ef42b632e9195ce813b0f400657774ed2fd48a048b13d02e1564e92a982db7d", - "1cd5a76088f5934160c666a10c2e18dd4d2453060867a94872c99eee37933349", - "c9bd8dc9db0866abda11692c8cfcdbcf2255f719711da776bf00a43829f58f5b", - "d019601fcfefb9e38ab2c44836743f22245a8b2520982109492f20f9ff2a0e9a", - "5b65ada82eca21c3232ff25f80584d579872aa330d6554f424f4d2038bfab984", - "582fe8cfb1ebebf2675c593d6fc3340ffd218a843983f884c51a986e28967b09", - "a8ca6c7be476a758fedd5e8a468c3e6a43757811f1c5c9b871992ea809191e41", - "d44194ea639b042e075cf4a686e2a7484d1a101f77086d47a07b376d054ee1cd", - "77d73d93cbd33293d9647bcbb64187208699273c46b10d4a25c8ebf01fad084c", - "fa4b1e78031bf00cb8008e1d4cac8d69714d1791e915ac47c330dc4494707a08", - "4215eda5e19e94dd36c51c7a8b33a1dfb475356bac354ed1333e8916af06cfd4", - "af3553bb4503464112409acd98d727aaedd253d6ee4ae1d6f6bbdb248a7d4d12", - "eb5c6a20e0d0f895edf517f3ecb3237319e4aa5e0dea8c1e23fe66425f417e65", - "2f504255956a047cecbc515aef951ab54f50eea72745d3e04fb8a14df1b7d5ca", - "ef8b8d3882e1d22834f3e9cbfbec344a6e6439b9711cbfd2a2c8c99dfff17c67", - "fcae25283b9674621b37006272c4b00318f111c030ebbbc3c3a6ca66886d339c", - "381c2c7d963fc8ed0e91f76eb960f919b927f1202b67a92a27196ee66710fcad", - "4c08605187b36a33a6768db56a08ee5c486a9d96f05a88823e55ade29cf64bde", - "9a5a44c6948f2f45d71a356205e92699989719c6df2dbbe1f4e54c48d6a43198", - "29bc78a10f2df14c424b3063697368bd9945d673fd316895bc6e9c85a0650638", - "2eb56adc4efd8c3f6fc5e6711059019b04b3a18ed897106893d06ee671554b7b", - "a7b0f6394a6dbaae78cace7321b73140f20de42095ed240d7dedacd21a9669c7", - "28fd662c5d3a4ea6719fa80abfd6ddd72bb385a1994496f2edecada8dea85659", - "76d66b8a68f5eda5f856440d48e0ee537c878eeb2bdb688e86293a797c9d1408", - "2030b92ac09c3fc215e432e93ac9e5d9b3ff96389f0309dd2758c6bb0d00c220", - "23deee3f476f65fe150179ce0d0036f34ec52a11fa50ae7ec9e9bda491ec6674", - "b1d770b37f3669acb560aa224dfcc8d08f2c1eb04a4dce7c8afb19f0eaa47f39", - "0dfa93eb65033941c679452513f8cecf73356b9586c86b2aebe7d797dbb63d25", - "b0706d6de3abde7422e4566193b9fa9bb3acd0711b4848c52e18ea7f1bf27d95", - "22a30137562bb8e37a04f55d3a283941f2f3865a752d0d7ef8e81e9a949bb8ac", - "002345dc36e0359d069f1aec7f7ae235e8aecc5c6bf3dc1da95bf1a8c2524672", - "d2da09a6b0bf92321845d1ec2234c68e596b3342dfad3d3aa2daa6ca3ccaff0c", - "6340423b690493c5042496aa7829e100c58c2a67a1145256ce4880e9073e0d5e", - "15fb907294284676e9ffd78b2bd415ffdf4b03408b843cdc26d36bd8683d6613", - "2735b03c0e3bf96cda935d6ac8f2912e90274e561a0995ba9b2aa7322aa33d3b", - "819669520944ad1ca64665308e38331088bf36ad5c8baf22713b25b442a1f276", - "77587a371771c88002e6d305ea967e35688a5fb4efe7b8b3d69a309da7232ef1", - "baee39ddbd4b15fdef2a9f522fe3ea980d30c031bbe01555ddf83e73e8b4e96e", - "d257f1f9bb1505502763278e5b103c19c4a126336697387658e100477cd2aa04", - "49ae9822ebcd0e2c6b0d1be7dfcbc1993f90a802b533f35d1663acec678f684e", - "fd1066a39f26f01019cab0d7e634b1685f91a1835a22ac123a323a76908ffb27", - "27bb41595e16b6ea55ccb3c5825edcb801d370fa85357fe6425bb4aefacd63cb", - "e6e04e9b1804fea87d98ea0ef0d5534f4d630883d2fe6b4db4cdc5a48bab4ba5", - "e5eab8dbe45da55b1d31807e3ae1a75d1dd9e552eb64a0505059621774865e0c", - "d1ed49fecba1a8aeb5939f66438b95d515069cd2fddd73bb9c84fd8c0e3d5654", - "71b08940be633b3711763da95dbb7ac35e843be2fc2411022c0a8b746668702d", - "ed9ca2c5b433fab9afb0e189a5051c2c7c750b8bf40f8f6f252492a8942b94f9", - "7f0f34bfc2225ee4746dbb7933a04772e99ad7bab5d8adf0b11766cd8be602cb", - "3c2d3f7fec9e0e935f72f1c54343975a6fdee9aa34a7c375150c35f853ead281", - "74b631a064551a375877765a670db7fa96ea30756ce47affa23017e2f1298fff", - "d0b7a2409a5c88883ba50eb6dd25227df11b8950b859c86405431d6ea091b69b", - "7676c96c7b644156bed0c2a1a885490b0d869d8a65a1859fdcb4a9c37f8e175e", - "18658505a364b2a17890351bf8b2cf2a10d9e513de7ab25336e8ded0ce69aef5", - "d34c8f27e52181ca7d81987447c612d85b9f9b04941c9115e89195621d16949a", - "d4131fa0fa56701eedfaabad6cd203b504e5da1bec2203398c0503f3206c8276", - "4ff2a9a6490bac9abf924b4f109fd8f8d00ce21892d770ef64c303b7059007aa", - "8eeb2b8990a311cdf2f40b02f5a4072b602b4c177381eee0d3b6870858180597", - "4b2eb413f3e2b695a35d673555a45b681c0dc5790e352f1a438347e54f34aa05", - "43ce01de644f517dcaf93cb636e953a0f0fb11bd067352df77e651882d9def83", - "f940f9daef12405a936bf4a19666365fe00ccff1ba355f2f3e8bf3bd0b6e9d2c", - "f0ed4a8142fdec22d02244cd80f2be5ddc138e212c69da0b864fefff869911cc", - "e78f46cc254b56ffbe02a0c75268782b8d9608ebe2826bebc277a5357689abe6", - "2c29198007bdb6824af2a1400d652d22854811e09091baf6e76db3ac4170188d", - "76a039b56f58d3aa44573efd5de0326dad2927047eba945cbf077ca450e0b15a", - "401705edee1f0ee4e93bdfa2e2cca018145e9193e26bead705cb89b0df045917", - "2b5ea6266c350db33cee1750e333949e64cdc33d85799d65f4c50f089e754e33", - "c240080b1dbaf993a8993d1a529812449f940df9d07500107ec9a2bd97696f1e", - "dcf789ed780d9d97795deb3030eda30b7648f1a651e5ae028a04dbd6ba8be2f8", - "c17543d93dd6a2d2e9ee69b198dff49a91f062144b6450345ec62eee18be5aef", - "165acdd2e51df9d8693966aea70cbba76cdc801574990c98d56cc59a2c12df77", - "965764311cbf86d630dbc5bf4556b98fc1acfbc132475d5376c099b8940c75c3", - "df960ddfbbcb4806b77b8617a51d1b86f9730e7230aae712c8d58d1bdce8e4d6", - "8cc5548ee433a060ab04652e375ad80b98ec41e01ff4cb3354062162ddf42013", - "dfb0782fe5b9105df884165c2ff0439470afcd5cda6bfb72820c9c0d4fc71cab", - "6702d3adb834e063df061d85f291592952323e62d86500141d5b99ef6cc7641e", - "bc160510b133e68a2f6dc3615417179376cf0376be495d08af9ab40e21d2f653", - "f3efb4b620ce96b87e5d27ebd13d87b3362ebeacaea6bacd711f9905071069c3", - "9fe965e91ea3d1c205a7c4f741ab78e9af4ba15604de24903676808bbb95b936", - "b2da51974e68a614c973c91064035fb51cae64d961dac2f7c71cd25476ba5571", - "8550b84543209b4a0ccef9e3dc20700b90878c75203bb83de8a21bd10fbf1a1f", - "46fe05dd09ba883c31c0106748af6eef3fe19baf87bbb8fa9ace4d8c0a904b65", - "62ede195ce413dc5ccba736d0d9619b67d23b4e899f9e35ddc54d21013a53489", - "ac0ddc5dfa31e8abdabdf38945e9592149851b9a35530535b742f48fa3e70507", - "bb821b7f9f6cd3d27a6df6adb1c51ba869a226ac7e85e0d9d2fd4a97c213a002", - "d4b7fbef9b4be55a8feca30938b5de335eddca5c376da6ab9afe83127fd8356d", - "8dae59b0146ee843f4ccdefe90b2eabaf809a3067607d88d938ff167e45b8779", - "d14f64bed449933c2dee751f3334431999f44c80d13c475ac8b5a5356996b47a", - "12fa63c2c63cfeaa0fc7b8342d468532786f7b1e410803669566a10f4ea5b382", - "88aa0096db432ca835b2a35328ddd9bebd748b1083e6ecb89ca7fd892e1619dc", - "dc525bc6496614fb58f303d7a46cb44f94bed75f61ec50ad4b81bdb657f295b8", - "e89281f13f599bed7cc5565924c8c88df1ada241139ddce1e35e50dfcab3b2f4", - "f87c94890493e5eec323ca688088a0992d6b3fa37e00e1a670db7eb27c382dc9", - "adabf4b7983e3d70c52b170a260b2576049e65a04fe6f01274788d1bd0b004ec", - "7d63765e1aca9da9fb3a1a3e7110be3c675b06c774c6fb84c1a8a7d24048d72c", - "6c0be6ad6ae5f49ea8648a2c0ce2473ff0304e22cd908b565aad878a2743d7fe", - "1c55dbbc2b013fb55454464281582482c1e37f80326908f23f766674a2c50f99", - "d2d5756a7512bf20de133f13908b7d7b84eadc70abfc0354bde6180267a401d3", - "bc7a9ff86683446ed2d0fe41905537decb496e8428d786472442acefb0ee4e88", - "f23fb16fa126ff24cc56bdb1da3dd5fae16f412ccc36f9f0ea600a5606868ed3", - "1a8e96b4a06c79dc14554fe6ec65c3fa1290db607c02a3b51324637879f5aa49", - "7e7e5ffbe2c8b86f808e439b5b237f51eea41f503ae6809cdccab289f3690fbe", - "213c75f45de3553252fe88fcddabee7a072baefd00c89159b2469d46f260a924", - "733ed0e102a8c3b9fb92f0f4456ed293e7eada054911b79dcffa9e2d6a2052a0", - "685553ab52a483d7b2cb7d5b24f83d2eb1ddcfc6fedc1064f90074b06407346a", - "54c26e721ddf00d09e4db11c4cd09febdc2acd193ef3afd9975a363b757d665f", - "a5d8b50775517b3f22032929fd865084c1f4b9daf852c8f1359ef8400e28e346", - "713f4b1eaeec7fe7116a77b7d0d978345e6b8b10d8faa83d85d776649a51472d", - "6b342c34bf2df3e9fe1c7b600c45e9ac93f139997260df5c9e349907a76ce6df", - "185da57bff92bbc3fb31abd6032ad121dbc9329f1e47c3267dfe6ea0a5b1f8a5", - "c3e23bb3cfd9d709d47fd3edd0b24a1c869dd51d8ac1f2edfd9b7d28bd17711d", - "3fc9b6d646b05212d6f113cb434a57c75f50e28ce60a887f422f047d7ec94972", - "ed7fe0c0d7b83db533d784986a6b0568e3b2196ef884170e6bbc85d7ef364016", - "d92bba5f5d4a512f3da0e1ed19b5cbd3c771a76fd9420ecdc90c0b68ca414c96", - "8956f26cd43bda0b9f8f505e762298549ae4b2b9631f84cd164be3e26227fc51", - "b329b8b06e4a7b8d55caa94ec6e76ff9cc92fa920effa1273077ec48bfcf16b9", - "8052fa2cd529016de8b540ffec747e7b2131f0bfa5e220de7c257920c981438d", - "fe3dc14339101a2eb980dcd2279d7f7aa0cf189c347143c7f5db28794e6a229a", - "8cdc491c70ba1ff2a2c1e8430301d08b4542a66523fcb341c95242d80aa0b8a9", - "9711c03cd3353854b7b7e80aa3b212af270ad7ee819f2bda2970afa1945e1e42", - "adfad165983ad24fbda71ceb3123e98a91724f4979e0e18de8e718e18699cd0b", - "9c02f74980c354afc3aba191ce9ccb2b77b1acb05e9de835214876aa0db23654", - "0a2ad17868bba32ee2662c4939287e6fe1d32a67614e2bacd96c7b0bf506994e", - "e2b06d4315f2755b316c83175d98c79753e9e2dac1339004bec51a508ca38ef8", - "cf7a55f64923e56fca8c073955a12874c9ce16384447844e617564bb434c1184", - "9fb7e523c85d243d420ea08d9cc26e13833533c583499a70f93cb7a3da01c8a1", - "376057335cd7cd03deafbb47907084c95821535c16503c107fe4c58be9c1d7ce", - "5ae36d11d51731501eb852422d2f183daa6025ec829dc2fb623bedd7feddca8c", - "fbcf023749c2f3f375a187baafc96b6f4daba0831c0c847b48e5f390dc459f04", - "b4780ea49d4b4bb7b7ada548a5bbcb4a32e95a918b4feaee0f77146233ca6946", - "eb21a30461250ede636aaece4b7ccef5fc49e98e002bd7c27e38bea5b344ef37", - "cd3c6ab80d83a89d5243eb622a6637dfc0249580c2ecd62e8fe61583d2c26679", - "e60e71a22f2565ddd53f7d0c31c961f394a6401e3cebb88f107a1ecaba04111d", - "e71adf52b10238a400fa5c53f82256464dbd5490643edfa9fb5e550986ba0f93", - "29bedb661c7558357fc2b76c81ed6a6da6c21e9df32dba4022d7bdf543cfb2b9", - "15e07479eb6140a9bedf4044b4fb91b1a987bfbf93fa7406429af5b3efc4eab4", - "e19e783dd6872ae48f2e47ce327f7250804c1b0d67114fdc53c082d6c5fe3c4f", - "004f7c170f399ef0f10ef58a6eb9225c57d87970f2c91fbf5cf7dc58c8da915d", - "a57b0f7dd35058698499f99519dcb11a5851a0322542018a63df814878256eec", - "f13ecca4163a2af359b7f0748c6206415e24984973a9ee0f183879cba4b5966f", - "24edc155cf412fb45f7e4cefe99e9ae9aa86e06663145189ee2079fa7f082ebc", - "713cec0e65a16d2834b00a95e852fea6706587e7e0bb9af50d06ce4a777ae599", - "d6bf7ad818f1e2efdd52aada9123572d8599537dd2c1eb107f25de7311db3086", - "01982d24292156a5eb61047e50f160cff94ffd8c185c12a820a26870d8285e73", - "dffd85429665b4ba184b7b0c0da040783ee4c74ae0160fede446878d660ab069", - "4c6a0ca5c021ea2828721ac0e76d1391d42ccae6375cf627ac8a61cf9fcb451c", - "464a577ab50e4e983b0e20b5d2015bbcfbf2a3acda8cf31a5eb04317c8d52e21", - "dab8bc676e3d80814200a8b650c0fdb762ee56fa989f66e08c6aa0758efc6815", - "3b8c80d7ab3594da25904c1d869e86e98d7516b18c92f0c2322bfa9fda5fb500", - "fcd8573c4ed031a3c0cc31366d5c81a7a899a0dfccb6b9f53dd5e5718f271526", - "32819bb90deefd17d70f9e49f74125a42f4aa446c7e3ce62ba7054a9c7330cc4", - "a1274c00d4943ffd9931bb0229b7b8678217d4afd0c45ae34bb3d5ed89ef6ee1", - "806d807e0640749084935ca769ed7ffcab1fb51819221bb07336e220b47b05ab", - "34a0620ed3dbfbda3cd5d0e336fb8cce55d7dc364c9bc49d7325aff0d12fe3e4", - "6843a7b4a17e8d3397c8fd2327fecf228732c5b981b3170788b6daf20e45a2d0", - "a2ea1539d66dfafdffe19b36de7eb2ccd8c15022ae72e06da3deec414d853aa7", - "be925c149cf4363444c1a797b629c3c740e958cff991cbf8b2f44c97fdd82a56", - "55bdbdf8c8d2a3c148b800a2761acb8aef68025169bc1138ae718517b5cbed49", - "9acaed4f01fd3fecfc3fed37c97e57a3682c8c47144ffacd465634b08f61437a", - "225e76ae57f241ad5900c971c6a61df762cae5aa8e9d651ab71adc0835a1a31d", - "24f4143dc03318d3267a15a7e9f9b5b308eb33c37eb3f69ca5a6ef23a4f5f2de", - "c366c9672d5a65fe1378a7f99280497e1d64dae9b86cd3d12093321522d09620", - "fcc1d529ab4a6009f0ab660342bf698908965ac7ee79a4b59f0b8b5165a71400", - "c69bceb7f9ec5e6debd46db5e295bbaf20d66d8b40457678824a2ad034a06f09", - "7b7e620000a9a1e34ef656981d366619ba12cdcc302554592e7810ac0d995e2a", - "76e6de92e2f72c205931eddbe7c7af035d5fdcbb2e5f20848e3ce30404361c79", - "6de62b0e2987148e46b3334013ce3827ad96895b0067047fa1fc3b5d460e6991", - "0f53e6938df09501566edc5666a665d90ed48eba003982cc300d42b8d19de824", - "2edf727fabc42460d9a27431ff86ae54936761af931b7fc79b1be0ec302eeb9d", - "dc6de7d62d33bf3036e03c907154a1cb5b25d14409279c9090b5d116cda06fc2", - "5c99267353934f2cf162e32edf77f45fa4316c21a8aa9305cf09734ee7fe2b6d", - "4d30e9af94ef23c32baafdf7aef2b86ab6dd641d9bf31bd908b4cc1359a3608a", - "dc1ecdfba6d6ca33eb47377708dad70937a00e32530924ec643d82068a05bb3d", - "40e89c6a1c3c67ac5001421610c88402898e4c3f9b17ed8d8cab80c6d32b43b3", - "b04c58eeb089559a6de4d43bf699dbd1ba29bf56a24af2a65974d0302afb2ebb", - "d448b254a7f58b458b93a5998351dfef12729d35e5c47b01a9db21d9498695a1", - "a742f312461e8b97691bc4913aade8cf257a3b1442028e553ff96b5e10561e44", - "b0d8f2d8a499cd208c3ae63539a3ffe261c091c1921ca07db858b44c24ad54cd", - "fcd92ab28bc936d636d64f2611e9118c8c75e0c64ee83e90b874e084df7ab4fb", - "8e23640246a88558decaf0c5952f359c0548f1596d84028d5977d9ba41e98be2", - "64585e8db6ad179a08b87992f10f3c6f2535ea607100a924da6acb519230a523", - "ee12e0407cad7a088089a2c7b3909cd9e21f01a8e8dc8c1a2fd179f8509be53b", - "7b663405f937e05e3c7520b3975985bfb34b29eb475fb2f56477ef96f8985806", - "9f9d34f1c8c3732fecb7d61d761942d9ff85cae1375678e28d7bd74c2b391914", - "f3f7c20a2b6f07c813f206ac6b808f164bb6fe9fdbddbba337773b2ae362af35", - "020675318d99a453f351f9b9c39970e9069c457ba3b611629bcece12cb2c0e45", - "adeff54937f12a52a05b7120c3b663bd72545243bc11820436b343f4995dee56", - "240929050d6822517a6d027da675779454dcb8a5e7f4d66dc91a44a87d7dbcd0", - "30ebf25397782ccb47055fd88f173480d8c40a75b84d7d6be9d164d40ad2678b", - "e74be00be2aecd98b98e91a3339f9328f525ad37256b39273413850c390dd6f4", - "52296f3ad8053c2d2fa3fa46d47cbbc9310c5e983e41b6c210cfe0918ccec317", - "c23f593b890dc519d394ce4250245f9d1097ca24e0f2d5a61fadbc18a8e32123", - "d79ba4a84975840e3d33cbc57cd27df7ea3d089abf39928e17b90a42d40640f7", - "789d36838cd9da45af1c9883b02162aa299056acbef0b08acd643f316c7805d1", - "307d47b4f552aa35c03914aae482212be2c380e9228d23d82682947520951025", - "dfb012e8694883ae7f5797be76ef7a6ecdbaad4d1ada96aedf03124e2a9daf4f", - "48bb5df0bee5e396ee11b90354966b1ca98a1cf699b3d37e3103c706292d0f30", - "c0ca629f8072138319881c1d24f29b2776c128c7db67927a2d2b5d69b137520d", - "14ec478624c03b057ce64fe1b6c841417ea044ea692a530e9fbd9b2f67d49fba", - "45b725a3ff81bdf53680b62de13d4aa850a1ad611311ffab79c6b1d6f1ef50f0", - "9867f67fdf86b7f8f3d6dfe1c90b514057a23ad74e141398f6b38c86e9b80b96", - "9fd45d1836bef57af8a9b22a60504e20690b9168b256fb458ec65a996b93d0b1", - "e3e9efc09fb9414ad1696d1f276a98ecda4f31fcb090670c7346887d825e765e", - "9db87474196cd3978ec66c951ec6b7ddb071619562428e87ebde458a893abd58", - "7939f719b18b148bca76d796feeb6b3efb0aa8a61a7578aa98d7038098fb1ed3", - "adf07bedcb168b080567ced6a28a25789db319a040eaf1f96aac940c96928077", - "e061d245d29e380ddf1372ed4f832d48319c2cdcc6c158683e2775950434fc2a", - "067bf072af7bb8824522171a4f5432aa3b7831dcfee0a793cc743012a7072722", - "707888bb9004d748ebe995b2a71d4abfa9e1c451e186e4892699ec185326e2f2", - "734a5dc77a5ad8f07aaff223061097d6299c2a086bb620e71dcc0eb2b8874953", - "44f21b5a8a0018f63369b1a724ad7ada3a6515b4bb4b232e42604874b2c8cd20", - "21af17369f96c76b3a6b4ed7e964126260b2c5f4dbe9bcf2c6563ca54e2d8acf", - "19d64f68cffec744bf6a52aca4fb305063b16f8d1014a2e590249b9ea2ff7432", - "f63546e332a3f708416381a32e4767e0a57e9f2294b0f62a76513e77656a7060", - "03d0cfcee1a75c29c8570c123f671f943ac6bac76625362dc29eb5bb70e00e1d", - "014db0b041649559fface9ed4cde9f45ad91f06f490ddcfdb57c052d692638b9", - "0ea9afd7ecba357e02dd87d36bfa11c7f20d4d031107bfe19534b4c6f26fb0c3", - "50008d738c92d619399e2101a9b236c3fb01e0dd06fc7d33e5dd50f4071def95", - "11cb85bae572f2fb4555fb53406ad443f67bda4e0fc4c8c8c18d018280946556", - "491afdc4cf0ea86c39a3e54cb1e24332bd6204b06eb7269a192e0757ebdafc06", - "31d5803c23c151cbf73f011b1cdb2e1fec4eae383ddecc43f4fd9c870e5145a1", - "9caf126c0c7aa70658741e017bbc8099a99ae1663efdb960104ab9c726fd0b58", - "3d9d6ba6173ed03eb782de50212b95c90a8fef07927fb940270e5fe8dc622875", - "f6c9f5517dc6715dde20a264ddabab07ee76d1f48b479c599165dfb1d51bedb2", - "fe3ee531af7fca2ac04c05cc58fe3ec6d505879bb630901e7d458b9dc6807541", - "1c907492486f8e306ac312477839c23d13e1ec6848ba62e08823023da06b82fe", - "d68ff28f3f1f04c1a1b1af4a04aefc26d1d13c584035d13d040ddc91266af867", - "c93fa75fd18d662e1da101562d4c2169a707230e7a57017631d712706aa9bc27", - "153858054d5f4cd4be6e3fd636e40606996ce3fc1e8788c2651fada792c79d47", - "54fc7bd1a1e98b43cf8d35a00eeb7b26e88ea9891f668ad9cd49db410049ad92", - "a12197c3c183ae540cea2be34485dae171af1dcc0f98835d8181e6bd3c0c8dd5", - "14b5bc596a9d490a0e09938276ed1034ba1021a7ac2bf9c42e1a91489248b15d", - "1c30c6c40b170f093b94226f7300c586508a9afa0cb6a838a02ad59140f0837e", - "43662bf43df18e0f76e91fdaf1f1db81871e0edac191c05f1ae7a27f67ad9f0a", - "0bc17f046d98228976ad128c289a3a8c6eb45d30b1285d94b07a3293c64ddd23", - "6f99a837f44e3ef60513ee6a043f2ec787c309f0231fb0228585ea0f274d16cd", - "5d4878fa415bed8ffbc3ef77d77314e64efe65744aa72ccd2f68f717c7b860b5", - "5536df6ba6d348386d9b56a88be0bb1976e808ea16b57771454f551b7007ed86", - "0a6030f5da1fdb42202da59fa27683380afe428a14029c4371321be0f3856d31", - "935d2e591ae09114e5e485c4ca2f044bec35933823890f545995b34ed32cf858", - "62fba3fcf699f0eaac551f29d5374ce760ffc28c7e95b2185deb75bfb96b2b6c", - "22faac36456715349966ef141c57066da48e8d8f6d5b57fd60f94ff1b71ec57e", - "2f5fe225df31944bcd98a560272e79b705b0ae8d1ea6873ae54981f316e386f0", - "ae4d99131b0428fc5aa9a8c33594731e35a27eb5290eb47f617a9040134c6a6a", - "d6c7fab0daf0f9b37b56b3c1e864d844f83db655e04d52468c8e2a373b871bfe", - "a3597fad39d5f2769ee91da29a588dd13f9e80c588316312d7f70c97db85c493", - "466141875324dbc47bcd36c74a6d95b477539e5c578eb3feedc3e121fc7c6389", - "802da48f82dd3a2de82c5a56f0057b09afc6969f66f20ae489cdaeb4553c5012", - "9ec590934d3fc5adca2f944381433feab6f2440e94699c699eb52991d6196551", - "83898952c6a2cc0fc6d65d29d8405e739eeaf9af6569a42e4a77974ed303d269", - "77d1ffffdcc6654a5de6743fa678508ff9d4a68a318d4ec2098f0e11b6256ed9", - "f8fae18426dbab99d8a15ce79c515a44f6b06fb65f2214afdbda690427e737d4", - "a6029df475bf9c86fab2b004685bdbc9743cc48c4a8694716b38d04ea6905b60", - "46febe4605b5fcc455767bfcae82070a9ab7c83e28f905fc8c52366e84da52a9", - "161e5989a9ceb9cb62f133a90bb3741c6fc038ce24b257ddbbbdb8e604b5573a", - "cce2abc3fe58c463dedf4589c7807d350db10f7777a3b35e567e302c5eec9256", - "118dd2e4bd324824015d77f998fdf431bcae3ae865ffcadbafbb7f482c90493f", - "1f53847869144b514499ecfcac1eec4a694c7203c4d8858f3334350391e292c6", - "ad1f2a459c5ca76fb1dcc07a1957d240360ec65cedd07c1cba49ec570bb126b0", - "d8cd7a382d6dd0ecabf0684b049b4e387020f692095779e18f2a3b6a85dc3e3b", - "d22cb383d5354692f74301ca591d5d9b796099fc096ce5096614750d1d5b76d6", - "f7ca875519f8ff0cd01abbfd8ad6cb035337b3c7fae103806ae499dba771f8f6", - "d9888e997d1fca1424491fb1a20e051a83f9f589ef12bfcb373a7562d3c5a8b9", - "1edd9d5a619b162b5ae4312982f83f1095decaf8a2ff2854aef7a67e0f916e04", - "315671bd4495a05945ec70c2d6907271b50e2b219d5dcad9ecd73870de20a79e", - "2974a4d34bb39559b7de73d6a3d49ddffd7dbe043cde3bde1504d238ec897672", - "e0b91e9b30f60ca8f350434291ccf6e9b60b5100212ce8ebc58fc66dba13aa76", - "1d8754606d7cf411ff46d0263ac60afeebe33c9399ff82d0634d48509e76a08a", - "7a0d7ab219b64ee99a5c6e33e75a47c96c05ad06d931d842f30c6cc396efe288", - "5133bc8c468bc1098ed6017ae50a6dc4f7b1dd6131f7218af29594983ce28ff8", - "6913fb0a550d32e56043a24ba0743415d7a7ca5de11dd2f1abe1113955d55d57", - "7abd539b6089d9744bd1da764736eaf01fcdd3937a320394c4b533fd2076e64a", - "853ee83f9cf202b7359fc7576eb9f034902dea7a1886af1b321e68fded9c675b", - "da22edce30cd857c30333e9ea9148deff5bcaf731c8b79226f3d4f75af65e2e6", - "735110f2a297876307f412fab3d61e6be854a38d2260c9aad31cbd55b9527d3b", - "35008ac6c95dd10d3904d8325bc10248fa35273aa595edecc63ab75c3ffa2449", - "1d1a738fd872980b89701ff012b0941abd37ed70ff0e1a7a271f044de41d89ec", - "6b32a56d6b6c241db06b5072012798365b75107a1ef8188ac0404001f8a9a8c6", - "2b9db733ef67a0e0b102654d8e8d8ec5020130f6f2b9f9ba6f0890a7848a1f0d", - "f065e98b3fc4374dc2b560ff2459ab2a9cfba639ef35a934a2e7e434303bd3a1", - "10b659b7bad7ee9bfcecd4d97fcd865aabb79ad284f75d0820d9a0895d3d9c3a", - "665238b98a191df1b20218f5bcaf9d641fde24743d709564064018e83f0ad11b", - "0ab0cbd30f97ecbf7356dffaa39d39bbaea9e2ad654144d620c58dd980124f4b", - "34a0d802cfabd6f72598c4b0bd2246c6305b2bc34fe005617de92e053c583078", - "ad4c9230d698e687098c795725f26076805c34c94a1ee069f6fd75a4c8321821", - "ba129649004a7dff905be84cf586a3f20ec95332b6c41a0c68d889157a2bc68e", - "14d7660c406e82e43041360a55e3a0e2e2d346e6ed19859e3f9de40da074145f", - "292888648e1cc9882387fa4b72e8c54710eec2c271eb471b2ebc0e36737bd0fb", - "97928ab3b6bef64c1d27e269fa30b3cc86ca531cfbf3eeaf3ffd7ff5a1cdb2b3", - "f78096fd82575038d6fb2da6a2911caecbc0dd83d874aadb64859f6705da9e62", - "a24eba6ac367b080038fb977ce3607d2379ead749c359995e1c305008a2189cb", - "5e10b094f36eadaf299c6736b96f92c5cef8aa7aefdb068818a7e0d335473529", - "08e84d2823b0133ac1eb34f5e35967837b5d884b41108e891ae81b85275c19c9", - "7cddb894f3042e2a93f7bc4aca8d34bba3f3830312e3d43b78efbfdd8e7e1f0f", - "09b12b23c463f6851f8652e2a11919ebec237b7c5b73e9e2367bd499f8f973c3", - "144005cb84f6b9d469357485a3fdc55a1b2a3dfffc4f91f4739bd1f7e4613e5f", - "48dcb7ee2773c26c7444d7013b8692132ec4e92f43a43224495fb1db565b8370", - "1fd84a8fd0c209cef792e58838779aaf4b994664f924e6dbe1cea78a3a6a606e", - "fa3004024b177361b28fab05d03bfb8d723678b783bc2323b13f26cf72378aa3", - "c1d740dbb59e25e8782152ccc739396c72236f3e61833eac22f2b8569f2bc063", - "5dcfdb21823b306aba71030fa6ff95811e433f1ab68c474b745be720b8cc2172", - "c6fdbfefb507772a0613a4fd8eeb68661819d520b6f73c971397de50c9b583b5", - "5e061cd8aac192bc07a0b728ccc3e78bf859e46b62d905f7e4ef52e32acc4f09", - "adb11951e1f98b3298fc9ccbec184b0d88a4d86f3e66bc700ceb92d7843958e4", - "d96bfa619b81cf721a26b35760a5641f0617a5680cfaeb1dd03b853778946147", - "0b3876b6ab332a4b715a94a5cdfb04e717434a008566b251db584be8520a54d8", - "e0c624012d021d1422b9ad56523c4b925fdfab4a79a9b6b4433b428562bafb0b", - "83f19f34675cbae8487fc9120af2b240d2a2b30b55f351b6d6e02d3cf35f8cbd", - "7d604d18474ebc4d0fd10c2aab4a50dfaca44933c6f29520aea6ca04b8fc5a5d", - "157fb67d5d09f61933875e66afcce280b668ab6a410ebcf684066e4c979e8be1", - "5d4e0ac74d29adb5377befbcb079e883c663049c0207782215c39e68ed47eb8c", - "2c905c060d8ed4389b35d72e3163230cf412af76f17460d62110aca032591c48", - "5f3d41de04654e21fe835a109d7527b389c782e82e757c5e6148391fd99b3305", - "80ab5dbcee522070d219dc3c0f43e706d209ffcf1716c7c41675895e794c332f", - "4a07e8294076474b1d0dff61769c640d05466b6c4c1851972f97b7d5f5d53fef", - "489e89773450ea33e345c46d9091e1d69ceff73f88e7c5614bdbaf7288a968d6", - "45efd02157dfc6b7b3c7082e1d439f7f056363ddbc7795a5e39fad8dfbf36a2d", - "9bcc5b10f1c90ad74acef008d46882a46b4bfe584cd77a93fb2410374cec4b1e", - "b7c55d683c1ecf8694af5330f5089680411f28cec937446732aa7ed237b08208", - "4e252f3485d588fb6753796c48ab8da97df7dce7674e9ededd40ca1006a54b66", - "46df60f2ae49fd9518a33422fba62c17cae6e4c1e6aa28b6e92e46d8187b9b2c", - "9174547b8227043ead8d41df65d998297464bb26882597e8cf087b25e45c9158", - "65fe362d61c13c970ea19fc6821c02f7068463eeffc20cdd66c7ffb9c795b918", - "0ddcec8770d007e0d38592fa06f28553372ce27f6068486253ef7a6202b4b653", - "503525c4089e0ef503739414ee1642c9e719b37978347ca377c28dd16439d92f", - "06f69c2d4707a5a61c66d94d5ab228bf56affd9b3ed6da6986598c62adc8094f", - "8809fe7299a905b0d7779dfbf37b5e29f4d17aa0e83513a4e023154ff0d0a95c", - "616715219a0625e2ebfed0bfa15f4398a8558d9f51c9a21d1ba9084f79396214", - "9e2086da03b5105845e1783fd7af5ea270d8fd420881b715be68583b08f57da1", - "44e64d97c49e1d764149e25787ccc42f5fbb1e15c1541ee13bcf7c25ced93e03", - "428bdd1f8aee879de1b26d28703c7917e2c4bd87af3df6bc4e73c9d196e1a25c", - "13a631986140c5529a9dc87790dabf6ed3706296e55295a1bbfe2030ea6d461c", - "9b69098e863d5daa32365e4d6e8d0c28b33e8e4e1bf1820a88e1be65dcd577dc", - "cf975c6299b76b74a10c727d91cf368e1eb7bf2bccade428b4cb35d1beb9c8be", - "f90ba571e65b7aeb81b68d9d9c8bb1cf50d4b37e9e2c00547f7ea9011c9fbedd", - "472148445623f97a51fe2b6eb3fb66264490b1308e12f840784b6cb30cc2d908", - "6b118067455b4da4aab56cb8d270fe27dd4ef1193db7c9f749c6a6d2cac925b4", - "207b3c21d47c231cc81f435a13653549998fa1ec1bec37e39047efa504b183a1", - "63e03c99093354fe149d0e1ada2cb40f0ce5edfa4468f0248fc8d729d69c6b31", - "d0ca0cf83ec6836d2a7af824f53bcf98d3b364dd4923e08f3a2b65361643e799", - "c4513c13cc2bc37603073331ee440b152036373d5982016d4db77c9568dc79d9", - "a31064bfc55e028872dfa2f485bfdd28f7549b1e5cce849b0040308c4fe18b46", - "1e837ed1078eafcc47e5b0d51f81c1f0bb296a769b0c7bf73c6eddd386422c09", - "e4bb755e414bf9702972235e3b20647579d3750146ecbc0012e8f30705a0f451", - "9a92e550fc3168028031bf75cd8d945ef17c19153f149532a23a0d0777d9412d", - "81444a5d886885c09aafcc076e693f57318734b9b436700b778b1ce45dbd60e8", - "38668b870c5848c3239ff13fc54dc57aa6adf01856131d6a6cc478f94f2e2bf4", - "d309cbe2f1679c2b41ed7475c43f209fc2184849de61d0933f2fee32e4ed086a", - "fba25c80c9b345723cb6f496e41b5b74ca8199bab9df10730e35ba136809a3cd", - "d27d4472373f387927db77e9a47f7931572c0ce444e67bf246432c9926688695", - "d37a824085f57577425ebbc957b6360991a7b47648adee25280a749243b45c50", - "ede81ffcad8a9cb9f8868ca815acdff51181d1d97905390e39aaec48297d3fad", - "c5e6d0b0afb8a27e2a13e04953c079eba75b5c1e6e7b499fbf3d1efddea32bd2", - "95b08f154de9dc75c51780ae9cdc53e66b9f95e06caf6e36197a09774346af41", - "44f1fa82b9311123cf340d21d1bb54134727baade27f4d543275e69479b2d023", - "f9fc97792dbc8730c0b4203eee79297574eedcbe5bef560d55bb3f1f66b646da", - "c2b08f4a21d6510b45ab2aa80a7d022b698a763ea0fa9c68f5013562072a754e", - "5c7a6b581c1367c83e41d99fce92c9a4f3723212a4310ee7c7d8e233a5074d36", - "a6a00592ffcf6031ce0fce1080e56196eed49e8bcbe0c36d9098608d39f14083", - "13e093486c05f34a9d6f7ecf3812d7255c2aa143e28ab38ad7b0fa4e90a88952", - "f71c5d5b271f43a982994c614e4644639031c75f59be76a4acfd00d1a52fe126", - "c764f70d3ede71897fac5f0b0def90947b2c907e1911116a76ad8b2fce6fcd58", - "1d7f0b46e90b9ee1314f9a4c9e3e8423dfccb9d3240729b9d913644cc506d765", - "b506201318d323c62c3d8841332cb3ca6d544a38252301f28f386f7d062f3e1b", - "2413c564550ca0ab17560d14fcf6f04167352970652def511155b07759979a90", - "f57596c68cb970d1d9788240aaf4b9fa5af5123848d1b7527ac80638f53057e3", - "ecf8e13d0af64dbfb43b6fdb717ac7615de2abe796da94222375fccea63bb9b5", - "8e4169b380a90a4d1e623316dd4d7de4a8175f30ae3b1d164cf3e4d03f288ba9", - "556010a7453160c32d409e9bfc8384479ab422810512194f4377258b4036c5e7", - "68f464cb4669faf6854cb7778b729c8e0ff47ef9f1809972453a0e5a7d4b363b", - "83ef5cdc64b8d7fb0ff24f9d5d32f6716d2c771e261d5c16513e7c214d86eda4", - "390baf57059ac4ac4dbc8138770d7e548425314af3c588487c03e0de1264d649", - "3bd3275355cb5b6cf2ffbda99955d9333e3cf577c96894412bdf4c7d3e2b1c14", - "c1ec96bd18f953ceca9bdc81b1c73ffdcc42f3e5cd60f9dbf5b6fb2d9beb6692", - "077a9b58807dc8e446cd613710da8f457c917f05e70e3e5e311a251e773f3ccf", - "f16da6cf6f2bb8a776c50811812092a0bd34ea3264388d5962b408fc16f116ce", - "955b161ca4228d16922000af709186aeb24b36e2be065939f9cd44215f5b7eff", - "9e2c39632d7f874addce7d8804bb8d71631a3d37931365b058925d7d18d97ce6", - "e7de54352087caae9f6400b7c7fad7ff9f4ff9c993520fcfb4a0e39d44fbbe2c", - "acc5078c03df359f6ace53a748e57b7866138ab7737359fca0fc78ab4a180119", - "b8c851b999b0ef921ed707171b07935409e1c9a226eadb7e25c18277dba60319", - "d82242f2c43ec9f7a1a33e25082b10c7031fbc01e78f4fac842a6d65be67037f", - "ae4132b5ea46e18e78d4af58ed48c06bbc7e259b2fa4e73492bf121a8ee0d70d", - "71abe58bfe3130f397423ecebd78e37db86c4daf47ec8629a8c6eda4fe1e3432", - "2732ac3122fe1d97cb56d8e1c9dd8d615fbb15156523c16496424642ea070ee7", - "69835a0a55730f636f55096a07f331412a61e65889ffad682eaf059a573c88e8", - "1eb44be3679b8210197748a59467f6ef496ae22db480aa5c0c856dfac87f55d5", - "38cc2609c5b342a12054431bfe48711d28aec66922d4f97c3ea6d71c42b6a503", - "0474bef4185e116e99fff5bcb26da1f499c2b83f84f94151705b60f1a3bf3438", - "993b736d3c23bded6d6e04f3c8680459432ac4415db113fcf9fabea82d0a5ba1", - "c1d0ff1f6f46413195c8b04a530defb6d770cb490013b5643fef46307d3c2c9d", - "4e997eae1c1245241e06087be409d6db5e5a480ffb5a5ab3d89ecc69a04472f3", - "21b80a2ed7943694c42aa893513d9115380457e01dbf8a35b3b4b911d5ba01e5", - "1e35edfb59336250be5a6f21a00517930193573edbb93486b907359f120c3e00", - "c583410b4718905c4fd07595b4eedb2daddb67c23ee90aaafa47030067d2baf7", - "79f8adc4d42d919866761e01128f63c4f0f027b07f8f070085eb5b8daa941953", - "beed3d81c6316ebf5ba0189a630938c2392b332f6dbf62a4d48981db16cda15e", - "86ac7fc123a641f3e6ff56c8e4b27e486e85563ae1e45d41deb7cc55d02fe7cd", - "350cc5a71065312fefa9ad82720133cdc5b39b46e1cd9d1a02935d7b2c2a9882", - "58624ede219efdeb21a6ef256c867531a8a5f85adec4ef58e3e4e51adb96d7ce", - "7599e95e231307f9a32d24e8a1c58ab036428d83b540a9b1fb1b7f7ef1397153", - "bd4833e54cf2a670b4af047a465712673bd9a0286f14dade4da878fbc927a846", - "9634350186dfdc586d38ecef3cfe056d8f889735160a1e720f4afe974661f11b", - "d93d255d8ac26e6936f726f17450c5ef7617dff47551c50a35434829b367c7a3", - "d71641ef1ad76a1805580e3d5ab0813994161f21f1e40e7c0ed4e9b14013deae", - "b4f6b1c3ec3438677413eaf0d7c0282a1456ae30e96ea29979bfdc92351711b1", - "6d833e7665af9c1bfb2e36d92f2342c824d0f60ec320cd1a1257a225dd8eaf00", - "4e0577f66b3621edb4bcc9dd52839ae399149ed484e614932582b483ad7a73a1", - "01a45e130b9d8e5b2c72f2a1691dd34c686592632886775e5c7928dd005918ae", - "9ff83c66cdcf4f0257b91b91f55e6175da86233d61a29d16e6d6bf22b8139c90", - "11d548513bbe9aaec996efe4ab4c977fa88ad8b17fb64519327c8886d3f53fce", - "5b64a08a3283c8d4329f6180ca8cab9d50b6b4983144325fefecba60438d0381", - "b0f83f2c61a7def849288f2926117e10302868576d5f0950e51e0f16e9d33acf", - "5e4b0acfa6b9caefa2648b5c7c1afc517ef402c5d4b92b1c317e56460b0cdfc0", - "63f3aaf4d5a7205301927664ba9a59bea11f7f5227fc2cc8d86d910f64f4ff60", - "6bee5dadaf2e03dd11b70cf0eba1f507aafee8728dff0d27620fdd555932634d", - "30b9801a1d30e1f527156ece8dddf499845b235470f242e941efe195545b7291", - "bad940cc69cd17e75ad1e04ca3cc8e3a407e2e819fac2b18dc9d5eacc9b4143b", - "e9645c659e20b394b6eabc7769cffb63e4d574628398ad8180cf07c196e6469d", - "1c0b1c009e60fded9b6cbf5c11128e4a5e7a530dbea56e6b0a4799b9bd4125cc", - "af238697a799a24cc7e59b323fe987c3f3df8d2023a820fa8319a233af440530", - "b70965df99515a5c77ca100bd913feaef0ee0dcb535412cb8364e38caad0b69c", - "3d7dfaf7cc3cf3538e4fcc969a3c7a07cdef40b51d2bacfc18498e9ea2a3f365", - "968d09f324bdf5600950fa3a6ac14d0dacc903b70cf8c6d6c35ec06e887ba4db", - "ce59f46397c5213e319ffd307fcd67dd272de60723d9891183c98510cffa4460", - "5bad0de9fbdec14d5b540f2048c2beec1f370642a1f80f91109676aa23a3f8ce", - "b2b81c168143619cd0f109cbc64ad6a90dcda13aa45387e165c6440348a4e78b", - "b6fbfbebef0a05ca9965758d234cc133da34a4cad8ad740adabbf520fa1d33ce", - "82dc1796b5a8d33b17161112d4edd9d61e1439cdea5beeca407e28eb74993604", - "83e3e4cdd9e2affea53227d46e9ddb43abfa220a4f21aaa0e1bbc287e6158f94", - "d6e49145e0746f3e08a52310a63cd71ab50e6adc8f48bd57bffba47e93a08914", - "87dec26a802901b4f4627a996e92cb12f9951f94901a13028d865323eb5b6006", - "af8793dfb058834ecc182bc4197320a981ecae1ae9e6099f3667703b2f4afb15", - "baffdbf20c4cd73498f0f5e06ac6367a4d47175bdaba32dc88e0ca8eea0d1470", - "45df9151c12e21eab31c6e2d78e619d65e02c827baa9ae6b4ed561cb8a7dbd12", - "46026ffbe05eaed347b00afde2310eb347022887a9efdaec4d650b6130fa9c88", - "cd65e2bdf5980599a71b29abe2e437a3e25299916aeb2b1b5cf00982b1fa22c8", - "d2544c30e8818fca0f99ca42bd9eca91d974d22811b0c92494ced9cbd98c57d3", - "e761f8f65ee4354dceb818a4432671518b0b79dc04bf3f18ef133c3224b39eb7", - "e47b862046f33546e74c91ee3b0f325ad3513af10798bf3db46d3a9c944357f6", - "71e7a3da964df5436f2fdd2c145426262f3181185b3522a5f2ff586dc1516a54", - "8003328260b83774e934dcf94e96d86f01f042b87066e03b9ca83825cd9577a9", - "40d08ba6f30d686d599eaf9ac4c599c102e12b35be6d47b28ed578a88c6004cc", - "9e7f016fa2a6f8723e527b1a7067a704cd6309e4b5b4ba66c4e8c3f19bf5a466", - "61de127ffedf32072e058ef3ff9071f490c71c74fcc609557a1c85761cad62f8", - "b14a189cb37c5d15045fbe2aaa5bd1391dba0d6f753fc4a0b4a4e3b7fadf4337", - "3528739225814e374def494ef43be9edce0a8d9906ef9c89a5276333f70f2b5d", - "627675feb01a9d35e610a906b449b107c7224821bc394d082dfda63bb55a4052", - "aa4896899e8f56dc458aab88bc8d4d5e2a9e77086933ab5240566b79def0ea55", - "0c49a92902dc7d6e252b120fe56eae7e0f6ef32774e9b93ab01ae70ca5ec8250", - "f389cd3d6f1237923ac8ff4ead58e25b9111cdec73ea041d06b465786d3c82a5", - "5ebd4e14c712ecd3a6823024edee5a4a76c08fef3671395103e9021f63eaee49", - "52beba70d6f5b0661f2ba2ff6505e1a928700a3d9c86d3bf623864e7f2fd3df5", - "28445dac580d029bc119c6ca18d3214c21a7009601403ab8dd42b7c9ff08958e", - "32088639c73af318a95185c1bbd22198bfb4979c64a60d91c809109fc44882c1", - "62b7f5bb854f1466716f14bcde0279a8dbb61a02c7ce6592c99cee73b38cd0ab", - "e62555c3150f6c3e22b4d53c8ed9577526650f44b829a43c1fe2e35b4e39f2f3", - "adf742d9cd3c73a4f6694be673cc71968027bf685bed7fa04bb70b0c09198231", - "851c72229b53db8fb5914b9c36942386d40ee1e12618b84ca354e85ce1710089", - "81c9ef0a2a4c90ffce7a6693c2f2bd81edd6b75390b0fbe10500dc99117635e8", - "222e4edb3fcc7feeb981bcc5d0b69798de17341d3798ad3bf717159e977ef8ea", - "f900a79c905052cb214748ec5c31de03ecfa2849429e02ac7e0d9077a6904191", - "f7888fd8532f8b77c62dba58cd7d4cce0941b1a868f396cf3f1010bcb26f9d3e", - "c748f5eab6412ffc6d801f9937a604039a48eb06c2b8457bb6c14104b80fe3a3", - "af2e275d2d80615934ecc868ed462287d6f5c323df93562f873f7d1ed0e2b5ad", - "a049a072af7cd2638c29868a35e26918732f6c78f3d21e10a0e843b341166f1d", - "ce46c1ad3d5e6b2dc43e09fef1941f34cf9efe6baecd197228c29fed6c633e37", - "a42d1483ceab92f2a919899d1a1f38f8d4ed392357caf25f1b2ca8e5563f90d9", - "8c714ba8aee16c5d6fc8a2d7c96adad7463b7caefb075e4560c3d9303b1ea23b", - "8eb3842d7ca6e1b9cec2793f75153d0aac3e8645775aa394b74634e7ffd6244d", - "1a461877f84305d0a5c17757a880003d3b0081e3c2de1a2220ecd07617f1feeb", - "0481624bc133f149d8d0047741109f2367ab6e9476ee95e780d0a19544e6eb76", - "c6dae916a75275b4243bbc37b0dcb26d83085e5478179df5be83046c676ab3c6", - "cea439ee4650a8bc6fbc80ed0cce7b592e3b41b9fd4f77badb6693893aa1ce88", - "67c647e1faf622617f1b580fb789f84f83e1c4dd2b6ddace98b843dd4ad1b82e", - "c0b369472132b7b502e1f257862dc9c189eb1d74aceac0560a0467d5c2111859", - "6d59f673eaad3c87b4399f0f51337ec28fb144b805f2f8b14bc0b61c552e011b", - "247ac3b61a4bbd62ccbcb9d94a0e99c68ab5399ac7fe0e5ee473a0934010a981", - "16cfa9d4e62ba9631ed2d857335b4a45ce625659d83a6f34586e7303b3e015d4", - "43a5293840807bef8ae00f8bb0b23bea96a04acb15193061d7dd54a3393f05a3", - "2e9587fbbd15bb8c4d29b286dd861390d4f51150347bc96958f2637a685ec230", - "df9f8c7a4b519d3c8517f4d8d6050eb5a7a8595655217eca91b94f266a5bade8", - "4104dbfac3ad43f228f1557829135577122c74503af8cae432f3fa96993a0e0a", - "2f5ae027493a65354728ee74a8589b439f7e30b85f35fe8bc68c3439f302e3a6", - "eedc57f0e783b9a392733ad3177147c147394ab7e64ea93f7059fb408eeab5ae", - "92e293125dbac40baf7ed92abc8dc9c4995e535e3d8d946ee7975689057ad4e6", - "7a175edcf113449c75ab9b9701226d42cf7780ad28872cbb6735e44ae479850e", - "6d366d2043c596ffb2595cdf040e2995e57b079d7268cf99ecfc3fabfb67da7b", - "0c89c361df397294b68d35c679ef8262874d4700879c61150b533197bed52c4f", - "014c8dc14bd0b4c4faa53cedcdd4e29fac7269a16fb74f2f57b1a7acf5c8448e", - "5570057075e71a6d864da740765f7004e4eab11aecb2a1012ff99df21587833a", - "048e2c612549360968259455e4a4590a5118ec967e42cfc2f8eb5401b5eaad62", - "380fab7dc5457070b010ef1b51c0ed16a66f83ff183ee62e0016287450e9a3f6", - "2e9c1a93a3d338678820b1850cae050e60517b1ec3fe61c5ef8206ed64d5798c", - "4d3db4c59546b8aea0af36209794c1b68c8f6ad03809f47fc6c0571e84cd068b", - "b8ca5baa4ca793cb69c868d235872a2146edaecd95c4e2f9288ce2524e1ee3ff", - "fc00284afe979184a2dc605265b5fd5ee90da5493bcfa6a4eecfd1ccfc1a73af", - "06b4dc66ce117bdc3cf5383ba1fac61f5d3f3cbb232e89a7cb4b63d505f407be", - "c3aadccc39482df30ba405ecb891e065dcabe5688664c8c9304636d7476a2cfd", - "094bf10041085ac88138b928104500bbbbef4bcdb2ff2fdd612df3db8e3893ce", - "c6579990bc3027775f9fa66a579235e4f608467d447b464dd63ee83f7a5cccaf", - "2af98d75b2e0039238e6bc20f5a051da2acb0d9dab93b3ea8bacb317744b692a", - "4fa34ec6cbaa7df49bb74462eafa3a8ec327128cd28a01228a7d813ab14d0cf8", - "d731ed9f35c4914f6cd1bb2f2cf71500958ca6ae470220e3b7fd68b7c940bb8f", - "9eb971f2a9b6c291db5ac580df22bf8462b32c6dcfa71a0cc3348e3b9851fbb9", - "52051f05203d8e7b25cd87ab1af4e955995fd2dcae9ccce36e21dcb4330a75bd", - "267dd9d9ff3d104f9e5e029a80381b92569ed2065b2098a8bce556082c0e6b86", - "a3c37eab629e73b8f8665e0f89709cf06ce101aa4879646b45145881a4078323", - "bfa15ffe2336acba82cf5bf88dfa2885f63c4adb0b61c00bd8904b7700e2a4e4", - "e33384cdbe408050e2e7c71ecf2052f503b7de4f59c67730117e94872fccb105", - "60ceb92821ea05a7d6ec3dd9c798e42735f9eb1ee1d7a8be19ba0b215b854ceb", - "ddfe5f6a785b7723add2adfb98dba294cb35dba15725fcb69bb2a054a979b690", - "d576a4b7c74c8b2d099592068de4168c99d1850267db6d51d610107b9abe6ba1", - "079da8aeae20b35e05fde9735bbfe3828f9f53e00e69b2b0c67139b21af766a4", - "2f791de1db7ea4485e4668dea93fb755b3eaa7b0ef635e9f843184613827665e", - "94c27df6b425c65d26b3bb7f07125ca452f8247349c49da547801bf627d4c76b", - "b4e777739a03dc358da4c12a8a4cdfba429aadbf2228ce38901ce85550a9123e", - "eec32fa5b7d8aec72fda2a439003f1e0dd8b795226d57e938882d581807c91bf", - "68f1c56ebfa041846994943d6e3620a376fb75be49f09567f0a9b77a0ff8c600", - "57f3b8d945842157b3e6ece6121f6a223384968803f20c20b01e28da166f8875", - "33d6218741c5e7b1b3aae3c74734826740acb0d321c171223cd0fcb8e2a61ed0", - "980ff481fd625c357b87731946de3a4d6d040ddf9ad66b4d1a68f1ba6da92104", - "e3ca5eca506d7b09ecb67f1d589fbfb1e449608ddcf63f13ba1a0d6c64f15971", - "fc64d63730d14cc1ef6e3cb2ac3413550b65b481ce4da10b8559ee819839d67c", - "0db716efa712eae9992d4bc32bbb20db65a2a5fc5d01c0003f6c41ef567c30f1", - "26b21e017d811bde6795ccb4701677b0e6b817a45060c84068e6b5dae7019e31", - "6deabd5095e1bc753e4a8ad8b3e3342f5cbf807d64a7a609c8ff97cf479bd463", - "eddf0afda1267cb2af590529b68c99954dfa7544cfb3b4d9600ae2b76cb6431d", - "8cc9082ab0de8fd6f1a4820f54e75f82b809d4c9b8c61c05948965b2f83b9197", - "c0e67b867d00481d3267f90abb416f30e338b05ad0a86178cb4212662d182ca3", - "94c1159019a3561e7f4638f04d055d6a11ecdee8620dc1b6f2f983e4579486fe", - "47ba4866bf46117b9942d28897c71c9b3af3b461ad8fcd5b080fdbe94839150b", - "bbd296ea27b8d41645ed46b28eb1ffd85a6aa7809863510ae7f285c5578bab0c", - "3c51ee5cb451ada218e78969eb5b3bfd9ebd3859e7e2100951ce2c4aab37277a", - "1569033062e4480f252973c7870fc4fa8309c4d5f6bfd3b9ede3f64e8d65adde", - "7d89fec7bac13cee8e97c38a49cb1470ac65252790922b882dfe2cf8a67988fe", - "4e6522208c493de30bc22f911157a5920729010878afc20783f347074fa72441", - "5b7e1f5781542fa4e8fd92d523458654978f339ad62085c953252a2d07819908", - "08060a431a05adb66948ed04b23a5f53a617a37700c90c15d96b7a81b156b5d4", - "b9b53c9a63191cb845ba4adbe9ff834729a96bd5b8145085eafc4e372710f0ab", - "a4a40c0beda0908bdd9a58aa07d24575eb8f65bff575e39ea2e6a4ba4e886690", - "64d7f4cfa7a369a4b74f972d2adb22426913bb447617bfe8b288974d490365dc", - "acfc070fd1992260bb0ef97300bfdf1ec7d81b0e3a09ca3300b1a388a9af0119", - "89023b34b48ff52ece1623c39f1794723b14d99e83d018c062082a8daba4a498", - "9f4e9ad6a48baf524fc8d90149b9065702a02ffa26bb3fb272cded56b783c36d", - "df670a11b182099f444cac1ef621039397c7599de66a293abca843afd43acea9", - "56153fc8ee6c8cb00b74ea13b3820498049a5c9f711d08aaef08eb74523afdbc", - "6ae5c350b35b321f378c2ec55fd6a97aa956909f29ff68463f4b68fec0e072da", - "d4d1d279966d81e8c5acf1ee50ecd14d97e32c72b9a58fe7c5018e829f364813", - "2e6a364fdcba3d093d3601ff55cbfc80cce0db76890a3427b871cf5f1f3ebb26", - "5bcd07d4993d70c83fecf25bb452757e0b89280349234324bbedee495cc85b07", - "248d1732cd0a2c5ee9fb8bec7032aa9f8339669aa930c21180c0100dad54f19c", - "3166e71a2561803bdadf78238f196afcda5f015678726758916171a3356a338e", - "f38deda5da67471b154baa653a99a1adeb8a40eac631600cfb2775f0a27434a9", - "852bc887c4947450e60798a67ded07d754ed45ca900a1468417955c57dcaf0cd", - "722925675c7643e92bb09f56667220651b398991385b8995563ce7e7db4694d9", - "52bc842107ea2f31065af9b7b1f97b880670d7ca4dd318f1fc80a20970170826", - "c6cabb92d8d9ad4b5d72d1a599dc2b9670a99e6da03f0eddd58acc8aab53c661", - "00971c2bff204ca486434ebd3efdc8a1ed65a1d07145e2a9d0de010a8716a05c", - "88a42f6e5e06a2fff94b022feda4dbde30f6f17cbbf34ebc9941517a721e952d", - "932be0e100128009055b2d50848488a3ef02836b5525c6d2a0e177c5f1b24b10", - "a5fb73bf8aa6e7de9069a3b7a45792df9d23669f3fb4da841873d7acdce259e5", - "a158f472bbe161b942e32a8fcff34e1d7c3ece26da8a0684b892468821a06598", - "df0e3f466f41adf4ba49c5211d153b9d66be555e9c36b4ce60ff8ad5cf305c27", - "359d897e0d77a534488f2cda0accaa75ba80bafa85c99d51c9ec256baf59de84", - "97d540205ff3aa7c528be80fe430cf18f03232a4b0b4761cc43091401784709d", - "244f9df334dc0b364af742bcd5593e7edd2d9eed721e561c7a8e79aa15eab167", - "7d3cd79e3bdff99bc403242e2d28a65d56a7d331a0dae7050cd619bd733a03fb", - "f5e2880cb7c470bd173c53c49114c7c701066bf0b2acbc66835d21d10ee5f892", - "48ec139705ee6fa4abb8e48ef08f45e5875974129f19b9b76b92962d58ee7ba5", - "1a1cc834965cf771c61184e2e33dce9f238455560a327dda77ae88c8dd6637da", - "151075a9d7dfc27ccc29f4375a61a97b2eb4104fe6a57af65e660aa45ffa6811", - "a89fc9d2049776edbd4e2891bec0c8fcd29acad05b1a8aa6d31b6460e21c3ab7", - "b94c14a1694586f2d8a2e90ffaaa0f424a121db65e526bd62fac411fa78c3c82", - "3ca9a7292eacd5ac3b1dd7dbdb7c96233678cf7af6a1ea3ebb689777a37a2084", - "446604c7f2ed8c08b750900795fb8852218ab3bc166a785bcb5b5065245e14d7", - "ca3c60ed2d789265943a7e60c921fb411dd90b54a9f95cfc832d8fea7fc90f17", - "cf81077c1ba16c4e6b3de8d84e263ee9023afe2347c478c5b7440dffe58f9d19", - "0bc186d9062965b464ea9264dffab73570ad439f9bd87e399771e401d6bc61a3", - "c3512d7bbbbaddfef26ecb00964e8ddd0a90d03f3e4ed2c419696c7ab35a2cb7", - "070b885e4a8033a7ab465afdcf745967e62fde461051224339d741fa5aa9f278", - "bb63713b39f7a60bd7fb2516c62eb6b302c6b7e6171b6d96587366eca56f2a34", - "a3809b2e82b1a80b87eb1d37731cbf775371e00733ba0ce8a7d6b030f0bab150", - "ba2054a256d42fb2e997405d6ee250b78ac09d614c8a41705e50d23f15876a2c", - "b37b73b247deb13590afad1d3aa811333a19b5eb0325548ead78187550de5620", - "8c97c282f65022aef5652820626ad14b207fcd6193d4db9a098707c64c3872dc", - "590ddb79572e855c3abb651e3810ad39a122f6f2413ae05028d94afa5aa02dfa", - "ffb0ae4618a86ff818971c0f921836937bb6dcdc3e2c0bb53c25782790bfb86e", - "d4a187d38899fcb300125c46df99f204f7add07d96c4707187516be6cdd7f3da", - "2c1165f2ec4a19229102bc183aab82e3a28912151d4603ea9df15ff5316774ff", - "24a0ce947b59777394b9310847071fd08dd20c10e5a18f408b0f5cb8d0a16105", - "edce336a38ef01091a395120e3cb52be06b9e6070725c02c7235a17718adeea2", - "a7066c8382e73434a849ed13859564f8d105866dd59e7c015e98e2408124384a", - "bc348ca607b019607a5041318de82ffb4f79bd4c1bb2c31791d519050e5a5c8a", - "e64dcbee5d45659acbfc93115c32bf21f7e98180534e1a68ed26c6524ff4fff5", - "e6a92eca8541f464000e70b3a65e6d167e93d051fe74e3d2f66d1a97be35d96d", - "e2c943c7f0112aa562614ca6f4d68df0010d6b5397578ea26dd718b9a1a70c16", - "518227893a06b5062b72038a487a9b053d82461e69ea1b9ebb3e119845c3256e", - "86755f5f70e47642ffabb6f573fdf4f38c6dc8c3d2db1a83cabd696c04630184", - "9e26813263c3cfe94e3a3844a8b6fc1bd9f75a9397fe3d74bfb4419199a65a55", - "df9d78cf76be85f1dec8900c40ad30d9be66dcf89eaab661b8cfb91f48944328", - "1ca029b4845bf895d9b5f9e4623d69ce6f8ad4a9ab7d9d3629c9758e2e81d987", - "fc413c6c4e93626176e8e2871da9240e4d6a5360230f14fbabac41b4148232ec", - "d98864878a70b3f1ba385693b04bae3b0a6bd9767885f6510688c75974756254", - "fba14e8ff2362d7cc62a682b8a027e33a5b91627fd4c6aaa519b7d2d0ce56bf0", - "8ab6bcc85faed16887467fb3b910d2fa11767d9dae9ce1c82098a1f4588459da", - "c0983f2d74b03f9ad374e5829e312c7b8fdff34693daaa38505d516a4bbae879", - "d26355b911914d48524f67f21264ec34ffc4c2213f1dc759672022b8d470c9b6", - "b353c32b6f393368527e3211f210623330435fed12eefcf3600b6c676262f620", - "678b8f8ee04f6bd8a803154cc218e25fe891dc5bb1a05ca6804651493feefc61", - "1720cf303d77ad63482f0093b1843a81fa943040bd46cd2dea632889b034ff26", - "cd8855f817ee5874f25a69e10e29c6089b03e12c4a876f9b91324b1b6a2ace43", - "fc9d56c5ed630505f5028725c94177934a32929f61a5c72f98b0fc3ab9c4a315", - "9123a1a87860703e5dd3cc6f02b818503b8c23d89fb1fab88568facf3f4be64c", - "b245f4d4fae435a63098036dce5c2ce3c3d90505f61433dbd0e68337e36811e4", - "0946e75a10cc887b34d628fbfa49cd19dd3b97bd735ef3cfece2b8134bda2dd3", - "3c99c613f43570103edd45eb3e8646d9e2ac9d61f4eb1b1a7e7513582c2f996a", - "89c809ddf4f61d0c7b33cd262b7da79182b918eceb81e7afe97e2097d037045b", - "2f9499e08da1c735ea84e6df6d277f6c5a13069fe7571903c06ee98941fd10ad", - "5576663c1d0c9a8a4ce0a8a51d9c8faa87666bc30b1ffc2d9665ecb06148da14", - "9c531392e76a0a36c708d6a71a6e509602538847113d67d486a7c48f8fb86b1b", - "6ef3131cc6856e98d613d49de3181057d2b51b147a20e51f0460f3774e0fc6e1", - "7f2e9af601a8418029d2dbaca138b017cdf048fa2890c85efc8296d47c02661d", - "86839b287530fbe28b8e9c32caeb994ad20d642f278d896ef6c92b7a8df427ca", - "068b59ee734226a08b89e89e772fd77d51fcb7f4a922a7f8e242e0208bce0211", - "ffa8e2f5d3be6f2c5f4f27f8227fd2bc8e672fe2a0984a526d05a197dec282ce", - "0c7538f61d01a1215128ae3d556c882f436e47be2fef4be9f6b39afe06053622", - "3260afcaa76b5a912a63fafc733ec8f078bf09122681087406c289050a1cde06", - "37a5d880bf48716cc581d3b50d6179267ea1456a9ebb87f0fbad3948b8cda877", - "99321722dd813824d9a68f7a849da77c66a06b533b776460a272eeefaa8c21fc", - "5217f5882f6ca3501ba6ddbd1a5652385fbd5da7cfae734f87178670dc2767cf", - "ab3a6a0e5fa87b5fe309bbd06c80fdfc890f1b749162ef57e33ecaaf1dc3048c", - "0dd2a9fa08f1da964de29fc3784e47ed8c7614970d8f2efb5e99ba1e2c020969", - "9462505798dc66cde435cfc01825a073007b792600eb27e1f483c4016c8f4e03", - "93841d65ea453019ae784f637c4595a8a98ef1e56ca30675c625aab5a510087d", - "b0d979af170e93a51481a455137cb6f6f7cc7f2e495f7c5e9cb9e12d1d504e25", - "6b1628d52852f22869978beaf2039093cd121ce02375d7f99ebaadfbef0e9eec", - "ba116d3a2ad72138b8e7c02f7cdcb26ecf5147d7b13285d53f30eb1965b5cf1a", - "8ac1bc1dbb9204a8bccd7a7d8e2a5e3dc1937b0b5c68f286e6b8d030e2e1e428", - "e1b1df315d27a20694717b5d3ed3746504144088d53a67606bae65fb5b8878c0", - "ab727178ecf5a02bdcd34a533f4989390d9b4b46643f4809b41a886c2df119eb", - "1282f8eeb183cce930149f7351db12074a22ea4c108bd8468d5ab1f14be4a565", - "95b220708676e3fbd9c12cbf44a43ee6ea13bfffd1e8ad43e45330d0205b9e3f", - "3833a2ca8ce26d0757bc9f9421f51a3468456623c5397379c3d01faf47e5992a", - "8a0569bb339519566f06a2ce761dbf3a47c3cc0d7d3600aeb622cdce628b76a3", - "f76ab4a0f552532c4301ccd2179a6cb6638cc67e883517d811309eec0d3354d6", - "67793962913a2a3ad5240921f1b0dbaa99c85e1bbea2016adb2973fa0c5bdcf9", - "21ea234fc97592d4998f8c661da7354d727c7aa357f7a143baba56ddd2230ffa", - "3ace3fd5d8259d1c228bebc77e15a93513437a88e2f6afd873716063166ee7e7", - "2fae5ca3e3e62a21b7210e90e24ba3cac989c3ca37b540ef18d669b442335d76", - "200847ea042575f73b35b3686c0077381f9c4ddbfde86c7943c36771bd1a1163", - "4619136d23e0c6dc0483dc0b25b6bdbd913c9e58354f367232e9a544a1d8802a", - "50a8c74cd2e17f5451c39c5f1d967486e86ef7f10c563702ee08e1e2ce1efec6", - "2c976e1a1736456944201ebedb7fe28a0e160fc358ab9107b418504c9df95421", - "138443830357adb4f8eea05dfc9228aa2019961203d8282314427bbf0847adb3", - "01fc1274e333fb7333eaa7eee3ad476b20aaf34f433a8aa5dd946e4f23ada411", - "a2754985b0880a007fcdd41fd3503f591972c7fa5d76645c43f97bb1f01e95cc", - "77093cd0e4ee8c457b2e16b6f76babbe4c22f3b2b7f2bdcedd9532f5e96b32b8", - "1e1ad7b2867efcbdd26f23f4069da90013c1155e1054b24eea699576f8f6401b", - "9442cf40a8a9272475f14371f03c04cdec77262a0be49e96b2771109774ff1fe", - "09b95f67ca9d39ec1e749e17c1bb4c2450baa650172319f2a484516a608cf8fe", - "355f9ffbe4db8ef9f5ec12b1f0e307d3ddd1529dbbb165fa2f59eff79efe97b7", - "d325546ba493667ed5422da83eeb29c36f0e5b6f8a5e2b61e4f1497a7cf3ecb7", - "a950ac3878a5e7156817155cf0eaa2f43b8819da8380071e9c12fc3c384cf2c5", - "43d7b43903385356828bc7894eb3ee9a88041737e692a0c4da2d2af96f7a309c", - "28aca40a7dc1ad51ef399074c752acdccdec876b12541e4f41509092fdfe24f7", - "2b5307a25588ce7904bdf274241c744767bb1107bc6fe9293fa9a9981330bd5d", - "4c17d3fd309582f8879c28a1c7c49f44c30a7e2a02c7ef674c1726717d52b50b", - "cce65304516ceb99a105c34ec0014239e7aee13a7f759fbc6c161d9737348143", - "cb07afaa60ddc2b2cc7087a651bcc33b73f54be4979e497bfb8dc9545e39b956", - "f4ff8d9d38424ca5da2c4757b82856e1c6fd3fb3c80f276fbc1a43327928283f", - "a54f80294c55e6c39a0d479a9a77a7877693ce7f6973e7e12ea5177bf355e18d", - "ccd55322f618412b67e97dfa38f288b48c42a04b005c7aa31c3f8c2d5555acb9", - "5d4210a387937cbf9e8e7b8a43838884435aeaa93afeb63355589f90e142ddcc", - "211365a6f7e851a85b11ca9cbdaa22fedf83f6650dc8eb1f733beecd0f204e7b", - "8538f62549784ea03aba1424b05e3b9c57a26e68a88dba49e53f33ea42869b1c", - "2b36fecab82c0eead53e2f20729096d526f87a9e22c5036ffb62642b51255ad6", - "2498075c083506fa82d0e6a111814eca4cede30384a61a82f6c0fda9bb5299b6", - "f57e9ff936f189f8afb49ab347b40ee51cf83b84fd149657c54bf690711f9e74", - "34bf0cb7a42478aa2508d0277f5baf1789403857c2366fd4e6b5cc52d2cf64d4", - "a5e6fd52bfff9c527e4cdb0ed700e73b38049f49a9af0c9bccb31b2e2c0f7889", - "5a687519fc2a1e03cc62d7c88c95e970c0d784e09d5a6c4ba69b49d332743157", - "841d2dd00bec73053456de3c5d30643e15162cb345ecc81d7b56cb97f4a18107", - "df120abd6392d0442b0fe8d1198217ff25760c00851b9a33d040fa7226311775", - "eda6c99ef2fb64805f2d369996f011e870de5036c5c93ecfbf32e171dc9765f2", - "8836b18eacfa8196e3447cab9af59efd43600633b92beeb8cd72bec417acd02f", - "582ffb5ae98cff1f6fbcfa537e903b9fdaf77dcfeb1822bc24f42a3adea2c8c7", - "5ec7c27417e74b43b59ce12fa1a6cebecfe8cc8fe563baee4abd547db9185860", - "cdf6d81474cb9ab2bc15ffdff7182a0bb90c2176b5bdc3dab8f7f06d8a1cb489", - "2ec1420c3dbfb235fd9f11a2988d80c85c19659e5c2dac8d8277086478ce0b73", - "e4ea0ae5e063727edaf03229986c8556ce314a1197904fd46fcc80cbdac92301", - "d0e650f21fe0c614dccdb2cb2b72b7d854ee2b0f95453a22a6279087d00ac192", - "f3077a91c50751bcefd0f14b4272bb29b12396fe96a80b331e61f7b12b6d3ad9", - "989a52d62df1420f8c8d64f61d53351618992793784451ea54333b654af75646", - "b300e9c1b85b87b7db49840f56e9dfcb51106fb99e7e8893889db8815fa58926", - "4204eaa2e5d9abeb7506c55a93bd92245ddc06d717be84f40f22fb4f22ac45df", - "8876393cc2bad637f921ed68b04a3e4264852ff52a66f390362ebc7069a08017", - "2e16cc089c3d953db7eed339e4494067c13de84286bd97ca77d60046b9026d49", - "a31b328cbe9e22f7de4972ba3240d227555c61bcdec11a375a3c00e7e1d47e85", - "a38b66da6ed5c77e4436f6dc94ee0501d12d6bffb3c002be3a4b450059986db4", - "081cd4c336bfe2213cc6044c7579137e28d8c9f66c92eceeaf232a57e236a61b", - "c186fe0a843c80e1afef39aca305e6eb034da801be697f1dff2f28c519d4cd48", - "972ffa3902415cb16daed0dec44b0ac07429026caca5cb1d1e160f2808e4188f", - "cb598cde1c243c0c4de50d387082684659f5d42bd18b27185c7b25b1c31c5d29", - "3c4de7c8a1191b3f08fbd2a07631a1fcc34a52659f7b521548239d90e5b7c13a", - "846f7e89e19e32ca791a4708a71e1a80ac1277e83408582c12015b24743868d9", - "2f6971bdd135d3e6b7e76a252cceb050a0828e52c7763dd750b27de83913b0f5", - "b6a5cbe688d99bff5ab7e92ee9184095bb8b957217d147f7f783257c8e42b3ab", - "87acc14500ba9d0664edf38855fb222e2914a4de6538f16dd3e1802b701d54e1", - "1f1c5205adea7af3f73cf095e62fc9c36e996ec926674580f649372817cb3022", - "5e5f6f656c2a7457d2f8fe002187f8ce3f1c36e648459d5962d91815b1651d1b", - "824ccd8e6d3871e9e4b95dbe291ce84cabdd8eb6e8a2528dcd3d2d15081f13bd", - "6260ded15f668df678c5a8e7e5207f70c462c45117bfd7d73495fc76641efeb6", - "aa50f70c69b6daf15fade43368e898722e44f5a63b1d05e5adb603f317d6ec78", - "c4568e77375851fee45bc49fd4f18a0a6d1135b1ef22004bfd83e800f45bb37f", - "2ab5b32409a3ca81f8378a3f72943091b322b12d3ea5f89c5c41f0c2bb07e93b", - "90d44229292df7fa42ce8251fda93417b21555284492c489ec605704fb97cf73", - "1fadb2f8fab5b9a0ff6cf93deb137405933bfe485a3c98bba133e5bcb0076890", - "12b439563c9aa66e00f82f0bf6e042dcad27a1037dee8d2ece1615c4874e10dc", - "39d8227ecce07697b5014354b2060f2d2b4fc0d79ab2c0553f3fd04bb478fcfb", - "02f74d661e4c9ad8f1e9b8edf14b09be8cfa3438fbdc9d19f2230097698f1249", - "9d56a108e640a16f7ce248ae520ed994e75460064328d8a48b89987d6ee31685", - "9bf36b8de4882b067a147f86e44381a5cba4b0ffbf3f634702ba498e6df3840e", - "b067d30d3fd7a5a41a2ec5cfbc64f6c798f5aa53c7e933f43d69719cf92cd0f0", - "b67a2ac4b018d7b3cec62b93ed079e4d5b866ca6f52c985e79f1a9918dda902b", - "396c4e6e08ada8cfab0a915a89757ed140720943d4becb4c8ef60c63905384f3", - "bd0379d6cd6c00fd5cf3bc5a36ba5842dc6bf6bd0cbf1803a892d0810994c5b4", - "1fade00be2369a12d1cf4f9248a40a04b6bed34a0a61a358867bf248b1babc8f", - "fe8eb06e26a1da73832b295d831b97507713a01da3e146b0aa96cd398ea1243f", - "e2844ae354a54e9567210363c7062d63a860d8c6356d699bbf43d0a081dd7173", - "146dc7ba0793c90bc24e26c159c4a4d6ea582dbae0e3d37687942a074d79b8f7", - "c23e50deabda03095a206c1f2de364310e038e037675cebfaa54ca426ea073e1", - "6e05c3953c0ae3de7b893ad519eb73e45ae8fa8acfa71dc1174dda8147b0f5d8", - "987b95a8f6bab86797a1dbc944300b1807b87b21ae1914601b9516fe1bbc7e6f", - "ce8ae5e2c152aec5b0491fa5a26f95d40996d8f8932276ad103d7ffd7fded960", - "993dda759d1e97c73e1c7a65565cf3178b32abdbc0f8ff3a8691f1af7c7a4403", - "eb5623ad4e96225e757da46bf487efee1bfb117b1b6d7a06be120818fa61a0a7", - "908d03fe78d9782a1ac4bfdbb66c19b5dbf0dec3a32cc16ae02274ec934c0b9d", - "f7e6bfecf2384c4f764f14c16042ccba55431be6b26035e1c1a4c94d0fbfe177", - "d7f7ee6c24259d41b4b1b4fd281996c1984d8b6324ee991c96f04c6ee4025992", - "7c11cef4f0f3b16a5dd62ec6dd73d3d34b35717db7497b90e7a26bb245d97aef", - "ac19a2d15c237db2b7b19f0a66a33502c267fe9740439788b1079729c2f2ae33", - "9b08fda6136c227681e4443ff28f38100967ab603521615547aff1a7b06a8818", - "b9f7e4d1c2d044851a632f1bdad3fb09cc883da5f014cd7ffef3d8d0d4adf79b", - "8959590afb66b37226acab8da9e7071b162f909c6bcf4c67e777b161c7b81af0", - "24bf656a34b3373c2d242d5cbc29c7bca4c2cf10b0335b50e5256e959cd3219e", - "95eaec15858b8fcc2df3cc400e27c32870b51d9ba8eeba1156b0130ac1bcfa3a", - "9a70c2a6625c3995dfc9cb9af8e492f84a7a6d9d4667f06e4d317ea81f97d80d", - "45c219ac8f7aa38b8a6effafc39715cbd0fe3dda22d9400d66ea6b403c06e323", - "09b0820648cdfbc12080370c8ea6ee6a34eb2d571bf03004420844bd3704dd58", - "c25d992cd812e4d67efc6c2fd1ccc86bf1a99f2fb3a59ac15a4c7ee2e9de2c90", - "67b1220e9b99f81242e8b7f4903209710a666c471f150215d8a47436418c078c", - "49236fe36a9fdae5530d42911801dbedb4406c7c69ed57676f58a17d53656666", - "243e92383d69e131aff66c1292e60079af436404d64771d258db511b0fc80666", - "5f08598f4aeb42eb26a6daf6d3004f533be5c33922987ec38eba9dfb164441a1", - "d65ba7bfcfc65a5d3dc7cf95479d2e748297dc140df574c0d57d88ebecb88aae", - "1d236cf6430e2a763f2acd4e3a60ea6dde2a194bf6cbb70d49d98cac2a0fde5e", - "4020d6e5835ca99e373348f1a397baafbd9b1c7e2a4e7c2b67b92ba5eacb0ef9", - "174b11c7f4c7c374c5df14cd2d9abfde678ad833e4fcbf3b101fb57babb6e48b", - "e6a20d7fb2614f35d3cdbd5a8ffd2c918f34f23834f711c41b34d8fe8a4c907a", - "a164c7390d460651039d9265c10492f326ef61bd4a75a6a63eb1858bbb3d43e7", - "0f61338cebbe7280220138010b30bc58cf8f778310e689b1acc789f89ed77cc4", - "a79fc65f08217670117554388f30e1622d7c9e52b919ff93272b692e913c49e1", - "65b93ff21a2f6049ae0c003f561e93e4ac559b7ac882bdd1b361d7905b123da2", - "e761e5a712f11e2db288f29d4b941188fc739b1bea3f4e9c0fb381857f783ab3", - "e980ccb82289f88b6a2ee46fe8f9ffe1dcb3f16fdb12af0db332e4dd622aafa1", - "c59fffae47d670b3188917e673bfb00ed14041cd237e9b5f1c42d1ebe932a6f1", - "671bbe0643a717fd4446e6df31b03c2bb9897ffde5595484fcb6e4639f4ec312", - "bbf3122300fa9d3dd39c07da55cbf010e0a772cc8686fa0351e052e3ff4c92be", - "7f97db57fc26e94dcdabd8c78abfa757a201c57e3349986462bcbac0bb61f133", - "f8777f5dbae2ae71cf5d4a50c88f4fbd149e1095ccbd6c37a4192747fe97c6f8", - "e7974736e968b1844c0c2ee0adab106be58ce87af111cab1bd07412a4019fb93", - "f98a05cf0c49e08c49e8a681495b67cfd7556b9e530b35f00b56126bea671302", - "47a1b5f430f3323839fe11e9c81fe14f02a3415d10a48bec9ad7a6a483350179", - "28c5aa8aef54a7115fe7cda21719e30186ea9ad1192935fd00dd0ebf2c24b89c", - "5bb1e4f2d2e35dbd2b04375dbdaa534c3d1e0df7d612f8f5f08c761fb83f2027", - "d0c0a17b31193fcce745ba665063965c68d5e5207b5c0acb672d7d6ebcb9d4e9", - "feb667f817193defe6d1e1f852ed1edab95dc30136261da868a6227dbc7ec3b2", - "2223d894d56024dd5de9e0c071fd9b92b4f4c9f56f0bc7ebe9015d10b089d14b", - "73004f6a2729b7ae0b507359e44d595a579bd83cea755965e213f924962e8e2a", - "736a66b917e178d26cecba27eb1a9899aa1d339bb2f5e13029b9eafeb653781c", - "ec84b34656897fd4fd84f1b7cd050e0641288d956e8549c7cf9c9cc0fe16d0f0", - "8d26b6756525ca2c493459a71073d4df3f4a6e19817fc08783fc34ce0aafde8f", - "a680dae9b49c865c61f14ac742562220db8aaa811f7a470aa5c8f32b547fee01", - "25c9661c993ccf4b2f626e9fac75fb2bf397eefd226184bac7483131eb3eaa08", - "b3396936d3ec870fbf46089b1180cc79ff1dce47ee440bcf6556bcbd533e3c29", - "3f7429c6becefe1e4fd8db5d00f502a42c30c19ee29c5710a644823f51c7c6df", - "61e5e855fa7646ca8254cec6f95ad65c3cab1e4642aa8409d401623423bff60d", - "5211891afb035269f0ec3f77726aadf5b20a5b2c03add3b8c815f4e1799e1cf7", - "1c371a4578bf504319a292c312b60eaa0fdd4d399ad394ee04f4b30af3b23b92", - "3964326871fa76a33214f153e17499d8a8cb0df89e0ec95f2b03131944ea1ea3", - "a6c66f9fccedc6392ba5834a7e3d058c6668ec516438eea6771126940724adc7", - "9a2a1fec3958ed72aa326d85c024a0b8aa07ea0d80867030aa15e2cde6fcc9fb", - "91cf54f23d9b67ef4c1c720933993f75060a5c38afd35c0bb6826c5bb0c9ef00", - "734359f612c045ecac149be5f56529c3f4c1b66989ab2d267aa897ff2d7f6f71", - "950aaf2f8e13dc747684cf841fd17c678728f4fe7668d9c56858225d03ae049c", - "92b9816d8b26d481b522324e0a289fe1a954e53e1d4610eece8ab1ba120ed6f2", - "4ec8948077b8bbeb87b6b9aa5ddb5e40f26d0d08833975baad54167f4b70fe8e", - "0041086a1140a5e63ec98fbbb2abdeede1125c169279c1082a6ba6c7de664955", - "8b2613e891e753d29cfe7adddbc3ea8a7fc1bfdfd982611bce7e2f843f832764", - "d00e03630c160cd7a6cc8809d50f4ab3c98f23d4e93f565959f82d900c5a1de7", - "ab50c337d5b6fe64f82e163fa69b447ffdaea1a2e77f7349e2d7e598f23e7a60", - "3fd3ef5b17624b669039def465993735db55358adc7e272065db09befeb392bb", - "deadcb4fb149813e11ba078cf587c7cc273acab9bab699e5cd3a2a54bd114221", - "df8f56119e28edfe3cb78943e192c4acf1bea8f1eb27631df33fa406da6aea8e", - "a503b9cb4f5e0c9c5211e13c4b08ff27bde6f2841baaf9f5489c604977670647", - "9d8163479f660e29ff438c425f68b73ac08247ceac54eb5357bd3615e365b86d", - "053903f91e45e2ac6b12a0aea03f2a36d71901240d91dbb9320ed725c536b901", - "c6520ea76086f56c88b2376c91659b4a44062c016dccb069a75b17a16d83591d", - "91251e8835478ce89871a57db888dbdafe516d502da76033e3435b842ea9b3d1", - "11156aa4014676a57c576ca708464402c33738afd5228bc9696307e60e15ee64", - "214290ee2199f0cab896db25128a99772e04a0442560a0b91f6cd83b5e35cb9f", - "03e12ad6ae374231b7bc3f4bdf2d7311f59ee10c871829476b372c07cf4c06b9", - "0bde6ce8dce6e423d7bdda4cb0366d22d2e664a1906be6b8ee3140d9f4aee987", - "37d7d14e58aac55382f3cebf31cf4e4f5807646a67785ddffc588b80b370b7a5", - "d3b31770fdb3dc6f6415b25aed9d06d959a50f7fb5404d8e5b687f81d5ee494a", - "9b657a15ddc2f8a0103b81884ff32fb1780ad93b8807ce5c4133d0c4865190ce", - "8d89fb232626c5832f683e48c868824d39c1c486f5f7a4073473fa2dabb2d9db", - "295a05ac471ff89cc3722430d6e411f226a1d65cf6118ad0d780b33a437d9fe5", - "f90570a9165c2283b0fe04aa496dc0d43d1f9d16248892348da0fa32e220a647", - "8c8ab53a8698eda2e027a735506e94b4593fb66056f75daa0b2dab8136039aee", - "c1d2301573eb10609430c3d153e8e553f1c9cac0da303652d6e6cd60910ed8fb", - "51681d5db7a2bfeba05c1c362bd49e0c04050e91f63a5902342668bdb31f7b33", - "9d84bec1613cc8d1816c2140d8e76d3edc96eb3858e77dde1f5434d980d173d2", - "9603ae5c37290adbbb1f941a1cada67e8287ccb90c8b0418fbb3f7276a0d6c55", - "2720802b8a1c731dc6cf639dc6b8874afd00479c0bde4ef86fc0e005f7fcbb57", - "a2b60018f8d2610e973ecdbad537570faaa089e012abaa7a50550bcf8b481ffa", - "fe41cdf9a3fb8a9c2e8d5186863a35c9323f06169da04a3d8e53fc49097c079c", - "7d0dab4b030ef32457bae55887c6442f51f713512eaa0ff6c2da8ff8093a0626", - "df96a10f7060138f72df3cf2d1464af91c82dee3fadcf77b1535a0f2038ff544", - "ea200acec8b3ff9b32bdefd4efe8bab88e3bf3e6d907e3001a6c2e518151bfa9", - "21b7b5fda15a8b26f3ca4be6fea9e2b210071a3babf6ec5ba1adaa8fb8d80e0c", - "6bfedf5cbd54c4bca1d68f55cf0dab86f94fc0aa7d5709d7eac6e5fd0088bb9f", - "b7d1e0381807f7d8378121434d8ffe18e42682923c00385b5705daae299f6511", - "ee817ff6bc9f513935a6e4d4e8eef9642864097dde662c7103447ecceb72dcb8", - "2e732a7d6449b45c126bb54a24f67eb8a4e07d336bc88e4e01fdf1a8485b16f2", - "bdc5a7961267c41a960d1d58fc456f8c81653d57916e350b195b8d07068dd345", - "d27af689364b33f39dc42de528c2a1720052ae5b7a7c177c2882a2f7527033b8", - "bd6ffa85841e07757bbbb901614dbfc1173011f7134683418aa32125b5b469a6", - "3d93c12d9c53be9404855b310c4eff4ec9fd74684abf89adcf6d0b93dbde1bdc", - "7720650b43c0195de75b29afed4bb07895e8b29d4807f3d1f578c173f20dc73b", - "cc7d47b93dc1dc82e17cb94e798880218af025ebe156efcc430ff55d0a03d7f6", - "c66a6fb957c644be6a8c233d7dd87c282562d94d908e9702ec6c6160bbd44d56", - "771bda83fb9088c735ab04fa5d919dedfa92228146f44ab3c7d0b4dba9f0ca94", - "eeaa639f44a7a535f4ee9ead842331c7e5a1683285a800eaa4c46470726cf848", - "482d219ce90ddc30bfec16cccab2c325d3727c0e926d2a91e406701c3eb8cfe8", - "5cff058ae1563ee85d0d1e5ab0281abfd8b3ebcb8ed4590db16d474d6146131f", - "fef6ca3f83b33f41d14ebe677de228c8660950f4f03f209980d8b666edccaa38", - "f46c247b24052379d09439a4c74199e7ee326d0ff24182970a355a2ab247ce18", - "9f205a4c7fbc4726f0c398eeb62d9e1e2d156ec3de1e8981e1f7eac045e6065f", - "f9c0a6fca62db0f5c1ab1d1d9da8a8a4338c9aa4b8a48b810d0376ce1854c0cd", - "3e5598f49aec36b361486761ddb092266830ebf35ded10ff462974246dcfa1b5", - "5ce3770f2d3a5c213410fe4a0736c7ac0e9df22d208056f043174cd706bbecee", - "4cf3aac39d496777d96e31d2454a4c556c5c64c6f7821dc71cdc26cf54b2d45f", - "27f5634733684036ffadf4f03a409a80c2fe534b7d63b72adbfee82c2b57225b", - "e042d67ff093f12b26f5f64af1fb9c6b5fe3c05515ae45daa645e86b331e1ffe", - "178502fa52e5fc7f24c04d4b7422752280c3056a306911c7924846123ea402c4", - "00a8e385eb56f461f0c8f0201781bee33ba8af5f9b8ea69fa4a4adc497356bcf", - "a64e5bf7531425b02f0950af91f560ffe8febd27a2b1db4a404887e836d96686", - "b4e969b33adbff61cb4b28edad0710a563acf8cacff7cf8fbacb9b7289b38023", - "1e6512add74827aa28657fbe722e1591d744977b3f7fc13066dab187d5c3a9ce", - "6446e039d18ae28480dd9b25be00d25f20c8cf9ea5d05fe6646eb794b3ebdd28", - "18b36a98b02b5df37ec40597ff61167b6ff9fdfa5abf628664031f55603659e5", - "86d10249fa5c029e69c9a5d5b83a437dcdb3ba4d42cf1e4cd967d100b3f7f154", - "0c10089d998a74fd90717d68b20f399a6440570c099a67d897d39eb5a4306e04", - "ed009efb8493e7687391be634f9816571ba7498fe4a52c8668ea1f1846f61a53", - "bcc90c689766c1d26b3d0e6d60ca0452967d5922b75332883b7b9260abaf1683", - "f8b13b67ea8260e5023369acd168e0471d9bee75c9015a75e711538203a3a1ee", - "bc7a651d6c8116ecb316ef87ce5675e742b8189ec4c686fca20535da727997ef", - "2ef1dd197c7540d9c8eb1cdde7617d96eb0b25a4768f52606558644ff43d5403", - "ad51f949752f234c791a5f37f3a4a3636009dbaf75c372b1475a8653b79ae848", - "6741529dd3d71e164724cb331a6f48320e68ce76f68cdc115d1e4bb1176877e8", - "ac23bcc610e4f65743d23b590156154c5b371fad048091e32e1284bfa25dcf57", - "8085d4b0518e325d5ba533c6e27f5d13cd1fa824b18569c66b1205603229d1b2", - "d96b2456bf18e79b67cb70695be7e17f7fdda709a1a8d2a1141424ccde327c0e", - "3bc25c1b8f5ca0eab6c944ee1dd1aac24f67b3a9feea7c9fe5295d6944cadd57", - "884331d9684f809bbe91d44ccbe92df44f4ffbb4fbed8f6ff3d5d3bda61da04d", - "208119b8e2a308fec6b6709bd5864adc99d7e109d6f92170f0729b56b4596dd9", - "aaae25b82a1daa1594e9c222d827300ae50996276b5c7adc1c680f9e259e9900", - "eeb6e608d0ce95820d54d219defd2672369534d86de3582f3d74198c21c359fb", - "c4e65ecc97ec31e2df604f7cdeeac7e659cd685dc23f6878bf64b03cc6528567", - "a82f5f3e2212a2826218d459a01409acde53ce6fa932fd1b388b36c999cea5ad", - "6bef3ed386b540471f5ebbb11291af356f4c02ad283e333f63fb6bf401f53249", - "ca889a6deabd9a21619f8f58caccd55cb2730970180ff0dc1df373e20722dbb5", - "b5eded6865bc812be1600677e94505907085c35a22b04b30ec35e3b0541d3860", - "825cf133169258443de2bc48193839e3d31c5b37f361d9af504999db230e3a1e", - "7f1f5db1a7a78e5f40da417f1df0b54c66d5acf70dafae6f057500705e3d0d3b", - "33e9f3384af0708660df971ceae40256d8429508e71f4dc181d24f36dca6a8f7", - "48771b4bcc45575f946e51f75a6471de4ce1234d27a74f0f68058d622505099b", - "33227518c8b47baf9302ae655641ddb8f227319333fe2a045da435c41bf643bb", - "6c6653b69fba06202e2379b105f1203b5f916ab116ff11df1923c45818190f68", - "cf48a2fd82244a1d704d0392d4de6a035e4444e8ae0731e4be88e51f44ea7ffe", - "92bcbe5050c54c787bc01fb3f5d91339c90d2f07c304279afae85e336c70754c", - "973cdf353ced7815002e8beaa3d62090d4202e5de91f4900229c43201581cc25", - "c46c15418183c4915082a2eddea4f4a9f8454042781e6888296892df1c8029d8", - "d3d72e4df292e0f81c571343fca7e9a38250475f2162803991b2680775d54323", - "9f3e8f2f20c4eb50e6c13c8412d3be18a78311923c37f0b16223e627a5aa460b", - "537378d10fe574c046ed75c9ca03da2d958dd651ee766479a520f4ec83643311", - "64f2de5173b5d54fe0758c65bd140a3c731a91fe7d674a2a5c320337c8470c97", - "27caf42491d9547fd587ecc173176259ded9d79b385a83da8e397413c046515b", - "dd342ceb4bc7e601091b21fa8e5158b0a0e5d5debb0c3255f57eec63f606ab92", - "f8f6314a2e1dbff3d795d6fdfa5cba3510b469b111434914ef6e599a41117f86", - "9118c0308a057c46bc62e649c0f8519cd217f2812693e5c0fe9c94097ba2b58e", - "43caa530bd7cf0577cd534fcbd5c47edf7b11ef85d7978ca5537189026f65896", - "66a961ecece083d922d5baf4cafafb62fb7ce6782fb596552763a898660183ff", - "affcbe04aedfc4ed06b9fc9adb4074765f8fba76673ea62852bd92ff7026ff69", - "06087311d94a22867470e3919677a02ff084b3af1bdcba2f8fa78c059b25aae3", - "4b53bac749148122e642635760e764864f4ae02430dae2b0ce8a0719af8c7c48", - "7e156cb5a7012276126eedeb0365957986cf559b4cdd454b2edde4337a42845e", - "7de2cfeaf43fc2a97cf11377a51937d79183829f1a314678acbf6fdf55c27618", - "051b98e1a026a084cf4b99cd4005025a75f6d1f9fef34899805a8a05934f09fa", - "cc7940c3c19bed8d8156c8bbd797eb210c0711c265b85ee8b131648983e2b00e", - "e2a48de3d3e31ee48cbc422205116a883f2ef5832058e14bd581916ea72ee923", - "c8eba7bc2b17282ae956a3a789ab0bca431c37dac3a380b54e358aee3a9e2856", - "2400149de56210afdda54d3db16b4e3341b472e927ddc7ecd52d19b51874618f", - "1c25feb9eb4f96eb3451c00d273e063e85e35152476a231deab3c0dd12130faf", - "ea739573c041c802e58c1134c4859d0d0e6fa99eea5a12409b808705e5bf395d", - "c0413a71474e9b48705a7445c0720e3ff9687c746ce14efbd918faf8bf324c7e", - "1e094823c851ef4e60ec0d5c3f3289d7b0e2dd8d9cdea1e92235ad834203ee31", - "5848f138946cf0403d6cc250022ed33dd12c17a2085d240b91cebd0b723b4828", - "bf710da575852fa83d853c8ed3c18e8b52a4b1b23b3235a048f7b66cad022a86", - "923756ccd1f0a5815421b76d2bf1ee887e7fa08fca80a471d16c06741b84c9a9", - "7d768c7118cc1f3ad7000b42c9f55474dbee8cddc64331fc3fedcb42af369847", - "3b89956e88c1b66623c3fedea418034b16ae1c7cd9d588bc9a253bbf11398a7c", - "335a40b1f1be0fba88f5ecf678272f847c93161da4660096daadbdc78c11fdde", - "70b9da448ff30bf145d9487506c4d658cb7c8b6d3b06f45e5bd3433b464c7ec2", - "38e6a02c0c00762b80b6957332e909c212b51eae6ffb493fab8f49b0376232af", - "badf046f0ce961328ea11d5b6b98fcce54f2db4b6ae4dedc318910be089d8ac4", - "b3a8bfb63e5da4d94558c57287f777755cd3de90a778bd77985d7636a6b65e4b", - "ba446e71cfa555d11fb087752bb7e9a5e9e4b83b84e7537124a01c36393ea086", - "ef72cfba6c3f17148570c08bf7f675f91b1762e118efe7bacd86d62ed8f7181b", - "6c8fb08e16553bc6571b5cdbf4c7f899acc5324813475e1176c6fad27633ce0b", - "24e0398dd59539738b9df929d12a6e42d995d8f3ff64a6d6e897ae158b0e7c37", - "bdf7eb481529a6e2375b4f97c9e2119877562d9cace9fd76d4b380ab10542599", - "62d1edc89455704f1f2770c3ccf4ba9b59cd59ca92da10e03a26c9e5a783ffb6", - "82945cfddfc4342092adec58f939b069126b31e5fad37c1c25735956df279535", - "b78d630edf95096fbbf239103af52a66857786743b5a890b46bdf7b0a6301f2f", - "509c13e8c410cfd001eb3faec45321997aba9235a10d98d06adca84d4e193b98", - "fc0773d59e3fd059ce4f97be2138246802e28c3ec86ebfe23cb9628b2e8ca789", - "3687c3a83810aa2fc95edcd0b86f00ad8552ab04cafd56547546588b529726c3", - "99531b4c4cc8f87fbbc0bf942e3cf4ab851b59258734f1878b11f5902afd3952", - "5329ac18bb86ecf1b12e23d52adfef817cf5c8aa36eb184bd12965181a9ae0e9", - "cbbdf3ed9838d24fd92a83b86d7313934dd603b499aaca1b465629c8faa6a8e2", - "9f9c5a31ddc08e327a81c9f69bae1147da0e9bf6a0c5c1dc3a1f519edaddc4c4", - "01d9f30d2a8a4463523d634e9545532e2ffaa674fea83cbf031ec2a6012cc90d", - "24e53961799de06103b083fafb08409acf68e89e4d7e4018c0c7d8e0b487059a", - "f0e126688bda3b1a8ad5f022c1aeea595a2552b625a60404c8afbd06bb762c7b", - "4308d7869c66dfdc8976be2831ee9cb2c7c2673b0f03bb7294b34aee50872e41", - "a35043bea5cf6a3de12e5693af38c00608d36c9fa8c8fb7c5477327428ae0a4a", - "13eda9838de4743eebc373c77abaf4925cfb32265eb710f3ffbbe93e6cf42652", - "4eb2ae93440ea0ea4a403d89795ad230282ae05baa8c3f06943f59fb0a6698e9", - "f9fbeac2286df9a23cb84580dc34c27a1c937f0b5255d11943723e6766754551", - "d54a86576467f32557405e3256b6f9a9c8966b628d12758e7ef5a827e3f2d3bd", - "97465189e83064833ec9fb5ceb33a0747778168ab8d4723062f08ac693dab2a1", - "579759d28117ef32951d4677e44d053764d72efb547b8f024576fd40fc7a4c34", - "de1d938f3d3f7499559065d30ea64b77e437187a8dc62a613fbce41ff90c822c", - "8a8e29adc8621ab4baac69f94199df7f1e7d1b8cef5c66bc712382eebf63d59d", - "9daf152db7f2e244f98e4d82d3d6f6044fb3c8a58f1cde3f386e37f0b5a4f45d", - "8f3ac0e717f2407900ad289934fde2c9ed7c1bc093015b1485ee95abc58b76b2", - "744ac2f923b2066a9c0b2d82413d36cdffb44d97e2266cad231009f38f7c5f62", - "62594acfa33e24a588db76f7cc9cf2c9e9378409d59a5eae7e4450ebdae6b0fc", - "ed97ee9d10911263c93bf8fe05414c8b51d4e7e8a07635c678eb3d67babac61b", - "6d0d4fb6580360828d5534424acdd51e000080c0f9c0d6328f78dec3a6870fba", - "f1bcf0f9e14e67c1a3ea0de0ced35996e773631c3698351c06689f3e8d412fea", - "9224d1f4a72a629d4116d6bf84d58038dd032b4f07b2a88fa394c6d4938f8647", - "cc126682a56cc304aa4f71d99b604d89afd47bed9a1f0b3e10aa39584e94d135", - "049ef5dee59b27f608df7d9663cf9f55826dd388fa97f2d0edc4ea2ad129ba82", - "7a159f24c737d27f7cf828ddc5434e4d595665dec16192021f56d29b227e335c", - "e8232a3daf3beae447ddf023dafa533f3ead0ba456817a9c2a5da9a7d24e7222", - "0a6459f0733b10f556d8559d73f480db6b938b7a8ddc8fe6fa9d5fff1cac48db", - "16b614f5c844dcbe396895954c5061f243fc6fa1fcb414d23ae667f92705d98e", - "9de6d692c1c88192d0ef8af7e4ac99613b917e37c59696ac840b7e76a8469ada", - "18fd31fd6586e52ef35851dd282a39728c44cb8b02822a294cf5db35f5fb1048", - "9171ba6dbd750778177e80e62fd63c37bf4f727c6e4c6f4bd46d8dc62748e1b4", - "bac9696fe0f92734fc7b6909578b1af02e6db9d0207b4ab08dddb10f576f0127", - "d609604bf39589c98fbc8c7ad99cf4946ed6cc1e75846f67e740685c4f5721dc", - "eb85d9531af3da87a9b32af4ede9d8a59c8bc644af6720b904fc47f198c34be8", - "861bdd0a608275d773af5c46ee73ffcb0b46194b2b39a3a8637b9c382c0ae3ca", - "9cb3c1b103db8b5ca433377103c93b91efec96f6418de159d98762735f45a2f3", - "06b14353f32e3f07e3bd0ed37b07433ff9f1d0312a96c40540449d3cd882c0fa", - "4b20ee84e62ceb50e8971668651ce8a622fc4eeb29763f85308785165bd81855", - "217e1cc917de59e195a5be5effeeb010ea973448d3531b81c6d0993d012569de", - "911bc61895c88a30804b8c26db97643c7ffa31e7e30969f3610773c5fd6e95a4", - "0a6eedfc47d3d3199caa3ecde17c16f9df935b07ebbcd7b4947771db804f7c1f", - "f67fce9ba5b47d2a86aa972078a88441d5745ddd0490b002bccd82a1c7c086db", - "bce178860d380d47a6c49bd0fb61163aa9949f9844ff45d4a100934a80c53caa", - "9e4227df9a35a6bcd4830ecadec4ec0106222a0d299fc95671345dec6f78bd02", - "15cc69536618006a7965aa63c205d1fc77bb758754a2d563a3b036e37c6112fa", - "2d32cec40f440b1039f0760f8977319b7ab8c8495d9a1ad9e6e39694f2023669", - "beb097f855bed39fcfbaa0f48fb128e7eb8bbb1dbcc235c7dddc86c703e08dcf", - "875c0e2d62b5d3bcc04e56b00040d19b1fb6308ff7cf4c3e18018ba01daaddc4", - "aff6081627f5db5b5d49a5f9658605283f94292045a520dfed0489d9cba4ab16", - "2df3350aa7d947349cd04aabbe28f282955182c3effa5b8ab89a7b42368c3cae", - "dee8a5f0235c8e8cf9a3407aff30c3fdb98b71af2916cbc985b184d77e620ca9", - "7d9b00457c92fbb5bfee8d93f9fdc3163496fa43b6efe25d124d55f47165247e", - "70540d38d38b4c4b6884eac0aa16b971f6db1fafd7bc9962efcdc461c90d03ee", - "8b6060201e2fe22f188912ad7d3c6e2ed7aaad433e6d4960cce0f7dd2c9a8ebc", - "2a5da2961bbb02c8b2e327779ba5d4151de4e158b1725f2f7e4ba3d7355f9c4d", - "a085b2b9fe3ab3df042dceeae99eaf76f93507815456632c55db19d62eeb350a", - "91484de731b9049974356527893bdba64720f5708f0fc3ba2f481828bbcb3620", - "c15a4c37a30f7943ab1d2c95af90298d0b6deafced5204f070ec884fc51c0d2c", - "d5a9ce74c8de928877c5e2cc3dc67139ece6b77e8144f5b58e26fac3aac4ad22", - "a0a4ea8e7c46ef36929c0d91ca5f30cf38f5723e012a7f35a78caed6ef4f6f37", - "7cb30984ef25e52be29d3233081134091abdfc7b53a0e683f2f3cfdff808f09c", - "38896620e363e3afd2c5579451b317d8791b39ac2817cabcd90049bd4c8df3e5", - "5c044acc60ab0676285dcdc2ae4409c489b28f9309044791b8fd9dda3e6131ea", - "24fc4404121eb513e6bd1f974946ac0b895c3dfbd8f16d615a82bd58862593fe", - "648bfea15f278b46a8a9c6064333f1e22ce1574ce62c14cc11e801d62183a3a8", - "81e92a290848529e0d88db4e6bb7f49f29b2247479d473b172f99a83ed16488f", - "356d386086ffd72fb1f0ca4103d34fdd09cf7804ecfef0e60e57e6167930e70a", - "d7bc978a3c415eef20ee9316ddf28a97658228152606fac1280dea0f486ba6e6", - "2aeb3f906fd90aa1a3a29af06e20528eecc3d8e8f9b584f24727d7c84d783680", - "4ab9d9d0e84d8a391e6cff8255e6c90e74d5088cfd9f48f5b29c0df0fadd61ea", - "23498d7c4ddbe3d5b3aed5900b8ce0dcda79e326e233b04ff8ffe71ceab85675", - "cf7a258810a737d7d6f9bb35c2517d40b04524c63200cd324434894221a1ac1d", - "6626b661a6560df08fe0d9ed126d3dbb51fbd4dff59253e9cc0b65308a3bdf60", - "a5de31f8f8ae2d1ab2b49cd0f65597525df71320bdf5a794d0eefd030fd8186b", - "1180d61ce0044f585635109c67d12e8d974a49da954d999c8d46c094db9975c7", - "3f3a0d3a3614ca9b4d8be9c0aa85068febd615c67dae84d3f528bf7e056165d1", - "22eb0c9efd78484ac6a6d7e081d4658b8ef7cea26fd054b3d4ea3b1ef1e477fc", - "8bec3359d2879fdf5fcb64c39048d34e428290775f6f56b514a2b5cd180af58f", - "32cf81ad9d9190295f45996dfbf3af4299eb708ec6a1508ee79de759bd98b2ab", - "caf039d519215764f1d09e154e135fb8a22d6482b6da189bc3080b267c20574e", - "89d98dce023e0e2728ea511e491b75359cdb0cd4a0ae392482df3fb8a98b5d88", - "6f49115f044883d64935f2a242ed57cf528729249b9f249cce8d93cd23600875", - "a94b067ce2d517de693fb364fc4c6a8747b30463eb10f5529140b25f590bdc6e", - "f75358ddc205c1a6a6f9d768f521763d9ebbaf454c59ce263c6b192b11d24364", - "4ee837bb6de4f5e5bc3e715b4eae110027037bfd978fb97a8fbf74f698eb0866", - "784e404aba2cd15b313cab2da3ce5b26b24ef92143d2f56dff90d6d1bdac7cfd", - "28b8bec6c2289b8ab0710ee6f83c1010826c0f3384f1cc1638edc67dd85d2f84", - "b5883f83e0ba5c0a6e35f42f5482b5f3311e09bb1ba22fe47e648803a11b2065", - "da73f8ed407082440c01fb1af8b9b80e5a5271a44b85c202df48972a608a9bf3", - "eca9ac8b44badaf4d5605451328870eec810f31db3efe48044a72aeff36d3d4e", - "e5889adb65caaeb7afad8e06d0089d72be86adae84649a8d5a1c31a0ed44b623", - "abddd1b7ca078690d493c9ef9432577f6cdd63f638fd78916a110801c01c40e6", - "e337b2c5be8748377afbe4c6ce9e058b963461a02c0fe33e69aeeda955253cc2", - "2d2efa6f5d8cbd7fd973afe7def004910ccbdfe3f071e8fca4713ad128bf7925", - "0c0138542586a33ddf9d54ae93d9e56e15fa66960cc4ce3ed2e67ce359da485e", - "d0c6c1dbb83b0102def5f0e3206847bd0139c9f68473b308d2beb0c6770e04ad", - "485962f2bb416ea32bb006a9e5879ea6942a71092b6bddc07124f2469d454b9f", - "17f1c4d856733511157a1e59661161f80943583718e86d05d43753d3fc86fa8d", - "7c4b57f4122cc6b4836378506c787b3df1a9c6502a699b4bebbc42327743ea7e", - "83af5e8ef39c9d457b6729e2f4abb242308d3e4679a5c51256a991fe544d027d", - "1fc8ef1102793176d7efebb8c873e227f234c75d1d122bf63676df712d1bedab", - "9ecfaa3cd1f059c1942b3aac92885df1f97cc578813570ecf61a5dd432858290", - "7eb400d07d68e2586f4e3c041953636031026cd80b6b9e2b3399fcdd4b969779", - "35797fb0941919f8c18b3fad177aa1496177a7c505d97df388ca1659b38e90c8", - "e88c4911971e84b36ee456a48be4f25af4cbeec255b24f625180d221dd272ad9", - "a4788f33254d980d3b3cdc036b3f43b9e2a479ed2e71417fc26963801dd4a675", - "422ab1db64c248e5beade5e6e89e2e4d8bf8cff5e16c75a0788e810f6ba0f34c", - "711d77d599b3e2443b0d65eadfb96ca4b93bd43ee5527e0036ee0f0f4561ffed", - "6077314d290f266ed4684bd3b951f2d9d692adcde7821a3aba95e0c4d9e38c21", - "68ae63f5bfc0b3c58eb6e5693c456c96cb0161f1bb023f1c0a5370f2d8363e44", - "8d5351b6192e9396c02e95458c7719cdec2ffa5a5c7af915f9a891ef8c09a382", - "00f903df840b560454d1d392b340987ab2c7d6d554c6483dbe3c44890802f12c", - "6c299005137c6c73e65216aea3a2d2ec26d599eaff9b4c3f9fdaa47eaa0873b9", - "d6dc2548ec8ed02ac94418153f99579fc389705cd863d72b26679f6738aac055", - "7e559314cc509a6ff9a712ee6fdb0804d19a3f0a5078d565053bb6c378089e66", - "2d35d99e8404dea85b14cd3191fe8c34889c5ffed074c1000a23db72b33de9ba", - "6efa6b22256d813ada02b875d529e95aa2775f72330897c4b14f4e0ccb39f387", - "26c95bb569e833bbb86ae06e0cc4e5bfc37f26f4e4e8261c0644336982dc46ce", - "f701c5d55ea65ca9a44a50c23b4ada94a3d84064244c2ffd282958cdeefc4aec", - "3c2cc0dcfa95f21f84ced1eb3d6e68eb62a267bc46b573e1c4be64066f94971a", - "ecb2272f40092e5d0056101e1861fff97f01529b81bf478ceb510f0e1c16ca9b", - "a8135a9ec8762e5fe786a1a2a728df769227593d6ecd11669231f02a7fcf8c02", - "eb6368570ea7ae67cb672467c389022cabb00ab798930ace8cde70428a325378", - "88d2f462b15a95f42586e4be02cf796a9e7de244f12590eb0365491e170679b2", - "30381a6ce5a94d951eca6dbc2ff4f082369d3a760d539168e8cc5aa5d80333dd", - "db3a10621fa90348f625cdc3a67095e9dc65ccf97ecb3c86f73d301f1527842e", - "238645ea4643f51e4bc1d33805b92952ca5c53af5b448eae6bc21ba282a273df", - "ad112f799e1ff580645609df9d3242aa4579a4a7d2212d2a2732fb27a60b98ec", - "8cc242a6fea5253258197bba5d2b730769a3879fc3391b1f908bf304542ed429", - "64e5f02204f0ddbd068dd4f7b323f7c88fb356f3ae3c82117a152166f4941d38", - "f33620dde757093ce6af423daecf9cb1a4359657b5129b1436d331b27be63d3d", - "6a1852f7e21b5d488eb09162722061f2ac0aa4664b27c0b03e0283b0c991355b", - "e4f3b7e6dd40cb1d0c0216c4ae792ff8cd9ba50f3750c497e9b80f1a89effa16", - "a605170db179f99dc2924e335725b51c7ab562e84ce6b6cb49e662ae373a8f5a", - "7441e0a5067a47e6062c4ea385e2f20d82614afee9d881ae7f2e6593b2437d78", - "44571d3d8982dfea43a61d591866c5826d0a61103d13236d1442b55bf6382aef", - "265b37a3e2f0e902b1ef54fe95d2173738c545cfc9a972611420ecbd7b47fbdd", - "09b212093990235685cc24b1f90128c61faaa1f52e3198ae2587f4fecf2a645b", - "a8195feea7befff75260f87f33da9738904ec269f60c15456fd2571068dfb7b3", - "1028aa5b68fc84505acef61a6f24d1f49a111fa15b53954bbf295954215cd25b", - "06fe02daa227c0fb043d273c312ace3f01a4800d0e42ec162537ef502c25b6b4", - "c24b1fd0bada12d14035e5ce00488727b31349a3e494bd6b77887a2eb54cd206", - "6dafe442523d52855fe1fe062a8ca31b5981a9fc8ecdb605184590d95d04d9d0", - "67d6e3f9f825fae2c9e9d837eead891f4931db716b1fc0996fb11c8eefcde963", - "ab35c34409f2eab42c7d2234ead7496fdf21dade8b4ece709b55acfa7854cd1b", - "0c1f37f2fa7429efc404835dd8a6ec04480358c92d13b45ca53bd20e0118bb02", - "0e23a2c78bc61f6e8ec9021847826193fd7feb06ed56634fb1f80a03fdd01a97", - "c8abe9b47b33b38eee619bd62027771905812a68eb697984916e958daca49f7e", - "912a0cc580e36213c49fa7dd1ad1a3e1ed14a04b8d3f19ee9465d27c52d71382", - "7386e08a894623d18c83e4f9f1ab7491c202d89535479f14d57dd07207e8ef86", - "359d1e366c72bc096f19d4ad9c2f9dd9903d0472f03cf44418e8a74e10142e9d", - "3428656198f8edc45bdaef2f67f76622bcb73d655ac93146f2857228238307bc", - "985f8f5a8901c8496d10137abbb73223e90183cfdd09eab6034858f885a91a68", - "7be05296ce3e198567146ee35a6302b9137fb0f8f483854a8d387ad34a33975a", - "007d59297790f681d102dff42f527435998b2fd744efc120ded7072b39bc42e8", - "46e858eaf637d0eafc2d853fd9ce3b626565d5ecc4a61f994ded935b54ce1e31", - "c6e02fd7a43774df3b8895b30fdf2d5276de57a1a7e13c2716c18febdf01da0d", - "5ac7f5a0db26c27ba092011ff835e510b16e991dc01db874bc2ae29e111d86c1", - "b19c02796aaa6cc26c2500d19cba7e2fb16d06b13ff893ba23cf137ea163d7e5", - "9506b20dc46e8a6a861c618d30130748f0aa9f97669223e581d8befb73f6f512", - "ce4e8c21dfbaca1a4695fa73f23e34bc9bc65422c737174d40498e665caf1b01", - "8670802da67915dda00e4d816689f6d0b8ffc17bb6e6dfe2cf857b0ba188e1b6", - "92f263f02300dcc61a09446d2544b5e66016abb552bd456b10765ada7a9af206", - "6d5e15e8a62399ad9bfe4c034058c4409d28daeedec2089a667ae7f10902d75c", - "7ec22a4be432655a3d852101178c2267528c633b19bbb9a82a74560f4801c959", - "ceafd6df6a4b9a91bde98fc6d1c0a7d05ac0a3a8d915871076ece364fc409d05", - "0faadd92228513071412dcd6040a21ae5ef4c7b04aac458100d5634da7f1c5ac", - "f7eb54fd67d223fb8b32d85569ecde2395025b0ec367e7bdd01f38d6e983aeac", - "87bfe4509bde4cdeb507d307859ebda39810348031104d4017f4d7373763f0b4", - "080429129554e89988198c8b12356e182bdbdc52256d111b068300619a9909b4", - "340a8db5563594f1a0c5ecebbfb842a88c7957c93b362761fc3319c610256507", - "4dcb81f73375bc5a1aeffbb49878f1067d1020b9092d58ae1526263522e63602", - "375862ae1deab2343554bef8aa706bc292c106d65b6aa1c7b3093bd7c2444dfa", - "08374441abcd5dc5b1cc66977875fb7f3760fab7e17861acdbcd8452fe1be18b", - "79ca87b3e92f296a059c48f5173a5a10b6971892b5ae1c1b21b542b6cf2b912d", - "0f3544d90c324c5147dc35b9dd77a11d7bf9374b7ad2382df97c707f43666c38", - "6fd8d2f8ba80402166324fc9bd2f1b19f2b6f965c5a7f16a498e9dc8cafb77e6", - "f383ae61dd0f13e5a83c3ca546c67157181e17328d27b2aac957a9a9b6cde47b", - "636712973b0306964b126d4cb582986906d9064cdef31b19fdb1823535a7dd8c", - "2c9ba4aa114330196a65c816c7603520e0060925a22d92b3924897ab295c8c86", - "61bb585da69aa59a31235e9367b2b242dd8ce407b836ff587d97dce604d3cebd", - "7827425e4f94eb085519652ef3009e614bbb175ac3e965ce248616ca6082216a", - "f8708571664cc3ce63e69745eecead22a3354416513825d3083e5ef46fd163a6", - "af9de5a652f38cca705da0ae2c581202215119c5daf8960bb146ec3ffafd0efe", - "69b7abbeb6d67f6e208ea921b5854e469e460386ad0d85eb2dc482516d0e3935", - "b17add0c564e68a487737bec945e32297271366625c2b13406eebe8fa0969e8d", - "f8cb7c50b13ed46a8b505a9f765e3495a1c4154c5619656f727421355dc06d22", - "d934f7035c9481c372f233c2d8a408168d787b5dd6caef8a85ad4510df19073a", - "f893461b908da26b58e8be8edd218f23cddc16749760dd2752015404daa46884", - "6ac92b7e2f089b2b38a4ba30b6606e24312b81dcea03bceed59ac1ff2f7e12fb", - "919df82475215502036e5f8debf5cd644ca4c2210e8fda9d71f7d4fa9182ceab", - "bf80ab092e60835a38328eaa675f4956261e87a1b2b6821f9759e4744d923874", - "1e55e814fafed2cdc12dc8136d5273951e95649c96952472a628a5bcbab5684a", - "58e1bb5e51cabe20eb0ac3d4701bcb0f4f8fa5efc4295da8e43a9a614af0cadb", - "542d9c5bbf328e8378fc66e04612bd2e010dcd10b09447ab89f7e873be71f576", - "b9d0c0e691e8b553d2c16821a42613581d2b6dee71f470235541750649cede46", - "6759be9b45ffefa58d79adf51e69712ccb8c980a97fbcf074542c50cbc45ec22", - "c3f472f417a4884357a9fc386aa5c24980f1311536872b5f9fd756ab6bf0e89e", - "5334b7b55ed95dea7786aa1de383b6ffb252ce0b63ce46122f78b29f75bc65c2", - "ae16796ff327b0de0a5678fec4d27e72e791cd83a62d6c8b32d0b2795fba6e54", - "cb2241ba8a8049eb207be0e3434a6e11ba45ea66bc8b2ee60300ec9f9e83964a", - "5680bc3fb100f98096cef7d4da607f3aaaf746f4db2491d22c82a2a394d0b5c7", - "d8a8bd3f9e1edd4a63743715414fbf788eb38ca1a7baf6c77ef49f225f52b24a", - "f82f4481dbc1385030a388fed17ad72a764a14e12e811aa6a7a1e0ccc2fd9a80", - "04bd80bf54d0bad93d0aace33237d1f19af62de14955564203f9f69cbdeecf2c", - "03685b176c458dd41c101df609144bd9dbf40acf52c2936c9d7a6b41c2a51f42", - "e5c03c4d3383b3563a7f5b8bdbbdc90b148ad577f744527c9da436ceb73b765b", - "70513eccbe2d385b92087e595a8c2bd3cba0e088d32e6a615aa8a501428e6367", - "8d26af6021bea6387c5f21e9b3c28be4c80eab79a5d62edcc351382ba2df12fb", - "9391c0ac563ab748791abcc77ed4f92dad18c7965b2f117804d603a1f5bfbf05", - "3fdb96a0716a072a9d8fb228b792a5d3d028565fba2a4ee21be8f6bcc8553231", - "09d94cbddb9bdd5a142ba05cc68b82cf6fd7bbe540ba265c6d418f2214f07533", - "ac5ef47f4949463f713af6c96ea8cfca53ea811a46dd4c0cf65cfe58db30e05a", - "a2ed7a54bed7e59666198bd794c26fa69f86345242da6a7732095615b1025c38", - "b813206d22f5398e2d2c4a1d9ab28b6b88c0882ec7e92668b6c21322607e8828", - "76646b2ff6973944c2d4f2ecf01c688513a53a91034a287223a06222408a03be", - "498dc042ed2220e9369aa2d142c182de4e6308d9b5291431b2e58b52bf6c7ed7", - "0b899c95583f59801d61e4cf42709d5e0f013579da113301858e68851661ae1d", - "342a8e2bcd7e5869868a224f31dbb2350f25ae8dbf31403dd046d03436c9555b", - "bed24a698a28a1bbdaf97c48b859f6848c2cf8ef0796a3f64c5fe6d6d29a925d", - "801883b3b7fc675b5e2de8a050b5e47d394791ec47cb2d3e34205ceb16154b82", - "9234b75aa5a6429b6f0f77261367a501723187702d65308a55baca459bb8f1bb", - "b1bb3d34038227d179af175a477a2efde76bd20502ef6eb363a67656a647aa8f", - "ed42c9b793a208750103a2371682961cbc8a6e5acaddaecabf8831b25ceb0d92", - "1bcdcfade0f88eedbe5dd766d808d86047b0abd16b6666fab10bc944347a20a3", - "973c5404ff787f4020a7e8a6a53d1504ddeb61b0a1c5366e011414ee0ff6c166", - "ff603b36cc3eb1053cd1609acc5f35e789a8e0d6951575321fdcc02a5359f21b", - "77c710dc39f7f0fc5f98fb51a642ce5ce3018a212210fc99754a3f737b748a79", - "906956ba4f35cc630decdb4121748153828a2b23b47fb19c917797cabd8c8a07", - "2ce6a72017a7b283e24843291023d607f5a9ce7d79c4f1c9c715c37a1d934468", - "4b6e7f71f7cf998908392f55b6a117beee20dfa0d0d586998a5a389388ae2e1d", - "3f1914a2a39470f1d5414c0f23822c630cbfd0f32d3fc3a3c187f46d2402829d", - "abd1b6460ccd87dcfb6e947ddccf1008f0c90d708a73e0ea8ecfbf5b423f079d", - "61742a271464dffb09d157dd649fba5accc6e4c21f5676b6da89b0d9ca1ef230", - "af7a57a9db953121cd1a7ead0aa62b63d067b35fb478abbb9112b22fc3401925", - "489f9e7b6f130525edaf8477bc2503d4658fc16454261b1322b8eace190f4172", - "5ed652a4cd738dbea9464d4c1a14f4cea7fe1b1c041a982b83c7765bda28c5d8", - "de189426ad1aba584aad610dc104620596aa26689ad07b298147f789b87a8694", - "7a0eed409fa4c11e6c341bc4d3fe4dafbbb83fd25999221786d8851fcac73577", - "09524e75061da8a7c605fa2a76dcfd0b9725f09aaa6cc1a9a34a51bc44a9aa3f", - "1ea102d692a511d380cc7645666dae9fde188dd27ca0f56325b8d59069304d0b", - "44ed50c5b419a8b29bca5d1c095035aec845261be3b8f07671ffff1fd95c49b1", - "ab28b7a6c7d0e8e07334f44c486f2c289e98a5781ca33ae42b4e2568bfaca73d", - "2142e51b3cd933392e4cbb1a18341752369f484328b0f53f9a4adc761127b4eb", - "cd8e9a12c9e5adb972cb06e1d47861f530888f4359b24b378d472761d62d6d8a", - "e5f6997dfc30ba51b96a3c6f252e7448ea0fd4f8a59a70289efd0e9ba0715252", - "df9d31f105e47099493656cb02b3412e1375fc1ff805ec7d73420f40b8741c1f", - "0c76608005ced3b7597ae9f4765f81a6319128e1ecfd56db3091dc6cb14c0816", - "4472d855327aa8a852ff14cc97e5f9f496274d149176c8427086c9f501739819", - "b6799ed569cd38be472a1e490cd897a599da1aaad2a023fee605ae6e5d57382a", - "a339759a3101fe381d94a85fe7135c4b41794704729f50bd389b0229d48507e2", - "f08f660bcdf893e02056d8434ed62b7089d447202c0d5a6b4c46292bf36aaaa3", - "0a97e4aa7cd0a30dbfd4fb6d363b06a72c07c85b0a7fc0ec20834f3ee4243dff", - "9dfdb3601e8cb20752e8f79fe456357cfa9cb46a0a3ddcb1ddaa58c9bb3bcdab", - "b7e2b8708729057a29d42ee93c5e9d5045ed931787be83f75bb4ce47a698645c", - "7322c599d181053453e3208600803e0b829f8d5884a6bfef7a6e10cabe4915d8", - "24bdc303917efc3e6b8c098b324b65bb7a6c42aaf055ec4aeddd386e9041bbef", - "d13c673210fa6a3d1e08c8d234d1726ab1d2a5f7a5c8babb5fe425decbc7671f", - "c4e0f13297e1b443317b1fec33fcaddf44b5f2575a1b5f5cc17067d63a2dadae", - "a802826eb1c40da47561476d19eb8fa40457fb331b8afc415fbdd5147242d989", - "648260dbce2d8c15651ed05b2517b0ad5faea3a077fe68c68e3527b5472d9810", - "f3181056d796dffbc28c8b23ae43dc2fcd39eb4c5a2cfdd6912d7b60a63b4cb3", - "40fdf2b0efca33c39d76cd69aad845e5875ef863f187b5035d4fd42500ee91cb", - "2d792559861acdbd684a754bf99b62b86b45ab930390f467699a08dd6336d8f2", - "bea665e36324f870f50062bbb4655158e34c1b0b00377a8bfbcec41b55001c40", - "553560aa21c9dcc868e7a05aa67d3a10e525a2ad4d45bab177431ffefbe7ff26", - "97f9278041a7d8b3d7e7ba000ab253b5afd525b9301a3093bc46edeb1722b220", - "5f1ae103c8da9c0c377f8359472eff14a706301423508974165f49ce69bc586b", - "dfa0d1c203ef61245b1ef2495219d75be10fbc9a0c329f4b7fb506a3ec5448cd", - "8a86ee1d8ac980253f160e8fa5bc3e21b98f4b8331379ab2d7334537c7e004cc", - "a9c1e656ed598a9d7fed832090050c973f7a264de38327cf3b0ec3d5ee3c2b7f", - "58da0ebe8599141775b8c87df814fdd7799402c03bc1199b27de58b9950a865c", - "77fbeb31d906c4d30b374a5d7bcf8b457b3717b21024c859c08a49082ad3088f", - "4555241581954ab4155143a2fa8506903b5ab632c29aaf22da4468c3da4d411f", - "1ddc3f9577d5d79dc0a4b12793e9985bc42d5b7b6201e13a4cfb963e81e33750", - "560cd0058a4fe9465949070e4a67816f4c24efe5529047844db1c1acc4e7e597", - "f3e2ca7dc23842b6b45aa8ea01a29719373d7344d3bfd4046b575540e1beabb9", - "79b2a13b68c2e8876f7232d815781267868c434c06584067603660c722c86d39", - "c575608bafc1ee559f7753fcd99e5f4054d3c559fa8e6d3e4e4d7fd2dc35e837", - "a8938e801aa5794f3aa3382fd62400be471749b044aaea0b85afcdc653c02428", - "aae4ececaab5654843019dfa52d533295200ac5d9f7426297c03d557f4dfc545", - "3d4de6188acb80434c614963cc3cc6ce46e9010118d957eb8a89928b015dcbbd", - "04d69a48c86ab5613e59d60fa1ff465e49cb2e9fee7cd7aeb5410275e7d0ce9a", - "af828cd28760f0017bf357dd32622db428e0b6522b7d3d071cd9a21eee1b0eb6", - "87ab4abc6fc8a7b38b600bb8aced1a62da7fd46a090dfd1b3bcf121abb995fef", - "7adf57275a829de4418a12b5b7612be74b5890a3c0f64510c8bcfe72e50b840a", - "73a3ace2af062a11eb9c179c7e2e38a046740dec6850ae92eb07f0a275e384fd", - "988b21dc231e40e34d48460f513194c9fc2a841b0d0e0c4ee741080a98e1bcef", - "fc74a4ec57f99bdb9c7f079e2ad17faf044f3de35d48b5fed094530536572e2b", - "098d28e816750c6ef65d4a325b468bb47289785066b885aa6dbece30716ce6aa", - "361d03456b99f1c86b69bed7df1098c65f82b7b5a8d1aff89c627b639f716148", - "bf5a66d8f29edb039c14062f1631c5336f5969ef3d12886759a837e92ec7c633", - "e5e87bbe4debd952107858bac0b16df7619ea9f83eb41278b8db2f539d9ea5f8", - "36680e9938034face7ab66a2c2b94072720809cf9b23dd17dcd8b88e98b83623", - "1dcd59f081b290cd6b276ade2391ba015dafe0a8fde7172f984d66bbeab1837f", - "e26331c9ba563fc3b494eb3e1d45bb5d01eaa9d6ae2c84f67c893a5f48997e71", - "03f824fbd818b645326b5e4ec561c4eadcc28b7b2ac50a0f031543a27367c715", - "efbf6e9ca772b1156bf0f1205777becd4dd86339b4ed279a0da61f3b24318056", - "95e1047f8ba4d51d257dbfad73d2db04233ebdec33129377fe5c20ff4d6ff41f", - "092ecf89e9f19181c8b57a74c10c8ff5b50bd3c53feb07a7b09d45ce3e528b0f", - "76860e0c7cecc42e1c5792d39e66d0382bed808dbbdc87770729c11a471a71eb", - "79ae3a2e3b3b753858770c54ce3edb14fff5b30aa31751f4d6f59be4ae7918e5", - "7f9870841fcf4798ce3df01ea21f47caf91df594262e38b74e9b9199796b7cc6", - "db2431b6d78cbc1c2a71dafb19d4fe4aa2f77a5cb1f854b7620f79b7fb4d64ea", - "110da6a89d81f95b6f992b605b6e8cb80d68e65c2bf1e51904fc8752767dff46", - "9dbc8ae2e0adf80b9b31fbd619de1eb0924e2fd3c335c51cd8955957db2fa51c", - "35b4598f32273db720f6b0444123b50a31aaddadeadbb775034ffba39472f135", - "9058290064ad332a6c482db8aaac8910277037ebc43e463efbf5134f287db4dc", - "cb7f6b8d7d1f1634a56753768ed70f024cc760cfab7e9af057ee2454e857fa80", - "58f3abe5a08c348c549a874821ef2d9ed89bb78ad551f5cc0cdc4dcf146778b1", - "a36b36e6324aaeabfceeb6ffad4d6906ea31b01da99920f44a67c0b7c97b825b", - "78f964a9e5578bde320364e4c118a5ea963bf949aa0ada61bf6aca487fd97274", - "55348f81201fe4d17bf48449007422d0e89717dfbead70f896e50e3d74b6657d", - "15c8461a1c0dac81fccf123afed4a7c47b4015613b3e0371d854f5421c9f826c", - "6e7457d7eaf72737af910f57ba0b6ffb5adbc57f342b496c4a31469d9172540d", - "31cec06a470cd26615db53a6752985559b56480e1833a5ac555b2d10599e1f07", - "5035db8614dbc8c8343393aee53b81e4e55e415d9469ca04ba7c0501b01ca45d", - "6fb1061bc56aee134e67006f8681c0768a6711f0e00824b045b39e3d19cfa896", - "391f35767ae9708e92de6177c615e6b9e5ccf97bc4765903bf2ae7975047de35", - "02a126ecf3b50ec4c5e9888d606886659bb920ea6d4ab31c93a05c7cf202cedc", - "dc23cc57504b5f80dffeb0763e93bab8b8f9c5344cae76f9b79d2cab1d2c5f32", - "e2c53f54cfb81fd50c92b71b7dc420fccecf4361750cec3a8f6b79af167c34ab", - "4a2868b19464aee51509a08bc97a39a53018e45e0d546cf9bbc747b946d9441c", - "a2dc5ffdc34892396ff59abc64d7cc98a8e6a44d3f88c9403a277074d89e7f41", - "1aba2e851a79ab30258406a8c87b804fddcff9ea312fe7fbd3c84b2757252501", - "cbb23b5b7578842d1219ce560f80c6f393fa9979b575d633cfa3a4d4419087e5", - "353e75cb12eb44f802749887308c054dc2607ba3c8d20009e1386a8e07a2a392", - "9ba5e44091778f9bee3840acb89db4a4199129f1de926594d9c2e170656a0a38", - "66f621aeb4273a5e8a418d5c4c0ab448329781cd0740e5f15d346b24f955115f", - "b6fd3eff7ad633db873a98219c38689aeff877d9534d25cc1b901d57050e5977", - "d07c25a4082e72a7f7b5939cf471886f24913add5becf677cf99c9a4d9346550", - "3f3648cde03206e014e0e3bbd46cef4d08e66ee5aa63b5a0147e3014b4f57e27", - "3c05fa755023b688c144b6c6a665142a19f2b600e7fbde63f790e3c5218e66ca", - "77df8c95ad24d58fcf96414ef81d00d35643908458da80966a9519233c6a781c", - "7590bee55ebe046f317bf6802475f01db86db99dfd897143c79172535320ee27", - "715fb3729821a721c7fba02bbb42f8664ff137fa052de27cf7ef09d3cf29fef4", - "522c8fa9045d3c931f2289d4aca92a90e9d407394e9f91cf600fddde20c28748", - "aa906d63d3c6b3d0cc6212a1c513e18da7f32f2e5516ac62b27b477f9d1677fb", - "7051f13d06362478edff84402afb90f9842e41d805b4984d0a9bd8f89c765c0e", - "669cec3b8bde96808bd9260600c75b2b34b1ba02292108a736b40c61820ff682", - "79d5484020bc55d1eac02f4db73b65a02ab2b4f9e21a0fdff1d386c7612d6878", - "a497332d446a9bb30b5ca17931c6c4d2791ff8818866d0a5bae727ae8691fe0a", - "72dca5f26f617eb38ed25be811d24803dd0fa6bce2474f94ed3a20e10d0e7840", - "7d4e059a8ac862cb1b8bfea65c0088dd24bd621376e4c6db74cb7abf3c4021e6", - "90e7da184eef35ed444f6ba8db59d0b0f1cdeb16c73a1b11ea29d1e0f529813c", - "d743341876d4c0d0f24f9579ce484498abfd520632f9af4cd1db952b01cf8d4c", - "106f8b0aa12f1ccccae364f8b7b6cb64f2d8a0dc80c3a8f03ae6ee61fc5f5539", - "72bf5256d4c4405a21a4fde99213f1c1b4fb527871f5db2d36c9fdd3fb02aafa", - "70a5c8bb92d56e2b234bb76044ca6cccdb3d4a8c047fe7b14d6c251a5ee1fce1", - "0052c663caa7f74280796d4f2eb41d72c83d51918dee5fd2a36a9d45ebe7ad2e", - "ae6d1efd0bbe4c023128d221ff8529567570ed78650c55eca3acb856b97cf7bc", - "3e5894f2d36f1f2996416b763397a7ee0d232c710fc3b34af5553976be9231da", - "9b49d4a0c9f60b56ea9f6870f9578b5da396a8050f89b459b3f512424b7a6d47", - "a54eece9df62d1821c7a55dba62c3897362f3ba0aef6d89a68dd108fc9deccf5", - "3b6987d3ad5c4ceb9133ab63d1dded49be6d32df48bc4920c7b5c87a5196eb63", - "519376a5d01f32c4becadb81b1f50aecd53f83f91e80e7bcb23106002045fe02", - "8e4499eb0372cb97d28e0bb69a3ae13d0fce2e9a43fe70d98206e94ec1e0a87b", - "d2ed5c5bda1625b9bae0f9375d34a6f3670094369dcc40716a15693fd8f47878", - "f2b1dfc1b738d03e8cc4ea58328c9b8f8f7d7ae42f1bb75ed1867616974e1ae2", - "d278ea88be840fc256f311a9e3f8c50f1590153607d6db717e7d03b10de145d7", - "b37c7bf508d4f609583258bd36b403760e0205203674d5bfe5724ca4d0f9f2d1", - "43b6539c08a4bad5383fa7097161b7bc48ddcb10fccc10918a2b0afd38dd463e", - "5838f91ba7440c86b6c66b5179904d5269638c0246872021cd4e6c09ac6fccdf", - "cf8ba56b29e42a0cc3c11bd2c3dffa23b4caaaebd9bdaaf9aacc42c4087f372d", - "3fa25ce2eb531714babb2125f246b7a1b11d054735cd34f6ab9e4c15c58ba413", - "9a824e914a0d89c2974941a68ce4b9f83e9b4e473ad22a7e302b02224322802a", - "3ca25abdf2c71c5e1444757f06f5f3fa1f92d0dc60fcc4eed42bc57c96058d8b", - "8ad949776aeb59fa1dab726040976f8ef8fdc05e36351f3914f4608beb0f0342", - "aea355a9a3a3f4408f2c68c02e52afe9299c48c5cfc649df035a8b6df627f798", - "6a16d2ff714478b140b9b2119462b16d8bb090fb0ff1bc300ddea2233805ad36", - "a24e6150b2120b9a6bfe390178949dc73404eaa865081d617f3451bb554747e2", - "a7db9da453d04b1809e5235edc2b1ba6c7268e4dd24103a9b2b10458fc337701", - "526f05c57669bb42c68d070f9e4d67a9f39aafaeef050566630c7aa65b1d7a38", - "42bbb521f844ba0b5d8f90a323baecbccfbe0ab099fad5127aecc3c724f50c2e", - "c5f6c680adf5eed87c44971e676511afc286f2ae8ef4913a6f353e505e4b66f6", - "379e489e1653a7b0315bc9524dab5fe8d11ea30e1e291155bb0e4cfa3099bdba", - "d094857ae54bf1b3b7bdc02612acd373be72c22d0618b9081a00a1052a7e943c", - "e3c719d55dffe474dddd4007ede9c06e17f185ec9028b964115b01cdc6545ac1", - "7ae4826a20ad324a9fde80e0a19f0ea9c6bd5a07af5cb11d8f0ae297f9e5ab3f", - "b22a2d10347fcbe356bf7d18bad243c57ce13672b2ddd58418b18ecaf1953318", - "b2ec8ef146b9713ddd8f2b8761c70cbcaddecf10808f97a36440148213616fa2", - "2485e47516925e7160dc05eb362d26741ff4aed866fb61f5ef474f0900c7246d", - "37198a4f6c28ca41af4e2b55325640032d3e7ccac4cd22f8dee5d5d3d2e9b2a3", - "3d42f822d71489544b153750e68869155bd69169cf196f64b6a84e49082d2dcd", - "690e482a2024ae606a6fb565b197c91514a94aed788ca45a7501226c9fdd248f", - "20adcbe7a033156b1d5441727d1e30bb189ed4487be353f4dba564840dfdf70f", - "85a10fcb9432907033876e5baa31c07b61acb9be30b4cd003fb4e264f82bfb68", - "416f3c89edc55443898a65e1c3d83966280bb621d458da99aa41b3a8112145c2", - "baddc71f911e1f2164ce3743dc30b6a25ee370f05aa9d2ed09e30db6bab377e5", - "d8fb5ce6a1272249ca8d49343a2e7b9695794973fb6d5fb4ad3dcbebaa6d0c92", - "408c2b5e39b4d6b1f9ac9c2477a6b34cf16ebbab9d3e4c7952005c733f1095d9", - "ee3acd7932a010145bc919189669993f769219e6bbd7f5242dba52e5a92cd631", - "c4ebd4776e5a4195a60e5c416a2477d7f1643b38dd436da13fb88d15e9eaadd0", - "551c9b2fe94ca5893594d5a130a09ea143e437dce3e4950fc92a79842da43e61", - "b7bf99866f0a28408a56ec484845a2ef72157e4b1f9ff0f20ceeea5cf814060d", - "c3c7fa2276765549ab75c67170fa2fe9e58ed84d4eb4232baf27856db5a67597", - "49e4c0d26f5849f63f03f90854bff33d4af3ff4f54668430b629b293afb3a4d0", - "842efbfc8399eca54d914238ad009f511cf08208c4a79aa50dcb3789e45593dd", - "2333fe034e50fa8142e3eeaf47f576ab99955b8a5ec61fdfd6a83fc5d59fc429", - "32a6fd866ba7a034017999d563c4ae764ac579f4f94ea2a6abc93ac96f01df79", - "84789be084595b60bf0ac194c6ecbf88f5b1000b35ef70948afd0820fa171eb9", - "3fe74829fa9a7fa977e0cbc925c810c1925ae5c9e2b6b9f50cd52600c0dbb943", - "19f95a8cf18c112a64a8b49a6d484802f19d6b6201aef40c232faf5267f8fe7e", - "b6c5efc766a7234fc76d60ccf38a9f179c0d212a5214c96a977c0978e5d58f5c", - "5ad801c864b8651a878a095bd5b8f341df0d9e6836854cd6476d094304102c91", - "8ed47b84b748158bd616c67d058f6bf10cdbdc58ada54a83af6298ca6f8076c6", - "4f73a5cb495a0f52b141100d366c05f1a1a749e92eb1320cfd1f43a9683ff250", - "e531eabfeb3b757bed5711cf5918d05a27473dc510ec656d0dcb04602ef0a218", - "a7fb238bf40cd435d74b61129183f0bc2914b19aad566b81d67b8e106e1204df", - "264c7bbfc9f38edd7f15996f376bb1a991037a8ee55f144c355e3e1233fc8cb1", - "03d747e8de133d51ad51e6d737b7e98e1895d7f15baa2bae12be0ea4b283bc01", - "4423a178f57b619b2b76cd28378ed564282e4ae72025b9e676ea3a81c258c80e", - "9393b81aafefb457e4f8595cd947fcb5f2e32c9a53e28235fb0b15e68c577210", - "76948da7711ac9ab88335ea4c04ed7de1b206bdd8523e95c6a386bb394bbbf22", - "876d3d79eb984632601444d2125711236ec06bdd9a583e2953e894e6cf8020d6", - "85599000ffc73c4f6f19fd1cc27aa0f24e9e81d593e5d576b1df0813a5cbefec", - "a93182d3085221cf49cbb5975045f9fe1656b901821d3ce789ed1d1389b6419d", - "e244fa4dc95b1588c41954e5ef11df28506515eaf9e00dee183590c1e526f0c8", - "fa03dd7ae17ff44bf81aafd994f4c988adf262eeec656950382269f719012576", - "24019993559e6ae34b917d69aa97b3d0aedc2b5bc423d0c6a45cfbc97e9cf823", - "d0d7f56963cefab606605bbcab066b889d58d142044f9275d9b6eabcd882208e", - "deff6ed1f2edf9b39e7e8ee6f453e027c15c48c08067dbca0f8ddb685c2fbfbc", - "415526056596aff5f1ac1740db1632ffac28510c94cdd675e238d4cf0d19fc9b", - "fb7aafba2ee084a94e45327e400e4a58592cf25dafe80c18166d5d1a97992a60", - "09721aeb97e938c6fc13660078472e8a620f3c3a561ab1156977b6d5cb52eedd", - "1ba06a179cdae53e595b2c81acf7c5f4cac7a64feb2c5f99fcf5b06996de8591", - "27a99705684ab19c98d19d3d7796e405b637a16294509a240f83e2bdd7af1e3a", - "e6145a979747d7f72a09db54ac6d8b234564a5a69eca8d421d658119bc7378e5", - "dd87678295a837f75bc473e50fa1191c3d1506bfea854c1365934e652e15016b", - "ebcdd5a77bc23ea3223d68f9ab3c8a6171e6b04fda288d5cbd94867867be2c32", - "6185e1fabfabab7e9f70d4ecdecc92e426358181750b932efb6b42c5b5eef2c5", - "66acf462a3332babc18523d917b92c4bf3521e06048e29e5d888cd7ce3edbff1", - "ccf4609a90ec1fbe3f53ec088794031a513842d0d4c321347eb59a845953b1cb", - "6a7483b10ba8b78e4865825ac481bd26523db06f24c550a0ae9d1cfed736cfa7", - "7fe11870f0955cf67400e4fa0eb8bd4b0a623e4f85ba7bc9b0227f45af87ada0", - "70081f25c3df249ea53e18c987685aed9ee7c862aff381631df3f432d095f7a0", - "2cf1458b455ebfd5326112e162f30597f58a091f05296d13bd36bc1a409b3a86", - "95f9c641b88920bd2840c8399beedfefa2689b338e55550ca2f3dc5df26d863d", - "2753ab6cd2fd3764a1e9e58858d9bfee31a432da2e0976fff1236be8c0f43f6f", - "65a3bc6834571af0421f02b9cc9def5c1024bdfd5eddcdd55da5b4363f57276f", - "e3718339913cf320f09a0db23108b1aefdc05cc7aa4f0184a9ee504d05728e77", - "2efcf72b9c299644386b306d0951d18d5f15401927395c68172ef4f5b09afb1e", - "616553e726352385e3e9a1604e1bd7460ec3ea80fe81f3c68aab2c5ba07ca056", - "4186c4cb361583ec385f5a7d6da007f3d2da552c943e1610cffa8218d8964640", - "311d65a9247f1a16097a2ca9cdda7ceb39ef40bf43a81c78d3b55107966e6a1d", - "9a8ab2cb4d03130da355a28dd828c51cba3838e1fa4bf3e5db18f4a1feb1d229", - "11fa52dfb86e0d9aec06d42dcfeadc04e0d8d9b8e00c74222142153c66950b53", - "30f1e707150171df122488ffac94a7c165ea5d2cb7136e18aa1bae37f069ebc9", - "1a29edeb2c8b30fb395fbf45a286f6a4b2af45d96b2f14dd65bffa2728534c05", - "9965a0075d63c7814ca22cc06839246670be2713b5538c29b90e06a976a06ae7", - "84aaa15d93fb3ada9108fc12235ecc40d25bff7bfdacc68eb9ad0a69f83c77d2", - "709ccd5ac61bf4c4126efbf9861c5bdce3af4ae4cb5851e23f7418f480d16a20", - "f57099f64510507e7ffeb88788066aa929b7f67ee1406cb42db931d4fc3ce894", - "0fcd13c6d13a050637194199c3a8e255c6177144fd5a9f71564265b1497f1df1", - "b34fb3586c11c804a737c687f24e627082a6e7ea0f807d885a098d3a44b9feec", - "6f28e4e53dca56301980918b2c07da4aa373cf48c8394eb8d8a50d4b2f7631b0", - "674ceffde4593ff9b54a26b82e8b450a772d99d9ac4c29433962f23828ffa96a", - "5af8c4167bad800404c6759a24a0756ba9361fed9fd17a1052fbf517ba5e1222", - "3c1f37a71d9b9802f5d01c5d694852588218fcab0234e8105a2586f1fefaa39b", - "68dbf036cbf4d76fa3723be659bfff522f635550bc92c58e174671e470d07c54", - "7b3ee25853f3dac531de552fed51b6f9ac95bf0ba132b28d894fac005fff81d4", - "a55fb3e0fb8eba59291ff29c26ee6ba48c2f1c8c2bdc71e3a46df059cb9777ab", - "a0ab61530c0a0a6bb2eb10e98aae10f624829387777521f041d3addb6b336940", - "7f3fa23ed0d6572248e292035d305dc95bd38d322770cba41b10dd650fcab94f", - "258f5fa164576fd8c0967731de2a34d94ae36208a569ae6a5653304df5b2bf00", - "2c723742551250da58c64bce3c771953cc59f2ff7ae3c8c0c5927728b4200e71", - "7620e4ac8a6fcf5ec2f4df91c7a0eb785372be681d131730ed7fdd9cac22be5b", - "7c44b8a731fcfe788d1c668e240e9f49fd5980e5f6a0b9bfb4434ff30c60e47a", - "6a444b68114321fcf9a1b552909d4f62819d655e3bf472243259fe3e54b89e3a", - "8d7b14367e69cf3f9ec6ada34261cf846987f9ebaeb9f7ebc43c3ee5e6feb063", - "9496eaa62fa92e5e7225f8b29114cf845ced1fb6e8ac53282140984409bd30d8", - "c84ac699f7970c74f6eb3c0d99e8d3e0299dba32896e14739cd6a9fe629fdf89", - "b57fa05df962dbe246c29c3068fab70ad260f9b04f043bca3bbefefd8468e82f", - "024b8cb00e93b18a0ecd203e3641f56c4dddfaaa3348a10156fa35331b8410fa", - "e624daef3815ebccd99351bc06b468a178ff66111b7c1b392d23e271fd473027", - "3978b4f96a2048b7ab81d74b4cad744aea5714047c8f3c97ef620859ec0f138a", - "d4bd90d8a7bb8071ab0c1058dc25dd7cfaec8c1db79424fe3f0e8ce934854794", - "8d4e3a590f3dd609243e38cc04707d63da86eb719de4ce04cf2b59d22f2a339f", - "a2dbdef7c29398a70e149abc2b35cf31843b447ce393cc34dccb507d2b79e719", - "aceaacd24b9ff8d73ddc84fe734e6595afdf5179d999a962e033d03d90e34097", - "22388886cf294873fba8c9721252537c549d3576933ea04ee2ecf0b1a10a6ec2", - "fea0c2d8dfce58a1cb0aedbc7b705807e5af671cdbf551b7e295b1cf652ac044", - "c618abf20acf980761641269a7c008cf7cddd2f5aca64f74a241f332f55a713a", - "99333a5e4b0e2165c301b52faa09590ec1e4f083b2bf32f7987326296aac895b", - "78da9fe901207ee5a46ec6e0a6fffae6112173fd20cdc7d8951c63569f742792", - "62df91107e8299300840ecdc7f62a7e9dae9ed4389f1c858904dc8723b5be968", - "f217d050caf9c30e7ef5c7e39d12bad7150e3c06e443be3bc8149675986089e6", - "44034dc069b0c0941c62ae89e2287f14af5e293b332edc945b83b75ebfa4da7b", - "6309b6e924ab31e5bd467e56b2d95372963f71c8591841bfa646026a8494d750", - "f285f972f648315597a2a17b2cf1fe80f1cae7ca6a6654c52560b486ae2eb7d4", - "fc3b9febef1a55964936342617a68b519b63a2e3019420c22584f628f468f12d", - "2065b4c39612835130a45a7885592aab3bd3f40ee4862d54f0606ea558088c1b", - "76a233fd5fb2b885107a2b1fb49a4d30ece0b95e8e24db7ad6fd7b5e5aab7251", - "0635d1802dff27952155a019c3f49098b7055e074830f786244ca0db3fe012dd", - "acdcf90190df1b8bcf569dc2c3bd4599621b961cd0d41dbbfd40094ec6bc7a9d", - "633c3cbceafc5c38e08e3b12bd0b06793a1ddf0d54194410717b6b232dc74886", - "5dac1a0f2b074ea98a9d312350659de3ab36e3cb7c902816cea1062a83ede263", - "9568afd67b9461f250c913ea3c649b0eba5fd9f5981aea0ab0800eed1aa0c539", - "8471cc2b45cdb4d6f339c3962c76374a9582c27a73ad16508973cace4d000a3e", - "16b48c2ec3d2d97ee40a8936f28f53157aade8d80afe037a4d45e94ab30dae6c", - "e1325913df8f362524d72088829be0488d4f73b8a804dcc77d572698c93d0751", - "60dd1f1aaaa1c347e891b2e9796574781fe76bed26445c5a737fbc5af7698713", - "8c2e0212eb04d2ab3f402081c5c6f319dd7ad3b1c2b74687f51e3883fb1bbea1", - "23dcbeffdb5e50055503abd9fd6e00d320427c81cf6b0ae4a5290552f7be0bf4", - "7fe9b4547f6d2a6a23541f96fd782ec5d49373d691064948a25e027414247a4f", - "3e6c4943e8f66e1d3429b788dcf00273ccc3ec2ffaf453601e023401136f2a87", - "8d9e35171d4675748f815cc4264b614f294da52afb53e2697702f654b0bea479", - "e0b9c4ecf4c561daf5b13015730a4cdf5c095a9957575759888ccfc1739f0f51", - "24a85d4c241ce9b4d06a7ea5c34a49eaf532e7776f78dd97374ff85f9c86b583", - "ef1e9df7bc1c279fb156655cbcd0c3e64c9a03ec9d40b41024efa75298e2f39d", - "8c35d55480b3bc2b2a3d13bf200f15562cbb6c11995752d1199b796de749a437", - "a663e225cce1a620be6896bd7d7e86b893f0a0cee70ee8ef049845c129d8fcec", - "70b106cda68015661f3601a93ced23626bf9fc8175c0b48c25dcf2e46effb6fc", - "885996772c7ec5a2f11153155875069953ee7c7d1dcee0edcfc6844243e0e5e8", - "6af2bf7ee78f086bde54b728b8611c1d72d409f2f5f88da8ce4618645c336573", - "768e2abc853bdd5d259daf4c7b3e07b6edd435a3628f22735b62456aaf7c9427", - "e0babf0a201946fab607bc8cfed7e348e0ca02da1401d1d51240b5a75929b08c", - "b9f3846584f552a1a2ead412ed4770fb5d7aa5383857d549933ee876965bf6bc", - "dd44414e48f8d9e99fc03e6ac785b3253c65b9d0a841d355eea8b0d5e0012075", - "8e10a89b575a470b82c13222ae0f3d85db5f0c56e8f46bef5b363415decf346e", - "6dfbd35493b64680f286a242440b18fbd9c98d2a1d4b4166ae0f4216aea201eb", - "84f0ce5f2a07c92294c2cd7cfbaf2b8dabb5f712ee6d2b32d5e09d918fd34e94", - "3cc8284970a668db3c9300bd5afc26d23382b083c1fcb915ba2d37f017d2523c", - "661d60d9e2efd0d849d2c32d19f79b381cd99c8511efd4a7c5a1732903914f4e", - "f78ff73eeccf98d5df39e75edc5ac57e81c5525808afb85544c22e426c262421", - "319eea6901bb6aa33472866fd045f59193a8508097b9de7071e9e514b174569d", - "bbac678539fa3912772954da3c0931c97053df8ecbde2956ec95ccc2a6fc01e4", - "35fbca6f9e864d81f6dac07e2e19e64ade302a0951652564672d974c8234683a", - "dec8b255483e47dc0aff605017f1c242a2a1bf48c44300e16a74ae1306189793", - "853916dfa32a918f1dc7c729013808e375269e75119b39e62e72084587fab122", - "f462741cfba852570faa17304e2e4e45d832232c7c0314cc791352845b7c3bf5", - "37c289e6b49a28930d94cc79e8f9d4af4577d2ad5da24450cd82745b6e4dd37b", - "8681211aca792199ceb6f45d0a22027dd59051d2c1741375ac5945553d718041", - "390b8df1378244186522e5169e503fa48cc6d08d165ca4dacc52cbff577898df", - "e043a68c1814b8ac4ada7a9b2df8abcf115d212e6fa880b238d0155699241ca7", - "0fb28a6aa103ef291886ad76c1bd401eb39cb7c54df72d9c3ae7bd985ba1ea3d", - "2057bdae46a1e89e50056d8a5c1d905e9401438ba94aa9b9b3f33f05eb6856a4", - "8f4606b6f5599f6c02b407c54648a1cc0842e5e0cefea659cfcfb483fc0a2bc7", - "a7918e94f1fac39e2038d10cec285eac92ac44f8f3214061826b999428238db1", - "bd627438e9f30e73cec4afce9cd06e781b34a57f05456ba9d210b88c221150dd", - "fed2716c26846c57d6c9c5c56c3d5c7f7b4f07cdfa622b3b11ae7b17dd2c0e1b", - "b1e6883c35ba12fdcba84fd585b083a629d88996e1a582a47a021c5e6765313d", - "95bbab3ca77b37569690461e66a33b60af3539ed8114e03eecd1ae1272e4dccc", - "aa922d838371cdfd3d20647b11ea5781038a351f503811657552467b8780abf8", - "df100c8bb89542562f70798da73cb4c2d849deddacd476954fb33397f56e0ef6", - "0b93788f72e2c11142e79018c9cd6af7514a955f4947a3d77d20c46710b11f2a", - "b0c930cfd288f0d140514196b46cc8ab0406aa1275512561b68c7dac8e035552", - "e1b80a9da3785323bc630c58e73f154854bb06a2a17a70da04b699764c6d4963", - "f8b178b71fcc48eb13c9931ce9f90b4659109ea553a8709a748f51f876564570", - "c042399021b1971015693b1adb1f88d2527df895a02bfc9d9474a7dbf0d2da26", - "a0b08aabdd060e5863c6e7152a7cfab994e33b74555eec9a3f5260fbc6dc8a2f", - "af64b91917f063f4c435555e495b6844713861b6bd6b63b79c51c20bfed5ec33", - "cee3cd8b6a824316bcfc66b78bb65f659e804973ed1256b89a0e7bbfb779b01a", - "b9c5bdff0062e206a2e1914e8d9d9695cfd9c12b210eb775974fb84687ae2410", - "449095b6a512cf08cbeecca809dcc14ca508def43857b7d6c05f45997d6bb4d2", - "06f771c79ffc8538faf6551664ac30ace82bd7f0020f91704cdefaf3a950ed3c", - "2a230ea5ecf176ba442c0060162f77e408626172be2db22d917d1bae226f9aeb", - "03037ebafb201942c9fbfe133bcecdac7d3ae0d6cb13708ae15b3b8ceb8c0d45", - "c70e4b19389912605a52c480ba2f68711e157179fe45f2ade36bbc4914a7f2e7", - "5537ec6b8b2fb1fe4330bbf6ebf75f9f6d703d691eaeedc8839d161abd1416f9", - "828734b7b0339b98e11aa426cefb6a60bea42a46aeab525ab0a285d4216203bf", - "4d550300d3fc321244531a59b0175ef4a690a6f2861b86f3ef47ce92f99b1f89", - "88296b00c040016972a0d3625810793e7e5cb0fa522f68b9001ae8949136ff06", - "c2fd27d0f0c436a856a906e4f08903a333130cb4a5883e30d57ad669390911a0", - "699ad1573c167012a4105d79777f8d8ca75c90ca7ffee0388168a7fd287c62fc", - "d914ad89a560a9dc4334fe8a3c5823e4c2f258a2e19c9a66b6f63c0b49ddce97", - "24b211287c9e8d882bb25dbf97b70aee99c065d6e27e9c28f427e163873a2cdb", - "ac95e2e81f482242b181c1fa6b1bc1a6eaa833a479cf30913498507d90794b81", - "d58621baf6dd9557f9448072d04d10f8f974564b59da4660a0c675f83ffc090b", - "1be329f4082a85bb196ac420fca39dbf385ce1740ea3100b1686a3d5a1116aa0", - "a2319383269b28b93481c034ee125448adb81e789407a37d4c72cd0fb712bed7", - "b4c87f3d42f51734dcc0f674304190c625cb1cc579186f71a94cbcf5da190e3b", - "8d94d2e570238449781007da3b97eb208f1344c3b3d17799a381f2f2b6e14c25", - "97fd269084a468d22d9a449d5c82e5fbf878f636666a6ac857d436549f99e0d4", - "7b69e2d6ac48ca33cdfa784c5e54a1e1c0780ff1d6f965945b0d5db9cb384bab", - "a7ed74989e4c8602d2870e03d460ace238f450430f843a9183aa2b56e5faf14f", - "99045ea581aba37e14bfc07f2ed1676f5e8539885d7c27e5939027ec2319d779", - "11c53d2f05d593a91499c36f766389bb1e4d9029e254abcfbb7f61907a6aded4", - "7ad820d0ae638741c147eac9c288880b552e6b34346b2eff79bebeb77dc8b477", - "649eeb666f7e7cb1ce27cc40beb5f0919fbdcf0570173a8cd62ae7abb3d88e2f", - "e9e58044e7b3d3fd4e4e8fbe46cc9b22c6817b6304c76c692123031de06055eb", - "c106662153d14a4ccddfc99cff6a5cf94fbdb19529e348e3b1517b4f5639f2c0", - "33561b4b6b21c76775dd0d4d5c313576a8d7954064c9ce1870a213ed58c3bc27", - "28c9e62fddadf2ff4367e59ff4cce80175a6dde1ffdaf5c878d744179a72dc4b", - "942a7a336304d3b3450c2c2f09be6d52f4c11e237a2d3521b87db3cf60f49f73", - "99ff95d75fd3112cc9b9cd36c6e123f8963d4fe16f8b0a9cdf826f7493afbe76", - "1e287eed502f78e7fb1116a2f99f05c5a94348f3cd03d29d79886c4abaae5ac9", - "83471379eeaf16f3a4bc313733670d71cc5d3a5f138921561805b0075e05a5d9", - "f16c0783a6dd95e4e924baed53c535c55cebc417d0bb02a4797ac44b152adaaa", - "1f8ad4ab7f4d5a53283bbe81b94113c57114d31cdb9ae2ebde1e82daa57d1351", - "c99f538aef6ef233da6621d967f9dc8df2414ab502b741d4680a059ef8acb136", - "d18df31b78ff8281a112eca66c43aba48c0634d5c77e84285cf225c29c3d3ed5", - "b0eda4a64e9d1b2232e0b39c2ab7d2de2775ce1495c3c7d2c9e28e2e7604a8ea", - "d8bc919cd7f045132ee194ddbcc2951807b1ee480b5da3a541de52806930d567", - "f7f7bb279cfaf8f3e1e146ffcf1d942b2aed89a11bd65a19b8b336cfc10bb1b0", - "55e3ff275aead19a38f3877471a1c85e6cde2e313d22319538e80c3e653ab006", - "c90d2003be02967fdbf99ca3e2ad3cde6617a281a7546a38345752944c93c65f", - "f9d5eabe0a861a8309aedd5527f4c6fa1a7bdec17201f3f6cd6b75ebd7ced0b5", - "bdf605511127dbbcbdb88e96b808b2faeed0f920d3d9ecae8b1cacf4a43e0e3a", - "a37f48e799ed3cdb2735a35b72e9beabba541b19672c2792b1cab3f957cea7c9", - "25b5031a6e63181868cc45deab400e9a754fffa6ded498aa0a606d5c9dd35f6d", - "de45b415adb3634dc02853606f858f573d35ec545482ee2416090fdd66ba38bb", - "4241fbd3c17c9ca837cc5423d381f9344bdb5b1bbcae4b6715ea2e7b037fa4d4", - "a2cccc1331c645bed0907efee6c9da94dcd260c3d4b1ee44ea5b617042b7013c", - "bb7df09ab2bc4a23ab03e1f146fa74c509e21fd4e73cf68b64b98c09de9234ce", - "5402c1138142074b2378b05a77a125fb8535fd2405fc243c7d87fa80264b0f10", - "9153a8de00c04c37bfd7127483e151d3170c2a05d5402c5d7ef90b3678bff820", - "b5fc547ad1d84839e64b4b06c9076af3a6caa90bb0ffd8597414ef2beb0958f1", - "ce3d3f4c36d8228c85d9b75c8c8f6f1a1feebdf367b066f0c453b639329113a2", - "8411d138bbfee19ef46baad5ca0ce6c9835f3de904a85ff0e060da44369d5d40", - "be1a10eafc1d8863beda87df950b65ed2e9b5a18255c3adbb752d29be9ff61b1", - "2cc203296e2324a28ef390f8ed23214c667cb256047cb10acfed17ae4f93e0e6", - "cef7d0b345a51e2d5d508210c260842a9651ea30fc37e8d5380c2a50df521800", - "6b4e2e346c5c8edb71572a777503a6c309bd5e4654e580acae37f71434720111", - "80fc33814260bf5b071280b998c53eecdd7e417e2511fb31c1c6fd2e2c0b8aab", - "5f686f2d24c2ccc7690b8c54157cace46848b6a1ad6c39c7aa14bed9dfd59e34", - "e93de792094f149ece7f7cd8fb5ec92a05ed77c97b20903ca09a47a5f097da7a", - "aca317eed70631008d81eeeaea15cfa2d21668996e777ff9bb638bd10ff53965", - "85cce36663d04b8b72f766dd7ac999cba125cca699344de54eb2b5c278ab3b31", - "bc8f140d6f345147a2d5593d1ff5f7e1b744bce121c847a1cd026c8d8527d35c", - "76766d8d33bfdedcd1c516cdc336369db6c5e605e63a9c8408ef887c55907e76", - "09fa1455f6c270a91fae983b8e06a75a45119d88151e5993d263d0cab09fe868", - "dd78babdd36e4b897f502106ae4e9ccd85f7f3e7b47b657143557812fa06109d", - "80b72caf8e4c519122d2bdc3eea4cf1ac8dbb1334f16e0a679af48a57013f30d", - "014c99c9f4b169ce4c3b7d6b62b7ce7e93d263b5692935b566e25cd02309397b", - "a7fd721851c7c616cc548a155cce5155a538799b0e20aeec5142991d32e3e3f6", - "50e0de370f2bcb5177d09b66e84315cc3f51432230eced4cf3b991b59a3587a4", - "59105bbb72a6cf69125c73105e5b9f1f608fe0e3cd70262e119324d62855e3cb", - "3c52add770ffd484d91342ebb1a00ed4c52a383c2a068b2d19976239b99c1c0e", - "46e4be1940b728a943666d3fd84a63a700365e18a834453cc92e45ba0ca996b1", - "56996590f252d8895e516ad2c6a07fd1ffe0dcbcd6981808c462ed84af513c25", - "9dd454e6f08324d40f12a46670fad5f25435511fb3a57059dcc1360a9a58255f", - "a846fe938d22dcdf9887ba9ead11ec2d85bb9ad39061ee36a33b8b3ae9cff1d9", - "f9604f684e08447ad90cea38bac6838fc67a0d4b5d4cfa08f25cf3069ae4b017", - "375a2698b0c380c4b851125b5154cbbbd5df9bf5aa6868506d73c1b010173841", - "dbb32864591140465d293d72d81fd4aac1b4b0b087f1883fd0028aefd0fee582", - "15c7ff38e9df5041bacdb92db4431d9e65ab900f976dfb6531f3d09ee36e07ff", - "377be246060710379c1a83e2fe8bc820c3e79e7298a8323cf090fe3cc417843f", - "f47ee417f27a20c48de839efc13b0b81eb63752073be45b8ddc0ac950e94544e", - "6ee0dec867c3a5e521b85232cb2f57c1d8ea3fcbd6262263363ad6dee2b98a86", - "73340acf9133fae576666b51a394c9de8c0926ea76cb3cd6769420d841078b22", - "3698f6ec5fd2c1f5680ff38859ece8f5b1cf6b73e1d6e3a54f77f488b7b595e5", - "95b13d02ed53fa7a93df7f43d5c53d422c5294f1bf9613c7c2ddadb3910b2e28", - "60241c94372d491a27f6736ffa594eed8e0c452371545d849596b9982d1e4185", - "f112cef3bd6ca46d7a6bcef3426ec98764b06ff63da5b4408042d5b18b40640a", - "de416910f56af21a589b6dd0a22a04e7ab36e8284f10262161b707664885f3a2", - "54fff93ee141536b3ebe21bbd53fcc95d2932f42e230aa33088784cdee836f91", - "1db3be352faff0aebbfded9726973c200e158340b1cb30d2891567dd2c936e01", - "91a4d43944ce6916e7630a71261e5449a0044c07712a1c8f5895c4d5494e9a2a", - "17d5883cdaad32dbcf491b66101ec16f21b342ce6a52170ec07cfca0feb9921e", - "e982c0fe6f17229225c8bc5e617055e1a5fe1ceebcc2d35752d2ea91360f6ed0", - "232a2a5a976ea10ab153d1e28aee10fa11ba8a591f6383665b67e78bb3feac65", - "203d9042f363bb9bd013294796de5bb87ac45708afc3d9be0474db5fd45ea07c", - "ccc11fe3ee29ce77616a70d51b217e0e2325174a43ce5c60eafa816a3ce018c2", - "4c819e5d5823119d291b9afdc167511344e0dcba75a69307b67e66b085e01559", - "632af3f3e20729118ac6f5e8effcc57be0d4f2b96703a2b628a5e06742e8b8cb", - "ac1c37a6ca1da66348292a074f3ac994c903f19b3874fe828af6cb9ff479dc80", - "2ad1afd74d492450024a139a3117da19ba319df1006a9eed060f9cdfe4d5a142", - "53de290fd8e15e57d3b4b46275ca077a584b31048f44ba05d0e0afa4aef78726", - "60020e3b05777c87282bfe5bf646950f68b2825d2bf89d201df8618ff463662c", - "1290ff0f1f6173a6a0b506704d5b7e676e97a09ec4c642463df789c0008d765e", - "158a048c8e78d6bcbbe62c9a7b2db2c75786ad7db40e61985b6b9c37e5e209cb", - "00b1f99745dbb12f1a1febb28df50b3680c71eb3317cfa74025e9d357a8adb60", - "0d7127639590bc2fbd33be64bde3112863621e402885a78bd43ccce17a1312d6", - "3fe2f6009900d8a8568db2b93f1b7e9fb82bf348d91040fea181679c4723e1c3", - "cd8395afbf2bb52a70affa6c56a9467ac2e7da0ffbf69d8881989ea67424502d", - "5c8d7fe35731d5fbb14a2ff62fee9a5c13cfbd0d03a4fb17dfb71675453387b1", - "697052518ee7fc0f131f74f94ac8371fcc7d138e773228fa0f8c6b7efa94e0c2", - "4b16bd9f30e04680cec9438da0a08ff2335af5ee53fe780325e086c230a4fb2e", - "9ae7365ea7e4247d20c68743db263b893aca9b1558861d09cc96a014ac946893", - "12b244e5ab8d5bfe743562eaa43a271ce454d9a9a10a7af58386d19e7d661c4f", - "2443bd671051f8b6096077eefcf3e63eabfc7e68aa2c6813af3c867ebcd632ed", - "cf7763faf5c43c1057b75d569ad3b386f9c5afcef46876527bc7cab4dac8f4a3", - "c0d640fbd93a8e64c86b7ac1574f088fa578a78c7eaa70be5ef1cb8fa1dc10d0", - "bad532779cb4fa76934ae295ca868d6d415e4cda378773c9a4641af5d125f9a3", - "6e5da4bda0a8dcd452a6fcd4a59e62e1b5647516b6afbb44f7d8a7378aa3b144", - "05d6738f1eb29c2d6997cc61a699c36f9b05e043b0fc2255cb364cdec3ad2409", - "ddad28ad0418925da99afc01cdb948951f86c47167f0750743c0ecb0af2407f0", - "83473de9d7e5a017673e7f9f9d78b03d1307bee260ccd0c9c2a8fbf36d447197", - "ef51793985a59d01b00d046e3289755d265e103c92da61d85ae77b359ed78e46", - "716bcc32b402c5f1959908269a8f8a608e0cd913bbed9e281e4da43562f6c907", - "60e94be2598e169b1c7e8d1e6852d777b97efcdad63ae34b72073a263092fac8", - "4c4c32a0b17e0f4bf83a117c4d9171559afe150a937dad5c21bbe104e070f952", - "b30c03ddfc61ff14f2714709383fe894e661b7e3729ab305fae13d0ec3087f97", - "bb4526a01ffc32422fa17f07241db50508f38aae9e2f0576dcc73291c31c67cb", - "662af807605470677b6dffaf80c4f3cd3c2a22b9d0640b7ecec5206152fabf71", - "daaed1c76bb2e7b3ec26840e43bdeaf44ed2dc982f0fe89795920cc4348069a1", - "930f6a7eece9115f6ebac96bc01baaddbe3e3138f96dc7221c63b3514db2c9fc", - "f0d6353cdc5bc6119a1ec8dd87e7dbcf679ce0efdd4a2dcf1e790271a9a6e40c", - "de0257d9b6ba0e47d67986cad6431973739f37aaa311884e0497fe51eaec2dc1", - "b872acf96c37c1c58c7a51a6b65c5f26ee40f591c53b61b26b74604bd4ed6f01", - "b23685df2c807bfc4f5a658c285b7563185794477aa2d947d54e1f58a73bdabe", - "bebd7b967d28e6eff8217a9476467626b3554f0b3fbecda388cbe619f0bead68", - "94d2663ab364f39377aeb99240821886fa05b516fbfd4faa008aa40b179212fc", - "d272c0d58a991eb699a59042fd5cafc304422ab3e76b68cb3794441bad3584fd", - "405c000076cb34f1dffc6d3f7cc1ad6d8362306312fb0814ccc33c191b4190e1", - "6cd2a74a2167529a82bbdd01dc53de36f99a0398ae06fe8ac99c6d5ae7b3a8c7", - "2148b93153f41dacfc3ca4c41108a23da0f8dbcafe4d83c86773c4dcba4fc0ab", - "ecd1f43dbd9caa62a6cb9d4a77832c217e6d51a046e809f4017eb9867f59ba6f", - "f7f95cd9454efe88ec43d2dbc6fd50732f90e557695a99a9289863b2bfb67816", - "fcf90236e87324c7df7cc7ad7d9c1fa0ef5094785f0ebb2165f95fa8a0ae8d08", - "a92fa0cb9e8e202b8a9703ac9b0b77702ec28ef75f8b39b785082451fd99e454", - "f6b3aa16db11c60c710b57a5845b0ae85434b7d01737799c3321f2a513306b30", - "77f39aa94b0a0651967ec65bb1264547cdcc82f741358e97bd45fce3cea83d28", - "5054c9eabab7335c3a746aa6335b59d5bced408bc828acc7e749a85fe61121f8", - "a428df1f44dc32bac17ac8397df4ae3428c50d1a810010dd24e8ec1bf0328bee", - "4617a1f0ffecef3540f8853a2e36085796882ca34b50892ebc5efd0058ea604d", - "f3eb80e4c19e52470792a073a593a3b37ac66728f94b2c163299c2d4383ad736", - "7d4e27e970482fbd3a7834f4bcc89e4fbed636cc717cb2d61d518108341623b0", - "3fcb44d9483c8466c288677ad07313901a93b40f4b6d5c1f8baa144f2bb5b507", - "1a32cfebbdd8900e47f2430369084aa72e9f7c91c9c00c97a55087bafff410d3", - "f5d9a38c803d660cdbd999ec57005851009f2a29ceb7aba4ad4b804285b4a3b4", - "22502cf386c7ec3d45a6324618dbc17b7ba19a029acda165c59e0dbd450acd3b", - "82d67b86cb0f9f3357b53c5666a60fd1c7365ca923b5acb457620faa95d0d4b1", - "4a11c2e932cbf09dd648b395f903df44aaf1cea86b8bd44f6c1e6d919d3964a1", - "9309670f5f29b9435e6261618c5c8180ebd7c188176571937f29aac05a689010", - "b23230fca38b3955ca0cf6b5740eaf72da335c8ed6ab1bde8f3416db3014cba7", - "733496e4dd2de11ed62c4ab9440f61e66632794e5eaefcef3f23df03a8425986", - "9469fd069a9ea9dd5f8d4f6af51e66ddccac312516fcf5a0c95be4dbe37aac0f", - "ec17aefae7f940ef8b58fefe06c6ef81b916e56304e9b805d625a6b2f76159ef", - "f3b27327e0c6e444c40a2f7612663c3d9d63f13178887ab61edc9947404ac980", - "6b744987921ed54aae6feef83eecb022adfb9ba82cab3592a84a7b884f3721e7", - "e2b8fc1797454c02b04b0b9fecc747e429a4145c80581339f7fefa5527b901ab", - "e46e9c2acbea8757c120c540cfb8a6a0c9791ded636203068f4cf48b4d7d3173", - "ce832d8e7598e4ac41de348b7e9a93c9c716c9d971fcb918068fb1283652bbb4", - "f42a6090587bdcf360829c219496d8b49be5e51df16e66e56dc7c638069d93e6", - "95c2c36fe5fdcd974dc5779d6270d5e77af62f44675fff8b015b4dcc16de35dc", - "66e3debb0d5c6b97461eff81631098d54091bf37b3eb5c884d9a2d17378d315d", - "06e619fa90c25c1b828bd6a1aa14cf4ae36a9deb66fbe288eb94b86b5409202e", - "c40a2adb9468c769d1bfdaa7c8580c00c39a944e42eb6dd5676b90dadbca8a99", - "55c365f681fd07d7765448df895885d9735509e5318841302deef854d5e249c1", - "2219feb5a0b0d3529e049a17c375ea07b38b2f23ac307465aad2c34732d44805", - "aee3725c77c9f347cfa8b844990867e11af693550d2ca875c90b31e46b839cd3", - "1f4852734cec5112268ecdb6907f9c5ab2301ed549c5592eb41a42d5248353a2", - "1df154504bb68b69964a65241e28c968ca3028d94412443bf24fee8899ce2e49", - "eacdcefe84090bbd72a313ade607ada9b47520e45d829b6423cd16fcdeb82d6a", - "f259b3924d350661fb73f3aa6958236609ee86a9ebb90e5cb3b3eec2919e29b5", - "6defb9462d6db36a63f90155a5cc2d4e166f8d5ef428cc411b1b20104ad15a99", - "17f9250656cbc235761783bef43157206112fa376eecf8884ad6e22f6328f6be", - "752680e544b5bbdac03709edfc6fab975712344bd7e62e88104bcadfd7793ca1", - "3638634277fb0f2bc17939b3b519706e8909aabbfcbf4839cfab214c138ed348", - "e925bf95976eb7d594b3cde2bdeab4e23c54fd90c74321ce401db0f01a55db99", - "1c3fb04b862d13c2ce9dbd843a50c0336c5537252c760db70717af91fe004715", - "fcae28e3323215e407b93748c7dcb58a039a641487b33a8d9a4c69ac6436d416", - "bff2ec78164d6e55e34fe4f5eb95a228ff7e6533c76606c8cca1d7069f5abaa3", - "0beb661e1e42a68d845bc4f912ebbf02a90621150129aaacf672c9ac48797c47", - "3322d9cc4d2c568e188c49b95457c8dd80cbc86c8b03e552f090a7d67f9e4a3d", - "bf429fac94aa71db3f61e5c68e22728a514d686afad080c1e5aebe78664b10b9", - "c352485ecbb01cc495f4a5ba30898b352ed6dbb2f4ff6ffdb36d9bcf48f40938", - "6778970e2336a9794aadbe5672efcec43180d522ac809627622f16c98e6bee77", - "e9354c2bce612f8c6d471aeef2c645a88d7dbc4200902d6acf41c629688eb13e", - "dd7c1fbde0632ed25fc19cedd467b48d49e079bf10c7f6ef1b50c5fdb4bc89a1", - "c2aefb8c2be5e6c9526addf8faaae54580e2312e6dddc25bfb7343cbdb11d948", - "0bc29369589e071f49312096da7b3e97aeb2b95c518b0b02b19481a105dca68c", - "3b1180cf2484815bcf13760e7cf29f8265f0e88fb62483dd5de3ca2a431b8dea", - "f41738de9781800c355a6cfcfb1efa71cd74c154e9cf093cecc1141905d3cf85", - "a319dceed52ab1f3670e71fac53db48a5840bab2261f37f4e13f18fea447ec98", - "d6b2863a9f1df4ff57395bbf05dbaaecef4df134fb5ccf9e3b4116ffdb85777e", - "c6f1cefb60c0290a59d65a2e25804311ff9d8c2e9a8835744021f2a0b2d4c4f4", - "6ad5e68b1e915fca296893967d7916c70e8becaba8a23d7b578cdfbfbd64e053", - "6cb52bf23fb2116c7cc2cf5277847e644cec135a562245055cafed83efafd1e2", - "e753562f916603a9a26968927e07e9d8e60b1d43e3846043b6d657aefeae3e8a", - "ec101f781816f7c3dfb374922681815e8e0840b0aca1a18df457299f5323fdc5", - "65033ce61bb0b8cf5381165505049f25841788e838cf45e60ed12c1465192bc0", - "d22799d72a7d21455c301f1e9f16cd629c421b974415657b80a76fb69a5920f7", - "0cf4fb8272a5150e81389d7e89738a30b58583b031980a67ac260e3703ca2317", - "8a5446f5d078e8531387cbf05766787d24a6270626d95fb57e38e674badb8da4", - "220ae3da10c82dac48ed56d525105ba7fe77f6b682126e9e15017e065364086d", - "b0d75d3e28aa10180b0baa4f215fdfa5f37712b264813ee1865a2e70233ace5c", - "bed7484f05f26bb539e74253a4434f29a7093204545ce601c3f842d414ce9a84", - "1e1a5e7f6eaec9cad11804c49ac5413cbabc4a2111c80371b2080da272c2d6ee", - "2982f697e1ed2d7da556937caa717929592189a6be587d48ef74bf6b0e8ec0ac", - "60ef809e555677aec63cde5759c45d849808629a85bdf1cf7871974f86930836", - "b16fa59fca470f89343d51fee644292f738da5eea00e9aafbff1b719c48bbc9d", - "41802ebe7a02d6c5fb47a31c4a2704e0058ba429e3364a439dbfccc437a60c50", - "d0a0f37049cfab3130517329df86ae6a9f522fda4bbca0478f04c6bfd877c2b6", - "cfd831a29639200c43ef8d4e5a63a9b25b3fc6962ef70b1f0548f44d30c59e77", - "e6f057abfcf47f62fd4c059440d2a44afa45c156367559e452a21feb93f883ec", - "752d9ac5504ebdca1eb6e09f90b32a42cc9af2b02c6fca8cb035d721cf60d58e", - "55cd048083aa43bf22bba027787a33eacea6da685b531a16185de72162a3a467", - "3394d3b6f26a60c4d682303468d2a9906465a34c4a53d5055901a13b80986ced", - "7a7786f4d95a1e3df2b008cb9a092f9e39c03b98bf8d7a8d5870be48223eb96e", - "fe00ce07bf59f73c03ba642dde1223b4f8bf086663032004ec073c6d64ff2f54", - "71a28f356194e7fd3fd0df4b45584a9e66732a990b61a6807c1ec3ec5a6f8fa7", - "2cac0597a6f416f505eb9d1a93c0da46505643a2417abc02a9b634e244687d77", - "cc7c9964f911308f8d53804dc06c2f3fb4e1b84e103f67d23264d58f9f01228b", - "57c633d5a60cef74197c4da219ea3920d0bea01475ab5f321a295faac37da1ae", - "354232800b4ace262c8f39e1a72fc1e46d0c5df951da26f5b8c1491372445c43", - "8ff902fb4870da24e0f661c4b98f435a9959f4b7935ac331e8ed39f5a5d70d58", - "56335848b15c026804f65aad73f81e06e5c6e856b373c7cfcf49bd45636c8f79", - "9d9eda59bd3b8257569078a903b17471563baa566e763b8951bb7923c4436149", - "ca685e9d10eaaf0d1edecb1861302025261769af08ca90c0645dedb084e9e149", - "101da7c4d24314b3365900da757d6a80b6550aa166427993302b32efeb2b2564", - "a55e6dd5f2f2f12db5102cadb70a1ca7bfa99f72d80ab136c85a499779126054", - "095e19191151a6753ec938e1f0d160935491b786eb95264e496bb910099e4bd1", - "b017a9196495eba4db30ce2648cf18aca7575a6b5363c3f47ff5a81ee3014628", - "7bce2156b4b3c3a82c88c33b83ef221856784c4d3af592b3768f8b2f0a197bfd", - "e06153295770ecd1ccd337badcbe60408dfd591c835cb675b760d51fd2096678", - "1a483356c3dcca5015d7011a678af04f5f5315cd2b1f48afce3bbaf0eb264b25", - "c5ddfb7f239617638dabc4fe88673e20638285b203de993ae52e8cb00c6557f8", - "b78e0a569694d5489c4d1acc1480b5f6cc4710400c670437b6777a01078b4e6b", - "c167501875efae584ece186ec35c910ca7993eafe93dda348247960ec96af780", - "4e78a0645761f5700eb6016a710491336ea2635434e9deb760e3ef03daeb45a0", - "23b8fdd776cb38d512e949bc39750ea8c6267a6175b69b4b6b1ac58e10b6efbc", - "b9776255dd42a52d0ef15f4f99e771d87d603e91cc1d2ce9a75d9a029f27fa3a", - "3fefe1e909d6d8cc237bc2ab9f618e0bde82ea11e57c9331810acf1df0796013", - "1234d57e4550ada57bf828b9526905c50ac98a95fd6b3a597193310707ac91d7", - "5382e7c1c1c7dbdce4cf26fcd36b4ea98e839bc0285935ecf2babbe5a63075f1", - "69adc8f72930635e417d73300120e1ba4638e63088b09a97e8f63d5176264581", - "bc5977b20777f5988db1cc6f6b5c1d890c7f989ef78449ac55c33325b82b6edf", - "b6f984434e9078dca170b1f31827380657de9ec962c39fc4269a4bff129e4339", - "02b60e10596c468bd7c43f80af9ae130e7b9f813af1ac026bae00832d788cda8", - "9c4cf85494253513f4391c44e10544c95cefd07a3c7e233965574a2619d307e6", - "0941ea97da33997b5c80ebbfb462febae36c13b9800267d95233516bb8a8fb04", - "e1820c0e18cf4d2f09fd3baa6d85c4b11338e44623ac2b0b82c12eabb0ceef84", - "7aac37d48f3245dca1db000769a159c5bcc3f265415a6ba1fc6c3c22ebba8a16", - "7e4a7d0e26088e32c6dad9cb91d7d89462b1fc0d856a5b8332ce19b80891e96f", - "bb379126530aeb492cbebfed4b97cd9ad9eedfba07c4930f2ceb367fe80c6c62", - "ae9594a1cbd1a51ca00b58ab4e5a04ee12457ea6ff2c9ab316557f839ee3914f", - "9fd4e86bc25acf94dda223535b30151b71e7532762216383a6509e184df0556d", - "35cd9f46a93b48297676fe67b11ac1f968ed6eade04b5e805213a41d7a3391ac", - "835138801d978c097297cf3c3bf7a6da9d4e206a100eba0cd5fb7d9a2fdff6be", - "61d0592f1ce627b857c4984feb3b50f59ff1e4ebdd94ecca25ed860c55479845", - "55aafe854d785d287efaee8c36e07021f4cfa8a8536fdb6c258272ee967d4079", - "968338b8e68e47f651162b80291f75db1425cb63a456b1c589f170ac58195f75", - "826f68cec7420165d375cdb798545fbdb2a222da64c4f224603aaec0eac86886", - "1a3873e1db5a37da72329fdacd52bfaf37c3265d7eaa4de8b37211e49325f2b6", - "9a109528f053c8d18e620ff31d1ad7c27733122e01e901340d57f466e836e8d9", - "02a6caa3ae563f40ada9d7cd880cdf3c2ae040dfd9842d63dfdde4d6937ca14f", - "4f78635a3c5768345f87d1d59b3e45bd07735e74ac3da4fd6e00e1969ef530f7", - "d4df9a1fb1a19d0dd090fdf0c79c16d9c4c7c500a8be7e25bd39fa23930d07e7", - "87dbb10b1eb0288315eebdf329d941e23ce163b1d8ff46d0945d8675b31705d0", - "ffbe62da43df0b1f445aa81b55e260d9abae484150a7d6dbcce88320b0068fe5", - "f1663580a4faa9705c4386e0d25d02d6d9fcfb16908f0025419d0632eb5e9cac", - "461013ff1acf1a18c1dcf71e3cade8ccbb6c65c7b3596ad9f884a92b9685b236", - "80c9f8168480efd0f508db8fa041811df47625a69be7d488e4a9d163307494e9", - "fd31b5f3fd057c737c38056fa47eb47c2d29334513e4ec609b0cfc7b86730590", - "ba1aa85c2169a29b9f1bedebba39335c60a15fb96b9b66a8ac72dcf09c679ed8", - "d026a36db7df4278a19a6ecdf8b26a691545f09c8e2cc3b72b37c9442c5c30a6", - "63be39ad99b0b0da184232d26e66c2d895dec812bd142ca0f1e8cc642315047f", - "ce3a3f269d9ff3e57df68dab6a9998ff75319d3c9044468420791bcc545d4189", - "b84e9e8f75d106a90176dfe5757775242a2b87dab97af034592706b0d5cef1e5", - "1c7eb70c29d18c33face20956b5222f8cd15cd3bc2b6e3047637d1fc3f7e112b", - "8d167ebaa1e35b8e4743a6869eeb1fc1f58db48d66b1e1bbb77e6c117f2230d8", - "7f0f39e7cf5fd9c5db680f4f9de43429a9be7e46d84b15e2fe719d2f3819fe0c", - "bf076c8ec7447d7e02d0db55253092062bab163dfa9524f58df7b0f02b198082", - "8044a3e3225961e45fa93c8f09f81508bbf1c9c28a856e189e7cd8dd81748b87", - "6d98fc705f0a8e87fee496db4a3c6a7480a59a1153160cf16590c2b117823b4c", - "2ddd6d474120b5a34b022002d735bdf68e0776abe7f44f5a6810cef6b9e0c2fa", - "f0f8b15d4806b9fe75bb33c2064fb93edacdba356fb349be6649cb5cd5c83276", - "0932f881cedc1a84fe9d7254591e7227d5bd163286a650e40ed4ead6acbbb363", - "7fcd21e3f6690e7be06042933a1d60931d13e695018f1317492343c2b1462032", - "114552bf7bdb4266b0e332e99cc742cdb868adb3ce24e3fc87dfefc7516fb5dc", - "4b27ed453bb3569979387d4462ffdf5dae95066631644e1a7a9acd56103241be", - "5383c44f7169f33bf9f765014d23d0714bea998b2fbefad3ce827430a8955375", - "eae64af96cc3e40199a2d6d395a6d066ca896e22ff4aa566582d5a20b6e2caab", - "7d5f5c0d9f2ce39e1cce42a49a8aeea234266da0a3872d23536488b5f107a14c", - "07ecd64875f2983d0a228e572136827e131992866de8bf963093e1b36a2e3ab5", - "a6ac854f74641047b052b497205c76020d2f5478626e5b16621ed6fec2c9a634", - "a88885bb1cb5a9298a1a6679d0bfbb2af3691f9f6a488dd723b263494b51b7a1", - "55bffb082f6478e7215d3831d3a39940042615f537948a43e13d66cd062b10a7", - "c84522abe6153a75a3524166d837e79e458d60463b7654658e2fd289a35680a2", - "6e0a609bcc0c1adf18e76bea364258f362c73e6db48f3e574868916b5ea069e8", - "9c3259c9ad38fe36c5195845fcf4afbeb8673ea40e5a43a58787908ced2ef542", - "e830e6a1bf8ea3d696013ff240e229d8bfafaadf79b9db4008978fc6e1522c74", - "3869ef2ca8833c0fbdeb852eae70e01dca825fb288399cd2fd6f60de63d3c76a", - "2c6637c533b781987c78a246bdfba9fa0f56a095100888c2dc8a22a37dae5490", - "0e18a485ee83b3515ae9d282ee8c99e56b13527a28a84fad96f45630e38e117e", - "632d00ba47cb1f14347746bcc8019ebaa6e3a37508ff19cf9195512bffc66f95", - "47f9f292a73c1b41548f5b12545276c89ff7bff26e61d908a052a7ba649364d3", - "3a9c082cad28c4005935a5517c70877e23b9e8211e704e830425c4c42e5fc46e", - "1a840b20747b35aef8c0c385d534d5f1c016ed820db6d0ab1eb344f5cd7ab3da", - "3dcc9b16d6fbfd207bdd8554c911f32e96f3af9571a8880e3313875f540c30ec", - "1ffacf6ef9d8deb8a37af797b19210ff44fc02eca97e8afbbc713ac676405916", - "501f7824060b570cbca002e64a6c62d376b27bbc414b352ef4af22880929c344", - "2c02547353a6f3957b1cf5dca16e2bd2b340346345499d845e95c4eb581116b0", - "723ba022f8c5be335e906904ea0de0bc6c3acbc971d02c431417b0461c57ece0", - "36ccd4eca35d25077848652b7d2e2e55d441257973afaadb32e965842fe43a98", - "5b7c3dc5e5d92e4abe0a70484314512bd47298bcdcda84beb9eab5d836cdb898", - "921dc3fe677bfe2f5421160c49c14746d3d928552d7a4402069834f7ec407b3e", - "3a979d4c3d5ca3c5eb9e27793332e7670f33962a76476e9ca8955ed2257521be", - "0091a2387cd4b70c34973229d04f6d5231d6f26b6c111c94975e510799127b60", - "f1f6038b1975620e8ade3481c6f2536fbeadf6f86d6dbe4cc6f8a798664cc46b", - "02056c8233a030e98ed9bc18e728236e06e328e3cf44b8ff8eb0bf36a604eba8", - "b5f68c93f1d8a66bdad6cfbda097caa999d1b4905c59f970f399d7e2ae752a5c", - "8512356fd915360ec99f2a314d1ee1b3fd18682875e9388f1dd43805300b5cb8", - "132b498306dc13cc63ff981e93f05caaf2108204d813c23d5ecd5467cee2459d", - "f6fbcd5267d5ba8be9106349fe03318ad5be57999b3f727086f4642ea626e93f", - "7259e243b72a65cfcdb5646bde419c711a8a749c9a4c1e8e39d349bdec3b983f", - "19cdd4341672f6e5ab025fa22e3e43e5ec0312b2572cdee0b3b2b2e46024843a", - "7969612baacd3b70fd5f0c4db810119bfaa269e40157772fcd2c8cab8df35598", - "5832afc1df4f0fabcf372198b334ed72acd576ffd350e8738ad85051a9723a08", - "ce5ab6bddd36c6a9f56282272df2e960f78bbc1e1714f8d62e3475864a570d50", - "46e93b23fc64ba4abd4090efa3f75cbf84aa64e76019c3b4cee2fe7b0c581ec8", - "1848ad3b618be9687a7b6c1cca6e4d2bd90f24185979002a80a252326e8871c0", - "cb15d8ef7bf34943da1f94d544d59fc79b6c340811b302f17b29860a0d237c6a", - "72eec71ce33705f8e157c1632f0e1ce1b0ac177a1b36f05a8dc1360751cba12b", - "85bece49e9c3c3202a91180c53708f49d2abeef759632886d5055504acfbc634", - "508af3c7a4b140abc14eb21d8c75f9ea2772e4214a414e809f2f60739b66cfb3", - "b961c6dfbd866917e6d52519a8d24da6a8b822ac74663cef6455b1ce618f4477", - "e9bb788ef092618dec666bd25b3002a3967bfcb86010202028a581e08f7c8636", - "e34dfd60263169e5c43c4c456e912920e2e7c714ade587d260c2be5166e4066c", - "1079159a9b2ba0cb2574e2f6f360c9426dcceaaa3151eac615a3062af02d4815", - "533bfd1e289245cf98fd2bb88cff187005ef2e077052913e09bc60807deb8fde", - "a73ded9f1904a37b9aadf1a400db2a9941a11d76906a85ad800f2d47843f6c79", - "e74dd9a3f07351908d0a79cb7c66627ff53f598095188987947e023fa8cba0cc", - "5e786f897033d64273d010496f8bf8d453b54327b10f136afa465d5e7f9adf60", - "f138feb4ccca28d5980e9bdfc770233ceedcebfa0723056070b593884b5a3a20", - "251d315ee22f4673c0fef4584534223195d0cb7c10e8a237f2501c77ce783dea", - "5aaf3cbdf6a1ae1347115730c6fde598f8c2bec4eeb1361f23ea661312d72018", - "ef26e1de633840ebb34212cc46e7bcec272baafda23f247a5de7328ea566c243", - "f78dd27ebbfd388f7d7878bb8ceed8e59b9db3dc49b96e64465a233b4108583b", - "5100fd1c6d0ab699ea8336b63ac0394128e72b1d72b7be0465f43176f3744f80", - "11d10cc3c047c0d0753d4baa9ea5859079769d770732c03824742d6a2ee7de5e", - "d4e2373c1be23dc0539f761c9284c8d21f79892bb0ce65414e446af7264c3bba", - "388e033abc875468cad29267f01e302308a70a6a4773d8afc22da4830ed2c75c", - "f0ce31456ec25a408dbbab295ada50e439f72a5bf7200ff6c64dcd7c8a533e77", - "41baffdfdcd087215694cb9831fa8ab79d89e2612f8cb220e901c8aa05c30eb9", - "8ce78f43640b90a09ffbcc2f492e853cc78ff332d300b7353e236be489577912", - "0183a84f3fc03d50e73d927e03fe796073c4c43ed925ed9b9f8116743cb2cec0", - "13d23aa1561e1e92f42b17eafae86c2bb90015e8b94de79beab323826f58eeaf", - "421a73c96e7fbc30f2db77da09422fd2eebd2a91fa965035c5895ad92d9be5c0", - "2a2a11c982462df26b1a356955622072640687876e90857bcb5752067543b2df", - "15da8afd072ae0c7b9e8f3f242688d3655e24123d9142bdc965c4cd93188af59", - "0d354692921028623179b0d5cb1fb09abf66a5cafd3fd842bca356dc4b9f52b5", - "e1de38140decf1966fee2df52a149ee3a94f9c11ca433ec2c49b0e93a94e4ca5", - "e45f91580274e7f461ed52c922c3d339faed7a0c65764e19b6673f30bc3fd1f9", - "9b802a561cb12328a62d86257a62d57ad5c7fdae2d32cb3681dd3c23d726ca63", - "d611bf4a9043588e4a6e66941f0006f6cc4e6549aa6753e6ed478860deb660d8", - "bab751a4480ecf96d2b5b5b14e18c5c2398b46c13e17463897354e296ea3593c", - "bf94e0a31e6dc079fe64eb340cb28c2113e9fb2f4b43c321f9a2d86e1c0d0d7c", - "6e0e7cb783a73aff5e528f903def437d78894ec3ab1c1ea547b0c5c6d71c4b1b", - "2c86a98cceff411f2288649191119994d0027ad63a010bea3c928509e07dd1dc", - "81b0775209e7a23fb0c4732902c04d5d18688c7864a5a8f29c0a9003ee56bc51", - "ef6a85329f97c9e5520d8162558b9f32c3415cb53d4a520e7ee37752b3b6e59e", - "8540bfc873b52d287c75141c4887ad220c68ecdb06b9293ad30d62c77ad26d9c", - "d94deaa95bdc6584e1ccd2f2e0fccbc0f80e90ee90b7664c04cf0dd03c7392ba", - "7e785f2a4125db408275c7abbe75e81fb2d09a64c709a6986e317ef340163504", - "fd177b4e0cafd3bd72d8b7f7951173c17e64901928a5c1623d72f6420d1027e4", - "cb06c31b7ceb0835c7fb32efe6fb277fa7f24962a35d5ab58c3eaaf1465ccc76", - "37cbf1e29c24769f054bef8d4daaac53932fcc8ce58e62cc787b2b75a8cc0bf5", - "d224864bf55d053dc39da42fbca37fa5deb144efe653add11b673baa48ee6b07", - "18a78886399c189c730d161469e73129096986c5774266d9a5a135352c700266", - "03715cc58b8cf6814f0a3e6cbed27bab611c6e4bbb94bc8309e9ec31ce55ef21", - "89404689ef3a579533e45c58b8799d49df0977cbc9558c737d4ee670ed8a4fed", - "8202a99053d9e42ce98630ec141a2fadb81dee901f3be1feac3c58c75a25817d", - "73792653db5d9485ad9f501e8c3f27b78c1a8caf5bc202c9981988949f5bd42b", - "7315ee2f1688c12d3e2c8f5081c202603dfcdabbaadf0fd07a4799845457b3fe", - "16df3b93f2164f96ba96f0984fa3a2ef702650ee3245a7c4e94802ab5f3df368", - "d2be9c1ec09c53658cbb38683ba7068c5b5430b104b186fc627de1a3fd46a442", - "3b756ee1198c06bf6abadac87e192614a84ebb2341c9d62de39be1fba7a92099", - "017f8b0f1db19e94e5190189ac45d8eca32e1248ebeae9c6cba36c33b50c5f48", - "8ce307de4d1a7af97b35b129d3ca53f8f7f219595d90297b0a843519508741e1", - "f8acc072b61fc91137380b3a5eed77bee165c27618d47fdc718909ad32341869", - "865058cd6b6f8f6e7741ba6a2977f5b428e2062befcab739a2ffad873af52a89", - "afe0f68ddef0313e519b9fda53e941486a599d0cde24dc274ac0c8f28de2d9e0", - "ae42415018c92eb6d58527abec66e4461697b7dd245220aaede1a84b66aa7abc", - "2ec76227223e01e5aa2bd6643328c80d0b59340a0ef8316165660a133f326bc9", - "fb7c5d634f0920d545e6d4c1ab235bcf3486364f03bdd26911ba104bc10c7d2a", - "9ff86356a97d9cfab528c0faaf34a6c283693dcb885e78b557885cb1932dd214", - "d6bcd9d82a0d51c082065219ee358ae5a35bae237dcbf67315ce0dacbb600395", - "c9b8f1f1dd64053aace1d7a07078a79b2aba67112dca79e8680083f7753b2737", - "3f58d71c6519b63f250c3f0de4fa8e44d2ad0735c518cfc9d6bd5ff3b39437a5", - "46c0ad5b12e1abf617b4aba2981026469c11a381d7d78c6ee9e525accfd04003", - "d48cba22ca9f1948a7ee9064ed652e6abc210ead11ce16a9ff6914ea3d6b6494", - "7837100cb83e72c79e8178f0ef6b003501b593a21365ee5da536acdb588549f8", - "357dd7eb1ffe4e2c599e58cd7281330a179bca5642651942322349146ac9871b", - "1c90ce864ec18704838ab13a2cd96d0879877a7f7f57aca05d096728d093b7f4", - "bdcfc0389507d8df5587e2ffc64e1e4569e665ce22a37d2be03d94ac421fdb62", - "bd6b980c36beb73641a8b878993a61859f43fa6b360a2e2c8b255a902ac5ca4c", - "cf975f1eaa53d012a010fda565595109daa069a338a6fdfbf2042b13af3f42fe", - "65dfac4e3ba60deb16f0336b8765df980d0678c80315cdde2b0547708a358e24", - "aaa51fa273502bbc73eb0f2c5096e865037ba80996cab1359b3c4c3d700fa89d", - "248697330cda7cb11d910488305aa2118124d296fda506f03c1480ac4ac64da1", - "4206b78934d05b12ecc1cd436317f9bf8d746bbc6f2f9f2475a4f14843c4bf11", - "6357697600f318d8c6466738de0e940362651acbd03140d1a1e7ab3bc8d46781", - "6f6215a44c10f5334e324787a2c1a482a63bda93d5057136ecd54eb84089795e", - "c8b105e3771814af17568d92a25218739d0492a1f44de5825925b7e4b691ac07", - "cf7967924d4e52cb776a2d77132c9cd3cf08e1e059e3e1b36a7b2ef098a087d7", - "9bb7a263fc38b731f6e4a21ca2ee32339ca4f737195a37ff64e0e9e2dee85662", - "9f51102bbb43ba3516d01b9ff5d046197a0d4860856ad23b153194e0075c48df", - "683213a3e9425306d2aaa60734a46cade35db6a5f06f06e32e134817a2c744c0", - "f3f04a1790b2a85b27072c01d41aed16d9b727b99f2f684db1e5dfa554afcf0a", - "6551076ce4654a790673c76d224c8ffcde1e63cc5a8435e2df4912c90db9db64", - "3fa7841bd36a7d5bcfcb7fe5a66f50dc060458d8a27ca83866d5b5231476c59f", - "75eae322a360928e8d47f52f3bae12badc67a2f9cf9407f84260165ddbfe8192", - "569ffaf93f697699237aea429d8b696d567396dba1355053e934abd3dbf2d911", - "fd20c8fb2d6e9584b9e37e7f936d3c3b6d19605cd355fd6976b67ad2b168a081", - "fc9850a51ddb6b83425af6cb3667a0faed3e96da44cab4ad52681b2a81849232", - "354ac8c643f23565e0fcc4977434571393d9249f2e6213ebef0db3fde5636987", - "b5ae47071eeff417df44e434b6fc428e1466613496c8b8ac926d28a57efdeb7b", - "8d3dc1b8c90c400429ccc9ee2076465676a45a2067fc9642d7c1dc44d2e9eb3d", - "5cd09ff7f67bf17e46fd5e0636734586fa360e86afa69a1a1a4c706cd772a098", - "2110b520e3f2f7a8d1cc0c89a1207a1197eb0d6065b9d1a89aac62966c995d5c", - "6a98a9db920d4ca8c04411ac9f6dd30e8d6049838063671df9029b6f2c0a9854", - "6e960090527626a399a358d5ee39f2e469d477764b9e10d17497d4694471a282", - "0ca9a4870a7469e0a584a6a9188c4fbb755e9c54a8e0140966fb2635751b612b", - "f7980275e6d9cad0703af6b37edd512103005cc4378481369a3b858c8121dcf7", - "c7c1ce5f990d4e93a7614f3e024c6f07cc955b8de3738aa734bc09ecdcf5cd49", - "e40d67616002ac4cb8acf6168dfceb1adc20ed7f4c7483e633a08809741c6af4", - "719a160736275af560b1b9503595c99e3011dc6f48fd8569f6cbc4f830a6d5a2", - "1e3b3a0f86a799b9322289fd3be9985d419e92f2effbc2facc2b553038e90f68", - "fff347f287bbec5085617ba09a5daacbea514ae416d46b935e0423c2e3d089ee", - "fd629144c55e0332d243b6c0ecfb886f622cfe283d51ed2833f42a48f1290c0f", - "ef7ce1029565d8e557dad19ba994681ee9cc4302eb9ab11786f13756e2f3bd49", - "d8ceab6c9183b79e193dc0fe186dda33d9e1c2e1ec18edcc024cea73e3e28e65", - "c8ba43465737ee2cf6fba1100e9bb2830c720485bb2b5634ff717bc0c8b91767", - "6f5bfe282711ac25fc468697d94f5431c3121bfd84c628eb9c25cab2142b7a6c", - "ffc1838453c48f63aa46dd759fc2d2fed1addb3be744344f85ac691adc010f90", - "eeddcf622839c713bb9f86c7ddda7b1bb85e005de2c30fa0ce1027f6f1224491", - "9f8c26004a7f203846fe37aaeaecf5de0d373c75ea51ffeafc4995c6924d5d37", - "ef275b7e9430bb431f61498386b70740a5a1ba6e9faa53d56db05ab5647e52a7", - "79e1115403ad244901ebe2e4637c4ec22ebd1ab39194410530ee0abceacabc4c", - "fbcb01f043b803ab7d75fb71f6cfd0d09ba09cdd62ed7f4f87b8eae4597ac08d", - "ea9f8b5eb8627f83650dd315348ae634ffeb0bbe4b0e4d626cd80450d2ad9325", - "4fa02dab7a1894ee5752d1f5147d6e36e6aba5967b32dd4493d2e8792d63569b", - "d391f26dfef1f1c83b649318bef610a3c7fbeeec6e63a5b7656ad496de174fab", - "a9b4d90cf0dc736c728fe746787485c2ba27041240e516d175712bcb896213d7", - "af9e62eef798a753a3cd35d96c5c1b09f35f6a77bd5c6fee6831c008503802f0", - "aaa0483dff1abab120e966bf221b3d2e07499fcbe3d702ca4a2580794c324873", - "f80792023e30da1799433317bcac6fee0c9cf298037471dd27e831e1856ba582", - "42390a71f34849018e9fe1f62d7b69f7a3ee5ea14e8e990e26dabcfc4e999fd8", - "c992d6fcc573bd8603686a84b78951e60165543855d79a86193c4106ae221213", - "d757e4d615ac18e5d1184f6fa282253b7fc6eb5bb82210bbb8f97f039cd07e88", - "21b55e5b637d8f29e3c85a6410ef9e73294ab0ec2bc1bbbbcf7015e111c5b88e", - "a9ebc0bb65dbd6ff23993506ef6344c8b0e92ea22f6d4f6fd8e81a0767622fb8", - "4202f7188fe4bda6fe38d4911b686182b981b62c4c039be95714f90e421dc090", - "35e14d876b3d2d7912af2252ce64ffa9b460019b0969c39c377faf3bea7f132b", - "c538ebfd9c72215cf3dd82441b9faf9f72cf8bede95cfe0b1d2749edac95f982", - "bfc508f5650815dc13ace84c9f7f09acf5445c33751c3ee99fa4f2e355241892", - "c03280e9487614fda4e6a57554854f8565ab74f8b0288dd0c04c817e41a9e746", - "ba40e894cfd4192736ae256c66cf3142bfc07df808e3153950b466a9f2d6e351", - "e866c06d9c4f7e06b49de32cf3b9e427430efbf57e1ae4bf084fd1cd1baf169f", - "4b7dce3b04d5186f12301e36dfc637c895de7439aef67e688e19f620f9f53644", - "cf7d97a1675fc0f8f99b485e8eb0e6b0e565a0a74a89a200cd7a62a5f687bfc0", - "9e2d6d4786a0a6128ad25d96e840bea6cc89914d92a52468ff5cd427bf525022", - "451785c106bbd68ac5b4416efb31a33c21a0451b8d81f1b631faf1bc4698730d", - "bfd5a56960b3490ef4914ca478978af58d80b24200d350e603a09ab59bc6e57f", - "cf465d555b36cdcdcb586e14104ab2975da1776476bea2604a260adee6020d6d", - "f4e90c96bcd59b62a9a19f48ba85f76aecb60c4a3428168a9f3b26454c5e501b", - "44239c00d208f8ace672df20a8c85181611f9d5fc3d868eca29016edbb84962c", - "4e232f7a0bd459f13924c1c2c9776cf5e1def0e9f3ad5ebc2bae07c2f2dcafa2", - "f5884e781fee8964e2f934b372070a276b301dbd2e316f44a3d5a544ec73b600", - "fe03cdfcafc3bb0ec1c4779fb14730505de760e3ddc4c108104e6429ba5b1ab5", - "a4f38ed0c9ec84b10e3d4f5516a39c740645099b43554975ca62293fae3244ff", - "5efbcc1899396e903683c03ce965cf140ee46907f29c6803f41bf5027467de5d", - "1597d4d9de6abef511ccca8bd18b952a85a5db61d1d9b59c6e4cabc3a0a8775f", - "e638d5d1b31262a8886d5e0125f3bf2154283bb2ccd779900b9fa365c12f4149", - "0e84c883948cfd3250e79b0f2ad3afa4be0ef78c7d08211a15f10e385328b603", - "ad7d041b989085fe0c09bbbe301524f78b2e6bb6e0b992c5df21853a24a93954", - "b17bd74ea3d28bce249671f47b975eea51a7530db2627d2213908cd75a55dbce", - "1be274b81e8538622df697748ea38805e24183073fef95331b62adc9ea6f2f1f", - "85f1d8c38b241dcad16d87ca68d9c1b8a7269bebc166486fdb68bad42a9e3aca", - "905175faffcbb17261f97e8205b3d3742a0acd62afada72a7803c49b95c6a766", - "b3403f7aaf1a50567701e1911ef68c3db3fc3f52ead167986969d5b7dd0683e8", - "497486a9e2867adb43e1e2e5022dc623c005ae6bed6e71cc8c5ec842b11f4233", - "4d930e7809560c0cfc5692a1fc8f9265b9c3dd2601b384ed90c08689f3758a7f", - "91906985a04737d3792fd1b9e7787f338332315f04d527ce12d672f64b20613e", - "e7fed1a6bd631978863d9a1b1439efd7a0f71780b2804562c1152e101ee5a00a", - "dcfed86c7602e48112cb41725ececc135f135fa36dee01c2cab7812c822dc2d6", - "b2b420dab96fe9159727282b981b172c93906cbf8fa15db89f7d851f2b7e0b07", - "c29b6fc52e370adbc889a64f9cff475ee79cce85f1b115822044007f9a05dae5", - "918944702c3ac8ac57c2bc6f9e61fad5c4e70addad4a5c50187b75b9638c8712", - "cd3dee7a6f24545d7d98d23c0429c6dfcbb1f7640040c5dd6becce71ba34f428", - "0b33125eadf28883d462c930ad4cfa3418ad389cdb3aa29cbc49de2dd70d2101", - "034cd7d7c8ce6ecfaefb6f307d96194dde1e4c078e55159f98126ad762d49be8", - "fb90ef4c61e3802c9f55d14af249d0157dbbd386e09dfccc64e80f58f7fa707f", - "ab97ab94b7a8c434f41d72aebf45bbf0c74d24bae9454943d212f6f197b2f815", - "1332674470c48ec7c46ae8a87c58a7c1cc8c62ceca82b0b359eb464bd79b9feb", - "e262951cb13ee494a66efe0a956e2d75c844290331cadfa0d6cd70146f2c8658", - "44a605992a83a7ec9d63a802ca1facd46057497c58f57b2b54ce2d4813536bc6", - "25e9cb85b35beece93c05c3dbd6af9ffe672597f231efe1644af2d3d405eb2d0", - "7ff3146b25bc9eb366de9be868c9ee252575b602ae7f62fca399eafaadc88fe7", - "4a27806bfbc35524b59758ca05823b4e515a40ed88bc837257a1a4a3c9f96285", - "39504b499c551b389ac8852155be634d36f53200e2394bc41de057ea002b78e0", - "d302aba6c0231d4ec2163b6419bdc80eb1d8d9aee94db3e2d9622f16d925071b", - "40183d04a6d4ed218c18f8092a4a75dfbe88e15ff34bffc3b6d5a2b861dd08e7", - "0f502a0f618b4b76f060e446cf3c314c4a0dce276c95814a097701ae569cb648", - "e62ff340e4735445b6f0e538e6848df56786a5a501aacc9f3952c5d170ebad6c", - "a5d7ffeae6e6252ed0f29fbd0c98fbb6272e2128ff34156dc85a97e86f8c83a8", - "387a292fcc3c0c98455faf5f96b572692223d19107397b1b6d77367ccb943770", - "5fa842eaba800a9ce6cfa7c0852e642469a719d069170bf569414b7c4f2b9607", - "897019b99d8ae6c3a575e727bff644c6b6d2e545826ef26764190627c03ce1fc", - "c44a7e355462c1ddaa0c2d8ebf15ef6dd679ebbece81570fa2dbf290214fec5f", - "8f65fe9806f2ccfc55e1828ec8cc9a3891b333cb178d6bb05bc3626a08d04b0e", - "85cf6122562921d78cd97c6b0fca2bf6db5b761721fa5ab817b30b6a65767463", - "87ceea594faab94588fc968782aa01ea0714f875c27ba6b56c4de7ac2a83809d", - "5737db5c23f7179acdaba3b0dc124d168733d8addd15973de639a4eb89b4d01a", - "aabfa46bf52ad9375f6b11c1927fb78d7eed49b1b268593007667339a18ac757", - "c2bbe71f32b2824714ecbf9c4ed5afbd38273ef62f0c8e4fa2923a6c568a5cd4", - "98fa1f283563d5f60d7610652d382b3d3e1b5567f168a164af68dab28ff5c3ab", - "58d54c606db906dd145252a009c68a87b5cf506cecbf57eecc9e96e58820aa38", - "b7cb1f5f2f929437dc7d2ea697eae159977b807b0d55d37c1770c3aadac4c7ac", - "807921ed6a869ac67543d04b67c8c63509283b5654a90ec7ef2a7f7998f3e201", - "a73d2e2bbeeffcf3afba72db372920d08cacc7ee30f3dc592239ff78f4f87cd1", - "22511a23879c331be9c8c2ffc0cdfe6b8e56104081823f714b088ee2f2e1f1f1", - "f2b4559db69e7e6746c38789e916e451527cbf9ce979edbbc7dba2632c4c80f6", - "55f4a32ee6c19f0b6bd52fbba5c6ea515da93d45a268d99787fad3af9b24b614", - "7e76619a703542ade1abe30e4b8f1320ab465e4a4ca12c9295c879ec14de1213", - "d12ed3f4489fbcb099914ecbcd60dfe0e6523c1da7db628bafe4da34cf36b5ce", - "7fcede6a961b5fe27fe69c9bf1b23632db84e26181c13f34765fc7b527ac702a", - "036788e3ea67096811d54204c079ef2e421d89f7d3b81f9331459d3e5eadc259", - "76a5e5b0e12218128ff9eab183f7b17cffa8f7b550402ec2921d27437d7af988", - "2fd216ab326c559883f81c0f023893838294d8339d66f81eae9911d2c059d567", - "6f8f59ff7054e37b81d1d5b64878a37d77b271a43d58bc8279787f38e558f885", - "f7666a1d23d48d5f199961ffd855ce9bf0f88764c8c30293570a15aec7db9bf8", - "91ba6fb447d415b9fa7769f425924f89e1c34330e038ff06bc8fd89578faac07", - "3c5ca7f974cbd935a92175bf79ee0f70ba832877f5fc28f843d9f799b6a19af3", - "bcee70059d6fb34842276db44678966c5dc8152da7d1e012e5f767c81f1329ed", - "5015ed054cbee64ad0150c4dbb28f9704d6a0edfbaa6cee63107e65b029d95b9", - "9dc27e2ec62cb5a9864a7916b7bc4fd28cbde81daa497c9755a2e4e255496ba1", - "f15c3633bacba98d42bc556c48c9a0ae94c8a842f6703c5eef4b0e6f7a57adbd", - "30e3c521230f3f4650c6ac7f285e5c1137eaaafd713577175f9b9474b4335571", - "a45476f68e5fa1d260a1dcaa85618adedc9b0c2d920a1d5b6161bd628c0ee86e", - "e97f1220125ff81299627b61bf0117c3d46bcb9568441287ec58c722e06c7c9c", - "cf9cbdca5724e889fc44f08ec8efd4015db45340205b8054e984bb77ca09dff1", - "18b56af45da6d03c69434f8efb938abf0b14e386ea3fc8fdd9f9a1a2cadb36fd", - "92315d48d5ef70f98c5f6d8eecd08e3319635ce4ee0342b14fdba7b77af43d19", - "c4dfddf4c1f150e32913c95e235f79028da2b99410ea77f7ef27fa961c832575", - "27ef643156cfe923a0553d5881627fe987e3ad33eb868ffd798f97b18fde97cb", - "b25496e7f03700801277d37b9347faf9b70bca54109a045e930e7358134d2e79", - "94f87fae301254ded6768df0af9fca203af250ca139da8b2737678bff6f76b35", - "694c7b3cfea595c193b2d893e053e6eaaed963ec3cb6d2c1a77680b4378e78be", - "4ef3c849ddaefa8c8327afd3219baf313a8b2757a0179c7d892575d4ba032613", - "29dec174a9f8d5ce692a28876326422b56d2025d454b527942424df496f2968b", - "36b0cde8df3706ff759e28bf048e819aadc416c1c7aa805cf0643a497faaae2e", - "084120b06e8dda27bf27f35f88e3df471e4a7de909fd2e9042e5383c2e5ccc44", - "0e6089b9826314eac0d898aac4264709f8c0a93092774b8c357a9d599c9ce332", - "af47dd8176f559ebb8b95983a69c394f1489b0554c2b074cded198c288c2f428", - "f497986a5b2123e09f8d0816eee8844fda8bd22b97f134023677a8cbf7ec34d4", - "3f2570b94271c4902a62109373380fa28f961b21e9219c2c7c3606768c2e01b7", - "9d7a9e0fdac8b57eaee58ccea72f3af143d1addf038b078c0517b52d7ce9ba90", - "3c635bf9c8871e1f3da3bf18013ec822640a024621737e5807fca0ec13589523", - "c40a881077c60edb7030b7f3b462f8aed817db5a183a802273a67a19b572e415", - "b0a911049d5581ac673d8094fd1d82df65a50308f6b8bf1dab054d8cb941cd3f", - "51d02dde4ab95f10e8863c99ac61664d804d5736784689a789bdab2f32978b1c", - "045c87e765e5c5b6fa623a52edf0da16b55fb05f35ea9b397e6ee28ecb246416", - "bae9ce28900b4e1d58d3e93bd1714adb5ede09e1d4e10163f8d411c97db4773a", - "6063cf733a1e074af79004593e026cb3db999c01e8107da9c75b422ff48f6d2c", - "73db2ef570167286eed1088fa6bdd6903cabcb793eb21c205c8ec5f48f1fffb2", - "8cef9e94406a2b7819f12fb9c715e8597b3e663846c4c132d707e733d5b53f49", - "47dba77a6b749fa9c6be3abf53de501516196d011463d32bc5c831fb44120da0", - "749dea073bcc5461c6bfbb1c77b4c0fd083a64d13555d24d61ca762ff95ffca6", - "c657faf6c1e28ad7dd1a002bfb3b2e4d592c0d53e4dffe810691864e8f4900b1", - "2258d9684f0660b00aa9525a6def0084ce7022b8e23044b4ee7c77e484a0014d", - "4ba65961cfeb83493a1a4f7825725f2e28733328c961bc45bf8a4ebd58391956", - "87d96c06b2f2788ca599e051b511193fbbf56c65719bd947e588c35a48cfe695", - "f715608add5f8cd3d279b3c8d57bf00b78d4723b2096be93eb0acf434eed2799", - "71e524cba9f7536e7b54f53df88c5a941ffba97af67472fe2b215fcf0dd16edb", - "97ade1e6d6f4139d4587f32c08fe37ab09a1d316a8987e8f10c08f24b2807a99", - "53c657a2797f50d34e7fe7b8ab78de02ceb6fb2f2d2abef4cf42afcacd4dcde1", - "30d6496afde5ac0b9679994a926bc6a466b5b514ee0d208d5a3eb42e8b9c0690", - "207ac65748dd7f18ed20701dd56d79201eb7f486ca672085de19e49ad59a865c", - "6542f6d502c3fb0e02594a6e1941849ac8ae3396be8896d162428fffb3d760a5", - "d84eb086ae3a1a848b20f61769914b956c29a3b2a6a4bf01f05c24af92c3f613", - "44a72cf3f7b58772142ee865bdce30e3568cc0f497135a91fabfcd43af322500", - "3d97211dca3f24e1a6c8ddd4d58a2f1563d36681a9178e92696a1459bdaffb90", - "596b5f5926ed778fc92df5ae5a875f13dce306550de92a2af22999ce029fb261", - "9b77450d170519a116c1c14a62d17aed848f2cf1bdd59c7596267ab896751e0c", - "f5fa98d4babadf546e6aaf2e3f93d40120748a7ddc719779af7ba632531db566", - "e4e7ea545d278caaabb2e2f046e0e1ce52c8f3ca7c0c9fb41ee3142207482bc2", - "0b1d965ae03b89a5def7097c731f884576522df960646c6ee6b1692aa4c7ec63", - "2984eff698ad69e71e667ffed61defc891728034b57653ad02828c4080f956c9", - "da30774e2d90b9ff25de3d416d506ce2df4d31bad89455086492ac88542b1684", - "36046ee45646aff68adc4cdc23446704dbc297130f0b2b07697f50bbb8170f3a", - "c06a47324ec757a59f8d4f7d13533bdee28d2de3fd55748e5a10b573d819258f", - "9d90dff9a2658df1bec7d1d9b75549f3ef4fbf24c968627c7e59e8acee88b719", - "f20a9e735549e69accfc14666d15704b35bfe86f1b58d1a8e5f2a6b83bc7ec83", - "d35548825255a40efa30d51e9ff5d77c5d58e4aced29fc9ec05b075805e0dedb", - "e649f99c3cdb758a6098acc1ab68df844fb0255208975ceb1cd7f229341b30e6", - "8a0863e3894a5d1a9f5e890ed435b0efd51a481111a2c204f1be32172055ba84", - "ad1b5193b40c048122b2b044d01d78d144373bc5c18af683dbb8cdd0e5d6537e", - "0f111e3d3def7cd53ae54b5c708bc97b845833476c313a61ac7ba3d3d9d0a6b1", - "508aba0cdfda475a69bf12c8dd3f9a5a1e61ebac94907b3f56d225397c85f3d5", - "4b3b38b9c43bb4a09bc98c3990a031c5a3b1bb4dd5269868d390e838e51b9bb4", - "94b139db09dbcaa7ddef605ac1b10545ccbbddbcaff50aa5aa50b7063df8cb14", - "124c1f5d4f498d067d53a06ab9230c52eb298ca78c1b930a262220413bd0d12e", - "fbd9eb1612e1197cded0f4139cfa5f6ae7086936702f5914623ff3c4f146f78c", - "dd05e3a405ea049ebe844bf69f5425d8acdaa98f0ab7425b587523b0e8c0eb7f", - "36480638579c9108747649cc453c44c5a8aec2eb5590307520590401ee086c7a", - "1d8f0d86540d20b2458bc8466ab789db4d6064e4568a1e0fd62e5af4473ec622", - "786a78028ff411eb48f0820351d7d950fe23f03aa29665822a4b757b6ebfd9fd", - "5a8f4c3f65760124ebc712e112c32bab169a3f57dbbd07447922e9809fbd0837", - "4caf001c0f7b5eef8c9f3fd38cf315ec854d2d606cc336782388e4992bedef6a", - "0681e616d3c05eaac6ed194d7da4fb94fd4eb588ed319a74f60486bd22ea605a", - "4826bc297173f9ede0d064706c2b9f4ef1aaa846e58b042b6c8369440e336533", - "57c235fdddf31a61b6576000b58851fb3eaa91564ed3d8be69ad763b7b398fcf", - "deeeee76c99d86a9f997b26a239b4d6092048bbb587209bcdff969150ec44215", - "a3e3b64135c6002f8cebfcf1a6faeadf738810cf1c5dec785af15332b88a58d7", - "0fab163a6b9dbd348e41396edb844e331c0b3be6ccd59643b78518f4520445b4", - "7468713d8a94ea5adb44664aa5c4d3aede829ae69d0e6cf92d70bc79381d7053", - "20dc60fa752237ad087fe55877adcc07b61d7a63d4281d0e5d3092af0c46c911", - "6c93f27bd82e5f44282181dc6e319bf9d7def868ad9bc519e17b2ce1064c1127", - "a7a84bb729f42a20906ef41d158b894fc4bd96d17e8ac1ba03cc15b1b5904b2d", - "9ab7e7878efceeffffc945c7a00bb9c30a8b19194ae38bf54d0c39996c1673a3", - "6ea2b70a38a7cbab309c9c6b4842a6eab6fd430cfd7ce47820f415c6a4f55d28", - "619a97d7b6cc07818a43ab6319ca091ddac2df001b6ba31c6c2d067a6e171562", - "9b9147066e79e7224b393c37305f52ce9268221549ea12629f234d7e73bdeeec", - "e436caac0d949951699f76720c54769ca39aeb198d37d91db40aba0e4e95f0e5", - "0d109b98be0832f84bf9433c50883bab77f476e21b58a8dee138a1b6e2fb00a8", - "6d2da73d165f4a433b58e54d0ec2da44beffcf40710cc6cf82f0a104cfc7c9a5", - "7bb796d2ec205417d9402c74f9d35313b0e628808da463e6892ccd9834758c47", - "f2c83cbfa3d910d712580c4d6116680b13227cc0dc3b2c09a37ba5fe1c818f59", - "5fa40ad33ad359009381de1f18b8529698627785ba6ff9a4b75959818dfd9531", - "aa486923319f216c06ab1b4230780f19d742c20506f8f45d55d6a9fe5ff3c0b1", - "b3f975648d11f0b66c0e6890392b5daa106c3061736f984ba98701109e7bfd0f", - "6d4ce87cbfbf8f123ccc9833ff65ca41953c1dfccf3f7397ac7800d613c73ba7", - "9346ba899d0ea2ac5596c3eb83bdb72983b4959f8ecfc470acfd89168c9cca0e", - "88d0487b99b48ce3c7e609a31efdc3a62b5aac83bb5d0611a956999957830edc", - "adcae32e311775de8773468f30527097eaf0753f0509f4e30fd9404488ca51d1", - "a63edf7f622a75f16cff47463547df9c938e8c5f155b79713d544ee2fed2ac0f", - "6d3108274c5f10229eb1b22b86d50a71a481f2fc0cad5845d32b546ee77c7b41", - "40db1603ca3d9a62324ff0150c7a6672d2216f53371415e58557880b8c5e6f13", - "993dbf7f567da31ac8c48a5684134d5135e4ef0357d67a049221ac4e1782c0ec", - "e570ce9075ac409565503c41ca82a33d417d21f15344c36e8ff3322c43d46a8a", - "78ebb25de9c63a8e1861d023efeff2dff8e81eeaa3b8c475b06e9af704db84a4", - "937666e5ebe385a2afc8f559df2a33a9e59c657e9fe25ff6f0b8043058a35610", - "eb735c1aa6cc34cc33600c2ceaa8decf77101c833f1016a62cc662253203bcd5", - "b2558779efcb0807c3e6844b8eb6a76218961ea0a12523a8fa241f0525ecb70a", - "fd0e9e803d575b3ac636d40099a514c228428a3b58a577a42ba011350733a7c9", - "554e0faaf21358c330e23b59717e03e5161b51621c4ac110e74ce8cdc283bed5", - "7054dffddf7e3716a7bb50c4ececabf3f069581e20e0bdf02dcb0663a3273ed3", - "7584e7402569dc89a4f14f15cad8b4e0eb63708ad2520f3ec315a467180bdccd", - "10b549adbaec0ce3e856c6a3d1d522b94557318b59c301201d6c197100b7f616", - "19ac8487eaafba642617c2b27d043ae86a822b18902190c528ec1a2ee65044ee", - "cdeadce9876416d1c5f2a40214aa0eada7307883b98582105c977630f75083fc", - "90ea166497781f910edd3e6839759e6242ccf7dd75ae9962365e050660e85a1e", - "b9a5f95be42bb42e8d878cb951595c21c2590632950a21fc128a899ff711c762", - "4f80e83bc152a2a5c93452d161938f4437f967458dc069abb2dcc16b17e94fcd", - "c9d48baa287b9a3dc69b6f10c8498eec6f23e81437289c5e5e385063983b927f", - "55b1cbf6bbb0721864d9c92508cc49c7b6edf8dd4b6358346ac7551e07e60940", - "583b59de20fcae56790d05294ad11030a0d54ff366c8ae47b8287efda1a2d48e", - "aa65f1caca49b2a8a2d7297a8cda284ee60b5dd4b2e08d996f6878b07208f2f1", - "8b80b9f6cb2679a901787ed14c24cdff00f2dacbe0533a1059d6cb50c559f128", - "b556273b53d474f0fa129a324fa5464f3c182fa677f9cf98d9eb79df8daccc52", - "aa7822aef0d7c11631ec8ed0453986b6ad8c09e150cb1333ed39fb43cf1469ce", - "21b7d01ae5faf00d33450b0c2ffd162b5386dd950421ee7afccd95b75c68dad7", - "f0b31bb8976e9abe8f5b6e5a8fb1ca818e550ee5e5e1fd5deec8f50062db7ad3", - "351f8cde0924a2a91f802822e33018f12b92390f661ecdccc8708854e01b0088", - "a5ba0266e1039bab44a7f0884abbadab2ab285b3fb2d8c36ca7538bf1204cb19", - "fe17d37e9faa4d0a4a5bb6763f5c685b28058e2cab174f7b8db9020d82749922", - "414ff65fdd732cc7d5380c850cdb6add0efa235bd8b13051e1f4a1d21286976d", - "53790836233892c355243cbe88cb149b6192e726994c55eeaa98a09a26a31e85", - "8887483c4031cf3603ebbc35c34cb290a492f9b71774d86795c4c6c668f71edf", - "73ccdc9006099b8f8569b6b9ec5050a9841683495c6f9588d72861a3f92abd76", - "2d9bb6a3e4eb2b10cc37f3c35be68911f980e2f7371e792fbad1a12fc3470f40", - "e207d6f61152071e8c6a79ca6cbe52feb3edba30ddce6e1f58f8a01c2c26f564", - "ff38ccd056bd985abd7c5f06b492f2430d8e1b81728432ddefa91e7ae6e056e2", - "31fc85fe3febfb0a1b217b90fd4b6560c49cadaddd550eab10b46f1d102aacd5", - "c2f3e4afea42098b5529a36697eb9a71b67674ec0be68af50c4f74617b0225be", - "fd11807abf4ec6cc6f86dbf7ee5658e5c8360e64794adda346f1e5d1bec7dcc7", - "319e39e7ae8dcc5b80235c27bbeabce7a8c7f8033d9a5075dfbd8c24d3ef34df", - "c86029c98adeb58a0f928b3a13c9e42c4416b2e7a6df4af1ebe424cf487e2ace", - "129dc79f9e7753cea37b1f3d2dd9a93f8084ec1224c2a07b17a4be7aa8cdc55f", - "dae5ad71df72555ca9e5d3ae52785de50b0ecea128044b71ee1342d8ca51047d", - "ae9426a82e06df952412b39720614ae47f6d1cd412f507c3c6c9e01a4f73b1de", - "c457de6a96cf210a01a58a860f93bafe47dc829da119fbd4c0820561c79ffc52", - "66080fc41767aab7d413751ada1a660259310f160b1524e79b2e9b1dfc8f2682", - "0bc0a8a4849768b42771015938d9bd0284a2a2fca47147593d1a5b25901b7967", - "df211749c21a40c18a928f13d60bfd6d6047e24e09f17e17db41487bbb26709f", - "4df33fb12c814e8b71723a42ce3f0d358dd881dbd4bbc3580e45bec86f954bd4", - "369e068ee7af58020bd4155e23ce3e24ef709f070fa423a19efd5cdd3a7e63c9", - "c487e5dd62278cd85630b9a1310638966d7cd89f763285bc4c9f2295a4ea8fe5", - "d99a7e562610a1554ff79efc03d4dbbb731df4219bdb974533684adf5726d692", - "a68633df3aa7b7f28847d04ec6b67ad73da5832cdfb9f7890f62971dca081819", - "cc5f2f292068cc4ce0b4637b923a94bb3547f06773f7f8f71faf7482f0b607df", - "94b749fb6e876dd8e878cb7392b392b654e149666cd8072790e62e060a36faa9", - "ddac0a6333c9196132812b60ca7aa48b5334fb5743b33a1ab473a844b906a2fa", - "4022840ebc49487e8150f6e740c65770eacfa62c0eeba9ef921b9398ba322d21", - "dc4a05309e26b22719cf9fc56283985e7e087f9a7d024845aabf8c664dc28143", - "ed34149ff0e4be03de39fa1c6fb004225b407d2c67c7a21365a6009555899719", - "ddfc678a72a3a44b54886cc3dc3c562170eb456b4cd894c2bbf946663a32bbb1", - "cbcfdb8d9780b332c526e3c26fd6984279649d2f89c252a21c785f80ddb02517", - "136c2e5f7951339860adf764d1431c4f663b74363f4747dcef1e65364a0bac38", - "e2c8e1a3b7c5d39875fa8058d7294ea5c23ab8c25a0fe5345496f0b68fc57a81", - "5439538730e7070789a34c06698f3c0fc4ad689b9ae6e1586eeeaba248e88149", - "ce4b540edc2b421c1ed868f7b1e96073a683bc7a8f7aa9552c5ed8e4414080da", - "9949b4ac32c80cac02e0237b48249a8ea8252627c549d2a38bff342ea0ca0c75", - "9b72f24936306c79d30d4a1af26acd30ecca96d1a4bd6e03cd988465a88a6b67", - "5561734ea242b71d07a53937149a2dd9379bf2ee123b9e66bc8d9474585b4b0c", - "d0c29175526e1ad332245df94cb1190a87ad9a4f63c9375b61a85f3fa38eb2f3", - "cc3c96f88f0b8b80dfe51332f1f1cc14de74861c41c90f7b2e00caf6b5917a8a", - "9b478cfead36f5719ce1c26d52567a0dfabaa8ecec28412e85d528390f878a52", - "2cf367f96b90f85b7e4bb90fd1965f0e91d16aecc833f8e7d8ebe50d56acbf65", - "d74dda48388d3c4840a83994aa169b18715b2016d904315ce90aa5ab0c77a052", - "e5b9e4b23883a20d01c17e9210614e16783452be1fac97e632ecc302746e74e2", - "6c94e3e6a6f3f31205983d9b06cd0fe43c51c7b87114db646ed7b8b724262878", - "84901e0208639f6fbc4f6c2d325b121a15c18314acc93996e6b207851bc6a6ec", - "89700d86a950b5dcddbeec391876e6fed0abe1d56b0a09f70f2e721eca063b0e", - "6596b95e2fa9519e05ed8263047faf529e504f177fe852e8d3be9810850ae86f", - "47110435c67d6cbfc3ca346e3541b330343329231b8d21c3b2cbc76663fe6983", - "4c6d7a65f3584b748472354ce18c241dc8d7c14c444f17140dcf0edfe4e36f27", - "e14045b62ae5faf3686dc7e4a95f7476b971dd11ab0afa3fbe9a35ad93cfd680", - "90cee08209aa748573bd9f6c4b1389f597af908ed4475c6b0b1e432541212aa7", - "4fdf00eaf65f934bdf7c9650596879dd72aee0341c54c549cc4bedd17385daec", - "fa8e20e8c6aa99a31e6e97821d3ed49b431b69bf14c5eb06a637ced3eedad3dd", - "113bf00ad55e06d6986d54f7bef6bd7eeaa8506e311382944e9f5c66d219e475", - "2bfd07683496b397c2c58ea481ba5a975c32fe2aa38ac6abb048e686a304b8dd", - "9ee6648927d47fe02c0b1fa2d75fe41eb37edf30c1d47c4dbd14b85d0ae5581c", - "ae9be3396a006a6c345430eee99bc0860968861c84b3b8cd9c1d97725167b3c6", - "efcd31a03d6bb229d532819f4082d1156882204d8219e64e52227bc2e491dd0f", - "5b42947d0993ab0094f852821b73a4c2e0501064f8810f8b25384ab245a53ba2", - "54b1e0e555cc94c6b06be25af8f4203726916fe775e8b3c145c6458bdadac4b7", - "e0df7ef097587d90e502d38f820a4d6fe775b30f93d256297dcccde1db4bd4b0", - "da3901d05930fe8d79aaf1bfbfc4f12051b4becaef640dd69135bd2495040a55", - "7bff8284c3093e543865b6f75233a77c6beb49aa59480c2c0804934a7ab92452", - "123f0e6115d4df7ad9e2a811464cb8521be476c144454552e3c49e92c3720f7f", - "3b08862783bc1b9a19549a1c10fa46fae3b873335244a183bd636628fc012dc0", - "fa8ff4c5d8fc6740b274872da624a9b86f114edad9020c90bae1d02440e94660", - "5cc8f167f917e2e467b6ed0aa5f37dc4aac2d90815074cafaf8ba0bbd5d46814", - "9da68436f3f31cc63b9aed5d1a9706e889b648614fa181e19cb004d93b55e9c5", - "37fb9e08ff1f6212d00dd08e16a0995c8c2280833139c9f5794e86644b74a857", - "0a7e259a257ac90e18014240e2bd81d2f48ba47c03439baef47dbfc1131616bb", - "e3a7a20e61e8914e834672ffd697dcec87a1f8d219a801e40af87d2156716e22", - "11df6aee26b1284a21785d7859207b3a7b9a79d14a466f43191d22cf2baeddbc", - "e651649ac9aa8684c7edaa9f0c50de6d7d6047ff6ffe761425c42cd52c366290", - "abaa8bca0326ccf107e17b8fffe74cb6e3db291f4d233408bbad03b5c5009c44", - "3a3dbfbf1e21991bb24250aca8a5c44483206882089cafc7538b0c226e06bb8f", - "db09bfb57ee769052b43870932559e063a9c92f12283b92290dcd36ccf4bbe67", - "eebd65978d42138139969fe412400338d20baf8a324e1ebb932a3d129487bdfd", - "517acacc25bafb1ae8fe597c5dd53d8063c4a9fc87bc5e4107ee078199abe398", - "2a4abbd1150624fae59ad8b1535c9864d0c637d4670e0c53bb540b1154f097d1", - "ec83f663e4d0b073acb53a62e3f860d0aee1dd105ecfd355416cd5a1e7093c55", - "3114bab17516f689bed80f191ee17baf1115a69cd5edeb4f1a88215d1b620a69", - "c55371c4d7c4ea0597e53356b1a033af96c4790b85e37d94590b1ecc7727597f", - "0240da0ff5fc1862b8af416c61a3854293769bd41172239d44e218e7e3b1950e", - "7e3d393795d0ccb3c69eb2d65889a842d27d8eafc43449a47a0b46e9d70099b6", - "d36e3ff5322c5ace55033b602190bc1b61ae1a914b333739cdf81127b048adc8", - "de5f7c119f57c7844a1c84c3fbd2399d90cd84483d1f8e1475b725f0d0fc132c", - "89e48a7fb06c52ba533daae3742ef6b4f0129007381d3db54e3e5422eb82374e", - "061ce95275ea76681dfc6bfde5bc217912b4664d8dbae0b89d9013b390b88b1e", - "99c9341a84fc0e489c3f2a206524cb0ce63bc4e6568dd2222beff0254769d698", - "33492f52f0c5fa8af491bf09cb9a5677390ba45a1b3d71fc2cf70294b8ce3ec8", - "3702d05f3832ff34f6075a185ff74098273d1bb474cc2cad7a09c68231a12c19", - "8c8becd36c645d30b431ec5e739f9953c09a35c9baa829147f766a0b0c0c58dd", - "fc44a3db31bdada2645212fc25db8d117ad956351a8bb0314dbdabc3581ec6f3", - "4004342441fde2fd23abd203d358844c425326b711cde1c430172737085f8f11", - "464405af517190d1bd3b8e4f3ebb445fae10191fec679fe6b1c71b94032a9990", - "1fcce9c70ca1b6f2544ff850765c5ecdb7d75b606d9c45ff5f15c402401a773b", - "df253fdcf5ace712b065216ca40af4b99f1603fdf8ca94017337e230a13af950", - "24060f96f3e7feaf3cd704fbc4e9ef13ab63875ae7fe3da38b3a154119945cbf", - "a2b216aefb46efeaf05c3a5c33c37da7c333b957e922487c0fb4d686f7e2c9a0", - "8db265e897cdfb70863959e85ce13fe4ba81be645c50e716f6f84f242c72971f", - "c4615dd91455ff1b660e498e37fbbb1a2fc2cc44ae4c385d013ea16cabe7b876", - "a4cc14f348e0dd6000960a20c87533a2e14733a2537b3a0ad2c20b1f99231eec", - "45368239b7f37abd9ed37ee390e58668d7cca565d615481443ea830d853fe9d7", - "436d84b732cfeef77750280656cc9c6cf2f2aad2618885ec0846b1d9a31bdfc0", - "f9109c810f97fe8fab61dc8a81806d6084e535a284d295bb324be9ce32877a3e", - "93049c2e289325007960501defbdc95636d48788bbb78e6a38d9dc48ee74b7cd", - "6129f34fd59bbfed15dd211e9ef77a3ae79479a64de78c7091b7c4499fd0d301", - "d9803798ebec9547f2e2b286fcb4b1fb43ba17304b9725bd9116e424d39a640c", - "a77e0a388e9f938f0e04d2f5c37544d0bda29f126dd204be3de50a4dc2640182", - "7654f6347a4afdc09cfe30de575d46e06875b8f595d1336a6ec87115061a8fef", - "2e68799703b7a17e6cab11786a013e23d121ac0af5bf60f9444de699096c702d", - "fea79f78ea58f6a051ec089584b38b753aad261fa69973cda9140fcde1001c33", - "f4f47b4a3ca8c85068cdd9347c56056b0195dc5d646da79775840b7711626b92", - "2a244eae85ad1f04bbd6237d191e31472c5df6a4be027bef3de51e4b4f4818e2", - "453baeb86438bd501751d641ccf6f74053cb110ba0888f914ae47fde90376c5d", - "3560f0301e933416bf825f4c71cdd6ca13a39b72c9e74036dff50b7c80dc14c6", - "a01553a3a36c4096786cb1b2b44f089ca43b53dc996bb316d2df2062caaafe9a", - "b250e68c2a7377475016c7450823d6eb9241bef659d553a4a585ed4cfede263e", - "ff3a222934863f22cb7e508c1802b4fd770b8101bf54636c551573ed7167d323", - "fc8c15dd2d3f575a767ffdf3be57e03d856b8193666b914724995f3090aa837d", - "bbb0b932175d2aa53c660f53c0785323add0de4e887285449db232bb31c417ce", - "2ae8068ee479e2aa439d163ab0f099818e46306f0840261f0edfe784714ad3d4", - "89083207386a8955f1dbb01bbe9eab2650fac0ccff6eeb7b477922da5ca7faab", - "f178065b7329c0a5e03262557f1572607a452ff0870f5f2d014371055d1a2fc9", - "3859eb36d31fcca9a875dabf5e4e43901816589ad4ed97de549fa81d1a7201d3", - "4fee4156796c901c5bd5962517ffc41859c95fae40f41d6ba5d7dbeae6714524", - "b588df10243b52b7d811a6c1e1b9c73e02afd8ecdfaa29c9f27a27572fffc12a", - "201424bdd14d669202cdbaf2dfb9fb7b11dec2c702be555a6c752b17cc4a035a", - "0f539e9c3260220ede44a1a3f42fa881005836871c8055f268a1c7d147c0e8cf", - "161c1844038a8a96f19b7d4467003a18c15110d68ec24180bb6d28780e936e4f", - "0a164f21b432d4bfa8d7c2dc73ff8a2d7e7c75cb58074bc7e3ab993a249e1c6a", - "728bfcd4fd4a7c72f54486361b306d20877c4a197cdf6e6c194f554441e2faab", - "2c64fc54514664fb72a953e6b8245b8a5b58e52ed7531f1238a3b42c4f552096", - "1e64be06003896b7cd5d17dea7ab19c6a11def478708c068093da65d1952cab5", - "7aa68feccc7bb5cf5ed5ed784d31860bdfe683f48e3c2f6ada5007ed33906649", - "098e405c5d68a2c18f5302b7cd1628d9adbe52a130b84fb55e1d59810e4d352f", - "eb4a3e3119f763c5e1403c052c1e712a25f64f1c77624702623a922b49c58907", - "db41d89997d74013ff8dadcd968ae2e342f60408c9744bdca3f40a30a2c65b39", - "072dfb5eccc05e466654d1451368e018699f3d4b19539fc7b4e6234f515a9c84", - "ab5678fe0c9c7286dc8af4b7e554b65b0d5234acfdf0eac6d6cdf32a63b4bab9", - "400c737de7b7c90e32bc5cc903e96d1376a24533edecbf3337909812d51176cf", - "c97ae69e87b98ca1571b63b74dbad8d87615e90c2fa10a5d1b5990701c9669d7", - "1f7721b28a5da5a484bb1ec6fa3a69d1110cbe7a654dad016217d692c4612b1c", - "182bc326e58eb7e8f8cbe2a7b0ed4731422e9edf3a6284c6ccd845b59f669ee5", - "c649e2e1427e12ce05622d499387182353a0f4b30b5a6d91bf108ec38c18a6bf", - "aecfdb81489f09747c4ab9aed9e35207f087cc33dcdd5d228aea523ec8acd97d", - "fcaba76ee0702ec44d40afb5072ec83b25d7f79aa4b893e9e100d689b6953560", - "19d3a11a46d7f735e87fc5b4b4b4274a3ae78bc70026413512b22f6cca60bbfa", - "f858bf72ad5e63d3434057d9b790be4e2ce82651d80c776b5dee6f3caef05d94", - "6a0616e2e30d22b1cd5e1950ca396d6869c7802affc308e5d2805c09e83017f1", - "8fa0fb9dae001090bd4de3bfc1b9306689699d447c6790fb68e723b5b98596c0", - "8628bb4b0f89084c51317e03eaffcd6373f84bf004724b2fb44fced1dc1d0f43", - "7e3593fe1aee2bc05df381aaf3cb2c0f3ee1b31fc2dc13d1fa510616cea89429", - "ea51746efaaede944c3397e41ae72b7908c8ce25967c1edcd02618b068486feb", - "64ab378f2b5404faa8780efe5fd63cfa315b36f224ffd91a93f34fda9c62762d", - "bcd9b167340eb4f3828d0bc4e87efc13831c6ffa813fbf1b3edc5050424c1dcb", - "940a0cf563e7c93486fd6b0ddbf077ab1f3418ab8423d0bbb54e371920213dbb", - "45a9b4dcb9899a320c302056030a617802ac893a129e603cc630a319c463d3f5", - "b116e7a4b34e9630fdaf08c88b1f89532635e25e8a9a642b2dbbd31ad01e56c0", - "fae93120decc648e11ee67be4b9d3ff8b15fc7449a79707ab49158c9bad3dad8", - "35ce67d738afcccbcd8312c1fb68197081c175cb88e25759775f2ef173cd22ce", - "9fe6dd073c036c390687ccbbe1a04d3a95f176923ab9237ed1c89df4b8b411dc", - "39967bdbaa8de36ff4de393cd6969a43870fac39d1651e6c9d9c08e047af2f76", - "00c30156f3129f2854a72270fa2e78e9ff1e55aa68f9da3c9af0f7364603f3e4", - "12b4ff7de4857c4e3924c92a7480f570842aa04869a94f6e2a4e8f98b5780829", - "cc824d33172d9bf7b08bb5dd9e5ba851514be6b227bf5a6be10a9a8053119be9", - "0b144e17748d3807579de44448b72c2757fac728571aaf9d3ddce5a501ffaa7b", - "4f79760a963ad59110709f0eb6e6d8012b4fe3de6e2b5b9c92a5b02cf0cd1bd1", - "c7610ee41a961c01f66e8cf814ac8d755b547b3cb3ba0890b7916b5a8ba5271e", - "44b87f0456de94e812916c7f67db27b8024a3e7fe318f1edf26e3a3a4f531bbe", - "a42758eb291d971a6bef9c71f5bb4caaf02637ca25659c29baecdaef50a294ab", - "8ce92698569d8c4ec0fbc4fecb7245b666bb9ba36db6a050957a50d7131f9799", - "085275518e84c6f41f73930632af1b8a1cacd3dd12ffd22a2f0779dc063fc756", - "746f2f418bfcb142ace173d2fd6872b6dc5c39ece8efb072f462292940966c8b", - "710c05f2eec7b36eaf45e9a550660257f61ded4f54ba768ad166ebd124b7032a", - "7f47cb521fd29f2305a2e6a49f38d86ce41cb11c3adc07031ca178ddb0e74b84", - "e1a97bdad24d064e53b416686ef3369477cbfda20242783b4747ed124431dbe0", - "0f2bdd2dd03d961aa8e0cf8732f1c393a839fd499282857e682aa3a11ae98b0d", - "e28647e55a4c04afe62db8530f20475d3b69bfccedbb1aec395fdaab62cfa176", - "020f8953a0d0e9b005ac4b7c5f9c5a1bfacd0bd510986ac8fe03b06cbc854b97", - "f3874416cd6f337316917f79c7c34874eba462348eb815893a9572fddb6ade39", - "e743de1c3097e250f4c10fd3940294d9eea4e1c900214de8ba0b9a39917b162b", - "23c9b49f9b9765213dc8dbb5cfa96fb3ecd69764a5fbc761faf54fa2c68ae05a", - "fdce23fd219b56fc500a3c0db4774ef6634d62e5705a4fae3da115b5aa232d12", - "092756df5b79bcaa799dda7dede8318a6ec312ce43c755f1fd07fabc28f18664", - "27229db44343b33391bcfcfa0461dcf90255da41363cd2d6f0904f976c49bc43", - "49bec96a8b4108584740e54c29708f9a03f4c03d73b9044c65a6103638e3fc4f", - "914fb156563ba0b94c78be868783c1a3a85b5a0ca7e70146a7a928a385b04208", - "0f4bd7978c364b24743087677140c0a0a57fdeb41531034550e9efad0d646312", - "6497dfedfe65ea081f592c57622c943ba2097c7706369bc3976df7c4a8a0c1f1", - "15d5a84b33c082808e9340cee860d207c5b61735847e7a6eb6fca09c1f5c082f", - "fc648c956a3640c804b19a9068be4368ee4296e5f252a66ec5013b2af4d800e1", - "e902368128e7aae8335f2596f0017be62fdb654a2e01511513d930a038983215", - "4ca7977200d17c67ace9c85014000cdd4f165011c0d68a8e9628d6480824101f", - "91ea7008fe644071a0e7d6ee24b956b8517c03eb15f9a76ddd1bf84a931db355", - "2678b2a79c6bcbd8b3d7573dc448d7555c6796de209ec5f98d9d30d7cdbda58e", - "6cd8db8ecd9170378d3b3bda12b0358cc3f4a6b6a5998aca4c56e7148fee7a96", - "a3d3ec743ff7bfcbe6e2242c3c250e1acfc66c46439f81ad8b58aafef7927919", - "0e930cc1ea3ffae8fea4b621d67d0b244b0c7b13c78fe4b7e72c0d36d08dee07", - "83fbeba38815e80176b9d5f3e65a1837cf8cd5599b83dda1e9f136568a5bfc8b", - "653dad067ec5ee8faeaf11d058c8e9fc24e0b799c3ea957355e8d65ae0460b95", - "db49c491ab373af51106c541f0375a65656875b0c0d09a5092a2868f39f77391", - "1849282701fbe5da1c5f53bb5e7d590b0f25751cb6b6ff4347a079cf87d3d46c", - "e57d7cce96af51f9ca91b6bdbc31adf51f122f523c85609f8238ad171cb37755", - "e121613fb43f0ac17a540ea3ca4b5f9e8bf6aafb1911737ecbc682aed3680c73", - "9ac070f3679aa72270c8200816ffb76202c7c8c51ff0bba86da9adbbd0727e5e", - "08371cae4a0e5febf8365925d33f4ba51e506f028ac017c379d2d676995a8ded", - "7e238c127155e79514cf836c761640d34ba4a3f2c79e9bfccb2eb383f5f7d65f", - "1f4f75d8a3fd30b6de2dee393e0be9ace2720a16ec66277fbacd8e21b1cb85e0", - "2d72ceb143b107f646eebceeb1b3b635427161bf364905f8ed9ed1f1c004c21a", - "d034b4e2db8ea791089ce75fee8fbc4a4a8e2b3bece806b7f5173713496dfbae", - "166158c6ac27fe3561c3a9c99f523eb3cd9a7a8d3a9b7a88ed0273ddc62b18f0", - "ecfda65dcef775cd8d973aca10d291d3626a8c77584978dfd6f5d35038cbed76", - "7f0592d39f97139fc8e237e1ab308e8e81a4e654f5e16f736a8378e044487a77", - "b933e4f3949c7fb4debb08e6234b01eb2420a40bd5cab6e8c3a5ce26f8ca8624", - "fab2975578c404022ea6ed4338a99d6208810e7cbb35fe6d3840d3e3a42a9b3d", - "c075cb826201f31b0c6a2da8d3bee2f51e3072aab275880d311f820a4b3cd915", - "3838feef301b1b0a55042358d592c4ddb62ea51bb96b32d9cd0d69154e8c6495", - "0e1d4f535a6084e20ead9908404f8d201716d92ab9b25d52a2390efb7ef7a239", - "2ffd1782623b3668359e989c477cd09400e3b44218b17363053d0cd9925e9db2", - "c5fc6d2c2e4ff3dd85433d79389dbf81535b3365f347065ef006901f8c3fd938", - "5f56e55fcede714adc5528a68f36c0749736d9fed5a9adc7fe6ea27d9f581714", - "d41f1d2ff95e8c9b375d7b19bd7cc27d874e814d6846afda8b685b324b3f37eb", - "70f14115776182307635f3b93d547fa0a15809d32bb0f24066f18837c1531c9c", - "c75681b302316ef598fd9df356e33ceb0d50f80dbdb6dece7e8953ddf86fc24a", - "f560ce4d0d75007fd810d0ef866cf7e0509e2cb39f9b380342ade8726f19a9ac", - "f66aad1aa2413aae292aa67708391e16a656e937750c7faf84ae3bb15c9c4c0e", - "6eb16becb532157487b87c758b02f6173ba91274eda9da74403b9baea23f192a", - "0ca834becab11a00cb96957cbae37ec5c2859f5ae8d80c87c2587d898b0cd9c7", - "fb81c943bfa35a26bdb396135d666ff52a80eb14e315f419f82c8365a2c818a6", - "351fa5504cac3d6ba134d90b967c17ad3868398741a27f9b631f59ae1007d3f3", - "8ab295f0f65054f5a66856b82fee1b65a838eddc5321ee107da20f41e6839a5a", - "ca9d42185b4270c23917469106162ae355972c8cdd240cee7469d14205aee333", - "db6798daafb7d3f2d8e96096b1158874bc17bfe5e001ed857ebcc252945ab35b", - "a8ccf6f7fe62e51ebe5485f2f190f6a7beba4ccb099904960f23621839c20536", - "3ee4032d86f10c2c692ffe742b3628b6ad79e9a5c9d489a33b0ca42226fbd44e", - "c0840fc77ec1d67ee3080a81ee1abba219bbcd19c4f0a710b8759f2a0f05521e", - "41760ddfd1aab47b8f25cde315e262c26705fb974436e9542beee9cafa4d36d7", - "c728258f872b12bd0b8bae1ad75f204f445e9567dccfcfcfb7234cfc9e93f560", - "e245c2365064bcef758ed62c554365a744dc5546d94a8c31fba575907a9c5321", - "7dbd0ada82f555f6bd8d34d82b74f66703f45d42d80bc838c0c25166e02dd4cf", - "fd2c5660c2118737a890770c8ce9724f1b2cf68463e4ec9d6e7dea37a63ed081", - "23429781ab2802916df207281d7a9b84fdff83ba800cb70d14a2b0079129f6c3", - "523b86ce2d6411a7996b295caa3215918ea72d71f5c77c6492da22d603b24bd0", - "0f86e47ddde1e031f5e76f287d305272697dff22dd37a06171127d157f8dbc2f", - "4ad9899fc2f0ccba09cca44978325a1773de09fd47f88272b4faa16aaaf15bb3", - "066bb314c1fbbb3c44691bd4c32cbc5b427ffd2ab6504f2158df9abdb95a12ce", - "ac158631f196b1837830f994863ecc03d67862c503f9de947ea703e2c397e919", - "e59c7740ffd209fb6bc5fe435c4d254b5edf4f0fae92c03bf0b737b7202125dd", - "727065d26250fd7527990b476f4378a726f836bbdfb8682dcad3fd1541cc5d3d", - "c17acdbaaee06d8e67593195cdd6782c7757d223e4d88882eccdb0c8bf81032e", - "2832194f542340d5805eb63825edfb3c5ac868749f712e176e8e7debe86a8ab7", - "3823dff94a1717c30c1ef9497e735fe3d154fd46c7931fafa56d4ac7171fe223", - "c6f2a48957a89ccfcf8b45236d604d124944c7a30d8fc3afb6de9f56ea28b400", - "ba7e84f46a6035ec6ce05cd0c4542a69e45bd5f98aa7f4aac11a77c5b810f20c", - "a638a54c3b8e61b22ab7ac9cda8baacc823ca896e0799a9cd56958195152f214", - "ab3972265a46880ea52d6b650633eaa1c8c42b5d4345705b2d59ed63db089d94", - "e760c4b86d0c562c51ab171d4e7efdac5bc0b4686ffa54e22f896dd2f37b4e23", - "a1a1435610a6e59438d67846da00f5bf170d68220a6ef50b3c9c88f023ae7908", - "58b0db5e72620f6963c6ee36849e99dc5da0316c6ca691004b092be53f377f90", - "b79b6e7191be4d2402a265e0d431ba58a330f008528b85c413a8f03c5c531a6a", - "e3b5426b6b4ad3dde63d275cb256534d172e4183b34906f5ce8a3d17e2b69f03", - "b404fdab99324d61f0ea2a6f3f72005447387f237fd844030aae32c4405624df", - "709c84daf154d472e9faac4b472388c57ee6c2b4a17dd710580e63bf521ca5aa", - "3b15acccfcc48cb893771ed19bfb77b482eace52216ab6d17f4fc9bf9f564d1a", - "b92cd9bc2cac54aca1ff25fd01304856adf8fc7f6cccc5b31ccb690d2862dcb5", - "9bde22bfa6cfe1f73a69cc66529038c3492a44e7842d9789e15f7d57ba016836", - "abf18c6a3b188cd42ceaf673ce9c9ffcf49e7bb6bbe89cb753cb8b84e6dfd960", - "bf8e62ed5ea0d00c61d4134af5079a9f4ade96dd0a6f86cf7eed2b98eb2de980", - "5f24b63dee68b5d0b50b011a0f9b5c2967d1a7e3c26696257e14532679479662", - "f0b8d47dbbc75f99c168fad30ebd4404e5d1b038668e921e0fce99136a8697a0", - "9ec02155dec7c2edf89bfff08bc4a2cc010d791a3422d4d2c89bae57609ff836", - "19984292bb41040e8b0c135d2605badae2281c4572dac011d255d412d4cde2d5", - "a416c6ca6c9d78bde9d9ff068339d38967eda20c201e328ae4e4f649c3a9fb09", - "823c3631c82984991d277bf12e380fcce5994058e9a009bc48e8345c8a1d83dc", - "8f8c9f6d858d109588d3e80d375a7e89caac458715b636ba22decd69726320b8", - "4c15709b69e25a1a2907430a52a1a6d026505e34bf3ad430e89dd91f04d49ae7", - "0e7d9c8c36ea868e66e2643f21aa58803efe5ba69d9e2b25769f295de29445db", - "da4341bcafceb3663526f64121b60cc567d6c6e3677e6823a554137f543d6b2a", - "23731ea71d93400a35e6096f87e6630010c9f29ccb0cc34c5031796082306e5c", - "470412c5a83dc7b9e4beea16f3dfe15365ffca2e94b05b48c2c14a390553e475", - "99d563fe829bdcda9f751d82c7d061672d591cc025b6755df8caded6c706cde8", - "d89191caf5821d98a098bbe285635a667c8701e3e8fa8b82af041e42ba40780d", - "fa8468015e9965129e99074da63201dab0c06e9f895663f6f41f6df1bc5063aa", - "9bf09659b18f9e3f2cd0033a6215f10814641e0fc2b4139d8b1143ff65b6afcb", - "b518f88402d92abf82032827992321cb199a26548f2f0ff0cea1461ee16a0936", - "c3875ee71f87761dd44f1dc298406387df0a3d82de1881dd2e7e83948455041e", - "5578c1560033dceeda9b2a9087efd7adb7046a1eee211f1ed5fe982e65ee5b7a", - "7b1f0185a7dabeb19480a5df3f1cc976e3928d6c88be4b53e1c7d8420dfb47e4", - "0d9063e195732cb6c27560812b04db43a91ba814cb49721f77d854edbe5d0015", - "bd05632bfcd571c945592c5edac0dd2827e8a29aefcd30cf6911779160f3b73b", - "688e3b8122648327a7a833c8d58372003fa815d72bea901a0e548d7763234ceb", - "64d66a1deeb8491a45ff07a8f037ae38fdb9fb280d8c50c50c867abdfadfbe77", - "77664e7c7748bded9f329d1c64c35110c02e93d6f86e57706c3df952f570bd05", - "23ab9a82a4cea1c03935d13dd7d322638f15c342f2427923ac3688cd0ee8e315", - "24739a26f7f2298919a1d5e9da57280ba7cb59e78437cb320dbcc32ca65452a2", - "919342541dbc5122b4f4c0f98c03023755dabb3ef76889a01757263acc29aae4", - "ca3dbf61b165a4110ba8275675ff74c3cbb9bca8f99e75fca67f401427d84385", - "d9e69ec5ca2a91196ec3ea5d7797a8dec62971c9a3a2d5c400b5b7a81536eec8", - "86d0830e153f57fbc039cad79f418df911655a77f6c7f2f19208df424bb95d57", - "cc3c853c04dc8959e817834e4ba34cec99d0ee74d3beaf1984bcf37fa64cd75d", - "63e70377982d7f5566dc5372c2816105538dd33f08c2a893404d1606e50c1b66", - "fb284e6b4904b49f40f1549487bc615a9f7349cdff5a08ac52b723ef78b079e6", - "e5f7b2f1d65b12db76b194fc527464a75d29399fd19fe88a49be0c928e1f0c6d", - "4277df5f114dfbcf922998d2004ec64246bb54ab2b6c99f85b214dc1d8a6fb48", - "93e31e680d155d0388ad185b4df514773b33fe6019228abfa0f9753bb20ef197", - "c10c72ff2c7a441db5910eeec56e617ddc509b42c67f813f7e9e64f6e52238f9", - "04c506059aa4da10c2809ec39532daa178cd8731430ad85ce326d4f927178191", - "ba7aebd5cd0ce6c9714387cb31580d32da97230ca4e7a5fd5d14865c760723b6", - "4f3b1da187581fbba2cbe3a967e0dea18393ec9437ec2885fad66de1f33a9c68", - "ff211aeb4628a4867180f0695d3f6696494e9af383c46d7be93286e507d5be66", - "ced4b3837a842dde82bd59b81c511b92886d4d195461af4dcb1f0a4dca6224da", - "03b4540ecf6ea056e4557e71a09b6ffe35de6c2985330a4bc4463d9fb6b49408", - "baa485ac6c200db42d47d2628c7623fd5caffdf0b7f3a07db1e67641a8fd42ef", - "49290bfec711ba3f05a57c5a479c4acbe4d90e44618e443bc12f734898894cb3", - "1b42eb5cd2b699a5aea99b9142308fc794d47f86c361955dab333fca80ebb2dc", - "4fc4e46c8d56381940e2f0178586ca44155f987eaaf88a8ad5aa5ddd5b1962b4", - "44555e5b545598e14bd66d0be0f981158a687703b4f5e881b462e954273e3aa8", - "511497ceb1dec18d5fe0b21d1f82d1f5a5cd22f3c65fb172bc9a38f868973408", - "375c1aad10b8a7bfdd66f523d490e7cce2842a9347c1d581a2028afe0ef09931", - "d529d2c38c77fda7c30f1282cd3d305fce240fa793a49dbf7bd0c521a771758f", - "439b160bf96dd0e5fbe2d70189b1ff8dcb6705a368b3fa57a670d909ed8e1b8b", - "c92e8c11d739c979343bad6a190218a6bd3303ca3c67ea454626b26978afec22", - "a60eb5f6882b0a29097a72e27c837decf5ebda76af79967d22e35a21720ef409", - "41bfc8d426ac5dbc994914a0ebdf031cd21e7dbced1f9eb006b79b996ef2b34f", - "11bb780b1a633cf4dffe684fb1d700cfdd073e3c67f4a3795658565f36156008", - "65dedc207a39f3515b1620beb1f5ca297b819e9ab8cfa19e523b507023f53984", - "6eaf69e564c29fde6292693934545aca186532ebca58a78cb304c102d468a893", - "5d39b16e2df6c8583cb88bd7de10769a6683dc9ff66fa3641e3dd833c6529b3c", - "fd258c76011bab62851e4b379cd10ea62ddb7c5b8a5c59c2463ae9e979151326", - "97fdf8dc11af3c944b454dd14246556a186dba7a2cd87de1f6e95f05ddfe2ce2", - "134946d3238b114beb0cc5b7cba710ece189553972a441b347f869b607b3d19a", - "f69586aab04f9bf6c8446ff50aa769b549d24b2cecc5cc75d99991f54896e88f", - "aa17bb4619d12e8bb8d5c251122c62b27a261390de301c6f067e0b20706916e4", - "6ace8468ca55621cd6e6dd0d5c65b5bab50021488909fd67b1dfe7c14d4035fc", - "8423e361338ff4cdaaf82f437db852813aff9457a2451bcfaad3e99ec3893c01", - "fb98a874e13d8379999c28307d402104e517ae9b0ef93bfd4ab7930eab40b811", - "35b7a93c2f213b9c55c163aee6be0d7ed88c95f251aced5d63e45924ebc4195f", - "12b45dc62702795a47350951d13a8a01b43a5aa12dd5de20212fac74ded88e28", - "fb185d7345664d3f755b210b5bce3ad7e6e453fca61b9f7b054a89c58a1b1a29", - "8a18970bc56a34c657665dc2544b275d5db4d464c928412dcd341659d0e2872b", - "b77e7d3729882bb8156551d95b75deedecd3c9e3ca5854ee02165afbe816c7eb", - "dce523005f1f56df4ad21f09b110911c8e21f8eb910371a69417baab82dd2d7c", - "ba30e3f6de209fa8c29352b405a6b733c8b28d2161aa290c92b07d6f2cc13018", - "8389845457bbd810cfd19bd412e6c73d423da28cfc81c64e09bea23bd6b2a1ed", - "a1f2c6a9f5c69a598e809d26653619bfa234835165887d7cba8effca8c7fe8b1", - "5b052785846ffccad9abced0018051a358adb90af035296239cc1c8d2ba4f403", - "394e94aeb70b671fdecaa33374da5c3e1d050ac1a0c75381a0e74490bbe43a10", - "bc63538229ae5aad231f3d67abfc044f42d720a67cf4929f165a9de5872c599d", - "af306a5b3d673ceea7e5e8780ff4f18cf41d5399913dd6c267f5ed29811cb312", - "5a888b60cef1a324453f63351bb56cd6623d7e60a134b364764c2c275877c690", - "721f3a6a146c40c205a33af0f928e479034e82d937cf6873cbb8d782a4bb8274", - "b6c17a865998a0734ad6bcf211f07010aaf43734740242f10afda64b7936b7d7", - "979dadb328767b68486cabd4d8fff4805bc319ba95f052dc97de7ab987e8667b", - "443e128aef2ce44f4bb837e1373c48a4408402662d9b64008daa52efc6dda0ab", - "5467aa56cd4c08519bef10a83226b833dc31382bd4f3e25ce4edaa74b64193e0", - "6cf2c399a77e08889903f3221ac27296d5a2c93569a76d8d72bc899952c72d0a", - "18469c83ad9b62c51fc32fca10426e23f5f55609cf96e365674c40035b954603", - "a58f54b7a97277939ff5b480cf63f4f603fcec4c319de58797aeba084ba1388b", - "8f74f91972f0a8fc149e9baf3f2110b4110d2dc59081d6711b57bacba2452bb5", - "a19460cc42a8c7371194c38ac2fb325936d1cf6e782d3855f15d6fb8d746b110", - "ca7f8701a07a124edbc03d7f3486b60c7c2c9a9f844be5179318bffd9c82576f", - "09f264b4b10d4c18d510f139c0f67df8ed25c7a629e626014eaffafd2487a32b", - "d3609dffa6d8573c343a10fbead09baa05625db1fe3bcf3067854d1f77e3577f", - "70bb3a96a3f717d411d720decb59492c86402ef990e292d27778b311f9696735", - "74221b757254ce09b7986290db38e700363a90130d1b3d0eb653a60c89d668f1", - "676d7f3d841aa13532a60b0df9dc12b8b02264a550efb4fb0967b54578c79256", - "c3cbb1edd74a3b417d76cd70661380d348d1a83080b43d1c3f27075c4eea4070", - "6def1b8c21a64191f7963b61b8190029b6243be78d2dab8943850382ce138fb0", - "6c494817f969bd1831004a25af5cc167ec7d3f6ddaf225143b975b4fb1ab4f0c", - "2898333be7c1978df864d2bdc02c536fbf7dd626c2835fb827364c994c0a1955", - "431341d67a747bdda877bfc5f546bc459d32853290330db9a8c493a88cc2898c", - "ed75350ed6f9f5cb3502730874d6f5fd867b73242baff8553a87c87a3d0e9a64", - "7e3669f1a3e9a90319ab932f968d94b30f4d3bd653a81214691a00b1061d22cf", - "71ff21bbee3a4ba944078fb54e4a6503eaca1c396ec63c43382279e7a4d05a9f", - "8436ece7cad1b08394d43e80af63b3263630182726a2eb0b172098a6a670048c", - "7bccdf895a4b1b9db16b21093f86cbc7830fbbb33bd862bba38a617a0b713666", - "31c077b4dbf535105a27281c21e032a90852da154a30a018cddd88cd5af2aab3", - "73316e0ebab74e03a768e532bc69bca9b43c5cf2d3c248f631bdccee946db4a0", - "f4adc889aa791127744915a285503eafc0e4ee9ba6a5e39181593150bf1c497c", - "96997f99c6c253c433398cf7c6cefec3937ff605c295a54bc89a8713d94f42b5", - "8ad745d37b767c69a87e44fa8126ce9f232b5f3489de625bcd5f19d0c774a59f", - "031c429e26e6bb03872529f9b72c87205f3a26e97af473c7f6a32b8718590c97", - "66062f9b097040ff7d20b2256a899b9abc2f76df3cb58b7210fe93c56cf4ce85", - "e20cb2616a25c50a85eb9307270361c783411bd0cbb8aea6382fae339e5109ac", - "33c2ba0a2aae7d8eb7f6c89748fd1926af6fc95285ab217bb41e8d37d7158a00", - "24fdfb1e60d0c1876f8bd96384316d2e31763a6b69d99c1ced5106102f22a188", - "6962411cdebfa2b24a07c2394d29d152900d5a9417ab03034960460a20845867", - "2907f4534cdc01591e0a31351c5e3ec32d884bd32847b06253330f401b26e8d1", - "579015a360fe84e723728db4ffc30a19e863eb8483b9ee99f2d169aa23d201d8", - "e79c25ab9416fcf96e31a3e3d2ba0e1f0b9888e6fa2ff407042034a0f1b3c50e", - "8377968fd07600c74f27432e4fb66b5fd9965d2d06faa93e14346eb891e10d5f", - "d3194c03d12c5d35bc3d6b101a37db9de92ff2b16fba60b0c70d4090d64ff378", - "b2ad0d4aafc3ac3484105801c17accc3eca0b58c255bc166ce39eb2978164e60", - "d650749fc692ba2f3833779fd0601d1bde0d590a27dddff2181bcf1cf219ed8f", - "46924110fa0ee974430bd7eaa557e2a5dc38c55f710ff66b5f4711465a0569e1", - "578599e7ea89580176faec74eecb3badcc224fba30554604fb632ac6880846f7", - "c5904d27789eee84dad606839ca459942dce4bc2a7ec62c8d685ba13f522974d", - "138e15021b7a630b37395a2ee0106726929feffc016b4667a6956b1d7be95a75", - "415412240a1b22026cfe5b5ad9e3438d5f2c3e82f21e372477f3eeb22952ab2d", - "d1cab98ff17290560afefac11b038ed497c805974e90991c95fefe2ffb94c6d4", - "f08fdb1b1923080e7efca647a2e087065c4b32743940f561a2f16040a86310eb", - "b082f20496162b210c99f3aea17056d68aa616aebedaa779ee64e238f4e3da17", - "7003c32c6a8db5c080a2ac74085f51d16fca33d31b7fad094021f859b324e679", - "fad8b7d63d93e15ada34a9332a49b442dc47e5ad34b89baadab29817d9264631", - "a1d116aea6c4c31de53c135dd7ca7b3ebcdcdc788c19780c4a82bbca61c3377a", - "70785b079242a9c2afd229798698de7f56c09c770280805ac246e2ae5ae62e83", - "8773a13a29a75b1c0639cd5767e63838e7d1be68aca3466b79cc06ae1212a054", - "e399ea35643c4a3c7a8ffd93fdc1f8ad7625f079b2e0168041627833bdfa85fe", - "f8538368082ee8ae53fa0517169d19533ad4a24a21e857c4af17a8e2b3738caa", - "d308f3a2c2a864ec09477a79cce2316ef1285604e467f7953727ecd71de66c3c", - "c7b82d3b392ad07be286d8eb9a8fcf351127c9963e27bbe055936dd8d42b2ba2", - "3df96eec862eed8914303fe0403a0336d6a096e51f598c024f81a2be2668bd84", - "e4b9eaefb00b543322386ad68f0eeaefe65d1bc227eefe66041fdfedbd16e018", - "9ac40e0361b8d085c9302a164226b62d654595bf5b9db396ce0e5dc80730d293", - "d933a320b557271273843ff0046c9dce1bb1c6e759aa8c2f5019a22dbb6b7a26", - "cb5552988199f95b9eb5eea0ab37303bcbb9f9c67ff961d23e7b109dfd192ad5", - "703faf7499946fa6f0e3b8c811cfed502db4d03e99b4eaf587b81f657a3e10f7", - "433df0d9bdc9dc1cbbeb5689cb4940148ad207631e2782d078f3c5e0824dd1f1", - "3f39b96fa3ace2591992f953cb789c7d00a7f84b69134995458e9d1184ea8678", - "7dea313e7591c897d38509b0ebd31dc6f397290be38abf6c390cdba9dd4afdda", - "c74ed9b3e9a057bf3db7325d77bbad8dcd20b920f3bf4eb3197a3fadc1d8cb72", - "1851707433c301f7afb8deb55d0a2552d087b8dd23ace96fa1dc2d7456e4ea26", - "adbda2a75bfc26a3247b257db77f42e823960f38e1452c7e5eca4312d64ae1e1", - "984d7f6786f6c66c029f539119e75db50cecde4ad19532a0638a7db60f5612df", - "d11d340a3e9dd65a9695cdfa801629b608034e672c01f62a4ef5288b4d37e263", - "56c0fb30c4e7f3dac254b328ade7aac2375f1a227df79a3508156b9d2df80c3f", - "ceff7b3419bf2f1d196835de541c2bac1614989a9c0044d9b1e79d12f1927967", - "e0522df3d2f76fd81b75b75983accb49db0d3a5803eaa804df5e6c884cb00c56", - "c39b5c0a007eb4b324798ffb9ca12b559769df6d3b4cde4a9fcd8809ec60eede", - "ad481f9ee598304906395360e9b69c9a846aaea8750139756bcbbe35419be5d7", - "9328bfa9ae10eb4bd809243deb030e951fdf6d9da29139cf02cd767fa8c37394", - "9e7c5e0f8c033b7ee9ea0a51defaff4316fc71422739eda62d28381fe3af7e3b", - "93cbfbb45ca923d1fa5e87f574eed2c287c4b0a757e5e53b112bd9314a86a6a0", - "1b77bbf24717706a6a58e26eee6bb7397a92441b0acc6bba136dc660c9b87aab", - "b479eac91e4668d204d7da5be5a56b0d697c7c79be82da970e73478d41d077bc", - "2c5b9389aa4d62dee461c81fcfec5947375053e40de854f9dd3871e97e8a6d86", - "6ce6e117d31076f032e5bd22c2d562d0d5614689d873a2da65febdd2ea8d068d", - "8148f03efc01eb790f111cbe7cdedb18608db50f38287ab434577ec9c5f4a025", - "c7bf6ea840d3092f3c24cae90667133a32196962378ec58613b71efbbd9318e9", - "5a4ac73660c0684e492683562fd810bcd5c88da33277735f62f3e19bdff10869", - "14f28e5e11f0ec7bcc51b41f53826187f20ed0a53ec0154d0ff7481394a11ae3", - "38e22c89ecf7cc24263685694f53feb1386e85731058a0778c7ca3a0c3ca1025", - "d587499fa83e76f55bf6e072a5108fa714fc0f6ff05e4c895fd6f10c9436ea1c", - "bf676a58fd7496f1cdf1b247c6b64b638ece1399177fe0330efd7a94aa9019c3", - "ec06450ffb7c24fad299d3a5b53345b0eb2861061899227d1a26bbe96f8c7fce", - "d6773d6d6fafd2153e1d142811ac7575c7666b45d68323a597b728ea5abb8365", - "237715178dc38d95ae16986ba98d75903c968e359d8d4a135c583ead6c07e86f", - "561316a22e1d53978a66739910ad19f815ab292c188603619b19ddff2e8c6e4b", - "ed90071f2d6c4f7d7e3fe598e26ef0d774c139e7ff01ad6308ca6f52c68908e2", - "53ae45f6422376a91c86f8bd8aa4f641bfb8cf00be9966fbea92b18c1d1bec3e", - "ddf1de1fd6661d37094d674ed87e626f55c02663a990033271a9ca4d89b84517", - "187d4cd7523821799e3ae709293ba863974c05cdb1f62836941e0c8dc2835764", - "567df73015a704ece77369f0c8e77e255a1420e42a3a932eae0f0df4ee1fc6e7", - "0e06e0853af142dbbf72ae9a4595fd16088ca3044cefb76be45495afbf124a35", - "0dd5249af0df4e41322f7dcc889e0ed9309df5e50d36210a95e53214b8f9f624", - "9f5e5008ed8b665baceaac66891241ae3db86d869c68eaea2be660a065d2bcbf", - "c19d64d440f410204208427eda6c3fbe11f9445d179b04cfb0e3a11001460755", - "738c9bdcdbc3f6a03cc14eaff77e969ef3dcac7421a93d9a454ac45f188ad7a2", - "c9e3bfa3d2e12b6ae144b1b006c95d7e48112c2068c40dd1fba34603047d3e8f", - "3c47fd4f1e2be178c68e234e0899e74c825d693288afc9dc17e8acb399f06aaa", - "e3037870b644588853920721306a511b54bcf3ff27cde1c6a1700d907a6224d9", - "387c4db4cd0813714f3f6bc1ca69753ad549ebb3ae709fe105a1d59ccc367819", - "a2a6f90bd64eb4a588b9e6bb7a68c6c35edc99f8451fd3362a4c654ea628af26", - "d40bf33c4bd06b1922cb8a9a040027b596516b2dd3b0629b44326d5505fb52bf", - "fd2550ba7a3971c8ad942eb08196ef1d72e540b7df5615aa71f3cc2aa3c9c17f", - "5d9167eefd96a6c5b3146351b24d5b52f8e18a4ea48c80cbe9392f9ef9721b5e", - "9b5d77dbc8fddbdacd55503e60c39b7a13d63c2c1307e5b2aadc313fcb1026bc", - "65cf38fa70141c97fc96b2eb39bbc51befd707c0182cf5f3547672290850601d", - "267ff3e6ef4a50652f8eaab5269a80e94f7c1f45ef10e7bad73042b11a0bd36b", - "fa0b18ec5d99900941a3c9273f7c31b6f8c2772a308d7d2364a0da1e8cc04ca4", - "5fbd999e79ca2d107b4e38b6618a287f2b22c5ba847f3e35875a61b836a96e68", - "92d87e505c1b883a5a4595239cd9fe204668f9030dd4309fb8fae64bbd023b50", - "bc7f420e7869bf26972dc62782a74f3ad91a0f294a5dbf037e47ea7e418003c3", - "311032d53e694a7764c2189c4898e4b09059ea8a71e31e00b4cb9e4590aef4fe", - "b7cc8f85a2e075a88597194c0325967ea8f8a9928850c7122e17796626a86ab1", - "f220de50ad56c837de68c3fe8c92205d7907bfd373c66daa5e7511184c64ce36", - "c2815c03c989a41f91b4868ab76162d0c1dc9900392042af4daa520c434e3457", - "cf02255dd7680098451077af6787549e1167e1927bdaa66c713ff3121c3477ed", - "8fe644728b5ecff925ee636210db1da76182b3a0534139459bb399f0a201a9db", - "25847b105362b6d4ab2c15daf7e2583071e6feb8b17db16bf564a97a16783620", - "d8cff3047b60de6269a5ce3d4ad00b1f0633948537f46d6ce4c3b6909bd4d7e8", - "77f9ccf8ead4cb6647f262fe53e9bb904da200b27b16d2ce9d1e519accb0d2b5", - "3c4b0e2bc1f50e77ff84618f789c7e5640b7b4ec69f92f0a25230fff8604ac5e", - "187e178667d535039b256f5191c247dbbcb2ae71d8b0cd3e78a2faf26f77e49c", - "d41facc88e7910a2b15cc818a0d6f8cb74aef7c1a2c0a6f25764808efe2fe9c6", - "37f6b9f31fe43528f1778702e6daeaaf31bb5914b760d9682f1cbc529402af85", - "7b02fbfff610815d8c8cbc7e503d6e7c3c36324c30c1181a996454537a67cf89", - "1e3b1714769ff7590da51b287dce5aa4ebc7d37c686f60d18fe298536d972379", - "0acb91fb16375d6dd730a4c3f5a9d57896ba534b308f70e5b66e157550d2a3a5", - "8c81bc9776f46a2935fbfd693efbb7172a501308f89ccb0061afd1e6517b021b", - "61b426352bdb310390c61af55900b75208a061c55527fdde3c6076b5d8279d5e", - "02e52b6e2ecf330036447640e34c2bc702def634c302645c8ecaf1f647acfa26", - "1c1df6edda0f3672ffb74c94483f585e91eea890ca9c205d79e1e9654def6699", - "cef24641d73ee2c5c2a79d2e6aedfeb1346e2c580b0cfcdc8f9c766adc2c1021", - "6b0a5e1d9cf301c79e0af0db4859fe24058b0a1acabac45762a87f6375a75706", - "38048e2e648194669a3ef4696d206dd1ca96e945f0b8da47c0c076d7aba6475f", - "5fce80af9b83ef0e91a5e4bf2942ae482a97bfe27d2c7d5320f59afad725430e", - "e40277abe0db2be4aee4d89ddf5a4cf6a903c2606eb0d5be727531ee1417d39e", - "9da7c0b3038babd5b3097263c1a80754a7b47bb8af697c948db9d935d34f75a0", - "d36181e1a7556478f62f696924d2a18fa8b00230e473b8bfd3fa49a39daf6583", - "b41ed12e5f3e17824c1d6a2caabf48c7fd98c61858f5656c7ed980adc014573d", - "4d771c0d51403c13e2fe0bdebc894323a8d57b5a95b3f92a62868393f1ee9da3", - "c3bda82efb2f69e63c00ba7a0702f99568b29f726b64aaa7a22786a013437925", - "cd84373543a88413bfe720d4c15bf41f427c71fb942a47e6ee92dda1619de9a9", - "cfa8c1d0dd71e7a1bbc4588e2382a3ab93d5f3eabeb4e141c2a3ef63b2325470", - "9f751e542e0725516f663f262d91e08515aef8a11b95a300ece2aadfd97898be", - "f181798aef83ab6079dcb53a07407716e48fcce3e39e56fcd91d83c3cdbb6df3", - "e5bd3fe15012394dc796eabab957ce69966fc95e36a17024af414b33437920f6", - "4aad15a323e7b281ba316e10faa8b4f2321c7d880e70e4fe00415d0c2683c195", - "c35b6708b79e0c984bff13c6a625bdf522a67386e711af035c41700746212bf3", - "ee9293e149c1a461e79958bcc31053c8f557873740349b05e5f3f0791f17b50e", - "989964a04b78fb9ebe6373942882a9d1422fe7b1431cdf9638def4c2e91252ac", - "8bf7d24e40d93199adb846ea2690bc3d454bf160275803f02e9bf396f6013085", - "9f7e8dad0edc9c133da5002a27476ced9124215ba9c848531e3e0465b0174070", - "ea060365d5ce8e70e9606e21fe3bc42ebc54c45ade72aa08847dbc050064c057", - "53a7b872fb5a6a78dde2f99c369cc413ce7ec27e1baeae19d2d2961c4c61701f", - "a66b3c748a200e1427a28571875fe052da10709dfc869e993e73e31cba61b37b", - "9af53981d7ef0211dcc3dbcf4609524349152c4e2d9d77446900402091d2bf83", - "39b5b08929c960494939e314843732a2f326984304528b78e9f01e1f11a838f4", - "21e3286560f10ce2ce98212964babeab27a31e868a8e73fe536eddccd404f3ae", - "a77b82ccecc175078fa25a34f164e08bd4a28a181854988d6f212931b318f007", - "23794b4ef41dece973256eada316c19bc0463a75e5de86db012ca89b13ebb183", - "db71f97d5a7e55ade2ee7ce180676063b3979effa1b8ddecf12e6f166c45b13f", - "3c1ad615b081545ff44f6be4b434f4665dc691a9ac3fe3de059f4d6700e8601c", - "c1bc6793b37a301c59be66049854f38f4f0432c36eb4be64b3f5af86407958e4", - "2bd2526b633b35d050b2c879318ed8023ab1289357498023384b4e90855c3c12", - "761eba52a30a31a307296e2551f63ee06bd11e244f9868429fab9f44a3d898d2", - "3488355db0589d1c7bf9da4032f4c75e299f954dd72a0600588be4a92f971cd8", - "881257e447ba9194fe66e982568fe93bff2515d8a44f4a0b452c6323550801a8", - "7a798b0709c52babeb929594202d39249678aeb3bd76b6d3cb46975e1ab9991e", - "bc5fdcff8a6e96332a01e08265c514290a711ecb4d752766aafa01bc42f81536", - "bd5ebeeb7d63056d3f4142efd15b2617b004bf84ae129edf233d4383caf2a4ce", - "79cee0cbb45cbdad268be7eef83fa607a39dc6e95c84653ed2a579e1f0774eb9", - "42ffcc721757b9790ef39d4a040c10b7aeefde12be77de824c4209a8178146e2", - "779f63bb886a79385fb6c6cbadac08210673ee4819417fd4ce74e5ea5fe7be0d", - "3e59820c14326506bd5d9812741c65775fbb79631ae241287ade0561819008a0", - "dce438337bc5c923c7983ff17011ce21eabb1e0507ea8bebc840b08737896624", - "f51351e0445d4e36b738a0fdc400c46eee789ba6baeb3ada0b985c827b5eb185", - "2229b62c695ce8190e92580408882e174b9ef0118c78893f1dcb58c98b8a8419", - "87c231ee124da1479c222865c40d771846eef01e2d749dd39684c87e7bbbc2d5", - "5f7890d63d00cb1da0effda455a72d4e0312b72f26ea820e435958b0c6146efc", - "951b616b2081bf4967af0dbd06202a111b223733aa8988c78427a0f6b242007c", - "eec38c1c093028b1b732b0b12b4b224c0d1f72cd78a414cc10fe4d769456abe9", - "a6b02d2660e2154f62102e8fb792cecef6b1fed685e2382afaac19602da3d9e5", - "bb29f46efa8b3edf561efb8a3c3cb3a309fac359ed8c76527d74f3defb263e9e", - "2756d03cbe8b7f37a30248df55aa52fe041809050622c9640c218af7cd4ca307", - "a4adb0c175b58b9eb47706d9829181da75138029473bf101c052451ffa85223f", - "785424f0393b834961a15b19194822f7577a09aded6197705355cb020b786f17", - "e3fdbc87e064610a6b77b1759e9cda96baf5953651bc5649d824678c6ec20ad5", - "e4adc550411a950dc1a4c1e6ec55a18a8dfb93aab54effc6fbd8133a264d7240", - "5b777f5394d935a47398fff519e0f973458f3a91564d295e271d12bb51f40a9b", - "a2c8faab442ccf6c2588d4950eeff3827659837b73a09a669b64722bfe4b28e7", - "98b97689f68876c8d515719db54c04af0d4742d8fb17cbfb3603bf8998b73c7b", - "c00538f677bbd8658894bdac2bf3cd1ec0db871475d20d36d8b2d92b690ef285", - "a5f71378eea6a90a83d374acfdc556863e475ec659f7ca84061858cee4019318", - "9c78ed209fa2278759c8b5b095e25c1009cb5c5956697e5fba70cee7fe3dcc09", - "d89474a8e154e391afb3e10f3d26e1ba0e1d746421d00436043fa29492bbeae6", - "55500eceb5d82d0c41deff593d8a88bdbbb10b95874b9d7a30ba338d357b1c41", - "e7394f9e14b754b09a61822c83967b0d05bbd17b49c4edb3d03383a7c021f44b", - "0fea6d8ef2a8e979dedfa92a22e00c1d4135410064a274bcb2c3e3a76985f710", - "347932295198a72660efb871dd08d09f7ffc2b0628f4ca4a3fde0e632e6bb687", - "9bda72db199249954e466c96c4743ba84864d8a2eb7f6e9a2b20237aa737ce5f", - "65e3131a0abbdef2a701f73bbd6c9980c3a38ab40548a6772bd3ec15ac6742aa", - "56983d510be04a3694a2a3ccbf43e8a0caaf7f541ccb34074c33c02f061054ac", - "fec2ef303b6f8b65e1b1f71af043760b233c04cf3f610b0aeb79c94dee923a52", - "719c63b16b10d541e7a2e88ad058dd7bc70090330ac1628b791f3c77203001bb", - "e5d460d7a1cc11023000eaa188b5e2cb260f9f67a04e788844771c1574e0196a", - "daf70df4b2c0d84a11a1827f60f5585b1a03389b4fcb597804fb4b5761722d61", - "4e2cd5f8039bf9faeaff506673bd243805e559069be46e1a749e23554738acdf", - "4bc41e961b5e6b942757de68b0fec1d02c556c6014047ebbbb8886dabb07164a", - "a558dc3110dc9aa5bce03568e9b8e6c4c7a1b67568433c7a3e58e631f10123ee", - "0b97bfc59b77b47ba53770d4fe578982e37297a6553b00c609f3799db88b5a4b", - "fed65b8f37a8b2216ad814d809130c867ae9721bf30882ed20f7f1204151fe91", - "7ef66f5bf93e613f11353c44a38fe68b4c71f8afa035cac5cdb50d54addc471a", - "7454cdfff5cbc8a9a810e304cf898a3e66593dab580b3d2146d3e845dd5a6f4d", - "4dec8eff649debaf8a94494abd82bc09f7a2e00cf467e339a7eb241e7750e2aa", - "09f9f9631b3e6021d10836a1bcbef11ef020256cc3fd875cd34cb34b5e947efc", - "57e02df511ec356e6e0397e4b5b4538f9f14ff0bbad4b67c1b7d6f6e00a9fe6e", - "a73b561990f039fa5b73711eda9ef6e68fb643702cbf05cdb78de98e104efd2f", - "c7eab52c6c15c10f9a4bd8b7ecdf3a1aa6786e606a98af36be7bf4811c836791", - "c1036eabdbfd58bb0d128df18ef46e9aedb2c15bf2f2a0d2aa9594816b534d70", - "d5b8da5b92a7ef98441e843ebffb09c7a1b7e864ddf99ea46ed97ac824ac1a69", - "5faf31765e665c16f71ca75fcd0c9d3056e89dd98facbe85cee4acfbf8d19252", - "ce616b68cfc98f9f71db956f7f286d5756f6cc200b4fea1665629bf9e9eee4f7", - "acdd3dbd954d678cd7f960c3419d4396e08ec6dbe15edf96c1cf897a34cad2f5", - "c896b6f03913b6d880ea1c70d7c867274a7a8267f43fd3baace3be6432f3a7bb", - "c8f59c1a0a41e5a52ea0a785788d0aab980b4b210c6c675d009bd4b33fc4d024", - "6d4622b408c9e50f78dc4df7c3e44d1ea28a35eda82f7b715524dd88314fde97", - "352b8d1e4933847ab49a9faa53a500e563ab523a445e1162d42e62f7416a9fb5", - "fd02c134e2bcca4a549f30528b8e6c05d8ca98964b51dc19d5ce3d44f12790d6", - "a21befa0c7488ac1a9b0b88b08977ebd3684b9fbd209c330382cf201c3ebe6b7", - "c97bc3a932943113360c7af7bc12d4375cfc7f669fd97efcfd017e57fd4bdd9c", - "818874a264b29c3ae153b95a819aecba73135f175ce2c2f47940ea517fe3119e", - "b6c263a61a1a3e4daf44528cd3c238600ca72a3fea211363bb122c80507219a3", - "40d6d040cfb938d9324fe01dcc37f9f24d92178e18136b94724eff2aa3762cbb", - "7da08b27db3d912e8470838018e12bda67838a81971b06e5542e3614da4d555a", - "80b4d69cb346757753f7cec798e09280f84bacb152511868d82e220a9d5067de", - "514f76e19101fd8e70eae5d7f0a75b3f6fdd2152bf5b64f1376cb1405cf9eadb", - "96aa28061b26731cd734e66f80c2125d3e90c964ec79debe62bd8c3a9dd84327", - "4e532b4c6d3b1bed19d9c1ae100a67046cd6e6bbfe7def36c1c81397d0fd6409", - "a0f8cb723559d00aea81b05d31c53bf71f721087f1dd029ed4fa3cb5ada23b0f", - "c5daae1665a26b41c069f717a3a3361158bb61f417e8cde4a6249c1bde3cba03", - "7ecc30f89f86a49aa5a37af875cf3c0aff05a904b9ade36a65e79f5c8a2f8006", - "4484351fb0bf41db3e656d1a711c8838ea762af0b55de269853007003a393636", - "636a05a4276182225285daeed112baff3fd1a24bfea527cc3fbbe23067cc0cb8", - "30395bb4bd4643a41bef334a00e480aca874e4b968535e6bdd72763816e5ffdb", - "c20112d2aa231f1540e2c02e1dd1a58603806ff1b9bae64fc29c7cf5b48d8788", - "17b6daf48110d61ff3cefb0d8b66551ca12aa51740c996952177fad34415be5e", - "02ddbf59e32c4593c1c39618c71f44ffb648495cda0c8e504ba36064189a0d0c", - "2ba097a9a20d24d9a0cd23cfe767ad0370d4d2d59de28da8f92f18f74bf88494", - "87e02ccf81189043b7ffa25d1ad69d8e9594ef91fd55ab041a8f50106bb6d3a1", - "79b31965985a9012b836e4f14b740180783627aff3a378ba0b0d7a7c5b44597e", - "a3ccecc4beaea14ea62d416cf9bbd05a9c8dd72d5b09a2ae6b184f1b56749842", - "ed5d6f594eb293aae359b0935fdf2a72ab28941363564afe1be5201c277a960f", - "bb54a9086709b1fdd13265d156831aef99b644cf4b66d25ea26ac04adbcdcb07", - "c16ebd8e3e6ef29f316e0c9f4efc7972db137bfa293cffc6dc8a2df89ef15ac1", - "ccca4e4273ad181ab52a00ce8f7ef159cf0562f2d44a723c0e7803b51944ec84", - "ef30d3f3cf20fa889d93bb270a48f3057eb265d24de4abaec8a5bc3e0430174b", - "e31e56e3a36f55c73ebeacdd1d66884822e39131f5d8d5b4192572092e3b31e7", - "24781e46d5f5d1eeb4315648b2fa605fc5234e392c2d3055e760ee7d7e1280d8", - "02ca0435c7e66cbac58cb694b4f69595646803f3e2f5134e6b084264bf676dda", - "0d4c1c3a5a167c0e123ab5f1527ff1a04b876e90d1e27f40cdc8815b321b7b2a", - "08fbf0b6a512f41861f1d014f37b43c0ce3a6b6623393856491ee4e6567fbf5b", - "4342930518aa1591b42a74e9a140b6ee08d89ac421e45c59fb8c65a53c06a9fd", - "e810de87ab830f1678e80939526de691b8d17c44bab978843615edc7b887cd8b", - "7aeded90db48f265a0b747b3873cab7ac5ae17361435d273a485f7640e308369", - "557ce8cd16e1bb1c1be3344aa737b47c37ba8d489e2f96879a87b643ed97873b", - "68f5fac5a794b29b181d63a3b933106d5bf0d6302bf3248acd9bc7c06f688585", - "208d2fb27e657cb6bea6010f591ce2a3c693f6a05a1f9223e5d75e19ef159c5d", - "fa8a6135c17dd04f37104734a0a2f7612b1bc3edd1e214e6cfdd960349c921af", - "28aaf692afedfe0787bb83ef398652e9de38a1ec89db4205f1a5feae26a064d6", - "858ca31d0e1b2cb78e079660e103721dbb12743ef15ea4b1229632a053d46942", - "37dc5c6eb44bf91d2ab979d1852ae95c8281f31fa59777e0d37a6b8744be336e", - "f3c671b7c0d55493b0dc6ae1362a8e1b16bc7eef3bd1d37c55221356bd459601", - "be08241b2a720a7d0e0f7731da8f3fb4d2e045414e05aa2bad70b5f386b41459", - "47927bc413c7e9239455db628f382a5535f9503287f1047dc3258812bdc99cc7", - "1eb2bef6124f16ac6dd85b4586dce24bca7e7d45610770699a37af6f53aae3a2", - "86f0a5f5d58ed8a819b06a3e82fd8e2b99d7d948a293ac5398a61172ffe882a3", - "613b100da72a467d542aa1a849f618d922adce5978f3d4f9715a0c4a869edf55", - "71e66c8b6120c98901a41b0de56e2884e93815f6aa087f3c5585d5b711ceae0a", - "60d837d2970c2a88774c6b1cdc8ec5a4ccd44a1ffd4ea58a222a3ed3303991f9", - "551279a5a0a5dcb194c9d2c02ec81b89009655e43953b9ee0440caa895fd4360", - "af4b36aac620c83f7be23ce3c840bdc592d9107558ec4fdfaf36c1ce7428d9ac", - "51c6aa8918aae5408d26a5d529ab5ed34d41f5ad8570510b42bfba43edb64e46", - "a6c55ac62503c73c0874a82cc00332a42099473fafa84d5eaaa153fb6409365f", - "b679d4dd2ee14fbd7a6c42e7a7c0836062b68dfd5254cb9a97647bf30f55ae43", - "2b495ebb48dad7de69f83d7bba3bc92eba2626e4a69d2936c694df616023001c", - "d3ba5de9be7c493997849eb34687aa8b971be3992c6d3dd578b54a341b3fc517", - "5d6db696b2ee699d78085905c4c585ea9e6d9e38dd6dbe20c352c97af87028cd", - "0baacc439ca1288bde92e8a3b6f4f6e590b62e6bbc5bca3ec39701921e0e6508", - "12d051b3f5128d684e4005ddfafce9ff7d9ebade4756a20ed27171f42ef85bb2", - "540e7ff3da727ea4b3eb7b504c73be2dbb2f62d88b990fef6c83c61cef499daf", - "9ddae0c2714262bff2645e473af6e6187a5d5bf6fc9dd249348bc2cd518c8297", - "46a61f4d4c6de0bed4d5f2d9e15d82055af77d0311cd306b0f1a3c9b259414fa", - "a09bde3cd4f56eb678cdc0feb8b029f126d78d382cae4d2dd432acafc1a2c58b", - "b9515573df755017f9668042f73ec5f1800a484175315d81dceaf7ec14c477ea", - "d3edbb4dae91a8b4bc9781812403d3406b500aa8fac697fd28e7093a30928c83", - "3bc942a0b3aa30024c19d989d677e0b53cc3e2998f6178c1d47e5c041844f4b3", - "959fcef05744f9ed2dd31f1efdaf56ca35dded34b6474ff1a76bab67cee2fb8e", - "1d4b79413b0f3ac0db10fe4d0483ea5c949e0ecf15ca130293a10ab55f2851de", - "5ff39ecac63a3a13c50a8dae667b794057c03a02ee510b6f79de8014812aafc7", - "e31f479d694afb15ed8a95dd7e476684ddcd3f0cacf893968044c66e4aaa7ff2", - "ada51d28cdc9d2e2994f4148fb75b38cc2fdae9149821229c6c1e4f6b7eab6bd", - "bb498af9aacb0803ae957c9151bdf04e7eb35e11d088c494f409334deab11518", - "8ef9514c942d913c7bb325fa45235f8f66c22239669d318d8a4e9d910bffea8e", - "9d4cc96fc0ca4f86e425ecc1b7f3fb499ae3ff7dc06b37b537d0e5c7f04bd774", - "2b7cdf664d59b6704ede872eca8e52239c3405e5c694f18fb60ddc5336ba9fa2", - "5f187474899be3212090f3f1871d43a4d8ea329aa006d9f6b434ec8f3d3dee7f", - "3c84856ccf02b61d54800fa056dc73230e3813037cc640b0246c60e275997e9d", - "e3560800253ed08637cfdc666de3287e0999f6c8e227649de098942eb8699aef", - "81970d250328d8d2c6b444908e41d9fec18c3a781d0bc599386b06449c268c23", - "d25bbff83ab918c4547d7075669e37b14a007d6339a6f73f7a772d86b47a0047", - "4fdf9ad928cdee7b58fc5848327b3fe746b2e7a8d845285b8a1b0cd29df35905", - "b09714b5b596dd1209226689d756c8b1e7d9b49079a609ec7728a2c35751ee6d", - "63a2d69b68c5ab26abce33c00d0d5ecdc6be86c4e68df47eacd46ef70ccc3c10", - "14b1fcc40dddc2317a51d47ac800aa6151d76ca8deb1c7a36d6872d2f7355a3b", - "01ec1712f2e2974610242a4f8842fc85cfcededeb7b044f54c15e3ba15d4faeb", - "a6ba4f35d3caf3da734ab6d148dba8a848a46999911a6d1382d69d892b90cd97", - "22e359501b7c1c1cbc9b1b4c394bda9146853421fe178b797cf86843f6a91db8", - "d13ef358b63cbca3b51ec68d4b249c5aece8290921756f1438260111208b6a96", - "e9d6f2790fe22fb2c60d840c4763c9d581bde6c2d514b4633dfb9f8c0230756d", - "89cdd4c27f6b7e35ac72ac84ce2718c798dd7b0fc91e7f92b5796983afb8fbb7", - "8d865f820f70f6013038d9033ccea7d34a82ea2148db52d6151dfd829205fa98", - "94fb865758800c4ef1f1cd1899428f68944e7653f739b7e28fd03370cce5dc13", - "1199fb7fb924fc3fbaf4211051a1428b85f61b319ceb44df61a1b4b3d887b7ae", - "3ed4c7edcf885f547793ab92cd78994e496af2f7f31364773ad332f6619b20ad", - "7a786c12e79cfaf9a9d94e8a2238b6557207a9a503d8f6f12d83989a33d8c1e6", - "44e1b064ef7039941195adb283ffa772ea59f126f9a9802414c305003682187d", - "8fc88f853f2318e17ee1c5ef0e12ee6b33f6a0564bbed93445db7a6cc47910d4", - "5f668c3d1aef425ad319d9d5e835bc742b3de062176a1b00ac8ab3a16d2b083e", - "3e26fc2246a886c685ac3565cd6fa5503af64099326b32f1a58dad7943cefd0c", - "c866ad5d284199f83c2ff4312d65aa71d6b1ae68bb15dc0aefff11ca9ce02d36", - "0a0b57f09143887380f42db655d18db5876d3ca891fabdbf3521d61e9b8bd46e", - "f8d169d81e1f5f0cda6798dd25a457e30519ff4022d1d530b9b155f0ce249f94", - "3ab946ec450782b675d23556812d4c286d1fa7082f539fa5b7091244cd6608e9", - "9f9add6344a372538831db4975bfbddb292bc58cdd1ac6e2d47cefe898a85328", - "02688804ac59f4f9a6bea0451bd5d8ebf21599f22589d952d06b51d01069d21e", - "8d6aba795ae23cfc6c2274fdc5bcf13a70c53f616bb5b42a1ebc3c99e3aefb80", - "91387709f782c7454c54c6a9e2213227cdb93cafd8515331561da4043c9130cc", - "dabaf063294de5811dfc2c7b23fd0c611aeb0730874ad6d1db09ce863cfbe21d", - "92afc10f32244d052d6406531336458fbdd5c77b8a14cd0748dab883a4ebe254", - "29c16441b7baeb3bedf75d74afd44b05578f0ee9cbe60afd90f373982ba5f640", - "fb813ef670e178d43b11710dc9c0a362fb7fb8670a11d7e8def83f9be34cdb06", - "4de7413dcdaec9d24cf7eca650be9b2e54cdcb764d441a0b0d63ed41b541e72d", - "ffd02b62551a55cecfabe5767b76651d704c8d974c6f813b45f5a5860ebc5c0e", - "5cfaa46ada98d9645d0340b24eaf46a2090a72aef232caa9436313362b59a11f", - "ac596f81591e6275288dd5c71e0b3702b796a1a5e47e12faa99b5524b520e4ee", - "3a37a589b82129707cdbc3409627b0c82ee5b6de3dade2d8aefc1d3e5ef82564", - "3e497032be58f3e86749a3cc98bf3a6fb215c6556ea6d6c4a0eb2449f991dbcc", - "cdd7d4e759f8e57a96fe539adeb84638f5fe081a665d27b7c0be3fdbaa393cd7", - "4f6c89c2c0c3aedf67d3315d4eeed6dcd637679c76771077d740e86634587f2d", - "807b759e5c19c6d2b865a1e0fa5aca662140552dd71dc68dd5ab97688132d0fa", - "61c2878f9304ee9d5ce734a745ba3aefd9c77d89817066bd24c82276d04b849f", - "0346d56bbc60024c16749a7d7388601c61ee5195c76dba55d40e462d19e1c07c", - "0bb07d825991c8d9d3ab123e22e66168224c5f980c27d7091d5c0a95d3d418a0", - "5e2665d61170ce026a50d3e8ab540bc4a7c5e309ec31743192c6275c3979bdff", - "832008870baa69757de2d2a313b2a6406d6d5c33b4af1c07362c620f1e789553", - "dd1232cd9d7d8d4365bdd291cb7be7a9747d290111a54466b018693a41166438", - "59a598a2ddedeb81571fcf98cb23f1c5eb72407f523f647df181cb1e40488992", - "b4946c290d561d201fe0974783c19989a01f104f7369d79a9171c2bed8adb28a", - "fa5a9aee6db3053aee2644ea7cff8397eb380ae4d1a0bc4a4e79c26dc31dc36e", - "71ad5ea920ed6af8eafca5ecbec9180681c3118bfbdd371f770be4e09aa1bb5c", - "5e49e55b055523bf2b90f290cd3e6927178db1f5a2f92f12ecbb092f6586dfef", - "2024bef35bc88f010e21e5b10db560c74ac474d007ab0fd546e220a3e5f3d54d", - "da08b9b717d3907d90a64d113c15e832101c8feacac57873576b41bd1d3de8b7", - "cc4deeaab619896a6ff814dc3574670bd900e289bc1871727708ad579f90e337", - "baf9206cccddc4def325dd4ecdb2ef49eab1f8ac4f02c436bcf7dc5670b828df", - "8c050fb42ed421d14e20b7ef8291267917db657ca7f93d85125d32033983d84b", - "375eecc077fbef3168d54813094fb659ce6f6a80a9741fc0978a5f429fe4f87b", - "2a5c4790db9edb532749f3629f701e2b5150a6b3d5440391cac090db353a8fb0", - "73a4d727f516928243763f27870450766a29b2bb011ad97b01eeeba0965f8985", - "d1e05a31d8a0ab19edea2fc89fc1ae8a32cfc6751eae34557152d5a075fd19d4", - "26cf480605251c0f3f27409c0bdcc86d86933e28c22915169a345bee1c14f378", - "d5258c2880cdef4485b55f565bd50831a6308dac32d0ca98277fb274637789ba", - "07a3ad4d1d8e14904952cf2658f5a44708d9bf995639fc3c970fa14dd8330de6", - "da85b6100de30e1256f09c6f40b26c145184bb88a6b2a69d595d0bc5cc3dacfa", - "db6374e65fbc454fdd8e544bd0c754fed0186c6e098ff06b343ba428b9878443", - "79aa6b64c3981b43957e6542d4f29c25136bbd698a3ed77c76388290cacd4d16", - "fdd0340b5f49c9081eb3d294375ad4cf8ddaf915ea561e4e33d49717ef9cc32e", - "dcb410cbc73e6e0ddafca965dbdd7de852faefca3b93ec7099660ff289fc1eca", - "d4e8c721659cc43f31341fcd415dcb938d5cc49f7bb5459f840e730718536b45", - "21b87c02c6903cfd6bfaec0403446123d025339c7ad5e570f14e34ff0ff231de", - "dc244fa9650051826bc25e2eca77a21f452388b708a0acd2a747b5e93cce9783", - "3fc01ec27f1abee872d49ba0ab21600e0d4c3b274dd30032722a6e2d1462068d", - "8d723106acbafbc664042c54e335308061076932fe287c2bf16dd0d7418256b0", - "2e765901a19ed72a256b8b30f69c67cf418f72e758d552854d54c9a8fb5d0502", - "8c8c08bd37ef919ae51ef5449a262f80c55af52929420bf0df1852bc066fe6e8", - "bbfc2413b0b080e790a4e83632bb4d51e67c7f65af2e58fbcf59086621a667a4", - "3ad425b133b095b69c047193082311cc4a0f4ee3c2a4e4d323efeea9d9a91d98", - "ede1cbf8c5e3b5b8b24b0e1a8e68c80d51eabfe4237d0a9ad306f456cacb5080", - "21c6ff00c0b70e7469db2aea544f9d87d1d7e60c510b3c23eec615f2ae8dfe28", - "aae0606b7c80791f06a71687b23d8d2ea6dc6729c6e9e655c5d359ad8df33ebf", - "10d5982850e950cba98d913f7bd1c151f8f88a6740c5343bf36722756cee0d3a", - "60b54994069757efee68266b142da2aac40835d0d386da703a2e67dc40b350c4", - "e002adf9acb57e885019fecf597ce5a5fb7b588e129d67abcdcf0d12b6c08c97", - "4e940ec3dddc8b15d1f50c35bbbdc6314611e968bf76396fa97df4f2e909bf55", - "1c919fb9fc6e1b1e9d2638241757fbf3015ba8c3476e47df94250b42812a5631", - "3e9b17b3df8b2742e58d9c837a66eadb1ec9a35dd8a7df6167352bcc3c4fb893", - "1725615536549eda223f2bdffbf1671e5d0bc16f35b77c01589eb7b210aa0aab", - "7a17cce6ae57e4314f54eddc119d5a67c617fbd9d8bdfad1bccc6f996f6f839c", - "f167742609c37cce00029d6deb85f9cdd5a8e94ec7897ae4f3dd7eaf22c7ce58", - "2bfdbcc7cc29106681a9f7d7bd2362a9076202ce5fda153718e7f1c1748230eb", - "781dac9893ef4739e3c9987cb4a21e4df5887bd9c9fdc5cc72cc5d38ecb59d0f", - "e23801f8be125d4c9a0238ed1e74c3a4de84d867f8d9fab885481703ea68d06c", - "05095153d073388a2fd836205851b821ac68c565af39a5d299ace8ae6c6c9b43", - "00f48595f8b424a3d78e3b1c92ca8913f5e0647b864eb583c4b8b10f1f481c10", - "481448e4376d020e957c304da7b5b18a8cce5b4f37d7cac5e8b79da54171b0c9", - "36135e308724ef5294088948b39ef729a9b202671c482cd710f345719f7a668d", - "fb612474b776a138e323dfd8b8b9ff5ad74b9004bf7c2f765aaccb320ba886f0", - "ed62b3e458ac25cedcd5770611c9a9e144c0621eaa2349caeac0eedb8448a8fc", - "6b02b39f8fc4447d426eabbb62a293587a9b26cc96302168eacb3f45980efc8a", - "db497ba99e897d73726912035069543ca1682f91a23349b6741a9c404ea5b705", - "a6f239689ee6fa244f5df0837e248bcfc6e83fb2b734994fac32b46324bfed14", - "bc921bfb35086bcb83184b8f58aedcc4e5aa9688554e2e128c24a6f0c3fa1353", - "4a4ff8d4799b001f9d3f5ef564a1f0bab58482c56c271ebf419332f267266c7d", - "dd9b922c0bf2ce33fdd20f34ebabc8a0419ec0d9c217205e5d0874c02cb26bc9", - "95c74e726d5a630c4474b4cc92d977d14407b189f01005cac94ce3b065adbc5d", - "800e96bd048aaf555c199136fd9b232185f6e0ac8106c682eb3d552d9daf0e16", - "70dd9ecf82c78b70018919ea58a6d388011229c891435a08817330942e851d39", - "85c71d1a40e6a4fc641d117b51b7004a64dee23ea4ee5f7548e056b0bef61221", - "827a5c1c2adce756b49a3bc4c8059a1620d5e2ef229a1f7dfc408dddd550ff28", - "2b4af9f9c215e056dc27dc7d1ada95afdb7f439ec0cbe186165a9b7d19540239", - "fb536716db090b05e0da5420b26a248b8bddd06abb4ebd98e6718661a193fee8", - "f9f3a488b3cc7f3a480bf1a94232d791e2baabaa8adafa55c5c91587578a76ec", - "01b318d8018275cbb40fb47204a7c7f77a4d404f63636cdac4252a7917f71a02", - "46a21d87e8674ae3af1fb5cc4ea37393165e882ed9b05a89c65325f452fe4a37", - "97da428a927b01f14154e3d2161d5e05ac3e87b7e4975c08bd2f9ffe374f5f16", - "3d0bf91759435ba066f7cbf1f543cd5e8bf88440ceec0a0b75b2d94bdb9b4340", - "37d5f337a4bb049726e7bdc5a2d04eca35a9fd51860453cad0492beccf7d72d2", - "edcebd89d3f7227f97d842fa0284b67882e1233feef0465a7f194b40b13060a9", - "da464b452bd3a035dfafaeda5054faec3cefb02b65aaf1be6213d30b373b416f", - "aa81c86d054586c74e2b969e07639b7ba7e2d610faf7f300a9dbee471ddb5f47", - "a340aad7141c2d28c045e93ef291094fa2a5b35632115b2befbd1cc7377ec125", - "e06961101fcebebea5fc0d0858cca43c9d22822458dd4f26909b040943c11f07", - "380e55f76dd81620d5cb8f7af04c441c22a7b075c00400661a151f61e7dae181", - "fe178055330ccacdb10d6609033986ff11cfbaf713005384d8d56d8f594a3ca2", - "a1c4f0222dffcbad9b8170a28ad60e6e1a3ad84d40e9d8efb029f059fbfc980c", - "abc0bc09753516d0bccb8b908e3ca7d4c2b7214287bce41d3a51ba5ff65b6bde", - "e1a88404f45c8e2111067830218b8e054c76f627a95838cfb1dff003cd404036", - "1028faa7928816a31fc76865f507ee46bcc81542f5dadf36a9481cb7aee10476", - "0d559af837d6da07e8870d3a1ebf1bc850e78af5a00ebd0381ce1f6bef3952d8", - "431d235ab961b98ece3eb9de4a5ceca1236484374f7ad6c6f58052e973c44257", - "43ac808d8381b224b427a9d791a310770bffc3b562f49b59f854ee6c9b27ef0a", - "60bf07e13a4b9abf93a39768d1d16edd1ac98cef9d8f6679fec51184ea4f1bcb", - "7bde3df90c6c5f072ca3ce707edd85fb43e9b997469dc2dfc890b0a64c10ed2f", - "1e90ec77a0b74304de6da999507552c67abdf6db970dc39b6f307be13a9ce6b2", - "2b191a02d720bf188eeadc7742698e90a0bbfe8b0ea3a4129bf64e05bde11b0b", - "47812e7acd3f9e038b3c950d7b3cf0089f99ef5e7a01f8ec07249a2767e730fe", - "fe8e86ed2e918142868ba06febf5aeb0db14186db30635315a005acfe2efef1d", - "d42399eea6a8ff7d41d819aff092feab50ba002aabfe9d0be31044e27240893a", - "2df30811603ee2aeb6a6e9bfc7f3960a4ea436ded8f61617e9c3f7f6f632516c", - "3699d8d7e4b411b1274b58ccd8f16e384c9ab1bcea40ec53a665fa050f6d0039", - "42fb296fad9eaf02f9a1bc5afb0ea859cde14428e0e9bb3ed9cb8f8213489eba", - "b6c1b4ce6e583991176a81834544af727686049101be09618ba5b2628143db8b", - "abcb8316ff69dafe8fe90e5f0b1138a1b60dd5ec8ce906b194b20a37b34541eb", - "ca73338b2e4d853da2fe301ed09aa17fc9f52dd0389fcc127544ebe6130abdf5", - "6151e87266957e0db2499ac0691aecb91f1a8f21118248a7d8953e404d376263", - "4ab696a02234ab83c08454782b43104e02420562fe0c7c12a7d1ee07c9e071a4", - "1cde3bac2ba336e84c0d862b35aa8e1ccf88698ce84da4ec94122043e4f68213", - "ca43243a82dc295fce2f4b25659cefabf336740406d8c0839123028c3c8e6f62", - "c20bda629345b900633aba8cf325c4961e18d066983393f034ef2e16d67bcd4d", - "84f95ed6ed92b0f179f104ed6a8fb823f57fdcabd470e6804b69691b0c4d23ce", - "15e3e481df947f5832a5558ec3392257486e49c0b533c61162c1d8db3f07e4d4", - "0b441e6a77a0fda6b06529ce28b629d4ca85920119e2ca224b46887bcd22ee04", - "fa580f694cb133f753dd79c282672e0958689dbf21f637b56797db51a7eea5d0", - "5b9b8405d7f83396627fbd878aa3fdce2abb36916370118d7fdbe116641f2812", - "c6dd480777feb401800b3186e29886c105f8e965160e66a0ca4dcc737cb6ba0d", - "66f3a7cf87bbfc5d9df4faa0fae9158f1c845078b11271614ac359281f4e3485", - "fde7be79b6cfa56e4e969d8984cc979057efab7ad26af4e7a42cba31e242b7af", - "8c2b5bf2f96ad0dd79bcec0a396ae1659f0e0a0ea1bfc9856a53761c750f38e6", - "00ab23191030baf5847e42622f9b7a0108922409f4758a8714cbc3a95d171598", - "49365ec3ce7379ba3deaa630951210faab3d27652ea74fb5f6f3a3006efef7e2", - "614c7a4c1092d891cf72c5ba5564d08440964347f1e262210621ced960a69604", - "80d00069da86575fabb3afec758107ef7637a76ec7ccce736de897c6bb27d189", - "cffaaf466bfa7b205aaf313dc66c81dbd535010c2a1fdc0da107bc3e53fff493", - "eac91ba67859ce99180409a5a36918c0acd3cfed5b097fc8af2ebe94a62404f8", - "7cfdfc1164d88ca249bd2efb83d2ffd0afad54cb960854da6f0d28adec69d542", - "a91a9f622d1740dbe87357352e34b7563a2dbbc0407c1b8d81fd7ebb4d4c0ca4", - "d2495714a0c969379574f8f6b95bebd93d6c512d6d72e4bc9b764e5f20f243ca", - "086bfb20b0a9ec8e724ead7fc6e2fd22c984133a0406fe729f1f18d63bad90d0", - "b810052bca51989dd06231065a5ca918923dbe84c723e2262e9eb540b1b9f26b", - "9fed1d2c5d861de27891427ebb32b08878af70b0d7ef16240d6e3824e31a6e9d", - "09c640302fecc018a19df81b0abd51e32434b67046b2f5b4be067aa59a429a7d", - "3579390dc0bba5834e4a7516b71bdc12f228d681ef66ce1e824e00d6c736c690", - "94849afd7b943003a69ac12a894756d9295d52ba55c744d5cae94425b9c5aa2b", - "18122c490dea4525574a02600c0041586cb7f0ee5c6375a94ffe26f2604d11fe", - "d610d0a44f8ade901ce3d0eac5a3a5de3d8ebed6c33f9bcc3d58dee4756a1afc", - "cc71b1a2105a6d1e914be2dfa334bf4627d78d3728b5d1514ffcfde7d064d312", - "e31f51126d38696c6fc17d0cab4cbff635610ed64a79b0e42f4ef8b8e015173d", - "f347d55ecb0a2590f29e6ac2bd5d4725f21b74b2d5a5c7ed63a7de4995b6ede5", - "e643000859dd092db22b19eb79600d848a8262b0ce062f0e8ab30ea23a8a3bdf", - "f8ea48cf837e3674eda2016411352bd72ab2a66bb88a4a43f0f8caceef9ffbb4", - "32bc1aeabf9fddba93f6a29477086ad3a80cd59b7581ce89c9d18ee7df0ff73a", - "befd6dcd89d8f5ba89440b40a0038985cd7a19fdf61fc1aa13a1e843e754440b", - "cc75ef66df95d9e85796182fe2327cd91688c8af77c566a85b8b87868c46f92d", - "dc7bfbdd2ed53341112af79093f5e1cd9eadc0e9f2b4c457767d2ea19aae3cbf", - "07a64963e36b0ed8b3d76916e528f784585d4df7fe783e2625c91088f32c1047", - "e67f26b8eb6efa46876aef60bf38a57807c82690b7f2f95a32103341f53a249f", - "63b699c36bf335b57e8ed1327e927d8b297d0789a2a57c9af93817beadcb138b", - "c7cd69ad1a0bbfa82a884c946cfa7a878360d371312d774b5a251a4251117e21", - "f5d0024227d891d007697f59222e1266a77f7a4b489da31b0e0c02ec250f936b", - "78cf3d17bae482499db637b84b1025051b99ddb61fe9f7de383f9ce20a18f537", - "fc4cb38dbf7884e80f68dedbddf055a25a2ece9b2730c08761c444a616cf44d5", - "1b15b7dff7d61fc20154a61877f96ba54344501cd78fc425011e865e18a41bf6", - "2be72a69c1695667d43336c5623d8282652b5481a72ad4041479ec3807ce4dd2", - "04319440cb2b11bb681c9267dbd47f206489f8426e9a1593fa103dfd892233d7", - "a348d04bc4b067c654cba8b9bda2dd842b56e2333bb35784d1c98dd75808f0b5", - "31bf48609865908d128770bc783248b8e2b77990bfa520a035abfd013d19e09b", - "9620d959a8bd830e0ffb9d0c752a6ba942c4ec3f2ef9505baebe764f640a3483", - "c14c0580186a2976b3d6eb99affd00bf6f781816fbcb67951e724f0d345061e7", - "ee757adc87cfcf313d7fc983a8d949bbb27865cf91b98db598a5d3adfc3178fa", - "293f285d1b83eca844b725ce84843d2e23195db33936018a2d23d4e59cd26f3f", - "14257606b1e947b8447dbc4f4a5844e82784f033d792858e2b0864d03e2b0317", - "8a0c17d3c3350510b394d76a1d4ea1ca1c41c8d9041a74b4a34c460571d088a1", - "81dc4f1a84dd77f64cb8b0bad2c5ad4908c67b61faab3dcfcefabd626b8c0a29", - "5b0a9890b2f04a41a129c770af5a5b47ee02bd19f471205540b2113bd8bf7303", - "af9d8cb6e3f5f1058d3f15094f2f6dbc4ec5b52a7a3e5449bc0472e8f2dc6f25", - "ea8c471aaa1e2c5a986248671add2930b365bdd463c03b47452cc9785a5691d1", - "3215b470f4ac10c8ef00db937a71de5dfbafbfd30bc63ed31fca342817b98e80", - "1492cfb1f74165c4004d6a1a3bd16169aa81bd1b559eae1fc2298699d2f1d1f2", - "d10592e775326a980f4d9d857b1168ab2646aecb5740a1006ba8a4d1e8152c7d", - "f439a0b60d14c0d66b4c30bf286bf3a1fb71b6f6cc30615541f2e883357d3a3f", - "9838142b6abc5a68ca97d3400dd2d4ccddf6acd4339be007aa92f65b17df70f6", - "56ebd709abf6f25bf4ecce4b589b252ab837a1d7a28eabb61dc4fdba21c40872", - "6d110fe5097bec6d050edca8fe68cba32b9b77953c27d1fa6be3e1e49ed8a3a3", - "00bb018e5973fffc6acc41a37e116e0183abe9f5d30d1a434c91d2ac9a038b0a", - "be0b57353221cc23500fdab68fea6c4d940c9a03abc582be799ec45c35643909", - "ac679e876894960becbb5775b8ff0907d5f34eaf1494487b2fb580497abb717d", - "c62fc4f57563bff35683a890be91cabdb07b27cd44da3dacab91c61dcef64b96", - "dd93f3ea3a1929f5b41357e50b598794d8822ed6b9c3f0fe710d52271bb5b165", - "3e3c5ef88b3f3350e88ed2197aac94d6b3f54691bee779d75e5834ea5809e484", - "7486ec8a838fc6cd430648b79850f33a7736f9e8b80c3c9cb3a54ce079d6cfda", - "b3dc21a727b8b7cb782f5f926363a59eeefe6eab2a965131baef7b84a9fa8672", - "72dc4368b75b44f94e8a3e39c65d733529fd83a9faf263821988dbc4c4a4a836", - "87d289c07557de9f07a807cf99c5e8e2bd9b68de855d30265866be8e63a92008", - "67846dd5e4d6a2ffa128daac791a6faa202c1653d15aef92b95708c18a20f8b6", - "104c7808c9604c436a6186af5c405b137cba509e2cdfe517070817c0d9479dbb", - "67eb51c9cd58fa201aa97676f55a0010f7d3ca7a5b45bedba6279c246a403b0f", - "ce5e614902369ac675355424e1c99515c675eb900e76fe57e347ac3f55b6e9c1", - "0ad2bec41395d59a36a023bb97a8e07e351e336230b8e5f760aa60344f430182", - "9df7272151a2abcf39887d0d1afed3880abf092e1a686184f50cdefce516efcb", - "bdde3b0d6aa78004dc4d75586ca71ce67974cb8f858b9b836c8bad164410136b", - "8b6d478a13b2a0b3b1510fe24306f843147193136d51f0e8f0b05a44f690bda4", - "0db4646f1070c8576f87136db1be3ec3430475d9ea6f38309e63ff0cdab23cfc", - "7d028951dd6fce6c19c54fb3998ec19442958801b740e0fbc4c6a478622b4661", - "67fb891146fe9e4864f4f3b07c5f2f89729d84e8977adb102d2e50f8564f913f", - "4dd23e5a85f590dfbde7f7ed3d950e387bd8ead3e83e74fc3d97c7c2b98f13e5", - "7326ae3dff455a627f24d774ecb1774de631130a59e4fbc5f48789b8d08f4b89", - "7a247d18adbd19fb5700ce13903facf7ed79d35e33299d12f1d75659515c3d97", - "ab07cfa599d892ebc079719648e5fac5b20cfd189c60928300153aeb2e7bd254", - "5738d146bedb3388eb7fb466fa315d53e1595ece09523d182b30dcce65293d3f", - "72f4b1abae88e6c344ce6c4ceb38ee5a63d916e12b275cf52b16bfbf4bbe7db6", - "8420fefd717a335b93ebcfa8a7719096717ed4fb975cc25a77140d04d82f966b", - "bfe8301f981534213559658ea7cbb4ec538aa9cf8f968d4eb8dd79a4e2b11c31", - "605053e3061ac4fbe65e425f1acfe9ab7c287ea68b03ff8411538d669769a7a2", - "6debada842402c1898d9ccc46c0579c9e7ee2f6d1f5bb974932c1261ddb7294f", - "c51cf21b66ee3dd4e229ae60f0e361ad96d51596a5d70c633a20b2d8343ddeb7", - "d3e71b22308739701396a35d5912cbbc289a6b320689037324e6011f4d3071d9", - "9f1ae266421b086cb6052b2152f59c58e41bef6e7bcf35b92570cf79d1ab6a14", - "38d4e8e402e75ac4a87074571754821809b6f58b6be46d91451e366b1274efe1", - "f7114a9c0befe8b6ea4ea4a8f3339693aab73b71b30cb4426b509c46a47b39b0", - "70d9e587eeaac6901ef76910ecef541980181d3047deab2f8a0d82e9eebdd7dc", - "8e9d311b1e16f493ef512d1d1c25d83d4febc9861f6a9006f77974c31a1c0940", - "3cef2030d5368c168780f2691f6dab51537bed70399c45e1b32aeeab0fae68f5", - "6e917d6f2365bfb5b1946cf315b77c2195db4b86e6bd516680b954c72ab8b608", - "f53e868df8f7c95715764f3892b2290b720e8ce1de6761bf8c4ac4019e66353c", - "bf8a8feb7c56b761fad2bd3cff7c1d8b5210e81a3a2a0fb7bec7842dc1b6b335", - "5f7feb6ded039d4f70130498c570617c446f65f00cf4d67b858e88572c064493", - "f72e554283bbd6619ff9ee2e5f90c1fa974093c2c7872caf7a2fd1e88cb29bbc", - "ddb840437d48014e4d2e96766e21c23a34d0b8af03976dc79b19990c1f6ad9b6", - "25e05d50084e80f3e095f5444618df131eaa3867d4092869c7206e3d4397fd35", - "c4d776fba170f64b7f21ca6affd61d4bcf4ff085f36915c9a1112a784f381d4b", - "9109a5f35378bc9a36c9943d8bf77bcb37f3886f22f9fa4715432b0ee1582191", - "81fc3c75a291e1a691ba1189f0006a92a99cafe4587e7f2e19c1a3437ed79d4b", - "6a88f0d9c83e69608fb81dd17772c03babaf039b3783fa9d7576c98582a22dd8", - "7b94db271d05f9d358e323cad6c48cda2de859ea253d70fad0d1ad81bb007f76", - "5e1b2229413e85a0a9ca72856655337613ba440c2a92cb498863b39074857283", - "4b05dd60fda620bc9ec9d959450e1cc09cb0e132bee6d907464b525d8916a171", - "cb012784c788b3d1d1b38a39b264a556506fa480fb84b0e10673e5a97591a29b", - "207ae88338494a75d55721fb7effde8a917516b52fbd1a517699baf926897742", - "39e9354979db9ac4bb692afbd7f913d8035526ed0ee8fce78b9a54a38dfdca17", - "f69648f4684f6dce1181d363a257ce08f94dd7e71be3bbd3c40429cd03d70dc1", - "2d8963963504016b43318c962c27866504a4b74f8bacd9b3cbde29d3a62977fe", - "7513f9b680f7a3beb95c38bf0cb6a5c75fe50b57f62e6358c9e9c67d525b0f12", - "1a34a1f486a55073492f3c32a7e7a4fb4061e549c67bc07dc08c5e9ed67b6c2d", - "4de3b09e43f2490885cd0e0f8845f4e0617a419cc7028eea6f21203f1f6c2c60", - "5004c05df6f74a5060f3509de376e17a0dfaf954153889f52abdc7a41bb8b955", - "04d13812c5560de1648e2e1410b620496f22b5d0a8e3b0cd4b0926338d166ee8", - "730d61e582b683c313c52a2265a48a9189a1e61f678c00efee0e8ba6fa85989d", - "ecaae4a220bb48a4233cf600026e486cf6c9b633388e8ce6bac2f60553e2651a", - "3c1f5d3ae4b97dd83fc0dfbc58f1f57ba2502b427e6aa4b649f0e05cdbc2c96e", - "8a330a60ddca3832bb4837456fbb4528e27185b682e699fd13a3d3b61380e847", - "727abf56937c7e28fd99356285c43b080252a9fdf685a98630bf90a53800097e", - "9b5e39f3dd5f105c5b26df56a45c3c77fd48ad700676a5b175807659ab0d9d47", - "1f2ff9482eb73a3893b5c5f9ef120890fd0467061b6d447563f38733981b9d9c", - "be7c14669a58aca5545ab95515500be9ce1b07f5d2d5ad81a185e92717cddbb9", - "e8c1bab1c453a106db5141d76ce64d486b2d893ae015c4058dc756ebaba44b3e", - "e065a6e46cb480cf97ee323155daffdeb5eadf805a8ed1ba9e77351145d11c90", - "a8cbc87be51e36aa0226bdba01c9909e435d7ff79c05378b7f0035264c07e6b3", - "7db2b998c8c78a4b2e575538561dbd334fe287559e699a01e67997f1f1576151", - "6290aa8d6c11d6926d2643f70c8f06923293c9f34af9abf2afbe5bc2a8ab61e3", - "31593f68234364618f18d5efdd6b55ab3c2a52d2f26c8c5b00f7e2e36be040c3", - "209565163eacd78bf0619022330074f3b1d68f3468d1e08a2440156d2e0ba821", - "eaf4534de17c1efc31a839aa671dca53d7b38130fabd106686ef76a0201d6347", - "6ae0e5dc5864e31172aa9502e753d3850f5a2c5b7b7a105a1425416982f9a19f", - "4f49cb60f5e33c24a3b4aa84f4fe0b47b4f99b89e20ffe94d5f919fd158f3cd4", - "0b0956b81f6aa5f71cd4c641b0fd5cdfff7ed2cdb53be03070f5b78efd8d5424", - "dd3e055724c69eedc4d01478c392f3cdf46dccc98faa5f8b4b05a4eddf76f021", - "7d7bec7a412dc2db3a1344002b0093a8170e7d7d66f2df6339d75ac02bb625e9", - "9971f19c76c8623696bdf8d57960db18c3e116bd9ad649d02bfcc7cbe040eb98", - "f22f97209ecda7008e85d77f5b4354299daf29d4837389384f7f5428fb97ddf3", - "441ba62f16a2a100878e1711947e9057d2e19b408a2017ed995dbf2cacdfb7af", - "c0199bb50c6191a1d949d75fb4d73f4e8650456baee0e32e62fecf2a77a92edd", - "a969d4b726b1fec994f71c67df63d683be7d99e70d4d9169b706c62afe092c4f", - "48f7c348940a4c6e098109052898ebb115c511dff1f3bb5f79fbe8ba072d655d", - "cdb845566f29aec2259147232ba5fb0f884e94f877f27ed7734fe3090d0f9f3c", - "9a68c14d1b65e8b9950a15f55ba4c9a90a15f5af3dc5ab2b1116cfa7c141a00e", - "f1a7abb640f6e691c70bc246b4a4b68153b576513637b4aa47022be7eb2acb4e", - "7c2a22176457024f338587248eeea37c1f9bec161539a04c2a940ff60152a245", - "ab052e8995a88cd9bdfa5ac65e8b03e1598eea1fbb3b045338c35e221ec3fb7a", - "4c94074998f2f84000de3dcd70b7aaa5dab30776b80205b864ebf7e21e66d979", - "665ed33ef54aa109489dcff4cb70c83680cffd89565d93f19784dbaa0d6702a2", - "d17d73622a7f1b8ae0b529a0f5a770a66ecfc751069802159069e6b9a7711c1b", - "75c24e808bd29d6a687cfdac685d13c140b73e8b0f036286aba7fd617201a678", - "40507b639ecd92c158e6b586d40f45ce17cb0fcf0799767db35bf101e8925022", - "056b1f738f27640e776e494430a4b56217dd251dbca7517e954088cf4a4b0ad0", - "bb0eeb5c8af108a8b9654586b8601d58c207439c48d677e15bae0ace37eb95ad", - "a9f14101dd6cbb0a9e5c52eb1f644049333379a8763ec62498a9aa6298193b35", - "d776869eceb65c6f365ebe3dace8a9b6cc46f2e0848ec8b0e3f53cc8a06657b4", - "3e95a602a9754dd61b22972a41f086e8250e72fbc17ca8cf9160853f35429bc3", - "ca2d17064a6d30697cb3665e40d42e2476aff87d74daaf890beca36f254bc30a", - "04a62b189aedf058d37b94490c64ab1d72f708f42a0eda3fe53c3c820151ab32", - "8f9f8b889fe0f4b69f64c19be8c01f88ec959ce8bc4099f848ec438a30ef6481", - "6daa6c5e3780758b1abeed7381d09949f8106896d40a15e4057da3434ab149ba", - "bd18a238c8831d2202ecbbc7dccd1313df917176ab53db06c412d299e226adc7", - "46c4750048166a1eb17639e256c5e0e77f20d7e6676ce368c68142f7f422fb0f", - "3eda86147c7a0c35d524b59903a050acbc3c71a673900683ab28b3fab425191a", - "869ff5ca501a5b7c7ce5b1933278ed03e24bc9cb097379b43e5cb88fcb521cf0", - "174cc5e21d5f9edba15eba532423041bb21c696ff28a27340153171b9881a813", - "58001d98866c2db24049072bed1edb35a2d722f5021e24dbfa784c1b4134d63a", - "94dda810b2c399b827348fe8ceb6921e0859411846167a0e3164b352f4f1f955", - "23bf4ef738b82d15ddd310ff965dc70e4635f7eef475cdae6b6acc6402cea14c", - "e3d0ba6fdb57cbd7f08f7fb6eec7f51d4bbb4081f39a0e927f2fbfcffb6bc8aa", - "8caa32d8f47acda56f3bd4479c7c23b420132c7a4aa7fdaf16832efacfdba6c1", - "f908fe6ff99f0e32793f05fdd69e524711b74469b7a24baf10aa4c19fde0a62d", - "ec450304afdbcd780cd5f1014405ba61faa448d35b0a17b883298534d38ee01b", - "9ee31df3b19a55e198bd777d66b5fcf126483645c7e417d9efd2d357a1e0f3d2", - "38f55f41133bb20a886fa194b3a2babb5201634af14d1e24b7c8e00ecf130e98", - "c77a2c7154cbd15a05342bbb551a9c33065f9236d0128141576c413b105c4089", - "d9f992d46e920ac14d6a7adc85bea5d1c3fcce49b6bd13e8623fba9b446b7c6d", - "a69b4ae5f7e4a3799906b025c7f54dfc17fea886b29b32a6cd96d369bf190d07", - "8ba59802784a78590824d41704223af35383e8ad2cdd7fcb67f6a3dfbadde795", - "4ebd38f096162f6f8cc9c8e31e350b49011760efeef11b317db651f9108951aa", - "574f8cb0b775a90ea0caf4447e22bd7fabbd30c8a99e3ecd6f4c55ec5ae42c3c", - "67bcc55a4bec8fa3bdd79a58ebc9161cd5ecaa648646b2dc8bab26c8efd68c29", - "82fd0f3beb8092d09e999e3959f21f5a159aa8dbdc839e018327c796c1d73d28", - "ecf45cdd82b0637fa7d5204c41b511fcc746795aab6db289bdd0d0a0017990c5", - "10eee02b1533eb391a390be487333c6dc2e421fe55534c15b7fa0ddc0078a752", - "aa0de4df220e3181be46f93e8585e0152145fa21a1af3ad74fdc7c956fd27960", - "9144b5defa54650675feab07226c82e14e72431cdceaf56e78f7d9cd9281faa4", - "8b480bba78d4eaebb7a3fdb10285ad4174465a90ced7a0b0d7500c82a35d1011", - "a53f0d9cff5eae5ab51e1904d27f583dd5e3b02b3418c8084164f838e775ea1f", - "21173c6831994dc814d5545b70b7767f37d9556363797adc5f0cbedba5a99bd0", - "dc2ffa3e613f1eb510af7c64020f79ac8fe905709faf87cd755ffdaad3e2bb01", - "2d1e16c12b759620cd018b1bddc52a298b8bab7ee1c7d0c34a6b0314e96e0766", - "633683c4440e3659a51e619a64fa9c44cb2c214d5ed2fae31decf31a332453f2", - "afa36075090a646c06ecbcbc3af589a0f84ec427b2d1d6f0a3f5ee54395b0167", - "6c33cb7c2c601a9aac5a2129fe5e15c330aa3985b1a2dce10c5219f58c80f0d8", - "a83cc0a2a4281fc8a4dffe1b2a15ae70843169b1bb3d0bef6acfc465b6bb4efe", - "fd8f5c771b912369d9d27feacf6b81af19d6d73dc5cb1322581f321e02ec6060", - "47cac0b216e853e12a3da55856bde193fc76bcb9e08ecac61ba33fada228f572", - "8436b2ad8421135f876fe0cba1f67c04819cd0b14f2a235fa91c3291b87d80ea", - "d6d8a30a443447b79e8430bb9d2af72cc5f7362380c902d2a94626a5f0d312e0", - "35e3e571bd37eda051c5c4f91bf44f5fa4a8dbbcb55ca3ae6e8a38a3fd5c1eb9", - "024b534c561e221b2c9eacbda82b30ddf625dacee61c7989f503397eaab6ccd9", - "7aef070f226f3aabbf469aa5d31b6a96d4efee81cf2e078aab3a290ead94133c", - "c8daa9a1d60906d5ea869bbd0d301b72d982f4faf734545c60ce852ecf5444f1", - "438226f6e779d0a8a9bc405f4f0a8d393520302916939c25d94990de4e17da49", - "0d3226e22dadcff6b99e59b4b8587556368415406ebbbc14f2d49f1a95aa3189", - "0b0cd8a243dd3c923a806ebe8754a3072b27d5d074ada1576d748424787fe5d4", - "8d22fe357bc596a1933a246832e569623093b20d46f0d9e33a509b9a14e998e3", - "fb8c048a1cbef0eed7bae2d9372bf4ce2f80cd81ef15c0400c42d7a7d20f5d02", - "de53dcab0e7d6429d45bd39b0087e6582194ddbd79056519d8b3b4a376358d6c", - "517962b376c5c3c4c0eba4a9fc4b9045730f09e80da9cffd7d1c855bad5ea990", - "91cf30e7b035f20910bb8f7614e6683d7e756c4e1fce253fa5159167964f7474", - "2f1d197e47bdc653beb4ea9611ca0a59c9f8a26585511a523570cc6f6fa1f2b7", - "2e4a3303359de2ac8f2d5f5eab23a2b07a896e5b9c9608facb71905e5b25f9b5", - "dc2c11d7c79323c01bce22378d26f7191be5fcbcae8d80da83e97d993026954c", - "24c156ba7da6713bba23756f59571dd7bfcaefcfe8575ed17d3823644d3e6fd6", - "4852c403444e2fcc5259d745b80775771b51bf436060c628008232c999d5f4df", - "f2242d6f447f416488e0a48905afc291812dcb5fe7b8b223fe882ff3b27bf544", - "e8c5f07529eb9cae6ae85967ede8621a3a708b5eb7e4b2e495c7f0d36517fbe6", - "7a769b458f32f717e22dd850e18720e44787e5e9166e592b1356a838d4f32838", - "125fe24678bc6cb7c33d85c6d47314f839f52e2c7ac6328e76d0ca8da5f67f10", - "43d2bd877f617da1fd4fe4776fcc5fe1e7346e90f414320352f62a4a29cc9fec", - "1841506ba9dced92df0b48dc41056726b5fd8d5660a01cfe782d850081071c34", - "be4547a0a44ec94433157d3f4c12a86f62309d1939321a96d5c9e93082831c41", - "d39524288ace2559cd1c44e39bd2c7c2e32e7c4c05e7a7e6f03a3b464b5ed40f", - "3e1e585bd91ba24b35ddf857181dcc3a914e117f2d89360f1b1f7eff6bc0627a", - "4930c9615347b7ebd41cd2cf0835ab615015208b9a7d9944b9f4e34b7dbf75f1", - "1d9edd635c74581a7d11c11e2164a0eb544190466d8b63dbff196c50a7b08752", - "1828b3517d24bf8dc4b3bb463dfbc4bf728069d17af38afaadf73ebed6179de3", - "e6c15d4a8f4780925a4df3a83c2f00c8b4d009a18f6feada6e2d594c31ae859d", - "279ad97c1f594c7f91ed92ed41b3e4026febc2c3bc2fde7045731b9530a85c8a", - "46b36b4b7c41dbfc81ba9a05285924e1d9d722a52056e91d02134e95cbdc6516", - "4bdfa13174c45c4d6ed1644073d2d602e46ba978769af5ac4c40b384bae76624", - "bbc49cd7f91a9f37eaf3f18599370a46508d5b4e96d9aa966bb9594a040c4547", - "5a9fdabf4502baec439546fe2c5d46172050902b3c536e03f92b438864670f12", - "0f68d2572bfb8d056187f8c63fc38abd1c81e93eefa9e0c3eefcb30ffcd74715", - "cf68bc19ec12af7fd65f3c157ce204eeb777debb8e7ac9bf31a520885e96f1ab", - "ffb11100f1324e60369ab375977f270f4632581184466b808166e13e12316ab5", - "815a7f17aad2e94256e40270159aa0aa56a301eca9becf9374dd1b55e878a6e8", - "c39e2e65cad520e161a08d7e198a09e85251f0589428b4cf39510e21ff9f7c84", - "5d848c67af70e6f6bdc5f280224e219c9d31bca8e7cad9e7c424ca2b812a5993", - "8bdf35b75ff01f6ff26e5218e75f83247c997d04c80e100f9518c6a2159ddcda", - "fc00d3da7d635dcf82927f42ec414cfca925dd98bd5205bd7911298734f78d76", - "5b709047466001cf8cac1582b61b0770aea212db13efa544b50773515a0a0aec", - "2b321b0e5c69b9a029942bd55fc575476c315834911eb83890f41a212c2af9c4", - "edddef1a4b85d72b636bf159fb6fa7a5aabf3d229f56f4c1fb499153ed6c3a36", - "cb69a860532e422fc13337a33630944cd49ec9f6311438e146846103b1465907", - "9fdebbab0d0308f727208fbe93888cfb1d621b6d5b028703f78a4ed15d60b14b", - "bacdce969d10664428f4465fe16f9a57365b9339b9a6c61705194496d9b08de0", - "f321ce01a612b6c09496671086b5f4303270941b438b747e4a7d7963f8fdc4ba", - "b8a32619bce1beef98cb26062887f6c62b67ed28edb4e38f35c046188662bd5e", - "73a9b46c75d3e70c9c468572c400106c8d3a3dbd37eb0a1c7cb49dac4b8928e5", - "de4e9529deee200ebbbcd88fb308c79677ad6a15229e72a869ebc7024929606e", - "144205f8b00fe40b5b730d9ef782e39a92da1715e170a160d70a399f246d062b", - "c65f5aeddf776cfb9dcb334cf48a23029304f18cd81a11745569289ed5aa4459", - "4dd67965a8d4bede9d285b0c18471696963cd3fab4976c5932f2fb237f805d15", - "5ae21e619c488cb6b79db65e402ced5ed2ed724f333cf7d1b754aab10e75b799", - "2677b44437536aa4edb1505eff2fd6d611f2116ec1f822727e6999c0e207aeb1", - "1546f827426c88aa591b46d506580540a278ea52463411c94f78a90ce0911be9", - "20ea6d2e9eb85fef19407754850f0e0621948de522d5faa25c5695c8a4b62a2e", - "e29ec9f4efd9669bc2f5995ad0eb79b8b3ba982f625d7f3e20db380060fa5b6b", - "eef2f98a263f4537e084b6137bbb21cd355bee661fd3a02b9433fadb9571ffb2", - "d28af3da79628c06213b66089ac413e5f93f3bde8fe85551fd0fb37ef1e8a0e5", - "315ff7085c3a953605894c3629fed5d032a02e774027ae425d6dc66a6864d8ec", - "3faa16bc6c5213e493db25d49e1c490b83b2d3580059bbd3d813282cafb1a5f3", - "8b031286b8807843bd1ff571ba0166642f797a2ccc76f2f58d75a4e36464a3d7", - "2ced7fccda2c798991e83d241836fc1f1d44f3d039cc196da7c162c4c1b857c0", - "9031931010e2af2429d9983ca5628782a3cf691f63018c3f03e277be8938aeb1", - "6377d0dfe1fcdd84ff5238cd1b368e34eb52d54ddd7ceafd6d23681359f749ff", - "0156592d17f4b08630b16d9262860c8b43f91709d07214e8717149e161f46ed2", - "c6db8778e5d3e5debb52fb14f27415c79a75526f7f0a3a845b7f1d2b6d107fab", - "51fe71fb444ae01a7e1b178335a212b7f7418305b57972376a0c703ef762fb17", - "6d7363a007eec912f495052e0d564879def8b4b15b7d05e08de7c7018877c83a", - "8136bc4410ab807169b57d83c98b18aac14e0b658c0b067eb39d97fa5a826b88", - "c3b07394bb89e4573713fddd28f54611187d261b03042665ce6afc86f7eb0def", - "6965acb258c1a60f30cc25489a27cb1c98c03fdec384b76862aa159ceada58a5", - "1835ab7aba1a4462ad6c53edb0447434be29185a572d72b766d56257cfaa57cd", - "310f454d280631e11cf58f966941621a4eb63478050c1c65dae705d7520122ad", - "c308aa587fb74f0357f6a93b25862dc226b8464e9945a2dea54e76eea61915b6", - "5970c822e86bb1084690d3cc1f6df21b9c6428e7c9fa8b5aaa9506592ded31e3", - "db30b918a9170a5afb864fe38a899993e59c3a20bf4acff1b58865d14c440a79", - "29f8eb3712a1b6d8ab7eeb03bfb715fad661b4b617d27793ed9102949ae942f8", - "de7065599581b69114278461cc634f44a07c3b47d4b7ea24dfde8642dad5aa35", - "b99b0e8b659e7470ee3cc873f3fd29ebabffd9238fba75a70b53ca5be0600132", - "e83197aa5ac618930418418811d9d642b5a683d2dd50556a921d1662e8f13797", - "948173c4df0fe9577f69ab8632ae404d57be04d61af985cdbe316d99f8e37f36", - "87e9d14035b14a1d5faab8f1b2b1bf185ca95a1e0abc4a88ad1b175814329fcd", - "7700b6af27b0952bf7348d120918a0f22afc90b2ef10c1570f0b77f70512e435", - "699ac713f3bd03211652905da9e4a6ad82d63f5dc4afb44d3a1e3b3e41fbc21c", - "95229240c12af9cc24ee6fc89d97117fa1d4057ed7a8c9ef45e3762c9598b246", - "aa355061a765a5aacbc1d5892bc930d663cdcb27253a1b76d66d443b64fb62b4", - "3f79c6415e9531c42759646f7fba82cd77181932f17a98ed0c2ae60490654ef1", - "3c04fd1b885fd567fbb75f4c26689f87cb927e5aba1cf8f75bb67e62af2ee7c9", - "4198adf6f30c894fc0a5d0e48c3e5b599ea245f55ddc328852a9f8229e03f036", - "5c039b04fccf14343c424a8a3cceea11d085f0e0d3e5deb21c41688ec720110d", - "fabd8cb3df24fba8d45f76c57a63b2d047f3aa24368540877da47f242331b9da", - "a949b24ee9d2bb7ccae16d3b991b53a9eec4514c52adf4705e3ca8c67f729042", - "843f30123713f89c0e3e60632e43d6cc4ed29e2aed0a44cb733c8ac58bb2f8da", - "f5ff25ed7ec1ca5a7536b26e83a8f78a7a5d1d21dd7afdd34a55f5ac9707989a", - "e4076dff358e6f40cfc029d0b9dea65cc8d974c400ee329259ee9602c35dde7c", - "8d99a555e15f0c2c5225baae04206d64540fd70ba407b5d2dd39ed845b6b7414", - "2de475794d56606233fdcadc505fff9db12cf4a684100a159d51b7b132519ce2", - "190f9af024f3061f788e23b197313c7ac7faffcd18693f5729f24e60afb164ac", - "377ec26388f9b0c79c3ac41240e19fe82c481b2930d5fc145d86448daf967b13", - "a5b635732cba24772b0f9489d61f24a7ebaf4521e09d940785337fe315196b60", - "864f1ae94a7962f9f069f0dc19b4cf8204ec0346f9a454e66bb955102059e079", - "51541fee2ed8406130cea7aa8f83776de69e83e607c37e1addbc49d0c78a02fe", - "6e7551c5175c172c5d01d0ec25062b9d75cddd3a5eb491ab3a02c524bd1af649", - "ebe82e8b0010ffd11a1ba1ae65a05b14a2f24991160101367523bae666eb6883", - "1a21dcfd6cbf427af372f606ed3e063d5e3cefb01326504178522e38a1f972e0", - "c0154a87307dd5aa7b0453cafa9d03bbf4f929c49d58e07b4011519827587dc2", - "bcf5d06f5966f311ec9481d8445465283f4c688fa52fa45a8fcd4c82856d8168", - "070907851a2170b001477bcfda37989da3896a464cd7d4fe597e6d016d0ebd5a", - "82804934f7e34b39c3bee3d69b537362ab2bc43a857d2849e1ae4d49edfc2d50", - "dc85967d0eadf98ba75f1c4eba5bf77161b83d5cca8f5ac520093e55f36287e6", - "e34548143c0bd36af84dbda8b5080e9ff30fc4113a22d4972ee6eb0afffa72bf", - "6fd504f281435973a52a15849eca98a6032e232be76a23415ec2b357f8a40b0c", - "d7fa2b647a9e20b925a4e8a693a1fab93b5f9f868a4f3d4688a6218d4ff30e47", - "c25e27978d9d1bc1dd3f0fd6e009142fd12fa2063da901feb891b8c2b92a78ef", - "a552c4fce88082833a1b86a2ff362c0e0ece1f3c8e4db7d37aee10d3029ff7b1", - "1e210d0afe88238ddc7d613bc3278303e863d6956374874bac35c47d782c45f6", - "e60e1cea07a99325b18704b57df4c3a9de60294185e543371f361d58b176cf18", - "bd00de78f15a69ce7704a82751689c4c43693a4c1264ea9e15f601063f0dec66", - "f13022c7aaa5a2b30708698333151c8a8faffe4bee22de3ef223e0c56042d67b", - "edf40e69b091d33c4c1dcde0b3c5cd5f6a497b7182be68585a9506b9c3792b65", - "d05f73837078ff5bbd87491bb876aaa80a3b28d2683d124db409ed36cf81c586", - "119703be0b79907f3c0beb65483fdba4d86446621650066559394af3662b5a83", - "a70a93cfc0284491332023e2794fd327e76a6bd5f6714b298b333005bf67eb35", - "9df01fa31727e0eb3cd5bc03b02d7f67d2754dd0d0519f10a1d3f928c79a1a32", - "d4371f96ef79c0d73f903f3863aeb65c3022599e27c30f9d493a5ef887a4cd29", - "b01d0f08623e7f27e4164a82d7bbf127413756d8184271f143155d65c90ac878", - "0234061eb270924afd57774efaf9a06a1db2394ee4e59bfb238c7f2a47d59e30", - "277d56b87089daa877f9fcbbefd40a152ad812e87ba7dca4adb3a7040db1d224", - "b2c7d50561cbea91cc6382024aec4cc7b63789d83c65a09ec64294191e7c4202", - "17bf4e897263ce00ffed400a71301d29da08aa3c229287af5ab434c1912552f8", - "e622218aa62dd2248ef9f68d832bdaa375473109e405f2d6616bde40646db403", - "81b82cf87a6c5fefe73bf8a895d37379a9e9df32222c3f7b68d9830b323ac64e", - "c622af80d1fc57b7f3600f69a597b4f318a2f928a6687aff8fa210564e74f65a", - "150d5577562bbd2de9d74715d5d6a81c8cf19ca79432842594fb1259e6446773", - "b3e405b564da8e2142fb8b538a2fbda4d3b10c50f22cb80c794a76f44641d7ba", - "9b4b4977705497db7d3331a95fa48986272cbee3b75f4e24dd9f97317e59cebe", - "934274aeed6fce49aa6b5d3d81ac19b25a5036c08e55092793e7ba132fd3c860", - "c8daf413f8c9caf4f477dea36744439c5dd3b524e8038fc48a62a05f336421ee", - "9a24d26e331b918fb905692b94622af62fdd4f37795bf728ec8b93f74c8a2db3", - "3423137b037450c8c990acc9a5f1c231779b55b029452aaac3bf2681afae5cbf", - "24ab809de565408da11633cd88a13ec848fa1b57e09f49fc1cab2b253e0795d0", - "6c7a7db7fa7e69ca21bb1c822d761234f57bf56d2a0b067ecdea2fb17dadf995", - "ff8975cd63c8699d1f3038e44e509a07acdbb829ebe24aac15c38ffa37ecf4b7", - "857493270caeaec90ad6f4240426af83a60f7693300f8d0602d604fc8d5882bf", - "6dbf2e7aba1fbb3bf92b6b36bbf4d8c3c0bcae49aa49ae6ee88f55d4a2c2708b", - "355adee869a69b52407ba8f37713240a687579ad18b93c9324e6eb433b65b660", - "edd67d606a646a44caa29010748d19cfaea94ba4b7a18d3ca9db5fa07411f586", - "a96e1a13e98bfd3a280ad47536fd4b2532d2adc8d9af4de975dd24a13a662a81", - "dd9972e3134cb149c42674e2008f9fe38d5497bf03437a6e800c053a777a2cff", - "fc96212052f3efc428b4f3e2ffbd4b2507aecd38cc0707e3acd4874d74c75107", - "6f9629442bf03d889ab98ee76a4f9a940a45429f5b1036215fa2eff37af659bd", - "2c1317cd72c0eb52d48f1bd618d0e5722d9de1bbb365ebce42c44fdbc7ac06d5", - "70d7f11dc9509bea73d582f746ce525d8d072a596184f4e179cf98efa5812624", - "558a745f1b06b14c0a038e909661ff429c3eb8d1fb39231eb63584ee738883ca", - "470b9fc5e9997ace5582241eeeba4e74439bff97e761fc7f4f765d4ad876f75f", - "f6893130e4f97098397cdf4f671dc4a55f1ec7475c531358747388863a0f26a9", - "5e5fbfb0f8874cbe7b14fc7cd52bbacb291cc35adb18973ed6bf1e47c37bbbb6", - "657301656bde4f09c01ec6ba7074cee4566a9e0f29197121a47af50d35a3d72a", - "b225f6b1dfdc8ce9cc54ece3c7882baa4849b880177f4c6c3f03fcded37883c3", - "e92622d0753368f39398c911940ec7b0a23f7ee180b892c8a281899d7329bc4b", - "a9c425a340e8ae81ea6fc03f98b632666d5db72ffbcb402f435c0904ce9632ae", - "c1c5a471274623cf00eb59fb50c8635c3460c621bed77d5075d0e21b65466a62", - "0e6098ce9c9937bd6ec061618820aedc1a1282d4f86cc59e5562c57f48ace344", - "929a960ea0f2ba61bb0f50ca1e93be18fe3d05bd812284db7743aec24a4eda61", - "877dcf98ead6fa6e0f48522db1cd756c8f14245ffcfd5a13026a915cbf7dc28d", - "78c06ff1c8b255fffb7ed5784043943330825c306f51d0853f15ea52e869f102", - "2b2b05488f7ece147c62607bec0425e1ced4386be7c450e509f65b164030b025", - "3043da32cae95eac04b375a143599a9558d9eea51cc82ebd46cc178fa28654b1", - "c7897ef970a92d250a63cec7f6ce64b3c747d3fc9c9a397030ca7035020f2b2d", - "bba313974e00e85f18d592d29dc6d5610f9e7900f92530ffb46de4d436c2681c", - "275221ab9d4bb596dce0a0bb71e52b68ba06e953ff2dbbe103221b7204f2105c", - "586f41299a365547060f5e0942e3b0c0ee16a31dc9cb2bfe3f3addd858cdd6f1", - "426fd02fba2f77c97964e11a9c309844def3a3daf5bdfa4666daca77f6cfbf80", - "5ea0093350692486b4d83727256eec1a3766015bd6d357020ae597f2bbd58521", - "21d23263dd09886b0abca214f251806eeb08623cad0d9f6c9c47525681ae21c3", - "d40e77451cd7c907bbaf4cd9f254accfd59ea91c4b36bd48d01c0aa925a7e218", - "5d140d8b01470ee591899fda331b2559dc3c89409486f0bed42ca1c81f52ea71", - "f5c388d141354e0ed8a2fa23e0e449e6d660a24c4fd057ecba5dffbc11b5643a", - "d4c1b31fb0d7232ec2279fc6510b3566ef72e2a5e8de41edaccaa33cc9d33bfe", - "8bf27d43fc8bc0f4cdb37eaddb7679469e91184b440a06a794fd045c67c2a747", - "0b917bd1279ed4339570b527c96772b7ead5b418e3c198ef2ad9e46a2ed9553d", - "7e53aadd91b011f2bb98b5f506ccba5712123f18c4e6b9061dddfc3f3b541d3d", - "5f72b09de16501e9c91b3a1ac1719cd9e38b4eb246ea8a9c13414a4e958006fa", - "2ae170a8f4b1f438224767a02c2c1dc98f524b23066abc5a512072d966537ebd", - "b1780bdc2bfcfed530c1535cd7dcb506cef835e26053f83cc36077bca2bd12c1", - "c6384c08e50dfb2d753660997114e719bb0bc2927384908460bb05716ee23ee8", - "9cd902255d6537228e1f7c79a923fc16b235f304367a1a023582c347b538e325", - "2352d7a3a46577f9a0ec465d59fbc9b816726cb325f32d1ae6990e00f7c23519", - "ce83e57fe195e4660354610a17a988bdd383a3b6950381639835d59b4f3cbdb7", - "fc18c5625f45e15ad6890ffa9668db37b37a8e4d44f171e381659f4469c2c2f2", - "eec2f908f762ff11b82fdb25e119d79fe517d3297087f8907e89b37788c43780", - "766a8767e4e9dc4e9397f3f8474621da140944b7fa3efd6e4e0fc2cf5369573f", - "fee5ec05638af1c7fa4bf25fd273eda2d32df2afd8bd09e99e06f3161ef08197", - "81a05ef76fbdee9170af78f510b77cac0707139187a4e42c24aa0de8d8ea7c45", - "de4198a40d8775a3c3c9d0c85381f9c42aab255eace860e473b2d20975cc2e0b", - "990a785bf9c2424e47ad36fddb529871226dee9fb54fa2b99a34955fbefae1fc", - "4b7584b7322865d3f31a0decec0a58f45bcc05061c62dcf699647ad48a1a3da0", - "fc61f055dee05952c4b6fe60f132dc9606838fc6a754b34f6c13b638e6d2858c", - "f7f8e7dd54252a760316bcb3c06c01781b432c4a95050d09712ce5d9816188a3", - "e5289d695049f2309aedac3dd1569dde39c5a27657bf72a02f4e8efe907d1b3e", - "642afecbfc8f12efeb4fbb5f623d16b62f24c7afd877341926328037672bd6a1", - "caf77b017cb19d58816ea0012404fbffcddfd5a367e0eec2a9c619002603fcb9", - "cc4c2baa04dbe07b4778792f8ad019ded7ba8f41b33b4fa256bbc38a3f5716c4", - "9858e8bec649cd19ba78c9b21a15d70d1ea16ac36c7196ddd98a52f8208fde4a", - "74dc7e9a90f6eb0c782731a4b6cb80adcff10d5e85fc7ee653025bc707f9ce6c", - "fb5318c216f973e519cc5d8754f009572d0c29a43abd19c2edc2a3e63550987b", - "ec9780709f07691a5a237a5ba7c619dff27c0febf60b8c0b65685b4f47f50507", - "11c95220f19072cb8a5610b11ac7d59199fca774752a0b4fa6993a38207b5769", - "7c7d02ed9ad4c866cfe02ac2bdd701b74d36ed5237aeffe7d84ba50801c9badb", - "655be00d007795e950102642828a377d68eb99a89cf67e0c8bfe5a82d497aabf", - "4db0a272228934f3749a9a79afd63f929e70b07b97c5b3c9176e7cb209c1b475", - "0d599ee134741e051113654545e088aeaaffb5afe75dbcc96a8e4b6a942356ee", - "687f836950c2e08e2a958e715e10c9cdc3bb2edd93b14a4c338cc81066c43ac2", - "a81323d50a61ca776570dbe0f51ec5d693173aa3cc626a4211e3969d2d02e2de", - "1aa77a2b208b0d8f129bde1c157837b190d2bad440fcee18f8727e5d4422dadf", - "3b80e8eec4fc51929ba7499ff65f630a17c82037a0bb0763644fc03fe8b61476", - "275fabc4ede47457df1763add3cc1fda91bd1abbb06e659ab80b259b94f37aa0", - "5b867d2b12c003b7c22e7ade4bcd5ea2d1e6598907b1226503ddcb9433706864", - "c9998258ccd281813411d0c2ec07596c039d1cccb841626dbb34bb930d0de13a", - "e52bc309c59bfea05edd97fc439514c4353a3818e9333c39df48bfb236d2e879", - "479270ba0706b2c75f7f9c9cb7c2cb2fbaa29f0e471f16189a101acd4b4f9b6c", - "0478c537f3836ef38ea40604529eca7ea68d435617783b1848462ab551d9133c", - "7fe47396d1df79d207bf172a11851d5b48d275f5709f7ca5b745f2838f35f689", - "2062f6db2fba1e47ed8a006ee32ece3dcf03d510cba08d5cef21f470e8ef6b44", - "f1e75a552985965923548cb418b7a30fa78f6783a74401f9403cc2773310cf15", - "f7e0846b76c5f27b0038e1cccec322663d954160d74c8693de6ef9fbba40b9c5", - "087c587e37c3ebd966560f8658e3ff59ca02825497beb581ed6bb90d204daa6c", - "0f216d3bca0a52ab9603b9aaf423ace6a6f483870ed5164d73a0d45cd6c5e3fe", - "52dfb922923e163f38174d77dec470842237b94c87891bd32cd7b92e13271880", - "43147e9414289c29374de0d8d43bd1f4b64debe8b219058d199cdb136d08eb32", - "29f2eb107cf1fd64e3a3b34ae8433428fc1fca816e45569fadf4e6034220117e", - "735fd08bf2885de199ab060f4b90631c61189160dfd72bfa5a62dedfd10a4641", - "e923f33c146b662a58163f6cde95948f87584190eaf2721e1201b7a4d0cb22c4", - "620476808fbdf955a62c7c3887c0e1ed88e8558746540e170698f6aad8f79642", - "78720a220f85caf4d5df528dd5fed7b64672ff9372334acc506e4e4d8eb5fb9d", - "5e6e2c7781b662a07de054f0727eee96ac25c8fbd06eb8647f19db52c60cfc6b", - "35144f480d976eec74a40c1527960cc0adee6b80904bd495e403c00bbffd8ddd", - "12783f24c51296915ce8b72f8ba024692646aff823a034b263e9ca2629a71d20", - "d125afebf34e92bf8b61ff0a76e28a8be2177d5238606c71e7bebf0927bc9aed", - "ce88c00834f464b4f40c8d6de3ba025b607c2849d70701f9d31dc958b90ab98c", - "04d008a28c2fa239aa2d54151c6e452c217f531d48288f56e8b5a8ea551892f7", - "a640218ee900678b91150a229c43d743782eb7db088ff8d8ffdbd17833cd4b32", - "b796b549628f0e3daeaeda015ce44a15ba7b912ca59b03910a85150c96611f5a", - "86c9b1798d5625b1253dba38db0d3bf9a9bd0ea5d84f7e1530b13216fa3777eb", - "675acbd8cafcf7b225527f187628e649b3f80ce3882e0b7390b24bfd40d2c093", - "026ce8768f3a7d733229211c9fe8da990bed54ab31cfd53892c36d4e6036f11d", - "e872729fca41945a677d183188f738880fc00fc89c34fc385bac3e569e074101", - "abdc7984328f370149d9ddb5214b78d19d46ab53c3d1731faa025248577f16f7", - "a09527c90a82368a8816b3c2d7c759944f5c74008e1ca675a58a7091f34cab15", - "780771bcce28a5df83ffbaf8265dd42442bccfa4a5c095bdd0ae99cc8f69a00f", - "4567bb1e50136ce028c72547b248ade23931d6cc5fc7c6e40ec498b47716cbc2", - "2d5d403ad1045b09e984bc9935bf4965fff1d41476bf51a464e0c3f7841beecb", - "d3a95a5386ee060cbd1ea6c8925b6195652c0880e0b80c5ec36b310918ef0cab", - "8c0d0f66981d3503ec7c0bfaaa6ac38fd47c8107f17ced78a08a7a36a1fb5e50", - "cce422dc295e0a27831c707c39c336d280dd156fa19a55e6a8eeb71999dc2ed0", - "f15062282862b9c08c4694fc136d303b526dfbb8e87dbb0dec4bb6e5b88deff2", - "d1a91e03f2597918a3ab4eacb880db0d74dca9acb4138bde5c51e76149d1a23c", - "b4e52f69522d0474fdc08e19bedffb23bc321bdc053f69c34d3954c909a1fc01", - "a8247fab2044c17516f3ae4c98fa2f2ca542b8409c3b2883dad93dd1ed5cab57", - "f95f0d5a16b60cdbe6422590a7adab0e2638f24150bdcb6dc9d0ce7cd4ea7cc9", - "3b8c15e640aa8b1350dbc1bb0c308abbb4480ae4bdfa0fa02f90e44223097811", - "aeb1aa1d46fe20290508bfe1fe84136700fe32123d60906b6260a43214816e40", - "9e93c27a52382ae54c8ad8542d25836e2035abe0e584fc390dae4aa0ea338e9c", - "2d97c0b429b244ce11e1d4e5ad0b37c10194a3e5abb3eed9d4bfa841fe2b76a6", - "a74bf219aab42efae0c42fd6e833db4befc95236156be3175f2fb4fefbce5a52", - "e8c31bd6517cae247289425dfbb1de21b4d94c69cd010189e4daa9989153cded", - "093511830dc8e38ff82a7028ecb6f2ec7e4ea33b5701a33d9ed731c8da87d28b", - "60e48195b13880093e9a474900c56d4b9515835f078251bea7c4ffbe0836d9a3", - "1df986335c2b9c688a7f5c860c8f3a22d4401b92ee316327c6b8308015e16529", - "255541f7b02f733d2716a6afabcc86170aef572cccc84f9a55fb0c15af38d799", - "4ab478c18d0ef70b71973879f1fa6a5732daf97ed3cd772e36dc7de0309d1f27", - "66611598ee7f00086cee4ff2b6971abfe80c6b90d23601bab2767f879b7c62f3", - "181503e6db978bdbb26c5f054af0587bed71b179419481837b7680f8e49bccb2", - "c5b8b27b002db8bdac6136655621ca5f8bdc81893f7641fc9f017774a01616d7", - "5c87996ee9729cd44c544c052c9ec1987ebf9bb596e28068824352648e2498e9", - "5e698c31fa09cb59356e9a8636e254e78e1c4d35234331da65860bf591519c2c", - "ff456bd80796f31bd7182c31fa2f07ee8aceb81f34bb0ecc75e5122fafc3ed40", - "98696f436ec47e46c10b0f4a750f577e3636638a9c13b501e0150e461b9f4e92", - "3938bde9b36449fb1ee974569f64bca7d4b3eb8e2e4920dc9752c8635a73c655", - "7fe593e712b75b68241d5b3a97353c5eca9fe88b7e375b2e7c5607f075a9568b", - "090ff232b58b68f9f628f9732e5d4596014213600f9e95ce376972812f58ea4b", - "4592f55331583ebfecdb002375394d965a3a04e082a95a725c95953ef50c2913", - "c758b6d951e5ec988d018253ced7764509ee5053b1085360e6c78f74320a0030", - "e02d66329e6019259b346d7849722c458a5bccc4dd6ddcfc4aef6473bf2ae906", - "2dca9e14e142909e4b9391a63085e396e5f8e1fafa6ccb5a18a9a77cc022b94c", - "18b77493c0c8a357b02a4b7f85d8f1e3729f56e3bc942ab8421c569ddbe012c8", - "85ad6386b90990e6b8a6493ca6a21b53ca7387f715d0b1d6aceddecfbedf7215", - "2c03c0fc4d7882e74f19cc18e830a6d96e262e899017dcf176f43f8d7696d300", - "1b63653491ad63ba09f1b84ea19b59b36b6a6e31357b34b6cb3537ecd42076b4", - "5d2c2b8faa4c9a0b239d042afbe8e5fe756836388f9da88f9f874970fa6fdba3", - "346873084c240e3486c58affa416649a483787919809e4dc19d77e4945b8b91e", - "56589defbcce0f005aa1c98896f7848037d127621d47b2fbfd03229d70d3c740", - "e7ea574eb1cdd5a7abbc67171fa37e9e7203ec75848f5b6d58b645cd94088768", - "4f05b3a569c1ff0c5e298967b05ff26e267f8077ab9c8c3b6cae7637c6bd8cad", - "caf58fefcb4c19abf8c19642575b1b010a7f0fb8e5cfbd49059ec82297c393b0", - "7b6e431252147dca67ec700b59af977ef4bb35d92ad76af5a157b0a0e987fd32", - "5bc8c8367ac586c2818398bd9af8d8ab9c80409e7bf22a44be19221ff279c547", - "50e1e59dc390d21333cc0797db0cfed559ea718b46d5d0b73537d8d0e3b41255", - "d3a6ef7d3d96c09a13bbf07f8f3e21b8a53bb8064c484b78ef8e48b9eaa9f123", - "9844342d9e893e7dd19ccb4eccdaeed3815e20f5afe3a5c735f1eabe446b45c5", - "3735278a9038bfdeb471b53e83206b00054e2ae62231027424d3d85292554823", - "85dbfee14622f89d6a203cce5395c6c231b08b064cf3a27bda80db055d2d0c87", - "cd6d66e0b6b2aa1d801405b2b48656a7080068269f29b781b1642b584da069b4", - "d9afc8f8f8658b482751c5f4ff5ab167329f8d8f2e918c87bb1f9616cd43849c", - "4db9930d3ed35f4765cca09ead6e32518e4c36b6211d0a2afc5dd8c720d434c2", - "df4f27c32806da3c32a31c829c389bbb2e1d30b427c06183ac42877bb717631e", - "0468cc3f46c07ecbf1a639600fb5c3a8a079c7ab743e5453d28b7417488f5f95", - "ba6a4f21d62cbeb55240a9c4dff6be61ee9606ccda4ccc7e6078157b2e5ffb47", - "ca71cd1e66247a0489595adc3afe5877d2e4f712928a57e3bf90eaf350877cd0", - "15bfa0e044cbc97bd184674b167fbbad233794e8b65d145748ea2888a6ddac35", - "2b9e378ba011e0c73da0bc76184d6f947493778fe346badd6c2ca7c36306227b", - "6ec75bceacc88471b4c078b3fd819e92d7b3a3eaee2d93de72acf2d821e8aaf2", - "cb2c2f274d3c36bac1d4013d53c240b5044de818c4b7c4ac8e9c4235612b39cd", - "e705ba0783725305e6b1e36f7ce7cead71aa3043abf378f686746f89aae88562", - "65e5efd34b1852fdfd6b384ac2b626a5748e0a547f70cdff740e2c8f347cd2e9", - "63c63014640d7681eba4c45f96565790d45354f4baec990e34dc6dd106a579ca", - "bad60cccf9e77d4e04bf3ee38c4312af7ce9e78b62e2d4cfb7fe3dfe3203902c", - "eb9448d7cae7be1103846c352909ea4b00f62069c9fea4ce5ab71e6c51ba3097", - "91ba66a1e970afadd56512f5ce56b148fb7750fc0bff28177314c2218b1b63d1", - "0902e7da9bc50a8034d176d69b8ee9d9da9671caaeddac2f95cc40b1c0001bf6", - "31c832236eebeaf62699c11c6ee01eff91d885b727e8f72535c9e12e45e188b1", - "acdf65f5e2ef0b4308f9a958173b165da79096c363ba956a93b4d2a0da06aa10", - "b6f0eed7d9d9f313c87b1e4861f794a22e11d74990be5876a2bf356c16806534", - "ba8294c2e50e6eeed5002cfe809ea85d212b2c85c1179d05b56b306656d2ba12", - "1b1da5d0f8adfb94c4babe02102e7fdae874cf8fa61ca7bf881db57c59e41b5e", - "1585bc919f7273ad192c5e8650d775f218ecac7644f00a3220369142c0810380", - "6f1d6136e20e7461399ca88fac1d8f968cddceec259462f5b5f7fcc75e90f895", - "531f04d22e1f87d1631ce1807b172d85f46d67ffcd60c44f4d1be1719743c8ec", - "2f5c83498ddfaa852d195a67e40faa1a5a2e70d7eca3852ae6e10ea665f97956", - "ca68063245aeb902780e503ea8c24d1af6136f62383b4fa38e0f24c714dab942", - "0b533d3e4884c77fe900ecbee95021b7466cb224beceb599eb07639b4feb320b", - "c253f2f50bcdaab9535aa974918f9dfcfaddebdbc06f1fceb8015e9446480d90", - "3d96e68835fba37d7326de172f8b5c8bcfcaa50c93adda29a50ba21ec35b5d64", - "60e222eb4862a5c34f92bf5520753a9247d362d1ef84cdae631e7fd1723e2924", - "06b6a79b63bb1c63d6d14e8ae01d6120614676371217b62ffb689396288ace0c", - "401be614eec654ef5bf23a57defd6806b23a94c97311b73f64a02f30aa0c2e15", - "25b36e57f2cc4a42f5fabfbdd3767c28050435d64dad599b398b13a6ffd364a3", - "3515e28d494ba6f780d8b21961598c915e98e04652fd9f13aeda85881bbb84b8", - "ac0a4809d5577592de27409e3544c8a27e0f34e02d0919ceab2b10d3b062e166", - "8811ed9083d429ee33da62d2336aa568537ddcc1c7e9c6b41b789a7bfb7e21dd", - "f6c8d2d6c1efbb4abb07f30f79f92e1bad8801d5c4b8ffab122d071e85bfde31", - "7748ab31b1ae652027503955a8a537773967a95d38b2e601434bfa214cc4be4d", - "619553fe6f6fcd287e8284a79c23ca9d9c95ddc92aecfedbc1f24d4c21e90b36", - "c01b0a0ecd99dd0470c39f623c0931acd133e7b8696bd56277f20b9dc1ee4bec", - "91c340cde689d9f51a692c6669820c648745402f80b9079bcc1b9656e67a9b9c", - "68dd8ec0e72814eb2c6f0404cbbfb9a8597362c3c76102e926ee1eff27d37377", - "76ffc41642b6c8158bd83861a231cbb7cec2bdbb8f4fd360d1dcf5d9dfa2b5c5", - "75ff8c1c91c92a72009077fbbcc13351c30928ee6edf80a66d54285897010bac", - "31d850fd9b7caeea151d309fd4e06491ed01c533d421045956cb0b28f547d665", - "1776d74a31092600fb952f95ab3f0e8778daf251662d1d0b8e24cdb46066dc36", - "474bf49e519c56c512f25b22d17592ee9c78f8d1d60be9526e797feb8d2fa40c", - "82ba0867a024ca41941ca282113bdd75a69a9aa7661f81109603b2754b5051e1", - "5adee3536671df3f5eedc080ab0321e73dcff67d5e422b7e00c80797b7e661b2", - "56f27a7abed7ed7089ceda132885b0d10c4a4c68b45bc52e6a7c953bd272e968", - "d09f6c5435e546c1e48b24373962c22a83811a24a510bb01c2601151bb4a6a0f", - "2c07dbeb8ac7a84b70241319dbac746ff117540c7218ea60f3918897ed702116", - "317b35640848479dc7879cd789b0834d7218ca6afcdc9424ad3df8dc90aad066", - "bc5b9a28b396dc686aa147898b27a20ba9e601f05fbea17685384bce9610b160", - "a26772c289980d5ce9a36c1dec0879e9b7402cdcf295e3a80b6148b210f5b06a", - "bce211a677179916235b7abebf41c0e97d7408ebd25f37747df5d27f037cd6ca", - "a0a38cc681fd1aa128af73b83663ecf881a23e3b27c3fdce1b155de646a423e4", - "b0145f25f1d8f17b0012419461f666301c52693b514c2de5c52ca313dcbbcb98", - "a67aa19c7e22fcaeacdaa85bd4b635f3f2b8c868284761429a81bbacdfe98b13", - "509dcbdb595f8842192b134a2963187ba0c247957c3dd50f2bb6fd3607bc1b44", - "35ae2bbf29ce7223d7ec05a90b8c0b69c106c96cda89c25e626c9948e46d5d5d", - "e64f8f7781d5fad1355725094c34a9b2c562d0217c1c7ec6356dd71cfe1e9622", - "6e843cc12b72badf4743de5d77cd8b5ef89e398f4084ee5774bb75ce4da84580", - "8907a9b968e95de7802f5c9bbc085a84c57369c36b35e5e7b5fdb25ef25a6ac8", - "ded6ce93a55ad2b6b761f89b09324757c1568afee38a2682245d4e8bdf8698ed", - "3d38ac11d1cc264bb162c2aaa1c21d8ef96b27c8901b77ac0d9ce8e9d6d4ca00", - "6bd0d6de3574c351f5cc5ed54ea27280bfc09d8bfeef5d71780949a888482648", - "25c64b2deb0fdfe206a140b1969ae93c50350a9a344f7dcfb25a0784a4349483", - "33a435609cc7ac9217339d06a4667a1c4b99e63cd895dd7ee8eb11d47bd292a5", - "fcae5f647ab338b91fae82cc450a92b9b59773c74a20578bc67a837ce7cdb290", - "ba981bcfcb7adfb4f5e051835ebcf47e7c87d95cb2c4b7d6d98ecc25cc45fdbb", - "139a38d567472bf21f190696b6b4be86324cbda7fcfcec5aaf93db2cc124a9d8", - "7fb10306dfdc1783856b46994d84c40318e2c7adad267efc50411578fd9e0594", - "3af38c453ddb38a232b101cf18b3157e914e4990cb0c1b765bbed9104f482fe8", - "19bdc6cf9b432645a2754343553f84aff7eeaba3c9ebb0e61e6f05e1345ea997", - "9ea4f784d3045a9e449b83ec1b026483318b44266c5519f8e5586cd962fde203", - "b45ccbd8a57d9191fdcf4c03639aecc58dc6398c03d1769b2c94f196937121d9", - "585a4799730fe259952c52140f107826aa64c4767fa5063abd5ee4392129f659", - "28c0c7ba929e141fcd4bd83239bfeb2e516aeb51fb1990747ba84ccc46bb0e83", - "ae743b9c488d59b88842513f9ea1e2b1c7210a02b8520d3b15721fc2dd6cda00", - "8ccc5179ea65c922932707de55469cd0a940ca5fd5f075f1abedacf0732677e9", - "1e4ff945f00928aa9d5476cb0d6946eb5ddb77abc3f9cdca3d3d090db7e0d52f", - "2a98d7f072d4ec1d7184d2fef8e2d2d3e97d02c409566d52519fbdb896afb77f", - "9f84046ff7c781a6e85d56eea7750de1754540c0f3e886542808fc3cf3a9125f", - "fb3a717e4c83205772eb61d69bcf878acffba1dd7ff04d659c090fc13693c0e2", - "e7ad9dba413b48635969458c8a48d95e53488a64142f3ff15fdaac5bf5403bfe", - "eb09c08ee17681c42ae88e82ef1be2a96fe08705a860ca55a02da3339ef04524", - "0f010445bf28d48b1ae7db4c9f88f06512ddb3fac74e1e5b475ef9b0074981aa", - "89984f47181d3110d93d34f6f612ee92c6add5dccc0b11bcbcf27439b28ede2b", - "eb0a7fb509ae44018a76150fde493dc411efe6bef9e5d43a2a36f94bf6ec96fb", - "556ce64d6b55374179490cfeebea567e5317c5e3d073666f52b569b5c49444c2", - "c1a24f877cda3a44420b8efed70c7328a81346a8084a254bb9e67f1a14aefcc9", - "c5d9dce048fbdf4bfd3ba3971b4f09c920ff6443da283f940537f09c2babf95a", - "4f51d2361b8c2f7524f42c17527f409c262a03fe0cc167bffeecab1b4b5f8e86", - "41f23c0b97e877f9454c62015b5b1a74e1de2839b8e5e26abd698471062c0324", - "25d1c78f5b70031dca4f8a6861d02f54438ba1d98a9fe14c3aa9010461c00fe4", - "fd0d835b6247b370d78ed278e0a707d645826a5716c117a89e2f79f5f9365e4b", - "dbd3650e78c5508785ca7ccf55a6b6d887572e37205d244cceb1c1564bae22cd", - "ef83ad0f249332af60852789628c7630f056bbe4a238d4cbb4028f67b4b5ca4c", - "958bfea80676fb9afa6675207e63c7ec7c2d9adcc8852f0328af0f3c22b34346", - "5c6fa88cb742dc69463a10df281123a0b88b877f16b9652fc78b35b427a48887", - "cf2497a8d3ed84a9e57778f592be07ee0782287be17d2377682c04e6af4b0582", - "0edc3a513353dbd4b1625408f016f2b4b219d5493e3fae762b57a28a271d94ae", - "4c8b8a7f83816c0f1adbfbda606cacf0ad9c753828162c453fed8af605b590b4", - "7c206111e982bc8835eb9ba9ae4b23811bdae10802434959d2c7219ca5c9b4f9", - "c2768c0fce108fbce3d647bda8f86d340e6367bbefc1640a6c6b15d4a5313b38", - "d975536aed561e4d5deb39af460f6ca276a6f392a87813dc062cc81fea11dba1", - "293c92f937f8c88089b7b32b01d99454a3689f9605668cc6037506fce3e62ae4", - "bf71926b7148904fd4cd85cf4631dfb48c8ab275b4ab1b3a1550b08c7fc57ddc", - "11eb3b574e41cfe2c5a008408b5687f6abf75931a26032d219601cedd6104eeb", - "c6e30bb406438c97e57e993e1b6dd42c95c9053432761c9823f570db1b5bf9df", - "e034479144402f5649266d7a08c9b135926f61f4c633f7996bad30ec4b3dd4f7", - "5f0c7c4b3797e7314fbccfa10d102caf8a2cfb5f9d5c4d3203a799c217346113", - "c108eab893eafb472d8cff147da2ede580a53f65422c0a19cf39613f02d2fc7c", - "8e4e5357f766f71f8290911b917c75c374df4d329fcc52c992da22914dbb31eb", - "c2392140a76247cc69c238f1d04b348fab139bb7841163073d2c1dfe1bc2df98", - "0348afa17da34c05bfe1b41fe6a5c7c9d47e3f4dc8daa6c6bb10f9b4214c594e", - "a3f984c72cca340e2b59ef09348df3b4d02ec4779f799efa7d2659ab62120618", - "3f7d2abe24b3b762ce8912f2c42a1d07e51c500c77b5303200ae227cd0ee59f9", - "a1aea358fb28306e8c820e25a36bbdf7521dae054f977797ed07743fe245fa77", - "2c0bf87e95f01789448da2614e9b634dbf52f1a8db73ee733994fa850d18d148", - "d267a9f54e96d2d8c50fbce2a782e912d9f312c629bb0378ed0ab0eef3761a3b", - "a3d45c5210d57a9f561aa4a64e018513ca2fd46cd534216bbcd943575d091595", - "73ed848ff153e29420dfcc29462398ddf3b4c6c7cee3dfbb5bf1f4f6050ede5c", - "948cb901f32823b34638ef25fe10cf982b742694daeeb1af1ab3e694db3a5353", - "ac045c229eb9303e511df0897371218c89d167431c837c293d1f33e43cd9c947", - "2ef13a1c18136ae7dec06fb799c3e9f36d37fc7e22aaa19b490d4afd9082a349", - "a769521991fc841d5a83f126639ff1e827ad6ca206479f383124728995e37684", - "f4682064c53a1b0f3cfc801fefa165dc5b9a7e1664162602aa12d75ee9fbd44f", - "3c8bb9ff4b2ec7a35cd43d776d125e829942b9147410794d1eb301e29d3be3e3", - "fc61fd792b25b8c60e2ff7c0befec6b7b740bb593d9a103452c7807ef2c347b2", - "939e28fda2724a2bc9b74216baae71c64f08b108976dbbb2aaad14d8cf2c3685", - "c560fb36fd6c14e8306d09a71f2e88ef23f328b2191d6651177b41f533dcf4b5", - "3f87b5c36040f74dd051c4a2bfc6536232301c012934c73bb707bd492c6ca291", - "1482b3716c0102039429c455627c3a7d8ae742e9340849dd85b942fb359a5e42", - "9cda926ec95f464ea2032a64b27f8521d5686770aeb451529a1a62b8c05971d9", - "a603d208d1925353c097e1eb4723cdcca4f27178139932c1a610de0009122192", - "45eb515013728e9132cbd5de66cf36b8e13c176e838fadb7892b577668b30e6c", - "f9bfd5dc37b1125d3d51e8a401f23b3751b87de07c00bebc11f6d1b4ea08ef3e", - "1c2413faf5090c777d925d5ba0b26383bc8528647a92307c0616bfa29c86e612", - "b9fbe12453d824b0dc2036ae32281471234b0ef262c65171aefd2a126776b000", - "6767b3cc8fe374d6edb8c634e645d1893c3c7e6c91c7277414a6d3fefd9e9599", - "858c66fec9e468de11adda28e2dd71c7508bb15ff9f0f0e438c2762b73721df1", - "2b7b01e6c421a7b4236447ffd6487e6f39eebab54b0f28a53ba42fdb2b00adc3", - "0b0d1a0115716c26832e18bfbab447c271aa89ff98b13f44598510a6d0b10f1c", - "b6eac56158df79f92aa696c0fc78cec52de8f4d9d5fb7d11b98917e979a42a4e", - "f686491a596aa02b4f7b81bb476e65488432431b10864c618612472754d8406c", - "803d8b28c3f44393a59032c704b6b1b20276bd68d40247dbc5899a69d65f8a2f", - "a009a6a84765d5e86ce1b2af68857daa38ca5ac684db67e3835f0fabc7894e14", - "aa44718d8695ec4f372bc85a7087e2fff8f597cf56762661770f5ca3ad3e9cce", - "b9cc405bd01149d45c2eab9b2ea949968c2354e7e3f887276cda59adbc300791", - "ef113cfdccf58ad9536a6b82acd53e2547695953d9254f9410d55d803f2865cf", - "c7611a3f8b5d409ead35271fe532eacabfb53dc17cbf65c7d9e93bf3e5d3ecf1", - "af806006c6a41e0f4a24d2667c707292e6b7c35b61c27aad88d55ab03ad49df2", - "64b33af4d9b79d8bfd797f8d009dbcbd1f812aba16ead233801064fdf0819068", - "a9e16b8f4be37e32d8b18f3a32ee25afffdfdac7d0884f20d5ef783747da5a94", - "5598a1ff671a4a45a388ca8acbe3fa21af0d7acbba609b8c5d72576c2ab4452e", - "7d51f9a03ba748102ec8ff8a0783b6f69bdc3ec90c8144f9c516160cb0fac95b", - "937cb77dbf7f078b7d481bdd244b438685e70134dc9730f7735210e2a0295e52", - "0075b3a723a2747ca78ee2d7fb02aa1b6358ce738b6c6769708a197e81f3a753", - "789ac8baf82e7f76d0faa67092307c2febeb553a0be7700591969e63eb799c99", - "70805534080772b2f2283f85dd62324f7a6f1f8820e4c7670e5da79ae5bad372", - "977917626f8f4fa38f1d48cf028678dfd33d7c9462a260f1b1aa3e757cd7b535", - "8409bbb3b14f891f12c997617c7d85a922b29a285a1dea3a1e2239d5527df935", - "4ea685019ada1ec1989fa76761bec7f6e1826fae84815c7ac4592d1e4f113a66", - "79ceceed8d23fd2484f0bb1b7d1feb2efadc02c93cac083114b8f342957dd16d", - "f834a449d0546aa7fdeded09195ade72629f99aceba83fa95eb88f989dad94bd", - "ce559428ec13be3b4b5dfb1995118010863c234cf5aa23557a6fd4932ee1c858", - "5ee3592fc651155912f8435ce0dabe8398bb73417f429c96b9c0bcfe53d29592", - "09d1f3e6f5c581d7d7112b9d1511dfd36b4129bc5d42655b41dda0e315926bae", - "112826fa9b7d141d6d7aa93ee48d8696ad7c717ad8036f32775a1728bf8747fb", - "beec70d607c2800c92bc3ed0592f37b3a68bcbccf6642bfc4dfaa1a7807603ca", - "a37b31b2df8b1e2601edc15ed5b7bb356625adbf9aa69106183936ed6ad9f43a", - "8e8f576bc3ce8b47774a27b22154fae63e491494d7a0cd46b56f85f0db2ad857", - "79a074aadfb58b02f911f9c16840862e09e7c8fc51ec4a6cf96a7eaa8acca5b3", - "63450bb34f0c6fcb842124303a212fa97d078568ac3474d1e47fc64bc06c7a4e", - "71261efbb440d6e5b483c91d94a1e3bd9c3324c2d05093e411695284565eb03b", - "8a1fa12d6716e2b52b050007a3563a21287a637bfb170713d6b182471c842ea1", - "b8e004ce47941348f3702f0241da56d18ae90a4eda21b4fc473b309b40ad2acc", - "56d0e0c9ae03d3982ee311486123d76188a616c57bbc9d174af37c2edae0c315", - "b054e83af57ec639ce9f7099417dacf18d93d6c671f2859edd2542350ee44e76", - "9501b5562f0fa1120bf9aad5133c32be7898c55730294f66cb270759c347a23b", - "6142b0972616d95f89febe61a6c87a5bb44d105838fe774141f29360aeafc888", - "4dbc58f99906fec865ef1ddee046c22be90e9d4d7c36a5acbb0cc03aae66189f", - "1a449f65d7a76869edec53ff1bce02fae8e54db283c9b02f7e4068fb35d223a8", - "bda8f1a70ba45e3815bb847c12a1624e286013f5ecc2dc7f456f76a9f97ffd31", - "ddc71aac1661e743938e0024e50bb4f549363e7cf0ad7eb9b8fa5f5dee6c3e9a", - "a14f756b6ee4942bdc7b075029267469a56ad6ebbdb060b1bcfc020a7583181b", - "0e6ce51040205e78138fd40136dbc1340b47aaf72bfbbf228acd0e89d9e43d98", - "37ad507ffef65579a3dad70d46ca76c2a7731794670c106d1887e9931552ce60", - "2ed1fbcd39ff3c4bbff998a449e7b71ec156f8827fe8bdb6ebea7a2753b4c1b3", - "99350bf214b4c462226043a7f2e0bb42883f27fb5a89277e75ca61f92d08b8c9", - "f9b3a7e2e9d74bd619af74f0296defdaba33cfee91392e24e68fc39b2f2e83ad", - "c1d24d3628e62a64a0ef8c1433ca20652c8729fd284f71bbfba89a5419358f02", - "21c1ab1ec2256089020e7a64ea832d5079456645832183f84f9e6a493409074f", - "f909d4426f215fde43ba13aedce42e6cb82615e18d67785df0fc299e249ab875", - "6f0fd76281657dbfa35b9a853f4d2fc9b96b46428132b646da9811ee766de4df", - "4d2cb5b607fc6b4aa5e0ab28fbf7e1519c520109865f70faf8c951ec0219168d", - "9eb68b0c43f58705b38ce2c3bdec551d4e624e145f4c86fcbf4fea12a3632eb7", - "135405ed14d620d5ab6840b19021fadad5e8209bb69a4308bc81a6055632a0a5", - "07e27cc482fc6b10cd2630a4b69315704b84d8b2ac1366bea452533973fd416b", - "a9402395778fcf033a5592cc4cb164a53a2c8884d3c78d46f57fec17b59db2eb", - "4a3c657d27d73539039c9f4847f81bb02dfee95a25353e401c9e29a0062db6c3", - "f711f95368c2abb4479666a8900262abe5671b438d274adc6de3b48bd95e562a", - "54f4520f1f8d8f3f1df95089b534efe62cb05744404e57ec3ece6be0ae4c7ef5", - "96b6479f409af2d0552974ecaed5effcf02f5c08ddcbd5a4e38a176eeedf7b43", - "e032687eca9038e85b22114dfc681bcc125d7f9b31dfdbd48fc7c5f325936f69", - "06f8b0e05c1c3c67dcd9fe1a3e9547ddbc8db6c0d7ea134086b3ba90103746fe", - "79852e21dc021812edf7c7374a909ce03aeb162c91a1f9ae50c5f0aca4b87717", - "63c3f65b570045d96f3b2a5e2a35ffab49f36fb703b7aab1cbd22fc833243131", - "27170ad11cf4dc1933835c9b21b79c3c9d574f5e52be92a6131f708c1977e5c6", - "62d9ae4d852bd507e66e0d06a65430ffc63182679e2cc080f654a2a40723688b", - "6b06d10b8ba7c7a19c7653700f106370f454ac70410f470e83f97d5fc9f09e19", - "8290f166ecee5eb4048b87030ea3c7f9b11c782806ac4d282f521b78a87d7ffc", - "bc83dc87fd828849783c805a37fe236f97c25b57187b0495e9847cec0861bb4c", - "e553b0460ff73e57e0401da7c8b825a2734351c83b1d39f358b38b8993772a67", - "09281a6188217f4962a958998d1da930fdd48364619b0e3317577ca95fddf681", - "ea6af2fd6e1f3219b026dcff04f55f142c8bb6e892cb88e3e56cd724362e4818", - "e5acb5da68571851e67ec39ce6262c01823c2720e375e67fb4fe14b1e107fc1e", - "d18446ceb6060f785c19b9cc9cd434cd2aa92c101e687873f56e7d726413bfef", - "02ad6995649211c7baf9d5efd708ab0b5d917d050f8f5540f9fa1b46deb42ec7", - "ec7a23a113dae79ce9aaa67ed16ab44ffd8c5166a308690bfe2c83c407f42275", - "b1b98a398768fdc3742dfd05745b4a6ef96e84dcb02d6f4cb61bd062f699248a", - "588adf622c7ec7edaa52b86e1c1c33f965ec852dc06d2bfa99daf6e5e3595fb9", - "f5739a46d9cc52d1e51afe11f351b909d7c24650ce6a6a8784bbce5616e0ebf8", - "6a037984c93891985f44cdd92b7bb2b253bb06b7c303ae40e3ae6ba50f3ea455", - "98275ed54dde6993bb13d1595df4cad2b424bd4faf900d070b93d5c56b3b9a64", - "1672919e45309bd089b98c9f8cad478b05f2e8b963b8a3092371c26253faec92", - "c2a880e0434601c0f88e66e704cf9c4c2631580b74cdcd650044e0274881bfc8", - "bb9da092640916b475634ee851e481cd48a91496521857767128c38960d6e1e6", - "ba313bab8a5e78d34b6e24c87253b9d3c1d6bcc98c8a489d8c8e573050674599", - "7327e30564ba2b445f1f4beac583e57b328e7d139ee5aaf3e02c5fafaeb85c4c", - "55e2edb00a034ce35e881df270aa3788630a9878a4f5951228347ebc33c362ba", - "95e742a4c301d31b5624db09ba8a4a185cca30c1a86f31a0701a652bfad7adca", - "dee288edd4e10b4db221bea39495367009c4cfa36753c5653a0e2cb8461c9b13", - "13131205c57c7fe3837cbd456e43b5c8b81d1d1eafa20963daed2bca3482de1f", - "62047c361d820e1196c2a9bcb5f7ae4aff9b76acf483d72d03422aee24a707e4", - "2d9b5b0bebab279924a8717a91b1c72f35e7f41d7490f77efe186902bca7dbe8", - "a8cc1243dab9fa1f8de6793363201a00dbdb74fe5389e93509ce532ddfbc7952", - "ef3420b8d0aa5c33d7e2a3bbe73b93b22b86eaad94e9dc19c041ec3f4e4dcce1", - "659d3293c5877a862c2dfc2e1a43a4a4004cfc3d16d0da91f6f4924bb9914168", - "33fec90129f5ffb31531df0488f47499b6fa4f48964b3f47c2591c838f0e6fa1", - "32664f368511cd24d814d64a99e9242515ef53dce533d1cac11a4552fffb4e5a", - "41d4a1d65b148c6f4003e6bffc9006f7712674c1bf6fa4c95f73b635516daa5a", - "4f02527ceedf8733d1b0ec567659c082d6ab52cf277fadf3617b868193c5c00b", - "683316801e1c96b1b1c15be8dcfbd5b8cec4acf7160f9e996fc7dd27f3a501a1", - "9a3fdea7472d4bec4d0cf3c382dd634a5d099a2fdf45ee6280c1b1a2a29262bf", - "a84a618cbe74744f24cf12d1a40187dba1b470175919c15950a579dc8e86a73f", - "89470b08558ff49a35651f3e65b022f0afd8fd0ea69dd852f7a18c5f3135b0ba", - "51022bb6e13b237f2e3ab96e1ac104bec56d0eedf0049f16e0006a33cea2fe28", - "a1317f077638125febb859cd84e9b67d4c01947897f0b76b0855e4ccdc5f3e00", - "c92511377efe991d045a19e1fd9eff7426dda02d019a0b3ffc04a4448c6e829a", - "b4e789a7ada39037b7d31d8b78837c622097d72f193deec1598fda3be9a287e1", - "f48ae6f214e0e461778075d671e101a4b03b6811cc7d96f31283a9a073cfc0b0", - "20bfca35ed4f04b5829eda9c4af6796a2f165b3fcfd7d652141e4aca45499ec3", - "db6f1f403bf093ac65e7bef1b40266968dba800a16413ff2df9e68b2416261c7", - "4d814f62765b1b0f44509cd4c6a590de4113ddd4631925145aec96fec63cd203", - "5bea3b1cc8b0301622f4c0785afa37a317c8f2a93137d6cd0197cd953aedd6b5", - "493d78e1f0824ffa2cc693af00503ae5dec4a445596f6f04a15413c6f69fe30c", - "c55d09ddbfe8ef89982f1c98b9418e6b8a185af8f3acfb8d243950de158c9a19", - "ab1c4a22bde996c5cec7eb323afdb26a632bc4746e8cde8ca2920e4af11204db", - "9636dcb49535894be913d63856d84150e1a4756f01316ca63f41a9d84ac87cad", - "829ae4aa056870524cec65764469da529ded405833dd301a50d8847c719e9bbc", - "79aca3a7ebed34aca350b60b7f4ffe7c0f24ef572a0b31dd3bf9b3386564f863", - "c48e167a367f881d89d9976a2d93824e2d4c0c018e1b44ffc5554f1b015ce0a9", - "7cd6336cb68d840483ac68f930305abf82a33e32486fae7262e9b321cefec20f", - "88bc525c3560810a6c0135403bf3c09d8783502a71aca0e505597ef656da11a1", - "843224526a65e68ce239f7fe26f0d9a9e2c6d36d0ff047a2e94c44f8d70125eb", - "31d39a5c714445cb09d2a06dd1cd305164593ef6dc2b2c4e74f562214049b40e", - "17ea6d5328788f2e7fb577c1ed78ae12e494e7f9af74b48e508f67a352934bd5", - "1913cf215cca8e688823c6cdcd122cdbb822f25bf73628a1e2f16746556a3000", - "706b5fa9423465098d3e03d4f8661363a20d61d22efc58e5ee52bac820ab5306", - "64909c381e6d1d8d2b87d55fd303dad840b0d3de8a05f92d52a5c70d25eafc65", - "a37eb07a1d5c3fbbbce650fa7b770b78d364f7de295d7dd44e997f863577e651", - "1211a9fa326b12a267b1c44fdb00df07f9004106b66507882a009fad0999eb61", - "aa83b6b2c9e0364996edf0f6a111a76021b7055f1769a00bb1ffc6ff46ad0694", - "301de9c84baf7d60a075388b1c4768f72b71a87bb38195270e28284691ed0654", - "7873eaf1b5f7e31079c40678748806d936dd83ae16531dc67f49e5cc30681b36", - "bf68f4a6fc503d74e057eb24a0c4d28d097c034ff69c8bc12f09250a68a80c52", - "dc2a92889a481bdaac5f4e662424c16f55c9928ffb2fb8d599bacfb40048a795", - "81a6076bf630ef85733b15a875c89987b690bd1bd79ac067cfe60cb1c2871e12", - "215bb121e96046b08ef4ee476549663021d8a665b7d669f5a87bb2d9edc9da71", - "f344e1b393ab25d8d82a0553ad4dcc2e3d5f672480648268d8cec31a10571b3d", - "2d7fdecd45d5d6396e22e106a8aad4d90daba9e085974e4759a0a40783b32b8a", - "916c626d444d92d4b403920df2b4423b43258bfeff82f4cea72c6cf40b3a5fa1", - "7418d79820be8de103d66095c535d4b65e0a95643cd3bf85fcc5a3902e44363a", - "9893ade234288057c725bcced97c5e91d58dfc47adbe1ea0356fdfdc91709376", - "079d0baafdb11e71aa3ceaa7c0fcf6a821a5c24c761816f3ee221434d4c0080b", - "b8d5243bec8ff524a77e3f4688f69fec4fc4592e9c0fe78bd8a6a56c55315df0", - "fe46211d7c179e7bbd4d2973d6b1284c1c6a1560a02f5c05a198a742e553a170", - "6bb068b7398bf0e6c03eb331d254671eeaebc5034de932351132ad8ebe416feb", - "4edd930911f6e1e1631e765e3e54c6d990bfad06c62e3867d3d4b721d70e55e6", - "17b28679c7cf88f192c2ee3897d88c140e115b87a2e6bf4d70eb6eff481a3620", - "4e066a50dca4b48fb9aace3c1a441d7ac3af7a7e87201f32d0e56703bbfc4859", - "188c387a08c0daef36557caf48cd963634428a629bed7f1ad3e5024e2e427e6c", - "91f14c2d24bd558973209f52996170c392b92f18825ed9666cd76cd9280967e2", - "5629e6d38beab81dae53c61c738c79c36273923472fdc8c0b51ab3ac7a9d0be1", - "9859d1c32009f4c9b84402b262e0fa65ecde49b16f9a0bd3fbfff385e38bc2a1", - "aa8cdc212c9c1848ae85474a29f9f5837d624d74ce608080564f0f7dcbb0affd", - "bce12e6a28187a1542518b649f5fca5f196a7821aa8d2d2760955d36769bdb10", - "2afb3835107f199436a99da4a24abfe818ffd170f82717549a803d5900597ee5", - "4e2f351f503a7210a28a12265cd31acde45b26c8f79840fdb14f1458c1612bd4", - "192779cf3ad37fe065a7becbf9ecf6dcd4f82d07d0765e4a2d3f5231b4b4a189", - "78b43e929727312f7156e449b6a8eb143af59d696c3ae516b53c1827d98f4bd1", - "c05f180bae7edf50054dfbd4680e99b2f807fd6a978e46510266f479db813568", - "af2c2137578acbb7088b6b01b2f82d82125399aba75fa25744d2d51b10a3123a", - "d844efbecd789ff8d0b9f3d3d76fe52e7e3a3eb57a757fb4df8e58bfb83c9197", - "75822338cf8233df8c9429bafbe3e7a44a2362c48328b2a6c197656ac6b4b2d8", - "87b94ea37456077a8470357a07f9674c5eb95bcfa131cee333a85606521c5291", - "78163f9098639083e7af5ce8c8ce30ee5b567fbf3a2becd7b4740b73f410d91b", - "f646eb5624c4cc09a0b5d6d11192131ab634ef042c87acb7a6b1cf95b889a6d5", - "57730e84be2df4bbd92a2170248104a740979214586f5e29f7b5d0727d9bba09", - "1beb4b3b0398afc986465c178a163358413194e01c7c9113b3fb752ee2a62f8f", - "a7e5c4289c2a1dd914e51313204788da3dfd8d526917f92b5acf8465b6466622", - "4997d68da91a4d91a413b921603cfd1db5758467d81e4ef0df2f8998338a5018", - "26ce6d480f5386648a7bb4f7f2c24933c9d372389564bd2572918d77152d2d26", - "02b878f9b9338849bbd44a244d39c5f9f5205345fade6e6ffefd4570f0801735", - "59691d4cf88d6e48ea0527ed7f1a44741c1b4755c37bdd99c504d7d099a064b3", - "c6f6db50f3519e375c0b2a8646006f428df2fd0bf6c8c3628694bdf9c2a9d6c7", - "d4c511f31bddb390441e1c4fbbb34646b9e3d659465d08838601f00ee645b544", - "4bc50284688dd97c54ea61d7e604838c9e77810d339fa7d6f4ebfe54252a497f", - "2cebfa3d5845547777c87b9469422fca04ccbe17d11ff9e62914ec7dfd3f8037", - "89a8d75992c5ee60d4d5d1831ed49d4b4b54f627421fb5738676e156df36140d", - "81772f0c060be18f048a95f55ce42c0ebc310b7e0da4d03686f71624c5f87bf9", - "7d708104ec6fba93971968915ece6aa38c61e5937254e4c4950afa24decce464", - "5a94a170ab9a7299f33c1442d3e6aa60487a2cfda6a02baad3e8f7a98dbe9255", - "6b1bfcd531e0018476939b5ff6991190e79e344316bfa677161a52f634fdf45e", - "7af424cac3b867ebd6dd6978bef262f573210862947604a99a710b18c43fab90", - "1105f5c1d2d56971d3cefeb746726d57e92e54bf52cd8c53bd507f2a9addee09", - "a755f0b4e54a2356803bea2185480bf89f304c2155f831e40ef038d1b23ef1f6", - "ece4074cc7c5daa6718cba2a639cf72e10d1fc30cf4dcc576d255b2e06ffc2fc", - "d7d8889fbccfe22d3bf2879915ca785057e87d3ca6190b0f4fd7f467f71c1136", - "3dba93b0ffd6ebb2ee7083675321d1bfbe470a7f2332260f93e106af18c4d5c6", - "9d94b12fdfa5163f879d4eb19965f38e1adcfdeaa3ef4bb6e902eb0548248461", - "7b5c66b2c97fc1bada0e2f5afc19fb8b6d2326d836110a9164e056d79120ae97", - "63acaa7ce1573b79ec26156bbda43bdd613452367d4fefe1da8ade20d3257d86", - "737ebf982fc39394cf06c04f60347b7d706420d9d341fd717422b9333175e16e", - "0adda4dbd27a47ebb780343d07ecaac2c79aaa6f1aca07309a46b4168f81cd33", - "a2ff696f3024f403464d197f2019ca94b1ee755277348a4d246cb6d43a090216", - "7fcf31cc05254939776301482aa08f58eb91fea861efd66cf7b7d9a2636f1350", - "a84306add7fad88302e96f85598cef229f08d361951e5f38ccd7ac1fd3438f21", - "a275b6384a3bfdf0f2907c8f96491c917fefdc6205f47962a76033d3e1590695", - "82dbd698c99aed3b97b56ca7d65006a6e8eaad592c2e2058207255a61316579b", - "a07cea2d7a4933fcf1474dee539ad4637132e0c3c2e9d040d615d89cee70e869", - "e2c3bad1a718cea9fa829008b1befe1e2013c49ceb5096b4a88b40b5cb3e1b92", - "08a203469fa89a72ac1500fffb73b7c3624ae1716a8ce07375719f214beedc2d", - "5485ad58890c916bc22c7a195e9b3655f21f34f5f13d3a160be266b0204189c3", - "25d8e95d761250a0947f941c70e129be0ae28933e09ad7a57f4a58db987017a6", - "838916be1dd3c1575ccf1bb3b4f7352c2911a632d14af1ca4f83f7983f830cdc", - "f1f6324a6a5e9309deb6e26901aab545b474f4b51b17eb48518627659d896b45", - "d7b686f6fbfb5e0f587a8005b28eabb4d0b947e36c779aa206471b1842141921", - "517b414a466ee05dde3da23b3311b597b55db94063b4a34c6f7f9264c2a508ab", - "0c812a6271371f7cdc752eb52e851ae59c7beb2ded5156dc76008b27787d3c73", - "4d99071c6f4e575a015763cabb525d5da9bada9db4d0437594dd9d7877ae3591", - "e66dc439b356038a5a946ee52d75d120dd850b6490a35e319c661b2250639146", - "b32ef94025aa22b37b69d4d65d7222ccbb6afe85853301aa73324a392220d15f", - "2340a2fbd5a6d6daadd659b2abab6219284356db7b5fab1700169794d98cd162", - "9948b3720412af287a29b30a11c0c6146f2bbd3908555b4365ff58ef61f471e1", - "9295ca71593e99e6c4ae65138e598d523f65ecade05a2ebe71ed04a8af63d405", - "f178779995300fd9fb39e0c7e4518fe1908cc67d7b2f2f27fc37fc72354526fa", - "a5bfec351b51f185bd99fe42831a65f32bdd0b9329c0f3e3061b23f627095b73", - "7f320217f233840c0b7c3516770bec75b9b5beefe24236935be304b7f52cadae", - "c7ecccf7faa1ad0be7a527b53f8045c7e7252e56a570b1ef7752ba4305c89080", - "c372c6683b9be63ea2aa6b20f1696fe29de0f2f458ae9fda2c0a937518f860a2", - "5cdf32912dd68117092b7a36c75d21aa60d4c10af2112c6d0e685f4de7da17b1", - "5c3ea6d1be10e7d4f52f61b8ccc280676be14dcfb9136909cb603b54801379c5", - "e70078f33b3cbc69f0ba6bef4e4ef2dcafc343c9ecbd3462b06d0f39cc1bef5f", - "1cccc1acc2adf28fad4b86bd61d113d9638441d7f226b3b7afa2e469be1c4363", - "f79331b0613720390bdd31849c5f5d74ac983440f695f9d435cc889a90735350", - "ef4773f8b83623f86ac1d8a64e72b6d26048144eb9c7b29635bae48e1d42fd75", - "023987401f5d68fe8ab924f22329a3badb651bf660b0a24055a69a40c34893af", - "3217b09d0395c1250c31219002a68991ce6c10fa7cbcd2d59ecf6c4dd5ecde2d", - "428b01f719f17e2081689460b8f325b764556513b66c1556548a1e74b28db663", - "7a4bf433ca4108f81512e4b01f2faf4d8ac88e4f943e34aab0792fc4b197bbf8", - "23db960917003fb904e04816b9cbdb488aa69ab9772835618af9f0806bb70bd3", - "dfff8333544e6c2b543b40b4f8dc802f2eddd9273597fe1e8ccb668d0340988c", - "7b25cc64a70d5fdd9a67372176f19b0157097089b47b5a6244ee67b3b2271ab2", - "d4ed9e135d8f4f57692c51885ff128ad40190fb77e1d5fef8961b4c724051733", - "92260ff4f3a62c92121179feacda454add145cea00ef736aeb0f795825a03f5a", - "28864edd323d65a728b880b86f3f2b50ba2c8556daf5963bf52d99f45b21eadd", - "8d836373cbb0f368391c258fcd7a2f60fc89c6371cf27c9e6ca37d3b535ff256", - "528fdd0471531369cfcf968244eff5e489a0bd13243ac2fb9099af763d4ec649", - "e47a95548eed02abe36fa91489b941a8e24bbfd77cf6661745ff2f2d834724f0", - "f3030e2e30373173130e2ab7b8c4ce229b6802676573bb657cc33e2cc959fced", - "9736b1711f16deaa5136befc95605e54ab7cc980e6e7249dc9d66bc009927578", - "ebe089402d2638ae58aed8a572e7b32397b17975462341f92f2697c091193c8d", - "30addebb0596ea7a18174debbdb58c68fdd90efd1e9fcbd45e54706a1365e7cd", - "5758410914e4d402364a5d500e2a07f96ccf9dbc703c5bfd4c8a83a8568f8d64", - "b0e78290e191a1908631742ce7a259197fca77b6035034932d93dca5f50cf2de", - "a45eec0ad0b737cd1b33bb9ac63c5b49735537a194e71aacedcc6400cc774d35", - "bda0d815c33d51a911956f01a2eb9414bde9eba31991a3dd9343123cb2268758", - "3f528b78adfbdb147aff516e25d39d2a75a1214717e7cac031e3a5358301acc6", - "391d17d5bf055ac7ed2758e7523e0c203941ce876d4d464cfc9d33c3b9d86b70", - "3bf874412c7435f367b95300331ed2c68d7a56a6385b12bd85ba38213c3c3b1d", - "0e4a92ecd8e2dca77586b9fdbc0d10a74faf3192dc0ca1c1a4bfa3237f0b958f", - "573e2117ddffa92bfc2a22ed8dafc22c87963eb00261f94634a6a7351adf5cd3", - "68c68ea05282527b46862530cbbc044a09224a44fb545966d0400ffe860f6b28", - "f9f618448ff5cb4370463e1d18b33f3afc0070cbb6e27d11f4236707bedcc267", - "d2436b47dc013def901c77398a15fce1541a05d001cb7d18efc7e107c2243133", - "d2cf4331dcf4937ef292485e30871edfe52c7c8a9841c59b43677df0ea70a1a4", - "0fd85c35db493820222da34c1bf04f37597bd425e44ac1bdd0a8e33b7415a1e9", - "83624402bd6f87efb8dcdfef2b667dd61c87cae5c25a92f1419c6609ffdc5f98", - "71f1b03c52b17eb451d23eea176a9c47b63e78a0b4899b5edc92e975c5eb8f1d", - "c3e80b780b8a039161c6e615470356d17006e5c3c0f661e96f66a51ae6ba758e", - "b81879a3be1dcb4ccd1ba9bff26d1c130753cad070bd28f7cece8b543c3c0a82", - "73cdde10809802ba55114224af815f6fb399bad7e9e5993c86be057d0ce463b9", - "251af5a3d529f2a52a4e2d8775ef2b25302007223b166c8eb243693e29469ebc", - "5796942ca7c4f8e1351b1da01d7d9dc2414d2f179d1c29428dd514a6a4e8e645", - "b4f0da3fdbb4448fc430c7a2be1282aefb8194194c2a6dbcd3b495766c478ac2", - "92e711df788a1b6bfae32a060fafb9c6df64c2ac45fca4c498873b420be3f632", - "a575b802e98f1bbd21ce783d05fb21159341f119dff0c4f734959091590214c8", - "31b404078b03d6babda86462edd2e377b6c3fa4b6c8f3a102e56eb923425e06e", - "9cf03c85af13520249a465968f508055fd732a09f928394ccb34278637aee907", - "78c2ce5a3c3b8ddfd0401b8278cee5a6e664d772ee72cf40e0533c3700eeea4c", - "166b834b8ad79964b5fecd2710c18c22d4f4ace879e3c9e0af7faee84014fa91", - "65bbbc839d9e0327f11693c505bf5eba8f6fdb930372819807009fbdd1e17c61", - "ca2c27bc50f1339762c092d5a337c0b77c4db24c544152038bfab5ad66634d0d", - "826c9f0981f965de31de8676fd79a2cbc3632cd7ee08bff0442692c02345f12b", - "156db17775a8214ceed655c58b11f04a73f4b57a20caa903c5804e076a459bf3", - "c3d6969ed104a22d0c3eeb3b190336dbe95061e7335d6fdbaf4eecaa7d365f2c", - "8e731ee4bd3202f71ad640a94fa902a08f63dcbf626e137ce0abce774438dc9d", - "510422d688b4ffe59a69febafc5b64590545fe9d30c0a53065466000867a112d", - "8360d500e9fc1a869a3f9015c7c624dd5442ff86cfffccd974e3db2b897ec686", - "5bf640bf56fb8bfec11770aebd87ef0f41ac52465ef123c8c116c89cf38f7e11", - "367cd768dee172493b684937d733fa4f5d112b26c97f6076ccce16bf46c96778", - "ea714005fa59784ebbbe5d25f7d8b5091e76f64b44e0f2487b465127043a1deb", - "494a41dfc46b1b9ef440be907d53c73dfef4da647291dbbbf543e1a1c5530e83", - "6b85bb7c762dc1ac5622a1dd7d3851008e2286f5862bd89a347b58c848d4ddb8", - "de05d4243cda3e333c08cb1d706bb333eb7e0b3705cf24f4f2622a93d79d4e83", - "12c677365cf6f3ac5b99e77025c43acbf056605ed9c9ec99bcb72f1f830432ce", - "3f63a22aa819f54edb173981a6b21dc3a2aaa39a4ae185fc93d8ed983ce9dfc9", - "9cd494ec5d1ee6dd40e2a9b702368ec64dfbdd51f80811cce36e04d43e8385ea", - "ba6d2e98276bb5e4790bbe23f637cd7928a54ca07ff47b310ba1eaa878de1e02", - "059f6eec26ec4dc50b0611c3da9038ccc2cb21c9c7964f465b6da0127ea42c12", - "0c34a273c7199a1fa1d116e346d0282cb28038e122c67b650926a059935625ba", - "7726d3e20a5072e0cd0b4d98f1bdccbeb69c53f1a5052a1eb5f7dd904fa67f02", - "7219c28b240fdc335e2ad78f220527d5f4fbb4d191128ccd213d82ce26b82c6d", - "8f718f92438bc4782aa8cd501a4606efb16f29b12754c4190c8074f1d2a071e8", - "bcad0ae0e859095601f2c666d53a0d257aa809061c5216d57d5844758dbdeb50", - "23894eca6bc529148dc2c266e0b68f1a02823deb9ff4dcef61cf4a854f05a9ae", - "5a3f6f419f79e799799d54431ca61b49f547eb8e2f27b45b836563df35017763", - "f66329ca4735360d08346c1b8d96326e90fd4c25a6ce4a77c36eced3ca3a466f", - "8a1f1f71b11002f6107ef42b851791a24e433918b75f88a0e2d7dddbb249d2ad", - "e8490c9a5c32d2d53d3909289ad2213786bb157da22777912a230a11e9e48c6c", - "b43122fe323266044defe2754659f094380995d4c3addc95beab0f1cf4452663", - "0be8f78f6199e90f49c69e86e1a549b5e00215941092cb6b1bade4d01a5ef69d", - "54842ab523d350fd187c6ff5f2b4f88aa04256f5a221a3cec3b5912db89fe8e1", - "e0bf161fbe4a4e5586c73211bbf6a1c12a2ca77d75e6cc3015da2b45cac14a46", - "0db94e227786545be182503f3a9c40737e6b36e1e8348a17cfe1284464e4ef97", - "77b7a0c5d7718591ec6019ca5df5f9ba33a7af522872ce50670a0235029d4d6f", - "3302e1e1b186fae737b77ed28729a1ec5bbe8432cbf801ef5bb5159473fae427", - "f5c51e05bc7b2e488e50477b109d20819fcd0e583f66390fdf0d7d524ca1c916", - "03054b1d17f14b02378391defc0fb1e6c85d6adcfe8f4dd1d649c981ece5e0c8", - "651841a18f95b5e9c57705cd84b2f668e87ebf1d6f71c7a8ba8e2d38adefbaa4", - "2f124aaf20948a52e3f1531c7ae38f4b3f39aee844bf058ec1e0d78fadc8fd84", - "4466ef2800f6448c6a6b73535ed8e6659af0824d765e794c174262cde3e39c75", - "dd983f50fafb1accba87ab118211c0e78b121b3eeabcab281600a004cb5c6335", - "4d2db1fc22ccf5777ec522828de924aaa84e27a9fc7036073f96bf3497ab47c8", - "d8da7042954e94be80a9137775007cdd222677d1d4ee517b08c264688ebe2d09", - "b49cd6f6b032f48b15da06baec2c0ddd9e1947a7416dd99c5b24673189a85bb2", - "a93ffe2fd91b4c32534405ed714edc264961b58d0ed9d883530ff8e6e693ad53", - "455deac501744ce9aa46302ce6d4edd246135b95f306bf60a1bf83daea35943b", - "812cc153b4a6a4c51c40acf75b39b5f0762b25c1ce5709d9df825172809a8e8c", - "7e5e2b792020482fa91f057b0b2c48a79b3111bb3d97960a7ec1bbed1eff4740", - "fa11b4e354d4533d76be99d1edfbdd70b10b7a4046627e63779948cb2bc3c523", - "23e6e4251ca42666da6b24a7c4edb7f7bb5364b993f50be746cee55e736ab9f5", - "d8d9628b8287b4b4d67eaf4cf2ce24a8d24f0663eae7e95ba1847c065145a4cc", - "b5e8b1e8ea4ecbb8307f520268f68f47a7bb2b5475f00e853597bb5473b44301", - "606bf689ed4277265c63b6e1d9e798c95506dcafb0f429f39ec4fcb5d2740262", - "1ac5372c3906791ad85a7f922f46d25a688989987387bb9c0dba77c541761253", - "2920ab4adc804728835596fdfae3eef668e2e5c21c374b7c8ae39b23717df7a6", - "5e31ec91b7896b13f841cf705ae91c4c0ac5409b0f488f7e454d8fb90c000fa6", - "2d3a7451062da0c97915bc4768e8cdd8479ba89227e8038c123c12ff3057704b", - "384a5d4e9a1507be2cf31642c20b672b97b41c22f147622921d58c351d274885", - "d5be0b403983ab2ffef334b715b97b43585af974f9786a7b7ca4f30d21106338", - "5d24602969451d66bafdd76a390bf105d881eeb51a2e7a4b35d169d8211ccfdb", - "894d0153cd7d0de45f1c6e6d8f4e5c483cc9f07051d10ea90bd4ab42f1a4aec7", - "266ddef9e8660a0f6c1ee2212e3a650582b4a4831b88db96d165a12386575333", - "4b2b02ff5a680623ddb5a8a5c64da3ed160e0b36dbbce46dab61592082690626", - "44a0d27014a4ecff7368732bcdb8b12818174da504136862c2dcf34278925390", - "8d9f407a9f933bf78d62c924400fe2c9e96439aa69e2dbf7e69f8e8d39a15682", - "9d917a862e0cc7db4c3e4daef394a386ecd9dfb5589aecbec3e3ee0e22d23e69", - "8b8e2ca99ee4403d93009901a6d45532d1f2f7ced04e7828f0ba553951a3abc0", - "8e4b4b3089316b86bdf268e37932b8da8e9b482011827a264f111e2ae8c3fe02", - "ec64be4203d5d5eeba0efbd602730b051ec936b968cec38b7b0f1d45b4863bc7", - "ab3271a790af8b804b05725a7bd4422d1fe6469d8e63db45320bfaf2b136cd14", - "79c1adc0cf77d732a9f876ba185be5bde9b124e1a4d81baaac5a1e53116b7bd1", - "ddf46a3c37353b2a75c883bd0a196c9795ac620ddefc58fd0aabe45b4679a7ee", - "03b9b768e304fde0beea688bf47f9a4af00965e989a27dd107f9b469235940f7", - "6d234278dd850bb2e555a70bfb40384520e5695c98a7904954cad77c82bf3613", - "5ed9cc9fb0c0f9561ac592bc85ac7605a43295f1c73bd1e90d3e0429c0fe92c3", - "52f9d3648039b60b13a86f2d1b3a96b700e0a758a0639f1e154f5f778605a610", - "ce3d26d87a05e40d82c63707b827dfa30b5384871f8e90c7627f4fc50b0a48ad", - "7febfbe6ba65cf7f2218f052fd00ffcd32f6fdc0fd5a0bf5338dfb14a88b75fb", - "ab0e72f72497f50efb3f71733166886fcf547e6071b24950d8f6bc4fd7d5a32b", - "1aad914e2254122dcf07cf64df5113ebefaf33f5ae068e4a2da9b74f14ae4ba9", - "396dd9b03437ea42cc472deb9e6a651a1e66da4008d9f6d43eaeb319eb3f5573", - "d84286908a6da60609a7e09f017be9bf85f317f8a3cc60b03eff3870c9c05ec8", - "ed92a70e03f4b6e51b429e43b9311a493a94bda4fe0db7f7987831a1c30262c5", - "6ce3ffe8efde526c0588b61c54993d494dbd6a9f68ffc0fa353056c65c9b9293", - "2d115d013e5977a326c2b6fc2a09e58071eea15107f50cc0db3a100371fff83c", - "2b4c88d482854ad9490842819d93a786de38f55f30da4bc0e5a5dc5107fc4c80", - "068f1f1e23aad5acfc18b735a3ad76279899db0c6cd2983bc55151752ac6c207", - "69b831eb40586fa1ff7f60fd9a4cc5b1cb941aab0be305a9721b1166a9329ff8", - "dcdb8caee9c2e1a3bd675aec4d261c4d945bef5e75460eeec506ce41b379afa1", - "e30e3f29f7c91b892a37b009bb4dfb0f1fed70a6a86a218c91affe83cc49b5fc", - "0083c71104041b069bb2e80bf7a356d890291386e24ac14096814e9c14aa7242", - "d860965bb57ca4d6bc865b76f92960fa34ebcb1b6c870dbf1f0a049a96a3583a", - "ff7c626751b527eed6aa2097df4a81750b8083ca6d0b5102913acb0689a98de7", - "64a5619f904fe83523ccb36449378652c886039002baf2ace1e17de1d8555917", - "7c7bbbe7811de501e60788a69f23ca7cdbd83afae8f6d0d6391e53243bf6cea1", - "7a93c864bc7e4e06e9e2a33b954a0d0972c7fff12a265a4e0e408fc8aa993b27", - "a8542a73cbf7e84fc973b7904f69bc08ea5528b3613718ef7eb669599b6b5460", - "e3bf0ec0c957dab1222b95fdeeafbd76005cac8a4e57be1ef2426e317de57be7", - "f6b0c23f5ebf40240ede14d6ed78540117900db095ac697aac01d09048ab9d92", - "e11181c1fe0cb15d3a8ff5fb40421853fa6ddf2eeb16df92569b1037ff73f06b", - "660691ab1bf914e3cf31e313a4fefc1f3a2f691b91ab457316abdee3153a391f", - "03c031cb6c11ecedc466ce4a89284968f8bc11f72a7c4c8f79f12c0ecac90403", - "22efb0b300920210953df07c90c5d72afd988d04233b955ac3b3b63df981893d", - "c058441a03e6fcba5e1f0c50df2387a56d5831d447c1de97f0f1fff9ca9841d6", - "55e4f8b90f72e3c5bd579f6a55ad11e8575b153d13c659b00966b17df61f2c47", - "5a0f3023332f2192ebbcdb9bb06d55572bd7f7a16a5f7b2610d0ab707524c982", - "94744b8eb5167a5b6a42c8f7c2ecb3f3b15671ba57d06e50b289a2605b2507c4", - "6169abca63bcdc24e0d49807f469d973da05b6d79007eece77fe33980573071e", - "9c2a6810361d54f6bd57e7946687c838f0d09c263b03b5cf0f7c4249bacb513b", - "8cde621c5feee79dba913d507ebcec518eca78f7ff59e4dcc4122097b637598d", - "9de31bd378fc7355987d456120aa899efa51089f217844bfc0335ec385fc6e8c", - "46cb5b60f0a808fbb076a483bb0bc614e17ada11d0d06b01e6d3cd83291cf216", - "70bccacf4201d3e74c1df4dd274039f3c7676dd7c51ad53e759924d2fb202e2f", - "cef726cdcd1e4246a65237d4e256f1af9e48cc3691c62e0f9934753caade0da0", - "4b35de251649a4d05577c2e865f2830d25acaa0b4320923e1efefd0d6139ec88", - "dc0e4de5b3416f209b403bdc4d53e4c31e3ddd4a8ba9975f88be81ae849df9b7", - "b5ef0f4003e96013cdc47f4de0c6641c2810289a59e973ddf7fdf55d3a7f605c", - "61066e8aaaa662a585081a2614a96ed45d405f77cacde03e942172363fd3b69a", - "a62552153d5a0e3372fb68a5d9408a0e988e1db97628a6164195ea4b3c146755", - "32a07770dfe33a106bb889c6d34339bf9d7b0ef9ad936dadb033a2b40a5ca42b", - "4a8065e49a9ac671528c048a0f64f2ddfe6e79ec4d36e91ffe47d43b90ea9d5a", - "7fee7d7a7a4ecf7385c455aa9cd4998d8b3e8f8384606e9a836077d4cb15c8a3", - "d2995e419e633ddfec3f7565399ff898e5d123741854fa25992a26968bccbe5e", - "80822a13d1b92e87155f1f9dec1e61d6d536a612242f042f30207a4304bdcd4a", - "371e941bb7849f702428f0d8ec1cd1f467468bfe28e208d2cd72f948a700775e", - "1d9e27b3579250aa49c006cbdbdba1f677a514546c5339443eef17186e4a2d9c", - "30ecafecc657e94fb70d697d8c50875124a5d851e3a2ae2fe895ad3b31924584", - "c624c8ffd032c2c5acec9481cb8c0151c530d250db29492a631a297a792e0ffb", - "571d6035b9db1fa98d8139955f52bd2a2fe3a591bf070837054510e63da03627", - "9af5e48c6e55ae38141f02b949de7c8c805d4d87f1ae185a804436a5da995cd8", - "fb6e4e2db6e47bb128f6ec8ad3ecb58471b17aab0e3bc57234d7e919f993278b", - "cbf225dc164b6fc5ef9b44e68453dc70b502b0d4251a6632b6b72b493154f870", - "eaa6e370f7c21d869882b86d84c3d39b1954414f3a7b8529bd66709f240e99c6", - "3697c9f1112e43d6b802a81a970817e4e9c5a7246355ae4cf7b6bf83ca74056d", - "6b5cb59bed3fb4ddcc2a023ac5d3857384403173e074e91783f95ab117953668", - "ae1e21c4da8beb16059daff6443a3b64e0d15108c9cad7433da73cef2ea0ff90", - "02e49959d8a2f14ce375330500a431d5a508c4a8b9edd31fd1334bec7530bfde", - "60e286048d820b46b9a5218a6dc852e9a6dd8601d83f56c2ec74b8bb243cc031", - "fe43c268147464ec9756d08b99a54b242690608a5bec3f2b21211f9d49ca9cd4", - "73e50283a622b0117fc3ccd7365f5d4248e479478ee3883f601b43aab20f9957", - "4c3ecb7c63369ac91a63c482bc98902a77fc342a283191a47e93ea4b1dcff581", - "b398c8e1926069dbb9736acd062a767bc1b9b4fbb75548e7d9fcc37897525082", - "689fe414243cb3895064592cf177ba79d61022898b727ba3b2bfab241e236500", - "9079747027153c2520e1ed5e12ef6e112f20d6e95d720b22ba21514a7b46e722", - "99e21f4994a746bf20549ad81ace43a21df59de213849a3063643ed1e0e3ccfc", - "0fa96cb8b5595efdae96d0f68e271f90b006b646af408eecf02d2c017a1de08d", - "3caba19bd91973946d753e153c8cc0137e3d872cfb8e792194063294e77b645c", - "d8b491d8250f2422691381ec59c85c44d20671ebbe4c15db9c09e77ed8db7fce", - "8493f52fad2a46db5314188c291b3c37f1d561d3a1b3ce9f3dbc8b9bf463a75a", - "1bea0a9c95efcd51ce966c8d08104fbe2910dc52b068323d82c411d3826f5d6f", - "8306e541f77fc69ccec19ce7c5746dbc183ae8fae5eeae26dcc5cb64df8fbd81", - "8655134531a491e633ca21ce229164e5ac580c891e736d8918b7c747be43624f", - "0ea5dff4e6bb3ac87b2ac237f0b163de5ecfd595fbae2614d781f934297530c6", - "029b8fea526028a08d920cb559c8e87dc08680de4a2f290043fc59e0aae3807f", - "e712cbfffb9e14230ded7349f750208d3c46eabd5b4238b25f020489bd95a5ce", - "382fc71152d6187badbcf83b505b638604000aa3717a62c027b64ede046d57d1", - "97c823992c64049326d397e338205b76fe45e16e03ee180792aaa661f0c52909", - "a769667947380085e23455dbc6f06cc2d74c6b5568a86ce3093f41c010b06a10", - "a6e99fa9f4041db57af3f703e3f4ed7a7d523d37e4b8dc6135e0f7b2d71995d8", - "0f69d1041b335fe1bcaf9d6f641c980e2da06e018f3c757ed9ea14564942df1c", - "beaa3c4f4c2e54504881c0008ecb4af519734fc065b62b94bba241e52ee5ae19", - "5ebbd878ab8e63045ae7186171b7252d89947cd2d735963c03eb80fcb05f8ba3", - "4de5d5b19f8d71a3672156ccb57ed75ee9bd95c47693a9c14d18d80f1418b1f8", - "b750b1c1301e61480971f78aaa7d43c94cd08bd683d9afbbf08becadd1f2d069", - "a822bc0311493e3c2ffc8384361a524e12e72b57c97b2d5e18e05369774d7752", - "09773f08164dbe8440cc21fcb11e0361ff1fcc9f1f13f5d1b95088bdddf3688e", - "7f99c10d4cdeb08f192d5ed366f77c2330f8617e3048f693e8dd63086f03cf5e", - "4e64d3b80a51caecc0a13040b856ef02383e47e257b6916c2b8dd791fd55b752", - "0c3904b7c38541adebae875d8cc0fdee1ee563d86150eacbda64d8d690b7b2ea", - "765006ecd269b55e497c4f5d1f632e2064fe9858fd46ae378e6c1bf0493127b5", - "6ba984696595dfb861eae0033061bd83ea1bc2d098929776a154381e1f0df915", - "01af47998fc744a9ea85f66a9da2a162c553d4d1cf5f6b20e8fae52fbff43676", - "61efad8c097baceff81d3473a5fbaab33307c8deee11e4b0fbf9b13f5a5e9ed8", - "54815767e3f6c724949beae6d94a028b0c840ae7d82d5422577b1bf707125d3a", - "55776d4827b80e990d25f92a3b2b7f89530137f84e844266c443cfae78e8e084", - "552ccac81ddf6225c3819b2183a9f2f74656827631be32eb1fc3f261a8659a7f", - "68bae9a72661acc08f52073281c765afff8182a01568d09acc23bdb172d93305", - "d13168473f0de2bc8d824f72852323fcc162b293cca742fa3cc5b04293a1c847", - "e134afd9b8f6d82d72d507bda044fe5ccb309d5df1a6841aef36e590fdb0a542", - "debba3f06756d978fc58b73e84ac6619ce226bdca7e8334ba17afb08da821c85", - "b774123606669057341336bf6da0e5abd4a118e009217f975d5f7ff374985877", - "cccd4927c84445f1dede2e35bdfc4ea144354e4147954381ac1d63c3eb2ddc9d", - "adca9fd1e38c0c053fa7e121f550f10f81b9af07a9125e667b4076176f0c728a", - "b5c5c85dfb170df9a794307648836cc0f24fbed254a0fef1b8e0b2be070271fd", - "8efdf54f2e1f024e095b5fcbcf5b3c7f3869492fa44132b29fd01bd933db6655", - "15bcb646207946393a9e07d3bc18886e56ed78c24e9819d95f095809812d9945", - "54d400fd32d2fac75f9ff22a762b30a02babca581609e522b698785dcfdcd848", - "d9bdffa542382f1cd8955d111fd9f5de91b716925c37004a41045bd14639ce82", - "6bc428f62d0ed0c90fe902c2f21921ba8b33bae7bb972ad19e5afc47cd1227ff", - "a34cc4eef154b671657c2cbe43d3db01696e887828d3e6543c0a124915a85238", - "e2ffde80002d3ed2a88d1fa244a93e75a73f07075982c35bbd25a43044974b4d", - "79ebdde9c1da392ee812a36dcd52988480b15cf7b5b6d7f78c3ed08becc517ec", - "9d3680e954c9f61bcce3527ed2d9b26189b3c50344b05b63edf58b01e6463c4e", - "3a80eec13fca27f82db6e318729750284180bed266da0eb211f42209f1bfbd51", - "4fcf3696d62543847bfdad81c5be81cb2880c72d81440f1328e855b762e76fa0", - "8a83ae9d9f9240bd528d378e6aa2bb7c3212eb4137fa0d45a64283534e1456b8", - "61917328f54fd9b660a450909fbe49d0e732441ec4423f9f6caa45d48e8e0292", - "031fa5be37383d03a40f9124fa93acde100f372e11efea77da3326a5305620c3", - "4536425f030e3ae244b144b11bc29c28d6071e37fcf01ceb57dc288558673817", - "6b58d612bea582d1eb61fd8ff3528d5c680cbe849a091672b3b3bebe92e0c919", - "d4c31a425fd028625edefc233a957327a9527833e7f2e22e8c950ce84aa8d726", - "ae217045019a28c45f10bac0fad9bddf101b53cae0ae88c9a757f69c4cdd5d13", - "d4d967e7bf9c9b19672b59971108c38b6500f3e0fab7e8cfa018a0c64e7dc54b", - "99eb28d9520def00219d335f2d0a3a067940bb69b9eb1a8657d3176c05b03e5a", - "d491ee633e8bd2b851907d8b5ab6e42d4b1320a1933ab8445cbda326ce70cdc4", - "30134652266dde21bc06640af39275679cb9369f79a6e34eb070cfa1a83e7583", - "52147b369bec4fbcc35f83f4224d45e34d8e3102ad6867b4ab94061c4a06298b", - "05505dd3049fc03f3f5c15c8f77abbcd5964fbd969ba2a3f46fa11a9fbaca4de", - "e688bf41e0fceb74e6a52b36661845fe929b237bcd15e9338772fe6c20e3c9dd", - "fbd75f54f586755db6cb24004989ac51f69d781b688a5d71e957591c16d374e3", - "92cfb18f281d339898b5f0035baf2f81d9a4f2734cd222c444e3a53c3f59bc53", - "646ca0757349e62d947bec52c84049f1d50f3f11611ab33c6afd219e9d34cc47", - "91c043318c6d189109430dd122f30a85195113e720a0d6b3b5d8ce7972e45296", - "45d29d2117fb5ce9fa1527d7440261a08b76f15f05017b32f98c8e920e800382", - "ef4c2cf108408a3d2a4180cb7952a90e31f010b09ba226a43eb7626d00465602", - "92e4df651fa066817517b89152575c6961d232335c55d50a3d8c689a5b2b7881", - "c077bdccbe1106b44ad0693e934ec9f1fa1bf5043ef5809e4e32fe173803ecb9", - "3dc99b5086a157f3eed262a2086cb78edb4cbc9d2e899a36b15b6422d3945d68", - "c4604724a4c89e9e7af96e300075adec67b8cd91991a508b75571ed3cf8f5b2b", - "24836aee87513193c17c20c761e902bc2831655d42947f29012d20ab17fb597d", - "f8a86c743912ecd47ac4d81dc4a33c2857753af75db7678a8c6480d20bafc682", - "dd619dace4ace742de72b0c36007ecd9a97aeedb8efa5eae9cde0fd06538151a", - "39473ff8479c979e3d05b583174ea58396e510d1696b1f4c0ad3c59e6564c0d2", - "412be462b4c9c60d164fab2b6f50c1ac76aaa8a9662e1b9530cd2d34933db0d9", - "32f6456e6830ae005306a98dc3fb73f2e0597860801dd8b1e7d2337d4d101746", - "7322526ec39b8e7fb3a44a4448d1f5fa617aba3152f9d57c5a6815ca746509bf", - "aa30530ee604b79d740aa2bccfbef781d24b37f1ebd0f55bdc0c1796230d9acf", - "e8af8dc368755a6bd403aff22d4fb29c055e2f0c208951a9e43eb494680f9f7d", - "eee202b33e910964d905158e895067f0e38f7bb562d2dc8f74a07fafe6e0cbb9", - "680d6ffada2a7140b5f52aa804009c39d4eaaea73e77461faf4a326ea79bab21", - "300c3a01a085df7ac7505c193675f7ece0e2dd384b9fc273df63db004217bd88", - "67911c16f373339b562a51fe445fada76e5525a272bf21499403c43443324f86", - "c12ca46eb2ab5d12f23551c2548b01e49ac6f836159bb2be88cae23ed5de54cc", - "a282bd3ac3cc24f5a58fc6238c69d710f622bf873ed554cb0abdc340734cab15", - "acd717b17ee8b1960f52e030c69b8ea70163b64376cada465a88eeee591661aa", - "af97e7aec8da384d9619b50d6102026b54789f76a362550cbb25ee6d8ad2a532", - "926d8c399e5fc29da8952c18eadae5e76e1a586a317dc45fbf2be1165a091dcb", - "3f7111181c8bac7364006be1a9f71707e7f77c575eb8195a1e5a86026b267204", - "15361e224f3446e8073266349d6a6bab92b2f0feba8a5178bbadfdcc56bd6258", - "dba8bffce80110b99a938eda26196600dd5a5fd768f60cbf9279763260f1bcb2", - "03eaae249da6f15c96edb266a1e49aa27e5817a6f1303ed185d08a78b8361b7e", - "fa17a53da5804abe9aa632b63135dfca59fe3b68717ce5fc15e4f9281a6eab46", - "ecb913586a595fc7b3a36ab6075ea5e0f63b4095f2222e2ec71c89663937c5d1", - "dc546808d68baae327d2dad417104264e2898ab09eed8a80c118e03ba8b76751", - "bee579f0fe2c848228426cf27b502e5f3337985b16f086015847e20511df07c0", - "e505df021d1200e8458ecfa1badf1fd99f364d30ee34073fbbdeda9ee71ed42e", - "680957bf0de05edcde0db1e3829e50730e67bfe04c38bd16cd587a1efd38e033", - "372850b9df0d2d5bda39915e82e4b34b210e9c4d7aeff86d36be027162278046", - "fad400fc6b62d6741e4b54bdc90b1369d20c97417d696992705b7794d0972a4e", - "340a95183ee1dbb1a1a0d8102fd083dce00a96e892a03803d904e2af9d0fa04f", - "f6970961490ff7f83cc759d94c063d891d6682c1a7faf1c406e2ae39392d30c8", - "c4492efd33fead5d12da4b4c0ff9d8c6e9ef618b6915dab17391e93d5dbcf3c9", - "2a28c9e9bc0264afdb9bb50b9fc60e4278e1c581a5f3feb818d37168c63e9265", - "24d4a78ee0989c20f4c68e322b761db964c9c618bd12ac7265d1ffb582d80cb5", - "ae8a1074b7f0f6e366c379e80fc8c22dab3e66ca92b25ab4a8ebd0e02497b819", - "4f41d693d2d196919744b638193c6c264b67fba48fde8d37d2cd1f1f4d3e780a", - "54ab5590d962418381d7e422fefac017208b428d339be1326410e6a93d82f286", - "43c22e8e61f6c9cff50fb84a048c3f58b5a38eb53bcf2e67cef058bc29775c42", - "d273fc4e3e149346c2e17b0a8c21c52ef326c3d00ddb59832826c13823782129", - "c9dafd23fe4a8402b470d21c825fe8d32b1ffb0d0a2b4b43eb9cc97579b88a19", - "dd68811538d58511ef875f3928e464aed937d54cd29c3369ebaa3bcba8f77924", - "2c513839ae86c6115cd1b1792fec61d366d21be5fdce8e6ef276d1069029cf16", - "eee9863f576000a1f69f6300d8eb989d9c68b091bd02dbb725f9b2e9cbd9030b", - "a982c12df37f4d2f48f899d7b61fd45e1fe1deabcfc3bf00d04b34da1d3051a7", - "4c24c3a8eb67094f16708fa3223ad124688b2275f9960724c417adba899b6a91", - "2c2bc22059d969e68bbbcc0a6a1fa4fcbd441a18a2bf6eff6e5af82994367e43", - "3a5600921841c36c820b74cad890916dc98a5a5065a7db06ba25c6f5b958fb1c", - "b97035263e7e2d97d1b69fd63dae5e23c1483e9d7ca88d4082be4cc162d27da1", - "618c2860f0582d96a5defa182a0e42ef8a39cb75e4cf2bf0575db6c7bfafb0d2", - "ea8fe0e422a3333c6c301fd0ecc0afa11d58fb4f0c527506d98ff3b8483aa630", - "679d44570636d6d8ed11de4a5ee1017a31901045143517658e2aeb3464ba271a", - "dd7e2040f56235b98e6d3d5ddcc45d7e96a1cdb15d99e4ee866244f7e210bb66", - "14dd8cffbfabfd00554d4d629c80ca8a8597e331a60c1b3f5f64294ebfc48656", - "e0830fa78aca913df365ff7bfc1785075db78c0f52a5fc5d81045c1bf91b169d", - "cda5ce7521914603015213b9e607843714347926c9e699d54330055723031b6a", - "4e5ee1993ec2c59bb58609e7eb983a4e5ec0a4fb532c9e06d086e016d21260d0", - "f6f97152fd9825d652f84ee9c30cf8d38b5ae964d6fc127d9eb5eed3f7d066fa", - "500cd1673254ed2e56096e8553791ea7097de50ba8b98f2f9090d0884b61285f", - "b803d2f047a473de69cc6d5d6cee49310c67fa199f5a401ea4689686d6278eeb", - "d8a036c880748ab9ba44a8677ec9c61bfd1686bd829547fdcfe7b86074e2dfb4", - "6f6332549a0fb1160a0c679a5149d06200678f3e0c153da8f34447117e5d09a5", - "dc4fcf6be76e487d24753eaa76598830359c121a3156941ae8a0c7bb99f085f8", - "0f80f7c054cb1ef1e4a023455b58506ea98f7b0023ae80d2e70da8f0089e874d", - "4e530eef570072b3fb7f1a06f8fdb6636fe9a0b9f607221b67094435f92f6e20", - "268f87e58a69132754739560893a6176f30c5614b450080ceb7e3b39fddb09c5", - "15fbc6397d628e7413c581d19b737a7f50938dfae17aa5639c83e8cc195f4d9b", - "67a2af43a9dd9d422a46b2a99ed202e63e7b0eab642795ae214687989ae62c5a", - "5852cbbe75ce1244e9903083636871695e5612c44b0929d80d188dfaa6e64df9", - "92e6dbf9de07ed67e9a16368d9a77fb52c21837d92fe86650f087baf74fd36ee", - "e380cc4e63a99b645de3edf08efc5615636f01f0223b22869d23392a90d3a4aa", - "f5683dcedef7506a7cc6174f3338a60e692257520b0a99d76893f791a826bfa3", - "b655a0ed20acf4bd705fe90f17df6d8f3e98c78ad459c9e2728daa63e2e02b73", - "034b98d2735cddeb05d3a21630b67fcca17e76c0a89360c79d4a4208685de8e3", - "e82ec24e993616a35ebf1965831c5311bdd352a0d5097fc14060f26610601960", - "3b0a0ff128acf2f9b7ad9a3560b28470d03d338329a5671d972999859a2eba45", - "20721ee0364fffb4404e9de504ec84ac01fc86c40ecb3658f070a696dcece275", - "9c14bfab5d76c374453f7de9cf3df5661e77defd306cd5dda9c6fc5ec6bcf5f7", - "ade74011f7018d6c9aee99422e4ff16be19b767eea64ee1fc55707c0f8cd7be6", - "4e57a8c73f42cfea6e7586ec0a6fce9aff848ae6e0ec1d7f15e787ea2b31f469", - "63f8f595b9021fd4166f102880b2a08094317903642fe87329361ba43f434fb6", - "18a7d964af7546f34f0a044591e864ba8524b5d3cc0e7c3f985fe21875056d67", - "daf4f29e9171145fa5b1db88c3c28b1dc11e4faa80d1746fc510c419a8371707", - "6154007a2846ed3ce08a4212ed34b63192037987d4d54e989a5c5cd7bfdc90ec", - "db0684a9d919f87be200bfb2f730f44cbef668f65e863b7c572267c5f09a5fd9", - "a1f1a30e826793e880487a3d6574955682f39ad12e70c9fad6d9c5c816bbcf0b", - "a70fdf6eab9387de6fd70afe688c5d96d7a91b5b352449f0c0aad19ef0bc9de2", - "98f93fc7463a5b33eb143319b223b55ef0dbab66d8ab88084671123d90f9a589", - "9ca01ff33ca095e2d831ea0e33b268789e5b0ea711ae585d9d0f87ca5fd9ae48", - "6cf96f4fd5bed0ebc34ca4bf4f1e34706fc8a6e78b4a5a7b213a1dded16a8aac", - "cb061ac3cf153a93955e1a323f9200ecd68fd24e6405928e074b38db59c150f0", - "20ca953099fec5ec7359db15538d5d95c19593d767fee0309e2040292ecd7469", - "d0600e53cda0951195d3a2bfa1fca49506d6e1f3f93f26c6b35d61cad46bb51a", - "178f2d8cd4a16ee8dcd4f3db90eb3aafb565ba6298e785e0dcfe607f1fed5604", - "4fd83eaf5c2e171c1489dd3c0db1a00ebc0dfc338b05d2d74aa9b4a7dd3753ab", - "a4aac7da6fee463428d1d44f9d231021535d6455c533c76d1c4c2e27c7c63998", - "f771736c53b9ef8becc4df7db12544a398b290b49561ec41e6dc66438ce8f0a2", - "e1db36011b9b86c881912a8ba68f7103616373ff068f4afe891cea62f5758553", - "c3b1992fcccda67d803e817fc7c255386d8de6738f5abdd869821e4d198e99e9", - "1dd613289643d25bab4c8e4cd22b5c4fb091c3e0d84f105999580d64e9eae03d", - "7915cf10c0dfa0264f4cf44fbfc3df81dfd9744a8e574b66d9e81da5fc625389", - "5b81ee562291566cd4ae5990414fcada2116af7183271ef405a16ff0de216910", - "af8d58a84c747093a0aac085df49b6ba54016a68da82e0c08b3c44fba4f016e2", - "95dce24c92d12a3dee7c728be30a641a7829d7a3724beeadc95610c91d45908f", - "e14c671d7e44ddce575d68e8c4dbf8693326b43c23f47f2116cee71125406f99", - "082445157c93a1ca68ab448a4a035d4b47568c76fea59d3ec19655b9742f0a38", - "fe963959dccb9ef3017de6222e59dc15b66345f0f8e12242ced4c21d06bd3dc4", - "8b165cfc1cfc5f4f4f448d16bf68bbd09b2b20e03167d08b999a263956560f67", - "f6715b64c4d0e6012f16439ce74879bbfc529c27115fdc64f7f42494d0bc2c63", - "b51bffa0bc4e2153a9a28bd9f8d45ffe0a5246994f84d92f6434fee0b7ad535b", - "6e5e276a6bc0057b5104018eb7e0002e4043904994f846a250ecf8a19f20a412", - "75e1de650433ef8e8bbe22f04c0fc9d6794655a3da61fe4ce75aa461492ede6f", - "63f42d43a31228998a6ff57655a7c6ffb03f963a7cbdc66bba3394a89a567944", - "43c49edb624f29ef4fb717214a41c2b83c0e34de3634f461add4756d36fa3f23", - "7ac7f9e394ac192b11ee02d1f82c651d565645f08c594cb35438af924fc793ac", - "77580267379049a9022e4473922faf4fb37cf0f5e59a816d92b2d0a5ae4d5f19", - "7eb8612f5e06204cc5fe702e79a787917674875686a84b615b8aa90aa53b9a2d", - "faf5e10f74c6f71958226eae6b510c9c156c7edc2b1c20bb07db40307e59d73f", - "bdb5470ddde78f4949d3edf3e4bef8229bc4abdb9da4cc088b1f3cf27d7642fc", - "86471a6ee7957a238f0857022d99dbb1bb82e98114adbd61f267fb63157ec9f2", - "9dd753587b77c3e48883f46cd83ed069e2a41faf4c4a3136c0904f945d1aa2b7", - "c17ef1eec9ed0aa2c41e1a0823eae2fc459a7a178e2cc1139bd9ea791cb6090d", - "211f2e7bb07d4c6d85ba3bb28619c00d9ceb3267535a78510ac34a15af294146", - "3505609dca5708586600e23e4d94e59062b305cd2a44de35a49d8f4be21b6c32", - "343e18dd79e156c775f7c488cd729e76d9b8ceb85436ea196757616142920786", - "119f47364854be20271d6c4febfa173cb17624296a29689984c2b50e8306b475", - "f5c6bc3025c80cf06dbd0c64ec94605b69629e084e3be9aee1a84227fba32f3a", - "ed7971da90d8d26b88bcfb190ac8bdb1d5a7b42d8452eac91186dac8cb2b6b43", - "02cdeddf174d7dcb500a895f19eb3b2fb7703347f25181abc8ca8c6fc4966fd5", - "335b1bdd2a9ed744867130e830337fb0268cc0898dcdb0113c8b9ed60cb82f35", - "49d46cdbcb4f6a2ec2ec9cb2327e4f2a0230bf6b45c469fa1c01c714db3e9af7", - "440fa851713a727664fc88a813d19d647f6f76a4de21b6b02531596c932e6377", - "d977196c4974eb8cab13d4075c60508e71344a1a494441ccccdac6327335701e", - "305fda35ff0774dd2bfbe25f18c482ace7cb3b2f4f07783c7545ad6b1b5d3aff", - "fa62d62a18a687b67b73c2d4adcfbfff6dfe0edcc77e243dcd9aa1897b6611b4", - "be434eb661157d574c119c5ce8599951e704ea240b02c4d856a245ead3916eaf", - "ecce161c0bef96622c5973e2f712f778542dfaaa7540c6c6cc4aded101efca27", - "b95467ca3f6a7f8cb98229823470a7b60faa2ae605f6f85982a8d17b92cbd51e", - "90330bff16a96658022087910de9b21ddd66054fdb27532583d3f26f90f4ee12", - "c583865ffcc48e4b5b71b590fca2902cb2229e2335578f08b0a673569b2cb99a", - "01bf3d20983f91473023f1595550b69c43be96ec647a287c3da63be7f4f3ff84", - "51a96dcdb496f3888f69b996914b2ebf5c8bfddc88fdb64bf4b9249fc9fad527", - "e174f454d9993d4dd0c6a2ba1970703b38400f043e24703db817936fd13f37a8", - "e283a9f7bb2dcf5fb784aa79419618b6a664a46660bff3d3cdef2a2ce59c00a6", - "7c75ee6e4c488003750f8e2ff2995acee203b403c20b383c33e04301943bc49d", - "ec968d79789b087b68a46dec50b6c0a3199060f2e3730e1e7a1ace1836124af5", - "301feef469a358136f57ae0187fea2d79ccb6293f6798856c54448d75e21fa81", - "0bcc73b5f5834011f1d4f4f48bb14165dfae2f2e246b286c3ac09c2b9bec83c0", - "2c079fbe5e220f26feb0e808291daf0b1be3007b79ecd53826aa73085b33eb4a", - "70be63844fb82ba9470aa466b8dd286a08f52abc3ef8651913f2bb4cce4c2f0d", - "bb7251e61997996e722724a2376b32374b5aeb33489be7a9ea93bc13e7663e35", - "cc36985a6ba60fe17aaef6358cb26f874c86e26bfc9619bb6520b62173a55a36", - "396b47c38af84f00442a781ae078f00702e6f9c0e36473043223d9fb1839af0a", - "405a89c067b4f344c6032f09956479bdda72a78b0cec14c7f84315d50cc8a413", - "2f4cc6a70956aaec72f4c5945007def25ee5e0351fe9675a9d2cfb09829f678c", - "6fe01393c2ae734a24829939a75b04cd78f2249c1f07ce729b0081b34bab543f", - "4c9de430a7baf489647904efdd9e05dd515a614040da609a21a10b257fe68208", - "76581da04de73e1d0657d89344690658accae96a04de5b72556ad64ba66a7890", - "a8cd36155545a97a5b60d9c68facbff95575914aa7f9ac82a3364f34c328d532", - "b95b145ac7a98bb71dc3d0d0cf62c5dc7cea433a322ffce1b3fe82e98ef982e3", - "c0bf2a9076f4af36a7c3018d2f16d7a0144325d02eed00672b085eb74b46a3e0", - "c75a9fb6c37fb0291060185f205b07d758f6d043287072042a691fd0a2ffc599", - "7b446a8b47d9f83f3fa9073663068b0927afead5b25a7ac72541c2da0155723f", - "758f6b4f5ee6ac40883c42f14ee956f73503d365a788aa36e036fe163058bbea", - "df7b060625b25bfefb68517c1e86a6d95050f5a9c44ec1ba535f5a2bd60f4c9b", - "c3d44b9749f88e5ebc79db731e01ea1694b89a17708d5753a1537943003919f9", - "67e34d6210b8a9a42ce87d1fed6d04d83e215cb4c725f50702ee1b95d28c2b0d", - "bf0fc695ca3c0e22665f83d9bf3a522db3f2df2169c89a66371ece0f212a8089", - "8e30ba072efaa0586aed84be1ddc6b0f03a693c08f76f98e82805ed65648cb1b", - "1a3b41eb8d90784616a2e3f7da69b74e64d5cd7d38702185daaa049aef4dce3c", - "d0b299375e4cfa9dd5b974022e1919e1747b3b503b5f256b08aa9880bf04ad93", - "4e59f46ce981e25f35f83196ddea8d8e0b5636bb821330c71de1592a5c49afd1", - "fcfc2a389895b9068de03607aaabe0d26620016399aad5b63d3942c82c73dce7", - "6fe6c43f2117435d3f4db8556793cc4296978fdecd27d078545aec18af5a4771", - "763be4edd56e5db1f87eb1cb0e8366563a47a53580dbda989fad9a0086bfe381", - "ca16d69494ba8214d992e6c4b153c0cf58d57ece31a1443e6d33e28d7dfcd3ac", - "d63d44e9536b8c4a62a06c5fbdca40a374cf2ca36b90192c6d49d03fef2c55bf", - "a226905242b23da104f7a6eb335974880e08da8ef4fc9c322dfd04c4ae636a05", - "09be756915dad07c3181efd23c49df4f44025b9578d21768fa1babf8b23315c9", - "09b2d85c65313d386d259d24bfca2cf2268407a4b00544b642765bc9774c4dc2", - "2989424676b69bbeeebd141defe48d6e2279c42f55723e05ca32d780ea19b741", - "c66bf60d72f0463dcb63a8033bf52657fdd87cd307e3f0e2258d26f4ad30662b", - "96f37d70361e47fc8cf1f4ddf5866ff705d3a44424c4a4ca82e6c6eafc7ee3f0", - "7ba6d30c0e96749153015e4901bf924bd5c7e538566c9bf493c7582d9a4c8bac", - "a3ccf673c339af3662513de8579b7795338f72d5807e11ca3eba9203f5d41051", - "19ac996e59825e6ac5f33c56a433f788a5b2578f6a6e474807a1d5a0e4dea9dc", - "d3a8c3037575a121b4f3a33cef09edb8dc4e5304f1086ea30cd96490e8b9d9d9", - "076c3f16539fc01873de02da04b61d743b11f3d174ec03ebbc098222fdeebae8", - "6b501f7ca831802e560efeb8fd534536dd51fa9adb0b89cfb98bc9988747e9c5", - "04df602bf4adf8d63fdbf507dbfb99e9c1293c545e7c96076e76186c03c5c685", - "e5dd09a04bb03d9a5424f8c68cd62fe92dcc343f6899cd8238e105b3c848eeee", - "4139271a8aa61748e2c39857c72d18827eebd6ebb0cf440f97f621ce6d64ac43", - "6bb48c00c846c588c20baae27d533b813799cb9b2e94c8a01d93a1f79c18c91b", - "764f8ba20794634c7215724f1dbbe10094c99c1d8cd7602056b303221625fba4", - "8a4e8a2dce84e316dfeb3a2dedeaf29a22ecbbdb71712b36a3abed8f19b14fc3", - "2c39f2519315911f14c1eab6bd99da6d9f85c849ffdb9a73987d3611fbbf2d35", - "2dbc4bb49d9bb1d864c183c0c4ff09ce6c15f79850bfcab62845d03b824f8828", - "355b2fe008b0b8bf4244e756f98e2d97033715c2079c43bd981f1ed8bd755439", - "300efae992cb3b1f7304c6b6906a4f54bfc03d63289d7bca3e77dfc0dc5d9073", - "270b0827bf360962263e63a48df303c54cb66068b45d03552da8313559caf28e", - "6ea125e12a3ba062e4156740d1c8de12f7f4b11a22ac293ba53cd564ecb60ece", - "e2f2bc1d5a71a511869a5b81fb36b8cae33a0d45ba006cae79bbc4de6d554340", - "998b96f32b249d3c77f63a6b49ba874d61f8c8775d8e060d793228a2d9ec654f", - "d34577d089b294f3b5fae4bd406733cc47dd1e9ad16ef4e52a85ade57ae4d996", - "0a8b80bcb8231596579f9c3834fae1c2700c93376aea16e9253b76909e388ba4", - "76e2085be43295d1116fa305ac994f2a194340c72ddecf610a38039601c678d6", - "d646553650f483447ffbc56caffb42db0e7e4af2554030d4c2d20143d6ba2910", - "4c538055a461bb21e6401012ed7275ac80d33746e1784b23abc6a8167fa17aeb", - "ac84785b77415ab9b55d997d8b8e9e04f576dabb13305fcb8b98e78613fe53cd", - "b4fda73a20bac41745a1fa4d9f25f5d554ecec18e87c6970cf187ba749eeb0d9", - "769b12c7fdfb6cbdc6189ecd2375478a1a5752045fc9c87d145949418c89bf85", - "8717e43a99c2291ae1b701c0b51b16e7bf3a59adda829b23152013e2f3b4da4f", - "80e282f17fb43f471c652f250894e1cfbf328b2c588b0078ff4a0f17aa50b4e6", - "08b13318954c96414887d825ddf1fc5993cf939880cfcec52bc209c54fb151c8", - "552d4020510e2176757e86672c258c13fe260bfa249d6c1e976a2a38a1b9e53c", - "ad90747804d46d716a2e3105f1c8a7d84a11a21e082526e9c7d69fff87216e47", - "082fbddd0ecfe2a8069a20db21c63ca18193a5b52097a2cf8c381a7a1a2532b4", - "7ad137bd7273c7324b66e3682d5e726cab221fedc010bf28f74e72733df20ce4", - "a3381016f0b431945c4f191c45d3d20db771470ad89303b448a6be2314990bf3", - "337f6207dcb22f5cc75f4e5c802113e496cb5d7cf593633737120230181ceee3", - "852149c3c075f8531f54eba49f48496b70e461a06b950de6379460b53862837a", - "4529b4f993f7c48fac2932712a059fe1241b71057b11b03eaee0c9b6df2032df", - "0a8057e285a9fac17b5f3ada1aa1940d58c9f0e04d54ea6ed37a3ec6bfe32c8a", - "132058f39a6d9dbd920a979379303641cdcbff3a445a0af8726305ed727286ea", - "ceb891e1da8a77bc2446922eeac39c7ea62ecc3913f705cf3fc69c168f00bff1", - "9f6312224a6d6ed01a554eab0db17bec934b8d0a64be0a88eb875a4afbf0c834", - "114b3e950fc6f9ea3f468b47a0e2950571b54e79f59882e04cbcfd88095d4c8f", - "0c29710241a7b25a7b60999e0148e132236401fcf80138cbe2db097b2ff94aef", - "1227955bbda414e72fc3c8413d92668b6c86fdc6489e9d01fb51458ac6d20481", - "2b9f60363ae4b6517767602c5e9c70926ebc8538b734abed404a55320dc26c83", - "ad3855986221d28233a861034522b866bbb1ed4ca9e9cacc3661bc7340bda2ea", - "c54dcca55ce1221931f333d21ea8a87f939db162cbac41af0ee06ea8ce02315f", - "fb000def982452b4ae7c0d5aad1478f2a8500c1fe99d7bda69eb0037abb77b9a", - "0dee0178f81fe766cd2ee509e55c343a5732508bcd4d9a326d48cc60672f06d6", - "6002991843b594b859f036a12500049ef51c6cb5afa267b1e03bf808b3402a95", - "921a34863ed51080d571fdcfc5a6e745ab79b37880df3d884d6fc6c44679e3e2", - "64ab4d728f85c30192509b524d6d8be3ad5c2d7103f501e970e99d9ab09020ab", - "8779ae260718a21d7a65af96cb0813be2b0e6de628dafbad444cbe8ec15c3f35", - "3c68bfe95cdd6d2c9071cc2df781dee1adff691789562a8a84e3bec3ef2b5604", - "3314fa808d932e6047e98ef96fc308f08c88f3f5c7ddcb8c4409201509be47ff", - "a79d0977ff2aacb8638b1c4331abca78cd1fc289fe46060f50a04274d4450828", - "8edcfbbb9cc9b390c929f2e2ce87ab5fa6d449e24c231bae49b64683dcb545ee", - "f5a3ed227a11492c5084232d5cb525b19751a246eb90d7a7fc6b9e8c4d1958c3", - "f6097490a7d05cbf8c64ca725b81d8d9c09c805b04d0cac069c7eb5f19435843", - "c4e852c75b45eff538c764d8d142a6f0dcb4e80308883ad79754e656b8813cee", - "e0e3535153833e0afdeccd089fad003a9d5d4bcd4e53063dbf0abb4828a1aa06", - "18a186d37779d10d8a46603594cbf7832c7e39ba9460f95edcdcd5073aa634fa", - "e239a358ad7e5eeba8285db9de65f881a3cadb64abac5d714ffc98e0fadf8265", - "eb1adbeb48767145d24bea6923209228762d4e79483a1164e5677c47abf1035f", - "b01a1c5ffc6f193276ef99a43bd582dd6fa442b32c08e1fff55498263bf78697", - "6c696682a45ad0de4419c314c689dd51abc0e7baa6ea7f4ad48205b102d9a0c9", - "ff996abe82b30e678ae1b863f235e08cf7c3f379eac2cb753eb05d82ad83113a", - "d8b302e4a155f911ca04da32da13e711e6b7d2434d5c94076930fb67c1ad6a50", - "5a56d19558cfc8920d67fd00f21dae2f37252ca65b3928fcc90060c2efc255d5", - "cafe05f7ec7ab1b673417dee3afc15d1c12ca368a9c08d8477ff1b4dab8fad53", - "0428655f1bbc072ed536d237d13b7fdaa2ca47e60b9b6fd147fb1e1b1f601345", - "11ff6c29d8beca10421477b7a53f99c08a81c6934b0a4c9e9d6299fced3b732b", - "255377801776b61a8905b08ef7e995faedd464f588f69bd2e3b47b9c57f0652d", - "85e00fafeaeeba363cdc7e8d079787e036b679f443301c618414a2fcbb968785", - "a04c57335f45371caa182a29df405b77f121ed7d7a20e44bb596a3f8b8ac07d1", - "64522f66dd07f5cdc51223f4e1fcece136f630ac6514fd4e04092bae9e5662ef", - "dea6619c4f8b2b072a866a1cfb6da3149a04325276042163d37db16f0fa5bdf4", - "1d41919fdc9ad8c920fe34b33b4fbc167444494d5187849a45e19569c6e1fd7e", - "f35ce7a7c09fd226ea35b86a73aa69e13f74ab9dd6774ab6f58445e217d53324", - "d5aa5ad93f37fa6b8e6493f4c78182176658fab4a7dec46b5160a8fbbdf41add", - "d1e01f6dcae7b1596ef7493f43577a5bfa6443e43d7cdbfcabba1adf74a7fbc1", - "bd5d6387275521513d3032af73f59cad588c0367541d966b1679e4450bf36a5e", - "b45a10fdac9ecc3f9fac5853d1b428bc23e885da8ba2e17ff1d112a197a2ba5e", - "81a1b85f1534f980aa723156f850626a357f0e5878c25ae7102717523c84e99a", - "12a9d2fa5928afbd5dc7e3186f5ec40da614ab44c5ac1711273f017905c32782", - "b9c4b51da886ade0fb958ec7c9bd14c8d4d695324404a638aaa36df261415681", - "b94e737ea4fefe8bc738ea115cc44c63a85c95d4881023091dad6a6821313f7d", - "b9bfb14613ca75cec4a3b0d2a935cfb66fe919489cee9283e2f2f67cea2e4031", - "2a85779697d6b40b548a315373eff4a62667b3fab54e4d7db52f887f557b2e47", - "83717a29fc3337afd291e7bfb89d16efe8f36eaa58734398f4a92f879b8b5b27", - "b2506686c9c6aa08aa95e2139b199520542f349e72f84091703f05af101549b5", - "bc7f2551656e7a532e111f7a9d1fd2f28ed1100c993b9931fcdbf03520d35116", - "9175489e03ae9a6d2c60020d020f8dadb5cd05820ba8e2cb02c50d2749042077", - "aaa17d34fd05fbacb84e9d8ba36e0afe0bb1f9b9e76fd1bd7980ff538a598385", - "ffc42bf36be22bcc6d47fa7c9523fdd20bf5be5c4339a180df8f4127f7a8ad8d", - "227da2a3855c30922c65ae175b1e4627810a5add8aa7ba9da6cd1f41b646cf25", - "9b6481ef827e7092cda58587fe7b8eac0c384bec9829d4a1fe0e11915319fd91", - "e45e5ab08edb74b9e0abc92149f4edcd071b33e6dfc7e5cd378fd14487d856c7", - "d7bd6e69bab79e085a27e326cf3d42759205c4fa16225b78d588dd24c987cd82", - "76a8fb7e5bf42ac2b2081c0bbd55c4d162b0fec7de1277db191dacb8b713938f", - "3606e3cfdb9dda2ae85720220e6de62e57c1318ce74cbf6a61b6026ef8c44a61", - "e4316d89caef1ad0efbfc1190db7a7b9727129d1c061492a7d2b9c7124890bab", - "7e42efd2d03aeb6ac48928ce285c68d9262fa2ddec3c883d325d02e1798b8605", - "9465587a815d3051c026c641bdea3f780df7de33f8f5cdba22147d78618f3027", - "2cc1e169deaff4917061864a959b721313ff0bc7b95f500e849c0b9cf8f612ac", - "41139ca7f48d48503b48a31926e789c876c153efb33cdecd729582379ba1236d", - "19aa68c5babf5b889dc173782d777c0f66926cd41498222038755cb570bfa3d7", - "e2955eedbb4ab9ad9876472323d6d74f4d3814f2af159ea502d9965ba8b0d351", - "952767c4ec8c670f38dadeed06ef1094a3e13de2a2c6ac8b7ad5aec4442f7071", - "f6a81f4758db3747ca53346b2675bf81bd05a9d200fa748a092a2c0a134a9d7a", - "d0d63aa64838a9295ab83e028665165e78785c5f69e00076dfac6bd21d701253", - "6a8399c274f428a3e06d9a9c8335c4be0317fcfdee5cc8b30197d1cd360686dc", - "d630294f291d29e50f9e63e7161f929e32b7fb31866970ad055f3401e9a77a44", - "7b5175760081fbeb32217f973fe4c77882b474ec6afd0d1b3ff2c14a099ef3f8", - "9484bdf6d736764d70a82f2a032a6f5e1c4d8012a7fcf73c5c002fdea8ea96fa", - "ac9029257456c413e52d76a99634cedd75b253f97f4f79eade9b31b4aa837fcd", - "4af06f1d6b37d14626c790f21e64cc17cef56b2bbfe098d775c20a305253fc55", - "52fd691ddf77d5bf19723e1e17e8dd71b99fbaf07562bd4756395251a326f1cf", - "a175a56ae53210c0cb85a1375a565c23e8cb85897a4b440b40bdb9536a51b956", - "05e7ab94e3b96bf2f308eb002332ebfb48bee69ad335016ff5d9d5b63b92a47a", - "78e8affb330afa0f6d1a9588e75042f66e74272d393ce32a927946f43bb3b7e0", - "6c0189537097d8f7f41c7548f6bc70853ef87d56317e7182d79c2702863d24c7", - "4621ba5c90de8a2528ac606e39d0a7113780a091d3d48a6a217410b1c4b359e7", - "d8c345e0c4a0eb7940f7340e794b012050d44dafbb6c94538fa7bd24922206c2", - "cb3c2f8a05f45fe881bceedbd4366c2e88d6b31fb1affe861eff3873f8885a84", - "f3272c0a321ef2ed6d4f25a25f6fe26b67abe38954e7554b3a9639bacca6ea95", - "d507347c5a031e2af1c563c9466b9b51216e2f5095a9443a336a5f41339f8cb1", - "bce9197d7271bbaa7388ba18814cd2aa35451c0ba467ffa84258041092f31e8e", - "c2e983f69f4b71ff1efb5a2673e31c0f53bf1cde07172dcc3a1f48e15d0eb754", - "c772716fac5465f92e6c258c421cea48cfbf6604de0efc325affc016b96b67e8", - "a3bcca1f3051b176fb559e1b6ca0d0fef4c979862d9b6c88a36111785bed530a", - "3a404ad6c38677577f150d08a4afd95562378fab089d16c8511926687bd4570a", - "7c6569c96ba7abeb65ffd7f17943ee8be15548e0364d94beef3d7616244c1e9d", - "d2c75b5329b244727ab42a281e8b587b8b70a68dbb209bfc8d8c90d95b83acef", - "520bc79d76b1d189a0eb08e5fae7c141651ab017481b3345573f1c069c1d4bca", - "18bc62a6c2023b465edef7c9e695616dea99d7d24561f22dee474ce5734411d5", - "ae11d33507a5559b8df1439efd5655209aa71a2cafd974ec3c701aeb9c65df39", - "50c65ccc017ee80eaf60dc055e3437ebab7a4e61d67a8e5c5b995eef40c9bb19", - "d6e6652f3255a85925ab709cf55a53d67a9f01260acedc731ba79dcd96d2bb80", - "a3ffb628d84557739cb8dd10ff29c756c1b0ef2174607c68f49773e4052c9713", - "d8e257db4f11db0c8a94966fed61620c990ed864250d164bf12e91637422917e", - "3c52d1868eb691908ba96917b11e15297e03c3d273862b7338fe4e4e8d2952ca", - "cb9342c2ead343823404c0b63824132999e48dcf01090667021304260785516b", - "ba5c19534f1e0afa7e06e0ba6db7f0b74ce4e2449771f4a6569250674a228f2d", - "ddb3a94fdf3bbddffe184d06e85037d7f362983a96425161cfa7886c8588b0ce", - "be81f8212d3a84f2cd3cf05c9d20836a0d42983928a3209a1deb78d265871f8a", - "1c33c04cfd7751ebee1068f0d533855196847c8ec042e571212bf6b5aca83947", - "6f1e22e649f0e831a70183c6996ad9e4e60a04f72f86c4a966401dc452572dfe", - "0f4afd5616e4803d84c2bb33ddf5cd5a536dccad5d989f9f8c96882f9725118b", - "114e4015e0c568264993ef8bb7a4d7a90bd14180273a6e4da2a384524737b5fe", - "194f0d135b699fe7a4c7c960bc5f1658347340986956a3d63e5ef630339abf10", - "c5660f61ed0f0270f04d0e60eec5fca9a46bf1e2cda94ced62c986777c53aa12", - "c0a3df44f64a929980a63e9c724043e73f6d69a6f5beaf127236c811f5a071a8", - "799a3563ba67d7e510ad15c1535da77fa27d0d2e03099bfd20158527b7ec1b95", - "2a9b4ee6279a45688f68f35c6b48bd5ddd200813fb965fab2c88cda801cac467", - "0049350e49b110a12f34f587bf423bb84dbacdca2e774920ef3cc5073adb5d04", - "857f0ffb7547cbf0665cb8c2856f11d65c5a7ca496fb60c032b8c3319934f0a1", - "a4f4579e39069edcba8638e39df1b4d9af60eeab096dc0eda341b2752a859d3a", - "b91b99b02151dfc0d9cab97ddbc4243bbf432861d7ac569ee3a883d2652e3846", - "d9a502cd3e18de0278d1a36257738feb28c5ca13313f17e17826e9bb55eec3f2", - "2825b4157c91b3d92ae4a6a9ce8fc827474122ff066cd3038faf85e4e1676776", - "044e4d564402b469328c40b41445a78261578d2b7e046492f67d0035eb0e168c", - "662161252141a2e0b66152e5df06a9cc1c0ddb3eb05c03d80bb6102f04fe128e", - "e8a99637b0d05627ce8b0edb7ef2672bb6121e608276946951997356706175e0", - "561662dbaf09718200cf4fe5f6dd0fa84d65f6e6b770b0d5d2db097a95e65a39", - "93789dba64ce690d53dd23efc17afb423e83e19b810067b516e4818838de44f1", - "02a43423cb3c57bd0a3fa44cea38b5c8d4dc00b5f4c33deb2499d9428e048bad", - "93e8e9e565971bb947ed187f5e4b0753b4356d388d191e8751d9b3898cb0fc66", - "47464c39d67e775f987edb63a859f60132fc2ea8140f062a36198b0045beda94", - "83abb3797969c7ed6653535f11f9f2bd86f039a34bc29156865f12a588df81cc", - "926071e4fc9f65b3c071d74cdfb6347634733f996a11174cfdf3c738248c3e40", - "6b334279828470f154e9d7cb01d15d116a7b1834417529d6473a6d96fbd310e0", - "908950865ffa23438e4ac1d1deb5e57cd4906a64f0ea562b9dc0060be9068427", - "03290c99a5905cedb90082420438df45de7f95ccfe8072eb9cda1bb63e8386da", - "683859a04cbe62488c1a8f711d39c743b67972c7b5cd78cd51bdfb16278165e3", - "52647952cec43dc5332fe6837e79e738547b45601d86425db994760616b656d8", - "f871e75ff1ff626b0dbaf715b9ac980bcaa0429ee641013f782ba3d8ded4d3e6", - "5f6eafcebe97e35bcc61c0dfe960db5e482f3fdc0fb36c00f69d695b9cd60891", - "2770b482c10ce3498ad79530824c502e1be7b69ea7a659c270194047dd632b81", - "fe7415789f655ebb9f6d1ddc365da90361283c9138eb33ed4776e09505497b02", - "72f79f9ef7f8c82e292da209a7ecb6c25d49165088458dcdc71e8d7d5aa16efc", - "0bfb23ae7e9c318912bb3c671371d237700cd6d68484ab34da630f142e782cee", - "d667fddc5027e6794ed509baaa871db537949843fea7992d64dc4ea34527bec2", - "cb90782429aaa44a6a426aada9c0891c1de8d186dde4b331939324210ef0e1c8", - "ead09b1375d2b1408ea83327398b9d6cdb8134c0eecf620a3d1c3614eb71b767", - "a3f136dee60e4e055512a593b4c105f64370b73f8669c6089f875e9bb13190ff", - "a7741e8bfbfbee0d1abab7fe4fca5d6c6e02986880da4061c0fbc5df2a43b0b1", - "243bff773578a1c2ed89fed768b8f61d6a69ef0d795cd3b10d3e217c17c557aa", - "71581758262849229cd5bbbd0e56083ffe5cde92ebe5b6dc4ee8def53a0ef364", - "4001ac035af0af0b01b8e25b3da5a4c68523b3a9b8db5b9b1bdf91561fac40f3", - "931eb524cd2fbb900b8bb08959a979bee9a475b93e4233d6781fd49bdda7164c", - "e91fcbdea70efe8f9fc665e626d7dd1ff9612d9be5d720bd10d3481a92997510", - "cef8e974ef1c2a3fd2ff557bb93d12a54a806635997e0ef78bb59ab29c6eed81", - "d8ea3a22735d4b5217510f19b622fd7714443d3f154aafd16e68a4a139b1fac0", - "02b1de19fd7513112074b6205da072db9877bebe6204d063be3fcf123ddbaca3", - "8581077d00b02898f87504a4b6bb1eb42ff9128a80e228475aeae3fa4e2ea4ab", - "4157b83dca5a93f9b0e5f177cbd9bae1e04523cf62ab1765e5ba9960e1814c97", - "d88f4f6b68aa6c4a8ceb4b2c29a43ae13f99507132790805442eb118e5491b6a", - "2997bf786dd983076138135ebaa1b79e961f0f9c4670617dd023c9864effedd5", - "808ea49a2a0d53b869d9429669b51b42e0395e6c3b03bf0e478f3ca3da1abcca", - "c5f4bb9cc6d42bbe2d5ccac42e6a1fd0e05ea1e07be6a1d3b02de0551fd0aa95", - "725aea8f554cb9dbcf0db4c71452b352d18bd2b71f85af2016dab1cbad12802e", - "6bc267d6ba66cfdd0c2e38b338a14d0b2d473049b4c7b4e26352c4d1787a8f83", - "eb573e567a0b3a19d71417b57974f5ea80ea07f41e3bb9c95c659e65c69cc307", - "83e3d55eb9b50eec82a353181675fddea0821d7b0e145919afb96dab61215c89", - "5f9a747f3d1fe48aa269c0f8a5179eaface12020ad2276580796ed3fc4e0df51", - "199b4a7f53d1b019a22e072007994329c6850b5e8f73c8071d27a1c1491889e1", - "17d9c30603108afca0e34f91f8c932e115eaf426f8d0e4b2619a35fa7b3658c0", - "e855de3f0fff3540023b3434c4ecc824d2693b0dfcba6fb5fc34059f71cd3d5e", - "2a302a87adc5d413de1e0bd4a4f3b43d892ef54e4eafb0b8143bb4415b0f9ace", - "d898e5439e20330e8d1f6bcd7005b81b6b02487f41e96273dd4785db6bdfdbd7", - "9ab95e4c29ecd30d4ce96734144b548326bb1853190995bfc9969c03b1f60efb", - "de58bbff89ba5d3ed9e87212511d05a3b0201523b21221b93a650bf40ea71438", - "0d77ca69086a01bc3d135c89f7c646255f692572a5837d64647e885166da1f89", - "1acc4e1c2b5e12e38ec2ea7159c629c8526c54973d7bf1159d74bb01352e51b7", - "e06167d9a3e1b3bba53be3dfd035167ebc193345d35c59eca4802743eb48bf28", - "dcbc690af5efb9e3f160721fcdbb8aafbb5bf534e3051313b2ad04a798c1b2ae", - "64c934356c2be662f642ae1c33963dd10be54188640018863f9cb6d1a7f549a0", - "0412f64300fd633154d35dc8fb390887486371fdc173407bd30fa9988c4ac161", - "2da8f7488773e7cb21488ee16b2f4aaa34355653b1746190916656b399b7ef24", - "7a13f6809dc5a2748beee7beab50223c65badb5df1a09a38b268d0ca91e2d4f7", - "920e3e01ec15d6c53a310c4efedfab5cce6e1fd88fc7d6870b219fe96eb002d6", - "8dd4b7260945eeb2ccb2759e99c105f5bf654096ff8c56d5d7dc06df192e7b91", - "0ef1b92abd8d5917288fdb0aa019d35148a7a288b34c498f0722c06e3a39bc83", - "a0c4776ff1b106277bb8fa9349e614916e6957cdc5dbc35ab71a4381bc04359b", - "572fc8b515d3a3afec671fe7ba78fd8887bc7b28db76f40a77e852ca287e1d5f", - "a127145e920b886520601eab142c328f035f1124ce3955b790968cae08e4f5df", - "f98658ea05b71d29fa4740173316a6ad045d9360205512de15fe6b7952f1d3e1", - "38ca8550ffd5f26dd6e5cf8eaee2109b5ecf69c5d74e6b776db0084f4ad69970", - "861a5c2f3bf76e7a585c3bb38d8ba732e33ecbfb9667303cc3c317c310afef77", - "11abce69073ebaa01b682a372eb45e6b7ce092a2a6a452c77265653a456ea6be", - "161b6a7b82d57fad14376c6bc335f27947f93e06b7f63289c5d3936ce2ad4e30", - "e25940e71dcbcbbf649d2d6e5ccfa524fd46870d9c7d3845940ad1a42b8509d1", - "8b879cef3053e1d9e400f97281ec616e58836f4eb638b4c05b42d7f22c72afdf", - "f45bc75c0b5c5cc7483456a87b3aaa8734f53bd14d946e20e6b53dc32ae3b3f3", - "12e2144e41e32f20a349a19f62d9e18a789bb41fd9e19ca04de28e1a95d24612", - "63bf67f0149c6fd10b35a62e18b2129b43c76b66c74207ec48f027738d136edf", - "81de6cab616aa83af397daab50e3cc31bee46e4499a239d0c25f0d78a37de4a2", - "c27ff992580b253f0c42d7d267c3142dca7da939b15b676a78fcd07a8274ac3f", - "f237a2518f2ae656e058f5e11a127edaeaa79ef71339f12ffc1957ec17526077", - "77227a0e5eb03c6b377c5d11341bbb00bf791422cd91efad21be542fda91cc4c", - "c08ee9d46a07cf5e8896062ec5642dfbe69a299c79d89be81ee28bfc8a1d29fc", - "02385f65322a5f30ed27ba5b926004ada466415ddfcaaf304eab82fc3dc06b38", - "81abe384471c343c4e6a90d5e302555768ce025b7b606df39255c52a7f78dd93", - "3762c3b65bf0b03d720ad989e8d3cff6f568423bdda4ec329f2b7eeb1596d9bd", - "a24e32610354a830915e5f94d4fcfb678387f647f7f4161e2b4ffe27492d691c", - "440b89de64ab4abcbccee2353c508bdaac1af3ceee649b09fd69ababe4a52c73", - "8ffc3e676a8c30948bcf6718e50ac87aa957ee48cef1671c2e829e4df1248f63", - "e0e19634441846b0682476b72ccdf88b37f550b8f5d5e5df96a4f8157e0225ed", - "03c416d59aaddb9686d953912b6f34f01185c999a1f7c8bbdcea570109d9cd07", - "0ac37373c64ee5dff9383e2149015b137a1ac29e4521c2cb559be6da4ae8b663", - "b1fc0fb3fdbb761ca945129ab638b9da64c327303d4ac84ee8218cfdc1f993ff", - "3dcffcda05b80444e9d73667b6783f54bfa2ac72215a95b8dcc4895300115b3b", - "ea3a7afd062efba84068bf6754a83d600f554836de3352cb68e2a4300475949d", - "03b6a8b184165129bffe556ece9ef07762d26e5f4ef1796282be4250230ddfdd", - "ac3229b31ffb98c59588edcbf1c222ab7aa65f4391ac38a1703a67a1a93cedf6", - "b235efa39f297f621cd52740bdd990d3d1965ad1216c4dcec4d04966649bf7f8", - "6a167be2aa77516a8501eded0fce17ec1d8ee94e10b50fb223d601e1cf2c99b2", - "87eb5f06b2f262804542d62198f871ac4a5773803a4d2f6e690693b3d1fb380b", - "b929450522b99cf948558451f1c71bc6adf47820692d1b5d675b098b050c109f", - "6789174dac80c2ed09e8d41dbcb0764d304a21b6d2ae00ba4298043501721c13", - "a89ca60081c6b97599284f24c8caea93681bf2884b086f0d9c25085c37a139d5", - "cac1092fbc3cb9f66753a6cf18d370f05e665b8f69d1b0b0e035ddc434d88b35", - "487a085a935776204b8333e5d4e0dfc60971f2a69d77d8c197538504d3b6b8a9", - "9c548234a300310e407256b58197c3881be5aad6dacb7b1a39ea9e79a895254e", - "4f224b6f5f6326ba92898ec28e0f9308897607f938a056e4bce3d2e6ce4212a2", - "c3936c6a788a1d1ef444f50838ba899e82d538583180b3eea3f978ae1338c4b1", - "017e89fd25135e289d79805deea253ec2586185ea7d3619e37c72e52e61c3974", - "1259fe1d5c3a4f3fcf80e728b4ad84c94f4c184ffbd4a1708a0bdb2bea8acbec", - "e9911f5899e654b26887dc25da4c2529ac376226e191d25e3b695dd05f18403f", - "de7fd47d210695997d92a5c6b748f772e64e39b338e9842cc10cf8b9080a9b70", - "d758381502cecd3dbe20e63745eb18146c4f838874f21e038c7f9a1fd01ce06c", - "ba6c3c0aa59ee521b2c241efa68f022c396d0d5cf170d15bc67b4eaee8052191", - "e27b5ca3c45829cd0af8bb7ba8affea0e5614caf6875d8eb1bfa02cb6fdbd725", - "869976f18880b189bbeb47101a5d25cc8aba24bf6dcee48a1c4e05c24b1431bc", - "3f8f4dc3501ce4cb0f36da9060ba3d8c413313667807d0210ace517814135284", - "b49c1b9f8b9677ddb04290ee74ee0479d1fc41032b418cf4d9642d525959a2eb", - "b4e67e89a4750dece3a06a3b4b6284111ed9bcd677bc1e5dfe9d947b6f2119d4", - "e147bcc160b245ef87b13df3255e645ab567baa0f957fb9c31fec90446b51635", - "5b659af166e2933b558b1e3dfa3f4f0d205b326b90d830732c4904f5d2439774", - "36ccbefef04a5f69a79aff3fbf916a83806b7091e89472a62fc8578074f0dddc", - "8d3b85684b5ae4037ca4392e1ab08032880b77cf2e35a3e84a1215e5e2903e4c", - "d0265f8fec46d1705cb9c0053f15d22cfbdd5164decf1410ad609aeecc0821e0", - "cf51b19ddc553e396cc76aee26cdc5ef81ba2fd47183b79b3929c7ba203e61b5", - "932cdab2eeb4d2b927bf39cf0e90f98a86382c3f792560c6e42953545faccdf1", - "302b3dad1cf975d78d98908391cc0b285bdd5a22f126317a6630874aac073155", - "aafc88d41f2ac5d39d0a5126b601baec00b09787a61839d08bde35c6c90638b2", - "e0ae7a72ffb03ab9ec030f4e46096457bb9f6b22f54209ceea807afe9ff88685", - "6a79685882a095a927ffac0d9127f231126ae7f5a6a8d8fcef68137dc05734ab", - "5bc3dcced1d0616ade4f41af1793cd0ee49701d6dc207d82cc7ed3ee9e3e1a67", - "ec012de62de2988f695e414bf80ee5092f1ee7b48ef26e08e7f9924295e681ce", - "d127dc844104a8c1cf6fce8c4064b474d66e3f24c7eec47e41ae66b64d3ceabf", - "98faf87252510a82bf6264c150c6046ce8ff3c5a7dfd6b7a74decc014e6aa9b2", - "1b4e608d130f5e051ae7d3f46418b69ea98df3de948f4f3e445370ca4eec7642", - "6c81afc441b268019d39a3b1867b58c9ecca046cd89811e1557610dcff8c8f9a", - "a697d0254439ca12c94f82a48cc631b126e5ee20027239b30e8975a634bdaf00", - "31f88870cb0eccb5e149be9390129ad2f5bf26dffbed049fc9b0703b8cfd09c3", - "3eb9d5b34b35b7e518aa0c180a2ecb2437c658c82f8d8118e569c6f6d4170ac4", - "b5051f08e9e9db9d90e5dfd6eaab1b0408a7ceb5b13a15167ff50965854cae50", - "5dfd40c61fd23817ab8982da5eac8b59020ee489392df511b64807d5dd8c8550", - "fb8b2515b243b00af081f7a34c02eb6ed8abb034e19eda69ed192ce2091c36a6", - "120c5c30725102642e367bb0f2e08862c88da108a378ca8f7436bdc6a2e1805e", - "7f84701fd82389ce6896d776460eb59459715c74a9e6a75293d64258854bcc5e", - "cdda11e9ff8db95e671be37b3f09f2c19884309c75b204a3696e2dff265952e7", - "a35af0ce93b6dd0348f233ae6a1df80a1901362a3c5e2c5d975a83aaa6227f91", - "fe7fe28c37a15138a6570b075e184f3f49a44e21b41f7123c21741e4d1bca718", - "22e729b49c2626d945f2086610af42b1e97c9054e2d65fc6005d00b837360e8e", - "9acefc886527cdc2e899fdffb0eb9dd6878286b59ae4cd6ab92e5824a3cec0da", - "bed6714d9a2ecc491addee039db8b460caaac13d2dc1b72048975db0ee28cff3", - "03d8085f76b4db3208f89c8c335e0b9fba7d66f51bb8834e967cf03a4e1b9213", - "01ac2032660dae3057df150ca23316fc116ed737ce652de45ba4b20fd9a912f7", - "a55e0e6672e9182f44c7b7199e9a05e01a345220cfd06949768b289b52dc6ca1", - "1a67decd67a828cf4c79f6d6f14da3b3564f907a10461a3ffdcabb34a316e9e7", - "f688165dc32d9047d3055f55b4cae7d8ddff71e68917c656960df165156eb9f4", - "f72f679392479b46698bd29618c758d93442830dc636cf32c9a52fef811f4dce", - "a9cabf900f8c97d2b8a083b29b38dcc322fbb206d8d2b3fa79764598336433b5", - "a9b2c1bf950c05861f4024e5844ba0e127575de16e7ec05aa7c72f23e918573b", - "f2d52b4fac592dc5d6a1ff7be69a69fdc582ce8efc70b632cba90ab29758e05c", - "2dd4e5610e14717c5b845e96f3fd2c49a73e7cab00e475036965e979eb3c9ba4", - "85cdd3499005a52b3433b1c70002bdc17ecd648c0666a4f3e8e0a93eca249eec", - "590f76c3e16ec06600163696f684782bb58eea6f6ccef9656e92e1e499fe5b8f", - "458afe6c28501a2e09133bf0b3177da56301ef8b1dbb761a6b970673f1c61f70", - "08b61a8bf14a6b4703aff0917bae03a6f25ad2d4661be7a13cb5d47bb4c0f96c", - "409f19d72bec571e55e4885be0e37f6cc323a1264b0eee40000f32db25e6d21b", - "b301b70912cec0746811c94e250b5e062029307a7e9684662aea362af3309c40", - "3d03be7df0a8246ffba51bde358a6e9347ba2e9f781a5fdeb7c027f46547c0c1", - "bee566c0c8dc55d748ee95f852085cbdb0d6708011a472d4b17a56931e95a3bf", - "212d138fb998f2697c45a189b8c6848a37cbf8f56401a3d09a8400251a7aa38e", - "8c5de8898249b54dc202574e5a06e98a1409207ce970b8de548892dd2d27b7e0", - "e5ce1d7757c7e54a63fd394578616510ceda09dc66dc3d2de8f5489e0854418c", - "a1cbb2c5f64cdcb2caec78abb34d084457f1c70017b8346a89d792c8c117ba3d", - "3100e96fb0d137bb7fe973c87d117e41ce585a24877af4709f537e5bf84098e3", - "c098dbe078e98d877ba20de552fe1fad80d542ee4d7e6df96e5e07d74f34a6ba", - "836248175249541230409218f03fafd369de11102d5ffc4e70f59c88d93b04bc", - "267c6b6ce1bd0b3a23664a5cef6d67b50d8934edc49f368e783f44d5f559f5b3", - "22683ca19e44279144f7fd3b524296e41c48c066c40a1af7fcfc618b1f45e2da", - "15d637adf83ae1cb2a45ee0c9b3fb793861331fa500131014a46fa8c73b7dc5b", - "7c0f3eecc0f41145104716b27f3aa77d80cdebd55e78fbb4224a8344cba31bec", - "2f6e45b51edcc49ef20f0ba27b7483476e700526f219948fd603c0b3cc41c46f", - "2f434c9a7af61dd43e616bea9c2723a78f148012f9e3657604233949fbef1ebd", - "d4d87518925f5f6172149f863161ac33a669c785aba709cd9a25a4ef1fff3ab6", - "aff8f204870faeb5eb2d2ec472ec84b43b701e095c097f42d98e6c1e72ea3553", - "ade0c409b1cc6d6f4e7eae27f7b8e6410d1c942d135b59527c683d71db7a389b", - "004c837c910ace194a801b6bb6e54d52cb23e03441a5190ca73cd75bd8b9e167", - "2db006f643966691bc6ed7d6f05241729f9baefa2e9cde81837486d8ef91f163", - "ab30fcf20fdcfc61201ddc3061a219972a8b7bee21f19241f49e0951f7b1168f", - "0dfdcecbb03d3f908f49010944cce3adf0e98c6054e486667f91b238449da224", - "e067d1318129bc5871634c4a51d375b2e90ed1c544a59d1e53e3f553a6b92a8b", - "405ee1818247b85d51752264246de198db916248c3dcdb7c12ef76f736e60c70", - "0248ba798bcc1583cf0c9dd01a83fbf8ca330e8db03005e2ce5db2fdecadc977", - "451dc98882b646963e81736ec04e8d98b1363c02e25273d27114eda2695e8eae", - "9ab999169ad4f76ecb1f490d4ec7848af6e703ff9d407cb2a521128009253660", - "d2653371fcbf742fd5d805b8edb1a45ddaa0f4cf4cef6e93e6ce4685ab6f4418", - "e8dbfca95e6c84d4f02447031673a702bb32e71cce3a1b20dd5e47bff1d4914c", - "e9f79792289a1ef62d595090cd8b49ff4c58f62e08a6a014063cc6fedf06d231", - "bb8c4828486b48c2d6fe702b2992223c3187896b8e40725be57aba044996511e", - "53a1a3621fdc01fcc3ae8635aace165bd32df8e516a4706baa28296626c482ac", - "a4fbd150dfcd1d7a6623f71142955c7efa4a0d79839cb1df3c0e4a9204d1eab8", - "68771038bf6ed087b2fd9e90190c2d753f9e8365a04f8df2030dcca58c886ea1", - "f59de19f42565caec414f393297d407d3cbe9fca2aa104215f89e7aee6438905", - "84e0be9b4255c043d65646e2d152aea53bd9fd826d5c2d98107082f6e46e5911", - "4d094a3b0bc14ce8eadc5962d8d77348cabf6c5a1eef5b471bfb014c7dd77050", - "eb52eb48c506135901c48933c598f369654a757b19e77519edcb0111d2aa9d56", - "1c40f735686ce838ceb5db0333bc07958339f32c467e3bfccae44d340314318d", - "13921de08076052690f739bd6d4575c450c76885d7108c936637ed3cdf540da5", - "8cd37814405d189b071f6ee44ff8511f8295ae9e2d2d1fdf027e79216db93046", - "7c4def12ff7cf6d3c4a4e932a36e27e22d09d7e42fcebf796a242f02b9cfd4f6", - "8d34fe93bd4e180f02dfb864a93127b96a48bf324090d5b3090db833f41fd018", - "1c479ce04636c14693315beb5eef4226d0f39f3a02a6938fad49595aa158c05a", - "c77ed88c460359c59135b0192231f1b81ebb298563b16a9c31ebeff5240622ad", - "2967c49ab7059b44145be06959775d788555826d897fa483a025f18b5c1cddcd", - "ce1afb677c24a10fc608b70336fda07060b2f8a838e419d41ebf8dfda733233f", - "9bbf38c58fd6923ad88643a2368fce75f5bb9464751957e26ecca51caf95be5c", - "7230ae67ef5b09f30ac339a0365cdcb7aec795f5d2bc6aafb94211460285f56a", - "949c812ef032b108dab89454366e65df903d3dfe12fb591384209dc6f175ac3d", - "7593c98f78e6234af97f34b90c0aca1667e5b4548f238ee5900cb00a2c25eede", - "a5983032700976f11f05475d179b95239ae2ecff96b5b940b02f9c88afaa3072", - "eebcf22e8c8888a07afd497390a3eae17b2377e80492b16124a72010c318ab76", - "038cde33323479d9567edc89bbe7434939ec8a0949062c42b8c71401e5642659", - "3de7ca08333b1802adf752bccdd687379422e9cb557662f51f6a3dbfe2706fba", - "3db1d69e7c820a879e0fce9554c9b9842dba5fe1fca8f09cb7e6573b72f72c0c", - "0f556cb92e3798b9e647f2c646775d634ea86ba5492aeed6bd30b628fe5c72da", - "96601c7baff0e10543f6b6a1e089e013a84146a7af237694fd0788d0c248bbdd", - "97ec86a9481adb02a0706b6b225f0547987181814b70831463731135b49b89ab", - "af54d39b17fe7f2ef5a5ae09907ef4074e139707a844ae73dd72c5c52c2f7cc9", - "65eebc1cccab64a033ff79102e8256c619e6209d87d82d8a1ccbf5e112ffb4f6", - "079587946fa9e2e2d2e8e8f2c8d54781ebf7ab0b260a559a8e1eca0006344b1f", - "da52ee668865ab73a8aaf92f0136552dcd40d24d7d1ec5e4648de47e6145ae5a", - "d065a883579fc75d6a90ffc994af0ea8e36d1f7eb18cff7d317db396d895316d", - "ea81942397343ea9f735d5f3d7d3f2e8d38e57bcb29a45422fd7b894dc86933a", - "deb2ffd1508ad7250b163f1538b6f99e3209220648095d88887e11b68b9903b2", - "b26c7ad24b55aaeaaecb6a74e80e3f7a8f7e9c0a7b5b731a0f2611556273c452", - "a3c11fcd554af23bf4d9b3e77ceb20b308aed24f7bee9b70170c2e74a36ee073", - "876dad5c9ad414a7ad25a4a2805325b71f34571cab129662b8a1862e9485e169", - "24f42f6b76150c8d8d87b1f5c28689c522833ff29dfb97c64a16602547f7c9af", - "dd42cc65f939f2f59685e6e9b959a7c63aca7d7ba90c6210b72b8ba2dc71d3ea", - "c0862e94947f7084a1dce28d1bda17572c4304a6ddea73e2ebd1ae47979c1ded", - "b3570a0ed7bb49bc197af35ac59ac90d2dfb4bc7107aa194313888f2df9fb6da", - "18b7c3c3dc0179be736800bedc858aa16b2c50c384a9b6355a8cea4e20638c40", - "6e425b288d379b08e0e5521992dc18468e6b5a8a9a70c7f09ef29138057e74d0", - "41dae626aa4e5cb0afecf56e27f5b21b0cd2793b736a26d231a7c06eac90419f", - "909bc1d7424520033c4facee0142d353b00790f8aba4bcfdf3a831bab00ffde5", - "b1de7680830586412854bd67461eab9b47aacf85134c3224254ef380dd05d5aa", - "0363924c961c26551ab8cb2f2998503bf3730608d01e40a773cf4a75194409ca", - "9fcb5232ac2bb1be5e0bc34819a5ae3add05198cfaadb981ddb417d26a2aacb5", - "a12169f4a217c5bccb4afeb9867d45c9de2aa0f98692a8fdde786374f9444640", - "0d44803aa24068db08c2c4872d7b5dbc488841ef4eb85eb48ee1471fc715ffc6", - "14e1750863848fd5b88e6557df0be84ca1701bcd8f377b02582d9df75ea6acb7", - "cc6fde6b0f36f625f114168f303c8c4b5a1144c4aa80a68f4e7ccfeec320dd33", - "e5012ab0e5345ae5a02a6525553fe3f1bef970e5d9691d171443a9bec78d70b8", - "e3c121d2355f06a3ee79de8b86ad7fb52f8d672783f732f03040e73b520c9ad4", - "af09b92a0ef7b47424ee3cf8e186e627f817f36374ebc2f27f3b02cb179760d2", - "0e4bdef1cc704022aefdb36c18f1ba05fe7789301f3bb0381c8aaa101e6a24c9", - "bd7fcf1ffa0e5f6c6a9320a13474f973cf7c0ba4c894113b6b3a8779f0bb973d", - "144e392481e7394920ad3f1737c3a9e66d4d2bd712f2f26def5223084851a240", - "f66e46870a180bd14761103bb26d150590db624c52bf552bf4344f2cb1315153", - "3eaed89913a11fdbf54e7e3a3fd94d5d428a1271f3f749a10351c961478186e1", - "f9300eacb533730242916b810f4b58c420f693ab9efb3cbf064152e4ab734b34", - "9123b72db6a1ec1367466e89fb33de4c42802afd1baa2d8c6a425ef7066702d4", - "a0a99927cea1b9dc6fdd7edba37e20b185f0a1adf447e39787e21ef8c548550e", - "0626c1ba44727393a04728e03464b861a0ed656fad5e3d7966ea8fdf8e5ab42c", - "29dea2b83703016ecfb39b799e7ca03a4eacdbade0a12e5b78023d4d461dfb70", - "9bb36d03f7403a00bc1b3e7d4ca69e5f6894a480332022c21ee0e55870bc4df9", - "20ab90b68565c21a452213b86b2e385e7fbeede05cc9251b2f1f39f1edee52ba", - "61ed47033ecea39f22f1f7319d4e7afb260844653d4d44d1325253ad1941015e", - "c2ee9e145635a641643b9587fc284af0bb49f56cdcb5d475c210bb7a860a5c27", - "76ad6c50db20a04f247b64540d8506192af7585f2daf35f1846a79ac4e66c14a", - "717915849cb163366e7d19af25bce08f0c8c2782feec88a1f4f7d8c59add6127", - "4b29cdf0776ea2eb7c0331032b17261e857666e3b80cbef9329799fad2bf5a09", - "d5996a1925702d243c8b119a48c2ffdaef9fc271ec472df16666db1444c06445", - "16d24abe39e060c26ce3581d22cf4a1b2956c29643f15063390b0a815a68523d", - "74457da1559d9f6802dc4cb62155be60defa4e53b3eb7fe130426928aed4a5e2", - "586afdcdcdc5d23ea289c78d6fe321c0a4cc7d0020464694912e53813218e128", - "e0debaca32c15e40f3d0337dd37896bc23c994aa1b1a74cf0128b05f93196173", - "17122e098a15ca566ebce9cfd529e0e1ccc86f79c6d5df1a89f551f0f9849d54", - "277d12182e0fe87de79cd6769dca6958f10767774ba3bb5061a808ccee0ed57d", - "a568c3bbae58f4f25879b61001602ffdb89d2e3fd75abf3bb3fae025ec22152b", - "87ad82f4667ec7628025f8b5fb34f3ae0beef05153a8355623fe0db0d18e4e91", - "f705e313c04c9c05e4328685a99323aee02e642b92a854d5a0cfbd2b94525838", - "481c22535c2e8caf15bb4a46e3ca6fbd32f1fd730ac46e0bdd2d1e1654d9172b", - "b3f87042429055d038d78e00861dc74d8649f7949de1f6318e22d944329bf79a", - "c469ff6ed2333cc9b1eb9de6b554189630f7972986d724ad83b47f3967c5c3a7", - "d676a2dd06e660d7966c38105cb3c3866fe5c645f20b124982739f3da1d08e3c", - "32488b0f728e788eae475c5e8044034e7c55751af9ae821b4bcaecca90a79cfc", - "9857803ccf8fd35017c1e13100721011afc1673de65b60d5b540e55e8b0aca41", - "8f5d339aeea58a7669d8f771cb0883c992aa2d948b69d2cfedae9ea0e200c83b", - "ab16593046397bf15d6cee0a9e4b00426f5a35f3778826f94b4c6ebb114b54b0", - "2ff339a172e0dc22848ff7b3d971b8639140c1b372060722da5c6fc08e354ea5", - "b856c4581cdf2cba8d0df8de3af310729e8aaa31c5b4548e0797bc1ccb9f6e87", - "30a4dee0a2928cf80b00c5a3447a5353078d2fd8d036f1404eefb2fd90556458", - "848e67deab03a44ff614315ed6b91b144471a21beecc46b0ebc9ebe9e3001b32", - "e007bbd9f4239b620c337a5e227d5ba7526b855a17722aff4daff5c2ff60d271", - "8b4335169ddb9d967aeab892400b060c3f83e3836c32b54d11d1d36acfd7d7ce", - "6e0f75228b6126dd90b4444e91fdce1ef00e24deee15785fcf5825d038231169", - "dcec64ff3bf5f503154e3975aac3dfc11958a5c289c5f760bf1cc29eb0916a2b", - "3a37177e7ba935a30f6803becbd85e0b6f2f85d77a6551d57684fa393c85221e", - "f90ce5d5aa1186b1400254ea3282fe72c2c0b8bf26a8c1bd0e40a8af887d15ed", - "fa71afcfcab9619333221843b807e5bc2c3070e13b5f6298f2f6f6d7ae0d46f2", - "883878e6248f933362934f87df30949aa32e73a08a700ef2291c955106870fb7", - "42a12c8139fe7a60d78586303d597cb0e96431c211f1115629aa885a04b2d1bd", - "2a0744069bf1052556727ca875893de0ecb512be84c20f8d9f0e273dc5e44749", - "abdd80afe512515ba911946f6e102df1e4c55381f200b1e38d9bbf679f37ffe5", - "2153984a05d1b7e42a7e002df0ce522ac0b0dca3b5c642509660fd85b153d215", - "cf9e1f801da48aa8b78bdde74cab29c4668ffb4470568d77a5c1c9f8ef3ac472", - "c6f6b73ca07b2cbf7f793dbff7b378d5701e3c8e1dd310e7d08899ea9814180e", - "52a433a5867a07cdae8d1f0aa7aa706f7d371bf9478ed1c91e7563a1fe3dec9f", - "23b3b1395bff8d461aa77d42054ff2e5b8a4e8a41e1530562f9628efe12cd8d9", - "6ac4d8ea7fc8b44a34184086e836ff1ed56359f7997a96e1485f930f9f451152", - "3ff9b6c5311a3cdf3ac5797285761424a5815e8fe6ecfb88cb64688b0524b882", - "69b005a81111300939e7a32db3a5941c8ed9e96528f13c18826412c3fca18c96", - "aecf4999a36e4f6abc4c5773c4b03a5cd88dad3f66e4b4a4514354d5691bdd3d", - "cfe73354842245cc743f372eae0dcd273885d2a521e54355f06f250bf1164a52", - "b1bc5a8984d5545bc662e225b5f5a79a2e9b776f6d59b1427df45b7feafd5fff", - "298092ef84ae0c6d1435c93002a3462d6a93d7ecad41f4a7f7c0a1265626083d", - "4597b63bc1cdbffede79d8a7465fe6bbb4d205e4fabb732dbac83a898073e4a4", - "fb9e75a7de88a9c17d7e37c843e094248d2441d05d08361ee185b7fc7d822654", - "34b61708b975a5d03c93000378a8fe950809c8549361a96d84e755acb2aff7c8", - "2d0f3424b14c6eaf3ae5b45f9e1a95c209f158450ed595ba14f4d016fba5d8a0", - "9b2f0202fa13c80480ad211cf5be3c003b965e2f68779501521082709bac5674", - "79958a974e69e9da93b170eb2508ba904a1aa5fdb776dfd1da0e84d72f92e3c9", - "17fe5dd2f52ef49302161e8b870c765b10f498d9fdaa9151dfe73eb4e8d728ec", - "ee35ef93a0e86e02a89d7816360ea35719c52235720a974cfce921f9bcb723e1", - "dff01f5e0c83dd1a6cca68e2f94ab9309be430b4a4d160885cd48efc1dbb571e", - "429a285155690480eaa35e6dfb031a1eb9549643a1b01579b13e4bd26c5d8b1b", - "eddd9325a202039d3b1e4d25ca351723ab25a0dcae5ff10df3f29b07c1955c77", - "d96f6cf8e43fdff07bc4fe285aa266111ff5a36f62bb7594bfcffa6e1ce651a8", - "9e00672eeb8c6bd58a28fb67e2b3e1e9f6acaf65c17a19e38e37253f6ac75d8d", - "33ec9ed213f76cf1d86c8259b72e595607406f3f7a0d4118f93aec98bcb6b533", - "28005f29cc1718859189df1349531da4f3e89b9fbc27c3f6eb5dc7571675c3b5", - "92d55c655a02dc5875dbf0119d786c426e1760760058518e88183a02e55d6d67", - "000959b92023b1719202fd94036eabcca5debad46259bf6013f3b2bd7b063fb5", - "feb967900bc2826cfd5293a472be2162769a32079d329f1c0ff8cd54f0c99a8b", - "d6b55f06308bc744a94fdef55a449e0b544ee045d40d025680ede1a36722f185", - "56c9d4696640cd207b32f49440096e8a32c17efaff4eb7d3f97883b4a71ef065", - "b6060e957285a06fa5d8c754981ca58199048e185d6b587255fecd0ba93a39ab", - "08c9f4067954652eb43e9dcb0f8c0429c629197982c0500b4a7816bec9a7ffcf", - "49667e2ca1efd75f8bdbd983017f33f0c59f2f7e63b8421739199bee30fb18f2", - "487e59d932f41f8e78714dff31ca0aabe6cac48d065ae6a2690a7211a75c6dba", - "847056da7c6272b89ebcd29d5c59acc28076432fa3e6bce790de8061c36b6e7d", - "d9522f28f9b31d5d6faae87ce8259e2e33e66fa58c69e791ad97bf75fd7eb5bd", - "d079dab94de1678cf9b23b03014e51f5da24a6ee04edb04c9ae1c7bd60691e1b", - "07145e69c07aef5f88e8860340199d1cac1867fa1f1aa19780d8d5c95a38dc19", - "d5eea8e9c58d6fe4fd98dbca149ebbac55843bec0c39094a2fe6d28185689fc4", - "c520e679ce6227ba264106cf2fcc3fee9423866f8be4b5fd380605ed1fc87797", - "ee5abd60a6d468e7856c39b300ae64f5bf442bf1f805321fb79eeb7d656775f6", - "a68a629af1b0c33caffcdbbc056856c47d5e365d137d51fa3c98c14d82f448e1", - "03f16184025629bb7cad3208ea2f6a64092c9fabefc23dfb09534f09674d13ec", - "c7efd5769cff0177ea0a0b4ea30dcc0cde4cc06846216c85a7c58abb1f02d397", - "a686195464a9b5298f2230c3c5d5bce6e8e7581a71b85556190c89a5f7262449", - "609ccc99c14cda7fd03562b4b3f1d3a3416aa1ba37675aaf1c122dd00e8cca69", - "6cdb3eb3c4efe47ba779ae460a7bf59c84e59fc64bb6386375a38e3e237e754d", - "4657dda69f17c643c29d8b03a07fa8a6cb0aa55f1b512e9cd164622a7afe5212", - "0695cf98e11460a939673505baf94dc2a3662044b17d55cecc3e4d10517a0c9e", - "6663497180f43044b40974a065f1a1156e8a7403d7de4ac96396d93b964ba038", - "ec0bb7adb4191317557c012ee3c3b71f28c044731bdffbe7429ab7adf37dbdca", - "9f1603766b7d4b295de1a2848ec5fa9ec9d29dae8554719ba0afedc30ffe2629", - "3f9be17a9f2f0c6fb6fa566f0e6dde6561ca4d6b1167b213ff29ea859236a378", - "6b5d295f849e805142738e3945635ac854edaacc0dbb1466ddbc55303bd4d2ed", - "f96b18c08c9fe9b109980138c4294bb6184bf6bb24b479cfb191a4d86ac94067", - "a137a358a3872d9ee6a78458971f15807738b1b60816d35a39ec135a11c73694", - "79428486ed9e8de46be48f69ac9f71016ec199123c1994845324d0f99231c3e2", - "a4770056693ccff534b18ded981fa73459319a7205a8db2ecc529ef13a5f1ab0", - "b6452c6698bbc99a7770f4c4fb1d0a8018c73ab02f3291bd72287251f9ecbec5", - "80b13640aab43da41a563d3afbad1ce149fc7f760cc17478d00cc340b7f08a60", - "2c627831323c30a171db1de9d436e23dc29e188d0cb75a1eac4c2d4e33c9df71", - "fdb2a4a5cc8c1514d7ff34753fbea52efa585e6aa005e50c12d9cfdb2943ae4b", - "e8616da6d4b20f451fffb6d60b1f5040fe406f5acdbe37c7668a3ef68964cef2", - "77288edf7aae15f050e0db91d5f6e40d333bb7f06efd6da896fbb38d53ac7eba", - "2fc302ad1f1914993481df338cb8eeb8fdf49dda9b47874764b6fa3dc41961f0", - "ab360374a64bf08c1b9d4207de964e0497b58bf81c7882decd335bcdc4a33421", - "cb0be37c49907fc257af86b35c43471a8923e0704cac4e4f878561215bed238a", - "3139ba0a6d6fc24b32e441fa2333e301df85f67db6a82e72d65a44ed7f85439e", - "c898dfebb13a9c67d69030a80c08a8463d576fdb973e29d284c84b17210c57a9", - "1936d1a8a65885bce15e430155dccab58c19a1d5daa00157f693e30cc2bb9a40", - "2d12b5872ba7a47b6cdf4df82ae60582f9741b4193f9bda5393ec3820c4e8e91", - "98d03d00ce57f86f3a1a2c0c201f352adbaacc4025fbaea25c447a6be43a4cdf", - "658fcb0f1bcd0f3240ffadaa2783146c71176a6d2d75213582382dd3f051557d", - "8bcefd7dddfc87e8353149922c03cded6941509e8f23890e46dbb7035fd698c1", - "8b134271ecbac81bd50478cb68290c0d8646ef5747935db3452135be1068ba3a", - "a1d63e032fc05df0e67e5d10661f74386ad74d2fcc72a894e1a3602b91c6da74", - "94552239804a3aa57af5b96012ef3b5e8fc735f949d80b277c525ed0b7c52cc0", - "fc9881c3e5b32e7260b4731df76e769e72161261633e9c54d74e2dc224f34a04", - "e6d9e4f37f07e9aea1f2443da07bcf081c3352e889711ad5e69f79fd52f4d04a", - "1bcfb8e859a564823545b52e429ad7d0b3ccee940da2a7b38039c69a907cf1a1", - "79171c7b2948b2d3266bb115df5a1f9658b7d2aa13e7ee2eb07755c6c9a3366c", - "4220e059289dd581be2005a535c6ab0d90fedc8ef15b9cd138ad9f960221393c", - "360916e834a4863c01101452b31c0bb69b507b7300b51b513f8a64e8978d8eb8", - "a621e407cadddb25da685dc0c1cc839d8f060474dfaeccc26bccf2e9e6a32b7a", - "b3822cbfefc572d8fa3e0193e8c3831f6aa02c8d4c6daa524dc2ca843fd05c25", - "153b8858e9430b51a4fd9c522c93a698a1fad13fb0043bbdb84f99a7b03aa2ec", - "6473abef133ca24c067f0fcf737364f2e6188db52e4c68d42438545b4a075b45", - "ba5106ec6dee173ae9aa9bd3768842580b149849eec121bb9176894415c7eea9", - "ecab46b21e4392c1201a8379a3f5d30c13d9962250049518a60d9a3a942bbed9", - "6efad831fd56fa1f462c69dfc6d13944a244b3e981a948919fee9b4f259ff5a0", - "bb6ee269ebcc3633cd30a2ac32858827bef64afbb497109b042214ce4dc4c842", - "5966a397c2ac7053f86c64656f62dee8dcf898be5a44d732e81b0f2225212018", - "116c2a20d96d66a5688f0d1af6a86de3c191f6fb58cb535329196580fd4a9c8f", - "a06fe70334c17125716eb1880d97ee32ab5aff6e0811ec9dea4ad7695a988cd1", - "bc9201c7ec32f10a54303234ab2aec50c6e3a86e8ed474458e874238568460dc", - "bdfda83b0462b8da575f5c439eaec3ac331c314b6da2b488040eb206ecf05b5a", - "83be5cc1a049379285c136f2c23b17132282ee7c1b329ee3f4e82033a75b58bd", - "f71cbdbe4783faaa398338153ed758675cb28b42c9028c00c4908d19313a34f1", - "4cd735d9307c04540f02e41e102a02db9d4cbca2b932a92eea1b38b115994e18", - "541a172a918b34c3cfa2727b858a7a039add5b2b1a08308568549b67f0d1a376", - "c36d9cf60c0bd81f19f1be46ee98853cd21bda3da1dd405392ac72a633fdd469", - "ecf292efe78b8309ff16f38ef0456b005b67d63fbdff69a46820b50d80b4b381", - "b19a64c8ec245eb2bff16e064528c129d988dc1ffe3a7873165a2a41046ad54f", - "f056da03010a7842812fb3a375ecdefb783102e4af6b6b374c822d25a9daad47", - "0fc0eb00ac356f921e32ff13143df30cd84c5f505760314a3289bb5839ece717", - "f83465d323993c57c80dddf0b17b5e7d819417fe579867edb51847d65d9cfa0f", - "ec602967856c7f502b57829f1ad9b48d7c55e50157022e9a9e1a3bd758122406", - "43f02289f6fd44f027a4f500ff7671813de335cbecc7b9667c63df3ae9d17c90", - "f771c6d6dd06ccca0738e27cc10123ffe6f60ffa280dc48f56d6ea748153b904", - "e5284782605364b8133aef166168167751e727a5bb91ad79f1551a583a54fba6", - "f8164a280b77ec9caf8e5c47a4a2fbbee5c76d03e1c6cdfcd973877e990196ca", - "639a36a0600cfd504dc736f47d179b2aa351bc1c2580e55ce7928bba9718a964", - "94d46f2967c66dbe2289d655807a10f5e81c3e97ae3347c68393cb9ae59aec5e", - "3a76ecc84f32d614354b7c37d3a6aa60e7dc950b67db867250bb5c1bffd7618a", - "bbf964932ff2921cd0735823022a8b22174f0dad8af2df0d8a842122e55c70cd", - "2d654a4e5f5d14771e2487f565417c8bb2364df5ae696faa894bf3ab6e92c508", - "fd1f802bc40d33f2bb0bf87609a15ce854af2c63614da2adc9de5e3fecebdda6", - "3e71414ce2caca1462498e55933f1176b8ca17cd88562693647abd8db91a6e33", - "a45416752bd7313bbdfdd5376b18dc7f0cb8bc1428255d9e0f00aaa7e62d07fe", - "611cec67731f7ac7d885ed1095a7937ed213db146debdf433862c654433bd25a", - "8685288dc265b142f1f16b55bd84026ddeea0367d6192560c1a5d8ac6dbfe82b", - "669d08ae77109b0b7b4614afed7b79517a232af9206aa605644616d54f1022f8", - "f9fbd7efd38307873b24fea25fdaf62f770e755f98eb729772928868f7378f11", - "d311c83365130d03521d70f38517b9b2977be7e73b5ee099e0d8aba75917e2fb", - "049895757023764826f25ae1f7a30978436243f269fc0a38ea496448c3487375", - "90adde0a10d27adb250db9a52eff25ad1f1e88f6e2a6bb7f2458667a6bc0c01b", - "43a651ec9554114a4831e99cc941de1c56b9f596811b10f4b76ccf1d47abb66e", - "dece8fd57195adfcd16c8ee315b9e23197d4a2d8b09b0a61ea4d0568c8d6b7c4", - "d1510d1f102f2b63fbce1664eb9632f9e14d897a94455b4bec7ea58e5822375d", - "e4fccf122a9a2980bad2dd06b0755776dc9d3af0ddd02ed91da26d0b336ae03f", - "91f452b0236ea8d2a0a47dc0bc170eb3dd4b33aee9b22357a95aa3ae00ed903d", - "457756ce612ef0622314842aea506ebe4edad68646fcc7d39323788d23240b66", - "71c761bb2abf0e1fe1b4dcab4c284fc650e540ec84087b99adabd9c0baa5eb76", - "36a34cb07e1a667979665c8fe7065f878c2c48e17150b85a9fcf1f05e7af7c8a", - "bd1bcf854c209fe9f10b7a0981198f37d329473ab86401fd10f82538ad9b254c", - "8fac04521cffc3b4d606b7984fa3f606a13e1dc3974184a45083446e4f75e884", - "c5df90e37f27957818aa2ce812caf27cba065f1b7d8c077487878908cb54ab63", - "eac52d3f9b5fb3fc29bab9a775d48acc68874d8aded78446246a09e58edcc933", - "792036a1761686642a66e69d706c8b51039e01fafc6993fff364eb2b54d5471f", - "7d438d6ee0cf1060e48d20a1981330811b9a9787fad9308742adc23082408160", - "5f33197f88fe92e3dcd74f619e017a16bf4252a6daba289893a1d59057d50b38", - "d81951b3b376d62ca395efdbb97343bc94095a83a200d87ba84d4f1cb169fa6c", - "5c6e710111876c77684bba97de7086c318bd023824a7c8e899f66ace25de6c01", - "26775a8d2ce393dbb65d721f97e73a83a42e52973b8e0d9e5c55d8bc6f33c481", - "5c2f96adb92ff265c0a1c7dfa5acd83d53300eee0e5d355525040fd30d308364", - "5067a288257e75c77b6f63b6fb0f108ee9b0c020d59ff484baec269e39761003", - "de71a98bc52b5714b406067e8fcf5268ef014894c737e47b7212e99af99ee778", - "f5ac9f8e5c267619cff016d17775fd83d1b53735e5d78c345abe3edacc08618d", - "457c99e2cb13f09caeeab84cae32a9386507927030fc9c5df5ccf29b894cdb2e", - "c4bbd3c3b66b81ab53c211cc46ef922b3858f747fe60817259117c2bc461a90d", - "642e3a0ead2b35f2b0d93448dbd28af29eca6381bd6cf10ab4c7104de3ae79ae", - "617713978dac48b0c3ede664c59853506d624ad3630a78d043116babb2a0185e", - "9ffa7b9f8f2a7fcda974e46464d081aba72dfd445ccb1cf0f295273c0ecb9e2f", - "16e89510f42d8b8455ea4396fcbb17f9e741e34aa55456d485269f10a68fdb62", - "a3b146c57fe8adab167fc14f1aade5baeb7e11b8c410c115016c33b65af68157", - "111c7612da6e27cb5e20667bf520cc59747c323ef98c612b56b89fd23690645a", - "f11553b3552dbfedb0e1135de05c5e80fa3f5b841cf9f8ffe11757e39aaa8301", - "fe091e7c91fc1fc6c67dc4dfc74b34a8f1218f8a2206801b14cb1f85321b7f7d", - "efa16f65565564b8247c8c42e5f41ff8836bac602a8ebc92ba80cc4cbca24205", - "b867924e2e001b231186a244826e82f1c765d3a159ed1b447221562f46dba859", - "8a71e7f4573f0df44c5b8dd41095dd7b2cd44859b27fd5720279024d9001cbc1", - "6ac211f7a37b45d0618e0a9cc2a0f9a7010ef18f6b1905f8a7f4f242f36e0785", - "52232d6ac231c9f677b0fcecae76828776e0a729dcd3c7b4361d84de4c547ce8", - "55cd073c6a61c9d40a2fc2773384468ed254bfbc98af8d662afc8cbbeb2f4e3f", - "0e70c44955a4aa20d25574a0629544e7668408f901f34c410f2b6531ffe4f6c3", - "6c26801d3f66c207f4ac5af2c8ff81e86be54543de287e34218e67bb111ca191", - "9b585717b06abc94efd0eb0c427d5ef03a47d29613a16737e358dce585fd1f83", - "a09a03edef6fda7be59822546922caf1d113f097839555204c6db727d6f968f3", - "e7b8fe240f2e2af562b170879541574d6392ed02b16cd6bc9526482be0bd03c9", - "574598eae2442c0e4c742b791eee12553897e03cb656ced99bfd88dc77f0ba57", - "2bbc07b6e88751d8f68252066ceb823502be143012a5e068d444cdd3c40f54b2", - "671075522a558977e8d24069a2ddc895cc2c973a8fe1602d787957fc6384c1ad", - "91e58ee9b63ee70c035905c6b183df14e3b49e9f2a9168dbe057c6c6b9d3e17c", - "2910f03414aa870736bbb59239edfbfe239bf219b30ed3d677e6079cbf9ef3f9", - "4450503917f48d271a16393c63dd897b61fe8e40a609fc9a8db519ac448dcaf5", - "92d25605837c227f01a161c8ee3c65a2f133c6f1fdac0dea87c2be570f135c5e", - "1db7463d8882e4d4be7560f320f98a4c1b4a88506edc3a2f35d74937f4649644", - "3c6b33443e5c34998f5371d9c1c282f4bcce36c0b2cf3b9d513d7e1f09360006", - "a42540248a304d17a46ccb90d7afe0bac2c349cbb2ff4598c8fcd3e634aff64e", - "34a4e25cd44df4e38c8fcef51064f6b1ef5e61c703eb141afe68cf8b684fec43", - "b37cf56f1c760fef35cfc5b09538235e2a35c324806fcaa55f021e3451a06aa7", - "23d7c0cca9048183d9afd7ab926585e1652a7f00102044c1d71354b7b246f994", - "8bf04f2cc9a501824d4ecc1e368c69d01ed20e188cc01d61e1f8863e6c3575aa", - "f5d37869ed750332d0872862f0cdefdb19f313a277e756c00c26a28a816ba1d3", - "cec3f3731cf03c6f8d0ac5774ffaf508c5043b6b8020c118e51e50e011b4d921", - "8584eed637e88618f4ed37559ee425f6aced85e7363e74b755992dd1f26b8ce1", - "731dfa372ce779f2ba5abff9f6e94f5082fc2c51f71a5cc5d1203dc9b54d7033", - "90d4cbb073143b378b1431765fecb919c5e4b7b3fa88addc3b8067b0f8cb0421", - "8b8a7b9611abfa5b923953d8fbb203115150b0aa0a0e28ff42b0b12a0baa9595", - "333964b04c8bc52b167047453727c64adb5293eb2b3901023d8be9f665490cad", - "a3d2d40f38a4f6cbbc76ad1821af0e979ac0e7110e7616a1ac08eaa66790dc47", - "8dac9705d1747066eba63ed81c3449f4f85fd17e4a80ea1f9557ff40f299152c", - "a0e1d8d88dba531f9a98d4bdb500d9d351cb1d3fac060b9c8bff0c2081fefab3", - "9e40a276e3a87da97a6d5ee51e228a5092391d43febf0c173df4861648df810c", - "2c08063a1ed4481e4e7672371257a806781fbcf86660992bb425538a27afbf19", - "cb9bd4b5ac667665aa1113bb78143fb84f6648499107b651ae7fd403ef4ba24b", - "5f2d03493785b22a425f96ce8f114ca7b86d1175a251d00639e4ac145efd0cd0", - "9cfd0a11b7fe4d46b2f8907312721421992b7f40e0bb5b880b203f622dec4b43", - "e6416887ded91d718da8638a60e273fac34e3cc0a947f3e7415aa855f470bafd", - "2fa588cf509f7afafcae1e87243e3e2d9b4cd1d17b126bd6daf4940352019eb5", - "769d0666adebd9c57aa921966e97b97abf4214674e6c44b76c44f89ccb43cd93", - "9a1c391f768fd6aba7f810d39b6c39cc9c77542c9f27ab7ca8700d26a9b4876d", - "c7db364441fbc49aaed62a55d83041e27486e8afda2dbdf4c35d6362026115a4", - "1d8a8c7bdf2290deb5aa4cfd2483a3c223cd5132d955870b83a83a8e718dccaf", - "ebfe9277f2244c92ebd0eb51610a38793daf8ea03e852f8bde8ae9321aefd9e9", - "05dbd85a8db967173cc195bd57a28b243590f84eebd7cb27e3751139189f94f7", - "11b7ea0ea215b6f9f5096f4f81a817a18cb78e683158d342c6c3a31447eaaccd", - "48008eadec32012097531ac72a5e84390ba42e5f7971619311d17a1607bf8817", - "5f93080692fae0e04e81e10dbb7b8a0827ce89281ec4f3db930468c6af17ce01", - "d96bb4454feeb987c9c93475c075789a184b0b8d7065b7eef023f15ff2aa815a", - "cc3aac95e44a37ae261cd7c7f8d76d2f9841ad8fde6dbc65efeea1b3bf92d5d6", - "ade10431b822277f31f9cbc719cf8d990f853b535e6de93a2aaf19c31693fc15", - "188b3f6e5fdc11d7e8cf6febc5d59c035ca04b00bc3d125c096ee48e1e824ab3", - "780e6fb49b8637f367512a230eb9934b519bb78fb7b1657dc4ef23336a8c7133", - "8fc9003e22053c3715aeb307dbe23aff54efcb7579e7e4d41f16dfb229981f29", - "12d6d7101492dda87352fccd19013328147a550b2247553ac27cbf0e3e908f21", - "6ae06f7ac312820db37e303a5e7fa2a57bbf9e42ace9b174b50ddb075997d0eb", - "54211442b66b9380ecf9f30ba534f54440515e8dd5f2b5fdd65bbe3ca60ace9e", - "92be23b10b98a78532006536c6eaac687942c6f18665390c77fe27a091724711", - "c2cb2f0805d8838afaddff5ec157c471e6644cc9872c614f2c6741a2b5a1b1a4", - "67670fdc8b5b864d63bcf561094b260acec5c23da983d00fb1a218b40a8108af", - "165ace35393a4280418f3502e0e471d5a565447d8d80f5b1dd02dd7722c1a53e", - "cb685d8d8fb77ee2645ae716dff362ca50568482928f26eb63361a774f6e1be3", - "057bbed58986fcd862aa9147ab8e72fe55d308996d808e96cab84f19f5fcaf1b", - "d5adbea79a070264178b56ebea4ed3a46f108573beaf1223918fb1e6e2e58080", - "162a7681950109e161da8316255c711fe2814534b6ed55f1415dfd4e14be2ecf", - "1e62713200557ae05f4130fefdcc8e90be194f60afce56523db5c3d9c02e91b4", - "c7663368a2593c877f4cb1fc15320527ec30272554ceaeb3c175e8624a3c5936", - "1c0ad65f9b7c9524eadc0b1eb94d123a61a1f5a15014eea3f4eb7b0bc347e005", - "9ead02d54433a5bcb095e0bb3f5a40c806fd974bfc2851d559b389d5558a6a77", - "41e33a4cc6e765f002a543550c08c6188bd378b784eb169f1fd1163e64e3c17a", - "9e5e278b583bcdfb8f48b3c4a5c4b3ae265bb1a6dcb85111785ca0a86487c1c5", - "9eedd4db088f5a532a26f3a79aa0864428da800e90f387df5719950d5a289a14", - "fc11a5c7b3dac0c930005e2ef837753b444cad94b863e3285b4d7267a62e37e4", - "ad300551c853507b47058f7d801b3b1e754289a47f7a90088332fb2c2afdf368", - "4be127491276fc3d32132f275f9aa396e596cb0b16714f9c3c9e2f15108a806a", - "7bcefb92be2b0b2069d1e581458341ba1614d4c2b9a1508592da55364aab7064", - "a292e26b23f9c35cb7d8eae1ca73a251e339b9e3f2fb3fd20b92c64cfa94d8a8", - "87e4c6c84c789763a9716a1df141667a70718500077db5755ae0642b1c921f21", - "303930bc57c944a124cd09e78cb31b1d6e712805a07377b273f44afe3585eb11", - "02312c2712ada62388c8c5e28377214d24bd2270dde66d55182c4d0b7be1ee35", - "59356b2c5434d4b071457d74b2b2e801f6f3fc0ac83496c48ed7e6b2b7324eec", - "fc9bd478cd94daded7c623e10d1832a369814b5eba0af6c96e11566a8703036b", - "fffb324078c6725cea37628423f8de9991135ccbd6bc92c8bb95ef2edd1c7506", - "50ce02efe0cad59a64ccf0bff764e2bad258644bde78fd2ff3f17d27b0be4486", - "925760cfd6efc52e75e96a8e7f9ce380cbb6716b9c18d2a52b0e60bc96a83465", - "be5149a34b7f05b339ce995d216eef74a371655f9a953bc8723176a0ed93675b", - "f659023b3ca2e2c4ec424807dcb1a5f1a9b73f654d1c03e4fd01de15d26f6175", - "ea64fd2fcd10a1652540d05e8a113526bb1a29e8289713c4fc12ed8ae4c3937e", - "cbf141b204ca47beb1ab955108421a16685e0abdb8821d92b0a95552024c6c06", - "da71a5836328a3335055e92408ce8c45eb141d7c6e0e59bc3395776f127c3b61", - "27eec4d9e3b9af8d233cf18c58698a502278a3d34159bcc8f9a52495c145eb94", - "7e2e10b072ca2c289315d51dfef2e82a790a236eea553b34c0d2e879a27408b0", - "dde1344bd1a6c7739bcea5d2c7a29d93507dab5cc93c092f1afb8c4a77010a90", - "8d2d4973a85b74e240767f99c048759718316496b50a4bf4c07e55725263859f", - "db7e0a1671e7784cc06404ed29ffaf6d4c3e126687f87cdcf0e28ad55f2d88c5", - "0e589aa91c85b00ed0aa41e03850fdbcabfdbf75deed9070154f081e13beab37", - "9e18d52455595bfe618841abd9a8d69d211a3b282a56e9e86e5599f371520b21", - "f20493b4eeb2b7eb4e4feebc7502ac0978e14f3adc1972f5ef48c8cd19dcda66", - "2f624f25a5ef95bc8c0108cdb9dbf3ac87a811d3c6f483724ad239e6148fddcf", - "09d815625bb91fd39012c68ba3b0cae87623ce0e541b60445c44c6d1fe90c621", - "53c3b57931ad2a9d516869642892170445d04d155b9d9f7aaba276dc58fabbff", - "3a7d5d9e2e0fbd0dacb6318d46c33cb0766d5060dae0e24b36db55e0d587b4f9", - "035e7b70a8e3b99006f7a99c5b32c107f795a31dca2823242fccb11312adff72", - "02c8d1268fbeb54573aea193c536a006e47a191222d23f5d81f1cda9061c340b", - "d3e269c31ae3c50cfaccd564a725ddec3b4a022b362d42d06e8feaf3b2e4a006", - "7cc0dd0c1ff5c30f01b3fd57fedee0da1a52df48813ad19d48b85d907f5a8339", - "a9f2a167e94a5246458187a8f15567948c56f2682f806852689c6eccecfbe865", - "815bce8f22639be0b3feae655a76c2aaf674d88fc3163b08c02054d0b2406153", - "1d92eceb7eaa99dc75d7fc851374cdf446158aedafeba3dec77f44000b90f36b", - "fba31c0fe9d626d7d4488dc89aa18e0f02191afb82ee8e87b5f52a39aedc945d", - "987af0ef293e1a06025e7179aa50243756b065043a84b0251c750b1a671f05e3", - "8ffa634c4bbf6eea6e3b990bda8cf960013d473d5d883c3870e7062b64c972f6", - "7519a53ed0565b217a7ea64ef2d86d3b29f001e8d2108f28b6791ed9d6d670a2", - "ff7bee1727edb8900611968dc3997c297e1dc9b94f71e08fb6551b0a6b2cf0f9", - "2ba38bd13b52d316af36aebb0e69e34cc0ee17670d58ddf500503d966fb23968", - "95df2b1fd09b7b29a58f59f87d9ebf55e9fc8f6852e58c6255290836477d912b", - "29256ee19c1a38d16c892ecf883505b9ac5089cba847bc0d4512e8a311bebecf", - "3ecfd456af9bfcac48797a96d09d5555bf4d47c1a94818ba8731d06f77c6a352", - "8310400a8a0bb49390b7d7f5ee91bc86c6be918036fc4d43458a3147746f9ae4", - "52c861639432d6cb4ed86592913a83ac51ec08998c69147022c17c50032a80a7", - "ee68794ccd162351b2997588c5c6ec1d8b6ef49c6ca83cbfbfdeb1445aea6086", - "127a023dd27ebe2b236a82dd902479c797f58eed23e8fcb60f2c7bf0409c7e61", - "912b1038deff63611486917533b59a254f07dfcb48a245727d0216cb8f9ede76", - "52a4b60313b0f7b3adeb7442848ef1f57eaf8ca7c36807741668938e6559013d", - "c6a8e2fc9099494b6cc5416da4c905f07f10328cb0655d6f0a897a385420f0b7", - "1330328ff170ba286cc664394437d1c22c941a3560f572a9ff8469666150d4ec", - "bdf8fa2babafe27a2974f9415ac587a8cdb88b6fabfa43b4a8a6d322e8a2a63e", - "f3d9ac201194b454fab8b5911212c0e982bd127dd356972d3acbfe482858e933", - "05164b56100dcdaa2490ddad25426690255d5ce3e364bcb814a60b636f2e5c47", - "f7bf7a37671aa8424fe2c9a9ef850d6145ec3ac8ab2f5d9deb81f63eeaa22915", - "0442f7f40912da720fe37309f97bf5f69a2f72bd719187650989f23292acb540", - "d03b5113d2ef27a5a11eaccdc4578fa4d2957ea651bcfe7ab94ef8778d5a1cea", - "325e0bda78ec36fe36fb98d522dd92c6263bef3f576cabbe83e590c38edf2718", - "8f17d34571ca373b4b2987264a4978d3f192fc95db4e7ac9fafea7a37bf16b69", - "08750415332669c43234dffbf4b32e103cb36a5b9f5b6b2c10a67b5bc1f377f3", - "0873e84608b966a8412af9e3c5cb7f00222b1d17470a027beeff4726d5bf65a4", - "00034150f3c3175bb0b71a690625d2256caf7d79e0636244f6932d6145afd852", - "64e73eae54be03a0dd652c6d858137bec0512d6bd46e98b356aeba21ebe28400", - "2737b860ed6ba42d9635af9d62becb79f0769d320e29973e00db1eb2e30ef986", - "82eb6423255bfa01574454ccd714ba617bce885cefa6b8d93c4e5e7efe359e46", - "734da6a46c312d01a18edb8cb45f2ea2246fec4795b4dd594aa0aedba244f67c", - "e550aa85d89ece0cc83619473ae44f2a07a0728b12ed60debfde5e0ad9ac5fbb", - "c9941a808a6045ce6ee3dd30e593ce6c66c95413f60e0572d77549171a2e9cf2", - "4b45149bdcb24084f174ef70e5f092cb18cfb5c16dd885d64a2395c4b7ad43bb", - "13a1fc635da3a68509fd605a03ad49d27b6c68b6988a8ded5c4ed0396d870d89", - "346db311c9ca32cb49ba0a404124ef326d7ee877ab8958db827068ee6fef184e", - "2375f3a4f933929dd6b30604481943a4bcd52a99501805ae5f41fe741d5c0fd7", - "9b0c957d8845e3a0b1af97ed61f37d60c8a542db8ac5e75e60e8eb6903c1eac5", - "af00e2258fd1f20b9ace8ef302edfaaa4bbc074bc165881b79a556730f6638c4", - "84bb3d3b1ce4aa3024f4c2a4ca23a766cbb0f6c9318b0b68e6206e007b208773", - "d239fb136c35ff386f21eb3f6f17448e291612156914581b9adce75deb092e4a", - "9a51e642038a0a2e0f3289c3e62170a8c788a71942e9c05c292a887fa763aff0", - "25545b3a7955b0151dbdb5c20395bb9188c4d00094600d84fd938f789c668913", - "559bd0c8a35a8271e4e332b4c003008da8aa6176e75812ea7b264cd42e6f043c", - "004cd623e1380659f329e8dc02bbfdb206babb49a586ced130971b53bb998818", - "e6cbab3db881f7adb309df9e21b68c06e92b94b06411d04c382ce9098e7c3e4a", - "49cce15e753ae4650438d5fb2d75a29c0f73902af4d8b56a53178aa82c0254ee", - "c323ff1512504c650a7c313a97ca8cb3d6f3080c200e8baa59824b50c69bc856", - "06c0790579e87a3675dbdb5dd0ce0a570ddf52832a8059bcb14bdec385d63da7", - "740264ee7e7f92a0f314ed40da6614cd22a8cb44cb53d0d2f5065075f58a40c7", - "0c16d9ac36095ee32f52a043e51ddde22063014db3ab352cc173f605b475e673", - "1306a1b9b2f02239bdaa98a5473f51c6fa4680f360b5d9116de6b0ce64dbd5c1", - "c05b5a658b0e22071480c88002b137543bdb4987f3972a4308d5df82a974d0f7", - "3c4745f7d2529e8038e6b2b206b49021f6c0c2436aae9bca8d3923278675c43f", - "45895380076db2e2a3ab0e28cd6b1d724714ac5ea8578ceb685aed0c397a23c3", - "2b410d62d6275c55d92c11bf2d3490020fe9c459ed786719e5fab1d17e43a4ec", - "e78338763cc60bce6bd1b25db804b0c943c16286f4ee798aaad9965b1bab3e91", - "a9f18488cfbeddc3af04547e5b82fea401d577cea18270c3101fb97f00ace7bd", - "976e7452948c113f83bec915e2731fbb1c6f96b7306fae701e788a579764efba", - "a3e82350a5cd12f6039dc43c538da1aebdd053d92e0f029ed58349f1c3419582", - "f760cf53dbfa2a947709216cf2d4561e2736e3303394a5e1550246ba302dc0e1", - "782fa5c9d3d2dd18f559fe249e26e83776b950f74a960a80e05c9064ec722fc6", - "882d8f62a589a56c791020f860e18912b47cba8030b2173dadad569443389ec1", - "96f8c9b235e4b542da779c1a9c0f5f2094c9db7f419ce3f694f10f0eb088ae72", - "4fe484da4ab19e01cd2d5a1afc04ac06499f8dc1b6796f16e890471205c05111", - "17ce3b5be9c9abbee4d54378852b2cb8e53f7f925e90a9dbd22c77ad753d12e8", - "d213b19919b2a69dbad5e1c31a2e66a9ebd98e5dcee307411eb97852b3714bb0", - "60acdab2fbe89ea76b8673890aa604cec303c3654b68bf93d70b5812844214dd", - "f1ac4c7bfdd1e59bab5e44cf2b7abba8a8512bb5f6638cd2665f75a5c289040b", - "33faed19229cda6721af9779f6052cbdc662a8dae74b67b37d0a4c76f1dbad4b", - "72c021f89ff3eec33bd3e068ff773a1e2941d8e672766fa6686adbb95ccfbd40", - "4e31679576a7459b429e8c42df9e5c562bb92cc9601bb18c5ca1128345356ba4", - "314441a50723c2671854e0398633526aa2e08b061defebf592b2557c31c63dc3", - "5ef632b58fe949c0b94ecbbc78f79e0bb7290f6d10638c59bbc1858b8d810925", - "ffdaa6f43420cbe59e83ed270b6581c2678010db28c1a1d66b28cf0aa0f6c08c", - "6619521ee8d8287a7463219ef645dbc71c2c53e26bbd6df0a57422332265785f", - "c8d356f0bbc788575d06f4067cd4c950c0f3ce0efafb8706501bc16b28d050d7", - "c8e6cf33b2b24a233652a78676f0bb7fab3006dc46827ce7a7215573d8b69c65", - "19437899057382b03bc29ca2898bf3fd6a0a844875443c91a3f966fcbc19ff3d", - "5687813adce695921cc8bc509dead98d63b5366c4157160de8d55dc66a293e28", - "3e3aa54cce392288050a178fcdd1ff0b2806cdcfc260941bcdcdf15fce0c51ed", - "f1518d57342263fd72331f1ae5f5335f537cf8fd715d39b8a494f5efd91b4b83", - "cb002e8d02f662cdaffbd0d8cbda44f2b03b07b55c2240116e59f7156b06d6d1", - "bbf756d3acff5a452160e9f2cf4b6ea7e037e845d9a7ebf53c2df14b2a1d8c74", - "e64711ace0529ae2518233ecce23174da44f3c596718f5604c075d4129976080", - "68bdec55f4ec6a77849df268661d8f217e9bc4e9f753f23cc4ca1b9b945acea0", - "9a417c26fe03ec2a77fd14089a7fc2da887dd2ae295db8efc55d1524506dece0", - "5f7727d64c2be0e33b085c7cd87d9bee6a295c84cc5845d14de002f57420f78b", - "1df4286384d87f8c6025ab4789ebeb2c142c73d43cc72dcd693a408eebc540fb", - "84aab7d9f7456ecf5f20fcbfc12159815512fc0fd43a380985f54022f2c59460", - "db0e0308e8ca9dae226c5145a7db4cc821862e8e460b28d74817b33e35361847", - "ea95b79a2ba11149dd59179acc3e36a5782a8d80bfaf1d11efd9480091c46262", - "63be4b73079c9fe4849aea686e377e02bfc57ffbb3c344c293353c9c2619481b", - "61ba9d1c985d2b10cefc66a35d3152d2f0f85d3db50aa1b57838f3be4f7d4bcf", - "7a95b4240b35f2f76a239f11d393a038e5a2a2531cde84d4f4db047e13dddd5c", - "aaea286169bfcb2c64a0a15b035681baad90586a0d932892001c4635f1b9247e", - "5c7ea9b82f59b934d51b40e49db270fa717e26da9f599212bfb2cd8e9bfbe2b1", - "70fe9dc7ec83aa11d54828a6321131bb2d497e64a858d19e279ba740ae8ec4ac", - "6b553a14ab0c12094a68d8dfde0f3533e88ed218aaaa7952e8a7062b4f51192b", - "f0acd3e4428989ee2ad5d48ea8d875965a8b61e497dc496cc16c290c8c0051ff", - "98d10a5ff908f82da9fcd39b83c950346eb43594f5998357ed184e956387ac4d", - "3612fccf019495fa5a0250224f474aee78f3d5bff957227b607b6501fda81469", - "d105ccf357d2ed9a5960b733158e82737b68ada988ea01f5009142186c8be966", - "f7d3968e83df989c7914dc0c8288d98954453b6867494027aca2b2dc2c1adfcb", - "b59afdf67bc37e1b14c5c96fef85cc303823d5217e74f7a3813809e5985772f2", - "040494c5eb310314adfde5de58986b687b2f1aedfe8676a3ce0aeea313af990b", - "3c314d879a50b857a3bcd617a76d0c9d3a5d9a2a1dbb38bac2906965e6f2b5fe", - "0bc45727ff3e4f089aeaa2ffe2cd43fa5e1e1d612568c25e32300f26588404ed", - "b4f24a22b2290a3e24843e0e92ba55d15bc982024bfcc1f2251cc2e1b936f5c1", - "b390466fb39a44ba6eccb3193f8c357cc64549004da9bbcca7d0344f2502ef8a", - "80a0a987cf31fd63b16633046ccab0d99c65716e8c94b89daada6a2cd488facd", - "afd6973734fa34680b66cbda8e41e9e2a17b3a2dc6a8846c66db7ec0caf8bd12", - "8d428db325aaf8ee9f7cf56f2039279991086df84ca7d214113e071787f37ac4", - "28b1e1b3992dff64a7faf3c82bfb226018d86e8bcc09c52d1b634f60ba74a484", - "63609967b98084bd0645c08643af4e73b6ccd21c47b2ac4c72ec2513548fc585", - "d9126561357ae7e89dc6097d95d99e13acdd7522d1bc98c9739da912266d40cd", - "0cfe588ce569b3575e90a4fa40e0b2c5c41e191679c8c5927e3c235ed3dbeed3", - "ce3f7c050e93d66e72a066cc78d1f1424554b37e683812a68d0ff94744d8a456", - "568df6bc53c4d93f2bb2181e689effcde5de222174151a8f88f54a2236aa5684", - "23274ed45a2f32a5d275107b002fadedbd1697eca7df757e16aa1d9d627f4ae4", - "211f0acb62bcbf7e9a5910e20a48fe2d7628ffbecec7242f75ac513820b8efc7", - "108c5c7be5f885e41ad045086612eb0019aa0d165298b861aaf6b8e29eab1e10", - "0f1d7ada0c6d82a31ac62ef94ea1115587dc74f538767a04c28de4f51cb23a36", - "44305bc9a5dec577e68b7e871f0bb5579225d0d1c84346f13638f7fa0f9abbd2", - "13bd6c397567e8664faafbd5fd007baaa61793f5faa22f63330ad4cee8ac1748", - "a2168295d9380f7095b157bd4b896a34bdfc721efe8cd48e6251eaf1358addb0", - "cf02f5220d3da28f2bca7986a5a097bb5a5a89a735d3708bedc5300f5ed2e9cc", - "436029f22f02fa81263d2ebda2f813a66433ff00de63bafd4113959e4dad3a91", - "9fbf526e3936e14f132cafcdf4ec5efb467628ceeea8f78ed48e3c510ff5c60e", - "9f5a2e999bada9b6695a00a202b6bacbb61859c670f081c9c45028d34f45dc97", - "e7b9ff62a1cab3448585fd24473888927d80737f94d270b17ef1c7f33e7ba8ef", - "9524775d4fb7b4b831cd76b23100d3ec49556e7d299c8340f196322c67f0f97a", - "30a2c2a7d00a17b9f6c58d65b506f27e115d0dcf4e24ea15ed10bced77513f28", - "d7aa30f1c370b0c778abed605e88868ef36551f05b3962f28c590c6b080d6596", - "d204a500ec0e8fa9be0862591e88948fef96128f4000668eaf622500ee39d3ca", - "aac7cfdc0fa0a85e85f5704312504575df69696d6e6a1a1f9eca01acbe0c8d21", - "15c694008461f89ce98ba4555ab74323162c00661a81ce8257d90bf9eaac9c91", - "0c7a8860e63b742faaf97fcf1331a3044b7d26fa27d4e6da9f32fc3eed32575a", - "d4dc86df5227220d9a1f5d0f516adbccc349d9aedb995c69eb020f4227bc342c", - "a9f4617cf5584dd7adf646f664215c854c646203d39e4c98008e6cae7005599b", - "cbef3e13eded06a7ec916f8ca62a43cd14bf0a8d9ece34f8f69008d5e0d50825", - "f04de26bb69bb30755f45c9aef40143c180163751e1b1aac1c301023b3202d30", - "4febfd9bbe7b1b90994d36012640c4964ccc9e95322fc61f65f37418165a51a6", - "459be9303979b0a6572e2d2ae7d8bb195e56d591d0d50121022b574a2d984c19", - "2e0fba87362c58ea31a69eb18bb50330ff12f7945ddcc564dd376f2094f6a4f2", - "ed8765033ba7967fe7f64a2c7c1a5699d77ae4c095108d7631a45dae7b22a7a1", - "f2863756c620e5551646212d32a66a241ceaaed3fe7ccdbf8f77f9d1cffb946d", - "573a874f591405dbe3be39af43ee69d077b64fde48287939f3be5b087a2926be", - "3457e15d7c6f08a25c58cd93842c2011918c4e0dc23657c2c45ca3703d692026", - "83dd57184b3fc8956d9589bca4a7bed27af65104088627322c5d6f9559b7210c", - "aa11d78eb7e62631cae752ced1177af3fa05765e50ab606225bfbcf7993a34cc", - "a037edcae999f6830746c1c47f14be6bb9d8256254ec8538dabef403d55657e1", - "d4ecc5e2eb0704cda132f9e07a33645d9d9c48eaa8214c31f1d98617115fbfad", - "af1ceabf4f1f3a7d01b3c7797d4291c170190b09bc419fbe288fe5cf58a20922", - "4d544c8d914e972a29992611a0921ea601606580aaf02b2a5e9ea1e2d3409195", - "5a33d3499e1d7a83973e6dc33526d93ccc57c991ecee7e3fdd7549b0779b68de", - "2d4e9b18bc93003b4a066cd85afb68eab7db8f05973bbe442d39eb5d1075556c", - "7edc27ce96fe5f606de5dcb79b6c311ef014be313a48477a2e8a9a01994282be", - "750d176ba2d9bb56c8cef68880fb1b2502b484cc340ea92e90705b7f43215072", - "536689ae5068bb7aa7517cdaffbc74d3adc6b43e9905aa7aefd19d7a37390309", - "97aa56c445a5c2004a569c26eebe36b218f7c6e74c61d0d2b52ef58507a1d125", - "316a95df1dae3bfe7784f9d48dfa45dccb263d8e39ae6cadba21a02437377d24", - "d8ae4fe25faaecb0a55b5b68fc038f4a4e2db20c3dc440eaa319155bdd844e9d", - "d17df1d92bd57f92d2f37f57b449de80e7d9a350a57be5ac25face581a076efd", - "64762e64f8ed934809ce8d19f14771a90a98a32761c7ab2b23314c86f5f39186", - "1a2d4e64d98b5ddb9d05c2745548998dbc22a8ca3d333d6d4e2fad4bb70854a3", - "9fabe3fafd46828acd015fae87cf7a37cc0963952ff82b3c4a785d8f07ae47cb", - "ecc150785298c5b99b1853002b82af4601495cb0f50cf61a3d3398369058fec9", - "33e8c7262977c84b048e62fc2efb490c9a29aca06e1e6aaec76dfd08c453e915", - "2b9da112911674f174c968e87af3822b717c0ce000ade7458601f0643af15751", - "7927eaa8d45236014ee630625e5fb67b29445f43820cda7448840454f4a14b14", - "82e3e7feb5127ef38e3f4061f9ff7b25492368e7b3b1be3335a5d0b440c9eef4", - "059c124ee0d2c074da32a640ff1ccacc9584a72cfad4d8b1b477179441fd8c43", - "9b4b7376df11b0d23add4e6b31e52fd886c57176274f357a90aa3c177b643e9d", - "7756d88090399deb99b9843bd64be7c26f41e98011c603c24b0199dc21e9b73b", - "e0c74992e49b21f9207b1af697286b5df5df84186621db6d2a05fd22f46242a2", - "0cece235c4f7e5c58369f412077fd27bd16c7c48681ddb0381131e6759e170f7", - "18c3061f0536ec45f1023eb59855a768b6f7889c7283b695727f4393ccd96542", - "7784767a5c012d50e304a067d2a9cf7b40fe1da744b755beb2a067dcbf0378e6", - "102dbd8f3eeeac10ad6dd34ca24fe3b8185595582c3c3aec52242fa02632e981", - "61ec1937fa910df72e669a207d9020c9e71448ee4316d7a0ef3a148da8db371d", - "01bd1542847013205c25948a69467ce1ed9ee8ab5021ba50f9799877b72e7cd9", - "6e770d8c6ca6d51b7a6b0d239724b9022b07522d85f123daaf69147fac08672f", - "3a37c300c71c619116210d41917b761edbe63e58e6fe87a07704df81909dada4", - "d2479c383d3daccf4188d79eab6280e46a392c7acfad908006095bec75eeee86", - "fe6d30282ab49e509e96cad6acaa286ffc2db44764e48a59ccd99dddb5795908", - "9841c0746fc0558c17b59a31569d6b74021a20fe3e68c6ca83a75c6ece7297ba", - "071bc9877c26c113beed0fb3567789861139bfe419862b614cb65380425dcf68", - "d324c534c4dabac4fe47f2d22a724d2352409b27942b960b15fe40a9f290018f", - "0f7c0c706d83d35e6e14176ed8e8104822d70af5730e9fa02a83fd32e3fc793d", - "7d4c269f02f32575b29619dba87597da4c6d94cd9070fc7734ed1dff40f3de94", - "eb6bc409ba1ae1760768991c8f63b3131a4b769d0540161ba598a44be55166be", - "3e23d6ab3e9f0014103ed392b9ee7f4981317f5beee3998063f27473617cb139", - "82315c8e65d6a6aff950bde213e9a96ebb26696d7b13fd5cff66f39923a48036", - "705197ce0e5a00079a4c02681f8877283320c964ff502ab5d76cfd755c7be66f", - "e1b98d65215b9cc21a0097929e81454a38beef7cff254584b0c936d187c46acd", - "06e57d7a0296dcc1c044ed430dfc22f270ed63ff24ae37060bd90004a9f9b3bf", - "112a3129af181a1e7d18079e535fc32c688a2d966ba0e66834ebcf29d4f52b7b", - "e9c4447c993366b36f9401909ba6ce54eebaba0d4593664c47d19213eaf55f15", - "3159dff8195dc68a9357261db371fdeba88bbbed01934bb37072f89b403ad780", - "51772bd4979e6c4505caa57fae25cb68004e117bf5838dd494ffb3cdc616986c", - "135bb991f1d8269518ec0216b8d99ad884c2d96c2340fe94c65ef5552263a2c2", - "4295e4e9c331e0d4ef4ecaf67c9b4226e198f4d199e4bb7ae894e94703de6698", - "5c3e169dba8444e436150914ea98e11bfad74a4046a2b48c1bcded1cb0df0be1", - "ba7edc9e7062bb4163b25043cddfebbb098ea63844f34dd56b5c237ed58d53b3", - "eb935135eb2b5a85355896c1de99b67e00dfdfa1737f88ac13e49045782fd8e1", - "881ce5d7673cc06cb3ec24e0ef2c292cac27a1ef4839432564d47dd5d88df551", - "40e5e6a8fb54b543a4804c9f567f8907893f2fcc8824db028fb70dec771cd507", - "444c15a154d9ea178abfc334d5937a0af4371975541a7e18ce06bee490875a68", - "3b181502c45127f44737f61d0cae6ff3d821d9c1e7a2c616cf568c28904aa7f8", - "cc3b93fafb32b2507e78e37115bf33fe9b7aad3bc65c5f4daccaae21523430e9", - "183407dbd871f3a1ccb2796728ca0ba574ed009550107ee339a580fd928caa7b", - "1b73779811f0a316fe41fbb059b431464b2d1c11705468f81bf18e9bb8097c9c", - "9b3f8a0afee3cb4ca3f80ac563e25e07ed063f26f3001a465a030113faa2c5f5", - "c623a506ef65b7a1a38c2fb13dbfbf81e77dcce464bb25f4d26bc88fcc2e2325", - "fb3793e005510bd2b6b239c2d250eabfe1f35b035b166bc6e9bb4b50f48d7a12", - "385e5412a019254dba94884652c620551a33c7140440cdfa98c4f8ec83cdb537", - "b966752c1403cc3c857c3cab6b17f28d76c01876a722097908d14f2a2eca98d5", - "e1f029ffe6685c2358b9b01f04a5e4526d95d8a9e5365a3298788b5a04206855", - "78a3bffdcef0c3ffd86e9177d2d4d0f9c3f1d22b95ef4ae9f285ac42185e430a", - "49c753bf3b188ae750ab22c1552e517c8464355d0f76cf348192c3d985435ef2", - "a9cdec24e910036fd2488f68d9ebc8a3f51146f609ff95d2d3a6a5ca1b034f88", - "6a9c7f14b293bf887922a15d61c6f8351530eb608035ca8738cb0c7fa79b476a", - "935aaa0bbdd6d20c6725ec3e49a244ac2168876d89c3dcb84ad8bd02f9b13994", - "1e65e204da5632c1f466c70e9efe4dadacbf211c7e0fb26be4b5c21c172b20fb", - "c6e26fdff8e4fb95cf634257ef93a61f7717a7c7ac18eb6a31c4e6a9e3206c98", - "a2aee54f66d4aa73e7f875378399c5e33f32debddfe85b8889fd3b2350d71dcb", - "97bdc56cec4b2203353ca517c0a35cc04cbaa65c676cd42eaba12ea1cc22fc60", - "af68bb3f88f23939fe2791df4c9d42c9d53717950a1c228ddabe4b451cb3cf8c", - "fc81c8a409f7dea7ab12f31f12e81ba082c0ffc9555f04ae5c51543c3ed6fa53", - "224bb477572a81a036c3487c6e52a571f801a9fb85436e9dbd28664cb4420d9f", - "c38476b844d0ab70029e807b63d1d3724373f1af0df6562b3f43cf6739c3afcc", - "991cc38806f463a698f0ab72736c055d5594d19194186ab96a8a94ef1bd39565", - "f8a250664178c4eaa05b6dd84a26c4e918bd02e424373628a74d7433b6965269", - "a1db322820523d2f9bd54f3e9091949d8c7f9c7dc1ba9ecd715927b4c7c9244b", - "cbcea51fca9dc2cf1ca4bcd7ac63838b44835013e2b7e692e3c0aa8ae564e99b", - "9fe8a01d7b22296a312e3e2de1502206c3821537ffef2adb5715ac6cdd976b0f", - "c88bfdded765420f2d76c9fe1577ebd66b2cd2c9abdc0333aabc8af4a003cb8e", - "aa7ac2f9edb49ab74289f4e81dc747ce2e7f1cdfea00ba98256c1503a0430b73", - "693ea7550a61299df17f5f7ab65884f8a06ed73b275121dd5408bf1ee5f04f6d", - "f1940d15c344d25315ac43709677f022b61125ef5644f5655723e54f652aa39f", - "96406ab080461feb4eacfc868fb27c9adcdcc038e68336671ddf8019c034bc17", - "9dcd2fd86f752817fa9aebcf388d5eaa6f8dced15a0e9d8bd57f3b79bcb837a3", - "3640faf2311cbcbcd63d6a3a6701cbf2fd6b0173aa657634244aed0e08b656af", - "247556c49200867890f9075d7e34b6c61e3d5e57070d238b1f277bfc4d6a7bd6", - "cd962e89ef510acfa960108b34d56ff549bb1ca471256b447240d27b71ed1b72", - "53ee65242cd4cc8ac136633d50ad3375c1c449cc82e625e1663aa686f87f4d32", - "3f0a34660d8975f2135fab0b10aabf78a0006990bdd687b0f73d9ccff106cdc7", - "ab6fcc4a5685e382fd5abeb746f52d0064a3067957491b29c6d12f5305d1324a", - "72fdea7baa56cffc0af489a481172de87da1cb734c4c35485b347d808020ff2b", - "a0c765edcc10ac5d478d00ff8bd8a873384befc4e0e08dff81432a88c89dff43", - "2b2d41fb8091330be1caa106310353656bd7668028a171c21f3b03d3b8d7edb1", - "3eeeb75ea1c769c980547fc787f3eafdf66ea4930ac1af6d94dd0498217e7319", - "b37f4fefb0ad554d44e765795508f544639b1b145c03dddf1a6631498e3dd72f", - "bc85a2a81a18a102e080dda3666995aa1766e87f7bea95ab4db3e592abd695b9", - "0d8ef378c90652a525865d705871a2236b7b13d241eb99d454b78d63835c76fa", - "abf605b1309aff4081adff6f47c4da33688ffd02bf52171d6fdf2458526954ea", - "15c69b01464f534501bc8548bddc11155bd6f66d65766e40fe08752973d230a0", - "9a0c8d8aad0affb82e39c185298ee1678996fe9d28262c20124c2b5646fd17c6", - "ad5b50384b6c221b4f20c15c2c718c87010532e41f8055bb359930bd5db19c58", - "ea10626662122b9d7b88f132d753871a4cad5b94be23ebadd9d5d1e2931e32b6", - "80274b6111816e2b1a319da108aec7894b144bd7329438d7dee94912ae6f3b2b", - "2da7d85fe0d87b49e6d159e459239c54da78c82a67c623c9876352f189810de4", - "e04ad93d32483adf201a8ecdd16600506760475f07e067b326db6d81d28dff54", - "6c807cf0869586eee69c72ca8de1d5c405783f044a0f02621f91891845067a90", - "0d6479151aa1d0d70229cf0585399807f189ee5d124e46120e5724a5e5dd5be3", - "bc7e01fdebb1e575f2192ffb5fde7d014dc50847de756333fec56e6c920d6212", - "f6c5b95fda582a93ad8fb892505f6e168df1ac07378052c3c6267963aa30ccaf", - "6b8ff82392ce4ff5f4bce4250519995c8f96ece6d1fdca8e1efabfe516b5aa70", - "c6627ba5e2a93e96d7ea0026b0d9778618a693137d2573b74cc2a6d292e582d2", - "b030625dfb19e11cb352b55c215093ec3681d6ab9797b1eb4444e59a24f048d6", - "63ec0e61773d62ff6557aedc6e686388c2f517be954d870e4e450c44c7d2337d", - "1fbf8eeff5629b79a3ca6ee2311e6602cdcc7c5cca4f797473d1dbd8a011e3bc", - "b17d94970e1b6f4ebf6d1b8d932713796033d727d5cda890f4f43c52516cbc26", - "876e34e03a2ac111ee3eec9e7e0458bed7f7338f054707d2dc99076f8f39ab04", - "eb2146a2e8b82282890a58bbb4076513284d8ddca4b2facb039830e7f7aaab40", - "ee0cf0ebc94317907fe5e3859e760af434619585aae3ee80420935e3ae049bef", - "8898596be52add32809d6c545e353af2edf764ba7c5ea2430486d0a6c329cfa4", - "7546886b17cea0ac7f3102c5074b71a6d0218089f04dd02f770aa7d8aff4cfb7", - "bc58361108f381b865a09ea65a576a79ab1c6f0e4ed80c038f589e8bfbce6627", - "429a11d89f79ab352aded2cc4dcea41f3214f0c4803cf29c2d2a4147ee6be30f", - "8a85aa2b57101cfb1541b9add79dd52399b277ce999d1895577eefc9f172c38e", - "f80b5d3322f9e8d9f7235f0f9d1be759c0dbdd7eae3e465343b5c73179d80e24", - "1bd647bd2fd1710d15d1896ed0df9a4013980c3f98e7c0ff9354c91b3e5f412b", - "96bc62c4ceb4d351b1c9ae7875b4ca8f2379685764f596bc889185c588efacbd", - "f64f7cb4ceabcb07691a63bba0689e37521c11399868097e266fd260838d3078", - "9b08102bdb383c282d4353909c02e515f7c1d2219682cd032c75ac88caeac518", - "ae150d2bed35dfd7b68b84ddfed08b3c70263ec4764d555a4b03384cf26f2757", - "32090cebc2468076f87abbd5a53e596ac749148a3bd22ae86897e49a8fe980bb", - "c3445e5f8256ea6f27500a920c97028733636a4b2d2dba4a81693727476f1f87", - "9e8109c03d89643639177c9eea4c1f1e7b1b5fb8b756235c626e51ec5384fde9", - "fa13500e1d640e7538ea52338d555148d20ae5ae3d5ff9704099ac5f79f84358", - "08a7a215758a39bbe38ca246a28790bd26993d3a105ed799c8b737fb937c131f", - "1b0f3637106e9a4d8f4a6328b7ded34fa660315d2c8273ca00894c2f2ac2e9cd", - "081294b8a68a850ed397974130ed1cf18e8d02084c82453056a9c63baf2747bc", - "5955b665a7e3741270952c236529188a757298a8ebae1f6308f7113ec5ebb42b", - "8e72bdec56529ad2e260ced28d3907c9804d31a0cdd622abb387d5eabda4f7ee", - "13826b0efce5d9b6fc3a3d06d4c4dcb5a3f290dc29277cb80e90fe45c52b4c51", - "54bdc6757891060e8fce02a9d7d40bd7dac713ff8d4cfa5226f41d3f63744cf3", - "b6d92ec26d04d995af17936f940ec599f4b1e6bffd9c9eb6448b75ea4cbdb79e", - "3d467063ea339a688794d65dd4ed415fe49147b603a77a6a0308ccb4c330e9ec", - "3d7a01c4a46d3e2b81ab04eec00ebe47c849c4b599d3098fe3014458ada3faef", - "735170d6333718ca97662f89a2eaf05494004d4f0dabaa059f29822f8701e14e", - "49424158ad6b527b5b57f9bae056e71cd1f681f1a9c2bb4afbe303e437ee6f1c", - "163ceceee6b85fa7e35a00eb772e99717ed1547971a8c00029f4fbee956abe0f", - "5770b3bf547493fc9452ccd85444d00da4729b672e42c69b7243ade48f76dd5e", - "99b1dba855b6c336c75bde7c0f691007cbfeae6888d9c0b8a4d79e3e0baf7e44", - "eb880d2cff08defe035952fe8d0064bfffae991f06c7763d0188aa71141bda5b", - "943376f9b2fb26030a28f8019e1e93bed954512c74e0f63c59c83a7c32345974", - "5b755978f40cc22ea13c30522903676651af4ed9dd3979a81b62fabbaeee1417", - "eb2d0a7306d846e0bfed3de5847af99e1ee29b1ed901360b65995dd5711f3af0", - "5aca68551e6542cba9e53db09c5d57566ddff13860d0d36fb70ddb7e13979040", - "93014ca35f3e498efdd066965a41984fec9319f25a3e2580d07d3519d13832a5", - "0908917aac104299d4c07fc51fd485aa51dd0d23b3007e8b94d3f7bb98c86c70", - "4e8a815a1954887255a4272901b2752565e1eb6445050c6d2fc98ce343c75559", - "93f66d9f9acc80aedc51ff4645e28874439bd055f2b4a364d334c08e1c0ed9f6", - "b2a71e0ae01cfd3d4bc10be7ec282c1b6b26faf58cd0b83045b0e4e21fed8423", - "f2b527b8e4f340a9cedece95820d984d0bb95bf419018638e1254ae5dcc84fb7", - "7f7bb2875571f236f1af9ab60286dd014f8256fea1347092ba17cf59fc1dda91", - "c1f4ba4f12456340b08a3b8e9bbbb053f03b8cb58b6fec412967ff950f9f4a02", - "b2bdf408991561605b6cb848cbe10331ec85e2173781f6f1e2d8d4a70816d1a6", - "4f12f68fc7d8cff17e2517c4e6e0ba4767c68205a66caf2b53a4e730c52446ca", - "82487c750af103011cad682f9042119c412b45711e7aeaf232c0d938425620a5", - "2da8d0a67bfcd6e9edccf34325518edcaf0049f9c7ab2f8b6b0ca5ea1b7e2db9", - "61b396427e1eb14ad58cd57c06bfe8d17589afa761fabe34757182fd62366dea", - "779e511601487e0210296fed7e8ad68c982e24a839d9da0a20f286fb7810b537", - "69fcc003c32ca12d58b9c99a498f553ec05232117744fd46bb326e216c682151", - "5bb0effb59431b9273089ad4cc001572ce4383bc8c274e46431a8acd32d74635", - "dbaf17734ae19cc0443e5a472bf9e863a5771e3bf7afb839169a5230fd3038b8", - "6db235b8b16c62fafd5c3221a5673b317f9bbc1d4fd3d9261479796f858516fb", - "efa2a71d1ccc6f0f29acef740879bdf6480bd5caa91870b1c8804d05834569f8", - "0b4e9b6f74f84b26485e2dbdc142249856bd28ed8b6ee910d8c6060ec8a71cfb", - "bf915b58b910aba448403b0252eb778523d6375c9c34ead2f9ed3778de2a95d2", - "5c03f1f3af76874740fd800a06e10baf3801306485a127ad1a5feb72ce10d2ed", - "e5d6d6eea0749816a6125a299b9c8df25066e29579b64af1c299ca5eb45e8a47", - "aa111d3743bd93432a9051d54bc62428a7e291d53a839e23fd89c2f11bf894f5", - "167f5e74e0a7bfd3300a08e3aeaf6e9a11c4fbc0ca544829814e4be2a1289908", - "1b66e13ecd1426c5c687fe76ca9c1d1f80f8143488b1113e9cede6797db52b12", - "6c80d07c3dbdbd2faba6b56d00130ea788bcc9c3cd4d75423c70ce99cf41162c", - "5ad0a239157407bf9be52df8cc5c0cf32a359639f188b1b59d3c52c6e4c9a87a", - "269e81323aae2b5ba83962dd4cf7647d3147babf2b438dea116dceb88772255f", - "809bfe568e585cff4cff1d19092a9d585e9e29505ca85b2fa394e9b7732683bf", - "1d5aef100332d4eb2c146ca0c7bc48e1de38da6c66ec6377c7e256afcdd84a74", - "8f60428c4f9b41b8166631d36e7a3102fd2d2e2ab593bb92e8ca9d70f060ea5c", - "b0461c0741f097167c237168e0d219318b307a8194b07b1228aaa9321e64bc1b", - "7682d700bb295313295ca6c1f80d65745bd847b94476ea755d03b15831700dd4", - "8d545935d7c4b2bb26ec1c17946b4aecf854a4e47c8b47c4faef3326c2773cd4", - "3b11ef1c51b0befa0380524a7d0b2159e8fecc4f0661e7a22b9560c2bc0bdf3e", - "a7f4caa93f97b6983504a1e130c135b1b9e00d8116ba0da375d2a9a6228d39d8", - "09e1511522a54251d142b18a8232890bb2ec8bd6104dfbc6682f39db0721d306", - "650c81c064a49f75b00734b27448c753c6023e79eb159073c4af26910c68d90c", - "b03bb502c74c9f37f5e5604f2427926d645960e7817104b637ffb56a7db27651", - "a8a2aad545a5a622bd0505f69de8431def18423fca2c84beefe7972037d79ed7", - "0f2eaf767469f99344ba8140c0729489eb5631a4ca8fc3db2e4fa3b89a8c1091", - "05116848c72f7ece6a2ffdd774f0f69212b3406395089d5eae6a21fe5d85c2f0", - "c580dfa4e001bf39f12d4e459fe9ee262b300fd5d91a2f83764daa9df6b6e394", - "28184009000f7d88d5e73911c0ec844d45942771eeeb7ed44ca60342d83b8464", - "494e018716ed7c5d25ecb328e526055ea1876f3f680dd68c4756deb7ce525d28", - "f2527a3361afb313613350479e8210a801412b2a7c413a95083583f1b5ae109f", - "1ac78f8db6de0722caac807f8cb4906e0ada65359b96acb7d4f1e22fddaa3de9", - "896e7b69e447508c8238602c983b73b82f4be4ed5061f433905e3aec6cf2778d", - "9ca8dae265be54f32daf507c01b44b5e288ad3abd24f0878ae210afc625af808", - "838ee449b938c66a7f0791eafff0e680681a186f645327fc5ccb2b215792ed83", - "ae521fa0a58516a8052211477b9537acf8747f538957c26ee7c2e994a0186ec9", - "eedf46a54d076a032f42c2acfccf07d75c2c8741f11d4adf79537569e9f8988b", - "79b6e7901503a414f8740b23bec9b3d9be326c742265fe7d60e0b40d5f139461", - "353acd0757ae62a2b7ee4879ab5607f4181593b545d5fc2bb16e216a2b9d99c2", - "16ed4ae18b2670e9ac096db93b8899eb9fb929002c2131d503dcbc97d92c94d7", - "15976e2e68ee53e5ddd950a50db3f6b6e8db20c2f0c590eac44d7bc5ecb7809b", - "05be45d7987f3ca617b9284a5c5d133f8695c10a80770e8e23f1766a34c23f80", - "8093f26f7a3166d9105e89a6030f8ebdb8bd0b613e422d3af1148af36470d2c0", - "092c13872fde63efe38463368b9abcdf0c05169ad1a4c5faa66682211b045e90", - "a3911b502406daf68728e88a811dc9d5efcfc92d01b2a37961851b1e84b05518", - "e18b85a5905e8e3b0c0891ed8929e90b4bbf8bcab0b6ce30d595fabaafeff317", - "d5ac4245da53801ce22d6bcdbabe1295a169f815b8bb3bc230be7791f18b4bba", - "d279271e3df93d9732f1d5cfb270a9f1698eb198ff23953129a31ffaca6619cf", - "9b9fad235e765559c3d5ce66e44a53427b12466a12e5a3bb04a0e5465f5e8a6e", - "f90cce1d658cfc0d77ad6c869c07a299df10e41720db28caa6c1dca3bf5fec7b", - "cd4458dfc7aca8cce6257b91c198b20c20f1a8d723156353e5fec0650b6491df", - "7179dc717c9140f70ff478e6452449833e79c472024e530d238dc1fcfb19342e", - "d738ba5ab322d76ffab5c5776a0883dd462349244b49a2044cb1cff55b460894", - "f45966f8738a06ff1065a1a81abe3727ed1d69a88db33e61955812c35e98cb49", - "bb81d4a102971a46e58c6c1ed4bae030682f63bd871b34555d58a9757fd6b778", - "3f1401e21208b04cbc56942e34cb081096470a3dc803e54a41371632662d3d6d", - "38af68d377ed4e0bfe4ba49707ecad65eb1a3e2082c740fe765f41909fab28e3", - "12008f915e5dc74d57c668b1a92b1a20ba98d8b85a336b5e4bf794f06be728b1", - "0f753416d368c4ef9f76a30e14fce80fe48ace0fdd909c9cecaa3a7b69114f71", - "cdb2623289a424b7bdd585582c8e69f4b09532f30ed09044b599d4a1a9d6c9ba", - "d0181eed6fa6ff5bb0f369a5042ee32251454852ad293e288bdae5953c5b8c0d", - "20aecf7a588313b6e76462b1ef42f1d006efc7fe433543e31d6a3963ad55e4b5", - "64e2ad31d2b6e48f932b13853787a09352077c12f77e033f46ae727b9cd9917d", - "3bf7f731ad6d828c20689ed7fc646a1e66ad99ea03742a426d9439a135e11a7a", - "bd1a7725167f7b4491e448508963c36d9110d9426105f1d44cc5fc64c790f886", - "f0a6b2af8e61bd617acb2a62b55b64dcb94537ae4830e68af9362238991d7b6e", - "35e1e964da434ad18b21b5a6c8670a6757cb610e60e8d8f9c60a9252d5e9229e", - "56bcb5d1f3f974fe9326c3f0b50138de10f9b8d316890b47dc12881dbe6fda94", - "411ae818b2753311e554bfe9584c7abb4b358aa2175834048e945ad5c52fc371", - "719a50a0854beb4c550d1d0d993c2af58e5b58fb063a9301353a2e5e809fc7df", - "b570307e5f7229284a37bcef974ad3fe4d5d227427e7b10c26aae5de9826b2f6", - "abcc1f5f8d3b958bb26e1861cbaedbe6a7313cfcb4bfd9fae6eef7e3ffd027de", - "20f2bbb947c6ebc8178733d16dd2fb25747375665d1bd31d15a811af48e4fb61", - "c85ca918c4761c8b31f5ea8b8847bf920206353f545dbb59c12803ca01cf5fa4", - "3a8f933d530b43a827b02fb3e6b8d81e478fe80687ad523aafe29f98441f34a7", - "4182b5f95f1051f23843ab2300abd0fd9a4a6a772a4bbe61312d0408e955d046", - "628918a4a0f1162f3b094a5df0ea162d9d3fbf6c6a6912a44d9c95f61c47446b", - "9d2bee75c138e34cc21a31ce16edfcdd048e21070332effe2bbe01d4e83cf50e", - "2dbfdace4339245c99d6877157cba04aa046d73a5694c75deb4a0c86ed31af45", - "df876c4a6001f016c5637160d77b54067c7431fdd8d2565bf50096c6a78fb042", - "53e2136e69cab5e59c332eee7e4da3b86366304d745a0874771b0254ba3b1be8", - "3d4bb07910d93821ea4b3b2a29dc292d811ad29832f91d52c8b6406788f78570", - "0b037a81248dbd3e6afde7a4c8e7124358767475f3c8e685ddbb259bc0d356b2", - "ebd7927d5deba93750991c7a4370a251ce35648c35537f7655db671d56630e16", - "5339db3e0703ac1c9293276fe0f120471ff1244e75cb91ba1738c6dbc226569d", - "279519289fdb8bdf41a34532631e71099fdba020121750074796b1140745e975", - "46f4c1f4228ae226cb3c2df869e5b3e4e1f881f00aba17493b3b187faa7ba7b2", - "7685efcadc86bf39db32791ad6021bad25e253710fd7ad398ac47bc65e0af1bf", - "19d14b8de616f5dd4ae50485a48af81f1a2e5a3b6ed173251da608144259897a", - "a544fd26c8da8862d75b6cf2ac149f1e3185637a2b2e9ac6d11b6985e3de2f44", - "6c1f4c7d5b0e2a2a9e196b2ed83f848b4ce4c33f01aa72c59ca60bf3d472fd7b", - "af84323ab4781f2b973d13e9e0fae06e002f79da15725d7b64bd07b1cd6785cf", - "fe762165369e1de7b7f3d1540b8b2ea2bab8b7c99787b83aa40f6549f91e96dd", - "e16c0c91906e7fc90e500a45afa2f4164dd37dcc65fbb355b5aa8cb895dabb81", - "8c4aa49ac71db581eea19db95da29a74248b4055e0f604ef498d56dbd89f3041", - "5633c0390e7fa2ab610183d3b71cc85fd1d3109ecacd8c2a1845cb3e223c6471", - "48db90c8db54a13fa740273d8e72fcde38c3cb428016450960708143149f8c71", - "336cb5a10f1d05ef9a96bcfa2aaf6f91399681aca01ca359b5740294a4a4f11e", - "f7df64f9a8c4a21e72e83771cd09cc204776e8a5397266182af5717c1976480c", - "141d25175499431fec93eb49e9f1f436829856445470ee22527aba44a3b52b98", - "7cf8d80557617fc23e2b70a4df2f47a467ebdf8a58b9ec5dc1943b218c5bc4f5", - "0c31ac2e4ade8302eb91fae9e37c142408ad6cc2be4781e02708d67f91b886de", - "2d1d24f82840908704377b5b72dd596db7c29b716a7cfac5fd5d9ac5430cbca2", - "350d0d7a5b8add35f1eb0c9b4e63ae9ac0ab0c858af63805ccc5b0af47eb598c", - "ea676ffdbedcd2ff2e5db1694f0551d95a1dfdef30ca8e64835790c49726bc02", - "d99247d91241a6ee3e16e8793815514eccbb5358cb504044208cbd52f868f4f8", - "379ddac422c06262b58389a524f2bd5337c3afc57ec0c9378cb1f28f0039eed6", - "c71e236d89fbc010e8d37bdb2a233906c30f88d4468f2e3eca32359445386ff4", - "68fed3e18cd02983f5399650ae3e26a82b304658c11882364f22af99acf48b2f", - "4bdac5af1c41478988dbcfc651ad325129ac8a3e456f07616e67cbd712df3bd9", - "36e95d8932ae1bc99bdc03ad110998f3603d97f09d9e09bc4a3ee76c12a8d83a", - "dd1065ba1e847db910b5f0574a42cf394b6b42c4ce44191d6d0c95d00e621c18", - "0bd0f090a8fe4bb257cdd60ccf04873e7a0080602200a0cf5ba5b1270c969797", - "07b66f11846cff53dc20929b71901288576a873013efa4eb2ca81823a7811e18", - "f94888bd4c4bb5b57f457b3eaabe87ab9bccda1b6a14115cb7e397c2c47153c1", - "2e324eb47fd2e3c356faed82622ffb8f1195b1def965f60b1bd4c367b62940c4", - "5b3d53780caafbc1585e949e8bbaf604b4d5f5c148bcbf5325a5cd21ce861584", - "25da87b89262d64f82740a14a6f5d5bb63c2c61ec4377313eeb7fa04743ea5ad", - "5be3560cc462f538645ab7f1876cca149753cbfd49e09634296e6fe9fbc2ffa1", - "de4dd1275bb966f38e383863efa6cc780b6c0d3504ea36f244aed6e32a77869d", - "c3b73b24873a45df22506980622d9fa30870bbbb2d6481b5c0c46d194e637095", - "11b7cbe30f7d116d8ce9d0fffaac96b1045abe1e5715b40dc6d733970e240feb", - "5b13d9ef4c4bcc78bbc1de1aa0b81682699f197cd98a2c5d2175f574b283180d", - "cf6277e4fb3a40658cdcad66e58f27d784d22a28bd1853d616167632cf19dbbf", - "646583e25fa60ec67f8bd74c3765ad205e2ca58d87582e9d530e94cd684d89e5", - "f42e9c0518cfe91c63bc212cd97413dc66001055009e305821b674931c61effa", - "c1efaba856e9ac5a3b777763744a5c791d05049799572dd25f90e4866d755915", - "edb913737e1c7846e419406284e89a3c6cdcebecd7409025dbe3a4d32df63d8e", - "2f5f66e587efb583690076a141a5ad67a684dd49d1a758cd7b2d70610ca72246", - "7ac7704e4f5957dbb560c0415a88ca7bd626b84e12aa606ae238590dfba1969e", - "8ff2c886653f2b29dcf7f4049dd6a20d02a8936ff09da22d5d53996ca7ad761d", - "a2458f08dc844f2a82ca117994d68c82b639cdf100674b3d727fca6267676a33", - "8f67c32115642936444e45d5372b954267664ffd5b8354b4f101a35f385bccdf", - "87429d0d2707b5cbd2e1d8e1c3136757779f74ec31f21bf1e02d9889f7fa8400", - "7f937a16a88c07e8d16163754021cc858fa21d4aba033d72908af9610928d9f0", - "34584f5e56808f110dc9228ba24860eac2b3a1f518bae0d585a7d67763a7984c", - "ba9a7c3e1fff476123a6ef05258a5b9235ec83ec20cf53a90c9503970cbcf163", - "860469f9ab2238921b939c66f61b641ef2078eb71e17e2b8cc2d4de374a6d1ed", - "839748b85853a8015986654f4a800bd09e21e89b937fd23f9aee8e23a54b7c79", - "b75b7e6708d1be89db6a6f0a1063b9169752cd7b94488a281f49c1a8934fa268", - "1119fcef59e810f4869cf7456accf4518f3c412543dcc7ba051636565fba1514", - "d37ab8c07c4fa4883e2c230d75c537a5f578c3bc83f3d82f7f6d77de56739e94", - "c7dec29cbf1e3036d66f04c9821d8b6cc6efd77d1ebc19258b14cc1ce136d2fc", - "8af6e7a0c18e2ba80d4e14adfa75cd416ee64395abfb5347856ea6ed98c3218c", - "29256e13915f00cf22d67aa9cab4ad2636ab69116835913b6d0368a84db25a4d", - "c8c1cc91bef484b0ad855e0ca38109bea370c06dc71cf349af27d6715a05a13c", - "72d1037b8b13a36f187cd044024bde4d9012104077b10911af554726ba4b3b5f", - "ce53c306c6ff6c6b9ebfd9a56e8bfd0a4b39ba36ad6cc83060904a005972fb10", - "416241aadbfb1f2fb769183527437b8ad113f58747fb6d9e6703d03c5d665a49", - "308c4f51490ab8fe4853594a5614663d25f6b924a550bf32842b0c018c568008", - "a2a92ec4bc715e013994b322f33df96d3e9e39d228f70fb7185b4dc178daaa2b", - "87123a1c5ff0aa5f4cdb1b54fc05ce97cbc9376cf9a9c0782934b27e0f6f9ed3", - "180070577aa9a8509b8828e8675cc3e0bed21bbb646d1440c79ba6ad4b6eadc7", - "315ceb44e2979d1f7657e7c05e9d8bfb7efa1659945b7088db340949255fcc2d", - "42bd38ffadfbd901ae3d768410d5a1c7976433458e934b7d66537769bd1d9b2f", - "2e07f3307bf9104366ad51876a8954d22b926bdecb8fab478070b81391de1fdf", - "e72049b7deeeb9221c4a290b15c824441baf23f017986de25ea1bed2dcd81b28", - "778ace9af8febab4bc0681c0ce8bd64637c1c6f921b324271e1cc2fe0839d8be", - "2741ca92e6018f3ba67d591798b0cf0c049de6838a40daa049ee4dae1b7e658c", - "9d9937e293ab8db66ac53164a0275979b93536b39e87bc38e1a82a2edce7dbdb", - "e7e05d8bbb2bb674d6f9108b236f840abcfdc0e0b0cdf2ddfbbe8c4a406b2c57", - "4d8028be164255cb53a3599a8d6a4dc3e89dda37f2b83744cb0f97c83ab4f34c", - "33a355ec1410725bfaa2e0b5c7bcdd9117d66b7767afa4bd3c7879ff57f8025a", - "b0c08b032e16353974bf5dc4436b0d464cd3f9fc78e7c07be5139be1b197a62f", - "928f67d835d39612e908c4aa8aee3be16012d9cbbdfa73cef727d8d121e51534", - "a98db8ed8ed105d0e34ed94f320b3682443d73748d7dc1820c022299e9180d44", - "61a702d037b5777dd6ad2b4e1e487a6637ae2de5f15e708958ca406c9a9b524d", - "5f198f1ee4cc891a4c02b1bb62a217345712dee51cfb2d2ae0909017938e0fae", - "456fe5cd045be05bfd284966f60998fc62bf662e4d612cbb696ac3ce38185905", - "86e3646e29780fd9915d8c1bc48af6c7051801dcd411cb5adaad6cf55047e35c", - "61f6770a927635916accb98a5e2eb033df1746f5275ac35aded880d81a18aa0c", - "e9c436b97980d735caa2342c054b9c23424c30f13f0c16380a86c428e6cd220c", - "23af50c42edc3a793c534f4b09c76d96e21b9ae955ad18f1648726a868ca1327", - "c0ed860dbfab75fd7efc09dff0c85079171d6e450796984dde4e4577a609dd4b", - "4dd68bdd8507ba42c4b5edb96129e6db239a991c946bc45cbf72f29148ce5554", - "f011ef5bb7491cbc4ae1613ba84426e575fd22ccc679da8f018493c747e84298", - "28d1dabf5d22fb65e6abcd68a5fe82bbb7f2fd9baa1ef91a9e0a57ae3f135cb0", - "0d21017dcc5c76bb139185676356e6dc12a364bd1c8f323cd1c873f9c8084135", - "c5cbc616be77566ee76aae975b4eb87fa2feb656bc6543af5c575a0849ed190d", - "3f212781620eb3f7a1223be0842ae64a03eea9a55b154b44365603a9287dd1bf", - "60605bf28637f80f05457ef8f5d6e155e166dda5c05860e1a39de84e3f4d3c2c", - "9588320b857edc650e01c1c5685e37965f3465955c8b27bdf75705440d7ec0a2", - "024a2b0f4d2a7f38f0cc7f0b483ff477e14469f1f7280fb87c0bf352ab95346f", - "7f04879a012d99ab7c9175be8300c0a38f4e32eaa97f724d7bf60a181cd5a057", - "0a28372242e868e6027aebc444f114b4fa1f54abbc5654da3eb43940263c4656", - "6ac5a16d1079e2e241c701c1d54873934e8cf78d7ea1179717906fe48fe3d25f", - "25e55844a97b6daef55ccedc25de3025272a2a7d4a3685513cbc1a77066de04a", - "f02767cb85da77fbb01bc0d2406161025f41e332a6d47b688c7e4abe2fae50a0", - "fe5d8210bc1ec832ca4605f5e4423645243c1aa398861f6904f17e7f7c138b9f", - "ee0b2e38636457f8803e8b43c11f69c9ce71fd502b76419701c9841e3945ccf9", - "f497c2b5255a4a8c8daa9ed3e17b617928171bb4b103061eb2422cee7974ffe9", - "81973e06988f2884d42c95ff4cb5f58942e394458f9b7378b4423729c0c43554", - "a123e8d2a70cb6c5918784840e4876fc56aa1db8146ba40a39ea555f9407e752", - "99aa513c3e35cfa0b3696bd0ed268c4b231d751abbbeac6a6473815a721b0351", - "8266a0cd154113dee8d6eec2caab07c973f4e11ed4b0e88d9c7f62924ea314bb", - "9319097467e174b76b115b48ef13a1f2846fd60dc20f8dcc904f81e2639ec222", - "a79bba7539cb38c431d1e950b78f33e210571d595a2473589702878a08ec9349", - "9ffbe9d1ce0750386ee62ca17f6c110eb128b8e733fe72047b4ea451c7d62806", - "950b88bfd39b767085785b250fd3c7d5a7fe2443006b6de21db404cc430aece3", - "f1ddd30aa21cb3545dd6bde1334ad060d95bfb01f10970342545a325ef9cc724", - "23cf8a01d20422fb279f91df0b6cd4fa0db45d349ee12bc445baae2565c38ae3", - "7e00214b19e59cd4dcc0ec142d7674614b28d66ddfb8ed6f6f526e5ee6412757", - "7d7bf32dfd46b8eb3374f02b687a6a2887770a179127ed6df87b009860f18168", - "7816821fcd9da5d7f6cd9ca25556ccde60631449db1441abd9d9d14361a61066", - "a9ddc92af00584aad75678e5210ac19c19e7515032ee77e9ee648a528b3af11e", - "464752bcd373f7fe682d9765ae0e3c29dad6b480afe85dbd62e5976aa2cf0ef8", - "9607fbc4c08c5c3f0fadef6ebe5a649d86725a7c7fb20170fd8301a10d63b89d", - "64e766c42bc2ea63467ee5200ff393f27b7d586342ac69f21b24ccc25b86dfff", - "ef6883bfd5ca6a25e177963c1c4de103c985e37ff0171d54834ab83728d44d6d", - "930f3627a00a0753dcf3f3206b5371881cc9d6c7a8b996e77fbc0b8b07e75528", - "1edfd49b35da564af7a11170c7a0d7b5962c3698e47b9760af9352e37ed4d9a1", - "968dc1036123fd6d597078afe451df70cd8595329b43bb3db715ea2e44cd774d", - "2a23bfde412abe9803895be1b03e1d812974c81d9a7b160e8597628e1ccf864f", - "09969bfa3c362eaa0da98a940254dfd7c54a31c1c26dea378b14b545dde6cb86", - "ed2ae40169ebfd7b7870ed3de7e09bd98190fd1eb67b8a80411bd0ca2e97ea32", - "f04b099b8022e0d98f3c1d08d1dca4544d1739bcc9639b43c38b4a5fbb997b50", - "891856e1f7353f8da9bf91b6fd3871c8eb516a3530bc9df1e88f831260667f72", - "343f0c93f54058c08e953e76cc1ddc28ab9787a63f16608568d79c4241f5964a", - "66b2161edfae081a033ac80007effcdb1323d39b62e76fa22e2855a86f2af168", - "354e0a73d393d0e0cf79230f21751acd8291dd4d096e8ade908eeec713dbc71e", - "479e73c8596378e626175294b95ecb397a69dbd2686094cf27c5b04987d9efcd", - "6d603322da1c883817444076d6a0b435736477a52258e9beda721dcea7c6f8ea", - "260a535bc136b7f2ad8cd0db670c216a447ec457a6f27f462ff21e10fa9e2b0d", - "e4906e9a6c7e171cfad25d29dfc95ec7e536ef903ce722a42d6c852fbbc1dca7", - "c70addc77f8daef1455f70f638708a7f6f2bc3d54a7a346bd0a935064ddfbc1b", - "a65e16b06c23518b4b16b800bf535d77ef94452434bdb6fbc83dccf5b73771c3", - "ecdf85127c77f3600ad9699ace257e63085d466149313a0b845de346e08131e6", - "88e6e45c0d484ece7e90ba66ac088fc866d389367f3ada9d00e84dbc39d037d8", - "7ed257a99daa5964aa6cd0c178b34592986f83fd67711e0c69f062c19bece6f2", - "21dad585e7ab603685b61ead5dd2d5131a47e8a6427408521673ef073d511bc6", - "cad902ff259c536cf0c4b90a37e97db674a246609c2304b838d3b2920aae0f33", - "a4c2bf8e667446e1c89ef48622f2e0a14172070f6ac18c3ace07a18c4c519d33", - "f3312451f654ca8aded93d5166a91141e47be5e78998885e89045204bb599056", - "23c20c1b879bfee5b1ba7d42dd681c9cd6bfd33a473a8dc73884935e5055d704", - "b00a79b5cdd891791548e69ce873a2e542c8f0ebeef4014ab10f8c51490c2cc8", - "042e4d1aa67c1f0edc9ea9e42498811458d0b3ccff472c3e11cb40161515ec87", - "45252084d97fdbf4891ed7523967047d20a7a3daabc48670b5cd5bb46043e057", - "7397e3206b7e8ce3129c3a813be3c51987d9d5a51c90a234ba7673e499154aa7", - "729cd15130b5195de7f9fcab8eb148ed0ca3f802a49692da67e9ae57511aaced", - "486dfcd9c07aac8e228828ef4faff5510f1421ed1fb83c832e66923a8799b390", - "658681f1bb6c9de1c895e84430c170d536ff60f9dba1b71b2f5e8a755cef600c", - "5614c255ff33dd7949d66a39e3f82270a4618fe3c552601d6678194a8c21528c", - "d7ff550f4136d170492c9a8b608946c2d01ae2eb80d772d9684c1fe9071aab63", - "44549b753accdc4b7cf33376640a2c7f76d0c571809e72b7db2794b8a79c7a11", - "e7b7dca262496815463028566d54823595b62b0b610c343a494de49a4305e36b", - "22a5f387174415014b325ac3f2b02adc7fd5e2390de939c367d2796756034b62", - "96585de3a9e33131e840434a2d9aea4f352433902b8cbf323d9290a8c70459a4", - "38e0f922f9b640c507837905c909e4a1738b738b873e879e91d86b190c01ad29", - "881290885ac7392420ee89636766dfb8d712a60014ba750fb01e62c30cb2422a", - "a670aba693a057e5b8caf9833ae81e9384ae39415f10e8d7749a76071a4d77b0", - "eef29cf8ec6de11ae6aa43a32c91858883a5389b8822ed59428c902fb798d5ee", - "94956949dc7a6cb4500cc2dc864f1273fcab490b34cc5ab7bdd90149c3c85cd2", - "bb38ff2c9287fb2c17061a25869318f428fae6e4df94ade5d71189ff878451b3", - "cb176fe7da0b81a93ae917c33242a7a71537aec9d05ac08740300279c6025539", - "26b4f12ee4948bc277ddbc4e02371cab76192c97979d858bd72adf6d0596a1b7", - "d9dc6421f7e13cd90c230cc80c6338f530f8df8059b69bf1ab421122c4c20ae3", - "7795b26ba10b69e0d9938980a1c4f7ceaa34f043ab0a7339c378eaf3fa378849", - "0a164f639a624bc6aa9563a7a7f224f96195bcb84832f8a373c014a0598721a1", - "d8fab5b680bbe70a1ea1723dd47346c6f0391edb0ba06472e6841b12a5849382", - "c92dc17cb79ca3679e62b4f61edbdd87d2531ed3ad73c3e8e641b8431cafd1e4", - "635e9a8b52fffd6f3d91a288c2d0a32d45fd49d2ea444a3803b8f9afa436e42e", - "0e3af4c6918141cfba92b3197658eeff5bb29990bff583eba72789883ab37e03", - "41a0187c467f43b228141c542e0f847b1540f1d21cf85d06438f9cbce648e59e", - "4438c5d6313e905fa705f49ef577bb57d7df7e900e27697fcc0a3c9100d9586c", - "5ebca73ab02c1866c6edfc3273dfd49d2b4ec246168e3c62fd526ee1f0c2ca46", - "b06de6eb562f675c1277ceb4de5c12bdb665a1e470c3a74742d32021169ac398", - "3f21ec84873ba76366fefa97197f3e686af0e12aee0e07a9be5576c2665eb098", - "fa45bdf22ebba943e3a26daf9397e75f1f06ea483db4b8a0cf2dc258bc934803", - "7ef28e69faaaa61a78c5847516867ceb6e994f803f6cdb122610373cb8daaff0", - "28e0c869857cfea28916c3b6e44a33b3b3f70b4a0615e78d1163619fcf0f008a", - "6e37db810a01e5c05c963af9e24ac5c40b46fb43d7632e6d12e8ff355c644ac1", - "cb2b338ff619050078b35eb53e7df59ab53adfa535db94bfc4e32485a7d7fc9e", - "bd281d3f1b939ad668ad6755eb3060f4ff120b16f01cfea21cf162a8756d2b29", - "f7405d19fdaf346139691648bddcac9505f880c401d4206a780cd987eae05afe", - "d075cec9edff1ad8daba5f2e52266d65acdc0a84f0b156657b7f267ef0a865fc", - "d4d01e8532bd202b23dd3d1cc7832e6cde81e647067ca3acf627ee2212483872", - "70416bddbfd6d83b28077e01ed2ae90fb5d235d3dda9b0d58e4b256fa1ecaf36", - "426db8f03e7ade6fa1c6ba3fb9137a57cc8f7dfd6da67fb8ce35e4ec0ac0e9dc", - "23ca0bb4da0bfc3e4aa50ce8cfbe279fe50bb64e1a87b82a9785aeeb36915036", - "bb551754c3ab493e5d56257068e0e36cc486a597f094c3fba48e119a634b4c29", - "5a50db5f084a9803a122082ba8b7d8a15604436c3bb98bdbe5e55a1fbf19b49f", - "c9185f31015fa83c06cc01d3df4bd4cdf07f5807f9a04b5d587a7d46d37fc05d", - "5aa753c8a756fed927cc08072266248f31f07bf6bcc5056394f6eb066cc0fcb8", - "aae73094bdc11dfb02e44ffdd85b6a9768f7bba78fab1a3b4ce571f97e9f20b3", - "1d951046f6d772864c23fc18a28a2cb3bb15034061dd3be47c919436a533c694", - "03b0e2a9445fade0b54682a6104e8160bfb9de957e4be26fc64ded8e52fcc286", - "d857042c9285149962318ca1b40387beaf131a5474cc5a12adf55b536d67c64c", - "8ceb27dc237d2486369dd75f909427fc0e3092292eec38032e7006a3cc511aef", - "67a8c57b586e711d0c2892fde86f38cecb80d10ab84f1914714ba0e6950b429b", - "b5d8136ebf941fcd048ed0ee9977660729da721dd12409fe7eb1b7c4a00b6906", - "e4096f99a797bdc2ce6883f38a2906645ac5b544aea2961fc5e040a7435db662", - "10098dc44914dc5e3595a06a253784516581eaf95c652ebf7517eeb287d7d440", - "092b8d6bcc043eb21e7621276fdd0759f051c508741a5c71e226483966cebce6", - "0f2f6583e1c7778dbc62e5abc9fd1cf7297305c94c64c6c08547d39fef0faf0b", - "f7eca7376b75abc2b4694a98ae7dd4edd29e5a312d0975a50331a8a33211f085", - "42206d2dd5caeca82ae6b4f53d0c81f7f4b264d2ea52d08dbecf383ddbb099d8", - "93860ac1132e863547b30c21f17f94aee88f513e4e9a094744406a08a62c4f14", - "353f44fdc32bc8de9d3c71d520ca890ad8c5de342af40fe7346b67df8f10d146", - "c227d662961586994e92f4f83ecdd6dcb83bb0fdedfa122bae03c344d302875d", - "88fe7959f5954c1866d7920cec640ae62282fe1f12ddc681e8bfeb6734f4e573", - "de4685cebb2d30c85c52f3a391efb7810e27f88163bac7c2a1ae4badb103345f", - "72887d76e20f73ea826d8e49454c164bdb2f4f7e9fe8355a0ff4fabca53ba2ce", - "50d1206286a3fa21aee092e4281819e519f19dbe5f3e385999c3967ddfad37d5", - "53ce1408eecbc5f7c02f1e823c179c4634a963bf2a6ff4453332ceda6b786ab0", - "dde3569956fd60e47889ff6375f7024f548d690a725410eca358bf41db8eee36", - "75e225effea4dba0a3ac78f1669f70cc99e186b02dde7d7774465328e8cec688", - "ef354a1cfd0b1287400084b8633c9d025b8d1ec9b62954cf05e2c6f55f33821d", - "d01ed2fb764e4f95760e834fd167dfb73969bdf8fdb7ac956931c093d37cdfad", - "8d3e1c1c848aa0001c8be3be42c281e230f686b903a65bfa6b5f62d2393e7637", - "0cfa3564ff06780b1dc520ee4be782456d7b2e0d5dd97f216c76d75e1089ad2a", - "a4714c44c374475a87737af109d28c3508d0a99e28bbf7527ed2c77e62edc67e", - "a1763adf865522593a2ce746c83a280931c237f8021d097b44e1b0453cd412eb", - "3c43e63e32ab756afd352c2f67b70d041344532e71ae66e3b840a9caf40b5c8e", - "2f1acecdab83b40042fbc710bb6699ee572f8e2079e7cfb013b171d7f91b71bb", - "68a16ae443fc2c515fc5cd987a827e6c7574fdecb41643a2a3299b5793c65c63", - "832909295a18272d97dae142bcc2de27efc88a7b3ef0213278065699b79cbc8e", - "524b18a076db94862ed398873b7a2929e7ce79c2df76b1abad0a420611ef7cf9", - "1b0e489a7399018de27079d6191d7f35c2a0b7574743dce9d5bed7308d87298f", - "caa81588c8736ed05a83ee9a55d5580fd336d8f9d851e914f51e15b60bce9644", - "e639059f4525927fbd1157296c1437435c94cd7b2e2c5fd6ceefe42bd798cde5", - "4b3c03d23ba8f3f1749b2599016dd34c3de8e48b7f81094f65a9a195da7a34c2", - "335cd7fd1d6eec112550f83e9f6a35190962ae56196e1cce68f7966552a6961c", - "9dd4976a02ed50ed010693576a224ecf13a3c4792169bce10a021492407fbbf0", - "651d05755bfa13c287da9bf8f1b17d9cbfb142ce9b56c021d5d9feaf8f11102b", - "2cba7b39f0541a716ed16bcadc1ab65519dddc781fe62758309e79186292c1b7", - "84dd43f512da284597ef1fa4f34065ca3fde10f7aaa468227e59dc24e8b4d1c0", - "5950560bd79f357496da2d20c249a6d9c4bca7721a9885cddddd20117b9b6b5e", - "1e43581a267b9a2a07665e60932305dc3144898f3c09baaa1cd9df8cced14e54", - "31494e0145ada348291393e5977dcdd2fdf2e108e96d91a39a0142be498c3057", - "075b914bad4cd1ecfcf59007e964e888c6ef131df333d79ad8a15bdd4f8e17bb", - "c2bd815733352539df9c02ad088d039628962804f688b86bb30e9acc2a3e4df8", - "c75bc936d11a8146843f1353129cfda7f40fc63c3018976d1556fca33f1aaf94", - "ee808bdb637df158cb410d435c4455d790c043a9a5090d69506e86216565959c", - "d441fe91d1fd49f774c97eb7f6cf3c444dee1a1878a56213f29e6a9aa153ca62", - "382a8f6b79465291ad6adfee1b8873be85149f7ef412a3ca0eef3dd1bbb050bb", - "59a561eaaeeb8db38a813bfa4c270e33c0f73ad2c08bcc10cc5b3461003ee279", - "b331d0fac9230096ec142138528598d9e1e4f7390b484b6f3f33b96c20046cc9", - "731c129b8e10a4ed009db4187ac5a00298ea98194a01defdd20733bff45f579e", - "87083a28d996c126fa7443184d51a5e1f5ab5f910456cac20d4841a08d3760ca", - "c19e8a95ed8ef5daee579992ac77b5743dc65bf19627dc678fcfc2a48b9362bc", - "96fa59e82b3ebea6677d414d2b538354d21b3ee48770bc70e1d2be74fd4aa4ec", - "2998c0b923231de0b1dc0457d4a80081c7f251c482ecdd3913f5eb3b99442507", - "2e9fc1f2fcb071f278410d39e7ea48b11a5603bb3e91ff95f6756b36bc185048", - "a2013d6953988cb516e592a5f31f66b10d5e84605f72818c21a2175b2da2d046", - "eb0228b8afa03714b6ec6c8af8075a60c8d31a616bdefcf5af7c78cd97b01681", - "f0afe236851afb38cb3c259554c8d78c0e1b7921bd357e986026d3ebdce8ab02", - "ecdf53baacae2e45828f9462e435e0687498fd1f721084666db41def4066ae1a", - "80ea3e2b76be53b06025eeb79788202aba731a9720db74773bed4354c2544a93", - "b37ec7cb753619dc88982779201a08be80fe64465e9e469d5f8d67730aa30a80", - "d0327037a9e7c19d5249ffce7eabd145ff676f723a2c35f72ad370f0dfd9e69f", - "77325f47127b8b6c57ecef1888b97a489b855d1d8b378544a28be431095e7500", - "01305054bc797027233386179cdeac3d57dfe54d225c3de93075efdc1e304199", - "56c2b5faa83618167db3c88ad35e8893fdeb7c489f77318f2f95390a846b93b7", - "82d57a0bede4a69fc04fa56a6f58800996f23e08958950d86c3a4cc0bf98e8fe", - "a7fb4c5119c26fde4e23a5867640a707ad2395d8b6c900569938abce58de3884", - "03702a1f2b87eab74358dabff40a70255d3c586432f8b5c92b73f961a8d0166c", - "fc63b28481c92320dea4421e522083ea952e4b9aa13dc32ec50ffed13ce3ad4b", - "7171dc81f4885cbbc96443a79a67a8db55ffee44eb7def45070ec5bb99d894ad", - "10cab6134862295935c17d86281fce8c687399d8a3fb19229bee5b2cf08c108c", - "f68919e04a8df450a9193f3e094885191ede2aefb7e9a7390e6cfdacda2eca8f", - "04172827872100dd5ee4df2c4df04ee2d3e4e69ddf2b9b6531a9174e2b0503de", - "838eae3466cbec55f308a2a6de157dc5f2f0ed9f404b34ebd5cfa739ec8908c9", - "cea867b6bf6b057444c1dbed37b22eef2a6b59b267035205f35cd68b669d68c7", - "c415f3b1fbba223dd83171f98f2233924dd98d173bb8ef5a32aac90c25f1b2c9", - "31fb7b589ad8640a25bac7342408e6ba28d0f0413f0efddaaa1418f083bac6e6", - "2e0aaa0002cb47c7deb76dab9eedb63ab1985c177e1efdf10f8160d085880d3b", - "1e3c7d0e451b0ec8e4f47d6b7351c59c98dda3489e75585c43c02d961d50c57b", - "7bc51d9b362602d2ce3578590a4a42240f735b92c964017d92a50e8acb45b31e", - "de57152da06a2f438efa3096d565593494c40fb36055c8e50456de1eb311bfae", - "452b185d90e1dcea8c995144889ed2fd6ed0a43a2420f8d4bba0e235dac8a1cc", - "4bd255fccc81511feb5be6d920728eb7551ea7195b50cf1511ce42dda262e956", - "91e078793d83bb633ba254cf382a8e2928ab2cd2e511c2d41bbb29a4cfe9e3a9", - "de06a0433660a3ec4458770fbca4bae0103ab0e3f2e3285f7d7fc7c3d5d13599", - "bb8a9027dc6ee923eab75b5b97a323641eae4d0bd6ea5e77b84e599f9adb4b0e", - "b2d478a9ded423242b810b65dac4a26e2a6133de089d0c11f155bfb823288902", - "29611b9d1520a750ffbf71efb02c9cf83ede1b37dcf10b92eb7cfec7bf0b5b5c", - "c71345c3c5c9dc594a7b4b69ab41306a0d6cdf05ae05c1e0c19c21e7337a7b85", - "cf6ca5bbb20844980bfddf490f4afe634d221ca3ec25a177eedd9f0646e88218", - "43c27040e63513c92d0edc8947aa81929d985aa96e3738cb0b99bd495732a357", - "0f7ec03c75ff7a6c38c8aacdc46c5e5d81fbeddd896c80dea8ea78c7dac2bd8a", - "00ab425506ae56e47bb1ac0692b1be5cf4472792836d1a9b31ca8c74364ef439", - "ef8d074d12d12c47e58ffa5972200312922efad57eda75ae00276a2776821d30", - "c0b3b90a8f6132a0a7debb86e241eea21a4faf99985d39cfecfd4d38076465cb", - "7561b6e9933c718eded0241c0f19b923047358de18a21434700f90246d481ec2", - "86e1566f896e89ec221af627fab557738a0ee2f60ff6e8b49e028fbe243bfc85", - "eb71d15f9d46a5b9733ee47c1a43ae58b2fb6d2af2750048c2008d0eb347c716", - "40cedf7edd2e8d65f9eee7716aa695cfbfa76a6e9d2fc7e57c88558a3b663817", - "a6aab07a9e4ab776811bad8d416b98b939271aaea41f1ce9c2392c3d8efc3fb7", - "f001ee21a2446a4d57665ad4a80ac2c387a6cc112bc8cf6ec0febf491a9ee15f", - "6cb297367befe389385c0d728fbbef810a2a96ccd4d32e2613f002cad7318662", - "abdeb5cded35044e0c88e8f8b994ebac3cfc0f07cf31e490d860bb934eb4983b", - "e65e0bc67f624df52c1a6bfc95493820d06801637aaf4d6a3a63f82d71bacf4c", - "479faf2bd12b3a9258ef3c41ea5238c56ffc58f82fcbeeb168f7c5babc415475", - "e022cf0a63257eab4a09adb3a0c79ca0949867d86b3f176c2d54bcf9cd07eaba", - "f2e71929d11ef5be582aaac01f704c187e6faf6bb7a48cccc581c5b4a392fcf4", - "03c1330f9b10ef99c4c9755be9471b588d2eff9c9ae01487eac25fd4fd8ea91b", - "e4825251dfc4f676122d949f4e28666d0687fd843de00094d24b50256d0fca2e", - "0d13c24037a9bacd46a1335c60f0622f1e581a96170eb1a2d7e247235da8f897", - "504c307895abbc75858d82d52d89d75e303ff851e3d21e51c22c11d681b0e55b", - "7f317261a9000eb132b1ee42003a414a1105d1f4e2674a4157a5750055c51a00", - "b164b5e517ce759b77b286af0d348f321c3a41d14c30d840c7bf11703dce4c71", - "cfbe072c9a71908f9b05fade7228d78aabbf55ccfe19ea5b0828e974087eb018", - "2c3597a409bb20f2da0e43735829067887cbcd145d5a102fc429c735b704a6bf", - "7ec2d865c13f876d983639f914e4d0d71d7e2603955c17699db0a33b214e8582", - "5da0be16b7057a4a5ad9bc9ab10f3bf412c0c8dc46f485efc2a7df853b153d50", - "f49fcae00629845c738cba2899fb97d584f5fd7bf3b5d3ebdc6084bd4822bc0f", - "270f285017f451c34dbed2b8615015b9fa332a1dea2f9b08773953b8e6ba62bd", - "0d05b8a08596b5eac6d719d23afcde876dbfab702bb61fb00e8e040d8fc4734c", - "78e5699554f60ad860534f8b997603c10b16c305ebb6ddfc7467261069c3dc40", - "3eb283f50cdb235607cb863b9c70dfe5af7067c2631fb2137d518a4fc884d1d5", - "a8684c82836cdbd75542adcab11e7f6407c5c9c4b1a9d6308fe45101719ecfec", - "ff86dd610f732db7a1326e17252f1bdfdd0672dc3481c5c38c8258a8bd579f0f", - "c59baa995cdfcf2eb9a7c4abf5ad580a6faaf3fc97fa89f7cc79b8fa21becd8d", - "cb7f49acd84fb25b5769cd212b05244b47f51026a61cb7a50a1af68eb054e391", - "f96f229de3bf255f2918484423b70f55c61521d0933d7f85f3b6e42b86dea15c", - "005622eb5d39df03240b02c8a99096304d1bb6bdb8b6e07dba52378ddfdf72e7", - "df2e20ce02fb8e75b9e4cdef4eb48a2454f62889797215800747d598ae86d8e0", - "fe69c502e09bae1d7f7b39934d0884c51002258c3e7ce6d3e3a7ba5fdc0dc5b2", - "f3d425d1c13e32572b7f4f7e4f8e50120bf179a095ba9fc7d3811fa88a80a7b6", - "4e7f81e24af7fc32176aae9039d92e2e09a1d87b6f5793d877c4e888fa5fd06c", - "80ba1c05fe3e5cff4d2546a4ba3afd0a88f2ccb15466a08db1dd16ac9526421b", - "f05d853f97e117f34b89d805b400a00f2f4321c1f69e33f85712cf22028ceb8a", - "6929a6602e9f54dc1e571d3c61e1fd84ff51531d0e9989c678f77bbbf4c3ee7f", - "9f4ac0281153988579d478cb83e774c8bdf46ccac883e047697d646e3daa2bd1", - "cce56c37174a0d683d7062f401a8c65ba9211eb166bf2a3b072680cd3fdc1c15", - "4ce21b530e82007760e3b41d44cd26c1ac66176e0f4985b9dd6b1c1332b8bdca", - "e28439325c5050a3ed0ef238bb94739e6f40e77bb91ff20416fed442c605bb46", - "37ff7afb54e80e5a8577871fde6bcc5af20e509b98ea1b50393b8d5e07e157d0", - "b9c1aa5bea84cea252f87cd96a1553b4ac454d9ba6cdff6d82fe55076c621ed0", - "5eb92a5f17d9b81c14dc5c29c7c8dead31a16dae33253e1eea0231eb4b779024", - "b92c544a4f543e4628b47c9706aa1e7a1090aff7263fc70d2b5b163bf7c17034", - "42045ba7c83019b327e837ee16193215b8319995de9ad6e5f14733d7a85920cb", - "7b873d04e4263dee527398aedf65d4c5b8f74e6887b6188edb83fc0dc83c052a", - "9662fea4ec8854e91974ae8a39ff77c20b79e89cb6a31f1dc7caa69f388bd135", - "75fcc13ed9580c03a68a7b67be5dea318abd54b768ab7bca4710cc9e88ef2232", - "3eea896a9d589a42937b95b16f206ac4e2940b00de98103142d01aeb69fb7b05", - "c202b20648e95eebff92d56e1602b817e29a4f91ca2fac1bdeca266226139458", - "7ffe22bf8a6dacd7b815095714d6668c49fde7cb28749401b6390cb8c35ac314", - "bd6ac31733db9e345409e40340d4cc415c0a060ed1a1d030f647c40911d63cf0", - "d528d4eb0650776ab57471e2fddf174eac2cbb9b9a7a094b52b31a4f3ef6f1a4", - "6196e586f6245647e26deefd5c981bb666450ee914b615c65c3cafec18af535f", - "2402f65fc46a84af5b1343b17cec69a0bb597d87b4f41017b84f93be0092ac9a", - "2ef49e879f0113909314dc8e8693b0d06d9427ff7f1a963c2aee95965bbafeb1", - "13f4b61df623bc632063451cac74abd416455a341eeb15bbd7e013c830348f66", - "0ea9df73c528050862d55cbfa2ac36cf1f4ad10381c67d99960193df53849404", - "0e42fcdde2895f1890fda549af90ba351343cdbfcf711ee44eb1023734666836", - "33a592ce08e9fd373278dce62580155f2bd66c1467c7ebc009480c9b7cdc818f", - "1c13a71984b3bc67f4cce4ee50b980bc3aae4a24bc50d17950a1445ec81c2246", - "4df48af4b85ad2870704f8040ce8e8fd68451fc8f94bfa338e9e0229ff33a278", - "60ab7cf1b2c8df6a37d3857c8194f46fd81cbb965d9acbea580532b0ea8056c1", - "b603a08999a20f2d34173fe138b7a34b744a71d88122d396a58ac2aecb2ea59a", - "44b8f669b5fed1ea66069ad98fd74c5278471aac5a5d76a53fa533cae29a017d", - "737f25157ae8b395ae43e182be85c54e993f7b5fa59358f9672f9928b773437c", - "50a08b555f4bac04dd5228ac71cb9034e5845077015e6e62833a3c5f0462ab1a", - "6ed69785de2f8e85164b8d7adea023d46e289bca1539e1439ab4d66099b3d226", - "ef85b7b5bcc0717064c1ed6c9fa75024621f2a985b0bed6cd1374c59e08d9337", - "e6eb56d5a274f36d59f653fa9bcc9135168ed004b56e66b73be611ea68245c59", - "df79f1cd651b6042682b5f8c087610db101d4433f7b682358fdd95d04cae38b3", - "a8910938404b000134a908e4b600081e55bdeecbebc77dc6580ef2a4f2a838bc", - "c7aef8c3aed9392eba1db5e0fc6a96c86c363b1e61b35375876add1cc926e8e6", - "455cfb31e832b32dc2fd69400d9a1a1619fdfd2b5061a53d9effede6c12e5779", - "21451fb3d22dc10e08fa3780c1aeb29d99c21863aa054e43f9b42a30e09520fe", - "2cc82857852618225ba5403637ca8c306ed6449afb7295ed00267c6c1b2ee752", - "460a918798549d0737e1db83b624afd6e15d38c83107e03055daeffee972bb5f", - "499f7bd542cb87b85f43e632cb18fdd8c7fae2a25d0d026f65aedfe8a36e0f52", - "2788c4b5336f84ddcaed04659e664d2c0547827948dc4585d6ca2f68ef9ff257", - "10d70c2da66a620d106421f8494ba8ef39d2d9972067fdb356db5987eb4f3d56", - "486c613ab0971342587af9915c2661cf5152923a6c6f46ccf42eba4a1b2f356b", - "2c6551c07f0d256071e977aa9436e51d3999b5a0eb3c790e84716e8c00a0bcb6", - "8a61ee74dc47c9c63b90ff1b8774efa44f8678ab50cbd217cfb9dfb752bac3d7", - "88c4f4d19f35c72d5fdc287748a4e69463acc7484db78a849bcbcc9ff7eb0721", - "94ffb0c5308db2f5c36812738362c05a7a5579434049fb51c869ba68dee8c91a", - "9fd9b1bbadcc7dc12ee5968db083f3ebd5b9fdbe6dd99f1ec4ab8e58b63ee617", - "c359c174fa297b54a7e16d6ad3024190ac6775f4cdb805148c7a178efb074f07", - "c1447d3ff72961fa0b08a8dfdde72f646432a08313b025f4ee9ca8e9f4f30eee", - "f92215ca2d3930f54a27b6edab511498178b214366f7f0fb9ed5c21cf16b3767", - "5608c1556f9dfda96473899b985af9e78127cf2df164fde7139d09de4c03194c", - "284464e983d8680372756f16ddd6b82e7b7fbe010bbe021f1bc304617077ed90", - "cb8db43b623c083ee0e38863006fab8a2b60bd3d1fe050e749ca55e14204fc6f", - "31d7d67643bfa56b59e4263e897d5fe1d07462f2c456ed8d20ded57758ada8a7", - "4c53534096f0c23cda81899f69585bdba6dfee18d6f509b4549e822f76745b2d", - "6a8d6ddd43df4189078eb6c212245466d89002a668bf7a5c6aa59465bbe5762f", - "e69ab4b3c79d1fb9837d6e6af7e952f064f134ed4a84ff036efeddc4d7391753", - "e55ae7bc7773ff60ac4d4c588acfe3bd1416c0f10097261ac365c37a6900cb97", - "25d9c7778aadb978d8af94ecf72d03f14ef615096435207301b8d84f0194d9d4", - "1446c27475e085ce6e59dd5f1b2fa6258c7bb1581b7988ff1d5bc815fbadb4b3", - "6e7f22f90602988e794894278e4606a0150af9527fccf1c10888895be6576eaa", - "ea920264528af411c57a5081ac787b822bc2f4a0af8068289da5a92ffadc1b30", - "828745a45e8432e0f1aa6e05f54a18a528a8aba220fd3669b0f093d3e1f0406a", - "768d93ece34736d65cba7a1e7d281db8e3f88c63d470b5584cfb8b27b697e239", - "fef1ac215e583f3f1dc4fceff9248f01886dbd293cf3ab5b92e4849995907748", - "3b6899d4b15bf7c599db9bd30751eb33534e60d745d4f60db6a62efbffdce70a", - "878e8aca12f2bc0ce98ae63d4236a3e1c508d82c9f531244b2e0e40a1e735301", - "0af15544f0d0139bca152dbf1dfc70c3233f75ae0e6729424a67f747e9b58eb9", - "fd85dad08fbe3591e27106f4720062227ee1b2aee149f57607208cd05498c248", - "3dac447ae11937819630be4d98490291aec9c0d048b17c8b72017159a1e1698e", - "0160025f9e1a13655bb139a0297ee9d446c310c38e012aad3428013b2a3ebb6e", - "c0631311e2ac27ad7027757da8812ab6a729e37d3519a00cb4e49696ecd365f4", - "9bd31e1eece1317e6078dc0a2e414d0a668655a6ea2c73dd94cce72430c94c94", - "57b54f989af09837fb9d23b1abd19324afbfe3571b353a2903f0c4cf329d68ba", - "0bd8784d70001572a64eadd5a597070147ec04aad1a766d4606c4314533ddd01", - "425665ec0044132ab4b0203a0d9bb3173d7fa2c3582348d31862ccc6f18a7f28", - "4054c3156b8e72f08e6a1e1c45e589e01165e96eed112353c2e5e584061ae47b", - "5351206b41d2349bc2574f847475d7451231cfad0c36fc78112a4f5ee22db6d8", - "1049e952373dacddb50d18138530a69f9222c37b99aa379b7ef74bc4577f968e", - "9558a70c8b04800d1257827bb77bdac3a3d5283ce1d0b19addc42942d35db310", - "5c82104c68c74cc41f60f3a8a21b1fd695cb5379b885b8656e5b3bccc5bdf649", - "3479d4acedf6f4c24ae8accb2955428ec2dbf256e151b70737239707577f0a01", - "e3bdf4cfb95f3f8dc8b23aca278678abec175ef5656473ee28d6f052b649b2a4", - "022668aac38db8d5210807b2587e577ebd764a5e9d96b0bf0f0a35d378a20f28", - "339110d543783974c8fa392a9e697024575f9b773cc70925b3ff0e989401d450", - "1011b60e0ff2df22316f5ca8a68b970fc8bac1df1fa622a5f07809acd2a4b9b2", - "bb33cc0cb8ccfbd8bd3293a40a6b7b669a14859762dadd552f65cd04774c112a", - "974c9e57291d00369ce71f15c3a756d62b8aabd4dc8862ac00edff4b3a98d978", - "a05a5c8ad4903c0488f3ea935156d5d1cd5fdfaf98e2d8f60e912e92da75f526", - "3c77d5e7b383bc2ea0f58face7571d92205885f6949d1e0e179b98ca22936af3", - "32437cb30cbb3935bcf88d740e86578ca37d7a8619316f0b99eb986913c35d2b", - "ffc5e5545e5f6fd84fdcea0ae51213f04099fb446c430aeadd6aba7f8a879825", - "5f52f917820473f757fac55acde8e89b675a8c7772f6d8609794f85e8751e3e0", - "191f8ea25cf54076c0956ebf43880b99843e2045bdeda07f7903dfdae8817d4f", - "da6f6b0c1d792bf9a95b8bd7695fbed0464cd8c241ab960eb4493bf143d74856", - "7bbdb0928117c1df4c3eaff2d3367c946dd6803b6921ec6688a3f50e5daacb3d", - "464a79be13b692f16f40c8e4667f16e9e04e564a30a13c9486c3e749c6c88784", - "e0d4b275ff9c44c9531cc5c3f8fc45102fe793fc9719ba1cd74ee60d4f4e09ce", - "e5f2726688d0acfefb96a9448761a217273f2d54e1b4453c1f0bd02c4d2cfda8", - "bbc1cb09e718828cb3386117d8aae9705f0c0c7e6ddd4d9b58eb1dd633c67288", - "8bc55ea74e5cd5ef532488ae8d6a974d224941d0aa072473c044909c53b89a9d", - "dbb6d83cf48aa1dfbe62b502c8cd795fd7e0988daec0870ad31ed8d3780755d5", - "7b2cefd1b124354adf407310a5b126a93f55cad982e859a4f2c9d2646f075e2e", - "0d7088be4093a65535003f2004e565ecdb551f3ecc806ca1208bc5c16f60a6d6", - "f7e0f867051a7f66fdab261e8c9a4c24bedc54a88f1ea871abfdb20579210716", - "32d7680579edb69a7e0b555eb31f9ab62250f1993aab67223696b76ce00e5824", - "f15f960b8f1209e3b8822d083e956844312e1a8338c17342f835bd4bfcf24c4b", - "2e2a993301904bc81be9fc7860506dd262a17d363a835d84c11b2186eb2cbc9d", - "742838e7563fa39a12696e158db2da684c58825f17c16589ce88251ad93d9333", - "79c024f1e33a3c8bfc957369056047b543907271e712d59946c1df238511d978", - "61a31acc6d60e06ab8572b002909913d9395e55fd8ab53c6b562302b7559a525", - "ad0dd4755f5ce238ae14998688fde78c5b270a10773aa5d63bc26f493e6a62c6", - "76882f3685d14c6daf5e1d915021192d3c09b187f9c7fadca3a5765683383a11", - "2e0824b006d6892339b1e24681abc091250169a51ebc021184ce32e5909416f2", - "a7769ee902ff33928fe0b786ae40323bf1c840b0115f6aa64a70f694b64318b9", - "b1ffd05bcbf281935211cd8912980546e96a46452af5b7a8d9aeb05edf54ab87", - "7155ee74308123904cc5621756b0f0848d96f4fe8fa34a91cde723d6e7860fed", - "fd7d9319b39149516cb032463cb02c8766ce9b5c5035f3656f89f3444f3028da", - "6be3e693d4cfe1ff67d0efa46f1bf9d181d50c4712f4be9c0af923656748a52f", - "b710a6b25f69b11165d1a341963c01024ca01adba5d427a1029d43b86ac7b0ca", - "a81a660dd9e652133c8b8e9f880a6acd3c0a4eb44893c9f18e1d69a055d79555", - "a1522a56f62828defe92e2e92201d460c807f3885c9507fa8780c906cafdff0f", - "b2afde4669a21ddcfc89ed5630118c2ece9df5555c23cd8d179b440258517f2b", - "a186ee141bb039077cf25cafc1dbab1efa944c9ba7b156cc7509e0b59e58238a", - "da258513c8fa58d3bb91a5b1c8e02b9ce81bfd2f2a757d8f5b10615d851137e4", - "d0c83aae61b54174b7ed265b50de3c1c5797b2ec93a034582e5adebff2fc57d2", - "a00c53a409a2776c8ca71955497445b855784f8877e2b3bd7e705b7aa700fc90", - "fbc483ca7fcb08e83bde0b35e5f9597f72e62385a3968760dff612ca46c03e65", - "f094a76f71e21f397a3456a3f63e971cd139e6358790749a2142e41cf756a67f", - "e1cf261ac3df841daa8fb3b7552e64cffa27f07c5c0ad0fd9cd36cabe4d712ae", - "520e58b97671d97ca98a35bd6b6f1b314509b9060cd5c006d1329d984a59f4bb", - "9834d552a427da6d05a487acaffdb272be9d21ca2484f649b1ba817a6baf53ee", - "2ec329352defdb85a1e12dd42f051e00456b995f1270fba0c08fafe1f640da1c", - "66ebbeaebbdd74fb3a0213be9cb47c64d5622b964e9e8939dfbed9a36b100c0f", - "c7d4da65185833ab0e5a3f302f5750feb22013e5add57202243245724ab1f899", - "4a322b85ccf9a7531f50389b19d49e82a0daf94397d7c53baf5dd72311c379b2", - "bb1df4222c27f5cc4f91ad6e444d74fe6c667a4d98d96853e96a6892224cd04f", - "076f7689df85bb247f6bce78319588b1991f2e85e007da10e8655a0aefd1c82b", - "07b55f5b274771c4b2fb8300fce09e5758c4f5203abd7e1b1bd6f988f7154eb4", - "9012d20bdcf5d9430b0eb61c8ae9e861d09c181db6bbb936b5a1c19eded689ef", - "2b3700c779a3c1b1e7bd853fe382b2fc807c0946e7eddbf289aea8b33cbcee53", - "5d2aed4680e44d3b417522dd75c77e3bf6c8b813e2b05541908d0c5487d0f4bf", - "355c05eb346829a214b1a7807f2d46ef31174f095bcade27db536779f9166c81", - "de78c016b3c10a55528e200c76a0689660069b37987f86e0f925b9de5799820f", - "0c7950cae364337ecf4cad43e5fd074037da450a1774227de3dba3b1ff4962d9", - "d5ba1b3d01aaa06179ef7830fd1fab180f42fd6e7bf59e12a4ef75c4c9a340d6", - "264b35799f6c29292d3d47dc83a2901c12a7c77eaa8a5c92b09c21befd4fdd0c", - "53c8de8106d9b3a62924fb865789a86cd335e68cd578a4bb24753dc85c424a57", - "197e805edd8fad772ddac73328dd4b5681a99d2ce2e5531768bd188a2527c9b1", - "89df45dd15d1584f381a42ede6bba3f5932340da856a35e3318b7b30515b0c9e", - "c69bc4d5f8523704a87097eb3cfc1268eed941973d1112278ee1bc416d575b5b", - "ae078cdd41a71f5946301031d9ef8b8a72e4498d4f8979ef6e7276a975b16e46", - "4f75a5d099b6e354e2902f6cc0617715265fb6f8564a2d2adc40312b686e2491", - "ff4ca0ac0ee76b2f9a5e6555c4878a8090bd752d9ec4eecb727a2e3676ced92d", - "64fa384f0feef00e4ae226380bac0cf362d8edee49101f04c9911c209a7c7c01", - "5f18ee09bf663ad966e7df3aee9c3ca34a79d36c43794eec51d56d1c956b6e59", - "1cf4234b9439067d0287ff0cabed2794864d2e4641c7d6e6a77d32a7fbe0a14e", - "8c491eccabf23d5b4bfc87999ed68ddecaba5195f4c378c5ad91884c69041fcf", - "6a761350b01aad71962fb59b9bf4a25a22b1375120821cd8b4484441d68b2edb", - "08fe9eb8ed6e9ea8c8475e81d9999368ee009d4eeff236f290a8438e241f9434", - "4d0a06e3b880d41f83e564228a75f03e4d5aae819e41061113a8c785eeba3c8e", - "9eb80cd7e4e424e24a717728f08fece56316c69e18f3be366adc33bbd921d1cd", - "4104ecbcf1a7b0d216c8e5d8ed33382725134e332d86fdc3009c1cc708761ab8", - "6c68036d871fc3aebf7f2b7587d8bc6229a83bda2e6dcfabeb3c47a0d66706c6", - "facdda2fb46edf0ecaee2969d2e6326d78dca4c2620b70ac9a021a2e694b7edc", - "bc7aa4aa6a1eaa77ee00f9e4a98278777a1826984eeacb7008b4ef71ad9327af", - "829e4918f4f98b573bc850eac8e45e2cb78bdf898f1c36f1b8b1647ee94bb485", - "a86305c243b5b1b1bbb713c70f0065f177d96718fc99eeca3894cb4e07b84e3c", - "47e8b95be1d17d36daf9df079bc5d4d1e243c356256c3d8abe2aac5de241bc92", - "80a0a76d05265513353468cf1199ccb36ffff1edf3af222c5a9f1a2c2f0a1907", - "e1cf6aaddd00c984b9fbefd4ffe45ee84980325536cbd4230a5cc36ce3823e48", - "0fb5c32ec1f0a0472106506a6963a5cef683e9c4deb93f3bc916806dbd08e75d", - "b2c7df2af6f645c69b1612b7726277e0f643af0d98b2c42475a90df91181dc50", - "f16c0e873c6a92e27b01e7089cbfdbfa529303d7747b1837445d1fd031167653", - "8b35a5bf3dc9866f234a4005aaddef58bb407a01a9f97c2ba511a0729282a629", - "29ead0de06bc124bc9feab91f7ea2ad947c36a3b7d07df2c24d5f24a7b725cf4", - "586fc8f342764620d6bc9e9d360481a90be7a9e11049bc8ae5989a143d5bacd8", - "f322ecf71b6634288d2a5deeb934baa0c62e9077f727f87488cf5d770f0a9640", - "1d2a86733400b4cfd1d3070855cdbbd4a0971b7a4f356c93a278fa31128d3b51", - "a6d428c47ec90c54f564bc23a98b2fcbb622e87bdc9b5ed0f7579360b7542225", - "4f4f476ed66618524b8a892a3217195920eaa6bb9607c407019cd78b075113d6", - "85a4342039c1191e5244371a82f1e6e008e0f3b6c0bb1270a0c6afd0659d850e", - "496689f6c52ed818dc519b0c662d6414bc2d55468d4692d11b500e569792850f", - "b0a94af4e9acbeb4ea346aa17c69322643cb03231875363aae34fcf898b4b30f", - "1093de7e6c3b96b8165c622603f30e9a6ea597541206332cd322b99b29eb4e07", - "70d242a039d340fab5a99f20decb8c5a511b73f58a7013d0e86f83a12099c911", - "0e94aa4449f048db815293b11f9fabd7bb3f4c13b67ff3c69cf201c9feb5437d", - "98a67a01d5e40dbe561460d04dafc09119f03123c22bd2fe1a14c1459e0ca8ab", - "46e71bc95179f966b6a5c797ea94be8963d0d61497f1df42a912a49e4dd76478", - "fd394ddb25b7d9e4c44f882cb59f0c2b9bc9707a8cb47fad296064693261f64d", - "bf4e950418049988616c35bebeb0d6629e14123edb66fa2ff1cb8ea548ba7d71", - "f00fb77373902e14071a0baaeca1c9c7b46e19520feb65a7e3f83d4d0deb3e4f", - "f3a787c6d199d0cccb88a9f86f19e39efa654e59a1fdf604bf29366dae355801", - "dc33ab01ce42d2a6bf4436efdcf781e222e76cd8403d7645f8246ab7b5abbf60", - "9129d89ac49aa9a9fe9a95aecb213a8f1057931e225b1a62008f819766693304", - "4a2229c23a1fa76a38f6eace56a4c90c2f83a5596d376d83da60e592e49f18a5", - "39a39e0ec1aa4e4758f7262be4e69d3a96bbce92ddb93ac8f3d2b7500e788cf9", - "0496be94fbda6905a211ee79dbc0d64f02063362e8148adcf94c715316c8739f", - "cc97cf5ba9adbcadb144ed925f35ed8c48a38d3f1b60eeeb1adc15a4d1fa65ad", - "a1744eaf64ab3599111311b9a1ecfaac4a68b31ed2510b312d990ad3b5b33e0b", - "864ac13d82029b41dbc96ca62fe9ac3140891af5efea08e17dbad26d5cb181b4", - "9da68ca8bc580c8226a5fc1e3137b24cdb143a6d8a4d52cf16e4696ea4a40f46", - "0ff08bb26f91fa99a797bf7dee1517294ba1e810804fc1dadfbdd045810d2d53", - "54879f7d603b7686f22e3f92190d62aea44a423e7f675a41b76ec22eb71227c2", - "297579e7b4a4c71cf8c12b7e40b472cb442c47935987efaf70b7e4e7aa59fac6", - "25ff8bc8842366d237f9ae4080ccb21a01edb752491b6f21354af7a143a42481", - "c324aa68123f07417d45d8887fd2737837da4153b69b2080b51d06fa3886c29c", - "8b32ebb74510dc77332ea5a1d561996acfd68b9581bc02ed447e63d898e26386", - "3c3e2ef564389acbc20267409f831c32519eafea2711ccf522525746da38b33c", - "bf76d626c0f349a1d026b41611c4c3315f5009b3fe22fa7b0d88eee2e211f7a2", - "508706ba581835f7b7b51b0537261c18678cbe9e0c1f792d631334bc8218e453", - "dc1236a8c458a304350eba5fd120247318fd7124351818f82050354029e5f4cd", - "fc7b733c05bdbb45ddd72809755023707ec6cd4d4d4e0ef047640d455d8af57e", - "dd19e4eb97262aa9a8eb83f1b15bcff0c078d943034a7b047d97353f29ddd56c", - "25808ae63a8ca356f4b8aeab6b7916669d692413739072c75225bf85d9562da8", - "b403b5798c9df9038c694d7ec46c1f963de7f4b09ab9b18b35aa2c7b3bd60b26", - "1b46f28dd7fe209ba75957756c357286ec3f5d109f1e8b87ad05db4060d62a6d", - "9abdfcca1e70b4d414365fb1f645c4101071825acda2a4d43b5957217ef41d56", - "4e7186c91ce9c5887327193388af0d4d0b5d8f5f9177468d0f93a073ee2304ac", - "9ec4c5694395f9fe8053ab9624fd02c9e2d542246eb6c508e2f6c30609f61f89", - "7196691193b2f4b88f022fd4428e0ff8db61db0b5a651f84518878431a650b37", - "93954d83e0aaee65a4aaab9cbcbaf5c819e068f24f9caa67c41ae50a5162a0f8", - "7085022cfc1fd231a29442e5696404ad44f64f7a7ea0148d0ac9b0b6a1e854b1", - "c4b729d1fae17067d5daeaeb2d5379e01c8d9006fc8d54193f600ae1897f48bf", - "77e9af4dcf00e58d591225e5aedffb3eb6af0b47507ac296d281acadbfe0d5c4", - "29c6978cc2fad4c983244cd7c2f9f82718a0013a479f3368815f19d75fc7531f", - "28f5021c8248400858ae83b89e7f2da9e988ad41d739d315e027ac3e20c86efd", - "00819b6987eb0b32f84f748ef806e26297079201875da6fd752eb5ccca590b12", - "9357f7ea39f8357d2c591c2e9066178b8e5d3633afdac12c7d90e64eb3513abc", - "cd88e345b66aaaa23c5256797e2ede36f7cc0069105c003cef6efe2240330f8d", - "a20defd2a9e4de82ebf236f1249d0be1e441655a0edde688ebbeba9b8927154d", - "7f87b0ca7b824779d1530fb9f5e4315071ca1eda96a10dd2366d6c095775e97c", - "65c65b4f14bd61776479a23039cb2a23bcfdcbfafa58e651933cc17cac33b6ea", - "8dafeb8f6b2e90a6690bd578cb67d96eff250de13e7d5c548e825a6fa466e239", - "6d5c6abd99f8c213c3776d92c1a433d405f1693818c7cdf8a79422497b7d6a18", - "4f0da25e412004d145b5e26af36b985290f905a0661200ce16ac1f2560276cd3", - "8ad484762e0c9ce59784b35aad272060531b1bdc86385e3b8e5ddef2d1489cfb", - "022088b1506aad07c3229cc86756ba693ca95fb6977c0a48cd0b8a33b4f37850", - "e79ed3b7c2c88c6e36a944366ef5abe05b863b9cb33a0b787b4a06f7b757bddb", - "e70144613caaa16f5c052f8ba6059d0674825ce9034a2c660885462a81a31f14", - "2bb4f23f326208e622ce8e433d5a4a35c58a7e873170481ecf6d5f8f83332987", - "552757773e648f91b14df24b1bc8223f8d5a048b2028e09d11f98da45aa5aab7", - "0989b8d1fd230b34db68d00425af3b77fd68cab6c49c11ed663c69a98c301df1", - "8e6d506f9e5abcc327c435e2125412b4e41d72c87ea110bf531060736186f16e", - "744b0b9d40dc4c672f018b14c19cd1ed72cc5d33334a1f79f7f64a6795fb7539", - "a53409cd6b9667328e6a98da226f29c907d8b80b5fc4625ddbc2f42dcebe04d4", - "84864b240e9aaace49916a90fb94ba9d5fd770aedc41c0b50be5aa328a5445c7", - "81f2fa0ed7964116a6e29757525adefd1babdb7f7458974c36e72296e6e24d55", - "3783fbcfc4fa7303fba4a9ac2980c40caefa123039cefd4b4f4a4c7edba9119e", - "0b94b7cb1aaf744c9b17ed0c97564a24dfee9a4be3489789681537b8beb6d263", - "789b3160a57299a60caba884734f10b75dd238f5b5cf91e2b348724ccae8e7a9", - "5ea856c5a1f94956b6188d25f3bea499914d88079817524ac2a3f643bacd7c21", - "568398f732ab7557a59585a8fa42631607e71f4d059726f7248c90bd47bc996d", - "ccec55166039753d7bb8735045a9c32d0e674f4347fe8d32c50cffeee0c236e4", - "b49c0af2c20a6c33049b54b80593ba079de2c261fda8ef9443b3c2b6edcd184e", - "ce5496b78af9a4d8bd75e251050b09745c143cb7a93e4177d72fce5f414f3034", - "8f009934589df5719fb1412f14bd97926c890e3ca274dd65d3f05490b5967243", - "a11252163b8f68e81f7ddd9a3087dd5386f10516a2ce0636a4c1c597c065dcc1", - "c8adc43ea288480defce608852c828ce7d4a52b21da928afc9a21dc4d04bf75e", - "5bad9aac560816c62dcfe2b253d6577c2c83c04feb31a8604b594cfcbce31df1", - "31be7fba1f293ee12251ead606b25bbc7b1eaccd5e19e99313a3a1940c9d7961", - "386c68b6e37fe7883235996476f449f5ab22983cfb3098238f164376c404a1c0", - "cd82ea4e5547fbdae528f86de3f4f08a0532c56120e8cb5186a0bf827aad2b0b", - "76d8c9aee95fcb21cf8185e865ab4274246c05b91c55bb27d77bf1a69384f625", - "4a87442d90d2605cc71d76e245a2344aebac4eef5c2b9200a8040e53fd15e3ad", - "3be008138cd48b1c33845ab9359a1b14956ef75e8274e57d0100dd09897f4edd", - "56755f6b2ab8754b5c31f1b05b878475d53d8ef240e4f7480737924271f4ed1f", - "deb0a762db27cdc50112bfb58d0117a890faab2f0fe92c38650f263d003742dd", - "525e68aab95ff84438b98b8ad9eb9f9a492467ea639a7b3f8a42f326fc4df889", - "204575de8ad346e77f35e0928e3a7825fb7fc7abfc6716bf538e28667f8fe344", - "854d1c637fba2ba4bba2dd5ea6d401026151b780a40df2bd08b4915b154b73c8", - "bfc95ddf2e8b8cc954be30907641aaf94dfbc3b229ddd7928a2cf234a4bf4033", - "f4925b5fe58038c8579ab0b48755d65a806a5b3e177abe2d50a32b6d7cf07354", - "59335bf26c9f1d15810cfa504ad086becaae996e06a58d6a84f8a275f339c5ba", - "d5e2ffc5eefef25446349fc7e094acdeb7f8553a42c49a61c2a468f6c4d1018d", - "c32fc8bd7fe8841b4e756ece00ea5513c8b46fee66e23fc0776a976f9344f3ef", - "d53a9ae40f729cab36fd8c00dcccabb0d96627c6e78418f2d4ce8723f5d44b41", - "6c9757b8b6a68dfaddb37dfb2baea3bf18559f90ea373af4c6a55a6e1bfe9c53", - "c028ac1c12aa0e95ea7f420daa570c8ede09d9a8abef2d3dc8fe69a3fd8c456f", - "17e1f3a1ddf4e0a3e69f8cefd49eb8e4e39390478153db9ecc7c83862ceaee50", - "988fe6e2d2831b39e508ea30ca4a35b31f1f8d8bc567afa36e18a6885262378e", - "5dc0ef92aee9cee43054a7454da7fe0836e7de60ecc1cb2d49fa1bbda54d8c15", - "9f280e32ece6f25c317cea1b3cea503ee30366dd3a28e4004ac22ade558ef045", - "f29a990b9cd73d91a9b30318f1d583877e454aa310ea1505639ff3cc1d3ee5d6", - "2511cda0932a023bb72343458fc109aa5a4352284cf59de726c42cf62bcc0ae1", - "6a6a501d06d295a12521cc74c0522d6a95de3a61fee61e80ba87841ea7291305", - "6cca923d386f17b8ecfdd863e54574e7a93a355b1037b0b93f274c62e482402f", - "5a3ea688c95686acd63c345524584713aa4b23747401987b1db5b93a05b46f1b", - "5fe2aebeb97d1a62e7bef8b15d0b3f2a2aeb5f26ac29717d51d5ef264dcef9d3", - "0965faa3999f9cf9820eda66239a59673297ca47c857e269af879b9a18c93d46", - "f8eaef24a86cbc0c08494f5d809b68d170529b4338f360550adb5383d6763885", - "f2f246eb651dc39741dfd9caf03e5c0e4ad5d827152a207ce7e4f523206fcb61", - "589ba038f28bc8dca35a75b8751f4c38e93e6396e7e10f79bf31a9565350e41e", - "90c5dc825dfc38d446f9d006278c01d5a6253f2ff9b3b9fdea1a559dc0cedb9f", - "b95e94ff8c23df2c8f80a1a6b08153248bccb31fed9103a8adbfbb2f8c5e251c", - "1f652775ecac469e940d5883206e5948c389421ef8ba83a92845940787deb50f", - "e8ea5e08d6703b60c1549a8b7bbf1fe6109f94829846be65532b215e1ca00f0c", - "c27615cb105ef539362dce99e7975cda808998229f986b7d449fb87cdb4282ff", - "96a4d3657d6c56bc1b94b8c144790a1c63f03c2e5ce1321e217a7a5e665df14a", - "9fc2e197e628db1340c0296a5d2a6877e372ea5a915c3b3e8639bcbb7dc7aa33", - "26135aaecd64a71fff92fa1ba57eb273408679bb8a07de10aa2839ae693024b4", - "31cf00887facc9e070d70536d46f6807379c068390be3ec35751b1b02e5d1851", - "ccb7f5d950ba182fedbaf3202e8a3c4d9c59b625784f4e24696da5e4ce580029", - "38dd89350b8fe4a7e476dd1241d0b984a5dd7ff99b448dfeda09698723ef75c9", - "9a662ad969b7bf556c3f64ff14d67638816f020d3183a022e7ffec1a344a8599", - "f0b077cfd925fd16fd61a443dce1390d93b739496083670ddba9c2a821a75fad", - "87206ab57461494463cef1962f42db741eebe02abb81c1c99631448cc2394e85", - "dabe4f88b69b53993052dfb6a704de5a89008dee701645426eb164d97f8024fb", - "45750e4ce40542d85784312ba65dd0a55a60968a88ef0d208e3c9f3d19a82f9c", - "f8fb55aa4c2764841999dbb07a004087cfb022793951e4a627700b304e50a16f", - "f331e4e4d732e3c97df060ca36fca91983d0eea2b5f44f756d75328f3100c775", - "e452e49b4fded739f3d070d4c93b7c1ac124973af1782d65cabc2510a4a6e192", - "8f489fba749a2a028c31d15c348d3bc59ea8a5c5bbc945d25973d6ceaf6b9911", - "89e67cc3d79aee03612ee39adf36d7885a3cdb565b7bc7e78de6607580269cf3", - "3f24c0622c7fcccb83631ef9b8c98b2a235feacf77a1ee6d24df899cf62b5de5", - "d1c5cc624484e53b643e7e4aa1dda3a595bd546b355e9201f7995750066b469d", - "70af07af2b5795de1ebd37b154f86c1299c008f4da867a9a69f6c13f6fe2b671", - "9faf076055649d06f5265c57b7331e9e86d02fc917603452f43409393b4cf944", - "0de4ff52821e21e8eb102ea10de8153e2dc12246d7afd4d6350fef8cade2d93c", - "562c74850968222acf8283ee50b136ccf2f82d0a1e799ba6e99a30b355c9ed1b", - "4f69a69fca17c5f0bf682c330da73c02afa60b39a49d350318fd1d4a8550b974", - "07844fb00a7c77a88b75a0a8d2131327f73e124270212c707d11e08a324655ac", - "1c7af21ffbf403c57402cb4dc0977833d61b57f328e86ca9de89affc7ba0478c", - "259e76dd3608cadbbcc0824bf855ea95a2f5145e90f3fbdb2aa42ae3c85279c6", - "4f24396fc61ec6adf9fe80746ff00f2274e890a421aa48bc896f403abd750b9d", - "40c41a6becfb23aa8fc2297bd718928d7f29fd68bf4eafe16b14134d944030d5", - "22405a86f5cfaad53f2e519714e707e36ed34c16defdd30ea0819c8f39f39fde", - "2373ade1fa8f814514036f5d76a41a55d36be94d1c7c452cf32302e7c2143f59", - "d54e9f161e18c30542a2cbeb21bca1f0ee826cd68aa1e647b8ebed7f2ff9619c", - "5916a7fa77c1c3f724799eb2e46f0a951a3d5edcfd3369c766e6cac3ba399d2d", - "5f3ce3489aeec614262c717c3108c35bf3903db6acd78bba457423f77ee93e89", - "b60a5a99ffddd49d7b1ff2466c2236f0a01357413536158d4117c35e51fef799", - "a76aa2a631589775f4625b41e5d3b33aaac84854f0098d306bdb22b30e1c21fe", - "966456a2b3ec8e15dcf18ea53c508c4e421ff549cc16687db26a0c5354e34b88", - "81638b27e67ede9abdb76d334be763d521ca4cb9a80f76e236697439fc84eaf4", - "5034eb0be6be8e3eef144a817430d5b67dadb11c6b4d2cf5a5369949fb89a038", - "10b372d25c3f3f0cfb007f8b19c5aad0da3fae14a52f80b35df44e7ff5a72b81", - "807b90e9227acfd2e50705c3c85bf45040782197247213e2677aaddd3c7d8a0f", - "ea2a86aef94e674c4a35584a82fedb6847d4572b7e94c72171c2ca545788fc7b", - "70c6cda28b4d62b865a626a0f971e866491924320e5408f287997dbbf155d748", - "bc2771adf9e9ad41b58ba05b62737e497dc02795f9c4d47dc7e123dc34282677", - "655b2d28efc0aceff6852def4c6a2b900096d9d5c1c0f838f17d004d1ab467df", - "670d670b3e9e220bb6e0a0ca68fe38f6969537f17a2c7e724fe0aaa9d016d699", - "24ac45d63a0a8c38c694d1c541560f5b6a3eca99ea4160bb5e338d7fa5095b3a", - "95b3e4720cb5bc08e76a16aede00922fa33d164a45d0429721e35be082d6cfe2", - "79c7e2ff30cb77769f8dbee3429602f322b8479566a1dc48ab0b7c0e80d532a1", - "3cc06d7169464c4836d1a6479550693063dbe046393a06f61257e82ecd742bba", - "ee61e54b773450ceab823c4a54d374aa46635c0493ae5d73ab3652ea0cf66bc9", - "03bef25e871cc0593efdbb2dc859b18f10196b897c8ea012328888cd45792acd", - "6937fa5bd8e3af0ea58a6b57b5978e571ea48e6fe258df0fb2005b08f4ffed53", - "8e18c0d4c2552c3796f11662bd6e4f8783c9a722d2cf25b2b2ec621642b36605", - "f49174dc377359dcc807726ecb2b927d293d02e29ff9842069bf6a1e4af12ec1", - "cb752ce5c56dae17906f70a8a092e70ccad884bb88e80cb62c72ce8ee4bb0b23", - "540a460a5929937688870c4b30f82276d67b4c12129b8c8e21451b2c064a6a7f", - "446b2f8c76d55d5a3545dc31e1819709ed77cc0ad8bcd85f147ba4976379f0ef", - "82374f9bfb9176d0d0376841e22c61f166bc007d9ba6bba960e81a95cdec5151", - "7c528af699adefdce86e1b6344aeffcc4afbb78b2d25c73fed9393050ccecd8d", - "0c1d913e0d8ed227c4b1acd9c3d207a4028e042984825fc9b84181e6e6b87f50", - "1d257e8021ad24b84d354461392710813f9f80191889b529d5917cc0de2fa410", - "5c9902f8f6ebd080fdd8b313d4750a93ece6c551da022910ddac4521c1ce96fe", - "aab9a49aa45676ba39a8df74b0b0d8b34976d72781cf4bb90815ca0e50c00743", - "2d8fefa89590e8c32ec9e37d8bbd02e737b4568007be8260bad2c819cecb700c", - "75dbff7a395801eba126de578ec4b4d096a3ebdbe6493baba870933f1b62ed88", - "6dbc335b6985def50e75d99269cf02145bb24e01964e3526ae8e810000c8e200", - "37e8782721aa198eb3361e36b116f2073e06a7a223078b37b5b6238452090986", - "6e60344cdb6ae8339e3dd80c84d066e5ef9c2cc8eaa14eec447c45f4b3adf36c", - "a5231b37cb27a81464e342e467d8ca4091d76c0f5385398ca7f15532905afca7", - "98a14a2f111b91be1300337b4c576e66c00646eb4a0598a6bdc4cf1284f16294", - "d35c52346d9efff797252ecd0a505591939edcfd1cd4fb6f853763a36207a1ec", - "c822406b65674a68588f6f33dbe9ada7f42a8b8f3f70e64fb1a4ef4d4623783d", - "dde610c3f902de5d32212d1d55c72f4123fd05dab253641df78dca3e9a029516", - "14e63382d9328c367c154838c67c8ff02e6b93540220ffb3a4c035ed9c56483f", - "1243bf38f01751ec6c968d82ec3046e19f5404009f10dc911fdc537190b5d849", - "8169d06799488aea694061d7f9aea845b78970e55c702e40629f29710602d2c0", - "27308b65a473edef40b3518e71fced59a91cad1364bca51bd38b22e5daa5029c", - "ea1f2b13823f7253bfd19593bf8549b9ac7bfff23f1b32e7bedd3be481ada400", - "e3a0ad7157bdd23ca06b0afa98c8738b8790bc043f2e22510aae0dd59e41c4e3", - "982d2224faeec2e3d10bbdca8f722cbe1f0fa531bc07871a78867a3019f1c840", - "a68f6f65d77fc5cd4729fee1d4dab81258e12abd0e7062d69eb9a20e9f9d5ddb", - "df4798dda2d50e4119057f6162faddebb99e129510beb51245f8f4165fa46799", - "2dfc80ee9b73a391217a054467a4f4d142fc3c6c3922ec567d6e6999166a6253", - "76f691b2439f1d2618296128d71db2c7c2f2f5791d9f1e77a285211d0bc3b0f3", - "2ecac64cbf1ce817ac0761b533539562b5b7cc0fb16def5eed847a06ff83387b", - "d1ba6ecdbb8d2e1840bbe803220e4b3b12f914408d294f9e6f250e2eb13e2cff", - "7b389505915e1bd8c763eff4650fccca6177a1d3be20622034f669e7a550823b", - "3b656d3f5678c898cd0e3e1e8701df19f70c22848f783f52a5c4698380725f2d", - "58c0230342c860a97b799ac40d95111231b15a0b4375eaa17e6a784a5baed8f7", - "e9cfc8700bf27e6b15dda13e09401d2f70f0429b50630986baba4dcc18feb628", - "715b8ff0950a934227bef7227844dbbf2309d238f4c14b0d53d3e01d2ece7067", - "29dcb677abbb56aaa5ebe3df77b479d296dfc0546f306dd1eb0b06f9057393ad", - "61a7fd206e612d2f2e541da4a691de55ceed8fc6624245f8b8091509c901b220", - "e387d6a7520a90666dff2ceb6039c2c863c6789b7317360d14446e274829e778", - "c596b71b58206de7269eebcc0b5add69313ad54182770710bd585806ca59a068", - "0c493af2a1c1ce908e2cdbe23472fc528eba36558ef1da74413f1f79d9ef3a27", - "a17c9ca1434027ce9f05598425297bb5b7c1d7a526cfadea8214a562b7705ff6", - "9e13b17da750ad57e8e6b9956b6886167a03a04b8810b978bd6ee4a09536ffbe", - "8704b8daaa6a1800c02a71388a69dbf145157c648db8f3f835baf07d1cfad0b4", - "2f31632b651d77aa29b73d4b9dd960f79a1f6c3eac252e34a7d8c6734db7a58c", - "37603b9111efff3c685a9b47d70b3ca6e726a98df2475951a8beceebf6d229f5", - "fc9b304a6629200823c8e4bb4d7c28ae009d59954c40a7854bf74b85bd3a65fd", - "2e30dcbd81b6b8a4bc8cce2d0a578a3cceaf57755b0e6c7de6b4d4b9b9b5902c", - "eb4a241ce8957341d3b71d36f23e52cfc28a75687c552ceae037dd002f646969", - "a3ef8e0626571059a059c9ba1af5facb549ddd649345e9fa2e55aadcb26cc558", - "ba16fe7bc97d71ee27cedaf1257dc2572e13dcc7ad21cd56a2cf2e6d11aca9e5", - "c221c2b3b9f51df7fe8599706b269a34ca198b24d2556b1b023a2cc559554319", - "09fb3f4b3cb869cdec3d125b408faad5eae1141a0e116953182bcc7e3c6d7b79", - "fb79f5b9a1f00eaa3f48f1fecadf1b590b555302d244c4e74f62a9db1912bfaa", - "79f15d920ef2edee920bdf9f31bcac123562b521ce2c2d2debb020ceb5a93643", - "9c63531dbc646c1079078a86c1b47f27661bfb61a4d64bcd38dd60f665bbc4a4", - "e789ec426ecf9912552bb8349703eaa569b09eff9bc2083e95e7e59f687c2d2c", - "d2569ffbf5efd02b499f4dcf50ac307d0ceccf4347f684df666d3b9f8061b36c", - "8deea739d2fc25bf1944d99e6c78426137b2a2b88e4e4062604228612067b54c", - "75c322dbc00d957182c7cd83f5435ce898f96d594c6c20b09a6cd7cc69d63e0c", - "4e1396d8a45a6f6263e55eb0ab82b144436f9bb766f560f938c9e58233507e39", - "641aaa3943960bf2d582fdd623b07fc811f6e5ab388c6eb4facef0e79cd5c7e7", - "c27e78bd482cf662e2228b10980892bce4b7c9570526232ec427c3fe0d40ba2d", - "81fd29ac1034f75440a0b650df20a64ee8e2d8b27b25ec1568a5a06ac7122299", - "4c7dd7a4e0e3b28881b2bf3905c0416165406e49132e30d62f4fe00168a9dcac", - "825e94e336a786258cd86bf64744ff31315426ac0db02f332ed67bb0d2084d0a", - "92ea02911a52aa40aee430743ee1cf66acdd1d59ccfa420435677867ebc3c137", - "24027b7841ceb57f6993e05c6ae6d73162a7917b6d90b0f73de6dfb34b806d49", - "0938b4b0b60356eb74b9dc3bbdb8a04c8e3c3af049530f43fb785c4c46365735", - "a444b6b5ba06f29b91d5317798a055c53b4651a4a6462362e999994ed7d47473", - "6a930e10276cd7b51c5da23bdd99466561698d3c30aa98401ec1c26d4f44c8f2", - "030033d49ad05f4319cb5ecd0ce5ef4235ed3cae32ec8401acf55edd8117d63c", - "5f81135d1954feb2404bcb6cf45520ffbd70d3215fba15de5039a6016c057410", - "0d7cf9178dad2d3ef06f0f65ddeff9051d654b4f7070aa5787e92b665329f7d7", - "214ba2d1e6a107d71a13d61646358acbc5d10e955f3970a1a5b6d74708698e6b", - "0213d28d791ce7a1a62b67bdea2d78b5e07002a2a7a3462bbc2b77f73a177024", - "90b6501ee67d0540d0479f77ac414f9a00d960a0feea254169bf39fe0d1d1790", - "b82f9743394b4bc2e5a6000560ed1c5fe9a5478299b48f0d7ed5af3fd93f4e9e", - "9113f1159482f7a4e1a8d39de8fc9fb3dae50c8d6e0bb063ce136267a77c4bb4", - "de5b80207d3d0e3fffc82554696df21241996aa2959a4bad8dcd21fd28de3c13", - "2fb88fcd15b269c34fbf31153a3f5aa5ef50507d8691ec098a9172b608f85a44", - "96eb7d10c28aea4c39429dabed5c3a04ea584d2adf08ce33f6cf1802161e923d", - "0478623c4bbb75d6c46a9e8edba76f9830246a743497305618854803c254c908", - "f50fce8fc6a6dda0f98c369ba8af1d6209304306520dcf6d87909942baf387d3", - "fd4d89e781bc53d9c8c5c92721c2e9f21a1ae07e2ecc28df65957ab578da66f6", - "158411b4100c807eb89ac4bce4a3df2b5e9d2640c6003516d944f986fc93a05f", - "ed66bf017793348eee367dd19c3a4941c878efa3ae456b65b597b3359b11867b", - "837b07fd96122b81d6e62abfbc0659991e3a0df651b9ebaccb443d5bcfbc3e52", - "a294e86bf9e18ba5dcdc3f587c36bb69233bbb921a59e9dae1c8306e42fee8dc", - "cb0a4e4db1d9446557bcea3013abe5d033067bb279aca5779096c090f73d46bc", - "717501ad9669ce5f064f8d82439aa2719003efa8e60f68009b3d346b4c849eb0", - "57eaa9fa6a640059f91055bb4290f6dfee33cb08b9a9b7607416e57a9c86eeac", - "0ffb348e6ff8dd6996d6d1f2cfeedac9b1bfd081f55718aacf3c74fc11fb95d8", - "6c65f418cfacb380dcab1acac2380bdb2d62d2e52dcea41208aadf657a4c35bb", - "9c53fc610473fbfe32bfaca02f267229d20b8f5945d1d606bda7fb717015e0f5", - "f79c1ab4da44765f1c38b9ee07186635515fa5b7fb0ae698a000ea3e4fdfb28a", - "db520d395ce678cacec5a07774d9848641d19081a8b29a4633ad9608f2a8e379", - "15520b64de25e54dfa6b5ef1fbeb14e648dd942b0d393fbacee363cd14d2399f", - "9a6532c71dd843b9de12262a10732b1782fc0224d430adc783b7edf5d06b7eb8", - "65ff22997d790f7228b051e9add8696d61bdb834b0a3231f5c8dbbcf6b4f3fe0", - "e178acbe9bdd4c98af2a28d1db4ab7a1c5ae354275432acc64055724eed88562", - "f51e3ca9dec9335f43f71c87aea768d0b6eacbc26c6fe8a54eb29adbb665f7bd", - "42176c2834d0e2e44c97d6f9217db931d2a3228a0bd85561c8f7f6ee528b87c1", - "57bc672cf84da98515773bed70c14d3417a9a25f1cc0943bc11d8855f7c3004e", - "c10f8ca0220f539562804a12303bdc94df7873d107c965ba9a63c384c6d3599e", - "b77afefe91c0975b4ff45e15a7f83a5f98b3a15a966905607149ffdeae0b21c9", - "feb0d20613be47d6f8af34f829ac12bdf6c69cc58dc08ddd23fef85c587a9502", - "e0c9f44568425f080764ff559040719dc55a627f40d11381881613ba16bc1cf0", - "0e8f00d7eb929b351a03a2285bfb4db922cd6146cbb4b0708434cd1655ed4997", - "bf83ac859ef58e0f01338ab8ccb1b114377a55b24a49e858e1338e61905ce5fd", - "c4ddbae8bfa15abf79f79e87c8f277346c847932959fee59aff2315212dd50af", - "247c740622ab24db12e906238fd54c87606b0ca0b151660b56f4a3ca587b8e03", - "87daa77084af92c112635b915839ca74968697a0e4bc367873332863dcbf8e78", - "a0f6f6aa693fa52bad9ef72322c9922a8964d2fe12a3ab6079c2f2599a05b653", - "d2b6d81c127dbd9da25b2c018ebfab170bcdeeb2ceb7f14255cf6d82ed98e35a", - "6fae3328a28ec0dea383fbc0c587460a2cea68f1667b0f717fd4ca4500f4a245", - "79b476d2f371a39b8590d7a5964ecf099e72b27678a53949fe684a7dc17f9958", - "26d11706558ecd586587936797da3d60f660445e37531c1cf257e30688a575e3", - "97a1a56d2aed305dd5b0023c889f2ad047531931ea610d28927b2fe75e68add1", - "7ffe5a940d5dd1d5cd92a510a32f46cc9f744af16b072811c977f1bd862151c2", - "fe66c039116c5d1dee17bb422105f1fe49ca63ebbedf943a9646551fe856240b", - "fe073928380513512b8c153c7db5024b413131ef8607fa31553f6534b41876bd", - "000b9e830e93c291eddffb90c97174265875ed844a628ad7afd4f0132ead24e9", - "aaad1e3db01d741a286833f41a69380f6d1bc5355dd2bf2b7a15ae1fad86be63", - "72b0eec33cb8aac57940b5f60118164f4a0b7599e55f962e12c0df4700c9197c", - "e64ca04ecdd7f524499d809bd2ffc503033dda03104966fd1abf5d5c1efd613e", - "0fcf52edc4163c50c806bf22f06cc97cc35487edf4481c16df7089aa72bc2125", - "873874b663539899ca08d7b12a873f6c497af778ab9f59cbab3d756bd885ba02", - "74fe29c9c6ef81c5e126b5d5c1649f1a5a97e83ab2ce7b6d32017307b65cd3a9", - "77c253660e5c84cdc03290d992305715d15c9256159085d9afd3cae9543be9ef", - "6f0b2b214c2cd7ef988d146cc3b8c98c0e181bf01cd1127ceeed37cfcae73e72", - "820384b3f7fad4ba910399df73122a15371858d06573baaf8637591bf6018121", - "c856d011c55b4d34295dc37418b1dcd5381652ab2774be68f8d22f2fe4ed5836", - "dacd24f73bbf023063ffe3b6e1e410c6350d5fdcbf08b81415dc1b5f17438095", - "8e0d306992acaf64517a068d4ad71d5cc9d9877b8dfd142c75ecdde51adf9ebf", - "29e29fd043d84a54a67ef9a2a71fc07becdde351a6f4918d12171cfab703212c", - "dbb16b914a6ddfc014ab94896f86dbfdc33c8e929b7ad900dc73557aec61a8eb", - "4bd33e4e653bfabd05ad96eb8832a3424df0d8bd11a7dd1e81c104addd7e5829", - "61dc0b749cbbb5b3ffabe3d983a146ae709fb751aaae0f5d3d15492ebbedf08a", - "e95eb03c522bc9228e6780bfa5757164f576954ee95ebb0dfc8d262e0cc09092", - "ab3fb3d0a978cfc8ca6f82937f1649bdb62130f4c8c5b0693d7dcb2c4f4f52ac", - "a518c7cfb7856bb99762568164e950376cd50e4ca2bbff580e8a04edc28be79f", - "734f7f61591d03e19003dd65fa3186eedb59bb833f71304023635207a6ba2b44", - "3f543e1aabbea26e26a1db3cb9e39d0cb9201f27c8e3843ecd772fc4800aaa4a", - "09878acea7480264b9e05b07e2e1d19c53a89ab0df93107082e349d77650ce69", - "12bafdee5f0b7151cc58fea36884b1b589ef0aea65112d524e56ecb80478a5c7", - "ed79f35087efc427c221afacc8607a9b2e9b5fadfd250d4ff5193cd1780178c1", - "5bd097bd8760a7d171f6c0962306157c1b7793b088334efa29a059a1e2255c5f", - "fcd55b44fbf1a094a9ad5fcf68e69670548e91602190a7813b48c12c62b1787a", - "a28d5166538590b668b9944671779467848f202f49208b3d11473b502d84dab9", - "ccb3469b90eff965accb101e9fe92effcc854c287505b7ef2bda9cb8cadcf082", - "4d026f2a2a89e779924f5de816d56c643e00ec11b6aea51ea46bd6e38391edef", - "6aa20c3d83432877ce13b673eb23f210d748a89eec087ec2d125dae91db246b7", - "8eb0e0d0e119de64c019794f52322252e1799669a2722217a20fb8e1aeabfa2d", - "7bbdef120f02d22d6c68e26eb7dbbe8a8cf401bd0d6a45a65780cad4bdecf3dc", - "ebd5f61a815c3f2c77b69f87b6e31d383b2ee91c502cb49c6c8259ddcfe9b521", - "25096dffb472d687ffd7feadcef672849291169189507c9a1c5455936135ac38", - "4151928c429546b8f4a7e06da614575d450a52a7f6bd8a45559503ea3e0cfcdc", - "56b3eea1136d86df9289b9f62978673db23770411da8010ecf5b94460700c8c2", - "c488a900104835cf6eca646ad886764c6600c044fa12715621b57a6774018b57", - "1fcc793ebda9236b5eb1154328d32da743e4e91d845ec3804702de22a4477581", - "0894681124d0821f86f9995d994e1d4f8ef11509b47f403e48c536df1ed6c60d", - "1b2cfd63bf49cc9833f34a8bfb1e2f5753f1a1fd4bc66decda48a29ee7978b9e", - "7969e306d659b642ce8e047033cc59752bb9973522e4ec34a5d11f028c699ddf", - "af6101c8ffd8c9f54b6468c7a8aec04ada126a6cc638794d3b50314008f71969", - "1de4314c40124fe50361ab156dde65cc2b89218b595af8b8cec1e3c3134ef70a", - "aa4fbdefa2fb4a9adcd0e595a4bd4b8db4b9c617ceead8295176526c3fe409fd", - "153ba33749ab32ce9be53ff600122a7baf29fc7762ef422490b4e3afbc31b05c", - "74445f58ede00ec1d86268dfdd2c712e40a860051eb07fec9ac478a3ce0a77ce", - "ef0cfffc09d79bd366c382640af70ec93d966bc2358b5a9a1fa99dc1f20dae19", - "6bc90ec47be0267fbc413233dd363860237a8135ba1b406d897bc24a52c0b2b4", - "4e57afa72c0aad4b1767d82d4405e84e46e2f6f1a5bc898f1472f64f280aaccd", - "9a44efeb19ee2fe2449ea383fe23b50d99c8455ec4484849e537154d6fcb0c84", - "20c7ccdfcabc6de6942e4bcd1299e035fc4789bbc843b65cc09f2e734f45bdc2", - "890caa5ef9e5a821082c684fde612858e4aaba0cebced337226b4a0083a340aa", - "db0a0ee894e0c456ff67604fbe861549bdd1d221f88be1312c3cfe00961781e4", - "058128a016c73375533d70810fd0146f42924f7047aab9d6cf6f0cf860e0ad8e", - "b06d4bfc48a408de32a8e6deee09a0c592a9045b2cccc0df40b7ba10aa11118b", - "dbf72801f0324a0c9fa095d7157bd30b4811de01522884b48dfaf0d213e2dd90", - "86b5e8cfffcc00fd60ba1139caad367f1588016ccdfa851fbf3cc3de9c47c4c6", - "2aeff4617f2071afae2f4102136a10117745eddcbcae7e3e2e3bfc71b9f03a4b", - "b1d723432028e5300f84973595c38f9f143225b269a3b16ed6385f124c54339a", - "bdc99f4e2518e4cfd7c824411f7abbcb93978e549e0070e50c01031738caf92b", - "fd252dd5483c99267b85ab2a1c41f70cbc5a3fa400ad129646f36853f2e9a3d2", - "4269a7963bd4c98377721082876e91537a0daf0e251da2392fc465c806602e29", - "2d9671da8ce52c693df0c7e960e991f4b06def7138100475008833e86d2fa3e6", - "c27c4f2fd931e14f23d9aef6d9b9bf641dac5fc51ced7b937ef79f6c80ae1f5c", - "e66ef2ba46a62cd97749bd5054e80ab01bd95d7cfa92ec3825bdd4b0b7ab76a3", - "06f0d23e60d7032b1b3cb763550f28568fb00715438979a2d4ce82571958e6d4", - "c0e762e5fa0916929421908cef89842557162457aa28205fe603a69b4b3b3c57", - "f737d38fc98860dab4f1e7a5a54b064cdde9f0596e9b2e8be1e886e9dbcd9fa1", - "0826414cd726a9b2ad71c1bf9901f017cd3216d89dcbe00eedbd68922646458c", - "6073ec3a05e8b938684dd59c374e0cbc0ecb40f2f733fc265f4c882d98014f59", - "ee663a5b036d2b2c12c7e029c537cca784c5bf8718e6a951395b2436497a703d", - "6b27f9c27db694d1c469cb8dfe57039e10e6439c195ba8f2da7da96595e2a086", - "59fbd2da7e662fc42b83196baa8cd2b9440ce950b71dc113db22fef8e3b76265", - "b06c3a5422ab90e668591f152c30bac1956e4f488b23fb4ec0dab557a820ad5e", - "ff1647f452eddb41ff23758df41700d3928a65a749b3a82fae5e531a90edbc93", - "af83429a7c6de89b9e228e6e97a62f8ffe21854f567be59efd792e6686fd43a3", - "c57b9b784bad0c4e23c0af3655161d74c40c012bcd4900cff2d01b2a66439e04", - "1d3e61272643a68e43423e36b7acdf9802ef73f8ce005fcc7e3e08cd1eaf8824", - "005cb352f01cc0abecab2bd9c07150920c87351111af6c3025ce2f174a6e4afd", - "e713dee93a1c6a19aa39357de5d70aa8e72a3bde427692dcdb6689de61d04e03", - "c1bebd92c3a424c8f99900fbcf855a1afb3c534742ced0d649c3d512b455e7e9", - "c112b4b14f2ab89f74bed90419e8df592d442ca683db86d0a765352133b14de4", - "045c212f06fa3474052c1bd94ca05e77dfb82161de673f7aab94f882656553c8", - "490f385bf951afbf45ad1901928daceff0ece77ab33ac1b4785a60847ba47bb7", - "5442e9d6269a7c275f709222b7a9133d83c7d581cd3fcfc855f4c870f9bfc2a1", - "5d893b984555c53605819990fc6982a02f5886916b65d13494f758d9b68a497a", - "c5a022d54066fcb436f1e77acabe8816770743423b3c09e33a88b878bf92649c", - "d193d18c437dc7ca171d032536810e3ec4de0bc7b62311424a48078a0ff9faca", - "bd6ef2410637f327fe6ffd791f34efc15b0e4718fb1f725e10dd79f17214f631", - "b5e6e539913c9f475919f18cea379a92438d02846e3f35fa242384b481e0ad0f", - "13e5f74609164855439ff6bdc5921fa35fe319c6f82fbaa3c0f436d37d1e11ce", - "7afd5837e0f0d650eaf0182c4f2ff16f3e001035fd259348a7825a6f7a563876", - "f145c3e5e712b842d587e83db5c11a62c30a78b1b54df3ca839933b734b96f36", - "9d219f0a3243ecc9abf7d111df62c9a3a3de8674147275e6d0859158ee9bd579", - "7c1cb85f3f34ac5b5342e0d309af25972e8310b196ec0522ff89856fa9504412", - "98db00cb70489c09b0c31f9cf187e0dde3baefe465406bab96ab695d449344f2", - "9e92cbb0dab4cbb61fc92fff2c2ec651983f72b822a9101f2059714edb3e2990", - "dcc3ac82d03aa63ae427f760bd1ef6dd824bd624ae34c578321d1719b47c31d2", - "0fec3bf0ecd6e08ae3798c4098b46b05a5d653dc036b0855decc4cc810aff2c8", - "97e656c4b12dd33a22413c5e02f1a0fc9c486b29efde1f21a108ed7c6c51848a", - "8e57c5225f2cb3d49faefcdd788e91eb27f9a2ce0ce5f1c73f302f94e513cda2", - "1a84a605b9927c5a5227e14603fc5bca6cbc1d25a5c6663062d17f0d607219bc", - "575904bba28c62e23600c28315d9364a25820c967827554aa30d29ac04208224", - "1fbab7466340c81b09bc3360b54a15d880e7e703efa81ab7376e9f0428e2ab8f", - "2a6ee4e6b5e550b499afa3948fd7f3a62c521959713c02faa6badbde177958b7", - "1aafb8da5db81c33c393ccf5876b136ccd7337c78d93c3ba3c96b84b88a4597f", - "d66c51fcc6b4b85e092e16375e89486e9a31f40263c0f6ad74fc8cb4f9209e29", - "9d4042ad4216aa671467db6b15c2f372b9bb3f7794df2d940cf6233a58f0f4fa", - "2f57b0315f3f6d451100092896bf5746c3b9d0994076ec61abb76f586964055e", - "51511342fd599d97e17dc06fc8ea6406ca783a5c65e7789275c37a3b3ee98807", - "0899e6b975546b1adea69aef970e83d355581abbd73f9131ebc98ed8aa5ca7f4", - "00c021b3f04fd801db713c9c62398aa2902a6a461d8c00a117cfb297f822faa1", - "419d91694e6ec95fe93ca04f22c3e78c074fbe1a2a215003154a21398aadaa96", - "9802e89d9017f7a4c168058d3de83125e3e74724705069f083ec6c168a92d701", - "8fb82bbdfdf21109b21c11b97e9afa0e1075acc29b94cf01dc9482366c2c5011", - "f1737ba3091983dd1ed60a43154e1b3a791725e411dd4d7b4ad9894f81baa5b0", - "93498cfa8926b27cbcb7376232d94045d9297749c5b5b449469d68b9b6d289fc", - "d156672ac427ba33acc833ab116dac421143254d741c09a391fbb2ecb71f296e", - "7468388fbc4d94d3be5e051ba7c88b5b0463f0dab83013b32a71051312c072e0", - "f90d14e698ab671133ff6a140b6e5c5607ee8a7036597e61f43a8174600b10de", - "9feb4e487905fb06f4e9a45714f35dd3c773159c9df2b7cb646e09a1139a14b0", - "ed61f7fe63fe15b37365b0fb08486abd758a91a0c8c118ccb4bc10b5df761cf0", - "9fe3bad2d0eb460c81ae193b9b3ab0a2053f5f1fe752438c21ebe487de549270", - "e3ce7dfa2c035593dc4650d747f9fbdea96784dce1329b4c30a512fda49cd767", - "803b073a4ccc71aeee5874036cd9cb17d6b92c72989d9ce88b345f8e4383b6a3", - "80b667b29b32e6adfd1bb7e31f0c719342fbd0e94ed02ac10529907f1dcf2fff", - "395e216860449965160839a04a536ca1edc8149d24d4effb3655ce50aa104439", - "68d29a73b2ac05d81fb2e33ab7d15326bfaa5fd613d6ecad79a5685d61e3b3c7", - "341c478b899294af2ea8129aad435c2f96211b8c038ceaefc472dd58424192ac", - "3d57aa3e42a3745e9e04e05e989abf76a28137bfbd8bac2581d69392dbe6e6f0", - "ddeceeed0c5ddbd42ce362aa57c679d078b6983e3c235fd785666f6ced15d31f", - "44043fa48a6c963713866cbe676b9ea67505b19ff4146ac7675f2fd9617a78fa", - "7297ae7237ea548d6845ec3bbeadcb29f53eed8e479d84026116e9232824365e", - "59f6b72eb163886d237a176af3ccb036dec0f7365197b76a0f29f8301bdddf0a", - "c49fd88a60d2850b5ad1ba46f22651c23eedf6512f16a44236651f38ed90b859", - "947d7bd6926beb202c765cc704a14c6991e2681aa1ef196fe604edaa809148c2", - "28a56f6dde656885a2a43e36a182bc98ba5412b1dfe6ad00ea27b47b57eefbf0", - "b341b48c0bb1b34c9a51a7358ab84af95743fc1590244207bdcf09339cfcac00", - "7d1b71a33a102fee5e0c60ca687edf4f9411e4a65636b3d900d3d7664f764e22", - "ef91b8c93041c64b6dabf639f25d89aabb87924771fc6995e92fcfb46057bc7f", - "71eb021a70dfc19f1df05e7bc38de2a412da5fccd7db546fd728d5b8cacb3868", - "50b0c15be690ca6f4de72e96ac9b84e8fb53c97a3ed8feb631e9752e6941e17a", - "6bf756f1d077947ba1bbad9f9498f62542d904dc2f9ffd780d2ef83eb0410e81", - "31ae4b59116e508fb292195ff30d92ffd40e68b072f6cd4ee18277706012f796", - "980bd76b52bca61548aef61abbccc57327d5bd66512ef29f780197e7ccf299bf", - "4352e2e22cd8908ba179124c7e9328bf8b1eefe4dba4054a7970c095d23405d1", - "87afb628921425b708ac135d9f284511518eb6d4629e8548d759a15996cbd5a4", - "55afbce91bbb711caa2f00a3e4ca080a6f2fa147dd0ba135f5792dc1399f7418", - "dba3888045a24f89ef8fbe7e695e84033c7126ed3affe883316ec4edec0a69a0", - "e5716fe348dbb0f8c4ba135a0d5caca18ab0d0a9395c24933852ac38a1621c18", - "1acbeeb076811783efc569c04e6cbe6551834275b6534272d5ca5840293c8f05", - "bc43596da2bcbcc0bc1a0c9e10511ed9065352e63f77fc57f999186aaa3019a8", - "0a372bb7d68d5acc5e13198a8006f87052e9b7597ee0090ecdba076b5b244763", - "b2000282cb850b3b01e57fca65af47f8cb7713a8f54025e8321e881b68e7f2d0", - "675d24e8b7fd5820fb6c14542e937a0d3f021aa672b3816a85da4e0493b253a7", - "360f999663ebe0c120579643732d3e2fd58f3a376e2088f3078a32fbd712d9c2", - "bfa7fad5b74ef7a64ef75433d202eeff3abb5ce65df6236afed5435f9ac30b8a", - "d20be63e551f9c4d1c707170d5c202973e44eab299502de1c89cadd4385c72d1", - "040089fdd2a49d94156f19b0e6e1c1b8b4cb538cfe3af4a8c957dc1e3a4e6206", - "21c6bd2a21ece1bd5e016808e058e18f9555fe5bda1f96119d5783e747ca9fd3", - "97cab5dddf652bd82bf1882d2c02162a8b9117f8ee5ef039fe9a635242082cba", - "db511a19cca212c66bc6455ac7919bdfa6550f9281efc382f13112293d725f3b", - "1214d2786506a37cf926046d90bd39e0bb6ef9a7dfc155dd0704e96e91753f9f", - "f01cb2c79abce8f1a5b7116fd64f799a4916139ae4b65fce47302f6c6823531c", - "eed4e18257f5a90c2dcc28d99fb38bc660db5a60059af1031b0e0d48aadb8350", - "fc69ac681d2221c0ccb120d9eaac1ac023247bd819c34dc9a1d724f123c3fdc5", - "5824b27e1406b529260b2baeec200087b01f8cb3b4959d33d04c55a965ee7d18", - "f16bcc65f23d405446ae86bec03a23d0e8094aa5010fe4ccc8b51cf395d28e37", - "35ece41bc3a3d8a576b23d6df9906251a4aaf4d7dd09f72760cf14d3b314f3f7", - "6ee29e8e063be502bd0b42f6bdbb8110d195f6e6ab68be022c0dde6f97608c35", - "47275db961af6ef967665d69f8f31335823ab289bcde5c5d0cd31515b0a0d002", - "e0711ec1726f00cbe2185436f51aec52123040e9927fa5696480771f2c925d3f", - "0e16686d35fe7bddd955c833ad779edab0941dd68f87e6f3076735c24946b6c1", - "41878b253d3d56b9a53a7dc0f3127c9565847aca83ef123b6629e14db8f1ab93", - "7f49428a39778074e03db5373cd7c0b35e382c5d93d4ae1f0ee103991f57e5c7", - "0110380e7bca011b668705a18b18cea1ead025535d57116f869d3d8b88eca5e5", - "d4d2c1dcef3bbf9406680d4af62ff9eecaa1c02707b58cf88b933793289f4d32", - "6a5ba818332aa2a3d00b256b5e0976313ca8c7227f6d215ecb45e658d4f65e43", - "e12f63a92e2f67389e641d14050451a8f4c6951f25e09d4e8e3bb63998b4b75e", - "6515d8105c5ba333ec302b0c980b1f0fa728a29fed7cd6d4636a844016e6fa62", - "77d5cc71c4d53317a73c86c7adf7e571c35f8a6bf79da0d4beb04e3016af79b4", - "a9eaa7e8f7ed573ae0f4ac7de7628ebf80f98f50a862085a0fffaa2432416c13", - "a8447612cdcf8cae256b33cd59e1f0cb431daacf363e8d90194d5bc5cb4c3e96", - "add64b7156be06434a6875970243a8da5c2c5fde63c664d22725488812070f6c", - "6d3b3d1ff51f2208d342ff1cdafc447b14381af0e8e93f9f972632769d2cb917", - "313208ac9f25b055f1b14390a461431d3491b07dd53c2541cbcd2907d63afc04", - "978ec01825dc94cc8dae59aa96cf94c000c09a9b177b1a2902511c6a00f314d4", - "d2e30f31cb687b11e4fa50cc1d89a166aeb383f59cbeaad19c128b0a0458c9d2", - "5f3653419d7b1703ea48b28e93408868a1f36656b423d612d53feee60ca83f65", - "e917cce0053609ef8d9da4a6534b0b040ca875c69749fd43b2433f3a43b439e4", - "b9bab502aa6300bc44e65fefafde0c67cff5e0b694df764a30aba302f4e81cec", - "7b01d010cd48c83eaeb307f32b2e4edd4ecc527b647c655afbcc57d9790661be", - "85019fd0b2893f79fb91a3cfbee44c80ba5afecd803bae7ae077da6cd66417d4", - "19e672013527e9c3897100c4278449f28dcef5de2244577b4e9e1f8dc2528b2e", - "71f2f76a4059f3168e078afd4f28cfd707cbc81e0540f19db3b88419ecb129ac", - "ce7ffdb518f809260bd09b37f536a89c0392dbb6adfed2751627bc1d562be344", - "81962cb848e693297bd4c73c95e04e4639baf3302109c6bc0ed97f3308370fc6", - "75efe4ee18aa179ba850de4e60f141966b3deebac5f027654133cc74d452450b", - "2687286fe13fbb198570574cb4c217fa337236ba21f7785ca99047ad51cb55e5", - "50fc79bee2ef18099f9a6226b88a15252b2752040fcdc0bf3c5f7a70c59d68ad", - "b1acd7770112aec9aacebfdfdf3cec992714efd7f920e48f225be35f0091e487", - "bd85adfdf7433a3078821b17fc40c7277d517551b8935bd89790ca2897740895", - "a6ef1f2ef7134e46e132b4343b34e0d830fa8a569bb6ff59e1a0468e8b7032e1", - "ab55e72c18be81cdc92df1294c206c392c8e9412bf8774d4ae9c1f7e437addd0", - "04ff716c00f49884cf0989b6cec82766b56b7b87ce96e6e5ed2eb8d3d23a29e2", - "23f498608fb78ac2edb8f551747c36e56a048234f2c362eeae1d073cb19a1d31", - "8458189e1d9593ce1344c5b7b30e38e091bc09e280bbac074fec8eea9e6e4246", - "83a51bc45ea4cc7afe00cd901a7012d5882b245dff9685b10daad6249eff8643", - "06b7491a8b88e3f0f91caa1f49cc8410db2b77daf47930a7e956d7fca95e680a", - "88cd1487faf46c14a974ad8be67ff7b4b22f431dd51f2a709857a2c8340a9e6f", - "1ec6c38770a3426d69d6c619d383d96024b63121ed6a282d4a4ba274e0295096", - "4212982298e63a0b767600c03f387e4c296ef41ba48095e2da98d71897fe245c", - "15b105788046e4084bb9a2ae81d75e0b5844d69cf339a70184a33874aabe9693", - "158d53be7f68298d1788701cf910df66769ca06610b2f66ae22eabb600f2d24d", - "7fa70d41d63f63ddab8303a71fb315aefb78664e309aa7d9f6f479ac1e4e8975", - "fcfe7a7192184523f37443b605cba59a738c0864eeb3fd79cfd3030f2da62069", - "41466a193262e02b080e88ae8d0e04d99df853d591a6a6a7a6bc27b94a2e78d5", - "bb1ee0f201eb302f62c3473864c737ade674bbe2b969cecbd75fd3f84759ca28", - "dcf0db139657aa812c8381dd19a463a9ae3183a8929adc00c5e3b095acb59b5b", - "e9c0ceacc14118105d8e53f6d90cee0686e248b7be8cb0dca23b80c29b931b3e", - "8b01051cc6326e09fab3c3113c489fd85ae0a4e162ff9b6b72c89102838194bd", - "0cbc24fb71840326d2a32166337f351182e3075da1ccf7e13e28cbe62911da32", - "25bcaf2eb705bbe1d71d1f9923390beaf40fcce02ca7c8bb4ad2ef67b043ce7e", - "705a329c80da223ff4d69c7e2eaa58c52e01d18566ecca30a118d84a9d409493", - "ff40eb1ebe2dcf8e6346f5e607bc6343528e1dabd33a17415e26cf1a124dc137", - "dabbbbb62faafef51bc5356a361c2c35111cde1d263236f35966f745f6e49afe", - "75702f9d01cfe9806b9c7c4a02027e2290241c5441a639a985f32152058b81cf", - "7108f86d9ac96a70976c9f582024faa3cb8380e25c7e403a2a941438a1448d65", - "8f29252b5a184cb3f1f7f39575cfe542389b218cf1ea6448debb5c7a902a91f1", - "6e8bdc9007d29e1de5976140c4226af400232c7b47a597c589f35f131d302e53", - "87e59aa8c778fef69dea37e9a458b98e75cf69c6d17e8021c97b5b4dc9844219", - "9b88b31d991cd01772bd643f64a293c24e7b3df70e32f3f77b19ffefc5a34e71", - "56965894c9051cfd9d3313ec5f16fada3754c15abd4eeb5440e852af5332e9c8", - "31f0b35f65e83213e71c92890b55ba874109e9e354069537e9a8043e220200b5", - "6075fd68de9c1f1bbb6e92e7621115e2f09bad8429df8d640a756cea80d1eb0e", - "c3326173aada707c5b7d6c6e583fdfefc8ba87a34cc54a2ef8d193ccdcc36956", - "2319a68d6b2d218f99b2a1f60de979fd72d442d87edaa052c44014490055f3f3", - "c2175e00ca89f6f6fc8bac0e0a85c2effa550c4c19c54eb65d2a883e136314cf", - "9e926cc1afdc816e3882ff13b83feca7ae3b3ea45bacafd8ff1a0ac832850ada", - "01719869ff555fb7c23ce685dc61f3d069aac61041949ea6d0df49cf2b8f647d", - "2ed4c40ab8cf64a34e1eb154bcba002933d86730c55cef252652e182783b9b32", - "b6e82e4ab1f344b1cf5e4693aa4a6035d5750dceaa21a4347ac1a4036b3e78a4", - "77f4584e86153cfaad8f710d1f5fdb94006fcd2d383bfe17ee1953695831de47", - "7eaf4a8ea00644b360a0de2172d323c29d6e9ccf081c554965216479ac143cef", - "8b57d41133f61a8a81687178eb9e1df9b1b97dc567e24819661633fbacd1259f", - "9debb9067095f10825ff0c1740b40c36aa2b334ab84d5a3c119d7a5086352790", - "4f974725175cf587fa362cb4f552316bef770448bf7656c2f9a4966e7e38c28a", - "53a0981af909de42bb951f30f6cc8cc6dd178b109570e089bf9d8e0211d164fb", - "04a3659c90d7bfaa30f0e5152e853c6e779e7c3f3407fa77f7bcc049cfa837ab", - "621fe82f1ac745d34ae3404cc03ea8ea5dca2603996dbda75ead5e3703a4536d", - "5f3e869d64d62db67a7a0e9a10ca368e36eb8d92061827a4879dbcef4dbd2520", - "07f9378996e129d38d1d0da6dbc278a216ed9280e2cd2ca121133416749f6662", - "9d393abade86ade4fb277def35cb5b4604527d84ecf874339e4826ee5e7a8ed6", - "3097aff24acdddd8062bfbe96dca46f70349f0268adadfb949d704426c553904", - "e76e87b6034e14b35842be9f74bebda2cfea35552c357da811c18912f2f70bb1", - "28e2cce20c9a526c23066e3b01953436d638b330403ef576d599661f2410f32c", - "a7fec8a9bd1892e927d0d4659d0c79d4afbf1bbb604dc47697bde36a37921497", - "ade394661d68cd473a0fe6b528b87184d73ef48fe7c7df6a800146e8e19cadf0", - "b5e2642f6759dd47907e88130bc3f3e39d2feecaf41834e04ee4df247a104118", - "e6d5d0cb3a2cea30b3b7e48050c3f92a65a6e8d5abb324ea06be922681669912", - "ee4b73e00f9ff0c461841e9f87d5816c76a43369fb03b9f38ca61b1c6a9202bf", - "6dd768c7295c3e96c0fbdd3dbf0a086657f55b21aa97d07e5ec4f687ecc912f5", - "ef46b42cfacdbf6523522b5ebdf40e74c0e29dd8bc84a77b757353fa4cdc6cc6", - "63723bc36d217398737552cdd27c9e13bd678d8d91cafda707dce8171bf9567e", - "cba3557fdb3e34cb2e5817923e88332f5a9b7e9696ed4abdeea1b61ad46e2c87", - "b04036c64216b3b22809aefef6f4e3b3e5a9d51844d8acde6613f8290b8aa8ca", - "a026f5a16c6f39a8d2b912b6eefe308a5d3a02bcb313c7c32a504521d34e85b8", - "984dd42fff03bbd84cf7b6d044ab45bc389bc1c1ec6baf8a94c463f73d4dd99b", - "c397501687fa48697f9438b99eab95d2b475991c54fe09c5f3bdced95a84e1af", - "33da85c401ade249b444fd445fc18143f861b78965b3f39d8601bbd53f7e20c2", - "03e1c3332c8c12d3d63cc6a3cd05ab7eac76dcd6e2114e6e0a673f088c14c3ed", - "bdf6ba7d15bccec97d96544018d2e23aa92ed70584ed364d723cf9608fd1f8a2", - "4e08132798df1ea7eeac0bf8125bb1e87a30aa555b9d63f6a5336c67cae06801", - "ed84e86f842365b2a140c952b00ce62381830f2fcaff0f8352b080460930150c", - "864a8af02205b4bb3753f1c399708ac68c9027a6e04872da901ee0430e75238b", - "3616249b32c0cb8ab6e6b468c3d7b58e0d6c5893d42b4f1783800d787587b7aa", - "d4d7c8b28dabba300ee7ca799aea773cfee62317fdaf53bb46b60693a6d960e4", - "e3c02b322c61aaa918813b8c063636274b170a252c82911fad195d534f9f22e0", - "89f63645687afc26c3dfdc9eac70a90f2f068d2cbff679b9c3a29fb77f841885", - "08e1620c8d2febdf82eac759f8ec648ecbca0357ee8d557d8ead78c897577d20", - "14d297791b3dbd5c5b4cc6fef68a04f9fa07807eaac1bce9208c6c744cbca4fd", - "71c204fb7797fea0292bb1cfce9a6c8c195a88138c1d2a27727ef11f2b720059", - "486681817feeb39c8676c3470a845200c6f7cd2e2e7c9f6e28be88584eb735a7", - "ea44e1bad1c1039469a12e3b294e5d54fbdccc5146ba01eeb78a9f30dc7a185d", - "dfdad34e8d2146572d6ba0b051b6fe4c752d5e1952afd3f22c3b6b8114c1d14f", - "0ff4d213aa47ee93b418f8d46e351e2d803496a30146145fe3ccef7b16775ccd", - "6c3e620b52fb6f6c0f026e122c10646e115cd6dc3ec20ac491dc7e4881d1c882", - "84a5e3d851cd9b98bf46d6325bdebfebd26155ca14bcad47887630ee5c7112f7", - "1023c42eaf1717c0bf5b021af6434dcbdc4fde705880f3fe090d842fde31ad65", - "1695bf03fda02168543042a2314d992ee9f2e80523a9333516c5147cf4af7160", - "5a9f48917b01c5256bff0b637e1ac6fad81e58a57229d29641870eabd045449a", - "3f31446548a69eb154940e54adf2cb01470340e07db2f248652d05ad4896ae8a", - "9a1113d41f19955bd6b6d1c9d8d7175a28a39c63a231142b652f25dbae49c11d", - "ad1468fefc322e371fb70846dda308a15ba5505b1e520aed6175ae5b6e8f1db6", - "5c72cdc9579eb53fe702da153bf05fd052c65dcbcdafcc7f0b6e8a82b677529d", - "bd5406fcbd443966dc9e8f89fdbb74ead38781cf6773d85cac2dcf136b09a58a", - "96bca788d27df16cefbac3c5eaa845279d40075e0a41bffc728842c8be414744", - "0f6b124738a91cf06befba5309321fab8014749cbb776673f7e4067d42e18354", - "500ec38d2c69be3c5088962b97f369a0f3a374ee5823601485642ca4bc1659a8", - "f7b329565238fcd2ce77255630173239002a92706d064e382f356d9329b4409f", - "f2cb33b06bb49d5d7f1b546cecff3837f4d47e11045880faf2ccafda88cc9073", - "c239b3422e6b35caa0077d8bcfb9300174d8af8e9507fcceed143906515db3d5", - "99256ec8ed48cc1bb728d7202477e6d40b0efb5bf86974e04e68bdc44a62e4a7", - "98fde46534d4dc081816c4856929cdb39d8c94fa50b8a4a959dde38d448f117e", - "9a9de6bd4735ac0cb2a44c890d40cf04a89e3f0a5f5afe30e53851868ae502ee", - "44d743ee3dd774615feac6d91124bf217bbbf1270ef5b802b4e3f3d7eeefd3fc", - "e7f6e5221edf3193f71aed8b99f67a86ad74851ee8c87866b4e20a08aeb93cfd", - "a611c8e90959eae6668a4561efd177c5eae77b4e100e069b6e330cf377f6718d", - "5958c103ffb7cd1c9927ac18e2ac6e8375842ce289f15f43a65d0fdc47ad9101", - "4524425b19dbd1847e32828e0c158872412cd8427ce93e1d0c3df99a753d36e2", - "a1b790f87fbbf3b7ad02ea263e7fad86d2a4531a5d919c0ba9f85988ade1e764", - "92f923d429b85e9b9fba390ad76592cccc61a5de9286f14553a3427f941e1543", - "36c297e7a7ad79116af84e0ef2e06e8949ccc54b79d083d58f79a916c6d4852a", - "e5af2f729251a5e0f660f8a6c53df3546674b93b0b9cf92ec884fb2fa214be99", - "2019c97fbcb7310420b783f7ad734450b8a8a8c592ef30395c152210b6115135", - "252daeabd9ceda00f9cf4485e88efde3a4d010fd64c691ebff2816b5e1b8a3a7", - "aa0a0527c1240c55b3cbb7979599deed4559b4dcd524faedc0b7c03490caffe1", - "52ea86c75ccec848d5c12781c53bafb9d02bdb03c6163b91977edfa7ed1f8794", - "463bb42a4383330008a13f35be00735ecc63307477ad35b0f9bb24e2fac78b46", - "fb95789d60dc033e64b6871074ee2ac22d44806a2f391dc18dd2cb19e2ee440e", - "93d7d39a8c9bfbd74c9dac7ca1112c36202c1468660d6eff219799edbcc0fa51", - "f2d7ad63019dfcb476a2219f5c1774940df1e30595fa22e97d4a826f30f4903f", - "116bcbeac145b3ffefbfd86c134338898662b66096b71480ec45d94bdc39c4de", - "35710281a25fc1b58b8682d899a8d909f681ee340cebc0dde719fdb0f27d9209", - "7312a740bd90c691f035d764c73540aef702ca1724d98976d2f7608938b2a1cd", - "702ae0d38b6010cd80f489edaead948543f927c587b927002135becf71580bff", - "8e10e1451360bb6550728b0308fe434c76e3fea83f6c3a18b61d460483d750ed", - "300e72fd9b0cef535ff453dd4813855ed8063014fa91f6ef677d697b9558e4c7", - "df6a95aef5a357dbce11805d88a9dec9a37bb6d99580d988f3870ff90f7843ed", - "eb1ecbf11505619dff19b4513b3ec1d6b6b5b2e916de5bd3770fa61a2cd3c3f1", - "9c005588544fb08e008d03bd2a8ea3c54aba93f2a3bb8a98626b335c192c611c", - "22df9981ed18da9ce9be1ad0369d0867862acca47ea04c9a4ae755530b17210a", - "28d68feaaf8b7564392573335e4037ac167c803445014b6e1c56c17aa680b5db", - "f58ce233b3fcce122c905f8ed5a35a25545935675c7deaadf72628d85fe05cee", - "9a6d7198873121aec34b5e293221e2da3301847dfff0778afd5ff43a6f553138", - "127c7fe823cb18a23b0448d772fa52afe09606912dc5f44a079c49afe975e3c5", - "ea24d5a5e678b2e3029a17316e452a08d7d54c678eeb6b997c5a5818a82d327b", - "a350b1d757f397caec64819f941ddcb00b121e4a07e2c9267d97c1474303eacd", - "9b22e1485eab838b603f0acddea01df868aa0f92f1316fa90afdbef0e42576f2", - "bbdc94590ed00d358f5a41e5eae4fedfa740da92ac069786fdbd3284627f4eb7", - "951e219e7313db09ffc697aecea52f0c960a1f17b9d4976affa19778be19aeb6", - "be2d9287254f98936c4b5bb11a1ba08f68aca4a2d73e11b5d3dedcad6ecf15e1", - "d1c55eb162462511414a491ab360a0f86887579697196e8bda95a8d1c98fcc1f", - "a5a08a1a26274af079f9024356c62fe36acb3769ac0b005028a70c1ca0cfc31f", - "d601a16719a2097ea8cdd93dfdd9729dd9beab4279f250e17060574cd2ad8114", - "a7fec402228ab30d758ddca57fe6dec2df6ab17e9911ea0194c9686a39568a18", - "f6611bcdbb0402b12e9f8dff822a50846a97d2b883c6a704bc036392f1c30e5b", - "6d36bf588954cde66b43fa1fdf10e7f8af4eb2e9145e9341c266e0431c5a8872", - "6ee52bba77ec24891535b2c4e937d1c27d53add7c9e656978bfa34f940579ac1", - "4068b0c69034682e8e328d3d03cfebbe12a362d22ed6c5c0fcdc11718dda0cbd", - "5b4e39c5ebe37eb0a30364f3e11ffa53aecefd1f33a26154e466a4ca6260f2d6", - "23a42c15fe0cfe250b79afb9df52ddffdd8afc57dba4000c0848ecfd338589bf", - "8bdbeda904da5a50df350942bd2611593ff551f3582fa4bf34f6fb742c1697a7", - "96355d63f38c6ec055945e944c446d7a9d77fe94b3bd42aeacdf5239e947efb2", - "134da5e205c73dc8683f4aed16cd43124cf73cd8c446b94f94f42e9bf2a57f0d", - "80b00a60de03a936bba26681f127a10458860bf56e21fcf0c278c29f754a456e", - "3f1a558aa7b671067ebcfe8263fe228f531ca940cfb3ce98931f208778802491", - "90cdf5823a1370e5651e24a3ffcb9b8f3380fba8de9b4a1702e5ff131b6a599d", - "2a7676fdf04f26cd3334309bd3d6fba386c1f987a982ad8470fde054f79c1516", - "86816cf0a56ff1d5e5d693030498e041020e4127243771859c64ddcfbb875448", - "5bf6579518cdb31958342a636917adf5d6ce844bb03ffb53f6a5789c27ead5c7", - "b5fe7bae6ac80d29ef7821b406066284fcf1f68327b0a76b72a639ae0d96ce84", - "80008dae8cd26ce3e157d9bf971e82e16d769c32db13589da9de0b15534c6b85", - "110598f5759db23e44d0e198813cd56335c32b2ac0b33bbb1fa172da6bf36e41", - "6612dceea4f533ba4141ec4c3b1e7f59b58b616d357772161a6bb9321c63955c", - "54182ca9d1ddcee5ba16a59c94f6f336f7c5d6e3e03e292d4fd9c438f4c2c8c2", - "09430a63988423aeb6d839fb4f28aaf435f52374a15c0ff3b8635c9d43a1d20a", - "baa2642a8f1e0816262ee06f7656dec601a2a506d3442aecf298f1f47cf5c54b", - "291e106cd154f153c9cd3170f461aa7e73acd72cd00ca95656798436c5713663", - "142c6b5dd5034c0c5be8bb6ff10f7e26a76a2ab1905576881074c0edfdb21d06", - "43902d30a1ef8c0974f915d45ac92e40a4d65d2c2d77a781ba6a7e2938a8745f", - "2dfe649c613bf90c5b44913d6abeca23a2fec7c1c38663e8d6a29410d21c556a", - "9a0252cb032b45607f3dfa54ac58f6ee347a1b73f95430a1fa75e02d63ea35cb", - "d9966539b3d09bde98ea7131cb01ab06185c122148899d3bbc03a2e4a80dc31c", - "f33f03846c954df58e730570de9439a23f97586baf685539f8a7302e23f00358", - "f043debd8af18076798c7112ae5569a4c006547e4e34636cf16d879b87e4fc25", - "b6ef3192780c235d1b12643821ea54e9975ef9732f1fe4f9128f5db4bafda814", - "3fbdabeacf8cfbcc0e152d88bc31a62a8ce282fee99688522ae79dcb1e8e4d43", - "5bba1f8be6bd590f9222695190685e12e49a3fa8bea678826a8f4fc4c41fe13f", - "1b4b5267f2074ead4bb86aa75b2f4ff2d1951b9ab593899998c947178d134edc", - "62f4f7bedf4598dec3517994e84500a7963aff2be1ed98c12e03267fba86e5b1", - "5cd56918c58a99d144ab21884276ef1057ea3a0ebfcb08df87951d016d8e2957", - "85378eb3233cb18d318b7bc58c0ccb4b4c1bbb39f3c63f4b99c7eab09455c249", - "d26fb2217cd1ec4b15f350490c64b3a305ba9296be4fc28550eda4842ac69e4c", - "0501a7d09a7d5541857e99695f014a9e9df8d0b1be687312861b7f77e27f8d3e", - "c7e6ca5d0f77441ccc30960bc94c437548d5593bf147226e7fb96e748017dea4", - "39b074320e2658691fdcf39c2fbb05722d182d5b8077531bfe94088ab49f49ea", - "9dc17d22d6d702a4238dcb084bcf8b65017f5b94eededff2548882f85b3c3bc4", - "e57c52ffc24198303057a87011f3299128029ba6667a71bc707205c069e1dcd5", - "b5442567622db9980fc47d26ce332c41d40d2a43af883a5193918a6c58f1c108", - "b3b992b06502ae939562e9878390a098b8869900196e0eb39b6533476403c592", - "9eeead0c4145b6275070c3c18bc9bef4f677963334fccf0daa7c55defb0e1f43", - "d90c29acaa126c10c85a4ac5784d28aa1aad17226ae2054613a8964fe4043676", - "9877644eec174cc1db5f3e463b412d5e4cbf2a3dd732c003790d9dc479e78a13", - "43ca42477fac9a73cab197cf3d31d6899cae5a90588e2231d28c1dfb0ce7ce03", - "d1af57ca45e62e2f274133fffa997007432519d968e3e6448dba3c40f5e58584", - "c37cc0694c1f440ba46dfef632e5ef84a691abf0b05624de71b169f366f01a9b", - "d52c45fbc8a99a2b576c895a857864e6421f63ad65d980de27ef83c3ff4e5f1b", - "4bca709ca4f56fa9fb85d3346488e4ac1eeb36d3b06ec8aa4fc6b547cd4c677a", - "c451f6a63fdaecbfb12ae1847a531a13941321597426bfd45c2d80370f5ea8fa", - "febe9e4915dbed459605615e7057f78bd61d2ef2625b70496680ed2e7611fa02", - "7b81aa51ae41273dbc883086cdb8e0324b2884af50be24fa5c35c64e50fe848e", - "f0aeb7a92210c8e35e6b6fde1b5752f97128bbb08049f33eaddce8ef0addb4db", - "fb8637fb51441cc41f39bc2baaccc3576eeb5144a8809cd4adbca9e0a8797232", - "c0a8586b5b19c66a2c0c8764f91354a8ce4f1ac76c1235f372a9961de9d3b214", - "25bee144f95387b6d9b390ef35d1b7e76221380477cdb528ccb57a5e41fec417", - "cffd3cbb7856e29b3451db91af5000621736e7572620d183c2d14b35405dcd7d", - "0a7c8b0ab7bdae0c76b7cf5c90fdb53e09550ccced16bcecad626acf7d92df93", - "e3dd0e393634dd6b5dec1622a8d77b93ae4441d6ec8e7fc7ccf95598c84d2ecc", - "963cb443bff82c545d41c9353b214f7fdd011267aa0026dc12ef1cca7953cf7e", - "41c165715bd9f2200b9f0e104a05e6296c3aa145f1b3d6cd14b067345e6c0d22", - "3666fe3999e01738a201b5c81d394544641672eb12f8148f5c668df068344572", - "aaa3b10427ab5d1cad66c29a5a5c3f5cc7f25eab44eb8c5f3f705839078f1b95", - "d7ba07e383cc28f635ec961e31ad5e9aaac796480375cbf80e5b3e6a7b69c4c2", - "196f3912681d28d0c184d2f257f4b207819aab37b6a3c13420b4b887b4e41637", - "767e1075c4d795a36fdb98524acb13bf1644e805d0736b3eb06d3825d80453c5", - "49458f92dfc04cea9350551b67136f399b5c9140113d98087c6a4f7b2bb7cc90", - "536ea0f89c570ed84b58d9833973a29edd64e10e800bae2e560404ef2b1217cc", - "d4be04f93448387340dd62af49859bb83dedf46363e5ef8cbe0e573b3126a926", - "f4091b6e472df85998e7bd61c4e88bb61e9d737ad70c26a90ca13f68b1220088", - "a703fcd1b1086d421b3c70a8aea422c65264c987aefe9f203720cceef938c965", - "206aacdde1973a720a3364d693efa9fe20b39bc9b5d53d6d6ee93715d2816af7", - "5967deefeda04521e10621cf3ae9c407677a1a0204797f25d9540fa967fe6e8c", - "3dc2b5771bf5eb8421e0e04cc029a21bb648254e6cf409e14ccb771f18a96bc5", - "2aaed0cd2a59ab775f483cad6ca25db2e3cf996b39cba3bd2edb68ca990c5bc7", - "8b2e915dd3ba48946efe1697cab293c7427c12567e1090da2146f11044e37cd7", - "b2cc7b885cf9deb41dd7fcd4718e289b879e13b337b22abb1fc9bb1ae3330c50", - "a3fa5236254a14e4591849005a7877a59cf9ae0b58b14ff7f194462e8d6d5dfe", - "707236675d823b22413befe6dd55c436db2947321e338f530a6e6ce01ef14b68", - "3af8d3b196aec86cc2c368a2e94e6464e749f624a7fec2d4312610837b017ff9", - "05b64e84625c4ab6d2fdf592a962269758b242e71d39fc8c7e959fa16b6db770", - "b393c681ceaa44202073e51582bfba803e60ddc30551b4c226ac325daa03c4d9", - "9fb4fc5a834bcd912b6e8cb0d87eac34592040f2bf5b9bf30a4905b61714939d", - "c5e051bd06272008209cee49be16dca9d6e0250211cd7b77bff1cb811be8abf5", - "0c4f6717c1f7b4e217dbbd49217125ffacfd7cef60ef3ed57d94e8adcc5b97de", - "f26ec58757df7be54db1e7f9ab99d137cc161755e801eed2a27ead260189ae2b", - "3c5f79ff74e500273e1f86ffa65ab30f2084683606e25d945a03bf2490e57f98", - "af18b6ffa8f75cd1b7cadd9d4ba1264c5d7d390d4a727462e21085a171d4472d", - "9ab8ca3f41eaef02500e55b5d08b8f31520019eb12ff1d0eba57ebf3a6c7385d", - "a4b973281f5f70750d813f42fcea1c62f7ac4262df8e04cab9d88962d7f0c5e0", - "c29718f963bb761b14be3c9d2c29770620681cfabaaf6dba2cee15101465a4e8", - "423425bcb8e9ca1c156a16cb4a3c1051f59eea0135ea6598144ee61346ebc829", - "5732c7d5ea42891837cfb982aae8f13efb6a3ad074e2c7ea71210ca7e5d796b8", - "62261b493bffd73b91ba4f6e90b5e311248371a2834b16f16f350b2487ebe806", - "10abbfc5ae578222f48d188c343484bdd5371c5eb5737c42504065fef7266f70", - "34e395cc0ba42706649282fe1e2b8df7a137b96a390b37dbc4b28d1b6960f004", - "37fac06277243540016f4f2734161f6aa71a15f14619860fabbd98eb93415203", - "3ac31f7bc85d733ef706f496b41b2ca78888eb0bbfa4ddb34c9d359c4574904d", - "111b556230f44836f9145c7c7ce7d89f5703542191ba9c20c03735a03c7d161b", - "94157d9394c290569c8f9b196060964e8dc578d1af5214c8e83053b9896fc078", - "d8c73cbe96542824fd38201d3ff6787dea58e0ea14883f372d4e867f99f1dec8", - "d0789a56844fb8a738e7ced08b6ee385a97c0b8ae87b89e8d7bf4526206eaa33", - "a8cfd2b7a1e075e80b37368c672a60b255b7af5e6817d05de28894f04a6ff21b", - "4e3714845cba7df5a7d07c037d5bb4dda2fb21b9e46dfc3ba671805deec1feab", - "828c7cfade3c3d22e654dfdb380ae1e47a277c987b85e8c6ad7e9f044c2425c8", - "473bfcdd72fa25404c13911394c1c41e6cf2299100e19a3fd15a2a6d51ef49b5", - "f7d874c091f5f61a8613e586452592d7ad575c6361e98700c3baaaf0292a6192", - "60f9010a86ec533a6ffb490d21663e72a1e8de3d181b5ed914f77a011f7d9c5e", - "857b10dbb9146f311b835fb366bf15e15adbf31e1306550e549fcd293f005fae", - "8f5b46fbb8d0a920f8a35837c79f3d2b6c2d4e37291f0205490775e892aa4709", - "847b8a1e74c6ca86718dadf1e19174051f2b450e0319e63133054364c0299f1a", - "110d9e047769c6911da922a2592a1cf6b97c7cfb7c64bb7629d33d3c149526d4", - "7c9c6bd6160b880b60003941a054ad268b4fb3d4e3329c97311912e7e393f2d3", - "bb871da69550c274bb3b7a81770cddcc3745b61b8862ecfd955c31dc69c61dc3", - "806a11d89f2354092df830e6139467a8d6d4317b335d58a82a144e21bbb0e34f", - "ad98503c1bdcd4931b8fccaa2ecb746f215f1032d5daed4d99b6ed6291f1c0c2", - "2777582531251b84e887a6e796ef8f5b17d62269dcfa9b8ba223bb7c952e08ec", - "270d238ca9d22a622e587127b22efe04f6d7524ddc44b7e2464890feb9912592", - "2f7ec92e38c83b7ff185d445b37dc62e2bbfdbc15b19815be9ae3d3129f3047c", - "0a6ee46050fe26df48c06f9c257e3fdb3d1cab86ef23409ba5d2db32a3fdf5f3", - "34ea43d23ceb235dc4e7e647c846c658761d9ec4b6779ec73b825d99927a5d9c", - "57bcbdf74c81761cc8578622187a4fe88f3ec70988da08f300af75db46237fe3", - "4ec9b8813f9dfd3f9165722a1eed6cc6a3602619f220cc4089b0d03a85a87f35", - "9348eb1d4c20773204eff1679744707b5d896ea571be8368f44c57f82c3a35a1", - "4f3afdf6506bcd26a29c06d5faf544ac5ca5f3a8c45dbe8b0d5039a2884c192c", - "10122527cfe818fe0b4984c2b8ad862baac7645bef02f3120df84809772a2644", - "2ae6040bdf3fcec0dafa47ffe624b9c617c8a049b874df878d7ef7733f669f81", - "6a3af5e6226839d8c2c96487a63a35d91dd9f61c21d63c558211bd2edc866c32", - "66f091599abca71739a5112039ae3489e6e8d81efff03d3c38b623cfa96ddc3c", - "b4931508ad18e31683bf012e5ea20c95c4774329e925811758f563df802aea60", - "7b4ebbd9f371ecd13ba9792b29b87b52b5577d0b6ede73ed104e2638356c8175", - "3005746028b514461e5dd9a033e9c4194a769298bd7c9071ad8ca2a2c2e5bb2e", - "6f3c671aae9747ae81d4bac6d41d679d86787ad7bc2e0f3ab42fab45ddbc0ede", - "6a2fe134f6fc8cbad67142d594d03f75acad4804918212b941dd1baf03ab4d04", - "e4e30c8a361a864f8961d040d76d781d92ba3a2c9decd56a957da71f5aa611e2", - "8f7701461c2306c68839a6fc7da99b5ab191367a1923a481c017efa8e4f31113", - "01c054a69c9200d3e9122a32edfd0f3ce6f21dc8cf3c68d69afd459c50ed7f06", - "7496633101033e489a9ad606d8ca2f4790ea07e8cea4ba13e25f3a343a55de61", - "c388a3f758123e8b9a4d2617c8ce3c77b52fcb9a9974107b9bce4b113a4e1ec3", - "4ed1ac6dbb3170ed1c1e1f91c4eba70c74c749a9b8887be0672d660bed2acea4", - "af25856f4c35a86d1a52ab3a303a51b8173b16bde3423456842b035a25774d3c", - "21d18502b78c0ac17db4c5589377ca4bf212234b866c9a7555799c9734fef09f", - "dd4b333516b0c9da80c66d88e7b27746e30c66471ba48d16059035852903e7e6", - "af84690c2386ef735d7583a37b02df3fea9a485948607f393392890eda38b672", - "a996d2933a0b4e8d494d1dac3626237d9eb31b5860465b2418b810e6cae89b38", - "fd15b6333d09f6b3b2047fc909daab67dd04b87d2e9541fe0d74c78b0a7e36ee", - "77b784f511192b80d62fc313a15dcdedb17966196ece1c78c79a11655fc87859", - "7b987107d2af3f7890fe770641d4059fd4c35ee712d9af84956792d867ccf1e2", - "69e7d886ab4e98ce5b037eb9dfb26bef194d42ee174d0add540949bf5ab1c120", - "a6d1b7152a0f3237a2cda0018d3a602812546a80edcc05f141d5fed3d1075d91", - "ab41ce2dad732fb389f708fab4d364a9f6314585c52b89f72bb936ad7e0a5342", - "8410ae259513d4f59a56a6c56f931bd58a9948d4d1cd79e28a8add46bc45ffea", - "d48116ceeb210cd0f154ea02db693bbb74b75b6ebd5ac4478c8a039525997caf", - "bee5bcfa32f217fa85194c4d63ccfed5846393e666075f182b6d605361a06466", - "844bc0afb6b1e3e49d780a5990b2d6e4fdb5980e1a6e6418cebb886da62ef7c5", - "9be61afd69ee2ff2675db54337e365f7b912708521af74a913909cf3131f150d", - "4fa8472797743c3dd113b02359b37b3fbaebeb613f04475020f613f92070233a", - "481bba7605f0a1d436519cb9f6c2fc6bc5a8835359ec61c3679b7940f92ce322", - "b27c9bb036842b09854ab1bc594c7fd4460291e2b16dea2af767370ff17f76e3", - "b883b4ce0db4dd05428ebcfd0d465e7c20571dd7cae88970e995239008f11b85", - "01f6317c88293766d5b3e51edd50897f22d2c0fddaef3809941c2472d87d64b9", - "1eeb24feabc65dedd38d6632dbc15e9583b1f2a2f2389e4693e309492729e35f", - "99ffdcc30318e491fd18c37157ed047f1ae85b1509395bfc9a68f3702775f5cf", - "8d907ab5b6369d33ca4a80bb1f3a370193232082786e00f23f24b38a9fc853db", - "af70a0da607ed8a7c4b4ef59b5711fa6b21248bbfbfbb75288113f1084c24fbe", - "9e9a603289fe8bb6da9c249a80323184abfa2714466989706ee6bb55e3a32c9a", - "32e3e0d7f57547d0a371b975de6729cf84a53213b54a90b48528a64fc7f40f91", - "c6c2430ae1df1e54ee818b15e62d1c2b6863c93564b9842e8fa9516bc11c4f5d", - "e64c177f0717d36abd0dec70f1839d85c36ab7dc529999c0a029af9bf363a279", - "5918612643a521e8e154f28d6c3140528f3caf4332c63fec02368ad17bea2d22", - "1698b98326532dd59941daee7a1f147b8a2db00b0a1de91dff39ad438476427d", - "b48bea8600e83ea8c70f6883e065e3c092b611595d92484155ab6d90379fafd8", - "b5f5a122d93a6c28157fce72036facf577b064139a55a264adb12390d40f6a69", - "8f220316c01d224c05095a931d91c5767662b12bfc04e6c6ea11df97ff4fb03d", - "d7a8029e4060fc22e22a049edfb35ae617508693d7ecc0dc8db43a1b4498045b", - "9fe50230b45c2781a59c5cf03bb79cbc67e45c6c63fb4ca3e22daa922b244fcf", - "5ba78ab51528d0a08b1a5e4bee5d18d85c606c97ef403b3c02cf84ca87ecc646", - "ae149771811f52b9237b4831ea7d0bb2c715f891bab9746c6933c75030319391", - "4eeba314226a6aa2018bd2848b25a1a29b2383e1d620e1c40844ee2018be3a0d", - "a3ba5c783bc5f65e8c4e47751612ac95220adbb89061dbfdbf7d8d89d31d9400", - "d7bba3b8f2c690a61e7b5ca31c93dee6d1d42aa380388809091c2e8491c42677", - "d672270e176e36b4cb10f839c05895acdb3c186b91e8e1a8ec6228e72236158c", - "8ed0d57f1897a0812713a35224d341760e196bc97141d7e2b6b3f0d874fab282", - "0de6eb60d51353dbaab0bf0b7ba51a7bd99688655757bd8957c653378fd84ab9", - "d71927f7147281f66359a827d9bce24c53baa9e7e1ee2505e3692a6e745aa430", - "d86e65d5a8b19b650e8a54730b1cec3876a9b426b1fe50d4d46dbdb9c1c5b80f", - "3d2dd037a228bb43c11bb495b1d038d8f2537cd05a4eecfedfcd58f16d73fb8a", - "0c4a92d19b67f584ad2687be2376c8ac70fb62a67c65c77692a7005530da6b25", - "0d717d3e754e3e6c590f1b7162085e5db7d68e03b9d179302707ae2010dae378", - "f9bf8d4fad431748e6a14e4342dff5a57048531397f5a64b1ad9bf6306481c07", - "9e72843f80d68225dec070296b8df13375a82a57fa6538a5a89121c3c6301cd3", - "6560ec9e642ee22522ed9ab4a02853e64731e808c95660ce89c3907ef59737e9", - "26ca588272319f8fcc83d88f8af6dfba1a019b620618b8f3a4dd6841a4849811", - "cfb6224b1d2deccfb78a9f881caae8deaa4637967f931ec64ce21ff906f39d78", - "58e3ea6c0f4977345ba1d8c2b19cae51648e80142ddefd01178470eb98f99b43", - "f084146f88bef7273c385a9503a9e815dcfdd24d71a9de3587242f6bc0b64033", - "ae48e737c5b0078ae01d5b785c96b89dc0139af56aeaad860dace135b8fcd9e7", - "5878604ea7d9612c7833257e349139939d8f009a5e152512314758580a63a168", - "c0cdd809f41654075f03cfe61035b623c746ce67176f94aa518b69571df195c2", - "9910153e345ef33158f563ccee1caf8399b96f3ea0d9f3b47a4888fd4735994b", - "d97f197ddc20aa73573816c9ce6d5bb3a23a4e40acdd0cd6e4a4ff1e7710536f", - "d61aa0ca6b21c8509bd0b17f036e3825bf2c98182c3d47eea6c2a3ffd3124c2b", - "863d055ac7f193265b48792c59db7c7ee01579daf6a1d2edf06ba1ca99dcc3d2", - "7a4af3ddddef78aa61bdf26a0ae2b32df55adef20148c28f5c1f6105b5bea955", - "dca3ee7bbbebbfd184a017890bd8fa505abc14beaea73ac905a7d39268f8a6d3", - "7699abfa4725181e9c4fc4ee73f92d93949d1ca434ed60784de4f0927983dc81", - "4a0ade79dd6b7e8c373c22ba23644e3cec59448c6340b7e244fd9ed9c0c9d214", - "38715cc6d489f125df244df9cc1a50ab45f255b1d5e6300e519c936d93b7bb31", - "f7d6006258e3566f31d422489cf3429a529e1866fe854c8fec5ffe642dd03cb3", - "c16acfcd52f6cdce66f9d92a700d89d3fd9b79dc32c685812d2e8c36e82266b0", - "8188d1efcc23039b0b5265b7041553850cbf751b16991cab91ed54bc913b33f8", - "f26d62d57cf7a7b1959d8f9b153dc3a8fa410ddc1b6698bdeeccd96ae1b5a696", - "e152e9b86e900e8481f39109deba90fc24ae29a50e95ea17e5833dad743f97c8", - "0356a73c643b2d80eabe91504899de5ceb9277d0879fc01c201e38493ad70d48", - "47322eacd262d305b1ad2bad3df2174ddcbf5775e4efbc8d6838aab1acbdde42", - "51fc39eb12503da167acc472ecc127f5143260df8966578cedf4079b16e2e99e", - "7589ff1b6d8c32530ac0e9231417bf18bac5f32284ee7e5aea996299f83b852b", - "50cb77d82b8c127b2dd4df97ee578ae3665e572c7f5524394ea4e6c83604582d", - "b2ee1c7a4a98eb8977571cbf57e1ffd0caa19627acffcf13d732a7d9bb28dad7", - "869c98189305e02037a86ffaec16f5e080f6f9530bd98a78cc867352fe0e1ac7", - "b38826ca44618c31a6c475a330153c5f1d5e76daa8acaf2928b95675e832dbc0", - "2c8f0b3cb3646475b6ed67a0e909ef3ee9d01a59b4479c6d57c0c1fe0fbcf8d3", - "4d105441283e3f1139d4d859326bd4e76caf7955a76b750f79953e1ecaa46468", - "9ed803f9dc60d934c21a362a6b10ee94b4a7e440e065172abd7a4b6c4aa92096", - "71478bd4273781e2a8bbcf048ca4b77d549525e7ef3acb189ec133918794f331", - "8c741ef11343193252df3eafd77e8cf4c1172a7d374f706b9e136d23dcdb3e16", - "7a89ce1ea73c52dd21b3dfa9934e6553e5fe3b426ed7a5785186e7e777461e45", - "8c0f17e6a6f2807ffe1eeb818cc55da84aa864a7f4d477cb4b344857de284638", - "a5ddbcc4400be0b28cb91dc4c3bb35963910de5fb89f3901409062cac086ef55", - "8eaaa8c9ed5e36e93ab04be6af0a8ad0cfc9a181a6f22d4a3e94ceeed682cde7", - "c6e4eafe58619f86629f08d16735931273c7eee1b9fae157cac99220eb3649ad", - "858319b1f97c31896a683a4232b28d0aa045d9e148ad4a22ef7af29cffe80024", - "3f57b53f0bca2c5df6b4e7dfa2573eb53f8843f27c593b0d4a7256f8a3d8374c", - "495ad9d718e289829ac4191f316db172acc792b79ea06c488f14c0add4490d2e", - "3885b28de8aad347e8acc9cba38b24fbe1112062e7c064b87c11f7ac74c14363", - "01d0c912f2e71680f062b80aff97673293fc6535707f08f7ab08dc92ea538842", - "aa841c33528f04988079e95ce3d617f61faf7122f266c0053bf52d50db2426e4", - "d1a30babd5d45f95c922691af35f2c99178a6a1d92ff91c0e14ef5ee72319edf", - "bba5d0ca1d28f8d646df3aa94a51f2a127250db9bdb92ac831c2683f3a484f9d", - "55cb7aa9c057ef68c0c79ffca63a8a6226fd2e150a03e9a4f70bafe325f258e9", - "a889c1860ae3b457fa53a0328a9daec84fbf4ad307e22ce64d390e8c57899cb7", - "d2cbc932caf1460d85e9f4357b1db4e259f40db733b8ccd638bac4d028df1748", - "0c79953c66c7f51620904ce0ad2ede16873e591a80d1db0869325ed66c6cfc12", - "e777cc2f2440ceb6e387194f108b1d043228926c8d264653ea74633349ceffbe", - "676f637e3b3f8d9141175a906f5375c5426887a9e3800935b5f8389815e81a69", - "b6314308df5699b5d58beba515b555f398a87b077b1261f2d452e12420094e0b", - "289c684663070051cd07db7e402941de81af2ae59825b011d1e87f3d4abbfde0", - "d62a800be77f85dfea9948e18328f9462edc568129611499dcc1dc3adf9900c0", - "58fc9943e08ba2f0b36278ba6b87ecfef16f4c8c6cb79dc6a6c1ad9c0976b5f8", - "78e4626eb6a4ba1aadd861f0e70a3ad909dd37f7cc90f1a2d929ea6d7ebebf7a", - "a46f52a7a31d928b50fb7bea4c85abf56ada7a8d8f70938fe1c2ad0cde84cf02", - "6f3473e47f60d187837dd7fad32460207d7c804342be5938f1a1cf4eeb074d25", - "1b55acf53c12bf710258ba0a978530893bdf9774c558ed1533f4ee213072661c", - "8445f2809dafbf7545aae8fa0a29c4bb5f66b050e0938d54424ee5048b5b8011", - "0e6d3f6d619de9776a140e91bae7ea85ca9766c5054c78672c307abcaf847c25", - "7302f5cdc7b1896803f8f061b23f6f6a91c2a0f77bece1e78fb1da3fe2347c33", - "64701b3ada939581069a6adbb451fb1a2e5715218438e74db2c7c0fc390a3abb", - "3b87d8736253ae9933de0a5369a3b77c535b175e7da59c418badb9c1cefab08e", - "3ca2e8fb900a2fa958027285ee08502d8c417c5d6b93de576b1a7ae5e2c2555c", - "e35fc3cac491060e74c8abfb73144b483fbcc46ada5bccd0cccb5ef1c9792502", - "e9e1178bfb57a05ebf02581c377f0cd70f0c9516e4cfa5e672a93c6bcadd07ac", - "7a05938582ee390db51b7c7a2204e82106e2a432f59e09f19eab157128c1e007", - "86900f4fdbd2757adb9e929e6e8ef865951a59190f6d2b83168fdc2026110cc5", - "4ac81c6776c51d834577b1c6c5806d2112546c7eb7f245fa60a9c7961c362bba", - "c2e49b5ad09b2e11a5f6c134cf852872d61daf5f3e34467a33469688626242bf", - "7fa98b80b8bb1f77222f91e8f6c48ecbd8b6104d503de3f1730b11bb79b9c79c", - "777daf7efcea0a063f4503ae557d3ea223c00fa8bf854ec3473169a7e4cffae2", - "06cec39353e18128749f00916d3cb3f02f580e6b94d2111be1b1972bd8a50059", - "93e4df9d4c59bf179c259e973f5c0b1b94365a67acbef8313aef6ae5201c89d2", - "537c255765d2235617cff82741422bb1128a695982743658ecb39b5c00513fd7", - "2a1223602cda59997baf847a6f0bf38e9ece78945dc4af7886fb29531acf392c", - "68dd445322aec6ef51a8fe140ef9d8a3a69836b93e4c89385e4e11bce67bad92", - "1860c3c8d2116724f747b05e469d8bebc1f061c8e6af12b47c4a0d2ed3c471dd", - "e38fdaea6a718773c2f48957ab8ae7413518d99d4c37fc56459a3c197f10e574", - "2324ce5f0959883d3bd68bbb755e2c7ac0c0dd25170d43e0b88aefefac6b603c", - "77af666ac14101f31b556a2467b5abc732b3e1b7396a14ed6393f7ef4808023b", - "521e79c83c52abe3bde873ed6b9280fb2c1e9731617254f39cf0a4147586fc7d", - "e81a3e7066898e1ab553f88e74ab7a3ac501a943a066f6049bb039c2332e2f59", - "cf9c402aec10d73b1911c1c930341ec5933c6a6e874cac5490bd013819c00eef", - "8745e77db3bb670b24cfabb3c310bf287d6ce4fd7090db947c57b5429a4a9c6e", - "93184e0ea92be4fc35da3e5bc53c694c8544c647445ddf4659175849f63011ab", - "f1bd4d59556ae20cc5e365e72b8b1d196b242e7369a79d1b63db7226cbd42d50", - "31d5e2b1bff0715735ff1889da6df2d23881f57e8a7fee6692714059c9938e0b", - "c15697a5ec05ee44caea51b0b6341b475925336c80eeba00667d915b080f3238", - "316e4dae229fdce85ab0f658a4277be0bdb0aab7f1fb4f8c66cc8564a39add29", - "bc06512361799fd933786f0e81fda581eb2cf1130f9dee2c02d31fb2b87d4741", - "1c5bdb53866ec170ac82bbce5c70cee13ccfbcbb13d6a0be7aff541606e135b4", - "b1e299af1a785ddac09ebc4955225cfdd66c71efa3b774d0524a7be8105571b8", - "cc209159e3da727275d57dacd49eda51bf64798f19581679bdd822e1531ce756", - "aea0dbe3cd42db1527d5c758830c68fd9be4d8be96300b838722f9e30d158c9f", - "7ba7084e2168247945f37cab2cd2dbd5e4351c06ec32202dac88070795359557", - "0cbb6da6fab1d1297536fcc36e1691d3a3daa938b360e6f3f61e92fad1297a96", - "520dba395173e6ae2c406eedc53812a4c8af7b5b14f5748d11e920d79f98d151", - "c2d66a4178ab34c06860bb359d5a913114bf595cd690da972746e09cdddb40fe", - "eb87264d44d8489b253e674cd2c081a09d47eb8132d37508cc3d52e10ee8f2b6", - "49a6a8d3754777e2c624831580f53c6ff48b7dbdcd8eff006ad34240675af43a", - "4bd2f37674e192f205e4f5676eee749467501ffc3e9f3a32a595c42911502afe", - "e76b5f6f4bac4167ebed33b5a8e1222e3c79363e46f745d20593c72d59e5204b", - "2ec13535fce64169e7ba513648de172fb0c0f7a2307b219132f80f2d3050bf2f", - "6eb3731dae896231801988adab026758b64adfd4f01025cf64cbb1ab4d4f1024", - "bd04a7c4949e66f28c9f876313bf5a10c25d77ec278503cbcf64b01dbba22c81", - "354c5bc7779b83493e41f6b22c936e82a1e3e8e1ab52adfd93d24f49d00e9f2b", - "a235266880bebfa9f6120c1d90592fdd2705905e2be76e9cc6c1f9d55aece39c", - "076a30f38a2b952e68910b62a66fd01762b94de0a612420f9f74ac47baf7d8da", - "19a346d837ccd2e054cfe2ff8b00f9c5b8e46bbcb1659716cfca6be6fe276ad0", - "28d99567035f83bf120479ecb0924eab2ff2584b98ddac9ec23a8fd4d46297e2", - "d145e6547987b0a15d6bd05635a1d207200ac8bb33f536569ed7cb32932cde35", - "fb3b0e6f9f2dd8eca13f96808def5cc1da6296d439a926653a0a767b20398edf", - "941bec741e2ef46bce119e7d837cf7b62e58aa60705d0fb81a7eed8eda29d448", - "18d359bb85439694ce114bb303ee2400569921bbf35d1ea16b476491a9d4b632", - "7ee9284aa0798580c753a72e0d8c4bec0b111970b56236a8b70e15541853c075", - "2db4f3673754f0d041255558a884edb3bc7d7cc41dac4a21e8c1e824ab7cd3fb", - "49a2f1172bdbde7beb6c7f9c425bd61346de7bb6a07d8ab1e419dbc6796b8410", - "1a23cc7c087bca08fb45651c08b7b018776c9d7e3ea329d7b31d2bb3ec7e1337", - "941d028ade00fea9d1210e4b3362aabc19bc4c4091bf58038e111918b2bea341", - "687ab070dad131711257550199ac7d60cd524f1e637b889a99dba8dbd738c7a4", - "0ee1f3d5832739700dc34d40c3a0c857d68da7ff6a38a8cde817f8cb0562b31f", - "f38ec9028d84eaab78c68bed4d01078b93bfdbcd431dc202ce818c1cac2a7b91", - "d0ff72739571b22f1622ad3e2b83f4758b10764c551b1b2cb426b7194a610301", - "c9920bcb117992d0f18057c1149ffc9d2293111fd451b8c9f68795d4c926bee0", - "0a29b6e44f715574fdbcd5a540fcbc50260a772b0a51590dfcce54886b2e78a4", - "56b133686e79134cb5e6309ee3e6b7fb1130053fbd81b202f7a53eded579f69c", - "61fb15f30ad69eec7a4e6a1c20538059ba9e2705e26ca2647f1abd1971537442", - "d3fb5ad683d54806c23cf5924a23f17cbff27ad75578372a6ba83c5b12421843", - "688fcba03c13e71de5cae52a1cc040038ab78deab0be1dcf65510cf9ecccbe04", - "47507130340a34173585b2a891abee00b1240f7ffc57dad49c6ef0e85aa7b20a", - "69559597f2644d030968ebc24d522b35dfecb047268414496ba8d2a870da5917", - "e61016a9134e6aafac8a18dc53a69e6ed24a62e7552dac646b555f485f700fd0", - "d32fc6076485ac2252033a90cbf77aebcfc90b5077910b814b59a4282d345628", - "3ce54ad4846207e17e190b97e23a04888e8192e2a4149f5a94ad87a1424c0f16", - "96f39a3bfe9fc02640974d02d2e64d67dad51ee24de57874af287029146df418", - "7a035231e649bef48a0a3c76637a41f9d32b759194ff4057c543446411eddcce", - "3b9d6fac0115fe3e2e7d01c89a9038371092de2b83e86a73274bb3b6943cff4a", - "c28903072ba17a54e1dd60f4a5ee4d5e3ebb3450cae97e7755b4c38e5f4957c9", - "f7a548d82f6038b0d504346fdd590483d6fc96698988fe847186090060fb2b0b", - "bf6e6a2a14fb91bed09d231c59c685865354f37f59e017bfad1af2f048e63404", - "3d4ee0bfab0cd7069e9d33161a1168bdb7f2167f45fea2701aefe33d5dcd8b7a", - "a8457cefb36f4e2de92e8e365a6e2023a5fad908e81cb0645d8e452b7b67ae3d", - "6a9c07d3119b2d95331b5941182c59dee149cd472362e9e006c812d167e8b33d", - "98003ec930b422958f51add23f6fbc10c64951a8e4a70f252f2bee6ad0ce5f13", - "13886ae4e5f980491a9e39dec8726377fc8491d52b5c88298136cac7ecf6480d", - "c524e3cfbfa03d2d2f2ad28fff2ba64336aed575ed8b70cc1d2e3c3406d43647", - "d26e5f871dd29dd707d945e4410773e158f0e02b776691cb47b0ba8c76d9038e", - "96b3e526e40f491a73c460e10d869e071545d1dbac4478d2aa54999c2bbbafbf", - "c9f4d8aafe4fb1a9da1316c2be435aee44096c9b70af97ea40edd224dd229329", - "091dd78d6d97a1e8273f8e95e66d90aab0cd20351fdc0b99ab60ac4ba0abec3d", - "f1d6c6b1c55455a96638bc9a5231e6c8f2dfd11e5ca2d4fa92d4753a29ab352c", - "611978220215d7496ebac33615052523d4fd7a93b6a1edd750c48b5beeed27bd", - "55a2979f30a02b46e9c2470aea16f9f1e6c4e17890e0949a117913c09b1dc2f9", - "d6c67564c63f8c34ad69bd29954bd28cd29980f7e2350240b63ee6a532bc7712", - "41bd6de019f7d8f86a2dbf45bde96516a3242d1dc9b0a399d1caad2bedca101c", - "3006ca12fee8efe3c82d32e44ea2439cfd18443d34933838e6a36f51bbf621e4", - "34a2df7b6f00dc0e72004f7a0ce064e18445f37e112167b8615b262eef26987b", - "6c3bfc2f2af9f43756cca64fdaa6f3db287d7e231d782150fe5b5845f1000eff", - "4467d8c0e83941750f19ae87139cf6b2d9ec93721827a7003d3ffd13ca170698", - "fadd8a0edc816b4159bdf0418c4d83584cf63f8019250489e2fc588851ffc1bd", - "96e44a79614a472917e8d361475ab17e8491454ccd540bf37725cb950dd45d3f", - "7b37936ed0dcbfff8c9b13ae982415a2352932cb8268fd62a16a1d1218543d4b", - "af60d456fbaa68407fc270daa6de9fc3c80e25b110539f6a4bfeede9327a2f9e", - "9b391441266a30a503bceb123528cfbd2831c30a5c928234b623bd6cacadb710", - "2499e3556a59cd0ad9e9228fd0b4bb908bb601cf23373af683208c38d233367b", - "185353e31a9cca95f0590e18be407c367f2ac8bc6d12984e465375f4e2f49c42", - "fecc1864bce83f976be6210fbdbaa382431140d69150c1c2f2b167797feaeed9", - "800c18e584efb96b96c581ed146ccdf51fa2ae9609c786fc7d271b43f393975a", - "a037a59a58f1a4cc9b0a669fc75f04bef1e5a3facc2e49d03ee053bbd6ccc860", - "e55c3ac801af7f400392eaabbf8d193bb2bf1e6bbc6f1ba37b38fcab04712ace", - "82adc47121e1823bc4d198038730c5b9d9fac22aaa2d729240d1ed4c1593969c", - "64fd2cf4ac6f417a307fa526f5d92948ccb0a6a314c344ca530b2f5255885613", - "849907828038632a9602953fc7bfa60285f1e3dc9bf61c7909b9af1623028e0b", - "91eeda4ef0cbaebcf4e6306c3a982e17dc0234de63fab84d37d59a09ccf3055a", - "7c7720781f7c4b174096a013e9c48396a86a37b89d411863d661ee471a995f25", - "f6d3466b2f6a3e6b1fb25581c9ca8b8db2b7eb6f3337d5384af8ffbbc2df2a3d", - "8bb7a27c29db1859d4825a6b56acbc8e80b0d606dcdc877130708ffad660d1ab", - "8ac1282d6591eb16b49f9d5745b8b5fc5ed968c406c81a13000cc8e71961e481", - "1c22d7b5e029d31d992de9baabfb98b292908d8c55acab3f5db72a4569f90d9e", - "784906bcc62cbf715af8e6c341518b6ae59d6eadc9a2be9ca2b35bb6512582b0", - "af5c9b697b4b2b4a44e3a8b5c188bb5a100f1ba9a1a1cf980c0c311975ba04fc", - "94142fdb2158f0435694a868b996cd9f90b0af92af2308c0537b39994031a2f6", - "d3b964586076390bc56e8408ba6065961c0280d11703e9391c36faa60952fc20", - "ab6b2478df2465c37a0f6fde45601f0aca0ce27eb839c7920b22b52541feae98", - "e866bd85ace0ad83ae554a8f299332b87653c9149fbecc4a77d3ee79ce334c2e", - "aecd4331ae6b4d1628a2bbde158cad4ffbb5be2161aae0e299763e8c92fa0f3b", - "fcebd5ed924929485727418f7afc4145ed4e9995d2260827662e4627c3895fa4", - "8496d36c1cf3d75109db5ffe3aa7474f0f08e84e52b1a35a63cbe9343d4ffa6d", - "57f7a756f86a3397e88ce9f5a085ca2d8f75fa1c2226859ad73741015b7cbf04", - "7f5928feba16e3a25bf128eeff69106c73a4663d90078ffcbf011c0ad3e4fb38", - "e97c407a0511aa916e61676a05f83ad94125dcc6632f492d5ac83a02c123d093", - "41d7c7998b5e0a7ec4c92f9b83f88d6e3f3da54a8cf652f4596ef0997e3f0ef7", - "e87e3bbe2a2a464526c2ddf8bd4ad759b3a75a709e84ecc8fbbcf18f3d6153ec", - "b36a37ed02e77f903885de3f62cbfb1fb6efa31d076c56f7b0058d49375be882", - "9f0cd285e1401439efcbe95f57a13f3c7b71b8a6de773315af178a220093b246", - "0af76c4d2c60d1053306de35e01e1c7db7d7246f8eadb0d13b89bd96d523df8c", - "71c6cf0d2a124a130fdb97a21baced112c45c6982d4feb66854363327c661c8d", - "8ab5d563add87cb8e4dff7c26a606d15bf9ad614231046a7463f0be3cbdc6289", - "94dac861a87140c7a1d2a83dc5cacb7d06e658551e17de7291dcca9f62b72544", - "99f0d76066af8d7fdf0ee51a89be3cb45fcf3bbeae9e6ec24e5e96eb7da155e3", - "958ab3f2cdcdfef536615da5d350a604798929ed7542983528da2b7a1d2e5a48", - "2d7e99e27ddb932e8466104c8a816c37bd15a0ee4d61e8f1ab116cd143b517d0", - "192855a022abdc86fb35799c8b1c7eac7bd51e59552d231b1897f4b96e7655df", - "3d2df37765da528b875966a82534b2eec2f4cf327613a2090e08b939c6c58dfb", - "22e646c56ab16b15f451fe8185cbc43d581d1371a9555f79167a3c9eef01a41f", - "0bd0eeb844a6a515ee254769451c615d79a20285755b9920f9063d0fb25a07d5", - "5ee272d1276205306c8eb36e06cad4abffb7a03046ea5787123c8d002bc66314", - "d6041806a47815b1aba31d8d34fb0bd2c87ed5b12cde9f96606a13ca0499a910", - "e1be995b45c15b980f7c4c48942cb07b615fb0f4b0a8a2be40bfe313166af918", - "c03fe8fe80c92b3baeebd585bc0eb35bba2be2759ce8ad79df67ec0507aca233", - "054959ce90a3aef71d2bf0699744772efeb0d3dd9f368f16203c72e33040ea80", - "dd324390120ac83aae2b59a02fe33657ce4acf807990d481ec3289f89f41a2be", - "9ae7fca6d1803606ad3430700d7b3bcc5802ac18309ad99ce74c2d3090a4f954", - "96d46b21a2b59afba9aee95077aa4dc30800e27d8ad8516049bef8938ecfce1f", - "8e61330e0f7627e93beab75e0dc4b379ec573300f465d82f3463101511582cd3", - "0435a61eeba65e14edb5ccf5977d74421ddf183a70ccef506bd365e23fc05fdd", - "c4a2678d6b46037bde2598495e47cc565c57ea5816d654a180decce29c7273d1", - "dbbb6b0f61b5d2b914c6c23df5d1a37aedf8475d9ca4d1ef2621fc874092fc73", - "10ee625d1b4da434e61bb3e0d8d65243e37e00efbebd43875e7166003e3855b0", - "5efc72b2abe27306f22fcc4f83d67ff0d7c28b370560aae444eab7b4c31961ca", - "10bb3474ce583e31f91d004aa3e921d9c0d148e0387f9e2cf39294ffb82c0bbc", - "7bab6de4a875a43447f457f6fc515a15bfdb67bc6ab0ce49cb45fcb342dccf4e", - "a9998e511fb2a4bec602b713567a3380240a3d7a552b1aa018f574d94395acbe", - "264bb5a90197c6f5d16a3070222fcb7e4bc8895d7cb3e53976c57fea898ce931", - "31466d5b2fc08686fd1886aa0b15fdbe9f2e0467997f08d8627ee3449eb2cf06", - "67f7a4e9b7cc8e9dd199a398c267fa149a5e5f54c90667430457c0d57634dcfe", - "a75c79f5ef569234b361685d60822b640545c01c63f3a448b5dbb997975a929c", - "1b12ab5bed1270ce815cc52987b94b98f24f1455e5921b103a5d4342f8a05fb5", - "950d4cbc8d331f21a6b70e36678caf705ed03ea42e1a0516762e5d3cc6c27dfc", - "0d0225c75ef54b37726ac397e83ddf2f3d271d93c8fd865aa78fb42990d9de6f", - "24cc919cee17c901aac4635cf9c3cc8fcf7c1d7f94f4e118b77626a9c9fb7ffe", - "7cf9b35c4209d9c867ff3eecf53608e1a39f7460cc60f1add8e26fb6d7b07fe2", - "4dc51c5601d6c19793788e701b134dedb2dff19695dce6310e69fcce92c44042", - "08bd22875ea8e64070ab55a37ab8e9a9959d55279ec2a4be126e2860f066dd24", - "12ddcf3df806cebf004c83d145489cd2f2e895c7371d30831108ee91324b9ecf", - "20e010171805046da610bd49dfa31312668338ed091ebb4226f55e3c8ac9185e", - "8de5960167dbb9616606fb9344a3952594d68c16dddca808f30318528b744480", - "a3106191b0a10fe8859075918880d4f7b19132fb222599640be7e568a7dc59dc", - "d260b65b246dafcf1efc59e10fbef25176a3860c7e02d389332ac1a0876479ca", - "03c169fd595f9666160e5b61e53708a3693b17dbc4d2e1f0349316fe2d1b293f", - "b5f726ed77f3b109b9fd05b7a6a138c0f77e11d3930af2e52babf32ca9e1c6a2", - "ac769da66c70fb089bb34ef3fca34534d5a84000e4042a574b0cd48ee0fb2175", - "82e5d4d6806442d3e830a62929aa3ae144dbb4eaafb8d600ad2dc548927d270e", - "cadd18a4efa7ad1b5b2df91e6531bfeac6dee8569810b692bae7cccd098a3aa9", - "2597c8abfc09de440073f168ceb8838157c95ea55655aefba437e721b115772d", - "6d1dc3cb469be43faed71baf27b71bc72418861d54b899c5d4b8713b151308f5", - "20c419011e44c6855a3574ca80948835bb3ba08d7aa30d072f61768fe2d5f79b", - "c283dd54b08be18345ceb698456660a8cb67bced45c5d37a5d203f325ded2f25", - "6337ce60839cbfc9dbb2f57003eeab814ff292418004b72b52a73e374331f581", - "7e253461217f414689779f394a8594083c48b9e8ab8143f774ead7f9baa7869f", - "50facc323541ddc4c39c291fdb11c2d185468b14bb1919d1e58fcf69cb77d723", - "3b3326a499eedb58dd2596b6103d868eaba5e48ddefb4e18b3ac5d97005332bb", - "ff0c236f0d01c1c1604e184f21b193d619eb4cd664db723c0bef50fc2bf5f3ee", - "30b61701d5dc201ae2228f5985a8c0e2dc558f8964bd62d9e10940cb46028195", - "37ec93c0420c0bb6ec72bda6a91704245dbe4ed81bac8747b39e0d3c6cc30085", - "c53a4cc1c43f19a43761e5cbf4abba14d2f08cd667c27105ff83e1961b2184ba", - "85bbe53d2c38395a73a7aaf338e5c50392915bb85e8d4399431385cec7997dd4", - "3374d2602014c9b17ee51278ec1fb7c5bcb2dca695fd84d6d57c0676c75377d9", - "ade3d5bc9b80dd1b71105a25a96d7538c85f8918c6708df63bc120cc77b75cf0", - "e5cafc86fbe6703a61317e9575d112f1fd97b274dd6e682bd14867c074c7aae2", - "884efb4d8eb846be1b5dd743b686b42265f38b798d6f7bdd2501c17927c77a40", - "de20e24c69f237d32106ae4d6ff6ea3079d157fce520dc0f3f54abda5ca13310", - "c447b08dcb3ebfb5b68abc39ff71f9204b7eaea175ed8ce1bc27af88daedc2fe", - "a008586487d9bcd311280c11cce52dc259685ee17f0cdc66b0c712b7053aaaba", - "050356e164d9647abfd2f004dfd9e3279949aeade6189ca4fc152f96958b045d", - "b45cc68699d1b589bf3a6eae117a1e4e0f26ca1dd13fe935881b172c70592acf", - "92639e1dc4ae64d4dc11f3df8755e0d6c0ce0b1f1faa7028995b9b1f468482a1", - "18018ef5adecdcc33058640404a220d737b52a70095c65cfa927124234223470", - "12034f4ac72d64a2507fc729193dd9f80497648dc1635f2eb0733d72b2af8b7e", - "ef202057f4f8185e772bc7530810ad97e9aa1e8dcf324ffa613e46ba1677e5ac", - "f393407e022af6107404f89c4206244d36695ec07d0efe8e92c2e6cb8fbe2fca", - "6bb608e83f7dfde849975856d64a95ce5ce548de4b43950406cbbe3484de6776", - "cef06e8d9618746e3bd86ef2d7fd68b7f4f2ce21ddf5b0918b01ebcdac6e89e5", - "3792940388692097a667438407bc140213f2feaf06c1482047637964fecabbbd", - "4852b337fe2e1c74e3918895c98fb735157507058927b43e136e6d3568a39038", - "436b6171c55038f3e8fad57801ec28f72a6c539f413b97d1b003c94c04fb06bb", - "0a781fb0cccb074404ddd6bc5c015e47edea172b9e94cbed4f074d205c048f9f", - "560677a0fba5de1c9406fa11fce05b12ea170974f936739bb7e429f15d66dcd4", - "eccaaf97b3a211cfec114a43931f6a3e895c3dde624334361ce9a77a42108ed5", - "45dd7cba9c4ca48f8c2990f546b13afbd333b1890da18a6af8ca1a41487c09a1", - "cec5f215f8e70309dc767c815c911a14a72a46c11502aaf6b4c63db07068b55b", - "0d7662850587375dee8467a70870e6caf5c05a5e61c13f0568e427bffe8fdec2", - "dda81ef63131844781bc6fa366f6f64d24826f26472eb35b9632243195e91087", - "d4c7e315d6c82bbd5609b6b20d729f23dcdca2cbe33fa13b894fdd4c53cc35a8", - "ec307bd7431d257b7ff05be6004c93cb5b42ba3d934a2cd9e38f752c60b8cc3b", - "7fcd162b2fd3b409a470e910443a999006816214444f9ba4de31a855c907d9df", - "cebf958ffd2a3a41314600f9f35c1e8820e05d17f8127ec8046fa6ac47659d50", - "f945de4ca3318e0d8d5000c6c2710784ba5214677d4b0b5e8078a77155b9e319", - "6d9a266cff6e23c40f1f92e74dddc7acc3921f13a65fe7adf97d471a1fd41e28", - "608e06d3f713db06fe273c5f7f96c2a68f880c5a5fd6b32c2453acbf8f2b79cd", - "18a45f35aed1258da4b96696c1c693aa064193a82f127bf32861a482484966e5", - "7d6636898c5d56bbf8ac15e9ac2661c8eb00db329d2129f8fa1119c8ab9a7c69", - "6e6cf03e5ce00cc5a4cc2f7f58be3b728dc07c60c19aae23a303267b6c572694", - "6049058fe44d9a4b1c348fb68df2b6d03a54c58a42c996069dbc59ca08f33684", - "4804a9b7aafeca421e0b09c26f3350928b29bdb28849c0ced47b2db041bf2fec", - "0bdab09b76ca3292d80e250fcd416215273230cfe6a52a15644a78cade58c1b6", - "1b20d97f787de74483860dff23a0e08d8402194e8412a750e95de9df80a898a4", - "7595f8c175c4d3a1691bb60e20b7604db2a114c24556acf5e8aba48a4c8c9765", - "97544238dbb43c2a2b3e8fb1d9459eed1b28dfed93720686b05d38757de38dc5", - "06e8b74d99ddb4625bd28056754bec7e26ff2c57cbbbbe57e5936740049ca487", - "582a4ac75aca0d1b1ba2411bba505bad93a86fc77ea43b6f349d6d03811ed05e", - "2ae90a028334ca42361a8a889df722bda76b4ba559a133773e8025bce59b69cb", - "d2608ef2e3e031ebe1f459cbe1d6f46a6c116d404c2f252c13275b451af65c45", - "d8964b8c4f18c5278db8ae1c8378572ae831654260ce3681f7afd5c1ba6a5d58", - "03c94a73850e337be0968dbca959a5c836028c3308f968bd31ba499c7dc3e265", - "0a45c2191bc69509c735db1ce2cd5accde186a2c64dc5a31d5057e4d2a35e3ec", - "09e97e17b0beb76418f60d7bf9bfd1a1dc89fca7a208b6e304137ac11e5ef604", - "eeb48d114e20aeb079c3ba5c78c309c97c620703fd3b93a409000b7c0286564e", - "c1930e4c21a01d4b36f74afe62c3fa0861040a33518b891a0d08bf17f24da168", - "269a783aed560af7a1b11c04018fcfad24010163b7cfbb88b60b2a5a543b8357", - "859226fadb37c2517ba6d8c762b4100228bc9e7828a791e0f59367fbf41307b9", - "351464517db586810df65fa44a6c309bd381fb1878377f171cbf840bd49ba532", - "59f44a0ac809f06dc07d112fe510580805a1489125961b278c07414643054ce4", - "70253e51e9f7b2996497ebcf39b8e3ca2c4314541f0264e521c36b4d839dfb7f", - "b3cee466b7605c0ab87abbda4cf7422b1f069d3f06c48b327b0bd1a3f1223651", - "89c5543e2084a7665709b88d49e9560a6a77dd467430fde07573fb501a6df625", - "c8b0c88f86e448bc8f1c69c377078570e0ea07809c4ed97d05c7de1a730e39f2", - "19877b97e0f5431467ae926b4bbe259825c7c6871b5c04d75e4e5de8d53ed7f8", - "8c1a8fb1bdc5b4a3fb1044c9a60a2a82f2d351ed378846fd25c08f53a050d97c", - "19ca1cdbc46335f5c5f96bacde6076f0ec210914379b735c4cfd1079f80a09fc", - "846f0187bfcf8589527b73789d6710cccf21812531ed86f9d83374d9c6efd524", - "7d24381f283c23033a26c6f5f4bb0d34d4cbc81bfc72a5504d5308cae07c0dcf", - "a13c6c3488113b8ce844807b8c97be89cdd30b77a6bc0b673d172ceaf470114b", - "c40b41c899fa2dfaa1087a195b9c6953dcf1f47618fc462c403fad02d5801d94", - "825140994da39167199de35359fabdab9a7814a19b5f1e75cc475abb01059630", - "4f99ee37e2a690a99d1a69e52d81a37bdf6611ee6b17f37018331c2bf2ecf37e", - "df87fd0583652699afd14a5c4b21bf6341deb782d73b13b2f3d128640ba1efff", - "5157cdc30fd3f2a075e7bb0a7b1646b37bed709c266a5dfbad7adbb9aaaefe1f", - "6109c77a137347d3f0f8dba9eb57a8986e9d49faa177fd157777bc5e189463d3", - "ffd0d85ea412dd637d231d425cf045ed013e93034ac0c507155a3d36b3ab9c98", - "ee90d714a9a439da53fa4a05e340ee3a4ae95747e035f65eee2d0b6148371f4a", - "129033305a360082a18e847e28e452e34f9b3ed424042b9dcd997f8e91f04ee2", - "e43ee9a3ca6272b7f3f23a6a02b0f43a36e5af46b496fc60445528b6b397732e", - "3fcd38720e13f4ecb1d2125b83e63434648aa0e44186e454923b682aacdd8014", - "c8361b1b480bbee94736090a5fa52d1b626fe51dadc5697e263834406cd76ccd", - "17fd8f8ee26ee2d5388abd80d6aea19495366742ec7363e7b9e2e157a54c1e86", - "bb45892c102de81c18dc741e401c4c5358d86f41bb688e6a75b04659d07b352d", - "f31455fa3d5893d626bdf1a7d43d2be2c57a8b9cb2d6fca353cb74b2d56202c7", - "83189655ca2f8f64534540f3802492d59f1b64906bc8c33303d01e3499b7a00b", - "1004034a44d2bdbb07f3e5e08f2f64a6e5253bca7ce51191097c252f53775628", - "c5e7e62885e108bc0f08b7e46d780fab8068a73d26e14e4ca30aecbebd6a2d48", - "8dfa2c0e55270caf83109e9d520970a02481ce91080d9ea71ccbe86e22d006b3", - "d89f0d052c540462b2bb7233e9d7421f26014d3bea31e56b9b3ec41cc65cea52", - "fd15908c0e00a53233758a0381db70151934b3fecce2dc8bce0baa6ddf443a37", - "95f0f4c5823d96251404d74b13d15784687e7bb7fc520b9fa7e9050f4b7c7f48", - "46b811d8acdafc8c9f16f27b75d5bdbd79b4020be0464c54b0941dcd93d8b180", - "8c962929b8c4d1e9aa7e35a8b2cbaa14a5b1da43ab07925b31abf4404b1a4fc9", - "2074cef8b489ecd8205b915591310a7df9cf9588cdaed01e587a0465e41cf3c9", - "e36bb481936351b7f70d9df81b901baafd55480cf3fd964936e168f091ba8cc0", - "67339f687080a04d794bfe1959f451f43796a36f00949d388f4254d9f0fcf865", - "09160a0f649c4c868884aebea3822cc638afb61ad977b87b74abf6038f00e925", - "f009bd4296738a08f634c75eb5053916bd33b27216347c33d34d2d0df4ffe6da", - "917cdfa264b471c48b1e21bf14bb0f64ff040670dc61710729f2255658e903d7", - "e01bfd15931a449c5876fdc4aa559dc946646577b993370b8a544a6d39631d50", - "2769922aa81cfc804f518c331b95a2165a14b3d5449a2460aacb67270811b809", - "9feeb92aa981c41717934674bc8a6ca7d911623dc190861adf3b08d67d82639a", - "3f31889971d484d8584a23f414dd9b07c6e2d89d25b44c0098acd8eced14f678", - "a9b519ed672c2dd517a923a29193cc92c078d80f802cb88b84cd3bd92c3edbb9", - "47b611020cb24f4da9c9b6d0684ffebc47732e27f1674eb4ba13e57fd70eb16c", - "543f406d029105d0ff2673a3657dedce700838ee239df3a7bea1a0a17a0981f7", - "9fe07ecbdbae23e7edd26b459734606b7624036420d6eabde873d314180d837f", - "a2e58dc1e60e067ee80606bcfc390d27d69bbc3c9f89734bad414f7582e074ee", - "78e1f1a19590ceb417ca5c1d1b410da9979e11de33d5a9b990f3832412218bc2", - "14f76fd3ab7a59f0483b26829b496694422bc96795779eb075a0786833010d6a", - "98a30d440c0ea2745bded4b78dc3c409061ba6a5c5b3ab0a1682637644fadaa8", - "691f971cb44faa1f26ebf42a38b055d88d9292215082e3effe2c1fd07080f37f", - "cbe24ef6b64c3368148290f6bcc3d701cd1e3ca94e5936084e10fcb5c65d62e9", - "11ac9529cc5b55bca1609453e4130a652dc7a439fa0d29d8d81e2097529f8148", - "dbc3f4fda5f42ca775410b44dcdbf7f56245da910194a410bc871149c8a47c2f", - "a97c3001d0efe237f1009aa7b770dcc4ebd07393b701faf0bf0af1b303fa4705", - "c71d40c517e8a516ec4f8506b381989510dcaab75d280242a01fc019f63fdd62", - "9730d260af660c088883c8eac254859c3611c41b97d061f18730aca8f4146820", - "261ffec88f122f5112cfb294f82942d79294c390acf7f5d401656c6c9f30b7ec", - "db386f79735bdd7e69972f6aeddd2c0a3776afcf1618a5ec6a73b72023da0404", - "75127898fc565f41ad8d338f755b632bd1915e5a87276b64f5088cd2cd4b30f4", - "31233b99e2699d8e1f919780791854159a569493a34b2982d2f93792d72597d3", - "0cd42e0bd46f0e47433e8c83d2f9d3be0f094f15517690ed684cf234fd0c07e3", - "7172400117e3931c9aea25c1b839476406961bc7a2c44d7e16da35efa915ba7a", - "a324f5986f0c248c1287365786a54c96fd8032e5a6f45e8f6385ef751d96600e", - "207d78c69d34e0d76a3dee9ad6170aa31bbb49595201a3d7a82e72496e27ea3a", - "a25122f100333707697a3a20227f3de5e2ff703e2dd24e40c6b89eb522609937", - "0c471e37cd5c0bb933fd82c860ad23158ee8defb9e968293d0775335a376eb97", - "541a5d05909468f4632edc1d6d334b1cb8218c850bbf1665620b1e8431d6c159", - "33abf4fa4c721ed731efdc82b054ec9eaab8f0d5610bd5628963a07de039436d", - "9a424fdab6edc86034aa729ed2e3d2203b1a71a1c05a953815c2f33788db5bf0", - "08366d3274d8b58ee4f32536c3c2554031458b8588e7bdcef775752222879ee8", - "a94a5c96a5e1f0cdd6eb517bd4763a3a7d9f412a755ee2bea840cf580731aaee", - "034f50a176923e8f689a988e0d1d14321ea2975f3f135aac72d032cc8600da06", - "db051a73b308244eecc58d6dba32f6939aca4902280a934b00ee010201097526", - "a740fc0063fb2c915b59d2c86df735c35b98a69eb6c2c0ee5c4a4e077f35b6e7", - "ed1067d8a5cf2e12255ac2a01578ffadb5d19da293b256327e134ab7aee61d6f", - "9ebab4e7353289b4be010766e523991dfbd716b1283c539f1a3f08eac43b850f", - "1218b361116d853c92d966105dc93dce0020a1f5525681030a4f3957b0add849", - "610fa2f8c602fdf6eb521c9c1c6f0a0101c1b2ab61d5d674f6d8bd6899406aa5", - "fee83be667550a116579a5db597ae803786fcded23032440ad6c90666de0bde8", - "2ab81556fcc84b2f31747f1cff7fe809153e50c2a44fc4aa569f6642c50b758e", - "8a8027cac4d2f2390660a4c2eb85ee57ae842b8df5df02713c951e927fb0a1eb", - "9bbebd745fc93acd49463c6b6be9e1ee57a1b070b1aca7088ee5be82ee550679", - "3f599d0d72758f76e579bac74d886de1846b3447ab999b4a416a43d1f64caeb8", - "a205650e8b104b9848420ef18ccb675df56aa35aa398ce56f77e3b43c1fb660f", - "58674d7184f60f8b9ffa67693e5ad0f7214f1c062509b4a3c58486a6b3b4b2d9", - "6918df06355e3557181e1943bf4190175e34d184ac5fb91ab487757df88ef8a8", - "a5baee4b059fddf569a186bdf38b2d349220284c6e74167ee7c610dce31a68dd", - "7a9e1419faeb3eb86f75359d19868461fe2d26a88d2886f9254e7a41dff25c60", - "17b832ca3157b8e05cdd7464fefd8fb87968dbf0392bb198e5adc30e43a70f37", - "455ee52ee7d587b2029eb871c23924bc96d98958f0a6b5a7b8a3ad2073a1522e", - "74fb80923915adf77652431b674ec1be2204024fb008bed17e864ac285986d65", - "d56b72b9b318cf368acf1ff60245e7b8ef2c883746c2e549cde10d51f26b5160", - "8d2acc61c5fb04e69096f3d1678c0167e73f7118dcc8a31908704c6148fece33", - "1abc2b9f40b7608b2e72a8228ea3fb28f937fcc752cdcf05e5ecb09d30e1d64e", - "d1c56762883227df35b487b3b7a39b7d265cf5df060058ec02308ad314697dac", - "a9e0221fcdff5e4d4c81226297a0a61d31c06b5e2f24a036ab5cf74b983e3ef1", - "3a1cd080684383f510b840b7398b7ab60404ed539ef1aedc263043b263e629ea", - "9dfea73d95b44bffcec604873a2e09736df64c5bbc5a81e76be7f2131e9f50e9", - "45a451a7a52d1a7ac5cab0a36dafb716f0933cfce729e08b84db754f065b3ce7", - "ca5ec2076069713c436f80ccb430be9e3e4a0372a1d1308a84e9e8587ac60f81", - "770ef2e1c7757989dd60b03e6305c05a023a56faf345dd99e8af7c545d33d3a7", - "b5d6da4855317c6fa5c844bf9d8b77dcaabda3be791f3a70cbb06efb22979945", - "f4e6bd7986edd6c99771b72d391978398485a33ce6feed78f6dd3f765640b60b", - "0f8a68a4476a46f41d0d2526ef279762a8c6ba1357e27cd9b64b6a0456cbdbeb", - "61dd957928bbb8c34f05348da8721b795992d1c611cfabd3103c846dfea63ca3", - "22dc78353f0549c9869df63da4a16e64001f35820981e6496db87fb8baca3265", - "6038db32c5147c02822a1874b6a6cdfc6b35d463a752e189abec080f051c6254", - "3e8b1bfb6383e81bf30f9ed7bc92a6d8ea4d0c8933b26350becdb8802bb115ed", - "8e2fdc18319d0e1a7ba9bd2e20a10c5004f2f16d5a4da500ff423701522edd83", - "d5af76ab8fb278a8ccdc9aecd54983868866c2fb6a1ef01616c1b86137a57879", - "da4b1eb1d0bd49351c8f1f254391cb8886597a7300706e93f04388037ae15be0", - "0a99b32155adf82e1df4abb4dad7bb8e5bf0c793c284b972a919a75cd2f3788e", - "8725660f80a9c6732a2c280cc790ad1a3344c768a2d19b7efcb1d72bf477636f", - "bb11c7bdcf7b0c23e8381be60272a9041613223a2077c4352dbe726181e98017", - "c35bd6d0b67cb51e2ac7d9bc30cbdd7db72403636cc7eb38681fcaf4709b69e4", - "b06c03b116aab618bbfc4f5e96b4596c38cd6a8ec0fbf709886ba78d136dcb93", - "7ec04e323be1b636fe3f201de35046d13ae5a4249d4242ed4d2258c016ee1fcc", - "2567c3bf2123d8b0e7c8de7cd9d42c42c37dc23df0dd7cacf58bba4a180bac2f", - "d8bf302100b29d0b041f62b743aecc7c0c851a471acb6705a942d1756dde168e", - "2bb6518d7a6f2364ec158113318daa28e11f5cbbc4565b17174f047f934c2bde", - "074afb19cfbb7e26c3496872b1b79fc3b4d40d362d97107bf73d2c61524d9ca7", - "914e6a80437004223102bc06bc5171c6a8bfec9f5c4bcee1852bfec4c2877d32", - "8b608c6c938eab41264f83b65bd0653a8c539e6ae839c3dcbae4f0d28f963c37", - "dadb91ae591317d7392f6bfaf70b4f43f94bed063a8546160b4dde15e3c95ed5", - "8f07a23ce2d29d8fc3989e75138314f928d963d783a0c0f08ce6c532e6e2ce0c", - "1ec8c19061347470fa6de657624e72c0e0c6e574bad623fec0a5cd6ad20cb860", - "52b3e86bc9a08db3bb6e07f49a17b7429187dd27994b369ad707a89ed26a50a4", - "ee47dc5f23affc08e361c3e59bcce3f605ea4050236789c9f51d9beb05f628f7", - "1ef4b057d9d64011ef13d31f3f8a75a7abf12a3765883dfbd33f0c5bd5f9cae7", - "a8519c132b264bdf13a985f42bd8515dd5b5851171a1137ca79b788755d5665f", - "39b836be3970951294eee5a799a7d9929a1aef388fc4492040ac5a80d1c0a314", - "1ea4dd2d408ab8176a2c4d3e94434c63a1d48aa5f58d0e9df780f43b3e06a276", - "b7eb7ff42f1074ab718a7aab8a90620b82314443b76c90fdf12501a55af942c2", - "cb33dd8959fba8d9f48accb895eadb95a23fd90dbab93cc5004fbafdb243ac96", - "e8e2034767e3f18829f856cd2b73d3baa6725e6f43be63fdf37e5e677fa0c257", - "0c0402f7629c40cd8dc3c198a339538048c30572b07907b1237135050af2a13f", - "5be369d6d8fe27bc4c1afdffb61c9b68591a2e46f9d8622c21d5ec3a98382e9e", - "5a99cd41ad686834b45f092c39655e2912d795e22314fc142c3d546ea7fd3584", - "fa841a480b886f0e2bf7d377091513ddc03e9b84dc732a836a05fd5aa671b1df", - "acac140aeb2f9e8cf8261bbf80a7cb6592e4994dbba192694f530a7e6a906399", - "172b4325d0e573067253250b376238f399d23ff8ad40cfc06846754cca7d2d3c", - "e2886ce237627739f29ca2cf820c106f0f9a9969ac2b99ec33dda32fe83cad5f", - "2998696157ac727538c09c7262a938fe228afd63dfaa4b63d2f771eccb11140f", - "889400912b020f487034a7b4a8c9f4766bb9d4b2cd120caa24be2f9ba8ccd4b1", - "f9db6e52fd9e2df2cbe509097ce9999fcef17bab5909e9176fbfe744c02c8f09", - "5f73b5f8a0501cb1a7f52e8161eea79e897e146192ca8f3e00173a6237abb4a6", - "1a1832423f853566503d8207a71e18afc1521ecba711edd0815d38a4c3e706bc", - "d02fc8ee0db0b1c9d63c17e8d819732f9bddc5c24aa31b5638100d74b5f1aed5", - "56ebd62215140d336893861c67fc503eca8507e423b31742d576b0983e5d5d7f", - "b6e5b95db613278d3ea3686745fb305c9a7000d19c8cf22b0cd932097d30a81e", - "b0029ae0cfa24f071703e76bd17628c672787a6edddec2777534bae6a2534585", - "0a2539387193ea00d908e92f48dffe9dbbeae9ce09076e94fdeb1bc96648221d", - "d2435c8e7511b9696d422f9c119ac59b6edfbd73d2d5c828f601772e3b2d771c", - "99c45193ac0843307ba569fd8943b3aaa6751eb4e9085b91cc40e9989d8882b9", - "3e481bba9a29efc4242178e25e9c2b35a23342d29eb7f72beee52ea48d66b706", - "e5937752d516ddba8f07ff5fd2b38f01a63329cca67502e492e4c7c084880d60", - "9bd4f66d31ea74bb377a81e4a9ce64e00b95345250289ad100da9248f7913f39", - "cb9a9ca1be57b640620eecd597ef6a64fec5f63a240fbf9871c1d30bbb756b41", - "963d0134dee077ecf0de63f2609d820b3ad0254df537234c9fd72e8eb8d1be8e", - "d4997b21c8f1e3adf832ac858fa13e0f91af19f585f3947ec123f865eda74f3d", - "4b6743ae4f70a8406c31d49b5f6117fb33ab200c2522ca679256071bb8dc2cf8", - "a7a8d5218bd3146bb54f7faa510edec9a833082596b3b805c645aaee780f0ed0", - "8479ad033753567655a78ac5269940bfce670cb65f811fb095ef76bc2c3ad1f2", - "2c6a5745f47e4f7e36994333562f4bfe4fd23bb6447918d037300848829bf111", - "0b4902fb15ddb367093c46c2b0889793789bc751471a4689595bb32397ca9521", - "2ed5616f571a2729435b9d3224417814efcd85179885cc9a871b69645fc0115a", - "8bdd4e21af678e4583811b780e1a2ceece97c1e6da08f35e1a074b655d0f8019", - "22c75e6fea47ac3905aaf9a0281cef56177fd13f5e377cc1f8bd158d1d020fc5", - "185c942ef9bb5209150e7699ca9ac7630fc816075ce66f77db6d39c71e7bf34a", - "816fa1b394802d02099449557afce08f9d727ebc3b1ae504fb414183b93fac03", - "33fb4a4ed863a6682ea6d65f9cac15cb9d89bf4b2d3ed3cb3fcd8af3c4ecb4b4", - "7c988e8ff00b77a8c70ab82e33c5587ec871bdc3f58baba1a58cc6f817feefb6", - "fbba388e040b080fa405fe6984ee7a99199cb36e59f653cc00ad5615009b4582", - "16867c79cdaec419b59c8d9e9562fb1ee017d94ce0c682718e5ef5a7cba1ea42", - "e1e88f551e9383cc907c1a12355044a20279e5cb1237f8a6ce462f62ea93b8f0", - "8a9be031c77d1ea859812b13e09c2e47a12843cda70908344003fc4bb88228e4", - "b206b1ae3925f5e3123b9b88cd3c17cb34a6cef0ca2da556eb6780475a9ee790", - "7c5ee23160eb369d772c35586c06d83c0c8e203dfdddec78dc4c26c131cce96c", - "0157f9533ecf95ce0d27ea2a2016c3b830726b47ac3842d11667a54e59af2a2e", - "e9e5b93a9d3e2e553daaaf33393d1b146b86b8daf63477414ef85d0590249eae", - "545147a4dddd52107ef401962edfc1890853cf8f48b7511b866b49a6aaba5374", - "71eb36144af6f7607972c0084cf8114a93297510f065e7aab254e4c74d1bb72b", - "ea12555f15987b9e8704afa0180c06ccc700c6da11bdc30f904b3987b22c9bd1", - "c1d953c481b342f7dbb26dc5186c03e37fa68ae0486a01805dd5590064e5b2b8", - "e6b26ec1df851f1d8720599b9c3db1155b4d462d2227b3dc321756f9a53824d7", - "1ee75871941720cf841c1b2197bda44f2babeec29e5591bd349cceb348c2d8da", - "534358d4caa5812a37dcef28a822e79d56db74b262b4c3cce9b2b108ecdac3fd", - "7dc919564e7c0c3f741f4a6a67f820ae2d8e2bb3e5cd4bb233b6ed8a80388ac3", - "92546b96c0c0c78d9c96e75fffe5bdb9922072b304f8f31af8ae045c970652aa", - "d2dfd890ad3d772cce2b180c92254dae8fca41d67649e65c9300d8453276cd76", - "51d5c59e6d3b02ada13ede892e6990dcc966a9306857467c44d638b7394382e4", - "f2a2d438c0d7c6ccfeef6f02c0a1a9fb60aa80d3a3f5770f0da0ef29bbe6b375", - "e5c3fe72cacc7dc22563675d79234a1d1f7f714648d25110d241975dca31680e", - "ee3cbf3fbd694269f926ffdbca48995c92fcb323d9c90f6b3ed98c2688b0ad25", - "b649d5face523d38f4aa0abe6d889f1778a1f45fe01a5547f52ed4496e5b2af3", - "5d182a165585ddea5abf6f38d1487261a1c357334b74ae7bbc77737bbae77e2c", - "1d60340b82d2bedb8cf5670e3a0347b7720d8e331cc7e7a3f3d52c8d65139fd9", - "a8f657dde8e1ff31933bfc004322b7eaf0dbfac294fbc1ac01c16dae04ae6d28", - "ffa977911edefb8531210988ee5eabf6a5dada659d46cc257cd008b308131484", - "3b68dec7001f0414b4a3a8d7ba09132427c3d9e291de8c94f39b2fd8184c305d", - "320875c0cac82d2a0ec2652e02bacef2055fbd030df2dba684d2d71541e5e4b9", - "c7f5602029219882d82174c06762f1cf1d89cade57e0fccca01f14e0a767ab4b", - "8d005433d251f94652afaab143079cf5ea2a6718802e6fa10c73973c8b02f3c4", - "76c010dcd6791c2ea024aae9e447ae2f7dca149820632079d7b3eee5721cc7fc", - "dc783c3b3602cb1abf5d3b71b90d411d6aa198f3a7087448036de1cbf7a3c6d4", - "613215baea13303f36090919914928694de084dc7ea664b99a19480ef8c7eee2", - "8f87fe4ac8cb10fd4be366b1232e7f862423bc150a7545bbb90c8539ae79df40", - "d82a521c496ffb60e7e4c6890253987299166a59439072cf58aa4051608f6e5e", - "dbbc73a0040be455e28b19ddf7ad5d061f88b116974406673ed3092ff858f35d", - "d69f6fc95248723cf1fe1f9cf1def1574cb7b92ada34b46bc05c1f3f0fda3f61", - "e20ffd4cca7a187ce929bd20363ad3cf3339ad28cdd9b87d9a3ac645f2c34e79", - "5742d369af9cf0d44881ef1f205ab26a37d29cb442480e625efadf8133d5eeb5", - "f10f305265193f7466d12700b9dcebfcba97c2e7517b4f7d9625fc568689fbf6", - "133c1e67c277e584e3659f592b9b7516416e5b4d66adcce630a41edff781f443", - "87a38996000010354560b9e29d34ecbb49e6e42a0678d0bdfc1bf8a3a47c6ef5", - "be813c9cc2383840bee0b3f88fef6887e3913b96042f8b84ace207bfc6c82b5b", - "2e7e4e8a9d6da2a1a87f63443213921a53be2c4b49c7a712a2f0a69b8c8726c5", - "87b5eeb1f930b78dd8eac4f5b5d8c62cca7e13ed14a2ca3a6eadc199102e56fd", - "a358de7aa06e8a595672d7f7288cbf1c0173f99d09b1614c8ee2d3ad709b22a4", - "93fa3785a8415e079eec19bd300cd80481f1b1e9b1703ce7d2aa2b481b14dfa4", - "f2ca6ae05a19a5daa7fc75451bfa5ed8577e378be969629552a20fcd6fc28321", - "cbf39ef6236e1f03726a7e85cf029975b8a411bfe08b2c1e6ffd82105ee69270", - "fed21737e5c2b323aeb797ce9ce6d2fd4891c15f6aa68944bfac813a35e065c4", - "3617cbb2d6df7ea20742c4c3df08b706299b455e523dc2d2c67b7dc2bf98f40a", - "2dd497f4727d9edb58eef81e0cb96f1836a6788ae62465d9112d2bbf8475a2bb", - "fb28dac63920c26acd21efdd0d5e3f296cdbdc9dd1d9cbe3298e782a22abf5d6", - "76c3755e7e485b02c0b9c89dcd267ec226359ba40630d49497860965e5b6f298", - "95c07a464b0bd5c2e13b947e01f8b7f83ff827e9c27f4d4ce34235d17c2e7e5a", - "72d48373bf79eb3d89fcfe9df5d3bbcf0f2f9afb6c06e4e520da9f23b962cf2e", - "ffb3af8c75f2d1372d3affc6439eddb1407aa0c863c6f3adce56597267bea065", - "a501e9773716fea9cf1aa8db0f8ab59db45893fb20516970a4a678ac4ddadc48", - "22a156919741dbc9fcd71d18c1643911e72fb1432c40b98e1791417613123d2a", - "03800ad77ffff4407b902079c5ee52fbc82e4c56fe373b68877073967798e883", - "6ad2b8d84d943a321e1cc9418e92420d13f7ac43e48cbf58064b9022787c38ce", - "a8705c288b9b242422deb6391e4af7a11c5d5e2552897f980f509138effeefdf", - "8c0c79cda8dc34397c13a3c5cdf7f71d33d20a860041d4b4803d9a9a712c92b6", - "f8641d76934b5cb8ad74d3fb9a4532c1a74a15ff7c62dd7809ff3f6ef6a6b117", - "c8d5dea9071fc77dcf5a4549dde49cc00d76d7d3677418b431bce180c6118a84", - "87981bb716d20b2c5e9a868771ab511954ff339d5a7418b6982f070bfb159ea1", - "1fb5f8ac257baf45add6274057d5f96618995f535510afcfe12f1d84322f80f9", - "9b4cb97294cb0f6a783323cf2245b7e7224fc2dd40674de64299ba8e70f97ded", - "4129c59e710930f12588a15d9e2069ab61591d58adaba8669f762e9bed6dd006", - "3d14a9235f4f5c3f4fee44c215b5fdd6a40787e78110cc06176aae8f39b43085", - "23134456fd4984776d54ab0b0d67760edaf5fab88e2ee9052cef2653fced7079", - "380dfad8da4a64bf10a79d7f2d51bf91c4687e0dc0d9741304e4ad5a6f1d1c69", - "4a627d98d4a09d7b6924f3a0b5d06c5e97fc312c8931e3c3fd09f7a396cafb8e", - "f42041660af00357226ae29f519ce21d3f018f06cb1abef3ccd9d0b81f85024a", - "8c5160e26f734ef5745b1e257cb97c00564ebc2b78890befe04949ea1f90f2cf", - "19e6ccf3f1d1cb96404520f4619db30a7fed7aacab07c5692a911aa77601b6ad", - "6d6eaca14e201022256178e6ce544afd18bab9a740c18897c912873e2e899cae", - "b97f9f42de239fe2123fd6348e3e76b7c46d07abb72a2b547ca5820e81daed24", - "2e3c309621729f4b9dfd5f5174dc83e908d8be952adc97389053ddd77401bf65", - "39132acf8b0e6ad161c39dde7c8c14d261fbde9a7a23bfd983ce1f2d7452d41d", - "e4184561da861eb285e5c3c18b08e3418063e6250c0b8e34bdda5c5eaff08e97", - "1fd998aaedecee7e9a088ff623c4cdde56313899e081286697d52066439f289b", - "23d705fa425ff72cce5706e818f04f9b37e3404508653ca959e13873b149323b", - "9864266d4815bf02f7dd0ec126fcb11b70a53821eb3007aef4805e9d22fa303a", - "7f83c1373815f70d9db4e3dc4f4407fdd3b9405ea1182a0031d580ec711ebdfb", - "d7c33e85d6b5fd130daad67d15fd8582196186303fca8d56bb85a0f2cbf68e0b", - "7c2ad7897cb2c16442d38b9d553065a2145c81215e811bf1085beb9ef925f1ea", - "62756963755bac46e1597a7719f668e37a6a6b53f975a5bac638e06232c78bfd", - "f3243435b9707645d5255fa01e2edf9988b4d567fdf6e3554986499b04ea6ef7", - "6f1b4cf8364a1d7e76d277d7583f1a04707b4f22088a7d84147fc8e840163f8d", - "84e721a28919530f93f45a47ff7b39a44c747845092e6eb17c9229a3b2cadaac", - "593bcdf1ce9c4224526236f71b377d2679c169d592c5d1f17f3150d3003018ac", - "ecc042d6432ed97f0b7760230e112255d46fb209f0ebb308903f24e201ac2f37", - "3f11c59b6da5b2e31fbb5fa71b0d1d720a425b51d52b19adddd9e3016914e880", - "c9dccdcf55931b10f23f136533615fc3aa159fd025b783baef917c8714bc9709", - "07978bef90dc9d87586e22bedb6e3ac87fab323d5f2da9c2f0cc7f8778ca68a9", - "5892766d621ebe3e4a5e62967630c4e6ff0b10115ec6fde723a856dc0d500817", - "0367a14574822e87c7c2141632347e21e0c5b1fa3938b360964e630146936c6f", - "93bf4b8da3058fa839376883372e02ec6d20a267797c8565b098d66cd68e2d21", - "9bce4288fc79d03e2d169e7bc497a8540a28b97653949864bea4f4fa6309c8af", - "22ba593fa70ec0a80ba65501b2f840170d8751ce3d33eace707973a449377195", - "0e66b3a8fdfaacd3179b3f8ec1387a7081e93808c9c56ec4c51b34af722cffc7", - "5d8891d720b492a9ef82ab519384d323b2960910539fb51b2638c00aa9e67287", - "d17fc9b47f3b765bca5bf89b2f890ca73f9dbcbcb25670d1febab0fb9cf07391", - "fc5d8e5a45431ae2cc4752777781058acc2e0d60fc2da900c02440cbe06e6350", - "80e98e7fe3cbf5f13986087302b252f94d2e0fed0ae17c3943809381c3d039d6", - "8a24623afd4b4817a3c693b461e5de68f4d08f41b1e719d509035547e6d6e1e7", - "a1c8f24b71397e76d304e4c202f014ae96294292ccd1b86f8da73995e1c2fb1a", - "a2024fdba018e91fbf9cc21822e62f730e179f7a1f041dd42f868b21e4bd4b8d", - "5f4eb19874fc2bbbff2069164a1c422b9e7fccc5a3972b61cba8bac814a4f18b", - "ab721285a258350d4dfcf70e388bdc8a9bc8c1d0664818934b74a5ef3c8f82b0", - "474fbcccfe9007f80d5d8fdb62217418bb363123a41dc37734a559c45da4b566", - "94b661e819507049cd9f6fae76eee765da2b036cba974d6d1f9cf5e2d2c79c9f", - "e6bf65bba61864444e34b8f37bd10abc01135d2a83df6e1ded3cefb8d71aa62a", - "0e2a54ebf0e890c2115e029312eed491e5454d5d2c0d998b57ed1e2e17049071", - "7b286ce64456735a4876b54a56bb90d2473179974fbe0a3f97ba398bc33a5400", - "e74fc0244bbbbea5cda897c3280c0ae73546f062cabf2b189a1736d6bbd79d77", - "6e63666cd866fc01020f1bc213fc7bcea987882d1ecf8e9688eb3600aaecfebf", - "04b39ba4f22643d70b882877c3e35604d7df980b90f72ff3eb14df0ae7a935a5", - "1e509d393a6b2a215b79ca2acb6117654567e3967cf151a48e492ee3d707866b", - "9d7542bb3526853d12724419c61388a17806ae363477325fe53ef61f1bdeb57b", - "51b7f92b8c74cd02490e4e7dc8c1ed6e8606172f72b777447b0935d0428eb38d", - "efe5a6900c4bd8be2eb58dc34d1bb6fec983b18ce159ce806da493db43dc5a08", - "856fed80fe0189e8ec2c3f2c451480afedcbae23b40ca007ae5cb64bd1bc6ad1", - "c9e998ee6d69331b9e3f048c1c2d91b523d41f8a02b8784d109c2b7188ce8577", - "c19e48e5e27dc1cb0874da3794b75820bfe67632ac0951f4063844afeaa90e81", - "69626f40e8515ba56883466256d8277e10f7371227f0ad7a42efc9d000f77be2", - "4135e2cf30071276f4cde467997a3d44c36f0f4780c1892c570bc6da917c9ebc", - "e685773f5987701a90b7d3382c0b3338af959b716a11e1ac9171ff74f56b9203", - "73cd14493ea7501183d8e88ca46bebf931b508f415cfa047fd52467093cbb8be", - "9bc8290239bd6ece23ab87aaf3bf316e4e0f92f37f8584c5709b5bc01119d568", - "188473402882eb51a57a266df1209c002013f9f59617819428e9b9b577b98532", - "36fbc98e74517c947d0bc5e882511569d21f71f78fa35652ebafb2dae56884a0", - "cae0c598ccbcde71196a9421a36e31c99235b174fe39ca7aa7ac5c61544e002c", - "d28814de49f51d27f4ed5797896158b15f9dea6cfc58abfb200ab9bedb2cdefa", - "dd4a8ef34bc75d840136a81136a883edfacfe3e57dfddab2093698d8f3ad6109", - "60dcac47a28ffa575478802552945122e138e59775d6fe94b982637fbb47714e", - "4fc4e5cf7b98c3e93a807b84572ee73136e0b874b6401ae6e9b30fc8127b6262", - "e103916f12f0edde18b07c754160d1427d68b867d1a84263f65e93a183a3b505", - "59ed2c21d982ea0a153706d2a12818f67d04258f29bb082f008ab80b3b6c048a", - "75f673624fb0728094bbc5ed208aa7695247a76048282616953860cbc3b7f6fc", - "b4992ca8cad0d24926dacec50f3e294b8ea10ab631a4a1c5b1770b16b2dd57c4", - "6884d1df3b3aa6f25db89db97e98b4719fde3e02b928b36f2b83f3105da10eac", - "cc554cf1c660e576430bb0b1104ddb992e2bc1f8719d71104c6a29e5eb9b471b", - "9bf319f26ef550115f91cbd99fbe1cf7b11f664a1d71774e952f2548e966c1cb", - "14449601357d50c66c65359f2bd79a387f70317dfad8d8a3e6b04dff533019d4", - "9d9d65bd27ad903bc30fdce6c1bff10dcb62729310e2ca81c4ce8329130b5440", - "7bff2ab4ed3dd4e356f7177ee32f9e2f1af720382922d2d0c3b1901975c999e4", - "36b2a8b8d9d4f200b95872a0c30a923af36a22d4113aa3414e97a59fdc346302", - "5c2ed58559ac788d35075249d36cf702cfeb53bc74fde1e64ec95169298bd53f", - "651af67d6b27b44232511477849e052a3c62c11cb5728fa69336ec6869b046f6", - "2ce4ce4f77232228523b9cd0a30f012a4ec0fd252ec781dbeedc4a2740a479d3", - "c9c9582b0ac72e624bd314dc632a889d63bf0a64f6ca5e1449da7161def51d59", - "02e222300ce720abcfacd7e2011f173c640f4c2adaa5ea4a0ff3f4a7005784fe", - "786bd5e56e4ae5117a4998e1d09dc9d8f21eef02aada8e775d4f94a7793048bb", - "a47b176caf37546b216fbc3bad53e41efc14013a82cf42e5f4d36bd2f132a4c1", - "0b7c0433846be76b3bd906171925ca77eef6759622004757b5efd546fd783088", - "3b4107f8e6ab08488f1d60d627fdcab6efb01575e3ba1303e9db2ff20c2a1aca", - "15f8f0d5c63f91fa439015a630f7f9bbf624c0ca20aa8b2c3663e0833884563e", - "a0e226f43e9caf8fa950e043082acdc43effb001f0903ee6b508701f67dbb742", - "8205d974264a2728623b768824f22b6169a454220ab180c33b46d4f6f42c342d", - "f6ad42ae7977dc70be96e5253b35a26f87fbd1be94a2ca81645e97c699311740", - "68e0740c2e4ebb9f61949b41641cd76f2a65b198c629a4e0fcac2d9fffb7b9a5", - "deb8c1718ab70b4b5fbfa11b30156d0617014d608a49ed81e3ba60f8446d4546", - "01b0f0aa60ce1f0aa1d61c2eb16e0db964997bf6399ad814e13eabbd330f50b0", - "021a3507b9d0c5a54136b1494d56c7d2efd2208511236f94746f79dea750ad79", - "df661d6fd8f20547942748b18da0115521701807828bb88a166f1090952d1e9c", - "e5c1b10cbed043135168cf4f71f2b4f16afb717ff355d50c36fc2e647f0e4f3c", - "63f627ed7f86960c62149cb3ed7b607c10cc70af5192103ee1c0ae8d30883571", - "a6e293e66a35fde8c2f491f01425dff5ea71dcec15f02cb4b4ae6f7ad941cae7", - "ece29413427e0590cb645f136bd51d9f3ec8bee106bddc45772982c82e36053c", - "65654e6826865a102344e1c1e269a450a6c2601fbc2241cf90d110a69caa6224", - "1bc88058d44e042972c633bdd8039d5d31b9252e0e73ef5b3de8ab6df8c0df19", - "c36618f6e1e41f8864bbd4234448d1d1f30bae8483c1ee8db3d0213a408bca9a", - "047b3a1c34cb460624590346125ad46edd7adbd5ee413a4991bed6b618f84176", - "7f56287005f9522b84023f456eadef8d738156e1e245616d7f09d912cff8aeb5", - "cfd2b2533c55ab0878e5af55e4a905584e9dd4b927420a0f1ce6e4fc6cf7428e", - "b79eddfd2c10d0d5ab394ff7bed1dced09851d254f9d911ab48e1bb12e9b9e48", - "0626d8e03cdca50bb10ce0dca5c741db1d8818ff69c315a7a324995cf874e406", - "ef2e85bc96599d33ae8007f66054118cd0b13649837d0c9b4eb6a9bcc0bf6efc", - "74401be987f40d04aa55acd0048d65a5c352a7107adb31c85ed4e1865be45ae3", - "ec2f3a592cfb17a64020b487a1c20b7872e4b32426f842d06a281a0f01c9dfe3", - "5d81e6c83ddc46436dccfa96ef67f2d85c4cdba6a809aefe0aacbf3f31f254d8", - "43e640c903522d0d62b6e01c842040a3b2cf39273e93b452867d433c8c460e98", - "c619111eea39f19a23aa8d3cc9d1c20423d78293a89a823d321aa1e26c4c5ab1", - "6f11a58b751e2de03f22c2c2a7c97295bb9a8e38051110506f2f6b6ca46dd60b", - "34f91bd6ed31c9c24890dea76146767c94d403ecbc6008c0dcbef3db51c7c7ec", - "f7699e94a7d81c1987a9b16ef89baf2906d4f625b89910cbd8c4af113d44e37a", - "38571ee1111fdcc1dc3f22489e45ea590e858886e841af2db3b9eade7fb4dec7", - "f1e416dc625368652ca65a3a146a5edeb0ed56c03ca0683420b8bbba497d19d6", - "16cc8d7448fb1186ecd4913a99cf5d30016f369fc5dd58f951120370ed4a6cb3", - "37880383249779f61095d6e6c0d9e10dcef507b34a149bd5aeee29dd8292b717", - "07f002fcd36885eaec6f8db3c752be718ff4293cdc2dca39ce8721041459afe9", - "5c888dd710470356f2f7ac7495c5189905e5802515c9bc3620a6a8e5ffdc4798", - "58c56a8beb2797170f6b5dc272229afbcf5fda06afa2c3e55919685bcdba97a9", - "050f0c4eae1a1223f892cf2d56844db596287e15663370213e2a57f3875edfc7", - "62cfaf8d5783959655337274b934301a8455b5e6c5e91368f008866e6e32c400", - "0b2bbcecae62d90b3b60b219bf5371336ad09389f38eb1ee503b18a9879f005d", - "5625e09ef78dff1d6a6f61007377e7be871434e0729b3b5c881f1c0348496f90", - "b16559ffbfeac4094598cd6cb8c97ab31a0a5bd84e6475e241b6385a06262a47", - "e47a41ba60e26b1dec1b6f377828fb0025a91e0b5626baad1ab4b4bbe6423722", - "c4dac59fd9a2762323d2d99f774ac10e7398598b004d4d3e70592198f0080654", - "21a56b908b87fab8786767b1bd6f6465f59aa47a68338323e94b211278f9a0ea", - "e20c43ae7dd4e3090ea2822be1060da15cf2fb12adf8937cc726e8acc97b5ab8", - "aa1be15b9d351469c27e20c65e5794678c61cd6087d416241253186c8357c40a", - "0d8a85a2289d21b23a203d141af6227db726898f0bdac9729fd0cc95820068df", - "506f57df02b348f7f1036feb0495b37fe53e5887563f734b2c2565b22178bd71", - "5f3b75e49c0bcba09f501541c69ff1f6e49ca80e4ba7e3bb2b7aa9930ce7bf52", - "2f00ef9c07ff7388701f7c1d0432582caa63bcfc1b4156cb214deb9d91fee44d", - "212fe2ac5b33472435a60cb13e6d8675746f457eda5a76f87c3a56206776781e", - "e3802c48f171aa28c161a5a6e78f92e763a93e102f5d19602698d9497dbb22f9", - "8fc556d66ede21b13ee927dfc02aea82c9ceba3d7d67d50505eeaafcfdc6b168", - "93da7cba05f2b21f2f39274a889fdfcd2ab77367acb6edddf405b705b575ee10", - "87cbd1b2d5001aabdc79179aa6c43066024675593245f1baa585b3e7ec4ee991", - "1edf53a8b3ccde5f91868acc90885d0b73d3921186b7adb3829bc793ee17d9f1", - "b439a9ad30cfefad8915941daf1b697c9c73678d7ee755d88342e73392336398", - "156f019a35144070c7241d25ce2114effe3edc4a374b459538d812478572fa50", - "4a3fb85bbab7dc5028752fae4a6ea6a190a15ed7d7071341e3e2f9c757da178a", - "57656875ee2e31d6b22de19f382fc9c8e1d4e1b69049c58994b7c60fc62708cd", - "837691cefb672d3ea25f64ce0e103ac993cbd558a197d0e2e62ae3340c1d1c6b", - "db5296644408ab1fc1b48ab53db4519cf314af83895b52837522b1ff47ca1982", - "dec9abbbe709995f4e2dd108e74dc85063383fa285a71a658982beac08be3750", - "f100c2ead8944d8cb62eed67bbdae88756af6035eb8ace281022334ad55ac31f", - "bd2841efb1fa883a84db84f8e4aa4bdcb22ccb369eb51f07706ce0ab42e5e991", - "5bf3329b1762e43970022c0eba7513a9eb0ef4db4bd5d196258149384060d75d", - "420250205c4e0627ef214978980f6b69e12ae506ccfb31ce83e25437199d7795", - "53e69e711fdd539788af9dd7d8807567860672ff1d7a7ac3b4af8afbc2e54d84", - "cdccd6930b5d20cf2a335041df3f1655dffdcafa98a52cce9b8c4dec71febd17", - "1418f94f7c6aff1626b43275c4f93670cbb3413394067f6d2895fb3708b1d1be", - "15af43528dae39673778cc344f44aa84e8ae546de9d0b08675fa11743bfc0576", - "a982b8b59a8d31b10214a89d6e13efe53f4612e8e0ed15eb0ed1b5c67974eb65", - "4720f6165e8ddb6ff748e2223618e0c5c0c9651a03942d1ed3484819c8fbeca9", - "2e9f7dbfaf3406427d48742ae6f7c14a85fe025a15fa3e03a5b6293ba3bc4f98", - "d560283e1000dfa17d6ae999d3e6641e0942955625d3856d27785557ae8afe6f", - "79335b4d0ae5d8403b0d59b7b763836dfe7ad1065f7d82ecdea909111d47ec28", - "39c75ddb7ce28cd1400b71b6fafdb69ddabe996989bd08e4cf57b3a2504b5b7c", - "1b4022383d61c339d05daacd865d64cee38bbdcd7ff5641eab17cd6e9a612ae6", - "f626b7afddd5fa7aed8a6ab874751d4c0e2280375b5377d4092a0f21de46f642", - "6db1c6505f765cd9023c9bc43fcfc16bf392a03977eba2f7bb02d6c4d683bfa9", - "5b34c68c55e055fc93ab1d8c11c1ed6db243c663f075a8a98e8e20d0d0c78a5f", - "23e9d0c50d838e2cfc1b9c73a9162b5e7b771fa49ea04f783ba94a4162163400", - "bce0dbdaed891ced4c896f118ae43ab08218b1ce42f649e0a34fd27164d2ddc0", - "3a89619ce0ad21c9be7b2bb22cc2187becde4995730720f4fc1bf7d31f34b1a1", - "4f870d61bb4afb956672098d29df7a1881728565beb277cf18fd0140f328bbbf", - "b1401c62982ac4af0b103211e9546a4b997bdc033726f078962bfd7486da12d7", - "b3e559270b1133c8e0c496fe98b8528c609d4e27484e211bdf49f121314a924a", - "018656cd294d639b494dac5a93f28bfa83c9510b83f16a456e7deb52cc46eca1", - "619a8c0eaea8fc890ac0a0c14908a5c570f3cbdb531bd3c62967762edffe782d", - "4f724bbdc5bfefec6edc889219f387b5c01a6a358aef5c73b20457dc2057d4ff", - "8d343c43b75345b04f32136817d51ca68288c9d5806891aefd3b432ebbcf6577", - "7d3f7fe8bd96df283717aa48b10c7f279d28e8bb8ad198aee8598ddd91576aef", - "a3587bf0cd3b13e62cbcf170fd46f6cddbbb910395766d3694e7517a8138a201", - "689611cdfe1f187e5fcc773cf40963a95389ba3061a5240085e548946587ce3d", - "25a722cd57ddb72bd7563ee8da62f11b3c3a152182390b53e7beb194fbb146eb", - "28db9ae222787684698aba4b632104945f93610299c6bbc074c1c1dfe6e2d87b", - "b737dbc53f6ff96cf41ee655ae6a5fff1d7080d7c1a3b297f06d813f82b76c3e", - "ebf677d9b87f53a0e8317c39d08534fb1deeaf27076aeb56de1b32b531315241", - "7a5e69eeec7f8262b8995bb128b35ea0b81c33ec64443c19b84ac671450b0340", - "2931ed3a88ab50a176073c588651564ffbeaa16c2e3752942ef190f1d58cf6f4", - "38c5b8918e4cbafff87c7d7b3963a7da40ce26fbe9dac8e61e0d38c8c4efb6a1", - "0d26fd723458efafd52266a90ed545013e7dbe1289fa5e8b08d5a62879705424", - "171c6dc8a6a0f9f47ee7e357be3ea1c8d117e84c2d575cd29bf239bd211a34e4", - "5e5f7c1f37e91807f52cefab17d374e3b56e6dd93b1d8b06a33cf0dab8a944d3", - "afd398daa56bd2d854ae1768c8a216c2a9a131c0b4e2a1030ad70057d1e89934", - "099f485953911bf1aa33aae6c3060ac3fb7ed40d2466de2371584570ef829cfd", - "ef5e5dbded03db55af47f42d3fd6888f46478cff604620f432caf15897989fd0", - "6e681161a0d819032358dbbed32b4f9cd196b6034a051022276252b0961d1884", - "a6a0736ad4ea1591a0505be2d047032b442ebb5aabbbb113598f04e5bb1927a6", - "9201431d0f4fb7c2aed17070863aed3fdd275fce2e68c2dd864eac980410e8fa", - "1d186f6b13a953069bfe4330c4f21ed8e8371fce70ee9768757d7e2c1a778c18", - "4dbb0cc873161aa97560db6f10a47bdb988d8ae376bdd91a5ad9790b8ca47b6e", - "3076a1bbb99ad9cd8d7c43ab775966a9d46efe7704623bf9fc5933824a637990", - "42a5bbfcb239f4197474fb090d179325545eb770ce24fda0763340cc11f66e6b", - "52089fc3fca3565a6f4629098270490d48f58ca242357dae17e905f8897b7ac1", - "c12adcf447159b00c8598edce356420b4c1d79be0ac749a2721271450e183cee", - "2f5f4e4ae2b5743de766bef986c0f03ea46d9123228ded05a042811e624c0ba0", - "a8230a58fc32272fef7fd27be43613011ebe02af4f3086929948e47acda31106", - "b9368383062726305be611ef3a48a9866bc9101879281cfe00f4edfd58e5ecca", - "bb51f220d66cc1848676a1f3a065e495963b815b49b1d40d42b3d99f0fc5afeb", - "9e318e32aa4f99bdb3b4f7188c37437f4bd07d39e9c5e5175228a9810b3ede8d", - "629f58e9ed99cad7ff408512777b2f4313431ce9788e0dfb4e00ef9351f9cd28", - "8e84436e191c5415dc3d16478df3295e7064a6239f8da44aaf32a0181fdf9210", - "6b8a1ef3d4176e243a4eb8d60fda636c26642524d8d2e6470d73e3adcc745203", - "88b15b35140269c5050459ecb2873641a1dcda8fa305d67ee2df8084650344e7", - "a21a811bb0399288d1c6ce9d2e37ee36fc84b531496cdf69fe1f4fb869f85cbd", - "264254fd3ea427e87c8cbcb89f4f68cf57dac7f470f5282e05b2d89b3884610c", - "fb381497f646a875d240ab0ee7309d965f47621963b9487d15f6169c1226c892", - "6053995383954d8af360b002294a58b6d8b607836419411a377118e33eb5cfab", - "4ab5ae4712c3d981655102235f096939e1a57f5a35b3c534829e59a5f60faa59", - "17e02d7922838286b37091e10eaa1f02bc0f6b474c55086dd783664deb3321af", - "3b69e4e6937e44aec1e2c5063002bd47bdab35adec57d84bccaf525c84f68cb0", - "02d29a0d07ba0b78fc008b4b994e0fdd025860f7c6f537fa1616d267f4e21ebf", - "a937410e05499d444bbf090e3d9fabae2c1df83ad02d292c3da680ceb8c5028c", - "24ae2597ab797c1363f20ff2705417aba70fcf23286e110eaf10f0564958d72d", - "9081e8fc3bd5388ca0b3a78b1c68a729a7abc6cf7952cbd65ff2bce54541a6a8", - "06e0bf87ebed650f2d7e027756bca31cf6a2a68d78b3585a70b8af4cf6ff1bda", - "d95ee0f3a4c99a1e38bb34642ee2dd78307a6602a9da056adead6789eff54c1b", - "88acff95472d1c4bab0221e47f548de4712cc268c2d8eb96f24ce700019a5663", - "af13b692b857e104d5dd247f4641172d7f0b58d0bf057b3590db69398e76def9", - "32c04a3d845b5f3b40533618481bb432977e6b9522cdccc395b3a5021bdad802", - "325040e4faabb4e230f06d26a6cd05140cadfbbb56c3c268a113c02058e51d26", - "d281352a34c1777f4378302b4221dc7be364e1002a3cfb6554bb238ac83259fd", - "2b55c4586bb7995ee23d84efe6b387fae76c4d5747efc8595ac7d228c722fa1f", - "a59bc3d14b6e1cd78aac57a1a7b627a400c250b303f0e987ee839eee12144614", - "27462ade784faf9c07ea12de2f31d82ee3b6445216950730906beae8898ec636", - "cf5964e2ae4e3c9327766b462006efb3abfdde2aa18a9fc2db85b54995ecb1f0", - "b66a298e39eb2e259b72618d21739429f1281e439175089e0aca418e833572fb", - "553d14dee4124ed27bf3d3ee9fa457588b226c11cfd419d0077eb61a74eb28a2", - "f0d12c883e854235f85215f906fb391271f9e3b0c01d5c28a67aa0822f635b9d", - "bb66f249758980674f4a2f81cc0908ada274036b1bb3636e5039cd38ee94282d", - "e1502ba0c1c3a4b4dfd050c399d898b24d09ab1110485175b734db56afa2f5b2", - "848d8c79cc884abe67e68c2f6f0d8c1136b7fb52516d10fa89365ea78c3c5f5a", - "58b608ef807ab553a0dbcf02c30237e93f9220401fffe2c8d93a1fa5a5fccb24", - "25a31837a295eda6157ee3ae528117dc0d0b938fe3e62132e29365bdc8df47df", - "7a149d797379e8161addfc038ee312393fbdcb40f6430fb819ca4f0ade1e691c", - "2a11f68872905586cf3f3ea2c83d93639d6b28da8daf01dcb79282db89d1981d", - "63b7c7bd156fcadd6888e9809363480231b48e96db471eee7d7380f663dc7732", - "33f5b707faec6c6f0f4631ca4879fa8d8b6d49982c90ec100e99dd969879f30b", - "c2dfb20ccf4b25eb0cc2871b95cd432a143e15defd1bc8f40781f1a7c77fb1e7", - "cc69143fd48f1b4c0dd638c47c287ce8739b35eaafe0e9eb0a869819e3409b17", - "b8086dc80e6bb28a89f7f48118785131ecc16e3c2256c48714c3a74d27d02f36", - "f84003f401f2a23eee3f9a767810ac96405840a0e70c1c6166817fe64921065e", - "c700e0f21306eb31c9ae5dd9d587b5bc8a0d0c4aa45d851f6df6793a16de1e83", - "2f9fa9a7f428840f7bbc4a15d9277f283556d0a158d95b13134fd7b6ff5976ec", - "5ac87be49d0c6aec91990b552eccbebfb6457b669b402348d3d23f835b37e0bc", - "adeb25a35a281d846ca958a26a6d65da03822d70e039c13ac46348efca471e80", - "2157c6551f051642d3f58d230891896be113a159641350b02586cf3afbb565f3", - "beee9b26d7e27ad0d8eab95ec9070661ee8a8806d7d5a6931c6a72f9f63566f5", - "8a199e05cdd29756a7b19e9174e0bab4f34a07ff25b2f9fdd70bf1d04393ec56", - "1ba43ec12bea7be59e3355c081e1ab9a898af6dedc42cca75675195811b4d2bf", - "e901d25bee999b678d9abad424a09a29cdc2022bf30d31dfac92766debfb8206", - "c662d0495ff7644fe40ff72c1763a93ad0aee6a02efddab8928b42659f4ab728", - "3d9065a6f275a55a7f7ae21c469f8fcf77005f261735c40f3fe6a31e879aa6d5", - "54c97a222dbb77c97f37a7997fa46aa5595e3db25162b22c858212277fad7afa", - "c42eb70df8a61066ded28893c4df8a7e5fb6637a2b738bb83ae09f69ea27fb50", - "d2ad7290786ba70d9dd7a8f139b7b15dfb19f43950ad2317d3967ff656ee1f31", - "a7d8f28d063b1cfcffaac42391eec09c07f6ae9e937562feb43bb9e28f9ae231", - "61f1471866d5b54e08ea5436d3a2ecc1c96277b0148101c4ad080323fe30227e", - "43b2d8e146f8f3c2b6d4cc98aebe6f70c645e1958a1509d98435303c6ee7af13", - "9f22bcf49dd9862e9ec7cfdbb5c595b21a4ae39695daec641a0f343de201dc17", - "568e73e7311b1b1c61d3bd75173401e54e390182c2f09454807f83ca3b5f5e58", - "a16ce12b652ab5bf8ad5496bd9ecfc3df44d4fbc71b295ae21d94177ef5688ca", - "80b55384b1eb081ffbb42f2dc8f49b534ed5dd15b022188879dc4b55bc6b308f", - "7141ee5a8a69550cc9583552d6afdc3b06204988c375b88add0eea31bcaac9a7", - "28975fd7ab84263437a4bc1cec26175275f5ecf7f48f27c2a8211381965e50b0", - "9e3fc79a9c1697a4eb6296693a841a3deb6a21ef1437b7c247de23bbbd253f08", - "edadf53c0f6af7fcb4af2d09c8caeaa9fbdf73aa5430a37ba03a2eb1a81da1b4", - "2fb83c1719e71c4569c60dea5404df8686835402725e0a8a8745983bda72f9be", - "5471c6deff960fd3db926206ee9ab6eb9df853b20d785c790c11cf6d20251e69", - "71f43b52ee3f55081b2211c1c917c2be690131fcc03626a2289149d68dba7a3c", - "c00618ffc6806ef3045c578f13d6ea424e14ecf9a5af5d4710e175952511c3eb", - "f412d3ec584054a836633b8b7eced9ee4ba3a12a0c5e6235036763841345efa5", - "186547cb41b4ee4b8893ec85b465b1d6578cd7683e0cf5f3e43b46358919cfbe", - "9b6ccfd76ed3fa96a4d859f8f5bc59d2fa8e98f521fb152c4859aa93c5f00a69", - "c44f61ff8a62a2b57ba38c1f97911a9695287f3920d1e7d3ecd52b7fae77a75c", - "3fe1ac37b2ce77810127bb43463dd471a5ca88bceeb18ef9ae929e38afe35e90", - "6433fc2623f5bac72ecf354e1be26a88ed9ca6fe7b8f6821e3b01c1163c2afb7", - "63608c6318eaabc6d046af75b48b3d69c05a8d7434ff7ff1fc6774b28711e01e", - "f0e74673a5bf32ea12f8d1e8a62f1c90dc60bd07ab5f4232eac81e11d2dd7b5d", - "b378db4cd935a3dec83a18ddb1099674f58d6bc82ce47d1569aa52c8cf6c36fa", - "4c495889763f664c200cbd7735cead437bd3a2392b6239cc37c29907d791693a", - "ca35dffdb68692b1b5de494d45847dc678a0e904ca7536301cfccb148b077898", - "5dee74f33fa5c16e8b64f3c0cd75fc40be16b5a10ddc764942092dbec0d463d3", - "fc700e07ee61107637705f0b57d61a913d7edaf661c69556608a0269d44a802e", - "c716a157615a34b4770bb0464c26094d765cc03f43fc5a0de07352425a1e6804", - "4c552e25a946256bf3b47948329f3359a3115ea8c14da859606d3bca932848ce", - "58281ac05166e3ca4d5365863bb05e12366d05712b6c8e8f31e55d00cd347db8", - "ae12d17da9552fdfe86cec27399b78d3d57f7e0c0c018b5a9d7e8b2e0eb342eb", - "1e4a4c5902a713ee4947a04ca59d7c313f0dc051b2d9316f46c582ec42a9c4c4", - "2c48ef4594f3b8926930e51a93ece0ebb257f1c030c82c9a90e6f955c2845a4b", - "ebe1e28237c7ee02d32d5a4ee487994a957b0a6c6b16e317aaef9ce2a13a9d24", - "ca6f2d9d35dec7829f724ed1562258e2ec75b66b7677f9f503c1f69dd1f500af", - "6e45df04f965b2f821de4d06d01f06e150bf81c59972ab08d0a39e0393050089", - "f72d391b318a9af5f8adfa6b47ff74b8a18cf8eabd1e18b6813b1fba10513d4e", - "746ea8ce5faa529d9146b71999ad344c32b013b0bd7b180e77f8bd82f63bbfcf", - "7d1678632076a8747143166c5c4f3370f85bdf5ea92bf4f3e6a7a8fbf2f254f3", - "53f85e958a8d3901f46b9eff072acaae0d3748f133b3b1f4dc9fbc1c13ed24f2", - "4b0094fdd9a55d709badabfa912829faa602052aa19022fec2ab464bc505330f", - "07278122bc9cba0e2f33b52ab006b3b97eccae3d02d461957cbe077588077ecb", - "55d0bdf0f80f561ee964baabfece1f34b3ccddbf998778011696e02ee71850d9", - "b64bbd87c42ea2d5af6377028376518a6d74d53ed312b7678b5d13adac6c1014", - "392da3eaae4f5f0339a76b9a82be89f17fd52fc9bb3bbe7235b1f895c311bb3e", - "d17654ac549eeb7ca7508cdf2cd46afe36b013fcc639a5b6bddd9f033581e19c", - "03a6c2e939dc4d8625c0909cc41faf4688ef7157fc33969e5bf7d710f1029c89", - "1c8c5696e7d8050b371699998cdb213f56442a280147ee37e1714d55603609d8", - "579d8162108d72e9cfd73f5a80def21085231b2ff01905b5fc1dc93e00d02b57", - "41ee4fce76f169ac0221625b1b14c2acaae29da4aac3e365382315e46257659d", - "3141ec9fc2004f7a8503d447def93ac6be3c46cc37b3651003fd1f3e6019ff83", - "7b9be447226de59c76e390ebfa160469b16663fa9635c28d99b764ea8a14b259", - "2694bd5f9825d8c9d3c5904e6dddc03651c72f1d12d3326162ef044dd13daa29", - "56e5abe539d7ea0dfbcd04ed6383ca38f2a0add4218dc56b3b7a12de188b724e", - "4d4a09aebd244e4488b053c7d82cd0970d8c2dc93ffeddb84063f41a58cf9e68", - "4929efe0ad57c9436d66fe3df25ecd2d5ea3e73619fce1bb641824abcf090b58", - "37063e233f4c76693eef7f9cce878690bd99cef7847f042b30250a6e304656ed", - "53d94afa3777d37c667e3b2612102c6c3bf2067246d79c27a572844c4d0daf43", - "169299b9284bf10510ac3d34b3f7810c7c65cac2e527ac6724ad79cebb57b25f", - "c344524991fa688d20ee55e3ccd3faa3a617fc668153cccc0bbe80bd74eee5d6", - "c1d8f3f52a88f66d2b7e8dbc41ef14d5a352ae9d010f931b3f87b94852e8ddae", - "bfeed81f0623e5dcc22909cd28cc0b56db4494051ae5a6d742530b84871ae5e0", - "ccab32b104d6210347b07a19b3b6171f1a62bff7d4b6a2679276f1cecbeb966c", - "21857e2e4cc8432e773e240f3b3b8b2a9ad6d7341be8b478513b9a232d71336d", - "4cc50f2586485492a2b9bdae128256a66bcdcaa1d5a52f8916ddb3d585b88907", - "37d14d61ec6c521c15198ea75ae5626307c42e81c230fd04d589ef3ad57c7f0e", - "b1c662994ed1e1fd03c6f56af35f4e897ee80a3fb035acc809513fc76f2b1339", - "5ad3a485182c1b508c65be76a6a9ae1c46c507aae0c3b440d1587700d3f413bd", - "3025f56b16d79e73aef62f8994799a433bfd962fbce1f249824f3194211dd7dd", - "fa12d613d9e51e12f95737f5a0e072c8ceadd6bb5c7b2836c737389615a96ecc", - "b2ec554db0e36477a7eba00c5a22ccf5a6632b1b04e1d809698dade651697c3e", - "9e719d50cc7ccb0db785f38d3df4d246cf51ea655c9467990c656cde8c99532f", - "638f94d4d80334a003e44ba69f62c1b21c78b83e0190068d6947b03a74499778", - "49265c942bc6addd3bb3948051f17d71349cedbfee90ad1174d666ec5fdc766f", - "c88d9d60d2a85a2eb88cfc4a9f1256ee620e13b8fdc766d7c0be0ef86f04ed97", - "3b97d8a00c48d5898ae6a608f6cfb4a5df281cdcdd411381815a9028506f3a8c", - "64204fd5ed0c9872490971f2aceff62aeee3005eaeb74c494df3f51fb86543d0", - "a915fdf5cb3c0c48b33d8375cea45adcb00bc5f5bb440f760c44f5fa63c362e3", - "d1f47e67adf40835bbec5cb7344bbc2d42b0fa80a4b74e3a934d30c1ffabdc5b", - "f99835dc2ec1f652558512692244d378fe68bb70675969a80393fab0e8dec06c", - "a34605b9f0e2ac2fb8464452a4d3e75dbbad833908ff95c8b9928443eca76762", - "be0e9574fde2b4162e1aae75228fffa776645009fd2e49f9f26dae556920c6db", - "57168c4603ea8b6f1849425dbeeef2674cfaf4ab72befe8c3f148f8bc5fc1cf3", - "9c7482eb44198aeecdb99fcf27ea74f53087780504e6404d45ca4aeea47bb12a", - "aa172ae7e9af1f653012e8614ccffd42fdc778bd376d5d59c284b2b9ed4a5f69", - "f2b92f992ad4ea26b14bfdbdcc61d459d86378c88456996ba1c138075547e628", - "06ce7be1115950c58ea1039571a21f9f0801b31fbdb3c142f805582b4ae440ab", - "2acd55ac962ca77d89eea7c52b93ab0d46addac6e50c12b4d94933e04ac879b2", - "e8a24d42319243db92f3f61531f6405de15ca36542556c635c3f0ee56f992610", - "7277ee763228c03cb64d940111e42eb113599649bf35a70c877035a696fb9893", - "feb6c4ed158c239facd2a342dee0a4a14ce4f9b7d96ef1cdc4c6a678ce7e4f52", - "8062f31b15d80c356e57aaec9f44ce1788f5337c3ed09341f0c5a35be98a3c91", - "303fa969d9ed2868785f762b82be6c9e7de376358d8ed3b9d6722c7799a061b8", - "46ccfa1a3b96c101c62110023e5f78542ed4a9e34624ade5ef4683171ab0c63f", - "a4ccdb8b2a49947059d13016a9db3a1f076f36bd041e12dfd638902817056125", - "f987e6f6043f1a13ef1207b50a90aabf0d0b1a958ba4c682ff71f5b3d3049cce", - "e6b648d56a85131d2510893b8a184e0465631a0bafe17f56ba4cfa34a2f4f837", - "d9b9cb933cc3bc0a6d4daf0c83d08be459aa209bd77fa242100230e40e370ec0", - "e83083d6cde8448d9b48bd5643ab80ed4dfe6d45833c3f0d453273e328d7da9b", - "1f0986a116e90f05ab5f8a08e17f293f1761e1e213496f2e996144e2f782483b", - "687b95959c385bcf24bbcfb4cef06a80044e239b49295a11f0bb0d8b2f32f14d", - "fd05962ecd188e0e1c82070f9e590043ffd2028015b894b73383561122832c06", - "5846afbeb64474daadd7ffd1a172c8b994e46be7e1304e5c30926a07109a6e35", - "80e41530d3490267bc992993a1f9bc07ba638709b02f4a547874b3831cb40ad5", - "0733e44e53e79164ce30752c70e782a31ba35a4ad0ef6cbb3eac0f77e8cfe03f", - "644adfaa1bb7ba1a7165af1317dc1e68ca2b4fffb5e44462114a82eafd0b749f", - "675e93b4cf3cc2d1c29a5cbb4087f1beea6c60308831dcb94ebabbda0bfb7074", - "12a72962e16246a55b334cfe66f64d36a0c49cae4ed24e210f1a70bf5f5bd605", - "417064372e15bf510cadfaeb6749472beb99ff9a34864dc439af266c2ad128af", - "db88e5db5af801a91d1013a14beceea86eebdcbde4ff13d3bacd5231a075d037", - "4b2a5ad2d14388890907f6400d6c9ada89d1a52e50544c80e9eead3ead01eade", - "45fab69777099d517640da20ae53a24a411420b68d6d6ba652eb76bde3cacc2e", - "f6b09f1275532262d0feacc0d05279a7905a6fc166f4a04d71b6f546cff39a5d", - "909ff9dc7f94bab48e96a8e4a95fee705ccee6648a5b71c8f262962f75cd8f8a", - "9aa69b990d5d116165445f0bdae4ac72f7b0d8b31941b311f3e56f1dc25dc62f", - "5a2980cf492b1275877713fd624d9f6b7aa0695018a0b93f83d9e8d75655cf06", - "5f0643d6154eeed7a90d424299c7fb1faccbfd522e6567667d3d46be4d3c5b1d", - "4975e524d15577874dac008af770eed0695258c67022436090d8807b31dcbbdd", - "52f7f23255162518b32d44f324a6447d0b912a784eefdc2cf46007953c8ad00b", - "14d71c460b179e0bb995095851d25f266eaa0a5b5a4bc7b3cfbe1c620f6a14b2", - "2366556b1b0627400c85fa1d854ff22b15ffd43ce87475796ed7546004a35ba1", - "bb165f0c090da0e2b209871346ad58558b20d53a2df6dd0764410e7f1315ba88", - "65c70ef9ab94124fc2d7df8d015bedfeab0c4a1cc804facc3e8d594a007ac771", - "f86ecab0434ef3195fd47321a5957cf44e9ea80d5c9809abb98dcb019f3d7c55", - "3c338d094aee501457145233c04d17bafce3a5c840f2882a763eac98b2364e45", - "853d8548b7e839462a8148b052178f17be8ef179f3d09de83c18ada30f0c6326", - "8a9cec5ef2a360dfb194192b6de2b955a08d966b5fdf41651b72fa4631dfff7b", - "aa5a5dd24b6b86a0e4c79d888937c33599f6451901be7fe1fa584fde6222136d", - "35c64c7149f59554419316efd95814904b000fc7a51167ca650c6f291276494b", - "4cbcb632e71ec0cbd9c3007eb86a3d6016839ceb2c6ef7524d1fb1143db60642", - "5e30d33e50d5caca247068af1ab42428c8351d8b984c4644eabb0fec26ecaf84", - "4a1e56522a44dd9200965e70340b15f59ac363f505d3b2ea921247f0a8e0f3dc", - "27d34447a5e91c785c9f19643230b01f7fa05b37d80d3228a48880b86c6962bd", - "96107edf8e11c99d4990053738f4dfe4d45b8a91b2ffaa3adb3ee5dcda9fe4bf", - "737e768d5650207041ddbf70916369f9e2b5f6823454e5b0f6b82a171f11ea64", - "4e7219d549bd7b2608351e76e8828f03fd656d7ef076971080a48a943ac73aae", - "3226357702851340d18d7cb5a03979d041598092ad54f4ce43287ac9365bb8b5", - "b3851160662eb29041fd477c3c2fab92df25be3c449669c7c24fff62318439f9", - "250fc5057c036ef459540cc204ee2583628292dd0cf79d6e936572aa55d0300e", - "4f8bb6c81d9409e47919a3989ec4d43150adc871009108e0a548c1b37cbebbe0", - "8e42d2f936e7a4849c08d1b69fe8cfc10cf0187742a1b7dbb119f3a4b1c8662a", - "3ae921f70ee874a942d14066f8d02d8053c9f5980ccac440a97eaf985c931f2a", - "bba8877cff0eae81baa44c3562db72bfb210265008af40116dd76cf5c1763bc5", - "cc2f66dd28436e9f7bea935bc3f56bec8a141e806c84a6fb279351a0193f6150", - "32f6322039f1532728f5eccd1028850330bd5c06a6e69c0b7393edce2b383861", - "bb337e8059d220e78e1af7e6cb561135e052c2a39869d267f327a049d044e6c8", - "542afbe6dc722d4e6f43e34bd0c17b1257b4d4e27f1c75be54b0e6fcf08f8f9e", - "76d82ec886c002d91d3d3f2f208d2c9dd5ed5ef56e374059a32033c07a89f5d1", - "22151d1867f7a6f59bd4e1dda1194c207be2de3295c340c7677c048913e7badc", - "fd6eacd79b6f9a9ee048d28144ac86fa51fc23145b36715b49434bc5d70bc042", - "0cf691f1e2c08f3d56c8b3f24500c2d40cf2ad3fe68e57f47682a60bc32f5ec8", - "3ed5c37e912d287f038e033a98f391e75a60206fe46092d241cbae8c96414b38", - "f75006ad4c9f8b339aa6e0a622aab81dead44025d75307f5c5f134932d2fcc6c", - "f070e9938b3e8a7c9e749c250297cef1a6876c6e710a39b0d3a293066f612ca8", - "49104ce8b0e7c04f95dabe7690a7b610c8eec1236d33c37e56ced73a73db79b9", - "642778bb67324e91faae9dd412a70046840f1380e562566c1a74bc6bedd87764", - "1f880dc080e83ebf06f5fe061b7610987888ac26749afb6c6386015262a2eb81", - "88f0ad99303a140da5eafc8157079554d7f8e1c6b7a4074cec2ad81dbbecb823", - "846b3c4be9bc19a9d0b71f74dbae7825a51b169a61517b1ad57840ee835559cf", - "4a10d681eb2946d1e6d2a2da816abfd78f03b218ef157b631a3649dbc8338c44", - "586c0971af621baf58b639733133b0db3da0e5dab3795171089bd9c5137799e1", - "9263fec5281f7a0a93ff7fa1647909073497cd2e4e574055ddcaaeba38f23b8e", - "1792f4d37fdac0d96a497230c679d5505c03a5bccf0889a91035cdac66557b7e", - "3782f474f7ecec4d9f8f98b4cc83a06f0cf7b7529af1820393897b1f131281f7", - "230b1a987cd13d6a86912118cc36fda3d518071eb3221aabf13789ce39fa1606", - "4e5cfe970920919c2b23b44c8082d3023bf9d895c0fb3e447836fed065a8df6c", - "62ab6a1ceb471477850bbc402d7207ccf3c081066b6f99b4cb50fb491a782663", - "96c5803346b2500e945d7d1d603e20fec0c5d399dd045d000825063019734482", - "861f9ce6003b1057ad2c598a41179c3ad857c59d943dec88caaeac0a1ef1ffbe", - "549f796d34a94436fe1adde1bf9bc9db5a353cd481652af4dc049e4c9d1a66db", - "5e2aa97eeb82de990c5cae04b7af905bb38824646a00a890341d41696df9e589", - "669e9a159ecfb897fa8d2a1ad58f56ae6f73e388e8541d15db6121915700ad52", - "ac667a6fca4d3b6b349edda8bf4382eda34a2126e29c85a98c8d27a85ccdfcfd", - "e814ab7d9ebae5cb6dd3630b0f72cf9eb23bba38a9067f7647946517d10c379a", - "e4b7f009791ffe18bbfd4b52ac7ade99d24ffb1d435fdab1df7bbc7a5bf0423e", - "da17ac7955e7bec800164c0cb23b433ec09d08a30e61d669c761e883db2d285d", - "6a23e79f9867819f920d7f65acfd1a523a50ee4db60372ecafd41a7ad7a8c48a", - "8179b191247369f3b43afedb5c657cb0f00fefcc59a76a5ee3082ad4f944baee", - "8004ef104970e0b4e5d3ec1dea4732f670c8093ed2f4ef97cf0ca4452d11edd4", - "ea54661993bc45139c21561effc59ad3c7f0e2b71fb1322a7d6fe6ab184ea4bb", - "2dbe3e8eca16d10dba599f6979895444f0e448f54efa546ba58e2424b9b8436e", - "50da60efbf8a7a4de90ae406e5f9844035cb171306cf982e3268f8c0c8bfd719", - "7c4ef2432ef47ca3c739b781902811c129b71d034873247732a6fa8d8011af97", - "6fa77110a782d010b41ed31c3ceac28060dcbff19b1cc3bcceb9514a5ca4a94d", - "bfe24b74474274a9611dd2c6593b308ca33d939afe4098a8b05b7b4178d8b0db", - "0461d9fb6273e7ebb5c6912ad9d7f0841d277c5b184c439cc748349dcdb986ce", - "359e38af271f75ecdda5ec403972d2da2f1623cdac85effb9e46979c12961ec6", - "01cab331c2f448cf83cc83d0e4b7d166d16501f9d855264c7efbb2697cd83b51", - "60b62a9a1b15c0ebff057fc563aba257327421c7eef682d7a9607451f1c36e00", - "d4a094c4aefd8e73d333cf2abc34edbd464e0de60dbd4c9fd632bac32bd1a538", - "7a6feca7312a17c48060a03006760e953c07f8c64089a7773c52fbd1a5b00dbe", - "f13cdd7a05d05ca922fb8380e2f0823dc32e42b4dcbd9057c48835267a9235af", - "1771910ac3bbc82fdafa72de05e8a2f5c8fb37c983597d07d8dc98ebef3b31cc", - "9e896247c9bb1db7ecb8fbb3a14814607159b4b56db5e78d7e50bbab8e2f4011", - "d5f44bcfc446844ba582489707cc56909ed838d930b9a4f760089b64996beeab", - "18efafdddd64ce563163287f28a7f1e3198cea7d7493c02e3293b7f1f7fc3841", - "d9b8e4715d30ab7cc8ab5b46ec25d9722b34ba1e0626ffbece1de22e52139144", - "7278e6aa75d24a843487761f61428bd865f7aca7211f23c8b7754b381c07088a", - "d1eef6a535ed1afa2f8c714a331582ad9d00c0fc717152555d69f140173b1ca1", - "1f61d34872c4d7e7b1e2c0523d145878168c6e49c54eba2b01a42f752a84f4f9", - "b1f60e4d5895a216f24c1609ce7dfef4fdc53c7d33f1b5bf2dbe8d02b688eac5", - "c1fa7d30de29c661fcd72ff2c55e08f0c9d3fcb8d6476d3e96fc23478c23a2da", - "a9daece45ed8151d9759953a1a6e873f04c69d802b51eff0698b14ee4eb3e70e", - "43756ae0f9fad453999e3da2a0a17076c09437f071c8beb336224abcf0a7058f", - "7e677c32f9bd14d13d7a93216b4db5f5f5a5f0ce565e606022ec142056c83c7c", - "afe1710025df01e4a6e325d5d976e722c262d707de559e1eb2fc3a553db6fa43", - "cf99c08b3fd03f9b98d2949597956faada345ad1c2ff00ada3d441c3db0b8677", - "a7afc7e0d75321c3aa2d84258b6a6171772a0b0d4c956a4513bc19bb3ab1adcc", - "2ad499140ff379cc7c011da722aa514a7797f9b5f7fd9557b2927c277de88372", - "2883073e8cb98ec49672acea1943bfc6bd0db8d7591026cdee9d8c12d188f934", - "eba4bdb862abbaa7b30f09783e4e7934341e2df3b52e9453e7de965ca9c6fe6b", - "2a300fbb706b0905f6a6daf5386a2a01a2894ad70b720ce231cc7173f3603b3a", - "3a94068a290fc00adcba03a8932587f212cc29f252bdfc28fb317aca71472f92", - "b3ad8f25132f0429eb783259778457cf00a59eb42e9a4f34807b9855cbf2f18d", - "c41614b2b73724f31d54bc7b2c794c7a105ef1fc62330c2f0fb0a59702ac7993", - "26642fc7ccc280545bb95972636b4df44ea62ab6f6dc5c3d69462340ce416a64", - "598615399b982ab9c6b1604f9d300e0f6f155d8acd8d350f9bf79a30d3fa7280", - "ba80919b63f68d7a4fa77de3d547b99c93bafd11845e6719813deb279970688a", - "c55c8b3af2ff2e7659a9a764d73e7204d3d0dd09cf713a441356984ff41d4706", - "ce8a56d7be4450c8df9cd3758241b8abc83b948c55d6d9cc45829977505e1ee5", - "0f82b286091a49df469752032bb676408a16f805ffc2a9bcff75da36dfcc7505", - "f080bdb77e0e91a1c581833dacdb9460aa5ce333dee3c2426bf55272119ccf0e", - "b7ec97c6d55d9a4bde8473470fe306d9d98c82549ca289c97dfc4f1310610bf8", - "b569f81e95987063e17423cd489562bf16e32ff79e49c3646f08fb7f66834a33", - "df4ddf01af3f3248b3836b0b38257546ae1dd5711beddc5f3773b6c1048638cd", - "3cd624b1a9c366a9e3bf90551d46a1c772b16d4c424590a02fee1d7405c2f393", - "5f4173ec308bc895a26c7bd2ce146b3653d063fc636e33b44ba0360593823844", - "9e522839b34c1477c7c24631fabaf7d559ce3d419c054d0962e14fa9693724a7", - "0c99fa6620205bd711a41e6dd0c4b411a16ecbfdf6b050bf221088eef8fc241b", - "e33972138e0e29dd71048c73ce6783ea61e7633bf0b81d8883f53eba191aa8cf", - "4f990a04ed58dc1597790fe1b26e218fcc4462d76ef6ac82a1bd80124512050e", - "49a11ad0d39867f7d1a4a44b11b4d785cabf5c8f48a6258dc1d62183b69310e8", - "60dd4fbcd77692c439dc3921a2ad0b7844e29577910c5d2eb56c1f55cbadeaf9", - "ff97920645cb4654eca737ea5af603420f84604e544bb11b465b8b9cf723f90a", - "b2e8700725c7d58090c28d9a48c722b548d27121a38631580849f2d24f94f740", - "339fdb9d75b0a103cc8ed619791e51d61431bb4ff23ddbbd6f0381341de1173d", - "6b46302674fef0f1ca1610dfc138d7c17bfb653f5168accfb1de24dec0d83c75", - "f8674cd2e1ef5a113df312206645329681cb2a6d23649cc504a0756e4935767d", - "bc862d27eef759885b9ee57dcd5348bbb7553810d226e4a9376f1c9bf9b985fa", - "8391b44c07aa9d50ffac31c0052c76c1da1c2527de14437a9055ed30dc307803", - "5b2cc6b455bbd3c4c8711091253470d4217dd70736a58478c32c7165b351a7d3", - "ef3a905c79a2127df63dd334234d39567b171c901e656fd8269f7a86aea89ad1", - "081b02cf6864ca48cda9deca2d04316b21629f4aae8f29d142df1ea028fcb169", - "820fd5e01373a58bd85fcef71be8e4ea4b80dda1f29258384ab149b64e1f859b", - "58d80b670284feeef21312c1cc96089561964c66e9cc25be057d9d99032b0dca", - "fe5df6f08590ca5a24d6c0962dc08fd616441dcfb24e1098745e1422e283eaaf", - "168f57fbbc5ba731dbb6b9aebcc6a20f9ecac8f0706ce81353511ab9e9ddda5f", - "cf148c316346b2c35630a1534cc0f766bbf2bc9426b616805fe1e4e53b9e5747", - "fd24c7d52fedff1656c27914053c5c6e9b1e1e8fb7193497e3845aadf7f6dc01", - "ba55e45332ead301c69c88763f9b8c4a0b308f8b78edb3d52aea41178feaf19a", - "e0085692afd4719da69c6ac106bb2e4c87665c1f4430f1c723de1cdba07f7845", - "f218763862b8d52d4e3c0f4490f49cc6ee3c48fb5fc204a2cc60af9f8868d8ed", - "a1b2bd076ecebe06532a3adf375291fea33259c884d133ce107ae3ff2592d7da", - "c5c11b530a3ab55116c68d6b3df693736496a40cc69c774681ec92af3e52dbfe", - "071b47b56fe0b3aacc3af056644b18082f96c497086d13c341930a2f049db6a1", - "001035fca5af43e62e995ea18ecee9da18be2ebecba9b07dbce271b84d902fb7", - "1b06ec7e71af7fc66e8a2c06b299030e884186f352eb3d69a5f6e8efd450ec98", - "d0dded902fe9c05be59f8980874116a39fa17b4214fe8837fefcc6a3c5e415cb", - "b36ddc453a318a32be011a2f8973d5f3da3b40509992270f7764a6cd5e013350", - "eca646144c7542cae472a32eb65749fa0238258d502fe48563a71779925d9ee3", - "9c475b9083c38f9478d71fc410cb4526c076bae4c9b12e34630c05e00494790c", - "7e9d406b9eccf2abb9c4f8714b57ffe56f9892ad85d4f202797551a68b122c42", - "0f963cd824cc608ac9b8e3064ee1845d3b72aaceb4ab80b100a13b115062e72b", - "13e23088b3e4e4f9fb7e9f61c292adbf9aa796b66b18bebe101e14716b47a0e7", - "695b8cff4e36653d2382ea3e81f4bc24a9a313cd4ff1c53835bb423ee99595e5", - "b4aeb368d5dff2bd59523f4fe5a59a5bd5b008c1e25050beac487a36e7fd5736", - "7fc54e11c650c28d36838ef0e44051a761308af225287a46177b915e2033664c", - "29612c54d182930cbe2e72f6b9f373623b15806c365bb5cd5dd9bc6384ae1e8b", - "e05dcbbfd8178f01ca32972c380aec4560a012d628b3324a4ae6bea627df3705", - "a5f3a2ceb24d68b6011fc2628b92a896cfe516f3764c1ef6d3070e36aad0a071", - "9db7c2b920210f84ca7b3e22db6097efb2bab17d71d0fab5e0d4bb432823ca60", - "76ff49056647d7729c0a9fdc5e335bb52582002fd7957a2407b4314b917d8627", - "2ab5f7eaa0e47015a84c8e2a340bc2fa1397eed78ccb02ff594406a6e0d60f59", - "1d3016d5c909ae4c0e7f8656a1ffd945f2945d0878cb269b7ca083bd8ecd0596", - "dc0e8ca930b6cec141f50c842808525e951647120649402b18960c3031e15194", - "610196b7deefaaeffbd69ca06283aeee141fbe215f7f968425e37e791d81f79c", - "28fb4d584835a596b8be66b139f7845e94dd70f1cd5647525e959ee2eeeed378", - "df19aab0cadfb215fcebc28e5b9168e550c686b544852f15dc40e49813706fc4", - "556a1addb0156f30e14fd05564aaf5a6d179b78b250a1a4dba3f13ecb2e34af6", - "4e0aeb06f1a05cbe630bea0e56876455b3d6bd132b957ca58ab435b87dbf20b1", - "ad2e2054eb0b184451d4ba40cc9651a1058ef22a2f321694b2ddfd9abdaae5d0", - "31325f7efcbadad9a6c2ce700cf06bce3858ba3d534ad3940660670fd25c32dc", - "4d71cd372bcee3992cbbca9cb48c9fc833c3309272b9c6d901008c372ce1c900", - "5ad7a654053d0d0628747bdf9df2938ad16917c9691fc5572d15c98e3b3cb543", - "6e0dfef1aacc4958aab9b4497b3d6ee174efde824ad2979550e21e05f95e534c", - "8db61ab4f426b7aa75354bd544eb8bdea260f2d342a8ab769fb334893379627b", - "3e1d8e4d5500a755c47828fa2c039786696bded0890423b57e5f8641a39dfd86", - "1787e719d997db52cab9eda8983b17823e7b38e435bc8af79645105e3d48e6ec", - "a306dd912c5a30f6bce6e8fd1a57f3bd3e1169689bb58aa0e1159922984fe897", - "016943c1a5106dd861c8a620cc5d7eb513d8eec50f41d53d054696ff4520d30b", - "144f339baee1e0a565bee2e2afdd2a41c903aa65dcf2b10ea3d69ce172edb4f5", - "cef99575accadbb32a31534eb386234bbb7717a3cc089e2bd2729fc44bc211e6", - "3a82726286a645f1c958ccb441d07a8a92e7f832b1f881e173799569ab4c0d07", - "788ff04912f95ed14ed7343b88f21cacd60235982e8dd67961b8b9773ff0f53d", - "891985feb8a71a6bc8720835a99729e6609c04992380b445c382d900d724f34b", - "a3ae2c097862205e8bcba8519ea7886e71c43c38da33428c2800cfdaa8e81dd0", - "c6deaddb52d2b466068e9bc31b2f9597a457147c12d88b709dfc14c17327596c", - "dc929d85c3715cbb184a9072ba0f160a9e80d1d62ef26e755f9e0b76fca85aea", - "e7ac6562871fa1555933deeb6d3a0bdb77bff2767e4b8fe99730248e3e3cb40c", - "09382eae736d81a536ecd37be3419605f2cc60f022d09602d908639892d7a03f", - "567b39f75c28b32aec469e07438819a183e46cd459b123b513603300a70bb94f", - "43c76e785126f4754b2daa9726d74c62836a86c3e8c9c77649fa6a71377c7fa6", - "74b82564b6618c37e7bc3c8e0765d5ab9a1482c6a3a87b87f4adeee2ff782f1f", - "a4f7dd499271623504496fea0e72c97276713bdef12367b898321cce96feb0ff", - "f946d568454c5b3df8f3b9412fd4f3971a301fff6257b16765d6e30bc58ed5ab", - "14273320bec66ca9ea275acd1df5b40bf0ebaae60e030dea4ea0248bd09abdd5", - "0fc5a13f596ba76733855aa08639392f78dd10144ac9f7bc1ed2cd27bffae3bd", - "1b4ef6526c3ac04ea3a06d18372f31896b64723b44ad353ed0de808945ad4ad8", - "3019e318ae405c277fb64788757583b90a8c059bf05e4f858082164bda36482c", - "6f43bd482b8dd87c217971cdc64f1e39714c1c1b98e7250d7716669e6f7b5902", - "de2df77f721ab6c654e2b5764e15f224be25a7cea918a90603a0d821114f31f4", - "ed855e82fd20f68c3ef8701bf364ca365f319f93a76e53ce243423c8e0290a20", - "507cd8b2ed9e47a828526ff4f0d2d7911c2a64b5dce22d6343b81dddb00f1016", - "cccdf0eb86ef223e29600adab91caa0a4b7213dd550198bf91b169cfe7bc1b98", - "be27e9e427ca903139a94ae8fb0b3d57beb9f9f0f854526389d52a8873cc1dd4", - "5df4da1dc45e2b2e93e225b87d6da8edc80e87cb0aba585807eef20245c6f5d1", - "5ea72aad834a5416533be76eb4538f0668adbc0559923730289bac60d2a4c7c2", - "cd551141f36d55d44e567ed7dd120269bd50e64e8521cd78ce679605f6533a7b", - "1ff514adc33619e244540ff1b3f594db5b70c1671d14c8b1ea357f2d14d2d106", - "481b3eacb126122cb8356bcc0905b93537b845faed6bfff3d8555c147ffad5d6", - "bfb29ad9f22800ebe3a010c9a5555e728175370f682f9cf046762626e76ea95a", - "50ecd9abe706b2c5aceca0721b26669de541ba7cd0da650aa0722b20b9c58a3b", - "50d6b034097ea022def3c153a9df8b735e4c69a8ca5be06749d10455252c153c", - "5fea76c49fc0540debea17709599235b58b16073c720ea2609c22340a5930a05", - "ef20af87e7a7e527fcef4f8fb933e311b9bee0aec694a57e9a986c473f5a01e4", - "fdf15d7d9a47d899461b3273b201dfb92203b012e484bcca5523aed0706f8a79", - "d8b52b2d290733ff814be329f0b734ab20920ebc5e569e6470edb0cdfd98048d", - "845b3633543870d30fbedb3fdd0ad2420ab02724824e4e604b015038a450ca4a", - "7386ce34450d6368a61e32cba1a504d0e882b5058fe7bd1aae91da87a2d6bd59", - "14b8dd9b4a8d0572320ad5f4da4783b07d8e560af7ac010e78b5f46c278badd9", - "d83e78fdb970f0dc2ab14d7ef22661e56f384909a2a902d16814a25148cb7205", - "6ed82bafbff106c0e305e1eb81e0442f5eef6af8d1a54d4df1f6e52429882c16", - "4cc17618b9ea28e6202240f9c6226a49156969ce273ebe2ed93cf3ac5e7b9cb9", - "3cf3ec820cfda35401557f655b805bf1fc42e9c9cb6910bf7856a02702481c2b", - "7d9e97fd503bf8aa14493459f91493bca00e75deebf8d60b0fe1950538e3d8dc", - "62e8f877c60cbcc55e7500d8bf2303192433b9c140cb4b9722862bba3fff6c65", - "9c5bedce5bd314df796bc27f0045232b86571073567868a95c55cd117f726977", - "f75af9986ed61ee50b54c117349d95f84fcb623b6af3281e23b203e40d5d0b2b", - "b220b143be7288f30dbcc36ecc70f2b812d213880b4d81eb53bd304303170c38", - "16da4b253c1471bebad51c94eba05d89fa9b946cced1548bb8a86bf54b5c22dd", - "ddbce64f1ed126a8c04e904a027a5b82bdd215138c6a8710ae44e104db86a075", - "1beb125d510086dfd4171745b43dbd2878c123b5d09ab4144ed0c5a2d95b66ab", - "fead12f41a203bf1cba797601e80b4404bf8f0bcf87ff0ab4f50ea95c2a0bb07", - "c3cce15560df09398e5a8bf340f0830377c5a5250abb61f534a8d8990d7f71ea", - "fb5951e7f2e2986d4ee1ec75e6b9c62d48c8323da87551e65cd260b0eb4c0efb", - "badddb3839177feec544ad8fe35fb7ea8e19af3e5967f07cb8724bdb0ca419f6", - "cdc9ff8cc719f31e0a58707241293a15ee82dff2321276e373047274e0eb5b94", - "61906b7fa550d5902b655c590ecd9b15d1c9d5a85f168d7f173c5eba59208929", - "20537ead5ad8fd8ff8fd73a1d6bd4cc85f1301e25290a4f2a2f49942ee23851c", - "dc43ad3eac9938a4a0a8c26104b914eb0521821fe81db4f13b9ab8dc0463e2bf", - "3e1b8aeea1eaa458781afd1007f0d7dcd005392260f462145af74d6f7145c5a6", - "0c9b60c30d4f46cd314519bcb62c0398287d5efd9a6383fa273c2286a92b5def", - "8ebe12d83a44e7bdeed16aa8e400eb86ced4067f17785f7d8f2f300a5bf880fd", - "f99742915c0ec9d1c3dd0b78e7765c213a76746411a5368d4a142eef4a1f285a", - "a573caac8f54967ec19efdcda798f64ca4e2a8504944013a5d147707ca6c51c0", - "26ffd28078d0512d712462357c37a1e2eef02ace931ac241b7e18b43fb811100", - "56fa65b7ddce5d24b2978134db4d2bfde625db1daf4fd09338958af7001628a9", - "ac7628c4ce2de9dc3a8cf4d03c28571bc4b063b72727b865e4257f3f1032c268", - "2c6795c38f8f0fb96d0683c31ab27c43a487b5e6a2314de4578cad5bcf677872", - "e49b4ee89d0f66c85b5f0d4cec1f7a9286953b144697dc35ab138855ace50700", - "4063ed625aba99a6f3b02181a418bb19bddaf1392fd8c2e59f584bb1671ec61c", - "7bcbb8ec9e3c5368731a9db77ff39e35d7704514f46e85a6bb05175ae710a9f4", - "21a62404f10ab73c0c59944dd9cece0f2a9e320574e5cfaf3aaa71e7a989de07", - "e8c1773e9224828ce93de0603db9caa76b282c109302f243f8ce92e2bce9bef3", - "97caa5a16d76af6292329deb669691354fe26ab303db8d21ce527e0966282c23", - "b9da22f46908b9f8daea8b12d8d953585a89fb20a3a31105b771362a438b1be6", - "7ac48c860608471eea74dc57cf7ee4bae7a88a3bd8d50969660678964e17332b", - "e8fe454799960a51c61be2e4ecc55bd4fbdb6398e4658df7c85e413b20258221", - "a4aa8923d71631fe98bc9a51563a8a5f6c45423a7a3c62ff7f7b7c7d29a2cbc0", - "9d797527f59067f7f2bd14949e4dcadb69952137478ab03c01ed2a13adc5f339", - "6c14ea83aa206fb77157d708e88b2cc1801680ff4fbcffe7c6b556c1c0413308", - "231bde0be678b72a0cfed82f5754e9629b2147ec6245aa25cd1320f6922eeeb2", - "1c41c24b9ed349c9931f491aeefdd18bcc99d5da36aba3a57e9b13c1a13df248", - "9c1c51a8de9844549dbf12fbf8b3c98c1bcca5badb2ebc7c42ca473d59286694", - "1d48684a7e96e0cc6983aa0ad43c0e3425d5a4dfda809172dadd13b2c32ab9b2", - "fe818533f8d4fa36dd5612e1b84551a697198a3ce8bc779c8708c33e28568931", - "cf477c1e87c6183976ce5b8b3cd53bafb6d28ff9da5b92587ed773746e17a7e1", - "dafd1825c0b07050ce17a0a15cf1d5ed08b90f1dde459195b9ac31dc17616c7d", - "a9964d7ca456b2fbd5e2f5e5957f0d98bc01e30697aaac2c08892c8a5548193a", - "f2e0e62dbe4c22eec25301e63f7bf9ab64c3f2aea7f972e22daa7773cc4ab99f", - "07ab52278f5f3143a6f7686dacb2b40a553586a7e8a5744d02a9383e332b889e", - "9a641aa10c189d0394d7a51fc1afd0dbb7ae7164044e5f8aaf7012b441dfb692", - "7434c3c555486499454adde168b5c0fce0640d240a9a0f93d6ba5d4e3b3b6752", - "82609df7a06216bbe1616b5aa56475382711b7e16360d851114744b3177ccbb4", - "54f84d736299979ab682532e09cae79ac2221d2d2edf7b32016ade89755d185a", - "1bd1c5bd97d64f9335e8c9fb65fc51afa7e0c7057694f288875922d255156c79", - "43dcb26e44c9f8c848c003f33475975d2c2ad05350c75a2f4dd320491dbabd6c", - "f8c0e75af7e11f721b55a89b778e31400f004e4f80f8c22aee3f2bc390a022dc", - "0e7b17a7131c5c1af0d0c62ed0d3b969b7105e6ad863c8fc5fec729d1478a403", - "dca1442eec2fe4dc8364da8f300567828042da5da4990b8691776121c3527ade", - "82079cb9552f186cda4ce4764c3e0f9ac96ccce8fc843010e4c82a52b62350ef", - "55dcae99bcf84c41e4ff21165864de229c047944a55bc63ef50661bad5c58345", - "4ef72b118ccd7b05178e7893698fb64f137c2931e6bfbd8d233eeba6945b17a4", - "a985660e812c4ac830652e59c470a0167dc7be31246fc2e305407f60ed58eab9", - "b628d5fe931d76823afa7f64786ac444603b1f59eaeff320981a016d3b09d578", - "803d27b42a700ef187f8ddd8e62c7ef8b5da080f8df1c813c2fa7e00214b015f", - "4c7f5b0a04e497ffaacee88da6b55edc2bee98b9c91bdfa70370b20ad1e07e78", - "440562fb8d6a0e94fafc866038d257ea780fc73f611c4bc69157bebdbd789aa3", - "145d4251671ccf49d7ab1d9909a7ab3d01079896198d3bdd7344b2d5d78d416e", - "ec1384a0b99c69c1f6cf8620e11c4f394869c92603dec8b6c7c926645f207416", - "0615764c97ad48f9aefdc49887aa787eeec7e99811a5cc1232203e03e68dc4f6", - "87292617a5b50fde893ed83d75f576754cb1d8cb9eb85c3c1d4400ea7d59a8df", - "e541d7d752b341ec7903b961295317a0dbb1e27d29d3c7c35c473819481468bc", - "0bd19cf46a198aa55936c1a1b7c67c0403566731b00c20bbcb4f2cc6fd563834", - "8452a03d1998f3ece6525041e909e614be8a558c9774dce0547db68358812e84", - "dde33ccc072dce3d3a15de980542454538a0291e73a7b81385cbcddfc5d9c46c", - "275f8184a17e5a2ca06419f2f217f7d54def49e88cef3287bbd275080928fc09", - "a1578d555fe645ad6e94b73dc509231a0ec816aeba64748b55f324048e2fecb1", - "ccbc1973e922bbdd452c0f2e31f9cb9121090fc989b1afcdda47bfcda6086bcb", - "7d2cfbc2b824eb0f8631f1001f60308104faed5a670907f800495fb4adb6c9d0", - "086d28667dd5f98a66a9559acf02eafb51b94a7df34572d9c5ed0f0f3a4248b5", - "c9f334db021034ae6d1cc36be1b6e9ee0f6d28d254725a913160bbcb02d3f277", - "bbe7bb84d9861804026bf261bbff3487b1cd0ff305a7c907cef9d6a009b524ac", - "fc0ce355b323f75a830433fc0b0236c2af184e0e689cc1ed0eda21b172ac20f6", - "f8a9ba2c7ed95e6abe1a5c3a96300b9e29ea8d78a9ec5544cf16f47cc767b326", - "51f56c57fec0459192b88310a9d8cef335f77c36cf94e5a3d9a8afe14854e5f7", - "f3eb67d03a4e4760b2addda1a368fb864e3e1a1bd25471e4d62e8cd4fbcaf3cc", - "366e09961d92ad07f75af0e45d0f26f776d03b6abcd926029989937fe003efef", - "1dc1a0ee2224bbc901b0f7d148031cd749cdeababeeb4521a50ba9bb5ac57a42", - "2d1b4a2e20bfd498ae7ae7ef658e3ac92f75917d7e11918c89420c4f6c55a18b", - "8fb4e69c8f569a0c3d386e0b7e4a0b6cdf754d8b5ddd401849d3d625570df272", - "632b6d86cff8dfd1bec012985cb8cd919ce646d1f6918e47ab5b4cf655e8d679", - "2031a1fa323035fc1e5d00929713ae59bef8bc83151e5decf044bae7429da614", - "e35ac671f48e935704cf2296c8f1b86324f04c8628b37d18bb8c052c56d4d1fa", - "cbb8aa6b13d4336a9d8a468b6b32e3057011264836abb3d1f6cb66d9e1dc28a6", - "2e67dd6a40bdc2e419d2f9a4309bb5a67ea92820f8308d47fbf57da7449bfcf6", - "6d9b549bd560e2c9ccb68caf888fc078e124fbda303a2daf795f373b289a807e", - "d684a99a3e853b4973735acd50a75e96476942455d9bb9c3786b4293a63dc4bb", - "7932bd688ad517ef96578a8648e7f0e919d1460ea63e8606ae48c450f03eaf23", - "ebd338d556d56fcb7dd56d0901960831aea58e0d92870824d0771044eac52e6e", - "94d6c15fd0195a6617c32a25ee3f5a63226f0cc29985cdc86f6abe99acedd651", - "e1cb48ade1c109ee7b68dcb8cc871d45e1ab6e0c4b095bcbfbfe31cf483b8b5c", - "b327c4535cb73a1eb5239695516ed6bea5484554517d09f71bc598c7be584c50", - "2c5743d18c2688f1112dd6eb2140aa4f593be0cd578bd90815117c707c456154", - "1c169322ecb9a1ce5c5681bb0da3781b41d8d8659713611b83794a97c67d3b04", - "1cdf262b43a71aa0be76576b759442ba56718ff1b2f0799563c16e38e6a2179a", - "baa408417d5e3632294c5c273356fa146a62d8d4132fd138e1fd96182f0ca2b2", - "6411784f6f6843ccb587fd7a878a12858528006c06d9890f099863ec6f8026dc", - "9cd6f32f641700cc654e39933672b8b420a838ed8e2a9c59f1b2c2a1ef03391d", - "e7248c16cd07e291dd6eed3d3fb872e54472a5bd291dcc4154682c2eb127a2c1", - "949068b4e1a0a237997e63c45fbd014e0bd531b09ee69b1f2cc4fdd4debdcdbd", - "7b1c38ee783fc7a7229d820063494b271120227742bc18776f0cb6b7e863cca7", - "40443168746067403913dffb1db3cccef944914129e76b9c395ed729add4b217", - "02ba53a2b1ff06dcb47a0565d65176ce869e0133c240e611d733d50aab7ccaa1", - "568df2d2318cf5050563cf58c3794bf331e3dce00c4b24e53630ce851ea7a682", - "c39b945ecc4c881645efd99a83442fdea555c3adbbe918af8d0a9041e5d06846", - "3d130a531ddbc169e2234c7f5aff25ddf0a462d59979f0c80dfc98b6a6e50529", - "6a5841e6c120124bf538e979d11f49c77448ff7eaedb39ae97302ad6b9231d05", - "1fd52e4d57330f17f7548c409f683c4463a2104dfc085839884deca49177cdc6", - "1b8aefd0f0418ba113af1735b33ef78a98b3d3a084ef3eeae6ab3aa05a67c725", - "6249011e7f9ecdf382abea01fe95b25408f1547de0630d13c34ec9f8971ce6bb", - "954e3e89ca13b055daa325abb8551df89974fd716df3fb14740b39536208b84f", - "12e25de9ba3b354cf1bb084779173ae0d9ebb41504d2131765f29ea88df59aab", - "5b0624624c97baf40d121534d895d96851c18f7a5be76d04e27786e90b398e5f", - "af218697ff13b970255f6be949b112b874c6f152eeb883e01a05d9d79c1f08a7", - "88af2918ebf4ecfd7558e5cda1df18d6edd23a0118174feb1e23ff1220337de9", - "b9ca24cbcea3bcb8e203e4e2821837dfbd69c1da7589eb947f25b6fea7b272c6", - "12c29445bf3c7de047908cf4d185f723099486ce3ec0731c57cb6604898a205e", - "9e0632392e44c7a87550a682fad5cd4e3222fcc9cbd1343cdf6445cc6dfcf8e0", - "d0c32f07024f122a417019efe31c9b700bbb5d8683dd38c9cb0dde8a7b2b9386", - "10dd617ea19bd2da4a89cc0edd813e8d761114d31c2df2f7cc59b221f1855ded", - "53f6c4caa6f3c988526e94a7d62c6427c94429d0933e17a7820907dab6ed55f4", - "998de8415361ffad0131783585d5ea999174a6143ead303827afe2295909059c", - "69cc0c726ae464f4a8e0aa3303c91f330be50fc35703907d7ea3cf6f5cac61aa", - "6c35dda95cf1b384fea83d7c5c40a2063ab9a0766655649e3cd968334b388510", - "ed489303dda5d39a85dcc435d360dbf1c783e444f773d96ec76590ec311a6e8b", - "732bfab87431ea9d48853b8943530c8d27085e8dd6813c5675f9e95c3b099078", - "748a948af4054d891460244e0d831bfab5a5119fb5a72006b8d04f50e1792188", - "9aa2f64453a7c603221009802a187b28b65886acb93a836e72e117c9287e6295", - "b5af5584a06145bbf8e215b4603bd81c3f576904810e9502163d5621c3c276f5", - "5f0da639ea19b51e1592f11c1499cef64f05348243cadb2d4c0ceb45b0179763", - "ab0e3a37e34790c67906f2ffdb01fa44d76922c120dc405ac0ab7c42143fe367", - "ff90f86be08bcc072e706d4d1c0fde39dc2eebd40a0621f490787ed537c92134", - "77904a570e65754e5e660c3bdff17266220692f1a6e9c1c18b8649ef8c0516fa", - "bd4fa5a49a345e3b2b58e7ce65c5bf26171a07ac034646b8973a69d2b7237c28", - "3329b5f966c89a594dd947893224685439c1875544c4a37064bccf72b9060ec5", - "3a6488464197c483b772bcf994c389387a27857153a36acb778bcfae954cd701", - "8f47f2b9dd5c68dc92971dcee0db8e445285d0da6d733aa4081feaa12961263c", - "d10b79f07679af47f7fff69c9872948e68603068ca86ca5d2dbf96b41ae4f6f7", - "2b0c305cc304092ff16e51d51fc483375bd855df70a09f2fe9365768891aa08a", - "6c2bb0a29acaad307a7bc5b74195aa742703aa878030fd73f04ba9cdbe25e442", - "0f30f47286a43ae662b1d36c1222b7f5e45c7a18ead1baefe16c4b6005fa7901", - "e2941e015c0ad506fc60afcac448210b3fb0a6821759e81125696e0ca4f4fe3f", - "1ed60616e07a73a613a366167aa2dd922d2e68dca0bca5c72b36eb654647b9b5", - "d92b9706808260018cdf3baa5b695e07143354afe31bcce39bfc1472b7969641", - "518fc948567b54a79402bd0c2a2d75f803c92c765427c0dd66f96b00344b9d80", - "43b03311029a7b1a2ac4d775a717b4b5d0b737bc742a810cbf882086b80c72f3", - "a186ee54b5d0129a979e245a2a0ee2fb4c351125ad92559b895b7023b58256de", - "72e456ed3d4228e3cf2f4b799dd46fd7ee74b950aab2085e7269eb0da5ad4333", - "8d71e7e5f0b529d8e6d26e447a2c9ef11ce6079002744bd3a19b433d1943dadc", - "250848118272531a5680af1824e73921402d22bb5716d9c9b7941a21fac3ab34", - "56867fc3fd5010bbdc29891b0b153961c30ba5c83958d6e021cfd3769358d739", - "e5d0a1b36b1a48b268e79d7dd4e2bd94b4537080aaea3478e9bda56c0518096a", - "a8836297365c81bea2b7fc5dc62bd434e59bdf095f8fb227f6b99794f77304ff", - "c331e3308d39c3d66330676937164d04e6542d7d47bf62c08d4516f1f5f4f57f", - "a6eb633765de7282c43cd36d24bb08b6e6e8c3df15db68f0b6fac633d04fb730", - "927b60b973ac94ab3fc8189f214ddb8e8e8e285ccacd9483fd11e0aa0d5a2d78", - "44d5b5fb6ecc3711913b5e6d07015f52696ce10629b45d9bdca87602cf28ef96", - "7ae9a179752e919187f124959adbb1668d9344a92ebf7d99e467d7a5c231be24", - "f23e6f8b49b3fec4b0db4bfc5ad9ed970569cdb89bd0bf319c0dfef31ca398d8", - "236a44dd1480bfe65b949ab7818148f5ccb94d63b05fd0676ddf0c3250868931", - "c9028765408edcbb4ffa9cd2bdd39a04435a9996b3a6be8593d646d7420617f2", - "a68aa21e9f383a1452ff4a789a3942d30ba1c2e44b19a72d4ed383399cb12193", - "514839b08116f5ff6fd649c6ea0668e8d99254f8872b01c8281faa2b02d75156", - "7f8cc98abaefca0818792c8912242ca0973415fc585b7411f278656d9b0b87d4", - "2d094bf252b6b6ef9d49cfb4bcdf23b235ac825a00bbdfc9103af5130e7e4013", - "2968c5f1e5ef3bd045a4551b4b6eea9c291f51af064358b1df50c7605fd83035", - "a39cd011edfdd056ba6298cefbafaff37be3ce998dd615b9cfb8c18b51761c32", - "7eb5680051d462f654c75698a01352f886f047a21ade7979530a333f99e35b9e", - "abe325dc72193c7cffcb5ab70f14335bff33c83d079d0f06d522bc7de1f3ab0b", - "184130fda36ea09f0fa50dd956d868c9f20cddb82171e0f73195b4d24e33554d", - "b9b3550b63dcba9132c0c9a85ed386beb13b2e83c72045ab44bcb1f17249176b", - "003c989173c8f145de72be846b923530582a93e42e7b3205f73f9c0b0f1b7baa", - "458d02ff764865b1c106b31bbbd0f41cfe5af91215d2461cbf56fb93d844c90f", - "9a1905d8ef3bd2730a730112705a831fa473bc4133e0aae05e84fe8b2e53913d", - "970aebeded730a1ff218eb5121b1e77f9e343ec15737de63bbb3d9a9712e8581", - "2bc30aaf5bd1b4e25367fea072b5dc73b0876df619439bda8d085d8b19681d3c", - "ac915883cb9558683af6f3049ffda728c0cb507316c0b36371161c159a3932ea", - "ba933ee88e82fd26fd99eefe56cf24356800416152f3a45f96cf301c8862e820", - "50ef374429cb33512d690c6993ebc82dcd551f846c81083a52e0e4ed08a5b901", - "37ce439d174fa0ec1fdab83fcca2798f0c14318820e0dec21070a258e8f07020", - "d6971d863284fcedd7331883b3ce21acf749340f108e678bcdad3db4390f8d2c", - "af94c45f88d5ed30f36067fe60eae43419b795feb52fbfc302a10cdbdf549d56", - "96e27df7e68f19cf0c3ac530cdd397599eb576ab18fed84c5608237357aafad1", - "b50efeef30c041960d8ac4a0bcb929c782f9aee11d1e49338997359f3d721ed6", - "cd05046df8c6b94320a87fc87a1e6b006d04004c2f32a2f37efbdb149d805fd4", - "5c11c7040cb59e454aa10904a9787bafeaf4153d4e8437f67aede4685a329584", - "ae0ebe3a3e6bb5162f1bf421aea67bb75e5cc7e7d8202ac3cab62ee9bb96ec38", - "92ce0724cb0c2c00bb024cd435591a77ff67a8538886c640606d607c70a297a7", - "c2b1da7460c6b6b12f8e82addd428fd8ee5084b3be9ebbffe0ba8213db3041d4", - "f6c0a765915a26c486a9b9cfd08c074534fe89ec5fd82ec2dfa2d0c8a6c07a7e", - "d60b41712a809379fbcdc0d55030145d490c243ccade4e46b9bb6480077fee02", - "0ec12053b7e6d09a22fbc6ad22c4f5fa554bac085e284ec67c65f6b5ebbe3f1f", - "996557c49e6233f33c312954ae00ee62ee53da1dfac09bb892bf54811f203e5f", - "777eecf232b339c41a44f295e03d2f46b111beb8acf65801250591422748d89a", - "9e765a32ffd1239f884b0f494935cf7dff33cdb6b286b04f6dcb216bca280bf6", - "71ea338cfb3ebd5a057f0b742560f115669122083837d106d4fb592e158c8d33", - "9ff684f778cf55381f4bb91d9eb3144e0bc412d2a4bf71717e6292284179a27b", - "c4ae460e61a1232e90673db88ee0a5b9f0c267f93d3098e8c8732e264e668d0e", - "3528f888a7796ed06dddc58f13784d9e0a4181f93f706b6eea98c8f2a0971102", - "89d673b288f87f9e34291419ccf368e8c230a66e3c17ad3050c4f183b4996bca", - "44cf31056f266473b4aa9d86ae5f127c50aefa46bb0a587bcb0adb57e3ad2dec", - "490b819f827ac5e082cb7d99689300830e59c9c89031370fd89b9513c17681f1", - "82e6375099b8f205b2cd78835aae783d987185a4e6fc6ee93f34f35142479abd", - "7778d81d91d271f751e78566cd5f067b503b1d0e1e7615a43e605b00f89d5cc7", - "87b9248636c83d1afa512f2b4863c9029da81821ef17849ace18cd9b000ce14e", - "71b499e200049843949243f83845929719f57c9361ff6c02da3e6e93d19cf86a", - "4fdfcaf87a4da5a8e0ff54742dde767a0c281f754b82266dc3156c4428184381", - "cf87a042ed40325052b969bb2667c9172c6cff3ee0ff809e6934862224c3bd62", - "01731c5edeb104cbf51540f3641af0dd499a0a3b843caf163ddf73b8849f0a66", - "56353c25c88a29760b7923689f3f12bc8bb166fdf212f0fc843ded4eaa0915d4", - "dc1aee327cf054967472b79e32f4295c230084a83bd1b2a58c014d3f82991e54", - "516fe7e38e16a95e5d448e1f9585cba2a0d5768a3637036a97d838e38957d599", - "9498ecabdc50ad612b8803e7ed23f85e0876348f4a70edb60120d980d3dd441c", - "dbb1499df4ce77928c3592eaac22d12d758aa49b837eadb704482e307eb514bc", - "0e739050e5e29fe24a04b1ec7b61a2445862306d57bb7b51eb1d63a7b9ace2bc", - "de650ceb99a92c1fbf67487ceb130ee4310f41b90176c7d356084d5fe2e1737b", - "32e632bed1dcf74ac48f867c1ce15c77af0c3149d65997d5393ded7ff533f3e8", - "74b88312d8fc2f874940eb6bdd4adaf7562f101cd128c68c461577173f132c31", - "787899711b862b77df8d2faa69de664048598265a9f96abf178d341076e200e0", - "03e7313c514bbd66c0248b60149710264f5b34c144b3039889e543c64cb8c916", - "42844c4baf11a63ff1a2cca97c47f62b445a4b082f84a0581600f1b070a78008", - "69d3e86da6376cd9ec8280937952a70d0d3ac5dc4b27c83fe86fbdd565aa5761", - "65b57d80c1392c4ca7669571cd694ad8c33e91602dd370bcc14e46450d0dccb6", - "0721f914a204125cdcef4bc0cd32753980ea48587e42d345bdb60edc456ef9d6", - "49a73e152b3122add3cd93ca61dec742fa67272553a3206dd24b0bd15c816c5a", - "b05ab4e7fef647f1a23753b1b574a74209f652d032e039baf627370fa6331121", - "21423f16d06bd37d374438600280ec94638e48a17d76901ee66a59f1f46c2cb9", - "a806b6a8c2b10ce88d5ee865222b8b20f880e4e17451abecb1dc95d89925384a", - "3b6cfc76015fc349b628cab79314aee20f86aaeb17e298c127bb2f6252a18b38", - "14812ee610d442014cd4d6b7a4c144623df8f04d22353bb2e0f8e1d8380ee86c", - "b2f0392b3abdc684d86fc1e857526949bf11d10a9f03023f3dbc8ee8058298dd", - "88a69889b38addeda51e94cebbb24784d4a48a6369aa2ed1ba1c0df83a036c54", - "a71e5d918ec62846ef2b57e19ab12937cf61d81db3de1893dcdfb99cc9fe94c7", - "ccdd97cc04e0037d72f3205370ff4180aefb287f417c294182044e1b35e95bb3", - "813848431b494995a002c41f90043ef8a5a6a13e3988d5ecb7a068ea755d5865", - "20b9b26f75f9aa783e582bbd066e309d9c74ec3c9ebb2e2c96a3f4c3d1b2a2ca", - "b36c210fed5fd13016313fba19eaf7927a788386d0b1321c9870a07f449ed656", - "0a5866e2e5758461dc0a9dc3eed79207f830dce5398023a42d92e995ce35da1f", - "db347d30a57208548c661e7e5f929065d3cd0c21db61cf84086082a9c8c507b7", - "be97a48ccdc566e7fba807032a2b922b90db6c984efe6859d21ade9fd0abba6f", - "7a4e961159f2f4e7d5c1f3c854bef131f3166851211f8703697cd1289efa295b", - "b4eef401bcecf8f232c54cab426cb444d7a7b692802cf0c7099b05ecc74f9b9c", - "32a91c58ab1d992a3a3b7cebade22169aee36ce0e5aff64371eeaf8d395969b1", - "9f56177b8439bb5d91f6fb7242388255e0c704a0b752932399c16b4985a561b5", - "f2f93fed87e241056fa7bfabb9b238ee157bc439a286095484230f58ca1c85b8", - "e067c8e40708dae93ab1925d736c73d7d01d69fd15a9f866e20f1841cccad163", - "709d8dbf1093938d221a937c1e2cad062511b5f3f5529192043eeb9bbe09434d", - "c7dde7d182392640e8f7733c3fca8b484ed3e97e7d9b4a4cd9891e190d4bb48b", - "c6e6ef0af365f6c15d4abddccfddf5d014b98494e3c6e0317a2d13db063be760", - "da9be3654bb6bcd35ef9c9a36c818f65846cf4e4b021a43aa59cdc64b9b81816", - "89fb5a733ee5b94f15ec1695940e2a198f55e4e0fb122b8c4bb0559e6920be4c", - "55c456e9edd641d121356d8831c93ea70c713e575047a882bcc6edf11b9840f0", - "ede563d953c05b8af9dc5d2fc5defcfd103f23851ed43309f58653026f84f790", - "c7d70898805390ba5499e0fe96873f669429dc3618227239a7628b27eaaf265d", - "fc2850ec71368ed8db5e71c175a8fb499e4765fb5b7c35118ba27bf1edc75ffa", - "32eb8cff0c8f41edd51156f3fa9484245cd6c31b12b790196865b9733969288e", - "a03eb5203d7c1aff4dabc6bd60f86c5a5fcdf8c27792a05ccf8224a8c6da6012", - "35c28e26b764a824b9aa524133b1933ac595d78690685f209477d66e5594be55", - "4700b7424aa19fd968b9d46820eb3e187ccdc8dfd9ba226ab5d272b313ddba19", - "b19edfc8cddddfca1566fd3d476d97981fae32052396d4dd22987553359fbd3a", - "d1bdc158b21eb9bc62b4f6a38f14773273a95ae1f89a0250ceb886098fcfca51", - "fc19f0c72e5c6ff67f0823db251d9234adbd687284a7e512c6ae0d54eca3f3d0", - "ca9ebca0d99c206085f5b16d5ba632827140fe94963d348f538f4802b1d55a7c", - "756c1f011a520ab24a18d25d5799b9b6399024362234c8282cbd4517548ff36f", - "c53781a7d6d878fb9f1bc413ed591456e2a55df3acc01ee458911ec2ebebf182", - "c20624f0ccd1c117495eb8c8225a7011e67c9ad22e78db00ceed0d9bf44b478a", - "49611546ba7b4a78656db4d62249b366020742595a0d8d1ef3c1277677602407", - "12e3cacef5b62a32b9d21f6e5ba0047ac74be1ec838f89b0291b38d44f6d22a8", - "9997a89a0ae45ea9cb3f476e9dc6c1391b5922c44c80890c2de764d50e98a0fc", - "301b847aa627b610e708a0ca43619061c41b4782bea3c85141b2d83d0de77599", - "408ac3bbbefb9d59d2df86c231d3d9e2580ed3574954ac2e491a46e9cd062934", - "eae9b2b2d820288ed219cb03ed1fbb2491541787a6eed1a692a73a070550fbfc", - "3f7ffcf47831c9a5d472da97ea7fb7bd9a46760fe44428878f67fbfb0c0d3461", - "dceddce78566383bc51aa01e2c4955c35fdacb914df09f86ec621b62c1c8ebee", - "2496c402b953f6a68ff93a8dda9dbd9b1e85174d0fc97cdba87fb0c077d3220f", - "330c3b45d261be36023748485816df1dbdaa02dac75d51774c4fe1432ea36d10", - "535ced884fe41ada31d4c910f996b9163fc30bd958297392d2e3ab5975e5d69f", - "71d621b40ba747688dd11b34249128fce5d005cbd57536339ed235414e247a7b", - "a1eb154b3787816b0015058ff66aebfc065e79e39445bc4e6f11d622698fe8e5", - "b182e41298629aefee421b657e6a8e67e9868d13928163a73d12102704fc5297", - "c2f5b625b2e4b63b26cf6d2178a5e8c0930f5c2f841104e83387788c8fdaa654", - "8e51564a84207c17373d38432918f7a8cb2928da47e6d32ce1c56fbd4f513218", - "378f728f79590924fe20d118545e09890fb5e9bf2d9eb4132d65fe53558c2733", - "0a23442429fe01853ff010e697e9d81c4e000c4473b153a315d2b3d0e761b83b", - "2fa38c5f0bbe2c63d82cb364736ab8dd16355c92e3bf0ab98b60da7245d3f7fe", - "d6b2019e635c344ed9e3c5a0f9e1bd4ab276b7d8302fcbf3e9d8e4c25a375e44", - "196ca6166bdd775377c19da1b86f4167e5e60b1d0d8358420ada128cd022d545", - "0435cbb0637a66cd9d347c525d9f49a8915da6e45961979e451c7baed16859cd", - "4c623ff018d89a87b20013adacc0678541c58afd83f6ef68f385d6fb812814c7", - "266bb095ee7bc774f70746f5e35f4b640b281dc3bae630414be9c517e264d4c5", - "cbad9eae83599d85e6c993b9ef4505d43c4da36218bf731eeb952c7a636b03f9", - "457fa1e19cb97c4dd8244782fe3a7f3edc2aa06db7c0d062784547271c37bb06", - "ed5b650c6b2e998dd76de69a7ac9bfe9fbfb3755f1dbc3b18736cc6e568afd0f", - "c1086ead0ce793cd0b5862e45e1978bd7b412fb80d77de129f48b87f01a12128", - "aa230fa474709a268b4d04c7cafd248c7655ff65920baf0fbc80896a47797fef", - "55bd8925aada22b16278eac65ff9c2b80e9893f333323d780356f6ef5883f264", - "9759fd638ae7f42aa186ecd9852fadbf5d2746daa5d6c768da43f08bf51d83bc", - "7a5fb10455629f8c5f93afbccfc70df4914de3e0d4838a32ed81695b2562eddd", - "4bd15cbf2d86d2ab6b7b511c2f5228844a4758260f4c108d3477e7cfc3f4ef51", - "e528425c06fcf334514aa6f5fbcbd898e35254c6fd7d9163794dd780aad5abb4", - "6540d97fa4fd183c4bfdfbfbd72a3151358952d9099e524e28bcf0f071296e42", - "9c96ba6e85f9f553ddd7031e70ed5a78b68088e5acd5a662de2100bc209af794", - "c658ae48ffc5e3f81c8ea382a545cb80fb65399661af84a522470e30ed999859", - "b2f8f0e9528a493c87b692201f02dc4d044f37e52dce8d702c296792269f9b08", - "14eef4a72b16bb43adf4247369f0b8888f6f9af4fd7392b76e791bba03ab4339", - "9a82529380412a1c49d34387cc6f3b59d8c8c3045b158ca1fda69dcd944e8257", - "4619c21d451169e5ef226b274da653764051561f33ebab7b239484f76706f46b", - "a1d359e80b0a4ab259379a2c935fc9150bf269d6546e012c83af6674190c79b2", - "987faf08c9f6c7235e42a4e098b015794411a03d5169b1450220a9bbda19b7f7", - "1237adde181b2370ba25f6f13bad3387bb71a2ec13cfe899356b6608c94b6235", - "5497ee3c3e2346fdf3f8df0a9a45bde85039f5f0631d318ae32fd8439f0a28f9", - "4c078f264ed435feed08c1ec91873ce50f653abcf02a89c9fb89d2d510776b50", - "c5b2b4167dd97dedb5ea5e40cbda364170d71d4e0fb1d1f5e1f61a3c87e78615", - "bd8a31cfbfdd690014e32c5104c28127c613c1df17a653fc88fea3d615cc3a55", - "4019b93efa32afb30427d83cd8c3042d0b321991ba76d174fe673fe52f095575", - "04aa47b6f56f3fb4c2309ec0c74516ff5ca19e3dd2a22e28e0f39492bc37b0b3", - "b3ee7c57728315b8d755cbde35f9a71c96c5aa1a9ed7e6f4c1322ee95d0e492b", - "23d365a99b64cb0db89a02fb665b0e8564217c15f0498e07db6fca997396675a", - "31eb675e4e15a2bb9e6380fa41b8a5d6bb72f94727d651e7cd67ac95546ad126", - "73ab9271ce09c870bc390bab3868160c4e4b3a8ae58f082ff778f14d5c3dbd28", - "43fbbf98efec1e9f28f308b7a094b2cb6a0a7ad376542f91abf6d24b28dad669", - "fa7e5899bce998e5e9cb80c2dbaffbc259c6bde52533d473c34d71481d3abb18", - "426128d0f8dbbae148916b22e7e30a7226ea90a4c907963a2f326bfc9a7e5b3f", - "b9437be81273dac06348912753f28265afeba8155670c9b225405f0deb784dd8", - "2f3850e82ecba35f1358c71251bad73fb56935ad0bf2be9bf97549c0fe468160", - "715defbff92475ca67b7fcd2b99db898200e4eb36c8f904225438ab184a5ed4c", - "fa90489ee254bf94b3776a128433e9f459d6f5ccab2e8bbf7a47e8b323dacfe0", - "d41f6810fc05a62d27c145e6a295eb9d54799f79c8bc942c68dc74fcfd460707", - "83dacf0cc1ab0250c22aa26cd764c929197f49178580beed6f4a00bc2f3f858a", - "fca8154b2d69b49f81182dc09c3387acb74cde1915133bb0b28cdeec197a1021", - "4b6bf5ae2bc2eb5c609252fc17fe14215167c93ee3566ff2ddd349b1466a8d7a", - "699662e0ae07d5112c2ba8d1a3c519321d3c8e709bb4615ff2d09502d2ce9b49", - "1e192b3854dfef64e9696ba79915851878f58d6ff4f26efab7dd4717ed19f398", - "a68db52e916f0ad7cb56eaf765e70f0c6381acc4bd0a6eb67f490d87ce099be6", - "abad7b591042cac1c65d19b5e24a491d0e52d98d18093f899b1ed915f4c75c41", - "453d78fac4a33b76e3c72192683dd2771b178ff46ce5c18d74cb8094353a5f1f", - "788f5225b5882a0729341bd3d56596d7568bdeb8fa35d2a0918e7b556dc549b9", - "291e8c01e0507abb993e721177f2fece691c8108fbed4a587536a5511390bfbf", - "887cd99670b6ddec3edcdc049df9cedf7e372b2e10298ccfd8b291c037292384", - "79c3e9531c3b028bc3a2394e0eb0d713c3ed1142f387c67d30633162c190188a", - "3287fe2f36957c878fe512adc39b4bc1466f89492979ae453df41bd2b196acb6", - "7b4d2a21e40d82c3a0d2a395a7aa5b6b115e285cd1269927b072c475e81ca83f", - "f99393c9eb84e227f28e29dccca8528b142c1902ff1549ee25ddb714b7bfcd4c", - "cee6b3a494da4b1fb19fbfe2e923df14c8914313b9b058afe0a952d402eb111c", - "9fc8ec2612a07def807bb991a0f8a26e0201280cae8773402dd48da337f521ae", - "1557558eb1347ad0a1150a203dbdaa11e006fb843348f31d33d7a22108a7a80c", - "34e47ea13105d938010264495ec458ea28a55dceef40621a7f3e972e909c6b51", - "76481b9bb19898755a04e6cbee01b4cd19a81eba14f08ea20d58126fdc20441e", - "06b3c05df6ec4edb5dba119e5c2494a5a77590903d8e8f8f2f79747af76f92ba", - "71af0c47ce1f8f05ba296356ad9c83d8b185ce6cb29462f54817527cb352b314", - "24dd531698e3b128aafb602b33580b43d265b1d521406a1b5cc76d60b6fe31b5", - "8d9fca82e48fa2d2a4b11a205ceb541438664bd33d78664d26d53979afb4371e", - "922419b80dde7a8d04d6abffc7d754f7288e05612e6ab8eb86f49d6856dff044", - "fd7a49091bddfbde0aab7ae43c721f8bb0c5b035cc9a31c07a775e8638236381", - "3cdb69562ef232cb213a0175ac8ba1c632a07977b497469ee3fbb2a3a5485196", - "c72e545fa22fb746b57c8172a99a238d2570730809fd85f68d457c227c8b388e", - "7b746c22a84d7cb4423521b5def8373c53004430f73b556d226bd24ad2e23a40", - "f666d3be9030c1713947c93bd0a0b368e94762fca08b99d3392aa098c5efe2b1", - "c37ef2dadacf3d2a5c7052dfe52148fc30d370d5846e693af3890361dc5686a7", - "7e89e89773f3207fde23890010da7d71a1c2c84353441aff62a155197c4cb441", - "28eb89a2f3513d2a6e5091bf8e86f52b2fef9acab58a4dd9e4eb9a85a4ec84f0", - "033f94da796a40848b4e712887346f32036ad3c77bf907b8958b72db3fee539b", - "82d8864f8d485d6cbb8dbe71b725149bf5a6205c5409fad680944d5b03de94a1", - "962042e32151811b4fccc1fa1b1392276b640140aa87f7dbc730bf8d7efdb24b", - "7b672744ea92f3bc8e4451e5201f02efcfd107bdff2a56d241d36210241a6997", - "c57d99647e1a4642bacf3400019f82ad63b655e706947522d04e978082a1d51f", - "313a99f26b65b663a816a4eb711dc0a32d9c9a993ee44eb71ec242e9b0457e58", - "f18fd5375b06416c82b21100445865d583d28de3878f32de42254896d7e4ab82", - "ecfc441cf6e6d0a24c46da33379e55f0415e5fa59762fb6cac8b090645a36536", - "4f1226ca07c5eadfd95f7d44d872b48eef53a3e1b94f0e35899bef01b387e413", - "160689fa1f46c38b33279ad51c75d452ecb0e1383c3e9070b27da45afaf8a534", - "620e0c494b520544197b1fcdf99cd078d859660f947d5901a5a2b4579ebe739b", - "fcaa3fd8048c6658f8ff1991bab0f809fa9d95901c59ca7ce51560be2d544bed", - "6454b8ab30352263b7088c25f51f431cca8a8d296e6f39b053bbb35b6bfe71e7", - "50491d15e784cc475bf9115555dd3b373db6056d5264d313222470886f7e94a8", - "2dbcf8c9c3280ac6a3af656d054b6c6b054019715961e07d4ebb86127dccce4c", - "bb4e8ef22b480b6570349dddc49728796dc088fa32e1f3b09071e0f936171364", - "23264962f4dc79444dc7af5c7485c3f46120364235b8df5b44fd3f7f21a562c1", - "4e0b94de9e150691ac8a50916327f9794238cd75c12e59cfffdbd85311e77883", - "2c2fc734eb38ec22cfcecc42b58a406891151450c22ce225548219f3026fbc58", - "f5e3a6b76dfb1493f40dd9c2ccd6dbbb20e5b50cf6a6c895ae6aac1ecce7f05d", - "102bc2d9afc49f575b53c125bb6a6a4b769152c4466daf209cb6e85a02658d2f", - "97c1629791de23f822f5bcbdd18d47df7bc1e9b44f6cd09386e5d24f381499ba", - "d419b7a1a1acfc6c1e33dccd8f956c5d5b18d05b6bf13207624f4d1eea01446c", - "914df83e46f8b0e6ed502b76b751b22bc724664c88f3258eb4e174bc2d07289e", - "4c8fcfcdc5d6a16d8dbe90e33526b7a659a4208d8bb0287f8d3540d1d064f21a", - "87cc7bd037b4adc09e20153c0a936dfdcdc52ee47369367fb03030a2319c5e99", - "b802ed34ca17dcd7d41a3ae7f32f47d8889e2a9b015b427fef59ecfaeef6e4d1", - "980b7f23388b21c48680d5cbc1130f79d9c34e3736b0115835c1eff150eccdcc", - "2f1273d54477ae2ba901333cfcbf7013740346e5e7afb93df77be23f0a0a093c", - "b682fbce4f00e1c55c3def3799bf2f2ff2f7de1f070b4464c732ec9266c1c07f", - "bb9029c565cad2cd6f8092f25139e0242339047df7fb19e8bbcd0aa04d1d3fd1", - "2a500d6b0be3ab10c320c4a9d5a5eb564467e48dc8c02df9dac1f6dd3ee47186", - "a09e442cb335a5cc189e2b2e61a5754cb2496895c8c20b6056bf257b426776f1", - "4d8dd10b0298a8d2dfb1404bf041017798956dd93b16d2b49579a4d6f0d74f37", - "2c3d1f744393bbf3bfdbb21e195a1a175719602d62fb0798ce53ab90231da098", - "822826a6abe8d63289d401a89943c3214fdf87888adacec848b34005fd4fcdfb", - "73f4748ad959d5070d902c5be1195fd26b5c2b37ff38604419fb829fcbbee85b", - "9d2fe259c911bfed8fed92b6fb010760daa9be9aa1b1f336c0752604220eda58", - "b169442c24637b71a1d4f78d3b46924ea0fe8d15a3206da36615985b233cca02", - "adc96dce748e377183ef88a41fb09098e535fb18a25ac2ab2ac962decfb1f5c6", - "95be88f77ac9848ea214504bef8ab443480e3a35327a03139c8083e5814c2428", - "8242b12f0b1e03718c55082d8a25d5d96234bc9fc7314c449dc9968c04d105ad", - "d8935e8a15d49421116b7892b2303a23396b1259a2a6b2f86cd0362e0dae2f72", - "617d0f8a000418560aa91ad1acb8d4fe264a05180486641fd77c978a5cb9fafe", - "03782ef873bd32ff13516d2bead188b80ec787ab44f459acacd3c5d351e255d3", - "172eccb4c45214d2c09f78d03f3d1c0f4b51dbd383fdb16105a8825bdf8b480b", - "a5a4cd9e1e158bad35859fa9cc53e4124bb48ca7d47abdcaf0f9dbc5a38566d6", - "5d6543268a287eaad073c67664e2fcd50bb690823a07ef1e568ca0c284dec6cf", - "76063c3d052821acc65c2af72b4fa4ee04ea36addfee05c530c22a94bd1cc90e", - "4bc88c4d56ada49fb6527eb9169874cb42c6ebded6d6a10cdb6710ade06ef439", - "23f40108e7354bfd23922f46c7b9569dad1abb98e7abe44440a7f5b0c6fa585f", - "4f779b04bde86640265d19470703f25ef9f78b68243ad9d19df5df6e23b380b8", - "92face0c592589953884e99b579a5f794321ab466d5cc47e49f3c3ec1a361bb1", - "76092654714a9ee4f5ccf48f7f80b0286ff070eb58a2faf7f0d8512dd30bfe11", - "870a1b34ff622157fd15872ca6bf08a8b2b03854cbed5d7a3ccc15b6dd896186", - "5125eec568a672f3dde68ee077bc4ba4eb6b41991e89088ea47995eefb1ec21e", - "f352e0e6635f529e2b32e02cc1fe28b26366956d625fc91a2c570b5ee7bc73f9", - "3ef9bbf81c8be826d2468f5fee2487b7abc698a72cad1a74a1b0fec12cfc8e7e", - "b9034bcdf9db754b58927a23c71a2bcc55e4d0e9e16e54a96cb91d0d26c69de5", - "e0fdf091cd6b4d8ecf4e4df7737bbee744a3f78f47f0449116ef803d6cf5af6f", - "86c9b5fd5fd35e33c322866aea39ae60d0c6172f1a0161f8c69012f3407fe74d", - "10505806aa401dd90f2645e0e9b79337a0a321eacae5b2eb941d012df92af7fa", - "a088dd4582136607d59584f5ff6ae68d0cf2afcdfb5d287792be87af53c06395", - "8d0717548bb0e5606d6eedb19f6e41853fa98f33314b363be93e64c77ec6e379", - "88eb72dac122935bd0c8cce7edbd3ae10536d0c26452ee41366f9780afd7e757", - "5d16ded95652629985359ebde1def665d3117544f15333f0be49e9fb099f0d8c", - "56ca59fd56df51bb76c85442bdc18720ecb5373be31101be6ca4364841b95150", - "55eb59bf520e067aa17d883544373f16bd4a0ec64277c433b0bcca4c90ce529e", - "0575658cf11a64113e994bbf6ad42755183595466fd1407040b5aab209fcca93", - "efdd411b4795dcde491824b93978e17fd9f747aa7db54ba2117c3039722dab7d", - "e4d84d577adb96b152733682607d9b6e35ecd29d6e18857faf4e34f861f6508a", - "79c2c78aaaf0b1a186c85b8f192371192806d0f8b6c9ec8b5a1293ac43ec89db", - "07290ddd96cf3ee9277e13f8a47e142d8faf0480efe5e4afad62b63ffc60db39", - "555dd70a5afe2416265b30e004f2efd99d102eff8c234ee9419ce4c0002d3d1d", - "1aa8d020cb9389f4778afad5f061d5e8d95f78759d51e456236fad055de61334", - "77e334467b38252a3f777edc3701081089ee9ba3465a26b0afb30246f09fedcd", - "b7d86f6d435f3d9a394fe06d9a24e04f54ae7a19b67f264055771805cbfe23b7", - "c16834bb6106cef9788e189240f2e5151975a3f28af5fc74cc255bb6cdbc60d5", - "b517e1fb54451e5216868e7d56583bd97f8d66a94644ea60e49e009ef3b7346e", - "dc07e74ab00d575102edac2e0feff346be6f588d91ef9134d607ecd5e352906d", - "f542873e4fdef7f250babefbb3554f30a18024aee771ad64b3c1bb71f6c1ef29", - "3c8846afb500d343d48684dc0566789733c02f956283df997a1fb8527ec0d894", - "b5baef941df8ab41a9f57a72d74c4176532fdc61b78ce9f3cc10c9320ac0b53a", - "aa50ae218f9c26df44907f70216eba28e5be36a4937e503ad5e30cae085bada1", - "1a0a23f03ae8ea12b0604a0406446ee56b4011567f8b50e2a6ee98cca9393d0a", - "353e1b246e56653aed4317c1f18746606f2f8b89414e427f21a1dfab9fc56549", - "7a6128e115dad4668bf14727b16f76bfdf21919ace0d3cfe74b7ab70429d4d96", - "2a7671e79b7d74f61e7350491f8e58f79c6474efd6e60a58f5413bedbf0f8dbc", - "98ac44ca81760a9e2a063767379255f993d7c2ed816b2bf385aafdc1805e975f", - "a16cb4aec8d0fa3e142ed1350bf9cca279810226714ea339520517de54b78c73", - "79f74c008831eaf524a63815092a32a9d7aa1b015344e4248f16761bc496f637", - "e062c672f86e145e7e1952e4ae6e7a6a25a4d547c24be27ed37fcf16963ee97c", - "4feef4e301d0cd50ad438d67555c34ac102e2bef1123c9e39bae81032d21e113", - "182c29140aacd4202e1e75b8fcdda25ade95e65cfa1092b86eac2d1ab0ea438d", - "10e85a36a4a39d325428c0ac483fb7a7fdf7b25a961db40e23a78d525083026d", - "72f0b37af11adae515304eccb75382366ba65b639e3fb3736f1b984b539990da", - "4fda589d595e49a9e3466503a9468a15f9c9e98bc6ab129c057ea1a94492e81d", - "c7bc377f8f979ea62db343482578256c37dd5c7fa953d0c1416429d8109f8914", - "c62b32ad1de15473c371d8a59521afb66b411547bb1bb051bdcfae2250cb9c94", - "ed0b8010aafcef498875a318304a6a409d561ba62c6f2785d7cac37f3d3d39ab", - "709704ddd74fffdfad4b4345e78872c9bcc8f7415fd19140a8ed9b624f24b5cc", - "a0002c11e89e4060cff39f54f25c037c6fa3ad264aea207db9f9bd3bbbef8388", - "9779cff7e46db470f3a80df95439ba15749e8bdab2ce88763e17356cb4b000dc", - "6e11c20da598abfc99a6b47c575e328030d4a8b495f9bf247b20e84e329f33ef", - "f80b39aa3b398bca0ef7aeaf866e81b8e48996d9f6ce0939639de7cd1a14ecff", - "1aed0b9f9962940c5a19287414ceccec5efa0129a09e857971b0e7b3385f619a", - "833748be1e7f081c6c3d2c42111900d199ae7b8135f82bb2480fa350d896a871", - "30918e494a4e2f7d0ff0603bb1e841e19b7c5d98d9e251bb75c2c2b3f1067f3f", - "78a152a612f67746134587ea0751890a169bdfdff07c56fb42ad21e03f11f876", - "25e5399f939f41cdf476d707a151075d67c56b6f20e6c11e80c5f306bdf5fd97", - "6bdfee85a327bffc7c5de90773b1780c288b16d4647752defcc61f83a4bd329a", - "551d505d55441b6ebb2c8e2a3d7b6d605d85bbf12af0d180a8dc4d3b28077540", - "71648ee511c58674549fb4c97095c487d8b07b920731e7b47c86ccd3fad09d26", - "e5530804509b0b012ae3165cf50048a8605420ad777c1336d22ec0d5f293d46f", - "972cb2db40770a389fcf0344ee3431f6cc428c1d9433b272b087753ea5484a31", - "9e3c2a1b4d171ab52f4d0b5f7f4f9e54076b11417355f8ec5ccb4158897dd562", - "b210030658c912a592addf5b206204411ec0dbac64890d3f7fa346a7fc685731", - "4f574de97166d3b6c3abf84d2d09a3158600d27038718ae147f11ea0b05d5ca1", - "82e068a445905fa7174d765800d0a5e9e85f3e38debb95ccc020afa66603b514", - "2d1a40420120bdba9239daee9b853e2d2f3ea06827e330c49dc3ebc7688cebe5", - "cde1ec7388ceeb3fb37073e31426368b8fe8bde4a77455aa7f8f170b4fefe338", - "3df2f161067645763c847c8f9d2624eff7867a9d064c9e2a0babd3dbf9580c75", - "6146732712fe7219db3c16cd3bec64837e012ace915ee1b53e38d937eaeb7d95", - "407b5f78f611b5c13283e1a6e20e5e797267871a908302934d992676972e0e11", - "b33aaa045b1e46d8024e21f4d595c5ceea902c7d513a3b13ab76dd02aba42fed", - "523f1dccd2d33433654b45ddc0cedaa38402306b30a2ae5b8a376f804a9b5736", - "6c978c620897505a767431d143deda973c50af7c5fc358db6ba2d7ec7aa7e937", - "2de3b6ffc5e80ec652a3314643ca815ed318bbd9c369d6402b0ae3221425341a", - "c859f03cbf71b28c028a0244a8730bc727faa5cbeb09fe808e55e4eb8027b2b4", - "24a6e86019c67667693534669d7c74be3777dd568137064b3dd32e44a56b063c", - "3df63993d703842e36e6550b4c92e80917bfcdefee693895b9c394b40ad16fb4", - "23d4c67353507cea3d6d7be89d80226db12e31c760e853d980186c6884bafc75", - "f8a1a286c63439825bfaddfaabe465c0e86ec57eadf70860aeed322b5f6db11a", - "84b7f5eb7d83458d674312e840be4f2fe40efff4b8120a488b85f009812a7208", - "046a65a22586120d2d17a4ef082e0d7ca5588eb138bab9158cc70e52b8f9d085", - "173e167f3f9eba199885e3cd21a68c7a74a84a00e86dd7ee53d43fbbda948613", - "8db949d2e1658506ca6f5cde694369a0ffd90bf798c07f7ea13c70e04fc6c823", - "0772399c8e2447b87fbc5a5053d5fcf46d637d96e28e14197cbf09d3c3187615", - "303a84d999143c6b79f4f955d2bda83281366d6972a6c81db10c622d0a1524a2", - "35268a8938647128108e5928287f57612d9ed97aeca861b4127f4a4c75c3e6bf", - "1c98075820a6284166b3e89119ce0689b4932e4a5e39718672d55f4fd831ab81", - "8040f6af2c52d4c051e8c648b539dbf22f6202b4351419717704e0c03b7c2534", - "47e91e10b6e4f471a7b2d45c797d0f41c073ff2e37bbd26b9fac55069944bb36", - "b6152a4f9ea44fd855743140f008963aedd55d04840da851c35ddc25f3d1476e", - "489e82de3d5035eea4007e217d93afbc209f970946d4756961896d436b33da6f", - "db62e142c10ef8d3f0ad9a511581221e3f610d961e724e6fd83cbb949c47bd87", - "2dd04af01f8888de39aa0173a3b3c3076d60804d857c70a1d25d2ddf43aed9f3", - "11a48e7448db4a515d223f3f75243750850c81f3bde7b418548b683f9bc5bc6f", - "bfebac6ac4e2a910c8c8d4a22e2563c9bf6c1f6014e052411e915bfc0af1b161", - "a28fb16f77ecf04f5217ae518245b29c0eb520d7bb1a058efffd250d1801afd7", - "c4c77340085bb93e78b98c582959ec5b213c562d93df97bc51448fe7d6a04b1c", - "c40e6f66bde37550c6b1538ed5170bb28c8a0f6fb4e74e152c7d2e4edbbb5a4a", - "5f6f9049b5103ee235a5c59ea0df625df5b5a2abd62f6707f7a5f2cf9b6dec75", - "3b141774492c5d386bc313d583d79d1e7a524d7e3ac4d90a294a2a6b6b1c9ab3", - "4f608a1010415f4e63eb2f8051f90e5cc6f9626cab2b54e56bf71f02c332c334", - "d446f7615f3cb5c3c693436dcd19d74a24b1fb0451d20bdb789f835f96103ede", - "cfeef2dbbf1443d062e59ee38e8ec6cfb3f860be7e27a79c7adf31a60787c44e", - "28e9f640d8bea41a3c419a3f89c55510658b773978a9b14fd1b4ddd09bdb89cf", - "85c148855e771453b874d6d9551512672fc0292e00bd257db56f64f0e5a20a05", - "1c11c3fd4065f298c8a0b2e46cf7ab15e2aab9939d966d2ffddcc2aac63e949a", - "0bd11b269a18bce0d98b0f0d04ab95bd369ec9cb8eda3ed486d49b852ce7aff2", - "afe4488347f23b57aa9a72b1eaf898f15d89182aafe117f60d0ca0943598d60f", - "555233d47ff204db99a664bf5c11293ec204ec47733bab4a708c77e25170d8ad", - "677d80aa956b7debc706c9393700635932ad1880e34d372e8c3ec343a47aeea2", - "b9b1b20cdb1af6cc4f158d2de4ae6303be9784dc9ed02d23307c159f14223f95", - "7db8bc870c0a6e546205d0ffa1587cf68d32c59b5996731c57e8ec5c0deb059e", - "677e9f529440233019e427532095787b6aa0d78334797fae6dece7f750bb998b", - "93746077030c25ad8fb8e7f5c1e82f072af1590eed9e05965a511913dce4777f", - "4700f815f81e9205d39952eafedfba7a17f57f1d919498fb3afaefa61c709e4d", - "b285652c4641a339d70d5a5ba924b424473de974921f0901033bf9c3d3eb71e2", - "aaa3a6d3605470d4718dac239720e57e6a62a81a504296db11448d3e0c50cfa2", - "915dccd05f18e46dcea64f115f79130c0e358da4e7ecdd2729c0a44e1b910ac2", - "67dbd7bb4692698f4be61ed56cfb7f17146bb6886541281df34039cc5060188e", - "27949302eacc3c2a18faf13e1beaa65d2c922fdfcd61d5659c905fc714ec03bf", - "2bceb66870192c9e5114b84e9de6b1583606af6478e4e9ab0e235b9c917922df", - "131202223e3b694609613e93275de81e106baff6a9f9335cac00d2e06d3cb696", - "dfb51c517ac9e2fc8cb9dc9d0d612fddcb74a8f635ce91ab59f6918b5e66b17b", - "e15e6e037e27f1e5bd19f661bc66494deb12902059bfe0d439a80369061a0137", - "972c850a8b12a050a85ed086023f5fbc4aef03bd2b07216dacd7c1c0cf684a41", - "b7022b552b9f9eb800cfd1225aa7661c96f4d3f55b6bece0ad938f9c96316b22", - "489274a829b9fc0f8770952ef645877d67f0288266701beaaf2012f0f1dbf2b9", - "9022bcc5c1e94012e21734055d7edaaf2715547a34ecec24758d83aee2177764", - "fdf646c897efcff0ddcefa9a42c5fcc94afdb635c625c2e5b84177f45abe8c41", - "d524a8685bf65601855527170f2b43f5447faf5b1d789f674590c9944fefad33", - "4b7c7b33e886a40bd0308453577874da22a1d595c62ffd46e1f441a1e0e5cf23", - "d638759472a504bcbba96cdbd402dcb12b6444e2952fb0757d81a956fdabd85b", - "bd4becb4c1aad108e21bbdc201e3d491629c0a636c6ab17031aaeb47ee1f1221", - "5d1f901f4cb30ab7dad0c3133c9368e7b91e34a92bd28287e6213ef63755eeb0", - "811ad08f8114460e77099c062808eeebf5a81d2e48c1315d1394afc6a15becf1", - "9b65ea4663e383162154965b9fd1d65738e71b81c7f99189a98231bd86280ede", - "285a2131dfb267ed422b27a643af50c956acd0b721ac908bf0ea48694cfb0bf5", - "d60a1fa27e1a91e8baa7ccd559f44c31d68fc65d445fa4f907c5f24a8b2aa947", - "991073de6e3e4cad8886e0e9ff7829c3e3224dc62144e1e66b19bca0f95cd602", - "f1f2b62957cc0380f8cd1c598f27bc6431ff509a829c253d2fabd9214a74fdca", - "b850458b32f00e6fd15af8a0a3bc3f91e8adbf20b330d12278bfa7d58493132d", - "25cb0e7e57e84b8ff2bc068fa5a6da810c90e07b77beffb0d445ab4775e11ff5", - "4cc1bfb0f832137d7ea6c4d1c7d49b99abe40f3c65c272a67515066e1955b698", - "fa1420ae02dea2a091c71b278cbb442f5bd4db234d3f868f07d9884885ac342d", - "f02b18cb2f44587b16a3ea0c96d19a5ef157f4aa7039e03b3018bc497d3cab8b", - "41fce95d4c785a15122ff0b5d38d6314c8f7424e4d6b589949e4234742853fff", - "e714ae9505aac3e4050325a94216d88be73d2c4645de36cf9125b04fa8287c75", - "bc45a4ea5c94e93d5691ef68b6cf4b49e4ce025fce0e9f43dd2a39431e53dc63", - "d8b24e0750ba7a1a619dc0fcf8bfb175f0931c92df7987124ab7eeec8f025fa4", - "897f6390ef199cf543e069304cda27b44d76a1888e790cd33c9c02366bbd545b", - "a47cbbdd998f75fc3f659686d5848c6935ee16a95d066bed4e2f5aadbbad9bd9", - "54e6f94aada4f1b0a8f55cd0c97edafc69ce4485630ca3150edef61e1de5c604", - "e95bafe54bf1a8b74571ece79d8c4f82c8eabb697cc402ccd19b2c77d3ab35cf", - "cc26c36de79630a277c1ea968db1dd60fc7921009d5b8b59bf211d3ef793d7f7", - "9f2313f45da96a4b6bda10c234f73b4d39b26dac11386c32da8012c61ab28d61", - "12ea23fa0ee7686754e8e28aea371649700aa09919cf0112051b7fa4d18d365e", - "4305d9da23ca1533a2e1a7d3766775b090eadf0f6e12f5d7057e4ce66cc10b96", - "84d808784c1337e226b6da85964e49923f018dd9067fb1a818f54218943768bd", - "0cc7a45c09b23b6792707a0c5b61a13c8ce1e170b0a864be3b9833275df42414", - "180bee1b654578cbe403749a23089dbdd8ff3e268ab6933f7bd5bc05db7edf0d", - "8c3fcb9dea2750466584b1d43921798507ba5fbce698c8be0c8df24f4c8911d4", - "017235fdb0a2cf0e474f8b5b0757709dfb304d1dd4cbad78a95f250ba52c9956", - "209416ccc15ed0490e88dfc8f1f72d1bf5177567d8e71d7a20d0b9c7dc2142ed", - "2283405049afed03146cf34fac96c5ed06a57a25b61b926cce8c5a80e5302101", - "8daedf24779066b6b9e920dd79f76e14b36b2a82b58aa6629d317cfc3aabe657", - "3a55989f82ee7c13d59ab71633b94a88d93ef79a5ef4c9fe1b0dce968c36f3be", - "04501a09b028de99d1e0377cb9feb266fc1920b24e35728567f48337c1eaa8bc", - "74228334bb76071c9b89f1ae32a64f866cf18d5c35349b964590c1391c3fbf9c", - "103a07d5672a323ea653b707e59bae6b627d215006a42ffbbe8a314eebb6d2d7", - "5b1e3cb069e4463430858c55cc1212ab363680e0222235f10f60dd6c84109af8", - "689ca224c276085429081f4182785571efd4e4a2eb41264fb5c72bc8a97de51b", - "a9f1906e56b21748ee881ef848456faecab8de5130946f92fc5b40da7e15e2f6", - "412e66385247d3dc0d66d072bb651697da1d50a38cd59507f473d7eb0d9c66c4", - "23b7216576147cd38be930d19261a1ac05d971e172505ce87b460c492b35d856", - "2818ff1e5fb395ea70e1d5a02713d806ec80b3a79e1949e22397f5d8591ed98b", - "abeca0dfc04d0576fadb9416b41ad98ffab7dae4dfd1be8f9dbf60b6cca449bc", - "44b0c1f22ab5d64b2254a1728c64ad3612f9e22db282e2cdb817e0fc0cb559bf", - "ca34e31c3b1a0cd382b1ca16432a16e88287e92b7de591257e90037d4d6c3307", - "e2f5214760aff52224583b420c2560507a2da9d7f025c99c1bf1cb333f49c368", - "7be39500574c3180540f144c6fc6ff8a21cae7c108039ef14218a3605b903559", - "80583a12fa4a9e6c0edb35956713458aa6425f30d7589f953e78b2ee5af73da7", - "c11a474a8e323ecd7a74618e4d63b6a0bf157a8c91ccae2fc372713e09a7b3bf", - "2ae1a19b2c4a4d01a8c957c0ceb759be62fde265f9883ae1bd57c8ba4f11a320", - "825b9fbd1296f5b50626b84e4458de2ae17c9a7eb7da026878857755cad7e857", - "972b9ad241f95f1de56c223f8b14f00b5deae2f9776be03eb141efc5466217c5", - "cbad3c9edbb3eab99749e9d763d9455038411a8306b10d890e499eb1ecdb9b59", - "7f74411a42fb980c6de73af68d970943815428f92c8528a518c1e484b58b7005", - "9fb15948024cf109ffd0d7ae71e237a2f9b330666688787cd25b61904be0fd2e", - "5131759421369faf4fa6e8eb6fa79ad08c272b3e0baa8e1a9a89fc51cef724dc", - "bc40af72e2205ff830a2f8d99fd550fbedd6ac332397605cd7c120d087a1d71f", - "edfdf548266ea7b8df028b0e92007e1b0a9cda8a2be87c4e4b60387171b21065", - "cf348cbb354b68b780679bf76a5d4198112c5ecf15fa5d3128e8912169689073", - "54c6f73690c281d69cd1b83dbb9e71c775e24f180ed980d98eddabe48bbcc5f9", - "870c675b2e3d39b6c9b5f30b47d828a7e821a100b94a6d4ae781b176443a5c2e", - "5babe67eda35dcb5e32272098a5a08c7f6d2230095a1544793063fb94c4c4b3d", - "07d799cdd848bee9a81f6fce2d233d666b616d6dcbc4e2d0cd8c7b2e8dfbb57e", - "9f99697d625c4fc166dbe2742efa50951144ce19781e71c4ddfa71b9e7420233", - "70094760629f133f1699aa1b46bb855b6728782ccdc0e468a63b61b8b5006092", - "c7858537c7214fa5050e2c076864db55f153c4eb90d551a05fd9944fc2c0d832", - "73ec43db484966e03ea3f1f05fcf2698a853a78f291c46157c1590fb43ba9306", - "fbbc56abbd074ff42e08b0c4867a46a9ad7d69103d4f2a1cb8d41c9a7cccdf7b", - "a557017546527bc7b6c1302f079aa96e098f99fde5df06f12405b7e07f2cf4ea", - "2b4db6c94a020967d03ae3d6a5e9efe71e4ddcc0c4543ecce82cf0e48246785b", - "e32525a7fbf592a816e3d23471d923ed1556e664ee9696d9dc2a5b022f738b85", - "b24f48273c51d940773ab093dea1e0a56bc431de27d35f81ed286e20b2a2fbc3", - "f962194fa706a10c3029a2a821734b2dc8e094602108f157a20ed001108d0878", - "03ea7e47c40f30a9d4b4b2b131fdb7c12fb51c91b42d8267117373e1dc8c431a", - "eb7ff55a4ecf33ff6f8b0692f8ae4b1a1da853bf280b5eb560f9236c16d58159", - "cece8d6f43f756a710f0c253c5b66c8f35d8c45723b023051005a5c41ce3bbc1", - "43dbca2153d8e5ac396d61cdf7c7b8bf4456659e9f04d170e06c5cabbe548216", - "41b40dd56d5bb643e80f789472f05c66af8a2ed09cffae3272d85b05bbaa8b4a", - "bcdf5570b92fafa1e0c3d965f6e837418e75246331396c093ec479b8a212e8f6", - "67c655e9cf768c359755ee86e22070041e0299182ae00156368738c1bc425e31", - "b7da10d56d1d7ef99c7d55d4d2bfc0ade24ec75dc0a20d0820f6c0b369518471", - "15099b6980f0c18154735c70a7a8e17cb111621cc9b93dddee34c42420af41cd", - "312dbc291c0b1580e7cfb747d94bfe498f135491a74014519847a87b2c46dd1a", - "0d9a760b0352ad111a0a8624402c51cbc5e2b056d5a67caa3e19cdae01ab86fe", - "b56c49e77793183ebea8870d9ecdac10354aa47a39753706d80bfe63826fcd87", - "1413391108f5cdc9f200fe6b999771548029e6c1e4367a6a46c5190548ff1b01", - "016738193025d80be4d3e930d61b0b342ae59fc73f69a27849fe7a31974eff4a", - "2df5af44609e8532c55add3b1a18c1535aba3d2e01f9ca16679c8634f8fbd1e9", - "c0439939129e1d210804d4d447a113aadd915dc00417c7695661878c5254a3c3", - "7d13ea28bcde2f78488cfc77ff7343166aa3373a2ae339a3298b1cfe0436f5f0", - "11aa10f9040d54e31be2e5b596f21cd0868ec764285e9a2d60e236ea10fced06", - "51033886e68bc20762334530675dfdbd4b71ec1309d795d0a649671ac95060f1", - "7d2d8b07c6fa5d1edd553b9564f31b9a1da751f74b56526ab567e00dbf3f2771", - "f262a7465d3c451cfb0bec422bd1193307f89951fd85b5d2c7fcf994c3b638d2", - "365b9c1423e4911c4415af104bd53ed79629be2725f55edbaead55d87deba723", - "05430d5733782991d32d4a41351a6bc8dfd93487ec1e659b6978201d1cf67252", - "db92d96754d69e85fc8fa5215e192192b2a4832e1da930bee9d89ee7d81e5a8d", - "29af7c1a4d0a451bf45cb5534489a475f226f8233b9935224d77847d10e37079", - "19e2a0cfd57c59a027e3e0703e2264ace97c801aea94118838252418d2c746d8", - "f1b2b4448abc4f16c44b13cb872b62512e1a0c58349de13881dbf611cb2e156b", - "2dfe06c817282d96189322f71fefa2e575fcd1134b0536781d6433412226941a", - "d14c85871525d480750c9db3f839a31ed3e43e001d0928dff4adf61a3b150f86", - "a442b4d2b9d60f25ba925b791c59852a8bc65304f70e8c13b111af60d93bf595", - "33eae4b21803abcdb98c764166518ad9671aa0ae1aca126712e5ef59b0cc45a9", - "382b40fee8a4c6e9eeaef651969470967696cf53058bb95c78cedc9b87b8591a", - "d0d29f8439b0d5bf75d017c183912eb91212c2c037be2628d552844e7a7a8d28", - "bf57614cdb15363ff8fc67d4e6fa5d7e670d1bca0f643aea9cc946510a6d26f1", - "c12e0df992a33de1abbcfe396e7ee9631d3778050bc3ec3567965d2206ceb5e0", - "e9192829848b6fcf4bd08b8ab49f98424e411b91dce29af91076f7225b7f53eb", - "3b6117a2fbca0c65623e66de41dfe1f792c7d55895774415ca591ac0f4ac608f", - "7ef6418bafa1d2343bc3fd5f7424a5554dc05d6b2a244c035f0a8cbd0de0979b", - "58a8c0a67218273750565b69ccb04f111aacc4a1f24ae30a5196c0ffda8ee014", - "48e3be6335dbdff9e842b856245de57eb5e32c6aa96965bc8274bc9ff1681423", - "e8e05bdb20bd6dea825b0536fb365ebdb06825075f26360d7360dfcbdf5af2f8", - "3aea6fbfd695aac8e9289405dd2c367a96184719f05562e1a18f3d5978e7236e", - "ce42761f0ff2cc9dda3b6a73bb6a5720c9cbf2d2fe05174fa828d537c358f1b9", - "a5a488938c8f5b55fe73507619593b3f33452cc8b97d3291d887d6d808e7b39c", - "e4320be1b55e35e0130ee136ac3d16264ce070d41fdf273ec178c72b5549a53c", - "6128f51c6f3600f77f911dae41670f125db6af6b0bd9e098a62cc1d05b70d7f1", - "40f32ecb0a3f947715f80f6324f75bd607ea36267d2d0737e23d9eefac783402", - "5bf50770af4e43b2507403c1cfd6dae6ac506fc8f8aa450da38e122e08ad753a", - "6ecf6fd3e871bfce2f99621d2a93ed967c0dd8bf45719a7d9523ac8ab73562e6", - "3c3e641a588747bf88d5f03fb4ee3b7bc62f25bd3c907ed6719c678c16d0787a", - "cdfabe55df50c33385a7bfd9b38704b14e3501b08e656bb9783d63437becc45f", - "58e598202670ab2cd0d7a4647ca1244231ff288e1d8c0b623dab1748096e28ea", - "5ce2b8b9efbeb7536249b17a8e72412272817aa54f8a3e50b8fb946fbe318dea", - "ee7bcfae3d3d1dd2580f3bd2bd9a6eaea44dcb923416ce70e21f8a1554524a33", - "f7d1795e9b42abbed9f98836779f1fb94d2dc3b917e1ec5207e58383f39f6f51", - "0225f0518bb57110413a9e4c0f2c1dea4e8c57d6bfca0a95447f0a3c243a2a25", - "af1797920090650ad596a077ad0c686ed4ffd1e6fbb600d90e7593ebbc0979a3", - "9a8e000886533d29bca400628cd72b12e49c794bb72c4ae028bd7bfb64fd472e", - "ddb4a4759b1158fdf1b7ac8dec1fc373bd4b0c413cad31f15eaf6c70694dbdb0", - "d1663ea5e5623cd6ef0cea4da61a16b0a9116baea755c91bc24b69b379b66ad6", - "cb123de26aadac3c3cdba60897f7e9621d030c32a87c6fcb5e32136ba83daa65", - "feb83f0a641a21a446ad686b18ad6550c12f5ec7638ce7a8e4fbdc1fc85cd793", - "6a6741a5b768ee3582d592292e8d728aa45066b868c15c70a7070baaa85b6cc4", - "858b62505285f34385afbf5e1f57194671783c8c7dee392fd04fd0735c461ea6", - "87618f213a5c0f64ca7d50fd56e3a3ef90083d911adf284accb9c432d86a94c7", - "491c142322e7c2a751ecf1bec756db2c7f814f14b9c8958a462706e213d6b28d", - "9bf36458fe75c4ca0bd7ad2e4824b64f06ae6fa36476efef07f3f25e7a96f8eb", - "be3c3d3f4edc27e764badfa0e64a7e489ecbbdb46dd6d1114ded77975c07c2b5", - "e29338976addaed13c07ae34a1a287551f411d6a15ce838790a544ca34f789d2", - "543ae9d30d3635a673d5e4ae7bceb66bd1b90ed7c4560ff1c7c430d99eb92850", - "f078aed0dffd49f9d9f0c431369e117d98cf34f1d25fc58fad1abec0c9b00eb1", - "6b1d6a25d8f84bd24c9b09ef44c4b7740bc253b2c0a770bcd4a46dedd0c04bc7", - "9c469fe44616f06dfbe17829bec5510529e904e3a77acc9da44a5ed1eac199ef", - "459836445622b3e6e701d9d7574bdefead07ad6b4b345ecb0b6a915a0bee8ba7", - "154ee84f7d92022cc5639407fb75afa4889c4f2a93d7bcb201bab750e6dc2480", - "9de7b92b0a38ee14f774c57fac676bb13035028980c1e356a60669c4cec52510", - "5accab0520d472c9c529c9bcb8a95c8ece91eaf0e33ef38a3a6f35999555b0ec", - "34db2ef51973bb89a6cfce16c45332da92c1d3971a27bb274f25cf880ed6459e", - "a80b96696e9ad03096d789e12a8943efa4f71ed0167c7d3910c79fe6f871f479", - "3b6b60c8389ffb95f51a592724cc2d7162334974c9612a536772cc6f6422237e", - "3b4c019f5417ae10955c6e63c1d239ee0465e541ddb61fca42c26e42a853937b", - "1f64a087b29b89f79af9b9b1ad191960a403d748833cd19f1b087ca56697f9b3", - "f995266884b6119e6b6054bc5ce8fc6a9936fb63f655ce07a0fd8f011bec6a4c", - "457974be68cb6557b5e9f938b1d4bb0fcc8b955d31e0afcef1d32ece7e82a1c0", - "bfe8e715871599f91765a891c80ce7932ef196ed9b18d6912837c297a21f0a64", - "f095e9cd434fc3c9d99e3ce6e21346b9f53bec044fb4db2e74e8d98d4f1794d3", - "9903daf23e90fa0a6a7e556f45ee286b3921d2c40799056a8b5af5402f5c28ba", - "8e605fe86ce6733050dfce36e1a00cf160439f291404ad9d4fff147e9095d557", - "96d4e80698d036d3585497104a7c5930785516678bc135b42212f5ac0e0f41f7", - "3a90c895439e7c0d9890e9bf48d9c7331d537397266c467b7d505664bcfc3e2f", - "9638eed929c624b091362b8d063d8eb0a10249f282e3dd372bec0c092b057231", - "55b994515bb6f476f37f7ce0b77eb330befe64a00fec8a42ebbe7125309c80e3", - "e25f7e5c57804c6cb89cacef87c30bb04f7493657e94a209cd0f929ac813f60e", - "cd0d424b0c996fa31fd32fbc323b7456be011cc63d902c04f63aedc392642f13", - "5607a946338a61a46fef8b9aef6f99aede152806f09632399c87e742b850ac69", - "33eff24b39c3d4d65180623cb4f4d01320fa10c73533b7fe36ba95315339b1dd", - "9b54dc23d5ad769184ef02e82833ddbf9c512fa145d7055048fa28533cf248f3", - "e25dc3827c365796217b385757dd2c6ae4450ad7c4fe28edd16308ec65886c34", - "bb1c38ad40fa1b8d2e6f1756bcf8a6bb533cf0ebc254352178beddd8daae5c12", - "24af49df8fbbe819177a04b1ea5c6a28700e62e53743541762003a522902aab9", - "e8e952a8f15a6bfb8e1b5855b23ab3c4c898cbcec47cc7ce93e4ef05c21c4c9b", - "7eeb7d80b5a88d8259caa8b6bc6a871ec899afae2c3ba399389111ec3099bcb2", - "6ca79b34e7dc155306a2c734e86a1ad7c5e870c56fec6a1f5cc8312b1f99bd38", - "e2ac05d594f49a40c07523283263fd5ef0dfc991f37097321d57cdfea77e261b", - "5f7e94eba590c56ae1a1d364769767f81cbf2afdd1ccc67e86a7de09e081b2d7", - "374705b9f1e01a72d8424279304d15cde8004f020b8afc70a6505b5b0c70ccf6", - "b320b7c0313f40a71d3e096aad1c5c89be00ffc6c94df39c81ecf307629aa371", - "e7010a91ee70fea699108b7dff53b92fc27224c21d757dceb0b780e4b0935421", - "d6a24daa85d36c1cff0db607d652f7bb15399cf7601ad0baf4108d5daaf1f456", - "b663fbd30d27c6e6794b5f28046f03b1fa12ad7dcedb7a00f2bc85478d61347a", - "a52c4b7650a601b7c1c1d395cb864ad0f4a7a52271b278a79dad163c97ad8311", - "9b6fa298adf62cb22ae77a4928ef4522442bbb96237c10b4c6015d7e87ce9a8a", - "b795dbbb4f5e91abab9b0a91ed68a4a4ef2bb6905540db42ffc06d23df3c9729", - "7ce6253f12837567742b64fdc446aa875846d9a40f3923921b13d42dc5696be8", - "24646ec506609702e457c5ffacbb5eb9f872ba6dd6096e5ccd1c6b68c12f2f85", - "629cf4c8636d385192c74bfec62852faa55afa1dea3e7bd130c509ce07b06283", - "a07f621993d92ec0525076525ee62a00e82a1e14afe62b5c6a4b3e784381357f", - "ce7c07fa949f0fd78d1e090bf59318536f5ab8b973c58461d1a6a51d0bc1889d", - "8f39bcc3a7067d5dc1e7514577c7171bb1c79da7bbfd3103b24ed485f0508969", - "1e7da7d0eaec87c6976cdebbe787747bdbf0a6bf1d404ee402c7057878f7c407", - "a735d65a83961c9c135f3bde989f8b2f4ebc9b848fcc6fe6eb9b64fdd3b431a4", - "3e65ddb76947d43aab38f610a417679463b2223a01945fbd0c1e47f0418699ce", - "abce7b5340cf0dbbf618b304d7a7677cb34082bfbc665b38d601d383fac66bc5", - "03a45e97415a2e3d02a07a800771f2c73461d80cce245a50036c2a8532e3191a", - "34b1883b3b17052fc135d19853d17ddb923b05953ba98cd5c083e556e7d504c4", - "84ef8f16811fa8534f4bb917ff52a3ff8f7c3cd708cf7d2ed87931e0b784a789", - "1a0cd0c0564919cb11a14dabeb1da7354f43fa469328bb49381dad6cc23c7f4b", - "ed88755404da6b6a1e934240f800d6c681c58249479b87eb6feb5e7aed6ee5ea", - "2847c97796e3601f11ca1f2bf37b68b6b3a5f5aeecd43338b858c2c06dd71fa3", - "4696a1d1e80f1b61e16b0ace600e1f0e228e24f705f04d68c7232f49ef35f2fc", - "63ea9bea8c39c7765760b5eacbca762a17dda9d89ab633a24c2fc012477407a5", - "6fcbf4d56c96e561f6428c1ed0353dfc2c79594dc26572aabf894c0da7182e36", - "f95fc4d6dd68e6b3e991e2843caea7d4ecfa44f19133a278394947093d5900c2", - "d568a041004af9df0db11026537e90985c94f2560b1fe46827a6c703365d084c", - "3587d739db99b49386ba6cb10277631f239e650830209bb0b9d89f74fde10f63", - "cb4fb308019b76f5273707809d2d7405a931fb45c6e95d88898c2b5e49238a00", - "dba13fca956a5556c6ca80530ab3d16434328850d5c5542882d3a1756644c6c1", - "67c31c111c98393c316638a61c20d754258158ee6e370e1bc1b216cc76010ad4", - "efa2ce2d77905375812b32370e8d7a73f8886be5791234a180546cbb21c7ae43", - "9ff6cd25d0794c281af1e2197199ce4c9feca2adbb9593867386239a3be5bd95", - "c7868b5ca04d9385ee9a836f42705927abf7ae8151bdc27a23089bfbc81c445a", - "8d51e295dc09a9d50259b37c9855ab8239d2662a8dcd390976c07ee7b7a25bbd", - "d4ec2d7237bfcca1c29b28f032323c733672a354e9aaa3499b6d2a0ee81b7992", - "1bc9b4772953f0af99fb68b36a7478ac564d11831fafee098cda4bf9e68ed614", - "feb7578d8240868d74bf977f9e0550f6bf3517cdd0677e81abb615ab4c81fb5b", - "47b499557010d3e07dfe8576dc8db88fcf134b35f9daa186b97d737b2914c324", - "ba0158aadfeae8ceaa458725f7b11aaf2711fb98fbd694db22d8782dd6e9b887", - "043d2d2eb64fb8d36f870be20a9f50d16748f184ef4ff8597dda2a3cc0f5ca70", - "09615f656e1c1137eed0785384579fbae31a2daebf1caded78cd0ec88daec22b", - "2880d696bef91fb9e090b0a9b1d1f470274499c524b9f01a6d3a710a16127cdf", - "c8bec231dd8a98978504dc3785e1aea902c663eff534f7312f897d6a6d776533", - "849f662b087b37fc449b5a757d4ecea4ee5553d498a425352989e0f883fa705f", - "bbdb4afb1d4a466a994d745e813981618bfabe87d3bee818bbaf56ea1c6699ec", - "c92d591349f722858caebe7c4df37274a43b2677e59ee4c23629dbe8470b4241", - "d5dc67ccaa6fce5c27b0027138398163c4a701146ed0482ca6d4863b7d092ea0", - "0518a77542fdd638f2b569b8b434ca3e9eeca02cd116788572b2034524536232", - "33f9778cd883390511b3a1896e621a41a42d183a209ae1ce93d3cf50367d5c24", - "d627279a247b87f4efd2398268ed0c92af181be868cb53005f78648b225b0535", - "9e02e37dd41268b4651a70265443645ebba63e9272e7922d8d39452f195c3d14", - "41914d1e512abf597bd366ed3977d54265f285dc50ceb7e3dcdfb4f3783fe011", - "269fc2817a1ce4166fe36d43ad745b49fc6e5b588643114e0f344a5c07ccd50f", - "af76da997b51e69ad0903ae946a3d1799a2a226cef3b5eb2cf5dc0f8692ba595", - "f4f0a510936bdc03dd4a7e91789bc655758b9f77423b6a4e24b5afa70e9f82ec", - "abd57ee784520dcc78b778bb29e3c863aa54a8bf3ea88755164b6c8da78cdddb", - "f998090af5d2f726e2f9af05f0a1d0beb1f56af83c934590a92649c9dc0b15a5", - "528eebdddfa4374289a0aa94fa783160e40f293cc4cc4d7b471aa2cf5b44cf30", - "1e07e58799acda38f53db55d6acc96abafd1a6a6c14b33cbe3354793f728b10c", - "17de7115005dd52c329622e59e915d2c6324ed451ecca3da21e9f6f0362fa16f", - "0e1f5f3fdab4fead179ddb1e2a736e69164bb553a6e031b1c2835c398cacba57", - "e12ffbfdce5bee9f6e92e3b83734959cd6a27cb4b563fb6b2b22e78fa8039c81", - "ba40b7c2e7e43eb247652160d84a39680005d359ec0e854374efaa2f3d04edef", - "04b2a0ded2525e1d6f28ae3d183c5c46a0781793960fc4060524a88822a63400", - "a04520ed853ab463a9787057b40d4f42ca681477992f8ad287d21876936ff674", - "b31413052f9f3aa10fa840ce3e043f47075db52a53e4652bcbc0f5cb39be8a14", - "48fc6c12a16a2216aa11ad66699ae9d334ca0be2410c3cd63b30aa789ad4021d", - "d438bf3fb3ae1ee56c403a91bc317bdffb825b3bb78f13638c4ceee414894b81", - "740de940335ecb141c6a01eef4e532276fc0c2a4b5301a7d9b0cc2f19d421130", - "37a979c7ccd078ec639b9fa784ab6696ffc849102832d4b6fcb138748af258d5", - "39d2d08d226f527268bba2a3d6a3f1a09b3e673d7372ed46488844a812f84df3", - "dc06d4aa28d11032f48e85d429288a329b80c720769c5a860ad72ecc276450cb", - "17d93be769070fbf413292dacb0890362fb8b3ccf538ee3065e06cd0c59356d4", - "dc38dc3361aed4354feccd31af8219bbe9da23fc9b0b317f3b16ae94a2eb9b9c", - "c6f372bfac543cae6265fe12cffd5bdc7549a80734d4c5d544cf4319165d8664", - "5ee19a7245b1d5470fd04fc64bd0287f0fef842b84a44839734a6a16b6a10fe5", - "3984ec859d0885b41c8dc9a72675c25e11fea191b2eee36abcbfb4db587920ad", - "2917c184df21d2bb1a2c5746d1c39f5915cf264661bfca1a209354aea08e6d0e", - "c09cebf62c9ad2fabba973c24043cfe9d63529152b0845cb2d78594017b120ac", - "8ceb2b5fc48440e1e813b923b953d91ede65f82c717c63c24cd65b2f7b49b2f2", - "42a780772367f46328fecfa2a85824e6c97fd556de2e5a9cec506c0367a27b8e", - "37cdedf528bad84d244c34d2083181938db05a0b0da85460ddf9e593f179202c", - "8c5065a9278128c06c9912b88763a20a31663ee4c03dd1485366033a1237a84e", - "7c5ddf9808a2fe5a16a08b596b218de0e192eb9803b3ca31d9291b56fb7fcfde", - "365bd502f14ef78435950e036e5c45bdeb68e130fd2bc88757d2b374639385e5", - "a3a6c1cbebccfa7cc3430306c614adbdd5404ed5c691ce69c78d3e1aeb244502", - "6ba51b9419555f82a5da63161adb1f135bb5dc659663b3292243fc91469c284f", - "06bf542e0be88600acd8f181b6184761de723fd8bd253e75596d04c652ff88cf", - "26e38487f25186855ce297bc1197dd2cb6669e004b1ab95243beb21af8b594b5", - "8e61d322bc5911790aabb8b9d4be60c998362d0219f524e5c4a089c94ee069be", - "49fd7d18c848869d13dbe330a9a5f08d4e5c384ea6335f6ca02eadb4e2f50559", - "6fa9858a05446dd9c794bcb04ad55c995b827ceb7c2b83fc10f553ca5d35eba9", - "3987be23b8418350b012e7be8eb8bfbca7a81bc39d7391c17acfe4599674d871", - "1e80cfbfc81a4b6f04cea473a2adaa44050852b8336a5e5c0090b5e9f1e4cf46", - "374e3a6cc030c0bc196f53f97c4c9b9a124ee6007895ae6157fc09a378375901", - "320f7df825811b316aa3be08616367e3025c7714e6e4286b9b59e52fd7cbebd7", - "4ac2d6d148ea64244ad86b66da3cec6426c48c4b2e17bbf967dc5c387a17c7cb", - "2c69aac74772dda7161e0d3f1d8ce2357494783e3fd78526b3d57054537bcb37", - "22556b43ff0b28884d024ca519deaa06c78f31f379390330e02a4f1769a22ac0", - "4f041a39383196f025f9dbddc2de480b90a15ecb659d287c6771a833c709a612", - "33d2e43ab76cb86f4470281ba39aa841e40e67b2ec23d5c0f8527aae91738ee7", - "ccab1bcf36b431d257b2b454b6ca401340cd5161d07a72bbaf6312b0dc993c75", - "cea19f5c3f05e14e1549a280d20fc7f7162016ce3e44b13275af97a7a467d70d", - "7b720348b0ebd61e2235e2dd4d9382394f81bfcf85ad7351f4686e052fdf0f25", - "76faaaf187d2a270a405a05aed15df75d4d07ba34cb6dbf53fd7afbe00478487", - "3f7e79c1156b3580f83ffa9d3cc78ba85fce9cd930b3a9184455f36a06156c89", - "2ffd9ac69e46ab26888dae88e90b2a1008226785831870160eb5aaf9d0ce1845", - "71ff153383667feb10c395432195364bb0773451c2c8e55c9270857f8bdc7672", - "97dc746ebf1a9e8125d96c6ab8cadc893d27bb0d4daabe440d9cdda7cbb702c2", - "dafc077501397a84f038660f7d308b0853c8a9ae0494c705c53a4f07b99f9263", - "4456667eb3caca6a8cc642ae5828854438d6cb80d46f0ce64d31b76904927bf1", - "47e17a07bcc94c0392ed9152c3bfa85c5157c283456a4eb4527ed6836b0629c9", - "2404539c1db75a1b56de279f98979965d35572ce0bb71fdb3e41c968aac8b4ca", - "2e9891605b54955b627e0494f224eb246e04e2c04987ab62385539684e16bf1c", - "4b6b0eb5c7f63911c7c3cb59a759351a9f365f4a09bd46ed01fd6ece6854c689", - "fc3119acac874ad18bcd5e3600dba97520548e16ea557c68f8774a8f4c3b1a60", - "38a869cd914d26ff9061c72cfaf181e005c8358271d551b7f76c91f041109ab8", - "b254b0cc3af5f6d47d11f3a265c2d106d2c4307bd3c8f847eb327979c02937eb", - "ced22e888ff4899d063a05d2a1c98700111cfbdf669e5d094da50d016adc2445", - "8a963a4e98f9943b06193950bd299d320931d1025c2767c8a5506db0c15c2014", - "8394f6a50148b5be94919f788de38c47670bc8b2606e8b9d19bd834cc35b67df", - "866d7c9f47cad96ef7bd9a6743d4d7f69094b587de604e87262c48984521c871", - "ac064c7bacf7ad328c21cb6956d2dd2a3d591ff567a5c4493315ec567557227b", - "508da1349c0358adc7d22fc97274684074cf9e67674ebacfdadc4d022a28a8bc", - "d35a2e429c42cfdc9ec2deca947678edc5055d63a94a10766b7596a9e458176b", - "5311761772dfe8ecb8b116af4fe555f2693a979911d06f7450e62abaf681b471", - "af85ac0032cab92042ddbc8ea72ef20151bdf8c9c875981a7258ec8968f5938e", - "3f213751cf48e0870896c4458a2526edd73b6e56a04d7f770b8ddafbcab917a3", - "86f7ac0fa18a044329eb4a58887a939716319f88c839b50e5b32ca71479f2ee0", - "380e05f5fe89180021321fe38311e05a7bf4d423aafe89efd9542d0e7610536e", - "23933632705531fd006fab404f393b64995b80e0190e3312018395e9fbbc7f9d", - "747cbb6224edb9d079e3ae0074600d410a8933888c5fe8d9c4c5638f68eb22f2", - "51f1e7790a15cf520870673d61633c9e5adc85c53ef0cb8433e3f97d84458eaa", - "8c94a95de1e7336fe5f0613e4c03e17ab052ebac0c4602500b6102397f5a5e8a", - "b91dd22361b711e75f057e88b3c0b01630c51a936eeed2f367f8a65542b8ef2b", - "859a636bd5371767bf445372f564d4cbeb3c19fddcb14546827c1eda9115292f", - "4d0109258ad5f268cc5e2b62c747cabe6cfaf5b852501aa1a13b7adcb1bf8487", - "461ce9e014c0aa1cfd6d4ca25c9a16b4b36f65c19b0f172c45d867f13b694f5e", - "8c40fbc91ff4b7e43f2bc53ed6bb574b3d188d6cd8a74f3bd74b9f2d03dc6a4e", - "45186d667709803f892898bd47d0e78a68e23833bfab343276cab597dcd6b631", - "7745a7cebc2bced86578c62882809f85951f7912577b608eb4a1e88482a47f54", - "e6d1fe889c82d11af9fe7d703d8c39691b6f154bdd4e0edcd31c02efb7ab3871", - "e96ce3396a8600be138aa12e032bd820b4be3b0d8ea189c6d7630429b102ebd2", - "fae6bab6e0a6e73820f0f2ee675621387f702327f1893514db5365bf3d6670ee", - "8463e15f6d130ef9b1ec06062119ace93b27a54b30ba58de57f31d8b6cbf0475", - "f35e44114e49bcce7aa853f2e44fd2f6a6aa6ecca1295db6211706377732f185", - "aa14bb2f53031d288530d2673b20e1771d9117dc72b66f7ffb4a31e8837cedf3", - "518027eae415beaa7c13f2a7fa542a3d1d26a91cc01b5431dc09714f4eac5587", - "b07130e5d97369fe0f3bcc791afcce9f3b36fe0c2228395a49e2e62ddb9facd4", - "41f365a98d44c27f3d3f7eba77ebfd8b5b16fcc0b9d05e776d87e6b8a43021b7", - "065746256762bb86fb844f8436310a596e5145813a74885cb2293ac629d007fe", - "98eb421d46eb3c3abec3c3b1995a5de5da54473f1e4da8a08f6436c5d083f50a", - "73c451fd56485f8188dc385caff5694a78ae6518a476d99cfa9575784de0ff4d", - "e22da3499c1b69b503a14106690b1f545790079b13c8c03a9725cbee402fcc24", - "d10bd4a55ec7bffe45aefc099372c0576fc1550556ec7b1d7cb34e4b11a67d0b", - "8b615c837876ec08b13e6a5c4d6f18fa01d01319e2f1f65a0dcacea015abd515", - "9a0418f5b1aa3cb0ef034a857bd34203a4c805bf1eb89524501d94d60b7bff79", - "bc5b898bc82dbccadb12e42dac6c2d340a8c787f0475aa0e15eb53faa58e46ec", - "d265107655d01dc21fac481cba4fc239f886ba1935336497df305b4e7343fb97", - "ec452053f427ee84f997092e41640a63ffbf1468b045739ac3892a6916170a79", - "60d6966c14e020571c75d4d6dd6c3f8c8fe55da8d1af0f047ac84ae8fb03ff1c", - "4d1c3ff80ed67be7dd11e074166bb38333d0e67839558426e1185bf570cd1547", - "af7e9a54e7429b70e69ffb9fea960b4d5d35d9fa23a68232d66447d3be615d62", - "42e10ea024bae6b11742fac8277b98ce1cd1914d566df4a9b83781767fdcf87c", - "3b71e0452c2eb00a0f2f0ad417224c5ff18f1496de843bc404090a3bd6b73dcc", - "1634e2f41e0cee5ba40a469be1ae940fe1d52e2e5a455d8c69094ece96d88502", - "bd7b699b8489a84bce555dee40355a3f087d40035a210aae4a2cbf4805b54648", - "b3d4a9b2986b7cc06eeca80363d797e57452491fa349e331bfebcd354dc74b86", - "2f6e4a51bb4f300bdf95b04d83e088d1e33749868ad319f3c1c0edc60f5b2390", - "0baf88700abb72bb95df04101e1973c0eb36f3b09977b371907235cd39fa44cd", - "9ac2d7f6d2b06df93c7bf14b72f25f863bb4b29d627e0edbeb18477800878c41", - "4b21c4045c225a73ccd85759e932126d052e37932d3afdddcbdefb215465312a", - "91c7e2cfb3fc2ceda8167b07a39c97585bdf68ca237df7592471b5e522b2e22c", - "e8ff8ab016cc161e235ac515a3e57c2df95934d3bd3746f110d0493a6d8a68f0", - "c7ac62143674a94e8155a02a68b5e81f9b14322115e6f9f80da68aee44acc19c", - "009ffd567b07dee5f7e9d5ee5b634aaa6725715e7896d576c88f18fd83d4711d", - "c5f669d313d1a94ef7e6dd05126a38046b41fd9d9c4243753f6fa3cd37e5331c", - "5f1742c68d58bb46fe00700946fe3d046d9e5e8d68b7526578b054e4a60eac2c", - "4ceeb56b36fe77a8da07d42fb970ee2ecfd4cf0a009a8ab4ffd42a9e7a8491d5", - "76580399b319a9b1a906562a7bf3574def255fefff8961cc2bfd5ca0d9b361e3", - "3fa71f86d1025b35e699a28df226b7e5aa0cfd405b0c37a0288949bf73f49e8e", - "5cbb121a92b2202b5c14a23d8dbe3b605d08aff9c53a1a1d746383ca2fcf7b2c", - "235cd3a7e9924274d0555a347ea2b57a4489a7cb856375c732b89ecc6429f0a8", - "c118c14b6e19dbea7db5c8537eabcb404a01e25229d91a4f08e5d033dfac2764", - "fd98a65f6c024bc657a1f7fe8d5b2783ccc04be040f491018ff504ed917076bf", - "34dddf932bd7c682cda5dfc1e6d3ba7e2151722c0c1b8ab47d13f66e741bb652", - "7d14c247e72bda43873ea9a018dc090825168c7f75f23a781a63ab000101fbf8", - "b392dc9874da2ac76f0c90aba22bb682064ec25c89e086d2bfc566e854dc1f6f", - "b866fb263081b46c40c20d56fdba3bfb364d45d472f84905081493d2284b03ce", - "1c3d8bdb09bf02ffa9b0a6087dc42ce68ed2749891eeca553913a8167f93a007", - "2fd201cf5638fc1aa5525f699973de15e6b069ff69defc4f22293e7c46657d7d", - "6a0ef9ba1a40cf8cb18165b5affa34bd93dc6d1fcd39ba48ca7969d6381b79ba", - "c82e7685ddca1ad6314d8e61a6747af7e94cb1d72c94253400d2d6e5bdf30214", - "a3847aacdd8988d563c95f1ff98305332ee32dc24a1b49f4c18daffaa588c117", - "7cc7a3cdccc75c65dcc170a05eb1031188a2132805b56f9eb5e63a8f4cf99c2d", - "ea37278f7ad4c70f2a61f7391440ce661130e78eaaa2fd6df363e1edf5abbdb6", - "11b5c447794138273f1a82cb4582983a7dfb31b7710f35f48789c579fcf44c86", - "5bf9df70afca1cca6e87ed2894b9f8a7c3466d85c4b404d9f6bfb18ee991f42a", - "7b49c9861bc91688c3d975114ecc4b8299edf44d8d7f2bcaeea615bb3dc16fd7", - "9563a52cf9dd278450ddaea1129263b3467f5506381b343a9f96542731c70529", - "ac15cf120231701493bdaa0b28fefe54c8da0308f3875543fdcc412bdd72258b", - "71ce59fc78c07a1c5f571f6108ece089fd18d8afe373abadefb72227579e6bcb", - "6005b34565176ba27411c34731d98c82368dcd31404e336738bce80d9e54fae1", - "13276ca7dec42db8b733d8bea09706b3b5fc74305766322661e7497b805e494d", - "d6489b449c1d2e28bc68e7476cadaaf2ad92fe310a0aaa27cf39ad13e18e6925", - "2b75542a506ac64d01c80311e863a7c0e240559d9f7b5e866c4e17d4ec1c971c", - "8267679f5f8c18e1add09323e895c82638dcfb7d1bed26cd372cd570e8a6639a", - "f9105cecda83a272fce77d087eada78df40ed9a6094fd5454bf8444730731be5", - "e1fb2fc10c066b2eb7ecb2eb9ef9ff82cc632de9f422beee79d4ad6bcd39f33a", - "aab374a912f9fb00b0c5a2aef26c732781114a696bd031f4ea268644aca0bf18", - "64a5d2e3d139111c6c4a04b838894627dedca6e80239f7a53c0d2adede91f0a6", - "3f5ce23c747d2215ab5b8aff08865c6821bca862afb40e6b255cf409121930fb", - "2400ee787aba342b7d43aa0b40002b7cc572faf686a542e21339009c8cd263c7", - "54c8c5aa89b53bc17a2df990d690ce9aff62365172cc2b9ef88869aef428a87d", - "caf31aa16fd62d0ca539d1d08cc0b9af3ed2d6d906e5c2d75ab3fa513435be2c", - "04e6aaf56db259d389930b7a2ffb49910f99e51785554ca5c40d3c9e2e3c1e33", - "c2aca091d54e76b2be32946bfb1bbeb628d90ec5bef4e5299fe15a13a4c0a1c3", - "8a11f09d1f0bf7df37664f02d6a97bb2df324ceba5493f498a2a4a4acd83ca0a", - "e5e5383d4d740992d0d97c2303010fd5d7be704f3128b075a24769f5bfc46010", - "41e7884a1e5c97021d4d1938dc9e60e6e7420d206bce01a5791ef8b31e60e657", - "59b6ef2c14bd61d8962faf41763de8fc374b63b3d8de77bf866d609fe9f66966", - "0b68c2df9144434f221500c53b7f7a1334d0f65c9f9016062b7109d3b372d2ec", - "7f5f6da0c8837b2a65bce668f2a9f9eb5b7a19b973e0b560fa050bf1b787662d", - "a451a4088eee8671b2b63011046a43c9b22933b0de21d4fe49e7ce7bd2dde545", - "ef48f7251eeed220e12d4a0e2b71880153a70ec6efdf23b955d6d8f737513b3c", - "8e9acead57d31dbacb9f47a96b20d9d1f12fe5989e4c19d7c8957fa94b84add0", - "1fec90019c31cf61293c19ebdc1db15d48605af9cafe03a7146a1079f828a160", - "1dcc33215d1039c407f10a3f58a8525e1d9fe74092e58429dc84cdc93dd34ec1", - "4c37b74f92a0a276bd90a9a24f2988133ede392c7454eeeb2bdcf991671f9dc1", - "cf2b1aff2bcea43c028ed4d519a5b11758d317e06a4e181c0375599e73396776", - "eec2c04ab218fdf172ff94090156c0e288e8e295505ffe0da4a5eaf545d44ada", - "d7e8ff5557f88191ecadbd0883a9b502bf63a096f9c5bc3e92b731c70b4ff364", - "8740963e6c28a1d145d31e138f30c443932820a49aadc8ecfdebacd7258a1601", - "01cacbd920ea07b688169985642957e879fe2b819c45de6f1d955a359cf82833", - "8a001656b52f6fdd2a65123f7390eaf78fa2c2c4a8c084162fc2f39f7f2c3c9d", - "c5822c2e731fadee2b01fe855a6a2f0a67403f7f8ea5fa389d3c4401e1e2cc84", - "aea71ed9ff3b0eea32e8a573b8f78369945eb2bdaac2320c3495ac22839891b7", - "61cfddf57fe52410255aeafadfaee2a27f9f6ae4f2c373ba551d80a0e629dc17", - "ccaa1ed8da7ccf2a8f687978c26f72b0f91fbf63896a3f2b715739a09b1a3f0f", - "d395f9fa53dd93df3749cecf2f0b9931cc56821762a16c14ca89f52d3e1bcfde", - "6b822e47d1ceb8b8eab31996fe234a57cd1bb52a8d5fa727def10a5d8b7a2f7d", - "1bb8b5b0bb527a8d6f880bafaf895a28b960af1108e815adfcfbf6fa016f3293", - "884ae19af3804d4c32f4a41fda793622a3a851c2beb83242225d5eb497727b55", - "9f4aaad0b45a312339c4e16f615224b61a9bd844947dfd0b13e838a3b6213e2a", - "8cf6d237b6722824271916c11b78c282f9d800446c20dc19885ff95b263af02d", - "e5d7405f31999b5ad84ad4321e4ef117a42bb50e9a6ecdb8c1e30de54546a291", - "8c471d17c9c24fe3e04f7c7491ac872eee9c052ab635c808a0b1d5b4646659db", - "2a66cf6d453c3323b8c8271daa09ba14cc9a73fc51038315aa4d54650d84fa5f", - "801f5be3e98eb5d3f7eac1be8e7aec69764060de627e91d5d08b42fdb7a3eb99", - "501574d400cd2c6c67a9411d14e375755ee43cf4d075a6a2d7f6c282bff6c2f3", - "e49865d6bb9ccb8969873aee4f2c9b067905f1291f17ab5b21bd2f4dc08354b1", - "d588254d4368bd50408570066225343810046005b1bc161b4b07075d6e1c8cbd", - "0dbf9198dcae37ebc2de43d901fa73b4e078c8bebfdf8df998c688e5ab15ac45", - "64e917840899c80f75a68784e4e7934a97e3c6efffbf6da8c021b38098e01872", - "5d8ab8f834a0ba70e93c84c9899b71f2189cfd6e4f7969935792df2931eb9091", - "c96b86eb42abff89c8b011f673cccd064866c3453051e0b19021a4ae8164abf4", - "50f08b10eb9d68b304c9bbf9111bb3fa1fe80bb862bcaf290820b0e649b947d2", - "8aaa46315f4b5ca7145abe60cd4ca9daca036bf0f8e0a3665428967293987f0a", - "5171c3797ad929b1345a326dbe8bcf434549da516667463618ef615ae8181bad", - "47389354a72487be21a4032345eab4578943584ec63f9d542434f6c2da03650e", - "9089c2f0cb86b617b66fd485351305d80443670e8417a1dac55efdf228082a8c", - "4b9cd70549cc158a5038e10a2c44fcaff3fe8dddce576b7872fe9d0dc3bd1a91", - "391467582f22469f1faab45150be2890144e0023bdf07293a7a6aef97c9e3441", - "a3e0d4d8bc0e53293c2c3ccbc66f4e902667b48c595373ac6fe80e0578771aed", - "b9b616b637b2b53e0d33d808dba5e75c69096e8464894fcd3dddfcbb246bea0d", - "65275ae54b1c2b76ca354bbf4073c165a8d396177fa7a268342e13c97777cd7f", - "c497bc2fda08f71b5b0dd7184e4e19da1a6a03d8584c11f110e1b5d87d214e56", - "2c0e5f1205f199402c00dc81e25e60fc7b42e5d668809411e5d58954df6db707", - "4d492a9922d5aea999c56e5ef2f3765853a570cb0c6e2b183195050f63dd3e23", - "468ff938f012775d62d7bfac7771706f7be9aabf01383b5b24f30bf0b2200861", - "2b73a6962d6cfd03aeeee2da936e9561fe2d0790d1bdd62b6f7e6e1cb9ce9c14", - "40256656e8ad1eb06d61a88176641ddec3532d8784882a7ef645bac2776dad65", - "029ceac5271a9a29bfab4ab0738931714c81768e1d638a1099fb13bb63da9a8a", - "23d7e961bcdaad09a059d5c3aa939705335d2b4900c42f54d8c09170cfcca40e", - "0b8e922fd20b7af6efe3b9364b18af364a1cb6a0bcdb4c775b8d0563578f5f78", - "027c1568c1fca4bc5bf0a1c38b051950542e3c318e2a8a0361d21757c5a7a66c", - "1554ef8028769e00977f83a8c3f0c357b39b8f0fc10039cc94b744b4daec7448", - "5c8535eb898f7afe413e8192eba6c7e69bfa9667c0fe22b2d6fbf489bf4dceea", - "a0dce0754e086a26f10537529a0e482e97cc371e74067f2805d080c732cd2f3e", - "cd7d391fb018cbfc67d04689fd5f178ca26f635a2de096e67ced42a30cabaa7f", - "dec38b2f2c8ffa73e77c2cc58538eef260b63160816d3076cbeabe19146257cb", - "2f4ca0af1e073087121b7770189d3e1716a15626bb5a9119b54f080b9a0c76e3", - "550f402efcf86316794e18d6d4fa36fa44964e7a6041f7fbafe53e76219216e9", - "1435a1570e2c90ff9626cf5c3dac9ef00707b8c321a17b09cc17416e3dc81a37", - "53e67db6059145f0c7cb600ffece0dd9eeb63f0c487c9e13a7625c3ab8183647", - "418f863baf5cfd0a8f7fb725eb5b941c9b600c8132947fa01e93b6fcf6950131", - "409c9093cce50a18d90c3fbd49d08b727fda963ee09fc9e003db0e3c73d1c228", - "01515cfb575c9e6f1012e25a065b8ba0f12b0b4f01e505013e026eb0e4eaa7c7", - "aac4c4e1e0a51a277c672a03f4c01581e8e595a1033de07ac9c9b9ccd657cd5b", - "dacae2d7029da637ce080d2f05fe1e165a13c4288a7d575c2d79867ac08eef98", - "3db95e8dab96db16983ed3804ca95facce4a5dd2f22123839400d14908b2e206", - "9cba05601038829331848db287499c42d5f4537fa13cf74002fc7894217d6a64", - "f64fd014081ee167fa66fb8ef9e21ecd8fdb3204506e57a9241f4e8d8b89cade", - "2d0b7abd67c5406d9b6d3caf3947d910256b89904a04ecf860223e4ee0669b6c", - "ca53fb85420ec95be91483a8a0d3793424cee1d61ebc2ae24b410c874f79cb77", - "3fed59f396613f627a232a1db21d1fb53ba4d4a10322a653b1e7617ab248f4a7", - "42983b65840072880cabf54261544cd61c22bbe3cfe9b7fb6c00c41e8864e7ed", - "724b8890a704d4fa8d91b4402c933515aa927ca52068f3a5250e21b4a13293f7", - "c09a8e43ad0a3ab073bdb64498f6a6eaeaef2b0bdced7b4d0f146dac81a77915", - "92fd30f2983c588786f9a55ca193c3ed93bfb8c399c8c511c1fe8aa51c48f7bf", - "b19e87dc943554a3eea1168b6815cb720d0fdf79520e96b6f30558293f953db6", - "677e837b15f9940bb9097950e9e7bbcdc2dad719bddedb170a79156de988bf59", - "ffbb6b817048cbb01e727bc5bbb14fc1cac09f041000877978b372c845c41cd2", - "538e727340c9a7049d18bc9121932cf19f28afad25bd00e6ff103d079962b1cd", - "9682fbb769b62bc0a261695e5602fda97ec162292c4b2c9065e727e3a0ea307b", - "10be5ccc85bcd97a674b529c99bf82938b2a376c75936c68280ded2a9d8b57c7", - "ba972452cff186a42c6f4568a2c9390560791d02c9579ccedb539b5d59e74cc8", - "34672363d1b13fdbb35d70d4c61c445ea25ec98b5b1201e26031619fc560c33a", - "3626b97e60e05a1dee93a60b91b5652a2acbe53d78faf15e293124cd029c2c82", - "0cdf9d020b908869ec27ec7c82e994ae125a589e9075e8b52b8a48be0b32aeb6", - "046320682b181c4284646909f952096e36167afea00b9c0fe6fadc88bc4c5964", - "2fcd6df6de42d691ce5922c99bc612a5d7e776f7309b893c30bd65212d4b2b98", - "5d0ea0d25fd97bf1a86d0978d483890c01ebd286270bf1862c41c4349f72bb15", - "49829b887176a20ca90592e6adff6d221d62369206464ec8c717dbcf8b985d75", - "2cdab8ee2a826717d15f501be2df466e6e21c6fc265a0afe76a8651fb69f00c4", - "df64c71e20f03214f4a0212d578fba37de33ed222d1d37e95cf2798e4d2f4923", - "e8fbc641a31d30e5da754025b7d1b3734d0bfd84d3e694f4eabef33407984ed1", - "0acb09f9b15100175806cf3489abc7b4bb229ed1e1cbb9676e2e035a9aba335c", - "f426dc89e740b572dd6765178b48a30b4a6b3f91e2289c50e484050a8bdf0358", - "e9808e8a90fa612bbd9b940997fb859698f35708a199a45b1458b13d9263093f", - "1b326c9cd084fe5c70bfeb0adfefcbfd3954d009d359aec1e1fa07979492ec33", - "316b33b9f4c92408e1c0dba61b539675a3d256533fbefcbff8a79f5f50cdfaca", - "370bb3d045475a5a9d6e223bf1d9979472997de1438f64eaeb4e6a475008326a", - "ed5e10062cfd7ec10bcdee665e8124a22c48e157765acc66f21d6a9995dbcd27", - "7efc4349d72d69c73ca8a88ae17c67a766ab75aa480e125ec073a63bc94e9881", - "89d4dd361cabe57ad8035f12a7d1e64cfd22ff9b4473691c1ed9c47a2ef9ae1f", - "735e1e04f68b26b22fc32e81cf52d66d94a3a31e80503edd5a4a5fb62f43fdba", - "8a2445e41f820a137a721ba0819eb435bdf56a747bbbaeb5ce8fdc52ca984cb0", - "edc8166b84d18f74450e1dcd39107f43a24c03f7a9d3a00eafdabaa404e0091f", - "6a3c891329e794ec66ca696ea7e2c069d0b3b585a3450f8803849d5a80cfc96d", - "1f5740302bd979ba4ae83157ced640da09210be1ba1540f84512ce044ae130f0", - "6eddde83911342d366d2b4f9ab0ff837a70fa9f0963d2d75bff437347148b791", - "703087713191e77614bfb256f83bb7f9221c6003c7ef3c0de754f6aa41db64ac", - "23fa576b20d3cdf06bb0c2e36b0a5b61a698868edc07e0cedfc8313b2c268abd", - "25fc0ca368166475cbde7db88af956c01c0dd6e2c3b8a284a144358c823c8480", - "c479bdd31442afbdab4e7011b9362a0e428194326b8bd38146837c0cd6998cfa", - "cd4e88f294142a3e808dbdabdc5ccdf2af3b66d579346f99552b32191c21483e", - "982dd3b5769129a157173bc6310637772f9ad4dfc3831c8a1f794f367dcf6512", - "7ce118b1dda5bd1a2dca5f5827653f8e6ab1769a0e40ba0b0c7cd9b2b633f1c2", - "5bdc73f029b0e7a88cefa86dc3f4d8f734ef31734c16732a31ac1ef488cc772d", - "c4c52cf755f62bdf6ff2eb3e7d05f9c59b980247b92e9d526abd551e8052a4b1", - "64aa43a9fc9d3dd93ee471370cc8d08dd51ba28f374d8211cda65c1d67024e51", - "4c7bc69ca7490e715e0668454d5d85fb3d91c579f924a6b1da84f0b384d2bdf8", - "7886a6a2f5f3d7d7bf456061d7f7e4fa9970fae10879705db15796878b799eac", - "485ffc85b409a3206b68553e2a77a3196a885df0931eb2369a32e8c17337fb3b", - "9e63f788c1916edc2ce12efa98be82202c1e4f43219dc86308ba2e8c02a7ca3c", - "ea503e58e0e0464a1fb3b018111423bd542f000dc9296a192abc64dead58015f", - "b642b83bfe4375d1f73cd0f24ee95c7aabd73a7d5f6fa3e05d817ed0d94c0f57", - "bbe8dc3c47dfb1a71791ab23d3d9a4c014264a461e72d1265b2cba8d9eebbbf8", - "67d484b72d3439bd581851384866df4d7e91c0330dcbdfd7aebe174863b14d7e", - "31c94867ecc2dbc9e646ff293b7c2543c6469e69cdabd1d51fd4093750c2cbcf", - "69e74eca28a2a84e5bd43e57396ebcf4cb77e7ba48789f7801d5d78e9e99a16d", - "7cab260b7645887609c46cf446ee25b62b7a6ae2639471c4b90fac343958c870", - "64e9f24ab766e07e4ea6bd4bd2b396c7ced782bca4cc9d8adff222a91eaf1f18", - "75efb9f31855ce32f9542c389401a70453a9ef4802185a25147a7302ecdc6e27", - "4b891bbd14f50969ccd6071bc4650449a835405155807044a5c1bd205d323ff1", - "2673e12e41bc0e79710e8e0f616ff7bfb57e231882f68f22fc7d7ebf2f2012e3", - "099990ee7d05883f88aba13eec6fb1f0b8528137ea871bc55a6f0ec0fc9f923d", - "faafe2288ca1bc6db0fb98b82b4a2ba8b93aed3df107f01eb06bf3afaa03d9f6", - "868616e665dbc6b79eeee6bbd9ac35d9bb10d54e8545f208ba146015e85331e3", - "b270a17e4d1238efa013c86c6734dd23b5599a5fb1a10606a3ff8f32ed3a0d5c", - "8393cf75d5fdfd98c634237988136a3417c4c08fd28d8175b1a33457cd6a655b", - "04b7584102d75903b37ffefc1f74a6783f6230bd759bfccfbddef9c9902f0674", - "e15c42a1e8e31721a5f4d5462e209cbd9c16518a1971020118cd5f6a5e5731da", - "6dc6af042a9c928ee2c07d8405303784e8c8648502faaa1278b6fb022d58c0f7", - "55e617233ce98ca755081ab3543e20ca804fd5265e667ade8087783da84344fc", - "33acd76045f546df830349f4fd5386e2ecbcbe1a0d7c359df22c181558118d7c", - "7c8bda6cbe1d643ea60677a3ba7cf809344edeb738fce24b8bca16f948c3908f", - "0b295df86dd9e6da97513db9f1a90a075c6861ccf972e4abde60c613f62b70a3", - "b74e3340b182cd3977703edc115f885244fa053dddc8be3589cc9a619c53a5ce", - "120ec2d218087af14b9808d483db0d3b9932a2abac00b0ba02ce0d34ae1755f3", - "168fcf3464c9dc39f3689a462e288c4c5ba489bdd79668aea24a1aab6062c874", - "1e992254ca6706e69bde03db9cc1c1883fbaf5a9ccc0db4cc04252a540877005", - "12954c7a849e4fb691c6edc786679821a75595beff27bf34f31ad0882c0a9ef7", - "d6c06fb82b1ed15a53d490c7e65fcf5608e184ed3dc20623aa2374ca85514430", - "4a7c92c1f615a83d25b087f000630226969e60efd89afe1d2744a55787fc465d", - "055ebe9364a3c00936d89ad02d008d17b8722c069e91fc0d4c509706dd8aea2e", - "ab29b2ecd95e0998c24d887131812656c7c40ec4d5a6d56eab1c18e6a4db692c", - "f4ac67060d61a44d28b7f0beb826b23b708b537a9ce2466ff2168c07053441d2", - "1c2f67c7aa5ba7f05d6627f582f32a7a248da4787988ce5425ba9a0fdeb2a06b", - "70cdf9dc5e2ddb855c4f1a8b0ac08277d73696c4a9e2521097636c25c7e6cd88", - "e652ad9d19880d9f547317f9209dee5c7300a380004a6265656f4f1e1127844c", - "87116664f4aa716a2dc9fb537c5e9d14171fee98f5aca6041e8f5b644aa89001", - "44b7cebeb77ed7c3d9ffde7c909900308959c98de43bb84aa8cd7fdd8aaa25d4", - "10bae2804b8068b3585516235d713bcf1463b8957b335922df2325fffff82a34", - "c4d1af8a50b45c9e2d543035b7c52789ee831761d17766c2457c2562ee8379fe", - "359d11bf5f8a9ad04259c01c8f3ab98ce54450da68568f37592dd67a27c9fd02", - "04e4da7a188263c08ef5823f111176b38c2f84da886450334882d175b74f4489", - "8a116af4228b183d2836d8b3f6fb19ed7ea47d4c7c7980249b59bf778ea395e5", - "9fe44a2c5dda7d44c77fb36a26e57c42e6c75a12f09ae81065b9975bee92c11f", - "8d6849c3caf5f380ddc9dec9f969ca9e49107d7f66bb8477d7c4349a9de3299a", - "020896ddfde59e9c81164d087b00a1d619daf848d26f2de65d6e8edbed6fe42d", - "faaa2240c823327287fc0e4f5cf88c6c2127e04da56c2b40d75d70a52d4e8d64", - "f7561dcaf37f52387c12c54e3b99c91d1cb0c2ceb855863a6f4ebef2c82cb316", - "93ffd5da743ea47b10bdb034c125f629d41a49ec14f3f1d6664c5efda6f05635", - "6368e1afde54a8a93c718b9ce4c1c32c899474dda6b17ce178ec92bdbfa806f8", - "6c3982a03a2bd1bd34a136b82f868c368cbd6be8e274d52ecd6d88803851388e", - "5a6f711746885282f4ab9058d4e414ed1b365250568909e1e0aa561c66523ee8", - "9bc62ead58d34c9f5f405b312fea3ce12f7872e34b1f3702cf2e9b206d5fb2be", - "4e8631bd10365a1749118389a091de1fb6e630df1ceac2ef3fdaaf21d7832fe2", - "ee8bd9fcff09e6d410cb632815ea5bdb6888f61800cca5f3312b34c3a19da450", - "df9373ef8c357ecee957f08442f46ce9bda2368ba3612b2671de2d35d8be1861", - "e2670867ebea3a6b123384e1cbff9e85696d3dbbdbee1f86d92e820b2e2a2e5c", - "4d22ef8edce1614ed2db0f3e631eb0811e74a274a22e23ea7e59d79beb57c604", - "5f6c901e7492e5e263065d58547c7afbac581aa4c9c0ed2bfbbf60851a4fbb8e", - "4df5811704490bed3314d470adf56f6d415c2bdce897d1c5695895b97dfcaadd", - "713f9c6bc87367ffd7464599fa23c34546a651177ad92877cfe38fcf928f8713", - "5fa13daeb4655f390238eb175c861b6b0538b11905be9362f56b70094143f7ec", - "851de4ba780b099d99c4af7e22b4f5867297859bff693545522a8449bccb2970", - "69c173480201c5a0e1c794885cb9c149ec814d59a15bab979cf36f16663dcca4", - "ccbde9e8a84d11b203546a836689dda52428e52e522823974607dc26435e30f0", - "c9c963c585339fa7c0414b0f13a533ee2f950c696d6f84dc9420407a74e8b87f", - "8f31c7bc8e3df1ed618e9582561b197812fcfd5f281743a6eaae184a5484efc2", - "ae68ea9f862acd3423b394f10d491b157bb6a21dc537d04021f3a34379996b9b", - "ace6b5e3ad4c257adb0d2a3c7305c48fd875c1df9a6cb3d6dfe7cfa28e492411", - "8e9668c7dc3114abb198963c791fafa8b450d793c04ee5f817738d51f15c79e9", - "99fc50485d8e64fd6e24fa2a99eae5e94db7eae4f7b88e6a1ab9ef6949905ec4", - "00f174fe53bbb5f2ab42e269c1301d2ee85b531f6cb6eb5dd335f37cafc777ca", - "63d2e27237dc038017d1a4be427dca8be2a43d951adf583e3ffffc447dbb39ca", - "66063b0129b2bdbbcef653686fa5a909178c2d38c88ed1ea12b695656698b0de", - "c9f5bc1f4bb587532979a74a3d9b13708603a3ecd480e20f51536b0b50e6bba2", - "14578202aea5c16540f6ae1b9591ac93469109d3443a3cc8db6e4bd0691fe9db", - "e810c05d6389caee637a9b8169061ac1f22ab5039b9686386347226c6fd4950c", - "3a95cb02baa95e98721e184d4d267ae0c69cbe02ff265c8b2381ed40b6844489", - "fdd18b85baeab3957ecef1e0ce914e2b99378a5e2cb3907dea07a14255d5dc24", - "bc293cdc59cd565f843a358440d2314ac194ca4aefb124ab5fe8ab0b0bdd3071", - "adae6f00dbfcf808aafca0263d3c3af0fa2c3184afd637da4b91b0771cee6040", - "31499300f3cc12f352762b565caed07a41b1ae09d252a0f1da2f5f6c72e7f34e", - "7a09a018d0e6e141fc44019eae832be5bf798898c12aaef1daf8e9d635b52c02", - "fe60cf07869cca0961d13b963ac90205af1e9edc4d5ba58c1205b6d241d78671", - "1b5b42a985aa5c66ba623fac5c2b7670ada3671dc69189a08a9b5745b1c2c4a4", - "7f81b8e5a8f79d8dff9c3dd8e52eccfde540701a4e2860d0b3fefea810dbf102", - "c49e887374e414a2da37d46c46e4726f0847c99786af057a7fc14a3891e8c4de", - "ee2cd907fda6a76caae08a34463ee2a6896ea0a27fe4fa59e44ebbdd135d7aac", - "83a8f531f894c55ecfb218cd4a9c28dd6dc1a798eae069cab9cf267d84ab62cc", - "7b4073f389e4e03afab044998ea979f91797317e0005c6f9280aaa84d7eb5b01", - "799023015863b91da686f06df6bc92dd5422f285af33cf09e101cbc5e74208d9", - "2bac73ed77880fa8f64006dd5efb3fc245f4b437152716eca5b9863724018b54", - "bb753a6c08e8f0bbacff5d4ff815d7082c54f14d78d5e5b45ac55b4a053fd8a4", - "678061b020c727cd778170efa5b5bb691ac1f1c5efe1776a3734f1987a370dc0", - "3fd1f3ac82e693d3d4ebe6a0fe90f4f09d7142e2786c552e3cde58be30e7e6b4", - "aaa733d0f2c56bb150203df97fc898ed292fc01c7a81e4ec7793788e46d509f5", - "614ad744ff9b525065239ee6fe90560f62f55b8292957a73b330db845e1a9bcf", - "057dbb65d30885fe82538e02b00ce2879239713b955f9b5f9eddc88d28c54989", - "f753d7c3b1dfa56000e62807d2ac9fa5c0a40ae46793cad53d382006084a578d", - "5472883daf660b64bf2adb5f8fe81e9196d3a5e37dba633be93757990012c520", - "7d523e0686a3b66e2c03e1867a30e31c4919911be64c9c9aa1c915a7d52bf165", - "f69d6a1b63f050ab360264ede2bc8e10fae94ad222538aaed457b23e72d6cb87", - "b03d9cd70ec6f20232cb6540c20eb9d659428ed374f12a28dcafd6bd3bc4dcfd", - "50c589a82f28b8f2ddac1f34e606170e094c6a9eaa55e0b5f709a220a36d8a3d", - "7453e3ad84a4f3552af4d93dead59195ecd58ea9f32c06e808ec05c47a76c4ee", - "9777dae0b68bcbecc8eff642a16020bac4d7e66e7ed15bcbf38f41168b61f144", - "bd8db52f07c966ee89f68aac5ad658a10070af0751395f689c179c4d4b8daa89", - "dcc6120010334b0c1d6ff72efb0ce5c6d92c4bd5ff89279a2ab80b6790962b5e", - "81c6f644b14183c876f01187fcbdc230d9213ff6e80ab858a9941e1488850db0", - "00a6fe1c705acc0ff3180ed34ba696132919a36a29e946ad284d0d230e67f398", - "2193912a7b64e54e2df239f1c33a4e7d477bb51d73b7dc6b01c8a3ade2ac2bd5", - "bcf1327448c9632674e3ebde75d486c3a4af93c2dab3b17287876844286f3c0f", - "9fa1c7de5aa12378e775e68e95e1e6ba4fb7e871fd572934d8fb626d6c0090f2", - "dd7c81113e83c65740c47829a63f41c993a9ad1d0a935ba9e7ab39a9ccabcf8e", - "f41a2eea536b5038c55912db0d53cb19530b17344b902e7daac2bd799e407399", - "4db5f861ad5476b37b37f25986b7dcce10c7ff946c27e8d5f0cba26770c7dc35", - "5f5b5dabd33a36e215c635d9e9502c4d01d8dd4c066840747b59d6ba6d863285", - "0659f57e9fa65ccea3971a61ca805c39c95321a567a1bb2d8503ffa657b98bcf", - "5f9d07a9242c76f4f8caeee160e0cc3bb54d399cc5be35c6890fd448b04dc0a2", - "1597561a408c201c44ca68d24206260bf10eb929cffd81d26814c990344d4efc", - "5f13e41f9505026c865e15607eca27887ec5714151cd3e1f532ebffa10c0ff72", - "f8951ce42111b5e82e254be408ca71dd6862f3b51701ba82a5bda0a3e85b4348", - "7af927ed861981e236cc4e055926fba4c96613e6c87944ee38a2eab2a1064972", - "d068bdd183333b1844dbe652cd21f880424cd99376e622ff12e708ab2a59145f", - "893cb0ad9ab557f55607399fa72ac01194c22e11e737c387b9cc16e3d0481598", - "43d41bfe40d6bf99699e81aacc0170d77b04b633b1f619d61384468a4ccb5dfc", - "ab019dfccc81f815f70eaa77d2e289e2b5a5567e3a7a30cba3a8a550f166000b", - "23bc62b1944755344e928366a5e554dae75e22a23cd3b7c89273cfab06090a7e", - "dd502a5e89c76cd8b71dc9e52ff1532a6b9463fa8c9597a4d3aff1fd033f4334", - "eec1a3669548f13269b7d659265704abbb3d1e9c208bcbfade255f9fd0e4957d", - "97fbd71932f0e7a8cb4af432a1514578bb96e69d0810cc6d69d86a889f092ac6", - "a57c55f19b81c6c21d8253aac0410ccdb29c7728d9a901d1cf44f45a5585e730", - "52893a36ca2803688df46545ccae9259541b9443b8f0a90c2ac1569e893b77fb", - "4281f42e15b8f00fae64f772af4ba54ab5c685d365b3bef0966f10263d309277", - "a05c5be56f3dfdf4c174a49c55f95dc2c26d901cf7df20cb2bbed71e9e798cd3", - "04e0a8b5ee5a4535bb919ea7f84733ed14407995face08d2d96e11e5c763566d", - "bece3ed1e203260d284e0bb3008ddabda75c619e40aeeb356ab1e93d81c03e80", - "d6309a164602bfd7c1f02c14d9412bd772ee8c9887837ae6ec17efa31c064a06", - "8f9400a1f5dc60369bac27f972b3c3e135eaa2095e348c4ccc95a3c289cfba27", - "2b44c56f6fae69e4f2646d6443f71510fe5d91d47a8913cdf5a91b9de7413135", - "4236f187579cb8656e1f588eeb94f5bacf1b3765bd3a91b509e46f1e42ab93ba", - "8ec3ecbe1ab17fe1ca16cff82c034d5a61f806dc40fab97a5364be5df3273ebe", - "41c26aba336cc7cbc8c7acd4edfc6dc62c7c2a9a7d7e403dcbe54d39ab4ca0db", - "7ef0c26161d50b1fdd0d43c793e1eb3492bc3f8681c4cfde8941e77ebdeab470", - "bd2980509368b774a103b644c957e6cf1ce2b3ccb3e0d311d63da87e53f7c8b2", - "5ce41a954d1c0531f1c61e3b389cf777dce4a499835818926ff78302caf6b77a", - "2623b73f0bdc3c31343d5da21249c0f7ea7e50e282e95aad280d0bd9a11b84a1", - "85e232a16173b7521a2ef287df0536b9ef218b0b5d0f76cfbc9e17199d11e470", - "ba4c689c97a3496badc8bae1636beabb294f37ce0ccd7ebf12545ae19d78bb8e", - "4bc22e7d2bedc22f5dd61f9f730fa3620ba797a744e8d170ecd518e67354846c", - "93dda1571cdc052a2cfaa076c26a7d93ce93ed407d85579ba70ebf4938204666", - "2822851c28c99d587d6e5ea44fc5e11f0187f69662b13b60d450587725c92b1f", - "77952d424b005c55c866b41eaac08c78da040ec45c32b330c38bed08dfd15e5a", - "814389425833183d34ed710f57509fd459a040416c33cc0203cb0d2b39562a12", - "c55d0e80b4f4cc9c8106d572cbcd7b1073b96c8832a6997eea1be78a32aa468f", - "ed21063dcfa7438ef73a6e1ddca9ae9312ea5af1e90c921c1bc61ebc619f5a32", - "1aabe32e007c5f5f8c5bf957ee7adac3ce26f1c9680d67ca35938746ca6fbe65", - "f59346b118ac411ef07bdf6a6e7645b771a2f369d92784dc495f131df9d618d0", - "2fdd0231c5ee64a221a67dfd5336f3b5a26d27e86e212ec3274e9f48090822d3", - "90c8f9265393840348ba99d335d7498a3763afbd6cd80e75f4d89e07ca74b4d4", - "9d1965111062e1e8453ba80b6641259835104985ba9e28db87284cde7f6c70ad", - "a6bbc6cd191c492a5ed730d259f1821daaf9ad5380a3fed4104d12cb7898b224", - "7e0614c989a0de404b3efa2561449cf5864e8b4ad501627e9179a848c7439c23", - "68a37fa590ce6a84dc54c71d12a09c6338792d63c062eab360534af56893ae5b", - "c88dd092175b5ef87ca23b711091ae89610c4e2c34b9f6aaa913b4d2d5f005c4", - "d2354e654083a144ef9e8905b1dd4c89f5d05517d81f011aea962ed79f498b1c", - "a8181e66bc037b217ade2c7f8db1342fe355f106d1e6552831baa349fe051176", - "e07fc1d0435317666aacf72c586c4b3cf57740a5a18964a0ef78ea17c7ce1cd5", - "3e9811f30d1d4cfa9b1acd448e9c38f5d803bc24c28792601244bd1e9c6f36bd", - "a420750584201a030e289ba040fbda5b85fe65855ac25795f80bebac58217085", - "98c728cc3913581923c4216ed7a912ff304b90464ff44d40d78722f74769c438", - "c96372f8cc23850bfd82e2ff64728eaa1f992f1166683548509f13a95d89c7bc", - "7dc62903419c553b81269e00e10980c60bc7ac8396d7e687c9b89c1c7e0432f6", - "a7bf7dc9889689dd3cf6000134c56d6c929fd32524cd30323b8fa2f302388756", - "f5e8226a44b63f113160d0d4c87e55bffbc5762beb515d8f1bf5f80c5885c7ba", - "3b0b4e0c563b6d43d7894d19d375395a0d212947583696c413f48b2d17d12566", - "fa0d5b3cb2f89cc12185c5b190a71a8fddb55e1e43497d21e58b949a0e25ebdb", - "7348c017c859f06fe5fc865da04dd68abed60021db42486671784497daa8c617", - "feaee89cae57a570de0b6265b763e0dcd8dd9b315d4ff362d6955448c061b741", - "1dcb9ac46e660987ed156fa7eaf86e378dfe2181744a5d1979f62614716c8ccf", - "b695481b24cd9b84851344f0e70393833328182b536ba70e42a92b3040090a19", - "9e34ad8ee11415f91ec65e73fe2ff3a3beb4c89d7350247c650f68e7add224df", - "7b0168237a0d44c4980e84d0dcc425e712fd5fb8fd3106a952d1aa3dfc2cc362", - "0fdd803699899f0b0c6fbe846ec3f9683171b80498590c27f3132287a713c4e7", - "77b9fb5ed71cd1c97498f5e01072882bdd3c818946b845f148b03cbe8b325429", - "111ae68bb133ad9fcadfeb7c2b5cfa32a5eb822baa9bc19f93e57ec7139220b2", - "d1f6c9b57ed64505014a773351f5ec030bf92d9dc68f483f0e3662b4d5e86b2a", - "db4275d4f79e5e1c14c1776f94d440db0e0d7a8dfe1b047cdba9cd4094292a30", - "1cff42825a41db8d7d645ac2469c0521fc4990f05854228abbf6bb5545905297", - "2fc3eb13639cc8606f57d88e98a9b37144936f9c59884d7354b2c963547cc9f9", - "df0593ad584ecf7e2d7c787762afd5c70da41710a3986397ae162568116d2761", - "eb5b84cda0c6481941204bd82c8ac301cedd95c0f429217faed50be7258b25a4", - "62d96cce0e89e9c7705cbc2cd6d1795f61857a47c9555e807f7a52afed550eb4", - "ecd66c0fac57aaa3af1add608d5f940b838d10ee68ad6c75236c94de9aea6263", - "22ad9db9e3f9404b6aa336a27411b7ee4fce29b68cab216365de9d756b322306", - "c0bbd6878abde3c787d5998bf8506922e06803107cf8d30853c3bf7977772c94", - "7b3e7de42bffb5a0a7fae1248f03fee6a17ed96c0f3db5ccda28337890f22b9d", - "9d53506152200e72e903e5cbd5fd48e7383ef8fb864133f4ebbe2f3863fdecca", - "f79fef6e91fe905a73ddb33393e8d953e478c5ab945d7568b6cf28ef64ad7e10", - "d0c70af5ecf5f1f5242640f8708a7bea7f51e7d44ec3ea1b8f1cda43ab2b93a9", - "7acfc35df4d4469ef2016efdbb1027260a823d8481191a4349198110c9a8d0ba", - "5a45003e9a91bde18e3e05cb7d0d3f77fafb6c1cf394e9b17747c45da24189ce", - "70e8091f787b3c5a512d11e833c6174843b4887f425d3b29d897206ce0f73f69", - "38be433a228be7e2250007db4a5b2f05391a20f678878cf7f751db57d66233c8", - "8aec45e7bc6314c47a808eeed9765f19c33a023734a5a8e4d48f54bf8e776bc5", - "35d7f04e298bcb7bf9c068bdddf55ad8b495da04e955e5ceef6502fe34f9e4ce", - "ef8a21333c1abf378489b62994adb796be516c758d794632cfcb84288d625e53", - "af3b8b891acb29cda78b0d0481eb85a9b3db0623c34176c656e2f854b73296a1", - "1f60a915301c55312bfca0ebb36bcec1242631538a214e86d21d6fc654cab93d", - "54fb51dedf311f83146e837fa0f26d5dc9b2b5f9449ebb1ed574569de1c2d646", - "601a9e09e4f753c22fbf379e65adc8e6e59a751ab325baa2b760238ccea7d49a", - "db8a6be0cedd4437cc79103cda79f272d65375e5651e554d00125104309dd052", - "81082ba30df8e90a488153e1bdce85e14666c19eb251e58c74822f86e403ceb5", - "4286c92a03bd1f74627aa9c9b6857b815806c7ebddd3a7d2163f452ddeec7480", - "8a1639cf2b9fb0f8419daf3e5f7b19792295bf0bd9e8bd61b6b7543eaa04bf16", - "25eeb0f32fbf573ab7b55311b5873a6316ce2447ff6dfacbc8ce97f5ad4fbac2", - "eb9ab74a1458d276a5edd2b6c9ba9d41d63c7f8bdaf76175fc8b2b5cf81c5c10", - "5792e8f6134934d4d15e7a5f4672e81a2f7c6ce70129d52fa31aab8c6d42023e", - "746ecf628492a473b3894663a11ce9cc844f5a2c13a9c40241e756b7535c1e31", - "eb2fbf21c2268df540a6b875da22fbc787f031e4cdbe4a8f194465c7fdf7af85", - "e25a81ab5898e0af5f2f7a195448a78fa87be545b25f373369a30a3ba297419c", - "8e2fbf39acd54f1da2382d7693e05be88f14e2bfca2c9d6987c26e0ffdb62673", - "b01de4dc7cd579c32e8d87629e194041b353f90eb67a9ebba9263bb9629e42bd", - "ba5dc961a742359e0ebd2f3fa88130ce1cca9119aa2c18eb86607cbbf56aa0f0", - "5e1e1132a04b4bcc6780b381d4b8d5ce2fa6ed5bd59a4b6142e12b0f162c56a3", - "f2bea82720b4290ae4aeef7ed7ea9a6ddde014c9a758ecd501aa5281ad676ccf", - "0a83c18cd13a71c59e2f405341eb36fdee50e9875148230b3dca15af7f2121fb", - "ed2d58a7877c05537c237622bf37f46f5adf5c25d553f13f16e709f71fe166d3", - "2052a49afb6ca0ca6a8bc51af99f8adea32f097bf33e7a41fcf1004e27b9b52a", - "e2c3fc6aa5a20a6d554176a2137b770fc69319031756bb6bde1009cf073529bd", - "375a8cd315f6d741962392d3036de0a1e3ca05725e695d8209b1cd784caa1785", - "6c547ddc262f409ab4e290296439955bd2270a2d87bac83a97102d936dfe1a89", - "f6e93eb849c152c8a97163d9d69c704bd36b29f1b630625de236d205bb759d00", - "e8dbcedfdacbfffb65186c5b668cf04fbac177afdbce90c1f7b7501d7ebe39c5", - "be3ddbb51c6db2110f7d29c4063aae74fcc359fb8fe82d713721db195a501eda", - "271c07d53b0c2e9b901ed559b8796cc9d5e7119d09772b45deb268bcf7eec176", - "4f83bf26855a210b200a63185494886f50ef06257a00292923f7b406e89f8d54", - "8d02916d1152a624cb099642f7913fb0563c786fce26253294f9fc1df8af44b8", - "b04f6d31faa21800eb5a26cf85f617d35d9ba9bbe2b00a3811eb64d196b97942", - "22d33cb4a755f67968963682841dd4586666894c73ee2215851deae9b1e50f56", - "4fe73f92dfb7f5782e2de7a84324ec26ca74fc090bff335efc5802c45dbf4553", - "3690bee760057a03271ae1c47590d16478e3f96699705491cd580ec470eadfea", - "da06ab95981c508c8d0bc9f59409c8464130dd72d799f6442be51bc0e8d9faee", - "86107a11b0beab61aca79a514cd76ee6dcfa223bfe15b1fb7ab9ae39818c9b88", - "042a3d6b506c077ed78bf5bc41e8ca56b0d81c92fd69084617493dd2ab10fda9", - "a1c063718a6de5e45c04cb176096de6d975378fe3bd47157408c54dd99301f94", - "65d124962b2da2a6704bdaeddb96bb41ab612e3c3812bd6df98e4c7547a964f0", - "27b9be7b39caf1f353b2b853d45887f5c732382fce3f3dfaad4119d9d9fac842", - "b710e16289c7cebd845b55126b620af3843c4aa75c5aa2cf5d97a5ebf279f098", - "f2d201722b07b420aff1ddfbc925df063bef9a8817750a699dfb5fe0e5ea3c3c", - "be166a11a23d6bb5359088ea5ed854428fc3185d21c6304e530e757127e7ed61", - "63e1993f713ba40652100a880e38266fe9c064d1269a4deee72a92eb4b460398", - "e726f5908dfea26749d703ea5bc7cc7e7d419ad0eb7afc438ac3d5eee837a804", - "e52bc5688781a25f9d2ec124f1c15d03188d968cf0621b9d381e8e67be2bcf30", - "5680f1bc17e72775575817743a5783d3692178c52c1eb2e41f7ffe98788538af", - "bf6f6b083a79cdd4e98bf2fefb864d892b925c78001135e776d2eec5e373df23", - "b943df844034de2c6d22da8ba747b4bf8cb524cfa2caf813d295b70948bf838f", - "aea87783e61607a16c184ca2f00214e6fd27823b668922059c7acaaee3d91f14", - "fd570791c6189b5cacc3921da9c7c39be2332aad8e1befe81d9bc665247aa1a0", - "07e3460b160eae4520d5601a2e1789f72830b4c465ff3e3108a9ac240230504d", - "309581a670fbcadff7e07ad721fdf6eb8974709350852410bf86a550815bdf18", - "d0737d27c034f42819230e65db2a0384c82e52c4981f2c3109ecab95e1074478", - "68f538768489e9ab70ab057cc585df5f2b45082bb01c3db4c2bb13db38334bac", - "ed49e1832d4d120212b32d0ccc54c4050de40d16121b6fde55021700f9453dc6", - "5090a2e1c8e37e0d14bb1f62714b4bddbd9dc866192b4f623bde5b08e85ea981", - "e96303b5db58f878b04e148097797e8d9fa41f241132b40603a39b75b67b70fe", - "704ad3c3e77789eb004ac1393e64093ac19d4a726e7fe8dabbf8598ee8ac659f", - "c22261d38d7ea9d8417a25451ab808957c374393221975f04d66c0e8339c1554", - "84f7e9228f328a74c816d01ae5f6b3bcfee131a6a55042c2a0496c4bb3df3280", - "119cc1609ad4aae4a5801527bc30fdd4887777173c6596bc188f935bb0100d3e", - "f63a163d337cb5f617910e67eaf0fbceafdbd1b1518bcf8acb10716aec3c7fc6", - "40ae60aacb83a98fc90a4fdb7dd243e741278cba400bbfadfe39cea49ea87442", - "b69e0dd4f9bed9566754f8169fe841309dea4ea2c072fcc23e8a4f7ee0bb2712", - "56d5fc6fa51e5bbe803904fd7de47c5c6b5f7353eb8ac55ba18dfe16f9eaa45d", - "deb4ffb56c2a42598d6c66e916da2225e1c947562a2d6b51c37f41ae3e47e0a5", - "5c22372018adb7ccb22111ece9cb70b1d95ea26923ed1b683310e2d3e1b99b99", - "41265772bcf5662533121c68e65eef6b708813a447d8589543b0a31408dece0a", - "bd6385a1b94469f19aa4b5530ab50bc307fb25f5e4c8903dafbe9565f53e9464", - "2fe47907b5c5b605601de3649c2f1159b11c86cebf20c40c36ade7f65c6f22dc", - "0bec7d4cf0ad4a1f3d475c0e8b87e77b305ed5ddb7bda865a28e68a3ab4afb30", - "ef9a84c60883093dcbcaac86dc630d561aa7a67be55eecabd717345a15fdb100", - "0af1edf86da1aced3ebf28f4790bd1c775ea1789143ca369b8343cb698fefb80", - "540b978c1981e8ac2ed1d867c642b719759b95c49c61eaff17ce7062deb94dc6", - "14e0d93174bce7dc0a81d53ee4bf816c13e4064b2805f30b09c644363060b2f5", - "0e48a6f4f87adc4fb950531a1d041f562e55b34df7107ee6782d5d8220c403f9", - "b01fa9e7e51a8fe4a9460de007d47fb5bb7f344dc3aca5d1712d53610ba2ebce", - "8abd98742cdfd1868c97a80bc6aa4548733693a236d4b5f84213a070a4dec88f", - "a3f4796caf806a410e7ea07e7444e91657549f39682f689c6e2a81852342e965", - "2feb2a0dec7e0d4864708b9d53b18aec6d670b9e86b55d68808481352b88489a", - "0b7b33e0f7819c3bf7aa36a5127e424335453e8e950db9b7b10036eb735cc07b", - "851a24fc6ac5cefc6650dfde8c638537d31e27f8b92cfff786aa41e39c06658b", - "8eec10e2912d56f8ab6dd1515318fb4cb1a55859b59a8055e14bb7eca8ebddb8", - "51e5532596529567f3139f332c687488936cf5dababa924b360a2bd284f94a03", - "05dce46759b954a295d00e1556b39bb48b90933265524591c7ae2173fb6ba064", - "95790b32e4bb90b79ebbfa8b17d78e05468f1297a39ed3f4af587e4b709d2109", - "1dc60b7c037982648d109eac8c431cf053bd0992394f59a5d675f664ab1e6f12", - "a69381d76447c7e54a4ac48b35abfed94f478ab3a2ab4d42ea8644a4b941f754", - "995771dfc05a95118ed0ad5bf590a9f9d24d89c70b885653b269b6d31e2b58ec", - "cc3ec63d687a2f1a01eb8049d9246b76e96517d0725f17e9f6f4b8cbb97b5ea5", - "90919d642508b8459241459c707d1480d6c009169efa771cb9bf53e38a5d4190", - "75ad1a2aef70905959e37a004f06b46f59932b0f96c6c40012d0c84d048b0d1c", - "b98130fe29529b534881f5283b3d1b79c4677859661c3a25ee8d67cca59dcacf", - "e7e81314e876a3c7d14c47c58a824b0916a5e7b4d03aefd0ac7ac8cc8a15d02f", - "10bbe560c652b9f950f2580a1531e49ac3704773a142803af2ddf9f08a5ec583", - "4e92307891275654cfd78f06dd58ded8409a29fd5e9489bf2a7f902610ae174c", - "d47f7d66fe6097bff4db9f8c1730e62f5b1544006542583ae638979c58cc95fd", - "1be900a35c16951b52e9b3e73d567bbf335f9e651f7c4f63c40f764e13b0cf34", - "8ee2bf7947a64b07219ff7e28592cbde3a662b853c83510545a76d1820f82222", - "c632f5aa2c9f70145ed643c81741ae6f47f88e9885df5d0be5d190619e64b113", - "5a2c6704ff7ec351badabc0b4cec5805b87afb47adb150b9893598f5ab83f57d", - "a929ff14c9ab03e678d890b33259c59ad5b53ff4dc67ad3bde0b9433f51b4ff0", - "98c3da5c392bf3cee1896154b2f33f8a29921a9605f461ae5de6c68dee7a771d", - "b4c6f01490cbcfab4d824ea7ec31a941f68fbf8babad24a46edbfbbec9196bbd", - "a49c376db1dd55b53dbb01801d7e4fbc390155619ea15f52a0931a8b20b7331e", - "92a95d822e622fa6a18f76d0d6506043eea09775002ab7e0f710a3112ec74eb0", - "72e291f5cd021aea60780ef2ba91e55e7a719a7c99414cbb9628942e070bd98e", - "27c89f3c813df0872bd753c5d27a935a6c976c9a53f487f6da9c5b67876c60f9", - "dbee17efedd2b8e452894ab77f2e41c633be5416b7838cddd6d416d8f3703a73", - "d2714419b83b762c864284ccbdd5ce23e7e7b2bc61a06b5d76c7f56399443dfe", - "f79d3c4874ed5cb474c6fe948c86693fe37a2d1f57c33cd1a0ac2db8d6d63887", - "9690e88d792cd1d027336de5e49569b25edf0dde3306b0e8739100e403d1706d", - "09501350c0f2b2e0dc06a3fcaa9ce9ab40d9ed784103cf07406a782ade610493", - "94e368bcc8e1519870e873b78938366e6f39abccf35ca2c936facf56f0512f78", - "b1cdba07e29aa4a8fe7b926d197e7abadb8f002ef2722138c66448039e6afe44", - "7db380cef86e31203f7ed183421a7fb4116eec5d141d0433349a3566d732cd0c", - "6d680692984b5fed2c59147a86d0b0e60a180c1859c6198d0a9d1fd09a648639", - "25f011fd717bd0cfc95d45df25e2e3bb80dc05c6358e6934508ab8acf7a485cc", - "07e7827f2c4350a39e5802ab3268624d9d1665b7c750eb959699ea076553b74e", - "7e4677efd83e12efcde761045b509a7a03c1a5272f66861021839892893aa3dc", - "5c4e6a55ea4e1bc412a9787850f309d9a6c937e399a1d2cf91070f8dad3c07c0", - "bf64c3c7c196b6ef9c956f2093290b6b84fb1f14b004498d75be4df73c480054", - "f4e8648ff7e7e4fdb41d07fab0dce4119bc51a2c89521098fdb416fe3a47dd3a", - "b8d52a558774e0918348a9b3f5a0329b5bd855105f5259cf51fd88d80caeaca4", - "43a8495899fd6a9dddf3b69266b111d21bdf178751ca3316fc223ff1f3c1e043", - "a319cc6e8df58c09cfb2ae26836f92ca811ad086969fb354bffcf098f8a756e6", - "bddc2611167b132aad4a2c280143881fcd632bc8d9bb2dfdd4a22ba378d2a79c", - "944ee87e788efaa064db22b3bfd3f730aa27ab45ed556454842c5978e54ad611", - "f40a9f2ae1223fb162e8c02576116fb3ecee404d186d2196102ddbb60372110b", - "2c4f0a9e6d80b4534a3772d296e58f3351fc34c2b68d840f032c11546bb65037", - "c89144e92ae7c95fffe37a117b1b340467c785f9045da767b4b9c4082e5d217a", - "ba94f0ee05e8b7f08b7e2650bb5b5e2974824c8e3b5cd4f120e6ddd6ab64cc38", - "a1b91435341a227d66bb6e0a53bec0ef7a142364f0d3eb9281058d96de8d82fa", - "4e161df64b9d1e8f6a3522cba551b2dd01ea38787e8b0c6272ae3cb1b0c43211", - "4e4f95835130f6960f4d71c779466adcd4d3a3bb73ca3f5aa2a4e69edcd46db6", - "0f79478e46e92da2a676758b7ad1d85a3ba9bbfb029a5668cdbb52dfa03c65fc", - "b47d39768fdb6df8344cea2a80586cf9c8cf5a8816f04b18e53872794da4f907", - "58dce637a91f6a47f7520c98870ec02604fd5fcbe3396a8700f3a164d14a565f", - "1741e4b6244090f63268688aea69f79af09e00c952a3220560709bf1c962429a", - "ac1acc13cdb0908fb449c19d87bd371ab10431f6e45e3b375a5e96cabadb039b", - "8653140a7977ce778b0c13169ff3ffc365183e48616245844efaeeee77645e38", - "bf761b71c8a02fb5add334537a3d63926064baa3b176a59135205549ff82bc02", - "637246e90f81637267bf55c2266f81da8e64e1262035baf07b49b66adf7089c8", - "7e0bce479d679e37c7688232f7ee2198921d1d9f0edb373e8e5a4f3d26d268bd", - "4d94d122acf56879d724990e20c47246e568252282a6e8f95286de7f8cbe64fc", - "9b4128805f1f7a5307c97491db300992fec826148647bee59bebdd55865b3317", - "219c6d9f80c6c403a08c965abbacf3a8d28b71f4ece83a60fb300f6a257583a1", - "cc896cdea17fb1047d9e44808840c7b5337b9b536cd64eeb88097c9af93604f4", - "cf0abe0c35a98229856b0c118da7124400ee303bf3dfa423926646f107b1f6af", - "488bd8b60d1c16ada05b474cf8d967b4a97a8621433fdf419b8ba2f5a2e5cf7f", - "741a5fd467e3db8418c98c13f10b70f7b07d8704978fbb57e2e5cac962c8416a", - "4bbd6b15f317a611b6c0854b0bdd58632150bc98e2d41b22bce932bd3547315b", - "2e80be9d5bff7878a511b617decea78db2c2a255c330f54f871f94e0de92e575", - "640efe4188d08ebea3f40ef036351906d909af222b7b8dddb15c0d691becaa7b", - "6314ba4f7a6d4500fdcdf671c7f7ba47be040dc3595be68a022b23845e1ce458", - "8738623a5aa8e02b2f28c43165c28d119243f2667bc7e6bdffdfb13812d705d0", - "48aaffb6c8c8108f7446ec0e46fafeeba93b71a5e67aea77b3f34107ac3dd9aa", - "f6844b62a8035f2d35ea957d5df74a0e45f4b654e50e765c07e41e20c8042b8e", - "710eed71eb29b9670bdf138bc6f9462e3bd2d839a491ff4a7b4d52ad6131da16", - "c87dc4ed5afc7afc3228e7d7fe7c881d02cb1a9135764d3559d5ee8f5ab49e94", - "b79194a492c30af0f5710a7e5dfe7ccd04b87eb4121120a6aafcb735cf90255d", - "7b00a00396a4e15ab9e521556b2f96063a632d24f4b13928b02fc07c1ddbf515", - "88da5603105335e21283d95310952523448eb44486e82cae62e9647989e9fb72", - "fcff3fbf7774412353ea4eb8262b3872a70df00cb0099215ba477857daac2aa2", - "7e7c2cf2a1d7c00a720879fc6b262642f10440c2d77b0474409b87026661149a", - "acd4ebf7dff12099bafe481a7c37f1af32c89ec6fad25a84a6b28e2d6d06526e", - "bc9da644b6dc127b7deaac4b510846e84851e5022e0c41d1da5dcf4a4cd7c739", - "9195c52a74e1428dfe7b52365055b0f2940de5df0f232e9638b5e60650f95969", - "f73159e30630edef17793d3a88fbbe8b27355c5b5fa58011b6b5591c4fd686d8", - "14b19c7df6695f0e9e9a3aa7397cd72f7ca3a486efa46cf7b7a6b5520eaf0bc3", - "1c5dcf45c82c51a7533aa01509f245686be42c703b2257ec84df828992ff944c", - "91588788099ab36b6cbcb16b33fe2e967fee0ea3e1858649cdc3ef6051e702ab", - "dd279fb870ff0dbb7a4cf9fde6a2b9c5933a6a79d56388b83568ab604fdfc169", - "1f57209e3cfab7f07eb19675f256d1d15ceea3d90cc59190b6517e2e612159f8", - "4d26e241454341170729518c46fd66ed898a2a0af7a5e4eb218950a0250e8112", - "ec21739fec859090370be0c123d2099a9f6f1079f94c684ef43343f46011d236", - "1eead4aec27e72597d88a806c57930e5e333dae4863a6dfc6fa39824bc6141b4", - "b8204b42ad940302d497268f5ce8ba3549500f264f072bad244f12af6ad03523", - "b294106b958bac206cb32fb7b33f430421ea3911ec42ea4e34e2026deff005a3", - "5f1d5f5d0048d89e11cf07c89d8e71c195b6507e6e012a9f6e0002488aacaf6b", - "dc07e222db3bdb7d4aefbd9098cc228d0d9212d0179a1030e444c4ee15ae42f0", - "75483c367308ce9f282f6c8368c20a1961f37150b0c52dfeaa01870f0947061b", - "b4f3402227a6758b62be455e7876d2e5ad066f7bb2fcb547a7d1ef7e14a2d432", - "76fd46ab6817520665045c36bd71ab5ac973940435160994a9f43e5b7781c040", - "2a246a4410512513eeb4eb66d4060d581e3cf449d58e7fea988e330c0ae4ceec", - "3ebe8641399425ce7242671a5981026689846f79a946bcd1187f97b1833eedc6", - "6e04719c064966c64e16774f16ce419544fd85ea68dca96986abb0296c5de6a0", - "1b2be170586dac0457c3f83df7225c974fa11a43df8acfe98da0c2d4c546cfaf", - "42d50221e17352960f7d09f534c12ed9fc1584d8b1ec7c58c883e1004da00fbb", - "07a8bb3b59a841d611068cf3a052f5f6afa2413cde4d49e8f81e1040941172af", - "170ff30e07cb2a2d1c688d3ea3add9b9da3fc34f995e3553dc8fd1dcf0e7c77e", - "baaa73febcdb61096e0bf9a29132604329820447422ddda941037c53bc11cc94", - "8a572826522ad718ffe09a8fa9d85e7ab3baf84d2ed894a2ef696c73588a13bd", - "72b567cf2b18f5ebcbb782a0b1bb6abd64a0835fe0f06dc3e19dea56a252d3e4", - "c54333865591fcb69868af061e442eed4a88e1d32b2e66731812e0608ebd5db3", - "544c45dfef86efcead70e0ba7e4b0438e3f9fd45e382c1f2d226e76ebbf6431c", - "7dcb43f08a8c49e2326a8a282d99b5db376984e8bef23eef8167fd51771ef6f3", - "414a0b554fd2cb5546980f676e87546cbcf4a79df2750f60ee6ce9e562809403", - "95aa85a3f9334ddf4c9ed1242fad25d20b7c294cd27454b15510d8283e9c16f2", - "414ccf29d62ccb287b77ba1f2b0e8d9dba458d5d95072b34f86a625089ff68b7", - "603467d63ab0b18162d08f59d6b5d259d934774e4c9b54c2f19fc1e351aed67c", - "45798d07d6466cf62bc58df5a3f5539c5ff584202bb71c475f6bb12c081c4e60", - "d5f25713a8bf8c32accc95499d8db49054e41d9a9feb8ad52a9432b98028c3a8", - "299c9fd33a3f8488bf5cfaebf71d6deeeddf247147eeb5642834c72291672004", - "ad0316ebdd45036920b837f5483ea9ad2d0a33131053adae2138d6e6b66d693d", - "e93143d5849923677d225fb3a1af8ba04e7d8257d1ab9a0451a712c7ce98b7f1", - "7ac952d1e120c1120fad142a868a0c372f16c406f6458e48f83c8272144bb0c6", - "67d8ed45be90cfc5a071a527596c848303398c6f7763051867b9b3658f9c1b86", - "cc01ecf9e3a405f99dd163d2e5fe9ceda53b783b1d2169badae52fc29d14d7e4", - "2815cb6811bb131159d938569f34042946e34e9c2a380e14c25c24a83bc44249", - "d6077e544505c1fccddc1c0048734efa5dc7626ca9105cdfbb143c88bc095b4b", - "a71d5c4a15c50e587083b874192f63067d74cd39cbc93cc662b043668e9767a4", - "ae9411379ba9d9d153ff9571183366f75180713850d3614adf8c75a015c89ca7", - "cfa9e7456ad849c6fab82d17253a178ab0b750a6647a149e50e49c0f14b7bcb2", - "4c6270fecf921962903d724218d2a423afe634e19ed356d67b495c0b84140aed", - "b67e79da5763cc18edc95d88398714302dea60b74d24158bca442b7d4f0f38d3", - "6dcbbc22fb68365135e4d0b7fe4aee5faeb2f1c6eda0a7eba3eb71b9d7a66f5c", - "36f5ca33ba5201a1e6d0059b9138ff3869449e6d7c0e11d88027762273d59c12", - "22854af9103561b6cef3e0ad522df2615edb9797546a2629046cce1370e52d59", - "eec037dda8f3501b9041297a1c0423b6158faa4c3dea34bd9e26723ee6b0eae4", - "5a7100c9395d3e094d0b574bc565768a4b9d471527b1b1fd1152a9f5a63f89f5", - "7ddb0f641927e2f258bb3a0249064eb5fb22c1dd1faa2ccc22d4a1b436bf16fe", - "127eb19bdfedc973cab3d7b4f01c9aa14b305215acc7295a5d1a8be681dec329", - "2ee4800b21481c8f52402c2ab98c2ef842da5b70be47416f45d6398a70e92990", - "8494d584400bed45e68bf030fd2117890c9345c25f1e0b0e92973a68cd7680aa", - "1491924581688a6ed94ce1902d9935eab8836d423e45c0963d508eb6c38575dc", - "d32782e254159ce935f7b403436c6e7b9601487f0c4cbb9356306da0f78ac088", - "62a8ae33c9d0c14ec8b25aef1a5c7096e47b928549aefb032951c68b29f41f42", - "aa3a14207c3cf1f3ce7c1b44d35d2aefacdc9cf6f4b66d054508886ff895d80b", - "774353028c02b357a82fd30f3adbcdc7f26fccca16ef37498e76835774cee413", - "d26e4d4ee10d79dec3a91743316a1083faa0dbe0961283ff0540a9513de627d1", - "36672a376e869bee46643d7e4714653198bf8ac41e2d8d51e2a98e48159682e4", - "8e2f6f0489dee72882805e0e649e2c6b64affa9a4d087fbd9c8be6efaeeb1896", - "b87f422f587848e69a7bd6e1fd2612b189b24835d5e5b3d4cd8276220fb5aa60", - "d120cae09fd23cdad0e68eb34ebf512dcd11fe1c550f8734abce0eab54df5bc5", - "e7cba08e1892e09013c6fba88ffd090cfb02f3808929951209f9ec2026eb259a", - "ff69eb97b83943f5cc346cab7fdb82c1b9ef23b37c0bedf9a236f0b846fae272", - "604e132a4b190aa50c0b6592c3b55e349251d5927f9eb790c6f8d802816e867a", - "2dd796b2c0c82b2e37c9d9b67a64fc68b9231db1692d808dc3dfa24e6c898766", - "bffcfce44de8696c1ca82f9c678bf70b9120c3a99dae3bb5f85b37ce8a78aaf7", - "7df7180639d4b420397e6071526a061d3013dece78f1d0bd0d659256ef9c4677", - "ca864439278d91de0e0ac9a0105337cc2011bfb6cf119c68ae26e20c40bd3650", - "40ffb8ade35278e96cadadbca1b54ba5de02f603574f0685fcfa6839dc3262db", - "38918e7c149cb14b58dbf4ee9dbc4a44c34bf355f5fc3055742a1277bb57a868", - "16ff40dbb90d5f898672a54fe830c4e40da8767d8eea56d9846507e951d31f7b", - "2a4881162dfa0d0aadf150ceff42a640e238ace1553da3fbd6cd68a7dd04c477", - "1e1e651f74f05aaa09f2b03079896434a4a60e5fae34a2ded310ece9e949976d", - "3d0e8995699c76ae4ea1779f71493042f63cc75649535c1f014a81f42f75e99d", - "4fb4c3cba73f51ce09d28e58ef7b5f5e17f79e2418d4c1e008154f25f1da445f", - "2e2fa78f60eb646a80c8afb0a2490f1c520506c6fdf370a0872766eb28bfa2a8", - "a0b89fd1a4716d6b2ec62219479f6c21527728aa237dc7ee396e167075fcb30d", - "cee6d7e179f597b7bdf0aa330941429d6c58634aa4d2e82edf85618b42956147", - "9b5591437c2c4d8248f7e6400c5d51cf5ac174d84da48e93d1fd4e51f34564c8", - "14862af9646c5ad67e1d6f3ddc074d0e6889f2259e9a227ed4917dd2679c8ada", - "f22bf6cc7738f73ca6897485eb00189711a8e8e27be58e98936319c4f8eefc7a", - "c24b7f58db06babb9a280a8934b68fcad1c0ce4e25cba19fb882b1ff4f452d75", - "739c5d114b2d769235c2f2013200a35d5c90cd66cbf3033a83e4a1171d4cc71b", - "9a03be8acf7d93204442ee92589dce2d70166ddede27f0dc604ad3927449a47e", - "fec828ed5b6e72aebcd21a82c6e92757f8fca5196c9063da390847cb2bd1076c", - "b520faf5b5a49b3a9bfc019ea5015c9e58fe7eaf0e53ac26bd5ff35e433760e8", - "9a2d7dfafc36e993f2a5635ef7cd64a1f0f9b6ba930be2ee44c35ca8a4bd2dc0", - "4a59e0922ba79e2e0065c0c965ce244564dad1fe2017af4228b82c2816adfe5b", - "e66dcf45a8a97578e0a6394418988bb9b0ecb466134ddbfeca4da0f0b5548a6d", - "192b84dd25c343d968bb073be531dc0420b1cd271d6dbef197b53a00999a45ef", - "cf3b22cd3fc204fdb0539b899772c8700bf20be6c89f9d10b4999fb692d0af26", - "b4b23e1b5b1aefab108f55fcd7bbcf91f94334ecd4f5a6f10d76100e98cecf18", - "60f06debe7936ed24f6d7aa1ddd67b6800dfe95204ed2ad16aee8c6b45ee9ba1", - "c8ce448e744880b510b167ad92b17b053cb25433a5ceff2cf0764ea5b9e27284", - "a658525c546de2605b701a15d5d2bf50b1d0bf82c7034a49026f09a1c9009e2b", - "2923d8bc4705dc261eda32f2ac8930be0d7183461bced0aff093b6f8ed29c0a6", - "03f8f9262d25d9a5a857195b7b852d944e6fce73559b815bc384c577c6163a59", - "284c60edb4bf8fbe88497be00c4eb2d810707b12aa5ae6abde8ead44e8674644", - "7de03aac7250258879fb9a9911234e0e64200e7bdfa39eff01cd60f75fd8897c", - "261448b7784a80f04b03fab81fd96a5551eabe346473dd0c33a475d18621cb90", - "594426a552c8db4d32fb16dd48ab414ddcbf16d8eb76cf88a74d42749c1250cd", - "a923a89d7f5c19c26f00f9239274ab38b379dadba941ed09ab215aaba4cd2a9a", - "99a0849e87f52ca6c71db04d2c81279ff4e3ec804cdd7745be805471e0e1972e", - "a423a1cfe5948817d7000a6949930f841283dffd5f47c647b14313332e2238bf", - "3188154d5548f9563d4f82d55a75af1d52205ff33636090e4a11b95235eeff3a", - "68e59d1b4510c28155f903d1a87c7db22ee25046f2dd14d94cf79cae4e0cfcf1", - "0229b61ed52076d3bfa2e404d9fdf3070e109befe3b88611573b73d56b9ab014", - "3d2a08c00ff7b9590948c0e8e7ca1c7dfc6f7a0e8d04d3e1231efbf726d327d3", - "0f3cecf595fd4af736d8cd7905621ec65115b0e7bd355f94a7da19a1b4c9d43c", - "469c6fb1ae4e92abeab302de50a3176dd7a9a45272978b9f59a894d57f7e7b98", - "c0e777e5de1119ab5f5721faad3fd3daa1b68bedf4334d799d03a67cb519887d", - "15269cdc5a1706f5d2edf03da692c79eca6d348039ef7023dba33e14bd11e491", - "f1de7c3d41ad093ed6d69db8bce9fb4cdfab2011a1a2e965e8985c0bc1c90bfe", - "d88744cb29876a24e6797a1e1d5e0a859e87739c273f096f51c32ee36155ecba", - "80e956308768059dfc9ce4016af05cc7eae3d3879dddf3774d4265781f554134", - "6494af2477a5c2750674b94400dcaf392d1e6e6bdd2282a17fa090d792c7ccab", - "baef8552084ebc5a98efacc172f6db27769ba6d17bd01b7d8e04fe86cab0c020", - "4da663c728a9dac83394b1b29206620f7d140381d6557a4749411e815f9313f9", - "2eb156099a08e51471bacb179fe7e2b1340ab576b6e4ca9add4b9f151ce22215", - "c95c3a89e46d2ce9e3335c9d2f96873bef4fdbabaafdc78b6efc25a3df4d285e", - "b571f26e25877798c97066e4665e7791115ba84172e041cc6dfae1260a219f9d", - "0214d1d691ce0d07d55fbfe2384ca5969f07d2b8027ea4201b8d31db8f59f688", - "e2a033962931e17a5d8380a6f8111417625f1592ea7c15bd7f149eba8af16f81", - "8e649acd773823d3ffd1d954429bb83056476959e2b62241674abe39a1a27e4c", - "4ef4014d711ca3e8892cbd83580b44cb34a992d4b32edfe7a6415e40be284770", - "32c75bc7aec91cb9fb4d62b15dc650a08724ebe712de41253fcc2c425ed2f372", - "6f69e3a733264bbc5a780550614bdc00d218a33d5f5b9b479f57393a99153338", - "d2d3e20d0f7c16db564622f69f139e19bebf82d2e2e1b42a9fefb851445877cf", - "f5c07f756b412aa247b88b9ae5f5569bf87a5b6df629e7af03317cb26c57a385", - "9786a675f96e96ac957fb504da94e126bf6099e08477a062a611c4d4cbcfbee9", - "7c94de6926c6969f508bd8cc65d5304e39fc4434c5ba3c6f1c18eb9f474c8595", - "b8801330591467c79d85861d0c0e6d6151b8582cc0a081be5998a6081dcdd09f", - "5edc89a3334570b2505c993f0952d26aae2ad8685d160472284709f3ded87a32", - "b7f1d1c7b43308866d3cf15ba8a184714b57c03c81fbcdd4319cf8472ea22f07", - "25147cde9672e95d099718bbf6926537c5469bf8483899312fd13a735d0ff314", - "14c96c70ec5d72c80a47bb2bde792e196b8712b7f81ed0518317c86b0d858211", - "0a15f915b93274f63fba0a3ee9f793e6fdf81d414cdda5d98f0c0dc2a013ea0f", - "5d5f9596966da8a269c8105e529c2f733deb4e2e3502a25a1d382f7eb556185f", - "667bc3f080d93d9849dc2043be8c28d671b1ded7fa68e5881c4b63fae49328d1", - "5be9c95830e190335154f2a45473cb6f7bce999dcf5030c96c052185572f9bb0", - "52e4f271e3f05f9eeb29fbad2a1d5b0d89244db0c5a461da9312c4d7b2f3bd96", - "4fc3767f86d68853a593945ad9a60cf43472db2da99c479065895caac80c1d13", - "856352cc1366b47a16afb5117d02ea6d28e05e265906f50e85f5b1b024ae6950", - "96a8f3a2c853fab31ff5481f288656329447a1528c784c10bfecbeb8eb266aca", - "b22bfe38a92833a2d6a0a90c439951275fdde86dbceae07424beda2882e0959c", - "d8da00367f6a07f900c4af948f47294c366875d8cc95f9ed0a584266d4cd3ba7", - "8339d7568f352ee082eb83f66d1c2dce7992fe60c9c1ec986821b0932b1b79b6", - "41a573d6b666d5e096fa9458ea3151a5c8dde84a827a1c68ca12ab77ee88a1a7", - "c6e79d82ef990ad790e6a5d364ab281211a3a20accb6d7115dbcf063d6f2c94e", - "1a1770a943483606331f14f8eb8fe36fc34660b3aebe756d098d312785a50e07", - "da8ea5efc46e2bd64a1877fe24b090bf8384192408bb1d36900be2a677ffba69", - "a2cb7bc399602f2b9f82358f664aa6b734a152687e033b0e46bc185686edf5f6", - "2c388ddf9af9ed0a235206eda75f697bd05d4e0b3071a4a5e1d9ada5a7dff6cf", - "5d39a7fffc4d3c68cd827ffcb87eb00f541849caa020c05ddfc8258f1d74dd17", - "a9e5b1b157b13920c49e0430ba3c923ee9fde6415374a957fc0de7b0739600b9", - "cdcd1ab00a5bd812ba77233fa2a41f10334012fe813400265046ce516094f0fd", - "7d32f5f3b8d29d66089fa61cac028015e686b247ebb5eea977a8abcf99c8d202", - "49a35094041b876d350e97361961ff100c33acce823dd49a52422df3767d44a1", - "5574eaa65e0e6587c4470bf7ea0d74f7b831ac3d2c5ba977d6b1d91d5bb0de01", - "b5f1645f86e47fcbde33224185240e900f81a6915092b3c36eb842496960f746", - "a90cc930bf689a52c4383f43936a48e47f58958bdfd05bb73fd06fd990f46d16", - "e17cac58055a1321b930b195011cae76c02dde01f6a2f45c95039721851c13bd", - "baf718819837e35f7c103d171b204e5b176268d7f3fd0bf5dd7caecd58452d19", - "faff328445dcc1567e66fe36e1fa3354f9d94ed0a3e9acb3bf3b57cb17e180a5", - "24da3c3bf8e0db7ffaa7e7cfe169ecfca61fef105b3675b463edb5c305bdc9ad", - "2b90d6e4c0bc226fb93738a4a263dfaa5f421d11e41dbcf5d13bdc3b858f7ddf", - "bd3e6c098e166fdde0bb8cac5e7f9f3539c44b53a7b2f590ee52a31b6d13fbd0", - "20dfb7fea85351d6b5129ad2ed316d4a52846b01968704eaea6e2174e831c988", - "868648e4b884cc5a5ff06338abf1c1c2216538739f27378f2cbfc8c90b51e7c5", - "b29917c56fc517bd8402237a9b9cebe180f4ff6c82b4b9bc5dc160e685f07c8e", - "2a1f7955e2fd02cc168b0aefd9377cb95b4b92b4fad15277afdb137de7267a5f", - "9d35d54e772973a4410f81ec76fcd90c478874a10e2752ca73f76d8e15677cd9", - "fda796c3db64458fbd9ef044ad7b554665c286f934f94d68d921aa9f998781b7", - "b137c859f40b832d8643397a3d97e5d4a8eb1748fc192eb080562f9e180bb0dc", - "232397e793e8b4121ef058245b7c95412a56bb316c44fa2dba725f33fdc36607", - "d435fbafa5913a1105e71130cc1ccb80f64d6700801163d50c57fd0f7910ac58", - "55d41fb744a8b94b0b187ee46892cc5c567bec74012666899905aec33796cd02", - "a3b173334f0573aa5ea66c19f5a2c3dd08f61f61387d341c5922a4e36ed70bfc", - "8e747cd091c3d21081c8f9d2547bbc4c975fb676d90e1ee06b2a2daed2460fb1", - "f6561ce1a1e3669e40afd8667b46d8136c57ea96649092a1cf43f89bb00c1111", - "33ab7f5acc94168947116eb84b2456a6a36cf8f766f2050c7a806424dbc36ff4", - "ca6ab456a74aa57630fba3e9fb1898a940910bb911e30019bf37f0c507774752", - "27fb6d461e335d71b0a9f2c8c11a1f97dfabd8b9771fe4a12dbc8bae831f86f6", - "41d59cff5bfcb4c8a64eedc6f12709a87917d695a6f68a07f6a78202c8cb91d5", - "8fe10c6d32f9bdb74c33a338a61a35c74ff5f55e05c375fa6f24593a6d916ba9", - "5f4e86ad582a6c19a7ada067cdf5a713bba2941fca984763d3ee566b60249a0d", - "43465c37a8e8c43fb87d2f7fecda5c15b5865c9c956de558385a6535d613d062", - "66b14337e501a708045890e93a4a53fb6dfd78a5a8b81acc84b9d8a94f00d1fa", - "3a334db4a4be68d5296f5765d977fc5aedd4357af609ff42c087be58b01809d6", - "b36f668fb3a5e42936847fec4d4cd89d872faa3ceafaea5d91805c7f91f822cd", - "9e6e9b5f9640b74569ba2454d70cf42cc38fe86be835b3a7eaf2dd22b9481cca", - "a62693c451825d67d04cafddefe8285b9c7a67a465e7d23996ef65cdadbaa6f4", - "f1f474ad889250c0854651be9f1d060e62e67318f2c78bee71cab856554d7118", - "0a605a0428ccd1fa14cacd424f207b04310a29cfddcafa6493249f176458c3de", - "5bac7aa616d779877cde7cca59691f9bd1b0727db393cba85eb5d522c87cd6bb", - "5d2e06a8523522f322b7c7f411977bda552d75643373683a61b7c6f49c8c2cd1", - "cee7f5d5a06a376f858fae457c77059c4d818687752c48d5ba5bc62f7929b350", - "e0f0d99490de13b6f4ec567042c25fbaa1b222f7c153ebfc626ea4269a7766b2", - "16e2f91ce3dd2ee306f41ed2ed4ba6cc30ec924d626fcf85a7a957ecbb2b45f4", - "cb2d61bac150d2c9b6b644663fb26ce3d1e7876c00a51ad6412b3944e3c4d984", - "8436a124ea66c1e312bc61986c4c1ee22529892466a41b3a21706063cf756a9b", - "3954ebf3c886ef89c1eda033f4523e164c1695844a94f2c2426a6f15719c26b2", - "db99e5b8f3bafd60c73b195523c1ccebc90131dad5e4983b9b444b2a42804a2a", - "78a9217ed936f140a7a292170552206332da6fde55e2f382d153cfc970849c4c", - "7107b74dcd0c696fae47d670a6aec02afa7a19a1db56b02095c85f3b7c3fac23", - "bd2152de735d37e5521b0c4d01646b4e576102d12c23ebf9d6e97e5e8bf9d5b8", - "75ba46e1d0592230742c96c7062370a257579dbbe0f28df0e0393222e609fee5", - "5ffe1d340fd64bb99e71b758ba88d78ef75ef09fb63e77d759fd09863198f13b", - "95edebb2b7dd5e7e8cefbab1de822b2c0f76ba2f41ed088ce71efb6e124ddeda", - "b329171a866c53efeb33b52f4f05178bf640bfbce23210042422ff4200d5f1d8", - "d9be1eed9c89b86e2c061e5be10232a926402ecbc07705eadfad61403ccbe3d3", - "aeb3d4baeaf0459b9140f4cf3ff980d876728b08360ae7af14f6bf8d43d6977f", - "e15101f9e046961b1ebc4ada1816da486493905cfd3236fc7de91f8877375880", - "6db31393c1d0527fd593df9a37e3c7739a4b5fc058885b3b7ec692452c0036a8", - "34004b846ca17532167413baec380be438ec8868bdebc756279db46fbf932aaa", - "932bf566f60a80383ed582f85539f9d15a0d3400ef2897c8870d1d7cc4d405f9", - "9d124b3a24e43fdffdfe10a6e59a10f3a18bc798191704e04f92db3c68bfff72", - "d07cde05a822f50b83fe75b006901599cfea2b6b113f68b32edb0117184456b2", - "2313bbd1e42899b866c47a653c9d8cd7712485d7880bfd56904563845fc7544d", - "fcc50094c27bca81a1d3220b3913a1c79e0cb7924dd96d7547acf26968564a19", - "53151185900de523b51a042cfe3b15d427d8904b84e8184a0254a7a35090b5e5", - "d35dddbd29657e6dfc8c6fa93b32801d8cdcaca4eb64a7fe036ed0f64cd8b8b2", - "190c6616909afb7c0abaf269d1503f9d5f59602566e1d7e43af595bafbb6949e", - "e8ef0331e5393204555a3f5601deb06c158b091ce0790871eb93c8b2d0325fa6", - "8dea172e067459fa5f8615f21dc286e3c8846df8433b30747165ee8fcd45e844", - "9644c5aec4e19c2e08c3cf511e7aa1e62b880a5d5d4543f8b9155a9980f96838", - "984cc58e0081c37c5d6b9e3148c3574e1038ca305fa7b4142a1cbc5df9144fe9", - "29d439815f63f460604c9a4a22417602657ba7e514a7f974c90449c384dc9fb9", - "34372cc9d1a3bf8b7fbbf083f6ebef8dff43b9bf6cb776bce9d1b773a01aace0", - "12dd80198d8199d806609e88cd058e57a991daaca68ebee9a8b69f2985957125", - "b4b610beee8f78dd7a710a66717b95e9837d579c9ea2850e2719e3c19889a7eb", - "964401ebad3fc399442fe86951323fca7c2746c95372f3a1a5008bdc9e64e690", - "3d7ece6a340faeb41acb54c304011ef82139e018f0fe65f75a3e50ec8653bad9", - "2edeff7455e2f8587ce0e5da5a61d0a915a708041934c43d0e849ca0e3ddfc94", - "75834b4663de4b9153ff3cc7c5c41c2eed1a1371c6488612045ba0185e71a7b3", - "15d75b784149bd6c1e4e7ac234a090734cd518978c3ea5fa926603330735a4b2", - "7a9ec2ba9230bbb9d480c3d3b1d307ac5f7a99596c765ecda27b09df12b94b4a", - "9e59e37277a69ca7a26b74ed95614ceb9fd21e9d6c305d298cbfcf1d0a85a3ea", - "e5256ae572c69bab59d9ab5d5cc07c5660d21f850b2a00d749a0b1eb3f73fd3f", - "091155a312e627efe2850eb2de5a8cee25debce2b34c1f0136383a5c7fdce058", - "3a957987950ed52cecb49ba61fc77f21ad4af9ed8e81bf0c20cffed2f5155350", - "f6354c7c2d2dd2bffeda82be7857f2d3b9746000831b802628e62cf2421ad3b4", - "07ae878761269a7bcb17c8916c4325040141a12805dc2fa70b88a35c3257340f", - "db8627befe32dc855f8ce99a6fdd35e5645f7f9d70a046beb9406d7cfbc89a57", - "0ade6df81bf95111b6fe9d26a4c46b951f61c9fad55aa4a978b6970c35eca552", - "a1b7ad00e96b71677187bff9764b60aea50bf39c5681922494a64ed77f3f57c6", - "b0c359bf3daae66c29e410748c8e1d71d719c7e5d80112b5c4918122c53c781a", - "7c1322f659f207f195c68b34c2c1a2efcd5e2bbc0dd92f379e5e8baca807c5b5", - "689cb12cbefa2790fca8d1ff20e2d984b6fb2096416617adbc1c66f53466c819", - "7e1eadcdc23136953c7349f044f73c8122e7e20f9028fc4c774adf94db4206d7", - "844ad144570950f3773a6a633e63868c01635a3bcfc91b6d6abba86ab3d1857e", - "7a35b116f29b651834bd88a7f1d3f36ccaac99d553729622829b2c5abdd87b4e", - "96af6183c494ad256725fe28503bd6fcb1fa395023755121112d8fdaeac49e06", - "f7e444a4d4062e7624020ccdb2d1e67a9ea929c846efc89626f2de18b2a3692d", - "20e5285adc2907995b62b5509bceef898f7f382ae34ffa2af8bbcd9752960f48", - "893f259abb91dad481343fe20893ecef69774c7348c06326bc984165aebed432", - "5e6f50789d0f562318315d4bea423f109564546c3571bc3081cb58057bf2eb21", - "61662f8410f0f900db2d73da53c46ffc097f5eaae89c895207b5796b198a7290", - "17a291971d1544e0b77589a1c5802e7bc3ccaf8119bdb51fdcf0be7729986db0", - "c2cee0daa8876587669ace53e2aabb96d0ba759ec0942a4d4e5bae043586eab2", - "023589cdaff49f2db448222af50ef6ee70605121f94b7ea189a2970ad2d71cb9", - "cc5cfa42a8ee15bb8d99fdde9aca48b6b17dffc7e2a1622866b39a241b49e9ef", - "17e395c8286feb386931c3c5c2892321c8c5d8eb562bd7f65619c5239e93e7dd", - "7a3bc081769038fd88d89b9c78ba835b97d901aaf81fd4b35caa3909ff282363", - "058b83f2d8fb54b5fcfe2cd1007194036de9bbb70130196cf4a0a2620a517e6c", - "1b05186c41bee2863c266379d666cacf3f6f81c8e45f30c646b1a15324eafd3d", - "213ecbef8e9a3febb6df364286245833e816ff87a691088aa5ca5049d726c599", - "8a1f5c75f8a111070c4561ee76b383870dffde1b87d3b6ee329da967665a8ec8", - "81de291a913de697b6e56cc28fb3bce191935288d9c05dc87454f6d9b4441e20", - "7d01de7dbf2fc822f3d4a7ec63591b074292dc111596d1d8b604cd6081b2bb16", - "ba90025971be51d2b89b13e3ca1a225e1dd10c83ac6adf4d2b8d6828c7a30679", - "499746b01c152c8b6f224991829f77d5a2f49780cfab6474d496d913b627aa16", - "66eda365ab69549ad66b9b96fb2553fa640e7239e569b46e11e8b0efb9cce672", - "d8261c7dc6ce3ff43666b3376dae4464a7d557c46f5adbd72f69645e70c1d99d", - "151d01693a874aa398d8678273d0976739c394bb7f92eea5b8dec5b9bd1705c4", - "29088f9a893b16e2a7b914ac896b84c144c9a33dc71fd8fc8cb27567f5ebb40e", - "ef71b07b95a5a474af6ecafa5fca6949822c31b32896ca47de15f6952b85db15", - "63264480ed93b89363e0b751dccc5d11666353225bf88af611e6f352dd93e77a", - "d22f75e13cb3d96db1d1ce9a5b30d4999ff6920a2ad70cedc83686ed39a89aa7", - "7c5e00bc757ef79b1b7b75faa4e0170e304db3d0ccd5c34e3d634a97b8f14010", - "4e9792620ceefa93c82720a19f0640ef2b11950e0d97114eb8bba5b3bda3e49b", - "45da1129fd73f006de2fb7e0b7253e22539af8e7caea63a9e40147afbca4a101", - "444923b8015e146d6efe9228e39820fbaa8fb42691000dd962eaa5e47b913bae", - "61024e24bac38dd65627345a4dac365d08cad78fdbeae5a38041b04a6bcf292b", - "ca80eee74ed3fe9f7344e3a9da059334dcf65a9a6b5e8f246b00883352f48a7c", - "f0f53ffebaa329c23a6ec1e60fdc06c2b68749c8381b59fc3161a9d3464dc122", - "31df3443b677f1df9426962a4f0e4959d8eaddfec18535164fe6ee120ab9b2fb", - "2212e33365218b9ed51f55ae3c03748108932533b6aa8cce557cdeb677a37f96", - "3cae687f1d6b05fcac232fb01395607a5ce95031e512ac2b58ef563a55d96e3b", - "40a24fc7cb21af6e231ae24b251572ae7036d5e9f379efc6316a128333c6ba42", - "11fa7001c934687519166b620bfa105bc14c54ad1a743ebfd7495c5be86b2269", - "862583484ff5ebcd89710ff27ac7e348cf6c5c5a0d53a2023395bec04f0393e0", - "8cb0607b98057b6a171683e549aae7a70e618a3261d68a5ed631ce2ddcca38bc", - "626f447d814854d69c9e2772c313bcc169bb0a3d9be30b7a06bd4430c1222654", - "f40978ddb7e53fa55f76a4c4daac81585057e85198aef4843904eb029a5e964b", - "70003d5f4215332546d62bd661cc4ffc41ccf52e0662724b7233fd6256ef2a1f", - "5aefcae945ea23a9e2841d6c5a05606a49bc61d90f5dc5bd65b1744742055c95", - "db5144bd4db812c100e8846dd47248249acd80fec6885bbfe4f46e0ac8edcaa8", - "6315629e1b4c19191e08106368932d8a3d09cd34d36879c507d3f3c3c5483f20", - "28549abad9c20a70767fcdc89a3c355c8160dfecb08d4255164f03009aafe299", - "4dce577b320c89692a8fdec89e6af57ea82967ebf50fdf99786afe1fae04083a", - "5bcd651a4c01128edab6bcee5937bbd14ee264d823a908e457e8a168d4f20490", - "0e9a65d780e549cd9e2490e9a46704f7017b4d180275fa0f45dbd52dd795c0fe", - "9034abc3155448cbb149abf8d803ba6c442529ba9295027bd8eb95ab86052547", - "73e51d327ee82979676cbd4d1d52071aa3c21e1a7339911438484b5370e8cdc9", - "aff72a9f3fa8c15dcdd72405bb0deeec9d84bb9c4342958654c3f65b49b4294c", - "12451834d09c392b457a9e193ecccc645705e633a480425e6398357f111e6fec", - "e9cd6d73902bdd9f2d9e73cce0820df653482cb0881f86cdc4ecdca5100db3da", - "56b3e24a1b9740115b3bfb54348d22b74f2240b810da360bfd716f5bdb535f21", - "d52f7c3c55389ac80c1dc3154580596ea4717fdd0835a73890ad038baea90069", - "8c2ba06c4c20afad8b4a3844a70856bb3b8855d5205a64329a47d1e181d60380", - "61ad9a557423993777511786f838aca56bf872b77a9af6d988acd97ee61cb341", - "ff8ea143660aceb9b978950d063deb4e3ad001fd84127dd7d33c22404c6e9936", - "c49f24c14f7ef89dad1cb51f0b084b16af01408c884950948edabfe2fc24f3bf", - "ce3227b7518d149685d8e3c878f0422963ddc99b4ef67d1a7dfe658498ddfea7", - "f62929a2e7aaea7cdb74d8174e5517b5c79dc6e4926dd66e19ac9de133c38b53", - "c987a1c66738d86b36c72cd2e752aacf0683cb27cd3da44d952649381b8426f4", - "75e03b05cbfd7b5ea53e5951ab1840dbada00b03b0afcd202b6a9f3f77fa8515", - "fd431622e9d821a11829cec320e0aa952ec3139e3496601373d978c62d319989", - "7e835400891278b0ee11921315df190b087c42dca589fffaf23f6bfe25b8077a", - "21fbabdd53f1e282607b31e0476921f3ec2caaaee2106b340dc7dc258d852a4a", - "d15e9e0fc538f5b59d71b2d6e478cea8026532d0d70d123861a41ab4b9f1c956", - "c37441e9d2b69ca3dbe38c76b0254c65298bcd01434711cfd092351b55150e36", - "1b13809f1580a02552f6dd81d3e90206e76ea3eb65cd7db5e44c34c6134b1ee9", - "fccadb9869744f1761559fd70068da34971f4c619f88be88a7f735c124e4a992", - "94b1dd42360def4db3db04aca8ceb9d9cbd4daa70c3f8aaf9753082752038e68", - "a01ea9e28fb151fa9eca05cca1381ad3cee540bc20a62ad5564678d8b8a477c8", - "6f544275f8ea1fb722e89f21dc805b79ef8f314478e0b0a6cd08a7f5c81e6e26", - "476feaa16ede5f5bf4dab325de077a1c1fdf5a24cde071777a52424f30db56d4", - "35fc64e0c79d888b8191be6ba033c51cc2d636d8e8d492a64c6be198364c968b", - "6173746f60c19ab3944b92200145d70a473007b19d05ac0590b03760dfe6c148", - "7a0533c85a84808351c8932cedc42205f68f8b77c596b02ce25a43e51d1da51d", - "de99192055e059108a95e0c16cc2e7e31b5262f392f7e72ee3cc1e55c19d5fbd", - "8769a2d4df9c6486a83eaeda9eee28d8311c93624a41d4a0169c83e7dc8a1345", - "d148f38d09c22ccce286eebd877476010cd4e38c4521af96413d8984caa9579f", - "dfae0c9b14bc8344f2e4b19fce57a92c1f6a1f1cb587c6c77b1ca132567e7220", - "9b5631d860c63112bf9b66cf72e1f606c63def87978aa56a4085be345bb5c2f6", - "44c1b93ea6187ba7a202f08d818c54d29d3f9caa48fa25079ad8b1db7477f8b5", - "5580b7a89c2bba083fc09a014ae8fd98b174fcf67aebad6df7b1c6769aec1acd", - "e7e3008a2b43204af1fea6198606eaa4fdfd3085672ce256d75d73929e51c4b0", - "97dc7c7aa427ea6d6ef86405c1c2bae80727d96b62eb3194618e020006c431ae", - "a80807a34bb07db2d03a23ffdc35fce9fb18af52f027f9faa3ca303ca593a0ed", - "6a485c96eca0ded1f2f13669ab2878c497f8c6806c39d72e9cba6ae15de2d650", - "f87a638a7140bf9f424d25bca74250cac219649a43d8c89d95c69ddb4753ff23", - "1c049c70067d72871effd9519c274aad3b67506491753a8fcbed7826da62e2f0", - "f154855ed922f9f9e48d28e3dc556e57498fff3abfb45860ef2df00075de482f", - "88d721a13828398f125f1493c6a09db66b516c8a26ad54960c1251b754e9fdb4", - "6c344b9ea9f5cf2229dc44eadaa556af6c486e04d842724879a2ae24a409ce37", - "ce2d9b556d2a8284b732090db30a8108f58e20f8e37566e0b63f2bb5629a8393", - "4107e04246ed9de221c3fdb3c246951fc02219e0a0abda03a2059b9080ead74b", - "58dc2ccbd3b220c53e93f78d1343011fbdcadb1fc0bf922f0410fa0184c0bdad", - "09bdcb568d0368253d385506cffcbecaff6adb80d0d84a643330ff4084448170", - "234f68bd1807763a94a20165efb4bf8d2acd743caeba8736ec03da632b03d9d6", - "984e9ba2c81dc4d14f8a8d70df3272b4111b5f47caabc6542528ebac41cb11c9", - "43637493e19ca63252b0824817cb2eb17ececca1f752af8a999cf4c2609be607", - "f16f778d5c24a557b03ba7f7cc0f99e7cd6fc5934700ad838bf8bea80a5424d5", - "55987e4b61f550409ca385bedb44302258efb4a28b988eb23bacc27e789d2d59", - "58aeb6e663794ebe3ec90e6ea4a43a88d00ea18a7110bd527bf8ff6e01b9a5db", - "1d2e2b89cbfb4d87f48b2df5d66575b8e9bc9f5f6a3aa6c4c7250e38b1bbaa53", - "2f20c21d6138e255c381ffe0ca1135d0bcb1a520a33b08bc1dd4cdbcb472b958", - "de50fcb2a7e3fe168b86d5cfc01d26c32e41c5d341beff2a986cc53d006cea13", - "84e01f2284a2d6e42f9ba2d96e8e12cab8d60035c252c2fddc9c73a0de1eab75", - "1acc1f609c73512136d532954302571d05426e9f7353e78020ed87ba0e767743", - "919e6accc68201e08e0458abeee452b4924bcc1104d3d836293760fe43b859b3", - "e373b32c7b8f580f813fd27e7bbf94fcc4fcbe4e10b0b96f4e63b8cf4bb87e90", - "606693221ad8ecce317708be2536bbff55c580d887cbac42fd2c4f45bd1512d0", - "4245cd65713fc8355ca9d95b6babc7390f1b62eb75710325fdb28c028afcd3b9", - "a614d6992c8ef5461f2bd24037656ef89b4b81d4efbec61830e8ae2e313315f9", - "19d7ac05301026036eee59302bd4e972cbfc692ab997fca4503b9d0867914f12", - "bb09e915fcd516982f8867740c22f8464d1df4448cc7455cd8c12b31d59db377", - "cd31abb62dbe544fd9cbccadf9d06711a83af1f1b7144705916b081816574e4d", - "7b124049de94d3c734f7d74dea25514cc3861ec966bcc946158b18585933c0fd", - "78c9b166bf736edf45caf181205f980464569d8678efcc5cafe861af0cda201e", - "11364bdc54ea0b32724000cd1c597956c62cf47dfc2885ad0904fa19c45128ec", - "42ab6ded4f63ee18ec4f5d5dc259037199ab7fabcff1759bf855db84e274cd4e", - "e4c7d21d10e51abb5dfadb7f3fd708aeb7620236f12a04628643274286d3259c", - "5a3cad699ba14e944c1cb0222a800d0a84b703f0b9941cabc8050da40e3393ae", - "5da86421c09957c7a9f35cdfb2359c54c899846fa4bb07cbe095826b7275aa9b", - "50a6b3b3818507cd4a2be2965ae43df6ca564fafbbab3e3ca156c57c42074d17", - "e3b44b294caec379e0bce5afd8ddd6667e9655b0f2f5bab7c1ef2a436b6b2767", - "143d33ae3bb4037431671cb18426d280282c36a79f68582166465f64b4b13a13", - "1292056c4bebaed38d7686cea8d5a20999de8b0bfc6786df2072f43e06051035", - "8f1fff51bbd583be01b68d10fbdff45f8ab5f3d04c4c2dad2001e333437cba9c", - "ced84a104cb8a37486e9d4cc4e14f62c7fbca71c14887f426e3195dc76e7e978", - "fc87db83637f3af4a5568080c6480976b85458ba8400df58aacce5aa1affc813", - "b0c265f4c453893fc2f0c16de50cbe8671dfa714d3ac0a20e977159e00dde39e", - "8e24b0a777e0a58535ab13c89b293b78b45a8a81fb41c600ed01da5f3408382e", - "6b4d2d361f629ecb17647b081ca698e230f3fab2018358f582b93b63b0cdf684", - "882632a4db471bb532678b06c02c270b25b5b71c67452250c997a602a9f6901b", - "72cec8e46e1b6e9b3ce1bdf0571a24dd879449d98de279d5c92f25a0f629b17f", - "cd30f6e7aa7b251c7d49f0ceb76f726a851171ea7bed9b786b8e32e40dc3a33b", - "c6290bc5d54d83416f60bc068a3c3f7fb7ae19d7a91c3b89f4892ac05a1adcb3", - "fe0930ae7ddc47c5443134bcbf39ebd5257f8c9098c13cdfb840806983f9b59a", - "47f43ef80d65a759a67440d30f48fddb1fd2d5a2fa30d2bd8efb1715d7619d41", - "f2ef86c86480dcfd2dd036f7074a3929b321730cfa6b4a4f9d2b288ade7b4153", - "400c15a464a1a6aac7d558eab794918118e2bb0ee31f4f244d5fe3940ccf650b", - "fb591e83048208bde2e9d4099b999a5ac6b367b1f880219c01cb9e24f293df0f", - "e4c9865212665e984e6e64c93672ff2d43910444e934b12ad9fa516541e2e1b8", - "bd6f3fffdf442040e8d387c34ca7d833c3f2c1a4beecc5a5da940558b208e7e6", - "cb6b402f86daafb5c8f72c3ac2b6f7350d63839ae550482a04bf0dfaa084e274", - "5d6c4943eb111c43a0add1a350e42c6d578758ecd94dc5afc8b048afcbcf8266", - "2e2ed3d034beeec3653067665892695f681d544a865ecba469a231e646e60440", - "573ff492e20011ff03e79896d59cff12a80986ba4d7773a677b3d59217089a41", - "870af7473a277dac9d317dfab50dfd4863339b26ac6e580d40942c29c244cfa9", - "8f9de71a03dba33cbd16e52750428a6f05bc34268cbd8f539dd7cbeb1f0eaffb", - "d1e118630e0782f40b72389bb9bb7134eb474d39d094696ef38bda94947aa9f7", - "facabe73776874befc118e5109366d1919699b09bf4e0c789b2026009b66a904", - "0f046e47652cc2dd93728c964ca987be1e07682cbe86bfb550d0ffe98ae20d79", - "5115d05774ba7be78fc5eb5f42f03ecd7af4647a99bf548073548b1e1624e8d7", - "2a4d19386dd81e43464151243baf96a006a60d3eca824a32b28a2a45c64dae8f", - "26d7eb7b6798c89d26c59e442b095d380e09c4a4d3e9c913abec198075737adf", - "82e4aed7760e31b4ff74ba5288734133a294fb93a12e49477c025a27df504bee", - "75bca1b40f131af4cef2e8369ea47c4740aa2bf75cb2c575fed8c2b5a370c3cc", - "dc72ea2152d6847d520e804c2e44b09cf2aa038fb1228f5791735210e7fe512a", - "91235a6f832749835ebc967d0bc11ed43e68e6fbede8095d63b69d1a8b674283", - "36b5780fdf8e8db5d803c376d1a76ca150e2e968e23da52a15d10f2f4abac950", - "c82adc546b596d5f60918046f630f46d7e17e68ba4a9ff0eb38286d94f021356", - "29484adb80a64cadd47753e7ffb8270e36fef6e33b08b2569e355d5d8383c49b", - "66da5077ee1504ba6b4e12c06756be1dd5b03aae29aa11e2eec08c781597995f", - "ff72184871fe14683f251faa6e13b9492fded671391959f766bdb0d55feaa4f6", - "cecd3ef09d13407c1defff09aaf9170d108b5248b5d06e9ab1d3f236ab065edd", - "d7683cf4347382aba8994e052b9f95cfb764e21981769dec18ccd051a0822e8f", - "6de3b5693a431a827746fa1e97f21ad7e8f7ba94911fd2c88444370c76b1f0fc", - "b0dc7e27b61f88d6721b8a34d0e483a367993cc6fd6fa70adbc64b60298c5860", - "9202f41f32eac8b0202347ca1909b4984634daf88ac07f890964303856b7cda9", - "2d7e4dcaca74124ef279ff2e87e1d6f86d9b8103126baca7c61528f71902a1ed", - "dbeb7ad1e2bc3184ee944eee64545856811c0cef91d4c52aefece7d255343b0a", - "834408033f70b5115824ef05d9e867de5802a83b947cee5e4c20496ef22f48fd", - "bf34c0c1752e153fca691dea195aebd53a0dfca26a18eba275896136811636c1", - "f31930faf87699327c3de0aa25224738d16385d5a2fa3ab050e950ab32da399e", - "7ea979032ef3929f53d83a7cd4574b8581d5860335bf8e120bc5fea120ac2a7a", - "bcadffa2c1238512efb0a000f27f6c16fd4494134f11e113955f437efabcc4e5", - "aae64656c57a3ac7016157c7ea1bf9c7bad42c0b9c89a5795843b31519a06306", - "e66f257262eb6540f37590d7628a2d28ad6b9a619adc5af283fa8fc1e317ed1b", - "7e6784c292ab2949c1af632e27a02548140aee09410518920c45afb2ce57c0a4", - "669b82f891fc50e4a357c1e4ea2ef27a8d7af8fd0e5a460bd1bea66c1c036eb7", - "bef9ed3973faa8bff4bd14da9b663ca04d14668d6cd6b62dd46be12977e40ed6", - "24cf5205a62aaa24f1b518786cea1aefceafb4a186c0501d9d5725d4514e0082", - "eeac9078650324553bbf71eaedb929ebc03edd41e311e8262eb5a1e6e1ed884d", - "255dbdb010aca4498c6e15ecf95a404e1508fe1456103ff6d325b5e7e809c223", - "41098d43d1f9913de0af333f21edf8fdc980e9f3e909d718757244dd5acd6449", - "e9ff23db3f9873b16d5848cb37941e14fa7f614147e16b7dab8df793944b340c", - "221748a0e2b750b595d3b7b32b36597032592b0ab4f28fa4428e92fdaa735ad2", - "57f7eebe57c673849d20653d5c613366fe6e05d654650c5abbe83f7c7cd34c3e", - "6264b959aef6a05354bdf90c13f49ec8be4ac15490d982e2a4ea7a1bd5bd7701", - "864591a3b502b2967b7d878026eda35486e8317f6555de259aa5ec951ca91e4f", - "e8b55ca806b100a37902f4e420ba55d4baa1a0daf9c21068fdbe05ccfa3dcc19", - "77bdfd8b6cecb6fb37d419dac72b55ee45013225a480636ce2717adbbcb6732f", - "4f1a73129e244ab5d45174117c10b4380a4165b523c633d25377df394712550d", - "189e26c9a7e11aee4ce0982c8fa4ec4ba1316d3b04adda8da113ac9b0ea2f426", - "56141974e566eab6a431e93fc4ef21facc9b1a8307913e80a63842fc299c06eb", - "81033519adfaac347141c386bbfa4f9aadf7218e74035ae513a9c80d680f5722", - "7e5fa71f6083e8c5ff5d0dd398d2c60d1d25d5db6980fad889554c34e158c75b", - "6733cc980b6f877ccabcf8f66688f513915e97dbe91cdb3a1595a1d97085f3b3", - "9da5d4c7037a65fbb650222594bde8eea6ace4444446e134c66fc4642f1a9963", - "7aa99f5f212f689753b74a99486f6d6b208865b1e099de29fbec6914105c5cd6", - "9722fca78b25737109c031efe883498c9290ebeaefade3237f9e71d4b73ccb0f", - "f27bf75bccd723481a648b86bdc93bd3c6047f088ec6755c1627fca56a30c5e7", - "e2ceada2f40e2200a0e9ed1b86a5e621d155f685aef0b32f7ff0d61a740f299d", - "03b8900d5e40eec9a4d74497f08a84f0eb09a4c112c362ad6df574ca492c9238", - "354303f6574f771d92ebface9899f0793109296bc10ac36624b9ed821de51511", - "be4000c8220e871222f86fcde8edc6beaba008ae60d71f2a575dcb4ff1c222ee", - "988d2ac980e397e508541b02d76e1d8056a6927650b2e2e085b01439b8b4e109", - "327c604d30e9aa88d6f196733f46f0124fc810a37979332f47f52ed8efecf7ec", - "60f062a917a7e1c92973e1ea3564dbb08c0329a7b0a0c7bee357866a09f68e8d", - "b02321582d63c4f342116e1b8f13f0d59867804d20be077073ada9b39bc67d3d", - "fb47078e096c030faf5a0676b4a5c691c1fd512321ccf8fb1ad7e161314fcd90", - "0ec301348ebd7289260450f8be3fc3a4b5c4cb1ae2bb4c6ea669af73eb836a8b", - "bc66bb9fd0a17de65b5479f0c97a2187f85ea1e6672c9055f2875d02296ce761", - "88cdef5d3a1a47995e51b97abb87485f389aad4bf24690f78c92f2b1ce573e41", - "54998bfcb03b7de1e0c642741ae5763c06098bb336bed30dd8a5259efa11f7c0", - "27a0606521b8068934a5a4e27a60db1038243f9cbe93e4e6aefc7570c34a4e8b", - "500ceb54a1c76d37a4f247508028491114d352486be9538fc1aa963f38a05f66", - "fdaa0a718c36751a861608e80fc0def087a3628bc94f7f241b0121af250baa4b", - "8990666c18544b385ad71090c05751dc740d601ad8c1774a3a8a79fcef01bc46", - "0d668dce47de3eff08db34a2da2be97ec6bf29926724a8902a98c7b72d962a74", - "d8616167166dff43aa1fa2f45b400729ac3a2868c20c0d9532ebbcf65b5cdca8", - "d063095adc206fe91771281a5b01a87d5f4102eb33a18201dead33d8bc6aee4b", - "74090a6668c9b0a0a3f4efc75bc3e628fe2f4ae1a41f6e3c427aacf8261d2043", - "3465d1adef83e3e361e79dc31dbf02740b9ebbf98fedb45243c0bb88ed97a1df", - "406a5d8f3389c3a875f0d89fef1a4be021c46261ab504f7a65e048b5bd5860bc", - "181c062c59b69683cc754d997309d5d0d49e0a1afa8af8f45184a10fe65ffb87", - "ba28e8fe2c6f09b538c2636af57d65516dc1acb3eb5d62fedbe699ec81189643", - "a9ef708d09b064c21dcabf034ea358cf975ff4574667c200b43fb885ecf6342a", - "a1203fdc97bc85ea4c26230e522e5f589a204a3ecfe2e516e4b0f0c469f2ebea", - "7d5637cf61519c29a295e52726e24cb692da81bd1f76b0626dde64397c73ea72", - "5f16f6d9824138fb592ceb838dfbba0ed45b5ec45a0bcfe20f92c3a2f563c6a9", - "fc6cc2456fb75ca9a81a663ad9706236c47908262e0bef736b20fbdcb828d229", - "937a449091d219508cf0a796d3184e77c4d1b5f732537a971e19458fb1c55222", - "d439f5040ae9c429fe9de89f3a28354518bc6a7cc0dce4a25272e7e1d72d4f7d", - "d60be05a45ae98d79d2ed4b5f9c6d9706f0e303c56e7ba4d951d8224fd6e2962", - "41eb4a30a1b32ba4174168f4482c4884328660209d20bbd54c1c2b28be2ca523", - "4b4e38d8011c3de240bb154c4b28967c64e5c50dc7afa1e0abae697fff2e2b22", - "8f94cfd1d0109433eadd77fdfd4edf1e30f333ebde87f70369a1435bedeb59e7", - "58d2234ddda33b71f69f89c4c1333d645cd00fce37eff4f212cd442050375b1e", - "6db8f87bd28c4c842b939d693b51ea3d6db74e2565402c000626745443f5748d", - "9d915486a4697868bdfab6046163dc34cd84efde96013f38035b75d322b29b00", - "704f119387968c8a45807f5c9680ef8c4bc3a1690956f3383a8d0fa3a6995197", - "b7b6af7d7a1ade89cb73500f3083d1b4f199a3f5969e4e6ac993e6d11c9d829c", - "c7f26f3c426a7c37c3a911313c72d1f786d0eb9fb542e58acf147e229d0779b6", - "c4848a99cb473800bde3ed991b8a937b9e7ae58ca15bbf868d2d5c42c285f53e", - "2feea6ae6fe5a61f040c824ff1884fd30158960929cee72e9f57cdb4f3a9f7c3", - "b73495e5ff916bfc704da58b78dd9ba42c9b8c0a1b98d34c4dc2b81907c6d735", - "2ebd54df4404a094104fce13806b6bd6043593b6bda141d640569c85ea8025a6", - "f454e22c8ebac360b213494e3041d1c1e8aa371515139199eb1d4ce820c2309b", - "a5eb636b145a4809a494c1518223f673e91fb3b6ce8ca99102205eca0ace7137", - "03aa53825a11b613fde3e2cb21df9a745861243ed57e729561dd81ede9d6aa6f", - "1a7734e3e703b74cd21ee93db299103d292a93fef32ba18f25fe7758b88c5c5b", - "b6f58a3fe06dda36e3fd13f5e63d4a6c26cdc8fd6c7637d32c508440e2945476", - "d5e4a24eb6494e88d3243348a0f86047d943b95e15f8fb836f3be9336f4e9513", - "98a59863d05d085a609d86ceb0a35bdbd5febe6262198990b9584b2353b33375", - "11112bada5f2f21e1c1090bbf2be50bcc849d0bdee29694de36d9e1900b789df", - "0d2fd82f2bbb52ea05c03012f8112d6ce9978cfefb500179f80acdad9d2b1804", - "ef4212e19e8ef7e14f61aced4d6e58a2fea8d03b65fb123d1b6cab7660e3de6a", - "d1576ead366203bf679b1e500b64490344e3231029e0daa1edea2aa6a43e08a0", - "25c7e3e2c9c72d68157eaf39f460e222bff41f90a5f8184f262a66bf63e6c7e5", - "8c1b6f0458d2bb5d11f950f5bb437dad137fda5ace161e487c3e8f303fc89a3f", - "6db831155dd1709df9a9d101d4def01d601a528856bebf04cc4004842531d792", - "716cc0c9e5b756ad7284abd4f4286827fd237631773549f4e1f9736cbfa50571", - "1244d82971fa22c7cccc9c4e447c982c2eade36ddcef296044d6d2d5aaa26074", - "9af33a64916ecbdc71ea346cf63ef0a6aa1d342f6654c5450a8244f79e2f66aa", - "509c766c7b6136115b1486c89ffed52df1606b508d848172d33a254884af569c", - "a7940ae5b8e185b19f2c9af7886543017cdb7249a21d2a56206130b1a4e1532f", - "5de5b40d2c06a6dfcd9faa59ffe04c19361424fda449f369b16dbf08db6c961f", - "f618d51f1f3c4c79705a64c9af7cac360475088f8a7759d828dcbdabddb9f4a0", - "041f4017d40c8cea1f607ac2f033ac500f3e96c89a342d941e97910b2b22be15", - "1ee41db45e73ea6e8d155325aafca90342a209641f28f8fd17cf8b205d798308", - "dd5a19d93825731d74b9ba76a85ab060540e96fd736499373be82dcbac02f8ab", - "b657e52060c873dfad18c49df363651ef35daa244eafd23645bf6ccbc1a9a997", - "3eed130f04304743ba62319207af140e63d8c59d34fde2f2f091ebfefde88001", - "97cea6a0caa218063e058546b47e86ad68f2d4267b7c592b3de0e82e106eb6a1", - "39f00a2d070d4d58cb03bd7baade44fbedc3d382a20bdc4f65fe632e6ef9c707", - "ae1154c89525edb120532021f011a4368502cfe17eb022ab028e31e883bf33c1", - "022716ba7d6343793e415a173e8379da8dd0e1a4bf13ed3eae1446681750718f", - "47edd50d971c2da9e297385dc31afbb27fe245006b09abb50b1421741ad477ff", - "0a9add635adbe84b1ce3ecb8fa57b372b5b4cd0484ee82d8b18fd0aae475f111", - "bb5e142b36abd7adb98718d522821484c4b07fc9e3eec0fb6942b7c6be6a8477", - "e0857424ce1cb894df751a05368a953160a268a9ff1000a254e20717c39a3d1a", - "c284e275f43645fa53ddaa5cfcbc0f651cb76562aec81189e24e0a6eb07bbf6e", - "abe4668afa6faca25330ce1078f9ea4d6b97703fb580c948cec8873a7ad0bf2d", - "f812bc7a5b32d407fd2748db070d11a8614e0035ee5ff9c7b2c4e8579f34008c", - "8b54826a175cdbb757e4795359e8e22136cf6f2f5cd5b877c57ef2bc7740a1be", - "8645b10a521c666cc362a4e09a757ac79b185a80f87e9294ea3bd4fb7cf83c61", - "3587ad51862df144f0270ff9b108c01d67991c4dfa31303129cbc18ae93bf29c", - "f8059af608ddc051089ef281b20379c3a1f1c684277f315efeb1035513de678c", - "8964911786bad5da0f43cf0b2959bf184ed4a32a125ed1ae356138317fd6eec1", - "2d6d085e1ca31b4529e2eeed5de2bf609b469be13cff77afe446891bb9d12526", - "4200a0396d5692dff06c010e1241474e8554d5ecac4fc98a941424f75fd5f126", - "3603bfc96018e231347b52c9f02b03a259778f3841ee1ca7868162e29dd9c44b", - "9ff0ffa87d411309878c1e01b684fbca87a9d6da22d772f74afbf09b4d322c8b", - "9c3fbf145651220a8b135f916a8acb348afb628c2b58a347c1059a0116389c01", - "e6c7a488c274633320817ec86f1f8ae4af95281348cf0eb8ec69ac795470eb84", - "1a38904d006e7fbb0b7d79ec8f9b19155654d779608a2a46a9e84f1700296174", - "7570ae7a81094f12a2cd32c290849256f658196bf1e19edf4d52f41779fbc3af", - "b1656a3998d953738f6a909316136bf163a4be6280454445e122e2fd0ca965de", - "110680eefb3256ffd48ad0e7c9c006a49a91b9c668823f256558213f9d824009", - "0afa1478f0efce174051e123446ad42f40c3fad79183ee85c73488f6f492f240", - "a8839e2c15432f4936b40bb0ccb03019965c81cd95e55b638fbd36e719f05a8b", - "834b74e05135b2ef2b91a275752c673b6db04630c15d994b76738fca1b3628b8", - "ee5f42086a3040cd3d4b8c06bfa1b27e889468b8021a941fbf0c86c515fdf161", - "fb82f36c382ae85a6aa6374643876e9c7ccc56a0b06b922c22cfd2131e273fe2", - "289d18b0fb3a9281ebb94deb9f3b55564406eae251b005fba93bf5a3fb60ed0c", - "5a16c962bd7dfe445b1aeed1b5fa576c3d1d2ec4189aff34d14794d4621c6a96", - "7269baeef7bd81e9bd0fa4d5031ab73880abffb5f738bea28bc23c2029d889c9", - "9ce0feeffe1ee844a8039af12fe0c19ac704fded383d34a804bd60947fa057fa", - "cc6faf0eb6bb1ae71d9cf8ff497f27accd03064e27f968d890ed765e396a61a5", - "05b2de159e942cc5983337e0513167c506a14751b4e4ecb63cfa55427a44036a", - "3bee38f985e1e75762fb6dc744b741874fac81f1aca27506aa4394d18452ed36", - "2965dc2fdd09e6fa8dc8c732a2b8e6ca3e2e1ef00f7b5f00bc47dd5123de0cee", - "3ee1d168ddcb0d9eea99f310d9354840add0eb7634fcf9793eca9fa7bbc577ad", - "2e58b86514ec12984dbb1f493a0f38e9b4fd1a3b4fbf230db59b8373ee0b51e6", - "2cb35c650c6003214500e78d118a033353cd7b1053bf7cb5dc4399e93f83dbdd", - "c2724ea99f49b0b9f32d1aed9c785ef2ec006cd75b8932ffb73be07ed46dd864", - "2f1e02c48b9ed6521b6515f8811a238f733993274310c9327d2b76059231eaa5", - "0ea794f478883f229aca4ff0c9ee8f74f96123cffa6899f31e1e4be7861621a8", - "e1159c3bc109b089fb93043472204100b2f754e5eae40ce3d9914244d97b960a", - "63bf75b63b5b85d09136415afe170277fe26466fd7eb5f48bc3fe4a4ada2af31", - "feb46717643d5bd9415ba80dbd8ecbcf0228fe80b11b78341b363236cf0e02df", - "d4fdf67c88905c4fb66668ae0bc5c72493818cb90369568583110de87e5232cb", - "54eb3cae8fb996fe1e279cbe2fa41fad90f2920721e85fc811f345f13895578f", - "8d22fbadbaa750b39764f820ed2d81d364466b9c4c32294266753189c5c304ed", - "3295de37baaf2670ec839b6831aa4fbaaec0ed2572c2c380a057ef8546378cdb", - "9d0b5afc119d07abd76bff28548feada035f96ae8eca80fb81285f794d927d44", - "b33537adf8f34eda2460b195b83ade537e07221b684677a0c0c326b3b90f4561", - "301013978713331ec8a6326e8258e26f7d2918ffe9fcd179a3ba56cf7471c00c", - "41f55486db183e76c6e655b9eae0d468cae515e02c22751f419f9dd19ce24e8d", - "9532ff7c7b97965c4e67b01204d408f7129139c948ecc1100a4f911aa9a83332", - "c0ea9fbca4107e5a4374fedb266736914ce145a831ad35e17606544de8a829a7", - "85046cb587df80c0ffe56a39e86afa1873e9de7d33d0526638e456a56a3a0fb5", - "a9ed43efcf41981ae40a7a2f4a8337b0bb695e57da4c4c8da1c3eba44896f81f", - "bdc56a47f879c0769f56b51796bf75f42f81ae27155e27395d5494df250c7068", - "7305f76b9acf9153871b3c9ece45e093b9405dd1f78c232a4a1caf8745fcebbc", - "7c109ddc184ff398216b7060d1534246c0d15f3529d5572f03000a86f7d560eb", - "486ca5da73de8e3441a5e480ec2439ed099d5e763708f669da4e3b769412291d", - "c1d3d5d0ffcbaa9341d77a0c7dae132792df1da8322bedb7afa9e6f8026356e2", - "79a8ad1809b3635b96e2fe8fb94e5efa6a5405aca95fd95c5a3406fa22c14e29", - "2acfdb0df23ccbf457125ee9bd16d342931e321dbcc43e15c8b73f4afa781094", - "c82ab0f6b9f079dab523cf400a708ef8556186931f09cd1ef1023f906c273c56", - "657beb2a1813312bfe7aa020bf56895c0ffcc426b698bcbb4f108e9ff5576dc2", - "20f9d8f002ab7cfe35be5bdcdc9537aef64a8c9d4ddec0ac80a95347874e9818", - "bf0d4121bc429b5e0223749a24c2354e5ec318945f8de786c335e6a3a9407c33", - "e420770635d0418ed86cebf0831e0e6fac2a67dbe73505baabe74e24b73abd82", - "fd1ca1a1651e710cef46baeecec49532cb3231c05ecfc72eca8411778e9fc093", - "5732b545ee79b2f6ecfd76b18ece7ef4213f8dfc3165e5104cb244cd304302f3", - "ce486689901166d0bd5cafff64eb30fdd70818336ea0bab23c3c77ffc4fd807d", - "05603a6e541827c0b42ba71b4bc1df032664a7409937e99126b10c4e95110d33", - "58ba6ba27082000bcfd210ad91224a4e26007c5d596b117349e81d1b504b3703", - "f02e24a9574c6ecfa3935ed13ead4bef3ffea06cb9ccb9689ed5334abae6fea5", - "6de8564e9f2678dcc200b8aaa530e05d22d3c93b2580401324197e9f956ea9a8", - "598ef6527c56cf26054a4fe28c613e16f46bf0e5b0a0ff0ecf424b52a56b82e0", - "b90cf4ee16b54a0181479c8802751bfba4e593142baf809dc07826054f45dacf", - "f3a0b6652f7c48ace362066a59ef26265b16b296a31d442f28995a4c6e9e82f3", - "d4b00d24dc254f0002a5c0b5593ae452661f8651350efc08f1d9612fc250ab78", - "ca3a0dc8eb30a880f9b1606a886077602bdc257c1992db5b65d395fa2a847ee4", - "ded05e79c35f4b0c5a32861a5e9f1fac29428bec9516372e330b8fd38df4dfac", - "0c78d46d0bf24d3041bea29a7ba3fc1c7f37f1a2c9bacda4569534c96bb2d588", - "4733cfde8b848166936144daf7a6c6c5ef6dc87fd6ec722ece6f6877b68fbdb7", - "2caca50323d8bfc28ecb95acee1f8d00e488a03bec65cdeae20fb070778a98d8", - "fee3c2700cb8cea2fb5fe614d08f8d92ba4ebf6adfcf8547fdc1f680c230fae0", - "1b3889a6b0446980d8c391197093d7f66cab3dac88b14e4444ed909312e9498a", - "4281ec03822bfc532592a4fa3c6868078a863a3cac88c14917c0146cea94e199", - "00b94888d913ce118c6d9ac5330a394326adddf50c422ec5449bcf89fcb995dc", - "6775a57e3ba28566197d51067089e3412439b32a257a3bea5647b65e4448dc03", - "e16092f33018865c3588f969412d8befd4d8bc3d3becdf15a86858967e71875d", - "e98d3d5b6e00613b0ec20d40ef1729b4c5a6e8579ba8e21c03d9f94f0544b3f4", - "483733f89339594a9611f977eec343ce54168dfad392312e551d702f23c84e6f", - "48a760ee330af1d488e959e67b216e0888f3ef4fc0afa4956ce32e5e252e620d", - "5a1b3c7f73bfa17ea843836e7759f7bcad12fd478806f928bebf34883dabdf81", - "7db2a10dc62c8385c53934a28c1c054c0ac5260f319f9d1d298c4f8b19b4311c", - "bef19e31997a96427a9ff2badac8ff89535280e424bb5bde9d83f6469988e965", - "04bfc27606e70d89eef53f2a6d66b627d4713737be1ce1317ff07e42fdbd4dea", - "620457380b030cc247ef5b42324f62192469fddb3e0c5855bb13807325f7a0fd", - "2c534907bf11edde268de3cd3ec173a8f1601a03a0f6a44078187753b034a887", - "2964a677a2f32c5defe4e1c837f98a6f1ed3ea8700b6ec011775fb5677b50906", - "6fc5836c52dc30d38e0bcaa8d519e04142e96983781a20e31946dce9a74bee50", - "1c23b4127e6d7bee8f86b2ec51c5ade312e081b7f0e4ecb9a197980ab3374e5a", - "8566388a133641c1c6f1b9ee9f75ec98f61320c714e277f03780b87afd5ad54b", - "e358f53f970953ffa25e95e161f7bd06cba41583d586b8cee00f7352c16f1dcb", - "23e7ef5e5d8c53e58b44a0ed030bb28da8d2470aa23edf393dcfb3345c68e178", - "0a86e723b1667de3ce4b5fb3c7d2695bee8d2f79cd66878b0d7787bb83296c0a", - "0f92280ab6ad37f236a88fb1b83f4be98a96e04ca706dba2a575bb448d54555c", - "b7c9e1ae64601025007fe28d33a97efc05bb8c9cf3e04dfab0bf5815e3116fdb", - "dd832f5069b803b5fca6937e2d9b2f6ad0fc7b2d25483576049602c42564d58e", - "c98fc995bfbd2aa1e488c0975c0fd579051a46809b0614ac909b7281a8626e03", - "26a341f3acd493cbb5ea04b98c76472e03ca248cc41302b72bee892990fb6ad0", - "ef063a6d90f7e56265d40965ca8da01f7cf71fab3a4a6e0b192506dc3fdad36f", - "a5ace49e218a5722fbebd55a0202d2fa49f5a7822a44449d1e7f081e43a4e218", - "413d5cf8b5eb4a566a75bb6b3bfcd4903a4504c0f76307d2098e5c3374268ccb", - "485e368d51745733b60645b6e12a05738326b74b8a13661b9d5958e2ece56894", - "414a7a37298270fbf666e77d095077da141acdaee326d98546205c5ba4a5105f", - "44add5f27142a679266885b309324e7b6304c51caf4f788b1c578a04090405c1", - "36abb40906d02ec730cdd588ea8d07a73c4b65bbc6fc98e3029d1e6448bcbef1", - "a66282f4a68be35407c43169c20f749c320c9a468b7a9af5a1d255e72d8addc4", - "764bc6f182da1bf520c48937b7ccd92b7254a5975ce1af24ce46b9a42af58f9a", - "caae342a04d8419baf251d64b9987d62f99943e2deaf9b2a45b964b708b89ee6", - "bbb19134beb7394b468e4f1dab982456c0ece364182dc078156837f4445fd065", - "74302e7e4b00444b62ba5e37dd8e2717f86eabb923693a7f9bebb932b680de94", - "ab50e0737f24753333c8b00eb841b48d113ffe94d786a3a460f922810ac4fa32", - "ffc403e9aadbcdb728e757947084445774a5d023ae050bbdc2210f87c67c1102", - "ca6d4cf70d0935b70c70a6d71aced43a3505e71c22c34c73e62ce5b16f25d188", - "bcb958f8f0072ee2117e805c029bf579d6ce076b75212daadacc376cf8c3c5af", - "e06d905626bc75d23875f72be43c84738c0c9438690915c095da4241c50c8aea", - "5de64eafbd37b5a0ab2bbb476354562a1ef5d0d178cb4625bd10ce09b0c21ede", - "0d856d2355b1622e8b4a33fee2152832da1df86aa0418f6d55da7caf67f781e6", - "d29587dcba1449d31217800b6c899fd4be348f8ee36e6c9a9af5f69a4f737697", - "844ee64edded2a65b8e876a72aa0c3daa613b057c0581956dfbc7e442a392506", - "888da7baf5cd9243801ad27e863226002f325d8d748294d84a38215bf4056b9a", - "ceb8d8b188556ed48c05cc24c0e0e49d3a7e38930bcbfa4bc1ebb3e29e12d585", - "7342c499aab0994b0a20bc97644fee538a33a07579bccc631a38cba23d20a286", - "90ebc7b7cdef52b3edbe7e0f888f2c5b0bfa4f4ab2ab85944b0b84429e949de8", - "5466753c18662a12676ec169379dbaa70d1e776d71baf721ce2cfdb3267e3a30", - "9ab86c0283ac0c8ec9302268a9fe8c31230a9ee1a72725e5a8b8dee0327d4a51", - "fe0a472ecb8ed9f4fb4d50cef3e7ec8602dc11c5257e2f4cb6ac55fc4edc474d", - "ca09a5fceafa3ff209b30bd9113a6e989ff66318ba32b51a38bbe81f794f361f", - "42b5dbb468e41bf45e8cfae08638d6398a393165a5ae16243b75276c9d7c04da", - "a3ec3d07dc3d693c516a1a455efc05a439220dce6c73d22fb232b4ca3d84899e", - "b95320f0933fe04f03e56813168e9622b712f6e0c3c3674ae44ac5acbc89fb92", - "fef2c830acd7172c964f159099d1a6ad4af517c38418bddbd998efbce6b3dc69", - "12a9bec7da09ebdc36fb12837ef9e010dcfdf1f55079a53eb5bda49b443017c6", - "5aadc1078f4a191e1988fb0318c9a57521d6b54afa8ab2fd7fcdf3aa0084d068", - "01b33227c79cb00b7918067eb10e8c4f502e9063260e806f016d80196d80627e", - "b8f67c9add1fe0bdb6c1a6f184aad1551db5ff369040697f963356af76c78b23", - "94792ed81be76a963b8297f95a60cb20e0ee3e99a9ccbf348094025bba00f11f", - "dbc5734075b8fb1491f276d527c7ff013b0ed5dcaf914da09f634e8a10d4bf77", - "21346a33ef4ec5d71573e1ad4e31d81ee14ae08692eb9b458a88375c451d32a6", - "a44b7fddd3c6ea156773516215ef23215df7b59d82631457ebb4ff4b24c2fe7d", - "592001cc744b560093477dab86ea585b20166e2f3a334e7fcb26f770864d282a", - "1355c2e0f552bda6a0253449df2534a00dee2911884a72dd35aeffc0f1193f12", - "5a4c9a82a3137574c4400df9541b6cfec420f7da4f77e16dc5eece36012b90af", - "0a0fccc298214bd3b8e55381cc4e242e854abf466004a3a5b9c4011e2c872119", - "0da33b84c768be219147e1cdd8a578a90c0dfd9f1056f8677c162625bda6b11a", - "c32732463b3dd92ac0a27d84461c7c77615773cbecb75d34335e424082eb4c67", - "51ab30f0321807bc207214f6c9d6c4baa1347c469b5d317466873c624eb7fd5d", - "95eb053098a40ff2ceecf058c31c201b2b20dfea583f31075f405a7db323cec2", - "26faf78de4104202b256c2995c5af2ebc01e8be328fe065cd78678ccdef0c024", - "8e5eab28531a917fb63b90a4ac0fe0c61ac14b2083d5e3ba095b3b0ec5314148", - "b608eb81b751f8cc14a437a1f6709dd9cde1b27ea214488e09907c2a915770c3", - "4aab068f66657097dc3a923b6ffdc4ed391e0ff92cac68fca7c9e5c1bbb690e2", - "9267b03d77da42099843da2abe9ceaccb5db9d803df58edae2b0b6b42702270b", - "a2c21797bbb077b0966db1ef64d54c240ec3e65040babd51df3773746f5c8427", - "31bc97b7597ed6445cf3375d72c3dcdedeb82e724350bc0b59199176aa1e0264", - "c10f0526877e2d6454b111bf403bf919208ef6d1132bd79b9b4bc714d55cfbb7", - "9690c19f2e612beb93a3a25b9f3016b343d999d7e754b7b2657dbca93ffa2c30", - "940435163e7191633b4f6430afeca6278950e702dfbc08b974a5d1a1293e932f", - "06fad3ab0915789f4e19178f667b19050a61d3fe0fcc59524133e58728910030", - "42fcc84ae9d493d54f71408d4ce5fbd11e11eaba5921036b391b2e3c346bdfc6", - "87ddc3ca21bd3d3925f6c36acaef644114dc2eaf7e384d7e95e76690e0851ca8", - "00c43584457ea06b4aeadf47ee661f81b326a2a4345690343d151cb5c293f096", - "f1b17abb791f61bdeda7826fa78a0ca2672fc70cb965737bcdd4c5381de7e3ec", - "963eecf007631077c11a5a7c847429f07bd7068f3a1fd55461ad89357907d793", - "79768f0fc06f081463ce6480d92426254d7711924a0868180b142942d7794078", - "fae95e2466043389ab5b0227f04553ebfafd4ae32eb80d3d7a7bf4d37e06ea47", - "06601f1a3d2f1158cf9ffdce7424ab6fc501eb3a78393c06297fd56b35ed9183", - "92a314eab381fd13226437d05ccf82984cf55c2057deadf3dcc6e72aae4401f6", - "3cb7918ba28f952a9276e556ab82a6116705c56b1ede083fa6a3e0521d5b3dd8", - "2fdfe959e7d4ce1261037444cd00feb2784cced304dcb291d59a4884b4ddfdcd", - "036ea59814d4a98a39eb1a3845058e71f5affd0f85a9a8800fe2f0a936f92d5d", - "8318126b5a666976c6c53a5d54209969b03141e3feebc4571ab24446b5910f3f", - "28a964aec4170eda46d4c069ebfc85dec93be3c9a44ab08aef76ed3a26943db8", - "abdb2d6dd1479ba43efb59015eccdac0ddfe88866c16c940ca8877bb7852bce0", - "ba9a9471bd6566f385bbee6fa4c16a8820fc9b02e99d92ea4277b4244272c4da", - "d60394ba9ac1dcdfed826ca9f1ffb2505c008e4efbe5cfe530a11205f5b3b256", - "103ad8d039ea45e0e01fb4241d31dc91a4c0fe3a6eec9cf69abe0933f2180459", - "f7eff855366f64f2f88a33f34c63038af563a0bfa85f096e5599abfa8f85f5c9", - "d38bfa9ea6963c5775d3b75e1427a9725117bb43d06758820a864543138768ea", - "3cc6b2a06b76da9adc3c1dd706ba8303262a4071f6c4e394e3500f182d98f7e2", - "61efe4428430c84e2ddd6ee899404fbe04c2a624983185fbdb2a44f677c4f74f", - "682872fb55af2e64f3460cf7a6b5bd4808da8a75577290e5adcb02499f965231", - "397f3cf3946a04869a3a0a215fdc58ee1d1dc6831a955bc665aebd015040e3e1", - "10c0eebbe73f26ced01ba70d3756adc0c0699a736b8a4c9101bc61a975dcfbcb", - "4cb6f635f19fd077f19f1056fc10f6bb0e0be20037f5b6b5b468b495797fb183", - "9ea21739dc82cb0e6bec5fb309cbb9cffbcd6963c1a739d1a8569ea8e0172182", - "35b3aea724af1f3f314a01a7406dd3086395d609398928c729bad667dfa1d04b", - "2b80d2b66391684370be598f1831fe71b7b4c48e26a8d2cad9a847a6433b3d99", - "02d48d903a53898e3d01a33df963fe3bec8379f1263a35d63b41b647a1aaedaa", - "00d6d6ae9602d025b59d28b2d205bd3f575dc0d647e742177815f42135015fe9", - "f962fdeac46bf1ca169a0a8b658ac3396efa72303833ca5084d213b7bebcfabc", - "2ceffdea2ff2835f89c9c4863a48ba27b62f635e57629296bbbd95792badc0a7", - "b842d88f1467dcb341fca67c5f4296ab3f3340f12b0f192721048a676de10f74", - "b7039453c6753e3f4e110232a21f6d6bf611efc37324533c3ba7b828af00ee86", - "578c39805e63a4ba04dd6666415f683b8105d2080de4cbf91f94b0194203f41b", - "a571d5ddea86851534e1043b8abcbce8ad350900af5b5d346d97e101e31c4591", - "2d347262270bc62905812929372d1c4289a23ade5998b54e92e53107261219e1", - "4e3a14bcdc81158e1f65dfcdf1d105969e27c64e008e5370bd31b003fe38979e", - "455a9b1dc23422fe3cf9e61c3688f1f5bcfaeee08fc1c83cc209a36175ba1515", - "2dbf373aab5763ee0cc1c22950143546a90eb94dfa5d248e62f46396324b7ad2", - "d69e42cbb2e70e26441d6743294290f79b2ac90d72d4714a2476eac354a40869", - "ca5747109ba05174107656bb45fc0102546b243f470d273ad0ecf25148077318", - "395d6ce73acbf71abf123b8caa55742981c39f5630af921757d1af069ce54478", - "6b8484704e59d36d67a8972e2f70c08a2eac6d989f6bb12ae65345b1e73f33ac", - "b4847e540c9674312a606eec52788d5973dd4d3ae44a0d0d0de611090e4d96e8", - "23702da12ce31038fd41966550fc8a0905769860d6d1d793ad25f6e86b9045c6", - "d1fac5428a95ace80ec205b01011e4d9e33896f6c1c63b9309d5a8aa281abd4b", - "870d1bd4361345abb5955a79eca4893918485bb256c2db923fc1960149f4df4a", - "8d0264c7d7ecac8abe8537d5bd285da6c4ed5fc705218526d3b3a561a9c15978", - "584cd22b22c7f54da006b56d288032b6a74aede8f515faff07089797b0d9fd66", - "a3ad6c23e218fbef26bd6ab35e24ba9477a5f925be7772d11cf79c4c860d7264", - "b3c224303e039198467ae8ba987be84bec36ba0bc9779aa2f413cad86c92c081", - "abd28fa7f5fe8a8dfc358a4c63e886e8166b9759df1ad3369418874148605d41", - "3f90a02a6a5d5cbee61647f971f2a6bd7f5d8b4952e4b0a9e67d83ddb6616c12", - "f405ae5cf2af1b5b62e6fa7ae45cfa345528c57e4198082d247c54e7caadcfa6", - "14ea8645b7acd23ba0b86926ad6037218e99c278a61d18d4fe33b90dbd45c036", - "92d55f2938a67c8023e819d92655222d9f9866f34d9278aeede9a1f9accd18bf", - "b8fabc0149a6f70d492bffd4ba854b2ac43d55ebe1f7ebdbf3b55418c3d223c2", - "221b9e21b64160886772a537ab4db1d0b8effddf1bbc5c026a3dc023495fa0d6", - "dc119e8e3afbc27b79b9ceeeb9e67d7244ed072ba3ee0d3abecb0d9a2faf547b", - "1f080e362a88e5849d715d0bdaef0f2be6342254b811231a2a8ffda6b0a45886", - "e8fd543509ed7190bb452185bc8bb338f4e242ff45cf60b9abe2248556231035", - "c928ea8aa8d81fe4ba556920ee329d85d2c0145b9e58b2e122fd18d069c35fd2", - "fafece5b88a42bc3b3f75c917444653e3e186bc48ee3246b3ffa3c1ca8fe117a", - "ff6e44f0ef9d4cc7431d86b90db983b3187f3be0405856893a7659719a7da9b7", - "a8698dcc1360238de8c93a3b3fc9eac91c4193a175ae39b4681d0e6fab02fc56", - "c3638e290543ffe1bf69d06d8054cec7ebf4ee61d473be9bdb26490583cf911a", - "b3ab2c340291efc0bc82e000febacfee67ae38bc608fe150150c68dbe9ebcdd9", - "d58c33f5c7fae085716673be5bd7ef01c1cca0c9c35300b25da765766f5cd2d3", - "e79012e43e73b821b14df5bd70a952ca589789038825700ca85afeb94f27f864", - "ac5354b8568cb4d74946c63ce5cca524ee7014d28e6acd4e2fedf04945714122", - "4e8ec60837472fc1af29abcb771387a6455ad9ea0f59960b140ebb240eabf557", - "c7d1c486d8c7f14b2e9ace06ebde754c56ea35734f6b90c1df0d240cd1cc465e", - "21f0ea1156961d691b91620f790b0998a9e286ac4b5ec1ec4d0d4fcd351aa1a5", - "5cc0f0b01f6448c33d737c579bc6cbc2f501ceaefb32bf5745349626d9765f4e", - "a496519b96f25416424da1a9bdce49771460d828970c94d6cfdfc105ba1b07cb", - "f818c23bfe7d734a17170545b22aca35a01133b9d2f4a918740f1345dd197b5b", - "65575139f723d8a6473ddd3a5143d745416298661db28a8bff68867791e33f6b", - "bade89d62497cc06380cffd9a7a6eb108ab4a704766fa27f87871a5c518b3400", - "eb8936b400ad1cf7f8bb2870b5ca059b0824ae34058e0ab753cd4c2073739f0e", - "bf95b6fde44484d407bcb77f2c2d25b89f7551fef4c76a99f27e84b1e948a572", - "9f3bf8af347ac9599fcbf4e33373c7e9aad23e5ba980a4b8797fb74ea2dfb989", - "0ca029ab0b7ac37f727ef55af12c03ece68c5bd705fbe0d97493161fb4e3dbbd", - "158c72367aefbdf45338758ab85253bb3184771c2e02bf19151d67817c67bdc6", - "bb3275cb6e8b8c85b2969a90e87780efd2af4d8cbaf5cc1df3d4bfdb35f34ae4", - "4eb2388b1f48b0d91a9c53d6dc00a40469fc3698905d5a4c74541a2708697fc7", - "5b8daa89fce26d5a17ff883ed79f9dcd8a994d58d2d7d2f822eca82c20dbf8d0", - "c2776fe38043b56ff80fa4cd470ae2c14f02df12fc5c14ca78e70fe35b7a1746", - "0d43082ea0da825cca26d7c2bc1172eb0cb5e821dd78a9b5bc8faf60aae0116e", - "00cbcf252e975e727ca560d6707cd2210a2a108522b83f1a4434d77394e4d32d", - "249df8aaf337740d9b141df483980a98cf06f81f6953670117c0a04c9311261b", - "0242f0e4466efe91480bb6ef23ecc8f8154f671bdba77f877abf577ae1999781", - "53014e03b9dde3d76956e109de12d0938c9f7ef81918ef9f7bf035b49294ba99", - "44ea17ba6711933fec4f61df2aced4ca0cdd39b9d7092ea4a2833de519df0c71", - "094bdd55786775fc151217ed7c4d9fb956e9cc09680ff269ce591fc7351b046a", - "a9d8a41dbe6600a40ca1639b856873d4e65051e66c12448fb8af5f8adf0b7d3d", - "f1a7564f43bb372bc61d04eca5303872a21363e4620d4584c5efbd4c85288a1e", - "b3f7cf91ec20e90ae2dc087a67f7ff080064045e31b7b303e7f78a3672d8ed32", - "696a1b337de35aa8a4169f08f2f501f96943bae752a0ecb10db73a60c677dcdf", - "77a767066215fa11eecc99a5a0e707bd57ee7845c884c96d0ceb4314c4de949f", - "8cc0fb40104d080ce505ccfa1493bd92a0a3dac8f2d2e17e40a75c311f82db70", - "05373f008c1a124d67efd66645bf70c852219dc131bad3941efc8414ee27ec9a", - "d09b02cb344210898096eff85638c87794b696fbe7bbc7fc312280153868f26e", - "af20b5f1a9885fa23aad9ce96d8b1a4bc6ed5ad89e651e0308e0c2fbc6d9d2c1", - "8d5c711ac3036f3705594c3e9aa27b3a28dfd6d4462055dec454d6fc1d5ffe48", - "c8ada2ccf84c6ae20a512d145b071db792700d9740ccf1801fd69c67ec914af6", - "8855756a6088b5dbe24c102393f736908161468391a6a1a9b870ddd60b0a1bb4", - "c1712587889de73d760de381f0014e32da1aa44411042315d3e8b8c9e7082c43", - "85a0885e85f21255d8d1f21c5200e1fa16d3faf22264d283a464e7ef9de1e8fc", - "eee94722c52481588d3cf25108d55da85881aa6d10a7badc7ad8a24c0757f0c1", - "0387f791fecbd810c6f8281d02b1e14c7a1e2c0144df311d49696822eaceb432", - "ebcd9cb23389e49313f180a648f21869ab031c32882c3abcec42fbabad3cc101", - "28918335351e22bf87144315346891f7eae2d48a62a196585f3e6f85ec994cfd", - "381fed381a23e39faee4bdd443f4e8d845345bc20f9a3ad265eb80aaf64c240b", - "6fd080ea32991a399850c34a9a822ff642d933bea15bbe6371d4ff96b7e8ef3e", - "2861e673ea9c8d60dd618f9c573aba6fbe018dbef144b802bb72033e3b6026cf", - "3d13f2586c4057f0c1f3c05755245ff9a4d98675d51179230e304dea119584df", - "932c31510bdab14a52648e1f8cf7d03e4e7361b44947b22db1b97418e00d32e1", - "7f823be1bf944cf4518ff08c3e751f16531052f27a7581426989515615f34191", - "d0c866512ef86e723c0a287b4d97dc13ece3021dc250dbd0e755dc42440bbd8a", - "dd7a6d18c96c2e4ae7482cfda01eb3251bac52ad66d1ffc9ca39f6017594e4fa", - "d33c1c02df954be2bb7753e29fdc483b22a7cdca4573aa0225ea8f15dc688757", - "3b064745955c15183964ea2b0d341a304c4b5b0a98e43dfd85a738b661893263", - "9b58d22dd7173f3544b79ca24378fc3b2208d2e9f2b4cd3711e6c0ac8e774dac", - "f4d000b27df8aa2c62e430a552eef490d89ebc9becfb523578eb19d02c8d6eb9", - "526a36d8771178d33a5c9ce4d9f19ba5d07522bc2721342137a13d077df76bc4", - "d8752e106371f7d2684700139d23fd090c8e3d2a553730e26f8cf71b2fcdfce5", - "6df648434603febdcc99697336b5a3e2eb95dda9d80f6f2a9a68141ffe38af88", - "177bfbef37bd90909fb42e33fdca6ac3632462bea57b7311792b4e71e85d043f", - "74bf1d3b4c4eefc4c403813b1a5bd5a070b1d949fbc604f5c6fc5228961d5363", - "8061c29dc4da4676c7ccf6203df5339244abf4cef0324b99d7bc2a66db6666d7", - "3b4f50ba33ec678a0033df98364846631061d7cdfb7e452836389405aa9c54d9", - "106978f4d218f3e079805bed980a9843aa46f8bb984d4f17033ff97f6a330a6c", - "c79dab6d580d256c957714f62561c6b17db6f7923680ba6b3c28bfcc0be0780e", - "4c784a97cb8982acc1b4cd9662d44c5ba0c31541879d48d6d643c919011f8134", - "abc8c351c603713b0c0adeda94d3a7d33462f158cce8954189a7504a6df8a5e5", - "72ae35c05bc698a31102799a92abb3d27d7774d208b05efc4f551b2d0debe301", - "0e94bfb9c7fa4716186f5eeb79a4fc28c475bfc1f5e84ce23fb40222c47f254e", - "b76f9ce9bf9ab55666f3335b7adc7f38e55a4db6a76377bea2e39e6aa7592192", - "608dd8e55913a91050d07b19246d8542362b55279401d5eb8e37c341c8f89dd4", - "9838203b1c45745296b9aac86db74a79aa6cd347574e17278d3e255977464d44", - "61a7b758c4b5e4e70130a5d50fe0e6bf3453c49e1a085415c4eba336b5174aba", - "b1608bb6adad179fa44126507b002d1dc7a5bf360109c9a74ba8840bde0e12bf", - "f3afc06fec39c1e634f174eff172d6ee0cf00410f0d7e0e13e4c230284816b9f", - "cb6a7bc9c7454b290c6eec2af502d84d26c3b8213bfaad42eb4d674de43fc260", - "c2f40ef310eeb2a8e02da59d19b65689dab23607166a269b14353c6487eb0a7e", - "8c615aaa423728b4726b247f7c5e6527574c7f602dcaee1c3bce0340f34e7e9d", - "a311118142059bb455baf3d1820d43296ff9ebe911e9a76b958d2415e793f69e", - "ec6330e9082f796d1d40cd146f1c504efc5823b486633f81a9f8ee31e799d41a", - "16b76bf9f3b79cd47ce35d80870bf5410efdae447f0c03044bf3e87fb8277c55", - "f95a18faaaa47436355d701a32f6753b1d1fa1a0d7a29d1e3350cd366e772a0c", - "84de6f66be9e7e0a7070c4bd6d9e8e1547dc1e88ad5a2af4633837b999f6db73", - "f31232807b7071b564761003ae01d51eda15fabaaeb28d74fda7ca978c699173", - "c92c182e9a90c89926a18a020f661699b4d7b9d9da2acdc98a0b1fc29761c946", - "9e91347df072bf0029767ffdd4ff94b016492f4407470be3e7506f3d2bfdcfba", - "1c990647f6a86b811b08c7ba65c392c2d7e4f1381612d710435b6a1aaeccc2ae", - "7b8be5f941a9bfabb2f9c30923b7c48f6d6a7d9d51f622172390c6b515d3f366", - "5ff980f58365b3bd0699c070159c7b0de34b653ea058c4f0383756a1d6f13e93", - "4c3cbb5832b46c26b38b573042bc95dfd1c81eaa5a3243aff48fa0f861b4be1f", - "c447b80d4c18eeacf30ca54d4cacc5c75c8399632f91512bfb021d29b64c6bff", - "222981501907cacd3e5ba96b35e92739f887f0319d6b3799c69aa41a169480aa", - "4c2f1aa66b003d5ddc164e38ad917e1bbdf28289154ae90732dce88a8a17ad41", - "bef1bbe65d4b0be2d05efbd5e146071feb8b8557098ca9d3e402f5423dbebf98", - "14075d7ed4a478b2acbe8a379415233033a652f181e056daf3444a1e38eb4ee9", - "ba7265702d3c1929fe1858ef8293fccc37bf93375f25dd8db496c6966b16ae37", - "566ef1684b9ae94c333799691e5fe85b6baf201d4b45cfc6d321d1f544ee73ff", - "cb0a055633adb7f85dc9b477169ab88758489330f84bf139151851d8b7e84d12", - "1089ea19102e7ca0e857c2fef238c623fda00a1e7e312859c5a59f6162592d3c", - "bd2178b654eef880df6b506d5e81717f222484a8d2974bc18fa42031e46c75ff", - "95c329eeec8adc55802233ca362c9ae552c056931f50d734fd16215f313cadd2", - "56789230ae49a5f924f5971c7c5122a48833329b1d90876a2cbbf92d5c2a8fcb", - "914b99073a0fb1272d571fee95b134b8f6abab764f341ac603fe5d8f4c540639", - "54f61b044cb8a27e6345ada8289d15999bdf61392de48d1060bcd4a7f183d8be", - "75151c89d1963673f14c85bf21e87dec18ed808bc79b75410e6c6e141b29b66d", - "361dd367568edf050e4eded666de5f7ec4c754d5c5b69afc8419a0f030281979", - "001c5f3f2c70a8016bc87165b2110cb12e800426d5fde33cef30a7da46f35a12", - "173fb2aa24d38ca5eae8667cabf76993297f23370ea90dfa45c6914a10723f41", - "6eaa4320a9ab155371a294738559014afc793645640755eec4165f5709df01c5", - "c01e0b5195b9c3be74ca36e5975acc575f7523b2bd8934f3c5d67deceee7fbce", - "34baaa0d88c6893367e9a187456bd9327dda1cfa90a345f9a5c913865a15cfdb", - "65144a20fd4d1b2faa86d90d35b9cfcc87b67f48b21ad439167d80429b719258", - "dc3e5d84f1413f7554f09a4f5a052def256740837d23a7d69aedcde8f16a32be", - "000db61c553e13e5170e67236c1e1c6b43e384b9c635584461e32c26deef32b2", - "01f1d1e2dc13e5d5c8a63b4b42e684180a862690a16d024cdc8ead7bc40888dd", - "29cf46cd81026f312492308bc84129119c7eb9b154571c080fc6618555310b27", - "334579c3ec95b345a0490a59ef7acb8c69d38045fd4bfa60bcad7abf6c05be8c", - "ac3173abf2454053c6ebd17156c49124bf70fc8c3d73fff37f916fed76c506d2", - "a3c6e860d9f53c966b9682e9e221126bf102825eb4d8d7e1880d81b01cac16b5", - "00d516a29f3cdf561eab85be7d2c4b8d45b6c6674563ddba4f34d251d9637ef7", - "4df23ade297dbf395d30ec4ef48e210161f14ff4f2a020424c43a6ff1d66c8a1", - "6846e121f4c02c829752bf42d52c30c2cce156f81d8ec4c7fffae8ab61413b69", - "656e2161d30cdd01bbbe1747f69f4a4e17d436fbfdd9d727c7e36d0d01a3d1c0", - "594bba2c70ed35a75d14ad4bce98597b3733533790bf6009cde6a4a93e76df09", - "903e4973555c9480c602efcdb8bbf8ef5ecfd5f78a332f9a69252d881364e525", - "2870ae70c45a179282a8d1468f2835645b43c56598ea75050a1c2ba969c296f1", - "c7b7453a1b103c3108a5015d6730fb9e7e4044437a7df2396e469354cb897e71", - "dfecf8c1cca8569a61b414e51c21004e4aa1dc2f7af4fb4e170887986b31920e", - "d00c6780f87d3b193eb727f9c77d8a1f5aea141dec19cd0206208b274d8ef860", - "d8150f2ae2be2b19eb77d5de4dc30ad966ce339bd0941ad0a69cdd5ed0e5263e", - "a253d81bd8fae92cbd5bee740b68904fd0bcd64637baa17542f73a8d1bb1af10", - "c677b4b0fb01eef9237cdab27de39e36834a2500c5db501528758b4136b03135", - "2af894f8fff58cc62bc50ba2ce040c71540fdfa1f152c190d30e05ee2ce2c2fd", - "3f50fe17b1193c8b581f6ae0df6ac1dcb3faa7429099ba0a8405508e4f330cc2", - "fa213d377d1cbd5d586b459f29e023cc49e832da29ab3826e7f274bd1713471a", - "919f58c1829e2ae3aea65fe61071ba7f053743af22abaafa07f541db48991aa3", - "fa0f6e3885395eb70a7fffee55e0cd1faa920fa1a9ce26cb4db8e627dbfa78d0", - "4f08baed588572f29274be9a5ae488a467da8d364ff28f02a91bc6a716179f1a", - "02af0177dc615faf1de82f374b3226b61e19206faf97630a75751160ad12f415", - "e20dcdd5eb4e785b880ed2e0a44a73b6667111106b270587d5449d864285b3a1", - "0b6e31da46b116046955680389862d59351e858b7b53cab59251ac716cc4615b", - "b815e59daa5ff459ff4949dd23e449bd32aec8823bf82f23fa87b12551d13c4b", - "1182beb6be4f1f510993fccc104da3613a9f799e1e005d0e3874c3749324532d", - "62e7babcfa2ff6fdf2240445a9f784af7aac9f3e46c41363299d499a604b0e73", - "879f14d3e6dc20ac4faa99bbf7a1f3a51d2f5f32c06a1e5bf28eeb2b83ee951c", - "06769e97701884724d1f82b0e256b66c524b5689537b95727fa74a710519172f", - "a9fb480b01ecfa71fe9a774f3baab44ca18b3d11a5e8f3503bbc790a526fe71d", - "7c761a5c9dbac4ebab77eba06379980b111593ae4fbfba9f72f75b240763090d", - "3b9ec822a8be9ed438682e8f5f7950aba04896aa0bd195738b7b5f8a347415d9", - "088ff0b1e6ee4843c23b905cc63705dc60712591cea086d8d282f18b2101dc1f", - "3af37d563725d4b5578cf6a6aa6dabd26c58b41248293f4066665b23cdff0e57", - "2386055d0d09998ef718bf214186cf4fca29fb67dcae44729a8654cbf55e7fe1", - "edb22a89316bd17aac3f09f632b86215127f478478c583ee6c8ba53d779fd3af", - "6281ef4f01c10efe49a2722e716138ebb782b2170bbc46a68fbefc8c18d80566", - "3056a50698c7d3ee74636772804e2f747a52a82ba6381bfe4e99b24550d78028", - "f23026776dcbdaa5420218d57063c69d6a8e82b07633d673f9f777675d4b11cb", - "bdd1e2f6a080a608767724b0bba64241f2e1a2e50c3d47f8ae305e0aa59c06d2", - "37a9b991947c4ace9ba2f6a9cc428107703551bd531bd63809fd207d891c982c", - "85906f5655bfaf3d8dadcc589fa84ae2717a6ac6a2f554c4a99f317526f1a93e", - "748f74b240efa145c4115ddb86ce83d3584027f6a85338680a018de4796e5521", - "e487515e8284abfa005e70a0c7cd8a908341e3c5f69c733b31875b07358cb7bf", - "e6b174a8d11d6e8c57c83493611240c43afe0c49b1718776bf3315b0f1a45ed7", - "7061c0553a221d4b75b8e247639edff0c6767f650aa4ef4ecc6ae865cc72e088", - "ae26c94ac1d81f79851e02681fc3a0ea073f9d6c320db8830e39c62afd6a989f", - "1db5db2562904ff301512c87204bea5934682374b11a20129afa3736eb98c4c8", - "a7c37f29a05c0c42ad377fab86a0e6c0c703bd6f57c4ebe96096f853f89115cf", - "0a379912ac32b3785d22fb5ca53db9fb8116edee762ce129781684f9e216ab56", - "9f2b53be859a7c512183d71a6c17b3cf4d160e1b6485beebdc411245a8d32027", - "5d87f9ada58193b306d41d083ef8aedd481869ad705800af63c5e8ce0567ca89", - "9a1f7b39937d2dc002df04bbb292636941b59aa3b83211326b9df38857a8869d", - "497c1180a70dcae553ae10dbb9016121e4a20a55fd1771879575246f81ad5fd2", - "6c719cb86e6056a68b32063bdb42b0bb0536b3eb44b959953b6549270772b4b1", - "4ae7fac40befddef8056460683cb3d23119521c9101b35d3cda2b308de5f4ddc", - "99ad8ffb6698c037defe2de4228981aa9a4eea20b0ba16c7039f852c0f793fdb", - "82abe215f18e326d6815571365544b09835f8821e7f254e71ea55c7998b7c059", - "e13715871bc2cc9f8ba2074e88a89f0a83c854c1be6322427f5d3230257bb171", - "bb5bac91733c05374cc2dffd6483915062b0607244c9aa8bc28ac28f2d8249b5", - "8eec8a363b59e404dd5c02ab299eee08728b3bc47411100d6a9943832ce4aa9b", - "3a399a5577bd7dcf39a0311ecef43745e03c731741e07114ab8d80956d4ad2ac", - "621d467a3e6354e9031cfae33ddae581455c3ce297332bcf0a2e0609842cdb1f", - "d424c6baf25cf0cc4c74cfdcd0fe9f51ed8ff4d856a271022934dbbc521086c7", - "49d43d0bc5f1e22d1d9e6ab2b7ea08436a1616ef5a5f3e791008f13234fadecb", - "efa3080bd0ef0287105970494456ffe66371287b50d7f5fcdaeecddb7640a2d7", - "960f251f22cf17d40e37e262cf9ee3059460069c624c3785bc834fab62743f28", - "1deb47eb150d2b713f763aa7f99e1929e57e3ccbeadf6083ac403710c5437ae5", - "0c825bb32d9473d51a35616cb86b8b657f918550cd8fc8aba6035a5b5d4d7d83", - "3f0c79a4b0e8c55c4c683fcee9bfe0d16765c135ba7bdf940877b89febd9430d", - "c85bba33c02e29789b0b46d0f0c1dfb6d2dc385e2814f108bb06a03d1ff49632", - "62c60a2825981549385c45cbba7ea304c65ab57885c45c4d77a1671d4df5214d", - "77913a7167051d064127c45c1690e86dea5516b95a83a07c16b2fa190c36c7f9", - "78d89f0bcef1942e3ee581cec5f134fccd4aa41ff361df592b196710fc620237", - "30f3355c7484b3c7115ac9ef83e1d55646020be15c9576ad186a2defb74f5b4b", - "bd4ed7f70052367f77c51f0cde5399d74c107dbadcb37b82d3901080a11abc29", - "c2decdbc91d3001a0fb346002d20aa2aefe052e24ecb8f43166bc471830ac8c3", - "7e71eb4492c3753329ade5b5b1fc406ad052c1599170fedc116692b1c7781a87", - "334cace1dfc77f81250ac33f1fec5e758a85acfd97f41e4d58213af3cc99e375", - "a436705b5f7544a100a5d392557b4244ce889af8086722cd07f577bab3703c71", - "3f13aa989a572b79170eab60203f3144a09ba46538eb59d97e77b2e6fb0f4b0e", - "c2f6d2198c435f8185bf120d26d2bb586832c088da2b2042d4eb8da37dd1c092", - "dcd7c75911ce2bdb46c95ddff2be0c5af7e46567ba0c240fb8dc9221e9dca92f", - "402d40ae5b77241f55d8c2a21b54809b558e619c9b71b1f56d3dddeaf51992c8", - "cc2724042731f8c6f39350f972f86191cba4789f961527800c020b97011f528c", - "da5285b78ef75f8aa81419eaa99d09b1198848c5d742c2e83f2ea52efa32b3ab", - "b98b295dd31bc9eca9f51974d9c60e19be4bf900a89f94fe7e88ddcafb9765e7", - "313bb8fde90bb467163df1a9a558c2cbee5b7a267a15623f2570b08af63109c0", - "66fbe938d00bcfcf49b82199656b25c2ee997dd6851cd20d2037e3f56322dccd", - "a6e5d60f63f60d1fde810fc08504b1988c9ee38a1b91a22af3a9383162d3a2bd", - "c32869a11bccd21be97bbd19a84eb82f2b76f23c27a14d10269341264a8ff70c", - "a88b1f5507116d5aedfe4006981258f121e75781216827266e7ba9b5adf9587b", - "3f8ab21f9a5e226f87b1aa73a90dbd31b215586a9f9ff681714b880f3a403af4", - "ef129494a876ad2cdfd1184c4c17fc5834f5f7457dfd0694f860cb64bf3f6749", - "23708f0fd9be81733aada7bb3e324f7e48958903152881eb2da07148ed0d998f", - "18291802e8ab51e919631fcfc7a21122f5c91137cebfb4d757c09a5caf5f66aa", - "89c3a8c3095093ae9811307c54d897147703261aa0f3ff8d9a392c9d6a574ff9", - "977ed443d8a4d1d45c90f26997686224e4f18911d6a1e93bc12812651f541706", - "08bf1b44b305bac3d005b23998fba27e5639e2501bdf1a9153d4718a9b060a83", - "23f82e55de1340f7339125d5c318dcbc278e9196babf90fd0337b0976cf497a3", - "d1b885caca0c09235bc30b972118aa33dab018f8a8c063a575c3cb96819f89c4", - "dc285f0622c448fa5072279199b37218f0d9a1d2a9c1ed0bd5f80d0ae1ddf1da", - "7e3c27dbc62d134947e498b82dca17a4f70d0d2bce06c30033544a3fc6719892", - "556fab7c3413aab6ae0ddea7efcf17bfb239ffa5cd27241fe44ef8e5a93209b4", - "a0ab35cc27b6a9f32069663f7743b8996bd4568c256590a344c4d74b99a1327a", - "296405113c520592151e275bc9a243950a9788aee31eb231f35d0b60a0c1c15c", - "9395c270278f9fa0802e2df525a7da20e3cb23d6df578aec7bdb112c9aa02a36", - "78d4ca46a6895cd58724b71414d2178c2c5c96f6f6c9c837a9425dcc27a3f473", - "bb2111fbaebea643a8960e83a684a32f393258f4c86e219cab065396d7f95e75", - "09ee38282674b4c665ca7a1523ed27c8fa752d335000831f673099710fcf09ab", - "bdb8df1f9e433b1643315a3fb0c66b6f0c9f2f86d58b24e723ccf91cbe136e17", - "33f0c525e0a247a1c6130165feead726014f96b715b742df964b0f9625627ea6", - "3617e749554bbc9772135496b76328c8bb3c5c87ea585f68a1f6ad40ab484c25", - "c9b52dd85368df98a36c4ce37dfdd26d7304630f75e0be39b3c4022426cbff82", - "42059468f38cac9ef61004146669f14c84878220b799ebb63e88d54a84b324be", - "96df51289fa574a7db110917ac7859671c9bd4aadcf9ae810a0095fb52fe2f30", - "e5c0419230fe09eaa836a8ce3586d0e0a142aec925bffa6c957c8b3e31a3ed7e", - "6c1ca59667c5338cb2779526c63a73e0d2f1f7a6d82d291f9225317bad5fce26", - "a23b8842a0227f5ee14c6f68686f12ddfe30f3d34c95e2e59af48b56ff3a5c5a", - "edf964d5a11a278ab9495ba80099b784b3f9ffc87f752f8d2171ce600fe7d0a1", - "f02f1a45913d567fd2ed972c2a43def20238d55a9f806acc1fc4be492ed6374c", - "33a39260240c75c7e2a10304215c80015096a5a7659fc806dcf6155b963d0e80", - "2c5694172881cf46098bbe1f4b554445cafc08c0e7541195e1af9c6e159e040e", - "b11f416336454dbb58b50a44dc9c074d9206c8612889f4f4e5c8044adc2248c3", - "2571c8e2352e5de11a26a5e9b4e34c9a9e7c56040bb092d9bdd19b4e046e2fdf", - "a968d110167b6b54eadf0a517938b8808cf8bf46fa79c3030fd3c1cefca79e33", - "2c53deb3d9bbe531ab2026b14ac2ddc85f48952cdbbd64f46b4038a60b61b79b", - "c44168b979a706b13cb8da2d074e4ef99087823a0fe2cbb98cba623725d32bba", - "b3f67e5b055b87c05b36caa24fe8c6bc8d4c424280aa6e993db6930f3c41e395", - "6e860f27753a1756110cdf6f905bdcaa6ec2c04475711efa0d9331a017d38322", - "5f68a8a8a4a0ef2e73959a9fc5ffab6166742b61b969715a9cf0db2453f9e8a7", - "0a820a1251f8cb9b2e35959937cfd64b0a19fd967624ec0c27d077e516cb1c07", - "4595d9f271278169c88ddb7c91f2a994941f98ab1322ec9444ab99d88b3c9e3a", - "746edb37e55b8aca50b4601337d5ef14cde2df039765db36a11ca70e53e9b625", - "2c765577b014026eee7962aee63873d967d4fa79c51b99d29fa947ead294afa4", - "6df4b4f33358810a972f1eb7b0c57f4b3b7475476f5a367d6380f3d37fa6eabb", - "6d9439b14166b29eff42ed756779285775525329973a494f9b0e4d897a6f6d5a", - "958ec104b2e8f7b6694fc647bd747ba3b34fd5aafca79e20af9ab1c28a1d4112", - "4e4757ff2f7fdf5733c0c7fa766c270155c600fb79e8f8b93ceaf26f95b4d125", - "c49545a206b59fa0e210422d6ab37aefe4c70cec8361cab754a6e3b96ed70905", - "15075e6d7c15a5d52cee76b6053d88246e9b1577452262acf020869d4730d249", - "cec585879216a615e647d915b8754980abaccef4782b1f2bccd4834a9bca50a8", - "2171e80847d4507522e99c262b9912dd00dc25bf348c3bf534bf8a94693637d8", - "68367d305f720ba779e7b273144afd9ea499d7bf0d0c24fcbc86f8c98e443c46", - "8cf4b45874a85ca2315a8d8c980c18e5ef13df948bbe66e5467c1740773c6183", - "3d2f6e8ee68ecd5231c7684aae65ceb0cc0edef446836a08c14fa87af2d8a1e9", - "78eb8bafd48d3e434e1827850a9f40d3557502bd6abab5ba6c24647d5e8e94d9", - "271fde1278659e3c2ba395c3d8000b9541fa1f1936701ff679a5e294729bbec8", - "5aa4d15e864917e400f3694f8b0253ff0a80ef7a1a27d21ecc2bb92c0e591989", - "17bbeb3084f7325245cca9a270743485c525b511e7a8749102c2655f07206fcd", - "40602b0574b01fdc24f355fca603c0a5f1b89099bb9cfe3abc048bfeca97196a", - "3d270a847a5b8d2a0f4a4f06e5dbf9ca3d3e9993e674f2e2c15bf7ba1883bde6", - "88948f20edc754faf2a4355fc3ea35bc7c0487a84555c740205729557f7239ad", - "0a7764921c1ea0844025613a82c2aeb9d3d63a6916a3a72d19be8d3e7addc891", - "73015526e6768664a42ef88fd37aa99ea9e70c9ece510c7a66313f7ed16ffb29", - "bd23c8081d5f98204bfe2bb7bf2e6c67131c5ae0318ea8e03bfe1e65e06fa970", - "b6f0a784ba5dd952ce39a09570397eadc10f1bc62d3f1c0a23389c4c7f8ca211", - "4a2c514d0e3a41dbf0adc8bf83643f7b464e308c953f53967dc6f5c7b9802261", - "f826ef7cf4d70b250d1f1b660ea7d04f405241454ce1edf42c269819d7c99dc6", - "ac38a5405cb7154663b0de63381edfab03a017c05766db8afec293342c8c9d1e", - "8ed6da5c392b5b8367410dcbbba8137257fb9264f343f69ac45f14fe5de7e2a4", - "32d1c9f28d7bb8631be16305f7f2b16bc4475a2e66d42125254d424de303afc4", - "946df754c6e5de19e4699a9c674787a0db6aa8df61dea9558d13fcb031114a87", - "d541a56440fd103d5457d838b54a7e359224269a530b9bb2c2eed1a348fb37da", - "6e7caee12e0a48a7e3fac0db05bcf685fa490242bb89932e6a495ad90859790c", - "a42c20faa699a7fe0764f306f4e484d911346281e71ea76264df7f158e8d4bf8", - "8474522a7bb05acf18e6cc15049b71ccb3c296ada3e97e3d1fde9a08a0004960", - "56be8e467263e25daef5c0462875fc7a27874109d32bb6976f6856642863ad3e", - "dc008f0e11932568fa64eb3f4d61d85df04599651b355366ec2d6f4d36b40497", - "638765780e58f6e4f80af96f4d266bfb66d5585c6c5877a2b0d49aaa975e0761", - "1173080cf9cc9d745548ba5971437bd97eb7b12f1d6777311f30275d873243b6", - "465bc7390560448fc987846331b799ac224edb4498136dd11e0522aef1de7464", - "4e4624ff4af4f599471cf55908af363d0193f2f9c554f3bce2a51c7439389551", - "f72d93cdc519ed245b2371020fbaa8fb9f8e383d260d4fb909ce1f1c30c1c88b", - "8ab4eb3f49f1ed38b5df51110ae13253721fbf3e80ff99cf518822a55af9b983", - "76a29b2d14884cda61082071062f81a6763fc5d95e2d589bf1581785cb1844c8", - "da81c6c1605d016c6da0d2dd58b699faa1bfa7944c4aa148a06739e7a9ca5093", - "6273fd85434b41c6332f7dd73772c79ba6cb8f566a1794c2136f1a662aa0cdcf", - "188ad245d8e2e001eaf524682098be79f33005f770927737704d9b4c6235642a", - "cdeb15ea9d4b48fccd5cc20e8b5f5404c21a6a2976b3e3af269b5be5f484b4bf", - "df372e81329916a43071c7e6f2fe8bc8e8cb90398a862cd47893de9ad1405c13", - "e982c6602451c355717214befcef382c7c5b870273326118a75bbee748536e76", - "2590e66942f21582b5e38f8a730e3565dbae05aaf9c971146e07683dadc59804", - "e2f4a978bb012ecac27a805832b33e38981ce8bc27ab471bf9590bbb356eb0b4", - "7fcd3207aa0eb1c490742c8ca6ab5e0c29d45d12b459d02a57afc7b09fc10867", - "9e740abe8e08e00de2f74aa2408f5b94851e48d32d07fa0fde9490b16fa09e6b", - "e76736c5320a1091aa6f890b18ad90823949a38f1aed66ff690b2c7aa09a9557", - "2acbf6fcc326a7fd36d90a74c45715c9856ced2e10caec2a21b8cd90bb4186a5", - "00752ba7327b7484174d353f47432e7a05316d0cc2334947b0228a22f8132992", - "9cff203ea3e2311725a09b5bebde76c4e921e0c1808ccb9f4d1c64bf2490c9f0", - "69904b77dfd7110b3a6d71910177a9ccac68ae61249b68c4e8674910a04c7a14", - "b6bad7829607b10d206a13d27ed2924f9bd2462ab6bf05243ec69bf0de874f65", - "487e0a23ee18454a78016645c65444573eeacaa22c9b86187864baee54235638", - "2ded8b2aadbefaada8316e586ce8e126ac466eaa328e8a2bca24c761ad9320e8", - "5849939c9b40eef60bf427091f6578cec07d301187f4c39dee3b52c80045087b", - "c6fc60e07729a7ad68194faf4558e982d9c86a1d509fd3ed00fdcecb85fde6f7", - "9c970880a2f30841319c4f591d4a096b58d7e522a9643c7d1bbddf7ac09bd2ea", - "8943c9b096da190bf7f1314a2eafc814581a0a4c74bb8230a353c2230cc43f91", - "d6e87176cc67b9021943b875f9eb6a0cb6c90403381e0334af52582d7798a3a2", - "dcf66b988a2ae3f1678e28f9f2fdf1ff42e8c2a146833b2bd5feef4a942146b5", - "bb550c279ccca8964df78d16c088ac7f498be827478240d145584dfa09efae29", - "d5a15636b2555c47a292a88b5ba0092e6b740954bf6dfbae4d7649a1b9e644eb", - "b256e567a97ee37d158f318c979ad65692df83ca31a73da51e2e96d6a7dfe212", - "6443b1ea2915991debd180333c2eec032f1fa82198e0ddc9f1f3f555cce2c146", - "fe2a8bf17c6ac702b34e56b48a8ef89a2eaeab2e535303be176dc845c50cc432", - "fe8eb2e750db3790b5282428daa3dd40c832f0d9172e37510f9509121155749d", - "6da44fc9ef7c7e09df0d98fb75627d776dbb8027efbbf85f1928460a5ef7701f", - "99bddc0f7187b09ad7196bcce9ef99803379acc4a94175fedd54d30c0c37853c", - "0ad3afc2963a6c60131cd8f6ada86e9e87e80e647d9583a59e273684891cee7d", - "b7da5cbe97515532c33e27df1310db2ae389891c8d03f36d758f197700656c13", - "8af022d41ccda3e82d3e6274da6df44b7d4d318933ca39103c0d4e663aead7f8", - "d576675a2aa484c23e2944504b47a1c2fcc62f4c4812fbc69644b72433ab184b", - "2e3d9d661763c5259be04d97fcf430900675be8a69f176a9f75e02d1d8fdf6ac", - "cdd6caba1bb30b98e6c61b4a03361c2ae3d734c5822f2577735f304b3f1c04d9", - "bba8203f3c7285cc471013b62956a59a23b7aee2f2619787820b9fa0987a03f0", - "2b41de30df20a285d9601b6e42311eb66cb16e4cd2a948899966ba027277e846", - "0483d8c26c18393d8d26266aec4ed1ff4b0dc968df7f7c58332eddc9212962ca", - "22c1b5563ccd059eaadd18cebff1fa79d09ddf97085dece2ca726128ef801d53", - "25e6f3cd25fb4ce94550b984b65db199b698241fd71ae74b6cdb97ea91544c96", - "b5b9c7f922719b915d506119f2b37e5201befa4de200edde94305f8c25946783", - "e670b8066b0d60ada6ab77f964d1bf43869ddea4795054e476cd283e6d2e288e", - "9ef91eefda6e2f09b29413ea515510a3c42044c3fead6c1c96be661a14e18acb", - "7ba99693523fccd04a557daebe343aab7f1ea4cfee051de12f76c8e5317c991b", - "1cbbf8224d365423e8d8148288fe31a69ec8b4dfe92bab0deb20e8e397190add", - "f8033603cfadadfd8ee0978fbcef32e4affcd7868cb6a2dd2ccaf32eb7327a7d", - "45a6008e4f0d5e446ee6bc321870a7ba62d1473ce591f61cc0ec6e7bf15055fb", - "6fefcab487c3dd4388d7821e0c2d838ca19f64b1a145b47e58e5c98fd5295abe", - "afded082c351399a4c63a66ad2ffc68519a3717ba521b42734b625d6025c8ba1", - "a478c3eb7b363be03e53a9cf3d85cdd496ce855702f0fbf9e38b887632b11f78", - "17402dd39f5f7fad81a7a371b9de76553b3646c634ff6238947404ec62cfb720", - "aaf38eec1bb69eae83ebc725e949c4f8ce749f1ef79d0e94bef63b2b260d46fb", - "bda3a9bf9bf37356052711904bb07d398295af1fed1a814685258e84e563ca4b", - "cc9f0543aee677323708bfacba73735e09453ce4fb916c9a9328044d1f6601cf", - "ef2b6e5cbb1419832435604982d884485792a4efe59f87edf69497d6e02936e9", - "89e11bc79a7f6e2a933e89660d0881c9e1cc14487b644ba972c4d86f88527153", - "759207b5482d74d6bd1811f1b9b45d786a8871900ee831964f23bcc29edc9038", - "b2667672782b0c370d580727916fe028f0f9cd32306bc1d910ec7afda830daf4", - "e814c4df9cc580ce2748628c5148e3052e0b58c5c1ebd899ac19c2a618f24ff4", - "c44bf1d3ca99cefe7dfa9b5e4280b57219ed91250e9cfe2add851a646f22d021", - "a9aba587c5dc829deacb11983a2a21fdd0615ca8db4caf2d12b9189a55304703", - "8569d10751d393f057b3c7835dc5df829a8db3f0eb7eb659ef85a0a256246943", - "326d00e0481ed6d07f321fa5a7372c49a51cf095ddc64585311ebae0772b6b63", - "b7c8e8af0fa9383413c6162b15306aaf71ee2c4a02ae4dcc1ff75098c88e682e", - "0f27075fedd2023445b376cbb320ae71273e42abaed3a733651a1215d896c82c", - "172e85c963517d0af2bad2432c2207dcc67953b9e7a56f587edf2e321482012e", - "a19d34143c44aa9acc4b0750752282798198cebed2872c57f02a3bcf67d59a31", - "4851a94d747541484f7c92fa10538d731f96474203701ea10217ec120c7a33e6", - "8e12362f22be638cbe15c9c60ddcd79a5108b09e127e2b19cc51a9b65394183e", - "3ee4a2928404e010f4b92ec1499ccf08491818877409c3fdb088cda16fb815eb", - "c789ea0850e7c338f83edba54b455c7641b390e372049c0517403b089db0fd18", - "f254094c8693064addb9319159fa991b7cb83c1715ba4787b015da9ba9928079", - "74eea1721c6449cf02c392e351b2c6d9e732446de61cd8161285cb0b2e6cdae3", - "a52bda0760065a7ee7bc0f91e42ccad634d0d95ac5fff314ee0855692eac07ca", - "a789d1cb46a5b2d1af3ded416b5799fc4dc486b1b08e11e461bfb36eedb6115c", - "71e2c0475a09b1a9aebd2ebd4a35b27200e935f03d8685f01313c566a699c18a", - "66789cce09da884bc9cbc1d345b9cb8ec9b6191408e126d43bc4f79f2ee8f76e", - "8183f1889ef165cefcd96cd61f5066814a199d7544a60690104ba52322e1bb69", - "22f2b368c8500a358c3c89e63560701dc10c1e84a7c040a773d9d84edc1fa3b4", - "4497a9108512ca4d281c662f2ba7440538457baeb9495d3f8ad16cf909b6b457", - "286400a6521365d8aef5e42da7aeaf3a8acc6758fc03ea3cc33a89cc60f63a5a", - "094b109dc977d7134f632a9b070e05afce6c064d69a96d104aa90c5b2ac1434d", - "a4cb7f78afafa25e5023d24028fa2528eb927808fbd501d65144cc74e0dbeff6", - "286112e180e65cd574703889d93b551ef4aec31b879a0f6a9bc18e95bb15bcfc", - "7ebf84eda8dcad42c0886c92428c8560df8cf88ed533bdbb123f374f9fce4cc4", - "27f08409181172871076c4eabbbb84fb503b1990d3cfe456ed91c3bc6a41b9c2", - "b41d5da830f4285aa5946f637d914aa08be902f039b68466b9744931146fb5dd", - "432c1f1d7e01e978a7fc4c59b166ff8536a865bc80c2bfa0b79958dbb120161c", - "930781be0254b4dbd4847ad342e5398ab73b6436c0fa0002ddbf4d1e2c9c0d11", - "6cc8062fd40f5eb501ea8219e82a6fc904f1e75f1c24f797356e0d0a5ccf616b", - "188fd4c0873802ab8e78f01e369c3833d64513addbf86b00d4e7905c0e8382fc", - "e969fe4a5733b20c2b0628f6dbf7f02ee54871e14434d07fdb999e9172d5cc9c", - "1d55d178e6a9b80523a31ee977fc61e00eff85d072d7a6676cec7ec21e777f24", - "32a45f56887c893108a23d15e0a713af1d137e5a6da4d4ec69736efa2ca2cf60", - "925acc0c0ffe72dc439d237f594d126a366e5e95488f904ef749bf04a6548439", - "5553328cf6f218fe4f97698c6929c16a66e8d4720df0a8f26b893d2c09f9ff6c", - "1876b28a316c1d34e1b5da6d86a30660161b08d1ed6105333aa1469acf74efc1", - "03845bf1d1e43f49b99095897bb11ffb3b32534af2e5d272df6903f3400418e8", - "5166c011c5b3826fed53db3c308098639392d992ff8518894122cab294f35645", - "56dd1fd465c27fd0294764eb38c8c0300e93c8f85aee9f719f0ff0c83e70d0a9", - "2b9dffe09d8eccbac2b819c337a1bb74060006d21ead754dd512106f477e0572", - "812cdf9d36ead7a232b2e9358eb177db87185b36d95948bf11b648e8c165b277", - "4adea4d63547370e1379f81494cc8aa081f6eac6c14ef27bb76d427424b8f8c3", - "3d773d8da2564c93f95c9d3c2ee0612df100d1407c62070aa2fc5f73f90f5ab1", - "a01871e0883aac1415c0eab1af7725e6f27e67f6622f419dd76ca559a8eef3a8", - "b6b5314ca0b2ce5b45e874c6ed81e7a7d991b4ec183d4e6aa17b0f27d69ee536", - "4568215d54fd313baf49b8ad2752e55b105d19eb31e817cb7158f6d9affb50ec", - "cdd4af4ba391c8a4866d7095a6037e5862e9bbcfb7d4a0baab95e4e10e99a841", - "f578d3057a59e4092e67e92feb2ebd92142ee1bdfdd906c5f7e1d7dcbf978a0c", - "e0c4977b7488590fcb7756d32df072fe7ac0495a3a404b8b9df8b529a4e8b656", - "9213738dc82cb7def1683b2a4ae63a226cc7ba3ed133d7737898f0597e6375d4", - "6a7675e4f7869a59424d3d6bd38cfb898c0593582483ac1ad4fc1c18bed0a1ba", - "5a01986cdb9a6757732b13b5948fb6e797bc06777a3da92c7cb84221757c5c8f", - "a48c08c6c2e9129feea0aff74d3570e51bb7460cb18487aecc8ab7e5dc8a8927", - "ebf1c6d494a59c4ee7fa358ad746fab607b8f4dd7ddeea3cd3b6fc67959b5680", - "665b71cfb31e8b53b01ec949d1e7a26e92e4e90c0e8f97da208a737219ee59d2", - "cef1c049fabec430b5189e53fefde523be739ef4b1f587fa09db9f909dcb2aac", - "2ebc9255846faea81afc8d321f6c310a15a583f1faf63c45bc0a493159d912b0", - "994851d77ea5012191e8845791bb44121539f56e2b53819466924539dcc9bd71", - "9628591c10f9e27191dda7b5f62805053c7bcaa24214b9dedf71b3979ba143e1", - "593532d8b4aa49358c6d01c493fdfb1dba18696f35bcba7953341c46532ec314", - "c39888dd254edaa1bd462760df8942ce91a09f857f3b6576cd8ff1e9c69a9f5a", - "7752aede0ee9a75efdbe171a5a43485dc2bbfd0ffaf6e3fdf9329c4e92632da4", - "9df7aef564d434645f71e9c558d92b66e62eb15ca9a16e4ef610cd7789ece5a3", - "885a4e1912a3b2b7715bd85e38989031b3a6dc1839a8a3cd0411aa1ad6725506", - "8f7dc7c47417bf9d8d3c7ac9339fe1ddf492714acdda74021db17a0e0675fcd2", - "d7a9afd18d8bf74c1d466ea25c896579a8f8417a2c882775d235c5b37c6402bf", - "cea4c7dd615775058886779faceaadb3c3b610a8004c4dbaaf7058d44bed614f", - "db83f29945eb682438a937976ce98acf12eedce0b4c9200c9bcfe511ae3d1fa9", - "240560b2e740a227f9e1b0ac466c8426035a27af8372d6ccde5da099e27d22c0", - "9a9c14f39fe12d852708011e5615f8d24a2bfdfb5f74ea49fa68f709fbec69ac", - "c27925d1a16222c2a3ccebdc1de6755f78509864b9251570b645d3c24bafb90c", - "f748052f044a36dc4f407e0c4d7ab31bbeefcdd108a0e4ed34656294066d53d3", - "0458075d57cb6e3e9750458a13d08b26a360eb638a5eaed5c576b8630af74763", - "c6135d514ff5dfc66a74c64fc532d6227d7c77b9a2da7038f0e6708ebaf63257", - "9b5bdacfe684a8a5fcb1ef693c32010160b45dcc09d7feb5e28d9cbe2458a2b3", - "a7517fbfb6102360ffca9bb1b4f067bde695ee5292d86d92e54f6e2bbe03edb1", - "044651592cf06ee0aa79a1291c962b8f72a45afe39c45e09ec56bebbeb3199f1", - "8490569d5c6e441b26da8f0a4e95ab82b9ceecf002b7bda45484b93b49ff5fa9", - "c8fa4abfd92130e8946431b5abfd0e9b9acddf38c3807c69e1c9cd898beb5a2c", - "86e7159019e6949b4677e1063abc5844c5a16311162a78eab32697c567df2015", - "4983c15d107ca3c028db17121b9be1040000bdba89d159cf9e7759d131c71944", - "cd542f59176507e007e396189fedc70a92284130ab55169207044d5b7a7a7a75", - "713dfb194a31cacb9a2941a06e1e6fcd62add164af52099cc1a1ef2b5557fea9", - "f7cc26dd8fdd67e8cb6b3ffb2cc1ceb15453dbf6c092516f85e0b30a9cc806c6", - "1dbac3ee663474f23b2a2adc8620ab8d75d05526f1fb85b39b2f09d9ba0f2a8f", - "4744ab2e6c46b6f977c2ac7160de88a0df14f3c5b1e57c58d3e3f59bd0b8de48", - "d66503b474ec22e0d76f06dc03e1ec815b25837f4354ee06c28bb19784e1839d", - "d4eeb27f6c36838186b91bd880bd1918832ac08c160403fb38a4be0624dccd65", - "c0a22728f4a53fba65cae9d40273adce6c00452ae6931068e2f79ed334afaf07", - "8f3a18552d20587ee44f69a2e766b0e3203957a2b3bbe7ca1c65800e9e6d7d61", - "67adcc50feb3bd7a39701c138b6e35ba6a0b90801a35d7880d9008244c2d3a7f", - "40981ad544c439a5656c4e77680fdb5c8c1c9c6e40cc4ced25c30bbf2689bf8c", - "5584e702dfa55eeedd28aa865a8b658767849c36649ef0ba1b1c54e7f8c27636", - "86fb852fe03faba8193b60e0e787ff7ef622254d5e0ba6e5c3c4df092147d61d", - "96659047bafd368380609443e08dde33f5e3b275c5b964901592ee48f9e788de", - "3c093e430fd49db7585249775c11240a58e229ddb5c1649072a5ae87fd5595b6", - "fba06f3924e02697edcb54a487e1659d0bfe5102d7c1599daea85bfac65152ae", - "5e10a34640b483bac447ab872bf04398cc844bf299f054722f4b124075dfadb1", - "55ffe377d693742b960e304f1bd893ba69245f64460d1e74e33c2eb68c2006ff", - "a49d120c7ea13bb71d56bbf3897f91165915d0af620b38ed7c50e70037dbfad7", - "ef1d6b21cbd5f865cc7de1f9231c8fa3de1b264a54e55ce719fd03cfde122123", - "365ee5c1cf2ab2b22392802e310d61759d62401eaee1af6a8c662570c9b96dab", - "90c2ed188cea561f8d2b15f53c4bdd1a3bee770336e7d70c59a8d1c3daf81582", - "558606b146d3fee3cead77d722c904a581cb815cd16e153ca3a57fdaacab1441", - "2fcf3eeed343a7ef2e2e1e695093e9dabb778238fb1432a434a581b67436e6ed", - "ce0b7cb37a7e9fe294f8dcb06dc74de7d1ece813aa1682256e3b0fdbea573416", - "afde2711bf15a50925265a55ba439ce7ad8d972d4c16bc115df25ae2d6e4be65", - "be8cd3dcf6437d262873e0387a142e8ae1d3e61c5a1a026e07f8f7bc4b224f7d", - "54674ea73dca8828de224e5be1947193620d8d8f7570eb7c4d67ab8420847a6a", - "7bececef455082d4e7dc12b68e41453a0ac8ca4b313ba3981e11789389f6622e", - "8725a8a5086776608297bd72acd43765b9da1d18563986601120a126bfaa2d1f", - "1f88cb3aed3d796b0c9601f7e0bd6918b3534c2047a1f95906bea7e250be7c99", - "a5f8bc783f3a1c1fcba222a5953225314695797541db14a3bc848602cd85a29d", - "41a52214c0ff9c614c658f49c6472027348fbee26ddb6a1a0ee9ca15358265df", - "f894d7f69003157707775568a04ca5ac3e2699380aa92c44c655ee073c022ac2", - "4ae1701f4f3f06c758abe29d43121c72b40629cc278d7ba268f4f0ac7e84f3c6", - "29721340425086fbb1b8075a80ecee43e6a2d8d4cf5a6111367a2e680d12b49d", - "6d1a5dd40f4bcf3f159f454d9564b37dd8c6eff2008f05ec4d340aa1d436f532", - "90a3dde2444851502a8712b09967147b539f2bf0bdddd4f2a3442568d0dcb8cb", - "458e684839f509aaf29a03ed33d264352c9dbc6821298325341e30a1786aa318", - "bda65b4b6027b54c820477b72f41fd2ca78ecef21f2f6fcce47cb433b1df3e84", - "a43f920e3afcb59a6c7962a2ae3b47e37779951a96356d8c6d35dda41ea439ca", - "1a7ae3cd537b7a42894c8a575ce465320518c8b7ec45335fad374804b1763930", - "9fe3d590c7f0f556f52f4c1f3c5aaa6f2b7bd603886fd96b38924352c4c9f9a3", - "3c89263a909616352dc43f52457c7a25ac4d3ab50a292ee7e9aa352432bec6b9", - "5ff5d500382c4c6f93f04e90cc85fe069d6290fd79c7ab1b17e78095bfc613eb", - "5bf2a69b9237d01fd2ce67298cf7c4eb09b2a3224a4475154d2dda6a6390b95b", - "08ea34a81257c8abd8be3a53f33ab02e5f67519079119e9e7b4e0679715eb5ab", - "87c455edf83ff98c54e5ad6ca44f507bbc42fda82a52d59e3d5c146650f84794", - "c251f4bb877d65b50600c9e9b235c07e2c3be972c7c7d849561716fd506959c9", - "11e3e3944f590add761a8ef1d56a863aa23e37090823edc809b9b40b294ded51", - "7e991bc10c860b55430817720f710fe34417151929b33258671934e521f9dd62", - "d51d86870d756c80854c6a58239ba7eb041876fc8c4caf64419faf97aa5f6bf4", - "30331f04baa1a8d57928763b742d05af3b951302846b315f2704c252cb8f572f", - "899019ba3c9b5322797d44e1c4e04b894e08eca19f1e09a4488a4e81806236a4", - "a166c703b6d894352a482642a80abd99190ce485841e7a2027d51ed6c3292e48", - "c176b12b3cc712b84f3facace2c5e932bc0be0520097df18752bb654baf2acc1", - "558271fedd066f6f184836075a25b10aaeb23214623bf6fc3830654262701408", - "9ec5c0dc2046f83b6135575e2dbaef6886358da74e51119f83d833e15fb1fb22", - "f9b1e6bced0f1d26c9d660381ed7b8dd91ee1e83a5a34631dd938dca6d0f2d02", - "66251f30c001b09a12d2b239923681c2b6e4ad67ce2ba4a725bcdd8441028eb2", - "e870cc9c0e663684f6b02298c608004e72a2333533c325251f1f3375cd160c12", - "299d9e2d1511da88c64e37df59c008e817521ada4ccfde34c1a14ebe5fd644b3", - "e34aee1ff8ef13d02a24ea48c345b0435d7ebe193d450f5f2224f5c76ebc41eb", - "c3f8e0e7c9b106349275472718b69371adaf8a84e05e6b04ae88f9b2961cce0b", - "07726936d0feea9908458f9d02849b26e6ec35949e2413965ec1c8cc19e58120", - "6bf9b49716671e7d36fadffd945f759847b6d0038a8a931b82ac8eaeff3ede2c", - "90ba47cbc18dee6c9fd938ca9c93694b0ab2869c0e1feaf0797d8ef06e292bef", - "1d011ad78a36e3be9acf70ba6e677b3d42029bf607d536f83340bddbdad869fe", - "f5cef77d7070ae3f7992e3de3c18072077866e4652dc319f12e52a5e80ef2066", - "9e1bf70d1048a0780bfca7e3d6d17eed59448dec2618c1a2f9470b4d9fd0308f", - "5142ed7ae6b5ef389ef274fe7328f05734f81f37f22e9f2baf44ba4562d3eb0e", - "b2f81ef625a0845e05d0adf312ced820efc492adcf1b7c0862a56d0ab9b3309c", - "9c773e268f107e8893fca82d3a5b853dd668db8bfab761a655dfe32e9f169e50", - "fc01b52fb1679accf8880dbb993a48dc8bf1fec677f97bec370edebc1bb3745a", - "feecfb3c1bdf27c5e48010a15f278fd6a89591509da89370fe38071fd71f6dcc", - "29b6e43c74f44c19fe137df877038b90b188b4169ad9ff801fbbfae955958283", - "ad6b2f4b314fc51ce732f35b0ae737a9c7c119165de7fa00afacf2e7efaf626f", - "d71ddbfb84153a3ff6ec0eeb4c78ddb068aa5a73a78550f8e1428ae71b62daa6", - "19fd84f68f0d492bf7879083c8a5831566eaa3bcede6de187aa6ddccb298d85e", - "34e32d5ade4cda10ed722d2c41a80b4fa0763525990308855209a521740d7f4c", - "409552721a1b8d18531afbc0074ab116fcb9283a8279c0815f1a7cc711e9bdff", - "a51f952901ab0311d1d88ea6a13b3d8d3c77f09aba42e31af3df94cedd3a3bcf", - "eba8c04ea0ea6c0958de42a7b39e2f435782ba585b7630e15a55783a28c539d4", - "d577f33616402960772b788fc0198b24c0456297291254c96f59ad5e33936bef", - "e5e8ca43c4b33a9e24e1d0124a0f33756351bb696a605b14bd412d70a6b62634", - "6be0c076a2a849ba50701dd5441d2d86cd193787361730744fc38734cadbe5b1", - "3c9562195ca4e4b5bbc45cd5bff24946a5a167eaf5376272b3c7df126a8a13e9", - "cd7be08266daa6cc665271b918b4fb1f172fcc74e62d038283743255ed2b1167", - "c726368c252e4e93389db6978fa584929733c40d355a6a62ede05b68614da8bb", - "d98fe441b0b1d85315c94d1d953a714e9c27c600a9f0dcd47fd0fffcce01d240", - "fe46661904aa9d86d81acf1dc6ad76cf10772feeda1884170e6ea523df633cff", - "e1bbcce748cba65f74ed9ab682a2a13060684aadba06f46254425ec8511735a4", - "e2513191cf0d109fe9a4f13a0bd00c17c405481ee6a5991b0dad7e14ffdfe967", - "0ac8db04dd1b2d030e0f0f639550f20792f4bd7756dc1fda47850f438be233ad", - "08673763685ded041d7d841ef3e2e189cfa7bfb49eff0d17413b94edcaf2c530", - "e72c0d6cce846a0febe6154fa6228ace88c4bb11db6b48c4ddb2992dc5dbf6ac", - "ae9e840326fc888c5add6577daa46107c4ac0be3b18e3f772fe126da5b33e329", - "cc259ea377d7c0ebb75890d463763b389d40d4ac00b79d71191b4f787e409da8", - "5d7dee295c21b6264c34befcbf1f46438555dffe71232c4c68021a98ba35e1f4", - "293bd0ace291f3f7ae21bfa938b618ee4c8003ede3edf1bdd8e8b9d89452787e", - "14cc4ffb634ae02cb3a9a25cf909d84dbb5bffb7bf9d782dc9a1c4ca383f2954", - "a4a311ba52aef0175c35fefec849cde61d63604b03a13e866855290233242106", - "b19d48d9593358ec2876f930cdffa5bc8c6e1d27ac73eeb5b9e07f98283d11c6", - "f51184c788098837ef858cab0b0b627474c974468347862923a0f96725531d9c", - "ab215dac9b125672a65cfd6e92f88e548ff4cc58e235be47ebd1da0996fda86b", - "113b24808c1a1b6abd2507f4e5ccabb0870b8446a70c6f0cef75ed9dff3a23fe", - "160adf61911fe79a6d2b05bc50be22d3ec6bcd697ec9ffcbe13b70b410e40afe", - "e53f60b3621c6bb4b5790d71490a71b019eab5fca2ee33071fd22e754d653498", - "54ca205fbd075b723430e737e35efd2c076f39d92b3e372b1d5e831ea4aaef86", - "bd12df73ca9379fc085e8bfc811be8e7dfd784215d0b49d77fa087236012d29b", - "2bf74edca8809d0be0dc550c9702e30ab37e85644c5ec7dad675492ea0ea11d7", - "62177d2814f635a715ae0e08bb95239fe3bc0c95869de3ece1421ff5e64a2a03", - "147fb8c61e178168a2b04700c1e3c38cdadcc933c752b2f4c76bdeeabc5e2058", - "0bbfa8642141c61692b56811cc2911c1f57fec0eb8c5dfaad0ce81752c0db4b4", - "89a6f6876edd83662f81dbadedffb48e2557395b4e469b1ec7fd3ae5ac33ef5f", - "4c546ce592b076f2ce5216333155c997fe99e7b6dde698f7c119007175821998", - "2ea499f03f5c1d1037779b4137eae5ea807602b3672c31fb0a9f1b258a6cba5a", - "0f704162c9f73430a4eb81898719b2a2ff7cdfe5295ec93bee6d7bd7653b99ec", - "0d0799f79f2fd0ba33db7c1a6ac4b0ed93c40830017e51031d5b946f0f7d7697", - "89c2ef03494b3cd3dbdb2d817c0ac79df8707a7961b04bffff548ce194f862ec", - "f959c8c0293de9fb4b3fcf4f631836848f1f452bbd23d70ef5e70c32c355c0c8", - "e80a9952846da6dab8845092a0271e5f32a4d5d86c6ffc91170dde7136b440cd", - "acc8ac40dace4df166b65f9a4a78d377bd02bdcf2947170cab083bbe41ea0244", - "afe0adc5ff1f7ae93734e8c98cee64e33ade60d431576bc165e2c45d0e5c2e7f", - "2410ee6456fa005d8a8e01397159f12f44bad1e4ebe56bc8b70bfd10b7afaae9", - "975427e07e3dcbf696293f18c91a73523ff32d336b2c4374aee6fb8bc02a011e", - "c47a7d64714907768c2ccd593f0080b883b3f645c8084b560ada27c70e079d9b", - "94bba225d5a3ac143b8fd965d2f12be0aa0b8ea9bc1558f109a6570379742a7b", - "7c744dfa637f51f04aa94ec926ca1bc5f0488365a0f6ffeaa7864c72cf50d09b", - "319a6b45d9fcd6cc00dd6c025c3bcf9c1584a688eb8176279e2cf44ea6dd293f", - "b44a4ae4f517bb47071029c1a2a2d4eca879136f1e37d0f8591d1c6f635ed736", - "0a87ecd9f279fb266780fdc2880cd617ac02c9a436edf1d207962bc356a6b5c3", - "f7460bc42264bfc0c73fab36a597fbb05e132fb57145d01c61f6f5846dd3205f", - "393cee1b601950fbe60755b9d54f8be14eecbfd0b98f7b8c0d05d4bde312bdc7", - "351828c17a44ca124cb34855f401b9d0990b4a246ffba1a9ededcf77d5aead0b", - "b26515f071e041c88d93522e0686c8b3fa4b814fac27ea97571b393273ea13b8", - "43046ee3ad81fb9ec5c6a8fcd73190e19675d05066f3c9a51eb973a5405c3af1", - "771d65a8d56370e8418e5729d6178b0c658770da2908155c6588203e6ddcadb2", - "991516e909af1d544fa7e9e8317eba024665561fbdde1656114f624d550e03c7", - "85a2110f82e10233d361323e6729c6b86550756b52fb259f2ef7040bf3f3d9a5", - "0ba9540df45b2113656b305482cb001f736af62fd7352600f58025b57accdf31", - "1c2858a3b2784fdeee2c8d39d3860eadbf4b4cda337fbb7d7198f68573bf8e9a", - "1cff690e8baa57d871ff29e63b53a0899a05cfb102e92d36814e6edc18ffc3b3", - "06b13590d1cfa5d2a3d71c07c274844cbc7c6bd066c91812370ae296a0a25ef9", - "1fa6c9431ce02a93d8e73a33bdf1b839ff0e383b580b66d8a6d204b1f0da3a72", - "a0a23e773765ca72e62bbae199d830ccf85918b2e5ecb3043036a5e63c2c366c", - "34f0235d8509055e0a71e522087d86e5afd25ed96334a028edb316e9f3c89b7d", - "38df4541bf9416a005bfc1548215bc98a9e3c1b4a5c0063ba5f4cd8e301d616e", - "92756532d8921cef273066889637a71df49fa3913ab6dce887fefb360860e734", - "8233f6eba5f8dd01a03e2cf0a68d27320b36b4d030395e2f4f3620203917f583", - "8d6c525476382f337cc9bf81cc2f0f15f1de5bc8161f90e6c71aa2acfabb07c7", - "59505cfb970019f2455e11e1b329342791cd376fdec94c7183f6e4ba69cef7d9", - "f58c6752675fe646d5b7b989ebbec646b5ca4e8bd9517f44e57d1168eaee016b", - "a002a4e1c02507b5d14955245626be4a5022b7c8e0eb8353cbc3a0676af11590", - "349e799d55f03382de9cce881376ba71b36d4f62fa5ceb4b3639882fab7a3335", - "b8901f8a2f99e83ab0568f9e2b896060ae3b59cf84c9c7404d1ae9ba1b37556b", - "621e592879a73403163d1a2bd3791f9f4eff152919bf841874948f394fe32625", - "84a6acb0cf90df0cf1564304fca0861146a161906cd769c22c1f8b22fb42bed1", - "03d56922bd343c2c8b7e3590e415a881acd1b4c163734b7d99dcb9e49f0336a6", - "3f2bf1a61d55b2019b1a594cc081fdf3f1af7e5ca32dfbb32785076c87e5c27f", - "7923f4ad079e4fadfdefdef1219522c5e9ec3c33fb77bf273d9619076eb15d6b", - "66a08ea6e1c8809581da26b33cf302b36ff5d4e1f235b196670ed979fbed9be5", - "e8e868aae1cbc2851d74fde135ab7bd0fa55c9d2da46b2c7b5ef85c846df922b", - "cc06cc7085d35f8a6ebdb581769f1ea5dc160c579ec71a3dd9ed24a5346096fa", - "163ba17b637725694db7ee2fa25207026ec781fd91bb6e8e1056b1f94ad2a876", - "870201601911e7f0277b26df5580c767e525cf7825eec9280b4f7dae7fe2bda2", - "a9f1032ff3fa1312b4b8090a8df37f6c3eb5b88943ecf596e584a4ca973cf5fe", - "e650c17d466a500e0fb5a017a9c150c6429da09efc20d39f74af687b7534dade", - "e7f8ab780a365f31c4a6d4f63ce93edce508e2778c10783b5e5abba694fb13f3", - "558a9acc2b952256ee9a8e030a6cc6f2af3d8a17f70d38a0a7dc95ae3b4a5950", - "f6a4bc8acc91bb5a60b502a43610ecbccd74f0a8df9009ffae26e31ee1fd98df", - "d3b2526a957ff613126227e21bad99a4ba0f5dd559fc1bcd5902adee9368c6e4", - "02b2c96d674fb84f45d5f8cb1c9664cf8ea7555bef4dba24b25dbfbde0ce9897", - "df9b0a5e24f41ce7dc84545b360beca15c56c6e4ccbbc2d8d25396de0689c125", - "1e700056ddd963a049d72f7638026696cb17e7cf10e105cfed5373ebf6c4f02d", - "43e16b86e73363a0ad1578e31dd90bbe8ede88ac7f1c8b043a8549f58b11aa69", - "cdce7028347db1c7496bf60a3494b65ee0ba0c4f4c398fb5c7103f2a52e2ae43", - "3491d431c8218e7b2930d45e9287a4d2c319c793542bfdc4e43766fe2fb93672", - "014937e806f02880d126b7cf1da4f6c0582908a11fe2c91e6d89928c545efe86", - "4eee2412bb5c603cc8cb688da4007e4a45bfeffd0a211e2b58bc6b22c21bf81f", - "c58da7ed8003b0f0d9d96a6a772ad1fdbbe1624e3b17387474b3b4a53eaf2097", - "dfae9454c552b49ef6f982819368a260da7e5cf1b6c3ef1ed47bcdeefeb2296d", - "f89c5c3a13e340d9e02ae5b2ce8fb29409c48031fe1373da9f62750f4ca9a09f", - "985c2d042ecc2611d22175b806bbd4e8e1b6ddc4595fe99312b22843b38902a2", - "e95e23aad942f61b64e4c55cf18343fb4917ff55063fd16e4d4e264cc84dadf2", - "69e7eb9a1f13991cc6163a9bad971f59df2aa72f9ab38bfca4af2711f342837a", - "de323b592e6a6750fe05535e4b7a59a871c87d8eea66d79efbde5feec9d8f849", - "afd6cd63c409ce3f72c17170c4a7e0863f98d7637521a183d622e3b470922fbb", - "ef687c48fd2088e02dbdb2172e7afdc35dc61d9967ca784bb879949feb963679", - "4ab2bd768dc631823de0f2bf4a1323077b35e38bb2bacf9507123cf5396f1cc1", - "426df15663ccd15c25c13733180165d9e30da9150b9f31ad129b5f1c27bf1181", - "95cc19978e3af6aad47d2e4fce4951533056299a1804b8621ab26e4e4cd01a0c", - "96272da404f39c1b5a9834ba7398e35f0d485198f660fd342bf255657f8832f9", - "e90978a6661db0900ad183cc9ef69d0343a87dc1236de7fed23009360c67536b", - "96ff413ea23c9533efff2a0c5249a731202ce6043eeafa0feabcb3e736e3d25e", - "35b582e11459d8e901affef3d8222376dfa95202519de27d307fdaf83af955d5", - "013b1981b6987949b5dd53a98c58d26fd30dfa2870150ab61959b371b30312f5", - "dcd33f57357f10d27c5574682f7e4f5f4be511f4f13252a26653a790f9a8b4f5", - "a674a02d6afe7c548b95780bdbc05d0dd87edb85eefe49f2b5ac0bfacd7b6e04", - "57fd5f1ffb63ef6f5ae166aeb12aa20d30a28c22b0c1205ec94aa4af81f5ce88", - "00865bbf36616d4b658980fabe910172b544a2ef185797dd90a60a3938e72df0", - "c8e390c4000cbceb5cff103c27f9b479a6a2abf091b52f08c828fb2e89472d6e", - "11e7f9e418967e519d69016a19cb30b18d6cb90f3c68597203109143a22f8f6d", - "18e0a8e888c7d02ee991da3a6ce98d9d3873eebc7b9fa59fc59173323c8807d3", - "e477ee74d2c238ed1d65b7c343183dd1a1b8233677b6ffbd6b94d31299295cbf", - "219dc2f1b06a8b5b3b5328e5d2da1224a5935e32e4c71141e959f096a8b2bb28", - "8362c33cb320a01a313a6a7b15749f83af14595b8ddf992353ccffd3b2bc6444", - "3ac2b73cb50f6f4b7feb5f134c8f0b7bfbc66244969fb53649aaf9db21970ead", - "b7cc1bcd3db038965b0c2c07b91b77babaa50dc53b4ca37d182ec68dc158dd92", - "8abb05df9802d780f23ddbacd3e829c7d1789279d13ac4ee97d05487715fba2a", - "d77e809d1c5712d62cefe3f76fe4ac16ccf518b114d445b7044411de7a06f800", - "2534f2c1b640914403e96a457e3b5ed7aa3b82ec2593c9299a500f022a13c293", - "9b19837dd4535226a1f80f60367f5157d1832199a1f2c62c880e2bd59d6b3239", - "030b92400f25ac5ec9e180c15e800aeb1cd459e56375b462e08efcd7e3836999", - "52d0754917e0bf16eb1dff629516b7816f705bc084b778646218fb4476f34639", - "0cd6d468ba0dca491075a428673843661260a112a5bd389f35d9e0066239b8ad", - "f5abf1b189ce05e98c9c7203fc4ea1eabea4a864b4596a252d4490f5015e5d29", - "50593da3bf06f55ceb5cfdc12d6b9f3a3db498f03d578b671cc070cc71fdfd85", - "fa729f035ba52b4862024a33244c36b382f667a8d12451f3dd1d29c3ceb407da", - "0fd0c73c5f8c12c2dc2ec562b7163aae449f72dbe3bde4390e2cec936b1ef336", - "84da88e1cfbcbfa97a732dac8a996f97ddbbdab4b09a982c8a37c33a00b38d42", - "12b1adea0d708ba80d71305746c394cb846cc20e670466a9585129f3171378f2", - "e7836d59aebd724e9dce0ffa2cc7c300e3977221d7a9d9b9cb550a7d06debe48", - "220b358f258d6e7dc45529f2356b45f2ceb0965950bdabe5d3526241b45c672f", - "fc6a612f99eec8f6a991e9e6ed6bfc44acd36f24e00f01cc83d933aa73045541", - "7e72e7a7901168143dde6b709f3cfde71d7c5b17fcbfab5afcc980cb965a7d44", - "441b016ee255c16665461116e8451d58349331c550410e65b8e82a0c8281cfbf", - "6f053236105683bc0dc16daa933df9e35b7ff6a56776f70bf1d74bdf6adde3f0", - "a87311a84ae5d98a52fd8241086c87669fdca5d83a5a82d97e473a0e381a6473", - "ce92cd0ae99c401f0ff7452a12a8b6f87544ed5de1750ca250e40ce5dafc6256", - "e05763123dd9bf4a5d3f8316d9e9a71187e0f2d0eff9037eee0104808b348881", - "515588c1bb93b8b2b86d0b7c6c9931dd196cb0a05e460d86b29a3f09e4118093", - "25eb979f21051966830a34a5cbf699d919692fa15be18c8f36e9a499fb72ea73", - "068d791d83b8dd79219330eafd6a6e37f4afa8e669d00a7d956a30e030a2b2b1", - "e271bc461bb0329dd7afec4b3e9c1709c63075a69f3cb75caf0c945450c4cf90", - "4e758ee3c2643198f8ad7a18e011f4217230ac91c8ffa6a0302d6efd6fe73eee", - "21eea7e56649f544a6e9c6c6120e20a164b4b79adadd675c529cb19ecc68ee90", - "108a2a421f88357053ad4bdddfdb59dfab04ff0ef6bb65e678a0e8d28842609a", - "7914e6c3b2895baa5a3ce39b3f97db02e045c4e707160127008bb1aa1a304623", - "de855b3cdf27a7f29659dd3b9d1fc98a25226f1016b2a2336b619b32b105d5bd", - "05ee7c8bd0411af9e4f8c5a528846f8fd92b0343cb53c8e3fac0457007a561c6", - "45fc090f767d2a43a3143bcafd6a2ee3f8d50ccb29779fae8916733ebbdb892f", - "b00ded782a98b393c7b59a789fd61ba0d4ce7191d45361d85886a1675a552564", - "7810bd926cf21b2cfb08179bd715b960e3e55772b72dfb7e26bcb43e11848cff", - "0bbb5a2a42e91cd9209e94293ddf1470c762022eaf9f08937ca9b5811c79569c", - "c0d01da5e09b5dda7945df10da172b8ddee5d514d9bbd78825c0c8dc1915b2c3", - "c11626e40349fd92697b2de7230b287ac842a1749bea8849863bfe627be7a905", - "ddfd3df6c666ebe9c86ba78cdbe4328fa458e3f8aba7d93e40d4d9a579ffc673", - "69c3f13a50fc83b6d109f7449cb54514d599c7b6c517ed82718f60ade32d89f6", - "3b265a8b474911c14fba06868ef033ad737eeee5277328bc107f9a439e937b8e", - "d8dbe6ccfdf5d05afcffa946720323d412c5eac95520d5da288095a1db8ae958", - "14f0caddda478b28ebe901466648ddaf611eab0542b526670f955ef9c695d99d", - "9c45be0b462803efdae8978fc5272707e5b3b818f929a28e6b0e6b7f695f838e", - "3b4c7d422ad7839a3c8f086dd75541670905f763fe42dca6a25fe8332ea09790", - "a8c3df142b0b5c2967eaaa1abee01314d7ad263e739a39a6ad01014b60cb0f5d", - "ffe5bb1b6ffab960532ab4818df79756edd7fe3d9dc54656aadd6daf6288a4ab", - "4425dd742b322adb0f963969f4ca597bda580f6ac425fbf3b2e90588458f4155", - "21aa07549a92aa661c2e8d73957be811465d5c9384532917e2bc8707162060ae", - "9d975a32bf70270ce07e91b1e74bd5b75206952dccd05461b3b9cfabfad8a29a", - "776fdb0ee8a74931bc8c95fb1a1bad29c578dba6b8c8709e40cb0d844e3f69df", - "f742725d8917a7c29e786fd18e96f11bd7694c4d71e984b16e6ebf61a600d5bb", - "78255924e5494adbd57841b888c76784f286a66d61e68648b88b92d3ce960dd4", - "87d057e369e09c0a21207a367004204e7a3cd44744fc6cbf9d29ea6021ea1394", - "4c196778483fbefe48eda4a00a2128b4d96aa4d89ef6abbd1aae716de8109991", - "00414e7228260842f23d04f039ab9d769137b609e4012a87637c100eb3cc2957", - "d59ea7bbcce2954560c26ef9cbe5e4b9e070befb9ae48ee87cdbf862119fb2f5", - "75869ecbdf76f3fd904975feae5cf48fbd4fc5989d7ec5fa209c540d93773fbd", - "55edd212cc04c7c43ee16533928ad09d9efd56bd5d4cdcf7f38f497a337e2f53", - "f734022237454666915d0e49ffbde478f5908ead8d06ed5e7a4e7f5adde564cd", - "5bb2061f2e7934dc237899fb99b8cba32f6faf3a3d57e359e329d06ec8fa5c29", - "5400de69c60bb987e7959634e8a68ba5b732693d24afdabd5ca2adec0e88680a", - "f8572b4d0c3ee8d4d5f8a3be5d0e62f91b99f380f669558de5436435b25dbb1a", - "4af1c982823aa116abbd176a4115f3ff9116feb0c64853f36784164462a7cb55", - "d599de9e36c05cb64967ec287a9777333e1ad76bf55c56cfaffd33d9ce2f5e64", - "6efc9d0cf2a39a0a8d00f9ee3b75a7c460a8e8a843ee7d99b9443dceb3638525", - "b4167cc36a293145d82d001800bd23488450d16fb33a071b8558fa4326410398", - "f09e47e072f7ae80c705863cac8716d76204909551287f40004ccf9438e6c2f5", - "c3d5b6a1a5fd4bd440f0b80df5df97ed17971dd81be229f314b1af9ee977f183", - "5879d486b4adfb9cd1d39b45bd1cbcc24083d70758ec1b1d8d7e4947bd1f140a", - "4387ed810887adb333631645597d666e415aaed40c30118fecc7b4cf9b9fe332", - "3d7be83a6dbc3eb747e636ee24006ba65466799150f19137f5d6087d4e523a0c", - "a30249c3f1b0143bc3fb594a1124f7e5b730681b9ca01a7ee2bc4907ee557d03", - "fe60c722d338af756243d6fa599f8022df20611bf0a8b4e8a55779b2426212fe", - "0f97d3b797981e5bddff9b17d9b36df52be08c9b77d3acaafd2917406b3e426c", - "73043f9b0a8c8ef8325a4b1ae4cd679264950ddc7bff124c0559000d8f81763c", - "168b2db05744dccf3f4b89b831cc37993b35df9679f59ac03d8c3e9caecea238", - "909c08068e9e25dd532105535cac5ff07df6215ea1b867b5bc9370638a322d2b", - "b89f951c4847d4ab9c6876e6f9f4766181ae36c6063824006c82e563c2d79856", - "22b1cf72b2cb0550ad8ef3c77f5d5c438c83d8894fd720e3db53f51cc108481a", - "4a30579c9f78284b48d41aad332cfec3895dc44bb37220465d39e2c4c20685c6", - "abe0e9008ddcc470805b5bbb746e3140f3a91fb6691d1ebe25dac956a9f43de9", - "d1359b84691725014d1e8596042230cf92c79df972ba3ee3c77a82eb629a78a5", - "48dc7bcca279aa429fcfc839c22f8a4ff50ed8d910d05118ddd2385c8b4b0107", - "5dfe798461e76416ae41b3f0602d9c20ef97b384de436b7ba55a835b60ed8bcf", - "8b8e0001a72e2c93d99e4a3174bed7bd6930be272e81432a9d9f9f1bd2825b53", - "7a5fde0b4dabc22cb9def8e3eb873d43da2188861cf0d83ac374664408c7d73f", - "70ab805a61ce5e0b2f310471c88bb2d91b77168fa21c88c163408b9e0a3e2b20", - "2db48b6acdfb53f6a492bd3d67e3a6496cce641b3dd6dd22df51f15a71b5a33c", - "c05d41eac4ee64d640bed5c98cf81ad954b6741b7c45e5ff3409366696cbe49c", - "2615c3c24ae0cfb73430a2786a3a4daae819b06dd737f37b7e0f29766a27540d", - "a1ead8ae8edb6848e57eacf2705ada10f64a2aad312e33c30e1f4cfaf3226c20", - "b89d147ee6ce140aa37475040714b396009aebd350f4838116e5696cd8c14d52", - "0451dc22ab2763a4405da2bf7df92bf7309413623b6fc8be95d9f95f2dd7f9a7", - "f94607a5a46825e0380d69c205dd0e3064882ae98a33747eaf2f800d5a856efe", - "7428b22cf1eead40bf4409447d56aaabcf18e08b49a0459d3bda568c7e4ef9b8", - "f6c23044ee7597191762a2a0ac389e0102de45fb14802780ee8ea53a7ced542f", - "0174665e24ef34d254c11971c9f7df6bb8a3055db610e59439533d2638041f8c", - "aadc1d9fbfbdd0fae891ae023b6a0f5e70bacc3aeba8df341d2decf23d243378", - "eb3a18ced52ec8509b2441bb7fb17aa5b298c102fdc54cfc7b6ef7db678b8615", - "dc1e05d0b9e1acbb604e68db6dbab5115a2dd9b7483643c941a895ebe0541f07", - "e8bb954228f460636e9aa1455d213203344ff3363176a29cf7f9e6e6dacf5e7f", - "8836f3b472f434c085ee4c8bd9bd0acf914d8470a8a964925d46603f0cc4b95c", - "7753ece695078c100848dde7f489ec03039462213828976df6668af3f07cdda2", - "1077dfdf5cccd7515224f406f983e4358e0ea18118a86fadccd906421e8225a4", - "20717c8b5f6f1f08e9c70cc2573771aa8d97106263ecfc7f25f523ab8cfeaacb", - "cb619b25634c49693cb62117a55d7dc9617ea5f438c9bcd3f17b2a56bd394c15", - "3f873fb12f3682ee4944e846b9f2b20d3bc960a7d749500751e2bcec9fc0255e", - "ab4357b18a3e5506f03a91fded1e911a923c650ce0227e08850fa16e7e4529d3", - "5a9e86dee0425facd5c0ee33a4476faf28cbb9cdb1a497ce8b187dafbd8f464c", - "31f61ffc66b42dfdf72a2b530a93a0d3f482d927f081c732fbef75feb6d4b428", - "e9fbe141da7f48cd91e4f4490fe88821118406009ce6da62f238aa47316f9f9f", - "4283d6857b0fde33f8537f0d2c6cbefa1d74b5df969d0bf14a6b9069cbc8b747", - "c3cf90dc79f6b07c2de2d239139ce1a12fb67dae1b9cda6e43fc03fdd9124cbe", - "3fac85a49ad63e40738e2e45f6a01f4110369a80e6e3dbc89f799a143bf8a887", - "c14340aff7c9b6e513728ca851fb95ae6c892940ba831de8b0bf66f6bfcc4295", - "ecf0a6a3df3d84b7930c800a0fc7313f5bfee1b5a3b7456a68c7e2ec95e0edd9", - "b739417bf8c35e4d5ad699fdeeb04134e8436e3b4a21e97d2210a84430a6fc72", - "0e2ed235b39aa5edec85e0b3ec5a4b4be66eb963ad9a3a8a9b3cd0d729231cd7", - "0fccf83264470bf34c6b35ac4fdf4420fea5044b926eb7a480f8232475a499b5", - "9e711447d7c7515584c7ff145f3c7360807ac642af51ab39738f6690314b561d", - "6bb450c819fa4cde684cfd86bcfddc73212e1125d28169aeef75c29a061192d4", - "21126c69eb11a302ec568185304a103490c59e0aa9a460087130cd570f89c366", - "2f8219cafdf00f0616561cf27b51549041b8dee3e9b7c3f64c5324c7ed1cb819", - "ac2ed322685fc5dc36deafbaf70b39e805fda55f61664e6a0937815af0139e34", - "39d8808101ca4f85c65187d4dd8535e4a9e43510ecbe5662e3faa1a5780572dd", - "693b54b24bb768370b83961b53476ab2266a48b5d95d4f5eb48af3a4946ac4d9", - "34835e629eeb0439f3a7e7e0e237633350a46162534e8ca7ae3afdf5debd81f7", - "34768279ad6d6c214a0d867d2f84832a5bc7f5dea6dcdeab3c8c4cda607666e7", - "34c90d7abe2263c0dbfc4bc3793992cafb06d50e7050f6fb0aca0484acbb6aee", - "bb024f00465c62a1fca4ef353d76762c22892ff49bf7d56bcec44f1527e51216", - "ce98046136ec4298cec77e9d5508933087216677515d42debb93216fe02a66c8", - "fedf87e4c206c4ccc6fd421a541ba9748c151b9ba124dbe7a55cd0e00b7ffd7a", - "4826892b0efed62371923216fb48019fc10b6fcdbfea023f72cf44fe5e5d48b0", - "4eb193a6a5da1c50174840e879fb9811aecfaf256fbb79a88e4e3763fa38c7b8", - "24a473a7dae437add456c564d61376f43ff72950de5e9810461ba5e864f6946f", - "26becb7f32222bb449a05b09ce156bc8816791a9d845e7aa20c2e14c0720c978", - "6714c14067c73dc0b7dbaca968ecb9317e7bf8eb4e2d816fac3d7c11d455e3a4", - "4a4c8362a38fe39e852cdc4b2b1f11c6316210a07e9ca65c9b75398ee980e15a", - "720cf6780d3c372710c40900cd8ff430eb81f07b891f8f4407ba1960f66f7bdf", - "d021affc5feeac15b4cb7dd2ba54a103c508964ea89f236c6778a13e1d800898", - "fa65577207298ab63f4dc0251f0cee684f400418676473b1e2c5085dc5b85634", - "1c23f1d6afdf9de07971ba4d0466e432b098f420b28daa42803978baa3c8be96", - "695c0ac09dac4c7d9c957ffd7797bbb43700a9b79411a3d7b549f5f25547f9bc", - "e64e06446ba86b1c8050ed1e1f6b62a1d00227790b193d0e978d45185dc90856", - "28a6d839b1581d26cbbbb35b7d2ac514fcb7ee7fa050e4066c0c757566858b66", - "9c1c7af5e14be4b6823a79d9a102febf23a4af29c72916d9cececd73c91c6739", - "a42ae772fc02a5242495af8bb61485cdd85de36d623bc317c9f4f8e70721a574", - "51fc75659cd2ed68af42901b04efe194b3a0be360c9888136ae35ad47af01c2d", - "4fd846ccc90735a16e29160d3d94454ad951d2ca04bb40beb9a760401d13d05b", - "64134b65b342c983206d8f9b128a1f0f4399752ad2d52f1c9fd855d8d53e2741", - "7d01c0dfad3cbe883f8ece53dae55aeeb144d50a879e794bc6adab0fe353b5fa", - "300d3722951bb840651c8fa3a569f3f13f3ebc5bb0640b132e404865a06683cd", - "2dd702d8be28385c5123b51121aad1b9c634251019d59419f979e9e3aac6030e", - "ca5ed25a75fb56c3a1d980b322bf79d60d645b019872a9e08997cdaa6f01816e", - "1290bdeca90cc95d166879f6f03871762487681a62618e087dde0dc7b60b10ac", - "aa877e8de2c2fc523e2b9437a2bc435e4d865ea6c4672d167e5c98bb1609aa59", - "d5f13815d713d949c7543700ccb6fb2938eb31cae6c1ea987105404bca02034f", - "7f4932eebf8bf0a5a63d508eac0dda83428d0bee1516cc25a761ac0337940a3a", - "72b5907d14b0901f56dfca93662924b48c6850fc3724cdba02217cb1ec757c48", - "6da32e5e00ce504d019a1129971e1ed022ca759072532015dea36071bb815b85", - "6ad59dd8fa7d9b1dd942bd84764e7bf44c8c34635c9e859f31433cd04122c647", - "e383c1f16977f1201965017b13bc01d9e55b15db05dff7ff6ab586bfdf3f2e0a", - "e5c7e3c19bc69f7df5295b30cb9e23679e029156328a29ffb49c6354b4db9863", - "5d604da644f7f5f5476568fe2b075dab7e2e1fbdeda280c88c7a4bc9ee09ad8a", - "54afa81e18b7e011ee05af825410f0c7342154de727a4f603b3ab4e13d873180", - "797be7901844081d1e1e3db5086453f87b77e471e19e106b3c1f17432484a49f", - "56687afab08cd1aaf6b2f6c5ca0aa5849e387b9b1e69d85bf272ecedf592eaf5", - "0f5e3edbc64dec1ba6bc5e08a07b5997dd5d063dd7f10f37952119de4455a47c", - "b760835ac5689cc1ff1a2d157fca2aea32e37a03db29418100dcc26292af2ac0", - "c1a87b5164b80f17cfd6b4b748ff3f2201451a1a3579ac93f162cf3d0ade6e53", - "67e5cc7299af4e8fea4a10013054df968afa3d15184f64e4703a81f86034ff10", - "39eff4083ebf978a52761e147bd97a1b9882250dd25c9c4989711a0894c8bd25", - "b834a9eb605f1d447ef41320a8f9d8c05aa836d91ef09d099052ad4e249001e6", - "a6737deb773720c93f3dab54eb683603ae01ffcb40b934270ec56d68a241abf8", - "4dd0e33a4be93f554389d0473a262bc70e16e1b19c03fdb4b0576a179d7261d8", - "1768de83fde8804604349317702b7dd09728e8839b809471c341067604648a70", - "b6c9331390113471c58e83a7f4b640a6276624414feeaee90519faadf5198b6c", - "ca9654672a50ac991e7a247a8538c92aa700e493a597532f5387dbfe649dc435", - "43dff270b9d74243f879e5eff4c19742287d88e58be7c852a925ca132e2e7543", - "2f33e5a0ca47e519fb904188c3156220a1e15dcb803d7788ef4bcc14bd366e1c", - "6be7ad883df43ddfd68844061ca94f8d59a6909175ece14deed87776680b90ed", - "b10539c7637a52bc332c3e5187aa220f0ea0b7184bec1aa6c7487f7de4777be7", - "f5b812e7fbd67b698cb0572c83d40a04ed78ed04975b8a14767ee28829a17c08", - "0fc5eb4b9c39861ce6f226f08dee28c2c62069f1eba299937cceea3744035c71", - "7559faa04aeb285ba303b3209978b035070d72f13a44a9b83a6b4476fe375cfc", - "589d37882ea2e55702ac76ed0a95f95838016b9f152c4caaea45de4e27d1c60a", - "15f39e1a2e85d73df72e73507d15ee166fa43aa5a9dbab7c11afccf42b518387", - "39f0c4c88b018895a01151cd675d1171c311b6902b4a0980e7fcbd9ffa2255f8", - "360c0876a26a7ad54ec5948d5e373a525deed547df78280e806cfb4a90525a58", - "af18cbae2541854850742429c8641622c9e40ef454f0f9fd8de2c35fe350eb81", - "29e580a4502dc3b362b9d4be750fce933b389248a9aedcdbd82cb8757732d82a", - "788da7348951d5219c89b2b0ac6e290e255159979dc211997314b768200c5357", - "24041db502a5121905c8ce2329f1222ee4e705622ecaae6fdac945faae162f19", - "8e62e63857bcf36386a9a6a9ddd4689054cedc16c1b9ad0993ba027b225f1d8d", - "dec307bcc373d18079f66ac21b2002575db71e2d2b4eb0e6bd9d71f91d31e16a", - "76f8f76280eed82cb8eaa38f136922a52e8e13a64cd1b34a92a9e35645385153", - "d734581d29f387c644b390de5086066b579ff74c694288b9da2c49b2f7188fc1", - "7c8a4952642a0a267028e0a43504a39f2410c237a91044597cffb237645d67c6", - "5593305bd5db393fe312e5813ebe8c511c8e7893d1c44297d300428244a23ca5", - "70102c6a6de4f237d0642ababcb0fad42b2897f0c92400a81e78138927431cff", - "36666b0584fc5cb7900a647ef511346db5390ce6c55e0b114241b393265be518", - "b5a5a6491c29a71c7fd4b541502963e020bf4285d55e0476e1854fa2f30a20e1", - "cf10062e9ffae8fb61627014af1c7a07a394b58d348c0c4c0d4ba29c34a6b58f", - "9b7220b1044ed4301af47af7e0d3413233622ee356272efa916fc5a75f855111", - "d6d7b0202b1a08bbbaaa57fd7ce4521e799ed6d0c1da64fcc87f4b750705a732", - "7690d91cb52a169422891c2389005ef325f44729ae763fd195b137bbc3fe9745", - "0852189fdf286d3bbf4968dc28cee3d18a5d34de8448e6cd64203b13a1dceaf3", - "37705f5980fc645a5bf19e2c3ca60d55642614cc2db28762f5737ac4f2090f7e", - "cc746233743ef2c99db61a8a1040bb6f5a35eebd87d822ca41f9d0fa046d1a60", - "6f6a52897e2febe4b38fa4a192dd0fcc46f64a7500ef76a677d931f6750ac441", - "5c82772e7e318e9b757e525b74eb1bb5ad085d6bd9209affe7ba5f2b63152cd9", - "b3f7c22bbccf01461924ecb67b9e073bfbdd9b5f84c34861cb7c182efcf7d4f0", - "0666d56020382122999cab9e9ac1f0d16745ae11c1271431bd4a345baa562960", - "e0235b422d6dbdd5b665bacd7f945a06708dce294b4fbd5b7c429ff07fbdd054", - "c3d63d15f27fcebedb9cdb7ec0455730051dd141da1c7a199cf01a553227de29", - "63ac343fd526b912062898ce2479c81bf24cf382d570cf8444c549d6b9b5072b", - "a6e700022bd84c0293eaa84a33b9ca0f7e35a0683a970fed8fd9478b3963ccad", - "7bd2ac9c013c959d50e75836cf6f937ffea16df9d88fd083078469e36bfd6421", - "b5b878c87549af1a5112a4df684afae262e1762278a6d78e4affe9720b75c54d", - "180334aa036d84d1fb75fc35fd458fb8584276968c4373e9cde5eac8ed0b6c3b", - "952b0fd15d75b96fb552c22d4504c7f070fec0feabc70df778e65e8fa69615b6", - "81ae60c77230e5a4a7ca6dc9dc5a7726609b2c4e7d0c3e80bb64ab6b63c2760f", - "ea2623efe8fbc62d0140cbfc8894752ec201b7b2f2586aa1f0ecba35b37d5e30", - "982e55a02836c6d5ec5a993404c2939952c0c3e489c0f58e54853cc65a6e12f6", - "e7b89d0f2513cafb4dd606cb955b0f620ab44c5b3957bf4f9c387dab14e3c948", - "cac92b531c4de11a1e240514ab7f928ca7302e1a406012722a0ea5d8ed5d5207", - "df4174e5259ef9fd3faa7d7c5389f886094d340a2a9e1519b0c42395e7a10d15", - "858581be9774b657f71e561fa88a7d1bd790b94ea31f663c5ad2f3c156b6029d", - "15f3c4f028c11cc11f210582d3d9a48afe08368105b063129162b168c0e0d650", - "88878b2c4d97feaaa11c4cd596779d51b5bc1d072cd5be7a373868b6c49aedee", - "4af4231b98b7819b90853ae18f428f35f7569a6b501fc318e1376ded0bc7f4ac", - "269a720732c38c8fd4f714c3e5a34896be46878a88cdb1a88aa0719a12b559b2", - "7d081a72d6b5bb72434060ceed69b32fce1b9c43618d853e070e977ac71dc4c4", - "7d71757944cc7dfa13d41d2dccf67207d12b8f9c0815c7757ed27ad12695f8e0", - "8bc6e146918a1de8d58444f8eadd808a7150d14fd7b14dbbe8ecc18c85e34f65", - "2db485b456b5ffa9dd13f97e99531295f8de2165569dacf5e77c72aa5c4959ec", - "4a327e5710c3e03ad5404f3ebc934e9cdc487bb833625e7489b84ea1dfd2aeb4", - "6575bf1423e175b1783c71517cce1054901c81f74d5d84b7b8b19c5da348d574", - "01480bfd6272bc9d6baec7d479271f9c167cb99988bfa542d6c8624a913a2959", - "1e738fbf88315964e7027f535e3fedbb0545c4b72b343dc92cb3071a424b1867", - "b56e4e8859b72857f52434e34e44f45a40e8fd6c2f17becba20f02c3b8ff452c", - "af23bfc1f4080ccf314854c7b8112e68b6bb80ae7d974fb448cb7ecb5a4fa3ea", - "853c6b80c5c631a40b39372df9f72bfe9b00b5cab5712816b350125fc6fa60d8", - "a46c97b2a42147b1a79eeb096470af0aa67b245899450e1ca4aec1bae2ee3218", - "00f75831f118b517bca421ce2199a59d8138dd40dd6aecd2eafbce06fc63ab41", - "b8b4a847de866f8a4c2fd5de7ffb8dc94ebc21e7ec402eb102796e08f087b8ae", - "fea8e0005bb619654b01931cfdbe6becf7a5d3b843fbcc7913c9375fe224c2e1", - "63004c54c30da11c22c0dff5b9645c1251eb9825ca8f1ec617e60de01dc8ac4e", - "5ce95d53b9de12300a71fea3815c1da7af7564755bb2c5d2c993eb2f7bf3ac73", - "c3d11be20d6c7f2f9b862aeaded95b0bd884a4df3c309acb0aa895c32bf747b7", - "a233a129bbae9491e72ec46bcb9712399d7823a40e8f55278753b033b1c885e2", - "afa26e4481591129246a0cd27a13c397d97b443f244f0991860d255ca8cc9292", - "1b9ecbd2dc533fff0b5617bae126d1839b77d87850670698b5ddc3ec6f157bab", - "db5f335ee3030300f64b071907ce0ad98f6cd623954c113bd9e65ae7f9a4b49a", - "710838783d83f32b82bf98e6ece34fdc237a4c3f3a494286c9ee3b031ecb1d38", - "e763d7b44042b8d947bf3ff4949926e6ba65245ea02bb7d3f5a57b4ad599b423", - "96c03fc2825b583e21c35930e7fc22a7ad6626d2ed9150ee89cb7f6e12251204", - "114ca1cdfd8d3e6a735e5c2f844d21a0924d355a5ef32e6aa5eae8c61e43a3d1", - "3586a1c44f968278745d08118da11eb06370c467f2b23fa27008a8c0d91f6364", - "b9086e1eefb7eb59b378f0e27a6a003785c2f292096e27462da701e0882c61d2", - "7cc7726f1dd493c85d81142fd96cdc1511466a666f0ecfde979ffcac13fb79a5", - "b902712122c2dc3a5761cbe985478076ec972c70ca90d1cfa307c30a16371fb7", - "f22eddb830c8c450fd9cfba8873fa138b560aa2593a52fa8d4c333ebcf517366", - "34e96956bae2679812685cc6860aba79d18a4580c5cf92f38f0d4fdc7b38b296", - "b720587645fb570515c8fc4b72e17b7758477ac369372702a10ff1bd61c5da61", - "60828291c4770084fd94c0e04e787015bd3f00d8fd34ab57ea805096be6ef944", - "36161938ff69bdadc98374657ba5b4c0d59575542f7b85bdf9632c6eef808086", - "b425c4cfe852b50307c21b21746822ae7e72767bf19571411b90ea17a6d75ccb", - "45e9f283fedafef8bae4b6ab5c1c6ce9acdd0b91d04a72a5a19799085555ec15", - "ec1839292258c5d86e3808bcb9af4b43c3784ea9f6a545de06e4b927879dc785", - "35da57c18dab259cfd38228c7ea38a9c764010730d2bd064fd7d5f517463f029", - "683e0400b53797d0d824a1ead897fe4c547557f01baf3e18002c139a92e33113", - "c718008294b66cc9e4bb2d53d4ef9f4951f5e7dcf2f42eef4235430b69df6183", - "d1e5952248a37dccd5f33db5d340940d2941bd436d1a19742fd097c266d52c43", - "ebb1664af8b0d1683e1de169f348ad0540d0c914045fd01b026a9bff83a25934", - "dd9b9aece80768ae90dcc51ad588ad66e07fd75c7f592fb41e924d266a060028", - "0f2bbd38f9adca2fbff179bee71638c28ddf63dce2c8be3301253a5271df0b6f", - "0719af34364b2565c4bb53b4747c7f8f8498f04d9749646b248492866d089561", - "6d351ac3f5638f08086a35d0640ab5fd5b4008927667fdaea5d93c1d28934adc", - "67a2c178f7fc13b8ca4baca90bff7dd9dbb22c1b3625159814e326c08d0cffb5", - "d126af76939908bb4d9caac25065798749a0241044a63d1b24e51b5f83f4b340", - "4a64efbb53997c72c10b353178d11110cf9d009d79c88bc1ef6146d70f2d0fee", - "d4b41722a7c5701c7ed65ee02f8573f85efefb2153af264d2fcac595431b1f73", - "f249d1fcde3e86cae12b9d9ea2bc518188f3b93f2a7f66fcc1da5a002de85805", - "22be6e7e5fedf8f5af045e336c513b5f4218217d4159d0839d41bef2b79e0b84", - "50fb48b21d602a72f2824eb44d9229c76c881a48761f84422ea1a81055358aac", - "7becd6860c19e4212b1ac1945bd840d230ee009abd57d980601da34c8fd340dc", - "4da224e12b4eb792f008964c0176c34a030946dd8265ae0d53f6ba6599e5095e", - "fe67307391d3810083070711b2f03eb43c2addb8ccb0c15aa90ef4ae1a20c0fa", - "ef0558d83458bea83801b1acb505c536adffb6d9c109a40265b7e338ef757518", - "63cadb0192616cb581aa89a2ce7b866850d8594b2ee29d0ef4f870a968ede881", - "efc10f304248db032a17d9eeb6280ac79b98a4f0f3d6ba42e72d89c2bdfcaa73", - "e0f8bf63fb0264c8a0e77357b4f3ae344916b8bab731b7144edefdd36fbae114", - "e79d52c46e239eb022206899b0463fa62295bb6e6b7bec12a4fd3e5c084d744a", - "093720ef84254b51240efbe1f7fd8b06c1ed81e33ab777eef8dba3363cd34129", - "90f5f6eb887e4a93ee3de9ae797e9dd1e7df9aa2931f6c44679951667c03cb9d", - "f01d30546d4264c4772474ae3b1553d87971cab16dfac39c75dbe871e34fa76f", - "f294bd4e6050ae376faf1bbc4d49815dda270ababadf729cfdfaa2b10a4b9f63", - "6bb28a0c813429c61ebdb079bf74cc7fc10ade5dd1488bcc0617a84525cfc971", - "0d7cf0cb6ab586688952872e74c3ecb0abc38277b130a3245bf0dff4b92bb8e7", - "83e586b38cc90aeb574ebc0ea86cad536e8b36c4c23e9ed06f1630f241e2363e", - "56dced464ff012cea5ce045e335fb72c025d389d7a51594e7d793be6878fc77a", - "34b959cf53cf8474adbe15f06cf4e907b1221e486028770fc2c2cef1a7d2b11b", - "074ae66bd3480a46eb38461a300f07f20e38bce63e6efaf0a284be965665846e", - "9d61d192dbcd33ef5f27c1e77a0209a5c2fd6e8498c638a37521657e5f2da8b7", - "27453c1bb7d054a4ec1e285b44a3ccbb74256efa2ffabc87d61dc9a070987a6b", - "f0d3aa703d608854c47f9d3075de1cee219c9c8020e7d00466f410d8a5dcf0d3", - "eaa97f5d9314672a18ab6be85cbee97e9049455f94bc217a7202ee2ffadac316", - "c876a52ced3a10eb85c4b702ed300761722fb55874c5533323bf57fe766deca5", - "962b2500b561dab7cb90599cf8fe6a873d8db95b9f87924eacd6c34281092e5c", - "706ee9bc7e3714e6573f870b83342cc00f3e3a90c44073c6e9710b0f04ec2499", - "3be5b6fa8ff0b7941211abdc5d849c8947744c5943476504825208f1902ea149", - "8522f897b35d38711adcf6e5a92639bb23203d3ffee7414fd6a74e7b5177794f", - "831b70efcdc35b6144fb07d7c74e0156fe05a81e1ab152a00bad58cf7736a5cb", - "24a4a11483641b935308cb6ebc7dfc51c7f2dab99e4d262093e6c140c50bf107", - "8a3cc2b6c15cfaa7ca54912f7eacf17289074bbe214246fa93ee3600bfbc6b90", - "479fe1aad55fd8471aff268aa663b458e4b7de43b701b02f6662b41f1b5dcbd0", - "d7d35b5c0319996ba1b326918e692e926b1c21e5587af7f04820b7dbd727fc9f", - "121af9e8410eceeb67e240bc8bca04550259daa247d809347f80c134a22c0269", - "ba9fb853e8e287847abec125e98e6327c55af4f2693d4883506a975581d9dd3c", - "3c7695c121f69f00609d4f6ef4df0e4eed569ec8db27f232bc1e07fdf01b72bc", - "71270408b6f85ef30deda39096b2eefadafdc42412dc75be51a5af127941d69a", - "97c6188104aae60394275779f65bcd444ff2b779a8994c0da1bf57e9d95a4078", - "bfba1e0613d41f6fd6cef9aaba770c2223afa503d19fc71632282c1202544a78", - "78952f19cf9d59caffa531202bcb8a3a02aa83ff8f037764a77b495cd4cbb7d5", - "2282878297f7d31e2c2d9f88886c44640430894465a66fd8fafb3aeff49c4e06", - "9e148ed475f17699aa36e265e011428ebbfdd7162c544168d6ca8829339bfcc7", - "b6ac64a734567134ea424884fb957913b6114395551bc18a2efdc960fc0fa3d6", - "c1e48326df7e512b908688fc6e5f24c57230f0b7c36c80a35b5886bb3018a635", - "5430cee8aa40796508c3901047df7fdaf4e128036ad2e12042f80c25b6ce2fe6", - "063e2f65a3c8cf059a5e05b3e1fdc64dad455ffdabcc69433f5e2fda6b083d1e", - "987779042f2c39e8831ac8fdd32c807e9f3edc32410fa7293ada818525ed9f55", - "33ff66951b73320e3c584e7aa7ea3c947aba5952810d58dad99e261d8c871119", - "6eea6317f058c6b827782de5c3aed003ce8165ce2dab4f025db1f4c4bde9915e", - "9e34b2768fe19dad790579a5d887b968834ddd383dcc0b7ab86a2178567628a1", - "8b1ae0389c6d005b2a622ac61ba0dd32e65da269418498ef8487ce154cd335c2", - "7595bc702cbef02ef91d00e690b703ea78fc09a9cc0eee71761892904b48b358", - "9345e71e8a41609273efe75390ae6e4e7f5b8ae9a0bf1a2c5f26aa24919005b2", - "80d79891268607cd005dcff626ce134ec732b5214b46103486572e6202c9de3b", - "b054c1d569557e48606ee2f924ae5f6598afa156aea7835f621f75ffadb3340a", - "e13f42f02f3f54b1bd57de457bfd9f0736a09fb9aac62d70355318149f46e4fd", - "e7f0d03a2fd1bf4d69575eb02248469766f2663dbdc7569525519fd0065d4e1b", - "479185c3984f9e0d35588d8c9c138790a86301f44a816819f238d0e444a3615d", - "54dbd8c1d9bbd2356dcf2e85d43c039f7a10211b9380a6a0312861976eac8cab", - "68fb25cce45d5ad9dc083306c661e1f98916c897ec159bdd44a9fafe4a87d496", - "5d01ecc3c34f924ab75bf8d2488c82dcb568140bff96e47975c7e63808f2172b", - "7e6d9eb7410d609ba2252f334e9cb007eb18459577c404546024f0a672ac9607", - "986e1f1249d53bb7789acc9c4c70b63c68df61cea064e8960bffcecc03879a19", - "235fb719ad3386979b6dfe279935112d425495d210184dc466c45785fb6c058a", - "6695c4661b32a9eaeef4a830e3f9eab2515b1584f85cb399e325497c0f790dc2", - "98d6070609538246cbd8ce90530ad2f3b9e63e4efe9ab09c4923f44f6ea376ba", - "fd547b0eda46f3935a2337550e826c52d86b5436236608c05788e789b2240249", - "73dff07a2ca3a660cede97d4bf2e91a65748632eb9fcf23ad8d5a277b66ba4a2", - "7064100b9a31d56b33834aa48ea1c98770dd52378996b5edcad5f0879b068ec8", - "d9b4040c2e675be7f4c9d065c7868182fd4980e63f5552dde76b0bdd56204136", - "66db26140f7c7e07a873cdfe6f5d8756dc41a9fac8271be5541bf0917a2f10ca", - "9783568e6ef76aea9b3f9ce062553d4aced2c9ffc71930b9a4ba9cf3f0fe5d51", - "9faf53791e95ff00efdef24d2daa96c1e219c8964c80bc1318d69f01d1a46912", - "eb46464ce082391be9e56d7ea272ce4ae4f8ea74cd85523c3c114d508bac38ee", - "12e2f2878ae7f98ba7c75ba035554a3e8b580deda86529fc6e616f685b9a458f", - "1ab8d01383d394445615084579fdcca40d9c6e03991fbbc684f8dea974c37284", - "830f2fbeb2fe3194fcd73b8670cfb8917e30802d8caf2aeb73ea38cfac30242b", - "5adec0af265134d86c7b26ef7acd24f3bf8e8f05a8e00454b4716b5da54250d9", - "cb47808b84a4a07c2f3d1516f4075abf0bf1dc2dd5bf56a0e3433e5d4a01c4c5", - "0c233c06d880d8b4aab662bdc3acb9bc823f68ac21249dda5aef92d3acab7655", - "5f4261d662d053ebaf8f34272dfafeef5c21f92959b6ed3a2221f1f3b2d7e52f", - "01e25a669c5c1dc70b0fa36aca6659b46f8ecf971fd29819c44ff49966fd3e20", - "954f08b5ec0d26a9f0d4a55295d2c0ca8469ba39dae05d86738d22227e3270eb", - "ec227a140f17a18b19edb9048ab7e2cfb9e3ef5fd06adc75a2c0ddb5d15ea917", - "5beba35c2a25c8726d4cf5071344ae1b5ec0b1dab70d5a41afb8979cdbce5765", - "dd2b93fb9fe6fb99abaa4edf1828903c5031eedcf3fd182c9b0c748d413bfdcc", - "bd95012888e663949e786bb0fc893e264aceca9caa65a62bdef55df2d16b5180", - "8c17da66dcafe8c79ba1244d77ef7262fe098cb78a1ffb6ea370ff5e0f78b546", - "17f1ee53e6a06c214f98cfeec2f9132fd558da7dd0a76ed9c95329f844ec8986", - "b882eba31839dabb83e6376fc080450e0783e307955b0a66ec61773577dd40a6", - "d5fd151d9aeb7611b72a3683ccb387c0cc7c84802346a8e267b14ae85cec26ea", - "0d79cbae87f752db33bdfaca353f0858937551eefd85dcfe928936179eae2355", - "4215d498fe8bc454dfb771941d72f39352577e8e2d9d69d096b7d504d95e4bb7", - "9e69ff2c38959492383f992b615ecebc25942d1e81d839b33fa1ca918e5474c7", - "0cd7bdd8c5d8ffee1d50f38399668def1d033107f6a6616b5742033902909bb7", - "ec671fcdec6089c8554e62030abb1cd846d4cc803b7b1257d66eb20c03c1c58c", - "451ce419341a93803e10410d63d25b9ee3c8baafeaa25785e915bb6fccef0cdb", - "cc92b79cdb7ef42af3dace85d121cf57f81f81731facedf1a9c8c7d57308f771", - "aaaf98c30cde1615a9fe32bda22353eb5b797406ec6f3301141b0f9c3fcf1e1a", - "5fe7fb8e9a3a364ac269ad4470e59e76b8d4f916a6d3cf5b30d2612cec3e607b", - "83de178916f3107813e09f6fd529d3c30248f54f7d50de25f3609bbc8d814d12", - "e00bf538f25ea2fda6ff6329d386d2b79ca5a8b251280c56e1d0d2198723e39c", - "6d904da712db408ada8b17a2d3c2bd0d28a1f27025d427b042d3ff4cdcaa1810", - "e836a8c1f697b59b6093ec22f8a8539d9cf12762d228075c6bc3a9fef82997cd", - "6de4a65b46b454390fceead24860dbdd5969ffbf47f4d9124d1c93dcb347364e", - "fb10696d0014fca1fd923003e5d02f51a06c873622420c8adf71c8788da4a5b4", - "6eff2754d5c217fecab5e5162750967addb21bb1133949a2d87055c90fb2c651", - "1901c46d6a891d829e8ccbc243c234da41cdaa2f7ca016aaffbfe59c7400fd8e", - "912af230b895f238f079f5bc67fdf79896fc9755cb81acd0436d43a8275b79d5", - "2a4411e153102f14059c262a5d52ed0b3360366bde7d8f4da8b5e3d3e67dc415", - "6f2425542cfcb86b4a59baf7931636ef9ce701c050e976732e72d845dc4b8e28", - "97441e342e0b1fb213876b6926a62ad5c7a4d06a29b7b0c8b3eee0093b94c8c5", - "3ea77f6d07aafa1e5bc51eda2cbd75b20d600432b0477755b4a9907f1d688e36", - "8066925445f76f1f85446cb1602926ea08dce60186fc731d520e66591f695f33", - "1e540e81e3f520268dd579dfb839cfa2378581ef7800c6c9615371c7c85cbd76", - "a03c37931c32cccdae4bb5da2f8812df77b925fb78332f19f9265c5a3feb3b69", - "fcb67fe8b25dfeeac687cbcab20a3cc1e8c82eb2c12e4051bad290c0e1e39551", - "0d1897c35857d63aa8750b259959355d7a4785d7a09af587a1a4555eb33b521b", - "bc41513a8081c71f2b3158e2c7e27343bf93c0177676ba85a30564d78aef35b3", - "79d308508df64ded3a2d7a31a83ec3ce70fa16313173856cb821390ad2172a06", - "5d32fc56306f98d2bb69dc6e9d44b6f20dad3e4630a899ce34b76071539d21c9", - "fd5151521366f05eab5e9880a3bda7a4adebf662d22109bb56b344ff6c438557", - "17c22aae7071a1dabfd1a579b2bee6da3ff238259488f0f8290ae0b93ff8a72b", - "68a30618b93772b10855638a52afab750c7b2f8a6989b95cc8e83635787dbb3e", - "a099f148ab76b26ef8331f63b179e7a3b094910bf44032af7ff7e4aafbc16206", - "f21add5df7c7780e730ef1694c20eba8cb060442c9eeccbd08d9b8350fc826d0", - "36cfa9f3d22e713dc09b17e6b06c44cffbb59505d03ce724a2d673079df3eaf0", - "0b0799ae7e8cb9557406aa413137b1b98c4fa613e7e5251b9109b5b646dfea03", - "965cf44969aa4c56dabcf251d876f5e5695fa165e86ae5ce5af2fb9744cb1979", - "70346f5abbdaa6392ce9608f1188369a409177f8118748c3db5ae6c2c22849c9", - "dfb92425b3a0496bb83866cceff803e5da315ecd58b4ccae4494171eb5d5d9f9", - "4d6c15f73aad51e3bd04de98017b105baa27b0ef711376f0924b7d55ce6a9f78", - "897f83652cdc8cca94a9e91c591edd1e209f2791c3736f6b5b255fb89e58adfa", - "21558ff98ebdb2e0993dd1041f0bb1dc13d510513b54b7d13ea240cb4636ad1e", - "da4bbf16a6fe709cf1cfbd8856bdb594d53921c4b68c748c726e64709cac1be2", - "72901107aecc0c449ae4b977baa692cbbbeb3fce9a6ce8d794dd6e11d1b2b54a", - "3fb4d762d5fd11a078f7d469463e4c443992bab1fc20d34efe7941b05ac4feb6", - "da60cc8153b1959079cd14259634015f05bc7a07c3979ca0d60ffa055f428dee", - "050da320dc1596c5f00988dac7cebb537b4ed53f36093ec2f61f0e7e0f80ae24", - "dd35d5013ae5e71fd78b8525eebf5fcc2281b924fdb9eb017356b08280c6b955", - "4c35c0733c5f56d2c872306dce6197b96f2eeaa588ec81c5b563f907c1182956", - "9d0599afbcfff68ea3302063b9fcc6d34c83b9e7a0a358b5084b0e475b71dc17", - "0c8981f0c8aa980b0c5bb6a746d9e77e578a21f3163a3a3c02c533cb85b11d74", - "755f87ac2f044ce437de45983b77a315da20556e00035d826d9760d950e19e02", - "d71c9a969e2323c95f9743d1d13f80e3a64d0f07711d5eac2a2169f576cdaf6e", - "db65b1e6609e1885ad38ff18fbf6e8e669c2c645ced108c8422b14df2dc73570", - "2efce997ffd39639de5bdcae99babab94e65ed45e2a93a053e127d48e284f4c5", - "f668973b3831634032fd21c0c93a3eb65efa431092fc61e04118f6a02a3cf534", - "71a81bca008c55e6c0e6e48a360a815bfdf798b20a0038d7a2b9a5d75061b73f", - "1b9a70a5364f2a5495d709e03e24d7d850e5feadccc234aaff195cefed852f8d", - "aee5bb4df938c6167143278c9b8e4145845877041bb5283cb8f5748d50ddb40e", - "efa4e7fd5e9885f842b1b4341ff95ec2f37b0bd4315ebeb099caf4b3b5729be2", - "36fa9da8c1ae468a56fd2ee9d20ce5c15ec1bdc4760ebbfb084353798326a8d7", - "37b299fa5222d70b5b3b6790b95a8ae9a56222c4bcf043ce6ccce2f2749ffc7d", - "2407c85876d5c30f4eff768d96a6c7e1bbde3bdef76f731e2c3daca6abfe4585", - "9939f71db25c7bf80efe0d39f1bd389f44af23b74df93b9c9671145bdd11f2d1", - "21643137466fa4252cbaf86fe9641dbf4cdf8092a3a106ade785ef6d998615b8", - "c030e2dae42124cbfb55b6722e0c19dc36be3ccba332b8e70a7801a048daea22", - "fa1543eb4b8b0a09345fb54e9d0ca628444ad47c49e6824fe809e78921602378", - "f4a435404df5a4ed27443e5c76a09d823a3180663d5c82e4d62cef717f1c9db8", - "5dfb030a1cf2ddef3596f71c70018cfaf981549cfb26aa4b894973f8c90cadde", - "2ff8d53f994cb4c9656b58cc544ead090c2947f1ebd16cbee9b427ab3fb079d1", - "bb3854d46ea941fc96bde46bf75a218574b23870bc7584ca53b50f6da41b21fe", - "32a0c5f8863c263eb49b0a913a4e3e3121dd472301e5664c0fac31f93a5710e2", - "f9332a50260efa44efdbb91cc4880dc6d0a56c8cae491d164aa931c141d517cc", - "ca3d077c94ce2f8f65d74419e155c890217a04b78beff6cd6114b34f23f4c1fa", - "77b749a36e03504476b58321e116ca999b6a8d44f5478940930514a8ffb58d88", - "7c17cb20ffd256fed28f653352c04b3c363c400cd173729aa0d380e43b105041", - "cf83a0ef082d46c9ecfce8dd1ef36fe433f85758dc2ca19e7a6cb60bc809bd2e", - "c178e1402658fb1c6390cf29ee461843446872d0ec1215a0654832d4b7290776", - "af7bf687cc7616aee464a4dc61ccdaf4029192036336fa10b9a089e62a6495d5", - "58b9ddd8295be4dad60a44872cab7535f2ddcd784ea73a3a450b6344d2a359fc", - "aba531800f92b2c1813715dd88472779037c8820223d249d5e2ec584a0312bd0", - "7d3de0d68185c3f0d3a58bc544e66a7f298c8bac674e0f1d3c4f8840872811e8", - "1a9936cd5a9008296373e71fe2a00253b1e29800163d0734ee49f315d85356ea", - "f643682dc103bf3ccc95a4c3226e0c75969850c46d90b8d2417de1b1320c895e", - "fd19b08e9b0fab270cfb7ea490b1af6b0683316127f60ac75d6d9af71f44a119", - "b7a2036e1bf84dfee889f96ad4677dd9cb5b9756d6afe719b0dcece8ce46dffd", - "7677cb58d71ccb0c31327e38529b3e15590efb41e91237e1809bf0408e70a4e0", - "3838b45453e945c56053b24fcb85cb5e2c88f136f8261a69caeba0a6689eaeee", - "bd2cc48d1fc11cb7f96ad5fbb8c04a96c1000f344bf06df33aef2f53258ccabd", - "7c6de91cde1894746847f195fc8846d413fe4e493aaad592065fcdb5c6d813ea", - "dc9143576227d1aa94cd9c8249761344ec0fe246d38ac63cb0975608f23290ee", - "85b7118e4b02e57a50bd569249e06369bf7092ad060faadb5fde43c230f848a3", - "e21dd71af1d50f17727aaa1d29e48c0c2cbf0f41bcd3e72134fd9ffc9a7dc1d9", - "af0761af69a8860d37bb48fd1b3f8228985bcc381bdd54df6296cdebcc8a382a", - "9edf447632b98836de166bfc79a8ef1d3880eb1952ddd46ca2fa04fe333d23da", - "eace021b8e9c40262d31237401fad7e01d0cf025cc5ea70fecdccf5861442fb6", - "eccb9a8aa95c3a9b0f5aebaab769b675e074015c1acfddcf237996fc2b564dae", - "f04c5c70581971ee0c84696198c338651ad2618e4092caa4658660cd5ce3c45c", - "d11ef21e92a9678fc23b85fb89347046cfded4be9873c1ea5b2b309d331467cc", - "3f41cfd1559973adb5211cb8299564574e52e1be3dbbbf5ffdbeeb2cf3f92d1c", - "2953b0ec60c13f846cdaef4b16853a5060e92b97fdcd60adc2e593251ce788c1", - "f4a42ea585d1b59f6745055257bf656fc3d5b6b6b3bd71224c7672372280d212", - "9c15e8de8bfd8e629dcd482cfd5f1b522dac30198f297aefe31196e5bda51a78", - "6490b2f49073b50420da150668e8386064276fb8fabff1c3cb051f9afda4ebd2", - "1b63237b68a4f26c465dbc1343c8b33ac8be459980463f83ce28aab41d50f50e", - "388f34dd94b899f65bbd23006ee93d61434a2f2a57053c9870466d8e142960e3", - "a1c7a2c5bdebbe8e831721ee9b61db0795fb1c8143304f1abb59d9919713712d", - "36970ec6899a1a2bb0ee11d78de4e8260045bf98eca81a80c314109f1c0e94a5", - "b282c6285a9d753951217f1b5ac5292b918d668d1350bf3a4a3d9760c4918451", - "972b4f0277fa43c781adfadb7e9666145e6d269708c54b3d411796b1f78a6b03", - "5120588bd15c6248ea78a83b6ff06c2a07385807bf6e1bc48cc1663069a793b8", - "fb636224a02ce5c6dad41b7a990e8133f8a446c91c100b49cc044fe1621344e5", - "fa8c70ab000eccecb58eadded7c432484b192672e7cae6a935347ed066360a2a", - "3a072f7dbf05488266ac465e6fabd35ba3c19586f4ac47f779735d98dd3e5eaa", - "3b1adfafe65d07595fb21daec672fac3a3616bf1d829f243c2da9974a7870c57", - "5547c99510df974880c63abc8b7f2eb3a96829a1877acc49fe8690b98f0a3fbb", - "70410e72ea5c9c96cab92b898599ec910bd7bafa01c549292d9850a669561426", - "72fb3a233c36234479bfb45759698ba0738b01b8fa4dc09c82ddcf516b0d291e", - "c22c31f11f064be0eaa02aa90434384328112ce5fc3b2dcb4a7ae52da80983e2", - "2a96b7954c971380f7ca708cd034b6fd320c6427591342edac8e956ac91c70b5", - "4bb4d42d0ad961883ce4209153114d6fe9c5926212490891ed94586d95781c53", - "716fa3f305f16afc548949ec07b57224fff9c5e8a9bb99c1f453d35943913469", - "f0a588d6599494cc2c0917e5cd3295199d5529d2d3921c3043b261cd3224483f", - "ed8141c234f7d0125c38bfae757b00904e3217392545b48b22d3fd56b61c2a2f", - "447922a30c6794fe2c3ab5c7fbb7cfa2fba56d369924e685cd80b0298ed3938e", - "2d98b5a5fd33d73a00179c574a6bae77581bc43df6ee2b215b23d5cb65afe860", - "42c99e0e69f758baabf17811ea3fc5b632a86283edbd48d97f468f19351c3033", - "1ce4c9630ac59b1f1bf8b57441c40309baceddd4ed8b393e8eddd9f8a7a862f4", - "5a3b33e16309e08e19f6a123db3e901e4e557be283b0c80c1ea19777ed03b117", - "27b20e266af5fa2bd1d4f02305fbb77d4802c046312c2c765bb11c1cea8cca66", - "6455636d2c00358525d66a780379517c8f18d057c4f56b99f2618727e0a85ac3", - "9923d6d3817961dceeccff280edc3bbb00bc8556e5f961b754c3e10307faa2c9", - "85dd439da699dd4eb9ad9b1b5ec2785984788f6753572f878b05f65716d32a08", - "94d2185b0aaac4aba0fcd129dfa9b06d88bb932245e598df8d58bad807e89766", - "9c6cb64e24d84680eda00696d529f57a24f2b84aac9e813484015481d6b3fa4b", - "3b5cbd2b5e50b460cb52f0593959a481877b063ce2b5196acff5731b357cfd35", - "064f064ba274b28ff299e9c983b46299740e558204de4810bbca6ad8b72c7f5b", - "b36142310fb3c0ffb9e46b9da396cbe90d33cae36225fb44a3d614b3fa9e3f38", - "d3456875c2377beb20dba937b86509645512379ded7cfbf7135596987baeb33f", - "c40b9103f3d5d87404a21eb224c7105a2308515436dd060a76b7018e2344a4c6", - "f063f09f6f6301393c1d036de3ea8b33e76e03684470b8dd1ebbd0d636631fe5", - "eef04ffb47f37486297e305344259746eb5163c9bfbd3add818595f594277e1e", - "359583d24b3371f63b67b172018f551190f487c713176359338dd1fa74f0033c", - "1dcbc185e11bd7b7a9bcc2c81a90b04881169e35e191ef4194d3e34a0b19f686", - "979d1faebbbcd59e5f9527c6c8b9a2a6bd04a755a5e20259172eb2ca3659432e", - "6b0018a1383d799420e9b14fdabfc0f358234e3cf47d40fc172e4792425b4c33", - "5f06bbbc7386f11441529cdb358a3b9d76ab1bf0a1640263c65997f2653519f0", - "264511bc8c5f2f6bae92a35f181224ced660f9556150f979a386ede7e7f2f9b0", - "02e37234a7e601f0df20092c392fbf29c08591e32f8ccb31beb679be240293e6", - "95729d1f8972c9af1012fb32006fc0a75a1c90793c2c728ab5d5a54c46c04010", - "e4a34c469835bc01fa3364692e795f33a0262102bfcde3c52740298d96ee834d", - "0c1d6b8fe96f7f011d766a756269cd8a4cf4a86be5bb2bcde26100deffb3b59e", - "e268450ff29ffb92b11d629cd07f76286507055e7d27db9805eec8c90474d31d", - "673f4a5dcb51506476fd7f63db12a8de5855287d2b3b701be6e487ec5ca61c89", - "feb75f5625fb6bee44806fadf16f55c404323f7f9ceeb9e12f87182b4c6fabe2", - "05c1798dab49ac6a754fd9bd7bf43412d6658ea48e1dfd71b6921572e434b1b7", - "69e3e171195d6af4bf33214cb9f257740b0b8532b1c8f47d5db6c74cda4c14ea", - "1dc2eeaaf8a5d1ab47cd154dcaad825e626146492222e08d58fafe039c7e996d", - "537a1e7ec30e8cc5cee63dfae3acfd249c762ea6ebd3eee0f74f10571b50a9e7", - "069982ab1fc677650e5f59c0b6c1fded0031aa3baaf394290167d94656b26159", - "ebf50e18790f91106e9bf109c587039b0761d95fb54318d59a99ec547485ac4d", - "e84acc985437e0c9743ff25fb174a396cbffa7f2fbdacdb9553a18f138e0b46f", - "03d62140d8fab4f76263e8986e9457b4252e99e5f46ff6147c9f44a712ae4aef", - "90f9fa5e7deb9bfac2b55bd0131784e77c69e02451997b85afbe3dcfb1a700db", - "ab554ed36f7388ea323fdd8194c527408eab23a56fd5918e59c7aabbd1761a5c", - "eb5f25a946f327c1fc0f6c77c4b22b77a88c62c89b5358c6a564cf4f1af00425", - "d37761a1cfc0a8d29951384a3b89d19e30e24e608d8a06f0b02c9be0d513bb03", - "8fc14e6d5b0657a5217c2ef258b48e9252f3e301cbc5af72f5172eba4b5f9f86", - "207a77a0d82276c33e6a4c6d40056aa9e804735445f4a92ff36a1e49f64d10d2", - "215fa3d35ccdf33064fc93f0ae09b160645ac23dc196b2cf66c32515db7e9dde", - "15ac9b737e69ec26a69b7a51c1c1064466683db613de695b926a03e6e4e9e803", - "17fc0586ebda9bafcaf56b0333322057de5e8c83d09927130dd5c257416c4d66", - "f8c4094f82d44153d5164da8583e007dcd6acc3097781af26b79d00f61d9b03c", - "76d4f296c95c77df56e883238793ac4735de54f60fbbb4d826fe4811c9243101", - "791c8e1eec98e7377dff6561c074565c6838f8b9f9808444136a6e006412da5e", - "d2d01c81b44f4351a4933334651447cf5fefc3318c1f10908ec02769c93d26d8", - "580fcd5fa13bbefc9623dbfaa3ae4afad1a77f8fcc91fdce62d43878fb1a491d", - "ce34599fd5f4f101768b85569d7f6f937e0330318f1985b2afb9d23336aab029", - "b1a533d88d806994c8d83bdad527fbaf62663f9858ab9e967f7b5c4ea18b07c6", - "caaa4bdda09708ff896ec630cf7099908d683cd0a5b57d0de90d701aef9758cd", - "21dce543c5111e77f3dda7c5c25fa899cd2f76c521449a211c3cc46affc4a118", - "2bc38734f6514b326c7abd095feb0fdbd54e0ca5ccebdffee101f055fab12a8e", - "783098af0127f5667f8b87e4eb3a178957a3439d82ff31ffd4ee9b7e30145dd3", - "55ea5912dbcea84e531fea48ff0fd1d07d1b7cf6008a68d10e49afc8fad0df59", - "804c771edd08ecbde7cca2375405d111d92467492dd2f289e5e57a8bb861b4e2", - "bc25315a478ed0500fb4ca15ad47cb8c86b085edd92d7d6f233be7b1e71535da", - "9620de2972720398bdf82de7a70990b58b4785d0e9a48a66cdbaf0639a65b46a", - "9d051a1376dee97ecd8e5ac50db8af30cb3cc18c27e0a08cecc0ff5b6d77bb3d", - "465f741235affa0a0f7beabf0dd55858f6c81beb4606f989a0ed388a4646c5fd", - "a51940ef7b4dda0fad081c8b3e856f9aa45345e50f5222af31f452f6152ad900", - "8e77fb5cf9224f6eb7aa48880512c9633813de2d49d7841703b6cc9493d636ae", - "dda9810653b9b44cf11bb76416f64822660d609dfd4fb00cb48f589b5222d181", - "c7b44bff7c075806a8c81bedfcdd3d1fb57f7c97cb04710cfed20da74acc2a51", - "6e2be2cd8096d5d96849c4e59dbe29739a1d1970aaa718093232ede3b6415b03", - "b9b00fa7ac45071add22a61748131d9d0f09a24f65302368f3c003f994cdfc0f", - "e578b752284099d5da4fbedbc74a5f9ca907ba5cf0db5e385b504009066dc7ad", - "4f40c28718aa0479ce5ef973a50a26b76bca7848db74fae1ff49c7eee03251eb", - "c0fe44470c07f9349da2dce458dd85ad4fcb4c34268002d3fb37f8258df3a061", - "abc3baadf1b81c6132f02dfbc86bbad99327fb1500adb0ca004a56cfa6b8e019", - "dfce5b21847578ec803531d243b1bcb22ed06dd64ce035585b20ab011e8f989d", - "cb1f26966e823de75aa822ee0747703df1a3c83c72c540d6d0b9452d7e68d5ef", - "56e80c58a74eb54c0b72741f4b05268de528c4b99e9fc63a8232a7b3ad9b4ce6", - "ba15c21aacb89fb31eb7728e5b60c4d27af43437e4438351de51f031b6f98cc3", - "4c7866bd3cd35a6a3cc32771c2a40b6b1ec0627ecca43fb86909827b545f2d14", - "3fb51a294d187182401777510e4a013552822191c0df6b2cde942c775adb9eda", - "696f5839a2d8fabf9dd6560892cc3969423038cb30920580ed0cc4df6e0187b8", - "5d40733f79202e159215244ec96448ad4a13aefea43e8e50cc97137ec7a717b4", - "d61f63d19cedc7115bb11b45946a50ea3a4f3f0107ec2340a0c4558969ffcaab", - "6a05dbd1714405f13aa8c1455de9b074444feb9fcc549addc4b6efd21994d2ad", - "45f6da2bde91871bb8fa520d9af8843bb993f8a25f9b63f72312ce0567a50f47", - "5673fc1c2e1558e9cfbdf7bd81fff3b4948bcbdc24e533e8fe376077e4732bc3", - "e8f1fa2c4f17a1ba47e832a5a612d3c252a388ca7eb318eb67b136550dcbdb36", - "cc2456aac04c0b13367fc525964946c7356b47df2a72559ab2e480be2100007d", - "b6a5a8f83442272bc942973eed300d6c051e387658c31b24cd0579c5f5cc13f5", - "ee79bc286bbec36491da4df79385dd2944e3c449bf5a0b5d4bbed6f34fd82340", - "1802922dc6eaec72660e8b9749a6efb995eae0c48c85197b75a66893112620a2", - "82de81142a330713d56a59b3507f36c6b3cc3347b30100926781fca9b2c31947", - "3989c37eec7b0136a7b1b6f5678f597846aa142942e103eea1b75a9c55220c18", - "391fe5b0a9535b8e13f7ed3e7386f287bc1cff4de2243770e4274f8ed309abfd", - "b85dc910fa869cd2279745e2f427f013b63147492e76551357e30135d01458c8", - "4fbb575cd5ec816b1f4c568e310ae831449b114739e628657030432b1cb45b7a", - "e749029eb3a085c1a194ff41c5cdf257f6906996440d0980d19a5ccb3b7b5d1d", - "c647eaa0f0eaf5e8dd5565b31c49cdb01ae2903cfc5122eb35ca5ffaf818ddb2", - "9599da59bca406bfdeb8ba5e35e343804089ba9bc40a5c6326b553c822fca772", - "70544ad3e52e66a289b9d8c6486ae32121923f0623fa80c984f400231d04aa66", - "a7995559795e19027c50b32dd2f3cee216f19bb7593a6d23fcad7814bfa237c0", - "ee71c67ae00c3b39764595426124b400c1741b2939f81f4a83a7a6d0960566bb", - "f0ce89d2371c01e39025e5a33669e6057e4f368e7eecf0b98fd0a4a984dc649c", - "61d83754b689dfff50aff124ad53ea5b5b55abcc47f235db5e0186eac79d6fac", - "d9a16053e86f59883d832d6ca05a1ab36c0d4d5af44f35e4b5af0ec849ef4b00", - "eff3516dbaca3491a5b80144c7b57a377df45f0a745440e462518c856e0ad5fa", - "80a480b84f5dfc3a5c103249a5739ec44b50a203d5b3031e7d315843bb10ff9f", - "d9bc53e1a8a47305e066d8d0b1c1b480bfc86e26ca6f928072ce30c55f32b09f", - "0b1e55cf68f171ba6d1594c8207815ea28ba04d78eb0f2fb7802a7fb192f7042", - "95be96e4d611184ae4b6a9baa37b444307a1c2a5f5cd3a94ff91da1b6a480790", - "e436f04f3f9ef7f07f920f0f8f32cf2c150656ee506908c889566dea045cbc54", - "aeca988e85dbdba798a51f3d727f2f67abaeefc5bd0a452b5da6c7dd0d7d506d", - "c47e453aa5784142c060280f98a6ce9555669728c7677e7b8777e86bb2b0b4e2", - "484b1649ea91520cbd58f2d6d5161492e46d1fe83cc0d1112d6cc61bebd40f8e", - "318406cc0620ba5cf58f26278ca7b29bde132e0ca90a637c994af6fbd7d81538", - "db04b2776fcf5e3207cd63aa50dd7fa8c1e38683bfc12ea1d0e2dbee172f4b83", - "47aa5557c9dd9c441111e3a4ab3930e7546a8d9d8ad61892c7acaf6f0d35ed3d", - "33c07f6509c3d4d7660411c180bad7d3052403af1165dd8d2b693f1df68493d8", - "8bd4a24457c073217b116ffd095d527a490c5c85ff9bb809505700fa297b7b30", - "4c91c8b9757980d0373e9a76f6db43d7347ca811e562daedd6fa015bba76c5d0", - "acf4942f1ecee1ba3b65a405dfc931452ca48b94029ee9698497be2438f238ee", - "aadb4537ae7e4a16ddc9a9f3166a06c5f9630a3287258f4de886c2a7625802c9", - "31315ed671eeb5b2bdae84754ac5c028f2fa8bce56b4c000b5db454af13f4153", - "ed9149de1b80368f6723f43ecafa55931da639ba6b92a3ca2661b05548a71584", - "142bcb6546510073b9e1b0e4692b19529eaae8eab7f912f672c3ded046c9bb77", - "6a32fbb493b85642c1d2f63856ae99d49b0d0b92d7cc2b69e8996eefd052f13a", - "b3d3506f83de82223b19779baa062ed625dd0989bc280408a8fb2d836a9218aa", - "e4be3dfdce2918d326051ac5c745df9a597367cfb1ae92868a4a641609577e42", - "305f2e012f09436318ef490543f5a195050546eb17e2a662a4faa792b7416510", - "cf264aedf1d7b1da698718760ae633b59f5b3d8c80f50dba7a4f3c89b3a23df6", - "a2f738a29d8591f54ac27657ac8244858864d6c27c207f6ca3d2009661bb0618", - "fbcc49884d3ec76cb5dfb566e151fcd0329f1274c7a9d731ef4dc144bef17cd3", - "0d3ff3d751a30ed1adb7baae78f3cfc429a213a970a4c2d7bcfe8acc50b11385", - "6a9b121a8ab17c6114b9373ea2d4f1151d4bde7113e1ee2f9bfb518fb81e969e", - "616402ac0e767d89f348daf3ce6f91faa288ae43809e55269fe295c5adf71224", - "b22c25a7b37c54041bd220b3c5c0a599dd1d6f9d4264df0fff84b5a656489d01", - "30a4e15b411fc3bbcc4feb3333cf4add9d9728e7cf83497bce02792ef5dac0ba", - "4a92830d1c188990d6740f92c697f649dacc6f4d48f4b46bbffc799488ac4a7d", - "e1ae03dcc8ce0d11f8a0edcbd6cf11360380470c2637cfb1be7bffb1a00cdb3b", - "8bc3f86eabc4e9f639b345c2ceffeb47b39e848dc2a3728272fb698e861814c5", - "da946ff0843230bd4455d7b02133b42aa85fc80f9a98f5f0071f541c9258829a", - "f7555d1ced9dcd13a422479724d42abf9ac59ffed563c2502eafecd558066121", - "9da4173e98a0fe32dad8d129ea83e4e775fc4b2e8cd531c6c6ce5a406e3a98a2", - "a9625117e04fe75187b220673175a13c4f2a9e957b0ed6618fcb6291d543933d", - "120491ed5aae638e43b5a88fb58a60f6af2da3b3237e5312475f1d78462e9dca", - "2e0e82c6dca0aea438890aa383f3b5bcac43e487e0ca590a7b8f081d0651ec99", - "12c1b1e49154d4e0a4e8004693fbc417a47db0035df376edb32659eb8a85f109", - "46921a04e0bb85f4463d7e6a1b67e5c22e5fcc77c24ed65a13e4b3ae7f575468", - "08e96512a6762a017ff847ac4eabe9a80ed1e8147a37205dda734c6570958935", - "b9b01fa160cbaf395dcfe923d34203b129c53963dd80b57c6fe1f745fbfa1ce1", - "f98bb7a19ea4aaaa65304ce01fa47d3c2cb10dd6daaf312e9d160012091b463d", - "6aec30815998a9d7ed241bfd247e916571b5984a8f307d2e519cfb88e6a2cdb3", - "e3dfb9bae73fe445aaf9b7369fe33e5a9fc1a855a33652544dd622569b965ed1", - "24ef39a0aa46d6cb19db8e9b81af4bf076b3a0d5084aef31ecdc8742587c96d3", - "15fa4fc7df1192cde1952a8612deb859015ef46db9a558cd1792be979eea4cc7", - "91c849d5602707bbd2097d6f2c0593769aa4cd5bc35b4356611e41e25749fed6", - "a77bb3dfa0e4521bd444694bbd0839b9b026251a975bb0f7c283f635632a9886", - "a682937d6827f42b1dfbcf285db1f56dee5f99f29e202a7d4aa1d35760e7f0de", - "eb8dc0b8b822d7391a205b8042b50d6c574157524b1ae147aceae8a21c429695", - "1fd0c538539782b4a391e5fc59c4151e58aa1ed127f12cfcdba469f800943145", - "eb202f876e59c0c07cef8a271f774571c5caf8cdcb325cd50a5c1deb70c6fb48", - "20f2dbff7acb410d1fcdab613fa96b16df2f92a47d4247283c9e0f973a4a7136", - "f97cd7c32efc1851b37a0a194122c9a7c940343a439b5da10e1444e44b718f3b", - "3e8cb7965d4528199baf80dab9e0be4430d811f370339240f32677f5ac9de073", - "3b914904c275192cdae1d39482154786bafdb352da5c12dcbc7511dea774a5d2", - "a178d64e3f95832b92443c97bb9f771eea484223b48a4b4a5e061126ab312ef7", - "8e959a13f8ea125d4bc1c15087886a23a79ed89dad1abd7b8a9055d5a5719a03", - "35d16f997ab953d50c7f47a921f87a614fd1e2eaec1fee93c7bc7f53e2c689f7", - "b177845ba5f167b5bbde8e128c63695b537ad5e88e6988fa9406740a18884535", - "b6bfd239d1262cef0ddca31571497f927d442cf06b170776945878538700348d", - "8e40c489e68f91a165475f6edc5a8558700f35fc49a98966d7b6fc4fc963102b", - "4e2eb655dbf863c56e43f8b415f8e7e5d1d6611fed4dbb63436fbe2eaa55dc2d", - "ffb0efa0cc5c7864a40fa263f4d271c36a865dd58c0dce8ce96179232034530b", - "bcb90ce17106bddd40b27f04ab5ce2ee31d03eb2eaad685de7ad31b5f0ff11c7", - "3464ee3a7781629d0e969966c3dd7d7883f7eb04b54d5f60ab95b7d07d6ff1e3", - "8d9d81f66fe76e5ebb86a3355b26a0200b47e388ecbe9267226d41c9032cc63d", - "161985ded7c3b43deeb3e8f1428f905e83ffec87d71446afc84471ef9fee218b", - "f9d575270a94addddfce45f583425a8a9bc65af274915204e9a730714bf96eca", - "c1659ce8df4cbfc84db81a106fc8c76fbf3901fa789a9386cb073b2339898956", - "e678bd7aaccc6690a67af7510fefd73cecd98e8105adc783d965830a0bbaaf83", - "043452842f3df1a4a3d6ca7887c53f2581104a006213b87e06ecb38e51e8034b", - "beeb6b055c923d0f7722b5db7b20ce2f20f8a3f8b0f41843ec2461f83a405316", - "a2b1adc9e9bebeda3cd5af938535e765ab3db6955abc727667837f059b92629c", - "ead00a4dd534b86118a419b4a0be91299b72ff4ed8f2c584e128348820dd08cf", - "cbfd03a5089dac410c55da11f4622026a272f1f2008227355f77fbd4caff4f98", - "887e9c31a243c6691719cd305ddb13568a5e6934a804a2eec0745fce96d51d6a", - "5e07152ebe6ff1649f5ef29e42f9b85b7db045cfac2ac8471e0224ccd2d46585", - "46ae7a6c343050f485d2040a2d57179bee7ecfed3983852f7ea5536b7669a6da", - "15b8a265ee4e375563291157a403d7e8a7cf41a46f351279399cc38ed275e7ce", - "c850e3986a45e053e767e7be401e0097a84624d4c57ef7b3a4e96234dbe1b721", - "d668b66248a4cc86ad18e408d3aa2354738c34b6fce743672ff40841f5627e7c", - "62bf6bcb6858787ff34c5ee4a56272498aed92e91ec5f5a227520929251fadbc", - "aa7a0c55b799b1dfedd2b7c816c9a58c4f1f9fc35889e9f6db72e0ba8a8135cb", - "7487a5876910dba6294fff2e35825407e11c6dcd94938c12235ad3a826d30e38", - "136d3e9a5361868c5e4e185b5505eac23bd61c2e37eb608291b2061cfb17f87a", - "4eb5c4384786a49add7ecc1d7e1c193689dcc0ef022a528662f6cf8bd939d6ce", - "3ffe5d43a81f1f5e5fd749a23e377b029454011498d6ce55dbe1c3c137daeb3e", - "3805b0f3ce20fdbcc82daadabf1315888c118c0b6859fac83d0a0c467e50dc36", - "a78b6cb42e1fdce83064b1e988a1d3b0db0b6c8eb69da95c18064aa33b861fd0", - "625303a1bc82a8f93691113938ef378ddf06dac6792e4d94c2850cd4c0359195", - "86941da11460b8345f5eabfeff8d6ca8120965e5f166dd420b3b62b3f0654202", - "c06e8c009b38a6617675ff43b6abd1a9210eba1a7642077ba034cf5f2b7c354e", - "a3eb5f5c4a2441c8ddb9bdc91e471755cdc71a67bd56559749dd181b08749806", - "a3779b1102140b6831f33ed710fbfc276bf1c1f063a7b4013aa73bcc6a6f0b7d", - "a2b23f64ff1fa90a8d96a78310ff5d4c5237cfff16dcd3a09bc234f5f148f8f2", - "22791304c2565bd7dac7e3c6445b37ae92a65723c032af45181cfe20e427a206", - "b396dd796c5c46145b13e6d30eb4012e75d3be11f2f2dede0f1ed72bece29ee4", - "ebc265333d7b50c2076e1aca5ad78e642928900923b88ff3f7271b55327b28e4", - "795b532f286a5302cf9af5fe285277d2b359512a061fba0c87e873417f7c141a", - "819a45752f1a4fe28eeed8a19e64c64d1515641ddac3df5077d70951ecfe79e0", - "7f92aa13bf8a9f5ac41115b0296cc5017355b23765c2bb55588089415483ccf1", - "8b4783b4333dc2d1f832ad38692387be33e12d0b250c076c5d5cfa2d51c566f8", - "6b4a2fe7841717944289dc61385a7ebbbc39651d28a5da2ec3ed28f2d2f322ca", - "d46ae4add7a363333726af92d3758cdea06afc3947e284464b5406f3134cbba0", - "d4a657dca778b38df789f078eb40eea927ef6bfa20b14c3cb6ad43a1d92df011", - "8656b9aab0b8872addf9938f2e37cfbf0143fa31fc8d4f9cd70cbb4fa48cece9", - "f185b470891e19a8194790643c04d811342264f9b8778314393217a20d2d4265", - "da2512a4a42d19c26a99620dc1463f2f7b3cbf8c4a96177bc895178b42196ec1", - "89001e4731cbc84379c6538cb443c7bbc1e930646bced300c09404365eb73c35", - "8eac0bd14c7f45034bbe05bdf8d018e49960584e61db60ebdf002b96e11010fa", - "27a614d659d61139c7ffc1332e0b5493c5d3f42fc06df6e9c8accde8da895833", - "bf94562395720adf278fb284a8763188a39a1dd71bedea1d86919e5b69e93c01", - "6e522e8810eb4d6583e6b8906dd3ee977edfa4fb197b87c3e37a74dd7feb7c04", - "9ad4786d0b8b5be944687d6d2938f7185bd36bb5ef54f8258dd12ac23ff8a41b", - "7c9178de863ba60281d2148390a63f5c9d89f7a31a7a9d2cd1bfb6b1e8be9382", - "2108f3d6d105b2d783bca24c9babea6dc682b35eeeea12e0ac87f9961d913dd8", - "0e5c483439ebccbc18cfa6ec41dd80d90ea5e87edcb2c0cbe7112fa59f589733", - "e4de9e1016c62c9e5f05271dbb353826650c6e40d0d2c1264bb590ce41c97204", - "2a0ddf700b49f08042e878439b0c81b3a0d4bc819d40a343e95f0db564fdacef", - "d6267ff19cbbd1d81e992a88c286e8a446ef037d1764286f9329ea76f7ed1d6d", - "a81489bdfa978f7e9bfc012e3cd285e590509fc9dc2436a1550cd2cc3ead1e55", - "7ac599fc389f49909e44a88376b809b688e08714bf7071863d46317e4d3c5bb4", - "181d0509c99b60a527df7ea78525cc1699fb3b8ac4622905eff96d6c115a8c11", - "96d099227b45083bbfff22c09ed80bfdf95e5c0784c0f9b7939b3e75fba73a66", - "39cbb5a77b3b9703e7a2b2d26201f5084ad7d45b72e456cbd9d8c2e1727e768e", - "7ca6339b9b692feb0ec6ec35749226a9a687e3be7d5397b2ce907e31d1d727ad", - "14ff41603e92937ebfd5a7be5dc9f8c6f6da22b1f82463932368a6bd5f75fe2c", - "fba65fb039916a0fb795822478a5e6e43bc64ed6f5d0bc09ff663b56f32acc4c", - "6ca75a7aa65e55a381b94792050427310dbde00c9f230339be4f8cad92fceae5", - "300895f8584e5fa735c78d047e266d63718dcbe16aae4cf2135f287b6439a4d0", - "8a67165e4c893da69d1b79f6d08a0ce57cbbfc608b5a669fff54f59e558d886b", - "78e167797877b431d36c063dfa4302f551af9931894542bb795cd5c737f5fd52", - "5491e8f0aa4238ba82704958b34d65ace2e616f64b4b115c0e3fe1280fd5aca5", - "d3d7c354d22be5b7faa160350963efae1b4c65ab2ef509f605cf9a48210a8110", - "c009a96bdb0da6e23788b7e4f6adfaa8d7a0902b7724fba2cf8bb5f867f8c33e", - "89dd4b171e6d554d4758cdb48851b84a0564feb9eb3e6c355f0589504fa34cb2", - "be6be4eb1392d83dd031dcf5fe96f97ab97ea9df9ca69a08cd874be6e6a6eacf", - "2880c934a251fd67eab92b4ccfadc381a7b386a0fdcd06d47fa363c93df53099", - "8fac6a6f319de848056206432eceeebe5456b6174caa4f4731ad12d326663396", - "a89b5e967306503e69136927894518b217f3470f4d1feb403faef86cc5c21ec3", - "ecdf643891e247496a9f3cad91e877501899c8378640e30b550d820545b7d75b", - "f5f8540d97ae070d4086af66bf191092edf2a2acccb0fd67d7017ee54a0fcc5f", - "bde184701009a3f6d7e64937493e96247e1570a3842e4c0d83c9f339eced2650", - "f5d127f177de021ce988c11d76c7f96da85a149a68248b1cd52c21b8590f34bb", - "b6d4a117631fc3c0ef856fd1338317939fe28173781062ea750d254ca13474b1", - "0e92ff7f50218237e20a4ca7eba3228cb9c9f737c70d7f05dc782262db9dfdab", - "b2c2f7d891c6755158c71561d8a79f8e7d558844b923d992f795398c5359cf64", - "52a5ab8e755ca7d6db9c1b7cb0176f540febd058802763b1db3b2a72643c2149", - "671c8181f4c4c600855bec922f3b23e21f37a2d084c7e0cb448eb889a9605352", - "83146b23655795a0fecf0cd88955938f3b72c488198f5e1869d1008e75629715", - "0e7f7b58915b99647de9a022477a93ed3205cc7f1f70a84b06c31d7e2b135c37", - "358dce34f3455ea966af6da8efb896af992c92d74f2ffc9c0fbcd495f0bf4f4d", - "41924b41b36b9df71963b990018da23109f310c743856af30a10229d8000c0ed", - "055cb95e73e942ea8e06f7203df1ea1ac96588cc9abc4c250c046034371410e5", - "05eaa612f2e3e0a0de9eeab8463c1204b95d93c717c6925f5b6b177ed34e606f", - "71860cbae888fec1557cf3eab2a42fec714b6315ebf3df881dee8d03d6a33bd0", - "620b08d21b1c5ed138dc853a0260961577c99bd5ad58ac235c41e2ea7044b63b", - "e228b73d37f568cf7c8723ad9b52f2cf433e9b72c7177ec8e79d041f547163c8", - "8a141a89cf942b8a4bcfc98f073b948290cd53966cf98766ffd47b98a8b1e33f", - "b646ed2a910bc139ac07079e7bb05621802b96e4d0a293e1d5e28726fe8e5199", - "8ebe35033ca7b4d4dfe0c759678798f5ebc303d7062881d12e763955175098d9", - "056a6fb382580257787d4a54f73ca763603731e8c21221e915850825acd95ad6", - "058c34e52bf21ab88e7347336be70ddd550dec2e832d7881e434631ff84741ee", - "628fa76b4790fe8594892c25bc67c8694a81aa862b2f2275af8c09a8690be635", - "8471787d8b98dbe1026d466f2d31dff4c702ca97adc1300d4e99c9e38f491e1a", - "03d60b49d9c3a852c43ea0fda040467b3694c98fd5dcd4138abb41c3d5e17f9b", - "2daa546bf5128ed48b1fd544bc6e3b2949582b7671bd3551caf7d8daa7eb3a43", - "1078f12923a1b7125c4417fa0103c9f3384b4598a2eeb6c9141d0106ad8dd48d", - "56b6f7363f3c9eb6bfe5fb9d098c1a84bff9b8083127d541166cd2c262d30428", - "ae441c37b9208085942de9d89b45b4ef50c2b9b0d028bf562160ce282b5eff96", - "552bdbab793e99e104dbfabcc0e509aaf42b654f2a4147033891f8c5565ecad7", - "4e8619241111f66b69c9cf0fffe0ba0d67546896b45824962e665ee801d804eb", - "0fdd547e3966706dedf7b6874a7258778b0c8f6c0b061dd9243e265b3a04840a", - "d849e28dae6b361dbdf4d9f7c5e0edae179366b431be4500969606464d23e47d", - "f2d4aa56054de4a5381790debdac482a0b113df07cc6e99f0e99daa9f7bd56dd", - "e7958d3dcf418f44cce3915d798c9f33115fac178cae5f7a537dbe6ccf83ca33", - "00b7734e7ae459f3d7295320baa057d1e090583b72d842713cae3bdad24779a7", - "a134e768670c005ddf46c66cd34840098458b275eb0a2fe8cd477786f91ca44e", - "32356314db0a89daa66169d277cf266c77131985a38e0326d4d56bb94ec926fa", - "d5292d9d48bed6ab78f32565a3611876ec17bef23e51a2b2483b0e702f996c67", - "f52bc0c33c721db10e7e69ad6888167b254338a371b32e27afa19967300e6bfd", - "857fe7d886417a71059dda71ea142dc58f861986389b6a19d436adaa22b60cb4", - "05259b2668a6dda7e945b50e3139faa2a4278d89c4bafa2f29a66ef25e823b9f", - "f2c8d404fda43903c05e38bcc57759d24a6b5e156263ade6d9ee0815c9efcef4", - "1e72d766bccf7938e861b8ba1d010f02d0e9bdd10d042625aac6b91d426a65cb", - "b1e33e8c9c79c1936d3179362d31768b549f9b173d8862857562be36ef04b6c6", - "d4a6770b73dbffca905272338e762fccba6d008e02e2a43330c5ba752fca8d8b", - "9a13f99ae3c836d9edf5a43155fdba3dd0e6ec2d60e6f223739f3982a9bab1d6", - "0bfc0dc69d214d6d0804b999d578013cc313e37d1fdd53b9766f2e25320abc23", - "f246ae01e3c3acfb69d385f566b9a583363ead5d87f28e8143043c3b18ca9b07", - "216fe80e7fe4fc97f43ab1b642f716a8bf455053a2204424a919f26b3ea39ba3", - "c5b005ac01869288715f828626729f1d71cc19ee6ee1d0b5287ce4f156cb8e63", - "8408f003af73aa7119913d0c0445fdc89b6e21971a4dc2c1502833ac262ed869", - "eac8c0d11da5da523e9944199a623da6ed1aa18a46b64450374fb817ce0cef83", - "d63e833f3f34ac70e91efc10e21d8b18d38dc3904191997c7a948f283206540f", - "09a4e450a26c3ed1b1401d8e006381226fe1e8a00b8a4f09375e6228d8c8c0a5", - "35cf73b0849797884961fc00277b597a39e25a2cbf0590b31b69eec32d8c33cc", - "ede22cf775e2a5998d7a08f287df62b2747570140430ff787bd44a373af081bb", - "1352a229181890a73440413ba594cf0ab9491aed89e2bae702a50b02b7ef71e7", - "c83acadad348d6d2ff3a8d20ca6c651289231763ddf6f316a1dd59a03884e45e", - "83bcf92c1cdc48aed589badf7cc46ebad5b9bf095de7d52b6c410e7bda5f5957", - "e063aaa594aef9f56c959b4378607dc009dbaf7afff86e7380f0faeb8a05499d", - "0cb5fccd6604bfa9359c585bae74252b5fb73d378850c6c2ad02a2324f42c1db", - "958b1af35a17ed8613cb14308b3a2d38da2a2912f2037221cf59048b30a93807", - "8b36611d2560b48ea9b652091f14c7eca6f77000c51edea8bba43f3f10e5cf08", - "df17428bca70a63365023d4cf8aaee7f6bdf2a5bfdb56f599a4cdb52d7a2d7e7", - "6391700a699f0509af4a7d690e6192010ee056d31e89ef03d8d80c53635c3600", - "c738f19dfcbd7db342cac58ad294e469af4c29148865fe2605c8642c5a37c581", - "39432ddf86578508a82425262ee581ed7202b4bca49209522fcf5612df2eb3e9", - "65921ed5f5e084adbe244d95701871f70db0f000416e4bf17d575d177871e643", - "8c01fddcf684fb2768c68c4aec01ffbddca2f77542df0593557c3c1e72d37361", - "46ea2eaa93d90c03b4df168c7904bb0be5694452c334517a0345b1a4f94a77e6", - "240bf201b50d8d6d9123f8c56e00b08d90ee56c0b2fbfd38e7f30d89bcc05269", - "f7879ee98354eeaf509d6e977e3965af3f00a94a817612c8124af56828735d0d", - "25f3f7ff68b2403e2129fc0a766d250da4dcd20592d360565c8e6ab2215a3efd", - "80641eab52afb301f21238abc65b482fe835f04b859ae689976b0a98632f5296", - "8e13ef74e16295d78d021869b98e742899e5955b3394b502b0b0388b9cfe60b6", - "9274de67e417cc86bbd6fafd340ee77288c390fca88b46d130ec12b8a901e48c", - "8cba90cecf91954e70aef15032e39a1636aaaa5c796bc00f3d6477c31f68a948", - "4c8918769ea063e99840e83b2e1d3bc7ac21b4577d17318cf7443bcb00809c27", - "3eca5e7ed90cf66edebd1c2657c24cbe9074eb2de202a95ca12368d4c54be34b", - "cb36159a5118d0deb1c1dd4918e38d66e4355a909e811e13ec430c2a91625f63", - "e7cdd36e37e4277dcb89003681d1318e72b93224324656499fc42e238a4098b3", - "9eb0a72f61bc39be8001c83c66941d31be8a8fb82a5889712f99f94ef583ee9a", - "068e6a911b03d1c5eab92f28b0c96237b6ffe2ecf05884336d4dfe20319145f3", - "46ffdc3d9bb635ed93db82397fa622aecc99b1c4ab1bc490bdced331aa2b83e2", - "3b7a9090abb609239c4af616beac506c1309c05f61c3f3f5f27364f09395427d", - "d472fc870e227e960ef1eaea987cd802c1b4facc55fb6871a6a77e6bb3de2d76", - "33c416be1e8fa4fc85338d398b9413e0d006d87aacc5ace577989507fc598e9e", - "e7c9a9dadea3558cf6a7f47e0142d0445cd17a5a8386d31e50a587f6290ec2c3", - "c8546a190da1b7e2014d1240ba48e7af2c6c68758c6993f650d212a02a2803f1", - "d58988cd6d77649524b969985e14583d365aa7390f814fd4c3e6ae07c083e380", - "34875c339fc2fe263631a2458220664d66aaea94ae396d12f8370a6fca6ea758", - "ff69deda18771a2f53b2551fe29b22f334609cac04a7324b677b141a5285f282", - "d76985b3487acd09cd01d1206834a9a14797239b0340b29d1ce87985236c0dc3", - "0eb916ad018f57deafb1115f688736cbc5718a91ad60b834aeafb4cab7e000cb", - "a5787718e1c6ad310791f505cb23827d29363105154134d0d13149812612bc96", - "dd0f855d5ca6a8d3a6e4cc0feaaf7153b68400994c646a40a672196c631f0cda", - "6f9d1acccac36cf7faf49a915158e02243d3e2fdf52f1b6cb77a3dec21adce36", - "dd828539124fd4913bfd2a45a555b08e0c9861db8c76bed464c4a42582a014a9", - "91b695bdcd44d84e61aa08897983bc7d9dd38f548a03e8af97c64d234947e38e", - "cc835bc88431ec399a6115a58cf5982b8dca115d78e394fde9902e5f91c8e293", - "126ace6e6947265ae04e79c751c6d2815d0316d9c9a21638a6848f41f9b80dfc", - "a16b04fe0a80a9aad0fb770aa9d73478da45e6d5b5d1329db60b2ae173145524", - "4414d76174c763a0a147b8d74606ccdc8dac20ab2a4636a8fe9c8ac322ce7c14", - "0b0f1e6b4beae083d5a7cf49e26f48803086fe473f39b6b56b57e2e1185c008b", - "000f7801f059e6634eaadb94db125193eb0e8e9ad4f9b57b051cf93d533abb8c", - "a999eb9a52cf8224b75e7a3f9eaedd1065169c852ea058f6b61715e6ae1a11d4", - "7cc49197f8bfdf4877cdda8305164176cd1fff3108f306f64123f3c36b7b49a7", - "b3d3668b1efe89911e65e7a415b3d1a8ae4559f5c6c9f567f38b5c0a0fc16c79", - "9700836d043a0273cff64618a4ceee9e3e2fec1a9f0d416c0e42ae71ce0e089a", - "e8afb8cad4eca2633790baedf075d2639fe07f37163938c756016116d081ad80", - "d484633c411f4bb9a631f839c3bd3eda393359355fd9a084a135927fcd91356f", - "8c5afe03ca8f0ef9bce8c3cc6f3609007a6b83e065f02a7a2e13774512a2c34e", - "1af653ce087528320f1eb7136fa05b8bf669ee9c9f19da74e31e1432c12378b0", - "3155a44aa823f44a3e40c042cb71c4225d8ac6960db4e67de5a68e40e51f58b2", - "3c730bb95557db7222522c058e1f5ce3bb4e980081fff96da05e0169330509f1", - "87d4aabce6fdec8ee30fd87ea705d8b9a4dfa717980826634d5ce87781768aed", - "9734848cc759ac57055f2cebf24faad4626758c0584209569ca5a1f5d004333d", - "05d0c4b62a65c56ffe5fd4f2622f0de69f7196abfbd8c525cd30bc6bc49e59e9", - "22ca15d384be515d5934976019bc3fc290d8b9812ed02784cacc8e0f5c19c75d", - "d181faefffca2fdbc5311e4c1a6aeb30679413fd50401dae914f2e72b4aae2a7", - "7ee2554d3b2b1909ca5c99850a94ba74204bdc62e782fb5b79e85719fbe58f2b", - "7d0bb82de9e369e88411ceba4d676f7322a8c743d453405f34787be8ff5af9a8", - "7517067a0ab8fb8dcd988ff0ffbf30b9f1aa95842aa9a686a501dc91800e74de", - "81c3daaae1c52721f8bc033322ff768083100c5b98b741f53a6d40475edb088c", - "5d18c5880c10a17af777a4a1af2a0ce732270cbaec2763b464d99de98016689f", - "df42fc8b04eb0787cfe517f88920f2432c59b49ca22c66f21f4505a2bc23cdec", - "5397099c2c6cefa4e0349f230d9ad1990f3eda4e6b93163cd9c81222744d9418", - "85dc544c881b9258801f31f02b4bad8adf705368e8c9411177826a9d3b875489", - "ac4466e853d80ddf7d8879da5ad691de1d2dcd448407846b0f52d5484ed62ff1", - "1cd9e0ee5b9539cd93941726c4eef4e3471926d2fa014393a5bde64610195544", - "8a2faec10f7b736a55b512e72a9e3198a4498c97c7576bf2ddf3200b3684807b", - "8f1d21a413ee3b7efd1e51fba42d95aa05300760e203393f98b25cc0527884a3", - "4fbc01114c2eb1ee534f2c7f03d8f8b8d2ef4281022c814450c9609bf6b8504c", - "7b0209f7882af787544bf0ad2093ef17e274aaa52865c0f13e5780200ffd6045", - "d7133abdad8ba022cf77fe61f03b513352044ffff867039aad8806a94210946f", - "cc672fbf759dc741b059bd1d9058d070526ecfc40e2a6840ca900b6c0c6a3ec3", - "a718515445669a4a97578891bd9d9230b45021fa76eb268932ec1d164b25b108", - "b0ba1b96f2312166560a5beab846076610f8d11737bf50760b39e98b404f2df1", - "98cce2756f25d64cea817d3c69c58b867842f348fc464576fad3c380d63aef20", - "79866f84f0a5f8125e78947663b408bc879d34dfb9dc297cd2c953062d5586d0", - "aa42c3bddc57fcd2cf8a4926c05a676271e9cab5440949d27d5b8083518e08f0", - "b911f4f07167e39795f2407d1d61007d44d57d7e46fa61faee0b92365fceaead", - "3b64dac551278d3b0197958fbf8bbf751a164da4ac0ddd733f0d912f0bed4254", - "6e81576d6860562bb60dfc8165ca2974d991036f933f8a390a80f2e9b1fc4685", - "ba5ff460677131ea5b57234a7003d9e15e3ba378ad8348feb47a4c5d49aa0d7e", - "c28f447d2f4a6231fec6f43031be84c7a72d6b0326291eb4a48fed2ce0655450", - "2ada963b8028e9ff837ef8b5a63f851ce3a55154c24841410555f6fc4a6866c2", - "506fc97debc3e2696c469764c3dd9a35876793b922e8066f113b234e709b0ad2", - "87eab628878449bc16a46f2308c50458a1141b0799ffb058e6f648f44df31703", - "693bbc14edb1e6afd37b717a694885d5de5279d0b440b5f3a2b6cccd681a6f93", - "35e87d71ffd5f6cbe3655415a99d24d00c5a78806ae6891ef6bd802bad939b64", - "ac6190cc82254c483d3ecaebb5de7fb199fd405a88a919a9ed5da9c1bd9b7319", - "a4f332b083b417b83883e81d32a1975704b81cf10d92ca29d56ff0d9bbbb2607", - "76d4161aafc2512fe767da3e57df02fc2c4d390157f259375db83de6346e77cc", - "cf11e987d4228e67e73fefe50ead97451b0e9657e00d23f94b323f3e1a3c90cc", - "1edae35f3ba5a022493154cb1ceeefda256097c0b4ac33f86b91eb9ce9377589", - "cb22e757e3bbbdc3cf6836959214756b43c491ded1b4b35bc97d4ad45ba64fda", - "c4fb7471ce63610c4f125fa00d9069ccb8f7dda53a252fdb1f9c498878fe42a8", - "d3eb99b91a693b26e1f441ba7ea9bbbf1cd0890220beb8bb69070b86255e531b", - "08bfeb36d5072ae43d481297bf50080fe2a217c31ebd24bbeae7e59f6b0d9fab", - "e812c6ac863aa4c7a16a826b8375587f49e9f21e5c890937efc0698ab7a9be2e", - "45068acf9245458dc2f2eab493670ca58a9ed33ad8f3fac673ca101b49eadbc3", - "08e408c6d6db4ddc8fc61cbab3842245d31b99752b3f53e7a1b8ea49e072a92a", - "74c2f5540ad913ddba2ce1e17d5a1dc1082bb5eb8ed023668da8327739d948d6", - "f6add70a97403097ec5c444c5cf877ce40f5246e52906fa5c47a0feed0a4a69a", - "dd4de3ed86aa2c321a98ded55bc30b0a80dcef3b19baaba00a2857cfc5dee1e7", - "317ce3708cd7848271c8a694267046cf116aabf8915139a2b0fbd47e7429c9ae", - "3681a3e3f83dc8e2263cf2cb93f937f23fa592a9b25e0827d35a9321272a3c71", - "f0424010f053d5d5bf8f15dc949e1b9511c0803b3028e25cff5e51a98f3cba07", - "6432def02cbdb88ba148f02ad716eb526c5176a9ca79dfb6e75239af8c45350e", - "9af992a6a3419b836535092d68c55b300f0b315b74684b2a21c04832856737a9", - "66fbdc121f6fab8b79061734473fe31998699150475029a6e66f34e007931e26", - "a3ad1d2508d3273226c4c16a540880597fd3d758342ba4c4c8017fbd059988ff", - "dad2d18cf90a287708cb283b70612bdc49266fac571a124826e133fd70294db3", - "f65a0392b5c210b16213cf9e665afb6dc1c5ccfd1af599bb0a5068503c1d0140", - "d7942a71aa73e112ec9e96962945021a74156e674d49152b4dc04837c0eecf6a", - "79ab33c7470ab338a23b84ebd36f60af77d15eae38597ba99791ccb092ad2d41", - "d1dc08ba49ad333509af2ac31532bc64bed92a4b574b8c369450ec816fe50c8b", - "2641f8ae61422e2e86878506aa7d64139b6900ffd39faf80565493b37ee6c300", - "7f17318a19e9365000a7fa99bb910df03447eeedf951dfa96891ad63def7be9e", - "6b68087c55990adfeb88792b8459f2d4eb053a13d1e6ca20eb7624f5c325c545", - "cfebc00df0e7c131d2cd5d5b15ba7a80195d5ef4d3cc28417f278baa4db805a5", - "2a37cc2297afa3d18d7151c99fe3d7ee596963de14415baa99cd0a99a595592a", - "5103cd4ba484a74b0ac61be87d77f57be65f50f1a261b85eea2cbdc9d733e87a", - "30d2892801b33310c413d076da2f60e7f740109a295332c28d4f16d5494b51b2", - "8a0df901a6a4ad240ac331f317c06d3f13082ebb0004e66700cd06644790fe92", - "e5f5c63fc8f07c78ebef2a4b6ed976ba5b5e010d8a95fe8ea3d07b37f9da5ef0", - "d3ff7762177c852e68876e16920faa7d918e3a9f8f27b8805edbd483ae6a8485", - "400465a3c66994ee80edba5248f16b001b58add4dda0f0841b32f9c2069ec063", - "3189de92c7e80b4fbc163a9378fba6b2e1c1c73aaf98addb37042e65ed546134", - "0ceb9e25b3f359e3aa72dea2b54aa9a9eef5da322434a0e925b150894ca38669", - "be6a2824b3ad4e64bb78178c957986565b5a9e101f69ae24f186278b9135f2fb", - "52c5888279f3ad85bcac8d81ae172a05bfa4d3c7dd79e5f791546d0a94120053", - "f5912c3ec8c3c13d7b73ee4d7b4902c0f5ffec3ac0130f53c3a7eda50a1b2503", - "b0ac2c2ed050f11c3b4c53ca5400b2830702b1b73ae82896b4dce139a21fe099", - "82dd0d086631ee203d80492266b9515466dfd5e695ddfb243591320f227fcd54", - "62417b6cc473979cefbad2dad481d941f6ea50d54a6375465237dfb39fc9f72e", - "b030975ff9785d7b9284588c11484595d3c2382d82f73eb61342fd95eeef4970", - "378e3227bdda32fde82b2d96f881cb7132cbe0a1ae29239c7077328b60b93e38", - "30b93d387d0b40e257cd9b112bbccd2cb5899f19f375e806b32b0c0f2bbea484", - "87d15ccfbaebeb0d6f999deebbad6019fe3dcd389fdeef7f4239c3eda9bdf406", - "764a0cde52aae801ef293adb72f0237b41bb5bcba1339028ec35cdbfd1f54258", - "fe10ce28a18aa64ef2eab7138729343e414d473865a06b2e6a93a3463e177e88", - "7b3bd137198cc240f361333a34d02acd4f03160a1382458cc050b3ff5f6b81be", - "c8a858fb0bdad8fe3785ec9c0de7ea72f0b96756d7f5a472800f1d6a676f32e9", - "a370702546231b9b1b121da4a88e07debd3647b8978f91161afa11c1fc1e1d52", - "7915c181b6833f3732f8dd508e5cb36a87685e6b46c64bf16d7f72c5d185fe58", - "e383d6d4e04f23137e48d0d3ad9be2ad3d9b67616c1404fb741c48adf4bcebfa", - "2f0310efd18f3aaefd8abd497138249f9b6e01c12a72646e441e333a744238a1", - "14439d140a04ca7bf38493db5c6767080dae24020a3b17f7636e6263a4a95e19", - "a523aa6423f246bd3a7b91c3c498f6754d4c89db35b58ae9465263ebdd0704f6", - "b3d440699b38bbb1fd74e4596cc9d155f9d798d4ce9deed75163b0b24ba62235", - "228beaa53076aa9f585b5a2c09b0f8249febc5ecfee561b7d56805e9a633d9d7", - "54a9a9383e678599f385c0a2db164d83d8717897105cea76af64e462337f8546", - "57afdf98ebf00631ad2bf646560f3ac5449bb271dbc8face9d46e3d2a8e1c631", - "32d494aa4304540038b0d92de93f9af59887ba9142aa7090e796f879a862b3a1", - "8b69e5a658800fce9ef37172c76b05c3d48e499fc4e8c069635c1a022a2a250f", - "da6d0908599d2bc2328b78888ca9e510c6be943af65ad3d6bff7dee1e9497a66", - "b3a493114f0db05a48ff02d2ca49745c72b1de843c1dca01e5fe1b0304d73075", - "864896b6f7034bc2b1149b6fb603e7f9844e351be36a0c8c1acaa25f423e0fef", - "93d3ad0ceb9c261693076fe680203997db3b8c12304ae6a7384dd9ccb2f701ae", - "07d76cc30e60d277aafe2dde812ce52e6e13ca14a398c0b0f92f5bcc26923b12", - "a0c00ef10503b31492bfe1dbd50d7d8c41b6c0a1da8b6d7910edd5c3e678573d", - "5b9714250b8985b0cfc4c1dd93d02cf90134ab33d55fef89b1df8aff9ff0f4a2", - "83e0908a19517d18695440a452860f5db78fed4e5918da111bf1299c4ac54557", - "f8906494705f834db64820a13ef38e13e78f479203caf5a2d194936ce6e2d53f", - "0e0b54dd2c92735b5ba7d7e46ea393562724f108f4433dbcbb2962f4a45338a7", - "27b376247798e84043bd37290a937df5ae51ace1702a00232fe790da5671f52f", - "1e66716dfbaaffe9342e70bb45ab2a5a71858151c479a7d086f4c83c675601d8", - "187b0071b7ee9fa8aebb4093a98b425307dd06385e092f2080353d84c0fff9fe", - "85ca503fe0ea9ddf75fa4b411d5cff9e73e5d3cb8894308ae86c39472826654c", - "5d3de1c0f0acf9c3f23e63fdbf3d7cfd859f0829cc788df5f20f8f9ecc516ca0", - "2420e39e0155ce24e10682ea835c5b103d4a31d024503775d942307b8b60b32e", - "d01e47f011f64736563cb05a0ec6f68d3f8602fe58208ea69069558c8d86ec8a", - "879b8ccdbf70c389d5374df8275359b08bade2cf8bfcecc1c8e65461b6ca9659", - "e457f5ac8308214048c2119ac41376375aedac89e8cc33d3e031f15f40336628", - "645656f536dc6a5920849952f8f4019f087f7fb81f2f475e31014729c2019351", - "26b55381c4600f1ed58b330752229bf2e5316fd7945107ca6803d17155ec753a", - "0cd182d490463c05dc27a61d9a939af4daeca7c14251b28bdb0fe3600c4c6863", - "63dbc23fb08d083b75637147a7037369dedb54d1eb577a7d10e0cb31f75c9b1c", - "a5549e985b70011c37b2d3411b1f478866ee22dd8db0b12c4d610b794ca254df", - "95e4350f6e8eaa3e9e7a7118a67fe4886084f8d2cf9f163a1ad4a9f0a36dc0c2", - "d7e18db1294f48425caa86c0af5fc4259e2c3bb821048b2f7c9b88d634464bac", - "30e9eb269b8d26841fd0c6597076718ddea3f5492bba4697088ee8b2839676c5", - "1f33fe118d75c33ad9715cbefb3cdbe1d75bbc3e247f23810238bf554886118a", - "7b56b5b889a75cc3d86de764b90540c5095976f2425ec4bce82279f23debb9ba", - "e74d3dffec76da42581e3dded1ee83e8d296fd2c357e851cd4139c2da6c52132", - "bbec5da4cd2ee7760eaa7af5138d07bf27ff030cde5250e414ea3b3cdeb35832", - "3205b7bc08e9627d524432c8c6b6d44c1d859818b48632647146afa9436594c9", - "bc33a4f884839759f6ef5e9571ec80e00ce4902010d8a51e1d530f51354dbdd8", - "618a61557d9db4c52a74b9379073584588e8b86b4db65f27865a00bea2d45b75", - "2827c9c8cceafb9aab7630c27a0f9026a59129e07d937476c5f4cfed95e5b4b0", - "1edbb2786e0cbcd7143b5ea8b3f80574b6bb8f08e5a0fd40391fd2abd008b240", - "de12c576591b665abe2cf62cf1fe75483922c2e877eaa0998d4979a9585c4e63", - "b2107340fa04d19d3a6817d2866fd2393a301b577a7ea8ef8891ca95e8dd9ea9", - "973128446447bdc2bf1ce21137b5b0299832baadac1e51bafc037c4b971d8ea4", - "ad2747da1fba49e6246356e1a9141c897fe36bc9ee8757e69ed9d20dea7938c9", - "2cb89e42838888cbdeb4e65e92214314d63a27b1c2a48101d2018bba890051e4", - "cde49e963915ada8e1ced4f70b2da861e36f987c05b5d9dbb7c1f2df61131c23", - "31f78f8099b90be80f77e6c4b13b37e60b142fb9e3a1c1f8d3f656c6075d4051", - "08600ca6f7848a303fe64c9e6d9f88ce2a47d747890ac952c209ccb062b608f9", - "693f2d0878e58d2a035c1438adfb78039923a658b8422bda74c6c978da19ce68", - "0dfc06b5736878091c5a22d332f63c29a62243f40d55e617110aac8ee41ea19f", - "afddcdeca2cbce31375c48dd4c59d0ad6454f43179dc2a6c5a368abb17e2b230", - "3b6363023e616d32b461deabd368907250ef76b5cbce44f87a8a58e4f3207146", - "c43b3f199bedbe5be5a72fc9977559d52cea73117cb48572e3f70f3002aa056b", - "c47c120020a7516a7c02c99c59682326df66d7f8b7fb86f8b0f01100021de9c5", - "6b7a8223e99aeb29bb0764ff5f4b18bf07274b7d9f2edcbab1c93bfb308fee31", - "d99bac9a5675d7ec53d4db67f4f3d88b94695b759496779d3a63f6b535f5f165", - "4540b25e7f41494bd1efef9a974811e30c1b77bdfb504717ac9a91501f7e8702", - "89eca7bd7f534d8a20767ca2d19157558ab4d116aa034f38dd2d2c178a488ed9", - "2bf3a8e5f961b5b3a71fbfb15f6a50d8eed4a83e651f31740faf93f3fbd27ac1", - "5a0d882c7317ab0df8843e215036f2926ea51405fe8843ec5d3f59946ec99e56", - "9f5611be554f07a9daa7ed7c26f221c29e65025dc9abd938d4dbee7fc27740f9", - "1d5e278de2f05f8fca45940b24cd263bac43bfb3ebc27e28d8a874a468a528d4", - "9c113bc44457d71b83d50e011c68f4c3b8fd94055559030ed025edc17f89d5d3", - "83df9e877023a70f4a389bf9115867154dc71deb322afb0cf5c47e0ae80ac4c7", - "bed5f398545a928176ef63a8b55c2f76f946a2e86d319551941d7ca94156768e", - "09ca5bcb1abac78efcca8d66d93481ae046c76f6c0fb42c8602ca5a148a82d98", - "fae03e9c2f1e6ee88974bc2ae31af759e677dcf1cc894c6048166cd32c1757a1", - "c2c4c946bf489e5dfd8db7b0e546faccfcd9638ca3e5a1c9ab7615b2c40f61f6", - "08594e93affe1f73eebdf238a976cfb5a1e398e6f9a5a0ac0f0a324715428752", - "20d401a1cdc500f8fe84a325d1a9cc6c7827760a359ee0ff267527c605a9801d", - "5f90df09cc130a1e7ad5f5c5c7df9201c8f8003e84d661cc3865fd4b2c7b0894", - "d9760523ca9c7096fe06c01d3658b0bc1b635ef1790494fa028cb4a6749339e0", - "ef35d29b7272debe6f0ee059f5164cd98aa1aab989b334b01a586d8dec7dbfb3", - "1d9347660c275b3850f11caf16faecbe821561e5e3bb7fb1024e22a221f94e5c", - "24b2d6b8bb61d132799728b0db721f4171b959271a8106e424cf75d89ab405d3", - "8e45ef75740919ef8eea699b2bcc328f403d2f663ada5588a54484f4e0242f3d", - "698216e50cfa8993f8b71242e51f339a57c1dd10f9721be293d074685cf06abe", - "f45c0b2a43d8ffbc114d8b87515a14ea72d8df534dbbf15e3f926a299bf7d707", - "03403fb89f8e6ff8f010e927efa6d36e2fda908cd8554ba7bb9f6070b2b5f073", - "b759eefc298b784f4f3b2a11de8930ab218bd5433a248f20a9c4fad9e51a8952", - "4dca80eb69f5a61aae398989398875d19d8ce1fd390c921a440c9ae89689af00", - "a39104c3bebcd484b672f054498193ebb71cb29f35df74e1f2da4e5b62de442c", - "d084f8af6618bacc0ef832e776184d5b248773bd70eeb82363e68fe766210a62", - "a1fe9c8079c79a4538c6fa47514e51588ca797f2f9ba8ffc9cf0d4cabd4238ac", - "fdc795e59cfbfdf95b882d26a072a02036074e18315a74bc1b236c30dbee87b3", - "a556286ca59cec5f7bbee438f5ad54750205e651f9803d5f454aa7e7164ada4e", - "2820b33278eb9fda1acc0b640632017ea2b5105ff7ef085a78a371cbd15a8021", - "8003c97493c45a0ae476ae213703949f3fd0ea3dbae3d880ad1512f4dab329d0", - "7c2dd29e4260b7ee32f85cda076a48ca91002036e4442ae4a6090e434f7f3037", - "92ccc08ceb31640f7de607b068fa83930cb5b0068e1850ca471bf1a87c1844fd", - "a2e441eebb9aa8a52d634122a609790d740a1c2b0d5c5f5564b4d946cd1d2406", - "12a3fa168e982ffc0dc50403967bc80c3e52973a5af5392c64a01c3fa9f4296f", - "f4c5a43b17b1915007e4c65ba8dd47e9d6cfe246654158b61882a280546fa5ee", - "856e2fcdbba8b241cabccffc98ae49f3e10cee18997a94173bf32232a2b16e1e", - "ff1fb4ef58c5c03e5460c7ba2a4a3e03d08eb81dd9436dae078b3f92f800c2e5", - "9e826c01656253ac8c5d1891854a0ffc6a066b02f8779c6374c48e599b622040", - "63116d79284e69f56df88be3a1cfdc3e4290b7df827517504d1a7be987dea3f7", - "8e7831d3184a48b7d5c5b9c2edf56291299d601315e95b1cab0f3c4a52b7360a", - "168f5ca470d48c346e8b3c5637a0eea8776227082e17ae67e9277a9bca26b39d", - "a477aa26aaf62786dae5223d6bb9af33816433d2bfd9902b97b836001b4460e6", - "288a7cd20acb8c86b6ac83d354d65fd8215a6be3f070ed064c9a8295b3e33554", - "131c47f2f2555f861ff1dba111db959b4a179913621c66a7e75dbfb4e9a48ae1", - "fcf7a672deb47e171e1e1e2f9f6c45a383e60f4bb1034f3fa3c95e4c70469ae6", - "18ef68ef684d92ffcf69e8eff2c98f63cbbc7deb4829c46f350ab82f68f2342e", - "5eb45b6551207e2f065ecab731c9714c53a4de74ffccfd3b3607609b0359410d", - "a63345a31343b8cbef08b50d35a853254af7c214b3837310f63fb50eb61a6d99", - "fc7802377b1fb15066145d7119aceb2bf7778a5e5de2f8109de56fbfebad25c5", - "20e344dfe834b5bade6e8c13c39222bd6339ed84e526ad77f34dbd4e25c73b96", - "cfda7c32ca021a94b20b5b325a1f104cad1f7f7e18bea4577ad24c3a7aeb6fac", - "cbb28f29892c57f02274721fd78326d37cf72769447e016e0042ddd493946fa3", - "b08d6df115777b883c4d13a8eeef110f38723e2115f548718ff52c31beea11cc", - "c10a178afaf1cdcdbcf0952005b331bcb976262e1df1703ad6e3a3a82a7be851", - "f1533cfdeebf285f81cfbbb0e0accd1396ff2aa06c421954e1249aae155b1f46", - "ce40d7bca9ccb784339163a59eb3c91a09f88ae29c0aadc088f72bf92e99d72a", - "3768374f04b36ce3e8538b335624b70d86d89d637551110c13a956c245423243", - "d0c10f084eddcfb7b444cb58db48d3b64a78e69bc638f3b53827a3c1618cf0af", - "df1c1f9dd5226a194a6f16c1d103bdbd0ef7d50855d5f7b6a34fae02469ac7dc", - "3aa18419166298183ca317ac81c7033f014de537831cad187c0ea70b5ef03a87", - "99e21bb518dd9d466755ab03b0a439b2dddfe7853a67886af4b9bf2b85ecba42", - "6a293f921d966f4d0bd07bf24792308e93d3511a86dfaa3fe30ba9d758aaa1e5", - "7fa542abc05cab5546cbc66fa2bff92d36ef67479cc16c46bc9961871b6fbf7b", - "a3e99d564d1f3b4c7dbb670cf778650fb463dbaf72c4b85b201a4f27bbb44b37", - "9f2a71663ba5aae569a033df6a1bd8a3905fb7fe84cec548b08d490523326541", - "44e839fdedb7c49330268cb1bc30aca3cad7bb352cbd5932a2319a134beb0c7e", - "a9350e72bafcf2f34a5564907a3d9cf6b04cc8b5c6851b0b0ff0f4d551f5d571", - "718a0830925b06288ed427d9c318503e73e86851768ed62f8dc84ffc086ddb31", - "d05de5ff2902e4ccedc07ac10121f3e6b7724d4841e662b5ee965237d3a7e955", - "a4bb8bb5980cf472c352046dc2e5ce92c6e541a5e80772b1b0d8bae2f04c53d2", - "f64282725ee5b201e7ee395b08465fbb12b8cca89a28a727bfbe33264ec3e05c", - "67550b5bf5e5c24272a0c1547c9b73321b61f8ccc6a05867701d34aabd4ae304", - "6499e15f1e0d985edf635c8f80e2d254df7c880c7469e5e3e3b6417238f0168c", - "46a47de7d1fa64972901ff053e0c0002ca7bfc3b9d9ef85db80315ce7c10883d", - "d6f7115e9cfd287bfb6ea06a3d5285163dcb50345acdf37cde8a7830cb0c94e4", - "52c4758f66b81af6a859350349c53c97c6230f5d1dd451f916d42cdada35112f", - "97b2ca8ed612279078d0907e0d8b5c9775a6110b74a5dab36769e30194c5a053", - "f7db90d5a5f51f7cb350821910255318be74eb0c80f74cc024661bfdd5482707", - "2020be272df5ba66d6df05656017fa2a5f310289fbfe17e66b797eea6d90f8bd", - "a38d0fc791d880e7a2944a347498fc396e01c8333b9768f860c8e5bbfcabfb3f", - "325b0a79764113170de032a4ad3e4346ea70685b7c88fd0252c92d2466e584c2", - "acbf4383b1063563df947e2d00b952e825fce4e952a3b656065839cc4c8d2812", - "3fbcac5f7a33a92e08896b0d6a373b47ea3c992aa2594c1652609374570dd446", - "ac3293abe1ace6ab02944d1eb22984ae8a30913356d931a3ac9f082dc81962d8", - "661091010d77e1a6a23fe24b81bc7c97d1cd0658e80e76759480522338ea1bf4", - "f5fa9b5b2dd1600de4374d7a0e0a777e210c45b5c23abb3cd5654a82b86c40a5", - "fc9cf580b7622dd4b5d18982a0c368991f0fa9987c62ddd0c5026828bc8f3aca", - "3e4ff2b30cb85b36df310b54368bcb27c38768a9dbc85fc16f4b64589520fe2b", - "75b03d76f5d5ee3d9e80171fbea02545bea115d608b5dc96655422c737f25daf", - "ee399c78bbe65611e92aa98cc95d0f9b729f9cf8833fcd01f65034b7c9f6a390", - "e3e000bd855bcf3f03af5cedd243ea20cb535ac5c9ea6ab69323a1d23922eed5", - "96887db71ac84a998cfd75f54b9f91f31593f3c5b5c50815a1390ea5a1ee49db", - "bffb495c2d269968f01184ae992eeff118ad60454a4bf7ce012c2824f2b995af", - "a7ece66fcd0f1b4ece567d8daa90d18c221ea3f8d179dd6fbd9d8b43c6bf9016", - "d1421e58c8f3d708202955bc5e01a0ecbdf790d0a08ff439952b7e6291cc4809", - "954bc12c5fdbca0b4cf80da65fa805982cc10c5447e91034c5c18013eb46a0a6", - "3306d41072722d20cda7e03f6c7bae04d697814a3452c7b7317317aad91532b9", - "fe2df588419cff5ae80ec9112024021bb063396da146b6bd466ba5c9251271d1", - "9eaf073698bcb1d77983f801d51913420a0ebc32ba392890ef702b9d517e917b", - "e7025299663ea0c91c4d227a82114ee146c4b5585026f88317429975a414ce59", - "605ed7d8a64df3a1a831fc309664d18d2e487e48367bba0b5bd1e00bbbb4b36c", - "8cee3b6a4a0d4c24d89942312deb47327282b48791d1ceaf6a14ea82bb0dd087", - "171be239db03399a973e3662b175a7e6301e33d3f6a1919103cb51e2b516b38b", - "75f5c8bd04d7e744e4493322a6796db9dca3df2fe0a79d2f1a8489fd371824aa", - "7f7dfc5d4ad9a140892224f31fa9257fedc61d0bd820c63cc78bd0f3f01db788", - "eab95e38afdd8dea9e3bf15d1d9e14d3b24db7f72f6eaa2a59e17d1ac60a1ac2", - "07c8c36a3e54b0a81d13b8513585cb928e9f5aadb7410f3826efab04b48c3f71", - "649f897ab37cd94457a78b75070cbdc50eb372d4cd90e71f95f7f39893c6bb25", - "bf0e9459a596978937348c45469fc5047e3b43b05e3ec5ba20aec2afa1ff26db", - "c5285151bc9fba0cfb019c3f846bf22a32d02b7b44f15394e7a4f57ab1ab9120", - "f1d8f45ae924d1e429a0f487723288784482007108cf65a461171abb6f24d737", - "f2f8a82a486981e6e1577f2d6a194afec650a2c5096ac52f25f2affd5b1ab689", - "f2482ed8b1898105d38059b49d742f67c30781a98f884010dfa02cd2095c8793", - "68c93ee1e70a2579d73472b42d5db844edc23103318f4c907a311c29e07220ec", - "5cb95ca2001c8a872cb5d5a60534d6393196a3ca0ede23ef956e623bdea3dd2f", - "75607a46b6752c2460866370f9706f64eadfdf422f2c9eef1c741479598b1750", - "fb8f0812215dad2cc71188d210fac141aef5b3ed000e0c6088773bb183836227", - "aa7e1c0e90430a84220d4aa6289afaa671269333a1ee82ddb01e1b05bc92721b", - "c3629a7df5f3c59cb40ad17e3e52295c57aed77b6adadb361abfe5fd98a8224c", - "c8a17584ba21a3fae6fcab6d8fa60b866494a7d1ff3729654be33e8410e514fc", - "595e6278ccac34e3a35cef9b8389a38346e97e9e7843dbe006f54e652abb2578", - "48dc2950d149a7582cdec8698a455fa41fb483606cc0c07ea9cadca347f9c2aa", - "0db40560d827d5863012894d1867ae7d292f978b9fcbd5c86aff689a35cea527", - "479ef8f42bbae98f5c7b6c1fd409c136855d0dab2bc2ae41b0bf2cad40fe5bd7", - "37fc03c4a210ee2b86ce22acc661a978f67e2a2cd38cdf1a3c003a5d6f536a52", - "7a43cf7c82fe31f4509ba8d893aac7c884dafbf6c9f354104c2cebf0bd1f2de3", - "a68058e5f9f99d50d68c8d4dc24456ebb4418e145c5a8c0eb967f7aff53756e8", - "62dcf7272da9cf22dc2644b2cf358f100040f37de4de0696326a779e606d5312", - "98ff73b30d5db2a16b6adeac1d8bd363809276ad1d042734c95b67a6d8d3ed8f", - "d4e45818c2772c2598b415ee3c7e9a4395c47e234a23f377cce1dda2a5d10441", - "801d1b42dea32416b122d7f23b135b38167f228ee45a9d50e476d0b404887502", - "a01eaa7c829a7bb738dccd8087ea1f31b2abf059e74bb1653f248c4c6c983300", - "200be59e9e133d51f335bbf5330e8b7e263de3e94bc1338abb6cc8b61d9032cf", - "90722e9c9d12077ee9e784811e44ae53d77092658f1c37923f7d3f05793feb5c", - "62b1a3d94d4b4fa9f5173b2067c2ecfc3b4579768d1bc6df41069b10b04bbf9f", - "ff0c3753e4c525c9a1dad2601e9ee4c760c3baddea1a71d56e23685d146096c5", - "1dec1844310b99befadace68d0a01c73f46f47135b9dbe86a436df9294e3c80d", - "d60a917d4be3fa7f1eff391792cb269bc0e5f22c6916c60fdfc0a92575d3fa38", - "a691a86837d5b5fa57028592179b1ab089bfb8c257f71e8a83557ede9489dc29", - "31e76e0f0ec546f330c3f2085c4c1116281bfb030f5e555acc34523de6230330", - "4d816daa6530a9d2ec4cf93ef25d05e48514a7911829f269e03472e88714ebb5", - "ea5bf2c4ae3a93bb5b3857c0edd0a678f46a693a8928a833339fef9d36b23206", - "b86913433f5d814febe1e541ac8095caef7f37e9d00fdad8e528ff1ee412fe8b", - "203297cc9c0731e48b42e5bb549f8603f6760e24a031b28f4696097bf0e8cf58", - "61c2eddab793e69df44f8c0f356ac47d0d77d84862c08ccdef380f51ed23533a", - "071317ed7df42c0e47d9cac45dd5a7d570d0ba2384d69e1fa9d660ac04c208e8", - "4be336df340d6e6dda53e772aebe897c0005727a9710c83ed75e2da673b7cb5e", - "6ac8808374cc2bad3f1e6085adbd096058d7ec4421efb796cecb099518a147db", - "198075d39a71494b2aaa3033c472fe612598647e19852970589bf09fe7cbe6fb", - "e23ff91b5ed4bf60854aec5703424850993782d81e24ea62c6005f104dda8b99", - "1ce02bac487a8e912747b11a7babe66baa0a64f7afbcb08d0abb693365282287", - "593dc5eff3392b7ec9523bc1188d27e6286b6a842d2fbb3ccbee781b5dd2f8cf", - "9e37d405963714da1744076833d6fe04036b10c30504bd05f27f2e5644f96a80", - "f734c349f5d10d34b34d305618aab69fb714bbbf218c78d4a6a6e3b93fb9f23d", - "ce3267162ecd9b72cd8c71950fb98f9d0ae6f3732d4e2ba379ac85ab7e7f6750", - "22261238c6502d4121791eb82de763ef5f5a65331c51240b916c982a95218775", - "a665f8f1e970c89addb1178599cf82353be63a2fd7c6e25c262d1268e94b5559", - "9f18cab76f97436cf060e18c73cf701e9a27039c43f7e99c73baaab24868e89e", - "5a4e9b6da26b95a3cae1c96ebbebefce87be9439f3ea3bff834ebca849d8ce94", - "7129866770851e962ebd49072bfab158fb2001a1adb86269a325a1c7a53426df", - "452b73ea6dcab8ada2b3944e54e30d987a3454a2f2c628f1d03b428223ce056e", - "5fd9c2374893fd0bd56d61e7fa2f3f4dc0fa23003b568f9eb160b46f3a654eb7", - "c3d39a631b2fdc41ccdc52a822e418d0720f147652fa7772195b0b19a7225635", - "d79f98fa008ad56812983f1b728bab96c06b9ee90d685f2ebc6a16e1fb466449", - "4cd913c3e9714d634588c9c6fc567e9eb62976f1997bd2233b673efbfd669906", - "661bff3b849e4def0161560808ba2a3084fbdfe67dec327e81c88e9de868fe3b", - "0e649cd56d9e4b15a1429358ec10c70b391da868f354e6f503398f60ea66f2b2", - "a76447609cfa5c2f7366fc915a10dd496346d592267c2cbfc509617309e36295", - "d8175316e340573d8d3509b4bae3078896c1923703e523f6ef1fe0d501c05c26", - "a2a3788f3697323111d4991c9bc1bc44e9e7c1449f240677e03a17cdaad31344", - "65da3026b2487882eee2665c8cc6ac553198c7741b7965fbb4b26ef640f774c3", - "844f0430f9d31db46fef5fdc51c0b3c5578413af928a2cdeabf899ff076a3b7c", - "196271ae060dfe1fdfeca6a9a927fb888aac968eacd12f734593248ce1d597c2", - "d9aa88e5d930f9c51f318ebc53c90453b52484995aa0650122ae700d64ce85c1", - "ce6c84c914e6f1a6e6ac5bb6c0a1612992ccfc6871d6473a31b516eb7aa452de", - "0b860754cd075e4d58de20a55246cf6b78e260b95b14c9b402353d4c8ab5961e", - "75369521356f15c8f332f5548842334bd334eec5b08a3df71c9e9792516c31d2", - "d272dad8fe132c9c8e76ba78f0ee9b0dbcbdc99343321b3ec46c588b4bffd7cf", - "1d0fc80e4ddadb4799ae8950e4c8ba8f297d4a3347c7939f202416b3e239450e", - "f19b1a2ac5968be41f856ac85730f571f61bf6f4f405af6071105507ea984c05", - "19f1cc708c6966b71c222eb9211886f0e40714f0d6b0dc98032cc4c0a14aed42", - "be9adc94fbba26fb9e2499119ac2cdad6e807900ae9230b8207ed570f4c5e440", - "f28af249585eb24eaf53bba987fe38d1599b5337660ede359fcb1b08a4daa103", - "7c6493d2cad49a2c907f3eb75c05d2cf1147bfb9bb6decc6bdcc21f3da0cc85d", - "cc34af874e2615df08d48e694f7979f2f648cace3c42f29587d3a58b1ac51e05", - "000a4e7313b5422d8c522eecba848ce3c32e1a9edc04dc9f7e930f021c9ff862", - "4c2d733597fcb1e67b3fb15a4add8c3025c81682d95b7c2954d9b15cf51c5ad7", - "e650898e024ff4b6e5daff8141d118aef5a1c2cfc84c7fcbcae6cbb86bbdad97", - "8cc450b57446cc24f7a44a6493bd152576bb537bfe4afffd2fd83b7936e57326", - "99259511548ba1758ee25f0b0439a6edee1fa62e4430840f5bb0ef46572d0981", - "a8337a5e23c4c8b158b79c096e9c79e17f2081b0a66cf45c78d13c00b0fb4ea2", - "ec2f95f7ebbf8f127dec75dce7406e12a20f26fde9beb89a8cc9bae140f61ff9", - "821f061f38841c5884f4626817988bf984d0da75a60a1fb5137e9108d1942e95", - "71a995b1c228998334c59f07f6fd6f666eb0c12b0b7d01e4c1b06cd7614be6cb", - "de71ea227de883792828ddd6f35276bc9e39cb85166a640cff47b3a1dd4506e2", - "40efe486ae0cab6748fc05b9082272f76adee3c949040f0b0ecdf864482ff02c", - "3d80fd4ea19564d8f793beb09ce14d42ad36438ca70ee1781e8397f2bf69e33e", - "8aa14ea8c1e36bbe90ecad0c8eae35fccef8f2dfa3027ea2820365c9406ccac1", - "734140bff0d94f41760a22af70144d9659d8688c194cf191279eb0d80b6fa7a2", - "03d50c7cef9fe02a87892729324d6e10850838bd4181310d077b09e82691702e", - "25618cbb325e4218219b6bfeb78fb5eb50ee970d6328379b03b11d2a3eb49127", - "e182931e436a4526c746a281c25d6c695552620f606c6f8f012ff6656c76c7ba", - "1bacb102395d52195edcbfd794e6e5f4cecda5d54981de3bd730dbfc3f19fb4d", - "fa3bc456b4bb897288bc13e0c10c47c8d6d00d16a11ca5ea29bde7d98a97ad6c", - "475a58e4d26d480b2860c2a76b27f0ec3fc94005c32fb5973106ed649e79f4ec", - "8262cc158c4047cdbe7393c5ebd0ec9db0af3c231d63dd3c0051a60f0e28fa92", - "302f4e62e0213bbf3bdcae768898c05c149c4422bed5ae41a2574f0e8ad39777", - "1ad4cd2b19b721bb9dbfadd33c8d286ce61187054f8ce631cf5421027aeb8583", - "edda6e2ffc164ea31c40c01ebda621781b91ba43020643fd1f429e3c31cd2b25", - "a1fe291b6a81d6fda7e2cddd3c75270ca78964b063c0d1593bd69584a84cc965", - "841d693e40cc6bd0cb19e5855f138e85390d9775f61c89f66b059580000d694b", - "6bb7453f1c574adff5cd8c89a407e13048aa87c34b8e780370ed34e3dd8eeb65", - "7f95a00c155e056076e10e3237d2977212191f0af5758041f730df0f53893a2e", - "8c12dfbe883a45fefd6e88c955e8946051b8acb00e1f0364070fabf4b0465014", - "43cdf95548178005ce3754398b77357e630256f323f74f338cb5bde503154d22", - "9224da437eaa11fb6fe9028a4b20fec9302ecf6acb9810ab624bcda8faef36c5", - "555cfd2317bf449fcd8ae6c82e14dba49244dbb9a5a2d06dbe7de4786ee3415d", - "bc5c3f35492e9eead2f065079993d1bc21a3f8a0d14f273195e922af8697d0f2", - "05cfe75f49ef785f8c635975df14d71072a7589dead250cf4762b651090f2eaa", - "fbc3c131b927e648e253f9391fe67f44bee3e4fb39b4f90a8c10a32142cfdb01", - "1ffc0764bf8bebd25c00b2059e81d9ecf5e0cc3bae22e9f820a4e01e32ef81ae", - "f507e06ae4e3a4dcfc05a5900f543f8c777cf0c8246594c67fcf0547a4a3d6ce", - "a6e95cf6a3f20b06e59b7b1401ac9dda48dd2731f0793addc63c6e8e6229c4db", - "8edb15cd23d46b11332a16d2521616cecbe46f85070bb21c0de7873e89577ddb", - "97042c035a1cd50839e4150c55c88549296f059ee08da96a705b9950af42bed9", - "2ee8c80768f1deebbd857151fb38d6d43ff02bc7276940c6d83e0e2e15afa3c0", - "7239e94384d7e6eb76b6721f92071ebbb27f93a2038c74e14f20d7b4fb935ec5", - "57226436489b993773002162d218c7cfe7afc6f69f709b32b1b2aaaf839b6ee8", - "e16a90b267a29de5904426a8c1496be59c5cdf985047f1e3727ea7053cadfe81", - "6587c964827fe82b54cde0e26f3043644b3262c04d455faf95891f542d68fb15", - "3c0edcb9f2b792f758a141040d4340272ebdf9b8c2c9bee567f1437690503115", - "a4e1708bcc6f331ab87d3e271d9cfae71f3618a9215e9f025970055456c231a0", - "196e092402cbebbbd23c6fd69ba8cf4f208a1a59415e5be010d4ddd7a2add613", - "165470419c59dd5d229592f41aabe183d4f48d37202a2b83d1102e266519c720", - "7511bd39e63dad35fbcd6291c85a6e2eb218b642076fb4a10f19d8cf0f99a873", - "6969125f1d87aa620aed432794657489e115543ac09aeeb97bb4ae977386b7c0", - "ead5378d223a2b7e169880802e4b3db3e8dff6dc0a194def05a34022dd914760", - "882480ede03e1a3b594c2f8e233b1cf300fed694edaa254b180c048d88855832", - "4bb4f445b3cc760c4ccbcc4d3f43dd2a275b6149dc23ef2e79ab491fb453aed7", - "820b30f9ec2844e4c5c47226a564c9d30aa36ede9bb0847cc500be00c192e94f", - "05c8f9764605ac032fff3de1ca757a1379be58f8dd273a65b7030d78cfca8a95", - "caca2d2e49a17316e0141f394f4b00cb250557c6f552bc5071fa2eac37eae0da", - "64ef8884512274c49f0290ea23ae6b25ccd65c2dcf519c6a13a6452cd8b53b3d", - "914d40a06689667706389ec30c3548d91d35e75b2ce794d5779ae50e82713ac9", - "a6d7422641c723bdc67f3ed3f20c0a3afc7fdba5086d1891df61b01a90feba1d", - "239c1036e706aaff5b62079fac0618c16655933c9b1e820da26f0e31fbf23839", - "cd83426d93c2243b400607d0d40bf172ad77632b4b62563e7800e809fc6c1b7e", - "cb1d581c35626550a600e87da4d80051e9029c918098417ebee83eb5403f2bae", - "a9349349adbe6129aa3615c0e92dfb8bb3234b73f0d68702c0eb2c36d4a3842e", - "5967b2360e5a58bf5186db3925aea8270dd2233371fd276cc716fa829b374f1e", - "0ec4e02813a70064e706ebcf012eefe0dda73f594bf67d3ded55b66bfae2791b", - "9a0f3996d27ea1c30d6dab7e1b2b8bf8dc2071e353161981b738ea663f1c4a05", - "706867284ef14a19ba1717c27a89556e9516693ca8eb6f39dfd81bb3a75943f0", - "1ea991d3f0ffd6bdaefe26ce0f0ee7c555e8c47ff6715cb433f0c07854ee58f9", - "e3a67c46b1c0eb73e06c14a1a94e0f3ab04f931de9d1e54dbc417132a9441ea9", - "2f3463764ea63baba59b2763b2a93343034c51c2ddf846998fcf2885e6e79c60", - "7a01046b4740df379842c3f1876b0e5b8f29e53fd6b6a98182d9d5b45d1177e5", - "f71a8a565cb4c632b3a7c5734306d088fe2f3b2199f5ccbe56c89f951e3b990c", - "f72926612e81cf4393fe4de7680ae918a2c550f5ce7204f331aa73a522624c54", - "c57161fc0e131b6f8a20a76c7a4568e05cc8677d5ef8ac31d0bcaa4f9f644366", - "ade99909d2c302482a14684d5f771dbd6b7db406a0b78863e5cf9b32874858d1", - "27fa9b0a54193c9c1dc48f44bae67f5b1dcfd9a29a7c40b40f86265893e82d40", - "f3fb3083f16d64f086601854ebbdf2a5e9a565efbcceb61b142e5a75c9137e89", - "8cf5ead07342dadd8e4abf2181e122ab28dfba368202d4786009488e9afab0e8", - "c25cf41809489ec32c7a4cb8ed4a5bdd8be66bb40f3d910cf7dd39eb76e02723", - "574f4b5d8bd98553f586978d185f1b96e757d77119a803808e22e94bdcb8961d", - "46d24f7115d8dfb9524d2e9002306b67b69a94762b236c6b4c95fa8d6dee7d8c", - "554573ed634918ba2d609b3014ea8fc529eca0c6c67289fc95862a7de42091e9", - "94801669cf3686a2f5fed03b2f76f7df544b5677a5b898aa677cacaef8599c5a", - "4bae07af6bd7ea32ec36e49013073fd883a3a43c9097a7cf87d474755b9d32e4", - "69149375a61f27d40f5256bc9b0e1b32eb01f798c7cff883819181a059bd2182", - "92853081601f85d0da55f8485a0a4fd867acde04d1f09cafa04a5871eef13ee3", - "e6d0f03813e31493c8251f332e94b3d85c82d9be347c490c1f702ce2000b93d3", - "bb98223e686e780b2540665e384f6c04b8d5be1b487a3b9dbaac4b152be8b17e", - "22829fe1e444d7e08984408d985ff109f830441c33f5c6d0df6beff3886c41a1", - "c33838204b5aca0aa6d7ff3a7aae990c298a3083d052f0a1bf455987e62a60e5", - "72696a9f5eef34d4a2b072e494f8b56d0bafbae006c3bd889d0c05c47e197af1", - "11d927543d998b3a7977872876cc3ac2b7aa7327e8314400a48b5966bc376161", - "ec05ad20970936fbbdc7621ba3c0a39dff99df651cf9395a3fb2f285e59d0405", - "1a398cd359a835c70bada6bcba02976557189c2b28b8f7a04bed02a021f6d019", - "62ebc82b67e4415f51fe9960c3907f67184e9327d903ad11636c485c8d44c7c2", - "29166839c0bc438b91aca8706a75637f5c6dddc9eb673a4ed4b3e4d7434c6780", - "463784398c263dddebf72dc98db9bc76d6c05d2b2f713b3d5324dd73b9cb3127", - "f67db116e23de1c75929379715b9a5a5e17d6536ff2f65614c684bd5fffe2c34", - "8ec77c447347fe08f851dc53ead352984700ea35149dda81f536184438d9c812", - "4d787328cfa981ce02ad97effa8a739318db89c67e5f6b1814591e8f3bd3da57", - "b091a719a7a6ca9169359ad5dfaff8eca9535465cd3cedca22531cbb39f69236", - "5b7498ae16522e8b2b7a15fe135bf78a84651a36cd258221d7584e387a0f98db", - "6c5888835aaddbc5e9e3dccbde310728c0ee5c9648d60c63a4a6a9eb3baf5ec8", - "f38daea873e755d64c9eba93c287793eaea1bb9b9134a7c57a244a87366bc364", - "7dc55f64fddbe0b80d74e5d82dfeb48059d08e0bac204aea815caaa617d28848", - "c2370fd92dc3fcd58593a51801452ab92ff38f9f521eb9e25e147ebcf5e11ece", - "328d694c6aeb6158fc1fa5d8982ce5dc1cd97c1030c018150f9e69c42de32d9e", - "3c6ed83e641021f214aa0607cb0d1ec3cc68c498db622199ec276fda49372a46", - "6a10b6ac9919c0a23ac3360899f2bb6acb8c07e34d19457095e8a9ab4c392112", - "7776db8015066ecc4b33a7b1d30d1f9be12a9aafa1b9e37ba93c271161486631", - "b5aa0d2718994854d7f15c53db47b56db6b441fb6f0abe41f18d734220330a8e", - "36ce1d9823fdc27eec7a10cbbf2306d167052132019b46adf4ef5a163ad97f44", - "67127bb49e61a3de741d5d9f56404e0e23e79ef02e5d31be43ca36ef5f932e97", - "c0e79d2fce52771e2e21dc3d292232cd09979fa2f6c1e370a47589b48ca153fb", - "46ecbf45d5774a3ec9434c59436b2ef5ac2eab0e5c9fef3142be9850563d9ee7", - "c17091bf8418deca3bd2803f1fbbcb12e4c24fd431b9173e7b51f513df0204ff", - "eb7f90e66e71882908ebe3ed1f7beaf3feb27e78b7af8fab2cca0d7f63188bcf", - "9f0c32a7e3c353ddf2eb2807fefde9618b5380b14afddac19de2cd53f2451adb", - "972e74df08fe3757ace4688a1eb17bf285a6234f2f85703330b2c273afa3b3b4", - "eaaf412aa93159cf4057702e515cdfa9686777abdc2603b899294006da76a443", - "ea1725709bd7bef7ca02ffd4bd67d83b586497a0059c653ff5087fc5850a7122", - "54b1fef50e0247df9e0466d1c29582f274b2c1dbb70f26476a34915764f083e7", - "8e2edb287dc124b63d5b110e4fe1def675d53e7254bc9111339ed432edc7b0e4", - "0d270362a9b17f0560f0b74d691f0c90f6d35260c1ca10b4ba664e910247c764", - "9f33e2475da6c9614a1ea5796d6a4dd4610450bf949ec337ea0787028ca35785", - "0662639f6285bf889515f188668347b7a91eae3176bd5c1b8c7d8f7b409a7a0f", - "eb70e706503ca0c4dfe2abbcfd389089664094b94ec4f389ba353dc606388ca3", - "d81bf064bc7fbd2c64c537a55905425871b0c65ff1fe19ba8474056c39183e06", - "650544ab3baf75a2f4047601e10e3cfd4d28503794199833879bf1d70bf925f8", - "1f3600242b0fe33c2fad066e439412ca541e9e51fbfe74897aea248cf8144b02", - "55b7c7e24b6691f711da7e925f9810102d81eb10a92819202bef478f96d9a27f", - "3ade30a221055c150c3921a34d6b9b2fe19072968a6d530470763593d6f3a4b2", - "7c919e94b5e06a49d78a466d27dbe04cf560af676b85af29a207f919daee84bb", - "65f7b7c707482c1a795e1ff28c693ecfa1a6d5f52e7224ce751b7ab42b92c6d9", - "51ac07772592a850f3a7b8ebe529c5c55a5babd5282c040ace2ac0b23f6341b4", - "beda7bcbd401f5b0c2cebaf0251301889dae8a8db6ae15280fdb6b963d0c5673", - "f961f9d4e078953abae72dc9f89d5dff1883b62204292efb357f8b76fa665edc", - "fca8f8801523ac9ef464ddf32c88d2433e53ea1ecbad5a44ea8eecb4be682aee", - "124f959b3c351baf59cc7d21b27a753985a1cd630ae8b1ef377d48ad5d988319", - "0b7a0f05f20ad7b3b1215b673a8427ba9f0ad07086f76d94f6abf514586fdb48", - "26754e2f2abf5964119a05617de10b59af370232fbce9908ebd7ca98012ee304", - "d4db472434d8a682e019ef2289ede5750ea8a8704418fc33ec86c556df3a9549", - "6e3af090c311bd58af5a29a6743504b0666b714bbe35ea3be9df0420df16f136", - "29e5370d2c724e0ee8e0c8bff2fa057975307b1e39221f08f0d0f25d4ab0a1d0", - "e7e5e1b2c0614e10fa906b1587f4dc629a94d20265aadbf06adb62d0d25c8205", - "9d37137ce5e258099ae5bfa9bbaa4452a697dcf70a77caae2d8435487e1160c2", - "7cb8d15d5ca0e6a1d49ccdd1a18aa1b3c0b04c79c62f450efa38ec05e342ddd4", - "262a7b64e3ce4d3f98c98c08a53dbf42945d859d1deb35c26cb389890ae86c90", - "9512ccae66320cf8ea14b83fd758d9d89d884ace51bc179038e7e557f971470f", - "9a07d9d0f8eba4730266c5e28d9796c5c0bd3f64e86245c7dc114923877ac94a", - "dbc8b1b212e89b086c8e8c8ce387394f392999c25f550370e3b867b3f97a6806", - "df03a633de6ec6fa66c9e1fda46d588325fc77562e1d94070127f09460b4ca4a", - "4383d6edba7370ea6e097354dd1bbcc1f491041e6e8e31b2dbde858adcc0c515", - "02357252d1691d896633f541d0cee19ca64a92f12ff6891e0a93bd003818c3e7", - "4b8b92feb7a414535c32333e3f1713526d8db3400ded1593ceee985f9eba0ce7", - "5987bdd56714b2092d99df587e93e1ac9905c76a01ca02b41575ae4fd8571c0c", - "d1589998f2d46b9d8290be51a750a135c1339c9686d524bac956429b03ac8fc2", - "c06769079a0dfaaeabc61954cb02e4f435acd9b2d70a74cf3d69f5c9321a9310", - "97aacff81e6cfc24d865496a8e09d2b2acc405f4ee6d722efa990c22ec2ecb51", - "aac3d38560410b8d1bd5f681b754571dc90d1fea1ed612b825c0d2c52050f0c6", - "1f50d9dc955407f65299a59efe67070d6b94239d253d488b22c496232ca47bb4", - "b61c17d8af8a83d0eb87af61db091263a324790dd6e93ca3abeaef806fecda1c", - "679e1751b0098a5e9a886522780cbcb058cb032dd0e3e7e09e8f8b9b285729a5", - "94ac71ee56b06e8a30e0fc0c7da5d2b6bde4c5c57b2aa918f8995515f5a38f5e", - "b786e47e2cb6bd36942347004540ec763757c125be34bdde63042e37b9dd2368", - "a33a600e2d5a30aa5090507341a9462c4e199b8bbb83c221ee3d530dc6acfe31", - "1c06771838eba29d94e810d5de8a187a63f714171ccf7a22615ab7caa1ef523c", - "c8c5018de9fc1ae6f653e1645d9eca7adf839a3ae8ece5864df0a54825996ac7", - "bff5427fc84a62cc1f4bbe0b1617aa3e99655fd23694955272d075c6ee39ab17", - "bd885aa8b865fcc08d9c0a59189f74f5c1e4ed06e40c4ac8378a1d4acb892486", - "fd5e91469801acd8aea9eb8f0f787842da4429dad6b0d6861b7ebc63a17b158d", - "f26d5ef7421d81ce9e51ab73be6d257b8603fb559fdd839b4b04c8d4642e5c64", - "b2fc0164289f47fbecf9c60d4f56bb1daac64d0d43f5afd885a7cfc9c16c3ddf", - "eb5c462e183edb0d81314b61dafe9a1e63d845b24139baa487624ab4d12feb3c", - "ab21b634ff788f5488c87733363b76a840ed21ef036da16886a9e8e59a047884", - "cbed1c1f2249a2a4259ccb3afc30d006bc729e4ac2fd4cdd63f80d121c71d407", - "075a939e5add00a0f38b6bf416a89b080c3a904b0752087c93433f81ae31128e", - "0d4be609cc716326d6763c3bef4c5ae09e5436489e2afc78446266feac5bf9fd", - "43b5d495ac8d5fe5c39dd4b189b3b7baca9ea64ca76102fc1355950165d3f33d", - "5d6c8bf552c4f1f4dc0ae57faca4213694e81a75003d4c540064c1fe530b6a42", - "81dfa03569e976da4c877dd31281033796f907f556b805281fc90abda9822f2d", - "d8c069176ce8657ff5cf7da216c30b31926912f8813520746d20465a82b18f63", - "cc2a5b436aeb3b1d4e884654f7fa11d3bec9067a5711f5e29cdd47936d2c52f8", - "17ad3f44d77b2683715c0e9a2ae7f20a6ceb1c97eb4a5650f3c3be9562523d1c", - "97e72c2561d4914ed339ea481ad874727c685c858b473ef2d36868793bfdca9e", - "3ba5be587ea0841242ffcca0b52a9330c5de4ab8811dedee43979b4549a78405", - "283f0275180005ab820f1f32748b9689aa7a4f25d1d12238a6d20d15b00d83e7", - "add093f4233b0337932ce2ad3d18b68f9479477b52eb89c269b4c2368e3f4cd2", - "e104671efe671dcdaeb80ed59f06cff2e88a69b6284ca100da69568c50b9fca8", - "3d1e4a9ca8be3be47a0349d089b060f129510d0e60fffda05e0c0336f54ae217", - "61519932a7eb4cb503ec6228bb27405b83a69cb2b352e2650d5836f5c7c1551d", - "2dbba7ddf602993ca9e7a6cee9a33014f8a7abbe2124746ddb0ff6bb411d560b", - "2e0de3da40b0f878f5faa5a4a22dddfb8e909f873732f13fea9daa574c0bee08", - "41f8665c6fc933bdce94a009b484429339813dee4fc2943e6927bdaaacedc5a3", - "625da46cfb476b65e7743e16e044cfbd234bd8b2ec9127346308697bf36fee37", - "3bc8a3617a040f557da655659c238aef05a978e2f6e2a09e74c5fd8ba8090c92", - "aa62fb76c79ce472a56a060bd3addcb6b0c1b43b2a0243d252631cd19e59392b", - "1b70b51eadd582f641197b44ddb779a3c24ffafae9f44dd7dd3f7a582cc421de", - "5fbcc11fafc20a8278a7582f0a7d87b85ec6e816b26835eec305630e23560dec", - "0f669719b4eeef0c9f3d2223d166639ec81751f465df79e16564df652816b215", - "0da2a7fe01a0d0ffbbd003f83cfb00e2823b0a544b5d965eface6b09428a5317", - "9dd8684f348374bfc242b4887ae02b037adfe447ea6647827c91ca8fbd4df58f", - "cbe86a581189d75838fdde91a9fc9b71b78dc8471896c62e23079d86b55361e0", - "0051d87cdfb2d0bd9f9fbf70108fc54b7f00155ff5b28f311374b633b7fa0047", - "298588696bbebdeaa391423694f2d52acd000b5c61fc6dbf44350944d4315eb8", - "f5b6b453cd5017944b66f4df79aefe1a93b39fe716b7fd98e04d98ddcedadc5a", - "a1ec801b129e33a09824be7caac607717c96d7f5d373b573b7bd51137bc73864", - "7531605ed5a45392da6239e8a8e9e26f1c7a627c667e76250f29951f12692306", - "8f2c9eeecb140ed33ebaaa467a1f66f80250fb8b17b0b0e6974a03a96cb05788", - "f456d89c0f4fd424f77c714b354f5b05b278e1bdced2f85156a38f2963e1d874", - "fd22ab650ca51d47929a2bd0158fb68756fda86148c36922ceaefc0b2e605040", - "755417f5a164f8eccc47b428e83ead873963eb269c2d5785df83db58d9a028de", - "3054c8a088b5329e61d486170d0ff6741969e2aa9d483bf7823794fc4c604552", - "fd12cdfb3c48205d796dd68a87e54114d5e8694d80d8b23d49b35cd881cb70dc", - "1f4b06a43130c2f77ec6954143140f545dc1aa0eb8a749b37d4f50622af04d3b", - "c9f6809796fd89a44942871c06d8b470df9a82c9e74e540f55979b4ee27aacd6", - "957890ae3b0c8de552bfc8be7e9a00c2ff4ab732910c82680ec844467f20f88c", - "3d649bc10ecbb85387d2e93dc45e0c3d2b3171f9437378f1e2fb1d84fc8c7ef8", - "3bb658f8262ec92347aeced1be7825e6d3cba38da2eb37e2f5515fe52d868929", - "733727d9f0e1e69beb5a58668fb0ff644efb941fcb63a7d50daed86d9852eb77", - "434b7d0b61b94789f55648cb900aab4bbb1772c34591998ffeffebecdb022606", - "ca40789f2fb9a493e65b2cb406ced99b312afb44f6bb484e074b0f0e12ba7a13", - "5b19eb8c116c4fc6b43cc17deb27608c9ed59421e6db85836d6739de719d96fc", - "4f2f7ba5646a088665ee64b774192a10bbdbe17e05024b161cff87b2cf62cc36", - "39f56fda7196b686ed9d6456ff4ddcb3b6b59a4550decfbb2dfd79871ffd3220", - "8c49721d576a5bdb4a1db569b57a4694431efd013f40f1c31f138200e35aca4d", - "47ad0fb6e04ea868734e4742282eb85931d3eb52f5333dffe0a2d1049acf24e8", - "c335a820f9ce96c580a76398f7041d237740930fa63f045b343f0c29b97e631c", - "93460f7e15d88a7b517b1596abbfbace70b67a01f027307cb006e9c4014cd46c", - "c4db7d3f0b4dbd3ca3a9f9ade168564f71eba80900d57ebe88f052f91f873312", - "1816f52cbc96d220c754cbc2f73d346259511354fda69c771e1c441b2984605c", - "810b32d36a27dea1fb1e01d8ba9b557f3e82e770d112f4ebbe02491189e35c0c", - "e7268e77981b8b75e4c36ba8b943902ea64b9fcaa8f0246f6f82b3bcce76d08f", - "b9981152c6712cf7b4cf82299cb6fb81203eb46bc82abd0871ccd56e65c57f85", - "b5836095c61b7767812c55ec48daed66545c5f6be2353cd806b6631c191eeaad", - "27889ad319f8c15e1fdfde4022da7b368397c0e558c317225ab4be3b2bd4d0d1", - "362520dcca93452c6775c1d7c9b236a59fc81d7f3434f65a4657d39e189339b0", - "2bec2afaf27cc31c4c11372adebb97c29c45ccf00ef489528f8015e807f6b215", - "55651e08cba47e4e3ee79b7bd7383a636ba0aba5febed5e2e4341c2c52bd79e2", - "e841ad0cc2113cfdd30153f738ccc5b6321d254e0e3a2cb8843b575b6b75cd09", - "c670a705140d691e41743f4cfc1ad1274608ccffc4788972e32687e2698c1c23", - "a8876e6b3270164f3b2c3115ab2462f6c957f3de7375831069debbd7ba7fb362", - "210416de2b32e194f5626552f577ae3cea7ffe8c1056a9fd245666fdd767b0cc", - "6f9f6131da29594dda8f38912ae2dad29c1556afc3227cdd5fbdab019ce1a0e9", - "aa0f9e92a30e377cd381ce9bb7e3ff4114e399dfd0bb2c77cd75df2d8e326de4", - "6fb127e1980f55bc4328e43f38ff0d9f3723e4a767420edb18eacc2d95b0d0de", - "33c5122cdc1995635573cebcae9806e35e866f2f2f802d16cd46afe1aa306dc0", - "160bc76db73032ccc9d1f920d83ae9596d27c3c3179d1fb9f20fe887bfd60c45", - "a1ff4c7a8f7faece0c2944d00b25b95b0971a4718985c0dc006eaba8f401b204", - "85939e2b9c065e3d330d3e4fee804d63a6926b3f2b93253d7e3f3094a8fc5c13", - "f93122ea223592892d863177e590488ee57d39fb9fca2508813144249b81fd8b", - "0ec3fc074e7fdfe6c6f55587b7b51bfc91426e0af9e02ae8684d7d1b83ac4609", - "843e9ae247166c6ef5a2f1dd0718201ff7159fc8152561ed36d82bac985a555d", - "6de6e36d0972b27bf55a2ba00f53385de4fbdaf399c7b170ba6e049d9193a52b", - "3c34de5bdb5bc0e1c438ef102b25aa6159bc725eabe26ba6b1308eddf74e95a5", - "a2a18bbf79003a3908c419a1a4d635e409c92d0d8a32f82d3ddbc988c53590f4", - "ab7ce8fa20bcf6c0f017cbe1e2d7bf0255038c875b0ec11f3d4dc11ad84e0693", - "c16c4b75f691486d47fc74159adb7204dbd4dcc984419b42fbefb815b0f7de0e", - "90271e562c25f075a70ae6cda0977b748ef5c11bb16b3be48788c38f5cdca1ae", - "de6c387115f6369a21917ec386a684ce2fbd0f1df6d423190d2fa0984619d8e3", - "75567857d10f00f20d88988f8871406a8f7dd0b41f9071eefa1d9612539f6820", - "e2ee8aaf064fa12d6e79f2467f7c9b4464c547a958fbb8f5ffe5f83256659963", - "bb02a16c7c81c5f0c0a6a597e8b700b95220ff3fbfe98f454f802cd11db599b6", - "87edbcb5301356877117e644a269d3691ae421ccef31d4e1e50cf4030d031f4c", - "fd67d47b9081731c7cf2e655efa90a7f1e1ad9d2c483774a9fff922e840d2fd4", - "81bdc6e45d767dee0091b064f673f85c16cf0c7a1edba9056366d399e6639e9a", - "7a3904d8bd5afbc70a939273b6a09af43e0bdfd7910479abb47ddeedd5837d9d", - "8c16956bb92cbd56677b5be53829a49ef6245d0f422a160e06845d58b94b5acf", - "db65708a4f5831906bd81b45bed102e02aec3e6b4d3ddac472ba812e141950ba", - "c58a4ddda40ad9be204b91f570b819f82f42ff4d7dbb4b48eb27522013d15aac", - "91109eeb8873d3b2066de9351b4d74e9d1437ff3070fec65cc170c324ab19ee0", - "0d94183acac6e72e84c7012d445b205173d51d99d90ed1102c8a520d3fee934e", - "7d3709cbe86a32225142008f8f10c3ac1822307bc95143761ac571ef277aa577", - "7fcd37493924c2d26b40a420f5f3d6ae1b15aa078dd0cf0abf157dd807bbf759", - "d4fa34749d02a423ced7d686ab98b6db1ab43bba48cd43b821bc1ea05d5c3ff7", - "b0790c36a6d0a207296839f3ef18278743b863dfb9d54623818a368d782e14fe", - "1f30ef36097e03e3d30dfaea8fe31ff42d8817f6fd79c54cb70d39d7fe8a788d", - "bc22f48d06b598f96271edbe883b2f88f52598cde9456146ff0030f60798e71b", - "7fc5e88a41674d8c3e80f0dbddb382ddf848192ef9c62668d38c886d4b84152a", - "d62fa3f1825e95f3155ee262d6ac0aebf9eb4d7cb58ad2e9cd81f1f047dd578f", - "f44ead219bd02139e2ca3dc5c03356755a054455748c3006f3afc84c588500f3", - "b37874d8e8b232b993f94cbdfbe4ab96718a27cbf8d9f5ff3e049e9d57c5cd9f", - "07e0b11d76d7b1622efe125452dcebe1bf4f8068eae7376002893713a7c0755b", - "da10b0a2fe40a1975c74f6e996ac9b04f357c074f6062c7407289f39b6588ae1", - "89213041cf673dea11444408b2ba780e28ee7f6292cc1678ee27bd5a57d1e4ac", - "a3c7343b69ef752af9bbfaaa421cf9ebb4a939b8bb5a9af2e2f7ae9b66ad8bd8", - "cbcaee8ee4a1a485cfa62d949643db877240c5a947c95ae6c8ce67428b0a36c3", - "06195438130d423bf8b17f1919cea12e473e1bf01d68da25b6695e41a870aeae", - "a96823a5874788a55f050d0fc1227a253aa087f0c635315df66471d805c0e020", - "3c0016b60cd50f553307dbbc7a37a8e351eb78198e11bac63b9d5eed29cb5c4d", - "9a1370faa4cb5bb5daad8491b7adb1430f6e645a844613d857c9ab3978c30824", - "140631c1cabba39bacd02a7e61eba6fbabdea19e69c788644a00e92ba312acbc", - "ab3de7c6a215e13cf939cca2798208ae16efeb8e1a3cdcdfda756b369f2071df", - "e0b8f8d5da07db000ef4f25c7215f7f5e8f952d4722e2502968c0d8a11014932", - "19f3c629636ae0a199c6a984f9fe2c6a5d984be0efbff5b366ca8f37e7fcf72e", - "31a56736cf97b0838fd998bfdce19fc55cb24853b38b80ab84f8eecb7325f443", - "4aa2050a9e5a46b01ddf9f62b505a6006a8849c982027a7d6d8f0f997abc3303", - "0b304c2571f704fae24e44c82eea6c7b7f5a10589efba9f9e89b61e1721d5c4d", - "941519f0564825670abf023df269cdb4848d1dd8836f64097ee11e9b52507c23", - "ae0a4bbea095a77a2188a4b80296c370944848a057cfb089d67f0ad4c1a6972d", - "c7d4a9a53bb42563567c1a37e7dd2ee88750320386ff67adad645deecb68b5c7", - "98bafc33ddb148ff51ec59f55ea58ac9708ee7431a0c14aa618f0e38601e4185", - "dcd4f3db50a4942296b5c22f3c21daa6fadea8c3a9879695d508f4e06d1058e0", - "bdddb6db7493f13148a8980448ce5cf135c436a17927d8d6c4706a858c92878d", - "a52b6356ade07a2f49290857e341ffa5d64588ea572b11c6be939c187a8d8fc6", - "764028b2767a6975d107d7c1cd8235833b30f8a852b947eb4cbf5839e8ca1a48", - "418667c67214399aaf4a07456529207e3fe1a325c9a7652bd1c6f81aa3b28898", - "bb206a0247ea1227a493cefe46ad9a47c72b1f663bb756a616a70400ab5b7b8b", - "047e253181ff5e259d7324d075f166885284d4c980dc7542b69f7934cb81d38e", - "112a0f2923946115a1136e8d24879795508acc2900d9eac910c8cf74e29fc530", - "e3ae05bc2b63fca239ee7a8af95465b19b53a0e3fb39d02072b6341aae9d978b", - "330c75d3b51990b52f80c672b5a9ff7ee991b270e5d9443ebf8e6a60f3798196", - "18cfc39e9813aa7fa589053a6f9f33b5c0dab62688bd4ef0f58cb102e12719d9", - "f24675e6bacbb50ab468b78efddbd4de66163453677f9c3a644b59c8624f47b3", - "c20ee44653b49b8bee412df17ffd0cbaf5db03f5b01d8fb03e43c79f5be54307", - "b45f21f2787b680ce9b63c079461f1b0f3e5ba89c771a3ced65cf456dd7ff103", - "20d8139824b09c67e69b13fa33651b3d2fcf713e6e11036323edb7a199c74c49", - "d73b0e7709d927fa165b5560fd7460242a4675d09793c44eb5fcc829a1c6929f", - "e75b3d369d3780626625d523e3912b3f39d078cdb84d04c7bffb88e6c8a0593a", - "eff4838e3f51a3d6117d49af4c722ae507b69c26c4e4474d9255cbd80b893a04", - "0b2f76628ada16d142817ae5ae9c490ae5d600efd7a57a5de58bd61339d247cb", - "8e6d02f1efd5059823c01139ca36594640a2c49db279edb79df1b916b88dfd20", - "58da353a6502d545dd9450f8d00ecdd0b4ee5ca4bba67afcc301eb856ee66a53", - "4ea641f6c237b1ed6883aa44d66b9386132f8bdd0acdbfd03195d6f3034ed35e", - "4171c81d5bfa5d90a9a2d7e5dff64c30a390c69249d568b7894ef886a9413243", - "78ee8e99e05c9b8898646931557cbbc218907a9e2762b75620b5f4055e7efd49", - "cae617754aefcb67f84213dd797192f0160be1fc00fc063dadc402031ed6c9a1", - "0a1d4df921031c85bd4cbe9b153048f38dc9ea34b8566ad444d521cb6cf60c2f", - "a37461c1118ddab8fddfb395f56bcf6c28b4b8e546eca10de68e59d7c15c46b1", - "c32818cef92f36d2dcb7feca5b6ec11292523320742f72823caf473ae128ee72", - "ea950bf9f8f225fe259ec94574c8803152c39933745a8278382110fcd38f98d0", - "b3ef75e98527137d3dbc0dac157e7e8184a802b017e2be474460b2396eb22faa", - "74edd00853d7bf77e2b32e87783515155965c542662a00d0e9149f2d98f411aa", - "4875c05caa0a9c4959001f7cb55d8151e9f5e172e0036e89f8258c3d5812a4ef", - "189ec30dddd182f457d7d90bccecf59a4a6ab1837348b9b064aca5500bdde0f0", - "570bb1161d9e366f1adab288bdc3b45f21efc4c9b48fc7486b4a8b024fdfe0d3", - "5b8b7f6bb277ce95b9987f85fcc6f0c9e7fda7557bae56b14b8d56e14b210b08", - "d8fc2ada017863c802521b19c67db61cd3e02ab79e14511bbd37ba28f5e3e2af", - "309fa9a58afba457476ff20c09301019454c24dfdb9d0313c917cb6f4ad9b78e", - "e17b6cc767b37e5cceaa19f40231bd5188143b064de867ca413d42fa4a53e086", - "b525b37c7e2d5619f8acc4721e3b631f6f3d759f263457945f0d5201208fea78", - "dab9bc68bcecbd6166fe8475e910959d0746842324b51c7509a6b21f0de7c517", - "87313122bddb5d9387d513016ff62b3b0637da731ece6e1c6f6283a7bafcb402", - "b21e67144cc311c88f2829717d31f11bbc32f3bc63c919804dbbb36cdace4b51", - "aca7d33f93cbfb2bd77e7933f6feb225906e5f8127819e9699ba043287b64f61", - "42a91a7831c1e00478d553c402842aca326ae9a644f1930e853961b5293f4850", - "052b164ead2e59214aa3cdfb15138139b729b5faa353707786a4c07a6fc3bad0", - "a69cc7ea6e837ad029a85e7cb68d9af337c9f29a12f0cd17b9c0a42ac6319f0d", - "8411c798a19fe9c877fec4f05c6cbe72f44c06bbb2494a4357a944ea1e58133a", - "eab029047388424aa5a19bf23d7fb1d211613331b734fd1436c67041d2f650b2", - "35edb3a13a1bbf060e9b5b3efe1414ab48facb65024b2f874e9ffc06ee6229a1", - "26d5d312e05803443d592fc291c1ffc79cabe5beb60b86d3a6bac93dd4bb5fe4", - "dc7ab61ac41c6f1c125ea6e950b083d47b56616db0b385751e3aac4358455dee", - "c3fcce9cfc5c19b3cbacb4e71e54f24e998eeee45123b33b4df5dc4c983f9d81", - "a6c690761d84c6e48d93e7578e97877f74812eab18d3b0c354ba9ec837e1de55", - "28319c6c0d22bd90facfeb139253f153387f8564ee42282a4ec09b51aa1d152c", - "f7828ae2b2610ea4d758e1b6fb2fa4f5cb3eac2ba903fbd2476966f3110f449e", - "be802f412b686aca26f2c44596be95985fe5efcbc28f801266006fd23785c782", - "4e490db5dd5a84b45e314c090b5bc722c8aa4994135d4034db935c3082496d91", - "13ce2c1c7923fff401cf4eb00a389e7c1c220b312d69a6c1ba9f987db7991cdc", - "90bee9deb7d4b710cecf272a5f7bea08a0b2eab9002be0f14374022b2d1b160f", - "51c9a2b13fd45f51c577fe4ae2639a7af9922b9f90c0aef534c9ed12ccc2a993", - "14e0f462f7242cf471f46a785c8bd6531ca1370abf4d0a83ce16e1365072a91a", - "4b6d63021f7ad9c60f88117849eac41bd0116e3e102f7fde8f329e0fd31373a6", - "8ce07806d6abe2ec0075dd42ccd467fb2a588e833e1d4e9be388a27eb8e1c0cc", - "d9adc7618a0168c141809e7b888aaaf913739eef83fb98fb0b0f183d6ef4f16a", - "26c9b2ff0312f5ff17f5f622fcb3a5994c0b3bfb4336060e15d49599bf9a746e", - "b451fda761f4705fa455cca95da5b81d0602292c8d632df56ba529294dee542c", - "a2d050c3a01e5496b95f438213287da4e8bb28bdba84548b3c9a6c51b3c82300", - "bc29e1a5dfe37d786a12701ac8f85ec01cec6802e18c819871d1f5aaec2d7d65", - "7a2d9379c93333cf5d9e5028d09d47898a6a53e45c00ac18e6db60dd5a312a85", - "43de60dc08a13c90e7d798f2cdb1323160232dc26920da83c3f6ebea8e54a373", - "c2430a0240ef94f9a7f2e43e41fb240e4d18cd03aeab8559d3dc0df043090f26", - "fa71bc644666a345aceeca3232c37b0594550e099d332ea23392849ea18fd0b3", - "47286051fa6a12eaa95bce76aee9faa5b7bcccfc51f6c842ba49b315e66991cb", - "07b94267f48b6b38bc18ab2db3b85a38e514166f24348cd09474e34cfa61133c", - "a09f9c1e58976304aac10c26fdca349b7a246dfe276ec238f1ca667626c0409e", - "b489252fd6d7e0986a2e6dc1e670d0ac604e673c47fbbfef48ee7878c6018432", - "2c584ca1853609af365cfb5168ec9f770febfdf8add5d0366bf253aa3be8989a", - "23f8b757bf111d0ce143556ce26261604676f4c0001ce76519a402ad5f436f7c", - "21c9550ed8a7a7bd5aa1bc57d4fd4e881342cb495f6fb49af3b8dd39c224658d", - "7879a685e57facea9ca1ce2398efd23b560f9b906e180fd61d1cb7008c3dc5ba", - "2241a5a4d1979452ed238f89dee593e79fa2226a2ce5da647497da5bfae8cc0b", - "df7fbddd4c10516b67d8510e280ddfb042b31bcbe278dfe8d526381e0662daba", - "a8be61d8ef7174fda3b5f653bfef2c1c8d9ce5be6ef72edcbe05ef945531cb0d", - "28db3797a34adb755c3ecf3902b71a6d22981f2a9eb69d62d45dee1da149876a", - "4ddb8ddb3be05c864a0be349f0f4617a495484972ef57579e511b5f6dca8283c", - "b3a65d717336b8fd8faabe1016ba5ef7ca90afdd7e83ebb5fdfc65cf9a6df631", - "6b338e266292bb0627de9a342388d6e1ff51fb8a7ae33aee97dd4a676292fe03", - "752f1703f3558ca893abe9fd417cb30e7b0f53bcb888be9c7406d798d3ca8696", - "43b3b5822d7559090c9555ad80d3c2a093891361f28aaad38c7624a0ab7ed23c", - "7bbf54c84f78bfab49d605eb352321e728684100671b49f274b56c3ae287fe39", - "ad46de2a84d1c86e88f931729a55ec17377a5093ea39b7acd4f859ce382b8923", - "96fbc64408ed1c5a1cdc0417065caebdbb7f6d45485d821dea29beceb7078013", - "ecd040db3c68d338f645cfd7bd457e3a72cdff18a160cbc4d4c96636af42b3a2", - "5f5077f107fb59df808ccf59309b8273fa84a6accd38fa0a80a71c38da1d1a85", - "037179da75170ca53f9f26c57f1505a305e0e35095bbbcf6a83b91ccf83fe07a", - "50a3370446601b87f4a66d93fa657774ed1d2b1febfc2f7673eba99534215637", - "1ebab9b2bb6ab8f7da7e0138dda52c4d8d8b8a0a654a351d99a2e0b14b38bf02", - "9264e33502badbd080c745b61985d2c4f3bb39f57e7a1e58c99188923e9c9dc1", - "f900ae24d2f2f7dabb4ff99770b6f843f0cb43559f094fea2b2d7d796cd4478c", - "6563cb58d74219f2fce5afa0d95626cee55421b1136e2226faf0d473709a3b3a", - "b3e309834694e72cef38729fd4bade1f12646ee1fa35935ca7dc0cd509b481ee", - "ecd95bfa621bebbaaf665c56ffb2668cae0c9c9afa75f5e9e3981cfd3b352155", - "52bbe637af6a2735ba411d201f1a9291653a6f637bb7d45a07fb3ee75abbe1d5", - "078882d81bf68b54b8660dc5b67bfb3540e7d0ca8dcc2f2f698ebf327ce8bed4", - "fb38d44d688d7a4d8ec46f374d3365f163f1f56532781fc0f43e9dc0eaa56659", - "a8f47a2ad577337f7012657e8c24b9d2fff3e8e0adc04a7904c6a053cecd2140", - "1cf81c68a93c658ec63cddda74fe0c40ddfd219ea84dbc600f6899e7db7e78cd", - "bee2e0c8464efad3c7304c22707c0862b93da3c2da66893eb7b2af65afa6a5a3", - "5e5fc3ec0fe8005418d6160ac5f2b3594a88ba650a1e350d576483660dd491db", - "aaa94feb44b273a920f178c22732a360d0fa4fba62fe791a6cbffd333d3bdc41", - "02753b340193cfda00872d04d1e67e3c7e2089d92c17303c4570e906c2341191", - "c183953154f690696be80ca0bc63654dbdf106d4d53fddf0a1e7150b10309be0", - "61fbdd80f89e2119672dd4ca39295dcb0d3f4bbc1ecff1d695a5a2b40091056a", - "4dc000227e21fd2513053a0514d894f58ee419db3c5d3b5c130d0c7f698f8e61", - "6fe4dfa7e80cae00eb409018619ca943d9ee68b1a27ed2f63eb4f59428e5e340", - "b049faac0db0fde542f8c28b78f4ffab2c22b840895f26c8175534128e239e3a", - "525d57efc5303deea4a8ce7a01dff53dd4558da8ea98d801ede62ec8c42eaa58", - "75523db0da2c7127e737d0d0bcd923bf3d3ac8b576fd5d7fbada83b7acc5cdcd", - "2230fda76d38b099edfd56f8a615a21cd49066ced1c70f250dc1f74d48c465a6", - "2efc1c74bc4023e2af5547ef45564b88b40a3435fbe7d54b915e709c110c4eaa", - "17b4e12869c34cb96ec25fc2b63e175a3608fdbdc2bbe993aae47668c1ded34c", - "f55208a64c2a85116cb2f7d4fb75799da3249530eb2997223610050ae397e1f5", - "ff356af286d52558ee90186b8017c0ce4be6b53ad77e8c5d70e9ba5f9e03fb1b", - "a4697fcd908fe1b24df3f52de5fd492519ff3c32ac9ab7e768deabd983e25af6", - "e3128136797844cd291eea7b041f84c65807698cf7496be366cd93891c565159", - "ccf89d5508122a5ebd5dc721455d0984bd875743ee14fc471498f2d8f9b3d331", - "9aeab522e820b9632f888efc249ad853d518ee2a84a200eb011778d64d32c707", - "113723c874ee5d5fca5aec1f1223625a8a9cca768b2c415b00c5897634f32730", - "8893959cda9589b5d56402b1ea7a222ef73bc474ce5cefdb5e04ac673e4ddffc", - "d7667a96fb50eb0d748dae3d49a6c299edadec96f1cab7b690a274e4947799d4", - "e293b1bbacf1059b8cceb3c86fca251f3cc9b00d71065d90c37c3a70af840b30", - "69a7b0393f4a9da696c3d8c776d9928018316e8b739f4b7bfeeaf0a20b6c320e", - "64c9cd6ea5d619145838ae9f9b807a21b59c70468a04b6005d458fb163d013de", - "59304d78548bdf399520b55a1d5ed49de3873b06d78e775abef231cc1caa64e5", - "8708dc5d7583fdc4788862948787f77b8f52978739262f7a020115ba32992cf7", - "90931ae5ad5986b49408d090f5e3ef2c260e28659776a9686bb9fd2be9acca8d", - "a3c42d9aa4d56cd2f05699ddb6f36a313897aa2be71c7d91919b98545b11716b", - "87d57fe18e80ce000ce978b7f6c66356d7df52b6ffd52ed4e9c16b8729a15fe2", - "c3db7ab56d65262cfb0f60232798ab263b2092136c4dfdf8445a0e1495b434f1", - "24915f401cdfb5c0e336b54b63e659f397421ac98a762e26753472f49224a8a0", - "177bc6b057d48cbc74a95993993a110a319c6ee60a4655d61403e66819622ece", - "8ae9eeba691a7cb0cfca3a04f9a69f166f9c33001079799847878e31f1eae440", - "b4bbdee5570a75dd34aa71a1c2e483915021de1f43593573799e6521cac5efa5", - "959ab4bdd420e3591fe7988b9a76381956d4000f917c472affe3667b64b6b3d5", - "3aa93b335d1793486152593ca420d842dfe97dca2378406f79ecf3a3d9f99c05", - "f52b715d3a2fef03b94877bdb7270bfb022663f97f9afa2cdfd7786d22bba1a5", - "bd812425b5fb1ca785cff2e6a26a93da512194a445f8a217769d236288081916", - "c2483f07fbfbc9b9faf5adea4ec7fbe0f8dc7aa0af4291491f7afa2a1a86660c", - "d190b6ae7eccbb2cde24f8604cb0610d41afa3ff2ecfa9728fb072abd510226c", - "7b6144cc055de8f91fabfe33b9fba2a07eb6c07a79c0953140dcf066dfc9845b", - "176f090778ee969246289683e216ea732029f5836e9f90077226c90d37822f59", - "b4d9a7c0768a65a4ce0db53b2f55c4928165164336e18ff4c337c7b38783510b", - "8383c84763a72d03a9740c500e2e792ddfa8634e5646e7bcfeebd4039aacd69c", - "000b80d03744f7199c7b26454472397cbc9db5eace22f987aa277bb3c3eccb84", - "8309ee84c367e36e64a6a59bcb276da409af06fecf9af4672f16dd6d2912e762", - "bf7b1f866298d72d80f5b7af37c74a9143680010a33c11e8a8729df0409dac15", - "5c9cb8bd99e9a5bb42550fafed1d470102448f006142c0a4e4e9295e3e02415b", - "11f90beb29a710b11b3cf2cc7ab9d938d04f39bfea89a612832c4c77dcf0641b", - "d55c29c4b4e8de791cb7c55fbe3399ec9652aec95015142a2c3a93c975ba7ae7", - "fe7c83cd60c59dd8c687a720a9640aa269b6663d84b79fb151836aeacc922633", - "d4327128c823d43c80cd4ae96184d5d6666b8039741d096fcb918edace806000", - "06c617d1157394905bc2ee372d7ae51473252cec7aeb9e6c8c6815226afde049", - "10bca21df20a62a75806cf32e61b0dc57a606eed2f84f7e78f2919c8bd8207a9", - "52da5b4a04d7f70bed8bcd0cac31e536823a342ecc0ddb060399de5ffedf326b", - "a00486f725031ebca5fa36f32db8bf37d8544829e1026f99009ee345213f4d0f", - "e78004a1213d2a879ff64eef2482cc495a11eeed838c744c4b93b1781bd22f51", - "a24de4ccd5a4dd3cf032ba5a521d8655d2474e84f2f56131037d68e39e309e8f", - "8b303dbad7f01081d92ad9aea5e7cadb85cf6ba514a99a0ccb035763ed4e7d47", - "3455942e7ee140f9d68ef98021693dc03f44c8d252f5e06ccfc778d6957abef0", - "5a8ada1f2664a743433a8c8c60b15422492c02f7d5981908ed4959d63e7eeb82", - "3d7f97baaf6083e4a991bda25febdca85de0d2f51ebfe09f7ee293345e9c15e2", - "4f04a7c1ba81d0b978d0ee666441f26dda7f1bdf905595d691537ed9739adf45", - "f942aced5a1ee03c2c276f0b902200fb311a938667b748cbfa82701f769aebc7", - "ffa0838351399299a09126f0c6a6d1b7f89d1d5aadd6520ea6722ba6d8d527a9", - "6d85f28311836ab7bff1d029e2d6f58e10ec472e507124d8ee0d9204b5efce42", - "7fc2d0d79697cc7463e8e8f82c52f2259a3124831dbef9552098c11a4811a1db", - "636d64c3df16f913ac0302872f312c9c7f9ce847836737e35530021995cac247", - "9cc8864fc4f0cb246bd3c30d9077a2207ff8bbc00d64d6f42d4f0452bbea2742", - "901d0b61874aede4991cbfa657046d5a3137792325d126f7c5d8226b3a9485fd", - "299c2a1412f86895ddad1a0edc5184319e9f08a1f0f2432a55132b9d4f5c58a4", - "3fa430e01ba37f71691c8ee121d06b99ee76d2b39295e3cc12f23031585cd5e7", - "005be3d454ec67d89111efc5f1d035ce997ce24b08f41e556c3ba181fcddd30f", - "65b5d2af6f1ca48f9586ebbbce165cc113e0a9757e930578e0bef7f25f67efc0", - "142203e616651bfe0b69e535c301bc62cee2b093efe2b143841e4e5f2d91ab10", - "7ce12a53ec9dad9036f865abd03d47cc7afa989a79e98716bee37d20c8c01a00", - "92f3b1c1275644731ef7a3df64d4b086dc2da83061df0fb7ab6e7c94a151b2d9", - "8926625e5e6a0afc53ba8bb57539504fdabf2cac38f4e2565687b2ba6bb61bef", - "1f2bae6fcc04dfcccda01f10ca18526973ab12f5ab3ba63a7eb1014c3f771751", - "20a0081125d1191bf17fac8697027f940f661063e5b0298ce3183c4334ae2760", - "76d02e91255ab96648a76c0ca0d1850fde17115e4175530ddae5f4356adcc558", - "1d8db9ff76dab4e15f8cc5178b3ed5ad0dbc2b6c7e1c94bcae08634ec8008a02", - "0dcb8afb4c405c591f3725231abe72cc009294ebcc5f3f1b18e08c94bd94d867", - "e7a93187a71be5b919aab6b396e3099edcc64095961dddf1402c7456ee268619", - "3347b21610536ac48b5b6375d7a1c9ce70546309987e582c47260236ab79d82f", - "ac29fb1dec906caed3baf923a80a8f85889f5f036638e45ede8b7f79a967f26b", - "cd9c32ab5599704e34549216c74c21278ef984edab7b7307b67402175371e5d6", - "a9cd770e50cabf68f6661246dface128eca08b563b5511eeb34dafb5cf9e4932", - "cd117693c2ee144c35d34c9b85963026070ec7b86bbd8c92835636e0bee08817", - "e94d67e41010bba49b80ba1e78b3ac992dc209f930f0decafb71e5cf58589ff3", - "0d5e9fe0e9e8f3c2ba7a4e76a79a625e31a159e9948b849ded3cda9e44e8cac4", - "06a29ff07adf11439c226baad7a6caa42d9034eb113d15519f8af8f297fe031b", - "4015ecbce9cd8adbec4abff0a307068f8f9f7d97f6d8797c1cbc41be9b918fef", - "1e5e832124d2cc87fc8cd97e4a0bc722deb6ac4f15034fe20fa67fe7ca84f2d2", - "91085cb6ebdb2a0808514ab66f5df62e6f7899af82ded8e3ec41f1d0b58d162f", - "27c94ab26a86b7ef96621606bc5190a69f005d15cb16b69851f50e4ff9e06452", - "f46958bc28181208bdefb4989e266899f7c74377a0f7cc89163448ff036b4b3f", - "b98c9ea2162bad874899b013c3cd423967936c55dd196f0ed5d1f18c44fc9931", - "6a89eb68cb75df0e254a558ab35aa845b7e8bd6ad45bad65520d94868212b77e", - "7007c44b46d12b6c06a199a94fc195688cacdeee5b17851e435bde713a714b49", - "b640f3d77a0c61df332c12b7d7534499c7e20e996bf53375c770500f3a6f848d", - "eb7942d75440ba6aaa9ea358ee7d844596cbc995952dc88788e9332955603fa9", - "7b9102150f04e5cbb050a2d393e06ac82a175b97637c61a8575d95d92fb2fa79", - "98ff43046c5d93d091712c9d8ecf7465ba665f971456f55ccaf7b9287a34d42b", - "4267baa98e549c9a168fe914cca231fc9b6b71d377bc9893b1ce0b66794ba0e5", - "54eb97108ee39c96553cf12767db0194a3d6c5a10b86c0cd85be96cc105fb262", - "46e7c2868967c5716e6628bde3bcbc3a0453ad9da8b67520b8f17585bba8056b", - "8ae08624761ee2d5bae11d243c72fe7172ba63b14f00f592e0098e1605edba9d", - "f0e677671357881984d72e702a1545747329f1afb972daaa7eff9ec32e064f68", - "e4f9640c6d6939ab93aa28d1158481a01a455bd337b508c5227fcf0c98e8a4a4", - "fd0558e2ae5dd598d61575758bc4d8ea19ec24558e5d03fc738efd9bddb75cc3", - "55c28200928c8653d45aedd0f015cf5283d426e5fb685d44ece6db108ce2c7b4", - "ebe07f5be1a94d7387280bf18d4bd1872b21d690181c602365bca7b819dbd5fe", - "4f75bb95846dded3073d44226179604613c56e3dd34a5ee817c831451a4803a5", - "77e01bd11c9188bcd2f20b67a8fed6526c6c8f141e59b17737d8336073edf29f", - "b3da72dd01febe4dec497d16a3942d0fb2974c2f6bd32262bdd31dd1e716c761", - "0c5bbd6fec21be9b870d13742f379db1e0ce493af10a951eb4715f4fa8c925ec", - "8f68905920a6d40f8fe7c62a3f004085584ef845217595fe4264580459dcb631", - "c5543a9a61de784279ae4c0108b7c45bbcf272f95f2a3f7214f059393be3a71a", - "b66d6aa26cefa72047de9ff37566e1ccc88a5a00d5516daa73d7485fec08bbb9", - "3a14175480355a6c3c1856117d6714531e28575c2cd0028456d2a1e7d1695902", - "c859ab1230762e87851a1e8c0a8cd2cdc7e9d37b92c516f43ab27ec821bef40c", - "380ac8b33eb54e1bae62bf74af62ca4f35f3858ad06cc18563381a9258d0a206", - "694cc1a5cb85ab0bb89c536fdc8526dc1dee2cd2d36281ecf7d9d02cb0a12d96", - "2429a79da8da6014b50170694123f9eef3e17133a4ebb7b480a311972fc53dd0", - "7088c525c8f4911173667cd7914513c1c0a1e143be5d408d5b30ea28213bdfa9", - "98adc87ccbeac86532c156d9b5f4ba3187f9e17f404bc60df326ad5930cff198", - "b3d9c3fd888d841f06592259101a99e5629bc6d2de4fe5b191918e1578b0eff8", - "0baa227ec586e209ddca1da86f0fbfb440c5e52eb9cbd1f52629e90ce652ef98", - "0f03fd3ba35a65d9b4fc2a740887f60822e5c956c4de76156a6bb50dfb9ab553", - "62982b135d6fc84a3dcc0406f468270bc7dde717b2bde943cee12c2e07693f19", - "2528dad46d31d554b60e08f878aaeba0fd89e723a315aebc83852a89a07eb2a0", - "15c7642215f5392a54665c373ce1a2145c362b93af2040d1b3eb0d5d02f0d6ca", - "c2d16ea311689a8f9316c6834c91e02b9361a5f8ddcf0b5c833a8e7660a33ac1", - "88cdde227d5a3a0a250e02678a740ddf929e0a8dd0a1d394958d6719fa5e0f5d", - "7f813d1bce73460c52f9021959392f0243eb27f66a654b1ba317a0f8449f2398", - "842d8f1de3e214e2e9776c05e597e5cae1d95966724a0c890e8682fed884fbfa", - "fcc0d1f6aeff02067d955edcdfdad6bbc2738adee916c4bd0380919a71ac38c3", - "89cb97af9d96b724e658420e8371d26260a343b7ea9dd8e5638a40ed5b99f2ec", - "1a96b22c656f748a337609ef16dcfa35ab2f0b11accab27f602fc4702b7c910a", - "285fc1d2937c524e54c2715afd4f4ca29c1749f412d1cd42814a5fc8ea3662c0", - "44c886acb554039333376a9f6656ca090197370499ba5662f3c4d4d3f08fc319", - "8363e31fdb7898589ef45f7ee51c3972287aea2cbbeb94c7d75f33e661f8c686", - "879c0a63fe587d141121238dbc95c37429cf0542720d578740dd3f5e7fca82bd", - "a787ae5089cf75245e601f6bfe1709a8a64ffc4a9cdef39b7f7c239b83a01d99", - "675fe6536f694fd3cf53e29f2276abef09154c965b92d3aa99d14c50c44298eb", - "45fb435d020cc1eed4e3c8fff577d830853cc6443936ff54fb100fe17bf6e17b", - "a23ff443070e1d288d88e9ff4f40c82384ec1c4d2067fa73a75b58f7234ed3c8", - "b37b40a406786578685c592ed7edb821351218b2437b4f9d070bfc9457435ce5", - "24b9f33d62ae09c77bed88dfffd09f7e82560f7665026c2daf1a33ff0ddf947d", - "83b8f97c184bce5bcc9b29371ab54308e5c1a0c4ef83b0445074d9790a2fe5ae", - "c537d1948ec86f8721b378f5fb7eb7f395e9098e9fe886880ba2087d33bc3b22", - "bbd5ae3291d29437b7166cd97620e591ac54ab034d4ac900c3bf703456530c6c", - "b9be25ebb16dabf43103f65eaa005065b3f42e24e2de98e04a9751a9bd2e234f", - "4e83b56c6180318eaaa5ed3d49c9c4385e02c261e53c26541a88d800d19ee0d1", - "2bb3a70e48097791ee989e13d47bd56d335cfafe8ad23a83ff22aa5a5c0bf485", - "b6a72395a1c5d86fbdd524e65946b145dc14360fece74afb00593ea18aed7c60", - "b42c66429a15362f5a3e3a909bf32c44ceb82f90cd91fc1ba2fdcfec757836ec", - "a23fa9145a058a86637b933a547190ddd71d3baf1d355f1659ca014d12d3416c", - "1905c80a2405b78c66c3aaac7b84fca3bedefc0eaffb827152778710cc3f5251", - "6a8ff71ee78b1f2ccf0178204257b84f21070a4d20e066c7a1023c05cc6442bd", - "b8de03619998814fdade77850d4b59ce425f4ca83b28ddd1ce15aa7e6c8ca142", - "651a6d59e0d8aa85a1247013c792cb14540592029ad5b84ae82fa4b6b8f12cdf", - "5b941f82bac038c1162081b953084c0fe6f60e48ef62ed8e8f30e68c03a737bf", - "ee326acb9b5a0e78ff63038303638f267966cef0d2e4ae283b9b7df9b3998d3a", - "3bbb0d6a3bacb12e7f0775d4f667cbf307905365761168acad400fede77aff73", - "bf787bc7a17b8a345ce24e0ada573fd5e3352b51226c22a14c3284176aa0f98b", - "8f5eef3dd0fa4524fb47eef40ed4e4251e9e1ab39a5e191c5b3ef861f650e0ba", - "f45e69c35a3507086ab24fff17fcbfa89aa0af128415a9597e5376d758f8a1fb", - "d6828c365a2fbe6ff6206441843841ec5daee2fc6f86e47c40b89486be3883b6", - "1c69b36d71734457429646a06ebc67a1cd825378cf1bd230606cb4898b94f34a", - "8d517241bafbf38a2ba65bfe2fd3742b8398920340a9df51b6d60d108aa8f6a5", - "a0f5abc345a3ddb60a17df04717b3bcbb7c7ae32e12216b48f73d373fcf6d192", - "626513c07558939a687f86d56d68137070a2a2d2aded0056fdc06a74ba320941", - "79b08240fa0ab373ced309854cee7e55656a7f9d2e3b727602d410fb652a0ed8", - "be3aa9a5f315d69dd47ec5a1b11b408c8e1fb19fb4c55fab674a285c3de77fd5", - "c7b57b5ca138eb64fb18bb7f8adb319b87fe6be29df5710b1664529086cbcb88", - "8da9bad4ddf176783535dd90936aa8475b347d0dfab2c90f6dbd2f093cad5cb5", - "5578ad88524b90c742585f740eacc9f6f6917347ea74fd83ed5f596ce96f8368", - "208756d2016c0de769bb1bbbcc90f3cee24662d4ff7a98c681b88db7cd6fea79", - "9d51d09f43ad93535507cc85a5b3ca68b42dc35b00c7fc0dc7fffe092fd1f8f1", - "7f0a9e803d24d79747860daa659328d9711e4fe0d15448773e165c1f1d8cfca3", - "3d42bc8053bc7defda6ad15e8b662f36840d799bed693a035c913a64bc57037e", - "14f90e75ab287109d3f907823c0c9822e04a919cffb3f98aabd6d2cda08ff1f0", - "f9c6fcab2d6d8a8e6c3be319e69e395b3a0c82f17267252d4850ae7c972a4156", - "46a06a7be42e65be7ba16f31d3b542128ce7e5a04ff7f5542bb25d303c481eab", - "214638e9772293b8f38ead83bdc4210146fab49cb7c7b8cf749ce2af48c54950", - "1a13c18cb70362c1f56c44654f849401e2ee3c49af3ec45f361d164d542a8ec0", - "42cc2996151b5aaa5b06ab2a477a5e7ae36a626aaa0d36a8ead243dce6d51f23", - "e0fc06c2ac6c14e33d0e49d38ce9ef0fcc170a5b29b85cca4662d7367e9acf03", - "1bf8eed3786ad3bc2a32a255127c9cc15a33c093451d5cd2ac085fe19d08e429", - "d475ba7a5fa2b345e9c50ad9118337dc91944df3c953969412b2e89047cc7869", - "88d992b6baee5cf0d88d7b03a3177e602a737c1301096b42fa4d055cc1c31412", - "93d20029fb0e5cb53f7ac5c42cb3d5bfca414b8d2e525b04450ad09dad7d98bd", - "f4f59cc0a4827a85afe4a99f0a16b283b717fa831db5890d2fcb93e88a84554d", - "b0500f18a39e011dc4286ce1615507f060dbfd905e492ca16c8b480b82ea8717", - "ab99afeb0adcc6127b9a82814cfc5d6f4a6ea341c745b2f51f87a84add2940ab", - "9694c80058b7b571901da4f4b5a3a582234ac0e07d73c6c94d6fd6d9f69e47d7", - "3aaf862317a26b1b7d1897659ef4e210c3519198953dedbcbd0308494bddc2e9", - "e44dead834b459a858116a0c70005077d9658c9e972e04afee0c95c52d7f9405", - "2b656a7d7c2ec586006e8f1d3ee1d185a3924ebf7a680c92e4d69c5a824ba9d9", - "e895572b7547c0ea4135285e11e1ba6ec8a8407721933b213543e5698721ab93", - "32f4d328d5297d36a8febe67931f113a3ba90813acd6aaaaa63c33bc0f2149c8", - "5f0d2bf8750618e099ccabd67fb8a9764b48b5c73e9631f5a0218026f9a249bd", - "d91bbaaef6a41cf04936177872cd7213fc703766b3b69ef037fe57b30a75205c", - "a72b066fbc46636354fba19c87905b758ba1ae4627a7998764f69c148839bbfd", - "b0ae018b720f30fb2c1ed60792226a27ab1be6208b816159fadf4bfa02295336", - "eea7cc32c9e1cee682f15047e4ace92681bd07e434bdebf6ee810f7e2c3a4d87", - "b08e934d3077a340d8042f5864a87cd839dbcbcb22c0d3e53ab1dde760c0ae7c", - "00bc7c0d27b9770e936f451462c52596c06a638a9b49a15ceaafbc89c30a8f24", - "2e54a1502fc28be965b606b72a1aad7c2d48a1fa228d198c14a239e36875b405", - "85da33d3c9d859d95ee884cdb72de620d004385811a4cb5a9aef5d4606e62b4e", - "2cd3c44264a9274af2dc80c46bd1892aa701c136e07f1868b914e4d485ca64a7", - "962963e25466746174d34343956c127ac27c41a8f914b943f1ff663b0e29c0de", - "37056e33e725dc39b1b18c15691fdce1cd59e78aca6a78cbdc58e2d973c0aba9", - "bd8d0bf656fec1861296967820ef964ccc39d55cc647f581d57702e085cb03c2", - "90915f0a9605dc0de3ab0d9f41763eca95d35a76d3caebbf9f91b46330ac9ebc", - "96cc01379ffb388eb7f687d34b3eeb2206f254eb7848743385423e91d394fcfd", - "3fc30139cd7b300749c6e57bcd5cde1915682a2306ebe0543b3bb8c7114ee9a3", - "586ee048677cc505189f9155a1d149a63c004405ff1486b54cba936089481a3e", - "8c2d237db3e345b9e75a4e94dbaa8438d2c3262c97e3a15725da2c94b4277a5b", - "3b9dc0bf098981e4ed8a6b0b3ac27d9a6df28086997e58aaf8618e7ca076affe", - "c73b72a9cb0bc2ad6e51aa6175d771e0f05898341cc16cff692bdca302ccc92a", - "02f9afae8e99459bbee5da645cb862fc6363b44c5f5a2b450da65374a3d61ce3", - "94e7d1d4ece74d138f0a82f32199849f824cf621da604ae7af5ade6566db6303", - "b8f6fd24b4828df98679ef3308d7e36a9c1a5f2b7872aac178ceb3b270197879", - "1804edbb962ef8879c73a5d8c2f033954293676c15aa30ead6db69bafe9545cd", - "b251dd1278e3c5aac481d56c9df637d86b6d0b630ea7bf8f09479d2ab24c846d", - "1fc82b360e91755728204dfa7b5f6c0a393f6c4d3375c92992b7198dcdaddfc9", - "a4ec36210670e3335b951a75e220b081cdb847c77af1ea00a1a901d99a0979a9", - "11957d204957b0eb20df7defba55ab953acca6775f08876a43ca1e6d8936dfc6", - "2667ac83ddb355a9d74a4fb9c98d401b1102f9c74dae1cce264f8f0088f91bea", - "3cd8a8803671361f1265fa6aab7c26c85b02165ab80c973a1a308f9410132f18", - "dca1895059d6563ca5632996efec2f9f400065382256c48b935ee821774bdac5", - "96f4aa21e403736b800d81b19406c156e3a198886529ef3123e2f3a694e3a3a2", - "e44242a20e7343881bb4e1eed175a0d2f92c6876158286d342b1d93074d0a0df", - "ea0df84a6158341c8110c3b19271fd323687f454d8fefebbe2a5324ec7ef093d", - "03c4181530636f8996decb16c0a65e213aa79319cb0c9b572b6c0e86a80044a0", - "b39178354675f9d7658ab5dd0e0276ed55db936d7b209dd9544fb45b797e7fa3", - "ce2b165f12e287c6037f3098c7d1180cc8183c7691b7c8ef938a693c74213f27", - "2b896cc4c8d50ec5428e030c487135da99183f9417a5f365a4bcadbdc1839557", - "a374aa502364ccc40eeb3f2f5b7c1581fe8a2f66ac4265bb38404785a9c42a20", - "406a90128163ea40ddde5b7be802dd1e4fd0851527b1e3c35773df0018852222", - "b3a29742e882ac3f35c5b39f062d7514b95e6a96e666531a9df847861dfe8b74", - "dd895f7ac895cf0f7ffbb97ecb02f522721b4673dde7d9ea500bc006c5bbdd9b", - "3893c2444a7c0f7f38ce89180d5b808f4d44c10abdb94a35f13b9315d6aae526", - "113b15687eeb2ee1ddae69d078daa9d446e73957bcafafb524356c77686af542", - "e4a1d5f1d258ae6a80d04303e1365252182d88d69d4b80f60e47d272e25a16a3", - "3ef9b6dbd740e1069ed2305f2c2d61f62e5dbe04be942971041867c12798f003", - "b880c7a62638391803e2110ed03f78f214fbd01060280737958554b88e99af16", - "e424fc5cd81a4f37c82f7e3485fb330498542cb0d8aa51c06296ea7b820c3043", - "79d3111d6fdc8979b9d15e56ec1b724c8c7009ff92e04d1299a2acddd1bdb061", - "2601dc78468ea0000caf4f4c963df7a62947fbb964f0c2b235666b26ab82e370", - "8c7c951f07a95d071fe46a67714566f459c3c26cc8d63b8bfe59702decab3345", - "4eec82f1027fef695fae14a58fbca23be5367deaa46820d73d3d8687c71e6cf3", - "77e3562b0595d76aa97e07800196c0bc98ec6c7a51949ad2da741c534f6a23fc", - "f0e72fd7e4014db624c53da56635fe0fa415eb2e4f9bc575b25d148f685f3fb9", - "8ceb0c6a1df13b152eeebe884f015b9313b1796759f3a0db0424b6d3fd40bb80", - "7868d4daa8044df8c3d5af53d5b761c713973b903f2540acc9184db779a5e887", - "05e11dc3800bcb2dfcad54bbd0d2d14c3362591b99a6e80b087c488ef0682243", - "2591870ff437847804855dfccca274ec18d0067976c411d6412a815e88fdd31b", - "8355a560725748ba5b856e5c5329b01de66c2a9337641d0c607946e61703eb7e", - "44ef53ed7ff3a28440c3581846abe3d744d70905e7d5cb81a80477dc7800693a", - "748bbed976f9bd01d16030138ea4f444d2e409accace5e9dda649f91d498241f", - "a5fc2baf9525263ebfff0e6d5857d47a90782e3c9d75319e25d11205f98b90ae", - "1b483944c8d3e0c7d7e1addf430c6ccb1b3c40133768df244c9e0cfc14dc997d", - "4457f15a8cdbcf4c56c4392312c5ade1ae195c88e48a2744b65e02529105882a", - "e77ce9625846f91f2f62e2edb000bad0cae4b152d97f320ae8dd2f869bf04c90", - "789779664fbc31f6f192b4710cee63dc1380210fd28c36d25b7064bddf9c93f0", - "39e098984c975dfa4585b49b5b4058202e2b679a1fe522514d38010f05233f13", - "72e8ccbe4cb1c742272b68e1d9bc06082695ca9ea2966342f0ebb369d9345040", - "4d004ec789453e0438a6d26ed3417e05e6a23fc620aafcf6ce85f2c7794cd945", - "781ad46aa3dd498550ad753a87acdd91010d41f17612634ddfb57c4cb58280c5", - "baa0569a67bed232cbac112e01a03afd8c70d8b1ddaeac62e71aae0346752992", - "440d28421f949c204bf98612ff802ea73c738e989b98b55f858381bc3a1d2cd6", - "0b84809bf2eda595246bb677ec96734854a9a0b2de15dd31f8ecf64a96c9ab33", - "bec1b63245ff90e421a9a95b2c626ba92af605469a10859fb9cf4b3db0c7a67c", - "61f9dc3dfbf81a15c71fc48791267e8d89e7f6da7ee0e8f65535a27bc6c296f4", - "21691f705d9cee011b3757f7be5359f6c0e8af9a8e1b812e9303f41ad05994ce", - "4d766586be19893e27f28006920daa50c4bf80442fb1fd619090087b25172f23", - "69252b7e42e8386d0ecf1c44ad03ec3798b37b00ce2c96b7abab7b219d7f720e", - "1996a8a188c8ea187a0d6176c17e84617fd70e67b61582882deede62d8b31bf7", - "099711117287bc684bfa3b569d8ef3344da2647b608317e648c74d24422c0df9", - "3c64eda501c0b22536197cdd1708cad31fee83c4dfb716d3a734511e36d08d26", - "1281ceb2ef1011841f60a375c0aa6e635b527965a323f3bab8580ca2a5f4ca4a", - "824d0d6aa49b4d69093165c4fadef8be6aa8ea2f74982fb99e4ade2fa754fbfd", - "eb67f986f6d1c4d109727a33d733e98ab13c54e67c862f3007c76de05630080e", - "15bc5fad30d098f72b840046d685269cd558724a59f80b79628ce81fa16d5f0d", - "77092e619707eab7a405a80cdc92885723afb14086ffa3cb8c99f21c7078ed99", - "ba1f39f6ca6fcb37ae341f509a6db8968925c86f43b76057170fff03ac48dee6", - "ae02237682e1713af8def0af8363d9358ee1eda5e670cfc47bdbedc8f677d35b", - "5c72b6892fef60055e6181648cb01b81a863a2b23fa21240ba8d51a689b0d468", - "691407cf4a7f6135ccb198ba555add1164cf5a2305e1a9d0a44657313ae91280", - "a5e4a6fee1fddc180b87cb9328974bade5cc078313a7e0173cf13c912591f13d", - "bb61088b2cdf009c3c4cdbc25a9d8a178c011d868b2024cdf2759a3fdcb5cbfa", - "e41dba053f636903dee920916788bb4827eab658f70124d4e9f80f7fde3daa24", - "f801dc6ee6232f9bcee3f984059ba681151c9052bdc42cdbdb7cac3f17c6fc18", - "66818353261d4a1405323d7d1a1acc3204746ed0adcc9bcd717bf1dd2492a942", - "d59eb7291cc15ff3eefb89ce9cff48304ee1aa25430454ea3980bcf1b24199d8", - "f276654c2fc65e5b33f6eaea1b04f61acdcb8435451f5b50a1708f9ae23abbc8", - "cefb301753e61ce6585bfad1ad0ba237f8224aee7785acdd0197fc0a4747626d", - "329d6139568dc8ffb27a4684a27cd01703720475f3fdcde43f6642534a8f3954", - "7ee2ac635302aebef558bfa7380cc335997136cf84dc41b309996c71322eaae3", - "114466ed436dfea80bb920067de9fac4cd2a809be40c8c21998297f4d6f484ea", - "09994091d0dcd3283c45fea49646f5df2c69e7c34cb1604b9f30860f1c5cf734", - "7335030b8ebecc88b4058ed6c0d75bda233df725a0da8010c37538d907db5daa", - "f59aeadad8a1d22d6df3d231087280df43cc1849cfcff3f2bb59795ed3047221", - "e41d3baabce8eeb92a5a422ceb70b3ed678692bfe840144986a29f490ab15ccc", - "cd23f1b96ade55e5fd652c3287936c9a96ca3512f8f0d965977ddad07f98ad51", - "fc280b0505703b8d66f8636434c694e9155c13f220aec1c1406383f616e3608e", - "0cdbd145d9153bd69a97ae74602e1a6c6844d1edffc17ba9bfefb38cf56068b8", - "fbcccbd3007cdc0138c844e83a61c89d46ac537ac7fc287a3fc1b705f3608b60", - "e57f14795a20c62d4e035770ad3fa7755e29e4a2f608f6a7c96ff21536ad8c3f", - "e9ce36c1e5b041b968a553537b415fd8d03cc54011a8f62662be6c4f215e3c9b", - "d16caaa3fc741dddaab9532a7e26a0faf2f07339b620cf0aebd7b58194c8924d", - "e686d779f0ef1079e1ec8eac69a5075c430ae1c05e3f0693b460f673e762a4a2", - "eac51800942cd267ee5b11fd9230887b936e41913a4f824ecfd6250e03fcd45f", - "b81026691a899158d3b064ae2c07af36ddb84a67781f419b0aa1f90d8926e3c4", - "71e4e712059b3afb09a63682d07cbec56aef4d782c2869b83b265f07eecd7d59", - "b82a08dc7fcae254d43faded1a2e077673c3c3ea851eb4e6ce25b75b12891328", - "d56f5d61b52898fd71fde2e7cb05c6a1b01f576535a148f352c6dd39ef37c126", - "d57db766d8810e26b33043a20e7995648dcd0cd58e1ab81469f4d1c2c5428321", - "fe9d727d08da858937f6fac6499d45f6b538c711510db703fea2820f9e1849ee", - "c8ae2709458ab8c38b4b50e5b35559fe81b5b376708e3a83937fa4fd8c78120a", - "4d188558bf20110f25a1ea4c57b699310b38ac969f624180e52c1acf9224f23e", - "3855f543ba9a86c45d896de57886870a5cfd7cd38f715cdf48e1ccf7ea447e68", - "37d35c356528160a3fc2af5422782198f40dc8bfbba24dcd3025789fbe9af5f8", - "7a92a3bc730a2374dd9e5e120c0c544c49af9151eed878919bb607034adf5cd7", - "e8e5945db2a9e8f315abe4ca29fce3677e0f5acc848b907b268bc425ce18b979", - "9ff68ad25384af2e008afcaca2b3003ce049d19062b0415f9476c7a39d21bcf1", - "e49ecc675ce3cada28eeed07f04d7ba7aaf6258c0f10d685d5d7e55b238563f5", - "0cc2a8b3f11ce01e935a3a9132c6f49f197d4487840744e3bb892c1f83c63521", - "d53e7d6ddfa898832684bb6fa5376c9b5b92a9b7530b6fa432d7729e4e5150ee", - "f0372e3778176bc4f7726c3aabbf743dafbdcbe09ada2c78eb5629f785f41a32", - "3ada17ee0edc6de23db4ef9a5340dda100d65796c6447d4d994c3d2966fde46c", - "00da6cdc81a4216ce0f18b1fba57d1501e45ca0fec204578011ac12f9851a1fe", - "d3b7e9c213ef99572f6a18fffaf51f4c5b62b2aaa3ac1ae5b0f68d006abdec2b", - "be44cd6ae55c5eade192dc811fec02fd5b6c9cefd837abd6890f44f2b84d3fb2", - "17d2ffa17c4143d3e0e860d469e2834cdfce8d430085c57d75520054a0b10d6b", - "c867f5834577028d1095fd1580103359514e2eb9a25a2ed59f2efcb1c07713dc", - "35477c3ff05b5ffcd85c15d94f25e4fcfbed2e9826f6bea232e13d8ce355aad8", - "8ba651365250853ccd3958416a5f79e7d09691e6fb7247b6bcfeae164161a441", - "a0d352392d3aad15e756ac94f3dde6a0f667072a5a515973f7282c2e4e929d38", - "be3a3f483991a64cfbae2bc98a456911ef60d093f0b73c37534331665af3af30", - "54e322070b18b993bb00e1c38a330f2c2c16133917fce947ee3dcfb7f591d99d", - "c74fa48d1e21736d0cdf949e4b756d2730d336ba714ff1de12fd3bf820f17bee", - "2a630b9db868cce393b0842ffffdbc97f74f6e3f50bbb63416fc4738f1563596", - "ac1ff878f103c97dcb51dac57ea69dd2aa76529d4d124d6e16db83aca2f79bf7", - "88a2e7347b1d791392386f673fcbaf1c8b8ae73841420baa85ee459dfeb295cd", - "f98233164c70978ec77d2c3c6793f012a45ef4455a9dd0c58aaaf45c244a58b5", - "bb6bd728f84c3e969932669912e9261b33298c26448cf27bf8c498f24d7aef1a", - "04abdd53bcc7501ef97efd5e0bb9ec981ba4fba1a0d10804727e017a630beb4b", - "27bb4abd2f7c1993adafba4517d1adb0a6682dad5b309e0adf32e52ec75e48df", - "d3215b4b3e183b8da1fd4f7583cbb5f7dd0210cf4813a88c76d4cacad73c4c0e", - "b414a642ba772f07b08539e9588c8f041f22a99c07ce9946fcf5c610f6ea3b24", - "75b1ef5ab3d255b1f4c8a16781287c69912f3d75ea4724e5ac40c0d3540a7851", - "4d9f2b51b7e66c679086f6feecfdfc9270612bf55adf45b9928317ad7efd78bd", - "5abd1d9b033231f2fe75040b48c49240cbc422ffb24c4186b3ee6f75f75c4af8", - "f6bf691aa001da797ab02524e04aa1163caf543812a49fbd81a66a218023d385", - "f8affc6eaf0de1f87bbbd58599094f5eaa039d951a4d768f290604e17a969e16", - "2ab71194a900294668a42377e50727ba231212c4a67cb42596552a4d0ad661e5", - "a847e2d5ac0f43e6801ae8a6a8eaa74570af6e38752327a81a93cb6aa249089c", - "fe958b92b0511b19690c832d50fd168e192a52c3ee897a8039471f37ab137604", - "5124ed795e097f2ea4a44ac5a81000188a31f2b6c80fde676353a06f2a1a9512", - "1c21e989347f9310b949590981816d8dcf7524e5eb90d00c8782e408cb2f7f55", - "8abbfae74f72a5d634d2b51df120df4c9bc9ab25341ef645ea8b90b4590129b2", - "4fe57617733e0a2c81ec31c9d347d9273f6497be09b0f97e062287cadcd47356", - "118499b166150423dce224f9466fa96f1ef12d8964240eba2518ef9f27d28d97", - "d9b6c21750f532056070088d0c6ba65089d7458488f149e495bf43cc57774355", - "88031dc2909b5519fc14d9594c7f7ef5c38b442e4100e325c001b2a9a28a2b4c", - "123e5a3cc5d2d90afb4e33bc8d0f27006eeac9f83ccc82502194c45c1ac87a8d", - "07eaafa20204ee9c87fb7a6e77bae6ad20d7624360b01ff40114b242878ecb3c", - "133c9f7c24ef818967ac619a7bb5718e12ee9400a99908451acbe34d554f8617", - "b791359e3106e60d28155ec2379d61d1a544536a3555f058dc1c87aab1957d23", - "34906582ce9cec8209a7ca0caf29ec31e4c2fee96644a94a5fe05df890f2bfeb", - "fb134c98a9a5f6e2854ee1fc319d810100a03c97503387e01cbf208bbd32546e", - "2e51029ef23aa7c6036b386c1540d4959e61194d12dac31a4bab2bf1eb70ba78", - "ecd50349dcbfe61e38f3fc63ae4512e984b4dd05ff1d372b55b9174d06915225", - "c40f0c0a12ebb3ac1d6caf793b2974c41ae6dbc043281921a21c687db3bbf160", - "6207f595e66a391faea0424ee70f62e2dd5bff1e0093ecd766f4a071704ebc27", - "c1fb8d21ddd7cc2c5b7c67151416e56a895f26d75af2e14655b9d68a8b12b555", - "a1773322e33c62d4195bafce058613c17937fa10d0ce8d761a45e319c6e3e7a5", - "7e6ed59f3c62438adf4986b44c0315b7ef4d2825aee0997515b4f17f3303de33", - "1088becb39f494fc6f96bc62d06cff745f47540e7dc1eaa6a5864652ef39c02b", - "6968bcddb666b59b84dde0b3d3b1b59e4fd372d3e8d3abe8a3bbcfb821865c3f", - "b605fbf7fe4efdcc1bd0452eda66085fae2270cb767efee97777f0e2280730d1", - "e2353b4ee1bfbb828fe6006fcde0a1b681920e184e372d07c01d1762542ddf11", - "43a99b41e4e2b94928f51b9ef39a8de3500e75e12a637baff262e8f7fb84f5c6", - "22e789daa4bef0967dfea59458ea5c0340fbda6219ed43beb713a271064ec51a", - "a189e568cafb45c86316d854cba10dd9d5711eb99f7f1a9dad0c1aa035e2f3b3", - "d9693c08ec5c6490ec8107ea338b157c2c1a4826cdb1ac5d16661de6383e82c9", - "d52b702ca095297e17dafd6dee9f2b6a0de66f04f9fa999d74580d55cc110762", - "ad2fe47093aea701f001a3a5483a0ec4b0d233582a1b56fc72aef4f38e4143c9", - "9ca5fba3df4658df7abde8f65ed9f044aa79196e77cf1c63beae650116b991e6", - "afde0448a6ca19e20c3311caa1b79a3808576a08823d55185e1e64b6fed1fc1a", - "107214190c2ff932502dbfe15b7eae0ae5a51ca1a3b9587ebd15c9ea5eb7e5b2", - "fa38f71cb15754aa2d974422f4ae4366b500e6229b61ef3d334899a96425e3d0", - "3936b4bdfd8fe55aa3becd9c5e1e09664a3f51cbabd4082d0787c75547a24346", - "dfa282333cbbba26998e2b5a51dd20f31162f43e4ec564be1167ace1a9ccc00c", - "e0fae78d0807c2986c520b2354d7f5083c8d8e66004f83fdceb4dbedd0503369", - "97ee3318b6711feb0709377677405944a8b2d424f3c374ad0b5079989ba5c5b3", - "44760441585b952f9e55db2a6e6fb558516fdb76e6d1089960e4fda40882dc22", - "af647bc7174b298ecda1780a83d796812319b7da1ea741cb371898ece5ac0062", - "ab132b9c1044129672b278886be4de831f0f9595a834bee3f8241f61a864a686", - "8d0c2467b4c4e9af7d46540f08988620df7e784395799c946d59cb70a0edfb5f", - "095f8528cc3ad9f8528b7ca692fddb8711af08dc96ec36614093103951c67434", - "66f1ff9af6f2be44b91ee048cbf948f4bbb7804c0ea3cbef9e6e768f5e627197", - "fc3e12548e9841a124d4d1799aa323c943fe0f4fb43fa4e9560dd49be228bcee", - "1420ad29ae6c1babe1de10deedc19af39a0a576fa6d1fb456fe6b25c36aada08", - "c37850790687a226f43469af567b4f9ad278f4e07322123f318a717e5d799414", - "53e637d31f32382839ab3b1105184aabf27dacd308efb1e49e908e3a2cdbdf9c", - "7b6abd41678cb98080881052a8c89a08e64af91d4e4f06a3e2c832ebe113c70e", - "2fc90f84d9dfabb659e5d61edc758e4f73f193f4c7ecc26e5706bb7456405f59", - "7af155cd5b907d26a00f964f63ad8593904d8efdd369ef80b9554cc895f1c320", - "870a2a7bc4d7ef59adbfe07cabdb53965382eab2483645dc95e6b95c3cbab2a7", - "55d0371be4702186f6eb9924650550b049e59d78119c516f734f09aaa89ab2c0", - "0ef75959d364464a02741f867e2674f7befb83e8dae4499d9f859941a7a8af2c", - "a8467f8a31103a317dbd51f343f67b9c2fea2b377c2954d7d968b30460fb8fd2", - "3844c718173f15d3c35ac1f782842025d839766621cec1b7c98a797721e0b3b1", - "1629edfbd61a72b723fbfbbe326556b6b52ed752dfafc4e2c903a0845367fe9d", - "41fc67ed3b45ad43f2fcb8ad3e04dffd0b5741efae884af7914e04ea561c7159", - "d11340dde9eb51c9fa7ac76717cb4f1e95814037d82409968af486609cad3993", - "ea897cefdcbf6949152fc464e4c8b0a80ece650564b85b1ddb511064cc5ae18e", - "8b1243fe3be97c43298d932d52c7a3485ebc40d0d1394435d25f9d84b8136735", - "166d7cecc0fa42b2c2c343d236ad750f5d076d4a68942f0d6ddf09a981c5293c", - "a8eaa61ea3aa73378c86c3a1abbbf97e5b22dfa4f6aa44d1bba3d528df158134", - "ddb4cd71fdacc54bcc893ce49eef9e90dca65f632fb8264de6a7616d9beb1136", - "b1d66250ce3f5f9a1e3605568e2acd2592709c31c80558be645efb558002c44f", - "5b54e7458b75f4b3f8e7fe871f1c0ecfa7485db07015b22b26bfd0b7a5b16c51", - "272f514748a8f2dd8f44ded90ba9db9799e9c68f8bf7add8f0b135ce1b049f7b", - "76a819722680d55e9d599940bf57a379b0f93c8533544f4d29ef60b3434e1f0a", - "b47595a060d25110ba6bebc473ea8a863b098bbc28613f9b1a8eaa560b7f63a9", - "61a7269a8430d9293c62b7dc01898f17adb6e8caa9b21aa202482f573e9266ff", - "3041bb8cd20ef43925cbd007eb63d10aedfe1726ab2df163ebe5f9f2bc2eb238", - "9c5fd413e6e8a12a22914949186a92278df62123169de9ce1769f39c048f0539", - "8927090580ecdd2e6a0a80ae7f4c7edcf147b36d2057879f7a0f222ed896154b", - "bcff83fb87104bd75def40bae32043a51efa80714f6ed6d512c3500e14866c94", - "a0651465b30b85318e1ea55334639c99b71fdd181d9cd2a42e9edfa5d3478954", - "22122edcd8e83c1e6958cc7826aca87a43ed3609a996a280ecc61061d9c2d00e", - "69b7ed4f0a99347c021a2e9a6b9fc920c17ea83499ce18c01e51d1c49192a65b", - "b6b62d2e79f428de413452d514ba3fef38d3e6ac42e6f5f8b42b2b80f7f53d9d", - "561b3a4513a846c1a9e4d4bf0a2d55bf52b5d5a58e32434df22d8434e8a5e306", - "df89c9e54057ec934a19bacdb13f0677dc1210f4c2470578d6ead288056c8214", - "33a4c3f7c26c61adeeddbd4721f5a017b9a0c1558e50ed81decb556a5b250cc7", - "84fa2d581960c50df741660d7853fc149863843939fdddadcc79efdb34fd60f4", - "cf9246f15f4f23bd820c5e2a2024cd7dd2c3d69450fde43e9849ca521d46a489", - "0da59df4c7d1120ab70c93a0713772f5116a9dce630354c4fc21d85a8367364f", - "5f34d8da3b1518b0cd6f9410e7fee8bd4dee44067e55b1ed9697a388152dcd48", - "be3a3726704c7a5fde8a162852d7de8a25471646bfbff355db1230e7188e1d13", - "4070c190f809dffed65e094b0520a59f839e8d103118f0f30fcb6829f3557695", - "13a02d9341fafa125dd7470d0a0411637754b28d458b53696e8a9cfc7c9e1150", - "38282ea90525b9bfc32e37305eab842f780a5b0c7719af9014060991b12a7e19", - "0c3dd7dac517a9f8a3f854c160cf8bf069a9e982d28170dcb2e9eabc1b6aeee5", - "c6e9c83a09a89cd953ca850f269e41e489663fae579e2de1936736ce50417880", - "b58b55a6724b2d76d46e25c2ee20ced2f82839cd2f98f239552ea5140dbd6d61", - "770e00d21b671f60daba7295e093460b798dd9a0b23ec69a08d36d7071f23129", - "1f9d3063e4d1d7771364743bedf84e8ec8c053725df1aa068baa1801c8278a03", - "338ecb2e328c5addeb0334269c0fce77699a55daa11021eda1173d3ec52bd426", - "5536a828074537f73b88710eee904ba75f97b631c40c032b32646dfcab4aa164", - "e2eb21b639ebbdcf4a85654c00532b2ccbb1d140254a7790cbeee94052f76a68", - "2795d6e0dbaed906cdf71dec8897c52e26adfc34733f56b97c4859a9d772dd3f", - "6378e8498113294c52488e002bc3d96cd4c74de097cc62f0301ffe2ecc5214ab", - "7ce830ef988a7beede280642409c51a7282d38c94e6aee059cd5939f5cdeb304", - "a16f540952273b29bf03db6fbec6af22db1be2142467bc45a763902b35c161a9", - "3ad17bf301f1fb5c7fe8fba0206e4b0fec1f141a9a35f99cad2fa3fe4f605f98", - "34afe3ace245ea5ef5a7b794641a2b9036b0b683167aa40b335b0b3ae0c56e1a", - "3ac623f593b5ec8c25a0d16cdc36b35bbe59ecebd1ce1f41053bdc86e6bbaaa9", - "96d4c5ef123b8de5af90b924488da22bba866c37711aba6f21c1b454b8afcee7", - "de38a5cea8275aaadb3ae6fbd85e09c057b94f572fcf4bef17e03d59c4991264", - "0bb07f407147a9066615f9d7d023d1f2ebe656238b40178a9c6b3294466b131d", - "9f681456518be531f824d4f0805935c02c6063bbc450d401b8ec32fb6eed23c3", - "a98f07faa608fe4454e9e3cfc5e812fbeb6673729f96aa96073857e6ed4323ef", - "ff6ef73f5a650be169e14084ad1fbeebf848deb466b116cfdd84845ab5f9b38d", - "f47202f0bc4fa4277f9eadfc052f55645286ac13ffd7549213b23ba20bf4e100", - "803777ff96801bfd9e33daaac4504722ef923b09765d3256a094ae6de6f43e69", - "50512cd315f2cd325d6e38fddca83b54d71b2e66c5191486854f9971a4a49866", - "eb9772473320721656aac05f3fafe3797a49c3f1b243705a82a57f98a3746b86", - "a883b53eed38d309f0eff3f6257b1babd8ba476b6dac3550b614dff78b87f7b4", - "df3e9b78754073619e5db4dfb5935abc283936eef9b260cb0cce2153c1c0a3e2", - "83c0339687f262244bbb788d213e298e321190088daacd583a755bca020ec451", - "1b50e44fc49e626af4d91fecda5771810fdcab02e58bf0ce92d58d34570c6368", - "3699f856b35d40244fa233702b874d8b3c9b7b547828664551d898eac998311e", - "adc07b271418bb72c6eb37915991c6d41163a9ffea6b2421a19d1ba35cb50eb9", - "e5391f1e4ce8e6c435370b215d7b9ad5ae85f5bf49a8baaab335eceee41e4cc7", - "e4132c17605fd6e8ecfe658bda7ba3656bfca2877f38756603f110248c962d88", - "9a5d56bdf1ae243dc4ae1bd0234e97c07d123ea8086f943cc248e80dc9f8c5d7", - "24cefbfe3ac79d4dad0645037a4f43f2e296dc5e82ff53853bf636b79bb2f4a8", - "f589c3e1624e9d9a8d342dbf3dae55973eb1867e9befe2f64b6c6c9de80c3259", - "c5a2e84dc673ccc5c9afee1494798e32dbb50e964a676f3b118f253c85384c17", - "6ebc456b8dec9fa8cf15b21b13f7e6f545b85f5b3e3f56991371286ebf3baa41", - "bff2718b0c4930512cb80deab8cba4e0b0294c6bb3dadb221caa81124d537dfa", - "56876347f29205400aab6050c1b10a7c7e1c77eae3c70e54d52c2d83f41fac6c", - "9fcf515fdbfac3f2cabe32a0fb0ebb377b1c8e845d8a50ff7051dc12dbbec862", - "f10d5ed7b92c105f5f614cfa2c9ec04d2c130804019f93ca1cb815f08f1bff6f", - "f7605e6ee6421ef24270d9e71e994fc4d0d00ab266e43b6b7e1c6123f521f2f1", - "b750ed8d4842345262c87e48be1385d37a2dbf08c55d6d1698a4acb8b675c00d", - "96065b626b856c8e67c2c78c2c821a6eecc4695d79178c8d12f9d8a79333948b", - "0d1c50b2b46cf1db076c16c5e42a3119390ca2e2280e5909552a5d17b1a5e01f", - "ee3d0e30760a62ed559a2efda6d6227abe3c95c7df481e3ef5cb8003eeebdb54", - "47ef4d61fb7727fe9e8c5f5879a6a2b3c954012d60995df9c7b4c1e9b7a92557", - "fb4a610d148ed0cf3e14938010bcc46d5cabf34493eda7fec63f2b7b61b5cb2a", - "2c5bb8bcb122a1dbdcfd026fff062e3a02581b6906a31221c783040c8651abeb", - "d27055790ff057764e6d25c6979a8eec8bf25ebc9fdc24a08b4e8a78691542c3", - "e53c12a33f8b62056d829580da50afc5d24f9d8463150bb7ca9c570c6f086418", - "33283ef261957a2747948c5bfbf8afa2ddabc296ac2f6670f213aa13e08eb53b", - "16592ec17e2b662ebca149c9c9c61b98e022396f030fc934caeb9335e6ff0093", - "3b03aaf48f6890b2726e0f4d77270438960e2c811eea0feb0bcd856933e50817", - "76c1fcf3f1f725ea6b62d7edc16cd35ff593dca50da4b76d95c0db5e3b63375a", - "f055e80737f187539df82b07265b4e917aa09b500f974d9d0ed15dab4f101afd", - "b704a9232340b9f2eb3e7170877659c17ecd32c3365d1cefb782f0d90ac25221", - "d89654f6685a931f3b8e5f16959a95e44fc944dc5bfdb2e851e39959a74b7c3d", - "938c31ba487078c3f6ef3315ee8787efcd527bb601add1ab59e6bf985528dfe5", - "634ccea35af72f0411c4dcd871d6fe3212d98038a1c3464201e747a2e7e86e4e", - "04593f90c5d0dd4e30e6daa97ab6e0b7ac025544f89cce291288f30dca480932", - "43beb83bc6e34def97bc5c8f0c185db9603acabd2803148a5790176462c526cd", - "6f24c3d048d630ec4cdb00f879d10c365381363956df966123c2f28362df989e", - "3f935527a78fadbe0a33d9eff6d2cb445e7fec70d9b83b2177ae14e96c352147", - "0989fa0f4f41e9bf95b1d351ac5039db2cb8a98ff54c30ee07bae112dcb0cc26", - "4eb35d66f7cdd3b9fb7703a4967d6baa69ea7e8109539c5a58656d9f26b0c979", - "f1cfb5a55006157c2ec0dbeff65f8902902f6394c7f2a31a051ea2deb7e448a1", - "c5156b97046f280f2a585cfcbbf543880dedacf3146856c7b31e3a355bb6ff61", - "13b70801f0f5a669c8df8429d4558d54a3b0e5f0cb2a5b4187f595cb409dc4ff", - "f484d22400f5aefc8c11be0a5a9e7462e59006155e9771617cf6e8262e054928", - "37870f421b782bb14d51a5c761f2577e558b55c59442cb8b7f84687e964ff43e", - "967038cbff3cdd72008b5794670c9e86ce97ee01d8b66a7f2b9f7fe9d1c7b731", - "6b1ec170765d4a09a6a5ad8ff693c7fd852ffd3cd911e06c2e2d560df992b4c8", - "b6a3eeb51c631218b36c95d7e1b91348f7f874a484c250314b62891b5b2039e5", - "4145f7a2f211334128605f29cf64039474951752f0da1f09dcc1280446db8f5c", - "79cb8397ce131d97a920b0138fa3399c9c7a8fecbabc114d0dbc30a52d2dea8a", - "42b0aafa3ebf243bfa60054d175ff77cb6bfa13bc9d6d8271fe3601602a8759f", - "b0257042e7a5164df441cff1b56150884d9f89f5cdc50abbe4e0d882c52a564f", - "67ed4eddabf99e81c09d7ffa7137ab76f38242e875785667770e4d884d308ff9", - "a90eb642e3d168c31001c6fde421230b267edb0753ee64a9906bddbb938a38c7", - "cef986cef54be6273a75058e080012f9a60d99564ca80c0222bba3b7f652f596", - "c4fd08faef5b3f7b20f3a16eef7a3103854e1681bc80ef481f73224f9d9c94b6", - "e118be877ee884cfcabc62b2cbd97ff1b45bb59aa1bc9708b988978e22cb36b6", - "7ff82daa18a083eb2712ce753327d3660a2481a3ea7ac5c212272eaedf11b421", - "2e2993043a2610e4f5294d272394b46ef1c764834ea42c607285ee253414d0b5", - "71118150e1975c3b57ba6dcfe16807170a04f44c0ee064cc5602dfe6d526c14d", - "b67b30a98a79d33d7ac4391a491fc3899d2dc88350e7bea4267b47a99cbb8023", - "4375751ee5ee4936986ac9bcc4dca0c249d7be000a69beac3ce09c9c22be07df", - "220440dc6ac7e5c6bf74f591dc73d69ad50a1acdca987cd4672d6d4a5c0893f4", - "9d274d73403dbd7c4e412b51574238a927a7fa9d4424acc053a53352bb0a7aac", - "03e1ada986c13fe461e0a504a6cd42215546f33009fc694d5e7169434ef8caa2", - "412f29b43f3c2c12955f25b4e3fb91b57749303e0e2e2df7163106c393177690", - "2e7d0a1d52f378f38fa04efa86b2bd022d03931ea65153bbd9e92c6b9c12ef01", - "b6f9eb352fd281fb0f037440c64729913298b6028bf46da0f28c06921f447f2a", - "12fa79d921c672bc8780a568adcab756b3533fddb2aa3030cd47a2811935ea7e", - "9cc14315ae8d9bde7aba5986ef14639adbdb42c9706d10382b90dd5de27eeba4", - "f0108bdd6346c809fe8a204bd9b55e7035d499e18dad32674850c27960a23007", - "23807fb404181a84b55f989c72f6db981b14783e4061af6fce4553374c1f97de", - "e10496cd5f235eadd5da147561b05eba7c1196f92936fb4d80018831b1b86072", - "abc28664f9c47e5e57ba23baf0ff619969d63fef0ce4ba429e78eb275ee0ac8f", - "7c1c0d92844cb5725a5a04c9001aa20e675021174483d37745f27f9e10a9cf3f", - "27d7c6d5d702c2152885643754f42db7bc7c842fc5c506b1cb0b1777573e9b58", - "f3b1d2925fd1325a8a6ba8923fbe6de31dd93d9e85540eaf5a306f21177c3b8c", - "c95c7e0f19af7164bea920e3d0ee10ffabb521ab583ebd0177a990e89e138c17", - "1ccd49e65897f63d3a736347aa499ef8c775804de0a252f189e177dcd4990d31", - "03e1d79c7e75684b257ba3bdbe06631621da9262435f074db6332a2690c7c7f6", - "d9f572677b4cf45f9867c81a031192e38fc186d03e55caac8be48c239f1927bb", - "d4ccaf267737fd7e485812c9bfc2b6094897007460852f74127dd895a7a3964a", - "5dd53163031cb6e87059a4c1f20117187a2e074c92982937fa304308d5a09166", - "272332001149596d5464b670f7b7c4cd11a8b811008cf27b24d76a6a33cbf2ff", - "0573b9013648acc2ad383722a864364048ead4b8ac1186691ab04cf41271e3e8", - "0300aeaded3c2b27953f441d8895634c61682366cb901919ec297b63e1e9d77e", - "79251fabf4da099bc10659a5a2c3e6030457910f1beb9de8139cbb5f67e059c4", - "9d7b3b62490f4d8e5b56d477c3ea6a8fa060811d81792957d997967b864a22de", - "20f35898d5c425864d31c0932f0c79b642287a481c7cb9a536dd9bff50129db2", - "3d74f1ca4311dc1395ddb366de469a47772bbfdf61eb43ac21a1578460242cb9", - "c2de9e69c796546d1a124917b33e275447408a8afe889808c23f5cc8cf131512", - "3d780b05c75e6f60d22cb78338cdd636785cbbcf4867b717672f0ebbf1e34937", - "243f93e1f5fa6eb2cfdb92fd8d6d24a93df04100886dc3e6a139968d1af3d937", - "bed05f76f056da6d9156f7f59e9302c75c9498aa68cdb6d307f40c1e19e29ab8", - "461b75ad879ce2e2225d34bf100a2df09af84b5a01fa1c0ca485af9b498d8d20", - "18a3593673427bf3a7ee796a82262be1889442aaf3be82ea99473d96f87f0c41", - "ca8925a01db7f3527e79011be77915820e94aa7faf8dbc6c478a7d897b75de8f", - "d91aeb5bc746700275fed0c33db61783710f179e6f894f492ccc4fa6ae8b9d1f", - "c5c690367840bcade10221dcedf02ba1e1ebb17f431aeb6914ba1e23894d7617", - "75001d973b9b027458a5d015c4078b75977c570422bb2329b68acea1b5f62f37", - "fd0fee4e6cbcf56215344615de871f5997ec5ac7df74c67b761570160b630656", - "0a642b150b36c334bd5f85882bd7e51e2eccb3f81da0aa02a69b807cb4b4fe48", - "2a803567fd85a89edb39398d88b11dec90c4c233fe8c90630ccae23fc0e777f5", - "128fa79688bccd17c0b403d7b19b2e5c544d45bdc532533e6607aae63c682071", - "b534a8d528809eb6cf9c1ea21762861d9e58d63a8a98589c4343d3ece4424a1f", - "f2e3305dd1d4f06275c7aac78ca09207d753c93f47eac1f39233c08c650f56d6", - "601baaafe297afb6cdf2e942f40001e3d1bb55b7e3da19438502b92f153e2aa5", - "0929addc9cf89d9c9456f1edcfb731796dd7dc00e8e188a349ec205225365d8a", - "a7019698cbaafb874704257189b0b6eb0d0e33dc12fd0c0f7c6d0bb2a2c69c38", - "dc96246ce25a5433dd626dfb3c19fa011d6700e987e6dcdd3cd5f822da5d1ebb", - "50bd9f053bf28a332e39d5ad5620d9f3518c4a9669492b668dfa18638fdcbf70", - "ddcbd51b4ea52c02bd271628f925cbefdfa6508b5ec3e1c0c691a18681a87736", - "ee4d76bc4891cc4df6d389709cfacbf01827173f010c9fcdd0db97a4075cd34e", - "234255600a5e15a860e6338a45c2b96bd1a5031b2f4f4cdf984a9bf834104b5d", - "5610f09192e86618474bccb2d654fe9250f29365eed850041cea35bde93cbdf2", - "acc70b5eac9901a376a125b28c9b2d107a5b0579b56bce5671030d49803e32a3", - "4a78ad8ad7a857ac68647772d04a5bc15b5f6ec5ad9d7f43a501ff3cb1c40e6e", - "374f69c7ed49c22684ddbae2cafe981b31890b7dc0bd38a5ca719448781b935f", - "a9bf486d80e40073c6c99d960f86576e58dacad080f9a0a4fa24092c5b535045", - "0092e535731efffdaa8f97f17062c6afcf6567c7306d4bff8302c87a1736ca59", - "882b9b63ec8441c6c284c5731b402c8e323b8fc381569495e4285f93ba4757e7", - "9905a3536bd6dd4886d8ffbdf30c2a3362148ece8ff53a4c39e01589a9c8ff0f", - "87c21fe6d7b75a449b2c37f482023b80b7de9d713b2660a9e021b4091e6c0cd6", - "ed777ca34470b821a0df5e1cd01d2e9bda4668d7e8761a3211a8bf47e7ea194c", - "81bf9f97d8e830fc9ab49c1fe089315cd86aa45126ec2cbf55cd6e7a1a967a65", - "cd2e8fff7b9b1515bef53b9617fa3e778ac2061be2faea8b69cb1c445fa6f196", - "e3c9ee3cf2177d7e52d77b93378e04fc846c8eda6b256944a056653f60f6bab1", - "a79b0d1e71f6443f39152c8e460bd2b790cffb90189384cfaee8589610228d52", - "ed2fa7de171693343c177e34e5ff197d7692fa3cc883a5c95830ac7179b2d7da", - "2b37f3fc0778f93bd93ab6502eae2fd93d9ebc2c41bdda87aa8b386ad7d94311", - "033e5e4ea9019df54f9e6916058fae57a7760e234091207c58d8c8e4a16f75ac", - "32e71c2101a3b321d4c63f24bbb02e3683cc7d6c62212f0e67cd6a239db132f3", - "4446d68e5fdddeaa1968978077af8884525737f5f11273026c28d83e35b6c53f", - "0dd51b0d99b8e0f4c165ec81f46d4ec8251dbf49b92711e1c14753581cd817f2", - "e33131a9e0a3049286ec41aa078bac2b5689b6f6c3fb29cc90a4298098a44a39", - "afba4367f51895e445f86bdb79672bc81e2e02aa5349a69bf385374d4c510e26", - "a168567a2112a9117e66b39d6327960daf079aa4a004c019a43a71db5d9b6232", - "1c491e02e259dc683e3ea27078f383ee4cf889623e40714a64182fee136944b2", - "35abd27d1ce1d983f9d686a33e6c9c1cdc166119f1241432a0f05f32ff303356", - "eb7333f8340d2cacada823909baa5f6271ceadc02547fce9d90429eac7a15969", - "badc2e9298b86e0bf3d47703d4d2ad45deeec6df9869a80289e0d01bbf933004", - "fb0a881ccb1cde00502f090fbc87f9f49bafd1207f167ee5d1d3334f7370a3b3", - "63f08fc294bea223bc456965f2e2549f5a897b971f36e8fada05883cd8b82a8f", - "c929231ad25781ecf4a5dd865e1407c8cec98f4686a43ab713fd5f702f4e7517", - "cfee94514e6c3700bbd1fcca49af5a119668d19f8cd8646b224ffd98a5d869c3", - "6661b6c1e13852b1a8a3d38138bc05bdf708c9919dd87103022dda776fa00ed0", - "c9f3bfc2894d1a20c15b30cb6539c180d4a6c8f0574918b21fdc4b438bab0f2d", - "f637edc6b6a6b0ff625c3d062755f17b35637e6765a6a76ee0ac05dfc057d32c", - "c1bd15fec33678f9a9b5d904786e9e2ac4849f02f8e55848fd6ba979b612a191", - "466add58bc2c8c6d4ae43b5ff38b7f8a59f453c1d2dc63bc018b326a0412f689", - "d84230e879ba8ecf1d75a7aec4cfa2e37708af4739a4ca5b24e9f6ae5bf70ba3", - "834104aa62bafeb8e91d9f36e84e94a12ee4799bd4cf587e2edbef2909565b55", - "7fd76c6b7abd4160c74c4fc1460f2fe24864612669f0ddc3cd2a8c440a1663b1", - "f1301a65f012625a96ac62edaf564de9977268e2285fe986b1042781e0f594a7", - "2ba81cfa5a2bff3d344ffbcc3056a710b1c0698fedadf3c32fb03c1d3ad341aa", - "b66f10b287f3c701c58d2d1324e8708c962c881159f9d84125cd0c359c0ac21b", - "41e7238d69ed84369cf7414777fe98cc4aca454a3710a3e6d23c42085e467b49", - "9b4d75f4d65aae6672ba89ef92bbc0c89a133d0fcb25641779a19203f1dd2847", - "e9698d3356678dda4f27bb1778733b44223bd6f7863a30ebcf05942e2695dbaf", - "d9db182d08b5297d520ec3430257c94c6f5d085863ed21afdaaf67d1769d1391", - "fd234b7c18a2ae832a8baefb4c115e84133ba9bae2976b53ee0943af956de1b7", - "bcd36cf4d5380657c3035ad335ad802757f0f23e7ba248ac3852363757bd4eeb", - "f5c588392dfb0de587944b1722a341e00c4373dfa363f770eec5c1a7debd52dc", - "a96e5a4dcaccfc8406ae306f2c1802176f08221fae1542017a9b9f235cc952f0", - "8e4e9dd96924a030af42c8fc78c3fb0796dde6687e2f7d3b91fd13928c8c39ab", - "2c85155f2df227a07966583db5555fbd22cc248a1faa65681c8fe090efba7781", - "5c6951385bffc45ba9e740b3902cee3322169654f9fcb9ebf53252ac02079818", - "8efee8993f5402bb1a7874bffc7faef75150f5134747207d403e9a6701b8ea75", - "116010ca0aab764e7f04f84563d4654809254dac7aeba380e6f4cbd907dc1d7f", - "0f3d48caf0462a85a328028f2cd025f0711785d80247ddf9d6366c7916d5b82c", - "402db46df543af45cce53b19d24b66d979fd8942290738fa4033714865434459", - "86348fb62f01814cee26c7918969046ff291c6e3e956456dd288a70774853829", - "bd4b555c0073b2e8dfe13d3e8d3b462d7b0ff10b1f432c6cbfe4551722afff17", - "92fd598b29202482894c37010b621e50ffb257b39aececcc6a08aee6c8daac3b", - "030a266123d1a2ceb1b599e2f8ae598e96a1062440c85a742b5a8467f279d4ae", - "4ace757f2e876aa9b4c74d8b06153e552faf7859fc24a3bd403859223f997940", - "fb575e2d81f4314b54703c33184a1ab836e200c29b63111c40d8d1e3e6b8c52b", - "c16632f62ef12385085e26ba2ede0cb46ebe0984b51882e4b75cedcb561e699c", - "8e30d40e1cd1471d9f03e9de835d7c57ebe6bf375e488db3933e873d86744fa4", - "7eeed6e47b07c5fd693963dcefde62e4a48d4474d6c206adbdc0b6ccaff53011", - "14f00a61288bd80df8619debcb7a436d10e26054ad8a8f6ef2bf2a4b8f54acc8", - "3ed15ed1b5ba3df6159b35d871cbe1e3fa2276185d3bd5ec146ec927b218851f", - "6b504bff5db177c5e511f9cd2e9d57b2d1dcf0dd32da15f7e0d48cf7640fb089", - "90f6baa302e008783bd89767dc0c3bf323535b8cbdc5dbaee1712f6f005395ad", - "d87e6c990da2c705a2520c1844d13a1fc590436859bf6905ba69364105dc65bb", - "1f2934f3b510aa597dc6e744e5e50b63fe71125e4a84f4d0c3917a904d7c924a", - "7d9b0201d3fee9c8adb54a3a1f3fbf3b59e036d1c29b869351755bd7ce5b97eb", - "2963dc4e37262df8dab5f483cdb8080f1ae15b7872a2dfd01af3c784c67c2cad", - "83bb32948eb2f5f3596546627068b5366d4db5e950a7289191ec7ccc092b20cc", - "efd02848f54f3e76440575aaace4244a7fcdd6da8d444d2b5c764518b9d472e8", - "eb2649e7b9932831af85a579c55bb7b32a45eacaec862a0a6fe6418cabade99d", - "5f01d61fba64f970e800ee351717c2da54c551bf9d975bb6e87e50bf72f64ec2", - "79e46f6d86a09110f7dc0c206db807f558930af5787d97df0aa8f32e752c23ea", - "027915028323514729582a9473fa5443acb82f5db0a5d76859d486f9c71d2bc8", - "169e2094ac65d79278c430fa91dc8ec7456ab258fcbbd1e0e0eda7dbf81662f5", - "ee8e8dff4a006db975d5cf81fe69ee1c6f8670096f9e1c43c1416fdbe53cdba9", - "c61d6f8f7608715a49a7e93c21af7ac7e7bba47e70c662a2d47182e753456b31", - "acac5164c40d6a31c6b618312bc3605a4bb1eb732c08b71b6a77bcf45737e981", - "2e0cc80de3cb099f322c7c01d443f8febf012a25ed5f9afe4d9e9864fdc1c548", - "444aca59b856f813f91c4fb5d031322e03130264f4748ab7a538f821cd62efbb", - "38f926d119ed42cbc2cf34dc71b8bcd798d9fe82528dbca8239fa32a6ec91f0c", - "a3d0aa795dadcb51c8227fae7cf07f0596967e745be78b1b0215d1900aebe0ff", - "7de3093b48e28d7bfde6df2231706cd58de7ea912676e92273862145eb4f19a7", - "ef59d668894d54dd15604dbff948ea106fd9b09c805cef3e03d4ce4794de536e", - "171e09b016ad182720faeaa53ad028644d5c8ad71e06c0ebc95f7bf953cfb081", - "8900f89335927757c7b7f24a02e25728c5a63cec68b499eadb18ccea001b56f0", - "386f0da4c2baa5dc24b57f82dffc5f6de303634ca68a612d83dd89b590a47a29", - "6a04b0ec83f4743b9f82c079f994006352352c1ee0e9ffbe824c595dd928bbcd", - "1f989195e280d52b51e735e28cf48f7b418c38159e2998344f325a9400946fdb", - "bb1add08cf30377c862d19ba23c6cd1d3518c61d4edaee1835f8c084056c9325", - "ee2866f1e559f53be6ab2bd5f79620e63f9ef3ac8329b5c52de8a6dc5691a35f", - "e7e1cb0c3bcd4c24d0dda9261bb496efadf56b1b7399076ab70f952083389436", - "32204abca0ebe92998b06d5179ebc00f3ba905771e443935253bc92a538a7f04", - "1212bd8ff3f63c81a08c3f4cdb3f796a11e5529e72ee43b2de7a606f35922e76", - "7809a2553e027906854521ad5baffd15f2c09b6bd5b6672627ee5c846f3bf8d2", - "b4850838ef106e57c8d916c1610ea1fcb3641f5df05c5dc37b9701acf52a8bd9", - "28dac228255eb87415d5f736c18425726d2bf02d00959427a629d49dad6f812c", - "57c8ed7773cffe9d4a5c75fd2773262ac57f9e89f73b8adbca0577cf61d23819", - "1001b73745548294ec0bf680b47e9f9abecefa89a95f2e5b6a1342d99ef1a124", - "c1645ed1a8914fc2b83e43b4de7c3da9b28980552a8624feb15fb21ef8e84481", - "23dd9872c7add7eb0f40da96a167db46f482a15bebe47d916e160bfba98bcdda", - "9da87f1155fd4eb16e9d50685e8ce85738a87de5c7843544230d17c29901b396", - "f3e97121717daa76efee82b6e80a8abfeea1287915f5267235bb21cc779bef4e", - "685a63dd48a3c421edd057bd85dff03507424e5e9171a259ba6a2309f07d6798", - "3935fe2a01b3b5d52a9377e43108058b01faaab857a4e99b377fad9fdade7d82", - "6f16248aa40a41a2fd25454fe82564397acc0fcd11bb54a42019b52968f0a5a0", - "d8ca7c0d6d1da143ddb4cab4f8a54777a137f43c61c117d37ab69c81fe0b4b44", - "dfa0644b33a4f8a7f803ba1f37e5d251731709fa04773e38ae3a0d7d79a574a5", - "5e83da25e102b4c9ec392cbaace9f0773a411466c02268bc6f205b08aed014ba", - "ea70777b6bb006c55586d19e46517d36a230620235471b6b8972b2d93abaf974", - "f65776bbe5d6f571e9cbae76f8082f8c644f9c071d53cb8f499a712f1980fdbf", - "ffb4f31ca7dc4952c2368b8b77db441f2ecc8e80da2b3687c54da5e8a49b5f13", - "e521dd9b30e4ab9128c1fdd574bedb113b8ccee8c06f0de344713ced1da7cc82", - "bfc5b4a0f547a28bc0806ef2b8dc655025a90226c3ffcfff43b795d66c86bac0", - "28d24d21c8af0913bc3220b2155a01987a3acaf5db9f129698c258678ba34506", - "a02c164d3f68ebf69c43f433ad62943cc18b38bfc0d3ca07c2e1294049bb9f8e", - "eea5ace3a4b02a8c0efa34eda3315c78fa2b1c78290e7c2bda57d5dfdd48d4a6", - "19defeeaac541cc25164e069516c4b9a58ad6914b3e6f387a43cff7cd59a70bf", - "5e235510e1443d5375238c2f106f667669b8ea93aeb4876ddce986ba602800ed", - "2df28d299d80fa5de9d2e75ea1db7e397fdb58eb74213c661d265dcd5ec6612c", - "baa89dcc8d9dfdf17f5ada8ad8e24ddc540fd2cc56a9c588006afbeb5a32a61d", - "b0af9e3c768d1780935e459d59da66afce6eb3c983c3f97f91e1df8c8df099fe", - "0596890de74dbae52856fb03e7e85f05569fb51581707ee1a5a301470e9d1e66", - "be1455e61070b83f5a55cd4919676d05e583c4d58e2356a0df8c4b96cde9a5d8", - "22e557bde10e2f89d4df41a4d0d0ed2278e5475020533171b50150c43d3e251a", - "081cf71267e048182a8630ceb2f951db4eedef1739632cfa906ad8f63f1ab288", - "395899af68a29089d5eb757cd1255da40b507aff97db980bea812e84a8dffe1a", - "fc3499ab31132ad2024e823197e3b923b07a57b5d6387c4632413d34f86d9308", - "f79e5e273781ae8b20141836e825d50d119377e032c12490205fc5037833f0c7", - "e6a0f229a403f6dd9c2635b3368994f22817a4799a5a8c582ad89d1edc175805", - "02f832a4a95161bd5ecf0ca5b458712bc622c4d59476b35c11b9480b14179318", - "d1af2915a0a7411bcecd38108bb32a23d52ae83139e6791a0aec303aa75d15bc", - "fce6113034c2a6900e0cb03157f8ddff5688fd055820b0a895cb18540b7ee2cc", - "8641612e12d5ab78d056442904f614ff00cba47cc7eadbfe499857e65508af63", - "9e63b002e898371673f0d1223a09c8560b2af51135f4ed8a7df73dbe500f28b9", - "c6fcfe991e5160b4435fc4cc3de53b69200f2dfd8b8b97d7caa0f4992f082051", - "4064f5ce40285b5ef9a18b685aeffa10072a1299ed0247b6afccc74dd3f3b2d3", - "1502e352e2d0258072ccfd445f39410a43e2929d8fbf79fd1d6f0b3cc93b87bc", - "29e2a6158410ba3d317369f6077c7225c864d758d438651ca8ba5b92ff2ddc7d", - "f3cf2bf379e9e0de067fc0a685009b429b0e2464b6a3a76e312c62a8793c3d08", - "ab06769daa53cffebfc8b1ca8227f0ae232e55f8a0bcbca89857b92c213db150", - "57f905e1c0ba4640a66207ff2ef1cbb153e67d41002a1950fcd6aebbe977d731", - "8768ddf67a294d7c469a5b64ade30530a36d9be2c6ad26325e5ee463b49003b9", - "a7603960e678cfe025131bc6ea20af034ad5a244cec587cf17efba1e3f8fe280", - "93aa48e1a38ce9381ccce241e968bfb31e44402ec3bcd55f48f631aed41e3703", - "904087a987072f495a5aae1cd11e430b4044e8374476bb80ec8a7cb5a4db6ea5", - "c1ba9432801d98ab6f2a3a7fdbcb2aff46b9870f9a9272cfe9c4f7ac2a4fd875", - "eef24c050275cf1251a9c6088dba75a9ae064d54ddd53a8290a6fbf99597e482", - "593f12d6ffc579254acba63b8109bfbb60f1ecfde4c150bc7376774a64402a22", - "c77fbc065c996346f95d941e155a176dd4ac915baad24b9d3ca2ee2fb07ba459", - "1d77928739891da2f3d8ce5d4acfa7c0fd73de453b95fa00c1d5d1505212bf6c", - "4a58e03735cc7769534b4747b7245bb8f154a1598639fa2958a04e68fb3f59d7", - "1147f43febf864b957a3b6511a85ebae4a2f517141c84baed074cec702bfda3b", - "7955dec9305a772af4989f884fc7aa0fcb2af3a1ec55168ef58ae07e60cd5ed3", - "c4c43f7cf74ab3aa4456c8723db092a9713f26ae85bd8f3f818e73c91798472f", - "893f4694e1d139afa9a272ff7058ecb8ae8c864a0d1bfeb7ca49cfbea0a0b9d6", - "c5db689a220818c011c1c9bf3a795441a79d0ad5a30ae5379702f3be2d9d8835", - "b358cea940e72518c62a5c1cd753c098b7025c67be68cab59cac1fc512266ada", - "2ba8197a083a73c95a1c41ba60a4c0111427796379090caa68291fbb74c36332", - "0f2401cff046361d1be0a1dd9e24a284b3703fc150ea58613bf1f6d6ac4f892c", - "b69484fec917c49c99ec66961f3fe56eb0159a3b3321db4bb102c3c85369c6f5", - "4c033968e6220d6413425811b603c6bcd0d732eaf78695b887df96cbe3c65507", - "2a0d04920665f91610af70f03a4f88cdeef37a9005fa3443c0b1fa4d019266da", - "65d3faea7f9dff010c6623a23a099f3f5873cf41547662f9d3414366769ba16a", - "fdee7c8e0e4dd525243b9b6000d76009de6748d9aaaa0949c71c421b59a39046", - "c8f34ce852b642c8c5ef5eb6322de61171f0292e5873ba19226cb825de7d14cc", - "d969d5404f0611a55d0ff764e198afadf2ae03275cbfcdf901266a49e8495e88", - "ec7a57b01d4bb545e670bbbfe499ecce429a8c359aa7dbe87adece55fc276a73", - "f246457c73083879df967d51429d5e6ff13021bc866138ff97514e53a61e08ee", - "40b1db8f6563af6057743ac84c2e86877ade95c036a05690d1ab4c80e3c0a457", - "b2b6003854283e706a6c68b8940bd1d692ed12ef78e2131b8cceb2afd23e1638", - "f6c95eb0ac9a4fec10acdce3fac12e98c6614f8561b5326939966f000a346c4c", - "206b678f20832da012035d10b65b8069da19b51f847b43a61d1f5f2f27f13d5f", - "992324c812a102361c1a1a07abe4bf3365aa9cabb33110b848a74db8beb39b44", - "7413cbbe746cd5b3a354bbff626478a19b7988b049e63cf8b330c4de717723b6", - "86b0aa0e4163a9cfc4c6a850fbf5df58eea8fd7f561d519fdea032fd4f1f750c", - "26e4d489d3c28cd75ec72aa2e7d2829847fe93955fd8cc1c8c3ad4400df0fdb7", - "d6fabb81dfa250ee8ce9a1300a9efffcc6fce3689d7dc56f9461503030322fc4", - "8b5e730848a97dfbe4953820db64b96adcf0843ecb84f57209e389898ff19f45", - "9ebfdeb49e6e8552a813c313d1ba23a296f3446fd15eb28de07231786b2b81d6", - "8985ea6c59a5f9a61d2569223b2d20dbd7b78ded06f8eef5a42e13fd47776035", - "c5bb7120569fe839dd063845ee470973b78d68cb9f6449a3b16eb5bdcc0bd3a9", - "ef1b50100243c39cba0fc6294e8d81746a53bc9461105d7d4217c36a65fa67de", - "ca592224af5165010cc47c60f9343a965d37c1252fad6a4a2183e24813af0375", - "bbf3222b8a092f2c8b34db6ae8ab67304d3d584371d1e207d6cd3e7af2498b73", - "285b88937bf01214b58141bca7cb0db59153f611b510f4f89ad244d2615a3106", - "d10753a69f1cfec3c71b3371efb5da831df7d34108620c6a49d4c8eb68bcf527", - "8cd44bff54c1e52f5877c1314f0abc216dacf31bef06fda0d4b31cfac816330e", - "05216e727b1005d55cb30534dfabaa9d269ea2cbe3c181d97f8725e3f4bc1f56", - "4218cb8db301c35bfdd4a67871eaf1b36cd1c74da3bd153ab9a61fa9c8b5263f", - "8dc9a6066230ecfc063265afb7b5761beb2ba9e00de8644088a0df3c96115965", - "f4be3685b1b5e79781c2a6dfb3a3e4c7af693a88557c8b31789c5e1de4976b19", - "4a5e390c41220faa15ebcec665455c156860d480433dbe38b832b18b4deed412", - "ed01d621a4d03d11ae2812891358e638a138f68eafb4504ce5f7e4ad4dff3c0d", - "31e542a990b4b808cd11d0b440402894d69a012a14c8351d8bd15775edb7c1cb", - "b60b83318e58d3ceb403cb3f505403260cda33711901c45392454b9e29cdb14c", - "ee4b70edd70a1d3d1e1f62f07b108019e3608137d32c91343d246c750360ef57", - "08cb4a53b73429d8c3b66c9dbcbd1d336b4abcf07554c534ccf3fc617e1d0a27", - "2cd245a99c5e8ed6f9d040b2acf593f3c7a7fdf9f310da267768605b81a8e316", - "ebf4cef5c2657764b3b8353fb17f267e20ceef5f1ad894cb863268c7d425c039", - "61f02ed97c0e964fa55af9b3cf8fc3ac932d7c5ffa81c2f2af0f93bc113f9081", - "900e14c11c3ff49080c87a83b38cdadac8b2a0dbe2b4e37bd196463402dcf20b", - "261b5c4b5c3646d0ce15ab3033bc8af627cbc640e0a19db49738897abb24715b", - "e3a34f33c25b83d4b2b801b58e5f0c5484ddf31b3ebbc9253ed2c775cffef8c1", - "282622909009bf68bc6979b4566d9e42b474ae1b1c7e6a816a92eb05fa4b08b8", - "f9bc308abaa9f62a36a79f61073637d9dd939fb0e899d1c2f07dc307dc80e795", - "7ff7e6fc596c1da5ca3635d8857d4dc5106b91ab1af587fdcf2968729df0d192", - "af4239bbe472bdb6c61a00803f201cbaa47bbf31ac3f6a2d9780309b1d69e72c", - "25e48e8ceab3edebc30c3a44435d9c219909130a8ca9fc18c44f4b5825c062ba", - "fc5b20f3dc163e268280f838a1bc3bbd01e06089f8bbff7e3c8d86c18e8bda0d", - "b8190b2f821f879211c5b91f89fec8e494c0ab98b80d554312a971873b42b9e8", - "ac4031d82b9fc49162432f8cc874d278d5c4e656594a122e4cc6596837a5fb45", - "007b410eafe397243ccec056073775d225422cf4bce42a91be886204d2725583", - "feb3b077b3de385ca47b2e1979c06395623c1d47ac579a434859e29edc812c2b", - "48000760f1a83cbeb33a201793b3c41cc5d3ef3c75447e51aca049771562d6f4", - "d30fb7000dbfd981f93ea2dfb278de151812e8f2094aadc7792dddb4bc5b9f36", - "5748b574564ea6f8ced263d2b354cdf49f8398f422cfa39e776a7e38ff9ff471", - "90a25e988c4277625ba94f2b870c5d3f925fdb9f118e058f8411841110c38800", - "a7850f6866908be8ce121bdacc552d15a50cf19dc3d1b0ac9b24ba3d7cc7e1e5", - "6c99bc6621c8a903662e81562eeda048a94a9194ab2ec0db059ab52fc4149434", - "7141b355ce06b84cf2b3c8cf2b71ea17e824421e022d9eba52ab0d4f6fdc2ae4", - "58f5dcc7c5e2f90559bfb273b24d394875ede1a3b929543d230bd68cd3672f06", - "f1c4e5d950e3a0782a7bef074b3be92af30e6bea68b70199b8a36ade5e4cd79c", - "52240073427520979abe3857d5cefd28412f582b5dd10bdde90ed4a52b0b1ba7", - "c76f040ba11185afb51dff53c25090a1bbd24cf5c7712f76358e9c1664a5d6f7", - "c53c7234a8645f28ea3182fa241debc2d063580ca77db776d24fc5cf766810df", - "0e4e46612fe7af8f7c1630b9cb9f97ba4f26d097101d0f22fc1c02de8b264a8c", - "74f5e3229446ea5c2f09d7ebaa8a6be1a856f2ccde4f7991c21035c4c62cb271", - "7f4dd7d9737e4d2a16a24a231cc56869b94c1df4d48fb494b1296850a9df5375", - "a5b3c3672f37511b06e12f5dd9e512376f472c314a7d0742390140856d579e0c", - "f4b7e3accda145a3b558b1e4c838e50422e7cc36e61e3527f4bbecbec4651cd4", - "aed4377e0e85f6b1f7f4f31e718c1058a3c2a347eff5a3bd347206a262d51290", - "2528ce508167e8eb2ad227f8f3525fc5763a3bbcbdfee5979add2ee5fe95f394", - "6398e0de3ba9355d437232b3d61565479b7030cf0e05fef7c33a2ac9e5ba7f7c", - "2624e90cd6ed1728aa852f651c3c6c2fcfc15db72752e8d2ea5cb55d58751e03", - "200129823f00e854085b4932c6b9684f8de8073bd374ade267d09d691bc8d545", - "2593bd46c205fe86391c20699c6bd892fc41fe6fb27174ba7e98cfa3eb889065", - "056b4c48dedb145d8dfbfae4fb1ce621faa511471788140461796e6bd6aed784", - "ff5619ee265093c788136033226260098ea3df5c0dca0eb98f56bc6da0be3901", - "dbc8e33a112d42006bc77e7e45a4109f570552987c7a788db7a5da4631abf74d", - "9ed0ea983408a5ab359c866c54c943c014cc0ba215eb3bda8364090d3661cb35", - "990b22ba2dccad8da7f03a5381af00e1e5f541eb6c79739d4ddbc16c723ed286", - "f9adb6b0bd016af9f906f7f2c4ce145c8ca044c4a8018395e4ee3352481e52d6", - "8d1fbdcd5cfc0ae1ce7ae3ef5680f6b24793c753d93f3db0cead2a66af853e44", - "6717f1856325a88b6e78e47d06e31963149b989ba4ec5d3536e2d7f790e79099", - "3cda0824938a7248603f3ce910f6d1ed6da795755996938a56ae56a9050214c8", - "8b0bad340888098d46ad8a21da0257ce21c9c97d4efae0cd08234ef04e58fbd7", - "3c644b8f71fe629b11919cfd4a1489555a6484c92ff8aae4203f2ecac8956153", - "41e70b998f719c2b90325561e60d65e7e8b40bd3b6b32301aa34cee629ee6cf8", - "639712ff2ec455acb535380505044000c32880dafb53579c672664079e76c968", - "d85c2a67613f09a4fc1ab1ccb117fe3c3ecb6e5ed81a2acd1c3b2c2f0fc1dc5b", - "9c590b9aeea95efc789969664b57aab901a8371f8645092ac9c1b7084c994021", - "1d00e388a6b7ebf8abda98d79fc22d77c402270c61f3492276cfc1ea95880ae3", - "05e281af4bf1078f5ca24d56f2ef386ba14f0cb36fbe2b92716263f7ddcd3875", - "79d90a57ca74428d5b33671c530f9348faee564a64f89b2a87642c7ca25c0aa5", - "50dd7ec4fbf0372783dab04a9bc9d080aeb4308c39944fd0bdeaa3ff4104e0e2", - "e5396b80f818e9055700828af59283e3f4206c8bc971b6de8b4d6372c8ceb120", - "f53bba485fc52dcc0b5b708651d30ebef75e892a118ca9a6d2aaf930ab4f5243", - "b8f5c6f3ebb513d8cadfb7a7cad40d3acb2167af138b847029631d9729922c54", - "af244765fce1d15eb75a598dd0fd59391397265b10b852676e7714a22fda6edb", - "35db36c9894dd0ed4f141fb7956067502f688d0476b74f16383753b4b6441e6d", - "87d337be2670f2c2f92810d69c62759de9eef26ebff639c50e4cdbb0a1ff5a37", - "64fb495bd3d38ef0d160fd46e03106218d165df0fbb805ecbb8197f411d14bc5", - "a3c681e26a7bb96f5d895a3d969753f31bd2046a4c44aa54add6bcc3306c6b95", - "5bea0f78332a97d76e1d2f8092059f69d43c2e21d6fc1b1a427f3839e815b411", - "78bd77545784ddefc9fd1a3690d870b2bc39cc97b70b6c665380b5e4523de8a0", - "389aa51669c4bc3c70c274ab4c370f52658b7d75c830528dd94268d2b956ea80", - "c2f2fb53963b3140464328f3c457f6014897f672af2a8d79fc9f68e47e84a605", - "78f3f7dcd4095290c72f5f9634e28ce816e4c218c378778003167eba537103ce", - "4eec351f54ee8de658ab73f10b0074a8591dae03c72c5a8c8afe14a379885c07", - "976dc0f444df2a6656ebfbaee81bc68957154662f476018f3633308834d66142", - "e945bbc296c65646ed106c508bd0a7b5201d102ff970857440d449bc988a2b23", - "d6337cff57a206bef569e891f789e98d61bb6f21f84c3baa7852f090bd812f60", - "c25f7069736bf3819c6813dc6919a57c534f185175d90b36fd7d581fe34e3f94", - "54b7a27e21d893f94b9e9604391dc7e2aa2665d471f29a652eb1800aa17e0328", - "841f925ea162f975bff259dcfe891832eda91a9b3778dbb3f347f197fd8b8dc2", - "e7033834974b216918cabda1f4ca3fa405fe316c714cba9d3c68243d74756535", - "ccd3046cfe625f09bb62fc78c89086edbab71fde5413ad0c86b4a95f347e8cb1", - "1f915909a99ade97ff0452bcc67604656a9d38e1485f9fdaf67e8ddc8ec3c616", - "ff577d9f086ce9905c90cc98dc756abadd3ebb8ca88977a18dc5fe12481ff9f1", - "7a37117a82822cf8ebd40e6cc721f7fa0dd9bc8df1d0f1facb4e57b2cf0f81fe", - "c58f7df39cc9dc707dc1ad07ffa2366140e491e81d8dae94caa0824f132c00cf", - "e525c68165ddf5e14ebdf340b44c8405a47cf564b04ce8ab69a47030054829be", - "1ee083528b914ed158a1debb2c6b78f0c138d88072127716b74c0a66aa16ed5e", - "18e16f7430022dc38888ec4d703a689dcfca47c301263c26270686405d2719e9", - "8578bc8143822ced2dba75294cc2fdccf3175ea0b8b4543694d50481cb14a2be", - "40afbf628d44092008db6431aedc6f6115a1f91b455e7968f5ede0fde2c2d6f9", - "805a26e5a68b66a768137fad41b20eb1bd2a7e9729d88643e70348df96f91655", - "d85b5164d5941b5f666d63fd007fa7c6d4703f6c9718af6cf477a78bcc66807e", - "98916c2ee343334232251b132d192b0ec41278e226c71b570cb76ed56c5a27ee", - "37055b2fae11c29fb75028e7e3edfb0a76eaa2618af1edc952d525879902fb4a", - "f01dc9efd2e5b95941c35eede256ae3f757930ae1b666279e0cb7acc220d924d", - "86125a117452fb672cce52f50d3fb2d10aceb6bb04bb2c8ccc131ec72b7698a1", - "69dd3dda2ab61ac8a1f259cc996963adb306143ad0f348ff338ea3923ba04a46", - "bbcda358c889b15bae96f2b875bf10abda7db925d6dc5b2b04df19d04eed9e8f", - "51e8f2f08ad1e070888ff5ffdcdc4a4f9bde1dcb676fe7657b6f69fe592d34d5", - "0646d9070d6a48567c4e2bcb2e7cd30d820bb599f3a641b7eb5e707f0357af06", - "08ca002b0c472281382a2a66ba0779409be07d149321b887e5d314ff61d2569c", - "03406d8eda4db1862a02da785f83a8b271d928597bc5ded7ebedf7811144f4f2", - "9a3089eda9bd9ed72114926249219c9eeb122a93166162f5882c6105b0d6fa70", - "efc65c884d1b6a60ac3508e8fcdbb7da135db27d5f1ea9761ccff587d3458f43", - "a5e9ad30c22ffc58210e22964099d016d9063722bc72023fb01b134da2ec647d", - "33cbc272fab0f2a52a948cd25569c72d7ab144943b06c2354526ea3c33fb9168", - "81d7cbce4e930c62eedf3301e0d2cecceefd498d861918bc7e33f1712d25e2b5", - "80ba3d1450f224b9e9d421449399444082fcbdaf7dd70955a7702f5af1b8c0cf", - "0352a30a321585a3ccc3cc8d087664eee4afbe63c431624a92741166a102f0ad", - "d2bfd41f4de4662aa5acfb28f2713ab76afd64018c16a1c969ffe12cdfc3aa0b", - "23af60a40d18942ec72425c2a4eafb6b65e604c5568c5a6362770a6458901b13", - "a87ed7fb0803f2281ba8b06c2d9333f3aa3718e6e3be4c84849fa76f124e5280", - "d02e1d8b4da77bc8887837b351613f571353006958b309e843a4ee0aa9b64dce", - "d9d62bbcad1de34e4e686533cb28a38a23876aaa9f19149e39322ab8a0a7b2ba", - "c1db7883857c58916814b8969f5ce96a24d7622fa05bb0d1697ad01374bca2f6", - "3e44853cac5f0f1b27ed95c1c1e92e65cfabfd61165ed7715c7ba16066b8c8a2", - "5f6bece9a834085cbd099e523262ba98b1060433936e8106aebc3574774fa829", - "30d2e88d4ba9b9a3d7d4cbba21455901a0158a934fdd2d0b2a2b1ccb991f531d", - "ad610d1528774126a5467512df1434fe7bdce492391e23f4bf62fae6961b675e", - "1cc072615f7a77119b924a504fa621a43775f4c3d8f29dfb79798559712b9706", - "2e55f2d22b2bd8b3607bc2e45e4e112c8efd5e3460efa80efe5d740218cd2829", - "c522792e105d8aef8fdb01f863c0e28554abdd7734753da9827310bccf757250", - "59a0c50411b5b8f1b3a6553c3fe6ae5523a7317af36a4ee79c5105dc09da07a9", - "b43676084b3eb1a45bf3ace35a60d31a8ff9983c5fda0ebb59094bcd37558bdc", - "84f5fd2d5d2c8e46d32291bad76b61461ab7b32ae68885e43d5477f30b7e5ad7", - "2641473fd18347275747cd92949dad7758fb3bcd36e6aebc226333b249e0ef92", - "6153288e1ce237073c35265d973be6a99ac774a53159ab373c69c598433f1626", - "aea623d0fe448fb447cba2c2bb4fa53bf30024ed0727a1c8256e4375a78a7a9b", - "61c056eb26a5790dcbdecb293f3692b43f45e7e7c817b49c1903608d569d4ba2", - "0d553dda144d2a89e3af39af989a18339c12a40a20a281e4403b7af145a02e3f", - "17bbd97cda5b85292f9343338377cdaff40f84008f0c5518b8e46c7a019571d0", - "e4e094a0e7a20caaebdb4ffb3a3741702fe25361aa0bd3225ea51927ed3bbfa0", - "60cd428b76096e74f705e7b9981f9a8a6dc67452390256771bbd97a9c7779ff5", - "1b9f05a65d6ff0b6ddea077089434acbe24663c95981fbfa9a3303f1d38c9c0c", - "662e848cb5b7968b1961fbd58f1d9a7ba4b410094f021e411d058be4c656add4", - "1088987ad4799d26e1cb28fd7849571c68106076ae8c78fe4e777a6afc14ef65", - "c14a4b43d6e23274f15461a1ee4c3e8015f78a660f6e7d7804a887ab6422703f", - "9fdd611002ec51691d4cca540e721200e031e380b90d0c033ffc87650d09d046", - "cf630e90227524f1a4f379ee75ae7be21cdb99c12dfa77ae76ce6aaa674fd48c", - "9242f8527389364b6df972eaf708367abd12065242b5f1ea1cf30d2317f1d54a", - "1fbe8d0d2a040031ad7608c158b8c860bdec5c71c309886f4f8c406c4a440416", - "ccd9ab7b18a9fe88d717a4e54ede6ffb8158721a7a2acd1175d0aa9edc950ac9", - "ad4b866c0b81e4c646f8da4b758d5cd00bd5ecd1565bfc47e5da44cf3ad39672", - "e5bab24ea1613233604972c8574afb7f1fe8864f160dc43d431506ae45b8b02b", - "b364cc0a08a00ead0af474c629160684091280da22c51c5ef91b32f198c14f64", - "f22b09a1c49c164cf426ce179a271b9374534578ea4ca8f46eac8cff8c6a2ce6", - "a9ddf3ad30421b8f7a8d2bf0f7274e3ab832453153031963e9d3bed7a13a4503", - "5fc771bf0f2bb5484ecf85d03544d57d28675467478a65660f3c36fd57033a04", - "1a230f66a6e116a8d3c4012c94195b02ae62856181b0b97d7d760e254ebee0ec", - "ae1a20d10a37208265b860c8e4819735b36b700420c9ff1e3ae032000145f348", - "1bf790d210edf0b67a4e691dffde0a549f78e3ee1024b9518660b98ff03b125d", - "001a19abfaae74a780c61c53987378275b52cc84de867b501d62ceaf72f3350b", - "c99b422fc87b959389239edd48ef4eb60269311ae15960793c352349b120c101", - "b3867aa372a7527770aa89b2808d071d2de704c922a34d28e297b14abbf94fb0", - "5dc4fdda8138cb58f9c1a0b8c78e3897e792ec84eeb60f8b306c49300f51adac", - "042499d63b4258d6fb38c13170456b1dadf92861390597ac8edff18f4067ad3f", - "b56d801d5ca6d1eef117acd1320717a4e89bd3052c1bb4c9ecc443366e98181a", - "b5d9991dd72a000e368cc4e9961862f49627b73a4d1ac13b66102258185d292c", - "56d58bd64f91af9a88d08581a63a73f32891b88a62761c31698d9f3917ca821d", - "6e9a779502020356d246995ecb0d0c65ac0e88dfc2dcf2c49560b9af03f9e7f2", - "c6822e74fa7de61504445aaf42915513bb97933360b0bf6b13cb78cc0fb2bd25", - "17d0ce76a922bd987699f74d59a1c34bed51c3ba790536c654f77452072a2124", - "602aec93b567f30140a3d1ecce24c2e3e8e9aaddb75faf4119cfcccabf182f29", - "1079d320c36eb4e8b8a9081bd0a37dc84eafcf3f25a6e4b60b807a075d6ad1ae", - "a7f5f4f27e3c2787fe165b4091df9646d38ebfa94bad094ccdb173346f5decb5", - "021c524068a6082b368e37501d1679290e9bfef6ea41f2d5a624969ba6aa9dbe", - "205fe6b5a924059d5e4396354e4bdc61c4371159078d92ed94924b815684717a", - "0cb77b0351437260b1ed46478aee06ae6c1e6b690f591ea23a23ef69dbeda68b", - "5eb4a26edf2175c6d78e7f758f1b8e4bb1b871cd53bfa03f9daa3a0ce2a4fab5", - "3af30aaf37af047c5cb9dedbe105f8f572a081a9f5a594e08aabcabe17d386b3", - "d68d1adde768788df06b371f18a6d2406f33ad752183c86248a709b4f770addb", - "8518975223ab426508d791b2fc6cf5dbf771890746f1def5b176ac3e0360e8ca", - "dead977a3c8d1185b6ada7cd3b197ccca6d9fb318aa620e476c64d947f8082b7", - "f1a6f54f78afc8668d8dc9d2cbc66504a548518898bfc9c427d2fb97b5a1a6d3", - "dbcd176baedc47a03a8b61c64073858f06f9d265de456fe6f12d392aabfe905b", - "42cecfa2dceaddd8490ec84b173b6b587133e195811690abe6af99c75f56e2fc", - "6f4b12d110ce12ee1fbf71a3bb4094e0a511aabc7931ce898e87e638011de225", - "7b839c4a804b9a5aa7f1f3f919362a8461c487a3e00e390be0b1a39492f737bb", - "e6d206d5f96ecdb27ea042683d02e08b6370428ad33bf113358e6c74e473b342", - "897757e630d9861e1a8bd28797716a6dcdad9408b9f13da13301367245f8239d", - "12a88692a4d92ebb8587cb9b214d4523e0f6cc1b3a7f11aa21b684d716e5285d", - "331d81b40129470fb09bab66a848c6e3d7b54e244d4f3c05fe088e5c0eeca8de", - "a1b7ec180efdc8ab861971758b1b5f643763a36a5cc4843a6b7769fafdb09657", - "26c0f1757b937f2976da7cb89d7cf8e71639461a7b368398ab14bd437f92bd3d", - "a1a21aebbd4b21463d8d83c56436ee24d4ca0476754ef83a9fa178010a7631bf", - "ff868d82c825edfb156f8c0d15463a7d4d4f66a0835782469564918884ca5d9c", - "48744c735654a8f33676e62137245fd52f9fb6c24c6d6e52251262cd308fc7e1", - "dfcb1b3509fa5571fd8bfd8c866a5ae6e40f879343d52bdb392065f973686502", - "9685d9975302340fa7f796e6b2ba327c1c3b168ac4edcdcd07ea1ac45a2f43d9", - "3c94e6e87d701f469beb2c87612dd3ed22523b3e8d64582dbe8aa49052c0e14b", - "a3b555c3c7f6646292a6702cab237a84bade5a7ce802554e525999c75c24784d", - "c143cbcccfe7eefe5e15dac9cb38178902565f14182fb7caaadc4c90d7865ab4", - "d1b1a6d5a2e11c8c53a34dc6d9c51ee4beb1f8d67c3bc24e25e1d1a8faa1c5b5", - "9c25a247387f9c5009cc505e251c5e50e73a550a93a75dadecf0d972c1a9041e", - "c4460de07c2cfc5a6affb69249f0dc09961c79aa4cef6c590a703767fa596b89", - "72a6e77a1950e00f13be83bb9f78acd832e59a65a86063729c3fdb196990e13e", - "03ae8a31fd0652e054651d7221c65407f6cb354f8492ab2aed20410fc7001309", - "96094d5824bb6939c115ed08e24c04914340cf6d5c1e18993054a7ac87974a3b", - "2a029bd8bf813c2c158b610100647e6c8a19c6a53917c4972c9c7d26c3a4e4da", - "81cf4ba44d633d433cdf9731da3a631d6b4e2271f375134d1640bc592f3e109a", - "dee5d78c7ee80526b36bb89339f88bba210e46d5517d9f105eb5da28c1464764", - "41b823ddff7b285fb692c50dfdf59b4efcfc6ce7e70a1fffbfa1436d62344a96", - "c1dbbbbb9317746694776e17f01c00cf36ecefdf925fe7873cc3306f06890f33", - "350309992c03504e3e1b245d8ff64bb812b17746c17a7415ae65937a6247322d", - "0fd5a4fc83d4dd337fb7efd85de51a1cd67976ee46b2abb926951c1cbae8b1a9", - "a0be4fd18a3a0f1bbec9e55638070f78e8d04ca9e0be5ea1adcd049de12c0864", - "057db1c26ffbbde4be0da891a2f5af1f96ccd6d8fbb0d1fc4a9876243a8a1bc6", - "9950f31e7c7d07ebeea92273e00317d5df191622a15d7c58ec16256522bb261f", - "2f7d2efca7745b2d144cb3ffbfc8842250542fc26744088a44cd50fd49379491", - "e0c93b8b168a4fe3eacd9bbaeeeff0561b63b5ac7ed837d1fb0d08424bcb30fc", - "3be7ea139608d00adbc72e9b18bd312f7d7e9d70e2ce8c5e06d0a7929456c233", - "b19bf5751f22da1b785bc5febc42ff409104d994d0a587ca53b43d6cc56524a4", - "267ab16ed66db2baad3890a787547da2414d2252e01f50233a9e36aa9ca8f959", - "c8b3a2ac8fc09ec044a3250edc578cec19599bfd7fb4f93c33739e7609bb77ad", - "7ba6bece0d2c154e9a545788303c85939e229ad7f03c4f76c511a3c5c96e448f", - "2600a85332dd33b73380259f1114831b8b49e2961e408beb8d31c7b6951dca88", - "66f8ef413e3e76611ee8b4057fec1085d6b2825f67a9571422a0415d662f69ec", - "6f224a309cc28263a74dc95c7baa2a5a97247d4a267287c9a8d8222abdba0be2", - "334ddc794141c08d324820b3f045e3b81dc80e1d0119c270dfbfb90230934df9", - "a6d87f9ca1b1819a6d2bef9ece3b1d7d041a94c493bdc2e372bf0aaa04242a57", - "7c6724383cb226061a55c679828de7a6f1f9fa9425aee7aac8d7f6149f9a1db2", - "4ec1c811e9fbefb5e13765ade48b4d25d5af905550d45a4bc93ed33a2044926e", - "e2d9187280c08b8bb574f2715ddf74a4ff68ad3992f90df11952b844577373d2", - "9aa8db044239e223902cfcf47e552370e68c1b78765060929788b665e52a980b", - "2bf5c83183e7eccc92d4344301c5c99ef0b6c4be4deac13ce6d6b7b880c74933", - "61f0e03cae428c80179e5cac2bfed3f919e4f2f22fd661e65e7ad04df12cc6c8", - "7e758819734efed64010d6de462b93d5d9dc9185045b9b3e77b4017f52963f95", - "d3026206fcdd81293654c883f07047e4545a6869c6a753c681931caea7907c6b", - "92f10cb8026efbb0012e1639e9c4c954c764a34ddb52fd08e4639df42c4f6e19", - "d13e48d5da74df5fc8371eac67048bbd4dc14e4a5c31710e27e999e4f1598ef5", - "427c406659b9a149270228aaf951cfc9204f47f08ddf6a4a7723f1eafad0f017", - "1eefb1e5ac009a86729fcef06494117f4dc9afade53646ca4e9e7b528d68a693", - "81688635a3547dcd1c9d296e22a0c58daf2689da9634b4f55d7bb79fce626351", - "01a4b37970405928375b7875e4f07b74294f230b03791c6fbabc506d5126f807", - "8441d5e973a5bf7c047f7c51f8d5e7031c0ad155da75c276cf971a98912b4b82", - "f31fa90cc6dcc12d3cd12b4fb2d5523beb7c4b6c624e1f2c8b870be6d6d7e4b3", - "2919c86bfb04f93bf7cca40a2410937706a52c50a7463c725555867e7eb99372", - "5e67ce5eff14c214db4987a00bc3e99dbcaf6b14bcfb8c8435750d9be0ebc783", - "2ef46aba15285b9c3550c06213f1f154deff82ac1d597d6b1b742f862ac61f07", - "1839d418b009ed23c080c770b4194b498fea6948b4133da2db95599b72a02398", - "2b42bac5ba63cedadd4cca2911a8c3dd96680fd8d652190fdefc22f247f639d2", - "2d38ab99541d36e71e4ac4f9aec0fdf3e56a6c649821f0bbe82c14f646ed5e8b", - "ad59642db7e02413b6fd69fa4a83375360c23f504f0244d5e71cb58252e09c29", - "0d54e4d5b25ac5411a3e61d331afe3c920ceb217920adc2438641ba7f2a52527", - "1c69fa00b4f5610ff3abed2665cad7207be8341a667ed9c6be8952a07fd83b16", - "040f9138d118cbad1363beec411f7397653a3af14626c637afd82584a3b9e94c", - "d494d387a6a7d41b2120f409a56202cba08b1e50f48ff5cb2f6fc46c2df0bf2a", - "287db98d6c8d97a0269a5c6789598598a009b58297f5536750cc7bf8b6e72ddf", - "c91f09babf13f2d519566cbda847a1fcde9a245704670bf5d9e5e7d16562da4e", - "fa60a68d668154c76beb1bcb4ec80f0de3b389066b2eea36829f0aa3324086b4", - "c4d57f4b520bf4694dbf67b24130c353cf67db0c1959918aff71e9f166dd0d17", - "f7806f7094cd8c36478a6069f75be2b1912c21534892635c979f6cf7ca770711", - "fab948045ad495cce451ccc6166922a84b5c09ce6423a15eae15a640f277abcb", - "06e4a928567b35f6782485a318cf79e70536e6257049783fbc61ac10b526dd41", - "b238fe8ce83374270c22930a42fd7d28e2769e6f0e5c202fd4db0ec1b7cd6111", - "1fa5ca45a3f6cd33632df3cbfb091e3f0c1d03b7dc414de58b1a77c24a755081", - "04c89251fda712e4719e52936fb255cdc2d34b6412ac8625ca33c6240a0e09bc", - "bec0f796f8e2b2542c2389cf38ee127aa89c5b6082977f0b45f36a1419fa6192", - "860b7778aca05e36f01112959a8482f4c096651f2a88037c0282a4999d2c1d44", - "fb3a3943716830189fba2f76f4b368a92586fe5bfa0eb06076fed9611e8ce16b", - "1715aae86ef8d19faf919eafb48f80efbcf7bf416ac23e47e937dbbd5c812c3d", - "99bbc29452c66ec7af07259a951706b562561ff324541bb55f2181dc4ad99be2", - "67354f8fa73a754a5dfb04b5148ca48ca558c7a43108f880921fef07f6629f1a", - "104760c9402c1ebf3f0a62815cf5f219ff19d6db6d447e9ed6ea71e75b91b19e", - "06138ea949a7510584ce3625a72f2c14d8102aa672c2763e03c7bf00e64cc677", - "d5af75abfca2ed312ac970aa154db9bf2a2ed58e9861e522f6ba90393f5d34ef", - "7f6da39a70259373315bf14c6e4d56fce7235f559b45dd22ed9c95c96f7739b1", - "050770201b0cd6d6abaea272a521bc76ffa4706addb592104db4e2ec5b47c846", - "5559458e0dd05777b274ab07629960c4d8ee163118c176ea77572293c44e769c", - "e202bb3fe1011e7663f2c7aff1854f2f7fd84e870e6eeeb4bdf7cd5e24de3f0a", - "b98ccf224eacb5956f964ffa9a437826c77ec5641067ee8f8b3864b8d6ab1d2c", - "6e22c68005cbc69bdc9aeee1f59bb0210161fcbd64e8bc8befdfc409484e9979", - "5826084bbcc4d060b75c30ce716bad01266b686dcdc4a430115e3730124fe685", - "d8699324c46778bcf1bdda66bb0cd371422223a8848d5587fa9e765e3ba7f7ec", - "80038192c5499fdb08e479b10e3a100f6a02247033ff17add965cf24f2700ccc", - "5bd3d85dbb1cfbf1e02dc2dc846de2ff054df1f8dcd306fdb42ada2400e54a45", - "f4323bc73a62607dd05a784dd48167bcef3bb4c542511e321d2d442be8e15c32", - "56d163f8868d8d930bf9d08899e16994c06a21b2ca408852a7623751fdeb4fb4", - "ea98d94415944024cc67c52430de2f4838be7311a32c5e57ad9fb83a8ce6655a", - "d0f839211f1d824aee5de4c15036096f1da666c4ce0980525dd635905c532f16", - "f4d2b5c863f9416322f9d1f7cb1a0ab3332707bcb52b65f36c46800564a68c5d", - "944fa36f5126947f41a47c855c09cea646d40fd2dc023e23981d03f21713baba", - "18d16e52c31bf5ba635f7e837d403bcfb692bc53e0552ca6dbb9853956a1b129", - "4999d23a7030d3dee1cb5dd1f7d4a2f0d2c55ec9ff8fd1e50cc1e3c6ad9a2db6", - "df45c7a70a00a57f6a6b6fb38395f07a390d92ca89b9c215829629064fd88c26", - "4c6685ccf167d0209541d8b3f9b18cab8833d043c6992f580bb1e40d86f4f6ef", - "89b4794c1d3bd666a3a44d833c0145e451f2627c62dc667de25aaeda6253187a", - "e1232522d50e28cc980555cb51569c51d14bc0cd4a19cfc96e82e611c3d14d5e", - "adebea553ce8c2e2fb14543315034ef2d29aab860eb6419bd3a97a2cf5d60732", - "53b2903f78cb777724376809ed2bf2bf9142d21d1612ed4b683b97a991b6e198", - "1a5a670873d41ac7f28744ff5ee349504f3f632c4f8f4f01e51dc03b2661354d", - "43019821fec0691900513841641cafb579c146903f75554459c886e1d468a68f", - "5d52c5088b88c9ed4a9d3d6cffd41a6c748c14442d72dc9b3f6e920da1adf929", - "bae87004eca0df329b9525b39ca3f53d2f95f948a717b9563b6be892c458eb1f", - "558d9a168f456009a655a750e607e6966e4ed596a9b4ff4d2332a2f40d9fc0fa", - "3efb6ea93c0f1354351869e5fd77d4fb3b9f24a94b741295d5679e845518efcc", - "14dca12b9f497d9f7cfa7618aee4429df8b6504fa90bf1707eabbd465892a281", - "f856e77b9dbf094db22dbee81ab695b0cdfdefd7d337db343567df288712a492", - "6ca274775b999d3e1cb0306e5a87329ffb3b47523e3ab87283f837968fe95007", - "aff16bd79a2217a8761a5b4f06d9814c6284cde9c6408529ac929afdf1fc8786", - "ad81f1b6be523d46982853011253fba960ed64c1ea38b4e187ba4e581dc8e655", - "d45628b7766b82dc3379d25deba018c224781c4556cb4e04e1fd1c5fe490385f", - "50d5141716e79ff0ec8d7e3d4cb6d900705677ecad58c899739afc3b8f1e4a04", - "c187dabed095909192710eefadfc4a1d7e46117ec008626d0ee5651b736ba8b9", - "2b9f565edaf10c0699921d45688faeb54194eb9e9f0539d7c8d15e2f61d13128", - "8d8fa88d6585b214e1bec20de0aeb3eabe3af54d9fb8c7b9d854f5b2b1384b85", - "8e7e089edbed03842f46aa369373c14f78269b24481758dc1170d1fa0fff4854", - "6ee66122841e71509e977f5e624ac32f3d6bb0b3778a61f3fd74629166dd8c0b", - "b1381f1ead7f1f518b4e52a838b2d78b816b84019e2f2543f6ec6d5aaf85769a", - "41ba019d0ec3a6c4aaff73d94d1c8a4eef41fbc22b0610f11e33df9aadcdd50c", - "0d29e435910ea628e5a38a6d2c953da961463e70c9cfa8cb9ad0d6f636ec90a9", - "362ba106b5fb3579aba2bee7ea6f9913f5b1c819fb247373fef375fc7a1a4f12", - "33396b1c7e2e5a1abf1e2f51fa04ccbab58cd1504ca542d643a17d96eb193054", - "2281147f5550b529e2bc86c7865940174a1c2f6cf39b6dfd92e55fcf4e53326e", - "0620fb0e244d8ad85ec6d6e03e5cd5d173d33c60354115c8a0e338fe7469d2e2", - "4095b0f45e803411c8170d930fa59efdcd68cdcc0a36ae2320f655bdb8a1138e", - "8c83c87c920d24f509e0bd0f1e5b23fc7373026e73b5dab3e5c9abe6530a71e4", - "ddb52119456998839dd6a46e3a058ab75dd1ca0accb2897f010e5a2a25c3fe5a", - "2fb3a0f981d1c6d0c8c8a4e5fbc30de06e02aeee64a4d8997b402f2366dcdf52", - "3808eb51c5b5414dc7de08894bcffae29aac64a03f5cc2cf836cf4d22b8b386b", - "f28cd06087f5ecd040cd34e90fed5c39cbfd3fbd98d6f5e5c7906f9e06559994", - "a3d9973fd06faeb757a6ac367ef879300698e8696f86244d08e1e0162e25f89e", - "c1ce6415e85f36d077e8d835f31750bbd50ba5c3a45a24698428f6c942c5588f", - "e90f44764581b6fbb8d71f2d4e54692ab8837f8efd2342bf9d8b02b547e873b7", - "0ad7f4bc77f785a09209c6d59d16d417e9ca8431382ce3412d599fc924c92a10", - "0b17d1ea4387ba41eff15fd13338dd0afcb2cdad92e6d10b510e5f95185007ad", - "7eade4b367aeef5b605144705f15407ab7bd7ca27ec11ba33468c566d006cdb0", - "50fdfae7780ee6b567fb9728419b520a8b73f069e873fd79f6feb78f2ce8b682", - "5e0dc3874014a93b612eebb3d16b5cd836a169f5a5530100d907133275d8e033", - "e63ed8506322c03ceae1275a8755e0da83444c598287500bb3f4f9ab0794bb3c", - "ede39cf3674cba5864763eedc83cd1937b097d397786e9319b3fdb948c9565f4", - "e8b88558970ed46c0a2d70d9ed8279644ce10e276df508d914ba5dcfc6ca78b1", - "6c6dea27ee226fb40553c6fbd0d3d81e73482f4c01a2435dfcca1514be67215e", - "d24b6a50b0bd49bfbf2eea072b658461d2104c1baf33408931b1dab725892e01", - "dd3aeec9b5b3fa4bfd64099c19eaf23780ad09ccf37f27d9fd72b68cf8ee2955", - "cd10815582ea9af429860be042952c981a2b613d051cdc861f903a63f7f5f4d5", - "27e77b8d5550e4a551c31496d248949da4f3f68c7defd8387751b4a3f436b3d2", - "3956fec3affffb267239680374ccb749c71ad069d186c4e45d1c48a9b71758f7", - "52fe2f4f9fc82241bbe2817d7f714dd31a640ab236d4ae277d8f79517a6fdc13", - "53a4f03d2a7dcfe2a7f5e2569bdafdb5ea9249367f6c45b2fdde876eb14a3908", - "6f72e9c5a126d443804213f93f0b5d1e8bc4b929488d5c54f9fd6c6808a37c6b", - "1c803681227b23aa10e7614593b3aa9c659473699ce6610dd62e77abaf3cbb95", - "3b837df0f11fffc593ef138408678ae4b79c26a6957f37d74fa3bbfd8b4e3107", - "38e9d0e6ca3ad6171e1fd48e69407ea5db3ce006e16e48b7d6b70277e0802921", - "881fbeabbb67f38a39bfd6404d8ab99c8204d26f5ed076f1b656bfcdcd55f646", - "cc8a64543cf420253a856dc4f8c4af620930c0179cae0056a8f5b4798a828f5e", - "c068ad26aef465999e33654fcf2f0325db9e51f0894dd82c730213335fc067a7", - "fa3a524679393ecd0e3f7dfbba03b3b92fb564ca46d50f3abf2835965691ea0e", - "17670576ef6fc48cf3a5f41352f6db29fdc7ef735d0a2b5d823bd0221cbf16c2", - "4b898ca3efae1884cfd63b246af359acbb1c08b8549e661986e0e6616bc57f73", - "bda1f9ed625e957e44d82917a9c01e9e943b20cafa2e0420fcad9166b18fea86", - "823f92dd2a9afb86f84cb0a66bde8ac428a092021e4fcc2f39dd7fe63e38f152", - "c456db4f7ec751a4be31e3d3e4fc27b5edfdfe9cd7e4138b660d5279bf02b9aa", - "6871bfeea00396ec47af206654e9e955d59ce0232ff1e5c00d6faca69deb5320", - "6adecf52775289a4a4d3ec781820547fbaf6336fb1bd28e313747bd43cc645f8", - "adaa5d46d14a7b5fe8c3efab080b205348713cb7bfd13a1697344efbbe638c1b", - "a8ffe0c75db155efe57acfa93743befa6034c8d92d282ab29d2900f5693b6133", - "0db6773ab13b656c2b3c4a161dfe86de41f79ddb2bf2260e1256ed3bf98cc95c", - "145bb2ec4c0fa593f8ca58978b944d390addbf120fe53cb94371dbbf7e6f15e6", - "7a9f8656ff38854faf6bbbab47b3fbc5ba573269b37527c15e7fde680803e4ac", - "758ba86acaf79aa0704122ebb0396d2aa0599e141e8b0213322649683d8571b4", - "a750354ecc1d6e6ace6bcf2a935c15e6f820b1e01ec9e933394792ff3b5da382", - "afcb20123c3a75b459d504aca659b582a834b4eb2213255e29d2d5cf9747880a", - "cce1b4e3f119cf72a68f454d11b891cb08e4341000d28492ac5ff4f08bf575c3", - "c62423c260550c78cf7c69109e3ce264ac76a11db4ff0c0e356dbdebc2ee9676", - "1e8a271e335fa98d03a1aa1a1a228a85d4415b2ab79fccbd6b7028d36027d4bf", - "56e42bb20e35472eed53b530594c6bd1ed4477410cebe80f6a93803a0253cf8f", - "716013db93375b9eaa2ea700c24f12a084bd0060e4fbd9c0805c0dc66c641fbc", - "bff1ffb33e5c2cd239ffbdae035d36b37ec3a49597d2d8c530ba488e88b6a8b5", - "2d48c359b59cda25ed85a79643d9eba2dd96e470feb078a3b2f87bf9643ec451", - "da1a8028baafe5d1c2a8c42db0be53575ed1657fffc04287e625dec61b02413f", - "f9970ecd92ddd5969281f6a1717f4d64859b9af23ad93a0f97b5486f0c7307e6", - "acebf58fbbdc805eb91f8160ed68752eecbe843b483932f92ec65aa910a323b9", - "01140ba581b41ed3b19a274951dcd4f3db0c4afd0425bbad3e4a7a1854ee3c5e", - "04e8c9f0b72fb11b7087f38ed099f09b393899e683cb98efcc36976776b46fe4", - "7bc03b9a0a9e13d663c4d0b8c7f9b44e10c927cc259da8c8ca6828f04488d044", - "2711d019db25f802179d77c30a9056649a390e3d8e8a98ad4a4e4484cccb77d1", - "8f2cb2942b64deecc5b9fb070656d8311691ca8029324865e2ae6502f878c9e2", - "c3ce0d7ef7938cac736979b690984353c6b081346cf590bb9a67a5554299d896", - "594e7973b96a3215b9dd80333db77f19ad34292d762a0551552a28f2f9da10df", - "fb9743c29a492a00ebfe4498579743687b76ec03c7c1ac6b685b62d893b986b5", - "e9639d0748c5e3cbae9a098cdf7dec36b1060106cef43d83a19d7fc7d3ed6411", - "42db6ff6bdc09f186543c1fc4a638e0901a3f85e1a4e6138bfeb6efdad216da7", - "0ab98bcc7866a5d0bf76e76e03c6c40654642a4b1b5823857ac08597235bb4fe", - "334c6f2ba3381a38ced57441d3a2c956b684df9f80e25fb2012a884ff6c34304", - "4333a973d287f667fc7fa9d546842418c680567ba72abf0a48c11bce3f432303", - "765c1e1631552494224c00ab85c03729c813e653033877abe49ec2658935f549", - "61bca16bdaec4e3052fa04f90b9beee22691fb69d6dc5f4418ad7a8bb25c8a31", - "94fa79fbd29c655274c2c10d5d500c36aadd64df57d51b4129dee637d351bdeb", - "c1fa693fce9de55c93c1b64ed914cf0fc15778c383bc23897570be85b79ce07a", - "f0b2bcd0c8df0e05e1401906063e67258475d568475eff025d78b08e6bdcbb33", - "d5edd7ccf42b84c0b9d79ca704ea77cf683c8b0f0c23c7dcfb4cb7dff55c5bcb", - "27dba366bcb2586824dd9e6a79c389057c0755a5b05d2477085b0d1a8769125e", - "e3338c07250f3e54ed0723b2d15fe46e16004cfb85dcf259bc2c12e5a22d6665", - "f22d4cecd1741f16413d2058cab9cb01d8fd050b6564f6e265ac273684d6bcb7", - "d8da793a5c4f1db63175c6d0f74940e455f948129d26bf40982500268b8babef", - "c44f68781962cab481df2e666546e7296c0dcd1b229e437c26a46c07b145bd1f", - "909ae63dcbf7392dc714502347e9e4d08047cbf6d2f8f4f6ea9ae58c20e4c6e4", - "c6fbb9d02a9edb2a5513618441da66a9cc0c9860ff4402874374a2bb2bac5d52", - "ee3f6d35f3d8972f4ed42deb707552df14e5d9bae62256a89eaa786bfb72baaa", - "92af9cb73fa0c5b46d191d8a4d8df2a56eb7af3788feceaf0c166a0ac3c98234", - "3e6792c973b9a8ce737fbda47161d33ca8d79191b577533082bae299315c2da7", - "5779a0761a6a9a4bdbd53b80a7e167312c45f09134c5d4d473c9141f48f3db60", - "d7143ce2d1de6942bea5ecdeeb2a6d9f7c5e355b93f465d5e75e8d679b601324", - "08118e37dee61ad0c5846fd8b56d8859a93c2fcb3a00d2286c5223cafba22eec", - "0da6cf3745624621d67b03bd38f12ff55cc86aa3adcbc2f0da46de8a8fbbb01e", - "8ecd76871a00f194fa500e6075ab3eeb67aa10d85d6f0ff5bd2ec2648295d3e6", - "e3a650e427fcd44220b1b72c311bd6eefdf9d2e88436472d0d294e31cffb4676", - "59324c556155e6463684f2465708373d77d0bc772bf68fa78960d5f4ba672cb9", - "a05871e37248c2e458bbec9fd7d79081d21e1c41ab605f0abd88a46ad8fa06b1", - "f3cd19c1c77a13e49ec22bd238e492300a26dc4ae6c153c44233d8e7168365c9", - "d538cad508a6a4a57061819aea969df0a61adddbff1152533f8ebd4de0c798ba", - "953f9b9628ddb0f6dd0d3bca456afd04dbfc557831d0c382cc553eb15cb41cf1", - "4c9bc82763ffbf782587a0a960713770f528e7f0c716bc46904d8a325674fdd1", - "482b5e1a54a3fde40f69e423a19bf9ff555cc12edc6896be56b70d7b1a3f6a37", - "dd2214b3b8ce9fea2218527fb232d755c831e7b80af4183769635a8d2fd4f690", - "2c9400e6ceaad432186ea337d52462ba8851657a5008eef0caea8895fd92b88c", - "b2c603098285856bd42e1e032248ad99f0bc3a279c7a0841c41ad160dc794a22", - "075ae962c9cb63ac9de6a29d035f4f23de3983bfd177ef25fdf0c96d94d4c550", - "65a5da3a45d15ad1f3a098459754c21a5d73334aff32818c8ab270d72002cd2f", - "7ec6eacd5cb6dc5dbeacce9c5131398fa2ccfe73184fb4de9172234abb06cc3a", - "2807e73387d90e2f937cd9c7caffb201f35732f12ed2b24ff0209b4c6a2e8699", - "8ed1c02deb5b9a7511f1e24e9ea317746b55c544d35e3ae76ecb65ab490fad8e", - "6962f1ae9f26c3d0db40b087df977737c6b6eca7d83a77685c63ab02cf35dd43", - "7acd5c44899090c7913fb3453e15c964778339471ffd5be8298d52c1a04bed29", - "c4c1cefbeb87f9f4142d25de3b3d75e88ca3f7063fe8393ebd0eb414c48a5cb0", - "b9ea0af9d040efb7381e6911c68a50f79c784dc1df12a3f68e2956b3b8bd201c", - "ed54e03a21330a09fa4ef976998a46470a30a38e5adba7b5841c5059ff21f7e7", - "ebe383f4eac1b2552252e28d3717952adf99f44f84788ce4595fa7a2894b85a7", - "55dead5d325a8f7d51751c952e0cf3634054e261cb045385779abd2bd0b463c6", - "089bca2cd81d39d4626cc56ca3e7c89ad1f1edac3ad85e50586843e1fce577ef", - "838f5479cc68b78e6ff233eb8a7245bac0c2e35a0eb06759373a307a8e7407bd", - "bbcb0131702f9408daa4d4a060665dda39243ec9b542bc5f12a71d8fdb5cc099", - "71baeeccbc5999320a46b73733431d1c65a33e72b0daf0eef152073e2c303b3d", - "f81e368932fdfc5023573a13cc324937b6578c288620dbc305233806925b6788", - "ff2c1198f6f6c5e98b1aa0e90dc3e8ef9fec0af6ec828b280f1f231f21359cf1", - "a970f8587594a5c78893d171f2ca82d951d15990c1b13cf56689cde7672ddac7", - "c4e95c6fe7ce264c6472fa912749e39d283f6824822c9f81b7c9878f1e975aed", - "1d7cae2dc9a56452089fcb4e3da24a97f24814ac1f6c419abb5649483eea77d7", - "002cb0742dd470682024007c3230f6179efd7bcb50b9f7a7228d97c1bad716c9", - "faa25d905caed5eef7626bb75432295207b1b12b7e96680d198245d482e529e0", - "dd341cfc16a06fd924607a5e93da64c5bc53764bdf51f5f288523815e5ee8dc2", - "755dac631d806492f023aef59907f395137c4bdd7c8d9d0b6134a6beee2cede9", - "c2010d20aa8de7c87e93bbfeea82fb44c3c1447afbe464d781f3c44b78e9850b", - "e95dd11b64110dd47596ec581f174214539ef4b97958a6800dbc6dd9c9d45869", - "702d5d257addb968dbf0adf9cb94f262216deb18e4c97b4f8e7a683c3224af84", - "6769ec5e61253bc16cb416537020dbf33b2701609c33bd0805089c14b9a35f22", - "85eb9357dd5b7473fc40f53427c7481f210e49f0dda23e0fc404565ffc32794e", - "5c7b2b44492f6d8dbc4b579ff41570f79bbefc8532dd7d8b4085a19d07f4f36b", - "8af7b32d8c39972d18e9c8564d99926623a5a8b6b7c304f8f83ae0cdd3ba2af1", - "225d999f3a478a2bfc483b04ea9a8e06599a610b45c1d4fde44d08e1f74df2e5", - "a467a6485ffeb6c0e58b344f1416a57234db63395ac0466214b0b338a39add4c", - "1737f93ff5dcfa06d1474f06c4b5a4391c0d683e1e45d412381922ff98a60bf4", - "48181ed7e29ac2d49ae33bf24f22839c4d720723301208d502601c9c14a779a2", - "46980e157a9bae0baf6fd05be4e72d3a7186757cdfb870111fd194a1ad4efc1d", - "3227b767b0d1a10a91579d50d212a50fa5c5a5c09d603b16e33fcf47e8c9e959", - "fc3888abd1c2cccd2c451935b70e383648dad7be124e02d1f54a16f4165d73ce", - "b232a4b7bbf9872684ad284dd0df70ba6379c7b24e93c7930db288010f39d997", - "c6c8fc0518474005e412c41d43c44c439bf37ef5ab7fba79a6c6a88339c91041", - "5236c6ddbc6c8a250b9752c2fabb18a6a02a560f46bf5a15c32d74e3d69b6cd1", - "4aa2558e17236a68dafac7325477b70d4d31a1efa6863803ddf34918b50e9e8b", - "8d577a7d1bd6442db4dde3bd2c1e874847f8fbbe99f716b0680219482d168da7", - "215aebae06962ac6a0f84f5c74064df461b4c83f1fd7d3034d133e07d32bbaa1", - "bae197ef10006d3c0d3751d4e573adb0b43e6f0774ae119ebbd4a19a889af63d", - "ff6c8ef274a5b67c496c3cba7336e0bde838fa7b497fe8570f486d00a3cc553c", - "8340b980ff8b5af5dbb50b0a9ae9f65866e9b2e943381e1ccda7d8d276ae1400", - "092459c0158f1fe55ccd8722cb27affe4551ce6c31c56d8735796d5b4dae6652", - "4c163578de387f0c64a50bc123ac0aae3cb66e65d398beaa2d73ee63df70487e", - "0f0a309d42acb81358efbad930cfdc5c16dbd7269112721b4b221ba9397727a9", - "0badf66447f6eea0ec29772e7e77a50705a8aa42cc177c8e73731ba25ff373fe", - "d81c9eb70a50a47415c7f41e1e5f4f4c69b345d7ea6b1b1b3606ecbb6c959920", - "b1e4502c4fdb09fa3f0f995ffe8829e222c7bbd58a69bd1469d2b97f04711db9", - "6ec024cab24140763d5f6c3ddc9d141b1cb3f0be41796742e2784aeddbf4da12", - "78d66a33e050e942f03bea78fc91a1088a75e035dc158b69f280d9eafdde33bd", - "b2b31b136596778d9d34a29b7c91bac0e78da1bcdd9c4991744830733554dd7f", - "2e2d63d2e2c95d58ba86c3c645c9771f27bfa45a9f5be0c9fc389f5c3050f8d6", - "a2affa3e52fbdfb3238ec1ea7c028fc011d1d570eec84ffa390151cda63ac502", - "4b4ffbf1483f7ae34a87fa1d6c772518f2c299f8c0f6fbcf8d7a4156d8edb686", - "a59e28b5e3e79e6113e21ada7ebcb897a48b86abb9498f5a1414aa6ec1b74d55", - "f5b6d5b22b75943280ecc2ea288d0b876f1fecc6c474d981fdbdb2bc34d8263a", - "988f802fe3e340cd77c32fccddbfb80251d3e934cb55affac1332801e61865b9", - "b16572fbd398556b97c77621b4bf0c539ba20ae0428f2fa66768c170733148a4", - "16f4c2b4c032e1c2fb38be6222d513c913e9d310668e05ea57e0e32ee7bb09d9", - "dce0c3064a9c0c33a441ceb479be8d80730c67f8ec6a6a08a2e5dd7330f88702", - "9670844e58aabf1fef8bf26e599a4ae86de309c03172e50720e447ed1a55e424", - "36026efd15bd3e84cb42fe347c2e9b3d0fbe335cba9e68091933ddb7bbd56650", - "0bcde52d343611294c12f022a7b55c151a38f5b9c2ea244c8a45ea49555a9bec", - "515ea7faeddb4815c07f6b00aa10e0dc77843f2fe916206e5e39cd2cde2551d2", - "a06eed14c83766c4f741b2d3709864c2799aa63d23ac105c58e9db154a3c519f", - "6fc65a732ea718bcba73cb3e52b2090ddc45751558f129a1937c149e1c40ff1c", - "028b739b3b5cff6c57e2cd2bca3cf970a791d343111ddf88368ab23c5fedf083", - "2d4a611d9de702d503fab5594b7bdabc0bf9d56b90471281f08fe69f910a50e8", - "a56e2ba8f1544499151c6abfb96cd24e253546043363e779eb5b36752c19f861", - "69300e93265a4d5d9fe8fddf6c9c249b74e4d9762dee664bb4c96b4580c8bcd8", - "5ef67033d1340e947a16e8549e27063a806e0ff66c9cc12c9264f730051fe253", - "ef52a1d13fb96747028602db538eb7293c0e720e2b041b21aa3821fc4cbb7f0b", - "eab26dcc6a06522665d833fac193637f1d61d237f655227bd50c174c7b49a4d9", - "f7511854917697edeed7723f03d3bd34d2c2262696e2d9485fac13cd32e4bda0", - "a9d7d18346985e6d8d4609a852f8c33e153c5a3be17a311ba1d16b866c0d7a38", - "5db7bccddaf133730533973f4694937c866b9d5a2c4e14d33d1e554ae4d26622", - "f751e3ea984fba0e766abbd9180744910ce5104f1f5aca1456922ce0dddd2927", - "46e4da4ca474abfe0f835761b9c04cf196c8d0def5f7254cad0d5e3e49fbd902", - "202e5e5b9ae98d090659109e499d33b6ef67e9729a2434553a7844a5a2e57f47", - "42a7913c0e98e36b741ce0f7c20094b30778a610a1605197bc623c56117921c0", - "7dbb42697345779c4fc642c8ed819979e8d133c5fc907b55cd631a7d7c5ab8a4", - "3dd9dca75af5f565f1e5e156ce4f79ce55b310102a194812a559bee8e6d25dba", - "9498c4b5997d46a812e55cb0df55936aad331532c153ce054c9d94880d7a9d97", - "b5dd9944a44c1e3dcb4bfc327f2cea912dcf5af1a1624fb98a9bbb85c106426a", - "64aeacb97721b160257825e9ce63475a626636c958ea185acbdf1f1cd35cd5ac", - "98075063156ba995608363c1184b7628dba742381127e0b971375ed75c3f9015", - "0ced38c25a96dfda12d8f7194397dd3199d362e6cd74a09ad542d8d99def117a", - "e758387711a0195ce072f7a14d83350b42e99c434934c740e6543d7c80fcb2de", - "eaae4fc1c47928a046a52a0d1309149dc91ededca9678458cf36ad913cd0a426", - "a150d4b8c1dea37422c203635601924df0c690ba5e7c5d42a466200cdd157bbb", - "d61a40500950ec13db7ceb42a1b05c7a1885b865940d42a51c7d5c2cf7923c5d", - "bfce1ae4d21eea56f0fc12df2f86f95ae857c6b49f5221e5408ce828241757ad", - "9be389b311cafb41c9e182320575c270a2944d5d400f4b23f847e6d7d367bf36", - "60f8fe0c9d76477fbd1f201c694bb9c222fa2bf3ffc2217fabd270f94eb15150", - "b1adb3d54250d9171b1ad8388e536ed330e3548fae2bf18dbbed60fa4d4fb234", - "2590454617344bc37d9393253adde199fcdb5b437f92c92f02010091888118eb", - "e3fae95a8b64e7bc004394ba131df1a9f81d35697ba28d47b37985f50e2e6bd8", - "282d50d730a03c6a24a9ffa430c85f3f6700aae1104c69910bfb44be98bccc97", - "554265bd0346e29817dd314fe82bee2428638596c7a15e914fdd206a26be5ffc", - "4e5d391ad55475a51110525b0a4326144f517bc75f7c1fcf3194d0d14e953ce8", - "d620415985c186ce7a6bcf5f35896f667f6b69afe0564e00a64cc7b6d487f2c5", - "599d8287787b06f6a13048f136dc0e9cbfef02b70187330a0ac2e94a2876c957", - "8421ccd06515770499f286050502d798915a1d1d96432d250732b37f3cfaed6c", - "ed167e55bb45e6b638719badd751c3fe80b420c1771d335dcdce77035c76e835", - "b5dbf192d08e96f6bdbee4fa02633f35f102fb8ec7dfe767534cf0303dcaae7a", - "0b981f275111a2fd034db70cc1843150339793857163a5839c9dc7096e451667", - "d55e1f1421307c00e0a14a96c58d652df4b81de6e29ac2d3f115bb86f98c9aeb", - "983bdf2699eafa116fc8d021a1c63667358c827e0d0e6d833e467ef42a706939", - "fb9d5fb382ae81e24b02238327454250b1ef6244be039c7a0097da613c1bb6da", - "d0cda2b43a2bf44f677bfaa5b1ffa60a912b3b59cf4336fc1c8a736b2a1015b3", - "abd01664fe30ef0efd931453a90c1a2e211e7c4d73296296ba9ff3468a851f74", - "b5de0ac217ca0c0f1f7de72936655b394ceea560fbee8da9cd41d9b0f30db74b", - "997386650336126667f9c6608c54eeeaaca0697f121d5182894f104e0d24f223", - "07897fdacafb33be443d3445d334b07fda22e6a0c5cd7b7bb2d71c2130d1bd2e", - "c8431e67a9a8772906065a53fe69052cab1de88bf0a94fd94ce59d9e753613ee", - "746c8d9c50a6afa9f3be48551560055c0dd3a224fa1031b7c8c867faad88e0e7", - "c56df42c202104f47a26813fc62c8cd336439e1cd41d5d4dc7e4e83153c2b04f", - "483725a589c77cad9eee08f68a51f6356b85527a335267234c150d56d7029a0d", - "f8a38f7351fd4a373a6e01b760a17f23cfd4c6413ad912630fdc8b06f0c54f88", - "0b6d8f3be3b4ca56297596487e904e867f6ae98854caa9ddd378956425dcb80c", - "2a5d234fe5ab8770ddf1375050b0b7459dff0049ef12a73c566dd3ba2e590ec7", - "67a7483b426d569bc468ed63744d5c535dd578c093f0edc65d6bb40c792e89c3", - "7edc7cdd0b52ac2d7790399998d690f030a32e17c1bacf881c43f647ea30f845", - "255ad0e6d004924eec9077136e492f54263e163163e56baa89852260ddd58824", - "5f99285cf45390c913c0a1594d1482c39bab95aebd9eab1145c60e5d7ec10323", - "6540a012f197218f463a8c5d35fd69397edf067865784e20747ba13aabf0e0aa", - "f8c0001616fbb993c497699b36bfb991aa27ea459b8ba92ac8e02583a741a123", - "e98b7e8329c88e77737fca506428d6c9df413578953a713724dd6da1779fc036", - "d8c40b98aee630e3f8a7cc90ddfbfce0ccb2a1c3919048d82c4850dc7835b265", - "64f704eae23bdfb93909680e9531089e9b0d01202b8e5d047b1a6eb8e1b6db07", - "4f3390b8cb57e4d7359e51bb3afdde42fc577af9f6bedb65a7fa5e4432eeedac", - "5cac1dd00797b580ee513631559afef0b48df540b06c3db34418deba433d922a", - "940e3fc979848cffa02ab45984eff019a12077db537577a0bac3ceae6befe4b4", - "e0e4f05313a339e71d45adedc2847260aaa17cb44bd6fd9f4989c13e24372f1d", - "08045a1240a5819442ec51999b3da869988da559105af1c969abac107c61365e", - "99f8ce0befefcc51a81b469d9eb9e733847face3ca5b3956d7552b32d352736f", - "ec83098be8eaa8ac5a8eafef255cc1400f78cac7d04ee22a199ba54100ec8652", - "82337391419c12927b7e2ab3a6f8e0e446bb17e69ad5b678fde0da863f81a07d", - "046b1eabfaad81d748d67fbad2f2917d1706b99b45d4b7396270a91f60ccb073", - "a8ec9136be04d81f845533351fa592267749290a6408ebf55cbfcb72409e07d9", - "04a14f025b9ea325b05175ec6907f1dd1d1c2de9affc01edcb37313deddb929c", - "ee8c30fcf7f4eabdd965304f447f9d236dc88557a3068c2fc0eaa8eec5f9ac05", - "bd9a023a48a3778b4558eb10264d4340446698736a55bf9ca3ab2c4011dbd88a", - "a038c73a6ba162f782b0d93a153c48b6e2bce4ef3208c1a4f61e303db1960141", - "b1b7ada18f56d2d30cb584f8ace8b8a3268a1ddd0b36943ee475fdec2fb516d5", - "d60b005cea63da6ab11c62467c07470c26a89745af9ef7f8384c280f6f98e0b6", - "b65d19579939222229070c62b9c34c49c99cd0353a2ad78ad60b450513d2c757", - "a1c8dd779a861b524550ba6a59061e256d9d9597163968d2dd25a97ca01c7f36", - "56a03905e4e1bdf833a41c77ada28c16cbbd1264038a73ea1b879905aea8f8dd", - "dad3b595650df1d39bf0674f9be563f4c28fa43d829fc3cd3f614edf91bf8ad4", - "5bc8d4979dc70b6e7527e50adeb9513025559cdee21c6ad31bd24ba240a37e53", - "150d45088b01f4ffcc308c68cf1840fbe7e8a95b8661ce7c14626de565706bc3", - "96dd0e33a8458fc8d2a59d8ecb7df95197f3dbab49e0b58ca201277a05c0ad5b", - "e5c60bc241ad049ad5d706f4778611c55d717451661d429f3e9550cb918c727e", - "15d71f219038fd199d1e2de53f68adbe5024971138aa059417de21b59c32d255", - "45aa5e7d6ebbab0ded16b724b22103e0b33af69c1a3f1799e96cd0c609e960e4", - "71dc5aafc158915b80a061d5b314d2895c333f30d57b2789ef746ced485499a7", - "0e6e1fa586925d91496bc65fdfc35470068771cdf403ef38eca3a6b7e8299755", - "57a8630ccb24f5f5773a1e73dcffad9a9cc71866028d90a2c3208fb37067063e", - "42b68c6d7baf7244513710ecad19cbbc12f2e242dedbc4302dbc6d5357afe5dd", - "806c9a6ac543f165852c0f386d39d3f9a4c3a1f93208e59f23de22d1a4057f7c", - "90df16629e684d73f8ab5827df7f14b87225d5c16c1009439257e1c7dd444180", - "f3891bec5bcee6af004782c4d97ebca9653f366553ac19b147d3baa94383a893", - "8eb8f2fb2f3ace98d460e8aebf9f03824474739038bec7a11f29c7134d2f1f5b", - "005fa3e3657d104c552a7a228c752fe25af17cdbae0d966d8e83b531bcb25974", - "77c30c45bcdf494d9bf1306cc62f2e91934c8e36989b216ceccb88e465f45758", - "2c4d7f47863bc7b5cead10dcd2e5d36ea2f61908a1dee609f3a6290d322c4ec1", - "9e38501f682e26e9b3257c98ec29d97f1aaa10af877281fda68f108fa44d334c", - "4a8305b9580567eb030568de45d9021af6ea420c1765299342daafa45f5e2792", - "2df38fdc1f21beff16af992666a84ea44643f99e35ef7eb94a868d2e69da860b", - "55989da0f0abda3e323d087b04d485ac017df20bd8feb5b83f044a0002e898cf", - "4911785f31660aa1127721801dd6357bc88cb502e91fb73fd2ec71bb9e433072", - "a57f2d3bcee9d7bf4e7f9326faae0c2a010621b2906348271b664320cf59173a", - "ecae3571d4479038edc238fb51de4c658fae90ff6268b08b58318b43c9168d90", - "3f13d33806d457d51f7aea0737af3e773af77af2bb65fcc76489661ea127f7ab", - "5bf392b9dbd8205fa57ffebcba18cfb0c78889edd431ebe272ad30b8945f8f29", - "3eae113fb81708b9f4ce728d58524f5748c48e99af17b5d50b6fda5164d2e0a4", - "61cad6e2d61304f2809e615a06908f1ffe7bb18884d336dafbe0cd8accae2048", - "83e8ee57995ee35618ba43c1d8697866dd8d78a28faa702b0bb9456dbacb9252", - "1efaa3abec6c32eea624c8cee73f26becf415cd1629d513f4e10c86b53759543", - "abca66a01ef9cdeb59af8a13781ace50d9f99ca7a6ff4cf47e41a869f2707372", - "ab399e6fc693c6bdbff22116c5b15cb423746a353467cebfab35a738cd2e8017", - "4e6b1bdf26d11428ebba7eedddd40d6c94bd936806bb35cfab09a6485e327fb3", - "0c7ef14afaf5608ff0f325a89f0167facae3baaff7a6d1c754bd677f82750bb3", - "6d275b727fb6bf073b1045f45df4f3c66470cb0daac5f756657e6bc507a576f8", - "4dcda2a4968d7d47358a86fe9d07924dc8941495763e27a505a958a9972036a4", - "51add66f48ec8cc837e59836e7ab4edf3ba32f7c916988a7973a39b09bffb509", - "4cdd7d42783f7e62d613e712cae94004eada3a55050f99eef6478e028b23bcbf", - "4560f35832d7ab6797d11bebf4cd6b752b36bda6c0e0d21c2d1f9651c9cda90e", - "78d04107d5ba81e4424d0410bfb586ff45240c73d1e3d464e9101e6a9e7efffe", - "cce966bd5f0c7db267f89eb0554f9b53b3208cbfe2d7e49d27a93b5ae582d7bf", - "ce66a5de07e1d9ec7d7e99485bcc94e1a4e59144d34ee069ffebf16146c77414", - "516514322df7e08aac929c95933305f6cedfee057070f5924fb7ea943bd02016", - "6fcb65a493657ba847775a751716c13e992178efb5ed27153615440b99466103", - "c6ef462b2788c9b72d81a9399223074c00ddf4169087853de22542a83e0dfc91", - "23fdcdc70d57b784fb9b295e71243c70eac4f7d202e2e426e65ed8d4a17db3bd", - "fdc36b420f98dc1f7449977036c9f16a518518a8162726a9a00bcd1683735737", - "b7c2e60275576f4176ba1dedc72f9db817c6fd06c03f94d2139d1e56254bbf70", - "5b501c41008f7c3c772bc09dbd58873fa3ecbdbba72e90688f97ae00e0325736", - "c25b1be053326ab3d0628d4acbb87ca2bccfd6c74d92d091a22397283f9554d2", - "9a5794c1b3668b7c7b5b7ade09b899ca22eb1dfc74bbec112bb49726d0cb3dcc", - "404b0d9d9531451fc3fbfbcdf3c903bbf630fea2e16db79e2956bda9a80f865e", - "5c4cfc63e62484e3010be9498d9bd85854efada8365bde9a1cd81684748ef2cb", - "ab0749f94e930f6d587ed2489ae8c8226971655ea6165963c2bc4b968251be2a", - "aab2aa86d2987f321444109317616d7bda1ed2ba993f3bd41bd474621c448b5e", - "016c63ab7b37edb1badc0b478a6bad1f76acc8be36948a7ba55f2d97aa2ba869", - "07bc929a3428925babfa8c4a3d5969f3809eeb0e43ec2c5a6e5ef47505e028e3", - "dd940e0e5cfe7ae50debe4f2fd717ef59d712febe58f3f4d02fc7b8113c4fa3e", - "68d27eb9a86a61766aaa019d9541f7a877ca329d56b1f6d858118cabcf485a60", - "42320e0b630d073c1e5b6dec21095594d2fbd099eb46780bc3af955d77c5807f", - "b54b968a16f5989604519daeb1c0a76235e0f6833d21ddd4cc28ad4b186e06e9", - "e9bd42c254e4f5be03ebdfc71b19f5ecd8735117705d4889183d837ca4962556", - "fe157a8b8270e7a0a7881d371a311b3acf1c592f821a9852fadfa0cd39722ba6", - "135bc60e5dc87a9db95078d53d4a58bd14acdba90f1ff2c0ca6a09a476977b49", - "689f9c8425615b18b096dbb2f736485388a428572c75d1c9b692b914fd229138", - "5fa7fa3e55b9818ed5d681f1d65881a4d6406d9aeb5a22c41d54d9e227e01d42", - "73cddcdf38d41e2929e07704e74860158d2cfbd005cda2c2843143778babdef3", - "fc0f8bec4a19bac0f0e4f81ea93b932c701e5cacde45c66c399a5d91128b6825", - "6aaf667b18a13661312ee2444e983cdc8bf0dbb311a2656a51934876f6f23c8a", - "11a4d6f539c6210c4b6bf73a282d0ab7b03df178bc12bbf3b77c1003291f7718", - "33bb147ae09d8fe811207da857ea181e05dcd95fa2d0252823aa668bf1b4555f", - "8a2b7b8cb9fe1a748d7035af11c174e9909373a6c9cb21b2bb339fa8682c311d", - "85ce225845db68a790b4b73f1785cf3b6755a0bb4aed90b3a2cdd25409df7370", - "07450e2ae9d08ec6ce140647365814f300c488409d84308bf7c94619532e5a1a", - "da9d595fd851b587440a9477867a0cc00f63ac579063600464f907f870335797", - "bcdc0edc3f1d1f780f4e0332183ac8cb966cbaa258ddc104240b872a75994eb2", - "2e5535f7948c7a2df28e62184ffe63dfc2541d41ecba8d61f528da2d3505e16d", - "17908f252ed15df093444f0287031a5bc3e243a8f4d3183e7f8a2358babccf16", - "6115ec87cb72f7a6974f627110cfa3b9a7dd9a92530154c09e262b29ab097f2e", - "6868a52ca5e1b775130369d8337939a95bb35d54db87273bf1e04d728d98e815", - "c12d24c44c0fa3baf958de38fb199c79622791b20f76a7a1cf9520c585d41189", - "7d5b92fa71b42fd76a56433bee6304f70ea346ecbae52223752b417133341684", - "eb235627a717ce6870f163e6d079d3205f8293dbba71797c967fe9cca98bd42b", - "74626315382928b3d9d64e09a53c6e89d400faaa4ed437fa3d4d64a042b5400f", - "97f6cc063b7dccf7c8ffd0f6d1a301e2db66a72173229507d36ee0abd29764a0", - "88200bd697336b8c8e6614cb155b1f878b642880f530e6e7d383f38b88d83037", - "b0260ce18b39679137c3a35af8495d64e3a3e96e9a7ca3fe4cf7bf44aee11fcc", - "4c8a942d16da8b41948eb9145736e9c999431f13410c961861227e3b79283ce5", - "a9cdec7b6cf8550a52fb69a2924e2b4196056d99eb5d14779e4c61eb0e68a496", - "b25287b280f019fa21ba458d3b96481f56a6322f1707123a0d29724ad6ed296b", - "ac2703b3cbb7492c21503a4ef2f5966bc4ab80e954b5dff454b3e6a7267f5682", - "7fff85828512271671f833ad76a95e63bc4e1cd733dd8b1ad2c956c03ce02491", - "a99a9162568a99a47bb44330614721273e530af864e1e26c0becc1323bb942c7", - "6d7b8e66ce656dc4797ba9a160191616f3809c1eadd2c2fd5e1a2cf7089ce2b5", - "b27aa8d20abcf150d4929784feb36af169e3ebb16e5d8f4390826425082a2a59", - "5b7eb533de8f2dfb9cdce9ecbdc8c79a4d100fd2d205b6cced033cfa28359739", - "aa49e3e8926c9d8a3038a500a4f62369b0595cc7d68c0fc610d8ff31983350f1", - "81583fcffd6900f475e6f498ea57f73b9b268a51efaa63046bff4ae4ce4519ec", - "a51982799e0b493905e6f88daf913951a56d9ca086f86b398d483a794af38c41", - "3e066fd52893d8488393e27770075e61f28183cc11e12dad04306641277e5c14", - "ebf3dafc97ba88aea75d926aefc615f23b233eb658c15d94c12c893424105186", - "b6ad742224f410dd6e6fc82c7f05fc3788ac273324ebd7e05b966917585bb530", - "369446f30d1b17720a9cd2df8b13c193d1339ecbe9d5f58b5dd7feef0390ed9d", - "8cfa18d1f1391bfa9e91f0c226aed0fa9907947a8aefee88f8373a30b44349a4", - "6d886d079ec7b11f6cfa6fa460812f8c41cf5c50305ee5cfaefeeb9b29b3aa69", - "2e4e5bd682db90c44c80e3f102bdd7fbe4a1ae4980d089216a348f61fb9652a0", - "dd778513497e9b52c178aa5418b26eb70e560174d6fb9584170e0de9d11b0c12", - "8ea4c37e9a3d88c9c344e035668d12f5b856d33f752bb649c3cdf6aa63a31c78", - "5d91f6d196dd7bf911fa63608f66070dba73ab76a739d967978bdc1a656ba9f6", - "bc4a21fee548bc5b0f42ad3453f8f278ce7249589d13780c7a078d1a5f1f1978", - "669fed49b5fbe624671a43b95715c72fa9900ff60e65e2095293a8ddedd4bebd", - "43177029bb31cef82fb0eaf6db1123998f1a1dddd81fa28eef8453437b71f683", - "fe552af9178dfeb31fe643d1d11de63fb42849fd4029601114d2d43242058761", - "a3eed173341e62506f37516fcec2ad41b04a3c844ad6b5a2e878daa3392dd480", - "365f334d857dc5282bf24a3f4ef07ec62c3f7293a2588ae73f66def6b92c8164", - "39affddfd3e061c5bfe091681f5402dc3cbb87e0db3a66363d8d82ef57a27825", - "e689624bbbbb298482994d18255869f35edd282ea099c02abdaf4c728390463f", - "3db3c11e8d36fadef71c594e5a7bd234947f7c6bd466dbfe38887a130d6bed5b", - "40f886391209b4161a87a4110fc89e8cd4b7c249690f33a8fbba9cf828f7a38c", - "241dc9e094d5b701ce01e756199340f6714531b942bceac774a9ad3e001d5cf3", - "792cd479856c8522c47cb4b62debe0a72345ca3f23be645abffefa86454f3915", - "51f1d5e4903cc2b786cc01259f1c53db0fec0a8d423a00ff5dda5c73fd376ff8", - "4ef76f36f25ebbe0e9c807827e4241e35d4c5b24adf8b64839c61bb4b5a6176a", - "e97fc43f63cda701f858b6f1b9d251d34adddc7f00c4200573db96edbf1f6ae6", - "65a1decfd1a5c7f7bbd35405f3ab902ef58cabef8549ece54b082af4a06b6634", - "7285272c204e3adc1a2e9be958709963ff2a681bfb0533195faf084713a2066d", - "1e2f396c758a898d0df9dadcda006967ffc3a587447328ab2e3d23a01c85d309", - "b65ed984fca7e5c8e67d4a1638ed86fd898bd0abe8c1e2edfa4eb69c82f5fd15", - "bed8306ad494ea16f1eab1f444a30593acecd69f36b42decad90785ab340fc83", - "b413eb09e5eef126cd3003be54797b1d6343c06e311882e7c5ab9aa760f7c347", - "01ab55e8c56e7b822139c5f2bf39fc201f303a762d1f68b0300dadc275556ba0", - "cc4bb99a808a9459472252351f8c702f73b3fed11f5deec04aa7f7884facf55f", - "05f38d674d0fa88ecfb84c7ab73d757ee26a29bd9ea4a19db8292e323f8417a6", - "97c203c73bd75a72e7692b3cf6a1c5abdbdc86a45938ddf846a53a25edb5305b", - "8597f19bc4854bfbdbd9b55cf3dd1373c912dd541f5337045db485cc8bec6a7f", - "b6f882ef41a332458b65b5a82d1d45aff89a7e61e24dbe495d426ec6ffbe4be1", - "4dbe7cdbd4e9cba1ff4bd32eec6f742156f7cd879c521b3e24f8fd8657d5f719", - "b5db5a5870ff705aa4fd3d053ffc0f162ba8c694e9792ede2428e7aa40912c89", - "70b2e4df4dfe2ceb78758a7ee87f37edb2aa7917a3bddef4228bae31a6dd7667", - "e625f7706306ad6ae069fffe6d9e60b4cd46eb77f3b34f5e2b8f7bb01e1a0956", - "92a04d7ea7f31c62c73942b40222b0c80da4221c39d3fd9944911c730087f0f9", - "504699406ee8a47d82095be6836a5d7079486bdc008810e168df5a426e9d6442", - "d660b0643048d1edaf32937500ef3a356385eeaa9fbf874ef7cd303cab48278e", - "2a86cda48ce6531553f3bf0becf4fdecb56dce2ecf176eff61d48c13460452cd", - "019b89a45356c566b6bc20dbefea0ab1772f9849343df32797ed70e52202d8db", - "4c0ed141f7efcda02cc4260c5c89e1a21b48c38f77293b8aef43c07335b4be90", - "a4024460f54b7b494ea0f84b904b4f88cf414355bb8f41c935c873b0fce29da9", - "3ce13589c164e7cfc717057814c650f57e2d61ea8e53be67ee955599dca48890", - "ec39bd377f245dfacb9b52d96f59cbe3f6d2389dac3deb5b4d40ed05ff6c1824", - "128257a2787cf9cf49dacabd49880c33b345b27556898300642b02c85a453f4a", - "2d99a4c38ca51aab7aff35b57720904d3567f8160df8f010736372e5b8b8d885", - "6c4d2768c176827b3a55639766a310ba97e94a64643f188196fbbc1ad0cfbeed", - "90dd6e0969b0168031145db99659aeda102ab8d3cebf5933b94dae5bfbc5dbd9", - "5a87c433eadb2a71c5d2db908473cb5ae97ff61524edfce504524eea8a97182a", - "a5c91acd451e87984175e0704504c0209710fcd31eeb0ac781a9ce84b628a064", - "e96cc6991c4d1d0fa25cb6dde06deb67c86f614f540b686e3f10dffca14b113a", - "7082cc3a517e70ebbe913ca114b479b7d0eb557370b49d544e66b5758d47754a", - "139d3247e294b25b14b5f7a4e1962f76eee9b7ec40725733bf21af0a05503f80", - "13081cf7bf7c212014ac66b3da9e753feb707f63208faa7266ec74dbfc5a4a68", - "d2b56f2206f46743738662889ec5d661fb0bd548d6fd6c1b88035d16ebe5af98", - "7d48dea81fb081d0c1205f82b19cdf81379eaf34e805cf5bc218873ef71aca73", - "741bd94c0668e82a6e26d576330677ba4280072f13c96d62edaa8fb5b7084f50", - "73aa23175c44c175e9c9eba7ea079fe1258fbeaac30a42d17d120ab25f38306d", - "38254f6f937ebce6f8a72808b363f003d5b1395d44373852c2be8a0437bd81c6", - "4b0b211687656f57d7ba3cdfbe2b9ff0c6ffea2164c4575c51fa94dca30f47f0", - "d0673df7905fa36ae43a62bbfad91c0fb4fa491a2ec363d6412bfd77c34563af", - "612d41130424c24738edd5dfab3cc53f8f9a9358f03d815ec641a7c9ed598dbe", - "f80964961c1d52bca56b888a534bcc88e0565ecfd981927e35b91e0a8ef07721", - "a1c3f7cb3be1d355bb42f4d8c3f55882aa5c8ce3c0eabc34d819e0ee3cd13147", - "3185eeb227d6621c66baf6c60c2c043afd2a1fbd0488e2a2f95da353c37db286", - "9d09a7ace50bcfa76947d2611ce2700aba888dc41ac2a77d070606b1e4fa5a20", - "75d6f179627dbc50778f5da34f961eb7490ef9bfdb41d3047e86923fb43f95a8", - "5ff389e65bbd65ce63d4f760d5ff9d847634e6ccf32e8500ee1392e8db662ba0", - "cf3f110b33935ab04bc8db7e1891371e57acde599bb5c5fdfbddbd905187696b", - "9a016bad633849209c91e8a8681ec633a12f2061c60239f655df0186124e6501", - "fc2aef4002230b90c07436bf5ca3f59eae0febf88187860c7472bf4f3a8ca291", - "81907b048bfbf5be91e9db910520ea8b6012c95a52bac8aef5101614b8b8f8d7", - "bdbf4d6aee70aebff5b70879ff1cee7fe8b471c4e30b853231ccaeaccdff9f36", - "866a8fa69d4742ada459084a6baba488bc1f53ce4a34e974a3b4a34437e524a4", - "be7d81f7a1aae4a56e963a58c9c6337f5a2e150684d1ef31db255b7c9707e3a4", - "144a7eaec80148d4369b71da0482ecd58b2ec02569df347961f0e09839da5843", - "00ef820658260545e6a49e85439d7e91c7c74b36086e92893e3e8ae50afe26f8", - "f701011df9be656cfbdbe56964cd6b8149cc3b5633328a198380b8813cf9a4da", - "e7edac0dcb99f666388a5475cefe629201832e4e836a0892de7947f1a0964031", - "331ad34773b34ffe02c6aa3c36a47860a725d7d67a94a316a57422a5f95335b6", - "be5330bcd75ceb4c503faf8c167d3942d63e2f0f511b599495288c06cb78ddc7", - "f5f776b62e9991e10f7a99f4a7eb46ef6de8e6565f4b7fe23ef175f0a6c09f24", - "5a25afdfeb8120aae10bc1ae975fd96d4171d5e97ae4242857deacb32a1809d4", - "4805d4c3144e8ee1b02342928b646a185ac7a452259d305f0a63e85ebbb85e72", - "40bf040306ff1a163c261e24140459e9da2ab05e99cde9c1caf8bc7129ac0c1f", - "aca82b8312a6b68c98eb85b606bce60593951dde7f00feaf0efe58c1cd7745af", - "5af6a57ca6cd87f3b66eeee2a1cf6034c3861cbfd999a10f89c7d2ad67ddb9b7", - "e109fc9cb5d37519f7ddeec638f95bdd3a80173d50458d0c705b91d332068822", - "8da36055b846d2e765412736c707c5253931731b2126b2b31d04ddc1e9fa573a", - "6104d8e0ed7c55685a3afc4bb59e16a864d9b964c077b81391a05b459d9d3922", - "64d7b7ecce024798338bae62a4ec88c886a20839209a24b472309cea9827941b", - "2ea489ed6e4cfffd6de80ee8024b2732b502fdeadffec3bfd71466dc1f199b89", - "6ebd99005226958ff2dfcd8aa7ef2be303f5327d1d72ac246191d0cc68ecaf98", - "2fe9eb64398a132da57b9e0d5ce6cbde0145f2ce981be0cd7201e4770944d96b", - "49a4464bb2e151fd347aea443fb29c424035d1f2e69a089660f57448a5e26c31", - "49b09777c6fe94f98fe8b6967626da2b97caa7ed8d6e253965de91b7b6958c70", - "5a922bd02f8b40885a7060b14c895d45f91ec03c58043ab63ea54f898db3d769", - "48fda07cf7d3c9f2423620c68664b44ee6333153ac407d6b506e0c7c249a9615", - "89022cac3e41b9e11d9008eb099284fc45b5f61385f8ec226009368cc1f162ba", - "9fd305e6c8e8598373fc326503b6cbe78761ffad88240d612cc97fb2362e0944", - "9a8b8dc8bebb8981ccf860bbb5a779a0b1ecdcd9d284c5bce8430d27b6cb08f9", - "67b214c5890599d637236a5594779f8d5e8873a967563d666ecc46ef4f50662a", - "155c5d8a041f5b04643d2f6c655f728138a76f8ac44fce0c797e7624a60a5e35", - "49792b9394bb8750888bc3e1b48be5af7c5db77610c125e45f07ce40e2924479", - "ebb7c9d1f1db8e793996292ae296793f9879264d34c1f24a056c8f80e0b9827b", - "e6867da8a4cf8946f6ea6aee64a2d7fd762c10d71ab8c893f1e1adeb7a6da9da", - "d513ad57135539c7ce509d65a418fda05928787c505e0522abd3ba244938c66b", - "8be17390abe59c3317f6c3959481f31d6f6e0ad9085e579fb95313b15c18392a", - "c92ecdd4a7aad3eadac577b12733da5e062d8db46af22ab3b40b1154ed3d1168", - "7f2e90bc25e17cbbf8768fea03e63d4f49c0c903213f63c2789ceb8a6f7b7daa", - "bbeb2339de1c7b2d7fedd93019c05d25a37a1b1cff67b41bb530433c15c10b1d", - "5fb8600522e5804b578c2254bf1554a36bd82cc80b18305185a58cfeec9c7224", - "a1d3666f62af2d2e2aba48328045e0c69d008c4b32b0b71a9b9b48a4233514bd", - "99c46a630ed54eca192f53b323760be3f3f0cc9153f1bf7024846dc9258af682", - "de85ca8aeae47dafe7295238f969d5ec46e46a20f699316d292bbf4385aa412c", - "a6e6de07b3ce77e2829da27a71bbf43f9633056f10ba2642f9d131af6b9d7f3d", - "544b6e1150fe6aacce48e528d4e3d0b0b7f5d0e45ea1abb5cd12eca627030aa9", - "1ca966a66eef8f7d0b8e38e2984e4b07561f47c124dec400fed615c31a636559", - "401d2da991f77720bd83ed2adc29f2d5638ddc491f8f23c612567aad2cdf4726", - "d6b2e0b5ef3caf3d976139e46fc019b031ddc0886616b47ee908b651472faaef", - "b944e77d0ed36bd4e40b681ba0691746b0e7b8c6c73c88b95b49a242c7fe3b85", - "461257f9a4ec148f3d2a7cb0a01e82d279ae4925bdfeb91dc5fb4f1cad932221", - "437746ec9f4c4bff02c5d5e1fe43e3bfa99df971a375b9e1c78f118bbaf8c3cf", - "6c48b88264e90efcafa084504cc600da23c04f2ad4ae69f085392fa5a52e1fbb", - "e97b07689fec0947773c05b1b9621b632a91bb7b7af7c2b99fc5f2a8baa7e4f5", - "e871d09600554c11d19c1f4fe056327ada571316db07e686bd3d550d61ab8ba1", - "1bf442332de1d88d60c14d863001d2af856f977a51bd1877b46c4f53478c98dc", - "232bfe194de8d56d2725df046bf989736b9b5f098f4586fbe8ac1a65b324c80f", - "9ae1b4659f67382a0fa05be63b43439cd370035e358e49e3a0951c6a2850d70c", - "bd970e36184819a2d9d884d5a94f40f5bde3f6c45ce8903209746b192ca2a7db", - "9debbc51fb85569d31ec78e696cb23a1b656e595d5d799b4daf7e6bdf740e15c", - "5194abd24ec32e40d742693757dbadb9890d2472b94373691246d3ac68cbb03b", - "e1e75081a1a19757776fd3b0610e9e53555789d49072178b720983a2fb081863", - "c9e2caef75d96f3bf5633607284e9e97488c293a939e0e6bed937781174d1786", - "d8689055ee909fe3e8f1f87cdb4ed409181d345457e314319e76d83c71ecaa85", - "11faa8a4983ec09f42083d1a404e3a22b74464545f39b3879de2c3d5481c33d5", - "a8c2b294b345e2b0460d531453f18d6c40440b4566fce8e5991447d406887b9f", - "01a7518439d4a7041a20508567c4ade3e56e81470ab31f4d27c5a0a1325895f5", - "9bda69d79a08db9ce71884b203a95cefe1aa9e20c018699afc6cb951659c32b7", - "c5c7058a414d6aa8e9c6b41f5541ae5507201faa6b96d18b588aad5c337149d6", - "f85224c6685329c4555ce6151e34e52b1bdfad7626f6ad382c4b54491172b475", - "e2e78429f99e593e7b9e7ccb51a30f2c4adfe976da037f260f42d2cb106022af", - "4b74f4bf8891f681499a150dd33f6375b5b2fc7bf88dc5f500a2899662e0483d", - "8b8ef254c0ce19286eea2ca954d13aa230666d514dfbfd3fcb600213a0130c68", - "fc99143a02c34912f63ece324a7004882b9c6d5016d6921e29f410b612aa3f43", - "c51b0f945a11934569a3d13fadb701f6ea278c98fbb839ae81f4630b797f0fa7", - "56c120e9e7af67dbc59848d1b76e613220b7cd929517f315c2af5ea45bcfe5c2", - "c87c9da93891661ac29d3a87f9a4bf201094523684d88bf13d2919be29c6ee14", - "4812f77f5a32ddbb31c2c661dba55baeac87f72d9c26cf6c6cb5df8a6fdab522", - "64817358daee68b25fb562729c55db2cffde7cfd82600aa1c79cc27c7c609262", - "c9dde026824eaae04665dd994735237e0def6271707ccabd97855dd04d9d9db0", - "42e23e51c998d084a186df971c365d4b458ef8d5d8e1a0637aeb16bcea053e09", - "381b7626d3ef02e236827916c89ad28bbe8448333dc0bdbe7ec6debd38e64772", - "b353ad0af02cc3766894471946effc8d3bc381535a6db73db1d08a328c5485a7", - "6a0a8c59a4fde0b7959aef842adba7a6c03f12203f592241c9d90a13b636fcca", - "197190cf9fb91708e45670116043f7e71d287540a8c168ea41cd7020c7e7d130", - "757ca31eb076a1ba9d85371a29e1e0387b5053b22956d07ce77a4c5716d625c5", - "8df157aaafbdf925176f8b1e2b5f437ab2e4c2e05f6b3065949ff01b815c38a9", - "589c92627325d34afc5f495e7346effcbef9ea8c9a88967dad613e029d0d4d5e", - "f6d9c83b146052e2d7e50264bdaf30c687b610689ac8776ab5148c03fd1e0aef", - "0ee6be7acdb949ef57d591219b356a9439e38be17e3f6b0b4b888b61bb395a98", - "940f0e19337fa0a45f549414cdc3c0de79800c8ff17b62fa91e560984058772a", - "23d6bf63e93f1d580a3c629670a1ec5df0d54c9465a4d1016d8f0160e88a3f36", - "b7f3dfd05616dd10674c8a6d0c3ef82d4ad55d7038eab33c78b2e101627c2ee0", - "bb380c768a9dfcb183ebe68424331e2a6598472312f236dcb93b1adee41accec", - "7a3b25eb329a99f282e68687524a10fd833a501de289b2b1a3c6a82ffc82bf22", - "335b16f4b8db93739addb81cc4c4d70e15b8be319ed2aff468a83f3de97fef7c", - "b33554fb1ebf1cc66800c641161d2e3f3e7ed3ce6c7dc5bef85e7e198cd2e280", - "e75b8104001bafc1813b830d9f2a51c3f2b0dc4044b994cf06e0eb896b791c44", - "3ac9cdb979beebd52d16f82b5b4f2c9dfe1a3faa7e4018a90a83d9aefdc11964", - "d1204cc8c8f49d478f5e44351446fba5f6b381a554a1cb30703e91229e7545a1", - "8b3f4a5cf4fd5eef2dc3d61e86d838976eb7ae332ffb68113b1c6624bd3dfaef", - "83f5465f2bd5989ed90eb260e5b0850b73e9a0fbbc5b36e371f1d22e3694c405", - "3ff84044f8fba0c962c118cfc67f017c4334530c750f36f4e79617caebf43e9e", - "bbf01acd902e6e603f0fe32a307ceddca218a18b4b8a2512ba6f3afe1b786fee", - "04ee0c343e4eb5bc725b0710950d3fab2c48b2acf85f06a68293b5a51a70e33f", - "8e2454d39ffdca5ee5b4b98b02011f27b356a77e07748be209c16bd8a73516cd", - "f85f239773ebdd0167622c8afb3fcbb58ac48b78ef889f57a9a7724ce8a592d7", - "d68cc8b871888a44c02a49f68fc0a397f9080c6946089c3d2c69b8744ff82fa8", - "7d07d7ef6c525686e209edc8f3d802ea05d29314217b6b3934c9b8a309347cbc", - "a96433f6c2061d2236563f69bc3d51f204c93eb4afedaf6033d7bda4137d10be", - "0c8f064ad302094dbe82c512c8fbead2fa22a34adfb207c8306135ce3680c413", - "050a7cefd9cade2969dbb5c0cb9a5a4a8c2419c14af454050633d5bb809ec7c0", - "fc6850da49aa2df62204ea3a494820c570d3df7da0ae9aff76d3bb47075c3eb8", - "ce60934527176a8625df2fceb42f163c81c00404bd9d5d8388ab84ce4d521f1d", - "2c5bc7354a69123a3b8bf41b62e3d65779635b845b8e8ad3d34279ad49d1f49a", - "e69ab74373135266c4ffa775c2e14d0c5d4418a94142505123b44f6ca8b5e50b", - "e452085aa21491c3a32ecb5e1b4826c2188cc78c57e431221ef7b1b93ddba39b", - "9fa6536e1387e6cea221fe410e75054de88145a239aa9923502cf192dce5f66d", - "f677655e5f2f62697a2c1b2c8fd3a91555f1556b489cdd99379e8852fd3339e6", - "f3556618a21b9baca637deb8eaa362a103d369ba786581b3d7a39f10f0dfc0ae", - "2218cd181533b6f226df224064384b09a55191efcb6947d4a394d8131422cdad", - "fe6b27b4298ef74e7dc0973dcb46ee8750d672d475ff580b950d3c1c57777ca1", - "279ec1047637c950b8fe8f95554aef48a27a31780aa9dfba67e76f7056cd8049", - "e549f036f5035d1cbee940922cdb7629b60feb68f3bddda3496abfa0cf79a6df", - "41c618737e7b1463a9fc3a9ab2ea745a07cd343b5a84a1e5ad1c8130aac17ca7", - "f4fd5fa0194ea99b83ff3f344ef26a3264cb248677df8e7fef8f0cb7afdd892f", - "c9ca3b92fa9e3866e4e9fe2ac3546ce4f601d5975947c7a8ea7a78429c2679b7", - "f11462811028e288db8d1572edcf14b7c5e911ba7431eddff7f0322c98e2d47a", - "6f00c6c3c3864fbe929e41fa7600c6962a9dc625e55aba415cafc608d7542ece", - "7fd8822916882078b469847763f1aef8b820c61b7c66aeb1fa1dce2d876f57ee", - "8a7c7ca03d56c9764495ac76b2c1d70da5c3f0c26f705c3969ec917a0849489a", - "c0aa526decf1ea659439059e314498aedc52af5c20cbbcc256a118b666b3ce32", - "bb0c0f7ac0c66008079d9d056fa0ce56a9e491c69c412696302466f6c6fe91d7", - "2a62811b48f1c490ed4de4929e8525a9f303462a6699ed2b64c62a22dac36116", - "2e5578745d99765599e96c30e476b60d37223eaf2ebe72214b1823bf25c176cc", - "a9195b6db5fff3047ac9fd548e1d0a6f67ac8041b8abde0da628b8fbc9d0b88d", - "4e60cd21f567fdb989d844ce8d6f43cf27539d948f43679faaa3ad518d52631d", - "af65e5af8d2ec902f5b80830ae35ff9cefcda725455e1af3f80eee9a04649a62", - "b18cfe3ccaf4fce37bfac4f3e047a8be54e98b0d5dd5fde6baa7eda326691c24", - "8f9e907ea4ded0381e87691f5cc57f3c907e12746fe0fec670f94f2d9ae0e86f", - "71163128ef11e103984b12706a96f5de8d07112002f37f6a7079c1231d905217", - "96375cc814132f98b760354dd27604ceeae53cb1e1d937a712ecca4d52a7ccfb", - "5f4ef7e96a82dcaafd541b6ba5f4b7ba527f01d4b29c02bb9bfb10f2f70b3c21", - "5e721eb93a903bf3fec3e49d85e15e5a3003cb895a7adf14757897661aeb8c69", - "66824dc1fab8b0ca114f4ffad5f682cfc1c11561caff8299d7878bc951bc029c", - "ce36f91f08eaa6949b63379a1e6479404c37dc4ee0b7a3a0993f994db126cdbb", - "54b77530ef2899981fe465cfa556b31dbc6af86d79c5ecdf0777d32ac3cb07e2", - "e57cee8ffd9655987f59707b8e3001a5a81bc96c451b1f277926ed4e7e8e7e96", - "990fa9c0993485ba3685c564a8609ed968a132a04390e37f392446fdb8de2629", - "bfd4cb60b85c5cb50da5913235d888aa120fe54fc92c18183925779022982761", - "eee7337f5efcebefce19d78616b0ee3163bf47c2c43e1bb929de1a05c498466d", - "c36b592920e8d95e0f9d680f88e7a9e7b32842135eacd66a28170eb1bd942e74", - "6d542f5c51a62ef302f576a23ad166a499fe25d01401b2372eba70bd90c2e748", - "556dda976ab9566ef6b4433ab98681c2d4e082ba0976f3f81f1bd092ead0a1bf", - "5451a00e9b789a55deefa29ad443d3e7bf03f22657433a85302d6095df4dc2a2", - "96a3234e1ec3320e0eed915413e39b64690a009741cdd4078e932674e53a701d", - "6d3d29e030a089e7f07d2a326bd1a9c7f8b9f01b7a77fe7a12a2d674ef819b69", - "417d8dcfb3285159db16ef172021aa9c01c25747128f016979cb8b1f95608338", - "f516e568c959dde69e6cf2785d5527899df87649e00d98650410fe65237b5b05", - "d859c2770f653f0a705305636d59975f6bc0a8f4e398a457b9898e92672e6a30", - "84f13e45ebf7ad493024500f8aa1d39517225262c4eb65433c5dd2103d31ec73", - "4d1542635957e6cf6371da22000cd8fd6844d8df091ca2609bd573e619097fd9", - "091ff361c927942a7fb6619101b25ce0503386aa606762b145015b7857b7e668", - "3ba6087163625302e5c08f3e092a3af76ed5edef765547469035c0ca4d28e68d", - "8e021bbe96cada5ff588cf87bac0522327e60a34b320751c900846220da7aeaa", - "f0b8f618be7390a0e31b295c9289ca29d2d76c87b4ecd683ff87db2bb486c652", - "1f1ccb9cf210ab7432e4c58bdac25635149c67fbf13169c324b60f3915ef0c81", - "750718e520a31c32d82e46da2bd4dea3d91f3e823a7bd7e7e89a8c936d255cde", - "e902b7e35e6e172bb0b3c06caeb11904845eb6ebbf605f91df3dc9b6a254909b", - "a60eaab8cc806f400bfbc8e1a43c5514971d86d1846271838270765bc1dd110a", - "964438ca0f063cf7249212f632b818374e474cc85db7b02d227e09166262a829", - "5f582588ae8b2324d9982c246164efff76d47fc5074b1e2e79043781573df711", - "732b7bc52cc167373863777d5d46c80e6239a01d0a2a97807cafffcc746c063d", - "3360ba550b4b31d49aa7d3e9d352638db89b6b5c50cbfe89f00249d31b5cd840", - "4a09bf62df39df5f6ea137c87a4751a227041020ded01f182413c7db783fe8b3", - "6ca66bb90dac8d560b7ea674fbb5046856a20a376e242bb13dee97907bb5ec4b", - "f4ddb817191ecbe141a265b20eabbabf623d9337395a0ee6fec284e4d3ef107a", - "81e624514fdc21b05e2818ad62b49c93479802791b5c2c59c1732d91301d8d4c", - "0e3e1d67911ed16930648f85b2575f569fb42cf2ad0b1ea5bb0a9154a66d7057", - "f5c9a684ef7379cd8b0db2d28186b74bba644c2f874f008e19b81b24315fa3df", - "52f521d541d26b79ad26ca033c37d6a36476cf2626e51091aa12a1490bd2573f", - "0f56269013751184db8ea21e94c16188c72008b1414deee46c20e74fbc6dc019", - "73e6fe9360bfa739efb50fad87b2f731d330a7e4763ba4ddc56a7914cd52e80b", - "9e6171657780440f3f33199d9c4dd2e0185159687d48ff45755c1952ba54d313", - "e1b67ff85939b6b7a0832cee6f760ad96e275d19ad24ede5ae456bdfa1454fb8", - "e80140eb5a9e7266e96377877412d44855d7faf6fa372e417a1a4139dffc1f0b", - "887cc212cfe381a9d5f57173240e474c3fb2faa58ea9b2abb3a32fa1456c75b8", - "89f53220ed9bb998e0ac41c72e4251db4448b09deeba6a7af084b8748433558b", - "3fc0e04c7a07c3bcb09c1dbd78e9c8e8bd095bebd47aa80f867827ede3618044", - "c0ac99a4c7b07252645887b8223aeb4eebae7004f4dcc10a92af19ebd80e6f4c", - "ae9e5719912e94e1c01373248ec53675c4c7023c828726b7bd73e4a0b3ac767c", - "00724565b43cf941b621905fce82c388424534d29678e3df2625f4335af3cbf0", - "4cdac12559049a536d1ee088596de865a3eb2013303559295a596b0754e84d77", - "362aac12bd4aecc4657b097fd5dc792deb3768d7574cf3903b80f98e71aa314d", - "231b20d4b0ea046d7642fbbcd16ddc4602649c3be5e99c8981b17c13dd913165", - "06b8b0dd3ecbdc8e94f90ebb924e6745e5283624749998fb1fecbcece3bb4e32", - "9f11fc99cba1e05a862127f317819caf238027c269760e14ea13f4fbe0292381", - "e64abd9b9b2d7c473a024f53c612bccde25bdc0afdfbd7b85a0825dbc77db8f0", - "8ce27be13a8072fab47c261b49aac2f29a8cf85dc2d10ccb69e5e26e43b2eb42", - "ced03b9fc666ada2aec4faecf28d22bd7f90d49e9846e8d8da016f74b8d6b5c1", - "f1c3fbfc4f48ec035046f54fe1a1e7e7c710b0d4b741bf560e7b7b58f625dc21", - "074d24177e29fec53e47438ee5df48a7187a69513442f427946bc43258044860", - "04acf4621b15580c22c8555c5b7e952fccc795737a51b1d2cec6122342afa14d", - "93e1604ec9d5903ffcf5cc22a4e90ae528a24af9da05d345bca247e3e90daab1", - "4640158979896e7fcdc9370608cca723c3f67253c71444f495b4bdd69ad5aa22", - "62159569c725bc7b40f360954f484632747c3181ff099c8d55a64081514a0107", - "846142c72e5a968e95c4df1ee56ea9c25b8c9d45c56d7c0449ba7bcbd888f8b6", - "b1a3df82ae3f92418b937b37e244c8c981aea6a4a1af7675c9d5dea98680554c", - "0bef251434abb041b8725bcd0c64bbf07ddae5726db137c597d2af0a1bbf3205", - "6a7e25978b39cf793cc788a5e04e7119d8cbf24c882037ead54220ecceec0d9c", - "85d3de965ac9ab58e8b3ee83424c1112ef9c7d6d3815ea2179a302d887d93b16", - "751fa158ea4af986c4fab4ce90fb811eb0c42a54255e2df0532b1d66d5a5e4be", - "6aae735230052360d284407ff2cb2d22f208a01c2bdbc76c3c5d6f07f02f3fb4", - "b221895e329ecf37c613631ebaa8e7165a6f2ee9c22694bde9104d85f47135a9", - "be7a4525e76023862f8ed76b8d2b097b031fec01611ce3b329bba12d7b2d2cca", - "f6904497f61abb67755eb13fe3682a2e1f1e4596fac63ee6d75699258203cf52", - "c8e7b3efc2a43a35950282c326e5ed7176d2a64269b5f9c30708fdd1f7101c0c", - "4298837b96867f43719387439f726228e264ff855834f7c4d2853a6e79cea8f1", - "627b0a578229636bdaab811efccdf5b7ea24a1d9435df96c0e96638285876afe", - "5ab128114a266effc249523587f68f18ded0eca631fb04f095438b859fc0378a", - "e97972c9b90f3e3557df5b24925beae1bea9926fd801128e1e848e54ad93fd3c", - "bc2f5a72b0afd6c9f4dce2c85fc1502e6642289e9529727e232422f782989c6c", - "2e20d13e4c38978666e6b730be2f3e191aded243ecae6e50233fda50959ea2ac", - "c88247b267d7423133fb2d2965e9571cff341a9e1a813f620ae7e950bf78bf21", - "587e17cc33dc858a74fb0bc9a8c161c6da7ced5bb4c57df24db44c5ffaa516a3", - "4c2093c88d5625811808a8aa29d07cbab5e7d58c8e4bd20d05307a30f4a915ec", - "5764362fcfcd16c2170ccf18a759c3caf8e023cec7bd5142c6e525e84bc36622", - "693dbefa0f9493f6937981a874afbf9313782279e860a474895a4ed5961f8e07", - "5d1d641dbdab2eeeb1b4203b2231c9a7a9920e11bf975e1b2b2be15390b3d43e", - "25ddea009a5b1a083b31aad06bb3c3d7991f9b36eccc0a49ead38eb5f9581169", - "2aafccdc5bb7be9e0f9b9c6d33e94438b38e2ea76ee3f063af76207d86c544a1", - "305dd7b223401e6bbec7054cec44f6eb5c8d337c388674d105b35775c357d018", - "20cba9e66ca8ac8967430ae38e44900f526b35d95aef3e5521dea32817504c55", - "5b9ce56d43ad04b1792bfcb25392b31fbe3ad5913f2754e71c1af0690ba1f7cc", - "3f1b969303cc851ae5d2038ec6c57b5b5180590d42da7e1c2d2739da279ff3d0", - "a6a576e907ce394d36952241f105f80a8d68907bcd1bd5b8f5af81f80a6e5de2", - "e4b973905c0e0d56854a68225afcc0269a640a3e24d09a37b090b6a8842f36b5", - "ab128d01cc7626c2a911e9350b9f4df6f052ce8c203bc4414322006999eb48ae", - "c4db0dab1eb507144479ec28495eed5dc1cbf0992327f70a77e56374e2080c6a", - "400d5e541dc205ed5645842ea13385fa9a4d8253ad5252c5d3b7e4203025ce7e", - "20a15154db4f9803a68a33faadd9d4b8a97c62c21bc259e31a3742807ce35a3e", - "a94acc900c35afd744f5f05dcbf48530af8e9db391a7b46090bdc84e2db6f401", - "886bdfc23e2d35068ddf57efc0079fbd2c8dab22c78da848cccd00f46df081e5", - "c301e9e72278874e71fd632c471017f1a1da87a9b8e7ff21b7ccd9fb13e88863", - "0ea8bc9eb390fda9bbc8f03e1f3b5882880be4203e3606cab44d2c5e744899ec", - "ba0a8a91ffb2377a86f10b991d9580a4e7e2226a28e4b19c6ce7660847cecf8a", - "f201f289459cd1f2b8cb3c6f75026779531cc9c4a9b5e1b8fb9cbf8b87ddd226", - "0e2c9e119b0a03f4053c122e9af942a850a62b35a94efbac27b802e066c6b9c7", - "270a0b92f89739f5b2d1c43af675356b8efce12f1e174978587331366646381d", - "caeb0f3c817b89bc1e7246fa7442f14960f2e0ba0df0795f1ee77f393d6ab1ab", - "094b2f18036d0b0655b982d697aa732ade360758cbc5dc61eac01b3a7f355ac9", - "ac6a6e730bfea661b542af23cc9bcc1e6651a5f92ef95c1ebdb09d192b1ee92a", - "dcdd9f9223b7655adf54615ed086d521412a8bc8a3cf3f47ef8bf6f5e55a2b4a", - "e4a1185522c4420bf0bffb86f6133b0539d6dbdceaec820cc431964867fc181d", - "60f467ca2710a7db883c07de9cfe96d9e8927a65ef02df83b60a9b5e79af5003", - "4b5827ddb5301568692eee3d98b551f63d6afde5f4453d81370dba86424abe84", - "482a24341b9b461546e15a10b97aa198c719c1c204dc2c3f6a2476bc55771450", - "295381dfe9f527c550fefd67a5130a4dc7d8d6f4e551b6421cedbdc7d2de14bd", - "9c72e5327cc1da311a8cac43232a9b04f2f3ce261816db69940657006b63d886", - "a662402cf7b7706a4a68c6a4cd657edecbf451131695925ce048bbbaa08b2ebe", - "08853c71e0bf3d66a6107c6fcb837f2d8e7229bb9fc191cbdb74746c83d5e42e", - "a0430ea01e347dc7dab219ba07f043e17894d26bd2c384c7a6f3496f48c1cee0", - "d621f06e02684517b3e5432aa7ef59c2263e3bf7a28f537cd145b13cbfaaeef7", - "ff7a34b83591c9ae2297c0b321b35e2f68d29c13d1cc48cd63c3827bbdeef29e", - "d546a839836b9114006850a0111bbab5f3893094bcdca95ddc3f14ed8d6b2b37", - "3e809d2a2590d3001578d7a40c1490ac6ec5f9fd0d1290c12d8c0b3f688a6e69", - "953258bbd5cfc367b2992b8b5730c2d3f2f2636958ce1944b81cf0e0636c1c6c", - "178ad7e9ba81ac1d4c31a1971e6d554204e8c099a1bc15e41db95b2fe6cf82c4", - "967cf7abd2ca6132e45a93be05d3517c9697d8aee25c33f71c188cc152efbf48", - "157a7dce2068171411adb8bc237dd16e42390ec61fdcd2aa1a2c426a3f0e27f8", - "557750b8d21b6be791e0e96c88df31d23a7787d994806c894cf604cd2fca225d", - "1f13d12f96a5b95d8d3a628577a7811046f140551ca1ddec24f2045b45f67246", - "74489ac1f2d1901fafa957a25ee41a4581a95a3091d0f88edb942c77f02c4a8f", - "4508a67728561a16d5429dbdb1e8c653e45621797983883c3cf7e36aba13cdbc", - "62738724eefafc51e93bc392219938578af02943c38c1387638ff30da2dbc1a4", - "ffc242a488bfc754e18f04d6ba4a1d281cbe26015cda6d7dfdd0bb331ec029b3", - "79b5cd411fe7bc9b4e694ae224e58e473f35577834884402df4f4f04f22421e6", - "b2f8245c6e06bb3524d35b72cc3c43d2a146ffa6604d149fe1622bf2e81c059c", - "34633f6e857989e92417d620d0f8756ae3cd32222f2e865efd1b4aadf356f164", - "895575fb6ef457a312fe31d3676c86945f4b71d144dea834c46bbae518d78b46", - "08aaf22a4789f138ef66c142f3e7b4c0cd100b980c8138631d430ff8973c1ca8", - "c686d6bce8973ee5028f8b088cce26365250cbae1788eb83caad3cc16e52520b", - "3289c53aa416a45cf63b603d4eae09573b3b54757a72d5c7640fc8172c141bab", - "8f5eeb2e11c69a07b0314352f86121aeb1018559c39e6efbac5ce691750ad799", - "f1546d4b97cce0ddde46a372bdcc92e95a8b22cc0c09e454faf1006dafc8372f", - "75848c0ab146ce3ed3035cd99a6b161f564e8f43dfefcd7736de46253e3ed9cb", - "f4f182bacbf22fa300627f2345ed7cc8ba92fb1bc9470ec5d6de1c285bd149e2", - "e3b2c05ab6ed78d7dea69223e340bd290dfe396f5b5c319e9248d5bc83cfe94e", - "718d4b7bf011fd77f4fb30159b1d5ce00eede7da4973e4a5b8a8a1af38f1959f", - "468deb0119c25daf53ffe2e917050968b6df53fa756410b81fb39a8249413ebc", - "f35679ab78b09b9f3b4d83696cef4fa47fe201fd2fc6ab86bc73973b8cac47fb", - "16c83a6e1bcc5e9a0af0e9de741330109b4b9ea2dec49907e5b612586b73077f", - "c026e9ed3576cb2935158ab4f31dd660c31d7aaad420281e7c607c4afc979c78", - "c4523ca8872a961b5823fb9b5d7b087b450ff7f7d30908e7d0db1a1cb6d6dbe7", - "e54b1aea022d1255fde4349890887963ce4c7e9540e2b9d7e963317363b85582", - "992a120f974cbcb668348aeac4cd7131042d0f34857c8b9044144fbf16a139a2", - "5cf15c147c37012055108a9e5f20a55b43ba3a8c0ca1caa519e9d91d4cc138fa", - "0536fff647f6dfe9c2a3865dd1ab0f64a17f014f8e387b4d31585f0886371302", - "896f283a18ce4f51fce61b7a55811980b56784f6ec4c941ae89777a64fccb0da", - "01bb12ea9e64937a46d73bcd98f81d1f1f6557173282a69e70605f482b2f487c", - "ccf64bbbefe8d35f03b0f610f350672c020f3ccdafadcec9f4c9f2dd85d7a041", - "78a6c7762955b62744640f66757fc7c143eaaf1b0a443cc83f6724d9bd490e50", - "8c146542b6ce1c7436ac4c132eda9b195a7a503f09c516856884ee5394e16312", - "93dc9642c8a2409cd6b78090acedbd39841526232f350d9f72861c45ea878093", - "d4554672508afe951ba0580e3ebc17886522dfe9c5abccf3d936084333a02c1b", - "f7aa07535956e8b30efad9ac3c24b00549092b43691adfdfbb9c38c9349cbfa6", - "3386aeda7f0134d54747ed7c13dcec78aba93ef25f3f03ee07131a7146adc155", - "adb26efdde8184829a9fe1e92b03b36156d6a211fa386014e7672527b17f9192", - "201f735fe44b9082d0745b20f7ad715523878b186bad2d38d0cce512dc5d577e", - "2db7d92ab1e2dce156ad3fb43a55168b568b39beace8dd79cd67ecfe7ec39a6e", - "0654dd1fdd6f3a37fb2bee9eabc2ae736f44666af523c4471f0ccd34541e6902", - "f47280eb835126a49b63368d3d1de89395d22d01c97e2205bab52f7e49708501", - "01912347f889c3593e5ac1aa535ce15539e70d99c76ce06079db2f2e1aa42090", - "da29b77a3d153f1213dcd772d3cb074961c68f54b3ab4c3cc228a36525b9168f", - "6caa40a6f0c9593a79e696620edff971cd0e9ac9cf4b9d1c3547e30aa50acc45", - "08488002fbe405c2d450843f888cc282f564ca444ac02f06cbbbaba41c60caa3", - "cb7dcffa4ac6ed556793612bf9550d210dd7291099de8a193722347c91e41b55", - "c0560283c295fa46fda009a396c711921cd677e4a275cc80db61652eb5c49f3c", - "6ad60f5a6f952b5a0f0d499309320901668c224add436223cd2a0e613f23d9c1", - "b44b97ad3bae7bf7be950ab8089d3216d482da7901d520a1fa22ebc607c9544a", - "695cf1a7a07f8bd12aa632697af39664ba8fe3fb67a9965a52fad603a8cde99f", - "318428cbd5942c03847b03c7f3eaad3570d7a8debfff18232f01fc92ed3edeb9", - "bf7d74860eab0391903c1f71bd9ff726a5dde78f8d72ae30f3b9c9a151f25048", - "7a128f25d74730719a86b0b157d3cb31636f9126c70b4b03eb9aef30c335ea18", - "0e0c0aca899a76f3684b9cc5e7ce761ebdf35f6979f07121ad61a0b5006467e3", - "b445566d1f52b25d13fb25158398356a4560133289e88a804492431f8be790dd", - "498535984a6ff7011563e71f734caac889d40e6366bf431dfd6f46aa74bbb803", - "4cd1d4b21aba7ba67b2c242dfb82fff48c7f1c5b06a12a88981b5b133198db59", - "13386163f0d9e61799442649fcc93b390f78309a72f347967b929553393cec29", - "515f77125a17663072dd20342bc7e8e8d25203b987452e42fb0189dc1adec6b7", - "3da3236281d4174f8733237e684c01bb864a97f1dba51040f3be6f6da49fcfba", - "f454b17cb32b03388072960dd4cfe10b4ae4b9181f2daa57933d60b82a990aac", - "7873c7b523f63170e5421acef1a741f9ac99b56c26d4be13ee275ba966616fd9", - "2fbff9cff0038bb688be95105b49e2089ff549b2b19aeca7bf1ee5c65ac0e845", - "9ec3b71b6922963d741f1d47f89a72a87d4c8bddb0f937c329aa329c54fb20e4", - "8716e75d56dae6711152c155df6f6f172fb25b6f6a148d0d8c356e529b991a3e", - "d991e5c84ffeece1427cb9de47d810f03cea3006d96ee23ab7611ff81fe8f90a", - "769ad913a6348e143391ac3313b4c41c3fc6ea3fdf8160696e852ab33027daf3", - "8638b580f422ca0637837bc124cefa8de35136ac14a78d003799915233b8c91a", - "2fd64e15ca5b518a441d24df927225f5b7814e20342046d72c7c7f1fb56ac478", - "46720f7608632378b1ac19fb5c68b8c446d5fd3a424b84fcceec970c42d87c6c", - "d761a7ba25fae9d89713eacaf39ea9f49608f9e2e1b92ae2cdedcfa1948e635e", - "2a4fd2471d6d44229c2797ba07f3b79df07b6aab3eb1ccec790c3ffe498aab6a", - "503878ce6c021bf45a91f8ff5aaf97666514a98d04bce602ab11bf3d7de00441", - "1488940ddc58fbb5117b6ae81ae72607736e178c2b8db9e3cd593f2c86601699", - "5575fcb7202d27c4e2001add7ce1f293320aed965c308728460cf9e239f7029b", - "75ab33fa599cb417761c334473ad07a636dad3ecfbcccf6b5ed9ce8e6d7cc6e8", - "d4d12c7b2eee2ff3bdd08ba6c28f8e80eb95d9cb39bb55bc091c658ceb20fe5f", - "a208122e5d050552feafb6355aeed73d70ebc5fdde3c4a44c92d6d82b8f9db50", - "0a30b744cb9cf261727a3e67e2b49759ce4a5fa187663c4d52c725ce20ee85df", - "2629e226de8969dfc02681bb609fd5479cf182d773a289eaf706dbf354f230cb", - "9d8145301598ede9436e6c723e9d302c843b5bdd34a5e8bb964b89aa0d28ba6d", - "be5f2d9dab3f3e4c11d7976af18f1a8ed2a953ba3501026de4ab0132449d36a1", - "dfb5f077f945f22894d274404c340864b18ff9f2015eb12d4e8392ba5d2cb9ff", - "a1e83142b0ab145b1ba69189356234f7dc2548391f25415421bb3c7d3ea090ee", - "30c113bfcfc10d37e11f9561c37f5a660ae3a13901983fdf32365ce4c8daa0b4", - "cd101e51a6e641d54167f215232c151d25f24464af2a9debd90b0b3225989696", - "bd365573274fc0060233175b363fe4f45eb19c208b2b2fb4fd381be4d5204940", - "c0f6400fdf8d8a62f3a511d7c6d46ad75b051d84deb31bb1745c00cc9c4b830c", - "40598c0b31e7c90bee358668ad16a817b7f07a1911e3398314e4905d7a3c210f", - "b3891bb7fded7dfcc4be13b1df0d648bf29b12ad78d52bf594f3768f64c78a47", - "331da5f80d95c8dc3c6e66f30ecf8f705004d3c3d18e5d9ee84155d0903b0ba9", - "6197b1442e1601b6500abcf9c38106e8714ff3ca67ef3c0bed2ff0d195eabc56", - "1b71efd81128cddc6b38f56c361824034043cbf374451d6c4ca020cc5e9ba85f", - "f781bed0e74637aa191f9ba174b162d88b3d0eb8713aaeacdfb899e0fbb5f3c6", - "8bcef0f425ff9ee60b4f2eca357d9e876439513e52568a6fa10b0ad60147a6d6", - "6f3bbf6f557e4ffd08f8787c6c3b919fccb3c9ed03b0b6233c8d2d125686be95", - "3c8498a54b5d828af26b292f5b064a6a58893ca1a1a9dc616bf89646b9a5b9f0", - "14a524f2b036007c256ea75b4d3cc1bcef5ce3f631da0d972f4ddeec555cc7bc", - "4d3baaf053f279da43da127036a4519cf479a038d30a3cb2acf5305a1915a96a", - "5968e53467382d84ecc5998799c64c2a5ace97fd0d4e5d43227335190140e0ce", - "4d543bfae71415ebb0ee09ba73a113132fa49c883ec7bcad2d0a6577cfc1ebcd", - "76ab12268660492a6133c9ca35e2071971ee7152a0642775bf2c345d342cbdb0", - "42f28edc16ea37ebf264e4d81af9dab6748f764feb5806b4c12d9137144b4a7d", - "708757d454c11a021cbb4b7478ad6c73da621903fa28c4ce5c13483fa15d2d7d", - "a275b2442b63fd3d264aa9ac6254c24d60dd6abe5176aac52f5dc07fc394af38", - "a1b74a9244498fa153f768fdbab462cbc45de0005b8f847f59fcc4e8029c73ef", - "f5295e8f3df37a255498343d43bdc095c744c8eb18fe29ff0e7c230ed28ea4ef", - "b38ac7779edd8f0a317b175badbac29cf38085308d5239ad580afad57c7c9387", - "7d5efa2c368b2f3daa023a9e8d8f8ebd40dbc662ba542ecbb1216e5acaae5e39", - "d445ab1ef213e14577aeeaa7621dd61a081b5bc04ce6755182a1948b5ad0bdd7", - "1e5e0b3098a1e79fc4678e7070a4f8576a3561b4e62e1fbd3961a81cb26a489a", - "5cfe4fa06768bc906108109c2c926d2622ff71fd2471698a657e9897b25d77e6", - "45b23604e666d52571c37efb0dba6ce3d9ba04443736ea8df9a14986220865ee", - "fb9eace4caca9a0a4ea49e099e550adb25a7a3d8f4bcd98732a7d942a3be13e4", - "21adfbcf694cfb5f544fcdc4c5a9ea5e8ae108c7464d879856d12ad8b153fc51", - "5d201fdc0d4edb3faa183cb254faf8b88544213d98c1e6800cb5e44c5e544179", - "a71b4a083756f1b0dbe4424e667b1c1a00fa6c9a579ea18aa1f8a1fea7fa8f77", - "8ad55306d8a29536b6c914dab511feaf939a4adac62b7257f22c2da7afa34d80", - "af66406a26084193197b7e2f0e0922499a8c563988cbfe8365eb006f2c6120f8", - "c06c5ef52ea8c88729c3fedadb0038a67cbb74c45a2c6324df91af72787bdd77", - "61129e3baf0e206e8e573396a6b0c7379fe0617ba94ef322a1202d5f9bf80e93", - "3203fe771399404cd2896a80ed87250d96819cf40f089a2bc941c69fab043b87", - "41f294b10b5c723f07bd44a78d4aceb4631d81515cfcb91af66c8bf0d626385d", - "13d39a32c36b4e6332111dc5e063f95b48c84145db019ecd2a4678be059d85bb", - "fa9082905d34f1490471a57f5adfe80d13255c7f7b68843783ebe5af752d69b9", - "e63913e3d675a44b7eb2957bd464a31335b7ffaf8908bd45b9e552e6dd41971c", - "b41216ac4552661873bece149fa64ec32351de200589f6b2775d218813bd8690", - "56c0a389e0e6e7149af24d182b94e3ebccd893ca9314095fa3b9407740575d12", - "692dfc83c39b72d1968a37e8a5b61ea8eac0e725b6713324e9edac5accfc3fa2", - "eeb95ac60e83accbda4c818b6ff1fd3fe7e0a6ccf879ec30dcca9e765476e4dd", - "4862a012f677e2c55f51bdb23dbd230d92621e84a679748449e568623b3f75f4", - "347eba44bd421c2782f5e85ee0a56847f632ca77987cb432bac9224d228e90b5", - "aeb54d3c72e01548abc1b2228d6b04dd6b6797b9c93a3da9dd07c204757b22d1", - "9d6f0cc81b9f0fd799ad5957b32a260d49959b5e45d4dd8d4894140fd9cec121", - "f0b3763ef2125e9f1d72d3064331b2755b4234670f5ca0fc3e263130caf252ca", - "1501c8165b0eb29b22222addeafa652a747f4ecaa4b0380b8fbc8b8e0c5d2dc7", - "56a351f6b09140716c8881b7fd5fc2deae70e90bb506d9a66fafea2a8a5a4840", - "982212f5c8bbae56f975f75e9597d183f1bdfc68b676de325d2a0d7dc67d9e09", - "1735b78f91d8b2dadc6c98b95127e03e61c1c12e82489345e33441fdcfe7ceec", - "a42c45f56880872d5bd2bdfb137fe2575982459205533c227e5bdbdea5828eb7", - "9f93c77dc830eeea4c58d3bb3e8ef52fcf955eca66847ef59df207f8e0b7fb8b", - "ee9a542650b61c5c90be9e30a6797679e37c8efe443b424efdd172447e335e23", - "5e1addeee0efea1301d86b4c48fe7096c40b7c6a716b55f03732374e2a37e0ad", - "2e3ef4ac38fd8dee83ba1abace73ddc18ef74431f805470d41b27f47da965942", - "d0ab3ce23b6e3a23d29631d8882cc0949b72d2ce001fe9ddc39ceb8849f7c117", - "1014d1d6fac5b5b73ee3dfa575e849ee06dc52f4e6c738e9e129a0d8226ec432", - "349f472c8f2c38b9dca58820cbacd95b35fc63e5c3c534d44234b65dac638939", - "bcd25154b0188a5cb69e7b17e117ac5002004d2f842514b4b451a8768164d0d6", - "c97ead877b67ea379f772bd4ecdd23d02f8ef2c59331f24cf8c7b215be226870", - "3b2da80d20a1d3f79af495ab978ba6b835935036170634ea02b2230b4af0d460", - "e353a79a35bf9706be2a87d6d57e3f185f46ecc4bf6eaa94f4cbb8087bae9042", - "bbfa6109a4ea0339223b1219dfbbe145645a8c564433ad18b59e03d5c887cc46", - "2256892873990e678bd5a01d84d105faa4384501202724f8e3f820a57d61bfe3", - "6f885b284f1220073c54bf259ef076be62aeace4840ad463b5e145abbd2077ac", - "f7f88c78f5b6e1515d4822271ad467c534e46342340bae7e3583b1346dd3b194", - "f707a46832781cd10ab6e0b696a1a9915ee49079a5ff2500e69ed0c2f05a75b6", - "a8834a00ee526d042161e0e879b3d0b9a89e963d5da56d4fdbb470de71b6d364", - "50d1d3e47e99e23d1ed5007c3b0f069062d73834a5740c8fd003f8c853332173", - "8a92c730a4436e1d281a3b5240b04935971b99a99dd4abd231fcab73ae05e134", - "3a0ea9ed9e592a2f41589ad06462f1e2b6ee901ae022662d6ef90199ae0616e7", - "a48fb3c0d022f17853f52678b9837cc1c46e61890e90f12283841226451edb68", - "f91a6b8dc3221c0250e7f54be0a4e7afb7da456d9b0005765ea9ce9c6a90d651", - "18e1c5510b6187d68373c71d63cdb70e3fa6e0d7aa6e51e42637e1d27c0a9465", - "e2154fbf3e0770efa17f5c55a8f98caf3b676a8278812d5d9aa1d27088b72091", - "24d4dd087cce4e4c201d8947e166e59971b2cc77f7be4c6fde92e16b814e2fe2", - "125216d7d7c221c0692f28ede5798f6f05c48f51c0c1197c4dd1bafd0a40bb96", - "d543b397d9de098acee351a38ebe6c9dc614357d11b85f160dfc031fd4dc913d", - "d056c82573e4d719ca0d803f78741ed9f799fd248b78b9edbddd6b6998a38f38", - "caeb3b764b55780425634d6a6a6b5ca1c1459eda0b83fb40aac1a8da011e045c", - "307840e9205939fdb89d660af0fde5b2a913ecd71cac01d2a99d11021b6537ad", - "360da57364b2fd251a902b312c9244f2230c334998974d3521f7b2780100ced9", - "576a9b6a5a2623f0c65f075d771fa0ef95fed4e7b4d4b2a145ae1663b43f41ca", - "6f73aac55b9fe4f6cccdd3d3ec894b67bc10d462ba1af2625bb0cca548467be6", - "e38c672e1b5e0fd250516a1da07af56cf3a10a718df8383943a7ba4c8f6480ab", - "307b6b26df484be15e2446833786e172b6bff97599f2b8b8df573c113ed6fa22", - "6af7829a220dc734de1b6cd5cbe2ef690d3b98539a2e6619e05619685fdf621d", - "946e224399b9fda2b8eccfe8c242b4dda80a35b7f9075f7be0ac559d9dd32878", - "8ff492c772e9f54eee730038bb0749c4737ec71927f2c55cfe4604a3f184ae43", - "7b7bb5985eba90c8712bfcde4ae0bd283a3cd9c1cec1f67e69dd2ef1633ee362", - "1996076169080b999b2de600cafea844db881175fc1f7dba8f451a31e19171a7", - "13741db24f53afbee18b427a9dc027b129ca363c688d8c63b9b626da7638b6e2", - "01dc0f9c6d6db1d4b4b12d6ed8e8906a1717acfea86998512e428c82c370429b", - "e6931f7d56eeba0d649f5e147bd98da65499d49e78fa9bf9bb8018cf613840fa", - "7448a81eea0a6954527a160b025b06cf7d5ba5ea0a0b26d7a15679372ad1584a", - "6e77088ac248b5263a35fa254a54d294514603333b12afc0984c70e5dbe0b01a", - "c775bb4125893797f855a56015343dd428d180b5ca747084c375ac49c2309d96", - "ed59623a7a103fcd87f124fa0a0cbd3386d5ec92fdd310c63f6bc00984683b56", - "12378aa502ce9453acb573d52e6052bb0b3faff0bc71df852cb02ddbdda59792", - "2f6d7a6f66f52eae5acb8a82680306e593c1a441343daaebad83e9be7f4d206e", - "b1efac2efd2c91e2f31743a12dc178c9dbf719143c7fcc48457e4b6925285921", - "254c1115f8b9f6a3428a5cd597abe3a98c33536a2c3e072426d39c3109416450", - "00f43ac04fc76d71f20ac9b7f07b3f8acabfc69aeae0079a96d7178b2a408cee", - "aeb285c965a8c452b0ac93f47afc347af8ea88ccf3a6d29d9c19c18480818f99", - "43984e91f8d4abc003267f3c9a5e53f96ff31231d0ba4a67a6c61445bae33aaa", - "33336f372cf2700ae8075546e787060173b4cdb49c15b00e0d6f4e9410180ca8", - "bfeb08816686e7ff7934b462e452a74ebdb8c68d0e5679de3fc9e04d70be4810", - "feb836e203f6d9b10f42fced05606171e1104b3ce308cbafba7c6dd1be431e4a", - "1bce35984e8588c8db89a1974670699a37e67b1bf6a870826cb1a9175ad097ac", - "73c16eb549d54b16324ae2cb9502d22cff1f66f280d1ef4d2777463c2ab4788b", - "1b4c13b3596b22af12d969abcd44d58365e3e7074700bf99e7cbedb3fb5b8fd0", - "13a7e028bbde0900e45daef1fea77798588cb31099eff888fa46eecb9cae90f0", - "e7259ed73b766182907a100986b9f55e3270ebbf646c6dfb7a3f9b23ccff587b", - "1dfbbb4075a6fbd425a2760b9f51dd1f4cdc1bf77e8b59aeaacdb391633b9157", - "027d58a158d7152d9298eb01deff3594edb5d94095edb26a099e0816802f9f14", - "895075573387c298f416598f59a4566acb8aad9ea0a02fcdc43560dd50c8a0cc", - "be16e77dabfbcbdf4f4a76de5566252f0fe0d295021b873776dfc739925459ed", - "3f898c7dad220783b10313cbb584bba482b171a6c2837d56c527a70811c7f4dd", - "9a15c6d3909b92af1afef87f1b2bbda2ee48610f48f36cf804e8ad0fc167a6c3", - "6c7124d318f69d9982bc7d3d18861ffd5cb2bf61a4e209dbc089a06818b4ea6f", - "9c0ea86a4e50de8bbe9ccb5cf95effd10bc5bce52df9c3b269f2a3c66dd1094e", - "ac07a3252156cfe28c25a8b95fa69340bad282f78d40b424dde15847c916f518", - "2ea2b9b89195c41e63d2bb73706d51e56a789e1ca74fcbd80676c8e8023c5e9f", - "6012a100eb284238ee3dc5976506957d6ab7534becbac159dec38ee55e34d39e", - "a53ec0f8ef44fac37219c1d6d9bd70c7c3726c18e01d8115778fd048960691c1", - "ada5a57dddb139592935c11a32465b2cbed1d69b9d11eb2acbb6bbafc82cc326", - "a2aec91c9d5618181f5f74ac736cc1cb7144f73ef3f079f455303d4f4c8d7e63", - "56be47ecf5b40aa3dc3398a1fdafd04c9e8e117dd6350c6539c252468f10c3e1", - "490c97248353bcc3e880309848d5b49393e202241a053be6b37823eb15add7b7", - "73208aeb945a29734b8f3697bbba91e15189e0d7f3fc0970b3ff466a3e5dea98", - "22d5aa58718c79bda7806038d5bae6c8488615dfb5630c5d31c36870d8e8d544", - "f287ce0f2cdc79930cde46b9a4f7e3bcffcc35f24e2dcf71ec0de35d5c1f9551", - "e64811a3dfb70dc1603b4bc798b56bce39f9b5c1426ac41f170c283db88f2b0a", - "2dc63924451704884afad680b5204dc87b7b40e113aeea3c1fbb1982eb5b3d93", - "4c108efdca559bef6c6e51803028d5db15d2d41658754ed405df5d133674d378", - "bacabcea6f89d2eddf4c8902405810dfb9650771daa4ebaedbb83acf19ae158c", - "544d653b6feb123d858e57523cb647de288d6a4c86587a639c4676215131719e", - "1d51751974c4fbf4e810321bb64e7f1428e10cc2895e86cca9f028b5321f143c", - "ae6cfbb02677eb8c49408487bfd9c75dfa41a523f133484f322aadf79aacc080", - "855889158d881f53985d6758b10e797100b8d66759477336ab1069d89b4f5113", - "d791765b8f6d308769733af1331b109e43325125b9c0afbf3942ad10e282b26c", - "bbb502b563cf2f1dd86a0bb651fc8415083d96b09d98150f29c6f66b6eb95cbf", - "8fa11d60185b4c68b151623249855b9d0d07b38ad5339f4fa34f4d3a2706b439", - "db5a3a387f4da7517b2ecd5a63e099c52b1d1140b1543f2dbd67bc47cb423ce7", - "16013fa8095eda4e1283155ce864ed5696858af533032d54ef18d1aa77037abb", - "50a57bca4d30fad94bb84902bfcd290141dcec1ca821af0e6306c3ee62825d3c", - "06b1f0a6417aba3bb49b62519d0d86cda277b81f533fabf2107ea7c1de14e505", - "89c19cf33045926bb523d0a0a7c242614b569f8d0c1ea2dd2651778cb12c1453", - "5462523dfe6d304a0708a6b86d712292ca30d71ac269a93490e996d14155d1e4", - "c47b9170bea80b2c81486afb72406abbc12d8c587db20917d132838909f23724", - "377fae0993b0883d8f391c84066d93c8a6fba1ee9d848adc20833db9d27d8bf5", - "2897ce6c965678dee833a13db7ca3571cef0686a47278e30e0d58447f0f17939", - "01bce1fa97053b9bbf74cdae6df166a62642b1a94d4ec6493bdc83b8ef401858", - "c345ff8bfdc10db4e5a81ed66f9c63b404b3833ac3eefdd2ac13dbfaf69144f2", - "4fc5fb928d03276b7a6a481cae4422a2d35d1c6d03f85a31097de58888a5b140", - "41927e51ca5bdf9424d866cab5f83cd2a11e3f4f992e5d4bd6c73eff6aadf5ee", - "55b409e0efe6f4dd26873c70b39e0f1e5d52bdc2f71f89ef5c1633935e8a8ac8", - "b7eedd1ac71bc280351835fcd836bda7ee41334bbec8f34b6884c08e07ec4394", - "90487c5e1371815cc1a160e422638fd29c32abb242a9d6a4a11998bc2f3e5931", - "d0d81c6ac8ba80d20eb1faa40214f6945999022267863518f5d1fe9cdbf3ee76", - "068f40c2149c8fec4279a8ec133330f20663aabdc9e51b1568992c64fcc7ae7b", - "309e4728676f4d95c5202f259885199dd7747382b144770c7e8ed419333b9319", - "8bfd2272a5c17bafec23088a8c1343ce9d01b2ddf4b76f784b934c8260114c19", - "e32ab22e2425eddb5a4cec6ef2d57fc3731eaa5b8e4928c6c4cb35f94321c878", - "10c51b582771d556229e8ddbf1d1825fc2c6c2f4e6c9b5ec28b5a56699fd49e6", - "9d55fb1f342fd01907723584b76ead59f6329b5f316fb04b35f2a8f90293a728", - "41a582159aa4010be5ea0bd883bac52c319e8c7c061a9e38bc61c153edf58026", - "1430057b6f5f0730fe5742ced424d9c0dce629032f6652b2cd23098b4dab854d", - "22f61c05fe6a19721777a8e1e58748d3cea5559edf2dda646416f9f2e23eb0b0", - "6615808e0a95feef6230c266e84c6e32deb70d16f4cf4e90a8ae4d27d2ed1fff", - "e3e8f7023864eeb5379581da223f43718752502d349a0538e0730f8c83ccf05f", - "c76a35c8de74f23faa709b4086a790061a76e57cc9a42cdde66b9efd497b0a62", - "03afe33b53a19b74c5995b370510753e1d5220a698346ef5a55bc377699cf519", - "5bba628936e2c8f4cc24661a9b679460cb60c835cfcddec0e27f6659f8e95448", - "f7074c03cfaee2b82867a4f366fd8cafbb581c5613a0b29d69856c1e6b3e49e0", - "892d82e44d02b89a907f73646e732f2208a6b8c4c48f84f902d86bcc0c5e1705", - "f3336c33e479190e2857312a3b433cf0179afa6f848b037d52c9faacb0a540af", - "0ea3b5dc4166f894c77635fabdb90376e41c0ec070450d325ab2acbc669ecb3f", - "46bbaa9f1cdd4e888100de8ecb523323a36d0bf505b8df9b1b9caed2d9979c05", - "5894933251e9d5f94338e4307ca7c36edd6a206fcca7b145827783482888cb03", - "1c296f9beb5c48ee1100c515e6db8ce494694322b2b1886d1f327566a0683361", - "75849b9c25fc7790eacd97c4cee5098a704b8ba94e8cc586e38994a054cf50ea", - "b1aeff1af768d0fff0f74ff83a8f3724281a2ac21a215fabb015edd52c9aa0a2", - "632fc1f17aede60ec6eb2f52452a907a1f546e98370866691e37ce2cd9d3d954", - "470d25985d1699ea80c2a3d4d37a9da63f9746a676ddbbfd7bd7ae404b502794", - "588f765690949e72cd36cf47e3c0d84be0abd37deb978cdc74c51c5e765f719b", - "7a255c2da54b11b7c5fccd271436b9c9c7813ba8c8348e46eecb1dbcf32a9e52", - "3dc08112b0c4d4907fd9f6aa2054c6d2afcf4c3cf015242982db5dcf83411c7f", - "d67e3028d7d965d4770d94af67d0428a5e0c1a633e72fc5f24d1be5a5d575fe3", - "fcd71cdc9d6b7055ee83649de6407e345dd1ea1b904a96c11efb39282deda0f5", - "ff6918a83ed4b395a1b231202b83768d6dc6b21cb1729f0d3ad7589816170b7c", - "aa8ebc5794372ab840ae6e33e651b21abad23d8aafdaf0b04d6aa5ff50dfa1e8", - "4bdda09b9243e39ca5bdc25c0deb20c7ec132a644cc5e0610e584725615df24e", - "91b1ca67065cbeb522ddd55723d4d82eb8bf5331ff7874aa49f7e5310cb40261", - "c38d0ca4e1c70e0908f4587ae5e5da995f2a4d48a2e56db143581c3d063d33c2", - "ff6dbc1bbd256210e9c9e4f608c23d64b27c31d29225474befd8d67fe63c186b", - "8df98cd11f44bde0ace345b78a44c50c779379cd191146e84da9adbdedd0c4f0", - "5ce8d422ba9c11597d562a857c6c8324d697c2517c062cdaee64207eedc0f17f", - "a9c856dfb7966a514259b1bb88685ffc46e8ebbccdb3d5325c64a0289d3572f5", - "799ad8b8f525dfc4c1d1dd08eef5e72a8af92a12596b16468fd12e8c098237a4", - "dd670d236a0fdd9cab1fe2a8750deab889e49a6dae464b75c198a495069ad658", - "1f35e9344a3a0d6fc84c63d07af50550ce0ccc3b2d7c606b6f2c47fac3264738", - "b543c11e8760b6e2422f9c3b9762550575feae2e9853864e4246a7ea80a47754", - "28fd6789eb412e86dbe82dc585b3f1b156d7f46dad7fd4d5e36ffa07675d33a6", - "b6a66ff2a98a74373e5aa1cb580947dabd8f505b612f3d7f61a912a7dec3cea9", - "f4093e9a97a63d8d823acbaf504736172f71cf04cdc83a3909a76df392473cfb", - "8b2b45ff1383f3ac94cf051dbe87ffebcce67e095a5ebb9ef4039702a3751e26", - "bbf8ce47c07bdc32f7aba18d1990ecbdee81aff22e27a8f652b24535f081d6cb", - "47d0e0d346fea3e87b1c405c9b1ed8c8dad5260508651aef7af52e2ca92c18e5", - "b077eebd14739af1c488f06624c6a6b86d58c43181eea6d010beade77e56d012", - "645024aaed0cafdf406ec3be792c52090e2445c9e640fcab38ab11cb7d71812b", - "1334b6df130a6d2fd9a1ce0817d840165bd6670e174574db4cd35c86b9894198", - "ecc9ea3e63cf9fd511ac2adb9daa7e8953e7d1d5d57a28de063f86c8d8ce51dc", - "3a5ed507a1718642bdb96eccb2986db5c6d1869bca4d2a153acd3a47a8cfa557", - "f973435536096a93f774cc85992b678a4aaf46afbffab19c0250a2b7bf128833", - "d470240d7c7b36606eb3afe0593ea905ada5ad410bfb78d3cff0863751c44c50", - "bf56a1bab3104b492b79f962254d396fe2f188f415c764dd2b0a4cb9865a59c9", - "45dec537e11d7cdfa954c3c4e21497ee821bcc88f6bb8c67a57c4b85cc4e917b", - "5835a28a630e7a9c1acb575d95156ee56301a6e0b6a5bd0a9a6647a399513e2d", - "e1566be97cddd7ef0bb1a03f8459b6d5048786a91fa23db0fae433e83fe43b0c", - "4cce581c96f1a8c0ecb23fb69b95fd524e7c0fdae2faf245faad9ab345abe73e", - "b49c7cfb56676bdbac429b1f5f4dab199a75931b238a9f226ef7d7f82de349a8", - "10820cce2877e558c6b909d13867ee03092909ba8d19d3dba1196e8e67fcb28e", - "625eb091d7a6c682003bae2999968540dea379245c8f57a2032b505a96f07471", - "d6aba2af4fc895ca9c9d7b773dddbf9a4ad6357e0b6a7ce04885c30dd2a66ab1", - "ff36d8225127d20e07a11294f5b282381565152a35dc9247782de719939ee5a0", - "198f6dc4826794ccd43abe68e17ace26344ca31467cd88c46760cdfbf0d22d6b", - "33d5ee86e376c25da6b4428cd54c4fb1f0b77de12623a7b0153ec77675dad043", - "a265e07cc5788f0829b904589b93a4506bff392075fcda5e08680c6bb95ff588", - "5183f283e46f94c27cac21ed31f216129aeabf8b85b93e0266c3ced9b99bb7e0", - "61a5af0ff859176b6853794e9eed8108aacf88f4f9296c3f82c8814b5b7efb20", - "bdc3523fe3f1fb48d57947df7065f30a32c0670711bca1c77659056fcf480ddf", - "d553a2ef3047cfe70516847e1d39c23423284f7ec00adcb421334015208762d5", - "15d36843d17330cc2de20a9bc7f91d7afcde1858a942fec46a0e21114249431d", - "e7701e59b6729e4f209b0b7d35bca4c55dff904c417d8b19487a19220e617040", - "b61dd757b196eba557fa01ba5c8bf1aaeed92775ed19560048395ed4e626798c", - "a4fba04b144c5f52e77fde7cb49db2e65afb9ab1d63da3d1569ab1f5f759243c", - "650491a2eff82dd713a3a6c18148d4e81726ccd10d03e8e896db3b88694ae508", - "1506b65344f01e067b354e878e1c26a1eb122b4dc6950fd65d27f16cd102a34c", - "fc9d412af4385a5bdecf2095d7aa27ad13768079edc856893637602098c69fd2", - "dfe320a370139bfadf2a6c5113c4f10d75247dc2b7dc981f48b9f721fb63c271", - "8f4a696d6c6e02948ae06ad310f3ed6645414373edfd3e6f1820f92e49f6352f", - "109e91253c30d5beb5af0ef91f08b0584da9a68ea3334cf5be14ef1a73167e45", - "ff94560d1a9cabbe69b3c07bfa82189adf7f51b1a07b580dd395558e8fbac956", - "a86b0947739cf77efde3466809394b1232523d68019d98c8aa32c6d8a3d2398d", - "858e8ea38fc29ee82d2ba284d906ea1b61f101cac2101cb6efcacd8044819bd4", - "9e1b108439bc4a329d8103f17037465f747352451f9e2ea70cfaa2f620c713b1", - "23077cf8bf635214175e7f8e668acfd54c170b59e928557f153f74bb993544f9", - "19953f2c23e419cd49e00d7b7a3454c534009c6dc70bc602f566d5a02cc7380a", - "b399d18097fcd3b0a3c8f37f39f35d235a256c1030e9657599b5fd5a8dbf6745", - "8948ee5f47c7d97e8bf12c71a04b7ec03d2439fddbda21112e3ff6274a2b5884", - "318c50306f5bb3b6c397f5e938132f4afcf2da376d22a05c7e258625fa22cae8", - "a8b2f019852a8662e838462b4aa3e8b5c6c2a8b0c1cea80737f2f9c678059d84", - "c0472172de4b6a97f022c4e3fd701637b26c063b4a9174a834c6bfa43e8890ac", - "146f1997a7fbe3ced028eecaca445434e1a82e71e4920020a3c6602ca1f32b7a", - "04a5994bf3e8a2f0948fb8fa94f074549da5a4d963c7fea20552466603715aae", - "abc63f513fbff853bafcccfe326bcd8467b1e636b047bb0e35ee4a9a1f745ed8", - "5bba6157dfc696a92b581c9725b00aec9e01ceefc51b4bbf25fd3bd0cea3542f", - "adcdca71da7cde74da51052dac5bc0eafa8cf20a635f17ab97c0a9324b6b5c9d", - "3d2032f307d07c0177629425ee862e20973dac5dc6bb98a408b54020a604b23a", - "b4b24ed46070211add966e67d16c7e334ca83e8bdd5be3bee937f3603670e737", - "214b50df8b25ae54ba7cd51967e2bc8f8b6c6617299c360f7f0c37082c70c66f", - "5db177f22a8062a568a29256677991ba879ce61e34d0db9d66b13a360542ca1d", - "c72c3875e4b644aa3958b11c4a3bcb39c84e5f187bcbbd908f60b69166f986ba", - "ba7922fd1350c201609da44d611aa48da27483c69f0b4ba06636ce957c517d7e", - "092550a2521cf66726fa644bd80e3f0c5571932332c8f8fdc0573309ccd8362f", - "c4693707a899545c4e97e7c736d8dffdc0847c214eff280d2d33284bedf77a0a", - "7ee9af73885266dc4f43eb5a0daa07bad57f64f28a0b94fb989ee7d95d2fcf91", - "773f8095759ea327bf69f49b2bd1cadc0ff4b297502796d502c9e18577a0776a", - "87f64fbb0e8fb446c96ebea3bff6c9bf2aebb8b0dbfa46436e5da5a6a1fabc05", - "2a4c3f35dd6b272c1887a45603e41b52c194ab6aca4ac04b7db42910ec9a3a89", - "fc21cdf0e7b8993b8cbc2ba73be079a3c7406baa4617545e83b56a1f7d1a9024", - "b515e13b824e5f3d2de6754cefc0be220f26cf80e1a85c115fec4116870991a3", - "aa2b69fe4a99d0f33da26c4f3554839d38856cba19830a8531df069f685e1893", - "640f7be5269e230dda84c3edbb718bbf65f4207915e19374019f47a3bd72022c", - "5daa471f63309b606b6b4ec9c8f99898d88f9bf467fec5e9f62808281c4058e9", - "ca24e2aa9f133173d30b7ebc72c23ad3dee8dead37842589118e7513a9e9138e", - "81f9f4a6866fe9790eac648f83ac22e2a3432cf20f6b17a13f9ad0e631d459c0", - "fff91d2d112c44248787f74af9c455a0ac6ec3eb46a714d412c4f9c305f3f5b3", - "b661b204098505c2f3b6ccf3f136d11f6fa00393daabee4d5758c4e02d3591af", - "c749d7972660b89fc69eeda64c4c858a4a29c0f241b734258744987830036cfa", - "4bc846ebb3fb0af22d8952d0f099ba4b720fe569ae3fc371c5afe4a15b25940b", - "9c17a305f03aabcb163971a9c5443a62518ee3b5cea66b9a7c10cf8dcd5922a5", - "d6a029de56c9a165f72b3d57fdf8837f5090c3c869f11c48f5a4320f9a6bc361", - "f03725899ce125dabdad93882e1a045421bc3efa44088495b96a8376fcbde960", - "32af6e1d604bd27dc684323cea449dcff06e64a0fcfbdc39ae06a83b94b20d12", - "3bb441dec8f7b637b90114609fdd09a6e641d73ace6677b63a6b43d341b3f35f", - "5cb292583a63d1ec02a9b80469968be12b1f26ebd2ee7ead261c9f55170f36fe", - "e3a8c67f3c2ff580627e1a5d755c5bc4dfe17fbcd2df9f01b8c0a0bcdbaf7ecb", - "6bbec794c7ad8e9fe712fe30aeaea1f0aa11e195417c3c0cbb55c0db9ef8f73b", - "92e92727d56194ea352c385d12c0237fe5d980cd603f5e601d188e555999d073", - "5289809699418713857d0b240f5fcae63117f6688ef1d931d39ac51c96bf74cc", - "596d07011c094afc7f2ab5137e18df494a53dd1913971e4c7c21701e406c34e9", - "4fb86d99b71b9ca62c4e8928dc993a47d705884210b5ccfa682337a8c33846a9", - "ca99f87e50f0e6c681d16beaa49e9257d62b16babb9a5fac7d9cc3643198ef42", - "71b88ace2883503557a77d2fa5022c00d12b26559aeb496f7220cafea02c749d", - "839538653d4f5386d5a34593b3191a1ca8a49589077a62c842efc7c693383ead", - "5e8529a9c9069c760b8f46b0fc22b04f0a976d2c609ea8cc9c1b25eb9404ed82", - "315df16c24fed40e4ac326d97cba5b5e3f7940078c4838146701601cfa571d06", - "0b5dfab531f7cc6d9c6ca5ee1bef2935b0e3d57bb47f0fe257adb1c720af3497", - "494b4a1d039d61f1bf8a39f7da2b87591ff3a4206e0ff7fe37e9d0175704e683", - "36779de5e0157e5133dbff0d42619011ca7e48cbb655fc4f6c9ff2ec22758d4e", - "8344f21575a362855ea502d3deb70c066a7b06a7095764a7e1b59e2da0fb6221", - "8d36b4fe3656a0847da38e897438617a787fd3927f19031815741219ae0f642e", - "fb3abb4244cb322d8484d94d80e3537e1c519ea600c9a10d96d63850e8f9ad89", - "e4e44bf0f304cb20329c02ccb379390f609db3b1f73b6d9eb7a31c04b135cec5", - "734a4f645e0e5272df29fb98e8a7acf48672009deabe789360cf24fd9524cac3", - "1979b9a22e98d70c087a1988a5e9129920bf6049753240c968d9ca7f13f78ae0", - "7858806ed09744c64111aa098ff8e9db7e9d90f8af40baaae28f5872d6bb4a97", - "76cf9825d9dad7b61d31cae10ee3797001ac8d52ec582db9c9b94ae8a44ba789", - "4f6c54c41615f62a3d78257de0e940836606ee2d828aa434009ecbc689e48d5e", - "ad3f0ddd35d57679d7da30c4604a6ea0d9f84968fbe48dec0a5221fa87233aa6", - "bd304fced747fed676962c51e10dde99ed1c98601be9cd9ab7a4e56d4b62b487", - "492c954f8a5dd0e3883f011cdee564a29f36c95af7dc436ca58e0d9f88b8b378", - "8c26bb0e5a2c6dd24b95849d665244869949d4568f4a762408c284e6f5581ef2", - "970f7ff77b5db15c2ca06977f259f9f3cfe14602659ab6900f40c607f62c0496", - "071ea2c890949e6c7f98dfaf9bd65cd7bd4c2f7667b5a4e2d0f354d7851c69f1", - "7a80faafee1f1f7c9e74accc8ded685cbe7770b837d12f6cd5c9dcbe50621da4", - "9668c5ce594497e0a613f8f6c3c6e53a9f37a33aea97204eb700a855a7093107", - "0caec594b0802c8612d05c458851e7947ece8ca733ce0cd6b830539ccb1f38e6", - "b083db65964c99f6854c0cbacb197b4d0f252083e2c0f56c18fbb9e352c920c8", - "8a98e5ae796eb5e82b385c9cd8e4769a5076e3343866b904b5b6c757bfb3bca6", - "ae072ab034ca7c81a883d67b5fd4e6c6c1cd08ffe2b7dd9bb2bb8c75be511e0a", - "5cb6b14986df0500dc6c28fe6f5c655e12686b7d94296409b327a72fa7a6f8da", - "80799c25360b04ecc5491cbaaa7155d7f1f8d03eb1d32b0d3d29035cc5d5ff36", - "117ec05544dd4275ecea2410a88489f0ab9687b02611a858ffb36ea2f43c78c6", - "3da916f2c347fcbfcadb68dc22cafc0d6d95a30eb5c070ce65a335c1aa7990a2", - "aab69ea0827ab5fe9c1463b7263011102fbb6bd32a56c9f61e43d2839a76bc67", - "1cb0e663575e8f509b7bfa6ef62127343b7c50ec1643a77e34238287287194e9", - "ebcfdc18a248d716d017e219549683d43bf238867719a05c77c99c51cdada335", - "d09003aacf5f89f1b04d50e73d3cca2f74bc87d834544704b59d6cac33ecfdf0", - "b645b6afe4715877d6d8bfb3840493402ba56ff2de13abb8b02cd58bf23d2792", - "6119107d1108718247d2e950d64bedfab678d65cae708993b275e467a9e80ebb", - "10ee7b1a12d40947366de5f893e5a2b0f21242bdd21b5bf3559451389e7c4b05", - "1caea8e76fcbe42898b88ab3570341b2aa58f3ca77beb4dedfd776026ffac485", - "e06bb3ef032dbc1f32863826d6a4650e179ae6ea933370ca5d4f913f3a5fd8e3", - "80b12481889ed67a643d6a0e11b91361ea2359e1871351a3b1f61fd505b8940d", - "f25cc04a2820b78b6c87de812945c18434fc606378dc7265b5e95ce5ce411901", - "78ccde617df9fed9343db155a29410ffd25311567a9322b35c80f40fac01281d", - "75f066fd2b2209a6d3265b5869ef43073d67e5c57b9b141db282d408b34c38df", - "1e47768510a9fd971d85ba6dc67ff456d91204f6f34cc1323535bf8290221e2c", - "1258aa1e0a93f2f85ce1df513dc0cdfb2a414f4f0ae3d91f3d1048b32eab51de", - "667bc5a59ddb6ce1c8c582372b5edf679d9862b33a00f0c5a4abba761cebfc0f", - "6115129c02542591025ed16876cab8ec95454ca1c04c87fc62b36227b901148d", - "2b4a10fa66121dfc447d007ced4076353ea7dece655bfbcf1f602c0a31d35bbe", - "5aa15e4694d91a93798e0abbb3b8511a35890bd345b8a70c1e2c93b42d026993", - "d431b30998f7c4b977aea620ae1ae74e3652fd9e46ebaaddd18757392911ea9c", - "e3b77aa7e10a7956cff9b504af5135ef44ee837f00d75c248bb73672aa670fa1", - "405ff61686229c212b672d4bac24e7e840e1724c852790a0d68431355d4f4018", - "ba06cbe9919b66ec41da94ad4fe1c3ae42c9a7f22161cb487a109b1727636977", - "c1e19cdee4bc8543548ae92ae64d37d74595c02ef789539b275fcc0269bbe6ac", - "0c87828293bd816d43ea0ec790c0be4dc991de02284c550f6fedab6856500654", - "c54f44ba91ac20e19cd873b889082d33d8355fe4482ef31cc9dc3b6c72305957", - "2aeff10fb3026723feeb8a35372069f1146cd96c098d3f5812b47b624ea360d8", - "a1c1a354e30be9e1015e49d7794615f33f04dd1ac04fb4f83c843eab8ea71dfb", - "639b0c0365d7ffb5839a01aee8644775fc459509bf17f032e4c6089b05edf59c", - "4bee822eed6f28eda47a654866b21997d7db82dfdb79896577075f829e4eb905", - "e564263aaa659513f34e8f05376706a8df9fd7bdf5b3a856352fe1d9c99f2f8e", - "be381b48d54901803322c9d54f12ccab736e5502bde5a4632bd2f4eaa58da7f0", - "54b8c2efb7a0108613047db075e14267f978073d4e58ddcc3c779f01df752faf", - "eb44e89d1ed0b30cd9dc3f92e547f39baf4fa15b1782537763ed278c839e576e", - "431862136d749c6a1e2a9ebb0897bc37fabb11279562385b1a2c6c29c9db2eb7", - "b56883665ef644c142e94f10f475a4485918ddbe3fb662c15745d6ebbb097754", - "904ed9e966475a036cd5f40f9e5e8a5f9635326688ac76a03930281957718a4a", - "6e259b49bcb31de3d60bf00b5f53ec19db13552af4c4500c54e7db98d98dd2ba", - "df7096463df64c4a04439bfda5973063e53098c6b7aaf911acfca42623f8cd90", - "2a423ab1df49ded1e7e9cfdd0f91ff607017bf8ba831e1a44b9ed522212672ac", - "e860ad9a5dcbfddb50212aebfaaf32e4670de650a133eb8b92759b3109413ed9", - "a0ad086bfb6a413d0a8686aa9f7120b608a78531a78f5b57d5bbdce0ac430ef4", - "b7370a998a90ccb642c83e3a9c7bfb1392327dfa62f9597f8275fbd0a2ecd7ee", - "3718e7bb6d2fa34925e2692acdd7b3eba269d1b3acc8bffad5e71a3e6f954e50", - "b96b925580d9a4cac6cb173020d23ab399afd96862a3e879a237ba01c31987dc", - "91d97531cea19341d05c71819bbc4b84c8b6f5cef536da515e7fe038b9044b47", - "c125eb4ef21ddfae255b717b13a7edd2ee7ca20855c7ae13b812f4abab2993c6", - "5950770a2ef60bdc03c6798dd60de15303d78f2e74ed82e7e0bbdfbbd1ed145b", - "4b6ec60849312a23d4556f9bba2e24f2c50360aa4f29008a580b32dd3a438919", - "8399b49ba6505963da8fcb7ed523390616e1c0e699b22cc0b73cc599c35aba8c", - "28d74d67e8f24a7d18b1a2e95353aefaa26015e5b12a7b623f166ff32b30b449", - "607f2952d5de3f78256eeecee9d6fa71ebceadbbde2dbaf67c22e0dcc1e2ac27", - "55215af676a54baa653d7b5bfef54cf380f351bf1d578ea5fe604fde1f990471", - "26805d3d06fa0495b66b0f37cbc7e35e27f055419490e91c155700b35d66237d", - "0baa096e7c5f84df9b67391794de764a53a81192b82c7e540243abdd559926e4", - "c1d6e79d81dafc363958ecb9626e83bcd3eb7336a84d1e623f16609b3a0690f7", - "e09b180d5ca096f4e12779b0ed203bbe24d0236e3329d314bc1f503aff7d5583", - "a586ab982fbf5bd336cb260401677c6d174fae43a0638a3e531f8bd220406497", - "7fb714775e87afd7e21cad17cf18f4cee2682118a9164fd0b2a96df65466daaf", - "1feebe4a1a04d36f80dfc48de8bd5cf12fbf16277592c3f9204c62a84daf9d94", - "9d9000987e8f5031f1c03b5892424c5b09828008efe2cfe6284447b0c0c75f58", - "0fc4457e1d27a2cd5a68b84e9ac3ff44302a316bccb0807c8437af5c63aa12d3", - "dc39c69c2268b755c443ca0f382d43b72c6b2ec2e51b6b32c2e7e37377f8c926", - "b4481b9d43f73e1205b66e0a3a8c620450f48b1dce2869d8a95bb3f9730410b5", - "538251af5dba8ac0f4d37a84589c9a5073b35f546d5165c0a8dde07a6155c755", - "355ff44aba4c56fcde984d8de9c7e7faad2352f8ebdd97ba3b650ee742776cc5", - "c86fafe50e5a4550637e89426e9e442645211e792d85266395e1e09ad7780558", - "a98fc776ac897a4836e1a98782f945013ae2366674f9cc057bb4c23aaf2d02cb", - "e31cd36781b0c3b32573e20c5d7e3db8c969ee925486484cb4e073c86d91d342", - "1f6caf3194f267aee6a54ac352ad40de8161c4758e2e0e715e7b2cf7b12b2202", - "d92661ba1431ab075834419f612ac8659680dc53ca36c132d1c26feedb15510b", - "a2fcdd6692b57dea45e949adcf785f727d1e480ff6242725eef6e6bf1f7fe979", - "f79d627225dccc31ed609a1d60d55aca94b158c7563ebe461753a1a6d19c6003", - "0ca5b0dfd54bab9fde09f0cbeba6b14519e3bbb191e7dccf6cdc7765ddb27272", - "29acabf2581a62704325e9460149fc0d7141d0e69484ad0d4cf111427dcfcc95", - "b280e347ad6ecd0375ec0ca6d876ad05799ca0ac2f6127fa3ebff808b67bf3e6", - "41de6cd061589d6b007c8b40a9362555494a47f4c5dc79ca877982945062067e", - "40c31d606aba5d882503a3ede5f32d9a8d946cb842337009e7c1be07229c7d85", - "d40992db4d34d22b680b55e4cae00bbc7ef7610239214b4c6f27c0542d05fb14", - "7c89ad58a5b47437f015e283f19acfd536b17f75a3198974bb4dc7617e245a09", - "c0527c4fda40e57ec1dd3811bfa99264490ac3df092dcd7b2b5748327d3e221a", - "c3788e3bd0a6ac2e4210fc554c804e2a3ac7852e82fcc723f7f526ca237640eb", - "779ff6aafdd367317351011c283b4b2e29989efb9845a6a48b6f9713507a6381", - "94d0c2a701f2c54344d5c3ce9155cf718d63b45c0291b8826a67508f028d4bf1", - "6ffecac7e931500bbcc35bc538f3712ae94a4e02e0010e8dbb12c5a11fb5afe8", - "3b3fdcac44b4597be0ae0dbea14fd81cf1d6552ddc06ad87f3b785734dc2dd92", - "d4bf478faafe7c90730622d09f72ab4d81d719837d01b5cd1c24f686a59abba5", - "2f1ac653c631309ea18990e31294e1429d979793431a2a76183122c796f5706b", - "766f77dc416de78eff7618d3e6606e8ea8a53c7665ab512f6ed56d9d7d66a319", - "0d9205017f7ab3d578186814778e01d4cbc1020b8a0587dd8b320c8d86f7b4c6", - "7bc019515b7b97c2427838d363bcda7b25d0666d7d7c264a1b9bd2bbf0ad05d7", - "3113ef1089a449e7ab293cc467a82dce1ec5b991f760b137cdeb7c6fb2e97aa0", - "b98678198c5d14a638d257197d19c29d77a471166895c5b881b9d40a867d0760", - "c1bb44810cec90535cc60f1a6c24e2c3a33fde79ad00683e378e7dbbfa6e0058", - "0aa98a598977e8ba8b48245abb39b5f1e64edac649d1d4f685b07e864d4f57bd", - "9f5d1d5ab00520e2ba3eb852ee4922a2fd52e00bef5d591fd6fdfb0d063d7c1e", - "e805e6bb98d62b33898a4e05cf720ca30257bc4cb3a2d268e98a0fbf7cde8703", - "7c8dd55180ddee9ed683727e4a226d3471b80d2e0a8b18f450310ae42a639ffe", - "f2a9635690890cb7256e0dcaeef6e1084420678b62ec36f7dc8efb112e00656c", - "aa1a881a96f618e5c551ab636311cc34e13e31568261bbdc0794cde7e24c735f", - "cce71714b0148518dd8cface4ce298166889241ba07f8af6342e97955f946a64", - "df7b1bdde3438602a7463c5542a03cb5714dc0e6b007055f8e35730c43cd2553", - "a07b87824880413a85b180e0313cee83a29689e9721b3f25b06e824390c31620", - "d4761131ee43b66182f40bfd308b8f3d0b5fdaf953ad9ffe5f5341cfe32f4c86", - "560136d15d126e4302e9a8d619321c0501dd503a77bee8c103191f55f630b874", - "eb70fd5eaae4f1cae62d86508ae0ae5deec55de1c4effe2a18ee27cf89c3dc1c", - "a7b68577b4714bba78dd77945d4218ca2d13ddf498291a8a614b511969e050b8", - "d256d0e858373a7ec96055974de9b8603553d3f056b56338a20af745bf56c1b6", - "86638c534287d06338dd46a4cc66ed36457c095912faaa0ef7cbf7c38f070c0e", - "610a8b9cba06c40d3263ae8035f9449b8ecbccea31ecbe0e98af4ec225a43463", - "d8e73abe3c5d58fbaf2fc3c344dc82e92753c4c690cd10fbd40435b77ef277fd", - "24a01fe5213a2df7f7277c9f3dde3c13c58e0ab9f36dec04f42dedcbbdeb4b26", - "ab6be0bebe53c21c0e413266b658547610942c8240bfc05336fad8ccd23dda42", - "4307089092efd08fe3bb29ec7b9c42a494f13fd9fdad78f85d473a35818fad32", - "762b0fcd9436ade7d163f783f500a66cd6e2d230dde5f38e4acb4c5cf198446f", - "eba1714029faa762db86e937678ec21a60df9f8a94a0bfd534778eb46bbb9b24", - "cd69ba960a2d385caa4d1d8766ff9acc6e6113b9b5659c2dfa8c7f8b389bf0c1", - "5f334ff32f75fe9d12d6119d580489254e2917dc2197d074e071f681c40e10cc", - "87f9650148c1ba7e53c640e8382de514d23ba52cbb3913b514954153913579ef", - "01430915e138a0134b6984ac4e0916ae8c55037f5a3567da3b80913915b7355c", - "3bee57137a64e747eabfd9052a856e718aa1239b349617b0823eeaa068d8bc6b", - "f2d95468357f289420117efda444b478315a2879c700b76b2206398c6b2b405b", - "47f5faacaffcf7f381d98e80fe9d3d6beb93ec451aa25fab8e4ece9691fa1bfb", - "14094c9039638fb140be5b850a79e9493c22e4b27148cb8387fa056ebe6d186a", - "6cf799bfca9aa4426cf245d3c9405ed13ce3648e5d6b03bda6127cceceba2d98", - "c91fa64f848fa5d60b0fe5a89af3d7b9025fb2128c4ee763db1f8f0707b74cf1", - "12a632a5e917caeb555ccf3beb69a258856e8959a9e76723aa4a8481445982f7", - "11eb0706873b20235ffa71b5aee213fd0e6efe42d19ee80da20f4895dcc4debb", - "8da1d37acd60cc2e87cb7aa5adfb4cd4cedb6acf448ae5b61c696e5f2a88ff70", - "3a75306758f6d2525ade9457457c2832963f0e3e566a464e0514a8ad1b6111de", - "5d8ddedebf4e6057306c4ef286df772f006d18ede6fdee6bca70d520b86b6397", - "e0dc12fda9da9b004670c50044ccfe70031819327b47ad058dd500fbb8ec042a", - "067da458f8003dcf96c179f1a22b097cbcfe93e212111428abbe08893979e56b", - "d2da8222166fa6e2d04dcf633d6834f61514bddd68402705c733364db362262f", - "753adff562d2535a9f94faae2a9af7b4731b14602a656b9904d75ca25166024d", - "290553b6e2b83384d4266caa266f0211d5833adfa9e7bbaa09df16b3f2b15e8b", - "4d7efb854bc889e98950cef5993de2d882d67b4f52eaa0f17987b46f96c536a6", - "0d496cee61630ee4dfde45207b493cc38189e2f704e3306f5e6910ef0f7a4b4e", - "1956debe3c42a9a8d736be37419e84ac1432a7ea884fe70d7633f21475e0fb5e", - "066e77e097e793b809e5f01fd8871cbc4613289905c96e6d457c484432a09267", - "f41cb9e7028114076f6f1800eebefc688c11b5e4e4005bc8252e57111483cf13", - "4c81896987f02e300e2323f261f2998c0e292f200b5ad9ad42e8d5a05decea12", - "a133f89467bd3a4438e7da77b877523bbc366186a543cc15f78c774d41bd88a0", - "a08ef4d6f5c9669f713581fa9369aab19b91cee91d05506f82b298977a23c884", - "2bf7ad0dabd93d3d00d9a8b118ab208ce9f0c988f8f981060497e4b1c0c5962c", - "f2819a443e060499ca8c5c65ba68fcc6f3292962a8cdfaf07e37297dff3629a3", - "f48a7c5f65afc597a9f2156a5e57b91f92eabb178274f994efa17ffeb9537a2f", - "a110033daf6d3212692eec9910a0bfa1b1b3e92868b10efd2b6e30119dedb3f3", - "8cf9101c663f12b530aa15c633102f72d79ff3ed46a3de4770ea83cb76fe4848", - "af3ac75eb43fcde2aad4ddc34dfa45cb10f0fc833329835416975b7fdbadde44", - "790c3c1a39001b6e8a56ec40eeca3ca367d530391be9680c86a98479083f7cc0", - "a6efe247ded541f19a22712620085a0edaa3fc5720b443a89e88602680d0d093", - "3629c84f863a17c6e944820200179bd75e0c9a93d946e688793ce88484ed8506", - "3e5f1db01355e91ca74b87df3b252a37582493a79f41597727c8bf8a528d8090", - "35c6019ea4b745d55219e8593cd94c959a17d456d577cd61725e1a7c34235c8e", - "27e9516112883476882921b79ee40bc3d023432c38dc05f9c39433e77d22be60", - "653179371f557445ca93dbdff12e0a84e253914128fdb46d6dc30c24799eb3f0", - "94b4d9c0e180ddb5475cd09398fcac39072cc659a757e3078ce01efbbcd48d47", - "0008a52af17a1c96651b373d3248a657836493fd2a02151a2bac4d25c08eaa05", - "f96fe29e5eb9a66c5796d029308abefae882b4256470d4c8f872ec0d57f0b28a", - "b87d9e254d903a9c6233fb7368e68c3e708d5b4d2e0ca619fc2750f4701f7156", - "c3c1e28c9f7d9d3b504eb6258a981525553e4794f03db1953225a2c8361670f6", - "1c1ef6780d56840451561f68fdf0a4cb0786b355057089238a8284aaee7abc7a", - "8024247b0c0fe825ee2a95377b8c5b609f47320e648e1bfea0aa47958d076362", - "8b252c7a0d6c1d305bb10ffa234998eab11faead90041919417e9924efe76c6c", - "13819baecb174715ccd69a9d5754bc561b169aeb5f6e3e16b415745b070496aa", - "4ce00863cde13810427dd2012fa628d5960562ad1ccab33ddfe4d6ebcee58881", - "1ef65243a3a387e9b4f57bca11e0f155d19142166d17f28ce743d0ff1981ec55", - "cbf0db3cfc3917106f8e060908c97519cfbbbb2b08d9923ddb2d052f90360143", - "f9ee9a8aaaf514e4ffc55c371683b0da74cfcd17b32e4e0301b7d2f3f15afdc7", - "e873498c93e81699408fe74bea44189e982db2fe4f9a6bcd302f49f3de723144", - "54a278504b15d0d60cac9f07db4af7073625be764a2aa2e1e348d00c73622765", - "5e1688e8c04a49e7fa15513d1d49ed7e26a7e6027234d4439cfe2507e79f17db", - "cfca0d55d3a90bb00b54e873181b4b8a863fefa953976a240534da8e6d9f83af", - "2b5877c9ba48a5c86c643778f69a3feac061d20da8da5c9b0e998a42127104c7", - "b27eb90e8c214ef6bf6148b4e6e000f0bc70f217fddd0888554a83b03aa3544f", - "76e1693960c271005e7049c5e1a42c00cd7af34ba1fb8d8cfddfc51473a7b1a6", - "f4a3c4eb0ad938df00a769feba21f94c0dc8df62f4e7e4b95e68cc71b235ddf1", - "3ff6ac45dc3c6695f2adbb25f44a33332637d20d9c19bff3598bb9ab5ac408c1", - "96c412b0d05f52456a545ae97936b682ac5cf82aa6040cfb06b22a1944721a2d", - "52cc2be36a0eab726495773a553bc01d2de5296bc7da729e5401caa6b5ebd022", - "8e167983b6801d521c2b1cedeebe941f47188ea6a5f4ed1eff1a6e6d4f25a535", - "8bc36a548cd4baa1c1a97cee5c8f6513c8da0c97ed975ec7099ed5b00da2b9f5", - "f72ed5f5a5a8b57e69986ad40b75594ba71d65a9a75f0d634f23693a43d48f24", - "a734da3b48d5bd2024391f85010f7e391f27aada225f949a9b5fdea541327502", - "4ade4be9e79ae80a83eb2cc781e06ad414126dca84fdb5e5e58ad693be9b1ce7", - "278eb4e0e05d77c183df607bb7c06f8730449a6a70798ad8f4dca5d62e4ca776", - "2ebe5a11d056a521a15e92371b4912d60ec58d75977266d09bb6470898490b2d", - "ce40a333105ea797e29d578d2e2fdf9ae307d1311e6234a0e2ad7ff9f6a69f31", - "5a7c4ea24aea57944d884128f9ed8e1a5459ff06b68e2262ed42908f1c860313", - "45ec81617324663ffb42536fdaca64c29cfb255d85d4ce9a34533f36fdbde4e4", - "76ee2e3f082b941e09b028897b6477b27038dd3f143bf55136c29aa693897d9f", - "078c05b2669fb96fe9470c8fb7b40eda8738c720edf42a8473de35ca5bc9fd53", - "6b3ceb2823e860a389ca3142d728ed5f5edaa78c92d0b89bcb789e17a6586b30", - "4aea84efb96650bdde2bd9ef3a2705d6ebe746b1400d0898eb48bcd248f8d5fb", - "a4a42a71a9729d85c0450c75136a86762081cfd89eeb655d089a26ae2572e5e5", - "55a62a1723dc35a26ad85a4df5ae8d8aa90efa29bb8fac76696fd2643140c41d", - "9a01b68a48c6c1e7c9f4702d7d3be6a359921169675ef9d4f85b4f14a9eeb2e1", - "c1629245c6876a69d7321f59fce7206b53fd86f23722a86ea1167d6ea97e98d8", - "ff789870285105a77583c17b990d2f5b8ed88a559b1240effca1ab17aa90e06d", - "9e787e4ac894e83ed79fbf6ca27d3040df9ff415b2855e2e9dd29351f92e2301", - "0460df9fa2185fe0e4a8fbf8e48850ba164af023ed41ec95b2e4b3a611c8fc0a", - "7d914865b72e1fb691857053d71109746f1b2f846a2471c27f8b5890226ce4e7", - "f8837131e5262f7b3626794f1261b5196bb7e63ce7252b441be9257d677b4444", - "94d8c1e3d534f37d21ecb67f68c494ac7748e6da62cc7314b6c50356bd713191", - "462c6a34d9e4e865a2fb9bf2f8a6cb1c3cad0265456b738a148a6640e854088a", - "de3869297597699ce52c181fe0be8c5d7687505f4011262031e1f0dc2e6eccdd", - "5ddd8a69334da9e2649f1d8688732d56f95832c402cfb4c8ef32155d236f96d6", - "0d50377eff328bfbc6409faad48b749dc9949389ece76fd9b9503db34ccf0248", - "6bccb07edf2efb3936ffa87570829b89fba2f395e55ba996409d68adeb79830f", - "d692299f66e308ff209b1c499d92827afd73d7e85ebaef374a30d09775e02b78", - "5fcaaddf2a6495a0ab0a30d4cee468e276be0cb1b3ac5de7679f4b81f2d44a0b", - "75f228164a71c59db0c2bab5caabccd193b9ec8ebd1c3a1b8596698e7e8c78a4", - "fc3fd39f173a21e35afdef3047e03f4fb8ea19f272a00558eec7eb64b85aff83", - "b6cc6d9d4056a2dee27c26b03e2a011cf74fe0b521ff13a29b0d7108baaf5993", - "7035ac333362fd98a129040a7615badd2a23517bee7f4b50ca27b6502435a763", - "d2d4cdec021503b1d73462748b1f4fe44e2a5a47242c8b06b03c8651e49c5251", - "7e957628b341a4dc3135233ed3682a7b1b8d76640be74ea87af303657e05068e", - "cc1217985a725ff6cabcbd069003b051fadf3247bd20b8f234646b389a1054f0", - "ea64b4f24743d078b59d28b6ee31b66932b65453454096891e70b5301b5dfd8d", - "f79d0f3c98e5e73e90c272936b89bd663546d807e618b75bd64182692b73cafe", - "a031b7860c2a2bdf7f5165e5d7b8cf3adeec1d06537a71ff390743f00ae2678f", - "2bb8fe5552fa82516ee87c8b81830deba744ac0a580300c5c4e82d9698183463", - "10bfca2bd1bc48e6e98df80fa4a28d390e8d8fb7298b039478405f5dffd9ea17", - "ecd8a312fe8ac78e54f71b8ec93005db4edde9e0b9363ecd1f850e8823e988f0", - "d39ce4a7ec146c1e1163583e8725e5d2e731fa1ddf648a5196063d1423a355ff", - "fbef6a1fc9e7984ad9627c11a3499092abaa759d1f2062161f3614788ca2ede4", - "6f120a651bf17c7dd731514ef4c16d6df82cfaecc253b87f758736b038598c57", - "74a087b2794f2f9364493be1e659700844988bf09244610080401ea2211c3b7d", - "3100695eb2fb2b2ebd5aacb8d36adc87c632c80f6f1b0618c7a296ab89a82603", - "456273f744c47bbf03be84221b24b7e6ed081a713eccca5f78452afe76c7a8a7", - "70505eadf1151e9f16ec767789ac75fa8685ca5932d1cf15ba8aeada83248838", - "cd601eff022047ea8f55a1b1556dd39d0c31f8bd41e1f8b5e0ff537d9bb01cf7", - "8fafc7a70353fe5abd131b6956270f2b5aeb4799b9405c4b2d92b2497f335ad8", - "9733a3a2b96bc57025389b29eed003fe48b13709140e5ff2c4ffcf8d6939155d", - "39ef8c5658293ea248003f50cd194251697495ab230b7b73880163c6ac32524e", - "ac7101f0762806a7f1ea378ccc8ea33e6e52aa3ce621b9377ffa64867c3aebaa", - "32ca032bb241849e6ee96f503004b0c80505ac02bb9f8a16a6871ffc2709f1e0", - "4312d8e9d55e58e3010eed34a8e0dbd7f06372a7a635f102e76f714d08b2f236", - "53172a394994d6c7fb2236b9c0a23d0a59d1fc30b397e6531bcb8bad947eed94", - "76ce9a8814bdbfc16d32bb809ffb2c185ea682650c03dbfb96e27c666575d298", - "67bbdf4f689ae8f6f61611c143e538221f56160ad9ded12d4bf25688f0e29d48", - "1ee044d49d3a1eca7648a81e6598ea81512cd8ac2523f4ea46dfcaf1d1a3f6bf", - "9c6d878c54c3b27d54705ed069cfbf4d96f90d4717b3435cb1a0a7d6df8881e1", - "1112929e8e4fab9422dceae7d0423e440d6681ecde91fc1eee9a03fb7e4f7b05", - "1953ba43e09835b12206e859bb109e75d6598c68b89b4004cee495fc18dfed3b", - "80c34e5e9197030a23b7576f791ebea14d3ba98f9e4e54d2377c5e128b35fc8b", - "b5200403a5854077a2d3e8700f58cec4800678751e2b80fac343ff218c8d5c5c", - "bdb21fdef432213f1304e72cbc8bddd6077e43622c78e60a517b91862ffb9c69", - "8c6fad30f38ab5666a8b714d82e40aedb4d0b3b9793f518942c881273e75fd06", - "56ed3fbafd3ce3c540935a6b13c53745c2c4a198a12cc7c92445ecd4e1b44ba4", - "ac4e9341ebebde188d02211584ed9c5d824b8bf5b561705322107a2173994d96", - "293395d34f3d89c8cd3d290c45515f38a8a1d1d9503cd25d02db52b68b301156", - "7293822b42adf7de2fd0edc5f27b67e5a54fa347623959f6721ccccec0afee52", - "3bcb05c0945174f0e85335cb55a6e0e022b3e29da7e9ad2ac2a7942639da4020", - "a5959982016c3ed40d48df36a9e62ba98d0d4342cd0a9eb20e058aa44b6fb08e", - "a2d5da3223c2bcf6eefbcc86a9edac38568907b4bf5c86886704add85eafb8c9", - "bb1c6b19f20008a2032fe4bea59769fc78167d75dc92fbef32e2dfae19d7bf49", - "e867bb186d03c88057a769677d44b2dce52aa97be8f3c0777519b0d044a884c5", - "ae82619310195557335f939a2b75057b46dd2a3f190e4dbef1883ce7110a4c86", - "dc6728efc6d8b5a03f8ca6c357f63fcd1761fb95bb95969d651ae0ad8f76822c", - "0a209eed5a2d1019d2e45a4b6d6846eccb3cd4cef2643064e7d2216b810dc3f3", - "1ab0cf33e27f89af9e96ce55aad8b9caa294e1fe73a01ad3b027dd168e24fcc1", - "bbfebd87d2dd7b57cf7ba3075a836c334f7eb38a9b115f3647507fde701abe98", - "dbc42f67c18c4a43c7d24931dc0f28f9c6eabfd72cde3bdef7cab91b51651ccd", - "3283d033c201748ecce213169a0a6632cee23947ff2f78c64767915384da217b", - "17d4d78648470507c28b1e0cebc3a047c6e2d0756d010520dd82b45292128543", - "7cc4c97cca278e67b8e637504fcc86bdcfd163fd7085c30a11e5311b7a695f69", - "68ad0d858890509b5d31cc9d01cd945a44c5453deb4c62b0b44101ab9b5ec2ef", - "3b1fb214e3b7041128a823631943ed5b554ed8cf214d76782aae50b1977b0736", - "f94a3d3f72294fc92b96d4999739801e73ed6fd1240496a6cf33966e42be9063", - "a7668655752683d650222b6e4ddd2ac4e9424d58812fe6d1421eb7600324bf1d", - "05411e7ff5a78bd97b22ec47c4b8e71f0e8d879c7b3cd3c21a2624539e4c5b9b", - "60dab9a84c108d7288fddfeb9ebcc0bbfcc0b2fc8277b0f3189fddeaab7eafef", - "77db1668e64fad678bb2c7999313827dcfe2343c9e41a808fc2d5fbaaf700eb1", - "a8a435cc306095bc36a3a42823dc092545e06b5c872208d76202cddb2f817891", - "30a08adef79264b97bef979264cb34d8d0f2aed714819101673e0a74de701086", - "721514e238bc56b67df999cbe076f9b594e99cceea85b356d5586d8fe192501f", - "fcb38d286637dae9f5be71c6b5574873317adfbdd82180b91baffe2029b88000", - "e77012e09caa8fa28a3b298f07239e5348485152815a5eba317cbfb45dae3291", - "8d20eaca52e99a70eabb97f8a63aa8784085e9afde0baf35598beb9f9f4f81da", - "61d8717042985f92e2144b9782fcdf79b87df007cb21b5c5a631bc1c8961ad9f", - "908025e2a0509d37e7f5d71acc8377a7f7a29b477d9b37985bd1c9f5bb8de5cf", - "1d8e74720d3f44715a20666163d78e0d3b369c1d1260bc223b8a443cfdce1751", - "5e8b8297b43f382561e7de4e23898a9f471119bee6e1f2d87c02b048e8bc384a", - "d0fd3e91f4c3ef4196cb0851123bcb458d2275a0f7b9ac602045e26c5f7a1f08", - "52a7267747964896a2d922480be811941ef575afbf6b2235d758835eae527feb", - "cf26f76b929dd40d079b071592e7f2d3e23d9c51dff0eec3134b7b50bba633b3", - "74b44245093ff2942bda5dc2f3e3410f64177e499e45e31be94ee83bdac8afc8", - "24a81862afbf29b496c612d336fab4d3781cc6bbddcfa81701334d431d23ec6b", - "3f09641cb6bbc6f5dc0af1019e476a6d228f0494c1eeea8ee6deab24dfe8719f", - "c7c09a819bd938a4fbfbffe2a50111466968e836e63a160084107ebb24c9940e", - "55e84bcfa7042335e2e9f2c6b00587f48ddb5f8326dcf7db6e168c6a8c074edf", - "61c8ae74b2288ed5982029f97deb6de1fc071c8bbe1f5b91e00edab4f8a70d95", - "29e55e45f118ceec56ef31da0eee54ca902e35450b11faff7437fb354200513d", - "91c4a1877dbbace2240023ee890a08743c0bdd890df07f26b30abc34b2a69a10", - "9569e6f6b73a1813c7795f20bf82d977bfefa294345badb6019deb9954b2a973", - "214289de2b4e4070b0980d043782eafd933ac29c6bdf7d0ac144d7b2854fd756", - "87c0fbc96af7545f1de591887a4dd6d003194b68e18990580e18829d8c9a3220", - "2cf6bf0d82a834746e6710af7e8ca09cf80be99f1328c518680604d99bbc37dd", - "86144067238d0024375c05d9cba5046f5565591b2a798260c5d37f992ef4224c", - "2f9edf79762684508813ba40bed5a47faf010955b594f5a6d0da05d71d6436d2", - "3cbbe77464d9734f9e3aac3da2827bf39b459c6c05f202860c2d300c3eb268af", - "852db2f4eaf01a90b917a2a6c48262fc7ced1889ced491aa7c48b2317d49f44f", - "7559611842045145d83e18aa6cab12d85f6b0623bbd783e751f199eef8b2fa5b", - "fd1bac7aabf66204249e6b73dee5bd9df28fa86b6bfc17924b5db3892f4448d4", - "56ec459d82cf5823e29ef9f756a25c8c0e7ff0d1b630860e29ea8d4f33dc6e23", - "4e43037723e7f7a7750c2137b9b5686da4a70d7077bcddd9618593f2ebee14f1", - "620e4fe9ed29400b103b9337fcbb2066c48ad3c98f91b6a0076c1bf2e64d2190", - "6882ccc66af95e6ae06d9f674537e359797b20bf29c832f83fe2c1693cd23d98", - "24ac32426902f2080a9e2733b1188e2ba1c4ab9539f15bbdbd20d5ac7d69a2bf", - "f09f154d3077b604d9365fcfac30c7620214b042d27d5a13134505b566f6a733", - "0c8e3f081ea6ed99ef3d4b68e9c85aa62846c740e9f60901d8141c2278204740", - "99306f5c96075282726f9fd877cc79e61c4cae93173965557465066fd50eb9eb", - "3b02db431d1c44cfa3eddaad2f0793cbb2996c6bd5e7046d5c52987d68bd9ba0", - "e20f485692d3ed074308f657def7646dbd3f7d14668aa332856e257c5b320fef", - "3d05693941196690c6e5800d1be01a005b60e45d4d122d5c9733603d3c2542fb", - "19e5b0fadf76968bb76151aca7ab0fe12eb27c37c2be51af4c9c0de40ba594f9", - "0fcf7677a6e58c98e65a26945badad1054cc8e782578b1c4d9da506b0f74aa58", - "f01decf2ec7e28d538e4724df1c0186a1b654d7c4fbbccd9dbb809000aa4fdab", - "81280910497101df09f31e56f815ebb64ba4192ec6feb318dbbda954cf14fca5", - "0605c26c924248f1d60d08918bc68b09c428a6b825cf46472b1d5dbfdaaba4d6", - "2ec770c2421dfc9a1e15a3b98c6371bd431d27abdeca329203d5f0376445ad2c", - "ca781d3f72a73e33fbdd1ba54465e8289b6a8952fb56021d5a492f1025e30776", - "f494bcb7c2e9e3a60dbc9790febe8efb470538f83eb6f6ee353830c2885dc943", - "99053dfe2b3e4177ec5d0907ec8a8950096d80c20c41c3b8d8fecd5d2c1d768b", - "2fea90747a77167c40dadc92637293476968ce003a6e486153f057c8b9042590", - "4e356175614a2fdc3eecad49b4adf40d4792a2766a5a72225b5287013544fe0b", - "1a4d35659f5136efab44d4aa66223748e9bc9c078732a0af177e30d60630c2e7", - "6c7ca4dd31f4d2741e11d17c94c2d779a13336ce21df7026736873a216806e78", - "be4e7da85fbc2bec71f94c35f9075e0182ce38f6d70323777e073339496a2ee5", - "8419fbe98cd7dae37e89b14583fcbce54324c50f347e8e736d2d1beccbf2a855", - "ba8db1361c0a215a73a89f616f4bc0f904c807eb003e268abc3b7039917b3277", - "1c98d451bc1fe54834692de37fcc3a07c413f294b1989bf17b7d37403dc87543", - "e7aba4919eaa3cd1b15bd49fa83a471aa40ee374b67194d7af064dcde2396930", - "bfc249231a82c6997cbc905b4b39353d7ad009b75737307f4048b5f3470a0f94", - "f74c03248131ebea6497402b909a87604ba00ff7ee5b8a948e2a9b72b5ee9268", - "45677c2448cd45671f3f0ec3d0fd71b7ab08be350871fb230bcd2c06481248ad", - "8783966c2528650eb059962e16325a4a759d11efa07470224a27e3f82b7535d1", - "71e185d1493b3f56240ad22b57f05983d4b61d41294794df2f149d8c2b3c2f4c", - "495e12e120d91e99084a25f4b41acc0533527cf3c705341f142898e14c2852d8", - "3360e6af303748f62512facafa63ae67928b3fd9f891beb28ea98a78fd384fe5", - "f5002507e53bf31b8248d1d85daf96a8c6eb4178127a8f0123891d0ba326e266", - "611a4a674bbdf157e988236e7e010ce8b5f49e11f87bfa04087f9e2df105356e", - "e5bd5fd566d7f2f645b6f0f26a4eec51ffeea1afa0946b2bab6a89a5f23aee87", - "279927bd2112b5c03a7c8488bb28bb76e21bbcd5e6c1c720ee06e7256e1ef6b4", - "ba9c642d918e272a78ffde4fb63764b78e8b34e1ef5c1e528a0579a44299d5ec", - "5dc64938977ec520a3f47b87bb5f4d3fe02358272787bba0f070cf8626b493ea", - "eff6c95132ae20fd60bd32393d9bd8c859280388382d0c2dc8768119923c62eb", - "b8ff1b838e8bd6b855cd0bfaff899352c3c592c80a1c2bf4bcadf06e7053b074", - "45dc89b30c8b71b5a648a229d033facf6c9cbeaa4bf9cc81ee574545f8c17dd6", - "758ddaae0eb88d681cb779bcf497589a734bd0d880f2be60b33823ee22409b5e", - "4a421eff3f4aa7cdfd2f9009b8b51e31dfcedd3f69955d97467b401d1f4541a3", - "9e55b4a029036c2f04c4f7dcb24cb15cc719b133c6bd24aca1697b1f9843579f", - "4cdfaa8937140273344982a15451f707373dbc2bcf7c20339687e529d20d4608", - "7eeaaada2c4929a0a2a29cdf0de271ba1d2fbc72de8a08cab6a534d80931c1e9", - "9b3d59648f6d4d780155eca991deadcd9fecb00638fc885698fcdc00d8867b4d", - "e52d86fd2c7a3e3d71327e6b1e9fd3eb4ec147f251834d465c0d45f08de4d082", - "407bcc8f476064c0bebe826fc27a8c14f88d9bd812d13e08964d01ff8953d964", - "267ec38cbbb8e8b86dbe7ce719094d5bbbd96f0f582f47056fbf6a2e4c975188", - "eb5fdd38d7ca2058f0433ebd7a478bc574f8d171d55702023ef78e58e8b029ee", - "48f06afbcc61358a17852f0e34ce860b6112ff3daa28b614bce8fe2bdee04ed6", - "83142a31cffcbe4eb183d6a353258783d2e126b0bf6cfb8356f5a38e28fca721", - "7928b5988c57f928074914a31fa5010358f0990dba411a9d401ab04049e29a5d", - "bf96db6a7d1c3824a5d0cf68720dd784cab69521026875c1c93c2f3b01929b0e", - "3957ecc788efd5f8d9d51db2427101c320c4f94dd3ae52058f0311ce5aa1b888", - "d7f6254a250570a5400c2467f56f45ea73957af48c4f776359545229d0b7d1c0", - "738a7aad775f6684d6f2a797387b233e93cc973a2f2782db738908ace0fdf476", - "39e2a70b9a530ae4017e6ad5c41b1b0553bc695dc54624114959578da2e65339", - "35ca9c34448fd5ef66bda3196a12da9da40c0b83a5c063a7a4be0580537e17b1", - "6be56cac98c1d31103bf486fc15d3cd65fd78d94ed566b096de5f4e4d54a2a1f", - "350eaa229e8301066680ab842ac34fdd5ee7a2f25b3b334f9a3b105a515eb99f", - "31b537f3a94c5079e35177e344d4aa0b44ac548a5f2187c93755dee31c301300", - "2304513daba0087a73d9fe59d554b779cb04e4e343b24e4b3dc6e8e626acbad4", - "8d13bd9cd66bff965bbf7a1065ffaeba793cb9e64f7cbfdeb471daa02b7e4d74", - "436bd0f38236366b85eabbc6bc9a0cc32e7106a8aea893dc038b885fa75654e1", - "5d99f7e7ffa7fe3cbed6a725127e672acfb67445ade3a6c0f680cde121d8ec4f", - "2a65f11b6e000d5f0f1f434c57f8cc75f928747dd3aed2c6a8bbe4554c1375b4", - "3d90394809dd8e303e81532123d53b23381ce86b7cdee05e1ec707f38b96649b", - "cbf34faf98da878f55f2a638c8fc480dff55de6dc385139e7826b263939ac297", - "e9f943a562b7f378d08cbd1a0f82c254ab513a51307d2debdbdaf00fdade51e0", - "723ea47933afe979d01ed796b77a11e272c950737579476afd7a5926a2c9654a", - "bad527ab0dc304d93846c4ca180f99720c379c7a280c1a9710a39be46ddead70", - "9baad7988c49f91d73ba42b863a9f378f40c3b5eabe5aa8993fa12bef9c29ccb", - "eb7d8479f92044358f6f6bc8a03f38c5ee2ebed3a73276e0cb5da7f35e5ae1e1", - "8d10eb4e40bdd5cf7b0dbf5a62b3250f99b8c5d95f31de4c6b804a21133608b7", - "1b79a3c53e232afcc3a11fe25ff080abe3143b93dfb1a6b592d95885497ccb81", - "eb42b76014f0ed7519bd1f9d2fd63392c9172527ae45a0bee872800758bd03db", - "0337d5af0ee9dc2fb18d56905f895fc1487db6b83563df9c4e7981e2643a2ddb", - "0ef6b6732be69de7865890e9daa413da82dcd9720dd67448e388481eb9dfa512", - "f4472308ffc28d19ed93f8764f6371ca172d20c85880e487ee859bc283384db2", - "d3ffb3222d31104ce7ea1b7fd062305b6087290365173b7494456d25c9ae739f", - "62588f4571512f7ff345fc3e28bc07312a29658ff2ed5e863202c3e0cd318635", - "674add1beeb43381ee0d76b59786ed8cc0f1e1ba29f3cf88e5868271f177fe05", - "f331b7c8845dc1ffda6425ca870aaa206248e7103998f72b5559096228597213", - "d1202b36f9596761e0ee8a17da11234edb8ed8d5044548bc1eba63fdcb54d7d6", - "6e4e1ed7db4350410ae78046ef4ee98f9d5f9f00522a7e55f3bc913983c5d770", - "99b933c9020823cce899e265ee3858f7ca1d1042863ec2f5ea9baeb8b868ae13", - "beb1506510f5040e88b4508268c63bd8040889a6b9e0a2ec47f97dec7d914558", - "e2a392c90c1f41718c734a3ace8ee3ceb100e76357264e1ef90da876b9d56c88", - "b7885ab057546a772e862f49b1e3b894f301ac35af72b393dd7d8ac029a7de77", - "70c954b0926e06f2d04fe38cf8841ab7a53eaa24d814a4a9fc286db7d16035c2", - "75157913b5982b184b5767da56bc14c825c343fa0fd06dafd04bdd0f3d4c8fad", - "2962f858235fb882a714fdd6ec88f01931042d3b7eaf7222c72d8acd6e701ca9", - "e1dae340d2bcb4a6bc74803004c6bb5d26968f035724d97e3800add64771f801", - "ea8ac9e2f1de0d42c5a09bb95654091a463ad0f22cda44010b7f5d7b6e9f568f", - "6a0b320d83156a8ff9c2aa1c3f7ac811e92929230779df70ae1c0bbc5d8cf9d9", - "1e41d85a8bdf80c9d065bf8389e12d7977214b81684c1c24843bac1dc830dcef", - "45ae5d13a2ed9463fc751fe7e38f95ec4fbc71cae6849b886965fb82189fd2a9", - "ce148094171eff82dae400f735c241d29b61bd560498d41a43852ffde4ff5999", - "dc6b97540c76d9142045969d1cb13a2626b8d53e1966935db28e351af4866bb2", - "024ce1b687964e45c63ca10c86df65d07391fa8a7bc78ec5b0f0a1c24abbe39d", - "5720086f980ab46929c8ebeccd80e80dc49f594ebafaaabbba18c316d1b65f9b", - "ed583a823282dc52704b8fc0f3f088687c2f057bbf6edabc647c13a95f07ced9", - "fa2ae051d2d60537c8ddf6081cf4763b3541543ffc9ff1334e68e47d93cdf617", - "aa8c3f33afd3b28ac673f44d7f140766081c852627b33126d57f5d9c50af3ea6", - "95b361937b8f726d0e14caa5ab4446f9bd07aa62f0a85f489ed19a2b91a74415", - "e63636b007ec489dea939a53c1ff097bc611ab2ce7b9100f1abaa73d349785ae", - "6ed13973c78fb8d3c16c917b1eda91a055a7f8f95e2569f432a639e5e1c52896", - "39bc603191d351229d692cb240ce853c57ab9c82d24a50c020d8f3475ce898df", - "275e61062c2c80853194655a83fa8a5f6f898bed362812a26a9c4a00c178a28e", - "0c162579ad861723043dafac5b179c0e0b68c83f758b7c0daaa377cd52f32158", - "994d3b6280e1b6cfbdf2c6064b62c2aa29f16d0034ec4d080f2fb83bd5bc66f4", - "a8cfb66324704bfcfc15b2825491a035b87bb07563bffdd2bc925904484edf13", - "bbd55c6da4301844f9d1d2377eea47c2c21631dd67275758abf0f7e4b9696d24", - "1ef55428425b3181aeb6260f6e4e1c453790c826c78ff6b2f594c988baf83166", - "b7dc7a4a49b55f22db64bd4acb91e0da638b1d817f9a27aacd6f47ace45ffb06", - "bdfb635283d85f0a7e497a9ceacfc60d5bce99758a2a8f827f935cfacfba056f", - "463b76c175e0801d40474739c80d55be246c0e94ccaebb165ce27c1baaf06022", - "dda9b0fbfebec42ff61f37cb78949fe974d2016c129b61abc7550a74e05ca823", - "9ef3080a1357b677bf3b4b1d242aca58b387a3b72844d7e4827c7df54bc0785d", - "b6285139173eccd6449e843a549a9407a25917abffa1858769039624a08507cc", - "5bcda8422cb8a2ee550348ceaaeac575ceb7c5ff5da25d17d4b0110904f4be63", - "f4761ca082317e560c22e30dac6993ee3fafb74db3e64240442865d8561c1785", - "6f1fc92562f4b0208cb06f89b50e00dec317dad11da3c0d180ffd7f05e3b5866", - "308cbfa1f44d95249a49dbef9567a8a1a25c89d2c02919219493fb93941e44c0", - "f6cec96f0abfa149166638adc5b6f9629a3133eaeb5635f494515663e48b5d1e", - "8ce7c9ec2f3e3e561bb66ccb5fa1c61860d0c854cc541db8288f20ae32cd60ff", - "01e25d24ae071db4fe59486f2a9fd613bef2ad7699dba68f93d1ae58ebaa1f14", - "3372795d246a3904652f8e7851eb3ba298677c1f3d2467fc3587b664cd359c21", - "a5e45e76826908d32fb899b6eabcfbdab20fe223afefd1ad56bd3465c25969c8", - "037c71b4a3786cd4ca1f179c981d8bbd851a7a2a13670d501db54d21d1be7282", - "6ef3b372915f06b30f73a5491dcceecd0dc211d9f01d6582bd5551f98baa03d4", - "198edcddff03b2f7371507f1c36a58007eced2200aea2e6a6fc3864c19b64da0", - "781596d6c6895662db80276c09d6ff0113d0f9a5cc0f53c1752afd43a2e31690", - "01e6a18370f939411075cd4a07148d1050e86b323bfc308424c943089e388dfb", - "d030465f695ee94af2045cee2443b37691b6af21ccf8af1f2def08d895c31aa2", - "d96c800b1c18b0fd13c0ffb7642bcbed3d9e159a4c4e35964d48a7de697e4c16", - "f93be8f805913417ef1aa65237626a77c03eedcdfd35166940f428e6973b7827", - "3ff6a0378b3c67453b1e4ef71a04d089de2789a49c6d43dcffcf976feab14a63", - "2a25183dd93b4be84d87788782def188b024720ffbeb9ecb773e6f1a14fc2d84", - "c6f0298c1d45e437fd3d673a00e276c5282fbcfbfc33b158d154dfe0d9c69b87", - "04b299b3a04205891b8b859804177ae276be65401688404c56fba756273eabea", - "1b6250338eac353834373d7580708b3dae24c7e540c2f70ee66ab8805c9e63f5", - "600b02f3b31fa21809141e0ac8870a1d098fde034cf086f67db52341190f213b", - "6c62d662e1204f212e730f738cc1780e5733b6a68ccd71a0c0070131c1febbf3", - "7495aa23fdf858b5353673a45238cc2812dbdd97e6003cef0902faa4b075ae30", - "d742ff8dfd5c4281cee5930118f2683d66766488ff61223b1c38d1d0f618f84c", - "6818b32c67dc580bcdb56309e7f314fde0a791453adfc87cf8991495f490d7c8", - "f7c8a8296dc0da46572fe96eff3b68a37ef1a283daf0dd40bcc3e94a0f795c9e", - "9804ec986e23878e96308b2bbb9bfe7ea6c8235b0dfc3eb9a16c8f12b99c0762", - "7540c0338943cdd00dda8ad5de39bea65515407ac32e717c77a6efe840afaa16", - "27b4237030fc017387c546441da35623d8b40bf13af60b5c10cba57d07f1e25c", - "674d0dfd09b87a240d03d5f8f2a280cb9b9ec7de6b084526cc51e06c43a2eb9a", - "7f0aba0cc70d34e68c661aaa05090dee3e77ced437f4cddd419369a5f74c6b59", - "4ff05d933bd6f332b4abac626bac030f9b9f7abb3d651737f8906616a0d2e19c", - "814117781f38e8ba94f0eed184f5ade21fda5428ce6725c63eaf110f6d15a637", - "e3febc847e067732563421f6687f72ad11df45320b069bc77ab5bb285c760853", - "1667d2cb1ac619fe179faea4b9f8a52068067e48f710c8efb873d36f876eeb9c", - "22f1a3ff95d17f7488bd3d1a6f0b7745c5e3fa34619a11d1e6da019cdfabf072", - "d21122c6ee4385273211fa9be651768baa6f503d10507bfd119fc6bdb7d59aa6", - "6966b2d6e32e79f1000cb4b0f057f2f6ba7ba10e2625801872e57aa10fd8821a", - "eacfee96d2543adc844034c789a6f02c777bfcc715c6a506222b73e65b89cd88", - "bd74e7db1b175c3afd2d32342277b12b62604e721329cccdfc204e729f1cda96", - "9620d56f10005126b6ea5115428b6e2913b696e4685d579f2c02bc598e89b19f", - "f85f352dca809852fed4b4e18853203679d1ca7fb5b6984896f8a2d2d4f8014b", - "671c96ac1f587856e1864a720a85a333a463bf95b19bfeab2b11fa8d7d4e7e17", - "9b7ad4f6bc332bb77455712f114e352656a359638db06268ff5ff7afc28235aa", - "2256a7ec5fd03756b5a6c93b92b0557845b4e99a647bd04065602b112bc9ec02", - "6c2920b390a8e1aadfcb1c1ce2316f65df47b3b556e9ca5ddc2cb0fadcfb48f3", - "aa6df06422dbcc8e4b8bc0f1f2b3309ac3a0d0bfb2d4a8439a3df358f65de7ec", - "e140e752e5fb6ec5a0393dc82734f99eb1e59ca5c77985a10ea5bb946c022338", - "87440b2ff9d995785f3c7c90ea93f09cc11e92b5edc79ae4cacb9ad48580a34b", - "8c320b2ec6ae52443754d2564dce88d502105628cdbbfbf854e7d2099be069c0", - "94527717d2f5db35ba87505adc7f3f9077df837802c5f2e7cb5030c52e61ffe7", - "9b192ee708cbfb4c1f6b1c46046e52d14943d83dc27cc17ed6cb18df7c4ac415", - "0f3a1c28fcee9b4164f2fa304ab43055d0ce35895262579d9f7515a421222734", - "9f4846875fe2ec3f04fc91641369e5985daef63b6511495b4e90a2874e40df70", - "a6d31893e726f988ffb0a236722a76c883e9328fe907cdcfb366d1fcb477f332", - "b1b42046dae674c729a559fd4b29c86fc5645b39474ce5d5ece759bf057b3acd", - "bcffd5c156e2a3f607c5d417d4044a5a9aa836efb7cec8ff1dcca6e606872aab", - "fe6442655d05e99ec8f92c2ec26f9494ca2e34018f82e4f02ebb5f1021ccb56c", - "315d5a757497c1a81885813bde799bbca5128d9ee8a4133267bc169fdba1b5b4", - "d0c80cb16d06df408b8307ff647623d6fdbc2779f10c9b1c9e5c2f1899cf9497", - "6d8d5436838d27354bcebfa3a45ce8c9f7a570338244c7127d7973c18e478e16", - "d046f2862303240578736b8bc7a2e00312dfd2c98c19393e59614c307d22f205", - "bcc195af9295adf61ab8dbeeff14708faddc096bd845e697e48d8f99d10d4d64", - "27a0559dcc0c4f143a5f41ba195d13252e935be3564054623c30487a2f0a67f9", - "a1b6b56d7a7f63fe744d3ed22e058865f091a0aeb0e42867dd94cd857a18834e", - "a05ce1f9a628da09e09d289018ca2bbcc5a0a10c2f1913bd498ecc70a087cbf5", - "5dedcd8212f12cc03a1b5291a72c798323c74c4fc8cb4025db4ca91f29b7d3ed", - "9ccb852b835a07122f74f8443676e481da4f057a59070d2ae097716b407e7811", - "b07fd65e67f137c94eca6c48835e0a44705e7fad6bee25dfb6ca503739e45f71", - "15ecf4908015a0d9e17689b2fe44e876800ba33499d0629f7a24128805e0bb12", - "d45381861846b7980235071f2a09a344bf8735cad78ab4e1eae4e1ea0f26fb9b", - "0ef3cf7ca87740cab540a6ff82b0bc4eac52e4292480b0667da6e9b1d5516310", - "5e81eac67d3f1193405a27daf1b7f6c6d45298d1e8c0667976f3d62152f99ba9", - "d14be291ade04fee78a300ea8269d696b0eef01fdfd730299dcccc3321af1cb5", - "2ef4ef82fcfcded1de4fa4d95a6137ea5fcf2915676c3e4a05fde33a16f0f59a", - "fe7b9b1eece445629bc0237b6b8aa6543757c9941571f1268a2b3212860f0006", - "8faa5ef7f6a68f8e348276aaee53ebe4031b26a9e543be78e329d8c1af099a92", - "c701a8f9c329325e7cad3c69177203060e725d227da1b90c8e8c340ac1af9339", - "50544ed9edf13f456f051c471ef9b255e68db64db43d99ce4af9975b3a36d1f2", - "d869e8f5f158501ad94991aa80a85963df20c45981267a4af678ca9caa252f5a", - "f5c08e75254d418c3d3085ac8918fb222f1127f1803faf32693f62f36d7b2edf", - "2ac39131d0b20a1968b471917733ad77af8374be42fb5320149eaf766b3c15a4", - "cdbeec096c115a78c3fbe413a45d7ccd854889545baa3a7a7269aeb4dba0a4f9", - "58eabae21612efd8130575bed829a8eae54709232b78e8b74e745ef482a92e92", - "a0470695be60bcc1967edcdbb6f7943b169e2cf28e6d7cc36fdb746bb3bcaee2", - "a42562e268debc0c2eb38ef8bf2a7f01b01a2272b28f7c16b0ab3e31c468eaaa", - "c44fb3c7e5acf2dea3c87163e04acf0fe6e05576fbbf9c9566d911a9c4923839", - "2d30e80df348dd889870020f0ce2d66ec7c8488c7e56078d52de4454514eb55f", - "80d64ce74867d4f76f1ab2e6b2d06f6b917808e85e2b367640abb121f66a4d1b", - "cac07fe820f00e44642107cba8b20064339348e0d709f52b77cccc269911d48a", - "a3c88ddbb1c0ae53fbe46afe3b7d7468d26905b9f1780d84bca6a89ce8848c64", - "53c8782768795c7341650c7e57399b59fcb66320c873d37c19f4a14ab69fbc90", - "bddc799078ecf56ec5d1b87af9ac2ff79505d944e65b3430b1e7c5c3e51c51ce", - "afa642a45755427c2fd7a384619679c0ff88b943bb7d91540b0cc1a138682f96", - "54bf5bc0da2c8411e2ee69498d2ada56226c68b5fa131c71b347087c6e4c3dbe", - "4ff8a1ab223ad152ae4bb66174a6942add7538dd3283a04f73e563ed1a452e3f", - "74f56d4dfecb2f2dadf9f717522bd40b12884a0db922883e05f8fe7faedd33c1", - "56f03dd3f245edb561bc5b7167824cf342ce4136d1ceb61ac27a36cc2f3ff73c", - "e84bee6269ed72d2221e4fbe91ad8961e96234848f11ae7bde777631f708ac68", - "6c64888c1cad03532302037163fccb38c6a9ccbdfdef6c9fcb1a30b50812d3ad", - "eb27f29c727e624a80327ca2ceb26bace2e0711f8b583a56ba105dd8f2dd38f6", - "fd6b9a2fde9298c49fac2e52c0afcdac7b3b92dc7aa54c60639ecce42c5c3260", - "e704efc57a2a7f168f0f0682b579693f65b5fe1462234d2b1201810e38c870db", - "ecd623f0561d5a8f26090ae81664589009057bf1ac0f13281d8b09146ffa69c3", - "e8887f45a6ad542794f96797a8ba4fe494ae54c482f0fc2e95bbc55887cfd9e5", - "f55fe054d10e7c194a3f14a3b3ddcc52d151f4dc571c66042ecdddb50f9690ba", - "77c7e40416c182018e837e149ff970ee599b8260451f3b5866cd9c31f7ffa54e", - "c1a21804f929e78b8785bb82507a295c738c7e577bebf18019663084b3bf3ed6", - "41ffe1744650c95a5b0960435777c8aee1e97f886c6b8f24d529b1fce14b6bf8", - "1ee67064a348fe080e5f3d5bf2029aa0adf11c3fac6f6316ef216b0246528039", - "27915290f0fcca3876982ce7f865bcfefcb1a2db10ee19f57910a43d8dd2bb06", - "31836698d2fdda8ae8f2c80ce10f64d4829c6f65427316b3127898f0327850d3", - "be3bf6fb5bcb25dc287d4405bc45a31ee35c9a18ddc78424e381085bf36e9b14", - "5ee1671ef725e840272ee6aeee177f5b083133611c676f1a6ad24a59bbf63a0d", - "daccd8d0369a5b7d8570fb8e0890727a520518019390dcf21b6cd2401bb1cb1b", - "fd77a64257a441b3e9b7c9deb0d0fbc6005eabb3f9e7ad23ec750a0adab6289f", - "04330ef6dbe6e1c5f7421ff57afad24658f5bec2c51910c46e9d1f2663ad7047", - "2119093cd7fef599c045cc1dbdc6af2963fa15d3411d0318bdff3fe1f8b031ff", - "8304ba0e87aa748379a374ee8e72b0f9d095ebd784a4d63b544a33d6409e3fa1", - "001631acc08fbf42e8b9cdd0812c88e6024a63c312eab8129fa88e1d2c377258", - "45cb2134e84760f8f09f7cbef74af395d16e84c16fce072f07641413dac53829", - "a140c7cc04fdd29b0786b9de65d963a2b09f47872e18da156e04d107309c6e4c", - "d6c329c16cf5f650cd184041abb9b32646b068475e625b00b3bd8dddd789c03f", - "25378fc8e4a55f5fd64880b2ca5231247e7fd6ea32012db4f6c8adc1867bcb58", - "1be08da40b5f168cf28a0b291c2763bcf051c9c5bc436e7ddd352e4303486585", - "94ea24f7406467d8be39b1ff38676092d367a02bcaf40db49925cc548ab5f7e4", - "a101269578390158c0737e66be7d8695e9d389bf5643ebc9345c290b3f81bf0a", - "876adf2819b68daf08a4de7fd8c9fd3fce63901b1dff7fefada3a55da9abd844", - "778bbfad4782aad4ca03d03de84b54dc3bfaf05a8f4e092db62eff5a2054c9f9", - "b80df85a535a2653762252fd89000956c7b68a7ccfef8ecb1e038f9e8814b1ad", - "6621704989d7bd7cc0a129bfdfb658d356d2f8f25ca3e275e96f80b0866463f0", - "78cb5bd71aeb83bcccb362c3fa9d9f99e02c4b39a50c07957a7718ac964847a6", - "72eb3a33665c5e38dc81b988f9e59cd0cbcd93021b6c87ec9b3572bd1b5d3fd2", - "2baf675cbbce475d3452a2d8a868fcc96e78257fbfdaca61b86bc5ab19e9e13b", - "d40b315c30c06b002757ae7a24b4651b97af9ff54b5290926b24378eba875b9f", - "0132522f2968983f86a4ad8f502e0ef70cc4755f7021bf8eac9d5c409d534800", - "a81a00492c89f9dd88cb3f538cbc0eb572007fa9f68b438ed6daa569f826809a", - "f963512de5a01c230fee3d79128590e240652c6fd416397ae20ce21dbb5d1ba3", - "e1dfa2964a67a9734f382b0cd02996b37eac0b7a1dda002c5d6bda629e6ca5d5", - "72d636500590be1ac6ae3259934426c3ff6ff2ec65b30ba5f2879a535449b7f7", - "d7c02d00500112a92f6927ecf2fa2280dd36856dbe6ba5ea436f23d306979fba", - "79ed75717dd04c4392134e6a5452809132f3a90c98b9fa40f76bc9c820ee5f02", - "8bbf074e3233eadeaf0cf1097ccb071638987b5e7fb6e2a35820fc2ff7815051", - "d423f96928648799a2d3065b3bc4b511df476d84bfb0eeb6771357628c852ec2", - "bf119ad772e90e0126a1f26f7e1b9de3987664f06823d20aba6e6736ad223dac", - "c93b11348344276425335dd6475faabc8da941e1fe6d8e6b3673195fbb629391", - "67ba8028ab3b337376d42c302dd290a55b9b9e380de41fe53946366af042c005", - "45d7ce8099751e07f7e1c8d85e3ebd384b0965a5f5a884f622fa59ab19d8babc", - "4f429c7bd361732fb44d210c46f53fcb9a992d779d74c4a19767d11a3f66b8a5", - "ceefc7cf411d26aeaab3231c65cd280fb6e2c8d2bfa11244370499e54c9cec80", - "eec6f06537e1b70a6f2658ffa9270a1740f3d802f8aad7e592d52702b241bc5d", - "98ad0e4cb912e6b86183c649a2540f37ec9ee7e32c9a39e47de5a97c283ed82d", - "f7e886fd3e4d3d8a5a1ee8649b2bafb9091324e99f30bc082daf7041667680a5", - "a55f8f58cb04bf98f35de63061150e201427a457ff7f1d0433fd70429bfc9cc9", - "04ccd5d530f2c2c35dd9a4e6e2c29a32ead269c4b2bea91ebb0732b312d4b764", - "59a3b5465dbfb234f159a448ad439fc5f69147648d9b0be65427798f872bb064", - "34161ecb9f68b20e92598b735cb4d41e5958cf9be812e3e9efa05811fd39e77a", - "a4e0e10969540cf34a6b5a06186662ac8c42b03d1a6ed865f3bbbc33ac90364c", - "86da6f48ced3f46999ad406fca1e5c271e71d5ba953e193085aba5b3db1ccc30", - "13263adb71d95376c41baa81e12c07956a1076e04cce7901a999381e12900398", - "0b0ff2ba99eb149e48302695f37578b446ec99c47d3e1482744289fa48132ea7", - "919de2a98b88699d7329cf8b1759667a940f63fc2d9f0ff760bfddf8b52cc377", - "ae90d98c9569dfdd5452946efcaa69d28ab48a8a13668940b281a1e1761d4eb7", - "fe86f12dfd4feccb94efaeb2a2900043c34eef95289a550b2337587b2e9c26fc", - "8275e781b7de2d74191347af352abee16c52464431c9e6b06bd7ebeba604dca0", - "22b18c95e0bf5374fb3a38295f641dff127bf4503b500c52b5f240b35f7b3bed", - "7c0e7343ec00a20a2cca2d8201c24b47e68d65295b32a64078d8e58e86f935dd", - "99f584eecbf62b06dab4a61cfeca4e9beea66beecbc070ced1b0fa06e9e27e06", - "acc9db5728f5eb8090f8daa01134d1eadd0b8e6045f8793d76bf4df9144b6170", - "cd11a8c83513210af2b2c06dcd780e094cb59c08df7fdc65845f5820b3a523af", - "e504a9170bb173cbc40242bcc1fd83acda5fc6f6c9f9426aef39ee6329cdff8f", - "be898ce59d5c6f0c44513e38dc421e37f324bb3ebca5ed4e714f7072347ee5bd", - "c766756daade9e3bb67311b1e294367eaac712263e41f169e46f469198670c6b", - "e877caa2e08117fb57712dba6315c79da236b5e5bdc8ceffc1169389896925bf", - "5ad4d67e9f3eece08ec9c262cdc8446bbc7cf14e09a2b8855432e6271c1c985f", - "5662b5811bbafdd8d9ad1ab659e73e899517648077e17d9f4267eef68a21ac0a", - "627c7479a17fde6267517ab01d8eeb92d7d401e94c3ea69293c0e21096094af9", - "7a9271da7f850d500ec56f73885709d56a03caa30bc5daee57cabb5d33ec75f6", - "3eefe63fcb89b7ded6184b1d117d6be9e86d23c01bacfca97676e199ee70a24f", - "15c40b66d8558e2b15d8bc5a0704c49242e0875a057b432d1b28ff86ec67f2d8", - "b4bbec20585a15113bd432f90e5d9492a68bbb15d8ffd6940d9e40b4b234ac74", - "ad5ecca15740a01671d42f13e291acd911d1deb1d42f4410517aff4d15f0399f", - "67a45dc332ed7172b7807c429b797f24a33e9fcfc045309eee201483659078d1", - "2550db3297d29c044ef3e969ee1561463f96c2ca3e4c188d3f8785dd93d3446f", - "ca40af1f8d4ac89d7c514d0ebf431a016c2c84294a8142d8e8c37627834ad2ef", - "90378fbbb714bf13c9ffb74b0ef3e0422bf89be9c8a6c8182339e709f12d8dfc", - "d5443a868f90582da3118c7190be97fa40d4cd8bda51bd994ab119c92d6ec338", - "95416dac328a476365069accc63d4d6952915c93158eb0997cd0304fd448f4f8", - "e82922b51c5c5338c55df7588ec3892d69e43957deb4628919be24568fa5a3fa", - "47d3e684a54bab083122371a1e9228c94fb153d14e310445c741266da41b5122", - "d3475000cc125863a9cf580064014e8a2bdd9d83231b11432efca57fdf72c9c7", - "1a744f4b385e36ae854c997825e1ae209c2d8805f2f9a3ce600d421a3cc33051", - "25995c7ee296905200a8e249b73079f85aacb221015903ae702c83865148834d", - "3e3de6e539425d46bb8a45d291ae4110438e0247ee1fa68e7079efc4659add82", - "fe335fd30ce5f7538641dcfbb5c119f43c62996aae492d2aea3cd0144eadfca9", - "a47e6d390a6405c5ed12fc3aea6d7cae6ad519c4359716cb3f2484aca5a5d45c", - "fd985210e8441f335776069dc501c675ffcf2869bf212b4a52f06ce234ec9618", - "4e829a1abf66cd599b91230d7d3970e7b3a2cbc6f5e7b2fa602a8bb0db590c83", - "60364dc39bf3b05e1835c7a6c7da5f965fee9cdf6e8dc806b5c93c8e146894f4", - "b354843d66fb576bbce7283adc84a099ed1c6ed5b13020278102a07795601b09", - "ed99537be8ea08ca0ba7fff5aae40a9925c3833d588661ed563d4904c11df388", - "e12de936450892ecd4477fced46453e3a587248ae1851834f1f20aa502e90963", - "cc8debcc6a574e8ce32db908cd6f0f51e743102734fe7670e28841dbef66f9bb", - "2ebbf452f5a95a523a198df692477589611486e2c23a2e6985fa4519429989df", - "a09828ac31a8627e5bed3dabf799eb4b5f67ab97237ba083afe94a8ced0fbe70", - "459c616afce69b3ef30fd75eeca6cc1a2591a462c8c1a6402475109fa80a4bf7", - "dcccdce3f0691b304bfd07ba8cfe91deefb69bd1e79246b732cb5e926e8d71f6", - "f055c5e5a6550b5d657e3ba30e1fa4ff4db093b2e55f56deb4fbc106aa36bb16", - "fbc524a73034b3ba5b68d02387981296c0265c2b073915e749d9935b2a0b7bc6", - "64bd4333e5507a99eccc88b3c3ce79d1f56bbfa07ed8867b42f639af2f2237ce", - "c49ab96b632d8e02f864635e7aa8c77c352b7764cfed168399c1425b5b937d1b", - "360d055ada599ac44839dae2e1670c805f920d56d04b07ae3b7f606ac7fe5f13", - "c2a3603c65ca27452e087f8afaa92ac718e9487fdf63eb4b80fc3208a9ba991e", - "20921d1068cc26c77cafda070fe0ef66f59698a43f500310495d06993c18ae7f", - "9f1974841f0b89a10a5b0d79af35499e6af6d6da32be528e4da6c4292470c475", - "a4a3dc98faf189ffea913f15a9201de4f1922385681a64aa945c1e4c0948970c", - "160101f26055d95fed083d34bf06b77dd3f9841028d7eb97c0548f78120f4697", - "766849d10c3af484b318398539d6b3f6c37766527fd01c58aa8ec4bb2bcde6ba", - "d721fa921b279066e93867cbe8a4a48f45942483f57c5be2339c980ab6692ae4", - "0b831a3bce9f8dafcfb51ddefd73e415257c7d93ed0cd1cec856fca8c2421cd3", - "2ac191d176af187f51c6181709a3b66480b364c699718ebcd5a6af06e3d90668", - "f08d62f3d54f19abf2cf75dacec2abe459bf7537b55d832b8499f3b3ba4c3b7f", - "4c1db53f8c9e1b0e3fe26d6efd4395830a50a2577505e6e336695f79cafa303a", - "98884642efe4001ba9f9aefde05901306a453383d8ba7f9c6ad21faa779c2612", - "9534669b7a4d5097c1a561787603e4eef08dba5deed52f7270ac19eacb1b8fff", - "105001c87ad3c3e696f8ca5b2405275e0f203810450a07ca87fe4091aec39986", - "3b30cf8105136544151df47f29ee219612eed6ac797a8018ec1224f0771aa6d7", - "f1af26f182d6dac80d76b44bdaf9791fba44bee060625f48349e0d1c591accbe", - "d448d1151f48e65f0700e88b275a1ab3b01d45a6e11ec5fe26526427cb26008e", - "cf581f5223771953719c4c2e63645d5153f900afdd1b95666bb6e09e1b54d494", - "ff2dfe4f55ac7aa9b95541867fe3c1457871220fe36236954807135663381a95", - "43645baac1bdd6b3687982d54f6dafbdef86558c92d91b562ddf9738794b25b7", - "6569726521a808a79f74b57f7d789c4d13f1fabaf0b628e26312aaa8e4260008", - "71ef08f8c4d285a386773c45d31af0106e27f8d69dcb61cdbd3805878699e301", - "2e4c3df58c60478168a29b770205d590dad087c8c2799154b57c99383bb7ee71", - "247e4a0919dd1bcd753f8fa8ceadf2eb31c0771138f36364da5ebea0a3db4e4f", - "31d6580f4e230f7193d3d1df55010aa14a0301702671e2ae21b280572af4d771", - "38f9ae86ca658c590c7faa8d070be0b521a319743f03786b9d5e4d4bf5561762", - "143d50c57ee9a6953f03bf33712aba2e3083525059f4d34bb5df64d7c7e7f9c1", - "f8a78dd9fec87b7140d43a4a555ca8b54d7407ac740a7668f6751929102b67e7", - "f543a3bb89658a1d5931fdbcc29c49cc1ab396b74ddb416f2f9da2c02bcbdfdd", - "e5ff6ae6058c2ae4822278365315957ffec8103107fb714cb2b6f88a0af017e2", - "771bf82f724125f067e7211ac3f82ee4c5bc918f756ed0bf5c13859cc00e5854", - "72908be98dac6b2bedbaf7c5ce6acb00e041aeebef7e20e13205874910c71a50", - "8287b534802b803b2cdc51f1cbe9677ee4604b18806d326218a497f21f05b8d7", - "0c71364f19b6737066dac5af8c8e8161967355f6a6b2c3c614a89b44a2a5ffa8", - "76d039aac094bbe4db903d21b3d3907685983d9b3a69d89b5203d240b081c773", - "7052b892e2f0e98f3ef603674aaf521ad3d1cf6468d7f0479dca2a7b1046754a", - "37a7d05c82101e06fcdca0cdc13ee2b0d8940852112821bad5706765e9064db9", - "2a41bbba1cec56a878d998e3ea504dd719085828602fa1d8845f61264ec38265", - "24869a3a773c550569b0d41243968b60d321f0b47791cd5e226d325db07260f6", - "f4ce76432d2cc3f7c4ddb5d43b70614e0a76fb23cac87933e0c34c507c36150a", - "29999986cab801fed235ba36895a9b6cfb4ab3fee769c7748ef2c84fa8436941", - "3b5faa4276dd72236844a1a081b9025825a11c1686348165f8ed5fb244538695", - "77b1222cce2475430b8e829b434be2e1eb1d77fd1a63c3b5bc8a3f57ef58aea5", - "a8a5b9be50bea77cef646751f22a46a1539208afa3b325ebb6ddcae3b5942eac", - "396f60c2ebbf77f7bf91b844c5257c4e185d05bcc8ced80f9541b6afa360375e", - "603f0211a51108aa3963810547020dccce844ba3d2ff5d257fd55e04655159c3", - "938923ae46b80d86ae22a5f967ed53b3dc81017d60046296423afa0e7bf52a46", - "7a73525d11ad9a621c13955bab829d2c25cd5b3c31d461c44f7c7a15e7eea009", - "ae53a463ad466dc7c8f8ccaccd8299c83c1e07fd8c6043f8a11bc6bb515f3653", - "6ee7615461d770b2a0535e02145eccdd09baffa781431622ebe4c5ad4b9d8db2", - "b85763b3a13959e377d3c796ea74ca1713d8c410a6aa477f4b231e1aedf4f1af", - "6d24d1634b626d724c5bd8256c9f509e8d0dbd9e2f34bb43291fcb16e981f112", - "d9bc8623493d6b16c700b4827c39a9629871072e468f84fd4799b1f82676b3ac", - "5fbcaf05a02be891826ccf1efcb1c7139f286f0cbcf41ced0a2b79915fc03f22", - "b8a35b457e0530260cf509d833f49814c9550c19b92d17a6c2d0d23500846b74", - "2fce93482e8f004c4465e579b233da0f46f1ff8d907db9d293f313422712973e", - "44324cfa43ad47a88738028aa45764f6aaabfeb4c4deef3ef3347f2402cf50a7", - "d8dd2d304da32231c1ff264e67a82535b7c52c9c5652acf0935abcbf60bd3690", - "65758578bdedf9146350e0b44fe49d68677965d07d7206b6c269a9fc979b9128", - "b17c20c23ca6c371e1c0867702100df1e879e2641d3e15eac5d8b84c0e091ffc", - "eede8e5bf8be0557796d75fd207c635e3169d019743bd30e5d4a10885782e0c9", - "ab0b4d1ef59091d7fc9c40aa6fdeb59daf3d821f418f526bb1bef671bdb2abe3", - "5b1ee9d50e99a8f2c288131d19ee20e4cad9f6712ea14ae8c38cc4e828c302f0", - "b74280c5445e37b7d0039251d1a8aa2a86fbe02bc55f5f3ada67d224c4e2d3ef", - "98c3283935b00c73898f44954dc9e8531dbd42598568d9f8a2d6f6491fe96ccb", - "e87c00a63b4bfda3bc09fcedda1bf4cfd5a4f3419ccbf23ac66f602c65bde63e", - "e5a561663dad878bf84edadfc0338fddc4bbc447d8a39881d55303088c4f4c36", - "f85b0509c3db6b083a7cd99ad3c911d638e430cd7dfe206a408f2c744236f8f4", - "9d0c4ba8187e31b5fc1fe4bcb8df5bfa604888f631ba71932498a60e4bff5e30", - "13d0d96340944cb49496e5243a177c59cd3cb89b592ab324e516514ce13cb34b", - "5d2d2e003630b35e6b3416e86ae66f0361894ff20f35690292a36b3d0e9c6281", - "5f9c50b9f58258943a31aab3bee600f27304171b7aee9a97acf0fa7e01b3347f", - "a4ed78690e3622a82949dc86588cbb8f83ed2928f435efbad03a5519fc3cd138", - "ab7772ab620271686083fa43b30e47ae56ae7d3c1e26893da0cb0be98db631ff", - "6bf8f60064f541ca1e549f00c6106efb3753ef0a69213b03cbeaa9af2f6e2bf5", - "1a70930a646b2a9533a70b70e20f36ff7c30ca576820162eccad4f0f49338450", - "36eb6fe4bad72fef383b0237d949d12c335bb0f9f808ded6a9c8205754f8920a", - "d70a2942ff8ba0a594cf54f5606a01424f05114afc8a3ed19fcc49621359cdbe", - "10a7bdf8f4802c154bce615b630fd49d0dc5fec6a0aa86ba385436f06715e600", - "51490fc4c0f5d6eae33d3438290cb1017279487c7f77c31c2eefa50a7b9520a9", - "3b6d18f623cbab369462a2104e901ea1fe44a4e98ff2fb372c01f5898ae4f5d5", - "1e791184af83574139cffed58ac7b7d30e8b14260004d018cb3975895bdc32bd", - "ed25bada3a26e5abbc1a11a71dc73bbeba56f0281b8c9b9da4533cd345e01d6e", - "34ebfbd80f56b719114fbb81a3ae4e709b6d8a6a9058cd7fe5e3a44877e514ea", - "9fc4a5b10a083cb1e276a21da0532d223cb4ab40d62aad7d6ffc46afaf5160f0", - "011d3bdcf3fe38eb5980a2c0f97f221bc206cfd9837b632a87084c12bd013ef7", - "1cfe30318ecf7d0c04d39013f5d2996665b0f11a8467c770863af40fa211935a", - "21ba28e5d9d64f5f10115f05a6983f1eafed80ce8bb16ac0fea02acf0493e434", - "e6e5f8f38059739b290b271b0f7d3b6b280b24e3f881c07bd2bb8c6a5c66fa7d", - "3c63ad6dd40b8b2f25e5564caea0d7ab5d594712b7567bcb914dd4894fe1a26c", - "e0298839a6c79b104eb3aadb21823c97776da744f213158704ee6eb14d78285a", - "c2f27142f321b868e9196e188f5a9201a06cc291eb15b9b422d905b27420ef45", - "25a2610848435acfb46fe01b151f53fc11edd67da71cbab3e7179899b405f542", - "2ad784d6b2f187e57053f7b4097379b2a59947f08277eb890c0d7bea686f8f7a", - "852c07c0dcb4b494d39d2c1349411c54f2d30bad60aefba2688e31a8a70a6f92", - "56d879074f33a23eac0a7ae4aa779755cd1508c4b5fc65bd8906ec53e8bf18ac", - "ef39a0fcedf5047a7254a017c57e351905258d1931f11a20f45c79053bb29ca4", - "58323b3514d2ccc88585570bd49a0a9d3be6880d151d92ef6cfaa966cd8911fb", - "34b84c8e17d366a48c43ee62a6484832f0d267394afff0f512798b7fa5c87984", - "abc5b1c00963fe9769b4dff53bc915f7b2b2c570f8502b29323ced0fbc008bca", - "361c06846ea4f111c87632aba113b8139002c7bc02b64da0876cd105b4bf70c1", - "d27e89e0a23049ad70edadef855f6e52e761f63f234c83d333dd3cd80dc06452", - "5d24fbf83fc373f70c93cbff9035986f2d6060763e826f00c4d9158c4a20120c", - "cac0993adbf722abe7d47904f9c62e73c642b6244f6e8fd97fef51823c72e364", - "652c2f5b9ad7c1d9082b88c2f2c67172e4c0270aa83b660616f2340556691c2b", - "1e256388506119b25b990b0a13558b64c4cd5f4b6bc3a82502114cb8a1a9260b", - "4db644f67deb58e722045d052fb7d9f0c54fa1d6496c3158585e0439d49858ec", - "ad975b7b8b7816fb5a76c17daba27fa0344052cb3ad0da9809a652756c3533bb", - "778344605d5caa7677bfafa6a3db926567362adcfb85f33dd366d88b0a44be1f", - "de2cdfbf19afdd9f2c2fca37323dd3c21d7b5dfcdc5a9912a65b2c51bf840af6", - "66df9e786fb255211d76c9dcc9acbf942b26d7b5c36fd52da1d4f5d4b9b863b8", - "79f9adc8fc46b910bdf75844c326e7f61325340cbc1b38047b6303038ad487e4", - "85d0e6ae16c45e5f4b1b37b3937f37650752ae43df7e79293b357932a17b17b7", - "a83dfacb780e91ad5d054668662129825755fe0c397396aff2a851d9f654c9bd", - "76d640c1a24d8006150e5ab5c68ba80a14a23a474c67db33a39437b244f0fc37", - "a4ced18a71dfc4bdc3252f5bd924481a9354a129152f1de470a3579e941b9096", - "d5160cd6a7b9650717343ca68a7791e450eb7bc2cdca3264268733da6a123edb", - "9e62283b03cbbbb5c1beb6da04f5b03f58b922dc59da89fabf3f4f0ab587c998", - "3d96ef800113c2494d9ebdfd73aa39a7ff35d1233bc2fd97cc380c2a6a3152fa", - "1ce1d2a2172ebef0d8a8b5d8a375f419b11a94dcd21a234e59e980f5cdb5f070", - "c70ff87cd2cad043f8dd09f2f0fc9dfa8bf09ea257c88ff47a44508fb32fa2e2", - "55601c27cf5ba74721a513660a8081dfefb29b9228b616623472dc11e6ed83e9", - "088d358846ab0d43360b0e0fd10a412685dc000c1d933d1a2d31481eb84f9ba6", - "519b47bdb494801caf07c272b7b18e31d6445644c1f40c3d1bfb2cafaa4aaf47", - "ddfc21dd08e97a072dac99e3109a803863ef9913c9919df7b940d1ce8b9b4fb2", - "26987fe8e404db10f9d042f8d1759d4e6fac108d49fb17cdeb447a5a1188c47a", - "8b1c5496e49ecfd8017a172535b43af9275efe9c29c533c97df93a896c61c7c2", - "2f96c59c0e1e092599bd21478ad4ea902b897623533cd705102e6886951997fc", - "1148fcb77db65169ddb77cf5add47d294bd52b3149323567987a6bf93b7c1a08", - "9a2e938a8242aeb8c5e11edd3bc88f472421f6fc524432939fd71b90432e14e8", - "08933a5ed16557b6619763c9533ca15aed192354ea85caebf01e4dfe2c2f91c3", - "896ffda35e5ec0d8f3889e53e66002c541aaff64c79fdc729cd523e09aae4608", - "9caccca570ba9f30745bbeb3308db13c760a0537d89350909143bfaa8b809fbe", - "c199e6f69acfeabebf3806b3611e37fb97046f8cc7b7e8c8eef2c8e720837970", - "83dc84239f6ddd80b90b262b59062dd035e4e2a9b30c7899605d9fcf5927d04f", - "1391c4ddf41d9bf3d32c8ae1537bfd969276e6023f18c98cd330a911d6adf2dc", - "3d5e54371d489dced38c717d9dbe889041801507d033a49f6d5ec6bcaf8b4136", - "d92400c5c05ae25443b8342f7397e00913f4d5586b20fd20dfe6e0106cf92831", - "0de363b9f31ecb5d24936dbfce223ad74458eb4fbdb8ef24185d48b1aee91b3a", - "72f9066d02e1cb1dcad8397d585914f08f44c037cc9c1c696713258b45ca8b61", - "038880e9f4e17e1bbbf5e6d3522993bc6b86f53c23f4113e485c84e331c41b0b", - "a2dea9dacf17bbd317c18be8e6773ed2877328fa18a3aeab2fc856dd205d6265", - "7abe2657c3dd3d651cdbe6c826ad469c91f214dc407147f88ec6d80d8ec24d9d", - "ea774a3bb5ccc91f1acdf766bf5d1555717e9951f14ebce7a0de44c288ced8bf", - "254427e2a84b9271d7d9c3aa23f578d0de15c7eafb83576d4681d47de8bb9e07", - "b0ce77086503185b9a4d9eaa08471e02ee03a1ac5c33d4fd5df39d7923c57e8f", - "40e3cb28984d7f1c4b16bb8c1c705617ef167f1c5333afaf24f1017568f7b209", - "a9c86b19967ce6cb4f17187b4519b1a8571a0d7911a5733e35f1cfd63ada4787", - "77a51e21bd693ae908b31b6e2f21b5f85cf6dc74997ef9f5798eb0278893f216", - "3c77168816cb47a4ae8f09f58539ef1c47a708a0343a9dee0d265e2efa7353cb", - "3c4be42a7b30c6229c86f361fd493e7dcc03bc9d78ade8317fb9414336bd2d7e", - "2feca6ef8e844a414ce90d00fc61f56c06dd73bced8381b398864de5ddf348b0", - "3e7423ed3815e2f2cc902f81068eea3ed77d66562b4ed4e011ca64496835848e", - "f669d7255e06b5ee5bf9a99690ebc0fd9ff2f7071e06c3c9fd93dc9e0da2cba5", - "7342a7418916691ec32ca87908a9dc2f7182a917048a462b9aff4c05639e6905", - "1e1925b4702a4ab7d5a422342311485e9dce812d0fdd4af2ab8132964c90c34a", - "33d6326ef305447836e98d60a2aea7306e0fdd58f9044571a8862ac14b4ca8c2", - "70a97bda33e40c62f7973444092183a26e4c1b883f1d8cf534c01c66f1f53460", - "ca2eb9c74ba0bbfb5f9d51c4dc7433ed064e11acbe8548e6ff33f0c13adf9134", - "b46086664a7202bb02efd9595c095b85b6988eb8595a7920a97ceea993f5a569", - "7055418ba1c6f2addf11a6efaf6d1d45869ec3701d526da6f04777ea11b77604", - "e9c3d186556ccb1fbc41179058348ae4a1568f6fc335d1ec8a489adf072811d2", - "ffbee27cfc2fa3f8af966fb3159c96a94dcafff57385d407d49f6ff31d23b55d", - "471098c7cd2a05efe5e8e56ebb01143ff77cd9dbfe32080c28230f9f80c6a4cd", - "acea937cb787c83ea3dac0c64508671a98be65cf935e7da223915cb550b6f5eb", - "61a725c36bf91016b83d1b90d5d529f0266317339b652241da532fecaedc3c0f", - "5b16fa5b45ce080b405325fab69ef85c60a5c07693e001bad01bba54fcd831bd", - "b0590531b1260ed47104efad5be12faf9f308ca2fa1bf81bb4fd2d78859c467a", - "ad5e750d1b0f8eaab95e2dd3831eb15bd249227aa077d9240cae215bc6b05e98", - "806acdcfabb3eb36601c378c998938ad4e8b74e2530219850180ecff51ea98d2", - "c20e7d9fe7591ec29a5455fbf35c89dfc705d99a69782266c8ee782edc142c1d", - "72ec9471448304f849721597ad4db7548da136dc5aa834b09c22b2fe7c3c1be5", - "3a58b6478297ce645c0c136beccceb1239ee0db2e951b2f411fb9f2e8419c05f", - "3ac17c44d30995167c6a2466a34d203fa20b015530e3f8045837cf2e3a8cda44", - "c40a8a6e81173ef149fcb7c57e4f79a67be6946c0fe3cf2e60f3afa4a43d0dc9", - "91a47dbaf4a0912821e5675a6460f7a4d71d8d2c1ebfcb24667d0fe3471e4cbb", - "cb93546961a86bf0c368d4102f316e230d8d02d308d1a4d33850a0a59416d315", - "a17b8badd451db77197987ca4a3a8234fa90ceafb7dc8562e39d77e3b3d7edfc", - "8e48bba66f6cf41b70bc1963ab6197a90e13934b55423eb37d054ebf2262dca9", - "16d6d6e9342ef9b01662a9b32aca045c19b3a67136dd0d9969b6cafcebfba6d6", - "20bc9017410bc8c640515d4217fe171bcdbd6091469ff2718ca0a9689d8b5f64", - "23d53bb28570b3d93929c30f3c47e513e5ae26af0d456a27a0e2a51933443b93", - "023991c342f0237771bff6ae8d9177632019b643cf7173daa5570b41ebe5b652", - "135cd3926f6588aee8519e73a95057498d28fe3ae1064e638a7994738e311240", - "3dfc55be982a479a6625720cd080070a570622e550870f272cb85bbbb2c06f78", - "04f4181f41d6a051222aa180a5c9d0950c5ae8ae2babceef3ff824fbc06ffcd6", - "f6a77bda5b23429a9873f1658901b6d3a06083febd85c02b337f7787eedc7033", - "4420eb0380cc4539d65567a5b26ac2b17e4b51d3f07ccabf023acb2db421c46a", - "64331fd8ac4e416de530e40815d403dc6ab4229b2caf978d219fbd1aeeeae45a", - "a9ff19ab3d4b3f018d742b92ec5c6a3c52a91edcef558b187f57a1e9f5894bc8", - "21bb45a3a9aed7a18caa689f34b488fe0a4b7416b8da5532ded1d981a1396700", - "1d5625c7562ad5adf077a8b0beca7a4417b2204a3251a7f1df6aa704b6932b30", - "2a976dc27ade5404510e185c538e91e91999c49df281ff1c298ee7bf29603631", - "46f860b56395f29cfa7bb4e7d3da8ea026ddff66eab69d5098a53ff5e9208122", - "e2107b48fdc98d5a488f4ed6f3183223fc498e8494202e86875308b72e2e7141", - "d26cff1f52a914304efcaf174d8d9d9554e8c281c161ddd83654bfa385d3182f", - "43e88467f139b221e68cc43b95b138d4e6726361cd7a62b335942f0071d53de3", - "8fbef9da2ed78c987fc09f62a7a3f76a955f5bd2a8594f0c600ff7ac9edfb35a", - "e9aad1644e17fa4bf5f75ee5ba3fa12da8ddfa861b0ae28a229341b1878c6d22", - "b50001ad8e1d5ec9f7dd503810ccb5ea9f75b3d665585ae1e00224ee1d54c734", - "b0cf4cc3494343e085743d5dea1bc3f04c100a0e7a8d73c9f4e0cbc52f8c2183", - "268e672aa067d454fee8460bbc20ac337481b2dc4a8c847a51316a86b0397f82", - "350d6e2e3fb46831db8cf8bec5d54e9b651a17b0dbda0df50428298f5d791859", - "43c0a4cfb41ec25f48f53144bb70a6e23bdb8f6cc65c143de1e207ffd44f34ff", - "e818f99afb76558c4bab7367e7b1b1b7695fcf7607775184d6ad69c20f732fad", - "7727264da29bfe20f338012a46fe359fa3356db63d4ddff13d56470e904d0af5", - "4808c5a1e635d1ff4a7a5657d996d86d9206bfc97965a8a9f42c3c1477544262", - "5220cc9f9e7f8b0988589b8c7eebde604874109149944bf3a9c01ad3676a4f65", - "ae138e8c5aeeb9527cbebf891df12969d9887dc4c3ba3a4062f8d672d738edf2", - "3531b760b1a4079fcbf38409cc6b877c348493009a2c7ebf1af2b8f3f19786b2", - "5b9435e35e139e8ca17dfdb8d7ea1879eb45ef8cccc77ddc2c6e7c9d88d6a05e", - "ba5c02ee7e74c1c8a50076182f32e46ec4a19081ddfd24b980bea59948e06d26", - "ec1bb5baf627f2bd970fa826a1571c33167dac958485afb84df7a928a3cbe9e0", - "cabd42b5b8df36239a163616bc776da1e60540f3422513ac31fb6ef7335d43c4", - "dffb244b142bed8d4169087256f4b08931be762320907fcaaa5091662e871c18", - "507cc51ff37910c3fdfc216b097021413af30535fcb7a7cc3242ad3cb60ed6fc", - "9de120222202aede64c8820c34993703e77089e9b04ab5d9f3f4d6dfe991fbf1", - "941272e4c95b28a8b749fb2a4f85803ade2c917a46e28d590d8c8ed1bb0f7b9f", - "4594cb5907b9a4d5543b59574327386fcc9ca0c9f7d565458e8faa66c0c464e6", - "eddc0e2d237ecaef513b22f6f9b1f83d251afc6aec9c9d03acfa8e9d82b66475", - "f3f1336b595fed0994f499743c8d803da9b6458b09bec1a6601c19553555c6b8", - "a262802b8f78836e892dca08202922987b65cfa39222befa4e8ac372638a2270", - "43a5eee0a1f8c26591f91442fe2f5dcbf584f3b1fef97921c252e44395075555", - "af1a5377722639c7eeb15c7d0746f014707ec05e6a242d070c5af0133d9be172", - "9de104cda3cfe825f9212621e74562ab41e9ec9f9de8f315e8a5022d151583b0", - "8ff4f1054dee6a6730dc5e6301b2535b5120f6766330bac7e6753e79c9bbbb4d", - "325cbe66ac0ba0937e12fd013f2142fc725093773212ea96ef80c0fbca3bb2d8", - "6ef13a6e33f755cf46a1bc84e12a2a81e0bbbc92ec444918822aa4f15c544239", - "61bd445778ca19ea820cee0943ce46d872adeda35d472d047442f3618e66d20b", - "0a0357f1806f03eee194e432d029b64dcf2b67298548463df8caf845bf5fb8db", - "deea1c9fab964a7437052e29e1eb46073a1cea2dc373671758d9e0cbc163c5ed", - "23aa4b399d1653769342edf150b7425d3886a7a0d241a3a74608bde2c492f154", - "99a0404367a2836a4e5a26757a197c33b36cf87a074867dd8499680095870e6d", - "1eb6394e6149beae182806fac574eece8ededd3860d5d78c487b8f1dfc700832", - "93b346b91f3ab0fc7eb7b68bd7912670c7d81bfe9775d09ae79811e376f438de", - "a9e9a9a2b9257c4149b681f7a620eb265d0f3f9e47053af0ddaa5084ca4e21d5", - "214421d069b227127fae0f62e30e5b2ad546c07ebdb670fc1544294bec65e57f", - "25356ea4be03ea52b6d55cdad0b83365ef969dbd762968d9a04d29dbf20b4796", - "452fb827caf98ec4c1755f4cb8cda9c4ffd3d816981ef17cad0a33db50e5aa1d", - "f4af2938cd35513fce7c99b9f6394238b61e3ac2edb37c32c82ebb732ea1b445", - "6c6dac7eb517220f861cba77f34e18fc5a14b507c745d62b501e1372b300b186", - "ae64db16ceb3dbe61ab5a4e490d29ef9883df140edcccc8f2f84532549a0ae47", - "7780e4417ab2238726830b2c3e22f494d5e50cf7e605d7e6e7080b8b16daa206", - "9932ce4296009d88efb587e85e78c08d4da047d3f4e21df9e6ff12e592fce46f", - "784fef9a4413af1325c7cf6d7f90547225466859886909b65d13eb7090fed2a2", - "87835905c8e3aa72e5c017e14e6470dd18520fd0e87d8fafe902de73c0417e1e", - "3d1a95586ed02445e18ee8b1f8c336f7615606db03283801375da8614410eac5", - "8629fa80a1c68a382a4b9974a75385d74a8966f7fcde1b298081b7bf9134dea2", - "65ad053b29c157f6ba91ae8996902ef8d4d4437c42e82f7afdec91ea6bc7416c", - "e969bad5cc31cf63f3ae55033372811c831e4afbc2683cfbe96a40eafc0be4e5", - "d016d773af6707a1e77f93a6f63b9827545faefbbc5798dc6b8867fa98159c38", - "c972844e6a59c412d44f5402cc4c8d873d0f1d935d7aaf25e36ebddcf999d6a9", - "3a1158bf0bfdc2eee056655aeb0a64a24a5187a1be5fedd6104c415fc79b3773", - "7972174414a69f4a5e9bce5d2a98c845dde64d9ddc1d2be45aa1d386a09d644e", - "a60bf18e62510b7fa63e2dee0e5438a55ba1a9d6204c1f19d3efbc79b93a8816", - "dddcd1619f3e840a6a72a334c2136601a01ca4a8a092a5593da8a689d53f05ee", - "6daea38802ec05e8f8568fa417197dbf11eeed937313e019d2739685e4a2448d", - "8f68acb7e3168f4f4829a9277b7c71b2b23668430214a72aed98b06d6cc95956", - "868a3a206ea4a8ff96cd327e98e965d963d4d7b8ba8d506a63f4ae543977aa0c", - "5e49e8e6806215103a607421b1d277c823a2d98d7a5f439ccc32c6d2ae063c90", - "d47f0e1524aa67b92ea8c72c529d355253f7aaeb0a0652904a70dc30e712987f", - "41bbb2777bb5591243f77c31ed43e5c1f03321529682279bace2df08840f857e", - "6bda782ebf1219a539dd5255fc4a98c10f3248a64a6a9b171d42401c77097f55", - "66c850173ac6eca01eb8bfc2f38c8eceb3f0cdb1ead7b1fb365bfea27d8833d0", - "76a5975757b66ed242c1fca79c36fc19a55de4f25d289655ac7305050b06616d", - "921cf3a1010ed7764fb30d7699fe78409249b5874b29f74f32ab0cba57c72f10", - "9b96434eb6e3383862dace57dfc10411c08183b9d1d5b4f0d492fed991d74ea8", - "afb94aa63a08f4c3f2d071ad8323e325238f87d273c9c7cb6cb77eea627cf257", - "2163b13cdcf40f5bb17c546226e3121050a482071a52a47cf15261cb07adccbe", - "a4913cddfa2bb894921d3f0a213071e6f01c27b7b5ff7cacd95a85da6f608b2b", - "87fb0ab0de6e10908bb49f611af4d8a054f7e71c5f039bab4ddf760172589277", - "9164313eed4339a826bb7faf6f1c1b5b291463d791d267e5353e06445682d059", - "ed0cdbd9adb5e2b53485843abdd507c4b972d6aa0e683216e87e9997630d1ec0", - "0367086e3213619b54069b77328fde3e80c581c43806d0c46a373f0b40127731", - "872878aabd821d4cbec6b2f35b6c88662881cd7a6da3b28fd57982cf75174c60", - "6230bbea78465a81a6d433d1330a9cb201c5c05baca5cd085bdbe412d360fad0", - "06a999ed887ec29133266070727e44542d505a641cae7bc6719873cddc4d45b0", - "e274158e4af23e735869d493ad19a69f28f1e045a7e3c18c15c9c49d7793270f", - "901113144a47173e45e29e8229c76a86d067c8101080daf614865103bb5ef69c", - "339e160cd8eb061f68dd00e8b12d6966f2b552a50d2f264015e6f18563c34401", - "245fe0c769ab9e890554a99caec913d840242e0e270fb1c89e9002b69c232987", - "6e1c1af686696fc0dab3d35fd6892c674d3c868a4030e42eae6d483e625362c3", - "0112e19810c7f943096cfd53f52b32380c2d9b0480b6c6724fc21270c7542370", - "6627c6509add5e39ec433ad9446e99bdf6a72050f0fba655351f9761100efc2a", - "f162a8b8c118bc1bdedb9f37878a97d4f2289798032f9da73f238ffcefda8101", - "d2f7b3a417cd4f8667ddfbbb936496ccc47f8fe5cec7e85ed2e14cd9e9c74113", - "9d3652c10fc8f09440101dd96039cc6ca58b880a179160b3862f5779cb402324", - "b1059389d9bb55d4ed1cbdbc3c2aeb743c4adb7dce836ce45c8ff34026073f9b", - "69cb785110d715511c79f836a334d76d347f0a87d7d58da0290e1cdf28078a87", - "8e4bc0ef253314208985640a8c46d77dd451fc93f4636526e1fd7035f7cec7bd", - "3b0846fab4d5be2c95d6f41ed5f331b113eb0493eb3986af84e476c7b1f35168", - "605510b53f4ccccd8f94c580a34b0b54c60eacbc7d887cf892b0f3784f121f3d", - "7eb8e28bb7738777f08a1fb705b3c84977db7bc23be5a6bea7a0d638c5e00b83", - "768ae760d868ddeec5ad31ed3fb63785814f3333580c85a8b47ba4766fbd404f", - "0f5ccaee146a8715d790b602f71f32fafc2398327e9ea1e4b7598228cbadcf99", - "418415596a396c4acd6f7ae991f5e137fab8c4dbaad9e61057da93d55790b6de", - "231e2374237948a2ff3b5335f63982480c47869a2fd28e0fe35a0fcfe4f19937", - "48646a4596a5891026c0da782911919d719a4dddbcac1427d5078f10c889868a", - "746fe47e698f1ef4669e5c8df619c135e7abc147529317d4625c646084c1fe13", - "96067d954b7e4ab41fa32ac52556cddb7f43e7035ffc4c8178cf1cea62ed947e", - "1b418d3b76397b8daf2be6f2fe404589884e7c2a90972ac8d5cbdfca0f22f7dd", - "f8a18a8f35a5e09791a13a71d5778f5d14fb4180fb8eb8e2afba6d55f3e4c274", - "92fe91768e0672404dcf02a7d54c78a4f46c422a6db76ad1413cc40059e20e0a", - "6dcc9789e3decdbb131a80fcb45bc3b603beb2d578702e1d9a5810d89e4a8434", - "86f6e36ca9d177464492321d66bd6762dece06a5e5bacd358d944eae2b44e2d9", - "612dbf2a04b36a2226b025ee0e18bc250276c559ac3986373f2cea5f13c3cb5b", - "45395e3728149f6ca2ba2d1c2016e219c71b31dfb97b6a18cf18ff07d501de53", - "a29fd1f2789f94aa526ff84c7b8bb1914516114f64716bd06c479d64ffb6470b", - "fb3ac411a6affe5bbb2af6b4a063208ffed06d32c5891a4495eb4a20496326ce", - "c37660b6a49cee65c15757f2857c19df784cc00a9fbefd4257ea479421efb3a4", - "8354f314b6b7a14e9d6fedd6b0d5daab797b5875281b4a1a9e84bd6623780a64", - "b68055701fd7b2fa9e08f2f1d74bead420f3341e45b0011db490ecf6a16fd119", - "1382667679facffb314ebf5f908cdca0c5b85c647f9b55a88c037ee289e97a29", - "8c813daac9d2e227046a8ef5b76f9b20dcd7e4cc6b4acd33bf29e91479ce8adc", - "80fc192ec8478628ae310a255bb1d7359b437b71a5ae9a24a920fed130436a61", - "cccf5ccf551a94c773062f6b4f989ec3ad00daf7192e0158a19cf479e4fd228e", - "fffd1ac1d5d394b1d43e49a36b40ff91612410a0ec4ddb7434e81f6d631b1087", - "db33cfd29630fd49e082e938e1cf3d18f1faabf1b793448cfff8b91b88ac5c66", - "54d549f3f7ab3ed706edec220acd75a99445cdf5b986400ca5ee29750ee3ddc2", - "a21726d0df6a4e0be86c787548f1b65044e9d4f00b1d73820a18ccce811effdb", - "e59b572668e11fa08f0e40bd065cb1db76dc4992fcc495c81a1466c1785048a0", - "e33fedc3a9429078422ecdb134032cad40ef9b5ce23061bc5b1aa1872953f665", - "8b793d56ddce4502896be98308ee4f8660736d93861e995654665af7a7217fa7", - "e7597378d3d84bb5068c4fa7676717a5a354805a68865c8c4a322ff0fffd7853", - "4068a30f9753802a7a055b21cb27dc3b1daf1e4ccbb2c2c00b292c3c8f1c26a8", - "f0d1bca40344abae16f1e48740b0f24788940a070b537c3ae63619c877e4347b", - "b5a5438c83625f16395485f1fcaf157d628755ec560835953ad2434784fcbae3", - "200e125bbb88a5e103935f29a351dddf795de76102f69ca63493944aa67b345a", - "8428e63158ef5f0307233d2ba9c5bfb53fefee5b6313bbfeef0975298eaeeb99", - "0ab6869d8f90a4e49a15348ce0f485b0aa2c1b02561d4aba010e9d878887694d", - "c30a5c9e45bfa514435a0fb4288abc28c8be942064808591017e3b8c59545496", - "6d148b4d081f0627d95070bc7b771a4d4c555cc8de2ae722785f847acb05fa5e", - "7660161eac694ee68f84731911215cb6c3483c6c5fe3ec93319a02f648423445", - "e34157d94e556721ea43e9100b6917f4d49c2eb600569e75c755316c187553f7", - "0cc6b250347514489af259fc3d679d3c8ce5c9938fe7cbd0e3ca371addd0c8e6", - "efaefda9e38eca0b789a86f44f7145eacc28587c3bdaa011ce9d8ccbc35921bf", - "ad76e6840ee9ed436e6cb188162f042fa081f4fea98d6a44f0fa8fde9fecfc96", - "e83ee007d40b662c702e9656a0ed6cfe9fc68238e2d6a040dde8d3ce3123618f", - "8ea904e952be04dcb01d34780fc657703db6932b180f5e3749182ff896496f3c", - "ef4c5abec6aea4221c7514bf8ad1897f207544ecc3834d0cabaeaec44138de33", - "8fa992c6b8a7a9d5b73e8d66f570809ae54c0130a65cb6eb553d42df77ef5cbf", - "41d21d4aa70ccc6c94d535f6f10e6511500043f2e73737e8179743f513a9a62f", - "98522788709fd7ebaac6408c20692423ada50b0918b05c8a6054ed58f087d042", - "ef18075196de13e2b01f6b89f1ee0e8a61ef8113ec70eb581c71b437e6782e38", - "2dc9e239f5b400568f8ccb5017be62a333918ac111f1fadef80c77a632b89f2d", - "fd562a2420566140bc70567dd3f5902b6ab8f89cbf96a050ea7ed86113b80a54", - "275c2432d5d837b9bce396405f06c00f619f379730af1ecf2b398e3cf612bae5", - "14f50b3f4087211d479c5ab042396170259233ae087e0a2cb3f249566f9b1abe", - "ab57b7d335ceee63f0a6c7015a884b37ed05ea329e1aead935a178c7d47b97aa", - "c617e2d7b66a0d799eab58d8ac03185504fe9a4948959094446902c883382cdc", - "b4de7ccd6e997ce515ec0b966faeceb224062cbcb100d5305702a7a9b8b7e221", - "96c550dabeedf822a1ffbb2292791bf60361a57262c059aa25431bfd10f90a4d", - "35afc5ee0dbd35e18ddbc7067f2e2d5633668af247af802d42769e3fca72b24a", - "084a1ffe4783a3c0f398aee0382e279538b4058e1b6a73395c3564f82df80b8c", - "c541fc874130d2f7c66ef7af88e227c26a88aae5bb31c6cbd248a2e50de30b6c", - "1bdbb07b1fe31b22d9913636b8c5a274bd5911133f24cf54dbf498fb0eaa5ec9", - "02c8345addc647dfaae8cf811a44235ac7653abe03984b0042680e053debe9c1", - "e383d8cae167a500d3dc1d9e35cab2f61e9de9d7d4597728c8cea2b0a5856530", - "2937d8e9627e06c35a8079a5505296348ba33c81d6ebb8ab82e1b012c5850913", - "7a6e2dc9654cd6dfa9c80e978e849f28be61cdeb66f1a4aaa1e4566b408517de", - "4b76f60ab889c9ef9729cb5dd482feb71b82723141eed3dec96459aac47acce8", - "430cdac608ecb7ca67c814de80185eeee2624ebc9c8195d38651a7e074c6761a", - "b0c525d63deb8a8ce2824eef0e5da25ca391a6ad4cb8c99e78c90a4464da736c", - "ecac695a81a7580d454e17fc1db10e004d37c9353991c67127a8267407a64aee", - "dcd05d974504e25c2dab5384bcd51e56efeccf1fa9630673fb19bc9d9f50589b", - "0762f7cc6442511d2c64a99babfe847fa4b4dbbb7077aa681d39aacb06b103a5", - "627d7af87754a0a3f0918d55dc4f25d4fe8aced706a28df31ad301d8d93540a6", - "0dfc42676d5d19fadacf11da2228b77b9da6c88365399330b6cc0e148e6e19d7", - "23fe394528a996003f5f529265e299e0b3d4e67787cbaf2a460f09458949b55b", - "eb7f57cff37f1f88882d6cb6fc485a13f490fab331fcb08f424970b1e4ecc812", - "4c4ffb3a964213fbd247ab63ee42ef1e9e8eac907a65a489917db8a91197df3f", - "b763a4b37caaed89cba536ee96bae7d5b2223cc4396e00ce0407ec42d494a2b4", - "5eebf3d46b283fd0e224fd8e460d26df215465b54ef6423225fbbaf65c01bacf", - "115ce74a0228ecdf7a0162946bef0433246f6c8fb9c738ece1dde01befef7066", - "d2cb26430f481601784ccdce30651252b3d7f7cf8d6c240f34feb94be0d3f4f4", - "1082ebfb96d4d26e90661a443af2e4cd36796707baa63d3bec947a690b6c36b0", - "c05a7a79d4afd102ba6ab2b5b3a246ba2154a116dfb909ef2d581d8184430051", - "cd305d436798c42618efab334ec1c61e82290354e55e3b6a69830c8bab086dd8", - "76b3c0f342f2b79f204f7563661c3ed65d217a920b844b49507da34b7eafc65e", - "cae54f8c553c293ad1e929e0fc8a48fc9f80322171c393c45df96aee47e0a2cb", - "c8edaa28edf571d0f8f02d7c71cf503f9ff9a47a30b9150e4f674542793b1ae0", - "86524aac41df101de53ac2b38f3d9f01881558a9e104172e054ddd6c2cee1b9f", - "0bea464b339fe32a337df58abf8f84155d7104f3e9f37494ddc813683a9b6ffc", - "1738eb4939e5ad359306889d3d9aa7190fa6acd3c17a2b3615ec5354e9dda451", - "70c44f8960d48c643e857e17314b557371fba05a79ef2dc093e9cc91f96ab20e", - "c447a5fcad40796a3d6a88ebcd30dae6c85f9b801271a11f960259c0051d987b", - "d287bd2dc73e111fd5fd1bc9f6e2e5272b6598107a8a9a611c54ef8bcc749b8f", - "f1aa0b6a65f2034fe37d5366b134a5df64fbba0ee0de3050bbcfb73f23569f3a", - "5e4a67815629e6af1c62a36288fa17afd910a27e441cdcb8f4843235c1c5a0c2", - "771f09272a647cdbfbf88e5eeccf408b1c6913ef6f32035b2859c510f5c48d3a", - "4370e6cac66df2e16a3ac0077fa422dfdc43fb4a0ca8136fff87b8f9110ac63a", - "2a69fce49fdc581e907e15674133d810f62c7e417ec5b014242faf9d80050151", - "0e67f1a3655f70c5f5a7a8d79521f584dc3d1a4ff8bb29dee673f476c42be11c", - "83a60c701c6230dada04200d30b9d18a6b5b1501b004880c185998ad31e40dfb", - "88c521570f875d699896cc9bce9388a0328df7824da34d85e11892fceb762354", - "ca8ec15b8241a16632093aafbce97e9a8947239f951b1faa5e4f06a4e2450ca7", - "41da1614756e76095b1c21e6123b285810340b4fff11333963b9be30e415bd1c", - "f1fad2207aaf416911e002c7c0665d971c9bc5c4cca8e67431ca7adab1c40357", - "e67adbfdcc966a4a8ce77517fbd46f86839af037b394d574b8ddd9880ec7073e", - "e786dd1ac32dcfe45a5805dfd082b813c20cd480bf15648408924f32e4267a08", - "02bd903a28e50d0af9e68ffef082a056578b406e2252ee5c73eaf99758c49820", - "2a4c27d8c9e45deead1ecce47a45065125c0ffe804f1cc7f4040a2f2cae6cf0b", - "b4f2abdac69110ce2e23ee79a52c84d09060b2f55e031ee25b0f8e0700df82ff", - "6d83f2a4404f2ed4fc734450ce53769931b87bfeb3e4df995d5c85687b88e10b", - "e6f0e1c03f70f2ce90b00ca80be1810490e32a5d5566d6c62028bff4490a5a11", - "42be8d9d7a5089d77e0e261fac3d4a2833741c379fc239c82014b9550caca842", - "88b6284d0a2f6b27ce0ee6ed12e9d95eb7e4c5162d468b28b3f736877b99f322", - "f01e4e67f0b2700bd12f615349766c42222c9eb3ae0da26e29fc46268ddd42d7", - "c15bcf03fe3a80606def370666e4fe896e6078783d0525ca2df22f626b74f6f5", - "fd5eef5dbc6365467287eb16f7c5a93eeeb795122ddb61eef516e7118765c58a", - "8e272a08ba36a664299845a88103054cbd48d43739397c2ef095079fe676c707", - "8f5ccd2742be0aa829de7d75e668bed5c8be5a344938caa6d854961bdec2c241", - "99a78230d1429ddef10ac0937e5ffb5cfc287ae9ecb88b9c0cffea2412aeee1b", - "df5b8b6329124de5fd3939c5a4434b63accf09f754683114d1c99f4faaa4cc95", - "f17745b2a0d8b501964e5b29704e62a1248f824da00a16246f046ccc0013a653", - "1eaf716508d7d02dd7ef8e55953967bc5f44b8730cf16a12c98baee0613eff4e", - "c7488250bd6b925a1ed2ff31432094af2d0ae81c7240532c95ca5e296a632697", - "9b7feb410d2c0aeab2d58ae794723037646c7ba6d6ce6058c091244316b8b799", - "e063531fc7c706bfdb3839de0de6b446445a53a1f2df018e9deb38adc5fb694c", - "66fae50cd6ce2a2d48fcbcf432013474155c43c99c008b035bc29b2adf6947ca", - "dd65d1702d29e378dc832ea5dc6d55445f6ce6454d54c6c1cc18e286bf3b8e59", - "9a0703396c19fde03d3f814389144d9651297f7a1479b18e401dbdf4dedc05a2", - "f01e3e5894157588d4707ba6d0f91dbfc2b2b9f7e3cde469024a8261783c236b", - "7706cb6c897b6235b9c21250c547d05fdc9ba5709a2c011f4f2352cd6f457b35", - "563d85faa9a782ac504acfd262cc604d5b0cbae826d60e01ec458de5d1e05308", - "ab3e1bd6d8b649c6824d8f04d2753dce2b6d3a23fd4a39755aa5820d4ccab1f9", - "4d91986155c0bb606ea6b038e76b0091b8c5b2c7fb671ac3143ac37a496d51d7", - "acd07c5db82ea1ef69b729a43c23d736ddcb0dba64acdad5368efbe28df4bdae", - "454c2045d1cab193340b6c1ed03d47ffbc866ffa4834ca362c7a2f5896d8f03a", - "1e7b7447c3c77cfdb82f8262b27d140279ed22232121e28032d1ab9e4437a161", - "1dfcc338bd4aa1c2977014416db6f316ca8477cf14925479e7a99edc37423c92", - "1e8c5ef54860a41e38be1232ed4ead95762aecc079793278e7bab171312956ab", - "914bad6ff7daa6bd701f32f147a53e219462525845fbdcf5926c6d307da89b3f", - "c1a5a52a8b5a5eefcd6505275f1600d0e02d840e9481b2e15503fbd873273efa", - "9bd88250caac35521d1e8d2839dc82dd12941afe7edb8932361aaa506c7c0413", - "eb3346d96cc043a03660e1bc9bd180e7eedf08f66c98c7f404ea5f657b33df4a", - "768ceeb7ce4aa80900487734ac8ac3a1ff4fe71173bc67625d0bb05dc95243a8", - "2b6969e4805aafa1a655d6bf5e6e33a47c86d8f39f2c2cbf7ed14d1f757876c8", - "2dade5cca06cf3a35d4e9ecaef1ba8e17e1888936c33e1a3216863f1cec3bf6a", - "a4861a9548ac53969c9f6da70481f03126b1a5e5c86e4d03c2b9add0a4ff7bab", - "6c12e62dd599f9108e88499ff858253d8d11af0fc57f315f17b17e5d92fcecae", - "702e3d26b3c82f5dc98134c432eba90127f43f619ef69f130f355941af1498b3", - "9d635baac4f9732c414d55c8f3399237fc95b342dddfdecabb41b3c2537d4cc2", - "675364be2a6a5a0a514f108fdbd536a2d12b1bd06337b896469fe185267919b0", - "00c8d9c502e0b06efb4be94acc5eebc3c244499aeea99357f62c9c5ce2568d00", - "9e17f2d4f3ce6744a72e0609dcd30d4a1a4999b50db7c7af6c55548c569c2a96", - "cf96172d4da19e8fae1dfefdae5673298c7c22b07dae1ed9d162c58ae54af068", - "e1a82f23ab43350da4b2cb26cf8125f26a710d7bbdcacd9f26c5b6f053aa4a47", - "f1e51e54e1b5c195950c1cd174dbe3bec495a4a3fdd7f60b1007024dadbe36ba", - "58d4db775c379e23aca4322784439de7d26875e88c1e68359726c22727080a59", - "ce8e1b38209dd0c4cc26a7470a7774b4e02222c8d1afcd03055151fdc537954e", - "158a8fd97c99fa2f8e52c63c18b95ed9f29889df844de7653aec2e5d836f6a04", - "67b6db0cbfaa8f1b65196765ed609f2ff8b201a3ba5dbee79de8481404a7a949", - "3e0624af56dec89523e228848c4326f38f7e30f9f456fd1afc06a30bac26624f", - "55a49dee10681cba1307122e99bfdcff73fa87e7fa92482c8b8823f51a57abdf", - "222f5988289d64a0e868d1be10d517153a6f975ea15300a623515bb9211a8382", - "be88f92b504a1df9dabc65f45b1574e6ccbb5e0e871e0c95e6677601c7e4cf8e", - "d0da2d3c24ffd1919f30aa06131fb1794d773f0d46d5c7d0f54d7a531e6d4ae9", - "627348a7dcd5f7eb10b1066298f9afd2d632ae63f0fb54c5c802bedaafdf535d", - "ef7e28838d055a5306c72f4e1824927f8ea0b05cbb8e6949ec93c980539e7814", - "97c6aafe9e03745ca4291feb0873a4035a4bffbe8fa67363f90f3ba08b5e90d1", - "ec0800a49bf83d11c76ed55e95e1c86d8692dc01d438cc40076e973f9343cc06", - "2eeef937e37b6f81231f4023c0bdbe217d885554618053b6d979082b3a73f11f", - "40ab5dd342b9dee3330d77edf82eb6a9bfc905dfd8a2a5c15684d757e1d3c671", - "dbcd822f4c8b2e6c6dc0977f419f6b0ec791ee12f97a9cfcc72a2224c5c4a309", - "50c5a31655256ccd54892fd3797625f17ec7ee2fa8e128653a2cd22d8790a697", - "7489126f2fdacd9b2d550588c0c2a1ece65f818a40fc618c2ba1d87f5d10066f", - "cd5e09c9b6fbbafb3dcb078f0bc6e28f35e1d16d11a49554ad9ce9a62773ad95", - "4cb59754274b3f701bc114b48862b8d317e38a8c93a4759e77c7f2790cece848", - "1287fd04779c2941fa67849276238f6148ad1aa86c345edafa53715ae1e431a2", - "942da9f004325be9ac8e9cab5033d430f8bfdc7db46ffba8c4769abfea82fe32", - "e6ae82f270f1ca869d812625ba292214ffaf581f6f43c168b5e12c0aa0a79795", - "c0ca3af75837429857cfb5c27b3994e3f82cfdc3d2de11da98f1e15a6040d66e", - "b2f6d019cc1d154cb65c7326ed4085dc205df6b87d6f7527d686d2d2b00e57c2", - "bcf4de003a1353389fba99ea3cc48d5301517fe020957c024266a6170f54c988", - "251352b3be61cb98f7571e69974221e970e6bae27d13f2e0ff96915cf79573a1", - "7908dbb57aff20b694161226da21aecd7b1b90aa7de28d53c65748a1fe76404b", - "c7ee0e3741fc2cb22b115b491866275992025b4ca091921b00d9d15d3b9be205", - "5c515bfc6936c6ebd60c1cfe283e1ba414d7ae0b52b6049a99cb18fe01f36be5", - "b53d437c375489308ff2bf4ba7013fd7c51f5f0dcf0d7dc3df20ab43781b1799", - "c65e3d9967c05abb040ff6361faebaee36ec9ae195529d8727f6efdad5bd27ca", - "ebad6525c1e9be4534a4b6f2640a4cc15c5b3ec57307fef2e572508073421d44", - "b1195da8f8ba652a424f85692aba8e152cb2dd89b13e2b493f158bcefcb12584", - "907fdc807d6ad8551970058c734f09e3a3e989f2f288b0d8cc1065e3ee8ff8c4", - "d62943c7bb7c1662c7acd0a9989b5ea0991272741e381963ba312789741a501c", - "76018c3605fbfe8f04232700f26e4c2f2b1763044cee607bb89570df51ff47e1", - "e0da3b9d3077a06006b49b473279dcdd0cc39b6ff26d0541105c72ad6c3d3aba", - "8c4cddfcf5a7726ed86a5a794c56f3816576648352ca79705d047cb72edde7dc", - "af48773de4813b19913db576288dbf743ee363905d1d09c382a08d555d71a6c5", - "e77d1649a5aa15b7ba850af23d3705462bea4dc187952d00f70585be5c7d65b4", - "af416e28849c0db86231b3d7a8cdb71d57cf4dcedfd8b6a42399710705a714a1", - "68660fbfed3d447cb3912d13869f266e3006715563c2bfa04d1c70d93d938caf", - "90509b94369b07f05eaae0661ef81d4c803c7023fe59a5ebeaa6925ea398f90e", - "43c96acd5f672d579ffd0bcb230c982274aacc70868bf32bb142e5b32df24a41", - "fcea647fed2722ac62cdd64788599a65af01258471cb583fd14b3b8363f9547c", - "45ad305b9ff531c9abf9bd33289ce82c8bae2b3313368f035517ee5014954abb", - "cf4be20c9df7bb3c9d1ec67c2897790eab2a4bab4442e71968eb571c41ae2d88", - "7f3567e224780a31c27f2c7e60a42b1b720d3254e08d38df96e5cf5bf75eaf2c", - "996d029a528179b4ae76fc5e3a132bb6d310f4a299eff923abb7ca62c1fc8b1d", - "82654f572886d3725ea06a566d701a8360b7347bbeb9b97ae70da070e1445ddb", - "fce1ddd1b15b8c7c24658c93fc0684cefd443260c4a81a3f3938d89db19b1de8", - "463f4aaf28ac91de9b31714f5be29a078258185e5cda0740f48ce9b7211f2612", - "5ecca6c2a61e8b4f194d2d3bd04a9841cf7c2acb6075f89c2bbdff00a995831c", - "e321acf22a15d040d1fc009d6c6a5792e348cd5b38eb196cd63c1693285f404d", - "d8109a32c748217ab6932599be539f1bad4c001ea41647a5f76b6faae4757f00", - "155a0a2f8e5337d4d585c7e8414128573e97ad601e2d71ac96b8a455a27c9011", - "080248a95af2b90ca3b649fd1e038699df419ae58d5662df482586191ccb475b", - "da28c7b55dce78f734f3a0fe89cd2ecb032e3559512bf99de7787498ec574f0c", - "547f50be1450eb964703200e47e1eff5806ec54a4db5f7bfbfb162e008c38a30", - "766c6cc3892150a4bf7d17260049fdb9f1ee3fee6700c00b46eca40762332a0b", - "fbf4f79df8ab8f943d5f54b89e364a3f58503e496513eba7e3e880f52280e44f", - "f03ea3c7ae47f075fc99376bc4badd94782ace352154021b8d76533db7de67a3", - "cef6c84c57b25549a174bbf8ed6c807a01b777120d039fbbe3eca3284fdcc36a", - "09ac3a32273d6f519eaa30ca6225669e6458e760c8398fee3d8ccea1e55aee22", - "7decc7db6aa6a81d0bf206ecba4be5020246a221c7bc6de27321116101037a64", - "63131ef94b5a3d5157e3ce3043821047771b119447633aca56cc46b5005a4777", - "6718ce7407b5b5997da2193285e8e3b59c60cc538b1cf76f55fe794c8f1d948e", - "888e283d68c3025d39220d90f23544f7c353196d71d98e980b3548d25d9ce703", - "06f2156153a65061a7517bb5e5586a6b270be8825686dffc402c9fbc21ce5c82", - "6e5dc73c8d62f5c8ff571e49483162227e5d2be640e1e5be5e038674c14e050c", - "f80121fd7265bfa38884fe58b9e6e745f553833a8078dce923b69bff9678e20a", - "0a9fc31441f3b17eff7dc5d4119dc7d79c994917fd287a77a05b2ac185854ed3", - "71ea827f0abb59e678a9668c65485958c26b831dbe90f7d6ea8a9446907da54f", - "863d02fc150d5c0b20fcd9ec4af34f30084b41252d4ffe516168111027e6effa", - "104d6b4db8d427353d6b92a7bec17461d678d0a829874febbbd2d8b590d5de90", - "8411edb687cdab3e6f4e5d8fc596eaa7d82194924307e79d08845b283c295e48", - "7ff5d34286077e9203da5ef6d243f64d54ce49fad57145a363775c57570d92ee", - "d56c089b12664c519e8f3ddcf7a6e88a0b10bb1fcfd15f51cdd8fc3ee7d0fb8d", - "0bcd3a2190e85758ff1b8257cffe937cfaa1532c41dfa09a159f564659724c6d", - "fedbc84e22b35ca84e68469ca9709660d3e2f28792adbc67943746fd337317d9", - "126df864eef23a97d3a9d1becf358c508a91c6439a218814bd418afefdf62db1", - "7992edc8f1f5a3d8e5eb5084ebc888da39a33544ee3e7a0e87e0020d5d6a2632", - "54f4225d505958e79ce561cea8d56cc4293388ac555cd168df0cb538ef138702", - "740abdf2f9b899be336b8d9dba0317fe376e1b53a803d0a4cc8f4ff08bfb3ca9", - "ddc6ea591d7a3b148582cff497e5b05195ecfb9b771d59c2530b14382c9c4df0", - "34f29b602f89ff938e3ee6e16ebc191c8a21732be9e020f0ebbc2f2fff4c9626", - "324382f45d3d2cdbc99911266b0a4fbd81230ef48a55c30e90f9604eef792549", - "270d138416774b2d3863b914e4ad4557a1e62f224d76aae2eb198cda2c28b757", - "7f9b7bf732519de0c4ddc750775ccb295250443a6db416cd8223f0f123d89b3f", - "19894f0f344bab883b2fdeb890748cd3cdef9a950431a6e7a65b5c8e84214fb1", - "7257090a95ad443abc83696c5e2ba022057a61b6f4719aa9ab895bc86f6e51cc", - "680aa064cce44a645fab2c545cca44497aa35459ea1435ebe4de6700dee83280", - "cffb78c5b74770714f99fb98a5d176e3c3c6f552f3d1625ff59f26be421248eb", - "6960c3a221ad838392fcd399f8da529c168a0fe363c2e6e12afa95a0bf273d9d", - "c504fca0f29aabe8f8635419173cbbfc0ea9813961576b61b405a96a3e84d143", - "81aaec28de18df94fd6fb1d687060ee61931c603192114e8574ea3453cf3baf8", - "56c93e6cfa0e5b1610dbf3fbafdefefa2cb50494a2073487a33f708df96941a4", - "e9b14ba8eb4d6b9625d948e201a61019efd10fb6df45e1ad3b59dd35092d5815", - "7e43044799c08d97f1ab3ccca2478df1be5e4cccbe06dde0efe069d1cbe2cf43", - "a9d72a8a7103ca3a6b30007bf05c4d97df09d4a2dc04128d5ee6350962222805", - "1581d64cbbb1a530f34f82a7b96ff3466ea36fd7a0f80c4d26fbec1873e63af9", - "2fea6e7cda895e9e4582dd3ba3e4204f20fa8afab5cbad0ba5432b5f85e2e46d", - "c72b57784c2773763772e9167184556ff3389392120d9093d467269af702aec2", - "e06c058acaf29998be78f5eacef9467ff76885aacadb1823df3082b15d0bfe91", - "6fd8a9cba8c6603d42fa6f9ab9266782733e22c3339530f3e04c9181e90f8144", - "6dfe39bdbe751858f1a321d803b03a59ddbcf8a87db066ff7530825a770973ef", - "c80e5b194d10139b3edb6106d00449e4eee1de10f8974bd9dfe17da9d14c3072", - "a14b4977a1287cad65795ae9307ab84ed2c246ef4a1ed18088029ac0a9d8834f", - "ce75d00ea8cc9bf17d9d7d8f3c4df5a7e89e0f65862a783be36e27214ddad594", - "7e089d00ae5d57f0d4096958a553f1033734c544d930cc8d38c0f2d34dcce116", - "55f0deec889412c90d73a750fbba2aaeea9cec42249b48d92eebf7965ef276b5", - "4aaed722eee55110e59cebd7f3d3c4b495ed1f3ff6e9aa87dd0ff5d6f1776f7c", - "c7ea38cfbb1b1697b5901fa435ae53f7b91e35f0ab2e3b22b61be7bc5dd41e2e", - "346150e6cfc6764e355381382817abee64be3ede96b92aee7e04b51464add2e4", - "082303e7d7b5ac8585538d68aac118904d9593ea2fd30d536fdb8cecea2546ac", - "3ae9668db6fd492d5782bf0900b495dfde577ce49ab17265f313cfc515e02467", - "39f31e44bcc1b5aac96227a8112436623202e0127047459215aca4338cca35d5", - "23dafc5993af8ae40c368b569e5a735be36d90c1a619a306f772dadd0bad74e6", - "01ad9fa95a8612f7b8ebe3b4ec2f7c199548ca7707d10b29319e0155316b8da9", - "afb5f2fb2d4fd2c3484ed403772d810fb8d4d816439025b955805f7d4eb15098", - "4f6806cfa495e6e7d581e65d36613e2ca3658bb5fdffb68e654c178dfccb962a", - "c94000b42bef4be38a9523202690ba3e4729ee11fa757f3b70207896bf7031a0", - "7c68cd29dadb42aefa28a4cf4ac60b181ec56e7dc8cf02beca5e8de4f583c3aa", - "2e503bdec8ef8ae441a2a7272c30a57f212d2f441e5262f1b8200fa24e9e41f8", - "f9e4ca069a2d3de5f912b509671468e450be5980a66cfa227bf40c1d5edc4d91", - "6131fa9d1b0e4349b5fe455dd59b802e65c689661e46ee0309f20f8b073e4d57", - "2787d26a13efefe04144045234812db4ce8dac5e453af68045ca4caf6a93a94b", - "5e91b92c8654f00814176998df7e2d64ede3a1338f8d0bbefad6316d0971b025", - "82050ff590dafddfd8512cbe5df557d08a7cc86936d8e02d15a6541d60348851", - "92d1e65c54ebedaddbb018000f0b45e0503fb6b3698a6bc3a3b31797c43c9456", - "a897921da69d65195e4dd0d40a50410af135f45d9a8764f4c799d4de6d3509b5", - "1dd4c2022c7a8a059fb891caaad57414fd2c805e4058b058c3a34f63e20d776d", - "676af1fc010d794a2989594ea212bbca7efd4c099531a69bd10fb51c1ae2510d", - "c1dd96a198a207f03b53f49f3794cff23e225b84e12653441a35fb0bb3170aa6", - "c58cc85289916fd92ea0d7e6faa4c340592582242f520136ec81c005e728c255", - "901f370a5ec0e85d4f29ebc1a14038c75792e9f0510e4d9609638515280c8380", - "63d7aaf10e9bda8967ded3760bd115532ab6558e029a97197855d9a9ea866e57", - "2de41f36b9760dab71ed39a7bd9c35bcf1f3b747cd75d1e0d53f5bc23a7ae911", - "f3e0f3d13608f083e5696f8fc0fff9f3cdd137acde4093cf15a81cb4c7e7a983", - "5f3716de530943afc490f8fbceb6fd90ea930ecffbe9d7d1982e73e7268d4f07", - "14650ecc15ce4761f235b9e4227b2daa6e5b3a49f2931c1ea1a1616dd03f82fc", - "d439bf8b9934714234e361681a2db8955e01875d8a9d356e7120944ac7ffa4cf", - "402fa03c1107e8ab036af560a4dc20a6606719726b4ada3ad2d318d5a1824d7b", - "9125316ce81363486377f7b0c9620ff2b366305a256efd9f86f718fc2ad156da", - "29f1c9f45d13a6fd8cdf4903aea3cd4489aaa28c80ca9b1151e24075dd95c91e", - "9977e3381601aba3355916d6b12ee52bce9e4b978e66830f8b09457300c5b4b9", - "3c2c28bdf17264c2f2668fddbc6c394baa6bcb169f84f024bc82bf6c7b1a0266", - "bc4b7738f35f70ddaa63a491fe9b778fa227614a7c00f3aa17f7c49f89d130bc", - "267d34d3b1a83925d5210c394e1c0a916b4ae24bfea7d27475a22a938455a4b4", - "ac12d0dffc4b948312f9718dac6908e6f74ad414bd888a0df38cd9a723d9387b", - "c27058f3f02cd895616a841b8ea44cc8f3a4e39ba0d981bc696f1cd4aee54d54", - "13ac83bfcaae3d806ec2ddcb3181d300f1ae61192dc90c6296d6a5b7a6ecc1ac", - "f8e373fa2d46b9a3ae558015a93aa1c6f4dea1887a38fae9bacddad5b7422c4a", - "d20bf123da7d6a5fba6f27a075402105cad2f50b709035848205ae563f9ea632", - "6fdede06741de4da9776787df9442fff060109f5b3fe5988bf95d13af2ba7c72", - "9c68e0fee6c7120cdde49f83f74e7da08dc78c75e5ca49e66219062f3b0d3372", - "2f01a9339f7f152c863362ae18e244b345ce6048ebf0a98a447884008cf1872a", - "41a92e5549462d35ba71d0bb9ec8a8eb32d89bc8f920c37a5c02d660c9388153", - "e438dfd8df5b62173bc4fceaea3b5d9c0f7a6ef3d8202d23a9dcd893d6710ffa", - "83461959f90e3aa8672e3aa22f9161e05891f59dd4ff70ffbcbc61ddde545fb7", - "d3a87a765b3d0989dfd93c29d373666e387da9f3183064af93bfa6c2e21f7335", - "32aabb8d0e9be5227e27cbed416556cc5dc08b1be33fee1d48b8acbc40145b61", - "f09579343220e607d5b0dcd6fca37e0e3cfa37c16308a15099e65c8711d4df65", - "1307f0f2e591a0eae0db2be82ee77822fb2d91e543a8caf9d303f8794400e942", - "013d3fb209efe76f1f65617831974868ebc1622841aeaf63057971ee7063ec0f", - "dc8dd08ebf421d7118b09bea4418cd9f4a7685bd8f936e556a67440a2105d2ba", - "eba004a68eba1853732970c5c97643bc6a75e5a6592f7b3dc96ceda375b18f34", - "51d7759b1f14d972693c200b567f5cdeb1cb2321dbb9be2eff002fd4f1ef4c92", - "5015ed60caf9986627972f37d298d66b378f76f2e45321bc2df51caf9f125d8b", - "59f091d67fb8b267c071501696fefbf0cd8d64c8889b2d112134e1ee295bdcfe", - "df7bb2e1e75932d136c97aa43a043444ec7cab3ea56c1bd6b9e7fd29e2a45961", - "83e03ac6c59f75842bc0169647c6f67c07fe6a9086dcaa4f301eaba7c2bd5e3c", - "6f8b8616673d90582bca881786dc346c69066c98155805f1882720c1e5130b03", - "09a6bb93adb45cf9ca1529bf033ee44cc364d956b31b22a6deb9edcee5e13332", - "eeddbfb7a2c5e004a7c5793b9ea9d604dbc0657d7254d56a3ff1135f08b36d02", - "707cd39bb3fdf1877f0b5a12cf7250a880e3f027da82bad3553fe7be6f895f8f", - "2b401b31a191116c6cbc2f28d454064003664fec8ee2637a027b78666e88bb9f", - "5b2d02664f9e654e9e130102fd01a4f4273204890fead3ca8a7e4bafe481a222", - "3e995d6fe629f4578b071c0a360e1fe639d126525ff5c1bfe16a4a011d222ae2", - "e8866135da48dc3e5fa1693cf2f30061d36fee190bd7f9a1bf959db8321d47d9", - "543932d61d2c27244b4ff516db7e9fdad42f286cee80b3fc3d0ab46922e09992", - "d865208180539b1ac5d2be458a459d5a1c397089b5964ab57a03d8e847c16ad1", - "f038f1e8d1d3693b23e3a6887683b6be66a1eb58beee06b7d0df69ba53bce991", - "f4cb7de49c438a812ae99eeb36ed3e514c1d4a1a60e9002030a2477245d1cb46", - "28344d4afeaae6064a4b35788303a50f58314d97fe780bd4030d3097a16d986c", - "17e977a3fd5af50e0e83a02e73e3caff146461a6281cd29a8803cb94382a51dc", - "7b17b597f02ffe2a266f4dee4b5a91a664087ebcc0f982c1696da98f20ea7630", - "d7a32a6aaa31a5fa141a9630053d30b59dbbef2f2fd17bca09eb793ef5e8475c", - "829bea442c8c9b4d53b309cfc4768ff7aec26d719e22b968820f8cf49d2a4526", - "ae9b3241eefc3ad99bc4bebad9732bcfdf3a015ea793b4c63efccb49ad215333", - "99f0ef0b834815e123b5de622b2fe08b136bcf6adb548c789918fa2ce6172330", - "ae75f9e8a0ecad4665f924adfb1a725e1567ac63a9793c5ccdcf5f87a6d4f9f5", - "5aac93f3db45d33416e400e3dba7ec42c90f4297835f2da8975fabfc998608c1", - "3cf7bc509898213747f379a115ee14934e9e00eff759f8c46efa0dd8d5ed05e6", - "83bb704fe199da15984c246fdc11554e312dfc193a3f368bc0e9f9097a02bc25", - "7c3c4d7ebcdf5b1030527780e4749aed66b0c16e1d33faadb87ac6a3256cb8fd", - "aa7da2a7b7c45824ec6a2e4f4d7690e3b47573c818fa0cfc0f12e681e19210fc", - "9f1abcb1493bd51a8a8096ebfbc38c5b39ce3f5464d66f22d24622f3d06b2668", - "0e15dc2ae5abb96a6281e764ebdf9918604bb793cf8f91b539990a672390689a", - "63d61cfc45a94e532337532d2a2e5fa456a0ff681e258b6b6d64a61e479ccdbd", - "cd22c4862707a4f4504c51d4fa8ee12c0f079ab382bce7c80a8790a0db2480f4", - "b947523e13f01d99f1bf3b15fce5051fc81f2316cc0ffd71fa9a1467c04dc625", - "01f2ec544c943a5c99ed85b160e3e59b84f6b40438428f78ab892d76ed0adcb7", - "b6becb9558cc778d84a003ccd4246b5a66fd408c8c5555434aa30759e19a4471", - "a4339dc2fc3f8bb57ceca54664bc44d9f372a5db9b7c58b94da125196ba987b3", - "9c94ee17c8a5a6c565d109c7bc5a60ff214a22ddaef92531cc90865b550a617d", - "1bc93c17adddf088c68e47f76a70bd7249f9dd6575f328369b735b26b6fad4e0", - "c3fe49937655e99191ff5367fff90e85115e53a7383ede3fc057f3b0ddd43978", - "f127dc6a5857ff9c07b0bc2a0ca435a411817025a560cbcedbfe7a7ecfb98baa", - "ab3baba930071eb62e56ca7afeedb7bbf736cf48f5a676963642195df25f8676", - "0f7fcbbd516b491736262d96f9a8f4e45038aa8acce19003e401dac895e49cc1", - "750d6bd67c80b8be35f460ea3e86604e70384572907ba6cb6aecc98325321ba2", - "9c4a7bf5a361ecb3e8592bc79ab55ead1e57bdb0b86b4798414887fceb994058", - "9cd9647f5c0d14b5c11d1b1e0217b152a671283fcda5d75adcf35b51c84c389b", - "e060e86bc08d68a72037aef626f0660ecc2ec994580fda91c991963fb36b2776", - "5c93d99adde6d85cc226d1addbfba0c56022ce0c9602748d368cc708e9f95228", - "3a748118f968c1d75dd6b5982f4f6adbabf51962ae38986cbb9b90591f82487a", - "c511dcdad9e2a21fadb6adac6048061b4ea375b9da77da87424b2bcb987fd4c3", - "61c0ae4dd54156072be602591fec4d9f7899986b4a20d67504e2ae5cecae3086", - "90c1dbc87cb18cb49b7f6fd4cb66974c52e2b294c2fbf706268011d6f1138c17", - "98355c938346021d6fd5594546d3e9528b68ed3fd37fc8f6c68c0ab9d42fc93f", - "89ca648c5f9bd1d334e6ecdac112dc07501e51d6e27f1d304f68ff5e987d50fb", - "c62e779be33d5d7a677549326371bde4ea2d0ac052a421b27f63111ee02330fe", - "1c01277a3a5a3658b076665833160728dca7804bd3c4bed2691abb8b87dfdd87", - "c1200ec3e6a7d1bd627087a89d724291493159d46f9965624daa4c183255a48a", - "828013721cdd9d056e333bc48b45cc093f34781bbc23499e91f8455c4874406c", - "57f3877383e7e92b34cf1179fc8f535eb027c6bf630d00f525c49dc277a21d76", - "480ad856c70cf91da9ae833540dddb55139530b4d5b7ddc8bc1327efd6617887", - "d9dd58b5f1f567b0180d406accaef2c515c673e3f54e0c79c05672cfc464d006", - "52d8f9d88694cf97333c44cc66dc74d2f14e78c95b781cbe22472a2d34168e36", - "78f99c2dc66460e70a068b5f208467774b0c9aeda13d90fd55b34dee8345eacd", - "3d13bd588107ba3d57d6d066e5f2788eb46b46108d1e56450f7dec65b2a6a2e7", - "7ee01289c6e62dc5d4d8eba57865573e775e259041825640433e838efea6a204", - "cefb1f160f85eb84c0817f13a38cd7249460b86a376121dd0653114c92993c73", - "4efdbcc90d222326242c28aa35cc00cb061670e89e755bda07d62e764d18c15b", - "fc55e9238b4f386337c3b964c9f3ada7da5ea0c7af0b9f8febbbd739966cff65", - "73f84a9ff3d956425e7528a028b51ffc4f0f09ddf54a7bf338d1d1e9d55e30c3", - "f2f770264037c057577a85b10a0583bb2168f3f482bca00fa0be8d4a067067ef", - "9bf19663c031b1b442dfb3c4b2b7d0fa3fd54f15fb38cb863c861d6869fd1907", - "d8441bdbad80411004d8d07543b89b3d05859e76df5b28cd248b0038e4ed7e89", - "5d0e3e6b6624b8ad2d0206db3d818a1d89f2223c2823ff82fed00b628003a80f", - "22778113f3da7f60489611e40cfaceae23f35e4b03edf26b5acc5a74824a343b", - "4c0ce3c54b0c4aa495288be9f34b3e725cfdb364a793b9baa63c013444b97dd0", - "02767c0cd93369de6ed7a8cfb208ffa0683f3e187272fc57c750b75dcf83be0e", - "959e092fa97c85d8d95617a0c27ba03dca7877ecccd6056fb3699f461177e70e", - "21653a2792bdb75907941c4c6c9f87057504c0ce5b411517e65b2624e3063a3d", - "8873e2dcc6e9afe05f713fc036df7d2c77948293fdb9aa88f04e6e5c17bcc72d", - "baee847ce26507d761b8d2c1ef02a0abbba0766367737ebc46a09e0d0aaa5ff5", - "1e37e3e9c90dfb49aeabd34ed07eb54723e0a3f4681476a96515ef6a30906a63", - "8ecf27bdb04dc35cc2ded658e437c50722b800767a10abf4bb4c3c4fc0538243", - "f8d7accdc6689d4d531730e020bbf26e3b7d2d0b52d09c432c9a0a1c0d53db95", - "0439591f318d470784062de570aaeabe4b15649775bf98ccffbcf4cd4aeac872", - "16355926e4017716af84e2b61508ca13fc0611570378d41d11e71d577f70d982", - "3088314c2b14c274f876804053476a3564490625a17d2d4a82651582ebac0808", - "853150dfb053be506a68c7bebec42159998504c4beb54bacd481d26d885a99d9", - "816c46f151cd3a9bed1663aa37ab0be6cde6b604623d3af3100227731e5b2565", - "461e4220e635895257c98b4cf0b7a976828bc2d6988f071087a1253b7323c9de", - "5f0d17b48f3dd98a3a5db8dcde53f576b9592aa1403ddad04d065582db7680a5", - "4aba97f32449a3057beb83a281f5590bd4f2222dfaa335d6afdc6f44056da8e1", - "23a904867b81e4f8334e45f31774d18c37e7bbbf959145d0faec7b9500f03dac", - "2c4c642d28f7a2393d397b3e7d5342c2f59c7fc1a17d7e12809023dfe108749f", - "adae4c2d2e5de4b7fe505e8272c22880e2c537c1b5754a6cf0dacc5942337621", - "44c18c87b483b2a1394afa559162ef055ff83b3306c8b2fd67eb4181c90fe1a8", - "6b04a60927beaa73071f41a892502b8d87193e91b63c7a5cb5e5f48b42225e99", - "5be4addb0253b29ec2be3a45eedce92cb71659490afac3980757e2b069dc0850", - "6b42b5e3ad10303ef1056687908f9ed16064373e15cc2a30a89edb53d5d55411", - "67802648abbf13b3e3fcea74243c74c6a46667ab52ef509183afc15fd0919f1f", - "16c52f2a0a8db808d3b6662fe8f07f5e8dc2885f871919ed835f7a60f8018428", - "3d5c463dd2472e095f8f490914f15f4b975c59c4de699f78d79c67a589127b25", - "9034a5437fa08dfd2938d863df34fe4b38be3f0dc318cb7de387ba10a0dce3d3", - "9243fd0f7d701b6a9a896357d4ea3f3bc1feeef867a68af6432d156c635c090e", - "85e398216634b597ac4d3f24c4b6d665ba5cbb9b4f630eec478c82315651ce2d", - "16c7c1d61f57ab2f0c469c69d4924d3a3861423c25d64178505961e41f0a1978", - "76093a38309975d7e25eae0ce9211c007f545567e87e59b9447a58c505ba7f7a", - "4657a3095a5c4230a6f57fde184afdb2f614bbde08edb74034efa829a90f632b", - "2a3b09fccc645eb8d150a834ed106db9785149bcefb26f98ed02b6f9c5b88983", - "2a1c336ab7966d284f69863ca58095c4e0ae5bda160ab41608a460170b716229", - "14b5235bd2f32df3172d9391772a213b493e576e9adb1f5e08c1af487b84e0e4", - "eb6a92269d6eb7c17a886253f15772fe06086e28f34effdf5355974e02dc014c", - "1628f688252780a005c362bee25244fc05095b26165bdf7373f6bc276761f51b", - "3f25873ec79e8819e855fd6b31611600a55a725af240509ad49bae03fa141295", - "624d0c8b8910cd80b86e124fca0e4c7dd3c2e5fa686b7ab7a061c08f4d4e5fb2", - "0f58847233ccd2a8a121d306824fab86aa0a1fcee784c65e0c2be58b22a3ac6b", - "e8a9669e24e1aba1fb7041d3d91148fc44fff33dd9b958d25fa2e42fb9585c41", - "ffdafdfed29ff0c495e54cd8b4a627640458532616e440052417488343a716c3", - "218b74a4edb6832b527b2e9656ed82a99ab6ef6b2235b8947f71b4ab758d809c", - "c94048210beb868493dd43b736a70ae9fa24e175c75c98d6ba4a6925e6565885", - "287dc3b2d6662723f6171e868c1b31e9f63ef2b0a6ddbdd9fb7990f7132f2dfc", - "17979224dd26e03d41b19e684d370976977bfcac20de75a8fbcf521035c1ca8f", - "2bc8ad54842326b4af1bd7efeadeb34e82ff10549d5ea9ee1904f7df56ce21cb", - "d4af08de021be0096f3ae64aef6ab3947bafde9dc76cc5ae71478ff6db0f2150", - "633e675ed4ddea915322b7b1b2b2b22a9de0ca99df83cd1e7db1f4ff66cd48bb", - "4a2b39fc8eead1467df43bbd87902dddf19ea07887ba1ca75e44c1676cc4e47b", - "2c07feff4614060116ab20a9c7b3aeb35d638ed7e7fc9decb86ff71ec69a3422", - "932011366f9232fa3fec3433a584f9fb647c38be75133ab489114c4d13dc9c94", - "1acc8b0b6b9adf74c5648f85277d62c06f5f9ec0e99f257f449dca191b2a886c", - "43ce029d457dc5bb5be49d4f375dde4ac154be06a324bce019a1f8d985be3eee", - "801c1b8006734d3055195c27bdbc0b5d28c6152d17ae543eda2766da7dbe5fa9", - "de5d972e1b3fd319676b4b02bcdfe61bf012ca1ccad2313cd2d3f990bbc73f69", - "763fd1bfd1bc778110ae600b0626e4b088ece2f10c1c58c10b52b07de3df5fd1", - "08ed1e4aaab38431f45565abe89604cc635fc2aebf05fc5d1c751594f7bfd20c", - "e09d2a6994cc574774ecec33535ccc21557b717177141ba67d30911b4a53ad02", - "7e8c97222816d25b534f63d86963d92d8aec384de764f9afa1b9e68a10dc37ac", - "28e6219a876354dc780551ffcb8ec6ba96b173223efa035b1d3f966559c14649", - "92071f379a17e0761d9bae2c292426f690ee17805e573cb5bc579dfef3e96e5a", - "c529e31281b030fe162293fb826b3e207431b82ca04d26ad97ce172bf4376472", - "f5e17c46afad1ad285e539430e0c7b8901be2b554abc1d42517b0b79cef8fbbe", - "d6816447226066b56d1bb7328b14d44bf74ff43a74be06046da320e521cf0637", - "75b848393b21bb4b3f482abea8865174aa6a85ba76db0e6bc652cea678b7b164", - "1f4e5ceffb623dfe4575c931a2059a7d542db2269c9f1d59ef0ba4438bb5fa23", - "5eda231ff2af669f62cdd389aab3df015316120ab3a75dccb49c890121aba95d", - "ec21d1ac9276a6401ed4f62bc8ad3b17246c1bfa290f7fd39481cf3726a4b7ba", - "9668b9c6be165322845f5443a76e145bc0f40dd597a0e83ef84fb49a25f1f115", - "2bdb5b37d7a6229731c918bc55344842a26517c627f372e4173a77ff2b3a1a52", - "bf1f7d84dd8fc6f6b136fdda1f7e09b74bd24ee1496d43ee36551b39c9c16167", - "e3d75f00480a33f27494b8e570f194546c798352bdb7c98d1129825a489c32fd", - "fb9487d5c14f4e01f183bf854fad7e51c0d01a9ab3b7dbeabe918b5d183e64e5", - "09346d7c4e92ac3cc43894b4c8596e0410ede3002f6ea997e299696350236378", - "16055d6b1eb0b1f7a9d89faf87bceb8b165c2c5b2c722877044f36bfb3b3ee73", - "1c200af589ec06eec9a29870b8e3d7b3e1ef5a1720bb4fae392c952f9de9c17d", - "1e03e08c934ea8156d570631a4254fcc6e34e12d2fdc85c2e1e50601f6ba5273", - "68bbb9934d8d9981254a15fb35aff816f06f8e42a87964fa105b444f0cf3cef7", - "81876831600f7d19e9e86c4bb5dbc54a2d688c10c8eebe46fd32f0f79a594721", - "9e5fa910727a4296dc5deb2d9e09deedcd9cd6230d89bf56c6c7086a8b75b4a3", - "7e83740bb1a92bc3a414444ea412a0398a1bd66371c4da4d50a5740f22dfe3da", - "eba2883d08318e683a2c7c533bf197544398e580e2f0caa2d8109742e9c9af95", - "81951f9ceac1ba7bfe436f52377b6a6f65e14163ef0e383b8d3585b4ca15bb52", - "48b8baa21edd0d40091c4ce2d82d6246ce5a3c2305140078ccbead01e2445d60", - "77af945148d939da68da479162eb86ab71d997b75f2d7004254aed2989e7f7cd", - "a0db2781db2b7e3ee550c37e9912fcfaf9a20bc3777015557de2810476de9d5b", - "5f76fcef6f911ee1eed6205622ff275ec001fd227d770fe9b7c508f6b9d5f7db", - "b28ed39b863f8ab4decb9b3e15c1086378835bf6a4faca46003d1059418bf46e", - "395030914688e16b5e849dcc3a21d3d7ac8d50117b547a46a3c69929c2cfe300", - "15ff28e52ece5ee0fa7c454204460f510b34157f3a97bb8f6ce9976a055bdc68", - "11a8cbe807f06af1e2180448139172e30f68cb676dd0683e3c238fb0e7058222", - "3669668c6479ab5ccfa70ef97d5ab3f29dfe34d8e0aae527128125804898498d", - "46657ea0aca60ff27e7c8550d8f8b0840af113155ad9efb4369d438d3b291bbd", - "f5da7c9b7a1985e7d96779eec4ddf27b681746da5469eea367d75bdd1ae1ce51", - "e299cde49e0c925bc0abc433d6fde006f526695abba31eb3d18c086634266599", - "9d2d4a10cd6761fcc602337f888400344c556ee7a134c408118c8a54adddd2b7", - "57d3338cfb3944baec544cc803a2c12adf5568572c07bd1e0e123f6e6af698c7", - "1c8754699a520190f528c3a8f9e176cc9ecd1476afac418c719ca88c7d32f8a8", - "37706f014d7ca88a2da98a229c72030d64b892a4874bf35cd0780f21405b8dd4", - "7a3f09ca45088453d6bd5e1356dc92a82d5adfea19b02bbf855296603b458a69", - "69270c89a3c371b00508c8d5963213b5fbdeddda8ebcc88332f0bfa682c1b7ea", - "497e1d8e4787db7100c028e8bacddcc68c77d8019942ca970e6fa2c78a161bf1", - "a18032ad3969d6a23d5e724d4b1076990d7f9a4f1337524978b3bd6f782834a7", - "6daebcf9a4677e2f643504cdb9afe38fa6cef3ab7ca6510dda09dbcb8d137cab", - "72fe54c5e70c0fcdccb14361e55975681118b361c19b09f8113bed255c9ab99a", - "6bf533640023c2338ad23277fcfb6bcdd2d29e4d17bff6e544b511ea2397e603", - "fb497aef86110848a3bc285308a5f837e309c83d2f2e190500e64dd512bd7875", - "299c40900124d3a4b6a34a99ab6a5315c0d38df42275b1b121b7a3ba444825a6", - "69f9df13b361408f8d5335f218c339d2eb57cd436362a51057f2f3b8bed7d5d7", - "c3a7281c043df4a37d133c5807c4235c7c4813d4ed5ea47ab524c727827aa802", - "ffe3f75f53a5d1c98d483148bbea136301e57ba9a6adb23269acd66df75a7fdc", - "37c8e00bd001a791f58b5ce604e828c70fe796dace2e89e2f47ebcb829609698", - "8f6b55fcd02260af1488d758b3edb5e2685309aea99371eac76d9bb50ebf73c6", - "b805f90eb533c474d2b790ca9dfb1e9d175509149e4e334e1d7f8ba567f2718f", - "59e7ba96f921538459e3745a2ced6768150083ade94005b40444375ed0effbef", - "d48843c5adb7b71b1b90e844f0994b4614034e5bc6b1d992d55a0b1e4bce6bf5", - "dd2b95858be2b0bb0a33ee47c8451f3bc6bd3ff91a9ed0270793b7f87fbf29fe", - "e608c70d32eecca59ff3d706ba455683a2beb751f2c0384c5312a2364547b81b", - "c8781d47816260981b36351c7f77c2a9d3709a13b0a6760ef65e7801989a6bf3", - "be24c1791b8cf442fa7dcec2cf63485926c9ed4b68d30a931aba2260bda898cb", - "9c284ab7f0b41b5b64fd1b51f8b5ee5e88042b83d3881dea5926fefa0e599895", - "c190b1deaa318bdfdde965dbd486cb497ddf7317f7cdd556acc320a48f23f8f2", - "b23550ded1e1ce2b736fd46bbfb8ee85790f09164c477aa8e7b9cc74f957ac51", - "1517258504ba896a5ea6e0f8fe080b79b9de782a26de93b81792765729fc397d", - "7cc91dff460faf749aa17cb8198b5c45bda53c1b3a029f12446b388baa20e044", - "d2dfd0124d4e0332d374f2c41a6b213c278aa28e06426291c1c9e16da5544fd3", - "6f4908151fee0fe57c4015b946563ad46e5fda941db45b4af89ce02a02cd4d27", - "8f02e2482f5718e936b0f8181c03ca985841f3bc9bba44347fbf32c791df1455", - "0e18918b780e37988194610e5e793a1de9097f80ca1e18a3a8da9062f131fa03", - "836725efa14afa0806b87ef3f80f8097a6c4ff69717e0839c273af94ec5f2eca", - "7916fb06d07958e1c0167d0fbed9eb568fcbfd298627489995492944f53436a3", - "363185bce4df4ae3b180b5b0e9f147397745367ee97f5ea3d1e2039c10da087c", - "9c6eae02c01e31667cccc8bcb474803a2867314d953ae91d8a0019f6713ad7a7", - "62e4a5e4eaf5c678eacc9e6effb6ad9c11ef2100d2eaab14b009932ab12066fc", - "500bc14e204a31d93ce85ff791e6ff19499761049add6ad7ff807a47bdd2dafc", - "b044dac6f46e10730d804b23e8f96409c49fdab3ffe5886cdf8c15c242bbe1d4", - "e1eb54540c23625c42193cb2dbcf662c3ebc9f3240b6f75a42c81b25fb62b1ab", - "630ef5f2706d674b73acedda2554f7fb2e7ead9b86efe2b4247df4b96ec7e79d", - "17665ba6ac3a2eb6d3f24def774678ae7869b047d36f7053a2e114513419a22b", - "0205b2b5312775436cb4ca2054a6c26da17b519a20f36a60dcb78412ccbd1ddc", - "9ab311b6440e0a040e3058a94fd89049f82a325ab93bafa193fa6f1a436fda6d", - "b52c5dd4617c4e84b681d2920d91a2b29d41096684c98e21556d51e63abbd188", - "6916d8d921fe483d59f54beac85cd19c5a955b815d69606fa1d8367319b9796f", - "4bb61a82d2e19378bfd0af8ce91d1d89b2dc975fb03f44c38d37c6a1ecaf1523", - "f04a99cd2cacf267388f877690e3adffc9a2971b755907c5aebdfd2f72e0326e", - "7a418660ec8c4b433b8ec0be3f8ed4ad1885f9f7e7636a07e6ab56c8de642281", - "055731a99373bca47e442b5dff99f3386878be9a1323b993a6a1ac696c1c3ffe", - "6e0634c3f0fbf2d307229a29d6e08cdd045d4dc5e8804fddb78baf708e0a21b5", - "c2958e8c582ed83ffa0cf16eed0cb85455c2697607e9241f42769c0325313a4b", - "1aa439d12a184618fce2ee3d63c22088c7d6436d8eab2d476f970157fce814b4", - "e85d9677dcf9655485717a934d6be65c4dc906cfaf94643a8df204c7ac4ba786", - "ac979cd364c025971bde31f6c37674c70e6f7050631e170f6ec0379dede55177", - "aa100189e06fb4fecfb90865f18c1f0bd7e1d20e5e617dbdb41896da2c921ec9", - "ed70600b31afa8fd5d64f04cde0085dda316772204d383ddf082f4cc9e709a34", - "894699acd34a95db71a2ac9932acfef9ad5d50fb90d851597272600e72976950", - "57e0de781306be6e0296b9ed63b84e1ec6b581c8266641f14e3f90b23d59e82a", - "f76e45cfe3a111392ea9c99eb4bcd761b97e48c2c82242f5f05c1a0fecdfe760", - "4b905c3d3ecb1d732c6ce027a46d5f3292c04f4bfa20e5d5a0b3eb335ee446f1", - "477adaf56bc33590029b149998da371c57da336ec2e4937a25003279388f7783", - "0a8950319019fda2dd22d0e1b8beeed4e3feedfb6ca99786e12cba71ef5767fd", - "7b604bffc75c24e8cc80b4fcd8abdad226348d940f0dbcf36e8917a11a2f9f77", - "bc8f3a9437ce5f1c957be4ad09cb9cbf846dfa98267096029d7be04f509e59a3", - "6b0b847177d46873c68c7f4c3dfc4ab73c5a7e1302a72c5cc170531248612783", - "a049f3f8bc7973145f865a494567603afc9bc487a7d64cbe1b9f1d30712abfb3", - "0f45872137efd98561aa9db3ce9ed84350f8b083f64ab28048a761f3e8791ca9", - "20fbaba6fb15ef99a6fa2c9792b25ea4a4c00df52e55c48b742815eaeeec69ed", - "1307001c5dafb698af0aad6424129e9c5d92ad423cf37cd3b27dc3331f46aaf8", - "9de806a231c9129ec14957be44f354de1d96e1f7d1da8a904103ff0f212fc8e4", - "d7057f5df3fe60dcc94c8b2db020b9332546782f0fe4f398da137b2e88f29121", - "064c81b8b4ffc1bd67c1d2521b01c24ba108401abf2dc545fedab6e7e8373cf1", - "828ea211cfccc4b9ef5f465e7628bdc300cfdad8e1bde16e2540430ad242cbb5", - "48531da4003040bc717a8c5d272d4abc9f616056d8cab8b5e21e66bd29683fac", - "832896230ee5b2d2258cf8dbceffd66204807ddf61353b39f290a2e9420db44d", - "3ab9ee48ebd06be9d1fd0b16846cc8baab838b03c4478b82e3ccd72494baa78f", - "547c89fd7292537897b6932aabeeddfb64df53ca8ca7d75a027541862b21d5f7", - "a69838e168e653d7a2dced0851bd30753c2495eedcbd127756a90f1d731b718b", - "7fdb8331fcaf8d8ab0f5f67026505899c1c425bac78df7b96e0acc972edc1cf5", - "de3cfa2be9af1e8cca86bf52d060a2140704d5222dec1fe2866e8690a4948ce6", - "62331e4657970ad2c011602446606da672725730cf1220adb5a48cae3d3473fd", - "692009baa31a9aa633184557a6e3edf144016a432198c612eaf1d3e3eb6a119f", - "485840153c2aef3c65adc5d6e71782e3ab8452f67ff2bfc95238a2d819a16281", - "acbddb8853a797e3742e2439f2b418aaabec213fb195ef5e86ca4377d3f1540f", - "f1454d2dd9ddaf3119b2164d48a89a6e9c6509ba42a8905faf85ec512fa51031", - "03583777fd903a2f8a481a3c2d8085359cda9bd7b2e59007b97ba397c2a43653", - "93e7127a6884ec122e9b2f10fc0f8cb38104bf59dd6a9380d62280614b263ff8", - "e25f611b78c2d3230ea4d453ddb32dd324ab83093ff797832cfc3627c7da418d", - "72f9223bd503788f20cbae177c4ac9e67f19b6391cd926983de9a7c1b47abf49", - "53e250fab2b805db0786dc2c6ab19d5a6a8789a449552ca555dbac5e2545a560", - "6fc27a81ad6e7483db12761283fe9c598f8c964b83f027478e76e07091d19f36", - "43121350a019178bb6543d87bd58e280097b88f39a4d5e54823184972530917f", - "d4ec3e2ed1335f572a33e7204f8904d1130cde140ab98fa38d20f6b7a7c70936", - "4a88917ee6ce72b680208819ba26e1944d45edb5a0282ee779d448bcd3470e50", - "ea2643be14e4c0dac67c36fd04e164080512f0cb2eb6634051e09d600dd69a83", - "a2551d8515868051cffea548428c45fed50e5674e2408110bfb12d89334acb04", - "cf3edb81cd41a7dacd432595bf4b8457dc73c432abeb4d39747ba775bbc68d86", - "9490a375e6e8ca6c1636804d85bcb81bd2a9593fd0aadf3fc4814d7d61f47284", - "38b7399e99682e2c3bc57677bfca6a1207d470ebf20335df13c67c150c76a4b7", - "73e77a0e593b90e37a929557c2b20cea994bdf7ff05ae15f18748180c26e88af", - "d1995a9516a9ca0b1fd08a2ed47ebc8c8a9c3ffb30f583c1ad0f06e11d2e5c49", - "fe12cbc6c7e454aa51675b75083b3826d1a78ca50f748e356871193e06c940eb", - "1639b7a5c61a3577585416b61c052690bdf29dea3bbe9160974d36398bfb86d3", - "376e60a40fba34b36803cb6f2e42c0598be6509e457c838ad83c58e1ac07ce30", - "ad992df5a8bc1c381de0152842bff73ad33e1d8613d3d636394724e9e536dc5b", - "3aa5668794750baffa9cdc6026d9a28d2ea5fba6482b5d239c5bf94c3dd63663", - "662f7d2b5cd17c717e30011810b49cdd4dc7c82449c31591f07ac66cfdbbf068", - "e82baa06027f272bc97ec1a59fc8bff9082d52ef4d7ee1dfec48dcbdd444a38c", - "0b3da2d8ac05e74ee057f8092e62fe544a6584217b9d48e18db199c70304161d", - "bf01293817a140a19de973cd28df5e96705f32fb1d5ab248a24db49a80c06ab7", - "55dbd415abe2aac3308f1efbe9d039a9af531810b5b3916fded2a0c9a1106120", - "40f1d1cdd519614efaa3a54721737d240b8d0fc6bca1be6d65294c937114e8cc", - "372a9beffdb7fec9f657d3243575246ead71035b736f94267620facdc1bedda6", - "6edea5b653b751659b70ef474ccdccbcba28e65c3d224a34533930a6de065252", - "039533b48317c300d4c846586c85851bbdab882b5d9b2d95b7a20c134c63034a", - "d5d8ee95866d9dc02cd7d3c4b5d41cbfeed2323136b0c292e53c126811132b2d", - "2bd7fd68613d0b84fe65762696e9d5056ead7c7163a1843118eabb3c7f9000ad", - "32ba3c26684ebac54609d49a04189c1b40e54bd30df11d6e8c6a69d1484b22f3", - "f571547a34c8ea536bd3593f89055e2430fe5e01d409ebaec55ea74dc5190254", - "0fe66e0a2b96c35bfe173a516cf8862454a6d96a1fd38fde0cf73bc702b02704", - "ce7e0bf4209c7fd074878407b2943fb2d1b3ffb189c0d3dc59574e476c9f7f51", - "d1c10975910a2570d21ac55b347a928be770b28940528a5d08a741ccd34af235", - "74a9b5e4e734391a808661a210d1156d3942d5860610307dfb810bb74349ec44", - "ded14d2720ce506e3e0e49f04ddefc1994f89d6d72d0c7ba893a6efae5b40bc6", - "24155ac8b202c7bb998f60ee0ee10d9a2e7920530ae81bddce8a79434cc02a28", - "5626a44ef75573efbd07b51e4c402428e327069479a329df00f8656457ad84a8", - "3a9cb66ab0129877f1c0009dd99284de966b5f9815a7405bc5387ba9c1776538", - "cf0c5d932fbe39c9da9c50c3b7f76250f6524f3ec0cd894b7f2e30d4affd28aa", - "b080f8cd7773bd126c212833e569a8016fd922f48f8c6ccf4eebd93ed68b4cbb", - "3ed95018786828966fbfdf65012cd80ff4d4f7f179c6054f31445bfa9b47bd2d", - "6954e5901bd3c6e76830ac487e663b9b2694d4444d49eaf4e07558c321a14e7a", - "9f0814ffb25a051fca1c593749436d63dcb865c8ca43e457c097d54a7d6df7b0", - "48b3e458fe83d237fc6d7742552e93b4c061fc02ac54e78434462f0210e9b848", - "6630966e0a2d26a233190a593ab8bfca80608cc18fd61ae0551b46cdf3f6d36a", - "bf77403a6b5076c00ffe01d8c786fccef01b6bea6003173198588dea55545d9b", - "43c0a4a4cd000c8433bbec45df2863569c403e064ebdc15cd71776798d0530e5", - "632817fd566a1de7edd62cf0104a36022e24330fb53e86cfc46980d877a09ce6", - "f583162321087c049c5a1a48d08a1c330dbe810019f6b6131e2ae62717fa0ae8", - "59b4c41353a71e4cdf437e7ec137525c308f354b8dadb977f3c98936eccce9c4", - "4e593cc0a776b294f3af4b5aab1819b6e43b621023d7d656de53aa5d348cb3e0", - "7899d9fb0cbbbfdc736d01d71ef7f803fcbb930ba1a4d3a0b9cfee6cdd3be904", - "28833aa009ab38ddc10d6d09fd332e8be800b7d3e8d5911f9580cb7a30188c52", - "29a7e6075e01697e4d1454b4e7c4b66b48ea3ccbe5d6d83834a04932aa2ec629", - "6d1ef0abc5e4062e83fc1115869a67efa12aebb517420c3fb175bf92a26ea845", - "6f6a5d5fd73e4f3025a2b67595e9b9fa505936dcb5c0e7bc6b3d1de1eb185a27", - "70847d43dc2a99c042192c8ab1d0a91bc54e77327c45b16b387c0686cf9488df", - "99904563f503f2f6820ec53be0d90b23038eb1793d64ca101f8ba7234a2ef941", - "ef776ea526ed70415880556aaac876f9505ebb340228b6d0f65e91d83910d852", - "a7253e0b5951a005ee7ecc436049c9c1ea55a118323aa596b7dda039cb6d07e7", - "2024d21cf61b62b0b6fadd85b94998e2bfd04ac22945d42467c21312dc7fcc20", - "b001dab60d11b843ab835c8114577d171ca580a432fdbfb45d13148be835c803", - "6a0ec869ff5c5ffaf8d2c407190a6b6b7c77715c11743cebc08be5995d69803f", - "e879e6c9c8b1f450097773d8c8722c64843d78d7667e487b6dcbe9f4a51c4981", - "9cd2a5944bc20053002b619a45e26502552f190f9e13a3dc8859f86065e23c14", - "0e5a2c8b45aa33ad516e9538a307a7534ba46ef1d4cbe67d228651261cf57772", - "48992f3fe9f5b6e766534c62639d80f0b69bcec52ff2107c4637dfab18b32386", - "ff4be8f6e289015d0f633c4a4dbf1aa437d79303ec11684baa37a6e34356670c", - "f0576d8c4dfb50a12ea00b59c7ccc313371bcd43e579899cb854dd1a55506c92", - "5aac4b7a16879933c50a03e228afb9dc0e1e3e007b3fc09b6f70b063eafa3858", - "dab71b46ad049a481bfa2cf91c62b18d81798d91772b10e413d40c5d5b511fa7", - "c23f58248f5d6bb99e7864b009375640369e65e2bb82277947f6e4fe4d1604fc", - "c455d8cfd6139e325972bdc23025cda8f56a9d5b2e07525db5417d26039a5fb5", - "4a480909bfbea880a88a9e92cc97e409496bb8584e804a76f885daa91963917b", - "84524f289ab5976ae685dd87dab05774b35c20e9108757ebd1fdd3ead4714db8", - "a1c5e1c3dbbb02d4743a8aff29422b5b12a418cdfec61f1aef52285f2ae7f99e", - "33da5e7af1c56fb04675aa572bad0a218adf2d95b3f3f9fd73f0691f394cda24", - "402165a0455f1ac70517bc25eebbe9be7713df23567b0cd4c71d3aa1ca7f2280", - "df55a8f18955f1d36491d1c120e7c77d6d32c222ea6476cefa8b0d0858c27e10", - "252bada31e2f0787f5cc1310c2bf5b3490b0ef13c386da99be015593bc334fc3", - "6166e03c92488b6eb0013f50a33d19c896994f35cae36d16fa25b77f1fa470bc", - "af8a20a39f99b0afd6de36b1c5fa6897d7857903798e5d824a854b2addd14890", - "0b508789ee3a8d16ce414b154e147437098432864f61dd8437229ec280027fea", - "f1d1cb0be2ac1a2b9e5ca94c3a51d6d02f759f4e63d65b37159dc0142ce80131", - "e58ab97dde60b1fe6482f3e82181a75bee5bc918a0ec3110285817322d07a1ef", - "3f8c036384106c0f50947ed08fab4b841995e1399e1c073899801245f7dddacd", - "948108836dc321b442ecf762b6fe9ca76170899fe3d7612c789b31d40fe00965", - "045b49752b0a9000d770edcc7ca7eb72207bf9fbe348787906f76e08fd1da98c", - "3d9cd853958f667e290007c268f8a3edab7143d84cb0b833d967195e6910ce1e", - "8ba7677380bc6cb91c299926d03abd90a745f0a7da39dd8a2c9a11460b126263", - "c4b39d5b200566b2e06c3adeec27ef4f04ada48ba51b6411d4e16ec962fe5ba1", - "dc8b5807e6a9f04780cc107a14b881482824e67eac270f491d43024a349c4deb", - "1e085dcd4f4d145a853cb457e732389208a44f829cb335f14019ce8622e7968f", - "442d602cc8501a3a5a0f3e48885188cede8b556f06b44a8ddccba3d499f0cd01", - "209471ecd3e5eca39fee215dfd353322ef836d74e1ea1a1ca13e39507db21677", - "915bba667edfaca7077e92c22fd76c09c209723a874219de7d99d3cfc30a5017", - "e390293613024eac61746d16a11e52d96a101049f8fcf22b57bdb9964fff8452", - "930083394389bd5de34a97057bfe4c7b88c20090711931d842577775857b3900", - "7bf1de17f0e7a5111a47da7fe17d5839e70e9f9f2384a61648353edbab774f1d", - "ca962207523079cb12b8d8cded249bf803b2fa2308dd3a9c72fc3bc9acca9e68", - "6e56ff6f4a52251b670da82fb8d8126ef1969e88896959d04d641b512fb06d2e", - "f6cb6571e74664d2dc0aaae21bfb59ad0fd9bf9be520e04c74d6dfcb413bef07", - "bfeeb51895c612b937705b8edc33b6a02df10f6e749c4c9b905f9baed5b90c6d", - "18d5cd57cad82867695b20d313e27fc20a7f0f00a6500698781e100a486bc688", - "c0ad6175805933113c99e0df79b4e200012a0839870395011ab05fa8071d256d", - "637c8c166e021213c6fe4ea0783ed30570a98a9e31dde2725a8fbf3ebb0a638f", - "1bb71699fb693a1cb0f2ff9a4536aae3f9b9ca432072a27f579059af0779d3e9", - "f747c6b401e79522dc5a9ec755e34bf2c509622945163a9a79ab0277a403d08d", - "2bccc58d11ee7e35cb7edb07cf5b0b4dd6b075d0291c51205f3918a770826746", - "f6ba42563c8db6c3e52fbee6264b2b4becdd98e4bccfb1fb01bef30ef7c70027", - "6d97962d34e104b6c724a9f6a30b7bb49965dbdf3dd19cd318ad21d9358647f1", - "f10ed68c97ccb1954a03222210f3c940d7c38a67200235ed0d9079aa1466b90f", - "6dd7b8d96183c223283e4ba5c535d312155ae335ba6a9dea34a4c2d08d2fe953", - "fcd8564aed0525e10da33e120b22735fbec1b6d38ede47923c27d11d2850b27a", - "704d484f2ffed9fe42982cc7fddcbcb31fef8b0006f3d97d9ff6a2a551e2ae6a", - "4c4a47ce3552a5dcc615194b6b97275eb5a717a955d6b5c668e04afd147fe1c0", - "028cefcb8a89dc5a0f5608ea9181595a78a8c43d2a36f9ae3bc3e8d7462f72a1", - "9c3ce4aac0282b8ef3fa1903f35e6c0774bb4894aaf53f6e7262ad730884feb3", - "e316fa8a377c21def8134e1b5df124554962f9de16caed4cf51881554a7e2e2b", - "991782100d9309fa7a389201b6ee02548ec3508ff56b80965b5786dc390681bb", - "c8eae28ac5fb4ddaa4ec7070efb80c5d06dc1904d029c5f0021b434f2c9b00f7", - "24dace601dc28b6a790d945e6ca48c4638c7688133b352c399ef3ee24cf773af", - "43f54d8b43e6f88da71056bfa2dece4c3963aa7ec7a5848df20f4920ea1cbced", - "58e587466f41e433d1ade12c7b5d0b0ab132c9bca7246c12498a310acf90b4e0", - "b5ae3cc58d20494ecf7df93833d943c1d82ab37ffcf4d025a77a1773e4f8d58d", - "54b016a87f44868a5fe62f3b9732bb703a17d2676d04afa2e388568eed38ecec", - "56fa11012f5c9f9f3056ae8e909590e5bccb3356d22e0f969534bfd6fe51c441", - "264839abaaf7e57e4aa2b7b8987d483acbf8351d4f0296db546ff3d399a69c1d", - "e5d268d48158a0f8177878bc855327777eb4dfe2d1b33f1c1e1a764f041539d0", - "db1e64615a588bef6ce61016d23b62b697e4f37707bbe884efed91a15b504b12", - "62f5811cea5b24f9744c1a2b9e139ca2e424e2309f879f546d0c7eec189a93c2", - "449c20de95686cf9c9b30b643237fefa4aad1d0b73dc676302f92f318dd54d9c", - "f8465047e829b68ee3bcf9c159f34b3d8145cd30a7a4a17f8ba36e52d9fee649", - "204533fcdff1e58bddcdcc4fff440349aca5cfc561e44f2571c352ce657d032f", - "b284ac9e38ea5ba82522e35241ccf71a60c4972a3c06f97482becbbc0f51f59c", - "0633a5257c27394e9c387243175f469e5f3dea8eab00d4c558b0be8b14108eca", - "02cfbee51297e317558e252e3602e39ff84d893cc155c2b255bdf86fd8377f58", - "06954446a404e23789df17953e6ca92e47103b97ab3096a7c36435757f9d1766", - "ac259476671bf1322f8ce599f067ec2110a4cc600f951ba6e56e97276c30fa8e", - "d0d72179f0a0c846fc27814a22bcf30e4bd305fa80713b43e1d18462bfcc94b3", - "fa91db4d45e02c17dc7b1705774cf4177702bd56f3b17de072bd068578796bcf", - "7b9870694ad86586ccdcf75cc1aefd7c914a72235b0c2b953992b1ddf988d916", - "e185aadaba31f2a859f7415e75e83fb3a5baaded3f667ff3bc6a33228bf70017", - "38902e9472930c9bc52dfbf7e5b77b87a8d3cea4cdaf31ab1ef98f976e4c3caa", - "623bc9ebb94c0bb84419d3733fede38de119a31fdb8de6f4fd63a444b637e2cb", - "0c1366181efe6e70aff359f7c0aad0540ff3012ccc3c4fb318a99859ecffb8f2", - "bffaecb046c95d6993cda02bd8dbaeaab1854e23c65ffccf255c92240c400bcd", - "ae7f300630b62eaccebee46063d54dc2b3fffdcd5d4576991dbec3d7954e704b", - "beecd413cb0fbbcfba51c556cd3ae8da610276dde4e375ecf466f2112fd0d4d2", - "c845bcfe5d261d315ef63d23f2efe21529870ad3fdcf6641e7d4f9379e1a457d", - "ee033b7d671d19dfd27a7b23ed17f351b7b950ebf7d4d9d8a2418fbb42bf0fef", - "36b7d48c400a4ddb644d131b04b9191139fd98549139f0136020393c9b27f7c0", - "f6d316f7bb203d9ce23ca2c9bf248560a233e8d597c5ce90275e02292858f45b", - "6dba4768dc5ae4b459a13061d41708a4e72e6e5f424f89d0823565b28bf2c223", - "14822280450b4474150e97d7775575f79516045f121a5f2f6551ce4fdfefb607", - "438ab1aac43ef4a8ab35fb8cc80091f38d0aaae74216e45b74d1256a8466d72a", - "3ff4a7e174fb16aabc5964ba455f0ff0cdd268c1b914ae68f5dd34fbaa0371a0", - "10882ef5de067ceb10c82c7b82fe40f87abdf2fbb411890faef375cf531c5558", - "662493e4f3cb682730f610e13f739bd469da806af8ed46fe6009bcd6346668d0", - "de8cb2ce9ba3a10d1b7301fd441a49a867026f59ad2aeef39d383e1fb6819a43", - "af42a5a505ae421e8f64f1b769621294d288bdc6437ea1e0f9bb44c3c47ff583", - "d2f2529ac9bed63b19cb179cbd2bf72d163686a40c0ddd81e93151d42c43c517", - "5a664c35b0c45ab00f26bb6aaf48a597cd5f060772f8b6a562746727d2291de2", - "28649b71235b05eaa5ab3d864d65e7af11a3e91eefa62b4ddcb5aa96b172ba51", - "3b7587ba23d04918803f741e07db463295baf7556fa6b02d31233ba07ee0ef3a", - "ae10f025169da18163d14f08cb7877f14d69777f2ce874f306bf61864a1dbcba", - "ea308acbf108feb922ce77b91c65fb2bb4325c38c4406e59a98a58c3ff895a28", - "3b30fda7f1530131db387a7ddec3e32b1a1e60ff0a8b36896fee79db17e41e32", - "305714b2ad37ca55e1f5ec7fecdcb9ca490c1d50ecba89c984ee79c7872f8036", - "5af37a2c41bc29be483ca00fa8d227a156e1f57e3816e8ebfae35de4cbe72600", - "1a762ef7f5883ed09abe1db6844b436fbca351d592f2ce8ce9bef6103683d18e", - "a517c3c24d2c5230143fec59bfeb18ce1d990941ec7cb2c6784ab5b0d98e5a55", - "082a12d95061a3497aaab2b623e524da1f37d2078406ceb799d574a24d4bbc6d", - "97478deec0dcd7916065d2aceb36103c6435af9037075587a1933d140de3365b", - "c3199d235b5d89bd36fde6c55717661bedd4ae301d44af5f893983809a7960e2", - "80f8f850de3f57c866d01507427c10a4d185c1cfc4cb5b86ab72463df17fcc43", - "dd4cd73be9075d84a8c29769e4af17c50c255d20f9338baf8addccf888f24cca", - "bd684167b9f213ae2551066195a227bb4d70889199f93146d4fe1c182ebc2f77", - "08beb99b90419d0fd2fac86ac370b64cdc5a20a26a8f5c6027df71178bed8901", - "2e481a1bd29d92e2afcd3803eda9f6fa31c8a598afefdb72a3cdde444e52ab29", - "7931ca1e02920a04a3325fae6205ffd47349fd902c611a9e8fc07351b65869f6", - "3c49f53f8a2b2656a539a4ed1ece6b169547bf9f79d6cb6194167d3392191678", - "307857f2063d8de65af8090791120d1db1821de20c1b0a3f40a11642119f1985", - "438a0c3ec518f9d4876195a729301ff4059c1f63483971887dcfb370abfb1c37", - "ce2188d8f10e3714feb66b7085a463e540851d78c2192424e52bef07d7b4e6db", - "d2887dbc929cecc77408e623afbdfab582e220d87c2c377062fe43e9d7240d04", - "df309791920ac0ae6cf3f85bc3041046a7873ab09d5cba138d78d3c63275b0b6", - "3ee40037eeb596fd3b84e90ba5dca6362ce0b9a8301ed226d9842820e48b72a3", - "cadc01430aae1119204c198c7f9fa48dff899e02303dbe4794df41af79883c5e", - "f2396ab2a4b4624bcb76bd37c309e72753db61cff3b7d2c2e00061bdcacd53d2", - "bfc216c19f4a9399198e59adfcb5f0cf8da6935ffddf07b8226e1b04ceeeba3c", - "6eefca45d3cba29a5fc27f1fc8d6a224a308a8610ca9dbd9e0009d7fa9899809", - "d0d62e488c818b2a1fdc28d0eacd83c8e6afcf40652c287545de9bc291614a58", - "bf656b4012b786f5ce48c82cb5184f6417fced50dacd3622cbe2f2ce5f58e1e9", - "148ca981171f76485d7d2b7fecafb781bbb214b8810ecbca619f55975c19bb92", - "6dd206ccbf1b004d49530c11e09f29affa7cd92108f4ee2af6ab34f8b9adb645", - "7253364f1f9dd8fb54bd15c92cee68ae230a7576b5f8013417f24f5b35954c7f", - "8c67795b4a929d7f0fd5db0f57f16914bacca7cfc969a0f86c7216d81036d328", - "3b0e85765d2e84d54c3e0b291fa88ff26d2b8da1af38e9bf6a61c6600a0e5aee", - "087651e389778552643dfa658c59bab2cee4f1091c76c6e6baf7f01f0a0e1a8b", - "a46410490de74b63f5d5a8753a914404719c57bf76429cad3187b9bcb1e6c57a", - "f91a88b66564eee706cdcd16b964708636d34fd9c233409738412076b523474f", - "15d0414c4fb48ec80c85270eb056768b20aa6ca9cdd2faf12dc89d97db3aaf23", - "d1c24314f91429b506530355f2d7d657e442728905068be37f44723e0a7f3504", - "ee4585a92adf70d8ff48cded0f86600d5f5fb1822afcfd7074b4eb664c8290ee", - "97dc200fc36eaf5d22a62ca729709cc405114613919e4d6af9bf802d3626dd3e", - "3cf00eb0fa5abcb0e9b761875e43117ae7b6ba5db0ede7ccbbd25a5c5873f47f", - "f3324054f08dba360e4d96e42d29b216d9e3beb4c39784ae384c77631019038e", - "71fc2d52318fb7d59a9b3ed659f00373140ab407ccd646287536a0549c06b262", - "42d3f0bdc39daa7f3e895d28a831931fe98aa8df86818e78e2b9873514521c52", - "4aa3cb3d455056988fe27058cf28a111cbd51eebe52aeec8571bdcf86b63bf82", - "04916809049cb360298228c64b6ca546a6030e598d6694d1d7d60d06a16e6859", - "b2d9d555220218d68da4243648388744a3fa4e339e577e9815f817923901adec", - "710f2ccb59bceced78a67a7fe264cfcd78298c1ecee14f67893102b9c9de02ac", - "733b61b0f956f149d82940e3f7c6b383986166e4263b6210ebb44afcf9cae2ed", - "611ddb8354c9609f8794031c2cc50974def7b91e0f562b46a5e62a81fb277552", - "1022c0cce0513630bb9ad91384e0eecd200dd87fe4a2008626dd96ff366fe137", - "598857e19c8e90d9ea5fe0c75faec6557e4112cd85411b00cc483d701131a35e", - "dc970ec898ccda7cc470e01de13c383150f5034b286a36ba8d7f4e3edf7a6221", - "11203335b50b13f2d455a659f8c74347acc361c230987fea8d003a9cc672649c", - "051d5338ee1bfbda64bb1ff0344f6901fdb10459dd1c6a3f11749d7014a1fb68", - "92afb311db7dda2d3b561288f0751b25e394e5c73798ef8a49bc895314343199", - "364c7c6041ad1364fb778cb0429946c4897477553cdf4db15470cb4cf71aced4", - "6462f1b2aa9b5cadda227067ddc999d8716a941a9348c35167821ae1774d2ef0", - "9576d0533e29f5d64652cab4c2b7fcbfbe37f8ed718e212f7459169c3725e5e9", - "e08ea891b2e86cad3a73b0bcd5604115ed74071903fe7d03beba9ff1f28bac0f", - "fa454415ebf286d0802593a11d64aa21a5d376a2e154194ce362bd6b2154c006", - "da37da45afcf2e1779880a02d5f72ca0a0fe4fd0e51298e9633ea7bb9635dd28", - "b9198a9408524bc81597ada10cdf283cd29a2f1351fbdffe7d29614ff850d988", - "9c561b0ce1dbf211be457fef6918efaf76f9e8ef45a0dda85811efaebde6a1a1", - "b8ce2b24a526aad5c0b6f1bd06856cb7d2c70e0bf8a58e145bd21fb898d19ad7", - "fb115b8147da3841166da97d2ab9b41b595739274ef67c011ed918ff47750753", - "8e60be6566564e4c696e695125c4b8576a38611949ed2083ced435b5fabb7be0", - "008b4ca85beb34122ee436b5cb2e35ba11ecc9a94a4c3a1229b2125c92708dea", - "f7dae36403939746dd3023f839dc57e2de58a758ff1794a6f93898d6b27a5330", - "3990cabcf322991243f0355c9426b84fe4962556a3b6f8865975744b594082ee", - "849a242b7e7e5f087d85a766e7550deb20d46e9b68ba2740f4421afde00a0a9e", - "93b810528bdda05b0ab0dd2517cd6a8b5b81fe8dd8696845786030959962e02d", - "5e213778c3372e1e42b0f24b762fee5645c668af2b0d5f4d717703dcbdb914bf", - "a19d46b3eddb0f3e5d77f49af2d6cc95ce0d2d5e0bc0156d4e6ef2af502b49cf", - "223942fe96903a79aff8f2cb8f462638e62fb30254f38dfe277b5ba2c5b5a7ee", - "f57f450eed73b78688f487907372dbcd20bf336dada87356002b59a4737eab2c", - "e2f671d633d04b66cd5095e1cbfe32a8c756f157ab7f35c9aa30b23dc0b7f2a4", - "37447ce5a300e62e29aea4af4b156b577400d0435f94e224c74d75822f5e5917", - "a94cefbed970abd4b702447e662ea299ee343a7b98e8c17fd7d801f684e11300", - "94495e1e2bc0f93b84e1cf2eb7eecc4886deb9d9954738e837ced58417e0d5fb", - "3854112312d50b23ba7ea19e593f4b29bcc0cabfd9b9bcb553a1734c876a4b3f", - "255b68ef9dddece874ff24f457a59749e286185e99d65bfc7dc4c244850ed054", - "a8442402af8fdc755c26bc290ef3bca6058f2e6efdbe9d2d78000f81ed2893a5", - "9a838ada86e9cbf13f6d014cd86eba5c5ad3e27220810bbafe2b77f0e22409b7", - "c24ff2e4e4a1cd6a4cdc36ee3f4357d67ba4e4b78ab3a34f479b7de4c8bff954", - "0520e70a716e1d51acf050740e47e4bb7dc294956bb2a2297a51ee3c8cf3a632", - "abd445707538bb910886714ea25d00c03f03e93fcb407a2e027696e92bd562d9", - "1b541afe44552c2246bbe4eb12b9ce0cbe5d997b9cd6efc016c3ef736ee2e108", - "4344f76f645aa24d97ac056ae7865ff0b17fa5aaca8bdd0c14efd81a378e3957", - "40fc55632e126dcd77beed3022591c6a9a2ef2766625fd39ece533d9d785152d", - "67f6f9348a7e89066bb78d6359f3230c65b89a5806e56b5a81fb7adbe6021ffa", - "4b9fc5ffe21a90a7c873fb65026e5dd61cbf85e56a0f051fba0dc09a3ee87108", - "789091c4eadc1478d1f701aa62784500afaf69996b62597f76aeb37fa5a23047", - "ed22c0881f217f73986290ae31c5578a60d9d9498c96e044b7f75313ce9e33fd", - "2e6cf50bc650a790de46aa8d358cf9890631d859237cfc0a0d3214b782757ae9", - "c9b32b38ab1e723ab032e666e32dc209b5924027d0302b7ea721453c62d7e293", - "50e89403f15a461e8fa03a580cdfc426e7e657ca419b385d8bb7f92adba379cf", - "3a7cf8f881f17517539187ac0ab111ad2f9c4600b1690482145d59208a498100", - "6e101f6a92071ebe3a6947a562d4811c675da86e4e144eab27e57093e9eae8b9", - "4a07705e8f56a10c53e0ee3bb71a437523ad482323be26ba13532084136ca0a6", - "83c343319338f1bc37c42360ae0d43574e456e581ce0d0d77e86d7e4ca2fb2c8", - "c6af9c78f7903ad7684beb1dfac9a6659069d224d9b7b8f9a51fa068b4d8b5cc", - "43a2555fbf2dd581dc146dc45d4fb6637ac3e31dc946940b7fd5c4c2c8e77772", - "abc029a36e3767ca05474189d8ff4d67515664431ad81bbc29c7644c72c7ea7d", - "3be87857ae82e0ccb1f2f3b6a09acfdf6f99cc1c1dd3b1946b51376c40992023", - "21962c326c092cf430029feeb94c8ea88d94f758288bac2a7432e9595e0d70d7", - "7aebb1497f44533f5ce84fe416f7a70440263020d65526f303da349616b5a552", - "a033c75588e70288d0841c398d96c493a3ebf1528522fa6048266be7ba5b1f2d", - "4ccabb996b81a4a78f40b8407e87ed524d2387ddf8e97a20c8f31a9b6c813791", - "da5506aa0614aabbdfd993fc4c32cab73cf4ca8292f97f8f25e0a2da46cc9ed9", - "fce186f5ff2c839f510ac23ad05c4b0c2246f69979665afbf90f8b242e6acde2", - "a1bcd7e37b0dc5bea661495e092c1a3b777cdf270bf8b72ba53b1783a7ec93f3", - "0dfa12a5626c06bdc45146f85eef2d20ee833cc90403ba0b82dc5dcee972327c", - "4c4d7fc205c5a721e2bc81629305cb6a0dd923d28bf88011ded26ef8def949ca", - "b96abedc1353d05f1496ea5acf34e2bc9797df7be550655977da2db9a909474e", - "620ba354062805193329ca7006dd72bb520710b1568c6f150d7a1fc7d525f7c6", - "419eb3f33797352210fd00ed396e2b245c4dbadf4adc603d27487135e21dc0b7", - "e8582f00ec9a5f5bf03cb5c5121e63045bcd978e57637868de769400a63f6dc0", - "e48270e9474ae359730831a1f7b4374b6a4fa9ac5ba4f40a983552de450cbabb", - "0240333528c65ae02d408c15d61d67081b000d5c00ebf70469df879d95debe0b", - "ddd8e82c2a9c8a61d4313a23767f7badd67c91870b33e6653c0186d6804681c2", - "6fa82f5fbc8160a4a22b7e57de21741cc5a4ba418bc9a689592affc0a5bf5c1c", - "62c61dccbc545952f39969b110bd81b49f2e9e9c766f6d40ebb41f4305eea3d1", - "1058bd6986a79e895e09bef06b11ea41440fcead7071af0e974ae9b3a31213c1", - "42f1d85178ca953fd0c29e95d76b5ccfb6a4cf65b7bf68779fcfc1fe39ca4e91", - "7df761b6b0b02fae4c92aceb15201be3fcfec3a2d4e609a15994bac2c1a68b23", - "907289b63fd4b56a684f0577c06bd3cafe900f61eb3ade57fe64c5ab24a38e55", - "5739065e3c84c49e859940c561f29b818435e42db7ef19178291a14c4e405346", - "c1791367cf33f33d7621abae7e5e692dea687b6f102fcd11092f7d562f5f4f3d", - "398f5bcd28a6be98ebabdb68fe704c0ddcdeecb27da53be8e68bf43ffb2a1c07", - "a7b5156abef9025e5c04c9a0873f651fb6ea8e8f332df5787103f133d56a2b7d", - "125763f9d521ceebb2532f9c7d57c413bea67c1dd1a3938796d95c0938624946", - "a04e82100b1bbc0908048c60374d8d65e429700c7317b649f983a27023203bc2", - "fd552f7e35846a32473a4d7ca0bdd7cd7fe0a98439afd2ba750643608a2cd7af", - "5fe00baf5e16b9c43666b3b0405a477682110bd4ffaad138e6440c493fd1967e", - "622d1f854d302184410882b63eeddcb20f50a4d59e0373c9ecf37be6684c2fca", - "9cd12a4b83b6a210d3a0cc3b95da7658cb6990ed2b4d7a8acccef3c3c584288d", - "95fece1c251be4286f1652f27dabd78478b92c04b40c0a286560e256916059e6", - "3f524e82d121618c479302ec0ba72aa3805d79e7bfc6f7bf1f3b3d7440ad0b7d", - "9dbb5f9bf74c587a5f131542e268984905c2443c5af7efeea80cdc44398b22f9", - "3d9c034f80009e1e07e9ab698bf8309b9162e4f382e2c174cb44b8d51e05bbcf", - "ad4b043b12d580b3d9662b52142a8c4f95241fd92b617960ada07368192d164e", - "e9f06ab48b56ce2d9931b3c5a60de124d03eae91dc213719667915ffc24a9277", - "772c680d6e742a01d8aac4c8789106657dd26d0a62881a468e4d7e20df42c2da", - "2f0874b35209720650b5cc9ecb7cdf2ece7eb24526e7f9fdc351f217873b80c5", - "72920e64d8f8545c416297f3ca1d2c73a416954039c42e16f875f90c19f0a4cf", - "a253f21e50d96d8e65dac6eef17e1162670faa3ece34739c0a693b98b1582f30", - "789ffb3bacae31c6abe1d0efe840b549c5198a0167f24bbe37709329ccc55b63", - "d251514ad6fe8e2f07c891b2440b185c6d507fc5441aada710a24156c9fa0a92", - "61ea58c0247e56dd907d98c7ce8bd13043ee421f9c3907ab379a5fbc416aba4e", - "38c1ff8496029be860cc79b97ea582b1288daa112c2f603758a1c6609df89a49", - "833e7533ac5490af250ebd87311e5d2f6863ee7252bfde5fa1761185432f332c", - "cef0188d9df8b32afd1a3373d307226c440cef67ff0c1a3c674e6439baa2987e", - "26da1d0f2332333efd099f14bacfb44ccf5d71c2a6cecdae903461bf07c6224d", - "af725f68db32a97313072e8215e8c147976cb41d0050ca7b724353842007997e", - "575427dbae9f4d729246f5194f5d8fd1a8f77aa17492be0e223fceadd28406f1", - "2b33bdef935708bd532aac7bdd5e4038a1b91153b634f24fabf24ebff106bf02", - "568742ef5f4f366c046e86d93679c1300d3a3d25e176e0c0017f485f5e4daa69", - "a6991d9dc1943d36c2f97f725a32d3133ef0a07193bf552909768ad5d94974ea", - "7215d85826c8500a716ce6c103033a8672231259d8bd256b3db18c4f419d42e2", - "730085b4579c9a8f851f0654612c338f1c876981dbd88e805ce91d866c4f9314", - "13fafe47d99f420549e42789977a81eea0ccc5dbb76a3ede7a61e39644e74988", - "f7888dc0e3e9c2a801dbe49dacad9ba1e38ed41c20e49b704916d51039a081d4", - "33a4f3bf23ac5ed621c80e09fc62ad9098d8ac7cc237dbe34a1bf5adfcd89da4", - "455ac1fcc41f2ba084177e6a2405d5eada46cc8b286dcd7b4eff0c5a56db4308", - "bcf2efe05e522fbd59d1c6702fe4480426a863c1efa6a3ca2194958a2d64666b", - "3d2827c4bbdce59564dcc51b1e56428d8ce162a38e62c9e9f5bb9839b289b7f9", - "158dcf43da8aae4007bbf7a124c7a5b3a5eedfb464fb9407457c5838973f194d", - "f13f3aaf55ddf055f54b28da065e51b265bc75cf9c931edd651adea3e2345c3a", - "8417e3f12fb0c998c1300991837562a0240543f94a614ffca7a93bc6816c8e72", - "2baf0a260d2af5533cef98c0c155a8f5f0c21839d37f5ea09979b67c71037d68", - "90453ad2721e7e60d8bd80fba6afef8c954f0c4ff1eeb318901df659a900bd83", - "b9795af37d6560354c138092cb837b30fd1318e4bf871ad9f8079fb64c64d9d3", - "7a9731d486ff3e51959396f306f5dac831fe5062f569843bd9e980f889201446", - "2c31386862452cf09bf2a811ea1eb5a4e369e89d8cacdbdc2c3a65616aa1f028", - "92e9755faf71cefda32f95ec84f04c1875503ab14be5118d1705d2a23cd74800", - "91b829d235f3c36ca6d41826ae18e9b0abe9dc8b09a74ac8b6480aed7de63c77", - "4da50dc5268ec9c058b91d9b268d5c2bc940c82f511849835387478a3e161887", - "03a8254e0d77291c740756793777fcb74d145edf5e681c826c8c8b5bbb133b96", - "729d3eef533ab4baab46e324e4472cbfda062a4e005fd2a02b32df78031e70db", - "90eb7176f816d10b0b4da58e63f6e5936ab70e83e032d87238649de81ed742f4", - "49d915d57ea4879bd85e29d9574dfcf21e84286bfc81549ac366347ff5d550eb", - "6895c7afb342bc967ca17188cbc97290cb7e4318c63eb1a8edd0640655258870", - "5c8c900f08f9baceaaa7e1e68c753e67cdd8fd60461a17bc1d4c7ee539b4d35c", - "0ae5fc434c44dc0db2749b1b7ca9a5ee333b02772ff1b1ecab8605c6828c5bad", - "04f856faa29ee0c8d0127eada65ebefc5c04b7516240d8524bbe5e0a7d677a7a", - "20409a482fbff655a3dccfc6d70de6cd685a476953cbfe8462a5c53a7e882a08", - "d0b30e90846a01049bf3fc9add461ff3390ff1999425e5a9081a0b97a59fed87", - "6666c086a49e538ca96e533cf18cd9a0c3e685dc3c62e2ae808cacbd780604c2", - "43dd8b7b2f80cd726e56c547ae9eb2eaebeca82606f3287b0597d7f0a0453ba0", - "d354e1927acfd8db51d934dad212ee6d7ffaf739f1882178aaafd6133aaa91ee", - "a3b3ea5e1f576931a08c0e93e65d94620ee499fbbb73ad41fd97fa343e5e8913", - "6ed2ea70e17a0604d2de7358923ea45c9fc577667c217bb2111b2b49d756860c", - "69b68f95d05cdc7c061cc4d7d710e10315d95654fff2efa365029f3d044c74b6", - "37d8e24c902275ce3174299073811f7bce66d5f322d71b941c04458495d7c0a1", - "a138a750bbd4381bdb85931bf9f6376a49e262047f88cf9e8af0e55e705ef934", - "e4a23509c578021f9dd507c2528dc408d1b9919f2bb47692942794bf03dbe0fb", - "365d86798212d9df0171aa63909ff08448789cce5723226c4e7e51b04ee5afe1", - "da36aa9d836993e2000f0b170c7c4c7f6824b23b0cb97e6b3ae744941cd33d56", - "b0a99b82f38822bcf3284e0e4fa11616029568a6b8245d61cb4fbbd255348c83", - "8ad1c9f98d61fc754a10a31b0654965992e5a79faa7e118bbd4094e75a0af415", - "d5abeee481c39c53a392aa5ce84e1a127a58a199a21088b9b3ba8ed0effc709e", - "eab47137bc8683950083e7f13a36517a8596406ad9d55832ac5e595f3511a8cc", - "2810c84a281fbfc4e35022e0b114cae06c7baaa52c21fde015dcf69b4fa3cd8b", - "3b2ebbfd97d843c35880c0855eaee6d6d4c23939e22c17f3b5afa9ae281b8028", - "4cc5d51acecc3019f9cc2eb68f1ad28f0c7f06f260d60199bdb1a0ba28dd56f7", - "f5f7b55a2f79ba07c7fed29c923b9cde6db97a123c82a053a6d45dcab7b191dc", - "bd04503c1f681d9a577444c4fb6537660dc6f9f0b24a8ed2e2a8bf737652bc56", - "11a27110ed8d3f06532439a7f81cb6f3173711e90ef0504e5509b1c3a1a87806", - "3b21bb9380e7de8b32f05e7b174f74c0e1be087f9d1674d6e51a4421be85067f", - "74e8465ddd54980385736a37f3bba056208f674ce5105286f14b2e01923cb2d3", - "de1c96b7ffed6f0a9475a554c77b7cd3d0c67a23dfb5be432536a3fefc93c804", - "1b9b278b96ebcbba479c0324aad8464ca312429c4986bbc5fdf4e0188e21d8a1", - "34b4fe7ac342ddb54616b1023d7d760f672bee5fb07b11183ba074f58d13bd43", - "42632522ae745542212dfe49162a952ef4d33b020d188789a45a7c95a158dcc4", - "e22a16ffb4c40b2434e910da6e29883f9a00c9fe87771bbf2203e9e36fe66467", - "c012b4233f6cb35b27236e586228ab6b5c01dc7d0ccaab9efc7985d30db7da2a", - "c8b3709fcd7ba3b8ebff998f83a38bee505d0cb95b2e9f3c8c244972270ae238", - "9da8d5c4a7995c83d01c807e71ff34005b307cb1bfc41377e8330796c2e4a741", - "15d5ce2a4c7f10cd19e994cbc80488977c12b3bef1ba9f8d32a24356f24b0200", - "71b7c8036b1479d3f11b5b60062f46c17f4b9e35bf12ba114e1f0c9f61251244", - "c7672107e18072fa63e83811e7d837528f9eea37c7418bed84be49bb4dd0d6c4", - "113bc2b7a2d07aa6e12689061e40484f7af3345c716fb09205d0802c41c6db97", - "8616f50fcea423e03802d2b7ca321eec3182d247e4d92c1752b709eada4d8160", - "3f5f10d22a6f5bdca2897c55d09abaf2f94ec556540ba08153b6774a5d9e3897", - "777c1f2038e3d228727358cf26e31d4a514b3a271ca3efac8b06ddd5e560cf58", - "cf6fde0fdf1ec21c460d5554d30e731bc059b4df79825c4775263b425404b45c", - "28b0526d048e380cbe12b55e13f768c68a6680485ecbc3c224f63e4623018a55", - "fd104ef861c079cc84e53a290bb3753fceff6350fe9fd743869390ef64444aee", - "c437f3d51e017329e11526b9a5244e4c091e53938d598ce0c9388613ab723c52", - "7d5734c22341adf8fc3eebeb10204bb30b911959c6619ac4f5695b65b243a212", - "3e91af93f367c9d491da8a959b36d52038bd735801045523b649c8906b6c0ab4", - "203169cf0e3965d27954a4c9ce8581a0deed2312f2da1de0eff06297e15bf1fb", - "63659cb754799d102b5cd86064643c3a5faeff486258b3b209b2126a1ce42fe5", - "0ce1cb504cda52ed2b14dfd777e99fda063eab831ebd740d4921e10e6077e9d8", - "d333a26fb9cdfe182ef1789b1701d1f4e474e6996bbb0a6213db5393b034db61", - "bc3023b3dae632e0eac3aabd6c118ab7fd73933cd743036660ddf618e480c1b0", - "19080406e4b98cf61ff803cdeb5dacb834418bb3ff2a2c45e8b73d21f547bb88", - "ce92ee90636577f834ff552dad392e5ee9a2466cd523d0e14905393fd2387380", - "5de9bfbfd282384689f283cbbfa7d0d8fa0951bff9bf090144f17f3589ef7b5c", - "86cbd4f90bbab80b7d9e028ca13fcc38ab1155c3235b855ab91357717d2224d5", - "3fe38307896621ea4eae628def7f3e1bc50cf6fd422c740c0041bbc3929d5692", - "20957d8f6600d82b4a6ab2997a16eb9f54dba73b53eddad66be1270635476b69", - "4c4187cc3295c4976719cfcd31ae9eb1957a33f809fc33455e7703c7ab7c291d", - "1b4a127fbcd4503a856082ac1b376c69ac4b236acc54021a829e0d7adbfc6a2e", - "6694bf9b4eca209670c6f54af4b9b3c9218a110b8efaa8752f33fc9f6cbb8c41", - "7907f55c313b88d774c6453046092f3c59d061a3c5e10de294f16062c8b4df9f", - "0c550f318c5630085373ca78b61b3aadfef826bd2d1b5e32f46e2b4df291d519", - "fb6407b38d159a320d6ab48c631eab291988d7caf0b80297310d74df859e1a56", - "c1a04640914325b6a12225d57a7408f56d6536d8c2641dd7876f97f9bb458729", - "f306f9c72d6ba7531d66929aa69fbed86ef20e292bc93727edde3b5ce6d97bf3", - "993dae03718cf8759f81c1359122e48eda28c105992add691c460fc65aacb1d9", - "3c189aa0ade0f650c17d80368e3207d07232668ac7579802bdf03cec0dcfe678", - "61490b573b249d5c121eb6a6d5f1f7f8c7625020c63e157230032749c8efee0c", - "859b2e896f0a2f69e03a6e7cca9e1df34d08de0cdb0ee6a2204e88d990d68abf", - "7a637d9f2f03d3dfa02063b85eb8ff30b8fcd86619b9c40ce45cd6aa1f51c691", - "11484c9ef77244e27bee2303ec46e5ddbba346675b09d086b8ea7ce65e95c390", - "dc6d5b9cbb1be47414e1ae6fb4147ef443604094bae2b8e930f57753b00e7785", - "1f9eca69c08f1698ffd9206d9f14f46a1b921fc40123061f783f102175f88227", - "8a81077c637927599b99ef1b77aba7600168082d6aa791d8c06713d89f8b9e82", - "ff9f2e0d0eda383ddc9471df97c08bf06296a10ff96a9878024590bbfa2a699d", - "84eb5295a6b1746c1541edbae54d78fd6ac023834230dab0653866bf743b279f", - "3b1a095400db74a097d1c8be9e24cdbe9d568b5c0ecb4b476fcb4f12d4006842", - "d37125e7e857a90d9a962b1a95c4f56fb5c645c5fd43bd95b5f752f1f0184f7b", - "9959cd19366e0415c6b8998b0df498d8d3afaaf69d39589595c7335eac214137", - "07a391c241e9e05a5165b7dd9b37e23a47db615c52cdd0f3249508c24b74e36e", - "3bacf7a004d016fc1e8a9e0672d99daee6b4b6ac25f3916bcb57097d7f1a0652", - "9697d7311f60030b059594a57d493b4ba18c6b520299a79449d895434aa06474", - "19a079110134b0728710a74e04a6905dbd77aa3a59bf6e6bf2ff5b3061c356f2", - "42d305c5ad2b9ad2d28e6a2abfccded955e37b2ad6d4efd319b84b9735be3b24", - "a47a6183f6d190d795113bbfb3eb9c74276dfb2934cd75d2b16b42f61c6b525e", - "a1e78e365ca8101036f4240e8ea1e7d66f1b62fc5943c345753a2db1b387e12c", - "37984f1bcde6f639da480aa7f8991eed986bc41552b581b9f145b65863958f8a", - "788f9e3c75e891b61c77534df9af08a4fe90dca53301dfdc7b9d314cb1b89a6a", - "8f9896caad567b1897e2c53d39e053ada67555a441b8b42c8fb085b64938eb5d", - "51a770a315e2564d1aaa56b99b5d72a85ae081455cde26871cebd4105e36d30c", - "1b79452824a8c463b584fc85637b340d09827bb43f7e0f03858ceb8652a15f5e", - "029023554f88c86faf326f6a14b721a40cbfe0ece36fd49f24a52949af1dad92", - "2c10b5a8314be35f4e897632cb958fe41ad461ff6b88bc940064ee624e6b9274", - "4b43b41da4649f1af6b03408dd49d140e9a5006413f7aaa30cfd416e42844f5e", - "52e02cbf587c44f51005bed49a2eac3b803cab125b034dc687b7718addde1fd9", - "31f1fab9306bf5beb82b045ab10c92ac969fc4c5f366912d163a002df32e89a1", - "284b15d2ae1402b67e8cfc4cb29cb97549dd860579b2a0443da998cd093d773e", - "8532926ed834a88277f232979bf0e97dc7b33d15dc5003f38448413e87303beb", - "ffd166c20b448ba9987737fa5ebfebe06e8f44a1cc9422d3576bd92d8219acb8", - "618a71b13c1214112d733f4a045c0e87267d366fff44c0af78c07ed96d8c3ee9", - "0c37fc42d9640a15b6ea8a493fff5231f13787f223bec395f26cceee381eec10", - "a9d0b8c79ce795993d8a13fd6cc5676ec1d75bfe58a0dbace507e83c33616509", - "9010a003da68ed487fa0b9b47afee89cd019bca5ad7fbc5c53afe28a957ade8f", - "cccb1996d0ce1b7e80b915c81089d879ca1352b2ecdc75bd9920f399e14ad95f", - "bc8dbf51156f9abfdce4fcdc737f8fd75128b8655e9b1f5e62ad7013dd75285a", - "aa2c38f44bbad2c66d1a99809b8259db08cbfaa89c6f608e68a373bddcb2962d", - "3d7e38d01e71f3b152a5e51f7d51cb1a48334cd0a0adfa2913d80743c9a11d1c", - "86d5736bdcf441dfc23f920b24826c978b257f734b2abc62a27256ac54da78ab", - "60b16c013d864d4d0c5c0c5cfc17a193a8188689f74124f1167d6b83b5d96205", - "a85b869391c79725283799f986f0274a243495febf2efdacab0265ab42b5c6ff", - "c92e42bf5a8e1fff3367c7cf5995a64d952fa70c4294002408b0637e21809d75", - "6803792ac7f0f1c65dca9e8b32921ae903a9ca4eb8d1d2dfa43a2d5c4aa867e2", - "486b3ac524305e29385b864febd235a9cce08ea9c7d35a7df4bb0d223cc1809e", - "357517e116acdd169b5e851932b057da87725ecb030f0c8acd40ae7cb0747b17", - "39470bd1f3ce684d1531187fb3b8fd3fb8959cbe652a72dc14ab8924ae9db643", - "16ed448e4b4f8a3a2d23c0f0b3aaf3c7ae0dc70500bd6670e17a7793c695f67b", - "57a414e7c5ddd2e8fe5988fc3e5718a2222ab4cdc5a328e5574446e87e5a1d68", - "3a6bef7f77b20f3247f5c1b523d058dc9c78283792aa8273765a6629177c341a", - "702ca621422b8441a3910fd73d2107ba2bba1a1843df8199732c38f7ccdb5f9d", - "7c73b29408449349d3dbf5c9f13a2e6ef73b2c158706f2d094e4729258d3670c", - "07fc363263f23de143bdca6965c30716e0e3f6f74534060f311a0f2ae1c29bfa", - "5f53ce981997160f476fa7154fc2cbc03f5579c826091ca74df93040b81d5bd5", - "100aaff0a11f99f1ac47fcce8f39ab2fd4447fff08f23abe43c2839f1ba6294d", - "03ad00f79c211559def8f5a711f7a850c63cd4fb2e131e92cbbbaa9e2d44c5bc", - "f0aecba95967482e4c01f5fb213fc5141e5105a2a95b52147a90da90a98609d1", - "2e00b06b4a76d7e22d4d534d0cbdcdcf5f8db2ca50cc902558513f62a423852f", - "04d7d0263ef7db1c8bd76d3aaa11277d78a049499859d46b5a9e5257cbf199a6", - "97c1ce72f0937594832179b7f668ec8e2e8aaa228637075c7e0cbd37ba70613f", - "813185da8471cf8f6b2fa0e8c74c03c22edc0ff9b92f8f9e292b75dd3074a05e", - "317858c46c34b098ad38ce1666dc06d6cb7ca3d4e19e591a135e4ba8382c695a", - "af5ea246556c501a931ba5c192917ddc7afd419170863f90ff62e093304db007", - "477229a37956dbf24c0a3295907a689bde9ee051dcef00a217dfb81dba12ba30", - "49b0bf18076df3fb9520d59f03e3fc9e3b36a2c3e2e33d57f22489992294d376", - "becd420aa9172605c1e63abdf6a79890d9a41c541952e447e413203abbc560ab", - "1e349e89a802ff4250042a2bd356b5fe94b9841f2fb33eb83d71a6ef8da882e4", - "3d7d8d09ccaa89428a05f8588a2ca802a0558b19ca6d92938c935a3c6e6aead1", - "a4324b700d56babe36d6b6fb9f6020014f3e4001c8c0ee2c7b46bf69479be27a", - "26ab0837f56a0f494f78e1c18d80fafece5555b5885fd9a4829df94ea95a72b6", - "1d3cd0e83358540d90cb601acbeb35320199a75930f8fc20849192d84a212473", - "6fb6fb822a30877bef6c7c24a751fe4abd66d457435846ce748449e6044c0a16", - "7a8ba196f803eed91a97c8bdbcac023d4318486b72880517e82a7a572de039a8", - "1e643a665fba72669c2b20d98abb63269636fb84748c315cd13b3e2c3057ed0a", - "8b425a42a420fa6e54ad74d25277bf3b3c0cbbdeb8636a12e43522442c7c66a1", - "0d4aa0d59db90c86a4fa0430d49af9a2b0fad86fda1a4e017b6030c0915adecd", - "249bdcb146ab0c11ea532e54eac38258f7307c77c9b55f0de635c2318074903d", - "d2821dc83fcfed404f4faa1aeaf4fccb63980d942969b00b00f65fb2b01409cf", - "3959afa223afeeee7e86c0bc26b2eab99952a5302c0c711d6015fe5304150883", - "7a9164c6e7764b22692ab8c4f0b0cc05806d34341d6c97330b556c58be5fe9f9", - "c578b9e0d7213f3f8c2fd6235bb468a85ef59b37d4444eac4b617561fd61304c", - "0ebe1dc1f8fea66e95df1dc27c3eba129943965f02e801f60a3005a7759ebc2e", - "47051f0c18ac107ed6d480b17f56b1df7ca0d1938ea774812cbaf17cc17f2a63", - "5a6f37a9918a5c7f88c7daea34e19c3e7631cd7007cad0e3020ca5799f5cf766", - "88df0cb4e086e6caa90cebff750d266870c33693e4b27d1f604be65a20ee3e8a", - "d623b68ab39c2b29b42616ea934f9b29a4dc73ebba608b3ba0de843cfac0f5b5", - "d94632e01ef2cd82fbded537efc7688612dd6cb39a627bc889f320965e1e9419", - "368b4ed499f80b7444f84b8e9e115df1abf27656388c326e7aba248ba5ab2e10", - "59b65bb8c30f3581f9374c7d7837cab176779a8e82a463d13fb9a0aea61013eb", - "ce2c229499313841ed115f8525325a899c31cb035afb1f85ca7e3d284e0a3fc8", - "e2ccb325867292974e9ee17cb67ba2660dcc824b55633237080da5b16e5f489b", - "ed0f121fe6d89794a01962f6145498479a992d8e80b527b9b567d96d3db26c34", - "f328d96532636ec9911e887504a8ad0b530e2a13e5c62bdb670cc5ab5399e298", - "156d897414906a381c2eaa43b91e96319869b4391643554756194cae937c4b7d", - "f4a9787a9f373d1a923f7aa1125c5cd17ccd5130a498aa90809af337cdc48fc5", - "1d6f1b09a22b4a00ef35eefecf17b2875ffe45a11596b1fe9c69668fbaefca6b", - "f2c6fa12ea1130047c7bc5569b67a535f321a3c80681bf6f7a4381638fe3f795", - "23c945f811482370175bbdc8036f72d9a4d90b5e492dcd0e83603ca346451e90", - "95a91bab53642c387e307da507e84dc0cac02d3dc2a28b927194a07dd6f236e9", - "cb2d66cbaa750ede690300714e787479fa57169d2bda348e23c1d552b8f4f063", - "7ded6f22e8195d26f485ff89c6b7542c3a3357bbedc70b718aa793661b25e744", - "df73daf48d7e92ce8d2d557a02c05f22001079900b615abc0c64acc88d3ef712", - "fc9da92888f51e3f59cd30f8d89876a78a949dddaad0fb8b3d9b63eca72a7e06", - "3efe62c21ab1da6a721ad75db88c1354eac0ff63dcdf52d3202209372a202a6f", - "717d37335b9eece5be3409a52369dfe44ea05b667530a37c1e107eb9471ff3be", - "6b1ea72b6b30dbaf96d7de8f24824ec099d7b0793eab695403f352e4ea833967", - "36d17125954f7ad971c9216ae87cc055e78f6cbb9a9d763b5d4b17d8215865e9", - "8be7b2f244cae45dd96472535fd10e3a83e492237a9c9c7f87ddf74ed60d8246", - "3ed613c446467e7d0e57d91333d2c1825ea6830b0dc44ed7356823f66e5092e6", - "fd1fa162978b60b19a92edf18166c1ae9c14709acd89b0f615ad100f7f01cfd5", - "72fcc049e524d1c3df9bd335e2f4e04f6cc57ef299735a8acaaa2510ac0db794", - "7da76b6e6ca0c2ba6b3feb8bd2084b34f1e7cc4a2c4911ffd37028ef1a70a143", - "7fa25e823002ff1cc7bd94a9408a575c5d8a08a88b584a1abd28574b285423f6", - "74bd35f6ee677827d4ad5a48af4fdfea92330a1765f9742d5d270c21f391af09", - "fa9ebb2cc58637a7ecffc60f71fb8a293f3ec8af13fee1f3fbfeb641eba29b74", - "72b114664a2f431f67f9fe29f1a341600e571b2757b759256a99d5d427bb8cb8", - "cf1ca4ff67b980a560c99b78d162f03002068356b9438f9f98c7891202fe2ae2", - "f61643b1eb7ae2b157165635869962b7d48994ec5e2a001b4b4cc2524abedcda", - "a4f312653318deeda34f0a74ea7100fd52e0b26eaa7489c2e3fbd802125ad54c", - "cd1790fe1259303bcfcf4823216933bbd342302a48cb102c9757d2ba245eab87", - "7222ac654be8c534bc7b463dd9d2c286d8c2d62dbf78c13d4869b9ea546389af", - "e24977c20da8290e2a32a995b2f54af51e9b743d75f4a5c3685e42e06a06d7f3", - "ba468db85006aeac19504f05f35713f0a1fb204c5e4b0f7fe95bfc8ad7076be3", - "546eeb3e1a2f75d2e47e594297bdacbd74ef2ed371f180c50b9929397a856202", - "82b7dbd7c9a959c3a9ceec53778f149c25cfba0804bb281facb6eacfb7ebf904", - "7ffe97623f4f51925df7bf835c649a3e6be42f5ab61e0cf043dbb57311a15112", - "fef496e1c49a89aeec4c87c1d311409567740ab7180d7102a165e0d80f3f02f5", - "a6d74b0520f074f1c40aad1068d8ffc4d74a50fb44b6de9738d0e3d76497dcb8", - "26c11595545c22fa5ab192c43f3c1d504ec9ab27d227f0adb3cc920f0e76761b", - "627c835c275ec3b083dad182ca2151d9106933f279db65c2a8620d2955da1470", - "96023ece5d1815cbf85f1fc014b82975fe0c64d6ab99b7af184d93ebcab6e139", - "3a613776157e5fb36616b9fb85b25b01276c8e0d720ace5b0ac60850ddc6a3f1", - "4e27379eb351e492b0afba3d7fc1f6525730af8afbdebd962fc8007332490db5", - "491c09c0687bfb15dba2a8a78a4b95adf806ea3ae04dcaecc000b2147f203128", - "af44a398f29a837fec4efda73294ec9c684c236d0bcb21114ac84090af2880bd", - "48e2c3b68d5432fd5f1ee40f0c2ff23c2eaf079cfd495b6a9eae6f224984a57c", - "4a8ff2374ac0d541b97065a9eaab2beac221e9ef5acfe23c28b0132b80add2ba", - "24aa5445f6db61399a246ab7af30aafa2282f6724b91fbfffefb0e8a54e0ae7b", - "a5232d97d127a18f6cb18f97dea905a3c62709fdc10923012e0854d83a55cdef", - "559f9576315275341dea993245d2e1b214c7f8e18c00f07cd6ed63b046bdab1e", - "1601caff41def23665ae3f47c9b2f74e603d49183b3b23f548119da554fdf215", - "7e73d41c7d02681cd19f66a7ea21ceb36143418eb99ad2951d94b003add41ac6", - "8c33617983fe8d0eede0cef8732fb686159fbff7e935149b179215582514d501", - "faba1bf9dc98441b7676f553eb7175ccc7422b5b05ff9c5b4b1324c38ac94824", - "a464f750bb865feedb23e0cb90f483be26d08f0a8ad6ff2c707c10429c2135a0", - "63d6fe6acd26607f67ca961a29b58fc5995f517f485f3908e33ab4ee16eaa3f4", - "28c12ea2b4b119bffd378cb3bd87ede0c714720875cf8940f1720c4c64d3d993", - "f7bce2e3b9bdfb6f1a2eb1847833b804c18e9f8c6af601e072b97a81d56ce895", - "00c246c83f7f1bac8d0dcae8b326f7e3d47ca2a4de2a7cb2f6f08419bb370752", - "09c44da3381837c4cb47fc3cf6e7aeddfd943706733d5c79d96f8d4c42ef7b0b", - "e7ab41fb9db77ba2de05dc834723db059b0d5479fb36a504ed34abc70bc203b9", - "7b0b0f2c312d6cd3fb12f9342d856f9775122c18b4784a2f0f10080e9ccfa503", - "d166d5910af83befeea93cec29cec40a3d57086a2892aeb341e864247dcea94c", - "abec20d2ca373d1503ec337912059816d956cfdffc915e4ffa88f4c375bdcab2", - "008c896e4c9cf4346c2b24435feedafed1faf0c98c13193be43ed23cefa9a1e1", - "b64ffbb56b39b69900fcd401693d9a3d63ca14c8afa369a38dfb1dfee4320320", - "adf81e97fd668d4dfc6ba18aca5401e0b5d3f669fe3b86de7c00d4f539e66c16", - "d6d83375268d627f1a42cfc84561c8990ebf638919a08051c2bd1e38d6bd3607", - "062cbc74b36813056b5504a2e572c59e418eb70dcef6461148cf1d9035c94b22", - "9575bb6eded4ddbc8ca42cb66d4f9df3fd3333934829141e8fb733001f392cf8", - "a1899fd9fb9a9b635c4a7340021d3f9db359951db6efdd9c787ad221e6af485c", - "fcafeb4d659d9aba9265e93a8cb62c9c41503f84b7c8c574cae364e9451ab01a", - "ee2b489fc86f9e9a3e76e40d80b2c8b3edcae16f017f3f6eb9897c711e9ed05f", - "26a307658313912c6d6fb0087189f13736781963c0c6aaafcca09e7b6ed80eff", - "b31776d1f94974c83a1a3b63aa797223cb38dc8bdae42c0e6006b72f28a70d5b", - "dee2062bf390e2ca723acde953cc4a90ea81f7e800ae27fc330171426001bfb4", - "a0da19f9d60a990215987fff0039e049ac74829ab73e0331428e504126f4e4e6", - "b63059b5313ae6b3915ab91fe6c430e98d3809849e1197094e09c4f85438d010", - "10674dbf8c896d3e1499a7254fc3069bc3a4b594f651f8f77a5676f8d4ceb414", - "99f177ba5c3f8a9db6ae551d3c91f3eeb3637628bad1aa2b1a16731ccb609666", - "dbf375f00ef4ede6955053fc7a19f356e37908a8ca816fe841ad495449273ef5", - "22e45cac3d74f61641bd4d88427c6d5e040252ee8e172d2acb72135313d76419", - "e294543efcd286f84099f299364862d9a72ab2d221f4c0a1e96c78b329c7da26", - "8de218fd0078d64ef6129f036184431192d4f88eddb8c2d7b7121ae8b3013a4f", - "cb01ce571ee9e2019dca97222dbd7f43b2d4cc1acfb61f84f31313aab8f8c398", - "6fcb1e2943ddca4c80113eb827ed482c9d1945c75b1c0d736959c401a6c1e0cc", - "76ae7c40b76b4ea08312a5824342871bc4f81adc54fc2f10718a36bf9a3b8090", - "46a6742a655582dbe6df2e7d1b9cd3d62e53b15deb0b7004e84df9138a2af8db", - "5981cf67081421b545eb47720df1d4b26d10b0101f80dc11313c290d3f892342", - "9a9dcf054acf1a66969111f78452ce1f87e60043ff51525a8893905c68f9ec46", - "efc9f051b8ae1891f7de265f3a53de2bd51c9135c12be50da76130c824feeb40", - "614032752e3399d4be509b04c2fe4249cbea5d3850adba342c78aa8643d3b095", - "a02a861ff938771f7468a9543818d63780dd55dd755b4e238da13baaa617181d", - "6d46a3018684feeb0d77c316688e8db124ab4f408d4749290fe218162c542741", - "6cccd11052ed21d91d397df629c9e68315253adc57eed92102098d06eb5b5383", - "7ad03d7deddadf3d4862fbb083e85aa180a8c7c8ba2a9e054a0e186e4e2e0ed9", - "4a09791b889e066acf5169639769c17b1a4680483051ca9e15557840ca5b61af", - "920de557248030c76bd43d4b97f4aaa6e8e5786a47bf24312ba14562a77f24fe", - "193c9b96e3b3caadd433ab552cbe9f36025c3235f22980fcc10becd15c901d4b", - "d354e1e3f0718004fef461c5cf9ae89e8862e35bf4de189ca8eccee622295c8f", - "cf51a2a564a0b77ea3e0c5f0f9afef17d5fc67b6e15e042e778e2d2b6b4d509d", - "2f51ffe28d798a026e80b6d876207c1d4bcf9a268885387fa2f5d184ca507fec", - "780ef411945f2c40c145fec82105b2cd76c50af1d4f0c61aeec46a41b27ff27e", - "3b0c4d9f3e7dee3838200a9e410991a91e0a628aa13e60b8b7592d1183958196", - "5f170e0a03f60501d63903125afb9986c7bc4784ba6c983b1f343ac0211dd4c3", - "8e5ff4c4d905e4d3fba2e9c88840e9e23f2e942b047b14c807b9c84531a94120", - "b1deb53e392c0985f09beb8ee6eac3ee955c5ddb1bde64624b0644980997947b", - "b287930dd82b3c49667eb6dd1298f8bdadb439097a017171742e0df509f59c76", - "11f27bd4eab33d2a85a0be42049b55517c4844144a50b750941ee4e5533ae8f9", - "a12024c6a0d6aa223bf9de49fd12ffed20bba537621cdea2bff3ec86f86ae0f9", - "447eab948a6bbb114cef106ec9b45b407c5e7c78f7fc366d4263520bbdc373ec", - "570183d88c1ab123714dac8a62e59f4f2fb492b3428ccdb02ec3d3431f2808f3", - "652c2a2cccd40bc2f04c4cd9fa06b1c4f3924dcc93d0c063254bc078cf1300a0", - "375f6d51e0ddbeae671420a99e034a00b03e76a7e396ee5fca3d6ad3ccefd3c1", - "0a89dadbc76c499ad15c52eacf790c4666afabf5dc8a56bae3a3ee971014a21e", - "77176bdff43c75586b28e1dcaf8cafd7657f5a5516101171175b76ecf971deea", - "76f5d5fc3f6066bf81e76597b881a6a83f4c435350076e422b81be65da2dc757", - "e1701f4942f78fce935fb32648af946fd3d2739c37ca588222a790001345fd91", - "38cf66c68c3e4e6e5ed48c1207ff151d6264c930d12de1c60656480084145250", - "314e6e412b49efaa0640109a5b1232981154c9ae556a7b5ab4c042095166408e", - "3df1da6b6b22d930c0e496429c2860ef11274f84e9c56c10e2c3b097ca9ddc7a", - "23715a48f5022d5725f74b4239b9e1c7a5a58315f364c045d44bdd4bdb8fbfc8", - "3baa6c4d0367df139212944bc9b1c4cf58a410cf8ea89ab6b52bcc7089300874", - "a9b84e0aca19dbe7fff62bc3a834b0cfb1d4fd6550117646459c64b4a05e358a", - "76524b6e4d88ac832f3f3090f9bf108e07c315ba997c03f8847a407debf56330", - "22fccf68774f07efd7a5541d17b0d7efab3bbb4008476250fe78f7f74923948f", - "e50eae085f08631261e4fedc5a63bee5916ec2d608a162dd70c182c98f5e289a", - "dfb735c715ce0c0268d7124799bb89fb53f93572e569c6032a7d5407afb08d04", - "15197826c35de8acbec11557ee660989f689b5afe85117be36159eb214ca47de", - "7366151f90602c293b089f32cc392f72c143f24b52ed31b45eb19f5866bfd02f", - "ed385bc5714c7004a3ab790bbec72ca331f7c90ce29fcbd3ca58e26143ffcfb8", - "3170b207bff2205e1601e942b0abacba30724974032c4ad5ba4dda8bc99ad04c", - "2bc4327154e57abab653c5d6c7cacf0e39597251a5d65f138463ca22b5fcdc6d", - "787ac0d29ec54aee9455889b723c0736b700b9bb126ae1bcf3f8c7a1d1efc3ea", - "985041b1b6c874459c4d3bf5f96fb545098137a61e3ea038c882b885e39347ca", - "303a3b082d500e4f5b66745253c7d39f363aa3b370dd1b4c08830f8cb6daea5f", - "08e1d139ccd8601907ce14f40db04e061b85e049992bb2ec9300ee2fbfd0ea0f", - "f97615542a2d271db359b5bfdb6a01fff4387ce52e7827084c1eccc1be1fcb05", - "e0aca05fa00d238b3f2dff73add3964acaeaba173033ae1afe70859421eefcf0", - "000a5ef4c7d7c2f145484032bacdbb55c8a1f7a72416d6bbd2d22b6900d45999", - "1c4876753b9b326a6da8e453aac74d63ba27c232932340b25421466d06b6f75f", - "4b39321c8aad11ce9dacda7fa9a1cb3a76dfc4e9be1322fdfef5fd4715def9c5", - "b9ead7e9090766d3016c3e87a6ab3ee7a6b10f8f354e0693eb38c21b0f1946bb", - "aa8b5f82be7b2aba71ae516a3e338f25c999159c7c4d0eecebcecc9b60c8894f", - "f857de0081a4d62a7f105ca9d04705fd4a43ef38a72fd0f12e0ab5725f173cd8", - "00147646a988039deb188b915394d445f55d134c62a78b5a31e58aafab6478cd", - "ab77f59b89678731bd03d5c9ef0a4199a61ff41f6b9c96be43ad9df098c8fd79", - "a678ddc68e66f9335858e31bdbcd446515611afaa3a19cdb04aa013609d338fc", - "4eaf4094c7d3f8d1c562924f58fd6bc7f94656272713c457b1bd7b501937fff6", - "2444e89d6aab61a3a368cb3b48e15db135d3ab1f714a2b7b3b918f450ac54886", - "2fcc0e6aeacf2cf3b58f24c96da085639d7fdd1eb8cd51948681d3219ff88960", - "42557caf310936ea719247ca0abbd67b7b214e5ed4f307610468e3c74e18ca39", - "cd4df4451624640e6258c3cbd9f26aeea1b6644423ec6a3eec9fa3e6e073f36a", - "f3fa76aaefb8b36e24f5e5168ba91d25a4003c0aadb5d973eb28bd26ab9cb3f1", - "b6c68c0c44e91b8d57b9ee308ae5e0cd0cd04da6aeac4d46867afc0a65d827b3", - "d89a6d971e433c9134cfa5caef44e349bb08c358d75ceee7d9e757218087f86c", - "a42f62e67003622c22a05a680289c7b28a54d3598934c7d1187c38027b696257", - "b2e9178ff974b6d71b1bed71297ee334f05c5dafd2792b3d27bfdce3307b8a3d", - "4768904fa625e966e1e6a9aed0638104bf6015a45c1a2e2d1ccb9698b609b8ad", - "2435eb446666da2e786f5e3331085b7f01ef427f44df74c56d181ec7925a34f4", - "6b5123f4bf2de24606cf492fe178b0e7044c844b25160f778698ff1fdb50a2dd", - "edc69958cb1189c582419073990cd07938510420f97dc307f990a6db8e4141ac", - "436e6524a78b99605f2454d5a46f5820787db230281dd83571f67babd735221b", - "e713db0fb043667efcb4f698f2c86a1c9f342a6445b7749b9e870440a06d8c76", - "7d2f8894dd0ef224ca596c9d996c17418d7102bdc682a0ddb56fbf150d335c91", - "2a5b252ddfe7ce7c50d2cbf29ad10a18b348b28e5af9a3bbae603cb589cc393e", - "1dacb8de1a87331a1f04eb807bfce20ddd729afbb674f5fc6015505c512942cf", - "70b5b254b011c0509e822d15fa0b61acc4ff9fe1e586ea108aded38505ca8a3f", - "7b203bb82a061e9262d5efc545646db20ee92c21bc5b7dbdef1c6be197187875", - "0a0311455c7d10fe9fba95ba0068b96ddaed0da7069e35db7cb9683820c1c746", - "4b10b3461e4a6238e0938a044ed9a9b3cfed6c02bc88ee1e5f4164dac49d5b5b", - "105042a676d8f03f9717a393879f3ea75c3b742f96a9442888acc0ab19e2f5f6", - "0bcb10fd9533b3677688d0d2a7c88d59ac6b7b7be77d68947d7f61c4e63c2a29", - "0c506a993c7c774b11deb07c1d5abc6d1f78b1ecb5cb430780a2b75b5c84cee1", - "ebe63a628752dda3b09809a30491b0824e882ac9ff19b66f3712545316beee6c", - "31ed93575ab9d05655d776e98e542014724c52aa6e5a9aec15c48458dc15c161", - "ec42875926aebd92b1489e30d4ee6c921cc6e4a3691f26f85607897b630dabcc", - "1869fa132f1a02b4474f676123a235cab11704728634d1e5224cb61e1ddcd940", - "12f1de06b46592cbec350d6a488c723d741481b5b0587eccb758b959ffeec948", - "e5af77bbcd17d295d20995eb23e7e1f2d15381142c6d29b8116255adb57bc474", - "e3356f9365c871ef7bd4b19ec25928ba6b05970a4caf0f6910b90659d46e2fbf", - "6096723e5e2c02eb1493797c4da92f2c4b17b1efc762c338dc0fdd754f832d7a", - "3ea70854ea5c1984a533b5c7205a1522302a1dea2bfd939f7a8d39cfcf953ba6", - "79cb455ab79e999f2f6f9ac46192ef1b7da57de204bfec89a0149f2bdcf58b49", - "5d1b744a088efabac8b154ddd719147ec2d3eea7e5b6e895c2d0930f9270d330", - "2bcb3f5a807f6637e7e1c639f3a6704bdc93d6a075e2f268ab0406a3e27caf16", - "d9b446f3b4132874aad5ce141e0b1a924d8fa415793c062c370cd7ce2c049438", - "859c6308f24c8a09abade86f2c60c15adf6dfca7e82dd083436c4ebf759afb4f", - "f30a0e5e17bc387a0ea0f55b23d98de66d3a2a1c40f49f5527654afd405664d6", - "e56d1bfa7ca6352044e995715108b23549e644310fc1db357b2835528eb91dae", - "2709cc9c73318872ac3dbb7ca613511ddbb91cce27b01fa4584046c0804e374e", - "ce9f05eee8e9e9d5b5059b8c4338cd626c44cf09e5168728ccdc2a4d87078436", - "89fd71964d767ce05424b192a0b6c2b68c99bd30f5df8cd28d0a30840fbfc1f0", - "9e6c3faf6ee709048cb0cedc8b78ebc2049ad7f499fc04d22a67b6cfb94eefa0", - "36ef47e66f65c4f53ecf1a257a7252a6d162edb1b20354b6fcad31a2bc3b8e53", - "9e95985b31b5d8b99e402c6350fdf7ef01d7bf6af2cceb4e5821206ad6a6a4c3", - "1409e106719096fef5454f76eb8ac2fd9a19e1167acdd8d8f2ca6a4caf5d9954", - "dc2cf17c6237f16c223553f0283544fd74929ec540e960d44c933d8a8ff6314c", - "e5cfe5c182c791185516178ce0b217ae6d96be2a8fa3f3e903c5fa95edb9dd2f", - "047aabde37417f360cf4cfb54e88eee05b05a1aa48d5408f983d76587bc6feff", - "e302c9711589d48d734c58aef85ffb0d206203c5e10cf2ddd48a515a9ba0bd89", - "e62af2c1c54613b66241a690064ce048aca249f75b46e8f5d8420d132ce74f99", - "1208c8bf378f6fef78dd07704053933d29268afdafa4f94300ebe8299b4f37f0", - "d5a06c7a32f9074d9f3e488e1c17002c25c28d9d947201c66f8e44052c72bd8d", - "78b1e137539f0744551d8ab61bf49df1f11cdb6dafbe4be43211c653f82b85d7", - "1bd23cdf79487e50763ee0624ad00259890a3ca87ec353170593c8a73cb769ba", - "f0bf7ed7ccbb2217fbc70687e82be366a2b1cfea41de7bca030d6b89951e4b49", - "8f3d1d12087bb155e0cab8df1a7ac7a12728f1a73dd8c7ae107c13054b9468bf", - "f23d6bec94b30f59d7a80af06643a114ffad6cf6f7ae0a141fa0e28c1fbe0dc9", - "7cbd41f8759ddbd5fe935d7a0f806350daeb96b233b5f1c1c8eecb868be0937b", - "7b5b1c0cabd57fefbef88e2f63ce90df4e7765e7698bf69fcb0d75188b1dca41", - "ad5b310cfb11a6bfa2cfed5c409fc78dac90ea25fde129d42527fb1271b777a8", - "11a8d99432d6213192ce728f2efdc875aaebedafc9df07e487b8aec2459e6e4d", - "d40b04b2ab64ba7abe96c98cce0bf80a38f778df44afab99018a1249c78284fb", - "be768bdf5d7ca3443260d66bedee576f7fad227e86146e837d877750d289c4b5", - "fb66db220734754f648d79d6d22402bf88aec277033fbd0c666e0e9a7e23e4e1", - "1677b91c48a04c261804f68689aabbb533989f6e1a0bef2be7ee2fe4b94c06d2", - "47495dc78ba507d3aae8258ea11b07dc5b0043dad2456e8d4328c7670784dbb2", - "7cb1fab59c82746ac57814c087d496082395e13503851b3543d5aeff8876c0e6", - "fb0e00c60dde19194185387bf3b256f1e49e737e201c87e67494d0f7c2fb5462", - "9bdcabcb5a049bf3c394ac202ba0fc425b1cb3c474c5c54f0c590093f27cdd6b", - "591866e404292d8168a2b79d0bd178ccba818923f6219c34e93ad550f3d9b13a", - "32a8db29a40f8f62bed8f0897b721494957e5601b4fca6dca88016f22692cfba", - "f47a010022df7729c542249386a9c189288c8e92e1e0c9f9dc3407458bdbbaa4", - "41377e473d1a84176bf6a25827fa36269ca7f14a418ebd03752a87cea7b8518f", - "344bb0ce1576991fcd3b7a8f844aef884d579ec2a80a2f9ed90e11b0b61ef3f7", - "62e5773cdd07748653e6ce51063db3e0ec23ccaddde13f026ec4d9e9d6ee9080", - "690d9de2447d01514d1469392e9967eb85cce0a24c98ec2d1ada4a2c65be35bb", - "28203100e071648faff10718ee27138797706878ad07b28632ceb71410ed8bdc", - "86bf6e9788cb967f149e50ba3d763791084e183a099242f51b06d6b45dfc9d0a", - "9f0c87d280a00c5bb85656a4e968dea005dd454fb8d5d0aa5c67af3c4f951de8", - "e5b11db36a8f4806c73c82f9cc114c7cd7f34e107f41e83f0b61a93eb0f21f8e", - "4f47cd4e9d5d5d83b4d921ff139065c70dd6c9f1e87c6b80d495fb506d708af5", - "23ffe45aa17c0458991b2171ae2703688d39ef31b6ffe7a1fa904749443cff15", - "8fa3a12c46bda8c797a71e399d711b0226cd5ba89bdbcfd3f382142a15ccdc92", - "2dbe75ff457f32e0565fe206f6e4ebd1e5780c1c77c6526c4497c5ad6b86e3ef", - "9da2df3a470a8f07583ae30ad5d5a354b230a7cfb0344144746d2b6ca67386b9", - "13f159b550ce73cfa6b31e4f4b8dbe5eb1295f3161a778017a0368ae95201021", - "d80a4db052f360f84e36ebe2ea09e177bf6214f5ff767b981e1c41fa0ccab5ac", - "a3bfad403c7c66af345f39d141e7f6082b932216d7fd25b4cba053771abe6649", - "cf37bebbe46aae0025d5e986abd6e89d961db1e40747e1e4e5091bfac4209ecf", - "72546ca7f85c7a7f69364221fac3f1cb5e86660996093195da979a73f2a282ef", - "b52ce27f9a42a6a39203ccb8d5f1c21e0fc2bad0bb2a677daad60a2ca0ed6f8b", - "b4574cdb10284fe80cd9cdd9fcdd50744cced0996127a49dab839310aa53a01e", - "903c3c2711555fae08f2a74a7a4550bff4575f40f25528b5c2fe2bd0d7dea0d8", - "99aaf5796454dbddfd47a50ce238d3aebc245c1bb847b76e8354310455d39100", - "d5565a11129f788ab5024df86ddd609a2c0da8c6eb6925c5988958d21ce37fa5", - "acbba8b6cb268988c4885938b0ec719976051495c97b7df404847216c8e515cf", - "3c0caa85a5555f1a919727d68d2ba9fdc9e7eaa3d8a4fc3a161d3beb6714a3a4", - "a897d53ea26406689f10fc9d43a5f5b498f86a6b3ce00ec596de062cf31cef71", - "6e8a48197d4fab587bf7542449f9a20d709499631c0dedf312146f7720b5edd3", - "7cc77744e531b6ce66575e081e162f8a6ebaefbea4d23e3de5153bde7bc80797", - "3946ed08be3ea3c0e4361f643243459e3d155eb9d5a38408482d39e8efd402c9", - "fbc1b89d3e012a5ac99b03635d75e41986edc1d51bf517c8809e49cba6cd1d54", - "ceda5350aa7202e74a617e993f61b059fbd4902288b0e6204f166ec893d3fc4f", - "560c49132e0e969a0faa4f348595fe068811d256f022fe1cb893ffd14a2d9724", - "be1d669cc21ea23ca9a42c2bc1227cea67c90815a1368ba45f48fa1d27e4bde2", - "330e2c871b6d7b04689c52ba1da7a947e5e9758c9cdb18b2fe9b451dc5b82103", - "f64f5c4fb308bb8b9f91df3efdc43d0a2ad6ee6f166ccda7ad220168a66df32e", - "e9f9dc080c93832f112c74c2e02a1b7a04b784d43f9b692e5ff6c613a4c8eda9", - "056308e8332bfb1b72c79e317aa6f6f9a65a78fb4ff25baea854954dcac01eab", - "51463b7b76e0a05dd8ae68051518a8f9b3cba33396faba58f0af94f38ff8f651", - "80c791c03ffc923ac0a521bfb241ebe7f9743250fcc27dc4b5d7eb63607e2079", - "052df9e2fb9d1804ec5741be37d8c14e37495d83c98cd3c1f0e4eaeb3a943118", - "62f66f83966be151a64ca6d8d99bb6b20a82b1c0209f0c32aa27c17b228e0d0f", - "3aac22644bde2bf7ef1a6eb1716805aaa3fd5946d5d3991276efac613f68a514", - "1e5f19a04e76076a2865f38a892c8a99d3dfc0ffde789dedd37c5b9da3363e54", - "b5caf584ef87eeaabeabe899b485bba63ddfd9484552edba2559ff19396bf847", - "44afcd393b3ea3a7f48a661c96acc1d788ccddeba7625ed4c0c1f239446de7ac", - "6cb46037c864800f01546c3b4cfbb86acdce0af058b5b1960f5f38dcdbe2b4a9", - "bfd937d14cd4190fae160842afc7726c9f755532a02ea6ffdbf71abfdd4b8992", - "46fa094c2ca9c10f9f17a4e39716f02c10a3ef6dceec55ac6fe52913f6d1e262", - "588476da32cc3ef28d94d91832f1d3a0f6dd755b97f63d80af98ca587e754856", - "bed6e0558e8bb19d5def4097f6f2592841fcbddeb05df0c007a1271cb46c2cbf", - "56a11c28b50d5957d9efd19aa608f9dc6ca8387b69369f54e6a47170d7daf114", - "0daf90903d38122f9c6ab663b2849427274c2366f4415c39af4e20915fd62792", - "d577256905769cb6f90d2d33a4ceee2fda68dd86a25b6e0450a93a17680d3076", - "74fef8b61bde2cbf736429ddfbcc6a385ccc5c2590132464d8a4cf94713f8fe7", - "b0b100ee6f9672f787ac422a3b03d86fc17b688291315fadc8e82be935ad5dd0", - "dd40b81a49cf0a0a4650c4845a775f826df184e0a24d86dc1327172c3b616f25", - "9fd2afeff09dd484d907809a2b0e6d4e4a2699d8fcd439f1f204211794394b3f", - "ee05cb142c1eb1de02df76baba89e1865767b55be59e77127c117be60ed4d7cf", - "0137986a18d882abd9521186143d8b81bc8812e968b6929250c03a90958e6e1b", - "21295f85fd6d6958e551cd280cde80cb152e5777e265b716683f36f305f9bf5a", - "87e1b2dc8d31d35a5dcccd5df49dc74ed68a57af76d031483b4ab6ec92128b5c", - "6ed9764f47e2eb4ba17b8f76b9b0cffb825c7d29672373c2578ad445a6b987db", - "61cfc0763674a17c7774fd8b9800edb2fb7d355ae9d5b00dd4baed1a332793ac", - "53a518edfb10cf4608b9d48a5f5db2b7fceb9bf246bcedda36084610e0c0f86b", - "c49160629e06e41185f711e92a18d32e1c3286ed9d1ce05af6c2c831f1353cd9", - "16abd91e7da0f1b9c12104842420b379e056cc818fb81bad1b3ad8c7d4e5c8aa", - "6047b905a0c10077d738e50a87d3154f3c3024c2a3144fcb9d9eb46857f41ec3", - "f7b5971b710a8718edc6e2c4064f820dd44257e5131e53be15213d6c7f595277", - "95adb8e0fbc8ac89b0d386139c1f4e7ac0f01672474ed6831ad44ff0e9be8509", - "952138be7389e1aaee109fa0b14ff02339f518f0a68140ba4edc4e23ced318f4", - "943070920f39edc48f856ccaf0cda8449f5eaf8e9879bec87a7e0e30b897f1a1", - "60852dce9feb17d6d2dd213bd434892652399c60bbf009e9ba2219b4b4c48d2c", - "5e0f566e7e662a34a34123b1008ac8afa04f8fb4630fedbb74660f3d06c17362", - "c77794673e747061d889c3d8801b719e9b9d73445d93f69a4d2eb4999880b9c7", - "29f907316611d22ce94f5192b2fdcaf06796a58d9496067f0a597ae1f0360b9b", - "d664d5d08b183a757d981e4fa461da28a7326aadf3ad8a31fc291f59598e1fc1", - "ed0cad44bf33d6d2f03a9efafee96e9c9d74d526793c4b044e2d88b390fea5ab", - "93763fc425f9516f110c7ff57c628db304be1f707fe08ebf61acf579b627b93c", - "7fcb0824256095650f57d2f4cb2396e2972e23e88298e1de5e3fa2a9050306ee", - "9841856996c8d7b5f729793ff84a0d22945e39c468ebf11eab187e23fd74b52e", - "175f619849113f0411a20a7b4b4ba5e92d139624dae3783871b474a6f81c8f08", - "8461f1313d9bb314834de44bab619894e658792917b7a99ed00cb3683b43f57e", - "c3e629a8f18132dc09a4ae96a10a4cec5de243e686953cb25de34c8310024de2", - "840ce319ab7d219c8b21d9c5ac39c363028380ebc44f20f9246631014aefe544", - "e6fbb14a4e04ada7196228adbeec897a276382ca4fb086c1662b5ff427565a09", - "e5649294e8042102b39074aa763eccd2624fa5fbd8b65a51b5263060990b94d3", - "fc80dfca82b45155eec61aafe1c5cc76e55723eab62c359f5db174543de5e481", - "95082a1e69cd819e9cb876d1554a651527ed7786684fd6a408d92c8965716ef4", - "65d4061279a567007a1f43f5725293b006ebd6b7b7751299198174000fca4f54", - "1b2d3e54974fbb9bd62282779a4e919085874e59ce18cf8c1104eb4403c6fb40", - "272ce1ea8e1cecf760697b1aa631aa07030fd35bf571610ce56d9583b0fc0e24", - "3750075cb0116768ccf83e54191ca3f776be75a9bebbc3fa083fd82bdb039e47", - "0554bda401fe43591485f6df1d7f2393dbef4abf5407b0b3fc2cdfb8f5530967", - "f23f12a01dbd3f9bfe48920220def39f3a38f3cad788eae9dded8d1a083c8ac8", - "8ed9234351bc24b40efcb4158f4e3530c64416cf017f187280062280597da7fc", - "b682806ecdf0530fc1ae931ae6da48fe0d38ebb2373376f8f9bd250417987384", - "2e1e41b609fdbefaf4b1517ed567b1f1c154b2eb43ead15cb0ab283e7c983acf", - "f52e1e804c096aace0c88bcc4e09797a829d96e9829b639642c3f4c9ed7af128", - "089f879cccd49c58d822631f1b34f4cea641c12b1d1356574c329abe9ed60d0a", - "abbc64d490ec6f59f0ea11b3ccd5fc5a724b1fe61c944a7f3a5b30ef3d625792", - "0e8140b3f4cb25c8187f291dea851b00b0f274c74d9e809fa09de0abf042a12a", - "9edaf0bc9d5ea29da91bf0a8109f96f76c49040c0f908908c842785c117be601", - "ec577b2a46f11d4baa81142b905b033b1891c7d269b260e2db62e4adeaf7959c", - "b9bc996ff02c77aa575a173674081382bb6f3ad3d0a79fc8ef629b6536202e86", - "06070605fe4c0f81bdff444b4fc1625ef041cf902dc1340d4ad6d54c1c2e422f", - "a10b1aabb91af388a1ec6f84f9b57c12264646d436dc3ffca16a3ba76d3281c4", - "b3465a9dbe6cc487ff095dd83460a23c61cb042770d2b783d86712cec29dbf96", - "245e4dda8ce0d73bbbc7496e0bfadb4c03ce6e467102512b01fa55d6370def86", - "a82a248f19b56a9757c65b2b4f4d4771454922dcb23a06387a969397f8f1c804", - "e8121bd2e8fb438f998ab75b7018b33073c0c508b18aa71737481c3115379e85", - "c6c14929f57bc6aba808dce5d0818aac9552a4e993bf7140897504be83a454e8", - "89660961bd35a6e133ef2dd67489a342f289eeaa1b58078473ba807f9370549e", - "eacce931162bf0e234a1d7475f228415ba832d75eedfbaf02c2af85a18ba469c", - "02b7636182be64f1ef572267fe4efdaf7bb1cdfdf0682e782721627aac8974bd", - "54b2a6ba468c302a2d7bdc0e3c6eb0e4eb938de0ae14efddf17c27d8f59eeb49", - "73bebce9738fec5eceb7bac94f79a5c1a2e3fd0ef2096d4361af9f4b8f6426d6", - "953eb28a23571845319b7becd688e10686a0889e8f113b3139d9eac78c1b88e8", - "fc9c1023928f90f6433e87b29288270cf51b89cc73234dfa86da967d13d33e6a", - "2bddeb7c0b8bb9447bf6128c27beb0a6389b015d4f79af106eb727ba1c528a0a", - "bfa1bbf253ef57f4dd92ac9f3c9232b5cc9517028fdd462a90e158ad6847338a", - "3ccf72874f189bb345f378ba194475b7420a43cae29e8d8e5cb332f9fac144ee", - "7725beff6cc4db7630929718969d43385d059a141e2b7b71d07655397b449905", - "bf3d2737b04bc24c9dbc3438c1b588b17c74985d48a3303cc83df6d7af05bc95", - "acfd45991133e59ce4dae1e5de1fb4e2604932bd6b81a015b133b9c6b89c9552", - "9ca4f4faaba2b5854279a25a00ff23100d64a4af1a23c16e7a63a77ee1a6062b", - "929eddc54e236b47a29c2dae265d5f303497dabcaa1d93f15d12afcd032f00e4", - "53745ce1bf251832adfe3caf0b21fb58372ed0a893bed9913ff57a6bbb6a7e7b", - "66ac395504d4ab38eafbb5d9c716b0b87cb389d9cd2f8d666cf3f963ba923b36", - "6b4ee79a55152e285ef1896f992584ee82a59b8e3df50afdb11ad1e5006bd79e", - "ecfdb4da9cdab3ba358015be0762292308c21f373e7571e62ae0dfe2aea378f7", - "abd1a2140860aa012d555c421332b066c924e2aca5c5756365b67493ec69c1ce", - "46bdbf69d6089546a7069a77a2cdc545aa2ebccc5dd78af8de4f278d756d5ec1", - "80bb7d9a8bbbbf5fa941269ba7b9cb77104e52f6f13da776efff58458d299bf3", - "087e45a5b5ca5986cd1e482bdb5859fefb5ed09db9656c522cc10fbe32071cb2", - "e0125b42f548c4f9e3404a98ef9fb5d5d2ccd25dde71bf9a4c286c52ae5fb168", - "e16706e7dbf65ff168e9e754158d71ac5236012b8bb1ced840a8268570bda8fc", - "d29afb261c0956525247c77f5e35798b89de69ef78c460e02af7671c1efdc371", - "9acf6eb1a60048fa5df4594aa39ddaa983b7e6fe7b1086169185745b86862871", - "e76668be100bd8764d9b75f6e9889bce41ec5b41f0c4a813caa5ae433adc1a75", - "68314f117d22f30dd07f768118879a742617ac2e411b22654387555bb7c8985d", - "1d918f1c389826b69c87702583acf51b8ea2b7031a9677d5dc5e9cea8f4f109a", - "259f205c5df371bd05734b34a98993e0f71449f62a2989bb0bd32760524a4707", - "5edc832f60967f005098b19285284c324c7e98c68a7fa143c0dee5b87423b95a", - "eb3deb1f893883deb46702b795dbc94f54bd6c8b00ef83c83e9e9c758a82fb14", - "dfa144f25bc04f1e93b4884822776a30e0eadf599f820e3e5277d5e8257163e3", - "b70deeecca4f8d70a7631e9ada6cc02fabbfbc7f342b2abf026abd83cc069928", - "d2e6f9bf66d7ce20d311ebed0627d56bfbfdeb8be5d831dedd0ef3dba44d6643", - "2296ad2963bfd4d2f8a88440d2bb5e32fbe69ad707a550d5d09663c6f0c02aba", - "cca883700c5c770cce9cc38ef28b3386149a3baefcf1f276cf7b89a4f6bd6c14", - "86c0aea89d5d486f6356bcc19e9c00ca6bf9060cfa74a7ae4b2034af88df988f", - "ded35975ccc790d589a076440a3896a837719ea3f708221238b19babfec8c342", - "e2f061b8dc6d9eed64df1ffd1c0a0d073c384523a05116a4c529bde00836f254", - "e72f631a3344c3893d8c57fe8e03415eeabd8e766bb534ea57cf980304e5e281", - "3f298fe3501ac08b3fb4cff51d6d0e21a56deda68982b5b399cb1f711acba960", - "9fa9d02a9f6d33dcd8b3f42d691123f7e00435437406e5af4971ff4fbe704519", - "030d52c54d8313c65e93430f43e67c99a87390824e99b29ddd6602b4ee5c7371", - "d13863ebb35a8da65551360f66182bbf288850b17b7a7c29c970edcd8dff5264", - "3049d23884d12386c41b0b27a3100baa1004bbd469c2c44a2a1658ff48a0ae14", - "cd384a54680e797a32088a96cc5b01d49b54b50d79fe73776a881b51485264d7", - "e50072aa807709a73d030e5cb5835e9b3ec87165a895919a3871334ad042ab13", - "29df19703f48dadbe1b2cb30bdc6d72d3a8e35983175b5db941bb966e8615284", - "89d5744a96f0493a65e9dae02344f7589b553e8621ad7cc1d7ed7b80ecf06a6c", - "3ba64c7b6863ada2bad6c1d8e139d16b15d75685132e687a03fdd4bc31e9168b", - "f1dbd436c867e15753aef85f95cb8481a8986d7aee24b9d088d475ab5bb9d36c", - "47bcccb73cba3c152a9c88137a452c425e9ca4c0e0f9443c36e00d42764d3333", - "5e63d02a7227702b1da89a2d62d41012e6149a109d0e736a55a6f914f7b40bba", - "24540ce6b387a9f05aee2c29562bede600b619c6d7cad4aea305d0ab8eb456f4", - "8884c972f32e0ad46d360e7c288420061fa79e14fb67d0737d094d0af4c9d18c", - "e6b6014950769c7f756d1b509032f7967f6f0549e9873104ed2c3dc264287e82", - "0a38a0e9a1c06d7c3819a6a656d17870c5f5bf203a77f3565f86a294c356e08f", - "e1b7eb73c2260587f20e9291c11401bcdd011b03d58f5767727fb60fc5a0019a", - "bb05f808fc7954b894fc3ccacd7d4cfa3d81dc6bc6cf1ead3f9eac49da4205df", - "7084b41780f48c43e58a821fcd06297f805547a52e063c0f26fa25223621ed9e", - "45eb59421a900f9116214b28f862f47c7969570201bba32ee5d39f6c1356923b", - "42d7744245a13e04c1c669f86bd282cacf26f6594c3c9cae8d20746c8f008d90", - "6e50c9f8b79d1b3fef25518b9251ce8546cfda6efa87bff28f9fe3d0de055aee", - "36f0dd9eacb1627ab6b6744674f99695df118d558d8999b0a700d05f93909293", - "df8fa48d27de0e813b5880914a43f92c884c4321e280f5255ebd6f05d5ac0d9d", - "36819fd0528298e8a2062f2dc25a620b8657ec71bfd4070987955ad6ca521382", - "0e849bef91e5689c0764e22807ac22247cf6710944a57cb11213f7f02d025c3e", - "55a06f51098758b41b5baedda8227725c663e595b54f57e5b544dfe4461cabb7", - "0806f4467eadd238d2a4a4c6be6095013c35812980b7d057b0e87ce99786cca5", - "1d2981a14ac250399df5a7587638211941779a08365a42b431d5f758d58b3d6c", - "7901cadb44f446ae6712a92eff4ee64d8ba5d4158de72582ec8754bd6d08eb46", - "d46b272b7d5d2981690eb79e76653f379c74f4697462f2940f3f44f03dfba642", - "c911ac52da5098d9075e6220b448e4dd45888db13d8cffaa16e2e19146229e47", - "0552a9add22a607cb4e123e9aaa22fa5b9679e55b2419515e69688730ab457b6", - "7cc9a9f76a3862c9b057fc0f15ac60b764973de5811194093fa30d805949db8b", - "d89f66c2a37a0ae8cdf98fe103544498f7095c82afa1d9b52c59147b261fef8d", - "34fa0d09d16dbcdf3eef44a657833928dc45c973d54f44774d4558b031c3d750", - "2603060efb212d2488de378a798ec28400cfd654283a2e34cb60ec38ebcfa9be", - "3606c600eedcfc68015fce5e6d54f9ee619d687bb1fafb5fd48ed9df2a2d31b2", - "8fd098e9e62d369b6d34a0dc2717b9b6ec9247ea165758629cd8f1fb434919bc", - "04434593710f2307a6941a7431ed984f9af69286029c3404c52670ea1b6c441e", - "13bfffb868754a2ed4015e80552f582de78d47cb2d146409958384352f2358ec", - "e7d8087bd732c2702e568801de2cdf4788b7b1c20d598c48dfe43891990c20f8", - "0ead438a0cbf92ecf6f628a830abf0a23479b82d88140e9a6629353d18a9ba09", - "6bc678bff8058813ad4e06e66ab8188647fd835329dec3fd2757aed04410ecea", - "789c55e16045d8b295d86df3e0d20352640fe7bd2afc7275cc6642686e92aa7b", - "3ebb55595eaed786e742380b5cce1b7ecea02176099f83001b58a2645cd1721d", - "59386e927a1e5644e3b1b64286fe3bc8f63d0550ad9a0952253505787e19371b", - "ca43c6bade5ba5acadde108616b57f12b99716547f085e8fa4159cc50941dd79", - "48086b498448450df4263ccb4398cd49d1e340c4dd3d344e2751dfb943ae34f4", - "56d1fdd7fa9de666d530d657a8e99f695110577b2d3485f7680a19313980fc04", - "9baca08077ed03a2dd7fa467b3d5f049762d8cbb740bbd873890174475f5f11b", - "9e2d65488b9f86b0872d41d8e9bf5e9de674bf595345faf5cd7bd2b8efbe55b4", - "552faab0e994f1d16f420086c266e65bedbc1901af19d295d9f3cf28987efe84", - "87e2162bc4293a2a3919438fa5a6277ef83ce42407d03b4df32c27e3b3a58182", - "61c081a8852871a28c4f8e64076b3fded0348eead35b57e30a54ed46dd7152f3", - "6dd5466dd84e41389492513a78015ff699c650381bcb2de6d905529e52c71eda", - "4a85e9b940434000ddd290461b1a466b6c22582c01a6ae42a53fdcb9397682f4", - "e2e4bb9321b847082b0d0100bbcf66b0fa73ed826f6af18753a4f4b61b91f8f3", - "f30073cab97831c5fa4cf8f58f5a600f6980bc5e104530fb89431d7818c2c685", - "884136f9268b8801e176a14839c8a4c408e9c6a6a682bc1f36673aa128cd26c3", - "b13ddbdb652379e6acf06ea01014656c56ef315a18f9765f285c37c642dc7a76", - "9e332f238481f08ac6af18aa770ac2cfa7b92ab1b3cf02fb49b5abee3a1c5fa0", - "06212de1190b9bdb67ad3dc55e99117aa6a9a0d37d78476cf4edaa519a6faa75", - "f9a45af310723c256cebc68b0266ec5f5af9fb1ca1c9095d2a6d6e67968ce6da", - "fdd0b4ae2ae5b5173740d3bb2c97b698f4a14a5e29808403e57b58765e663b08", - "4c4b6e5f2e62e58476633b630fb6d03beeebc26db5d063fe90a758808aaa1c7b", - "6add71deec6e8c0edbadf60a107a3ae9ea35ef076b9340f47cfce7fa50b4aadd", - "31bd6becb86e6dd98923479ab19ad1f0ad143745f3ae72c43048760b8e15dda8", - "4ec796b9205d7b7d6ecc69cfae458765912ccac8e7921464f9d988fa1f00bbf4", - "1b03ecd4dfdf3b9c5d36af0444b335bc64956bc9043dca16a46e8c95e547f945", - "02f809a9fed6d679c037153bd5240e54902111e356e7a13f9fb0c2445b405c05", - "426ce5ca1f6dd04a7ae57ee089b77eb5d0ff6637220b38bf18fa9300ebeb0c9b", - "05e3e976f7a90f0147210c06b2160fce124834987d5ea3b5f170bf50e622394a", - "30c08c14724e024f1e5b5f85cdb70da5cf0634a7dadc3ae33a7e4dc05510fc59", - "d6ba080f419da434b7236807997e5d3c87437691293b139d9dd77cda37695971", - "63de0cac946ff5a2f32ebb5a61fdb18607bbfa36ac50ade3dcb73cd483a8534b", - "826d42e2fe45c8569a1ef8c705286c0a7dda7ce15543e3be4f366535c3aee555", - "76fb311f5c55919f77ef3433f005c2febbed7b48038304f4c5325a726890e2a2", - "cc728820f3c61471199fd3778f4004b401c031a929c9a170caae3066da858588", - "a6c3a78371a072c9e21816b88b9114e389255e6d0136fe1d52b9969d0a792f70", - "8131e765b2272607a64fc053e76d847d990b24c566b86bc0632b516a4b691346", - "e948f7fc4e2b1aaf263a2ca1f425e8acf4e3cdbd632976eb8199e586153ea17a", - "77640a525140c88fe55ffaca1315b950c8021b8749704f0448271a5a9526196e", - "4ba4848cb129a3f69bdbccf64a6e4034e8407244341b942acfb5f9b7dbe1a6ae", - "1721a771c4333b390e7c7d581ff594af23d1e51f2bce3526c66c1b063a56247d", - "21bbcec49d4035f4d80429e681ac3f37f858c4f48c995de5fca48b2205d06111", - "d58f2285c925b18f4af36558ca9bdc94ddcddf3a97e61b6ba4d8db163c6a7b48", - "fb98ed5eddf2056951e5cc3e498f539487797d53c2e52b9d3a4f4ef6dd923995", - "81aecabff307601dbaa69042cacc08764af829ad1faa5bbc04998c2dcaf562cc", - "c10e5a0e2f916192ac5d5e43209334676eff31711df462ece933be559039b903", - "8dcfbf82e7c44df8fec595cc2b3c9651cfbbc63b4eb218fff48a7436a2aabfe3", - "7fa2696d48aaae1fb6d9d36e83615bd5cd8e2936e3f1d1225f0ec3bcb61c5df3", - "098317ab79b3e04b44ddb9f962d64e7c89f6848c941e334efde371e7c6458430", - "0662e521d5ea0f968713ca146baff904289adbaff8d4f4a2d1e53424896a799c", - "b16eb1c16a86f4208bb05d7ead7ac68c5a71e5344bc01bb95b09a6cc54d61238", - "edf50685decae6c8640b402d7f0f0a9969c5039e52071ca91180445ac605eb62", - "2ea16c202fac039d0b24f8e81adc81be442dbee36eaf39f7f74f2baec4bec324", - "66fbdcb4ff23e6331190001e3f2b8e870ea6092492949c305ca2205474a335ec", - "04e7a1fad092686b9eca07670d0d6fd041cb9738e3461b46cd3aae5337e74026", - "d21dd678ba92669ecfcdb549a64916cc26c7caf2b03fcf42d18c957f417b717a", - "f8e001f0e3eaab32d8ccb01c662d118d84c0aed515d8da89d0e61e0b156b6e5d", - "ce4d98207f5b743b38f654f87e7fd3fd4436e4f9e2cedcf9d084f1ab72884de6", - "cbb4d6c4484e375ede4236d0b1aa9c4306cc691c1286a2d88956d60b459d2ae7", - "6675829f1cbd38f365618940dbfc564254d98f1ea5a09399164d2e9368cf15e5", - "b83e76a4b36d2c5ff61c91ecbfdf68c5b140a99510c26bdd88e57c41e07ac024", - "3589ed706910f543ca5e7474cb438ba689a7794d0d32cf9a0e1d3c94d3b4f59f", - "69ab0acad0685465be0bc69c23f82a9281387cec8fb04f57cc69a50ddbffbc00", - "6be27a658aad8d41a6779cec0ecb10edcaf26f1277e492b709583d5e0bd50842", - "fde523bedd3714bcdd43bee7e2e45d9ba0a13240d0aa30808ac01b5030b45a50", - "249a5b7a6572aab3b1232cd5faf9cb211cd44b58efbfea96aca60e69e047c8f7", - "3cf6f87ffd94eb6c1942190c8a01854dcbfb0647279a732cdb46a66fe0ff7a5f", - "d770f3532058b458f282ae9da62464ba88acf84338db308805b04b4649ad7f08", - "d1d823001242e2be76966edbfc61115a90f5e4681d9da7e81fa5d4de8e9f95a9", - "627f91e725d9822d452bf923ad250e8e6eb45b69bc9a1a3d795cd9295a602ae3", - "8a978ac3d3df03e75a0b8df2a31afcf5ea1d9e1f3f6da744bfff492a627d0c0d", - "0527791ebb3ac356301639aadd3f1c5e37fe5bd7173b02c1dcce6eab19545786", - "467b97cc684e905bec91efe7448add0199d0a62ceb894da7fe9febc53a993773", - "b92da9c3263d3200c5990edca171846246069050e4cb616fd4d116f314988999", - "95dbca11e2b0d06220de94e1df69984585433433cd2e4b27ae0d0c4c90c6a5e8", - "876f66a8c991c5bab3c542aa2a4cdd1d8d008109e87f65c6121bdc28bd0f06bd", - "137f73d7a859802c2d5199bb26b7e524e18b6af1fce82d55ed5f49096e4100fa", - "460fe130270c52c68a4e93aff97397018295c0ab217f294ab4ebfb0174064bf0", - "ca72175359377992f32f32611127036bb832b86fe69a655bfe70af60083ef4d2", - "79a5f8f0f95d63951af64dd21e44e45912f4fe3529e917b909be82cd24c484a2", - "38f86cdc913827e7cc69594a3d60166a45bb872eca3b07f4b87850fb41e86fe4", - "7d35e4a62108bfef299e7bfe1b92e61cbc081f52b9ba56bd1ae6e01eb08d6730", - "43fc33834ab795cb44d644f40e28d27e665ec589b82c5b9f2e5fd7cb6b69c9f5", - "363843b543ea9ef634d347a0f05d13fd2cda5d15d6e4369f6087062d906b2b6d", - "d663246a1a2f796d46362e9a80d8c2158887e4c4db5dd49543bb65964d461b46", - "530d0558204f430f5c6ac60fbc1fc2d6cd929c7e5e206fc7f9b09fa79fbd706d", - "e98d350e3a6446a88a448dfcd947415899c5292bb7aeedab527f531b5cbf07b9", - "ff0d633886c9f9df894582c5dbfaf270ad45cdadfda31e088c88c23e2ee2fdee", - "68636966f4c2de8124afe644f4028cc467f6fedd390de586e20e0ca9ee4f1839", - "0694b0d08418e72bef7b47e1071106af631d0448c63b7322a5fa1b9a47c2630c", - "524f1df13d088fb6f2e43ac7cef89f38995ffb3d7d06cfd5b0c9524a7770a8d4", - "4fc4739085a5aa1ffff74ca350144fe95befdd7955c26a844791678729ffb831", - "0feaf8725ff6ca3ddfafa8cab17295d48c4b1b6c35551feb2b9802171133b9ac", - "0cc27dcb41908a64f25efaf3f8d91d4d45b27d70923804ce9cb63353e686705d", - "909ccce77ccc95d44baeef2344a31e23e5a0358d351d9121784ef9dba51ce678", - "691209a33887469b7c224f79fac4d62c1fd3ceacf4e809feba5c1f5063eb0103", - "865a462793149345337ff189a559f53fef41222af4bb53c18032949973261b0c", - "080e7b92ba171aae755e3ab9aadf48e4428366ce6faff0b5440f2c2bf616923a", - "4bcee5cd1c0917b41e266c15b509c4422fea6828b19ccc99b387b82a42dd3309", - "1ebc0f6887ce2c319a52c686f6ca104d8eee72e113bf51181c4e227c85a0ed30", - "6354d05216244c9959c27d53e0b24ebf189697e748efd86ea9f563b34c11ee64", - "3ce3aa2163bebdafb33bd3337fdc0cd15effc99ff33aa2fa755a5891bcebac88", - "3e09c580545aed6e34a5f9d79efaf87519b613b2b17e200f66e7ddccc705ff0e", - "080d3d1cc287c6910e3148f499254d3b64377684ae34f071bd9919a3cd2a83ec", - "abe73ff4b9c3bc39435ba53cc61823f206dcedaa82ed0304039f9fd1fc331e29", - "d234a921293dae46d7f60a6c456789dcb7f91b4b7e12e38b78ec4b0cbd2120fb", - "14d07f9ba1b18eebec4b5e8622adeac36dfc01b2f3b7882eaba1888b4f345882", - "f4ba80ff3548d5dfacd4fa4e0c9f2933869f41623fd9d788beafbddf691e30fd", - "091eca17eaa0b17efa7ff160260a1303256e91f2c26ed9119717534ece30193b", - "ebdd399a6b36fe39446bcc46dd5e52027152ae638862a782aa4062c5f126c6e0", - "0c39025d47e09a04669bd68fcf0d8d96b5b6ba08af08d36ec90417f1d73e9b1a", - "da53d04a9889437b7fe83bce60ad62f536e307b9e7cad66f68fb72eb0ff656c8", - "980ada4af75f44fb0932ee7cedca47831ee98d27d70fa4244a463caba8dcdbc3", - "2be4e0159931dcba61a3a651c345577e927eb8af2bb9c9fef7b29ade49c2df4c", - "4bc6d072ec2952c6a9310fd4fc46fa0bb9cc4d7a2d68c11f8966af8879bed2c6", - "47385ba84ef447b41fd68cf47f7d8a172abd9aa41f8895154638922c9e4d3fa3", - "2d82e15760588c409e28cc17c906506c65572e7f38c89b1794d6d19ff63fc61b", - "b636715505e6c61929fc94c066e4779c86f2c3cedd172ae09f1ae4ab66c99887", - "726f37b27a2830622e6643104661b5c1a73e398587674b3bc5b494c4b3fd211b", - "14170ef7caeca5de2a32adaee65095f34a1f19dc55ced4f4ac234e179115bdde", - "84ea7deebcbc685f2b112ff368238eea29c72a243ed75aa65a8c641c8ad07cd6", - "00a600437c46d16a9e707d2447329ecf6246efcf77964eaa74befcaeb7ddbd54", - "0d69ee612202171754d5285fcba5722a132f8df2c09d1239ed2e1f983a95cc4e", - "8a8af8ad2d9281422446f6aadb5a5c4c22697988b6ef14f0604591114a2ddae4", - "6380bebb801fc1489ec366b75c8dedf98629cff5a6bb0c6da28cf5cbb9cfe286", - "28b4e0f01b454a28193e8eaca9dd3542c92508f1e144240fcb11f75f8326b7db", - "92da4178a0f6b80ba8208bf2a7d27036ce25dca3a12b33b644fde5dd2d8752eb", - "b2890b445ed2cb3f2bde9bd5e5d3122ff5f7e7f64da8afd797fae220a1d4164c", - "cb2fc9434b7d09baad4a85b179a058aaa6116127f5c5eb7014d457aacb85112a", - "e3bcf5a8957d04b5b5adad6b57fb8b70c09959ab1002bb810cf07b5f0ead59f4", - "c4168ccf5dc626440031fc6381a43f9919b2c967ffd27abb9033de19c2944d97", - "2ae89253522c5601207ccc0899dbe65c072e81c84978baf0767769448be4c09f", - "fbf2eed4dabbcb0cd31df6cca0fb621eddf8beba84d55707ffbd63128c7eb3a6", - "17796bf5803b4c23d1f8ce4a54787e127be79f301b48e3a35555c654a5a37a5d", - "3b3f14c230473bacf671a8bddec36dd60ddc9eb7ef948ba1de11128b2df728f1", - "9fe5987a08cd56e45f061feee49db6e8b2a510ae3e51f2620d720bc19aa83aec", - "8f61b739ab3419f7904dc42bd126041a8cc8784969b6540943ee89aeaf40589e", - "fb6568ccf3b039f8c316731a923ef3b6c144cfae8a9c61e3429424c2d7a6dff2", - "9d1637a6d3b8f9e1557f597bfe2a35849a580c5ad138dd7d64656fb742053fff", - "92a72635e4e52c844be7462f78d8cc4cced864fa3b26d321712c171dca9ff384", - "df9af920341c291ef58a8eabd7d9889437f3ccb4dadf444119c4e5b367ce2040", - "abde32437a3f1df6ce9cdea0dc8c03084f4961943feb1e6824e9d4f769256f59", - "04dacadcd29c4fc0b1a758f2b01946c7137a2772ba548454a41b47a7b67c2f8c", - "15da61a69cf0e7dbb3f37b91b024b20bf4d8a5b73ecd978bfe82ab0b4d7ee488", - "1c8e01caf4c4615f4309d30940a028da82ba8faeef354032a5ee2e53c229d446", - "16af8d2600573a8b8376c13ebed7a6c29d3f3297eb5e755302282889c656b46d", - "b563e484adee9dafa8b5a71675bd5be15b2174b572fa54539dc6d0077d7d17f9", - "a53fccd3e70901f6cc4b5fc952d11e9968d87e88a8b4fcadfc637c17da04f5bf", - "18adbbbff0065542ea5af2dd6ea03b369258986354fa3912cd564816fe12f529", - "61db33479a35fefcd38f8059c366e57873a77964b6087cfb713551ab08fa79b4", - "cb2b2b15e52a4e0210a9cc4421f3f99cfdf58c1f6b4b4f6b21f7fe70cf4f8d15", - "09568dcfe8993d147f38993191bf3698e1a4d4b3c5528680dfa0085266fac0a4", - "57992031a435f07279100e883b83b56caafbaf18a5559283bbccc9532c52e7ff", - "ee8d95ab47f18ed71c3d68b67483d6094270f88627d7bb270cf4e86aec06930c", - "9e7e3ba326888e43dec7ba448113a2ff70e3aa9b963fcc0120878b637ae49a59", - "fd58c868fed074be0997e4d8b9abec99a5f2e00d1325d85b43bc0908b49ed8c6", - "164552d7cce902abbe69e6de4d2e87c4a63022577efeab33c95986ad52dd056e", - "004901fe096d1b9d0f8b14b10baeca06c3d142f28f9d328cc9ed62c82769939e", - "57cc4ba997fa26de7a0f8fe279a6edfb17d594954da2693e417665d78395efe2", - "ab773cb9db467a24c9ef07e28c5145604a1e39d52bc4a0834401c4c580bb47c7", - "2b10721b9577d0b4acd50cce418085b551b8c79227a88ce691eace762dfd529b", - "3efa17054cfe8dcbb686e5194dbda3e30cd230a1dcf8f244220a92f1cf0bd7b8", - "aad8826d6414c0e0c62a9f36a4480dde4047ebf8c6b32baafb917e8686dba7df", - "cf68675457ae2d1557ac9bb19ca0a660bb0aa20158cd4e2090b546db587ccd6b", - "d0d9f2d247a8fbc2eefff3aeef9917f978ecb40da44660a9550daa0bf840a96e", - "fafd33ea3669bdf40bde3fc276e6c78dd9d36113842bff913382f3fe387d2198", - "de81119b06084b70606de5f28fe70b3ba1f152239cbb93300d70d46302c21e39", - "bb44197c33248dac064f19199f00e52d6516857faab20c644a4f23a201a40e39", - "b5863d1f963822709c4f92b96f98d908a1d6c42fae3fa36c0321370c354aa35e", - "ff069756f49d4d2640e50005f7ebbff92cc834f8a3c3d243a910708516123c31", - "a11264e2c7807c5c28f561c4d1fecfa7c708b863a12ea3f24eb965902f8e7727", - "d7f6bccade2aed470699ed8ef2937efbd880ea864c72afab9afd9f70ce6821fe", - "03e050b1d4cfd1cd0424a7afa2730a977ea3a59cef6956cda064a109a0f4c0d4", - "78e0a594149614ab83833b8cfe6472d22879463da13ddb09f30c15bfe1ced676", - "66b61a72319133db2b01b8d2a60a6d59338eee0f364b992509f9c93652604ed3", - "1af9fbd28f96466af285f8f50678c9c3ac795fd2c19a7da89e59194af7d16755", - "084dcfbc0c7e941d1b01d51eb44f54dbe676844294e474c9e684ad34664f0ada", - "9d84ea70d334c3d67869c58122fcacb97570709f879e92b421aa1a0824bbae39", - "502330bf3b0bdd8503bcaa5b69a17b9ac180aeacffbfdc9062ebb5e053760481", - "a0ff275a5975c0c49a07c0e7135d0b66481549bb9bad35c0adac5080bb31ba16", - "ef653473d82ca11d32e5d10af4599a7f791408d28f416c5892f4e0835b8d2f76", - "8b73188f7e5951c8b77b5e2ce63ae1db9342a065777c5f11e7b63dd6b58b8d3c", - "6c527772ecf397ffb5ef45eb140ecf47616c98124b3d4198f21db0e1c7056879", - "2db0df5ffb2ebc3f8e6015449f0e689db370cede9b8d1028217cb924a2e11d1f", - "543091844f7a7f9bf0adfd6dfb8c0bbfc5c286f535fbbbbcb9a1b777ef26669b", - "62f0c90a5586b526721fd7df0cfbe0e5d81542ca3100730d51a0a146e05c013b", - "8e3a39e5b9d872e523968d9d822ad2f82fef68ea06b0741a9b7d4d583a621f04", - "f9a37834768da8578d73a9caf454d298937008009f5a9156a1ac3f1129f858c8", - "a1c3e08b2caa0eeafab9b1d0d2a51a512ec5e54506fae723536b3dd33f84c0ea", - "678db70ea83bb20f5eadaf6689ac525fa23840b0226ee22f099cb1678dc6854e", - "e79942cb60b49b1e17635bb5155a7bd270540324928e2fbe043fd5efc57d0062", - "ff12e1082a8ddf20d2af0f2cc60dde90a9762511ba0a11152afff78e068b035f", - "f01462a064dc7ee9cbf89e4584f4b603b41bd9d483096db8c67c4c5dd3cc537f", - "c4066e67096e2c6f8c5d3e98ce93eb445feab5e6ee2874b696aa5a718e4f00e6", - "bf0540a7b27ca312b150a0814a0b886cf45e56179a4b4b850ad4aea2ea26db23", - "850b7d64430ad22d2e27a2aa582e17306a8537b843981c9ca7123be8fed9f622", - "165ea27dce2ae76c2d3f447b3e4ccfa7e5853a3fd6a97f1893ebac53ce060b68", - "f325a4babcd815b470cfe0638ec2cbcf798c3cb40e7cd225a341b5812f6325df", - "df7ac623fd089f345cfc3398a684d918ab1cc3e78941a8fa2813481aef0d23db", - "a9c0c5dc1d4aca4dfddf82000e5780482decf0b349930da1c449743a89c596fa", - "8d955f8f7f5a8f015915ef2b3f6e1d4a8f38910e91b4e6fcfdf497d1de0f2a6f", - "f20a842b619cc0fb89615c68d614c977aebcb9f59c9f9119b9d9e37a28f0d105", - "8da72e93a57d4a24a6638ad8c70767b12a7823dc4aab8a0992afc1bb3a8409ed", - "db47c0654718528ee49a617f86fd0ef7eddb601df6683797f45740a4c71dd000", - "c01139e597cd19661efa7889faab200c6f8a8bfd410b0c787af4560af01d1a44", - "b1d35470f03b99e9d3ccdb735c711359a28a4eba77a8198c257d322cf3345e4a", - "5fdcfc695feebdd344661be47412f8fbbc04595f7036dd00b6b915b2b3d357fe", - "720c44a9efc15b8b5d051d623ce078048fc58c2f94b1601fb427a258c3d72c6c", - "7a32dce1eaca51b028eb13da65b4730f319c15afcb9314f5ce6f659e3c274733", - "dff8a86a0bcde9583ceeb7b5a8206b9b660c0a81a39847100f060084dc964dce", - "8cbc73532971dff5401aa63bda3b48c94586bbc7524e5b6e61f0ec97f2fdd472", - "be42283a341e99b370ad2fab05117a9a1edaf55f7333656678467abe142317b5", - "3549773eceed38fa8f55113254b6016c9ead7fd750f5457f11addf5e305a3570", - "e15710f65fcd2b4e3cc0b99642a299a00f4fcbce93e4100d1b534d0408861bf7", - "91086578f9d960e270107b3d89f99abc5fefcc7e988ac3917bfd0174bcde883e", - "a75330b8d9e891522dced5325797bc0c47ffffbc6c3fe4cc774c49bb6aa88214", - "6f9908a9080c236851172ad051c62123f86b8065f6e2c6a5a7d7fa8490f2676b", - "215e6d6264ad6364c93afaaef5045fba227e9d8f4727ae3b7a8b54235750365b", - "385a7e993518fe25ad3fb40609a75799b7724e75438ed51dc4d8e5b3148e89c8", - "eed813c8ce5dd1451f85e24422ac5829a2b317385ee607994fa67858a94ee97f", - "0799e76efb1b8df4cdd8f345f7cc0a67bd98a1744d0a91ef1ec7bf97844d3de9", - "6e2732a110cdef44e02b7eb86d7df6f3f3801ef01e93d35a0db8e119a76803c4", - "a4f7e3ff19a67242ac9d9c42807a016ed608afe0022ebed8448f9e0f43183174", - "f91cf62313a9057eccf79d8778d25832cd932385b2e05ef2213c7dc911ed13d7", - "2d1ee175821a8d53a9c1a0dae3fb0de031e8a7082944aa432a75076a58f5641b", - "b1d3bddb1b8040c4830d02c6f74217fbb785667f89ff6c70eb7b711d85f88ce2", - "4cff1fd1dc4f3e00558adbc8042d20f9cc262939e56cd3ce8f9f8667ac1cf4ad", - "b43c24bc6114d9387bb925e6b7be469b301096e0a9ba33fa2a5c8ff3f4024444", - "dc67804b602a7955e4acd373a38760702a6be0ddd714d15208925fc865fcde73", - "791fc43a077c43fd3a9f7817213c7649ace4a7592a58ef31f06de89f64292d51", - "33b0425a8bdff77908cbe87ef3715fbfd88f19b694603c8e1a719d92b8be0c03", - "3fb3c45f032a84c2a820164f431ada891128323935c8bbfab2e07b1603539f53", - "e8c1612d043c36d2a6ffa1e72d925e27c7ac425aca46b925cbf03b303ddd1242", - "8cfabe519b90ccadefa33922c501f8678b9874dfcb9144940564d6d82e5e6a00", - "303af2e6fb0a5c99d924b73705138c2b5ad55877f2203fb9c1960fcf42899366", - "73f77b44f285c993393ce069270b1ed6762d515f4078896da0251910e9a86be1", - "9a451b7baba7e2b8fe826cb8575e5b50b1742cd2fc0c47f2b1c8243583d4a0e8", - "9f72df02a5161951979891f526fe4a7e1ff343073a92d4b503df0031e81ec1f4", - "8353c3181292f86a4c41636f129878ed4b05ba309703e85287511a100b77fb21", - "5f20bf5997f11564cea85fe08265f922172851b863cfd0070b45a8ca878f0a9d", - "d414978261df6fa0d93ab17a52e6b762c5fd9d890218690f7ee4359abe41ce87", - "bf85c51b0151241fb30f008bf1a9737740dac06286f96471f8ce2f811ec980df", - "548a7f63f9daf20599159bd031c7f550a5d7fa2b70b0dacc1148edff23a51397", - "1a7abe0002efbf1dc0cb2ceb40bb1378304c3cf048f8825b8eb01fb8f149b693", - "bdbf85a2fe9a0f2e234930274adcb5019e01107e9fac02a3ed384e20aa871b6d", - "34b244c60282c3e749aee47f766b23b730fb484292c951e9b468d1cdf99effc8", - "d577d8cb46f7adf1191a54f19923eda106358ad25411d2deb8c8478989af042b", - "ef0e72d755a04123ed4310e90594ed47f259912e913e769a08654ffb10be7162", - "4044c916994d97f0f126f69a5cde15764ed06193508a91dd23b860c893487280", - "b8fe274ae99206553bf65e5bab266c77a953a467617ca4ec6df7600d8bb3558e", - "80441eae49ebcf4801f80af5cf88e4f5190ba11fd24c65e23dac2e5fd25614b1", - "87e9517ee99dda589c17e4e9b165bf6fe6e3f9185d7973f1ac371b5f451384ee", - "36bb6e45575ab11cc86495267e2a00fab41a0e8eb7d853a8dc5ced1921c72377", - "1c8f8444451f12323857a8d7ecb926d7f9da33d779317a1affe7d59f46d2c3cf", - "ade3a89876b0cc494aab2f77e19d5763474921bc5e7e1bf7327d4c400c0248fa", - "84fb704bebe5fd59117320b2d1ed80f2396c19c18b3c0a2b0f9bdb6c95a45efc", - "d8cbf003005482df1d8133fff2e3b2d49b03590754bcab10b04f14ffb31077d2", - "fafec414b729576bb2c88f94a8c4d354dbb0ceea08a97004460a8ecb4ae94756", - "14e617e0a0f1a6eb2297e001ad885f4fee2b8cbcff38ebd0a54469b805c41e17", - "5fc316a5d43e3a8c8384138878f991db48c89128f6520515dbe2b891e5a8aa60", - "097c5d7e1c11462f97c9ce52075b8cefb9cdd1ad248c53974d746d25aa8184ff", - "7d1d4f95a2a94e9d5914e5be71e2564ced643ae8173aa3f6f99eca6e33bc355f", - "17105c3912618f49cd2bdc68f7c6ff376b4d1a04d38e58796b7c7bdbeaecb5e8", - "85b74a01dccdfcd90358b5ac4a240bdca70426cd9173462dd90376254da2bd35", - "dffd8bee2c894fcf55b99467c30f26f105f26344974807f18dc85b2303573701", - "bf2c5653ffd766c95a783aa2b7992237adad2668271bbaacb216aedb0e8ab063", - "c470b0969accd1b91a0b2aab14d9df39da85c52d26709b5e630dde3678c9f9ce", - "3d4d671c6621f46f6143be93fb29ba6ab9fe97a1c8aa54eb3e224146e8c70e71", - "0d4b87bc453cd42dcb05d3d75abbee84d7aa23be0d49fc5fda0ced9212bd1c87", - "2f76d15e0365c6fbfd046d02bbd40541916f26a07370439ca04de7f3e94f60a1", - "9d83033072ad8a7082e8458edb8c5f67366a55eb423b0d3363ec5e7d246f97af", - "72797f44b9c6bed8bcd72d5e7dc9781a5d3e8da567755df9fd74bd15ef02c0ac", - "70530c544d0c6eda1e705224fa570c4ca5bf9dd9a7319bcd0ca3c691f10915c5", - "2c72869e12119ffbc1b4ad1bda271e44f597f6931a7be7f75be838a9cee622b5", - "0aa9c0e44580cd00aa5819c40580aa36411f33bd4e287b7d4a9de049ce672670", - "296cf28fd622e9870596c27cfb83f0daba241a45d897d5a85b656bedf68530fc", - "f271bd12e842e4cc3ce44950d553acd6dc73744d9dcee675582cfe25c920576a", - "a72e94d3099b034f68c86ee04baf8fcad3830a25e0404eb42232fbd87b295929", - "d2e02c772b6871ea1eabd9d127ff2d5e0a9cd4b0c171dcb7e2a4667c3dce97cc", - "0f11ceca6106587fa4b4d07405859c52cb95a0d2b265203a02239fa077af9fb6", - "de905f5c1ace1ba2477450d57dc4ebb77d7f43b1f64f582c538b4ead94813260", - "81305604482f51194f9679cd6da697c5d1c1c25cf87ae1b89e04bbe6d17d7f62", - "30084cdd008cc4c60c7a7755475e2a4d6a06535dd58a8a92b2e4a3b32869eb3d", - "a0e7ce7ae87e9df0f34befe296e0be7755e77cfb4383570da68209c7cd15f3e3", - "2457207e8141edb8b4e8608ca1e1b6ab01dac49ad95277aa0ba75ebb795773a9", - "eec94c15af01211450d040af7a262d7657119aa2cae26f43a2daf412d3d71efd", - "ae5626a09518cdaf728adeae9b8742b3cd107888a375466e590eaf98020d2603", - "e27037c6d097878435e8bc4ba42f603dc472e32f6d162e054ca9f30e5763ac9d", - "31fa3777e51e7d74059cf5359347a2c2b6d247658051466382171d9993c41f1f", - "a85cbf9deb6746144e0fec2b236b620a41e5b5524ad26cce479b196966fe9c6d", - "a0b0ceb27569007828c7604fcc48876ea7816e8136e46488ca2687af9b349ad3", - "379f80a4c5a396226466bfea3cdac823ba23a04a66752df104734cafbedf9170", - "48a0b7e579dd44e2394277c943e65d570289c990c7ee4ec39943c1931e0d4c0c", - "389d05c6f67d119d2ed0ee92eaeba63809fec34483fff92c16b7b48a0d281505", - "cf5f65320a05aaf08b67f2fc09c94fc2cf39ce86e51b3f160d00c0c564b3fde2", - "a15ee07c09c73f600a4272a192e30b8546270a9496aa92c70b8666bcfde9977d", - "521eace11a3fd59410f7d85017498196265b96dcf71f867303632850d007babb", - "2ddcb456ce9b05bbf3db526fbc9ee701c2f09d5b4244272c990bf3dfe232b047", - "14dfdee4f9985d377d1df44fbbc0ae229e957ecfe4ea4db50e46a092022d8256", - "5a9d4b7dca6a9b2f92ed7cacc17e3292a174d317d00834d414905d414cb18655", - "bd0c070ccf3f4b54096a33af360635aa012c798f6e33a2581e222f96853dd334", - "7c5075bca3473f2e79deaad7223300af42d9e17e9070e5179c86b4b2e02514e8", - "81bee6aa3118405cf84ad073884a7453b83f4af154fa4eb040d8881f162a2db1", - "9da7c96d2094b657056c826292fa31eb8a1ff3811f574a68ce31997b4381d5b9", - "5fccb3597aa3f2d669b3d0659ddd84d593838f496c9688bd16cbcb9a4503bd69", - "531f167b9ef541e01fef8b8a7c902471ca34508d79b1e22d2b0bc56c81261f40", - "57f87bfa6d77d922b285634493dd80e2ae303b4fdb47c447da794f633c01e11e", - "7f5d3b94409dc9758f423b5c6c7d909941c68a46ac448ffd38ac26323515b0b9", - "94fd4489f9364fb9f3dd68bde75d647f6c5594d550ac94703b1921c5f5ae3bfe", - "a1485ad991c68945396cdcd5e11dee626e3712992c9acc53e9ee51b4e83e6859", - "c1bd11867117c867e8b750a3f20d682f74aa8cde4c5f5957dc781d4e72af74dd", - "6c7dd23f2742d6ba5b62123f31394852ca8857ad8c660ea3a46222b2faf2bc6c", - "b2e25870a6c58f4ae96c55d7b5d57a6122ae82d0c7b0176c67d1226be7e1429c", - "7ceab90ab9a2a12a6a3d4a4cc45886d76a77930f69e54ddf1aa2bef66be5d0d5", - "cea34ca49eb5f770f56da52b96ad32165cf43ccbf9bc12b8b8dcd8c1c454aeb2", - "5085a835da73f5fc4055d967f08cd97e2473e63b6a1f67f4f4cb14ad5b92efd1", - "be731d99198d24171b2db0db8db1a6a4f0b2c10fc23a780ac1aa5eeb2d64eb1c", - "ab4f542d914427b35e5453d2f890f2e7e758665207bd52405e3630b53a2bee80", - "fd7a27dbb1c94b1b07dabf080decb822c5fc4453644d44df17a159b0f6ce3558", - "738a3267f0e24b459dc91c9b394cd7e8bcf987cc7750ecad7fd89b7417e3e44a", - "75f0e5b16497617cf75daf3ea1d2ddd3c80b6a0b9f02a20c510baddd3da0e97f", - "455f474ef4409da4bfa13b06116d83a1b96281db4e3f1d735aac990233c9957c", - "15b1c010ded0ebe7caeb1b0947a65bb1158673a43215ba3284a0b8d74ea977ba", - "0c30d140714fa4c69cedd41212ab47d5c6d51c2a72bf507ec3464132aab6d0ff", - "6a5f240f551ac0dac33d5bb7cf1b3c45bf2707840e3689c6d30f83598940a6a3", - "b24acfbd279bce8d4d4b3dda5da0a1478fe4e0e64b5d932ae854d8957bf8de0a", - "01411d1f1159dbe040d5217093fd040fb643d605a2765386fdcdf05d8d009a9b", - "af276fd52b1649bf362fd00ca62336de55ab1f636a05997655accb6d83603eab", - "33d9feb81c219994b6117971337abb0b9f6a8dea79c9bfdcb105b176fe0fbd80", - "41c3fa9581eef97ed4b3c0e661e7b7e81d303f457c4f956b46448004022fac40", - "08962bf0521d8ca2de63f4638c630acbeec8750543075ab17943c480b788070c", - "68cbb4ce540daa2eca48f8fdd1e2821847816b0fac440fb447d4fe2da79009e3", - "1a5ad5539aa74421d890d6d957b278d04286c9432691288fea1e47e0485cb869", - "8ccf2e46860efe9cfd4c99e9e1faabd1b2a4764fa6e282a873b484efa426d918", - "ab2a4a5c48841998bf1a266507f09a7388f9deec8a7f4fadfff1a65de74d213b", - "adf6a72b99da179642242ba3dc9d530a31b248c77f4c03965b282689383f818e", - "18db563feb46e4ba76a31edc2288ad29193335a972ef2790bc755e310be3521e", - "655ce816215bb8ec32a725f1eaecac5e79d19abdf74ffeb992af0ac6f9ef1804", - "cf1a9549ac92204422438ac5ae3f5f22111d390a86299c0f62d26e877df2dbd0", - "cc8d43132401f3fa941da6f0da309a02d9f0b6de58dfe7fac08d417a47a3e0c6", - "2a6c400ae8d3ef2c9b19e7265f6b8338ff7c0967923dbc052c53ab57514e99ae", - "715494837db422b56b771641d80c6eb32c8c4d8a66d697900fed5434b2abf0b6", - "d31dd9805a66dd2e150e055a5a18fa2f0d3daf6c0faf8024ee60f3e3085e9e90", - "86de91b9617430272a8029d91621c49ad214cf6820237d99b2ea3ad9f5995990", - "143a30c943633575c894d38a0721ff238e5587f5b2f12d6a567c0cd71de1407d", - "22a488a2e99418ebb76ba2dccd1cf5b90be84826c8a82349a065f3523c62bdf6", - "02df1d6817071086b70b27f17826d534caab97a45c12251266a80e464ae228a6", - "a1a77a5319000fca3b7a754cea9145ef46023e55b07b8f3988739edaf944e192", - "7ec4589a35ed3a8084343c0300e3762692fa98bb4d6ff5aecd402fc888d1e7ff", - "b6e37470ded6b9fb9f63127f8aafe15f886079b9492ba4d05c39312dc468f426", - "79a11842cd0611fe6d06d5162c773bc77ec61da1ed736940d5d82cd841823726", - "359d32eee75ea470747cee710d9e5c1637359e612e66f9bcf9a9d972b809352e", - "9f88dff87cb1b4106b97e444703a8ef1d18ef2cb9974c22aaef0e5e56fc15e06", - "119a494b6b03dc42129c1edbd0d478fb6dcf2f5c1aa9cd4c7fd7f05acb043cb4", - "e711bf586bf045f497db40d13695ff8ba7ccf03673c1d682d016acc448216b1a", - "a569fda49abcaef6d18cd5fb312ebdedb8bc1b2471562b27de4c4960cce0e65b", - "2ed6a14314545068ce1d984a514fc5370968afbccfa0ba176ee3ef2f81d8c55a", - "471d508112108fee49c57a8828e7bef05934bdcdc801d85ca83a160ac65d37ab", - "b17cde4bd8e2f3cd444536c472a352e3672f2153f2a48a34b16f82a86c068462", - "8c6b551778d0e5051323ba09308ccf959b83ef39a97ec2192a54fbdb4a951f98", - "b3a97ebc32768c56e9613b7c3b3352cc867f56b3fbba29fe4ecd1c40d3351efd", - "a1902e4c21c913b190308d9a87f45a6d01f9081a452297cf9086805389801a8c", - "cab8117e64d668e95da73413015cd876ff1ee3b72bba82f77fb306e7759d0e56", - "52af8db80778f34545d96e6b5aedbdc4b836d255c4c7c4195ff6669002af45e1", - "db460b38fce24299526515b163702392c80274a0b7bcf284c9e233a0ffac00d7", - "5e71d388c78cb0c2c13f95e2a025be4a5267749dc8d95e716ee28374cd6ad139", - "f69c57c60f6ab29e5a70650cc5ac9a4b65755edcf31e385bc1fc1bc147caf95e", - "e4ce74f2a0ff58f3196aa199168cebd016b72a0f62728b692c0c93bb8a865642", - "3529b5c8c684ae02e18a853ba6c78d47b60aa04616d3b458ca83326526d3ac79", - "b7e3170d21dd4daad3c85b109a558f4423661d8656fbd5135a4c357c19616b57", - "a760b05a96fcc9d77c5ed4e97fe5bc29721149328fea5cedc2fab9814d199c0e", - "f3971580ecbf20bd40755883c194f0cfe172f4e517d7c8cf418d6bc0a6c34a05", - "50236fa9b7fe013a6a520d422b1adcd0865828ad52d05d340894bf970a0de2ee", - "3c06592b3e40e712f520b62849c8a5b1ca900e4fb4b69301db8b68bde9f79cec", - "c806858054386c51f58e5f8ac5ddbbe46bbf22753e41342f77b2a0c939d19c72", - "3cd198daa2367b758bb8f818d552965a493b31bfb9eb5b81c373d294e73feac4", - "c6ee1f40a072b46a98a3b1b4c7974572f86cc69fcdc2627b755f7a998c1103c1", - "797112f52e1082f519912142eb64d7d9c1af29882a19389b278fbd49d69dd0a3", - "f37e07d86b0fa289342eec546b3490fb5a8b3833037b9a7a5ae83add682c4bfc", - "59c072aa6ced522aba0649a50ac488b3219878f249606a1a17e57bfed02d6646", - "7dc9c17b45ac77084ca1b5f9fb66012985e99d9ef6da23bca92cf787ced230d7", - "d85e0765b1c04ecf708018de315b955cf38adb556dd8c8f082ef4b458e2a5c5d", - "b1869f72da7f959385f17d8f77cc01f8d2d093f85a0b416293747fdf3c3899fa", - "ec962cd5edc7adb4c9ad3bd55ab04bf8a80e30956258977fa193061beeb696dd", - "6a77dfcc643553e663c679d89d15fd8efabb2b7bf04292f6c8747a62ff6a73ea", - "50e0224c304ee6cfb8b905f0a2fe6d07b9380f79b729b712cb4e501af03b50b2", - "0c5a6c470d79a4d377c7cdc1cfbd16d7cabb0840444d4a9f350a29076524184e", - "9fc29e5f60a523380e5a1d2827c375e7dcb42b713218517d0890c227d6ecb55c", - "041be96833b86db05478b0787793457f056947a06d8e1473878fee53bbd9c25a", - "2ec03edd1b9d52841f54ccdaedf7cd3b53996ca65eab11574b4a1dd8bea80cdf", - "eef534a23d0d7b6e1f7dcefd906df1faf5720dfc7de19817710fbd3d09b975aa", - "881df4d4543cf90c4b0ccc852ed3a92d2cda854099ae849fa94ccc1c3e930143", - "70b1056e7742dbf953ca418c64ea8d6d6920c7913075fa76cba580e18af81988", - "f31178fd55bc02f87a8b5def2a5cd69098b790174e4a393cb6e2d6e070f60143", - "08096e83eb2ced6f349f5b83d77e38fd17f475296f1952e6ba003198c1c31683", - "3210d49bbd0720c5f07a4845f184148ed76082f0f76f7880c6be04c30a830a3e", - "f73a82f7838654df174a299e4d777fea628469ec7e3d1f6deac03e60bbe42eb2", - "d2a8157b73c304b3d8a7e1f2b72fdba1e67a1eaf050d20b9078aa664e4110e76", - "640a65edb32037a553cb34ae9b60cd77d8de89e58b47196ad036c71619548e30", - "761bb4cc614a388b3d21684fbce671c718439f0dcb54a8df4d7c4f274d46963e", - "45af56f3b77e9595afde77474592a41f2c65253abba448a989bab320156af336", - "e62eee0af46d3105fb87dd52a7722d063d9637d7decb34337c9e37ea7527d69f", - "65b263b6be468adc2a625bee845e29ee92ebd490126aab7be0a86eec80cac456", - "53c5a45fcc73215675be20e750a36a23e6649e79b1822f04c56b02b2eab98c52", - "5476794f2a08e04ecef74f5090f60c21ee1e4d07b44cf5068eaf1f5bb29da742", - "dc4b01ee05ff68f827153d9fe604a9bc1d7a570b4dd90d1fdd7a44eb8cf780f4", - "75e149933859add2d978e678cd1bf0318af2b4d1acf2fa9cc209b6b205a97fa9", - "d4e7011136c9b43e4493f829f383e11d2c08db040510011f077413eff508f302", - "6a89991aae2ca7e8990c9415d57ed941f2a22c85d1dbca7fa128299fa676a553", - "673af1e37c5379563d8a8fc56a727938ec5bf060d7ba3bd2dc16d20969cca085", - "10694a23258edd844075831f2c104b7009b5ce5fba4b9a05144c63cdb42ecc4c", - "83bc7a64e68efea63c99f4a25223ab72c4a47211131847e126e2a1ce329f4cc8", - "66ea40291b204e4219296f00cfdc536465aa009f22f3b699dc92c46bbde5c061", - "676403c6b84c3c6a2c4387763cb35b624e58a48f1a838f0a85602b0549e94ce0", - "3130c9809e7a8a276489a52d19bf29c96f08acb6a81f993ba34cf5718ce97470", - "be83b4c66864b1249664c56890ed7942edaa44ef6ce3954fa45be26d9bcb227c", - "9b20f77809ebcbca6df39875337a7f73efd1e93868b97b2a97b760df52df8d26", - "fe0ee669c2d4e2912e89ad691974ce64213e55640749c99adab346d3fd203b5f", - "f0ebbbb9c8c26885f8ae3016f60ca43b7815229ffdfc01a81f30446f14a77700", - "d0660fd797d0f4ee000e90c1ee63c8e2e9122111ab52cce1bf7386db8317acc2", - "d680af5ca17eb951b172788db39a1b9a6083910c07d64d9178281b3602e41838", - "6401869482f2ef44d2c7dc7db65eb8361b0b8b537e697e9cb8f5408f5703bf8e", - "b9be8d14269ae6421455fdba1c1b09bfdfb313ed5a576b012b3884369ffdbb16", - "30384acfa6771555afa5ee931f5c56ca547c055475509635e054145a6b9eabfc", - "f790d0f856a45a2322f0e1b364efcf463639bf37bdd946944b53ad894fff2a72", - "5b758d37757a9b344e795e9dbcff16f5a581c9ed772ff21c23cadfa53a31d3c9", - "01428f7064c053d89717a411527da11ce7dca502216499baac6b424492865408", - "cb623aaa4ec8ed6eca19f54f93d1b25af15eee9a669b0ef2af3246150427845e", - "e60e9f6d6f58e53c21263ae73242f0760025c1b0ad795553fc3ca46ddd41000b", - "0bbdd0bd3f69994a127f9aae72ad1c5ad703ce8659206cb09769530a6068f1b1", - "18040ee484833a7eb8bf7df12ea7b26a61a09fd3f26d67964ce2724754f13fa1", - "be808ad1efaa78ecdaeead74c4b277f947c064b8781b3474d05efbc48767b010", - "00ceecf1695472d25dcd35525da78f1f976caad11c2258d45e83f0757898d9bd", - "4f1912960eb5d719383321a8c95e9ff415285dfe46d63f259b4c1fdd2da46621", - "601703bc1ef45e13e3777d9750e6b1748d4fb4ae1e03f82c1ee9dc0347cefccf", - "b021103c11e7f8f178417eb4df27fa634fb57a2b860dbabcfd1d2b165e22f305", - "59b979d43f4e62409228656999bc3f6dd129a0c2fe0bcb222fd5fcd29a446337", - "75477270c29e1fcc23121952509786301c2a045096453944b5c2c2b235e06df2", - "29d65318920ca5edf6b94b6ab774cefb49801c71cf0541413e202381afdb7a5d", - "dd0dbd995b4599177eee510aec1b5ddfefb725936ef829776d77af133c141873", - "137f625a2e7fa34bae87b8d36e63d536cda22191da93f430290c680393d4512e", - "9027356be5f67ac444c91368a7757c4ff511482519bca2e7c5749125f1da507d", - "a75164e5dc7d56e7ab01334e68a11c49bc3dbece30ada5b4efca034978382466", - "d43195eaa203c3e0235e473e244c67f5b9ff9ba28990ad4128ff11620980f4c9", - "408deab2fae2f7d9886ee70b3ed75eeb4bbd7d7b594a9ad98654cc450e71ce83", - "508e6676b1c62054016e5f931225b20d2da9e93eb495523fcfcccce10b11ee6b", - "0cc403109029e89067f0d60a6f5bac5e053096f31cd7ff22bb5ca35a175f18ec", - "32d73dbd6736543e520f1d4a96199a86b603a17f7e84d024cf6599c2ffce4fb2", - "876d05f04d523b25469a49157407c9b34e2016d70851342a1130c11f652e83d8", - "672baeb4d13422ed10d230d40c359bd6e7bb44d9913f96b3c7593afb477372e4", - "b192400de29935796bc257b987c7dc33f25e2ec89158dcc6d8f2eca579138057", - "23474b076a7778ad79fe472644a01ddf531e1f6ccedd35df50efc1e99b2b53cd", - "ec48247cdc25227c2dae0a04ad98494d61bbde0039d2f90c3fb851ce5dcb6a49", - "d8f41830e8ad90587ae0b6f2f2288bf5edd4cf53ca78557eb68022de81711bdc", - "6a3af2c796bee7fa78e01b552cfbab95864442f73bf2f736c08d272aed9e9ab4", - "468e642ca930e8404a041ab25c21f03af943e0041f0d33b332fd18eca469670b", - "03348297984c81dc35c71731e8204c433c87787575c9bb9fcbc506f106d5c340", - "8d39e5dbd25bfcbdbd252abc9b4b0da529dd8dada09d201d1fff82fed63b9bb5", - "50feb03c358811d7bb46f71f6e6fdf600293672940c2b55686eccfd17120572b", - "71db6438d05021f62125ad7632f7c31670a0beb751c5ded91d8f54515765b659", - "39c10ebf84f15b09dd3302ab6d7eb5323628dcefaa09f71d982a4c1b2a95db14", - "4aef8b7c6cdf660eb3719ccebc4f639da1624e3cd97d9f5fdcbd9cbb142c3000", - "b53489b9f5d6c37284703c67728f1cd31b191aa062ab4cbf8b54453508ab0c31", - "7cfade0f34b82f9454c7c0fd7caa6d58c2cca29678981a5fea02c3f2c971ee4a", - "35805e49eb379b90b2adb17d0278690fbfcbd0b315430e72ddb0819304895254", - "0bd75b21714b9fda06e38914535607eb5eea1cc8db01dfb99c53a62dbcc3ce74", - "ad8570546afa464f3788e2a927c5d391777654b200ef622dbbc520f07a80ce2d", - "ad346319c3f41c13316605d6e8b3010cea406c8a681f110717c883d8da18944f", - "4d6c9d326bec92f0846c77c3ca88ba8564022d516a5cdb61cc73053580fd6100", - "77d6cd16aecd963f2d775d287bb590fb27c537807a1e2bcd6fa53a209fe264b3", - "90e83a2718aa8e2c4a6f7b9a74e5b13276965c031fac3a469f07bc1799a25d46", - "43f76e4d8d53c852a8fcd11ef4f27069d74d43de1573cee4c4d50b1a787521fa", - "afe1ceea01cfecdaa3033cb4fa3d7b384718c1b2d0c1f7201d5c01a5165b0007", - "7acd4d6eb9d1a484d104eeb0f7cb627763b40e231a3e060b667f65e52d6630e1", - "1f6a6c2253537440632100bbb665ec15a3c531b47de956006bff29dac3c30e54", - "4b39a1938ddcf3fbb37b216f0f939ba864ce56ce1287144a75a0686969021e28", - "042d63a94e38b845153c9e6e18e20e12e974d2a137cf847650fc81ad1de9b873", - "6907fdbf54849447668f28fd52eec990c31b02f884c90b1b9fa008d545672296", - "f1896f30c85a42eed28d7cb8a8d35fa7e0059a2b516c390bde8ce7ddd174e20b", - "6509c09dbb6f68b794dc6da4c5837da6d19555abad192455a6ce3a29ee722821", - "e9028b1b018fd868e4cf7746f573ab6a316122f19526e60273f1f771cf49711c", - "aead04037875f8ecac1b7f41e4cb1c9c3b354ca58ee387fe5f00f8979859dd18", - "3a4e8979b9e9ef60ad8093141df68e505b91e2eca18ed78f57b14cc1d78ce397", - "8089d522d1f5bf9dfcf93bfa5731270b0f4b4acee2c5d2eb4e7cd9611ff62a7a", - "2afc2e117414041618fc2da343946cb6157d49beead34ebe194abaff0890141e", - "10e3647bb13a2bce8f7ec7ac7b3f879ce1d6beb91e8da801e959f52854a4f85d", - "8f831dcc9b428ac7bc72ba9c0dab5e8aa7f1059464e10bb30a39c9d631aa2b82", - "c56f9ce7ccb5a1cd0f76a6612bbbca29341da1b5de6f979559dbec5d9020f0cb", - "fb1c594ea1c6e1d2de451f8a0dce01896eb7e4b23d347f5de8c94d223593697f", - "cd804db5f8bf17fb1931641dc8a10c65d1eab2490a714096293110ee230552d8", - "1bd1c33104ab473b522c00c4619a7e2044af7c1562ecac2a7ebcdad9c86498a1", - "acfdee322ef5530de5ed88912a7308bde3864fefc5105b4fd9b3125336c817d2", - "487b1709f38a99bec80ca0dad5cb995f3cbf3333a4eaf162d048266da7e24a6c", - "9504c691dbbc49c6721285413f7514b175f79b01a5190d4286f6aadd3dad9fa7", - "94626d97bcf97f682d0a9f137df3cf8b220d7dbf8a4eca7531d66b6d8d1fa978", - "33394fb719a11f420864b28984f44a53d1a200d956606b39173fe6ac0b64bf1e", - "71da815f8a19fcc4f1dca35ebe200a108e9c799d4c8572964e64ab7bf4bccaf4", - "1a2f7943b901702a6971f5277aaf2e153eef274389bbed93902e1a7b83a34844", - "ee47aeac811d107eca17ed89d644a84ec67c5be631f980aeee1f9d167822fc0f", - "f3e8f8b68c93197c69de5fdb5b03ee1718e2558e259ee1e14922b6fffead37a4", - "3024b5de38daccfbf69a97853784de91bc86a8653c2de10c21a7e0c9445fb7ed", - "8e2651d8d2e6a499cd4669ad30d94b8aaec51a379ff5bc217d9e53c3eed78f4b", - "e5c9b22b9d7ffa33e7c87c8570862a8ef916971b4cff5758209dd854bce0409e", - "7f701bc71fb39ed18feed5576caa05bb422cf81dbb5d51342c32424a9a5243f0", - "b2c8c9d5eaa542d9fd894903a35a57f214e9df95ebc867ba47c37bc0a339f6b5", - "0dbbf895c544f9db2d7334bc5361158b26e0977a8b131a807bee6c49f015ec17", - "6ff39c6ea09bef9bbe4582db22c3479df5a64b139edc9aa29683fdf5c6561700", - "8d9e5eefa70bcc29262590b6deb2fea2c2f9e0c50d102b0c8c10015efb89bde7", - "e58e9c9185972169a54dd573633384bc72db4245ee6e20021574f8ae96bca483", - "a635c4ee2d63a8c8a7a05829dbbc0c70c609260b0879fb076e6a97ffb743cbbb", - "c73b5f163c9882e7007bd65f2294afa1b64ac2452c47eec007eb981c2c313df1", - "80dfc8c3840f1806d9772ff92e498e34de56cc3ca8be653f2f97d0eb7e89338d", - "973a75a39fb43ac2c2bbc565f28112269bc1e99d4581e28e69fe461edebd787b", - "683760881a4314ef11396a416fbab69e4c797d29c313df261f8eb7baf75b9abe", - "4bb7d70ac677bc82a60f68b8f802266704a3f53fdc49428c0f46aaba5c544ab5", - "0d62e5bbd912800bf2a101d7029dbb9826a25914b03deb70f1286821eb984edf", - "830102d3733b256e869b067f33c5779e3ff0bd9b03a0d2c06a03c274e191079e", - "ae66e74fe5a78cb3d3f48c9d807bf7830b0f517f62c0ba8788be14643370907a", - "8c1c56b5144cf02e6a0b6738af2733d348506e888eebd1fd1827a1301a109d46", - "b3207d67b0b704925a30d0d3c4664300c9549c0c7a1515cb706244fe4b4e18aa", - "329685ab715345f9dc0b8ff722c448a4d89122bbb54cd892c900a6d81a449daa", - "dbbda208da1a4a38b11de2a029be98426b3d99091aa7ad8bef34298b0e6d5f47", - "fca8a911108e1b09f9ec3baf7444798c49e5a7732d21b9f5b843e448da281b9c", - "883a95513e1b6b6c45eb042e38609927c16a610af1afe76be7b1c890cca5c0cc", - "94c5ce9f041c67d9d7d574cb263dbf019530892a3a0bd266802c75c34e5c7ca1", - "b53b3a51f72b062cece81f2ee346311f1e8b4e4559630b968802532fac1c737d", - "3a81778c59b3aab55928aa43cf46647f10d2a7a16cd4ecac11e643be1079de41", - "fe0798c77a671b45c8255fe521af8fb4378f4d1d3cad2765c9a420a0bb18031b", - "05d12507ca95265621db6a5ac25ff2d58cf29227b3a6d773b5cb0924eed5511c", - "7a8d13bab13e0b870fcd4ab96af0c9ece7b68133fef8fcd29384a6f4f8cc6e5d", - "1135fa09ee5e3d3545c91a1390010c800ecd31c6c4871bba03ef1aaa1eecfac3", - "9f97c84864191c0f4b93a35750097bc782c8cab9960f419716b86a58daa4cc4e", - "f949086904a1066206239f3c8d9f3df943dab509e78c7c93818a0599bd7ea02b", - "b38e68f2e7e5395397df26bd04cb95a7181fef665e43a17423bae4abefb2abf2", - "a13aa3de398a547cba7566f6980cfedd2b17d08969386254de0bd64517cb3f69", - "16c2ee6be006cced4da0029ee17106b6aca60a8fc6673ac1c06c5286408d57e5", - "7dca0515ad838e91c490129875ec8b630236b31bce7c2b1fec27b8c510f06474", - "5d65a9746e282ec0ffeb11ed1244cca0fe50aac0c4de61fd5569f9ef9e4ec438", - "d75cab8913cdbbf94c8ada3a797d956f32e4fda7f3613686e7c438da417f0975", - "d01073218172787fb2405277f408d03f190ace9d6d2c37d587acbd857b15a9e5", - "7e9ad24b1b7007888fdfcbce0eb4e5eaea99251bf23c1bde523aafe94dd6ea4a", - "658624a95c97211329d08b98e7e94b26a044bcbbd291584a016bbacd5df10a30", - "714775546bf9facde6934520a2a4918a753bcc759817a3715c83bf0896954f3f", - "aaec4555d3b0c75f5fbbfc3b0fb0c594ce75da7c972a6598fca5881ae25d5d1f", - "43b35a0e675a6764163f0a583411fea9e7150b64fd4f93e519649096edb03456", - "cfa34abba6c091b66a90697f37c0b17392fba77d7c16633a3f3fda43c85ee4b5", - "7833cfd3ab1fc36d9689e8f962ce7539e2cb038c5627924d41a4f4b603885b69", - "99de0a514b25d02a755bf9dfd5d3d05a43180a740e00fff7a89f89483e2cd3e9", - "7a607ce96f564d5aaa7f46598eb0d73ea8f31ce37fcf11c6605c045ae98070b2", - "3901b988f2df10e398dd608616a14b4bc8bfa14e0458b01f2ecc8b16c699fb92", - "e070a33b6493967839760736ecc37299f2878aac6076626d253feebd8bc499b2", - "0e228351a5510ede4dd796b5b26f76146611e08d00363f7324af9ff5718683d3", - "ddc089af42d5eb6f8b627e6d9ff869f09158d6f927264fbadfdbe6c554a011ef", - "0fbeec33a706b05c32f6467f9658ee894c413a923fbd68a16f28e64f9f56acdc", - "a5f032fb9a865159defd76309d61589c836f6a84d325ec2edfa185b4d0a1d2a9", - "8f4a4ccc009dd542d09b8f83a0ec03beee7a1f2b49048ef247e46e1a74c21e13", - "bb150d651290e98cb4be07124431ad599ee9cf6625524bb6bcd735a1f3628b12", - "3bc016d133de466253bc31f938e823d4f863349dabd53453615338fb77df543c", - "879535a600820767a8a7fcc06c1de13c691ce74e8e1f807b1818b86508659a8e", - "571dfca0b39a78b2dbca482377dc612bd1c6debfeec75210ab4aa3406e0d676b", - "8376e03aea5116f15c730623e72120a2d346ead46f10267194e80bf976e3b285", - "e939bc32dc6c710e6c99640bd1a2acbaa8f6db8a085054691f1accc6ec4c4867", - "8ebbe3ce2700003dbfda5231f90209588a4731462e5b62c7905003f5f3199d03", - "0210ad6c599485b8b4e11a4b0be427363ccd0563717b58863b2db336f19c02e1", - "b25eea368e56036e42d62737a2854fd252a0312f30577636fb6269a2ffb891ec", - "a56a4119361fdd5c57044b31c2fe05bc742ab4da77cd42897c6e631618764301", - "358f54b0182d1d12f4a906928e1ee0fd6c2c126df7570404bd03184a729cd622", - "940965ebcfb7df99a0ed229c10e3ae719ab5fbdfa880dccfe44b660c395b06d8", - "2ccc23424601230edaa9260b01cfe3be21f4c8b23bd2a4f8e2620c9927fd6f66", - "128476dcf6feb70a63abd9859b3bfe8ac3c5407136e68ebf27e99da779721280", - "96a2fa892e94f180bde4faaf89fa3ffe67aca94348bcc912a3a2beb7310f83c6", - "a41187cafd2053852ce4350407dc2580f787e8f8d0c0929937d21eb5d65cfad2", - "9d969082c6024a01b9a26942ac2c8e315ca141f081085d50045df18013496980", - "9d7f9670da9871a2efb1fea1c579ac33cf90b515a234d20510445ee3a0b8cd01", - "3e83bbeceababc560b0b3af5cd93a27555b7dc10cee004dec8a4ed183357fbfe", - "307a880ff05b9aebf5e20cac95948c49d6760d9412115f6030b0ebbe511dc38f", - "62ab660a50e95d7584c70b7931fa73642cf035360b71a07606ac064b56dbe5ba", - "62c5e141c46e6144bcd16c64768a2f581480db17479a28b2b0549a81087190de", - "91450a90d1a34d9b588e4bfa79693521cd51e3b211c34d0278070c819c2cf173", - "894e637416e389041896baa32f8d8a8a0c7f13e9074ebc72d0a51080f4903817", - "592f1203b3399f9dc3db6f28c11bf08aabff15d59928626118520d2450293eb3", - "7f5be2f56f1c088d240c36463d89389d2105bf58e89c44e19dd4b34a7b6e6c11", - "4af0b12f94526b4b4d6b1dbfd2672badc2063ff47549c969b0d081f8729c75eb", - "dcc6b06a395f729fa7e307e12ad5909c692272c5bdeef92f492a52463b9c7d1b", - "58fb407d97c485ccd1fc571cadf5258a42d6cbbf173828140217748268a8c54d", - "ef2935f638b087ed45ab7a553a049b21f69e9d066c19597f9f8e13262d4c981f", - "6b96a1af7524d633929409210778dc1bd748e91f2f7fe9ce02147dace13bfb45", - "ebcfa9838bc4eb3d3f422c366fbdf52d4d502e8da097ae9a8b40f61729b8d51f", - "6c86eb4066d7f0ba89000035df7dbd502ec80e8954b80f8652a6a40b53d74e47", - "b05b5f9127aa7d239cb9fef82105d14eea5def372a763e86daa950215ae0e145", - "b7d24f73bf85068f39718de4cd812bb03b60e4efd9999c18f72067b48c4499a4", - "9e6986b0819250a447f553f6521bcfd9b5ae0b18a59342fd2b28393970b95ec0", - "bddccea8ae33d58ec032e9747405ccd37dfc495add58d21edcff3e1215c97330", - "74f040b4072e29f1aa5c500322d29c181566759af50ab8671e9f62fd6be6f53a", - "99cad67d9892ed246cb4af204920d70f6c4ac95db95e4e550a91ee538a2d4568", - "b244f4dde5b7134938a998b6fb648a2e0804210998ff62849632f60f1d544554", - "524288bb1822fa12ff6248f9a297547d6a1a2fa731ead75defea12f2949a9bd6", - "a274b3cdb4e14ee460757d3153a25c1a2485399b7417a8adbabb51b5ba4ea526", - "4a2dbf4681d7c194870b473f4b02b288e510605763bebd57059392113280e200", - "5dcc96b30689f598967127b32f00eae64c72796a7fd0ed4d1fce69e5a5ef2402", - "ed8050d8d67c7c364fa98e69f2471fd1f5f921e56a95ce9504472435cd39ad0b", - "365ca5d5dede5d1aaa6488536e4e180db08892daa62fe3aed35b7842d6572ae8", - "b33b0e78e0b75cb6338f5a6056f0b88e5b762b8ca0f50d5209b8c2a931a15ae3", - "f78574a8ebf4595b6def392a4a3eabe36d23ea11d4eade2311fe769d6112ff3d", - "4d8575737063fb59e1d0af82b49a8bec058f1e9193bcb4076748316c1164c6f3", - "6d9e177c2b2e6fce67bef70d89e33541d2effecd236bdc2bd73d5e841bf82d80", - "4fde17ffffbd1b7d10528c17d75ccb1a51e2eba3e54f5d788102836343ceed33", - "702d7c8bbaaf22dca08391190598525de89f9147caa4eb58262f5015cf48606a", - "451ba1267cc55209701df49d329bfc794a20b6c716c7454b7862ce88d2e43120", - "7eea368ace8e10955dd89e7f95a844c8b56fc4039c861178b0ef9014b15211db", - "92f0019ec496ff4ec864f1c13b67e0f6b26aea272b7407ea6250ee07207f5d73", - "95f770cd95c88a47f3c50bdefe84b7eb6ce83f0fc66591184602e12b93c20d5d", - "8f694a8c4edb9500da468b0caa92aaade784f346d576602d1b59e73d12d0b9f9", - "5ae1daa28a809b6cf7f4359d69fd589d4a1470295d61fe22b00b873d4f113dbc", - "1553148a5bbd451f6bdc75837ecc9fee04155e8fa621d08fcb25ec1d764020b9", - "f99c891f27ef99cf7ad67b2882eefddc4ae2e86f7448b42133a23a2161273a11", - "e680461026340688d38ed2f9de295c3c10bd84499b9116f28f83b9237d7ff843", - "f076ca6283e74ec4faa8c211bfccbe2b78410bd696971f20e5131ce54ecbe791", - "a2657fae519a749d75064ca575903691755b32ee10619bd3210c89ac167815c8", - "7c35661761d1d852e8285c97b0dd5bcd87a97363f3d3d44b56266efb243d65e5", - "9d99c98a7fa3b7bccfa5651e7a004a570dcf04a874a5276fd2a2d9c0d587aeff", - "8d132d1df1f8b31e1050994d8deb30c0cbbe3907934aedb7743fb057901f5107", - "a673ac0ff4d7d1fe06cf532f552351dfe494c800c77b26022be37ce3bc74ce40", - "c0a2174b578f53e3b9c941147d85f8b752d7d3c46e8904a85ce5cbb672ba356d", - "0cad9b55dd52c29927413b2b4dcdb6a216c8377eebd294f6cae741e563afd097", - "4940eed3ff09c03f92780f8ab26ed5dff1f0946914f72d1c7d5e767d043869e2", - "89f6d7ecce59155e190a32671fa5e33a1b6e765ebcf77ca0233cb70b8083b95a", - "cc3f259eeb204c123613955ef78a38b8ccf2200882726167b2d18fb28ac617c6", - "64d0dbc49c73b18e0787f806abf177dd87b30a412be70759eca63a8766efb894", - "afe88751234e6429911296351d86c69011596e5c631d67d13d9acc44c1b9aa80", - "0c83fad0f718e50ae16cfd0af269d770387d401cf574c15e985f37a1d6bf6113", - "7d016faac9dc2d854554b9ed616aa9dcb319a32fb22b953fc3e499e9dbd62bae", - "ffb365da735153e716ed1f3e7572d030d7c8bfb9dcf62b28f486776e3df87846", - "f2a44a19b4ef3fe5e41f0e72956dd860c292f1810da662f142bd7c8d7cb9afba", - "e35ec8b9fbffc17c7f030deeda2149e7c65d57cb4fd02122c9c8bada174fed25", - "abe41c98fe67a677233e2299cabc3bbb8816d221c517023646b6974e94e48def", - "ab636461364388b948185881c859cd6a3d8f1b944960d95400808d914761e84a", - "2e2011704b6e17adbc6c3bb098a83048691f123616898c0ecea66ddf2a3ae5e2", - "8a3cd248a655e3a1588feedf8ff8a77517a9213136a05be301a0984dc4d5a7f6", - "7cf9b9a453da6eec20f4ce5fe37708bf717b26cb96b8a9076f7b86784f7281bc", - "4ebfc4ae8221eac0cf32b9b2ea0d9c9da5ce4713d8a9c73d5fe535a8d0867f90", - "838fcf303bedce52583e48ac49ab81dd0fd5ad18a8cb030d451ec90efb89f71c", - "362e00372b1d52bdd2b8fd236117a9ba45289b612896931fe9decb83f2003a69", - "75f36e0c6fe985d04c231bf02c9ea5846ae41c37366677d75ced48211db70830", - "d2487572db84d4f4ca9395d6764d883ef9f0a72dfc5f68cda5a1e76448ddada6", - "f952e6e807c23077cc345f8b32ed558ab416b94751c666bca2d6eb2a6e5dafa5", - "321ee8e683748447e5aae8b03415b739c884d3ae9d9c32fafc5f3f3a551ec094", - "131d63942aff08271bcb1a2183c4675c9928c07cc879a33ce8be0545b634bff2", - "bcdab1c80281b4d302e9681363af0dd01da8711fb61b722209b81b94483d9e2c", - "00e69dc6ed9f98d7109dfb8ba50f21be5c865163028612518801452e2b324135", - "fbf314536a0950d92e47f7e2da78f8562014039c90120b12254ee8daad25a3c9", - "161e5dfca9dc88046c473cc30eaabfed49d3a19b92bad950e21659dffe5b038c", - "53b4313828921897770a7bde4bc9e3bd9c9d1ea615b95b3de5dbf2d2c537a798", - "82a333993c603a5a24cbe878d01e7e066f907c60adfe328659c495ab43f80723", - "11b69643d1466ad52f90cf585a662d0b3a4c508a61bcf113f5674e0df4a76cfd", - "ccc7db94bc2d057f8e90d1561d23fe1d34a8f7dfc27750fb1da0c0bad238fcee", - "d8e74cdbad45e1c5cd60beb196bf3ac1eb716d977c6dc06d288cd5b0c059eb90", - "0ce6c58106c15ed0b2b75649ab3056009dcb0d4c70006e111aef92c962b7d180", - "c0a44f3d51486c3718d70cf69e5e85afa1bb57e3943178bff81872f802299d3e", - "f10784504304f2815c2db2f20fb366a4072690f1630e3f43ef386c45df33a545", - "a000ba5cf55b2bb6b73b68ba38e4d65a200e454761bb32afbac28337a5ec3146", - "9e2a4e4ffafc0f5a460f87427fafb5da00fe1d7c3434e04e8ce3a4ff129dde81", - "1c5ec879081c55ed5dbafb6ec0ccb9a553cebdbcd5b3d9e6109dd4c0f791f172", - "981d45ea8425d8705d836027518a01c2478065b0e229c26aa69c3271187538c6", - "cb6deaac5206490801301c18af4f0f6318f88e5247cc9758d35149bd3cc74257", - "d225485bd780f5bf3766f117865a23c485b807da5ac800f42cc7ecce8c14fcc8", - "a13256c41e2f42e1c824c9df88c606749c298c63ba3197967ac494b655ed1161", - "b75fe3c66ac421d8062c12a8fcae0e1a15e82909619a6ca0e84442ce89b8fc90", - "49b6cd763058d59ca5a7a3a49023915606f7e48b4d25d901167cadde7582bc5a", - "cc11144d9c9a1f6abae2b0fc119994b86dfeb2e2de6e36af1d7da58d5e8782b9", - "bf4ddc8063360581ee0f517040b48f97aca00771ada24e907fac76b6e60931db", - "27e788c5d2828459bf883f55f3b0c0c99fbc936ffe692dc35d15617521d19bc5", - "0753c8da0512eb3dd8e473ced290133680f19425b95b3895d9dceecf88d86ad7", - "080fa83f8b93712c9a5b9efee492d0d4475404bdfa4efe9cd505c8a9ffa4e9dd", - "0540ed669f0befd8a2edc15d59c901291fc1eb70f6513fcaf9368f1c6bac6141", - "eed964a07eacecbecac8529917b949553ea6f1c3fdea40832fc6dc05bf544dae", - "269c57cf39ddc57061d1e433b7f1e4ccc4e7b05a434782d780bf200ed64f9700", - "3d433d1d684c5a31c92b95077727d460f4549c2244adbbb4a064c00ba419f677", - "07b6482723eb582017431f9bdae27f7407aa11e5968c814326d6f40abac44c7a", - "3119c4c4d8ab4cce6dcf9eb925eff3b85478e841e1b9b46ecbbf8f42d593bbc3", - "95f6d7acde222823d15e219c3fe7011d2b3f04cd4ee7bcd618dd84f7e095d4a0", - "f8afb7336a9226cc8d49500b28d8bd45c15b575cc16411e5cbc9f814fa3bcd63", - "dfaf933b344d86c67430c7c768e981dc8f9f32459ce38cfc93711c0fc647137b", - "af6eb3849ddbc3f42517b1608a0cc4433584d17c7b128582ac6d6fbba1780a37", - "70f564d2c3c852ae6e6f9b47e53b2f18a63fdd355c2266d953cc446fae5fe47e", - "f341956dba49599f48397a2d3ffdd4ccec54965ccb515db27740c6af070948ed", - "047a930aac32e71ff4762ae683c771c39864922acb40f89851b4b4386771b990", - "64ff7e7b57ae2943a5571ffc73dd4862153522a06cf2c3aa3b13586d286cb9fa", - "7baa1ae6f4eafaa31fba8ed470861c8c1bca88b900d20c25e1af53ffc6c2655a", - "71a18d739cbad80212a18a80df033c33f2e6e98b23b8db137207a5aa25c674ac", - "dffbd245b4b042eba768b69b6410777411eafb25999db2610e000e36ee581582", - "06baabed667e07d313351444647b534d1a1f5e6a06d6932fefd3e5e29d2ce1d5", - "d3b1789a5d8f69d33ad4525501b900dae8bd047cfe72c905452b9a02092dff70", - "e2e157388c35cfbd7098e748d521e86c36e7e6d19e8dc8a64abbef3e5359a06b", - "e343c900c906b016454dd5e3be3a9987919b9ad86382b43d35c5d5abb7187a0f", - "944ace7d3400944a7b7ea4e8c35e76c169881350e0b3c329b01c15d215870e30", - "821bee10fe6b7c2c93fb5624fa4838fa8e142c383f250f6067797ff843a09e91", - "6e0019f6beceadadaf7226b2196a562e74c023593ab64b71c8c914510b64c223", - "891c612a6cc76d422cf556ba946a14e10a2df06d8b74cba93d05a2cd0027d036", - "c57ef0c54c877e213a1c964964417b0c3def5604791e3f397d21e003611251a0", - "63d54adb8f2947b952f4b3b501b6edda2d57e0cc600a29de1ebe1b8e58bed7a7", - "27b6297daf4a43c330da6e1ba470fc7ab7c0653556d83b1eaf3ab3eeb9c9f53f", - "7cbaaf61c44206adbab4829f4bebe2ad81e68acb9cc9e72ae8469d25e0250bcf", - "2d79b65afd00d17a9d317bc534672f967fa50db04db5337a0f67ad9802bac6b9", - "9ab2577d541e42caa4ed5a982c80b151b73d4639e84a459032798ecb0163b3d2", - "2ca9deb62a4a7f48acc8cfcc31e5cf78622d4d0d0705590e2e4c3ad021a31f30", - "d251d68f0fc7a471378a7374132e4f291a16f6ea20522b9dfbc14542c5ca2044", - "97d6cfd78792d70d27cb45fcf34950a41da95f90f4aefe3fd209721b352d6a5b", - "0362c46d3c98db1069f72be90930ed5c859a60c649b27f0f30d92791327c9370", - "78fc43a70c0e94853247d5700b186bdbe3bfc69120468c8f913579adb42264ac", - "a3c7b0277aa1fe5dc03f14b1f69c5814f5edf14e2812bcafcb67d03d4ff0bdab", - "cc751b9bf46a71b2afb6477fde54d7e4593ecb3bdce100a29f6a1db4e6bd290f", - "fe0f759db0dee983f58fd0a40008ca6a3c65962a9b38622bd33d546f7c963da3", - "9cf93179c9ff57cb2c9116d50101b78436db2ff6a4a9a519fccdba359851f5df", - "a0bcf727a936208c521f261ac7b42430e498fec3a3db3eae98917b45738119d4", - "77f70bb096dd37335ac05d6e422948b6a3119e46d00c579225c78f3c5d514af2", - "f40bf37c5c81489523b17e79264adff90ef7465217f7afb409f5073064df7d6e", - "63cddd7c2fc40bfaccc72772ba714dab36ea11f3843c48eb6d030bdba7b431e6", - "5f707a2b1dbafe10b93a02a8feb455d6ec2d39e11c705e1a40576674a848c2eb", - "53c5f7793cb98399813b8857fb6d2b3040f7112ad6ce487acc207c75d344226e", - "8548f0484d46265f0a7f315125b408d69f3fe572d021e648fb91a1a3169a6094", - "060a05451d58cc741254353c12974c48e33557d1473fe277ca97cad37feca0e7", - "791dcd5470383130c0409b2c0918b7c223cdc4356023682e58e134f61fe6f76a", - "8b313c4e4f4e1ea4e1f0f55cc1e18ad6c4165a3dc41bc675f12ebbe9e3a81062", - "249148b4d343363e1ca4c25daa0a3dba56bd6e9ad02346891ff642afebe5894c", - "ab9092052e5ccb61ff17b986102fe088e43282e54deeea738d5570c8b1598265", - "41ce79b6966b143eb33f96a4cef1fcee7813e5ebdad97c1b5ddfdef7f17d8fc6", - "ece0698018e45a8e9dae88bfb8470d9787dffda80761e506ee10ffab1509b27a", - "1968645ee92073c46e6cc9ea48725509a723295b642a707f411768c3a78af8d6", - "a9ac3904210c12ed3ad725c7daf60377878e661eeb22ebac9db485f14f5d718e", - "28028060987ac880236c4fd154b743cc6715fe8503d379f8e31ffd5298d493be", - "69284f82e20cda66555e9b3f30d840ddec079a3f4189488f8ecc9f460bbd9d2b", - "2877e33a570aebb46ff70e71d15720461abcdb7cee0367dd48a222250010c3ec", - "84f75c5fe65a54149f3a6757fdf8326c3ce1bc9541cad7e3b0e89a163c14449e", - "66db8ea23d9279f3a338f7232dd08cf53283daf4f07e6a4bf99ed6b374b63671", - "2ffbd7555058b377265bd174ee6f5f7a3bb6ef684cecb269d6592f206efeaf67", - "81579fc0c4a79efcce26612fe56f242f7a1c3dfa23d9ef235aae4f8c11d15fa2", - "7b273cc43b898ad4fa6936327fa49c208dfef8747eb383c859898d4c9fd319b6", - "8af211590053602f0ffb54491d3f7df0793dc64872b108ef8cf582c80df19947", - "fd6a65c93e18947b084378a019ca74beefe45c720e00cfd3166cc1d0e8e07fef", - "9ea5a416589a416b7b4ef3d76e764f994d8f579b77a4f36267f38fe67fa73f74", - "1f0a533e798cdb54e895880086a4917e8230bb15c93991ccc56c48b8765c1d35", - "ffaff0f40a98e496c931668f54c7332557fe01b20fefc8b0f84afb663b2af96c", - "926466853a31e9e61cb79218b18314a1d2a36ebf49a429cfd3c009fe43db2dea", - "00ac3c7102a34a2f2111cd7dca4bb63436f05aba7d04a5c5d27a7f7e690a8369", - "011cc3d120c7783c48b55622baac985057e8f8e02db8a6d1dfe978fabed26d3f", - "19df52660c4a4f2abc6e1995939c91f4f864c67e1973d52c3830d0f8ddffc379", - "7ad25ca21930bf7c2d3f6724ec41b9a20b7200ed4815d84b8cf03deab5a7bf6b", - "f74dbafd3d6cf07e4a2ed601461e8ccb3085af56ca3f80f9019f71efaa1a41cc", - "4d68cf262089e44025cfdc06278e5003f8fdbd6a964bfe4c3aa446d62407068f", - "630d3d7a944078f10e19d308ef4832a221c59b782cf63bc07b04b40171e3d7ad", - "2d617365e64c4e5e40dcae79c4017820c2f620602fd0582b8afbf627c8517133", - "9cfd6679f6fd26d772825e79d28690df94a7400b96c4535095d1d5676fecfe6f", - "03e6cc1781e81b5ce4f58cb6d61e3a4518ab1c5c3dc03f2f2520a854e93ecdc3", - "8b78d2212bf9d32537bf84edea956f7f2563b508f285e6a8819f9f67853bc1f2", - "9e5a32d48d456fdfa11681d92ac7665b35cdcb7f227be53548fec817f0266e70", - "64a34b2f59b8214faa614b1a04cc290e7410350cb15fd934fb082f5a83401cbd", - "8adc91c680a7df9febee88b29bfb6fb5e6eaccbd00af015740bd440e65172c91", - "aee83c102065d7cf7ef5c4483f8dbd36d424a1ca7c00d75f9267a7ca7d31a72b", - "44ca55e22192455a73888db3f77f292ad1d1051dd27a60f53202d5659f593ac9", - "5dec04809977a3789fc9b6e52401f940da0df6f2f37dcbad1fd14a8f54eb9112", - "235d1e4e37ca1241a0c0a4deab0f48ce0797c067a3dda1c79c9a43bf64fce01e", - "dcbcc6c5dbecea8f4ad9abc1ba0f0520289d353bff8b068f84e7811c81616485", - "95ca595bbed25947d8bf98893694b5bf5bd3ee5e689956acf78056ec2eca56ba", - "343867bc6961ffbacc64e1d7131f6ee0e94567ded1e357acd1a4ca99aa1cce67", - "5987aa57506a9965e32181c605215b380d7d01ae05d699c15cab0d3f986121ad", - "902f27de3bafef6d013537f2dca4c91b938a84ccf84e9b9adf1a8f63392b16a1", - "3526c5f11389efce0b567dc60e66a42faafb2b2f36381f95f903f0b53c257680", - "64c8117746c9ac75269a23f309242ce5ff08f3762fd446e1bbe30d31fbcbfdd9", - "97449cc4f63e2a61f4403452e69f8ddfcd21299e8c729d0778fe027b1dbff4b4", - "2771722be0857d04127434bf0f3f5a600657cffa25d9c1a9ae778a18dc014821", - "7447fc7439134b093137a6320c06a05627c3555bf701493293172e568c17d925", - "757e2e38b0dab61247964c7d9ded061ef35aa4318d83740b5530a02a353c5d53", - "59ccc599bd906cb9c017f141588fd1419b21ec1b3aabf3995ea438b58c61f042", - "162e5e3739e8d7789a024fa59b0ce080e843a70a27a70d7f3b2c48dddb6c6809", - "bcd165095c9bac8706897f3e4ebc299bf522c176b9d56e4ca8e9a01ae50db0ca", - "90bd5d3ed9a533b8eb0c6938c68e289902a40bfb130e341b522c247e977e3c76", - "a47c2b78aea3e3c5569626371a040f9290f21f4d490c39031055c7514f9f32ee", - "eb28e821e5b8495b3cf713779f33efa69cd3c690723e40e84adfcd49c57e467f", - "ffdb6d13e78b1af09d56d5c78e604adbc5582697ef67afb1c1e358f2d80845ca", - "d08a2ac03bdde935f1934451709465d9116d72c49da8fbb279fddddb21c52342", - "93645bfb8c7a601bc0f81db616ff4b54edcf74a434770726b8e6ae1217a89446", - "33232ec5443343e65f60839c7b6012749ccdc9844bc3b243ceb339f20203412f", - "f0fb8d0700cad0ee4332d73082a0c40b705f8c49579a5217a4234275588d4ae4", - "767c17f36970d26979065fe189cf22b481864d6c4832f4f50af929dba270cf62", - "e975d6a7858296bbc783081ec899afd47102fb2c19e8328a8d957c5e8d4b7f8f", - "6c60be01c573989419409a7ede03831520ff36cacdd30ddf98a7b7ed3e2174e3", - "8fec26ad867d9d408d2152dcd8ede8ea0ee53ddf794fbf92c97a4a836e59242b", - "9db037113423e65e0cd9051375efa3a1d1adfee13e99905e0f4666fcb95df4cf", - "08c736331a7d8c4e0722de817efb8c85704980dbc0d7ee75f238887e01b08290", - "52817ded24443f21a818c346689eb1e347222c24bfa69cc193e8653898c37fc6", - "e1fe58a95100c0ee737805babbfd89b8670650d4795b05e0da248b56a7f19d21", - "b97dfd49bde78496e31c50e3dd4d88229af6be7ec67ad020d4caf6754aeeb2d9", - "cfca2c6ae617074ecf221a853f58858a36f4a1aacf6030a2de9da83a1c940c44", - "3b6d4a1cd5fc1b3738173e9967d0f2284340f01ff7ae6ba633deb0680e632a9a", - "d9ee78fe0b9f494ddccfe11850da6ca5bdd8f17cc4caac7ebc1961f72efc5b37", - "3345e6ae36bc97bd901ceacd1a5debd5050778c9d30bccb941d6f7d1335b1809", - "f01b052e2552f9479d1ec0f16e965d9820c0c772ec70c74b6adf9101879205d3", - "4304ef613b638d8e1c0e3edf4a7ffb959b175f582df04c608168af90bfefd961", - "c4643e3b5661eacafdab2cedb55df93da226af525b7bb4969a4892a6f83661aa", - "40505177012f07ee1625380c03e21df25f548f4a27eb3aa117bbcd300ef925e6", - "e19def1f736d392ffe56271df6b0c952a7261aaf4387b01365b878b4db831129", - "62ed807ee7c5ed88be657b783a04cfe1135262a75a651d6254dc905a3d224fe7", - "3a3f915acfe63d7e1cfce91babf1173f600310a0ed91ed9f534fb1fcf03375e5", - "5eed2764dac6303226c178bd7a16acf37e3ed2d316e05c14359a44bc0c98cbbb", - "f3c748b95682cf9b73962074631971b9783083e1052acabc5a8c6e3326daf474", - "adfe8b38d6c960907d8b554587fc898501e1ce2c2927d9544b8195dd4c7eb2c7", - "8518a9d16de927f3ecf0afee809b53dfb3f58da6f6c371fe8080273e0bc21d74", - "1d6f53ffd1152bfbeb10fd35cfd8dd96c481c7567ba93e8854a0adad5278a43b", - "c96f8a3908f78f2286f0cdf6b8d3c13cf875654ef92fd3ee80ae46d269fcd6cb", - "048da92d84f9c4ddb112ae0f53d60285096b2668f34d0874aa71b9dde8ca3cfc", - "bd4e9f7d94be6a375bcc2bdd035a73ec93c0bc9ac518ad46b15e1bf55412dbd5", - "ac516bf88bac1b0f37e51d411a1e0a5489f8f0244f94f3f7daf1b1c178e44110", - "6edcededdaec064cb90686882e4016e1bea4e20b273584c64c827999adad2e11", - "49f05d240878a1a2d8718abb495605a1876f521273b3153ed473f1f753afba7c", - "f0751642c8ebae41e2afb4dd632b9c988bd3cb12a2d12bb9140e8f474db7273a", - "da4b5cecf64881b0935fc46a67411a0663be03587cbb2bb0e58daf88063894a2", - "abc1ef9bf395b3d1636d1c815ca031f211484034584681b5fc0d9e938b608a5a", - "c5d7180ee2401bcc46ac289d11e65258cb4f864c183fe71f4f4ecca7d12c6647", - "6a666417c7b4fa889401d1b1f77ca5880172c815a358597025174b384984cb80", - "291b0117b8d1a6cacc3c4d2a3ac4939979771b234ccdf45560fca233495e7780", - "006de933ddc496bf6fb35234a06917d6f2cc5278d4e2c3f0aed6218c5b22cf9b", - "382807edf4dd81e3de52f3476e5b1860c95bad3f1007c8eabf3106c0232189e7", - "19c7c29d38d5200e22206ac4b2331168a1e9b9cc3dfdb7097eab67f51d4589dd", - "120204777e98c064a780445979c7534223a6babce506db3bae22f6c9d41a6eec", - "d9c74257951ed3772b30db6f382074e3a5eb22663d1e58dcd9eb9ea9aa973887", - "fd57154d376de877607b87a2cdd55316a261356f7d307752ab5088c77b11e124", - "c126e8d250afcf43d5e76b59bb287e9a5168bcb4124a39f2285ed7ccd697206d", - "644a35e2a49d0846727052a304e1bbfc4948cd26456165e966d463d7d30635a4", - "04d0a9067a82f515c8d7c9ca5e8fb8c4f3967b3a65a5ca718fbd3e1d57473a6c", - "41027a631e48d9a985a656309f5d8c828edf5fb3d4fbcc6efdb99d1b054a3f0c", - "feb3fe22f3a0d978fdda941b8b479138eb530ed2cfefb3c466fb11613661ad5b", - "88809616bd1fdaccca3b03c17d45902c04ef4c1d668c83aced55c829fa990220", - "3d449b20aae518ea7ed9bb73dcded4d354fa9cb06391c74efb4e763afdd604a5", - "f89006465dcb6ed7242c81536fb757187a57ffdefa09839d0a83b813c8d21db5", - "c5c4fcbfeebfd3b9c5b99753b440449505ba6c54c745bac75fc787772a1d176f", - "77621ba6a051add399df59f7755b511de474bfb5fb80ced0dab8bf019fb73932", - "b92c5c763c72947d80104d283e0ec6b28b1eda2c45c3801763b6254202d49a9d", - "897a09739c9856829f9874b3d43ff5c63b11c5be019e1e9f939aae803ab94972", - "8780009b4131c86084d2941ede94ae86759b61c6ea6543e7e3b3583262856285", - "9cfcafbf500c986a3115fb1976dc1195b3eb76153529257423751d3b1ede6258", - "8504a3bc8e3a4f2d5fc253671b14643dd824c8c60f56237170988c0d67ba7fcd", - "321519a6724b1c6fea4fb13b5996f41f84b81af50965aa25352d6eb4416bdd35", - "53ec6b41b976bb769c77e9b46e58f2be8a0551b1825c6be6224a65a20cb61460", - "60cd2c82fd263362a7319368a296769d53fe08dcd9625a5505e6d24f0d09b5fc", - "2a81c781df21f009be9247daafbf9e6ddca46e2c2ae59e881285914ce1d52c5a", - "38021853d32222d2be9390a10c18e29274abba576bc3ede0767e5f173094af1b", - "69b897c37d00efb94a63336790a870d2ede211880a3949e298f35786858866f6", - "588c753a4f4a6412449ad286101ff89b986db2583d66ab8f81dae7853bb5396e", - "1c602c2a09033bd95553c4e3d40d54637c7fe03f663db2305fd89b6690f86b9e", - "60abb6f078403d50aac5d2ef914ffb59393aa487be23672d5a74f220089bd099", - "95642561f3adff1f67229ccd995d6b2b4948c5430eb3a495aeb496e908e5076b", - "a642e8918b2f5e32d0bcd08b16e1264b36beaaeeb7040efad63eda99e32585fc", - "c04e088bb0f4539a5f49af1efc5ac2dab1a79b7a6beaed0b98e9c90377a608b1", - "f90170154d2eeb1e9ed8e294b99bcc4ed8fa8494dd8cc2aff836f2d0da46308c", - "0ca16584ac5b26fea3e6f322b66ac9a9a8c876c8bde5b98b458ef900a6cb9941", - "16f254ba4f5dbe39a97ee2a1d6f2274620aa67b586de5b6677814216ce7a7022", - "cd38ccc1a96526561cce3b7b538917cfccb784c22a8168332b741634f1a89f34", - "36c1adda5b08f234654735155dad02c09150d65ffacc46446af378ab6946e452", - "e86670390ebc6c2614375cb0031c5d23fb16865716edd30cbc3ec9f0a192b771", - "bbbc4f3ed038dff0a41ceb56e31c6ad4dbe6dcdb779695178766774ba64007cd", - "845b6ceb3cf2f88b78fb70b2afdda041429dc73a28087ce9bf628bb4f588c17d", - "c4f8407880b18cd079844500120be7b135edf8641b89ee2791b2529acac94d09", - "80568044ca83814c9ca6a06ee7e4e9ead42eb2fd48b6bb1ef473e237e671d3e4", - "da4192dca7c038ea6ea3f8dde06578e3c51e62942905b2c09e96295719a71ef2", - "52c588447b1f03c2afe849cdeb693e5829005bb73001a0532b5cac48f951e4b7", - "6808244134e9a1bb2fbdbbe4a57ea1e575719b32de81e0c508c868f69d832c22", - "140b9db316d4b4a0e3938bf1b08efc0e7da88a2c0fc13bd1ea7b9573a44e6a3d", - "bdb399a1f5483dfe6258aa38cdb79adab5ec7b898b38043cf413c1c6f2a64515", - "5ee47c88333d5eb4423aa9a352f681aaa8abdcbd4d467006f2ec7d6ad57c6223", - "9c832db93d0c8a2f5d1f98ed7c25171b36c28ab08e8773f18a1cf28727e84e0d", - "dcd4d171414b6ccf52f2969afa790f5c85bbeb7edeaf63f2576ad611dacf8b03", - "f6fa008732321f35e235e05bd55cadb5534120aca73f77c14bbcf653cf7eda21", - "5f042daaa1cdd76160762ba96b3e30685e3ea6d1bc30ed390b2343a5f1455f73", - "68a777793f8191a97cf7f86ed57f40b1cc3a4d0d2d1f7c89b8db6f9c73c8238d", - "3308ebb97469783dd7facb16d2bcb4f537f96cbcd35f75bcb31c1cf72135d894", - "6e75dae8f8d71aa8d9c970568d233da257047c37702afd2afadfcbd48aee2d83", - "b795629a76b9d815cfa8b2a97d6f39e60f8e702dea6a5d17cbe3446d93f963ca", - "382baf2554252a531dc06c2ac6eeadf8a3d5cf06494f93a9aa5c10157306e34f", - "ef425c136442891fc3e584d1e5eb072ce437b0556ee27ec813b703d832cb1d76", - "d0a2c1451f87ddd0774de228684b441492ed78e443452db4a536182f6a83cc7e", - "51e19d0efc905b0084910da61320b2944c9f45564bf550cf6404a60bc3a9eeb9", - "c9bcb8dcedaccff01d776f5257cd073b856cc394df7f3490d433619b9a611058", - "8c9d947dbd626253400d19d06338de237b3ac3b6b1a772335ec5bbfbdccd011c", - "5524ca1c4bdc0272a075ef619833a1aa6ad57ed223b7cdc3b1096f11454fadeb", - "37df0f3ba6b900548484c7fcf6518d85f351dd7aae802277f1ecd700407c07af", - "2b9a536775d220281e3d5fbc40df32361f974a2afe1771787c0115670b163588", - "bbee616020c7b685a1760ec35a68846e783dce26e7dd8dfe914a125df0af99b4", - "8a95fd98e8deb8eaf59ed0c830aad3c266014f2e07e278927f5ddd1efbfbc84a", - "253fdf546ead3fc5650b0f810b142e4fc1c508268a938c3a0a26a88cc4f02d47", - "0e71b79487ce937bb03a770083ea22eb168fe4ed1617b5549b5e51964b21a5dd", - "21b7ea9a4acd2119f217f67d110b36132ec29588710f00d1391b86089521b327", - "9777d852d528e6c123df606104e2ef745674c5ce03d0c09c41b954a34b438338", - "4103b1503af9459e1cb33517ac8e7f530fdf2d6e58dcb7696a283399a2305ad0", - "34c2e13839eb44d5d60d80c6c65aa6dc282d7e68a5c302cf6c19080e6fa7a27a", - "7e85ed3a2ae83611747c8b4631cf927945b63c3074cd9f21ef24614165cdb91e", - "25748999b1589bb1d24b1d4a39b7de733a19a5f134d396061e0e616474c246b0", - "8cd08f13480b29cfa421e50e5c0d93af8eb278038d84170369e78ff19dc8ac7f", - "43c682dbbbaf4de8f3d3a917b1b3cf7535c12803395a897360360dc705da181c", - "160f06876fe15efb2c624aa2071e144d478acfc2902af31491e1b3fe62057564", - "46b7fc09b47ac7068e07f236c84945a9d4073ccd8030d0ac49799d3e50ed8bb5", - "d2c7f5ae57f24be28b73016aa97dfe447a250eb34b64cdcb78d8194f9c26e478", - "c365c2bbfa2cfaa6b1dce8b1fe3e3c9cdd06c1fd8d083dd453d6625324bf8802", - "1e0ee482c0cd508a5f22f90abfbabb4a12b7412e31bef4d0cbf5b47453674d2c", - "0150c7db2720d2cdf471b75eef27468b0ee7319803a0ce577b24770ab603695c", - "83a3326731e0f4285268a37f3df8f35d02fa488ef413cb289bc6d901d6c7dd83", - "d56bc4629438e5b73cf9a71c07b81f40ca69b9d73aa4ea62f189b14e42a3f71c", - "ce93f62a1b902eaa34d0a4e92cfc48f6679c56fa7c0da9332892149c97dd1d89", - "1fbd8317912abc28fcb80369fd03c5603c2e580a8fbf5b78bb48bf571d05273e", - "c0afbfb545d842d3378f40ea1fcb5a3c8d4021076046272a79715badd3e249f1", - "33c47e76e4ad3e668946dae18513cfdf136087334e16ae6422a9a858836424c8", - "3eba2ba1920de8a571015ecc4bdba8a721e14954d2cde6e84c6f63bc52229ce3", - "4fe250215b1b91b07bcde1c4662126d80f12659e3df072c32aede727102958e0", - "fda3de06dbe1b40f7a4aaf5b3285254416ce8b117aba0e6db6637380140e3961", - "f2fb47860e0f8c07f6a4ef81375120d51ff657364995aefbb746410b5dc02b90", - "7982b5a48cfc507cbad7cd5d480d4d742895dfa8b3a191a1b869cabbebac5f7c", - "5b1ada309e355dbc0ecb4693c9f76cd25544d3adaefb5bf3d010486f779cb9ff", - "28e6855ef47adee98462f1929b72c59c1dc6578c800f8539a7f7024f6ff35e81", - "8a77279601fb6a54873c7ad2d28bea1802065fd4c7121385a12a02a6aa2b8645", - "fe2b2091b115642cc6aca2b42c9c88d02ce55af4e8527293256192b5d5a34fa3", - "51d90ac6d07117bb112155a1b7cd1af184d7e8ee5b6cf71af218ab34309e1165", - "b5a8f4787900b12cc583bb801906855eee448f7e1941d0df7ac3f461aa78fcc6", - "6f30cbc4a9b10e90963114783c92b3dcd10cec857fc3499d7ed723c7a20ef939", - "fcddb05916a1be17d2859679e543374985cb69a8151f5452f2ad4a61464edf5c", - "c0b95904a363a5cd21f813b83d863ee1bbf93771f0b78b66cf674ebcbc354406", - "a38f301defd503cf78449f54280ad61fec684e9f264a95715ae166f02c73ad8d", - "874bc78fbf1844a4704f2c7217a7336ef2a2a5c0fb2bee572a96eba7065e2be1", - "8b5542939e935e562e083faa2863eb73aa2a0bbfa93abc6081ce8ab154332a00", - "8cab996f242174eb8291c176da5562fdf266749622104ee5e6b52f375d2a3bc2", - "81ab9cf8b9337f336e6f7ddd6ce1e8d2336eb4955f755ff14df4527c3e9ef6ed", - "d3dc6034ed6eed4ebaa8a0ee977a6d69929b212eee054e4a52af98475ddcc822", - "22ea908f5c97113a4965abc82d2dbd9b8891bf7d6ed53dda6467cc1abf1af176", - "23549ef7e71e78ef01343af259a19fd8a2edb756a2e3b5f7a4b6904ac20b4876", - "3c3a19559db578306ec5e86eece458cdc801ee36ffe836beee47558c7127de13", - "04287d5980c18a97f4c9ec37bdb56d15ba88b85ca5508ec912863a6f87a50c8f", - "e4f9a71b1b5624fb8bf71d4e6dd8af03f7545a7443873d2be41702e17986b5d3", - "cc314521d6170cc90fccf276c94d9569cd79a51f4aa9f953d83560f5ae51872c", - "de9586b73d9b4574cca05109594fcc08acdd04bf9e318cc3f8a46f458ba2abf0", - "b49d624cb0272a14d9c1abfcacd8686a11a3040989615ecda8438c7cad8ea71a", - "ba9918c7dfbed53d238a3052c15769266d4e1de2d6bceec062f8c515ece770f0", - "c4e400ffbdbbc4506f46e8d7c45663c61f04da763db4e9695b9937eeb9c7324f", - "2b3c7931cd41488a65002fd125be38a92f997c3bd50e8922a47aecd087b6dd68", - "9608ec3364bf4807e214b4a72825a86d6a29671caec9ddd6f11da20d83250cd6", - "dd125d9e7df4af43da977169ba8fd836af662f3cabc484ef72e54e443af160be", - "a18ad2cbadcda3abcce1bea101f3d50a81475a076ad7bb01e44ad5b36493dab7", - "79c3abea45f148a6ff73f1e0c9d512beb12cb3123704dcefc490bcf368b085c4", - "67e2c98d28411f71a746b4a4cb2d63343c827ecdf6cd735ff995c82308094205", - "80baa64c338e3b3f4778453da23b05dac08f02d43107029300ae74cd0bd4730c", - "8df1ce21a74b11a285dc915b9827382cc2f80970737471555fe20d7b94be05fa", - "8cd9f89f500a1e72a6b06467e9c3fb3a3cbfa10bbb707d197668b8ec9452e988", - "27e88e25fc8bd5ca9c954ba2451f0539bdca0a24da4df872c7adb570aa161b1a", - "7dd1a9a16374c6c51bb09a58d961c4ccf6bb1a20ad18d596b0106ffd3fd69633", - "a3bba14d814648161e84a3d592df949bf99741ea5c9b4207fd4d29175c42182c", - "4965f2829a37f625d8a90639429a687f86efd52ed73f2e6f0afa3795fd7127b1", - "d8252076c7ef1fc52427c6de03e74bc9f84550d7726c44777b682b23c3eeb4b7", - "d3cf2daad9e65200d60891dee34ba2c776ae8bf823443da72515b2d3eac1747d", - "362c6c976089079a615ba8bda186faf7096f4ffd6836423a16274ecbaf5a5294", - "f293ae71054137d4024bc6df34d3544b49bf4b09d6d13bd85486e9111b455ef2", - "30579accf82ea590d3fd924b2966302736d60ff085ddcdbc4f4192c86ffcd0ad", - "d723fd4c012e497524ff3aec3b280a375813b6cc92657b5327a5fff8cad58822", - "aa7d12f667d04c9f12bddfa9fa0e961ea43316519e3b1f51c4e7a052d9dd8901", - "1f59f6cb2237901a75f124b1fef6a2c69bd4a76adef98a8f38724c7b1dc9c895", - "5184fb14bb90cb1d90c1f7ee3d19697f0d206ab473528157cef1dc9d4af8ffc6", - "db5f3df85ebc61fb2d0702cec724d0fd50b213dc5838da3689a9c2d307ab8567", - "fc0672f939c28fad302cb98c381d497ee4fca6e9aec85e124d134253c5087522", - "698a13a81cf44f278f31cb276a48c901e76d4043ede64333a45e643daefdd851", - "be9dcaff2cb1336de7b65b27f1541e0f1fd4d03610f9e424c5c04f239e3563cb", - "2ccd7c9c946d588042f925950b7f52e15fcae67abf5ba1c885c2aac511b785db", - "0dfd3b7efd1c8b1acbe58c33fabc20bea843ff88c46390ae3c6d06d6f4a46bf9", - "4d2773c5b86d845afd71b26de8786004809351e02c1f203ad661bcb14fa400f1", - "0e34083b411a0b916d68642ba2b971bf4eb7f4737ac85eb96fa8a13458279130", - "22cc51cf40248801ce34ca64dc6dccc1fa478cce22144b526f2fffd7920bded0", - "202cf0d9760ab57469f70a154628919323aafbf0efbce4ae440553596ecc85f4", - "8c201682f0cba340e5c4030dccc02559bac206b9acf8de0207224432765329e3", - "5b310481402034f33cdeb7e22d4fc84ed68697d7dce87ce07a7ab386d55ad4ce", - "1137949b0a31533251769ed7f7a9c360d3187b5d0b78f1d54b974b5d0c9ab27e", - "0c4e550b58a351ec8f815c5275f5e19d0d93ad4e73303ede912a9b717c6707d6", - "98118a7d85f3e4d0c137214e1b6ebf0814542b521e69fe158dd07bbea1994cf6", - "fbffc2fb3f8089dde9d3cce29583bb7c9a1781c16721805a6f867b77ae898a25", - "8f7a85b60520ae2ec29dbc692d3f1a10d2275bdd60bc709cbf56d536d6eda29e", - "94309b706746e429acb4a9f3e1e52dea9d9f011adf8819534965340197571a13", - "1676a710e6313f9610359e2833148e8576f10c992092279e7d59cca381f69039", - "e85bc3b80543b8837811516b1d746fa843aa8a5c3fc1c556f513903561e9bdc4", - "6d88c8e0ea12c11b70d63bebea64a27a3ae1367af629f87396adeb3fb7748f44", - "4ff9ea8ebe3863d5cb9fb27b22aa54fea691f213aea461a1fba3c1cbb70250b2", - "28fdcaf6364998ab6a2509139537050db1507b5caf7c95c1c35db2ba37cfa6ad", - "5c0b73ba59d7bcf9d590de1295ed7e50f2a02902182c5f0a0302d691302c014d", - "790ea781a4e15972031bb4b68ed1b5e93c1819bc202ea5add811dc532e48d4b4", - "22eba28c0cf64820c4ebbe76cb7294dc87c2b493121e5ee7c95aa810865f0e46", - "3eabfe5541111aef4015d6228ed9192d6f6a84eaa1a750a7352f48b38ee540e9", - "014cab10223f2ea285eaa1cab51c862d7a5d0ee110ad09b2966684ce983f1d90", - "31720d9f56063dc4cdfe81e038ca06f0abac5c7062525241c9b8e574475f2701", - "acc73108b1f0c27c65cde45c1928d7ca5adbe326452237f70a7c163fb369e86d", - "631e8fc0bdad9473d54ce2e02d77598d161271371a89e256c541e1115c50b757", - "362c5894868086fbaa8c30f27e6bca3ee073cab7eff94e6c735dc5085777964f", - "924d34e20ce176a963990185a69981bddf39f58c8353772bb7f84dd257663cb0", - "2482b7bd848c4f706e3ce878ae17933a2c7eb2d84928e207a343423a758c41f1", - "a0ceed18afa8add8f6821b681922f4625eb0ad4dcbafb62738eaba84bdfa2520", - "b28f1d016546783995c88f12d9f11e032445349b00e921081c891e9ac4f54795", - "764d3e021162cc538e71b1ab23ac20a9ac9c53d121f79eb4abd85ee7e87a6f19", - "22b5ed633ff1815adea03f492ff8bcf9bfe00c9dc5f454ae592f1075a551d79f", - "1eb4c1048234b710d0f1248052e7c45c6c50844942e592973dbc47f0b22d4865", - "c4751e51924c78c5a8cfa3597a6887f9db8c3f37ce1b1e254c9d0f7f0744994a", - "9c40657731f3fb8d4a56e5ea103cd20e843fcfac3ec8d4f4f450e861ed306490", - "3841769ea9ada74d200202b8e92e8b3ecda6931bbdde8cc37dc56cd3242384cd", - "d9e04baeaf414f4c454aad009f0492132a74aea4b47efd61d00f065b5d883dd4", - "6ecff1cefc9784edc490c6132312484222cec935f7c3eddcd38925963afa2e9f", - "39449554afdde9d050ce588c7f3edc4ed50d0b82f2cfe049a09ce995cecb5715", - "0b2653e92aac3922ce63f8ebbf8d94c6743b7d86722fc01b91900c1aa4ba11d7", - "ab6ac1d162f2cb30415da7467e03aa6b3a91ccfc2b7cecca2aaaa4d4292ad332", - "1cecbf497841c603f407a51dd38eea8e2f6b18c8bc5ee90be0d7ded4f7b188f4", - "a6d32cb411f14bbfd8a994298c772d98ae41039b091579cd8adb4f9344a775cc", - "a8a34dacec3463f746995f64af4fb707624b92375fe253e0b86f9b04b9698c15", - "8b73a3d0201bc664326146344604fb04123e3ce49931fbbbdcd12c22168b75f1", - "80a6d2058ceaf6f22d426a9d697235a68ce4ea6a684b68c021f8998afd04444e", - "c4c445eb9995897247d72471108c2e77ba5e0012ee657acc435b216d0f2c0973", - "23288fad6f0e0a5fe52566f835db7e7c5955995a3181f9c68cfc0a5433e8bf3b", - "bb69867a839881f5d2132c0bdca82d92ef8fd58701f10956b7947a5943b44695", - "8ee0a12e7bf10a285160e007b9618d28c60ab28b3190c3941ed607c2607ef61f", - "bc61f6c937a2ff280cfea0aea002397ccef98decb1fbf908537954a6bce4b929", - "d3001177e092c134691deff66b31659d58975176d50d52f5af06bf33fdbad648", - "85dcde4e2b763def6fbcfe662445bb46c7301bce3dcfedd64c40679acf27bf1a", - "bd6aeb2dbb2c3c33d9b03607c019966a407dc53ae1d21658b09b738efa6292f7", - "ac5f97e4636a7539337efea4db038c6e7c9857a30f2be3a90b1332d6d9636f11", - "eccd3fdcef04d5417f75ac8543ee276df87d0e8ebb7e425ede5d490a07e3f6dd", - "9225d5ae358a618e4212f630de95d87cdd015a1d91a112485412948d0c565162", - "0b139f2f65f97d9d0494002f20ce1a62356931bf98a91b4fcddf4cf8ac4254f7", - "346ca21ab0c737d32b6d52a458139ccb1d76a30d9ca4f75816a7a283e9668787", - "01c442572a1e295576e8b7a91a5960896bd1a272747ca65d4dc2945bebce5c5d", - "a090aedb76296f794eee0d05ba1ec4c3f4e704917e341e4190788d1a1b71019b", - "88801d939ea706889c9e69584300b25d346028cbb32628ed5e196e114f446ef3", - "2cd4b5a4f084b47ce7fe45aba9a7f39cee953d13b2417bffedf675f84f5008b7", - "d5544ea5718c34dd0689ebf6d0958b9800b612a8b722c41fa5a27a05ee2f3bfb", - "9461e3fb999175f0a603525d1a6fccb2f66fafadf972afca15b079d11513a8b3", - "c8df2357d667c2bb9a38e664162261992647050bc1d3facc5b4330338b316d62", - "5dc228b06a3693dc03ef7ed99c5086b26071feb70cff19ea30fd7ad2528aa570", - "c38677989fc6485a9dd93241b3b26ce40ec53d758ec964655b59e46568d8e34f", - "381de4996812f5ce6e1df219d2a5777a88d16b45e07675a9784e6ea30383f7ac", - "3cc8858ed827e3aac824b7d2e57af687c8da45692254b47d00fdf148674de96a", - "5ea31e79b85457401b0a1853aa0e2dfa38962013ce66515d12c4748d1014361c", - "7973ffe8fb64bb01ff0645e63f56e54305ba029b2d9b9500851a8e54c014992d", - "6abdf200107cb4c8be63876e1aa19ca204dda1c301d6547f3a21ae76abf881eb", - "2f696a082063ea50b003b8a9e12f30b09fd4b0494e7983a92c6a7e9a4e2e2e0c", - "2ba4dd8e2d725700c030a794ce690df2e502e4d5b4aaa516bae9337e606b034e", - "29cb9c4de149dcd746d32561e32febaa0087830c2c5f137510758932b3feba13", - "b01fdf17a4337ed39c50efae6dc4277f5bf39d801225ff8fbbf49c959c5aefbb", - "779134e31ff4e99aa8709308cb15c0b0b55d004a30d3b372379e21ecbd0164f6", - "a45f6edb639422e2a9728fcf4f480f0e7ac3e2dca0f7842b4aea1d1a6e02b229", - "1af6d128899b26041f2ba33585998f0cdd1b2f8e04d931d4225946320c52d975", - "d452bff29864ee206724fe78a58e4ee8852e55401b96c4508ab109194fde1abd", - "74f5c385071b1f0806719f9d22237783ad9348a452b92c4a45a3d40a968a288f", - "867db7f43d268226602c92b0b90e7784eacbf5ce5a0903a3277506e1d9699f84", - "a2d5cd93d1dbc2416f22e67b4e6256bcaa5a6c69c659edeb0f29de6db098c0a9", - "86391b5d2441251c81841fc74e052fe91e0e0ff54e190a4e4c3cba52d8714fe3", - "51b9ea29a0746e2fd1bd774340be1c8cf37aa6fec6df002aa5786621eab6f66f", - "371799b39fb33841f74c37516be2e6768605c2c7b4b70805cee6ac8d934bb602", - "61374ea3e17b592e2fcec3ae1735bc8e0bd586571b3c1d25b5b8b28ffbb1469a", - "086f7be82823447785ce129b86bf23602d6b572e8acb6544d3988f47abf93a29", - "bc9ba142ac8138f515adccd21e8d4f726e7cc976f077bd12cdeeca8a237b43ae", - "f80282df847e6118618b9fb771f3510f9ae3f473ae7f2ad245e230c3da511d41", - "0afcdd59fcda8eff551bcfdb07f7bc1b80bdd81f83444048886f739d9d50bf6d", - "272dcae611c6b9b374dc935ecac3fb7c1d195229b2c8fd86940ad396e4135a1b", - "123b511fd362e6bf1e4674fcc69fab040a2850ddac06fc3debe3b9b9b632158e", - "9c72adb28efcf9541e75f99b1de8674b595a7503277ee455431cddf72b34f92d", - "442c96baf06e2f9c728d1b809302c9daa7dee222bf7ba7b1fe2c25de6d4b174a", - "5cebd44f3b4c2a595e3ba05f432e8bb03db615f16c620c89c007a3bd6dc1da83", - "4d9405284f35e0e5622c48db2032350b40f92ae94dfab11fdb872491311c9ba8", - "74e0d690435e7fc8046dcfc91016a9cc0b8b97d696d0bff7729dcaa772739f98", - "67b081e2b935d7342f9ec3ccd1051b6ed8a80329395a67542adf2bc5c6459e22", - "e9d133a2f0cb8a0e2e1eba809550036613f2048451305c2de3dff7a6148947b7", - "de1f9d53b9ba7956a009b04c19f003faf8b691afb6dce600fee03d371b9cf06e", - "2f05c5ac28a8d83198c5afc84d7f39576092739d590945292d67129804ea2d2c", - "ec57414459b77d0a1282f91cd4480abc4ef0f5e84e235f9fc8d43d746ab18aac", - "c0ae80ff9b941ff9633c7e118a443621877684f4263ffb53e6216b6f43ee0e5d", - "701029b31d959ae99df806048f1ee2b585724b83d09085dcd253e916b02a0038", - "e47cf68d04b1d5d158ca77840985a93012a0eb1586c124d760ee6fe5f62cfcf5", - "f21fe42b4fcce0b0762074a7fcb7e53f21660d73892d7ad7e0309f716f4549f7", - "be9841a684e9f147343317225c781abd6db33539c35043144656937668999b19", - "f4da7131de6eefd96942f5811103e1b57b5fa1ce5334c7ac8eba904f0f72316f", - "2982b177e362f03df5d56c2d1344033d01d467f6d9087b57e5c438243bb66fbe", - "18a7d1b6ca6a8325b378a2ad69e02699436c24a715b9d6c43febc5334c8cd139", - "4fe69cb8b1438eed7a02b87d5842747d71dc89738b52bfeccda2b80a2d11fa8c", - "8049d8e64e1f24a1833c75ea8b2a32d84446ad67b9731cf6909e0f92be09e089", - "c4cb213d8e2f1ac13a4971a2e79edab4e65a1370c588e05255c673162e96153a", - "1ba1ac6886e3ab8c195eb342ec5eedd191b2f1ca3fb91f55c235ff3c594111d3", - "54b02e3d837f9913813c7fda3a15462c439517a5b75aa4a113e6cb5d9981f8e5", - "205174a247b580315dc548a420311480cf6c7bb30db80bae9d3d774f9574ec6b", - "b9b39ab90e61bc2904edda0e5f63c262630aa8891509d4ca32957ca8150817d8", - "b131cd27a60ef481f3545eb08e9b91f1b896d033760c97cc4a4cb28d694dd762", - "87133e79b0082b0364884d8ca10967a271bfa70f7da47a15cc4eb9c67ccc27e4", - "ee181d51396620391536bc5d9f14e9aa5b7443f2ebc80df5e6566c5dd7d3d47f", - "beac079ddcf1d13cc0ab1e8894c97d4fa6f3dd225d3d3e8cdd351823e1bb4883", - "6332c5fb42485d0ff21f602861c7d7e30a52d87dc864f856e0ea699f7aa1741a", - "416fd7fbd04e6eaaabc2549c1e21abad5d4e256c9059076449c51edc1fedfd3b", - "68ae05b8bc20d7880ef6d997ac131417858c9b3fb5d29b0994e5494cf2bdef0d", - "595e313efce70c7ea182f70556c2f836fbec3f2f901b276aad471dfd65353187", - "d7ef0aba5834890c8dbb93d70ab4291f9d7eda952d174aa72589296239614a8a", - "46330a3681a5be2248abf2c8616073d7048ea7509a416316d7d0af4b0ef7cf02", - "507a58b596d8fe875ae10be6d7dcca4462caaef0148396d93aedd4afb46e4c8e", - "2208dda617cf1e0f8e7faef22c9255c04697f2ea90fbf31b2b423fcf85436461", - "26728bc77ac7570523b736fb298805c8072b19dcc9830c94ca9ad27791e408c9", - "1f6a529a89bd4276a7b814ab6e581359830d51ab55f457645b25973bb7ead722", - "ded349c6d76c9b08d533c8b296af20b8cf76bcdfd98aa072aa33c873bc09d6e0", - "2625c50a874fd46111bcc50caf4c20b6141d0e718538459a5515eb9ccae11300", - "cda6b3adfa78bf2375e3d7f5c2381ec9e7e191283974f3f6fb6558ed24bad010", - "bd8119ed4b9a6a3eaa72c2cfe0a76c31d0dc4b14a719ca42b07366a476f6d303", - "eb978fe8a4baaef7819e09cd317b901bd9311523097ead239a45f30f5fcd867d", - "f4ef960bfda31af1d899028f8a9f7e10107f3d56267ce609e0dc70a673dfffb8", - "72331d23e03c3328be9873fc149b3814cf243163c5e4ade3e371b8fb0a573496", - "afd12464511a712420669ebfae4c1af2a4637200619455d2926069db6671b16e", - "56c89db7b8d9c361306979bfb8c7d88d1a85835189dcba92c745f54b7730d175", - "ca64037b94460772a16608228b9dd3ba9a14afb2a6cdc570601bbe38f272a3c2", - "03a670d3235c46ea5bbfd049c7a23e024ff6adb741dc740ff74fbdf5c572f7ca", - "98ba6e2b14936bf5c5cb21ca8866821a713411eee71adaf46cd65db67fb4e46b", - "f25f41dbcb54c87adb6d8a5b2ee0b280e4952b335a89277dba37cbcd88be9d88", - "7f304b999834e4e88ef7c5b6c3c9cd6e620732b9d4144ef9fb0cfea2dc20edce", - "a3aedbf40eab9f52c9232968b2ed78061e2a349a35efe1ad38e53731946315ab", - "4816f4bcbd08c35d977938cc23c63c88d295c861f929affb770681f9b935fd18", - "cc60bc5e62b50453dd4eb48dda2b10231a544d62717de8bd2fad8215cbde0f94", - "0b6809c9f63728baa39b2ec7c31e187ddfa93aacfd4d0941f54cfc99273503e9", - "f8d9264a28972aef2ef06f0be6c2e2d0509f0f89b73c78230ee9d47abe81c29f", - "c5e55309ec112fb28de2e7ede79495ecc4e6b75765767f93812f2c02a4921cdb", - "87ae8ed7e796fb7878fac886f0dc17c79b9631e901279f62319a3deb36d2b3eb", - "977a29fa9d72ec45ebf0988697fef3e59a03e13b8d3185d317a6dc1c4efd54f7", - "30130ca10225eb7c0a0fd7a1464b3416cb5b124f81bc6476254bdae64d081942", - "e17efbe8409b10123df73f7c006651195431c8a87d9ffd52a1cd8d5d9f703c3a", - "ea53b80f8419408e9de8f1c50b645609d035d325f58540f8cf4850b04504fae8", - "dab45a9b229fb6ff8588da0c121394a5a885878471ccc64944e36528eec77a18", - "844da7649a1115326e5e482496bb348820e1d631d1a92c4bb1b174b7bee42f50", - "3fdaa7494b21a4fd1930c0a15c58169b194c6288d4e5e56cb9b4735464e818f2", - "d8e37ba08301460a3c5caa0399c2b6d4340ce6b33c5d9e4a8ad18e7f39dba73e", - "756d3d7aa895c6bb75343290770c244f43b4c9a4c68bb56a1e755fe780f686d3", - "fe2ed1c2b0ac929279e0244df3c70d74b35b283eb471cc304e6dfd0ef3749bae", - "755695648819a3c5e67ee44ade3da331a97bba02c9d45ccde052d7bc1426eff3", - "1a442368e769b6f55a8aa629b084017cad55abcb7891af329f25894df10a11f3", - "a5e7cc1d23af6bf5db5d88291484da0ea9f69826295bcf9a5693aa775b9199fc", - "7704d7583c88e5a01ba6c59b66d61b43b4281d79f841ee7581555736d1c2a9ac", - "034261fc1d97ba2b95e386b65081a88542bb3f255d671c8336e7ba9875b31e9c", - "a8ec05c8acc637b9b9f99bdb5a5beb7dfd3a49a33e4f95a08ed8cf24cbdbcdc6", - "b0b7372cdaaa7a3a13c33c945364883d55b3ea68bd729f9775e938d813468611", - "5e8a8fd520fe76e2c6fc5362f9131b49d08c8abf58d9529125dd31aa2f3c5acb", - "de432a712bbe1395ce752a377d7698b69f94c6f5e79ab4311ffbf259ff3851bd", - "a66196f17af18f49e58b4b9006341def3d616a724e1d529d2367de33c34065a7", - "88b4914a796b11c7f33c3ab3a99d9cd930f1d26a3ac55655504994d0b3b9bed6", - "84f95b992784c8c88519a8510e9abc40d79458bf9b8ca115c58693fd87133b40", - "51590603c4ade98c31c397cc711b0340b0da2e672d5ec6730dcf24fdf48bdc57", - "268a44beac7e4501fe6e4ab7de680faa6db7cd16af565ae2d8530ae800cd74be", - "997058cc2c6f9316bca1a7c203164237a275a6e09668d0c46bba7c2081ae14c4", - "87e8da498d2e1bad260bee753be37285fa27db58a7664d9979d14a105ce67f24", - "e7927aaec2b29b8f8a29a5191091925d8b48585cf92d6e4c1b824bc33015dfd8", - "7d53163ff3b0f1fef94541c895e898cfd0563c15838c45645c87976d1b3140fb", - "d4a4787ded789b48b978d9081669846a52794129eab30ea203c3356229f572d7", - "1e94cc9cbf5ae1eb87748a88965b5e304f0340f57f7893092b104f7e89080ed5", - "4c6d8a0294f7bb04ef2cd92bce6b4014f92ca1bcf9d041f55a15c9a9903d6377", - "9307b44197f9a591977c50e2c655024f4b361491313a9062d9cd910f64134638", - "c35415e3eb46fee57138b7666d8e4bebcbab33ca9123e8d3c1ce38fb7166af80", - "ad7de87b50c5dbb268fbe89e26e16998efad453da6058552ac21939cb210781f", - "b4850be0445dd34329dcdc1de6acb7c99bd285b252b1527f45f9b8c36e86d587", - "1a42e0059668317a6b134d03fe590c3718162435833e3a464f1ba5ec8becc485", - "93e3c114710e1e412e209ef601bf1b59a78702072bde083df54b1abf2e9f9f96", - "c4cec525b098eef329b61c69ad82255791287d4ba0834781679ed9eac1cd463a", - "22e5ea4e43eb79654610bd47ddf2c57cebd176e634d39a0731aa6e54c26b0ca9", - "f930abca08082fe269828537ea0d3f82caec32112cfe81ed7a0c29c6997b359e", - "46a974e86fbb36fe0b91db35ef9c3b211237da6bfa2dc58b6397b7863c605b51", - "4d202120e80505f6791feb782bca5f7f78292f720ec1c8ed0b6c9d8d096b7346", - "de2ba63b39eb7f6e0b812ec2d79b376cee5d7c505b09061abd1cdf9262229000", - "12feec7f130d562772b1b6c9288984c72c61cc955802f34c9ea7207c638158f1", - "43fcaac19d7b4b2d1d74ae2f3deeaab33387971db1f62c89cda7c6f9674db5ed", - "ee7c3049d85e3af339b33b58bf70a77720399fae9359bd9461bc0417540dd81a", - "cada431c0998021c56c0c8f9ff7f969bfce3fb3f732d28f5622bc257d944ca4d", - "300e0d6d5f6c0ca345c69241e709a1384036d609ac333933fa7525de5e6bc502", - "f9b8d526b263a62d72df744c50b3757e5bfa9c10905406ecbba177e1645f1fbc", - "6fd7326a3059dbfb5b0b6c38badaa49986f65f1f20238ecdaa113484e6a041d6", - "12e1bdb035887deac78d8208dcbadfdcd858835c2d03327b4960d5ad10c6231d", - "b371a97b129c078b6127b4bafeee6df46fbb70f5f8bbfe7c092b8496ac908887", - "0815388541c56634c6b141ea2a2b02827a924f7c71a414251a61269853786b91", - "2e79836710f933650351fe00ba9322ab801d38a740b23cd0c9cb54eadcc862aa", - "02f1f3964828192c76647e42f93c496578af0416b09cd25f613d266f1b781b27", - "82c28c8d0d7974059b73be4cf6a116ea461863cb6267170805cc590d7a080990", - "ebd1d6f54bc7d40624b56eb14f2d45b0561a235b498cd8172f2e1ed24e7d91f2", - "ea10debc26c9e1f9c2fbd14137e372205b851fda90f3658beccc38bc7a23775f", - "7566fa12d6315fdf214461ffbd9445e0c4160487474f65b009c6458a3f8fcbe9", - "d9cb382ea22dc663d0f6d679aa9ac0d4b4ef031a88d1ff7f35537549c7948177", - "48f1d479257ca0c582c57421e52e6ff74a4d736565fe1d2a19a85aa68b67f40b", - "0898daef562dfbea74a390f75a856500e70858d94b069a50e282ec8d29237f0a", - "1e9f12dab1d5817e9470ba8ccd729a8ea687ff693fc0617febcce424d08b7fed", - "86a2ffe3e7e4a5e656c0ac33bc050ff8f00588230797a63600957be2ab8eeef9", - "89be409c4547ce3de30a5549bdb8e8a8ae0aaf75576a5940094789876277de6c", - "6f14cdaa63bccf5f2a8d71e51713328641e2531f082d60e9dd0e879a89144ded", - "696aab85bcd80a01fb8aa61dcb8b80dd9aa0ca1d122bce48a825641d7881de33", - "46e51facb45aa7041fa14aaa557857fe628cfbeb60c3bc3f53dd905213c80edc", - "c3faca5b4d21f44a28e13ad1470a11f383ce54d93bcd9e80a885ab4f815d6344", - "0d1310f690985b6dae42978724c40778f662b93f51e388cdf189f78e5fce7890", - "46626091f524130cb6eb6879dfc5ff95824cf6ae8d1df389f64e2b4b7e611f4a", - "d22512bdc4ec6e165db5406f9e80757a91800c080f7d3de665c759f554e0f877", - "25f5d9460a4e558d68bab0ea63f82351d48ffffd8941e648ad4a3cd0f472d9eb", - "dfd46a84cc8ffaceb006e5e1a2a70ac32a9abb942255f3133d9b4ef64b52a6d5", - "560a4d5d09eb9d2be92dfdbe1a8e05c0df21f94456a61f3a940feac27b3e4289", - "2e2aacf05125c3067879bbf392888efe5e6110b30d74201eebd631ef3e26a8d6", - "03b90f24f9ba20185a4c5f1aa986e29a8842889aaf491832a8c8a57199b5515c", - "ede2f41ec0b9a985de05006af91f7ec51819d8f3175f92f0b6b4bcc3935270ee", - "84e71f625db0851beb58aca3f134ec3a00dcd1aebb2cec6f13c833cc584a71d3", - "1f18561b5517ccc870330d292a95d30ae768b6ba6f78397c72da096a5d7fb571", - "31f88c2343571a4b47b1152d90cb0c19f734ea9ff3ebf1551df6a9ea806fe593", - "a17e6dce9fd43380891f6d1bd7bf6f66beaa2e10c6fcf406846ed6411e3d69fb", - "a3c21c30a9f0621aa49509751841fac05b9210e80f18f85693e0f36256aa6bc6", - "1292dfa01b2cba33d7b72efbaffed9ac30d84d572b0733d4ca4162bb61294ee9", - "0aeee10ff6f3301269bcacf1926f0d9841b907e16b3379d83c206e49ddd575a7", - "aa35e3164879a1b6d674c07d069867b72de2fdc8b8af2363ebe8ce548f326d81", - "b8bdc3d5bfb8084dc44cf35dfd4ae116d1a43258ac44b55c1427760d874a023f", - "9681d4c0562f95a40c861c22dbaf24ef41812de9bcbd0a59f4f7381da457c202", - "1786cb89a7b3d341aa07ca2a2756f536277ef445fc9a529e6dfa852603e03263", - "2eb540bd76a029e85dec7d3f20c6ce18b3ddafeb0bd6563845a94573864d005f", - "76a78ec886311857f5f20346daf8f6c1a6bff097dd2e9c79de76219d9d92f8eb", - "26f72a45fc5b35972b141b5f268ba390d25daf235710e653ecfb647e13785b94", - "620468b030cb3c29549b02d9d5ac2babe59d65bf4a5daf3603206dec63aa88c8", - "341d465a4b606a28be90da376454fbdca8234cbb0eb786feee7d06f3b6c6c1b2", - "5bf229f97eefa9fafe029b47d5aeebf19115d95734a4bcbd02e8799176fb0986", - "5222d6eb432eb7be4ab3f4a2711f29e96c82cf43ccb7ff736dfa1189bcfd8957", - "674c4b5a2abf9d386e21afd24067ad7c6d9deb41a5152b1ac129109e28c14787", - "e44c331fb1c8034c2ae6458029cf7769cbf7884246a0e9a937e11d4af0b4fa13", - "58e6a3f0172624f1534cfd51a0dce7db9dd53213144e0f5bfeca84f79386b896", - "b62695b5f6cbf05dc94e356f0d22b4d0bfab976a2ba576a06c09d720a163bf46", - "ca1fb074f2b8aadfa6ac4ee6aac5d193a13ec1c68bdd4753b6a4066d0ebdafbb", - "64a7e3e56e221aa9fc666bc61f95c8485575be54ed6ad0f6283226c93ffb1d5b", - "4148ac569d834ebc3f052262ae3dc8878441b4e453d54327a65f5d0527deb763", - "d3ca3461e5c82ab2e36107d14533461972cb5b0a98fa35827c4a9b8521ad3abd", - "e2da470bddeb2d88774fadf6f670a3a43d413b199fa21a0f1e9deb077e192128", - "18b37d9c7da1d60b45c76a81682b9fb32ac4f098ac93586d61131ec1a8185ce2", - "d6201263305a5ae27d9e1609338345f009425a1474b61eec660bc095f99edf21", - "43216a0a7c02a7e0703efc9b4581e6b14c55aefe57e3a45eae9b1e310e4b5258", - "ffc83ab45978e9778725fc6415cca2ff855e7ea138e91bbacdbfa3724ae5fca2", - "dde0023def5963583380f4310e005e93d363b82a5ee550900d070834d827572a", - "1cfe93ad2bd8eaacad7fb16d9a80e18ed7898a2512cea97fb7c10cb3ebdad61d", - "89656d42eebc3843241dd39511199f212422a8ea3d7cddf0785c902704583d84", - "a6ce0805fb51b8f213a3d0378196be2943448e77710c4cbbaf71a753d9ac9854", - "5b62f2ab365943c0d9704f47f65adbffb5d74873018f607bc2f568e05ba7c804", - "c482977acbaf28600bff11a31ee37cda2d60eb754bbb1e137baf429348c256d3", - "5a61f501e65828c888793610a6066bdb84afcf33e277297cb97d5e8f0d62a7d3", - "632e08bd72b86336290c3d144053c4a2526809f144266fa80ba8a124525e3dca", - "5083525788cd621454bdf155bc5ed0eb0f2f775731354b56c07a01fb1e4e1542", - "398083292fc59f78e9298d17e3f7305b8b12bd717df31fefe790455bb846c63a", - "b9b3b80bd374f78893423b90ca11b97bc60fa8dbbf2ba1a4299ba6e9c8f59b37", - "b294777bf1f5ac20a316746a49001f80c8378856dc5c71d87e75006971b02db6", - "42f6e48d493046d0ef313a40f49e585111f3aab32096dc51e0e309caefc4e0a9", - "a2423c36023ac928c141fb5ee8fd1d05a3a4dced12d4aaa4322c82469e140a5a", - "13e2b56a4a132ca449b5d2d8cb387b0ba751e8858ac448c02563c27727141643", - "20c02103023e30a8a11d4f2ab9371b640ffa07e21b1bfcdd130bf28bd7a1a823", - "71970090a952eef8209abc81998f4a0555857b53ae70871feed088bd5e60bd27", - "4fcd770e6c04b4b94d4d728dfa7440b2f9711518f82cfad11997baddcec2ab86", - "e3dbbdf3064b9c8920e2b6312f7189004cb066c77ddef667622252c9e97db3a9", - "5ef97e5d6705fa820938e0b80c7508c8b232a53d48d3ca34c5ba18ee1fd12118", - "6eafd4c57f2882866d43c879c884a9a2abfea150f310d24d84eae3f6be14b3e7", - "64f5d2674e214ca2a71ab479834663fcd2b907b94795f9e51c4a56fd12bdc2de", - "9f96a1049599f7fe1026fb43db8be7cae199c83d5282f83c1260a7a2f2821ee8", - "566c69344af91969ed633db1062fc9288e6a2f4e792fe627e3c18e7ed068daca", - "bfd3c20cd7b517939664314a2b69bd3d2a85921d28f74eee153bbf17cde56ba1", - "6f2692bc02d1c8a31147abf16fbeb6ade32b02ab17e16bfdd153f6e88078d185", - "1bdf207121b8f86d5a8243cd34bb57334c0688ef41f2accb3cef4a0da756f8b2", - "18c39df4e5df47fa353c56d2c910ff70484d069a8123ed81f437e76456aca47e", - "212f6c5b1c5e5d74251b0d3baede214608caee49b6ea44d27cbf1ecbd4316992", - "b4bc476c48e7b5e3342911dfdccf18caa004952e9055f8e52d10d8d9c6503b74", - "68050cbbf064c554a120ddf35dc19e57a77fe83bd16b97ae2b5ef7feb25afdd4", - "7403b736606498ed2509325b3a41689c7260f055632daa65f65bede73426f4cc", - "2c518d9014357775e8e3ab5c15c460522a2b9716552b733446f4aa5695d4b3fd", - "20ddf31ef65b31a966cc62a9560714feb6dc6a2cd8bf20a87885aacad61eeca8", - "8c654718b0ff02615b0dbf0fe2323d2d97e959eaa1dd6bdbc0ab76b0e7b377a7", - "df69fdd69fccf24389e40454e62685336e27068c8eab0096fe3ad4e09e3c1144", - "f4a4b6d2dad8dc7809a58f50d3ddd3546ad3cfd2defe6aa98e6dfa29c10039e3", - "ca9c612a4b1f0a5ffcc4e64cc79d3ffb657d91afbe9641f485ae3d7caa82a3f5", - "116d165ff4ae738a396417ccd7f6c85b16759350c18886ab739c7149b1e07094", - "36cc9bfbc6539bd4751b4e08d60ede842102efb866f4c42ecbaf66ea6d679295", - "0f9bf56f0bf377aeef4fd39b7b5dc4863ffe98c3c7053b2704b6b145c02435fe", - "d1a1a8f53042b73b8649f4728f3564c1ab7020ac65d66d2960ab50f2427ba310", - "3387ca2ea6ef06b91ba8a094c8523ab1bffded2ae9a32ae5624e651ddbd11615", - "e3486f9c97ecd00e57a821a02155a7f209c07aeb0e67e38ef27a204e38f00d8e", - "ea24f854332824db4e7bbc5e5645b6ee1bea4a6178455770048fd3b290c6729c", - "a1a691afd290266767f3ea32b2d6be36e076d5bdc5d089fd9475b83fb4fb4cad", - "ebdaaa45347dc4fbcb00345ef7fa8a3e876b85d7bd512d25922f0ddcf58bc5d9", - "1058bda4cf6578aa53eca71d3dd2460a9a129383494e1b18164a196887c3eecc", - "4b6ad2fb5b1da04331b890b7d2e9a6dbf3a6c0a9b623823acffbfcc5a5d7b8a1", - "b7474cfc223518a60544d0b59b7f7aecf7db18e213e6cc97c433cfd73a005b5d", - "a0fab9ba9682444918349c42693f28d9008ba1e80d6193a987891614bcf36621", - "05b8c0e30bb02414c61ce23ad376870273f2124cd8f97fcbfd94fa07ff4c7160", - "b8ca0353b365bd701a1534bde8e8dc5359f44a745d92addf0665f0407b6915f2", - "ebb1c30c69a6fef618bf0caca05f59ee40c70884e01cadef9c70ebc576ee1248", - "64117bea09735fab600534182d37c2a1219e0463a6dceee9b4ef06828d66f29f", - "df5339c3fd6133e82f7b10201eaab087d5a4e514725fd86c2730f00b9a0d5915", - "04fb25ea707406de138a0da3c88411b352cf6d53ebd394b6165f6d869f4981ef", - "c263d2d60236aa9295d610bcc96791f7dba9f7b3efe236b8f954412e226a193f", - "ab32d3174fc2e41d86e79a7f51650c92feee07ee482951c4ff32c8e07a06636d", - "0b7c8f4884f4b65ecebabfb2bbb6e3a752999ed42b530bf2ad60e13fb784c2e9", - "f78bc781d054b8e7097a214ea0d0e450b34488dd8dc1a78b05d01cce35e270b2", - "3d30f64938a7cdc13bfc87ab4c760f31e4440838f98bbdb3ceba8496470cc39a", - "27a4144d668584cc72a66fc5d46ef44252cc5f1fc94dfc7223efd736a8b0578c", - "1f33e177fc93e7ec61a1da49d2fd15be81bffaa77c47e50b6d3625ad45e52663", - "96438b40831e38930cb976a03b7dd518e91d61adb9d97ce9fb8123275edaef28", - "a81712a49a666a0d36e76d348bd8c50ca07035d2107836ff395e746f1b9c111b", - "9c3815e2f30378c66e59026a7caa6019f84c083a9adb6388fcd82db3accddef6", - "bc9bd711f354df19e26c5f8c8271c03a68ede9aaa314ff107e3d6eb0a1700f63", - "c789dae3045be0329574c443652620f752ddf62556fa0b072f2cec3b200aa42e", - "22c93768e59a6b4aab880c8f011b86710f46287b2a158ce2960bd01e09d80eaa", - "304d6107037557cb1bca6391504db84db0d26b5b85112dc092132220adbbbabd", - "b4680732129eb10c0291953e5e03851137d372fd6f3b80bf3e6be34965f5ba38", - "8cb2643798a9ffda4737f63814306bb046c2c75819ddebf6fd9140ddcc0c6d59", - "53f49eddc29619f5e7fcbb3505887c3491040ccdf10eaa4256b373908013797b", - "7f76b59500e2970f22d7cc928f806b5186c1b90b7a07a92c5a7cb1bd83bddeed", - "fad330d737a13d518577c011bbd18a3f862a173f63797cdd78b11a8bb1dd4cc3", - "ce32e66e17a3e9f4507790cc40b038fdf7e49e26e2eeb19d90abac0c92cc937e", - "98d1e0e80b322371637ded68b5ef141a604b9f9dbe5d07bda6dbd946337115a7", - "efdf628f225f8ec3486205f53603d1921b72923513223d4289b0fc92a76d0b9f", - "4bb23f665e33487f6f0d18b0e179d856cfe7466d1d3b2108b04da4e0577117e8", - "d6873f368775d1baf2ad6cf005a7872c8ce54bb59762b0e67d45278fe21c301b", - "068f905ac9df333430d0662026983ade03c2e136c02c363f03d32f5ca714d4f9", - "205c8b87be6313bb9a2cdb32cbdc897c3dfc5876d452eb838b8c81f32f1914fc", - "3397955c8794014dbda40d2fa8d4a0b6f57b7e814d3f35cd9a827607f8abd8ba", - "5d69ccd08fe003ec84a2c0bcca701bf1972e0e9600aee86151da7baee66fabfb", - "19cac7ecd8aa96749aab4d1c5764f5f8d1d53996ab51e8c699d9cfe47d40e118", - "1649bccc511865b3ee89fde9034d0f18003477d494086c68042ec13d4fe79d2e", - "4178c0ca271d82d43f1bdbc2f688b33b26d613c750abfda42b7334c6cde2ab00", - "369dd82fcdb0b8370b8431463408aa783dcb1f8d23e56297ca2799a354262dfd", - "1d920051ae5eebeee728918a5e9d2ae2cab2b9891d58bcd89d6a06da32b96dee", - "5921eb4667665ac8ffa63d37c9ef78e9d30869fcbb7b6e4239b2ef60a59125e8", - "e494ab7aaeb535095fbbd6943e2f1768751decbff5510bfb0163cc2eda1a1f15", - "8fd18d60e39638014f434d4ff019acc78da000fdece43112d7c170f82fe0a37c", - "d0ab4761fed5498f05988839d7beb5ee6b9d127cb058c225fdf3b50ada2453c3", - "436a19930adb864498cabe998159e36ec8e3ba5ff517b5a06e9edf1142cc7c66", - "513b5b2cbf0ec5ff14427ac984ed7f3450327d4e62e0ce3db4637d43e5835593", - "ffaf765bacda373e058917d0438185a83a3f27cfb1826bd678821713e4262b6f", - "500a9eb15eaeee05c961a56ac55b841ab65442fee22210ca5c706a1d17604fcc", - "a9ff72ed621f5b26774ee94d8401a4073980877fbdd407b1573fbc5b4cf68cc2", - "b44a6fb935694aaab08c700652bc6a7181ad11f05ad8e7d420702e5b172f041b", - "44e80eef60963609c461946f06000d1e3a9bbf27f6efec9e34f74c1106701e75", - "3c2d411c0f8ee54aea3a197281a5e258136dd36209b5b89405bc37892de1f610", - "fdc79656164eb6c035868da02aabfdb20a7ee543b661e34a4453df72bf30ca5a", - "85e315cb891b77f34065216a3aa7c39242ea75c38c4e401c91992af0a8b0d571", - "1adc7dff7475ffe32a247ea8b0f05eff86ce56ceef36694ff42b93fabb943bcb", - "a8530552944cb2fa3a255f3a79b795d04c8ffaab8c7c2336ada66d4eee5e8fd4", - "757c1f60adf5560b7309693c83563bab09db46b7865875f0679e3cf16858dad0", - "e13222e672bd9724c0aceecfd45d1739d598e16c3ceebd386fb1675d73b42ced", - "4291e316dc5ac83a3cba79cafc2fc14d2e34ea687ec14c01687d95f5e2692595", - "68f12bc5eac913582d1afdd6d47ba80d7b52f1d3a47b35049e827403a92077a1", - "059d437d2ec3648b4acb4b1e162fd9af55361102606adc110d337a6a5b8e4915", - "8e9ef2ded6369c63030c425902d2d4b6c132b8c490b255d41b6005dc9d770b95", - "923bb0603a1a243b308a95f0231c3b7c42cf89586a62cc1e3df34b1da45b9217", - "3379885b53e364485162e43a9d52458346c69f9366f3cec2145b3fb347381792", - "93ae421b0086037275c50160a8ac1ea62158b2793f86e96fd48f4237c5b8b0eb", - "ee08a544c326794c02b3a23bc7493d4075a9962421988a5f6fb3a5371d738be1", - "2a708765c1423737c5003bea01fea653f24beedd0671a839c89d263a2e1e3648", - "ee45e394ca1a1e8279e52dbb96dcc8dc276b2cebe118d6e52e13c161927c2292", - "39267d1ce3eae06beafb4fe17bfe29159d14e75647018db85406e9c053ee6905", - "23cefd617b6a9de4ed527a6aa6cd6bc521a93fbd6698d1e6900892e25dfee5f8", - "cf9bd16ef95c6e6f5f096a7002434ff264103d7fd378e00d4465246e26a8421a", - "fc9db3c4f9bee962675a6c3d28ef90dcb2030feefcabf3b2c92dade6fbcfb818", - "f98fbd6d84156b64f7dd339389abbd0a3ed7de2629bba38fbd3690bdf7ab98ae", - "b452b810a7f9ccf3ebb7c45470dc898a25b2748ae27044b78f72ad41e2408ba4", - "86f5713b8ff68844842d63efc05eea82875e9b80520144a15bedae7a3dc08a10", - "a785f5168b75ad6916649538b07071c61a54be51671c3b06c1c466a01f4a2b14", - "1b01a01d1695f8ad00f5d5bb5e60d0de2959fdd6091d83751619bfbc721a7235", - "38a16f20d47b7a8514ef19cfbfaa2fa3ebefda16c4120255859648f298a9f0c7", - "ef2deaaff2ee989a1330b3e7b6fe0fc539b3b41dd4c9cf24891edc352deb8e58", - "a7fe848a5b5958ed5c0ee596d3fbcb02108a6f793bf69fbf22353e83ca7f9696", - "dab39349edf393f8d10cf89ecc7a9f364bc6e425bddb25932907889d78cbc1e3", - "e8b5c99b0a78a81b732925225e1725159e7f94aa24867598d0dceaec98acd26c", - "71724d1432975c85c83a50ff2d76ae6b8091cd65d3ebcd8928c301cfbc8c3f2b", - "f82d2ae0fe700142127e70a797aecc7479f0bc2c057d20af68820bf1e5c8ff94", - "8693e89db943c9155b182b8ea414f4834923db096bc5fb86e9b977a0bccf007c", - "55d266f54599fc627bb3dcf4edb33e961330479da656e2e43eafde79ed92dafd", - "5421a9ddfe709d3901c6b3dba23d5d40de26bdc168740525b7f55976c328d383", - "0d93017961385ff6c6353d9cc614d0ffd96c03121b0ee687539837a17ccaaf82", - "67f12795860bf61b7730644630c26555d57510ed815e03af0862d6be17234b76", - "e4ebd705f7d36a9d1d0f5727c7f95fa6ede42fb7486cd7da92d6cf41a60c9c63", - "1d61480d3d0212ec51071085d8d9d7b4304da530cec4d5867ed0df8aa08603e1", - "a2b68ecabe863b114c0e25b14af85c1c12f3bfcf288759797f4d3b9aa2427eae", - "7d98a2ab4bcfa6bee94272eee646cb6a6bb23f3a9d2f1f87250eea5ce590fd74", - "f81b04e9ee30002298b6f681b0b052777831adbdfbdeb6a676f8eb068a16488d", - "da31403658d539516785960a9d0591524f586c8fc8b44fc28eedb0f1bd604571", - "75cffe63ff0c14f359904ad47c32bf30e7247503a085f432a07cfd977b683601", - "ae01b72c7e61e8fe3d6316c6dcd14c8b97601c37dd7208da4bcdd9af238c5c74", - "b1adb8c3fcac0c7277aa69c0edbd76555b4c23583e73dce63065fafc20c2998a", - "058e104c4749e5df24cc0e95a502004600e744cefeeaeff297ac72ad8ed126c3", - "90ff1b33236f0177addabdb5408656664f456c075411dd5a48906f376229876e", - "2fa0f55b77f43eace9dad014b2e1aa1d3a19c745c8bfd54fec3737bae7a6d8f4", - "fc94e0bbdb7bf1f16a04ae190633d277928263389ed25a901c9785cdc696c4b7", - "ba87d5a50b87f32458c7a6ef7702affd06efb947223f6e01fcf12637e511446a", - "04a77f1ae6c5f1f3ec3d58bb9a341dae1306076e5bb8163ff84ce66d8f505f43", - "4c1e5ac3d61e1f734c5331355fe3d876359675678f05974084091dd5f324a5b2", - "5209eecaadf08536f12099d2add36411b0d13bbf2ba69077110502dde89c7b14", - "9baf9ab9ddc97e3823b70bee70206575de3d21610982b6d41daafbb9741746ae", - "38a99adfd586775b0febac78f3c45f24a71aa8d24dab46e159727300e45d832d", - "221150d9c35309054528ce7ce3d98d5da0f548078bb71ee2dc28a4c0140f5f83", - "b34bfb06befdfb2ac0b936add353f9d34cc145c2da9b8fab04592bec58546e69", - "2ad26f1ece085b132d2fd7cf32dcd4ed9f8774cd3c12f0327cfb99450bc2066d", - "be4e329467662cb95f334220a5b236d3a861863bff358a9ded290992c5814623", - "b7d07b6c6725d37b8903086d0c9d82c85a46831e62d032dd49dd8c0c90e6f15f", - "9be36ac0f49cead8f8bff6556020e4683ab537e0f5c26f63aa02e504b3625fe8", - "1fdfdc520bb9572bd4b3a2ef46f966504aef05de74de737cda2142ab241a5b1f", - "6ad8dea9fddff0a243e012d4f6337a0eeebebbf352d634ce3cf55ed78d70ba8c", - "bd90d65029606247793f12a4fc0ea52c3f36e21d9913240bc54722f6d376f4bd", - "3c62a6ca239f18c4af6ce2936c28bc733573d320b91fdc81a7e07904bc1ffb24", - "098daa3bf141415b145d7e2ec807ca7c00e6f7446f4f912fcb40efb2dede93f3", - "3544f0a9242771c0e0cc797ebe3ade6059f5b4e89bc7eee4819cc0dc7268bce0", - "fb74e17cde930317060c396ad94a81262d0c40d1f82553423c77676832bccd6f", - "862a14694f95dbc92e7649729fb5be0416ecbce88ee2736a276fcf58ebf06957", - "906b36b3877300e13d3fc2a88413ff0c079c0af42e65968a418615fc18d81abc", - "443511f8b6980bbdeb918daea58b9fd0385e1157d94c7d7778332e81f99781fb", - "99b76375b83db005c21e347298e73f07967ff0dc21bbadb6211ced4cb6656574", - "254beeb12d8f279a47f15b4040e0e0ac1b742a809ea5c7f24d9e0f60440767eb", - "0a3fee8336b7b085d99aefcd87ead298b5e95dd55e16cb17739d191dde93971d", - "7ea32437e01d17290e91e292f5bfea8138d79af2bd2ec071165b01fcb64f40eb", - "488eb7e47c6cff0e70f7172da0e175d008b6aaecca5f663b25df3345c12cfa28", - "7fc03a013f379d202bf7e30e930840da6c2d7e19ba7635acd9a9416cbfed45c6", - "7f05bf41b2ff4a44a6df33a71abd9f317485edc3e3147ec079492af16fb1a279", - "7a6f452764d743330c17ab3cc0cdfeda8b493c25025ad74d5fbf0bf9e8024269", - "69645af9ab7d417eae92f6b1eca7ae49e1ac3a1eb854c5bf1664fc3c7e693b48", - "aee18ac36b0b29ee4d21c42ee0b563323a322b4039865247c9d9ac99f9dfc97a", - "3eb11cdcff6a94e767f7e8a9127ffdf40f63d456571d39cb0ced0a2acc0b9b96", - "3c0131b1f7802e1ddce57939ef97b5e8a24ac5875284ff55c4454d3f6e0d57fc", - "7873f71707f31a709a4ce78747d930b109a24005853cd86725819fb151a6681d", - "2708ab7cf7bd683fb6b05d89c6d91eda692de5f98f6351be29eb3a0ed366659a", - "905c8e1a350022063b06ca15523a8627afe0c99427da4da159ca331e6f4ff07e", - "fc16f990a3beb577028850b6948bd70f727000a2eebdfc2bf9aefb685542ab30", - "470b4d3c479f04a650769406dbf1c8dd351a44a2577e878d1bb7b70be751674b", - "6b9950ee020915fb7e6e89c843f29548a93207f72cae3cf47437d40cefd17884", - "86ca5ce59f6125044a2dc08b663f36c24bba5b5b654fb843e00dc1c9db92f115", - "0fff9f7be561a378a5d79d53035017f3acbbd282476ff4bf47e7ad945a3f4a05", - "e2eb3d4006cbf6069825566c63430126161634c1dd68be314dc1682024b9ec58", - "0acf2916f21974325bc61a953a52685b0a4b26e9a19fa52c04eb38d6ad2439ea", - "1c54f0cddf2e63ae5eb04c745c439c7ff576b34df0d1ff7ff0e47036dc4e31dd", - "0435b1c7c6c5b358c3625a8ef02ba40684a557140400ddebfc16c4a89e909c3f", - "52da6f8a69d05a0d626636ba858f76a8dfe5e3d6c49bd389c1927eea4c53be1c", - "0f78f7a43bcb537c331b7f25fed9b710491c9c2a16eb6669b99b7b493bf7f964", - "2d055f0d666a62916b3b7a3385256c89e8023f1189107ee09696dfc8c43847a9", - "7233f3b8b3ea16f8cfe98759d66fdf1a3ef2bfc6e83f41a40d40917a3919252f", - "9aa9710fdb120131cc2e6d45b77364aa08aa42aa437239b96d715d15c3e2dedb", - "cc6473465dfbd157f2415e218f6b16d5b672a55d251e0dc767220a4d6429df0d", - "48434fc40e8b0902f9296ad479a426d5f760206034f9556236d030b9d0d05e5a", - "26446b4ca29c9aa8046bf73120f481f645580cebdb3e74fc23cf896abc3fce36", - "cb0d0f2f62a2901fcd4d668da7759da562cc4b66d43e64a8d2aac92607936c54", - "47bd62eb23714bd2c05c6a5d9bfd1d61e322f22d8bc96d9e1c1e06947754ad95", - "29c65774591b3d11b66943fd0a619aa1d26b96ae8d7eb4ec45ad23bae40527b7", - "7d71a5b001b5bf752af6920a64911a1ed00fd8edd8e92b1b733d615696ce86c4", - "ac972353a7fc46ed91b396ac11a288005edf781f153d99a125f9026060543a70", - "ad2a72320d25a74bd920bdbf12c5bde948323a67a58c325ad12ffa5d22f6c4f3", - "20299bbc5723ecf31c93f384b493af3eb0d8d88079b7a7dce8435af9fa586eb6", - "dbcbe2aee37585a5adc4c6ae3334e9ba9740f6ab7e7200ee930c1e56a4a13997", - "a3b5b6bc6be308f4f62f5cb17b15d259e7c3d794748a3b9a0ceacb49a5b84696", - "bd35045439a56981edded7eea014c12d0617f260982f84c9cf006516213eeb89", - "4353b6703938eabc75e601715584302e1f6e93e62341432b65d1ecc5cf074222", - "b795f9cc7dbc0213a5dbec3014b6295d3412579ce60724c7286d23c65b01d30e", - "38cb4c83441fa635c6133382456e0e5a018035db298012e717edf7b7264074f4", - "f8106f2c08832988c3af31e3f03769bf42d162de3249e2753b562f1626f17108", - "855634454cc4f849a16c9da24380cb875845763956d5e7f2185390bdf3932931", - "9f2488a27b71a3b3c31bb02e082efee87f1e88cbebc389a95d9fa1f2ec6ea908", - "a560af258e53513a489183b3bf9fafa5bcb244ee306d9cc590a33cb1c0d88d4f", - "b7ef3afb5079de34f40c626f1a719155767a6405026aa71981e9749ae523fb94", - "735630a323c34a5822d609b0fe062ab13cbdf17a74a80d9088d3d021f04b4d6e", - "44cb875bd44fe594a1f46cbd1e3c2631dfedb8b978a5674e105b5a5c0a98fb5d", - "3172b1db32aee1fd9d27f826b825cdffa1b50af651c1354fd790b81f59f7339e", - "748a7528d3aa3d4bb596e0ec62c6ff1a7fbdaa620513968dfc5c41af851c2fd3", - "403861b1306f7b4a8a63bf79217035add6fd01eb4410993b44b2e9e9a3785861", - "92e5fc271975b9bc2a57daaf60cf53089b568252ee302a1ac1c7b6bb93ff2a78", - "f220fcf48886ffcabc495db42da4d4abb6bc42febf5ea784b14394846fde348d", - "c401e81c3c73d04d874498700e398bb11342699ce0216208026f7de2913d4011", - "347245b18f1498410d55beef6b835269739b7688fd8124c8f36b9422887dd6c6", - "7713adf588cc969c2db4cba1e60606b3f47003df446d0e4e5e433aafda30102d", - "72bbeaca4af6018102f8bd49e3982652f81867b945d28276edbc48a6683910bb", - "68f9d243beb8a0ca09ced4ac0f3a2b99c7ee8303f2ed460bdac1d24e2a53bbf4", - "99135196d467743dc8807ca55c97d49ac05c63753561a9789e69d57eddc7951a", - "5ee01d4e217b555e054ac885b5b7ad9c680d6b52e823d32cc7b4c8662ab81d7d", - "d4590500f2592c93eb51cfceb93a4e863810cb1681d791fb2c132ed3ced07b7d", - "b3049687c9b17049c015f6cb98c736ae5fd1f228af4aa0d6644a9104f6a8fe9e", - "9f944a86a87c1ae14d8fa8d7844e82da06bf193d7fce19b92e75f11e3b15ccda", - "85e3f3b6e808ccd17a94e53aa76f5b6b68e0b5274251bcf0508a99060ed1cf3d", - "f25ae52a7093c594555be328721839382510a07caaa86c3ff503434d7b49b218", - "ca51b040ecc45bf6a3618ecfb5f776ab55f27f476a0221da4a7704eb41e5bd69", - "0ad634628227592fda0ba17d399abad01bf8333b21ff81750e9a1836703e197d", - "dda0b606e5c29795f69e55397095b94dce9d57918887e62afe21cfa6e0617307", - "b1bd9975f48e38b7c14aa3bac30a0d8c47cbe628e2fbf8423eb0c4d83a0e4d9e", - "30a72997b3001dcc046d4cb14dd19d635d35049fc8cd93fc5d79144fd40ba0b6", - "b1f584bbe73da6ce192430b96314a2812c008e0b9bc3976f21091435a83065ef", - "41a6df79b76f93a70e83635c66e824a695ada5fd5986bc6d7b29ea179bfa98f3", - "21c2da12cfc498b5b084a31003a80a962a61ba5b7f5f91011a7df7ef47216153", - "9ef840500e450e0a53cc4e34a04c3d3550d8fcbb04a7e29c0bf567e8b73bdf0d", - "c0c4a7256a7cb6102cd8fdb488a87c5370bbf0273cab414189e8f08ca847c35f", - "f0a36fbd38793c3be7def8b4c1b3f43f0e6e7a9175e9a7015ca707e1c8dfc7d0", - "9ac6483b5461d1744cf885d63c3c67115a8de7a31102ef75adbc3fec8afee1a2", - "cad1a6214a5a45449238c2d8268df6bf5293ee25d036c86356a84613d76fe1b9", - "4a103ae981df5b5538ff3e625d097c34dca7823469e5ef85b587c404598aa289", - "188931162a24a2e91a17d57a8a04cb853b5db0d0d88d70176d6764fedeac406a", - "3f272ab22b434ca27881c8744f9b42a2fd4263e3d1ff1f555e9737be34f3f391", - "d2ddab15d9a7db4f4eb1b671cc1a9abbeb6d0a6555b9566913d4960371beb6e7", - "46adf9270106590b66f60eb0dd544d60c10a07e8c9527088535c07927c0cfeba", - "10bb00c22defcf4faedb9dd1cd0325fa72a65136fb0d4b54d5ecf9298e232003", - "0e13bb28ab95593daffae79b1d28e2123393175da4b27bd37955a283209bf6fe", - "17bc55934d4912eec5c741ca103ed5f1fd031c230ec228975b36548502f23966", - "da747c14ff6555a52bc00962ce4d5a8b7df97c14172e81c5347ea75891ca52c4", - "5bdd26005bbfabc3e0202c4d87941c4d24555a7c278b23e91c426a2827714573", - "c1f3417bde72ecb374dac2d6c52716e2d91c496f9941318a5c86b3e98c933f31", - "ec3a67e9103be0c190659393397ad2f32dd26db441b9a66541337325dfd59aca", - "6aa5dd9c060459154eb5c5f454c68939e7f1e568c274b692e5db60f7b78954a9", - "14daa2a535e97c7c8ddf76f0a0cf641a39b6c7c60600be6eb930b83cd771166c", - "455911fa7e98729d053c15de67ed0f0bbf9eaebbdfa0805b9982e6733ad69ba7", - "e43c976b4774fe201bd46a512828f08973181f26d322c581844a5b20a39819ba", - "66a43fef09e9e8b8b047341d9f4a391adc928374fa21a8631aafba56940b923b", - "b8ab7d419a794b47b203eaaedb0e6df79d9c19b5ed1757dcb5dcb633cd2d17b5", - "b3bacc548547131d87e84abda2760e4c3c51ccb327375e507f9036dd7741ea85", - "059a153a68da852a660776af4bcd3cd06c6052cdd7e9470faba221c8d559a0f1", - "f88a7a5090f3ef5e74bbaa15547b86fccd341e6cd50051e7d45abf71ec64f567", - "ea24e0e8517f36ce2a020f8968057c65d9484f88f8bff34442eb4a349fdf4a0e", - "a1a7f25ae66bc707a1e8b380c1ce32af0b3735c9939e469e84754b5fc27755c5", - "f222f90d6e4f01043f8d3e6f9c6706417ea80fe8c09e8d99ff2774d631eb42e9", - "59fc1cc6fc8d84b59bc93134d44aca8f8f7e3bf87f9e569beef7bc491be62d51", - "5d62ec9cda5dd5bc13ce18689d9f2832e0d5e02da047747ad16dc449d8e6c1c0", - "043891485c25868184bdd8642efa0d71cb879fde5803bc462bc7353894f4c8cb", - "a6dd78dea0fbb3e85b77d115693b5df545ccc44e1f39acdce6aac0ebb25c83a9", - "69b4195a79198d8cb2490d6260513db53e545469a20aec4ec2c2fe42e1f441e8", - "858369f63bc7874f09deae085c2ee6cbdedd143cde758bcd18d2328a54944d1d", - "36456db0eb2bade769e3d84df7094e375d5f6028e59e467b8ee7b4acbedaa7e7", - "48247756bec32b2270171ec12f82c4a3fcbf20d8963dc746dba5e4451ca72cac", - "d639d1ee521b27fb70221c613fbcb6d3570c91b3a3324f88a78109d61d9b68ff", - "071ff693d9abfab52dd14e9cc814f143e246f95bb86df69fffc61b2064286103", - "349782a38fc7d000b376386a197abff0afcbfc387e460d5c21a2df4fe55152e4", - "96b9a27eee3a2932a938e6ce0c1547b25ad47f57fdb0d6463540211c4ef91b5d", - "6650c106be779ae122fd8a5563570a7f7bcbbabf7acda8066ce498beda8d0146", - "9889d7aa67db78f5261ef85a84cb0a7aab7fa45125ba2e7cfa3677fb57d3b010", - "cfa19444aa6138f64320c8d74590a739bab26b00d3327d44b2031a0e5d213c72", - "9c0bc8aa0f0954a88304eae41d737083da472d7ce6c23edcf403d26d5ced4ed9", - "b2ae3fd6f17c4bdc901f0b2fa732e839dce4b6bde5a32d18f8b14729ce1afce5", - "4c290f191699dffaf866aa8fc77bcff8a0dd1f3ac3ef55773507638f9274fbab", - "831ee48288611812c379d869c7dcd59cb902c3175566db831df1fc3d7c300ddc", - "3e6e2e0e380e8347efbf3f3b081197a79d326e74d95da0d2320c50bc01e3a57b", - "07fbdc84bb6d8bd52e33e6d308f2e0a8ffcb24a54e74ddb8d854c8fd2a623da6", - "c7590825b765a18589cd20f7530d1f4c3863375e33515a449c2b18b4aa0e9999", - "b0f7cad56d4c52c13d471c99aa6a5f19f15dc15b39f6a23901730fcaea91152c", - "282ed258a8da22f5e1097f0be1a0e322f3832368e957ae97c955b8d1c6c548f4", - "86e105b307530ff4ced1c3d65a33bacee6b1e4afa78350a88c77aad4ca4e2bad", - "7a247f54b1c35b76dad712c503801f8befb154a733f986ce1e9041ab5e433554", - "4e31936a4a807d9a41a07cb734906fb0b4f13807f0a72e81c457250a4a90310b", - "1ca46c0c4d6e14e4e5bb542f446758ef697b39a84fbc241418bead2d44425e54", - "cefe97fb26386c2cd89649564bc7c0167c11e4c8fdaa080c1fe7c553747cb32b", - "49c87c579b65b4f5cf82a1123304ca41a8f52f8e5bfa01f252c29ceba416fb5d", - "78d6bf62da6e40dff63300c9fe22343bfd249249a04115fd629a540ee4bd4b9c", - "b7c363c4d7cf68972ff8fa369695ed718887833ad57f5ea19ab065668ccc80d0", - "a666b31b53175e287593ec127d7b541ac25451c254d6f671a4d7023418503c0f", - "7e0a473f979131727b33de23b0ad7c8266848cf3340a80aa97cd6a6fdf664e4f", - "acd4fc91d12255004a4d3209b581f370027d46be5e45c8fb2933bd5c43d3be62", - "a229eddc85bc3a795c75b56e54065ae7b3c178afafb2fc84cfa149520fb08717", - "4874d0025d8182a6f981b9fe4ace48c839d9dfe7a504d86fabfbdef81c56e448", - "9377c0cab7e47ba3c6eed54f395097e54959418f5f4e7a4973cb5b23fba26c7a", - "3c10e06f3078038e1355735775f9cc5fb567a176d4460dbb2eb662f33d3441c5", - "cd88f78dd790932e40945599377d957af389aa862ea290b0f08094111e582e20", - "cb6c1215516194fd0dec3054515f73744c60690b4c419e5b1cfa1784e163aece", - "d7f149afd1f8a4821d5a9f311d10da5f7717e24236d179e72b967c9dcf25fa5e", - "d96eab596e3c187ed012d71bf0e784cf0de01de454b57dcb52b8a4f7d133dcad", - "6fa7c09818cc0e78d35fe90bf6276d20147d9ca8d7cc8b94bd97c15507d7c759", - "973ba630c205e41c69a9289e6bf8a90f08487c221f58ebb574495cc3f593e65d", - "f6b9689c5badd209e08293e1de97017ce133383b975896ee8efa20fd7fd540d1", - "d3fe5e47c80a22db8b11d6f2c6c1066884efa6a88b3124f8196493985c0f23d0", - "96e0d621227fe4afa38ebe8df128a868221bfe487cff3cff9978bf9dd7fe9977", - "b00176f14752508a86555b3f893329e984606d19d2cf48d4a851918dc828bf8d", - "537109c3d65ef8ca3c5c74c17f277fea65950bafcad00366dd036c37bc4bc105", - "4ddea69bc77f2609f015d0a2fe8f43184aa6f32dc61a3acef55943bbfce2b812", - "1c858ffad1e94c62ffae9b25e080ea827c7c1f773c61eee466f2fa60fd49ece5", - "7ed6cb2f56ccb2294bec62bf9d7dda9250801956d11156c59129ce06225693b8", - "f50ec14b3b3ac46f82b1f550f771ccc801255ca6275636f5368ea89f9bb68762", - "80da2dd95d9d5520685e2800ed722ad0144482fcb64f5b7323b2273fcb8869ba", - "070a8dd2833e88542fe385b48630ad8513e6270765e2749fce9b843528ef4548", - "5180c43356a96bed8be036b16a598cca09d365c480afac006052b0a5375fb7e2", - "18828f4a404f9b2974715819c77838dc7f2157e91d49cd74886e4492cb24d27f", - "4fc4cc505b1c797547be1976a8f0356895c8f4c615c1ac2b139cdbdb61b850ed", - "82f0f0425d7ce9faa48348f5f88afe1a5fd23977063b3b198e5c1a1ec18a5316", - "791a7da7787a87d33e6d978994979e8bddfdf5567f6e591d2599f347db3366d4", - "4ef983da90e3a4a0f303c16ca4a7bafa7f4b31a5731f3685f04192722d352343", - "dd01612c29f6bfda6a78a8fb3c024efcaa58da0416b1f56b2a4e91790bf9a24b", - "b18c4d95e8b2b06e0803f895415fc52b8d7ee9d7ba9070eee39ef4d707d6661c", - "f65b9c634e2a8919464834b0beba19cec82c8f83edd35c32c2c0d0a4d347be76", - "fe193b7544d8fffefda681411fd2b5ac7a8741caa3ef9d47e2cfd66b70d8c5a5", - "0fa439afb071dab5270f1e1a5b33df7276a6f752e993698af1488d8ae0e46bf4", - "81f54e666773ea6609a2a2171a3e74b38e0011f1faab51e7e6fc7737d3f71671", - "4fec66156faf5676571fb3da9df2875c430da2d0e82a8aaa6e933fb2fcd82d8b", - "4df8e3e10f850a27972b9babf5e61dfc78f6aa7c0e08e6cf89651b0b85bd0938", - "c1f4f21f8e37443625ed052f2c91727257c2d8b77412a8d27b9a0f5c32725e9e", - "e8e4b210fb699166f30e84db72551db3431a056cc212d9f15584453ca294ee2b", - "6f7fb7b01f173f204d3125e22e4ebde5f32d586ca0aeb3a14577c423d5729308", - "7240ca02066dec28a524012b6087a9edc990e55193f42e21f70f35f1317fe223", - "85ea856548dd271bb0b401114e305ef2627f0dffbe88d85ced455f2913ffce2d", - "2aecb06641cc6b3b610e50b765d73afb19dc8bb6049adbe445dbe09e1de8450f", - "d327db3834b19b0abeeeb9ed6fd2a0a03c086fea244a4e27c66a6f27a3eeac88", - "c59ccf603bddd894ab4ccfb5adfc2f85bc4cd0dbafb2806b20b4118e9037fdf4", - "3f3d2805c2b7a7337b9411f8495ce4d71531816f6382cf0b7bfaccfd2eadd6eb", - "2bf01bb9c96e3e8f18b7ba5b586915fc8f9a280b23d2493a7383181aa6ef9211", - "8ad3e96fe8330a8c42a75fb45ac77dae07d564a73f26f4f941a20abd84309b07", - "2c396150389b45b2c38c58807b5cd3b4b192b549596b2976aac3679ba05d14f1", - "597ab10d1c4b60fbf0ad62011186b0eff128f9453532537ac20fc1e5c939c0f8", - "55006e6e6401933b1e175529a7e107ede630b32e918e92fa056c11f5766dc415", - "8016ed6abf0e691fa9c3b2ccc21268e58b717f3786adf68abb3d60ab202ee0cb", - "6f3f33f8af629c06d4ab291e5443494113cc499b9611bee8914e9d046d40a59d", - "a7f927fced67723fedb5093863ac3e707fa641a6560feaf5d1d1325fea12499e", - "1729a853ff6c3ce0e2133d8cca4a5e669b4429277767c754fdf7a30fdc39c5b0", - "254d5dbd7b85154134b963685944c76864dc6a227cb7c49262e07557ca2ec3c0", - "60a3151eb4a7882b381aca1fc34d2617ac7494bb109ba437ddab9c00e568a893", - "001074bbe1ec3de376f252451e57e2a3b0be4ce7edb8a0bb05f7cb6b923ecc08", - "3f1b28599bde44dcec2be132464c98d7b9964e96f17247a968b71a5deb980205", - "7bf50186ae462fa05e64e9a82a3c66908dbdeb7ae111cb92071b7c87bd5c7e04", - "692796f2faf6a4cb416ca91b0e363398478142892e97d7069815f6c00a80bbe1", - "b74ac709801a003211f9cff1f099a6cba726f7a7c938cf01b63380497513815a", - "c0b31e40c02d137120961d9f9f4ccdbfb1300f0b633ee5cb9e25119aa91c1df3", - "0cdb1d65b0746708f4432e3cb0cee5f8d952ed1aadd0dc7cac97b507bb521543", - "834bdabc53d08d68b1d979b16260489a6f2620cd3ca6af67840163c10beaef67", - "debd52c628105493f74c600aed38d9b9f234be0df78c2876eafa01007f6c199d", - "e08c1ef396321d2f593291608594a91829ca313d292fd6435ce9f38f1c760413", - "6c576cb56807bc6becbd3dc30e9e66322de6b6835e54eb63fb53ac1bb52a31a5", - "e61f56605efc42158eeb8114279bf724c8ca32fa690397067cd55fa9616638b7", - "ac1936f8395b9e728056f256626dc788d3f2aa71bca6df2285db2e31ac30c3f2", - "21faef80e0d5ba9edf018d73ce203c9ca39fad5097d7b9606600d963b91f48b6", - "8cc8384236b5b9b69f7c3141619dc45faadad3764563f918bc14a1e1b4451cf0", - "4262ae857031769755a602d1e427576fb7d74b3136e12b8cdd7facb15170c58e", - "7b5b1cebef3a2f671f90470307dc13b269f81c9a58976b55ba089d4f0f0211de", - "17ed6b6cf3319f0b6d7c468510d2d9e4d93de8f979b98c6a674e3994d543c96e", - "6b6963a44e42cedd9e6aae354bd0e1e6e07cc75fa0727ccfc836517332c7a72c", - "24f37093c8386a539682ae39b8974d08171a0cadfe5e905f533e19940b4440dd", - "56148ba7732c4852e95cc1ce7db27ed51238b180d0b7c32d6af4e6f8253fc438", - "aaef21faf446a89ab770d4ecfca61cfff92556d0cf2c94424ac197b412ea07d2", - "dc3379200d3b8f0d0773806be661ee0703e5ee04525232d1ddace35d65850caa", - "9086ab94d5683057ad7754e2b823ef73b6f3a291d85b27da1b23498006548d50", - "230fdbb3029bb2e2acb96f0e7b8b7f21ef8d2d99acf3fb9e5e536c1fd4433d19", - "708d2c1502818c4acf15d9ff550752c4b7532c90c666056df5109c5272525387", - "936c409a6efba6375a9edc8ef0917cbd6420943e20da2d49e6b532dca9824391", - "6b567ddc91b35b8b64c45eb48e0fa78d2c6b75c1104367407b6c75e7b2ed39d1", - "7007910c3c8f0615d5fd62c79a0f3d5304c34d949c0bbeb4111cef40adbd7eb0", - "b8bd9b1d395277b0a551c5b7d9bbe2ba8786196c7571f70324ef04f148a2c7c5", - "975fbce1d6b611c99853be012913fcc1b1b6259536014e21d32d41f5fef8e416", - "eacdf733e237ea467fe038260d1278f1bf63130680b393836d2248eefa0de5d0", - "12ce848db555a4b5b78516e709334ce5941293bde72be7b43c5107cf2f0be848", - "878da1f6d95486ef3d461740a471aeb450c45a87534ea3e07765811c813bd177", - "1cbd0d4d1f7b3d2afea905bfb4f38c1b4165aa168d48c57e4fac34ef06916c76", - "176a411e1e6f85ba8f663da2f95ed69ac9f1ff0b2a20866f73ec6002a22d5115", - "df1f164e9458f043d8f88404345ce246e986aeb7301bf937a61e81a9fadbf187", - "e556c5fea56ce424fd0f852715ca7e547e2750a5dc0c51c341effe95a9a175f8", - "15691d08c0641718c037f09955df0c2c1273789d30434bef73adaced62b298eb", - "6cf482a17c2c0f717fc8756936265b7bf0c8e271dfebd32092c9b7ccd031be59", - "1dd056be97c8340ee355e0e5d25617459bcb2245f3f661d939896f217e6a4843", - "cc8bd06c242d30d23fbbaccaf453fd4d85cb7b39ac0e5113f0af291742b451d1", - "967dfd9980fb50a0144d172881ceb679f7123485c8ed3751d37f71fc87560aa2", - "bfe3a99dec1511fd9f406ebb82057389def90670cd3740d155fcb4a1e9c638dc", - "aa5384983b671085d65d327be6379aa5cdc605131385156325f9a8fb3a9a27e5", - "c087038ebe255e54b9fd2d42321d928254eb798bd6112c963133c00e5bee4071", - "bc187805ef981555ee729b669149f0fe8175325458891c99123d99ea1a705e5f", - "95491950df20259de590b911cd8d553a73d8c07e527bf61da5b5732fecf84639", - "6a43cf6f3145b5f53681e8096d961e66d26f6d2b4ae4459907880317fb21c14c", - "5493e72a6c26aa54d0295403ede05b3a718749f596b3e6d4e3dba7225c6bc3ec", - "1ae2290fc75c6f817b990d3439ae89df4fa92b5095a7fdc06060c3f07c47c227", - "1d61687cb0de7cb8c1db30a322dc75221621a45db4ed5a6b47d457da33206c9f", - "6bf5a65e1c4019c1472e405cfb653f6942430b974c4cae678bb8999057abadbb", - "a162caa50297d6a95195963aeaa923a0786be58edb54036cda3294d23a41e1ac", - "3c8f4321aaaf665fedd78acc1886d51aeba72cb285875b50ad32a5d60c7cf219", - "cb0bd90df05b58f314657ad40544f51dbbb3b3b2340e928f9f87304a0c27f62c", - "423e413963941ee4ebd505c45ac21fd87dd0fccbbbe6c2f5e933d2ed42a9b780", - "69938a36f66e42bbae74a9508d9ff038da2d5674617cfc58f51e12cc973e13d6", - "951786aa1600e8ab3ba99023d821fe8ce8351f900843f1558e68d616191491d6", - "2e603b1d8740a18627af29ca39b14c5644e2d4db57d958aecd2c468df802e36a", - "e7e66fd04b4be74fa93c445eaa22037c9499b91ea7b285e86e7f98fefa5d02ee", - "93961264e98b9d06c5fcfa8ebcbe58f73da121d11f04f30a42b61db259d643b8", - "383364f60781365287c445713e563e6b540c46f6d891a18b0e57525b83e02552", - "b3a6cb15415ef174cf2ead4ca484b0452a40fd275ca39a0631273f154878a56e", - "91288ab742a7fa27d85c3eeddfd8f07929a40b159ebdeeaee04b296b1b71ebde", - "41c1f895d265f3ec06565e66df12d1c44c29ca75ed911059d93cc391fdb1e40e", - "4982ae2524be172c048b3a143c66cbbbf5765ac7a1813c2f50c40c8a860ce22d", - "a67c56f445e631cd57cbaee1e643c20fba8969e96ac9a0cf919eab06002add09", - "17684cfa8eca17c480241278a19c6b5cfa832da83ed1792a1fcfa1cecb523532", - "51d6c1cd65d0bab5439cdc62f2506c18c8a9fd6af3eaaae509db059ceb6d7053", - "e9fdd03bcf2bfaf7232ca15864d793404e7f4e045e9e175605354c7f68c0349d", - "d737c61bfa921285f013883455470570f1f6e4922aade43848e26f1d70811948", - "273c21d4425e36e8ff6e077235491f26253432df681eea3a3bee99f0adbfdbb2", - "3769941d77748ab806e4d1233aa372d0016ddca67815ded5ef7f95daf13b2d87", - "2eab036b884670b763cfc15f05f378002944455481caf57246cc745ed1fa60c1", - "e76dae179491221525dba3e4f9a839a350ff675666d4dcea89f43341761419c6", - "d2ebc93a8de573dc830ad5414eeeb4bafa9239cac706327c24ed9d04e6184ce0", - "fce967bf12c46a1ea0fa7416fec79e3cf74e92abffdfe980fe69ed9fa1ba3eb0", - "6dd60af149856167afee92e28e7513cd8560d245c205fd8a526af72e84bfde7d", - "451586904b428b4d31b4749451ea8dcb9c0a8e2826433f533596e1b380cdfe01", - "d01c3271accb38c87e40f439affb3798b02ff625ebcd661f85d1eb99cf39d6f9", - "5598a2949bba4f6a658d60879a6b6cdd8cf0256262470171b8d8b8ef76f9f85d", - "88a4cb86a995c1fa26c9907ffbd5f5dbd1bd0c52b5e4131e14e6309e00811c47", - "b18c16a5a15810da02f69062a7f7069bd1f26c3e0dfab4a0745afad34e1da9ec", - "ef32cd2e985af11b7ae1b5d66855164001c1b67daf85fbde33fd136ede56e1b4", - "0f22667d25300054141e4ad69480b7a2ef130f731cf3c08d2af7ed1c43c5608f", - "f00b4c095ffeb8be68d2a4f9f9d0a734e3972aeca96e29e509ff94d08bf94f77", - "ff7a786373e67726b7f8c9d8f973d4b1b4d6596ef2468bf613d07c15cfbf9ba3", - "d9d47c1c6c9c100b9c870ffc8a46a3059fff4a5a1374ad6e45e1aabaca38f3b2", - "3ee1e91b890b9626aa41e7bfdd23b92df39ba31ac6abb9e4b29d8bdde00c579e", - "2e6dbd16f39f602a28950bacb5fbafe946695b8a5732596019cc7b51d0a4161a", - "3a48638ebd54190e6c34c65cc241b4abe2874c7200463ffbad8329d31171c17e", - "8a4ebcd1ab8e8df3461444cd8211fe361cc3b8955cef5e41ef709e662b1ffbba", - "bb3cafdb59f64c9fbf40934056a796ff8187075e37b738089525e0b9f8299a71", - "6820616c566afa5bbacc927fc0d18d9f76cb9ba572854538151eb88fe5a89c94", - "4327fa807a2d8b2e9cd3ffde7cab8033299c983dba94208bbbe49af5e69d2fd2", - "ba65c4606a369ca1cbb988d573bf2a116b5dfc07d86a85ef34d2b0cdc4438a00", - "32aa40f28ec53999f0d3bc637d5c7e3ac55ba6038ba3213652e4aaf8ec01de58", - "a709691d52b2763a29e63e80f18564d509765b8718629b89373c106421d750d3", - "3c9ea616cbea8180e81ca593345fe8f692ba58e5e19f3ba2868f609d00895e9c", - "78b37700123a04b26ea636fbf0343803f3e4a60e0b6dddf0a0b884ea6eca4df9", - "ced04ef6d51e71fe99b300b89ec4c657bb9ee619369613218e9f1b05e3206ea1", - "bf82b5e14a2036c107e7c53b439c8f7b5eda0ebe2802599ae8ef719ecec71617", - "59b86b18211163f216519835dd9b819f2c45d0e2dc37c3e80797825ef90376f5", - "a9b45d10134dfa23831023091e493159fe17fb1e38f5cf0bd063f195cfb6e03e", - "36f5149370f7538692ea55504bebf551c8e1c582498bdfe64b9c516e53502e62", - "b3ec25ea37ffc7fd203a82a3c2f48190d6ad0771043ebc07fa148da201717a1e", - "ba7aa2e5879a3a00887810ef3aeb362b3f2eb153c7af7760893abb206ac5643a", - "6488bbaf43ae598da7e7516f40889282c683d422669dc4571a2d5d9c734f552d", - "f0dd6b5d7bed078c4dee299767d6dd5a6cbe9690acb204959aeb46e510844994", - "446ccb542e534d5aa2e4eb24c8ed52a02fe08131462c57a62a27bb308e3e9e49", - "ca123bb72463312477c3752f9007d5b355c077ab40b544c8ab6072ce9d851178", - "f8483cf5aa25c701b379466c34cf9b094bf8c54488ca174b2932a846b8ddbe9e", - "01024df3dfa5eb8717a29941028d746b39091998b8f236eb161c27fcd3f3aa76", - "9ec24ce1b17afcb18cb5803501bf43e9a02a3d31a2d2671d6c11fa0f270fe0aa", - "a20b1bcb1f1d8f90faf3654da98449ebab8f4a2c676890c9012d5655d3887251", - "f5ba22acb1e22a1c94fe06b2433cd78b92a83d4e1558fb4b555381aba20d5b57", - "22890b674e097984cdd270e361b738cf7a27db7e8f5a83ea7c8af49615b6f12a", - "2ed1cb01f0f08f3c80748b02f45acf945ce5350816a4c790ee465523672a0307", - "ccf63b0fc469c8b38a25d54ab074d3f896ead20e2e0cf2c818053241d73ca3e3", - "d59637d1c8735406ee3b332a6f973b0611b710ab652792907b9fb2d425b66aa8", - "f77c747a07d4f7474e636968d815bb193f0e2699c39bf4f2565bba719807f179", - "3b034d433d4f613370717daccf077128b778d0c2f7379829c17be92fcb2638e1", - "e47bf96239a3773a7f0125a7db1b9b05a0e828fb09a0cc85dc1becdcc10e400d", - "b5f5e75bca41c5015b3593335c5135fcef925229a286606c32f5738604c27dc7", - "240ad91a7d5aeecd85df38c809c9509f2b71c63c8f705c1e4be807b59b2bfeea", - "85339c06a3044ff811f92a874b15ea79b15a103a05fab2116f6e41d80bb91bd5", - "8fe521e7c6af180a6df9c5c86b64ec00502bbd4392bf1561232a201a4b0334f7", - "906cb303d90c723682d6bda4e796efd3620ddebb11d7ee8f754d9facd80515d2", - "caa6f6bab5cf24cbe71fea5211d3bd7db9c581b868d51e16744c9a4d1ef5f826", - "4c7a7a64ced8d613ff8e444d4a4f319753d1e0afc7f3a59cbe38d6876cb0a392", - "889a5444e08a6ce2e67a18145687391239685a4febe48ac5af33ea1ae99312e4", - "8f392e7b696c26e11cba2c1a3149cb0b6d2d3687c6218cfb8104dce9cf3b1dcf", - "cfe43201a4849403de0656fb8d6dda364134582d75dfdcd46b2140470e28fdd1", - "dcf182b001c927af90ef223db5cb66d9272dcfc1e92e34634ede98bd9696fa81", - "d665dcb0a2c909ce3ba91ae1a514ab8a3d8b027e69803792a2c6d2af7ff9ba53", - "41816a6e11447e563421817f10a4a13a3bfdc72dee4eae54d04ec4aec0646dcd", - "74d502e2fb57716867289f8eaba0cf9a193063b7e21f2d1cc2219b878bd76324", - "24a6e49bf4041f8d60ec64cd7b14dd29bf5740b03935215816073c7d16bc4560", - "f49f869c5d0aab87c12e4176584888e791cb316b1dcc26ea2bdc367285c8562f", - "a07af68ebcf0befc47ee4a5d1b31db83cbc9f0d331b47e1420f943f1c26b739f", - "d5eaafb27a3caabd9b2cc7b0c1d6ee89c82d0768edc790039ebb7e010a786d11", - "941d275ed8dfed1a4e629e297b8ab1fa8a513c1b3cbf5aa862d4793b8a490546", - "ce89a945a8e6f052e3d843055e43d6d6cec6881d1d31967f62d3a106c6460bfb", - "937b1151f9459a96772f52e8969dee086f4c08bd423f68b6b575c89b7891148b", - "44620669469ae1f4fa762b9b8b448b617a49711003952a2bfc17e980aa9cf3ff", - "d7bdb201d54a7b3b036083ff38b29ac5bbc369ff52c23a06622345eb204cca61", - "3c312edcc0a0135326c7ef24457cee4112fb50767ee591c98cf718a996aeac99", - "24aaac0a136b6443acf475d5177cb8326be4ec1cfc49e5d3aa3ff96c67db0d3b", - "3644fd3069a4e24cd6c69fafd816482cfc86667ff5976840d69939202e06e6bc", - "ed272e980fc7cb6b3d9834f112a441275b2c0b55fb15132023c681fda7e68dbc", - "34783bbf268d4414c63be35dc04279e4fc2e3b926eb0d562de767f6ccdddce2c", - "3bd992b391190e52bce1bc347e2b9bcbdb620ac6db3ee2d906a5612c3505b316", - "4692ac1f689ab4f9dc21d87b8679f168ce09d5f1ad124b6fbd06caa3d8665e27", - "a708b4ef25c18f49e82a4cd758625dd2fef8d1ea5e53f5b8d0117b8f7e56f1b2", - "6b371b865a1378a79bbc0d446756b26e04c40439b4a2a9e72df2f38ecf656fcd", - "e541091753b49643a037d1d438927f16d7ba6874d5eab5d541e79cd44aa8c078", - "6e32204dd219a748bebb1fdeec499ca9806719700a1bdd2914e99db4f9b5ce2c", - "465e7f3cdb93ae24966f71abaf01bc0f3c1fec4c356c25481190398bf2ff6344", - "24701327764dad0b310ddd1a847962ea798bbff1093ef4bbfca89e8c3a5730da", - "15aea769b252482d8fa80a5d9aaa67f5a62d3cf01ad170a925ea3840cf54da5c", - "2c182de499865573d234bc05a6ac9e387d06128e3a5548f70417090b347699b5", - "51a68c306522382e9c82675d644ca766230fcd41c39e429ef7a84c8f78b160d2", - "ceffc9542670f3ed4f64d3f7538a8b98296a37c10e3f8c5206da8021a975933c", - "6bb3920cb6abf024fc6c707b81c6edc95180a2d23bafdf2cc1544b3b12f236fe", - "306438abccea6bdcf9a4863232fddceb280ff624496a40824e72eaa2217aa337", - "0fd2c2d9f0affadfcc36ad15e4940482bc5ae9b882ffc07bbc45b0dc8f889d39", - "95d13cf7ca2b718876ae65d278d3e37424f2b46113c1b32833f454a17e6602eb", - "bebb7833a2b5cf2ab752fb943340248b376b7cc1864e6725e6fa6faba96177e4", - "20fcda740b888c0a8ba5df5baec1e258b29de320b888422d38e8c4104257d62c", - "d065720e346ace19239148ce90bfbc57da912e88cef31d3673879d7b2f328302", - "1fc948ea6c332020cb74503a993f4ee98a0525ce86ea96bdf8779834ed4307d7", - "58bd9be86a9df6b433285b0cbe30f0b7037cda44a65ca2af4f57bb2610bbf61a", - "d6e38fcae553e29b78660f364e1985ddbc6fcd5b5d230b62970853751215f713", - "8fe9d7b5eccbc1ff0e5d71df302b576bc0ad6455630f0f24de3e35a811c30571", - "821e7fb11b6cc62c40617a3918a6b2564ca7ea53198b288d7200d47c5f88b78a", - "00ef1afcbab52258c5e81ac3891d1ef79edabe10698e8a4138c50a193542befc", - "8bcbd5d0447d4975e0c31c2618cf7d69a773c6e3c19154ab4c71373bcb267d76", - "0a7114eaf0c144a8dad48bfc5ba98618633168d51eaed07e9dd33b2dfb961ba3", - "11dd90fa4208fee5f8503814d65fc1035c48a7747c9b9bfc583db197af9884eb", - "e3474e054d14a77d7188ca7d0358a41486edcf878dfbd4e4fc0b3f4b3c7707d7", - "0e04014f77d87022238e2c9c7b69943a6803ce2463b41b6ef6c2bf85b549731e", - "bd5e8c0f0cb974eb010660f717d41e4b79a1c7a8a50b5c43fd5568d18c1cd0e6", - "141467b9a8c2874eafa412928daa38d4ca23b96999948f37c822f211827b68c8", - "f3e4d16de43774ed720ad3ad6395d6c8bb36543ae4811c27e8801ffc582e1c07", - "7a75499c62d0cfe299be1e479310dee3e632c7d91f31ed1a5c6ca62051d8a89f", - "a49e973df7905cb8d49a8edf0c8ea7e54ef436705cc880565a7199f7026bf6a2", - "ff9b5285320ad4a5333d22bafdb74f5b9fac112111b2de5fa16bec3f59f0ff87", - "1078170f70f9a4bcd17650d0e587bc9da67a75629074ffaea4ae66ea55f0279e", - "9fb78217e8b7b95a2233b76701bcc39a861d84f5bb688b9f1f204a4eaa72d064", - "d2edb98b45dd60b2cabc52c3134cf92a16d91124cdda0104a0fc1208e92e65b9", - "63d36a0bbfee542fcf81ebd4cc68068c4ec844eb6bb475fbd2d80a61d1b56a6e", - "4182289a3a81729c411ac1c88bb8149638f6ae699d99f00f4866c716f12e06d7", - "4de6b49b31505af9620f43af611af04b49fd66743be20a5a3cccc26d858d3e54", - "980a83fd54f2c3d5a48479dba8180d72fd2d6a5a488e7ff1a5fa2bffa19405b3", - "021ef211cb9e095f28937a3e39bfefe981af860e48d5b0083409b3574ebba105", - "0681b14500b280502cae38d33292f05cb3b824460c779e660a373067308f7c53", - "d470b44f55e37cc7bd15b5bb4aa9b043d8c01c0f85289ffc693469fb646d307d", - "11ef8babd31cc2b26e8169dd2c9db2c68a63d2e7a3bb31b057b938b5acaf1b0f", - "a04c00fb065ba742d1b33183f7fda6a391ccf71620669913b99c55acf7546b6c", - "ca47557ee6d397d9a4835c89ab264c77bafe184b6060f328401add153080f50d", - "d703ad3c57f2aafd2b3e9f2420da30c6b19c797a4153f380c134f60ddbd4ffda", - "544012f595456a8bab1490db54293d3d054b5b4b786f607337432309cc064b31", - "137e47a878e5747fdfa771a0eac98e917c93aed61c5252109155d214a036911b", - "c6385eab445f1073003b219cce41bca4910b9bf7948e911212ecaaa7b4f5d9fb", - "c4cbea1dbb1a6ce7c2e45433c99d75b17299791b43ff50da28f45226e6e146b3", - "6c9ef948b33ea4f1054c565a0574f4e3bec3c16868b0e049f984c7d6f5673df3", - "ed9508180c74362da0faa6f614ed82489813a276dd0a4393b02eee34d8f62166", - "a51e853c5f021657bcf912262de9fbc90ed8ab7649555bc358b6da805c7dab33", - "aa6e761729886e5db4e8f45cd3eb6fab061cf3c4482528d1a297f54002788202", - "1f1d5706bc2873736b04a285af9f042a6aa18a664f724c9b3069f9e6198b7f6a", - "3aeb068b2a90febfb9a61d36b2cda8ede3c35fb8b09e6c355434efe262025c7a", - "1e63dde0807968095c0afbdf602755d203a36c7a0057abf47e9fae114367cc2b", - "15d5e05ee3b87cfcdb4fc6c164e28b9f661dddc758dc24696244c1b297b2910f", - "d51ab118ede57231444e58788f2e8ffbfb0978579515e64e17357000c91e81b8", - "d753da3402b6306fbdc4064347a49eb5dacacfa15bd4e0454097186e317595ad", - "b43b4e608bf5a40cf0a8536018731cc5838adc46114132a6cccc75feb809e879", - "a6aad54efd3ba998ddee0c9a99ae05c7ab519602d828592834ab0fe362c8b1fc", - "ae249d98aae1f56288cba2ba365f16dc33a7aa105ce97cf1ab605e904df41a3b", - "ee7cd7070c97b01c2544601a5027cc626ef52d0b0f6c3a75aef104f81ce48eed", - "52978f441dc5db7d4d0902a5ba4c70c8365b4db2ff7daf111b8f4d5d75587d99", - "ba26f0697b9ef1626de50da330ed27812a06655d35085232f3a605387f3335ca", - "e074e8de3115a2a568b0d274055ce3e86ea82bf218bfc2cdb63d1b3d600962b1", - "38da1de8c7f3b529c1c6c205fa9c7d0c781510063cbfd1c279b607ab20351f84", - "9ebd0c872e296cc8f3be93cb23d745a2d65dd5420f45a944845a987cf9fbfb70", - "d7c0b6a305092d172ff9128d4972131f9c26aa4d83ffd14ddd3e8fa680dd18f1", - "bf1dcf022548e6b4c35f0020803373f072260dbf8c00f69cb3a838284ba00f47", - "5c693fdf7667815e779c85457870ae956559c5ac36ae13facada90196e0b0ab0", - "10cd8eb30c1ffe7aa39bbf8019ac14c59b93b3c39e274ec8c4986c90265c918f", - "0a4ca7e2ffa671b4eb68ff2d7d2ef5cea1f50049ca43d20d9afa0e1432b9e3a6", - "d0d6474b065a6a12471357c17bc9a296a0b12bb208246524242672b02d531367", - "6d6d286fa28b9b6e474eb79f8f9f63f4721ad4867aed1e835989e1e74ecd3a5d", - "a814f3dbe0153c22a12fdd6ffbfb4a58e4c7ac52b08283f1dd20b58911b287d9", - "7f51d1d49fe99dd0dfdad57a4d8a2a9840994f2cfac27b3ce81aa93a974dd988", - "3931b54ad0781f0a3a2253912a6575d4e72e5829d15e79a55322e82eac556878", - "518679196c8c8cb8566030b64e7a28db6a3f0e99f1d671829f1432738a4820d3", - "fc0a50dd75165da00db34761f54425faf2ba20b5c084ad94a7f24c3d991ca0b3", - "d5cc7fdcb45e3e00c6390ddee96e1db0d147eeaff47cda7aaf7ba6cace32f059", - "1e10661af25046dc3af6fb6bff3e2ae3a44792b5d87b8fd2bb3d8220514943a9", - "2289ae93e2a7e138c24ee13020475c0e71a691447cc2bf0f584c972b637dde8c", - "4c9b3e3e98f61402da276be98c4c620ed506d52a9d12b04b482a35d241d8fba8", - "b6598aef0cdfb3a19cff8c981b6bee18b35fd7142c9bde065f052423f508d52c", - "70107466a08d4c4b09cc6a17a7356c7f8e79157575ae4e9c28aac42bced61f42", - "c38c9f413e37f3d930c830968a966ee4e0a668c98bf34644fdbdf57ff7d91475", - "c87be09d4e0183d83d0a5ebb7fb1b5c071d8b6c40cf4925f933314ac2580a3fb", - "af609ce44421beb212821c0893ef73aef819fa5d1a5ca4b2d6c4d7fc308cfe89", - "0965b0639d232c274e6ff3d9833fb3b046fa3aa09512ce312930358fb48b47b2", - "69614d8b9765c09afaf2e06c6288b2bedb474415caa17ee6f030b77b8503d9a1", - "d1e523e8a370b5116d12f6658deeadb3a97791676816c18f7904c0c1d1bc3d21", - "a62b9474ab06c811b8f57ab61cbe3779d212de07ce950fba5165367a519a9fdc", - "23ef97a49af67a8991474598fb5ef6fa628648c8e9e1daedc84936b68960838e", - "a04cfe99a4b1171f93f624706e645bbec3ffaa441f2111ccdd099aadcb948582", - "5e8c512e27b99932a42db02467b20d0fee2d71f39427ba0424ae4d120a1d4391", - "a11f1c71b9f9b9984a89f9ec7727627c7b935f73f545ed4650f22bcdd25f0634", - "b242213294d7112eab36006cf1a37eb0a23d2196697213a6423c044d1dddd672", - "3ef456e2cc82f3c254c7452e0adbc79ec9c5422ca2600e13db243858044bf65d", - "82aaac835dadb98b442ab057b1eb6bcfad122c527508b9f000766b3b2daefa4b", - "19bb5ff66f5d5588e5aa5a59b91339261367990ceedf4b52098a2a9ea679bf3e", - "4b823cb1a17c0d8e2036190e8b66de81575fc3cf1194a460c129ca54b98a3ee5", - "11331dcbbc93b3203a0775609fc59e27fa94bd142b300c4ab12cb8d33bc4b995", - "4232e50e782bda28d584c3a142d591af547d5230d1e30cbae60ca1b9d8129793", - "388844314f55f713446e946b9991af3f3d2e65f19971fb5530fbfb14fba22254", - "e74e65222207091b2e3bc8f77528dc65337944392c57dbe7b95ab56ac1ccff0e", - "8aebf2daea30f887d580b6ec97d209d499e0cff95a1438f9e14c8ce26feaae04", - "1d8bb89ef02a52b35a89714a6988b2d8fb9af198e2561c15f8b6535f810fcec2", - "b32d435683952c97a4b3186ca4399a2c8290e1cae64b01e6b064a0b1700aa9c6", - "f598fa14f8b3fc6217fdc640c4646638568ff701f223ff3810967f24298dc6d9", - "3592f860b86a9953911b4409c7ecf7985356012891e3086027adfe5e24e95fe6", - "7cfbaab7c57477d9fa569fd1ca6cf9fc77c15d022dab45b64c7c333d04e2620d", - "1472d9910da627c7cd090f36204b1c314dd9206d311d43f1bc0cdf34d3a62435", - "2049bb9a50f5e25c5495a8cad4277756d37769777b8d44c912384da473579aa8", - "1d74ada81f2476cff4152d1798d12dc8433deba581c421265b24595d5678ec49", - "368e387e77c3044d320c4ea8d50d14aafbfc3716dadae611b847c2e997ef4a8e", - "67d88fe7001ddb0485107eb1bb443b0dd4066013a18d4f1aba30f5ba0135921d", - "494185eb0f759d54b6cc9ccb6e34a2a18d118f459022d2f40298092ce4086146", - "cfefa4580cc7504719b82d1cb0c49b337b1b7f8d3ee7d9e7485edfc3b9aaddcb", - "12eacb78f2433796944dc6eb6b075627c22d5a9390eb2ace7741b26eb541aaf0", - "5aa90c3a27482a08f89fa18e57e369ca57acab3b4fcd50ad1fd8953727481888", - "4d8b36cda6026162fadd1bd449015cc2c02f08626581521eac6617d5762cd5fb", - "018d34f6d3ff66965819bae8507dd29703cb783fe30dd82a5d104101e7738074", - "3835729528363c95146cf269cd7ffda8dbb74b0de7cb07e8cf374d326281b963", - "bead707e224279f1376dae6eb706a7a95c96dfcdbcc1d7ae7cfaa4ce4787aa56", - "6ed6b26a0bc2efe6e7183e0c9abd2e3f74417995c2e112ccfb49ddfc8b80d852", - "92450ef08afd0af792091274b083c108ca0eb1cbd9bc75392800f7cf3cd411e5", - "f1f3188fd63197e0e7f880578e9365cf085bbe51a16e0cefe958144d72236205", - "d9983ffe6b51f82783ede97d61a857558dc940968ce61501c18a52abe870a030", - "5eec684ca4f81cc2f998fac337eaede30036c26349068003dbe0c9634859d9ab", - "baea93ff842715a0f4c9ca1641212ded660c137efbf416e0bd0be5835b0e8377", - "312ca43695eb4ee6498e6eeeb121b3c0392b82ac2dbad59111e9a3cef3a1753b", - "1f4eba8968c4b26ab0207cd1eccf6b60c7abc35879ee829df384e4bb2e0ed398", - "a3291483df920812fc9e5e294cf344f1da9a1937b90bdfbfacfff3a0cd5c502e", - "05b453fb94a0d793c19397256deeebd367ce5336a9affeefacb80e514300c592", - "ad25bf139af16de3b274ec77d315e13fb5c4039de092bf030d9240a419c510ce", - "fca9daf9419c2556812f8293762e1a5d3962dad3214abfe6b29b9dc2f978fb35", - "47a3af35a62b52fbdb83a7d190366a5b4a308feb8eb2fb8428283c07a4ef568d", - "c2e6bc6bd524dd192c02e4b3ad04125dc7b0b44a1ecd9e3a0bc89556e039095f", - "719ac1afce74ea50cc8c920805228b0ab1764fa2cd8256d4ac93fd34c8abb5b5", - "291ac0e5fe83422de488195dee8687536e1fdde72a9296abbdf3f5a8143d00f1", - "a3d43e2a2a6c99d47bfb2ced6b05cb5a43930e98e95af55a4cb4b47aaf128b48", - "9c99d2651d491b137385e3ec8ec1a729fefbe878714a915d572682baa8170d4b", - "943c99f8b2f4ab0c463aad6941076753e9df132deeb5eec5dd652333b4c3a6ab", - "cdc0784ca5d6a1e7c6d8776428d53ea4f5c50dc0a4e6fe73491e246a14661cd3", - "3736c966db640756a7641801a0a9227d475bc5c273b0969fbcc288b64eb2e097", - "7d67e8d117687668cde9c469cc42e7d4dc3e9fda26e1316ca92b7471f97853c0", - "c22ed24e76debfafe86d72a1b2c47f305e2d5731747c5244d7c29391a055a46a", - "1c33e89071be6e4d1da9d94d4e1658ad975fe7fa560202446d2908a74e99fe12", - "47e18dbe302b827931a620b60e87ff782759c50e25eac0005edf88136b8f362e", - "8ee66cf0506871d3442fc9960742a14bd1976face9b7538abccf3cebf44e8bdd", - "65ba33c1924354b668c3bdaa856eb21a63d715496dc6bc5ca0b922ac4fbd7322", - "34e3c9317ea3920b747ad641ef0eb4a9773a18f78125486a1c3e3df05cc4c460", - "08c1ee630dc5e5f20f68b729c61c948ee1997acb3f558c88cbaf4c5a602db1f2", - "fe7184c2817eec37d199b145181edd00738aff2c9e666938dddd54ea88fb85de", - "84de66bbc32e00e92eba279289188a6915b155ad9d44716ae89ccd248f1cd468", - "e3fc902d68e387737e774385e476697532fb8a3e2184ce999772329cf31f30a6", - "366761b67fb6e5aa510768898f0a4bf38b9499dd8a490a5b65b51034fc948604", - "e0324309d3b1ac773bf6b73e3ddc003d3637a399a4a3b6ad7ab8f375e6e93bc9", - "8c309be9c62cd52b8955e1bc56ab3057ff4fd8329618c0ea97a152bcef7d48de", - "66a4b19a5c6b6a718db1e563bcc9c2509ce553eac655fc18c99ee415dc7d1dbb", - "5919b82bd143e8fae91a9f200ceb3bb22bda233e1e014f61c803472bc8f8b781", - "0637ec8d6ac995a1014d4d0056965c0fb52eca91886c2912f2e88382c525a186", - "faf442888414a833a261c671f7eff4d0390733574c0396d2d5fc7c362125b713", - "e3aa43a0b2eecb27a62074371e07f15b5d09d71181bd3d4ad0ea8caa02368166", - "38f70ce3b86fca3864a2d3cec0987d122ea336005fbefe0d3497d09e2827e012", - "a855d9bc9da8582a0ae22be6e26f0607ed0e4349d13460bb7c24e20bc538b7c2", - "bcfc9d8736bcee9ed0f83de1ece10b84a59b97cd059e389106c97db5b2bfb6a7", - "c07d905c9a4002d0853fd7bf3de800330f6ff4b3db5d4658fc33f4c85edbcb04", - "8ddd227cb5e9c2418d994182f40b9b3f329b9bbafb9358feae39bd52ede1c78b", - "c74d92c6ecbfda4450c0ba0353e0d4ee4c546bdb5037176360f5abe3209fdc28", - "78362a5c84008cd271e93b8999695ff794a60ee30d1486d6b11842f1b09c8a8a", - "b6eef1a46ab42a317590fade320f4afda6f06eaa36035e6b2b6c1e633a1bad00", - "7e4bf32d514cd3695fa168ac29663752cb51a0bcea0106f64e868773cad1f53f", - "ed28c6adc44d0244068dc3a2386cc8cb3d98e3f0b55779f47d47b1cea9a46394", - "a2f88ef4f957ff0800f4d1ccefd0d1c76dfb8e17e84641bd4bcabe890d154de8", - "65e5124690d618169d51ce9d54ce65996b225e2deea01c5fa6afcc3368b1c132", - "e212733716ff6540db5751fb1b47173c7aa4cd20343bebb6291cf1384ebb9788", - "00c96eb202f534f939b51bbab44b35bb7fb415c25a03e6895e235052feaa01ba", - "64516373e120d508d4d29ca2fa5964a9e940bfc12e2b3e0e36df5dbb12f61243", - "7d6f529580508c58c6ede067a3bbc53f00cd8f5eb736fdc4d06050b23740880e", - "c04d167d6f8658eccfeb5b0ee3ec3f4e1ab683d9d7a0159e460ffd91c0162eac", - "3a40ce382bc40453389f232c10b4debc6e2ffb603e93c7c215093b86badd27f9", - "1a07c550b66f936406bfa21f7b96c2be6cc406d1a0825290087b6c0279795508", - "8ab4e2935e1ea102a8d07e22d617975a22e319ad2444f0cf1d900cdc97d71b5f", - "5e313b6c3929960d6c1257a94abdde49681a66556f1537ca933a7f9ca7b63667", - "ade8975bc6ba58be91134ddbe1c8cffdd600c1c69189393f91883cacfeaed035", - "7702ed718c2945b3845a83f41630ac682f7e91a9bb9478946b0dcc8b767c7384", - "5db25e57678ec185c62ecdfb49c1d3186c3bad213f1edd6363a7b4699ef02c6c", - "cd515a973ec502d0beb7b1d8454b9f0e661512caac71408dd930d174cccaab0f", - "658191cd1b968bd6f29313cd94b163150ef56132809381b56afb6aa944e154c6", - "5e972a416907f4b3cc4acd414f5cdb750e943838fb44c98bbad22e7296a66cb4", - "44b6847e1bba48cfc021d8e6cf7ca6c62c241a555401491d000f36b65410767e", - "40e325558829c2abc3a6c3f580ae74a1ffcc88c573aff48e2a183331101369af", - "689a684ad9521613d7f402e4d1788d10e42fac3ff58f1bc7ae2bcc29288fd4c9", - "0af3cd921ec62791111e06aee1aa87f58a7f0a91ea54ab10be65ab10c5932e1e", - "4b269c98714ad822e8e4969083c8ea86a2bf3efcb4c3b6f9d598c729e533b72d", - "daf4a3681114c9c7a02b87667bf6b4eb6a17f16fba86b747729444c7386813c7", - "60c41ecd4d51746abefeeaee1b380cb9de4d3bd04ba429ac7187b156f6399da4", - "0070bbbea03eb45ca07f652e287f4c70bd9e77d8d1a8a9dc62bf6473a9e7edc9", - "06365b7a457dd176b3281950ba9e983071bee5eae0d398dba75b8c16b97c1fc8", - "6e32b152efad171b6cf67f0209d7561eadf46c6ea83a36c056aed97bb425e82b", - "4c4e6d72eaeae38a6dd26d45e695cf7b102c95413f95b5d5fec04f339b37ffcb", - "f92cb1c81d00e23c83ad7d5ea7d082aa5efc9672f5844f11e390d0f8db30a960", - "998d620adeec47249203dfbb9ca427bab1fec00f54e7fa21fa024c2f5d76a4a6", - "a3ec7e6e2f944520ff94f6dedd6bc81e7dd7bedb8f2438b260275070b8503e08", - "2fdef559821acbf39e2a77520a4db64185a9c673000e7c18fbdcaaf6b696abc9", - "ee11d30e9fde51a2931918f920b520bf9837d8456856b9c883bda3adf6632a76", - "59855a3d97a4d1a621f47129fb226079275f3768463a8d16bbcb5c34ae36ca36", - "505bd641faee5379499924f6125bb00aff47470dfcb8de6c4fb6fbba292df5e2", - "72c13853e7adffb04bf4614fdf30d885325cdb588ce9329fa23e893a2f8d7937", - "7bd245ef3644d719da3a77a0612856971a03eb0d5fcf571700103c1d00286095", - "c8f47d3a45995c7076125e142fb53c56c99b7a683a2a8f922b00c857aaed37fd", - "f5d4bc2551b6d9c88d05d452f3c6e7755482d6813f9f1348029a83cf291995fb", - "3b4a2cb6fb353543dafd480645d2e4058e71bba6896653cacd655d34208e6ee2", - "3f745b1d78a6f674a04e922aaa48f2faa86cc698ba59098f54a6a99a21ca8a96", - "f4f2998575c947c5e9ff19165260c72ce727432e910df0e759860357134539d7", - "71d5ecd03a6d1d15de91b943bfe3d647edcc9d431dd4b584bd9d8b0699eddb6f", - "c58f8b921be507241be6060aaf4ab3c9a25d846e4d59b02912187daf45041a0a", - "ef5153b5e3639de4d222a03cb55fea951f8fc89797bb8f05c015ce7738fb9808", - "b3f711944b5dac4873e62f6eb70ed4fa0612dc0ae6df485bad9cb6c2eb1811a0", - "9c115eb415c28da6b5e424b194cfb4b4ead82f50f7634790486d5ad58230b987", - "58688e70a0c3d499afb081439e5d1afeec2918aba5e3ba346a0e439a74c0fff2", - "eed8cfb42249de2cf87e0f3dc51ad527dea2b06543a50260fe2662ad5d302524", - "28983b7e3f41341a8a6642f5bb88abc0d8960d3af2aaefb63237a3134a1006a7", - "1325fcb7541ec2f830b5ecded283bfb1058c070d5a8b055698e9faf1107883b8", - "6ed626e223e6038d3a98e4206ca0e88fd193ae449793d3c7e40ee95fa933b035", - "a0ab899788e0987977bbfe163d677a9dd5c2854e9855de5eae1a282a5d66b4f1", - "4789085d2889b65e21f61a9028c78e8db6c9d719d5635ffd8b73e12734b6891a", - "36da306a3ed87a87968dca3184e43731a1c8d3a92a07f1843ff9ad6c5fb01b18", - "8209c1410d8df4e245f846c8390b904b06d72755625adb888be18864b144c9c4", - "de641d6521e3b3e39a42c08edd1628e1dff86e76c3954c91a08b15a37e097d14", - "3cdee2caa950bd95a71e4b9f4f1b5f40f752fbda3afe287d951ea4c79c9c66b2", - "09c7d93cdd190c3821c54b0e2711c4aefcdbc175034642ec3be8d02769407870", - "15e57fb63fa7e86328eb65d46165f5c883cbd95221ee3dd1e781cc8d680e601c", - "980c2a579ef69ed5eb73a361bb863ee158840786e3973a54f8b56c8c90df16ff", - "f3477be0bd95bf462241c4adbda41f115a6ddc70e7724d10a0d5a78efc8fe0a3", - "6607b101f5c779271e514a861fe8fa9adc3883768c7e1e778ee9f5d304088f70", - "11151a610f97e3cba1b51862deeb139f3bc221764e8e0b291178e6db7315985f", - "2b03c9750ccc2c2428c288d1e6e9fbf6782f15c5b0495e648553939ef499bbbe", - "1d6191af80afd1dfb23317cf02c270dfbfce9c6425f7073b8459f72206944b95", - "ae57d7066182dc0c0f64bb74b092bcf39b71e71aa9c8d8bacc16df48ee24654a", - "1c92b71c9e390ce26f81e481d2575a6b7498adc030335c94a977cfbe8fbb2955", - "41d554ae565af484536907cf6d7427b2e850590f04499a98d5e96b633dfad571", - "13ea11614085fa4fbba1f434ee500d0cdee52d1078817c84b2f115b5c6c29617", - "dc131763e87dd72a4289ceefc39f2af16f2535603015604b5b9287190fd56cd6", - "4a97e9dec1159a1ed465c7593bb146607ab82415b86c324e0ac6cc1ddc56c32f", - "fe6ccac6940cec905254dc8450b863147ced3cd2b6383660ca77f7e494ecb94e", - "747409d19e316f4f684bde1c7e352249fd36cb4cef3791879b8b231653b7ba42", - "5b0a337911c3bdd0c06166f0476ebaa94733f212dfa74c0f8305c430fda0af5b", - "4b46bd2b692a4d73d76e62851c9f30ca18c47fcba6c57e0cf6d613a1d5797033", - "e19e25af2c9c8049475d35d65c6e662a423cc9f4c6927b24e9a025e751440e98", - "767a64b254c8e2caa814371fbe1a81a36425ce15f0ffc6447f0a54d4d4f0711f", - "8919aac6afb8804fd91893e8aa45f462adc023db977afd2e5a94eed0fdd9791e", - "66a249bee6119231e1c8421b7be710e69fed99ed41a8a69a9c67a23014cf8289", - "50ada3d855b1bfa53411eac9a246c674a515aedc338331367ac1bed79a55492b", - "20061376c68425596f1d884b83b29dcad5f529518e1b9633a46822c21cbbe266", - "d507e222b3986a523dc17250ef4f01b3029729a25544be5a17e78599d60664cd", - "f32af93d879f56703b7395ec426e8ac95075cfe0972a0f0c42de4b2d014826cd", - "3e113587fad23021a5d9566e19127b67269778c29834a498d4eacd7d0732763a", - "2df2bb1291eadbff4842ec8955f252c67db93c4994784c2af68d2cd5a1b4b5cf", - "6fe0c05fb36c202ebf6507d35f2413a081ab9e0c1383ca77bba62d0ff87a3a81", - "e58cc1dc991d4903acc643c3930f1803c7a5c9c1a8331297362696069dafdab0", - "52fe98efe90f43a9c5fdb78481c3607cbc9cae1cfdd48752ea7f624612e7e289", - "640e30d46e33b669f3b3cececdc6a378212cf8f3326b81befb27c09f75d571c2", - "948089bb8e4b00bbf2cbf3d68ce48b9aee3a68d0986b9f2b225b959dc283a26a", - "b18c76e78f8cb8dc3b1f461d44f458a393022a7cb53f84b2b49f41385945e2f2", - "5c6e673eabed5f788beb360bab3715aeb164f52ea39b9456e88a8b0e2dc854c7", - "dc3068c338ccc4d4008500ef3bccad438085438619009fc7c62ad60d6edad799", - "ad26a1e340b00c2ce19ed6a3afcc11101a81bd27dc1af23485d2df31f45a9435", - "f3783b0b9c59cc566a5df9ae5acb872aebaafa014bab96307d051bf6fc35c37f", - "0eb675e56354dbf0e7e0ea881f952ee4e01a346733f548a90173be129a6c8c56", - "e22e9f43e9b6109dceacc0eb3dab5fe4a368b06758d29f19c7211ff0f59a6b13", - "09b09da758af8afcf96deb2bc34cac670bc36365e7bc40937a903a95667da371", - "94e429d54a53c49518b6a46407347fa711becd98abdf2baae3cfcb5fa1af181c", - "b0b2843d643d8c9697994a4742e6df25c6eed28aa6beaa7f50debe292bc75d8d", - "f589a9ae3ff8d644e5c3a7439db4ef9736a6c0eddd372c6fa3e9ed164512805a", - "12220b2c8af07a9b92226a38c60617d55190d0fd4c63c705dd48c2327669aa40", - "1174e38e963d59e05ad68038e9cee939e09ea8e3380a4e931a5888e3da95af24", - "47b7674dc69379b3ebb214bdc04170d9d26d9ac773fab3c211ec310c9ded1b90", - "a45b0a48165e610c20d2d9452877c45b55a24ba96d35ef3bc402b262442dc87a", - "d2c0c196a830ef696f3c7bf21f18acb342e4f4a5f4c76582785e5a7143b4f71c", - "8cb937af90e36a26ae5905fbbe654e549b10bbe318dcc8a9e7c9882b4f670c07", - "28fe77672540d296bece66adf2c67e5b6014e562f81f5e7fb9ef195549490e3e", - "02226a6a417126256f28cba9bb8913beca2d5d810ccb4c338131c319fde57b7d", - "c36f282b937c1d43d91d628e369dfdc7f8b41e8d291556aa04adc2f29cd6c38b", - "1e8af60d81afaf0f7f2d8d679949703e168eb311f5442e659f38c3247469c445", - "981f72b549c46f8fc757a2c12056f304ebbb2e6034edc41aeba024b099ab9b88", - "cd04ce1031514b9fb24532a2294f7de549dc6b073994894f0ebc01fea5dc556d", - "45b13d5bf4e8735f00dbdf6e3cc50d0fc5a96e93787a5790aa590620d001a46e", - "c7a1ada3901ab90bb63a4fa00997c09b06737511000cc0a5784ea82b09ef7103", - "b948403f0e320ec31fbbc2dd6184518562c202b9659fcdeb503cf539489406c1", - "989000b056489f6cf964fa584b115deab83836f73a49049ae2d081a6e4c7d144", - "42920257920945dc72b97edce1a2758f57ff2db6fa6c6cc9a49a2defa64c7c3f", - "f7b2fb8b84db26878604ca53837d5e05aa266843068b9c42820d731c708298ed", - "09fb15fb1f300a5fba8aca043d8d78affe757fcfd246e6e4ef245a9b56b7fe6b", - "70e988513a40676bd2ea0cc14ab6af269d8d15d4cea7981f780c9f49222d2fde", - "166e0d9aad08e0864e74a4b6d149492f5c3c4ed2f4f37b7d4fa6bf3311c268a6", - "cf37ff760d5ac97dd5289242dd42df3bcb754fccc552a131c803f19b0a1a6b9e", - "64211a055378ff1ffb2360f7d24f3bc051609c77111bcef2cb2023c9b48e64ce", - "f55d71be4361ef41de19480c56b79e48c8c41889e487a30ab3115714d78aefb3", - "9d7fb29715564d630f26313051ab09909a78613843431d403d7a5606a98d507f", - "39d0affd81bd8ef19e73b6e96db4c19887fbabc8bd80039d723b57c6c01db086", - "202bbcb9fe497225e619d7b90d395510e394864308a49f218984a57a30875f03", - "641cc4e455c8cd6883f8c8833892c426df5c480edccff630988d5e9b81b130b6", - "9ab52ad5487e2d298ba7bbf27ef6eaf97ffd3193622997f665d806f2d9aa46c3", - "f44f7e27fea01f7189fd7f3cd1605ae46b79e1f1d260fff08319bf1a2f295b4a", - "e6fec4c91892a81b4ec9fc897dbf87a7618813e2c1e0d088704541e00718607f", - "522e417e87a20deb2da307e1e135e508b30f73f706729120bbb3f6bb7e5d5c31", - "67338a674263a780bd686461b7ea90d9aeb03f9bc1f81fc53ca78c6834a63e09", - "93b8731fda8e5dc2e0bf08b0315d6366c3aa0509af456ec4f39140d9211759df", - "b1b536083322817272d002ed2bdb20b9c59770d8fdd4726f1f78f1b911d4a370", - "aa479c1e5404131fbfd0160a829f4ad224eebcbdac54db8aefb639c6513309ef", - "fe26a177ea5d36bbe6b68069cb06f67f713e1f3f2197af5636ab28f855195be3", - "b30c9adfbd293c65a4ad2a555ab51b495abb6471a87a610df2de4f0b4a67e5e2", - "e7c0ec6ae3781ea49640049ef64cff1edd14648f8757b75538a55f8a59394043", - "e3c49dd57bd0e3a0f0e54a46eee7a08fc4cab3aee12f481ce54edb60d23f5f59", - "60d725e01fd2d74b6e7daf4e1f327b60ca951bf232a4da59209839796c8096bd", - "f997345015913510e93c9b7d8adb2723d7123da2d458c46ae9e1585c808b962f", - "6a93ac1415a866320eeff0436056ce3680a6a81c18125a23e7fa06b00f94f2e2", - "49dec037f81e28f4ac5adbc18d2fbec2be2b3b7d374cd3c2cc9afd54ed3852d6", - "6c5dd3719fd872f5d68fb75fd3c13503e21f010f166e3875f49f2c95d5fcfe58", - "a62aa7e60125c2346df2ed92a7289126260af1133e6b9406568399a2627ef05e", - "99dc1dfeef95327eab82b3c9d3ceecb6289ac5dace747ee28e5e3502b01e5d83", - "ed5e0abd501468af519682e31ee7883d636f470027a89468aaab8362c58e140a", - "2782fe19f943b7fae397da7295472876a556656c153b541f3076bc475f1faabb", - "ed726331bfc601a40b7a651b28ab901397d67c07ff978090b4e9130de36965eb", - "663329ef07b1f3962c969ca9acc3fa73e64dfab9c8c2bce1d99fad44cf9fbfa5", - "404c1b5207c4cb3a72f627cd565ce4a23fd8a35db43dfb451999509914eccf3a", - "0d2beea2dd69c4bb8e0e45098864974d98578a2acc1688c887283d6e87b476a6", - "f12c0748c1d3298bf67e7a9cd30cbf1552895a197fcd9113a77ef003014729f0", - "88f14ceb50ccea1baa3ca4e7babc1abfecda8cca350715ab472557f342169f09", - "2e3317ab29b1c72c846fd87e344588ad512782db0eecf4f1bf3c8188214e7d71", - "42af5bb9de1d3b7a15def84ea4065958ea434b2cbcb4e65e784091546efe2b91", - "8679ec450983be1bd82068eb96c8f1a44ad5d5f3afe25a9bce05a7ff374cf51b", - "6484d7982f477d2a72c29b44cf48128d6dc51c17326cf47a790783bf5013ed2d", - "449deb94194b566b8be484661656a1c73cba75e4edf0c89500b1b77706832789", - "9d28480f9b89a700416e7fffa60d1dea221b407df905c7f872e712cd1df45ac3", - "2ee4da3a33bdee25ce462799fccb617b279804ca5cb6a73309d5e4c01647460c", - "94a09a96b4351cb8296697c64f1a2e05a3d5d565ab33829ac555703bfaeab2b0", - "f34b9f8253ffbed33c0579aa20907352bab0e56e266dc8e9dfcf396ca5ca0cfd", - "2703f5b1eb63489717b4f78e48e6fb0e2d7a9c6c5496b2c37f12e5a6b7b30d4a", - "650c65a7eead3ff05fe4d3ca163b457b502cda18d3e1c7c1f729acca596d679c", - "af1cd1f7183586cab196df88e18a67deb477e512e7377f8080056af7f0b71e80", - "9e4fe9b652301629cdf5d1346fa5130ca05a47f11d7f9991f58e8cba4687540b", - "2eb67854b8d6e68fff1857fe499063a3f22dbad2e19fe7582ff1a0c9f95622bd", - "ac355aa0585c5ab734b91b9450ea7e84d5920c12007af9b9268cbc0b8158956e", - "687e70ddd299d42a7db0bb992a9d65e20a77e5fc7c0497bdf7dc6c82d508a82b", - "d2803c2c9249d18466323cc21fdbb39befac1e36ecd48732973cc08ed5b75ce4", - "304624c70e1c29318d8fae0abe20f6ef3bf6467e4c04a356ddce6e8729ad7348", - "6fe99782da6af86463ca04d22078b7e872f8cfd303da4d433897078ff6d0f16f", - "2f10235f546f664194562fcfb0f945424ea58cefb9b24feb8b788d8bfe3a5620", - "909488221a930d75db44da11e42070938ac66fc52038292d093dff49f829475e", - "3486389d968f62ecb12be1d221c8a3deea8bf677f1c5a1c7b425e120027095c5", - "df36feb41cb0873def5cf2e1e65a91ab30d11f806d946e36e972fe35d713fdba", - "da0b205bdd75178e440d3ac5cb5a4deab354f3763854ca277a336b09bb207298", - "5de52e1962627791b6b3377238a652bb34907e5210580c8581dc73c9fd6bcc28", - "4b63cbcea40224275ab205be9fffe15b3558c0d9a7a04eb2299730bb9e61b9b0", - "caf98df443ce43adb0edd102d68e17e57c0b7fa1934a212f69392fe627d9302c", - "01cca4296bb510a081c3930c4c8241b552cb7af805dfd836879a565a332863c8", - "69ad1f9bab681aa4a9e25e2f069d1de16d8afe5dbd8c5003824b0bb91a104d3c", - "4565b218a66d7d30c03589c7ea37d5e592dc0874cb3d12522206117c6079c521", - "8ee481d0a21f5ab9bb9825cc0590423620215a9c8ef5c8a4de75cd04a2bb9a19", - "d3402625e641fb1930e6059fd86f20a9ef343f8c113ef00817536f3cff8a9a7d", - "916ab58ac294e6b9a63051072eb637a0eee55ea41e208c94b95a470ea3ac9cc1", - "b43671fa89d2b7d6d41b52f374be6b21b8d2d2fdc91fe0e82191a21f37d651ac", - "add593ca34bf6c392bec4aa12795660bf9d0ee3aa9f6b313a508589a3312b1a9", - "7f9dba5925217f03a2c79be6b9e3bfc3b533be1fc5f4d2330b68afbe0edc3b8b", - "74a4440e44e502e4db5349dc3cf4d6aad4162456bc5f730291b132aa5ff46242", - "5aa1a4328a8df03eb840ce1917cbe2c1b9f5de6aa7697f568a30ccb417734b2b", - "7a0613b719fe7ec088435d998c726377e2dae69c6de4be55a41493485f5a1c11", - "7d61862f5598653e6dbb08c21050c951ffa747ad86d90463a1057ffa8aaf70a8", - "b2edf7fa4c440f093ae419af9a8388297c97843a8ecd4152290fea70a6268366", - "bec98af6f76e9046acf328c01ab3f2482f5598c5f027d417569e27e9e81cd4fa", - "42926d353ce5bc15d1f717021bd775d7ad95bbdfcd546919f0488c23c0aa2beb", - "c4da517abd1d80473c639109392103ac42e3a4edc5e1a784bd7c22c34b69ef36", - "15d92ebd94d6a66711e8ea16a287478aebc9ec96ab6671e88f820f64c9430c67", - "6f0e14ae19df5d520e921b01cc69bcc502866e37990921339773f69ec8afb974", - "656ae9ccdf995d54092c8fc159f9986d083956c71d151e74ec2ac4c4747c8d53", - "b4765341b27352b7efc6c35b20beadc2a2f4b6a1666d6761d4a82ceb57592c0f", - "f2f1424f5a4ecd341b0b19030f7406b671b8ed23932759f475ff08d668239465", - "cdd484f69da0837a1542ab6e3bfdb7c7fcc38b594c6718f43074221a85d99b95", - "7776189cf730676a82f599db662b9529d3f9997c140d09c32d82f356be955902", - "338c3b9a22e4d43b6920ac5b476a77a757565b9f08aa69ee62644d2c77397911", - "9a40a96d8c1856ace3ead2f8264e8d2ed9a48606c5064c7c03260f44096fbe72", - "7989483546a981b0c8ab31b658af62f609f43b94a15abad55f88b4b7ec402b73", - "ce39701745e82bad2d4cf6e3f694d4b635879682f3208da492579428379898ad", - "6b384c04dfbe2fbb5a27e3212a56c1a73ae061d822dcf141edc3d59eb9fadf78", - "0890f4f89cfd13fbda8f3466097a046d85a329f0320a8b84d709c55c16cab2a4", - "669b407c49e61353330a4ce9b58798433852f582e531899d7c58c45846df40b6", - "d6cb0292a722516d483e14d1f2fde399deecd38df8a3b4b7f5bcc04cba906818", - "6d167945b81288ad099b0267676fdeeddd125ee0f723f453f534d4d4b57a00c7", - "89979e0cc8b42c9191e5375fced23dbfe83a126a05b9d49480861d8cb457673e", - "93d314cc47891ca32dd6dc3d56c6f9f38885c6fa4dea37bcfe56d76e6c319b1f", - "36468e4b22be4874ece5a5c3547f8070c0508d5fcb3b4644473018617becbd25", - "35d6d3a296de36bf8664c7bf921c6eb9db3f6038f68481e133fb9486f75fa0c4", - "0aa6417af489a31a6e8a1968c5988d5bba35ee8b21042fa3ff4b6e56ca7f5b3d", - "8a704ae8c4f35dd9de26369e266295a50023462667b0e31b7cc383245a432f68", - "273ad3f211856917987f8731e54b3fd9658dcfe3184b9995db0491dafea74195", - "612f16c8ddfe0b8d2759a6e8a04e4a31d3a479a83cb5f958cfa0545d25ac4960", - "4c8d6ddaacb29165f516d0dd8d071e5774370a23a9cd6dae377e79269a4ef350", - "667c44ac63a569364ec0d370a91e3ba0a6b7c6632963fb7209d082750af1f598", - "f3ea38a1109dbf315f80a52cd2133395357213c78df3087179d9df6b3eef5116", - "271bd1bce73ed93e7b22823d3ea3c2ca0511166086ed10d5439eb88d599502ff", - "7a41e3136e625e88ec4c66a96b372f46e4f88a4c7916ee3d1eb50454d51b5144", - "4bfabc21134c38c63991b6e1625802b1f20e3e2a96437641b0de3c513a1d231a", - "a95b8430f4112ad9d1db55d0bd6d6d5ef78bbe92b681139cc5aedc3fbaceb619", - "16f8e6e894aaff504f420a9318a148549c4cc91e5de3e22c6c2af8c12bce0e5f", - "1551a9e9a7263cf6b108121284fcec2485108b5ee5d0571cc9bb580bbb96f17f", - "27c2616d5b883239609a1624e29f2302c8b1dd8b31dfb366c3c8cbcf844ea666", - "04ae813287d3d09a4ca8deba18892219cc4bb237fa55d1ebf253caac82e7cde6", - "4e478a510f18cdff2830862668ef5e4088e6d754b45bc8f97aa7cbaf0a3d447f", - "0a9af470dae22d6143c94a3067c115c63d650e963b396e006888a3a747ccf511", - "c116dc9d11fc67afd5222d48655d6551c49184c6d7b327ccbc14166c88eef0e2", - "f6cf8c93b917db16c6372977f3ce7f50ae3bb9176b9e45f904646260f02b28f5", - "1b9acdb44125b3c8b379ff8f33f080605301208646ff9c9a1edd804e9bdcfd53", - "a2df5931fd976fd4a0dde964d77345d156f13d2986880d26ae2d3a12f37eb5b7", - "87fad768636a8c54c0ea293ac4da911ab55ea202695c2c07a3996a7a457dbb60", - "a5cc570dd65d8cd590e7ee5a75037f8ac1b4fe48938983188ac55e0364eeb3e9", - "b48899c5d2b802d4ae58961fac02ff31f425bf819dfd23a68eb0bc216a3c679d", - "e914e160d358c01de841be2cb08b35a202f48395ef2eb880630fd3f5dc350b93", - "03a7182eef51005264559446f776b10e45e1eb002f5eafa9b3c3c7f3ab00e3d0", - "a2fa535c7513062a66bd43417d681d36cec236a78e8b0344710267b452f6e176", - "7818b04a5687f39ed9580e23673ae347bf708506e77bbbadc3c2b54c74834e67", - "0d7f97d9a6108e6a22e58898718643b3ebb484135d3d264a62773a17a164f3e9", - "963d33b6bfca1530ffb8aaf29f1c163cdc939a9112b9decb9fdea3110de9d0e0", - "b620545492f464fc5fcd89dbd68fa1987ad41d45cddc9140f911f5d3f727d768", - "7212a16b64f034cd55a6764d55d58910e56c09356f260464f08c1c585c8b5d94", - "6fcdc7f31bb6769221aef85baf5647f3369074a1d04d20b5793574e783116572", - "766598ebb662999470d4f3b4c16f61b6dbc29dba7bb090f830a0480912d04399", - "c6ee35922d90fdb5e528fdc03a0a907f9d2c075cacc9d21ba31bc2bd31ccce1d", - "36d7a4538d346a1cd67d5493860702811d517926ceac0fa7b00c0799153b5437", - "c8cc1bb4afa6af4be5f7767f3e4b0a91475b6a221b6c04481d77fb27b06c5f4c", - "1176c3f374257250f91b44438ac5242e4a2077af8d02c24ae4604c33e4fe32b8", - "0402bd2dd84438ca2240323be9d7b4bdb2b0d13b8ebc8799dde88892dedb2877", - "b4466be688c7c7e493244248d36724a0872391ebe880d0e070a6d0dae0d6cd0b", - "bb2b37339072cfb9ce6fa459847519c84984a8c892d01aceff1f8b8f85c5a035", - "1a4cac5a6760631b9619cffcc7be14aafae6847ecdd9510b4f8af78f232f2c56", - "508e49c71943a86cb8cdd228672a89099f68b79bcb2fce269528c72fdd0b51b0", - "f8afd658576c1833a3364461c6cf891e9abda7abf08d77617626ff2297cfee97", - "0e073fb9cab4f77e1afb3b88df56bd996f1254aad207e3b679033a647511d7ec", - "8058a5a3023bac828514dfeab16cb60c4c44bab352c976c1db341edbd335b970", - "99a9294140e490543bcc58680288fda5e7762c3100f2616cc76dc80721018eee", - "185ab77a998a24fc72bc90ebd5b9b1065130ff66196682dcf903c90f918dc0de", - "c0a4cbc533d023451a8c9c8a2c3a673574b493ffa3479ec357d3e3f62db98f8e", - "374f625cf2b08dc92c1f436b5d4cf2b9dd062c8cddf808990ad0b1c4c5af7b56", - "faaef86be31c06e9107526f4a7f958fc799715e7429990e9691d3a9fd7989c54", - "dba36b9fb2978b0bcd5608717fc337e7089214dea98b0ad058b67063d447f975", - "2bd8421711d9d635e911b6a6540bb09242e06b734be2216443ce3be864f963f6", - "bc8586368f91e9d7fd35a3ba7925c972dbb4f19c8b3d7e9f85add2ef80d721aa", - "c13fc3caff9110c78cd437fc8c21f5f53e2658e37157aa65feefa86a07d817f9", - "139867ee888881681e91b2073774ff741b499278a893e13be97cb79a80376e5d", - "c81432c208d5e1c3d024e46abebab9331df14e58d9a16e01ec24f939d7e5ba3d", - "3ed4e236bc5b112c3baed0cdafaa0978df6c67272005f33cc7823e3ee97724bc", - "7e184b727ce3ebf97598dc454a6287bc768a55f43c826082006ab6939ba6bdc8", - "7f1ae4185c25e68aee88ad8832a2ebbeccdedaedc845cf42c840c473067ba8a5", - "3704373578d27a8e6c514dfe4bb3354191e2feb176ce617f1cac7a6791e80095", - "fdd4a3133dfe05a78fc6e54a341d7248dd33cd30f38aa3f5a9ca6ae55fc36a98", - "6db9f9a672bdb8b29c0f3faea5347f4d514bf2d8564ffb40957b87e5464e65b6", - "e8a1aa74b46146a64ae8715b7aaa09af2d472024458dba274e4f00586d16b807", - "64047583c981d1d7283aa959c632421e7d26b650b7da4a17a1a31a1af6cbc5f5", - "d1f9258dc7d9ebf618f9f30c7d6421d52d05a949c4f48d0034ff303cfc0eb51b", - "cb28da89b0599a5ae972ced7a7564c2ba0e67112e2a36d5e7718488f9a359543", - "7f47e9028b8182a434179f84b581ee767b4feae7729bed5fe269fd8e99299fca", - "87830cd6a7916ff9041d708ab0514a883b402d5a4e0c0a70404189c9a7fe0955", - "11d0fd3761e452ae14ddfe5fa759020129adc147a7e7a6d6774b8bf9aba389b6", - "cc5c567e944204772a88e0a10dc98088772c9e55316ef0c4ed6e6210fd11018a", - "ead3efc5d563fdc92f550d97049e6a47fe12376dabb8dc5672cb7804b13c7ec1", - "d67aa05cdf4cb2b9e1ec14f15a512849e64df7270f6a35d9fc57d7dd6565b08c", - "6643fb6e79ea6ca6f04a06102c6ab01ec0415cbbb66f17ade1cfb4dbfc36bf93", - "caec17513395f9327357688b848d661b542c6cde2010dae5fa9df9fcdd26269f", - "acd10383c7d37cb68b3e76ed98669c8f8a54c281948b3db65b1eeb6bfc024ea6", - "86f8a1cd53495b4a56b814c38a2f7e22ca78c3075abfc7225b7143278236a993", - "f2de2eae73c6753c4647273a78212f53f71769b3106d79301785326659dd787c", - "1f97bafc02f13cf36df09b5e943db7e3b5086b1aef9fd1c43a4745218d1d3936", - "32ab4ce99f36dcef745dab0ed6df4430827d1d9e8eea7f858619a43b7673c6e9", - "b873e774719becfa99a854346346ac82d0a6edf37e075095fd016860cc2bc66d", - "d7a8784fe7903c6e98679a674e5b41ca20562be2f162327a439e9e6f99171364", - "0ecb8406425b4ad8cd171b992fb3812fc38d220e8bad740136811031f6021b83", - "d8a380aa976003e4b34f024f22f1d05cd8eb834765d1d561d0c132efd7e8ad6c", - "94b0d3902c03007694f597426d55cb09a69676b4e4979ffa3f3e9dbddd9f5757", - "0ff79a7ca9b6f0bec9ed3931c76131e4e9c4cf3f4db94c53f0967df7668bbcc7", - "a833da1a6ebf2cfd8b75b58e4e323d8e6ef7854635fecf7df90187d2ceee5565", - "d6da3007febd31f05819e0f3b0d8a4ec73e0de8d92964a365427629cad2eebb3", - "b99ea445f3c6ab017e0521ffe30e6f7592932583c9b01f58baf2416d9bf59d98", - "11d3fe0280c289a1c1b1c88bb23a696cb23483c29b7dd83267005980554697b4", - "906849a73d9b083e338c747d92fb6bedfd8a25783ed6f8614b0d42b6b4422bc2", - "61b6f9673e32e4922dc56f61a0ba283d5ee2aea879732e605addc75db094fc3a", - "ab145f0c9299bd7299efcfec7a4682e088e6bcb9565d783e2902954c17aeb538", - "5cd098658bc61f12d735edf1bb5c0fe25ceb0224bef3dcd0c898bad948257f75", - "86de2be82223d5517c53cbce76ced40d26dfbfb7df75e1528098fe2340eb858e", - "5c14bb4e9f80d1080b0d36d5e48f609c507c9dff042a16078aa732487f79b86e", - "affa3170cf4d0fdd62ce0267071f6f55e4424b8128df9612d9ea57c99e15782f", - "a7d198708ca0245e0fce67316fc364067bd314212b45349ac23fbba1ac6fc88b", - "9f05ba9b3c8c7ef2cb853c29c49a626460e4b660f3303d2fa58544794c349c9a", - "75074a77224b984ed36c60e71ce61676003271e79c5fb4ac4dc88fd43c7f8b8f", - "63d28bf68d7a75fbbf80f4a492c94a28eb4a3c57b31e1f18c715395c96fb3538", - "7e3bfef120cb6b808c2a8b468a5fad571fc9950e029f22f61a657b43f9b38b5d", - "136e24ba58a43e0fcf04e4dc5daae328ea7dc38916a91cb7f9bf715377906d67", - "8e7cc9eaf85d8888331108937c7b3474919ccfbb81afe5072c8e2cf8eaa902b5", - "c2c871f1f2fb7e272507321b5dc8e3daf95a334eaf07c22523e98162d5f58f98", - "7ace29dae84a3477229bf43c28fa9e5288bd24f38a4e64c37abfef3c46174a64", - "f157d50007ce69c9aaf3f26f527a4551575c0bbc3e7f5c67c595fb967b35fbfe", - "f658ba9b020260cca8c330747e97fcd141f67faffe96ae6b69d5bb356a0f8b0d", - "f31bd94792f16c028dff8ff19b78c83a8945d7d614b1afa0165bcefb0dfc8aec", - "1cd830de637960276111016d83b0a75d51ba6d0786ac81dde7c2efcef68710cb", - "bf49f7f6ece5bf34094580fb3538a69e36987fea8a8865a2afd6febaea897853", - "47cfd81bc1fcf1b539c88585715cb8b4e18aa04dc56bf2fc6f18bcd5abc03a2b", - "47095e231c6c31a9ae3a543e3fc259610cf731083c657a41ccadb1487229b02f", - "70787df02c6a3f71a73d0dff32309ae629af4e1f0e23e2768b2c05d8db4b55a3", - "7fe1d9acfa6c18424e58411e3b3f2dc5ed02b48a0019496e32cb56dd4e55ad5d", - "1c6cb5ead295bc6e3d736d2fcf8cd9658ba3b445a23deffbbc423bbfb899ec67", - "25ce104a16bba8f2dbac0cae2c15478f9df97f1097137ef73d090e1a80b34757", - "1b43a0a2415f1737a54e0de0f167a17e3e3839be8eb695fb28d4ef4e8a4f1160", - "08360a8d68a66aac38271223f89b263852ecaef77553244d4824f1f90e00f937", - "72b9a5a538938903fe47b3c03a3efb08960c3f42da1ec363119269acd60ae3bf", - "a4c7548d8f6a2612343ae90b08c3bbca92f03bbc9a6708e3d371442c5ff8fa93", - "209cac42d8f32948f980124075bd0c32acfc21b9afbfee175e82e145c11728dc", - "5f73f038cf4a76d635295a165a079f7ffaa7158fba813d7d86fd4d462795e1ad", - "c21c240422252b00811233de4d07ad09bc71572349ba606a365f1e82509ddbb0", - "b9848dd6f939ffcaa7c46f3391fc471d98898f55f5b0182127d0a071fb071cbc", - "70329eb9306c9f6efbb1a849f4101208a1914fa1294ee29f4471c11b0b830da4", - "d552a5f335d43d04139a9f38ce2bdfd6fff53c1ecfc91c4b5c9e6552e921744f", - "20175a3dea02c0abfd682597af91f3b3852d85b23ee37dd4fdc80a077a1a9409", - "eab31529dba7eaebf9d013850e1b25133c92fe0fe6c11af686def1730a7a8664", - "a009e052eb08d3fa554ee5d64820a987a6013e14ddf58e99c3ae2ebb733f79ad", - "dc802c3606b52e264feaefa5a6130cb438fe4228ddd14552e389ff1a444f1bc2", - "13f5fe817557eac9855351b793e3440bd27afc45b32575d14245282aec204afb", - "ab8db97f9be7b5b414b3f2296e145b8f36c47530b0dca257b8bc6f4d539e3de9", - "f8fe5dc47db904fd9f1e0d92a4c5721343c4abc53356fa6bdf5e5f661cd4bd76", - "aa9f153233a94c0fd2df0435fb2f69aeb1dcd0e10d97dc4a07a9f9d164196929", - "df12e67b952f7bb13135daef6df31895edd926b0d7aaddc3cb8838829067ca71", - "7145b0e3af885e1cc4c8f0d11962ad4e3d56c403c7ab60be1d125451d7bd1766", - "afd3d460d8498d0302e48b2f60840c9502014fe7f642d53907f262f03230c3fd", - "3de4f1d014845a9fa33ce9639fe0473e8c6431fcc17fdc983145f22a14e7aa65", - "de133b6eb7e9b24d39c88d977a80cac8a0522e21a033b97bb85a6ac62d1e0e24", - "0b28684660496478b46615868aae5d1a906b1b2931c5764c431fc519790fa5ea", - "d0c16a875e27ed2021f34c0e84957b789574dc5745e477be51978e86761da228", - "f45b65fb3b17882d30c7d285e033c9fc5baad0bc2bd2b84699bb9a5d059adf38", - "dcf6576378ecfcae2b75e37c7d456af5d1ef3ea74ea816f304c4123d7f66776d", - "2a2e6e1e245408ebdc6e0df7c4a9de992b9d1b2a83a854310d107c6ef3a2d840", - "110bc505afd61fe30295e5bc6bed53712427c71bd72b8fc3d67f519015a01dcf", - "495c5c66e1476b7f881594a1f058ee6bb3ed0d298f367d0cf7c60fbafa78cf74", - "400931983d8f5b764ee41be14bf166902e6a1b4177fbe1f0544acfab7123cfc4", - "bd8ce7024ddd29fe84ac81278ca81112c38f059d8efa09f28975c63417951bc5", - "0d454233e582492af666a88263534ccc104e3540d1e55ef8fc8aa302b4c0403c", - "f4fb7a49acbee7cd115b203b2e041bbae8ff1b3c13e17448fe6d5bc48a6e5d32", - "07bc6f844fb8fbd2e5e9c8a72a8aa0183fbab706ab6e39316e760c76b0d1a45e", - "1f2159a7f0083b4ee824dbbd5fb4229c44796aba81630c07d181010138a4548b", - "3d788693b95716a1e289a9c5f1b855ac58ecc2b3a0df8be7ace244b5bd674154", - "f2b744c289b01aa5bf5fbbd151e813e3d5cbcc69821dc7c5a9c5ea68aa333df9", - "c654478ea76dfeed22d267d8d88aab146acbefd3134ab87c3d376f98142f3cef", - "81dfc48c5d89887e817ce3fba0493f2406c4854cb7a8d3bc9eae04ab3093f3cb", - "9de731608be1091d94699ceaf85cd0b70369ce3abc44c46d07bae03ec02ad5d3", - "f2f9491b596d8490087eba98e96b9f46b28fdef063ce978f3e1beec0f4ae6626", - "66234ddc1e59606cc509cd2937a3be21b08bf9ca8865de1c3ead3c3500bffe03", - "a8c5387fd41ce9e141c230d8388089473ad0b66ef22a5bc1166fca0c5fc0a06a", - "e9f8371403f9d637ba62a69d77c33be3136c13f2ad78541e89c6654d61cd7466", - "9c65ad27b2f027102b167b68dfc460b1f93b351d305a26a1aaf01d2bde85a1d7", - "05ab363b316b2cd520507ee7010258b9671cb2945a66c79be9851be16d3c12c3", - "6eeb3c7d69aeb67edcd4ea1f0d35cb38508e2461bd263576d3e9dee47e866c0a", - "b81d5947c541e8bcc10b5f3d32460af57603342970954a2e7c68d142e166e644", - "59aaf9b07c262fcdb67c580228add0fe803dc4b2d549ff48cffd57fdad7c86cc", - "a5922a1efb5d0f714ea2a42c7fbc789f08b4469515e306a6dbb77a0edd5207ac", - "8e36203e9d67d138fcd301df712573e2169c0d97fbba481c141f32b468601f26", - "052893172a4b0c1914779d8aa5f321c4bd2fbeecae99bdd9624588fbd1e575cd", - "51a0b2f15ec5c9fdb37fb365dd3948ecdd9ffaa116d752fa952ac7d478bea007", - "a005ca28a602496c520957e466e4d585ccd352dafd205019ac0f2688dfff59c1", - "746b9f432449ccaf88bcbda3608b759c2986ebafaf3ece9a9b5002959b540250", - "acad1f0d1a4d89327784ca7328de0f37ddd6223641d4c098a8e5f803c7aa07a9", - "7dece2eee465a7a2fedbae93b98c52c58b0be5bd44028d28a2be45be494ee280", - "be728893f8f521f5f0cf3cedd19a358a31d4aaeb3c9240eceacf873936fd334e", - "9d5ad66ff3193ce83aff0528fe88c01a500b28d52a2a0d4fb6ffd65ae63724d7", - "813223415a0a76059a1a124e5468f1706f352824a91456696be92d89994bbef0", - "665bec34269990f110f57c65abe4b0e7e774735312a04d2568da883ead33f79a", - "aa20e3351a8a9ed73f1356b677fde89a299b25c7158e23aba4abdbfc4ad3a78a", - "acb7b4a63913b55c37c516823ab90c6c7fcd13180414fdd89e7ad64fcda32d58", - "e256adfa8ba0480faa414a525a3b318b08177f90371927b3265eb0dd1677006d", - "1819b41205c27bbf69acee681e63ecaff03df4845712eadf03156d73f23ec2a1", - "289c10969a06c92aff8062fd1fcd4407ebdd7ec4f395b4a5f72a9add9022e9de", - "4ffe90b8a408d355f8858d05848b6a05e97e65af9196f040594abc657124c2cf", - "b2dee5a2d2dc2d43ecc8c61285392bd99267c6e452e1ca958617049a29b0e8cd", - "a587d6e9baab6cfa636c31eb7b9d7da40add92ac6ff0aba95336fd853936b296", - "e236cd753b3d1253eadda7450b2c3cfc557d651aa6f77e11a0b088f4511d1d45", - "bdb709ed3dd641bcee10eef78542d514d5c3f5e3bd92efc557d92bcd55907015", - "91d04215bf5f6aa9b9b9f8771642708c21b784e1076ce6af66ca65e284bf1de0", - "806708dcd660062c0024fbb1f058857e30df8aa41dd27c07abb6b0f1805417e7", - "05f8834b7ad058c54b67b66bcac6c5dab73d044106f9bf1fb0b3c67330864a94", - "933eee257fcd83d3e74942214372b83546e36d14ad755572d57632344cbd6769", - "8675ba9c771afbc8cc7029f265f4258f2211230eacea5a9ce47db42d5ac5ba7e", - "ee1383a577b67d7a3b3921d3d319c2d11b5b816484dde178ea5436c4be7955a3", - "2720eb042669af9ff5365a433ff339bf949782414ac3e6272286519e4e4c9724", - "5b00fcf7035025dea8008dcd317eed5f7c02900df396c2a05fb39f0c2cb97bff", - "fa48ab70400614de34f0f481bc24e95433a0f8960d1093969955db8b3de0bd33", - "4f7d0547145999c2bd596ee3c6c56c32d061546980ba8b052031b7f17f18c9ef", - "b14f9338004b3ffa7aad325a6c343b564a2992bce3e68a04f067adc806ef9162", - "801b8693069a5b2fe0b489a20c2506194453cf11221ccb4e112457e25e86cdd6", - "1a7755f187a0ebef734ed50d8a7cb4adafdd5a33248df0a19165c173c3b2f6d6", - "cb11651c5633d2b69422c5782a55b526105c0d3621890279f07e3b27e742175b", - "828a404eb37fd5ef1809ec2c3e95e734c61e80be2cab0df1434803b4c55c780b", - "d65f48e30ea4f4bbf92dd2461e9562705c0d95cc67158895ddeab3fdfa2f221d", - "cfacb6479f01b3f9d4afc3057770632d56eea5b5074acc22e1e2058fa901c87b", - "217acd3807b0a211fbe2a3b8140a86b12d1f2d57d9f9ea6466901cb6f05818c3", - "b028cdefe3dba9f1ecd047946e85fa238ace9f809d90e1be748dcb60b5fda457", - "9c6a6ff559426a0da83b988d509e0aa151878c4716e795cf481549f16e5897b3", - "b354a25d6a2848ce94c8eba3005270d13c2e5fc0370e8fdda4973f095db8c318", - "2d1579954aaaf24be9638ce202112e1934de4137eb9678a0eb96a2820b9b732f", - "630f72a3daeff4ffa64c126115e3362bc7e1a1e62354ab900014f2074e164031", - "6a98fcd461450450162a4ad3c4a8807d8e581784e074ce05dda57a4fa2e79f31", - "e510d493ec225e208e89944f8b9660fecf370f0aaea733f38345abd8da27a17b", - "79ccba8e1c0dbd1f6ece056539fc79c581455e9de09045966024c49b28439ed1", - "fb4a8621dd8218bc3fae6e65f34770337a47eaef511917be7c4e7719b9ea0c03", - "9f2036ecbe82e85ce6438ed99dacda291fd37934595878b81c6c242ddac4e58b", - "88dee9f08d43ad36805c6aa9440a97277360449643926ec52f58218de407fef5", - "36ee238bce2c2a4f428857e2a5e52e240a5ef8245fb41fba0227ad95334174dc", - "102612e9f8add1c491b19ebbf2981641bdabd2c75881ada7b829e7c78ea37616", - "1f7860f04b98dfa16438781b9107c30321eb054ee09d639cf09bf20e66368e4e", - "86fab0d8450da26a9f1998d204aef301591aed59aed2ca1f16d80df3a95902d5", - "87c88b1335b5240a4a9146690b9df87939fbff8c70487bd596c95dfa7b2a004e", - "e3984bbd6596cecb275d4354121d756e0d6c40ff3af3c0eec1a8b035186ff170", - "f3399f4d47e61c3e244457f72f469defc73333eea620a8c0b422f0547467873f", - "69407b0845249bc2a8164c14b9410ad1307338b4e784514d1c7e47ccb180e75d", - "bceb84b116c83c0c0101740d79f162bfaadfcf74b1ef8125fc47fc040e42bace", - "ac2825310c748dbd6d076551ddf1c26302a5caa90f9689414c60e32b9ec71bc5", - "89648605f0a61a89c882f9d2d5ebd7abede717fac4132dddc675810efb07cfca", - "b8fe2a585e0bdc4f8e9604a77d5f2f47f4f2e9eb6b2dc2dac9491541f99b83d0", - "a78baa4640c2e22bc3bc6f000ed81404d186c82b8a4c6b0ae079c21157aeee73", - "f1275b0a7971a2fb40aa5987ec35f8c9d6ed71f6873dedbd9ebf6ef963d333e7", - "290794d7779724acd3cd03db8a49a585acce40b2fc4609681c4e78883e0c9a05", - "be75758a1658d80efe9189b28a2b25b1ec4361fa5edee073af9ae87859c10022", - "c7d0d82a58834b690bafbd082bdecf4a2ae38d79050f42289e50b82110b82d2d", - "5c4430239f839394b9929b469182da13be2c548873362e9264e85f08f53ab0ab", - "bb586bee9b22f51868392ad10c8a468c9a4dc35d96c8893b7959503213d2be8f", - "ca4ed3ab859d0cdd81018a2358508332f9572e5470743cd780a47f6794304bc3", - "c5ff4eb1275ea7567ab2003fd4c3571f3244dcfaef809d5c2874e89b9196b62b", - "4eabafb47ba128d99492a02078430c08c04215aa93d89c4a3eca77f308a91839", - "dcf0ad16809ffa219588e22c2710d6b73ba7af2760bda904366d62bdee168077", - "aebd0a5a2bfb7e74e12f6e70cf9f492b1440ff71699152da2d5358192e6ec705", - "683bdb96622432afed26126821af7859232d36b0f4fef5d29ebb5126b9544226", - "bc4a2f63fdbfec7b760ac9082597c2e1a30ecff3ff4b212f4b962c7d258f4f47", - "7148f9620e06ac339442ce64cc208c2357bac25aa5a99eb54e24e6719de99607", - "f1bd96fc268d0699825e926213eacc18c340ef2f517a2bb82e8fc561bf0805b1", - "1588be0c6ab429b009f3e3c9617e252ea6968076ca6a0cd95b07f9c6e89dd18d", - "a7ead9ecd5ea5ed1c469fd3a40eceea4229740e91b02cfbf29bbf48837154e0f", - "e423326e7d0456be7623c048c63bc8117ea359437570a64ee5568b21a232178b", - "54bd2deeaa269f86397298514b4a356dec5e9604ee6c6fba580cce7fcdc02fe1", - "e255c7bdc64b348ecae183dc857a641d2861003df4b805a6b906c8214d2e8fb6", - "c80e7739d6248ff7b767e123adef3497ae5314f923dac71657358f066e8f838a", - "0eac0f8692d9c7143f273af81b5e34adb63c654514e5cc13e4c7e26030715e3a", - "1807cee81eab4932e72371170ddf1c8e120c83e9bb607e3363fb61f8dadba111", - "28fe874528822b9c4d9e0e5ebbf1ee38aea034d98b29ff8006a3a79a0c674eb9", - "558c77f6b06f5a69310ef2835b3b9adbe68032b969a869482929def54760ec14", - "4e163de9fcddd68c3f2bff82c3cd7e63542fe4e1b1520475a0ac5d6ccc3b630e", - "4b23aa506dadd922d04dc9648bb90e5a255d01becd4b1c6cbb71ed88902ecaa3", - "552ccced62ffa8d904ce77cdaa114f950c2ef53a2c77c4ed92859594b2de99d2", - "7dc9cc6c306745162b45aa1a0436d022d517100048f35462c2bf1cee4fa9769b", - "91b7a06785c298ff3bab2493360426a9e78d96d22fc9e5ea67f708f031dd2a9a", - "b3f6662dbdcd961bbc42e50b6a190ef7f08190dfe6542ece1bc2942594bb7b12", - "52bf986cf6480fcac5c85c8047ad91b1e6fb0356a5b07d44006692b08560ac20", - "31d709944a650ff17e8a9f89a34faed3d6a3087fd4af2060f284a61b6d606452", - "51f5f9b4d8bebf250fede8785c4313fa9f4bfb65cfa7c830b6317a6acf6971e6", - "03f6d19d475fecab9f553b8a52b017963da7b3e6db732f0ab7a3aa05a215b28e", - "e769c6cb6f270d0cee1c74f7f0bc451522d06887bfca461ef35d9c299c4745c5", - "8256d67b2a55603a825afdd1faed148e1bc2724dad9b7a21c581ae6419bd60fd", - "9c303293a46aa2909524ec6a478fd0d42d29352371069a885a97b548f52f4b0d", - "2f08621c0213a90eb6230cf84bbeb9f7a8b2c0a22162e909100a7872806426a7", - "a2bfbdc733d172b784cc95a75de8124b4734509871dda7d96dbd2bd5bd425b9a", - "ad18720f0593d6fb01f458207bc09d979ec404b4d6752860cb6ed2746738cb6d", - "8ab3e387cbc8828a4bc7bfb7675013ba258dfe549aca2ef2f0a40fba3a4d68ed", - "de7c6a7ae901907c87ca9de72c69a489c18267ac4d47b9553aa3e431131d9a25", - "bda1eeb5a58f3bfbcfeb985304f75809d78a41165899a63cebb9a0b4b0bccebc", - "32c71074ccb13109d8cee0da1d30ef3e76fb38f6c6950c8c06fe967ec2a5698c", - "36830369590302f09ad61fab0ec70b85b7e068db2b990a82ff6254ba0856a3d8", - "f2ed8fc79f1b358bdb9c9774dab785fdefdf5c981c2752f74ec49ba0c13ae69e", - "a6556dc5c34e277b0bdba70f8d1e7b0624fcb2af8fd0faec70f871160f31a414", - "bdc7c74a2e7d1877f4a6fe7f5f3e0f442fe2110bf94abe6438f572b6c552d139", - "1f854408674e6c0d76ccfddc2222e8ddd8cd7d964fec4e8891d3dfda2c29b7c9", - "ff922cd3a2803df6e540137d0f6870afcabf717a43b8a8724c8287919d4adb43", - "b41545d192c110d68ae47ac17a5b7b479e6c26410a571d200503f774a99b84d0", - "af2b06d54a5b308c9ca68b1881efb56714e55defc4da2f9bf47fbfb41c892ac0", - "b1957779f6930d2295ae0fcf1a04b03d24cf30039f54abe217935f78ec185b30", - "9345b81d0334428f778505512ef20d1db164c76eb1ff3d8abec18d10328a3d09", - "1bdf819c982e24821cf87dc7e4659d0eb4798e0a3eed9bb129d0432616a254b7", - "d24f4c94cfc4bb2332f529457eb576364330338cd154f761b290384e9f6069c4", - "6df8f863f95336f72b5856a52ed4a550fdd59f1f45a633dc33d7f4dfdabbb09a", - "5cf3da0240ce1721233b3b251dca8e8dc7f81de2747a8a44073d687a72ef78d7", - "bc80cd63bb47413137b19232ce3942f5290609c09f05f670ca3ea451e62523d8", - "84c5feed30232ed0dfd4767746355831aef11635b6e839f4c56aa7f2ff1ac76a", - "ee6309785bf0d5565a207cf2d08a6786a732704b67d74490d9dd0017872a7b50", - "0fe28f36bf1a148aaa0f033e1facf7ba6acdae7ec0f8f5f4398d846e0b013fd3", - "1cd280e3523d4d7eb01d23424d5e13385eec1478ca3acb9c5a40741aa1d1bdf5", - "759b3d044bde387a3695fdb848842a7bed0b0b1ff0f0542d4c12024354938dbc", - "3e39a0e8f3fecf43b12ae218c69279c5e48fd5d944090405f2698c34182d26f0", - "7e840da41086ecaa3cfecaf6c506d39e76a010ada41f1d567c38b6f589fe8180", - "3ced7b050f11fb59ee1683a8c1171390ca289f676bf9a78bb7a53cf12f2504e6", - "4295b6f0c289cce849ebad105368a5d009fe493cf1b5ad7b071b6ce719318d0d", - "1335704cce9bc945a0557ecb6a6d4c009c8e167defe82c7ccd29f05d64c5e7d8", - "5454122262f68a2ba8969df43fcabd88e7a6de2b9453ba9ba93e27c2f7cdcdae", - "2f37515891050e2d6e072941b9b42831858687c744c001dd00e79a7fbb4497d4", - "2c2a311af99cf5036ba6531aaeb5241cdcb7bf7535d7dd39d9196c04ea69ea5d", - "e10c5daf5b7cf9df6da40899eafe1264449939b157ed086c60ce3d62df43bf68", - "46781c68267fdc3061f8e5b66dc875120978c2787b587ff5304c67266601fc1c", - "bd53b4ae104695bcb98b6f31057b8e52ff5543d909ac7802bc26c7f00b02c51e", - "4fdd553f118cd758ad4dc15a575ed40840098e8e7d757f72501e96c7d442a052", - "99046d3dd326a03400bdc7b87530ef5bef5fbb1503861d835fbf59c7d6968103", - "42cf331f681bfe97664610c370d4d3b067f87dd9712c01d1584fe3039edef75e", - "8d110df1c359286f6b48e7ce6be5c6c32c11ce738163ed5feb20557675238059", - "db6167199246992ab9988db8927ea55bea3fb39607e47a8f45adc1e32d368b92", - "b24f85b638a26c6bc03eccd58d1d7a2c1c6e8f4ec6adfb24576c21b4457d55a4", - "46ea07b4142a6b3ba929be51e7ecc3f464d2edbc62b355589b88f46b50416ebd", - "27637b2b9d615e281b90516a2a4f2d4e4a012113f06f5136fba1d7efd5ef1fb2", - "518ad23ab2a31dadbfdc4bd9612a9d285719f01de6d48fc6e9a46e2a0e5ff9d3", - "0de6112dd44b8e36d2934b51900ce6fbce053e6aaa3f0df87cfaf45238afe1e8", - "86bac029f01d4332cb5915cf472aa602de611ea2a350ec9dee07229548d9d6b6", - "f69492d2c49a72a9f5cff807c120e5d1c81cb336907b9d4843cc1d805dfcb7c6", - "db6c62410038c43e7a001e25211784d612c0039b87090b25018a36f02229a21e", - "60b608aa7cdda5d4b6f331ead28e83c5fa424d2d6617dbf911c78afc1ae82452", - "8018030063123bbec3f4992de6512010cc66e0e8fde3bb9c1ae397ff64b06df5", - "53da5dd7d47ffb945f154ac28b2b716da8d47a9a4099bc9df2c964cafb9d444f", - "9f86bdb796a27b85dee227b0a1584b3571a23e513a182f4ff61d4c572afe1e40", - "8c35e398af4491e1e03da379e52867b8282fe894dbcee64db43edd5c8c999bb2", - "3e7eb4f75c1620946a675f83989a70fb0520f0dde5fc27db799825881eccedd0", - "fe4f2d8cdc53dfcb4b16b95c704ebed7b14711523ee237ad09291cec37e1aaa2", - "ad8ead01d52b63c5a2aa19eddbe46fd400c2bd52bcda01f06fef011a1c9fd345", - "ae4beb953258668c7fd7b16e21a5ab000a57528303fded906ac99b47349f62cb", - "d07a569f615bf0085db3a204b1a021c36c6bc2a217e78972cd25a344eadb4102", - "5de5afe142f0fcb2f0b2f1c03b294f3d8d8f5f1322551052ab30ebf52b343bc5", - "a41e8309e128aabdc3b0a4d7011656801697895ea206820f15efdf7a023c0561", - "a20059a2c5005dc945cf320d61bab2efaaac621b8a2e8f8c4199281dfdd949dd", - "8c5b528ec02cc3ad97e03e0cc6210c793dce0b49ebe6aecbfb80f760b02840ea", - "b977c584046b1f290ceaf1cc5abf92fea34a780cc0fc0088804940ee7432567e", - "98f26828e9a6c2f3cd1d5eef1d426d3759448d3363f66ba9fc08e470e16a1169", - "73f07d0a5275945049cae03dad360c66d9d00ccc0e91ca0e37070df74c3e7e69", - "d84196116092c4a5c9079f21932ef870384263a3246f7f115a6ff838a2264ec2", - "73b0d730457f8c2a83af3dc93ac9d0c3cc821dfcf8dc2ef006bd89185bcab576", - "2ee783fb14b34ffd572717fc721c0cd7781d36e40d1a6162b4f33cc3d343fa4f", - "59e0337e5369ea84256075682fb19ceaceb0292314c90c77d1311d6c8c9cf610", - "5003afa3aba512c4e41db2ba524ef61ebf1666dc7a510b2b3af8383a42ae4e0a", - "6f7ff0962eb522620194dbd9bf3ea7c815fc832dea472116adb6cf6400169263", - "0ff070ce54fcbb6de5a3e493c48eb99a84364010d04d4cdfeb663453d1778b86", - "6a3a025ef6de116830333dbf3342be1b51598bf337c51f1a779010f0babf8ff2", - "f45eed8ad2ede5869400539c6f777125962d1572cdd1627bf762cfe11fc46224", - "9bdd3ccdafb553aea5f5aeed4b58f318d2b2aafc57c2ca0e95829ee9027bcbb6", - "fe6c6382debcbb80623eb71c1b95eb65bfc984327d4ddfb68558671bb940fdbf", - "9af1ae0191b03863ed6da7bd363f1c6b62880b208082fafa3ae3c6e6a24e01a3", - "e44258c893d291df652a796f82ba0ddce5772da6361b07b12e844f06b24ec6f5", - "5a4a4ae307c9d667aaca6c4969c612244a62de6e6ab61ec61caa663fa60eaea0", - "f17c3094877ca4a730b83549b230f1c11604e866e57e5e7229099a6ec9d9e681", - "b34dd9a8ce2f6ae61a25202ab72a38f658a868fcdba0906b4c1887c2d3d246ab", - "23da8176b312f6c9a9067251dc8d8609884a370992fbbdb2a54497a40ec122ad", - "9d3718f3aa7c3683f595e802b40798d77ba723a52ee6b93edeaa80aabf09c01f", - "ae840ca5e2055e6be3a68a5a377da921cbecfcdfb87e1d858c66e1379bed355c", - "c3d3844f414c8cafd522722e296fb0d9563f5832ee67bcebbc7c8e6a68bc4262", - "91399a8414bb1117b767b7a2fd61c47bd40bb25b2256fe77a0f3c504fa73cc46", - "ac669358b10de70a2a185b27649d058c15b858a4e7e0177040ffcf11597ec3d8", - "efc1f9f6c1e9161f7bdc83b38ebf16e13414c24eaddf9d37729d7402f9e2dc05", - "58aa7b1aef65194a246849296cc46a3f2a028f838bb0e32f9dd3576a2231459c", - "a8fa04609beca7b222be0b0b50d349f78b3742a1cd3920a560dc9a00640ae8f5", - "06f7ce59cbac3586db65502ee4750df1902faa17866a43179ad52dedaa32ea45", - "3315bb2862c58f0881ce6862b6c17963d28e077971e9718da01611e429b9cde0", - "fe224a5d5ea1d28692a30113f3c5be9451fbf7a1ef44f28ac3488084be0b15e3", - "09fc6e54934a0cde866dcdf195ec17e161aaf576e9c3a19a5527109d2e705169", - "3ac003d197695032c478f7291dcaea7a216b1a31e7e7a4317de55026e2e33f7b", - "5319b90092f5898201b42c51d3fb4925e1ac819947e23e37e245af0d09182f79", - "4d7d8bf88662d7af298b6d96fe05eb53a566522879256d3b361919a22d17a434", - "fe3e85f69d732f59eb7833bd532caeb43afd61523d921e5a460dfbaaa25fd78f", - "baf7ac666dad76fa23fb165d15e8aa54e7c79ada19fbf5b5f0df33146d0e921b", - "d6f65870d64e376be043c30a479bc4818504ae082fc43eb3a365d67c5980ea48", - "e535643e08638e4476fa10112c38d6b0be1e267470b5a09612d58e7fe09a77db", - "771cb78a8edbf7620889412583ded0cf93c94397605246f7bd2e3e653ff244f1", - "fe44e7fa0deb7ddc017ea4035d9839eb9e43afc0ba09537e659c8bcfb835b1a6", - "95cd3093c2a5a008c318e4ccfe26c5c0c9952ed816e3f05afb110a497a363f73", - "1f517d2cf560ede45f245cda91de7238e37dba57cd596feea1b7eec1aeac959f", - "834e401678e2fe8d9ed8564264a3b8573a921f282e2545c1b834ef81afc5ff8e", - "9b3df412cb60ef58d60b6c7a99647612ee1c07a926cc6c449a0c4fe720342878", - "a0026f270365cbcf212c4322b3c1dc7f2bc88b46ace2ddba3a0b31c57adb6aeb", - "10afacf0527403a0dfa3e509d4bb54d52b3ce395d356e492a5828bdad5b02a0e", - "0b23965f2fd40eff4b595fcbaab7c4fd54821503de879cb27b66d13855e11938", - "05f7de741f3e06bb9be019544a8c0898143e7a99dcb428c521fa7a8dffd53032", - "0479e1d0757ae5233f533df9afefe2f65458d63eac8fc70c6d27c29382def7c9", - "26a9268b3f4ec2c6f72ceb61b9431160fba7e8ffde23740901ee72a54e547da1", - "af41fdc4b0a5eeea6e58b153323dba681748eba09141eb936c82eb7f985d16ae", - "9dcd6bd951bf060870760e8837aa2620180e1258728e6dd537016f8bc84e7a9d", - "9f01f1f1baf316e3fdbda539610d8ffc504ed931f3c5575cdc383effa0711649", - "a4e25bf9e442e471aba332df44b20d34a756d3e12d9d1ae1b6f626e395759f4c", - "4bda06ecc442a40f2b992eb7c074fca8b960c70d649acb6f328f75b6cb428740", - "c4802787b2e0f599ed8ae9e7269e11645b62333836cf8d0eacbe3c9f401ec23d", - "6a128677065e0edd6643cc69f3bb36f3ab0980695e378082eb32140a929e1691", - "4d4a8f0e9e4b9e2bc2b08007103d335a0e25108a53d507752b5053edbbeaa2c3", - "24e494bea79a96bcb0474fc4e098280f4a3e303d000aaa2694f56c9b0e16d264", - "a56f28ccd3ffdc799514b063985dfbdbf3bc6775dc1ff49366a3675c2d5505d4", - "9927f4d18a4f712418ecdf31180e1bb8289e486791bac96393e04443eb971bdb", - "85cb8574c4f4e109e237782e668c28ab8daed37add17523ce620509153e50c28", - "00231f0b265d91134ae8bb772570f726c7eab529e84aca8fe23f1a40d92ca348", - "abea49f4dc4bf02af0cc0f4f80bda215f972fa64789cc2be926c4c17035cca03", - "719f98db915a3fd0762ae40fdecce2183e8e0db700053dd85ad5e085b5732444", - "c2979ae615b5f56015e479e07dd90551d7722e34978812d3ac9081f9b34c567a", - "221e56ad83ab5551165291e4f4b45cd5b4c8adc5645ed9e1cb8f88e97bea16e4", - "a188e66f9a324a279f535e02b61bf860555c058e6221439ed3762f6d77a4d797", - "395704132523b5d8aa9ca4eb5a6164b33dbfa69d2df6396925042656bddf980f", - "e6f9b4fc0164b26a7248cf275764a57bcd0b3dc6b42c4e3c7f1a72ecc18bfba1", - "59f704e4f33ee8c62242460a760af5c6d54be80b33d6c12fe0aa21b7003d3fb4", - "51f27c215dd19614984218f25e3b182bd73fdf88531a9c7a4ac23c73a9ff3281", - "4d4907fc3a519c72673006f3a9fc34af3e3208b92379df7d5b8e8a8336860473", - "ae9a3ed88c5f6767cfde95fef82d9be4219b3dc12333f3e08896667b5677e775", - "2ff71a5281b7d20d95ad03ad2e1ff3cb037f0a007b8f644cf1ff82ef75242e1f", - "f9b4baa332046a53a75151732c3faf89db2fbdacc6d63e471eb64d4e4400120c", - "09b71d14adca8f0ad9eeeb15fdac02a8a77e14fe1b972568d235e1a4fe9a71ac", - "dc377e827f88100abf3bec0037d8b9a862ddbc676b60d2db8acbdb9267c5b98b", - "e6bb83d937b481893bafc854dc77b938f825458779f78d11eaae6a40c7fac42b", - "621dca6e720e161e0415a81fcfab7c2ca2bec79ea1823cf6b6d64e83e289328e", - "756598e69f96b2fdd20411ce7ca466a906a2fdcc8c2afe17af7e0e184044be74", - "2b3582eff6484a261a6d9985af85923848ddd221947d2137477dd725a49fdc20", - "432c225b1fe178c4365458a5f63254ad553c714f6c885ae4353f6999b6e5c979", - "83957156224c3c1d07b8cc2d302fe9bdb5d679a1a6ac4d20957adb1c09e87da2", - "dd7bd6283475a96266b720b4b0d3121dda806442d3e257e65406218b1f1423dc", - "c2158768d93949a4f492361a1a2d54736b44c4072b701f248503c44d920d3c66", - "22a4ccd21e97a0652b085b87cac474428ab0d04fa63216331bf38c4a4e8a0d41", - "96070469966fae4f4c51f310ccbf2ec9c0f74efb0cb7721bba933fe471784e66", - "da39b19598ac9c10aca76faa111d045656abeb29ec48388e74ee7653f7ae5838", - "4883965cc323b4fa6a249ed36650a62cdb860cacf3229537a6a3ca0ed601f17f", - "a67a7aeacd061425e2f24ca535e8247dd2b5f775e7a3a7cd939d2332113811f8", - "7d2aa805f98057544d8c78a7267fd1c6aebd6c6ffb99df72e475dc15eb94aa47", - "01035b72bf5fe4d3b7b44ab8471e9990aacb78ffed318ad3942176776c7bd765", - "cee4307ae1e0284e3fa2c71dee487b3b1d67da42016e06709d50cffb1ccd70e7", - "37ea0e500cf02c692e88d2f659a090289f9b2a3bf60e63a6c32289a7a51c0955", - "e2825be37c05ea9c03c371feca9033e04591b63a5e1ce9f1e953e1b7f958cad3", - "291983fbb8b24a386dfdff54dd1f3f62ff1cc90bc2111287fc466e10745213b4", - "dcab1971df6d370e464108089c90e1aa9c997c087c551e5a0531d886a2694771", - "12451b90a2361256ca89966b2d877ab8ee3ab36be5a8eca46ec5f6b95463319d", - "da04699a724ac9aafb2548369945e08f35046b4497b1e90a0cee07ba0fde2e10", - "be85ce354cb275dbdc7f09e5733a3da50bd2e8151be7cc0a3c23647fea8c4d75", - "f5e18d61df81319067353f0319141cabcad471b28b436658cbd8b49a09accb14", - "9a7568029d4ad0f787c6c0d7d5457a60dddc0c13814db03a79d0cafd4fdbe48c", - "33347cb7f78dfccfe72dc926ae2d6ed50d0aacea172f2eec73b75c491043d5e2", - "f6cc1b337d0fc95c5a15bcb4e018db5acac93090dd54af9d62ad0312f7877b07", - "153a9d8696d333a7256bcc82fc266d6991aa191a080ceefcee8b7e8c4cabfb2c", - "6c20110f4f7e8e1390a845a37b7f451e59575d784db68aa027e2f13cde0c1e30", - "af4196b1630f49232e2c120f3c327db40fa75a00ce188fa945b9c7018357c2a8", - "bbf4e97bd041909362210402315f87a4cc4946566a97e0c9987b9afdc0a2a3a2", - "7ff2b364780087cfd30f2ee47fefe30c32e2e5c7b3d7bfce562eff5928f76ac9", - "e1cf867153953e02d19ce44b30e884664a840773b9c8dc77c75c9686ad2d16ed", - "ccfe54ed60957c3d3805d4648117ba59e55ec4c215a2876e6c5cadc35ef8a1f6", - "d838aeb051c4e4ef072b3d33376673787445fc4f854a361a5e21299d34407d6f", - "9c831ba5415dd0471cde15633a394f40f77439499485a9273ff5d11bec8d85c7", - "f4b9e802e402b2e87dc67a7ec21217f7abc429f9e90585a444750509ca75d269", - "fd6c87f39a42d1c50e5f71fec2bfd3c78ee16b7a91186dc4add289a5ba59fbad", - "db65e52a93c2eb176f0ac185086e0e2929b6338b19c8deefcd352f710a177167", - "1cae149688c00f4d9b6a6ba10a7a51f9fd742ebb42326276a4dfae7eebab978c", - "2edcebc2081d6e02e66c9ca1bf4e5b0e2176977cbed895e49189a60c67aab4f2", - "c12fe94a314ef4146ce1b54378d0975ee769f26c7bb208743b030d45c5feea77", - "90be8da5a3db91a747eb5c5cb7dd655de45d4cb81dc2b24321e41bb5520b84f2", - "5ff3530222ba226178c6eaf8b020e35abe45dfefab183f64d35d07072820ac47", - "8c3c6826dbf80c73abf28209a967f2d6956e686a812103c58b8e983e409b4457", - "52c02d961a6e1ec8e5faf81d02e2ebe8f64f67514dd6422a18e8cee6361cbc45", - "7befc09bd0c0444c8ab0914b942f82001bba40e36cf404165dd77d9a41df0838", - "38391060be7249b21754eca3169f9f57ef6c0b55525b862605205ab84652862b", - "8ec1186b5094d0fb6f4155dc07ffe02d54cc75c44de39b7b7a20ace0e13d5cf9", - "32a2dfe93f1822dbd639b1335390f9142c30f5874c19cbcac818337a5a102105", - "44f4cd5eaf317948589f68e92148ec664a05a883c9e54b806d1cb166b10f027a", - "47d6bd7ba44cd13f6b3d55534e9ef2b2db906ee6a99aaa06d4973407a03e9a1e", - "5e5c9627ff15596da547d03e2cd101f5b42f98f0d427c650942bd50f0b34239c", - "5dc17a72c6fe8fcaecc7981cbe12fe917ac330cf5449e2c3cb01f0bb0fbbd647", - "3e4122d6eb1e630c15f0d6896caffbdf71f3e0991f1ae0d6d644867ee687e35f", - "f93d0d2cc8e907a3ba13af69aaafda1c26e65507c9046efb92367090fdb6823a", - "48135492a99e2c8bf5a8342ccc3084bc40b6601c149d3375916c03450beddb34", - "3e5131a6067aa6eb4683c8432441e9427e81119b2feb471cb37118e672396963", - "4278aac683f06c592b06b9bdae83585c30364f8e292c65e44abcf04f7ed93c63", - "6e4ce9e352ac20cc4759314e2638d79e1f5c280e75418d2b7ebf9e6e49c5e838", - "08dcfb8d2ab49db3fa1b9c18c5a4be057478d3d172349bd4962962bff834eba5", - "50f0e2e650a6f8e3e8faaa4b7ee7ddb6e948a1cd586276a3a319b3787883ccfb", - "8805284073a3058353626bab07d693c9ffc7b9f2bb976ead0065bcda619aacb0", - "0c98cad8f77c2802f675b46d2f28bd41d95157fa04a0ffd5028bd35d2c5edc2c", - "53d650c7f8812054be869914b24bb85fad4fa9cb0b3eb8747546562c0e07b5b1", - "7cea36923af6f3f925509d224e43180f5de111384473c7765a8b7cd3508bb6ba", - "25d030630be9eec7dae34910bb398d72c862a2679b10c7b76a09ec9f8304eb6d", - "cd3bd2c1b877ffd2d7bb079ae701ef4c4d6b96e5129d81b330b34e22a619e999", - "00630e0c08d8f805c6e043d7c80f34c77012916037318cf32655677dcff4d8ce", - "698ad2d7c03303dae93746cfef3ae0cc6043a950ce76376b1c9b699655949f93", - "7eb9172d6c09c3c9c2fca5d289c569649c85941d26e1e9ec96a442829fa76403", - "aeab5f58285b2a8a8715b6867e36d549bbd3bb60765f1bf5391ae30d19a212b3", - "a7a9a3edd6d36f00e9f437a7e6bf95c65611970042b5560cb37dbde6e899d70a", - "a2da149d0c970dae5c5fe7b1e8b7b6729517176f998bd64c681128bd6a501b9f", - "1dcab011fc979d532f076e65e4e6bcb3ecfd74f57bb5840e355ad1321ef4aef3", - "5b890f17d955fa7fbbaa5f73ef641ac4bc247fb62cb5586c0fb478218f5dab96", - "429cb8ea78b7a81b378a6b4b956a0abfe6c6030b96c666c2a65c276982f95519", - "c0943fb1d2b6c6f00eb3601fb17de958af59bf46627940cf8a4ab29069ad5165", - "a7048c3810f88b3a00c4277c612c8e7d1c5854f722c7952de97aa6caeb0d46b0", - "7a5fd4c723a56cd3ebeb9cce983f69d5e321844ec0309d2b640681a4a106faa1", - "99d9ecd716aca7286df86a7d19a08f8f89c6420989d6dc4d750c568196c17cf7", - "e55e737a0019e8242171048f2e085d8e856632de6371cc28d0bd84ee52f191f7", - "56892ddf9421bc9dc83284e877ed8d1f55d9d8f810eb399a6c2efc15029e52a2", - "c7f9eebd9d95ffc871a90fdab41f456725dc9f9da160f76e1ecc3f83120bb351", - "edcf3c3b0ee964b6007faf325770b67507e07124a602cb879f363e80b5d3468f", - "d5e085ad04ee4c25473e46904bbdc1fa7e152afde9c9ccd344d9cd98643d0594", - "204fa8187cc923b878b8d628027d2f36237de042181901c694a0089635ddc353", - "924ccf9f664b644d342ef35ea90853d64412088daf2267d9e31104c7eef5b6d7", - "7fb160ea842c718de5736c850d18605491371242293a1e4fd807928f808d57d7", - "7b72c5ec777a7e51a023e87105226e0885536b5dea72b1688e415dca875e206d", - "44c903874e31666712661b6d1a0c9158da0a149df0a39585ab7745a860dad8ff", - "252f52581661043018eb1a784ed37349d482038b6ca3905a189bdcda45ca0fe6", - "664de3e8ea6ba0f10074eac9e324071de27abe2eeaf385013ac60a4fcd9f1504", - "d2bab8f146039d240dd1d6b287f6e264b8b666a5ad803ae848ea97beaa8f84fd", - "db671e7bc3217dbaedb689013500ae44e13525202fe8f09af987f60459b3bb73", - "50d0aa4de37a22395f3e2f5da0012cbe3e80a90072b75ca76edb640cd5a8676e", - "b4862e087d0d7686b4b6ba57677f1a27bbe76410dfe01a86565533912a4845fb", - "4a4924a99a48321ae60c759a58b305ec0c6f9ec728b06e4bf216eca238e1a6f3", - "03107958b16462f16b594f524c202dac8166c032e089c3addb6e9219e363e7d6", - "3ebe25a17904704622e33ce360ce57008d396f82a2ea8e0fbbba055cc4192a56", - "a138c84ba99b0a0f51fdb5b590785d3344c423ea6406ecb537d4d774681f275c", - "2cc0f4d30830eb0bd3a700548255bf2294a589d64b4d3f94e780e8c8f6c1c86b", - "cc4c778e9efba8e2eac17c5af93a14bb83ee4095be9a267bc24fb19d538f468e", - "29d0dcf83a7378d36765643385ee8715429b4520529adbb4bfe2b0cb6ea3e8bc", - "5890e4c72017e6dde75f85bf54db8be10a2e5225cb970f85b7f867b5d1951274", - "62a29133aa15b54396411267c0b8f5ae962132f88a60b12586950f1e7c40f228", - "fbabe91567ac437140df9947ce26fbed10b562bb629dd5fea516e678c4fbc5e8", - "96d29f39f626d4e051ba1c5a0a5ee64d3bf74e2bd0158bacb60f3c8da5ccbdca", - "ae69c209d387ec207fd465ebd5a64c8a74a2353a53a0ea0decfea6cd6316ef7e", - "67d702866983394c8cffa93edcffe5472a206e821211be3d5eaadf740d300132", - "fabbe07c407d4f3a91bb42790a7ab85172a739051c026d71e41c1c3428e3aff0", - "6fc1c6ca9b067155ce40ab8e64948fc31163220efde7ddbd2eab0839db4414e4", - "ead47bae5ae5ad9610f5b58a065fe2d1ae04819a5e8f6195659e0e1bed5e3f63", - "e16f75070023c299303ed7bdacb8784103323560acb7475f285a80b4e60110b6", - "db3177f5306b71e193eb66e8a95085aa0c849ebffafe9b210e152257a782af63", - "938af65443f53fecb7e329e7fd4f4613a247a01944e649e11687a33680f07a97", - "e389d930c266936c35080a9f226c5ea3aa658ac42c377ff38fe10ed765478afd", - "819b2639a6e29d7e06ed577575aac883c794fd915c976acb0e911c557c334ca8", - "efc4711b5bcb8eec211e41fb7bd4e5db6ef6dd34b1ddaef0b0da2c41d3131430", - "d83db32e69017662d70b980d751aac2fdf2c4213549d44e566952ea4ec2b5e29", - "3f9de319aa5745733a4ffa271b77d39b7e59e985cf7d0d154b442c381fa021c6", - "d8145372ac323924a8fec6e7fb1a77507e97a823f08cf2fa5de912ac35b92b64", - "83319ae79b7bcec919e724d7d6342325d6f2f303dcbf2e7e448fab244d352d92", - "28ddb50ee689fa95f100ec4372565bba65e39f2e8379c58b4adf0e0aba9c0363", - "3ae13bb2ffc6016ae44214aa314fd26354b170bdb7ef03091717e1103c9d1573", - "8241812daa28a1b6673b0cad419019fc6905a4005b862130070c89ef21e49d89", - "9385353f1aa886a6b2645a0a305eba0a358517f78baea9c1b94c647df30c139a", - "4ccd2ea816bc4ba893967ecbc4b9f5064b0a5bc7aba4fb753ed6a80963fcf0a9", - "fdec11a21952ef68160025976487fcaf13b352639cdae2a9af436ee3fa9d6e1b", - "020f553a4d1371c13bcf6fc0163a5c54d026d1821fd1f27921254e587dc21c92", - "f6e1c6769f2bc3b346092b80e2dcaa50979b13962b5d07f7d7e182a345be7c32", - "80aa5ef7f74ed2c167ecc7e8205837e9f188d3f69fbfc75911e32e15981902f4", - "16ac520ecf5a24cef79fa3e5bf6459a3532feb9cd06a416b70e385d332925688", - "5fc0fb4d91a3c2cbd1721fbfb7b3b9a057928584767517984a25df57a5eac94f", - "82525bce4a4aedf402e029341ca82ad5a2d7777166c293b34e4778bfc6ec8035", - "166ad9672648d294f8dda101c775dd0893ac219f1cf953a2f842a83f9a72c6d2", - "47e2488ad5064dc2838e935f5533e5267ec80b0ca0c9a15a2b9de090a3bb708b", - "5e4d4b6c00434475dfcfede4d45817a509d55655427658ad568bfa3dc96d079c", - "3cb45ffb9ad4dc358cb7af13e392e449be7dbdf632fe455093a1b36241053b99", - "4f89f8c08ccbcd0c193c8ccbc23705049b7e61366f0c3fa57c8c6adad8388194", - "9411345eb1ef9f5bd70d988d67007a584cf288adb43b78a4427bfe4831b6f2f1", - "70768343e19a4d805d5e7698faa15501ce0a5bcec52153a72c1c421106a0c1fc", - "5e7305f2b303ccdba6741c344648d7184f608e91530f8f44ccca1e91698483ea", - "30df0598a6004d6cd993a9b99457dea0e691680356a2fd71657be44601f863a1", - "761ba131b5ce90db372ce1f413de2d376688939eaeb8822c151c33610e96d788", - "f1d2d3d8abf8de669c0a9a46d6decefd49e3536cc1bdb93b9332242add9e5fd6", - "6fead5e80f168f7670d9a8f9d927b91a99489d86f1d4c268904595d825e1736b", - "e2e2a48cf846c4b19ad41d1cf96f4a619783cf6a43daf1e04157bae979591ed9", - "df7c638ad0c00bc59b162447dcd0823a92ec0fa3868abedf76572f95d3e3dbaf", - "4d72d7236ea9b0a8d6a24420309f2a8a2cec8edb68fb73a7e44757fd48973c2f", - "ed6e1d7f15de437a8538d24096530b3814753024e4163879f04e19219e340efa", - "8f60a942635025d39402929fa424e9b0fc777d29d12febf247d36c4894654da5", - "d90adc96429a5141a62c68b2103e19b877f39cbd58be2da1ed27fe9d4657e3d0", - "4df9e0115baa2791f3bc9bc69fe2b15a69dd50e64a88d7053bb3cc2628603f48", - "adfd22f37df7186863d9134198a5e8d6c868c46572db7a98e5ba1530e1a3bc92", - "7b0abf19d373c505146c01cf4f2a6008504a1ee2b8135ddf2a34260439ae64c7", - "e4dec6453958ff1d39193d2f88d05623177becd0df2b03437223c0e9162e1e06", - "006aaf272e2f1b69018d6d4c077a3721783a7c261ee932b403188080e54a7d49", - "ac4830b576b31ffd1147d4ac7899998d03ccaa2f4e124d0bdc763750743ba5b5", - "9aac6c92db099634e035452aa53568ae20a4dfe8a7dbe26754c03007c8d29d42", - "3f3fb728cb939987cecf788f6af8d9caf38803cdf67cf34de461335d6ed4eb54", - "2a56fe13cedb61f454656e698881e73a91e49b7452091daa64c91c1c3858e45b", - "77a460e29ac163831f6952948a0f2788beb687f9dfe5326935cb3a835749e466", - "e36b94604608cd102b3742214ec320ef594a13a8f00d24573bf97554e78ff7b2", - "01be4b2c9c205e95a0c4d7580d0333074b76197affbbfaef716ba1ede76d03e3", - "e539b19cca80e65ef9e8f2f56a521a74d6a792e72da9c198efa6790613c8a10a", - "e826885057a182d7f4a0e8a1660f53e3b3ebc461a41f97daa8b35faa62c980b7", - "f23cecb6266d0a9b669295ba6b07b96e0cea3bb642aed203aac635cda5653244", - "4ed21e6d35d4b99f884b30bfb5ba31997b090cde7d599e8607568a398ee98236", - "db50286a6192e41200cbed55519f37f5200ebbb5548f33be8eccb250f7cc3437", - "3afd02f422041cba2d8dc53655536b15e3fc10df0e7902b4895b6911615b8384", - "2214954633062dafb874e9d306ede1dc2fe1f255061d5624f536ffb3ebf19033", - "b8357d4df3d7debf770172e22bfc38af2e12b9c31cfdaaa2cfb9dde3d02b3920", - "fe5c8e3147c0c3167a3d5e082b1b0f166c408d9a4fbadd19edffa631befb1539", - "49db0c605f351a095a0a59fef993913c900752333fb7cad93c90ad37f4447921", - "f80f8f0d198c674d1960f619e06b213c004f94dd56e675bd129d644f7e3f6b22", - "a3bc6f876382c7dd1bab07f684a6151104d27cf704ddcf124a11ff9d5e0447aa", - "b09a610d34558b731596ee437731af95d073d0fbe825986589fc115760736aee", - "0e917624434c11945f35f2939246f7feba2f2cf8458e422ff2d84ba6ae4ff46f", - "628715ad5a0b6bf4a72421cdb77b6b28859d22e6ca28a0e522e5e9458e96ec0b", - "4c0c5a1554c947d273c322182fd899620d9d4bf4b4e8f20e826c2ca45bdd256a", - "7ee991607adaaec6a52f037df0c3c42f379af06d47af11b970240c09ad7176aa", - "7e319263a5d866e8d1dc614bf5ef53da3c459d7b658ffa1db7875c09deb9065e", - "a51147cd372de7160aed7de32373b503b50285c3a918093496ad4c54ee4d8a8a", - "721bf207c8b70067b22da432b8469f3fb031cebbbb36d9303e1b1b95b60ed839", - "2f78cc732cbab576500dbc6c5856a1f4fa2bce5d8eb6743cec0f029eae007ac1", - "6dfbfb9282a40146ee0c6655487598aa100db74c83061df874d69bbdb2556ae6", - "dd8bd744bdc83c9feb89b08bcc4a87d807d0e226b10dbd1392f5f2d6650db105", - "58c66503f327fed4fd85eaba957610313a1a2993b9efd22f9f16ebd4706d686c", - "f73d7283bc0cb68cb83152494217fd0974155e3baebb1a1e4b2d40001a540752", - "0ddecd9eb9fbc9a816c3112b487b8e6dcd7b153380220953e682b0ea403df0f3", - "68bb0a86a4a0d77ded80d1796ff2c7007c3ac854af69b5754bf0e20fa38d45e8", - "346661a0fad05d39d5246db17c72bd56e2948e45bded6d476640f106f92af961", - "f11f32e78e6e3c015d6b4aa6fef42441410c3bd3470a6fc891595cce5cd1cbd6", - "33d58e311fff5d66eb42552974b7b1267f60524a19f47f61ab4e720676a41d2d", - "8138fb09a2fca0100d48842f9e52a97064afc63de8e7e78df59ec63aed1de124", - "0c14632cb98dd13f2d0dd09a7a774f6ad90cac7729b6fff7795bff6ef6d28089", - "6a42b924e5ec326dd2142dd5c819ddbefffb459ebad8bb9af24e718e89f22aa9", - "2c94ce74712575358ae3f8add81de94c1340328c87f9451b5f28f3d187f42e14", - "703b6cf555627023a9729e8fba7d13b79295ef7c0268890ce491a07ab2f6d68d", - "1fa12b11e52a59a215cc9531566f41ff3c8cc07235d75c0242ee3d6811713a29", - "caf9bc47acd1cc61f3eefef14e12eec560b7f65deec882e9305a7749ff551e5d", - "60682d7d78e6ece5fa9f7ae09c224255aad607953c5333c08a13037ed5cb386f", - "1719fc816a011b5f90bb58b08d7c15ae99f8da65cc80e96d1f299d4bfcae1efc", - "33697315be427ae2a2f42b424a028a6f8b6b955d23e3085ff26973a64e2699b9", - "579dc8f0242e48ee8ad127f82555782ddac4733c90e19857acaf0691dc355c40", - "eba0147d0a2b981f2303dff139801248460fdf44cf95494afc95be130d7dbf6f", - "97a67dac5f9d653688258b026cf271d8dd73c0157fc39644ecd38c477c26ac12", - "b791464ab6b420e00eb15c14962a6cd169e4c3df2e18fc8ca85c0aaa851783a2", - "8680d0017b5db05505e4a6cc37455ca9936e6b77e6e7288d8203f3c1fb804507", - "0f23ff6e5da6c1261045173b24b953ee6c7581851a4aaebb46ea9d782f91c7c1", - "da25f6affc20502d71775eee68b4368364e5113e5ab8c3210bda4c707e82ff35", - "13fa82fdd30e6880e2beea7b75554b00cba5a1359c74cd4208b9f8be01c4aa44", - "005d6288c68a0d5c2fd50cfaf6749dc4f7125c89db118f173606db11a2527536", - "29cc15dc6143b1084847aee3530e3933da913ef1b86f08d58d503e0a60013722", - "86db1eeda1ca3f9fad8d4bdbe1c48a097bd5dfd10285764b3541957ccbd4dfa1", - "2a575e548126c134ec0ec82ac18bf8a41779e6c3bcef115b388060f7bed85679", - "e52ac4e1e7baea759942808ebcc379675f097130bbc284450483c80d4174bc3b", - "85d30b7ce2880b2958c16abc9505aeef110f1877b1089bf3a02e8f5689ec8a21", - "efbf5eee525da92a8486815fe8edfb695dd4b8d2a8c0bb5e46010c1a7670a6f0", - "63a114b158f57bff4b13adf9da54c510b20d0aa48634f1dc18c857653226bed4", - "6c38f571d69918f8fe154ab29cc1655c16958f720681426254ee6b2114427a09", - "7f44c00638f91ba25470aaf76a40bba5b0a963323bfdb90df0164afb1afabbb4", - "853b4332a36dfdbd616eac1fb16f97f1e603917e1d39494a9879336325445bba", - "f3c542c1bb1e241800513cf94f656aba18381ab279934d3e289d7081edc4e203", - "ca76435c4bb0ccf3989959e291aed1dddd8c4b241da0ae3c5371b5966710fcd8", - "4b3c798620db826b430e61f4952753e2e2f43002de834b84dc58e1ec7d15b06e", - "b2049ae2dd931ea08874ad792db8c7327948ff3932e35cb26214d8af4f4417af", - "8308d77b6abb06811fe5232603cc0f0f737b981741ab25cfe9d854b4939dda0a", - "8e78fd17eda611d01ef38a181634e7ac0dcef5be9f6fb1d945062f60255a55d8", - "f05105e9876c07c5d2aa5fddebed3659d421d5af352202f214481ee239be181a", - "723d48db1f8d2687c950c067d4fdd886b109da6301f978b2be283e1b86ccf90a", - "89c4c8ac9376098eeaecf7eda7668b37d7001978f640ac58986b07a3c9e63d75", - "a2cda8950d26e6e7434964f775911292422dc8ff710fee8b1ddfcc3a24e27586", - "d208c4ff059f9a458121a1f6dce5573db5ab956a526bf5e650e3f9f4fc5713fa", - "efd183b7dc3cc53d9512c5ae568a446a83c3468e5d76fac43bf3197b2eb10521", - "6cfece742cdadad1b0778840832241a32ae5758c4a572dcd1278a87ab7fbda73", - "b423cfc0f3b568af36f38c249c6b6eeb70b36e702e67eb7a79a17344780abd22", - "894e6d647a7eb622d60daf4d98ea389f1c6dcab69c686871cb77234d5393f513", - "d650f0788d86cd55fbb09a7bca5bb739b44ae94d0b020cfde2b4cab2f1048ae6", - "8f59007866ff59a9910bf2b15facc6fcfad72d6b6e650067f21352ae0caa5833", - "56e4fc04aca60295fbcdf8fc4a88755e47a4d47d10b2ada4605b6b603f139327", - "237118b0a508c0765fdbb447f4ba1d05d955ccbeee049a2f499754cc64488625", - "b0652d08f4953ee9e6fb4b00cbb2e7418b16df3265ad446ae7a3417d86f25d9b", - "869f831bf83d6597fb545d8532102d1cf44ce1e3721d260459d7aaaa056126aa", - "7b90c37f18077013053987fc72a03ffd1ecf6c2abc88b4d095623f591fed6d8a", - "c28687149197126d0648dbfa52f202b1cec031a18046bdd912f690880453b6c5", - "6073ddf0d64da76de5237c0a4d7286b7f3b7a31f7e2ecd0666ec14421c43a32c", - "44dd24e56d19b3d3d140ad399c6650d94da35b97159527a34db44a408a81d9e4", - "daa188c1f792c707a69c8bc380160131b8b7e7f816d177f6e3054d31263f1482", - "a8f4c776719618ffd4fe6da7d1ce6165d1d95bb69a184c219e95346b5ea4ce74", - "37f6f33e891fab28b6063eb51f34b49a80b11f50c3cddddcea457cf3ec4159a2", - "c24ac6d8e9fcde31c8ac73f4a2c245db77a895d21264117d04a301a15b3d1278", - "76f4352245ec9c5001bdc36e92bc9c7fef60af0e2d049dc66f4c36f7d72bc38c", - "a6391a32b3a2a3f7b12ea3260f0dd31ef9b0b1409b46d14fedda8c4ebcc3979a", - "15ca5b4c98bef84c93056aa99f3cc15b16e08d6ea822848a4a90c8b4eb1e1498", - "fd9608cd83ca1544d9876a0be4dfa9c4f3ac148013956e63fe52ed0bdf5ab1c9", - "e639a0e5269fe639b2a5d33b6bcec1e21d197c025b5e6a240aa0ad73b6a91e4e", - "2926697ad2b0dbca91ad6a372c2f46a76328710353a30813f72067c17a32e753", - "8d57ec0066c9ea03dc8d94bae17753501f595ee392923cbf6a59bbcc0570d1d5", - "fd95694e2ea54d8273adc12f5be09937718d6e1744f1194f378f88580161c199", - "f55157217f622ff4ece0f30032552d4e1c57234c4fc3e02080b889daf4c9a9f6", - "07200745effa0b000c05e7b54efe22c1aac61b7c42bc5dcd95821a662b79fbf3", - "b13ea77684cf3f095fd9fa3c4b26d1f4b63f7bb3b2ad0a8439b5532616959a5a", - "e4c1040eaf82e3f2e2280282ae6e2ebbe4d371afaa566423f453b0f8910bb221", - "fec3ca350ecfe45f57d56f7eac961c7404c5ce40afbcc5ffd371033799227a2a", - "2367da9cf8ce7f705314f599903e6ce3b4cca0cc53169501f16af9d94e32b206", - "e05e9e6bfc1bc87af14129015fe727e76a8fec83765c175c0954ccc8ba5c141e", - "0893b3c942b12dc4b82b8449db49c959894f2a67d026e79261675598d9578a2d", - "74648d4c277744d6509ce6a7249fa0f96f57cfd6f6b4efa629814289f52faf7a", - "80c96ae8f1455ca1fd957117e559a404719eee786a76b26102ed802acfdf8252", - "c5a09b2d64b6ba9b6b0ba8056bcaff60778f01a4712cc188db7bc15f59c2f8c9", - "271fe0b09673a47bd74c3712572b2a23d229fca6e0bcff478ef9c714439a7704", - "5280c73169eb93ff3c8b96f9f67efdd6c01a8e472b302edb249c5eb3e23f4f28", - "e243185002b49c24198b57ec869d6c4bff53811a12466aac11beb09080b3af2f", - "efd6baccb03c9e2db77744bc80d29608f859b784ab7e99467691b35c4c906079", - "14123c01b54c9c42040054dca7ec1da5fe4af517167ff3b024110bab7924f289", - "33223e7a68003f960fb2134676da1d396b5d532de5548b929a7441dd6b96f138", - "607431eae614bbbc8ed6f44f1f51f3113269bccf34466f75f6a4088024b76e3a", - "905442d1bcdc1d175114fc90fb5a1ba6b2af84080f668ba88a6dc3bb2e56debe", - "c352d6b3189d0427e0783946ed58fadcd0f4b879e893c71693bc46d98a89d124", - "4f389250cfbe92daceea8c13094a66485cd690fc62389bc30493c1cbe088e45d", - "41424282d840d666c74e61c0a17475134c1fdf9d680bab68aa83c5a171a76fdf", - "db96eaf3f05ef5a0670fdd5668def765e33e820fe9f42867c5f8d710588f2ad3", - "5978566d440e92598f5b71403ff35c4c417dd2b2a3144b22a33e17fe45fd5efd", - "e5456a748828a567a54c4f813ea3d96d366e663f6b789822778f3b355954c50d", - "55a8d008f14d39cb17c6c961d99abca5314bb83d7efbc0922779fa03afc0be77", - "c3953d28c849d40d90b3f1101992e524a234faea75c918737e1503d02ac7103d", - "ddbf0264e0cd52d9d4a7e818fcd6582a4f0e1d2301554ed0cedaba171db62e9e", - "9609386168cb165d0e98d31f4fddbcb57436457bbf6fee7a2792486b357970e3", - "7962f2f4205c54d39b86779e795b06e6c8afd1861b323e6e97b94bc6ad04ae55", - "db63bb7a0a479c318c625451c569efa72440b538b61c3fcfdcc75b969f3d3620", - "fa546f6914f1495f16f24518eb756969a727c71da61c097cd063dbeb3abfa05e", - "a972d39d7500e082134796252d140fca90ea10d671cab4c8bfc20abc3438c7b8", - "fb2bb3c383e2e9e54d965488aa6987958023eb95155e87b1fdecececd9abdfc2", - "f01e6e1ce0396be5d92dc1c29c68faef198b6e204111a254a82950176bd77a5f", - "dfe8bcf8d17750b1a548901c6386585b21f98f79bd489f099b8bda5a40a42775", - "b92319ca8393d1ddfb74deaafd07c2f9cfee36955499222fabc369136287d63a", - "df67013ceaf5174774531383ca1cd15f1db5e680e359e6518a711c9b9c2ec375", - "17f13438f21eb54e5348a9c9f86510e17b6e21c2c12f49b31c836f3555b4ba6a", - "69edcf79dbe037eb6df917a34db3b0e7f2861b018daf16ac295e7a794e12633b", - "cee9cbb7bd80b26ac740003c0e73d44a30090c6845b812447b89a14fc0b81ecc", - "f61042e445e979f7807f68e7af96fb7aec6ca79b219b2051bce5c18ae73a207f", - "7a6af8fda4644e1f8b6add9fe43083ce293afeea59b7d912ef5f767ae8626e66", - "8d74b75bf0fca75df07abe47c937a88922d2032d0d7698f7addeaf004603126f", - "56a3efc8737dd19c56229b31c01c2c03f7f46015738caad5dddcbb82c92325ed", - "90e0a92597f060bdb017d7fc626af679876ff9d6175e5459c2430ffe24bdbc96", - "7aba9103a78d08b5c122782d71f59ecc35d5db400d7078e8b4e0a770079c9513", - "4429ccfa80d32575cda92041db5f93f6d66c0926becb5e5bf0193169aa737dc3", - "ffa5ff02c1b3331d7b83dbcc59eb915fad5887f8f542999618353f6be318ef75", - "838a7c3fb292598f4a7646f05b606eae7fda06027ffb9ea01af2390f8d09e98f", - "ee26d579fc744281c24149cca94643ca83a24d4f12d1d099334aa29e13fdbbc3", - "287c7be5b1be972e04e379d290de6b4ab7c0aeb10ce6584c6c794ba97533a9bb", - "1a115c3d00ee51261b85b1acca3437e3d9dd66f799b23d3b55238d58388a2851", - "f9fc2bb48a7b788a3827aca035cc1e402a585c923eb090393db23bc1658b0340", - "90cd2def292e958533e02c00636d3b1dcff0a3ac03a383b81fd8363132ddbfba", - "32fbd1edd083e59bb78d76590ecda66a05544d28d1d99124ae6e1d40d1e25991", - "b1db009f41e73e36de79438b1cd9afbd31cd06b871c9cb452aadeefe0acd027e", - "cf9f8141f976420cbaebb3f3bc9f5c231c81012141b8c3a79bf5344b6e80e471", - "2fc1b5ccfd12a43d6bd9cab2e31da31110e2ed128f5b4a85eb6d54d7819b608b", - "80c76d9215419df6bf89056267c126149dd33f7bbb0fd2d4acc5956d31db25ab", - "c8f36d08212371bd41b347ee66e9c00fc247918457e037c59fd9c472715bd777", - "be9d23f4ed820158d862982d5b3b82734482f3f121b5b3248fda3f3cd2f07d27", - "dab5684be6abcf4165412aefb84a9fed190a9b623a4a1906434f7764e87dd16b", - "ccd23d45895b11d07b94312ac5abcc15543d6be0757d2b83b284749861cbb988", - "41a5d2daa7bb409142cdc80afafab678be3f5916ced1f60171f4e8398e4f8484", - "24bb134e730fb112696898257040c17fb9de7d8d39197b9746f08ee54b2c5791", - "bef89711084134017afafd078ee1b91d0b7c9d145bad890d0ee061e954f946ca", - "31f618ca47747581874ca6d6c7c1f53d890fbbaf6918165b0419c4f9c43e3967", - "0ee057a9c066e05895ae6569a4d67b840a6b35ff3574eab35d09824baf2b272d", - "936e2094db9eeb46c415c19c42b9712855fa7e6e4fe469586eff8f734c3c5f8d", - "19f9db0ed4a5fd73ca2b67149b4c6e3e9f886f850ef9acafb95a4fee28e80c94", - "1008c90a09e5374f6b8bcd42bedbc0597a4d5bce0f5958162cfbcc87d20d01df", - "2277485c71f77c88d3242b63fe764c8c34f5fb9906e3ad3c35be3f6bb41c445a", - "c94d3ea2cc84ad486b3205c7a442c9d5b004ef0366937370cede9fe045cdc0ed", - "d5bacffa9348a2621357943918c1f5b787fc2dce9ccf29004666e6e7a1be9b0a", - "62fb2512ee6eb2af40df1927f4fc3aad37b98872ea09c01fe1b786e8daafb5b6", - "78c6fd45f247a42d126b499126317591b61e3f77bac9a18e6786bd8f1a9db135", - "d610274edea3cc994b6ad607fdc0ead98b47e2187658c3169d9d933d49efd9cf", - "d4ec1143da69cb8e88d06cbc702b2aaef0d704ff7a7f9702b963d11946281fd7", - "0fa769d15990abde11e5a7c2bfe7941c90f7863b2d77df55f3da90202e6c8c53", - "2874d985bf6f89115ff1cf747ce55a3ecd00056accad7bed0da910896d0c5432", - "98048bd6cb65c841844df7d27bb56afa19908d2983d15b7255c2928b7e7ce2a4", - "daa3cad3b5c92ab82b440546796fb0b8d2c3400a337f9a1deabe7955f07eb113", - "ed18d18c1db7b39a55dcfed9ea8efe99f987295ef5baef9c0abdd58271eec10c", - "479c6008c875224d4a7dd130d2fc7e9629074fa67f3ca94c7b575f536eb1b0a0", - "cccb06fc7b047894853511f138b2846dc19d91dc0108f53ee7b215e0a1a7cb5a", - "8874db4b8f638a94d3c24735051881fc3fe740b2c8564c0bae4ca850ae8a1f23", - "c63a368709d53151600922ce465c8aeff4d9ffb255fa63415e8bc1ade8e7f0ed", - "9f64274fa4bddf67c72624255acc11f0b54b252dfcb316cbaab4b7d9b0f0fafe", - "e8aaec291e44506fcd3ef6a799b58d31c266eeac305f8d24b4e12d705aab7a18", - "fd9dc563f508bfd273cc1f6fef6e6ea67c1576bbf7df34c07abe717c2e2ec017", - "b902426882c106e420adff7de7d444145544a14e4e9851773479d115aa80e2f4", - "dce51f9e40c5d2c585098244156d36a425c3b899839b34299a22d57fdf554d42", - "24d598196f363795021f2513f67b20596372169bafbad819498bb7812a446fee", - "8ef0ac3473684072a7884129f78e20fd2674432080e94bcb1190ad88d38c40d4", - "4123a1674aa876cc9bc65d3167691ee6406c6991675e76a6c44622a14258a787", - "3b2fa440a16f960f9e957760163c414232ad10914e6a536c27ae66871a07c7e3", - "d13e8330a950b047d4192a96e64450d9922cf5f0713e212fca386a7bd6e02ed1", - "6bd4dd8bf9c32608353add4c707c87ef055836047decfb117dc800c0d2bef9b8", - "445c7db6b4c2f792ca21ec94ccc992f42ef6899d05cb09c5495fa9f85301e453", - "560877a5bf324e06eeaa33924fd03f779c613da0412540f76a4b52db336c6338", - "bf7e60682f626870d8e79cdfc4b1c1bea389002d08979e53380f3718b74f35aa", - "758870c45f5ca5701a7bbc78dab2c2a68cb07e0fbd6ebdbb674275e20eb2d1a8", - "cf661f12bd193632ec4940c8e4add702565624596dca4a8a4975e719b6fc4993", - "f2e30d004aa7c276583f1a477d53eda4dee3f52050f7c138bfac7dd9492839bd", - "cca4dbdb7f012a13386664faef4091766453ba03202df9a17aff793c1c3693bc", - "818b2f431635e5940b9ffe54adbe2ba6cb541ce92562443e07ac182c52b8663f", - "788c71c1aa5d5ff58798cda9c56b7fd4c2a89322c5e805844a301a303c96737f", - "055dcf5eb9d5049aab76fe8d3a4ff150a41f510e3aaa4e1a9b9ece60ba3f769c", - "80c6e2704c1ef4a2f45484ccef5fdd5d47693178b2a29f93c027dc94e770c0d7", - "6ccc45f1e9a4bcc24315c91c56ea872a06d38523856104800b0837fe8f232ca6", - "c1997104c6d8185da9157b3415a5602e946f1cf434e2aaadca499b686561e50e", - "981bb8ea15ffaca70cfb1e2c18fc4832229c6694caaaff37d5e665368a40806b", - "6317b3c98fe3676372da85fc97c01fbcb4f128791ab1150677fd3fec9774570d", - "06cf0c6f42465591ec355aa8a9aee4633150ebc331ff6b3305ae0f92246f5882", - "757467763cc0556d1c9c868a769faa29ab83a1b3cb751ca19c705dc07e08ff55", - "ef0a081d1d777746def9f5dd8e819b166d1059388c47dd0a3fb4f427cd371a88", - "17c7171be885b191da1fe0a5aa13f4e2e0c90117f4ef1e052bb7759c26fdf681", - "b09708b63b1957a9913c25a7f4071a0441883f798b514ae5f93a7994d75a2302", - "cc0d3322fc62c7fac9b78d53e6c5365002c59aec0933d7751bcfeecdd0decc4a", - "4cc882eb367542673463e57dfd79836daad7489598d963943fadf9d020b61f49", - "e97bf9890e54ed53cf9818674422d64fdf03ebedfaf5123e5187b97e686ec521", - "c26f8df0b710f91415ce377bc1e7474cd0f18403331d951e6e074b8a1b878737", - "63ed17ce18c20c44c3777c23132aa6672039c34567f852f7cc85432a23d9fdd6", - "3be4be972bb6a55e0e3d4d4e44b54045bc3e01dc574f32dc39ec37f3b2a74194", - "a4020af296a54d07d876516217a8b558b8ac803a60cf2928c5deba881d2d3692", - "82e55ac504d6a7d627aa038a107666f107077a60722d92a450fe57cb4847b27a", - "4c2572fce9dfb156186a47182b5949b7b096b63217c55cf2c86e43aad7f0b8e6", - "a324a6496e363c47f42c91c075db5609e9a1df9a86f7a2c9ec1502cbee54720e", - "5ece0ac5288f3d119cb8c02a902d786fd8f680bd47fe1cd6381499c84e1beff4", - "5e5c8a6c6ce99a9ca9979546d2c84422eeed9ad2ed341e18911bd472307c35db", - "8191f71f7f5d60fb043e75b32c1b51d8857a2209c9a93885584aae86f60d2d1d", - "4d05cd9ecec53a494790929bcec3152594b5201dff5412b545fb51927d06930a", - "a2decf566c11dcfb66257ca196d83a31316537a233ba505bd5b894653dcc4a3e", - "7a1327222987c31adf6552651f88084e5e44968e545610ccdf4af00e84817340", - "9b48235b9c1cb076161965658d1c24d50800f7eb79511e691221656c1f54d4db", - "d6f72095e2e3a27010920f61eac635bda045eaf5a8ce8dd59eb453539158f91d", - "58a0101a262d739538e2bdea1308b53e67fb671bd57205a66fec42d8f03ae28b", - "0ae8efe08ecaf818550ae6cf2b6470a202c04b3ef76347c950a28dea1a87a2bb", - "31f8b9c4c2c238830bda52c8d6b2364083d826194755c1f6bad4e20966120533", - "bf305272e0a6d56fa3ce95224737f5744b377434e4fcb0ddc30311b7f60892eb", - "f8cbcdea54336790b76b70330fc5a434ebacff218a62d56eb579129c3252b93e", - "e70773925b286e6afb2a9ffd2603ba2730bb172cf8dce668dd4f24c7cce3f153", - "00759ca688b87c50aff957a2dea4df6e58f6ec03f8a0edff584f1b090504bfe8", - "6d0c426e96e82951e72ce738c8d1835b86de0f22781ba73b95c4366a164284e1", - "da79ae1577976c5d9418009cd82f5b99b3207e44117ece875bdd28bb203de34b", - "d4a5520d2ec12d142ce0a13a6e65cea30eea04677454a2093fbf7bba732276fb", - "513816426c208021566509100ea39c768179fb603d59a81dff0544048e00301c", - "ac92cfea4fad0377a899db358b6dc0d015f9ac0d73028dce75c5edcf26fcc5c5", - "21b6c47b12c370c6ceaf5c8cd41cdc7389d5209a9db9f9ff32c368144481f023", - "da200b665f59dcc131a1340ecfb219d415ea25cf01b84e47130110682a99357a", - "1bb12b39db01d348e932b5164044bf9067cb9a3e704bf5ea69920a00843e0852", - "44ce94a15faccbab8e16b3029f442e851828a89f7f9d6eed7a207d5872fccec2", - "4db38096dfb7b0fd2d4d6db1c6946b95197e3581eef0d0474e7849e659d84f62", - "f43bbcffaa9da1d6198df8f5d0fbf9b0531f65f2c52f11d04a4421dd09613ef2", - "4e7c2fa2f6c9b5737642058e467c108d023d084e25b187da98e87450f76fd108", - "a02199dc6a8495f12614b9479205b2903e12b7a16c9c6687044f7d0fc77bea6a", - "be0f233407616ad98bf4e11b3f30052d7eda960dd9ca42991774fcb0783c9077", - "5907c6ecfd2da496aa04b8d741ef3464313708173c6b57d170505b6cc27b3e5a", - "f9462abedb35e5a23f2031caf6f8ff549081fada9e108652be6958ae20e28b8a", - "4215e725cf7da2bc9a30f433f94adf278616cf8135dd85a2cc989b6aabd0fa58", - "54ca897b4ef95c83528904218c8fdab787ba2de435c4d10606fc2ab445a8fb66", - "c71ae18f9f6ab8b04c0a850c7e1cc00456f35547a2e8622a662862aaf9992af3", - "723b40406ae4eedc93b7b6d28bf04bc95b7eb546b97be0a771ac7befc7f4deef", - "3b3d63c35e86aa06b95eb9e943d4208f78d2c7beeaad067d6a1f5b3409b26abf", - "ba4f60aa1c7fa62b8720398c3fe7a2bfed0e05e948f823b351ff1656fc8fae96", - "28ab6ab9fa79fc90628de7ce140ab84a8682278a8e88022d443da506f9b8ca1c", - "6bd27dea52c7228e64e48dd2b774edd5976ce1867eadb55affcab13cfb9818ff", - "03cc6484a9c2212367e1d9e2070fb08ec4928f49c30dd9b133b69f35a8dbc103", - "a4f7501f785be415ae581ada2ee4717dd6d25d7d54ca5a4e95c43a7ad70775de", - "dcad53a1753f8b793b891ed4fe6c36de5da22ed48f029abc836f3b4e0f033587", - "4e9bfc306ee5b667f0d5eef35070b8729959a34cdd6f7203261d254a6a70bdcd", - "56e95fcefd46029980d8e518872da268a34e1dde8cf2be516f907c7b491beb78", - "0e41aac4d5c865ab250ba91c48ce2db4409a2a9a7f6adcb197f4fa5d09dd642a", - "401d03f7dde1075d7fd9572d472d549d90e6ce9caa84aeb0f84446a50fa6c23e", - "86a0ac2cabc555d285c483fae23ba1b610707361a422db8cbe1b70d5e9b93a36", - "955e4e4878a3461c3e4db7633139b156cb89380bf5baf1208181d041f1df6fc7", - "cfb7c0d71cb6de52afb589489419f18791721d6b67ea3c4681fe451616573fb3", - "ca61e62592359f57d8115ef43b1b2a9aaab9fdf176e922c6220b4eae35bdd06b", - "384e0e6a9f9b409338f788e9ff70f04db20bc55eb6fb5979f20ba9850db0c89e", - "7fbb21f0c9a7bc0526a9b710fbd3e7661279a4269ab4e3d06bc0e72e875b8fc9", - "8e240292bf9660ce829a48673dfbb15e26403b79dec1fb713fbdedf0596d3568", - "3390bbf6c8c8f52daa1f76bfa9c2915aed74a36eeed8f50a91cabe0f45576468", - "742fb569e22a0d829bbafa6e84c3a65a9e55e14d669d153369dcf6cd17fedde3", - "b43c130b3754df218a5a177acbaa54f3d1d0b6189aef4fe5e3bb19da2073c572", - "e5913b6276c295434e3f5dc38b1baf2bedd749d0c8c51801d933cd8535fc1ca0", - "e6efc9728a19d0edb50b26f8384f3996d527269e40b484b6ba9a4c177618c4d0", - "a78fd273f514e6bc15ed7506f23974e1ff3fe83c8d5a455a2f5bf4b5425bc384", - "bb662548bdb53e05292e08735a5ebe4b8db611503aaea28c8319f9ca5232520c", - "9ab7d346172f93eaa4dbee001990c678e6528255f5f0bd037c29ec53d0233beb", - "f6029696fe46746d99b0ea9c8617dd355752f741020193b4c2ca1d7d542c981b", - "a1c1feef55c71c8f1d2f5a45bc1d3e4883ad9e46c33c6b1a73dae97ba1f550dd", - "bd10ae3febe72ad0fdd0870f525a1437f42b827ec8f2d874221cfc695d430ab1", - "08a293f4fb8f952bb79689c82f25ef045eb14f4776e585c73e09c4f80488574a", - "9024fc460e2ff4a9e34bb16c632fde918a91a9556ffac7580f97f5cc121285db", - "18af75680d8face92705d20e810eaabcf8a3f52b886e24636954c7328d9ac95c", - "0daa2027d806c661bbdf09276ef712d195581994947db9677bd48385547a9fe0", - "36fb35ed2b8d648bf5ad27458617eba1c2ed7a0788e33b4565c487715b9b4cf8", - "1d3852355a32916dd2b88892ffc64b80e413ec637b2e0f8cf1b3ac4898d2cd06", - "2360ec290a587c611c182159c0acd85d81cd9d2e93b104be91bb2c0ad376715f", - "450520c9a78798e75c0358e120753b407f0167e7a75b033e99096fdb82eb6ceb", - "56edfaa2091a305f4e8601d235e69acf66ba003ca4ac8d4e2a59a26ea02cb169", - "7830b601b6e963fe14293c566b0a213874c96a946808673670aa4623ed28b53c", - "20357addbd99e16ab011b904e15b11146bb042ee397b10e41f4c22d211378e9b", - "a3f62f56175136899de051ac5ec98dccd320813e87d8f7703a72243d284641ea", - "618625a995fdbe6210565b69a704f7cba4f6dbf2d8c40980ede08b021e95f22a", - "1e9afc2928a19ba3a915e2ff84375dc2e27eba457a10bb4aa3a1a4e792fcea7d", - "d8c620b323149eb92dfa673b48eea0cf5a3a7f93f1669488520ab320815e6f8a", - "0a8204eb0f289f35e01c4ac9d6e3666d7baae4033be05ace29874caa1aa59ff5", - "ab49b4992078f896bbf60266ba14583193df42ad79c41a1f76a21e2ac1051961", - "7d090db8cc5105e897a0e5b024aeaf1bb539479bd4a9dac99b3b07b34ce60111", - "aa06757ed8597d899b2c9c9bb1fde1346f87d3ae9764b12d692df3ffc515ecd7", - "d43c6ebfa080a5a0d856bb926020d20d756e8d32aca35c6859c2efdba46e83e2", - "409bafcdc91acf84b5cbf24aef29a97246b53d9e2aa1aac056e076b7da38bb56", - "574909909c752254bfb345a5839d5ee5eeeb50c4bac84c7e2935ff9d58158982", - "be6401f6e2ed12b6e10c5eef9df0f97a7f723bc483d1e9c31fe2e97bc6081c35", - "9b5ac1b2e4892eaf0bcdac4af1dd64471c39d130f9c7bb3eff04391a792d67a9", - "a35452e829b725a2e793c44ac3377c0a50daa212b3784e6cf656068e19cb688d", - "3657a79d665f58f9078958e45f26e12ad5ac92f94510a529468ede56afe0bce0", - "d506060ed405ebe44c14b8c9e6f31c1b1cb4ba386a8143a902dc1d642859db31", - "a78ddbe92a5a581f03b7e76425b46010913b4a60a52bc5199a0ece1ec9cb412c", - "96a568a8aa5deacba7ab1a6cfb65bb90ba8954b5aefef0813f87cb954c465653", - "18bd03fe2ba5ab7a853d23c4d6cb518c98b11a8bed2ba9ae8601ecb7c02d1148", - "df134ddfdcb83726f3eb594e1f3fcfceb521e71fca4aa31b5a1b636aa390bd66", - "c26a6fc5fec2a5f657b406a260ace1c87b944070148a629a73a023919628c8ed", - "9ca82d31835bed9fb035d63b6c9b1c8a19641bcbf7fdaa5d482d2af1881ae5d0", - "643c1b0f1bd03aaa5dc871d6da7824607e9713c51b27b6af59bacba144aaf28c", - "2348f7e1da9cd162c0c5d2363b6c1f0879cdcaad8fb11f9c854fb04f99af83a6", - "6558f6438b6b2d8becf4362e9405c8419bee1e03dd34807713f296c37756f2f7", - "647f4c6c9ce04b119e1c864389a0e1d7c24c7e98699c447f361589d7b52cbdb0", - "445b743c2a008865163816789e2594e413314b26028f3cb71c7103c85381b1c4", - "181fa5f662c3b64e4912bf09778c0343258747f822d23eda8d98e307029a2b94", - "fe2a69cb54619aceb453ef5d77d882edc48ea97f772bc0c1879762ff3018d16a", - "10cdc6cc88a9705f13b099fe000d19d276a652b90bf91a02ead0d5169ff43492", - "f3d7ea6147d98ed4026687495d5b216779cf74405fa79cc6c7ecc37bef7f0e19", - "b183a6888667db851b5d6b94db74b11979aeb1bc214487f04d42b031f102e82d", - "edfd58388f7024cc606e4d08f7abe9d4a35369e1a761755ea5f8dcb3d29eb521", - "085b6a1d0c95ed977b3319a727bb18c6affebcfacc43c3f8cf3b05860c7febf6", - "95c5577e83adab672f06079059e3bcb65f3fd6f31acba9a469e93247793a5b5a", - "bc8a66df04f5adf679de8a90ebce1312d5f9f4e9276e43f07d6f6c63167b0e92", - "bccc9c2c4e746761c1669e434eb15f5f7abe614090a9ecb395926d07adab4c18", - "63033c66a287b925edbed1179c064fc090339d9105b85bf0e1561b2bd52b1930", - "33d596831a1333d6a5ca6b805d6b1629daa26979083fbe720cd73d54435fdb83", - "9d39ce9c508f388a53fc857f57405ac3573d3e2c1fcd9b6aa26bc6cceb57babb", - "889d204534734cef3b408efcd80ea556356b7439e063d85bfe129784e7e68532", - "bfb26e55f88e9c9b80159c47930514ed2d3657625150b7108d2185dfaa5c78bc", - "72ceef906518a461e013d326b8f27ab12da764222b6871b6981af834064d7e27", - "44ac4d655aa6f9b967c3649159c75cb92995ff4c6e55e859612374fc6c1ff43e", - "074ed3905120fd0e0e82d44b9ca0252d05379b01eecf42883e4a0e7f061022ea", - "d469fb346739f7322870c03dbb7c3cf2d1ac82d4127d1dc52a55f043ff804cf3", - "90fa908e089f469612afd830aeb5a727f561e548cdd001f3db20a0d4e846f4ac", - "34bc5a1a2d87e077446b1ed03898d2b7e121de98617c37195f5aa02f1f9fc654", - "202d010d39746f4f77c13e6554519ebe397361f8cd2d53340f633fd09a5779e0", - "671a431870f305d57351fa329cd88cfcc99a1e064ac36c9de2405e2fe7ca7710", - "168548762ca2c6fca3ac10c5482bf2f9bf6a6fd08f1da05cdb7a0954ab21a074", - "0dc0d46dea8a0ac00facfbc0dbae99bc1a71d8439e184d92ca9a3eb78ed2ca25", - "0e1bce73424811d18b584febd8a5a50f2aa4f8460acb1e7e37accd256b7fb1d5", - "63b520b861f2fe4ed14ed78708c95b0388e25a645057c9424ba8eb339299ab4b", - "c1a8bdc1b6dbe8d9b1acc5c42185d77b613667ff2d8917446ad17f2e04340db1", - "2fcc25fc04e2c9117e4e9a3d4d1fa045dd291d9a0f2547594d1cfb33c6ff7651", - "618cd1f07dce2454d60d9619d83578eac23d220c236b53c150dd3986a6b3af21", - "626a7271f6018f736d3bc88065c0cabd1fcaccb45d9b1c08b7f350295d568c72", - "836defbcfbfe06a15702ddf253d46dae083e5d85454514bf0e59969cb9e1462f", - "2cfcfe093d9a55d8df5fe990010228f3ed805cf82313420096bd7fbef7295b1e", - "6ba9c6ff90b9543af1c0d5a1ff29b493b7758aa061d86049b8235dc1a7cfa56d", - "0f82e8a391d613aaba554084fb628c7a426216851a35e31979fef782de2b82d3", - "094ab01df6dc5206cd90b585a4a894d7e7a6d8d8e42db3cda6ef2baf6a490dd8", - "cfba0c318317b44fd24839a3d76aa0d5830cc4243cdbbfe34ebce146c6d74622", - "4c44e3095055813bbff927311c2220536e232434eac60b15da115fdbb8bf660f", - "5fe43a7249721098c2b0fc3e139d46f5d87dca10c52ddc4fb5cc406d4e176c26", - "5cd1ab065b9ff7da3489e961691b20cf3c52281dc84390cc60c19ac02d35132b", - "07555fb1b629bc406963d7b50a25e3857eef84fbe164f8a39c1c6a137bc1df9c", - "8b446f89f54652edb442faf0337ccc8e8617200e116a86a6a8ee328bfe4809cc", - "7fffbf4454f8676c1abd349a13a6273f410be6334f1c840b251e932d2e703093", - "101ae0487de37742b009f457be919fbd9c16d32ba6620ab34c1b831b4fd0d704", - "93cb7ae79b7982c08734159f6d78e86e2cec5c7ad6bb231a9750384ccc303d91", - "74883cab186cdd23fb357f7c370783e738bc4cc6aa4fba0a0c4c048c5e040566", - "479affed83b375414dbf7d2dd3501d5329fd1ac0540f0e2e8853e34230ef32ec", - "275530e2abc28a884e0417c511eb0073900eec4afb8794fc6101098c8023e78b", - "95b0bf1784c1d6f5ff9b414e4269d3e58ae7c14146fc4149d8b55a8e84c24169", - "6be02d87b4d553587acb51caa0d5dd233fd82102945e12cc4b283c30fdd86113", - "e538816b16aa10ee5e2dc4e68651712a9f69e63066002227489432d2a01ca917", - "a618c3ba3fa9581cffb98434e3b15a2b2f7986031701272f1a8c2afcf7228715", - "2a7418d7477c80643afd28568f448659c47abb8a348684a104e571b215aaef2d", - "d3ff9e5d35f47f08abb00a05df2c84be4a83de9664e6b5d222cf6324819720d6", - "4be846fb059446b58551fdb8597941729838d6fce397af9c1205e97886369465", - "9ea4e0fd3b5ad128159287fdc8a71dad290488b29ca35dd7c5fd6dcf7754aa73", - "ebd530a06b46539fbe04cb4681d503faf494181ea123e1e1646392fd0b9e20ba", - "3e1c60a2d2090189d361398493036e6f0de7331e6ce55e182963d9950882e985", - "b0d9404a58ba6672a5ce497ef27529f631842ecbc6b5a284d870818b03bce587", - "d0edb361e560e4ab369a529df615d1e624553f608dd517acc03ee0fec31202f9", - "88f1ad19ffbf5b44a738d8a90d2be5341a368bd50a1ed2debb3ec761f8ab4bcb", - "cf26578de2f8dc5e562b9c7da2f91e297dc52fecd64adb7d2d7a41f6fc2dd997", - "130245fdc53fe1c5ef58d3fb03c0dae52388929747b674f3db3fc887de83038f", - "e0ef498b001a9b8e8d65dd100292fbb6febea725cb5d5b1d06f663b339d8ed93", - "022786b9aee997dfa128aee31c310518d72dd8a48efcd4b94550089ca48b38b7", - "e7d26ec7493805920b8008253ab7dcc4502b64ec6f1ba895b8e05bff8d7d01a1", - "fcb81d976923db699bc673e73f6b4a1205b1e36dd05aa4c2c7b81517d67139e0", - "dc17f7cf001679982361b9382e41762f0697d5a096740c80c91b60caaeb2afb3", - "d27bd83372a9f336d4fb4c78cfb9a311c3bd3ff42339f1d22382f36b8e5e1362", - "eb9d112036d0c4d6802afcbab9977f6bdf85395a983895d31b4534d7190685c3", - "6d015c47e5ec29fd21f456ee490827b1466042912f4ed735994b7a5a1f1b6b45", - "5155e91316f72b8caa37d412ed762a466b8a01a0e82ff5238a7a18f6203c442e", - "c0062c83236cc27f4f34721306eeb18fbd5b7c27eefd8b0071bbc4b1765a0e3c", - "f6e4f7f73d2d1c0f72f37fde6f96b94ddc43d5d014d8670747767ea93516f2f9", - "684b21623926851d0b726eae04f3ab6d6677d03454c9f46f7b6f6646adc1fa0e", - "716bfe23fd50802392af9ede3cd48c509b365f9611b53ae753e8849f20de854e", - "267e31032d7643acf2f88ebe99c83aa7c2158827cb7620b367ff6865c50d870d", - "aafa26fe177014b794b553e7d3547dc2cf1468da5086fff8056ad8727c843501", - "17a4595f0dc43cba4f07a7336404c0a6a6cd9597ec3e375a5a285be408273fb9", - "ddb28598223d6118283711da49332c93399931cd4df16a15575da9daeca53837", - "a4ff05b2b9e762a29f4f2af00ed29186fe382c8997e308bf07de69a4bd55f83a", - "4345911487c298e1a4fcf7615b5cd9f9db121c80bcf489d3d0be82c0e00f64d3", - "d49a96fc45178c46248ef4ce9fdf1b198f977759aa99a18619a1d7f1f01dfb04", - "be81525528445e218403df16de0ae66c1429801cc066643497f189fe348a4302", - "2c9ea30dd26a3367b6b810cc58b9130620294d0eae2084b3c3163094a349b69f", - "002424e8078a1265203236e9cb31f7d6a28dbfdc6dcc505c4fb5521b76472e30", - "0950542bd3099b5c365cd95e124c506b027b49d1080fcc312a20da076004f6e6", - "abdb4953da671aa321f5138b687cbc10230f054e052358a9776f6e7fb61117d5", - "a7fd23a79ee6581f81beecd733e1da07d2cad825ef5251252a206dabccf7433a", - "10265668be24c48831de0e427151ffb771b9c136ec81bfcda950bc9177651aef", - "eabb3c67ec92f4c6de583107df053f89cfee76ec41c42a65bb57b73c5d7de464", - "5027c7e1051e25f09cf8443abfa904785ad15f6f8d22e94ef6123348cd794d55", - "68ad86028e625e64009bc4d76128005bddcfe306f3ba2a47573795f51b93d664", - "47fc1ca960c1caeeb1bb953a6dd69ec26146712984d015ea05791246ec349e54", - "acf441fa258c0f69f290cda3af5c910177073dd8e2f6a5a30419b59a88392acf", - "81a1d9a62dae83330227d094b6dd2122145082bba02ff59efe73fb424b09b2ba", - "342426c3e06542d6f5867bce83fc510092edaf753da685acdfcce9190f70d8ad", - "93e056bfca4219c43764ef75fd731afb142a520841addef6e7d7915ddf194b13", - "7fa3772025c622236169a98f32b3a2ad2fec7631c9a5f06e45c68af1e88ca0b8", - "9249e33b7a7b4c6fd10f4ec63f04a4a361dffc875f2d7a2263571bf59a55ac9e", - "46b3ab1d49e6bee7fbac8d292c757aa7da3a6667d4fd9d7c3bc05f307d61f8b4", - "973abb74817c79f673042a31915d4256e32e0678c1b1a341edec9e986bec0aae", - "eb7e28ceb0122787c20ad6f65bb82c36c104bdbdcc8231c06716ba5c6f1044b6", - "dcf3fc1b1ff116f814f3b733fd4ebae390ae0b1a2e7801902a374e024a69c5e3", - "ba458e37eca73c0ba50dd985d11a763ef5605b7491537db6b89d3c54d2814139", - "20c7a74053bc7288f9e09d3b33b07bf29b487676c3b060ab033fa4ed6b3d0488", - "3b19e20cde269f38eb64d9a5059839b49332832edc88962ac024de327a328f86", - "99fa41cdd3e1b007e3f35e9064446a5611af9e54aae7e6f6dec0485029e0be0c", - "74c3358b7c6bd742002fcef455ec6d57df448ea2b8df9912e96765e6e4b32603", - "3003a8ebeb8615ff3964afb2c09b1dc7109be32e1de62432299b66c476420e5c", - "3adab3048b2cdc65527352ee72cf368d15f9ad760dccba4b64692bed4414a2a6", - "61ebd307e8c692a0e78c9f34e1ed9afd6a6dbeacffd636feda8451bc6aeb526a", - "07b346b6ee0b4ee4c7e17c4190c0683964758c98e2c0627d56fd35abad72eaa3", - "2a0ba45c38d86e3b1d0079a51b9e4d7108b61014b21abe1e33cc5f01468ecb35", - "46a909e0315732eb26e06793daa1163ba9fee4a663cf9da4f0827323e4c392d6", - "cdb260d38f6b9e5a8a7ebb2fad9d89f404cd51833864feb17be86de3ae2bf45f", - "03a8c689017fa2d787b328eb6147bdc08a2007f32b77ca7ca253cd02adad6181", - "4524cd5d7204d3eafc02d54bb2509604b3c538d2d86fe744eaca882b47594953", - "5698ab3ce1392e4e11d882af901130ff3971693321082852d16436856bc90d87", - "34057af583bec4a096cdf75f54428cdc6c9acabd57fad91fd90906e3a592c3bf", - "d0f9848c4461939fd03de4815ce3bad80b2d4091348d38a5fdad35685b0bc750", - "c6240807b985f32eba578477da61e30b10536be9ac0b04f0465901bb8a3bf873", - "e893f804a11595004cd6df90f05978f12892bb1d95dd8643cded9873f75178e8", - "8cc7ff44e63af7f56014ef92a89c986195413329b9ecb838150fc1d9632af875", - "bbbf5e3c01c21690efa34185fb68c08b94105dd2e750baf7728e202a1c59dda1", - "a12ac4fc04c7e0e0331bf0f62c3888363292b9208ecd78122a17b7b8c13a13ca", - "ab2a8058ce2dfadcc71a3709e4b2dec080fe999d7f7b4194cb1ce08106ac1b0f", - "6d7314b498cac19c199cceaae50caea90e293773b1e5aa5a2c2deda35bb06e33", - "9f3ff9cb2ab44afc6c28f04e3fa97d1bd4ae23287a37de5756a5586cf3f7a01c", - "309b636f28bb2dcf3903d35584226470f268ab4a4e8b52c93b67f8ace0984e8e", - "ad0f35a55b09134e1babf92914d0bbf6acd0fc2ae7b3ac7a6a854c9bbc568022", - "63929370803e23cb0f294bb6ca93c680c729c051643411d443d77792a4a98665", - "1d5c5a2e3563d03ceb05cc28093648b7aa1822a9657f57bf39b394724993ba3e", - "8b76d848f4a3bc5e2998f9d9c06d8bad5e021721a01f89462522ffb75c43c4bb", - "caa89a3bf716eb7ca1d42a9903c61782ac75587a5a3a3ac313f42661a46fd59c", - "d6236e26c1549fd3ff92b8895858ecc3bf6a2e12b59d414b9188cfade1ffa325", - "c13e79eb998f5a806e9c5546baca2d01776d40119c4b1c40e0fb0ef8bb16391f", - "26d8019fc4e6ca6456a76cac3254f835b28edac1b8dae6888ac6b699e3f5d7cd", - "da6248cd9f7342a10e2afbf39e0b49aef048244181277f1df76f48f498acd42b", - "aa5eac7f8f4fbb99ddd8375660ffed01b9c9f8fd963eea24eabf67487f8b0f7e", - "dbb621ec91f8819e502e7af2512aed65030d249a799cfac64c1013af98b1564c", - "abd01519763a25a9b411d401585b1739a070be5c0409f92d6b6eb1820d85b8d9", - "b0eff91a99ec8b897816727cbbf3d66b013bf3b2222ecfcf9c464abfa7c0551d", - "1e494d44a05ef641875519fe1f97231e6b831a7baf99342deffcafe9be42b87c", - "20f86d2f5c7728a58ed3292bec9c13cc2f9ff8d830142dfca3726cd37ce5a39d", - "bb313270db5cecef62b1751b05c45dce7e0f91b17ea1c836c004464cfea3d3c9", - "cbcb488997237979e3ffee73710898751a93b750f432ff5126c239e6bdadcacc", - "19847e2e1047844579e5aa00335c05cdf4f92b53cc0e9810881d5217e4aa0300", - "b312bbe00f8946fc236f87975d05258c59c5f4cdbb16cd661b406cd2697a9087", - "2807304a4eb4541eb6f9372b88f2eb12227186758d748b7d7c58dd586264e072", - "57e73dbebaee7ffd41df79490752f3385d4b7877caff8fa802cfd0e3e3ec63fa", - "ad926d951936ee13d4ae713e6c6f626bb1c41f3d5022cef73aa33ec9c79f572a", - "d0bd2dc01066c3bcbb95cb910799012ce2f14ecf7efc80ba4ccbab21221a419a", - "1319be8174f1bf13249382d9953884e7296be308812c1bd2b90d272d7713eb03", - "7be13e1de209f3cc153cfe0e9ea1c24dc870f75d176e71566d4af8406558ed74", - "cda23f4c5b288aa6dda63d9b436beab92602ca6c142b8b24ce2c8eb061c1f5b8", - "0464eae9694b209349f890a642f4cdaef75f365a6f2eed319cf513b3ce8a2499", - "7da1130834d32fd52f451b9eb8cbcae593106c0229aa4a83486067fdc7de4e00", - "88aaaa570bea79347807a4a1fe3017154aebde0d5b4ff0bd73c18cd2687ddf0a", - "88780c2e579f357b5fa54dba3d7e0bca59834e8e802165d89495ad78a704e7c5", - "8e0bf71af2eff1b2c9984f664e85877ef29a64621a60e3cc80b0bba5c5912d32", - "0fc2ae29093dcd7d81a39fb374eada94a83322640abab0ea35340b8550680c7b", - "cc3513b81fb496743bfc2ac91de7df9468ffd356895b6f667ee3e0f57639466a", - "36b6d1df3b3400ab85caaa6b6ef528f7c061c2b5a0408a511e4af525497cece9", - "11a4093f36d0b50f00fb122110409b1d41b8588de301591fa7a1fa9415fc00bd", - "0cd4c0ad2af6ae22dc919db25247070df3fedcea05afa4e076b2781a6788bfae", - "c1e149ffe3e258fcc2f5409c855e011bc0aa0b781a1d9dc6ac6c513b18b9e71e", - "0f6bec5290eb8f34992f3427b24f14020b74fa773d0442fc25f2516068c8a353", - "eb09dfc94778ebdea51edb15094d6f408d33b9a583c8634a38931e18f22d7b26", - "baa9fdcbc1a35ad44ec4b79b893fbf841f2f2c9f7008370207c50953c9afab01", - "b203c337bd928e21441a1025d4b143e63be4c2669ca0863621e45940b6d639e3", - "d3862dd8cd2e3be8d96114dfe27ff4add0640bfb7a0fc9a940f8f074c47f3b4c", - "0d27db7cc23fc2c74f3d874a5643572beee3c3105074b2f64f9748fb5559e2db", - "12ca6c102b0d6a1b4274f75cf9b73ef035d226c35020d7f33b6c0f3f1d40c7dc", - "6c8a39e79ce7da82c727f85b0f5461121aa7448f8da167709a294c3d6d6647a7", - "122750b8135d85763edc94559539223a723942713ddfc35a9879112432e12a7e", - "b5b200c4ab9f5e1ab60f450baeabfbb3caf1e524a27feab9e8594bc814f1cda7", - "feca55f614c34daf851e1bab4e451546ce7885dcd3fb6f000211dbe4687ed49b", - "3ac5f094fb0aaaa83ee0d0ad8850316f48eca1dfdfe8af992b0e8d4e1d62f841", - "33547a4ee2e837f3e5375ab68143513cdbe9d5c4fdb983340c2f573e16afeab8", - "00cf8c8c01c6b4e5ad5af9b269daea699d3ee73fa53b79d6ec848845d966fc2a", - "60cf78ec280f08f9cd08047777a6d805b668d7caf9d4bbb5788076d089168944", - "dd911eb8349ad49d902baf8a5a4c97e0ff39200dbf2bd5b3ad791bc8297b4080", - "ab6ca7e2d95599713ff0e2a5addbbb682e3b94a2126a25c2079ac8220560128a", - "98f4506e09be868bbad08420a44f2fd3e9ce3187833160b138327627727dc294", - "78b0a59e49143e89abb189b0b0f0fc7d5fb2ec5b72009241e6f57f7d142aed3f", - "952212cb94989d3d597db8eec328ab07688e61636ff68ca9eca0eea72d5760ad", - "9b81cc67d32f4ad1e9f79e3a3f84f9385da8d6d89e2f7f41b25361a080d4eddd", - "0658d0d6652a29fea10e6de7631fe721e8f4069dd7871ee0828dc25c3ae4e215", - "f1ab34600ea01246461d2706d2e88b9af61a3633e0141f723602fb44dad03348", - "ab105ba90b2a6a9f70bdc3a5a4aaa518188e940d74a1e8dbff5f45336aacf746", - "e7d08fc0874c216d6252f73767d30b0fab9a9c6d7285bed68f26802c87165245", - "2682d7d9c7a633c57bdd82b91d25618a2e892af0c4341a953dc22e59351842c4", - "e14fcfff973b08dadfc809395c822f9897515261fb0f6598695f434e52f58533", - "e6a27fbc6d5c1b0e8ed44ade981d302d37d75106e34851e27ee8a08bab86de42", - "b4822c86c5da960474c9e80fca41dc04eef6b8dd6d3e1f55c02adfb18dee006b", - "700ea46db2ba5c5574a3f8b0ca85000a03f0d31f88f33740e8ad6bd06352019d", - "908a3449f50a210006ecc83859e8a7a43dc4ab98cc3882b13c750b2fcfdf3f32", - "0c81363fbb9e5c1096c101edb15bd8061993b75f37b92291f332dc0efcaba80b", - "ee6892cb99a97b43066c0d4369f9f519c7d2ebfd9b8eafe1777c9a8e21af4aa9", - "a8b8a00864ffd398069bd347711c84b06e8cda89989d81b3ef24231dd52a6e9a", - "64581a9622a801cec8bf20d68bacadd65dd808cf92e28c780b6526abda56efb0", - "31c4fb22cbba4260072c83b8c5b5216f0ae90906622034ffe2dc4faf149d431f", - "c855275e2f6b7db2484003afa52b8ef954c10bb73570daaca8465afec0b62404", - "bf061afea7045941633d181a6f9b23962f8ca849ac4eb50f1289ef810929d43f", - "006d0fd6c90f8686e1643dde9690c8d5ade25e9ce5986a9157201dfc05f6428a", - "bb4dc45093fd16c97d59c7218290b5de6fe1e76110a685efaff923ac26031b19", - "e9bd8570f989ba102d75cd4a89ba0038314fab2c59f11ec3b14b112de471fc74", - "aab8e3fe8cbca64d05759fff6f812b1384d1d7a1129e61bb4e53a0d85db3825c", - "dde7750b2e457fcffd5b2d1198665b03152157fc3aa202aefbe1978d8558c589", - "2d837d86e5bb37d289981e5e03cb7abf6c5b994290bb7c7ef1e221ff7f1e4f31", - "5f86ef00f8662d568949277266a4e071bd92c189e2924d01acf96c1cc0445570", - "eee0a72a1c83ddaf93998800f72c9bca5bf44aea620afb3f8a6bee8300f3a7ba", - "d502cf324dcdff5046239efe359d178128fcdb4eb4ff828b592783d95baacd5e", - "621b7d5a6daa7e34678883731260df3e3363af80eb5918f76b5b4f68e54e4e6a", - "18c8007cd7b469b4dab9fd4cae3c30200518037218b71379d089b4e126550268", - "489ee1906acea2f3c272fd0189f947f48b447ba6fe8537e7d20f7f4ec04b3ac7", - "78f0e509de0428cecd2eb376eb959bcc7de17b7c5aeef81e45bce6bc324339d9", - "deba7e372b70146824708eaa673a3417a96c291be6aed74271bbe6c5d87f0b40", - "6f55ffd06a24703e0d9fe8881c9a8eb994a7e04fabc04a436a9180f65ead6ff4", - "e2dc3f19763ed7c2be776579a3484edabff0e5b6446999f7e96322037cf5ab48", - "b56c9c7cb17f385343f7a95b23dcae7f64619d7f3b61d14637d1dd44cd0dcb87", - "c061bf8756342e12338e4d6f442f7379d8591b57898b7fde66009c7ca3b1c1f0", - "5366a2a4d584df4a2f754a736566d3daf89fce22aab67a4c6f115eeec41c9946", - "02706417be53fb2e80b0ce2b184c83d84ab633277d21fb3ea220d2e1f7e2415a", - "03c7d79ef77046210ae25f97a0a5b39bb64260d82d9603313df582fcb19e1c4b", - "d1d70295d6892be6763d33fe6654ba534f12e0d23cfa09d227bba4bb5b945bf1", - "9e89eb7744d7cff4fdd5c80f73806a4997d49f3db82f74a929274c23bcd397ef", - "ccf20dbc8791982ece03d0f6264eb8c42a0fdb2ed0514c1be80254994cb912f4", - "7c269548045519e9f5b02878239d388246c4eb9446b58382dbed5a3abdce4cf2", - "5f0c97b46d120705de3ae510ba54d083fb6f7545a138a81cdd92342de21a906f", - "3172a96230602a34182c807996f0baf7d1975e22f3e7f96858fa34a7d6861e4e", - "b2d131f1409f2b31f2118858a30f6097b95931be87ee801f3693da8ce9f0e349", - "b5f70c65ba0ff6b1b9c5e9e8713206fc208279882e9a9432fd371620dceb2ebf", - "e21c032397c7df14ff4da5a90151ed1c8c72d39e7306f3a0f1b1897cb8b5149c", - "5bf6007d5568ba2b791a5ab3d31b978860cd589440c9ac7067b0f60c037c50c7", - "6463b4eb8087d1ed3d1f383ec1effbe77cb43773156d1f8163a6dbd4dfb3fcd6", - "ff93af9a6ecbf49e9642eca2bdc25151cc277cd58e8a0828f2e4541031eac662", - "1099cefc77667167fd166d794abdd104f8b0a16c4647eab14c4024f78b4b6632", - "cb9990843f28a2b3dcfb820226b05aa2548a436188ea6179d71dae25591639f8", - "f0afa62cd40a3a7133f6d29238125eaea106a2d03992a3f323022f296187950d", - "3b13f05fc68c3ec520f690690defa14291fe3b70f50471a0015197925fcbe226", - "5eb99710c0373676e56efe0df20f9364b6ae75fe91300d480a8852ee299d55a2", - "2af084371a6780ae465252bec487d7a17b1b9fabf9feeb54524179cca74529e8", - "74e4b7f58d0a2cfb8bb04667235a849bc88fa9dd65af6f951a0e44d5f6cb64f8", - "5198fd2b21600916c77a7d1085ac407401ea2f55b9dc9cb97470a0dcb8b11076", - "0e78e4a37a1ede9557a8de4a4fffaae2759f9b5ec662f36a5b8e58d0f864f7a2", - "cb993bd6d6fa34ddfcd3831e58c2b82ba0f218ee88410b6e419f9ce492cb86d4", - "c8ddf5df03e160b3a1ad1585cc557a2cff9d18c1eadf45d60fd4963e9dae336b", - "36bb9fa3d574597cb24f548d71461bea63bbaa6784378a44aee085cb5666cb74", - "1fac770980e6bec772d4969023823811cf22538c0808c24a758b36f9fa9f4d3b", - "336e91a8a5462b4e33d65c1e20d0c44cc06f6e5c1811ad1ee6821915c0305c76", - "f06ee75cf18953c0c5c6ba4259b1f03f326c3ac83472e577543c1eb21605c6ba", - "6a62f3aea137898bd35377a5d059f51739ecfd975b53641dcd6db035047f1e43", - "104ded790516c9aa5e633befb9615efc0bffae05dac72d2a1ee92f824d4aa649", - "c5e026b3dd74dc29b61bedb632bb4e7477f33e36dd76f0095bb9674b829bd723", - "0f2e7be2fd578bff07d45192c1392dcba7bdcb0623ee8d8d2026e0fb247e8897", - "56be2cabb85185c7b6f625aa1aaa488f210ab25bab9fcce0b26a1c1705ebd647", - "d0f32af1faa6b68515889f7903269a70fd833dfcc479bbc67fce75a7057b21de", - "e833141505e1c3707296b982bfe044374a2d5aa7a42fb837cb196514ddf09ca2", - "e26a4317c90c0fc26b16f6fe76dd4b8c7fc903ffa9a84f65997e1b01a21702c0", - "0e7fc2a5db59f9ed005e4b94b23e4de7d89e522182b0449144b5ddbd017c6120", - "9f755a317ec41c29a245b9bfe4a7be0c9ab4f46d02942717e57ce62c2f08c803", - "623d06d26e07f58018d8d99cce393f105679dbf6745caa1be0135adfe3c1f3ea", - "07deb6206107d2668a1bce59f72a7513eae5db628f9543a75e31649516fe4e10", - "046999a7c15cd659b114e30ad62e231dcce64ad7a8cb2a8e1d07d553ad0c1b8b", - "b497d255f54233a78d118707f36be0decb9c42fc43e206dfeee13c7dbdbc3d63", - "6d73a80fa2629780a89e6427e971f5f2b295395d16839f4b2bdf5657579a293d", - "f8c2bc924ad77dd428cf2bab7a9692082e9c2c2ad50b9b9359a74a5168053501", - "f9b10fc5e5b4772b562b596bcd8e633b6818c265e19363e39cc43f81fb014c1d", - "ed1aa09604506375120eb89704073d77cb98da9b8a533a94d9b42a08787e1927", - "70d28bc3a3748a17511b10138f765d1be3a67b0d032164e274d871367976eae3", - "b7a059108cbf1c059abfbf3338a7d7ca729662cb4cf74cc70735f9f88ef0963d", - "e28ea6ec647c57681f9f8582a29866bd06bbb207ae92875b541f252458d66546", - "5f50cf9a4aa1e4a670700cce9b83383372a15aab25f30f11b9cd74d793bfc6a1", - "5da4147a0e82cab98ac55b978727d68e9e6ccfd9f03b5fe9709ee04c7809c943", - "d90c0318286f09e161c7005f5c97005316e7ea539d6c1094dafcb3ab88399045", - "0ae49da6f3f57bb9b476e5beeb5baf2489f72511d19dec7c0ad26535fa54c105", - "9b1ba01ea13e52c077ebe768e8cc38b17ec0a62b5ec8a0d4c5f369560466cbd7", - "8fd6a04b8a683e25c66174cee759ae4bc68abfa96bc68d2d1ea735b66e31e101", - "1e83f8b839f79094eb7965cbacfcc412ca0131ffb86b8a7c998af6db40c8b6ff", - "fc9198c2e65b461355b5ff96dfe52669e49f9b458523bd490f00b269ba87cc21", - "2c1e8c9f76fcb17d0d83f55a06898c6473c285102a61dc7d4d787f7bd81a01dd", - "f517f18cc18d6c88b386e323eb3833ed405689dca2292aa1d5b1804e7d668d5a", - "879c9e20477f7bd021eb0ce8d690d39ab001b9411145364cf22ac69b83032f27", - "0292bd9a4fae5014f031925c6bab692151f9a9fa45a7575cda1634b84430e4be", - "73fe662e14133d256259d35db666d9a982919b99237a4f689d629e9ff6a8ddb3", - "6e103bf5654593b639ba9839e4cdd10d5f9d73d3e8216b1c4c7f9c66cc1558c6", - "a8deab21f2bffa5a9a498908148b9b71f8eb327d0a10c688b6c17fb8c40b38ef", - "9b9ff7faaf4e7232d81d8aa97f8c2333b9663dcad8463585b71ffa6a8936501b", - "61044bef32227848641629d9aaa92c67b37b6a1a81a943936a8f51499ca9875f", - "dc3452e33be236179686fcabf0ab875dd45c9ff32c3410e77386f815673a1b7a", - "110a12d88d4f345bc39d2492044944adb1fe2608a1190d360e6822da21beb6de", - "e5e3fe35abf0dfb60affb63386da7c72ae17c8bbee87d30db428c21c2d57dcaa", - "6468dea2791ef88de4121fadd4d1c5a52fe828ba0aaaa43eab76786ffd4112e6", - "e969c0557831a12543f754b1045ef2ee2a37f4f8208fa3c4f8960619ce18f520", - "bbab6ac2d62bba6d608740a5905d95c364edfd94e84f4660c4b65333f725f24b", - "a4c2e4f0e38a5aa4df742a13aeca0532acc8badce439f693f758fecd31e0e45f", - "c2edfe415f62f17b0652173000ddcad37903bff48a97f870b771f07e632202d4", - "c0e6d6685225e00fd1a69e335905000f5158ca42f4eb4f8843511d52e20ebd69", - "8f0e1af1a73375dbe62027ee3f757144d082f73ea2302160482d5e459d54428b", - "0cfe8229f787ec3fdcde0a84ef366d2292e5518b14b9cca8733798e4306de789", - "ec8abd7a06405a0ca9137e010df7ce37799fdeb2b40436055e4f6f69a67e8bb4", - "bf2b5832dacbb7760fb40a1e7da71b9fcf5ca92337db27b5358a003221afa34d", - "345805e714902b129b96f681221b8b80362197de79d5b627083b7f25e18f9b09", - "2a59979eb8cc364a4ada4eb59e372219c183553137b860cd05b174786716e4b8", - "b8b75bbcc90d470d6276ecf12363b7e98b37e61fbac679f3692dbebe34c8a951", - "99f1f7adfc176e0e62edfc0ad11ddf0cc48164ef96c61d8b4f730dbb45388bad", - "5119075a93b29ebd267ffae6f8e1d80143fb203656699587c5cb47f5abb54a5f", - "eef64819e02546d696c98bf5fd8c4968c640f990e5543417827eaaa009f762bc", - "650ba984dd5c574d24e6c7872025b4aeb48e8b0f7d672f08f5842ec5c99ae4d1", - "5a20f591099edcc5de1e0d1f6fd73231f6d2363a49b51c9e702679bc8ce63f5e", - "79e0f88220114fc896f4a2c37cfa13ca40e7a10d149568915a198941b7b8463f", - "9364b18805597bf160769cbd9039865fd2541419c5ef9ed3235ca0a48b7e012c", - "4c1a2e6b1fc33ed56d8cd764e394b739dcc19629373a3312f9c613de7cb753b7", - "8ea63b2faed35ce0e69e27f7ca1fc697ef925d9aebcb5e18bd58277bdc23ecd0", - "48efd212e592f6c6ad2e82c6d5e336342d60685df14baddc2c7c0d38545dcf69", - "b823fa4e70b71272b524ba634bb7eeb8c3d1303e4463716ee918af66dd7fe019", - "45c28f61530f71ca40489a9a1f616e31d827f10c0e88ec48aca68803c988acd4", - "de2f8602954dc7cafa0a401c00dda409ba75f8cd201ad526cb5f05da49a81ebf", - "51ac394b29643eacd77d195d69a9ae383ca5f75fec03253de5a90e5af7cfa6d6", - "a4c3f6e4e2a5899657167af71034189f1005a3b2b66f3263b20bfef02374c2e5", - "4c3ed31831fbf05635c8ded08d9f1519e1f228b36c6cccae7419d07cc8d3b8ac", - "e917e899d399a1233ba750b9cdeeb776d07d3b8a2398a242723dc2821dd2edb5", - "5d37e78c4349620f482f1396896b9d3b171b672ef183ec70ae2433e7f2ef1b5e", - "d1be643c7d972e8d5378e777f1dafce76f86fbed8978dc958380faab85775126", - "fab8bc51bd54f5ea833e3fbd92f0b1fe732c515efb748a19ff8bfc8d459c3c2b", - "d7605f61717f6c7f08d55993be1ddf72cce6af51c9dbcda46f53cb748627ad21", - "0b5e2724dc6a4da2502f0ba2907d23a13965db06e57cba1364937b8818840e92", - "9918e63f439f1d75b295191b7bfdae399c26bfb2d56158d6286d37ced2ca04c5", - "82815ec0ccc3de877093608c2e47cc94435288439373ecb5f016f21278dba708", - "199b19cf6408ee144c3db2660ad594e0d84a4ac60687393d341014bc6bc01953", - "b19e768824abdbe4f74e0f1d1ff2ade20e4bd8939a877e8c167ab0693f2ae760", - "cc36736e70e7d2400804d55fd2d429e2db006682657f782b5cfbce05da52e27b", - "b9ce13d0eafcfc0884a738f497a0a96e23ffd97886ad3e249f9dfb732c8ccd8e", - "734071ce8a57539e52d99e9511d8febf25a1378d955f3e9bab06992f45ed9561", - "dc23fa2fc6f3afa9b08e6df4ba2c129b322658f8911decfb818c36b2a8c0265e", - "cefbdf60e120366abb66a45e9d1f641017708f397763c56c851c4f346b988c1b", - "5d2f2622ab3b5e213549fd18a7f5df31880f5e90bef42f924541a48cedfeb516", - "3ad7cd84170e35e7862d85d0327391ce62dd1e2b15de876dd897ba45f919ff41", - "77b4bf84bc7dc10796548aedb966af690020ca2b7f917ae45eecff755ccab9a1", - "31e88cf24b76f6d920ddd2e10f10a25a31d12d05c3f38715504dc10d698fde43", - "32b41ebb829cc991efa34f850b4ce592714a8ffc080a64f48543b1e57a0f9fc1", - "3458dc99d82cdd6a9a21f75162651637eb78177e6153a255e91360db7f8e1c5e", - "44f9f2421c3cce89c4f0299132921cbb6e38e63527d2b8c02500e14eefeed115", - "9b4487facac99dc4d2f53c3c1b8e1d9af825d9797277e16465fbb475bfbb2d76", - "dbf93903ace32ff7d28a79c9b2c259119573c916bef23cc5636097f944934606", - "2a74fdb11a32f4357342256a82e431c9a030a5281f9f02aea4855b6429f171b0", - "3244a916de05e2f95d2f568909475c1233f5b0f45388f8f335a13f321c8005c9", - "f8a7a0f5a762bf1e6e68306d8c02bb975c0c1a36d84d72dec67720729e8aa1a6", - "086bd5c7e975733b3c7d5276cf4c8e252bbef40cb0b55b4b5f7056a6c0cd5f6a", - "5449699e4bee65ce2f2cc2e661ca0e148faa72997320251c75744f0e0453fdd5", - "dbbdf99cc5d505183a14269ef64d522453469214e2467af08d108667d3401e56", - "364dc544b72e996829ffb6d6822090e530d9b530e2b1cd246f4d0cdcadadc70f", - "8f5096d9e805b137bc45da10cc558a9cdf49d31b6ae30dc80cbfc488951c3391", - "9297cc12aea95ae1fd6d4401c2a5e48600e2065d5ce4f3cd80ffc27d762d801d", - "fdbb6df1c7b45bd7c5e21f6ca6422fbbec769c31c2534daee3e1a0091574ce3d", - "25f8cdfcbe9f4ac86f6fe06b445d217b97f8a52784dc6d85e0cb34f92d474696", - "82c3a97eadfbba70dd50a62fd6f3a644ba830becaa0323fecf697c677cc9dbfc", - "29c9c102629b7ba34cee8e909bbd2617448090cfaad350d70e9fd698deb5738b", - "090df50912a710d53c1d06679eab5aae409baad6f92f5a04c030a8295038e6b9", - "045baf8daf8a603399ae449f2dfa9f6f89bc59294590bf995484a3f6cce56bb9", - "ab04e4bbe18292d66b54cf88586e4f263b6b6401ec71739479735c04435fb8ab", - "2c5db6273e14d6c124c0cdb44b1506b4bd82f4c56f49f55025814d025f0fb1fc", - "b18d0e98be3f7599de12d2d9926e12452a379f1c10b5816c9e044a7a6ccce23e", - "69a4b092e398acd3be947e5620c1f595375178f99506d536d0406034ac0a9d4b", - "d8a755c097cd6ccbeebf3e151c56992a8ebba38f125aa976015b443fb96ae7d1", - "11d74185cc258b4cdaae3977712b51a0de72f7b7c600c5f543da28a883f06075", - "8bc619ae5653b8d8686adc30d8a42dc21ee3b94777f2f8f675d45e94d7516f44", - "4ce01ca2985beaa3db2b3fbd8b2930563279e3093079baa77ffd68f6e33ead93", - "81178982b6f398e5fc021f3c4396d3347d8c3ff11a245c6b9d29d8bb7cd833a8", - "a5913b60e2358f165c9bf080cdea4536c0e95041f1fef02e473422c683b84586", - "39606558614c91ba72f243b5c0a6bdd148974cb878193c764098fb91dd5cc5b3", - "6a0498376e3c791c7ec97742d4deac62e56d931362e511892409b812384ea421", - "aeff9a1387d8fd3cb726117cd6e03fd54f3967ca2fae33c5aa9a999b89c3dcf2", - "db65ff8eee841611cd4d00c2255d50ffbbc895d10a8f0f590b637ea0476e7529", - "e6e3dae5428e36ff9273164e3e7a08da83bbca6fd227bdf5ad7213435fae1a22", - "83529146ad822a0cdea2300deaed83cc8766fdd4586cd6ef22847eda32aaa3fa", - "69dee32dafe27cc58894ee1c9be0f34bc836d0e8522559e3a2f187bf8e907ef7", - "8a1f55b1260b511c46794d5f7ca970437f9a0f99362c33ee98d4afc79b324775", - "ee85709002169cd40aff8ea99455d744d7fa64a0bd24aa660188dcbecf21e40f", - "a12ef2a239898bfdf11f6918658658b1a833527a7a7c50dbcb1d7b1848381837", - "be65cd3d757bc924f6ba2b21cbceeaa09e2e91fcab537a201db3334e53d47cb5", - "d287a72333b5e544ac88f0fd1efd7f26e8f7d8e1180dbb443ee4a17ad10fea03", - "aeff8826a40897739795c972ded3a5243960e61150c6289ef78a47e5d51fd75b", - "baaf2eaa531c5502b784745da5d18687fec2aa87451d69f4bfe08fe1740a56ff", - "298f585cadad82c89eaae2f79ba7d42fc93d0754d4291d7434c3d5233a95c540", - "76fe7542f84227dec7c740f82123080f5e49140e9a93b435ef96f001e761e959", - "b62df01651e2af94da673184aa9cde9461662e5ce7ca1b41272d5c44a31898d0", - "9234beed9c2286e6bcd3289ee8a4ff210ca81bc5eaf35812c68eaa6b7b497bea", - "06f0004609dbec22ae868370efc4f28f3df0c6d63bc26a0f11ca565ebfdb7da8", - "6aadf6efd53139338f673c5daaa709ed35308dcfb295d297b4bfb08ca71ef62b", - "76917487d3b4d499dd67d9e2cfdedc22a92ef88cf74ff07597a325924b2af316", - "a65a490c459b758cb8853e6025918975d42ca2008bd2383da0efc08a7f936558", - "098c8f0ead41191b4ddeb6d82683ba6b5aa1c20ff00bea808914a47b88e04f52", - "cd8086c37b69dd1615384cf8f45bf6173936099f27452f8bd0935d60258eeac3", - "2c307093339303bb5114f819cd57dda4bf83fc20b77e7930135d5f2d86978bb2", - "b0f6ba09c587a69442b0fdeba0833bc75864b7913d7be7a625cca155a3d3f90e", - "85b370ee4c7061e010d42315450114c38516dd85826585241b16e9fa169a490b", - "30ecc5f263d61d26a7762161338bb82685da281ac8739b19ba932c74bab3fffd", - "38e4fc63486bfc340a003995240e84eb654229affb303a1d692bc885384b1b55", - "4c52c4f158b8223a016175c36aa7274eab05c9941bcc313d07c21e9c2c38319a", - "a59e092ce1a03631e0c4f1c670d50a3cdc170a6893e16a74c7270d5eba571b77", - "71511121dd14a9ee2f036f00a316205064a53a204b88c4481af94a4d4e9c2bf0", - "742bcd7389999a84efbc5ec80f91fa144b0042923519a40e8006f68c474147e2", - "e7d0ea31a0e3d3b1cdab8dbe5ebb1f504a07f1a9a4f81dddd84900cd9f60255a", - "0b9ba15b853a4d5689583d076299457a5b3496d9393105f64f12a5897c1aae3f", - "645be4c221881202ff8c601bcf6461f327ec1d1b98b08ad242fdf8b64db2f74e", - "60fb9898c234be94282d97d1187d9f8dead9bee0b6560ca1ed4456fc11903bb1", - "0020b799fd65e859a359bf9b1d9190d1ae8407b6f10b65c062c754302cb755b8", - "60def32c86d0ac5da3ff3b9144c6486d5ef0cba40667713f3e0a287fc7e3f790", - "cbed01d56fdb2f672edbe092704de566a2edbe963eb2b4f90002a6986d666984", - "59919251b72070c601fff7c9f66726b7a12ed123adbcf9b099318bad20565c95", - "d161c33fe8622b4453b4f843b7ce94d1f96103219c6fe9cb13a3bace79cf62fe", - "c8237a2ec4ca6fc732ce5a890f620fc7bb680973c7e373cca55a70cd4c8b0f86", - "d355f8641f972563c0ced9f7795033845d40a71991bdfb65abbd9ead169b8334", - "1e0530fa28f0bef74844318f00856f9a4f8eb2625604c735292317b3cb4f88cd", - "1e13e481429f225d38fafb8109b50719af2825b75d3790f9bd2437d6a5d3f780", - "aa13a32fa01f26201b64aa232bbeeee96aac8f7f3a1c5807397acdf088428149", - "e74ca06cf73645ac5c43a3c89b9f355f78fb2f462185c653da27c5ffc979cb9a", - "858475880c56ebc5cd6fa7acf15913fca0c5f2c6d78e862f7385ccdc7268ada6", - "667d1a1b12b04c3e5281cca0d042a9c093865bdef80f4a46ac5ba4dd286db38b", - "aee15842944c59553ee29639aae4ef17b7e7af57071b290a8647682a28f11d56", - "31918ef4ad0792f15a8f02efd7992c44de0500370934154e0be4c8231b71023c", - "d4764af553b93f889f888ce4ec73eb36413663ae36654c8a03c406be30686f54", - "405618e897c2f71095fd112e6afece49bcef01de93d7d7e3f5e5f36c77435831", - "89aa218c6e1a11ef5f5b39edd0c7e1d5a27469e9176082b9528e781f012504d3", - "0fe6a4c3914470b48c37828b7cec93d5c23663f4d590e26c4ffde0c93aa9a3a5", - "44684b9c7aa69703de2f3bcb576365f1f1de16aac439b6706456249a94517183", - "9efbf6eb3f994958495a8685061060e7b21c6c3f84bf67578da8b433b8e7e119", - "7e42fd8537208348ef4a3a1d2b9722d2f1570b6aca0fe2ebd9e446d6657c5c04", - "75b060088c696486dadfd54e6aeeb7d215e865b3614720dc41c0d49a21ffd5a2", - "9efa077d09faeada8d699051cfd7b4318856e057ae42da69968de33d40d4a417", - "b8820b7e44560be99a60d15751d1d32075ba3563624f964c04db45fb50feac1b", - "979ab198a110594de61824f1243bb31dedd752dfab13baf7175a1215389c0fdf", - "4da5c00cea730a4bc3dcbc944c827a21bf80d22b010dfcc0293275d4019f19d4", - "7997c6890d3fabe0c066b46d73c2d0d36d485ef3682a8465d13211c5e5e2cd84", - "4c8b78bd8fd5ef43d3d0a5a975ce54ce9ce8e500bbae993e002382573d8a96fc", - "4fa5b4cbf44d3dc752e5f5a91b67d1315127fd6bf7ffb386a672ff4be2410077", - "b3aa3bcce85b631e223d9cefd9274d07e8a39fafedb94841a1b3a36101dc8684", - "3f890735f05211c0b8af553921d222118fd50de8705e44684db544a688ef64f3", - "abce05f85c566020fb3aa5e885839e557a3447c640cf61876a63424bebdbb42b", - "e18defd9ac106b90705cd49ab5c8de1e8fa67e5470be62565b47bc588c5007be", - "3df8de2d3dc31f32e5200ee42a457f73e16546d773adaef5b8c816553a5aca1b", - "3e40c7a3227752a4358d8d607637814ceb28bd8a811f042f61f4e721b4e923f0", - "caa202accb826ad4f31af60e3160e67194e676ec467c15a945e39f48993b3b01", - "a5f1fbb19e98cde179652c1fc3ce6e32dda1b81fc6a517ce69054eeb7ddd509a", - "b0469b11ee0473b9e4a278f3476be747691414676368225e4ceb22d01c40f853", - "d33a8ee6cb1460f47fd9f29f2d67c1fa6b210b8529a6b1df2bfd8cff210d19d7", - "57ce980fda57038ec0377fadb56c2a55c3d91f5ce1500d1ef17ea1e7a69b293c", - "12eb06aaeca3f8e8c575961128a1d72f4e87502881cbca09fce96d95c2f5ed8a", - "916142e97c798d97747f513941687ff68c9c09773a4e03b2cca2765b1f145185", - "b7443356ab0332aba9481243e9e12912477aaf8123fd79512ef7e5b558ff172e", - "b9942d6c18a464bbd30d3543d3a01c7cd201b6d7bb90bb236c13a003c95ce4ee", - "f9bfe8a15d5dc730287b519f1a4867761945345a6e52a067d96bc1679f70c6d6", - "191c40969251b938ebacc591dd14eb993011113e105dabb4643eeb950b6b26b9", - "231ce86d0a86db17714bff8de6eb36a1a4e4c4f815b5f5dc5a3e6f99579f3c32", - "191c76739282beadac6ce38456f8d9d87e0e35b4447ff891884081ab7b2632ca", - "afeca9c0b7174f517b255235f19efbc0972759663acd1e3fd24e16b13f1cb20d", - "478c06d98f2f97c63bc9bd52199ba671003435228c9e87f21839c69e7584009b", - "6ca9ddf5f32fb0b44a9cf4bc583a2a884a1cf39278c55636f5fb9778624b23f6", - "52029ab9e9eee7d7c6587e088017a7900093a97c24262044e4cde2b762448157", - "e99bc4d381fb349be87740cb90aeb28d1688f08c7d5cf2e660f6241878a0f312", - "1ea4b927ca511df9784f5c8f702fdcefdb5ed90147f72563f86bff33a322025f", - "d598eeb5ed56c48c9b761b09c9f548dbbd3470bcb63dd2ad5d134027bf2b3da5", - "acdd3693c1654548b1f60ebbe8e65b13831c524bd5c8ffc33c05f8f4bbaed005", - "7a51c6421c8904e0be95dee5acc6eec4b26c943d608313e1525c81df263fdd3b", - "b78062125feb2e25d5faca315a84d90ade4414af9a3509a06ac426438c00bff1", - "caa53963ae12f9ef6e66be8f950c876bfca071f35fbf4b055a8fea994c25ade9", - "89281bc1549512b8fa9f9b526a9a7d31411ca115954a788a33449cd2847b4fb1", - "4de492184eb03a1ea1ccbe183939bba010d775ee0b65f4c5c870f389772e9147", - "775beea5f8c145b0ac6e2b3633be01a8542160f6be2d1f45cf5dd408878b2fa5", - "5b9107883f020cc59c49934814e3b10eafe51d67a9b21700842764b6975d8713", - "75fe76bce16a855e9e965be93ba828be0bab5f77384616a39760eef65347b346", - "5b65f9919e833d92f4846b0d8a29ab49038acf9ec1e0252493712058b7550836", - "70d3abb6da7f57ef4e8ac23856d67b0e41a3efc48b19f9246eaf975a481d53ab", - "5556892739313fca5aa661159e86bf1fd722216199964bed71920f39291ca1ae", - "ef2ff4e77e144130d48ee78867fde6dea55b4daff57c2e91b6014a6e3e0d24b0", - "5c3f6527757e51464a0f232a5a2053cce1546ea80e89787264f9e329be0f76a8", - "ae7e69cce806dd1d371f7b34c646b6bce8b929b147a052e4e4493cda17d1c1f0", - "4e7ef7062becd9e80d72809ec4477cddc710cf56eb8241f1696552fe90a96371", - "470fcfd3eab0b2b96c899d04fc530d64611aac0caf865a35e296451634f63dbf", - "0537282088b4875b1444682c46e84dbb54e4a73cd401040c0298dcfc6253217d", - "f0efb2f2c63adf9f09a6fc05808985bb46896c11d83659b51a49d6f96d3053d7", - "e87a6746780a99319c2869ae088b0143d9cae5a6756c576b05f6e858a98ed02a", - "573d4ce335dc3bcd9ec058a14e0184cc3dd84d49781e9680e8e04a087bb92837", - "b361976eb93c69a666715b059acf332735a639219682f0dab1789d44a0b2424c", - "e3083a7c1c30a6d200e12d910a531b2475a1d5be6c02dac0cdc0bfb097703a73", - "ddb880ebc7627f4d80a3cd54a87a8f81d078898832a62dd6d954c69a9af746c7", - "a64422e56fba66723bc889dae7db58c54a823c487bc48b667009217b3c3fd528", - "1c7ffb1c004780e40c445e3709b3475a520363bf59ea181b5c94c671ddf46138", - "30ce26d8d570794a5589e14f665f9f35f1c8ffdf9993291fb66de96662820ecc", - "8e60ccae3c15fa2e67534e09073451dc298b4186961252ad42acf8bdf9fe65ca", - "acd887cce2fc3e44915e92b065ee95ceb76fd35d3308944487b2a7b1af90387a", - "f88dc4c1b36fbf0cda562cac8fd60b92c735a833fa075f2fd2396839c497d3c1", - "7895cb8becb906ae0a8b218ab1e2e850f215213066426b3027f60c5b7aa31fc7", - "fe4fdff3252748d4ca6a12238d71fca9c433ae3505d73c767c4c85949df30ee4", - "95637e280e267c389fad74e1b3275eaaae447e1609abed5f04dae37b102af867", - "12d10a84bf702558e05e799f50cce20322698a4f6665f8d72c5ed65802669255", - "a1f4d3686db33600180b54011e4833c4c6cd0e98241bfcb37a33193acdc1c7a5", - "3ff9b789580d7601791ad240ee7567bee46afb8797e1f7517a50eb67a204cf02", - "c13ef792c5c02c67d02f0cbc9b187501d11c61b11677927125b2ed0599809ebc", - "4bdb4d41dec451e41a921a7c68976af4d909f2a6e0e7ec3e9309464521eb618a", - "aaa23f5554187fa86eaf365fc0641b0f9b0a7406fa8e3274685f348ca50fb5e7", - "66a23d179c1fc490484c8e7c3b658acf0009a6554edb3f2033409a9d8d94788f", - "ec9c3b3303dfad22b071d2dea56568aa53e4246babae4757971f4d001eb3e2aa", - "1feae3a4c3dc52b3d258aaee813827a507cd5d5c81b976a0ac037922216c4828", - "f79d394d84cb3bb86237805faa8dd1d841989e113a8b274e629feabdb8128514", - "501016d80a8d874eee926346db127d0bb9a4ae0b8c2d0531ea1e85872976c093", - "627c06957218a1ddf5bd3257c9acc70867b0cf3dc5028d1cc847e74138436164", - "83f2bcfd089bc4bc75b6ffb0c8514246835daf038ce0caf45c2fec6aae2f28fd", - "bbd1a2066da69f5feac43abcbf359bc106ccd2090b9bec75c19736d0f83f10dd", - "6016694ed9c5112eb5363c0198290ce27203b1b7a524efbe99e02c26550de1c5", - "63c9bc2a318d8430c37492eef5d36a4eb8a1859c8cea26e35dd53e9ef28998df", - "21d5e15aec85bb169d96c05f8274c6d1823f487b402262a350e21fb5f5608696", - "9ebcdf3984ed73885dc96fd72fc5843b0b500421f3f60cf307970956d15361e3", - "f0f9c2d856cf2fe576eacf5b91c750f76379e7a241e18f5ab6567e97a68a90cc", - "45563930ce2ea21c81e19d4dfd4104ed0d3db8229d61920b388b6d860b170b09", - "b5daa9ad322b4b102076c5ac1633365e8cc3a4311027e3fadec3f5712e265e50", - "37b1c8531aef14596b83a303863dccb8ec1499d7bdd9d79716913b9c94b4f2e1", - "d90ab6dc7bcb357fc5a46c7d6c5884774a609208e9f081e0de177b48760b3a05", - "8b223d0da40e708d904207212cd889b20836fe4b165075ededd84ba85a5877f9", - "619f9b7be4667c30c30fe0a76f285df7868039c9cc3b52d9c9e8a68a757937b2", - "6e0c3d08da9e9c79458d73dfefc8653f98bd11beb3a55d0e860d7ede4ca67b9e", - "f51a77bb7b6e16a66694a97936b598cfc8fbb25926e156eb55a8ce134ea8ea13", - "edebc45e8300e8449294265d016e759f47d1e71270c9e400fe8c30846d276084", - "494c8ae36fcf58d81691e24968ad4478c063560b88c418d250fde24fa5ec2b48", - "42557d96bf96a64997454a5115c9fa4a21342288cfdbc8d520068ca7cc0d5bb6", - "3335fd4cba3121455320c6d2765fd131fb24959645ef486222356dfcf74375d9", - "6f8526297bc06b7d2dfaf499b260ce4b978b1c9f1c07d5468f0f92ee9ad034f4", - "8efe6b2648beba5e1ff561335bbfc98934cf7eca0ff90b86a28b9a5fb74546ee", - "1a866545930693f1733c3fd29da721d0bd5ab4a380af6c1c6010f80191e87bee", - "ee417bffaf5d1943e4708ebe4fbb56e2327d699ad01db88ecc7e875550c85847", - "1953fdb45aa2d55bd4bc6b17ae1d69038bdce1a9fe615315acd56aaa070badad", - "6e4611b3df9de8da165354efdfb5c2d46a6a932779a2b57df5cd0688ef03b786", - "fd37d1906dbe9b74f735b2b2e79323b27df64ae68880c8aeaffe3fc78160f709", - "3c216c0fcd939e3c537c3955b4a472df4505fec3892a8f91fd823dcbdee16ce0", - "e90cfd27893f9706a9f454cd7917c9366ba788d8a4d89643d3ca68696053ff4b", - "f7c6e1f7f68ccc4a3975ca3e4f17b345a4112b33c6cc308771fbb105616f15a6", - "d6c6a867d7453fdf266febef43c232a2b3b124f544d7ce1fd674760b0df942d6", - "72e8500f96bf33b31ccc296331234bdb19c2acc223e794a3a93adfb16260b404", - "91dbe4c4ebe0c6d178c01bb6bf2ae0cf9edbb5d042683f7982c40127406a7add", - "2c7d423561804f4bcd02568e7fc76fa15f965f70ee51d3919b8c3657575dd776", - "4cbf795f2df8dd4772a79eec046f10713115bab03ce9a4b7fc417adc9ad3d064", - "e11d849ce111f5418459d67be8ba62338f91e1a8cf181206105013de7bca028b", - "a3c618f26fe2c0d9651bb14926bcfff92a876135a07dfd707d572f66a54914a5", - "9c433e058514a1309c07062870530a25ee9e9ad820083c8aab0c2cc0c3d97b3e", - "6a936973e734e72fe55ce85725b3f68800147478cee7feacb2c204a246e709e6", - "c4c197bee96b46c949b4266e9eff7af760d2dc0da4c8129737c022859b8584d0", - "369da0f32db586e0b9b80e475429bc2230daf8a08a66714f3dc97f2f3f631385", - "7456a6fd0723f0f2553aa822193783db0680cd546823bfc6ea0c2bf67ea233b3", - "7e6f4b29d2c9b557943231c158ed6302043999b5c92db447f69978b63babb5da", - "3608484307497cf0806ffe59d4d634705c51a4285c8a7cae828defc1ebdc849b", - "503f572a24350b4e4f41c1ba8c10ba56eca207fbf5589f894ec5715538e923ae", - "3d4eb86bf5a45f5cebd8671c862b9de52efd400df95bb33bfebd3ffa014cf573", - "8312edae7afb9ccdf611ce5bc704bb74a44773a076aa012b8b63f68d184cc149", - "c3957e5548ade925be3115ab499e3335e0710eab1ef3d4b6fc919e980090c7a6", - "4a1e8aed29f73beb803728f453127db6e4a7bc3702c2c075d3ab141969fd315d", - "d20f33c1489b830a661aff55ab399232bfb73720531037097731fbedfd624c8f", - "7416ca02b5184967fd823e2244ded8c40e886e34fec13efab4a14a27e48b72c5", - "c50e267f7950145d72b83b9a29d3cfe9e07b641c6d1ea53016c0949970363090", - "afa37d41e77b7b54a63a82eb59aff1ca3aa2b9b1ca8699f272339f93832b41b5", - "fb0cd654b544b4595bcd7c4ba0d89d1c393a177ac81411d70324978d1ee5863e", - "615c90bde152a952f33a82bde0fce2de758a71409d217d0caa6a0488054345ff", - "2ed963a24340b9a64af03f93b2633f01ba12f187d76388cb30c1bd497ae01cb7", - "0cd079043508dc550501eda8de154b5d799a12c2726b1147a2b287a435337980", - "b6510162911a58a0486a876b1152f7d3558680194d80ac02631a60eb2b1f11fd", - "8d97ad2a72f7ea8e612e59012f0fc6f5f56d38fc256ca660f01c904ae6c9eef5", - "a2df52188681fbd41340061f07980d9310c105714ae3540a0e0809247a15841e", - "674b17f934441be59d90cc2b17a3b72e301fdd4f72f4886b51f9a25de4cca5b2", - "23b2352765af8fd73a72400884e70add274b02bb4e42e6b4a787f1ab76af92d2", - "bdf33df709e517dd184f2c9722c2751ba618eb0475f8f5ee1430134d01c0d2bb", - "b0d689119e83e82c5ffd109231a6d97408620f0594766a5d3d7dcc2ae8ae9af1", - "d4db6be4d9adad96877189839698475c24948393895558692f8059b8df1c16be", - "2a33b79aa2d8ba0b5ba445c420a2f93f3f64ea477829b035729a35ce7d558ead", - "4119c7398d8793531123ceeff510aae6d79c87cc5327a78e82afe6b615ca495b", - "08ff832f2dfbfdbf5e649f44ea11957a289ee6207fd16f06bebdf61a8b956f07", - "673961e8d6311dfa377c2244f66bc180a8cfc20c91ff40d3440f930d733df23b", - "92d650b5c7423ddcaf9d4cfbc4120582f1ec5aaa9cb884aa3fb763b2844790cf", - "c1e30b95c5c457500d76c077db5d8144581a04edd9dba135a1685fe9d073a642", - "b99d3f033266ddc17b19f1669d1ecd469ac8e98f936622db1e6b48732941706b", - "8a508c6e6edd2b91bb922fcda9e5111f42c88c00cfacf4abcd350d553ce350f9", - "5e6be1ed8b353f28be03c68a86a1acf98b1f0409bf32d985c27a059e09d3168c", - "f391fc088d04c9b9bdb1dc33bfd9765986433acbaf417081c2202db24c7fca4c", - "b5dc4ef7cd6d2a8cc6e1c5aca8499b725f439ca8885ef20e591b949dbcfc7762", - "cd51aff5832cb6ecbf38f078e5d735dbd6b27e58978a3bd54f93254aff648897", - "f59d6849902cf2c40e83affcac8067835f472323280d42f323b2a5fc5172d77e", - "dea8e99c4d0e770b234c34ff760927e011638b6aa5daf7f9024a820337673821", - "4d0e87fdafc5472d239506dee644333917adf2f75a5e13ca686864eadf2d2799", - "a754cfdd7328af8ce412a94ddec6173a238df7aa2a2ad692770604274d28767a", - "ae14e2eea38456b4aea58624511e520efed1235bf7d3710dea44ffd643fa11cb", - "c253f2a668520139a755cf34c39d6da9cb6998be8d9ca88a58b918916c1d4da1", - "1cc32d8d332633bab3ec5d94efd57c55d4e909b1fd080a18b9abd09db5146c13", - "11878bbff36e323a927e1c3f5236badf64213bac64dbecb93cdf2c10c8baf3d7", - "ab0a3cdb1a4f6ab55e8c664e189576bc70d4e5400603aaf40445555da98ded7b", - "8f7f88bb47b0d66eb8bd1fa80c0d6e7ee5a2ab3d2f131edf1aa90f648b059327", - "3c99ce829148cc30bf323f4009d0915608aacd0ea75d1cb627890263c4028fd3", - "dcc90109ffffda1985e2677918d4a03e1cd3313c140fd1214896c2d4a2803ff9", - "3eb8cd7df0df7b78afb17dafc42a1b890e9f81c339bc2c37269b719291d9b445", - "022b29445ef84b22534febce052eeca7003198cd541d7a8b018acf657084e808", - "f02d530e9f062699e5806a61c08d15ec5a3e991280f56158d7f521c8ac52bb88", - "75a57d4a97d2105d58073d858d2cd65d60302eb2ae96656371cab0a697524412", - "436ce76177bd232d98d69ef58cdd06e1de74d79b5fbcbec681af6412badca276", - "5f4ab542fcc1981b1f4797016d1f15dae548a4c028c0524e31767ebb34ca2942", - "2542639b5628c826423e7ca2a76930f743ca492b52e4b063a00562b747d2982b", - "e95880791ad56ffb1ff30e20d805c437a8c70e9c24d7a36dc08111d7f461c9d5", - "f9b4699dd88a7f9f6b3398e4b97fce85e64580191de9a00773bbe51c2f2730b5", - "e620a4e0e6fd2cf107257321fd1bcdb6188272718ea9a2a7090e800d512d81f5", - "66065db30c14f292142d790c85d74fc41f7bf1d5f4066b4874f0d6eb7e7060a7", - "cae0da18d481a189b1f79bb00ddf65ec508bda9eb2bfbc90d5a04340cb875129", - "d5015fc2c81951e5fd89038cb9d60a46c1793dbe9530e1fd478b2cd1225d75b4", - "16dde9600b6e720961f77b349fa4b2bffc8b23a368175bf3688e029b944cbb41", - "c78d9e9b018519f0cf5f36dae9ed21907871372c7db9bea3d84b7ba060af6485", - "572156042ec89b752f409d1d3910b3c5d6aa9debc23977632987aaae69f6c53b", - "bb9087ac06967fd888a2d00c9478d74bb7f058a25c45398a6fdca2802c39ac8e", - "d13ef210fba344826a7fd259220ee39c0373c356c4662bd8fa85bc21bf72a025", - "42cdbeae2a9c63aa2f8256663c8741ece0f793997602fdc9241870ddd0703dbf", - "737da1dadb59ec0e9231444d796407c0226f467d5293dcf7829d744725d7ca53", - "dfe0e3e937de68537a4f1ffdf049f0836270840b3e844d5eb2cf3306c98179df", - "80221717ee82bb7434ec1b5158fc52defaa2b5f0002ef2350532c615f608de50", - "f393c111e8f166a0240aea86be46766b3d10f831f247f786ae393060c567fcb6", - "971fca5cdd5f74c365e21d24258efe119088bd1a0210b875cd8d353ea44af543", - "9fac99525158a9c4236358a083c87d1eac5e4d60143f979e39f4574df1cb26ab", - "431c9c1637a249411f70e99225506b5f090bdb120e89ec5d6c71e71a24565ca4", - "706be25efc3c2029f35c3809710b98aaa5fbdd9204078efd8c4c32fbaac02b60", - "95082829330f31a91629bcf6e27990f6999447c05a004e78021f666682c492b7", - "3f60ae69cfb8dbdb69fe4ca8db4b3a0e1e24dfbf9b27722ec222d8f8276f6317", - "45166d717b7824b744de2f09cc12e9424de21690a87cef77b8e23864a5216b5e", - "b5f5be0a169f955f5ff32c96f5cb4aab5e2fb4b556d1bf0f763d34afaba59716", - "9884f3700d10b1b29f5781198299a2860ab6afe9c189ed019a7fb6230b7c7f10", - "4115742a145b20e221d7ec177976afba13bd5578192dad31ac85f04534e71fb4", - "323541f29648acf2b1d73e22b391a71e2f50cd143edf7f9e607a43a7eadb6d36", - "2bbfe69d50b14c08acffaa80b4609f0f1fe9e465b82b2b93220189c402187d14", - "f031822c2c0742bb713ac0642e3bc199b141ae24493bf8f598a1b21347439e9b", - "3a61b59e6e5575de598518bee2907485fdd2a64e1240d3c7ea150aaf9af7b65e", - "07c37dbb2a68199c92abe2c793cf7fcd646fcb06df048b29929d20af050b9c6d", - "0cf9b7f096ff166292995f91c487819da5c397181334af3c8d9efb7494f7a3d9", - "d971ad9e2226237225270d5dfb569b99f21b02096a3322dfa0b3104a0371c4c6", - "4bc88fa9ac071347d5ea9d0ed087c1f15fc2370944f01a4c2064bf1d5545200a", - "a6dc4714d9a6880e7a7f5186b04ebde491df2df5e839dd8f885ceafc70a030d4", - "d0a2c46b2aedab520033770630170ca201fa0edc11dae94abad706e83cb00076", - "3bb9bd81625d214ef7045b28fe6162d69656a57e13a1ed220ef0dbf9ee9a8970", - "41cd8a1e5941d417d679139eaf28ece905515e6cb855f3bc967a8d4449abed8f", - "291dd282901b1b0e2cdb1a50bb1d6bcfd19f6ff1405c5850dc04cfda1c4a8606", - "6ba9b5025c73c47885600dbf539f7350d624b5949a129e181aa3fe16ef0707b3", - "38cfa8689d9252320f085618e5bd40fb6869245406c8e04be32d4a8d9450b03d", - "50bc18df0cf2dffb0988a582412ad205d765b5cd96c63c8c8608957ec8a898af", - "2ed169e770c90d06d8acedee0e79ce16360d7fc04028ad6b1cd4fd2b78bcf930", - "fc42ea9636d21201c6eb118441a8e89ccee3f7d1263a5f1b5d2559182bcf004a", - "07a53f5e4db2568837864de960b826f384984411c19c7b7544e02ea5aa30d8e8", - "47327d3f383fcfc2c60c8fde86f95fb2401a36e202470df7d5450dfc0aec5f50", - "c3cb639530fb894675f6e35ff81d810c24d83ff954bee39d57db5f897a9b8536", - "47ff9152cf6f8ddf6fcc2e7d2a215c07793d018205638b48c43d5fe0486be23e", - "6930955ea7c606b8e9ca3eb73834a0099a9949372abed84b6aa1f7f20a7029cc", - "372309899baf04b8129b1c29551195c70db2c35d89e5740c814910f4736ae427", - "d4f429025d97f57aa2c1493d52a9fa46b3a5185df4a4c1ebdcebdf633f64a927", - "03915ef02afdb957b56a8834f85900fac7ea7a6e0305eac74863fd316f6877f1", - "22c8090802637fc12d1ea6df0dd5658b4a05002bc57ba47bad2fb74fdb9b855a", - "cb6685f046ea93382947dd03bb36c550b9b817a3f43e8f368ed5233f8c63e6ec", - "b9b4d029eb99124e6e75bc3551f5a1b131feae9f8f705a2b49b9ccd7a656b4c1", - "d842559e9b57f07c08b5963d484b02ee05c20589d9c67dc0774f429c2915bc83", - "7848fd5b703f5c34cbad0c47e4f3f896c39619f9d6a988b36ba5c4d4f26ae6e2", - "c0f136073ddcee831e31338574f746254515aa3b895afbf2d52b1c70552f3f78", - "407d11308e31dc736dcf0d8fb7d5ae6640f7f56a413ef102009a8913554ed7ce", - "fd1d3c923acda58d842a784089fec019c4f91b0b6d16f133fcff86e404875f75", - "4ee6b096310d50ea48bffc6b2740752efe5b6c020c1bf7ac3116d2c41b8dc7f7", - "03169d345d0407636094ec5371f8c0eaf114870c12b7de002a43fdb0a36911cf", - "98c77338cfd5d35cc2e4c0f50def24e19aa66fff85653b7f9faac0f84dfab6eb", - "89f68073343d6573b4537706cb34148df656a4323492061fe4a1d0e48104c161", - "83f324ced0868d3347dd14e7bc0ae46bed57937df3469f49675f526758c40692", - "cb5aea1c2676e748e12a239b3dfae39cb3fcb4dd71b0eb98f63b9c5dc5f5c20b", - "1af82cc962c45766897cd16233f1d769fad586dce421efeabdaeb26eba59a9a6", - "29ea57d0d5f6efb4388cbd21b9daf212270ee0a595420bd1a7103b7b5788a390", - "d7f54ed15457ebf4221e237bd816ae2ed220fa28bf643256c0e9851ec3eafe4c", - "31fee7049c04ef662731fa00e3e70736e31d942a1fdfbead4f426ad889c61c49", - "ab35c40d327f6919d15524894a10f225293dee371abe76f71981b84983c4b1fb", - "30fca1501a6379bed9ec30a567fb0c57728247d6929a6515298c2f107c288ea0", - "0a0e0cc4fe3a6d23d57a3319c14cb7402839969538439ee3f0a6db71cda903d0", - "44ae66b81a513a6c9d3e1b5d41574ee9baf4660fb9b78e8169efb8d378630cba", - "d07d123d185b0350a4c4f45a46a0e63cf5970ba57a7167b069effa170d3cebf7", - "01d24e553652c23c35413a3e4a8e1803845821af1db4d362247e63cb139f4f27", - "865da564f2184da76cb4918f58489eedc9d2a4bdc47f0d8e081487c982e2bff7", - "398ee214b947b8d2c4ef3be9502108121d5674c55e14c621077cb8782bc3da6a", - "102d11c0fb0fe93b1780c154852bdac4b18e8adda3d5839d889d0a59596a7685", - "979da49578687b3c39e5f179da1a0915b1a04f7b089f4c89cc0f69cbdb6aa468", - "7633a3d69dbbb287df3a3bf24df6a43f8851138f8b4ee22c5ef7bf864afffe40", - "49ef30feaa54657bc5b86a10e9c2f3b1e73398e56f8fbbf04de367f8f9ecd46b", - "10e8985b3dcac3988b0c90d6d4a23298e6cba2dfc7699198bd26e9304ee61dc6", - "b13c4a4caa42e359aeb2912297187c7ee1f2e75d55e1cbfd00980504ddf6dd83", - "272f08ec37d20332d9ff0a0bc73eb9aa277916d9616f6267fdaad606aee4f6bd", - "774915df6c290d57dddc741f44d40e7ec7ccbcb9890b52307fbdc51263374235", - "94470b97f2ce936bac0a2ec4499fe51031938397f5956341be3d497f3d486a69", - "0a16f2bc7489e14995958771d5a91de54f6a6248bd38dd86da3d71f3b924445e", - "ee00af240d4fb8b0f39cbc015d42e20bccd2272b136ea9c291d820d813ed72d9", - "9610300af7904b009830149233bdf683dd034b8109c6fbd06a496cf0f76e0e8f", - "ceb74c96c036c0b8e4c5e5961f229883a3306e7806aafe6eeefe1dbd27be3b2a", - "06c9e258a6ab58865e0ae151e890f1bef65d356bff6278eced5f3adabea819ff", - "c7ca07569aa1d414ba14c05f9d7c778b556423591308e443476382b1d26a3035", - "e2e3570e6bd6860186ec0b47bece7560898b7da21f15e6ed5fe77a2edef53b18", - "6afa4ec2ff630741f04eebf45b4405f241c7a0d92732ada65c9a28d209f525ea", - "02cef70bbabfa6b9f847d464a14d0d495ef086c25cd35bc0975c01da9f02d91b", - "df7f092d2a11a96c7c53669e6aa3a800bb46146a0a0b2fc5224ce2ebc4649d07", - "7f5e47a93473aa19c8729d1ca87733b6b35fa21d4e6eb89bb837dcd385115369", - "34bb0edd1fe92c49e32a6d9568d08cd0905074aa0aea3ea75e71b17560087eab", - "dd94b73ad244ac13b71bd588bba29e0ff5b8648e3bc2f1d241f53df732d657b8", - "5e7d83ab00e73fb0e208b1c46c102051a8530b2ce25ddf426528a0cfc678b0d7", - "15551b88196d80b3b11dc3c337eafde757257dad57aa6651f05935e0ca70b615", - "17e34aeb360dbee0b8245470236331adedcdf31efb4954e942e711eb1df47e1f", - "d8fc5bbe182d7fb3c190fae370194c21b65c41fefa3eaac5fe6b6babbf6f4fd9", - "317fba897e8170572c5c055d674f16c2e2e2a8cbf3001877a6bfd0ec21b55def", - "bc4c26e3132139885ff1f918fbb87513f818b709dd7d683c6b184f717d0b0c9d", - "977dc7ee9ac9b55b069d453a44e45ab936e72a9cf82abdf6c308055b741692ee", - "94fb619244c93c92ebe8e6921ccaa7d8f552412388e5702d0e94e2c86017be7d", - "8ad09a49bdb567d8da5cd5a1dd5ab5a168dad04cb67ebf63f7f16d1c46bbbb7e", - "14b37ad9cac70f91009e74ef565c6a38238024128644570a235d75451ec197a4", - "ece7da361ae474823471c5dbe94e559102404f0740f5e9d266f1d7e04ded8e04", - "c7739f5bc069c18e4e37431c2b6f68d103979a456be69e1c361d9564618120f1", - "c5b40b478cca1d368333db2dfd942f59c3372140ab0605d49323ebe9af2056d8", - "09720f3aeb73d090292bb334385082a42587f57099aa18cc8b10ff22a4d4dedb", - "c21884d1308f82459e9403312e6a9a54ab01a29358adc368d0153519fd6ba62e", - "9dd3ea67fcee968819629ab935e84b7968ad5056c0c50376d853e292dcdc4be0", - "0d57882cfcd7056525a5bbf098e222f6c917afcd03b73575ee26ec64c34c9dd5", - "1d10c883581683c7a6ab003c9677e7edfae1d730acc44fba3278e3ea4d8a8c8c", - "e2e28652d69da57d0be9e2f41aef96b3bd7b64a0698672b8b02fc273f4df0989", - "e6cda58142ef851ea18e9806bf32712d23fc21d8a92ba15a72c64e0808653b38", - "2794d458cf33e959253e43a437785543180888c705dc2185f2d3407b456bb9f9", - "e0f844646c977b2acb1f74eb375ba17cd9bbbd2c7fc1be23e448d3873a83e10f", - "3b4658de4cac8de2650d233466db6634c3e173a1ef235a99737d2c566d1d39b7", - "efab7cacd375c49051f6d1dd1264e0e594be84a9a4605b55e2cd1a41a1237535", - "10b69292d99f5aa0ad0687d3de0f283ed375e8440ae08f18e948b4dba35520d0", - "b7a740539f329a413d52e238616254f5603fc7b8721c2d8ecdc8583c907dca19", - "f34bf166306b9e1e5e86994cf57af3c939b3c751b2d644242dcbcf3164b84bd0", - "f7274528cddbc6e890e6d12859da7b8ec70a90f7fffec9000de1cce72a5176c2", - "afb48505c046893954422b85dd75b60df6cca9d33ebf00979967185a47df708c", - "ad6a9f4856c07431fc4de785bac961d72c116522c3b5f74330c23e17dc42968c", - "35e9bb218d418ade4cb4dbfa80af468ff0874ee8c6d27df9b6409772fb9601cb", - "82b73ea09aae55b413f17d4fb3e3a4b6826f32b142b2d7b008c169ef4f510c09", - "8405573a6bb38412d72aca20d68d674ff36da1d9b2950b3f593bc572342f6e26", - "84a87a3d14bb8607c6aeed47b4dd0cf09fe915c7d562d21b37857a1290828820", - "4fdb4c57c0dee8cd8e7fa0732f82e8ee83f6e168c08ab0cb8a3a5d655961b77b", - "769f58548ef94af9de3c1b71b589288fef4037e742656ae8bde4db2e49590c95", - "f9bbc97625149b25a3c924b6fed341c4c300628c09151954df5688982d303418", - "4ab28cbd61cce84a863acc342e1ad1d57947eabfe32d4effe994ea94bad3561d", - "a962041805bcf639a338d0750816f6e12b78e6fb77c940cef2fb6f35861190be", - "7d07b1f105f348e469484b2e9245b72fa4aeff0bd5934b98996e48603044ff42", - "283204f9afe4061b0d12998be9b7c11192f0ba86fc19bea63e7936534c075895", - "47811b98f001c064259a6cabb8463475e13d26c6640d48a7de0d54a2259ca35b", - "24bf870016f5d5ba5ee70da19bb06455cd2dcb9a4a60ea9751d05665829bc3ef", - "48fe98ce92b98cbdb6d0f883070ad3f325413b4edc42197eb3fa1f07322fcbd9", - "75bf426433d27da4a5fc325913b6f417c9a1d86d2522cbc8cab8fe8088530022", - "5f7cf23cb1fb4433f628b7ad6d0adc4eb8741de053a66bbb5d275ad46e1fa2a8", - "12a5a9fcbb5e08d633f612fea61636e8249664c109120ea4900fd82869b9051f", - "c1947f14d2fcf86a908a3c137e505bae04f5e14d76ecf6935cad54d6f124dce8", - "14f563cd5f1747077f904480a63d182ac4fde4f26f1df61e4e62d79a9a5db342", - "3b25dffd68c6b3e621702c94fb9d42bd994aff2fdaab6ad21669a2390b424511", - "ddced1e00f6353438f8c64eb740f0d6265488e55caf435ff93ba06f29ed6e372", - "ebb53a98ccfb00b3b490f4ff1385dcc17a7c8c219122818248233b4795cd7aff", - "604e24c376b922092edcb095b666fa2c44504b776b2151edeb6043afc140a080", - "2821e437937a22dc81bdce72788b4264f96fc3dae8ff1a64e69b1e36125fbb6d", - "9e76a98dc0b158d6a458ca1dbe8d607ce94f92c8df7f472981e5db6d791c3302", - "e50ca161baf1e6d6c4265c59aa6940682a41f23ff2824a3966b4f1d81dc44cbe", - "ce4d8b1824e000d708307b83c7eee1ab5cfda5a278b68079ea0fa8670f150c3f", - "e0d2d29a57ceb979b6a51b88b5a43b52ee72ec37d63b9857de4ebe44827b6cf5", - "cc42890efcf6a862d4d0b1dce96025c0fc6550423a576fc3ca47842af180fec8", - "abdac3676928b5b807c51bbce74351481c5ab14247e0f87f8feda629858f0c40", - "cff1e9a432c1a9360a26b30b028160e0ae27e93025377ab26e0e15d9d65210b7", - "5fe65f7cfe518c0908675234a7d138bfc614d8b241d16d2e19cf8d25c49c8805", - "5450d73d6ed4e0aa4e197f0eacf1159de0c7f373aa3319946348ad70bbae8b4a", - "560022e21d9f18824f3dc5b54123d88b27f4a0612e4f6d79966fcd050b256668", - "f536bfc44b7fbcf2070ec2c539ec08ff3e16d9aae2a6eb8debf97fe4d2118d19", - "f39598890b4773d6cbb0e4b431595d36ecd2d6695f5c068c2391563395428fea", - "30c475441fbc3679f0d76152e3c259d05cee21ea063188f523a5bff6a17d1699", - "324bda1f909d12b78a5c04a39a178522aced5ccb17db6040683cd039383116f3", - "369881bd35f6d3a8a19715a439dbf5b7104e4be4f96e0f9f9de977deb6b22712", - "7b5b37ffcd6d33e4a82bd92e0dfecebea308ace0413050ca01d7e475a2b2f72d", - "2bb6f9084c522c04129cc1995a0d5b486da154f1820f6f26a30b41096a26e8e0", - "6f892369890565bba56c38d13a1db11d12373191572711f07ada7625df3293de", - "90ae95a659646303a522cbceee525acae36a4d923fd17390be11d5cd189a5e75", - "4d07542556e21b7277b8965996cf829f5128178c415869a038e41c5486dfa0d7", - "6abb3f1caa0cc75c326b8d92ebfe34a10896632dabcae8955d75584896ecdfee", - "ea2b5cfdfaf8cdc389e11b2e999f90004e2afa1266df774d07c1d40017406556", - "5f0defdbfdbee714647c35eed8b562f58130d9846e322050c205f349f3e47a44", - "31fd5bd39c577be44b59d9dee40893bd54b3aa5c45602f99a80acaff5f201c54", - "15b84a2e30f089049d4c1dc96aada1109f42cb1b1fa33fe74ca6700949bfd102", - "148061e4d72bbad5ed5896518411bb78ff6ef026234b692cf03c1b69210d45c1", - "278af49cc5d000ec47396647de74acbf09c01325d92b4e63a58a43981f5cc5e0", - "66af5fb85e618579c06a8fc608bbe45cee7a937275bcec9caeb41a1e55f3c728", - "3e964d387f5a9a55a8cc4595184927eb2137433b93989e6ff3626ffc4de1dadf", - "cda851873216050b0b02458d12ad1be72cc3bcd8ed9aaeabdd9f4636a1357ef1", - "419a0ed9648ca21ae26f04e93679e9aef66b535f5c59b29de42afcda03d9304d", - "b6fe77db281e6c3fd945f2765366c54cde5a413bc41976a5194f50d1e5cb2edd", - "62c3c431c8a877f9e6bee3bdc79bafc29363c485629cfcb98dbeb94f34a24532", - "d58644b1364b0b8b881198660b5b475de418e9295e26797678b814db8f478d37", - "bcb1361acc6ddb214372d84692f1dcd377804551f09ef424097c445f40a0e2f3", - "59433b02f642ab17ccef2a4b892c3f98c2ba57067069c84173b2101a9baa0ab8", - "697a7ac5c854fbd54564eeae9a02c3eca803a6c55f5df6692022cd67ec19b668", - "12f95413e983219e70b772a8137207808574a245d10fac9cf533bca0304695df", - "8f151e1837a7ac6a1f413fedfcf680038c1cc9b25f8571558a6c9f7f93894141", - "24a4a7832a9f9589e0082e6d36912865301f66d45e50d376c995faf5643d3738", - "d5d0b29260cc14085d30dd95c2c4e46e0922d505332799a19664cd61654d1262", - "638aa3d3d975fb23fb6300e88b84dec9de1ff56ad269a05b99747ce343997fba", - "6baa880c0b49de49b07c419880628e4836dabb7a4ba90952e4b2d4ff3499b821", - "98b04d3268d4931059f731ea3fed6fd3430c59fe2ae33f9d04aa8c04f26db9d0", - "f315c6799821cea50cc70c49cc38f8857f7ee0ea80755219077bf91e4fe1995c", - "d648f5abfb9e854bf00e92d17116983a5dbda481c949c6c3fab1b5146163c0b2", - "a2b8008b9d6f11e4ff2b65f47b33fa5ad590a4804650278c788743eac0daa45f", - "a1a934867fa069e3441b56df886e4d874d2e8b065c155779d249fcb37d572214", - "be279fed99a26fafa9687940da3a0e56ddbb420e0e2e397fa354a47aa778f181", - "19811c3ffc6bed9549099fe49b740f6490d824c349712d04398f03f4c9448e57", - "56f163de7c831b95940fc2c785b82bf7f9499199cfebf39403c53326133636db", - "79b22c7a2bc03d89da911c986fa221fafb80409497e734fdda388de3913eb4fd", - "35b5885dc547b5a3e81414c377c0c7d40aeec8bad62c3c1ab4e59c41c2872893", - "0453a4a9c22dda1859ff99eba798abc44201301e7001a0d7f6106568d33b388f", - "3724ac4fcfc22e6a1bb0604eb60d0dd8d1508f5d311edf54a839089cd887d8ee", - "4a16ecb8e11019027e2af385659b902ccd28a346575bbfe98b8189937acae4a3", - "735be45238d4ea7d5564c51160507d739b9cc84956a5818be61aa3e78c979882", - "9593b480433099b8a844f3da67a13037185fd610b0e1d36d5f47c32178131428", - "c0f2426c4d92c775bdacf999f29863f8ed1073f4636b239875b957bf9473dcb0", - "5df797a0834aa65c7a4dfc8455fd06c3e1dc93afe0491c553f1b4f9e95d0ecbd", - "4513b01227991131008e8b52f15536c7178f6f3a9f3d57e300595022ba45f669", - "aceaa8e75f1e6110532fa883a6a34742efad1a28b6f305c4b19ec9a99d073319", - "030a7d47ab739ed66e48093dd6a1f6bfd1948869c1888595c233e46a1c16afa7", - "f507d9507a68f60b418bdb3f4d03957957f2f150b5c2b5feb80f6a8c41550a29", - "48b4dca672b7d7fca9f38e1a7dee635152117d1ddaa79ad3b4379e2ec32b209d", - "dce71abd137eaf63994bb18cc78a7a2b4f8b36bf47ed6cb5c859eb8e66d780ff", - "3f2b2dd61902832d16e2a7d5a026fc2338ed3c0011b6bd58e29e0691c37c8624", - "b14f1eb01c83b0ae4f9ba691ceaecad439efb0484f87b19be3d54859289909b1", - "79f14d9565aadf2828c9cd7000584b5b89c162f80748aecffaf19de898a79480", - "79f5ec5f5c8f251fc9fe58fcb5cbc373fd36ec849267a352e39d1339b7a0de41", - "0c51bbad252191bc18c96727ce839cccdbc9cbc0c4aefef562a7e43a973c0440", - "547779d64eba0b25c84aacfb5bc6cde44e12be83b577064d9691310ce568c6bc", - "1077a16fd4b9e8d00c3a301a631a7c9c3159d3b32e65ae35980c6967efd8271c", - "68185415740d130d36d5cb04badbc567bbd1fe383f0cfe356819c6d1ca79b66f", - "8b61e7980b5bf810ac1728c6c57ef42afdba1e8aafd2eece7eac20620ae3f09a", - "91a5d3a1305f37eea36a6cb0db40779bc3483217253bfc452cf7fbb5df90296d", - "1463e46e30b30637cf26b44664e70b7816b37fc511db6b29f36d7bcf7321b265", - "269e54bbb8d125c24f6c38872ba34f63c932ddc53349934232705863dde75010", - "3a58d274faf9816a479fcc081ba752dd58f6e30174b320a02f4777f44eaa63af", - "b5edc45b397929ce9557bb70c4a106366230094c23a6b9c492e5a1f1320cb9a3", - "da4135fa72fc20b56161aeab5bea9afb68a2ff9cfd9de3d893bb72efcfa08e2b", - "b7af4d059520b6b30588aac04c7f2c3d66933b5a8c2921fef63b652e5b232016", - "10a21f599a6e055ba6342a54083c535210599f396101e55f0e5546683e559a32", - "678c17755a584b751052b1cf7294c988b8001c3eb6534c316f1054a25ca32a1a", - "8e5dcba5abcf847a1b1633bd0ca90a8accd9fcf47639e5846c75674beccb3daf", - "7a9075ce3d83e78704045e3c40e905afae37872c803ffd481dbd1416abe1eb13", - "0befa291bf55c33d5549163e1f335a16d2a37c76d96267c84326f94e86031081", - "37bf5ba8a9fd21ae5139c54cacbc058e272808b6297088bd18d075a97e87a859", - "60db2dc3a13a6e44699d79e77a441010382584b3be08eccd127e6c87a6fa2642", - "0b3b158830561009f25116eb719f71cdf44d01ae259eddb78c47eb4e45be21d6", - "11fc8de524c7fa5fda7d6ec1226d34d31def72308b06ac44386dc1e5c3f6f475", - "aa0e68c1fe4c0158647673e2e1ab2b85c1c80a4b4eb58d350399f6daa2a4d794", - "e75c230ab3888bdea31f1772b6fc5e6cba504469a2750070989f9bc848c4ac73", - "1d1ff79805b19318818f12c951a2f5eecdb233b74c091002a1be6861091312e8", - "a0b76874e48fab19689b89d8215c166ef2440a702feae20a87d23ad58587b472", - "40f263f5b238ba68eca71aa225981d16d798f056ae828f3d4f294f1e9cd2fd06", - "3574f091a0262e6db6521423cbe7336c5c80a0191686ac673fea66d138748de6", - "f70c463a39679b869896fcc85798cf7e9e80bfd983283724511a68e316a813b6", - "2c509c2c86a2324752f1bab6d0723c42513f5682bd935997d76fd21b90f007ab", - "f71b61b7de83a14d64cd4b46e789c9fbd1a7f5b059de7b2f27f88a399f7f5715", - "504fa6ab44a1a46e8077dae0d73c5a4903206ccfb6d7738a4e1e9fee0f997d5e", - "bc648270dbd664ea0015bde6e7fcf62b8c3d390b639cbefbd664365398e36253", - "8dd28259c0cc67c47e21dc649829cb3677d6c8a8070257f8c0be2f832776e52a", - "5adbc47d435e1f1b3388abfec05fd9429ab760a401835dec76aa96fe53b52368", - "902c4a5180f2d18da86dbb8caf5b91f92a048c30e4c28c3ea8e9c4650f190a62", - "b91938afcc21386d41c2384bfd2fb0bb96d39af0e7daa25074a67c3a3be686f2", - "3cdf9fb76fac79224261479797783a32dd65ecde3fbee68a0bbd1860c05946e8", - "e44fcfc724818525440d07b003d796ceeace33e3831a0ebcbc5f5c69c0dbc312", - "477e437a80a2e6aa8168abd9c65b034930487775fced770d207f767e5a60f5ea", - "143828654c128a797fa91635459b2e04f3c235026ef531d89c8a0f9315affb8d", - "b2545b9b074ae95d08aa5873640aae5030969125b88442f78678ee90a0b27ed6", - "f452526864b4e93f6cfaae35c04c44e16598ec15eef31d615a391952f89d0c73", - "65b1fd80f3d18fe45b87a5c86ea03666df81f1b30414613d2b56af40b89ff5ae", - "882af3d80eb77efe3ab9762ec40fc1ae5cf38e93dedf6862dda408204f94e7e6", - "6e72c4ac2238ace5c6f11ab5373507db0422a249991a1b8d73fb8bb178992777", - "a8c3cf1044b4c3186c735f31b0d838353cec78f417ef36332ff5386fda23ee94", - "c0e36f306d0d6f1147a752ad2192d33a0d97b09bb00a492375205fb899b0f862", - "15ae3ff16b8ed75cc5fd8c240dcfb768fbe94190a63c05396c11f3e54957f305", - "d220feef3277a4d702f39baa42b51ddbd2f66ce116468afc6a9d800b8417ff6a", - "859e5ee9469d4eae538e9baac9905354614565608d276033cc99ba5d30a44fc2", - "c260f73883e8430ba395501ce2f4d512f5334575a6e67f6dcb83cd1efa356917", - "2234cd068ae646a96f6eee72c1a9b4bd8675abc12d4bb98049a8331a3d008377", - "59b1f48626a9643beb3f4aa7bd9708531f7e3045113a1012d4612d5bb6961ec7", - "5adea26289f02fb5475c0a182ae69eb338ba02b85af7fa770866e178f6ce9a59", - "1f8afc28143f8be3f346449f2813b35f4ce58c2bd91a6c987ff1892582fd4d45", - "7a549e937263c86a6d3c71ab8e590cfc268efb10a9f0502ff15808b2f2494ec2", - "ae372db1dd677900fee4add182ac72094ba6d9133fe0504ecbe0953f34ba935b", - "25a30a6fa43d288661868d9c629040b60b033fd228d4b771dcd7db1c0b8e8439", - "025cbe9c2447d0184b364fcb8576561a6293acaa3c55cb1aef6e35385c001403", - "c0014fb2b2e7f8c010d7ea293ee9f66b4a571b01d189068212bbad51b741885c", - "e22839bbca2cf445644ece45711575517af46d069d119f70def2c8b4fe06728d", - "383506e45de7a344f616db973732cef86682ebdbbf262f1e6ad0d98f49d164d2", - "754aea5156f8dd43cb9fdec56a6eb134372ca6231c2621da6533b2d0af12a285", - "3405771a267f4c8e6bee56c617136bf14b5afcf44d06bfa8f8e0d14d3dbca723", - "802e447d1a746b8e9f3a2fb1309f9154eb002e1348e3eb5eec9f0a5c2a93b623", - "d17898072694706a0c7cf2a0e47e3c9391fca09c836e0a70f748e8934e71b1c1", - "396554a4accbd3d2cc66703b40d011fd90569de639f7924f686ac39e1d926728", - "be5780f9db6c6f920b5ef0597adc45fb05d419c8785145ac2eb694c3697ce8f5", - "da32d9ac28a7bd13e4308813ca817679adbdb6f537c392ff1b28207fad42d4d8", - "c89d115b6ac5330e65d6f07f5cf6cc45989a2f9eed517088244bcbb50c9bc698", - "90a6fe1607f74038e01ed2f4fef078a02370144f692c45b9cea5a0685f4e60bd", - "714e4a40df2d168e339d770968b837cc974176c81214388d99c74c7cd35442dd", - "35d0d51ee0774415a2101473d638a3659a0aa3593478ef4c232af107d3612374", - "7a7bd697154721fb0bc4111b3f454b7c66e6f78cdb5514eb967d2604e5e07745", - "318087ad4fd7ad3e606f589bc2e4a98d58eea361dab30ce462943890f20e0d23", - "f794076eccb9554cda2b91383a006c80e8624276b0e182574a9af31d5eeb091c", - "1452ef08f861ffcf0bdedd636390f2851f3483d01dfdd6859718a3c792444abc", - "c8735eba06cf276ea058a402f70830a0289a63654d45ca9327c52153760bb634", - "f1fb6fa7197ddd2320c352b0021af1e961e16759391e8f3b3202b058f3525607", - "b274d548f4163cc7e27ca7639febba4fdf05fcdde60c77b73f27213d67c02501", - "26e711ddf705ec755811260f0790e3c9428bcc40bb52a815d3355accaf838993", - "4c329d36e4e7a22799f213fa191910c478c82b08ed99ffafd50cd8dd628e7bad", - "1c2015fc8eb95d0f502116fe3c353ddf283a18dde8bfae53bcba0ec675dd9b02", - "6412e33fcd8ddec7209d551e5911adfac98e2021fcc6f227e87c845ba1e159e4", - "a1269863d20613a4b3031d15de14295c7e83420d1e244fbd7e818d190332464e", - "bda6a7f58cd2d0b03d16c32b8b3bdd86a4cf1e656791730d3b0bbdd4d480c8ad", - "3a3faacf1948298973c5dba96383793d13777887bf2014a7c8ce64bec2e82452", - "d3d75d2e3e7bd897e6ddc6604679aa95f797fa8908688d5ae8d90bd755178198", - "1c5d1d59e9751b9c423374d4b52861ab829bfb551a172f1aae72cf4eb48212f0", - "af7a1b7cb4ae2f9a5d2adbf9879f34a010fb7b6a072c4c8a27694b0136f495db", - "d1fd7ba091174495752b09cfa1b299aa7f7a6ee2cdcb236ddc87307c71ce9708", - "8c26736e0c8ca92f09d4cb62cec52043c41d934278aab05f22967c2bed75a6a3", - "5cf5b60e6be19af10a1acf26ff6fb8ad19a26eb8fa03482a5163b3d2f8e84a5a", - "e66b154049d631b2820bd975221c68963c2133298c1c4d75d62e91b015e1ea32", - "7c34f98f8a51a04c7d4f58d37f04c7d55882e8daba114252cd1ac17f60f43e1a", - "186ba51d59e9c913898fb271b720e362c6aaa76cf50bff54a76a0964b4b2bbf9", - "aa0f8fb337387d0d7762444d77005206c02b9f25611c679bd909725694c45806", - "7e3e11947293a49f41828506c907550884f6774c1acdaeee17bb7a01d01adeb0", - "da8701d31108fe75db8be70b1f6ac8a63ee1bbe333dab6f7f43040b6cc2dd9a2", - "1a5328da2339181dce7444c1ca78d3dfd93337f8b9842ecae428c23df5ce62fd", - "582d982c44bb16eafd12ab817c1d530f87fa6eed23634f037421a1a01aa30915", - "fe7d4391098a99af0d4fb4c0ed6d9a11b8ba95d177a455ee72e5f9383e6efcf5", - "9d295f9f96c600c5d075b1b46442925eb69427fde202f32f6044f5212c3206fa", - "c17b958995dc992eb8166208161fb7d01932a02b68b13b7f3051fc15b29d44ca", - "86f1507243362eeb2a1c0d9367f3b83f6bf6adf5e1b190fdf26130f95c33dca1", - "e875456a8585e175a250219b70377bd6a114e7af11a63c8384bf256a85f2ba4e", - "a2165e74a2a30b2ea29194c2f9bb49e4f3bef6dc697f9e236c71548ad1b8954d", - "02669caa4496d25dcc642fd6cf6f254ba137b4fc25041bd22ce830ee977c5d34", - "145c26238e2fb2d30cc94ab73659e9139286d6c476e459369992eb378d30a8d4", - "3c82daee123165f415ac5392119d52ff91f870a0432c392909e28e9e9619dc26", - "1e8e853b98aff80fb24b05d7dce6da2cc306e68b49d348975af62bf36b08cab4", - "71a644c76df1c2946bdf608c3ba34d8b0ae489703bf72cb6949f17eac914d7fc", - "662930e253c34a88f6fd7d366fc027b03cd8e879d0f032a4da4aaf044634b1a4", - "f5c2bc24ae3e87d75dfa7e494ec00b4fe3d424344720fae1c72e50d586bc99c5", - "014280f5ae3d49e61b5cf461287fea90e4ef596f7b92278b4b37750050c7be19", - "46749a9eee38c9b4d3192c29c98ff52efa91e56592f87420cda844abeba44619", - "9175dffab4bfbc761c845f6267cfe329d67ae7f006a93fd25079474aa8469000", - "f4d1063e298db9e4d7dc3944ea2013730b00a3c817c78fcd303bf8897735b7db", - "70768c22c104980553a542dfe16751ef91fb1cfa6d47a014abf1c307bb3b4129", - "d6e7c4bfe61cbdc225a72324bd5f245c9ce489d6d6c44348dc03ec361c2a9e57", - "078fc678715d0eec615488f2f62551bd4505e87e8e518cded77e247608b94a40", - "97caca1bd8bb40254f4fa730c08702268eb9a1f5f882a29f774f45c425b96e1c", - "41612434d14b472de881c1100364afee567f60e5a75f3876415def6dc4de1992", - "b5e49a091774c384d91e05c886be1c0cdb615e79f82c362ec49c40a2fa1577ff", - "e360d5294caadabaca4b967a669cf158b9f7f1f55e8cd17bd90249637cde481e", - "34b82fcc7797d2bf873293c76d2e44c4967d19fb9da9490ca9217e6e1b72c173", - "059a60177dc70fdbdfbeaaccd4b6183fdbb6f22036f2d6ab09a8eca084e99f63", - "5a90c8b393b80dc916aa079172df81622f7dee12da469c68106850e66a2d7aba", - "e0af91b6051670cdb404f32fb1fe2b8ca36c1834c08cf63fb3293974a33cd105", - "cad2838ca8a7ddb663c81c66c0551a2cd6c649af863f4c80dac2e4a36277ec92", - "7d61b90229e947a781790ccb82b23ee34ec3504c530648581132b30b77bc220b", - "97fb010530af7a4737e595fede9f4d64306eb4d8b98299d558494f587f7580c9", - "5fdeb096a0a2e00451a34ba66c1f6b414a9eacb1f28eaaacce43f8a5bf3751f0", - "ff299605c9fa7a41bccc4671e42fb7724dcb28f055c2f26a10697ea23e5b72b2", - "4cc3a06fb746ede201bc97039d6ed01f9e1f3d5d9411c035a3e252dab7d097cf", - "b77ae94cbddcd62e52ebeb7a842fe1bdb5581b7e5b552fc8b493b4cd31ac6fa6", - "8227bb64bfb522741f4da622efe4536983c547634a56ed6c1ac95a948ddec819", - "f4ea2e4a7ff81632d94514e881c4bad38fca8788a2cf46ca929d05a42be16a9f", - "8efe419f990242dac016d4f4460cf50e7652d00fcdeda669cdf66428157a2e44", - "ff081b0c1ad293d4df8b262599010ab790ede75ea91f583a9946cb375a69462d", - "0d737aa3e0f213ead27f2b7e61842678d74d620d9f5d3976cb21834551d21f59", - "c3e0778608152b884f9e34912298bed42760ee6d129c194227a4d533464c4d47", - "4082ad68630e7999d931d8506d32a971595d7c8730a3f475e867527790be14b0", - "4d9c550cb2bd8857c8540ac786859abef9583f7b705583b8310d126598cf3f2b", - "af02c51350cc82a487057ab6cf551a921fcc4aaebe42db2116bc183e41991bbe", - "0bedc99ee783e050006201fad2d4dcb1b3667eb17d44b8a67fba85926826e6a7", - "8ac57d21f240bef9333d3f4282ea1037791fc829c05f171e95492b01893ed79f", - "b35890174ddd44d828321a3462f3c28a8a844977769c18aafc5ed3bb4bfae6d0", - "0e26be06963051fd19e773b9947e86f97d1e44425623d94d19c468d98297d06d", - "38a8e4c458bbadc563b0c8eeabba11813fb7560ca02a9c39641b0c8ac56b8be0", - "57f76a4b62467a8bae543e397acf47e898faf739b1b19c18a42bfbc699211885", - "4c3cf5e9010fd3d64d8c82862c62bdc2532c78a12329f65bd3cfef2c32888c8e", - "18b2eab818710a05eb2558834e5d93c67c5280294e64eedfea9979361fdfd9b7", - "992ccb44f3d97ed2067c3798556e89a5c3ffa7bebc415687a1bdf00bdb6bd9a0", - "c4c70cd1d712fbf4fe5a8eb1407e80c55278f264a1a8a63d12cb85cac704c84a", - "9e99c860071fca3e374cc7a99d66a43b349fe1ee71453601c71aba7d3c9b92cc", - "dde7c2e8760a9a7e4c726aa52b5f8ab309073617a572fb9c05a86ce092863640", - "2ec19d4c282c18815bd9b0a7dba1b2ebce4ce0560b811a69283906c7fbfb74ec", - "42537955f5526804fbea8cb534842cf5266846c7b9c15eebd64209583e8c427f", - "b53238e4d1a46a9425af53c5b183cc3bf4d4ee54725b03ba3eed8c784b1cf9d1", - "fef074ccc8997a4e2d82c8d52f83911fa65170a14068ed7a1b623c7c05fcd265", - "013f8b79049da6c53fcf47c42786c8500b0fafa08a936b543f87fac42cb5b766", - "785babc7b8f5b29f9c2b1bd7dbab5a64dcf551d39bd32198c0bfd3528dcdc064", - "49d486fbd1109eb5e820309795437ff990466ec5ad809c5634aba690c265b981", - "ec98a96ea9fc3329cc05ee906fefed68037b7faf67c03f83a2dc190624366a6d", - "a6dbd721e76d173c1c119a3c801d127f10414019c7946cd3dbb540bd5da9bb4f", - "66b3f1ed3c7891e320a62b62c5f6b5715032876473c4c74e1f4e5b5e8986b952", - "e4c4d4fbccd978779675da256728db64d90aa77bbcdae0fd90b8111b71009e2c", - "4e98c1277d80cce97c8f41e36bc034dc36829da8d5dab449cfaaaaab79b85380", - "dad4430ac6982976dc8b92e571492fc70c7526cf038c9fb4635c2733d2daa7a4", - "5f84f71a7d6ad3d878d48cc5ac5cc79288dcf694297c928c373f5ae1a0bda24f", - "e6ed5702b101030c49a14c3ec1da3ea3759436a77d1c5491f1dd24cf8253c0d1", - "4b97330a3c8549665f5865c3130d9b2941e878aa58d8bf822fd266ba10727ae3", - "8a63eed36adcb8e8fe4b7a5d282f740e2b4f2a84d0cc2a8a14e13e2eb313988c", - "085c6f7f534eccfd2ae9c07b13bc69ebbe87fc5065bcf1c698ffe25479cb1a7f", - "0759334ff44cbf2697094e9db92b3785d9dfdd2229b917ab094104db2fe65e46", - "a61b799fb7efbbdfa02ca4cf2b5f956bf55f3c1b9a67070e92881dbf5fa5d767", - "40ad0075917892227865cf02a7c1eafb765f5f20a3ee967efa2bd157658d9c45", - "8cb322c29bda0a1f01e400db3647776aecc6e8a8ac9561868e88c5a19b8c9672", - "568796a0affe287285ed7d03ac22e8e83d913ae6ca623310d69f960a1c682155", - "a6a2b0ce758e919e706c5120e311b9508e9c9be51d595d632c6863f7c1857400", - "ec5ecd7c394462946abe7e69190733344735b97e6d6ad38038434fe9f9335750", - "0c3a92de8529c9aa3db331b7d20aa89fd25963d498885da0091184bc1ca202da", - "d01370b3dedf2b73108221621d5eb2277b098d3486cb3362e6f1de14abb106e5", - "d87f4cb113561aa6c194b8d86ef24ab7e5eda13d42228d7b9d2cff538ae4f8cc", - "766b9475e88e6809e7d28b6d3b3e80e1bff53e6e1afe8bc3b29258da1d76892d", - "242e7c167499e04323fc4308a3f75dd2f2c72f224b40616dcf74c16ec7d9c832", - "03a0e0c13cb506198724ebdce6fa7445e48cef97737203ef6a754a97843a2080", - "4a3e39dbac2a27819718235ec6edde110658637c46b032deaedf36862f02b701", - "b8f75b7d7e5518ef6f65160347f69b581d4f6d997c455f57ec8bc9bdc6393df9", - "ae1916e65c9db87e799261aee493e2feade96a4f029e1288f0567d7a45fcf3d6", - "d50e09f13bc8ba29d393caf708a2e5bfe84f80e0880dcd257854371c6b2f2475", - "5c0863730afbe6d4c72980f03e13f23b92df1e1014aaf8de6fd87607499a8305", - "d9625198adbf8b529bbfe6158ec90508d60844bc3bcefcd064aacf01197c953b", - "6032c64ec28a7882987c8e3162e3cdae0d1383cc348f17b5ddef8b3763d5357d", - "c731318137766e4acca84bbd7c734f509d51e73bb80fada64768867f006fcec1", - "41afd5ec5aeab651dd93fa056136e5e9fcacac6fe2e6ca63216ea5f68affee43", - "1755b2bad6519994ad06cf785b65824b2390cbb5e7f74d3e7348a1898759e84c", - "58f617a9a72b7fcd36a3a24d2c491141dcfac6dcb31a7443efee6f6f16340805", - "84cdfc77d77e45ae764d7bd221ca948e11959eb648810f2be01c399493780354", - "763bedda7782c26f5fddef770a6d3784dbec36503faf0a293e91894080c202cd", - "fd303cfc6351d912aaeb17975fd633ee72284fe2986ba9debc695337d1220c8f", - "f61a1ebc8273aa40aec02e186075edf736e9adbe8b9a2fe1578f049e1d9335fb", - "ea93315b0ddab76f25b3a387fbf1bf2389afbeaa42138f489c37ad8c13019b0b", - "8687a47ea38cf90c034b31ca34ca4047dba880d540532aceb2fa5163ac27ba0d", - "1e5290c11ecee71193e63dd9adc1918c221e283e6d077490dd9d4343bac1c900", - "457e5c814892c25e8197c464a94779ab908db98ca6fef1995528d1f4b6157438", - "e7decb1809a01a89f9b9db1c4a15f83f0e18b3d1a9f180cf7d3545ef3edf11f3", - "c4d26b4eefc6caf42552ce4eb3110946e1200f5f27b29d1e9d4b4888526d42ad", - "395190d1ab0bf5b9d48d4b80b0b346241513cf0fb6241948eeafd1a1dbc927bb", - "081bf2ca5758b9fc05cab9f4877532268637a74b677dca67878dadbe84330d03", - "a8632626ac908f1e6d47f01acb736f180caab78d0ba452dad6fc6e6990c90407", - "bae9d32ad61d18f127ac3804e4a2c91e1c9e4899c881fc099ee0e36b617b0d56", - "374f7f84968cbc29124ba610f3b7f00e2a1bb232b6f67e0aab0b149ab843d97d", - "cf52de8d72d80bc8ad0f402f57536953f193b0b65707f2355f8ef27352d6005c", - "dd13d71c5a19c19c0c77055c21c3c3b05c86206f3f8519b9a995cd6a2c88d286", - "bce4ad01659c899cd51b3a7191f16811e5ffce032b08b34f4b68b778bbe0a08a", - "fc767ec192b3a76b6013409ebce7f30f8fee37a1a7623cb5f1d1a98644a291e6", - "8f3c6c5dc90bf4d9fbde4d9b1aa7b7b760f6b995e3c324894ba235342b688f96", - "c635e12d1962c98536d685a56345ed7204d25e1980ddce4374e9a1d43cfa28f6", - "edc02972e94fbdc1b3242cb7451934497dad6fdc07044e0608c9a6214d87400b", - "8dac766b78699c2f1de15ecbb6a69209b6c2923342df5455156bc60099e22d51", - "8724579fc34aef51856d744f88ecbcb40781561f37afa0bded6c5f2bc015df3f", - "7b815061f029c304d86b380aaee6e6f1f09bf68f13a632b3afab7932d7c68b41", - "b5d83725c6243a85de3a573e1bac9b920f76e151b65e26bdf76d653aae2db52a", - "9160cae34062efda53ab6aa5cf3865a7c61b5b2e1998e5cbf074453f72d9b5e7", - "5a72e76f4101f9953ceae456be11140338acea5dc80f139893a8fdd9842041f4", - "29bd0dc079ce97eaeb4428569c3f07980067d0e6c6509d69f699a434a7181759", - "06bb3638196a990914f38a48e22f2015b8933b4848465c587333b1ef59945646", - "5adee631046a4380ddfbd3d4ecb1ae7cb95656e5e4ed0e5fa37d193760c961fb", - "7534c498bd40f6200721e7ec1f1a98ec7ab0934a3cc105ea094aac49aa64c0ea", - "b99a59e04efa8940e3fb54317e78f1f0384bb9a50de2e0a8eda5de5a0f2ddca6", - "177cb4379e7bd3dd7f7648521dbe7abe5621b2a6813c7425c992cceeddccb2ba", - "85d192fdb7f42b31e2b7e40c09fae6baf3878f1cac620bb351fe8cd70b3e4b1c", - "096911c1310e9e2737afa7060534e71c01d999a0380d18d3fb7d28a3f3e35ee9", - "2f7e773ffff70cc8551a442f5ea2808b9d6eac2b7e551dc546583c66bf7ebdd7", - "ccb0e702d2001e5863e3cc3508f19b06a11d4801e69d2daeb98cb8ebfb084a7a", - "38f5f542dba7df955cdc59dca89cd9f9eba99f11fa65f8933f54c6b923ff0901", - "f09531589cf4fc9325008d74c4c58f1a54ecbdeccfbcba176750b335e788afd1", - "84c30c4c1e8a976f960ec913f70c80c0e0976b61a8b624c78ccfd51097166a72", - "08eb8cf8e2ef9ce2f8b8a020dac28fa313742c2f1237717b5e17ce96ab02adc1", - "be77f1fb4c7b53e2cb2e3afd815e39cdd64e54c3b389016ab787e1c5ea26cc1b", - "6df747fc045341c4a13cae2fb6ef551d498ec5997518b88309756fa7135cd06f", - "ea4304ca3315e50c75bfa931c3d243916a27030d70e7faeec78529f22bd6ca6a", - "49665bbf346ad0f67f3edce834c83ef8652482face9864476c6a765b92df89bc", - "bd7df3ba6b14cbf92c27797d49dbda130287c60f63521294b03a359908311a80", - "bdcdbea6e6bdc0380db42c4d283486fe778e4a7f45613613564a87d46aa35d8a", - "5853b1a04f7fd1500d84994cd8cd5922df03293cd8c93635be61afb1fa315f83", - "8dd843785bffa87e3e7438b743315bde6441c8c5fe014fc9a0acdfc0ea9b9e02", - "c1dfaa4447a711dbf79a26ab5894fd06b757004e59b1ba2a824591574c5f3ff7", - "dadac1e137a7fe7ef7dac00fc5c67a263158070a7e41fb8de2d22999d452e64f", - "a13f0f1080ddbdc919255181b9e10bf10a1d1fe66054c59ca7a5914e31fb4b68", - "720e108a4aea28a625e1c630735dd8387e70c09ace574561609a95f21ac15489", - "3058034ef7ea75f9564c1f5e9bdf5dceeaab98029d2a4feac49d39f2c0649d7e", - "9f8960a6142feb405db0a8c45a03d210ae26d1ab003a32d468650889ea688bd4", - "05a29d5bdeff1f5fdebcbe105791cb4bdaf2b206a9b6312e40564ae16450e654", - "41134a80a2c7949c951dd69dcd5a9aafa36e69bf19de6b5252c698509f48dfcd", - "dbf5ad04457dc0c9b3f3b00015ba258ce16648214cbdd63b76bcf9f12ae09246", - "56dc3bdc7a38676e9743f08cb95ca81c8eaf60d017a7972bc2a3098955427c9e", - "add36d0d5da0800fb2d65cb42f1fb2d3595ee0a7cee251318fddf8d5bbc58c9b", - "82d2ca4e8d9ddbd8cebdb7ce08745a1f782f83ec84566ffabefd5695beb861e0", - "4550c55118b79753b445d90d705d91770d552b9a8b6e04dc5b36ce6b662fa095", - "0b8a41d1a4f2491027e00c9d663dbcd786f81035253d99f268b8e6ce535dfd9d", - "717830d1b064529791b71219331c1c0faecfbc836ab6daed80ab8b72ae9e1624", - "c96feeadc0e7f575b537469fb38ec749b2f0c35110d8e425c09afd20eff9bece", - "00a15b95cda2cda74d3b7c7244204e86227a3b3bd8caeaad845a8657a92c6556", - "98d47068eb0c3d4ffc64b07090f33d5493a4d59a8e64fbe8ce13c9038256aa64", - "a7c797a28a2320bc86379ece23c9f5be980be2a86716e700fb41e9652c1038b0", - "794e371b39359fd52a8c1c6262f2e5e1d4e9e4b3687a9b9d196a047132094e64", - "b5203ef58a8353216ff6ffc8de8194de6be31567b1116b51a464c8fd69840fbc", - "6ae56fe1a99beb01ed38da4d81cd553b00bf12445cd5d33a95596faa520d5d7e", - "237cce85168e5638f9b3d9275f4abfd5c513a3f0bb6e4e8e92ab92393c40523e", - "042f361830d677d5cb93856273dfd4bbcbbea0bc28f13b2a74f6b0787bf2a31c", - "62e09751be655491f5e2c8a74f4f50161535aa3e47c7fd57612e242c06bf32af", - "40cdcce9a1950866c9be2aefb117ca7c7292c1dbb50e7094237f26a4b3154a19", - "c11e7d450ba2e488f1a335f0ffb2254f3b697f3bc5e831e4127cfc182bf99487", - "e1fb7bc45b0d58f24e5f376cae744a3a32c49a95a7911aa5769dd8f215a3bd38", - "ac789b02d72d14534bb3ea77fe7d155aedcf8d65d18d1d4a11a50679753ced94", - "4a61b992529302f6c88b49d9efa566df53382d54004a32136c79afeeb162be55", - "f511bb187360a3b4ac9e79184ce1b0880e98197760c26a62227bb6705964aff5", - "c3473f13ed4faa354e81cb5c83d181c128eb54daf7fa1b8f20bff86c1f1b8a9b", - "5b12cd136471348c674c71f1f2a033912ad88c150ee33aa2e22e2c516524d793", - "00ee08ffb88251e137a48c8c6bb441a7871cf825b373363bd65fedebc380cd67", - "048d68cf3720134518a18bf6fc6e425964cb98fd8db4cb1f60f56e460fe14f6e", - "9f82edb5c65f3133c42ff62d23a591dee49441bfd987b6bf2eeb780f1cdadd76", - "7a2c17f286a195346af49c74cd62b3d84278422132967100d63e766ffe3023cd", - "bb4e7d8e1b1b1c0849efdfdd5746930f074ffaa658f659de0f963d1efbb22dab", - "01fd0b87266a16a0ec87aa2b7ca92c1ce861912a9d2c53be934b689a063ee221", - "d50f56fa361ccd50bf14804e6e1a0da4521fa97fda43fe8cac18fcc6eaadf3cc", - "1bc9733ddd9c0cee5e311168fff4750bc9b924c43d682ccb3e805b7021897e22", - "79083e0774c4e603135c9bc15f8efd695d761ba98093e6ec355a552f2b2a1a42", - "db966855ead10b721369b9d68dc0774c7c8aa480864f76ec7346e906b6cd9d5e", - "955cbe2a4686a6b0dd8d3b2203b646ab6cfb94ebf571f6c132d6f9cad1ab2099", - "667fc9b047d26230832b37e65ee861e1c0bbab6640c78cf3564272a78cd23b1d", - "b1e2bede3795a8d051f6ef51e28b60b6a3aedba42ad8e7a2ee3175079a6e6019", - "54ae52bb02661c85e288f7ed11f735695bfb0a77fa2c4228a81949186ad9a867", - "293ba2639377aaf732fecf09d9cae21b4add821a255f63a5dcd295c5205f49f5", - "e8a19bf9df787753599f594cdbac5580120ca194688fe48a643f4213767b2fc7", - "1d167c84857696c65283648d5ac59398164549f32123914df22068e000365f8b", - "2c89ad5d72cde3736ae422acc738bc8f8781898cb077cc403c98b2ee9a679c91", - "1e9afe597fea7704f3b02e6c0b3e4b82a2c0d705d3878dca59152453c70552ff", - "db47ccafecbc49729a122fa9de906fedd21a9d48e694db802d05003ded4e12ff", - "1f6074103fec1b2a861a97a6dbe064cefd6cc5d0fb5048a2c60803320dee872a", - "87b4f668d2dfe8f6226bc7d796c1cf97a2ffd426b2de1aa73e3d3340ba97f4b7", - "2f282ec7f0e354120c840b4ae5a81670a4fa001f9e534cf8febbda573c28455f", - "b855d1464c2d893b8d1af317d45c66ee139964a1dcebef6beabe9bf54a79d6ca", - "a7ea8b82b6f04ed9271266e589b579911f3e6309594dc7871aa1cfe44d869d85", - "64caa863d002c0843b70a348035377861596c173cd69d30a91e671e3efeea7a6", - "29e0a72a0d23f70a632ee40f0acc6534fb977ab8b74d920f744355356743ec85", - "8c864b10562ad52e0c479c3d37135797d2556e737a5498580bf485abf5c7a788", - "32a5ea56556fab654a4e67e9b466d0b0943ae026f82d727bed255d032f2f0308", - "e4243ad29669dcae51dc1cf8c9fa3c3ce3350e115fb4d3d775520f0aae56aeef", - "02ce3681f90fa88f04eb112f5fd2a3c77245b63cc86235ea4ce227df83b3bb18", - "3e3fbb115a706d95d4fffa161e0c6b6daa13c799e5edf83b68797982e260c11c", - "dca108c264cf91433a1433e6ef18c8a9d64237b9a888623e95e9f83cb1532103", - "8fdec5598064616b3956104b624cd5d0a923161135f41c649db4aa3e547be896", - "d31b37551e0d6853702ea253d3609dd434b3e1c9c5c6badfdb10c0e7e7db3830", - "0829efdda51565f309a6e9db8dd44cc416f7365eaac7d51e6fb512d6f6659399", - "a1cf4d1b736af7cf03163a3f6f0f9c241ca1854f52bf095ee6d8deeca5287e05", - "fccb86b369d58652ef0617bb2e6325a830da418e5b759a936b8606665d7fd2fb", - "cc9d653e6292da4da159e5b567def129eaa47017679fd1a8181aaa1a8242f8c4", - "5c72d435f68a92b1bd4cd2e2f746ab0260ea311ad68cf87ac52e728e4f5daa1b", - "d0b8aa593de64c9a509ca3a37e2e60639839b8aa12efe6fcb9990d2df573e49d", - "03c2dc8dcfc7c67ed9c284754d6b443bbc2908256f0730caf644efe681ed4ef0", - "1757e618455a1cf34b219dbc9d2318066a07c2a628ad6c9585b70b5206ea5d44", - "cafd1a2ee81be443341a8048e05e7ff935d3e32e2ab5880beeed1c9d6b4f7c4d", - "b6c2e8e5638cb9a3a9c24715e5c8a53a57e3c03a07f96bd1377756c3aab0f229", - "ffd130327d96f022f48289c1d9cbc396aa734111c361c0cb0ea8e874e86df78c", - "ee4c41ef69f0b50a2073e3bbfea52ff5fe0c6110245806b84f017decb5cba72d", - "fd3391aa7e6b66c6e9827f0aac6d5b1f34278126142be61d4f372578885edf80", - "fbc60af86ac1cc98c9e8cec8019ff9e83078d413a95a960acc656da43d3b1bac", - "64d33bf8cc28cc283cdbd930a607053d1836e18bfeaed6232fecd4b20578a888", - "4a7163c13abfe74156b3fe5efdc196f4c4cd38e58d127a14925e9f66bb3db4f4", - "e1c1d3e6c6bc3c12a002259607bad72d305a83c2f8f075645fcffac7f0180dbb", - "0692b301daadccfce23f5fab534b460e01a1df7ef7c4327a29d469af82a36a34", - "fd515f2df6ef3c1e13b550fea1258f96a3de6c400514520147ff87ee9ea7720f", - "f53e13f63fe8fdb55e40d111327d4047e5f59ca23c1226117afa0bc161ee1afe", - "3f98d4bc951b7f60089a2d876474d84eec20025b882ca3314545007603f6857b", - "86989087200e42ac4491528ee0616b4a6c5392f3d3e5a5f3d8d11b970182a202", - "0db3a78e55300ab5506a0d6024a4b83e22f8f690fb231203991fbff333f383a3", - "2b38bee37cf69e93fc602a66a0b17a72e1858473ce605009ae59fd27ad2dd1f3", - "4217b1b8447574f8f1e0355d3ce1584b7373befeb8572e20021e5bd79c48dadc", - "0c673e0718f5f94c12d1a1c4551c59645e9b86c5adb8ebcfd1d6d348fcfc3a39", - "a5a6c918872136b44f7a85a061246e28bed8cd627f5bfb17c4f1c91e898c2fe2", - "ad7647f4e6eb954aa066f71680f0be98c82f20e8fd6a52411f1ff5b6d992cb3d", - "3c6f60e1066865560ea25506037f0ecda013066cc7373be8aa2b8c500996ad7c", - "e054bbb49236ea3296c91bf1890bb675c6fbe5535474cbfca2f5a5bc3e8c5641", - "dc657252751fd7f5dfd44aba03e7138cf55cd4a12cdc7315b0dd59a20d5e8c53", - "190cfa9811cdea46f4ed8fc9bd1c4ac5ab8067c6c42eb31c1772ac5e27eb5812", - "0f9f4e62da8a017752308dc4d5fd82013cec765f775690dc38dc73e4e4da1bf0", - "29dd12041fc30dc18dffe6e0c20589e02b00f1b17500be9de31342aeaa9b1676", - "edc083504961ea832fa0c2e41fa49aa2c0c2696dfb314d877b46018f3837086a", - "0ace081284379be1ce6031b457c2afa2ca26cec0654266f3ddbc378e03534f89", - "beb9c844582d0006100f54e9cc587bf7a4e6870b9dacc5c13d85fa7fe703d9e7", - "1b909577268d832454c8cbd4abd3f662fb2a4dfd5b075501f165fe3a9fd790ce", - "90c96ac9ece4604ad8dd90f5e2516005a5a7bd7282318970c00a053e55ce0a3d", - "39c49178302389c1ee951bc6be74608a9426940d42465b6096d35fef24b106e8", - "89dbc9c2641b2693f77c1f9e0ff8c0e49e06dedb960048aaa0ae59fdd50f9d76", - "2bcd4aad943b8a097df551f5cc1d3151a0d6387a8358f0bbe9688dc5e72005d2", - "c6fc22ddbd58cb908189cb5d6fa2ad79c294be456acb7068964ae26c621029c2", - "fbb8a1b38544ae62edcdc185fea4bd8215f7b3ab8e7d04900539a5b60b57577a", - "3355bf4f7c4a063a1496b187fd916297501c4f3ba260de595372b7fe4fd06e05", - "ad842b769effe2d39ed3e7d88d8b0220cce56c918074baa43f83c0bb22ff8ae5", - "3e370efda33b5a61f83512e4f99b61f859ae225ea5ede202ca4f3e065b5ba34b", - "bef375503189f85577e425005f52a6bea65259256b18b82c1bbc9087eba12252", - "24928b9586263e0e0d3f669123e0312ab53c240e082aff03da368339f6930b43", - "a06beb140ad5c0c882b49456cc77447403a931deae29f7ded57f9c58f77dc32d", - "98672a2ca482a829d0cddc2ea699ce124d72ddb4b68d3ffc02a3bfb94fb4623d", - "1979b040c96a5ba666b4217dd90d1ead3e5d359778b0652586db7dcdbe087020", - "363616aeb3c53c4e42e8d4bbd9cbdba575980391aa0fb53d464ab625a25b6494", - "2bea9601e5d81521553eaa473ce54052c2d486da928a51cc19f8d93499b1e8fe", - "d4317a97e85d91db65dd1415fd68bf4c36ce6b776a5374ca13ebbae2deafff7c", - "9ecbfcb4883739450c5e203bf189181932977608cf6d2f41f9e3a89893a26779", - "2f62351c5ad7d9195d671d3efcefffa141caef0fdcee8910f0746141c41488f6", - "e2f485bfe49141beaabd6d0b390cd9d3ee6ed1f79c5f1396d44c72adbbfa1db6", - "34496d5160febaa46c8e1eff047d827dce80f674e9da344864136d5a9a150b14", - "e16f41bb5b497021b3889fc962387a69226bd94f0d1dab0845ed7e54e7f999a3", - "a87f271d291fcb4327e7b87de309846e5938e1d6297006db7a6276625ba5c240", - "e242ac754f96c33d02fd30e4248154094766ca89d487631e126149d8ccca3c0e", - "d6b8c36790ec49a3613cce189400a3e5affecf6f2639f4a2696178738f735f4b", - "4833550a8b5dec5ec5e1b8562604b48981a1bae5a9eef3579759193b5721d321", - "a931a5de3adb958fb928604382d91bc5e51e232dc49dd2d68cfce70cda36618c", - "1e611e55a67ef1a7ada312f39aea9988ab9b2b88e34e9ad477638f26e5bf1275", - "409c499025c9a2543dfb96161c7fc76ceec8d16851a17689a44ed699cc212f86", - "2b364ba9fbed36f705da621fa1438d850edf597f6ecb8e2055aabb2ae1043814", - "dc57da4bc9b9561df881ea537dd1f4a106c2264175a45b0d941f75172a224175", - "fa3d9d20ad995d9d7bdea3208c78eef0cbd40955dcefa214c075b75a0286a468", - "935f51cb41166f7791bcedd5418fcafb427ea6ebb47837f6afaf3b5df54c463c", - "abd01f166b13912b57f622c878f35cb726b24ed7d15ec1283b49c3cff872bb4b", - "64c5d8287f62f531f509a74b3b8524bb7d8cc3c6edcb5852c43001f13070242e", - "762ec6ad4c1159ffe3bc80e6b80ecce2c8022764bff09ce624849bad27f47061", - "27c9115fb738d04f5ef27a3fa95ccf42265e8eb3fc7a1b01d909201934b37d78", - "b4a7ab2302b22d0e557fc5b191b7440ddb94f6775790b5e896d00a3a87a2676c", - "e14e1eb83c7242761b939e8468eda64f64664b5c81b2c2c677e791a0578f340b", - "74bde2ec417702271669cac2f4e02cfa2cd011255f4ea2f21622c0e1ccd9761d", - "93ab095136f277920d8459a3f4d0c211134fffc3161d5cebdb4ecf9820a187f5", - "cc424abf26ccfcd2677dcd5e45478a7cd90cb0ec278a23a4840a456a43293760", - "2df8a0c1e1191c016517aa4a64e775e830a3999addf0c373bc5be564836c00af", - "1a9f2c455139e32102e4e3ba4b03e498e67c1d089cf8b99f981df663cbbc0f08", - "03fedf56c2a9d3c03c38585e9ae5a5ed456974cc15058a683df2dd36568da41b", - "c21e1354e277fcf1833f9782700c208e1fa375717a2c9f19a4af4b91ff6fe030", - "a7b33bafb50b16d59e0c0d22e6f959509a93aee3c743b25fd68833b1f860af68", - "67330632b0152146da0968b4f411fdc79fc6fb274c3ebf5071ddf2726870b7b1", - "b9effa9c8067a0984d02e9f5b8271ff57964aa1ccd09b4ec3851ab91fe83d9ee", - "7a0bede06b58de272f00834ebbbe52049d19ad4738acd4358042bd73384cfcde", - "6d715bbe599732da13271cf9b42c715d57a12d308d6c4fd3cd0a2c985bef6eb7", - "8e8abf3152e17fe73ceb8ee83227a208e05f526acdbc9df7fad943009025e7b2", - "9d1656036fc116ecc8112460fe8537758ceda1707c95401fe1bd7e73efbe29f7", - "5e9fa08bcf3bb49854b9181d482dd485ddd37995e8c05a1ae9d8bc6481d923f0", - "3cfee617ea04b0864bf7a7d872f4cccfaeb8572764e8a4bdbf13244999a1fc38", - "37538aea024bf7028e3ded320650e0a5a7cf4c17e6238bff0d31f8b3747d81d5", - "3ae38871a1db878a7a77bf335de2cf6d8489e32bb90d976d8e4b3e3f8762b165", - "a74dca470c38b726bd07f19c995fef23805c6ae95f9430fc436a290ecabec345", - "a1e86a028b76ce540c4135247feebc6b15e09ea0685804336632416e32bca40f", - "4468047fa0bf702c5efd89d22259a341c5768dbed8115dd630002f086dbf4764", - "6514856c04ad4638824354f36addd55175b5ce1c92c48d2a56083dc545027307", - "5eb0ac7024348e45c807f8fdc1884cf04e30477c2753def880348bd6b7e0cac0", - "724cd25d869e282bc9c984111d71ea299aa0c6f7f14339a5e94d6c49ec487c34", - "b50964eb6ee404edfa739957ead2f3f08a83e2e19feed6254bc7ae2346a95da3", - "13645431874215a8bf9a53eee56624567eec64fc9593428aec7eede12771bd41", - "610960bb9f1ae544d53aa673f3808eed4ff27a6e33afcfeb17e9d77acd92c615", - "3fe782c5929f950f22548576995997c8b4c940a27e0260fee3914a35703dc310", - "991bb625305f85fef1892dba675b2ab463c547910b5ee33f19878295736652c5", - "36de4af6ee62d68ebe009bacd597e9e9954db0e48bb37baf4dcae07349db9b00", - "764cd9a83da73672fbbb57931e219673cedf948589699db27fb1536f6baafd3c", - "184e5a5a37973f931ac897c2b3ad3fee9f2a340ec24b775b05bd26552199eb06", - "550e6e02d615f94a1d0a050c78660b39e217b60d6f7a2f2f10354b2cbc322861", - "81acaaeb4918939e5ea70cdc0c052325382e11847321a4474e0a8ed6733bc862", - "8c72eadee0bd3664beec90c273d96e4e0e8c1edc4d32b8c35b83cc1cd36ac594", - "c2f8df2ffd10d02098d678e8bc3d881316fe1b4625c83fcca161c19d9c3ca066", - "81cd2f7ee2ada7fe4d505d9b11689a0f5ba67feb297ac94cc6473d5ecb8d3766", - "3a3ce20643b33656e59b0d19dc081c1f8bfb35d0e56c7cdf7430237ed3fcd88c", - "30af92ea1f0cb5f295f91a8fd6a39f0364a2d6827091e54566a74235c9d520d9", - "050603bd58de36183e6535c7faf6e342595ef45bd74b05c19143d7c3b8403647", - "b324a061ee17f2993ef04a280b850053a7ee631f39ab7def4d384b9b9b350b68", - "a938c9d8c04e25c35b0fd4d561685c05e80f5138db572cb92474e2fea4734c2e", - "72e4456277f0ceaef7628fb117417e31e4276bd09414ca2f1bb2cf18d77a1ab5", - "aeb823456e8ffe071e5c69921f3e1abac519f595e9b4119a381bee446c51a376", - "1d72e439ba221d5c6fd397b0461b41f3d186f465ff5ab633569547d2b176ef11", - "6e5fe05ec6a27c3633df38887d553e7e9bfb20df4c004551ba13c6a228caf212", - "34c0c1aba4d103e3b4b0b746d88aca4f8d012f3902c86b02308c031381319151", - "9e98d596e67799b4ccee1bc6fd044ce7bed050468ae63438599d203d3caaea19", - "209fcc53c4dd8b2d1ba7843df50bbab16572f20041be6c18d3b6bd1c1d091963", - "a83a387eb5d0194d2fe7e1cf37f22784edcfbeeb4885c30eae4d82be3e88d1d8", - "c233b003ffb6fc4f2df6bd263adfc4a1df209a43eaadd9f504c271cf4b609606", - "0431183e0ad792a48693016cfff42afc9f974e1be13beb3394cd0fc153644d1a", - "0dc84ce6ac371b9e7d5bdfdeed05536a73853e8095ba06ea3dd332b72c84c7bb", - "e2c3f2a3fa8387d9c3caf7dd3b5c977ff46747a2cb7ca60335cf8778e8805a59", - "15722b163ef914512a5d6cba6fc7099ccaecce203fdd2a86449d56b4fb7dd7f6", - "670d62fd95468bc9a0d98858c5c216d34db9c4b2e1c2e0d9b1e51a2f296dba0b", - "2c42b03d0a9a4840b90e4aa0c01ce59e156167f1b40c62613c7393fc572422e8", - "4f9f966db3971957c90e72d350394a25ebbd3932c48bac22443a19127ef5a7f6", - "e2c1d6365a68578b15dd6a9f51b9e562c35371a96990af60a648b9dcefa8c95e", - "6d7d589df5ac6a1292e28dd5ebbdcb65c48b7c7fd38bcd4ddffbad381ce434fa", - "cccf7d74a4b98ff363bca9795a1468d6457d7dd2a8de4c314b8fc1819746a68d", - "cca4b4efeb3629c3ace751cb8b5f1b0752f76c9ac3d6f569cad870f861752b66", - "c029bdd25d60aa8c6ceb55429b655435bfc425454f7dea038a46e1fd6b8ff202", - "b07f7a63ad660bf91be3e5a176c2902037b2fc3ab5e1a272db6c5a7fa668e1a3", - "fe23ab749eec2d52996b67c69875bf1052ecf7d60808f031da08e465f77da06e", - "196f9dd884b198184d3f18a17d7766982798f3c33db63fd8b44696e190e15fe7", - "0855bb25524bd09982b0ff097754beef8d96e74aa3f1b6caa2530a375bc873f2", - "cfe37fcf2d77983650600de2967f3d0558b9495398f0bcda49ce49e111debba1", - "643dccdce15e0467640d2c620fda71ad7bc49d7293c3f420db214218bc2cbe44", - "aae19869e68a9558b7f3404334fa9a2fb61e476b935e1ed02afef0e9fa46389d", - "3b5ed6706a6a0d68ca6758bc9c037e7e91f62cf277b73e42e77ee9a293ec4102", - "f89fc68d852cf819fb0a65f102764a7f72cf5c4386132d8172d1c5f8336709e2", - "d39306bf9b030a8efccca1013db8bbfd16c05569ac6f8f6ebfd0f9de23632b5f", - "90db8795ebd87f6c5cb8506eac6a2a047d6810c1c3378f7163e1ae8e0397b4fe", - "a4fea368f41d70ea7a75cc1a57f9daafb3306a016149951f42d49484e8e7f53e", - "830f9a8b7dc9faa157c123d8a1100cb8c1046a00cee441072175a4fd8e6dc1bf", - "bcb46ad8f2b6093537132c76c5502dac64164bed608047b03c25c51786c555b6", - "d72b68fc1a0bd2efeab2971c0c7b5b8fb588b6d5b7f226d3f194e4a1aee37d94", - "1796e059882925041ee1ff14aa506cf6d7b9811503fe62760caaf54e4813bd2d", - "8cead5df4123cdd515fbfe2987080a298da6f520fb5477bbfad7d8f301970171", - "29273dd6fe6a6f9b0e892259740dce2184925f85e845d85620317abd412a6902", - "ae4dd8046adcda46a2325270e90eefb17730ce614cac4eecc16b249f73b295db", - "b2a77e029d2a30b51627291981af13111e1bd6d070b42fcd31aa97675c404aa7", - "92bffe1655cd10d9d83619dafa08bda1f39286131eb2da31234d67ca3709865e", - "691c0e7e71a502ebaf0e6d067c5d07ec3bf60a4124dd95d5603a18d63811f258", - "700fa90f1dd6a11b8faac5cf7c54c11ec8d59b6736ac758788a45e3b7d2fddbc", - "481451322ddddc63a31bf7585b5af7e821370ab18930da92a4e4e8c5e58e95b7", - "0fc5eb1044595d0939b8a6e0f928f547d6fbee11cab052d1a9ededf2f3855ea1", - "cc2049e72eff0e32d2bb051dbaed27b8162efda11d39f432183fafc70b2b8527", - "43e288744f8dab457c1b719fa31b523976a8b303717d71fe3910990f2e02cf2d", - "793e7325c126eeda8f32c244ab7f5bf164e21d2fe5d6d2ec97181833e685f83b", - "821be99080c4b2949ed1451a2d7aa0ce0a353899dea661bfa365d1bef08b0b64", - "ed1effd8930f9e7fd9fc389721c904e59ae4fd78f799ea68bf42760b959a86ca", - "f11d011416840f5a741251a40657db6f6bfd36eef220b53a132e00e810158698", - "905b05656d1a46ea9276d8c4b6b7c43b5149f8604090dfc97f596e6546002c73", - "d67e375f02e178fe9d7a5d9346fd9c45169b1b5823396744058b88c354b63436", - "f31779c5defc82977deabae24790ed93224605b3c6f12ce611e20121fc5ab7f1", - "e3d343c0e76c5d30548da844a5b2b12c8859521eb6f0f80c0c365e688544b8eb", - "0a31844f6c6e33f76818adec03fd9212df3686eead230ff64242d272c64b8890", - "ff5ec15452ed8bf734db7f7e0135cfe065057a4d2a8bf2b2305fb9e052194aec", - "15db83bba2a70f21378fd34d95e927242256c6bf6c2c170ca3e9e75582a7b928", - "d23e5034e4590b19bda4883a15a3dc087b997b80342a2fbd9910d9689a9ff7be", - "4ca4a7166a737f2a497809e9c2265ebbf11802a3d9df54c0a090c4755a07090f", - "81ab57c0a66505c41097d4c14450ae91dcc0290ec2a744a7521747d8347f0856", - "c76736b541ce0e105cce597922f04b86b1082ef781d90015eb9a0205e910eeee", - "a175109ea6743aa4b0a71ed24b9b2df5c067c3bde4ed81d2772eb42e6a2fcdac", - "4fde130cf4fdf17f300eb3f180cb20f951578aeeeb8ae5fb90dfe340e5474091", - "c1e288993d326cf064205f22088fd0da3512636a7dc6843bd0df8bd98ba09cf8", - "3004c89c80e50abf3a9290897821fa3ab591bd6272dc6583f3d845a02537feea", - "2fe83b0dfaecf83d230602597e7e681f1f7a9f35e1afafddf95d9df9b2a164a3", - "d4948645abbb2629fb8f04f31768db224451d4c32942c2598fceda0a0bf093e7", - "9b37113bd0242a75f00b52ddc329de8af44ee0ff2186c5d3ee7e967da14e91fb", - "c16e6e598d5e5aa6b9158444315216357603f19c67a76c6b8b14f39b85dcd80a", - "78200c0c4cae7c724aa60b6af5415060fffe9e4540ddb6640dfbcf4709fed59f", - "48b9fcade7d73bd282a1c41212275296d09d3b5754a67f61d652b0090110f8dc", - "bcec386c0b26b21c5212646f53fb784df63c21ecd77849e17af495d465d51867", - "9672e0ea2676000dc5a8277bde4c7c440919b4f966c0eb150ad2de9c7d5a1f95", - "87700f889a3f5107062df45660e9bc421adec15d2bf9e2a4eea47565943a8a9e", - "4d5ad0e11112d621116fdd0b1f948950ae8028eaf195c8140008a546cdcd6cdf", - "8b17291e51676aa05c63d93bd0ba51e255a0c4dfdf6c12f714841d88d2d1bcf4", - "d9b397a1526f4869bfb81bdb582a715944a32143edce552ee0043325575a266e", - "ab405586478b5a7a95a1667bebb8f2d185ecf23846b738406ffc0e149a7bf6f6", - "2918a0354043a37ed7683ae3783d0c46f52dea406aed2148672a20c09078b5a5", - "8e6c76442b0d73839e4208b1da9fdb1168810aae867426a565f9fd6ba9cc0d81", - "9a223ce352322366b1482a295bef737aa775d875157af3d052c6e8e487d96410", - "6555306b0a54e041957d82e5721c447a0b5821a0392fbb8422d4884a07c33618", - "6d913d11cc6954f9bd7276af638d09f7af9c10df28e9d0bb0555c716adf23508", - "7ba67ab36645f7da25f7135cf247dd0571b3583bf4dbd95cee1f3d6469b14676", - "1dee96e5a943a21fce8542543e7a5ec56b2a77481f6d5672d1699456e67b4e42", - "01667975e7b0135d52fcb1a41febef006c99361924d4f347289221b83025ce68", - "9ba2a04b90e97f0df5561154d56a39b9a52e62652524e0c9e8bac1ee1f2a7222", - "f3c6609846ed3395dbe638333aa0aa7947324a10d117f566fcf944e769425f50", - "18b764b8279d07fabe35710375d924a8bf0b7db5da64ef860ada5317b69cf921", - "7b10d485a850ab0f22ad12053620565b8d1f0fa6e6eb84b6da38cd1392e19855", - "904e984b2ed0c932850b8e29572faa7bc5e621cac398b350a3ed8e8d98d4da3d", - "641aef365f222eb5768119443fabbc94363d7f3a11c15feb80e844d29096af08", - "4c9b0b646e38be24148f11090498d2c28ec83702922408fa1f41a0394b414dfe", - "bcc50d6f2f227ca78855e7ac251f0779cf876a2bc97369d7dab8f8abc7678762", - "3d2521f599c2a926c16468d6b7c9081f832e933802b4416d47b860f0c3d57944", - "c8f103d300986848883aa7ed8792cb88d81ce8d4ddd630b15432144e7baab0f5", - "26519399a9e957abcccabfc0565623860da210e4b1b2d1815a19a24e4c06b4af", - "1a6485fa210b03ed22cb113168a9f50d8fea57e917c226ad318278ed256602da", - "9c9a7cc692eceed0c2f50790afde7e4d09dfaa905fee94b3f990c1d383db1163", - "92745f9d1c8a4746f878d105e123eaecb833bf3d44d540c9da8bc51a894b6d2e", - "9137197bc43ca545c6220acecae6339fcb8eec3a1cae5cc1bf2051fad67c50c7", - "6041d0709eebccc7815fc2cb687346d0da37b34586c1fbb7a4b336468c0d9314", - "0aa3c4afa1c30989491cd09e876803df88e833f26df3994472e5d2ad0b06f0f6", - "cdb74c7dbddcfe67c86eba0d5c24f39d68046d8e9b7d868c1233e8b3b6d0b749", - "396767b776104396adfe04fc315c3b0e564345be796672762b1295818d1f3ba0", - "94c933da7eaaa61a51387d350af067dec193d9f5ce56e2f5356e4d04a4ace8f2", - "4ee7358e9e826bd1660181032b878b4035bb26178ceb669aa71c2e661cca144a", - "641c7dc22a1d4f198a1c1dfd57ac50eb5e7a9b3995d34783d8f74114adf79dd5", - "7498bbd2f13be2a206f30a2a2a196835b557b7abb6e83aab0a7b84e63fe83843", - "52b14dd9cfff908eabcbbd5a222d0803da3b92f2da233c6c0f1f06a9bb6c770f", - "888f4ece62c5dbbce1937cbf543eb05212f63366f508c627e7d9bd257f1b7621", - "0a11aba0479cb6053fd7b7fedcd507c155a048ae59c930d6a2268f2e46862304", - "04a7a28abc2c4b57b74cbb68aabb5e361abb2179ef6a7742dfa398ee7a040cf0", - "200663bb444addde1c18b262a150d3c5a7e4842df9b437821421501cd6d5aa3d", - "d0719aded574d7c180e39346340e05c85fa8336efbb06c1faa334827c9d9ed6b", - "873fc1fa32a6a620cf68f572bb3e0c0a630d0938e6c66e46d96fc9734054638c", - "7da427cb45f1706677b29b8d55b94d638748e51003967ad98367f20d612023da", - "83fb943f8eea41f3cd3dd1f2802a53ace179af917d15d1bffc6a36c742023b97", - "d86d89e75792d2e88ca859abc9592aa06c07ca78d61b7ebb6845571490168091", - "237acf9335e404f4849c99abf55410e35808c7191fd952d1e117799f1463ccdb", - "cccc4a7b9ce2843f4cd4e1e47db4911728f13e33efdcf740949cdd1f161fa23e", - "b6182bb81efbcd8bdbfb326e2feffb2d62289e5d2a7620c202667c2cc27b7db2", - "11568a06a013b8e668d7f3faef0886d98ee0a69c66bca3a779e4bb37a1a48eb5", - "943269ce6b4376ff3f609a5741253dd4f02c5759d429055adda144d03770d6f7", - "6f1883802aac20b6d94d97b4d20ddd2e5e94fe2c37d39110cf6b39c882a64c0e", - "96c37a92d98181cb55c1ff5b97c29e2bd7550b1c68a08b5d56319b936076f406", - "b74214be872a4b20ebbcab16a6226165261aa1aed6212637669b5cfc8256d8b4", - "403c906c38639415bd1486a5c3c64895582bc0fdc6a9a055e4bc67372c6458f0", - "1c120d68ede63f15e75ea45c9c53c375b785e21c805fc6b1359e46be2c0a2fc9", - "39d42faa7664e7635545aaf5bf7958e9b924a9c57a08f55a5faa621efc94456d", - "1cbb17dd2c6bd7d6d699dc44d7b6d30515acf09cf87b969383133a13c7a8395d", - "3e24bae2b26a3448ac9672fe56ef9854ba93c6d18dccd533b6da315724537bc6", - "9dbbb0393a5a4aad1709fedf6edea866c674bf20c90bb95ca81d55a0471c10b0", - "7035a3a4372551ae6b859636cc30c8a162ed7522edbc815e22576e52f286c2cb", - "3c4e802b6560ec806690a31eb0c4de93dd953b2deb13c31f2ebce93fd7e6172d", - "e73ae07697f86fd33f9760b8ff975ea517f7a4b987d7db708fd85eaf2f9622f1", - "00a481a826b4c12b5a028b391060a89f4437c667da21954e033691242d152ea7", - "0a880afb96f8f810958bf6e23742b2a4d36e93734104ccd3b52ea670f487cfbb", - "99168d4ae5eb9a8770e46b19332ec8782bf8dd139e4d6906f49c0a428dcc9f1f", - "c16d646a3882dec2c7503e807fa638e1320474eef0dd64223bf6ad1e6f4701e6", - "9c1af58b5da36c40f08a298b51c0b2cda9d50e1ab424f879ea3dcca2341c67da", - "cc03435c9967056a7e5585525e71b3419086d3d65272102d18aec0f4d32eb694", - "8cd2046aabbf6e6f65815ebbac861f0f9203d74013e1f19c9dd5db74bf8c0008", - "44c61b60fc626f536f9d7ec608cf3f100a263f3f02ea1ae399a3e9336b58a200", - "7e28640973d2b210fc27bba7a89d6b012bde3a569ba857d6774155c16f13141b", - "c83135e31c1ced072de6bbe111acc7d4a019dfb38b4d0ffc5ca65a488acb8de5", - "173f7986e78d77824c1efef78f4a65c861e0587e7a1de3f8dae38f46b8e796d3", - "0ddf0d0e78231e89b8c1f12a27d6a5daf0e2e15549d112481dc5402b968abe7c", - "698539c100b2000daa6ab22869e761c93d90c026d943a5c152d18c464e8ceb3a", - "77a201a13678daba48b64330056f27d50f9636c0e077dd3b865bda724aee6271", - "84d58e585e54a6ea0fb94a7f82aaba473fe1703aa91d0b716011c7d161bc1571", - "248e949693ad4a1a84a29e48c5f2be7809852660e1c37b2feef414a15886e7ab", - "cdf30987cb627a7dbace31de70d495953f96906874e8d7a8b4528c745eb8b1f6", - "60bfc67cc3afd124e3a2d4a7f61ab95e1071518084cabbd8b33077694c0c84e2", - "ecb37e8a5a404b06d151e980a551d133bdf3ab67fb8c119c293286fc5f157a4e", - "ba3a10cc516e09376fd2abb1eb82fe1679c040291c00aed6cdc1a8a1690a2d7e", - "236f44a51bcea6a15b2c51bfa6968ca8298608dc21b53e6555aaf51ca0cf0d14", - "f6cb5368e46ff45a81841f122e68c20169a0b3e594c9f74c2aa040ab9b53e863", - "e753713958335ac1372104197506c59507d4ae0d72f03b69c9a0c929230ac3f1", - "a7f66dff9ea1de5afbecddccd8a8cba86694650cd04536c4c782973bd763c8b1", - "aeee95079c24e09b734bdc93a00a5faa850ce265bd9421c41794580d70104b1d", - "719831e41dce573210ad15447cc8c0b413c7a2815df6b3c724711684da88c674", - "f7f0c9364c3aca35d07f2a57c42103ccadda83877c2a78d2ef3f56d7a9a7d5d6", - "69f90bbaa687f1e7631122b391d332becda5ec3d53efdc40e3f8eaf9a6fc8ae8", - "3408e38eae8f9c39f54bd2d6828a72a80129cd9f09b854234818f779abe76812", - "73969c65035e0a59761fe91447dcfb73e1f0380115dfb212ad3296ed7fdbca4e", - "59b05a2940df3f5911a915ef69f6524ebf5dce64b7c9590f367b97d38788a748", - "9281a4dd889d7919792a8d68b347799a488fdb66c2e4465b37e4b38d9535cae8", - "97fb7b3d89001a64e65274695c8756bd57b809497e5e3f3944e459c6abbeeac3", - "2681530eff14b8121df16b1c24de423c4cb2e4afadf7c95edc0e9521108a381f", - "767879d3709944355bd20660b453a741944dbd06abe202320aa9ca1103c2b233", - "e236976e181c31a95895fbcf994ebf078a7281fac65ca902b9901fcd2b93f675", - "2bac4c43757b339679dbc77eadf0a302ecdbd22db9962b8bf73481ad2633b3ff", - "7b9fe00b8d156b338cb3b0cb7971fc75d42c11d7a43fa3f487b152016264d497", - "43b5e48e9e693aa74009bb69cc69f71349920ae01b304b5e73d87abd2b417f67", - "5fb32628fd1bb99c799d31b9753f9b6679220dc22b4145d028022267c2664cde", - "b3e4e6c67af28384601f4d90e2119de1f1235a3e4498e59a9b1ef76ae85e65d3", - "98906ac78cb3a6dd51574b33e1ed197bf853e1a83035863763aea58b0e6c53c9", - "3a8be1b51a6f1d6687db40de5e7dd2ff1e49eb9ad7ab141df350dbb875ed9e78", - "ad306c2886bbd77875b09b7c3bb4aa32c0ea6be33c2726fb1f54a2baaed1e2f2", - "89a0a18e4934cd3fbaad9c2ed762efbf7e44ad74184298dc876acbe6f52cc220", - "6ce133b1b26091446518a4ec42d31600befbfcd1e2d2c3d18b9c76802188c3e4", - "b9e2bf813ffa1e5f7468d0ce6b8926786d4b0dc0d95bff8a35e28dacc2b524a2", - "ca7c9c4359dbe7b6034a5b6dbf714784913a59ed84727ce1fd92288771260755", - "dfaa8f1be6f0f99c641fd70a4263d48df962b08c990289cc00b046273dc4eced", - "05675a24f503bfaec0822b5238e96c4c4f45ec24cc7cdd6ebaadb401df2eeb90", - "7e802e5f8c91e8615c392546f223ac8e4ccd47878f402fe4a7643ec29bf06891", - "3513d120c565f20307b80ce02d95886f5386a3bec6fd12af8e39630763d4669f", - "10fcd916b0fa366893e2b5a6a5fdbf6eb0d0537a762eb1b6e4245b037ad0c255", - "a8d58bd6fb466d31207549caa4f003d798fa48409af827f64c38338d7722c3f8", - "da80ef7ed16b6c643d241bdaaf8e2415142b37268e3b0d3de4122fa596e8ea88", - "394dc953cb1ad35eaf181317f094c135b790bd2f23304b7162ad22cb163e4eb4", - "6178a9d7492f390cbb6150023d6fff6b81976978225be812c97852491745014d", - "de44e2f9834bf5f3f7ee6bc6534dc775bfa154fbf0f9b40e118f51844c066d75", - "5395208caba0d187ed6e06fa3d40eaca3fe405eb57613b5b2a888b88fa69a95e", - "48b5faf080b018c697150ff2beb2420ff1cdcf8d3f0c26e43b0db15d0fd1beb1", - "606df5b97468430d298eb7e9b2cd1457843f9651008474a49130357f44cabaf2", - "a63fbf7f0a48e0b11ab2af5e42895c7b18aa0780652f6d1c6be53b7dd0423a37", - "f432e17b28e3855b0b7b0569dee1feebcdfc5877f9d0298352618714b43f0ae2", - "37b548825a21d22f706c2cf5ef202ef86d6649e1d95b86f4079a5c964dca8648", - "0541c678c6ac00ada27887f101b3ce174739a94c60b9555cb12d11363831c4df", - "31151fd79ae968c96e33e879c3bbcb5f6a56aaeb7e9527d8dd5ab020f2aaf811", - "c12739c108cb671530eab3305bb4857b0e8522382e3c3e3eb2d0db6183321e9f", - "b0bccf01462670c4393971bcfb22616135a5146dcfc92852e8071f1ff0c76879", - "daa5d78090339d4b8e81541c0750dbac4f7aa04f4630aa77e447086841b77e90", - "2a62ebf76a2c303eee9ddadbf7a70fca0d6d74adce3df14fcfcaf1fa6ab73f7b", - "5b3c10d6cd964032ef838509e5faa315be9f5d4f9871800065edb7bede8ff12d", - "c3efbae731b192decde9e5b9dd3b677741b5cff559e430efa9363de55d6fa428", - "7388c0d9702f8f8b5a520f1cae582f5ed01b8e9180f2d7df45b7e2133e58642f", - "199ae9aca9463a557776a3a2066bdf240f472a573e4cd7282cb6419b070e7ff7", - "e8ebd4c8270d6f421ba9861fd679a5dc1814032269ca2f1833f2f7b36577684d", - "c5ddba700429099900294b0cbbf389717b5c10a32dce95879e518845c403924e", - "3fa7a3c0ae062dd11c46173d9e8aac4fafbecbb6b4ca6245bad39bda706186df", - "391591c3a457f8098ec5c1493e4c6fba5a9f2af28ef5e2bd3ee021a34a48dd04", - "ca6cfbe9551e9be715e4da70257dc140ee947ddf612eafecb4a5afcad222fe0d", - "202fb2476bb5548ee9c40402124b69739f2b9ba36a23f5bbec8813feb3543d15", - "c18867f91beafb57441720dee1596371e2142b0d180c9e0cd64beb4148f53633", - "d544b44d2db0658832fed09fe2ab566135733f232c2826b3987b99600fdc5f04", - "6e9d4379e9b24add8146c640859cc9c7aea1ee94457de7abd9a551d5c774f6fd", - "3c41b673e59996953920b2531a40c4e16838f1dfcaa29a5cfd3a11ac0f659782", - "79df85fd62e19b273c22684cd6c3cb338ad31b96d9197342b955a8e301706e09", - "abcc97f78b552e8ab28e543d1ee27f87dcf61f48dfa738401efd2a27c78d6d2f", - "d56c0237c09ff4afb24ab0e4d706d5d85d015347b469c26e10e0479248b01ca0", - "a479bb31fa8ead050e10d13b900f983f709c28b2c129c379cfa59cef1b0a8507", - "b9e87c13ccd6cd9ec11b4a5e623a1a44f8f3ab58277c29244ef94274deee938c", - "efc76c9da918cd32df23ad96236f554bf6d05a13c892a082e8a1217d54e01cfc", - "1c23fd35ee602d61e0acfc7283edd962d4e4c8239fc1663fc2fa5a9eea3878d0", - "0255529d011765172b4eec298e77433e2fa89ac36b53a70a08927622f4d88019", - "7b94c9126d3b7d16a635becc080cf9ae692d88bf81175ea16af843e506ede4c5", - "59e7a636fd32f1929413e4bb2e5b684138f56efcdc2db668ad2209736f9e4e0d", - "5d3b97fc181437a29c6578ad604a1eedcd8adf17f84574bb85090bddfda58f95", - "0c4d5322302de0adbd36d2c52f21442194af0f6f742696a6c502b56c3ba1f89b", - "aa4343298fd6bf41c077c1ee9239636ac3f0d0a82138744ec11757dbd5ab1c62", - "4c4df40d70a05e034d01c9b1b87f187852b3a38538565adfdcd2c92bf402e4bf", - "daaea668e4c5ce0274cfef0da174ee2d6b13900379bfa5c83dd6e926bb585a4a", - "181e68231ff30839928887215f3f62a2fad10d60851e3f33ea9893ef148fbf7c", - "81defcf9104035ee9c7dc76683d043a6c62bce8473a7861c6530d35c9f37c760", - "558fb01afa0266792ca10bfa10dde4717770c2492be02c1f299f64f2680b22c2", - "9ab0a26bd2441135956b40042fcc484d6d2c0e8fb5e8474c787ddc1ab8ee49f0", - "8a8b5f844bf69cdd9f5b88aab8bf6c7608979fc33566266ca6ca5f2367d71fb1", - "75e0655021646fe9e982976cdf321de1f36cb415f7c0f76e56c8343299dcb217", - "a5e24668708539bb5910fb6eb4a2c2f6c30127a018982c81616f478dcec772d4", - "0a37d441bf6a0d9d1d24e2c657fdef0d5c85b5d7ee98c0751100b15902e32475", - "a934ffc24fbdd74ba23fffb0f2515742eef19b813f5b4fee40106c46ce7f9253", - "73e680020d6abf1bd5b5c0fa2718c7b90645856f35bfe5ec0e554633182cf32b", - "6013f1fcfbb11f8b2d59f50cea6b67996ccdb3d13b105514f890413a83ea62c1", - "6613ba0ce665679052b245788a90f02a8a4ab2a131193def66c87a6a1f26a1ff", - "ece3198ab5d1afe65e0c4f845cf5d2f7984e09e53e46679386e8aae26803d0c5", - "4d9da394ebbddcd453503ca08ebe459bf99228c4e68b91089cf0c1d5d7aa5352", - "f0d00459cf24e91cd24332956192e09ab4133ab5ed0b88448ed8942b3f04210f", - "4cd0af0432e985b7e24c5943ad53b80979c5bb9ddcf9c1c72947bc27045dce08", - "f1fec73c5344100ce94b703e32e5d848689aa7b44e607a1dac9b5ffa28b13c7e", - "1f008640cfd286980b13efe2dfa7069f95578a56ae56f685e07d623051c4a33b", - "881d708499d2ed932e36dc987e2e06bc5d8276ec90f67e2b3615bba106afcb07", - "27c7a499977c1a2d63482e434bcf3d2b395ec3634e84f5e4bb4ebe09cf3cb553", - "06f86c4cfddc2fe7277bbf27b0ecd790f2f92c01a25f6491026fc4dfd1a475aa", - "68106f4bc6103427ab4f3e0928ceea48067d9b1e3fd914393fae1e06475724be", - "ab4ae55add295a77b8203f8f6be6a1198369aaa2b2397e997167cda90d8fdd98", - "6ffa71d711b307abc0ba7889e4b1ac8f74e693de0d396d88f192ba0dff96d49e", - "322c1f715c2d45f543f40aa0c5a90fa694899489637dabaf9fdd101d9d7aa153", - "ef6a99ed1f9d5df670673ceac3d916e12d1c73133728f12bf8cb9aa6b5d4a7ef", - "79dee2b52c470cb1d8f7ea0a280128066f61b7b490c12dcc5bea331e6a20ebd9", - "30ccaa0451970f9c336a57cd0c7ea56c328a2de61735b78b07a21367b246595c", - "87e07d66ab3bb1063e9cc58340060fc40e168174c86a77da71be2c423b98ec7b", - "7754bb78980f7e9f3f2ca8e9abfe8d219413cf7d9843965a107924d091c3bcae", - "86a140153916661a49fa6a3831c66fa212307a36d0e4cb7583709f9f70313387", - "6b027d8e6a7b41b549f0851d74c47cd94eaf6142630f9a7d82f97d3929dacd64", - "60a0ac52a302ecbe9f07e10c0bd6ea2ce5b7ec40b601ebfe7b6dda51b1bc0b4a", - "27e875296558f6996ad9bd009021f6cf027d10653ba136968a35842632158e8a", - "dee093752fdd7190e722316b7f30584c2105c6a37065ef826c54cb3d6c09640d", - "1af761d602022abee160995d20345ecf406c5505be510159aae5a66013231505", - "5910930eb08d39159154aa09a6c239c59ac55b5deb5e8242ab959303f16d38e7", - "cb772606e4e9064aa740b658621de543e1555760f7bc5ae7a0321efc6ba36e76", - "82b355191eee2102c00039512516163451f15b5768ee5dcafa6cde76a88b4dea", - "4c3f0aa6548735da1bd763d417957c1e1f58371af31fb345b3dfee18ba120824", - "c168a7d8e745277281ffdd8defae7aad50cb8954fa8adf04db9cc75225605a78", - "90da0177325b53cde042148ddc0086b685ca964df143e7e71cdd9cfa14425cbe", - "311e0ffbe294244564a331be82dee8fbc1ec6b53004a8643864927c8eca51986", - "a8f7bb7fcee6cf23067ee06808c841a8ba21ec16bc9ec3b34e2773a40fc758ba", - "cdb12ab90f05ef849938f09bfa46008985c0e7bfca6f292035e62d0ba53b291e", - "e63b75d457695eddb2fcfb9c9b44de5890964ac91fdea34348f8fe766c6c9e97", - "55411809dc80e794144d71dbb52d48ec5625a36f2d202340577f25e32830d6e2", - "1f5c23f1b3bb01fd0f6d1aaae78be3454df2dd6dbedc02a702cb6b4d5e9c7941", - "1071c1d6efd0a80d34b8c9ace1ce0baf9587cc4a0c22f72e90f406e3e6b2a0e2", - "b11afa6c4e33489150954a90135edef26b7c60f1b9a9a0001814479041857eb9", - "92d2fc01437a8e26935781c643024ff2e8e0ec033fe2181a787c01d5dbd16282", - "bed3feb6bb92f8615cf646cf05d42a662cf45af92094cbc9ad0752ee31624ce8", - "a5dad03a998f89436f72fc53dae4c08a2d8dbe017620298799b45e621ec438b4", - "f472843d191daead6448a13326dca92a47cd2b899080292086c1d1c480b8f73f", - "00acaa774e5112963e0a886aa702d599192111215ef5c95500fc16b4cd2b785b", - "d51432ab20c55df62775674893c9c0ac50184408097c691ea808a0d8ad665ba7", - "2c3ec78b6183e4177c7aa2991fd5f8ed86644b67c8781ea8764789ea789ddd4e", - "54da4a50d97562943a7f48fd6c87da151a9d4219f843988d241ef30e03c7dc50", - "f699fc05ffec6dd768e818a531261ab7a588918e4002995b5b39558e06143b50", - "dbf3dbb5b255f276dc786f3fe8f7a205c4e91838b1e377140aa14bc360456888", - "49e77bb809074d2ed0699918f32f125dbcd02017b705c4b7290c8e3a4ddef765", - "f90cfb4f7ac8fe1d190c3d0646cf9691dfaa28303265d3f12ddce50d225435e5", - "a454bca3e2ac3ecebf065631c6456e10e949b647506ef46a4df36bb9947b4d94", - "989eb844b8408e75507f556fe0403a7194b55e086b7e4e32207bc69feb44cc46", - "4e56c7eefa1c1cdb8b066a39b70e8e6fa21943885d25bcb9e926983ac02fa9a0", - "050568a2ea35fb07ef55075b585044c458818fb1c4d31e43082ab89652185197", - "cd296ff083b7b220a23d537156521af10605204b3992d2ebe2c8eef3e2460372", - "d86f971adc5856d2cf29a16cad72095a8cc9a0ae79f1c5a5419177ca6f81d191", - "809d31b683e101865fa4c14b69d282d1d0d4ce0884273675f24b286d9cb099d0", - "c42e3f183079b0e8185b8e9f1a792feb45c54290f1f7f66d162835f6832beb76", - "9896b98bdfa2bf6121b265baa0c8bc3ee49d4041b0fcf38146a9011ae6b7601a", - "d96156cffe6a856303cd681373027559c72712effff1f5324b5d137082a3c868", - "dd0aa1dd2ace7b4e34f9d35fc5ef37e63def2e7d006d5913808545aa6a012102", - "113c31631940dbcbc4dc88ec4db7d03a77daaed0c35b50d1139ea582586bd060", - "a2d08ef266ee0b8cc72838d9c792da6017481828b35877db199dbe6a8b40bd73", - "f90b942dc819eaa675248d8b052ae4ba59d8cdc96672d53469a25aa0d8d5348a", - "7a76f70e652e7ae92278e5a40e85df906083d98cb83fd05f84578da8ce95d519", - "0ca79be08c4db3ad6e6dffd9286fabae1c2f40f7393f00508df0f63c58efb0d3", - "2b4926acf216c3a171f9df7d98efb17bb6c1e61dd3ce67b4dce7654a9033a01f", - "b5af70c95de0f09218c0a41fc5df99e7ec9e4cd3047346348ea73d1c4ce0481d", - "c1c0c204d4bdd7b283f5187d0a03a3d5410a52984dc053341ee0616f4b1e4dc0", - "1450a384ba23a35cbbc1bd8e3fa6290ed4f3931c70bb206de5bf648a54ffdae6", - "cb1b2da37384f0dee2800a63096b5965cbed9355f20303620cdf3df16a9ead76", - "55c7dcb07739a23e5049f038cbd4d90aa27c9880f35748517438fe665e9cec2a", - "cd88ded37fe9b17d0ff12beb46f2e790f2e1e4af367e9a10bcba568e1a81ddbf", - "1743bea91947a7a1a2d0d128286aedd9170933f9754a565a0391653c5a1a2e4f", - "79fcd61808bd335f737472a433280fef54678e7f1b6d071d0ca9fb1df37f45fc", - "f7ff9169bba6906bfc8feed8fc31a621d73506de25e8994c399b0ec35fae71da", - "6cef62c5ed3c3fb1b36375b7d35ecb41015f1f02a528abf8257864db56e651f4", - "18e27b9db4bd11de4acfac4970f0eda567ae7664d04f6404f18bd12ca4d9ce6a", - "498d04beb690ea4c22a41e268f85a29558dc567bcf661cf8b5bd612cf83d77ff", - "8ddcf456e5ffec537e9ca6c02a510dfd4eecd6afd6075bf366cd18a59708d7a3", - "65e5333b56583dd6fa46d050be2d0efa80aceb9e50eee5eb5264522f77abee0c", - "dbce0fdefb86c4215e36a42a4d5b0fc62faf5b1d90cce47e83f48f6ecfb4616f", - "1aa1e6d5cf41d86f329cbf8c529cf83d62b687d50d60f17ed3ee11af932c0bff", - "1d939402809bb8bfd4c6dc89afbee59bf87a8e760fb0a8880f592b7c1979669f", - "6b7747d9aca5bfc27c372a09a455446d6f51029dcfcb1f7d43d192ea2f2654a1", - "a57752299a9644e4c315127564f3dbce0bc51ad04c9860f2ad2d6afb96da1436", - "ebc5b3e4581a1677489f654e0ce767355dd3edbd100f4cd9bff8598a96099213", - "b6c33e38586a29cb0af4ecc1e7fb92fe42149a5719fd85fb4eddd627c2766c6d", - "b5d2a3c9d1d049e992e2e4545c40aed1bf4fa716f0a189d64169f55d1f34810c", - "1f1314fc274cfc3b8fff05c82f0005c206e52b3a0ddbb6997a10c0358f43d0aa", - "4521f1c929849114005aa9af1676b606924e912cd9e96c2f96b1b7bee141e281", - "05aa731264a83f17e00691bfd37b1e17e1d3f2a9f5dc8bcf80a0d45eda7a0bd7", - "8e7ff432848920ca615d8aba5cd353e318cb4afbadf490cfaa116f2e3a94458b", - "71517ca59b85b971e4115be787e4e7e2198679c64e31cde3c6f16d5d6ffc3a39", - "ced99ce7ba10de51117a52303c11c3203220c69bcbd39b866ec3cdc2fe1e24d1", - "190c11c5bf9550bdf77e061c8db6246b315de6aca6ed973bb899577ef59607ad", - "ef748dc9f66afaefd82b7b2750ebb64175d2e7802fb15f7fa140feb2069c5302", - "b0a8c26e2ae0b60440166f902bf47d219486c923e3bb66278b21212a977f2057", - "1625eec5a0db3c35fa0a1114c4cd82661f76c594c0d0439d50d7396adec367ae", - "a095d58a681c8131f0827917becd635be59cc51eb2e4c412e4c143a791b03612", - "3814453ea8ff0446bef46fcfb3b1dd563cc5473a1338f80530232d03e82c51d1", - "caefc910949dc2766a0859151c6e3530c3471ba7c8406a64ed165cbfd4589153", - "fd9ebc7b08c25273be11caf547dda32f899a6f951f902e9bf89c389fc7ff0ee2", - "888a98fa4c5204c6a9d2d418326cc9c08d27fa7683105a1dac32e39117c6035c", - "3dc2868098273754a7ee65e67674afc79b672c7707fadabb0df58ec903fe4562", - "1a886ae3d3b51effe61c28f72803fdb0a48367381c0afcdd4b17c1dd2047d4e3", - "6730c9a33b6f854d26865af8f98d4fd27a4d6f1b244543eb40646c166b436ca0", - "e4c8af00d214873f0044b7f6d9468494b5faf13f1f1eae15feeac22531d045fe", - "81838e975a1e0ecdc690a7a1d7b3a172f05cb6b87920b0ee440db79f4e1a678a", - "37f26dd22dfa8cf0e866e88e2450a2b42ab7d8d6870257587366d9817b12cc82", - "0c1d12a2bc3a27f01947852c59cf9717ed1e83619f4f8ab3d76fb9f628c1fa7e", - "8f0df43aa6a8938feeb3e37f85a49fed02269d656aec227ecb5486e53484a8c8", - "5653a601c8122b7ebfa7df301fa3191aef6fd2523bd053abe376dfaf50927c87", - "009f163a3653e742352df992172380549325ffbdcc899c1d1c07d9a9e3aa4c24", - "01b8ad348b37d88e53067912e290cada3ab4687e80061603224bf232e3f612b9", - "d5bce721f43e9e5196c312f8317bc0467696ffa86be52e39a70e42ab5928ded3", - "bff1ea39d1cf32d93666e6a41c1f79d4d30872f2da821027f6656a86ce495a4c", - "b04676a9bd626c24dedda7eed1007f74e77d7c6749f097996671ff9b2e6107b3", - "99144b734599e94e0c38e839b76689a801d8d70a9c7df29c7dcc50565b758376", - "c228e267593e6969d079a326a1073f93d8f7554df7eb4d9d2b3874037ab939e9", - "3ab23578903cadba6fa99fe802652a1aba77845436f852c4a5389a756a1fd03d", - "3b07e187a6a8118d6b69dba1a8d3a63b2ac25740ec75350e2b13e391f194eff4", - "553f0096cfdb4cadf9691d07ba34192820c2588b64e93bb62509f108f02d6df9", - "b1575452d821296b15d2cc5d3e7e731e18bffa5cd51efb1206bc23998243f7f9", - "9f2f45b12e446d877c0196c95e622199a6bdcdd8943bffab4ff7546cfc64fcbf", - "47aea75c03ac98dc638f34d9d9aa2bd911257b37c106e96e79ccd37d4e6732e4", - "2c303162ff2a6aada9f6382d20cd4292fb7e8bd6235282123f8c9c71155439e8", - "8c48a1eac7a8a61bbecadc9bba454bf0c4895cf236df4810f8deb3d124194c0e", - "d4357766f271e0c68ef96d5991bb7d0cbd2d36a6856fb382e14f874fe8ca413e", - "0ff9a2946a5849af1a7e5a672ce15ea9647ceb8f41650a6365517c887a426bc5", - "c8f74f1b68cda31659224903fa963b22968fe8e75008695288a1635350ad7af7", - "d150d42643f4a5400b14ebb1c95d577ae2bb58684efa963897dba684e6004906", - "a23653642ab9522e2138d0cf3f2131873f55a0c31477b1ad8ca1a34a69bec660", - "85396ec4c869712bed2ed335657c12a6c5771ae279e313ccc829b2ee46dbd26b", - "7130f3e0ca3caaa6fa77c90a8de8cfcf87d041c0e3a062bd4bec7e6b6a4fb117", - "8db0330706e3818123b6adb65967fbc5d32a0812e3e80491af69249e99fdaa0a", - "986459bb387fdf0b9a91155caf871f026820a1901aa3f2de3441b9b26f34267b", - "55bb29e551dd097b1329835e1cbbf6cd5696d59e9699f6bb44d0cf42b0eb0dce", - "c0942976ff2da63dba93f94f2cb9cac41bf887872e2c34a962c4b45302b15762", - "b3951749788e9bfe0c8516e3c9c01a65cb86606884961c6c8c4f547e1093e8a2", - "aa9fc11fa2db90c721f8e957676a35e95223a72e229c350c69b36b18cec867c8", - "5c421194f41254f6011849867af3e6b8d9d329cf2a351d79775f98a8deda12cf", - "a80e85b364f5f3a0c888ca12df55bfd0a1197b7a3fea1499ff8a283605431b55", - "1377210db96d195d78bf0c8aa98a57adc28e7f5d6b315916b4c1b0f56f65641a", - "fb3492e6725bd8a4e802ae2ee49caa6d6ba1146eb1172414ba1c8cbd7454cb2c", - "2dc9722d5b08c4e9671edec9fa8c93d6325e95ef1fc589e0c9829b13b1c2131d", - "abe62cedf6432c63068c5dab1339bbdab3850f52ecb3cfc3d2a010841700baa4", - "48621d90f50744dbe8ffe316182e4e236b6c063ea540cb358ab26057407e4723", - "589068d80ce6e2717aca39c1d51ca95e78ff63d14cee65b59ea3249ae210ae81", - "80bc67029ca01769ea85f58a9a94b8a4b6491a66a2e89ab8317f37899c74ef50", - "773870bbceba7dd89d5ae0bc865e66a45ef8474d285d620c50a9164278c30b04", - "2cb10a185beda1ecf509d153787b4a085d141198f0cf66df5cc2f28a559bc189", - "d069a5695e774e13ff567976292ba95cb15e813d09b3c3a25f1304096209a114", - "40344c4a7001339fe21a107ec0e6ecf184b3ef55f00e2efe6a494ed443d9bc3e", - "6b5708fb2c4a76b75575af9289fb01b2288b36a34431fdab65d2a122f9497a64", - "3028fae7d1fad9233149364e7f4458d1d4eda664c4f1519450a79e39950596e9", - "26d39c7b988f321dfd4c91a51d4f0002cbce92bf6404a8329fd6db2daa9e4450", - "0304f963a6d18eb783e50a2424004d9b86016972c6122ff90885256898014903", - "6a8286d023bc55eef0295eddc5c4fd66fbc93ad203ee1b43a79471d2ebd44b44", - "70071ee319e20b509e548fad1cb7492ab16dfc8a6e77fa2489cb020ca9c599a4", - "9f885573f9ce8fee71d37c65feeb7da22aebe48745ab4aa78098ee7d60e73d5c", - "151659ac7cc48a599c82a89d19c753745280be67815dd2cab4b2fb421c5bebf0", - "b6764fa184375aacfb858202c287a526368f7e34e9b482eb7994bbf245e5ccef", - "01c3654fe4689d3bfc830aba931d5695f4ea2fc182c4e1930e581e3196f8b570", - "9ac40ff5d46ab3c25ec21831f196096d33ebe1352bef564fec816b3a1d3fc321", - "dc7ed3dffd58e73d5ba8c329f10d4161fee448355b8fc1e1f23b4169dc0e2799", - "3c0efbf5f38002f6c0cfb48f2806a6aec8b0bb65d839c8596a7477ed86a038e0", - "04fc6ac56cbf9fdafa77738186a26ef18a9fa854367470f0125b6147f58c4830", - "ec141032a502caadf8a20674d656068ce8dfa14f5f32070b5c7b8ff860cc4cfc", - "d660678fb9ccb7c5cbdaf4396d4052c2cd0bc515e265beb7bf7470185d3fb57e", - "9016adea909027c2e5fe8df680c28cdf64f3030ff23deb05e7acb980b7a3aaff", - "6b78b8a29f302a2473e15fbd51a2f4b211647597482ebc2dd0aa0cbb7c0207f2", - "5e200fc8c7558b0d67d953627d83893edb95c6afa6aaa837f07934a91669969a", - "5721b4c4df7e7f07be3d453d8003f008c39182d4ef5a296a2ee3fdb1ad176b14", - "d6e4cace0e049c992136274b050e7dc5bb695b69a83ef131c2b6c445493f7b49", - "03ed6b957b53c6170a7168187f2d5c0b94372f7cf1fa533738d5182a926d2a70", - "597700d0f5e5b54b8fd8fb929c009882a193db07b282d90b6c7d8c56a456f29c", - "b896ff2ebaaa6b37a4fa77b6e123e09db32b7e170851fea91e60af0cc664773b", - "6e4f654dd144c1fb0e0d9383109d2c2b24824329a1ce140919e91f153898a8b0", - "02c54bbd94dbb3d9c5d44529394527d5c9baefba5077076b87eaaed26c330d1f", - "6190e4e85368945cb2d5a9f6eb99e62e6cd61dea4b7cf4104505ebab40a87747", - "aab547cc63ed44ec31d89cebc47c873868ac5e7656487577d00556f1eb9a8d38", - "ad6bed6bf3c2c56127b73b910d6ad7fe8af6625ce465cae0cc6d8577cb0a0283", - "4dbfa823c05564f036adcaad0459727cd698d96534fa4ca28401a0ae37324187", - "1aef4e68e14cbee6f8bd80eeedb64450eca8059db576839dfdecc4184339af91", - "2b4d3705c2bc30ca86d303ea1c42f984c85c25e58cf6c8d71a82aa18ed0303a7", - "8672ace8222dbc36e26c0b79714de4ca53f6705e41dd6f73d872e8859841d432", - "33b659f2ea6974e38b19e9763d7e1186d25db8c7865f5d394c7bd80c1ca63cf2", - "a0a2f41b926f5340531e4ca2c994dc94718c3fb09fd806af68a10aac484558f6", - "87b81a3dc85ecd3b42cb15956ecae427bafbc4b85bde45f7ae369c9e9443e718", - "2e284974eeafa31917e3743ac27a876efad65f50edaff94535be869718c6167c", - "33f6042f8d4122ee16090ee21ed60adc3892b23133675f93d869db82c9f28c52", - "b71d0b8950c27af1927d02b866035d151ebc588a5d8b7789e4c04c87e98aba9f", - "1fea5e44ce8469218cba8364fae9c4f0d13d9ca0197962f6664302cf0f9f51ec", - "7027eb322af1db9bcf710b94931670a8a95fbf038cdf4ca6baef764e5f51d63f", - "8c7e2ab7f96cf5b7fdf0f2aa4b9631fb57427365341e6ff1435baf13e58691f9", - "24dbda62ba0d879d38573b44944419a22791d15c52ac057c2f237881803d99b5", - "b15f3786ea2686117a238245b9d4ab5e3f44049b3691f0317a1ee21257d550a4", - "5e142f151fb7d845fd16e379ed251fbd4225a37993af6831038e0f900f9134a6", - "4d9dda764aa713d089a8dda2fb540067e3cc241c5262c6bd43aaa9e789368b86", - "d1b4601c9ab3d7ba96ae185dab130a39c82430a5b80c49babbc062385edbcbb6", - "c159b6ab2f71c904f4b42bfb3c23e72ff55665731e4f0547ca0bd77c655bfd03", - "1900d282e9bf6c84493f386f05c8bbbdb9b49e1ae326b99755e659f9a7d1bc0b", - "3dcc501f00dbc6116a202c1110fecd7582ed171b78f0e85218847f6346785185", - "b01fd2ddfb4e727fb8ade4cb21be41f34dd113be30e83e1d143fcc0e6e3e48f1", - "a2f4855e078321ce1d113cbc7d6c5ef86f8c9ad9b85fff0a9f5b1b48315c7c35", - "b63412f1a7e6784bf9ea81c5225b5998f034926286e468b40cd6b7c2785c9fab", - "97d20979467c5841574d69c8b42985f9edcfaeb616bac4ea50e86fce62b75b03", - "5cf481ccf3ed2d021574ff9dc4b3833de80171e731cd85c3a902013682846141", - "193a69840ca170dbfa6644843cfc97e0f7dfc63e122d0e5a5f4ead17f1e90496", - "661a63b627401adf0e48ea2cb10b17f7ebb97add06e9b60736f72897505c2b47", - "2f5d5c491f10302f059b175a170746c14890f0fc6b21a6d2f00ac024b2178d96", - "d0fe2eb27d26fd14f5d8f79b39d9fe8453e69e4fe058be260fa36ddbbd759e44", - "d07de391bee678eee44ce3819c282b57909963d653ffa8f6dc0cdec068428e77", - "350e6c0a8b5f2247e2e7b7b496be9b17e0925098d5736038509c917c55ef78e7", - "376f2d01d4dd28bb939e5e345f9ddb19c6426aab05ee6f42cd2e6197db8b1002", - "84d80dada7934a89544c7d103e6a7720a16c026c68af93a448f16aea0b06a0a0", - "28f243130b2bb2718e95af2c0461726b364549b9a7628939766d8888e4d362f7", - "a3a49061e4126557058e750d3b9df21542ed4d74f39a6041af39d801d0f54b9b", - "97a479d06cb38b3566a00331080c726624f43bcc0133f8eddff391b156793619", - "4834f8599ab2d94905a089195b242c780d19d51aefdada9c3210871307a5a576", - "f7f5a5b02344d9ba62dd9fa3ab537ea25fce18457fb80221fc721bbbf2837a07", - "3efd7b1a26299a0fccdd97dcd991c3c9dce9df32db6b00662c4f9d7454b58fa7", - "2c46703dd0579d34f7832759c4c854d6a9668fe4476f039edac3edf7b8529c91", - "2dfa436b289fd74130fb669dcd5ce48073c3b44bcde80830ba121db0f6a26d8a", - "88814d2b3bfb33dfcca0a225307a39656260a70e7ee916802952a82fb21aec1d", - "698ddb530a85222e8aac79ad363c1b25ea03a7191f9cab7a82cf23607057b025", - "cafa57be80eea92e16939bc9ebd5a0a6639f7ecf780b962ad5b748b3f96590df", - "e9bb229155972f7f4cd66878b1e4d0c2276d5fce0a853f27975562c10163fe7d", - "93fc2a917b869820bcd9f2f4088e9ffa4ad5409fcc73eac15b434347b3f217db", - "ea88c85e3baa732b1604a8c1170099787d2c7e4f35551a8636f9b1beceeb8731", - "258004a29747690dd55db5b9f009b3c23efd37d044b879e2615548fc94792bd8", - "e0a30f741afe96d4551ce2a2b55511b815ef6fc70191f7e6de2fa3f9f3609194", - "ed7f8f394beb0a79ba2837d07b9b3aab3f74a3c45f33f41f3ecf8f9eb18323bc", - "839de1edc348f0757d66e399d686b96a810911805414c077d4c0812ec29d019c", - "4d0f6a8272b19111ed00b50993bb298da28b122ce0d323161cbe4eb680d72023", - "77376f57adb92066a482c6d13a292c106011949e07e6b017d43a2ee70abc3551", - "8ecd48a0a228eec5e88ff650f5e66e23b90a3829195dc6d42aae7653fafed2b9", - "dcbb813bdf1dfa3c4d806f7aee8c6287f9a5a0ad0484a7e470ff582e00b5a3d4", - "d6b7fb9de8f0d4c06a4f0d4f5f3355826714a6e582a7536973c7bffa52a5d6f3", - "a54412013e9dc681e84d8cee80bab1bec866b824536292db1f1cad962e3692d9", - "1a065cd18ae9aea65e43749b31f1b70634478243763c1fc43f7b87e573d3f818", - "68d0c5d16cbc891e81ef7fe8ca2cfb2613c4344fe33155d0f7cc19f34aa52e68", - "8e548e84eb7ad08eb5072d73af69edfe2c0365ed5b4b79f1738d92102ff25b85", - "f88a1a0ca999055cabc3c89384bb4355c5f158300eb230ba4fd9abf242dfe75f", - "045ee4ffda6c5d1c37c271301c3d3a7c6d9c7971a32b9f50b5dc500e21b5d799", - "d32a88a2adb5831bc8c860fb62e59e67147eddc556a4816f9ed9d9323571a949", - "d748968920fd295223a9d5c17d6e38c62053f7b06e2abf6ae9a6d30f70eb28ad", - "47f2a8aa6e387f6c4125304fd38ce3f54d161f9cd30512a65588f850fce0cc6d", - "c306fe135cbba238aeb64ce21e3269bda193f5dc4618f372e7ef6dcaf0b774a3", - "965b2690db982a3229e632e4e56f19aecbff28b8e573c1a80e374deb78ddfa76", - "7779bfca2b73faf79efde2fdbb64cff6dd007de80b26a1e97a34e85115fd19ce", - "793bb9b306bf690b047a7d6b27ac66e7ca09c1e743d8fab05c71e6887bebff4a", - "a0a10be867b88a3f7e5df13e7f0c2c912d7050e9894e33f4d08396ba0ecb2ad8", - "6ab1058d7e90eb9372af99dc923cbf1329088f66f5e34f719f8c0306bfbbb96e", - "a86ed5beaf724f4d8315cafa20ca868c717fb721af6e997eb1ee4809ba6a2d54", - "b3a51d57b052e9170578b29694076835d64fe601a2a6204101af7647b3f47f52", - "84772eb591b3d01c11e81d387a50d7cdd84619a9cdc6c482fa084d9eddc70d1f", - "571d4f2f4a041fd4921f8dae48a26057b70c5f1703d2569ae2b3979a6207e980", - "36b911c873f18cbe0fc8fdb8f0b260449bd595e0eac4c018619a30261d7ee9ba", - "bafe1b93746a1271d6c4f55e2409ec36fb316a99bd5f3481169f3c51b470424b", - "ae34a66cacb4750c6c2fac18f9a687d64d9351068814da8249bbb5eb0cf1105b", - "a5cb4d5e1ccac6020b34f2837132e123af3b505679ff12be0a3454c8c5078a9b", - "b8d66ed2b57cbfda506fdd8c3703cd9874a2b415a62d44f8be3c9eeb19f47ac9", - "8069382a4f9cebd5cdbf912cf07480e4bc84bcc52fb80e217d283f22a4b8fedb", - "ab159558fe2d678d64814c096a5e2b8060776db97ed7e0c6bf3b2b07f726d34f", - "2bd7996aa853b21025b8195edc220d5bc3f45dbb153712fe5f3a192c8cbf7b7d", - "c29af83f50aecaf455284595af4cd8a167efb097c703d9705c77ca768bbe2eab", - "1452a62b5851b61b8ddff8484cbd31b7826100de7c2978d232a9bee0f209f50c", - "75d735914ec8d46b02a7ea841c46b15ec805e8ff047168c533b9be81be42f800", - "cc74f8dc934d7c2a57d42a82e7addaaf54ba0aa789acd4bf641274be2b34a2cd", - "a5550e55e571950a9feb1c02fa3936e7ec941aa0c0adcd39e2ea21b9cf58c790", - "d2e8c0bc18d861d05461b79df13bcf38db61f5a7fa8324edfd38315f14dc4c4f", - "15ce21da436579860c4c4f9500116d6da58af42633de3c468a9af06990416784", - "59a2ca408fcaf752d73c9818de9353684ea86e4b192b77447e27ac2886ab2c6d", - "d85f62c712c0d15923bf3b2f0389abdc478278d14c34563aeda053256ad8a52a", - "2f534d32801369c69b970f1825d950f3f2c4aeb5984c57456ca19a51a0cdb920", - "0538402d545d9e74ac0edacf68db72b7a89776d058e889dd3d7071a0403ec4d5", - "30ec773bbf9377b745353e9304654b8a4ef4b63d41a64b40cf37ed2db74331a7", - "48c676dc78af739f2c39d5aecabea3c966baa996552cdf0bb76863e21c3af9bf", - "50bbf126b2c09992682e0b2aeb6dfd20589891f8e0af5c1cda498943a409f8ed", - "78c3fdcf19a2680b595913b68099c081740c3c724b5aa5a5b378af45a5881804", - "9f2facd44a6b971429656fa783148b0dead72449b2bf716806bcad13d33649dd", - "a8996df6e87578d23d076ef33614fa0cd24aa45cacc3c09d51075d6e42108040", - "86f4053cf1ccd2f205d37e19a1bf36b467ccbe114393262329b0fe2c000fc5d5", - "3aab48cb04ffe53511bdf99f5f1bb118c08a86587e7a9b7e5506b11d14c876f8", - "1b0b66c221201bf400799ea1e55ae213e8d9d0c4c3eef49df56c9aa4d5e31657", - "4139511809d86611919a55430ae3d2f87b3bad26b664bc32a7a037b12351e6bf", - "d7394ec0c8cdbd3f93c55677158b78787e19975513dd743002de152e2495fc78", - "415dd0f9ddc85b38cf5f155764f03a5c3e60176db7fa60214f96ca1d02369439", - "97491ccf5eb521dc55400a7a45930816bef7daa7581f9f0ba36db94323643810", - "31267569aa4c8ac257eeda07085a9300b76b592b99928b3767df8207b22a54fa", - "06f0b8e1ac598c95737736893cca6dccd5fba311f0c292a143128b3e6aee919d", - "13cd8173149815e29661ade7776002f8afefdc11a12b9368cba395e49edca730", - "a6fad011f79a6da3ce6d785fdcf0ac9c73ccfa3ecc72e50575b4ff360a33647c", - "aead14274961b28dcf7a4fe7512465864b7023974c74a6010376695d7662c298", - "a214aef21eedeea7559b9cc956d939bf7638eec4e41ae15bb19b52164929f683", - "c56be3126a599a56e230ce8d68137ffdf9507ef80a7a9bd658e49ecb6f253b1e", - "cd44cd3d33526d15807067a4bc20a73f995d2e7ff5a4d1d2faf85a09685cc80c", - "d89bea424d41de7533fcce7372fdfd9168dcdfb60a19bb650b87a0fa005067f6", - "b3d93b76a793be3e830ffed8aeba026915ca822e14378ff9070988a20d034cd9", - "d1578a2d36ffacaedab667ccfe96f4dc6a11ccf299b68e9fb9caadced2aefd66", - "20bd12ecfac8041a8ef08471d7fd410e05b14ee80ff4b5df54838ddd8736cc2b", - "e2102a87334b15030d80cbfa6e54f15bb19f533a14e8515b21e8b5713c41ca54", - "bd1dad3c79973e08d021ff574f8d83c8ee4500e093e34691222a40f4bc3b0b15", - "b8b0c3178fac44b7408cb6bdb628f04804a55ed42d6849721510678a69a22b02", - "bb6e221cb4405c2eba0f405721a8792739ed006d2e6e606805f073fca0124f08", - "d16ffaa063b159ea5bb118014d953fd4adaaa59989e064773ad984c00041e966", - "b5de3f07219862c12be81e334a1caebdc8cb12830268a0a2f8536d1817a7b29c", - "757a738362d1e9ffb29bb756213c617b1bfb5002f8c2d5e42a47cc9b878a7fd0", - "ecf144fe3b962547bdf4b5e3598a26b903730a882095846708bf64a2ad342b51", - "f0f99a9f1b6e274958954b24d798b00e7f046cc07e8fab97cb2c060a372db552", - "a7ea24e7cfc6de6b34f07c1ba8fa6212d90bd933af94b050267040388f2a5779", - "b4a4aebd56ac71498239dd48dd8322fb1f07c9ed684693689654eff3e74f599a", - "da4598a3e6c4c3cb56a0d6d6055b901a5344fdd214d89ee20f9a1d9b5e6aec20", - "44f8dcb6f8ce382fc9564086ce799c8682045eab765b59bb87e6d43beb15496a", - "11d11c745ca919f0135cdb7eee57df99fd66705516fb05244aafd2ba5d4add66", - "ece8e2236b262843d212c6e8e2861c6881a09901a1d5794ebaba8ccb1f2d4ddf", - "9335250cb7acfb440d88b2dd1954775c0cb14160340ade62918697c651c412d9", - "97a7f5728d499b4b6b204838e09fd5a29abae76a6e5e16c3d4d3b1c9f06621db", - "7600c095836a1e3dd8b08cc650a0ee9da0e0de510f40e46eda13eb68411b1178", - "a01ec381456eae860592d4b1e7b478832bbb3641fb1163235b29eab082d58364", - "51f00dbc0c7208a3c0146a25d2b4eeeb4c3070731847a8e8bde8485a3239b643", - "3aea24771c31a8ed63c4d807a2f8e8dcac653895b05f36ab5af3b785bcefa5fc", - "1e3448247d0359ca045f1be632523d8d73e08bfd688f45f94c1323cabf1154b7", - "24ae8b7a7f229a91f9a9e30989f555071cf7e8e35fad0eca4c862abb551e2f44", - "223f9cbd9d0372cba48f1017b52fa65b8dc79354083b20dcc508c5aa6b0e2842", - "3529fac313a6c1796c0b230c33e80ab2aa12f3579d6ea26c717fbf6e60de90b2", - "a74d10d0ea626e770825459e28596b84c489331dc42648078297414972104555", - "6ef09ac1036acc06864760d1b7d7abde94b70425b426c0300253dfca21939308", - "93a9f3b4ca9c51bbcc9a6726979145b74ed4e85edf6c1b236490239e324f3c66", - "19a143fb17f293627ef6610d5e4644edbc2a5895657e68b9e56326044ac888e2", - "b760a84f14d4d09d70407fabcc67ed45831538a9f5fdd5b545763fa0d0943f8e", - "98fc83b3ea57628ff9323ca9727eac212b7e67f86aa45144ff6270b966961e62", - "13fb6ac930ac75d880d44b887ae43b6d2a4522a34cbcb505d3d6008c49d713ba", - "2c9a2f40d0cf28f129b286edd1d9f3028184fbe972a684bb801ee791a6a25955", - "79772f03d5e42cc103930d986bd52b7d02b0acc9663d88ede3a3feba251ef0fb", - "f8218ef01c6ab2eb309776a190d267dff1f4e84d8eb20656848bbc52262836c1", - "4778891e9d185e6f69ff348293a1098a9f8518a09c14b47f7a2d1cdb1dafa58f", - "b95d1d6e2ef223c1398f4286f82e743c729bc271d338f6ee39f82f4afdc18426", - "9fe1bf681b98e817f95af5e9376f25bdd31b50c94fb3d791fa64ca74ad205cf6", - "4adb5a5a0896bc770e9c3723de68455ca4923f853905056e581f780b32721d71", - "76d4106f583e31352c1efcf3e5cbbe5bb57ed4a2a079e281dd031a9763dec540", - "7b86e8bd118350cb9f15cd0a902c5fe2076cfd25ff56823a88c00deadd6a4d22", - "61a3b793933d54730c0992b12479b62cde6725dad17d7a6312bc8f0fb2014366", - "71b3a236b769b9f6ffc3c974a41b62aca700624935566f91fa4f0f55ea0e01b1", - "edd6ed85ef2d53d80e99b151e223ae8f263be81a8730ab4cb3e1138671e938e7", - "34b5a0d86b1c6c518f886a4472ddd9bbbf51d8716b0ef8d687145da279acb8b3", - "07e6b459858604a011addfb9fab95b43442e52e9e9fee582eb99df27b087662f", - "cc7a94830d17e4d8dfec47e7a976df38ac9642f9bd7cc23b1e8f510bb4a09e68", - "34f2a60a37827f3efe422c4152807894a1d79797220088a6f0f4a397be5b06b1", - "4108c02c93c1644dc7deb5174e7cbddb51fc95a14a7b940d232812014704938d", - "6a9104e31b89b1f9aa753cafc90c803c5cbd8ab73990a7469155d77db0881c02", - "57ed14f03866c94b1b7d01c9d040ec2e1fa33264d53480190f667eacc3c5e650", - "6673f82b8f522a92e3756d2f73fee81d3e969c3c97cecd47327c844eca14adc1", - "62a719fbc6bb5c1a58509951a1270a4b56e76f8018a00684a96aa91ac86734e0", - "6fc750ddf156f6b3ad64ebe9a70da8128577f472b8069588d3105a11d1e93544", - "4bdbcafd12fa100651b11bf27bacd885c65a2fa5808cc9c2dc04a05da07fe557", - "a66d1301da295eb45203c2c0ba1c056fac1d9d424b2a1e70798e10a6f0f11151", - "f3cdee72dc7cb644f2feb63045135c5caffc6c14174d472102f2f2a4a3016fae", - "43aa32bc18fbe029f611518dfeb19293ce85f89e87594ae3ee65b1dd8489c1a2", - "1e348715e0bd18b05de28f849afa6e17a28415d4de429217ec89b08511fd986b", - "1357e3c3465353b37162e4cb5b2f4e009c48a0b739cb4084d1b7aa2620ef1413", - "70a2408a8d03a760793b2859536568bbf52fafec7d3ec03305d944cb150d26d6", - "1634e84e633bacfae0d949d43037f65f4fa4ed60137be75cf91b184f63b997d5", - "1cfb0f4d95ab799aa25ca64c81e0b159de333fffca3a52566bc45d68cd3c4ae3", - "83c109867aaabd5c69878b7bbe318807ec9d2e7832f2c6fa70ede64113922362", - "9e6fbc6af785e9ca8b4ee5ab8af29ead10d7d4af0d5845fc92c38106580ce3fb", - "3acaead402b2f7819ee489ea6263fed1a5d6b3fb796e3e9385c845f8c3041c50", - "672cfa8d995445330f23f4b07fdaba9955843f175483b514e404e06576c08216", - "c21cc72823c2ea1315d149f060df7f101db3af48eb04c729cff8bc7af377bd15", - "c9b029a801d81bc7f8398d1f2a38cffde3f352702f38e75f8b6060f0703ac1df", - "a77595a7c6723254514fcdfe95c55b39bcb944bbcbd988c56802de4804a61715", - "c25a61478478bf31bbc22841c195910cdc9f35098e44143119aa834e5c2f0ac9", - "2c3d0dfbbcba67b59d0e5d02c951cc7789773eb781b5d507c4ff5273bde88d9c", - "fb3423b8823a206357386836d682e2eb716e217349dd1111400321405e769e16", - "cd18a290e105fc36d19aad7905e3b0524dcb89b06f9efa87d2366044e9d828c9", - "0541ca21a80dba2e07ecb45ab0eb211dd96eb291ced805fc32d1c68184f9dd29", - "a6cbca6c362c145e7f369f5fcb0084a92f8437bb9813a0a57077e8254b90d01a", - "cfb2db61ae8256df015812356db5420520c6da571a85dce37b5f91f9816001e2", - "a6e18edb830d216a9cc0cc09d62653ae22ead06729b08623ed0efdf8b83980d2", - "b5694511cca13c99fa9f1340a000e58bb122e944b4536b0100972a63848caef5", - "e113aa3734a94be6b5b4269dd2163692a18a02b1e8fd1d0208502cbe303524cc", - "c4dd591b4326c81649d7454fc3e8e094e6be83d375f7a9dfd7af8c2a795e641f", - "ce7a6a30fc4bc809c3cd65042961741ea2e39b2023adba79884b12669ce0e40a", - "e0f94dde8eb955badee280bdd9fcba6b03ecd617d896fe5c8ca5ec52a27ddf46", - "41b59876ffc2e6922ae554e88a0107860755100d31fd7969f6ed3e85414d32f5", - "721b554ef6a16994a7f6b3d0f884ec1be0490f3e2cc6ef6a7cf98b4bf8eada71", - "d99fbe2f5b26a84262f68aefa28ac42ca5dfc2fad3de16c0c0014e04d05307d2", - "e89f05314098e7e0a3c590fc696fd3b389d1979979c1a5e0d6993f83891af5d7", - "bf0b83092be5341e331c3219ef3b3c5442a8f4fd5cdfd2d9057d53d91e2a9b97", - "07fc85d62e5123d53e6e0d1d0e0ca0c615af760bc99ebe2b7a44d9210323c332", - "25f652c5c8923bf292e34ba1ed644546a43dd4a91f906e5da47f18e57771b2ce", - "1f42b4a1be86c9d1d6f4da921fde8d1f4ca4ceda4b97ce9e35db494d1f40133a", - "c4c595f47137e8a873d605daa17f2bc5ec4336a8c34901858178e929ce228f51", - "8f8f0f2bdefacf8510d089ebb46f818837cbfced7025c1185e1040faf56789b7", - "7e493108c6522f6ff0cd3e5fb1111c9e201930f851cbf078eb0579ce3829e82d", - "4b5766e1e8089d5f6c29fb08988f8084e08f9117384748837c930556968cf645", - "d7d50ef44350cfb7f8da88d949fb29e6b07139c785aee617c9ce507c2976f124", - "cca545d42c849a9255a6462c8cf414c31ab64c88f9d45ba2fb08bb3a5dda0ee2", - "6e6944653abd791add25a8df6fc5eda0215ee0df7eac6a0cb394ff7a56c4bfe0", - "10e613121abd41467a2aa105723b2142923943bf64494670843e1eb1ea49b105", - "585e04e359af220a376396129f515bc269d1ff5e4906f11393aa4a54dc5db847", - "903763bea9b49dbea20ea154f4e7a1adb9be42d4ac67b96236597e31739731cd", - "5ffaa1582efe83d48815ec7b74401268c60b002f2375a27ab4016929d14c6773", - "7022ccc762a41035aaeb9f576ffce79edd21806c2abe45e1ca980dd816ea03eb", - "022727b8a9ac0dbc14209060754b94b474dc1cde83695b6048d7bce4acf4152a", - "90f15728dd3c72d2c2a74e7a7e53aec833450fb1b59d62930e7086699bbbcab8", - "237a102554dd8e545c8047a57703ae8b4f0b0453d2f98decdf5c4f3435b03740", - "0af5e79f42bc0230c626e9886759a80a4b279894f78a00624fe2e39b7af8189b", - "7eee946feead43f5ef8e9bf01d2cd8dffe808503d6fbf021164e9de224e5d17b", - "2a02093e1a878cddde875a80ad1a5466f331b865aa3a61c83c81b0b0f3d2979c", - "7d00bbd13da9f5c2cef0440d8e98f9c572c29695dd697547b80c9d7b4d113963", - "3d066c0e666f190b49e176b1f78d4aba93d440622c4ff3610f25304f4557d964", - "8627f4901ad28d86bee624cbf77f95617906639e49a8de91014d9e1fd1dc7b19", - "e1ce30e2a5804a4f597f239819eac4e4fa8f446bcc733a81a53b25023efe2c9e", - "f04d2a3b8270d4bb8a293c99ff2d024c971c77817f347018c71e1bb1dfc62460", - "041a19c9382bc406022797c92ee720d5d8343fb69ef75a83d7e5d9275c27b0f6", - "76ae8a42beda99243e89c2ea5cbf6631556b92d3826d1cda1ce6d11fa4869ed8", - "bb56a9832a3cdc7d04721ddb6a7e83d950c7eb4063ca55444e8827030dc809d3", - "9820d864d8bb610070b8ac309aefb217fec6d23504638f6918dd1d447ea2aac3", - "1b31a880fc52f96c169873c81d2444705cf41ffc7e634a379590a4e4368cf510", - "9b27ff9c72b20d1022c98895eda42170df411b22b9352b5b3d29ebdea89e407c", - "47c68729605e3739c08089c0e101a618e614bb8a0e8aa58758e8a2647f134cfa", - "720e95478dc29646ae054fb59bfe4043fa2ffc5f33180b3fd0f8494297fc1150", - "9af5fe453622270547c267c58f16bc6b420acc6adefdbf0dd8a007287672c780", - "2a677082ccd5885a7371cd57e063c9712f7689874d4c238d85ccea9110e6d079", - "44026a979d059c88b27ac8b6e5f84a181b0a1bf9975aba39d5035fa215f20d6e", - "79f6aa2c88dd376534418897f15f96850331a8259e1927c9381329a993c1dc97", - "a4b6eae7319d09c9f5039bbb9b634b64bea86bf9a695e0594ffa7de1bbf54d16", - "4d798249b8b820803b3031cbf455d43a08db163ff70420cc0be42e6a96274b7a", - "a82edc320e6062fbd8f754ea8034d95eca406518409c099940260955d9054e25", - "77eec4214e2a9cd1ce72bdca48d2ad787f9b2615480ccf2ae7ed4b02fa892935", - "5afff337830d12c2440a7aa92181c3c1da764fde251d9c357ef97b22d3d7425e", - "a7f288917363d85dd67608fd84169cc58a9fd12dd10851cfac12519c10e25fc6", - "29ffb66bbcbac7d65bae7e4f66e28a3f8a0e6a5567201556404627f0f0976df5", - "ab92491d6181228a37add69f235ca1e8c5831a011e087df24beabd8621294946", - "aa719d99e5d48e140c316a757fee4ecc071171ea45a4577bd3f02904e81f01b4", - "d07305b8e990e630a2670af87396e2cf411aa5286c8d0728b9489c436332360c", - "e3c5216cdd9776f0186098c1c77ba612c22c8f853f3dd109f1ab222372abb757", - "1d2893b353ae9c9b2859b758ce213b297a548e02997d7a5284a5cd9a457ea00e", - "9be723663e0753e73fbf325939b62c84de5ce220deb184125a54638d9a2c56f0", - "e704559baabe9461e15ba345686ec843cacf64a9527eb43c09337f8eecef5ebc", - "3666887b13eab0c8ca3e43e8c90bdf2801f23888d14dd40891309abfdee9293b", - "b0dcf5010ad20b06be1646222fdf2a7a0b38b0e2d2cb3b774c56698c86cff048", - "c13259f4c744765746de1c1420b03871b5d878222c1a50a9a3abda08b54aac68", - "c10ec3b803e73ac32b4ea0f69e5f5b0bcda070c38b1425e271b5f7c4da4768f2", - "0fca872f2da7e4c0d03bb0549e82ffa7518484805d139f16ee116cae42e74261", - "805d82c090658fb284bd038f198e6f34ed8f6dc20a72d2a9068966c955f04f30", - "1ab58db148b9efd5437f1a204c6557cbe234ad9504142ae03d438dd0fc626a66", - "a9a756358011ef14b785a8df77fc39d1ca40c3c1f128bb86fe2947d157b0de99", - "697fada4c92c29ca82640cad598960a570a2b1ee390df42a99929c19a6e3f632", - "6f2f8bef8d1cf8cdb714ba99e89c7287f64e90e781dcba6f9b1f6c779f0603a7", - "991ed3827674d18634a2d48d1c49396619b879dd975f70a8cb852ec2ce13ed23", - "6a1eea311a27ddb2e756677a3a28f06c2afbcfcd7e0dd43f6da13ef18256d96d", - "9d46e61624c47f285a726fb75c13f5d037511151fe0cf18f6cd68bab7b771346", - "4526ee7e71f6154bc6e7fa9b74510ed9a3e5da57c2959f00be8772568f357583", - "43d203709d6f643d12fbbf413ddbc99152edd02c7fc13301a73c30a0acc4f83a", - "245cbaf165e241e806a09119ac5d8680df457e7e80278711bfc0ceef8eb3df59", - "04dfc56a9cded36db4bbe1773070a524202c32159d210455811c4060ebe9f8ee", - "7ce1587ef31ecbed8546d476f86c11cc639fdd3a49a65b1e934d8301cd6c39a0", - "5fdf783dcf217142a2d105d383350f7e7e7da73a01fdd653ac7fe63a0a70bf56", - "803d5e4a5eedd133b64a67da0d494124fe6e24b83b8ecdb036acaf0068cb853e", - "6e329ab69d75e55e9a089f96c4be38b0f7d7ac8a90d435475becf2b86ea2a823", - "4d7df888141adbe2965fddd32599fe87c48d07751e78e8b0bb2625c58faf7c8f", - "357bd872c698cbe19982fb9df302d21ffbadced5b3133b94a16e51848c85a742", - "f20dbd389d72fb70d2ad353b131a4f7904bbbe4ebcfbf7bda8bfbaf0bea4be76", - "48385a954e6fb35140ec11121916b99a89c719dde4743e8917a3a6b147cbcd78", - "6cb3086a7a2791f8d14c46e6985162a24f563cc1471017ea4648f918dc2ba94c", - "841a8e0d4866d3a5dce4c851bf11ed5bbd9a61f4ddd1c91c5323c88b2f84bcb6", - "f055586eb62b6493ddcf25ada6ae04222de2b0a84aaa4d2cde6305a1200a41d9", - "fe95f9e7e4e8671aac21a52d3b7834693b03d2a2a03d3e79f3b6f5fca19c0d6b", - "f783f68929163154030713726b8b3da05ee8f5af66684afbd2d0d75e4efcde31", - "705869012f393a7b27fd8493ed1037c9db55d6ef5a2b1c11797989ea4e8d5f40", - "36e3597d720c4458dbfc38f8e5e9b74f96c45e3f776be47260377492c1c36b2a", - "a0b4ea9f114f1d1d11fad0d7d29c97ae41d4c00b04486b983c5cf11054298ec0", - "18ead551c71ee54f431391dc503c7ed468b5c7ef128c2f96c2910daa3e70aa4c", - "52d72b755298144de8e64fb707ed23e32ab69f0e7f0a41e051c7bd4e997dd9c9", - "6f26b8a3b4c716549d6d7006c0c78626ddc14130cd33045bcb471f094d8f16b0", - "6d03e7d3a0cfe270a9a694862ba1786c88c0216a47f1f5240b080d76e26bf200", - "f9207304a2f9b9d8487702be2f7e5cfceebd329c70aa949ebba0bcd41dc462d2", - "5d11b6ff1b6a1a029d2b089924b136d95d938ec70ddb7b56f30e82525d05e46b", - "1c844712406c511629592b07a47d03a84697a7500c649828b7ad1dd2d0cdbb89", - "a05c983dcd9cc9ed2c995a87216c01b1292626d70f6baefb72b3326ed0cea8c0", - "584fdf3b83786e4b9ff8df78a2228b4bc89ec3e4f8e4a1ecccb98cd6ddee37ff", - "40dc30d485af4533ba55544dc842367796d748f4419d63dbef10f5edf9e2638a", - "3d7ab90ab875910e530ed258e58d35aba0f287508707ece4da7ce03f094cc31c", - "ba590141dd2231f65ae4c207528cd2f8816b95b149f62584e2e7fa97811d41b3", - "e5f4b9eda09d8e45cb3ac8eb126dad45b6f6f135367daddf4866bb8f453c82e3", - "b65391826ae432695af064116a8a842b3d5d078b721e7be1cc4d5d371e60490e", - "12b48ef2d04068521b2a3629904a765e6c40bb8a2223379bd3d5508e8879ce04", - "15235739c191d79d97de8ee0aa01434663f0a8447b79e1883d009a191cd9e496", - "5a7ff2b180ee94a2b3c729ccd3cbfe5ef3a567ef347ef6c611d8f9940e222ffc", - "0bcf4c6c189e09f789f9f21cdbe3d477f2d8a91780c5217012a6ac40950901f3", - "22f02ec0d88c4a676fd370787d9806bc5c74efe5dbb55e024b0fca5c07a1c61d", - "3c01e3e94c2a69abd95ba4d7de6594d60407c4ad23726c0691883af49c9c4ea7", - "bab5471daaa5fc84e4195efe000d90f153611759d12066f3d3bf86619996644c", - "91e48db1105d5b0744a57f504456c891825aa738e1fa4f2f42b22c00ff821d7d", - "4a16e0bc5759bd3b64ddddfc958103b44664e3680f98bb2e67ba179d9bdf416d", - "4c285e2f41ff56a151659c4d3bcc8ad4d72f6635a25b59a482590b81006b56e0", - "f4d411b2be6a99b68f01bd8725f5c23c8268b876b401a0b55e6f7fadcccd172c", - "e955f709082d38cb63a66090647f50e311dfac5815a9867a1cdcd865175c8718", - "500d3f543eeaf5875b4848325b1f9b7901621fb955007c683c38e5fcf5372546", - "d6ec8017719c9df886c2ca9a0e33b2f3812d993612d2e0bfc9b0c10a81eefd67", - "305d7c384f06d9e36172bd1fc68d1e34fed1ec1e8906342cdf50ade686392220", - "6b838a85911f7210c3517618252d489eb64b32643300dd9e9045e7da98c67a62", - "ea83437d15f118e8daa19cdddb0f6493c6118f7c7fd1eb5508571a1d1211bd20", - "79c49c9aa0f7bcb3b8ab6a4134c4b154a5f6aaea4f100a3540d7fd77514fce01", - "7e42f2100acac38fb5a2913dc33dcd9dfd37c460ec2b2638b57b6d0346e5912f", - "4d69af23153649b4e83659eb4e9ecc0850fc70d97f6bda55157e204eadc04c17", - "910700bccbd0723985ed9b92d593b008486dded9211f4866ca300e21466f6bd3", - "b6a326b5d45d4da74cb44fae9327e77be7b7da6005d442ea9e041d283a912bdd", - "9039950c628e96d2368ada15d9263a6795e07c3e2bbe47a1a9d15c601251d478", - "1c2c40a0c094be25526c45885b34d822ddf4c78a27d832719d1413dc436d1cb3", - "e7690eb58e0dd1b9cb09842edda08152824b7459b277bc82e0d2d21463e78795", - "b1c9d992579403b047583dc26b1f0be311c2d393870d380315b23ce4a8f8ad53", - "1cbc65328ccfe299d1cb209c4c6507b7532f51ca767654e605e5f2ae137bce2e", - "b6e7aafc1550801e7cdbf13d83fd422c3306db6aded9509d8a29b5ba3bd21c45", - "653aab516c6930b93170191e6d5ab7ba4257a9370be1c5ec54c767c02ed9f090", - "ddcc4d2726e84496c96a8398061c46258d2b84b39c0bd705401349db5cc6e0b0", - "7fd135182e306a025f4cf216bd7d0bac4768695bac72fd1b5bcbbb5f5b6fcd53", - "c6f0ff8da0f0a1202d112b69887512c2d0d0d00f34ab266145e959a07d833aa3", - "68fe606ad9c3c2e35c965edfb30639a63115bc283a1be8f29aa09e9d5667c7a6", - "e7246fa54bbb526909c8b073e562aaf79b133a79b62ebd757c47c384cdb68608", - "b6d7832b34812d31f7f31a4c09b295de4424c5e3a62a1cc81b116b5532ed3136", - "d2a791440f283a6211e760ab9f09cf332804cedea6a31a6e374879ca6ea3a2aa", - "21eaaea6928637a444664c724806ad397f79ac67ba5ddedbbec771e4184285be", - "3fe77ff4bd61a42edfcc6b5696e1678e5f51c9752e65c21338f08f8cb9ef7750", - "db8f255fc25d7d884df3285ffd838cafaa6e8b07b02d9940b49280377c275f9b", - "23297a6442e6bae7a22f5793634714c49f835d2119382ddc73c9c95a811bcf93", - "49f22dc84b61aba366da1b202c23c4c6d1dd8376d695797af2f7e8d1d2829c1c", - "62af0fbc8287bcf159620b7244d6d28c97443ce6f42335cc3efb3bcfd5dbf4f1", - "89aa712ee2c31e2b6765abead68e1ad25085269275182eec908769ad1ae1d6b9", - "9969e5970c16662f147d22b1104d59520c613c21295e40e5e7d9c01eda2aa210", - "4447551059611f4f58b9f0a52595665d9ea88a1de3c995e3683e94c403d80e5a", - "4271fb8ba9d50ba47c9388f26da2a42091cc05765e4e5781dd406c0018f8fac9", - "98343b470adb886f54ed590ed181ecd3c6aa2128779b738c77312372dfc276f5", - "65b216047e1407931f198c1f00e2f9ea3dcc3cf774a92e361a080e943fd20dfe", - "58b6b26c7cc29d631a56dd16642ef131e9f071a14dfcad2f59ddd1084f58f410", - "6d3d48c864b7fda30f7896c38452a7bd148febed541c53edb1d56996c0643b09", - "ef24a7e7471dd85d17e6b460e4b2dbfe7c48814932e21421174c6f6028cbb4ce", - "ec6f9448612783e75027c49fc171b379542144cab5f20dabe2feae03715839f5", - "594a5ab20d055c16e07f03222c1eedfb4f53b99d82d0d5b079633108dd1d892e", - "932ac159f7932033be38857be9d20e56de1f2e801520e2fcb9654a7843280776", - "b3f28cea199a1aca1872fcc4a7880af784c723cbc6bc375703f1486d5531a247", - "cff7baf0cd289001fdb6b8329c9d76423ebf5509c2711f15ae273a1b9c8bdd40", - "87973b337b50d1c18de94af0c88e54322dd1c4883f2c942067560e234ad860f4", - "7e5afb192a6b922354924958d65ef782a3dec5b7f84d473b65b7bc64e6a14845", - "eec5ff222b92ca1e846172e79e32ac779f43b36d8fc7bd13623f0710617c06d4", - "ff084088a0b4323a3ba321f44a663bb6e2893de399ac759901618501a24f4b26", - "c088317bb6c3c49a6628c23cfa4e3788839c15682283e49bb222862d55a86fae", - "4bc89f57734784e46c612301fa43ca1001252ed071b74fb3fbe18bb2f13ff661", - "2eae7a7334fdf9dcc2294556c526db37f570228e98ec18f97417c220a4b61967", - "026a1ecae91549a1a4b973253548f266a099881f1d91f034a3a8f2ffaf8d6a2f", - "d26ced339dd068e6814bc1f4ce065a5021c8c801ec0ebef7437827dc50ea5a10", - "d132b986ae6fafaed76a1ee99c76d844d8bae16517c77639714d80e766ac0f3e", - "c3a91c2d928713055601cc1a98eba308cc3a3f73cf069b3c84c273bcfe4d6da0", - "9c6807cf670c869a7c69c550307726d4b92ec6400a6207c0ce859d22cef21978", - "221555bd4a5072c0fdc2a4cc2cbed61dd352c48bf5476252263f3b4b8ecee28e", - "452876253e51b99ff020309bbae1c22d549794856ff6afefe4c00b2d4bb149f4", - "ed7bd468946f16d0ac716ca0e5d6905e6dedfd2bcc403e66f45e8c2d9aa4a0b3", - "00afd10ce5cb3179e9ae261f4e533ed76f8a5da9ca6f75fd8b2df712e5d491fe", - "1f3f887e8d3d5806ad0ac489a0215f07ef7bab739e228d5719490a58ab49e63c", - "67df9f0da0775b3252dc7241e8f7bd43ce20a8929d83e4083c64cd0f1aad3d5a", - "7e56e863f0185b509c8c73e8c007011c703c577d58de27d453885a125454f909", - "3184a1a986122306b8bc0ae83a00e2ac1bffaeb8597f1a6f4131a692cf7ef6bd", - "57294ffd38f4a82c00dee2645975493f6021e2cbb6d7fad4af7129421b070341", - "cbfe6a0cea049be2f310ff3ad149b351d47fd59ede5c95da86b12845139bf314", - "47156fede6319a30315107b30d11ae841e0866ce7e2c6cfd3f78162493ab663e", - "b722c6e9c8b1e8ca0f675bc56cb8a0917fea5b1331254c1ecd52134cb45f3dc6", - "9116d0e11a1dab2dae8589cb87db516f0edfce140bb144aeba9a48b3e9fada63", - "d63cf15cff6e15d7c200b05ee8499b6646a2be69007ff436bde75133f6ee2154", - "f5649ed6b6ef466969241f129cbfd67fe0291e6fbd866e4223f3b3d03fde6bba", - "876e1bf939ac8b07b236793a5cf98a9f1efc09fa7519cc2e2e008f0c69dba148", - "7671605ac7d2ece965d546f461b06650d887de8be113ecb7a6210a715dc80db0", - "989f4110c13dedb50f6172889b94f6cc36b0c484b7624538252a0c6d1fd50760", - "80d8117e3ee23065cd48b7f8fbb9daa67f66ada25737c403acca41fcdf3ec003", - "b40bc90ecd7f3308addf9aab8558165de224de0c375d8de68a36022503b8d4ca", - "29c6d09f0c36f8f3a9c8af5fc26599db0b2c0bacc4961e07b7d7e28c197246ed", - "7ed992e9702b00ce01ff34c1e4ce682fff27f24382c044aac86b367012fce2a0", - "079750529c5af45d086736fc891aabce87b6eb8f7ee5c9e4d29757de4fefde8e", - "3a9b64e8607381167ba07304b22488d10399061eb872eb536bdbca7460696d63", - "c47d54b29a899938cc9598a6d71b091f3ee2c20f2515ecb01f716336aa25bd9c", - "43868991d6bfe84fe249451ec3c52d2443c3b8eb8dbf0a7d2650ae30950a4d8c", - "b6d72c9f22f823926e0645e58fe20297c3f8cc034fb2768bd182ba10870e35e1", - "09275c8f1c0368d01d43c25bb9e5c65fc468376a13602f2eeb00428d2882b928", - "79386f2f2a3bd0e663bf929d871dba6c1e62d983c88d60dbe4414527fc1e7075", - "6f4353f04b0df5360adef238634522fd3e002b5a9774056d73bcd074b536ba03", - "dd66fde3ab5d6ea5123f26bac3a67fd98aa23c236cc2bef097f82106cad93d73", - "e19946b17a7f3ef0f89d54a69582f18b78b6628c8340605703d43b28e2f7bf32", - "176143974af9d2828bb3c3535cc967340a44642a855be5cc87821335768ad611", - "9d5184f3f9adb1448922ed085360d898d568f7e76d94abe90c7ecebd8d9ca45d", - "201369c4d5a9ada67760715ebe13573f5979417fc51568f0cd7512c0855ee370", - "f45de19ef6aeb87956d49de36c65fa09d639bb02a2e24ea394560316b78671b4", - "b639dd218069fe3a828145056dadceec60b0291f43300d2d730e64599c78f5c2", - "b347111abe144d210b9bfdb1eb2271cae1503c9aec91ed59ec25c1d04205df35", - "3e0ea9f6e499d5f4e97c01a6490f98987b56a9f2278ed18fa4c54fe0bd960687", - "3f98cefcd1410ec1f8eb9497b394f67727a0819fb0b39084e76ba1dd5286a044", - "ba5bd362ebf8bed087cdfd8cd9398210eaf40ceb7622b6fe810d41cf769261a1", - "b81f726f1acc15ece420386ba92f577e725c3c57c4f3f5ec2aad7340f7aa0c03", - "e49c933ba227d273444c90ce18d189dc4710c348806be56afb3ed8df02381f81", - "a6cba8776e5ef13e5eae9314cad66f5cfe3fb97f2be6ecaa4401ac89b62b3a21", - "cac4aedc74232457d04b02a780b0b636d1cc6206f1a02d3d94334a58620f79e0", - "a4c03043a0cf6b73d961b442c050c5f2f40c9a0be53c72a16d195505074f7451", - "528f005c89d66b7cb639a35d7ba0700689d404f32d47336bf14a2b9f6e88cedf", - "09b387c5072a1fd1aa627f620ee1943b1541ce12f8825c004e953a68cac251e2", - "327f4b2ab53d293ff55817e3a2ea4f81572cb9c0df9b2e691fb8d707ef56ce61", - "3c556bf0601941d5bcd8da2f90e7bf7468337eb96f66a272d2d9cd9a1fceadea", - "d641df5d5ddeb15a8e78fb4aa75c554559c79121d62f06842e441474203330ed", - "f03104d7c3a1dc0fbeaec2dd2ea0085a20312d9c4eca415e6e39f9ade3d3c3e9", - "2898fc7abc49a9e9400686b8e5c98b4541063f949c5630f432aebab5538c3922", - "2d451c5dd650af286f1466d7661224519bcf9c4b90b5317f7c6c9d9f772d9471", - "1b3875bfc3142a741e22f4e836c7688875d5b2727fccd82af98193920f72c724", - "10df316d4a46eba70961a6411787f271f6311f144f156d72419d96b08a7a53af", - "d6b173751f774bae1a7c2580a5711841456be244596771c5acde0441c4bab23d", - "a91671803c9bf835b7e518b0b6af75aeb8ba3a39d5edee7b79efca8b01ae475e", - "ecdc8d08a7f10fc43a9ddee347f7817802b7d50411f83febbb59a75983cdf261", - "0aa7c26e8a60265fa5d899e883c8aa76644c189c682c6df10ab430506874e07c", - "997e3388b73a99bb022e9a41c7b3a0379e1e9b4ad0d12e7b553d2bd2d6aa10fb", - "cd83478ccb5c779e6eecbca0d5858f1d409ef32172371f20a3d92c875426b16d", - "c3bd8f6df5591196882d4ef5f0f7b4e42d5f26eb39434a966d2fa12954e0929b", - "edd91a304f9c8ac564cad77b4a6e9fb7254d9cf71981b6c9100e21d3221a4327", - "71b82b73eb40565db11f81c1ff5a1be4dc9500be66440b1bb3e9de3532624d25", - "0829429debabaf06565efdf01d08ea98a1ab7af3cbcc87d35bc274f110f262a9", - "0cf8f6ae8f3a1c4269cc1401446cc302b206ad14ac4e148e383bd114c175f587", - "cf6aa306e498dfcc5a579ff604ce7ce6dc61adfb9a9a5c1fd97ee349999dad86", - "695e0d786abf2cfba99af39fc50522ed43dd2492c8333d7844cabc05b39ceb7c", - "280472ddb7caeac3c84c5657919b82aeb1ae98b518cbc27b75dbb20b4e253b32", - "475ad694c55fc2a524a7478a116a08b3bace9be0441832257fa8ec5fd60c0928", - "adc2c1ee46bf682773bbf289c3ccb9429698a4ef80cc0610ed4cdd6698ae2c6f", - "bfae35152b4c41581911f978ec19a866ced4460e065327a4e05fd5b1790cda13", - "40bcb179a3c55400a5c638333c4a56a8fdb09e59bf724a0fbfcdb7acbbcb4e19", - "9fe2efb2334761824ef109505d9eb276850b5e0f77b0acfc063ecdb41ba4dddc", - "780a508e7877404db26464bf7655525d3b89662f139dbeef1f6664f17f8c8ec6", - "dafafa67c2c76c726c8a4ba3a7c8aeb2832220515d848927f005c1090d9fc373", - "aa71fcac1c0599477da7da62bff07d382f262d2c47156bf00cc76fa71fe188c3", - "ddadc72c1c162ae5c2989d9381b46d6d3aaa4a4ed8f7c1c8ec3b83310700ff42", - "f784ceae83e3362533ff709f0fec60cabc583ffa2e7b2701e89603961f85c298", - "a04412c27e3896e42972190fe96647bb993d3d0b5cd039422a5f22b592c4dc3d", - "d79ac97b03ceccf537df555e33365a4fa40732147f7d7927b7478515af04b927", - "7b45b918d36735bb9b8e65c849287b99dd5ed2966ee4a32c59e339151928d970", - "0fc6a423df3297039a73118dda29a76282eedb2cb4b6999d7334659685f9601b", - "9589a93d19aaa3af7abf688ef67a95bb6559d028a5bd12cb3e61951be38dba14", - "6300cf22de6cb9b48908cadc15ec9fada0605eaa753e790746394690cb5a3a0c", - "b42e081f4af6d980eb1b71522c1f742bdabcac5c644cf20d8ada76ae7da63ce3", - "c4358936bbc5a4fd6c894bcd198bf20f8826ff2f0084cb0c0e0d85c1c75aaeeb", - "4d4668baa0c4713fdfc99a507a2fd3696ebcf5a67a93c9c06d24e507cd258c2b", - "70ce02eaec7af7b3abb50327b8209bda747ac5fb9b94415d9a04e37b6b7e1568", - "6ffa0b4a146012178daf29f908fe8712262069c9ebd946ef548017cce08c838f", - "a590cabdbafd9515ef0456a96a5025995442c669e7d5da64abfee62370227ef5", - "d239b55be238427e74d363ed0ce4387cd6182116c9edbcbbc9f992ded6962aa2", - "9f19e38c29ac5192d509d9cbccbc611f7a6d3c0b8fef6ad5ac551305a12fbb20", - "83a9e0aab2bce24e855173725e1ca16287b3c960de32ad07357235ca26cba108", - "060a2cda7e5434d3b2fc16a1c81864df979139c6d852184d3b66f3530e089d89", - "8799d2e6a6c368d09967db2096bfd6bc948965f3f0f545f2a285730bc981059f", - "a214ecf5ac9ac5732a4de90ec53aed25e0005c8f108f1bcac87c832854be662e", - "82ed97588721784a22e34a92891d0e904e9842daf24634bc088e184e86fde0e6", - "bf2a88c5fa6cf68f6dff09c4ab0b6f3959fb0179f3d0d9237251b128c3d0a02e", - "125e2f16fc0d0fde333450ab0dfb56bf46f32ef53e5d968e439b753fe20edaee", - "cea977849b95bfa489ad86e4616ad11319d61df6c9fe60e03c5328b390d0a74b", - "8afc9a1816bfa0761850deb30c29b214549e2a8be480cdc226048ffdb59dc23e", - "f2b49f3e60025ae2c46a82f57ff1f2c7e63a47174564239547028cd66f045ac2", - "de018361fe3170e2010c2d3e7668ebf63b59b466cfee824ac8c76df802a4f5ad", - "a0b66da0e4997e0ba93d01643e3db3055425a31389c3eb6a2adfcdece8ae0103", - "b89a9858730ae2f53b5982758446c14de332de95f247e32b7af9f83886986f6a", - "43b54c1384c013334b0a6d2ee5071fbcd513ece23d0065d7ee244b2fddeb7029", - "805086404fd6086c9e9dabe17272e0c7c798d92dcd5c052f9b28c5b69d0b675a", - "1342eab64633523b97933a21ced0fedd86a79719d91fa271c1125d746b1e24eb", - "7b12a3fe268e4dcc44d1324eaa80a2fba7a32247dae4f5729350d3e06fef0bbe", - "63fae686cc24eba374a0c499195a1cbeb627bef01e8065158ea99f02a279b08e", - "d6d177104dec6c036f8e7b8c9fe785dccd8dae19d049bbf1d30f9810235c02c6", - "2a6336661f8d60fbd974def8c60d47e8808e9992a652fd522f90b6c85638a5f4", - "94df0dbe4fcee61954c538ea8ee2b0d8dcb5740153e2cf716acaea122f626207", - "a7b990d772f785c093d49149ad2c247fb3b7e8f2e4950c5e8cb9581ea67ac74a", - "93692fcb6c732b5db191fa6cbc61c810dccddd23f4a5fada68005895b9e55cf2", - "91f30ea2ae913ffef63f9b6e1d19f582f6533b85b2b887a624c43b845e9d5cd4", - "839d41dc56bc4e30b6f08dae9d0f297ac6ca35c8dcde1d5715ad755b23623775", - "8fe11eac3ce5a834032a724a67ba08b738248dd1b677b5b87943829c8a045684", - "ae3d244d95595a6ea371627569f5329706607ce710a10e4fb2cf00f2ede4d414", - "0601557fca6aa2643478fd1b21443b5c4267dfcb7623d17f4e5f3fe0a2a13233", - "1188dd134014adb2a195e6a874690ddc1ac2985f289e176bdc045cea86a869e9", - "f516ad7fdbe35c2d3b368613bcbeebbae1fea9fba5782c04deacdd841b0e9486", - "947ee1f7b0efd8e5ec4a22c32d1639f3233375238c4f802ea3b4c060e20f346c", - "feea26c0f9358362f508076b9a263693a994e46019540c72c70157ebb05e7416", - "de57da2a46c62256d7c2290a7e3581c476e3fc011b500f216d9de2a7af3bba0b", - "f056a952bb6bb02c24e412bc893c9f52aadcdd27c39c70c7fdb1792e92be1e3a", - "0d3fffd233c800ac73875f233aa60f2ea4c17e17505297d3ac6d59d24253d59f", - "fd8f38c72da2cf844ee126eb6f3aa118d59f67a9c6e8776afa116522145aea09", - "6497afedf4c13b332022120a2d31d0c9159102354639d668776883a918d79877", - "ac70ae7a708a243f49deeebe33771f5a3d8f5e9f406fa40120a935f01e4ad0e2", - "6fea5a6d4585bca6d3081125d5bc24fc499cd45e114f4a37b2ef042ad5ba1a25", - "1a1d55a95ccbd6a5881d64455fac3845cf9aa836a6fd0f3fa0b1a700cc7f61ce", - "a4260a8c2fda4b8638f6fff79e90fa503138bdace4722fc9ead1e3ccab62f105", - "566233d17278c3ae50f7e1b3a34e2cf607a82c96ec58b2e31a3e0bddeedfe451", - "5407ff6aa748e6283f9001607af1fcbafca64199bf66c510ce60a16af43ea764", - "df931e04723c336c8beeae9584cde9e73a74f6eca48c505ca8f0b74af5f58406", - "0b7797915f05675780094970b393ad1c93adb2182fcd80010c5006cd0057962c", - "49c2503dda382b9086c62944a85790c02fdcf838c47268124d7770305ee2d412", - "3ace0502b343d7075b2c09be9fc5f6fed134e57791edbe915adaa26c9183827b", - "f2185367cf93e01111532860006672e5c76229d7fb7107eb29c4e25a9e9e8cbe", - "bd160d4a69b33020d29a4cff0b9eb4821ab406eae22af36f1361a93cb3c6784f", - "0da8fc209bd60c332d9f4c4885a9d7cc1676b1cea449fa1e7eb0edfae26d4594", - "76e47aa7567b6a4ec11ab3a7281704b3c3d19d3ae80e12d157bb89882ff8f2ca", - "d9fddf81cedfa472383a63841686091cafd313830e41c2425fb4c2dfb68c521a", - "a6b8d20ec291c42854f4ad158ec2541d6d495da6d856bec34a9aacbd97f77a8c", - "05e6250221f6b198ff2cd9bb938cc14bce03f4037173ec564cc7212ea8416ffa", - "6e686b432f1bc359f69880199da5373d8334f48eefa4c4f63c2677332c08f926", - "ecad6ebdff33c903beb482d4dad7feb40206b9c4a8c8936b61a3087fa54234c8", - "4e4a8042a2dc16c72380ca4fc2e30848124ae0737f98f772965815699493e20d", - "0825a0ac4e67e13afa1ed39dc14a41c5022418ad0e2ce239ec70390fc0a1ebd1", - "3b408a49dcf16bd00820ef7a282b872eb9851f023ed726087b0320b3c4d9ab7d", - "f711eb2fc60210ab5f76f925a59e2271028b3b6af592ab762c66c1deecfb3fee", - "9937d8149fc8f224d05be12b2b741f2a7ef4c2c2e561b14e00e6677534210a34", - "06e745fb63f9ee9e7de16b05eda5a98ceb1567cbbdbba851e8dade3eb7e07a04", - "b3c1430431b64bd71758a5ba8260ab1033e02fc5b5b4b774bc4410454d1c86b3", - "6feda9203f4d0291a9c21194a925a122974f9fee639253eacfcbb2e3383d5e7f", - "e68f56b2b7f6b02c3434b4316c3a8a4cc4ba0d314875ef8c78e403fa2955eff8", - "c0ba36a8fec601627a95f37e6ada3a707e87e13c0c4208dddb86ec7882b71044", - "e8a2dc54f8129f098337d317a6ceada13929f2bcb2f8e3e67cd34476faba2ce9", - "f882f60565d30b445ef769e63e1e68857923820cff861a70a044cec8e9f13cca", - "1e116fa776af22c5903ab2ba6461f56eb5dc14d92e6a43fd777d02ca43afdbf4", - "3576e94a9d9e14a3162e49be2700cb0120f6da861385872211a24939927e9c27", - "24ed64bef5a8b1867470ff11f0695dffcbbae5126afc7f0f72256f5f63df71d5", - "26c58f3691ac3027042d767fd21b3343dd6e7e068ee08d30f607df20cd21e65b", - "60b439fd32f1f9fb244cc98053c6aba2ee3891a6e72bf20867802a060f008b45", - "b8d45d6f0ba2a514d4aaa906f10db74401349e3bf4a79f44d6bde465f4264175", - "bc85470d4778048638e9cb54d32051dcda34ee1130df4c380aee3914597797bb", - "5b5ec0314983cce0514f56de4c16c434be1735709ec928a32aaee5969dbda9a2", - "bfe593f9c299875e0f147bddab4e7db9311e8b3d24330e798448b79b834015b2", - "962aa675e30c8c4ebbfc47dc12854cc17fdd2485c142c769d8e086d858952238", - "78636611c6a8575f35dd21d36e996bddf2f7e7a93cf59ac32c64ba10de21b2a2", - "d4d82b4f0a895360e893489a35f2970bbf2c90befe141d7926921b8862f5ac22", - "0e51630396d2fa0b8d50a9501198f986b8d847ac8322344934aafaeb28e63153", - "50de6e5e01b95bbffc70853cc5b0b428389857870b8589bb45debd0f7222c151", - "cc851938e59bb1cd92a6f4c87a7e7c2f73dd6438c8801169a11f9dc5e90bb538", - "7b3af68c8767421ce9631b4c8e810207f79dbe94f9a42a2cc62a7eccf67ee3e1", - "56f8135c8fbcbbf0e257c9d150396a60d4fe535e2af49aaee974d0ad60d1acab", - "7c080ea97bbb3d6a2f385f0a4d5b2e889deec2deac5f6ae0fcf3d4dc4dad9b4a", - "c8a778dc3484db0fd83b5c7578bc53ef1518bb84983906f050e5b8ec74fd8b96", - "47561e698e39ac1dee7a42b23e4e78a882f4c1feecc14d4d24ba145e0df42949", - "a2dd284c7ac4ef564cd3b15ca07c991e4257ead276aa993fd6193db6e9b68db8", - "e848aae344be88c49c304d333b10a6b3dd84e6505ce4223e618e999f1774dc85", - "cd9041ecf2bb313af60784e91b44f933d73915165d97878cd36130fe628b5bb0", - "8965f32ca76714112f40b909cb5807d04ff799695184de796b4de323820753ab", - "d4a7f4b6b14eca3700bb09affad037b6f79a20bc05aa402a76445b2dd4311ce8", - "8784e70d116fe732a9ee3d54583633d8c84a59bef500f1cb77f44a4987bc9a16", - "d663da51122747fe24b9e64d53d77632514a8b4813fd686d99336ae20e671d6c", - "4f508d3cedf2e29255d59b2165d21503815bfcb3e497a5c1b55eb5edd90559d2", - "ee586fc8f522d17b56d42e1766e27326f05d32052fbdaa0db8173daa08deb54e", - "bac4338f9de5f48ba525de1443e6e88a440e77c15ee56817d6d7b9ffc7dab17f", - "005348bf5a86ed1ef817b7fd0f0d13a6631a7f4c9a9242b8a47b708183ce3eeb", - "37e5fa679c58a2a9480f6573a8061196c09a6ca28d49cde8a79354f5c95e8fea", - "c7930a5d494176e53b202efbf1a120cba1747addacd937fb5790ae16766c52ee", - "7aaa8f136dd8d49ff48539e8c07fdb0e93cf71ae15ebb65369e6e030c4eca9af", - "f23548f551e682235cf43f9877ed955edfd495cbe58671d76bb16f8ce9adea55", - "6511003cd63ac91c922065f625a1525e458614d26ccc23c0a1639b066a2ffffa", - "854d3f5272e5d5a7c0650b7513ee337e98277d27cc17eda0baadf3c42fcc20f5", - "935b4bba088eda1e07285b8b20834111a9fb15ad9be096fb16803d23cb8d5028", - "d8e932b5ec06a71dfaf0fb17181e0598c80fd563a5602915e7c659db88213c21", - "f7783fe8653c986520e52136cc9f2c3251419e26e46864b935f10993a996f9c4", - "c466430dc31bb0fa5b21333ebabe86b68ed1ebe45387a699b7074c7cad3d5d01", - "7d0b9c731ba4df0ece5d3a712695e2dd42ad1fa95ac07267dfbedfac56df690b", - "f721761a3e2dcf69e7c8f41a71577f45e52b27c0b9af845a15650ba1fef96e7f", - "eefb6dc4884ed982ad12b3539dc91813c6eadeca48e5c3318cb7e557ded2e388", - "d380d67bbcac96520bf2130c316fdbfa797db0cb713a4f7b44433b2c7e667ef3", - "25b5fa5677b863c773d094d21fb6db2808e13364251b0d427b713f2547c659f5", - "a44a49a14d408caf53ca47e0ccc8154dc0492a69849458dcb6d11b7f456c0873", - "3f811d22f0184a1fbe9cfa2ee1c7d8212edc403f39737e054cd9455af41b999f", - "6d56055a4351487a16f4d201e39c0a810f21ac22bb2a1ac980ac8573541eee3a", - "368f8dda8b922ada16cf3811a619ef0f16b5d76072910bcb18750f3d845b773e", - "838c22fc3a8a9efdb9dcac56c899b0a1e9312e4322a7ff7393530851267ed18c", - "d5d851429d82b9006fbd845b19185397ae4b2cc3171aa911397ba071472df767", - "b5bdf458b0a7ccc5a69b6ece1e416bf237d0294f8e22a905a1b6fa4ac71d3d40", - "ea408fd91d7fc5c4c92a340611acad7578889b78fb7efe22518af4eef065aed8", - "572d9fa579105db00ee8729e52a4258b84f8ad60b0f2673bc5eb19b1affe6ac3", - "ece4692bacffaf0cd08ec38ea2047a640efa1abf6817d1f1945139f98b22a5fd", - "fb6f3bd8590ea06803256174e56df263bf07cdd1409589e5e0d0774465c77a8a", - "fe89b52b589bd410005ddf0daeeb9102bd7e397c2d16070991bf0db21f0024d0", - "4ed525e80e8912dbd59f9003cd04ecbfbc90f2a1a92e40c1e7269200d72954eb", - "dcbd2eeb01c359086b85fa06fb073fe19b39e63dec1e77d8dfe1835d96bce75f", - "4b89c948cd43bfe5499a81e8d439293529ccc0e78c74d90047f845341ccf9b9b", - "7754635b5db218586592925378729315d400772328790edc1943910fb6f2ab3f", - "315d56f7ef63805b18c3ba48e8a56dfb0c5f576ff6aa8ccb9232c39e5d16348b", - "019ce7f570d5b8e8b5c386d5348c2600241e68dc72ab03411137b528f2a8e7e2", - "571250fb95586d67445c3328a2f8bae986f8a6c82c9f554e48b415c1b719f871", - "b5ecde129c556d9bfa0c8c62520c60c3040207fd8efad701a7c8101044262ab6", - "bd77b0504b9cf3e94afd204e82659a0cb1f56e3ec67b90d9b1ea7910a141f3ef", - "4c46d9028e782aa5ddd5908de760f6379aaa27ca0367cc73d7fb55d0cc642fb6", - "42183e6bd8e06b95e5295287ecd397a98d74e8cfcda5ef69d23e7953cd8b143f", - "e3c40d74b4dc17029d3c4211f0fcc4d7302da15634382fc01694e4245fd81dc2", - "842cbb43ef0ec57eae76445fad0ebdff09a84b55662cc059361417fc9e2867e1", - "1adf91e4b5a10ef430a8f3ccb4200bc9680f78ec0fd4a94736a027ba5759577e", - "de802524526a91cc377d57bf679af4577479996119b92db4d8f18a7c079e0b16", - "f6ede5c7f1d48b9b4e66a41c08f309af8cbf50fe0a2d1b40a93b7f48a7496922", - "0b0ffc414b4ab99cf195c8d446dd3939b1037e3e86e2411c3e1e7008dd473f42", - "30110f5a512a6314acc9efc2c401094bcc32e8492869a1917050b5f1624f5dc7", - "6502c7965c785716ddebbca09fae300fcdc1e001e60e2ed65f5dae250b82e300", - "7c032be65734f0861e8a6ab3fda5c0512bcf04e7e9b44d78f87340ed75d31d3f", - "d3397a0dd365e76fb29e544d557eca250ee04ee84e4d3dc4d5f573d14c54f172", - "270ca52eac997c729ba36dc11732b682708a76e2759eb92746b2f0a8ec73e10e", - "8baeeda6779606368c5ec090b9d79a38b608354f1dbef73d4be88967cb974b86", - "feb5efe418f8f3ff59eace6265267ae662f7ba58ac07fb260559a07ec3a7e417", - "7af2653bfcaac75ffdad4f5d6d1df3ffd3b9065815777c8aa047388df38c1556", - "4a68412acd5385b7706d1c31723edad517d4469356083b171b7cf240dbd2b7ec", - "2b6489166c2bf1cdc34c35b20076a3b471b3c868be1f67218339ecf94f12d509", - "d4a7047d888450f898b5a422817d7899a614fcf6617a59f8f80be0fbfd0dda24", - "482e29686efaf5821094f930d2ecd6be45abe52efdffd116462f6a051f755bfc", - "88bd51f129fc93646f1c7bb96879d866b64b0ac72dee1df55223b0bc67f79af6", - "78d400884c6ba1de4268cf34510043c013085225f81334bacb6e5f7dc401604d", - "737bb4da901c50a13752e70a19db57c89f0d3ae4e100961684dfa006734c433f", - "6edb5593f8d4d3e811dd38b30d1fb290f41667da8f5158d3a30f498ddeec7a62", - "ebd644edca15ca9138f11ce4e85e630852a2257607319e55d8012da2331da567", - "80945bd38515dc2b0d9a0d0b81deea342287c3c70aff68594ca0f95774ac0c7a", - "3345affc19c41b2005b6a2a4194c736312bd97f6c3e1b6f451eb5e88e91df4d4", - "14c59121332f0e5d6d3a05abd7fcabc57387108bb4fac44ec567eb812c481cb8", - "804a05c9c03415bc8e293d42be4c5c82ef39dafddd38f52b29153b155da7bf3a", - "f7976771a0fedeef35d5e4b97deb2c2dafad410deef68658869fe05016caacf7", - "2ad422aa9c1a41c1232e6b2c836f52fe37b26a37ff97bb4f9bfd87b9f7806a8b", - "631987102c2746b14352d7aa3d39b2d8dbdff9cd752af703c26ed71e7c2a07af", - "2cab0bf1704b638564cb4dc7b671bfca3d2eaafd6616f6b503a42f692fd1bb40", - "d4115d4c332f0bccc12f0484825219918b295b8a7478dc7c40d09adfc307050b", - "3aee0c0bdee0491b30ded31187d5be70917d85c039f8b63314b3a11a0d419bd5", - "d226ce3151e26892759cfce6216ed3d59447d2131deb22daca0a7d7e8f065889", - "f6607e8c4eda2d20efcfe7ca304c1fab25f4ebc412a177bbfb0ee49fb3d5be80", - "363d96ce6e837d6e0ea7b192bff6a3dc4ba9c2de5bd6453fca75b7da96b15ea6", - "9c8623f8a02ebce9c0254c5d208ccdb0abcf8748767ecfc8b58e16d6d643417e", - "d07efff34824cd274b9fb9254412cfedd375bbb9d4e9ed01e6d8037c80b8def9", - "a3f75688beaace8bde3931f09fa7fcca5e5b0152cdf2b80d99952e924d18cc9a", - "5af438f66228e2945f996d1b06637debb4e82596f91191fbac415c9fee95d53d", - "d2fafcfa5c749afc6c1a669f11a1d7060e7cba3537dbfa7730e3c668046ea8be", - "65174ce3a1bdf6a6d747da844110bc80ed5683deb857e4d82229f5f82efd9e09", - "b8dee764e8fe562654b533a0d99fd6a4bdab3f7722e94ded01efe766584e20f3", - "b7927c79b967f910534a80fa581dc0249cd759732e645f09bbdd0dc8242a0d4c", - "bbcfbce44164805fd9178d862ab1558e99ca7a8add8d92a0c7fe1541be5f5173", - "eeebacc3e2f6bc1fe5f30f34d0e4360ee5ac22162861d95645e225c732dc4bfc", - "b1221c24b70d99e3e8deb8dcdad71204b579310610aaf6034d6b2e143d1193a2", - "5755dfd259fafc5f2acdeb807a94cac976f63a1def253e6855c84f158dd372a9", - "273ec90f08a2887d0806fa3dfb1982b6106ff6cbf95597ac79a60834577f56b8", - "c98d5bf9267ba76282fae89be2de7fba6ac45e0b82de61f713a7cbd48b9f79a3", - "81fe261575e499402e657f1b630e6ab44c39e8df2b7e573127ad9602fe86aaf5", - "6502db7a345ae1a2e5029329448fa387eb466289ac853cecaed9d1beb0db754d", - "48d2f57264fc99f172e941cf84f3fd665405e8a04d64a388c5ee7d95f9ba2505", - "4a9f7be8d6f4a179af4b1ef9c7393930bace75a7b95f410be0cec1191f59ec90", - "b58a16a3cd677eecfc99fcc6afd6831c0b64cb4e3f31b9717cb8912d7173ab30", - "4ccd04365fc3b0c1fcbffa615b9abd101a3e348ef03fe5d83fb9a2cce8f84e86", - "d96347f063658c88193714428c14d4e4b049595f8309c5f7bb5771195e37f3bb", - "57b1578387417d8d803152747897909b09fb97f2abd02d1b79b6e5567c1bf795", - "8a29c4a8a7ef0d280654cd9f744ad8177d2378ce7f31665ee3d91cbdc61e221b", - "f89cef2b59fa656cb75f097209cc30f14afe7c2187f2bb45bf59a615513b9706", - "7be6f362a4d68e99872d4b450a12281cf87b2550c0eaac423118f30588ff325f", - "9ef5a94c1649e66c496f404f996ac9a8998894c5d004a2eb536d5085d71d7d8d", - "d7d1b74cb8968c9e7764e14387acec1b99079808ee3cfa17e4cebaa9263f5592", - "11b496d06d8b1e1ea981c1e69bd9dcbcb55c2faf2e861a679a61500afd02abf4", - "9ca883661f76605de88d0b3088a846763d082b9bc0f59d083ae668c1994cd830", - "2bb6cc952c31b41675f610435d0187be5279b835af459771eb7a8a187052212c", - "843378d80dc2504badb90e089e36923f73c9e832c38858acb7444a2fbe935abe", - "61ee6443b19b32c6ffad7eddb49407f7f6327280af1b13a69584203e1371b8ee", - "2cdaa4048c9d406cc665ccab6677965038b408b7e2b6108262c623ee93179163", - "d50da5f2732899c71546e895bce07faa1ee1dc26de71a44c860f57b316b34d43", - "bd785d2ff05e4b7cd8d9c3f0e153035624f4a6e13e8df8c898d1d132499d0130", - "efa91050a47e841921378dd7025a15e0f47dfe03c17fb0e26ceff2c2304d3174", - "82698c081e19a6d9445993df91bb711f020a2b426093fd26782c740d19229caf", - "442564cde189a7c50d008c51e45e26d83a5922b2d9c0ff5a36c8787960bbe147", - "6bb8a33ee9a7dd8de44ee53580986b7b217110b91e5df436d9e5bb21a69f9f3c", - "ad7e06610bc4a5f75f54281cdbc2e92e1db1cfa7ccb4583bd984915860588476", - "cc4b3a97e53b62079beda9e1579af055a9fa918f771ba5379c967e3b08147c16", - "69397fa1d8e1f952f67b843497f53cee18e530be858142ec9be4113bcaa70ef2", - "f0dc49ce35d7293e6c46d3cd6074db3a21300393043bc0f5b85749e435b81823", - "55fac19437f955582eaed789c89ee099fb38304cd0517636bfcb6a59ea4345fd", - "0ccc216a0d7bdfcc3b5e2f2120f9ad8ee45f0661919a5a39e8210c5e6a4933f5", - "ae9aa000e2ae07539192a8f94b9e0a69f75d88310dfce9dc214a7afab9cc36d6", - "f55137c9c19d0dc71b1f995c4584a022a2114698ec0139e355c33dbe9f729e5b", - "f8911d74f5903c2364af5b7171bdbca1ab4253e04bb67f1d76b5d6f6d6e5fd6e", - "fff66b7b8aeb30138fa75787808b184c192181efede23a497bee4a20286e1f41", - "39352b9ddfdb53e4c422386fb35671b6e7580bed142762d4ebb8420e242ec0e0", - "7edc4a9fc253b676d7af3a0aa6953e73f532a5d9a726616ad6480c50aab1294d", - "9b5831da3e3282119174cf0d3112be6cc10dcd4b4b79452bd3a18ad0baf8bfaf", - "d6e50aa370434c3712b2a6968b1bba381e10df39dcdbcc286ed3aeae88481ab4", - "8a3b8d43cc0955009ec22ba09fc139c842ca76544cd6ef18fbc872f772974079", - "4842e484a47ae8615370c7dfdc81a47bf9c98cfefe6ca47ccdc12f59970f0575", - "fe7d6c6f413cdbf54d9a26947c991a4efb010f70dad10e300247393260e63014", - "82aab1f50cf75064406e939970028525048991fd2ac10002d5498091c381eee1", - "fd06258e07ca73bd6711d4f5d464e302bfeb4f2a7301974fe0b8407d5f537d0a", - "1b13cf9147d24fb77c20b5bb5e8a0ab0c0dba2280a0a48effb4919d8744ae327", - "f5492de75c526f0526e69b45065b5dd1109fac6640a0415a6e45c5e02c7fa7cd", - "77a80b37a962a0ee5e3994859888f2c381c15f03877db0561b8995056aa875f4", - "5f5c7f50ff2b902fbf1bdd578d9351502d668bd50967c115a0f00c8214192788", - "b1aea4e3a639c9fb2651f4ce1ff2a7eb70e8486f6ea25074436f98fd4824df6d", - "7ae87441e503e5f088e7b7577ef65ee3e0a7cb5ba92d209cdcd06bb9cb3b706a", - "fb4679ac7ef09a2cf6f1e1e0fd57cdf29e988c7eb8283a9e63e6b42ede410bbb", - "5e9caefb8b12789572a74b936bd564a585c01316ace2b8e452982f88f028dd11", - "e1f0641bef7040be2c5298dd54b4749d20033d74b03cd5321642793b71c8c134", - "7c2556c5517df4d40574609024f95dd5e014ba1469461f90bd60efb13652c305", - "55acefcc8b20ad5b53d40c108812745580beb3d2fa6de3fd20b7a3debec74389", - "33b0a078d30ec60a9e8c0eb9ad41cf58239686ec2ec6739063157cfe3f79f780", - "baa798bd5f71c56ec4aa41f57e2818f0a1cae78caa91a275cf674ea4fac134b8", - "9465520822920bd7aa4c6ff87daad36afa1091c657b24b07052c4229fdd834a8", - "d710002fa506e39144167406596d049f08b0735e1721193a06d5d45507b3a400", - "54d29696f092fa261c8cd6e3bf881428cb2dea491f27f20e9c6cbc46827e9c8c", - "432501cc042b6d4937f7f93af2930ad36a44a2a8810dd489221c3f3fd5180451", - "8bc3fe9a6b8bd9f1e091775ef7987bfdab7d85f129c4784c95c40b1a1884dd80", - "1e2839ea8279802f4b715368234e38f5d2234fe93252bca1ec830fa596aa36ce", - "add851a08de6a471e2a1326462bc01b5dcf872b0a8047ceb6c700037b62ddb12", - "1528d7b373aacf588f22949b85d9619d08dfe3a9aee0ebad23a486d8c26dae4a", - "f666bce04cc6a71aecff3b2b4beaeba1b569fd9e6d812756d5d468ebb257f321", - "ae33c29f97a7dc3ef5d4fcf3ed935c315ccdcab127aec5eac4df4213f2a0ac6f", - "35202b5203513e68a1c59c58169cb3f7b25b0d8c842073d7b92066ff993f0260", - "941c218a701a2e6c4e753ee023d15c421b18012c11438582bdc37745c6b8047c", - "c4404c4b877377658995a3f0e55f977e15365cbda05f4f5d9601a68255230602", - "81b44973869523a27d5ecfb975419b655a5b7b9a6eec2ffb703ffcc1442f6d7e", - "97916e80792e9d4fffa37e27cbfb5f08bff3938381e237e3b4da7cc14204bf25", - "fe5b79d3b672aa40c98d90bc4e0e52795d4bf8914db979b81cf279a28bcdf5c7", - "5bd92e78a97da20111384178ab65700c0430a4f9d74b096540122816cf98e861", - "d94fd954222c4c101880d50642543e84f8ad20f4cc0060e3d2d0bff85e654ffd", - "6124af35fd56e24bf34ab28e205c74190b31c8049946e948efb9ff4f3217eda3", - "732fc9b176ffe0468dc24a5d78dcb077e758c460d90726504674d83dd685d364", - "f75248a6e6fc3acc31ff6afe22f56e2fd8d1bf94be9c1ab1bceb8a7e2379d891", - "e22f5326fee040ddc913df8b4dd281ecf0901c19eeca923893fed9652c555f23", - "b7db5c80331330cfc9e2aa04cd4af8cfcef941fa23829e57f51086c4d6dfae8a", - "733819e22c57b6cfbdc5695aea0d17b3f4a30ef8c8d3229c1988d39cdbe02e36", - "5c33856cfe4db0a5ce12a3d36aff9ca30e7e8672213717f7c292292ce926745d", - "3e66c9f13c089b44728eccc3b1a9396f9b4a388d0827118ddda0df38c45ad998", - "42bf0c9a52055e8a820ed112a0a1105798dcc5b7f1079fc311c917ccfb3e9c8a", - "0f6c191b69e3aa5adcb0b5e2ce3ec4ae1d7c1497bb3bed00a958f9d5873305b3", - "aaa3f2dd11facfa77ce45a97168699153dc1577e32b3c2f2ecb24ae956f7035f", - "8b7f19fa8736f01cdd22c4c97f7807c63aa1e48efb945a420a8b3001eab51615", - "1f71f5794dcab6ea347b43ab4f7b8c1aa9317e503b1a0864db6466a9a997f75e", - "562f6a8c41ba2e31cd737abede8b6d67155a0bed3876c69e17a4f7aabbc4ee96", - "18fcb3250ce56152a7a0b3cbb2e9a28fe871233d538701ada20d6f725e13b52e", - "2dbdd3d09471de2723fef9daa2932dddf6e6cb96f4a9c87b42158451661eaf21", - "24dde052c376ff111789da0eb7f534e6b2d7daefcf5a2d6a8c1814c8524623a5", - "1f782bc68365113d633003eb6be033a4d9cf92bbb1f19ad64496aa88eb7c8937", - "fa360c175333e55edf340cec2a7b9b395818912b66e227017f23bac336a8d629", - "a06f3d6219347c9df1f275764dc012ec52fba9280c14887d5b3d3df53bd8f59a", - "54033d73096937f71cabda415c84a31ba3aa9e92a09181fb3e39f80129c5ad70", - "d2b4704fb96cfc73d0bb9e90fc9d21996a5557c79488c569b77619c3aa96b7d4", - "fae5f2f1965ff84bdb3365125f4a1065870b1e681bf85676102f72a3b4a86d34", - "e04e3729d4dd92d6548cef6e6c43bb5afce36eed883125b22620ced259e58e3a", - "8746ee9e08115f37bf729e2d875a7117fc601f943e50d6076ff378bb5843e194", - "021ab386169872c34cc08e9d342152cd24f907500ec3537e238352102e68ac60", - "96316cf3bf52065aa7455c97cd77c0365b7a6accb39f7e2b2182326ecdc15aff", - "ca32ca77fa4ebc7db225539307dfd1e62f159b2c9ba0d95bf0948918e7b7545e", - "568fc14183cc5aeb39bd68a28fe472415f52a2a9656066570fe40c735b17649c", - "9d5183fb64547510568d5b07e8ccdeba003f3b7904978a1770ceecf3444678fe", - "c45b6a1446ec70ba0ee12771d3aa8727f0b4eff31b8f931f8f90accf28167330", - "3a96697f8197ebe0b89b706c436680cdec4f4421bb331e28d7835f6d5c49d5f7", - "970c38174a8ea6024892b6f578765740e1582800ae0dbee03fb44f574da15540", - "8d2209af8d10db96478f3e946893593f8d15397d9488da8be5b782c6e1edc857", - "fd3998ee32f2250da4e45b99c778e5202f4afc5dbd01f725e2c1f718b209effa", - "a04a116fee285b2741fffb4c740895f6ba25274bb366f984659633a92f484933", - "848b40e9cb34efc3de1bbe59c7f35b3de3738d6c7626151f447cb279a79f1d24", - "d4219737891e1a0013009deb75d0762475486fd80cfb8cb92bbd2fa3d1014b01", - "c76136f32ba0a0039e98070cc36998af0fd67de4d4eb58add4ae9f81dba352e1", - "808dc6e22202787e53df9884223fb5a9106c696776141bd3d2d5d3c9acd56085", - "c0a0482880229f438bc92218cffac77ee9f770ac2aa54d2648427c8df281945d", - "936af406ecf9abacdddc497bb92ba046d6ff0c1298e86299be80666218864169", - "d0605caa3e641708d8009f830ed07e6031a51d4cfec8d42075328089669a530e", - "615376fee67b05e34d0ae3fd7fb6401b0e2be484acb0d3964e73b3c779a0c046", - "9ea56eb3c2e91c7db8dcfff7995d480325039d07535334f67ff5a7d710c0ba99", - "4e47c24c68f9d679285938ff0a8f8643de2f1aa5f4fe8f70e894ab10c13c6e52", - "28b9b6ac5cdbce33d941bd8760b9b13eadbfefc93da41b5f371f88cd61b9fe34", - "b1b510c56963a26af7101687cab320fd74a148ef22a38f76f35a4568156f21b0", - "a1abdc1422e343b5d41acf6914caa18a666544913dfbced4c45c6d7c8d0697b7", - "9ee23558493514a5f9078e7a165d8154a001cd4bdc89b0c19c6faf5e34dd121a", - "91e7f9fdd62ff82a29e61697dbc4a1079cd855633d20afc7571f747b4b4845d3", - "b2a64f34bedaef856a5e4fc6f08bc0500d6e64ecd58a7b639e7cb694fd5c8618", - "72fef91b5194568b04b851e54e45ec47b321441a597bbc05d047d9001e9eaac0", - "26b6eaf7efad9b30bd2cdceb93f341e59f014d29517668a952349f74591fc4be", - "6b7620868a1dd57fc6fbfa510faca29f44aeafefd0f023e086c22718eafda5d8", - "fe355b7ce82894bb24cba58298b494a304aa42bca208cb0c3910f76bfa1309fd", - "01b004ce8fda041e7ad558a563e5e2b1ba68b65df71f4d2ae476343b68c789c3", - "5a40c3aceafea9da5e0ebf32eb984280b60b811493bb3e212fcd29212eac08b1", - "2224b4dc08de5c2d84b50986167b166fdd64bea8fe27cfd371c7907f383246e5", - "b2f926748abea0a859a21c1c531a6d82675c269c830d4860c1b6ed26b00249c9", - "5c392f5447f8d59882f198df6e1edd9c3c879bdfd911e2121881588dc692b3a5", - "9f2d2e02ee9ffeac197cab0c3a8eb19df33a1947bdb185160ff84722787e50bb", - "53b9ff5728386dce5c4c96adb336d5f643a794aecccce8100e7c19545f555ac8", - "ab0f413504b77a7e4a2d69efbb945f4a953c75cbc00b6e91731268481c2a742f", - "2ff103b2e53dbe5e9e0a3f4760553730e4d952cefeebfebe79dc0839fdf46e75", - "7be8c95cf619c103ed8280d2e37c579411aa017d2adefc1fe2bda633ef24f74d", - "9e748ace580440e89a3564749bd39c225eff47d646d5d87927e4f05d96b35ffb", - "f262c4969c17c374141c832d4ff5113c1cc603f991e93b6bb08e26e5192ebc65", - "4a7839860a9ed6fd9d3be0240f22190df23578a9cb0dcf7587c74521dc3cdb03", - "b8fe26cbfc6e7ce05d834671edc248f4aaf47f806331875a6981de3224be123f", - "276ebf975f484e477afd9cb8fe1b058fceb81764844c2506cb79c78c368d9668", - "9a6b2383c592a699faf92c2363891e9681371eb48ccc37bbf09176b91cb55ee8", - "40e3410a85d79d210ff275d6eb337c090e67246804f47384142115525a17bc26", - "95afe1a6115b79eaefcacbb681f952304321b9553f59f4b97115c05d08896d99", - "c5df95093ddc409dda63690a3a597d46d29c57a7ac9ecea240d7d050ce9714cd", - "332451a2d497ab12d9bcaf2dcb5ccd182c6ab8fdb84a74ec42ea948f4d9558c3", - "dcaf5dffa28d3c652551348546735593903893c2a601961be299a302f4bfbf6a", - "3ab54681812eb0a4a8d22ddd7c8aea777cfad3efa72e21e305c17e1419d34774", - "adf053721830dccc44945316ca916ed06a55351dd50a2868b46ee79e4d332532", - "22a3a69740c68fed62df577edb49181c94f7835fb406b9a8d73408334c3783b4", - "4a5ab1e7a24f36a0ac7bf3b2f619461db66d690f6e30cbccb34bdbca3cb18ccf", - "2df7de05a1231a4889cf90bfb703143aa29da7ad621e63f1452778a159d1ed5f", - "0b29e4feb5e6b1e5d7d55f651eb61d6d203049b723ad1fde754d9c30c78e829c", - "5bd7319713c7ddffb6bae43d80d17a6edd0db6aa4ce9ac16d45a3ed63dfdb080", - "30b7c74c748d07f68ee8870bc91cf2be6154fd455b8304daef2662ebf07b4904", - "cf31d65006d91c878f29d8b0aa6d5983e21877d551314cecae201437839f32de", - "7cdd994b887a7b9d97ad38c722a18ef7a2da61513301072419ce3572d9b23e34", - "59461c40aaa949961a37dc141d709b590309ffc0b00adbabb60444672e61cdf0", - "8d16ec7bc7d6fffc3fc7788c42f8eaa0bff13852c752fdfb6f5026c17fe6f2e2", - "37c5a2cd891cc7c668767d24028768d7d211cfd0f91c3431a8e295f0ff49a218", - "1ba04681c2229127934805c6b5569037e3ba1673dfed734b5cce89e302e6d148", - "f1ad1bb4b2c44ca45e7518fbf3f9192f17b9eca2fcc8fb7a9a87be7f132eeb72", - "96dca608e78f08b1b4c7b9d3d15c43bfa512e1203a6587ef9c6b310cc4632081", - "1c3ff030ecb739a483564c733c98e3a6b018d9570185e5e0d4e1c900cbf97577", - "dcd6f27a52d51516a034532bd776f5dfbe551aefef69aba690f503e765182f21", - "ab3f9125644dd7d62e4f2e35f37a62556b0c7da1882169b47fd8900a7a8cac94", - "ad48e775ff009807969c472c8271894d4a469bd95e0f40495cb71fe4b9f3e24c", - "7adfe02a067f1dc1123da49ee4ea4615062fe1ebb85447acf880cb6bbe956da1", - "e2a395978dafe4e8555b9fdc39bf025cffab96da9fd27fec737a22581493bfaf", - "950c19accb1c4c6fa07edc7fe433da6d22468a7bcd3291f7fd6bbfca8e8f486a", - "bfa2ba35d05f0106d0d4ba23b50f1eae2c2881d3ec1ba2e8a447ef91b0003da1", - "a721ac4568336c3e8162dcda7faf32382ebfcfa2f8d8c696f3dd3343768a02e6", - "c06e643cff267145c0c5460d07cbc5fd9bcc9047cfe9a926812c7c438c61cb6e", - "b93e7d8c89f93c471e452540dd7ae6627352c137ed2077603f62a89474c61e35", - "c7a0896da39a664e6c29af9c80de39b0d608dc31a07a731dd3722635de9ed048", - "12dc93bfe72a3bcfb2fb6346be1fa9957c6cd968d659f1816c014bebafe5d9e0", - "23ba1dc6c4120db732d13af29c53f896ac9c12a2472a7306259d7b81cc11a929", - "660e4df3e85d47da2b41ff12d79b63f9583853dee8b91099f30f9810404dcb82", - "b08a03bbc0ddf1703de3c49629ce6a9af5b0e1e369aa3e0435dc12ffd47a37fe", - "614231dbd6900ce2f066c3f1f49dccbe75b396bff97c5fc30b3183285c921936", - "89c90007dd5783e21490669fd2000fda0aa795eadf807b22fa2e0d9e3a20866f", - "9d40b4d2a75716c34f33add2ad0162c6120d4f38657d07bbc1e558c96feec70d", - "9bb34e64965eebbf99e76042c78b712f68ef1fdb4519b39d835bf411e6ebf02b", - "2d8b0c2f1d3ea5b08f0e20b2ff65c5b201b2c405f286c0e42b6de59a6ad1c82b", - "e9b865e67604853a5019f575f7484b0ba4e83c68dca72db33736bfce61ddcc80", - "a875836679a27206ba34a3dd5576c9cf5c53558ac2f17693183b9b303fc939aa", - "d15be9e661c52cf251b7ff715c547f35f3796d3d7ba30262ea53b45e5367091b", - "940413f8b65b9b477941e1d1293a3ddad48d3d36b12e661a0f6e74085ebcc0c5", - "f87f76f32f55b4ca09a26d4b7bb699732dc72abe80deecef58155677d38116bc", - "9a5fd39006c850b2fcbce233e5abb690da8c6dab112b889e152d0772f7784afb", - "aa3b6b79de4bf605785b31dd03be523cef83f7d11ba1727baf512f69fa9e7ef4", - "5669fcff8522d468b08a1a718b46b51a6296753d72ff70697a56f6399fea1c24", - "6b599d52784b4ed166789550d4233b69aee1d239615b5e9d8a1fd4da51d328b3", - "a319824adc13c4e0b9b0e181ba33e231cc5f92542d193f0b0ac2243a4f1aa76d", - "6cd0b9ee3a20f59002102f9f9ee4803608ffd215ef5d59ce4341688e2d2f52a5", - "d4d67ba38730d32cf4d1a5b0aff2dd552cc5ce4b7f5ebd4b6649b2122d0570ce", - "c01bf394b92e20b2834d422faaeacdf5e64047c86e32faab15de93eef429313b", - "b1a1331fd69c5b08c52ce459286f4fb9fef8b7132c3bd393e4e6fd9341acbec3", - "f7ba461bd98c49dc362abca7a4855be23ce8d77b08b8b351c1d5854d8711ef95", - "78a81ccd32a42cb2c8779f55b05169d25ea34fdd3532bbe089e29ce8ef5af407", - "afc5939b5af6dd0917fb281f1d27279955b5b875dbd055e7082eaaea3f41c63e", - "c47472d93f2d1c9802c70b76edcb87e7b7868fe14d9c5fbb4fde877210e2d7d6", - "8fb4b7fd32eaffc5c10767dad81df906aa0ea7cc68f2aedd91b9d9d5ee7a66ef", - "1bd3d712cf15f827cb376599bcbf0b062980d19dca50b6037189a5497be2e0ab", - "9e3d1a3ff55971eb5c8db9b959b901ad9186b89c416ef51e61bd72a5368d1df2", - "419d0f1909c58a3367f60f1f77a5aa9dc87896e321bd8a971c45b31638498722", - "b4f30978192e0a560326c35426e3a925951512a1bcb05d9971dd4930ea8d7d66", - "cdb2add9136381e8198e1b36e06d2451bad941e0bb7d3fba59e900a46dc7e44a", - "0ed9e1b0199c1a3d175ad3e491db7b2254a0c2e6951505e6f7682e0946463da3", - "f240cab24ce28d098ed0d0fbc8dfa9055f62c6dda502794f4aabb2ef588bfaea", - "c231598e96804d2dfe5e56ea635846bb518b20259ad4866e3d450ddbf0abaab0", - "1aa2ca2c94a763e5d8e5273727dd63c2d9191716a8c259215f0235faec20c0f9", - "b153dc0a132f8fbf2a1ab02c9d184656518ec3d6b35edae41bd044adedf95722", - "4c6a3eacab44b71a6faad0ea57338041a6d0ec85ae64ec3d29ebdcf94088544c", - "b6a25eee181c495432d0848da67290d3523c3dc83e19b17670a193a31a2046e5", - "5aa211e3eb83ed588cecf073085c19d505c7606828c7edfea3ad4f96b488e4b9", - "372b48d704654a69531eb6827a19b6e2a4b6a79584a3f75d3fd40d3cc4944757", - "56531e20e442127bb8252118b3131223302a8293d1ebbe24472c3b3f494446a3", - "f5e23c27ede00d63cd88391b39bd0d023d275750310a61caeb0d922f37866fbf", - "603c62f37f696bf04fbdcefc905221db47061fc29947197fb42486313b747c15", - "ac0edd323412c73805641879f92a3e56bbc31bbb22bb6455cc7af3a575913b3d", - "77f467cf337cbdae68540497954b53c286c19b99dcc6db20cd5af8f84f257745", - "08eb91d481706420a05ef2a892ad26f89d5bd294bd7838ec04bb1c52fa68a4f3", - "90aa54ccb21fdedc6223575904adba610c0998a15eee239cf0351507055f218b", - "338e264f3747f20529c7cb96315a5f359cd14f081288d5e927d5cc85ef2ddcfa", - "4a07f5655c3e36a36157b813c5b15cb4750241403ef481b714f86b904ac9688e", - "eefcc82b9c23e323f863d4a72328738206b1e308318aa1da8f0dd1132e216b6a", - "6543d26313ea53815e5dfa4698fe689dd1f70ec37005e0ce08f45d97612e61f5", - "f97977cf4048e45bfebd305e2ee8899531ff63c785e0034fe222bc2272b9b8b5", - "a0139a8f32bc52439631ac6c0949e526d6aab4aee92e9d4d4975cf5cf7a0a7d6", - "09f6ae089f26d536b9df5ea4d453b5422882b50820fa7511fbaeb05b20a02b76", - "8f46b5b1e907b6b150ce03a1c564d79225626d6f847906862bdeef0b4d342368", - "536bcc727b069e8905989713a84d08ec66b7bc76ab7d60c47c3f636a47659841", - "6f3dca78d23576e6998e0c248d76205f9abf44cb8b2524ae82a3787a4e23a25c", - "e59c2840e0e91eaef562e67bc43b4acbc95311028949ebd669fd3228b4dd9a88", - "98a4fdc36c88ab304147b377a1ac506e439ec9fa1b01773b6f80dd4c6cbaede7", - "0a2d38f8d05ff444e733529d2cbadffaa416be5e2495a87fabc9da95893e6231", - "d847f238a061a46bcc03be7a41c5f227aa038c828f648da1cbe8d7fc0e3b198b", - "8835be8d17efaafa75ba804a6e597812dfb1b5c2d7b998d4c642ff5a7914fc90", - "118a6a4816e6f288ee52eb6fe57522fed33f6df0eed5b12b29e08633c26629c5", - "5f26fdb73335ec901ed2ab59d7a8bdd8440fb9e56f183ccb307bfbd3b48f4796", - "4a2748734f55836ebbc733838824978d30d58f3ab232516429371f2018eb983c", - "28cbb4356f14acc34fecf3149825fda43e1ae0f337823c266f6a82c871556864", - "07453ef2c961e7a64786ddefc4cf98963507239ae32e3cb94792aabad693fe62", - "b1be6b4e6a86a7e6c7f45cb18cb03705373c85aff539b83fc953b03f17a5f318", - "229a46895a434f1299a483989e92fa492ead6f7288315bacca38939c65b3d09f", - "4b3d7934aa58cd329f1b2778da0773d41ca5bff7f509c33eb3d7c3de4090ec07", - "e6f7d0b451668c64eb70d40f741128fa78514bc4f02d5562e43ac7f5058895d5", - "2ae5b938b43dd782af151afabddd54de1a6aa5702ea7ea03eea88c4bb4256438", - "96f685653bcb2bcefe7a89f08e4f60677f5053ec30d7bd2df5319f2f76dad85c", - "81ba429c380fa1bf0ab7b1fa6a38dbb55eda0418148a190cc39c3db2f9b04ca6", - "650b65ce7477b0c89e6f5e2fa991a4a0d6d7c9f307feaada4289d7b1e7fd693a", - "da088b8fee74cd2ca3634d3817fa2c6eca21356c318b9453d6524c70b1dd0bd9", - "8293650c9beae7ce63229566d09d51025e327d4768519fe1e20c384d41e38b86", - "0ae7ee61053dab2ebca755a10df6ed0002f4ca39a519a50a3fb2a1999af8d069", - "156bc31b21689a856bd9d64443405d0726d96ca204e9557b27e4ca0789b18cb9", - "8c96cc0f86ad10805fba3c23d30a8f308fe6bdcaedabbf2e1e43ca39111c1e31", - "c4b7e69e9242b4b3c9d48ebfb1b52d72aff20b104e9c50d550f7488d96077671", - "5909d46c6ba2ba2bb18a6923e9aba55f1ae997ce4738f9ddce4babecb582ec5f", - "a5d24bf62a39ef3b1961911c36e0dc8f42ad5a1de1dc25bdd7e49e01f45c10c4", - "62d4c61d0001ca9c665b6f28d734153d1ce2da02d4f94c6f17b20164442ba47b", - "37f4a0b376d3848511f971f6b67cee9d0174963f4c09a86aa4bad4a3ba739012", - "eaf39c5dfbc4bebb9b298d6d59b69ab3aa546966b5b2e140be3c832ae0d78ce7", - "082782753fc0aa5f2595a59390016b3e2fbbc0556fab51c4901e1a4e052e2f12", - "485f1e1bc116544f912f6b04c471c28beba84941c5d3d508e83a353e51e29166", - "67294ced2de3317f79767400b4c906abb27a6ec79410ce6909ac5b1ba07ecc9a", - "1b5e1ae7ac91ad2ea4e60fb71df31c722530d1625afcb455a5395bb5215a393b", - "f94b5ac2dbd6983f8fcbaa9a56e06767af24136e34466b789fe86c9e4c14a9e4", - "e9503f9f8d82ecb4932238af118ab1d5b0680ec30cb11efe9c46c69f4026b564", - "0480a0d537654eb1c4ba70db529175ab57b775c1fb06e84094d41d916315ab5c", - "330fad924bade3b1e5586175886c0a284392527ea7cfdc070859c8159df922f5", - "2497e83d5f16c36c0d771e7bdc29e84d7cf6892a567f198e9b5089c0d24d6ff7", - "8f4e5a0f5bf6e5db201c6f4f4338d920a93ff159c721516e9fdea09399eebcdb", - "b4977aa56c9b5379bea422d4a879145f71bac460dce4c8a00a546ddf7694275b", - "ba71e05c2472e4ca344e6acbdcb518f54ecfd76ed75a2379b6cfdceb14beb08a", - "91cbb15c7a1e687c0383368d9ed749e6098aa36227105c0cc17541c495f966ee", - "2649830982e038a313ea2bf41d0160de195f6adacb652caffb273bf5a0c03719", - "96ed49818ef471e0dbbba1ce2373db33fac9697e8208103ca4a5c950e9475e27", - "316ad2d24a8cd303401905d63697cd749e876450cf220541d71304bf675c8f10", - "21c81ad60dbac5f5273b1b49cb2e4507dd4ecef31153645c575cce3cad6d625c", - "b365b8abe7933dfeabcf95f2b8dd1a232c4f7113b6f05c0c445784d732c7ae2a", - "ac76ba44876a9cefb69e22e79546d05a3097d2066131e747c6f972c2b6e82220", - "89c2db15cd2b5077e68968ce229863c7dc88ac7a684b0c64fdd4adaecdb1704d", - "d76c6f0c1b7290b9c9890ca5b7bcf6a0c71c66e56536fab32b0a749c46c439e3", - "4b31d26272fcd91c290032c806e21803317388f6248ef99d650cc9f55720d8be", - "88a4fea0a0977dc01d70d50d1bbe34ac33a379ba4505eba4da206e16e56a4cad", - "00a7e586bfd9ed32a59fbd054784399be5c1f75df2a59c6bf1648fa0a0d5ada9", - "410dc66058cb0f3ba9bcb8e93779bc10c82ac76365c2ce93229641007b8504cf", - "1f6e87d3660027bc646fdff3d346b27309ede3a7536b18fe884937644cc31367", - "32046588edf2aebc75deaebbcae8bae184f7228d063f94ecf20e012c052b1cfa", - "851735ba4a73738949835b0e8e8a1904a008f098e6b64e1c3d998554bdda6734", - "86065f561504de3bf8f5ab17831da5d9e2886b9d6e5f958c82e997162707781e", - "7a4da500bfeef35f6cade4748e40e785db21935948db6b89748fae420550756b", - "0886859ee9751f648233e8af59fda1bb12223a48b7e67c01527c2e02927a0b7a", - "dde85ced6214589a1a8b159d08eaa29b664c68f147f779a295e0c6a39527b393", - "f7cb789281481a9e2441313ad79d1cdcc83a054ed48c5260e5e39b21af620506", - "20d211dac665fca821af2f82ec9ee429bef0e7cc828912b18e0c902d76f8a3a5", - "fda7f2d52230f847419479e22c68e798907a80224da11d9ddb38ecaed797609f", - "ad5ac043b8bb99017dbec733b6b5166fd0da0188c8879a49d044e43e0fda5f6e", - "4a38271f7ab98915d426f617c2b7e0c9013e6f0efb3e101579c6780eab2152da", - "c4d5c1132e98e0026114cdd7eee58709bc1be2616c3b8035fa4b84223781eb9b", - "a0c0514671e543867e65fe8f5b370dd554ab2b45bfb090a3cfd634fb1c60f8d7", - "50eeeb0625fec3de10dce97404c350ff31bbe1503e0d1883a20a3df754832b7b", - "d856be0368791203d9620bc98da1d7baeb313cd007cdca2a603d3e18274afe29", - "ad05f032790a9b8553e0d3407456121842244d23eff46bbceaa318ef43bee15d", - "5d804900753c685a64302ea24c1bf3affb19dacf4de49485cf7c2e0acd3522c3", - "59b25090adeeec7d1bd94486782e003b13c8a1255428e4a9758c9fa3d0e3e54d", - "64a3ce659000ce8ecbf8a7053bf84f3d4a5426e099bdc9b87cc8850f8312dc63", - "3d25897a7ede888d1499223ae5083ec711dbbb61d059d2b547f907dabb7a4ccf", - "700b1759ef015d6433291e51b2b33349320ccd8b71804cbc9ea7ae44c150fb6e", - "d1ccbf12b141effdad7cb2d88392e2a39dead7df79665b0a7755d5174311f003", - "089921c36273564b8d8fdbc2198760643593de94b04bc594dc5dd98821d6ed79", - "e6b014421d84b96f4b01c970455c05082ee6db5a2aac648d764397e428ad5241", - "fd04509b396eb6ca2d8f626da57c268d96f07323e995a9e3ca260d25fa1d10db", - "bbfcbddc6b7f86e3a759d7d1fa6e54d5845743e90617a18f90ff4589fe8b79e1", - "4879cec31d4f4a0abb651b8e738ca9cf3a4726693114cb0faffd123e93e9083e", - "eab16e7c11443afab67ae0ddb4e54bf9c0a146ad2d69df8b2eed27d6053d00c8", - "348903f655f5aafe5c7326ede8eba6d20aa2675d5e59beb254bdd323ca12948b", - "2a063af84383ed58ec40f04615616ad639970db5ebc58c08825150cfd7b72d83", - "680aeee2b6ff53af7dcf3a4262f24630440e766b430683c8c8d9650e07782738", - "813b7bd5ffbbd77cd47fa000951c5ef404171b7721e2377726cc4ca3f49dabb4", - "2f8d13d560d2919724433faa24fba83a7571f1f6eada10cc8c53a0dc5a912314", - "320cb499eced63585d94ea6dbc46017967a3cf2ebdddb6cf2160b8064b849358", - "053c2f2f13313bfa48c2f401ae8a7ec6ee0d3cf7b7d9a756bb2646eca5fae799", - "94619672d5b13c422ffe9b1fc0ae2fcf309cd96fec622a5465d9bed926a4073e", - "68e9db92d74ab9a425b0cada923c47a25a20c0f3577da279b83614d3c73978ce", - "1acaf5fa4e5e7e1e21a50ffa4c163312fd1b7c6ff8afbc19eec0f2e326534b31", - "9e8cf1bea57deca36833c1d4856d9dc06befeafe9273a2713c97bb13b064e1dc", - "84d190215a95d312a0e0ff26172256a22cf4bf61e1ea384fcf468af14f7dfb61", - "089aff7f5d99428e8a01fe4d60cab9953b839a08722054f45afb270d2cca6db3", - "0acdc1346119f614a9a5c912f278b40723a3719f15ac80e34fbed6f399e43413", - "c0bb3f91e08c273120b4ca2c1472a4e0a44eb1175110b387f18a68376c5277a0", - "0882f5fb37c310ed6cea70a027f043a6fbdad427382fb2068c1fd322e29965fa", - "dc5cb8f8898019576621d0910884f0bfcc801d2eff6dade64376f60bb4cede40", - "3d18cf9df73557aef7868d65e3ec05b453cada03938ffcd5927f44e676599924", - "e255929ee37b20df1524dd777f7e3c968274f310bb540a04c684433db8d1c833", - "a50f483b5abbf03c1cb2eac82e0dea4b6e847df4ac05e80fb2c0f5ec9394e7cf", - "52b3b7320177f6968d285cb88737b955f7f884bcef691308feaee00f7ae9b0b3", - "20ecc67f5049a32648e8df31ee1e1486deffec48b023c904522bd88daecda87c", - "e86dd51fcaead0f2ad55f20a9045e27523e4f3b07981f2e07169ab42fa423a51", - "82821aec97c7ceecf670b318daf6b4f70497d681df0ff438d74059adac8d493a", - "9e40bcc1011d2e763990eb91b92fc56486b5941cc19d91156c4c054f58800222", - "e2f230940644d7c045b187eaaf80d4cc3e5a1637b28321019358ef7e2ade83ce", - "d9fc54d4e432c5b292bf63753914ba5a31281233497643507ce4aa4f389950aa", - "29bcc5dd710e2ebc1357bf7a8ec59e53198d97f353cf5d79e233614e6aaf3ee4", - "8b1dcda982d10ef8bdbf6d889f9c5afde0fdd9d5d1affcc1170fd7b2cb94b4dc", - "64e03052768ee16af4d1b0176f2d503d04a822c2485c7e18f7de84513cb9af37", - "057106e306a2aa513d76654b70ef72fc8caf445612cd70bfd2609ea0257a5283", - "11b77d29cc6b41e9d4e7308f9476076fcf9b8399862076d2b5ecd72c3452d1e5", - "2182db76e083435272d7170a242b3b2239e205ada4b51c041e741390546ecb68", - "a90cb2f47c46a84fbfe6d64b5b12c0a66140e331846a1f71902cda950feba72b", - "703c998ff39e4687c8d0fbdd84bb647c0c9fc738bc4cf4309bef923190b04733", - "a850a299f3e8d45beb1bb4c1ecd0f6cf1eff3f810dfd2e0e9fa847ec9ba78427", - "e41dd5f3d8e5be3a16fcb50c1c212522764d11375f85765337768baf4deffc5b", - "119805b42fe1e2e0419eb4394cfd7dd7d7283eea857a70a0898966d1a22c3779", - "cbec9abcfdb531e26c98bf42976317d7e638f2ec1c67c67170d39993f6d67827", - "c107d9c1df181c09df540ada7074e094857e4c97b723230b93d0b3e5e7d1390f", - "6cb3a90baaaea1613dd57d306264c5b7775aa9560a2147d3ec1c12c06a1077ce", - "df4b38d48e9abcbbd55fac9d013ea56f3ae72fde2f6a19bb855e300e247a187c", - "08f6026f0cfbc25ffb788d84aeee696194e01d600eaaf7451cfb86c5a1a46fee", - "43df4aa70eafca63d5a9e0becacfe9100b7e8126d62ca00b64df21420f2dc879", - "2d77ca38fc497fddc7d3c301e84ed324b5ea78fe346a1d3f65f32bb4fd302d5b", - "a8719b5a8b933a138c7bddd490b347c9c06122e0e1341a4a7dd6fa0907d1f079", - "f3776c6c2cebaff769045c3236babf234286ee4c5368a2087fceda614c4090ee", - "053eca2b3d064c7533bda7863c77f4ee0ed29219568a81e809d7b2978cf1de47", - "f0829768b1df7771f6c205d6b9863e0534381d95b35a3f699b9dc93d1f9311f8", - "32da0f572b78ddc4d462eb27eb243e72d9938b927069d50dc6feb4b253a31012", - "5fc809b6dab5b5cd793ff3b0e39225e6b8770cff6958ca99251f1f41923952f8", - "bc5519ef628869745764a338f51ae5a5199e9e55a6b9cfaa211022d751641425", - "8e995d97b90f16d566fd20c302da94fcaa2be0523becdf067d0235b7a316ffcb", - "997f91bd1008e6d9ff8118e98a98122ccfe6ad10793f1b3eb1d93f21f8fcff78", - "69cdbc9a122f877e7343a718c24b0e997def9178b72a13e2a5703179d8e916a3", - "9ec1d0cf5ef4bcce8002f45a65adbe0066eaf90ecc493a80407cfdd0d4318325", - "572103f6b2ec8c8bd9eef8e45f0511a368996cafd3dc954b375192842f16a5a0", - "254b020465351c97642c4e32550fed51756b96c393f568db4154f39223a35e26", - "ed92eef1c0593e1a69d1dcc396a92559f19a696e4eb390547a309be623bc8d33", - "6727c76b734cde48d9b5385025b3f6dee33d9bd6aa57d7a203bbddf716cb609e", - "96869cd52748ac1862b0468ec927fd8b38e89b3337722a896a1973a870f2f0d8", - "bed3466d1d4c612f75bffcff766dbfa9338f763b6ae6ad28a01b8bfa30803e7b", - "30b02466af97398229b1a22bb8cd40aa4b78085eb80bb125e010727cb387f955", - "112c4f404795831c4e3a9eb26f6d723da2a45ae15a9e84163fcdab040bacf9f5", - "5204be9ff4af144d5686b1e4399d5b110d8dcd50249620839a8911965e1d2018", - "b58a638e6bdba283469f417d07fc09ac81cf9e914af4cedeb8282cdf90c6a9df", - "0100099dfbab92dd5e6c47d31c49fa9a3026befbc3a9de92e4d79c581f6e4b83", - "43eba805930028f80c9d4ed3ce3f04bab06133cb62127fe7f387e12e87107124", - "95cda194be0885bfceba7c257b181261efcc866c854ce9f678155abe76f5c492", - "1c25cbff79ee136a02a27f7c57f36a080afdfbc03a509ca596394c446c973237", - "d45c133871311382c063ce0662c93d9e5ddf34bcb71806f35365891dda179766", - "154d45a4f47bd3f9d05c34b7eff5b8cee02c9d3423382cfca4da2a45ce30250e", - "e0628dbd61768a29072ee7fefa1e4c6c9d06cd0451bd30a04d00f63b43485f31", - "b5bc001c665ff5dcfe2d9a8aece01c0f329e173c517a1daf33b8e0b1f6935d67", - "85bc3a9402a563d698664fd5c10c5178cb9ccc4664a1dc90a925ca7553596bbd", - "0c2b011f7aeb539ebf7527402db20bbc4b5e38b07db34dd7903a8da1d12c0e97", - "9fd7c214c9359ac1609ba66005da32b49f24a67540f2b3f0b11778de97d9f6e4", - "10b8fc281109af05e3917bec9ec6bcc6e112fbc5be7c20b50ff4108d38e78a69", - "c0b8450c78ad090db0d42d64e7f614aa920d8c5783da5ae260e56a394604dda8", - "4007d067f2902e35414cf894fa3cebb8b89df24b9c58ebb187cabf16f104026a", - "64828a532746e8851c8d3d1f4cbf64bee98f2e96f235cb0e6b8fb30d0584b431", - "c33ee765ecc717b3ff2280e48139e7da8eca8e7754176cf76ee3352b2cc6a8a7", - "04bec48f64b5d5b542943c65c6eec65f3ee37f3675f621e21531f060317dc127", - "6f8a8e5104d6f0526f8945f92eaba25b92b99456e949d3212ba9346d4227f427", - "82b9f0d23b2fea51e5fbdf9a8a28c32086d434af58ecc86aa68221bc84ef58c1", - "471fb16b7815ef67d9986b17a10f6cbb013e7fd78b33a5e8beb7fe041c169edb", - "95f983101df80c94b3d18daa9af1871acae30bc16b28162dfed4fb77df162200", - "e992b30e8e68ef432bf5c4157af7bacc2610b6cad22407c058f5554a90450511", - "f9167518f1b23ed6dcc8ef8b8a9a0606bfe8103c476978e6d4658fdadde99757", - "81be9ee1605b92857f53d19f72d13f5de2953fed19863b03da4d25bdb77d5f23", - "8277ba770736614ffcd18955abc8a03cf2f87eeb972877890e2e163a259c4596", - "2331a20d4b2b6f35c1fb62ddebfebecbe22b5a03c6a4371bdf856999790374fd", - "5d77cafbdff41cc30c09a81a2557e8bee7af2c4f928adf632c91eab988f9a5b6", - "e01216272a686d7459bc8bc0a55de5a42cba6d098aca2ab491f3cdf81eb2cab6", - "dd048573606c2d26d1535d0c20dd68e7fc542f0b6f554c3bbad32932e29f2997", - "df9561e8a5904a1a464cec1318406c34258c572e81bc104b9d2c3318cf385783", - "b40f9f476ac9fa94a9a5f65a73c30bd0e5afc0f9162f73ed2ccad653cada9c3f", - "f5560b0e39c4bc7d33a59699382b984da1a774f2e522e562d7448600f0766345", - "b231e530c2dba8f239f51d5ae7a79796989b07ba08d32e35eaeec0238477157d", - "538e9fbfeeb0daf8eed85957000b74f2970f51e8095e27a8e92b584aa694bf6a", - "15e8499f828ab627104d623ef5b7246cb0e32c754055a8364e99cfc092226b00", - "79ac386aee59ab136c895481a636410b544b4e81fce437f89512eb9d1eb76d12", - "efc0a8e3643ce260428c6673520f98292f18c82ea8921044b5a7362181485da8", - "62d0d353073f16c6d447bc0bfc1454917598f4677f892b47e50631311b4feb21", - "47bd09aa1f5882c5263981be47436d05b1b734c5f6b1ca4ae42d4292751abce7", - "cccc2105bcb94ee645470c60af23bbe9dc56ca05c9ef7661814b559a7448e48f", - "c6fe9041cbe87ceac666bdc9d2ef3fb9b0be750449526d2d7efd9edf60e45636", - "0b18e7abfb28249c27cf4dd0beb5f7176dfbe1f6ccbc7b3a342c7518daf7b497", - "31266158d0f74ba49bb55af66fac4d44b56602326a40a267c8aa4589c382a167", - "cdaab3ba51088bc32bde19be827e48ed249b85c5b0585274923a927a9fda5024", - "acc2f80f1d7583bc847458440a1876953b812322be29e9fd393089954f951a25", - "d9d4f0fbc03959a79a7afc504ccc6f05fb10f02061e3abd11403b56ba52dc73c", - "cdc4d47e38a3f8e92a445fb14a60ebe73e04f392dec60e3d3abc1781477d00d5", - "d7fb8a3882ed59070c0c667a0b234b0cdebe8a4420990c2004d4e6402ce16a1d", - "1a975233fea619206b541ec5ef79b20ccc3a18628b7d6638abb84b6de9e1e2e4", - "a496fda44116c3a9caa19e491eae8a9f53d2b2665c9028ef81fbb109a9545143", - "1ec90dd27771f3338c057fb511f974a7ed7cc411d43ea1470d461686b19b84fc", - "e5cb096023254b0845e753ca1f37d6d21ca9cd84da7243a70855007958b8be06", - "ce946b8f7fdaefd12f618d6ef9b43485ab783005aa537a3c8cd0edede2a2d0da", - "65ea4690dcbd6cdaf23250fe5731ad88a238246311274a513f7e196ce08d6b9e", - "72cc0e32759aac6fed0c00246330b9fb18f7fe83db1e9425ca3f783f1fd7ac07", - "1c2c7ca8e3f84eff3ded717477258a606d0346ffed5f2d0612a1b420045c64a8", - "2377c72011a34998658b027e3b4d1d77f1643eb8dcb3593879de92c642ace100", - "5fdd65448a44d506bea3fcb1d810a3b2e11c0efa2a6c8c524477f5fc30563ecc", - "b5b3f00609d122b5c14940e4dbe0d683fef9ddb254103cb5ceeb63fa422459bb", - "72f4eacb2d0201bc65b2bda9b0cc2e04ed3e2dc0a3084b3113bdb90fc2d80f0d", - "fe24e3d3e7bd26a0ed3301abf79f645509dfe0056a80bd4d04b5ef82a93db229", - "447cc70ae251a29b78abc3ce79d10f155cc27acdd3eae21589bdff13c2b4a730", - "0ec97fec5cd92cd57035fdeb3036852b6abc33394cc4845d7434d05aa587f26b", - "7d07bf2d417de4da47f234400626ab0da59ef3469b319c60b36fa3f8819550c6", - "f03ff712596eedc7179bbe9f59dddb86be4a3fdab4d8bc4d3580208a3e09e0fd", - "f6c3fe3e969227565cd6e35fbd1de1209dd6e30558fd22b56bb3857023f32652", - "03b6390b6abe81856348e8979eb12992e635cb387ccb7a63fa7cfed2492335cb", - "379e4378bfcd4d6beb6610d1944a8a7cb11944659f75bd6bbfe27a0cebbebc66", - "ae530255f1f132685117fae32a661adce9b3a2e244f5559b0aa058497894f884", - "121fa6c4e6ac59cc4014848d866087aa8e7aa037031e165f0e6f3fdbdcbe677e", - "84871c1a386cf099e65fc775e9851db5e69668b1b907cc685e3ff375cecd7ed5", - "e1ad0d12fea52e39de26da71a041693ca8e69e2c1ddf3a145afe8db1ceca2629", - "2d47091a9753842e25a4b8803a26e859fffb5cd4d1c68139ad36d0df58076a33", - "9239cb72e0d93341517aa69430773c35a59852ae6e5259a8feabd86fc2c0b8b2", - "a0287548719a601d476d2540cb211142b0b8cf3f0f8dcb8e2eb8a412faec40f2", - "cb5cc64f930b93eca6144f91d7f59b426d6c865481e369d263beeeed507c8ee1", - "47abaccb2643b9299dea188abb0e1f289a22e0d94e8865d8e31834a856cea862", - "43e08a0f48885266282ae39d8f2c53f1c9aa37f3504fedad75b5d855ac67ddaf", - "487aa7ff81054d062efaf79325e61957d7bcda3032e8d97000e5a944008e995f", - "506f2c1ae94f306135f4eb8b1ba1865798f57695076651f63113d932ffef5ff3", - "49e2401942c8d04b01d1c1cbcb85f13bcfb74438caa6fee11c2f8c7654decc8f", - "89a262677e06bd6a02ebbe1f1973751e0ae79a32a5c6ca5a4449ebf8f977e0be", - "ae2e8e73f307498b62ab6952c7de38bcde0d0852e3be181d0ad695711632daae", - "802791aec916abba5b3c981cee6bad29019c15520bb8486889d768e1964fbefa", - "f3b612e308fee5b8e673c1ced5a44ded73cc4e95538e93379ad74ae1c30651dc", - "a402542b7430fc86c58e0021acfb73761e30734c183d2fb585795247992a664e", - "8108be8cab930c0efb690f3ef85ff7a18c70b18a1bc95dcc00f53736a0bb7a4d", - "abea76cccf5230a17bd575973c5177ac0921e877de2352c36f34c81a41c7c6c3", - "ca4c0d3c0664cb2ab3ced08084d2ed28defa1bae95e321b1aa78008989e4410a", - "108d02a97431c4e3dde3909e6bbc719ef3191ed8ad1cc80bc43b25c7af8c1f58", - "745a0e268e7ca1a8941b9c77f7520adecded57e702f51ba7b50796bbb8e66f83", - "daff129ac336e6f4353b863c6ef6b8656dc2fe8b65c8d73224ded5a3ded65e32", - "8dc76258b11a941f46649bf77d70ad72b86e7e0a2b48bbef77773b7255aa43e8", - "f1e96cddaa8b6e7000a3fd3d01e75e7d81f041d79746bf5a3e892e29d2877482", - "91007924b4a3cca841539e21ccfd21a9e358f7221f606d8f02126b98d941f1af", - "f477190bd75ad560bb6ca6453630ee99fd82948bdc775e1963380d01ea2c9281", - "5a71f71e255b07cba697d64d061162664de7153cebb51a15bdc5dadfcb21881b", - "ceb3950607359664c2a8a11f853a10181102cc560cfd1ae5d3589cb776ff9ef1", - "7cd707d75671a408852b4034d163460d928cd2f0991bb440d40207c0338dd02b", - "fe60a22401619d8021e030b71c87461c5f5290d8e4d5f448e5eac99768e3f3b4", - "fd659c60459bc1780b2b218ad6ec1b0628e0c1d6750d6e5573bfd840936b1730", - "ba11c3c8a37fff402e958acee906468df07b0c118b1d2d886e6682a191205fed", - "4ece3b38df3b4cebaaddaced8c3bbff7219cf0a7fb7c5eca7fbd857a46f6e5e1", - "2abcf1e0fc773956de977aae9fc5f28ac40dea1e0df4cfd286bde1ff1b6d317e", - "9312f378c5c5d6022db295d30ef5b11d2b33d74c321a8babac9c08f7ea1ab20a", - "58599dceb9870a010d666bb3c500c4515c2c38950800c2fff265e3876b17c91c", - "b33fc154706354e84103193e02dc34b5b6ffd733e80871fe18157efc73e80724", - "879db84e7579a156e7ce0a2f84ca729b76084f5cf26a54141a868fe956dc2bdd", - "e8b7dcd1e4eb441a70168a73445fbf313e755086428c24eca2285ff06535a11a", - "4093e7623252cc208c07f8b32b5e69cc302ea94daa7a9466d9ba6a6c09ea9fe6", - "7169fc0cc63470e1a5cb0ae94e4a849823333cdd49076966d3934fb58d877aee", - "94461c76c33ab82c03d3388ade7fa8dfa01dea8400b3a4fde634463b61c85b95", - "77f0e0b15507670e1062267e7908bf2d09b94b8a2707e320a6885066edebb653", - "33b34f91a6a336a43560bdadda121e90e11136c11b1ee3031ddca27d6644f185", - "5846f55656495e7906614bba538ac3db6e7805f3267231b88d9fe62fc062c3f0", - "f2dc2fd1af80ef44f966486942eba9fcd5c935cb393322502d1edfa8479f634f", - "36bcda7d4f47614e710cb7db48b06018dc1e118ab6bcf7d881743486f8f95610", - "34d44e65dd548735dd68e04d03ced3dff06813774c2471c5b382b3370732bd91", - "356d48bffa234c48e7b403773581afc8746f241ba64b34520a7d5cb5ead9307b", - "53fc6b0a7e3760c766d96215e7cc3a34f61b98d3a85f9356226fe27b392b6e30", - "9479f6733f81dbb5a46faf846b513b0f86f3fbf5628b910061bbac4f23b23eab", - "954316793b99f44ff1c59184962b8aa37119a7aeaa37980650bf7937e67feff6", - "1fb27cb74c4c59ab21dd90d525608916715a3f086040599cd5be311d99aadd03", - "9776ba86836a20721f23806a0b2726cc859ed63c2564dfd5594d12f476991b28", - "9de179703732a604675416c0f99387335bb37d06434d985762d0ca75f5a8ba60", - "e9c87b31bfc2672ee4137c1d8e0816ad9927858e44fc5e95ad4a88738c7fda14", - "bdfb96092c8d24b35de256c482c72c43a6a09a8d3acf335b102a6bc3d4eedda2", - "aa8799594749e9479c2aba486a21c4f735cbef4ccc88a73d20c5a87012b08bb0", - "9fe85bffc0c7a0ff9ba271b122dc8e36ec69207e5da693928be2b6c72553113e", - "fac76a7a8e2647abd6bab5c33ec564717889cddcd0353daa7cb81bfe95273719", - "ea370ba4488d2ac2289ee17abd77df9edc58b5e4f1ea02cf4cae1386d1817a23", - "0925f1445a66aa4fe33714de0902ea2c3468278255d8b0aadeb80daf5050f368", - "842967b5293b1fa3208858924adcbb0c8eed4f82d2b009bcf7b906304166f88c", - "c29954e602087a59a585ba622ac704b99d1b591f973f99f6d02081b6879e2fc2", - "b34d10be7cb032241bd2cbefb2e7ef97bc4e0a4abb83a09a52de6c847e5719bd", - "a1b4a667a25e49785e1df48edbdbb1560c8d5cb34cf41915f88f934179bac657", - "9a5b442df2aa66d8fd5f77d43bb2f83734eb834f28610d5b7612cfd28a251630", - "05d88771fd790cdeeac17a22873fbdb03e9e43dec40d71cc0374a4893acccb47", - "a958bc6783eef2ec78c33b2ae01fa466bc3491a84076f52a37fb81a96c4eecc5", - "0f76ab024fc160fe37229b8c3d7a7c4f44da39d8aebd2d55d290a6320dddc3e7", - "564a2c49778d834aec1e43c68feaf0db407c119950d0729d376d80b19cc66aa2", - "cb1e6dd773dc5c122084974f20441a2f57b5b4e0dc4ec578b3dedbcc3745cae9", - "ad93071a5ef70993f8b484f6a8051ef7c846e5f7504c3f3f8cc88a90ef7bc31b", - "696e8d54264a4184ad699290e251b0f101fb07fea497b72a7b4a3be3696c0729", - "46154ebe2c7fa2c0627e1e6116fbca65d231eb7a8bf8d4bf20ee7ae7fa361879", - "d08379e55bf028e666a47bfb175e29d2ca83a78cc49b931d6549d92c79224d93", - "1707bbbce40da970b2a398ad936d541f9e8338506929ada82bcab9aff98f694b", - "d72c0ee92d8b4ac38c0a6b3d2b0f5bfa3b7ee1624ee71c66fc64e6ba6d2e01b0", - "9be3278b79054d258cce41352d7b720183285e09172f03f9ed5e6bf807641ebc", - "4d8f186d6967d26c71e0263934ad5dd5cc3f657d4886871d3b000d78e53958ce", - "29134fa7a1a19a107e26468e26ab881f822814e3be6858804b5bae3d34440ead", - "f52fa4a6672013c2f62b8e0015967ad28ce41955b5894c034ee3e65fb97166b2", - "e0f727927e727daf1e2c30b617a30fbbc79e56ad01ffd9ac48b3eb59c6b76ff5", - "dba5e2645f17a75bc09330f01a29ebd31a6bbf7c61cb08b47b2f01a68f17b914", - "73aeb154f5eab88423fa87f6393c83cbf349b90db62be2b8ed2d85724b0d0eb2", - "c52de784caa8b2a59320f922ec068cfca9bd2d54c867598ba3e764cf7bec7a0e", - "df0c2f999b287fe05bc73258b19aead978c75f1e11d8208f1f3bdda3d6b5b4a7", - "3a9b894e2e76ceef4f303d627ccf0eef8beeb1d6a40ccb7b27685f9f5492362e", - "1dd9673638aa68a15f7218a8117e78a1756911017d764001f7517bff74173038", - "f64be5c6a8dfe1546c793027be496c812086395f094df3c6eff8074ef2ab73fc", - "8c00c891b4554c7fe85e75a5b6f3bfdb6191d8b9120fe7bf01e203c173165d7e", - "c29024506c5abcfb8c92065822fd3ec9ea83cf20c9083fe2fa5df4e88a4a1bad", - "1e5b35104509f806925cab31e46395e1dccfc89642a67899462dd08bc435e114", - "09a6f86c87a10191fed78e3816bcb6199b85f57df8330d7bda8663b7f86837f7", - "b76368f63be7d0e876a92322158cef28b5537dbebf57cca51bb37ecdb2c7c2af", - "810082ca906f943f4363ca5ce956f2ccf83ba38ad5352c6d91d91ac0f66c1ca4", - "6d6f92e43b8109637c4809441ea6ed6ff23a99908b0f4be0adb690d63468424f", - "b9f953c6ccda763cbb1758f73a12dcc57bdae6d0aaa20eb9c494b3b82a8f53f7", - "b45f76a8cff06eca7b6a5879efdd8afa3dcc6a3da1557c6172e5aa55f59f79cc", - "ac4b974621ac152a641d3024dcf83f13f0ddc09075fd0e7e2f875c44e3267bca", - "b9dabc482d40e6362e32c588e345722a2c81a5adb01a5e211db1877bb43df09f", - "ba64f42543bfc5fcaf67d4d6d53dc9c14b9a2211eff3e3fcdb8e79f9aa6c8947", - "f3782116cfbc35957763a2beac32ea2b3e93f392fbb42c4476d26b3897adb9ef", - "0972ecb753cb5875a33340f0951e957fe2dae0819ff153bef98f6fb772e0385a", - "963c028627ece935c384efe9022ed0b75e7e0cfbd91287c798a7179ddcca5d27", - "0b286471f14597757a4c0ecae1afaec285e08d450deb4fa28625221b2444232f", - "d00909da141990e3386073ce7ab062573909b7aac6547944bef63b07b093c013", - "2273322684ca9bef9ac5a33631a5cb4c6cf74cd932195b4639dfd44956413e52", - "3691faaa0f8b47d8023b20a39331a5c1493f21ba3cd69a89250429bef061bab0", - "a580c07b6ebcaa240ccf83c5394085fceca2dc319c0e53a4446869f0c80d6cdf", - "df63c37d0d1446ffbb0f4727f3d382355111c135b25200ed753be69b4726c0f6", - "4c4ad14873e2b917602639f85b7ec9e06b0491cdc4dd31e78b298b1473cd6687", - "ce33977b0bc9a95ea6560bac012a1cbf0cb2203bc3bf9493c04ccd04c122b064", - "a835d4d096bad592069379b0af064d5ab281530de9b818d44e4b3d871842eb9e", - "70d2a409a8deab7f0c0d49e12612a4e39f752aae1552e7ebca5bc23540efd3bb", - "b8dd73a6f319eb43712d3d5f44de2ed81cdff38c4d9a5af42fb5a685d8483066", - "e2cfba1b8d75319dad5a2fbb6f01ebfd5ef772d95f76f06bc8f4d308a21ee2ce", - "1c82a6c7141430e21be345fc7d3b6e4341327a820589d25cb3478f7a3897a3d9", - "838462bf17191403929466ba119b3f1c736934fc472588823f56b1d1d55153ab", - "6029f602faf6bc13403bf572c4c830864b46402a763ce5fb990c7a0cedc7360e", - "9cd189481ca64e8c266e25cc7ab84585451a5852ed22ec87d26b123abe1a8c3f", - "4803612deec605ae192b0cb70a2b8b8d4325e839c984a2c41a69224972a3146b", - "ee8e072ecbfe7572060f6e58f29be4e9d171e162fc5120eef7b956a3c433d006", - "6b595e88be80cfd50f54011947a6106351670252f11612b427cd7bc735a8d320", - "fff2e78c39751509bd100c3624fdf56ef3d2f5a82e3d0e4bd35ad9467ba271cf", - "d01c44a118555f7a3b21491d8e6af0682bd42ed9d8b3fcfe2899f11ce59493c8", - "e655fedc898ee01146ddbb2ac7481bbe64a8cf52a0302f6665b4d118604115ae", - "80705cb8e1eb6d4d9936e8325023b37ade634591826a888ffb8ae94b59a24224", - "0ab4f9b2ffa982470c1821f9711513227cc8fedac0a7f2f127e9a6ddd5b50536", - "f3167d529b254bb7723086c3f7759012839f31594160e53f7f51ba8a95672f9a", - "d46158b6a634cbd2a3ef674a0b3ba81cadc169e03a95b538e3aa3b05e82ae430", - "e173044c1f9eeea928413612d699f0092466d9d36b6be803b8f829a78733dca2", - "41345ea25bb1384434621f3096f4a94a3d44c1c8dd248b384bdcd39c969b340d", - "61a727b8c97534a322f2863f5f922b526a08026b17b3e204833d0b62260de4cf", - "ae217a0cf81f6239790b4552db31d98e1e39782ad90f1c55fb6a2572b8815a52", - "493797281ee494feda0c368597a1d8c98fff62f9291dfe78fcd763700463836c", - "64678f8a62f1f69f9691f64b87109e0bf6c60894a8a56d9445662077de123887", - "108043119ad4d5e8179f6862db1c1f36a964f025070699eb663589bd3e7684a4", - "eaaad8eb636035e5c2c7bf47c3ce6e22ecc0f5a9fab55e523c125d9ce944bf7f", - "724525ca21d19d6b40d4fad891fcbc8acf6c9b4eb44749c75cb33a1628339acd", - "cd8ed3e9ed00d35bed8d2417e4f99c59a44651dc73513243ae87dd8b62bd0704", - "ef72539ad9e70926f6c0909559696e3423a8f2e8e98d11e0ddfd956b99f82ecd", - "65dbd600b5f31171fe795ea5beeb97cf66ab6249bb20010abd3005a1346950f0", - "ae301ad4a3a13b69b81efee1fd3c88f884f73d93eca56b5c1c17786d1f1b8090", - "dbc6c09200cd9044901a6f93da5d00b00e25ab3f30f2ef3506a2f88f2f976700", - "704f6deb3ee4a8896da08f34d9c3d30fbc30a3dc1791f8b2f50577a8ac83d758", - "4ae717e7cdfe85a36bf405fb20f949086caed1c9855c8313aa9946f6aa57c08c", - "9171ebb1bc95ef70b2bc870b660d7a8be4f9202e1f742714830b6f8274c6fc2c", - "418724d6e9352f0635f3fdc2c0193ff47d5b8833e05dd6e32b0caa9d2430de61", - "30251821eda85ce5aa967cc2c9b867b9c2022bc3429523abe8ed77118aad6d9a", - "a7fc7d6083783c8129a077ed3bf8b248a2a89010870c3126c46d9efc28172f93", - "f8683b7b3c685d5e3feeaf01ccb41547564010272aea9927e243bd352551c653", - "b382c68d7780a46ae64525809951c2a78efe94336b21914417be6115bb000828", - "723629028f88054d1acf95492f7bc375d2e5ddf7bd2817dc3dc137a29c3a10a9", - "27425ee624a704564b48b6a26654344e25557d49f109fefbb01ce24742b1f65e", - "93968ef9974c9b3836f21d1e7b3c8845f06360beff6eca4f0f7d5e515014f922", - "c537dd2c9a2cab9e7f3ff86bb09b63df115d2a0e2a8728c1302209673ba23585", - "bebc31ccf4e1438d59cff90556d6b842438cc868635524fd33881121b056a29c", - "d0db4ba9e3eba4e6bfea6150a292509ca134cd9b5c8367dcb52ae9124c6e94bc", - "795ab30bbb6fdbf9b58910c427e8ce226027fc30bd86164e8b626879f17dff0e", - "dfea1788de5754d470e625a141fb0d520807cca48d8d363d28055474617c7ee6", - "6a025482c24c64d3a4170e6925694a664a33236379ae37afb9b38c07f96942ea", - "0ebd0aa68d22bf1469c1c9fbdb15078e5da5e4a1428ead920dc794dab931385d", - "d9f5e9c95523c47ac76e801aa6fc73bba7066538972dca9958f5496df1c2a779", - "ca3bbb40c8ba137e470c00633900f04e000edccc72a5216734ab8ebf3292eedc", - "55c5327947aae932d89f31499630ebfc9353d8ac8ee2126a677a0c4f6e6c7231", - "fcb094f15ede60a02d0e6e3edce0b4187ed67318d2ff158026f8dad83aa19854", - "99afb9d1f57f231d9dab1dcf6e62a67c4445a3b807c43b53e0e19d83e0337715", - "4c9c1188f9f70c0d32778a3b2b19b5983104e82e109c617ed849cdd25871f011", - "aade7af41a8e20aed7a5ef9e3a26f0ef5c84086db28b0049380eaeed7274b89c", - "56510c67ab9168b68cfa09b499b4a21207c72ac83ba2d9a6a84888b3744c981b", - "ff7b042b50716043f6d92144405a8cf6467d5ed306f75d3f03897845671f6715", - "5376e5c661d981dceb1b17f9963aa3ef8f63af30a1b74e88c67c3eb0890b4c11", - "a3c8426e033a405ad5ba1c64697563a86dc885f3498c97ddf8c482aab56228f5", - "2734768c531dd0a49180a7413f9f677bbc9068b3cb41cdfb5bf02365b78293c4", - "2054156223fbeba9f371e216d3a96ee5c124e325429d7f22151636381d4cd576", - "0eb3f7d3a5a3cc6ee54ea5a47ababa372bb5dce8a215c8923dc7e014b143c7f7", - "3421a0e3dde007bf103c91fb08fa06e58d352dd23853e5c4210481773752c424", - "dd3ef128b7ef23a82a60ef6b55a5f5c23042ea9421d166905403d24010608389", - "54d7c690aa82b246496ecae6cd2fd5d3662bf619dc26f6c0f3e49cbe15f5406d", - "897f2c5ad83da12619130a2783c09f9851834f2b6dd495116323b617b3dd1219", - "16b168ad4b602bcee99384dbbe6c574dc8ca9a52808745ece558e3cc5754d07c", - "62c1e194bb00ace27ebb507776cc77276c14e9fac82baf07ff548fd62ba27d39", - "e06d194a4f1dc835bf1978a42e3a44a16acc8088af074472934ed79bb85fefed", - "ebb040b2e377871e15a7ad390d00f7ca52d7c7185b31e41b0625607c0aa49c7c", - "07476c3b966be7bf5e237a7f8b215d3e6b8461d4394fdd7fba8d9a019f5eab6f", - "97e39a4824d3125b77d5951bc91c9386434579d6baeb38644c46073d64de50dd", - "22d65722ae5d8ce5777bb1b59f1d2686c4f91e2a0a1f0228dc77810a6669dbd9", - "71a9f319274a6dfdca878971f32a95207bc0fe5a43638a4c25994ce11bdcbd97", - "fa82534a30526f4ae1cc67e88e3ed684cf3c00e4b965dda6b7e3fe18998bd17d", - "591d4bf4b795abc6bb9ad17a064efb27d5612106f0e980705030caa8865f8ce4", - "3d4ce86b2944169c117a62b4be2726736ad9d57962b51ad5d6b977620d4017d6", - "51cba91217fc5bbcf8d170e95494ccce9a18452b99feabfe12314fa5b43da795", - "b41e51940faf7dfb21225a4069f2574229de8f98a8c5c498d9c8949fcc8589b1", - "4afc8802c272250d1aadb35af4bd007ab7e93348466965defc281a801b151844", - "1e3444ec5267623d28269a071bbc5e368b4b5f3c2c9250f68b2f4bdce8eb71ed", - "68c86c5dd7f04fa6a674cfa0b71074df82e1c4c3ff45f39e223bd19cf3efabef", - "8d664c6383d57176fa60a65a0ce92825cbcaeac3eff11f9dd19e0eb318d314a2", - "81a8aad98a0d41169865d23da9f01a6410999cfdd3715da58ace3567aa24ce35", - "b208d7824d606100ea9222451e874576a33aa30f348b8183c5cf7e20797d3093", - "f211a5ce744a87c4ef3b04f8f380080a37ff7f035c08c0dcc87dd22bf0009962", - "a7d31946990966def328b3c7bff21655787d1961511a709f835de965163bbbe0", - "3d44a93cf266c51b4588550e744486ba9a82f4fc3ea4ed03c73e00ffa4519889", - "c98edc46694fa9ec5031de2e69dc0ecd7a96eff3b0368ac996bf2b67bed0fe82", - "5c3782451e26ee394795a3c82853acf54db2b550538fdf3034afa6cb6660aa81", - "f7ff565138a9ca44953e822a8a6ade37bd706ccc14e416ae09c22514f019646d", - "110bb419a4b8d6e98b0dfba6d15521789f68e4c4c32c92d171362d95d7282fa1", - "4be84a3d7898dc9866c5f06a415fc5ca3bfd27143bdcc0922022276e0d03ec48", - "46aed26a36bb74197d70dc5d03b8cb8761268ed6dfdc170abbf5dc4a13e8055d", - "6ed1b7aba4c6abf8418564e8250ce6dc3cae1be9c72d11abf77a815a30fbb651", - "cd3b2f6b8ac1ac6edf3d13f68cb495a85b4c0926a7456967edc288818b40a1ff", - "3cfb977442b3888af9f025d415b6305c972812f4eb86708ce37c59fa14f71e83", - "853b4293871d5e41fc668863e5c6a618fe494e2e18fed86399237236b6743407", - "434932aaad741fed8e776ccf194e346e01383d45a00a7e70d24c5480b19c5b8b", - "dac7798c15c6a7494a3a9a23ec55e7345f2843f0b93128ffb0d6788aa9908d9c", - "2518d545565836865a157f2a22dea23791f53e91d4eeeae6f837180c33257dce", - "c5441528a7073aaa3d28c543a2af3b4f1559030383299ec160026521fa781e41", - "780f3fbf28a3cc4fbc54877e10d9c85c971baa7e139702ab655c2d24d7241008", - "469723a4ea2b8d86e6148deba8ea721e1c1a3c2fc20d703fa751a97a2e42ceee", - "1af9e2f4289ad8d7a891f216acf70a972a147ce7048a4d669a12664700f627e7", - "675a042f676da7289459698fa69bb05a0219a77900754a39a34ed24828a1696b", - "82dda68099cd8cc3b30fd599939a54a3377022956028fa8e384cb630c82542e0", - "65fa22c63469457fc941468b8c1941a12522c586e30822e2c7156743383d82c9", - "21a8ee15d015da643567690bde5addd89858094c08f2dee5fadd6804178e0d64", - "7bd8043b45a235ea0f0f951580cf8f953b59f198dab62bfed770749702fc4d4c", - "fe37e8bc840180bd0e25cd8c564f16b2aff218abc4924253cd5698f7ab90677c", - "9fa40d12922eb97fe67f4eb8073eda2c4520aef1cc7944eb40ef0d34d5ceeed7", - "f1ce69e928d263fbf9884334374f0315f643d268292d87c2eac0d8c3fff15c24", - "173e6874eab2afdb4703de96f8220c84d444b58eaf11758625e782c61d55bb7e", - "9fe14d546ba3ce135945e5b7cd41f2dce67d69ab23369b49683e32bf8cd1d7bc", - "ce0782ebb11b6c426d9e38e6b30ad50b47b36fe8b48d27bde686ff314aa38bcb", - "3c1381133b4d907263b12f4aa2c8979bd3f6d20e8532de7cc7fc92c9db49e570", - "4fc7e39e96674da53793d1c3bc4d777b05b09f350e7f83fcce6b56acfacb0280", - "8ef2c4a7fa5a03380d5affae9569ce11c80de5cc71bc7cf53f36fcb90f98ef0f", - "ab11ec60e8eec98291ddf311a0e8af089f30c7291d2e1f4c0da71a19e2cc1d13", - "2bd9e8b6fd79c873275b19c6b3690be2922b8b8f7670e5a7561fd00657c40499", - "2f52cc552abc0bf3dd7f609be850ec5798dbc926a76668aec9721a3637f6c49c", - "e9eb58803c84401df33bb2eee59f0366159326881ce123c7b73f60e16e2c6d9a", - "6c7716f83f292c2c784c62383edf519420466d42185c806c54651fdf541fb136", - "44b9f42dcca0745e9436c78b583c3d5ac585b119bdeb017d66a4feb98b887bec", - "8a7a37c8adcf4f56dd9afdbee6ef6aa56108de614f1f6bb03964008a6c00b174", - "1069c2094515ba98634dca2f67f13b234488da7b353ed005a82e4e0346a0cf2d", - "71fe81225274f8bde295120e4fef8a906d2fc9b3aa03e9eeacbfe167bd8f9019", - "aacc4ddf8fb521ac331beb6b3ced8f7bf92f6dcb0da4496d764a11b85328a5c4", - "cce92613d4e349d82437521da35f46b16c88a64296410b84e9faf86859c99819", - "b55537213d7f3ec120d0f0ac82062b2c81273db351a756c629c17fc16deb6d8c", - "b34722d1e40b62904ad86c236d47a26c88aef00e3ffdc93cb2c15a7a9b22fc4a", - "5851f5f811c49614ae19b62ff87f5e32c9eea66535e760dcf2ff28d4ebdd1e8b", - "5d0edd9e768318eeaf549938345d8e4e382e934bb3319d49be85d38c240bfccf", - "f89695421e64d130ce859011bcd25a716f35dfc3f6c37221e7d85e98d5e0b9fa", - "c54e946b3c1ea0f5c07bd30663c0d79b9c3963d1756e2e271e3d9ccd22e81442", - "ea09c0a53ac92312e688772dfc3c955a3fbe32ea094bed2d8cbdef6abca725d7", - "2529abab13b7dc8fdea55e1857d1f28003feac141e739179d852e363370ce407", - "697d6a86acb9da86db43abe61adc5af392b84aedd0fef970bd44fc5543134c96", - "3f258b63470f074df46e82518c040e21529bb1347368a4cbbb0e2117955c7359", - "57a03cecf9b848cf14e9fc04f3d4dc42096e43e186f48dbe499f259f8020bfd9", - "7e5c759268183bccef3ff5533f75081fdf408667fcb39167de989b5d50ee7d4c", - "76d48e8dfa3620659a0b490d1c96f2d92be56a90cb8f87d0365487dc480cb1eb", - "9b4a611dea2cf12cf7144310f805444178212e1107595489b1019019a5d964af", - "4ff239269fa9da6c2b7fb7ebf760d0760fa664b51cfa37112d4343de56ac9b90", - "73d3404a46c8acc16005312b3979a5adcae807f15d64f8c1cb71ecdc4c1a2d3f", - "dcf4a59f25fb18a3701c6f6f88fc68bef92df5c0d2bca122a9e447a9727ec2ae", - "98b6f74f6718892fb49c85063bd2e4840d405bbdeaeee9767795e981e895f37e", - "31a08af04ba010634c1d6d1c134cd1f2cf06917565866fb69982051106cae2ce", - "03c08eeb57fa279e96c8868db2cb4e76653f9bc31fc803ecd19fc8300f8acd21", - "9daf63d9179ca97ce2d46fe45976bc9e1217f057fca8267faf67e91e6d8e6a84", - "49c0a3cba16bc855582ba3c8325038f3a43e0b5179cfc3be16342d7eb047a2ac", - "7f1b963fcfa93f272e8629ef8754c784c5cb2340c6a59b997c67183530d08ede", - "11b46cb62d1d5695cf6f33ad2822a3f4be590d84508bfe6d395221e9c8246167", - "b3ad9ae87bf1c045c56ec39058179707665047e54d6e6193387153eb0b0ccd8d", - "b288d8d0c94bfa6e73d502ed456a8938a5320440b815e0689884cc2b447aff24", - "dc4ac209e1094d25eeea8b8880acd8f20f119eca9b955476967f25fd3e0de2d6", - "37e4789ac511fb36446e4265fc010fc6b2ba2c4e79095ffd5465ea87cd5b359d", - "5906b4e612e7cbc63415b053110c179c0228691bcfc02d8ed06a7925ebd12279", - "1e4710129edffd4a00edce3fd9b95736f4548e152cf4affd62e4dda1bf14ea2b", - "9d49c65c0fff70487e1556f97dfed92665a47db697ccc78d6379add2c8e5655b", - "2e4b6e2bb8e7617349796b9c25838774a93e4cf363c814915b608110094d6d6d", - "697ea63e2908e2a3e54b5da7e86b56927628b744ce6af90382b36e46c77fb6e0", - "4f39ffcb5059097cc0fdbe5399b7c73bba683a389f95caac7057b40a426743f7", - "a716bf8d0a35283e7ea5fc57fbb508257b8e60786bbd5eed3022ba8587badc14", - "a633f55a979b9c360a946e6da6692b6b226ad95f1fd3d2c79126c0f55e3e9aa0", - "db17e5ce128b88aca3782defe2db905873384cf3959e94903cb6a4e42a672d01", - "8c779ed23940ae4230b31d1d600f2c2a864eb79e49bb7f827bd6bff4aebe0b89", - "09057367a4521fab1e6a71e7745815282ca75246a4b334ca1a6feba51115a71a", - "7620e1fc2569e1b6fbabed41470aeb87dcda94889eae7480e2f61f5ba2e95652", - "abb3ada759ae9db08fbf3b7dcadeb773e39e1ba57133b8d54c8fea29003046d5", - "8db1aaeee04f94ec19d2a36515135760539ebe1f0b80de97fd68c365da727e2e", - "b4c880960a0b53e1b2c769de82dd9f6989a185bb679c2eb8e37a458afdde7221", - "dc3752e7de38e0c297643d6cb39133b552f06847eea33f81e476c1cc47a05741", - "60396204944b2ba2ce05cb11fecf169a9e968cb11ebbab1f58e6ccf444d6b8ff", - "6aa3f4fb3bc611ed250bc4906df4a62476457b167bd6e77b4abab5ab7ee19044", - "0a98ffb05cab1d72b6fd006c937a8c74b6042b5e1a92303894fa604e725cd5f5", - "2156539c202c3178eefa01462b0141e680b2485f97ad145db1eda5192a6b5cc3", - "d2c21d67a4657211b974107db258effd03661109723667321ae763e86d6fd3c9", - "7689ca5c159fc686138664b71f43cb75105dff8dfd160bad55daa58f58a87b76", - "66f9dcc54d780d0d38c8d766fbf3f7211b98e472c63b02fdc2ccf8ba252d1ab3", - "7303162600f0e4d163e25d186be0cfdfcd97b204348682a2c010c8fc81525d51", - "b342f6c0f07f8191734c268bacefc9eb4eb5242f93faaaed510c0fcd610a288d", - "0a3ae835e33c260a436f3dc6c9a4066fd8deadfd3a86af346de7a44a47e530f0", - "362108c1b6f87697c7267592c5cf5cd0c99b407cfc131f8e885197a297a02604", - "17dcbcc8918d7854e980ea92b62f56b9c4b86e4777e8ecef706004ed3efd516d", - "94312ffb19fd537c5fbdd68ed85d5e5106655d6b17eab3e4945902bf6669f3c5", - "fe810318af8f50dab308211310d6d1fb52ed7ee52e41396b9de977519e009ece", - "10e34b0be9146d9a929c198e68d803b8408bc817361e1517ae265757880ab28a", - "0aaf4cf96e817981f71f033336388b2b594454e0bb019c380f66abfd0f952933", - "46ecca0cbd3893a4b4661553b760b14dc2e211d58c6a9545b561aacf658a2991", - "2fcfa8c747ad79945abc0164bea3b000f24d0295fab19d2b4a42bbc7d16b06a3", - "f96ae0007419b8428271d941ad197b0947b996b114729299326e58cce9a6264b", - "79457f051aecb8accbc2b62e390a345e78768e27b723d043e9e178e2dcc8cef1", - "d53448aed9032ae9701123c12dd714d3c88ece661833ab0cf9215be5adc12d24", - "3a44f6e0766cbfa9e6f572653a2fbd303f130015643c8d349ec7b2a7911b018c", - "e9b4511f9045d5a8c56b393c71e4e599162f2985dd16eae239d4d061803c165a", - "3f64a181849c5ffb70e979d3d7a5afe76ddaccd4367d734e25cab9beece7d959", - "71f13ec3bd4e0f8987d65407094d9b15bd1c79d16deb8ff5ea46d72cb508c969", - "e471b0fe19e9363fe681db2f2bf967615b8058a34586defbd169b00c6ec4219c", - "0387be646e12ea86ed121e84347b6c3bcdb44b24635c242c74aabf45e41db0e0", - "813c542801b873938ad2187758e8c1abdc00b34d04d2a6a560962c66b96871c8", - "ab4338703cb16331b683581546c89e147bdf702b5800779410f27363334e2b06", - "b8b72be86b236625703c0d32e782d7cb67f6ad30dda8d36545ee4f6b7c3ca45c", - "276fe1cd5808bb15a29da45ceb08077d047b929b51adcd71e36b5515ef362b7a", - "9f2e55c14cf0cfc5cc9c254d69e427c3d3a26a1e34c5a7771ca69206a59f052a", - "5a9ab210f74d150d56b623aff96524ce4242d77cd21680aa210d45306c3964ce", - "1db89b6e1b83d1a1fb0c0692e37e29c2c3c3e2ad0c217b3329cd71385489db51", - "61faf49ca0698fde60dbfd557adbde25eccaedcb9f76c7ea224036086ad466aa", - "e8eccd1f6fa1678b81e7c40bba535c7cf41eb2ba5db5f09a2814390d8e51f958", - "4124a6b9b5da4541c2282456c0aa9f291e3bd71616c9e6f155cb1ae6ad0c14e6", - "d6f655faf68ba54228a99e457bdf5978d0098f30b9f23c156a16850f192ae26a", - "f9ceef9e9f9badfe79ea6262d21b2268c42e73acda75d6446b76fc95f54d7e87", - "3d1a06168e450c76ab0b8a931e6cebf87e33694e9041cc4ced884f816de4bae9", - "31847480fba7626d247b5dd9fb7887f885961e24a1c2b0ae71e0725564c416ce", - "e205ba174a1dd227de677ab9652e884fe4f11b9b5c35aaa304375c141638a675", - "6a5b1c7b69965328c09ce45d7ba2b05aeda2c5ac1673d9708f64c8c748900359", - "77dfa29e4b4c8a201a7ed06d9192347352debb5bf5324711e2fe101a1eff88b9", - "7e6f188ee6a59339b2aed126b8186ba27471b58a2c89750e1e7bd8d49820b259", - "5ae5d66ee3822ec67b068a733dfeae4a3b38146087bb599e1121d9421768a13a", - "f563da24c836822995af994601500b1ddaa3c25e1096f07757b3e86a92672ec5", - "d775483d4318f9cf59f83ecb76fd15c2f766a41d3fae1c39d1adcb92d6928a36", - "ad7c7d6878c9e04663228751b05a2ae28f99367dd542cd4400f3eb57887ca34e", - "ec967c100d179ea8a5b167bfd07f567adc9e000df716d366c0d2abe246a04431", - "0e56e8dca35849b35ce940c10b11e751a217511fa82dc41d9d9c1ced1e9aa835", - "984192038887f047497cd9b2a55cc30a37a70ee797d3f4dcb10ea024e470c3e7", - "d5ce73a46c63478eb64b26b66277e071ecee0dbcd3773a0ec04fa9ead5403d52", - "b0c7173b2835cab4ce060233de61c5f6fe4a6a9922cb2bcc3bca435e07de8e72", - "13ba0417a7101a8611a8bb428b0a729c068789bc524e95c2054009af79d4e5b7", - "153927e984f5888dc47a5ee1c0189888e9fc0c3e658c2f491db9e92621bb5986", - "9afb9d1566763488b11d701f02faba5ba36374afd78796d49f1a4e596edbadd2", - "6ff10a43eeb53d70306aba9ff1a0677c0f4717fee0a921386bff1fb3ee4a24bc", - "8b820099f9fa9460f566ff37b5514fcf1d7005286727479d26cc751db6c9975b", - "83634346af14df45546605a21a1a07ce5633259e8765773f0a3e44a48940302d", - "34c9f1158cc79e9c556bf28613136b87d27d90b5e151628dd734512e2076612b", - "2193ff2197e5115707747d5de67e98f11567c6a9bff30670694c2565b28ade32", - "7ba766f111f43fcee2c0952ba699fe8f7623b089a7a08c5d0799c6efa3080757", - "d980bf70ecbe20ee99867831f96ca6ff97bbb19d381d61809b53641888739b5d", - "c63b55fbd4e43449b54e3d04a3aabfe04fc77f2583c69e45bf8bc44986e3dbdf", - "36e3ee335bad7f587314b2a931e22f3a34c93929b3761b49bb0d6d3d79809a9c", - "251fd09c67c4e929e9032a60259f51bf4dc9713eca26aee0fadbee3d22db9be0", - "8ceecbded1c3ec48f2fcdb2010ef062a2f258b727ed94f981fbe449ef20c6dbb", - "288958b05485219545cc57885aeef11448a77581d22d17bc08c0080e4010de2a", - "69c4f3d5162c9190e72c2be46ca8e341d2fa9e2d3cc09ef5eaef88acaa76d33d", - "19d2971b9fc5b68c9f91141e1166c8fe51bcb3042236341c0a33cd0b76887e1f", - "0a4001df179cb3e72be096de6278a756c285313e29d12a5a0558a8e08545b655", - "23ba69a97f4adb91193d85770b39b022513360c69616eddbb73874a2771007c3", - "407bdf70dfb34d3ae094327b1eaea97e5d4fa3075f26206e5aac9e86d0741329", - "68653d3fedfa92211a559bcbceb5f1cedbbc1671bdf1057014c332f9ecbe73ff", - "36387fa666d284f0bee92caf0ce8760620e4fc29414af56e82f693b0a01505d8", - "c91a08027c0e331427862295ebb02e8bffd6d06a4026ec8f42ad1d758978249b", - "c8debdd0de206f4523f292be791b22430bd324723082f1e275cccb72a310848d", - "6b211035a4f2ecaf23b260b99df87baa7e93f397ca48742395da0756ef2c37a9", - "0d396259db2c40a32007b7f2e4a04cc9be0d52d99202a6eda6b97e215f83e8f3", - "e67464006cc7f6084d834da7f5fd98b4346cbc0b33a2d86950ca05022749856d", - "3e8d134dd85f994885550818e991ef555c08d0a5ece9426445c6851cf58fe992", - "3f5b0a0c51045a5078fd954a48012574543861690ad254234b40776f97ac96bf", - "59b64c5ece28c435c6c41dcc39cf36288897f47bc73ef15c67eac292f5f1c107", - "379e2a0550032740130073c4e9e1360d089c2ecfbc10576b878916d3a3a271a3", - "82b7454d60081d7b1aaa0d28848ff162895f5221f45e872c94a93ffb624a5cab", - "c36a10a310f13257c1ff236bc739611a636f8c1e98bd021481bffeb0a574c369", - "882cc2105e196334d302112022d95ae632fbed9a830f4b437033441ef737765a", - "b36def8df415b0c0f8401950fc2245ef2c168db8db510b9e0f339e86d30a3d00", - "2e48e5dc75be44f588f94d63fc8926e08e4194e21fb0a2dac6339ace5eda6dd6", - "e62b90c1705605ebf124ff765a6e879367a3ff919d9923034f3ffd7cf1c0fc55", - "bd09f437af341c980afa0c2d0b59adb9b763109d8e1555843be562690e2cb6dd", - "04ab1c5641aaadefc1712310e206fbe4f480bce502eb1905a2ae1f0349e0c801", - "8fce687227fb266aecac233c86895ae0988d51859f440488f44f0d0e05949f79", - "6255a208f9d74ce7d2ad561dc74d6995e286db4f7a544d066c8723c7c0551806", - "4f5b2e3f359b35e90b1a3991f567ad44f2081275f00840f813e46373f0bf664f", - "05ebd1ff65eb3454e0efec41aae1db1b87cf41657378a5c11e9002cd3a84b961", - "cfc4f38cfc07642c08f3c6c3507225315db0b44ca6085c6c36229645734e4482", - "3441744d70501262c14f0dd6c99f1005095e08808e604624b038caf6cd763204", - "5ca5eaa53e798b1fd5b9289deae30cf7d4d3613de2851b090c72cf6272e99ba1", - "02f1ef63575834af1a985d4657969734ed594eac54ae44f1e1d7e79a690f3d4c", - "b24204924b63bcb28b24bfc451aef0bde2fea3df49d27b83fc997ae85fd2fab3", - "608550494647afed159f9e094138f90b2cc28c6b550af621c08fe8a321a49a3d", - "4c2f7ba6ddff39c8b0c99ec1fd0ffc95251fb4d10d9b937cc1c4a47b3a68c394", - "077a4cc356fad99d9924c88552aa9aa8fa36f63edd509c901c7f4847dd7ec8e5", - "19de98e1ac60e5cad9c43da5ab7c52a0a1cb181a54544a520836b8dae0f7e9b0", - "800eb0deafb4c9e1dea70a0274a45d755120b7172e4bf02b357ba6b3056a225f", - "b9d611af8cd7229e0ae9cf2228cf6951f20dc1468c579baf6e0e12110a1f5d2a", - "f22f1f30c4837364eb2817553b8e6d5efc664b7c1ffd97dc13e0d71f0c323eab", - "5eb63b987b18a0a25da452e13b95e0dd5a8ccc1cb2d122e1e8a37435737d8496", - "6b4e37af5a98a930d3e78e9d52369b1198ea9bf3eaecfa8ba14bcd4f41ccc97a", - "a4235cdb18fa4803b07ab15ec00659ea4fb1ce5af18c0342b1879c3640dba45e", - "c575850e5f94b4547335c2812aed51842bdde40a9032154ee04bbcd76b118f83", - "408807d62f5bd7d1722839d5551e889f2fe7d3787ea31b8887691b10f5dc6a19", - "13f7fbbf5607b5d53e0574efb389a26d5c3c4683da25208aa50da3cf5f9bdf37", - "cb242d6c38eab817c5f416083a931224128b20825bf0c443f800afc027100ffa", - "50184c64a6287e1d28f344d86b4b01146e88219ff5d9c560e63df7b6d4d87fd2", - "39b92e264143701d945761c26d5d4e443fa47ee07a079894559dd51b91a5b701", - "8a2eb10eed22aa085c7d319a7791f34758789eff71af9d9829570da9dbed2de2", - "2420747f0f63a33d0a353f27c45d57ea18f5ec79e231e3fd98fe217666020168", - "2978a86ca65fdada1ed31ee841d6c969d1cdba9d452c0825b2281f6c6a404cd0", - "4ab59343fa46f2639681b2c40a37ccb60fc44304537150bda2c8f1aceeec7c25", - "c95de4728024fd8a6370de87f9932c48a1db18b81e9852537b18a265f585ad00", - "e19141fec5b4eb22625b0734f3dac32ddf0382fa3c28bbd1c8a477efb0f5c603", - "7b512cded393935d5c030fe66c57d6ad51728b9ce59a0068259bdc8dbf1c2ab6", - "264a9d697307d048a1589531701169a2afb0cbc632ad0770bf3e2872bc668b8b", - "8897c0795a23e60bad770f00c8b8d630f2fccf53e706dbb25c92da2a25f2e7e2", - "df8c57f4a53a1c0c0a3a2becf078eea7a8896b3fcf028db8f31f8f901febebf4", - "a58edc430d7ccade1cd143423e26afd460ad8face7f09bccf9c57986e9412ab8", - "d6961e4fa95a4e452454747fc7de200c0b7efeb1318f858e10c56384dbdef7dc", - "9095056fbfea84db6f45b140ded044a3c5c319fea214818e50582001761f6042", - "5702fafecef1da9e6f54bb1bd2bb5e01337318482b8779b1f419b48b9007e4a7", - "9b17731080f405d7389a7f09dfd4de22db3674c481841ce35937cb169cceee67", - "205a87b47564e821065302f53fa18f3fbe7073f18e7bfac45e6297747b53db04", - "a6aa1ab3b5f49f878e5d7e3afd30e2d2ee9f5d7653551267ec4b7d6c46288bed", - "5b0e84388f7e4aa6403cb846277e9a0085f756a9df1887b8931a933eb3200f34", - "70524fd9a4dc486ab93918e2f5c7ac36cc3eb05978eb28968eaeb048fb8573f8", - "d26912b3a220fc46024a1faa5d9e42113c123667da7c2bf1c141c78046c918c9", - "b361a2b86b8a4dac7acda3af11a2b05e6a81aae4902c830aa64f2a05bf60577c", - "70a151b16924ee6c6a813da1f995012b9d3a5a2e8bacc00a1c510c8f04a694d9", - "e67302d1f873c9d161d521a79cd7022619b1565bd4c0b8e02e02cdf3538c5a80", - "f6014a1658250623ba3838466887a2eabd5cbde7ce212d018848c35e8d12e7a1", - "83dd0266f4e47c7c831a3f983bda950cc14331d91adc28f382f05ec9da324b2c", - "64b68e74270f255260631c39f868d30bc54e2f62d15d8705279c9681f3a6fe5f", - "3ab539b35d3bcf1d680ed28c462a23bdc20aa5544e6b4dbcdc0fbc4223b5b781", - "d84805de3d38b8714d336cc902160930a4e48ab74e07cd0547ac9188c92d2b5a", - "a1a637c5901d8710f4296e531ffbcbbff61f7d82574fbca1d2a4e8c654dc786e", - "3a112e9bf5f4b376ae999ca8108997f62b631e1f76c28ff4d5712b40c30f2cd3", - "e7f7e6b20b4b9cec7b63b5aa6b21c30487e0078e824bf40204dae5b08b79b18e", - "97a81154afed5ce637b368e030bae580655e4c1af5796bf86b85af9fde2dea5d", - "2e38c1803a6fa17272d534b695bcbbf332b521075ff06b378b8d66576f184ed8", - "3d4637e88e60b7934858baf559436f94557f0079fd9718ee05688b432e4867f8", - "43ad806168eab935b252f52c664a75247bc7513b52d45035437049dd411e926f", - "4e565a5bf15ec36f7c148d2d13a1cea67becd36d1d1ae1cb57287375c9703543", - "168b3573d37e314675ab081bef0ce4a7486d7aa89587aadc279e1d5fa0450370", - "6cecc48d49ed9c2c744f95b20ade6400ef64ef92fd0a9e64803e64c8a43d866c", - "746b395c792b30912e46e0aa29933c3cf0e20de3afa56b353a2ccbc13c8eed57", - "e74c4557686c912fd5d8e32bcecf0cd8b99886ff5eef87bdce7ad9a58fab8a4d", - "61d50b357cdde107a8539624df378e1ef0af9314a3b07e7b206f8dc4845b2f72", - "ea294b17db0ec7f97ffce5308a3736f46766eb36c6956ca3b98202a3d5085bae", - "480190710630e02668ae75a9275a2fddce512d2541f805cf2aec8096ee96d7cf", - "3c8dd2c5ab9767f83530623ea6b71f5b368bba35f5c405d47629be5623145245", - "69bcf9dde5560d77db986d8ac4cff641b54289e4b6050c8b1ef31012eec8e731", - "7d6937b80f06ce2ae805dd8d28eb91778515a73efe1c84f862233aba1b312734", - "63e713710fe854be83e02d48a13126b71d273eed508292bf772bbbe0335f132a", - "b197f3402958c98adb7832dfaddfc1ceeba2ee035408137d0c0d09c46c293ec5", - "ad374a2c0e459b011f0889c4b2336cc3e0d412b33dc3827b981c8f5080ecd547", - "d33151e3cc06aba2d68daf614224484e602553b675c2e6a39fdb9f05f3df100d", - "b1674608a6362416f26db97ce0437a3ec10ac91da2a1348a90334fa5e57d1561", - "6b928cd6c9dd195375b7e2b7a12c44d0aa0deae637f6983c00c50c928315f2c3", - "440d7a3692e85ed3d8ad3cc2e17f2bf53efd87f2764bf7fdc29861f682089282", - "dbe03f52bdb96dba9e3983e13e24ebb46d5c2738d0bf635397ab498bbc366239", - "275861df40c28f45de7bf18101664451d58b6861e6b04f1bdf7d03dd1d5ae3cf", - "68d776a5cb972f966e71b76974a6c90b2cd7760ca01ac51c6c0be718ca563968", - "63cbd167dc08381be197ba981535741b18372d36ca3ca225fcd1a91384f95c0e", - "b74f353fef21cc077ac31a1b043ebf32b1bf95908994e61919bdac70ef05ad93", - "4b3109bf265b1e903de55d63b9fc7cb3fe40560b34c96f27a2a0562f59825b3f", - "f9a0f5295690e96357b8283abd2bd766f4e1e02771b61418807baa7570a94ce7", - "aaf4ce840bc8de7a3d432e73bf55e89cec7b23c87be54f280a93a8fd51a0f774", - "67e09f151539a93183d512cc10c3ff76cbb48c31f402ae4775a9ba6871ac0988", - "150c3f531a85b1dc196e14ee3c6d0d4205efd91535ca9b24b186e137a8fd78e3", - "e76c3ad3c758739d498055b8ef77176b4e3556c762743d451ad8411ccdf77b61", - "800507ef2e0468684372ffa441bcb04fc61802873f2274c5750b3a3ac0c375ca", - "90efcc5e4cdd7c07d7df7577cfffc814900ead728868772bc6d0f79cb28bbbfa", - "84803bd090e2b7a5305ab0383cbdebd5aadc0a7d269d60d1e4e462a5b08c1fcf", - "3a93b51d5b3e6535d17ee15bcc39fe53753ff418d0858dfe0646e0ef60461284", - "f23ebccc5b5a6c615d33c0769e816d9a12d55728e33d1624d41bd6e5cc231239", - "ae2269d58fb3ff61636b53913e114654f00d066e7004871eeb356e1049713593", - "9b8568659d71af845d53f5b949cf2f1c324caac6fb351c0a3c5c0d453e4817c4", - "35e3eebd99316cd83177d404f5e05ece3651a13207c1c4ac3274c581d3850401", - "8c7409b42545efef10ac21ab7427cc290c442916ae97986507025ce0652db74c", - "cdaba3f488f03248e599f59a3fea87875caeaf40d1966578794b10c858a7fabb", - "5a8131bc227e358dd4070aac4e531548c1e6319e9bc8cfe300b7619021e34c5c", - "1df5c918e3f5ba5978345abe8ec2cf2dc34866913714bc10966f4b0f9e7f8608", - "7748b29f361abd59836d1850702b55ee3e9f1b173e853120571b186f4b47772f", - "92f41ce3b641b26676c8dabbaf8f5e4aa3870d9d79b19e3a60c92f25dca4217f", - "67402a9593176ea6bedc61874bcc9a32e4df6643861a3fb903beb2ecb54c8929", - "267bf9e8bf62e2d6c85abc8aa4e2638cf9f9a686c6b275c6b09347b75e1fc506", - "4bfcd29e08894df93aab3aa7f69d8a6ab9eb9a8c81c446f624b8e1d8ff009644", - "89ec952546fca6a3aa52981df348adabcf24d2b6a1fcede2543e371e734df936", - "de3411d5d094e4081a0d0d0a65d13512216469f22b3ddcfbdc1dd4bd5de52ef0", - "7115acb5af0607f0bc85a0cd18d44f7ac499eef50c95e33deda6de625f66c7ab", - "51333e00b47bce26e761090bbe7b6e3a63bea4c38fcc783ecdbf3eb25060a160", - "0f733396d33c35e53d79b00fb867b4871991ccb4ae948344965e914ab9cb5e6b", - "6ab7fdcad483cbee97355873440a415e1232c4486616c6832e5ca8010b04b2f4", - "e80822c8ce500467e89cbea1433f406fe73a7b25d05915897ee69bc14f2c0d20", - "281a33eec2c54f9020a58b66154d2453a974439629737af356999e1078b6f41b", - "8a43f4db1d446cf06ab1d4b8031e8ff334a994835552a4d800c0198565df77d6", - "1e58a7d016b260cb270b8e34cbb336a7cc73ab3ce905f288a5cf31fbb25c61fc", - "f4ba777a6476945ba44e738e2eb151fadc8b0ae5ea2a607739d57c491d5760ac", - "62d3ac6c05848d00d182dfc6a5fd97288862dd6d8578ff741c7c6472472f24cb", - "32d7c40ac116a64c12b5698a0ab24ec0ce07a432768e4d23005faa5ab5936098", - "2762dbb1c30f27df978c663ddd21787c566a10219fd221b5cbb136b495d5b443", - "e79a7c1ec63f4d63a2cea816fd16c05f7480e91031f10a4ecf5e3a9cb9f91dfb", - "d01a8e32aaa7be66f6fcb285cc5dd845d47cd18c09f20548dd5998fb200b8107", - "c7f256c661339dbcdab384921e7fe8d013855fafae29aa7748179b2999b43188", - "88e401a057bbd6ef3207108e9caee382d13662f9307c17f11856193376427f3a", - "70bfbe215e0c95084aa2e222e6014fc075b286088b8a8c201c4260a6f6ddfdd1", - "13b38ef481e940dbee55613bc98fda0e57830452ee0d916251456e1989eec63b", - "42dc4f6b3a6b6e249c9207831515bb3e03e2507bf24176ef224a47738a03d830", - "22c4a6a5ddf7460163963cc8664a2a96c19dc8cce94528c095d348472324d589", - "a40a57fa702fd9b37ce0430e835eed36fe74a2b43dd84ddf890d9d9042728bde", - "57f9aa08bca0d4cbd44a4352d115497d9509680108f9878487eb922981f52c8f", - "65a47d9e2c97d0e2ce55b5002312f27d0af1bcb1ca83cf450350b5fd83786cf2", - "94696cee3d70385a167a50b17ed2cf50fefe78f6618e95aebdef7ffd6e5e55a3", - "70516f2c00f870f1f9015692f2b7bab07f78af79eccb0161f5b789850dc1266d", - "0c712fd39fb4fe4d62c952d5a36357d0d0ac6f39feb64bb3dbf1ff6c7a2a49ba", - "69f16e93e58fe47e152ce7c2cc313ef6e98c62071872669290eb5fd32a09d7d0", - "51452731e9ec07356ea9ecb4c5b297f5c12485c8ffaee0510dcb3a2053270b88", - "f1cd4b9cf9eaabc0303b06ea12cffdf5ccc53a7c9a2a4bf1d058da87750fc9c6", - "8ad9c17d6239b4a9f9cdfc023d17ce09e92120938081b6f7e6ecda5b86d73030", - "766d22c0216b5f3826f31454d80dc236ab69822d5064437db30f40d272b033e8", - "c32f39ad383edf3d566ee642a136978458667778668eb0eca94ce0b0e3945d0e", - "a0bf626c773118cc340b88765f59dc67c56ee49c92e2b8ce9bb7c3e271ce148d", - "e6eb489c65bfc3ab9bc9c8857800ccb53723ff7594e1df1a7e0034291fe1cdd5", - "9b677fc8273a1f0a55f48684b155d7392eda8e49ddc34cd9cbc222e7d7b29a0e", - "abbf25b5d654592e941e5570ae2741ab7457613e215cabb6e105e556f48df9a1", - "563332a3fbd80e27f3b25cb91536adf9fece49b9cde3214858e849c2d980e629", - "44f9d182bed0d406091f273be62a3adfe327ffcf75a0feaf90b010b907e4b854", - "d23448f6e56d47f7a151dff56262e046f015e9d6db4b435d9294ed95ff838260", - "369d46a21419b329f2e67939539bfce40a7dd85a7347aaa009c94d72c7f777a6", - "3c7823b3805683c8ba7b6d3a068b0aa86e7f5f9dd549816b236bba2a7406d194", - "7da028bf90083fc547f05c1adf9996b860bf1eed948bd2c9f003782924c64c81", - "57ed55e9865a245bc2f77845411d87329f9d87ec0e382ff8287f91814fbc10f7", - "9b1b8a2150a35fcd52f19f084641a040265ed5bd7fd4c63b864cd0903ca288ad", - "7a4523a08ab097cb458f25d2310ba71ff5b2fc3cba800c4b295610d6e755757a", - "32e665dbe3f2741185e52160245e6dc3563d702daf2e628c4fef7d85e7dfe5f7", - "342fa64ec7d7f688fd92dce4324f894d70c0d2add06ace0063a4020c0e49e533", - "d6172ded70a39f5d2d3f579267a182ef32d80a996aa8755aea04a559c9d1b4ce", - "5b8f4f8f35659fc5fdf3d1f39d38b59b075022ed558a4c7320afb0c0f822b3ec", - "c0e426f0fa0ae511ebb972e6c769f6b5feaa398668b484419d5829ec6050cf41", - "5c4e6a2e6f94cb49255e25091c9dd1108aed2740a1c0daece0db14c8f769557f", - "b348869f05ee366cf4742d378176dfca29c1ebb1a6c7793205a1f3ff6b4c3df7", - "5dca531fdfc39ceae4ee2aa49a851a2655bb8543b517923833dd2bf0f845f78e", - "b88f5a0000bce5cc74b40d4b1d7d61cb0b5c26557bf6f0b8dd1dff6017b5ae8b", - "5893050539ab9868fb3c5c1e3d8fadb88d852d97c7434d58f67a13bf2683bb56", - "e816c6a6a336300596869ca61f74b42c35e5f5641b45ef53040af3bc701c1b4c", - "f5649f69ad15146edf2d25243b97ede4df6818ba38bbff5d3f272d39eb433671", - "e495bb9b80fab7c9b369ac641fc9f4103ca76ebcf57d5040f740c01cb81e1ba9", - "192ffb4a501ee202f38a773daf9473f33096b916ade99710165c67de900d6b15", - "831298a667b8cc57a42f8468b021c5ecad663526150876b9ea992cb00359fa47", - "2642600878e032e440c24a879dcccb5ca1c743532b0c35476fee72ed9a6b0c80", - "896198555d6b1b7bd902d05d25235218597e3e04a10c370c63ad4379ebd38b69", - "a3ae126fba126224b499b5b32cac6af8c6c455cbd67974fb3789a7f3d9c5b97d", - "c18ac8390daa16c0e7a22ca069e3ecc506b8d31eacc3246dacf632054e37b592", - "01ba5e0732f553dba7833c956553bccfbe29f33a3968b3ebcd93e459f97c5f7f", - "bd87a84e326cfc6be47f64597fb7773008dee2f13ddbe9a6c0acfb653d4ed3e5", - "2aa8345e43e49ba8afe6f94399e11ddb4a7d3a9ac1ebf78a3c77f85d778b03c5", - "aacf54516a42b501b7009bdb565f7d216e17c40fe40f78dd12c697b59d6cf89d", - "2ac37c37304e2ccb6f9d91365828b09ca2f6d0e152e7bfd2e4d893441e5d308b", - "97bdf6d115953684c32f0492420c43dba5eacdfda020c1fbf8792b472be3e7c7", - "a4acc761a708e4cba16441d06b6f73a534b677da27626c182fc2001e131483ff", - "7886c1d2d612223565274d25ddfa7c9ba049d37b09d76721cb3d6dcba13f10e6", - "8ee66d62413b6211b30451a508979f01e1c1c5dc8514b6912496fa0c27b4a862", - "f4032faf3812169bc6edb6b11f79516e675b8d922c26c34ad0c48add85416264", - "206e5db8b216d9442f08cc70f6e3f36b27fbf5bb43405a15ef3efdc56e2e13e5", - "ae4d12fd207c951d23efd2f2d7264d0c5f1e67ebe46554b43bbbc9396f866542", - "a3a13f7ce9fbddc828f6f446e2747dee1ea576017d8be8db0d5cdcda681bb25a", - "0f8c30e09fc898192afafe88d5038d8eb8b37a78e8a7a94908258d2a9004967d", - "bdc65266c75b08ba2104a9bb50f8983d620d497751765d4fcdccda205911f015", - "85fda1bbb7162d823604097e59be712db149325423be2cee4a12a0ee0601045a", - "f9a041af63e4a2cb32a01e56c48dd7b259ffc9630944b44bae4ca881ef51b79b", - "80851d4d1664c79581ebe43c765f264f5ce84d7f3b9015aeeae7bed2435e93a2", - "20076677e9f9d53fedca03250b423c635967a842e39cebcaf26a9986bb2209e2", - "28bcc73230683d1487a29785265ff468d9b8ef481790090193d7684111982c9c", - "ea4de7b25f11e56df11b3f5e4727a256c9dae7d970cdf2e4c8d0af1fb28f43b4", - "943ec10aa325787e83dc64bc0659591e8e07d3d1aa7eea7182500db6345f940e", - "a1aa8a44a7328d6b8f41008c99132cd31c2594513f6a81e137d09cb841c7bb3d", - "89f936420864a3429ab0ea7264ba74894ba8d6f3e910dc9967a3796e82237a94", - "379f55334b6bbeac044ba2fdbfb1e2ef288815a0be35c5450c40f4452002acea", - "f6ec482848a410b39abc7962a0d27cf5db321a848ed758898ee5a3a5d7fe3256", - "b69e39368b59bc7c448282c0644ea398663111bc49cc65cf8abc8c399efa079e", - "6e6f5ced47d89a54519c7ce2942f0142483c62e29da89b7861d9d45a9d5bdf10", - "e047a78c7a2ce40e1fdbb3e5c7ddb5c55744dc9a7a31278ed1941a04c4a07d14", - "a3c331ef04801b044cf37a5cdaa44ec45eec4e2ec59d7d3e0d6c5c292ab2a38e", - "78f573cf2edb0154717fab756df5e063776c4b63bf115660921e65defae48811", - "e3f02351e45def74228df68a4c7aefb8f4797f77f4f9a73fa4f43ba7687d8ace", - "6539472c6bcda9f048bece9fecf6088d7432f345ed5485fc6de4fa2e13f8b56d", - "d8265368e445d3de28adb4fafde042cb7b940f680cd321b6953fc0c587195048", - "4bd8c63a7bdbd1fbdfdc6b5c6cc86e288bb528b1e1a60f64b5442e4a21341b6e", - "cd515eb9fb50bfc67e51f917f686a76dc13511a973e86c39ca57ce17b59d49a7", - "e8e37ae5119b9d0c9d89bc5611c6611852e3fdfef5c337bba64f782e0703ca3a", - "6335849e84e3f59cdc5736370b286626150d52fa8ff0790ca6c13a7f81a0472b", - "aff6fee6663a18b1eb1f9a762207214e7b9a4f5993dbf5485e24a97c8c2d6400", - "ab940d3421f4ba855fab09de4ed61a4bb40659f8eb185f5a6e628e043327b016", - "abfb8311d76a8c424a2505289494921723291d013d42036574cec3b7bb43b67d", - "4e18f6650c4efdd58a79ba3279f66526b66de57ffd3b4c98b44c52b4aab6a73d", - "5ff569c69e440dee5b134136418568476b7953c7f7bc372386c14d8a045bca48", - "d540bfaa24f6a973620cedde16906d2833140d018c2ca3db785d54b81698f680", - "fa2bc6d7a61cfb969d730325f6b2ebb0cb50af3c8439d9b5b26d1cf3fce031b2", - "0b21528ded83ecc45c76414f02c696ace508e61cd32504ebd88dc3a0adf6563b", - "3b7276c97d9bec9dcff29d03c97336716b962f26ad5c017c7b6b51d84c129fa6", - "4c1249c6ad31349acdae8561ef899fc9f9522ebdd75e11947c78eb1f77c4a574", - "0297acccad2984591aa0b9f48de396326368f91922409198fbf95088cfba8690", - "e5c7f76a9f6da4ccb91116bb1938ccfdc2b3cf7a37d9435aa3969403348f695e", - "c0f02d0ca724e62e4f075903155896905d978ad4a02396c5e8eb9078e1b383a7", - "e48869161de8f6ca9d7053232cd5af7e1a6a8653b84da6ef785706ebb3493a02", - "00491acd3837dbcf48f80932efe86eced046e82104f82bab597fbf77d15fd906", - "9d3ad388598eff82c10bc22feebc97bbe05c2bc59bc423e2220e5d685b055629", - "27d5a07495e2a019a80a42d3f3629d9537dc0684f49b5e02f4df0cf0f4967139", - "8091dee71081b81871b96bfb9a6926de9a4426ea8546c773639a99c8a5e1cc08", - "b22cb4bbcf079d6094f9ddf1a8b6a15b42c8a13cf132924c784725ed0195d2c8", - "e4763f0f933a5b273e6ec36bff25564ccb2695c2a8ab77e6f237f5232accb4e2", - "fa47a7d061de9de2fd815d7dc15877022c2575c27cd07623204a3c91a13a6cf1", - "37327441e64ad2bb4756d43da2765c77c3602ada8124c7a0d0dd6182f58b0233", - "d1fd2b5f85f89bcfbc31d5770c3b883ac07d8c84b96aaa30cbcbb766659a6cbb", - "3ae098ca4f19f07edd80e4d0f4a4bbd75073be4e6c8f47c1c2c113e0d80fcc19", - "9a9c89a8368e0030b47c10175e187a0ab2e0304fa806eccbb42b3eec1e94054d", - "8fe4745a3f0fc977762bacbf12b1e37d2c459b9fdde218ed7ba57cc6881244ce", - "c09c41f3c94db9ed78647b28d042fadc52a228840eb85157443b3e0749c2cd76", - "8015e924f18670731c86c2c66427d5086bd352972f65aa4d6c7990a6836d5a44", - "2f6c3251ab1610a756295a3399b3ce829022034c92a5a9b64a99f316156029e9", - "427753ec65cd437bae94847b132e2151d6240340894922da7979f7d34809ee5d", - "e9a5ef034bafae8392d426766b093855fed2e99901f3a9b2d4446125e3c817d6", - "e55b77f92a855e268ad6af130f5661651186fb0210f71efaf15b48ae285f625d", - "244ebc76c71e66e4d549163c0354f47a0853f26d6240395c4b5fe971ded66717", - "8ae06d3d51019f45c3b4dde58b5323d32b7f974c8de5ecb8097ed4b38ce4b693", - "efdcdf844df5ac85ea924186cb819c115533bf4f0d02cd2ac19672913c2af593", - "d6f1aafe947a9ee4d872b8344dd812e265dbb28127e7dd580103de4921c1dca8", - "226a9157fa82440ad2e21922df8b47da2cd5fd5d745cac29756bfee24d7d4f87", - "08a6ca79213663602c6ee175bfb42a1b8f93db35c4bad1efdaf6b6568e96754f", - "40964baf25e48932a6745d66687e72a265335e37439050689d601931e1c6c7d4", - "83e9accd4dea1382ce920dbdeebba5d47b72f5362c993bb6b25e156dee78d7fa", - "5ad61f034000f65d5a8c26bc91125f2cc02db3ed204b322a51451d007a3eb715", - "4c46d94fdcd2a9bd22b886bb93d8638dec48a55d4bc8e1088b6e4929e45a687d", - "089f36b097d95e11e6cd0c11a505040408dbb78b63c35ac39352b952f8802257", - "9ba15c747fbb154685598306cb20353d254185624468add469f25246eccd04b7", - "59686cded2f8b3a73b5becc6267f6df4dbf95c81ebd6c8708e39f5122d95477d", - "ad47da948d1b481e3b50d114803f28f864ddf238780fc82a169bb0732ea1e879", - "f4c6a637b08d9e424df67305c03a1ae6588350e9734e6bd2d437c6bbd05a3809", - "9a409000e75cb641974743840d38c11645ddd6875937fa8ae7f4972c7da27c5d", - "456ab6efef77985a0b8feb7c15b8804958de4bcbaef8e722a08e42c2a37859b9", - "3ba1cd125950ec07b9e0a3e4a138553f79cbcde7bfc6bbc82d582129a9b1cd78", - "bef21f6a909a14cdc63a475eeb3160e248f21f912259b859208a1ef9b540cf53", - "ae8d93154814befd7362342892603223736de42d985d1fde6d6cb175676fbe3c", - "e5ad4e124a622bf2b916ec10d9b275e4c216630635a3ceee71ef6d345cc2b2ac", - "5aaf3aafe5a2a702d1eafeaedd498327da315b5ce6e4d5750d902d345e993a44", - "f9fc8b5d7c50ad8b33ccdad2bf2d4bfc305397f6cc5b448999d5c80258bf2cac", - "1ea1e4d97fd3f8d26ddb6f0a97537fd7fb698773c5d1a80034e18666f1b859b7", - "ba9258aa4f32613c2c2b6d3f95419e5c7f0417abd4338484c8a877b6d23805b8", - "f13c3a707882eb47675b56717f848e590ba05f046539ea8e31eb0caaedc5fb89", - "a24bec6ed2f2d94429c8aeca6026dff913a2a2c9cd25cf81f4d099b23b8973ce", - "9b949eee8a6ce00a32241108908c6b1b0f62af83291ac97bec93f563bb2c9e01", - "6c4447b7d56723a6d2c917d9baa729c7faada569356a6172ebc7e2e9fc9152ec", - "c325ee4b737021c93e3daec801d8e192b09d61918dbf868bd83addc1c62dcf02", - "c19acb14b546f034e3b5bcf5a08a9460ba0efc422f6fa417a6d1eea20b103527", - "ea21831fdb0db2c2aeb92bb0a28c9526cc30889b904c0f4dec24e3f844db4ae0", - "d0f40ed9eac0d88dca22bc40f139dc731d869199ff85a6c6c07431fdfd7b128e", - "6efca6aec66d6dbca49092fa1c28bca75370521448fedfef000913bb1483ab34", - "e5ec0bbc672c3bbfa769036bc89fb44e63bea37bf7c805e42043435b08289e3d", - "d03b34adb835032851c59265efa8e685523864db06735d62807970cf0b13ad44", - "5b624a793bba5056e66c13af4b1f47401032be7a498e555ade256d33a5f4a671", - "c62dfdf5a418d43cdfeb0eb3ed381681c0c1692e6d33235515673ea35ec5fafb", - "84deeef4a3b14e6d747657a1427a169a59e3096975ec91afbd12b089b28abe9f", - "5d1962b9c55a3f1b18304949e675fac5cf5ca34a545c33fb1a20f698cad191ea", - "949a978cb5a002d2c80611a1260c392e64f7fcefc683fa6f85205e113effbec5", - "f7c6b04cfc0f686baa848e2f33ba01b4cd1df742492847d690753d7192138cc2", - "41e2ca8ad6676ba723cd58d17864c5380d382d7af7b27e2ecaaed72dd2720ce3", - "3e43a3c17f9716dd0db165507935b725cd253462ee8fd643fc0222af751a59fc", - "6fa3bc5fe9f4efa47844fc74559e814ddf2d24d7d36f06801708bd32ad58514a", - "ff325986bb5b5e612043f4eb90acff7d93d7b7dcfdb4c3041c23fbf2a5f59e96", - "5a6444d0860940189694207556ed31fc933fb53d9facc42ea7e8ede85a4f39b5", - "ce0aa124a71f0fe5e829c68b621bc34dcdfa8e7c8907b77125a46c56cc24baee", - "48c2ac8a1d32f14c037a222286435742506460abbfceea029c52bb2ecc8a8e8c", - "dde7acb4d074bf48bafa60a5884a5359bf40ccb05117ff81fe898ee7d96d3237", - "1a7f7b94abb2f58cdf6359d8db2b78071eb31b50612a828f657a8b04a8ead087", - "b0ee6d5d213e2882e35ae4658f845f0fc02f7754b3dbcbf944e87428f56369f3", - "606a700cfeea39f749e6cc280915e56efbcfce3b02e5b07d750c8fd08521fbd4", - "25331b3d8ea8f6bf096b2d1a9eefa2ba8f24ca9809bee865291fe6c404ac4e75", - "d3f53cd7740d5aaeeed6fc42c1a9c236d424fbc51520b3dad889952f5e02be27", - "ce19730674392afce49f7cb5ac0e276736b15cca53c3286c46b304e2c859b3e5", - "ad7676e54213be948f7643b9dfff56e13b99b618d729b5467a27f00513df9365", - "6a2d83162f84376ef06dc63fe934476e4bc7799e29b965deae8b6422066f9408", - "b65e7bb9764a2a877052e6e0af5180075044328cefed6398a97d5a85b2a6666a", - "a022695aca6a83f544aa64aedb8bc7990a553e2bda632fd1accd00674aac338e", - "c61943d8c40b7d638710e8445e6a7af1bfe03282f099cb8958c76944e856e7b1", - "c2dcc4b2a4fb9d2ac4fe3b316be3e98e546cd62e9d05bed3607011f4c5828033", - "8b020436f16c22914068a3e13f1998faa64ecc0ad4c295da028d5040461c2697", - "ccb7ae37d4969fe166208ee8097f32f951b97aaf14266c904b72eeb1fd4696f8", - "34ccc6aeb60494972f76eea0b1d0fd02050c5093a2531df9406e918dbb50e039", - "829c779d44146c3879757c0fbf773154af786bebb94216b07eb4e25c30fd0f00", - "e3bdb69d6bdab2dada8ec3524e69a30d9491dd992bc6dcf067ad0784dcfa2409", - "d11df39eb4a614a4228cefb026c0182e7475cf8aad525f700cd63ca4e7ea8bf2", - "4a00ba0b6557a2b902a7bcd2ae6f0c77e6ba2ae765bee873517cb71e4ba75bf9", - "67847f18520d0981fc43261f08a4d78714345bf6447df5758ab59f781c384eb4", - "06cbe3ede011d39ce17c9889d24f1c61133b09a481052eb00e8a2f03c14c78e4", - "da879e4cf7dfd0416e70777852b3117272278256f18ead0ea3d5ad7674b36127", - "086b018d29163273171bfbc831e152087ccc817fb4b7219dd48065801bc2e2bf", - "807d7a61f4af306fb8be3310ea06aed0f6c28dd7cafdb187e86d22f203036662", - "4ee3a1262d0892f87eed2e3429456e02870647dd8526c2d85ce7e0fdd34b7421", - "f9a77d3717fc6efcdf8daea21e5b2f3a53c4cafefbfaa8239306b0d6f2e65073", - "d197203651783c354c27273fc02fe574e74bf53f9e28a67441680b17b64a1c6c", - "7124f7ab3f83a0a576e58351d82d5a9beb25cd01d4c1c03f88be4c4059500705", - "bf9a98e27f460175c8deb350ee258374802198e81d43ccf01e353f9a5e91a623", - "d28274af68c91a66e17a285fd30e908351f780bb95f3b3037674063369236cde", - "2bf7d04c7265586e3c4ad08c82687c69f20a03a28005b93eb42be954b02f621f", - "15290d6bf8c8cc5c871c473c1f391dd310f5c4317ba926eaf66358ab9bf3deac", - "b52750084e1e8aa5d5ef0e7ad9989adca6484d4dc2793f929179bb6bb8cd6531", - "e5e36952c97b3dce1cc562e2d610223ef45230b55e4af2c3ce85b37350059597", - "93ba540dd19bccdcc6bba965ddddc59a57a2150d8c1cd3a810efeaa5f81cc132", - "7ac85115f0b998f9b52cfe4cc4a7c996fb6f4c9d8d6759b0e5bfcba13d4a1d20", - "b8f64fee8ebc4c5cb3fdd2e0e9aaea24e7522e649480e501fb48d69ed6c2d9f7", - "97dbb265880448f32246770a631b629f6a399587258c33f166086eb90771c772", - "d463b56d3538dc42abdbddb1efc89116c2d01632d14e34c3dc23c35d7a79f55e", - "289e21d8b9a6b2ec9a8aa11dc8c8c56d89eae12a6b308ab2a71d02f32ac2f00d", - "31681d9b04bb76343d4dd052bedd01973843314e2bb278e01ca9acb2d6969d96", - "d8b11773ac00431ec5f00310903759bfd538a9d57b70759266af6eb9cdd4ad49", - "32e190259e304162b3aa39c22eb67ca9cb2928125884270dbd3eeeedb44e2bab", - "411ad0b6d531e22e253515cf7f73cc37763676578692772e7a141177a3db9a43", - "c4b86c2bc29d787de4cb96e22eea8c2d6a9b22f516672eafd14db12a7872b1bc", - "2a70accda042e87ff259dff65e1e7ce03ae87156420ad3fa71ef7618a9192475", - "8ccaf7d957e976cb6d73fd174bd832e49fd7715ea93141f8a94989e4d6f7d236", - "85b6d8815e5bed6b399b04fe2345e98a0eaef00578deb02e000ad0a097df5eff", - "da8770738f058e1288d9d59ca91233a551acfa6c73f21d83cecaa7b858d9c083", - "174faabe2a0cb0493b0dd72293f6003701e7c825d66065c229019a74345ab24a", - "f0d7977e9121c66ed7769dc79292635cbb59410e9c0986ea048a6a7d0c990449", - "2121528640e3dd61a933263f5f8d343acf7e69bd29a18e193f337f22f427d442", - "432c32c4a351cdd3d991125d6211012bccf777a96a0ffc6609bd53aa4f39ca83", - "404cb23ce9999e76dbeae932050f1ba1c1846afbbbb88d2c93a29adac5f1cd2a", - "fe98966c9c6959b124ae4ad60ca9f0997a3d65bc1c51fa4381d6773b02f36b8d", - "ec421599d8815ffaae6162ad2bacea50b5901c8979d39c83b8a6909df2eb82c4", - "54eeac6234219efec157fd82d744132acc827e48dd8b4efdbdb9a6776f965c4c", - "2eff987a9126fa0b4f146a25a5f214d0a255d707b14ed0192f0ea85aaa27de00", - "50caa278bfe93fe54baf3b52da9d43373dcfd4ad3a0ff279c0d196b7519932cd", - "48d5d5a2d9adc3e39f0f7e650516f39a13ede6b9fafd31908c4c8321e1b9d6b3", - "f0d807413275c94febe4b399b4e94b5893b2629b3826815490b0dfa98e93b15e", - "ede33d0cd2cfeee602906d60fbdc9d639f28f37bf9f0d797d08e6be3e128b943", - "38431404be5ed57e76be078b9bc0784e9eda3ff223338314fc09e349749718b3", - "cf3e92feb07c07d431cd065602db7446facdde047b411747b4a2834ab49bddeb", - "8e3dd2e333aadc95f738774fd1eb0b77a3db0fde8e11d4bf2c4d0f852c7146cb", - "4e0597d3a2a3fcc1876078a895d1cdb564660df3b0fab24ffec794ad93c92b9c", - "2dd21eccb448effabd0ffbde3f24d34eb899ca9ac89873810c3f6c89e124f924", - "4c7c6d68ac993ccc4412b7246a8c683ba9c565b7eb1004d8f1fd26cfb195745c", - "8612aa19e5ad391c48d7bc961edca3638be86d9af3b2aff7b9bced323f1c8f07", - "e552d639845896974e8459ea9c89f8594b2c0310bb3712b35adc194fee5d9cca", - "ac9bf7c54dfa8e4c85e6b958908f2efb623e6877ba39ef5373c76b17637e8f84", - "3ccd58660ad294242f88b593d008e207cff9208266ee2ae7f75e2d64dd6c0d31", - "575614747ef9a9720ba2d0a9f6b2d064e2b8755f4aaa40fb00f4da41fd53d972", - "9b33095c284189e56b66aa301fa1ca2dd60d75dde22b6d84f9a8abbf49841116", - "ec5b337e34339964c8813cf9a6eda83c4cba57c3593a3eceb0f9f26523484973", - "5b2a106cbdef721b3919b9caf369d28ed746eb9b0562b565806cc442b3a0470a", - "602fe17a8111eba7d41ea9f2761aa067bcb9a1bea678c47c0031f5323419ff1f", - "dca23a767f122bbce8fdc68879230d41a21fb99baca31d5d7e95b2b3a032adea", - "15e22df18238a6303c5ec71dd2ea417c07d2235c314b69772e9eef13134a3dd9", - "85c48b3a6a477bfbc9f800574a5791220620d6f3cfa6cabada7edf2e8f6dc82f", - "836b2a085958b0b3cdc526c6e3b0422ee3fbdf02a5cfa14cecd33decf593c158", - "529fb88243b22a95895d1711ec4d9a7eae811631f26607d5d3728a3d9686b43e", - "1d24c133ace4b40cf2c3d2e10fae10c9b85ed0274f7f2630f1a7704fa933181c", - "649100d2c17c617342bf9b1c9c04bce41835598aa75ee46ddb68612532c36ba6", - "8c6336f924442b523dd10188995cd3c169c0e52bdeec9a2e2b550eb42e89b2a6", - "dbc91af71638a9720d46643cf2e025ddb64555d5855dfddc7436714a509f4736", - "3a7439fa17af3e46d4d04896495796e379c5bfa9de70f7e3197f9b1e48e9f33b", - "f83b039e0abdb555341c6d176b219e29371f83527de5d22ec07249e304bcce3a", - "b5f10a4a80905f74d5488501398a479acdfeca4aee8a9066244d8f51e490fc97", - "84d433e481aea7039938c49ec11fd6f95583115f9d95aa62bdf8b55c013f7d5e", - "df0dce321367341722bd5cef98164e61c2678e4405ee6cbd1939655bd453f74b", - "2d6728f54fa756e4a00c6c02feb6b3eee23e629bcfa7d81f7fc9d91467a331a0", - "cb2de47af47e93741f6a3c598e79e3861744ab1ffebed11a8e76f0f78f805758", - "38ffece78a74d16d592d078aa3f33737a94e3a650258c5d4eb21bc5ac5b26edf", - "fe8e7b4cd2ec75ed9f7fe1f587de75da5d1c184ada8155808e47cc2084581727", - "ede74d970badae91d28d51e6106b1cdc69d39dfd9576d1010241d9b79243816f", - "0a2c1eacbff8d5301ac913ea1b265bffd1184d13c1f5abe6f12b1532fa5caa34", - "f755759d54f9a5378b091b7f1d1b605766ec960d25ee5f484b355c3727f6b9ce", - "59c7477fb1217fabd58edf65ef2110187afb79b927615b40b77fdcc47eba6e77", - "a6fcc686c06f4484a0cd488043b430614c4bfe388de5a652ec9b7165d989067e", - "923b85edc3773525d1cd67a864b55318579f81299f07a41ecd10c69fe5ab2990", - "3137c5eeecac7f76f0be7fec4fc31e9dba85ebf8a7a7df1d3dd91bcabe4a597e", - "d32cc1cabf5d16440a2d8fa12ced001a8626423edcb2ba760e093a1491ee794c", - "85fcb84cd9cf12f62a2ba3e260aa8d4a5b9df102fd262616f57feeddbd3c5c99", - "c98ea0931fc93ee12823c26be8e94b4dce29e92acfa8028944e84d446b335325", - "9e81a2ab03e5dd0a0b1be6bec0579098b3128010c8c25524fce8d8245c5ec939", - "cf595297c8dfcf121dd7ee0eff58946280305980d498f01bdf8de69144a342ea", - "6f07e836eeb581f68c3b092edab059822e1df4827fc19bb6c63ac94c393619ee", - "c0aa07bec9ad29a6cf6ba868fdc95e883304a1f5cab1cebb5630eccefd937c55", - "7aa6a168a7f5fb0694db6ea25da6bee25d64cc3c32afe1fc21cc89ad77beee3c", - "ae220bcce39a79a2c04b15fbf1aa4b0a5566b0f904f55f6bf4e454c05969d952", - "820a8f25ed70ced3d438ad360471fb9813475a755d330c9abc6d138678969444", - "7ba130b564a75bb63c68dc5e7bc0bcf6761e38f11c5082f324cd34b12a189ab5", - "fb250d1118a7db3d3650f5529877ee0366d54b7b03f2288dbcdba573ffda6c9d", - "5a12a045761d9a25e6d272250195a8db4c50c256a529c0d5b90f655361bd9028", - "6ab76f156ac020741283fa73dbcad2e3557166fe984b221b4c68b1696268cb24", - "0c340728cc9ae91333665aef523a920368f61cf269a54e95b545882dc94f6504", - "64bc9b2a61de42c03d4a123c38afe97c644f25bf4e22ee05a2be9bc0339cff6c", - "d99d535f4cb9a7d4269fb2593749ac6ff1ac0699d3638c711c2a1f44a37f1473", - "bdc9d790c44e244359ea4586f6de303c6ffc727b1190ea5d9ca76ccd0fba4869", - "656bc8a05ab1b703677a5eb6f3fcf79864f6b488cf876aef6c3b0a66a4bd3caf", - "6e7c40f29657c95acb8291330a9070f10658ef39cb75b783235a9b61268055ba", - "60fe70bbc90f8ad6e556ed45caca889570ae01a4d66fe3ce63aa826d52cc6d2d", - "582ae772c4934de32678ab2a4a5650ad347bf20932d9cbd7d558943bdd39821b", - "6f3ea826f1f54ce2613c28604eba608a39a43bef08cc489b54cb7036d6f0b320", - "a418d0292c63ae4f59cadf12201ee3faa3eaa04196bc9f2221c3c6ce8d4411ad", - "11724231042ca06abdc84f4d8fdecfaa1841e254619e55eea077dd3a612ad97b", - "6efc4e1c2f7214d3d0a9c2834a6cb85a1ef0fc9c9e2251374be85101efb995ad", - "c8675e727a0071162ab0f9207e9c5beba5fc141d1d19e9053a4e86bf7fc09204", - "0799434d1c0a53888e7a68c83ee261eb661dba9c1464ade7bdf4811d2e6b28d6", - "505291aedf7a3bdb849c73278aaba19bc6b06350b6681da5eb300deb27619900", - "a941949c35887707550ed436be97ac29ae3566cd88bab0fd735bd379798e3829", - "ee7c9e72b040b7dc186d4992514ee270498631cc53a635ae7369249c725f0946", - "fc5b178f3705d184ff6c7844841a5e470b7a7747553369f907657a4954f1b1cf", - "d0009ab58407687d0fe8f5e307bfe38ab1603f828540eac16d3176156f1bf900", - "1890409e2848832ba245671baa523e69b5406c1f47d69ecf036291e4a0baa2d7", - "576c5078b9ee9e0b05e634d5a76ae00b946e71d17ac48968e893798e86e170a8", - "3bf738120b605cfade685e9271e6ba466864d8ca46ba87c266458178019181ea", - "1164e0ffc4e79aaee44a50a1b84a0654de7196b98f44c37b146aee16a65f56e3", - "fefc2203aa509add7edf6d4490a8e1ef0fed8fbd108e5808b6e599bff5fdb337", - "b6512d56b0b4fc8d8ad670a97b8454087f799141723db96676b88d3b0556cd51", - "97f76512787dce218506f23cc167d192594398301b18b2e18988935613cddf5e", - "1420c2de834d847764830fd784d45fc59bf6ed9282b404f84fe285a3ca17dce7", - "dc4a4b5665fac221e6c85444466925f660c6f646d80cbab68c38fe217e457f27", - "c09c47189486547b7dc8c5db027d54a772830408f95b2a9f183d08287a102c17", - "4a90205d98e6d010471f47dc3c21deb1107ade9053333ebe87cf6404ffc92ad9", - "54fa771530f2598629d866d1b71e6eb863e0d1d5dc789a388f96d56a4754a31b", - "85f607c54af31230345bb6c61a7d711fa0d9832bf0577ace7486e334501d9038", - "db82de0e0c22302c9f2d335d85fa99563968efa3e776a232e8f40cb956f97429", - "5c84c8abeb6102249ab18a104b8ccfcafe42716d306d195f0bde363b9a8b2aa6", - "e0487799bf9d38fa05ace3bf99b96b1c5a47d5861eb5568a7f69533c943d0a3b", - "bbf4043dcf37257fc2e995d9ff44a5046db3189f91b1568f255aae0fb28e5c53", - "4571e332e15ee12ea3c82c3165ae8b35543329f7c13827eeef72909e286953ce", - "0a4bb745aadb5cadf2c596dbaa3b5e2c66e18372787c3989607f30bdce89043f", - "34153e7ab2dffe6ff6c09531ae3c53f51e5422edef153a0ca31f50660d05ed38", - "e675883cf2b5f44c901b2f3d8ded0e6e2c62bbdfb319feebed16bb596ab85421", - "d086c43738794e93bc764767054efd3fac6af5e53193fa81f98c8b53a9e329ba", - "aa8710a93c26dfebf34960d05fba4d26699063a9c1c8f7933ba1865c968b3850", - "ee2305e3c3ded3c7926ac3f9f4b908d0a767dd258437416ee6bb21b9530262a7", - "a9539982f5b8160864c9ece4d5d7a3187031e416ae20cfb1cf8cb997c8b9774c", - "d84800993b1708e2e9a38cd489be50b80970abe20f522bed3d261e3169b23f00", - "b1db9fbaa5a90664b677653f79d98607d8358dcab6ba088560e8e21e6f8ca6c3", - "84a20db017f9952197a8786fbb738445ed358a9cc985ed06c41f8899c666ce42", - "9915e019e58784b69862c1c182cdccef949850c666c6b795c3d7d61eab2d6133", - "93f0b660dfb5964248ec6eb0ae9d356479cd0576805de5f8f5a6f33638693221", - "74410da2f93a3b37d1116422681449520fdd9b16a8e4db0ae438090c271bf0a5", - "c515202645dfd9328e517048eebfd7a5b1140f3ec15648a389e324796913cb46", - "57e9642bcb097d585f43cbd4f5bcd1f2d0c05dcc460b480f9655ab250e57b811", - "5bc222478923c190b79f32782bc080821186763fb1415463d983b51614a55f71", - "08aa8b69a5653e5c78f55688f184eb363595f40fad83044f359a29a8c3e4f6b7", - "3e80b5618852dbcca85deb4bc6baffaecf8f1607eb5030d46d78e5aa8dd99bdb", - "59955cfbaceb325958e21b72384f2f87956c55248670bc62840da52c862e55b9", - "f93ef3121decfea471cc5ac0e4bfec44762b94e5bb5fb330320e076c7be08bd6", - "359d1e9f5e8fec9dd3302715d63ad51c9d3d1a678c8c188f649d0cb9a884e15c", - "d95e6b56506c60b0d5a4120b909397ffd8cab6b4a35eec1d1861bad8a5c5ee48", - "cce237e5d170b5adbd7cc1b984c3cfc983ce4ee15bbb305047f8a50e0b1ba877", - "cf06f687eb81e15ffd4a4d8fd9e7582b3a224e74fd80e25bd06da2538aa76ca5", - "5a6e8950bb144e07361625c9ea0a4ea24331672ee7d4671ef6aa7fcd788c4a27", - "ef1dfa63bf53aeaf8877f883e5d4c9982bc64e73f9c3e74ca332aee4e2bb23ee", - "91e605fc1318a0cade3c54255dd10d39e0cc2ec20a0221272673f7789b6c1842", - "d4c73d2dae146dcaecb3d06d63575e1e11a62fb5c8cca77e0db4b80a31c17d3c", - "64ea50c3f6ea3228ee38baf7ecf36243f3c4c19892d6e274ce60242fa70b7918", - "64f4529f2a1651b8f7a5278674043500a148b98cc767017a9342bd1d4db7bb27", - "eefb6b11f565564d4f042654b7107009b73d83919bc3bfa4a2968a995b6f7f94", - "6a6d85a3c1d566eaa8b4f8bdfd38b0f48382b08ba0cb84e6f8cec13530764e16", - "90a95b37bd091a305665da4d84ff3e92e9289690b73941903594a690a7508cbf", - "6282ba6bde7ea038c5b96bfdce7fbc91dbef238deedd40219447de78d58d5c8b", - "ee28bce4b986daa66363c904330bd2c40b5205d095dac9e285d6347ede3719a6", - "eb8cd966e02c23524da6746c653c2f4965a5377ddfce3bd6bceedaec3e8896dc", - "0094c92f032eade4ef6846ca0b90205d0f4337c9eb0e62f99f470ee0f358b301", - "ebc16d0710bbd07fec4943957fcc275ecb1bdacd8ffe4f18bd99aeece2b951e0", - "3f83d4582aa972b5358c75ac3973f4409e399cba90b73710d1ba962898b96596", - "0f6d8373195b7c2847feea544ff76256a93e4ed88b3c145019755d757f5862be", - "f7452a28e3fcb34c397780748114d3298da457a0aaf636bde0196cc2083bcf3a", - "be46701e1cdca767c98ce937f7fbc1425f1f1107a6fbaec024e3da9e8b03c35b", - "9bc9d3c27cdaf8202068bf27d7cbf1ea90fb551c8f2820460e88d52f6dff2697", - "8e75129fc391647e1fd143886f604744eaea7b1dd66a23c84844fd3e993bf428", - "15bbf820a75e04b6cbb31bb5d539597228409c50d3e7fd038873d98583f8ec69", - "2d070195a31225245f0014e3a85456b62ee134cd614d6bd7a65de6fbfddbb34c", - "7d9ad2448631745b6b02318aef812c09c3a58325c22802b18c0eac54ab8e8f5a", - "4e82b561c0255c7d2df32a2ab77de2f23f288f9c7b60c8558530b45d0c4acb56", - "c75f02b1e01031ae5320b1a39e4c06bc1af2f26488ad82f67d6f884d17ecdc18", - "aef02c07a45099fbd92b3f55f86933cd5aea1f96b4ba384449902376b5e9c71b", - "8e81524a8f0c9b5820ffd72057969c0f6a9ad4efb6694af9aadef1cf3e815444", - "75d0d30b90e6e30bcf4907d8de21fcf9685e0cb14aa1bd5d76f7fad63b678e5e", - "2360a6e641fff5a2ee7a637f3de042b58b824c9c52847c0f44220bb1883b3d85", - "db9eb6309bb84b1752d167e42e55d8af1f7df124b22b8db5a52eb70331d59b18", - "487a0f3c9c3db1280a58274c1cbbb32f7548895fb5365f0d7ce466cc2df9be9f", - "24e5f4ff56a7613def6b283ff3c51f202a1245f74b47743d22bc212693bbd768", - "55244c72053a0a96c20d2c26d502cfe3c11c6168c553155faa1a2c79496accb4", - "4b43c3f291f6e0ffd246b868e406ca2b3d66710ac90760d83a008a0f163412c5", - "f07df2de1a018f807c723787677da2d022f1d05b80f0bb860befe6913d3d7113", - "10ee90ff949e33a1d888cdb349e93fd77c82ea3592861ba6687c82a64a2aa6b8", - "d0151b60a1073fa8c76001f9150adca595db14b8be8003c1ccd5839244b904a4", - "3396b90f26a665b45346db3087a37622b8b258374d134bd4b8bda50344e27d1e", - "076fe3b0b608378805542dfc58ce8675e0f8d11f16d9eb602ff2d27bd06224dd", - "4c2acde03465e94321b2fe337040cfb1416dba8f69fee77198cf61c729c0a01e", - "dae1484fab1e65fca246a274cee2dd5f0675357ac3a8130160e6e3dceee9c56d", - "c898312990843df695211234f1a6cb33497e5e9d6d364d876c03186b3c8ca95d", - "f66be973f281c5bf7140f0b424171b8ea2c9920179f1a33509b25d9ec9812c89", - "03fd530f844aefb94dc4fc34b0ffdd04c462f955ecb46c2a048cad4f77e47226", - "ee1808535efb02bcea03694aa8b308c60257fc24d5b5056337502c36128e26d9", - "d9b475305bce704de24e7be0a38ef4dbead29afbf4583ddc09e9b045d522a3e6", - "5a3954cfac0c6d2ab875e01c757b4a0306d7343124c5b059409906fea90bde91", - "6e1204336473c111e93539d0c3190b3eb45b77f818e81d4e63063b23f9ffb8de", - "3a7f2267742aa81fcc5291e07698b49d92e7ae5b32f15a27c2a5bcae2e09bb64", - "c8bacebd3101f9361e1253c7cb54febc1be63e56d497e237e2313c15936cb286", - "e8b6f27155324809029303456c8cfe75d109da55c0b22bb736380f21ad3f1c3d", - "c33d56d187277c0b99b659e5d791c060790c2655154e2195f2dafb189a4ffec2", - "456ac3a04c19ee3538fe10f425ba7d01e808eb93cd0868a60c5293969c378c2a", - "8bcfd2630ea36b9985dba44e089208337d6b394c501558acf7e9d8e941de2437", - "0440396cb67d85174281097a52bef8614bc770a71d169a7c49e1446bddf5588e", - "a79f8534dc94bc5fdbc494dfcb7237f42a261ce9881e3361a74c2e5437619f99", - "1a72cfcc4d40cdffef8f5b81bd0a9d7e650cbe99d5c4da9a9edf8f4231428891", - "2fb934c4d07738cdfdc66535425226ae360491461a6f77aed890218e0ca95e30", - "d86c4f457e8fba375c75cef1628d015a661130d50c4dac95dbd6a50928fbb7e5", - "00538a0e208e5451231f20f6e3fe4152436d15ee2255e139688bcca4e028f2cc", - "78a5918a8f9fb662fb604659ab97b9be4cb86569d54e67b1e83bb9bec2f3d606", - "f8b01d805dc8ab7b16064ae1650734ef97c5f35d376434f3c721144808296fc4", - "34d1dae23432a9c1bcb6c68c38633a62f6d071f5499e6369f963968e539423f4", - "f895ac9c7543cfd89327a0e760bf58880641bcb578500ed26915124e20619000", - "234d69cb81694d63a262241990207976cda373e496816086e60f970abb4a349c", - "48df3951b36c0f549384df0609c525c4116a046dc005d1ea308447945d8770d7", - "063f7b6eed072843bd64e302ba81eb124b44916fa236384310876e6dbefaab74", - "7cfe605c531affab30b503de9a51ab75df19eca0991137b8b1161d081e9af772", - "dd34878bb7efdaca2e4c142d932b06d2489fd2257c9010b3684bec2f75ca9883", - "e7346cb3cc558b9d24d93c1f6c5ab25a8a24cd51824ca600f91c3526dbd9403d", - "46e261ba89d9bb7050d513d921b459cdd2e87b1bfd849509b32c93fde133b333", - "2a78ebf267ea2a9f489123517a725d939f867db9d18bb90a63248af1016831a0", - "13a4e783e9b7b0befcf565b9a93b613dd3fc11a9f55a2c3eed7fa21c075f7f98", - "82726fdd646fd8784d127ff0ba30042e148009c6d7093bf78e74f407c63405d1", - "958e1d3d2e2df2a3c1fc997c32d76a9e19cd6f5675979d7f643294a680d7a09b", - "2cda9e31c654b1c868e4efe23401a0dd88441b6253392a68db5926f39709d451", - "e45006603298787d0d2b3d6877942f5e73c5e46ff041ab3df73ca370a174d077", - "ca9c42fdca9945cb5f8dfce0808343f9ea18ea97dae270afbaeb03af4ea15d19", - "decc2a8248817a1193ffe32a057311c275c6732ca3e68eba2f6e90950b54d1ba", - "3202f8360a53cab5deb2c86e21a2b0b635f441eff3d97048d54c589d70254784", - "a9181dc886ab7c32b0050d5f7a4569c68750db2c9d7fbb36dcfa3531de022b4f", - "4866ad63b3fbffcda12bcf4cf7c0cba811e191bc9582046fb9b30bb9af25d0dc", - "8e35d628917e56698f96f6832965b6440a53297374edc4c7091fba96652d4331", - "0079aff31d463a180211d074b78117f1eee99fc73f6d50b68183529c15b88346", - "098cb4cb41e7b08fef9e40e0aab78f1dbb5f3ffa301da4796072d1c900e8d135", - "792287c8a9f2a2745611218b5a4f41cf6e8d10a7494f61484d713a1f84f2fe80", - "3ff4ebd7060a5c8d504fe612fa060c3eced0f93e62e7a3a138f2eea1de6d7399", - "faafbecaa1a299857d7f3f057175970aa5ef4c13ae18478bd500424b9a98f7fa", - "796da706dcb117933e048dc09dff0fa4239330bec9647a039a2093b111ebc317", - "fd5fb1ec9d4ed7188a7b052331e5a43e6c72a09a7c72384800f09c22e8c12f62", - "ffb8d21aa9cefdb850f048a7be1e2b3a65c5a560367c05edd96560fdd8e00b9b", - "36efcb4bac59f05f28f7c298d7500f4fe0e97539148348abdf5de2d3c373f538", - "d76e18d222b467302e957fd6a3ad94770cb08011114615d96733da1c85597dbb", - "5b5bd4cd0c7b7c2cb30280ffa0cf1e0ba3c0b9ecf2e2e8a38f18ddb27ef7625e", - "d57ec78110766363c0267a131dcddcdf5502f5a7e1533cdf7952dd1985f39613", - "f9cfcbc7885aec2c1551b2e557c8fe89ba156607d41d6f0461ee7fd10f4ed464", - "0f5d27d58904530ebe376f2399921a9f578d6815e71f784c34c34c6314d22adc", - "04bee9e1621847df5ba8c8c9133ea99f4ae929f555031f1ddc3d7f90d7d8a292", - "1373e659343dad7c8a62dc520853a5eed157861291751cdb01e0dd59e9772611", - "35cff250accdc052d9e8138ed011972144eb91f264a79673ccb62a6d402b1c77", - "3fb6909c78336c78cb3920bbe31c406f925b30207401a06fddd376805f44e3bd", - "5c1b920170954ad7df421ff38c875028277f428163cd929bc5a1bd9235a8faa8", - "43164ec89ceae2bbefddb3af6cb1475dad6b8254c6b098a6f809f21879184fc6", - "2a6bb489f99554fd95b6785d8d1519848a01c6c7da564b6d8e290dd9341b5849", - "239c7eddeba0923c5296ea896e2048c0fb95de616597c9e3363150fa2679b9e0", - "55bcb24115ba0c277571cd0a563d1d066ec0007a37706daa6dc17a4b2ca542b0", - "9a4fbcfa1210440086adf1d2313200a0b01ddf84984e74dac4509a32d766b431", - "16f5ef774c6d3a6637cad4a88627f08c6017df83407793621f16e5adba754147", - "74f0d331360130817532dae0fe03172db5204ad44a83ad1f52649fd417e3718c", - "65384531fc0e237e715fbeb294e848086f29e1e56b0745b284d9578534f678e0", - "200c352be53e9c93d3e222269a99e9b42fa47b04ab95c26633a1e812c7807557", - "a7db84b252a5747efe705a71f5e822fbf5f31855e0275d5b2a4245d9576e0c2a", - "b48b78a6fb61dd493dfbde2a2243ab9d0442f2a978ba1fb8e1cd2f59e3f75744", - "4e32dacc6b2a49b8fec3ed14db6253370cef1f7bb7c6addaa5b98264666ee049", - "b76858b787864c15a4c925276c8f043a1651ca5fee34c7045e5938f740b29aca", - "d6ab73eb8ad232bc53347434ea0ebce026eda75b4bb70bfefb40655ff176b79d", - "e45db2d785ce9eef1f0970777f1a19481a2dc78c68e67c95c3561e8bc488b969", - "6206bd5489840687f436a1ebda4076ccd8db2a893253dd96e6c81361df4b2ed1", - "7eef96291428792151fd563b2bcd9e8bb0e72fc798ab978a0356bedffa3439cc", - "47f26122662fbf994391f0471a49972e410ba1dbd6e8ebb177780963b7527966", - "5c96a1f9535adb12829ff1843cf8fc03e4a27c4f069dc39ee6d095b9b4362978", - "339fa8eb620e044cd978015fc4060f1f9de0027c31c64be846f187ce26b10778", - "2f2097c2fbd71987223e57df456b9f8bf87bc5e189b004c0246f97018b752a0e", - "fcca3758a4a72b3a8bc4b9bbb15b03297046680633c162a10dcb5713a647b5e4", - "9f6bda1fc7ba816d32db243d1a3b9fed51784106880b498be32a95bf63155bb6", - "0675e777d0aa84d41a0a1e061bb7c37d8b1bc71c6d6f36bff35363ee76e86c3b", - "63003e323fa3e1a87be90f8e4bf9dd0cf4909b29c024e70217e7218391b361ac", - "92de2df7823643683bea2439b5fdb1c582f255c494011fb9280468ef14212317", - "fdcf788028c37599b3e558ca073f61c658d7ba61d8b6f37e240a5466e17de227", - "3bf7fa9a7810a6fbc2f38ac43d488103a4ef2666f0d12753a42eb0b982663508", - "e4b3b05ae2b85fe1ae60c9d2d504197438fe97e3a54bcbc004fef03b380f1479", - "9efe2e99f150fdb3a258ba2702bad1975d5e38d99455a52a05c7f6a942b0d57e", - "dad05d3ff772a62930e8673ba655a99c1354c8519b18af860dc6a17eeb553e38", - "41504736a52712f51afee0756a08a85fe59cab2bcfd5803cf008369b2dacd3be", - "a5023b59622fd432beaaa8ca406abaf1d0cf01576d74fb60809e6cb3678fec46", - "8163cf27134cca464fb96551ebc38bc4bc87cbcc797a604d1489332593cc9623", - "b20c0e25fba84e04bf40c9d394d2a1e424841085dfb8ad91f03160a6e7351d1f", - "980ee0b89a9fa8bc82615e5fec7bfb6fdd997fba0dea59dd21b25adeb43bf282", - "bd66ab72a4748cbb9fe2b7282af14346d9e016aad7f87eec6e4445a2b6938499", - "cdb488b1a2b83f9ba21df4f27972e71c3385c5def95caca75e71d636a09929de", - "fa90e9d127f8407050dde1a0a081ad70f9b8ecac5d165385265285c4f5b61ea4", - "b75d70bbb3ef4021db6dd72a033fe1c2532f47a457648290abcc5d5fbe467fb3", - "c6fe0e3a318f888d77cc07154103232fbbcfeb00f2ee2ff7636bb77c1ae40729", - "ede539b427f616b4900cf7db445949e3603ffae32be3f22723307679f9c32b6f", - "e05af3d3cea8e8e3e3a5151cba6aef5b2b51d6f3974be9cc31980ce235522aeb", - "330bf30438c42f27dad9303c85aa818aabbe9740d3ad522f61ead08761e9eaf0", - "9d38eb2df445998e9feb65968cad9c94095be2c17625d101b984191155815db2", - "9dd9c6edb6193cddc112f089df779337f484904f6d7f3abd4459e40bf5e2db78", - "69c7d35bd98601edc38490cf65b1d005b189f5abeec73678a5185d9c46d38ba6", - "cd4eba14db6360fce40cb24f4e3cfa8490d0b788eb48b419216152564934dc53", - "b68b0bb358e7f955e3d79bdf540d2218ebbae4efea34a8ee01f89b751a58471c", - "516fc626e25fb11660830d6e6dc58cc1060d52b3ca916bebb95e220431441ca0", - "c8f1abcd5f4b6f9ba2632124dc5730e87eddf81a808a0e1fcd348ac831438621", - "81150e80c7a212671a5bc5b586643cdc494d4568b73e096d424e08ef473c59c4", - "6df082c6ecbd66c44977523a2713ca4ab18ed071b7dc20365c1a3707c08e2be8", - "347f28ebae05a84b570a22538cf3b85dd96cd7578a35a950c347f599184863b0", - "b330534dad47a7e24de386aec6c622341c8899ad627ed329c3e8fab57fe78ed8", - "47da82ab19fb5484e9ec7abb8f34587ee7c4d3cb7c688378dd47183d1e37c2c8", - "500b6e55534afb71befc3aec3a2dbc0c9c80d437fc046a82a22303cfdecdf57c", - "ebe3a2499acce7c9a816585dc7fb5da24d46b10bb1529e563c9648c388e04bad", - "8b05c2c6d4b81013c67cd001a176925baba88cd568b42fe75b5f6d98af787229", - "e87f508f603fc7c45eed33faf2f1b60b02fd456243bdb556e1a8f9276369a944", - "3257bcde82aa3d7ebc5e389440a7bd6d447aa47a16394c1a66cdc72d902fdcf8", - "d67fd7e4dc9499a3ea77ec787035d117227e95fb9421ff4b51847a70d8ec2838", - "8e9caa272369f0c151fa498a8986e8724314e6862fbf16c12266b417da174e9e", - "e48a5873eaeccbbb822f05f906dbedbcfd95f20758e7b8f1bdfe99298e5e0de3", - "27744e23a58331f2a210b15a9032f6181125a4ba9ae82360ccf57b29e62d40d6", - "8465c0490f8ecc3379b48bf86ce34e18e24c9684ff23f504d6eeace90bd73e6f", - "fa09a73b586325b145ebe6b31f6d5157ff4be9afbc8d2dfefe7635db159670ed", - "41780492947b792144167a7f2756875023f0c29b92624c4e90f1c94a2a7b21cd", - "7a38c2f3af2cfcb6a6ba762831909594e8136c09e62a725659aa37aad71a9643", - "f2833346d9a1cf469e3612459b93f217e68f31a79ff342df6c098a0285aeca03", - "0f9998bceb879ca510ff10936f5f98bb966eb1040e8b9ed5c0a88a0b538c6815", - "f86dbbaf9f13e20534020824473a3cacfbe36d9ee8caf3f2c9bae7ff0b5f16f8", - "527f2ffc01c9b7f7934b033f18fdf1216eb9623d6acbbb928053d55c03ed4696", - "78bd159b8dfa4a4ea7e5ee14e40728ac64da08e0aa5cc3b245093712138babeb", - "b2471a3408677cd376ed3a8c25decd94b58c80645b84bd50765fb322e2247faa", - "c7ac0de311e80ef1f4aed18f41d7ec67aa2f9d5f16c696594fb8ba53fe4abfb8", - "a919cdd885ec188a2de1b640b22154cb376fe8bd2c77d351c28843fb5e879179", - "09b8791d754cd9e2eec162ab59968c71f7d794116ff837724e87883fc55e0f99", - "bc6d28c835bcf7a380c975f98b22a41283075946b9ad02811d373fc8ad514cae", - "fc9979563382e83f60d1c097ae248f3e8a7f2f02d0ef0d09ca2fa302f6486835", - "e0c733ce16da780730740517101ea436e3e4eefeb7652839795e2a6f39a08745", - "b83e73d8d678b638ac422e6c5e224e59843024af4dc111ac8dee5c6207f0de4e", - "f0575e5118003b5af81e0704b9d6d6f0a21c0679658ed8eb9598c7c707bb6bd2", - "8932d981bd4143955ddf36aa4a0b572edf669122dec7433387cd09bc0d466827", - "819d14c64d2d06421065e915afa32106b47d14a38f8cb9a37465b234c63a3ad3", - "385edd842735e6e773fe99c44fee9b33c6b037fbdbce8e04feca200473ec62b4", - "3000323b751cf0694bd0712b542f7e8e87e60c432ed356da3dbbdd685e38b4d3", - "646ca37ffc5e94c97645e8fe8b44969fb51921f7c5b40f4bad5603b322835e04", - "5877af98e67956697dc2f9d71fd19bbc5bc595694e00b24d0ec3bae13572744d", - "c70d70028613cb1b1980697bbc8c254695590c0aae1ba15214b361cc332d1840", - "7fbe11f87a225bf882cb5e45f524f4d90504e1b41aba18ee17ea1711a42c89b5", - "e1adc2503f8d1b607900e9369a7a9b47871dd9ea9915347872894834b8b7fb7f", - "f0ebd862390729a59c0c5dfa86e9ef7e76587160655976e84a11988c3302b7de", - "34359043585210da4ed138abcc62abf671dc6aa7529054774289cc96c4e2336a", - "2c874e97f353aeaaee91acf9fb43f14c8c42e14d85d1efe3bac708dab0832941", - "aa9c54208a0a1055153cef1fa06a3b6fead10f65ce79f52adc629c0b5ac88c92", - "d56fcfbf27e66e696795568f4ae8347a2502abd8167fa6196c147fe5105435a5", - "e34849f4904a362d33f8e3e98441f40dc5bf9e1be355668fae2613e1f97d3e87", - "ed4e5c4ac6b8a9a92944c0e9dfaf332c39da925194e9f65694dd55a61efd9e60", - "4764d29eb170895a96b28e305a86e24b53cece82456540323171524537d529c6", - "fd60d80309d339f5f3f0fefc5221bd7047a64e8efe5a4ae19312f713b4f049fc", - "188feb17a290e57a1d76566855ca0cfddb120bb5624fea572cbf77600f9717b2", - "a500f6312a51c6d40792aecbe1c017ba45b6963292c517f2bd61be404c9fe86a", - "895a74e8dd6519f77747ae84cf906427e37cf83b3aeaf09b793de1d5c3ded0a1", - "7dca7dfbc5b81da62086bc0e211466b7555c61bccb3a83244e608bb9e4e41094", - "e341c8f70e35b08f08ccefa84e11c5ac60c683216d21f1a57c4a7cb7488ffdfe", - "4cd2638543e0dd30925c4b323fbb446db87fa2b2331e8cf03cb30f0a806b2ea2", - "68e05ef3662bf5296808c04d4d905cd81e6db88d473e4f2b1cfaea38afeba539", - "e62fb7ede44fc351f76b6e16bd391f9a82fb2e685c6b06160bbb65450d581f33", - "b8032ab47a98d1ae6374d6e69ace78e70fdc22fee4822298fb16bed602f383b0", - "63c133204df17d605e0a04966c056b6aaa27e440e952b6ea263c71646bc312fb", - "c0ff388c42f13be89646165f505dfc0db0739d7ea2ff3a59321425b4cac37e62", - "e3b4c7067408a8356619a0c6f65a823b0f6e4dd88d7d7bbd84e98e396a5e7d84", - "ed14337a9df7ffa9e446e0d983a01c497044ce93fc37b3d3148283a07d85333a", - "7a594f971386e1e71cb14591b339c10f292e25394580378963fa7576c0927ae1", - "70cba59614b2898d25cebe8d37abb6f5afc212d1b70b9c861f43dd7f37bde5b1", - "5cc566ed592d99160f47bed72436d3131116eb7d35c8eefee7b36ed4e1c66ac8", - "c018e7a98aec91ce805a7df1d1636110dd9fa083eedae4f4b4dfde2d38e4695c", - "48606f34ef95b440154809510f0409279721f8f29e0584f5a1b9917fe8e61bed", - "f910c531b1e1b6c47bb04e53c55ac3157b356c601e8d84d8f68be4479c3885e3", - "aac2df3943346f53c727ec89037dc59a71ed04d68d388bf6f72a8f7a5c1b28b6", - "509eb22ed894a0bacc680668f63d1da09d75edaec8662dfba5a1a1cfe050c85d", - "a1590aed61106f8eaeb1eb1471dcbd481c2f32dcce0a45d8810c886af533d5e8", - "204aa0c8fcb16266582bd79b1a8b11bba8b16ad16e749bbee69296dc3dfcb163", - "6338014d1be7b361749e42399b0cb80beb3fd214d27666f1f00d0c073173b909", - "328845be781b9d569df4f5ae247cd2c9aaf8bc0edb51c4008cf77c7b9549b816", - "fd1c1d3afd23a3b258c452206bd96dafcd69a216d2d55c10c59f5c50cd411470", - "22212586d7837ec44c3cdb87d89a5fb2e41fde1a34e2184d755cbbec7a4ae65b", - "d6e42cc8b1c7a098af0df2fa28be59a31c428660f190574efe71ccf122a18108", - "6d2efb998f2326069046e2e97a363c6c09d93bb5f4b175adeccfa97f100bb5fa", - "ef78cec657593c34f60d0572c831cbc7df09fdd0105b48a6afeb18bb4a7f0e3f", - "bd7055aa3d7d31e39daa3b10b5910dab19f17e539402a96a22840cffffbd5e6e", - "752da9d5286b07471ba0fcd862677b968a536259bd4598994994ff1ad8508958", - "6972baf2847b690de5a7ba37b7a7a9f4655eeaa4bd1dbe36dd4539c1e25a6455", - "3185a001e2c2f26c2dfa2e68fa6e027a707db00173d6ad2abf8975da31f36a98", - "07d308f2f305b875a6149845ba0e8c8a70514d69b055642a92c2f05024a0cf33", - "c564d3e1a38ec44e35df59985be18acdd547b0bb669cbf73ba833e8dbb09d81d", - "2e21f5f851c11768142ee53eba0a7d5087626410082ba476d8814dd3ca14ddc1", - "5f32fa09333e3146ef08635dd013e0e0be0f43b78bc9373d1115b6cc2179a463", - "ef55ab978c58c6adc26fd1a2a603b381b27c2ae2dff413fa8f4501dc25d421a7", - "595a8f3ad3bb9cdae2e4a466850f082ad62d0de6c5c235e1801f400933ef2022", - "e3c026637d29d4f21cb0938ab3c9c23f8087c3612d6de908c25125b3e174554c", - "7b20aed3343cb4085f50cbd0bac619df4b1decb795aa1b2861ca5cac2a973a41", - "f1d0e2a0dadda420d372459ac1ef14418922c74a2eeddf710fa9113c359c3dd8", - "bc31c6c52ef7f6071e8f92c509dd3b86cb074976731cdc3668c28a2d35c6f11f", - "508c5a2a59c7bcb90d10cf13ac6994c970060df82b5204ebc6bba2e1ccc7d0a8", - "dc865ace371d0067e8aad5ddae22c994dd9ee95934e249947808161670f487ca", - "a9787d3c85994784dec28a8f9bdd646f303299ac0c061c0bb61851d68734ef53", - "44c4950a67f1aea81603bd466ac87d6db7710f031e20ce2fc5c9144aa87f4958", - "dd4a18cf43264574c94506a1402ea53ab5559ffc3eb101e893c5b071618f3a88", - "479ae0947bdb737d943b6578ea0d3bf52c4620b60cf63d8a604e86fe8a8d7f3f", - "7248b9b934fc6fdf15d271b03d7032d44d3e2d34d70b210cf94a008195bb4827", - "d50c209298d2f15703951dd634ea3be38e333f6eefa837432cac6aae3cf4df06", - "1f786db8e523ed642c62387325e62c8775a436f6c1ef6c56dc4b99e3d661d8d4", - "498cde4dcea9936fb68ec7da57ee583d5191fdf1fd7074defe0fbe15cb37b40c", - "20168c39dd4c794703f124ea06a9b47667a3954839b758611bfd7d825e2732af", - "466be11fa95a9da2b1a3e65edd550284e97022206b3aa0340f134f7aaa5c96bb", - "393afff6c6aae55626180454d4c5df39375da9f1fd8ae5089cb5ad98b19e60ee", - "7200c27f9987c553e592f649c311ae79bd07052ae3edb21dcc84dc594f61a784", - "6cf8290f0698d3a585a5b7dc4470151337c662891e062e4375271f97fe336784", - "9890ce50565018d2202259d450df9ce53c08434a239169a92befc04a081859d8", - "3a02c71ccfa518121068563220b475c31fff8b83b380d1fca0fe0dc4add34360", - "72778dbcd78490d09a60f061e6864b23f12f05023866fbc89e7efd5ee2c5cd8f", - "f834e71ede7fc5ccb86f2eb6a261484221a7e2f36ccd5e65ea31bb4e2e6a648b", - "ef713ea5e7fc944a24109c705e61c5f00f13d22890571a91c20bda31d1bbbb01", - "b0bc1d6d719946c33625e271ea2c0eac63014f6047f6195d97948858b36de5dd", - "e84108d2ce07edaee5bfd80bfa8644b99db4478891d16e47e73f790da4b605f6", - "79986c600b7b16d2a155488be0eb2a58365fb87f329490d5195cf9aa43a3b77e", - "9631ddb5a2f5eb45eee3774cdb6e91ed4d3fd382324407eaf2bfb67e722d426a", - "9b4d54896b0685fb531744103640751824a5db0bfadc53055f1b395cfaab372c", - "25ccad688edc749f4e907317a55e06e636a6f1536829ffa1ca56067db8bc649f", - "22b1c632976fe0ea23493d299c35803775de3e74b7982e19e6e37816d04579ec", - "1fe4fa497351876b10a3b98d605bf57722a2a4b92c04161f337f012fde8959a2", - "f7889b669ab97252cefacdfd3c87a6e2e9d9528dee3eb110d86ec65a0056a225", - "b21e8c29c0967201ce0ba8288a3bd65434905812c01bd5f84d94879916d45902", - "7f5afabbe0df0e50310ad72834543a0fd7768728d00e3d116dbabb77d89836d7", - "4be1187dbda11f1c8769f585057bb80d0e496c7ec817dff3154739f3850feb33", - "c6e3be9c6dfc12744b3f4374f9c4f3f835e97e00f40b1ab82f1a5e1072ff135b", - "b4d0631ece7666baea7cb95b1507a0aa32e14fb324c14038e1e01867246eb9fc", - "08168f4c7bdb4a8f51075a9ca3634cb2872f9d62d8fdd213de25d40b921dc933", - "638e971fa11bc81a06eb41438b714042f3fc58550c0a91f9930e54e2158f4bf4", - "43e928058893d3b04db9d325348a6828c5c4814b828824dfbd445b4a833b30cc", - "cf1bea25f25af5f9ffc96a83fe42103b82bd43891938738b27310482fb62e71a", - "41f6b323cfe1808bc33c622ce549bea454c7cf53dcd21e82ddcbce225f485563", - "3ff978b81206d85bb7ad85d5c957a3b9a3f0ee203c9a1851321b322c2d178238", - "c10667b682ab5224e3f386e51f7da7d5a0af757aeee8dfe08011d8180d26aff5", - "70f82cb0463f4654e170d793a20bc8756acbe6893e65346676d17942fc7595c5", - "8d0e14de4b0436381adf93cf28371bc3b471f68b3344bacb0dc536f02041f216", - "40ac4d14ae98aa3f5c3faae28f56f507d0fadd94f6058afde41e95846935b21a", - "07b54829c2f5c0d5312d202270f9653fe8e2286734ec52108a837e784815cf20", - "cf2c625f3e54fe3bdf9d31af18043f3467fc0e3dd5a3f290471045243087d94f", - "cc09215a880e0c6f419d2f62e5aa0f88bed280ce8b16222dd4b7f325223eefaf", - "fb3214ecf68d3988d0790a9d8620f83df693e288e1b410b9b0e4e360451e178a", - "ffd5bcffa08bafb61f9e59df56745de4c0bd4022d7d399c30511f86bc369a968", - "767123dda6ce4e00edfb9e5331cd0a7b585022ebcdca19125943f9e20b95ae3d", - "60b46ee90fe7682da2737a9d278991d5e6da9b6297a4d2f2111aa2c796be4f96", - "cf70f17be80d587d7060e5052b2b3509a321e7372ded2eced3ba6d2e4e067f1f", - "4ac6f5f68bc7fa83813453eaa529dc990ed6772a13ad9562a829f0d1abeb078e", - "bc9421cf1562e9c4dfc4cde6137eb8098007afddabfda520b52a984b455ab2df", - "911ea3f850dfbb68680cc236572b2d9cba0e57c55a631cc69681e26fe0f621a2", - "b82eda88e0920a226f7d5f743ea953162ba3f35ce73d0b46bcfd7d6443811f89", - "962b79634f9eb6e8e452468fc15914cfc182a566d52ba218fa1008d6b31dffe3", - "7709e2cb788780aa3167cab08eae89b0a7d870c70c611289fdc41a5752474adc", - "21f73f2d326cc20fb233591df33fadbf84c6dad9416ddd9dbd6968b0330e4531", - "3572b24b861dd0a240cc56dc7f3d768bc3e48ebfb6d8ba6b9270467161775c73", - "cb1a23e5f4120af45c473bdcdc0d03293841e2946e398e6289907b7dda59f9e3", - "5557f7728759754ebedd9f1876d4065077d0ca8b97cbeb2f190621d0595fcb25", - "4bc0ac4b3fd18c7a9b13fe17ffd7067ea7aac578b562416ecec2df564c1605c1", - "e77d347056b922abff72ccb74f24eebfa2f1782ee1abf84a9f6b3e3a3dbb7823", - "fbb0534d577da567c0c728f219c7cb25527b212fdde48fd41f1febd91a6dbdbf", - "9fd93f3cb057ab97a9b48e50f3504e84822f94d19bb622e5820045bd24dee168", - "3423267f18ac1a7fac4881552f7db609e1051cc9cc38f83caa88f14301855648", - "bbebaa4d6abf70d99d115fc564a0d4d7e6f0892353d4d8153983c90e06e2de1c", - "80f00d3095478802413dbc19a8a3dba77e7d2a4d6e476cd3d705b60506879f35", - "03a035375e6636b1cdac10b33cd44b75a3b6e2a259d8ba39bd7ffb188b8eed3e", - "714569aee76422f890f377f96d9998a3944ba99dd95e71379bedb8f852e690bc", - "f6ac1028769b44ef494cfe7a8558a60bb8568d0481f002480f9ac45e86a05938", - "2c80334dc0f3671674106d5df8380f8ad7c04d2b06bb039144c00ee7096a5ba9", - "f7d223897ea684d76ce0dabcce1456af5136c6a8afcc927096f1a05e4aad761f", - "91520e1ad35dc0d56be39a8ecdc30b37cae135434db3dae46b6263d7fc13a2e2", - "3f079032015e72a7c50ef497e3a6f8a9dad634b6e35b285010370be2b9b69f16", - "9bda1b311f2a54bd3d0b8014d1421b6fdf2194eb80c24441ef7aa17917b2f55c", - "3e741653e40bae9ea9180fdf1d4e0c4df7203d2c92eed1cb5e92b9b8cc36044d", - "bbb055a42ff16ee4f44a05efc1df9783b4ed82313523b29512c2128589cc1dca", - "6fe73a2d00e2cdcc3a58a63930ee1c667003bd4311ebc09d7841981304cfd930", - "3e09c4de6a413b8b3e5a8e575e4af9d9dbf59fe0133e55d1cdc3f00cbf66f99e", - "2d2f6ab849a25f55c7be5aa925b87fa4ce20d53017b28a8f4a5992690732dd10", - "fdacfb9cbcfe30cbb032441a190c026feabd67b1da041b0651f793231f8acd34", - "9fc385c4afe3f06c07ac9f2d6441b51e8f40093fd77e65b20442c3cbca3d7e56", - "3d2d18562c6f1f3f103339b5a96c19e114388b54dffff177d3025d5cb9b22cfc", - "fd454961964b465370244e74ae2fb7721728e8bb48c726212c76a46363cff60e", - "a348bbe4c10039d5b2cdaa4d84235e457a1bf0d9271c08586f4a6586e7fe81ed", - "43698615a925c7c7c109b4534ccd8202098e6975194b9f1cd135f62ef5827624", - "2ade8cc3c7c65753de7f3f37182e7d5e027ca2fc0baa0c8ceeed4c11ae058f2c", - "78526ac923471ff061b352a37dc8da60e8457e1bf49b4e8255af952cfb65089d", - "e799966dfc18029ed4ba1aef1268c248d583241c30155a59fd031889124b1297", - "fbbfed6162862dd82cf5e9a0008adcc27d5a7ebce09bda7e417501699032237e", - "0c2a6c3b90398970151a1833bc668087c4795484885777b8749c4727155ca2f7", - "0c6ad1f54e9b2d076c0b9838c579a5f66bacad7f7755792219eac3793592e6b0", - "c8f99ef8ec2c18e77c2c7695092e1d59918d6eab7d2b35cc2832a449179c861b", - "a54ecc638df221da444417dfbae13d5166bb04886cc82309892b3aaa1a5095db", - "743059b1e44c75af473f30e8b0f33da15405b9cb1fd23ff84c3df2ee34354410", - "c172f1ba19aee9bdfc04a85b6d35547a617d1745d2cdeee80920c2548af82de5", - "dc3993cb4a257f7b1763353b5b1985e1fd5492a087eeedd2f60e2e6a7a3ed52b", - "54ccf1ca854fa447d8f826c58eb17dd52e5410d184d4243bce7bf08f38ca3a45", - "131ab34c8b3851e9c8cc6d9b530928c3dbff21d16772f3ecb2600bd323e34b99", - "6482d7ee1b15bc573f2a47e96de96dfefe7eae8fcc3de539f2a84324c1387162", - "8d2617868453a94cd0a8fb51dd0e3da9df5fd60dcf5404eb273dabcee9e8a088", - "c5f607cc9913766aaf8a6f0d30455fdfcc7b68c45766d23d96f4cb2afc185deb", - "cf609c7b422eaad8ed8d91a2d50362d959a4cab21246767e605da3f4f8e37fd4", - "9adacd1b23b00d9bcfc158504ae0d2d4940566620d9a52655c03f6648e625117", - "2a439ae1a0c2f5d653bb1d786811169b3f6841dc70f3e3dd6cd22032e7058410", - "5ecc2aff6dd152c4a01b312ca65a992e1972f3573ae2b5450c6aeb56983f9ef4", - "9756d10777404e44351be00cc249001e3a3442ed070d3fdc4943e7a6e8be4c9c", - "c659497321cd73787f09b207372492e2c1e52f06bd7164e29a5e1fed7752dbe0", - "41b7096e60b9b73c375953fb1ce599b639eb9c9d0dbe6968d10aa3766074e53a", - "c368572865024d6f256a6d983bbcb1054c667f85a13fb9a568d87f3b3368e41b", - "5bd9dbf8b1f4ce5e040ef7c4fa4b27621a331896e3804c4f80b5b3f4a93a43c1", - "b1cbd2a05f4f446b227d1b7124d98c950497e3ce9ef637aac0a3773a8fe22dcb", - "bc8bed39c8aeab0056cf645a68804211fd4a53b9460ed1bf10e4872208c5b38d", - "a64caa41627cb5446ecff25f42b2a7f68f29f22cca6be2ff730272aa6c446e87", - "24f1412e0ca257dffdae5c5781aa441395dc25785dab2eee3e09c0b58081919d", - "768ddd796e1ed9549d9c1276436138de3cc9b7c1ad20b6849b5c83b5d161e90f", - "2dff0f51ba95e36725a7b097c9b23d8e3bf8d31594de654a62f15d3e22dbcea9", - "d01c87219b736b17933a30c7dfd8a6e67373edc7f5ef375612b3190a34f8baab", - "1efcf3b3d281271a366eed9ed335124692f02ba8f8a589f6f78aca189430704f", - "c04eefdafaf06cecb1e3a91b5b2bf2feb0f1cc0e64769a790865c0df9e318df4", - "654fc431970e45876c18488ab8110df5286b64952faaf0449923855beb445da6", - "2e5e418ed984941091a0d3f529bff467adcfdd2ff63b5caed4300ec55e817c70", - "fe6569b01cfbe5f3eca160361f96df01e4e66648f29aea2fa100660b388295a7", - "ce01e11f08e3deec78e37a7e24f75d2473ccf56d5e2b025c70e6c0308c64e479", - "e9e98cea440196f7068da547bf3fb50863848b8c4d145480c76f4954a90e340a", - "0f1becaa61588c674f18a7a0ccaa3e1cf2ca3c28d99539a871190600aebaacc1", - "2f3cbabe6e5a8abf362bb5bd31e0059b7ad5206269e5239f0ac9ba8bfba19a4d", - "6d883e257753023f618cd67a448e65ca84ce223b6101ba8c0cc24b413ca107e9", - "b3cbff872cfd7117a393fcd081b888bdbbc7138e721b1c8634a833703d964a0b", - "e2714b46f8d121153cf6af24cb916ae5fdd051b06586ef15813a8cc86dcd45f2", - "7ef04fc65f1d6c9c13bf159690634d903c4cd76cf9dcdbf9358497329ac97279", - "712bd38bfa89513ee295d13ed2a1f9aea82f47053ab14c72a77b4c292f5776c4", - "25477e833090b707f6ca0df5659675e6c0c7b38a5d0dbeb121602c9a3602c35b", - "e7fbe2e14267011daf3ff35562d2f0dabe38d313121da83e7abd52e57f7acd07", - "c7266b73dabb23703417d9c6b683d3b41a8196dd8f87e58835d97673eb806d9a", - "976819014a88e7ff1f4120b00347b6864dd4f0df7cf5049d543a2f917a385940", - "433cc6225fc5fdc48bd647050fd3054de1183ac1f55dbaab97c462a4234bf7dd", - "3f7bcc7542c5ea8817c744eaddc10e4b0c7af57e0a3fa25945393345c939f3fc", - "2f1184611dd67856da1872fb92684959cefc19ee05f90ee33b88bb6fc137abb1", - "b80b371f89bcc1f4ac4e01024d4bba9889625a91be17fed049b5b78bc0fbaae5", - "36c54c9a239460f8c05ee4fec3ff093a1503ebc53605de7975953783b69ae168", - "7b5df8d6827955f0646182bd190b4b2d65c9d762f1dc14654a0e743a8e18ea1f", - "a72d18899eaedeb8ecb6811d69144c7a75c5b4f3ab6843cb06778d5a65765251", - "fc3ae3432c54b7de9431d0dc1125bad7aaa4a8fb930a47af9bdf588ae12ad9dc", - "4ee4a9726cdd6d5bf82a511761fd8228dbdd6a09510dae51e475ebcdcf5bd646", - "7e514879606962e5d63d53885434e01b6417d1b510c12dca0b56dfaf08752800", - "d9fca6ed96b45f61f79fae40a5b28d3e9a7685d818fa82869c8900d4d658d2ec", - "ad2b3bcbe6dbda3f9eee1303d09fb9f0c250e29904202c8ad2587e59a740dc74", - "d8240f0ae56e6f56f8d9d99026f5c9d43d6db16f615facb8d931d5331338eca7", - "612dc181b5ac441c334042fb67ea62286c76880ebcb12c52e60c4bbdd391da90", - "6a71b02fc625a9c200520879c66982ff0d88eed35967644090fd67a7b0dfb42c", - "893bcfe26f831d6b82cbd3e59f303f755c89be9da1c9a11d54b310fd07f0362f", - "0d6ea69666d45d151fd836ab86b832b910a338767bdade3a22f1d7774f497667", - "86d79cafbf21a372a9df46d5e9475875b7a589c349a3d896639f147b85dbed71", - "5e2dfec4e5401592cc1c8e342e201f5287faef8719afa77abe7718bb5e1fa75f", - "c47f033eef1481f402b485e03e0ef579e15eff816ac1c83364a0281c6261fdb4", - "3af28e776d8ec01e15d76aa7ca070909461d0a7b8ce7e810a558a0ea4aa967e2", - "cedfb8c576f57184ca40386f428fff31f95c7ddbd8f436c1d1ffb56b7c98e19e", - "6594d3850db140a2b0b765d0ac7b36eac003d7f7521aa2642ec3382bfda6fcf5", - "f2940a84c428b85f748c1afd02e19678a257c5dfd5f7f95eedcf320b716212ee", - "b501aa6d59c5d7be95fcc014e06786ae9f1f3bd7e850006553d210b1fbaaa816", - "d3a61732719fbaa572eb35d68d8e44f22a2e2ea00fec99dfccc2ccb59131f66e", - "74cef2ae106300b9a8cdac88b6b266f81507c9057c95bcec016e3aad8cb83d30", - "a903d3712a579df5199ff60e6863a6bc085cf4471c51f97fdd29de28243bffb3", - "6e6daa4a4af06c6c8c870db5830f8fdd87efc6951a2cd7d905aa53c309dafa3f", - "0868425d5126102acae0d1c8f4aedc200da6fdad3a5286c45c36b98e044bab99", - "22dce836702200c98480db1d0fb07ac748b0d0e9e31a4e8f28077ecb6546ef24", - "c58523f451e4ba94918c94ce144da32ab113d163c61b4a6d96dcc838bd58dea3", - "98730969f41e03ee9a5c6c7d97163d0ee6d734869b0462daaf3e76c88e43ee6d", - "4ded347f487d7d033a6a14b35bd9ead7a29e70457b14c6ea9ee1d51891489238", - "a73b3413480693798349c99e84f92ba4ef1ace3bd4f8faf35d5fd0af1215584c", - "eef67f0f1d1ca97f1f17467550e7c43afd9fa526d65170d82db90f11b86750db", - "8fa6d420d953db0d7d370f477daf61ec29cd892b1bbbbfbd965a713db3558d77", - "aa4d426dbdd8476682981cdfc25846e244ad7499e17fd02ecb28fdde4c7a381e", - "b82d411e5e20210beac9d578b1d90de3d693b4a94a56617effeb35e254e942e4", - "53c1cdf825eff5aba3814b9f1d5c0d87fe232160a53259747857865572fed07c", - "8dc57d60701bcabcfd4cb1b0dcbf8fee0faa21110e169895bc3d1fbec4b9b95b", - "170e5821656f7ce2034504e3e821b2a030858c733cc4cf1911bf209dfef85692", - "1ea7f97178da1f2ef4cc5d56f4709f1d386db7cf6aeab458e67319b0916633d9", - "da08b01ea984a245d1e3bf01abceca398e4a4459068a3c3d9cc229944f45ee51", - "0b139c56b49458c7918f6ae6757a1116365c14a82869c02e7ed4789f4bd26054", - "a27f3769d439ac4388ff5f3b2888d4ca72d0f38714405e076d941a6a2c98f6cd", - "f58dd27d4b5fcd8c232ea88db56eda682c62f774e8ade5eafcb518c1d1cf84fb", - "ca4b62c05aa573beb5786460f721b3e9620e31b80b9da89efaa6d639159355b4", - "5058314937e775c0b88a2ccf545b5b3e64eb571b0cbe9324b95a29a23b3c6aff", - "af563ba4bd6426f072836b457324a30fd2e74a5c0cbc66258401bb955f72fa82", - "4dfbab800f62b7e050fa5d5ef15c36a99fe8a606be40d065e45d092df9544026", - "3bcb0f0c2b1b73d08a732537e2af06c00bbaf735b684c532ae9655b887fd89f7", - "8ae21246e7f016a8bf9fbe928f5f690875619dd7b4c02a83aa02ce368fc274f2", - "ff125e5d9b8415aafcbb1000712938f0d10d41a570f8b54b4612a072a755cacf", - "d8c79686551d08c63c64c158b3036f04a78d8ff83015820181c591b87504231d", - "66998aae93111b9bf0a824773b216bb415d418fa8b948fc26dda9c4c37e27411", - "2668e883d24fcd8b164451da086c28a1f1fb0aa1f8c39efdcaf9efefa0dd3821", - "5e0edd908370ee60a498309d95c4f8408b5f42ad6211f55adb34e6d2aef8b837", - "8ceb540043611a7b0946ac0c7cbec8647242df79b10e45bf40ceb7c56ffaa851", - "e0b799af182e9ab57da992b0826d018e8d4dbd451ae97d2c1df53f6b616dfa6b", - "6b3b949fef8f3b2cd58e9a21986e64939d0a5bbc9b8828f37195e4614a0c2287", - "aee1ca422684ca515c61714db626ffb8900f951d68b8686cf60e0c02ebf73896", - "871b3566cd15ce238c77caece3e71a9a23f8142f1f2027af0c85929540caaf10", - "4ff1570fb4180e79fb21cc2d34a8ccc2467ea384f7976ec57f3beb86248a567b", - "31373dee9dc3cc7816ea6675570f350ac1b33883be786629fc35a68e57a6da59", - "44370d023d3c0222f183c81121b050302546f0ed47d15715f3c779d2993a4bd8", - "4a6410a6d6d696e097e3aead06bcf01a560cfcb13723e91b8f71d273d65a393d", - "ef3a599744e5db3fe9858a4890f97700b4031d421b3d8bc7f011aec4952ea4d1", - "ef5d265499133fbc23eb5953da178269c77083aafccf530c29e3b210db128520", - "d11edcfbb2a86713d5ec01e173d4b29672a98df09e81adfe2a476f0ec341e42f", - "5102e9a3468969d495d34e3e063c962f63b2bc09dc3325c45d401036f690b8c5", - "6d01c3216d1ffe3c0f657d526a1bd25281dccfd256ff543d298a0c8e735bdfcc", - "93e7a3939062e8bea737bfcc55715ef05f3e3fe6d23dfe1a2dc3b4e2acbe7a12", - "2dd9f514dd9f88087ec1a45b4423b3f59680692ea197197816af8c1ce1db8aec", - "f3c177d41a314e88800ee5a0a9eeafd515f4ef66677c616316de170bb99acb1c", - "cbee18f8eaef85b9fc59f945782982a806cffe97f02b67a997e3e45d9b8b265a", - "afd1d271cae3f42873909595863beefdd0052a36e2eb2b95ac01a0a240ebd8b3", - "99b39dca61b181bfc75de859fe98410842b8f85180ebc74e72d03a3cb072b592", - "4d09041fe57ccfc49a9f51b7b1f1114cd0dcd3a28850384b2365a73f93bab558", - "373f398b103307a6d5d99c253c6e82c3fce2443c7e8b3646ad40d562cc67bbb1", - "4523c2ffdd5782a5adb65efe77e02f444462c74eefe917fcdeb496df97e725eb", - "a5227e5c9e092d12971ff386bd93b0d48e01ef420a9f3db8e2bd06f5476652a9", - "911986c554256f564aa70b6dd660095178fd644a9f7ffdcc154e8557be994efc", - "6f2ba54e5737650103b082e002fa6d6d9a0ee55bf6a9cc9ceb80432ed4cfc5ff", - "f58656ecc56b792a481beab575defa34f40b73c41e72e05a39d40a55ac509909", - "339d474e27545f2ecfafd7d02a9a27163ea54cfde0fce58abf7cf66cfbc45fe9", - "7cf51d96015bec07d7d7ef20ed8f5ac05a5064e7c7d8951c9ac29bdad6f07261", - "018e34bb2ccbf0e31e628244ce58b0a4a5ae7fdc38a778479d096cd83a9118c2", - "081b8d5cd288f299618d06cb5654e339642879833748ae638e9f97d289aff577", - "3da65d3a8e1a682ea448db701fddcac5d02333eaec3fcc696c330c7b6010147b", - "9f0f778122103d385cf78f5c90984dd81c13a03812e6dd3f03ab3c35655bc9db", - "0db1e045ae7999722a4f6805af45694250a7316d2d64fb02866b10c9ea736f7b", - "ab545fcfd3b2fce3cc5b9a89cae803556935019af462eadf19396a1741a00287", - "07e7dd8fd89dba2c6f0aeba6ffd1e61b785f9dbfe017422d9745ec9203813f3d", - "1052e688c7e2775b43b914e3f2a1d9c302addc4d53ea221ce4eb606f4629020b", - "23b27e3cd72a186650a4a6f4d1ed591981ac80606b2e49c4fab94c08c9a12b5f", - "a220cb5e7a6844b6df57acc0ef6fae8e997026cdc753aad251a456f1da0897e3", - "52a7efff6575e5c366a6df2d339cb789f36905f823a9b283f5ae99e183c5fd47", - "88767e9e898006a6a75d7576b5fc227eb7c8267692fa2a56b61bf601ed00cd60", - "ab721eb2fc7463c7a629c7e18bb941591c1a6c7f1c5390c520d4098a5de40215", - "f3ac56f30d16d850edc281d883af6098294e8eab8d044b5f4098e85c0241e0b9", - "264011862c0336a835270c935b26657297025b7dcaa9edc25dcc1db80db81046", - "69d484cd538627972ec2f29971deb1d0ea3ab213f14c269b414242aba7b089a5", - "dd04e240484db8c12d67cb53848fa79983adb71baef097f46b12159242e2d39c", - "0fb14df204d5c7a985f922e177839d9720438585457555ea5b4832712f18bf7d", - "1bf4711d04394876335edeabf48d5cf105881af4778f62f567ce070fb70a4c1d", - "b8bc58c93eb9aef8d6889c6f7ec0e69d38a5ad361ba58156ab10c2cec281430b", - "0615521e853bc270b50dbe7f6b911b4c7c93ad527ceb357e63b833b70a9723ca", - "32ebbe645010a831bb83964cce9a195ce399f1b53940b0aba2537b9726f70a38", - "348b610935f2a89e87c56bb7934697dd44720972879f81f30d2abf55134825f7", - "6d633db3c42e4b5b8246b09deb311b0134a5c25df9b141ac66757c69f5769854", - "4a5f6925bfaaf9654d14fcd866a32b4f1c306050802e119a590c8d0cfbfce289", - "6b9eba2d3c1e5b6cab504d4aeb72f8497a0fadf6bd67ac8c396d7f38d71295e1", - "234951f34cec782633cff2e3334d0b2d44f4c6da8fd48117653f69c884eb1015", - "25154330ed503839814287df4839a58785dbbfb9b6cecf862da9a2fd6d0222e7", - "ef07d28f9ad1670d3f31f0f1072d63a35d27f6b9d7865486a5517c9c62f00af0", - "27d9cd010e360b2ea8fe009e8c3d91dd45e26525512608337f30ce172cd7b4e9", - "aade10a03fe9ae75ffae4b0f745bca8bfa30ccb051343c956e8a04409987348f", - "2c4094593e41379380d88b59859d85246646e1148de22e85a965ebe4584183c6", - "f7e850f7276bd6c8c421dac352fa79e9a3cb353b93bb2d5b522fd53e5e90f8a8", - "a20a3c97455042b7af9be8870b46dfcbc9bfc6d716851e1744395622903e61b5", - "8f7ea9caba9760e0961f5c78ad12f34443b8cbf0917681bcaf8657d57ce0f3c7", - "cf5d2ac37123a8d4438655bb4b40bacb3c040e1f13cd22c865cf358e935c5ed8", - "b615786ed81ed96e11f05a325f9d568fd7ea103eb128bd8adbd4407791c152b8", - "7614560f43692be9c4ff863ed35169b0f92471d084e0171e66288d0eeda88b49", - "066268d323b3c193601c64699bea7efdfe90b294de88cba1c4232e4c0b9310f1", - "a3acca1c8c13b136f320b265f4ffa292103fb7b9f59052e6f57f56e9cd130624", - "39b131350fc4afd291a0af97fc85731cbe41e22ee1f5d01caceb7a11f6ae1ccb", - "ea6d35f9310baaec4e3060495f13590c6652918296c1d3f0bae2d4c8c6bd9cee", - "6823d3ba8c9f3590c75c64a071e197ef30b4536b78db2ff60210e9f77251cd3c", - "e495219d2eca53f11cc24570875252605e565b851562ab7e7ca7ee9dc7ce10ce", - "ff9641783b8f96bcf09394f185a4924dc8def2e3a2935ab98c7f5997c4fb4e2a", - "6fb3c1661a896d8f4f2158e9f9bfdd5055530db30a9462fa52b020f34d92b1a8", - "90e4bc01b6b0f684b79dc01adc13334799750c093da3534a297ee868e8c48a70", - "3e899f1819a2d503a012d63022cb4bb253cc34ead0032cf584924f784d0bb9fa", - "0c4fc77e68c67471d60c2a1e11a85d0aef979a73b328d1334c734a466b20c725", - "6d64ce09f95f300568d74b2c55e148569d58f8a9495bfde2b03cbc5a109e86be", - "c8d5b7655e75dcaeed4698245de4fc7844ede413bd57c15fe29b7fe3e0670bb2", - "d2c7ce2f78ae0e40a50f655b690890c771ff89e657180ec80bcbc2bd589b26ac", - "cc64c434770132ea5bda2043fa29beefe76085b27d8f02c45848efe4caf9f5a2", - "792d1785ab74967e7955d31ccdb1fa066cfed1d7a02707a02bda677aae31aaff", - "bf6ad4fd235385903aa1fd0943d09a7304941b134f6e203f526b809da150bea5", - "5960c2d512b29c08d17cb923e6f2dcd5f2f8b388fd6b31a5024ad2cde13473f4", - "9560e8edd5e358f49b2d42f482a5d0d24278b8d3ecf481f4e8d5da804e090f0e", - "f100773748f0e9a817cdf1efdbacb318547c87b3e3a038c20120e41f2e91a4f9", - "bb600590b1bded98ab2fee481463e59bfed921115ee3afb55e580e1a1c77a001", - "ce8e9c391faaa074eaa5d3cf3755751be46f062d182a2c18ed5d73132811faf0", - "a06bd2fd9403fad5873992cb899a0df9da48acd03df0cd5dce12d650440d2ce1", - "ac3b912381ac04173c4ff1c8de6273d1ba740f866306254491fd74f16ba30f82", - "79be1a0324eac08771e2e1dca4ef756fe82dd09b962112ce4661a451da337375", - "8d298112091e92cc8843fd43a5f622a2d4bb00d8e800f29821d68128f842caac", - "910881a5b70a7d6f299e603126eadc88a848ffe90b497109c56a814b1fad080d", - "48cb4842fb2a3af877ac387f4b47ac3f36173af1df27f08500ff37b7967873c8", - "8947eb8714d57ffcc9ffded87f0a7e57ed1601ce75f9af80eb5df7601512281b", - "973f665b9a53f6de1d3e4e4ad8859de8053f2c90711fb3ed53a2a082085ad6d8", - "ba59f4b84bb8ec929e63be1e45025b1f1a489b5f942edbcc3b2cdb476c804a3f", - "d13fb8d57f3090e266e56f211f98e81ad12d20fde8ff3cf7d5098a90fbd94f6d", - "6bd35d294227ef215537681bd9c803357639fb68a819239aaefc2379822a894b", - "abd076ccc71fb4696e0ac2d4a2025ab81042a20ebf6ad327fe4ee8d5ed632cb2", - "b5016d445c8c51ef5a441fbcd3a160384f276b47f926203bf38d0bccab0d0efe", - "c228b28f14a0e6162d47153820253805c9cbbc1072b49d69d75fbb8ce401906a", - "cccb90aeee52295d1fc5fc5ab893bfe27935c7f5a58e97fde93de57329571919", - "0a1671bbcc86667697ed453b1216f412789fae0d3147dd34ee0f96140118a2d7", - "eb64a33ad73169c520a25b55b4667d6ecd1e8c101285a41dffd9791bc94cfc68", - "312858d559eecfc2b77f68607a87185b6cdf9dae695ce5aa938129326bafe9cc", - "7777136c1a79a86c117e27455f8e7b63847349dc52680e7a473610919e0f1162", - "d4f0be05b19858073b6557d063d82e0e00f596eb57c9c60c4bacfcef7f51edf7", - "7dd982c2852093c13a134531e30e1137d49e0975dd9d9b94650b38cf1263a0ba", - "12848265b7eaf005321f5bd04d456b606756f0b4fd9925c745cb466cfeb23754", - "14819bd2ea1ef21e3b38fea28de1cf1319c4ac6a7c8966296127b07abeccb275", - "332010f82ce0108aa09f62733e5f647e8eb77f3dab2cdb66ca5f068efd409879", - "a1f0d82f4ad26db90cfd4f53ad1e36c4b541d8d766633878fe33ad623ebd4633", - "3bc7b5ce476b84adc12e0613e800696959b9a04e2b11ece835c1d96833a6fb70", - "fe1bb02250bbca588e1b53d0c4ac52fc96b3a05a45fbe53330c015dbeb1840f1", - "28184d2f0e8b9dd62cbbffe999b95309f2c838e2a4bf8e25d95c01c6eacbf876", - "de8c69b6eaac6d2b5a50712d9e1e1dc5729b81ba09ad1af6b14ac7fd56b923ee", - "92f85235c89bd6776c14af702dabb0697f8617db24f7a0fc0faffd623f862e06", - "9b9ba75575e882f79adefda3789f2fb207e6b47bb4a790ddca66256151dd90a8", - "0df709dec5893ffdc4080a88d605cef600fd0f368291ec049dfea4c4ed8831ba", - "c852cc1f709b35a20a8400963a1312843ce69b185ffc2a99837c6308e335ae04", - "533d04d387f7dc2be3f089824ad64a8a939b85a518a98b69e9f5568795aca7e4", - "940cd15b5eeb81950a4b95060c88964d65857a7e7953e8c259df6fae3b1f3b0e", - "8776655cda1e65f17db04f8ab895d5824ffc544247ca1fd8cde662e2954c7ff9", - "3fcb8beacccda350750d15dc87757a4fa07fd10cc5c3c93b6ca1a3884fe0f283", - "8fedbec488eb513aa72696b3f3c2908cf2984351ee24d2a89be26c5518224a4d", - "cdde4d8bcbce4190803e28ab4e208e728f1bc7f658277f123d64be3f4dae4b4c", - "9106736da1c9ec16cd03b1680cd55f935dc920835f3efe3efc587e6be43ac753", - "1e0036001e6fc147cbd0e038143e5e7b3b48255dd2a61c059ae5e67ce4150da9", - "595232adc9f1ddb4b1ebf61293a2a3ae9d934e63a38a8dfc1f7d07eb0f69fcb7", - "863d6f76dea57ce5c4abb7c7d485c2487cae44152ae7accfc81f6c5263247a8e", - "c76f7849c65ce90fc71d2709a966cbbddad0f54d465282670d1d820b79836c65", - "5ce9a03ee785c2d46c1adc3579e7a9b73a2d45e4d3f590578990cc14a0ef7eac", - "856062a4e8fef2db2599f7e5c212e272dfb747e6bfc1f7bc84d6898718ff230e", - "ab33c2e05eca902429ba2c02516dfd17eb2c476a08cb2f3cd48d2e0efcb08e57", - "3272f90edeff3de76ef7324a999f8cf3696c683b1b9f8dd5620db99aa580190d", - "a66911477d5d28a789c9b71c5cb08fa74eda7c540d7f02a106ec5207821da687", - "3c1218982cc359ab02bc87322bce0ecccfa76bc8cc340df96698d0cad2e20482", - "18cf8acdecdc360a921588da0c9299d5500a89ae6a754896abdcb3f894e5bd4b", - "6b0e1f5e11d8e052e04875012ec55afb6072e5cc5face517f9cf827e7ef84acc", - "0f66051653186e33e579717a0c6195e2e785898ad0b12df0166d80d127e3038c", - "429ba0c29073ab2c68056c2494e081c827b3a0050bfbb38e7bb80bcc3e9164bb", - "33fd847ecc8ef0b3d2fd5fa126e033c7f9fd229837b60932a3f8966e7256e070", - "23db9e164d30cfe3fa17eda06c386877385cd9cfeab904c0f084097ecf5f8925", - "3f693e853c0fb0fa17d66c8b3642ff46216a28c64411c3d5ef574c698c3766fc", - "f2cd43a8e40bd2185ce6141400764a1e37b63b2ea53fbfb158ab61a590357928", - "e07f5cbc9755a076da4c7e909ea95afe04d5beb11bcaa7f594db612c838a4600", - "fc4af352046bb9eb3fdb8a00348e205f9046f461b034096f7ce36ca38f45c8d1", - "42de2a284b39f8ce06cc48fa0cdc9e5d78401f6793cd547d3dce39725c55dff6", - "907111b9c0664230095128eedc485f536c0885aea1025c39ce6118d194382756", - "0690c0b90251e973c0d6358566d50079f4d86a9245e2c4dd29518ddee4ae6ddd", - "e02d61e161ea0029903bd79086a9de1d7f3ff7824c3beeaf617719c62199988d", - "83c572a7ca014b2e255b69c20cdd854287e5621a9fd57f81b0fe63e03013a864", - "a1d35af658aa96cad8e2f944da6db41741fd5db4757a399f53d2d7dca24ee04d", - "e6f4272aaae60c474fc4784ac5ae3a506a828973ddff6bf19242ca27759b389b", - "7eeceea7d7e32b46f910c5bb73c5c1e19e1663d7399e843740da3c25b32c1b4a", - "d0c01168395a5c4c1756e742f7fc09c81637591c88231950ee69515a32c6b72a", - "548d206bd8a306424808fafd3d5a70a6c701115959cb1196bfcec78c1317d848", - "b15510ab6261a2c8b83817481f09dbea584980ee1a919093703b6210bf3f90d7", - "ba2e22a5cd0b75cdc63938b9efc8c71c24c1bd3146ce4c2216fc4ba6988d6ffd", - "34111cc9a1838bc95b18f2534d804d63def87d6041c30aa58cea9efe3872a425", - "a9669978da8837ca89f4b75346d98bca3ffc43009000c87e701ec8cc5e7feb7e", - "65509d0368c4219eba90fb77df89738ddc3556f1a956f4c026d0f98e64988998", - "13e6a1e4d9d7cbfd14c0c300cdca115cc39fa70d5efa15c0b0983bebea8361e6", - "26c6bb1ae35362939e6d7c1c99be50623785734a62d0dc269d88565ad1340f51", - "1b365c05f1d7f5409297202f9d302942e9f2fd0b2ad46ad4a44a104a35c23b59", - "ebf76844cf26b15567cd78bcb7c804d54cacd82db6c6d73ac2cfedfc86e08609", - "836f1e81fc1012d7a14cc992324d537bc2e378a1217a95a3488e05516e295c24", - "689f456e0615b3fc5cfa7a6c4334fbd71e4e682e70e7ac076eb713b1e797c664", - "80be663ed4c5ec6b36d82e857983ef404bd92cef79b3aa7bd68d0af4b2ef5104", - "6b1bc05d865bc6a105629c8a1f622ce39a3683a0fff73fda2e3db04e850d6737", - "b2e7d610b24f4680078287c7c72456e05b0856e67482a8228d710f9ec2c53f20", - "1f73a764569761fd4ad51cce7a0aa0457afd4d4bd26bee004bbf5824c8124420", - "e36143274a5cf8d5965e6e3cd28cea61e16bb01aaa3b4a4c7004eea680587fc3", - "5a722ec931775d0eaa6e00f0404f4c054400fcee7f662143c5a3ab58582f003c", - "069e2da47f3917d5191b7169c53d9ed6502fd0501513b230d28fe506718fbfee", - "74d5f7f443ad03cee973fe8c227854a91fe2d154ef84b4c6000258800de30b2b", - "8647f6a83e60b8291155dfe839b4bd0c152cb372267c24f9494a2443dce16970", - "c596fb5aadc7742f067b3b93238d73b711542bef1589852399fba8270179503a", - "91d2cfd81662a41865f97fae61b1d6e7e9e81b676056d37441ef28d3989622a4", - "4391b01c34cd656549c535013ce10841bb9cbe85d61a0ca8dd374e541cebddda", - "c1924927b54e298927fab51791065f65f50f68e9655d1d96bab91b3b6891d7a6", - "da0774dc3666071056ad57d9b8fb3dc6a793c02c898cfe517e6df0f7095657a4", - "1fd443fc9f9dfd0d7abd688d5ab0f5c36b6ea46578c46df1827497f251fe3533", - "83cfdb1d8d3c0b441e9bc218afe9270b6595e8a4e806f9f2154848b1d1013c07", - "ea9e69f04b315af8b66de7c20584244c593510b6ffc25072b270d7ed2bb90ebe", - "4004ab66705dfd186a61b1582279c59055fb1388d61594450cea55ab54391e8d", - "5124dea1724b953e5d47221eac48512dc5c58082be1323d5b10f6f8fb500937c", - "b72d4b49b1b75d4a124f9c2ebbfd1450038d654599250e4a0a11fa1cb9aee90e", - "d7f18c42d0d49ae7a5defc89876b03543abb59cfb097b3100c69dab9f3b3aedf", - "04481691acf23a5e182353b4defca42dba59f95b899f6c9257879732ed59fc10", - "6d52b65569a58daa70e1c5c4c1fa15f0ba022afdbde70742f1f027296f6f44bd", - "6470cd4f023c8f96a2ad1eac22789e2490c548c6351954c3d8293a194c9b5956", - "6a8be744d95d9d4f706915119dda90223ea1e956ec4dd8ff90af0c4005e67dec", - "0adfa56ed266a7be93806008e74220c06150be74f6d88525ce1ca3dd5a219536", - "7c6671861e4091e811d34d64512cac85cc4ff4509e885d860cbe8ad71769d77b", - "0b30b45049d251fe39995508dd3c2771be1a5b369a87528c11ea1d29e878ce39", - "6e5991b7d9b9cc8229a87da9888c08e61ca5f6c48582f01fa3a7085634ea6aa3", - "8c6549283670dd0f1eecf7f29ead512945354a76ed41d6e6de57fe34fd42a825", - "df694baa55b61326c4eba29a42194b5c51349e7c943870efed015bcfc4a92c7d", - "82de497e856e151dd6127a7ed646410c858c8d5c1c06869fd8c884938a7826b7", - "a21de5e66003dbaa92a000c0c1cc64d428e006c991ca7f31aff79da93b3f76c5", - "1e78e8e92eecde7f4dc92725249b38ceea9832bae84a4d15f295f5c09cb9d9c7", - "241ebd6a9e41b0e304ce2408e2184e5e5c8658598962a7bd91762bcf65f42671", - "13c5a76c354f56adeda58468af1c469ccf425fc443aa9ddde1e90b079b41b617", - "1589858149203a7b611264244bf4625182605cb847ce2af6d6a57fae97ebdf81", - "ba47fba8fe74ced9638768f1926107a6d46843417ae43ea4aaf0bfacf09fbdee", - "a3f20aff305b99587f80812509e6f2da4b2d24b0cc231e13d5f39adb28090690", - "ef4fca842a2da59b870f35d7ed7a3508c005cfac550dcfd711f51be50a700f8e", - "be2735d2b96d2cdfb816850c1342d746cf850a9ffb28fb692ce7659f901ff26e", - "330cf8ce4ca5424969a2793367798ed727a21d35081d6cc0c64e62f872700286", - "7522008966c6835dcb861db50feb06a001a069bf2147caea46565b8f84c3d9a4", - "9a563dda427a7f7f5c9bafd603c706a2f9a78b1b8614aa02b5645c4186f26b76", - "f6d35889b3696feb6600ec9b19c34f587adb6566a7e87cab7262a3a3465cde38", - "26e35f9503391b4ea789570a35403c3872ba38bdb01ee338d7a2f10505da803a", - "35dc90a37a814a1df056c218af1ec8459fbdd1d445ef775464debab577034253", - "9a4d4542126c96239392a73d06ffb4676226039bdd1c63c913d9bed0c5397d83", - "f0deabf658c04c825e8656a8b0fe19482f6dfdfa57c14ca20ea3c81de7dfeb95", - "3b53992b451c7dacd578e6abe0a650cb1c05c558977032bff6afbc844ac0c0e8", - "d57fa8351b19fea92be96f8066fcd1d57c41dd4bd5657c4b936de8521046ed3c", - "42dfc3ba352f15a36041aa91dfe200b6a41fb7f907937e9e133c9582101d5a64", - "d49be0ece574b72bf54e83f5ffd3caf7fbfd34e5a2cbd7c18eb08b42b10cf728", - "60d465ea3a6e75bde4caebface417217b72204a42ca4d66cfdd29f8dc005d39a", - "c4c934bd2806b279327bc37e33c579339cd6f52df9298ec692d66d6516fc7bce", - "fac27bad0d73d3eca2e23e961180811a49bbfb4874ce4ee73af3da7ce7ad4df8", - "bc034f5d603a5ae8b367aed6ee40256cae59f3bc62fb1d324ed6b00be5cb0d48", - "6b9b853dd81503c1ad7ba96f514517fb7708f3ccf5c4f5a18fd51cd6fae6322d", - "8403d9788d20715314cb42174ea434157d8b5ccea2cf8d92399b53304ca3fab0", - "020676157a0cff9d3da710147bdecaf0de67a5901f115043b6b6beaa5b8205e9", - "0bafbd2211aa7ed4a6ed1b14d44654b0f26937538ec8f7f67fd9138263d80597", - "fd9c55026a1b74d95bfd3b2c5c9f36e9cda1e0c32e83b9e1130627e81a286934", - "04bc3014d2ca99db136d7c70001078c0fe03d0dd828de4cc142fc9995bc50bb0", - "7f38127d7310847f05f11747938fc50f5baf2fca8e0fac70b8b0a585dfce8949", - "000bb750d3e4bb3ad5fecf0b00eb66d882e57ea3ef97097f99288e2e6efb1933", - "4f5a43140d3de0242a233f0d53d60e3eac3fbbbb25017ef97d05bf8b7e417771", - "119d1003ae74fb4432047e3c6793b9e5af4b30620107eb192b8ce7413bc71972", - "234e7d7b58dd4f650097f8479cfcca17ecbbe14f8cb277b042df08c07772c921", - "ef62a7a3611496d8488d3272150eed20e8f33a77e47a4a4bbc7fe36c8ea7cd7f", - "746bcafc806f12c7f3cdf6d42fc8abfd20f649558c77e9bf60d599370dc4670a", - "de0893a9b67ee0511abe497fed0aa177b4d797953ae89c8b70816bed592e1889", - "7330200c4a0fc746cef451536e7a6b33619ac53cab9c16cd91366b7e4f0b6611", - "16a86148f7a22bd3b05b763c1e9762d5375a63b22a4b3098661b7f02a8b51a9f", - "dc12779abffd97c18e4984db56db3f0ca70849e6b923f703365f37bdf4596892", - "90fcb7b239208001dc3e68c3d48ca57e395c029ba97ece5260ac3340627ad480", - "385db7a8795b6314a760bbc684253777ff74d7ee7ac662872065149477287632", - "dd557462d2a73e6f64c80c9edd46dd1b633172a749610daaab11c1f17457febf", - "93f50e39818377c130c9bca063b60863ddfaceab40ae95542acd8842d5fde001", - "f6a1f4f3713f112d8560a3df34bc3a918da42f260f5092ffc16f6b03a396ee2d", - "f99b9fa4496112cdd74ee06102152dd05851a3c7d7be1d99e867d5c06a9342c0", - "d374570b7f398b41d3381be9c8143ccbc878fa9ffdcfcc2c9e23b9697ab4eec4", - "ad3aa94ea118380bab1f9bb95ceba040553eb61f2dc59aae1c94e87d6e4e0be4", - "8593281bfae429e2ddf6e55f8c7cb1a89d182d4a8fcd86e2c7323a36801ad276", - "87e4b9f287f86c03b8f56249d16aaa459f710086f68585718128b224171b84f6", - "38d93d522222d17cc04fd95df6b5037af41f61ef5c01275a51a33029d3f5715b", - "3336c57396195d3745cc068abac8b14936866bf5b46bcbd7e8586333a94efd97", - "285dc411ff8291f2c7eafb5aa0281538aa2e0244b8b8657fff3ee6f7819070f7", - "d6a9e0563666c25137874d6c7e4cb30e9f33b8e9c08dbf4174eb6f8cb728561e", - "1654dfa6452464de747be176b6cb6cac3b4e960e3b87a0246af4015dba352b2a", - "c5366f0ff6947d736dea45760496e07689ae0fb0f0937495932b43ee5ed6ffcc", - "7349639e8c07a9278d754ca398c01b882d31bf09636413d40dd1d1a77680ebbf", - "2a9cb709d709293ece0d6b36645a68a975d7eb505de1834ce9ca28f43eb7b31c", - "1df5296f627179434e24db65e4fad636f85928066e538279c32044733eea752e", - "cf610889898013aed673bdfe6f7da133ecde24a96f33b0ccc08e6c47dd24095c", - "996df6d994775f697b01fd0dee235b13c86b0a1c71b4eb03d7f1eb8690054fb1", - "9abebade702af582218926c60062e249aa850e60d47609633e352b022d79a031", - "55d3ae447322a165614825d337a732284e649efedf29c5c9745ec75fe61418c6", - "a1bf1c4a088eed91ef7d0f277038823ac13ed8551db81755cb216f19996f287a", - "93f8123311cca118957e72e6e2d96c443c0276fba5c96064013be3973af13ad0", - "87ea3b3fd56d516e9235d072f5fd03a2e775c715ef900e6e9bc44bcb5a7554b2", - "14dc09ed2a623fbce5750485992b34cd4f9af6b1fe8882a376d692744beabd99", - "f44669606604f9e2f4e07f2754d7342a9f51ff461091671c8267f779059453b9", - "66b180a54d97ff9b947b0c08a8c306fcdc2f92632689ea0b2024fd4d33c8e395", - "63371c63f0d92e6f5f50f745b7b376abf5cf8d87e2b7bd1a65da68b07f2c4bb3", - "1e7bac524bcc6e116867ec4ae818510342a194fa6f243946b8be35d536fc3f7c", - "aec34784cb112a43f92acbd405d84f0e0caf111e11619c5eae43213471b79e79", - "8c1d7729fd57cd7e3c0b8ec931787c3c7653eb9fb39a45518f5136ebca1abd40", - "f101d4b3463677000a64e5baf749e4ed9fec2293bf10acbf7b566b8cc6b22f9f", - "42ca957187804dbd3b211e184f44d815c2292a2432ba096f6f64012ea9ecdcb2", - "e7b1f3e0b57cb5cc784701a80c974842400befb9cafea156e212e769472f759d", - "284bd4fe8e72ff2f05f8d016eb5b37af970283f73cccc4513c69e1fc544c7d78", - "36014ff8cc74b8e94129e2fb912cef754a05fb74d0aa061c03a33c753f99f07e", - "7d53e5d481c942d97368305a5e92d26b68b85a9e8d4bb79d1c9f431f59c08b48", - "fa433363704e19c9b8831e10b203413295ec3f7df781e0662fcd4f3c5243842b", - "4bfffdaa7885a88070b44b851d6d89fc995e1b5a02ed03ecc5736faa939fe3aa", - "db9da65ca19d8b0f118dba4bc73d6bb4012e4a9d825a5db8ac15948ef971109b", - "5a0cd86b458125d1cbddb98f0858d8f52c40edd63093f0ead095bf9c66571e64", - "39feafeea02546bd1cc864ceafeb238270b2023c54cecf8da802ff9c1cabc6f5", - "41db61ad4f053892785b3f0d3d3abbc10f24ba59565ea3666022d6a84cab7d7b", - "c1eefe760b30bc74d195eb5814b74834b714245d7ccf3e91e64625cdc7cc5efb", - "b7579b75cb2097ba0aef2fa5d8579a3013c13e2790537f85d7f085cd41e876cb", - "a46ae74f3991c51bc552bb659a573b7700aa7419f91ccc1d7ff405b1bf3e15fd", - "819d1132c1fd4ac61c944285715ed8b85695496ca90c6d2f9b267d8b30aee2ba", - "d561ff79e8b56f8dbaca4c2a3f7f2deace354d0ae9e2ada5a9221b12783f8039", - "bdf402ae0c2736b310bf04d2892a248e3d304b9916c7a7ea75af2f52a7b2514b", - "23ecaef03873bdf25a72f0c723cfbb5fab5bbe469f36ef301eab794f1fce5e48", - "9db2029c281c630bed46b73f09536cf98e4d8ae3eb75bc5bf7302440ccf48a22", - "321177c79696d68343b7040396939cf543ac1ddf626e1f728af8f01a233d239a", - "5657c09b54896c68ccd6c6b5398c6b1d0b0eba88199991a224cd910eb1411acd", - "d2cc44bd0cdb056f809cb85a22b3fa0b3a6fba5aae58fc355ef3ff5d3a92f4f5", - "f58d0d97b786da95fbe1b5192ebfbf32295110cf2b351ac1695dff0f7fa8d3a1", - "1ffa1aa070e4c5a87e25be07477e11df82e0c160d611d2a75f8d5831b66ea84e", - "88a87d1b1603f8839c64e8bab24244a47590d9c212ba419aa9d1fd2683f6ee13", - "c22d42bdc1c312d859d6b5fd3cf6e780c54d9361db389e757711cd11d7aafeba", - "2928ecb2f27a56ea8f2a1f03dc7691943f7ab09a0e516bd73804e1a1a2467cb8", - "33ca39ef203e4a9958b0ca7b924cf37bb743828abd678abc173883501a5738e4", - "9e238178ab3e6e0a833ac77a20411c2b59079cfa760c7d6e6cd32e0e741397a4", - "93e19cafd7cd4896a26882c8644ea74bc5e1ead50839f5e84af63f84ac16459f", - "56b46496c732d56c27d1f53e59a9567a939aaa8b41077e36fa4f28d395cab062", - "fc48033086afa45058a95672d283c39f622530e578f79aeb59e88425dbbd7b78", - "6631f2aa49aec12e2e5b16191603e8ede005d12bb9cfe152215db2684d0b9cba", - "9e4c591b4cd8105d4928631bc805a629cee25939f514f1c3afbb159f3fa2fb6b", - "d33fd5ef3914038b88ca2561c3ed750d6fcc188ce5a3c5ff861cc1e0af19ff80", - "6a3dcca96275a84a970c950a5b60c5d9d989c1efa3cd1151f69d76114c378414", - "85d1dbff05e240926d24f2bfa3c319d8fa40a37937516f91a16d6709c11c9b60", - "4e7c8bfb9a908f98bf0bbf975f1049bb8f79e524590c9d982b525e8bada6a787", - "ba25abdb924f8189ded27d4ccd608a969cc57e3231d463cb4c78ef961f85d6c4", - "38427056637ea274db39a485e6ca7c86c08029f4f3c94c4de1ed07f114a2f513", - "d8579a4181373517f78cbec1b506c9d818710f2e199d0292281416dba4c2c62a", - "2289b18ffb16a4182a17dc53568c1db2e35e9ea946841c119c00d22b279d7b05", - "99c845e08a4a03f6d169638089432d6569919f2846b1cc5adca7bcae3a786cd8", - "11469c5ef3ff32918386d725ef385c7816bc4474c662866f1c5b5cb0985d1e44", - "b741b902f4793739f3c6db91833cccdeca71b9027b37f561909cf743d5caee32", - "37a35fbebe14adb35ca62f29022bbdb6e4d7d356448dc81890bd0bf24a8774d8", - "2ccf25ea1b240ca319e0853e2210796cf2ca790a1a8eebc004902e75901e34e3", - "521eb993760fb99e3c8d0c77f2438bec81809b8982c91febbaa374dfdb3069d1", - "05e839f986352f983bb688abfc18ee25e94482b84f35c5b4447ed0a8a522e90e", - "311620841ed2aed193f2931ee4da74c32d51792bcb9b4f5234843381d18cb543", - "334ce0a8f4e17a6028331a624cdf1f08ce123cf9930bc6f454829ce4cc95504d", - "f050d780aa740537f5d6e53386bca9c0b5e871a86d2f89e5c509e7b8ff063630", - "514dc93432e5fc4ebe0614a36da63a88009c5ba18e104903953f662fa1c2ab9b", - "1912fde9c582afa2fcd9c4050fde34224f6b098b59df720ddcd8cb07bbaf4e3a", - "42d13c9fa0ffa067053847b2daff8e81ed86243fa30218933ef4760e464ed5e8", - "d4ec1d44cfbdc7f5736c52ad447aeb3b64e54a335fedd5a744b0cd2ae390aeaf", - "04631a2d5fdc6ba9f1f58701fe9c6caa1c7047513df4f4aed1c9d61704c5abc1", - "fc4e5117daebf77228a4f861946688f840eaa679cc057e225bcaacdb645a3f9a", - "2d767694ee9841065c253aede7af3377f781d396ac41182890590184c04df22c", - "0aca8fbd371969ce63cf5dabd86ebc5cf8743240bd57b3249c8a16ee72598d1f", - "0c529314acf4eaa4dc16e265ffb7021a8906d1dd85703a6a9b47adc6d15fd315", - "ca2e206c08783b10ab1bf0073fab68823b4cebe861f281102236d8465f8e1dea", - "f5096a8c598352811691495abef1e6264863c6567f1e60bc9f0c98f9c7204138", - "8b22ffe70e9190a950459893335bb966c3f73c01c8379955c24268a2436674ae", - "391c2da4802c37230c31a2d439457122e02e11137b5f0b2b74b7060fc4a26bf9", - "e27e0ae8a648719bd7ba943b2e6081796158174153ab2639103127d70c920c80", - "66a830327ccdabe412372967dadf990679239165de8d8acf15732277248134c2", - "78e685236217300f60d564ccfecd54730a5ccd44bc3d537b8277f28e5d886ecc", - "3560f3d66d2f9afdd432409fa73fd3cd29118ad58b6ef74c6c4d138699cde0dd", - "df8c6ce47cdeacac38e75e406e757d88c0f189732205fe73e1565168e023f1c0", - "755ff66e059a19ce9739df0520ba3faa00da0ae30847757118a0933bd316edd9", - "7789404a8f39bc358e93449bf27c17e14fd910d54185d27e140f128b996b3e86", - "068d97b2afa9d12868f2e2f2330396b039b389dd01d5260b625efed8c3fa55ab", - "c9dc20676b56b58c8b3d2713e7e81ef3469c054b65387711c0d8e55ab7411ab9", - "8874d82964ba59a2daa36250b8c67978096b1b8ff819e603f00a3abb57d2039e", - "c7fbdc993042d5c00668d79d0335dfc90affe19e58d8d144831157f67fef1548", - "8ec186c4b26b7de09b6f20bc6dca756fe59e6f7f30622206565bf92352f90bf3", - "8537e2b797db69bfe842710c9bad5bf764fb28df5d5c85e64100e3be3b0b5fa8", - "4f8e065384ad32be59e76e8bbfb0dc603f31b16c4b79cc845329a3520120b8a5", - "10a9a67e2e4750f16695a01e60d3683975fdebf2bb37d2627b442228bf40da94", - "8faf9632a9f92ce32fc01a25ab1a2a88338374ae68a9611f4479b374ddef67a3", - "28c5fbfd47dcc3fc78c768b35efa1484ad95404ee8f43abe9056b661bee82f2d", - "e80b7fd46ceb08e4dc66baad661090d39f2db7bc8cf1ce8cfb566e0236634630", - "9bab1a698e43ea6cb5989daed8982b66e40f084b2893c79dd28710ded1fa5ba9", - "ca5e663b1a6402ab66b28816cfe55a110b304b4882f19fbaa295c9f75d4b9355", - "7abbd92a720bc59c2e77d17c022d9850ff742c8e928951fcc737b80b2688a9bd", - "59c52e24ee9dd515fc3aa3ffdc42350ba3cf238e479dddaf6cc8424515c4d309", - "84f0ec329349df4a2c33b4b4c81a778392c4397bb6e84d8c0bf65543e5093918", - "8bc47fe3a4079c912d602fe0ce6b50676f52a52dee881931fdff443907d39254", - "e4d0b45e0be39d53f0ee1fdf5eacb6a51dd4b59112dd195b840ff8c5f84f504f", - "e62996f6d8b70fdfb6b603cd672a39e059cf3e431a7e0601496ecf5bee255d6b", - "57722f2bae317d3b67ae62e0c9d7a9ca8963c07b75ad47d1a07821c71ddb5c0d", - "94876489fd87e70d822428cef66f5805ece67fa9f7c7540dca469e5bbbbe1b3d", - "ff6bb14a0600e3a6be93fae1db7c8db531d7fcc9b15601cc186d514a45250361", - "3d0391d988cd27a4e24ec274f9618efb3c4136c25ec197f43e9d1f6808d9bae6", - "d97c214eb5bbcac65501055670f0c29258498639f37b19294170a869bcc842c2", - "8cfcb55b08d9738dcfeb6d2f6e37cc755a9ce52100a2f217f59960cecf94b215", - "cfe791c869fad3c6bb1aad2701f6f732c4976ad65851877f190bad1ebd6d31e3", - "67ee1823de57386a873a97445ee4d9bddd701fe5d66aec5b5fc30e56d19dd48c", - "9dd9ef2823ae64777bbbc15fa25e081c2a23bab82cbe727a56e76ea4b5cd5608", - "ddfb2a604ce7d76ddc36c98bd0994c40577d8ef4c34a36a2cef5683807883226", - "c00295a9205035326600fc71fdc4be3b40ea8ec9cabbcd8ec46c89e1072aae57", - "597b141b428fd13b4a16101bd202b07dcd68ee519ea560299d026519fa21cfeb", - "373b2e35a31a7585c8ea1e86ade102265b294f5cff200b828ae409ef97243ef8", - "30aa590a1cb8dcea0de24d99da475323d49f3a418e3d491ceb784a2f865a189b", - "f76767ee06c2a911ca5e8230662bfeded6b4d3b3b21ba2cabd5f55172125f5f2", - "ac125785591c9622fcd01fdfbf87aab73a76c61faad0a0640bec55dfe9781e61", - "049a57b2250dde31336125e900a78de64563e65f2ab8592f97a36f30bc2e2690", - "b7ada661921888d0f5d7c12f5cd61d5eda165e6b5d7a77d9b1af9f7f3e71b55c", - "6417cba9e6dc94b770bdb94fa54c3035d66850e6994d418f48fbfd680da9fb24", - "a0b2f5117e759a74a8e53332de25b57361a779828fdbe1d7c00905bb4b61ed17", - "9eb12a5e7a709f9c5adc7f8ca7aba5bf6cb3a1fc19ebe9fd13096fbb89b795a3", - "3a5df7e684c9822a5de8f021bf1c5e9038a81ca26e931a9a2e47fea8347b5449", - "1fd819d6a9514c0537c67ca166af5c68680a706687b7bb676b20f56b246d3776", - "1266d3e8d763ecd5644b046aca00cb7fd9ce3ab35eb20880ebea68a5a01f0b02", - "0ee2f1f914af376458b745e9c738a06d591e3e927c8f94ec9b6e5b1f91c74ab0", - "68c6de469865f2434daed3ce8d342351b3d3f86dbb0c1277c5b33a29b689d5ee", - "20c3e9071e7b6841bfa606aabbb0fed4a1313b9a2d3b70282d871eb10b3da35c", - "b2d4fdcd070c8d495c4b228e7971bec05ab787865d56cabc0fb0340b481d0efa", - "a55d3b04eb9d5bc4507d9b057181b48e921d37c851286e12a95f34cae8ea1c56", - "04a09541d473068a86f798b229b788c62646863cf9cd1f4c8273769a71ee4963", - "6d08e75186c2e083b9680953f5de80778887f61f138ac06136c6dc8f3087a984", - "280a8488c1f2b2bc45fbcaf35d7e734ea25063f9a8295d75cd679a6233570dc5", - "bb1491d1a2fe3e1b30c706ada274ed9bb6cfd96c9803093dc43b5512eba2e48f", - "44c7c516b8cfc6fb5bb6e14d29cb316aa038e7a851c4b3606881cbf1d4167496", - "168e86ad61ac6ba5cbd5d896e027bef4037c5a23217bbd54a705246001b83dd6", - "2f2307be6d7f12e820d10d79cdf85fb748097fa01a6df7e0ae17848090f2d0f4", - "be5add7e4113c34693e4daf0afa72bc63461de8144e20c1bea0bb7fe98faa938", - "f36a3e179905a08a169f7c11843e118e39a76dcd83979a21826dd50eea01a038", - "b7bd1d6fe0112e31718239dcf794645c063a64ac2205523623b4119908310390", - "107740aa8eb8ea8d01b596116687a6aa739f781f4caeabfe2bb6f72e539d1aa7", - "4ceb3b80191e7b02cc6161e2dc66eb5c3735cb0158e41430d9e36914c7cfa326", - "980f4188ecd68a701b8d32f388e709e9f091dabc20e33f69d8710b9ae4385519", - "e797dbe47a0c8721ced0e5f8ef11003491b915c897e3b49270b63cf319bd8668", - "54aed77914cdf586696e2665c57230af57d6eb91bc4e768d6fa31556117f79d7", - "7fafa1f56a51eadece2729991db8fffa574f788e7df153aa128472a71f921545", - "8a0a4df48271a77998a2bb02db977e4c6d9a543bf95c419e48515eac6a0b01a9", - "49ff6f5b92fd3da417ea7076431da8f96548cc8a7d2d867fb58bdd1fc244f3d2", - "fe0bb7ee611187bf9578baa0296ba9e7cce5617c1c49525770406929b69f68f7", - "7130e9c1b4448fafe4feececc7b4156cfc283e111032c8a5d919998b2e3d0720", - "efa5f458e14f39ef0a6ddc1fdaa10329b1e6376b0557bd836074ae14916e89b9", - "fd8703b833468076257858903a200aaddf5c1f25adaf5e53ec4f71b99528624e", - "296e8792ef0d1c270328c223b23f10489774420472936ef63035b91e600fec1b", - "544fc1037db258f6d6341c1e632a2a0a1a582d589d728aa4389edf2ebff115e1", - "20fabd6eb8c91faf4eaf82a6c24d95679ee32593017e014d4e84259615578fa6", - "3ef10261abc16cd9b623e2fb5b648a2e982c886363ca3c54de15713d34fdcf5d", - "b8a87f8c889a5125eb8a2a172c61e2f2e667f8c4aaf051eb84397c60ac0995fa", - "3bcaf6f196e8628ca151737eec000d21194df2b4050f877b0041ac2cbbac60a7", - "53ba3730bc7174a535ce641ab25bff1fc4237758f9936bd70b5509f4da1484a5", - "e95807d281e53f1dbba92f3f1d305262ca19fd52866df4de097892209caf08de", - "0490ff681b1f94c2b2763683161c473d53739f61543280154fd22636082cbf74", - "64d2930c4c2bddd25d03f7cadaff3be7dab476eb09cb818803c4f5026dd97d4e", - "e79a1c5a73972035a9c83a8b834e67a48d4aa6d5ec0ba5a7359aac592a840ee4", - "bb7e89c9d060d1f94541b367b48d91011dee595edc0ca9c493ca5eeb3485a24b", - "7cbcf0fe28c71c44bb3105326f82e1ab15fd02c7ae15d877b1bbef5ca1e245d4", - "6f96558120ed39902872d3fda5a67f9d7c3f44e53043e571bc3dc277d54f8d8a", - "6bdc9b52d8ed866dbe20e32b1a64c11d34cc44db9a2812350ea65cbe46bf1a6d", - "c8701558143dc1e09e9443dac5e949460ab132d5f4febfa96e4177e778433210", - "f03f0f1fd4c1d9474dbad179de8ea753005be770e7e5b61a3da2f3cc88408e9e", - "869aa57429440a6bc69359a7e8e65ced30d111b57ee212416f6946a3614bf29e", - "c6a2af95989f25b662a483539f0c4003cea049f72796880b703ba9659846da01", - "d8462b8310ab282138467dfe68970c547eb3532398995b2845082712a934c4f4", - "6ccf3a28137a17e9d5c4557e85665eb05cc4d49163bb634ec4087b7d590d5434", - "65ff7355737aaa206aee476c6955d937805df9726c79c035cc85d2fb7f76ef36", - "ebe8e7a74464389699652d0748dea054cd9dd4771a9279467f9befc2a81c6a95", - "1739d4437ea825762861ede8ff67dff5d2dab456054ac1f418383156f82af77d", - "e268b3fd6b1ca2225118f1daa52443370fc1df9231778ade15a87a6efa47a41c", - "6c364a5265b13d1a26a8a04f6eb8b6a1bad3d6bffc42a08d6ce1c6579fe685e2", - "93f60c915406dc83af4e1b11e1c7dede920dd4f083b8e9e9895d901029d89ec8", - "04c2222ae4f0db3c56a0881d6157cf9d51288ede7f0d3603b90c8597d5c83768", - "741d62e8741e716d97e9d73500657cce090d788e09a56f90c9c855490b0c0775", - "833b69c7293e3073dc2c46b507ff35ef8f68b8a94a6e65091b67fa236c622a38", - "f52c94af633ddbaa3bfc7e5b4f0a5b4ddebd0b028a6a148c2a100535611d0453", - "6f98bde3833fdbc7cdfdfaa204da82f60877653208f0ffc82ecb29900c954dc3", - "4c883604198cef7a2c303bb9c09f7fb3e9314673ad5c9392cacd9419c67163cc", - "5284b245081abd7aa2d9d15e3f928847bc8409490a13f7252d69013bd05c3f44", - "eea114fb84d520bd83a30fb3df4d81903cd88bb00d9b71c1bda9941f76c6edf4", - "8122286ae2381bf407d36161c8ee89ff7d06ebe556fd2bd387a23865bdb701c0", - "ff78276d8cca6e214d306de1ad84d301374a5030eb89ca6de40aa0b58d1fce76", - "6c4841ca6dc9d98391e37921774b9f98fde772ea5a5f83badd972035629866f6", - "33e257d81ae280a822ba70f2140efdfaec0aea8c7b785093234514a752e8d811", - "888800c6ce4f15cebd16d1740bbbe5c58da914f11bf90938cc15f4c27cd34c6e", - "4479236b3b5015d6429a412e7adce045612bc3ba2bca886fb42cc8aac1a368a4", - "8b374396b451109ceedf6dcaab0856d1eef1181513ee0ebdd63ba1a1865ded86", - "082a389fb4086f7b0b8e2b3d4ba2577e62aae1c704e3b7f9e10bf6d86104d999", - "67b37ff6299357242119e867360916f430d789acee08e8747b243bb85939d000", - "5423310d852297f49cdb00adaf50372b6b36b0ca5c0902617d28a4169574cd64", - "6cf0f342285d24e7354bb09b95d78d75668ed0564ee60fc2cbcd9c658a8beceb", - "43a77b21ab25244ca490293b3acf79e610440ce532f9ad42e30cf2644ab9083b", - "0d9442d9eb865ac7bd498e7788918f3367f34876f416d8c97030be3d16bc264b", - "5d7dda2369acbb39726bb51e00bf2ed707bef173b14fd79d82befadd2ae03cce", - "16f26b9b64b156b5bb01654c2152a1a192a10fde3e348d7f1ce704a1f4c66d88", - "55de24503173ad26a1345c24ac3e8c6c75ab119b16ed7336c27a92bd8ca56616", - "c4ddaea50aa2b60bf26a8a22cf21cb70f2374a53197bf16996ad5e05fa67c702", - "24ea3f52d63f8d19da59062fffed3485dcfdeecce020c78c7df0095a21f99ba1", - "a6be9511880f3dd3a5f0fb42eb4a8ef645688e03e22b8e48a156479e4c16b42d", - "a00ddf0b5468b108bf3178d95b6055f542a232251195926ae2a506b3f2b8d4d0", - "335088caed4539e2d8998fa2ce05d85f590de4c4d925b60bffa3a5ef2cf3e132", - "9149ada351cdca5053ec300176c817df4ea7934aeba8f40956db0aff63fc6612", - "e8a4175925260fb235372a1d0d0a346ee3182c2a3f5f63a22a7077f96952d066", - "f9c5de1b2bd8678e3c3a428f9cde2ebe17d8e42401975813f9d4c9382396bcb0", - "c963da6fc8235b75d9537f33595f346b88f3060e1e1fae24df2088522847c730", - "cadde0be900716181a22be350c8220d3857f3033e9e67ec563e54fc388b9cbca", - "66208aff90f00961a15bdd20279638d7ef50457b504064803ea1172775efe746", - "f6d341967c1f42fb9a735e92611da10ba7f8011e84a4116b37a7ea1a03ceb358", - "21be3513e2a5e5919f0615b61bc51b94f5e0eb7d5edd4654bc63667cdf8cce9b", - "027cb8be40b0691239b494d0127f402be9fa1121ebc64a64d5c6686874277faa", - "3b863ec51cd60661f08afe458dc669010c0f0f16f40f4a8ab5448ce03ff14659", - "e63987d473378e123e8e26018ad4fb80900664bebb83b1b2b51892fc0514eca1", - "bee733175fdc8b197cf7560110ad038f439822cc0e023fc4be92c5aa99fedb42", - "7e45adf1984ac0dc083668e85416d2636619476758fd37925959af8ac07df89c", - "e09b6b43c459fdedaeb0e43f9bad4b8e82b0224a191ac030291779e4cbb6b7dc", - "165442e9d76356e3029ee2b21b602ee43bde3d8de9708f7a214228e632cb2239", - "10de75f072e755044073787fd693cda5aa4ecb8a50630efc782943ea294fc02c", - "c9dde781ad6e9470d7174f9324bec823d2ab14a13a83c976dfbde27e8b577703", - "7efba886ad3be39894a51f92ac8c068e72e4c5465ec811bfa27f842f061b66af", - "28b478874cee9862690106f07c4caedec649294357af53207d58019edba50b76", - "bab19946b72cceffd13ecafc9c7007d0447e91a50ebda4e8af6386724878bd4a", - "7dc5f8abfcb33d6f9a2fbea4b32f3083ec78efc07f65a1dce6ce6a23ffcc4278", - "e8e89d294c0afd74fe5e5f9075ba7b3b155a731eb2a119ff5b160acd865329ea", - "50d5756b5cef44c09fb6f3dc36d9a906b5f997bfb23dd880874578d41781b6ca", - "a26b78cf24e22414f0469ca2131e0a8d2204f976d016e3d5f3a8bd514cb18c36", - "a0497ce09e3be71dbe91894f8d916ee8c139ed6636125015972b06656303865e", - "d7ea5ed0c3cdf640b838d4506a64441c2de34cf8c4f6eac21c5ea69b7caf4a67", - "8fc98fcfbb60dafb8ed9b8e0ac75472405752e19dc58b1347049d1761623f350", - "64c5e0e7739c5eb63c15dd6de47bced905a8918f8a2b93afb9b3aa0f3c3d8e11", - "bd9ff846b2922c89e809a0c471a115478da9da09a742c7b832b39909e508a1c3", - "85c7af870684a623d48a78c949d75ec25dce68f723b2e170f36a07b1a176ef4c", - "3c2bc405a149286491311d4421940dcc0eb0b4e53180065a6dea81b92a5a8b79", - "ebc57590f2fd8d879c5577a4b00bd6a40a10582f0e00f45f82319c3673ea4e9c", - "940c77cb0c2f0005785ecef4bd114575892e4972f671ae9483482e18dbbd6e99", - "acb847d7e2fce18d673332cf1357104d0b6c4d9b2dc08c185048570017bb3d27", - "ec954965fb8f9b6b49d1909598bdcba6f93a234f2e496c5ff09b764541a18b55", - "9be6b0398e9edb0ab4fd99191f92390976a6f7a05a60d7de42682eaf445eb5de", - "dbdab3f17c55550dbb6a9ade636e9f3fcc4df602f866a85758df77b0d597bd49", - "c8cf529a64bb2e92f55bf6a4a98146eade2b036047b02f74cb44df7cfecfe50a", - "4925874acde36380faa7532a2a9a34792e9589683a627455e0ee4061285636cb", - "55b73444e58e6ae5638757c890247d578e79103d5576d7a3dad810f1b5992aaa", - "f5522642dea2800e4fcf541ee4396a60b274436a8774f23fb008b4e13a01b8b6", - "34ce16c418476e74cdddaaa507bf97a1dcd82e71fce15453d179908cba844ab4", - "684d6d76a43c7ead01eb10322bc35dcd872a20178bb0b39b657d19866528737e", - "36136816507465c3314ca74165d5e5ffa77b6b0dc3ecd74c3932693ce4543075", - "45d66e0c947be45e9990b2ec0ad0846a8b5f72ddfbc9a5a24d98dae6b15de90a", - "5e3b66a6b7d57a152cead0dc3e78f4f15a9c15ec5511f528446dd0b6e93709fb", - "b5bd0a81baf4a4b3d1d3ba87f88de583dc9b33a7d65c4d959cce622ec80da782", - "92f97e91bf7a7107bfc3d8a211897e17f8b493a5a13d3602644052126ab1819c", - "9c975598fb6e7d8c9b4e8fc0c7a65aca5d549f106fe238894eab0a50384d2b4c", - "b8c494ddb5bb82ae9b712594641c904c56a32bc5e0da789f9f29b0aa7234afd0", - "822a33989de6b61e5d5a012490f07b93889ca73ddb15f679312dd4fef4dda64c", - "d8404bbe0f98644121eb6abeecfb513a9abf51defef0843274a0cbcc4cd6135b", - "71c4478143c86128b2e929cc8fc8dc0319a89584593adb84cf2c3b54aea3253c", - "8d5ab60f34289b196fc2dee2e08376d4439aaf4c7af9e493d4c907e61690bdde", - "edc8095db1d979fcb4627786fc8aca94e05c2605d6d12be0aadf4679b6442811", - "c99de2dfc808a5cbc50e402197cd88ea9e9b7ec95ce96598f3579ccb40f05c63", - "8d2f43cfa83c10482685a50c0a3f4a14a66d5ed3ca1e60c8469f94622722e619", - "03bb1779597349600f835af8f729acdffe162005ac9622398b327706e5b36c30", - "cafe5a4561c2f5e50befdfb8182944bff5f1ec942df04b9aaadd5800bde9a103", - "c1fb66a0eff0c53e9737d3e712bc5c47680b275accf0fac910c81f9276533665", - "687092619244745ea81f284f46c72c817830254220ec008a1f65fea25310f981", - "7a79bae967c950c3510c32d17f98d4db235d0b715414e8a2a036afa18de802a9", - "c9b0e90d2857b886451d592eef5059269a7e39338cca0cbd087bc6e6133049cb", - "0c13db07f7616917c36578f1e7921c022762f200b1fc26bb9cbdbac2bd29887c", - "f29481ba0a8e88ea389c5c077dace9e1ece363300d52764325f02698a9b0af5b", - "863ba6d2cd1192fd8036ed3bfeed73192d28b9f7bde0817e9efa02421f088844", - "121a3394e854caea6542cd434e7a7317f17b9ce915852663323c6dfca494ac4a", - "fdf238dbb955c9f7418b5b7c91c07565032e7ce9c9e18c2b857e54abae30f917", - "07902384d33d23040f45903624b659fe913e06651e382c6d04c0d1025b616c79", - "8dc0fa755d702777788ca108e274bc20b0fbed5542296c484d2ec11a9892794d", - "ed5a2b41f144dc925840168c592927cd3b94f69a54d82117e1eac5b61ba89f5b", - "608b69fb6975103c4955b1407f37722c7d24d3ebd601936143787a6dbc7574ec", - "73d2c686b360dfea0da088b4cc1fdb6d05c70a759f6e052a40c86aec78f89df1", - "cfd8167aa13a479681466b728d020f75a8fdde6efea2b49d2e36d7423ea6471a", - "326c75c234acbeee1ec955fe583b7c1d8ec972df3122c7138aa276460ee9f665", - "81f3aeb4d851604e6f2ef05fb7d0cc5677c268ac971efa5bcfe319701f05e8dd", - "234b4d1943fcff0ebf1a0d70e81ae5fe39913b1d09c0aa147c9efd275a0a5b2b", - "d2e1287ce4645f74c3c32534fe36df54ebaa9fdf29177b75a41e558a59c83dad", - "e869ab3c1e08245a265b4884a53ad1d4fed925e4b73520d8bca41a49feb0a642", - "7da6870dc48546fb27800d295a5b9be12da05144a8844aa3cdc8c28dc347d49f", - "8875eac1ce5d3f197eab3fec45724ab128f0472784f51c2ec06ebe4e3f7d99ce", - "41be09d3f8a01d2ac007a246aec5118515ec12ad46d69e35782acdb48492b237", - "b0efb713ed33c7bcbdf9540a1896267d0d9b7d78e429e312e73656356a8d9f57", - "7e6ad8e1de222dbe41c72b0cf2d52e520eb554a2a87268545234245994bdad5a", - "b2a17dd1f6b7e161db24894b2d088317e2a44823caa0ab5cd82815f7bb92d09a", - "af7b130d35d7710a40372df9824ca90f4e303b70c8139580c620253cdee6bf31", - "d371a1c5fb86c89d2903a8a9ac5f407293babf53f2150f061ee94d0edf497b0f", - "bd1c64f8a0516628caa9b0e6dab3adecebaafc1935b8670ba307e940e67b30ba", - "ed2f8895adbd7ab2b5beb995faca304ece2de35474104d4682cc4f8b6deeb23f", - "8d90e31dcc54ec622c97cb26779c8f1f35c8d7dfa741a185f24f5b07e3ecb253", - "6f647c82f7775dcfe92492b424866faf5dc56dbd70d53beaf3ffb3a229d92974", - "4c52e7c2fb0c82af7d877c2a4f62e0efa9e6ef0ffe360420f625a3bcf3cc44b4", - "909852fcd949df9f58294393afab9a8ac979793376def0e7506af2c2ffc2836d", - "34f9421e4ab2867cdd714d7d4df27263afaebb691d207b773aefd667f71828c7", - "e57b6c4dd2d97b56d8df07fa845892f71882ebc7d686ada98c111a35ce94762d", - "5081a6c18445afd1700fad27688d5b59630455645398e2f4306a86c51b5398c1", - "3b358eaedbf00a29d55c7415dea93dfe4f19246bcb4c529e1d966649459827c2", - "166ae732f743c8f1e15a5ebf0290854e0c41eee77eb7ca5b4afa32243c65cb5b", - "b9c2486eb52c0b29b680352a0270af268dc71dda3a596d4be6b3185d3690f3b3", - "e3075bb3bf77a41d11efd9965e07e9663790eda3b11c44203343557ac22418fd", - "3c247eef738e78070644776a1185ee253ece2308feeba305e6a0aee1940c564d", - "0bba28069495f9258d16918ef584e61a18f6f26745670b485a9c8d69d12a5d0e", - "ac8312f2a7c61d169246c0c872e23275c26fef98f473b56ac25843c39ac9e614", - "974331c632a8f51216683122f1bcf203d651233bf806bf2ede2690d0185fba82", - "08db37522aa488ecd466e1be3cb11c8a58bb8003fb1cc15511be6363281e166e", - "5eb3633ddb7d03fa87870ae90d242a9c61274d2af5accef5dfeeb055ef47c001", - "67e312d9afa65e069fdc7e3f5b57073d10436df922a9ef56d9cd33591831af42", - "ab97b2cef8a33d7ff78d48c2f9fadcf68e7911ab1786ba2bc33be4cd740953e3", - "c4612ec7d1d60a264e5bb237c69ea6d8b5bb73c0ea3c25ce1985b543b3650c7a", - "a6b6085bcdef10f920d1da7f0da7a417ec558688300432361c0b3e08d242a2bc", - "a886f58763c301a8d08588ce8ff8876c563a7da9f76c64fca943286f8f7b92e3", - "14e830fb4e23ece01fb35ba896460c497ae15c886e6b4788080aeae47587eaff", - "31649639bf1388d96e9e4f2fb346c17d48a671d5d32515366c9d590650c723c7", - "23a529b9293601169de825ecc8b899b474de03b8d82672cbef238d0fc86989af", - "a45687c1e8f28a20f73e18b9ff956485aa632109d78a7595480b74ec46e6c9d8", - "89cebe9c36a28523abcb1fea6d3d7e44e45db59564b8a95257c35b7757e6f0d7", - "ac6ff74a7f3474034aa9f782ceb9bc07be295e500e3a0c76fe7ad5fc90b02247", - "bbaed45fa335de39a1719f809f534a6c17cf61d190462549f29273d32623108b", - "ff68931b09fa5dcc18ebf65f300c40788664498afb19ef0efbd6d2159e1366f4", - "a9e852dd5fbb8ce305464ce4ca0dd3a3f7c1e1bf79455ab51a2774ce62a1f973", - "f080e15a7d34c73d0231bd43f7a47d856780c7079348853148b9e34b73417112", - "52927d609a25d1200bfe45c6b49b61a7d27b56584d2e3eaa822509f0b0149628", - "90240c4f97ee937f4f48f9d89a1867cc796783d9e6fd053b67eee7e4c2dda35d", - "f1cebd2ead19c4a6042d2f310757b4f81efd749c8b7a258d53ce35538a0c0a4a", - "cd18d0b2aeb6783a2172901ce11302aa6404466c9ed9194e2c5b89f8be506ffb", - "420b8d4eb6359cfe8e78da690e762d2b9a0c62c3c3baffcf1357f10fa59de5b6", - "cd1514d9ca95a67377fd806ed52bff2c4caadc991960ac6fc3e96e1d5a07ca06", - "73a35bcf730c950825ce22ad730b68eba83cd6b0b49d92940928e412e639116a", - "dc64cb057c9686d5858560b7d840bf709a2a80bfe5433970da6d2865265f1bdc", - "04d12fab549cadf56e1f5ea27e5129124364b3c20a1b779799375784c838009b", - "078a7ec059da85aad470719d1ee49031187724ab640665baafefd8fc2bbe7c27", - "4e17063e0b6bb53bd9f152dd1444ec929493cbc6967fd905562b7ee78501f4a9", - "ce19cb60bfabbdc37daed7f56162d57e8917afbed88a53aeab5ee6df51494139", - "27aef875f577bb6745e02976c0d49b40b84403ecdcf390f5d6d511977d5158cd", - "8723d7cb6d36881da9e5ca8d943ac696828550ed302127f3798d140fa3c0c124", - "9b3ac8addae75f98cc23ebe0db3cffc0980f91667fcbd76ec2e599ba605fa33c", - "98c5bf9d0dba4bbdb1f222fd55cbdc3785e72e339f97c018e968eda4ea30c8de", - "8477aa7beab4d73972e1627973b83464cb2e91193c952aa482409d393febbfc8", - "2062c626714cadad000930606ce09c659f476f4b19c6d2631bc15aa05352dcf8", - "fb48b4d7766f3d30255237405808fd552fb675c4cd548e9ecda83194b33a00f9", - "a4be197aae23737596e59feea6807ecf4fdea4bc63eba15c4d0c83ff2b3f2848", - "94c63c8a630e66cb7d115a96639c6f385471a31c47074ae9da200d9f37984e61", - "fc9c6eff60e737e9639c2eeb5f64704ed784042fc1a5e3668363ced63483a379", - "2e7e5dd79e9543121b2b470dac0a47be8597c58e977bd7ffc21bc903dfaae300", - "519ad274d4e67d8bc41c89df23c7aa02b0524d801ae7c3dc1af1c49131ac0ea6", - "05cc40b1c6cea953f89a1d0fd49dcf37f9ff61aee9f5e02ad3bb3c02954d1205", - "346cdd844c2412e37808b2b4146cb59043c435edb3d5aeccd9f65047955ea50d", - "7553a5d51bb1029a9e986bed8c1a9bb47b60306eef1a9ae7f06298c4a011722d", - "1cb551583395f276eff54af751763b2519c4d7d17076fbce379981bfe7c9c4ef", - "563e14e51866c8f852779176ab2a165e6bbaae147366e9b70d0fe1fcbfd9f378", - "9f8d8df39aca96198b33a68018164b2d5aee6728c9514a52fff7b6ff1db4c301", - "afbb68311bf1cde83ac408286913a462cac012e913fa046853870839b18bbb88", - "031d717eeb8ed77473c62cb666cb8bf9e7f4d03b278f5c6c537f6d99d5b1c7c2", - "aaa18e5c3a78c39e5021c3d51b47a9536e3556cb60b5368b8029daf796b03ee0", - "9d043bfac2dd3c6520e9cb9304f65b7b59ecc9d3a7cc9e2a3911f7b533edbcba", - "6f43195288561c3017fea7b1c5936cb537c5c4823c629aae37909335cd5d2bad", - "da9b32995c39ce60cfa4e7a16094091b0fef59d8eb2098b7da030ede3acebf31", - "27d4bd1d3a9b266b46eff1f5b56fca460023153aa3e34d82dfc79e776b3618cb", - "786769d316095634d08a53669e5498e6eb96809e1e633b1cd1669748433f3e2d", - "ddf0e2532a9cf77533e2732236551fb45c70b201c79dcb1f50f1b82444ee0da7", - "69280124edef9337618513aadc1194744b50f9ed0fcc687f99f706b153f90b3d", - "a7d1e623e220ebd74b102171a46e80a3c0d62bf8bc9750512f850a474326da8b", - "1e952cd005ee4b977da12908335b8a5150cb2e52250be20afec84eac60ea594d", - "e2b692209cee40f2f77549c0ad3c868778a436da9d36677858660f80934c2cdb", - "b986affac2ac75c0ba5290210bbc7277b19283b0304dfb2cb7fe3f0113fe3bee", - "20c41db1903bbde2ff30eddc166c6044a459dbb7a433aea1e54b4a88efe547d1", - "aa9c5cd71b99c4745b706e3c1fdf82ac23789d121ff4ed0797ae90a2a5582a29", - "7c9dce50c678168549b2a8a07a6c7ff0f5a784e60f8c0b47856e0277fc2aec2b", - "67c87341c4406b82de38865d6ed09a8bf32c1bc002a27b22bf4f053511400ad9", - "4674f64f8b31200dd623785ac1dd4380c4a5869ff058747c4c7aa054475a9272", - "e9d1ee1870c4b304977be00c2dced11ba8689942b11b40b179cb9634cb2f5e79", - "29403fb9aeaf2c6fdd7ab98184ce3dac905bcd28e4bf23a91a7548a62974bb3c", - "783f6a7e95bb0603c1df77f80e52ad41b12f88d8de8135aa7f5ae0178a7db40a", - "1d35b902c7fbf9ce9d0bbdf33a60153a9ff2813429dff79d1cc4d81a859d4421", - "3f1cbdd356853fd7e22ef4e13048029ae82b3cf55b41c569a8a68221f719bac9", - "6f67b9777c66f3fa24fcaa30b095a6105c2e034a427186da1021fd296f0679ef", - "0784ed24fe93b8e344ac083dcb767e87c24ef1d338674c17c56f4ba339f1f54d", - "37aeedbc52432c4065c572d355ce11745a872f69450819c43ce113789376fa2c", - "daf53b59987ec3ba0da8dc331494d48fd94c3a09847cbd726bf01e0565da8d99", - "8c9e7191f700806d644259c94069a06d3afe030ad980f86599858ca779958e22", - "c9f54b6e3f4091dfb5f6459861df912765e5103ca201dfbc8587c10a440126cf", - "c0410a4d8c9d3bbe89b9c795e22d177476199ecf9c2ba658053251ebf215309d", - "c784c2e490dff2493eea843a1c4f55646cf008df9848d8fed4d04990fa2a9e71", - "a82b760ac8414840807a2181c83075ec69477056052ddc5acd43f652d06bb249", - "9eae969a3a8d7aeca5c4f7dfe68c850119baa2e5f2e023466483d6597981509d", - "8160657581bd2563876d8559b362e22ac42944cadfaa68bc1dcb0596be3345c9", - "34c1c14293da5ae053ac8bb6c85eb0861e5b4585ed7af8a706cb1932013f2150", - "7ca48edb05ab45ade1082ff316585e7113a0eabd6dab02711d144df7080b769f", - "79981a9d604e19a1e37b4326a3647f36554c5db198b044cec5b4a9ea971e47ad", - "86fe629372543fd05b371befc1b855f1b5bf35845ff5f7fc59efd60f40c59742", - "19660baa28cfcf0c40bddced3f3e8b6950f1259de8a00f867ce2ce1b9b6b034f", - "15426371e9720457ab8df456b0b2a1b8e6f9b4378dffa5907e3ed932c585fb19", - "695472511b4b4de5efaa308648910707d0a8bf01b8b1d17becddf369199713c5", - "a48f7d794a874ef6832099792c5463f0f31871f10c31c27143219d250f215ec0", - "959fb1c263a7d3460554e70d644912819ac2eb58471502029a6838ab0f5316f3", - "2051449a35ddf78213cf343a0798ede01789dbb9109d16075bc3d637b0f6f9b3", - "1f7d71d79093db3c2e56a67a4698f5afb91c130957f2c9d11d85c53da0743383", - "3da02c282d354e2fad8ce4808d6bcb29683507ad6e49cf4c44be84af5f3a34bc", - "e737e5c37653b2b1736ccfb87899f2ae1c50c03bad380fbe423dca1e05728e67", - "428f4cb5974ab02db21fe7dcac89515173f03c6ad794a146c0bbcf8cea106d6a", - "d0544ec936fcc56ccad5ef05d670f5d71380014733d0c13e179a0f447a137b67", - "a2af2c134dfff8e64e8b348c31a543dacfd913eb244fb070cbd423c2296fbe30", - "05f593d2f6c383f2b91fc6c27e93deb244a18cc4f6bca71d444a8bc42a0388be", - "b4d630b1b9560b1da0f7b112775719c95ce8974e7051f65ade7466402d43f080", - "82c0eab70ad888c475dcc91b5606a1484ec845e7c325cf858968341ff84da8bb", - "32ce3d58e5f6e23ae43e8765085607565dae3d6c6ba415565ab9f4a2a0b7106d", - "cd987e989afedc0616ee7f2015e12ec7e57ecddbf8b029cf8220efd1f615d86b", - "5dd9763ad2e15029a230dd31332557b7ed9951c52ef368e522e6936226a53784", - "52e1ec8d9a4d474d0d47fb7978d75491481649f11621974aa1e6ee6d6fb45f0c", - "2f9284ff7aef8f429f166aa30d111dab645a8ee4b0057d27fbc108ab8ff3e952", - "7b251e7b199828b077085d616572bd7d01e3d25019c78e359581cc3ee95aa90c", - "b806033bf05abee35e56791a6ad049118747134b22d65afe49a225d846fbeaa9", - "12c20dcb1cd4f20dcbf92863b62e2aff4557b2dc40b05087f066ed3e5f4a2e22", - "820e9a3d3df063e27f2eaa3358c9ceda67aad78d850ec649de643dfaab1db251", - "20e933301616642695b5edcf9bf300c543da14194103deff5530227bd75929f2", - "d8f11858c76cf6d22792bf059ab267a606bc42e9b57edb42d858117b5b32a11e", - "f613f50aec140224e7f1ce82adc9dc378178d8a28b2b8c8112a8c2177239b1ca", - "5845083878f47b249f72440cfe472b9373130ae78a06a3efb9b36a4ac78bcef5", - "2ae6ec36ba1c91c49955404a27879d81a181cb30189d2584e1aa9e9c247e459c", - "ba31c081afa36e144767b37f736575497adccc01d103e9d9cf3888bfb1518d75", - "3b29fb622dec3bb056ec0edc5f11f651265bba3ca507fe995efe71fd6ca466e7", - "960e622e5b57da0cee7517aea3bd39d09d5949f0bb579786713e3ddd8a036eaf", - "5ca30a628d04e87b46acf3b05acae3d05ef125bf8ee05b45e3a20776a64dbc5f", - "6f36fc77617433e7a509e5527d2ca96563751973446eaf308c5bd47164c7d65d", - "f310a9a849b1c91e2d0b0e567f79c3a23534cf116c827b0d8d27f7a975880c52", - "dbdbdea4901895162522d6ffeae36cc5464fb355939d92d9d21ba7ab0644aa59", - "550e09871271e442e02c3fb9b389a5435cf096762ba8ddb62d68e358f7df18d1", - "87ad00e47896443562a783b8a792d745c3c32b739ebab50c1c9c34766cb72d57", - "c9832118f093dc9c8a5bc4507d4007df5e2f4f6d9ddbdf9d5f5c5cb2c4a63444", - "362bcb24884eead62df430b3df14e4bfeec9c97ee00d4cd520a67edef44bac5c", - "0a5642fe4b97f3f23b49f23193eb1eed57b30a6031d4bd9d37978f36edfbd802", - "694d9a99905ccacce5a237eb82e94f3550ad3f8cc5d7db12db47480869853312", - "603650796c6037f2d35fa7b789e330036198a08dd18bd9e98b664ec4d25a9be6", - "3cb226a3cb8c1fc82af6bb291eebf5b9742160fa651177bc202b203dbdcddb9b", - "9d21f55c8311c48237086775199559897041ed46f2f9c567b0e0014b01c7a2ff", - "ab23baed047121951a4a1e0f214a59770daba20c06d46b180460150dfdecad98", - "0c5b7e591cdf86430ccfa0e9151663a754576c1a1015a21f7b8203bef4e4e6c3", - "9ab9e70903add3ac7c4154cfd8fe344b0e95441430a4ffe737d3dc23a1d2d3e1", - "98e7b59e43e321fa81570e036c6bbb5dd1906bb3617a293e0c4d2edc0b25ac9d", - "fef247dba0229dd39c72c494510af56f7c9bf783255637a96e2ec8df37eaf940", - "d705efa0b4306d66e283601e081299f5ce2517cbf2390fb345b4400a8ea5c7a9", - "f7bdae6c98a2fbde8036626528bce8f5449bc778452d4f882637f6b1211ead15", - "ac08977f64d161144d9db38aee44e7d0a138993342816ce088bec954bce6f0c2", - "29cceb492e52fdb28d349eff96fe6a7f88da83b89639e43eb6a1193d29bad36e", - "d8834d9d314bd36bfd932d90d4b95afeb0ea438b9149870d6fe23adae80a7313", - "ae61b0d45b385c1369e89caf6938bf954b815647828f3cb89543786940c470bc", - "644c342434ddbc8fd2ee77d87b6118db746b812f6e063cce664c8aeb046db7ce", - "38c09d97b77c9d100c6c3c51da2d59473fee6b53a823ac263b1697ed7b9aefd5", - "ac4ce981f02f72d35b56b8b1fa2fb5fc62b65acd9bcf0492f1f03186984fb2c4", - "ad9d26dad0b0794d0843ac0221a9b668a68d231dbfb92c73d1044c8322122c3c", - "81de825cf1032a798a72462acb6905887c4963c97e114bf07a4113fd078bc0d0", - "b5960ec56a703b85d496a0be73db306b1774833cdf7539e5c50fc313564068eb", - "4ba6ae01252c42da4a32b604d83e4cf3f08bfccec66ed0319c309cd387f57f61", - "cf01619675b8d257f7d1b6ab9186636ac6e4be69efce5b79af9cb2d045c6cac1", - "643cf852656460a755000c24b16f45ff4dff236c57155686ce193ddd8ece9f6e", - "d6471912645e56b602a1d7c45004578f195c4972d6617267caf3943998b49828", - "f80eab623edc3bd12e7d7b819735f1f952c2ab0a2c42464ef0d58503cce84046", - "8913fc97b9b3d60341dba93ebc8278aa4ce6536211f601cb8a2228767e0ec438", - "1905fdad61bbd3a10b7d10834ff705004c3f74fea10ae043ee5d1dd3e8d43b42", - "2471c9346cd9187f41debd9434eb2bafc9b83f3f3d055d57025f86d65668feca", - "437bd812c9625dfe5ca64806622138c9e13f65928d5f45f2f46abce27bd17279", - "5ab2cb20a8c2fb8ce82844f3a457f6bb9b503f0a42f5551d3bba3ca42eea97e2", - "ce58868709e273b2129b8802f93cd6ffd70047c74939341aca97e402bb834e02", - "554ae627a522322826f81648b4ed362dd0ae4be5baa6f51f7d34e7416764786e", - "a3cf4975a28e0f8b54bed3cda133f91eb9141a56ad683affdb56138f80e6db40", - "a296905ca644fac587e718a1f9774258c481faf5257f2ce50465fe6c53e2b2cf", - "46f1caf8a2640f408ec7e8896bb7497ebb1c6398d38e3be8196e706f6ca36c80", - "8cd54bac1f3cdfb7403cc4f4bc401e4dc47faa91badb41b4e2659e7b02ab7978", - "6e7f8b49dccc02e89c8c1b35df0f003bca6f1e4e2b3b676517e85083462595cd", - "9dc8f911d3494dc40aaf2fc92c11c1d8e5589ebdc4c1f9267e5b0ce234dfed84", - "b9cf5f8f6a5753ca8b7c35a9c225b456453f1f91384d77dd6d6c989735c9df4b", - "6f64867d679a5e6535d1cb19e84bf0641f04d1f28798075565251b9fbb528d8d", - "da6252be731cbd7fc0379b799e41c6af8091c8771e58a92cc94ec16be55e79d0", - "c972d4ee1752ec3a8a306175ef98ce5beb34473314935ae3cbb2cd6c34807edc", - "37f20fe04c91c41a6b7cf09722254ab361f6cffcbdd2d5bb287bd4a342f71e8e", - "a0cad6057c171e4bbe94b905bdc7e4fb60ff162252295d6572afc1ae1ef483ab", - "bdf05afcf5b30c5ffb232b7cec09a567ef86d9d8450affd4d5d69169b7d4d5e5", - "c27ab1f909f777e69ed2027b2a0185b4f648cc44697afc5addd89a494258b1d6", - "52c5d3c9e79c1107834ee4c622fd38ba1510aeba4da1b2f0294801c96f35f976", - "411853c24719c7790a9bf5c76bda3f1d2aecd9505838eda84e68b221e26631e2", - "3dfbc17da16c460e6c5dbb3a24eac35942d7c8a42af4ea535eddb77c4ae74bc3", - "8227f50d2449c0fe199bdba2ad31db4505ae1aa01328d1ff423b2d7f4ee251d7", - "c5b5bf21ed358f8f63033a6316385ef8425fa6a81f80a065b76a88ba35a41b3e", - "36baf37c2a4f9ca6192439e0b5578212b977eca79e5f41f2072cb49bebc21563", - "4c663ba4376e43dc4098256534068a51b87154615e0e7260d11b427f59de4348", - "6c38a132ef8e28adb546aea0833153c71f4c9474e46fc3cd8a71588b55c918aa", - "96e04d8a8526abc4b7f2da35d2e89beea641b5569f1190d264e065ab7646a330", - "8ea9001001337d12e5d0cf12e12a9814b92012e9ca38cf8dadc1185062f7f44a", - "bf18659a47404fcb15effe81a668d96f4ab925798da9c36464677f6e6deef8b4", - "6525fa27615267d3d9807a9ca80a810d76f3d24970d0715eedc68f105e20d28f", - "8058ce2de75a8c5b7e89c2d7a2b474cf3d70e392be9170dc62145f69a9d26f63", - "f757f305a3f1fb6b3a12f24891595d889385b92142b7cbb1b810f86ee872a8a5", - "72012e6cac57b465fc8614ce973b9433de5ecb8acc6ead137c5cd1b47cc4f435", - "811ec6f89c06af20995c9bf4a1be8cb5af25d855635042472cf6b2d15fca3e9a", - "af123085bba3f82abebe923c968ec4f74e3b0089852e8b49295c8bc95b1b58f5", - "c460f2c706b585c4247b93a57cb5cf958c34301b782742457b68ca3c062fca36", - "2c51db7c8ef64bfacd6e986039efa84ac008b6df08b1c5f84aff747f6744cf97", - "d85552ef5e152cce127e4f200cce61776ce263a5056fbcd052782df10df6d40a", - "c0c5ede95fd279d773246677c34bd5f8fd3581734d90275774127a7ba43491a5", - "b189ba623c92aeed2fc85de637dea98251ab5a68bcf27325edc98ebd840c876f", - "e02b5e433112f9efa6b6bff35e4b4c2b356d40814769dba740673f1e62be2679", - "636af736f990c0c8b2d613380dfb822e03c219372cfee4657d683b0780336592", - "521d59f4f4d0d373d6da59c710029fbc33c7982536ed9619ae980358370338e5", - "08b61c502cc52d97fcc3e0fdb182a966aa13d1d7abfd54ba015428beab2fe696", - "8e6ba342d67524f2472b2ed35a22af1c94b05f2e485ad9a0795c78a129b502ca", - "d78f5546e411e54c02e9743688ec44e3d4b1f0a28cd71b9731f30eefd86026cf", - "d1c773db9c53ff06afbb287c0d98dd88cd9ee378018215aefb0f68f2b4c9f233", - "786889cafd075e27a4027cc5e95017be975ed425c65c9f1361770ff6e8f7fc0c", - "b69368701fdcb17737da5d59126c19ebcd6f19640b7bf553927fa565ed412b2f", - "9d967be28ead6660309043fd087b98d39f40a5bb66f51740d1da9753e9b8e95c", - "1d17df411235afc4bbbfcae051c7e8aaa556880387cfa7bac129bfbb50600608", - "f4d0ba36193bfe610336621d1ebe1b211d8825e981ea5a995920861033e37ad5", - "64b7ca4fddd65a052957c0f191ee252e512dd0df19ba98b6f9744eb07296b319", - "4ae597c423189f9770f8c947567a51d53bd91b2ea621ee6c8f4f985eba163996", - "4e258b65b61d48868180599dc35795ff5a917879c871c0ddc519eedda040c6c2", - "b78857e2d4c5ff24c12d5b2cc8d08c7ed12f742b30805a983ba72d9e7dc6105e", - "d57159b6f0f8dcf7fa0e72c78e369aecec300873b150ce90da56007a87b4018a", - "dc866aafeea1162ed782a025e4065f010ffc7dc2bda18ef511c1c49023f08a8a", - "e88c3c4b845901cb82fe6c3e64ba468e60356893dffab7fa8f1c4f1eaab7ff24", - "2ba677a936df57f46ee377af3e53caffe4d32c2931a019f4a167afe3efadf0d5", - "01baae12ad47b3aba6166bffbb7bcfdede291e570eac7911a52bb14a7ac392c6", - "a31e66b8d62dc7be59911f7993ba8feda748bcdc38683e748262e83355063402", - "cd2cdf61ace3d2473666731abd7bf83982346ce7e2081f07dabb9941cf1c6872", - "3b4cc29ae4c33124e3faec3334e1b4a1852837fe5eca72951798ae72b23fec4e", - "b549d14cea20523057dd99b63c23b48ce6e04d0039baeb4c436fd0e943702092", - "15de6b6820c97b2db7a0f2edbf621338566a105033fdd2f1e826a7bf590e94f3", - "60959b069d4cbbd204fd8dddf82669833920ed50a6f35ec81a11060e5d437b5f", - "57c7b1482aea2f321f5f13cebe57241521a962de328992042cbd557bd912218f", - "7cbd0336bc6b4b1ffd909d1e01dd36b02333f61ca04983d265f0c2ba44c2fb22", - "4f1d215965b4ba17ab58b6d2af10d74059901f4508c8f74de82e7bb289760a15", - "8a9807d24f6c11a920f92105a4d1311811529b0c71d5ee4ef8270e1aa72e9d61", - "11aa8f28a19eefd2e3276c637cf27d74eea4f8bca616368eaea60be4ef9b05a3", - "35837208890ff65c4f41da95aa82b0ec817a997f70fdb924842ac74b49eb96c6", - "846b3fdd212780da3f1cc27589aae8c535c43cc24c0f417ed666aa5745592b5e", - "779b755011ba68b1c6f2abe2a56990e18b227a5476b09c3d477d631e02e6e753", - "1f3da77596da2b41f7952c084a634d99429489ca8535da416982e7c729ab3f1e", - "ec54635ebc5eddd640b018a9ffdfa9c97c3addfcd008273bd0ed89a6c56ee63c", - "0cb229175e5ff5c17ca286834e5e62446f9239650233679e96c3b40975fc5bee", - "9fcb6ef28dfffae87a08e1b34fc07ecd2e2c44002a50946a06d2eb78d5d431df", - "7dceed9c5adfeb2395ad063770c9053f367aa8e7313ccf7c258e35dc0c38d0f3", - "5731484ad57775390968e429f5fa05d9f79d82de1f85a1dbacfeefe5893708ab", - "eda9d69f5c155be56fa2432067260b54eadd3a6f31e8ac3be5203dd90bb103f5", - "0f8f6ca892ad0cc0726d01aa96f3876ccc8d8028e44668d4b10ecd5c492c2f88", - "0a2e7602483970eadd5798c54fa6e753d917b1f94af8296c5be2bd16346bf2e1", - "9dd73f125c133efe605f464c4f125055f236cec766b4592d26857f6b07305bd4", - "27d50da6d1eae98ee76a5fe215afe231555c0ee6eb983ac4d4dc24112e6d7c10", - "66642ef69ffec60a6a9f02a5b3ad274a75a5f64542691d34486994abb0c5be5d", - "30acb4c7e77504571f8263a4cb6181608ddedb6d0a5988f3699e241965330d77", - "d22127919c7abb8a4ae568715b7e42b5cc7bef080bb70e1138ab0b1a15a4a771", - "e75c24f23a554e8ec799d6a4f800067caada5f59513a1447c20e4e622bf30bda", - "c46d60a1bd4db0a9bec3f49ed505268b8862f7969597cf5cfe2bd2e53643d68e", - "e79bcd06fddfdc4ce306b96796efdf425c69c1834f19bb43d140cc3eafcaef0d", - "9be49e76e5619b648cc442894c7e21dc22ecab79898431c97615e0d0753aabd1", - "b9135df07291db2f7fb660db7f3fde27544a45051ef968ddcc93d50de8831756", - "2f4df92a7fdbf20bbb4b9c6e4959238057e234ae39396c1c8248e1a04d0948f9", - "b93d4e6b9ad6454bc6bc53b8c6acd4b668e0ea1762fa53c54cbbd6b32ba3d02e", - "67289e25b2c1a29d578872633ee417e5fce9cc0a98bed96735c93a8d85b41abd", - "b46dd90d02aa25b73b0f9572fa73f00615b02e584374fcf9ba0fccac6f7ee46e", - "5aaeb96686c91685b9401ec6a801df813010193196e94d401137778bbb349be7", - "fa3e75286ee0cc0c1ccdab0ac2f7757e4dc967da48fc9acc9ed71aad6e09214f", - "5e51fed4e5838787e7e2216ac66886ca3aa32ea6fa374112e1c710560f26592b", - "d60f559c86c0bede75d2d42cd693f0b52946687bbcfff6e88cf4c774393a7c8a", - "475fd58e0fe7ecdfb755571967fe06371a5c4d14c95767ac14e4d0dedbe1dfbd", - "84c418f126343ea5b64f046cb978547ff219021ac652df2825688f4c05ec7b43", - "9289aeafd993b29ff0dbaae0cf89ec8bcdefd233bf0f3d1bde219e168c0d1070", - "b8a0d36688a59a0bf540c595b1db94f135ccfe9b19ea33333bb4dc115aa5df66", - "9e61340801f30ce7f43e78e1710ee62935e76ae1336e66b31015598d531e8f38", - "2d3d24a08e85080fd38026519264a4d0513bcd9266abe14260a057a6d878c868", - "fb701d339d83b8865a8196fc7e0b528f462e1b05e3c3e2fb7ab53296377bfba1", - "33dcdc229d244ab93c14b21d23993b8d11a66b62e7b15967d43284693bfd5b8c", - "9b73322e732c2a53ab1ab34c7e044d45b4f8426782a345ae52ddad487f8088e7", - "97c40420ee3dc9036198e1d20e59dfd5d45615d730014200782aa0c0eee6c517", - "63b812c201084f84d3aa4239e1e4e5f39586ac1995627101c54d43019f1077e9", - "a5e120847b968e63285c813bbd201849f200a35db293bd7a820cf758a310003f", - "e1d7185f8f7a406f099e85577023622bd69fb5b11b145ceebd9919fb70f4d796", - "fb9b514ea03676a5a8a1db70cdbce898b67785f422b932affd99f0f00ade4cd6", - "768bc07ed93339ec2f11b5cc7da667f907614bebde446382cbe02d5f32f40eaf", - "e622c186ba1e54cad2279d3cc271442f23834f659050476cbe7f7152740be140", - "7e02d74f350fee6fafe143e567a845dfd6c2c73e545a9f8d9a139ebda397e712", - "79004139a405121ff87014267148dd3df264d610ee555b120e5351157e808984", - "b02240616254bbddd9bc998f7556448b8664c4f15f7e315af494eaa164e8695e", - "529067040abc67567c5404cda5a02291c36041e0985e3e08d5bae1db32ef1cd0", - "ce7738ad3ff901bd9734cf9981074e7b62dd2d93cbdd4c35011b942cefab9f25", - "d8222215a0bc844a2566209d77e9102cd8c5ba2f5ffdfc8476a45f9f8e50e97a", - "b456851360bb99928374bff0f61a5155dbaecc4599e824124640296c3cf83a57", - "4cb4e994c72c838161d7b20899ebf7bfb2059d9c782a0b632639f3c4c65b352b", - "c44a0c92f284914b83f450e34c335c82dcd28dbe0adf5b6a2711dad58ad7247c", - "96376e7aa64b613dfc2b6bf6a8352bb77b5a4745d17e2f4135fa477457983b91", - "7c39a895a0755cd7674f826c73ec091cfecd43c10124535bbdc8a85ddeb204de", - "0dbef3dc0250b838f976314a71151633e92fe9ced423d5cab2f43344e67c6550", - "ee5c9d37b30f875b0d3024f68c6acfc9b071cf4d22bd84f4c7087ca78d91f3b6", - "335e12890ec95895c8381b022a2b9b9321326a4ba83df82d8665e98df031bc30", - "bd693eeffa6f2a74b6b18a4bf10062cdee593e8af8770eba0e053fcc0037db21", - "dc73c9bf02f6b338b1cac0784b872718ddb0591c4e142be2710b18ad189832d5", - "940616b61e5989e7dc13e77b64db3409ea182635a5af3a9f0a0b4ecb2c063ca5", - "9f6dff78e899474e45661b9cf0c057949cf7ede189e9455dc46c93e729582e1c", - "db378595a711924ffb1a9b05c9150764a9b606bd1bc207e60376f68435da0ce2", - "51db98ce7a82d6e3f4a5b19a65f0f2b3b76d9c2ddadd3850ea4602cd1935b8d0", - "b36a0cc78e0b8a9fce9e44b0860233b97994398b1f87971734cd41a2ef647728", - "a5afc561ca78f41481a941859110a1e59739ea4c5ec51b59bd4ef4624acba9ba", - "b851101c03f264165d35a00ba1a6753af618652050050be9e3b542f09c618a32", - "ffab562f43c031b40cacd7fa8f363cdddbf6e3a5552bed1fcfaf139994ce08ee", - "ec28265217280f136626a52a49c04500a9a26b0bb646edc32d9e1d57ef5b7f2f", - "1b10e4d0a31a8effb61537782d9f3d81caaea0f96ff95582edd14cbfd2ae9f24", - "956e71d3364953bb3163f7e60b7a4bdd113e4ea02856825b122a36bb48114bfc", - "64216673fa342dfe7782a65c9f8df4ee865acdf35adc7407d63696de5d004920", - "4790682a566925fe0e9cfcf5612c7ceb0c803dd9f3987a3b0ba29062be850252", - "6c1958cfaa2ce25867ee29d1965a70ef1369f91e0e957851197b54e9968e6b1c", - "c9b07ff75a0cffd66fff8403c987d37ea953504abc5a1e5a3af24b221184fd69", - "6c0c6352e4eb123b0cf4c8dfa223277b8e5fe3fbd054b0af157fb6a357aee4c2", - "a605b1a9cae59ccc855efd149b8510637fedaa764885f7b8fe0d62affaf5f4ea", - "e7213af390764d75a3d515db8621de4d94f304eb2796935d843b5b6290b861d6", - "a68247715c1ad40daccdb66a01b21f38133c282b81de83d4276115df972a1782", - "e279e4b47aee51c4ba838d52eeb9e568d5d2f1dd5ca94bdacd663aa3871c7367", - "a3e1d360cc9e15d4e1766271c4a5743aecf62470e75db49ec8f801e510ed8ba2", - "c0d611dcbff91944b2514fc867be7898807f118276a9405a1e08083fcb267c90", - "c01f3c43a2f553e0e709c8176b3d653fd9d75148db6077befedd99bc1180c97f", - "e44400fd86ef93de1fc79916985e5477933da52a9db3ee5e1d5044a0b8d9f2c7", - "0ecd55c113b99135c94fbc5f16ba09e1e26ddfc9586011e8eb76d95d378d1117", - "bdd51675deb9daf5840c1d299b77114e71fb97137cc69716716586bdf0c17916", - "3267d5f675c1b8e7b70cc3ac227c62106dc253022821b648d64c96739b598720", - "4865e380d76c647c6b26970532e3ad7e7678fba5e132c1851c97b6c5b50251a7", - "06567c240d035151dde810367231a49b677b8e67be46f04332b692f80c3b663e", - "d83e2170f49b6bab42236ef50f5817aa0b02b526f5de4f4012bfa2f84bc204aa", - "2f08f79c7e83350d589f6ea6dfb4e1b93f60c1322d81ec2eea7becdd34095f3b", - "df2e9950eb60bf93209be059a7bbde9c9c18f01926b27ddc5c7d2482057da584", - "e9d4a847343ab26a84a0be0cfa656d22189e474d631f7a15b08c661a0cbacbc8", - "37efb3d877bd09e0a64d026a4f53314b56aa4e2cc8727b921b0cb697257c489b", - "27d022e7f48c2420944660bc5803443fdb1a032e8b175dd022f6da935ed894dd", - "bea93cbaf7403c3dbca6a0ee4def6bb60ef27a447fabc5e4fd792154966dff51", - "edc5d5684d5de975386e5e6c5602f208b00e03801931927c8342bc25ec0c264f", - "943958b8950d7d62a840cd845bad8d03324735ea16d3d2e5ef87434d01528893", - "38ae185bf60e280b691ff93ef7494680ca1c1f78bcfa4dc4bca315ef02e7d5fb", - "aae1f5de1bfda6427eac2b6570ebca5181d36b215c686e67833ccf1e8b65be50", - "6cf7ab6787aed94754ddcaf99bdf02a1f0c3ab3c55464fac74624a22bc41b620", - "8deb9a9e73c4ace7c56c16291a729d21110e529bdda6116e55a3d4f1fe299747", - "633bc26d9be86fc0f42f8c0c2cd9cf814656703ebbe158078e0b3c10edb99206", - "3d40ab693103b5981a9e6a867882d278d23adea3dd16db85fb0a13ecc0386b92", - "ec1be15a4582848c5988834ed38b5e10dc3ea23e63b01a3cd9a56bd3f1938b9a", - "02b528b7967b653b3a18ac27b5ae9fee552c7ffe7c8a0e941e4b4e6d6d309d2e", - "c98e7b6921618c0f88714b2e9bf59d0fa5eae81829377c0c4a63a4aa0de78704", - "f49fb465ba1643a80d75380a9c4cad6dcb296c02e2faf22681807f38a16f5029", - "154e46b4d4a591fd81ffee0327e48ee6c90fbb08195c18562fb01381a518f80c", - "70342575e10cfaafad6b8221a76ca4aa5ccb5df85b7435c5a5cf02740c117960", - "232729bc31bc50bbcde9a04dcf45c256a309ec808aee05df8892a90fedccfdf4", - "a84de86772430a555f5cc79ac2480b733ac873dae7dc66c35880cd6b26cc660c", - "1283da77928375640640d0800b206a632874907f98b8fb33cefe0e24a8890837", - "70104a701ffcd9c824a093c5ac74da970f8408dcdc980cae8acd199121a708ad", - "57ac8716b9a902b5760113c97838b7a2a3362e558f82581fbedc4054a8f3cd64", - "85b9eb530bb17afb9f332d745c7e81fb1f3d4b532b2ae0445f9cedb12b7f3a77", - "edd7fbaa228bbba95714026796ccffc4bcec94fd0e2c8a1601735a948e24c791", - "573ca2d8ac2a80d0ffc3fb3b39743e020512437cc7c64d1a29312fc4981dade8", - "9f10454af07dbe53bfcf16796e6d1f088cd5881d56568d9a1156400aafaef1c5", - "9b1e7ef0266d1bd861f8c3edf13c95542a4c3d1dffcfabcaf016a1fb3a0dd8c0", - "04b73b2acb828bff9dca9c466ff0f92b8abd6ff291cd906d9a0116d459f50137", - "65a5f893369069dfe38e6a25e5d313919097280f8e1863cb3d8325593f241f4a", - "e97e0e132ace673573a30a3f097cecdc69f32159b983916830eed4295ae9a74c", - "cdcfffb2f9598aed5fc48399169cda7c81022ce204b6fbe451d2b67c3bfa2f23", - "b62b9feae846c54a597974a806bbf81dcf05492bf3461dbd893b696988b4d823", - "ee69de984a54ea422b8f98cdec2be7d4af2c538d15120a29842c56c362be0cdd", - "d6a628ea67efdbceec11b6ae2c146452aab93f864d3f6cede1c3f58d746c47e8", - "2523803c55fceb415d878028073992e790beeceb27a9d16d774eecf56d670a79", - "f5e5961aa46a9d6f238bdff84e217e2fafd0089c51204b67b33a15c289fdd9be", - "b9b97381ed2ab5607daf47bda7afdf2f9dd1f0dd874180b34d6d9ce8ad58f303", - "2cfb821a4def2f5782770586f0d03015f9a8f25f808c0198cb4accab51c7bb29", - "199f582b674ec910b666b75c266e2fe53fcf47c58c53df77b99bca0c1ba8fddc", - "c9dfcfee5a85f7fba8255865e500e7da382f25304172ff32b4b186266eba66b0", - "9de6e60c8d2611a121633b8546f5f09591c2fae8501f85a9119c4d6d25f2c4e0", - "97f557f5dfde88aeda3c54f23e7cff8ba4ddefdf1e3b15b4c277b56184744765", - "ce2056305947a012137cc232a9ddb75692d86413c05e4c55d9cf4be8daa282e3", - "6e31c31e10ec5388052436d7f8592e1f42076eb495100ede3231bb1cc44b0f1e", - "39b65e7ccb36391cb8a404bd8dd6af2bf5958ddcc1b97d3118b324108a0e6d6e", - "c4a2dcc21627f18af4e8dd3dcf1dcdf746d989cdafe5220d2a4048bc30b2b0ea", - "360d4fc342998c0e705726c2e4f76b84d11042fc4d4463649eb2afdeea8aed9d", - "de769dc0b74013ac6a5e5c0c58869d045e2631c69075d6a79b79285a8aaee1a5", - "bbeac7ec9b8c218c593a2dd532568dd450899df1afdba8eb3619a67ce8259d72", - "90bbed6cbddeccbba6c33cd4fae97e3e1e0eef0f3546e2ed949e2519bd11ae5d", - "3ca2ad998178b5ae0f7782594b2f5a596edc57b4566e07ec07ccfc10b1297845", - "e7e62221395990c33ce04b4621d6105856a1cec3135b7a054d3006df2562e81d", - "a8aaae21dfd2d1d893c264306062f154a57c3f450a3b80fa56057479a6302eb4", - "ab6c7cc163c84c989d3606da510c465930548f0706ca035afa79d77c0e115635", - "b95fc19ef4864f03e18dc477d8f81ea00bde6ed6de6f70054419b4295c1041c8", - "cbf7aa80e014efd7bb6bb856291b3df9fcfe24ba698d9a83b907bdd8d309b939", - "21cf25567e1239b60cb2b0b2d18885c7d5553a8423c190e2e68a86db9ce3a220", - "e3d1ca9b7c63b770ebc04552db93393a784f17bf73e890fd031ea7e9f4acde2e", - "deaf880515c3c600df1944c543bdb4d8bd5d98920c477e5783ebe1d729536dbd", - "f29e1db0aaebd81bdd9a81ebe82ed07762c49c2a7106536b9b60f36b41bca491", - "a4c32be963f1bb9aa4c4432672d7fbadd9a18da14929bbf0cf7ac505baed8b91", - "d762d4a087f4d7060b0564abc19b60f796072d45b7b4ed2108a2c8e8394de750", - "8f5446647d8eee16647cae93c1bee21bfc143584d0b5f7f8d02af4879aefebaa", - "526a1b4bc7bb056cbdc9167118d0ebc894951bd988a394f2c41b34e1824a242d", - "ff6c908e73bf8790162395e94b3c7cf7753717af5ba066e430e4ceed80bfdcc1", - "360422001413da827ccf186bb5c42dd41bf0413205f9df622429ee4b607c92f1", - "2162874f0e1860442d5bdc46091c1ea4d8fafc52afe711817a119d6f4516be97", - "3a91faaf88eb7bc7df058d2733963a8f659919523ae451b7b6874a4980878816", - "2ee40a8fb7f9782c1a67536e2032819a404091e240593daef1fd9ee30fd28431", - "7ed9be174947d074662cd0fe73ad26655a3e46145191e0d9eb1665e54adfa30d", - "4a6e47bb5533f7d80f13aa2778cc7a9514b54fdcd43ad2fe42c7e9ba679be208", - "a913ad2d39db6d881342e6c41f2fbf7cc9eac2e2af8d9ca4afd543cc025a2f74", - "be8542911c1d01a91494463d57715ec2c984ac4d228144bf528bca26a6964a66", - "4706ad851fb81000022bb75f9552e6f28b16309422bd1ff73da958920ef89c90", - "d3a507e133872f627e116b4525f81726ba94a64569d0e9302a1b77404eb38bf2", - "1a78a391d64397c28ce3b45745aed21c86a1ef1a13487e03e1a3e5b85dac3e47", - "db93502193c4d07d853c81abb07a04905fbb14308fe6587b1d557ef505dee180", - "52e9162b90321c73467442593395f7f2bd3f8755d4a57d3101bfe86292c06c96", - "37196064f90bfc41c3a2ef8b727a9f7261744535f104182e3c5664f92f444952", - "279263e361afe5c90ca41abddd492ce9553d793fe5d6f3925044c63e44ca3ad9", - "7a4c6742f720b77960f5f427be49f5d828e01704d32ff186063bc83a115fcd6d", - "55f9c8adfee19e0f98afec3addab2a10b3656cd2e319bcfe44c3474f033776e7", - "e5f5c69f3ef5dba5deedf5d543e059d9544ecb21d111a86fbfb7cc88b9e3f6d1", - "fd9ce16c39ec293addce8a0425e6abb5b6f5bdb1a02778f3c78fd049af46e4dc", - "c154ee2989cb2f45d4da36325b0b40fa16f0ba8adb1d93403530bf59f5711f06", - "acad3e687dc1f4a4346cda5e43ad24e88b20b453466e4ff04caad028182187b1", - "cbe443d4fe15ae3079eba26ed45b9c69d6512f8bdd6240384155659332e0243e", - "27af6e925e607fe2c494ba3c174ac4e2e59d9051f716a767769a36fad3b412db", - "c7044a16e236015545eda70a4526ca350a17bc116f967a50083ddaa414e97ff1", - "4485d7ac9954d4116a25df45e3d00c3d5462e376f9701a3e414ef4591fdc1318", - "a5c3766e20f69cce6d61d7e57add162cc7a5f2d719ffaeb1ef7165551f1685b3", - "f03f6fee252afdb496c6fad0b9f4f0a9f7ebdd8925a531b3192607e281ba5474", - "9d3207af0c2472fb16bf93a1a22c0a7276275bfd93ffc12a8ed9d27425585ba4", - "f52840ca9358c9aec8fd069c9a43c550a8a2513cbf2bb3a5d7b7115e885eaffc", - "e02f732b55105dc64f6a4f1ec15d3b278bab8b9d36e29dbf692df2b97279e9ef", - "e252b72bebc4045f3f9a2d39ad773b25b259fc8bf9808ff3dfa5037f265fc2fd", - "e97a6bc5cab9d398d8d2312a73471c2c25173967c43cff8c4ad203a5921d7333", - "73e55ba8bd213a6542c6bfbe0db8046e69dc7bc7106d3290e36298e12ff405d1", - "8012d293a9e402376edd7d93d77be87dbb7a14df939f47750719b3872b3eb1e5", - "f93fab3c78f35a5bed62d30c4a530b6081c5bbfb8ea41e068a5f873c2665a125", - "594142455338a4188518f263a32f3cf07bd9341c85eb25976fbfe0770a093532", - "7302a9cf3bc5d45f1a4acb09f3b43ae10cfc69d4ca0525eb2444bf678c2b9049", - "af123e9041f857364d6ae8a1f1ef9f01ff8f9401e860803119092e55fee8aa85", - "7c16e9b805a7750fcb9aa35a3d8e4be4955f7eafb6aaee30219cff594a7c784d", - "d045a0531048143d86b9aa8300682d449fefb668b4eed734d9443a568d143c95", - "26a4fbafade72f8e3c51874f19f2009bf41e5a00788415f607fbf84c99c3e5f5", - "438c74246985b2dfe9cf13554ce0b958f11f09f75f7ba6dea9fae34e9738cdc2", - "3b7325f9fb5e08a4c574a49366fd5d3e591024189f12e1e845a710a6d6109ace", - "891cd5e09d6ae30236b12aa27a47d0bc56571dad1dbcd4210c37eaa78781450e", - "326ca843373472f2d2bd0ab3bd42585772705a076bee18d4913b2e8f64132733", - "a9476f0d7d95f12075d0e730e8bd180bd0d2b79ef600811628e337650fe6e8fd", - "631bb43ff3c173da4d7781e6e8c7a69ecb69c8c95c88dc74444bbc567ed7bb4a", - "e077c0109a5eb3a940015ef0907ef8cce7a678d8538a5f94f41509f83e25eccf", - "877f491f082bd7505004876c6feb7d7b0ca64ba75e3149793e49033f23741469", - "de86cdb5f7abbfc74d9e7d5daab532225ad405dbfdce635e960b60b4c184fdb4", - "7dfd1178a8bc7a15c1f5fcace6ab0bf02f303bbeaf813ed071766b99ace798f5", - "7ee0fb2269172acfb426f6f465cdc11214d9e979572313b307ffd9c89f61c318", - "89caadae117d92ac6d53da4e3c88c70128ebd910d091dd4b6406a5fc7375d406", - "bfe3ca546471fffd62f577ab6e1dff72695df1f18cad398271c72baa26fd4ea1", - "c6561ca4c8ae50cdc05f7b8f33e32f763018825337f44c4134a56494e2686adf", - "279ef63b9a9e997fbd9e0462f9c8269f27ca16ddd01536217693239327f38172", - "7f1ef621b538b104c952cd19b9de36b863f4830ee76c3edbe99b6a65f4be2daf", - "b7dc43ea777a4cbfe879ca5818b43cd315303d8e7534cd77aec2df0b20f24066", - "57f3d77127e5b700e1d100ce7ff05de5c9e33d01ba57a118ef0ed261f3bf80e0", - "9fa2abd8380bbef7a0ea96afe8d3fd91d6a250783a0e1b0a2c657b8c3a343463", - "c650111aab2e9ac6f5e58913a0ec2ef4449e622e080d7686106318ec2ec22988", - "a80235c6afdff899074626f844a35dc78e3a95890769956332d446d646bcb830", - "c6aa7dc112afd1c8dcc0b4504ecd1aa04506a8b49c307cfa3d84143b72fedd18", - "7f3393d18bde678fbccd7ce89f0d2a9d3afb0c5e53f23f8897348809b248560f", - "7f31f88a6aa1990c5a91704516f7cee22d4259c0851061254f64bbdad4232ce5", - "7c5769768e72d31ab82837681df178d46f9f7a7ff2d1e8cd0765246cae5eefd0", - "546f63c0cf2c707dab2850c3cfbf762dcf98709154ba88c3c802684d79285955", - "131ea3517be27f04c24b66361abbc3daeaca9e97a931fd0f15cbf19988fd944c", - "59579ee5d8e9e176ac748d3200791b16ffba365ad82dc91dd405927ca371140b", - "98f10c1edb832304f79bea5eb9e9e4a383d70563b1673ea7a7c31eab2459368c", - "4a155c908ecc72a57ffdeb176f6b4d0358291b58cb0d69857841416df8ede980", - "f56304c070b97b84a9651654a4b79e6076378be5d7ca7285bd6f867507fd713f", - "fb6f25541e6ed900aa9eb233aa6a2ab07e65ebba150baf662644df71498c2905", - "3c2e2c80696f23ad3c0075e9bea654f1bdf4ad386b65ab8c67106589bd0b3567", - "779496a1f40db46be857181ef53082781b1581d8bcf212aa607190759657bd62", - "0977090bf105aa34fa9aaae88b9fe54cf6dc6dfb32e505d216d35cb36938654e", - "5b56087d6efe169060447d9cb8512d0f2454a723e8654bac77a890092ef002a0", - "0c02b08a6945cf248284c7960dbcf8d2042de831afe1955bafc7d0f9f27f5813", - "5941a03f5ec43be80d55a66d1e1431a017fddacfb087399f043e388f365484c6", - "925640e4df20346eab2849e1e79d03bab1af08c181e3569a0d396a2358343128", - "0faaf4ad9ef276711946e6fdbaddd8f88ebbd5123860e24d4f890b669381e8de", - "5fd439fb4fd3a5646212426ccb38db512b2be8be270a75d0a4c787c113d23b7a", - "ed8295284a8226bc6bc53f861b79739e4c625750a2f19f5ae60d3e902f74034d", - "5f597f705f38087f933dd0d8a88ae5dfb88a64570acda45649bbbe58f751ce9f", - "74feeffefe67daa44d8624de7c5882aa8ab5b1cf0cdae11241f5507ffcf4ecad", - "d4b3cabbb8d85ad5f4596f67c4943555263231c9dda94338addae830e896b4ed", - "28c0a8308ac70ee0801eb3f8c057b662ca80e8818744c3ed26c20a08ee77de0b", - "8a7b6f01dbcf030675d6b77ae77a9e1d712c5c5f527522049c6071c50c5117a9", - "cf49a09b89a8fb7164a2e96b1157d6cd325f3a3d13148f6fc1df8bdd651ab482", - "844653276096c87c3f0f6ef16a422ba21415517b3d02765cfaa19d236f8ab18a", - "c34d01503348f546d8d336473621e801c326607b27eb4da19d1590d0bb5e006c", - "bd2b7fc32e16a9beacc7a54cdecf8f52ecb127480f0786fb352827f7541e66cb", - "2ed5acd9267bfb1e5bc9a5c7ab30f47a1b1a74efa3d0423965aed7001568e971", - "ca06c32322db8f61714a38b010cc33ea5ffc62d594ed2d3c389ce4288796c834", - "8dbdaf0a4ff58ba7db9434114b3f3f3cd0dc3007470d1c01a41cb7f304b19d45", - "e9dc93caa01657f97266dceaa727fe7d88bce142b5549b2deb54661cd56b3de3", - "c28f410e9d7a6dd2f3ba9dd6721bd9f541ef25519ffb0c992b5d2682a071cc51", - "3eb452272e26a9c4a878f97853e019942e0c75279a75487e589ad3a7a60f2240", - "87364cbf9dcb7b68c95aa1ee0cb242e4b12d6e4a155ef88ca5960d7fb9e76bdd", - "67a796c27225ce1732f077902b1406e71169ccda450c3b3d026e9cf727867b1e", - "202bca2c97672a3062956b0ad1e1bde9f28546d4340d9b3f7db3927daa879109", - "24c6e167b3ab76c99b7ed0aaccb5913fdb0a9d8524a07c9df6b1ac920b52d26a", - "df3979b8fda09575484bb8d433b648bd88ded758ca86968092e6be5284f57f88", - "3ff649fbf2cd1e3d16a8d930f3b37d8d716a68766f3dfb88db1786d5b742a7d0", - "791341a75f43f8c21f85054e6548b4c2e611e0a356ce9015bd2b58fd8dd67d9a", - "b11b62f6f86e2377f347f6e7a2c4420d19fdca8d7d08357cb13d79bbda9beedd", - "a3046dac99d824bc4f20e8b12f688506169dd0361040eac570dc5a308037d2ba", - "3a7c6de62a5be8959607e051693d7d9f5a8e372387a7b25c6910039287d2b3ac", - "140f4b9492b3995e7c5b1ac680eba788fdc8da373a8f8a999ba4b642beb98c65", - "7a413625bc4f516fcac373044b68508cb1fbd0887bd6beb245346e68cea2a3ae", - "ff795d9c4c6b6948e462af264cd42b7d3e44a7d5d01ba44093a8d3c689fd896f", - "9b0bc788ada963ca373756a1b86f4d97cfdcf83623f67f7ec3e7dc7efa62721a", - "d02ba7d7d9ac4c2bd22eb725858e4984e3777736c870dd5617ae6a04d5e0a707", - "237227ff0750ad8905095d6adb67515bc596b5547516d5eb45ebcea3c0292afa", - "fab6f325a7f02c485b56cca3a9a855805b8829e038c9442cb5f170702713b3d7", - "947877fc1b32a00e9e8c43c88c773d463637f227ebea9855be2da67a9d28c7a1", - "73ccbdcc30690a4fd82e6b65d2b15f32a2112a3373f060e33e045f452f31e083", - "0b3db53c4894df7ebcd2c5897202ae45aef2464c3a88bd5fb37b7bf7b90640b1", - "ebd5ba9c86d7e8d950041b7eda8ae2665a4ee16db91cd98478159ab32e183c54", - "1a0a8acf1f7db199f6f9bb0c1230043676ebd58a9b9f5cc9a6e920c32502d85b", - "7c09fdaab9d9e1457583f4142888c09bd589396234af0ed8d6196dfcc3e9188f", - "c1aaa663fa4a7e24c3ab11fa2bd992227d5a4be4ffe8c688d9d5482753dbdb41", - "27fbf5b1a6ce664aee1383fe1d6c9fb2ca12c3f02bc6ae3685a2fbd7a3ad7e69", - "f34ae8c1353975a9d0034f51d36b3acc3527377c13266ce4c663c7ab31af37ea", - "4914066882eb9fdf61df819f91243f7ef564c1324cbedfd65ccab430cda08670", - "4d3df370a2070ab69c25dffd4dcf5798ea7cc7ce30a6c907bbaf07ed93ca9179", - "bf6f632d8b01142275700a4732d99ad9be989df7ca513430c988193675e0e358", - "775bd64cfa9c9b7260eefcf16aeac96c9546c675902319edacd8cb12cabd67ad", - "9018d81396ee6f2de3ed9bbe5b4be44b9b878c676de04e9edbca207aeaab713b", - "f753f53167fb08a5d74e51b34849e5741cbbbefe6e88b6f64f6afaca8219fa78", - "8500ce8c78e5c1b32b41362547c7d7e974a16ee303e963bcc4436f0e3f8f9f38", - "f56aa7362eee51248962ccda184b85f1b039c100b84affccc47191e1db0b9e7d", - "9dd0aacfc6b31d921c304e380f8a5f15f385668e36322a662e13259fdbc4bfbb", - "3132d9ea3a0baa86db5f299de831ef15e6a8cd0068a55de4aa1b6114deef7a51", - "dd5beb00c2c344d59cc6c74452034fce70351db5bc619fd361af3bda9f7f7a9b", - "6384c87efca566eb889a89bb67459729e0a6b9dddf63ac2fa823e051c658110c", - "1d6326df25c783d173a688d761b8c811e938eeb882a98460d381b2fbdab39848", - "6f6925c9b58f40185132e3488be278f90865a50b3c04fb9fc244e8a1faecbb07", - "dca015be9c1d74da2349f68510d55dd87b6a90086912406cfc48e5e2f5345203", - "ca098406c915bd058404d9c7b6f56955fc2d36a5aa3d7b2962f5757ba09bcd1e", - "b1b81ddbdfc6775304b5172ed802d01f0eb8c87d0db922777d8c690dbbe840b5", - "cdcea8377eed92f2ae31d47e7d786ffb17e17cc90d2a9b845cf57b1bfa4ea167", - "d0b79ce078f7676b7e4f1dfd1cbe7b220364eff2129c43ab299d9dc2d24969cf", - "db6a345ff514f8cf267c49f91557a756e172852d6b90d0b500fec800b1a705ca", - "3c91f656aab4344698b37873881b34905a62cb5de03b42ef82614b712883c260", - "c8fba87af1e71afe68b551a0816701534557d18539dc39ea0d28ed640358935a", - "0b218e8055c420030c3c28d810906ee76349b2269a7bdfaf8d7e76c67cb6a990", - "204d8bafb69ce096f0744ed6e356b9ef545b093b2224ed3d97dd157a8f4ea32f", - "d0d0766056da5f910e64f940b405c9abe83f7c21177aabca75a804d479e1c4e3", - "17da1e8f782945b1e107d4932396fc448ea6dc0cd6ae3ff229893d7f0e3bcf8f", - "7a38f95c8a8b160e0303ce2fc114a580a83d3ec993c7a98b3e8808da7753d9d3", - "57775918edf08c468ca6475318c74021c14442bc10f1a09c65a9fb11ba9dd1bb", - "34fb03cac35c560cc19844740b38f15f980723c15315b435324fff7720dc7706", - "effabb6c099ef99ad1791fe688fa346ccfec840125959e6b3ab48f3ffa4de6d6", - "522abe4b5c3d68da3356eb182e7071ba156527ae08b8607d7be84aadbc1d115a", - "7fe90969e024250c89676363e249cf47a400afb4df2392c83de4b19f581a84a4", - "2c3c7a972ce92ab055a4b8c4072a3a3e9f72483f5d6273eabbcdffda1152c033", - "cefcf5edaf92505fa80854e4ca1e7398f0b64382441c9d8c7a531dd0f3236919", - "dbb03ca87163f764b8fa888c8ae17a07199082049193802fb692dcce32a07e52", - "f1d9ff46ad8753915e81ff3e0dd6dd65518dbd84688d915613790e81af9b48b4", - "89cac355daafbb8b28ece613b11e223dfaa8bb7de0bccd31f8e6b96ce8128612", - "e0ab4bc62a0901acd664fef3d0af2e2e806fec424296360c145d0660e8971d28", - "c5b76f2822c5d4ec7aeb17e46ff38e6af022f86a62ba3e5dd4c4a3b8d41cb168", - "f49dc53bf7643a764766a692f3adaa1001aa5da1b4eadf02afa9d66077a54f2f", - "48d23af5bc5869f44b185150502f45aef14467194acfdc4673a96ceeaa60d141", - "dd7153d959dd1dad0a2cd3bb082f923f28bdf0edb2c51a2a568a377f5fe84dc9", - "475d386f6401691c28dc533ccdc4962fbd50a33cdb2cced02b266aae55ecf9a6", - "c66b6d588e860a0121df7b0863c9d64a629c2d390466c00786013adafa183b0e", - "976b0778868b5a073baa85c00e3f44ab7767b9bf43d088faedea06bae3300a8f", - "030c44827a98ae89b53cf7434a865a7355f9574c538bb1204022372770e60037", - "05f02c49515003f98f7543c1c87ff7b59f269e6a749782f1eb51d1c333cef570", - "3a85ce92db923a3eae49293f6241555773b75f37c65f481479f2d4847a7ee505", - "675e339c7c4fd8c52e24288cb77452aef0457989cbd4d800bb8c751969e5f16d", - "d6dcfd63ff4fd73a6dec06ab1b9f73aeed053ceb99fcf35e42e93228cb33bf53", - "00621a2e8ddd168c144b7abab7e6486795af7d8c5fcf24ea04feee5e5b5e649f", - "17f7a158e7055e9e1ed723e20b693d472c539699bacd62e06c0290244b395ae4", - "d85dd8a43d15a5ec7195f62ee4fa333635d4752a6874ad6326c7cbb9f0d0aa9e", - "28529493729a28e8e1f0d3c3bb484c6d59b48a53180fe7645996028adf5d2bb4", - "5a68910be5cdda71a45286850cccd5885d8b72c3a4c98322f613f8260f460dfa", - "958ce0f3b12874a5f5d1ce59de60b2a3cd85538f3236589e85c50ba0b4cf0710", - "3d08ec406b36fff8762ec382a63a79a332bd38d0c9a462144d391890e914a979", - "4334d0d03f09c5560db66880da14ecf5ae454506c62f0d1a257cc9ade983a4ed", - "46c8181a6babfe8a1e572ae06b78ae8b90821892ab3b1888e332d977c4770dcd", - "6d099bdd33b30510a93ba02693c19358e06ff8fd0654eeb0a51f999b97d3618f", - "aeed01e667ba7806d09d039de883d350065972650ab10df0740987e651ef5cad", - "3e5e54b436e888c6fe48d5ea9db5139e1a873e882495d093b9babd4f9330fc4c", - "331cc90cf27f0cc9a137f2a15f141ee73066fe0d2ea2fb487345d6de3da5634d", - "68efde2b2f04421a3a166e36ab50aa9399e55af8a76e945e3edb7bf4f01639cf", - "90fbf38a4c4c1cc6bbb14deada8de410f93110f03cbd9b53ed17ced6b6204933", - "79f556205ec284c82bd9c963f2fa3270d3abdba340b984f4fcb9bef007efbf1c", - "e989ac633ff5f6fec4e8fe353af319fb11ea19e28eb753afe30db6c396a043f7", - "9727438e7c1aa7288dff8e3aec661df0829d83135bde57c452cf04a3bfc09f8b", - "805fdddcf7e75fa71f63d2d5868416640d3891e97b992e3ceedbb08409d82732", - "821433a87114a06242a9d1371fa0f390b92da99b7bdbf30de3363568f0380420", - "f441861d56df3d66394a359f9141246b35f7041cc8001cae7ed380f9944c99e6", - "27066e92f7e6190673c3ed34176794d8ba18681cd4cfd162601954098eff7101", - "a35e70e9e36eb828ebe9611cb08c4abe11b1c3e5ef81e80b21b504a01cfd214c", - "003e290ab5d301814a45fe60689e2bdd1af1c68d0495ef6b060a5832903efe4e", - "26bf2dce2ba6c475a3017a2816f31e58a95b3a287a4bceb3c312dd58f34d5091", - "aeac0c0642d912c8bcde10233d3f1929513832e54d19148c7688cdbfc6c587b9", - "f6e03a5a1ab5b5b7775831ad405b6349c5c19fe60a98372404f9289db264d76b", - "3be2752d88e6a7fdbb17a6ed0d31ee8fdbfc1e96ad76eec87b09291e9157f186", - "5387b07b73309c488f372a5d0d9477651f6464145c0c7ecc2109012e709b0f74", - "9ccfac0bc8b58baecdea6e887eaadeecafb4f8a44cca6d5338f0b3030f8a24a6", - "e2c58381ff628d68f3c66e219d5a24e3def68a805e259688328992d000dce8bc", - "7b6113904353d5f3dc6fadf29f9ee7362f3a517b71daf2a2708d37b2eca85667", - "cbd5334ea242ebb19657efe2f4b7a2301f63a06717940fb359f717da96d8f2f2", - "40d52ea8df6676cea2d4f0850f4c013a382f27eb4e47fe2489a0edb162c26c0b", - "0a2f5b9e9df9c7f835aac66319e08682f51118a80bf63fae2f7bd3e547402174", - "495852ce64ff95199b28d699a00fd974f489db7513b685669037af4f32184214", - "f48bbcc85a3ee96a529f5a617803c2b25a540185551ef92773b42160936aaa71", - "001569f7f113acfda7eca821eeab2b10a37ef162e5b2c4722c3943a4a8b35c70", - "825abb18a44a4749742bc8ee0bfce27a29bf0e6c58d87fd0ff040eea1b5dc782", - "85804e16390c642930fd2685d9a722a9583747ab309164309d4f4d8cf102fdcd", - "f4578fa6d90f6a6233478edae7c63357d7620967323bc3a2cc6b8e4d16caecd3", - "2182f8e650e60a80e87ccd1839bb5dc6f6a6908d9749e10f3a3c6667454d8e84", - "ce332486b646c949fb7e4b688c851f34c4040a55a70c9c9e2755c5848d4864b2", - "022a283664f88b7a6d448dbb596bccc8caa0246fc843cefc9544ba687fa9ca13", - "7b06b292bdea8d81367ef4687f84773d93d9cdc6b5ab2672c8f827e0448359a1", - "5feaadf05f496e2c05731d4dae271ac89de555ba4757bd8ebc4cc631872686a9", - "38a7c01c05f94e834adfffc3a8fbee6ebf3266ef4c57460b616b33871e927eef", - "b20f7cd82a38f0fe278b22714b2c39a919579a66f8c76d5365e420b4c029f4b7", - "a29917310582efd29745413e6a3b95442a5e34360e1fff60b350b85cb7b8e321", - "1ea0fc2623d48f4a28d163cf6b2b194f41fa633eee581b8b8a6be5f05cb73929", - "2cb7200e8276c2910fb429f21ee118f032e464352abc21c5ce3280ffb2b1cef4", - "68b69e391c80d7e1e74127a46a001c48dfced911456f644affb009de6e675a85", - "9a64b35642846e0fc09998361dcd62acfc70b93d99c649b6a74429e1bf51518c", - "46b2e8d3fb66099e22a95b27d31e27f4bbf7df868c0c8003400b1792e56cf7cc", - "6ae19c06bed600aa14ff82a150cb912ea0b118f24f3da0c52a2dc8948ea55b6f", - "dbb85a34e96fe3eebdfaba4d41f94b1f976594ed7f8d327c9c571d8b89981ad4", - "3a3f6aa20c3156747cfbe9e32b47192041ff1a87387b956970326290bac4b895", - "7ec726764e20db61d6facb3e078db7cc1ce4bad0329885835cd5c348beb64070", - "1307ec45319fb8eb511cae86fa145c3ddda28be26a9e620a43dd07ad59449b2e", - "b8c36368cada88e9d65ce74e2d91753b31192d23a7d10f39d1bf95b783c7fdb8", - "dffcf3328cc74e7fe4824e95a5cb2da2f5cb22f964f3051d73c228968b25ba60", - "055805ead8403c6a26710c0d2d7afaae3b4f9f3c24208e5f4b1cc2af9b657bb3", - "f29dac1c55cde4e2d3e4f4f8f13e3dae04c311bdc680f75ef5e94968bc316739", - "8a59229bb2cd2d7eaa8c505f98dbd40e6b20858dd7febf8793b8311276e9840c", - "f4885f233246910160578ea5835d5015bc11ec4d2724b4d78ab45bb6ede6310f", - "078a750981255165b275d4acf1dad3b9da6f01f818d2261c2440b95bca482cce", - "97378ad25317e5edf701900fc5a25313868ead7c41a14c2e836be7cbe633c275", - "00bc7f359a9acc496bb9ef574451cae19cc0a5e6153d0c24576a7d0a45237412", - "28fdfa1b7165d418ba0ff2cecc11e8d4a62d60ae2d6ed157ba88658f7946245a", - "27d3ed952db440e76fdbdf9eebaa5b1cda1e2749d914323e354f73339db492f8", - "396e9dfcc9a25ea886fea3907758415e8b7b89e30f9a7bf6e0d38005c868c78b", - "94506904c14a3a1719f77fd2f371725d264190af2810347d67e24d49a6a1e04c", - "9390336fa5b0ace5ecbd55127f1b17045367b3aff8008767784b3528162467d7", - "7c858038934d58a3423c78aa9a7222f363c90fe7e91a63795a9143e07231dcd3", - "fb52da783b140a650ea3492fbcda458a623d7aa2010ca748e59ff7f3c1cc0230", - "b7c61741bed56707098862b9409933ca94497d11dd7d0e6d18235028aa2351ea", - "7910d16111b62eb3efdb0e8a924b5442b6926d9bf0e38a80208b8d848ad7b61d", - "2cd3cd5b9ec1c46752ad4f5509986e01a9fb4cd5eff40d3e4e7aa634f750fd32", - "38bd64888dfb1b06d9e708dccfe4b9b72499e8125364cae6dc3a42c52f532293", - "edf0c4ec0b916f28a3292ddae1ca21ac0e9c5c09c62ed8fcb80319d6db9ebed0", - "2f8f6b1f96ac4bea93cb248dec03f635e5bedc2d8f430cee4085b6a0eb197407", - "8af5173d60486e6692da99c09c1eea0a669954d017f738eadaaedaa9581dbd9c", - "2ddfa1eba612034d006f911c755d305fb9e880a2ea0feb87a0998a059ace6edd", - "6ccaa633d6e74b8869339c9bbdd5cce65493edf4f5f295141757e213e0235909", - "1bb7716ff49025668d9bbfdab6fe935a11c57498cd1a1fbe8d8a79a54848c588", - "ce1776121c4ab28e8c6f84d4c0b2f04f5754b0a0f85ba57f88d60a01317fa10c", - "89a63ee8a8cef0673b6937d26f12ac98d9901c15ebfc6bd6487e313b35531840", - "8753ae19c9120ac826ad00060dc01bf935a8fcb42aa99e3a8972fbd3b91d1aae", - "a50d394d333b2d47b19ec1fe10b114c09ffee6871f49ff23926f3bb30bf44134", - "1c9e49df486fec0d80ba08c84a4d88bc5adacfcac461cdbe548ebf44238cecd8", - "f3ce18342ba55219b6b078f782edfaa6eb842aed2904c23b65f35174de565e52", - "ae86f8de04b2ac23a01c2de67cec7c80fc563e28d51ebbcb997607f18c318ea0", - "9e6d35b1ad4879049a4aba4e72b526a7a1ea85811f2c2294b2ca86df139633e6", - "685aa7da44bc21d2ddd3f43a09438ead03cd45e5626516159d42aa2f8d546f1d", - "54862debc414b49d05952da74f77b918935b50d229558c326fe702885c7ba323", - "e890906122be66e6c6de5a8f1e5d246f97ba73891d7a78a5ecb70287f41dc4cc", - "ab96f33b85c776295081c3358e67a7bd4f427e0879958ffe91c2b749b65af106", - "ec1f1d04988694fca9750206754b6a44e0c650bab5c016c5fe21df668a87dc83", - "f414457144c3b9bdd268c8581c7bdd183eb111bd712a97d921079f5161cdc0ac", - "c74f69aecdfa7d51278873c00bfa8a4fd0c008cf278fde0611728d03c1383196", - "b35d09f916373f96421e74218ee83785c963c6971b304f694737d44791c878cd", - "1c310adb5a5f59c9ff804e998f9516288e43630d5ad1da4d43a06c50d94b7c6f", - "231bda8b527d4d7d63fd44cecac312a2b4e044456c46d621aef705b9909b985e", - "b27d055824a5ab49ad0243c8ac5a69185143f78a7014ba8b1834db80fe933cfc", - "23cbd1593f63b1c4d6f08914d1089c3f02a0d184d25ea82e5ed90245b3d2bf4c", - "abdbed6ca81aa2476606b9ec2555150428942e91355ed6e3055ae02face390c6", - "96ad6b67bc6c98d5b77049a57f6bf703c05d85f8f40a93351a42e339f480994b", - "4854d3261ca68a31f373bf76e2cc1a6c7a306767d25b10bd52c3182993c3c9c8", - "664c19c42d2ff85f331443df253fffc2fc791b863fe1ee2554e26698c0586313", - "9b8ae255817332700db43644b73235b970d3df06a66b020b906e3e5312ee84e0", - "94a7009b31313b772a78a0f348b7bf97c0209bd0749a7941ab6cee7a5e45ecfa", - "8949bbdcd1774bb167149110970f16a5fdcd52b0c22d98ec56a24e9db620a6b6", - "acfa712c2cd898db16ae7ae6f3326e84e325b608393c59b219299a0dd8d9382d", - "89b805eafde24ef2a247a660dbdbe2aa0cba23524dd10fbf2e14b45ac5207e8c", - "8540a81655753b21f4d51f81ee8101ac4eb08afe652fd50fd7c7d017dac025ec", - "980cfac19716285aabc5f197f20b61c58c753eeb6da9ae7342c85a029462be86", - "8c42bc0c4e2111125e30ee05e18008b3993e015b6c359a39b6e55a8109d451fd", - "e0656bd6a3ff3c0406e9ee36bab41644bb8a05900013f62e0287bc8b0583eaca", - "46be2cac943db0aa0ab60181fc8952a373b4c3c2769fdc8a8e8ca253e4131078", - "438530711ba2ea023d3b0916f047e10dd283f7be9938e4a3040741f323f06942", - "eee2deefa26d876c6d324237ddd63d520b77e329cd8479f6f9e98b750b0a5902", - "641299c215ccd55d4ab1a8c0032b55b71310a3ca9276638fcf6795b232d546c8", - "7bfdac899f4740b6c9c1e3155c0ae0d4d7cc5491fd38014edbc9b64189e6f4f7", - "0cf7d4723e79ae58a5c3aa73971a84d7f56a6c76cffea2a9c79c982c482330cf", - "fc67519c373c81f750aa27f1f6d334fea272425225e85a2804724c2fc62e7c8d", - "6a9c80fd46a5e67b6518fc4d68e34b92041b06a30b795d58f715e66ce98f454b", - "98b3b7ebd371d1136d5e195e0461db0906a32eab83fa8eafbe0d9f130e8ebd37", - "5f7c0c343f43fa70962c75ae6120570a1a7911c62aff929aafe6451604552103", - "e62dfdfb1f9d009cda77272d2c434d78a74ee12514bf148447a70341e0221367", - "aacab0b248e86eee80f261e47a32897cedbf7d1b177917f82c4842a8bce33adc", - "9cb54686471b6ea352176550a0b547644d31b86c6b367d621d8237e42dcb549d", - "cb1a41a0bad049caf7e2d4b28449a85739782948d69f116eba3b195a45babb84", - "1d9390af07516417273c8f5b73573e2233a69a7a09ca56eef0cb072d11ced9d8", - "ad0768e22bcb77cafc9b80dca588d487e615e02e1a2e3ac8d73183aaa64ced4c", - "6aab7cc17ca6174774c1af1e41a7a1b4d62bc3bb2f9716d9ee843a15bcdb5995", - "bae789d7990cb7cf402cb7342e0704a4ad898cf4929633f8a89c187fdfa241a4", - "5d4c7615a6ea1948af7a1721e0559d73f04f76c7fde96dc43e70a8ad6a20a326", - "2afe43e9c825553691f7f2d29ce4ffe0bedbc505d4235819f14e23b5e9c9c361", - "cc4230fd7e01f5311b0ba3e760d2c9f7121ae71152d0afa04556667bd25f0db8", - "27cc6ac558fe8921d70d61e77e6ab6b8734e96f1405212cee52f5fdfdbe54fdc", - "140a7d7c187694f2cf8fbdb1c9fa842bfb08fab9241dd61f1ccce287287cb476", - "0dbb038dbed5a5666eeb1093f2b9d6bef0bb7db6c00e8d173d5079b32613d6ea", - "be0b390e9644b835486b53baeea85c5a884e17e527d8afc3df2f29d3033938b8", - "f42c6d1af43c8d85ef291d05bc997b96fbafe7d7cfdc02c7e38f408087951aeb", - "6fef3b56b8b967c6c1d2d5e0b82e346624b259c9922148e7fccece2b4c7af159", - "e884356216ab6404d29d9489d23e2733bc98be15503b03a08205b1d20faca732", - "a7983815586ecec11049dcb3746ae1365e6557513ba90788760b7a8fbad120d1", - "63cdbbe5cf4aeea40d368fe75bcb5984b87f8aff391dbb8b7d6a60c924bacfbf", - "6fed50c9e8360f2a31dcb84984c516ce3d97d210a42dd93922adca2a2a77f2a2", - "62bfa6a5b6e429d93baef3375f4969815c257ce7f2aba6a035d6bd7566d9564b", - "e6617be615173771b261671c6420e96793778dd03d29d1b8731ad9a8e85dd06e", - "9d62ea9fce52a57bd65198027c83dfa9d613c6f38e19049cc2aef8cf2a35b4b1", - "8f736c09bbb7b4524f6e05db39399fa37a47c790b4cd02aa507e7d6dedcc3d8b", - "1e461d50d6a0fa7738f13dbaf1a9de88d161a76694b93ede233bc8ca41e1a3a1", - "f5bde4378e59eac583f92ed59ccd05908856211f3f66bded410253d99d07f753", - "3ccec0827cca93e7aceccd1a2790ddf2da98ec71e16a818a84b36530fbf41503", - "7f0cfbf854efe97fcd6161e0c184edef078d2053ee432bc8b1812db4948ffc75", - "1fc01738c136ba466eb3ee3d7f5761af8c763f1a32f17ee4ed8b4204b72b9a53", - "3c5ecb5f2a964a86355fff7ce57e3e870fa8c979ae59515aa63d1058fa489147", - "705b58d840b6eab97a49511ca4f594148e547c91d22abab7ed472870352b26ed", - "d34e5b802dfa1912a5dd149a07664008187b0334788463ba1e86aa0200591b11", - "3ba31c6d7c6989436e435c81443c420ccfd938e58cffe404215aee521304411b", - "11d698d792fda464e1642a8b3d8ea7f7c2a6aeb3bbef000e9635796c7baea995", - "bc63bd88ee9e9c397942fdc85ebd03d6abb0a456693c79028d7ad31ee95eb13c", - "4b9fe8fc3312d23047ddce61709f5e505cba727b122f212bf7b7c8b8c0c1cfa2", - "231f4812a3d7e242f805d4974744736d34ed636d3d7aa76c13b5053162d2f1b7", - "0e22bf66f1df11058167b7f673a47a6479f0fe91f89b91e15166967729753a8f", - "13052ea803f131f9666509a1ace123e78d30ad59d742637063a306845248e32d", - "33e74b990ff6e522468d4d15cc9ab08abaf3d53818ec0085ed12db52c48af103", - "5d724a5376fee8f436589df6c6b7711837779bdb096ae3b494c8100c2f4641a5", - "4473e6c1168824889b494b2c52b9a76a85a2cc56cff510d6135166858d1462f3", - "2c6861f58114ca58dbe59a17406b0d6a76014322268e9aa3433fc4ff4e677db8", - "52a3f2a39da3876fed791e71ebefcedc9ab887d421bab34fe17df65fd8bcea3b", - "3ad9b6dbc69fe8c1b2b47e3c6b4438adffab0eb876369bd0bc9f11ea1cc90a5b", - "738ee2b06154e34be5692ccae8cc69c76ccc402af1430bd6086fd7364495e906", - "9b4baef0136a2f27853f1b1d400ac838a7b382711155aee74d4b478234adfa5f", - "05653f1819f0f1ce594bc3c7392104400e8268c2fe64f20c66fe0ace76839e3d", - "8916305693c07ed42a69c1e9dee06e2c9fbaedf599fb8372a9e07ce23c81c0b1", - "e4a589607e842e524e7475d7e6928145728b9ee895988bcfb25d7ef436f8372f", - "295a57e967357fa11470ffd606a9db9b470113e83a87592c98730bd0a36c6449", - "f8466152ea4fafe2078c302e8e0773cffc8df4d4dc5ca678cd47cd5ede92368b", - "518c97e3da5184585a06faff12955fca5e664d8c01f8e968664c8000005c4fea", - "f1a6e7628a0a9830ff768d2f18c39834741b9b18b5c28039a53d497f56309a66", - "d65b4832844bdb201d1003f20d63f168121c79232ab83b50198a6b754d2e282c", - "55da61d0a0bcc0d87f8f9086ce6d220780b5ac4a925e8547ce4bf8ef50fc3d42", - "b097367352528530d89530dcf8595c45b28a543eef22f1a28f7658fe4a7fa01f", - "49a75d0c359ec009a344f816578cb7cd4d4f2885354c2f30491230c47d564780", - "8065599966959f49980edfd8fa05d73fad71062fb54b5e01d9f39bfc53adb733", - "00c06a635518709f17adbad246f72cdacb3fc062605e2285835dc769f31ec1be", - "88caf3759600b17737318cad24888a63e1765d48ee69eec8b87960d05bf5c678", - "73af338fbc8f61793ba3a3e49bd68f4b793c1af32a8f5d91b6fd786454c5cf25", - "f5f6912ffc88b85fc8abc50796df93cecfd74502b0259813167e0e3533602529", - "f8796879d6811ecb19084a83e848902f191ac824e9c3fc8a1024f577152f03d1", - "be683ae1b71cd97d0cb3f232c75d04bae01c7db49432d7b6fdce31fd875d1dab", - "0b212e099b92d80fce68bdcda03e4a983b12c0719d633b60b9b75a3285c3419a", - "25790b65b4b133801ce4e4508dd708cced1e74d599cc56e5470237c89bf9aca0", - "c53c5150ba215cb9a3d83f577a3acbc4329f0426802e52d3158cf4e3f634126f", - "816815cd0f083297ce1aaf98ef8ed8533a81042b28229465327fa1882c564e79", - "4c4394bdcb6df1a43a79ce53fa1558dcbf153f8696661b28197c8038380f0814", - "d6503f30e06e67b28a8e4ae7c5d5b010fbe98a105642dd2c61afe1e12acf05f1", - "de1c48f5c6280b8a63a7395c23a84ce40885a863ea105595aa8cb535dc2556cd", - "30225e372bf4459ea90f10f95dd64cc43fcbf4f94b2a5ca1af07992556c42738", - "c4c3c777910c9cb0daa2a0ffaa801d0e0d431e58bbf5acecf79f6c5c1a0984eb", - "3426a1536b812d91ea20eea32efc8a818ea9af6fac7adaa56a105149f42f5c1c", - "fd2c765c753103e7073a8a5c3bd551e475ca7c72c0d944475834bb39609e997a", - "cefd26f5d2be11f3718af0d1540d05e96573326fe28ac2b9d3598d7642cd90ad", - "9d1c3e06abe42d88ef268bdbc88402ba3dc1afe45c30fd5fc3f3757373dd7c8e", - "24377690671c4a13d16b89ad04864fea9c4e95edcf152df99e14df2451dfab88", - "7ec166f4d18f6c2f297e749e50a9368111f623caedf368dee2fa9ad1b6e89955", - "31e5f723d5df99bdb2f4ec7cee93de377c08996dc176840a6cb0d987cf9cd53b", - "3ce803287c4cc000139a4bbfb0f52c951492e48cda7ff3ff99122c6a2b46b43e", - "acaa6e5d4f6f6932ebb38d8fa70986415f2583224d0eb31acfc3bb975735a3fd", - "38d0354273c9596f94fafaacc968dd7bc0c28ce05b4baadbcf07eda76658a733", - "472fec58933725309a07450ebc5e925d42f92a69f73caa90fa5cc27b51ca0184", - "b634a35455445519af622eefe0182f5530a0d063c1d27413a242d77595a4a79b", - "1182ac605a57862ed572ba665dad60eef263b6ac39b5a3e6b46de9ff599c88a6", - "f5a005457bc28e300dfd71588015e3fbe0da80af5b53b12e37da2dbb2796cfea", - "398fd241470b292fac67446b2034240ed7f3901624a0e5ff4ca72b856daa88b9", - "8772c7b58bece303cd3884ba58fe3b670f0c8f2a41ed0f4b3b3b6dcb9d0740ab", - "8ad1a39501bae426b62f8d1f2261d001078e00c62ed78e8b36727dfc3de6f0d5", - "0f071a4cc5675ccbca509dcf70e41edec0ab1b20767959d51f6218c976a4a3cf", - "270ca1021a5aef8a9383636f5a26136256fa50555567a3d0ae038abca9973045", - "a98165e05a1c6e10880894b0a1af1123d10c2bfc106335bee7c15dd3edc571ee", - "8a7f58a51cdc6aa41b7aee1f180771f4e1a51efbda73e252effd6d5898c0520a", - "8d09923748e09610a6077a780e935c736c55a682a3c92b33f383b3c5425b98ce", - "8c222353a0632a5a0ebb9844b80c7013516965395f0abe5f48c6ddba8b024569", - "bb64431785621845902a157e84e07cf83f9aa80bb990ee0127028046c0b5d597", - "0fc411b7668363447adbacf402d3ac83fd653c51d5d3424c565b143a904cfee4", - "6e67feb1a8e4f3029c68d43a66f06ccac0549f5611b165dce652104d7a43fd5a", - "3e5bab64e703be16c8d42a0d0fc99f2049f3ec1b7185e82ae65a5446d99c2031", - "44b3a3324671640c391995907ba6eae84da607b82722a9110f174998a6a04dc3", - "eb2870a8017a56549e70d656ba862a270d7e689db1747767ce475b4945a65c7b", - "9d5ee95105bdea29a486e6e9376a432cff03b4db87fc04bd8c1c5070013b78d5", - "89fc5dacf47bdb772face93f6d64b932ee8e8b0da02cea6c3b112b7f567625f9", - "15e58605dff3268460f497ac99d28199c93b437de9e35174c73abd276b5b5d6f", - "67514a0fd098db8fddf1f8fb79fdc608b504988887a96109016dc6127eda6372", - "3b77e78589ba1d6401a675cc7b6b14f2bdebd674d563d3869fef7f7640079e0e", - "9a1e4a890d80f1c1ca51b75b5acf8c41c3fe7d26a83cf8fe00317c41d53d5c91", - "bd39ad24fcf88dbfe6b43fd691dc114119f494ba7f9730ef600e0dde28d09120", - "0b16ff2c08735a151b8f1ed9158858450baa3c86a05d89942ab73eb8a1ac858f", - "e5be52a1c1c60e0dd841273ca9a4d1741b428a5a68bd36856be09c8cf0da8186", - "c6cb81e3f8b294bf3c9a48d128c8b93cc66dbae784a71567943011a34ddc997e", - "9e3df99a517dc4442e77c9c7797a655debb237eed9967ce229dd4bb0139b777b", - "c4b9fc80839404d39e7594109d349c23816b2555d80e1407044a608b3ff119b2", - "2fed7000c7a4496190987814f538921146316227aa740054e3888a655cac7e48", - "2d32d8bffb4b57e3307fbefe7fc4ee5a1bab1809387febf1dd1997c809787433", - "6fa5443251da8108828026d58852e1b80afd94db4bc5b8c9dbb1ecf6ca8ab436", - "9599a6bbea2e00f7adc445ed59443d12c0cfe3f97e9bf555414977013f8a46e4", - "ca3dfabc49f978461f9f82552b01a1505f96b20dd946611d8b747cf5aef9bf49", - "492b58f06064119262c41de0b2dd8c2ead12a04f0f4ab8171d22d49f61862a59", - "4b371f33ec38eccf35079bc9f412bcc22d768afdb23086c0ecdbaa57e0f53e6c", - "1e76067f60453501f56c1e5e8b80cd60a1dfd4f0cb38630ccaaac2589e4a2fe2", - "f9333c4b823ed846755dfcb74975ba49d7962713b44844245e4283eb584279ce", - "722a5ade81c07dc98966621bdce939e4c2da2218f9b26186bf5b54092467069e", - "91103509fbe0bbfd5fdbeafd6bd4cab2f969e9f8c747e360053112a31bf54d9f", - "1d2968a70225c3656963d458fbcddcb2c4c0425fbe62c87bd88eaf73f4d4abf5", - "29d14ba50083bd06fe74c113e993b1d422d2c40f946c1593bfd6d3a229facee5", - "743f5b111ab26e2a42af58148bc16ff3e658158cc54d597cb9247a51a953a67c", - "d32a38a64dcbb1d53970e5a6d09eeb3f436aa34ba788bc60d418f9fadae6b8df", - "e3f5a0c9a4f65cd1b6279ee3e10a5ec45185123240b7c4be2786d6e207ab28d9", - "fcaa898ce1c2de49f3819313ce0ff810aae942a142e99d7d86cc287e0c63f1a9", - "68ba0a1cb80717081bd65993249c8b86984e1e03f49196681224548a6958b55f", - "a96b8ae009245f3e474f0cfccd1232f5c94d16bc5b07c5b6ba31d35035987ef7", - "52f4a0a62fcf1ba77ff64be836b45982781a33b168aa758a95eed2e31af7ec14", - "5e9b7ccc233f444224ac673264fa8126de0fc80f5b5d4edbc5146d1e2e5416a8", - "079433e16ecef19944b7353e254590e57f7c44c68b34f94fe22f97f4e6b3426f", - "041ad7abca2f143d2bea817ae44a9212a9a832a65aa3b8a2c3527b9b55aba361", - "bcde369c4a865687860c8a3e46151dd19bb975ea45322284b269e8415ff55dcf", - "2c8aa911ad851b026e868c5035a73b124c1bffc350d39d4028391c149961f805", - "ab0363f05da43abaa1c7d4dbc8fe5fab6fa58154a4cf1ba972a0e5653e7d6965", - "6335e140bf27d0579f71fff6d72ab49e43b1bf732c43d665fa6c0efc92825207", - "48ae984d9bae492aee8e033ee55a0d179bbbb74c035f13f41111b06c8744dd6e", - "66b08f467a4f316c0faf0bc39e60be77554018c2fda0a49f3b65f152440eb920", - "1b8cde00fa7dcf3cd62f77ce4079c67a6c36fe347a986e462888ced50e2bbe8d", - "72f3353157a3731e10507fd6c8002a864cc8eadb18387c204c9eefeb67497d90", - "dacca989b9f3e1d11245a2c83276f925d598f3cf81c649136a3541c4307de722", - "98f620e151e6b234862b230b8548a418f604774e92ab6464c61d881d180a1980", - "38fc41dc5dfa0fdd4ed962bd48df6451b5ecdd11834c71bdedc16c4a9a87dec8", - "1a0ca9772dc2991016c9463e94554bf22aff3bedb5f0452daeb4d90be0f73ff3", - "549d962f4a987895da42c16332731e13431f2d49e3836a2ced4f2eb80fe1a470", - "0ce90b1b0d93224f204b9052c7c55fbd8e770420970a82bbf7cfd9752933b4bf", - "004c36dda110bd4563f7c62b6a33f199f730b9ce18d847ee6109d3a540e7e61c", - "643c5b4c57918e4994194784b9d7089fefb7293998275bd9f6662ebfa99efac0", - "a648df0224f4cad41943360442daa91c44e7c2dc0aa6376e650ddcc8a354ef83", - "02f19e5a35dd9e28cbbfb11c0b240ef7b024e699b52c8c12e9dc57b474c1c862", - "4eb0cc00d8c0f20aa60f9a48535513d8fb3ed12618b4211253101f8b45fb6648", - "7a2947848852a2dcc2f4138d18c84c847b6b47e91402ae8b86c10677963107e1", - "a7c654da7b5032d7ee63b237c0c27f9c7f64e34aafd221e287c646af387a684f", - "e3c41c28420e15160632d534580574f0acc0ffce3e40461517da06b7eacd0a7d", - "baeebe254696d20f97bb6b8592cf0f9a3aef27fc39051f8c3a1478f48d7d1390", - "99a582b1b2ce0513680311bdcc0094e4cdce929a3047b49c6de804457e508563", - "e572b7266e01db6834a4ef5eab12b9bac5625021d46ffda138b6f3c70eca1e5c", - "8d66c7ee6249b5288e70bd7f1ae305e4bf72f93dde04ec19647cb6156a2532ea", - "cead3c6e587568202762e14fcb6a32c9e1a272764fa09245acc249a2b868a222", - "7b3fef3474c9f9cceeb570255cbc0bbb92185bae28f35a3b6c1edb408ed812fc", - "1ac61d8c8ab2072b16cbc8e5998e1516acabdeb7bd3b2072d399623a9d1d91ca", - "0f6cfd883b907fe91848ffedf5d1a183ed6be4f483b3ba474d310ef356312d2f", - "682f659c4e19ed738c3df3088730c310d3c4bc40f1f8c4ae9bd545b90d4c7b2f", - "b3894d7832e69f09ca91833d4f8a99d4d86631f36a9105abb8efba4126951344", - "d19f1743c19983063e037ea5489ff077029076631416e9a395f18f0dc833229d", - "156cbff98be4cfd98997b54169c342d8570da5700a9c73b677710eae32e1f79a", - "6bc5dbb3c284f694a77f31796ec28e2243b5064d0a525af528ba2f1f7a2a20bf", - "46d134a59f9561739e2c4cf04741a4eef2e02dc96815d62323f075884d689ebb", - "2b4287bcad397ce7e212125d5e5ba1659a7115533135f7c5ad8fd353f85ae360", - "c636ea96dc20cba35d297f854f89615d31fd8cc6bffd1a76ee4f8931b352a46a", - "aae9ed760259e50ba289f17cdfac0803bc5fe71bf869582796d1c38c9ea6a56b", - "06b3f95f162bd4e60ebacbf66b568cd04d06f99c53dd154095ffae217cb3147a", - "51e6d83109135d86831b22a8da0627d46c17ddacfca887b0f4ce49d8dd9ad32d", - "eb620f8064f0a6051dde6c392c08193d3213a0bca4e823e6007f90d4e6720e00", - "2da39a27c03255af9f6930dd28c7764d5c940f65628a0d430c48af5de28b2547", - "4b1d297cde8dccae364ce1729cf8fdbea4d1f73dc039a61a0ecff03611398687", - "c106760f93b9de939b9b99cc96b2a3b616571d1e40b7782512e9480f45a452a8", - "44ac442dc076e5fd95b360015df9c7fb5dadd0fb2c40f064bddef62b2297b758", - "405089305cb9b47fd3ffa2402bc0ca8c67a6106317a50e783b070167f4ebdd57", - "61fab2cbd922828d1bb739589ac02d4a72d1618490b814086621b2f0ddb39e98", - "92a793b8c1fbcbabbff548746421320bee8ff7a0010f5fb9e749a6ca901e5519", - "fe16131071c431c2afc36c94724aeb8d479479148965430b2858c9466c231a8a", - "0950d03b5708544101f98d43f6cf5474152204ad20bc7f61ecbb0ecb3cf90538", - "bc886400338b68498f9f4051bdc42949ad1f875c7d2d8768a8717f45a98009e3", - "8a69b5c509fba44c0ed022d1a9db550db2d5d4789814c9b782eb2a065b8db07e", - "82c49134df451b1b283e44f09bdfa440f5f5334e5eac9dd9fdd54bc00c7cc0c4", - "d2035da8d7ef3cfa39ccb0076763bb29aa39f099f67d7e0c1d042727aa4b064b", - "b2fee21add2cf886232253dc83962eab221523d2ec65da68ae9f682ccfcbb0be", - "36d73a29234e5f0ccf48a524747179e8a7454e2456d167792bfe2cb84a057e01", - "1473f78512b394382e036c01257c078afc5e5d9be7e58e06a71ca95064b2e597", - "3719efeacdf3a70ae2b931386f3f8325adad0dcad5a3b4e3498a1cd52766ff56", - "64aac9e0fdd6d70405ba591e61317a3734d6aa215e56b05bd2e10a96bffbdd26", - "f03407b3dd2b2c3917cdb9d2e8797d7043f350a4aaa8f9eb03bfee48bf8da43a", - "6fe5fc98d410d17e05264f331484c572a0cb80f8115da61402beb00f84acfec4", - "e735a9be4bb7a3d28e9b4c2b807e51147b31cdd2cba38bb4fcf50e144dcf4d6d", - "3b70dd0d27ef9d6952fc04b7d7bf0e686597152099c75833a29f704fc2c07ea4", - "78bf0c85783c7ed3c23dd77111985194c48d7e9750af831fb00610f4dd263daf", - "34edfdf3b4042bcc7cf5fb8caccc699a6f722d42b43c31dcd6b007f7cebfced2", - "fc9a4501138836667fb484f696c1b6e6f1cc171ad46a30015ba6048fa710e9c0", - "a135022268589e6cb542dbf236b698e209fb6f31bf708ed274b207c088e32ca5", - "cd7eb3b0648be80258882e40baf3d8da39787c836a85cb5f66372c9157691201", - "cbca52249a3facc8e9d5ac8fde154bb91dbb875e75ff0494bc6cc6c4400b9be1", - "d7137ec98c6b4575dc0583adf89fe1ded6061607eca4c24ae1a641d5e90c567a", - "73365a226720a92b60cbab956e1a514b72d1caf884f750a71918f47f36509bbd", - "c1fe0451ac478eae9173e615fb86199ece236cedc799ea1477253e1842556579", - "af083fe709e530ef349e83baf81fc62dea53b5c645222e26f570d978349cb3ba", - "8d4bf236403e52d6e10fa945d6c686c1b2aafa04fbe8f30346f54ffe53da62c3", - "d8d59e3c9848c9999db98ff08eb39bff42fd82c3c454d56eb3335a111663ec6b", - "759fb5a193c2a276c3e349ffaec08bf1a788cc9acee29b7c59cca7fa25fc9527", - "70365f37d17c21105b53b2af326c45bcddcff601138485e7bd76a590a80f4ab0", - "c7613851443e44e3b9672289e9622e1da557d63f149bd649cd9be3d8d4723084", - "2071d9d136a3c8bc99e0a3bf3e1e7e3c31853ab5d06cd6e23f61d98f3423abed", - "ef297fdf9a7ca8a2847e22b98e5bdfad3e778c86cdddbafe7237af930c069826", - "08c1239ee64b99700c2c3206dcc4e86419a0deabb37b158120494d0c14f48a14", - "3d40ef7537645112ea2413f2de2ea98f697143f354bda687299382fc486155b8", - "2bc563a2e1e509e6ae02e951bd078b2e10e68acc1dc493ca1dc7b585f909ed2b", - "1c7ff9f0b8c5e7988844f6e08f63ad2510abb72831b3cd6c3b96912f7a4807d2", - "8e6530672088f80b09a62b848c18d92db0116d643e9d183b8b95f684ffe47a49", - "48d5a5fbe4ce6f7817a1ecc76e549bb26ff3b1d9f6704af6e0084036819b9a6d", - "7148607ca7dd22e6adba57c9e0f8379a8a3397dc3098d28a4daabb131381ca92", - "a759db1b25ae41e6c24369238d0e7fcd13535f55adb3d25dce4d006ec35628d6", - "c07f7a3ed927a6c9610dd3eec0690c9fd8642d2e3cbc6942a803e6318ab1b710", - "ea98a75c6143073b4e1f35491ad1d7424c7db857fcef5abad71c4cdf02871b5c", - "70fbda08794cef2eade49c6ac40da8a1645c3e2de822d53663955b18df05993b", - "d88825d6a2286a713700a01554cd6887924c4fcb8f2c76c59115883da484ce63", - "273462557045f89308dc6cbb559550338a643e2ed5998e76598340ab3084a9d7", - "e94185bb9444d8918844588fa2c399551023b890f692dee417f4ab7946178d5c", - "7caf836c99e61f23e8ab7bd73ff6671cc9a61a0fc29585da4bac634cb4922dd0", - "920011d621dc1dfb42b7c77ebbcf237f6460cbf0c4709038813906393a0a8db8", - "34d895369337faad80f3efcffe47a6798a26a386130643deb031d67a5d8e5477", - "8d45c2762cd17969d92d3cd985638327d9b99aa377a5d12ac61e38557909a39c", - "81e25dca5d4f9deebbbd9273d010ba634214ff8bed66ee67630bc1b38c13de46", - "b74c1a683dd0588fb724d0c6fa5aa70e72f1e8b05962fa9ac28f1cee9bd9d0a7", - "ede4e8a34345fde92f961c57c8cd98563ee38763837fe31ad779f28bc504cd0a", - "7bb8fb46aab4ec8d940d59e11fa0b8694d37d974df212748f0a24deaa933615f", - "6bb5cf3895b4a06561060c9f69783cc39eab67fe6bf5229f34131295e6ffffb7", - "9fb00acf569aa449e29201b5eef684a885e1407d898b97e53350ba757c588c7d", - "1dd1348ee99660ffa4a108c97ddf6958b5583b5edd1727e298d0643f34e6a04b", - "7324dbff2d90086867cc5ec5f66ee46d3633ae38e2f76f44d839b284b7f0b67a", - "2ad33df8d61a73146dd43d7d59079f676ba0480942d0cf5caaafe7365ecca321", - "62c22f12a7e2f53f2ee8d2b9ffaf85356b635cbc4c004cdd665a70dd7dcdb4d6", - "ca2c3310d9407dfb643a2e2d0ac2e1a908037f391062e57b909322aeb00ffe77", - "8db6c7f4784e6e2f8be07fba3e7497dc82af6dcd9010a005b2668e9e8127621a", - "6f21ab1375b4e9ab1c2f1bd30dc4d581f54233ad7ebb39de93ff96bfaf98e59f", - "d409689c9096804bcff4d37d73f97e14fbc251a821d7b1b68a2c1040c95cc6a9", - "1ec45aaf2bfa88cdb94d0716b4f6ccc5166ab7640c79167f252bcf391e5b6ac6", - "ccf44f5d5a0832c9d8fa9b942abe78da1dddadf2085e04b7b5a4e230caa44b46", - "f2ae0e31ae31ce4894b8af297dbe678b6a00c77ef600de8405ee3d03b1c25035", - "4dda749419b12fbd61bdf0aad3ecdd5ee57fd5e75bac062a44c617d57ebc09b6", - "4de608aa4af28adff1c6c2f59680897dd79ff039b0882021e549c5216223b383", - "4b88018b067909eb88ec975d71250705ea93a7145dfb611cd0bc158e263c5838", - "75d48c63edb43eca8d0fd370dc40c10d5ffd2346a1624863a89b6c4773365d80", - "6631a445f51b506b93060295680d70d72e4ee7ad700cee96d54069d48523afef", - "97d5e1e6ad02bcbfa3449a398876a045acce73a527fc22dc4ae4d9164cfc662f", - "2b980a2f72a4034bbe555621c4d7addc67e6e89cf6907951e8a084dca9919764", - "5d0cefbb5b2602f9f1f748d5674193515edc79ab4dab4de60f797bc4aea1f4ab", - "8864bb929aeee6e4da2ae59a008f8bb747b20b40f48ce506bbf818e4cf198144", - "3a8b31349063766b35f0ba4e239aa0f05a3d71cd295b4801b32b854018e602be", - "40e2b53c216ba4d79126ee164a779f8451f7593d900d9b901a80ed35a0cfb989", - "d21d82f994eb94bb086c4583a65754fbff2364f3703caa9981efbaca4c6f4b30", - "96c9f16aede3c5c8e3b7574322a3df108d8285054d3a1175c72f5ec02e29d527", - "5814745aff2bd840776785d87768eb376088de0ac65fc9d3bfd538ce52cf648b", - "b65b3f8660be38cdcaf1658a396c580e29dc5186cd0c1319ac628aa3dee0a795", - "d60cee45a68056adeedbc02514f4546f14191887d035d73c224df1fc7527d043", - "ade3d215f03d30ddfe15a2f37d5bd6a754189ac189dbce99d71de316e541e1ca", - "c191e4e21f0b5d7fb8029aa619ed0eced5363790e90f4c5aa24b8bbc554f5b43", - "e2e78f54343449b7e7aa2029839ce307e4021f83131a1b818d9a33753b9e645b", - "fc28b0445cf80f5b588553beeb2fd624e86d1fb1a066f9f83c99d03883d768a0", - "5e54805b8ccc7d60fe95baba94351f05686fa153bf1d62c167aefe66fc7f7ac7", - "3f8eac0da6104b1a54eba80f288a3f1676aef9a2f39ae6b8e9a59670ef637f80", - "caa3a493d24dd0f14095143b42c6d6c12f99445dcd83fda6df196378790ded51", - "9a0555c33b417afdc23710d0786b695ba67add46ffd0102a3a147a8b32b671b8", - "b7a9e58781264759d084d48bb1b3bf3f5ef2610a1841b733f6b1c410d0d771fd", - "487d73d572cce9d68419ad33f5b5c2aa205a6f0f56563ec4b96eebe94c260255", - "01263f9e00e951ddb7b38f841233ad9a8c655043a4d4c184c02ed4fca2e5ac17", - "4020268596edc798b63bf88588173e07472a53648acbaa59a7ba29b5bf83b451", - "c7d5bb07201637bf7a1e70edcc1237caba592de1a29a65fb9d6b136deb8ea2aa", - "ca2bbe578a44097f2bf730dbce055facc77efc9feb0d76f7aa00298b0c73a586", - "4e51fa77ccef11bcb1a963490f6a3bb65dc3a5d4ce3b835df658fae38387056f", - "2c2194eba8984e2db7219b85ecb52ab785902411b36405aa9498f8ce191388ec", - "da81cb8ca54b75d5e9360b5dc1d6295e0bf136abfe132270a31b05a666945652", - "bc01190c116b5c2287cafb8c0693616ef6a09fdcd923ffe838730f4994340809", - "3e749e1aaf1da27a48b639d77d91641361a75b4702ec116bd40d67867b3a1c16", - "7c2038c78d3a3d92feb012351219a0d4d993a4a4d2c7f0f8065a5f6ae0cb9d5c", - "f9d91da505a0d6863d73076994db0ffedad5c30660895320b208e8a338b7f3d1", - "127b04693376786a052388149cbc121204fb0bc0d8f64cb9a5a6592c28059d39", - "73a7b94f6edcfb893f6c50f56d1f7f0ff3b8258348c769b7865ce29086ff6710", - "350178d34111c92ef232fb2a33ffb50ca5b4f590c97fd9fefb058376edad6b12", - "ee28e8019b9dc358e3bb8e253be64950bdec66ad96344e025b5e9aef00d74794", - "6ceaee62e0cd83cd0b854e28c23324a935d9a6f68570fedb355d5e8c5b23dbec", - "fce04dc4ca8deb5c3051f62b99165497d581366959a6b9886730618863ca15b4", - "eccc7017883fc4c77feb8d99396997e5ab51d4615ea50a8aa76d34b8efbfa576", - "68b33830027a7f0c2636e90d99df8ab9ab6dfc2f025659fd4ed389680f6b043d", - "b23c5fb05b431fca7e8857479c08bc855eb306d7bac8796b96845d14b5d70c17", - "5634926b773a4dd88d5d801def1b6e7c50adb76af0f8ce3e8550ac7f3fa14ac2", - "f30e7f06da78c22be4b21fc52d804cce2d30495ecc39533c68fb87b23ac830b8", - "b33307e93034ac89e364e3b4ce0ad9af617b25b08a698d3485d5200e5a78779a", - "5b1ed87ddf60ec13d2659f2ad4c11f53f55799d0c3232e8b7f2c54da04d88d21", - "458de8e30579004a8984465f3b61f57dcca42d34b91bdfb53cf2917945cc799c", - "62be38d3a7109ab694899b94fc98eea5c3a087d38863147f1b4301747652cf52", - "4f292548849ced2434b45cfe9e62c2108814dbb2cfe18da7798d375e0c60bf40", - "a6e50b5dff259c52e6813ff1661710c8db84e3e2bca9a017e907a735cf65873f", - "198688ab1d5f24dad8ff349560b3ddd5af28d4a7ec76fe88f015e4c0427bcca1", - "370cebaca7d51baf94cc051fa0cd8e9649ccb13f89263ea0979cc13023d06348", - "098afe2d5a7f0c50f00083232fe46325a055932855fca7e52811580d304fc284", - "63d600bb298dd4df42801fdb4a2860cf232f66c4fda0bb4b3bc716184420298b", - "d660ac1f5e4f88690ba20cfe4a547c075b557f17ff418cb87242ffe9f49224fb", - "07356ad2192fb8bf22757920493b2969d264c04afba55b8653759b4ccb4aefdf", - "a75d28dd559722f157911c0e20b0fbc10bcaa1697ab40dfb7612864bb135edbc", - "abce00661857b64df409f7c696e70276a938b7697147b344c8dc8406e28dc00b", - "2458ebc7bae91da1e4698f9e4cc0cac211ea18b3256fce99f4cdbd8198b97498", - "e2faeead197e4d73e49b29ee28e60151db48d1facc7ad60dc2fe240cb3a932ea", - "5daa6c21bd9a23a7c061b91815a1c493ccf54936c6ecb0d9cbf8622c3bb0c818", - "24b3ad3f80963fdcefd0906d9786622bc694d7cd26793b96235945741752ded6", - "f679e69442eee73a4f376bd450aed64f36140eb6feb73e7dcf2ab50a26880054", - "522a21153d7bd21d6ec9535d4cba83833edb5e586de6f8834d298eaa6be77a80", - "8aec27691011b2fd4710473bc5fedbeaf55c3f3452278c6e07252a605ae71136", - "0af9d5db86744aface90e235e7b3c0d805a886c669b64732dfb806e50d3364d9", - "a6adbfe6a1aba9d32ce0b462b263ab8ea7f375a4c4c4c83c3d8b3178b1250f03", - "922ab2fa43de3582944bcf99426b09350e96e0fc38bf481debcf400a99747196", - "ffbb46ef365359be904f4baaf7eb855ea3c3b13da77ef5aa245d4ee0200bb6ce", - "1eeb2f723f0b09b66822d06f9b30b1692d02e927155c8c246559926fdf5d2abc", - "41d2614c73911d0df4dfd8e68f22632fe32c5e3be297a016b7573e99ae013dad", - "2e706582974f151cea53eee9f05ef0af5fd9afe4eadbb76b5a34adb8501f8d54", - "9e8ab98f823f24f599566260ba99fe83fd0e9fdbf06ddddf58f957062f97534c", - "a300a81a7ebbf3cd45a3469ffef78d87f8a4fcd728d97bcd5232d10a6ca60cc9", - "7eb466fc3fb1245452c6603c6f446369b2e68b8eda95276668787183c61a4aa8", - "c10e2793625a1ea6b11dc9f19d36563c5e46e9d5235e30dfeeda05295f0a0562", - "c2863551caea700e04b70d8b2c198a1d86a76f866223bf5badf7f9001f7463ac", - "7f42193f0430c642ed5c140d382e1fbe1a594d69a584938f7855dbac21e6f32a", - "52949ef9f9d95abe9433e8adac9a7f29c2f6a8e2f87748529583b62d3b18a570", - "4911ae04801c598b7706620b8e3c1b062889b99325c9e25de2d7ee09c9f4974d", - "8174cfe68eec351178f066c6b37b33492460531d42ccdb3fd7b83cd39913bada", - "f3d5541f1c5fdb82e98f1724ff9f01277997f70254972fed44c69faeb4f41b30", - "cea8e26d7b4790dd67519b27b67bd815a3d5491aa336e3fda604c1ee415a6a79", - "ce8affaefb182bb5f7d61afda34fb04fe028c98cd090a3ef6fc786ff5ceee883", - "b33a8b552e9e3f8958279c307dbca58ea8e80b3bf64fb35220ca5d4df6224951", - "4fa186b5dc7f71081ab2ffd8bc1df916dcef46160a33558be1637ad6b25a008d", - "836402160635f8d6a0cd6089dc0ca3aa401efbef479c593b7b115e6b8ab7c027", - "52123e4de72c6e3ec41f395c594446530c7d46eeb4ed5e5eb2e93e3ba3efa0ef", - "56906dec34a2157cde1f636412e51d6d8f42bf54027dcc797ebce48c0681b012", - "490e5e391a31c417eca5e94a42fe31dfc8410c3915da9c4240fde169778843c7", - "c206145ad778f18a5c5013254e42f7824c6b588d2088b9d9c2a92dfdbbedacc1", - "0808da9079d5ffec55d98ca427440cd2c1159f2ae64933dbaa1f24ac9c8b2a02", - "b863961556bceefa85fbe14118a7970f1e60985a5adfe5b303f8aa7b8d15df29", - "f74bc199ce83ecb716ba02f59e45ad12d0705af61b941e00a3d7223f4212df96", - "669b1717cb007669ae5d095f32adcd1ad45967076d5fd254421ceeed70ca0378", - "55887f363c55e6320521cdf7ac707dadf9419f4a1ad489944326867aa458e0bb", - "e7e3198657fbdc0b0f7e85e7e80131b08e3bbe7d3fd92e7511504348c35db2dc", - "e2d959bba273019eb8e72e444c97599c9483b495b3d105eb12003e8e542f2afa", - "81a58ce45d6ecf90b9e1d82a7210181890075fe739490c22f985275fbb0d59bf", - "7f68f1e3dd737ad1f700861d23d36d25a5321fa25b584f79453a7cd81ec1e3a6", - "dca29dffb065a9b91c312d38b3c7208e3eafeea479343702d75b1a6e090f902b", - "b4aef00b0b52227b28d705497d46d8dd76ae5a22dad51d6e48007522be16bc76", - "57488230f05b20b1b06db430cebbf7d4aec4bc6cf73a995449d1d415dbc29851", - "9383e2a64228146be8ce4ba39df1d5dd314a2756b87d9330e170dcb48acef4f3", - "73e26c015b701fcdc3e2a5255f9b49849a7e103f6b8364693a8df5f54a3064c7", - "6270b94eeec34a667297aa0269be2985ee68d13ea30bfe318d27e92c21467f21", - "ed33ddf0d849eb5017f5d5478a45177ed5b27d7f6eb4350fb1a82117f352df4c", - "64ea81849afa6d90219fd6d3c22c4fb12ea65577cf0c0272df66049cfcd301d5", - "7024360e59276e3797a918617985933f09c4ec8fd7372bfc8ca50912fbffb20b", - "0ee48357893bbe058af2f2a0055e47c31a370791b1c8d4870c3eea36cbae3137", - "39c0449311f3d65aa0cce5afcb489df78700625cbf53d9cb5f2c3182a425248e", - "de0a8ef30f13ca7054b54cea1b453c22eb33cba368679666728ccdcf5691f0b9", - "e497cdbb98bda40da8ef9127df2e58c5fd2a539ec9ff6afb9549bfb1e021ee53", - "88eb6728c129546b3fd6b98456f40ee78e000e3252f6463cbbbac35c86e190e4", - "ebde8f6284f2e19f20492a5cadedce1197ea7c8cac3b5a613103ad852a20cc32", - "8ac7431c2e297d16f2750bc21f3221c1c1efd292098a70ba2d3fb73e150351d3", - "074771cbcf590f48c12f2a56b3ccf694c66030ca11640fbc03a429b256242a99", - "ac644ef235e2472f35fa92258627130ea925d57d8b21abd4b36b512b5ebbf1a9", - "967629b3978864b154ccb324ecc9158645d6700f2ef39ff09a95063db3add6c7", - "b1108463c3f005bac193ba0df385065dca9b6f56c99622678d65ecc56c035b1b", - "37238e1169abbabd8aeb18977e7b5c9f62d4028bc3eb77cf0e90ae260aaa45aa", - "1a1e7f949d26260727a46b886b0372a577862ddf058adf32fd50edf6da89ce9c", - "dd34bcfb6d6a11a010377cc991f312e55de485c74e864175caf9c3901fe8b79b", - "af73c3394225be313809328726d731a9fd94b9848ed755aded54da2a09f12a40", - "0ad8702ce3aafe749bfb9d61f782fc196f54d896acc5b34c8ea5a3de2afc37e6", - "405a9fbc905458ad89ce40aeca927b5c20636a3c1047d24034bcc75ea8b112ac", - "cb94b05564580fdcf2c5b546e21fa4cadcf50ccdc55fb5a581f317f02649595d", - "6a2e3061a5165c8de976886b49f06f6ed71fd1f40c764ebf7f516197d22351c3", - "66c3ff882aa98b8609cf6ee3ad5102f401e8fbf7715a439aad4c399d2edbd7c9", - "d0492b27b63885b31ec1e06f9a652579a6d3ccee718229ca3c80a1c414e08601", - "59f250d85ea73054f9dc071a3bc9c5094843ea2a13efec7d474182728d754f7e", - "8574faa4d4a9a2a20bd5e31b91158b0d4a028c4116ae27ddb23c77102a7b1e74", - "5810a526afd1a4311c5dfcd70ca453ca6b692993eb22a20c45d888539459f1e0", - "8e52862d57fdca31c637c527e8acf42d116586e2c52dfa6c4390863d22de825b", - "036f56c92f381114928a3a363e93d21ef92b716ec7dc209090e93b663274c5c4", - "b5d873b1943f098bf5fbb300a55c471c7048e48c756154313c658d215f57f652", - "36839d38dd24b7f9670d5826bea369db64fd0f8b04193ebb7f684667c7a099d7", - "b4c4639d8d408602919b89a67787a814adfc3809b1fcddbaa6377ffe80a361c3", - "5e734a3e1942ba0b92e1548c7ce144ba8403edc8b8ea8917fbfc7f82c1d2ca91", - "93d1c47b038acbd4300d9ed509542fac667bf1e55496c7ca87677c09117c1762", - "58795d5bf02ff1ae0a9e3cf367a1168256e6bff6689d79cf9ab5228a39af029a", - "581f99581ccfa6c17bb65d79a3b5708dae4e975b3e1f2b630075cc98c3d018d9", - "a8d59a393ab7bab79b4e94ca768b045b6f3e43b4dde7729f46a5aa37bbfa70bc", - "fb6b291c8a01d5fbbb6a29aa23ba91daece09401ab54813a68aecbef4e78ac1b", - "e838fd06bb8c041947a390d9793c6e188f44bc2ec7301fb8bb6987eb2081f8ae", - "c702830d874c9d8295e8605d855d49ce1827302cbab491f9aa7b9f7e0f3b3ef8", - "16a2214a206da6b5b1e93fabf11df6a59fe32625e40164283b7d9e0ad015ba50", - "4553038ec65ca9c1bbf81ab0ea87dc814660dd930ca0796a44518e7c39926acd", - "fc8e48d9d0abbb59bb15071ae40b6564405b76b644d7a993be6df54c526d64d0", - "34dcf67df65f4fca1443387fb42a47877006be36379c0eee2aa0f60ec9bf4b9a", - "a9fdc7b2b75cd485d6e8ae93cf78073e7c00c3737b6d0a7374bde75195986cc5", - "bb07f2dd3fb84bc517210fa675377f7a10331845ee3e92a5f45091fbcae51a4c", - "c0bd1421ef85ddc30ad1608892343a2343e8331a2c9f2dc02b17b462f4706c3e", - "6e5ec0c8831b9e45bb1d3f9072fa77fb755c85945f542d0cdbcc22041a58437f", - "e4794a89add15e1e313a57f32425ebe297a8b70c10cb71675a00c8107a8e7312", - "853eed3d3138170861495abe1610922cfa9f4cecfa2c4bfd23797490b7f80d02", - "506c5c8823b778a863da1faf78cdfa798cf7e1ea3eb4bc35ea73e8fe7593b257", - "0e9384b2b091d790c4b8e5cdfa84c2549f3df76f8da0fce4416c37b162b7cb25", - "898429d4a5ac5cd050a8c481cdaf884333eaf4b6d31e76ef10f3022c74099e61", - "7e96faf33725943226107107953e3468e67b9c3d01a504a571525ab2bdcea3c7", - "9bfeda0a97a64b7984c2dbeb7e85d68886f49078c44dcf2aa19ace347287f1e6", - "442fdc58ac1a2bc81a9cfc879a6482fc4cb2ab93a32eb5ffc998b82f1a24fd9b", - "0185ebda936a3129b2a8926b316f89ff14c3cea29405b94ea797a541c47017cd", - "756dea5d99416071412863b282bb20704dfaed0348d6d002dec2e6b4cc793a0a", - "2db1759571bbedc01721f8d1272b290de1fc5e71b9b30ef1fb08d5d0f9c5acdd", - "7d075ab8c3714123cac104a8f8361eb96c9d0a2f4f8c71ac3a0c3b040e81cafb", - "02737e5c827548fbcea8ebb4c750606522e2e5a8c8ee72745e35c0c5cc75b045", - "b90ab2bf8e5600200c1bcf74280766a4fcdc3760acc2a2ab06cdea0bd23185de", - "85b4ed4b0a22b6cc8b16549b52c7ce417b8a6e94d27beb12643dc9791ab496fb", - "1e5c7ddf5d43f8f39a1c07ab747bf32714b6fb2f9f1090407b674e22f6791c61", - "8dd68db81cc21636e4a90d1c2332a87881de186207550f50307d1733650b1d8b", - "20a55e2c49092c7483cb569872c0b1fab3bd243a671c2edeb1b0fde3613b6917", - "119e735e2d9d7897e58f1989fba13b1293fc3b6b052c576ed70e4295bfcb19cc", - "4f689aa213aa43fa4e971b54b4866bff7c457c6aa0bbc3f57b868e0ec91e1806", - "22c4ad86d421815ab5485def093162dc93fba265cbe12a7243666192dd463d4e", - "fc3ccee02cb9f04c02c5fddc5b4ee15fd3123e73f2ed738d9a8707e8adf156b1", - "b490a53f47d9b2c19e7cd91cfb6e2c9e1fd3bd54752c7af4ca96e0f7a59b24af", - "b209c04e764401c46e8cfc441c49d843f28439ab5e1dade033dae390ce42d6a5", - "c5a3328384ce704634d555afaa82c47ab6f10f71a557614bec6878675ce1ec54", - "9ba7e48481862e53f1ec8bf6c6b89a577bd3671102cadaf8d013071a33e66d74", - "efd3a1935404b065f2519313b74ddaddcca698894d92cad0a5c4c50ef0b7e7c6", - "ca024fdefc110090f76ce08d3cae39d3175afd7a55568933366ff2e58487cc44", - "3ae06a6f73fb0e029f79f749c72cce1fb96fbb8b7df0ef5a1bb421f116634ed1", - "2007a70a5f0b3a764e1f22a2c3a061f28b2c638ddf8a8788c1b2ff1ae4372540", - "7442e8791893a79a2029a8f37dbb870370e3f8cd898838d5dd283a65d7498aec", - "9915da22346515292ccac12f197ce1e537c5e385de6d89f728ff98d3c1701caf", - "2dc8f63a8eaeca2766cfd2868808a9f52017ff1889920d092216fba6e994bdab", - "e3825981f9b87c3acec852e46c7c917eba61a73db4a26338cca41556f126b57b", - "2f347de6e2403dc809c4450b93f1c2c231ce4b78d907b7167bf7350a0160f53f", - "2bae93f653d171993e285c6d47cb142f035c696cc63b3c3d1966362db1474467", - "a88b573a92991a9a141821128466e26089cbe27573ae8a8b91b53258caaa1013", - "48ac478919072a5f6da03c8084c227e84f747dfa1be3562a8b2007a09c02ebe3", - "1a106b2ef26c514522bf8c28c6cf3b0fe95ee74828b939939c9d2958c0224ad6", - "458c0a3941188527adf3d5ea5a267869ef98f546a04b6f93067a73ebc1b303c9", - "2539f43de8ead4112cb4bea9c126a28404970f83c2f89f70a4984b8bfaef3e4c", - "21d002a548f7634e72cb16775fb442ece5b50b7a0a6218cf13bc837b06e71a92", - "797b005e8b46c92718894f9932369fe6e38a8a879106adbdd7fc86052989d782", - "a079a157761a0297c31bda5725a313e6eeebf9dc857260cceb6e633f348d9146", - "f7d1ba545e280051b4414c1925f437b70715c3304757455b138220f1003a04d7", - "e8ec6bba63388628d262db3f317833070c09dc14589b6e33ba7f2c731bfefc23", - "9273f11ff0d2f8556b5098f521be0df23383501f3a52713cb91da844819fcf22", - "83626915b41e2e57aaefb2d4aa7bcd3a6365948ab1fb07c3c4d5665c95a103a9", - "a777855e96e4a6d95722c21fb0d70b8fe807698353e715f1fc2900fef873d907", - "b3a6455b54e87fe99f1f906e1829b797464f5398e3c93cfd30345733281a8d8f", - "2fe5fdaaf5067a6b0ae0605433cb708c358846a98a1d27b1e6917ff429f84569", - "7bcd403869af8ba31c1516de6645f74d5b4390d71e558ec2deb6db97bf4095a0", - "fbf8d0f5a573bff20169141637009348678310eecfdd63fa76e51af043c95393", - "86f709b7639f34eb77e93ceabcf1b333624c3a92eb1571d8f0bb83f1ed6029a4", - "b6071b0d51eb1ab234af83209a24070b0cfde9bffa8fa5bd6aadc62706eb71cd", - "74510f5650532af9c9ff3fd5e8999c1fdabfceac688585873414f6277aaeb772", - "0f8b3bc2d0415ce6169c4d909304fe9cb2b3050264064dec77f4926078458535", - "c83b15ac903021ad156f39af2196f217fa7c5cc2ec834c096ccaee448d1cdcb7", - "8698cda1b942c8196536ead91a921e166f30c099ac80692eade95e92d9df2117", - "539fecff3c3618d39745e7d52adf3a1726d0923340445287b820dd5a13bf358a", - "e700b7f444e32119156b91eb8a1d86dd16c8a06e39487b811cf6c21eb83c47c3", - "5b7db007d98f82b29b761d89806d84552ee01c0b44abb244beac7073bbd64ec6", - "6c2627dfbdb192b14d66c1d215f9680234862301c6f98222659b2699d0995129", - "b9033111d26c246e005e60baba1da14c731102f3a2690a0718bf6837bd4f597d", - "75c7b08033490ee83f3d569c37421449ae76d339fb4dc0ee5d910024cbf8cffd", - "76c3295b50137a7793d3cc207c6fa817f898046a9d065673492cc8076c276b93", - "0ccdd9ea699fa88e6575af75c84bdfce19d8ff3c32fec5d685ca04cd39da8517", - "ed8e680ad1905d1f0c33a6490f30a202c7d18ce322f6a9c781e27a8515dc808d", - "1918a9d0fa9d941c52dd74b624daa41daf41b9a9e822990d23c95c00ba28843d", - "33b3f20f1da1ab29ab2d8b1299bb6a9c13dcb3b7f2f6d0eb498cfaad2caad9f1", - "4778a30a4c15ceb8ce04f40a1cb9d3b8ab76ea97017445648d80de25eedcd05d", - "7028b47c546dc35b9520099c7a5ecc98342e5142f97162679fe845d8d102a91b", - "191ac279abd85ff228656ea829266c9d7fb3ec795f45c1b9efa58871d001e5bc", - "4d23c42360f1c60e7f4d5c6c73c3c2ffd1d4e2f2128a65a98b27930b6086f2e6", - "0f499144608b6ef25d1e6952b1f5936e7653b5058450373dd72627f163b68147", - "34a58a99122e8b471357c7313f92422bdcce17f9a6ca948ef499bdcf3418d5cd", - "bba0c3cfcd7a331362aa53dc0d6b7f23d16eb358750d5b0f28d65abd97b68a47", - "d41e2f1d185c2014eba945003cf730c0422d4b86482c0da00e7e587bb5db0e9c", - "a908d2dec804e701134c4e98189c45fe2941b000142de37db6065107cfcb46e7", - "b750d206637ac8799fc9b28e804af3f7b66a8cfed6a3b3edad36096c2ed589c9", - "54596b95098f9ff8e953badaa6034c8194a114d5cb55c68d8e3d6843fbbe5d99", - "396f65896ef4ba0172995996bf9f438b55cbe8762451a38fe567f8e98c07224d", - "2831b32807d4f25448afea2f645b42a3714074e0326449a6ac5ddcfb983155a3", - "cd6f7b69ff3ddbd704b0a67061a35b85eaf4ed44addfdd92eb8e6f42f2f91d66", - "74c333a400440eacb0651c8cd08ff112d16819ae4eeb36a95bd5232ca72b2199", - "67c3fe3f8a58704fcc6468f9a5bf23e7ac1ce66f34417ed9119eaee85ef79858", - "5159c4ff1f835e32d261864250d9c682ae0174cc21aecb3c564efc871f8ec89d", - "8e453753f0938b212f52a21ca23d890bfdd3ab789a7ce4e6509ff69fba31fad1", - "3a047282dd1dbf332a702b30c00b22bf28c72aa010a8f3f3a13a20666708c00e", - "d44340220ed693fb2f0a743c9af1a75432ce1bd6f2fd03dd7f122224b2c22877", - "129067c5e5784c27945e18ba9fad6861bca7b64c0f59d5ffa51f74c179c5f413", - "cd2b1d5c6411e73531c4bc2381481807ec39979ea31daea14750d556a92cc92d", - "77eefb19e4554283f996cc9de4fa3eef0fbb19c56ec441581bc4cafe8f320984", - "9a89f32f072fc7f22a878e1368a4d53eed3fcf1db334e55965d4c77a88e338ef", - "60d782ff726f9565c909183c6cd19ced6ee65978931fcb858b3c957604c0fb48", - "9ed04a8053a243beac9fc7cd0e44b7336ce688aa436e8adece5cf38bf6b5c87c", - "02afc7296ba5493a961d41edbfa2efd4859693560f2e2c39361ec9edc8912f01", - "0d90708f5436da77e0977f0d9f51639675f83626d6eb6f755b74c4dca486e293", - "7d6812073823e9d9192c4ddfa2d9667c8c933291d43b6cb481fc1154c2fc0525", - "1450078dd5534f80c40f3e84e6f673d9493599347f6a9bfb1051892d8c156e92", - "fbc529e549c1f40660381b010777a4ff3f82b766ca81e10f20ac986149d2fd67", - "626ccae9b777a4712d4db8fbed936487d05e8e6c84bb82a806e7e9e41dca893f", - "bcb87f7124a1f847f162555066173d91782e0c1113df1e75b80222fe7dd0accd", - "515d2c21c0282e3aefab27049bc74f9fc2f205eb98ff2ad5dec458bca94e888b", - "a14af61e2f7890268d176f8e2da0c67f64e035a8fdca57c400b9e4626db51401", - "82582cea9b05bf1720b8558e35b2df368f3a53e4d59dc9166525c10f70ee21dc", - "d88e4a64466a1e51522d148608d176fbe3f420fe5b06866d602bdca3f5df66eb", - "04d54116071d36f3faf3deebe4bfaf411d35078992dd8f55f05357bd68d6f03e", - "3e4c0211ee00fb91510a940e700914ff2219a9b5ca965c5271202ee9509be889", - "d9d0721267d69b38dab5ce0a87b87dc485b190c49ddc9d2d39a846aac094566f", - "f6d283cc9bbccd7eed92ed36e86a01b7ab571088c9272ddb5a3e391e647a22ff", - "1a24f140ad5ef4d5dab6004eeb3a635a4f8bb8d80772bd6649ff1bff835a7775", - "7b77fcbabb02738a6ba2b656a334cf0ee781da5f8d88276486d0023c668d3baf", - "29ffac38fa7f76dd96dae9264ed2882d613db52055b0cd6b0391475a856cb2a9", - "ae8be4b6e06fc815a8cb3e046aa22309ee1b8157f797d5311ebadaf4c5d90555", - "79ef599a74dea0aec719371df292131cf0945125c461058ff08f086d2cdf48ff", - "0843399a1869059a822996d7156088a83c5e474cd74da73e85607fc6edd95709", - "e6416d53b5d6eeffcaaa50a7e0ffffc45c73fb16b09be57d304962c1f85e24ab", - "50a33101cfb11214b1523c67cc78abb3f60d3a57b10a309b4a279a0dcdc0f993", - "e743d24060ec667b9b7a36eeb6f7b8a504616e1a1d6cf075755bfa8ba3b6cb1a", - "106becf5271afef73cfb534d5d90ceb6ca49451098095841c1f6a00949549b7e", - "821e940cb39ceb196635578952a0a93bae178ca6676a352beb7739f84cc904e0", - "c326aefc8bd2bb1d5d82ec71cc83c182dc1413a87c2515fdb10c08725852d722", - "f32399fae936ead3c8557489000281014d351d24e151395ebadd852a5a9f0684", - "fdae39e0123520edf710148d75349e7e12105452dfee83d93182c4bb869b23b6", - "1f89151dc188f6965ad098fee268b9c62906624ab5aa8918be4c370d1b3c4dee", - "97426760c3ba02d56d89e8f6d7ed8f4c869ce22ac731050f8a19a04ebd8361ae", - "e0351192bd02bc5818a641b61fedbed3289d440e64679407f610dcdeda8f8a9d", - "e224bdd8b79e5c6c1e663342745fbe716eb1c22071494443612cd88cd03efd8f", - "16995896b0fc3cdfaad67a68838365d74ab28d22c3f17c5fe5b1d287d0bb8ce5", - "d0f99bb46ef8c9905e0333da17c2c4cc6fdb63a24bb0f7b269bebc1ab8d8fa24", - "a8f9c4c5f67d7181615cf15c844b51218e8edf9c560c4dd8b898d653f2d7f59e", - "1cfd0d227df907e57dd17deca4732b33a708febee95d0eae4376d75f3cfcfa3a", - "32859e84bd526841a355b3127bb372229185c41ab1258267bffbba4f1e2f2186", - "07eeffceb37e322e752f7dda0a4d47beaf5d50ad24194619e46091e189b22eb9", - "d9ba053d2820305b1645af16582bd92bf9f9081124a8e1e67310a806db728338", - "55ad90a69a82f7af9c6b236f710ec5c89258007bf08b735ab7a65284b82a8186", - "8ce152fa8a4862969d4f81d3da6b2a75b601addca9cac9c16998130931fb9ed3", - "2bcbf76303cf8b1a08d6d4aca36c326f918d503adcceb6f5da2ab19a482bd022", - "f3a204fab577ed7c34023fab5ea53762ad7e6859f9fe077630c49baa5fde08a1", - "118e0450b23886e053cc4c5b9b07105d27c35b18352c200e2290953f28b3a05e", - "40aa13d03bd5199a8fad4b17086126cc07d03531211e59aa7c5655b1b5df33da", - "e70d5cbad2890b7dd9429a43c67de37562d1289a67cec3d533b8005cffda45f4", - "eae470f43b2396fb6d22fcf6ee5c6c9c58f2fda985370e3940dd6004d68f1d3e", - "c7e90a69e1796aaf5868b7061c6d0fc645f01768936a6035be5c1c80a14ff19c", - "1fe61ce8025b4f83b0252068cb72a11572d71c0c7a5ea05cbf8fb9aec9dc42e2", - "9cb8207e383d95ae8b385fb1adeba9b4460acd80f4e36c02278ea98b53b1b0ab", - "1584c88a1f7f736ed1524bff8f5aaa40024c560a11c6df1ef0840ca07feda551", - "306024ded04f50b9355de097143c40d40b066c69cbf374fb6d66c769713b4945", - "9eb76a7ce82b5fecee006406ce42a9188aea61eaab096430e172e071265df3f3", - "67e1f3a8f871c1e09e80d78066a3d969dc8ebde74b5613ac49eb87b96f9774a6", - "b77b5219d5ab4195d89d36817beaafc5dc4e54f8d06a8952631525b9739cfd12", - "83e3f9af20a23b5b4d71a56e9bed947c4829400cb514ada45e7cdd0480398561", - "d28a2d4fc4b84f6aa8e3ea7cc891cd593b9170fdf7356513c5fa437c8e8bfcb9", - "8c99404324f362c15129735cc83e24830cee90346ac86e015391bd82aad12a67", - "a008093fb460c5a69569e21b8a4471884a519817b332491f9041854ba89c226c", - "2015c99e7cb9a91fbd919881162189dfe54b2e62df72f5bd7e24981645cdb6a5", - "45b44f1dce59a2f14911dbe7d88d2926176464d79aad5545da8908219acc8d8e", - "99a3af245da3533e21dbc05d1b6d7f6f9fbb930a2ae014000493351a2111820e", - "fce0b67179dc0146dce8f6cdb290d67434f13cb132a2ad479219e9d131b48390", - "772e59f109ea84b083933fd09f6269286cdc2cb30a2a06f578c66b34733cb548", - "3502a4107e9075c79a71a5d42670dd8f5c4eb8daf6c2141df157db2090c72ad7", - "6395d002d53d5fa629677f8d06e17d9fbf8497bd3c40350086f005848ce319fb", - "5b447d13d2d39fdb517e81840ae0270a825837dc62bd68783ce0be7491b5d9fb", - "99683faef7c45079a3d030c0640ff0427de4b5c3da9ecb2b3a56d28d342caad1", - "17c586ba1d999fb842bef622a48386b20a4cb30458195ab9b4e271694feba01e", - "7e85718c655772c9d35747cb413836c688e36a511d47a445740a0a39f3208fb3", - "17b1b7699f580c442f5224092999f727d1a988b8d743790b6e6705a13450198d", - "ebb99332e73c33b66d3ea27e4c35b19db69f97fe57c337f6307fa215cfe38a5f", - "4aaba88dea47f26f055f8e7f748da395bfa4c7a5866711be81d0803f5f6c059f", - "93e8a55d284e3e48617535ac0e73a094de484481c811e642710ae5b8dab93f19", - "65242633a76124e3850b37c7026988116e18ac4b3cf4ed88cce7340f0055c672", - "3a754ecd2e33fd1ae62898999c2134a278eaeeeb476f18921cb9ce20e96ec295", - "3b083edb14984e8cc49f2c16a18d7c14cc7f5c2e0247be8de2e22ad2c3fc55c6", - "0673ca310697b38b0f4759f3edaf2c606d76165710f873ee40a2f8880675f2e5", - "48b3900c043e5bf2200d2926a8466e23007351fac571e83f470be560f0746225", - "917f6005b38186e4f6ff3e16910874af0aa809a70107402af28b2a44ef50cea7", - "77f85dff1a7f58681add2098218a47ae4229d4117c4be1ab538b03482b5f4a6e", - "37be8573fad67cd9922935b0ed42f3e42fcbf053cb6003ead685f6a794d0441a", - "15f959b5703a37d874f785251018d97b1bad13f7c4a26b1a2178881c4a9779d6", - "4bced30d2b238c6030d85771029db45960dd4bf758205d58f96681edc4208bd0", - "8078d41d4e8f2629385fe8e48b76de17b9a23003a9c9d64b3b9b6f62a0ceea49", - "80fc2cc8ee89a07454107bc96ecdd0e0a3bf69c73db78cde45fd8c436e6a7913", - "46ada18969b4a78cadd55da791d98456b7a0d3fc93bf3fe08e989e97f8d68a7d", - "cdacc32134c25ea15be1df886cb7f6e9ce855f627fc90e8ca5ba2fb6f597d710", - "3ff3e9e3784a134c20b256be112f028d2bb09e16e0ba93c333b44bbc54c84156", - "bc941d790adcc6fe2340d6599a3216ac80c58d18a6ea344e03a8c4a30b6db0fb", - "5f1432dbd90fde147e65787acbbf4245220f85e6fa4ac8061f7fb7fc03bd2918", - "7b88b5c1e9062d0613d4d318f572fea29bd680e95aebf6caf6a944c054ac71d5", - "1ec92888abcce072f82844fe234e487c31ad2a49a7a52ce89aa1a550e8f5b003", - "21cdc38ae26ad6b1bf6471f9be40b8a9cf56ea87d1e3fc0dc9e3bde94a8cf34e", - "71c2d3a9bec979e3a3dd289cc662e3527d4667841afbeae2fd2296c4546483e9", - "9a9450ff5dda18c1c084369545bafe566550eb56e85e4a798ad385d5b2af5864", - "082456a5c1208509de8c856e58f4f62b467f33269942d2937788671af62aab86", - "82e73932779c0f458c1eccbb0b63c2aea97a5396f763e8084b126d0fe980bc17", - "5ee9b06968d65c020efa4c4f0e71e631e55b78295a14ef40ce1a009e72991374", - "79526a2e5a424423ea4a3db14de7e16613c5f39ee4306bcbe86570ddc934d76f", - "1f4616089f621b32159b66aca800ba0d1d15ae5e2b99606841bcf9cbfbc89de4", - "701f3bc5e44de06bfadf5d21ba6ce1ace7034bb60ee2a28e9271330f1c511d71", - "5f427190552c4410c91b345c2e025613739d615db3ed6349c8c2abefb0179681", - "e9529b3db1a6ead7bfc5f9ce85e2ddd6c9f05d331bdd860854ca4ff85a45fbd4", - "ce75ff5722da6199d5744b23739a17f13ed1ff97d2c333a064edaf5db7fb805b", - "eaabd5c2ffb9ebbc3a163f7c0cf387df1fc40bcb2b2edf4a0934f4976855bf67", - "9187fbddbdb7d25edbb89f8d2f9ab875c2aebe394df4fb3aa227baf4816659db", - "1a4b2c2920b63f7f08ed6e6118594813d67f2f1614a523fb9ae53233153681f3", - "1d7cef82abf7dee55fd6d8ceb399423dafb9d7a150945454daabfdcd7a434155", - "daa397a31c9f6f60345a66a16e40f2d9e70eac714a36bbcd0806352a1c39d325", - "f90ba4ab2c4c651ceb97a79549796fcae82f07674248ca9e0d44e27883ef1bb4", - "cc7dcbca3336ebc996cfb39396d92f45c432ce5c6c02549fde49b2d0d5f60c98", - "cedc77320a312fb632504590671bf8bac62170d34650335f6382b45df2167d42", - "36309ce5777b0378e0f1847fe03ca7b40dbd64d64c4dbeaf34d4dc9c97c51e02", - "da8fc93797bb4d5fe9d55594919f54ea2d066240b6a2a85175aa431c7783b927", - "ba70e147938956ba94bc56b30e5f8820dca542e232d968a26aa6b621952bdbb3", - "329b02c58c9b11ee8f2cc9f08d54f268bedbf9b42431516dfd233318f1809ab2", - "3d5eab33b3fe3f80ff01675f286ef10e098bcdf20b18173a30a641b349b4a82d", - "066c506013c3e2c6a2026f025fbe13568e6e867413638a5322c05c62a58e4865", - "02e9b8061ca02d3beb8b015df7c509f756f0819df6f92960c0949321f8b0e96b", - "a27b32b03ecb7a02e6fc2556139048a8814fd87cafaf1eddfa4533d5efb7df1a", - "de204563fab5db64631a3d371a4e6ba30ed6922c4e80a28027a0289185bf75ad", - "63c4a0123f15a49b62bb3a69ff7b406cd994fecddc6376f8dbcf83c2d7d9b0f5", - "07ccc50b5f9485506e9cd2afdac41ac893e0ebd77932c0f6e712aa7ef53f46a6", - "b49af8eea50b63842a9e77b6c4661ab4a211cf0e73861adb4d4401671c789f61", - "c47ce46ccab8e85574aafb02b27ab01f0518d1a85c7bd297c3d3211d0e637aa0", - "f5d452dfb45348aec2b92fcd21dd6c2f499e371ec2c2c2b8dd0b2568c05822e1", - "31b37009e73dccc4535142a798ca124df1135d682211261cf202a6e6b2ccb007", - "6a3911e1b103f2e616b99d8ac72019481f624c9f75faea433203b57f5aad70e8", - "dfe5f5f7cad8289936dd0b2471c6548dc8e9a7793e6cf488890e8ed294960ae4", - "cf531f41bf0853c255f7b2b03607bd79525a8f963124203ca119432f74494968", - "a0c9fdf0774cb815e9663ed8634c0b568a37b1fbc0ff454c503ea70b8322f0d8", - "e526b6b8fe03e615196935cc088fd1dbdef293981aaeacf5b7c048102bde4b5f", - "94cb811122f254c6edd8b2f747f6b9699c3cdd248fa04d82e301b98561bac0eb", - "cd1b5ccbdc0401bc663b35da3290024054aaff50cb5931d2ea9b1289d0bbd331", - "6237a9b927225d63f43f1581d67a52a27e4698477ec52c157b5733f91e17b145", - "3f25aea67e14c265c1a51940939fa3e8393b807f80883abd0435d2b5a3430d47", - "0bc720724357ef8a7abcc91a057df4f9efa565e68bbf3f7e5e9436cc9c63f1a2", - "b2c3165a7481334444fdc6a5ed6107e9088fb7cccc5a40348cd4282dad8275a5", - "05fe04ecebd53ebff55ee675c19f8b4655f8f1f1ebdacecaaa346b7b0798f3ba", - "427b1cfdcbfa564f82a1e77956ef62558b36373f3f3929e0c613435698f414b6", - "16c4ee369fc55a1e6debb7a448c7f0737441de05cc674b9a7b329651f3d64ad0", - "421de56f680e474cfd4caf652a54406b51095631c1078ebe4beb24d54f8062bd", - "c02d2ccb83ed8ec98597a4cb5e4d2c36fc7dc20d293d90f079c986bb03773a90", - "7b3a755ed4450787cbcf4d1875f69170cf0e26ebf4e9c84ccf63e06cca11f839", - "afeb2865b0f56ebd73803e757f032c4dcbdbe68c72d45c9670f945a251e747e2", - "110acc27f4eac2008c7c33382cf2abff61008ca1316a3baf8eb28785bb092bc2", - "37b81aa495cfb14b784fb82d67243a0618847054ca67d999d5314e11d41e0bba", - "e2152a6da2e7b8bd16b1aff0dca12041986877ee2ec096922690e95ffa1aa869", - "61a0792a9547ae92b65a8a7b957d33b0a2cd1dd30dd97cad5eba1638a249e305", - "e6c6d62a93401e692f09dc233eeddfedc8250b757d3ccbe8d473f8ee485603c2", - "f19af0e7c7b8f150e8207085b715f5f7989f1ce2e8c9724134ba381e5635c817", - "9100253732d0d92ef3f9ef24d44081277640a37cbc4b191e8248097d6f1e01e2", - "69afec05df072c2a95bd118825c54e7377565aaad6fb932403ad22dc18457ada", - "a2967e3bc15bc704fcb504d3a8d3da88bc76acd5e8494f16fef263aae56af4b7", - "fee7dec58c59bc58ff1c62758e4a32c4ab9c722599471ebd7227b1c9093013b6", - "e5efb7f66aa5abfc52da13b38585985d51355573a3f2f403a33ed76025c1f6a1", - "2cce58e185bd41418643b1bd23ceed5e4efcb308f6365bbf3abad323182aafa6", - "e828f78119675bbd455050e2ba37d7e2b336ef50fd813a37aa9bee22f087de7b", - "85763362895d32bcbdb1b6f58698ff1add0d249c50ad23b703dd7dc9781e9b01", - "35b8a04efab8da0a4643b749bc7f3ecf2046791c6c6830b102df80d27353ed2d", - "2294623a7a62a58556684ea5b2250352846624db22e5c8b7b4351ff1c454a560", - "1fdea022fb265d96e0859a6262e1fb42c83c52670ff848c600de33230710eaed", - "9d96f58f82dd8095afb6f613fa824e2666c580d9a4bf98eeb6f16178c4da06c0", - "965e1b5bbeccf96cadb8d3a1d34055104c72140e557a45e6fcc5ffc1dae80d1b", - "71eb121a4cdc4bd49c93439b2580f9dc3e0cfaf89e7f56b5182e999210324dc1", - "4e99d897fae78acb4e4a66d45b6c685a9298706eb5d1cc1929b243569f3dbf8c", - "6887e5425df3f9e3c4f5849f8132a7e7e1292e653d0b9281d46cd76e3e1189ec", - "892e82af8a27639fbd80ee17e0c3b168a4afac102763ed211c3eaef5ec20db96", - "a7d581902e9e763c9883da831a56be992a9f99d310f4b447c97b714da212bd02", - "ff478168056b781c2a057968b80faa50e4b65580b16629b13be6b8739eb83da3", - "0b3fb7ca43eb2aa0302d428d0aa903f2da69eb8e3160187c8f095874add13853", - "206b4fddec05bdae3d95dd1c64cb70e3b27c6abbe042102defd4712f90bfa312", - "6f70b5a700c4390387b6997a3607fb2116598e17a3a50fc8d6bb1d173c996302", - "c7894ade011872969f48b26464318922dc994f3c0216c2bc6554e6fa44574aef", - "6364d6331c005f5c63d084c24b05072a210fa247e61f6cdc009aaa8d641f02e4", - "6782eaaef3832168588953c3ddab58fdc2bacd73f85b527a56b1f057b4376cbb", - "2a4db66ad2502b3d57d2a16edf7e4fe720e0ab880319eb302249c2230d4867fb", - "c41f2d4d0101376b5c82d0601dc5d56fcd0d4815040fd61c1893a259ba258def", - "91c11f3bf448d00d43d284bfc17cebd140e9bc5fc541b11159cdd1a8ac6e2082", - "3d2b0b3390921543085a67d17f1456958b50c14440f390d8c6b426d164847a09", - "3ab7dfcedbaff65a8a75087f3bf554c7258ea5eed8b5430017a0a2a26d61721d", - "f4d3b904e2580d710719f175f7814ffe97ccf865e06fa6c3af850071ef4136c2", - "9cfb6016463516e2a70615317249014ee6923754ca8b13436a3100d4656dcf2d", - "048f5daf81072f57eb30e0051fde64535b741751e47cb7b7dff8e45907c643f3", - "f9cf68c87130720e93b1cf2882196ea44c9499ded7742e087b3d7e923e06cb2b", - "f34d05e6602a39e49857bd2d144dd41a7dd86763978a6503bf13e01a05bdc3c2", - "0bf38bd73750b13702a0c006c4db79684838532877ddbbf6900fd3b2afe49522", - "e2bf40114786f4cb0bf1ac7a43f7e1b54b138ad2241be7724019c9c2e63664c9", - "4521d46d946e3fdbf0e4fdd39041e52f7fa4631f9d79fe1a68d546e2663a0901", - "8da7eb99d8775fb7059c46cfa5d4b11a9b754c4284edcddfd09ec8e1ab37f35c", - "da5c6a98ccd2884a8f6be646ba2099f3ba6edb3a7da5b76840237bdb6ac21fb0", - "fc181f38582af7e206a67d6ed6faa8635ccdb20454333de1956a5be847c306f6", - "f7afad4c7bc4764ce82e4f4cfbca739690b9484560d7d80e3a6ec1992f9d723a", - "f1d323233a28220b363843fa14fbd6894d0ad907ef59f7e8c16f2f2d8dab4e2e", - "f60358a7e688c68462108ef0ad674afe7f12024f288e825241d2393356c82a70", - "64b2fa32e18f3e003bf79bc8979f979d931ef92cf50d12ccd3c99d5e78fcf8b7", - "6766608601e5aa728187478f5ee8ec3b7e8c621732d8a6cae26fa27af9c03e9d", - "42e6d234c5686e0345ccb63b66517ecd8bb79a5523ea5ed5345444b8928b41db", - "c4d18097044a0b2cd213559937030ef34a10adb68a7670727599024d449547ab", - "ec83900e91dcd7a864f03014492b5dc150a4a636e7d2824e9d82a32207613263", - "37064135894b94eba12a3c4e013b9948dd0af0083106d8d69d8f772b3daf4318", - "4504a78a3e503e1423f5afb4d20055bd28ff70a8be20c07b607d66519de5f6d9", - "899b1b487dd7538c3576c0652937af0bcae3b0207086aa1b682bbe61a47ccd47", - "7cfd512550446800bac564e4286686599c0ebb57a12611a975cb73e85c6546aa", - "611d11e2c88bb3cb62f25b3045089b883e3a8acbfeb0b9c86162b666d2d99d75", - "23b5a61ef216ae6eda8877a529056421b2c6b987e1a5af83e2737c9abee3091a", - "676aa4d70edbc9aa1bc084648df4fb40a67c0e530169a0ce380e76a52351fe05", - "afccb642111d9ac28b66d5a657b992aa1c92533fd1a1697d35eafe4ff78f3c5a", - "33184e926ba11e933be6191cd258ea988e4392ce8ed71d2d580193b19c37c28d", - "6384b9dcb1a865300868e76804c087d5911321652e43ee19fecafa31e3a73da8", - "8a9bcc9041a753f257d2c72ca20334181596796c2d1c17d388a73bb20469139a", - "210efe62932ee29ea77b58b541ee222b3058f3b7c88d68c9b3ec14f7587e83af", - "335653e3f9a264d06f4ab573cab7a028e6d5a3ea3517c377f56ce34577a97f0c", - "55d4e184952bdb21f0202615c42ad092d5f0a4c9afc18feba80d11983f699e8a", - "21db9cee3608e6efe91f56a9a62d6fd6960e4e2d5e9ebbc9f9be483028071d7b", - "41dbe9be0eb3c48ad433611b94799e447f3254ca825bcb4d28d36473a0d0c26b", - "9015ec983ad6c2e67731202f3a3fe268439973d5019bc4f385c4393343b58a46", - "409f853a644c841677ca216ce0f95824184d11282f4e4ba51ad72598d14c91fd", - "9bd02a43d08509b67ed324c996792b79ec3abca338641e69090100be4aa3b163", - "33d894a0b64584842ce23c26183ed907e4388621288b94979769cb6a1358e753", - "a00a4e8ac80e7254c48084f9d3262db2a9abbd6d4de7a8ebf2710c74ab57a45d", - "6a2cfec918adbc89738485c5ae33345e1a5171dd88e0b1615c10840e64a25172", - "e6da8dd078a839e5edfa9ff4708434b13cd7f2e52f57779f77b77bb774f42b9e", - "5a74cffcff2800f8c4ab992b80d603a6e28dab5d203bfbdcad75ec71ce8f8d51", - "ecbfb0c809932b6dafa48ee691e8a243723f94a28a9445048dd30c06456ee126", - "8a1d836a20c3d383a4f97a6e437535a65b7ec72a5381c02324b1c0208a0448e9", - "7111ab08f98038d4649db9fdc6cfaf75dd4d13f534b8b0deaad8c5c7eb559ad5", - "5aedf7f41c20848d213e417339b17b608886e987061b977b713210c9c885ee1f", - "541cdb9491c9f4855ed5b4f476898e628bf1b157ef38bcbfcbe5432416644887", - "9411b4c1e5a86dbcdfc9c0e4b025dca2020beefd194c57fbb40eb67081070347", - "1c53285b1022033231a6a05aa7ea5f4ddc52f969d24de9c9d0faee5de0bb78b1", - "3c23590ffcb9e964bec8f50510fd8664773b75953b558810f8306c3b2fa4c90e", - "0f12cdfcfad00e3eee5198aae761476b51ad5532e29efd0864f463bb00f21f6f", - "da41c7a38027cba4ee5252c7f7f4ae12e59ffb8433ad56a76513fc229fce970f", - "1e4e2bbbaa699109579c6010b87c51ae28472d10b6550bfdf98ccb47c09b76f4", - "e9ec09e9029c21762a3830f45de526e2c0047f8b898dac091c65cc0b0e9b0116", - "eb257d8925a4ce46a3ab1028cf7cc4598b1d126c31bfc6dc93e1e84b80db2dee", - "e4d66d7e5901c7046eb1fdd456ff695bc12796165f46d19630043753b67bb3b1", - "d1cddd475101e1884045e8a9b9fc39478824dc7dbfa4bb95f53f1d105a36386a", - "ce7ba2a943aa32e09cca49374b5c160afe1ac5fe3a824aa553cf8700240d3490", - "8a8ec45b076f8c54ffce8131d0ef74f5eacd9b23703ff7d365d48e37f8751c43", - "0bded4ebd64f4191a0fa0047126c6f701fcb22435ce38700e37b7b1b35f0ab84", - "bf3460289b6600467a19b2c4446db82671e150bb3ce55682f3cea85cf5f82274", - "227fe9f59a50521b43276b14b7b51d7dd33c3c2366479807bd83ef0d95911f34", - "170ebdbe3dd4461b09efa849d8c72cc66732d219b30a804704cda1bebb7d13a8", - "7b69d4bcafdcaab7a6ae883a7ceb49658fa107930424672957762c205a7e7af4", - "4103f42c7a3e226fb77e1ccee561775ab9bd4564376b97236b8bb9e6e176c809", - "343c01d3d1a0b65f11f35cfb6974fed29c24eaabfcffa258357578d448353a7d", - "27ebfb45a06dfed0da0d10b16541cfcbb4c6af00ec156a23c01543b765b5ae1b", - "910bab55cf373b98aad52357031e540d2bdf93b14ecab72adb2e02a3620dcb65", - "91e6254e91ce7fe83167db28d9e05101d358e6ab5591601f26944aecc3aa0adf", - "c02c17968f2f2cbc7a163850a1da2b489e77455710433ea1b18ac27f757cf7f7", - "d3f7b670875bd6ab8e935d0c39ca59dca78cd6a08fc108eda2dc2346b10836c3", - "d7b7c3197ae7535762fff402cc30128a60e0646bff35b5f40a26ccef83bf724e", - "f50767db683ed78d246bf457f646b87a19720a19ef177c077393ab56ea226c09", - "eba66201459ceeae53f2d812104fcd57a1401aeb0323e96e096facddcfdc022f", - "669a131878fd0bf68c722bea5fc119845ffd3b0d9d018f163c56b5e3ef2ac3af", - "f4473903adfb3234397b739e0e3b9703c035c8affbe719c88391ab5d7bfa1b11", - "999a84499c1cef4045a4fd1521bf7b97bf1df434fbb17f8fbded254247557e6b", - "9cfad5f80365a6c99c1569d405b7c87938948796fdcb239b168af81867abd3df", - "a595c8f90f778d177de964cbe06028b50e06c574521661b4052efd2d16285fcb", - "98ceacec27710eb3824fe9a99f6a06bb89bbb58e8a8301d4f7bc48dba22f04df", - "a70754a7d0c648a4588aa11ca89b9f7d8ed8dd5e93812b5def17ea5d21751e6c", - "89b0c8c474784185733f97dcd27ba081dc6cb3778da3a98f89ff9ee52db28d20", - "e00219b9f352ff81cc5e5cada8576c4d31817f38a27aaf2590b1e40d69afae66", - "24363f2e3b2019a2b1dec6a30ebc1da6d07a146c51b03eb0110ada535613d3b7", - "a940df9f4e968abcc5e9bd2470e06bbe10d74c5d622c83a2d3b06dcc91bc5c4a", - "8ad4639843a19c769ae702915b2df291a1091c3bbf443568c8bf9ca148b50183", - "a2adf3dd1c156d8f8bb594795eb18f0e351b620894902e57e4771af055a0c6ad", - "645a3b348a159b3c28eea0f21901e7011a95782b46e499eb0e6008296d91ce8c", - "92a0776f1dccd184fcd3e927a76c34f950e977fd3414865fe95fa6b7cc5d0453", - "77b35db69df00518c39df3ca7676447ced2b27042915668b334607889a9ea11d", - "23ba6e58557a77682624925221d2d9b278492cc884335ea093fbc68e30586e1d", - "757b867699e8c4e36154da48afe34bd8190b1d5bd805193520c5e7da0ee294e6", - "62e6e78cf3efb92a744508ce61f67308f932e05fd5ed8764a5062b4e5f2a2bf6", - "80a87753b755ec637d1c16fcce010adb137a79c67110a97708015991a040b498", - "a70c36690297cdc9b5c6e796971a50ee847036b620519980837766ececf054ea", - "e9058ed8da28316c1b3984c75c6fb379867c8eb3be7cd41dcc2198cb862f8385", - "44abe26993a80190aabecd3f8e7615658530298d8847e6659aca396d7f784aa1", - "b9bd1b02ac45ca4d5736c0f8de12f19599a9d8791f5b78cf913aa50bd9b928f5", - "dfea86f9173869959356af4fa7fe19682ca64d70edf61ad09b65785c4bb57a51", - "cb91d6f6e9b4858300f07c451a1407de1ba80b60dcbca9d5fcb7c685f4a90f7e", - "9802216d4b73913e1960df40b5d1e2090d87d521dbeb64e1d019722ede747b9e", - "0ef4571f9c36beaf4c5df20e30d54e9a2df4086ad9c5943a320f684f51dee317", - "1814cd1780f6766d55538fb96572f74ead734d5628889d7f34b79a0b3ef793c2", - "845d99c6cacf5926f8d9371acf7a421ac12a53d68c5a49780e2c2c4e9e9a0e13", - "16d44ebf85080aac237f1930b3215eded18235ad48d426dcec2c3e8927b1486f", - "ed54c60f471fefe7ae9b4b79f242dce90f9642be3f5c1f0c3726cc463a64a3ed", - "aec6989bb4c7db6aea3a0f3cbc183d6d36eee36501b0fe547b4bfbbb8e1ca288", - "9f894c24e38a4c63c22b7b0379cf8179acc15aa888068a20dbddcec3085e39bf", - "2aa73d20e2957936c1bc3def3d451d70a45b0be752e8d2a883d77f60d45636f0", - "e2e3c53ee898a73a17df13bfcb2570569d4ca50f301c9355b0709bc077104740", - "0c3915843ce6982e5df81209c7c534302ab706d732e87af34b0d16827de4575a", - "e78a3e8443e9edf74f2bd43c8043bc83ffb0f3dfbe8e86cdb141202f2f8528e5", - "fbe7a87be8adb0873e84537ad209c9f400d4e4241408e723d6e6638130311421", - "6892c81092c46eead902c2b145c3d511e7d3be03fac42226865ff383e4422a12", - "0973a7191284f1e3e13c05f726bdfc86a9ec2dd5d3e5da6008ea02bd9492eb42", - "4b625fae49839eceb7743e27a9bc2b5eb0744cb42b4d09930b5452b21a06e8d3", - "f899704f986e56dbdf7f478d72ecefd70f09c78e8a0645139fed761da237efbc", - "35caa2a6affd83bab1914dc67938ee01cd2fc1a6bd84a6eca8cfd28cc363c1eb", - "f54f068ff00e37a367ba2e4d6ae6902f2e17ab8f43e80e084e5be3c6283ad3ad", - "528f7e5374535e47242298e6034a1dbe2fa351ca704bb507d94b31e869926089", - "e561114769c0b87e61bfd584a01b3c4abaa617e1e740c764b9aa36e2e7f3b30c", - "b64f8c9b06395b1442dc89b9bf0ef8755b42233df7ae9c2ad006aad57b95002a", - "4c472af8d7ba717e48a7dd37154b17c2cd050f0a72ab22ce1269597056a0aed7", - "b2907e5338d8be1f13d1ba3b1e7c06c98264803f5f97aac879ed1e0dc251b37a", - "d5aa5609fc7d8de8e96947d40c4497ea2b3f30e30ad3b21b1733936fbf07019f", - "4447807294474829252948923eb0f1a692d0c8b39e33b7600b3daa1e8f732caf", - "be4067e332cb49b6da58f83e007163fbd465206b592f041cd084e786fd62c73c", - "693f96ffe22870f5ab5aa626a5bd3cefb4d4af021d6236941d663678b772a01d", - "4fdb50b372d12af57f7d4d838f3d9013b91dd6d44b3352237a1472b10ae26405", - "e02fdd623402476c755ec194fd0f851381f28f4d01f5b1a50c26789c31ed9b73", - "9a0b27b4b912313e8ea3be5cc35556c23b617abbb5cf4c6b7ed40c2d6189fc5b", - "f09c36041e1cf933c5b1be135a0e626e75fb5ef0e01ae27aa48a8c824e9c5018", - "f24048afdb7da6e608283db29c4f5b738d2a9004ca7c2558e81e5a44b73ca274", - "04582e8402f03613cace027f6f1378548da2fcf84194fb732d3fe0748b821433", - "708de34852e7fe0198d6b39860c6ee7d43b0263ff9eb3dee1e310931068e223b", - "6ae65108d1a7e18a51c95470f5086d8ae84646dc3bfe2ac9c29cd58de895f1f9", - "7aec65f0109c2148930530213a9e691e8a4f5351706536de6d7b3660bd4dc8c8", - "21a4418cb806369ae2e9892cd4af1df1d91b62a318b669d12a5df1ce0bbe28dd", - "74bf64e6b1207f4555a89f57de67cfea904216b98083fe9f974ec002360fd178", - "ea880e0f9dd453e06d9c789111087efb419215c37df8df1107de18454805036d", - "4fb59b5e3f9b17b1b2031fbfd66dc8c0cc78650a77a91c30fb0d65224e0b14df", - "26d9cbf6d3b3ceda00c84a838523fc9f25d090bf130843ca060fc34f3fa06485", - "c4a18c387c3ea6e411212d96321e02481c4b8a316298e976922779894f4de603", - "2f613a6724ca93244a6c6a3b727a09b5962914d4f3806bb5eb3bbfc7afede2b9", - "b2154bb5f80f66a93b5d3d159404e79c75fb9b80419d4e46e005ae921f025517", - "b6a69f42066a869c612d2c0f9e120a5396b73eed95b11cae59837738c6421df7", - "8132286963fc1c8334a4db8242132ce16d2c618e34d896fef01ddfcab69f0f89", - "dcf0a5555b70f59fb319ad0e56b0064bf1970bb9c24ebe68f9050431ffea7db4", - "ac6b4d498748566a6d8fdfc9ebeb2fd74ae24382f255bc391af38e3345a8fa52", - "d6dfa542f6dbbd2bcf7839d8b087632cdc0689012635e6e520223d2cf416713f", - "15cb52a6b4a1dfe25607bb6b127602e3cc2bccb6898a8c56a8ff18ccb1d614ac", - "a19e733fc0c8497f5c3e2bef019b0b07560c81767e91ebf113b915dc112fa27f", - "7c3c1d387a5a6cd4792f7fde9c6d61a6ca3ba7e006f9d3b38f7e90d2c6d3cdaa", - "39fe77d4cc3c7578683dea34a38e17194e399b8ac49ef7ededbd4f9bc03170e7", - "8813e4d1f641047b37e22cf408cc54fc10d5b14d14b81d8974c4e8f294816ee2", - "8589ca010646daf45345546312dc4c20725acfa6193ce37e3194e0a77de16497", - "a6d1b89513af56ea28db433b50b38723cf8a6ec79e62bdc9bb9e01c3c2a43068", - "2089a1a6d20a480513620522923e970d248e4c35e3ce196d9cf819c2d47faac6", - "60c9d7274456dcbfc3b50e29d59c5afa3e039fd01d1339c15887571843fb13a6", - "02f30f191809b278c3fbf6b408b73d3b5b3d226e4d242b61b34fd424cf43c563", - "f9d6931abb2f5eb026b5c906875ae2c4229bb233b525dea2f3392659c42df4f9", - "992be4e19ce738b6bd05f55555a85456e3c7c0151436eba4089e026ba7ca0f91", - "272966f64c9e7f8df857c0dc27fb8f8961acf8e76647a8e0862cfbdad173c090", - "0a87a7d597072285579ac45c675913ee646af383a8832b19306b13a04a413b51", - "790972a7603652301358a2c7b9ef6367f7658d24511aa68c8cb9518337cc90c1", - "47fd6713f370258aeae2d28e87b4f8f1915eb8edbbbe9933030f240c5df1a291", - "90109b410aa4f9cf76dee781cf8ca862ff76dde5e70634346e5f3200e3d3fb3b", - "e5a2dccccc2d28a9da215d63094c4524bd2bb619e48275ce14515f2e0745d400", - "705e988681fe123bbb79e9888c695f856c187ddd1bb7b744041a753733cdc0e4", - "671b1d253f2897a58545f9f3b0d9627ee187a5aa25c5f4914d02b0ab492dfb6a", - "affe037e5f6e73e9a4625e799358bdc7ef9a3052803d780911ac4fc6cc27d526", - "10e20107df31482a3b6ae650e85f0560ce7a9696deea6a5787e78f45453651c1", - "9519b1a45d113c4ef93d23ad1e9866f24f6ac92c971d16975d13dcc8bb205e06", - "0f3dab812b010dea9855f1b3f3cad0f008823985e2964b5e07789450b7d7391e", - "7878d07c02850c213e4eceb46f81882e8be02f20c732660183baf24a32166e84", - "4de842977682c76d7a3e57e294c386f18a87b3b7a441b945b9143f1adba9a0e0", - "9a831dca5ce3923183609c559e216e92aebcda288da9efd27304a17fdd2918b1", - "3f8187f128439c2a29166a9d7dacc159041a3dadcecc4eacdb1196311d672fdf", - "7e96dfcff44f8fe036078a260718c9b5abf8ecb70f1228a6253c08bc458c2eba", - "d5cb5998165a7c962066b49b95d0fcbe52205f6143abf6714349e2cbc39a79ae", - "9a4f0bfb98c2d4d56ee4918a4f67f01f027a6b0fa69bd8a6cb287f0decc0c983", - "f2516cc706854765ec8de11aa13ee21b0be5f3849aa3d801c3eafe71d20e980b", - "2c11d931c0c6727810975580294d1386a623cb459175f9af823d0794bf7bdcf4", - "1fee0859c6688c32627930e58fdc1081ebb0ce5385899acef1797191898dded7", - "8c11cb065c2f54383e20fc6199fdfed57c2f90bde34246423b2fa79609161951", - "fa3b6b3aae83c7a4ec4faeaf8580c60296a6df375e5c6f11d0486af17ebc00b7", - "740fefefe7c9e4ad9fa5cdba7dd4fd07ed33b2a89e4efbe70058bfcb2b4a7e4f", - "4db6e9d1e87b5b6e1e32070e23b469f854891582e9b98ffac4454a929e7b7605", - "5aca189ac5b50d9794dc89705f26a3a70ced43accf098d5cfc199a6585811845", - "95588ba041c1859085e98b9fa54e48e086df0bf2cfd273340e1c9784b16f4edd", - "058c4af7045e93d35e20d243092ba10bad640a20358d4256d4900fdc7f6ddb0a", - "96450603158ed3f758877b52d4bde2c20182fb7d18fb1787c4616191d5001d91", - "af0ad091547c8480236d3cea6d61944d614fb908d3e7f1448526ed823b822280", - "5a15a305780694dc32e60179e50db3be099a91804cfea5a7f18581919e15acde", - "f03d6a1aafda2788b991083dfc703b10dfb8fbc3eddf10e82eb9c9148b101577", - "42478496ef3984d8cdd7d68a763e9cdddb359c1f393e99d619eea6f0d850e8fb", - "804ffe68512ef4c29f6ef17720e8e7920b7a9f37fe3dec1215dbdcc9d76a8f55", - "f6eeb2411189605195ebe66578e26233ae7b273e1f5d7a899500e253d1025160", - "b2f1ad39249f456abc267b3ba6b7f19fc7494e0ee0ef5e1c08dc639250dfaa3f", - "8fcc2e4f9056e945c4aff600860409962a363ec4588e429e58905e0cdda144d1", - "a57add1d001cdc2f45b9e82187886fe284a7c0098093d0374d370ee780c47e15", - "af3d96283537c9ac448079b4b319a95f215c558ad3f0a68c2cdd179d4ffb0c42", - "5dfe3861fba5ea407a62ed6a2ad42eed266b4d71440d1422bb10b9c6e2608dee", - "a970ce09dc7aabd20b74e77e22704275db9c4d9d648a58b3bce1a2cee04ccd9a", - "ea3a298b5923396362916f4e2752bb589b8cb80d052acd2772435d5ea2a70a2e", - "b9fe99c32de9c746c42d8af585d17d7e970ddc6bf89e65418ac34ae75c3f4c78", - "7874133a034e75b20f935a80b2479e8af128f8513df8235141e8c9d6ac77cc64", - "b2edc5cfb70a7e73686ee795f49da89079bc3449aef3dbcb6365d03a434a77a8", - "38f868da47ed68ae550c4a9065f922528ff61c2124e6c23ee5fec36f0c38453c", - "22a8aeb097ce939c33986db0092467406e6d2b915c9bdbf635891bd76c369ebd", - "77a1b76789ad03c62cac489add1e3eef16885d794715992c67eb34da907aa011", - "2ecdc30569d3579e349da57506f0aaed1e3c082648b6e7ff148cde980b0aabf0", - "2985959af333914d3c16ad4234e007535a83b5f76e62ebfe8716a7c0f302c2f5", - "686854438e77cb217f133d4ea47076f7fa654966702b21838bdccafd83fe6397", - "728ebb7a6def12cd0917c7240fdda9b53bc1a430a8019d40be1dd8b9effdd5cc", - "e4efb791b8827a89f0327581053f95d40b33b276c45adf1a649a76984c461038", - "9c6ddfd9931a2f7f2ab7672387ba6ed5357690248e6c4a9b6d56e8e6e67b6fde", - "896a1c4194e847119ab4c4594e20d810eaaa33787e22939b90ef10a9fea7c199", - "120d0c09d44643a2ca0e646f41ece9f030a111eb4602fceea163308fbd137a83", - "ca2e7741a6aef5899b6209890a8bd7177b6b04db0d374dbdcb9edd3601e92129", - "daa8911f8c0d627206ac75c3464b6d6fbd94d632e5a0f5adae9e88046ff91b7b", - "d7eb8b61eabe4c3d661b145324c974c5233ecbf3860a55da45a7f313d7d59135", - "68c5268e17ef6ea4157a9d8b17c1a1b7e618df83a6e506f7294977502dfb6a15", - "4b28176e8e8cf1a8c9a75476abc4520d3073399bd7c1d88fdaef1d78e21ff9bb", - "80317ff8e771536ba54d3b7067c306877af440913f1a248fe06d9c941260825b", - "6d4591378a64c00ac1d018805a92c771f5077a6c92289478a17748c313d02d9b", - "0d945496ddbbdcb054b314842484ae3d69589a2765b96d288a0b30831950794d", - "59267541b7d087de65e604a9a025c60b0f7803ace62c75c9d36923014af1b6a7", - "77c53e2e2c6433a7440e75b6083bdff3d60795afd35741a0d11654877a50616d", - "73e44245b4e5d25e48df3eaea62c9281d453920601c61c6e346b464f5f11f388", - "e58eea31dc171792e32df9f9952211a39af8982ef07b6c2fd463a6d1b2592761", - "c80ac910f8570e120ac8e700bbbe7d06fdc03b966244464bcd670c1a7567b5a0", - "f13cfc6aac880c722ad18cc9283c7170568257b2bf49a55846f496ba96f1da5d", - "f05b5c0ea3a13c3cdcf7843329c4f6c81c298d1e6089a5531727065662cc8b9b", - "e1b95b5ede352dbf1041f18f7726968b56617c89f5677fea2c9233e6a9a3993b", - "893309953fca7ee5761f5efbad25abf48940e61fd2e5149256e6d37a2eb4131d", - "4a2edda3a808f964cfd16cb1471ba38df68ed021a8979b0e980cfda65b4812ea", - "017dd96be9a362d28f6dbc8f43a37d030e79eb06e37ee36a1954092701a8ea68", - "b5f779d51c01dc200f406bb6b4af5db732efe5953237aed90905d97067e61829", - "e84d8ff9d9a21ed9aab5c0d1119a2288a5412c009007f11c268e7b4036a08f01", - "50e467899e88ccb57c9b16ab22385aa74e0a59c2a5a01db6f57768d2e5783c0d", - "702a00f57fe89c6ed28b41661662981f46b01f9ba570c0f446645012aff1ffc6", - "322061c9f26ccf14853dc62cab838474cb53e3fb724396a52cc1cb5353472699", - "dde3fb749cbe90d59fd822cdacf5f18077e80e38025f254dced103487f895852", - "d58dfc37034773c8cb46940823f58b3e7f56231d04fab17edb3228f62cdeda1a", - "5e80da65535163db1a10d126fa7feeb5fdcbb2c3c003f4401887c46a7b2aaddd", - "39ccfa1b45716d5052fba0e2ef7070295883b1c7eb98bb549d9ca72088d71acc", - "4554492d92639d7a80586c479fe4dde5c87675c2a9d855042b6f4ea47ee9b47f", - "eb7def46194f0d84f175e87083ded7ff68b34a13b4ff62723dc94c634e0033d0", - "0129625fa1861dd164178da684575fb7f769a08d6e36bce02d6906cc910513a2", - "b0ac17023b8a2cc791bf769ae348c61189b436089c72ae85b697575ca2cac0d9", - "33fa74ce87926b1e7c255c12568374127da145681379f29e453e8119c0ad6fa6", - "d4f270dd5d32aece78cc50c3727c904ed92726452b2ad4a7fdc5271d62df6510", - "314569d565674d2107209e75b5120d8ec2b31e2a3ece9d544a0286799e0dd38b", - "a4c15962844f5b9351a42abd126787a385e74cf9a1d6dbf8afba52f680b75e54", - "adf5b1d53cc9804edcd1e91b2775fe691e3e0b3c2a046c435c429565a678edb1", - "242e6dc4f0dc8f7be1a5dea6f782cb49803f5014884451513dd2da6b20b1919a", - "2ac84d2aba897ff6c3e8b4145933e1d01c82bf5a9caec1c16f7e5514425b95c4", - "f11de7d9541747651af3a514a433c4470025b0deaab6a6ed570ea79013aa46c8", - "45fc6b5e4ed5b6b4b8454d9453564c7bfef6421fca4d800978e1f164874bdeaa", - "a83a8d8dbf6d22bfa921b2c221814ed5835f774983238ced836fb8c278cb758b", - "5283bb50fb048500041af2e3010a35395057c6f8f5b8b55c47b3075aebead4a7", - "bf140a9fa9e7f9418e929412c95ecba8d2361cb7a175a06bb39a92507c576e81", - "73976e76f65bf7dca0660fc0c9f4fb77e077f75511756a7dd356d37ac7da1631", - "b31600d92b08d55130efa3f0dd895d1fcc5a50989b3bd4fc93a1a2c28eca7900", - "1b1ba55072d490e402f214c0b502460c23fc39e11c9fb91f6d9e2477074ad0d3", - "26dfdbc4a3b18da12a2e9805c0a9889fcfc34ec1d2f4da2315cbb58d4beffd85", - "e11725df90931847e9c3aeeff122c4ef34556d8348ee3ac0cc896b32e6b68cb3", - "f168634cc2e625234f4d6dfe7962693b6e48b4491921fb641a6b571c58723139", - "6f715baea304d889c1aeb19857a7a214ba4530f7b84c35af518b65018d14dfda", - "b25c2416b1438194b8434f4d6857c2eee905ff9618a2412ed73eb1d091b84928", - "fb0d57dc3f3f813ef31b248c5773c0033ee417326c0e9f758a1a33ec67789ccc", - "075db58b5d81e64ae3b2336861e97d714dd9e3955ff014ae88dbc33da5e34065", - "269f33021ba8323e1632dd805426781a27664b415873e3441855ab6aac381d0b", - "fae3973c63736d7c9fd9d615aa69e5b3f5531af155fb02a51091613bb6f62859", - "b4736ee9672c17333705f4fe186a7ff1b24bc7cb20bc5f83cc70bb7a276a2947", - "e8a8e034641d3ad9d8b82a776661b4ad65b77f9ca2268a76da298493498bbea1", - "d7195bb1aafa9113307972a8188822aca188e8afa12c3f43b5f1ad38b033a0ba", - "96a3e7c14c3d3ade002e335182ebf241f0b8192f99bc7c50cd279a2eaa58a960", - "c10d5140d64811acb5350b6fdfcaa0e91b898413323d9efba3d50e0047cc3ee3", - "f121b244aba54eb696d32e9b824af377804af7b91500adcefaf940c57101f1ea", - "26f91a37703f4793ad174ed794369a053fb44e819dd1b5a035dc85a2ba274e13", - "a62bd63d0d2ce4a08621e2e226bae51d5c1a6c34fc045e217123200fc19944db", - "371dd43ef7424ab6842eebb83fd2493e584882a022f75c8b4ac2f916d571bf9c", - "513a08e0473c2dc8b34a3a3ced0ee2914c477354e12ca90c84c54d0bd63af694", - "96794bc0858144b83dfc21d56dfc7a51f1638f361fc90c34b7b8fe9cd752afe9", - "e19b2b3f5b366701b76d426b483699ba085722ee3b01438d8d6aa53e7d8b3c0a", - "d49edcc21a42d90a406537c6195cc59837a58f3f66104cc56650f2fa225aef9d", - "6a9d80ac01df29eafee1d1c13236161e2c02cb8f54bbf416baf1f61ae73a45e7", - "69c21a2c4cac8260e9a6cd909916fdb3157d61b8e1f32db292c8a7f6a677b6a8", - "bbb7543f35037a54201ff8247cc34e9102e958be769aea278d27723bb75b9af0", - "ac29240944d4e58c55c919ca31a47a074ef7012b5ab3c9d087543e3ece1eaf19", - "c54acc27b981815f8c28359d9fc8b13a72cb93f4e7cea8b01c60c4334c9543d6", - "aec63ba17d3e0ec4d3027e54d7ad1b7f981eb519dd9c0d7b18494d3dd2947493", - "c892f0accfbe2a8506d3e482f0373f9069e3566e80b67b429d1ae73b64bb6ae4", - "841fba3ef1385725b14a4008a407026cc506e52018f6394701098945671d1dfa", - "a02cf483ac7c11386ff111566564ce71cb9587dc62afc0670c65676e73df349d", - "72796a0751052bd2b93b564f7974fea9ab50a3bfe729ef384454ccbaca69f893", - "5552fb5160a45ffb151aedb65e9b2cda02fecd9944852031e9a19e8ee236d4a6", - "40019d911bcdc477d84f09e5356ed4522e5d915d77b7d226cde19072e0ec34bf", - "602b39f67716d1d2cdb3487692386d9cf6482731be31079452af5764483b6397", - "1c79d00baeb457005292b5a03a2c0260929fc410a8bee22120f4ff7f52b8964b", - "b2a3d7082e56e501b2ae4fbb0a6b3ff073352212e4df213f2bf577d2dd7c8184", - "f5159b982b96ca4e79a658421dd93f115482cd9f58b2e2485453a53a0e90eed5", - "641d9abf0c2f388dd2527cb597563cd532589acc9f3955a970fd94aa2b077b42", - "5c79d05ef6cbb8bf138e4f998e9edd26441aea068b570992fd14b45ddf760858", - "a3edfd2beb8f9ef0534a45ee7255fd8f3f522ee2e31e12dd947fefa03cad04b1", - "98c9c21b90e2728800068c91a7f1d0b52c294ac3b87c382b33ffb28ec1c9d23f", - "f6078022ea921dcf156ec9237f7abc6372cf262684f2a280923540c7b11102a2", - "c42156a90300b7d286244f2e0904dbb69a34f3c042a8c5aa42b951b2b49d3513", - "2ee685b5c7725b4b6ae6366c44c9b1c46175b7791baa63f25cd831735976b10f", - "46a65417b2bc04a88c03af52d2bfd33ff19d56234ce4c7d7b42401608a3aecdd", - "c5c30252de14b1f35714ab60fd3024ae5e259c3e770068b56e7ae7fce83519ab", - "f163c1ef03fb69f33a0d90ed11efa877afee103c80aa1b5c5301c818c3fbb0b9", - "27475745c06b78fd244e66dc7a560d09373ceb17b45c51dc1e3aaceb826d3a19", - "f073f3865ea1ded5e0984c802f2553eb8d1b2a171dfd0e48d8b00a018b043b5a", - "992b11c47dde9869c32cbc23e42f7d16214313cc093bf6c326e51563ee609438", - "96aa721c2bfdafc964a2f61df4b6322a6e2ed5c08ca4816f87ee6212f4a8fe41", - "87e15ab1ce4a62cbd76e1a238401e7b7804f067a87c885987599370fe33042d5", - "0c5341dc48484706bbb48a474e75553963bf6fc42267d87f306d96eb9d5c0711", - "9d44deb8d61e475144860d418152a60fafafa32b72eaeffd0a95c25b37f92d9d", - "5d328898e57c0bae815f28199d41a0132f8f1c68f10aa67dde9a8ca29dd10b8c", - "0432ac9e4ef4d80d6a9e5a32d7c908331f17cd681ada4471dcf52bbd784ea152", - "569d1940485d19ed409218aa4524c901ac1be5c5ed1264205054f068b85340ec", - "e5312f535f6d02f00c3e57f9f170e6518445c6f24c06006fb090b11404f7580e", - "48ff97ae35051d967d75f26e3e741c0653ba8ffca87390cbf7717235477862f1", - "55bb116125ccc224b1eea1f3af50cfed2e5169ae7eaecb904228cbbe9284ac11", - "e21d724c9b90a2cd1ea82c7f0749230d4940f44b2e2269bb3b9bdef55023b764", - "bd04dcce31c4352c463515ba5c081e246a3c5238dd459fdac927c747f63228fa", - "ab1df45dc3c250a12ca9c0f61d1b1d5a506050cd4a59332eb0142d3966b81d11", - "ca11b5f870c9499d7c775784e914f8f012c4ecbd9fc7b7412057aa5ae5818f40", - "4838fffc218995669af47f874f161ec2a1c2be454dd06220ad7e464d5fe0baea", - "4931526679443f209ed337b220a1982aeb6241f7296ada066bfa73cc29394a77", - "6797b3da23bc57f1a9b09f0022972cb0592c5e48e9d297e1fe6771b1e6c12611", - "6672b94143892ada3b64e71cc418795c11b2ca8d372f23885bded50fe8bb81c4", - "2d5900cad72f15ac4d30e61f386a5c88269bb4322f07d7d07af2ec4eeeecdbe7", - "151365194c415c68d67a669ba4a09303c753224968743518fcb0b507b2bc1209", - "e4a0f09e163521c101d6243a57285754201f0fbe93812b6a8bcaebf83f1593e8", - "e9be5cba758a095abcd5984e8bc8c8ff96f297d18846b83da61ef96a19150a0a", - "4d2378ec8200af2484909e346fa9a1ee8cf62276840e6357daf59b298d27c35f", - "c799a0195e648e1bcfe17f376bf682158c4a9d0b5b92138b9c7e88a712d90eb9", - "f87a59625cc42821a4624f6ddacb1184b5e52f0ef48ba7704366f002e1ee5f7b", - "87df68f5e753844c51f36c59fc478aa02a3d285472dea259541ffd66db495141", - "1a6daebdea4b0d7a43ac7af63c3c0b80175c12d5a4f44eb3e9ef25bcdc0374f5", - "0421e39b9cc1546f76ad1e1528a89dd4d8a73067b8d2e5117223c81a4b60bf5e", - "34ec4b5952235253a925306a508d53eb1e5180005eae832534c8f0e96a0191cc", - "a16344ff1ff77a0d07b96feb2f0caf4788700969cff34a468d62745eb550b4d7", - "7bbf94818a65d3a5d6b09266461a7c47e2e0af6e8061a2225e572a02dd9dfffb", - "9fea873189971cdd03a2d7273d7040a0e9435190543323a022da848e37f77efd", - "e9b75406e383c807683c27f3c966bd643a90ae108757ee8c37b0809d4cbcdad6", - "08fc4884ede8e5eb2f3320ce1f396634aaeebd8286d5f233a5614a3896fb793b", - "efdada635424d1d4a20c32bc4b6d5f9313bdb74091a4a5a8e57203b8f866a426", - "deecd70a1fe4ab090629a2207abec4ba34bbd2a34bdc904325dc076a741d2b08", - "c3a02e7e98679f83d8967128d7e60057ec007bb5bd8b4637fa76527592dd1fb3", - "9e2976b469c07357e0ed8aff096fa47ad49bb70912325bbe22bf6144fb7c5443", - "dd8fe7a76aec7bd31deaec59f3d96325782a1a1160120ed87c3b5e639cbec3b5", - "d07e51432d574c951d572f9e1c24d86827cb81e8dbd2b56a84600ddb591d2dbb", - "196445ff48d30d8cc1f284da7aecb5622dd1fe3d7fbbc494c56211cb226d7cd6", - "becdd284f3b39f5ed4c91ede774fdbfc1e6f2972dfcc05f6e878d9310492194f", - "e9df16bcdb52a620adc5f4d95d0990283f67b8b55682112b6e7c12796eeae62c", - "5c7b1114803ecb6a17a3c8b627046c898921a21a396372627b6aae1680232d66", - "166d7150ec8bdd7ea8645861fa5ea037240c3d83e2a73b422bc72db7bf52b7d1", - "3bce46a5c2086df4d87dbc9eff27527fa07624ad7da5335d2d9f96da5bb6cbbf", - "e5faef32dfdd220aa5446c663b3275feb8f8cbf8540d0bcae80a0e111c3c9fdb", - "acf18eb2d7d45e12d85af64e324b39edd2968767f3cd5fc07be7362ecf074c96", - "51e559f270d258f71fc116edbaaacf7a712b4251d99bd5694dc27b043d5ac26d", - "9c665a153d66f53a929e1b9bd123d0a12006d5f336667ccf901690f03e542333", - "6ba63701466cec1889a74c6f5636ee4a6949e6d8d961a37348ff1617dfc55b7f", - "054ecdc32b5e9213011bed94bda07d74ee31ad673efe27c71a1e4f672406f4a8", - "0068ee37aa4bb5b29136d4ad97347b29f99528b01080fa3aec825a11f2360c73", - "fa74337f7e26bc319c78731f2ff85ecbb1e4fb57029027ca9c14aacffc83ef00", - "2937dd25c1373f15db1b6e64b7071d7ae140fdaca43bad564d833be216ac9312", - "8017fde012a704f101b87557f22e8d55e49d3cc0ab5cbd6d10f5a6568c8e7fd8", - "881cfd6d4cb993c2eb9fd1813a8c0bf1c9c2fa83fdbb4bde3e028e723e19112b", - "a01d5a92f048cb8f8293ca5aac3f6a38688a64456c965ff9818e9ee425511a04", - "17d366988126754d4ec6f894c5715fd80245cd43880a5ed20456a4d3e992a019", - "f55516adb0e65fe1cb8d9ea354c6b30a0bea11e67d076774d9b1e6e9f1b28ab0", - "c905ff4f3bc2d7dcba64a121d634a3ee28e9ebdf59cc67080831af8d2fa27b30", - "628cec7fa5df7c265cf0f4a4a59daebb411caed22dac019f7dd6e00e03d713d0", - "d6c3e50a6b603f65f91566fe1c4f5e522ede5a525b2b3eb964cae360d5e07665", - "ce257c4a2ca78ca51a6abf3ace503763b98606791de3381cdd5c6e9ad253928e", - "3fd24539c334e8103618f3e49fd74f795121bdca6697b01d5e06bdae5636a1c7", - "fc4b2c0d52e372a31c1dd98d59df8256147069cf0de0766dc951391fd85d4483", - "f11ac310636f1eba02055ca2310c1a1379d4c6aed1b1e4810a0e10f3b2f4551c", - "85f8513558af38d33c788039e9165c6e50b37a45f85d9c2c23ed16e51f0b422b", - "6e59aad5b2941c90d1105b3397f345aff81741082b1eecc0b97f104fadb3b2e9", - "60b5ababaaa0d1afc62a490af13667515bc452c989961e2e4d4833e2ee9e9b46", - "13b6d577988a1f36a491ec6d66aba59ee7bad1c1d986d1c02bfb1ee593156ed6", - "f1e01ca20ad838505f7c5c030c9d30a19551e91e061f278dce6ca4c6cc671474", - "73e164fa23cca6501fc4ce81fc7a137c671cf7c0d108f0a6e1260eed109a6fd8", - "45d48e670649af094735fa05870976f6befe84cb44d5eca772affd40fc8c30c0", - "fe9f25a16a2f1da62570f38ab05d93c6e4594f4486800494cf984f10aca44405", - "c6e2115a1cc1a33de34e6cef45fd3361137ab83a9c106407a1d7351caa960567", - "7928aa5e73af06d57d7244d271ed1643a785022a3c684bea9b420fc87e2a9324", - "cd59c0c9d6a5775d8618bb5f5ea66bdf36cae8a661bcaafdd6565d923b093a73", - "d601973ce9d72a7e0f6ca8bc8c7769112bd160049605683b7861c1495100747d", - "5e1f5b300b75a5c577342232c433995d529b152fae38530127f0fa5913dd55a9", - "a75ca88d4abd40e6a4bd6c2c1484ed1460cd38f693b5c79977c9b7b145c99eb9", - "e8e31ae65faba7d583d9d8280fbe3645841f50eddf27f11d5eab9d5f4251d4ec", - "a61eefc85349894f07f0cdb819c872c4f48ac969bc80aee83b45c1b5d3854c10", - "8b05880a8712723d5b038d38fc7f9e8f7ee7d6538df28a0a5b1676a588fc253e", - "8a01e4e4a88f046e9022c5d47644b531c244cd34c76291f698ec36058d7c9f7e", - "8ba1d026b6d3b98061e9d64d01afbdebbba34fad076752e8626f23fab02ba76b", - "a18449b7cd5fc1b32fe6a9692d8fe5a5f64613d3aa1520971348493ff2c5cef6", - "b38ef0b5576117a700395ea206e64b48ec8a625db2281b9f0e3320365f47b5f7", - "035f9fcf50b8164a13e2b5c0e24aebdd33db61a1dff58cd3286e169e748c738f", - "6464a22296ddbc19432e19584f8765be60b08312e55f088d4aa3665840c2e807", - "eac6d212c7641354b00df4e9719b07999d108c3019d5e30b03afbfe76db211ed", - "9fb14f076f44f6b837809e6625f422b95140fcfba12ccf2d90535580aacee999", - "adf84c183be8a7cad58e6650ffac3afb6010db7fc616a54c22a9270229eaa7ce", - "317048f3e7c0498f68824637ab688b6e1fd76c4de321f427cc3745695eaa2e18", - "d00bd76827c63ab23be92755e8c367aa48965a0ff7516c5cc703158384e3a785", - "b21584c803dbd3c772e265446e2d84a2fac78a42b7f5486239322be1cf08822a", - "9694e8b883b59cd6b5f55c49d30e22e4a98a91b89516037e6db15840b87f84bf", - "770ffe6b5d9163cf233920260276b1688afbccce634fa1d5ef1c05afcedd82c7", - "f774cbde8998853860948d7d6be39eb1ea9ef1041d15e709f8186b1b04b24331", - "a3bfa69b71d606b7ee155f1864fa14d0d4012fb37d8795ef26119679acbd4c0a", - "e4b3189de086c0ccfcee5fe0e06e528b53efd7c205a49878e3e384b528bc0b46", - "df43840bf9e8efd10782b7bd50e7ace5a537c191724d1e8f1f16f1a565cc6df0", - "832c2307296854ea2ce1f3a8060bb18b17acb312b88ddb897045a74459ccefc2", - "3d3b965a23a3369ebaedbc195a0a61cd3e8c59908d7ecac64ab99e243cbbdc8b", - "8a1b1e0a1f39582a62d3bae7cfa963616b2443bbd0b14e136cacdd4f61295c44", - "2bbae879fe25c834fa1db689048cae9a2e4d1515a2bb899fcae0703b862fd910", - "d95083bffcabf6fea5c8080ef7698bb39a7b59d821ed44d03db808c0a85ed95d", - "51cc1bea3d57f6e795a4deca2dc460166c0fac5a7f96ee3498c5a899eb34d442", - "9df829005599d3b23d7d5e84c13f29f01bfba3aed6b55fce90b08f04bb23da26", - "d2e384fce199ff739a26d67331daa083c4f82e735ac0745e1f6f36321794da9e", - "88c4216dc789667f7890d41368e3d29c94039abfe128d4dd5f9bae2774dfffe1", - "0aa6e638283d8ac865d305e872c45e7c2c594a58ebac0e96fb80193ce1e4b449", - "fc5069fb119552df07e9a58698910511c25e5bde924ea76ce7294d616a5708fa", - "842d11c349ebc9b45e3ea1c32ecc8c9349cab4e7296f9502dd897c03f569f574", - "7fdb103b5f01aff5e03b2ee6074cddff50c06f0a1e0b03d1ec797a63377c406b", - "fdc0f80cdc696103d384e92db6ba5103266ebbee07a221ac2441a88f1dece709", - "77c2baa212fbf54eae4f958a6068b517a98e95766aee8e056f8b2f8e3d329985", - "38e07214c44175377a392ff356b38db6190686019bfbee3b3b30b3dbb283151e", - "dcbbe5cfb724ae859ad6bdc22930a07c77b8f2efd7214e35d8b2f8cca190d3db", - "44e2a4eee31091e2669b5b67ac9aea19ecb4c42363301f43f1c98b1bdd145170", - "efb453a915042f46718fba4df44c5c85c75e6dc5772763e55ce5f0abd999d0b6", - "e0141d16e2cdd6c2fce4db5b8325ded0d2903a45073d01ef33f780e94de19935", - "f7be893ac4fa117abbd6c133bfc8210c7d72df4ca591a660c61df2aae79446d4", - "6eda8bf2c7e7ad24b116c1a7323b6378705535e8f172e238e574b54900d703fe", - "68a69afee823bcffca273db1efacdbdd5cf66ca5aa85455d41f39c6123ec2691", - "6ce33328500e90cfb2d9045763d6e035f39042fb0b3f7164531e656c31b1367c", - "353fa6b14cdd16fb5e69fba1e8d00d07a881566e67cee8878b975984d8eecd76", - "0ca345aed6ae69e8ee1120c81a6db1d2a527cefce9a5dd5782d40e9ff2303408", - "83d432364ebc07b6f9191ca0a5d39fdfe11f3f1af143ea4d838df7c970af09cc", - "4d8babfeaf198e693785bd17be7270912de3decd3a4c59b078df603c617b8af5", - "cdb0b15dd03484710e7f1fcab3f70e406d4d9ce73b7482e033a10b2a6d05a4b0", - "3f7ee30ae157e1d3b61f023b8d5b66593eee0c0a8fcb357702ef1906a54578e1", - "1e919b496a3182e39ee0a48693805728902376a9c213fd1a24e521bf93d7249f", - "50a11868cf48604a8ce51729edaf0086ad2cb953aa796123c1f0a777d12d77b4", - "ea429da099e49869e2a4fa2697fe065f2b56476b5bbabff3d9c8a4168455b69e", - "9e3870fc10215282afe8585ecbc80e32aaa460d4121e5ed8ec9e11af9f8d6523", - "b2b1047c788cad531e6f93f86e3bfe7d41f9078ac6fbe5b481c7d39361cd8a7a", - "7c4f20a7461b55ddef529093873310ec7a14922039e1229bd707fbc3db2f6421", - "cedc06cf80a6b7216ef95461201febd6396e0bd047f42db632e3634405afa4ad", - "296afa35c6e1a62c6eb518deefe6119210a115db69fc4d5cfddc449b8dfa8852", - "9cd7229fb0524ec01f75d34985514de12a771005a125cb0f4e7ee0754e9f69cd", - "8c3743d33b99301c569a5ac705effa08254aedb5c7244d6e772b19da15261624", - "56ac22a728c84a743f7eb0f5182ea2298d75f96c6dcb8a0f0c656b4426a53430", - "4ccec272822797d6820b7c99cbf104a26808c6932738b32a8717103c00d4a860", - "342f66bf409cfb065b2942bc5b0245ef4527d8413cb91a79b110df2a22027c67", - "5da0cf62394fabdb9edd3946ef6f852a60680a64573998ec0afb66b0749c8865", - "50900131860d1ed41cb24a5bf4e8d7a22d9b62089d702394ee5411845e4b6a79", - "9082aa140b670888df5c6795ac277e9f07977d30350d4b2670f7985ad5158ca1", - "dec6cd39b6d241fb444b59f58291d537959b9d4dece761b1ece466a19a267d2c", - "87391d313d914f517d0cfb293b0ce113b145af0feda54bf45c086d8c538dc0fc", - "64c3cf940051f607bab9593f2b8fd952fb266feb63a074719f9e8350da22af0d", - "ea158931a0803830382afd2f41a9d6be41bde863e35d5338edf589509feb3bfa", - "b376b0c4b256130a4d09b5859b0ba27abf8545c18f6efb9bba7b305e50581aae", - "04813dc0032069fedc41625e909edf406d27bf6b3c275b3e002cb5952d4ef61f", - "ae7b90edb59a8d5c1d7e4a95601cf2dd4b74fda5f2da9f1f6525574aefc97c27", - "af8a4841442b9cbbde8353649f5f00958ba9ec2591adbef3aebead366cd68f33", - "c66de560dfa4e48c0cb0c8dd2a7e9137df1d5de45af4f7d1d651a33164992a1a", - "05c5c542fb89d867c98e0c9a18575a45d2462bd8aac44ed2c0596e6585e8b02b", - "fa3ff8c3f4d7372f638b2bd3b409d3bc4596b3d6ff3254662761d03c64e9c18a", - "1c541d85500cafccde676056f7f3421c9378d148dc6bd9b685e5da2c428754a7", - "56221c3f471229cd2e29485a8a58c71f55f4aebc473354377e4dcfbf3f3db279", - "ec4b24614822d98388b69284106e1e34d4ca1669b018fc7cd87a4fa729acd0fc", - "bea9f4b5c0af052a63bd28f08dfd466628b21ef8d258a9ec9fc7469591a098cd", - "3b0bcae42c6c88b2366abc391f176da5adebeb7985119d23da61803a56e8c369", - "c3949b1b82bb182d12560c74c47384a1ca077a14e3bf28ed456b60cac3632ad9", - "f75b63cb7c6c24684d315fe1d05ae10e9284820c4cade413ca38db7f1695c4cd", - "18874f80729761db815a1919d0824c1b1069de0ebf1577c6f3af1845b8d150d2", - "65b6bad220bd3dcc59f525b000a2cff2583c306302a5fc0d36c13a760c1e5091", - "403934ed317618c8e89abb11235888ff899aa78386b486179d660b6130b434cb", - "9b75b90ca49292b674e722a57eb3de1873fea9b1b0e9ed96ff389eab93844639", - "904e3ebc93d9214549e1bf9ca5566287475f5bfc295a1a4a2f6d3620f803bd2c", - "fd8c50b631ab2b6577ccc35c511d5a42de76b0c675a9aba617de4be3a81e7236", - "c73c037a567bc5b04cad0575be75b40d7f6db4275770fe1db14503cfa52f610f", - "1c60df4f3d7ceca6c530d2b1362e41fcfee84e685b790386e40631de58f1d5d0", - "c804c2963418260baaf2c4385593a08a4c8cc4005758a31a507eab5cf50dcb1b", - "2de8078577bbc04001344c57fec920f7b819a0bc45d991143623155cc1209d8a", - "a9b14aec4a2922a17f8246a563122d5d3455758d07b870b6ec65586f287f9b1e", - "8c978b3c24db48c65840c3502074e7e9f4db497c9f61afc1ad6486f68a9bad22", - "434864a7b9f450463b09245b1b35101bbf1d85280b87876cd5a94dd83df22c1a", - "bdd50be8d8a853f4ca51d4c288a3568018549a704fdcae8f7bc5c4d94f76b1fc", - "aca4af88a1a534cb3fe9b6645f9a99f49096c8e622cc6d88d84d198e57ad1b81", - "e3fbf616e24f6a1fee5a31814d2e280d6a9548fc4648b63997295dc6f6f55202", - "3c13967946bc6b70f763a438cebb8c2c06d777ba65778f3c56017e32779be4b4", - "f6493cdbbcf322f617ce62371e4da4fa65722180728e60a3f92ac5f6a1b574a0", - "25bac03d94b533ed7282f23db3c5e09d8325931c58484bc6b712e71db4bcb886", - "fbc644d8661940b2d2f60f6fe6427a8cb8224cea41f3046a9267b48319cc2913", - "8cf0ab387c2f5823fb4302a9d0b58a4abad32fc7f2c6c269d0290b816ae6172f", - "b214a29a48cfc9fa5b0e0a9b0fdea457cfa96f7e62ced202a8162143facf43b5", - "a8b833bae40391d409df16d9bd0aaa12a0577203923ed9bc2f15d7abd1d92af4", - "e05402d3a4b36333682d79b26a5822205cbc94edca766611d9f2a5c3c503f6dd", - "7dc11ce65cddfdccb5725d96eebb42add8c8da6a7e2bd4a298aa1cfab119959c", - "026851aeb5b37f481a6445c757f34cab04dc2651c5bd491adc9cd9195c4dd779", - "33170b55fc84abb0f1d30a4c75f8c3fc171c64e31456b629db5494820bc3e860", - "98682bafd88322fd4b38a7a2ae7be40a2ced8a45c434abaababda6c1adf09bcc", - "e1f6834cb9ca744aa463096502ec466345791a54e520f65304a0034cc0c99e1f", - "2dacdf13cf830a41773cfc9d4bec8587813aa922b48e413f36308b16f08ecbf7", - "bfe81207184cf048ca926145bffc9cda2b9fe6f713cecf67ecf83727f933898f", - "6d5871836bb7429e5c09d7c1ae3b44e445ca67b8e610050cd6bdb8ea88f8b7a9", - "c10c6326842441eaf87381221d12f6cb38b5d4814ed2ca4252dd81afd83ddbd5", - "690a946e3f06e78cdb671f0497c27f5a6c0b1dfee683f7177146efff9b4affef", - "12d2b3786335dacf5a955c63742bf78182d036c23346c4e248426d9e82ebe187", - "c61fbfc774b4fb7a4ddaa69025296ab7ba405efea5cc88335cae7bde60ebb107", - "0ff0555558982b1b8f8afde6735ecd1d456559e33ede527d231a37c07371f9be", - "108549b29666e32f94941d847dfdf57c0aa8e94fd24cf431aae488a4cf1006a8", - "6673bc3b4abd1f07d71f2b60fb7c8186e69efdf9c57126a0a32cf1a5100946bf", - "923615a3a399947f6621f5bd03a61111f113aebfeabaec85e547fcbf6aba160c", - "be452d464d5872dc32793cb785c73d1074aff67cfaf0f9b0700b0c7e1b938bf8", - "10d2b09f816b48a9d44bfc98d2e6ac32590ecc40e68300b6426bc42f9530b96f", - "bbc1220e0898906124235b23c9909f6b91a0a24fd4b9984a93805071381b2a93", - "489ac5aac7285eca25f824810ca72fcce14fce529120ef44b7389ab878b69c1a", - "f02eaf493c7a734b316dbe541d7d31d6d95a472b4ebcefe3453c5b4d683c0f51", - "7657f67afed76fe1a4daa5158907e7226ff8f1edb97bfa7b18a43daec772618f", - "7da4791f0fd3d088886d0295ed9fcf7f73cdd4f9567a65e435398252e868fb35", - "d07138f76b8b3da544cc268e16ade9ace2a63e88e94d2224b01e9973f83cfa9a", - "3a0434bb36e26a46eacdd364f45b8539c6ffc7c0f02072f8145213ad2a5a8f80", - "3a06da0d4f1504eedb71bd5483f630689408331085fa1beefa571ec07e0719bc", - "aadfece17abd41f9a3e9aeb176d8ff4709b81fcf3d8fb2e0b3d4f401998011c5", - "a8935b559fe31393c23f5d0728993973a40c01137af507aff40a4fb61d97b8a5", - "b95dec76b74b46853996aff6555916ea69dd18bc040c8da3f68093fdee632be4", - "83e718adfbc4c306920eff7d0cc439084d61a5c9b49ccd3355e8cd0cb1f3a80a", - "8f9a0c9192bc5b58bcf93ad36d6a042193492a3a997401baf0cd629dc0d51553", - "6fb35d04b5aea5d16def235a69bb1b2dcdd791968d50b1407d777111eabc179f", - "2186357a51e7d15d25b7fc32c5f1d2cb408b3a20a97fec06b485c6e2be362193", - "9045b603b947a45703b0acc4f74d191deaf6a855337255a274fd5102139dd2e6", - "72fd9a4f76af2ee9fc2191098c80c1ab81afa6f66f12e777b9cd8ba7fd2d41ac", - "2050541e1e5d7d3db731bcf36cb049d1ccf05abe321431d88cda44ca67677b08", - "1bf59138319150baad1bcddd16f918bf5c81ad761ce80f752bc491759827c678", - "45894ae9f29fa9b4f20cc03f52b79b4cf1ce68c09da167bd547d8a5287d57762", - "1fa13836e9240880ce43d1009c937d036b9c77ff2a37053fdcf3091a57acaf46", - "4ae01c1dcc5953a73765bf5686a7c44d9a8a99d3c6479b690991509055aaad49", - "de42adabd7f8d0fa252785b1c44f17353b1d6ed4edddbf5098df4028ac489275", - "7af289f5da4ae97539acf900a66bf9779ae112f661eef9d071b08a682c0bdb1e", - "a3b2e4b237e2bc7e03188525eff9f4c9aae8dfe237af1f72f1b90f6bd4ed7417", - "89c25ab5ad2e807571cb79bff145390ed7ecf23c1be006274d7c4d0eeadae54b", - "dace85c594fd5546423e6d6b7c36f3f50cca7db7c3e2b0936817fb0d3e16a827", - "627343a91ea0bcfc3d56c80a0279d68339320e44e7c63722856233509f228b3b", - "58bf122091f822139cf1993513fc6bb8934d092d5b7103904e276f49e795d9bc", - "f7e5c1868d9562ef6bd535ab41b257da9ce06293c8b4484665d485a9faafaf51", - "526ea8191f8b9826879106332033597c91404409d5c1653abc578c890bd1dbc3", - "099b8f0adf0518ee051d409d32f159655ed37df41ce985fdc008ed1c55c04094", - "99725cb332ac726ca247a4bf0a69d97dea292dcc7a33e1d4b7d714824bbbf090", - "0f136b5a6668fe76e7ddaa3b19b6325520c21ba8995eee9cf00adf6efa71604e", - "a26cacd3f36524cdbf6956a57a514aa208f07f0ba7406d27259843f9c2933738", - "eafbcc2d1051c50e19d012a6d4df5ca384f3052c867a7b9ddf6b838d429b8493", - "1fb140f4a9901b5278f226b6f343e879d6b0fb11383e421e90d227dfd615e6fc", - "39df90860fcac3970fe92e09116ff6d7417a07c2846bb090e47e531f9a1a2946", - "90a64ae359955428f8f6fe43c8385701026929283ec3f6c5f1a9aaba3e6f3463", - "19518b20103eb6e0aa8fb82811bacc446d1679265775b8228914887391a386ad", - "6a667e0f89d996ed795b761adc13432a5aa8b78d07c893a40f9b476b2c747718", - "f53f91f66ec82bc96032d7aa6b98f9ffc02defa6a6aadcfff9bfcbb44c775bcc", - "01d11f3883680032ae252b24a1eb7cd88c3eca270a8c9b7852810f3347ba62e9", - "1c32b1102101d4b13afe63820fe90d0f1cfefe4d30aa3f2854f6c0b21b40463e", - "f778d4e42ab5226c29f1448299460808df9e50f4065b484671c1ca8049d19659", - "2e4a43b04f509ed047390f7c9370b75e56b1aac1bca59a2888689784831a89ce", - "0d473e270e835e5e03bbfb5b092456e81a5ea3d00182238e930b0aa28e027a7e", - "1246dfbe02f8c4dbd96a12cb484ba088f2056d638c88325fec6aa95e00144e7e", - "371a54300adc9f0c53d4a03cbd6ef46fe0b3ddb923e2bd0ac465d0ee84c08019", - "1e30992514b51eaf374ce1ded556a53bb23148e94e6da69e5ca09f1ddd27cf00", - "e5c4b17d8827c81dba1cd82e718653b096788795df356aeb860670209f6d4aae", - "29c427def48a4b21430fa65f675483422b8d48a4a28e0e6d23a5dea33b602640", - "c1dfe8fb2c03a9020642d271c9ae470fc3bc0bf745c78d53386cf27957debbad", - "c5d1e6ac41d80a59019b4b5f1aefae297aa25f010afd91b97351793fa511d9eb", - "4567d2694b947dcf7633cc90e67650bff76bb45cd8c25fc207df89b24e9571c8", - "510b427c341c71933d27ab98c12b32b86e072070095027fd7587d8790317421e", - "2e3161323ef333eb942cb6e630a741898be2dd4d1fea5814145a502912cf9b4f", - "949417f77946db2ae8cf7d97f380ebb93ee79afeb2286b67ac1af74362226127", - "3d0606047e86c8c981793723e90061431f0cf947c96ff3c4b1d3575e0053bfd5", - "23608a9bd025c1a649816fd7ad2c5c217e268c64829199aace9d3dfbef320a4b", - "6071fd5d6cf4759c9c586d2ebd0598ec2c4c385f931ca9c17b803a13d64cc001", - "daacef3c1ff3754fc43934855d2fc854265e8822be629afec6e7caebf886ed28", - "c93bc594a1b971fca38f702198e31ecaa7ad637087ebd2c58f11131cee186702", - "76d20d03a557daadc5609f42b84b8373676033d543633eb506b2b001a6586eea", - "a7cacc7af18ad461872edb5cbb8f6ee011c72ddafb0a32fab520c3c778a1ea02", - "ce2054a170894343f0d9e8d17d146100eaeec1f05cddb8c9e15b5d86cca59ab7", - "9e6ca54186e5d5a85a5193e61a00001ab6b8d70fb0ff07a394cc499df4f4efed", - "10ba25eaed9d82b0dee652e0e0fd449402c3d70e81202a75451c57ffd2fe64de", - "aad1d91a73a8d6e49458825301643011b06ce5cde1ec693a0bd6f2c157e3f443", - "728b607113b90d4d9c7055eeef491c051567419b17391b12ebadccfb229445c4", - "c4eef5560c8c81785431a1f224c35dca655382f8b17e5acf82bd7ee1f1edad2c", - "a7cad540f7eb4b15810f9587fc80e7c61b5b777a20b84848708e2de62025159b", - "d93192ca238df8c40967ab4eb5f5f97d2dba1f8873e45bda56a5183bac6d4bc9", - "c96c26761f81e7d559e25f33cd8b4b25540ca8ff3e53f14465b5089c88e3fadb", - "2c9766c9efce4d7126f570cebdc06c625004ab3c2f055c27eca5426951cbfc8a", - "60ebe932ebb623545a14e22e84e454876acbee2c45db80f8951ac66d688f2fca", - "56830c489f36847ff6f177e0ac21f1a8b66a189bcc3ef257c545a49c372d5aec", - "a806fd55f6448240d507d5b5a17e9726fa151024cb04d274c33fbe5979939b6c", - "f3af5f1b6a9121e02d6eda1c648f82a2ff94b91a28be21d4fe0a7279945d672b", - "cffbdbd2c91c449b8530a90e7cab559c0ade077a94a09f235477c3c763dc08fd", - "822192d757f6488c20aab67c47440f9267300e37a414b94d86e2826250b50d4b", - "bace21451e0a462615415bde4b2ce5cb049bbe9d5fb2c97cc6c1932f879b5799", - "16205ac65a97478eea0a7b687ff9c4468b535f2a4d180c9e1f0cff9ed09bb170", - "f648d3874d754ccca6c01eb868e7039c75685eb6293e3c1334c4c140f58ac9fc", - "baa701c62d97d3b427306b7b0888a9beb358bcbc57808a811480714ded42d400", - "1334b75788ef11a42bdc8443392f10fc7cb903c3163c0de06337cdfe3d0ec4df", - "254e4121e60868086bbb949c0bff18548bff978c180508b3eb985a290a904218", - "f744c2852422d1aaae43d49230ae534cabd0e32135a38e6aacffb9cc7a3243da", - "c40bf79588de16837d24b42fb44ad48a6c5b339978f1dea9668344e8eb127856", - "a08a3261a4d1e20fd46ee0af0c2740989537ff287905dc4d23759a5dccb1159c", - "d6bcad281b3b8eb5ba437cd4598fc8f539bf31e5f89bd35bf85446fa002df263", - "805e8dd4498d32ae5f20b6c231acdde239a5e5c982994e00c06a563f76586d0d", - "599d8298a9c7c423b036d6ccd26965b5579ebd9227f14dac115f642aa199453b", - "8a873f3abc01e1228381b5716b097b8ff75d82bc907a507f34f4978c3e20dc6c", - "6f40a10d295930753746a5cc2d1486c63a93d5bddc0a9a4df0dfe611da247fa1", - "b7ec7c89214eafc7ea254bda10bea27055b19586eaa32a64fd7d53e0fa205862", - "945d04ce173d36ba184506d83bf680f43d30d4e9a533cbff543dae5f25f7c7b8", - "207e27b2ce1ca3a4652a32cd6616aae488f1b4975debc240f6052eeee322ce0b", - "f9f128479d1e5638dd00033eeaf5929fbd8caf7baf5026351f3f89f029604429", - "c756eae450151dfbcdc0706047e89b67625f3111e0f29d6ddc09b9f7406f1edf", - "fd4a20d1f3b1459b6bf91cacba58a0d47339722a45880c2470bcabb895907213", - "0a3e40a988a5bf29eaa607da74e5ed65db381f68baa2725227ee360b41134e9d", - "d0d47d82e4130a24b80005a5999d5a3eb4065c0b79a43ce7fbe8ce77eee2d474", - "68fa1aa250781fbe956178964b0152d801ba4f27f6b0d44c10a565353ada7895", - "e572c6b812bcbd0c84955803cc366b2760593965713d5d6c96fc344cd8ed22ec", - "61b3b0d8b808597e349e7d0c1b3cacd913ee835513c7856b2229ad1f953b831e", - "193a394617a88577fd1119c03dc3e364eea05d4d76e63861792e9c9eeac1ec13", - "ca5b294f447192cfba77d2b33df6109ea6f4c5b0917f85c31a675575e28181f5", - "bfebf85741c65ffa20acaad031fd63261c6d6e3eced03be8d7c59c0370ad5d4c", - "7b9e0331ffcc687a9c0d3c8da90d6283137e1fa6fde8cfcc4729195cd906f160", - "0848e43c08e69d55491495af88eaf102eee05fceee51e4df71611488a60bd758", - "58fdd50eec5b3fb1468f3785a5631485d6e693989c9ec36ab8a243b92bab42b7", - "dbcb9f2ac1dbc27d08f70dab2bd22aacf3eca6f856c40c503dc70d604618a4a3", - "75525e1cd393f4126c65b68a19ad985c065c0738f56fd5e8a688f98d5b657dbb", - "e28a15c8d34828156dbbd4576575d668baff2c3fb1ce5a3f76f8766fb361d114", - "86670beef302880e1d133c62e6a82bcd266f60cf11596bf7ed46ad2759f5fb15", - "7fa69ae0a3a8a346d614bb71804b9dfa2978e97f7541f25b559e8cb13fbb721f", - "10dd242ccd52b9645a765368c564820789164b5912cc7e9fe4cd1ceb9f97e291", - "be129d93f07fa277b0d3cc3a205a414ca9f99ea6249c500fecd7429a08a99078", - "b57b7f0f3badaab6b8346a45b656f6f5078c36e35da476a813b60804de30e21b", - "4904ece523590ec4377a3962334a7330172e61b2145d331fe792cb369f6b4abe", - "32975ca8ce20217287dbbdb2198f63a321b7bb89176016724ae79d130ec77fa1", - "b80c284d323062bc77c4854c51e638b02c4fed65fa0ee5ac18317f1cc42ee5f9", - "8cd95919903b24568d7d97926c96a68289bcaede1694599446f55d0ce938dd21", - "5617d238d4107dbc35f1551c41ddd561ded8f8e18c8e445cfae40451d335b5ed", - "83f78ef227e562141bc5dd96d9bac8d51a1442d6c793a692f6066ec80a113af8", - "49b97f54bb970736fe6614e85513b3c9f1af79cfa4cf81fadcaa4761f33fc26f", - "1211e18bebffca2517150dded8ab96469d4db8eedf739400ad70a07fabd317ad", - "c2050f11241d6b39cb724346a74afe1295586131ebdea2d9a9dab8be2bcb6a02", - "90b2333806e90fa8235ee0cef74dcf4e762075c7c728fa8eaf4e75856f411ea8", - "7bc172aad712bdc895b0165284b335365a640fd957fdb37234961ed789adf70f", - "ce70cd91f9fa7797501737b820f195dc5f689ef53214524d7f2804c8c749279f", - "031a8277f96ea4807ebd6c0548faa7fa13be1007781013f4c7fcfe1a0fe47b87", - "04a5efddeaa1f3c1fe53437a174e4295efd3452acd53757f18d8c45e7ebf15c5", - "e1f144a0423d514582e90ffc97b03983dd726e2e1a8d95f0222059fc65beef88", - "73dc176e6ad3d399f12144e73a9fd21d6554dc282a7dc606a022f38425026492", - "c80bead8c2629456ad171bd5c6511b6fbcaa248ff27e5976816461b8d27e8bed", - "df3b240d92da356249aa40e44bae8f47c44413e871da4976b42ee9c8847be581", - "4f38e53f0a6760849fa04c5728ab137f26e3adca44e7d05fd27ae07837382fab", - "129f90857db58588779b4636079a31b82ab649c1c2d31bec7d9317d46bd586df", - "3c9c46a46b17361cd1ac3ed3401c9a268095c1810bf991c470c139f8441e1d0b", - "0f01a8a25b5ab88d160fd7f0c63ca9fbbbc936114ea922f7114e9e26f36809c2", - "ff8d941ae09d2c18510c03c30ca6a95e4ebe92394dec1fd49d3d1d462887fd8c", - "7404249297dc1d7ab3cccfbc3116390ed03375ab2bdff42779a409e5ef5cc22c", - "0879fb1f866b8450e99eb37016e46217b18a1ee48fdbf823c2bd3662dac479f1", - "b2fea41746c281af68325d983712d794ff1b585854638236be2e3152dbb12203", - "1969997c742c6b5ee7933fc21c7f0c3d02cadc47a9f968e565388f9060fee3e8", - "cab081fcec5eae59aa8ea4872b1e170d6a62642f1acf9464292f6133cb36cfcb", - "21212204d56c8c08bf49d541f6e0d597205d342a340f64de9d79d2031596fde2", - "0bfb593d18ed909d996389df5c5c0030e916abb5e0cf348b88acb33f1ffbe533", - "7e95008ccce4835d0c94fe601ab87e7cd1f3e678a24df1a8da5d3dc81a4e2374", - "31b532ac4b18daf74c38ec8af00413ac775fe2fe3c0974d8c8b6fa5fefce78a3", - "f6871363484f85450daa59d12d7aa692ead4ac7a844c12b03bd6e73a4a91a78f", - "b4daca45f6bd2cb02d3778a35b884a79b3cf12717164a5c0637d9271a23d2523", - "c3e5121078038d134986ad900df589ac9630005cff180c988d9cf659ae822e38", - "42f1c36efaead8f457eba5fe2902a8d5a999b7763f997c0fe7ef4c30bfd13c11", - "4c6b7dd504a41ef5c71e71ee97a59caa3ea8a6ce603ca7d0b3fd3d93a3c8bb3f", - "55bfc1ac80ba2bb4edc4202458645a445911c6c7068f4c323b9734cc9db1f40f", - "2cd09cba5d0203b6501315dab334947e5aff60b8479607dbe7fd178146b2d532", - "1316b2d87883b54e419ed66a4dca6de210cc7a674791089dd303ec9d034a4174", - "4adb35abba04d72f39a31092c0e4b01b337d32fa19ecac6bca9d10aaac067126", - "18976366a5eddc378f7a9a113185dd7932ba03b096dbf6266b0d63ea448c9eb9", - "5e4fe7a7ad19e37673b7c8d30a4574528d61d39093265c2ebe952644bc0cadfb", - "bdf97c12788d724841764a6ea5eed28fb0e9bf3aca550405985c89c3364c37ba", - "87e4e012b57d41545fc3dbb42b15979eb1872d9d82030ca79c83f4804da25ce0", - "752de3caa91c7d9064cfe33887fd76475c9bb28db4e8fa0f0401decb67493d45", - "e8797ab5b987b18dcdcc1cf11ecd554fc5ddbf6a44716279d5a7cc3f870d0b51", - "c2c9afeb9eb4c3b6e43c5f7bbef25e8a08a01cd60e47f6323c0acc4c064541df", - "43191711067b166fd3e3ac721b8e47288dba511952b173595560091db5aa2628", - "b4e5226f53c0420849ca69ceb4d79bd155b8c75c3c3901b9ecb92356456bc390", - "0cfa22632f075d3223befc15b955f7a70196f69b065d6a396aae288069560a6c", - "6bb64d461506b407451ea2622835fded3e5cede5b52a3986f632833f2c07c707", - "aea7e70924c0242939295981a62e35177e1ec7e57b0261ede270f5c810ee8b75", - "e173db5edb0a0080283e4b837d6aa9cb79bc3f38c2bb615fbde1d61f1cb6322d", - "f6c8500c7622e0f43cb61b35e0b979a053fdd204e6ed74a08c368cbcaeb0c05a", - "4d4edc533ef81b17c40df91192e8fa8696ad4dda1b9754184e7462f3aba2e959", - "8356e8fd2794334d05882b5e4de65aecd0508b394a48225a2fd70007f0d0f7f0", - "7115dd23ec1a110856417dccb08dcfff348ee0bc0d77691590034a4ee5ccfdfa", - "77e58bd403affeb7e40dd97a2f89a5a531ba8e5d62ae688e48a2f4c8467a2107", - "838ddd2a9f51b4e19ebd07f8dd2a775abc99e3c3917babfddf4e0e667aa867e5", - "4b67311f76ca03176e80157acf0b6ee29f338443bdc4c5ccddf784f928c8766f", - "0cc73fac81ead28fb9b3d3c4a5d83622e9fab5a740ce4ce5c9ef6da8ba6f39d6", - "5e48f6eb9699e512a89be700fb79cf96560345b1e69e9455bc0c5403fef9e33c", - "a3fd2fd0a0aa55218da4d09affc534547009a2c045ec1c99ba36bc4060f60f15", - "ac797044990722e15c668bcc2ef9ed0df1ccae689ebfd3e2b036e650b514f8c3", - "e9d890b4b171f3e108a95d46f5854db9c56f654d7d66ab53ca3edcba80dec84f", - "4ad4e3f9504b01e7a3789c834473d4ff70122037883f29c94076d45acbe096c4", - "bc88ac1af5c6943996ddc2c1e3ed2d8f957c5dba0fb75d760a1d1dfd557377aa", - "8648e5efb17c02ad4fbd24c632a0452c1a4aae4d3213969fad2d51b7671cd666", - "bb3e0801e3728f6fc6fee43190324423b567c35c0e819385bb57efc8c168abfe", - "49315f99252f9cafce91d35572f10a2d4e67315c76d24ac927b5ed9ba4457ec3", - "b713af50ef3bf3ad7e847441a15590c1a34df2f96bb1821aee0ba78ed95fb539", - "2fb7279027735def5bdcdcd65a17bc21531ca804fa2b71fc2f2e557e2c430b74", - "ebd6ac3ffcec71b2fff38cd69d4179ace38a30ced0e422702ecfbef00dce8936", - "bca3c8e12a22eed7454ee2477b076bbcab35978cf783bb8a296b5b784195aa8c", - "9b5697cd3957e1c686a02f971b24ece47348aac600f847f6d28152801181a464", - "0b9346cf8b98c3e34770c939034cac6425a733fef258575ddef9d6ac84fa5668", - "3231f62bb6d446decf21c96cd994a1a1c5d3489697ad7e5783f4947643f4a0a6", - "c4fb5a487c32e411d1682cce39885ea6691ffb104c12a5740606469704678316", - "49907989826bddf2b0d8d0d24ee6716ece7ca211e66419c4d99943f03a487462", - "9f9db251edfbaa3c4b41ad0a1a9d36a8fe97016e300039ea8008850f8f0116a4", - "fe21aa9b7525e45a7840af6b35629d713cd94bbfe96573b1fbfe9af6cc85f60d", - "3c321e9e26448b49cf12bc8696430a2552075f353559258797ffc960e1c81e22", - "16779c77c28fa61bc26d4bc3b8efda40b03afdacef16e208a2e67de022eaee33", - "52e16d4ea61dbe80c5f13aa7f1d99ee569d3d2ea75b8576e31ce9bfb64c1b410", - "ae88c73adad2a9af6fad1474482ad1b08868ace39ce61b67aa5c56d976dbc8c1", - "1164e7ec5aba7a96d193e08b605d40bda450cd011f21c10fe15d3d7cf0b860b9", - "4fff25f97299deffbdafe8a5bf21a317e82e89a322367bcfe180daa7a1908f7d", - "d98577d5f997e79169449963a928cb6cce46d2812b902330ea4dd8b8382bca6d", - "59297c01037327ed72f1643921cb5a0bd8c26c88f47d0401d0f5b030d5ad89bb", - "59e8058970b40b6eeacfb9472d940cea8e3a1dae727238504338d49b522aaaa0", - "495bf4f26aa38b4b6cde6b48fbcfad55282bec5b0ca59b8b6f7ee8467929fb1b", - "cbdd7b4d00ee4c7fc7ca0f21539b77c204c43b0d386bbe6c049904ebd6f398a4", - "510c1ae7d6bca003b8026b7719f02dd06f79e906a68b4e9710f31e10c1a36657", - "b6b071d81cda3185e0c56cdb1b7378b66e125323e331e2d9ff5294c77ce11b13", - "dd1f5d408fd0c23b11133680bd04ec75c1cdb4c80aa293388717eba0eb4ff10b", - "2c7bea4cb2b0a4559ef83b1cf03a94e96b0393a0a5ffeb02e312a17b2e749a6e", - "56989a93650f3ea7a0662c6ef086c980549d6e455cbe63e1174e1817c3b18afb", - "84be4813fe668c62c627653fe562c31c33466e8a9de4fc3233432aaf34bcba62", - "42847c5ed5751a77f4de69e9dee9623336615d4a4d8db53b81b46bbc74eb9fbc", - "e445337400a2c13cfd3196c84675ebc296650b757ca103854415c8b3b1a2faf7", - "417ae3ff025bc88e959bafa019a0087a83e0bf81cbb24ec24149b6ff187c6b1c", - "3f480deb7b0fdbf78b975b97bcf360aea3e6df0b516d6ca7629af1f6be2ca364", - "3f9e7bb624ea0a83ecc274cb4117075aa8f0a90aa6fa70b85266d1859631df0b", - "58f3c52fdacd872609f54dcfba6b1a5de7655833f0a1538a8c951751520f6dbe", - "a0c8393f90b035d14140d05914f4f306b517ebc1a49bf783e3623221ca49153a", - "0db480960da9983b9e026d2355351290e47e4496e16ce368a262ec16b301a670", - "1db3b96755428b36e33e71da0bd9de1c5b0c006dced96f4cae3ba1ce3bbb65b2", - "605943706097b78fcbc9ddf4d4d9430abfb89365b7c726835e44cfe3ea64fccf", - "6b85d9b4868bed7bccb1e2d6fb92128a887cedbf0fd1b590e19c0760e41651c5", - "102c9823549cc805543426ab8ad2af011140f33cf799235db402dd0f2cc70beb", - "231a3f91ab67d778e0f2f660abd04248ca1482159ef77d48effc6cff96c8c0bb", - "138a28fc49626677261d93dbf55deb7e0620806129930c9b58575b793409fb45", - "62b16fa4f1383994801dadc36c58aaf8b6769d888740bf92eb64766a477a3aa9", - "0aff485d716263881e6deb95fcc4fb7f4c1fe35740acaf3d280b2624222ea9bd", - "e3989e9db3484a77fb90059b7d963d958329b73b3a6105ee6476bc901e7ce378", - "c0b0a757db59c39bd7057c99e7cb24e813a5220fece34835cc1db5532758b5ed", - "03b6af3291eeef2c56248c03ca4703aefe0ab4b65d7067df4805a9bf66e61852", - "7d6857016f15248d16feff691296bca702fd71b46e68711a57ec7d1cd6ad3733", - "0c26a0b98d5f0124d6631199a9066842fcaa518927bd712e722d8a99d1d962e8", - "51aee42d74638a48feb3d13c28e31a5548a8cb2f41f0d92fee2a61852cfa8a30", - "5a7788c68fc4b8806e4a387d0dadb645d48cdfe6a4f6d9a0d7fc4022720dac59", - "d2242dca5e681b0fa68869ba064cccc9c880de875e320c3570a07250cb038613", - "02f475ba02093650b1a24fc4c3bb7de3494330a89f6b0aa3ee1d9bc99cf656dc", - "bf5e9956135f2f391535acb180ac937e5629917b6d3aa56672d7a179e801e309", - "794ae0c33fe3304e7e66a3add139558e96a2d53d03f6e5558aa337a2b5458549", - "24d303760cce1cfb7939aa0f56b3254abb04c36c197bc4398a6ba590f057b187", - "7defa0679bfa9e50d574cfa56367db901f1a1647884d23749d56208e2fe65df2", - "7f5e2938fdec04010de825907080fe05595dc93aeff673361e36605277309fbf", - "066167bcfe05c72ec5e6acc8d2a781ea1b299f68ec227a91da2b783326042d19", - "045f65e3982173b79353fa6fdd973277215ab52a9753131cb844ee7da8ef5980", - "d4712cd924a2dd2729bafeecfb83bcbc1738ab6dcf6a525eacd952a8cce747b8", - "0e85a5404505e531f6f84b34f70d442e42cb1ca60d01bb2c1d3a83529fcf428a", - "ce2e585d0042bd77ef93beea6292e7c2354e4a631778d42a875693ce908c59d4", - "2273f96929d3e4a68e55740ae273ba330e5029509466a58ea4dd6677059cfb97", - "8c2164a0ea32e991ced3c07339170ec03b248872a4632bd0f9b19c7f573f7ff5", - "f95a1002ce55ee1920f7f03c212a4568350dc9e05c7d82f0056e686c42617dca", - "80170018157a92fbefef8224c1f8f05c1c9be1d1d8dd3f59fc3e17dd1834746b", - "b17350f48df54d0d5d7af71b49b66a09b9c35b393ca6ab7fc23959e28f918507", - "8e96b02da531a0e9843c909b5f5a0332c81ffe9d8ca2a97c430bdb5e4ab8153b", - "5052ab748998fb18764d10493dde09485811592d728d1497e298436ec5f792b3", - "1feec4b353da4f40332186f1a497eb6c212cc5e916e2528f2e0fa5c30b1e3eab", - "e04dbd638bbbc3d5562e3f318ced9cb9dfdfb15c332d06ed5b8087922a23110b", - "7336f62c93a20bf0e70155c3c6f799b71ee044a4d73855b84b6635f709aff723", - "3f1e75f47117c0e5a2305c200351b134479859796e189614073eac3b25599ecd", - "12e1167178c2c274bc89d703d8f5317c81f3cbfa686a3bc721f306e1c9a5aaa6", - "2e6b60622393ab2f3d622ad34655c9d3f3ea49ef1855d993f9d8a368a13c8d1c", - "9e052a7145815cc7a4be8883595bf9f7d265c80534145eda75e1a6d7b8f96092", - "1723687acad74a07a7fb6a5fdf0a4c29fc372891f81acbf8861e08cc3f576133", - "1ca81a278886df44fa7b06dc559a8e9f26fc98decb5519a368cb10506b6e1c5d", - "d04a47f338626fbf2670bafd0adc632f414b89f2c720e861fd59aa3c8314a6e1", - "569040fce567dd3e0e9074b2220180573a9d9fa248f6b89f433b2a33d694aee8", - "55bd306afa55f1b0eecb7a5dcbfab7243bcc99d8a134465f0e1d44b45b9ad98d", - "5f77e0fda57fd969b7243eedef22c8e0fd480a084128567166eb540b881a603d", - "082d121b0c4513fd696f9d285970a91b77b19834b3a1c23ba247bdc2e465971d", - "2c7fcca33642472b6b74a9e23299cf4ffb97ba6d94845d73ab56e4392f6ebc5a", - "777b47c81999ac5d6324363f72dfea9613751f66f60d7a613a246848f077d18d", - "6e7406efef0e21cb95742c6125c30f281969ec24e73e8078325af6545b072fa5", - "81e826a01396dea9ef2e5d45e705c9c5d2851d7145f6bdf3cc4743497dcbd319", - "ccf7e13e78110487d57a2a44a7611199858f667b4bfeaa5926606a0bcdc5bd83", - "2c0d93fba1d14499cc40321582639363bdcab8cc63f08d5ad4c9b20a11bab16c", - "74f4378c8cd862bbc51a9186381ef6cde124ddda2256488563a404b1fc032856", - "03527a83d8c83cb5272bde7cb8e418d85585afe837dcb020b6d334d0f7653acc", - "fd3ecdb7ddc18407eabc4b42390c6fde48af4d412a18454d6c31230de4796fe7", - "b02d316d9707c33f0081e3a7865b7a54a358a7c04cfbffa203704e93aa9be083", - "eb51b5754275aef544c4458a91d39b4aacecee6d903f06cc3ae928294a216a2d", - "03b5b37ebcc9f6dbf3703393104196c9a8efcbb3ca8c9484e894d2f8943e97d0", - "040fa5fda134d41577af8d19b93a94a0725950dc83626ed2e2f45f2cef89eb34", - "98e42b275e06ffcb53c4fb26d5d6d161d4c267269d9c2125b12d0cec855b215d", - "466a7e0c5964b2a4fcb669a9f6c1b8e41681fec999315abd07243ef87888e50f", - "589a4d2cf7ea1e3397db0a86585294aca576c2239bf5c77f91db112120993df0", - "5af27a1fd24cd1a6a9b2b7ce59c5b2f4bae25cd26d96b1c2ed2473ae648532c5", - "a580d1e82d0eaf26d7880e913daa2b8243e34491fefeef646c2655dcade0d3f7", - "ae403de4674d8208e8a8a543b1fc0dfde72102c7ccf4f52c1224f64b7988a892", - "7d0eaf5ef2a557ed520d6dde928dc275e1836a5c797cf02db5fb6626c0a45b9c", - "cf346cb8381ffe182a97fd97cacc94eb44c35c65716e3b88c95c4d35592d13b4", - "af481da91874fcea85524644f6e0b740e81dae3e07e5fcb16824c6790c3a330e", - "571cb60d610c0c032734e2750e06a96ba51d53c44f4c66583c1a32fad13e1f1b", - "ed76a246bdfb2bd0c78f67fe55e741f3db5e0ff4c63ee8703eb683a98dda9e0d", - "ad98bf47e29934958a8d511fd788d8205ebaf9e683115fbdd2295692e577b0f4", - "bf5d88322765656226d8fac4957ba3a02b49f1e11057ccf73d08f74c89e766b4", - "1ce1a18e2cd4d76aed87e3afa9f4d5c0a9daabccf7c95a8d7469f2202b3c3b5b", - "96f997ccc047de89595c756dcc6c8633d20110bd7e733d2ecce9179b5a74a455", - "804fcb08867c149a9fef88f8ee0cd3bea22a0167e0a17e483b9c3be9e84768e6", - "c08dbafe5cde2d4d79395d6745af2bf6ed3df2eb9e188f9da2e240010c6ffde1", - "b10808e18903c5afd00beb3cd56ceb7e5eee8851a0653c898e13ccbab3daaa2d", - "f191d7b435d6f50562d1b2d3125f57760e40fcf1e42f47499091c4599700da7e", - "203a03619f261c96db2fdc8e1305e080ae631e0dbc63ae30db26dc1bd178a292", - "4919717fa4526d31bfcec9e00e00f8f205095e9a29087959e467dec69bf01c0c", - "f9ef95e26facad6a5a6cfc0a48a5fc270d93a4315316d2b139180e9a66d5f4b6", - "bfc72d0a58f97a7d8e33c69cd3a8b8d6cc0f6898f18da8d842d5d9278cf195f7", - "54eed4ec61f0dbf471463825e9163ec97e64e4a7762ca84a9217d34c5399604c", - "385410908d9c94b9e6f2b4690de245a85866a71e3c469447815de71d4e32d3bf", - "f1b439eb8dea6255fd3f25eed3b6d7323c746d19157dd692ad8482bac08092ca", - "96248ded170bd4ca8a1d4b29a6615eae7fdd649d0f563672bb8149dde218f389", - "72b4088261b288ed2fe0d6d6305ac85af8d61c2b334521b46638f5ffec9fcfac", - "30ac9176484c490a00ab5238af4ec148e1f8ab6f9ccfcf5cd8ab49701126b0e3", - "3691f893af0341b9215100fc60f4ed30544a1c95c849983696afc2a936f53227", - "10c07bdc75d61c48c6eec242f2fac0cd8f09722b83b8c3c59f4d7779e21ea91d", - "ce516be9bbb20485e04898667ffb5679f612e26cbbf6971b4dda078173d3af79", - "c63e931b07af768705e6c77378427876809be39ea36e011d85ba4f733c4bc4c0", - "5874b7cb9763f0d80f5e1795ea4cfd92208bc7ced61bc733cfd2bd0b54fa04eb", - "ca25bd3fa5210e73a84dbce0243d52fc3d61afbfa6ce56e6be0f5d370b5a42a9", - "0ec8293d5b50506e9b3a4c0da412e4eb90b29855d1a2062ae36434ef5dd7e858", - "30f1db6e902178f04670201962c5e2c87423cf48f0e5cae39d05a16ec6322275", - "9f9456f24f0ba0794560b0a18b0252b416c2d45976b973a80737710144e75573", - "3afd89e40ae8f1fdf63ccf1bd4c91fc075e2249199f5772faade74a627473747", - "96e3edb9488711137a0f537a83f89d8b6700e131af1ed49618de6ac90699f859", - "75f4ed51ef4789f7aeb74583238f4e25ba02a8fddd6fa5f7c56f94d296b6ee8e", - "cb0445ab5c77d058be4e677178cb0a3036f8683d55dd5b57897e0e865bf79930", - "54c292058528852729ac4dcc0e02f93d13a8fdf5567e91f9818f753af98741f6", - "623ca2a7b12bed5a623969d616f3a14bc4d76dc02e6bf23db42e7c697c6ae868", - "aaabafa2a2fd1dc912caec9e8de286dcdb00c4a8fe4de6e5bb4d6e078136ad0f", - "c6e4de25d5890112ab31de649588ddf1e730fb5b0280dc5b7fb0eeb50c49829c", - "168d97c1a840e0657e821b0ab25ffad48c99b090ae57ea32b16aa9aad4397241", - "df383b0a2ad8f36a8844af0fde50e790a3be43c082b9ff82c53008e21ff6de18", - "a4168a6bd7f3f0cb1be1910f1a914d41559ce9e81aaa928239819cd7ebf691a7", - "9b8c926679c6944f4dfa4d01511b49d61e03f3f8e745d0b585bf2c3d378d3c46", - "f50dc7eb1d0cf70ede17551d2e499b6b22b185a6580753329530f03d053d2080", - "a7bf2afde378afcbdba47d6d225dd9e691319cd290811e898f83d99deb1777ec", - "a13527090105ec32970fb0921b8949734b8d5702f280e042ada0fd2b76fc6651", - "2c2aa8a4637335ab4b5b43791e02f4116520b8db6ac4636698d39351fe3bc7e1", - "687aa4d08ecf043f781e8fed3e598e2f4101bcb9ee39290041c2314e701dc1cb", - "131c2f25192792a2ae4c40f768c9417cea9a23312f55e6f9ab7af881e7e63f2c", - "e6ee93c948eaf4910a7fab11230ff0e141c0532c1291211ab1c4e55429ee03cb", - "ff58cb115c087f87aea48c99ec741db28e33873afbd1b50c123213355c19584c", - "dd4a6b1fb7905346b3b4fba725150b956a18327daa9f21f390fbe91e0d15240d", - "e0fcec341e3b4b3e15967efe0ba13ca2ad96b408a4464666ebe1391654d14bc7", - "fa5df48ef13f68a9e323b24a0a77e25c060efa3ce6f63446d38be1791bf28473", - "3e529c489a9cbbadeb750713f5e140e4fabc2aa1dd870e9d4dba31133540a86b", - "1020f413a2a0fe853f11558e81ff9ccf215b093e718b4f498054712030e52089", - "ec33026597aa588756fc78c16e02ff148d8dff15763840897855f57cc7688924", - "c06aeac3c24aaa06d709074ca3fa28b758353244302b44051daddb3dc1e129c9", - "f996ded4c11e3a0037b1d64e6b0f9c5ec566b0695ba7f675b7ce5531abd15370", - "306f785265052d9df36af6ffc42f0c49b56c4952f5558526e272b9a6e9536943", - "a088380646028bd18390afd706bbaed83540f739aa58f9e3bc60753637c211a0", - "ee98773e41fae3b15b8a5e8eb5c4d17c846f4b9e8bf90a28ea9aea4f87013702", - "f5119f78e1142df9c2dc52eb1d7fcff1a132df2b04ecce27b8a0c16eb89f1ee4", - "7104443f2001f9c2e1d847bba6d27b5d3c1cc04fb741e1bce7bc28259c29a275", - "328d697b153a31cb8567da3efa98c4a4ac5a2aedbb262b065d751aa8c118fb9d", - "8b758e004ca3a716f1e72cab4b35837095e332095a151a4a9eaa38276ca33778", - "de289404d0d44e51047c932f14c2d54959f31e431228128b40067a62f0cdf40a", - "5ac5db80d274bdc44386c7bca75406fce4d24abb5507e85eb21116c6bc2a00b6", - "b7b2b12b26ad1fdb40fcc29addd169e968c31c7d44d028024d427087158e3597", - "e364d1b4a006a5805b7eedf975fc3b7508a9f6ce00b868a66aab6c2d225ac18c", - "45f8a5ab63830798c484f32212e8675c82aea8c70886704f432590d2ef3a2e26", - "14908c269986a1b1f5003e3e07713f65fb13965f7917dbd720260e5fb65dbcd7", - "a9abe0ee68e280e666e5b69f2227ecf2da947e175866379df36a922afb8104ea", - "036c448781067711f4e7c64ddbddd4150e83417a7f68d14a9d25eed15c95f68f", - "e4a85515fa5387104630825b151e4863f00bdf299b37b293440ad076991fcacb", - "87013bcc86a9d6e1f64cd60dda3c69382fdba12353c639fdf145153677acf0ba", - "49c95dad5688a303f52d0e035bf3c94db598241ab0e3b912a9aa3d3b71aefceb", - "7cf3671625f6748c4cb405f8f7564e28b9224adcc4d3029a993ee248b9745d86", - "0490d6ac0ba40b168b58040b9150d5e3ecfb2fa21e2e6a1cc26f8486a66bee73", - "3aff6a7251e104429016cd2e49e5e483af24063c3102ea2c38eb964c7894403e", - "76b02f8d679af12cb803f2f7cad2a1187639a6639032641f5b7e1360ee8695a4", - "ecd867d615fd66ade7bc4b20f4f3c0152899cceb9ff2b8888bffb5086fc40549", - "90dac6eeefa5c509dec84f0b818675f27fc7960c2ce66de487a3bb220c1c026b", - "751a322d4bda9c9208361425d9baa85d8b935e36f1c8c0050a563d100c7d8ed7", - "ef538c117eee56d240f5dbc7a11b4157ffbfb92b557dcb6764b5a38f976f15c5", - "ab53c7cc7ebac1ada5f47e64052f7d28a8a7f33b2098d4cd7da1c6eaeef76d46", - "a8e15c88eb270ace5816e4f0c78643f865ac3b44f7a791500a2f243b598d1a3f", - "f966d8308a2105adf897289ef0ce3a97d0f80d071120c41a8f25a984e58d6e26", - "6c3aef46f15673632de2c83c6ae8ece5672a4a6ccc6d786396be9610c013b30b", - "bd5ada644c09e418bf3c86e8c67a56ffa5aeeec181d4814135c8851eab3b8117", - "ece6fcc9cbfbecdc9c2b7b1f46f5b4e037bf233ae83cbea579cb946422b24f02", - "be196255c1680e72dce19cdd41231bdfb1c59e21cb70e6d25f0eafd3b62aeb13", - "c6ddc02893d36eaed54f80afdf626105c41f51d40528040bc05dc056a59cdaba", - "f9d25a8d34d40df0c62ef9814cb9ee533d76e6013d0f7473d0e9a8739101cd2e", - "fbb4c74e3dbf58a164e7743b6402cb4273684d2a3a534b635ffb9dcafd79e6ae", - "3230a5195cef0b7389b9740c37727d93298ae280429f518680cf615552425cb6", - "934fb73b51f00571eb51ed053a6b58b5f240579514b31656ac328564002fef9c", - "ccc3a5b6fb5a041654a795473e81a719a1ca2963d7e42e971577c64c70a7848a", - "70d4b257ed2dd4d80cbc1609b773a82670f6d5c144a8e73130d137b42da1a68d", - "b28763ed9487535b951c1c7b7df6435a49b6cf4ef6fe97990a7e8aa42dd4f16e", - "d32c8c5e36dea713ccaffa918f3c2be3ed0f7233e9e946050fdf0d7bc62434b2", - "2913df8a90b930be38111fd12912b9a6f0bd254f53e20c1763a492ab16b0d55f", - "9042aabc6cd488e6299789793fe38a28a979d072563efc2be4500f9dda387fd0", - "640a89c2a15a595cc897b0b24f98b091957eda657fc6981e204ea3f03dc12d0f", - "b0f558c7871ecc88274bbcbdaa07ac3a7fbe7419d2b584f4d6325b8794201384", - "25f2d138087250ee38413d6cc66ca2ad0806847c3c6d607c99e756d3fe090ac5", - "3c14f487c326706d722c4ff64605b0a973dae4f59068c5ab7a2285c1d06b581c", - "4bd9f7df60c66da18526493454cc250eb91614d91c7a2d387bb5d344ad3e5477", - "0fd3c5ca60e5a43b4a220f9e6ef1b505669580048aa819ecf3b5b80c1bbf89f9", - "c6034370ed9d44659e0592f98119ed24cdd908a81152d933a87f8ef631cf3c0d", - "bd137bcda30abb6cafea1c25edadd9fb3f2e79d2493bec01095001203262257a", - "13050aede2955d4d73f157ff5120924492b2aff11a1de6c98d9ebc99ae2d0e76", - "f664045d24ac2c2c220250f90e6ada8596c9b6c0e9cf85b51b8a74a1545868ca", - "4a109e3c75bbb069ee15feb38d7be2ff9dfcf3f2c70e2f5f4dc24d85185bd55d", - "87aeb2d818d157dd75a9c084db2d0df8dba13dbdac7d7aad1da3109d94e05d17", - "132aa7629c8f8b80d7a64b37e45e40128b59dcf9faf557213be6ae7ac3132418", - "41b7badf15fdd18dbab52951c8bba987a2c9a702c0de8d2cbc8ac96047971357", - "33ffe7ff004f2fd83e8878dc541a8f07de613381e5fc356330d0fe59ae7642e4", - "4b14eac445063f7d0bc3b86b40544062a843c4363e2142dca45a304275e11b37", - "ec1d8cc222407035023e22cb9a0f2bc871db1a77d0cfef1207df36254f69207a", - "b2c9f38fda3da04a03ada41dd0f22425b5a916e8a222b9b10706965fe892960e", - "c700b9e45c7eb9c89b6c7c77d61185da33ea2a519619c51d476275e5d465333a", - "608eccd7260eac544a68bf9f21a8d842ce0aee04c6e0e62a23a640ff8c19e915", - "80a32bebe3e93d9a80665abebf7b66a862e429eb4b8c992f09152470ce944d77", - "a63a5622fc8f50c741b4f16009ea2de10a270d0c6d08970362112ad81b87cf35", - "640910da0a0da34447f5c0c66eaa625605c0e86bbb67df54accb2a2c71398996", - "dcaa3da707f05a73205de4c41a9e072111eaf61ddfe48f4ef81a20a6063a9215", - "bc30243d3357ad90074b500e37842eba8b1030a269a62818bd55aef95a8b8b92", - "6e927f4b2ee61db488c3bf1364b6eee5a5bbabf8d905781df97906833798a07b", - "34d158c7c243d0ac545a90e2c8efa77608325d1a86af8827ea3887a9a0acf8bb", - "ca73f6307a3d0eda702daad5049294ca50b6f0e0ee6f2b60bbac0cc741e7c88a", - "cc7e48cc51a2ca0381c68d78c7fe3fbfbfbde7409719f8df7380e0b12ddb308b", - "63db008f13476b589c766e7f533eba19f60313a5c77f08f7c5002fbaae2ea995", - "6c15dabe250cb564c3b1bbf3853c1a471322a559a9700e6e566f380a415639d9", - "3162517de68802d8a63da4562f52f34a82bde6905f00ab5a6117927f684219c5", - "b97f6b790ea63fad32d25729d5bf2edc9aa85a487fa8e90c27ab7f9aa3464607", - "0767601c28fa37ad7547d126e97a62d2bc6ef8310f4edfa7fff8b16539b3c997", - "124e2b5a4b70519ca77e7c1f75eb8aedb95724e58bb253d9f65aa4c383d55113", - "daa82340063030b8dc42030a28c730133d1ee98603d9eb6d469022fa3f57410f", - "c822f7db5e8da6cbc146e5ee4f6fcfdfa054ad14fe8cdd384122d2184ddc9199", - "007b2f782cc88e5d1da3a6da5019bd4aa026b270b0a599a8aad9bc263c1f947a", - "755af6066465e54b105b76256449f15dbdfd8616bc3b759164b2e7c0c0b7e0c0", - "8e0f9cc14dd617ff453d96556e4c89ef017ecc959bf17d1a1ff677a7d9056558", - "3856d90c3341ba6d34ff6f4ecf3b2aa346bef18722b688b43f3a741cc258978d", - "f4155cfa8218f506c1dd550f110672ddf88024d67a5fb2379b170d875427405a", - "1261e0269055394cbcbf4f1c55f8098d6fd43d002b48d2454bffbed3ca798f00", - "7a68b2a8a9d42f01030b1c53569651398785b3f18cdd99ee87fe7f5dca5228d8", - "7fdac30a41e3e4ede01b076ebcae365697291e49001c3c50642d8ad2a4a399af", - "eac2c3f563e2770f465c940c5f73131e0c2dbb76fb7b204ca7109d766ae70528", - "c14125112da2243a3aa38202be01906af713ffdcd5f788bc87c62ff82dcdd25c", - "f83f3ef7eafd4e1be5e994deea78ac27e052b2625065bb8e856a511cd4f83f93", - "9dfe76461fc793d3fc92bb5ece55ec24ddb4c051a8c52ac719cb9df1fa7c5962", - "0705bea2883f58059c861007ad28da8d4c661046778946208a6dbdadd5e47133", - "4e7b00647fe36d90116b506be5f8704111e4c09b22a55b63b3d2053d9dfdfd84", - "b82a125d11b202097df42a7f0713eaea05c1b4b21e0bb6564b632036ecf5e673", - "e5c25ecd9f9b827ac592a9617109e46025fd9896996faf809474fd59733f379c", - "5d9921a85eb6234747ae2d5f2bd01a2d042697691cee037738fcfbcfc0df09b4", - "d4822c09205faf0f5d6b3280daa7df7fe7cef2303aedda782fb3c64bb5403acc", - "993561df95d3edf649739d67f7517596100b46d23e3d9add44f92a35c4254bdf", - "98271e370f47a7227e2b1e31648c64f8fffda37b0ab4fb22785a0245b982ca84", - "bcac7417deb42d78729eb354a04af443a8d31f1ee5a9f0330be4af55406051e6", - "78bc2f86ef275e406c9d833f9080e7ec6d03cc3145f7174111f25c97fbee8f30", - "c1dbb6f2470759fe6a069ecac2606438486b78a83eb308c7b4ad914c277fba1e", - "c3f84cdc0066266e2a5e3382c77622164ccafcd0dff85cba7df04227b2306c35", - "6fb6b6457f7d1355965eb2506075eec2183be79a912f602c0eede51b2e6a31b0", - "a9a3a2842f8ce5cfb8bb3752337a68419cacfdb58ed53f59a0a01e76ddc98412", - "40f6f8109c2fdbb11dab40c6225d69bbbbb88f3a4912afd8da428fae0868869f", - "43523865c502fd41f8f37864279bcdbd8f59fb4dd301d7e732bcddd9fe92185c", - "d46afce3cc99bceeddf7f7cf1487dc76d79bf4b03562c3200493bcff920d411b", - "6468344596f4e9d0a3be1fd75a954b019626986a36b9f57410edcec38181c548", - "f1de260ac77c03a957733fee52ce630bd400d98751e22ba4e23b388c1436a136", - "eec715fe7cd2f9b2e5d3ce47c107a26f06d5dc4a4d1da7f68fd9570efb7e1ef7", - "d82a60ee7ce705a376a8655463640602c7595e012308dd6d615636ec6dece015", - "b7ea9889570823d5a79e8a5c999b0297f3d43a53199e5daf33089bcb6c4ab5f9", - "4b661232fc6118c8f3e1fbf411dd7121169dd150605280f9caa2a1adbe69af80", - "edc9fab0f18eb1f96e8b470ac8c06ea5287366518dac2c7980ae60ca4cf57d55", - "abd720ff9699fb3e020f94004c98dd7a5196bad9d6bbfa9c924a2709e9a1b018", - "0ca9aa2743da8bd718e594d907f2e020adf0ccf303bb5c008f2d7da399c59df1", - "563847d3f2ac869659ac18fb81864363ec8fe81f6671a7a43862b50d8e8235f7", - "e4c0beb5dc71c90951b70c0a08e8293835b2f7ac817cc37031e258e6513fbcca", - "952d48fab11267bf84d4e7a60d3f3666cc0128686c4d9145dfd9373b24a4b837", - "2b7ff9c698c4e5a77b0c1ab4347c3ce1d1556db554249a5e2e43f45c9cbbb708", - "facfa945c8b83fbec06d231d6fcaa160e387c14826b04fcc1e73d5de7e05ecee", - "8d2e121bf7b2d6a425cbb5b220f99a2ab99c6c221394afc85acfa16765760683", - "2d91a3f87febf4de199cbe4f13eb580334406e1acddf8f007ddea43746b369ad", - "5bb068f67508700607546cf8e832fb4ce213c149464adde6a5570dc1cb458390", - "260609da2385be7bdee62cd818b32330f760423f8c79dc842585a5cd930f63c4", - "8c7c7cac3a108b88d11f894d825a9234dd2527439266959e4eb55a3445f73dd8", - "8ea584596e3c75cde6168ac45ccaf788394bce3d6e8a2e2759562ffe5736d9fd", - "15f64beb26787cd04dd24661285bfbd24e32304f085908446c2f2becf94451be", - "313572ff568d895999da32d194c809ee7a2d297174d5d1b4961913ccf099cb80", - "bdaf0bdbe7b7c90fd3cbf89c7d8d4f50628b6e1e1acd2482126882b6338818f3", - "424cc8ce70c93394cc0cb14aee4ec177d7a820d083150e250c752c0f249aa044", - "30be90e5c89e35b38d04b9bf2ee4944848ff0e396a64b29ddb660a4d57a187dc", - "459e8f6f1255e092aceae17997177c17e4022ea70f935a7f00925f83f8b5bfec", - "c8860e72b4d8a558cf5ee2de0c422a9278de0f068b66e08b52614ff9fb5944c4", - "df5a092ab644603071fe0e3c0448af364f270139e5d209e8c3b8cc650aa2beb3", - "ebbce3665076ce2c8ac01a033f2a386425f43b9271034fe31e1cf022834e37df", - "b97beb07596b40025e5460d63a5f168f0c64987ba4fc36d150918e71c3155033", - "b5df6d2a1e50b21437041d4bca1306f243424e6cf43c7293c9aa1bf8ff960c3f", - "addc644d70ef96ebef10c50a952ada404120e8a306ba2d25efed91df85f3ac6d", - "052f5b8d329511c6b3c76fe14028b829f3284eb0e5d2ef2ddb49c9866eeab344", - "944c10bc62d33fa2f6279f8c17834a961281a628facd5029028d70090caea518", - "078eedc721e6d8ab25f6303b765ea8149eb8d92c5960088ff3d17d5de921f5d4", - "8ab640b89ccedfa852d6712e72fd49e6ffde9568d11c8a9c5f63c2a49f9979fc", - "31874e5a5fdb79565a14d5c1933d10eec66430ed9cb2f2a240d4e79c451ced60", - "f37f1a1a5b38a89cb1b30dc86bf0258fd6ded8b4a2641ce820cfe8916e38c8d6", - "b43efa57e1498eef43e5228fa9d9ace9bf7b6f190c29420258bf81492b936545", - "9d8733e2d0bb096594bcd4130c8f0643e8df0abbd9bbd3cff4d71da9becb10b8", - "a6dbcf2418f015c0f41cae5c52b4582bace4f38a2eafe6c9c530cc1641546d1f", - "9586299729517a5c74e70a34a79fe0a46f8199b93ce8402c6370f0635134adc3", - "d8f775b7b35176e5a15e930e1875dfa3a6e54fd04f08880d3d0f4e4ad3be6352", - "41c4690ef2adc8c1b1ed8531196758ecf42b3c5d6c45b6a2540fca4e332f4906", - "e514dc649153a0660a82640c1f1bee7abd015f8bb77af509430b85b546ee80c7", - "7b5bcc57d136be45e63c19dc86d852b146ba43d92e8e3820ddf53f5ec81f2373", - "96baa6997ae2607ce6d76b3a627991cdbe06c4cb435182d6a2efe92c37e36c10", - "dd108c271d2743912517f5fbad44aa55765e234c1395459348c0d2913b678279", - "c2d3f10a4b5341ce1fd240246a886e326c091f05ed9c95de33638f392971fe73", - "1c784fe855be1cece3c8921c61be65554724f0a630a677dd9c38127ae4a3a75e", - "2ef189343d671683f8a4b8a9f9a83bbba9c18a1bd1bf6f19df10b6cac8c31763", - "b8b1d594e5eb4b8252f437b1925604ae07bcb5c1fd663ffa3d566fbcdf39872d", - "ed8c2c3de31840333cc7067aa4bc9bd3c0a20621aeeac31b1f5b91f42de0dace", - "34cd912269edf2cec30a476eb58fca5c2a6b650923a52ff5f8e81ea150ca46de", - "2f2861f6f2f6bb43fbb100ac64f97eae3b8fef726f5b263edaf12c066ba2a2a1", - "c0e3232ff20767c5c58710ccca07872e0831fd0225dc748ac5566551c07d3f5c", - "49b109b0538960d53a7734247f4e8b3d29c1caec01d6499d37dc814f782afa34", - "63ccf19600bcd7af4eb4cb08dbb89cd17e7d2377330471a7da2e541082d252e6", - "35d1bc7ffdb3d0338de186976b9216d024b8044a21a21fd13c87f96922e8862c", - "cc0f26424c16631bd016a074e11828ed5a5711452745714bea01c2d2f9db4f90", - "8e9338ffa537c36d0dbaf5515cd92a6d71d6d1e33e2668158d101fbe505bd8a7", - "6300fa7a09ce620496a61f3a13598b01023fc8f9dc8ebff43dba47b9f5bc0b07", - "2df95b79fb1bc631c3918efd7a950206cec6a84d387466be4cc2c60102ecccc9", - "739666cb92eb04d9ff6b53e17a1b5b7764e96b0f20b98ee83c80c90b8f21fc86", - "b49c14d389967f46bc8145e924d4def926c84dde2d6d5652e4e4de64b7a1c91c", - "efdbd35a1783744820f16a972deafa17c65b85c02eb28370f926692e22a86057", - "b393dbd0b765d2750178b7a89b6ca3730bcfecb4bf0644cf6ad4ef19922977cf", - "190310c177d85dd8260142542a52fc5fffc20ba3efba837834f979833e468dbd", - "807e808870d4f917b1d2503c23b42c38a76e9675be91e81f330753fbb829e8b6", - "5137901cf39063df3f66651c8d4b0984987e4b14b6142f071178a571531c3288", - "ec60aba3da75c7e172a9eeb6141185239271f0f9dab9a56fee24e6ec652a02fc", - "465defdfdb83e2dd5e05da5a12fcfb972c993bbae1d56a04c771c3da957921c3", - "cb99b5bba6098b8026fe1077ba3e71da1827d5e8381e7876c9debb8184812492", - "46d63bba0958cbc4411e1c018965cdc29dbd9660da360fcf1ecc3b254a43bc3f", - "029dbec26367c6b30295d8a40dd73631e89f2c8164b085876e2415fbc7e8db9e", - "ef9fb859d4fbcaad4f364e2a404cc8b45497c5d177a0acf01428ac8aa1df083b", - "362b8751b68a8fda9ca570e6533b989ed1b0e498be42ed24e77c01e0434a405c", - "1b1a1a468beb1cfd77833908057b95668cf875c817ceecd6f00c2c602eb6a68c", - "4bd0452670422d278e7654b1a3079265538145ea39cc38cd455b8c34984d7eca", - "b212efe6d8e324be32558970385e118c6036e8fb05dd1765800d79c85e127289", - "def9f4b7f91b25fb00440a717aa442bb0930869105911d6837ad6d9ee4d26ef1", - "43503722badde9116253d24404e79c28058b35c8038b2061404e3942f9c7372c", - "818446ffb138154ab68937aea2c6bd2589acac8bfaf6a70e1b7ac9bb4eb030d1", - "3368a8e50331d7cf11414604e0a1be8fa08c9016e176fd83c95a487ec1010715", - "08a1c6ea5b6043dfa9273441ca69a2d1a77c7da94203c0cee4e0df0bfc096233", - "54edae4eb6ea37c732b6a521e0b079e305f9a92ad22e1e9c1a708b006fe7db55", - "c657d763f2fdccda7dd2c6fa4743788fff65f1f34a147f9d34b731f2f194f889", - "4436907635be03022baf39def9721c034cd264e91c560c9495b4ab289182da50", - "c337163ee382cb661228b300a3c980710605dfdb213d659311bd1d58c5034b7d", - "282206a057aec66b7b593cadbea63fd4e28fc3076ee268670a338e9c928e6ab4", - "926216499fe6b25ee2417641fbddab8290fc7dacd3b0df43712e87ad85174cbb", - "cc4395fed24446a0973d3797ac3d99b2f34b07bc35c99a4c9b81646de0904554", - "4aba2fae0c9ae147a732040980c6e84d890d0b9f0b7e03488ce4a4d5aa76f352", - "f4c476a9d167250b501814a704fe132bda30111372bd5d63bb9cffc83e3b1ec1", - "2466c4b35ce0bbecbcd6009b0f7317d701e84f05a28e9c7a5ca07a87d50aa0f9", - "315958c6c3c872a7584fbc0838c2aec41c0d3c7ceec32e0b7f46ab69fb8c0507", - "0be12d58b5e05b4a86e207a8144356184506377ce0dd45970ff02b6e11e282a7", - "ff128cdb41248f4f5311ca893adc918c5be6ee2461e9e312e86c55bc734970f4", - "8e1a5cc5fb4e08b269aa9286aaf8919e78cbd0dc63256476155a2ee4a380e33b", - "a258dcb475785adcf2d60a274159bdeb3a1c3288aca3f62eea21bee37a074877", - "7fb7eb5cae36b5ed55d84beae0985f3a7852e86de4d8e7c415288419fd72d867", - "513911b19c3a0e19de4f67b30d9152ee7467ddc576772bf5c49f3d6edc5cba28", - "df7c57c80590af839bc47256816bd125cbd0ce82076c868a95d1c9bc5b644a07", - "9f58c215c4ff2a5a3f46faf308ca5c2a046258dc61bbca1fbc660772d989955a", - "0a088d5a65277b2c11a8e095b1a83179db5f6042e8ad535b4224baf272f18cf2", - "29b54c8aab2edf1bc6aaddc4f26bdda8ec6463a474a07d7c183939075fd88f61", - "3088ee13a9beb2d95c17dc737a27a0ff95558eb61924d10f02ff7a90fc494570", - "a9da9cb339c849774f4314d1de4367c0feffc878bfa8548581f90df81b1a501e", - "9d6338e695ff21fe738c4db04acb4a325ff441923fda728163671bfebbf3c673", - "2622114b9c3a57b6c33f1559f6b14fd90a40df5510f015d1bb71d30dc802e02a", - "5701ddbc6cc690bec5de9d275d2bc532bfc1d5ae2d3f075dce3bb9cdcb1281d0", - "b70e95e1f752880bf9ae0d1c36419d40a3eb07dae648db305fca6a9d1f57ec4b", - "56a752ce13a1ec5a2641594c1d18969489e86ee28a1cee72102ac99866e741fa", - "a3c1843d686543e2c38db085516a9abbe60d104e415663005ca788f4caebb141", - "abd472fccde074bcc05888e6ecb43b7d443afa79a6fffb78491e4c6aa109864a", - "78abf004b3200e5990e1d3cb4e3e580131f1ee5f2147411d41818720637822a8", - "47ff6ccd7b64e77855a20d5a544716ec8755b0588c949cae8d4cde7328cad949", - "6cf7f879b58140b03fb9df58da4f723741870a2a6f016d3d6c475ca4f5a3ab9a", - "128e503c8e6052d598fd85b7117bd2767964794061f670b6a60d9a1a494d2a88", - "48ebec27521fe8a5f90130e9bd42821edd9b1e64148df9a79332b97cb6a0a46f", - "a9cdb1c24e0a6902e451ede441171d9fe4b0437874021691f6f09b9fa79510c5", - "c217f4e455921d7a1d760561b766fc8f2e7dad0a065942fc3f303665ce63a0b2", - "22040c06d8490652562cf9f47a90053dbe2c0f4472e34abcf541c52f86b68482", - "62d452b4c27071ea20e4f16283d57da0b7630fa3a7d4670776c46c2c3a32e459", - "6157a3a68be3584b1542adb67ecacc5de1a1aa6f34d8db55e73e0264d5d5a110", - "ae10eb9b9aea4a053e5f134556be396a697f99d93d7d782008d06e17af727d40", - "10b3875aafbb07b0ba95e15835a3eaa6b2caa8a168a331ae6e233a509caff517", - "9644ff2e89f9ba4e4cb348d53b346a2b4cd1463d2575192027ec14ad5e21cc3b", - "c70e586dbd919cb73444ff85a0ab6199f16cfdf9ac2784cd0b201072140727c9", - "44cbc1245f12a35c04efa2728c61f8098d60d126c488fc53c641066fc357777e", - "be570b506424fad917370f80c25cbf87214178b383b7ff8c7f18bd9c700338b1", - "88c95d68f226499356cd2fa9c345f692d461001b0bc3397f6ed50b8711896995", - "76d5f6837ee19ec08e6d4b9e29e1b9e289b03a33bce7cea63e3ceae503098d2f", - "18b4a511a7aafcbe0dbc5318b53bd7a48b90393feffcb4eec5c89671076c109c", - "7d4c90c272faf6375cce1b7965b836d4c731d723c83c10d6d2f766a4cdad4e11", - "ec101636c8995d5c7fae9eb97850ea406071a80ba083e5a6521a0be12c241774", - "c2b4360d28b53aa5100e2d8de45b2e50534e4f8d1d94bf983ac3ec356bcfa113", - "4da3eff3672d6c2693985777a8cb57ab5837e767c38415fe9524f919b0c69f68", - "18105acbe2d92566ec860bef12f10fe4d6d26299880dc6d10588b45465e8b496", - "9a1d31cc5846b4138d5ae932b7717ee3063a1c3a83cfea14d8e96cdd418db223", - "0c6169b676297a424d738765cd72aaef6105cab2a7c6729d2ae42aeb3f246d21", - "d725a94c411b129d3407569b6bfb22da019c3e50854a25f5c3d9d35f941168b3", - "57a036bf04be3fee74338d96aff330a2d79ce3f3609291d2e7221749c0e1f11f", - "2de45af7289e551c8fee7177dedb3b8fce31024dd94c90972a42e410a216af31", - "012d5629f9818f1e45e6d46ee537c73de69e399846cef28ecebe4dc9f50247c0", - "3f4031df0c1586627414888d31d71755744eff8f555bef5ef20305981d8c7d67", - "1cabb7b24ec4cdb7f78897c50730e173d902e4eb81ddfbb19e825ba7a4f65b81", - "dcd4690178092115054f008717fdd3690af6f519f7b60b3e594c57f493a64c31", - "0cea68beb00b959f8908f0d3097ff5e61dd54c6bddd88332c2471a7f24c24302", - "10cf3f0eb6e1d36049c8ea169c0fec3c9e9a31f98c0f7d519be8280979863332", - "7dc4ba83d943fb9872de4944b188d88179699e325be831c7e51a998f6c905905", - "d53aa0b135aa0dc666c3b420d117cd58a444c76e10f97ac6d7191bf01090e8c4", - "47569f686c90331f0cb7a9bc410ae357d6db911071cdcc55430b9d7145200304", - "23427e2e9e4f8220da4a1d1cec023244d027ed4e441e026be48cf9cabd440cc7", - "bc4f298265572af3bb4896c7d1365aff19e1d149338b3300e25a5b6f36f7a1e3", - "2f72a2ff495887f2b8034c689bf1780f33db3bb66d59b347db96902716f2e174", - "4826e4ee5c109b6832df600d83ee1896a5011b0e1eb065ef02d8e9f068dcf0b6", - "cabc69196409cac105b510d168eedb7fde498b3c49e5316229d585168b2228a5", - "34ca0aac53276ff21d35fc496692c1b3ffdab1338e3b1d01017d734a6ca73018", - "4e0f8fef5b9cc103036b1b49bfed809f5c8569181dfe220344c19a19d9349b0c", - "20962274646ee7c732eaf8c86f1496e4f3fe7ab871196071214fb9ad556a4dfc", - "31cbc4648206be0c72dde5d0905e812faf6de1dec61b14e74469ed8167420324", - "2b6e4e1bc89dff104205e9afb9946263f5124857db45149065d9bb3ff122f02d", - "9e745e4d3e3b9b24c125f089c96f4157df4394c8115eb1332d8cc3633ad2f31e", - "a850b1501a13176278c41dc38effe9741f429747d743902466b6e0b131e6ced6", - "4cfd8908912a2c6ca47e1ff5f932ce1e927f0cab4362b17bc0d706c111b480f5", - "4334b1516e7b11848336da7dde3898c7b19bae61cfcfd47497e59e096a75b3d4", - "16db5fad7b1fb64c3a64568894bb9bc22ce09fb7cbdee9a98e3b1dcfbb65469a", - "8d70e49497acf1f6a9b16fc36f02276cffcbacab54f04a4ef90b55c3130bd088", - "55b1234f86c2b7178b95f068e68056f09bc5508c25b29bb915e71639af0ff3de", - "977134bef158f47e1724c20a1b7e277b7c7ff22d1ab27494396700992d2ae101", - "ed6d9aa8badf92f918467b58081ec1d8a689273b19907db45bb819b4b6120f7f", - "df9e3a9dc131b27b8200015ed3c7786abc5e016b97a01ef50b0b313e86e538a5", - "f79ce55fc53fa31daab628a76696e3f447fb0e84ec088cce40c4fad14e79fc96", - "4bc09688321fe3e99f806f3119bfb7a3905cb27ffedf6da60930366bb9aeab11", - "8b25f69e638b2a264bad13f035cfd08a49185be5ee7384fb8fa18513a60d7633", - "7fb239cc9f892c803be9f342fcdae6d37da3d07920a892efaa0b9025b668858d", - "ff90009c98a65735a398c092f869b6b2ccd80d0125a9cea895c827fd3b38913c", - "69e90c5e1aad55dc43721135e3feb8a636e7dfb6464484259e249ddcce4a4a84", - "d049aeae554d4752f6106275784739cc35f9246ee0c0b1fec9eb863dc7499291", - "60a9c17f7739735466c8a82dbe5c1dab4438447e4de90da747dcfeb682d55073", - "7f9b349220a4febb1501de6261263fc3432eee3973fdcff8196fd890ac113d78", - "9c8e9f3a42ae2636c1adad021b3201ca46677b3a90edc1cc99e2f4f8721e078d", - "d6bb035cd250d6013b57933449d911a9d27f30fbd799a7e7a53a03fa46914de9", - "05426031487ff7557b90c95888dbbbf9a594827aad147e38a8d4a115eb1c46d4", - "4f8b8d45b7dac0f18ed1fb07b4b7f06756a786ea96f914f6b1e5b8a29fa22c59", - "bcbe0cfc9c014b73b998c31209e93498193877e40a2cb05847b18ceffb34727b", - "4e4b82eb7b8832615c210e7ae77b685e144cd38cf5c73c7367a449b221b3dbd8", - "4b6363e85e2c46df44ca5d40dd86cfbcd0179bb378efd6ef75eec5e69df0e11c", - "451030160b11fb41482697f3a428eec64d3c4e1d15ae8d551c7c8fc42366a843", - "d89d28a00ed0c9ba504f0cd9ec4f99850cab69a68c197be4824eb37545c84269", - "1a3a8d1942c3fc568ac06523be5b811ebf19f344b779c79818cfbaaf6483c625", - "a48d9590a6926eb6ab8645b708dee813e01ff4d31b17843baab22f5a6ca71313", - "85aece12d07e7dfb7874a663bd15234f486b55816013e77b9a3c30469109fd75", - "f33a690d881243338dd690909c5a33d99fe3c96e08b4ba3d1ed0f40ba7189d75", - "d9b3005981a359c3348e946fd1d71a0b7552afc0e5ceaa7b906670f2b3562e0b", - "8460df75593e0842149d25f7542da09ea8749f6cc21751526f953283fc4da7b2", - "4128ed3309a47cc692741475c0171d135321ff82213af4702edc6caf6d409ce0", - "4b621bdb1cad073d639147e87d228d6b55263b430066e1d1128a2dc10a6bcd6b", - "e9c03de1c2f96ae1a874c01713869c3014d3090625310d4b9570f0fa87c7bb1b", - "ea848fb9dd1c5cff183276d38f26611ef2f87506cd6ca6aabe8e1d98a8c47ad5", - "33953f3388436b39dfea2fabbaac4cb74b9a1e0afcf51cadca4775a4fe41cb07", - "09c86a2b2a1c47410471d79f8aeca6e50bf884bf800ab825a7337729d116e5b4", - "a4ac8ac76fc90ec357e625618750bce00a48369751557ddcda25c626809df1b2", - "ab8ab7a6fdd6396e63cc9415e1353b0c995673660a8fc51a4af721f7cfb70248", - "bf7baf2456c06676b66e1471470d3a34e521bf8dbb81d6a6dcf6bd0100d7fe3b", - "3b6c1d9ed18a6a5aaf43b941c2026730162a8dbac11dfb0c36a4ca661f2ef3f5", - "e820ee113d7ea59b6e2f852dab686d0bfe041fa36192461386ccfcac18bd1b4c", - "33f0737d22e6af8cf30c529371fbf8d0ce124989cef173bbd705d8fd404a6e64", - "dad51956b61ccf2ec0ebe4e11dc3930d003da70d3d41f7d4f9752dfc072a6f04", - "6973e70ace62c5b6a49d7f7f497d3cf2078261de1ff0862a72a2130187589cd8", - "432992fb01134d09960712adcb2e5a9aca40dda8f4bdadce5002e848fe35fcf9", - "034353fb48125ec90f01283fbc946fa28d304b9c0a1e323bed5da997dd6055bf", - "6c7ccad9346c43ff091927be8db9b3ad28ad86ac72d2b154d6d7fc08df8cabf6", - "ba78c92b9b616e180eafc6716ff8e8c9414b266a9d23fc1b62f2fa80882d8f0d", - "0742e14b82484ba3cdc36576bc876b844528d2dd5371355b2688451ff485cc64", - "489ed6440886aab6bbcd76884df25319de85265188faa76730b1ac48bd9f4a9d", - "d7787f6d469bd965fa8cba2d4bfce9d8679c5a1b8ad91f5d0872455d12f1a2a6", - "b994401ec0bc5e3f4f349d17752423fea2aaf4783385aad89cde1d3e7fe1f33b", - "64f88a57b3427755c2105f48ef991e32b16653211940e1b48f64fc65ce0e8fdd", - "989248fc4ebfeb03f5646f6d49d5eeffa3d2b864b4e4efc6f297e4102bb93009", - "56e892fcb5a61f09502ba67ed599d4217e92efc11f2e330e23c9d389d7a0fab8", - "5ae7e0fb7dd7e433e676c6bc7cdbf5f320ea8803774c9d75f79f4432af067376", - "9f4e976ea6d5dc8a52b487880b32b081b45a9296292b1d970c29c038511b069f", - "a1d3234c1f373559128471c5965f0e6418f049f63c93993b7084051644382f8f", - "8b724ca450fce90186d454d9a1a1b06c1e1d73cb683fd3d8e460d02e4c89113b", - "f532b265360f4cdbc87b4dce4e87f2c63202313bbea5d005921704b1803d098a", - "80aab15452fc90332d7407bdd35f70140c17f9d145716ab88586aa1ed7357820", - "338978e6bead1a655e84b925ccb088d6f1179188b2d83a5c7b69de73a9506141", - "5ac3b37e4aed4fe60086432167867172a0b9f8bb18d66fadbf2cf9076235b518", - "bd9306f8dab73c3ed713138a970d284a2858ec79ef77be6e13e5403a190ccc17", - "d765d89babfd01546c7a3251ea49e7e6088d36863d218181c17f8d492f252901", - "1dee4cd4c4b6b94210283efacd2a7c1c312319f08ed55bbd9888d3de6c419e3e", - "ada3e539037cd4a5ef57da9be2a2931d5081210457fa23786a6aec62638f9bf8", - "1a3baf5fc7142ba86b0b98ce69ced9928d2ab4b6af786c4da29469ccaaf1fd00", - "ab4f0259e3796ff8cd3972cd3ed1a8930139cb3932a6e55c7ecc2f649a20e7fb", - "c98b4b0a8f796ccfa47965e8251d930c73b9395f9f09056bee905efafeb9f673", - "b5a519ba06ac43b7a4df45937f9f204643f5516546de7b1bb4ae14f5d25d6853", - "bc48cb9a0b7121e163bd54c1e3573a57677ac480711a6c2647aa1c8f00541108", - "2f235a8c5002003e87b2bf7142c145bbc52e0d1b820117a2d7ce970b69177e98", - "8c256b5ef1fd22e3961fff984a6c6c7327945ae3e90ff1788ee46eac7ff2c926", - "1174135a6a5e5e3f076d3548e8cdee7c059b0b9f9fbaa3a3259404fd4a1ce5e5", - "f45bba99ccae0eca67f5adcb0ec5a06a63df9a3c7ea46068d3799a2f14c4dbf5", - "e30f97d50cdd30036377f1c97bae9f9fc3d502bcba85e3f7791e2ea03d45a5a8", - "83957db62f513997f09bcd16806f9d231636713b8bc7fef772179088dacfa8fe", - "8394cb5730883c23d1dd1f8ba5b141c323ab740357fbf7df1856ada3d89c7cb6", - "87e2100bc9dcf7ee3aa84929874818d746aa609ec5dd6555e4dcbbed0b5821c0", - "de5a27ad4a8f3eff5fccebeac7dfd883b6a4a93544fad831ba44198e54142daf", - "8c6aca1ecf1e30272cb27ef76f4c423af5d2102e2fc4e1acd410c69161274a2c", - "71fbe598a8e6d9596c27e4ca99b3ddc90ed2553de45fce6ce4d847d92491e7b3", - "66c84ea1965e21ec5687692ba002e74b55377d5b2e865e6e7e130475455de88d", - "23bb0e9c2f939b8aaed013f2ce77d1c0db813b8559eaa70c23f1e7d97514be2f", - "a93b1492d4bec5aa45af2d944057b509b30ea3c6a5c86ade0246d37440279793", - "12c2cfed50e56169e2be0786b6df840d87a1e312e58ebdb72c9e6b1fcbdbbce6", - "bccc909f9a53c364d56f0ec5d6d4596f50e5d76dbee8499809707807bd792843", - "2cf1022638a6993b12a43ff7fe7007b3eb380f6e770e6a08fdd990c408745a05", - "96000953e72a5f7520b6cb0e3e05dab90540ff2441949159e5940cb8ab1ac2f0", - "5d769d917d6e93d2959adff7e9cde79779c1935e4a1a14cc3f5b0444e4636943", - "ffb44dc844c6e01db89e299de8bd4cac36dd639eb106db3e54d1a6326a2dd6fd", - "992db1b05c0b882bd3aa109af5fbc9ac5478843b2beb2dc5f2a1f763b2654df3", - "e197704745bf09c59cd36ca023728faaab586405b6b428d23e597fb1624b8a58", - "aa89e53b850dc7c1b1828e05520f2643fa29931d73fc7111e3a1cee7d0b85aac", - "7ce6014f62be3dee5012bea7dab05dab85ac0e6eec1b1b97a0741075f6a9dc95", - "0e37c79c8629ce5c939d186f7f4ae4b2c563af5032b59b8e24b86255b7e257be", - "d984ac5d8a3a3e49639f02d0c63948d2857846fc13c1ebff4fd85b7635bcd14d", - "7c01d09fbc932467fe171e941d38e825d4aa9f7defc1dcf9bc5201740a9b8bcd", - "2e7131a18fabfce8465c62dc54bd394f7f2f7418f67d9ad81e53dfe0c11fc588", - "c8fe76c4da7d622f7d1fe4483771e2d812e52a75b74ee519962d0c81104cb331", - "22fc93f33f42334e5d1f6ba755fdf36bf09f6a107943bbdcefe62608895b147d", - "b7a9dfbab8895c5bfbfe7b380e87a1f3d0c572a41bc3ee52a09a8ec0253a850f", - "6316ad9bfc0b964ec9122eb4a8b43f96dfa5e1a80a35eb7cb3c7ed7fe608694c", - "1c207f44a661783a45dc40edb51c76960ef30d49333fbda6bac316c038cd5618", - "7ae4a87b424116a4a1dab899710ff690c81bea85ea9d3f004fc84822f64c9718", - "172c72976b3631accbfa8bc2190c540d4cf86455901640b7a7098d691922c7c6", - "df713bf5d05c18cb261960859555da5c15ebb88ed565e25e444a82e05a0b048c", - "3f6073d58465c1f7cdc38dd3d993071de724f5b1046cb8c331c0ecf4f7730678", - "7efe40b0a827fd3977edeba95b467f81bf2bc2d702f7cec80db4398bb9c5aa4e", - "d5c37620a3fcbefd7a8b45799528c0c02d95a4eab497ae8c624638ca959601bf", - "4ce806793c84c5d45ae393c4ad8ae55c096f8d1bd53df661dec61d6912097683", - "d08df52d52fe2c4a7588aa228f7202374b8095bd7752e5bb955c6d28cda1883a", - "a13c9dc98d5cec40b91b92440b8b1bca13d9164bb4a4ef77dae94086ce96061f", - "c96b23157a3166cae50caf6efdae4d1718320e048a171d807fa0be338365e670", - "51201b70c9c06ea5f3559923c712ff58bc9b82239ffb3ca2d941cf5cfa9521b2", - "9cc77b6853e2fbca56a971345296ef1d5ad4d126c71c028843d0a75746a69d13", - "0f18bf00e7a4078d98e24936a8fa66976dd230e0e7aec24b4ebe5a15b51a6d08", - "0ce1e059a4753c9205fa5fc604eae40facbaafa44c8470a65c135eda7fd9778a", - "be4a7c9f859d99c22fccab622afe4858007f438f552bc6e8e70454317f26018f", - "864586a511fb59fffb82eff5800f2be627c6b1f29f8caf6eb1b9d27fa9db8eee", - "e531b783ab1fc890a52cd82a109f3ac3acb1c579d1232ff1390821053fa38997", - "c58f6791c3179702dd06ef8ac57693a0e4a0ffb6a1e6f6264a420fadee563cf9", - "00c4bd08fa62bb3cd8d727cec18b30c1ace645c4d9a65d3084b73373c6ce2d65", - "8a4cef97170c7d527bfa2a671b40c26a844251f2dd33d82e68cf72f5cf1fad8b", - "2ddf1c87733868cf904b8cd0ab618071d81c91f62545ec5a1175f8b9973038eb", - "ce95f742033da7d01bf83528f8773c8af83eead845ff4fa16a238bc7cdabe0aa", - "b9b90c5c47255e1ca3391997df0eb3f7e9a7a7ec6e808d2860c9d6a26115ce08", - "df0e4c9d51ebd3be8bf425ddedb16e0c26214aff04d3f9ec98cfb3fe32841489", - "65979945296c9f604a836fb0341fae9a2fb4c83c363b421861818a2c59c6f46c", - "bbc5450968200ef7f26ec8bf7d0eb555056428311eb2ff1a5ed0c5780d5f4fc3", - "f2435f6e6179dedaf66991e1ce94ea98dfd0ec6fd9e67f01e50fc0ee07cf978c", - "c25b547cc89286e21ffe826df33e35955ecee9162145b3498311e95c557af7d6", - "1c32d05613c983e2b991b4f7b323522cb8e6c54ba6470c2c5715744e6fcc51df", - "16252d35cf74a69dfc530ba57a2af5647f2d35b2ddacb9a179d450e14fd8c0f2", - "1a40c30fa47f3971b294dd343497161e87a0ab3064295e4615affc6748f6e72d", - "aecbe16bef92717151b0109873747730ad90eccab5e49ee083a87dc18657cc3f", - "8bd56e3b720dcdc298e7c58caa46b927866f9008c3235a7dc8a51212aa770674", - "8b45ec04ad5c8fa8e76bd7f0716116a52bfb65abcc7a6b90ad6c2d16167f7c56", - "8dd19e90ce979923c8e6965d4236cd2cce79507e5c8e84514fba99171f50eb64", - "f4bb570625e7b700b79451ff5554fa030a2f2899ebc85412caf72c10ddd4e4ab", - "55af531eb55cd16b56f702aa13f32ee9cdbee25c9854d01d7aa3e5f3679f959a", - "da650890f41c77811bfc508912eb83bd3407338f2fdf59359de5d59120a205d7", - "d8146ec532d99c1d463a82e8e792fb52856909baae8f5166017de1b7df2155dd", - "e651b9a51c0313c6016aed2ec9008670de29248b1a4f370274b383b9afcc2d21", - "47de4a41f81717cccd6bce058246bdb7fe1e1e6d9eda53e639c83921f5cde4d5", - "7da88a7dd91590c9ebc98163c316975074a4462bb8cd94d53c0a8df4f712a5fd", - "5a100e176faf0228aae071c248c7ceef4ddd4d5bab3872b85b6e7550210079ae", - "600367bd49318e6735de67bfac6e297d729a614e83fa1b8a1a031c5de16cfbab", - "9ae43b43581791e685290fbfb10a9720b88d2316dfaf5e129b8d2e0f229496dc", - "945c950b2ff9977ad45d3793de9599eb4f2fc16849cf5fc07aa5b1655f8ceb6f", - "0187fb30776d3be6fdd1fe79b4498e4b0c5fc152bb12a8eb25267413f63d602f", - "e0b6a3655d3f169b862c873f7e18564eda80fd21a1dc6b3d59c2e9f6d25307ed", - "257bfbeb53c10edce9acb0bc532efeff5772736c553fb2481a9eba05ba9c6936", - "273780aac9c0d949953c67af1835916b7e32577c7db4a36ee16c601008b32f1c", - "6c8eb2067bacda70fcc055ac73118eeb8eef8a185e2b1ef4c64de550ee6e1c76", - "f2e8a07867bf2babc6e5c0715b549de8eae712ba95f293ec84cbe539712c1a74", - "0b824a21542983dc00a68622bd0d6640a74d113dfa8042b2e8a3b1d009cb1734", - "9ba11106de3c73400bebd7a654a2f97d1d44be5f733bb98ef6b622fee6fb71e4", - "b34631dece34b50e808973b33f6f0397f889770e383dd3018322418265d95f5f", - "4fecc14e5a23c4fbb8fe5b1f27d02b966c243209bad36bb8c1b011e97d2e8778", - "23e98207d05704c99b486f9808e8c7f0bd8a0e5216ec57def1a464ddadc6771f", - "bdad8a6f13eb3682c409f0f6d6fd46447aa0a7a093ffdd65364af795d5a675b7", - "6b342a536eecc73c036eafd8b53a30c38d27dbb990ac82741e26ae870f9d4baa", - "c4f560c172280957113c66cf5eec9a6d701640aa5a89c516ebe3cce65af939bf", - "946f2f56d5901985f60030b666189a4b76cc01d449f0c5610a1b80ec94336c37", - "81615672b044beca6dc3be60c3531c32a7037b4090cdcb3a2993fc71a86c3bb2", - "8d5ac9168df0d92759476c592b3aa66218b0bee234935f5e9eaf0fa689d91a75", - "f4e4af875217fbe4d4071c46f0bc2c734d57734165da47d3c040980f63bbc747", - "b5387243d647b5271797676a1b60e5b149a9ae724b944fae8e9cae16dfec8fb5", - "b8297499e08bc1408349c104043b1078c21756190d7d3c0c2807e80d8c3452d0", - "74081622a350c6ff3e9b103abf12ed26add53e913f0b6988b3836340f41e5d53", - "54c6b80760d0fdff18a5344f1b5aa9c70a647c78fe06afbae152ffd75d5cdf0e", - "11f022a3b7497d7eaec04a7d91ec77e36ab849c294a696a279c86a5a3658d34d", - "8a13a6b4f44f6a21dcd3c791f6fcfe7ac1f7664da18274bd89ecbc5f6f41f55a", - "c00311f5a1c236e303816b454ecf6bd93b8762738307918561f8e1bb4285a9e4", - "688a1dd386bb872c6e463659e5697c9e0482a1a8fa3f12154e715e5e02262859", - "81c917fe77a4d376696b74a7e2f46f208dc7a12086124ee2cf0f12aa0bbe56d7", - "26e47a23627d5a835341b7f769956b1f2c1d325a205faac6f2047689564f2a74", - "482fe7db82ad88a860aa4305eae2d733fee4c03a47e5a33a7f6b7437ef663514", - "e682189210a8b4e59c82c86c3afbd4287e4dbd0f9eaeb85c62e77afc50637f2c", - "d8e5a37566c2446ac515a177b0c3c968cced9c8573b932974a2e2f6d9c745aaf", - "2ed9cd512f9a0e25da3a97e952ebecba0e2c17aec58aafeece311e7acf9b69b1", - "ac18801abac5ba62b5344293f4e8524a8611b1225d84af85f1f8b0844ae28299", - "0a981e887e381e8f25cf157f21cc975f1663374626968390e76a7d01863333de", - "8ada9f04d7bf050537af738ea6c3f75907145c6a5f61b9c1830e5272fa7ceb53", - "9f5ec4fb1c3cb5523376478ad847840300d40bfcff4b0d471cf7291d161a1226", - "7807df25ec9dcd00b93ecfcd0660086685f212a48a454f21e61b280c7bcceef1", - "ecdbc0e82fca96b749449f764d4b5b04924befd701c39af38a922ec608f06419", - "7e3023cc466a60d0db8ffb38b3be832393f025ce664b6a73a9a86ce0da469cbd", - "bbb12d698d4c3e869710e9c6af1438a8bb9f160753fbf6c5be9616ea2502bb00", - "ae9b88b38d5df353c8ebb611bbfc0795d5ee81ae2c9b197feccc8997b3e88136", - "1269c3514215a279ea5c145cd585c6947cee72f238251ec4dae76f2f28dc3f40", - "4362ddedf1f7a8a2d7ef3b4f47c907f9f22b953ce7a12cb4b1355ea72c90545b", - "5851313f31b531fd440daeed2485ffac1f92cda59e6bb4d352c4720aaa02fc91", - "c9054d1242fd6cd536fbecb1c0ea8159e650b9e6d57c62078efd2eccc16e521b", - "69b02f983a274c32d97ee12a38c8061b4688cd26f25f40c91ebf74457e6d0972", - "b3f2d49bbb467972512e9df52576801288a19416e2c3fe9a88f8d7f5849aa973", - "b9ec455ce85aa2d87dbbb2c7b46ecbc0dac78714086b4bafe0a50ba6ff6e9c83", - "b1bd5076ef6f47acac0056995368914973f147fe40f47faff0c4f1412c54a770", - "efad92598c047543f1ddda57ab1312193dc37df3efcadb5b58805d1ae4585879", - "4724a87f218454d07413b831d98f6dc35b417b06ed7ba208e49a1ec9d87e65ed", - "9f9803bb19c307394466f6faf73ea6b308f4dce3763490b6bbffb6356fdb3011", - "86854ea73a8199bff69efee072ca04c579389c02555b255f7e63a5f8cb350dbe", - "f87b503b9c666e375ce84ca3b2df0f69382e4c5331165ddc2241464b96473fca", - "95f81ab16959495d2c83fd1fba6131b6427060531747da63ca23b517d02fc31b", - "10a2792d27baaaf77f9c43ab4d9fdf190e157d716bca6c979ae83364b7b57014", - "47a02c4a454ef03a89b051ae4fb8df14b63d8eb4128744c68d529d06b1e38fe3", - "fa75c3f6679bb8f80678cf21f6431f278a586c1927b23357608c41756d06cae2", - "4601de9f3e81d47093a1f5b60cb1d90ef4652c1ee25fbd56e1ddbe8e15ad62d2", - "dbb2f5c4991b53f6c9a6bc297290a1adaafdb1774a189978c0086edef220d3f6", - "028d39022514d49fcd4ef70fdb91903422e1082f9f99d1ba365d83822ab2ef01", - "c401e116474e4a05974ce8f141336f3494a6d2099169a652579bc73295192137", - "2aaac19a445646ca53c4d066e345ced1dc1cceffe9a76c8d400872c3709edcac", - "728390a6888bd75c157ac14fdb918888840a18c9facca2311c276e2fb9888282", - "f45bf0d6520e48a34badc6d5f8e355e00b81a6ad4cf169dc8cc7ee5b6815fc59", - "7389236a5e4fdd29ed9adfaa36e6f92d2963a498853fc4c58cda965f4304925f", - "4d9c78c3e6de04f0d724ba3c67869fd6d88479cacc4abf38b2bb8870791fe3a9", - "d334eb32a73531f7098bc8d3583224d2875ea22bcb50a2f957efecd2bf4b942d", - "93015759556360908f49a2ba7592b291763db3e8ba7eaa0b1e3b5defb78bb9e2", - "04b959de415a0da898c7c5f49d34106f1a3b6964b03269ae3fcc31d1eb32068e", - "df9879edfd5991f966d0ad0a9e1c4230d1a49b05ce3b4f0312bda673d4443756", - "a0d111e9e88d68189cdd7e31d92b583aa21920fa2bda5d89d2fbd46af3aa4bd5", - "d52ac3aac42e841ca74e24b0a2979cbf8a0e1d369215285eade8c48db613f16a", - "4909f44710a754dc9f141dc28f9116cc7bb0ab360e919e204f01d15f08fe5be0", - "489462d7ac366db0830810766a626c0c5e695af1879dd457b8d5b02cad2a877d", - "4307a7059499e33d3f948e43a37fa9b72269ec6cc0ecfbe12248ef19444e5bf9", - "b8db8f8235a143985a431c88d13b91a589e5e4457b188ad7b8f4edabc2118892", - "c292910ece2c774a213775b08bc53e5cf0b5ff83787abde750fe7f43f417ddb0", - "aff4eb5aedcdaf8b6044f18af06a6c33f88f07b2998f85125704eb568c3d65b4", - "af98e03768f0117da1a7629fb00978b86b7777fe13b928e8b0bd675699a64f3c", - "a7aa4a190640a1cbdb0323d53f17e00a55c88957fd25555f2c609e5b44c97559", - "ca343d49123fa6d334a7951114baa950e84ab3038f240f789e2c85a4bbc7d643", - "4bafcd80b8a7cf570a85b5254feba1fc93a38ab9b1c1d083ddb59fa8228b79b6", - "ffa2c0436f21b828a5bbaa4bd9cc33256c36c2a8ecedc848474a77b6ed6d1ed1", - "9b8e50bdf0a5f39a2806ef32a4b99e4d14fe1ad51956bcf92c060916bdefe315", - "1cac04ff913f68b09216bb1a38a2d25790ff14d81de631bf574d5c0d0adcbfad", - "36c36315c28ee41601e0e3538faaa6f79e337de426478faeb9e9dc40f8b396f9", - "fe7ec629df863b58380a0e3c594ef2474c15ee222689f77ad59a65355372b228", - "9027b168f193ddd4f4c6cac49658040deedc1defceaeb3c4c6ee144532ac8375", - "209e8e2f71f6cf71920d48fa174281e27cd21746fd37dcd70a7862f6010b2ece", - "0852e8137d321b5a0fe9754977350752a9f90282b6ecfc958dcfcaf226950159", - "19b437dd4816549e084e08eab50879ce302eae1415151b5bd4ba99c5a29ef0a6", - "2f142bfda25919fb3aeeb799015e9ff8df8abb03a34e42479fe92f2ca7096e3d", - "66b28230d47eb41e4a2cc6fda8737e53f6de461eec925d69d37718fd9cec381d", - "a53ac3af71bfdf310156d6a1537a22b94554a642d165777f45f319c04a532f05", - "1891879c56d11693bdabe818bbc366359495911f90391cec257a940190580863", - "7cf9f73872fed59bf721e1a51e8e798f0557305e402b5e4194e02e73443b3ce1", - "6e9fa371916b424d9e6335d6be01446217a4d3d39ea3b7e5a01c2280fdb2477d", - "7959bee1bc3c3f76a5124deb2d0b66fd57f7c438cd8180f7b22d279e20db40f3", - "045ad31b574a4398d0f93b6758e430fe69317611695ca777574eb9913231805d", - "cb61ce97bfc03ac79e24c22588efa8177824d5d249ec2bf5da265c5e0cba57cc", - "a3545ed8eb311783bc557377af1807fde2a31c44774580a6c6ee7e06b859c8b1", - "458739cbcbf58f944d4fc55fb7724569a58a760aab0a17fd21ff2185d29c95db", - "afdeab55773ea84b55edb9b2923f391aa00864c6c6fe25e31a78d98734154994", - "3575043fac6b39e01a2a28ede1bd96783e23d8f92258bcaf64af93ce56390f11", - "42e4ce34b10e36b5b4f8311aa7eba608bf592d1b0133927387be03ae2f1713c6", - "794e180a29e8c889b8605f365de6e1723ac110f2d51375512ad0c99ab87d89b0", - "e620acc90ce3eb8de08dd0bb1c629430f04c916a4f0f7774b8292ee1e0ea6620", - "9b6ff441cec4dfcea5993aaf1ccf1fc28b1cb721e3a6c157821574eb499e89a2", - "9d2d303a16b0ffc9bc457f1ecda72bccb2a309d328bf362867c1ca4628305585", - "44da4b02d44aff3ee8d63842fd8ce63d86c5d6eb4ce1b5c85c9c5e72ec55ccbf", - "2a611913389d992e4fbadd0024ac9fa5bdcdd710abdd605b4741bd00fe11d8c8", - "05bb5f894823ae86f63923a44a9de4b36aa91d4d3850bb577200d6ed36fd8b48", - "56afa2dd7682198a676e7b9a98b99e99da29a54f5fad885302785f962415aaf6", - "2a541a1cd4260c2542a4dfffc2b7c90141861bc4ed7474154fb67cf2c820065f", - "ac14b304cd955230784356d34a86ab18e97c123884f89d426569b1a3f381db3e", - "b4cd7ebc0acdbb8f94cc54e56d109b5b1e228ce0a9d4665e5dc4dca271eb6830", - "80c823d2b07d19550bfb5dbcc6f5d7608efefb434067b74a553f08062a660082", - "8cdba907da7c113098baecef29e9850e35eaed631a5012f8d6aa91ceeece3d96", - "7b18273eee7fb12dfb1f28cd6f84f84d6b4c2111591142547bc064f74dc50d3a", - "33172665f4b2cf512a5c1d172ffe4a0f057c8358403f99429fb2a4b3c2b8eddd", - "638478943871166df7c9c69f8132745d51dcc83146bdc7647008dc41d9a4df81", - "c92378e9cf66b6bad91bbc64e314e3e6ae0ec8bceaa971b29b9a71ce29cfaf4d", - "5e600f4c70122f58e656f8c540ce3b73ebdb4456a2d4adb3c79823c5ea01564d", - "38f2305bf7464208688442234f8c08c184fc73964a8dc3fafc78c79cf337f739", - "d9a3c1d25bed12b92615e34ac682ff24f2f8669e84a86f072b54e5c5d48de644", - "633af3a46e4a947597983c380ebed315dbf721c27f709cf5de14cbe34b8f7cf1", - "bc74c19b2e7f6125a3add9d0d9ac8ecd35ac1e2a60a80548e5ab0f0341041d6d", - "203f034a5df89ecefc895780bb23f7230acab1f83c94d3e6ea4a2a39507feebf", - "db4653b769185f40b9c95f87b77e54b49335d4489f92c0056e626ab6e60b5886", - "cf55dfb6edb37dae4426b2aa98c969c0b82750d6f0990f28ac649a57da7415ee", - "d356a5cd0cb0f299370818975ba68edda400985bcc9d921d8d47d82ce76ace83", - "156ec35bfbb043340c2ca90681bd8a3279e51f7c454fabb14e6fb080e25d3a28", - "d8da9f58760933b7ab6dd006e175a0eed0d8a66343a898d0db16c35843795045", - "8828d69f345a2e463e6ece3fff292867ddda10bf31d40a2f7b2d73316baf936c", - "4bc13fb73a16437820e597d30b96390fd92d7458a1f1faec662c777d0f44e666", - "ba298c26dda01456dcdef9b7938800448e8a25be36734bae47451af8df9e3809", - "aeda761c6e854f3babc90cab5cfe455c1e22f6ac25f7d9664b69591344bc96f8", - "f6bb0d20f684ee89a76d59a4df127731c666d18013ecbba00c27e354ffa4d5f6", - "545630d40c09b246c24c88e3f7bb3df3ea12dbf491601886972779a5bea7114d", - "45a02fec49adedcc6ad2193f04162f04e8d2b910fbff03e2f9b0e79d7e5e6c55", - "561db1d38fc489fc4539f343e10597cc01dff728d937a0e3be8a9963fcad79cd", - "bd0044e77213aefd10837f0d8b98515c79ce14406ee84eb95ace994d0d4bc2eb", - "d21c12dd227f0158ae148f393e83ebc71c41b9dfa4d93439ccdcbd2254ada3c8", - "113390d0299b2d27202bdc1d186d030c5161f3f5d06acb25a60d1b7a29a50c41", - "c93789f3b482c5b8316893d872417e2d7282e704883e43cff1b66433c7f6e331", - "cefb42ad360bbbf0b37653f4cdd77685bff1f10349992fb1b86a5056b488fe79", - "63e3caf205d2a36f8c50316bddcc4a5cc554d593006a7db34be89824d72a8a52", - "4263d1192ecaebc2aac20fadd567a2d6965cdeec80e8ca7f39b23a5e53592c63", - "c23f1c6279f5438d93b5a1bdbbf09921419e7dc2d54fdfa3b5be976fcde24370", - "97eec4e2f196ab31ae50b568212c4379cb3744d5a56c4d9b12bd94b67fc81926", - "94f277a07a634d8d6807ae2d5608deca39f6477c73a8f3ce0ea9f9d7dc1e510c", - "3154a2214123f3f29a646fab4f9e883d97fa27b7a746e6a5150b6828de8ca5ab", - "2fce9e4d45c9944720768ab8eb1e10582298c58051aaec91da2d33023f351ee8", - "0a6a2c850225dbafc8f544f2d2704db820ad92c199d9ab703b88cc54bebb0adb", - "6870721b45ec54c14f243d3521d5e82b96e5bcf77ac1a079439a5bf31f63453a", - "d543e72aca4eee0ddf27b7f1cd01241739ab90e0ebcb15522cc8a38c928ef07d", - "aa3170299545c78011118d8098623fe089ffc19be1eb39e574b837844898b153", - "f19b2e4487b62a3622ce9eb797d20abd700021e531f675a28f4d5efc225a4af5", - "38968bf2ea0aa7d55eabe1114d1133f59728caa7b6cd1018513d918618db20d9", - "35df94a932891bf180862606649014b26984adf694c80c5f2d855e6ffe820231", - "54a7ee945e1daa0e39ff25467d68c72c85a0458a7aed7bf6de20a11271659ac9", - "557f3a3e7d5baa1150249e2da1364580ab39456cf532316ce1c87ab487faa286", - "24e3d458d29a738046b6425d2067eb7cfc08ad8353ae71611a691979ab3f12ed", - "0e39b2fc5bbd98d74d32fc3947640809eba8a3470567b5c116708457659e39e2", - "d031c65a37e38b6a9c4af162f0c0954976527cf985841846c7a9b63a4d420aba", - "4f32c28b3cb7e3ac2812c1d0fa64ba41042f263815aedd612d020eb3970482e8", - "7e31c517090e4b1aef8f347bc49e3115c9019eff0d353e9f27cebe3af75660f0", - "a5d417ee83dc4e100c449c6a1171be1c58e00b67909fbe9b6fc14d7bd6c09ccb", - "e8d394d62a8988006db84700574b4751a04d22ebcbf6525636214eb893e1b533", - "5dc0d767a1d06662f2ac90c5674cd1d89ab01edf19957afd1d52ddde75d5800d", - "125555b109484565d613fa95881cb1750f840095645080681e32251bcc8a79f6", - "4e23cbad736e5ee3aad4115abb543aad38f742f93606ab8dc0de727018b2f470", - "c2b5893302defa657203630e94d9a427781acbaea9d1a1b527fcf7b95f08f87e", - "a1e37d6730084c2e9c89eceebfb45001b985f43b613455a729e71eadc7e3ab26", - "bb08d27ee296dc567d998799710a8a517d5ef6ec25ceaeb15f185269d8c14c28", - "220023c7f4cbc2735d84160ad064f5ad9e8a787bed4045d4ae8f77ffb0d1e249", - "d0555e447ae3219f5a9cb540b0834659c81331957eb4dcbce9433d1ce46513a5", - "bde90cf74a0af17f7af1f26e1b93f565b7bbb69cdcb855b14ff76e5ab7f24423", - "73b310144209acc91b458bae070ab856d83e077430d79b1393a4a434302466cb", - "d9a9dab4da2414f71dbea12efb3a039962e914c30613f16ea180769da86b0fad", - "47b05d0596cfbd68e26a19759024276456bf1916fd488a7274e01af221b31e24", - "00706f7b7aa4d380e756bfbb51fbe41314e058323c495a86fd9919c240ae07b3", - "3917a9b98b56b062ff9558c8c5b4ebaf36e3a6d9937497d7671a1c86730144c4", - "1bb586138c697caca21d4045edc1b86b84a4d2f53ede74d6fb40908022a3bf82", - "fb8eb66cf8b517289f5947b1e6599eb1094f39999c01d3a95f2da320187ee70c", - "d473dab5062f4da0bfd5dbc2b252891e68d560dea4a59a625ab2e5497e7e21bc", - "b38d08c7a288c9ee4a7c45fe2688635a256c4523afff37461df7cff51f2f87e0", - "cba69e3975aadbbe45a4b701823cd92fbf4950435114b2ef37b905c835388c03", - "d182613835ee7e9574a707260f43afa169be2730c857dc3c86853cb04175c413", - "187cf8345d97361ba1d59810aa0ef394b05a0b0c779be92b4485c1260161b68b", - "d6ebd3d0aec2b029a57a53c3396cae7407677ce833975403fd7d0f87853dc669", - "fe7c0d2dbe2119277bdb8e9134978fdeed6e7c7ac6c877b8f6b5a487c7d3b5ec", - "ada144b2740477c730fcceac0b44f9ca4ab2587d7992b2145e463ad93c397bbd", - "aba8a5b5e7992a2f7aad4d6ec178074dcddd73d240f07fac85793bb8d304487a", - "c833599bf7e51254c069294fd5226b5a86e8e9f799f68a05b5e5e17e8f0416c8", - "4a271f95fde173033e66f8933a04a7db8110149f124fd1ca51e0fd0803997d90", - "1edc045b5fd9514a13f6a6b3e16d981ef187690d4038a7730b013777ed54d98d", - "f5da5b16c41c29b3f1990a91a54b432ad31121775afb631eb0194ab5f412b986", - "b684ce31ad13cad293e92f699a568276993ab973c1119f156bd7413a5413e2ef", - "3fd02d93e76fde09b3fd101dadc160716554c9f63b7fc9cb5db66250370e5e58", - "6b0cd99e09649742f402fc28288a2efb8d95d447143ae7839c2c83925e6122cc", - "d3f0820759d0bf006cf8d1d8dca691d44e1a241bfd8caf8473d0730e6443beed", - "8226e2041c2e118c4aba66a660ea41ee4660397ce5368a7b8b99fd28206e11f0", - "046f32af29f12b4c0a89dede57655bef70b4006bb2dd55f57326971255c86b2e", - "89f8c14f7d5ac4b67bd3d493b386d3c0caa03fd6140c7c01c920fc5003870c3a", - "05c78f10b1759c5b9842ef2de13044d1ffb87362e571713cd4cd3cbfc5081e21", - "8f61ffcde92a3d256a605cd2091efee3755c0756b21e5c00e7007c8eb48668aa", - "42da196b8a054a3eba1f852f88e374c9fe5e03bc2efd62a03f0df912c8a99795", - "458b260390a95220954b1b1df27e3a0a9f7d2c8533761019a3cd590e4e42a9f4", - "f508c423148b78df65989bb9e8f1ff8f29a69d1746c4c6663cbc31c9723fbb36", - "8a336e6b37317883fa392eadae460e0731effa965a7461e4059c331465a0498b", - "3771570922f3c712c050c8e6d08e745f7c6681ec516338fb650c0d0f59e571b9", - "6e23ac27e09d65e541844914f90f0615ea7842e84d0d8e2aaab30361c435e5dd", - "6fbc037bdce650c7bf8f2abee7dd74fda0548923b9f7d7def7d03fadee7acdc9", - "fc25923a0a02cbe8b4adee49e26e4a5eb74d3a8006cdb1b152a97f39980e306c", - "d3a93cd9b5e7dcb5a7ce669ff8947562c014f2a277cb7cc3173e31d2b3d04285", - "f86a32e0b5955e789e26872985e64e97bf90ca87f9397669e4e2b83fb1a008f9", - "9909f63b507d743f3be03db48a4bfd7d7bb94ceacdda62f12e62d359bf4728b3", - "fd20c9306f8c7efb037980941421f7e6313781eda5dad96729f00f298432648b", - "bf8b692420d6e75d8d8e335e8c10f7e2bb121b90e4a5810d3aaef4f6108b444b", - "9595776fa65bfa88559f72cf17471e99ba31eceeab61e2d0b528dd6fc0d6c462", - "079b6d4dfce28bd69459bbc0bc466407285514ed2989c42aa21fc375c740a00f", - "5417c206ee4bed7cb6b161a4b8db5aafbb5aee18abb10c78df8fdd9e63720121", - "99eb25d64c0f3d1010f58dbd86216db290c40726fa7a432d54809e30286fef59", - "4cac322cad92ece60d5b342f446d6f9b0c2bb438e0045364bc37ca19f95c396a", - "d882ca4746b7a8d877a1107261350d30f28e63b7c30db1334510c377b937ce17", - "19877ab063a4af74702e16a828e188c950118985d85257a98995ad3cc76d3406", - "68a3c7d6342492baa58aa1da0506798f941cc331f6d0274a6845e0a30b83244c", - "debbaab843d13495693e5c3a717651d3b242039be809ca53c95535b1853ffbde", - "e3b8663650313e042fdff99fd04d82bfa6e9428b2ee96c6f76b7230abcddba32", - "52dccc940a57e3e584860bfd7977bfb1d99535371f7e8d442ab09b3d46c239ba", - "0de9e5667cccf94708148d119c727104200331d761f98b291666d7799d6d72e2", - "ea510eada0bfdcae0a776175ef871f99f39d8168d377f7bd32c7e92b2342c200", - "1ffee0206b35fe83cdf52c1bee18979560162e4aa200272a66e93cc0d6405513", - "caefa88c989d38092095a90d9d8436b3072cdb0e366247c5c143c401afc3a1ea", - "9e4bce045f06e54bdb57bdda9dc55bd46bf2b7cff743a6c358468a575fc914b6", - "ea884507ee6ca2a45053b2a8151a2ba4bcaf5a75250a0372727fa6fe89fae5bf", - "ce4a64c1dbb045c61cd580683410776ce33faef513ccbc236ad4377ec80ed168", - "a10dab46e6a262b550abad0df791cca59a2b85a6061a6882d0765da472043b23", - "911327ceb474b0ccbed394982db7cda561159cdec2ccfc7a5300a6e453cbb0c0", - "7afdcc96f1abc69d7aed75b1e39f93ac511c0f72af292227462222c3c3a8d264", - "de80ab8f564a43767e372b3251dcdafac778867b11216e45a57db5c9ac2becf8", - "f94292421ebae991dd1bb3fc6d3bf3f8ba46b59a2fe869eae053dfe99e0722f8", - "2760f01bb57c205b8a23d605ad75476d25723a625a22b6e9d9a4dcfec3fd98ab", - "19b0032ac47a62720e45ef20de34ec7d4a9299348d68cdd9a3416c753f0f39ec", - "bc58efd584be3a32bc589579a0e70ae79d513e013fb408d741783324cf45e011", - "d0112025ea8a89e5b8a89c8cc473acbdfde8490ae8809c9e17a3fe58ec773f68", - "0bb3e19a97558a876b038d8a60df25b1f3b5a0d2cda978fb45286a37e036117c", - "9ec90ae3ae85d3573d2157b7dcc004bc355a566b2fc365c9fc60b0f056e031cc", - "d308994a452f9a07808a1e4dac1e73d439c71ed0385c163d92eda58401910b3b", - "146d68e184eddd4a84d469672ed4ae8a4897d38421a6ec9f0343a5be514cbe9d", - "518b11bf1039470f9f2a0067f2642c9734a452162df9cff7433e9ddc319b5729", - "bb96e52552d477b10b06658890cbb12833f5b0456fc65a1c12bbcdf4c14eb8f7", - "81703f9472c2dc5d14568bb5e7d4dd584f5917fd6dac281b9a64071c3668b998", - "ba1cafdef3ec64395bd07ea97b840a298d93a4874514afd5c9024016454cc144", - "54c4e00db23cb44f7c96ddc23ca74d534473aaba22493cd0fd9269d7d3f99661", - "29f07889075c3b6a9225eaa1dc843ea305d33238855afbcc60356043699503ca", - "297c4ffe74e0528b4820edeb22c6f5b923eeeb30b92acac1c46488e769fa16b6", - "aa81b5222f68458c3b20e188ac49c49e5b6bacb160e8f3668c35e6a593b2b0b5", - "962f42c00a25b145dc999546b6fe338268e037afb868445201644e992696a1b8", - "5a551a4a37f6b2172ea5ac99161ee02dc45eae5c2aae3dff655666370618c813", - "698a5e23c9b384f70eee1845232cebc8fc498ec43d294e5136bfb74281157b04", - "aadf965d453288d61bac57cee841c5467375bd19b6a66cfc85f9e9786eac2921", - "08585f104a0a896b54b2aabbf1d81eaad5ff00ff04865acf13c961f0ee9a3552", - "b898f40f34ac7309b9071b9f6180f2dfd0ab0b225855a96cb3313627801d62fd", - "f01fe2ad09ffdff6f5175dca3d1cbf25e9390cc116203de4de61e9c2c19bd134", - "d879d2f26bebe40371ca0b7a2818ad7d1567efafe099a16836669a880339c2b0", - "f4e1dad04147ce74a58ed0d2998f1b87634725eef7939ebc09c44c31cc7f2674", - "b923798e76bae7e0419cb02d26365d3324b391726e35f76d497b5882ccb8d54c", - "f7d4a20ca6ef6713479066ab848899d6db639c38531883bbe6e722a65a12c6e0", - "3e4fb8adaad1a8c1a78f8435d37fbae20ac315d755845d0dc537daef38852ed8", - "6b932e61db7ff2391d3d3900ce02fbec220559db57b333d90212d5709aa983ae", - "5b4a31fc70e91464fb9c9551dee9762945940905ef21cb88828af9e215e7cf2b", - "d579eecced7e2d4123214617b136feb5f558447e2ea3c6e9b87e1cebda492d1b", - "92f942da23332a9f94cdd356f515b37b17674c7531a4ca7abd04030aa583e41e", - "b8a6a951562fe66c0a1b56c47d463f9fa3aaa11a638ab9d5a518ade00da17adb", - "0888d5c1d5bcd73e11716a10d47ffa1c61d5c18b6e7088c871f10c1a8362fbae", - "aa49c843e612b670940457b19a86d6d94233e79a1879d56da162fa894a867c17", - "c925700a4921da0d1cd92a23b50fa6aafa807abe8bf3121a036cf1b3111e98ec", - "92fd36e1f0524b293f75888a2e5bbd6dc48232ca9a0383fd939e04a9f68cde18", - "364455067de4d36b9a74f43095d7f9ca577f6fedcee352b924c42c45c51bd51c", - "f6e5b1270a4f798ef8ddabd957c22e01d3a51137bc0a31d0e8c949db25508118", - "25e2f650076e8df27b612e732b8fb3231fed7ea3eab88415a6fc961dc3184cd5", - "2799ac77fa210dc258d3e67b1e6a52bdb79026482a0fc15c250d177ca05e4b2c", - "5a4d95b4354a0ab487f97e3d05f8f42bea5b67ad5ef22513f7bc1abd628a658d", - "237e7afca50f90111da82f1f88fc90b1299abf4ba243f40dddb3656b97eb9975", - "2201e55c6d2219dfaa3a0ef66a0da865f76eda0362476bbe9d1e78658baa2f35", - "5359a387d5ae79697e99e462ad88bfb7cdd3828da7caa288aec96fe4c20aa437", - "b9a90aeed506b7a21d49cf6673644dc1322b4f8732721906e9b3ebb441e772c3", - "3c4f973bf13b9d15a064d15ab8d649009c0cb7d862a2d3636768c12885205549", - "1b22085a6b76af2e3337ab096772563515e10a46ef75ce9e1fcc851258e93115", - "67ea2e00df31969195f1ef1ec84e4f15a0b6551fcef541b231e0d69bf5391384", - "b60523fecd6e0dd5eeadda0d152a86450e73b320977741430d8f53606b2d391c", - "ee4b10de21028f5677e1eeab4e190d40e5b2f101d49493f79a3b6befb4da9e69", - "0f8e28936aaa03d2b1e161025740be6731a4f90f6343241d7ca5a97f9aa46a61", - "bd66bf050668ecbf9c765ea64c9d151f49c1429b4cab4317315eb93b6c90ffcd", - "75003bdd23ff203494c97d96b137a9452864d1f930669c2298d6a81c1f3beaa4", - "28c2684258abd772d4d7f74b7195fe048ea85ebd3e9de55969e90d3fc076235c", - "531ab36e2ee087a52885a33ce8b107a684e076226780e706b2440ce33840d2d3", - "62fa158dc8313af07cec3dd150a744475aea0a5fb30aa300dcfe4f6d1c01bf7a", - "54422dd2e2a2029ec7e8ef3a35e3aaf5f3c96c667ecf5b2fcd37e238829b8270", - "296eba94b986fa0dd7d74d1aff9c200d45a1a1c58bf6bc5269406f42da4730c3", - "8b3eca6d3d31acaf6932d6b9b0443028e4973392b86b06bd221266247b73ba63", - "704152a11f35a5ac76f811803c53b30c8494d96743b761440722398a94572bd5", - "384b36afdb2e4e1fdcdfddf3230bab0c8523757096717110d00d3249cb18654d", - "adec08974a868ada4f9a015efdc2951224bed9304683d8861daa9f4748b29c90", - "601297f1db86bd8ec837e326112135cda4f1588d359261ed068cb29db9b4a152", - "d82e3b35782337261da53851ad2b6a15d6c01490315a6eb608fb60fa4323ee10", - "77120e4a374662b931fe0f5645827dcf55b945dcc65fcc115a4012dff58ec7c9", - "df8e9ba87bcde68cad0b8b222da48f2e947507f182d3bdebee627514e7a95a7e", - "40aa2c3c564aa4ef371f6617909f6d3142b8b480e88ecd09df0e031309b5b703", - "6b2b9431f8541816fd036069ae065c8b653f42690a65f9b385a601ba1287e218", - "108f7db0e84c10840111f3850d352f9fd7df17a33796f7e189538c94f5bdc92a", - "9cbcdba43c2dd6bc58709d37584c24609634c4302d78a951082dd84c30c86b32", - "75d8fcebf8cb30d116645269577976bf21850eff7c2e838f06400d05ed97465a", - "8252815ddb7d2ab7545281851a7ffd76f99d1ad98c643418aa36e4b6e4ae1253", - "9eb1b70926fcf4c810e9f7bdfde7dbd4a8f897cbd8e6502a167bedcdcac23d42", - "8edb1e448501b15f8288ace3e4703a8dd22de53664bf53d8003c4434e0365007", - "db5ed01d38b33f846c103b7942c4cd2a21ceb829f81608cdf66fa50f5f136237", - "7270b8864bcb24f3ccb4fcaffe70ede0cc88a54eac3eb0e861cd7b519aac607e", - "0b795b817f9c4bcf0cf82485513f3979fe335e031e589eb55be0bfb84a4e8f67", - "3a231d585aaec9049c710327d04d2445de0d05834801994b6864cf875a1fa37c", - "50db8b8907e7b8601b6ace5d61ddab8e712e544ebdb7f032204875b133d3db58", - "9c87ecbcf935548b69cee18dbaedc5c7807b2b07d9a7cf85a8587d1bf9153841", - "23ef5a94c686bba55d4d88568c12df6874a8925a999f4ba391a4c1ee33676c17", - "375eb2e35d144c934ff6b2006af9f7b79f661fc6132e98ffad908594f2199818", - "d93e389c00417b7330a6cdbfa096393ffa36031193c1f23fb494819742852381", - "6c4e40520d82b8c2dff7971c57aaa996e1326b21d8abce8a72d36eb9ad61a430", - "309f3a229b2813241145bccb1d3920c09ebbc6ce602ed47d3958796a4bf253a5", - "fd932297a7dff58aa0993425b60ebef16838d95806a81697ae2b3fd956c1a3f3", - "11c1d5e0277af3715eeae810085d313cbd26d622b119ac5713918880605c634c", - "80a1e78672530d44e35e641f4b80b50ec2230169aacd63dc6f077994ddc6bfb2", - "85451a8bb6a0ca9965e6f4fd166b420be3f2c2902c87cb94461a9f0a9da86264", - "3a22900d0140c45912593d7182631226502d500d198ae2c60f982aecf3d77b34", - "0f6ccb9cea36693f7133fea12dccd6b7360ea22bdfa65e2dd8deb48d6192a5b2", - "2bece6b8e96fb9f0b01b785b80b24400923bc318d06fb5ee31ff40fce648ed38", - "c7cc4cce29e0909a5e743aae41916c784d4737ed955efc2a7d9578b7a77fb402", - "35ed2c3606551413efe73115ef9775cd8c066d60314ac5aa70ad94fc5920cde3", - "9fe375c11bf99bda55980659087d7ee263cdd3d9498ae8fe0a48eadcefb9d6d2", - "b684f1d69df034444bc70f327aff54e05a07fc5666d4ee9fcd0df1a7e958c1ed", - "dee54cc7678df243fac7f84e6c66fcd44246c7f27c394db5a8f1e67f64e1ca6c", - "31f502b90d45696f58fa99173c06827b4baa003ed510a0ee52741fc8be616fbc", - "b0de8c32e768bcfbca6e8e6998188153a4b716ba2c9bd7707a6803df2cf3cb6a", - "b3a6e2c8857cb031eb34001cf9458805d0a87316c45955ae3a393e7f4bdde3ca", - "83fd2c2361ff275023a7f923cc8cad668fa46554c8f8f302bdde1761a5b36a9a", - "dc4390359efdf513490f241b8cf5a46ee9ebdbe63bb73a4114e882ab61b5974d", - "2442b8ef0b614de58b78c4d2e6714ecbdb702d276d82dd9fe27db94b151d302d", - "8eea37a89b9c2a0287b3b3c1bf005fa32748ebaebd85e87a92e807fe5026ba65", - "d7a4a52dcb56eabbf2adde0c0520dd2126abc966cbdc65f6dbbafe3146e52e03", - "debfb5a7c8bbd936770aa9d254c27c0d0f9bad3d0b71ccb0a1cd1812a1556a7f", - "85a12a474f6327d2d372f0e87bb115c82c9e3b3f34020cae3f4c7efbc5739ab6", - "cfcb72e88bd574d8f3788080be823375674526d831c309d0a03028b10a209d64", - "9a5abd37267ada79ccbd029e691d912f3f2cf65a02d5c911adaeba0ded6133e7", - "5f568784dce8d6f5372b8110be864c9bde2cbd21a009770a4981ee6de49d4cb9", - "2bb254b2f1b77376551db72387c4f42f538a49e9f0b1e407240dcfd508c1650a", - "a609c7a8f356a06b520dfd9f7b3b8d301a462f25245d00d782dcf0dbb7f3d50d", - "3f26bea1db5cb217ab28b54921d283ffdebb9ae74ae21956ecb0e2c24a69f89f", - "4906ca2ffaee7bd9f78594e29e699f581f48f251b71af89d3718ee34b36656d0", - "aebb53644acc20d0525dddfb04f71b97945dff54fbd0763920b504df2074021f", - "db27be8f4ed58ba7b9018f5e92a4565fc6c3aadbb273c0e889b7b5faaeb59573", - "dd9c534b420ed79832ec2606135be60b89ec5be8a4a5a50103032a9229a5be28", - "990da2b904c2fdb326807308e7c186a04d47f3ed9aa00e8c8558b06c8e8a4333", - "5d0e91e334886d788f0543a3d4a8ee9f62c8e6d18d5d16da61716b093089a250", - "9d420b8ce12267213b1900d6a31f55746c93677c0c5fe0f1f9abac3f9a0dd3e6", - "3e626a9e03e75f04da1c4887b83af1a67747bcfb7541cf304d2b835273cb5f60", - "6aeb5e61ac93c6844cca67ead1f56f6f38f7d2a09d5da4b230343ec9c5824347", - "8e790b34ec76848b959556a64f6bb823bc1cdeb2e557acf62ff4af1f1794cc5c", - "3734a19bef9255f13c26cf5bbd9f5b5f9af071ede9b130c9789bc16244fef916", - "3069e87220e79eac4050589b5f186781b4b67747a5713d7eb436ff9ab176ea3a", - "c597a9d292bdbf11e5d155f4a4864f2b5b11cd9f0af1ef8fb0451580f85d1896", - "ce60997da31be7dd7dd493dede83d468bafa365926778f799d865debe2def375", - "35e8f39bd19852f2828c43513b6154425ffe06ebfee275d8288a6b370f854ebc", - "1ef0eddd93f16211037af055f1e30a7fc5535bdaf9bf113518ebebd61caea8b9", - "09dd89977404cda1f74c01c999ba1aa0d4efb681e6221078957243dc29391e89", - "0bcd3e8ce41e83df62161c8d8ad9a7ef948d57506ec2959806d032d01e1adf31", - "d8a67f5acfd0b6d9a6ce0f4aec79880173c2e9a8350f88284e1b05a7884ff617", - "bd9e5da7add39c292be3a379341fdcf9ebc853ba2f55c1039203e1441581b7e1", - "72410eb4de942eceaa87ab861eba5d346627a2de1889fdf9d1bd1801cb28d16f", - "001c8e0842853f72d63f4fe3f19f81ae8ad892891c40632474cf0492099f6aa1", - "7ecf0d6cca64d6cf3a82dace0238f3f059cc7174f665f9026202fa99dbfc6ae5", - "9ddbef7f19aea2dd4f23c76a687c3559d4943d86b1cd43e87643afacdd68d307", - "1409ef13e13898f7e9b89d24ba73fdcd69c03518ee6fe26e695547a97020ce22", - "8902fdbeafb1a377b8fd8c287beb7f2da3eac503543753e76317d5d3598f87e0", - "697c4371c6e1f9ccf92301ee39ec15b9946cda2184e7fa897ff0f623579e2076", - "5e92563ac7e7af1a0eacac0f107cc4242b051a05a3d579eea1ed8c5c6b68ac93", - "100dc1b15b952fbb084c19f7ef5e13b86b4c8be4bd7a73e1cc3d83ab821e33ac", - "f2130c5075dea8580c48a248a6e012b22362b08b4b2cccc2396ea540ff918b8f", - "69413e9690b5d5ba6475dcf335239dfe935054bb02d378bc3e3bd0b3b78fafbc", - "a24602c6a725e9a74e83d158539b6870261964c9e60cb75de82183213f98567c", - "d21c11be5f84cd059efdb26b3720c9256b7753e98a6acbf0801f9be6d0ec73ce", - "278cb61bd3ccf1688aac87476c47e8a86c394224314e904476cfcfa14d85a6df", - "4a9d3c044edd995c8ef22d64fbe5a61fb273d4f9f6e8337bfd02b352d78b159d", - "e7ff3c641a04aa2881c037d75e38476594babef52c10c3c588ba6a3b573fe82c", - "002d875b2bde0938abde3c3294b7f0bbf42b91b5c9c826475010bfca268a0bef", - "74c550b37c4971988cf5e9a111a6bd0dfe06e3076e6dd1a2234fb5f3e55fd195", - "4a52da9b0a46827b27c4295098ee5358d685f3c8e71817636836e658b6d8eb18", - "1b67232695c49a23d022ecd0450f4b66a055d65402151016f63c5a6575fcaa5c", - "a6182972c92b13ac568341b7325f63a19946f43ab72c83cf7ba2477e49a8d74f", - "89c90b92c3f5bfd15994189b484e14ca1f8056ff6d0b7ed3a86ca8283445b4d3", - "c24a435792c8387894de19dcdea902af9751616320e5375d1d20fa9778a656be", - "7276620331f4da2f2908a8c43b80d79ac134ed21437e210825b16cfcdb5f4af2", - "799e752f861f583fd922489baa2382e7d299a46afd0b783b38e50fc0061345d8", - "1f3dd1a08929a46509799bf144e5f847686de0e02311edec438bef289e55a6bc", - "7d9f90b3fa5b2c5f8b66b6b0c535e847dbc57acdb72f4c782a226474ff8b7b2e", - "edb4f74c791cacd29f1ac3ec9749ac65b3f2bd8b2d339f0d55a542cbf302c688", - "1c7f9ab86d5d195c411ed64255d6bb0f605f1b47fe0c9813006e6e5885859af8", - "79a4cc66f0f47fd702476367e88d80ce73c0fbd4da63fc6660d3a0e5f589b7c8", - "b25c6211825d53db501b7565606d8a47e7fe6f2d2b67cf5130dfd52028717026", - "2027b7325a63a4d0f6d31b7fd771f41038ad440f36c75acde514a23543a9ef8a", - "fd089bc203a6a8edb470496ebc50ec2364366fc1c870f0129fe4dac37f30bca6", - "cdf09076f03ad0ad0b8d3e8067d1ddcd12ad16b10228ee28db3feafd9b4e1bd2", - "c03e0c67ed26f673ca206d3f207bc33a857c81318467601cc5489dbc7695a70b", - "826b56849ab87a2cf3a3935f5bf17ed76fd544f1a94ff05c6067cdc3178ae244", - "0aaa3dc98a505165fdae1a4924779d0c6d8f792213e80c8be8703d5634b5a76f", - "62674dd2a0e792c0ae177947f0b35468b9efafc99a8fd94b9441093a6bb35af0", - "0140a4a4106ee80d4a6c373de13746d26c6f446fd93c34d164893a647b14897c", - "63777fd2dcb39a31c9cb6a961a1cb797a3c573ffe9e51fd17cae74da494b4212", - "2ed0ea9562ffdda2f5f4cd4af4881cdfc27331227a4fa6c5cef96c3c418dcc90", - "82dd1dc3b5e228fcf26e95d37c92653c4e965ce55d0858486f3066019db65791", - "81a3a8dd7733b4a13a09e4485b81fca2680b12cad210d40a7c1bbf81a247998a", - "b3bf7230a6d9da7d204223b8c675aa565bd7b97e964ca032885467631ff92f87", - "89d1a1cd1cec8d671952d862a1a2e8f62812e93a219f9c107fb3de69e85a3fcb", - "dca167203196f299fc2df75b84c61df680864c7ac2b45be6fac0d1f61c5186af", - "d2cafe610b9d1486acec4583ed688f3fe007fb0d92db11ef1bf6ddef0af0003d", - "f762fc67b93d0d3a21cb03f2a02df55efeef5bebd58cd4eafd70c2125e907088", - "8651e1d64e4a331da159dd3004e8a7c1672d849f32199b4c384cd262faee997e", - "cd263afbdf46bcb05743a3288e2c09f6efc908dd16fd1d3aef8ca82dbf004ff8", - "49dc37a6970e21c4be1e819ceb78b7593d41437bf45ceee3fd5d27eea96a3d15", - "bb5d07c0a67b08a9a9286704aebc5009ab198c778906e341db1a1eed992e0773", - "df95d78401fc8998a27ecab330ca76b29f2c06d44cd972596da88311f55ae739", - "36dec16c1463281a4d12590e737a768fe30c33d1f51d88c0658f92e926ae7be9", - "23cedec31d58dad75c8c388a83ebab09a731ab87b702641732262943b9ca86cf", - "4d7f326a6cf2b1a366b81e3a4b0f573dabb74761335702339f6e8a85aabc4e40", - "f06283adc61328158527d0e10ffa2fb91d546877add43ee724ee384c3611bcfe", - "966c1c70533658cf771017349b3edbb72bffc1bbbd5e1d3558687b4e9d4e9243", - "9dc18fcc4063dffad2679696243a4823898489a9af2c341595974c6b585ca55d", - "31631b0588ec931ccfd125c3d512c71bc7f587a8f2675a2c39e84bdb4996a795", - "d05a77fa974b631576da2436a74d8af862225e9a69f605ca1571990b9421ebae", - "4427fd148975a784f359c4c3c9ac550f2bcbeae21928ded2b5047ccad006277b", - "b2be4f546d32f67c60ca2082b4c548745460ec1971bd3d3f3c578ec85b9623ae", - "bb72dce9ecb8701a4b8e0fef6c31383204e613446306b6570ba23c485b5727aa", - "6cea62ecc05b5c0ed61e08f95068d21937dd8b4146904de7072c541559b3cded", - "cc975a964b94de0173d64da216da8c1601a9bcfbea55bdd823be3b1951624db6", - "e1b395b641376526bdf206be2cf7f6a3583476c21a632eb65ee955f13bc80fdd", - "be0469618ef85207f179548ba801873f3da812b067eecb1cb44eb7367e059397", - "ca340bc623a1d124e9658a590c45bb5adaad372310f848bf85d5fd3c00fc92ec", - "0fb3e5bd0f2a3dfde2a48b2a796b316ef01bedfd882af2c043918dc39f8ad31f", - "87e9919472b03a53a809840a24940f3038b8b0d3bcbae2d5b9129d3f499b5398", - "77e46b40680c07583d75f485fe1470bdfe537d16e0e9d435ce1788aea68a8a20", - "dc7ef0af7d08b0faa9e3ec7b01c8de0188abd610f3ede81c1b8140cfc933bd10", - "e0b6440a39c97a9ed9deb1c9520d4ebdf9136ca6ae39ec93ba27186e5884a330", - "cf1807fa7a4a5759d7c8a66617c602b1dc880e6cc65b0e546a5269024a04120d", - "37c230587aa937abd25e41e94a53edc0078ba4115bfd155db3b99be7f9baf64d", - "11d20e7591cbbcec0805aeeb682c6aabbef02700698eb21ece88697b3bc280f2", - "ff11801f08b9bbe4fc59923ce95f7b08a63bb21aac171daf863a2913c1daa814", - "b8fc88d65b2385b8970166a3b439d3e25569afd7b900eb923e5ee213106a5e49", - "87c7d2f9abd4dee58f0290f318d90affc24385a0ac2e916c383279219b21ab7f", - "138b7d7f1024e9d86b069fc3a2b9fd14abdf3dfa1096f29b278679a7f3028deb", - "c736c17a38fcb2abe6bf1574fc45b47b7e1cf0787101656e2fcb920fb4b2148a", - "227760c209b194b6863ea91a53f3230ca6c0e3a7752132891eab2214038e52da", - "de3439239588ee82424bfd4bdddefec04a88b25d200ade777ac810c3120c9227", - "c24a0cd56407f34d10d70be5e0f20530b40515aba45cce1a1240a3ab0de33475", - "66466f4ed3107f2a97aa8caeebb5465a8b1a5bd7a165fea65e8f1314c4f8617f", - "eafb65bc2f2a6890dbb5afe60a4e7e20253fff546dd11f341f111ae16aabb777", - "a14c69d9162681f83cb9dad2be4d29a99847e325bd60601a701f7a06d4a58714", - "ef99feda0d49e256ef5fd2b6424717d2d1af998a1bad3a019339ea1602c1f053", - "ab7db445aafcf60bc4e97e2e1d6975ac43be97473d4bf97cefb23bdccba66ffd", - "36560373fa979470f81efd3e93b5520d1962ecb00f2f1c1d5cfe086f9d4c3fca", - "ea1c34c7871c0a758f9d5fdcc6761a17fb60d5afffcecac3a39bbfa297d56760", - "1e76edd339666f6d06a435a7c9a4eee7b57a39565b8aafb54d0ffe4f6558c8ba", - "2c443293631d1416a454150ab0afbb104857a38f6656e8e3c93969e607ba266e", - "587a42836c150311ad19166bb104783db71d3483ac0b61801a9a1f9d49868b5a", - "e4e323bc6127fd364d0b9d95013b5f3db5b30f0c6a1dc27bf40dda13e11caa24", - "29adce2984c36eee9bd1eb390ddd0ca4d72a341906ed536240cf667f57622696", - "a148e9c134a8f2c3e98ac5ca22f0e88786200ec326e705286d04cbb473fbde13", - "4ed28cb4639b3c0d28dc71988b5950e68575889f4086fa0531906ac1920598db", - "3adae0d728671aac84c785eccea67722ee2d5f7b8261d67a39251ed81f4569cb", - "410435d2a9be2641d9e083e031fcad08adcdf1f5bbc3f0663a5ace294fd1d291", - "98f88476ad3018a7ae5d5238013441167cb40b1874cb0d5ab2cf9407fe411d9a", - "4ddeea31e67e8ac1e0c5a4006fbdd72f97866cf12f61f7a1fbcb66fb3fbe5f7f", - "6d305d287290a8afde007e08d7c3cc832af17358b0b4eb4088ab54a55ba9f106", - "fb27f0f001569d5655fb059dd0ac0ce82eaeca5fdd4893d0d0e789674468fed4", - "1486f03511f7470eb93a24401a469eb74dcae1763195a0f4d6784e258bf1d97e", - "284398a1989d0814f5742a36c1b643bdd2a6e35f54fcfc8cf79204ea43a7f716", - "7cf3a55d67174f9360327ef63782db872c73711d903fb91c3f6de96ea3a22383", - "eab5f4c56416ecdc4624fecd4b4cd80e5122f5a39920d13bd1c57f96f38d91de", - "ff2955c02c583217f1a61bec0fc14274333cad8e35a0398f4c680367c39f9c9c", - "e08e3278db1d6198d629f9122cbba83347e68b70232cad9785f5eb0fc475674e", - "0a93cca044e75057ceaf1454fcb912c7be838fa110171381291b5086eb823ab8", - "f3d77520ea0087922675aca054be416cbd3bfc0a17508eccddfc860bfb47303e", - "56ba92c1215273a67d110dda2850883c473f0bb9372b2a638df09175ed232449", - "bac99085ee164f280a5cf57aa81f9c1adf0fdeccc1caa1e077c28cea56451ec8", - "f66eef22f6ee41801b4de8734a90bc84d7737a5bc5eaa217a1ff45a7bd4d36a9", - "1f795b0889a9fcbdd326ff799a1854740edf751ef784a1cf4d77abed0c50416f", - "19336c002d2ee6981b79aced4cc11c11bc997d8d525ad0f88078c25587d0e93c", - "25073d76f9cae2944a2b396c5ad8944881c840f13a10780e497c7201deb23b29", - "106fbd30e4bb2527aaf49ce0d9857ddff8d06a8e3612b1b408d08060ed902f43", - "3c1b9563bf564c096fcac9ced57f031b629f0fab999804324beb82985f5c66e9", - "02ac3ccb7da3b1852c22e47e3677c83600fd82a879f892fc9fd308eaaf175643", - "d2aa82ea73b30d626d301de89e5c25554668f36e52398e33465dc43eb5f250b1", - "1079461440a9a5d2a3d3e74fb845e6b1a92e3c9e04615ad9bf660c7bf6ded0e6", - "704856218b9990facb2dc0ac07958cbb22212886dc6274b95b852b51fa7c61d1", - "34614ebf5295b43930a5caa833f819c9c7e03e86d07a5cfe90e1795ad71b3db6", - "46bccd4fa56ba1ae6d669b5c66d281a311322cfb4634b54d5adae0649cb8200b", - "5976e6a4e13fc9adcd29fdd9f2154c945fa9a1cb1fc3118b7da06cee87fdc91e", - "e4b2a6722baf02a1a31bc8b7c16012b9ed9f8769970bb0afedd2bc1b84ef40b8", - "6679a54982b62a8b7da20accc1c78c34ad0f0219bb4d288af843e87a159bcf72", - "6e7f4481ec3c86dbf67ba3c107754044de810a3d3b87d18a572aa822903020a4", - "77fd7df7866116f53bbfb3a11a8df6a266cd6aa8899d6236a6c5b8f944e45fa9", - "d102fc077175e5c3ff9bc2f97ad14028c36039202a0f1e17b2e8219bcb561861", - "e0db3076a55ac98914e2d277844533ae4dc0b5a38e9945bdda5df7e34de766a3", - "1403921963ad84fbbbb8585667bfe74a8eff17a096e14d424d947ff294e3317c", - "c38d5363ef8681eff3620c5620dec0a73ed175c956940d14eba1b47acad74ad9", - "09cba2462dbf65ba4850b0cc67b66cd2c731ed47eacb236c1f996d716d75ef1d", - "5484ee0174ba0830dd921f81ac549af65dca78f083c014f190fc842932c2d772", - "b792ed316b4e4f118bb064f2a5a447b862a9aa4cc2d006999441bb023516345b", - "3c2e4659d63d4a2f11e028b8c1c1395c178350f454f2ee1e28bb1004355b2253", - "37634d42748fe0be741a243aff49f07851ca4d1ec92405e0c3ddb8e37961721d", - "bef323487091d5a5bde5b3cd8e731481d1c56b32db7e79d6e0a22d860c04f4dc", - "74f0c2de3b110da6dc59aecc73320d52154d2208a856f1d0598c868311ce0b48", - "532e928c37c4cdd4a80c4641527e2f4f8170aca9b8161a00602f81ca90788bc1", - "69e996011d4a359b2ad4bb6ca64c99b1beb5af587288b7d89f54e707e95c01ff", - "83051042021a3de8c47c9980b03748d87f9d06478af97ccfd291bd183e082c0b", - "85d47f906e743c87947ab8c62729030e548ad879fbdfebd7cd319925b2bbbb4c", - "d34b09e6b49c1c6edd2101dd54e8d51164e0e811445a45f28050769f136ad71c", - "3d6e66c8238c11d7c7bb08d4a566678879aa3f2af49791246452b10078a62c90", - "b81bb5b5c773bd500c14a12dc60f0f404b0bca6120d2af96830b5b2442e3ef68", - "1596de4d2a9fe40d21ea559269c985ec31c63129b8c0c1a59afbea3e59f2bc0a", - "5ca91c1ef521d66f9eefb4adc8e11b9cdfdd7960e338a564a90bfd748ac51826", - "4f90a8f35fcc7f30420c1f640bf8bf5b1329fd7e9b78f19fc2d33d2c92840efa", - "3594e76a0ace60a2133ae21972ad7c02a1ce6f9ed26a495b6ab09dfe56609038", - "c6c9f0a76f543f9e57a8d66cf900f99abe05a868d07b78eb6e5737cc9edf5320", - "b71da4aac3f5766854556d1aa6aae9063372c2ec5d7495dad34420674846c8f0", - "1fcfa19ef23495df53c5e141493529117ae693d88976c5105d8f0e6bb21ed1dc", - "855b83173e536ec22b45d62b7b660b20430f37e739efc1b3c28ffbf47623b398", - "ede5adb8ade2e3ceca901197af25943a0a0cf05db26010d6b2f50ad0b55eafe9", - "0bb205f5d78a926303f6cf02d0f77de7d85152d6d5b83aa16298492b891ca023", - "8e5419d88afc224059b407c3183f0d265ed83e24688e6c67f189dc775f996187", - "4b48bb6a9988ed35df7306d0081c978e4ce9a9e8258fc8281209770383d21d2e", - "8645135297204e14447a91c3025187073317b7908bac69bee53930d8d86ebbaf", - "df5095915fd10772cb397a4cc41bfce18b0ff3fb3eef8c2b798ef0293967997b", - "48514675680a3e7679e0292056060cb32a17c92daf8a3bf5d938db230291d24c", - "282769f2ae5afaae2483237c35a017862774a63721bd586d6e78171ff7c132bd", - "96661b75f7334995b2631a6db5e564df3a63e8a59d7170e49be005a6f33e857f", - "547be1fdd15edbe609aa2e4163f680a43bbe305a24b1109446d5a50778093365", - "4e7db2ded24c8b89d4afbbb465045dbcb9f975d7bdd625669958fa3df462883f", - "8f8ad447ddb9b61721c5a8637e48c9ec3c40f0069adea8b4e44e5b3d7f81438f", - "1b65d572cb6316f9e79ab3290a1d8e99c3e4fbbea4de6de320814d939065efbc", - "63a25bd02732669825575c03fc36ec4246c64bfedb6d811b0d0d353c176b8637", - "4fde872512a26f40eea1375fd364823f20321facba3feeb6f33f62fdfad05e47", - "a556b69c0ab8ea4b4a1b46936a5fef6934fc98b4e724263719a9b163a510eb41", - "45cf7ca3cb4d0766be0433eef0e5a74e00ee64469ae32c225ebd3a96d8762c61", - "4bd90443588f5307d800d63e9d05e26a5ba1bdba550d6805238c760c76fb4fc2", - "0a3cdc6787186a23be90cdf5bab68b04e88b6981b6ffb96e1490fb90222ed95d", - "590ef46460ed6f70d07cb8aaadc631a9f4ba98b732bebc8a94e1888a88c2db90", - "ed738c6175c70efacfa43fc84d3466d548dbba1c0cd7a478a54c140aa7042a00", - "fb257f146caf7f0a2f7332c80e0f0437b873e1684b7c3cbd508b09ff26ee8b4b", - "13a893e0a2c9cb9152dac16ae452253ff4cdfe488f210bde1b3bf7474ae8b28b", - "aeb77c66678305f031d61246e8574c21fc4554f5168454896866d7a3ec5be9bb", - "c613a9599fe1e4979a35e43f27bdada1435f832a543f08214d70d6a045aa0d58", - "3fb54269618c6161e8a476cd7161cd834fdc572d578376a63befdf4405dc3b42", - "62b4ac694cc3e9f72cb3e6ba371b51c15bbcadad88f0ba7647ba7f1b65e32f35", - "193333967cb2e01b4b546d33b35b694d366d6d51b0180b05ba795e722f1d912a", - "3ee2039ebac93d5f900403c55e0a12326d99470fc012e7553c7f1b8dc5c2879a", - "73e4211ab9f631ebfec32a1f301a391d6653012eccccca2e3aa0af2a66ce9354", - "88d7f91a160577040561fe5358d0937dca5b9af533562826246689c9651d9c0f", - "189fbafe8e77043d059fb5fa7007869f684a3a572f9dd251dd9df73faf5ade75", - "b1467c2ae2ed3e1b338ca6bd08a2b9ea8ad45a5f436ae7258c76b0b455412f6d", - "afb8953ca121c6a315f34bf85fbd131517fe6ea1e21f715821b56676003e1caa", - "72eed2306cb5dca1cd14563ad2f4757ce878328b279e3eb834aeeaafd0f3bbe1", - "cc6c2e52f84b6ded935d14090ccbec4a9711b8e9a84bda9c2d426f364d2183ba", - "f86eb65bcd3e2938a59844db334c343b74ec78e91bf23aa580e49031c5e43b73", - "cff2feff8ab46ce63829eb9b89e60a46bdfd1df9cde4c9d9ca08510a619fc1e3", - "05623da6fe76e8131f7e4ab9b3ccd2c6c0b80984d433acc4499913442763cd59", - "e5f86e31f81b4a05784741a264a578455c7bcdf6565120012b6449c52b18213d", - "c6496a79191945d840d39829a53ea569cec4040a0c72f86241fe07e65849cdb7", - "858b6271dda66b2bb402e6ebd55a3907e79495d46aece7fc2212abe42184f6cf", - "8aee5dca4c7fbf2b43409fc8702f7babc4f476b77221eeb35b1c69c1e4838b85", - "1ab40ab524cff8dea20b738b810554531871491da7ef647626ce0abd6d50db5d", - "26112c97f08bb85a0ce7ef1bf8d27d00ae3ff5587808b393137ac64ff20e22fe", - "d82c709d0f01ff20ea0d5cdc482fe889792be3109f4ba0171d06d7d5299c331a", - "f2ea488db4e3741462f9367f6367b174f3e3a65336af15ac88e5b2b2a8fc89c2", - "23f2cbb137d30a3818919e1527b0622195f0f1bdcdc1316a36adf86bb704fcac", - "aed422f42725626a09daba3f0a909fe0709ab1da632abbb33571a1d1fa7b8050", - "ba051aaf6c3f12770393189211aba762b88acd554ef1e8440461e4055cd6ce6d", - "f402d045ee3cf5afcc49880afc97b2e883372437dafca62d028af4a291ab863b", - "96a0b97561a0d533a1cc4b792d51e7e99de1378f63e00408cc9d1680b96433b6", - "e7ae6ffaf159dabef66d68fcc9bb6a0a3764d9148016c7e9b0eee0c4d88d5142", - "4944165b07afbaeadddf49c9ca8dd004b9cae32b7e87de5fbafa43b6dcf1f0ce", - "16de67c932397c2af4ab55d95be5fbd7fd1f3e9ff6c9e30c61d59c6cc0a4a5f6", - "506231426f3d5a39586964777fe94884f146c2da05da517c552cea21bf9a7840", - "e74973d9ac7f2fd0c9097183cfe62297150f20229b7e6efafd1f7fdeadaded0d", - "183a80a23bfa43cfcac379b898c1d9cbc5f874d3ff0fe6e8224da6be86f1f9b5", - "6b53d0c3ebc97b810a8e44917b98a5aa41e13bce1d619aa510485ed81d22bb45", - "9ec899fec568e58a827926b8457e9d7bebb27f0aa7a364defb134d634b868697", - "c75fad710732a6a726dcf051d48994c3d34a41df746ef45f35f1f6949bd0a5e3", - "31d2c0e5cfed469f6926329ecaa30a0283fc67c6fee6dac52da9ac9361b6baed", - "d33a3ada4a45810351d8a183c35520706d8779dc33a02fdbc31f332f6f3bf021", - "c1c207b6b18c2815c936b9c265a3ecdb2575d67f48910ac4b14b1d75e40b3c27", - "4fe8b15e8bc3f78fc10f8c6a42a0cf177a7d7bc0feaad8c54a6baa755577bced", - "63e7b2fe8d8dd7cb1583ebde0bca5530585ff74d5259113409a2eb559ac0357b", - "137cf3565e4660abf93e706f1be82ae5b3ddc9206c52fc860059d199e741ddb5", - "96ce6a3b25ec685067acd1df8d26142f86163f1fe38a6de74907ee665c4994b2", - "78694b4f3806a73e3244ed087f722616d55dcd64a2360c955a537a4857ec6edf", - "99d04682aee99910b3cb6f34ff1605c5671b36f0361e2ef7309ee75bff02fd36", - "33ae5e022d5783a3883e4f4a6f0d6995406f3c0c3d73d7ec24dfda29bfb48fdb", - "ebd7641a7f6c328ee6a0d7985a5efe8ad44a94ed612b157c4b5e24418a2cdebb", - "bae9a69cea07ed37528c362ab9105c34211901ea669122196b3f8f942999b91f", - "9d89c9c74d9de7e26f80a08d24bd75cec01b5cf719ec7b92446103b9de894b39", - "0d5fa537f7acaeff791908fe73f9e2d306165e0415d6c021959d714b01e62cc9", - "6a6534f808a927000268ca9045f4a4cde70e9900872965b08f80961dd940bb1c", - "8180e2c968754a56aaba653a36cf5879a3b5febbcae58eae6793c72998a4766e", - "f05a94f47c5b1c7c57f139a41fe8e539ef754d224cc7b3a0aa6af8a6ea71d058", - "11d81577dccfb96ec48806ac86ea4225f1e75ac7fbac690fe306e5cce8c3c291", - "0773f7281570eb4c277c0ff2a948729808638f0cb2167b77ca20cda907046f3b", - "ab52b4bb646107981e0b6904f67591118e9cd134675ee62473ae181e259a0544", - "160d32f61c44b311f8327841fb0f35cf6af76524d4008ca3e3de34b860f3475e", - "4be361939afe22e2f066e7eab6779cba5c8d9270ab1831fd981c421efff08a99", - "ba9b86370375b5658b7ed912fa788823f47b535491fd53c7aa5b0d1922f28522", - "331d89e8b121518f1970021e4c697f7bc944a75a4b58472a275e81fa39351bf1", - "ff673e0276c749aab2782a2170b76ea3f38608c2ab70cb84d7224ca0733b6a0e", - "8a05f09042f18094a39bb1d9a05e4783d95284b2912a6241c22a6c243a4e9e9d", - "6b465e9242a3fe18a112e060e8dfa7601deca1558ba45a18cf7f282a7e6f0e0f", - "6d5677ef2d1c52c9fdc84470e90b53ca4ec1150dd2896f4c36cf7d93436abba6", - "350f0262ad211c866b31ba1dd3c80c8065b74d443fd946e6ab7e17afa5ce5fa8", - "167a35b76bc58dac80cd41885e3518b7190fb9be32432f8c550045f89c3f8510", - "138008c49817167ae9075f6d8031d7f8cb24e08d6667726def460840ed5f35f9", - "6cd669fa70d34327ab0af21c169527926adb8e8dae0496c9efda664919d6ff85", - "127b3fb11ffa3b6757ddbb2cdfadb9319f041b3d7d8de7dc1e9d3d7c13995d14", - "186064963aa5aa4200ec62b54985b0fe3006a31b349fa7952683530004368088", - "33c16d58f1e6a9519384a23bdae58a4fbe9c38cb142d64a9ad44a1f04461e259", - "5569e0713a936946cfc803a6708488e5bb5e7dbceabcec6ae11c2d29599ee43e", - "9f2887f90d1ef3d61a3ef28f90f316b88829b2290dcd794749454f5848e0f8f7", - "5a0b1f5b906af7e379f5480a5a28bb5a47cc9cfc24c584daea7c780ac55171b7", - "46797d87d0bda5097fdcb7ccc40d776e91bc11c680a59fa74425d39177b0e891", - "7d8e99198020b8e5d93b2a6eb74a2c1ff7ae3055ace1f7458ca058abbc83b960", - "dde337827a1c2be6abea1c6df46140d719e5ea9c6ab20b8d68d0a579c5f2bec4", - "8e14fd590abaa84bf4a53c34d1bf34f1a89b87ffca3014fe7b21cfe0cefa0238", - "e4268330d91c280f220ca9ad4432499e80d6e3af144a09e814833764266fd219", - "c5976ea55810e2ee3c83308907ef279c7aea89c807a8c820a732512d26ef2453", - "782d751f68d109cfd7582f34276afbb2537d1025452326f47210398b492e0f81", - "393bb526c5994a48b906cb99762a24adf30d8b0a5f88fe2b919e99e989c07352", - "8ebc1a5cae8bf273469f3348f7d87050e32759c8e372d7cfb04ef2a09aa44cb6", - "b81b5899a843a858490ac8228dc450fbf79c17e33cbd9bd54d39aa070d45b1a9", - "4cbcb11640d175f44a3e0eb6f1df77c6650a393529aae73975ffda6fc018729b", - "7a0fe81ecbb43abd12c96b5c651cc9cafbf9840ace8c64a5ded82caef516d966", - "424da0f422a7db39132b890d0162ee3c212b1a600efe355717dd30a2f2244435", - "53dc590511ded968e4c826a606bfe642f0464ec2eb93f37b6e311e6dc6d3acb2", - "08f9e7f09ccfdd9181b9a31a49e5cdb2aead9eb434169626d72e038d29580e29", - "90aa6d975d03426b641fa0d753383750ae2e9f728500ff2959d8e4052b9a2d4d", - "0992a6bb0e9b98691f0476545c3b866597e40e63f8d2b8dfb8ec79594ab18404", - "1c683176f6d11580ff8db2439df29bb945984457d3d1f11764aa2192c6a81e2a", - "06f6fc42d6bfd918e457fe04901e449b5b0b146989c5db1d139530f57a3d9eb1", - "49643c0482ab1a34c93670d0554deeb81d0904e894151ca8f1568af39864cad7", - "dbfb9d4d8a3d6bd2e3626bb475f1740eb932b0cd673f545600d8dc515c0baf37", - "76acd09bbaaaea995e4f9afe57b58921d74b251d3040ad543a3a86a98ec05784", - "2d5dcaaf0f2ffd1a232c9d01d4042be9953e1176be8f8aa2796453bc804eaacf", - "8236063596caa35be0acd5d685009a166ce0d3c1d63cb76fdac3ce231cdd3d7c", - "aee4727c628f2a5f6564bd6a6b13fb1ee5c6c7357000b9da83112edc8537aa06", - "1c966bd893201a3d4bdde5dabcc35c842a602c6ef34fbc0659c1ba405095cce5", - "9c6036cff3720064ca27929f8b89d1660185f2a0f9839f00f6551288e3f4be32", - "4a822e2ae0d4804d412ddc213ba4e8ff92aace56efef43d15f94d3eb9a840d07", - "9b57b25cfa3817dcfa5d50a9615423cce147ddcd596f6af0d2e3b32b2b11b9cf", - "de86b72ea099f9e9ec475c6170eb669fd663dda3afa06d3e42ce9ec1218a5c4e", - "d5ca7d02544295b502d10709f69bc654d15734353a6f340c21cd8d6cfab1a1da", - "c2de36ca9e75c424336170cbafcfb228dc2dfa0d6a83c139b2c8d6b0cb9b6f75", - "78cb5bb3305a6d1ac6482427db77d266a91e290476b6b69a9692b38e403aedba", - "550f4ee8bea96ec3e9c4c2fb25300109d3584b4038cac6dcd0ad7c70a6826e9b", - "8bcf6188421b271b2b3a67480deb6cc3c3681ebcb84c040fd9c362031cfd2f43", - "293ee3a52476dbf0045c52d468ccce46e1736485352f0d7c7aef0e5aed0f43b9", - "c3598f1c6f8ec5933151df961d33bcef07631c40f6ec97e0375c7f046d116c92", - "fc8a85ce28aecadc2652c9d5a490984a830261e26f5927e3afc20c969a0a6e1a", - "27c8b1dae1a8c6a6f3f0036e9d7b73eff946a88420570078a64a51b55465c16c", - "c21f0721463c7b362090500d8b9cc33984e461186580f3d2aa53a6932bffb880", - "7a7eea8c7b5643285a127352639cb406c5feb4e80471911405235f290cf9cb7f", - "3a44a959c4ad0fa73a496f90b1a4487047977524168744b4a193c1d276cdf8fa", - "806c16cea9267195d674a001d19e410c84c706dd7f08787745c230ad8861eb5a", - "34b2d4b985dd009c4aab7a0a8c60b1e269a3930283f14fcef3c1f23b770ab233", - "64b63d5193f3519050886db42926e15c99bb697ffa15fd63c9aa428a5e94e809", - "e562de26f5fd7dab17723c0e6e003b0fe472bdaa79b4f0dca328fcc20922abcf", - "71a66b27f4517160b45f2a1f50901c4d4cefe0c85128bccfee54132137eafa88", - "5f1d1664da488aa4e9d05a5d89efa2739349117c412f51f45a1a5a4486a42f3c", - "d4521da8d793b0fed87b1696a758b61d6873b80ba1c6bcd28518fc8ce702ad33", - "3a555c55bd3be4786d5a84c0ad7d714022cea2a4524ed4d19d5826d1327f2ffe", - "3c3d84f36ab0b1161a67918b110cf7651141aad9550b7fd531d8ffd6203944ec", - "89be7c86033aea70c13ea6adb1d7aebc61b36c9bc4750cc7b40cedec1652eb10", - "bb38673ab99b169be7f27c963530cb86d5e283127acccf0bc7ac7396ac1c962f", - "77b1f254957f9c8b6e2099fb6f90a293913093f4bc0ecc769186ea36cbe79a6b", - "7bfbdf5028f4d4853399e4844548c8b47b855ad9712e5f6b4906e273df74e8ff", - "b1f035e12383f72e28c72da257854b029dd34916593839863fb8506fee5fa944", - "203278459305e8abffcf35e5d125def9420528c3a713ddab2bec686e61014232", - "b46fe93b52a447567d6bc564efd2d716c42a13b7d843e45b94b3273de1eb3267", - "ec704c74825337dde352b0655cb173b4a9343b7551acdbdb91634786623fc048", - "ece8ef638f80be3ebc49cd51d6be077a4d54861901172ef1bb41c6cc2a6f5841", - "467eb448b564e7aacc4e5dca1273a653561f2b792e9a4d62a78f0d905d5dfbd8", - "f36c6e6ebb0f5a7cfc5a4765f4173491f1c8897357506c497b9606b99f312b6f", - "859ffecafdd7368bb9934310347717971d20bfe7da9060ec0a4faef41bf4892b", - "d2eafe7fe666ee7567c922e94e65061d54f7c771001c9443d4094837421aefc4", - "aeaa620b6e53a0f06471652e1a8cdb422e37d1bb8369419b97065c8468f6fc39", - "0482b3b9c1b4008adc0f99d7c4d6a6245024dc2f46b4d696672acfd5f509ea21", - "01eae62be11c94485e21b9da95d7cc85e6aa6b4ab1025d35b3f6b59755ca365c", - "076031a7b0414dfd974e8eb08fab90eb8f811485f4119f02b9d9b7874abf3fd7", - "9191f768466966fee7d6f01e174ac7c4bcbb1b94335db01694436edaa602f3fa", - "7e350e87c234e2942d63577cc2697412a5bb528f9c14217fb093cc15d2de5eda", - "ca93ea88dc9fede8862305b23ef89f5eedc7a11d8a4cbece9a36539b772a1a91", - "69dee0c4984589f27d20ec6000a652ffaa7f5eb49e01c9a31ac1279822945a84", - "afda9f3fe83b69417d85e85b450230141fa028b87f0283abb5bd3f939c1ea4d2", - "484eea72e60a87ef8ed56085e7fe27e66c69fec7c09aa0296aa2bf56410d352e", - "1cbbd1d03cdc9576b8288b2d1929d36e5978b53beb45557cc77d18787455a553", - "8eb072369ed87f9f626908a827f275df0fc4a87c9a4f222625b1af1d791bafdd", - "09d96d1f1ff1c9651f167617bdb2fa628372794588c279815e5315f7739097db", - "54ae4ed7bcd3d6b31c186d4a80eaf027351356a8fcafea3bee3f8ef4706310ea", - "61b76be4bd341f4412fcc1fa4a35ac46c921937624245014d5b4d65303f6db2c", - "27c77f6f27d61a75c92bf605e07c7b477e5e50137e0b1f176a92184c81aebbeb", - "481a9637165b9f96be2f72a49ab79bd7da762872bc2b5083ce7982882d8fbd01", - "33bcc294659a6a36ebb1a1a30e65c0e2e8e375517fd73def315bf49078de65a9", - "41113dd84fc335daf806ee199f997179006b494c8c377d0d2441a8acc4beb0df", - "fbe4c6bbac9c4fa7bcbec4b48a8c3b85945a8ceed4581cda97cfed46b3a2475c", - "8ca465a98e25fb2899c31697cd9789ee2f09b9dcbe4f47e21f4e870181eeac8d", - "846e9b0e9d8f21c79482246cf2fefec22f4452f48568b579d78746b82d61d411", - "554094de598731f31eb13b405fb172704bb5ad4697bad3cd41251916c728f30f", - "fb5057470c921c1c06f7006775f11edb45bbbdbb111ede7f71a0d41c87424c67", - "ba774e21f6b292f586bde2ae90291d5da7814167081e8ddfe20ffaf8b2c3f504", - "7c9c937f4fad2724ea2b3ed9db11adb7aa33abedddf8d5c001172b4b55696e93", - "eaf389ece3eed113048d183a7bbaf4d7ddf701f24265821a2beb865d1c41d4e6", - "ba9f91847850073db62681ca361480ca39de730bdd9746f60db83013feb6d0a0", - "eb046637c8c9eb0eff2fd9ff1ff6cf70a2149552f5a97dfd81f110f530bbaa82", - "a0ced60a4726c465e6128485827dc9a51274ba98c19f0688f88b7effa2ffd0a5", - "31f7e5718a30047f0d41f877d182534921c4254b0cbef166a1e25949f28bc2c1", - "06be80559b229568bf9f42b246812e2677014f3ccbea4aacd9deca9dc14d2cf5", - "22a53089a3b2a0b024368837e03c414cd7e66f87c9715717e43bd900ef37a75c", - "cfb7fd58537405b62a56c896e8d2ffb946103e6117f33762a3aeee7a9a9b52f0", - "cd036c395301c8abeab6c3d8c75c9405f2ef9314f618711ddbef595e888ed713", - "05335fa13f7545b239f5cd5ad28544e2be48b988a5ec7ef282896e368aa88d58", - "312257739ee30c4cfac29c35d20bc93f8beddc583f5fdc79b0e58644edde003e", - "a3824b2d0e8e710ee40fa33dc1ca3587fce90cc73a043dcc10d134d82ae4ec18", - "798501d1df30df9d4b1defaccd5e714b2a4b8199cae13c8de81073a54ef5291e", - "ab430c41625bf2ec3b0ea0eaae54fdac9ef69f005d33322eb21c5629f40f7ca7", - "efd12dca4acf79b170f028e1d72648a31282e2571fa7fa62fee18e3062049e7d", - "3a69ef9f0ffcf65bf05af62aba53cbb85b6057628e2f095fbd7ecbb6f0cdd634", - "d7c898b3e20c1e561c4cac24f595c6e57c14f64c2fecfda9594fcbfc054b388d", - "1d77d239f0c77ed118e7c6fff73827266e28fb25c8a4e32c962740d8bb086c4a", - "6d7edd65952792948520966dd7be834cfcb476f7c028eb03078271a3e315ac36", - "65683bb9f24a03c58f207fd5720053c68c5a63cc6827429d6c8b648666984553", - "a98eb79f92f8c65445fc0d198937ddfed8bf69cd6510870e97bee4797f03a5d1", - "db0730852cb5cb94d3670a0ccc29280161868ef823b35504a9792dd425c48e62", - "45d8bd12c98ec3999078835348bc0844578ee6b240b5f2b3e15675990e001774", - "abafd4beb82482421f7ba79f79758ed8725f905d65a86aab3c7ce88b7e2e2e5e", - "0c15900803ed24ed8e7d115586f7d569ac1d9ff291ed32efd3b2e9cc3d93823c", - "102a103c708acff2b89adb168b3a7bfdb5c59de2affd5e23a646daee72e36761", - "24cdebd7b24125898e432e9a89fb7fd60d83c832850d251e776fbb33c67e0736", - "e5f8a038cbd7c5061064bf92b91d381cc2594860c2d222a8d7ef994751ce40a1", - "09a652dd3b6cfb0289bcbad7fc4b07c319e2f4caa64fad60ccb13ff5d30ee192", - "705eb31000aa74b2475279062479b0cbae7e9f6bed751a8823c0ffb48daacd36", - "9a906a9fb50f1742d783a4b996517a5c736fe3988d08eb6d5721d17aec95212e", - "98b8e056576e56d81deb84681d7edba7858e6faf71b19fc2ba444bdd636c1487", - "2defb114480a722a3be5e65f93cc4d94c89b0f932bd1747c9542a31ace766eae", - "aa1a973a8919d232734be6e7744c474f141073086a2c3d011f3a482f083b7274", - "0698f1ceae5abeea529ac1e05ec834135c0b3203177fc980614a476a3dbfa63d", - "025a36910959361616cc386ad274117be9854ca70ebce2f209e5a1e72c311e93", - "0ce7e5f7d902dd20b086c8d1e749a7620cc012f1bab5454b5d7bff32f576602b", - "3ac2e4380816cf27899607bc8ca94525c197f57325d92ef9a86c57347936a668", - "0e76b01b255dd4d0bf3d79e93b9b6a1d76e4af5cee4f5522c77955979f56939f", - "1bb89df5f259f139d4a98355d68ff30377437a82a358381d93461f5618145006", - "5a3e920e2420a2f290c6939ab3527d5ab0ab6a7f02997b70e7a74c6eaeb635d1", - "14d48ff4a2ee84336e7baafa2b8007f7a5bf6d76c5d47f3a35219642f34d42a4", - "b50dbbbcc08a34ffd01c11069d99bf48e6f8f0adad86ae0fc805d3775d6a10b1", - "6d0b9e9e3dc79abc12f4121e35965557258c2fddf24d3cc6f1be12d0106332c3", - "586ce89864231c4d9deeada8c31fcd317a411c8dc16e6daf0308f2f3507dc3c7", - "9bfea604162a0f97879f5378d8d606ad4b70db191c9970ad76da0379930fa53b", - "f8510743356ab7c7918a709342ccd716e4e2fba32561844eeb7ad6844751fbad", - "c9d96813eb81047ed4b13cd554592658e93f3b471aad72eb17964cfe12250be2", - "25c298918baa1e07a8f17c640f31104cebca0c981674062c5604aff8eadaefb8", - "60cbc3c417c172c813f6ae9698b5af9eedcc8425194b0ceaf0152c7af0b6041a", - "bfb24174fdb37dba6868ee6ec4b17307b5ecfc0b15576d3706518442aa78112a", - "72c738ab05da1cbfa16faf07d51f088663933fc26359e8fe75410120f695c27d", - "9c07bd5218b5b80c56635aa923bd192738d669be01ebdbf72153ad30c0fd9de8", - "c11800a0579e7240716955054de7597ed41ecaa64da41200b8ca6a403c83ca3a", - "3e5891419fc5ad0277016ad3eabf161298d4872e5b72f7638f9046ea6d9e1243", - "c29a350372fc6928781c3e0699786985d5591d16bff5e8522dee45c0887ac93f", - "011f0ce5210c68640d3dc19cf6e575abe17b5debcf496caf4cbb44f6d16b3a65", - "571ee794c1af139197f0a25d59bfd7267cb7849ab3c48f944496fefef64dce06", - "e30acbe867fef15cf599a27626e5e897cde428fca96f6d9c75678bd648fc31c9", - "c19de535dd1afb6176232edbdcf4b53f5b724355fd469a50aef981be85551780", - "f0b1795c444cbb78eb8e1bd6881ead48a2d636fa97daf01d416087fd58b5d10e", - "dee3ba8c0d2bc04ce4f1e0566fe81442ec9167aad874179ebe77468111f820a6", - "9aa8311729f346746c166ba8c17b88440c25be338350b32e11ae4facd059a44c", - "a2e657bc9d507b41180461e5f45b1df9fe0f7d9b01955041f1fa399c7681d3cc", - "657e0161dff5717c59ae22e0341e72c316c6a2de3602d84a2a6b05092038b7f1", - "b07510043ecd4287aa6d7dd4b22cf9c6b1bd13d1aa4a46151fe3243fedf96599", - "394a4bb7a808115b9ac6fad600dc28765f3be75c8275c27a0e557af3cdf2831d", - "356c8cfc2021b0a2257c8c3a6cccba389540dd85bfd811f9cecf3dc7ff4c6dea", - "f914cae2bd369a7ca5dce6c76a7ca2eda957c251ec13ab07cb2fc5cdbf4cf465", - "ffdf02c07db94fcb08bc32363718a6e0fff29f71999af89b1b4e10cd6ca697d3", - "94691040433311c29f9af3702f39347d1f6bb188d44b9fbbd8341e156e8e2c1e", - "cc79a3185649a8f9c03f4cf7694a854acbc9e246d5ec2a046443655100e6fb5a", - "2867fdc85c197da6b2b932cda488ee05b55305e942f1f7ddc4f7e461ede5f7c6", - "da565f2e46e76366bddb79f3dfe2e3896f943be219a73b3af79657a219cc3a4c", - "37a6606a7f517a942af102da5526776f172dfc506e1e380ba69223ec6dd239fc", - "ef0b1dfcc82ac9119ee6fe8446f4040ec6e747e598af63250a63388322c36f2a", - "54e2bf402dbd187441c2ebe9d72a872975f8212c9d8a15a00a4e82c5414421cd", - "3c8986c80b2a9f97140fa8daaf19506e2a137e11d6d60f0200dbe62280afc647", - "b3e861c0fffc0cf8d2cc6c89d55c6b9cfe90d9de8c6ee3af5fedef08b9d0eaa9", - "e82ba1827a1979ee309cd84a8bb0645b42d9cb5f5e1278bcc1edcaf092d17282", - "e0b8b8c4f93740c483e042d105c11bb3ed63b5395766221b5a0ed16a55c8f89b", - "9283ca03b2c421b7837156ab4c1e2d44cd413411859622fc3b8b947c2c86ffa5", - "d89024a9bbd23386b4b6de8023fa3cc69da7fe1f07c5c4c046b6a745633f2ca1", - "808c395d6f9609cfbf8fdb3a9f5c71ca6ef378e946494e48b32df3c70fb7f77e", - "862c3294b65e3e220b617a87c55a600ff7c3a2ece83a91edc538e33c62530fdd", - "f854ef10afb326b8d02978e5b42a655f8114e9f4ecc303c06accc16f7775ab70", - "233a3f36976a97e035997c2c4090414e131fb3790bfaec839d84bfd9e27021b9", - "5e931eb18d04dd8d37c8aac472cac5c8d0b2888dfe01f249a0982830bae9d6b5", - "6aff3073efacb70d321744d1cc5c1ef371593ac64e86ec93be008a3f9f81053b", - "5d1ad4da9739dd7c3bc931af3663558404ead254cfcdb71485eeae4f6de2df2d", - "4ba9d21eea237c887507b81e42dfd20ffbcbff23ec9b25eba486342f39fce40f", - "3fc47a15168ad875ae406753c1d03242e542fd81d9e7e48d6be6182ffeb9cafb", - "c757b0d73494ed61e6ed319e4e1bb23503a3f0fd8b5bc3148c16a10e1105bac6", - "b187128e1b5907057135da392156f8d8d53cad2b78b159c77a9f1642ca826f7c", - "764a05ebaf23fa9e978af1e44d1b7f77a6d8013aff962b8ffb6e924588133299", - "1dd223da239c64319c51a36793a13dc907fe9059bc1fbef1242a93f5ddca36cd", - "c2afc36cc778ed74d1384fff37f08536275d4568796b4141f18cd47bb7725b8c", - "52af29d539c11f16b1d1d342a6c33e4f8dbc9db18bfe0a0abaae1b2391ffb18b", - "6e93b16bbb42cf378c937b61c542ec47dbf4e6fcd781c70c551aac561aadf011", - "91f7904b5b7a97a5fc9c17a3074a876d8744bf625aa75311e8a928561b969e05", - "7e9e100e518fefc37047d614a8d6159a7a46018c8c798f2d83679cd28fd53488", - "26f4ca81b6f87e0154da10a728da66974999a0d71855aca2cf0fd99b047b10bc", - "8bf80ba3a2684e84fedc03d8470306b9ed42b8fbe60393bfa58a0d26b5973e22", - "a5f8d226c8620d65379ff19afb3957ed0bb43179f4d719ff78eaf5672bd716bc", - "bdc887170b3254481fd5495eea2e7fc7258c3133e110b93a41471e94ef081b3c", - "9491ed56c666133dc3cea6af2d52e5793421413a9988be91e905ebd51a563186", - "ec111a336c88bd6684627558176a89c51db13ba3d305a9c610a65b5b256dcc7f", - "a61182c79d6e48298751b97f10340a309419acca8cae2c793b0127f8710e8bac", - "6c5e65fd2af6c4d713508a4c79ef4877efffc903082075839500fd6de3cecf0b", - "e8ed13ecccbf5dd0dd22f47b89c8b34b2f827cd8345726761de9b8dd9f933aaa", - "843e92af5237a254e47c93880c52b00287dd06cadc450e71bc34e117b9a2f868", - "8c652fc756168133c2a1fec30d86815530a6fe4579725bc3f0c529c56681ce0b", - "e16b77ebafc675235c28e08b3ea4b39e0939a66a877f2077a101dc2280b9663f", - "a0d930bc5aa25f4f41cc104768b71995fbb845755fa5a8a7ce08658a58651dfc", - "910977952522248288e0ba244502655834ddf367ba966be61ed87f3b712c9ecc", - "3ed50f7aec5a31b2b27e90d0ce2f0d238db091654e35b3cd7f0e528851959f2f", - "509271136cf93705060dfa097f4d3ec2561f5015e2cbc5b608884730855aaaba", - "93d780d2bc0fef066a3055de80a0859b1bc795e0d3e7097031d45732fe8f3e5c", - "83808dab877bf5037c5915981041b613d315c2600167b5b90999d2f667c50a05", - "297ab9e2add187cf72023a098b96faf037f596ad4f79f2f3d6526fbd8e7f9bfa", - "d6101d57c1ad3bf766ebe4b3c42796eeb4fe39d6b3a04caa37494696cef7b1c6", - "895cc5bfe02974539d2cc6e1014fdab3bbe07ddee3c53735fa159519a2ef926b", - "6f773222ccabb2a268c22a72130a2d06b4a1a59a990b05af73d58a878185b4f4", - "b82175ea73d69b4d36d1f34f57a29eb97989786b64e387ccb99901dcb79a02c5", - "84fd96cfe8d5350474a613f64532a3e95368409e79f99860a2930afb644309c9", - "0d12360a824818cf5b386363675ab5dcf36102d1797d2b31ff51334a76f1e1e6", - "e0214f142d236132c239264ead23ba2969a4603587cf737ca0a809a68f9e47bc", - "f84d03ce20e46b1965f7bb78b5a65d93a3990d69eafbf6b41a16f38e6db29859", - "a5f4d4838f1424e0d01146e02155078396e0ab0dbe1b3f3384638325690d8680", - "e1395f2986b18ef7322dab106c8d4e46304aabc1f4b6be047c512602b1a291d1", - "cdae5a0341cb1e117cde3ffed0676ea8640fc2fbea34b13e49eee6692a316ca9", - "7b7111d52df4418eb451871d99b521774edcf965e473b32832d5096252844912", - "8fc8d2cbd914ac970bc5ee6be82d29395a1e57b3f99e0d30062fd7d25b1b8197", - "5c165b12af941a065e17e2726675cea0678dd7260756b20a458ad030c0c4e603", - "42f04c4be9a2bb7a21f5f61e165bf823454320d1e2657519af830f3946026f1c", - "571c62edacc4aaf8cd5fa61e23ceed037535089f283556304500781c4cfb3046", - "ce55911b133c0fabf962d0a4dc2fa5ecca2d77dbd33568931e151fe01d1b68b5", - "91d322c96b6f094c9df1a79a9fad4d3a18a5b440c61d521d64baa5574619419e", - "f32b049ffbfe9bd15a6d33f96beb1af84c633e5af73ef3520cd1e41a73bf354e", - "f9306ea949fb7baf12e6fa307ac89bcf98245b09f8c23b54c0af5cc3057f57c5", - "7a3aa73c671cba9ff0832e1c260f6a96c3632eb2534bde0e4f0adee6a9bb01f5", - "297525c1ac286fc0873b9b524c0b7e719b4bcae84747878199fcc902819cae69", - "2e49d54254a7cfd72172cbeb32de10fa7548af2bc17055df39078382381e39b7", - "5de117c843d5f9c7c8cabea745feb94f38819970907cc91c175ae034f6078513", - "6b702fe387a348afa1c242680a7b34ff908e4db6a4d496a18a47d48205da4aaf", - "17099f2e02685dcd11b59cd20c9014dc5eb983fea03267924cae88de544bd37b", - "ea1104aab44f46fa900e0ce3166bcdec05c6de1eec64dc411bde903a762b7d62", - "e9e76bb8d82aaf809b91d9e90e5a649d84e74f1268e300511c88c55760706316", - "e1bc053e63cc70978af7fb7b92d0627712a0a1298165265daced6904bc712bd2", - "b48ae1b0c29f5db707a7cc65ba4722f9bde9a685143d5c57c1b24d48b5e95924", - "7f59ae0b69670e8e87e5e434c328c95317edcbecb628aea28ff6d593119043c7", - "d62e27849a53781aa6a77470e42ce5d1782fd4760c3eea9c095eab0e0b36fa43", - "e3451d6fee784f9f295ebd50e59885b9a793e2efbdad2f939f3e6903e3f634c4", - "c326e29b9e67c63341756f341c166e2abfb78b1db962fc49a9914a8d264ec7f1", - "a817caffeb740c345640323b9060ff977f48d447f8fd57325324552d08af153a", - "df49fe88c402abf05403be63f085da5f304e20267b7a68f83b7a9c8155e6c60e", - "a5defde793a5b75798f30ed4d7d7d018113e4056886541dd2b3056faec899577", - "ef8d6515f61b16ef4cfddc5e663b6a1b7ae3c2fc74ae16d7312014ea52779452", - "b42db0395852ba03b208773af4dfe5befff688db135e019c91d20fd8a62475d1", - "1b5899ad76747754d16c57701fe6f8d0af9f03dbdd61390ef1f2c2d5a93e4c33", - "c38907471dd3d1cd0a34fa355d450992780d492e18a9096e99e2801d814582f5", - "91a345fdca7416b17a3c275dce16f252748127af2a8ccfbb9675ac786ede1c1a", - "5bb198f4f8c859c789d53031f46d4995ba112a0812dd1af92a2583a546db028d", - "6f461d904e001ed385b2135cdf48b6ec284ad4b1afda44b4126c5bc5156dcf8c", - "bb404fa44e2149cbad833c49c884fdc4c3b04ed36822c9b6fcae625e1e596b18", - "db74c8742dfa1a63a9d44d113ae21c14e8b476e8478e741d1ca1d0643252687a", - "4aacce9c521e7d01c314ea102c2d2a57a0aee40c618b0d7a62b161ca3a17731f", - "887bafd93abd05ffe9625c31b846cd6daa1af79deda0865adfb65fa111645d2f", - "cae6be21a8de02bced7ddce8e64414211652e0d46f010485c4ef9580885a7bc7", - "d102dd7614781d8318e50300ed2f131601576c85270bcd64d95d6369241e9fc5", - "612c357be7c6010aa4d5d8b12e793d048119a83f24fd36f089a1331a6d20785c", - "31aea3dd90b780114d84c2a3b4abd45ae34eb510d25c8cc082ebeb3eed813433", - "3b0814b550753a9748a62b1a6d63de2da25f8be11f081a4c56a90a0bd83a1845", - "d8778b477a0f0a5c859364d8560e1c0fcca81982e5488d0bb6f2e60ce2d339d5", - "29be6bd50622b9e36d5f96ab4259d9b24aefd15d89dc024fc31008e5dd2d0197", - "09ad1c9a1510d3a2cbd0da19da9f586b302bf96317da34302aa92ee361138bf9", - "810fb4a1d0f796cbae0e123b70f393cb993f97060987cba03de05b5e08f9a959", - "93a5edc1b618ffb8846f196a3f85f1b047a1530ad1333ca55ab90038e0d7042a", - "a76aefe4ae4699c6a5d38a0834dc2892b75fef643e8461666e56b507d9d4e7af", - "e26e54616075bb008e428f7063456edefc3645eaf090ef1ebbc2e358d4fec889", - "b393dab43534e74cc57ec4a8bde18eb95e40bc70bca984e2ecd295694405aef0", - "2d9264281175924afa209e3c11f2ff628570847dd5cc1c737583d948c584b23e", - "4566fad59c931deb6b81a4cb446d654c60edf0211b5a132d99eda663839074a5", - "72b500065a2631eebc338a53861f80b7ac39ca01b4d5e5e4fcb66884174357ea", - "efd4daf6992bc74538a3c36eb1c8c37d02c8c3bf16b11989d3f60ed1c385615c", - "17716e4bb983baecb0f7bfdbe6028eff14d16dcd56d9590af487cf22c595024d", - "51b4798edd64d04a04a46879eb0b5aca915da9f5514427f375d1512b61b2eb40", - "66e26947364c162b6362c9b7fc1dd29cb929ad619545f13abc013e00ad570cc1", - "0c4330ebe249e055c9084c58743f969ee4edec948a6322700640c8e0717ac9f3", - "e319e279946092679b30e25b3611663a930a13d3d675c3cd4fe9f7914abf0fdf", - "d3413dba4286f4c0be8e23247dbb7e33c8edbed90a2147ff3a63517890a9f2f7", - "6a9caf3f7f015befbcce277cab86dfe60dbc7193ef28a26fbc3d9ca33a941360", - "7e32f29df6c36efd9563e43bf09db50c9043557948e586bc9796b80bcc509457", - "0fa15dea915ecffc37e6159d75ababcc376661865b66cb568594e438b96d1018", - "2a2bf2435d147d43b6cd204ac273923df92afe5f8947795f840259471b323496", - "311fe6ef36d0ca8b9ff3dc5b622e93a56017bacf47ff10da33191238fb127777", - "c6434ce80ff0c4de40cb0956e80d54816f3ba020885c81e137cef9344098fd37", - "93f30c2394c6b0f89a9a75c7024d82fe4362e504f497a12476379d678870f274", - "b8a695e87a4dd545f962af08ea222c5605e5403f59434a5d49030a092aa50a05", - "246677abd0a6ec25237c5eb5c5f02dd10de6b274951b15a4b5a31088195eb8ec", - "8fce2d4eeb9fcaefdf91bb96ec0e892818c4c37ea3f548de77af044520696041", - "a41010c3271f7c410d445cf85f870c3e84e02e0f0c25f83cca38fcf2f5f70dd8", - "4eef4329ec3f5ce6a680163b1434fc6064bef2e93539dd9a5dacb1550e56c554", - "ffa83546d19fb617e714adfd1aea059a0ba7e02548be3688f8b265934dc5442d", - "3f368537666667402e34710bed7860472a68f7c85d4fb67c13b82c3e5a2543fb", - "4ac8aad511c4243a4101d4c11b3561e5adfe5d5caada73f55a28dc7c4a8f90d9", - "bb6c55aa53d3ea893a8f0579513b52202373836f5c2c93be72d4ef1d1ae89108", - "de66be2509657079e95fdd9fdc6e08d9978741531b4cdc5497f00bd99e2a973f", - "106dec79fadc7628e82ad2c62ebfa6814007032f850febbbce33e22f25c86504", - "145cd84866e3c1910e3af1d5e8930e27155962909e576d5602c14689742b6711", - "c281d6af9d55eb71f4368ee3563fa533a2b46ebbcae97b9f6dbc435a7d270691", - "a65f39f4a6c6721f242f19a3760e93ae58137f6a303cf74b174df54e24716ba3", - "a9c8ca4b4118abbbfc56a67a0c7c0b5d3591743fa431ed92f05e1b89cf38ffbb", - "f9bbdbc9dbec6834dab26952573b7c4abf2773507deeed34368feaa860b3c6a3", - "44745be5ba2855a57f2bef304f01df700439723161610c1cf29ae37c6a142685", - "e18b8cb2c52af3def3884fce5093a9fcfd7ca1ca9c63d077702260d685f9cb48", - "9b08d90be711266947d9ecaf11d15871d3318baf94e0d2ebfd1848c6daba768e", - "6d5a93b3dfa44ca06cf4abd3d5863cf8ac631b9e5b55d063803c000380c761b0", - "f63d95fdd9cc7f5844c5565521e1c88d400e3d1b63a86c87bd367bd919646ec5", - "51eefb61c336eb4d0b4d727a65ed1558ce717b665e856e51f162153770f475ec", - "cc6ba510efa69c5506732f2aec3ee36e64c867dab25d1557d6d4fd7d39c9f7e5", - "4bafb1f314119937603d51ed9adeead3e4a8e54ef3b2d0b64371630e8cc744e6", - "a5eb63f4e29185e961bd2327c01539cc49c24d4d2af8dd3bd383774cf7a85dd7", - "eff56bea5d8f83b2d6b21dc1d89cb79a7f567d855f50606219cf749acb627c84", - "b7e1312c2279a29bee326a8c86101afd0ef5587671f3b37142322bf7b3270bbc", - "e537143424a27a334e883c4c9a0285d2db62ff9be5646f628c8561b2811ee97f", - "5935aa0e1e7769cf6a4096391de7cd35e01a5b38266cbd6bd8f46e46ba7558a9", - "bd7b90408277276c94d5805e849ca77ac1293a6c0cf76201b896093029a5f49f", - "ca6370c1d586ffad02fe28dd0c8eb3088a88ce8fad822813206df15cec1e21bb", - "34b39c8181ae3a2862edd30181621c0a5e642afb64af0d815180082e7ff73236", - "9631385a006e28b00e9d7a31a6f7a0d934a9b5f7cb1ce4dc9e43e0e6368d8807", - "188c237ad0e196fe9e9c80d4756f61bbf8092e790589541a2269b8ca78436e27", - "6f5df35fece759611d5ce4ac81320f69220673d73486bd7dbc87ecaa33544c45", - "ced6caf22f6d45dc8da698c47f233a0173b256a0a43289aa112fc733366c2755", - "54df272136c2bdd99fb542787cdbc83e294bbc33d61cb9a179852f47966a27b2", - "598c3e35d00ba4d0de6004c2b66fa0f5cd5347aae8f6b48e61393aaea6a269cf", - "bd9bd3c7fe43679585807fe1b5f3d3c5740aa70059105e02eadd1a4360f486fd", - "1e70c8161fdab7e99ebee7a4e7c8f835996342d50ed7d85688b8df00b6fc6052", - "5ff75bc3223bbe40d52cfdb36798cd73c663075c852506f2053c1faa613ea5ff", - "9af34dfcea1eb844314fbfe02dcf1b047b0bfa9a63aa6fd3297057c326371d13", - "151c60deccd05e2a607bcde3912e7daf1bf5806548c61d401ebafcca969dd8e0", - "a2fbd54586d45e3549923356d223073d8abd04052eae5c67d2e43d6662a2e226", - "5bfbcfb2e47c81b3dab023d6f31c2b6a411cc60be1d04b1159649e71aba229fa", - "11785e6714b62e2ed8673f452c86d846e4c68cf8fa8437674da56ca760a6c987", - "4b1e6761cfc4b4dd38a3c014de48885c30dbe00fa6cf958b2302d7a064f4f099", - "ca901e134ccc1817f61e570dec9db1ead80fc8af890fd6328bccbf7e71001707", - "ca11831cbb82cdff093c0c724b380f829a9e898706ec962d8ae09f8c42b485ab", - "bfc5164c76b50ba54825f7e84e7d7ea7229975daa7e194e032494d2353beb888", - "8fa1f58bacfb25f8a875a4e05949ecb4db895108346472d50a42103847c4b571", - "bd3f7b0fa02ea519341ae54d8e52c7dd898c4f67104c133bcc766a97c6a9ac98", - "584c8c88792ba76a101009c31a7d3f7ab8b8cc3aa733180fa4ff61c791e24b7a", - "f8dd6cecd0f719d57eceb54c6e6e5d76e2bfb9006dba1386349bd4e69d723f4e", - "9c729b5f551112746922c506f99c8b28dde023eceb524a0dfb11294d9aa39d5b", - "1460001cb7a83824f1e530da9266d40286b4bfc11e41680cb873b8b0eb00d184", - "e005cd612c605f33a5faad0557f6fddf2e0eb1786d8e58166a3bde48e221204a", - "577b7dea19ceedd53a90416ec1dbe7727fb8f69b1c0795ec51179f7401c3c76a", - "7e2b97da872f34d199673fbd9b3f1ebc6f38d7943dd71329de89a2666d35c6f7", - "aa9748674d99b87700de905b0d022836f0393fc806d92d8da21e6ba43d77d54f", - "4e28060ebe236174c1ad45d3e96a9eb4bbf55ce0d3da176f574c63e63c2f1695", - "031930aa963a01aca270438c2fa2b702dda19383eb4ad850f972562276ec92a0", - "0022f19743c0be940323923a6d1d6fc7feaa67e68692787cd4960ca3f5d1204c", - "7edfff7b9a7aa6f3288890e4536e096cf32a71c0d1ee5f209e2ea8d9a180e5f5", - "3b905bd9515ad16350553f671e2a063cb8c77a72fddeb7b3da8cc181136ba173", - "998a7afd7a64743e5b73aa9b5fc6f6faa39803da1c67ea08ce6bf520e48ed938", - "1c59c9a91d53a8c6047ff06850c9e2a748a3324827ef20aa2957ebf187684336", - "b18c1cde1ddc99dc8e78ab6636e4545bd13bc8a3791055bcf42aff060fd2fb6a", - "c5e300ec904ab10877a86b9a67ee7718dcefa120c38aa79a0f921c6a8afc22c9", - "e2a5bd8ef993794b95bb5b98274d28556a14c39901b022f28b1ed1b07e71dddd", - "6c8232aa5525e82810f81c0729566abbe6f6da36af784144c9cd4c05865445bd", - "706387fca8eb4bcf85ff67a8ce40f71d92412a75fad6027553607291769bd180", - "b3d469956b0437ebf47dcdae87f0e1632bf578e98f83ad173fda15242e139b27", - "f54039945b6e75d7b773779a6bfba3e8aedf85af141ee9703e6847349264b70f", - "a492bba2915f0fb7d66ff0936fec31b843b5134bd4240a5c1b7d7314dbdd327a", - "2481d39cfd179e9c271145111f58e5d672eedaa6f7ed38f4fd89350e31a4e1dc", - "2b9c72adbd4c8bf0c5082d118037d7c851668c9e9bf491449b1d1837f6c2468a", - "da15f85e3847425d983da1380ab498816884f251300e8717bdf66a7895e4d7c6", - "494a574bb9de498e056cada5ab2ae2b39295fe69b0165407be37de74d3637bb2", - "9f52966cc6c525f6878b9ec61c5bf5348fea314c06595423143130a710c57200", - "3fa026bff34ae0dcffa49c11dbdd70c28a45dda91e1d3cd0d0f3e07a0cda5880", - "3d7bb3e393bd2e973188e338ac1cba7887b241376ca9bbbe2900a191571dabb9", - "a89fb25dd3814006834b92efd017996ae36d84e1093570b18a0c21b396dd11ff", - "555f2d3be134407f04558d7dc9a4e7632ec6edb13900491fad9c85675e4082c3", - "2625796372631b18629a495de2b72518a66371c61ae51b6a2a51405b18923f34", - "bc3ab8711fdc8959910207d528ecf1ed9751b2ab0d83601f7d2f10ce99e3432c", - "b962f718d7324995a05022e0316b3aad2c5a298ce52072c77875b6c0a703ceaa", - "b8ac2175482b35f1a6aceb2c4788bb9fe43ad93a05d8e659e7246fd9d4d68b3d", - "c3a67efa00cab5e4eb75bb3f5dc4c4c4d596942042e9c7e669354f48d95a7443", - "99641753bc4825cad6b2ba7a7ee4f6ece6b6152ecfd9cc5818cedb3054ec28ca", - "768184e29a0c16732d19ca003037a8ecbb6623760e36333d1b9811adc3b87591", - "c1e4f28cc446f259b8f61d0a44d9af39b5d8c71fee8b507b82a76ccf1d4edd98", - "47ba683d6e3832effd2cf22a6726ec15ff58832f9a3ed5b4ba35da33f1d582a4", - "56ed261d5ac5ab8708bc1815df4d2262463e0964c1fe6161a9e2c5fc1272d18b", - "6ae9b58965eff2d163ed9c0fd506bb7d74be6b313c2c3b926ed4342079c28fe4", - "0502cdf31b72ad5866fa53859b5f2c2833e0c1de431dd0fb19ce072ddf562c50", - "64d50f0537921df673dbbaea492faabbb23e157e3abb068749642758613ae125", - "2958b8db2d56ffb2f3417cde78e0e0b0e7fcb34d4103881a4923d1ed8a0be491", - "16d7acbd8c518d8d80f7e8fce5e76960d96c17847a10d7cbf8243e02faa5f0f0", - "08c40e0bf02e2d0ad5a4d64a56d9ff9f78967304de46b1a774c01fa0da61e5e2", - "856a386de82553db0244771321d59eeb91fd1d076860ac5d933291153ed4db1a", - "f384e612be514cc3411278d737d936e66159da69120c4e31c54ee2793791e68b", - "7f5e94bd364b1f0dd1c37a5e9c1c8166b67ce4f68d7431988464940ff8ff444d", - "2f2156afb19c55d553bfe34ecf3719e80e012fc30ba69e533979a3b55af09651", - "668bbb47ea9ccb1ca70b16f516c056df813c404b6abd44bd604ce0edfdb9ed06", - "d8f82fdba404d98d18208d79dc62c970d94da6647dee1fba50e8d429291c3825", - "d5cc63dce6fd8dcd4afec1963795c42077161f08247a1786d1c27a85959580ab", - "4472e533ab28564bb6e9e3529af194dc6cd367d5c96d0ecde96324b5a75e6a79", - "acd8720f470ce5a61ce6245ff58884830b10b4ba3de87770dc81f54da759e654", - "feac32f4134d623fcc71c079afab590ccbe4275923c31e15f89c715bc6b8b9af", - "2f8605640698a382d5a3d5661888cc6ffcaea0104312d5d2df37d2b3e6ec8899", - "fc0e9c6592fa03c1d3a15464619b52bb7cb314226ef9b3892ded29152d429caf", - "c10387cb9bb1d5dbb1a08bfeea3157a3580dfdb7d4d54b0a5e4923f4bd873beb", - "703b0e06770e6bf4eac13be35d16f8c680e4735461a1f80f7ddd06d81e04bcbf", - "821e4985b098bc7440338f9af6c0d5659134323ee561548ff4be0027b2fa3195", - "31cbcc17516a52d78fdee23ce5671824dea7de736f1462f26ec1c1a38abf2d95", - "da6caba2f84456dcacf45fc57721b8aeae0ca5ceeab3280c48b373767f259f38", - "12b0e9226a58cb15aa9d81311d54115ca92f20ee3a38864a85c17bd3af4bb5b4", - "99df05ad401992d3fe11de63751d9a56b7d5b1f24ab74b7b72f545adbed89466", - "958ffd16a6f8dfb02af5f564e8019d4356aaea412fffddb3a5bd4dac61515598", - "13918b85cb18a628bf28ade7947d5bdcac856e3c218fa4bc461c6bd5d0174424", - "0acf260943b3b10a560eaa0b83003ce696f1fae13375b5673ee7449cdbc16ef4", - "4126a1b78dc1e79ad13d90c2d4de8e9c113221c134d59f0899bab5454c94de17", - "677048c6f6dc3c3a3c5873e2d980819b1bc93a30a550ab70ff09337ad102464a", - "782f6769bf836c3b4018e05f7c104e45dc3603974ef0b7b97e72c13c9adcff46", - "688392e7fcdec448c7a20eed78242cf2405a1b73fb5b23c1b318d83d8c36d9ee", - "28903083074d15e13567b3510bdf5b788cacd72b186846aa5751b8191660a43e", - "ebd920073f7f2aa53091f4496de4a62392d8dd57800195759868608d0935b6b4", - "9b8d0493e7b5981b7d5a19506bee97f80b7f9575d75de175f1b18da7d91b6563", - "91017ea2aeb2e2c420c926a7c17def4ad8e2cda47d8906379a1b8a85b073c0b4", - "287c171104262345255ab8f74de6539c47d235d7937bc2af8c21f37e091115c4", - "ec9eb41b78697eb6dc69df567a295b0cfb531ab32f5a8991a7e150fa287c0370", - "ef7945efdebc6c2325cc22066080bddf5a7e2417ffd9a68f396efc767cbbaf13", - "d9053ebb4ba39c54100edf8bd471a0e6aa4d88054d677169a49b74e09d908436", - "9d2078964f9e5a53dbe7e857ba297d8d4dee5686702b94b7b67488c7c852b6b9", - "5ca8dc543465d40ec21efcd7c151c0cf2d3be35fe9470aa8ade7a188ca8f3357", - "4ce97d36571dd1c9f9449c99f3a1adb75dd4817620e067c0d61c53b55f3b085f", - "bb8bdc5284f893b8a13c1c5e5494bc641b1e48720ed595daae78e2ffd2fbda35", - "397080bba427b1ef7fd4981257c6c17de64fc285dc986e03e4e7139f1af95490", - "305bd170cbd8ea011678619ee30203c7bd8491e60480c3fdb59385c1fdf6b6d9", - "6e5b59637089500975aeee8a2c023e6cda2635b3198621c3d5c1ce243aadc666", - "50ae65516bfdf5678fd80757a6719aaa395e0e55384d36893f98bc2a534d366c", - "ca96b992e071d708a011490b43ff068b6eaf48a259fa8c9f63eacabc9d96d11b", - "dc29e0f5adf605216eb1e91b4ea89f973b8dc1a4a64206799de90eaa7063cc80", - "c923486c64fd035357c7b1b4af9e593e7d7cc00d288fce51a66cd13a66d9ca86", - "0288e8b1a8745d3e3145adb9e6435b3f7a5fce6d7fcd69f2712a49025ca59a84", - "c76dc228f3cf083a4237ee18f08d7332a80489ec8f3ec8475aea8284f02306a2", - "b7c59a085b660bed3ed75a2f1cc09b1895b979dc54f34e1df3293f21eb1d34ae", - "21daa05b0a11434c907a2051390c510b03e8150937f2a738da9d4fc8eccdf438", - "6bbbf6ce8aa031c36b6978574db6f5a6c8a3456e29ac3f09fa7e16dd351c0cbe", - "364071940f118474f8587d21d97c7cd9dee6f9461467fd9e25d47a555585cd68", - "408eee32a8f4070d0d9b9e5f494311a1410337060a4a347580c8aaad1f0c3c93", - "b132fc2d66f55eae9dc1784474f283feed3b94f078797688140645feb103a810", - "4cf0a1ea369946ec5ff8979bade50604e77708ba4b2227d29064d4bb90a919cb", - "9b67ef919ac6379584396cded87e6c318a02951c9d90e30bb8658411e2111b03", - "c311a7698865eed461335181c655eb9ea7515cd229b2f8f6b7f6e8e0a7022a96", - "c9f674096cb1cad576def164da912a9aa94742b452e9430d20ff7d7f5170f9a4", - "a4c046b3a1c33266fa2f6b8b90ce3f734d3128fbf24beb41d8caaac18f8c783e", - "2462cb656a048030d69e447ec8575fca2567290f9ba833c441f1bd8d46699c04", - "450b0bc9bb3fc6600a69144b0b4b476d8ae8cb9f5f6a0b7f1c3f4680a6e64f74", - "1a8e2932c6bd0468a866c0a8ddd461859ff4ce4403f4038d687955c755d49330", - "c4330f2874dcd82fc0313c13fb63989ec77956b704a25989cf7eac61aa52ea65", - "2a4a40776c4a5045e34689699d1247d9287461a2d660a0ceca2681debf576c20", - "6c62d63497aab3b631af13081aa4a8f049eae0ddfe27c7e49ec78838c4f46845", - "6d5cf3da1a67be3d0274a4ce8d4dece0b0d11c6cb99c35bba9536bc2a37b1a40", - "7e5ea3482a44e40e76ad04c3d221a250369af821e4c563b3ac32ce94dab83f30", - "3f5ff33c156263b522a1a5bec1b8950af20ab2e25eb98902d3f2e37981f4eba0", - "c4b8bf140e5e016a2d4b97cd95be0e510a584a3adb3aa29efd2c0eea083874ca", - "c4b14f40dd33b21e65f96cec0b4c686e8e92c5fe6223b2c23fe580b4df300e80", - "db77399bbd912fb38a10a621caa211a9f03bc954c2b31126a64139471b571553", - "f4c4968f19a2dbb6c5a8d6bbc265636482b8e3f15b86a2b63f2f3de78b15accb", - "d9e3bcf56d8acc059d922b40fe927873698e587149fcc16864f787ba467b1ec1", - "c8dc0f2a636f226b454894ee7f7268ca475f8477083dd47b74d82591fe60922f", - "21ddf07f81b74ff6e3f6de680b6c68e21a58200cf26ca1a8d57eb563cd9a8741", - "bb131e62ef8f6dee83b89815f130d477e8aa2b3228c2c1d638cf75f9fc1de445", - "35e564ab35e6b5963f64184e9d7962702337d86637664ca34c4b6aa79067e39c", - "1ef65248fa7fc9439d270e2ea00f0cda63b2b14536908758f3988e2b50826d40", - "682a419ee4af73b3757f7e232a805d1f3a94ec352fba909d99ba78366b7d47c6", - "78a13b047f20d579ce2d1516e0486dad16bf9881d6f4800fabecba9fcdd36999", - "c39b341edbfdc5c3f38eedbb50b0e7c10ae7f0c0a0723bf6964f5edda856e498", - "0e74acf8f361c21c89320152293ce7046245b6d13666e3b36fcc0ebd8a30cf5c", - "8774419365396d40e61ed915c1ab547374c857091aa807080304c0a458f81f27", - "206b7b94a98521dd555a50368cd8cfd35af4cd9eca6ed8fb80d7a7186d63c343", - "85b61bf86788be46db15097103e59aead6a4f9c026a6fa4099834ff5ca440af5", - "e561c8b903793c8d2b8dd80b1378daceeac587a4c19bb1203a80662019f8aeaa", - "be9343922c1011f48bd8b31434b7c8c1c8089ff74b3f36659aeaf750dcad0354", - "fed704ba856ebfed04d708906fbef28597798b3162ea3a624293b061cdae2abb", - "059be94712c7bab8f8332d99a2b3fd512c1e0261ebd69f90b1e785b40abc1aa4", - "59475068a987e45a74301330c1481731aca38822b4e7a58f1212160c17709c40", - "c5fd34a433065cbfc5a318a82bc724a66df97c1dbd09a3490ae7f40306073ede", - "13aa9cd18ca680b26acc7349c44bca836a09091b142b0fcaa9cca8049f27e3dd", - "d7b097723f8f1bcf719ed39a8007169ed090e9aed7c19d6f705fcc072c873e32", - "d42db46461eb27408b92754485884f9857d6fe56cecb0140f9eca955031b4cc0", - "9be9850ee2e90cbf2ee30b2e76d786572c69e3e314b5d101ad13a1e01675c30a", - "dc1d3ac82282d20cec6d460c52526aba96e5fa6cd04733d6dae729481762d7cd", - "42a0ad8d875d0b36ffa1c095836d8430e6fb5409410fd2550c49eac22934ba08", - "a442426499a533a00ffab9ead734b74c8dc31614f49b2f62d0dfaea4c1ce97b9", - "bb562d7a1484f44ce62ad0b89243a7097b7b05bce09e1f09c051f2dffb07f18b", - "764f4ed9ac65a7752ea2f5c23e7160a7bd50181f443a5ab500c9e7f357d669a0", - "1bcd7c584b2bf48e6f93066cb545fabf80c9e94abe278c130f0780e2842dc967", - "d79c022321ec282d6b9565b8ba036777a2fdf5e7001e072e3a222bf72a783d9b", - "7de79f54b77021e3e36e7f69356e58ac99ce9450e9b40d3d958f51052675ed3a", - "d8fac56e1fe35f45aa006f1acd0a28b4111a90df71609cd7b7fdaa41c1ed93a3", - "a22565bfde2413b7d139838acd861089b232c2498fc9f2079dce48b128099279", - "8e4b86d434b7780cc66b244426b802a1e9e3bb3436335b77fae8e499bac74108", - "bcc8b279cac5b476a6b1b5bebfe877b2c6ed5555796bf8bbaaf08073e79ac885", - "a6c97b5323f9838edcbe0e82ee2b968f7b06ec6a37d3925c2495e810ecfa97ba", - "18266bd4c6a68f363718251ccde003e413fff8bb62778fea8fa12c03afbc2292", - "74b08db08b3d21708a28812b48ade45988252288c5d4fcaa0ce73c517336393e", - "8ada77dd97ce1ddce84fb1a6fec6a1f118ece329d73b1535648cbf35c109186f", - "613ece1eb5dfdf281c6cf26b9868b8215a09a114d6ca06c05d5e7957551a9b88", - "646697923be06b89ae57d3c7198e4ef09e2cf8e1e6d52e3172dee393360b7036", - "2aec388169f522ddef08f7d4c47c17e08917310ceb7f70bc10f4fcdadb839ab6", - "f8584baf3eca304eb94a7dac4681d1e17e7d5129050c714705be3fdd170d3b4a", - "f73e5cce40a5bd92c6acf6c4833988a71bd2e6a11985768929ed3c2ccc853859", - "071400019de05581d376fffe4f46bc24b5e5bd4fc7c78234fabaa2c6edc00bf2", - "195645067326f8b3bcb294b7a34aebea79bc9200627fa513b047fe4867c6bf97", - "0338dc2b0497f82ed49ebffc96c4c7901674fb31b2a53216cd396fa190df4662", - "279e5d2ea7abb5de00803c5eb3573f38f979c94a537942476d839f3e5b860f2e", - "b45bb8aab76e269bc4d0cc70b5403fd590eb48ce1f6a0447b810fd06ae434bd2", - "717492ff01b72c1fc637aab1a0e977c19567ae81338d3f86f1825ba9aafa4b23", - "260d319446593d1cadd45fdc77ddad3e911452449799bfe3589363652f89c100", - "6ab3d69eee6c7a149bc864f9fbc70d97b8f7361386e1c95aeec402ef7c386464", - "ec8e7aeefc0f0999adda1f0a4d9cbbe2b1944b6a6d5ab4206485b6ad94c978ad", - "e23299d41e53464cfd2dc072f1f0e18d8ba981527952bf805664a399652a8fcf", - "581539ca296ceedc06dcd688f766a950fbb23831067b2daec402df0329927d5f", - "8e4d3a59c60183a870fc0792153959ac46b105e1cf365044801b686b8dbe8131", - "8436712a33e4fe0876b2d03f74981ab4d90a9332f1807f24764fbb0951ed29b2", - "6bf24b60d3123fa7d3bd61fb65ba0a88e47adf745cc83da9020d7b45892c3968", - "623fd48667eb00f5cb0b456dcaffa11de05b7e00b6eb9488de9c5ef644834881", - "8be93901c0169d90f567e750ccf1190529a183197294d2183ce9f48d17011060", - "f4e9bb9051ba3bfb6c3cd4b5f2230fb125d7adbd612de6efc503e46b24238e27", - "ce0a9282d2b2253f01c8526f144e6e3fc554ecce3e17ae3380a9ecc12cd7f955", - "1e96a0a9619cdbb60412b962147b1bc0b5def0e359bb10c4e09bbf4317fa5a8b", - "2b775416ef293f30fc74e3bfed14660932b85537fa6f81bceb8bc303a8ef098d", - "5de3c8ed3d2a85197138eae18a5990d00922b7d969d306c8bbc5713debd72eec", - "0ad03e79e7cbcba3a52769f4d44583603a5961c7c8f32b254790b7db1c21f239", - "048ba8eea65c49e8955bbe814946f04af27d935cc8863c2bed848fbf26a53e39", - "f257d1e8554a8476faccc8c23903e3c0dbb7d7491823585ff446e4f9037c60f0", - "0c7daf84250ff3563fd503aec9cef96a65981d1db08c3a8159d68d46140eecbe", - "46598221e7319477494212f8bdefead6f268c4c907953e445adc6b36667d7d0d", - "d647e3a1d694af06ffb198666b1c1ec334c93b8fe20b88a2acb9c6b95208d778", - "bcfc2c786660e8c267f70aa23ae1254a7e550888b2fc2e4f61dcbaa1c1bc59a1", - "a7223f4da673ca0acd8060d5b17b8f665d0dcb42929db522308e0ca510728ae0", - "008566cbb639e6b8af072e1f2f48a576235c51c1c090eb4745104f61ef028295", - "4828a824066b43a75fbc2bc9bcaaf2fab69e332a664cd9571358a359ce9ea813", - "6f4a3d2b86041efac1dd7bb6bf531e4003a6279dbf84ec64e226f17174901935", - "72fb9b5efa76a3c2963a9c50c4f2b8a877b40e2098e70893c987ec97f208e0a0", - "ca80d3707e29a504771fb5ae33e882b517f30c219d0f4b38bceeaed5fcb49fee", - "16b786659824c43788c297483787e8e112787acca50e47a0f4a349e9641279ee", - "3f1e7d4c35ecd0e2d257ff4d261f3df9eed420e25229670b41a181a40eeea286", - "7c526eba82094731ffa7d850314038f64038c35608784258077ae6573ca1b95c", - "58f8cf83fec6fe8d9fff8799d1b0182e6c84f8312db45d4b06e87515ac5a9ff6", - "2129fca840df94e1041c645b434b08e32c4e1668673d8a8572f28d22260926e2", - "d89c76974a1b26c98bdfe91babee4be2d71bd83f437ea37d7b650259a0e72c3e", - "584d07bd17179fa69dcae4bc51f9ebdbf2bb555d41b2ff23e003745062cf6b5e", - "4aa8ad9da8b82329ab56a09c8d399ae91d73174e802c65147c939d15b3b495a0", - "fe1eadb5e927e57525bae2fdbabe5912436c1756ec098ae489ff41a68c75a374", - "04d595f7a877c8083f1a096084a980259e14f3e9e943c818b1c6d026e673241a", - "1706bebfebe3931be7dd2efc86fa1276ad2e311c5faecb55b8fc3cd599268d25", - "3d09d5534cc5dbc2549a2471fd6c30f7d9b5663bd366e7e6b64d3315c292b9ac", - "c78c70e0ae9b5c07a659ab693cfe00093b59502ea8e4aab8c1fb7298a9f23f74", - "945ccd0e6258ff5325678cbcec80a9de8c1132d9c35a310c8c33ae5dc560d8ee", - "02e02fda86636ddc0a5796b152cbc361b3f5f7d9b99b4d8c0d67404d338c755c", - "24a9552d1144e7e2370cf988be55b2188c083f9452ac4c97a4b51bee075af2a5", - "c792feb79eaddb3dea00c3081406d71f7cb1d53da05322b8ad3797eabdad2566", - "7e5bafac727b75751e9a5080b244f744054dc5ceed66ed7b4ab635280a0ffef8", - "9fc558f13371183c3f5a3c49a499f54181cb7c499d5c79a725f1e7b8c772b517", - "43259b964d75b7318643d5058af6f5aefc471d453fb8c0df52f1afbe1f55b3bd", - "123eede8d8ca68b4ebadae168bdca832ad1fce71727659603bd70916b789b4c1", - "c62aa38f56a88d140f689d6c303904823dfd14e1bd1066a063a4a35c0fc94756", - "0da63333c4e80976f7ead03ee4461b4e5a796d3994c93a75e12815e1e44dbbd1", - "346822af555057a7f1570f525dfca1199859afff90a3a7f919424c123635a544", - "83e37063e4493bc5cb16f7fb1db3d2436f76615d3ae65c37d7cce08eb2eb3e2e", - "54d0a4e79625e23be0cbd4388c7fec5a8ba4a985a8f0da598587775e546d6ee1", - "46acbfe506da9bd8fe5f85e4b939906d1c193170f645af8dc5a2aa727ad8afc2", - "584690957420e72260139ab78c2fe5bc4e9a9d51ea37ef5436b526395cb4d9ac", - "dc7e9054126a7edc74d6133378dec9ff0938fb399f159f9a7677a8363500412d", - "41f2e6785e63a19839e25fcf79ac233a9f68df8369ffa7032d0145cc01591a79", - "43869478cf4c9bd49217608fd244df5598d527d8a5d516432d678e2e9a70e92a", - "2c72a212bfe2dfc7e9bc5e0a1d4592237afcea218c17d378c6560ed2c21a37e6", - "726730d180a8feb2d1080f5354a99b436e7613e3b8b8d2ea3c50cf6a5520b774", - "1004758769825579cc83b5121aa034c4efff9c55867c629740c3ec896e774c1e", - "4eef56aa4f66f3ba762b7c8a81ec9bc75e0818157e02112092c8db17c197b527", - "500e62b1cec053b8219cf6c793269813436e6f2631bdbfbb7822d488dd0cf3f4", - "09e716130f4178deb03e3d75ca4d91dcfd48c4ff2cb1102d6cb423cae95c22c5", - "a74393f399ac04334145743cf6966dfee27aadd5833118b51587e1ed2c46f601", - "0dab2ccdbf1a3cb8700da1b286a8849ecdc3660f3074b8d3c38aa5abacfd588c", - "d74cffe28f45bcb7d2b07396be838e449a4e1834e21086306ce94ec316b233f5", - "90554e01c88ff7d9928cc1143839d3eb9ee7f7772cce04d365de2cfdea988a70", - "8e08b9577c9f2f63417d869caabfa69f3ba2b2de5c0fbde6a86397cc40919504", - "d5c7d831828052a893d18747058dc6179f1d7bd2fd852eed487b2eab15ee723f", - "5c9302e97430aed63b4639c34cea022dcfe4e369f5f4f402fa06c1b0dd23a553", - "a1eac17803c6121301ba242edd1c3f04812fafa2030188b0f369f310799c4e58", - "35043ce107df8333e25af446acb0973eee7a31abe4d7d0841a619eca4ffc83d5", - "4043307873ddc9de5871d3de9530bce76d4640e9d6aa13e559206be32dff7ff1", - "5465e304cfa067394591a67ab85010143a5c47d8275335b220264ebb4e5a15ad", - "4018a16ecb0c9844ab1d90f1066d6c1f51c310aa8f45b70492696ae7d793e3cf", - "a7c8850639ade18e5e9468425bb23fba4799c92a89c94162ce607d93f05a02e6", - "be2ddffd0f2c64c775dfa96f0e304a0c6f8c0e11779c7906ab6bf77f230b734d", - "023f1a3bbd66b6576929d7b2bce9e9c3436dda611ccba5724388be4a9087401c", - "0506379a2621536958940514e3dd21b80cf9dcd861b22376993865efd43eca52", - "15f8cc7416767d52119bde0ae539f2bea210cc980bf199c17fbb20e6f3074f50", - "bcf9d60b4e01573e1674aea797381270ddb06a80ffd346a131cf1bc072e7b586", - "643fd52d9c2171b4d98f738a7c2b0fb76a6057ea4dffc1aa9ec1eb6c3165731e", - "4826eb7caa916fa2a7d92b2579b62f7373ff6b0d0e1e2cf6363d423f5d0ce8b6", - "de5ffd404f1307fb4551fbbbaeea980dcc4ec47cb64650cfd7935bb13bc10a3f", - "d29215f7d87734056e4e507ee030bba9f4712ef51e8aa7c63f758c90ce729220", - "325a7eef970ae4a6eca57fb1af2bf1ea7d36439d2740444084d179024920baed", - "aa75ecf294dd0da0940be108367f495114ded12af86c35784533a1a5a118a582", - "c8d6734ad4deff90c42be5a6702633dc08827e79fffd459749ea64f1639aee89", - "cf24c2117357f8a7631f9f476031eded35700b7dcabf6deb0ed26616edef1be6", - "d04ad64b38b184b906e7bc3c1829bd4e24708592bf1f7927aea2ec25fee3f08b", - "67486051d4303d84000c8aa17c0be1c3a89b2562195731c22ab5071e7a42c67d", - "59ca4d407cfdc3878f046c726d52f49d350194544387a5d744a54ca13e9dd333", - "673d0d29589c82033e33556654850fbf34bb8e439a675961055c5ab32df75fde", - "368824bc912d90107a4ec12e54c660da0efef11ef46158c1d67b97fd31307469", - "96e618bb2e53eef10c097fdb98c5c695186fe7253ced8cd25f141ff74e06dbdd", - "91d99cde125d0f5f212edae146f0aa88a803f10bca68f96cd412a026518f3839", - "585ff877e720a9ea5961fcad2523fca87e48c8fe1a0ed3eb16895e4a0b62dd05", - "4b78d2b2659cbb36d4d25ecc4a3870c021699765289734ed1966cdf05169cd52", - "436adc24ab87c2828f84cf203bf70e722be2c2b136ee5712593c3a897e22bb5a", - "fd9211eda5a5c53445d7851ac7af8b5104d2f3e695afbe9b72ed2d633d5ed5c5", - "cc19636cf5d5d4557f33d8afe93999729d2d25af63a0e078d964f83a2f0e9c41", - "2a1e7ed968e92c95cb95f0ed7c3f762ab4592c826aabc0f5188c48c6a8347cf4", - "2b009de081ac12f31e7fdbafffd2a462b8bf31a070939afc979c431ee37f4ba6", - "84de756fc400c928a3e0e4ecfc13e1faa823a78d197f926b4e04e9575224f503", - "51751b832787f00b023b8b7837aa17f9573163817a225e7b6f21f799f201b8ee", - "8127a9bf1b0b9d0510334f1c786e832a47d5a14c902432a2dae0fba185b30fe5", - "d299f99fba7154cac17e5c50866dcac152e2816b9b381cdf08d34c1959c8b112", - "b98f84cfc0a3156a9ec51c275d6c61cea834318028ff32aa4821d6376626e527", - "bb7bb93d0c5c632ffdfc259e2685e8752917a8adfef2edb5dde06c2b2960237f", - "2f5923f9bcca29458ab52b3bba2fd6cf48b4928c70befbe3a737f6b820c5f4d6", - "94ae61e55b9790c4da5c7d4b4c4e177f89b39bd605ccbdf35b4548d4704af3aa", - "21fc2db025bb045257e3e82946281b70c42a71e0c0fadd5e5c6bc0f4529203b8", - "11e7cce9db9efb3a6bb2bb9f219d4f1a54bd4ae428fe778744bc74be72b27d0a", - "f5a2da9607dfcb3712db1647016b0d10577b878dfed95873fb0439a5691ae4d3", - "7e2ce13706a1d739657eb2780e83c7880c78d70075198122003f10b0dde3250c", - "b87d0797c4ec48d30de99e2d27ae49103f756daeb6ae5bc4166168d7b61345ab", - "62060307b178e1a113fa6b40383b0d65a91eb5bf3a4c1b10bc991fab757129ba", - "401a506618fc7a9e95bd34f42ab3bd861d5dab844981f3ed1f9e0aea08ea269e", - "128df8ff72c00e4495c926c7ddbcc56b95743b036465f9a56fbaacbffbb5140b", - "0ffc89e13f439748820fcab2d969ca77a4ac643c1f5936521eb950c873e87828", - "829dfb12ffb1c1a239221bb2ccba989593119973d329f168ea62ee1eca9f235a", - "1d28496ae754b6d802585800ab8934e432cdb4340797fb0d06f770d1efd018be", - "b9730dc486f8b9303e9e356f003c1016fd9c2f5a246e3d239a60465aa25a3c84", - "6c5382b56e173d91b8d1abfdfd126aac22f537ceddaa3a414531798061777918", - "4fcb968e2a306861735df19e9daab3ad616c7a752f9b1261ff97d54dfefeb544", - "638d0b92c71690e7071daae169da57fbc89bb0b2e15732f8bde771d6bc472f13", - "b9644c8cdfe38c909a03f5b71339f9fbd423f286ce6c52fd464b555240234705", - "34150281dc2ff5506209cd6b824cbcc4aa9c75e164d531e0b4b0e49fd4711aab", - "a3c7ab91aee39533e9c879a7b9f527e1418f0ea2d5e8a1afef3e52a73088fa6b", - "f8814a1b34455d1395c5bad19086b3dc70e41f75b73696385966611f08fe1119", - "4eb64210302ea081d1a7cf6e3248065f35fa7589167af002e2d2832f67b4205c", - "c809fe545f14fee4aad1b56bd9917e7e0abc69f547a1b58c81e42bfa9c43de42", - "eb136c122cd6e431c0fe660d768d52accfed45155520e9876b5325c887ff4310", - "2d0c8ed681729e8e4394cff39d1128c0caa813bedbc2a5f48ea1998d6613aa6a", - "1b861d4ccbc1473fdcfbf3d38d40b4816745e25a344286864bd566c8b86f8348", - "e4349c2339ef9a1d56235fcb316d10d727231d940a2ac07909df11a019c9236b", - "10e7535c6d62907dacb7a614c8d722fe9a9a51d79723f77675e01de8c965dbe2", - "11ba9ee71e02b792c728863631314227d465b3892c4fc401916f4f5e7e383413", - "2882ac6c5bedc597fad71757b519fdf8a34046ed1900b537184717971550ac29", - "aeba77e0705209cba070641b55d8951b731a4709710b8c83edeb099d43754e58", - "6bbd45c6422c9b0a933bd72b7b8b624bd195b3b9f022c8bd88427dc1e1451d87", - "74683d846fff2033e16c26031c09d30bcc45d1d470caac08a9b71996397dcfd8", - "df940d5880bf0b6c7249f093bfa1da158cb4c760acb548f70aa96f40634686c5", - "fbd0473ed16e0a047e5586154109ec03820571e370abda9f2a6926a6fc639d9f", - "3a2147be7a304dfa99fbbcc9f3fb5a707a2b0bca816faf8885623b3769754bbc", - "507555e3158e3085408f081d2c63fda5b6d1c8acc5d2ef7e60a22e8a46eb1860", - "0b2377d4a788efd7b77c0209d53a636a5d40ce2c00d9a8bf4f80268112d95be9", - "378803a7eb8e2825241bfb6c1dcaa89d05f1961ef1ceb4637ce1eb873811f018", - "e85bd2a1d8590494b94e770e715fab632456e41142b4524d332016597cb24b37", - "066601480adeb8f93e764777d0fbbce392f6e803c9d40ca65aeb6b8959348846", - "2e2bc0db45f5307d996bd07d103920b9fc8ddebcbd3310fe173c0605a9af694f", - "e499b6e9ef8438d9a52a550b617ccde8f217afd0bd03ebc9760f74ffc4430d47", - "778c44be8827541bc327aa75d22c6bcdd0da2116e31fb16981495d2261a8c209", - "d0e05c3b4039a32707f3cea2d21bfba253acf029308ab985c885f553f9b814f4", - "b3fac26454d51f436e84567c0dd0feb53f08bcd078e27880f05f0af9edb57e8a", - "baf853d0b7ab542738a3f0e3de9905051c92beb3b5b26374e6969a03b84c7473", - "2371549f7ff8a12b6fd1ddf9b54a817310046dec151eadfce0cd7b9ebc4fa9f4", - "588184d9db27e68feca8a4251c84ced311d2cc3ffcc5ea388c78029700006ee2", - "708a6e8075123d87f6b5757bbfdd9f19f100e4f78ebeb191a3465cba2fe2aad6", - "33670efd35e6786d71b606a44d680514c99068734c8f508abd3b240380288ec1", - "ec3510919e853ac43f66420ea73a6e4355aacbfe0c98831ae311c817d2757e2f", - "4a4754ee48d6ad2c5c73aaa9bff260d5fca59e53d40367a21675cec6b10ff612", - "59540f0c728888a1eba199a55aa528bb94857754d72c8d7ce0d3e0af90c920a8", - "c1837255a2ef540fe43de1aa985066c593839a3ccd0d1e2fa2a6fe718b64c3e9", - "b9e365548691345835669a5e4cae25ef52503b378522f701eccc13b05b88ca3c", - "0ffe9146ffe97123ff0ebf3842e5ea5a133a07999d8447102356b5c302b6b94a", - "810a9b443065f331c0295a120929aa80f6ea25b61a41fbe3e242b57f095eed98", - "225b69673e483fca0b91e182ef9d5d3c48339e9847cb7321539111fdd24deaa6", - "e092bd52add7fbe8cb4dc2cc96a247a1e717887b342f8ae8a763c2ac1f0e109a", - "ca5906975299ca9cd62dae492695e66c86420c4d8c876742edb1d2f65ac0a100", - "ef12c504b915da366097ca89f34a5c7ab8ac17c667a282b17798e47fa81518d6", - "f5e3a89ec6fbf5832df1cd1439ce1f08e15cdb766bd1545334617b1cecf59a79", - "78ea212346f128c8ac7a6790879a63e6fdc18ef764040b1fde4f370e4bda13fd", - "9a8e9f466c92725576570b5b0c43083571312795d1a6f9a6689f4fe258dd3904", - "7c10a87041642ee9efea5b93ff811470c2858b33acb139ddceb067bbf46c8a05", - "8458ee0fafa2276d5d0fba15940327786934c8733a36bf3062673b32ad538a90", - "8f4c7145929a8b34aaef025ace0cac0b74fd071736fb0befa3779a87fa2f4747", - "d5bc4ba2f011f449c48b3e678304c19fe27dba82c9e843113fe71ea44174ef80", - "8beaf86c8d68fa0455733cc5f8575fc5a16ddea361b4e09e43d5370a60a6091a", - "765378ac5a640df7e800668b403568e8e9de6ba76a42e7220d987d3edf171623", - "5c19175fd4c699db63d7f7ca15ce3a27f066cc256c24d1f26b3b3d37e91ea91b", - "aa00ad09128e1bf42bd4e797f201286beed73cdca5adba80bd68ea28a67d0218", - "f163941d167c3e8be9d7839576f9f17bc0fc4a866e0e1eb8e7b850b50619d125", - "f70bfeccfbc20ae0192b9ebab429099a9a5b9f3389e5acdc4c2c6a8cff0039af", - "fb2b9f2a6700e6e4c75d76366d6c52baaf6af3ddd172c724f9159058c23bb60e", - "edcf9ce7798b8eda30414907b54ce93cdb40ee0298fbf15d38f9ef64b367d13f", - "5296596ac04711c2d706562323d04273696eeccb3e7a4e7118d6ace57afdfb98", - "c62be05503878b40b19248299f93f151646aa95ae23e157f20b03b4c1cb8c98a", - "6fe8d25dd97d04e367396683f8fcef8caa606e53fad483063919b37e087181d8", - "4e4caa0431c46a9a3560725529fd565a9dd8c34f540cbe654d980911814d96fe", - "d29338d505319ba3bc8cca558901910254a40087b0b78a82c8f8b76e30049c8d", - "e68b8c25fff98e3f2fdc517fc6a2aecad086e2681384534aae859bf7f7821ab8", - "57b8760e9e2bccdd921a4011b862556ddbe5303a9de5e3fdc03ac09461cdd0d9", - "7e593a414d6935891539dd6da61c46d4a6b728d6f5038d07b8bb27d78a8a4fb7", - "140851c169ea8b58fbdfe64240779374d7c538f522e4fcd307f992ab8809a1dd", - "5cc8d1c8ccf62e28c50a80e5c5db7c5090995e4cde781687c518fe6e48e926cb", - "a3b6d69099a8efda8f008a31d20f7fb79f514f13d13b9e841154418b002823a1", - "511196e086e8d1b5d5a7aa6b15731bf2c57585bb7127e7aa5ba4efcdcea803f8", - "a71930ff56f0b927c664b09dfe602a47fe0b06d482d98040746bbddea671c4b9", - "06ba941b5d89dbfaa2c5ac1e7c61b7381a361d9d72af3b51bbdfcd261a5e3eaf", - "ef4769fdbed0d8145963ff3dafc55faa7c6fb4afb3e19224095e4dde72489602", - "da247865249c6ba5326301105321e3cf3fbb452b52d716ed234ed72ad4bb6e07", - "0a57341f4e433ba2996439823b0978ace3ac8387381f67ed241078b8dc815479", - "f3dc409cd308fb7528f959a3f5769ab17b4fd19a61d8bc82825947c0f9a05547", - "6ca9081d5df5c7b439394f314e48db773bcd391979dc5dfe071b9deaec76c859", - "20d51e7716d69532a3813fe364f3a98c34d4ade8641014460603d964865fa845", - "69f86e19d4f27c8474ef54c2854917501a212f46667362f38eefc0ff0063a101", - "aa7906814ec127716f2440a2ec8832a95ab3a76d89ecba515027ebf212aca82e", - "19452d0041a2ab617c2663626bc8147dad902896b3e30c9ff36a1326084993c3", - "510d46e07a044c17ddecae653d629ff33d2d5a8995e32a2435d5ed3956ab3ced", - "47e122ade83a52f28587fbc9b3c66c42d960255159c05cb393bd60c88f0d40c9", - "94335293a090e34ae8d506edc2ba36d4a1aa2e9a97b8352e5a667cf7581c46d8", - "48e57c8c3004e199ef86dde2223608b7b578e9fc7c60066a7172efc31df88aca", - "fd51a73152ac2e6f5a623971901ec484f8d6d63ab5b14ed72ed579e87886c3da", - "d43a1b020bc1f66fda05aefca4e3a264be4a342e8c707876bfbf4b52309dc97f", - "225e3c83771cd8d3503fdee0d5fc2da8425b909892c12c81a6072ca049e6eb2e", - "4840a526aed5d54cc5d0956252fcae9166f5e349ad3ae5d7dfa2bccd511a6709", - "518f3df7dd83e985e7e3e072acc03eeaff606ba590dae0ab723f942f1656a42e", - "b6dac022c2c24932d165527be84dbfa686e779275f8bb5196888f03abfb2ea4c", - "019e56bb36021930ebdff117c11ff5d252e99453f952571bc2655a5f1a665bbb", - "8a8a9faaacb8567f6296b4b2cb4aebb2c7704a9005e574778aaf39adc88a4903", - "015a110095c6217a694359bc17de2afe3302e0ea8ff14c11ee55ff4dfcb401eb", - "558a73c2bf243282275b792fb6086d8c34a7949a6dc34bb3a33540538135ea08", - "7935558275bf9d226355b5423ddce021fe3a4c0777c1df62f27329dce1c0f880", - "4fc48e1e2561b8187855ced6cf223cb4692279e23dbd03efd458ccb50a528032", - "86af81453e92bb086686d6361690f6e2b020710d14c448e2ba5b1c3398fe4106", - "ccb19612ff2849c1f3ec0e2a38ff2558799c61cfcd4c99f0f6eaa292be3fd8e3", - "eba289264c4138662e32d3fe0d3603e4132e8fd514c166bda89b7c9687b59680", - "4193d8a5eb490bab6205d3e83e59dfc11c3743a4d0dddd48e7612b7f1d894c34", - "738eab61deab667bb968989ccae26fd40b647ba874c7fcb3b031ce6846755b8b", - "d3289147f2b9290e9b90351f465b01e3f539907aa9f97f17e9fddd157c8e0b40", - "c0dcd44265bde9955c594b6d62d1745242b55cb491fc2f7263c4f88a9d51c9b7", - "0a9c96557a36ad04cd998b2c311791e4ad7737c6e9f64307ea87790d97fc32f8", - "3c3925edcd20b5528049be92d826945e699c4216862501d22d789bc51dbad822", - "d26f04ec738ca44e7c1e78016f55186e77d4d0fa351ac759b9f9138de2f47f94", - "9d93d7c669d1d3ae3af9519b9af25b68077d2056589a13aba55ec0f4ab512d5b", - "bcb7bb3c3bad4acf3e755150345ea52bbd145280f192c2a3146ab505d2a95f74", - "3fed88a8c5c5d715056f60c332e5c387b7ebb8926d8b8caf06511e9992cb6475", - "44b4d3ec8c6281b5199368689382613dca343c11b94066433812b534bc19b3b6", - "4cd2d15111d4f33c2ae9784e2b13d0750eb8d5a3e7f05ad84efb215e31d576b0", - "f147cb019b45f9438c9dcdad995f0a8ab2c99f01564b3887f7f747d0f2c889e9", - "03d763c48a7f89ca7fd5b2b99d09be65a93a5505cac6d0afb599ed01ad7c3783", - "9aca26013d1489d4ca12f229978454a9ba8f342cfa08b7ddc6a4907324fd9e26", - "a90ec23e3815935708c6121272efda00f06fe0fe1716967de5b45dd6fa322a7c", - "66db8e9fc8c5d5f96678bbe02887afa510da877e844dc36e6c5582af695f6299", - "225c8d2ffb790fa65ad46975cf796ccd0eaca24ac04295e97b848e33b54a1f1a", - "feebd7823810dbc671ec49133383f4c1ac7dd21ff4b3050205991e4573c9cd91", - "074b6ba1bcb4a078bb0b9ae9343500bbb1eb4fce90de849d0170022e23059d0c", - "75f2ee2ee1fbd13b67c46c969d4c553b3c6125d5a5fa64adbd18d9dc9a421279", - "3f1adbfb9deb46987db3d7ba1b1aa8ed7accd8ad1574a669896cbee802f00ff3", - "bfee72a207b9e9cb832f5c14aaf8cce2b624f530e0e411c97ecccf27743bd41e", - "e7791195aab95ba8f112cd75e69481b3a3b98484ffd43aea0aee3c6c7f7e0a86", - "68e3077553127d74c319a0a7980d368e76174ec29a6c9a05647719f488abd321", - "6a6b6acbd3c71dc96cbd6e5698bd3015ca68e49d811ced2e722e8076c077bc3a", - "c9cf6921bd5e64dceff13556c3c3be62f78a1edbb08f5ca7c10d43309fcb8a8d", - "5ef86d536141033be6e9ef7d9776a57f831a3855495192fc3c16d00b1d1e434c", - "f3800ac13881bfabf57dc0160545169bcab92d71702a950c8f128beb71420317", - "f7adfc5265efce62d43a680014dc0fb9d73d9aea2668745bada7abc5187ef10d", - "d5c8e83cdb68c2023239c76db421bd3d1a103cb059157d6c31cbaf1b22908b28", - "d53ef08b6f9efb72ec512408fe5aeabc6085e0d517671caa2375a39fe2171421", - "3e7004afff52e5442eeb6c23db88e3f9a28e32cff03d4985f4dc0dcf2f39858b", - "4afd9fdbdc319f53b03697e7cbfbe4955ffe18219cad98d6926b621224cd2fc1", - "c393020b4ce1f66c80cd9214bd921cac294f1fafbe79b2506f22ce48a47248f4", - "8ed268e22d227aaf529ee27a47663e33b77716ccd103875b3e8ab424f6453b99", - "fdebdafd1c2badcba7d63ce2651e6ec95ee1d66a863b4d93d8f1877e64e4e447", - "c139b1ba1a0498bdddfe77973b093055fee7f5a23b7c7a3daa0ec068d2e9de94", - "f5625c98594b256f11dff8d3fb1ad64073dd0ee8978afb0aed0d1964a4ac479e", - "d079a7444edfc967dee978a89f087a5688cbaea2832ba935ea53767ec908e81e", - "43febd37b57e4c613a9ce59c9f6a9084e4e7a3fbf38e688ec03a176b8578660f", - "46624ab63992e04b3c2c6f5ad8ad4f5288fb3ef67fc42e119ae8fc1e3d41342b", - "3ee134e9e090e0896746370d1823537fedbe32a7d380ed0aba5bb18131d3a142", - "e67b4a59d60714b831538deecbbfb0e64c26236587df563a0d2a960b9a76bf21", - "0d1c3223b7160fe6cf960c57cc33f539b1e191acebd67b83bf1dc3d65c3e1649", - "7fb7063ab85195caaf2cd892820b952858d299a856c64612418c7f2588791bd0", - "bb8a6bcd80ed88fabcfb2fe0eaee85beed7acadff5d34f077fdc2a72178c1d3a", - "4bcc746b8edaa38b598de774fb59b634d04ee9f514d30c86aec2fe9940b070c2", - "4b76a46ba3c77a79568bafea3dfcadfc9c5137e9b58c0987d926165ab19e227e", - "d7dba9ec1d73e714a280b29d656fe88c19b4b9d4f0879008b42ae24ccda15482", - "9487fea3b27a19dd47c02e8a8e2ddf1b81dfb1e9b34b09dae6a6942292134dbf", - "217d12206d4e0415556f0d9aad49b4bf3e88fdd290a3ac4e26cfdc36447295ee", - "35c876cec211b8fe80b834728c2124114f787bb579047cc41018761ee01ed6ef", - "36e287d7a658df90b5127311adf89d1a0ef92590c35989d3ef9e0b244009a205", - "22da148cb1bef352e9ce398b9efd374919dd5d8f7a4d740412fb775a0afe94d6", - "3632dc1b91a06b733a60c44d3b2c74d32554cba92e8065272027ff1c050070ea", - "f51585060cf705c76d616366cb6cabd19bbdab98b89ecf0042a6d89b63a10fad", - "250659bcf0052794cc677deafed33056d760c0a5a078a59b2384098c1d4d6041", - "49552ec1f3abbce50784766c7ebe5c333694bf6e8e2ccfea273162cebfed5025", - "223d4d4956e1f2197bc221137cbb9e9601caba1ede44ae8e791441c5b63414cf", - "c47a199a114eed03622a2431e6ba8366d127b636b42f943bcf4f9d432641b123", - "6da60fc91efd983226ce7c8068a77f30ff72ccafa1955e6193196f7b7bff1836", - "0c5c4d25bf4e1f6baf8d5501a8114a49fd2d23dff244f32115751df677059bf0", - "d04a4a6638ba57adae29d58e5ad18cf0e324ce4487e2f5f05ca62bf3d9ff20ca", - "39e1ceca801ad638f01cfcd053b3340946eee54806d406d7e48d0cb18154c67a", - "5b8e833969b6344dc83259a377be3b06832998b4a96bb48fbf22607069d06eb6", - "68b3f4ef9090d66ac40ef33bb5cc24541f853218010932e97f1d0b413fb87b83", - "8b5562c48676d8c5c7ff6a379eb726c3442a6ed55cea6ce0150b316f5db1b764", - "faf788257c76725bbbafea475622e4614c399eca25e9ce93ff9c268d7606e2a3", - "475f9297356f5a1bd5dbc1e05092bad588cabbcd0aa301eccfefb6501d8c9984", - "78582fc54ac5a67254f36079dd23712f7ce98c32d0c8dd122c4206296070f57c", - "5b26f7c8daa882b7dc25935c653177dafb0b754fa06a676473dbfbd79b4586c1", - "4abad1a4c5b9c510b80018dca33e1e50395432bdabc43818f0ce79cf650e3eeb", - "c311954cad10117c69e654771a90df748d0da1e35c685c28c4f538423b99e85b", - "3f540eadd5a717b837ec4b43cb5343704f6106163699af0f160b9730c60dd38e", - "6df97b85816d0ae852caab2d743e567f7504f26e4f376b1d5abe48255a19c1b9", - "b3af56cfbb3e8a0c9256875dfe260e3e35e7bafccd811f4e16335fe3a939170e", - "7dbc0cf2f6d2c2dc2709b803806e987a326cddf460e8e55055e197644677babe", - "46fa07c405ec20bd347a57efec242c5806a0f310c0c532a9e8f818e18abcc3f6", - "0c007295a41b436ad9272bc585af4ead55ff0724c65b225e709454a4717e9aee", - "df42452b07d06466584a8b948c4ec0dfe67368f2736d98c6aa160999eebf69e0", - "df5c54b67dbbaa6ec4a0461406b551142ae0f127878ee874c624901cb060cbb7", - "f56fdbec79bc1fa20a359e5c441299dc3ccd17088a9e2d584b3bb4b052516c18", - "9af23a0376a44d4a7e192ece8262d360ff1ecc5a5689d134086718f25b51b472", - "283f2f0e73961fcb7929c9db928e9f38649fccde2774ef7abe72d32a67b41ad6", - "5bcc5b618e3ec7b3cb1fc9be927bad9939e61dd4f40ccf3cc2b0163f268d28ea", - "bd9bd1c644e74b3da0b55adc94cef97aaaab0da1a942e2ad66cfddc8581853e2", - "da4647c23187c487d55a70fbd472b073d21542d5749a740a3a4d85f406fc357f", - "9fcce48e969c871d0be4c32b4b71bfb55a4cf52022d74c7dfe2e4e565c538307", - "2a027125f15fc12edfa3b9d28128f3cfde70f46883f7c9b8c97d2defa226826f", - "9afe4dae7a2fbb57f8890054e315acd4440cb2f507517c6f297fab49edbe0f82", - "36dbc3b9c5d6f80876c9d9e856f7db0f7c1beadef21004b78080ceee118f0302", - "4ee11ea919ab524b4afa7f5187d100960dc1370c68fd8515a59a4210fb471783", - "c715e341773b9a90cd383dc6a41ef7488184166304a42025106529377ddbb92f", - "ab76c09acb83515c54146eabf5c48b21070952a91170c0cbcc9e06cba374c619", - "bd91a882567b2924211f767a295af2291ea7afd41c3e14c83846ae73085cf8d0", - "b7a4d28d2fe136f56d5c9380ba4348208b533e922347e27a0da7b16804d3830b", - "3531fcc62f9890322436bae20f9add0598bffb5db1b52e490a92c2e20d770c7d", - "15d427ae9f6d874c2e12a586ea30fff0b5bf70f771c2ffe02989b4bd5bba6ce6", - "633bf508d45f64682b0b3986595e05109bbd49e68ee7b84a3175853ed508144e", - "ca61a77f99cec1f79240410500c0fbfc5f2282cbb237b6d8fbae068a9b3490fc", - "542f160bf8e41d3bb608f325782dbc579927787ce688f11a9ae6c0b27a78f388", - "1358572a3afd2faeca8d3a2898c96b4cd54b76d50fdfe0429c64b77c88acfae3", - "c6dde92ae5e3bf1cad6f05ed254500d0c17234987c52419e9e6d6a6114615ed1", - "46fcbc19128b94981f2a371c07faada7cd7cfc46471b4bd1d48cb5b9f0b8243e", - "9cfd50c47b0a51f5bbf7fd2eea134ca47ba4e6c98fecc0fcf29accde275b64e7", - "8aa55b01273a4d0462fdc8d9f72d3a8106e2985c68dee11f098ff66ac6a862aa", - "aff493ca307341b6eef060a86c4eeca1975b8440d2d604aeb9be56556d4b90d1", - "417d34840e38cb654e9ee2cc3c88f0fbf7efee7870cb3aed3900f924948422be", - "6e19d506d80eaa0d6319da6ef1ee539a3784615d1ab11cd94c16f7fe43eebcae", - "7649ce9d29689cf8f50099b6a92575312c964f6fb8a15aae8c3c3e8cd40d6e6a", - "b34f24b021734252377d11a3bf18def6fa7deef68ee758c90828d12f2623b829", - "695879e1894820f649af89530689979eb6c212617269a09d7853c7d7a6d9008b", - "cc7b571ee6538b601f14a3f30f9a43f43e88434d0d630ccb430af0f9eee363af", - "43bf777509ae9477cffb846884d51d3058c76e3ae3ec5de860c5edff6c400fb4", - "19b4526d7f7288c15ff56be52f9d1576315658da2dfbbc5b27ced6cd5e82a659", - "d9e37c807e68ae7badfebb5812e6ac99973c5e68d7f510952b54fb0d30eaf2d3", - "2aaacf395baebf74dfb3e5feb96946717453c917fdc0945a2c2cb3ee5a205c82", - "62621f2d183d7d50df91de06831cf0c74115310982f89aa093ec903d796d6a54", - "6b5c05c4162a7bc812c13d708f1d95eb66d11dc0f182a435ac6eae107b6bb12b", - "8fa97081c9328021fd1c23cadfc1e2917378a9fe0f6608d0719248417ef36c80", - "a51ca26ebe7b2fbf13e0e9ce7fb72378b99004c00ac17591c1454bdc3775b181", - "73fba8d37a1cf2052fe2f2c441756f04f39bff4e84887e4c9ba3197778c44a09", - "7c96a64f2a8a5287c8b8d27b917bf954aa3622c6008547c661efc72d663e1568", - "8efda23e8d614853166912483387a32839ded301681ffd60beed9879da15df4c", - "e8b7c0ff23fc35714869bcb1a0564184d27f372f4c3dcdb62e0a7e66a2bd7dc6", - "a23378cec6c55d70786afe2f32ecdde2dd4053897a5c14244a67742fceef2447", - "d389d8be89fd4996816b0e6579164882e715b703f42d0aee88240bfec979b144", - "07d7c8d41a395c7a47a63622d62b1aba073fdb27aaeb780bd73ffe2c8b130433", - "62891b89ffecd3abc1cc2c38f987e6e9c53de5c0d2f26bb015945a05143b3c7f", - "8c38f755dc1fba67a9b2ec75c0a7715db094ea091e086de5d409cff810db9e4a", - "5ac1d92e92117161a8f0c436bfa76bff725f47ea084f9a0d62a58101d41e1698", - "3fb9264484c4c81aaa29146bd52da878a53e6cd3b89c5eb937f51b0060862f21", - "28c612b5979e49019c9a6dbbf0107fcbc94d7a1e48930381516f8f9c17c0ddcb", - "9c296b9ac1c8014d371c40bb8660462d7c54b4173a716f03b39cf2c6e66627d5", - "6679fa86c335652a0f20058f7144d2a578780ed59278b078af6c7013641b54dc", - "91a35ba3f63178285f3bcb143fa48c9340c5ef316b8bf3ed5bcbbdc1ac654d1f", - "9f0dbdb76a3171cf1642bdefffdd9fb05479b4ca274f6bb54472d3650f8c45cc", - "d71e030f074cf965d34471385f39fcdbb4ee37de2a33f30f3c7ae44cac33aef1", - "2fc5ee94fa738b9dc4ed1a19d84efc17b786ad1c68aeb9bd8d995484b06b0698", - "2425e3d1fd9cd5bbeaeb75dab81d83fffedfa19c21a1c88fa7459df74ad0bc2e", - "835b2c5604d6870ba5b364adb9d400edc30e12c3e52c859974cac40e5acb27bb", - "7045a18b9dc2714dea2c37229076077ba52ff31260ab29a48633e00061785340", - "426d79098746792844789fb93cc3ab471c26d42a8df61f7a7b9d3c0579fd8e76", - "67b6a5243c7ceb64e99a7d2e4b4b8b91301bc987867fa26b577df4d2f6bc1908", - "bf703a47620620e9f33554fa9416fce565e80de9ae3076b4d63041c2884a5fb8", - "5ce15e199e0398be5330c57de1cb2e91053b65f206de94436daae63495a5f80f", - "016a4f8682991228b8bccb843333354e08323da68ec604d5b58cfbfd4d7128ea", - "5168c6f3fabdeb6400f0e6e0b4fdd971ba8d867da1a54a8f986754c1bf71f5d4", - "5a204defd2ee6acfa006d0f071117e2f86be145746bf3b4e72c9180c158c86e5", - "3b47a7a9c5683c0a3c466b9585d89dee60491a05afb86b9b190df50d0a6407c4", - "55e5b820cf86a21bf4194f2496aed2637e799db928aa79256f55f5ba47654b2e", - "e6fec11fb780d377cffdbee0c3314ff6aaca2155ce8b0a31bcc79e0bcc7ecea5", - "f353a5d21d2a0ad2594835110ddfd8d23bfe0577a3e772f06c824426398feff0", - "3729634cedd0021e2d7d021ee014ef17cb8fda98db0d3a2184758ba0bbf15079", - "88dfe318542cb03a60b3b36f26fbe9ee872711d7a003b33473994e6e387b2486", - "1901fa5093ed59b796c8a64a8b8278f591827b8524f9482204374ddf6a62add6", - "f3a38d86d3570a6f3143c4afec5a76213d4cd3fe756f2652a6edcd6fc9e9b2ea", - "d2c6e892d9cc5c5ac6010b18fc8a95a8d7b1a6806418e1424188904b82821e1b", - "d563c25ca6825c21aa11f3addb916cc6e51dd2964314b9530a99416cedbcd265", - "4584e2a97f14b62067e595291177f3d98b7ea894619c16acbb8e1a33e5f2837e", - "677652849d54d99076db4348182c5fba02b7bb22e7ff37b227c5849e4c320835", - "6975b5591eb2992eae2767538b307d1b7c96db7cf972be5951bf03c08af14e0a", - "2d38b4416695db1c603a4fca4aa7cae3589515aa621e4700e901270e70da25fb", - "e76169ba6501885fceb126adab47d2328a677b99bd34afa8fb9b6505b9990152", - "54ff2884c0c5dcd267c32b3ba26e4f0380963e37eb4a5faa23806960c11f1501", - "9f175298fadb85e0e01a7ccb48ffa1d278c1f48a4d7dd6dbb1881433b8cd1958", - "de83abe303eadb22c783cba6b4dde2166994ab4e5eab0a5b5089c6a1dfcead77", - "0caa96a4a5fc4bb5bc9af91b34c3fefacf504276b4a5b5ad84298f539fa11a33", - "d4c59cf0e137fa44867ae6a3d6c7d619336befa9a3f09534a98f6b976e7d56da", - "e53855c1352009865121c47ddf1c49f0f0064f52d880393ff5989f5e88bafbd0", - "2dc36205e5fa0d2f91e27861a5d3f8ba015d6e6b69b6957c887467732711183f", - "1d8cc381f77da97e26b035b7420e8b7358fc5d8ea691df026c5e1f944b7c5f71", - "7b2db829831e99d22e93961a5c8ed06b837618e81d2ee1e6f89fe1b3a586a8ed", - "f96a6092138b32e000b63564af49b23bb77f8ff2174668c234fa7e2709ecf3f1", - "b83bd74a304962638716d88bfc44ab7e2039b0c0c54958f57fec7570a2667e93", - "e6b564f296adc2ad6ffd4e9fc4e781cb76710cbed1e5be0b5bf927466abcaa52", - "de98e72e06839a53890a2f9e186106920692d51389e27015bbc42b80518e7eb7", - "d0a5503e2f96aa8fe942bf308f7f4e6d0ae356e9795e67867ec018cb12553e90", - "9b9421c4d9a7fe27f61c4d0e17b39f177489612f072a720bf42692e99ad59adf", - "ea8be79adfe3f843937bcb4a33c678d0e5d78227d3f29c42d13a8fa8100e6776", - "5bab8ca271ce7c447cb6402156b1c65d99ae74c28ea09981ba337765e84a4d4b", - "2d8d4cef16c12609e189ce4c4217b849b5c7c75bf74c1644b76a407766719d16", - "b4ca2f85f2db9c6383f03bf672dd75318392b052186bd83eb5227f711a627a8e", - "e22fe882a0a0eb1b221b44416e45412ea1b4fe1b9860bd8c8743e92a18c44a60", - "e4ab695ffcd61e9026a386b798788ae03ae083be2fc66421ddf104916b360075", - "e554a4db66658adb535f53a7dfd09b90e1291ce4b795302f0f8b1da5f53ecd31", - "3a920f8c51ff04c1eabf40f66526b3ad5382f65ab0e513fb4785d5d0f7b78645", - "4cd333fe1a679110423d5c9412f65048c9ee90410790de08d0a9072feea8e1dd", - "b730d55021bdf097f0054b96526a6a3e89e0d1959d8ecadc642a172bbad571c3", - "77995d5ecd880dbcc63f3bafbd83c3b65b4645b5f4c6e5ca5ecb68196ad38f83", - "61980a9c7d918d97b6c22907e0cb90250b47fcea6282825c2aca0af5a649d268", - "a36c90e84877130e419d360f2fa6c90b74b9b472c4ee6bde1cf3e178ab97b0e2", - "2671eb20ec655f6bd71b8bec68f5bd9f3d3e8149f8cddb9dd3d9703537b3b844", - "e89d578b9491c8fc7138d16a0736359c6856e9268f8e34a4b5f0b578a8024c42", - "dc3fa84ce52a51abc3a5ffafe19d47368472809da5548673949a7940f3974bd6", - "100c31aca2e2ef2338e5de4d454d6bc67c95e8e1b7ec7a87dd26db526f205b15", - "6345d522adcafde2a56630297ce07eb286648c16e16324020d864c6f63ac09dd", - "febd407585f1690e412911d0347ebcae09a9635f8df0000de9218cf4279eb4ad", - "be633adc1c2dd9375f9ae6df76e4bb2b7d36d173686c6ef2c41a1975f98d796a", - "466559ed6f8edc77697a994f8ea8767eac16f0c33aad09a20b12eb7fc6aed7ed", - "ace4abf4c32d93b0e24265d898ffac7207e3e385d8d9cb9cf400310035d7d8c1", - "7539732bb88ddc4b935854e6c86675c5d3336206a78c4348f182a89d208dc500", - "1dd1ee2557bebbe509cd686664f3f9c531493bdcc1be65f1901afe0cbf461fa7", - "3dfa3415661e9aa561adddc113d8f76c13b7dcb4de2102d320bd14fed6f18e84", - "17cf469f5e4cbcd6272103f876aacd92627df3cc3d41573f56f4cefe537fb8bb", - "a05e6433dbb5f4996d72ece67985b3186a1dcd673050b92d9502cbe7591ea7dc", - "07a35189974468a0c2401391481b7af8f2118edcfa6559048d3a1ca1e61c5430", - "92ecc6f647ddfca29ac52b2ed69748046d77190789c346d5324d856cfb0f6af0", - "4b4bc05dfd4ab461e991c1831f15faa1661934fee637256d6f7aa0034f4a5786", - "1574e2adec2ccfdd83803ed238c54a81319d40f0ba5b334d91aec98bc777f095", - "3e3bf98b6f092794a01418dafa0017003c19562e31a9b8f3e5fc674712fdfa97", - "99340dcee2e752cf6ffdbeb26c894e23e5bc93930eeff4f7760fd11bb614a3b6", - "ea8c32e6d54ef7a489911b092c64f75e2accbd1a632e6e9addc2a4f63faee8e6", - "a891db8b9cbb636ad4e0805a97d50fea098387b29020eb791f1ec6cfedf13a0b", - "232760f0fe493499e1d9b9309438262276307b842c3bdd9b634d7d79f9003656", - "2c6965acf39cb79300fed406a89b26f3e05e5cba17e6cc4c73e272283bc9a332", - "2b8b5ad1b2a62b4d4d23d9b67019000fd85cba9662df562fb6fa129ce59723ef", - "6e18b1ef5e2b24dd7ac5b90b6f4c2d00440566e2aef9de1235a65e4ea56ff2d1", - "5a4b31ca8f13c84b568fb5f2485b67da74f3bb39b4cd652fd8f4fdf421a461ef", - "53f186ff5321f963c000f2dbe24840eb7d7125ad8e6a6fa1de523acdf7aa913c", - "e2380336eddbd89a2d61d8e00452b7a377ab78d848812dc20962ddd5c7dfa207", - "a905a57a756e9f19fd2b0f729a93eca87ab921c9e232460ba53221a975147fc2", - "e5a345daa1e8649e80d5b73b68ba89fe223d0f726e2db251ba733e679e989ed9", - "4e6a189ceddcb13315fe7e0ac4f613d77802eda90eed06dc0ece8e0a23dbe4d8", - "23259f89662def7f9917d96a73c59077781f42730614ff653e24c530ef155d3b", - "5de3a85f13ac53c3239eda2361bbbc6cb5a35baeba05dd38b0942fcc646a0d70", - "311464320074bbce1f95c8d83772d526b7c8fbd93040d27c3d40bbd9825077e0", - "b234961438ec8d8d8271690bf36fc06c075a8a61a2393b908c248a35c338f012", - "f9d19fd45472c7b0b4c7f2ab0469693b2f3f33c4152240792c1ebf363f9137aa", - "f329195cb0a16e2718cc9179faaee6fe83a7699e86e367d3f637690ad4e0f1bf", - "bcc12c8b6aa57de8442dc18d6ecaf4315d2c4bddacffc36c03052b79e682288b", - "875f1dc8105cc4d9e1dc50291720f230b31b79958bdb40c3af5a73dbedac0147", - "3ad15a0585810783ae1145f600f257303591a550a6b85b16e6bf7c18e224060c", - "0ed3b34705b4a4d53210869362d99ba5dbb637b7df1708cdfb6e60e2e985ec9b", - "81c944c7b4cb3963fc27f82f1b45906998208797544ebef15c6ea770878301c4", - "43f69fca4f9ea4e4ba344c345e3c1bf360c06a5ce5e0ea7e213df43a937cc976", - "7514cdd2343a9becc3c7b5bc191e24ac1f273fec152687166b6d0c552d3ab8f8", - "ffbda38297409fc3ff37ca115dff5ec249412b72c7064022a6e61921ebbcb6bb", - "01058f9a7108c6b722a1e2e8c090be7172809c0e7d2012fa5aadf4c71e919096", - "641070c5383e51afecb6ea448035aafef30a79cc5261cdb3d484fb8fc0249c24", - "85cd4f4c406ef6eb125c41d73b418d5d68ac086575935a8d0eb2cb4d309bedef", - "1fde104af2f504859eca55aec08894dc044974f29c35be3449950ba01f8a3864", - "a4e900dc2721f0bc3bd0f4041be07df6dac12dadb8c8697b57a9ec4f2aeb2cef", - "c6ffd5f7295e23aa866ce5f0e864fdab2ac382a02b7524020c6f914d80fb9a45", - "ff2bbca9b903db4219cfb569f51042930a51d6fd5ed0e5eb65e45aa8ff0f444f", - "75227632d325f2b4cf70085123a360ee0899415b4d7ea924c359fd3ccb897989", - "bef0d9e71f062d91cd787f0462a89908fcefb44099ca98c41ec283c2067180e3", - "5cb3b690cdd0b60c54f4ff74a41c31db6bb1f2d56ca41af3a2d99faa16a667ab", - "c41dd3363a16012bcaa15bce9cbdc04079acc4df0ed5928d40f2cf9c305068e7", - "5e7f9621fe672bdb6902859a6e1c1a8dd59e37fed649933c84a76d1fbf080a43", - "76290f028cc421861f93a3130ff86bcc714f9ecdbc3581df4fc2c62376eb4707", - "3858f0ae8e96588ea2a62f1ae658a8375d3f4f44d0c9db0e444e25c4ed43bf4f", - "27481f7ad29e7b9b3c143a70c9a6ccadf56ae358255e2a4f37fcd9472362be04", - "b733afb1c8e24af8412306da703822b37a131e179c452cbb58b78fb0c046e560", - "52aa2767dc311e709da978e2855b5913bdb017d54572f2c20fd1a640a8ac8c2e", - "f14dc852cfba1a9d1c7bdf16d98d1b7d91ffb7808d69a33dc44f4153544716b6", - "9241efc90877bf919c537af86e603fc708eee568ad5f1073f5468d7388e674fc", - "dde1d7755c23bec7d8ff8ea38a69dd235c1ef6706deb6481850b785fd345771a", - "71d2ab1c3b21075671ae73419ef4c8ff6f976121133a17918f571d90f2839ccd", - "15a0201b8cda8e2f8be9c9160292a99c51de2146c5b07fda0af6934ae90cdcca", - "a87834731c01f8e9b16e3772c5a59d6324a7a56d5f22890181535887929564d6", - "d1e6c6a853deb50c2caf1365eb0454975bf39deecf426b2b92a82b7665e4bb3f", - "0aee6aea6e37b30d732c5b6829e3ea470aa6a09c039659265d1558992e76acf6", - "4a24b49a3b9a410bb51023ce1748868e3235ab37a9a2f175f643e19169d81372", - "829e8b6d5a2f6e654d585c60004492fc9ae949cd6ad1060fdfa57be1435ae11f", - "4330884aafd60a891f376537a9a3313316523b1afdd57e53c3880158d7f7d57d", - "fda36edc074915a51161d2090cc67591dd51ddb496ee02b889de983422b66e11", - "6c09097c676e2fafeca145d69c2bff5874d493422e01025d323a799e440c4f5c", - "1bf30459f3c56bc124ecc18e2656c383db08e69112cd6093cdd4ce71c2ba7a73", - "7c66ea1fd3e5dfcc8ace3481a7a8501bde981e2a34f1d119f0a83da1e475e2c0", - "4d0f8523ad6ed91b7001e2a1d73f76ddfeedea1d571a66726e4589341c6b3044", - "da34d3b3562307693e79f273f4e461a93f997e6a2a805cc824c129297041c6c6", - "f9e372a3b902a6adb473754c55432c2065c28b856bd77e70879164500477f0e0", - "2e1d5edd6e0a7b936c8de9192d6f713f8ea2dbfbd02b2ce9b62d66e7a19a2aed", - "859c40470724282712910db258bb35e5e03288a094ccc23b12f9a8f051c21797", - "cb895a78d3444c190f3cc015a736c330518443eec5dd5cda9fdd92609b38d726", - "be098dc15125094f88a7ff98a33d18ccd79337c5830cf14062ab4249a77b5757", - "e2fd47eae4283b87e460e163b05815562b65711a0fffa4559bad396242da9ed6", - "1732f6ae37933f12d83809262107df819c4971c4564b3e7a008fa4eddc94ad5b", - "54f82ebff9be047b685f538af6d725f1a0c7f6479891d006eef1174159d5ced5", - "a9d230ec6bbe46c6abe1235347975afa70abc69d4e367993f19397e95523356f", - "5bb1141e9dec0bea5f47a13e77678924bbfbcc906828f3ee641e7ae742a182b3", - "d64e1066323e78e144cff0708e590f3996ea4146c6e63deeaf3f19c49f2a396f", - "6d9fb80c62595d330a473d42235e9c8b087862e2eed395c872947dc38a3b2518", - "129aeb579b658c12d0f8e2ed75bb46d75d8e4c50b9ba24e464c1b5a38b4d8261", - "81793022a4d4cd9eb78e26bcf07b94c11e4832993168bb01014ab7baa835fd33", - "14733c68ef4fe7ffa8b806c847af3a58103f56a5e50eef21a98f0422214e9fb1", - "0c12ceadf396e486987757cb42802b6b85c50b43270108847431086b2983622c", - "c5425d30af92389908deaca8ebcf9c0ede94666e682196ea06758b1b3c727f02", - "06e46c455df11b383e79648a7179b60c17dcd409117c9dbaf33f6f8974101130", - "1b5d3f20e57cfa9ecef2320ecfba32c0fc127430af1e699a8f374984d2907de8", - "6e68db92b32cdcdc78c4304362d1d4b688c064f1088c9738e9f0969ee2ad571d", - "da878b94f364f47e76625d6d3a10ef030f8d19d5cc9df5293388106ef13fe574", - "e240825e2bb9d4358031bf0a172e3ddb937ad39f55a01b823b7aa27b48b7c622", - "2d1ec39227ec964b2c630fb4744a6fc3aecd2a1d10711a6fd6ff5cc6e9de98af", - "d67135f74404f609ba5dcb9108af7b0434a5340b37e168052ef7cc7842fdf2d1", - "94777a97a8f348455de8d0b780a180cfb3aa10053d058ec390cb11221ce264dd", - "9968706b6a7d6f9e062ea07ed54f4063d3688fdc0239a83337694f50645740fd", - "0ac89875d6ecd486d3368f154d50a7fb61aa6f8b6fb9d838e0744c39b604179b", - "0a66dfbd49f8a75a21c5288d0e1c132b93c3a0458b3f8f7f1fdf77e139795838", - "1d8ea8d085057ac0b95ab7a4aa86e825c2b00dcbdbf34f45b18502a6631876b1", - "d94c0620aa9d99362a74c33b3b8956f1d2ab02e936ce7104ecff97d9f4276061", - "4720fb67e02f62f78248bb7f35f91e0a65f4e85ac3b9cb9ee54dd7026db6068d", - "2431dc294a61e49323881f6e531a0b01db77e2dfdc3e216ca7792e63b7ff62f5", - "f7c375d40813b7d40749fd325354aa9de9ae3e9197151b2d83abc3499c814856", - "1bcccc5e3c41d8cd20195fdbc5c8e1e59efd99db8fca9165b92aeb4633cbed63", - "53f03e1800d95205df8ab1eb43808029dd08551db21138bcc7723ece4b66e95a", - "ccee77db14c1b094e10425931ffc535473f04cb55df8fa41c9ff0c78bbe74198", - "858def1fef29af73441b800232d63113de767e1d7cbd9e434bfdde9ad885054a", - "2b354cc3088abed8a00b6863b899d145b170ba32585f946ed5b1c865bb9c3a7d", - "6f88faacab77f4910a67ac9e41ff4dd76adf500069e89341c0ae77d25182c754", - "fa2a5747a30337dfa6472c6ee23a13d88266274699ef9a6ec4417a5aebed5326", - "f2c7ebb2fced41f225605b3c2db2e599e4c4202e8a93a1abf872b4493bed2066", - "1b2aff55124576c034ca1ac9ccbb58738a6c2d581d5c7ccf968c95a35a6b0324", - "6221d2a8cfa8522854b0b0fd908ad9ab444885d0af2b3745468f77aeb7972cf4", - "dc5d6ccf254666e0c8eecfb21e458e7ba6fc59282206deb6179516a81710fa4e", - "c1a49549fca67aa31635b53ea60b8ad725bfff71562e61b4ca5e99b69add7643", - "556a7c8b86b0b456bd92631a3ceac5238ce7ca0a7f70cf59ab7432ada31067b5", - "def6c4b39db96b56da211d494d79065e8688d2d56c32511061e6f25bf777e0b0", - "1ae5030dfe10d4abde10e4ed301ddfc3ed0f1f9373bf61ed5a3bdcbe90c7f025", - "55bc53811b7b4b2aa210dda33c065b98e3741716b30145eb0a727e93569a7bd7", - "77b521a53d6b0b0fff29bbb828731e8e3e7a265c84194181aaba29701e7c2470", - "dad124f724c10c6feac4546e04f913e9ead492a35f8adaa7f5e1eb4ed719a894", - "ae9768aa5553881724c990a86638fd02a2b3fba5e89bc7218329c1a46f34628b", - "3868018a3e421f89f88bcabfc8f8fc9ccdd86576527e804b65c1a0553a315948", - "c20d5ef475bb20bb37613855107a9e42505de44a45f4ab7e53c61fd2f0b190ef", - "55fbf4e8e44e32e8ef812313a73901bbe8b9f2ce832c7b642b3bd2044b3a1a51", - "4431ed575128d5f430dadc1a199aeb41b076f883c7c399e7120a7661bba52180", - "18078c8eff904bb3a62a05f09b46cf11c88afac2abf949f63baf1498a2d9dd91", - "dc20995b3f8d46f91308f1f90c6e45badede21f0a7b46a5cad6acab0977d3b1b", - "b9b60e40a0447ca075193527affe6a59f94a4a855106b5b849f2ce9fef17770e", - "d17eeceaef24f0b7a356774bf66b86e334221dfeda75d96381f10f594a2f85d9", - "e1bcd7314b12f70f63b444b4c58eb2f9393a597ce7da2eccf2c5a0b552d0f833", - "6d4702ceed596033d1465e2ea1794bb28fa033bf820809889cd2fd6afe6f1985", - "21d80a0115b84c748574aa0509fbaa740b858658443e3f0d7d87bf7268285454", - "4e2ef1b0da80fb013d097410fc3069eab6e969c52a336dcd27d5be285df5bd2d", - "7f13949f6bf9a6abb9785f18a55bc1ac59a9d0ad6c71db1030a88b6d93765df8", - "9dce1c69bc40643deae20562a4f59603aaa9de2189bb1a0d2cb0f731176b85ad", - "81afb0391d095670b8295da6d3e05aa6c82b1e4ad525dd0c3375464a7c0e3681", - "4d6a903c864a0759a73da6874e3e299f32ce3d9c9b560553e3bf84aa3b4bdc98", - "fa569f7eceb94c6261ea8d5b80b2c40bd051eeb85b65ffc185a5ce43ee07a70b", - "4449bf844facb12fa65dd8812e8d52ec511ee17097d2728ca10c42415e49543c", - "5cb8b2fb50b6658fb3a0c66b92597583b8230e899d403495ff13bef48727fa3c", - "8156793669e4c1d6cf61d856d74fec336e6c42038323a74a3682b503f02f10d5", - "aaea94a6fd64e00ae516a9cd6ad0cf8afa47efcc63059dd921974418edbc202e", - "9c83a7a9f79bdf3d57fd25bdb726f6cba5b592e74cd5c09487b465b80012eb9f", - "917d3313104326c8cd62f655d460f31a94931c4e838db0942f6de3ff4f4233f5", - "855e114a3045e5f5c334c5e21b88bb6d39d428a1d05f8f697166686bb5a93404", - "20d8ddca53fd8472a65e9d38133a32cc7b760dd90ae5a5410755d3fb644c408f", - "df1eb73c7a81ba091ff9a8e3d018920820a7353381ab1b236101b11885fbd9f0", - "1e3a3c9fb16e9468f622aab0bf28fdff179ebda7cb2d0ae483f542f6e8406df4", - "32285a64f0c7927fd397a7f336f838c3b62e08dbabbd6075ca3adf7cf5f0b04f", - "94cd009a5ac654f3535b1779edd37c0e9d349cd78b37e13cfd803dd2a527c11e", - "23f91a2002b7485798eb0ba28c8ca2a21b9a2ce697656a13357d94f9a083d6ab", - "7b9d6f8c0ffac120f61e7c0f05216aa9e8eb7fc7c34d627621c4c42b8c7488b9", - "54e3af652c3518588ad1b495a705dec26bcc09687ef4bc683526ef4a674fcd7e", - "3b66613851b206815e1d19ae46dd3f3c96bed0dc3f4a6b793d463880d5e61552", - "0954bee7f235fe813135b1b9efab8d6a3452fa49f62eb71afbb34581f372d443", - "56812b632e4e29b8b7435512f21a3247c1a9d29fa4f26f8714b31a2b97c41f77", - "61a0b502cb233004332eba8baeb96b57b0444e68a0ca3c2500e0e140ff7f3254", - "591b511b1dcf00fc07054f63481b0f428b19893b670d8e3637cd8d2bc46d5170", - "9df22da48075a09d704b48074dfd47fbf58f475739d96d5c2f7504d455236485", - "f4314a8fd9cc9d0eabe3e1db3b0c41b993cda2c3249184f58b238bd111b0a841", - "7f93c424493d57a0962226394d85d5667af28896c3dd2cf27b05e02eabf7b5e9", - "e676508195c713ab81f9ad0fbeecfcce0792d01881ec52aac3ed309a16a7ac83", - "bb5feb730ac7f4bbf94eec358f15529e9ea26fc792eb2e40ef605ab93c4aeac2", - "44f8bf076637889cb39fdc53491f5d2075add288d2f7317a175b0f7d96f885ef", - "040d5e1e3645ae2162cb8767435cf5fe072c0d23cf45b8c39bcd4f24b97508d1", - "287cefadc46e1c4a0266687447c079db99e42366c8393b071df5b8767717a5ac", - "b80588e8a4ad2d0950e0a10b320579735ec404e152b067f21a8846c5f6d63fe1", - "d43432d7f50a55231cb6f269fdfbd7bd8ca0d19868003e45d3d2a94f15f58417", - "6ba369cf25e6cc6aa714abdbb6914208e6744a86a917b518d5a5e52277b7309d", - "4e8cbc2d24600f5f532cd418a1cfd2375f2a22d418b4d807c044bb31cdfe4e62", - "1cb12dc9b79609b896013f879174984f89c0ad3afdc23d4f594ac959216070b2", - "9e99af42257f5cad2cf5cb3d147b1873bdecae51a6fba034dd70fe7656e500b5", - "914683d22007f6dc7e8d1849a48afda6e66d04f72e68c543943f06dea6b366ed", - "e9a32d9bc94b0d8555c885159a8997732dd9b47dfee8b2c806611df3a22607af", - "07737748dffebf355f794f8d719982f3272fb75fd0c665ba6b0f427e7bb87631", - "87891a514ca9689cbd81b7e91500f67c94f1668b208c5bd0d916f34dbf7488fd", - "cb2cc5bc0a37cee9e51374f423b6986481a6bc1139420fc2dddcfd7b3b7674d4", - "3560c61487184917cad259afdbc39d2d47a0bff1c842d0e862572843c2b49ea4", - "15fbbf37c488fee51e5fdcac7692081c4bb694e1e8958179f4161547cfeb1186", - "79d1862f4ce67a533062ee9402e2b21bcbf496366d2650c65cb75bc83b8ac00c", - "2cf66d2b0dad846b4f7160cf7790b5141ae47a0544b788e43bbe522b07ef91d4", - "9bf74314d54f4b97a9237f866d0f96a99e68952410b029de0f1b1d16003f60f7", - "9afb4c85efe3c4860ba583d7d2dc5875f04adb939462ac2df4a832c0cc9e5a48", - "1e96af90c20304e7d7254721f231002d8a6b899a626fe9ff11ebfb148031442a", - "2a52f672fa542ea515bbbd51688df28bcd0a399d998a752e6e1f94186a84c00c", - "8101048cc6d0f23fb41e31f12f7121fe2a8897b8f001234fdeec10ee2608c9c1", - "d8c8a52d60ec2e5fa678a097cfeb29dfa46cd0d546d3de2f419df61ddc5a5b23", - "47f1a5c3f70af0a4e0039456f0ffc9292f3d5913fe0c7398967de652cb24e204", - "4f61f7a2eb0c5257f4cdb788aef3e3a7047b78b9684551f2e0096a1e22fd0817", - "3a0672dde4a94cfcb805e8473897c557ff944cd543607092fa16f4b579fb2266", - "6d5b1868bf210c9971f5bec82ecbada45104fdacf06f7f8df4e3f8f51cbc68d8", - "3e12a7b3e8683fb9c7c37dd5a1fe30c1e5782c78c93be2f1f65643587f02b5cf", - "96c498edc3efdaf3ea9d45b8356cb55ce55e3dee1ef67258720ebf0b84b33c31", - "af6936ce66d576ae446d70332ed42a4e8ca2fb76aba578a4d468f11f9815043f", - "4149900687b0068863fabf8a74a443d9e66d6ce02e6ec1d6602348340eb15982", - "3d9f043cdc1c79a712552adde9de52b64410b89c98e5514af6f5866476db5234", - "8e5d87f18214309ec27ab9704df0a8bbda7f44c455647cc810b4c0fe86fe9ca0", - "cab1f1d10087986ec07ff888c37a797772b181fef01d53e48673a43b9ed9204c", - "a98f2128b722929b1a6bbd1b647e6a89da0a71dc822e9c6dff8f80511f438ee1", - "e56768893adbd33d8a0f78885be3a98d0b4ecacbf345728aebe9cc5f957d4ea8", - "3cb315fca827feff49de6e367ea7c68df283ccf7c7d51646770dde8099d8ab79", - "3db857231a58426628cd1e471cf481900a62eb6f41452d08708872eadc3e885c", - "fe54b6eed666d425731aeadc9d9c7071fe47b5978d415a58593d64f6df72e900", - "c1010c56baed9ae2f1538d870a33f56dd45aebbe72ca4567a5953cdea7c880b1", - "e3ea64540bb9d45bbb471992e2d5ed280297843e39c6d98e4742ac13d7179c90", - "30563c1d3e2f7ac521df01ecc38cbaf3eeee87936b49c1c039b37c7a28ba86e1", - "d048315f5feac1793ff053346fbefa0b2f9a0b658e85e90f5cb34554a65b4ead", - "089a4dfa507a48df68c70e1016f943f8ce63a57920cff47251e689944bb3cd65", - "83b78b5da35c77d1736d0f7b9e3394a7465f9581c3b43dddc8e4e9bf863f33bc", - "fffc3c2aae793e6d026db2cc4574e0fbea07f3d6120d78af2aa387dbed6c1306", - "b5d836fe3b63908d39323f27144c9777aaace97ab7e3ca980a9a8632164ec51b", - "967aca019392c2e2b06998b40d742620f99b3231c7830d468614c1879fa63ea1", - "0e5786f2f65b8154b54288726a41bb32e48fdafb19d31f1dd0ae0ec336bf8244", - "dc4b9a2db67cb51901644aa7057536e98089948899ea7eb76818b57c5cc778ae", - "45f72e7f10e9ac16afcf9b5993c2b28df96894893dc0acd70eaa59cd0ef9ed70", - "68afb32a714602edd24e4772c6635def0b130138df4ca3c9c6be2934210f63e3", - "7ade95cb3b58fcd8e02f11eabcc9280e03be32607bf8d19697faf810b5317c47", - "e48e9574912a13406fd2a075b91e7153a955e5ad62d3370392d435698f77c983", - "33899ee81af7c66b3348fed630e5fcc43846773f6cdbc837da72df9d9c919bd0", - "09a7d09e67b1ac799b50c1de0182c3b5caa3cafebb2b1a6617682d34cd966210", - "03a790669022353e8565580ecbdd0f744c43ceba9e0239955bf5766d5c58c69b", - "3708ff57402b6fe9eae5546c236314809fc3ccd2249cf9beeb1dbe0774bec70b", - "a61e295ce5ae76c209d60eae02f54fc458b302fba64605af5fecfefdc9c8eda8", - "c641c1709cd4703f7ecffbe4d79563ba9c2d148b19296b011a91025cea9b412c", - "027894603ccfde550fe7caf9b6a04398c811d35bfc849eb293d400f1514dd1f2", - "225e45c12075b7094daf65504fa3632ea31a7e6ea140d450ec1a34ee98e51b4f", - "cdc17e5596208d3ed62630d6a01741fc94c925dbc97ff63024223309b3c29f95", - "80186cfd6b9a59edf428cbeecb180514428a184e67e1bc9ba8399c5aadbd265d", - "3198ba30a55ffcd1bb89d548bb134386e33d2f6cee8ee2e3093f4271c299154a", - "8a08f0a03a043fcc258f9c89279e697d59b4a7d02a5a1b422480456b406127ca", - "46094c5cbcc6ed430d4278d4686342c6d4936398029986ea79c49066e210e34a", - "988c93469be31eb4ea458b00afe32d2eb4322af8d6750c7a9fc7f2d89b10a343", - "99641c7dd0c1e0d9e097f52173da1ebbc8e013098a8d28e6662c4eefb5e106b6", - "916ff340c9d7935c38b17f900c1f142e56466543ced893c9a054f2926a445ed4", - "f33b00a4762e194d5725dc6e5897db4869d577ae86d8d2aaca9d4adc8bf3e59a", - "d276ca870acac6a879f10d20300db18ed7fef58687a70634d704e3b5f6c9cb02", - "5800ef1229a24765c21d5a3b25e2911aa4a7552198dfc8300215f5d7d170d1bc", - "7c3db419ceea7d2a04ae56a78efb305dc8b99108e7fd315a3e1d565630892a1f", - "7904dfc0d65f5ddaa0bb9dcaf16769f267dfbcd0e8f047e0ab472e4e2e95586e", - "9a192241336c7484d2e846d3101340bd250b07ecba66a7dff22a285e08d88568", - "f8cfd936d9c25516f104c44aeef238da876a4206956107d77c6dae8a3721ead2", - "3cf7a56a693d9beb2980a42c9cbd1a106a24e6ef1ea8c530b845b06d51ef4d76", - "f5e9cbee3f6c18e9fb3458f569a7b44df72e2155eae8bd5bcfa63074fa710b08", - "90df73c8a44d2b3785608632526f344c9e63a4667b192913430db1d636d4f662", - "1f887ce6bc4bc9f7f97bc3e91ed83ebf0f7a741523eaa37d6dd1e6b4f328c245", - "d6dd7fc9f386fd939745cafca831e2de686f60692637da003d0a7764af5e948b", - "f0f951e451c2bb3602726c8e1cf45da154a7f29c48e279d6938c73bba49472ff", - "daeeeaa2cfb536631bb3e2ec4172a9a26b0b76dd22fb5e785cd2171e70ff7fc7", - "f1c46ddb553dbd832c6c3f3654bf1e9c2b518d8baadb67dd26049dc2f88c7c1d", - "64ababf82e3de554b1ff1125078c83d7d6a1a722ddbcd9a7a6a9a9679dbedff5", - "94be89348fde835593e74b06484dd8b7cfaff7181956148d6ce52e7ac9d5e2a1", - "95568a139b5d51c99d95cb13f42626ff58f1d03e441d3baafd9c0044da7c7a9a", - "84ed01e72140addfcf2bdad0d6c3313a7ab83cdb890097fe844f3a819a0b3969", - "39cfc62ed691f65823c176b703a16d312f325c56b32f7406f998a5b4045e2474", - "0342d80dcf52ac0ff2f6cf7b532e1b271fa6c77f9134dc5ad81999609d09b3d8", - "908707c3c18c474966b4383e293d174d34c6903c49d9d889b44b0801e0f80328", - "b98dc6faf679c0c7c2d242437cc5960acc5d08b012a96cb2d7ee9536318b0120", - "ee46734fc8c46e95668ae7d6fcb62687111dbda5a5c39b3c378278536b097386", - "1bbe6571e4a6a52475f7a213c26fe9b242e61ca53027674284dcd60999a2e40c", - "a8e3f3e28b0484505a078f3ead2067d50d735d7e70cd14a61190f6285adfe244", - "cfb95b721319bc93fb05ffcc8dbccb9ba1cda59831025eafed4cdb67d270c360", - "8a1deff93f4efce36e10274c01a488598d4b8375e1ae0f6f7c22167b2c7d613b", - "d561f43e725e6f76f494300d9bae0b1c62b87e840a37cb35f7837e47e8405f15", - "a1707245d1b629f94696d52d5e081afb2b35c321e51bea8b57b39e5f4567db14", - "d0ddde29caca1437be8c1ad0f0aa0f809aed76fca9e5fa3044fd1cdfa8196f90", - "35e55cee8f7101cee26177039f89a0ee01c9510f5d1a92abbe244f7f6e8500d7", - "0bd0d2d2b0be98335bb73254ac322237a3efaa8054f69c1a1d8df3508ba1e366", - "6a3574ce18439324e0ce318bf16605d6cc11fc5a96b4b62460895dc780ea0f99", - "4fe80c53d5d5625137a4bff8d4ea3d149f5b3919cacbb56813c3797bb3fa9f17", - "4bba6649f51ba92bf8e646b7c119bd808861d8153b30275c8f225b61c5adad5e", - "7cc412e53f2984f7c4f0538ded36b09ef1a4544ae63fdf439a3c81165682ef72", - "d1c0947c177e1356261f542f9df601c0c5eff001d6d3a9ce66f0c7b862666b71", - "74213bad6229fcd0b52e483129b52eaa96fc5e0ded3f512ad2625977dcdcc169", - "dbb97444a31b8a2dc4ad409840d7085d9f32e78aeccfa9b0f90e47a2dbe37632", - "233e7776e515e895d7d7701bcf8f251ae518f0f8c81fd2eb6f107e222147b8a5", - "75857d110a2e21db0fcd4e4dbe5b041e900ce999c29543159c33c1c15d73afc2", - "a6b805c3e927304769a30efa022c57ee19dc806b49d08a6788c47d78d42957b1", - "30f4a9cc10f073eaf654072ef98e3bc94532b21619728e92c418cef126087fc3", - "94f0d54601c48a29abbbbeca8737c99b9a6612305c557dd953aa5d782a11350e", - "7b127029e255a366dfecb3b8a66ed6cf84c17424d0fa2497f11c62102099a09f", - "016bf7a6dc8aabdf646d659a1488ab0570900fd9394996a3b38b25d09c959266", - "087485c38b33b3ef3dc524353494dac98e1eef67904a903bf078b5af82820652", - "e64ceac59923149b9e6e428fbca5863fd7b13cf13c5903d5d56d837f33074771", - "819d328049f3c4a9688c62a53d7a0747a51dc6a18c763b000790afc9aaa98072", - "c7eafc70843c8acb6eab07eca7612b6fb0d27b22bfcdea7a56f26c8e72642299", - "5bb3790d5b10013e7de685ffc60433d8ad7fbefc0af5771639a9c09df4af702e", - "aabcec72f2290045973e2f2d6b366c46dc1e7063381380773bae3a24b1d19f71", - "4962ddb748a7bacb3f1ce0bdc914f7306751d23c4a5c1394f6f01e3b72c2e956", - "ea5cfe8ffe9ddf6d46d9a1b423d0699a38f1708c23319d9c6d60e4a51997c2d6", - "2544b59381bfac9392732277c7350c256b1787bec9c9dcc850879d93dd9cbf0c", - "91f0a0f2b2c39e3c0668ee8d3c285b490935059fc9423129ec8d206ce1e1d791", - "00516da026834c8b5bd31984bf5c2f7ece729df9c45e77aa52296037ef13eab4", - "b602f7393e2073e894288a2848990dcb887a4ab90cd42568fd25eab01946f066", - "45bed6fc470ae0109fe4ab9a854a6428f8bca86ae52230c230c2ba9f7b9ee331", - "9440e9247443b3721f38776b04313470947c0478d392662570082521c455ce1a", - "91ef60e82eeadccea136a5498948dd48f3140b05b8bb59976f3990dd4b7c9785", - "6166e6667ca33f86a8428261bdcb313d8516515282ee10b1b47d6608005e2453", - "c45128e386bc77852da152b43b4feafb704918a24a0c1fe2241bd82376e1d8c1", - "beb49b663b76ad986a822ebfc7dda1671990ae2a1e6e8524157a08cd28790f6a", - "eb094b3e54dfe79ddd1283a52e2ffc93e67f661fdfaac27d1f6a8d1c04c4c72c", - "c23ab9bda8b7295361874af12d1799b233f992ce6c4381c9fd43cb334bde1b82", - "b61a90364ea1984f0640d40ec69c575d256f4b865e2f44a338909c34a7221feb", - "b77abbcd955739d3f0c5437f79409e41aede4dae41f78956036cb732e9f7989b", - "ebca29f502d75bfde773d2e462ec7faa3d25ff78a4288133502396243273d092", - "b5b0a71dbb14fba41e97d43c0493569f6637b2685a3bac4516905e32e888b175", - "1c1d6051f5c77c694ca7613a3aca92f5cbf7ab7e013e33dcec18e4012c86df16", - "53ba0980df387688e6cbf8bee9bff7501f0d9b8264dd684f3a203d76b2fd65a0", - "19ed2982305cf2b97f7bf93ca12068aa76d906d103de813b56be1499b14e2990", - "349e57c55e41eb5694f5b77964b13973e1c25e8ec4e7bfb0450a371f8b70272c", - "8fcaec0cb209342e1d093d0127e59d0f2a4d3770d7934b1dc268f3bf094b3f36", - "2ba3a15d7ab9e409c521af3f344c6d0b16eb90969e5906db1a5f4e4efd255649", - "3305097a02a49cc12bc0b5cef5daa54eaa6555b76132a68626d04501f3e54a96", - "5bed019a0e2a33bea09f251cb2381b3968666a77d967ea594a98c311dbffddd8", - "bf51f7aa3c22cfba069ab543ffaaa6c76880a507bc18f14a0a2b9aa72a800505", - "472623b2d4b8e23b8697ce5c1bccb3a1c3724d546383d19a9b810b1f1c18f4ec", - "ffdc627061a9779a00bbc61b3ddfef83c9dc5413ce2cd77a0d914f1641ea2f01", - "eca083c55a3e0aa0e1a00544fd1572e51b2e36d28a076240fa4f21e983e6599a", - "79671ee0f872bddd24d133c467c7ffdf58ffa82e43680b2c8fcc923060f79772", - "b976c4aa3da85b4231c29f22c50908a5b78385e544355106c87d79991f5ef79e", - "c5269c3f1c20c2a85c147673a530b19d74982d790912e0de54fb676a713d5d42", - "45bb389cb6a87760b536c6d65f10c7b05e1e2a47e8153f36419ac75d74e57c47", - "442868fdd53971dff37db31521b5ecd79a526d4381aeb67ac411010a005173c9", - "7cd51114b0dd2e13da36ecc813b4f570769a604b77049a4e1a93988d37f48ce1", - "6f3317ba6cd2d3d53b7cbc49d60c7e9712ea423d742c4b2367d61743b2050520", - "8ba455646b837add2b24e87e7f55eb52def60cbd57e0d1e93b3f0b0dc369deb8", - "d48c80cf096b460b653d403c90a9acda8374da8fe9de9bcff35aab788c6b4586", - "aafeb22ae114f0bd63a929f5913dd821d093f570f2073e3cb1be5d0f14c6f998", - "cfe77d328e773fc83f0c1d707badae1f13e0af4d6a120df2ef8f5589ded52e48", - "f3ab1c979c84282c53541e86f2a90a4f61b2215feb8d60d8544a9da34caff3ae", - "1175c9c6c6f850c1a97a1efbcfdf018291f462b1dcaf43049e3fa079aea7a972", - "a932b85a2213847dfc0e96e39fe2a4e92081b32fb0f5c4ba6ac018fd8ddf3674", - "c3e3b048940a098c71a26c3be6ac30fb0b434d30b062cf2560c12111899ebd42", - "6c70e2a4176b79695ee54a5878a27c9018fa936c98be17d104f3d41ca0e742bd", - "892b26435fc2ed6d983cfa6079434e4d1d62448b7f9b561dd59554fb318e788e", - "5f3468defbbe71fd672dfb5fd9dcc36de1b318b2ebf55094d1897f945cf2cbbd", - "68f9f73fd792fc9b415ea669866741a2aaf0b1a9c140cb632f117646959794a5", - "1def85f7265b34ded80e842f12e8f1f65893eb1838acdff490605230042f6b0c", - "5d964dbc7adb8a6cac996adcb0332d7eebee26db69eeac88237d12fdbe96f847", - "ef900ec4ad6b425102612340f2215d6701dd38be98c8fe804fbce8b1c6fe2fcb", - "87044a08262eca418276c5433f628efb5c2b5cb3bbb430b77a5aee0dc5d3502d", - "00a5c9263ec1dc94b3c92992bcc8df48a623ecad65185da070c149b2f8d3a28c", - "ab2d1376237bd30f58a55f777b9a6b05b76d2d2891f81fc371004e77aedb769b", - "17b1b6371d526808820af23ac3f70af5ecb4a71a2df31aa0b0976a583e99e72d", - "4b50dd9fca7ebdfe96f4b2a4343883a28c0782b4f0e49da4ce24bdaadec25b12", - "47af5d64646c671245161840036f1cf41133ce301252ae7d4cbd8e8e30339fa8", - "ff1f935483c608dda904563b3af2f6ae25d058fe05458ae09264ac6936db6326", - "2d100bd5e52da7f5f9d8dbbaa45323398bfd4698d9685fe42ef73ddb0150c8ce", - "1fdeb93f511da1d484700ba075b942105d9aa91d8c8ea94d495d761bcc009bc4", - "1a2d05c169c21408a57d7d0cfbd1a295531de64ade3e36d92de854d606406e61", - "f3fb29478666804efec2abf4e94c40c6fa5a03f9371055850c9ef2ef906a2c7d", - "6c3e0844552071a056716b3c17254b3b5e07a59929bf2b055aaf000a88209ae2", - "3fa05d2c275b39a61e41e104957bcf95bbf312dd74dd1812e08ae0013da429bc", - "bc04c54c8887f42620c938bdf066c409833f71fa5b8d72bd9f131592702c542d", - "7bf95823d60913c379517e34e2c1927769b83d9f78b82555aee8d74661c35de1", - "168c7eab88e0827101143bce011c089d4116adea08143c23c1a98a5a859d6c22", - "07cc90f6c5ea4aea8377dc0093c68ffec56214cf3b62a5f491ab58466d5cb467", - "3acd2701c5c109cde0a269ec27008d334ec297cd5ebb2284967e5e5b95cf723f", - "30d4c066016a2a739f20d8c262d30dc26b71c8982d8da283fc67d9fc6960ba64", - "9cb43c9dc95eb6a1b4790e1aa8c0b7e320ee44ea5a045585443fe177722018c2", - "fa3f0fda9d7ed4824f1374f93a680ca0ccfd1c449b54125dbcaa94185d5e4da5", - "8259fd5f80cbd816c0caa555a5c8415fb55fcd230fce2868046121accea66e88", - "2653b6804fe7995d0e46311323f4eb9946ee53b495b470426e639df302e8ad63", - "a5f8a08b1c8300124f7024576218fa4ebb84f80d47a59d7143aae9e2231d5dcf", - "e1f81e553a4ed6687ed7197aeb0f554da96764c14399001816384a7a40945914", - "4cd5c51fdf57b385d9b41f234fcba514242fd75ed6b609bc2ed26f93b03d9120", - "5e392c5501540ffb502035f5599d47a14bb568038fae9243787fbc851cd86fd5", - "9fd186a44e2f702285b1abf651e095109cdbbd1c382c32f755493128d3df6ede", - "89ebc660ad337e496115b156e48632bb014a36367473940a6f39041a09b4cf88", - "e4231ea102a313a74af9c1ce8a8459051b1d0d2733f82ae338e7d72019235728", - "b1863677a1f3e31cbbd53242302a447cdc460f0fc439d1f47f3d57b90902e087", - "9636723bdc678d585c15ec5fc4cde46249a1a8797e9b433496295a1cad8a690b", - "3a9efcdcf7c98e9fba26ae805a1541928bcdafca2d9670baaa09514f6559f8b2", - "fe8694cd1ecc309aa485cd935a873ba37f962d455f9cb8317b23bd681cf26e08", - "46fa1a3316785539f17737eb06bd3750860514c4d2e313bf3bc8212afd06e77b", - "a5b9d3266b8a28c68780501922db34813cd8a03afe79298987e1fd06deaf4065", - "b40c8c5daa9e8937377ca0c6065fb33766ba393e571622cba237cc4577d2da37", - "ac741958b4b08f1280567bff3d6f265fa3d90ccec1971cce444165030f474f2e", - "7845e103aa75aba724a071d9eea02b80555e6255c858032b182c0e06e9ab0870", - "e13510149999082fc186450388b5da331a69233690af2657c315d3a660138f8b", - "a63d91f0af62fc565a0b3e51c5a7ac0043c2d4bb3791122ca261f6136e077a12", - "044199be9dd0a91a2406c065e4e0f007685d8c2927889e115954afc2ef6233b8", - "137492c97fa2f1465b2d437f312ecea5fd465a24e665dce663e80e4955641df5", - "7522d237f496e9264cdfff0f688f13eaa057c6db89970d306248e1fca0f328d5", - "a85fd8b3484791fcf332256af3ae1bc1bf6b9e56ec0da0bab0241debc23f1014", - "aeec83c9d86843477d78ef516a226143d5273295e879eec6ba89da3da5870a8f", - "0557aef6ee257294f0b9f211b3a487a1d4606d9cc114733423a59ebe722e2baf", - "c8caed379ebe9df8cfbe4af0457d8343f2fae5cae2403aa24ad710c017721197", - "b85ca2222abd3f6b0aaf405afa4e15216206ac19c726481e9b7398bde7c35f30", - "0c78554598aa538fb50056621bd0a106849f0fdba540e7cdeed5449bf843ed72", - "ec6d7fcd8acd2d483395ac7bcd2fb62a23b422b354e833bf19cd8a58429caf18", - "784fa85411219dc8ef09dd9e34d617e6c9c00ec20e1af4671bcca9e8e391acc4", - "b71a0aca79121725e3e67bd2e4e361e784b965a8bfcca2997864a73fc5e3ccce", - "e56c742d59abc4dd8e0b334dd6fcfec002a8b560eb9bf4e58ca14c0daae311cb", - "004d64bc686c7b69fe45be5b43264997e456d8f615d4cdbc9f113dad8185696d", - "ea75100c53bff9869beaa1fed5095ea72e5214e3a5f4661f2601272869bd6a39", - "c2d4a2cf5fb579beb6fc43f560760fbb0e675ce61ec45f33d060b1999b87f2ef", - "24638a5532c2725d0a23b8182cd88553645b5e6c52e83800c2c55036061d1f15", - "c03fd2b057251fc5cf1bace02ec69b773be163aa3b741a9f00a9e1e739aafa97", - "4d42b9643766dcdd8b88e0841330af774921d24e4ffa81abcd189d2330126a03", - "5f059306f727369ec2c67868095296332d22f21f4ff56e20d140fbb973e36362", - "cb79f32aa192124b13fcd0ff874dcc4fbdea90abe100087df8344b534c6ce1e9", - "c800716805405e3607b014a5dafacd2c279314f09934c4d936c603a4d7821db1", - "a5bf25c59ed6dab6ff1743d2d5a67860d8163859dc60954e6e641610e93c9fe3", - "1e2b83a1a6d6f526fc9adb1aebd29470bb6816404dea9d06e44c6c6f3d2444f6", - "26259ea3779ac0e7b7bfed1543956c9138f99e9d29973a9dc00b69dd5b641dbd", - "86d5c92ed335954e4a409ab29aa6874666c8be6aad1a403ef455ac3eaf808c83", - "0bf5b0099ca3de7a65c51cdc68d9af026180c54571bf37c1f04d51b455a5597f", - "56bf3f2d022bb937f1e56acb88e09d54817868faae8e2626b6fbbb16c69b3c96", - "05b418094018bff4c68a122310a4787c9db483bb01db8217ab1127d98e88226f", - "46c212912be05a090a9300cf87fd9434b8e8bbca15878d070ba83375a5dbaebd", - "e5657b91eb3d21629e9f670c2d9b1e77c3c491db547b0b3dbddb645c4dba82cf", - "18aeabb2fd9ebc29450782a55e936b63ed1acc2b505cce607979edf6c2844459", - "b4ddc44eaf4e6d0a8f01717bf47d7b05d94b8919fdcbbcca0a25a9ea73fa1b44", - "c8c78d68ad8017d47c62309c1fdbd03b07d037ccf993c86b790030401fc5fdd2", - "3b5aee455a51ccc1c323d84936f63dd621f21a6dec32797b46ce83787975b2dd", - "22038c27d94ba4b62439b2b388b6bebff8100d9b3d8cb3a24389492cc6ff1b82", - "6953ad6d3df6245e13d347e287aa8a89ddf6a4c51014a44c0fc5772efc6972ac", - "f79bf80e76341c59317233293797f10883a1ba32829c9d32fd2058de9a3f9a7c", - "11748c6174207ffe9688d7a9780b1229b492c32a1f18a7f67476d992457d0ef3", - "f5bc573e833fa6c74835e242c00b1411ec8ce84e4ef361c3dd95695dd368844f", - "48aa39a251841eb7b0d4f347009cef49b5341be612fbc92e3f3ebad196dbbcaf", - "21e4f170ca11d4ad25ea5fb325c5c9d430ea297075575df8e7d4db409bea41e6", - "07c405fed884a5f4c7b39884582c4e4626a97ca97cff124398fda3f97de20f86", - "f2dbe32f964813cc0de8c5d083b1e126bda43b10db864fd140a1da9dbc10fef7", - "dda818399889dab6ec2a37810926919ab77093fdf416624bb1a2b8f35fd5c0b5", - "2c36d951f21dca9719221c6125a474de10950bac4327098821ca0418e1d0cfb9", - "8afcaea6c17d5a01d092a722a99e622e423597cef016a2849def49ac77c0c514", - "630ebcd914e496005e8e64e1d3750d867bbc03e347bec08f3f4b4160f555105a", - "4a3bf9ed81a99acd142570d56d948395015a49d8f327425f073da66a2633952f", - "84cffb762bc0011498077c3a638056eee7efc0f60ee7b43ae5af86e051d7e67d", - "897bac62da445aaf0315ea11838e9898a00e9ee7b917097f98ba1fcdd47be960", - "0dd4f2ce4e37e2a23289b0ac27cb4a3768e05490051f0b338026c0a567f57913", - "ca8f52dc05f4b68d799b307a1e2295eb80eb1c93245e58d3180f3ddbe40c5b0c", - "eb70efb3d5256cda6c700d5b5189019f39468bdcb5b655e88988298c69239b6a", - "7071b42b38a12fad47168976c76ea70e4bba1e8f8c835d6fa745e6af024001c2", - "d12d2b2f2dd76665e2baf4031c2be9a3a67f2584c7cf707e2682aca571bf3d25", - "0b66accd6cbaa9a1ef3609eae92e59a28b7d383663078638dad6fc222e36fe37", - "0e5af78d327f8dd4d82d0c301a103ca14330a7645c04b2fec36cf1591f613a50", - "709b12c6624d1fe91d0885cebb00775fa78e9060d388f93e864aaedddd710722", - "3f322677aaded099b681c908d7796bc462789e65d8d92f25af690e0d8eb2e875", - "5763c14aa104b86a796ac7ff04d2be98b2c032c4816b5c0967648330958fa145", - "db6790fc396c6834b72f435b67dbbf734368304e8823335f2d78ca8444c928f6", - "fe9c392481c68a45cb52797e2bb81097e499e74c5fc7439826516d102f32ba26", - "50a9568239c3f1b1ff0d175b8119687e6fa36941fd9fc0ddd597f9ab13994a91", - "2b4a126c557fd0bc2d147295544f72713a625e1483ea49f64629d2b36f327ebb", - "b07079bb4c8d6944e670f03040282d5bd47a30129f181d75c9270ecc33ff9776", - "91e1c35fbc535c6b129ae3347827baaf0801f74b1774e38b9c150bfac63698a7", - "b8d9986d77234d31149e33f626a7e5b29bdd429ffb04c448ab151cccb1acc14e", - "6137af51252e54d6ee3817f623ff370b22e3d4ee56997d0bc78bd7d840a087ce", - "4f51315a3d16cc740386a6f92f21c6796224e8aced72755331cd4d849a432c93", - "f38bb9256f8e634088b4aa50c0161402ef7cc2470feecc49798a75483e61e59a", - "00542b7f7d9512f5fb0080d3e0077305a8ce2f0b231b250d9752137fba7494d9", - "fa1971829b1443b824c7be4225b9ff438a71bb0b4bbaf1e34d88a4f9c420eb13", - "3a24d1699dd1ee60c9476bd63f486887caf79a26f65131d1114b7a22549ee725", - "1eaae8f68c13c50ee2335da908d1359c7956ef7c89cb5d51f53d01306cac44ee", - "811a6647dce0da6593505c285f15988c86a57500f21b0ce2b954eb1a183b4794", - "43a606776d48ce12589d2eee1efaf4596fc73ce744d5f9f806a35ac72993cadf", - "13d8583c5542896ff5a320bebf757522aba347e8c6e625a7a81cdb693c7df463", - "644b1d479b5939bb059eff32cc3fa88c46e1c181cc268663cb6483ed9fafd2d5", - "4fa6c1107a4bcc01126144fbb108c42c501b0fd15aef23f6fa0dea1ec721577c", - "c934e159c79ea018585d9f23a1b5a1b911f15b6b256d8f43480bdfe9ec739c06", - "ebedfa4a1f3695b9dae4ed10198a444e203d5c1f5a0d9020f6121cd00ab68f52", - "9382122cd666eb66b282852aaa48c61e9e029a6ac70ed547bdc510a3da3659d5", - "db1f30d8fe36b801873acbef78a3124692d9884a1dfd2dc157586a23d5bc7507", - "8de41061319000bd4601c6a4492f8769483002144737fbffef06a79a9792f92c", - "94d7d74716245abda769689eb88f84ddce539b506496db84572261f222f1f313", - "71e156fa058924c26d1cf7802f766f36af1380f99744f65d190a7a989a878430", - "811d5e2fd727634c66ddfe0b7dee589dc1d7e86c20accbaab9fbb53ad96749d6", - "cbc21868ae5c55390a6c3ef425b21eb8e6c6205207bcd2fcce36534bfccfa863", - "8ffec92d8e5481e65a6cf95c8b8dc76d3e1da9ae28ce0d3fe2549b2e48143724", - "f512457a4266bbdf603dc137a799355f56f907518a2c6f6249f90e9b2b705527", - "06416113774d2b0ebd21b21b6aa9742ced23bb155a6db4488202aa12bd59dbf2", - "73537b033b0dcf35d5fc81db2709ab25b3e96d03902afdb26fe46caef7361d0f", - "cbe9c6fc783fe742c34a8cd7d508e2cf4491d9f746c4caecb7f4f00696a06286", - "bcd5a7b8505ef0d0dd7fe39fa2bb420ce47423d3e04787fd95890d56246785ee", - "9d72256c1c2fb93d26044148999ba9ba2226f6dda09649a4bcdeb7c50ceaa28e", - "dd20f7e51ddca39ae4e6f37771c748215a27f02cdd7957cf60c96efb531ae999", - "c6d0ce99996f34960a766d4b6e3d323333f4807d8bfc24751a8e54222e4be202", - "809b0a95e368728c714b45137fd82b81ae2caf5c8db5fca37e143f8216b10fa7", - "5fb0051b3f491aa9ddedce0545e82cb12a49476043f2c8ff07e25e65d9c1ca07", - "59cc53abd9d908143be797a0c6dcbdb428ccff44f65c86980dd3c145ab2749b4", - "79a7699c5f748290ed7f9587f71410c40bb1931f49a925501da14dfa7e437ca8", - "10f853a12f8d733ab53dc5736da0ca66c854fd1a457dd3c9d22cb01a0621c8c4", - "7d33eb5b8ed8974c6f2de3579ebdf8ebe90cd587f373d8e5d65be42049e56415", - "501232340d2f3b86d7b33b1d521bea4f79656b7b3c28414c725cd74564a5089f", - "02b99f7b3935b06a2cc24eaa5b38a589af4f5a4b52344b66059bb4d18b5900f6", - "5bae2a44dcd602fdee7d159e4e12032a8d8cc1bb6290bf31d335c7f8a1c0941e", - "156dcd7069cd57504d0dc2cd46364a117d4d70ce2e83379e6301e396e01ee6ec", - "df9b67ade70e1bb2b9bf7fe4a094bfd583d81701fd8ed27c11868fa7e08b8c17", - "2fdcd91c3b6c0d94268ff5edbcadf2a6ce1eea0dc5aeff2e26a7114e026cafeb", - "ee4cd23deb611f02af41017ca808d551fa6b30bd90d96ce9602bc84dcc02a22f", - "550d387b4e2a450a92459a4b942a070ba5883f91cd7829d93c14e7083fd7942a", - "ed64f438a911bbbe962b2e6f432c8523ed5c8cc35ab283f15f20912fe9551bb0", - "01eecf2a4e47ddd8bbcc01d471ccac5474e2cfb20811ceb8fffb19ee347e2ece", - "e50f2228700df24cf12f0e9fe7938f89e5f47eb1e9432f00a6f5fc1b098e8c2a", - "f9fed835f489f7ea29c705cada75029760882d5a3ef14dcb26fe699e5fe5a953", - "b0a340ac407c6f4f48437717f2be2ec39add997a08e7ade42fb28239c392ec5d", - "e3db1281fb231dd68e96deb8ec97085a775e3ed8314b28c30aa4294e6c3f5912", - "4a7b3c24d9b33a66cd86fb03c0912aa014fb5cf3d44dbc899c16bb6b031b4636", - "e3de4cc58d972217352819c310e75e6209cb65992f494ff97a69597f6b09c189", - "48bdbabbf5abdd686b3ce8fb04c668a73ff402eb221a62685e8eddf31a286d3b", - "fd5461f524857a0ebd383e99111c7b9d906976a27e857312cdd233af5f97e781", - "e40d1f2da8531130260ab20906e9d33b5febf84344d85a887323f176cead4221", - "df883815061efdb5a273fca9ceabcb6702a2da56685e6d074d7559a0dcde2fc3", - "59eda013db0caddaaa3092c1573eaf02cbfc13d59f8e1d65f5048f646d511147", - "0b901a8b36608df0dd72782e1e1a01f5af44b0201142b9d3af7e76521f38b614", - "9674ab766a0060ec355f4f92db5db23dc810c3479fef636d5a5e9c3850fcfcc2", - "54284b8d1110f6529e6b2d9ef4a7328aa8507be2d9f3cb7b653efe684a1cb043", - "39500cc5aaade6da4e5b69acdef9bd387a9e0d97cac4981c0bfcb4121d866485", - "dafde8c7b95a795a0f0b7cb0740dc2300a8e77a68d6e001256ab035fe5828b58", - "5c17f6a4e91ea612d97f1f352c84cccf2b009660660aecee6bc0e694f2c3bfeb", - "86548d72cda138471753e1bd069162de094559f877dbfe770d52353a7995dc92", - "2669961c2fa90193dc9cdea103a2bdd61a414b0e84ea6e592ce5ecac21dd7d93", - "cc48b98b6554f0db3edd06db21e388194c0355d1f0085a0d168f807b84decf23", - "cee1cdb8b81bd1cc4205956f517f54d181323cfae961307008eb54ebd6af1f65", - "a750c98eea9e26cb2030331462fce42aa88134a444bab92fd1a2d5677bc0250b", - "608619e0b224c319240907b875cbea6c401f4ec74515c9189675a1961d3bac95", - "da7b484ccf8920463e24f8320b9276d8c594c92ec780d66f35f6f50323072a28", - "928b3f37403ecf8c0ae6f640769b66376a683d978a997abbf96ca82706add457", - "8886c678007eca8ad00e6f26fe9f70c830c166ee3607c001e011fa466ff68425", - "32efd70ca16c79da0635ee6597cefb276cf4462367fafd5484b9b06dda101546", - "1454d4536923910ce2efec95afb91cac6b01a9d7e0a648f451648cc6b9eeb5e2", - "1ba0703501e8910bf257a6f2b5f789903941fca3d4d8e446d999277806477386", - "8e41d0f4812d31da1069b3eafc2f98bfa09385f8ecea7ae8305d726a26a71fe6", - "9fa6fcefbcb1ceda6cac17d538a4119cd970a342bb33ad66a45336f7154ea1fe", - "e14253dbf92c19ae701e7313ca0cb57bcb2408747235ccf6dd3277a782991048", - "76690b1b574790f4fd9a337d33aaaba098598f8b0f7a6f39b33ba24ed87e5676", - "101587554f5be8e28616947a4c20a815ecd854f08a0f9d7cf7a547f47e8f4026", - "d6ec910dbb6dff2dcd11373c7338a9e6a372bf2f141bc09245335c54ca6c82c7", - "71c413efcb0f4a2bf843f64342de98e63b612cb8b8a84553653e4fb4927b8d28", - "5f6aac443aad9e2adcdf398b14f4ff639d8457889297138b2300c304565ddc0f", - "2113a6bab5d3ecb40651ce9543a621399738b5ff4f306f053b8c8799d1022a6c", - "dd90fe21a6eaebd55e67b864c3446276416d3bc2c073dd624b7d0d207885cdcb", - "65048ca5f57c828bfba2e97d1b50f2b5dcd95ce9dac6d3c5dff2def9044d52ae", - "1f3519ef93388eb2e91dfc3ba71b8546e94f987750b7e2e40fdbb629db6e94e7", - "d10d30f36201573cbdb1cb1a2aea9d0044ba76a248f4805748219e0ae5804708", - "5dbbadafefa39094cde05a4975c0ec451ba1938f3ef1926c893086fa4ba9450f", - "968a8e8274cf0c615b474260d7fe18473993d3a9b6cf78aec0ccfb3cf1c3a088", - "1d2f1fa5daee6b19a7b313218f158390ff2da94a13becb0306656e8e1a9963a9", - "a6590c447e5abe782bd5c1313c245d79284d38b4f3fa44a78cb7ce7ac1d64bbf", - "5acd7f5aab5d1bb5fa10ad1f2c86c5eba339c8c483cbac580c505b94249ded6a", - "abf91cf6619bd4d63d96c55bb986553f0b7f9a9ddbaf4b64e1bd1808193c422f", - "636436e58223647981217e5ad4b8324e5a4bc4daf42ffcbd751cb26ec80d96de", - "e99d157105953751a3d03474c8869c70cf439d046322b57b820fd24a92321c46", - "92671d2b4f256def17c265ca35ea65bf3b98cbd35e53ad0ce42f56f35abbc0ad", - "7782ee65a754bded2dd1f7530cf8b50b5b44f2be7921be9cfc17cd385f6936e7", - "4d8de791f013021e2a582fbb35a95941dfe1d3f611ff81cda416c11cca5798b5", - "28fdf6c577aaa4bd65ef91302fc2cd6513935fce89ada8178682c3a72f790946", - "842bffe4f670cebf921b56759b910e32737bbbfbdba0c9375b18c0e8f9219167", - "3da843941728616e4abaa538cabf79ab84db3f0ee9fa2f72d43ffb7510aa1592", - "f259ba60452642b64609947b22fd7e0b61c135ec17e7637e44465cd4f50f6fa3", - "9c4d25bbfdd53e037bdc44b47c8ae4a5dd6a71e7ce443e2f9f29668578744464", - "51776634295cf67a5e8d36805a003b1c4a8aea7375f8a4f3feb21cac95a22457", - "6e54bcf35960c8d5b209116ab773fd6839110316165655f8abeeff8044135075", - "7abe7ab44753bf7f95d81ddc7432bd5235f36c514fe8de718393a82722ed25fa", - "e76090ee19168bb91e19a6d6cd1baf8eed1292d1c96672a79d0438e69369f4d2", - "a9441e3a9dedcdeac4e81ac5b2537a53348413c7136d9353e8b97b38d56a8c06", - "b9911d5e74cbe25574df095d69b93d5b306c7ff891789f55f089dae9797e6c09", - "35d17c80d0cf5cb1b2e8bde8fccf0d1e0102da6db8ee91f40684d658769ff3ba", - "cd5201076d35e25fed9e3c5cacbb245b909a88d6d54ff9820a6229c7ddacb21f", - "69c52320616dc5bac5ba1cc61630476bd7a7db2eb72bcbbaf6d5aa25dc5632a6", - "8762c06f0c03b1ba934f42f399a578376b94b88ba23896748126c803d745bc28", - "bfc61329e10087364c0d2c80f904446b99bab5c73afb41b2437cfdadbdfa8008", - "52ec7c7f89e1d9d596d38f43e95580b106c3fc4bdc8050e9e82a66cdb51dacdc", - "1bf31a53cd4f9ff10bcca858d5ddc4e024d587985825e00aad967410d52f336c", - "774e03bb9e06375c9eca126877b9032023d11daf88bb4e566ab193f7fad773fd", - "5f21d5a335da481a151fcb49304a43e45d8396e5b28c0696c7da306a09d6cc49", - "eb338b0e079815fec10f698d177409a9c26d1113599413d68b200149818ee9eb", - "55f6e00fb8822cebb3855f320a5f909266ed35f2dc9c9cf257268c1fac43a204", - "44e7d8134d840cf17e4c797573a52a38e3761a23236db01223f85c3df6d6730d", - "18442ed25d57014815c5d6e24ab76e3c00476ed6dfc819b362a8ac2854f8df89", - "2dd104d5a82a762dc9f342e6283f4b5474c2e4b834cdecc04ae698ff56adbdcd", - "011c6f9c4ff483400d5949d7d15f0e70576d28f7e24e1a8366ab1785f1be34cf", - "ada23daa27d074a52881e841d49da9da859afbbc0523c198247b7d6855cbeae3", - "09310a6b2b5918425812c75c649b6d60fad3a7166e0c2b3ce88c157e16136f58", - "a98af65ff539b098c824f295000e4e7869526c87f8a0c29ffb6f3e96755b5e09", - "f50233411c620d5f37de0f333aceafef9e4eabd2237555df0e4d199cef15c50b", - "1b69ea215c46699c5a179c5af08e481f367931a517ae49684f8b06f19e7b3167", - "9e4f4ff8be6808e86b77c80d857b8b0acd3bf1e9a24c00523e6331835b7509aa", - "07fd4664d9099cd73a1645eee072132599f8c1c275ce04762d9c27cbe4d9f71c", - "35cffdbfd62d417f66ad6c9ab55189c44b4553d9294caf782903e5e3a436d9f3", - "8ccc4e6716190708aa8014aa8d54596bddec3f550dd4106c017c6c4109c5dcb2", - "4ecccc4bd5415274c6d804e9a5f6cde7d8ed9cc9b8a12e78e47500db778d0433", - "c55f4f40e09d552298c3039aa7ca924df4923de3c5a108a4a5cea3dceb07b252", - "792d9d53bd88d1411681f4b579075fc98c3dbb2e8b3350ab23f0b3023cf1307b", - "72f87d17404f2aa815d3bf732f4d3ad189d235e2832e84d42eb62e1350aa2f4b", - "b92c450390efe932c84a5424afe3ecc1ef656acb7d83c0f08d20167c4aaadb1e", - "43c612d8600ae725775e18834307526959b1582cd10cf3f97a4e55cbfde6f795", - "eabd6a2279cd257ff987259f98a39d3436ddb65c2917d6eb1947af7ebe545c28", - "f97d39d6e76fe85430466b7f2e6fb8bb6e215ab15440b75c30f53e20914779e6", - "451864cfec3a61428e420fb26f985e6cd618a54b87a7e0632cd0355570fa94a1", - "91850d917479de405c7fe24819b1a93ced19ee89c2001267744b087b07c3941e", - "4e88df40ea78ce687107559dc5a3f30de483264b5a74008d27d3f665f4b5be3b", - "4662ce46c444db3271842dc380145260a015415b36f9a7dce78a548358a15779", - "292ac7765a918fa54dec2d62bfa07ee91b5ae896767c38371c3525bd283356e8", - "f46b19656bea6d8acf94af4870822c60576865879146f8d15d43376d40f12896", - "44c3ed1dac9db1689444fb7623c20f1c24a21b25f37112fb6ef4ad429baac634", - "c924517b0fb3a67703e4374a9ce590abc5d45aad879467bc0ff14f33b7a888d9", - "7e2e1f668b9379b6fbf57b009da7ec3a07dcc0ab9c3538cd2660265b0d1fc694", - "53713dae9d6b74c1710a1ef217eae47063345bd237bcc1490c9f3486f6cfc1c5", - "ddd309c507519077e1df58021ea038612fc88557f08e3cd67377e48a8b7cf705", - "1cde55e54897a3af6240a62eb0606fa337730dfadf5bf8847a10938d2a394ee2", - "99ba6928289c15d07190042b7f18e7bab2076cd0316ca14777d0bfb81bf4e9b0", - "1a7bfb4d1960b7486ff825a6408f1c555cd9c50454e48faebaf775111c26a0d5", - "386954f1eac10fea3a2b8e9dbee06e00a71de94610aa1920d7ae607f7496f212", - "381a51ea403c812574f49ac1b6f9793da40066db7411a065de4d0fb8b198c095", - "432658011979058977782043cd74bfe1da7d3906aff9e235e219f3cecb6e7a75", - "112a5f05b1c1061f765d29f75c17f01c8772018c42afbf78235d5ff10b6dcece", - "49edf07816dd0dc65401493cd976bc9679ed8b922e95dd027ca51e0a007348a5", - "c6de977f31ba47afa63fdc3cb4ababd78faa005e5c4addbe19ff5009fb14918b", - "274b30bed134e283c5edb1cd30d7bdb7d361c5049e0b87b068fa3262254ff366", - "b9b88193d6785347bbf1d855ec31f2d2927b29ea28c611fe47ef01fe557c538d", - "32f935d286d5d8b6d9ef1f1a819ab494728d3ea98f730551215fd6be48cd421a", - "d6e7fb9ee78f6c9a50b81829db82881019bcf4ea38103b9d5d89720848095bf7", - "eaf2d9dd58e23b6a3b0c8fe6eaf161a8feeff62cbadaa26757e7842d7df703bf", - "9c4a127c1bf5a34b30bcd3ae8041a1e6685e593fe45436bee425d4936b4394db", - "613227362e965308c79d6ed50806841ab032128095e92bbd4fb36f9d29b71d1c", - "4ba251a07818a4e1ec6d49e5c5e1b2745db1150e188df6ffa9cef7e6a7369a1f", - "59764234d5a6fed2b7d669158506d2f3d060557d24eb1db92836fc18739c0df3", - "67fc4011ee48430b1ee9eff549844d1e08adcbb46646784f5eb91fac8c116eb0", - "1a8c8ca1ee2b4e3f2a185ab1f426f09f1f0d69793c69d2d590b084cf0ab029d4", - "830ccb481f50c17ae13586be98a94ba19abf14d261849bc8f13f69268f756967", - "1de2cd82559daf9e8367a68e780f159e66a2ed122e87ae480b182da031ed8411", - "411d6f3da9612ac7be7addf26a3e025b742233217cf32a52e46418c0abaa2e21", - "725c238881e7cfe10713ad082378e7f1cc2614e9acc84660c685f9dd93f69ee8", - "6c93c7357a68f2584ec7d4517dafa62c596b526e46feb1e5c43252988999a8d1", - "3ee03be946dbffee58a764ca889fbdfdb0ca9c27faab8340d0d1a74d041f569c", - "cdd3b5942ae7456aa3ef5dac84b5f3e8e7bff9a19b24b13f209cfab02a2df7e4", - "99f35eb0be32668e589b4b06c838e240fcad3111bfa48c32a8dc9912c971697c", - "ea5e13608039ade7f6dd993411dd852b401cece4d4655d422179a5b4092a15ea", - "88948cb318f2a5e4aa991b55296d1509c9fdfc5b74bc8e7a92cfd7c8e6e2326b", - "45656c8503d38255dfcbdec249a4c4206bf4f8ffc5aba1feccf2244138402fdc", - "70801ffb3c994b2c1ae18e549b931b488da43dd9e92e4e4b0e31d6051477520b", - "a5b0f1b65fb4ae507774cd3386ebae94586b242914724baa873f02bd290a0ac1", - "4b4e7a4ad104a6b4b7271b41be7c52f6c32cbf382128f067944b6567d8658a90", - "62cdffa2d500df35298bbe7f118fbddc93fb51492470c86f505baed66b26522d", - "6ab89beeb051cfa8d2250e0f5ad77d5d8c71233ecbba601a3dbe12d7e4efe425", - "a0646a264d22a044143fa523068ca9984c86e49d35d4b78a5d06e114b28dc5aa", - "813a717f5065642656af3b3c059a561fe921b61165b05df0da0580306c0d9530", - "cb18851a38455cd2ea5fe4ac83bbd27b5bfff412a47ad93524638a4331a1fe84", - "367926893ba170ef1d0daf53dcc533809f92e9a795f2ae4f60cf997c84508847", - "bcdf9f96bdb2185b9e8f92d23933b9b076e7f782cc25be3b702ccdd5ac10e1cf", - "288a2e6e0a6c5a2413c730a53ae6ea238aabcb3773c198a9e50df2f728fc712b", - "6d33fc953083acf31595dbf16281d469a43708cb68758469599554e4b8d00ca7", - "77a594579de12a83eb621b72e4279a1aa91c19b51cae7501c41d1d48caeb9aec", - "2779b65017f1e072ca340c19f424579f009c4a90b089de9d4e91c84ffe4dce58", - "08521aba17d350ae68ddb7fe74289b2bcbb910b4d7eca05957968c3241e90f9e", - "f5e3131c01b27cd621140f289b8104baebf290ed6150be6973f9df63c74f9ea9", - "7e2fba3da2a07b3de07ea0ab9125a364d13a9290298e49cd1d4642137699153a", - "e09915930f4b36ffbae36b82c7c56f1b0744216149ec359236cb817aa51e2e9d", - "88f72253e510f5c8baca056c0ee95eb48d0e5c2a49a4fad64bc5260ddd7f27c6", - "41599ba2ed0e7b512e5d9301d89b5b55b7ba70f5281d0044e9ed7d7748c87995", - "6440b80aefec0b5a5a725dbe33ca1f82c359f935d01a34cd39a12753d7f6cf3c", - "587ce6f49ba4b8bd207313661b8aad07c9e6d6930e49cff942240b5a874f1595", - "22098e329894366e024e3c103fd4c15112aec588bc9a710780cb749ade291bb5", - "9f168994231f6d45734e1d276dbffb734c571bced0fd5e32215feb0abbb11b4c", - "bec4a2bfd61efb979e54ed4b250f9db68ab513b4f4476754cb4844d5ed9d47c3", - "b770491464d0064e8a42e09c01226ee47123ae2fc37e587f224af1a1515817db", - "4c1337321ca1ba32cbe7761a4f2a317204b44fb479fb5cecba7b261844939253", - "5d486d0c0804b53b4ffb0829fa75d1263de60a1687e376fecfbfdaf060eb233d", - "0d3ac5075644869cc687bb4e583ee615b1ef711c5be77cce4c832eaf8ee14c1a", - "03afd8e8502a68898fcff29268bc074577460abcd91c7a50e1d2447bb8e06504", - "9e7032f7a3dc5ed62781c184082ea8c193dc138358edcc4c18b0310c917373fd", - "89767de0cab5f66397398cf67713f48e55bd094051d2f3f52f0e9a29014010fb", - "8147855fce084e8cefc673df54f4628d64e51838e65182ace45432b5b4fa1ab3", - "ff590b76675a10036fd0b2659eb1ccb75eb133a517a2243b37d3cae238599f94", - "2d0679d33ca7c4c4fde1dcc4b8c9fd47d9851ff06ff0f6492a7c67b53a3dc7d4", - "bdc368fdf523722f8136078d17562603dbc5cfa36b347da2b47fd225bee40cce", - "ce3986654dd194153ea4ea299497f2e9e71cd7f963752a65d4f47de7032c6cfc", - "1479c4f8bc17c32ecbbc6414f3de8d64e045524ecc684057c09225366a1b80c6", - "0a62459797481ee7b0e54b24b5a17a55aec32d08447411675658139ba0333a87", - "f087f90c08a04fc5c8de938ae29ce616a1ab8c0aad34ae7823f2e0ab60a47532", - "205b74f73735a5075e5e0a928d15e7541c338297b21d14816cefd6ed659b24ad", - "5883e9f70ad94c43ff12f6a6880dc4ce86d340fa2dfff9dfc92df35595838e2c", - "a031f36493c5c2e1dbe852847e8742a4de43f6b637d17c32c1b35fe2f89e1408", - "6bafd5342d061628729d848332713f206d8cc7f31684ac50d4d268223045eb34", - "602182ec9ffdee572b4a3dd12cb2de214cdcd67fe1785817df4d6ca0ebffe40d", - "e5584f8e2b11aa4d6bafcf2b441cc52891076d46f8d5bb98c51110feee72efdf", - "74857006c9ebe212b4b7814459dcc4bf444aea324ec0bb745f8c5a395ffd5beb", - "c24ad9db9e0ab87e5da84243ef60f6bf9cb1f8714d6361fce0c9734fdd9bce20", - "09f4210a457413dd4bbce12dfbd7da99102b3dcb5e549ce25a63d2a2f8195082", - "2a60480419eedad7c9918182019fdffcc6a3b24d9b427886bf9391f09ad84e19", - "824986941b629893f6a187a7c0abe983bf5ea6e1058631974a671acf5f73c4ba", - "86a25e2e5e6bed7a7ccd157c3b5b243a1a8439c164f6203e93d53940c8dc6435", - "901e05ad167261f61bc3edae2743fbaefbbb99af3c7e5876dfdfbe01ce1b036f", - "cf7b7c30632c81909afc1bae61251c6800a91a9c8526366249941c0bbda85726", - "15d3931bb6d2501888c30dae535d453189f1e0f50d46af75802000d0cde3ca33", - "a65ad0dcf72bd9eedb0e65af07b6d4c674c8d44de4ff4cf81a52fd624affe3b7", - "e9e74c8619f00f30e4af8bb9da3c8d5b46eca3891781f4ffd2191b6bbc995cc0", - "cf4580e46bcb96f39adc009b020e9194e2bb7fc0f6a83d146feb80680bdc413a", - "a8d71bbe803041ee186bd15a194cb6bf3353d3d7b87b1cf48a07a5ab3f905b88", - "3f1ade110077f8539de850f6dc2fb3267a1ae3db4d0491b4dfbfe640bb42ccc7", - "642dd7b6ad501731cd677b3caba6044a9a9c8d7abb1eaf974d6f9a1dd3bb1628", - "20ec22a22ca7acc073347c94066e37f214f269cbaa88fbcc573e276e69741e54", - "4ef47bf2b9d36af657af55983985a54be2032bd6a8a00e9169298f8348b6f7e1", - "43f826b3df17001ba9239185dedb9afb2bd2af790d4b05c16277cadea1e27228", - "1e9dc63643d05946c7c2fb9d95556bffdf8b74224ba7f9cec2ce3abbd2b94504", - "00156e961fc0d8f33d33dfc8a5f17d70e48ae190fc923220dfd422c230174bad", - "24a2cb66fedeed46701aeb97b87b2acd1c44f47291d7a55e17425cbc86de339e", - "b687c09a240ee121d8eebcb34e5436413b8454bec97243606fca229ffe899bb6", - "b71df3c78e4545222c9c99a0820dc8a0211015ccb4eae22d273c6e3c0713c1d6", - "aa2df75fc38f60141a88a4b46aefc7200cb8ef29728b09e483d336401eeea6cf", - "7b0de3f11dbcb1a59719405e539653d019e890d9d5a9972b579b5ee7a5cc70fa", - "eed8d4a29952ef71a8e7373ac1df74883f13a05e14bb887525e778d9f82267eb", - "9919570ce646b09da9ce671dab9d783f918a3d42c34154c68d0db3531a87aee5", - "51779be995b9c294025287dce02576bc79ff78f72ff8d4c76097df02936e25a3", - "75cbffa493bab88f2928ce91f50ffbf8f58c01bb1d6c68a5bba2e79cff57066c", - "1c2928db687100abae9eef23673356d99905f2d47f1f21a9f0cb28c2b5d01482", - "ffd4bdae3bc19cb2353b5a6f4e582ba0f111264dca3f475f05568ea783910326", - "851076ea27196d04875938be4660fab8f2284ddcba7ee156776347a123769a37", - "c968bcad478d0030e5cb072781f3b28d398cffad655cd10d35287963d290c277", - "cce4a2b91beadd5adaa16f757734fc2afbbe41b28afa221d8ad86086888de6d8", - "e0d313070249dd404f90a366a41cf42c49d9767d289c2b3f899b571790a33544", - "e3cdc8c43bf43b0a46e4728d4950a2423168f7b1e0797cf6b16d71d5c39eb9a6", - "166a86b8fe09cd117acadc7a4035b8f3aa1b24f749212899fa0e5a2f7b523f00", - "ff8abbc48b3f5a032f473506ccd3108a8faa80edee70025fa07737e996980fb7", - "428442ac96eed3f0bb3e7be757bf192c0ec5b604050193add45a2bf1544cb5a7", - "c26426deafcecef57e1cc716e75676e74742baa9aaeb8042a57221d4398618f1", - "63caf8b1e1d9cdfa7f0e14a40a94499158d36bf4aebbfaddca80df4692c07a61", - "371e0f3000c52484227faa07ff2110ef316c203c0e6c5daae0d28e0792e0adb1", - "008c1b2e5f55de6136c7a939b9be06d31d0925065bc16ecf0e5ad11ba11e6a88", - "d4affe57bb2ed1dc7e2bcaca56a595d86f9b3242da01a53b1df5faf7489fe885", - "d02eee546d3a5aaac30c427a38d3ce0db94092fd9027d5e710e38a8594dc936e", - "97eb5d74675a1f4470cd184cf4ac878d866e90563c8a55562509b2cb27ce60b4", - "320f553b85ded2ca8956aa3b2b18fa15f6fd6f7cd42ebf82a2d53d847bf81471", - "fdf84d5be215bbbab1046f8f9dacb1e5ed293ce09a585f15670161ff3b0eea81", - "2930f90484bf7872b362f98a3d1ee56a280b4c47e83d4581a74fac4163a3d6dd", - "588ccfae660aceb7b0101c85707d1f150a41b9fbae2df935cdb17428044ca535", - "8f7f9a05d7be2dc31b77874dd9cb705a6870f4fb2dc1a88db7586f0bbfb8b1ae", - "3fa430f4ad2c78f59f428a9390aa0b639d28464151f09c3ff84f886c1cc3dc52", - "beb8d923b564f5b748bd717cd97ac9a805b78d4c008aad717e8da40b8ec0824f", - "03e603d40d49b6124737d5ff4af68d44b8a7fd527f92647be230b4fbc9078d1c", - "8e61d4f73914aa33f28d827f35076a0a24d4ad350d29dd6f553914dc0faf262a", - "4df69b444ecadc63fde8305fe1d9266360070c2ff90994044c1a4f8b8a14b6f6", - "77c68a3123f1649918c95e633cb86df3ac478feeec5a306c6c9608a6212a03c2", - "2f093f81060b59655f47384378371a19c3be341b7e20abbc93a69ba931db4438", - "838a012ca882ef57b81af867f33599b3ed59fc73c69ffed813c706fcc7736010", - "2c942b82dd600569767aec90bb213871cc7a64e7bbc63352497216316d1d477f", - "a9bbe1106a5939d00b3479cd6051076c75391280f99c4c2b90dd4cb89aac57b2", - "425a2afad7076c8e74358d8b304dde288cdbaa148487c8a014648481c7d5c44a", - "f683af0673790b5b56154322d30495eac700356eeed46343e6267dda0b0dc338", - "287097152017369c8113833cacd9859900266e479d57fc041489cea737322a2d", - "83f8ec9bf88f6a1d374096bef4d0f7e0697e27f863d13afb75246a2144c516c4", - "a1a1a2391a7037e1b5b37b0089cf599033a20e15e957afd5b815f2be3fdb57cc", - "51455bcd78f2cccccaedfc7bc68dd6e5c3da36e1b3305f0b82374ced47b36a99", - "2f88ffbe093a9a5b879162becfa61b1e7d65bb1ef7359339017a76283f9af78b", - "3f7da355c91b1989ea6c6ca2637a939a3d907cd78fc77f0d6c0c22bbf6fa027d", - "e18e5bf1dda2d28c95379a22ca10dad51e196aae98d73f58a04cf592f35b5e71", - "416977418ca238f0ec38b9fa54fc79b9769eb9921f56d9ceeada626e8f122591", - "4ff0f956afd41aede849c1c408d2d60942b6f57d1042371c92541b935b4f5a77", - "2018a09be6a65c5057c0cc49ee3618db574941ce26e5c39fabf407a4f19ff579", - "f8b5309b7df2aad7013a9a1998fb6d0723b7be628ef8a7fd3fbcaf1126bdc392", - "5715d63c0ce19ce77b120707d96dac617f033150421666dfe87ec3c0831f647f", - "37b3c359138a3f93cd5edf236dc55fe26f9fb0cbc99a9adf86995367f37b5155", - "3834f3d62a52affd9f8a1d5c9a63453f7fd433267382fda54b57669b0be91e5a", - "0cc82eff538e3dd95bd4d09fff99a9da385313bfdbc1b60004e8ffd36821a073", - "a6cde0296e6e76ba88610be2fc370ed4f01fdcc57078aff63809fc31a1bb0921", - "b680460b24d135f693f5b4caa707021a8691245866d1eca2d78bf818404ab32d", - "8909c4fb10dad827e8a529d16e9a64399a7d45d2dabbd25f7fb1930a62a46d79", - "3fd682ec49bd1907da3faab9b152b6b94e0136b10d20cbb2190207c361a9ac51", - "5ac013ac165c62213d22f341c82184d408bade9dc64c298ad74a7983bfee4e5f", - "b0497ffe73ad10b616ca3564543ba45e96c35c30ecce614e8c495a7638affba9", - "7e4638aae235494edf24a913a84a7d8158001506bd4480649650f337098c52fe", - "41e69226189d68cfed9931fa78c7b04fdb0dec7a435bfa0d66d9464c1d67d99f", - "78c2ae406211201d1b94020cce35365adda74c9cbec6d85bd680aba1b6e1ede0", - "03936a5406eb18f932c8bd7a1ef8259b0f5fea6532d044ec8ec405a72227219e", - "ca3325ecd954ba58ebe6ab072fbf75f6b197a57d6bbcb0462d20cbe5b0eb3210", - "15eff0f0b48a8a64a383b42696a176001f130b668a34453e8db180a65e781a99", - "c7bae546367ec25861f1a4198a49af58ecc9ea58027b0f8d0e473bc2ba4d67fd", - "a9e1884c91225a2fe263072f8cb8dc83331da40956c0073eec6b782b8fbf9cbc", - "88dfaadea3582d7e037abf1a7f4ea945b71c2a675c0355ce87eddfde8450ca37", - "79faad0b31ff9d531761e7ed8be6eb037074cbf86d510160fd2aa4844769c770", - "daf5265031e5d4c9b5111fe0f859e06c9ae0a7446f3730e1d9255dfb35dfb515", - "c7058b2627582549a1ef7034eca1c21745f9f76852685f652c9e9bed30029d34", - "c352798c72b42482e69ff86a6812cde1996ba4d2a932f7e810f56ce14d427cb2", - "74bfdca045cf3b278ea74be93118ffe7f70a867266849d51fd53da8ee79ad53f", - "cdf40b15c28d35035102a43d8669ebb17cf34af8164a505e67b8122cba66146f", - "4c9613f55e416a719432ce959d71674d6fee27fa76378661ac4a58d02fe7fd56", - "fb9bb350cea2b43d9beab2e954590d716d3b82b8f989ff2ea03432f7cd564cc1", - "2d2b8dc665fcc9eabb3798e7c717e2322c5d485e228e6509b3550e3805998710", - "eacc584a3bc08dd5608ccab2bcd7384e36340472ee6cce7c69e4a88f9be93f43", - "8e0ad221069dff610db971a9a3473c095534c12027d7721636bb251aea8592af", - "dcdd95841be0a33d44d4580a940967fdfdc6e80dcdeee7792994a84ccbb0991a", - "f1d844cc9a6a43c7487a4f3966c039871ff1fb2bdd5d3f093ec79e701065911a", - "006309a9884ea9f113e7421e6412740318f5c65614a3dfc53cd6aa8f5a9fcc70", - "5ed64d0497e6d7263eebec79210041141f63e783db7024539e10e4e132beeaac", - "f5fcd2c18b58122d9711a81cc4008ad76b619a3a156ab307e0536d953f60d059", - "83ff499d76ffd610ccf48930b616cc3f4daad52765e6e0a1169848301ca7b471", - "1acd1b9af587e1b9a0583519bdf4d7cecc77f8faf69d010f780591a271cb51c1", - "1d089addf1f1e8113dd75e9908e5a7e3a519828bbfbc50ba7e45306c8b56c679", - "83b497d4e619f29fe48ee8c47dbb07cab0987b0128be2764f5de04b10f4ef5b0", - "3910c2096ed03e37c77aac541763cab8c69df14479405cbbdece59b3f15f2cc2", - "c1e68f99d5a22612c33ffea074dbce48dcef743fea68acfba032b543a71c115c", - "c3e416a190c8e7346d4a25e8d7efa03a7ed0750a4cdf15fd86de6619b25b20a4", - "ad162136d4a78b26281a3ff67e039739e06be257e347e38c1bfab1958307245e", - "39cca91bed4d7513e037a9deef556a6b489ce99c23ef5844e31bc85e25b98efb", - "644f8aea429a26c6505d4e00075fb6447473461953e4cbade60008eb78803c29", - "8329f9e23ae6ecbb8fe44633dd9bba45be25988fc873c174a3b8d6da56c49f44", - "b5001f0e148cbc891ba33ac9ed22ed8aea34b86e1f6e8edc8e9428c39eacde12", - "63ccbc0613fba4e633f59664aaa1a63be57bf036103d0035ae0a4d72fade951e", - "b51d5e835647826dacf7b6c127b2c738f9cfba7c649482d0c73b7ed4c08a225a", - "4cbe152debdbe949073e3073b66ee5798f62ca1aa624689758c49aa0326d3173", - "da4c2d1ba04e73783fa9399f77c80679c0c799a5cb83447667e290e9d45b3314", - "18abfaa4a927b23c1a07b7a0db15ff9e79b8bca99f13a3e75641d46d214b7732", - "1acfc1fab58a85668b5aa9899f387c251bbd77d2530d14d50cdc48e565da3f3f", - "ec3ad1b0106d94b089b99b980a95b4027ba00c927be6f1ac34374deacc42934d", - "b5eb9832cb5454aad5361a18b86ff1b9f9b8865db8d1846122619b1c8176ab20", - "dc0cf578df2ebdcbe8360485fc1554d408f57683ec6b4d5865bc4292b47f3d64", - "4f274a33143bf2c5cee5f7564fe5abf1787a7d38f2366c9c308b0a6b7abd534f", - "a73eca0c4dabcc8a17efdfd9c48fce83d815a3b337a7d699db2a3d2e388126b0", - "d8c83bb0fbe72bbe453d12b451d4275f3a94155153328e726611f52f2223ff8f", - "258f19a563a7ae9a4c1bd17bc520021c167f9ce4c4be4542581447c51678fa74", - "4c68ed9cc7566982f7938d31697e22b71f2bc3a3a384b5d7307104b458175227", - "5d748a04600905f49e2c197750740dc44c613a6ed7bc7a390ef3e5db219d3dbf", - "5c2940218fbe196b6ca277fb10fc406f5ee2375467e0123d0ba2f4220d6c882a", - "b806d70271fedd1e816faa4281692233bd5c97acdd4c38d58c78e95790a78590", - "652c93445657e430996c421ffde21ebe24fc0abb27285d1ceb2ac66442f28bb8", - "acb7080505445f800e631c3791e76c05662fd788e7d2a90262c4f299a213f595", - "4fafb7cd8be87c1f42470e76b83447805a06ffb3c6201698528196daac3c2c7d", - "4355b3ceebb6d2de9322399271883ddbd90dd78e372a8ec9aab62afcd91dca61", - "f6776e461663d4128f59038e86b0d4d8fa25852decdbe31a6faf77400c5accbd", - "0143877303b00370e8022e726be33069f87caefff4dcf32b41e51122ba71743b", - "6c1e85cc8f968a8d53b10dbe896f882ac216471559d00bd8c4802f4acab0ed5a", - "815af8eeb1818bd2ce7664e82770a8529f366b7be4d6f61251e1478214f6e440", - "f9a5bbe9504824cd16daeb4a0183d2aa4d45bf2310427d901ce42958db057c1d", - "1824ebc3f637ab8444f4cfb33c8d49a0804b276b290e9ccbbab82c437a18106d", - "78538a42b88e6ace68bb61f41e296e603070691ea9a0babb476e8255d397c354", - "58122a565802c78b9f95b9498498e2f1735c560b24cde71edbf8a805334316dd", - "bb7378f3cee8b17d4de50897d418a2bbeddba9c92b30272b8252b2e4698b50c8", - "527e524361894190fbd4d15fefa583060a060a875d6f3ec25e01e1324a79931c", - "1070b4326710ca8599a811ef19b07206620a9d6bf8cd8f946f6471f9ea08e451", - "2c785a3a49f45b3a60fd9c48357fbd557ebd3d4d4d3ad3ecba8d327d2b42a703", - "c601c270e56729bd82521d081b20873c13e0b60e9eeb768eaa48240159d9a692", - "7090363b6fdadd32f34a432ab4be4846608eca7b3916eddd4a9988b5f8ecafd0", - "0b96fc1971d95f81d83d3b55002e05da24842163d6167d204f0a8b05822d47a4", - "3c43f2eab688f475c0eadde0a8b940137994f2d7a4460886c249d781c31ff92a", - "6fb0b14f32ab752e52a522bfb3d15abe963e1a0fccf96929612b241c232670eb", - "5ded393f978fb0ce0aac37631d5b084594bf2187670b1fb67c864e44c15aea11", - "d1216eed5767ea83fce59f6c6dc10bd2013baf42dcf9346c14c0f186fa7cfee3", - "0dc573552b681668bd5b9779e403035ee3e0b81faa8f92a072924e2c9ce2dccd", - "fe419f20abda052052dbad7161af13e6bb26967f5f826ea287975fe0e56671fb", - "8ecaa9536b7b534e55b2ed52992c3345a016f44c95716ffc76c5a27b93276bd0", - "3d72e1457c21c69922d4a940056ba94f0ad90e6b7f151036fa024f0aef9f65ef", - "479544fbaf9179a7cd1cd94ac382219badf0457391c75dd5304c8aacb1a909c2", - "bfe801cdca090e0bc07f6a1d68bc8e17ef7b5ff8957f985778a6c90dffdc3fcc", - "0d74e97fdac16a6851fd698e244b0dc1397ac94d2247e6517a59494c7b5fcc6b", - "84e616d684e6dd67c48e52afd392e0688de594aa620464971d39407680b37b7b", - "ec1a561fb06a23bc8f345e3e1ba84337053ac2a5a13db8c339ddd767f392fd1f", - "f70e3d121d3cd1444876d16bfd39eb97bbdc54313a27ca490743ba8cfef412a0", - "5ebc980ffaa0257c6d31a14be21a7991664a7cb79fa88e71c245cb917c0ead90", - "8524d754902bde2719e64b584f3b44d995a4e15fdfef2c4a3571047507eeea42", - "e2482568006cf3cead9379a3085b3ed45f40aeae4831e97d2d2ec4b75e0ebdae", - "c9cf92aba7d894c748d4cbcaa5b2bb9e71c764924c4683b3bb6340237d9ea8ef", - "a4083d2c6462678f3143e58a22c10b3d405b198b1e4328212d0eff85edf2deaa", - "9bf302800b12623d0ba3913cf8c7092a3669c681daa26fe26cc6ad1bd2ef8ca7", - "46a7a022e05a6262d769f79be82eb42ddbe2cc6bb13411a5804e06d84399b2d2", - "cf70006726399cb9f52d1b0592a5e3aca0044ce8f298d6b3a900395fab8e5c03", - "0f3009988af4e48efed3b67ffa779607e3431b55a0389175fd0a511193478d2b", - "424d2cab1fa665e4219ac8d907a46a5a1bf9170af5629ce229f99e3c2b348677", - "5afe37549300f76c9dd5e37d5ac07b0c2024962bdc7344e0e81d58f2112de482", - "87e49f39b3c840280f6d0f5ef6dd1411e518d4c1222f93e56f0ce615f91a0be0", - "7c423dde5df670dee69dcbacb1f2c34b58ad00f9e8e9deb735caceb2eda86ca9", - "3899727c15f85ad1997a56cd7222ab43fd88c7a3a831b00eebc779b669c678e9", - "668ddb0170ac4748c04c67ab2d35344873a7f214e0b158563909e29cd6a93954", - "467047ed80670b5e08bb43b4177ad8a770b2d6e407733bbaeed29fad32f06a6e", - "a60cbf3dce64c826104d12d1b4a5f02ea50741b63778e28481bda243b710371d", - "ba75d97785f81253afb7511c3623dc950a254e42214f9c59a8a81530e98300f2", - "25c285e0cb8ff4169bb78f8b8b699f7414ba3c4738e7545857350a2b09e45497", - "4c7ab0e47e52195d2abc9ce0ccfd279ab62ef3addb5b33dc29ff5cf1936b8d88", - "3a691a3d2c1c3c7ac02949a4e3012b69e339f2e15f960a464a37cdf06042cddd", - "fbb9305e1c8916cd06e09e385b90e7e948f80675d215d9ff3ae1c05bdcf18f54", - "4924490d30bdbfe88469ff4e3727eaba014363ad70d833cd56aef7721bea38d8", - "6030d373e6ecf3ba3a8f847da3dfcf51d5022b652f96add0c74ac0cc779444f4", - "b8698f45265ee7acc588f8a52fcb4ec9634dd33ac04dacf4a34d7a6ae7ba607a", - "91cde02c42b47412675106e1c40792bae78e68df9d1245d7ce2ff8c2aa1be41a", - "b993c4d5039c7010a1e9a4f335d9f9fcc47dd4325500cbac9c68e9f8ef982933", - "9282e50a79a54b43e95999d62abcaec40a9b3e7eeb0af602c301473b07be1a31", - "b9a9c7cb8bd9129e7459ce4cbbfb2f23d6d40fe059e47f8ae288cb2d79cf6fae", - "a9bb15346e9f0f891936d0950ab051003323ce3f0fced9a487db9dc7be281fcf", - "24d44a6382a78e3305d850484e18e9b961ca5663ef59b9123e9598e08624b20c", - "2041785315ee46140e6076706391e760385986e1c32c418f35a7756974d6ef4a", - "6df1d94fda556f3466a0c7a645a4efa48fe05b4b0401ef7f936f6c6b8f0aa8d6", - "d625fedf64395d5abc0a3fd9ce981dc0e7f809c83201622f0b850628585753ad", - "54a5d7f0e05e93b7912657a738ab5ea844f36a841f940ef4a6c1200d5674f3c7", - "31ea5334dc8fb949a043307faeccdd3532e2d91dc357bf34651cd398584261f2", - "ed8f5163cfee6da7b019fdbfc69f699ee3c24b8cf411c8ff20c6146977e4b078", - "6bad4161c692edbb99d05140fb3c6cc1bf2849dab13b19b23644578b806b88fb", - "032a63be68cdc47b85e74a4ebf9659af09a9225c1e0aaa77315b444bff2e4026", - "30276c0ae63f5881383bfd45e8c09e7bac865fbc0ef0cf60de07da2c99518b46", - "c15f3a981ba0557fdd20291aeea6bb33b9fd665970b1ba5a63e2dcf4abdd0de8", - "7ab082ba12f779734d63b58204f5b72b35b3eaa95a636e2ea03da56eaaceab65", - "0448edafcd0db9a5775b787742441f40d7614738ba1087b104b85ee94bda5db4", - "c7086e159a479700fa2615de7e0ef67fd749ccbc6a2caa0da39eadb3ee28950f", - "b58a4cd7dc1530db5299161305b36037342b0464f088782373f03b2907ef5d90", - "c9e862585c00696f084f07584a01cf38209689147cbe0bcb5984d8efe6c3a6a1", - "3755e85f1a637e47d5aedc2ed8ad72872fcfabd23e9acf619c6c6943dcc61830", - "064d90fb70ce9aabb3db50bf7964491628e868de63758a4d7e35a6765995f260", - "f6fb8009aac1f2e0613edce0ec8b0fea1439a531b4b7d3012285d445da68ac5c", - "51e90b020fc5e9f461e2aff82bec75dccf7a7154a1c2bda2af02653a2fc0f9da", - "0219242ff1f5c6f752ba3bfdedcb320861f24f45877fa389cfd64d03bef436fb", - "d1b72e5db6292f265ea28f70367fc4ddb0002aa10ebdd8e264b7f4e8d7c2325c", - "8876de2bfe0301a14603298ec0996848d2461758c404172e458601263f60202d", - "f07cff6a38ec102090f4789292b57d476bbc88f28863303413cd0218669f9136", - "94c4413269fbaa4e8ae0c291a068cb16886aa70edd2d9b23749e9403e7c747a1", - "2073be8a0d32ab72ce2b16a0b56f9e76ff2afc7dfd5aa25dd052090ae2d2bd9a", - "4c69e08cf024670d7fa2a0e90c15b4e170c95efda29a64d34df12ec2367afd50", - "d0d09c9ba87bcea55e10c25b7b5cd764c6e0140b48edc60b7c0811f4b7893285", - "9512d3a81877a294d5786480d8c9ca0ebc6133fe25dc791fd70c59de204683ba", - "e48eb3421cb9ef02f35584a7a0e9dae1baa363904cc7083ff76757e380e5cb27", - "87e2cfd440e06f199a6d2a22be779a1a8d5d1aecc04ad5cb1f8dcdcba5d8cc35", - "f9cab3d64c57e065fb97f4595d4bfe65a28424a0ee0478604a0be3d81db659fc", - "c2a698fbdae86edeb89fe2d911071a8fb203e4046fc7b65c61bc60fcc6e9d7b8", - "6935c2f76552a39c33e468542dae07d7e7a778ef9fa1367257430c6754898052", - "cb47af9c67b9ec287d7640bd663626c6961d5141bb09b11083b8fe69562622eb", - "6c3484a47ee4979577192f3c202ce6d5e9753d2c3785496fbbdc8ac4a7cd6edf", - "ac40917c2ae31bef3c32f421169ea9827b895b128f94c871765a782783285769", - "34ae50fbb783b46b06d49109406cc79e22753e13cc21259087528b9fe8d778f3", - "79c734abddfdcb5f715b70e1d32783f42ffeccb0c708e8903177164e346c0f89", - "5a5418dc117b2adc8268d7fb6f31be079382c71fba1ae12e71e874babc1705fd", - "f06bc6e6306bcaa3f674a535f767445ef221c64372355156a6b2642e6389a241", - "33d04bb993e33624fdb19f3e748d30a61885d99cb30a12284fcc883a7dd78b37", - "bf07f2f5f5f069b1694acc008e22907999d5db343b01205eda066c195b02aa21", - "32786e04197be296f21278c7bceb0b9f5b7af94322121e20ddf8a2a0117055a0", - "4e003e902cc1723d76b450d97609efa31b63308b9a4995e0e61dd1369b612cb6", - "96a345a287ce688028ef2c8e0708c24949fe3a651ea573fa8f2648140df31a7c", - "57452766901bafd6ee86de2cd3b349bfad1f866f467ef02a50ff1af238c326aa", - "4cb025d91b07d1b1f1fa667f9d365d6ebf1f368987e9234e5eee00dc91f7215e", - "320981f4e549470051582348bbdee179855b0707d58d7e07f23d58b87aa78ed3", - "667cbc8118c15a380b64512c7f0b8a24b3908e8f26dcea2e9e424ebbf7780e51", - "dbc4e9ead06de42a920129fba54d8e209d2519534d89677177be230b231779d1", - "d54c834d6ba3873ab71f779eba87e830f9e8c77ea12e9f4f2e3538851736156b", - "3406e82bf2403340c87953ec6f71516546e15945786a7b5a25f14b1886e384e7", - "10e3e3c43103f905a090c2fd0048c4a1d89a5e2e0bc4edef2c5a71a0f9b50811", - "7d7bb72e980be7e8852e97ed679c99420131f02b94d18da86c68eb486785ea21", - "456b90c896a84bc6df8001cd008dfa974e24367d438300ff61d6744aeb6c07a3", - "5a13a8e97809fa18a28bd4906612504bc59fc97138522c3185764f076fa8f604", - "092783fa75cfcebb60a98ecf60051d76140e2c06d6c45f7205114f6ec0d45bdf", - "988b1061e743577e7934a8d81780df7acfbe9f93407915a8fd56f93e7651eae7", - "390768e800aadf1ed649a3b12f742f099ad00a8247cfc84332f441446e072c3a", - "b89043f1bfcab0ed647f1ad0f54708c304cecd200f83791118cb401c53053e34", - "721fdc62c855ab38cabd47aa87983d38a9cd06eab590a2b96c8b6566d7356b38", - "436bf21bf9adb909d4ef0c35237b09e3710263822959ffed468ad56aab05077e", - "cf92f3589526dc18bcbe4e4f838b2454d1ba677b4cf1d70603da827a08eb61cd", - "af6f6a52450805ebd68317c680acb5a4bb30f4c39ec992111210e9194ad34310", - "d9c5ae902bf74bae5b99449d4a269c1297b838c8bf0cc91d16a50e709962d771", - "4433afd5a22cebb2f71c09032f513fd1e4ef2e86fb772bc809503ae28689c441", - "45b1fdea2f0b676b9639dfa2abc336f286e4a8dcbba51a1fe702c9017a8dc03a", - "2f5bd9acde23dcb86f84ca77969b00a710b1bc4deb780a4bd4b54de9b0b6e7b5", - "d6ceae015927bf811464e44e58dd93a808122ad0a6f0484a1c6597b75a1319e7", - "57fd8f9bad2687541cb2d8d4a9912b8047cfe81248441d1c559945bc542161e1", - "aefa4943c7cc6ffea0077c5d692225b3b32663ca428969f50647f874783b6409", - "e93e596ada24c298da1eed6db55f8f798ee0c852793aebfa40beb9f1b7b4a45b", - "9471c859bb391dd767cc1e3524e3c1fb61b0e9aa2dc2c95fd5d120660016eb98", - "64d40fa62858bf2bfe72da835f400ca260a18ea12891f1acc0b57e42479975b9", - "349f06ad2d558df242d43a9f39444e2fdd2fb482510aa62ca10a9d7d431eebac", - "76cb6be5a7bad4b68be26eda936bca9b20c457415e8cd278f655d24484a83249", - "b004663e5654f1d061e064fbebbaf484eb34e6add3b64e7615f80274a7d8dbaa", - "48b03d4598a78186bb5c4709cd3905a7a7f62ad179ad0ebc8fc226b2ce21ea9b", - "0e72baf43b2731d73ad242663c82c3dc02ac1913affd326a7a996577b5044c6e", - "9ca73bd9aa4754aa637eb9acb1b1a2526c648b4355f2250f33a44e7bbcae4698", - "2c8b1e7e27a8d6edbd5bcb30f3fd995dcc0dbca3c0e57d0e53fae9f01a67f841", - "2dfa7d6a6d4b79bd4053e1066eacf5c5682ebcdafb397b6b6f0630d03241f29d", - "c8c56f2f3a9892ab9b047aa05ad188e151e6ff9f87e6554ae574bb3b64636f57", - "0a503580971bf5f550f1038837e0a025aa8b2a5707f7f4619407c91ea5973fde", - "412a77a8794d942bfc281bca4a5fa95643096d906208d023b77feac30099dc75", - "9e99ff4ad2680120790e8390649a8a68b6ac2507622b06c07b06e40d36938537", - "5e1a52437b0ca266b259e21ea7bdcd091f5b87663c659e18589de1dee64dfa6e", - "964a171e4342320a59aac2a251150ca75786e5140fd6dc3f3fdd5cbb3a92cd7d", - "969849f72eec7e3cc2c404c4cc69bf7966f2a860b42e371abebb1f66a646d68a", - "18e71481857125ee6b04c152aeedec6b7a02d20ea278a1dda72a664051c3cd0a", - "11f5ae55a198e85e01825880aa269db3eda0ebb2cbda64db727141d5e3888a3c", - "a2cd66721afd9845883cd7c65ed52ae3c8ab4e822fe6c966b538aa1354506889", - "fa89f4a3dde066d6924835c204f286414b937205c078ab3ae3afb548858f1a60", - "6729dafe133b689f65cc1fec81cb65e66b9db477ba64e3c9464468a087d4b6c9", - "ecdc2aecae33052533980e3be6e09a18f7d783346114a55ed1e270aecc6bd72b", - "4ba6a8e056c88ce0f7fc4b0740aee29a629282fd53af7484d5f4497fcd8822db", - "39629f780c61c7268d5016f7f27668840c0c7a72bf5027a0b29c5815d22ed572", - "72abf881d0cdc9294b5b21528a2325dea225bffd6267349f77f2583e2c3e6f8c", - "b4c6bf702618b612d36c79e97caea623774091a219d42c3bf42646b7275e7a4b", - "ee439b417befc656c52ebb675d0be8b697c3c4f4fbad7044a450b6477e886366", - "47c03772bbe4d19bfb77bb74f3ea36fd5213a4d1f200dc4b82f7ba12f0b63e4c", - "834c382386dd0fce5c91724a2454fafd54abc0dca13fe3119031a688dc1425ee", - "235aebc669301edd6ea9ae515df61a8c896d046746319d52ebb17f53ad56d325", - "17855e5b0d23d95aa8962c916091c6d107ffa6d16980450ab120e8aa1cf2e0dd", - "845ccda067e0958dcd4b9e06c1cb2c42a526985368f78e91f4584ed8887157ad", - "23c84371cd64936efa72eed0ee61903435495c88fe806c713bfe6e81d26ea960", - "3e782cbe1c6b1f6f8e3a9d653e3449be23d5902cf6d295b4e17970758837ba41", - "0840424c2f717bad599924bd5d7cd3c9520ea51e7dea12cc1b8a5e2a572698d9", - "9d65f9ece1d43d2e10976860f4c21ce1ff391a85253ae48757e33a07a556683b", - "0c5eae1637eab6cd404f76494a21beb2f5e1bb1148a2985e710bc71c22411d5c", - "40e7d8a09113539cd51995254aa039c7f071c6c40b3fd7892a828595e9f99f16", - "23f7b10d0051c5d08b0024fbdd7e179c16152b3166ae39493762e4f2d1bf6545", - "47fd8e91203815d319809f30f775cedc379b701e091162e3f39d05c7bc516419", - "613cfef09934d4640c91058fd3c9e125458e627e1d1aa828857deb2b4184ba0a", - "6244a28e3605484b361b95e1af7f20a562b76adea2ceda4b230833ee9708984a", - "e511801ea46d04f739c2b2b01e70a3133c7ed6b791d9a74b78c78d7a1417be71", - "1cb76116ec088701829ff2b912e5ab2fca8a4ccbb08602459e36b356daa8e6c6", - "27c749f8b9aa660ffe4e81cdbc8b9d8273f30ddb16e481795fc6d8836484ea27", - "d33034e042ef5eb58773f37129eceed912b7e0725142e4c67a3573da68a3180b", - "b22549ee3866df19206c3c5935398f0d1eec1a8c445e16a221bea65b29d56353", - "5761997271dfe10e4d125da010196b819f6cc06debf8fafcffd0ce23b9157aba", - "5fc23dc93f4c6c22b0f516cfe76e617854cc72d5fd6290e8a56858ed0331d837", - "d26c0291b782732362956520f3b74ab249258a7ab88f47ef6b7e26f0f95e8116", - "613e1d23fa2a7c097dc698a088b1424c4290f8294bfe6d8349d17ede4fd393ec", - "5aa43eb092c6181824fe7e9eb61b442741cee72a97a1a47e646cd5100129012e", - "77153945963bb9e5b4b58424f73bd0102f127a2e5ade30f140ccd01ca9d06688", - "04eefd10e066da997932886c0c3678bf2ddb9288f09cefb8b8dd9ba7b41f0dff", - "e52bcf771658335137760f0a0bcdd6f09849415abcf0e49a311a6f00042e179c", - "31d1c634c887654c8118c9bbbe2ad2294dcd2ec4b3564a6b51ca16e268f559de", - "99f75a42c06e82d524fd9fb60e72656c9a92102bd164d6c95869bf79649ea322", - "40417c311609b26309b5bf7f16a9745838ee1920761cbd9d8d2bf1270587911f", - "c2eeace8ff233a08bc03b0b5f8675c665700561f5d3991dd06b87f4132135834", - "643f3d7de312c84b96d3d3e12a35a7acae307b6d93080918d324723d8a403389", - "80df5870cc0c0853c5bd330989dfa97ac78e14bec8358742db36ba8cdb8b3a04", - "4fbc022fc2c5f9472096e105deaaac8f4c4c1b8a53aa9bfcbe69586c92fc4353", - "68f9e8a18c4959f2c0f56d57a621d8c6cd42568ad763a8203306c4ba42e69fcc", - "13de538f53d4054579e28799c379e1e6a6ee7dbdb87120e7298a0580e6e2a54a", - "6a7589639ecf942e89b2b075e805551c292bb950bfc506054bd134c18fbe74f9", - "db83c861475205ca724ac2b52c455b4f086300fdaaa6b6cd81a849af14f78f43", - "91587e5bb843619eb2ccb92fa41228598154782ada814dff9ce87710afb521e5", - "15cabf089498bfc820650a478313f46d8b2bee133167b3442f752aced85c9770", - "f9f07f260ca5f30d4a910d9c5842dce444bc98a488e65d6eb2ed0c12dc5801e0", - "ddf6f16f3e480021331e09dcb20549c930d2d9421829cb982203c3029534c298", - "6bc8f02f3eae28818285a2d4db5648d6f3e203e80b97f3686146da30f8bbddee", - "b6c133ca548f5796481bba94962db247331eedebfdf6edb3d7dfe5b6cfcdaf0d", - "a4eca17d32fd299f4f1d37bf79bb0fb6531cd0083536b38a7fbe742d3fc890a7", - "cfc4caaf707ed7567d46f0f01b476d91d2157ed05e899d0ed94231a8c709fcce", - "e12e93006ea1088d4101145d35144964b21a0a3ea52a80a9069bf2fa4c35c32f", - "87e9d978f15d818cabc754fa6c8e4bf31a9c57024704d7e1aee5186d40dc5e38", - "f08d6bb829d7b7bc13250b8e2c198e0dfbabae83a10d5a765af0775e2dc5bce9", - "8f6976b9bf7fd38af85de987762f3055ff698ce8baea4c389f120f91f616213d", - "2533c60a8c94e70958fc6587ce7cc542a48d6be6651015b4bf585be8ab5925c0", - "a9be242c2e091c22448a62c4b35b59fae171c4288429f2d98cfad85994955510", - "b0d0ace588089dd6f2281e3189ffdd05ebb26b65d6a70a6b91022d8103864141", - "70452d815080a663e274ace0dc3b54026dd28f31ed12688eb59cd194dcc62489", - "c824c5ad928f1ffa878f7ab941113f6010776049e7b161bfe4956ab6184b462e", - "51798cae12a2083a8ea7a60de5ddace293baf31ada0d83220d9351c680f9e7b5", - "c54fde31b44fa861c6ea4157d6829257653ad7178c2456f5c4572b473e85178f", - "aea2a3c3e04bcec031058c97bb8ba90d2e35279664bc7698044e6f2df0b7e398", - "590be6ae8eb8ffa589e689052bbe55b8209751f11300da6b69a0c48f54c82ca4", - "60bf61d5401169995d2d375182d2962b4b2326c7c82fd30687e5df3791d9c6e2", - "63ae3bdc0224430a76f7242f16780ce3a559a3b1b91585b9ed698152402a088d", - "fd30d8e0aac7e63bda17150447ee48d5e4a1a5a0349161a85f3418ecc14cc305", - "a8aa53bc3096c366515986a9cc5f533e61943cdfb2c27ab0fb188f44dcff8c56", - "6afcfe4a4dc020a2886552c9500dcb8130bceabe396b263eadad7f66e67e74fa", - "a8e28edc25eff8bfbf7e874d723263d9997dd9f1af0cc2d1a6f97d430a88dc6c", - "60ddbe59a977b11d622d5b8fdb400560e93d1ebd7108354855fa24a7dac9f4e2", - "0c57394dc1a1e62ca6904bdbac56e1aba3384fffa4d3600b6a27c34aa6143822", - "511ecae3af03090c89637186ce3e882d498d5484226c3fd26984b90dee687a1a", - "fb20fb63567ddfcb3381b9f580f73ca92bf84f1169b81a40ac1ee55f8f52e835", - "9635174319948cf401621a03b8aada31f89d21e659e18d984724ed3708ff287e", - "5f44e1688296782ec208f2ac313a70e44a6ccdb3040bceecf7f70d14a62b060c", - "bb83f8ab0ab6d178fb1c92f4fcf81bf03051b10e1ffbd35545af07991dc79e53", - "1349921bf7c3b83ad11f97a21b66f73b06ef65a2862181e2660476c9268a3074", - "6660db7e3bef0200866a8065baf2ebde3e2b3583d7d236e7aab289fad660a0e3", - "bdb1f58acbecc07d3ae9b2ced38f95bfb64ecdd1263bcf5f6aa9d28c1502d2a3", - "23f1712951c1e5ed15aa221dc3934c04ce7036a57ff9ed64cc8c2ff13b1191ff", - "8c5fc1783d0ea92329c0046067d53266b51820eb5e43c67e08df4ef7356ec018", - "830d70078b4caf6141a0bf5719011af5f83cb11984d776fa10cde9b174249c94", - "edbbb4e278f92ad92415d04436b0005b519e73001e62116283017effd23f1529", - "bb94d21470f4756a4ae181baaf5a01b3fb5e92cd5ae65cdcaa4f17e0ff37c1a1", - "ca6e0f383254395c78732f37252251f626d69e4e80f0c5200cbe8c234ef301b5", - "fb1e6a08ea730e55c2744d90dfff7c715de47a90320db6fe739ccb87ef321eb6", - "71237ca1a5defcab39d0172740179afc050c089a1d174bbcf567070b445f2131", - "c29b8408670a1784c4bf991f67392960789e51177c1e60c1dc4caaf362808896", - "37faf50ad134266304b119dc1011c2312a387e8a80b3d424102f4374093bfbe0", - "470b63108b140b4d042d93736bdb59e906f2e778c1ac786873ecdfd606cc4dd7", - "1fea92713517178931dceb642a76cca441fb61f188200551fa64c4a3bce418df", - "3e3b26f35e3fde18f6374e1d03549b83c752a1b75a6068aefbc8e9c87af8385a", - "5bf3e669d559d5731c43ba963fdee4a8d240d819319a362c380c4421a620450b", - "2a363c476cc5f087154888ed37aa70c2781230bbce767702f9b32fc394bad0bc", - "3e1f28ecb342faf2d4f98088929e088ac34fcc805aa1f607837a6dd17135a2a9", - "baf3aac25d71080f422baa2da7a49b5dad34245b30777e262d5ad0d5df714a0a", - "9321ae377e77b96b1e8752a5435712ffbc9c912a1d5ef77ec6f89a45ff02a4f9", - "9fe1d653751deccb9f3ad171deecb838e774c9e789fa5eb1a02adc39c0dd1638", - "068ebd4ad6b366365eec9794282b8d66b3f9c72e4a10f3c77f57d03f0d1122cb", - "47b803b8d450a164da602f473de7ad6037f1cd7f1d26c0a9157b8fafed3803db", - "ac3bd6458a94aecd891dccd01ea3527a70818cd1a7d97a514d1fe92670a9d77e", - "3eebadb926678686fac9ef5f934fca461637b1d66db2f3114209f9f052afa429", - "1b198d5d746ce3bdd256655cea4d6f2ebaa5836646b5cf09dd4019643559ec52", - "d455d9a040ccaf6771abb57b7316dff55f205714450214543863a79372a8ba73", - "178522e220ce472db949b29adfc8f1f409a7873982629ed7b7bf331b2157d6e5", - "9c9d6a1ffeaccae72d128f76b0d00a1aac4371876fda38f4503000354eeaa256", - "4f3866c3a472580e9974da34c6efefb8804bb0955d3df4dc2d54b4f024a96b38", - "fab918620db0125074ad7beef916a2a8ec1e7eb322847b95f7eac772d93d999d", - "9f53dd8000ad4d53c8ae6d83ca9940eb41298f659f7129a201351e74d2b50209", - "7d6da019d4ab33d55cc042ecb668b168748e53f9f704ee36caea10dd8b2a95f4", - "8c9e88156219bd67ee681699e06ef34321760a2209a5be37ceece5cb5c2400dd", - "5926d0f7cb0f3460a78f8af3b4dccf753202f5aaf3a0666feec8c8e972471e09", - "cc9f755544874ef387b95597c8107ce93d10b56a9038bb39a2030bb966255dd0", - "eaa58e99aabb3c526f9427cc9ebfb4d3f89e7ea5447156e9c0c3e743c01d6148", - "689c6baa0a45fa33da8a5e595439baadc452ef72c6dbd1cfc1c73675591e789e", - "c8a463902069a5eb5d69d54a5a847947a8353e6a233d7dc508a28bb8a745eea7", - "3345c44b4c2ba6dbab8e738ab14677cc4ad50d19e51a5c132189f96c963445ec", - "49da540edf898fcc8843ca5cbf2c6f1e0edf4b0a2f17b9bd9556d5d7ece1364f", - "378fb86e7d2cec594a46ce3cd7e8126db80b2d312978890538fbea58a849f24f", - "812ebae0d7f0bd236c495d2d42ab28e63bad825d6c485ed228c78f7537d827e0", - "4a42e20f75384495e533a4024d4bac69b72fb83b830f67de97a503f6114ff0a5", - "0082a4ec216b124501aabbc2f40d1b7aeb91113fea2084287c9ef94ef2aee1a8", - "b3a37f41b7f7f943c99ae917cead97babb5e661811101a553b4265d222b318f2", - "83d0134e67e8cacb13531af09f57c4a1394bb40cab576808327e5860937e4af8", - "804b739fc261810abd11a6821dfbf1f44af496b4c021e666e842c13293af5797", - "5506213fbae3d2ff129e3126b3a3909d1a59998c9c2baeca222a3315d2943b15", - "999ed4fd9fced306202217fcfbf5a896f7e754f24cd8898421e1fbcd54a0b167", - "ebcae58d6c665ddbdbb5fda25df400f7bc9c544fd79d7b404e9bd1a75501645e", - "cee9ed0e1508c2bc7eeb934d3eb0512392f68e4732a38d0530b33fdfae11b7af", - "e03071477d8564791567c6dd5cce37a26c265255cdbb41a347f5fe2a324aa480", - "06cdea37ef296424c84177a0f86f619857b2ce14bb67f57fcd69ab56646e8f80", - "f0695433e0a316010b6b9fef5ef0d4a630849fd49b1c5babc78726e294dfb415", - "26225be71286f08444ded3dd5bfb164cd5aad48bff3d64e83f3ad0f5825fbb45", - "bd53129602f679ecab273d37d626ff5ed229cfbf239de8b83d2b36fb1285217e", - "9335b0a7fee471cf52c03a1f0654590e00e8888e4320c25f8b963770ac53166e", - "7e0c4ff13cc0985808adf8d6eb562bf05186c89da6937177e0a472fef84c1197", - "af82ffe83fef57895fe61357d96b1c2eba411b2119c49a66e49e9480b24dac2b", - "82a19fb10440c417f2717fbb3af59e165e51f2eaaa68ea70a97970dd24d9d66c", - "189a6fefd9372a9e09b0d6b226e4dc97394e14d11533b6ac0fd79884f06b421b", - "fa21f1cda15b8fe4c017129d38e72b4bbbbe8f0032dbab08b4f7e15e8156d907", - "c401ea41fbf320db633f5bf6873b83134e2615fbd127f8ca1e09981e40c42e73", - "08fdfa82acb992ed3103696b019c176321f4b91a5e08554753720364d0890c19", - "023ee410c224ca1f6e8d9f9e852527b528a9c25f2e2f1bb2f083528365c4946d", - "2362ed4db0512c2c3ed922dbd47bf00637c63154130b72d9fbcc03115a55c71b", - "6a0734bfc16de76802d40a538c89916405a9d0a8aedcc822e8f48cf559577b86", - "1bb29c63f131cf1510d5d7f79e39968debdef8e1f40106957f2f9d137fadff02", - "f778493a18e031834fc468556f4920622d0d070d091ad528e3cceec2129a34cb", - "953f89ce65c28d778d7ba72617147c99ea1fea33df8b4c3ae26ddaed919f0242", - "f06eb098e6c3cca201ffe9a5ca1b9459a560c140a46eebc26ca9dd94aeb6f572", - "fa0281e5a52f321360654a44b8c47a298cdc8a235457408f73a6d5e74f9ea905", - "85ba6f9712d75c7c299c26b84a5551265380db4c1d1990be96df5486a0252b86", - "d43da4f81a8f679aa08c47ad3afb54506dd7b0acc57a1ab820e0203cdcd90bf1", - "4f46833d407fffae91c24de7f553a50b6ae0d0ff71d1c8644b1cc4960041659d", - "eafa8b4a0c17f5d339f0c9231c1dd4b03f008cb9263252f62180647e87c78e96", - "86b5146aeb18afc6fc70e622e95ce8f5981310deb29637b063d9dac9bae0d8f1", - "d73e1562ee53667e1b3b358f924e1c7a7136a9a53fc62ad78b86db20a1944809", - "b3083073731993d37af2840e921f5cb23c2321c4d682ccda23785cef8a9a1877", - "b1fcf512d81e6f7b9a39939db2f9fef9f7aaaac950936c4cb6098938a8fbdbac", - "bdd0592556ad2a2b0d5a4b60713692f6522ee3f19b7fa04e328c5f4653b5c3a0", - "2a4dedcd3e163c7fa3d35ee466d8481283e6806b33256a2f2b6f020f69073b24", - "8ffcae18d3e5dc2d93c3082042844d804e3ea3f6f749a6c23bd5dfa64aada780", - "b19a57f839c6e84cea7d2794e1795db22d8ad3a487a420e1c8c9f066cba996c8", - "676468445a530389070f55d0656c588fd3a5682b4e31b11454fab99fd1d35e58", - "7cb3295d87329cc9a2671fc0b28e15de89ded9ee0ea47e9b4012db8a6239b53c", - "df9ab84f0a1e8ea2b2e252e9df3fbac9247f55a5ee8d34bd8b7b978b2e3ef6e5", - "ec70a57f91708c5cff81a8f1514c5439f0e83bdafcdc63d0b13b93f55e65f952", - "bc43094ed7b0333fd823385fdc7a38d84af12d7b8be768947845cf752155ca16", - "1211e548d3b3db32af84d316fea0f5def2302c32ca89333633eabc7b4a3ec32a", - "1b9fdbbe535e5008411209502cc78d7cf5eec1ce3aaacbceb567cd6bd1c8431d", - "d9767c109d2f311e524e299b5dc83c8620fce191954f21232b545e45f4e99a20", - "8473e2c8f35193a7a86a27ccfb3bc909a74fe55589e60b1c86a591564b1d4e55", - "239d1fa4fe8718968e1b181f41afa630353b61be13a62506d6cd5c531015b1e7", - "0994975c93993081849c290a631b895101b870618585e82f7cf5c82bb2867ee0", - "62b49287ce4e52ee36bcef94620d056498eb5e16ec4582f378e5df3ed22c0310", - "1ad526b17b4c961bbaf8d15655f1c46f5e4d1e6689a847627f12e56d9a667691", - "b01b84ebb185dd5d4695de741b5a82e903ecf691b780db6a4015d7c9ec27ff95", - "2889174a0a8e991af980a251cb8633ef80e83439aed32310fb18454ddad37d72", - "fdc3074755910b4183b68a3b812110ceda7b604a1fb31f18178a5c4b17e08698", - "7dd39f2cda8b1444ce49cf1c28a2aa98c4481996450a75338a33bc8757766f2f", - "18fadc55c0d2ed9d0f259f358eda32f885fe20c9531a25896faaa738ceca4910", - "6eb08599c6c955475c65d41943aba26aa6e579a1061d511e0448a1bcbab4d6f5", - "8275604e9a44f36618072aed001f6666e3be573c49ab66def8a192b92aa2d4d8", - "65da6134b3a753ab1f5fe2fa6fde0b033b20c7132c15a66291afa42a3112018d", - "93e45af09dc33ceb0c3407752ae91ed6dbf7a0d3876d5e47517770fa8b664fc4", - "1fa4c0b7acb05c89f6fb61991e1fabc3313174cd4d1d568499ad1cd5cc513e74", - "f8429cf71de0075e70f2e062d70f59a844034fb179344772b6ea87924771b9e8", - "7c8adec37e8e40a52765e4bf5f9d29758f560c34af602e4e4e99c81c5f7dcccd", - "9840fb14d0ba7005fb6fd86f65923b4272a13ea96f8b45c45b618901c1d87fbb", - "a72c920ffcf5fc4813359f2c89bf3cbdd50d3c5a3557e2e8ab97f855904f292a", - "5d44ddbd972aeaaaeee43331683b3cd8d9966d27219e20eef7e7942e9caffc59", - "659fa15099c6100e4ecf6566bc29294ee8e69e6da0677a98f3592c955a2d5a99", - "1cff56e9dba8b934e92ebc09e8e924b1923deddeb868795569549407b5241195", - "abe3e3c46cf403c3bb2aa7ee34febd839cb84e0b7c8ee8f5ff53a2515ddd3c54", - "4fe6b1087025f51302148a941839ef1dc30dee17e09b789f6d733d3133c5a567", - "2cf6b21a82c46a079abd9c1a2fbdbe3fd69e9287cc14463a86ce85a5b23d1879", - "9281fec148b61099d98516357cdf5db428a0d516d7d6741fdab8ec39a22e52a7", - "18810fe77be2caaf9ed87f1b0e3c70c29cbedf60dd0a03d2097d14a63fc5844b", - "7c2ab1340e7b4d9db0c69ad58a85618b773acef0c15cc48253d0b8c87db7983b", - "c753d79af2ec6240fe26e32edf000bc2bc401670ca417bfcdc6657ae15053906", - "9cf5478bee2f53f76ce09dc0b561d6b8c387da0b16c3ac2d0a48d18250860b6e", - "16d7581b6f020eaa4dbcb638e669394de0abe99d50e5c6d09cda761aaa2733fa", - "4532a56b3a7b9d62ae1c2d33eb22ba1c42073f401f9ae9fef6b8f031fb6de924", - "d2334de19dad26c63eb2c5cc1f24990fb2f437bb3d033df57a0e3053ab23870f", - "a6a3de63eb251d69db23b26ef9c1db2dff1069d883092a0e8f85e57b5404bc42", - "8debebe4a8a525688314cc7b78b4a9c0d60051ffbdfa0f85849f4f3422e6d58f", - "9ab172f8f10cf11b8ed0f10e2cc56aa479a673a01e794842adb1aa7317b81f9f", - "d8a402df883194056e70a6f306413a119c8f6f3023cf8ac21ea61e0a750ec3cf", - "89817095d29180cb8b9db458a0efe9f6e87e05223e1d9ef02ac09499321e0958", - "a7a5e46e89ca1e47c6a9b813c1e397a4c5aea6806d4edba93f76a6d279c55b70", - "adcf216eac2e3076e0138c432a0c136d0c76f16d350d055400391031cfe2c1d0", - "60ab71f2e2dec3f56cc9b30bc2ef6dc7300fb8a1cf2753e62e6704c09083435a", - "c12e452c74dc8c47c89507d2584104137e9e81b2d56ee9ee6c12638d8f29cb3d", - "61016eaa28f8bf9ed86863809d08139b612cca2cca482fe07cabba84944aa8b7", - "7c875505a3d6cac3a2ca0961a5f675f6a03e049e91044e322d9e6bebb3ed9ac9", - "6c7df5f63e67310f8353c0ea6cc9ede0e2d5f8c1c589b4e64985103b1864aeff", - "b488511abe6f48db95fb8de7b587f4eb173c564544f001bbfb8a7dc0160afb6b", - "212a693d5ba9d209f172169f6403e32223d872f90cafb14a95d90770a16c5b97", - "26bf12985447097879569fdf5ee608a37f023b9eb2180bf909ed8f74d7f916b1", - "30b83eca444913f658c608ace3065b9f59186f4a7b544c8bb9668b31c5554c56", - "8b82b595310baf3b27c3369edfee0aa905eb7bb6869205d754101a3a9abb06d1", - "b8fb2a27fdf4b7bac7e4043dc674f43c943759e3f9a6aac6cc49a9cb90a74bcb", - "1486e02c291aed2d479d55cadad2869776d96ba2c3b3f4c5016ab1de08994fee", - "22fdd83789a94e3307b6d17b615988c11dd913ab72820cb03c4814163dcf10f1", - "4c758be8dc8840f49615f5e005d724768998da46d5e9f74ba1c92f86b1fc991f", - "11c948ea8c73d64d40e778a8e707cbb56dc807a0a12437046080040a3d86d653", - "2b3cc8055c8cc95517090bc06fed6575d178ad05ba2b73d3942d1670e36561cc", - "8c650e074adb35bf81d0de38b46568d952c7f82d3bc7e3de6b9a494de4e681b5", - "019a8ded5a5f9d83f01ac33df1222e233cbc42ca918a2b312eb427e45d52fa31", - "dcf53261db00f2289684be229b2fa4017a0f361c483b0a20a0ee8a26746fc4d5", - "aa6547de68051df7348d632d7b09a66073201bd0fc46db1deaa391c53318b8bd", - "53f6e6a1642b7c2a15dbf62d2fad940aa2646bc8d06907787030f834140773b0", - "f78be9f4b0c837d348e554ab47f7886fe9dc5925428fc91ebd5b74a05a863551", - "03e22dcc52ef91cd4ca4f254de4ca490ae613dea5a7bfcc483b133b12c9afeaf", - "ffd0bace9722001c5eec0e6eaa5994ecacd70ffdafb515f3ed47b7168761c811", - "2b5bc3f5a049509f1307dcfe7baf0019b324e1ab95f9a89cd93cd9b6c9c97847", - "50e4182e2d7dc7a46ad2819fd87b28cf613cbc721b6597776fd27c67806f6ebd", - "347f5f4b258d442ad17b6f04c0d5d64c2786d27348949362f2988dc6eba30c1c", - "65e9145025a0a2d90a9c0db193b3af4ca7a75429446922239ce3d2f0b632120f", - "345c25d3f1cc2bee3dd3dad84559ec64af4593520585ef9e48e500ceb55ba3db", - "3cca79be4903326f41734dab451df0a8ca55fa8226f1b1bc472e86703bf38e84", - "f864772c4404a6dabd9920923411e3762a510369f585a2e5d9e5f62bdbb8aae1", - "b1460478d66d62ee987eb22b9e1f6f8678fdb8947087c9b3e9882b62aa913b8a", - "7a0ce24d5f9c4d39bc94a459f9ab311ae4b8e5c6fbc21b47914ad1f260f02c1f", - "c0b65f122791514ffe276e13029a11b1257a8bb0dd4649e055f2b044752121f0", - "f041ef7454fab56d90d07511839e587a370b0ae40189a476950de4a338ae48a6", - "fda839b57b19a78f718cb705568026493ded11385c732f485fe7e41f456c2518", - "3b7b4f076cf34d875640aa6e31fbffbac48a0a656e4aa8cfb6f4a472007f3dbf", - "dfd806ff0a309c950460accbef08a58e3c188ee9d2bd0da1c6478910fb164909", - "e9a974f548f559ea32b54841ca739d90ad46eda3cc86fcd5e13e693e8e762453", - "4bcad1de8bc72dd1861338ca134bf23ef41facf99b38a0fa7a2f9c5c989f2f10", - "9b1061919b5b613232a8a52d38e64975cf5da5b50ca96efc7c523d4f834a391c", - "d6e894078d919172561a3de43e13b27de9840fd74ef37dbcbf1df40fde6d2217", - "4a5fd9a9e75e08553855569b2d10490d8d55ce698af2afd2263883a60b71d137", - "da719060f5d748fd271968cdd3376086f1431b6a8f54d40ce9475139e5c763b6", - "9a9e1022fafec785acf8848efc2bf41c7b6fc005a8fa945eba01fc6edb19ff5a", - "25925b218d53121d03a9ed64065cc24a408a3eea317cd182d80406649dcd1d43", - "cbdb251c24c7959231cc824a6348d8ce63c5911becacb9b72a810394863be59d", - "4a3c3908a2b9402b36cdb19b665a3a4f61d53b897a96e46dff3deff9055ac4b8", - "036c31e672c49fb3faba9292d47a2543fe5df6c69c364f3838555b90b5323452", - "c5bf3a38707012bc654d926cf5a7c7ffcbec735175d6889603db1b8346c53dc2", - "50c1604584434c2546efcf86e9a667a8b399c60737a68ad7659541a02b4ed719", - "40180721b553592cbb72ec45e677de199722dae0ee0bc07ade383ff37ac324ad", - "df788c347476855251712c90d6cce4d4a771634bcbf67d4e5edc7399780b0e0e", - "37a502795701194db2821a9eb0abc539cfd9256f22082005133029ae24f8b859", - "fbd7fe6bb855f19ed318ab8d522d070c2b9d9a3c851097482cea84102f513aac", - "c881645a17de0fbaddcc3f6dfab6002fbea0c066d28d2d3ab371a2880875da73", - "8f438293550b9f91b17de86e9a676824c27de2a82202b7676929ea6790ebc138", - "f141f199798e0359ee057735f78a7671e6af6be28ee8c7c47eb901a1bddc678c", - "98af5aea22e682b1bfed1d0210ef1b05776904442159e0619cddc639067811da", - "fee02b91e65b9a5456658022b38461ce72b5404da040b1260bb168a9c351ec6f", - "808adbe2fa51c4dbe73bb96b4aef578d25adbd307f269997070f4c6c6af8856e", - "0ac656860c189b2043b0e6e1adb5b2541612b766330c7eb9baaf64af9e0548c5", - "3d10438244582d752e103ee5b2ecfeb079ae9eb11c42530f94e2119c53b402a7", - "11ebdac7af5e35b4c877633de2f3070cc51fd709d1707232fe86f7d6a7c65439", - "c2742b4c98f4bb05873317c01519b635196ff300b7ae29ad7546d1b7bde23141", - "41656663d6d81a1db5bc673ffea4c1f8275d57aabdbe95adbeb705fbad4390f3", - "7382a11b6b5db83a9da741ff97ff3fb1766b4bbc900236ecf31f2a42b969702e", - "e307b37dd813dc1d02ae0ce73761b5158a42c0ed9d25cbad9bc2851e805bb452", - "10d21e427c7a842657bdfd7d909fb46f80dd852c58bbf84ff962dbabf8e11300", - "91cc7a7128240e2cca873ee3574655ac123be08a2e0e9636f7f3274fe3bf9566", - "50aae11385c541b8f465b0f0f72b8839257244bee37b453950e25719b7273391", - "48a76afe1b8f027eb736887edf020230a4893a93565b32c160ffc406972faea8", - "e3e9df6a8e40873fdf13bb78495bc39ec5d85f271a6a6330ad46effe5e07ac58", - "e67ba8d3f4a6f6d42eb9ff82ed9f9476dc01d2db6be7c8140f9ce35ee38c49b5", - "9b604ce54e751f1721b8ecd4b59f25fccd0edf97f970d5e9a6f59de1abb90b1f", - "8f4f4022c371c941937f26e6dff783bc07e5e3607e3e4dad19378cb869eb1cd2", - "65a45f710b95aa37d81b823b3b4bf54e8422b2b3eabe3c90e05a0794b7e1e701", - "3998b410e9e6f4f9148d775b5e5b2015a02ee7271588e943a98c58c4ffb284c3", - "c584ec0e11e30b5d4543cf468041ff45507261e85e2a1fde43b48ffa63bdea5d", - "75272543759eadab209822626bfc4509d5b6c9fbaabc0f7641974b10d0cf7b43", - "81fbf54656395f8460b236d8b3c1eb31becd70b98c47113b6f175eb4aa3f68af", - "84fa72079a4b86c1dca7490fdf39a42d116051604badf1f17394a23a3ed3c2c6", - "8d226f9c8187eb8815b2fe67c8dbd156b433b6d97404d8e1cbd386efd4eddd76", - "cc14fab4729d3e22b85bc3c582420f28ff6ade0c7f785cb54e8c1d6cbd652ff1", - "d4f06333f0ba54698d90f4cf82be13f1f93454e233a911fc91e01814f0d23b99", - "426f9a8993c82e1aa3a0836c8c10621746554c9aa05ca39534660c7c202fccc4", - "a988ca43900963d5b939217e62ce1eb0f6f8c8436a4c6fc9323c8d03a7291518", - "bc8c5df657538ee766f6ff5043f811bcf33220b71524864c07280cdaaee33b7c", - "59adaef29e184eff01c765044afafd9e35664486096b3d87e188d08ae67477a0", - "2a926967135526035328dff9b1a7c1f13847385f9ef3bccedb521e57ba46c981", - "d9be23cb40a6fb74ad112214234ad06117271eeb37295b62f56b8f57028e5e91", - "4eadd3013f04c2027db64f5a965de1a7e7f6acc9f64cd66eb2fffb25ddb1bfb7", - "2e8263dc8d9cc4f20c55ecbc85e45a520ae37a67d9ae24eea750afe01ac02b8f", - "6456a302eaee641d996e604db2b8097a33d04082c21e9a7b22594f672d05d23a", - "e9ff47b3957309e2c9f20fb66792449a0b35bd31b0bca1d2c24fcf29713e399b", - "ddf96510f63ca35785700691b9df286d3e14f92b447453a4ad2cf2d9cd14f4ca", - "caf15dc2048bef492a5efc9a3a00d5cb6a7f93c98a7438713f437806498fa870", - "be14ee00a5ae1af7a8a6b8b30c25e54b1acf452e6e148d5a71af7042c5fc2894", - "7ec78e7e5408da9c0870822a174c605f33243f563106f8ee2c44377ddd375dc7", - "114ccf02066192dbde9ddaeeddd0c38c16a8f1bb45ff37c1c255676e195890fe", - "52b2da745912b88364b2e8345cf1d5e2b43313b33919396a48ebe1757781b65b", - "bb19d5e4b654254ba17d35bd770c0597936ff0a1c25ef3b8973191bbc26551aa", - "0b9b8f58c7232231b74128e4fb8af07cfb26aed60c51923db43839ee96770b5a", - "e62e34d906714f3784f6248d69d2f9fd553b6d652b663a3c854f7919c97eb0c2", - "33dca0ea3cb2e752054b26b90c2f41ba873d9079c95d804b81ea7c3068ac24e2", - "90561ae1af195301a117b80a14231231bab0edd999515b2be4e18d657e832b78", - "b0c7fd7a753848411de120791f84a98376261a4b1b16a4135c1d8d36adc645ba", - "709ef8e8578050a87a55c0a1fb3dcc382dc137ab8469f27633040372e98e3e78", - "c061e822cbbfa58bafebcb02b05dc76f7939f5036a78645810fba6ae91462348", - "c929208673ca8d9093a4af670be2603e3b9f1ff8b566b97e9d69469f59dd2616", - "ca33b04a159819f35e0e389574c61be4ecb29f16f0086713636a3000502fbb0a", - "00c7b733097f0c0c2cb65dc17c682079f229ca0b61b79b40a82db9661869bc6a", - "3862e0fb1b76f469ab8bc41bef5ad8232303640410a0389993ced4d1693827c2", - "23606f4d4d482a70d2d83f427868fb00db1fb27f743d8847769071a312490673", - "e49882b66000a40d09a0a45c9400d4e8f58aecd70fb91ee7e1e9883e80828b68", - "3cb25b2547add7ff6af42c629c901538fbcdd9e73bf4d1dd13a546731453b6ed", - "ffbbf7744f51062fa4dd1d23349747265ffca0f3faca0262c5ec88af2d1ce2af", - "047a374a2dfb54ac8fcce78072e1a1728bf7f74986cfd1aab3abde5bd07bebb7", - "0ab245baed27853301a162c876c7b14e93e2ea83f4d59a81be19e8e281f3f3d5", - "519371ee395f5417c6dacd7fa982ee6357f6ae7ffb3928a6162e0478a15a57a0", - "57368ff8cafb373002afb61ef52d74f142746282f6e9acaed18bec40b4e332c1", - "65f8640e84c61db2a6571c2b625da5f4e85bca41f9fe7e13fdb06097e13f0acb", - "6605b8d6c8b806f0505bf55cf5039a9210ff4083fa5889075d04f2af120c18d6", - "a30194c781976e13bf2e03f08ac4e32f2eb543c8cbece3b0239634fab74a3bca", - "70bbd7cd5820987f864f51339d0c1590ca5d71c266976741c41f4c5140cf715d", - "26fda00251c27fca0cfd1706d02db44856cbda7cef7e8aac5a188226981af1a9", - "d7caad2734ca3b4718670b43d2732b3a8ecf09f015885219aed490f4c8b6bc5f", - "87753028a29b2288d596f291801433b57ee8a9a300272e0691142300e0d659a1", - "ed4d2a921a0d321bb41da0b6215d21d3f9226bfdefd435bcfb7fa5ea562f1f9c", - "426adfcd8ca4b841c68143c2c1b4e05053e993ac42d69defd0f5cbbfb40446d7", - "b3ebcb91c135cbbaa98cb210cd08f0c01f9ca01e5b8a9c5cde24a40617d01820", - "e0ff7d32293b1e3d34234ffef2b6bdb44dd4d0e45b4d8d148dc83980ba1f1b58", - "f561e9f9185dda9a1b7d89533b601e58382c95278069cdc71d89ca324ccea2ce", - "d3a2ac1de9c76343904620b40bc6afbae3bf09f7768b7b2505c765022ded191d", - "4349daf89546f05f060083a3b7e1ee542916cfa4b0ab0020816b0a24389fbe3c", - "778c00cca63af6339e5deb348c9ee64697fe39519394424dfee7d355aa737bcb", - "8644c834c72c48b35eaa3adf4b8a6e1cbbe5ac8d5a0f108959f5ed481506f368", - "e1d4f8e23a273ce43d01d3389b9d33637a884f8ab7b5ff448720047f0929d26d", - "ea4a2ddf3d4a74c3eee9fe4dbc1e90c03595309143e0432057666d1017aa750a", - "d536232b8d75bdfbb0b95e68ab21672cb34a1e550ef745687c2859eb450bb925", - "7abbbbcb2ae8a11c6911e7c3f5e8056b6c9050bc97d95392e8b57ff309bee355", - "569025130fc0836a7c7e7a968eecc608c75ca13459184cfd0079b315e29d865c", - "6c773c1b86188df34cf87c01f0d337b4b1253564355c0788cf098e0646706518", - "0f6214fb4606b2f9509c3599292e5c39caadf56b6db2ff12d4f06e63d589f399", - "1b58a7f4c39bcede1c26f32debf118524cb587e5cc461e8d9573f755e8eeee68", - "4cae4bba15edb11097a1dd56c9eb7a0347009b6e3397881390706e65d05e877a", - "31bbada3543a29adcef97ec513c66f221ad3e0f57e7ad7b1ab5190f45fc41a33", - "84272c2f0fde7609565c1e347b1306bccf51cae73ee9e78e90c2bec68e39b2c8", - "e2afa46e35a3673e939dfc7c68a7bd2feabf5fed3d040854daaaa603dddc8890", - "68b9553b0da1d3e3d7a5f4d03484552f19708945070ea3adc2bf7205df2c632c", - "22063dec1e83771f3696dc0027a1cfcd0bffee72b91169eae494185bf3294871", - "0cfd15c44ce8dfc9fb3123e48b43d254258cbc1f9e92b450506e1632e8818ff6", - "4be74319cd60cce2d15f84c7e60fcc65f50320ab1258459122d3f8166d0a78ec", - "732cb285da0cb1d8b9a678b8b0f68b37c740b798209d0d74ddd125e6a3d53b4d", - "0eae3e494da4bc42c723b09b5d67ecb8409202bdfd87d0bea0476cf95503bcb1", - "40a39889b73da6cb2b5570207951d59de1118e38edd020cbaeb65209309fdbdc", - "b4aa75f524165eedb477b89e53c8b2998a30df5015ccb62d10449a151750cfe4", - "04da78e2e24ea13897bde40b597392d0493bed6ceab034070c72e7dc92ada53b", - "ce6bef6659bb1894a8221215187549bfd6d96117ef6e43fa0867e6ca98661eb0", - "556caf28125773bd73ed30e62b87f42b533d3dbde57f0158c67bc92935acffef", - "5857240899661bfe105a973d0ebf7a9fb3622679cfce5d614ded411f71a538f6", - "939eadaa9906456b6a15a74348ce4167f3efacb24678a40dadc6ff47a71944d2", - "2f760b0bda00e1a43ee14948e68c66b544166859d4fbc2796180917db257c1b1", - "3f8e60af2f70e585aaf872705fa532bc3b37092bb3bf73b3f64fc566758fb689", - "11964f2b989b84fdc3fd3eb836fa7fb9774e4951db9cdafd8835a8d331c56ef8", - "a87d55b26247e99f65bf6e65ae80c2efbb4e4083ed831ae7477218fec0e474df", - "2e11ce31872e8da33598760c52b3a6cb4d055259e10789c4ba137600ea5a27e7", - "89a98695e464c4db9ffd8a7eabcd06b07ff0d365a7526cd4870da9c947000cf0", - "4eddbc2474bca9992735ca0cf9145e4caeab7efcb8e4a77f19fac385feee8f2c", - "93393212ccfc7f776a23957c77b13dbba0516a835b4512a9bf264d975b188ec1", - "054637b04c154e7e2d20a96383e72e26119e0c595878803a1f2978304455eada", - "92bae6efc37a1c5a81f08dbe6d4ab94d0cd377c32f54a0a774c5cd973f3201f9", - "9715156c29b7249cf4fb23826b054b98149f0ab3d22aa11792f6d21ca25b9776", - "6aea177cd08ed69e3e5e372a49817d07ab1dded805609c462ddf6b8590cd5de9", - "08315225c2984ea07e52a2a0d7c73c8d5100f83c2ce42f533497d9fed53555c4", - "08a00a59f267b25f62ae45f881caa06d884240bd17dd7ed507c64e8ba7e2ead3", - "8aa9a7ca6314202d950be6b39f3f67ccdeb4cfd2d4b2162c1754166c0acd797e", - "d6652d625d7f0d0d70bb231fe089beeb99fd1593026e0bfa916a80274bb6a7b6", - "b275a3ca86467c0b47fdb26575bf1a73259796df312c9cf817fcefd53f7336af", - "04a8753ee41c5d7c19d884c417eb9ebd9651d3b3b4ec74281da116c31f93d4fa", - "f8d2f94c07b51eaaaa5aa3ec2b9cdf445ece8f94aa5c824de228a6aedca9ff30", - "61a6a82450eec7e4294056f4865127ade2c0171cdaf3328f0d09ec1845e53065", - "839de66efaf54fc184d127614ef4b6aa7d7919d0feb6f06229e04eef8a809318", - "b24caff8753e8f19704272bfff405120688c4687a8eeaed6ec834d82cb3c1119", - "6b91198d919971371e1cd841d05150f4b110bd92caa20de0bb01a7e49493dfb1", - "3115b270af48dc2cb3b74603c3496b25d446af7562615005d4445afd92463b08", - "dffb656ab38403ef362b8d497669b8b3bf1f493951423e87bba95975d2cf4d38", - "b3c2d8bf2c60627e18b609c65ca3b039646c209374e54c80e6a13e88419ad693", - "1d6d0263acc0b5551a0779e55ad6c18a30efdf665054176635368f82c3d70aaa", - "4b581ea8e968a87b2f56a542ac8652dab90107d594b4b140b23b57d703a81f80", - "f8516b4d640b77f7a62f0fb91473720228a5b4b1d1bd66a896eb5bed91c6527b", - "032201f6aed4208d8bd76ae4623488951f0bde9c8676c6ca2ba2c6dad86fb33c", - "4a11a0df696c03d11057c7af06e7005e18538635ba7a80c503e36dc68ef01bfa", - "89b21dcf9952bcc571df61c86e55f6c4e4f65cfa3d884e800238434580794582", - "17ba4bc8b3a40d305ef61443858ca7ddab543c4a1dee6ae5e9b8d66a4c2817f2", - "9172314c88b58d37165ca29de16e86c26388c47ebb85bbdb98edf6bca0dff8d4", - "c090c1b4888f942b49f7a1b4730665507208ccdae5f8c48f017ffef1c75f8c6b", - "44a2ef999c42c84f0ee16c924552e56224e7d5b5b81d79b1f135f0fba943f0f8", - "56a14f9e5e9880d7b6b32ec44afe669ab19e4e8ea39b0753f7f13d2ab7d54483", - "c7a02b383db46d010007c70dad42bf4910f245fbb7aa031c9effce2e05d721b1", - "5a9cc6263d9075a7bffd3b7af669bdcc9cfd304124349b29d2f60f2b9c0afaaf", - "ec7018f689f381535ac9266523691f21aef5d5a3f746bb08ebc3ece39a030511", - "93d7e5996f0625d26349921edbb3194769391122d4e793795d84cc430e4e2dc4", - "37191f2f4213077a91eee9cf1d2a2ce8cba1ba3b3b8c4c9bb575245fcc3bc8fb", - "0910dc48e1621c81cd3966a8bb93a5f1de4a3bb75096dc2b1d5d5a9553674fb4", - "5ba31090c48a9004f71d7dc2faa0886737ba3ddf93935149b8a70a0c20c8fc7f", - "17b5cbad587db7a444ee8bae8771611f848415c818d7dd08aedcd7ae6952e7e8", - "0e8abebec3e72d76656398a56db6be0c0a9ec198a5a8eb9245d4d05644bbda11", - "7f847a5f5027bb18ec93047aa05dcdbbee521a529fba6375f40668f137b1b9af", - "568ccf8ff986e246ce8beb6f07d15a2130bcb2657b24d57cb44e16d85c9e183c", - "123a058a3712a1129500210df8c6810b1b110bb4320bc27182dfa819572d3121", - "e2895e28a4094dc641f5cd25893a5697300e0ed7bb97e4190a0fb9d7be4caf22", - "a79f157c1d783247e24962948df5137c9d03ffeddc48e13b83befdad12c5592e", - "6962edf018d77d540d42620fd9921b154625b959ca78fe540afd1cc0d530360d", - "47fc617180e469dccab88367c18b7aaf18fc2860464c219707407a86f83e4929", - "015ee7e6133a538059c7f9bad3f686c012c5f0c194ef6c38abc233ff65a90b84", - "d5e9eb29b79699cea58c5a6db3b237a837113a99576f4db7d58d328f63eb0cf6", - "0d6ba24032c7f034db12480b14fa7488cb345d1ed8d3d74a1d9c29ac965d765d", - "db0bbf9e581f6cafea3d3efa5a87be53b4fdf0e6246464742390b6b3ce51a98b", - "14f2c1c8dbb93e2b258ced4a0a3947a1d4ccec5544057fc237692127dedba134", - "c87f2ea4c68666b1751b2bebc2b404903639e00139672552a0dca937d8445b1f", - "536af34e29fc436458b553c96a06f1d522a3ddee6c2ebdca3f905e9a05467333", - "9005cb8e196661cc09f57fb0e1368ba674d767d0687885c6fa191afd242ec44f", - "14d105c8709aee662ea261d291b4215fa9f70dfb9ca0a26c32c05bc627a04dc6", - "23eb479a77886ee8bcb5ae7472cb57b3fc17ad2a1c94eb3285f1b821e3b513ec", - "90b73d06e30681e122ff06739799f13d5aeeeb1719628bff7835a9d7fbb1fa72", - "492fd4239e73f2ac07107a79f7c0455692b1358b817bfc19252d463305f886b7", - "60aea5ce0295db22abeae7f4a8c1b811e700dc8556dd28c27d3b612fc2aada49", - "c8ad7e8de4218a91f1835d6d2f2426c840eaf21f5d54c61fd2608cad8e8d54bd", - "73e13cca091c22063a8728aa1698d6e77fca8292000caf0ce8b8684efce0fce9", - "f897e8ad7d1058b86aa04df906d0b1fe0a5d21ea5897efd134599891c44f43ff", - "6672654e7678d691a18b8da506ceb6640f9e0c27d7ae5ae6ccbd92c841a2e2c8", - "a9f09a33f26acf4453e0b37434c4d48bf09eceb073359864486a30ab64d2e2ee", - "33120dfca35c4de4d455b01d6e46823c09ba168800f75302dd7e494ef806b0e1", - "17f1435c50a567aaf1af1f66ae4fc3545297041a36aa2a7c3efb5f30b96c6379", - "342c135a91020b735fe75436d5b75f3621dd123c9b3eac0dd6e5e8e406c45109", - "a3a029d40aa48bfb59fb083e0d18cc03ab7e448a96a33b6fda9f018d03649ebc", - "38b0b16f4b1e6a03c65d7dd42d8d848044da4ab0bc455ff2ada11022ef8be00a", - "989e67ee59e7ac2291a190394ae90effef40f980cc5393e985ef30a597a53c17", - "74748d636fab604c4a34dd32b7665628ec8ab4fd194b319a776dc1aa6384db93", - "bbf43f2777b6e9f400c7c83aa1f941b807927fb4f2cf28f70f795d4e6be7069e", - "9c0c66b08ce49df8de969b35131450fbaaf5df07e491dd62f83d4349ee192c7b", - "d3dc0054c3e545a7327891faa2b11ae7e4c6ef0121dc75a890b8537796a2f875", - "18809e1863690ba83ecc50434ec953baea812f64fd16e57bf36366e5d74fad13", - "fd98a6c1b95f1f4510305c63c701a69a14443454b674d0be62a6e609e5e94304", - "4099b375320e2af0cecf1a7458474a7ba38bd55f72f6235505a4859e5996eb01", - "b8e86e48977dad1c7309993e364ddc37c5bf3a639b235f8c026b8f127bf7cd65", - "9a2551538ce1f770441a2a006b772375b75b218ac9441c298f56d6048546a3b2", - "5d8c3c8ca7b277740293e38d338f2f25be09c2692d80cc21865f90654210bbe2", - "8817e323baeaeaa633b2e812fd33ad711c9492270b74d6fb4b19fad27593eb3b", - "4d2e0de6d7f335d55b4b73bedbc0c6df8c85c01ad0d401fe73b65ddf95c7bc01", - "0ee286bb3a5eccd60262e268166fe70085525c6b03cf13d18e587552c240476f", - "ca8a5a7bf86a455dda2d395187bb731cf50f7534c5c2e22f386a06e7e7976857", - "660a9f3f3dacfa61b1b8e0c840f88ea1274b86a6b4f335d89d6ee9032442269f", - "a5deb5782cbf013106c43c5649dc2fcefdbefd2a49ab042e8e00450b73fa3e53", - "23be715eeda3a695c78fbe612815cfcb5ee1209b374a29942ce5c587d0be6781", - "a5b20fac6fe58c431d161a8a44d3316ef76899b8f342f847b86824f68e1171a4", - "f80bcfa90b9e874447daecf911616152d98329ddeb9bf1fa061ac24743502802", - "abbd266c8704f0fabed3978059c90b0e23a7ed54ca3dad376195edd44e6061a5", - "67fb449c0dded5437b0f9e374eeab7af347a7bc5aab92cc8ece6fd6b53566958", - "b5ad232d3025b64d637218cad9fd2579dcca6a1dd3ff4b9dfc0132ec06844772", - "f11f4d8be569c789896aff41650eb561841cd56717fe46c9ca638b1d20511b63", - "36467dba87354cb41d496795dec070ffe288d156d12edbd5158511ee4d25dd14", - "27c158d6eeb14df405608c476888d17205df52d3588f11434d5158c11c8484df", - "40a0125688a2fef37cfa8c4294f71f082bffcf9529f3fa5a09fb72dc5f950d42", - "af1f69d0902e4960099dd97a83627b190bbef5221fdaeb2b36c879eb58372302", - "0dab5741ef1e565aa1d781a5298de5f5d390110b1fae2b97dca1de2158560db7", - "27fdbc7e28c229faf8b842350d5780bccf1090ffcd75e6f22e32aacb468d5665", - "fa45858278a6b246220965fdc0336086cf338709d566e9eea2d62e61a5af736c", - "23bd56868543c4d4281497d9228c30fb47cecb4c6dffbb968fe462f833f71ce7", - "11e87f8f28c29946b6651020c267cb0afad5314fe544c1f5d6267ff11a685221", - "c53d0fc340b66dd6eb1799a5de798b2308d6bb4bd9a80ed854831828e8d14ead", - "a51904b5aa8d7342d5fd86d5495681f310f587ea6d2f3b87f7749a3ad80df8ea", - "39f5f4ac7f50853e9c2bd6636c21e01d8706a7ba439d1296450990a8af1cc1e8", - "001d824ea9053b1125257ba82dd085c3f2943056b4b30ddcd62ae1537f1086ad", - "396e0dae74447981c302526117e1aaf91fb04c33a43c25f449b9a562147ad69a", - "78339ba87a7e7eeb4aeb1f0ec6ce76b9a525dc7e70272fd412680137e93e952b", - "ea5d1062efbe8712dea39b3bad80c1dca145d86fcb4c611fc01f4b1085a0a527", - "195aaa30f77ece9dd9709d0f0a56e588411ac8a31595d0af323b282583e31172", - "9307ffaa59717848e1827c7de89fe94826584f9eb26775d96ba32fd1b44e72b7", - "360bdf711a8d83dd1753a2ed710d9b37dc9b2b99c4ece014d8a6536dc644757c", - "9aaeac2c2b45e25f0950e48f5da933cabbc71e10e299414552610b7002f4ac3d", - "b32ceb5204f9e948ca429448791796af7bbcbf83eb25bee22ed86d5748f54a1b", - "21de0c2c4ae05e511d074696fcb5a1cde14df2f48c865e35d293b308e2208c47", - "85b0bc33dc30b1191f1a192919e91ec9596cef06fc8123eeab4c394c24e0a067", - "82b0ca271d28cc6e7e17660493db47bfb5f949c8e9f3ed066d11c93cdd9f736c", - "a11468aee95058bc8712de3f88ac216bf472eff09392e662ba26dbe8613feb63", - "440a195e1496594be5de24760af27be9d4ab75736b0a7034a49a4f7db92106ae", - "0640acf5a501f8d302e71c1683d5a3c322a2eea90dcdc95c1e06d4f7b6d806ef", - "72f3f007df9c0bea0c36fa6abffbd7e83655ad416c4ec3320956e0e48301f6c3", - "f6078a5b8ec40ee62bcd9067222d479f76903c9af422cf8d32838cdea837c7de", - "0016d1f7ba1ed154046733d5616c990c1eaf20b10491b8baaebc14d4c716bfc9", - "b279c8bcdcd2f4f5f421b648f3e5242c86c113113a3680ff87b0ba7d55af475f", - "13366eb363e1db63240cbf776549b29a6c578e1b6121ec48f562ee8a030fcfa9", - "668ba416a303616aa916a874caa18ab87c661274246ecfad03dcd7313a17b074", - "6843374593d2a25ebd717a005d2b6d76a7c9d7804cf50371bc80d29f192aacad", - "bf8a831d4fe85c34490b4f28524d4a0cbeaaf8109fc6bd59ece1145bb4dc25da", - "bd2a03185ca4c7d2945a68b2aacb013f0ebf007d4c42435789e001de6eaf4f0d", - "0b11cd57f699a70b616339c98804555366d1c1619a5c24c11ffaed4b07f4438c", - "de0e57876be74166992e09fa91ba715bf6c592eed468f1ff67378f86466caab3", - "3fc34256bc9c8a47d5e394a5549e12f9b42a784a5217522075279761a8d675af", - "930c296e27a5dce3fee3334da7ee8da7dd6c1e727dcbfffb80197baaef0132e6", - "8bcec20b627fad48748e9a89b905b2e47d2e8af2b1c1ef2f40e062e70aa17f23", - "47c8474ddc59d5deafbfbf6599259b3b411c3c2013e3f35dc2add41b16b22161", - "40eb60b2e1332f85249fc95c08dc3a9b238ab77398d3f2408bb3f5f1d2db972b", - "8fb1a0bf51c7cdad8acf842d284311ea70e882e09f37e91f293dc83d89b36319", - "1e3de4d5e6a117b7676f8ebbcaeced62189f7af7fdd3b90936f585b1fc6ac63f", - "95dcd7400f573ee3c12fdbedb5ef4e1aa63be86d09517f7d01c6fef660ba588b", - "856a38b039759c0512bbd6fc279d31ea2f6038c778940dc4eba2c89c085fc102", - "cd968176e8713e95dd8bda2250ad79a93ceee6e5485b12b614e785eb7d4b8422", - "3712438a97ca1858f3cc0aa98bb4d0bbb513f395e48ba576e63a839d8e9aa873", - "56ab8dd6218089cdb26203518b630e2222450d83d0e4dab2d778d06d8ae76987", - "b19d36919b008f2c8ff5abcf1392a330b4027baffda2dc1a645fcaa9db077a3c", - "497a5bf85b40334baa943a526d9c9562cf7574762a95ca137cb032d9ec8bf91a", - "ba836950e705c861fd59ebd07aa3cb314566edb2a43e35b0275e33b6c346ed7f", - "d7ddc041ceb6fa320ee5d35b96020b22db13d30a77eeeabb1d2f4956cb16f469", - "bb4f905028d98b8d7a3f53ef3ed847765ced15bee53c8fa55a6498b3bfb09723", - "fbbe616a6dde3c1d946c88e46e45810907c89e2f0ebf48891ab5699f193bcaff", - "7249ecc020148da017421a8408a861bfea4124bbb308a4c923d6f5a5643af462", - "6a9b1584e5e08038e25e52ea985f7c02aaf016bb10349ab73a1d25ea09efafc6", - "cb80654ca48e1f3388e32e308773d922e43c3150c7525123ea92b3a7183cb684", - "a68399433c350ceeb459da76e173b3d7b78a163585369475fe7aa87fffd98df4", - "78b6e9190c8ad08c188d78642f37cba69d94010f4cd7549ed54a502ee83d0e5c", - "e572953aa74586bae4e7119b5346fc13fd02f66cee1c7ea1abc329894ee5b113", - "8c3c43ba5c1c34675d3d8c30953dee004590366b28276c702f945d788fc8bc2d", - "c8f28b728e2eb1b41410e1418373163fd85f665abb4dac02c289ae25c79761ee", - "6a5541f4b90fd65099f70d7c9b86e6ed56dcac66a81efb43bd0683b67d53397f", - "5f7fb086b098c5421e5b845f18605093e01431d21cb4ad6a4544cf8be996e7d9", - "0bb19d5e8d176165eba8bb6c2e85c0aac6c890e97b6249521c9c7d812839a7e9", - "226fbcc024ff88ab02841b2e5cd42c24918cf1160ef4136a2a5fd9d024c231a7", - "04a2a11a2aa2a81844a25f27fd379a67711afe7b0a24aa73e89756f6b2af8acf", - "ed1a91d3e3f14fd265084f5cc279fed782fad9efe5bf8703dbead6855e8b41b1", - "e82094617d30fc3831f37fd4f97ecfe6a8ca37a9328b481003f29a0063e02484", - "a67d04a8ca1a1086361c585e1a4c2d361b2ffc9fd40f7ce42ee0741b1690c206", - "201ce7010ad8db22c2771fe711202e9011ad4573837689c6e2ede058d256c91f", - "233d98de5a6e6a958d6c8a82f6f1436813a9ac0bff8bee41617105c6e45a4d39", - "5f3e86a57e875acea05115ceac0a200776a4da2db8a6da48bc5c54fad71b3302", - "3e02f28003e13c7f8daf937ee999dcb58aa68ba85f5bb4bfc7531812d65e61c7", - "493897733ad30c277526d32c5bf087d843a3bf410144da87f9ea169cb8d97b18", - "50702b0537ce16671dbc227bdfb79ba85c3e39f056865e33c4a3507765666b1b", - "08a9dd34c42ece3de12d7362e7f2e4d97b1114fa1eaa5a8192add5d29dbe3b24", - "cc538bbc6f61b90026596f9dfbffae36c4ace95db20c0efecfe236fd89f12052", - "f2120f1f1e8876846ff1b32f230f2c758d33b0e9b0126f06d8abf971e5aced72", - "e03d84103bfdb2cba325a47b0b7bbd976adb12eddb27ef8ecce1a8e21a110a5a", - "e555abe873b2b51d066d0c5c99706f791a9b28f6890c2f7aa30394b2d49b0f20", - "712824cbc568f7d2de1d0eb0366fcdd25cb0e486b84d47301c571b9a46555127", - "f9d946e0d3c659ff6e98e892726d0215d777c808aae97823e2789d05305eef98", - "4bbee2b61e80d856e6f13fb8789646c703590e9a7840c1217306052f815023d3", - "3516a82bf86cbe961336a18c8367f4273198fec63d9a06bdd7098d7bbdaeef9a", - "1ad1d836b2325086e2664e29010f5c3a4fb6187980ea1054089b9b1275d9ad5f", - "ebc2d228f3a7e315d736642514d4ade93d5ef9e41069163aef507143650bedb3", - "e684bac5bdcd58fb26a5f349bd155e59af610d005b1141d3189c0162f21e7588", - "5be9583038a331e0da1459ae4bf8e52d9bf9a0443e9d85239ccd9e48242c967d", - "56a5d50b9278c5bdbd7e2da87c798891c52c659f8ccbd87e3097a33f29bfb2f6", - "3bba15523887354cef221c136c6834bb1276b1190b0ce5559f3bccb616c28b63", - "f2e6a5f6d50fdb227e2da4c070187734d74a537163a423f0a1b0594eac2a640f", - "07e70b4da3543eae6d9940a11aac88df6324bf9a72f69e02d5642ffa68d4862f", - "d769e0a45637fdbc8c3637924385850b750bccf089e6bb3ad8c84b9063f51971", - "d90f9b2064f0d4e8ec1709cca2d992b5f2105fa1ee65027a2f0d8d7c1c618315", - "458c35592e42bfb13f70ab3dcc3cba965e47e0d5649a92d22552325bc8d1cee6", - "11cd1e744f7bc573ec1e9ca621cf217780756e65707837898a03e1ff438f5e74", - "fbda48be153877e398e401cfbe4206839acc124fc9e1073ab2b077fa728b5493", - "feabe6f2a5630a7054ccdc6804fc69ff1c67b8e68d8463b0cf148cca96b1f722", - "76c709ac167ed6b20523208ece6d948c65001ba31cc3ca6b89c39e182ca1d3fe", - "5d22d866bcc1ed09d2987dc48783f9f285af83ab7ba3886dabd110c376cf7393", - "e0360ea3c5502c2d9aaf945ffb91425cad0f125fa7bf2893fa254dfe9b9a9772", - "f4871a553982ebc5d8f83916bd02561648f08d85e41776618d9146923aee92a9", - "858fd00547ba57be766e54bab23952087cf2111cb8da4bad5e75318e24cfc6c4", - "58075df0f0f7e0b8b3f09de634f95efed81f429c4ab3828d7c59349c01720319", - "c2ed32857f6cb96954066d45b67fdfcede6ed33756a02734a9b6f30c82dcf087", - "2c26de1fae43dac3d7ca6dac0dd1ee6c2bd89abff59c42bc392dbd0260a4e4cb", - "9c4d6bb05a86a5cdaf3ecd8ffb11c4677792549d1749ef0fecc59ce3c8e34443", - "dda92e01f278f199bb37445c2ce9868fedb7213dba8cdeb0ffc2c6af80a80628", - "3008bf804ddd4d224a8f446c2184d5eeb4a7fb3db7661e58de3b606b09becec8", - "3342b776e28dbb02983a2ae766cc2d816813f6c5b70a6583c9bda706a3eb5587", - "c5701652a4eb35f1d0a600a5998a656a91fee271d6ab4c5c71ca06c310f44df2", - "5b789cee021ad7b562a7acadd8caca2f8ac16e3a6bb31fcf29a00a1bf97fd08a", - "a1a7dd0b34866eea6ad7af4c1575e608286b2f40754ecd48966a4e4eecf6fddd", - "f2074d706e84590ebc7fc686cc0fbce9bc42c05733b8c8e811a4b86625601627", - "3498c605a05517c8ac22bf7c55f7d0100cb697024fedd1b400e533047bb630a1", - "08befd1dba76aaa06680c9c443d4ac628bd82970193bdf659d1d784b63a934df", - "4aadc5f572ba364ae042e2e1955afced0ba34795e6f489690338cf4837162c92", - "211b4920588e312b3690b5259da3d5abbbc1a46a6b98d605612dbe8e2e5cbd87", - "1908f623839a58284b09f024e08f59ada87ad55300e6b000e84301213fa1e8b2", - "534e0ac9117a2c4aabeac4db8492853c35c7931999d167764b6a42026b040184", - "132b89aba1869e2db3c9727249471342879f74238b3438fae9bf7b453f2f1eeb", - "b5da028fba81b6bd191c97c49202dee3000a56db70b0e21e25e1f6b244a0f1a5", - "caebec7bf354713356f106f1a904cbc29dd46d0dda378d3873acc4079f42fb9e", - "d7dd92938c5c3460cbdfe6393d8caf1819956b522b359872c72169596ac53395", - "85e28ed4641de086ace98e1ca739b66a097f5dfee65912180f048a90396e7f66", - "03647d4b0e1ae6e9e92cd0844754a4bbd609fa68a1d49752e0dd510072521a7c", - "f3b04213eafb557d9039ac76f4f2ad6853ae95639401b586f2eb60fce6e2f09f", - "ecdf824e2ddb6e1942a799a5b171e3521d73355dccf409ba495b663669302d29", - "62dd6b044ef8e10626a7b14bdbd9aef97e4cd0539dae3d8019f043e652119241", - "736c2e9f4f1be722e0fc8af3eec2f11a55800ed90abce79cd4bb5989e14cae1c", - "6d2fb7a12c8340afbe410d69b70028427bfbeefb6f785eda68cc6b4dcd1dd658", - "ce21ae24fdc838cbbb5e5527f7dc1b2dca7e833634bb7435b18f85decdc94855", - "89d03d3a46f13e2237e20198f31ddd8b51ae880063046d709097fb57825832f5", - "b45650ac770e928195ae21d1aaa2f24ec39599834510fdd1d3832ed3bbef4d29", - "92c40d4214127e972f9646293788212e210adbb2ee2dad26da36bd49b7ecdfb1", - "cc0764ba30f5f442943efde8e0cd3dd4d8f99873791d87870b62567c43823ba9", - "bdd796b6024e87f0f177a0bf092350daccc1b0d09e99829fb1e6dbab6ad22410", - "6274f1e65aa3babe97956add754e6bd39bcfb954a6a2abfe3265a984e21d52c9", - "00d3a1d1fc7ad3cad46d90634fda89549509c6ebe41781518bd962638025803e", - "eed31e8c2282f82010803657e5b2a9b00ceb96d01c86243eeef0e8d5bd983d5b", - "8543c3ddd121b2a357638cb8b9112e700ce2d016fcaf5181d272792940772bb4", - "024df7c8796947bfd450bb36fa71c842bbbd809fda6fabf08da5d2749da7e01b", - "4c4d21c832279370cff9d551efb37667525ccba11f73adb84c72fa139409dbbe", - "0ff9c3366eca37e0eedb444f117b41e8466fae24057608987507465daff6551e", - "5083937cdf1a76d15e108ff323367a0719bd099c55c870e41e2194c7d0d70745", - "ad5b0ffff4f2710de250ad7fb7966f50053fd44a707ca6ccbf84adeb02fa2897", - "4b3d282ec091d9edc8075aeeb7e864f5dce4ce3a2d59260707a1b8484ad66abb", - "e3ccc35b761acc92c969a3e36e6c7226f1946831cff6240d43e9576c0deb1da0", - "591bd21aed9b10944f2fee60be50d9e783f4a89820db99177cae80a9dc6f3d24", - "2941aa5c674c4918dbfcf624156f47ba66064a92512784441dc493f6671a438a", - "308d7b2979d25f9214fac27f8ca70fcc5c2eff2a2a63cfeb0a79b8dfb430a3bd", - "8d38e46f9c4bcb4aa2eb76334cb4486accb9d6c4905eedecea27bbfa5983214c", - "a7d4b2edce8b1945858cc087e93d9fd0fdc2259b7fd877b7c2ac944896cbbff0", - "6b336b21f2b00d4b1d906e01267fef542dca5f8f3dab5d6563ddcd426bb6431c", - "d1dda41cec863aea543a17ec6905d80596e31bb04ec886e3dfcf2edc5ca5c7ca", - "c6ad0283cd79709f6de3263ae54ba158415f8a6c2eb5e41ca15af6e730068fae", - "f7e6902eb596b0f0911f4e3b86a7cf3bf2bd08b2aa5d1deca668d69680fee2a1", - "b1ae8d5a8bce184449ab7e0dcdd667e76e99975a0248ba3113484c22fca53765", - "1c3aa01a05883793cc6a442121b9d892c6992b9529efb7a6dea11d914cc08aa8", - "16603a37b376176d48861aba288d5ee532e6a8b10aaa2af84333a8c4ac775f74", - "2335726f4e2027e66d35747972bbdb2d38e361014ae82275c2c4f565c0f60eae", - "01fbbb5d5df7fcfd0db0a5d2a5011b931d0965ce2171c023fb1f87b8f8e9d652", - "9ad0764a5411cab6dc4780aa82fa7b53763d1475a835e00af7854b43e69b022d", - "76f2c3dfb66d85444e7de7478329c87c10a349ab2e8ed136ac9f9d29f0d5444f", - "4a3ac3c46d1fc65812b6badcb2a03028276d2cc4aa557baedd333ab557c97526", - "71e7a6527bc4a23ee197498ad91551fcbb4455ef2a7eea72bf80df6e4a899a65", - "1ffa3a618efd37700aed5c5c799bc2551e850f18a8d008aaed25246cbc68c7da", - "b5a21e97fdb0b46672ee858587e58c17e98203702d20c156ff620a617fbad0cb", - "779fed060ea35adcb6364fd554765104a6743ebdafd08525914ab403e6c11ceb", - "8e4587665066b294c314de289ec899373589a678fb792ab22fbd1bcf28c27d1c", - "6cbfcf40f2980f1462e610be08e97c22c3b28836a1442dddc9f870fc14f9580c", - "58e68a6e904954e9e6a551edb873f20fde708dcebeb2b4e67892ffe704444c93", - "5b602eb816ad16f3da8d46c1cb983f9fafc93e3d53a26fb331e572ee4a41333f", - "34bdd7b1c0d8ff00c7ff4b1fa687e6c6787442ffb65e0352d3ce81480429293f", - "47117a01f7af0cbadb7f70ca3629fdf198e13e3cfbd30d7972fbc7fbfdb6f782", - "719e62e6ca37694045726a74cd03db37e7f8466be1f16a54be481ae0295303e2", - "af73906b94fdab93c9c671182996ab93d89824ae638621ae50ab256790c8c664", - "0c09cd8db91216aad194e88350b8e4458fd8c4b6488ebe054f1a70926178de3b", - "78ec5455affcc88e98d7396fa6a965f30a2af3441616430cbd2b0289283fb4a9", - "a50e6aaf10afe96e3caf0039e3f32684216bd1d080acc39754c69ba1b2397362", - "69a4f96bd9a60da70607bd8e1ac3bf0a307748b3fcb1552635912435e46177bd", - "325dfbf504d3144df39001ccb599d0300b1dbbb5bb3fba463e6dcbc74b2ff965", - "4232210f7e68e2f5e17e452fabcbe21fec2d62777f6ead41001b3f540ecc743c", - "747fe6840e32b817d175b501f0be5e3478d2ba3ca4b2dd2c0300655cbbdbf1fc", - "99cbeb73edaa3014c8cdb3195b98b92c56a80c0983a66f2a6624c5a6cb681c3b", - "f2673f73c38be80c20bcdd6cb43dbae148444dc518b4764f5c47e98e0b704106", - "7734e42441c385e71758fec455ad8a38e1f6f94a3acf435f5000d1225d97865e", - "9735c3f88ac80473b2b2c5cc3a8f7ea85f621bc2b4fd11e6ce81a911b3a12e29", - "5f1044dc7108dc2c81cd77855c0e7f37bd549e8b34a4884adb44607cd77e18ab", - "b1c4249b2e8d711bdfe12fb310269b16a73609cb1c5b2b8e0c1c7828d1369b63", - "609e1daffad0d2fad9ca8ba2b7a8e25a2757915b2923a02b2fd1b20117f57bdb", - "7320b2d3e71527ba0bf10469578db18370b8a5f19d2d436281401fd644a506c4", - "bdbe5969b525a18d5dca42e9fc422580b4e8187efd39bc3b7e2fc13617718947", - "172bd1ada5ca627ec4b983eb9dc6973e3b705ea7dd7b4d138d3049a8c9b22f59", - "7cf06a60862ea622764bbd213903f2dacfff15dcfe82684ae52301384bc628de", - "12ea4654092802a292cec53552f972b1036d703277721cca8eb94412bd0f5d4b", - "3d7006ba8e0a39265351d4b638f8059315bfc86889b9dcd94a3e03135149c672", - "91de056ae1700c61ca279af9636251e73764c37c041a4ef8594a20a29414f57d", - "eb0e5f2853d838309d6819a07efbb9d94cf11d8260b0442158c31e697f860dec", - "b3e1efbf8eed952618ec8a6c0017ebb2306f342ca67949c3b7b09e8c7ef5afca", - "5a6962f5133fb1c765fa760ee13bc68cea771548e9bdfb115a552dfe72d0d6db", - "e6239b24dafa9cf2dedd11a3f773d7c9e37c8c6ad72ad4f05e3f7b8fb1a07004", - "01b281263f69427a977d855f129470bf2e23686a7ae3d48b4db921d56fe8dde1", - "7ebb3bed5a049300a9c38d09103f99644a9adbf061944044ae6b930979908660", - "4dfd484ca1c69c3c7e7fa1f604e086debaf178c90b948a4f40944c7bf9f05823", - "dc64b304697ac7c00fac82258922803ad304447c52e781a6613510c74f62be7e", - "a278056e58f2bce10a5c8f269f652e5ad73c74922d6c841cc5c925adf09d662a", - "e1fb021ed5ff1b5b74276e03bd94c15609b7d45cd02ca18640e1401f8de9d0ee", - "493ab36d10b7b2560721c351c2971e6547f22bbb18551ac98a83d471370f8a84", - "bd6c8d922a9dac863601f7361ddcd3389a4727faa4762ed13b025de4a4c2b2cc", - "cf4773a5ab4323a357d096b64ef61a771d21e64d91bdb4d133f9b03412062407", - "53902fa1cbba1ab2fe7d97f970e7c40cf5934a03a329855501ce8d604147fda2", - "7567f78bfce38e2b8fc8f19ac4441483bbaf315e5f148f429a6daba5b237f1d9", - "9adbd1d2715309f7077a27601f3e449de3554fbb12eff8de7f83e854334854dd", - "ca7e99be46a7d913a2f12231168caf45a0ad06cfa002de66260f2d5f7c8ca155", - "06f3bcfe326dad448d16703df4a611c3e2e4880f004ba6f81f7f4a11c5c99b04", - "1a9a27363de03fdfebc454e72f80dd278b35ec02705c0736146c1ddf91edef03", - "3d124c22df2fc59a3080d0b7de6db9c6527dc4e1fc661e381741a0efc8efe1f3", - "6fba9dd6457e00ec3e7ad85701bf531ee4f817c363ac720fa58cb93a58e680d0", - "b23cd9afc43e45a636c3f3c6dc9d51034ec8568b13037979fa0a1fb1cefee314", - "0b940080d1b7be4e8baaa4edee131bab88acc90e93d699d9d7bebfd6a671c95b", - "10838718d773779f828dd85f1277123746f6e79f451c2023e399978c3cc519d6", - "5a3094a6b710538b47598a2882dd87a2082980ff5a5e72fa570d853e0e4370eb", - "af1bd02d3c53bf5d11d946b676140ca0ceb6d92d86814b61c02f51d352f18831", - "019f00310bf12185e6ab19abde889af762c9939e2fc5de48922cdd3eac0f35da", - "631b397338d486dc2afd4f3822a90e3a64aaafaed7a46d82f0e97df0e58a2f8a", - "f36f594cf631388ac7a82be746c0625b2ac9ea87abf2f5b6de49fdb5486e675a", - "dc5b5b95045a6c389cc16ac7744712f009b356376874fb40cc897afe80659033", - "4a8c013a4eedf97443c88a7a1ccfa9ec82f04cd56a1c0b06e9cf4598024e429b", - "a8d1c826c1e19ed631d025835eb70d2f5075918e33d1845a046ba979aacaf0bc", - "55456035ec39c123b479316bff699db9778d71a5303249ab0951cbf9989efbc0", - "9041988718d6d995dcf171942d7c32ec429715bf35f2f46c00dc914735f2a11d", - "5d62aa0675600226379bf1d8f8660d3a01e7fa2263d8a885fa76c9e1eb51023a", - "fcf1c613298a92d8755406abf37e7aa97fb219aa1ca1413c694f2d82947ad06a", - "a5226a197ba641a72b24c09cb0d1d24a7d538f67f41f589e283655a09aa0a6dd", - "052045b50d7366edb9a83ed0b3360add380743e157a8875bba4929adc27b9048", - "a7458c3241ab0c9842f716397c12a1a12c0597b918a43c6f829bdb656cd5b92e", - "c1a471b78528dcb58730a39858dacbe3de9913d3c3aa94c5756d28a8aeb0e9e0", - "d800cb7e514077e8b5b5d44477243f0bf1c67d9986d1585027e336a3d4706588", - "3a32cfa4300ef23739027c15bea7a1c1d01c5d1d2616c5cf42b8e15462e6becf", - "837bbbd547b99d654635137566810868ad9e5e550cb2863bf75ce469b7357ff5", - "328530966a4a6206ac895c4f327d150ffae28f2fed771d80aadb66f3e993e639", - "7cd3ab027e386ae4e4f4f1f82262b669e299802e4ba35a96b979f3dd39f3fd70", - "0d8fef4cc7a4e77518ebfe4f2eb7817d29397d0f3a618509f6271fea7796fd25", - "1e45dfeba7e8f8bcd8cd35eadd4312c7109ae6a105dbae9adcf3837286f46aff", - "249e0050106d64e1a38894439db59440571b275a01b353735614410da57990a3", - "aea55243759b900e68ecc41e672f09360a7e12acc9ffcb0c1422bb9f7d3afa40", - "220040e779ab55f2e500310fdf3647a3e3c4508f7e54f420f9731823265113a4", - "9abe1014286a6a79b00259e3183a67925336cf029300d53534a117a79b75969c", - "79a469089c9822c8a8a96a7dbbdd00d92d41ec1400dcaff4960aab0dc6cdc8cd", - "17b8a6b937561773afb083b9c85e293c3ea888013f932bebd2db13a6c5773fda", - "e62e4f2caa31bfae88809fe9757c1dc4bab1cf54936ea5f5257c2eb43dadc673", - "81fc194a30f95895f9420bca807d5df02c45b6ce5af6cac5fed50a6ef7181502", - "7de0be508c7c30260167978b9e51bbda80ae3c3f58a1717c20bd0552f2904d6c", - "9092c8aced40de1919d7cc8f5e9a29e0e23e079060d7ea7893618ea50dd5105b", - "49058d6379538ac4dc6385284d65adea0068fadcab19879d8e962a3f5deac85e", - "de8747a1af47db1dfbb13757d7e327303feeecf5419f1da09d0f6350901d5c82", - "3c2603176c36a0865712d089676131a8156c873be6ec31ff10b95750bb0d34fc", - "6557a2f5595cb4619af6bf9242ed9516eb4783c66c537fd49185f0511bf3f54c", - "b50c058579b8c010daed83b52cda600579019b8869e208fde618f3fe11265ed7", - "ed6d76b105158201ebf349f4b0f3d34a6c6ceaf11f28e99aa243f59c8c660171", - "d2566ee491bbe740fb3514abf8a2ebe1531d5d72b72087f01b6d587794af3b59", - "c730652fe77698faee863fbdad125d6339a700f6299715a4ea227fa2bcce91df", - "421319f34600586c98ec28e845d0867920dcf98bc801c584a3bf2d433650336f", - "82692631eff6ad33ade30b1422e59a3783e90336a337d86922543b3e6428f039", - "6231445b8a4d903c38aade184cc411acc266a5fa701a3b8f03abe9e479527617", - "1cabcc472c911161748b78ddb62f8b4866548c6799a2795baa7f90d5303e9243", - "b3f1be2b892ab1dd6c1495d30650a8f306efac046e5d22fde504c94b44a9aaee", - "654f1507f11a2e7ef15d79e374106da92e1d1d33f5006e00af6f195d820bcbb9", - "d604d049a913605d430687db639257517af9ba544ea0bd1898dd1f422d07d15a", - "6082db4dc3c686d3ff48a6d859990f5bdf6d153c799034c3f4e8de5a01929f9f", - "830b445dc36ca487df8909217088c36c32be858aabf2288ed77f616951b4240d", - "b60e0c40eb89cbc38d0bded0ee6ea3f736f406d000cc18999b10a320270651dc", - "89a69d51ab6d3b512018fcdc4acf5ffd41838823656750af8789c2945909788d", - "2a22182dcf15d199d2ed2834cb3e4a2d5c2955fa42efbf6751c04eb2e042c1f1", - "1cdf6209939fe99f3283fc259be2ce83f8785e783b3daca4f96c223dbc001b5d", - "23202f05aa6ab50f8ad175914e89313980e643208b9633a27333de11875cf80a", - "2267e1766dbde6a72afdceaae730321971032236e8ac27181c8f3b5e506e43d3", - "fb4a97dd46d470295630abeda4be7feee3b2583971806cbb308499174b9dd8d9", - "fc0195568bcf5606c3e32ed9b322174c94d71a79433c268f983a6f6e31461bed", - "eb54855c01eaedb0cb6f19f9a42eaebaa076885f971a5fcb8c52156c5eecf05b", - "a2ace45333fac188eaf64da86f52fb441f6fcc3ec0faf1b5c1bbdba657ea87c5", - "36a3016e18c765643bc68e4108a60bc7c3f72cb532ad8292c5f57160209c0982", - "3090dddc9919070e7d065c2207c5bd9bb7ed0201897c51c875079fa3761b7ad7", - "b162be3b0bcab891956ce6f3dd55077bfd62f2c9776f259688d1870a00782d02", - "216e0206cd754a71be3c26bdc7ed46ccce675681bc4ccf533aec76a45cc20170", - "d78fe8a964232c507b73512a6cd695d0845cf65cc46a0cf948977c2ba96951c2", - "27d6b68c4fcd1f3e785fdfa8ad6e7f8306b853366b19b4058d7c904f7dd70613", - "e599046d0336ceb2eca75e62ce023b0e582155e8db7b5983ace58bfd5de490ac", - "53aa9a7809b22623c3198520bf5f7bd083d7ad3a5253644ec524d9357df78b28", - "885d34613f7345cc2451c068501c6ee43f8f63fcef28876cfcc8de890344651b", - "b34b02201009ac2ef1d5cbcb51e3fd32ea05113cd85db0d1d87932728bd4bb3d", - "580ae7ff926ceca4dce0f6374c49b884212b34f2cea7721d87129fc67134905c", - "b1ea722febfd552395d406027edbec1c8ef548c6b9b92156d3c7b52bc9e77358", - "6be80a07f15087f21de03310e49f997451bc4227b2bcf26d70f5610a5d0aa7f2", - "64b51c63025686a659e2cf50059eb35e24aa8d1a1bb61c17539b11889e7e4d58", - "40572260decd26934f7065d0c0c0238237d52e55f0ab716d3e70d26cd2e7fcfe", - "b270797236a1c162d8da4e611aed551e65fb0ea326d5acdd40d61eb05be6bce3", - "8a07981204a292ce198e71606df8401f98011263d3c73b96834eb4dbcfbc0133", - "2457f07887ccfa2993f55d4fb731b540d85f7686c574e65336412442a4096560", - "22576af9b032077ce2126e3926bf2b67c31097679d76fc0e8ebb059a1c757dca", - "31f0201dcc97ea6a62dd57cc3e294c6cccbde89391515cad930f7d01ac357e4d", - "c07a3f10efbec6b2cbc21cfd317e076a16fad5651d7038c1443611cd958acfaa", - "ec9cb6b978dae8903af40d72c8974d4810478d6647138bba959a18bc700235e4", - "397288482aa06b2cd85ed0add0fc0eeb5a2741f37ee4e99f2776d321e87487f7", - "84a80242a05cb527bfb0b1f763e5ccb4f153584e52ab6ea90dd6ff8feecff93a", - "f7146427362e76c1a8498dd3fb9ab2fb389eb7be9583c16e1954e00666329661", - "8f2f49b49cba1b3d1e7d96154c8ca28a3392912deee34511d68ebda60c7e0c72", - "6d8873c55231ef4891377d1963a7636646a51ae32cf9d751b4618dc361bf2a4a", - "505d1bcc19fc7d0d7d4ecf17b899501689b3c8b1e01001c96aa4c5da40edfeec", - "a0240892704d737317950449353fea4cb092e7905dce9f00bfa82983cee66a06", - "a3c8232b5dc822169d1b2b40d4039d47bc01c6488f7bc11f47711e73f422bc6d", - "33cd765bf7ffa298095701bed87a088bd0fd4f691f4fb10b406fee3406887bb2", - "a17b72ed71f1d810742f9d332c33fbe0ca2e7e5d7a63b79d247d70da2a3c6998", - "f25fcc96cebe2c04d56c1a49d5fab374ef0d1c09350f133d16d0fccd4922e499", - "958b9470581af69341c7c038cef97c06dd6025487f82e791c978936b72ef6761", - "9477e6205042eac03c33e197249bcdd271f78c0c6958f852bc6aa289beb04452", - "01edb8b373dc333c22f70d8d510e7be2a4221dea1e6e35d809753260feadc20a", - "927384f6bbd18d8bcfc54fee23ecbfbdf9f8334a3c1831abb26d36a0e27da5c5", - "b1dfa4f17375bd5e65f1ee7b6c5d02e3796ff4e401392022f91ce01fb2babd14", - "849904d6c7290b7e7ffebeededded542a7e799192ec7f5b8b188b1ae82bbb144", - "2155978aeef07ffba866220f947eaff4df36f751f9e3947d6969668ed94ac3f0", - "e1b7de82ad03cd9628963e0ff8f3254121ac84a03a5d8cacc4fb8b3d808b6473", - "0a358e6636424fa77818991847d8e5b557e087b19d373fd0d71d07997a5a78cb", - "5ee7c193ef55e8721e757d1a1ca4f8badbec9ab416175e4125d0e148faa8e112", - "09edeab35c3fa5896a7011d4ac7a53250021e6e3dddc63a9ef49b87bbeef332e", - "5e1fd356be5f67247de80f5e40bbfd2df2ba7c0a655f0b5c37f0ba340790a6ba", - "1b46a0c9ba74af74ddbd681d5e49c988c8a1ed7b94c2969661b6a018da58d83e", - "4665d013457fa4df36a048b9c32aacef4625c33b675e85cae9ec4639051b8b14", - "1ad086fdaa00b0fe2a7c162b6593f22140ce0d7ef133c9eb354a437745fff2e9", - "7213f3a1431efc8c4ac6d9acb68e7d9e15295b6af48343c90b4791afe0b1fbb7", - "90d9f0a2ec9d542cf7a71f11db6c93407bfa6ef295a6b7c2547dac2b72cce607", - "430a7c350440d7e51836db677a0755f9aab00689fc593b07344593c4ffee14b6", - "d38ec257a7a8ff77f97bde141f6676fff015ed52d9a0c91db3f486e5f36ffe3e", - "a2b6b1d9cd2cdda2cd949cb730d43ac2f41d1a10879ff34973c18d9f50e90f3a", - "03544e43261539fded9da3a13f143f261ebe401f9e16e28b7bd961295e559fa9", - "3730168b27f57bf6bcbd6a633541061dd6db34c0f1bb74df59864f8b3e2e5ad1", - "85ce3cfc1597860facd9475a233a437d6216ad7b812f7af6587914c7624aba2c", - "453adcb110cc315ecc33953444b40bcfdb502e7c40f19e738ea11cfcbe229af6", - "6fc90a6a38e243b61a2110867e3886d78e34cd6fa692e58c7c1f733dfe724d1d", - "a47432ad74a0080fd2e945a977232d31f394e5b4cdc71aeb99ff588c950ae7b9", - "3489ee49590193089046245dc1357f2ae536a0b40d289d186d46cd4cdc6317cf", - "ce746ad5f4a56ad400ccc908494bf4f8c65adf0bc766aa630b482065ba8624bc", - "2c03ad4ea64a37566d0e4840e7483823831713a6ce0a478eac55d4283e8cc9c7", - "9d3c62c855febd8f7c21fb8c3b7658de28241035f70afd8a5100d19eaf2e1947", - "f9df11b6f41af61c65db2e715f864e87c371a75a9e10defd0114793a398b81ed", - "84984b1ab56475bc16cf6374a7ba051c0b40e6383592761430199637f79a66a8", - "c57e66a14686540caced0e94e576efd4539377c23576df8e03aaff957220ddc5", - "20eccd1830ee8cd9ef07997c8414442160509689f4f725c91ddd2687343a1c1b", - "fe929105f2f7204c849ad3c3e0e6a543dddcb70ebed66ba34135fdbef3d941d6", - "8085047407d478cf486be156de6288977f5c9d2ca1ba11ad8cc0e7f683f91d12", - "53947085750000ecc039800dcde8e4cc99701ce5a933f0d5beaf9e4d6f753e76", - "29d3834272e29dba6cc169c149a62b15c421ee99d3530a6fc37297fe62d94fda", - "fadc1e2f0b771aa03c4025ebd420dc604a6f86ff27cfff624233658928d8706a", - "8e66b1359a4ae77bb4a831d8b745d2eccaa1a15a8e7d64711d2e06ab9f7ab69e", - "e73d1e372a6bf1795fac88c486cba1156955d73795d6e4da4ae19265425a1166", - "8ed6bdeed243ed976c7b0f9915f635f0fe5e06fb6dbffe70d168363ff95e74a9", - "46dc07e2e6bd8ee1268a73f1e7ae5d8a58f0d38d54ae5bbb4afe545980676e99", - "404aac0dd240e33e48c6abdf54ce37137d58082fe913833eb98c85c53409275c", - "67178079b1db21855a9d4843b6ca1b8d302c521e36a9d251be2ff945ad0d7fc8", - "b24f2652921981b4aa6c5f10f8e4eadc55d857c03cfdb9ab1b85bcd0f44cccd8", - "c646da31f4d0935df49f42740dc4b0774b19ffbdd4a991e37f45a7dd889929d3", - "6ddee499e0b7c1e44a1ac10ad29d5050fbe51ad8e9144fd467888b3608230cf4", - "34a5854cf393ee9514a799ed047cc0c8c223383ae0ce274dd1d559d269e5cf0f", - "4a03656d0c8589d2f1cbca0d318be3bbd4a2b3fab481b641019d4f1163592997", - "93afc13cddec03c59b1c60c65053eedb473c0a7dfc294bb31574a3411badacc2", - "9b6c8c3d0e68c9152bc69b2e80c4baf4f2ef2ab7c7514e53ace491ac611056f1", - "349a6504d4ef619d45fb4eee6e003076ba2b7f2e228b494e1567bf15709a9611", - "a61e4c5f39e9f0165b746ac521a170d5643832e84044df66bbb77542bf5892b5", - "86c3d2c6aa9a5bfe22076675216edccbd12b42e6bba39e72bec002039c053a3e", - "4171d38da24eec53cf2c280d2329d43a49f40d13df22d4e588cd5712be747f94", - "0a6d8958768cdd0fa17f388dc92074e1b356487b734174d9048b585f6e6b18d6", - "7fc335ee63db022bd6dcde90dc841c614ddb2c2a05517c8d503bdb37de0bcf65", - "ebd2a6e0483f6d4aefdf5575cd4b1b591a5f81aafe089e152c44910bb33ca083", - "2851675d326b634826f9827cd6213632c69b616550b6892ebf42be6365c0010d", - "bde467076d0425bffccf68bb16fdc5ff9cc36a838fd282e23160c72c2d8306fd", - "5dada69e593eb66001fd1cc6fc355d6aef187e6500975d9078f1b81b9b84d63b", - "a82ef9c5bc1d6e63a06e9c77032e12c3977348ef29f1918b187547665db13ad7", - "cbfbf226580cd1c8989309c6eec92ef5e17054956ad5b47f4386ed06b62de1bc", - "6847734f32ffecbf16a663037206f25724c89997e078220d4ff0590173f1c1be", - "b2fed5a221c34db345c21f496ffc71241e330c9bbd1299747a08210914839bb5", - "097de21d10cf91d50e76eeb95a10ff20b484cc0c124e29b26f5bf434644bf9e8", - "49b711ca29e21c728fb10d8675de4739f93469f73ad975e9e433f7fd9fcacbdc", - "50bd04e426c7a7e05a2aea9374bb7bc7055eb91d61cee8bbadaf3d84d71368f6", - "8a644eb2bad701d946805e3b23db3e041234e9bd620c5e2030df6269837673b5", - "2712e78510cae20c1a4c0cfb51e8d820070475d977e8c75f4cb1bbb6198b9582", - "323501c367f235945a07534c9d639fe1cf97718121b7b8829fd91a5b2f31d7ac", - "174bdaf9febbc764c0ecab4881ccf9c22e567624c7a7df3a4cc9a2b549b4a01b", - "90f6a9a48def35b3389bb48603b5e026157ede55be5c46ea02d04e691c090801", - "23689dda8b6f5b80d42fffc8f666bc079348bca3c3ef3648a805243c1e973e06", - "3279e147618a9922cbbb132caa2ea192352507b4385982cf42b8f1332a809328", - "131b3a2c4e24041114d5672e836d56f29af43e05fbe6039eb704a5436c0ccd4a", - "dc2ef3148aeac23cdaa85f3129a6862f2ccd81e3135f77541618216a8e0b9fcb", - "661120a822caaf090dafcfa644aa5ffc98de6a34aed836e186a98b3fe9b45393", - "bcc1705c60cde49bfbeeb319226e581ded86c068f0bce60d60cd0940a95a58d6", - "8403934943c6ebdd7bc711a36df88a94ebc36adacf0f3975c236ecffa08619de", - "76553362b24ab4d30725e17e2d9fd1e15857e027642d5f1271d2cdb846a1d04c", - "b43f5f6962f3980a1f80ee10aae757a46b234cb7058cbd2d9133c0ca2964ade8", - "208f44a91345dd8663a1507fbac850e969d7d0124cb02bb857887a21dc5b74c2", - "d77d22b9f84252a4f1530ae826dd3b449d35007d9671db6374b676ba87200f03", - "53075b32e4380e76255d234edf0d52c57155f0be23d719a61100c2d3f43fcb52", - "c5b97fab4d185f31dcf7e5698485eb643ff3a7b4c56fdab98573e4d7a1f7da96", - "3f02b7931191a792763b3a16b2134175e1de5040f85908c41c03ff20244ff6a1", - "d08186a0a106c628b552d00ddd503e777893fe5c29e5fc1d8ac45e4dc00348b6", - "9ecee8e4f066030abc9e61e5f211cfd2a32413d6e93153bc36b0cb76799d01bb", - "02d724d9e79078142e9e75c51986f89bc960aa673bb65f9074f6b7b0c1af76b4", - "2f6b9dee8b449dda8bd073ecd344a48419029cf9c5ba8ad0d75a1df0e5e99173", - "a97272b462781495345fab96421b786f09d1bbfa57536a4b0368aaf40f03fd03", - "89a271702f363760474c4c1b7aee2a9de7056f36e206077639b1ad88f194feb1", - "234613dbafba1001100919c3f1e6d355f89fc17780db2effb48e4828b16b1f7f", - "d0f0f11dff5030ddd0e4a16a2f9fedb1735642c9d3690c3fadc745dfaf2af2b4", - "34892c0f60f3e4210607e420b767e724135e37a67417325b37592589d511711b", - "0ab2e7559fc7e92370c301add6d5f5c1c056b4d8fd4d442a82f99148ca9169fb", - "19c7a26061fc80146aa54bf9862de7ec72f379b89912d2573845c03a9b4903b4", - "ce33b610b6bcc2178810973fb9d67476b2f4bdd1ff37a4f808dac4e4f1ec4af2", - "9e4268acd1c2a549aaf3f9a0280f3c10a037d9f0a3c572ba38185585722ea6b0", - "cdde5fadbc2e09196e2cc8c33c6ca73765fd0e8d2e53b56450eacfa9e78eb88a", - "8c9134e543152e98f238eb54bda4df79a0ea5c4a43ed69576462f8de28759da2", - "09646b3648108176cbc65eb66e79493947f3ed6ebab6205955498903701d79f1", - "962e6e0d0407b93b6f10c551091686899046af50ea9c5b4f92a6760499296b20", - "6f36d52cb1943c08c62fe5b84666d97365f15da323e02cb1b552d6fdba4901fd", - "459e97ef67223681b81e40bd2f8f0d10865a400ce53191aa307af145a73f149f", - "12dd0c9a78b680f9aed0c74d0730e1d572e2dec6b837f71b37a201f0a7302397", - "e718177b136898409d954024ec6eb86c273bbaae5b8d964f876c5fa01391666c", - "7883cc68331d5562092b6921656acbd2f014a925768162691db8f0e2ecf780f0", - "0f94f6faa6153ac5d7614a06a2b5cb9f108e5d6a8f15393c8f9b298121d246da", - "0f328d2e7bf702914f9c8d14b8da7eee58e2c0140ac02dc496f916b7763fd64f", - "9f4ba64a4ac7e92653f6a78d1c4e3484762ce9b3b56e364988a8e190b64c2d9a", - "f0e5c71f16fe532789bb58d12b1e174396f95168bfe853d8a8e2b95ab9331702", - "50871597328f040923ff63088f533bac26cbb7c2ca34385bf714b9216d46e15f", - "7e9695651a3bbc652e7d2267aa36c68dc74db0afa7c366659f89ff6f642e6145", - "d11dfcb5f14412d1c53fb89c3caa7f98d33f9709d192078756d3ed694671c13c", - "61e58acbaa1d062004a8f0fcc73ba6d8782589ed417cdab4eb3f61a2e1cc695c", - "4d12a0acd73abda0086c51a7fca907e922e6d75cf2e8e286d995c76e0f78e9fe", - "1eb0a3f446cbade0d993261be8cdf75f6029e7ed9c06c5d5ac83a783eb1f515f", - "3e39160ec0d7ca2cfc32f011c53d6eada8b67bfffd537e28e86464e7a0fbcd81", - "3feca391c33e503af0857caf55f664c76f0c5183586b0deee7c5aa3df60773be", - "4a50cfbb3cb69500ce55df58dd3a6536869a208aeedb29b8acd290a207d91d36", - "ed505e5be1d68c861edcd68a853b66fe71257c5fa8c185fd760da0e4a0403916", - "b787f69515bb4f485b30079f26b311bbcb40d9a82a2ca111d55515050ff712c0", - "c19c34f99e182e2699c64e67c63af33d39efcc9dd7cde3f247ca1dc4c2a087cb", - "82b26f9675af4af139d1ccb43d6fc81ae4e2b9deaf919a670cb56cd5ba5d50b3", - "3d23dce7c0ba33f8aa2af762d875aecdbed365f1c0a93ad2cb31ed92fc35c357", - "aab7eab7066fc9d2c08456f18040e66934c5e154e63b1664236cec19f4b4aa6c", - "505496f091cb1bb59fbe88a081c6fa46eaacdb2498e7fe8db1b12f2c01acd9aa", - "c1ed1a09349d4b1f729f561a91cd2a83d24c569a3fe3044ab671830dea4b048c", - "81b3e5b9a68e2805372b879cd0e51d26fc3b5d875593839e8726e9f57d74c7d5", - "47bfcc7bc319d21724cf367d7aff1d8b2ef3ef6b211f7dccbec70005932b7edc", - "5ec9ffbb7d1a2d7dd274ed0de4a3ad19fcc6e707bb85387fed48a5df9b5310a6", - "4791638d4718ee064d0c48c0f3ae00c55b02e3cb4ff6a273d02074cfe6d86b4e", - "524c7d23860714d7425adec97c3d7806830b55da69ea43c35836f43a338abcaf", - "f46ff1201e9eac557d41f5f95fff31133be9baf9a4b2b46c7e587107f2c3faf8", - "09dc30f9cc1ebb654ac21e92417ad2aab64a5f8cdcdad4f60bec6ed6dc07bc5d", - "c8098a98b82b4a8a408fd71082fe3401cd3ad8f962f6abb575f5480e20292bad", - "d9b068a193a8774b1ed7c80a47c5960e752fa71871ff06fb87434e1973bf9fec", - "282255c9af4f82e9485ac01d5cea8d05bca7c56c818cb75962227fc86e79278a", - "fae6241d49b4b5d4ae57a9e24b2763f50e3dec7ed33fd17878d818c8022f300b", - "e3108dcbc8341ce4ffb555fc1fa5b14ebba5337f89acf3ebf84dbc2ccfec810c", - "0ce59de2d2acd487ca639a65e36516df0e3858968f0ce0d42471345a4b432f2a", - "0c92fa6fc174a5803f5a290ea8d672eaff8c9fd4b2768b5af91a68f47bc2999a", - "6ccb884533433a40200151025c7a9b80fc20e02c168d7277106e9096b4cf0fb6", - "34bd67e7b52fad17171f091087555c93390817b9a0e204d977b5d4f784280ba8", - "eed53a5fab02340b57f127be0758e21fe9a5c6dbb07257c7563b85d565114b53", - "fd61ad5b4f8566fbf3b04a0d5e31ae3d8d42f52dfb8747de5de83d028b5fe0f1", - "6a57b0c5c3ca6ad32f295ff833aaa78039faf3d079c71e5b5d3289f8f980ced7", - "bcc391f3d67bffce2b59f1dc50ecac8385abdb72f403d386e534596df4ce1409", - "80e05d968833b032e01a8546a34f1f7e22b550e866c1a895ec70cdfd3f6df8eb", - "fd40428b3439a46ce8bab8c8ba71747686b0c2b1e15cf1c04c6dd8dc502db057", - "844b9ad10f3297e7c40c6e11c88481788362a6d12dab529845c06d20a63d5bbf", - "0314ed97a5151e606c367672ba01a1196ffcc0fea46619e6dd8a9db9f97994b9", - "739dc45f51ca17e525e8d9562bd7493c35045fd7c936d15ad447d3fc4ec7b35e", - "3bc95a3d08abc4115c45a02ebac6a9921c25a64198716dde0af4ddf69b9881ec", - "508de24336c728da5f76551e431c2fc974e9f56f7facb5d283cd6cc40155c752", - "3335c5174e21f097dfae2e00b02e2ab4c001bbcc81d0f801ab586abb3588509a", - "00d2262158962f2a7d19a44339f66ec7005adaa035b4924f364a147aa8573039", - "58572b1781155d436410bef8c5f943e5e8b8b9d10ea20ba67712f1e3238accdd", - "39e22c917af57bae04bae309562d647788fc81511ccf8f9f048732245d0b984b", - "f13c3a218a37a463e599d81dd7e7700ec9d1e5f0ef75a3505db9c49340942322", - "9d2210a13a62ebe2f07d27172cb3ab419a9271a749c2bf9f4b52876a8a1d68e6", - "175e280dbe6f68bc693c202527ea59e4a96242c556b176d8dcb95a0826b27414", - "0e22c5276dca1a50cff438eb6297ece21d8564acb03ae8e2c5be0c7350e1b84e", - "7e342373efdf6ecafc12619463790671388b9ad6902bf86bd82a83a45de1845b", - "cf7e891aa05dd52ac2462238567a960b7268bfa0328b09c18144e162f68ac5bd", - "fb8602a11710decf8b22d016081b70164159ce081c842332f850d891217b38f4", - "17bca938ec52fc1db7716693f25087c921d52c06639e51849d29f5472a86ab18", - "ebcd62e19dc2bb5937296f8b1246c956e4534e530bd7475c0a55dc1493db9aa8", - "0586ea45691911789662ae16a002cef835d536bf001d436f028bc62295bed001", - "4e8e830edb45421bbcb09adbbd169998c3eedfb3276f9be289607ccc750ed9b3", - "726ce9c43e679588bec2ffd2da7be8c88f94a93276669dd6b69bc7b147b18b1c", - "00f25b86b3330b7e07cf4a2683eafb4ec8492276acd9f9914f55eaaa13161ff0", - "09fe6a49c969923862801df90fa9c9c13c65752fdce33f67064207b608b07227", - "460ebb7fbb2dda157e67150df8592825076351144c6112fe93adf0cdafed37f4", - "85e4d5d499615ca8d012d4632ca5ecb6ff002a775982d87ec77417d07e167de9", - "e7d993e490bc6856cc4235d1070dc14d377ddbafb348cac9f7a20fce9baff203", - "3f6462a999cad895792fe2d637c1e18252e97c3ff743d9b6a1b9ff73dc803d0f", - "b9abaec1f34e9a9ce0f9485d4c051a86d0c1ccfb5906917e18f4000f3cb6c095", - "583fa7aa7e40221dbab930aed1e3ccbb0dcd9e468e4abb805313851e1323e9c6", - "3e43d57570ffcd61e32408d59e8c4132f4771c362910d474f7654abdfdd228ec", - "767d23ea4c2c4d8306c702c6b90751588e2889971ae2a1865d5d16c12abcf4a0", - "a4a126556b12c4d2c3ed31ff3c7f4f1493a0d275e681e7a06576a2931ec925e3", - "95f80ba0b7e28f90cc99243449fec2322bf49bc568c9a2e20c2790518da9b786", - "a7d99e52a18a98ed88d8e4bfccbfdfbc5c0fa72d5a19c1d013d4447fbfe150e0", - "87466050932ef2d746758f7fdd236b481abba494ae22da5f07107fbf15a5fddc", - "e733647c4b4363a5b660f8b5f46088fd5c7a46577570a912fde5e47663dc9664", - "6dbde1e9cd0e27af1c0c2276a8c57ecb28120aa602b6a0c8161795f154844f4a", - "14619265cdc9fbfda41af1fb1248ea877e065a184096bd4946dcfcff4345e70a", - "ddcb48873f27c11ffc910e661d622d9c12f7c0bceb43119e3bdd697c2063bcd9", - "29b4721912f9aaa2d2c89fab701000ddde5db41dcf787c038895763ed88ea123", - "502615150915933134ee1d3e0b37ed20f3b06779d7cd5a676f6b7ae220224ae0", - "896de75200b02f4e72946a6ee5fa2fc987a1b70d79d19c3780120be95fba74b3", - "b6e721eb31c36b251ffba9c81390f2380c4fbaafe8ec8fabe32de5cfcdd4198a", - "ad200c6416e7b110f49a85f13930664766ee8aa1c29a9f205a823b09a73b565e", - "ae6cef1e469189084e422fb34d39fa3a53acf44c287ec4821a9fb996338e19cc", - "7f76029cdd57cd6fcd41308682857bb36364a0a8cee78bdfe3feecce4daf0c4e", - "1db81be0c7f54aa6467c72b083dcd931036da10ede80a4ecea0f2d2fb5ecad39", - "cf166ba752ba5ab345e38c607eb2aa7136edb24862ff38f481bc053e03482728", - "2963c6106976c4ef9189b7b1b73c069512dceb1fdd9b9352a77635a5a49b36c8", - "99ff8346322a3481fda6ec7c2d207d5829668fb3dc440a7147a46ac6676192f1", - "80e1eb0148c810aed8263151c67cc37d05b78c0ac9e934ff4e32c84e8f79a0d3", - "0019009604397591d7d9b42daa6dad849b70624806db892780eb0f9f4a04330c", - "876b5ae1944611c4bddc03cf879865063152b74aa64a9d4b312e292a88eaf630", - "d45b1c1b9f2e9d72dc24b794b02c6c95c03e9e85c1e3170891217cea86644962", - "d01e16c663439a9581c4a111412973f31bdbf700dffea3f113c4e106cd850331", - "bf248e0880a883b70c266dcc37f5440ed7c4e77f4f8e130226c1870646eb2183", - "7b1dbb5f51c213c222a869da13d21b81be6f15384e9672870f445afae5a875db", - "fe368a4c98d5263ded98ff14bcadf21ac6ff051336cee29282aaef94b9c94a8d", - "72e638a93a4199fe4fb3b738b402d66ec0f8ae57ee061810c29d5a6719e19ccc", - "6c4914112ddf29bbb38eb97e76f45e66cfdfecd711caeab845aed4c8eb5d0ab8", - "b3970f84a771fd8887321e73968b64df16684cbcb1522bd02ccd367cde66e3e7", - "b4192f199a27e53d7292e17a4ab7811d084eb836bdbb8c2ea56621b0bd1afb76", - "567f6d4338be132195e58a6151c5984433456a7bdfb4e3e667a4b1eef31d4fd2", - "f5f4525e1ead8692d6953fe95a1787e0c593f7d0741a6093e1e1bccd4185a92a", - "d0825ac49c28d87da9c887a8570ad4bd81474342363a89a251819ba9d4f8697e", - "8f92765c6e3dcdf569846476af136fec860da06548d9c07e79b9cf7a7e1c5df9", - "8a46054ca4b2039340d28d32374d054eae013916f120f2a0fc28ed91250d4262", - "ee35c1f3d2633ca8c8c53e5d2694bd7ffa2faca382331099b76faa8393f67668", - "67609c28d2a238bd7a5b752d74a55daebe5477000b0422b9baedad5f497a8835", - "43064a8cfa4fcf8007279bb0a4b402017b803d87b92d4699b7efb6a4a5914eea", - "7546886c7c1868303e7ea3a28437786efb3ab83ab1f6674c031c7e61377d6417", - "92e6f87ab1953f5f7d13309c2c5a8b455205c9eadcfcf6be36d243030667fbc5", - "dad41e51e837e050a4d916f548011d72d6e55a6e0ed0bf63a2c9a16e23069e6a", - "f1f6fa891aeef9c4bb7342d5dd97737a6c6a5c65fbf81f2e3ec175d93feb57ec", - "b43cee7a7d178c8c59ce9ca39cf72afdd5c5782796857a42c055bde5db2c89ca", - "81e747045072df8acc37c90da51c2a952b042ba108e6b7210d356a4aa52522f0", - "edb3a5f3c812c942760190a5838c2636ca02294348f117868963fd3fd6f36fd4", - "5df6dc4fed7a0505bff3f89ee476c011333a615217d307a386488dfebaa6a0d7", - "ee7fa0690374466315908442de7406ee684cdd55d366498516c56ddf7bde9342", - "7886926e382b3efacd0690d82a2073c51c577746d7ccaa01aab142424941ad32", - "5126a65500130c2656ab88d5a4af67b7298a5aeb21dc63c6e70d63035a169b57", - "92fc6a2d80517ae172abdbdef0256765d3f04f353cf6b8aa708d57c700430ef7", - "713119d86ac61193864e0a8b7e895b743509d8688b9d973ccefa97b9e86a76fb", - "73ab705b8172187615537ba6cc3a20203ebdf26ac86553b0ce7aea26db34adee", - "16f3dd004791f9b333aee3e8bc862bb59de01555bc72e45c8269785f27616781", - "07b25e48c7c9665851cec5266789dfd236b43a1245e2ee64c0207faae2e9ff1d", - "a8c5c98293cdf1add283d4067da61b174648eb200c306ec2b6b950071ce98b7a", - "99323fe6d1c69c5c391bc5f1541e4d43f491fd2a31770c08a0e0db9646871b24", - "501bdf3c577cf9d17ae9f27e38f7599506e22b4abcb5f6f8c63a7d395722f134", - "bab5b8c3661576111256b210353eb3694cbf247c40d03132af8a5e36b1bffb84", - "13fafb5230ae0037947942a26811d629eeb9a654fe1d2fc49cde5fa44bbe4d6f", - "b456c609b0fbf98397ce091339e9ab23de0752aaaadb9a1f4c431bcc345650dc", - "f2be6543709d847d2c315f18ffa126ef2c8d8cba94910c6f4b467660d1503309", - "75082d674e882616b16c6e388bd4973433cd8cb332c4d5adca8691dc6f3bd3fa", - "cd9dfd368c02cd78af26354b0ab6179abfb3a4ed779ef773f005b2a6874a614c", - "2408749bc3ceb6411f75dc2bf68ce8fbd2af36a4dd8eb9b0bf6d519b18c49431", - "45a857256fab7fd5a860bcc1fbedaf8fb495995d429918cc0e29d2f0ea22584b", - "91a4b8e8750bf304a939b93ef9704bade7ca661eca4b035f1936da5085b29ed0", - "cfee8604eb35793b69ff249f15278c47112f78acb7d9b2fb309274a2eedd4b91", - "34859b2f4002ad3a60a8fbd1933402e03e2685d743a3e80b12c75398d035aa35", - "1e6e37fcbbde4e89637aee7c8d34ada6be6a103cd7d090e55854a2deb46cccae", - "d5f66ba1758266eec2571151fbff3356b5fded0641ead69e0da0db1347933a00", - "b330e9e4b390cc6f322f42ba73da8d3d808dc443f5433e56446962138f2ba66c", - "3c503448a962212f8f7ed32de7ba21644101851c7e640b40be5c5a022857002f", - "d11345282524405661c949746278538a3891bb7f7dc854e8120564b6e43a2f99", - "2d5bf1b7c42fd9b0c4d2ec2757284204caff09615badad87a4e7804fcd707415", - "d1af8bde766e87e574d436477106bce8cd45c88f1c62e71eeefd601ccea049e2", - "8d1b515250a9d444879a0db2c1b2e68ab3f664fa29b998af7924e44f50e65161", - "a11dd61122ab7d0500f46d41203f8b2a1a39825af3785134f0e0cbc308e429c1", - "333650c4afae9a876caf877f9fb561f1c4ea22178e4cc6146ddd438c44129066", - "6756ebe4cd8789bf495322c9f71f5c870ef16829d1befb674fa902c113127c0f", - "e566de9bc916f976119f06d7c4ca5ea4ef33223fc9ad15155736f9c2ea4905af", - "7708905356724b08f6d6b27bdeb4985c82479f51e44c9f66b3967ff0daa05bc8", - "2adf52aee6005a8b9925a67334786bd843d7a2c9ec38f14bb3d07f5a69cc51e5", - "755bc96384871166ed0f96b1771f9460f520d58a3b9e8dc273c494bc77015460", - "be9ec1a62cdcd6cc26fd215a6652229d9185bae1cb94cc83e0fc9380cac60908", - "f0360215c58dacf5bdb881b1945bf35f29b85648f984c9026b52cd69609eb211", - "dc8eaef1209a6e36a651e421afedfd5d3c03ff5c1ada72d0007a812403567ecf", - "b15d5aca78a7a64473577b75bdb529d12c38bddc4712e0d20889d784bf8e7d38", - "6368ebd1d319aa4833dd3b790b2d26f78f138894919a5b1f591322239e74ef5e", - "bb4db810be881527d07a026e890c6337a205dbcb7a2d8e4331e2b79ffbd9a46e", - "abdcc77a9aa2b8f57d68f7184cadcb185debffe7eef87e2462ae8ad4de48fcc5", - "d4348a883ae2448c9c54125f6c41898e825b38d1a4e371d0756522423458e8fa", - "3082e520bc8454e7dbf1d39ef10c26f48d1c81c1ad7045affb10135385f74003", - "38fde8917e00a167372ed157e03fc1e54c344efb6a81922c248f0486c1b7fe6f", - "a7cdc18d08404b3332eaab4fa32578cd8ff0e81ba631ce59ee83886e71af6670", - "d8cd74694763fb4cc4a1d9b3f7f73e9b678529622b72d67b67e689188ccfc903", - "4054397779c5d5b6e851f6c7d79d1e692109b00bc595cb2715428928be9c338c", - "daadf409bc73007662cd9426d38ab5e0ca439b8d600aba7559ea758c041e1cdd", - "85436de1d2be6f8ef8c990be34cd3746c1e335735c820a0ea2d1e3f75a0975ce", - "ca607a836b4bc5efaf0074d04a8585e6921633e34e96e225ebc7f5ca00fe8ea4", - "f1aed3283a3d88a7207146bae8f1afff45ff7d6a7ea78ddd405608cffedbfe3f", - "4fc5160bfec56b986d9717666e157b596345f9b997680ca965023587b6c47601", - "3826a586970d7930e8551099436a815d91a97fb0d5d82a08a7b4cafcce66038b", - "dcd580a221ca6e72c865271026700fd0c01906286e00690ef30aded43c85edd6", - "2fb994afd509a05d515ff4324b22dc95a6a76d95e598cdda8a5e2207edaec9cb", - "5d7a2a36599f74f0d7f0b11819c4415e9b6b3a28bf306f63aaa2a1c719f9a0cd", - "382cbd4a1daa9ac24cd024958493378f5e31c8b3a24f6dac4fc9e0b6a393e9c4", - "15309bed142fa6d24700960875f8c05821855fa4f341b4b4f8f768085255598b", - "e653592c7ee92bb8ac6da88681ba8ad8c8d9ef6e693577da3e91c6ad9e913796", - "43108fdec0a0e812063d5b8ddb35b6a75f7f8fbb444a04640dd4b0af2ef3b069", - "81ff00fbb2236516237d7bb97ba01053f5921560eb8b2d88f5f99bbbd85966a0", - "8e528245eed4a30b909014664083dacbf185d2fcd98892e9eb7e20a090fc6f52", - "77e9a8447b80a24146e70cde58cda7c3f3603362521d51c19e3314e2fc4c2290", - "a692b980b02b044ce96e1ef5d31a2581aed08464ec165cd6d7cf9f62d13a6a4d", - "8b1ce1c5158812f191e7c5fa75b0a5975877fa56777a7388dd93b21f16c8062c", - "346a9e6a06270fff5f38bf70db1559848e27f0a95e7b5fc480302d9749aaaab7", - "a07bdf479a5dab68bab94c98cee3aa1752397c78094de9bdf7a5b283380f4b2b", -} - -const mainnetPreverifiedHeight uint64 = 12823104 diff --git a/turbo/stages/headerdownload/preverified_hashes_ropsten.go b/turbo/stages/headerdownload/preverified_hashes_ropsten.go deleted file mode 100644 index 2856b5c30e3..00000000000 --- a/turbo/stages/headerdownload/preverified_hashes_ropsten.go +++ /dev/null @@ -1,55304 +0,0 @@ -package headerdownload - -var ropstenPreverifiedHashes = []string{ - "41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d", - "9d4976242fe4b1a11184a253ff4f4c70fccc88ce76beb22235a3018644cf6e5b", - "3735468fe09d7a3f9b76341997a305544ff5b1617282d899cae9472e92d9ea37", - "a43563284e9e82fe531389f9a68b386e10a73c7ba9fb5ef843b6a3f0414024bd", - "0ce2aff4f92ddfc961f1266fd172cba1643c98c1c386c9d2a012b138978c392c", - "607a4617ee6667629ec0265979c4077d35f0fd8c1d9242f73e3ee58104e26b6f", - "4ec42fd25a74344bb499fc575824cea230c3877788581b05b38d0fb8b1556803", - "d2e082d30c401e7779642bddbf7b47836b17cd70aafb87ca9cbcfa270d8e72e9", - "c3d6bdbc1ceaff8ba840b5468283dd73a585f61e096cbe6b7b26de15112ba848", - "0733bf7575dd9917836456625359f4f8f894243f34287e98f519990fb253d05a", - "546f6680411da34a576117de266f2e841afce891d35848b108f782bacad2b129", - "8eb441725601e7623c9813567353e29bb374bdd2740c6d544f8cee9f6a0e61b5", - "3fdf77b244157b7d95527578c6831b9f2156d17f9b99e698830e61fd6a284728", - "be7e3210523ec75db91836034298329af28b2bcbb18d7584368650b13a1ba627", - "d8d55de2ed18c7adf53990e79eaac399d1a4ab7775383e4b2cce6d08a89c232d", - "cead305d38e102c822a9f1b9e892fa8252776db4fd9e09e1a5160e7cc87ceabf", - "cc4abfda85725a6e0e101c73e6dcc15f6a75cff57e1be49cba3de16599b6a7de", - "aea0b1f1f604f85e016200f478a89a00d6ad4510b4f9ddf69003ab4c9756b8cf", - "8cc983cc272fce2fed1e9ebb12033e7813faebf471f875eb458d217e103006a4", - "8f9aae16ffe92963fd7ae8a44c30256389a817f935e1da81f9ec05a8ab39f9fc", - "5feedc383624731be84873571981cce0aef2e1bce6e9ebed35883ef7f21488f3", - "80f182155aae24c1a91d3596ce9a253013cb33dbb4253eaadeee35a6bae29997", - "b25d17ba472e7057ebd6fdf6c3b2bc91bdfeb883972ccc99f5008f388c268361", - "477b2d733902f53a3570a3b3eb2ed8033d1070d409ad50d554975eafa88944fa", - "c1fdc3a2b5d5304556d83b332ea935a529bb9497c218667e97cbc338c7fd5364", - "66e0b32b7c56de3d82c5e2fe48c1a476313f16bb5607697034193d02ffbc7f82", - "1d15ce6b08a24d635826701e43fa7eb96f5440362d142d1c93bd974946fb6b1f", - "cb2e8f1a5a96ce36fb908a3936ef6078402579f8eb2c51a02f5795dc9c9826cc", - "786163798df3a825daf5d6a5d332e8339e0cb8246f7474f9f435b90df1dea760", - "864c2b8b6979bd7183a1a298ca306fe67a2b5c21fd9cb8403fd01b4bbe533629", - "0bb910adb871cab5a17278434222d9ffc933821ab14d0af7307573b1f4d68666", - "1c6f7a695534ba54bed078de53bad6050428cdda37df696536154348e1025b8c", - "541ec9d82615a510db5d0ccd8b15983fb30a8e20fc068a3f44f42b102ac6ac03", - "81a25e1a57d9965df79edb4633d332fe49f18df7d28c836ca9e30f12b222637d", - "4435ba1d48d0e275efb26369ef199a1593274e6c50ca447534289c42bd7087f9", - "6b5be51bbb49e22e4470f24cdc7ddd600c04870bc6f72830185708580661f476", - "16128de7e003336ccce6b9b039745c9aa54b6d783e9379716217560756be8be0", - "3f812b4ca038b4f96f83c78fdb831425dc03379e67628f0b9958afd1ca284454", - "09301cd46dfc5b32794b9454e9ee398851264385521b0936630c05f758e80710", - "06a789adbbd1a1b88165f5c986d1241f3adfd00da9e11d4db0de21ee748c1390", - "aca2a25ea3f554124d0a7718a84a911697ddd5cc76f6380bb24b8a41d4fa8469", - "ad26ca02a188369dd4eb789b190f607d4186ba99f2d55718be4b9d9e09cc7ec6", - "ecd382aade186e4fea76c3a56e25563a1f7515a724f93e49a4b904bc4649a917", - "f497d890a3345538f3b031d7e3743d68872fe66e71f658fcea45d618bc3cf437", - "745b985724fbce119285932b3dc5eee061234af0777683a9fa802a36eb61e69a", - "c25c025b7ec0ee3eb2a74ba1bc6b72559f164bc75f89b98847f4469385e587fd", - "d7bac1ec0257f643733a3517fe95bf4f3feb3bd0b6885215ea9002de6f88af69", - "83c32b9b7a5f0c3db0042128c97a7e2c089719b251c16382179ccb62dd56aa4f", - "b2916ae89073a7b4728c94da87ac937e3bbd798f49ac6b8ecae66be2d21291c0", - "0650008f4246dd4b0855111ce7ba301c6a22058bd844e171c285da1fb1ace818", - "9844880fdb9608a23607bf6865926afeeba3db8dd20e91dbe726ce9747b4c416", - "9b08778656ff4e9f02b37b36330e63296c7b7f8cffa8dff5e38bf8c9daf06c22", - "1b76c73471539108926fdcb9a19ed3a0af6708ed8435e0454f8ca25efaca3aad", - "9025c5fcfba0610627694791d4a33f4a4ed37ebe3110af0543f0004de7513b96", - "ddd98a8c3f00dd0fa9889facea81f97e1bfbc77d4f73f51e166b0e1362f9b591", - "50a1d75cc6fda678b25a4e7578b2a32c2d78e327901ec474644014135a27b1fd", - "a8e7af016e7e0ca3a8d7b6dd807b497286c546083499938bdcb27bbc8f0e5f06", - "7371d5dda0b2a9aa9198182b2c0e8b94e3a0693076f27cb8ccc1b6bff1b4774f", - "c6db49e15a562c661c431b0b48b29e226b3b531ef472faf3d554a3dab3d0c783", - "3977e31343a94b6a65620cfa8b16581804e94887ecdeccafa38ada1e5d6eb556", - "7a124f5fe96c82557edef4e5d35f53b4bef3cd09b4e46877011869dcf0e9eab7", - "80aabdc38654d6e75603146cd5173f074367f45b9f95731cebb5e2f341f1e67a", - "6dfede02bb8382fe50f8e858502e2e3d8eabaa935dfa588d1638afd1d24080c4", - "da85398c32235ea418cd2492882f336219b7e7b99ba00c9a74bcfc5ed58a15ca", - "4802e8ad661c69c0b3f29f41e9d178dac2a464440a64265b6305db3c1b6bcda4", - "6417dee6efe9cf543a83e130cb072cdce9628fd17decc387f5b974b3fa864dd2", - "9ec9934a1eeb3dfa985704b8636f1cdf58916898bef0cde32156a6f400e4267c", - "e3a5652f5dacfbb04b66622a1851f0dac65a2862065d4f10321a1cd1605f5bee", - "db1819f72d22e9d81afe6f159740cfe7a782597eb99b39994f900563be129337", - "a8bceba4c45307fc0491f53e8ea76bb7f7123c325c46aaaa50785402f6157a67", - "c923588dbac4810e02c1126be8d9a7c79680886baae5e0e60fa76d73dfee0361", - "6aeb32fd8f65f4496df674d878c9fbd90b06307d837c7f128b4cb3eb86259e44", - "cbf27e834b5ea79f4b54c9e3de7fe1607065331a950bd0e57cd3c44adb5de7ad", - "235b2f51b10196817fbe8c4dd35c58859503f2c36536fdcbc4a7e443a160c149", - "61fd57dfc8dfa8f760af80be29e4137ee31a34959f5c418f06b16a8983db8827", - "37d5f898c7926dad05251b328df325374a6b2c17b7aef85965a31d7eae098d31", - "8f4aebd49d1758e9cd5675ed902a670a50f386857696e094122ae8f551328a79", - "33510e77b9e87db3cdd2f4444af2be5551e8473be70ddac2597923cef94b2300", - "79b63967f280f96318e1cde1dcb0964a69123fc7e1d879cfaa25cdddeec87f38", - "8ec0b3c0a0eaf9512e22874e76346561e3dbeaa652da103af5a5c0b31b59d684", - "cd6c73d401e11439751a66c056417975c6cd71ab678669c8514e64603bb7d1f7", - "e9ef14d185292b6496178bba3f7f74433314f8cf4f113f8cc71923b8fe8938dd", - "122249b4ce486d76ab763fc893782e01b44afdc0db31744c418fee1377c37ecf", - "9437b5877ad748bf391ea12b4917e792660afc68eb992d50f1efdb24a993348c", - "497c12a4be57e460c843e51004d66e7a86403c5b1c33596702159aa6d3cc5e06", - "880a7dbdf32d69a1fe6ac858b5a6a58c8547c6ac44542b240ab5552503a31230", - "2eed349f54650dbab3eb21816e5699a8164042e3ebea338945283986a103dea3", - "fd73f8570537a4ae641ef8e7534bede7a6706e7aaeb4580900f27d7c511e368e", - "85eab1d809c36b37c2cf0d302008dd58e03ece3ed8d5d90e82716e7a5b5a3a7f", - "ca9c0bcc0bdb0f1952cb9092851eb54e64784339a9b505ab8de5f22cb73019b8", - "833b8dda2b8ed7b94f6fdc7fc2f30b8de498987bc4ad59086519540d1f0789b5", - "f2ebc0bcd1a1e633446f60db9f7873e056cdff51a013b4ba57b7f26fe276b5f7", - "3178489d87b4a0b459012df2e7ff0850087fd996813f3d261a69d0282691e9b6", - "7d54e604a8501c9b251ce344d36066b201d38ef3a2a700a738fbc86cb305616d", - "17292a20da648fba7c5508640f9b63413b57afe266d534b0c062cdf46b4cd77e", - "0e8d263d3b6372e422c6165f5bea62fe6b772476ca394bd5a64de9f98eb866e7", - "25e4e678cd4489dfe84c0ffe0c0ada359d4f09978df926f4f7ac29370b26a758", - "86b5c5778caa6726ef50720f5ce6684207bc4505281553744d15466a038825a6", - "18afabac1425c19f8465eeab980ff3c132028e9e8f290f2ae2c070a970be4ab2", - "b56c2edb76158ee7b76968dd4f6ac8aa7e7deedb9f8d50ef0c8545db671a0b47", - "58e8b5b3b204480fc0fb8fa744701bb4f0cd4a1038a87bdceda68e85987b7de2", - "46fe2d43d271078d2f811f48fccb21257a78bac8c165cb3c479cb50be16211d8", - "f2021b9be873776ec82bc958a1faaf23760eea46c132769a33b751e832f20be4", - "327c537bcac59f99472b042ba4fed102fba3f67648fdda03f784a58f6aacf330", - "35e3e47d12666d1653d40f8fa175095c52378ad52f552fc7b9bd76f7b6ec1793", - "ba8fad21d0981ba2596de4e8316b32e8a84e8fbce8edd99d5c65ac93cc9df892", - "223f43d05783255b0172ad64d10aae14ac49e1270172609d1920df29aff5d1de", - "f0c62927a20761a4f2b2555ad6612a7a7c59de1e4dbcf9a787dd647bd1a0bd07", - "91275971068c5c7bce45337c46d3bb97f5bb3e343d492ec3903a2a4cfcdbf0bd", - "1cd3628d2e69db884460f8a372f1e29f6f959a3bf9223e5f38a321f6dea1fbb9", - "9850c19b9a64e86dc7b0a100d5d7f5e280f38325251bbc01d70bea0eec9edd98", - "72d208b2941ca4ca1ac90895cba4410143f7239bd90097e6b9f3dbdb5febe378", - "c3467394f3a20c0945555c26173f148851f0358538f2b2c127530e1d36bbf636", - "2825210249defe873b9381dade2c8dff478a3a5fce41873761d4260dcf88ac08", - "27f72d123f3b2932b74630abf03a68663b679861da4570fdae08882860d87e8e", - "30ca90b8dc091ef4fd6173b935778da4c2602864f186f12bf3ac17276758d4e8", - "46d991942708a6f77582eef65fca901c417c8a165654778b545656ac1d8a4b54", - "a01a52416867d5c718e847f8ea61af97c2e3f4d4293867a3bc4aecdcdd80678f", - "7c26338860bfacffa23fe5783c685f71a4890130a3adc51a562da4c129b6e341", - "027ae8e6abc5a4d6e96cc05cdd78db1b7cf8d72cba9d501df667adb13dee58b0", - "a7c9a8147e67a95c16f6f3be9b44d88e175cdf99165598350c6a9f3d645f43c9", - "4739bfdecaf3cf8947fffb5557110d2328006f7b1efb17a60fafba7169b81eea", - "006af4c3c14c64a3734985dd2a767e3e31e2ed6481779087047aed15a764ced7", - "000f33ec1cf8862a047be8b4e4a809e27f5cbaa34989ea026dea0e2f0033087d", - "a81c4fbf258c4124c7fb77b506889a7150335e3c188390913dfaee385b404597", - "a74b2757a15e0a19d683329a08cd375252c5547b66a33c7d7990878b989f98d8", - "5b84b1d304b7dd380ede1eae17432d7e9edc0630de7b33e7ad4892c90940bf4d", - "f06b64b0edb15b3856256d14f4bcb40e1071a8bac7ef09e9abe2dd16938fb423", - "75217d3d971fa6dad1f4253ad3d59667b7d23430c678b764497884cf6d190a13", - "edb3b2519fc018fb267c78f01d1e33d2d93a8894eb1ed5699b0db4e761e401b3", - "d9ee045b446b8f68b2e77c65e10271c4faa543e4da16f89c545144cdf5bf4817", - "da66dc1b2f9f3d3a0a4bd296ec1faa8ebac8a25d27fbe7088e8efbccb5520493", - "08e81ff94520624d54c9b1afd06a9d28c6621a33033e5a0ee5067741709896a9", - "3afbda2f58024ed9b89c7540fc21ca8e08af97ba52ac86767d0c992c2cf2b6cd", - "ea6fcf250020565882dde96fa170d821e9ccbb5290c63fadcb68e9018bedaa31", - "a1ddfcb9c5d526d3152ed2271641f05734073087922bcb255227673d796b95c1", - "17e5760490b347d65c9b212d00baf64e46c2609e3758b0b28f9d9480ceabeeee", - "968454374293622bd56236628c749ad90abaa917b39073711b413a6c8f4bed05", - "defec36e728bd431a6de47bb1d5964785db2392a03e8af2272fb0109c42f64f1", - "c9885c4d54e8b820bcf703d405070fa66ad16b359eb2faf33d024f6827378cfa", - "f55618746118e8daf7b1e8c453592e154e0bb6bb1dbace71e547cb0a1dabe465", - "b3d5f1156a567fc036d3366946dab052a77bd02f130714e4c8be22bd2406eaaf", - "5322e3b46d9ae2ad93a71d30d0ff64ecd4f8da2a89b48706431f5950f2a78fb7", - "4d2e0e41cf18941b726815b359a9e7f8b0ecdbbe407b97f0b54d34e4143d7a93", - "3a3bd0e1b3997ee5dffef4f944d03517e19b9b18492560ffeff7b6ccc2b6faab", - "8334c4b5b10af982356c6b56aa30477776289389d974a109b9ebf41fae180090", - "030962437ca0fb6af573ba65ffc24e78cd44a59f2e9f3f57c980bc43165b78db", - "b6ecee3fb5ce45a6e634e60360e34ea8d441db29d8104bda940388669d6f02f1", - "c3dd6772026abfcb7173ab7d960f177d1f281e5c77f8ebd8051a26ece35c4b3b", - "873dca5fb4d69bea4bbc3eea9602f177d1cf84ebe6c2c1e5d935e6515cdf40ee", - "f9dfbd700759a5f35a3812c8a340b86e572cdc5a1c7e7bc878cf0f6fdff8c263", - "eef2025c39bd6b5ed43e286d8bdb70ebbe9cf1b77c90d7f340ab072f8d0cd06b", - "3a058460edb2ae0fc8df46bed66487e90405cf59b24cf017c3deadd89735599f", - "c1c8f8e1722349087425256d39c51a747e164d8998ab7f2b9a2e21dfa307ec21", - "ad3be1cfe5b235a608a85ba8338363f0cfde4e382ba7030dd0b2d9c8909a8b1f", - "023a5563ae3bdcde220291f0ec66ec9940e92c74bdc9f8e5011a20b739eae875", - "e50e14e7b1c7deb9743183e811b234147fc8141861ad15f4a6b2cebc54e29eb8", - "f691c65b68d05611aa41f04cd821e0dc3a1ad590a1aa6b13d5d4e81f1a7b6ad7", - "d816b8ec335e9c9f3dfe129787df5fd9feae973478ddbda00923307e6f8fb78b", - "f7c5e3cba8a12f8a1d8decd0f0cb9d40095c37fe743014c39fd7fd59b8353c71", - "ca948a08db57ff69de1c5f34995943305753afe9fc5a8871d7b1077ac44c4cbd", - "3848e3473cd377fe4631d2e75cb652f4dbaa2f5dc14d0ca099dd446d0c6058e7", - "fec4e0ad4a7d1f45fd6403d15a5a8ddb7d69c18f8495a5a6887de7ad3c358ce8", - "13baf216fd371038229f2880ad1c85b464e9a71b0778c40ee62a52553b8d8d1d", - "515e77e1065e0997dc4e72dc5c72e450640afacdd674f7f433c616c0808fc462", - "c54c2ee2970881ca34056dae11ace4a9048d64e8219701105a9b7f01d20da057", - "dcefd9892ce4a944fa74f27b57dc4d48230c08a874e5b9b460e562150e2dd8e8", - "d190f7c02fe84fd9533a239c46777aafa995a43e22d5775e167fbd252a0d7838", - "4b9211e06e8f975ec55eb0fd2cc7ed6d986987b11c017ed727ee402657b91214", - "5a9a34d4c478ec20c8c4ffaab4d43f3894efc1dc0626581ed16b356f703db402", - "210ac7284f773f8b3bfcccf9edd4f68eae2dd9535066d30ce335dcaa646e9fa8", - "097b9bd7f214077ed91adc16c8b254e1d83c35fcd25b6b123319268d2a2e2c77", - "4f9a83b1bfa59ab62f306702312f50cfe2e524683d96ac8fa2ff4b0ab63b7fad", - "d61225ed8e4f4b3f87e07ff900ece5955282aeb889407b09781b91824dd13d80", - "8c66f7fd1f1c3bd60011d67985f9db8070f19fb67ea562b12bbd694e8f1c407f", - "27f2db666e69f5c98d7f0fcbc7bfb979767859c14f8411b4f9ddab81be5f514c", - "c146714ba53a4ea1a2bf37ca7095be9624eeaed0a7d1aa27b43ab6ef690786d3", - "617e29fe00e0d7a3f353842411478e5b9b0b3fddc50ff1c5ad6350b93f67ae36", - "8c2f596b1403f8ae99d696243bca61c73a79824b41d82463572d1a3e9ab40a9c", - "8e3d518c57a811ba612d489a08b3c921f77cc435bae82d6fd2e7df3f7b4a60ba", - "5b3625f020b6ed03005910d2ee2c336cbffc619188d6ca18db253bc923ab2e69", - "0abcee2c569e27f4696e3105e4e9c9665ffffa672d930ee3d7c4bf62cb3a5f52", - "6dab408a2da35afa560a3804e9192d4d30de0c8c396e5debd23166f10f5b6579", - "2de275cedc43c7895b37874be91b88370ec71fa6fdaae320f847f00e758eb82f", - "d0706a48f178efecd4f51862fa1890516c88a5ab4b8e4e9a5de50a123692c9e1", - "74053e1b401fc48178f83e327581263af97c8020bdb673e5b26af10208bd5c4a", - "4db6ab944f0b58ce97cc034d96b51960558e3c880635db7fcf16377c8753dedd", - "0f33c08c7587efa4e9ca7226d182d905e86815f3d82316ea5daafbb59faaeb83", - "3afff07739898ba9506d9e6d409135d299849ae39d8f27ea0f168f03d4f2e8ab", - "bb2706f47f6e76ef5a3420764cf320abf241b368518fc2e50a26140c4610c8da", - "b4a70e7927fa8a4fc5d2167075503be0dce40c5dd15e47e9f14d61d01733067c", - "4855810a0e3afaf94dccac593c047544403de5a8a56f4aaee83f4a954c484b67", - "7e4eb433480f6e23ee3b20f1f7c2f88338952be72d23a1b7b3dc3d14b4faf5e8", - "130cea486b39c3a18d3042d01f656a6e3ed3f7e4697ec84317a02ca7e3f9f963", - "a53458b72b867d9b73fac7211b102d129a7711deea18844bb12230ac124c9c20", - "ef98854cd0f5ffbfae7e12d5635407b11b16a3c11e9a266fbb5dfa680cbad2a1", - "574bcabaf13d4d0017ceca8540060e1837c6fe352b56eef54d6089915fede4ff", - "db59694e01c6c342a3a6bae56b88482629f09879dc86847512217ef952701b6e", - "261efab7b5009a95d5d16b10186879f0397eeec8b2376ce204e93b8c54b0ba89", - "d387527c1ff706b9cf98bde05b7c1079c3f23668e7af957c0b0af044b01161ed", - "23bb0539e615017fa92bea0f4b37253071b1d87ee629ddca2674ec93f033c657", - "464f7b2c0b82b1d70360f55af220b7c785762caaf484145ec6ea96e888c403d1", - "437ed39f6f299337f40f5aabbfba28a563cf5af9966c1a7545991bfff96da714", - "76bbc9b6b918eb86b75bb399113048ff463503e65263ebdae39d1ae40b6c1672", - "e057ece2350a02cb6a5eb0e03cf03461ac4534d6f2aa84be1219aedc52675d8f", - "dd94115d18e7b5e89a081aeb3e6bccc09ed6d78c0fbeffebf76055370e89f7f0", - "423792320713eb7d5fd4b16401d7ad127075d3105adc871aac4520884aa918a1", - "4e07f22785e4836cca73235bdb50e67ad85b635de63f80b6c9fe6e27f916f4f7", - "447a0084370a69fdac0f081cdb5048bb072ef1eec21b342950b161487a45968b", - "85a4fbf3b054671f76c5751bbfb8e2b16635696d4ce399c2b50e9b0bc32528e6", - "edd3df1ca04d898c8c68fc253e340d5a13dbc677241bf2f6d48c505eb20be716", - "b4f90008a90eee1982d7156ce323c7eb9b26a1736060190b759301fefb5078b3", - "8be92d48621776ceb7bcc2f626a297dca80b707e42dc4c634bfe9770dfa89da6", - "3d937dac6ec4eb61bf94d8e1cc33949b36a55cfe616e1286ff6837cff39d8393", - "4bf063b32349363ba390971ec2274c10bc471a35ecc041dd6481442c1507bc43", - "758729cbc5b4f876b9a910731ca7bbba0c3593b2390db3901cd2c3cabf465f8e", - "51db929982ee107596542999fc47ffe7ffd64256839e0e945163ee4d24153dbe", - "dcb21e1bb2f32a54b6378cc5fdc29fda5e34eb0b93c058392d3696894b18ae01", - "b28a58b88c4114c70034ccd17341c8be1ae95b0347a360bce39236b528477ee1", - "927a98a74e19cce6561ead86ee9978d69a952f179bf8eb5c50e4ce52d376b086", - "44831385f5936fd4c7c3334e3fa344df6edc96f9f9c6603f7d4dcd9c97af1abf", - "c06a2568ac4e0430e30c5c14f156bd49d6b6bc6896810dc38eccf19b290f7523", - "fd237e4febe8ef7d89c2c79e689c4ceb1c92e6b44e47a91478e1ea0cc89b3d1e", - "abce9261caf51f2dc8e214434b2f253fd9ccb91581870a19d37cf83b1dc69e73", - "71baf441f088e1a59a1992978fad3f77a21c14540142a4e73264f745af0a7c90", - "6719cbae4fe9d481de878b01b12ff49aeb572dce028b617e2a46f209a75bf284", - "e12ffd26141940fd18f7c6987a4f666d19afc437d99bf5c1c8fb57741e55307a", - "81308e1233e353017b519b365ee18375a45242107e108d31eda9b276f3b110cb", - "52a0f97b34e54279b33422375e5f1efd090d3e39f7904197e5bfeeae21d7663c", - "d9b89fcce2d7e192ae4034079169994c6330c1e56bf70fc171f2cc852bc5cfb5", - "6ea5bde48aaf76c5fc9755a35e9b7fe0e3346ded5b55d5c1b3b01c05eeabbf3f", - "78d16292e07071803569da3bd7fe8c105f302fcf65d663c056ffec0d6e208aab", - "1454777298b47cdb2cc86835cce8389c1defdb2e1d52288d4da451a9e460adaf", - "31d11d62ef1a98cda234ed3f71417e5df3c01385b91613177eaa163130cebf03", - "52db0f7f63a4cd7cdf12725ae2ec9ed3e8d716295c942e708345cac6b92c1d80", - "e9ccc984879055265f27453e971bde26f0456ae017f4da2f003d4f43e8398b53", - "86fd797bf738d064aade618e01444e4ef399aa3c6282a27eca0d8e07dc445cf6", - "66d0d5dd1b8a435871d392d1e80e8ab9867382ed6b8d9816efdc30a41e3ae016", - "2c0f213979e3043b48c12c0eb2795b74c68d9136ab96eb4124dcacbc6524b374", - "316e43b3867f221c7c272ce0fd49e66b14160e730d66f5db93798002cb3a87f6", - "bed417f5323c1f1dca0b40890aa206b45b6e5a9f2524dcc79b977a4b51d0bd68", - "28570264328a98e35753655b59474455653fd4434b6c35e43ba5445426f7081a", - "f7596b6639600abba1e53d84d8f665ef7041a8ac7ef58eb052f994390b121e5f", - "9634fb8ddec5c0011f9958856afd53c8678f79dd9909af187b45e97eef70d960", - "c0dbeb21b785bc8a5486948b4c86f008d10b98f4f3df8d06796800447d7538a6", - "b6e9f5cae5450c38f7ac8f0ceca763cd5222a2b2f9a0a9a59da5538c3f1f4deb", - "44f5102f11074bb812f027e4d458f14ff968fff6dea440d9757e5617d5c8bd5d", - "d898a89556f963d6cd1cdeb7afbcd6813023d03a35253a96b94bb6696556d9f7", - "8343bc9c8a5da59646969c59689b1747183106a363c9abbeab676b1a0e63cc3b", - "56f054c4038378b84f07e96d75e5309062ccf8d4ef066f695f7d44db7f62ad18", - "6fb50417648b6d61e1231438a97053fa02c30e67336d711dbb38a8b6c1128571", - "740cb236e5d3864bb55be42028888a17b7c691a23f0ccabdef95eb608df4dfc1", - "36c3efb601e6404ad786eb98e4169f11b7935146c7a8f0755b51e7bc7dae7100", - "09d77383f33e0ed6fe39eb543a77b3d43f0f4fc1ad7a2dab2df0fa1848514d2f", - "c890ac6a99b84b3e32e2152e19fd4e766631120706a7e161ddc96ffb470eaaaa", - "5afad28e4240d65d5879c9ad36527f8a1d641be4888d0dc4f21632b0ad2859ff", - "7db848b30961fc261bff14e005aa3cf4828fb470632f4938de468546b870cfae", - "ea4a274b798302fcfd5110d508a2cc57b88225c2c7b22ba90ceb8292c0577020", - "590f4ed736b8be6f423985daf5f43e89c5e6c25e575fe0167b52472353e34cd0", - "50dbcc0a4baf4417b6dcd8c6d11053cffa36d8adff0cb1f57b700865d1885243", - "68d13abf7b547bedb1e16462daf7a0e5fa63f1c1d459206b67900f711984d65e", - "efdfc697d1b1b18ec75adc0c93e34f202c7be3239ed9dce0e8016a159d2e2804", - "ae87c293e0d3c9ee7b838fe9cccdc4d97ff8c03641355cc5824097e46680e347", - "dae657654304593e7778be1d8da548cd5d45b886d55e2107a4b2046071d27f44", - "bf7fa487fa9e808601cfaae772704c1bf88d1e88792c54c13ff080211ccf092e", - "255ddc93906f4a6bcdcf123ded4d87bbf2027f15e6dc79e863e2e7cbd0e07a32", - "acd56f9e8cafb840f1bbfaf1991a6dfe0f5ccf4357fe0a1760e44b40617d5acf", - "2e8dd1b82239536d5aeb2af310a632e898180a43852fe82541d1b76f3abe0afd", - "3458ff08829c20ecbb97521246935a52c612799a0a0e2de3ec040e928562f1e1", - "3bdce9c335f27102eed87ab59367a3570b679ec6075d082a0c046aeec5500943", - "7abe4ac2bd9577beb82a1e233160cc7c8dee722d47d0460396e743302468ff1c", - "cf28deaab010107f4621d504a8375775ee43e03d871411de99dc863a46f676c9", - "f07c0e95424bfc4c6e56bbb0240ba528594ac89a79214f11b5d1accedcb2ddc4", - "c5f65451cda524b78831518b2d955a8e0fe5d485cdadbe92f804681e986b7cb9", - "eca5eeabe7794f2dd07e49a474ceb138354d8d92dd73d246a77c91e7268289de", - "744fbc7ba47413115eb8780516790cff944c78a79af8ea2ac219fff831e7e3f6", - "8286e4505c32eb41a7d7e8c215b78d2312fa351428989e92bb362f99a3d07a07", - "54b3d3d41318b4d70e4a6bf1974cb32b9a3ffd64a685bb95dfa262e7e7b0ae10", - "3e744c9aa4da50fcd46868c535bb5b5f030b183a92c5f0b70d70c416d192878e", - "e842e0a19b84ad7bcfa0a8b51792ad4e0653f1f793e70d59f42a83c8f3388722", - "74705f730f2f7f93b6d74aaf59453e7a12dc0b73f25e2bba0fbf2796e980fd53", - "dc7b486ce7e3ce64170e0f46510505afbb453d5f9c5681f874b28c73a5828320", - "f238f8cda24b5fc7445e0da01c29c479a14ca6ab0036d8696b5a0344e01fe1f1", - "a1b1b0454856d69e2cd293206b8b8e72a7262d3bd42a4a96f54ccad6a4867e46", - "b6a60c6a16c34045b786626ef3c1b27f185cdd267a169af25acb1162e4766e62", - "eaaa174a35d1e135909812724c92d3de56ef2ad04ea111ab7f15d20472838999", - "aa0816bc59d483b7718f857364f2a886b4dc8a09424265d584f971cf21153b58", - "4e943bfbf03a5a0772734a8832dcad0c3f9bda46e21486cda387a57ee0df0401", - "6a9d0fd715f653287ec0aa2fdacea113c507a76b522db8734a4150de66cbe192", - "e86f8658fb3fa7aa647a6cfc2cdeb71874658464a6640195bfb7ab71a72009f2", - "b8d58658a332c646e8bd08c370ef7a5dbc88b964be52aff83e24d7709e8c1514", - "f913bc65cc20488e3ba7131659ff8ad356d1c84cca22a3ad430858f7e1b52b2f", - "b1121c1ae53986917d8cfbeaed67776315bb913ba54812f562da869f93ffdedd", - "ad0bbb16f2c471d79072351d6cdbecc5a9b31d108bf6d5c526e442ab49c184d7", - "5a033a197444f83aadbfe85aaa83d86d3c88388214f8eb695470d38cb3565b45", - "632b271fc4368d9c9ff1c7dc668559f952550430a8c491b8ba182d73c694be59", - "b87793373ea5a71c2548f14108c9c455b81fa51eef9e550dacc3317730942e41", - "560da54f1dfcac2e97e1c121220266d46e99988543f2605958ea8ec0d818426a", - "5043a24c2465cee29657ea4387742a05bdb99abcdc3be5d2f0a8e116ca23c0c3", - "df1469019e6286d2760296aeb82888e19f2cf9be949280ba379a33d4c744641e", - "76a053441e4e1db49dfeb8ab6a15a6100691b27a7079b010630874531227443b", - "b96a746da8158570e8e6078ea56c9152bb5e0b9f4e58922c5a4089063fcab9c5", - "89de33a3e809f1ae77e554ad28dbfd0c5b1b5ce096796019f85e1a9ecec23dea", - "811cd97c00b6932eb1de6a54be8d723b066cbd5cc48fb96b7262a43d2a94a2e3", - "c7dae26d0ef42f8fb62182092c069db62b6732f9fede20736ace1bfe5c050fbe", - "8b0c36ba4f714bb27ee53d5410b7129a39fba36b23fcb1fb803bd24f4c9d052c", - "198cbe2cbdb08a0637b215dfa71208e1c0ee3d80896b00969420638d62d74d99", - "94c1e79a00b59c70c3ada9b13b34830455297233cfb6094953dc671de69613e5", - "4b00e00738f4769b98aba04ac8de332a99ee16490f21c91953c0874c8c9aa3ac", - "8628ea8fd52e93d29bdbf2ae57b066b803829ccd3828ce78cecc4fac42dd8d27", - "ed109af4c85d742a90ff535ba89140193036393da9a6272f24e210b21301b4af", - "b2234e4a9d5ab4f6db6f32b4c9413155ade9ec17df3d662f960acd7005d9219c", - "27d95e8bd22a2d6b1bd978b5dc03dd75506e557baec68fa44fcc2f091aab8d2e", - "94105adfa2173ab05a845a41da58e18590ffe0d0ca1658f354027ee171f47b1e", - "9c090a596594af8b036bfe0d9b39c5703f0f5c3b5a9eaf262dc4b0cf568cfa4b", - "1f96a9661b2be51a700beaf5c7e341b6884c0a6325d190ea5c3a81285bf89cb2", - "0ede5a6d334b8754a2cc02f2b36ec2a318e1a9b921db6339d4f58ee20635503c", - "9f8a80b8f3e5de2615f1ba5904227c5ce2f3f50c0f91825c1efdb11d23a52d82", - "e6ca404767c66b0a493198cc42f1329e78cd3f4b0b5fbea83a4689a408258904", - "486671367fceefdd0f99f95d100fd1635bfbb38e7719e208f9d3be7b0a51749b", - "fd78ac0b52c9598ff89f92f53886f9899330656a677f4d80cd151f410e1169ec", - "53b4ed678f497edade32df7c51f4249c05125dbda6178f9b9d210b3f9c880012", - "710f9900bbc8bd975f8f7affe15883d05de1b47f9771c175f82118dbb4e29821", - "7c4b6fc253fec9856ffcc2a7e7675f70975fcfb728fbd3172a13a3108904c62e", - "39119aedbdcafd94592872395af8469f3d1730336e57fa402b280e04f653000c", - "07e152fa649d4cfc7f0bf29ae40b4fc9ac2d79e37845cd046fb2ef985f62ff29", - "b5d77c377fc1437ab85c4ed0392532d8a00ced14042fbfd225ccd2a88e52125c", - "c7dba89b8ad94f1c4d7290c77cda8445b1baf57d5d75801b64766714d49d0cd3", - "0fffd7b9851af40c38b96dbe13c7c7be1a8925a1dd650db250a4f2789d23c74a", - "b4d11a762cafa5eb16007f4fcff929f2f71eff7794833574aee6d1cb0bde10b6", - "bf1602c1682f3f581364b6a53bc487d633263e79c7c366aae04bdc717f947287", - "c5baa6b008eaf1e2f6998c0c40c8e8b8f432c3906729cb82175aadeeec37589c", - "602a347a037ced5568fb3b56a13cc1040dcbc38a606113b237bf4a6d661897fc", - "181d689177909b6a41a6ba99057512106f88910cd7be129151ea262b8410b047", - "2a75a7e19d61f5d1b02bcf7a456c989a9de6dba182f03bb225580cb8559ead8c", - "6e6aab4270a84aca58c99194c548b3dabc40a08b56a396e9397bf0b698844c1b", - "eb5adcc5202fe8ff4f0b4c963128d549d69860e005f8d4ee1a6ca0d669121802", - "05ba47bf65e7fcf315f414567e350e618bc48e868d7e5df57e6554840c21a6e8", - "91708f7e816d6d2dc9088289cfa847353c3540d6ad8cfd485b1e385c78deb1e6", - "7f7cb6c645e2e1f70bc3308ee1286a5dc18f15edb03e18f749e72966a83c9e06", - "a0066906d75d0766caea6402410de52de49ac237447147c3db923d106ae68674", - "69ae350bb8235da790e14d37bacb3975b2493892f3618c63735f896cbe557588", - "267905485c6a05f6f4b933ee53c37c5c99b6bd4b1b37cc8a5b5708f47056c2c2", - "726403bad2b81e012d85090c8b36722ee53227bbc1b45381e785f6a63dab7220", - "2880b1f0b2a4489d7d197d91c2f2f5098e35cebb90b342b8d832181bf73b1248", - "2f36b072dd8c2c002bef5cf7e18e2689ee2bbb7b4a570fa128fca78da1d3793b", - "ba2baa1f91bde9013d553c4cf90dacbaea91163380a6977c71980c80e2fae11e", - "5ac6979c3cc6dda4c06decdfd10d29d69c982916d110e56f7377ac2d2eb25da8", - "5890263ef21960a98d2ee385eca3ed276f040c66c38d5d2b7780d4a3e606c369", - "ea4b291587c87c5cc3ff52e67bae11224ef22f21e12b086c103c767548329d74", - "56c4d00a4c122fd5c16317d4317d2096c6910c9695a44393873fa14a430e5f92", - "bf5835a0640dfd89b3f563d1666c95a1e67837bf526e9bd604064a0f8e3459a0", - "cf482b7c1e76ece20d336f6ba3b59824647e37087f8af0b4588a82331c053d93", - "12c5827e75922a07bc9d271a0712249181667fb5463c30ff5f1de3663f8111c7", - "2b7c92d4dadd725264d9306caf766207d92cb3cd79e6be3c3d009aa068817903", - "f94bf98f0beeaa90d6ddd9b21773a77cc51603b91de13be4da9f5406edcae1b6", - "9efa5470849f043aa0896d3bdfd5a45b206af9b69690d5fda0e01dca9f3584d7", - "bef0b908dde8f11f72e95db35adf55d291ca19e3ff9c88197a5aacf2db0a458d", - "67a51ef909611a17ce28d74180592d6e68d0a444b1cf81633d78e2d4c39ae72a", - "f732d96be9279ab9fb8775ec40ae0d4d73968215f197814f01457cce3dca865d", - "7bedc3dd868dd8645c782cd9e93ba2caad3b85360aac0fb3c852508ada7aa0b7", - "68fbf3b7d908f01990eb035e40ece209536eb1c441dd0e6ab7cd0e445a1d3dfa", - "81e08a3201bb0185d289583e6702e7ef9a7cb4225f350a3014aaa268ca1694a1", - "f358517b0041fe717e86c52a0bd58ad5b37e7b454eec4f60114e0d9c804943f7", - "cff017453c2bf82c4e4d4f8b6934a195e9503baac3ef1bea488198e3965a6eea", - "a7d2364d104a9e4fcd02a98aaf19d9522af4e7ca5518b33a47d570832a7f07b2", - "b561084aac274afddc2b15ed3f0be792937c77a55b07fba571429e64bffab0fe", - "525e7f11a4ea66043e5ce311c0e14edc9f2b8353b2379164b3b84fe19f8bc339", - "4507e5bc53780429c1ac85f11b44f0123e11fde48e02b9f747abcbce785b6a3a", - "3f8b0840c9868a5830dd01319948199666f06965959eea456c61e3498a4ba4e0", - "722ebce9a9a43ee93c1cc1d25b6355db3d92f1a9edad0fea3a11d10efaad7420", - "4a24135a269c943309d18933b1dd358a8fee3f58ff48145ad051f90727329cf1", - "8044d131caa66d7ba2a8ddde3cdd0197104ea11e680d0bc35210d7c8b7851e40", - "fb922d128aa9e5a653f507fc7f827a2adcb5049e149e0ef70ae210b60e935e48", - "016a5059ca85ae7bdeda1e07e75fe8de95504d4bf48245b8812f44df9896c86a", - "af6e09061f731b00a24c78119dc5ce7abd5d79309343493a7f07f957b77bd50b", - "ba1f4f22dfebc35361748a5724d8c1b3587a86b079c28ff747bb23e35711790c", - "17a5d7e1eaed1e527c829cf3904f26ba000bf8ff11b5be171e916b0d832838a2", - "7298e029366e8b21ec3783aca20dafd3416e875f5cf2c2ac17af19b12c25ca71", - "2d82a8d21b7cac2299198f47584986eaa6d9b93af28e5028084b6ecb5aa0aa29", - "5996af654e0f37e128ce116da59c5ab3ad6564eae604ad7c5f5f57bd9970e3f1", - "7743e9a26b838f80cce942016d08b055cbb777f9cc29b2f8b639b71c7b8a7dff", - "640eee0a80074d89eee38f8bc7f47cdf2f980dbbd7b3c64ddc0c206fcb386b5f", - "cad547a74c0b17dba5bc4b638c1a8923e552bc9697b0f302688ef1535697b5d3", - "dea904912bb29c4abcdcd2ce1ed04d301c50a894cbec69ed649a38fcf3837552", - "6206fec1a86629b8e8f81b2568309ec7c7b39fa7877341605a8df323a2c0fb5c", - "b658515029d6fb3d65059968c3316253acd759bf904a7ff62db7fb76812a659b", - "c2ce1ec95cd49d90305b9e66723511d88f8b41693c0fa32d3134300c2c4bbfca", - "6ab9a562b077830abf841bb9e67ed502c34d09f4eddac85831da6fb80db11694", - "3b011c9a65a932e9d24a63759773fa43ad47378c9895fcebeb9f6da05fdedc6e", - "2e288acc38c78004fcb22223d5ff48889e9c348d6fcd2ac20966708b4d1506b4", - "9c231b838188bade07916a5e65a26ae8b5890fd0f364230217313621085af9fd", - "3af98f6d4b7241b10d63683203fe70d4f4b63b257c324b1774f345c0b23703e3", - "0c9682a405ce500b2762ccda199fcad88b8d76fe4143c54fad1d2e30f7e92931", - "c3273f59b087187f06c18879b6b5cef13ac9f7e6f79c095d3cc913f949fb80c2", - "949bac5e03c863390612e36a0aa6d5e09e5ecb00e0dbdab3dba02718f85bfa2d", - "ca730fda0f6215be1566ee5f1558f5ba240edce3cb56bc4af0e50274c316da0e", - "6a5c624c3a389f459d1e2bd401b4ff4a253b961b91d605346f514203d7796a82", - "96aa4f3349777ce560a05c7c3ab3dc1fedf2b24a153225e72b9eb90b2c627cb7", - "9008bea32918ce1025daf307714660a321ce1e6a3546792bfe4e50bb5fb568c3", - "837b09bc58bbbba6ea1a0a577e0930982666a6cf4233e4fef3048567c919e8c8", - "91b8b65093e2029f7fec36f2e1ed2d06b4a07eafc67c8a5c7825858b3b071f89", - "36169849dfa1717d26ac370f95a756ec85b3e0bb577e476a978c3f31089e81ac", - "7e50a93db4c1cd756918f668770665a078b3ee5a23093ba1ddcbc65f979ef4f5", - "9689e4fe4276144982eec40f7fd8eb7cd57d3d7ecaa08b0a3639e5a8deead28d", - "20dfd0c1dc7e61095ca2a6245d2e6948dca0cff4b46a5b0982cfae5b1c1bd1b5", - "87d41ead88db7cea64ae1f193f9ecb11195fa562daac9647dc04cc9a66507302", - "11fb22cee3cde0d879caac305f13b04ca6b6c6d2d00a59ca6021e2b3b7feb274", - "c75899057669cc5708fdf8973422c4ad4cec0ac1b5f5deb198ff2784e9776f00", - "dbb06b5219830c8d2d211fab448ca1e437bed16447f799fe6170625904e71422", - "972a09baff816a686082f061b94bf4d4feff3f6e0825f71cff8046e356f9264d", - "23dddde565eb9c984ba8d47cd64f8820a2a8773d408f56f0c337a8b940075391", - "746d975402f50820c7bf1e6361ad9d232289d68d6a9ae73ae64fdca6de77c74b", - "12cfd0b4a80d3c7bcd9b97c1782dd960689e4eba3a795030834b67eb737ebe1f", - "b115293a6ecf41a53311a6b13b1c906a47e5d8c142d77cf34dabb8894bfd8992", - "a6c2be0c93d42eb32cc13193a30ebbe4f57668714f633d570944c9639a69b137", - "3de411a4b0097cd262718a45a16c11e34af6bc09d42a7a95b5e0b6171576a8d4", - "0d3057951844d270de8124d6845c2d0e5a549734c16208a1923860e08551958d", - "f600242e7d5c98316ee6230749224c789fadd2a4e66ecca8445c377c9d907c84", - "c5eed9eab21d0a73ff8c523be914838bbf5891ae6d240e13b2f82ce0225d61df", - "1ce5e1bd7daf97bc43a8f441f32d09abd94ce48f68512ce89782f637c3b2867a", - "c4557b0abb10ea41c96e8ade2b0d654cb553a7ef2af0bd4523a82dff85ca752b", - "f05762095836c1baddb920bbcb02710e464358fffde60ba6c57310fbaa39d2c2", - "81ce07c18e243fbe7abf468b59ff37293780949125a7fc609f6dc9376f11784c", - "1f614f9e20d717244d4089e70d379677c9ef2524b219e3c936281c8e4a165479", - "625420fd17cabd517e021c8dd2b0dd5d0df90c133ac5cec0aa27e915ceb5cdf4", - "ec20fd0e2940c27609ba88f6ff2ef9a265541518f66b69ab5cda5a65d50786e7", - "c6be4eeeb892b20f00721a4a5c9f78cefc0727123e6eea64bba2bed9fde75bf3", - "f6fbd55c86e264a47a130d1cacaa1b38e8368c61996d9bdb8f3cfa9865096f8c", - "9a73e180647a13994a868fe6ac5fb1d58c5f417454b8f9c77bc8e0e8dc4465ef", - "8a4b179341a9b6a461f0b580029640f0649bf5d4f18f63c70a0af9986069f34d", - "dea9511938bd73c35d73ab901f549e298e861b2aa574360d9e3d490b73da26a1", - "ce50411007fddc6d8ffeaaed7522301ebbd8e1992011f0aa91f50dccaad3bf9f", - "e443696162bb445a82bc0eb09c9118be337cae9268c238ccbba708e4afd95742", - "3667e401e2ce93c64a54d4091cc2099a20a9a39d594c61da480ad152ca8ac294", - "89edbb6bab2692fc3348f1c9267dea86900536519ceca98156362e153ed211ff", - "42427eb98b400dd5915ec1b5fe9d77c0d0ab02e975daf453d9c8a0f8f2a31e87", - "054d75718d37d92d5108c441ee2673a5c472ed3482e093a5a225d3b51b14f93e", - "1251efcf6560f41c1f58d489c3239afa4f8c2edf95d6b4ff41fd48a00e4f75f6", - "e23833f0104ed1d53b0b5bc2639f0caaef24a6e86a7b724d707d25d7df60d6d0", - "8f4ba4dc50139014008c609b913be973b8ccb6c12483ab5c99291f2055ce969c", - "17e1722420f53a31e7fccd43f86f760f3ffdad53a73c6dd39e74a81803c549d2", - "1e27676e3ed6682756d14bed378af620de538dc3af761774063da757c12b2e94", - "aec94ccb86ed9289dd493c9e64b5d08acf5ea43171aaeeccb506ca718b583ed2", - "5406151d0c0399df0b140449b99f749addf24f5db6926895b7e7fdfb120d6722", - "e4b5f4d91328181fdb7e36fb104a2de80ca8d1cb3bb491f3c60a3f4f1f14648d", - "95f829c42511386a51f151df30be056f7d7eac27528015d3b01709340cb40914", - "2c24c0c8cfa401ee02f043094caeb1e5631658c09e65ead36ea14d474566cab3", - "01700196d8346e5eff7e966ed8347a11550ac539e9d5f83f0dd17a24425fc343", - "774d8abc5fd1c3b01aeaaddba8b9436c167e38dabb09409d384da6965cc3fe20", - "f4e49990d0e10f883284583e2dbbff110d968fc197384a792f086a6f475a61b9", - "75b9f3c2734f865c99d0e91e2ebe9ace28b0f1eb0e7355d846c09850bbea9b98", - "6ed0bb689c3744e064518f2ce7b4608670d4859f82d98494c9558521416be941", - "f7edc01b2763a2e91e3e8fb39d597b35e2f7fa27b033c2a54c993ae5645ee5e4", - "a2f6474a49b7fd2b521cc0513a60dd60644fbe224732dd065d8bc872eeeee05f", - "9c81b2c3a13ca25b189b81e0e04f858a8dc444c89c8170df3b75cb21b403cc49", - "bb2bbc8783e57290995a261ebb078ae9cfc2556a40d5f1da1083e566c71ad15c", - "3c8d58f729a801f3335a7fb287be1a308865deffdc38f65e475293f86d964b5b", - "ae0fdfe09b08f9ed43d720f6e26fc664786c884423af1587ad94cb7820a1188a", - "3ab4c008a441b8a85e71b83287918c75a91d478e72bdc4d32759fa3e7b15a157", - "387a73cf6da8a078fa46fd749ce07b4e3c0328c0f59321e83019e3b493bab7c5", - "4be5ab9d12719cf4e80b79d97245108c7e66ac5d41d82017b1d198ad847b2099", - "44cfd1855a7e41ae52fe594dcff0a415c92e22d69cd82c95ca5ce89da3cbdea9", - "a91e569e78ec88e8763bdf6ff5387b5b263433b05d60c1d7e1ba21bf32979b4f", - "00ba38b0a70abd6a412f991a6e9ca4d2b95f116e37b8104120488718b8ed85f8", - "f17daa3994d8390e5c2bae60697d988a49f2d2779ffd8c0dddbd2506691a7dff", - "2b91cd6edf907c1abc44d8b2ce7934d7064bfc606a32d01c44dec79d3f4e5966", - "d05cfa65efb76e655e9c3153e664489772ae475c191f1c668953341222c16cae", - "3324ac4875ae822a44d08582fd340c28a9bf0fdc8cc67c4f16fe72e094e271fa", - "1818cff3639c4350b0af62922864e59ca73689892d15cab25f6823a4c37dd617", - "fc0d40e0eb682c29aa14579bbb04cf7fb385768cd73245d2b66aa0a5ecdfc2af", - "bd9a42967c782039f524f20f874fd663536969857dc0673ff7f4099abfd180b5", - "4eebc41cc1250f14c735da6be100e4b5165ed630a993313ec0581f92f9874036", - "4439d038c3f4a7f26c9030d2fbbeb36155def5c99e0858cf56d1fe379e9e6248", - "71755bb4bca075ab0bfa51c1a1a724fe7e1bf249f4bf4fee3225eda12927a72a", - "78345b9babc4087e508dd7949b9267fc469b3e4a93f22d39264bcb6a073b44dc", - "dbaa76b48b4e3917712ef7811bad342123e32feddd013e45229628650e650fa4", - "0c7d9ea635d2232fc1dca87dc95f5d54799fd280e73a200ed4d754bf7e04e062", - "f97493a79615d654c2c658063fa40e9679fda3cd53b09c8c5518a4eaabb9a75e", - "879dbe1b0bb2a7ce94061a9f199944957450a7f9c1ff05412b85aed5527ba896", - "1d8fca903df9ce7e44604ddf194e6ca5bb2ba99cc649db2444b76b3578650bd9", - "b3d52bde1db2b75a110ebefceeba519677345fa960ecfca348f48362578de1c0", - "2582b46b9568af90adbef9cd85872b5407e595bbb83c1ddaa6756b9ee39670d5", - "eccc8dfe1b9bbc8957c86d6dc423c92a8aef25247b519fab292399ef9d10643f", - "30f638adc096f3183478bdca057f462b89f2bfe6b6b1f40b435acc7b884679df", - "54c6c973fbd1de05420f5c0894b37af2cf2bb3e8c0d3acb77f67563b8ecc977a", - "b93822d2ad3e72139e3b634c713ab12cbbc5c6935ab76a1037a3675b05ad1ed2", - "77ff327aa30010f27a86b6213fb6deae11859ea35b38fb2b803fa52fda1b02a0", - "33d842e99713981f2de4607da17d2d85c36e5e0a2f8f8f41a04de674123ddc9f", - "713d5a93d6cac1a5569082fa819b10de4e4e856a8cb6e41d8aa6799271082884", - "97238919b351b6cd8545fdb81784d28c32e509c77c57d6e7f682ae97f53fda6e", - "d727ea67adcf186f3c4016abe612de319249917cae0f1ef09a970865167a2154", - "3d710aef26ba9f7cb43eba1db8617fd155e683cac25800d7b1ea24cf5ed987dc", - "c04134fbc25d11f9290269772d9b785d6ee045c25daaecbb38aa0fd07a5b692a", - "092b7cf359e2ac7b5072ca6cb205df566dbb25edcc491c72304da45d23064045", - "3d06c73a7293c88b4e9d5b28a22418bb7e1b094d076e909528abe7ee20e4b0c8", - "393d91e6a2e15cdaf6bd3e06bb1c963185267aec4ce49989b5a088f8ba5b9a57", - "8ef0acd24267113706daa28ae07fa521ad5be89c3982a243ce8df9a1e513fbeb", - "f91e2bc92eb98719a7d244b87f08a5a9a53796f5b5eb7226a7249830901d22a5", - "fea6c1cfa907ca4ec5891b7c83f7929c6c8681aa43627a55d96ad40edf7adfb4", - "a01655edc719b2773be00bb15405b6b5f488f16da81624fa4b4b224be6e948ab", - "60a90bacf3dfc529679f548d3e5f23cf26dba0c2d7cce965abdcb633fffe4d35", - "20c8a047f52b3c4469faabb3f52ec0136314a00de4f2935bf7a0abb9f5b720af", - "2f15dfac8c331c923fe7c027f535f191c307630b8a0a29634b11c5d43587279d", - "439f5f0cdc17627d00e6953ea84578da895d6b4dd309666a6ca1d089103fde08", - "b1db9be316db4e9f58e6cf48cb2dcc4a72ce4ae01f29f2e2fe2cb48efd49c6ce", - "68ecef5b6f46555e23718d6a256b86d750587806861be5c565f767df7971fa9e", - "63d19a4a922cbe7e26c38e7ea2b98a7121cea755f6d45a580327d2dfe9aeacee", - "002b16f1e90ddce01e89f44eac2433c7f832b9e744131da3e12729759dc371c5", - "d5cd5cc137e25abd60d5f8a9825fa68a2b1cf5161de665d2902b2fa8284841f7", - "8b109d30d1f263c5d45ac6b7a3e49161229b34911c6f5e30eff2611a82829f9b", - "a37084b960b6b7e97b0ab3a79171478bca136e7a01ebc7c07e0b178895868876", - "78a246a1f8201b710b1e6abf908899bd4b71d50bb8e86886524cfabfb10c732b", - "0441104141ac0d1aabab865d316143d09fece085607e82c9fa65dcd0b4ec89a9", - "80ee0c4193fab97b9bb205fcce6804d9756674e4d69b0a0977dd77bd16a37b2b", - "1acf13b5ef6e3589131ae9df714d6f8246a70aa9f0144fd074f6d24d122d4f13", - "263a2fe067df54f0b4397fc86db1a42d9030b905e1f3e9f481c561f67bddbc69", - "74cd9191cb7c8c7855b521aadcebc19ee16d890abc3d8551de28a75b8aee3122", - "e053aaca5f3125bc9ce75b445ed6de72dbe31d75fbaf6b5194ddfab5e29d0363", - "7ae251be8f3889d689450f0eeccee099466bc99dfaa18fd2f7f647d225a30f0e", - "2cf41bfd25f5cbc2dd489bcd8f74fb87bac087d7eb8cc20697d5a6a76c2f75ea", - "cd244fa9bac489cc798baa855de031cfb975217bbaeeb62f35d05e8ad2cabc99", - "d597db188a0e0c0c7aaba377a2e3775c381aab4d1b9c829d601f541e0028a403", - "1251ea02868be89bad300d29382e7a4430e7bae19affdff238b72af4a22c2d70", - "6881e0e55fb3386f5be18e9f851911f942ab7da3f5120397178daebe07182985", - "177f160224573cad0b913a9ba567456e5a6111b645ed34602accc6824f2ab80a", - "c5f1787545f1c076db6a8212c21bd1113af702a150bb150cfb64b1ee7c62a2b4", - "a478f0c056389093e5b556a0df4591a2f26463059386aed4eeab625e8c7026ca", - "c410c9cca14be941aa1106cd2fa20bec18656f54cc82da6c8ff5ac26644bbdd2", - "ea214ba524d9ec966d3d1afdd7f4aa8e840b4eb409e53a26480281b8781af103", - "2c7b2eea330189413ef0138e9a92122950c1102636fb46d450dfae24f863ef92", - "a2c5b3e3a5c4fa1acdf1bde888ae2ef2ac505f705de482ff742980610588cf99", - "ce70ac967abf32482f0aa1c2e87c5227373df98be669a93055455b7c605f6841", - "ca6cd1acca4884b7c3aa64ffa56a0de1bd539077e15e6c4fd6a76b9326da840f", - "24d8226b69ed20b6afcae4acffc9788a51bc68c1c62b5fbcfc5c8e9b57628c29", - "4062a269b31aa5be96e4f9fb6150aa263b24ad010b0874339a3de70628e0fc01", - "604b816346a3f29fc7e695857f225ef6a814d64056c12e74489f166ca166b5db", - "96d52c6f4e9e26f921ce6a1c532d485db40398ac0c1f57b539912d3392453a28", - "1c7a173b4a68f75a99766a097019a8078015bf37d4cc4e70636b76b638fa9f85", - "8294e7f5044e5525e57c5b1d3c90ae04b8280cd693fdd9b08736a4d699412dfb", - "01e7c1dc0e84411b3cfca9101d39ef1fcd54b5c8f13090019a1d1fa8fc702f79", - "3a3a2424190e43a85b00dd449e5d4bbb555e98d77afa3dc3aeffb6c8124b593c", - "18467143c11cc9ac0138c47525e75f01fa4a9853b35c28fcd6411f8125edf3cf", - "e20617880e3b13e31b74f80e31a110c375b1d9f1b5618605f4f60b4364788a4d", - "6a43904461d43e9260f25fbfa0b13e2ef6fab21182e4cddb218479e4b50c98b7", - "39f65dac57ba216a7c067ba6d320ccae90814143dde8ff866f48c901319acac6", - "bbf142172be724551862d7ae6819acaa01a00658a5735d3d1dc328eab866924c", - "39e365eb4ffc8506ff2310bc898d9fcbfbfbd7700fed1bc6e2a3e6a3a4dcb9cb", - "a1ff4ac93f48907d41c44ccac9f026235a5109c30f048f01bc0c1d5ddc00533b", - "4fd3cc932e22f401ac101b3a528752434b5623cbdb9b7957da5c4d82d8eae448", - "eda747db7809ff7a3b60033ee305933ccadb52795391de3fd293d29144f69c51", - "7a091e4f06dd52f9c9b0e3e5008c3f828c6e6965061db253b74fb6bd0b5cf8e4", - "84a2f0b11bfb97836dbc5f4b5bab12f420aeaa95f6e12a6bbf04fd4468a7136b", - "7c95f091b9d712dfacd1dd13a8e40474b23487195edec65df7b8f3c8ecd375eb", - "f3bb6e4db447b644a9de40266735e0258f9503beb0cab971266113f87684cb7a", - "a317b75025a03ab2c4abdcffc2efd6a2bb60442dbc143333f09ed9b9448e0d5d", - "0ca8ccecc2dee5e02e69ddef1224dd3c10304b0bcc0cf4a519b565aa36bbc891", - "4e2f05947520425747f57a1d298838038013b80bf200e1f63b5cc0d32296e9e7", - "c2321bfd3fbb5f423c4b6dd2724d97c84ccce0e4d3d5410816d26ccc367d1311", - "25796cefb65544ca706a914f7fd3f3cfc445391d2c267774c5eeaa8be5bf958a", - "5fa1e76c6da6e405bac4778faf06146f31036528a4f7c45d428bc5cb14ec8690", - "c463c2d38d9b8d8585bd30e5459733d148671de52858e5055dce8ea748e838b5", - "087c6f1167cd83ff80a74a8e659707a54260fc5becae0519597f3f4ba08127f4", - "b3cd07eb1d25915e538edb501341a010e7e32ce99e028780d34cf012691d359b", - "dc57939775d44eab69f91cad0c3f90aade077a3fed8391fdca36e55dd15f5889", - "cd5fa6038e3eed50e784a5ce4fce01425607c4bd5c51977ddb0b6b1b384a5e69", - "1171c046c8191517aac9a988acec5eb43f0c00bf1faeb212109704ca012ece6e", - "86dff82acb9f4c5cfaf6423e917c927c9b9c2221c035e3a278ba31f89766a41c", - "62d7ac6726e2d80a177ad64a70a36a2d8ec188a4e14251e09ee57e8f12805eab", - "51e5121a4eb0d9a0e70ca56e02640be923859ea50eb7b64538fec019d5bcd732", - "3e94719b048c2407061fc85209d8863293495b7d8ac916706df85a0d365695d3", - "bd9196d4ebf8b74dc0215ba0eac32f1db3fa036e4290da02a45ee42e910ef739", - "11fc25e9ee18ad44dcc8038cc73945c1e2f241605cd8ec365591f911d238e5da", - "b58341abb6182db972b15969028edee662f90e743e6a153197cfa0f286b45886", - "7b9e8f086e1a9027cf9d4b45c98fcb9ea93a9532952f5ad2ade48ead554fb853", - "a7c7ec4379b94b6281f2b45328091dd524d481a9c5989082e9747d1fd3529643", - "927657823d09c367646f1398ceb0010a0400cc76b09eb62429d0d2ea88ed8ca0", - "523bd1ceca0b913ae5666d35a2b4fe52aa45fc3730c6c81860f1ae459b30b2fb", - "97ffee1ab3fd38f9e5e2a61a11db36fb39af0d5873811b955995db48df1f148b", - "aa0d33b632b1ce64dec7800598df243a6ffa9c19c47ca694ee8d5dc22fa71064", - "828426615665aa477b38e720a179fa07b6f1933f4d7ff6f2b08e9a950ab06f5f", - "2442eaba8a2983ae1494dfa237837d64ad6c92fba114d9e6ec287bc62e71a1f1", - "805e85be3fbc2f17c8bfc4a08a0f0b634b10652725b554450e607d781f802f06", - "a02e3d3c7da7b79218aad6961c5b8b8ec22b51a66da97be11fe189d162c1a21f", - "4c885f75127ea57ba1a741122d8d6027d5483d5a77734a388cb4e5d405f457ee", - "f1739f90991c0ffba2a64d013b91b8b646ba2725a8c98696ec1ef650cd074d9c", - "ac78244c62e88f679e4a0d4a019296a846c1c4f7cf58a2d2b3933984cd902bb7", - "0cb3a132a416641d4eceb1fb43e5fc982a5847b99152316201791a15f528029e", - "55fbaf5cdce66b495cfdd5abe22c96df760c33b379443886f8b0c3ee987a1b8c", - "85a4903fd07de6e1e2fbe31abdf032e3d66fb353a3afebe63aaff6e3a4056f2f", - "9cdefa8a3d062e1841242c2a9dbd795960257af0ce3f0ea39ad04bd36df7019b", - "d4205fcc1110db7e7ed3d7ded1a34cb92358fe44089b7e8255bf2363d07438d6", - "bf89f33ba541bdffae21da006efc6c4939915af5bb53f188d4b27885c3d11ab1", - "c3dc21e7e0240d5a20261af5b4990b8fa583fe22a0fa2847c08a631651a2458f", - "77f68895bd3b8ec994b8def835ff5f628eba1e77de072796225243e0870607e2", - "08e12654b53a8c496220b029f2d97abbbc6b407f2e425564fbed12fe815f7c42", - "6c9d4d2c805bbfb66fd9d3a6305d6806c428b5e3fe6f5827a0bcb3365e421ed4", - "ef300a18540f4c2b8f8e4aa24426d60ba37a2025bd42c0a58ad4af0f5320635e", - "4635be3583b2a1c5468ef72cf8665cb941d69dd26f8e78c966dce5bef5bd7cab", - "e43d77937988d7e8164fb3d561bebe31c2b48d9029bd887de3696e7e68a636e2", - "3e0b3c2ff48fb9f48b538a1b7ccfcd7862b0883d7632dd4b9750b3b6bb42321e", - "72dbd599ee547b793cfec3ce19b84c8a55fe543ee866a5ed79582481a3418d67", - "3ef967d4e343f7124b717632d67aa92cfdc7fee207af7049a1868d617865db12", - "934114990d6b7e5f1419a6fb7d4087e3f4a21e1b8c7266e242ecf03435794d0a", - "336ab482a788cbb58fa96ba6f611e765f76239c95d589f9abda08b0df466bf39", - "9b91a71ce91ec2ca1c3c304d11f49bfd1a138d3a81b027c5fea25911b025c8ce", - "cf8b61371ea71d5de4d0b7622dd84231237768f6a1d610a125be88346464a4df", - "61be37dc68f4ad99834b35703ab43eee71f9731b694f873452f85fcf357aacc3", - "c0f51ad48471b0b59cb085bd9631bc4d33534f5c8085edc542f0182a5c0b8cbe", - "826fdaac04e3f1d3c7f9b1aaccc64228ad26802a05f44133738fae4c7023b45d", - "417a45428de283f277c9f84afc2945ab2837d6eadf031993813357ff517aca6f", - "89ed688d98ecf44a1dbd9460c816dc3ff7fed86a8ecfdcb145e18b2acaf69e79", - "c1f976ffa90994d26646d5d41b1b602963de5b32ca6e4538ebec96f7925d9ab6", - "1915bdaba0f44b23fce84d2695eb0b757f712dea4cedbc453d6e7867d3473346", - "09a559539e920ba463b9694b2b6ee0b2ccd00f42350fab61434dc6c99f478316", - "5817d5834c1f9dc443202c21f34083db276f07d984b00a533cfe2edcdbcedf52", - "f870950c864299060dc4cd60714e23b884e865f9ac5da5c0dd0605d4918a04e4", - "1c7cc27958c5c363b679026f2cf34b1e87b68d4c4340bf271b319641397546cb", - "7ab1e0e8e3a871c347b9c1057db2204122f5b961bc54787713881c8371062abb", - "45f3b715702a901f83c2a4ba7631138debfc65454f1f7b6e2817562bade6f114", - "4275d1b67c06b17e85f0f8b3a22f198be6bf6b61546815cdb1835f78195fd4b8", - "f356393af2594e4e5b3d77e52259cd952015ac323306ac548b08d337078f7d10", - "aea7be1c91a544e4f06eeebac3bbb9b44d87690aa16ea88eb5a1717e234745de", - "d7b551b0efc47ed2124d955ee23f1d44dadc822704d7314cded8289fb7909aa8", - "30dfc2062932d9e1980683ba35d78a5b58bb619292856a06cc90c110fa78af06", - "b0f1fa337c2607e75f7567f79fdca1033f41cbb453528092f4373836cc40dbb4", - "33c8db6a553db4f28034690412899906a580d19135e85cbe22e09985bde86433", - "1cb724ed949fcfa14f99798c491922006a598b14661fa57d01a856541e75ad2e", - "f44d80b374de259b971c40007561f4d810360825b0bb568588227e1118715149", - "cf916fbcf64b8ca5aacc34d742b926f73939d678fd474cfe727be07dd898041e", - "2974af63a972084f1272488d1aecaf88b9ff77bf7f942d499ceb33e920c9e971", - "a78812d1ff329a448ac496bbbde2fb103ce60cdfc4ae9e33aae22753c33acc36", - "86a8a9097e03e6d8989e59eca1bc90d8e3c7a8ed9cc11fb8742d7f4a1f8bac0b", - "396bec921739163acd00de484a8781ec57428ff5dee305bad2880dad27640791", - "57a662a6edb9641431e7ba34bd59e4d7db30f5d8c5c3931f2bdb8680f64e7a0c", - "f05aa3674dfb38b3a14f0086d6181ad18d6577643a99e50483a7c8934e17fa1f", - "627e127c9ddb2a3e55510552e3b2d827db93b34c4c049c3eba38f82c6113829b", - "81503ef23695b6b1f0f5d72bb676bbfffd5447d4f2f6fab15ff9cf05f8a36861", - "1eb79dcac0756fc91589de6a9319053b6a692f09839c9003ea93aa70b0827dff", - "09f075d40dd61ad4eb53c4aa66d913d9ff691f655f249ba31214f93a99bf3b50", - "cbcc036a7db8ba3ac8674e048c2f004cb9ccd2e7f0fae3e58385cab9865af7e7", - "cab62e15adedc0bc1e602eb4ecb7bb4762a996f0eef094a49165db642738af71", - "82afb064aa6fed63915365dcfa4f4fc0ca7529234c98ea5229c6bd0444ad3c7c", - "6766263d7a76ad4d929449c23f9fd0fe03b8fdb58d27caa1a008935d59b8782d", - "f928f2ae356dc613e3e14b5089f23d3a187b2c59511494fdc6e94d8e3a1ddb72", - "483d5410f0941d8c4082af68251569517802fce9ddcfa84dc13938da98038186", - "180d9f99bc1db2c9c6879b884fded36c69a299a065cd19050d0ed67ca3dda47f", - "54bafccd808c64f764ac5b57572b25412b844d871363fc2b96181faa12569c88", - "86ce5ce935c805c7b3b332255d35bc5ee371be0550eeb7f5c9c61fb2250cfc58", - "3dba52de87ca3d1498a76e3b480cc3ba13bc5d00d9220b234dfaf9f2a059f59a", - "17a91bb1033bf595bae975d7f8827435ecee0eb2f157eefc55753e10c7bae9f8", - "4fb186cc2868cf8c4efcde2d2967c94da6dc3540582a1348d8068ccd30e54701", - "751bf2f1f713e915eeaa5105950da574c27da38ebe0e9d22850dbfb2886bd1dc", - "96ee3a114cb81c60df7b8b9093571ddb482ea0f7f05cc91fa0695338c78c386c", - "e4b5566e39b520ef3a598dddb8c48419a2441740c3c9513dfe0a6cd413abd4b5", - "fd089e1a75bdef072cc3b7173af55ea9c64c7b62aae4c9335b0605ab5762f0b1", - "1976fb841ddf857c605443e3024c7853d08fbaa35f4a7b20d1e844266e211bb2", - "9470a65543c57584519050317696ea13834486aa46baad1d35ba334193d88aa6", - "5690fad8741e3dbdbc2e7e32587115b8a00a788a330c3dae9569023ef88c6b1d", - "4df2d644440df1681806c0f35e1eade35883a53aef1a4348cb32808ffa3f6196", - "f0ec532484415d0f1503dd0b2eaab76436bb85962109b828ce3f2e5c7fd13da1", - "bcd99b456314f4f650d556c6025487c5ac3cd50c53e7f96856995d3b4ae1cd1d", - "5409ebcd822d47258a2733581b1ce72ae705af2d347f37f00e3bf91eeffda7db", - "6f4d919bb98c78667e3dfb1415a330a964fa2c2df3f521695b4edbe03f9e568d", - "f9b0c2694d6ec91670d09409384bd53b28805d2ded97982231c90ec4c20dad98", - "6f64b524307fc964467fcbea8bb50e593ef2a5be2b658366dd7e9d44c8873197", - "ff399188bc75bf95069e91f36f9ed19f81d9aa8b619f7a59bdfcb2effe3c54a7", - "3b45bd33657b90ffd2b5da344f307dcf443519a69148d017a8944dad0ce31df2", - "c71060a2fc31b23415dba1a7f37497141682ce6f2ab30a22b4bb391e72fbdd5c", - "b96a58f03ba6aeb5bcac7e7af87b6ec89aab1d7b0156bc6b54a85ec8713e57b0", - "35610dc3f0665d8fbca3ebb396a7d53437dcd0a490cc6bf6ad39a609a147abf3", - "76052bec985beffafebe9e34ac72c0b3e60edad70b60a6e400d881e351bc1b74", - "d2975a9f37569428c6e3a4b55a6538fc00f78eb1a8a0cdc3d9b6e7e86fbccb5a", - "7e37f8a221f433aa0ec527e74b54d07e4ec15739249133242cff666eafa72ba6", - "1d3be664dd03aedb9bfc5d72ab2970fcfd2377fdb93a4abbc067800a9d71a4fd", - "56bff77452d0373b47c360a2e74a638c70db6df404fbfb7dd9a2f90a03f32b57", - "14aaa03221c6d51d1214e98c483a55034fe22ed33065372591aefc15607a2928", - "31299a550196b82000a70518d009a6ec2b9b8c6b951cd23c46718b0fff1ce5a6", - "56f4d2d45d07783abbc008bbc78dbf55027ef985eb5ab878843dbf5ee004f7d2", - "b14d70997c392fe0b638549594dd61a2771c112c39e5a3d4ddb58cefa2f83ca5", - "a0463be2bd4d599bfa7afa93406aa03639edf4b5b2f63eddd64fe0f12b74ebda", - "99dd310547ef509a816eb0a5c96f7a5616124a90abe3b9fc44d5d40083fde338", - "7c5fefbcb5932a005dfda3dcedeb0b427ea9c28e1525b0d4787cf969a9751037", - "ab5c02c0824e528725abef8553e7019d74c88c0bb342f285c49ae90786087e52", - "c5f5e58de01941d944689bed1a9f0b82f028f4fab7054dfbc3524f1b9c81fec2", - "3ab8d9f315fac862f5a2c3ab48fecbdd41edfd28e7b9ba83696527e4fbabd6a1", - "c209de3a5b225e98757478f049df521b4d099ebaa5feedc4c8612819a15ac66b", - "b5869ea9d8e79eb15f803c54532d7a1c042edcfcd06e78b9d7d236cd84014071", - "ef816a7816db9e7c8ce5e0e327a0f984b63fc07c9156700eb6fd83377051e139", - "9c98b31f367f9cde3f0ee544ad20e679ff6933417edef99ee09465ac954f99b9", - "8fe0ac4294a10acb25d52057813bd110af0ee0b31da7df35adade424c3e774f3", - "acb3bddff064dc8806d1a60db6d6ea9590fa59a19b19a9867744444bdcd418b8", - "6dffde108d158f658602c0dce46aa4fb1e9f71f7e1fc4e8d803973e87a958b2d", - "7cbdcd2df5a936bdd41bdd3c1aebe50422816a54825e54426257095f85d05dfd", - "c21ddbbeeac6f3a2ff67e4b62fcfef5009528a3001bb3b41a971aec87154f15a", - "da108941ebd210b10fbf286edea0badb7f55a980416162b3ddc94e2917c26e0a", - "c5832a868d9885276c4a73dbb89f3c4ab6d0ac79705da19f49c44ca3cbb935c3", - "2c475be5f31949e7503493e188eff96f2222b624c9302f210d6e5a4aa49c6f29", - "3f59837d7f17589ba7e69a153a9016e6e32bcea14c1026b31c21e6bbe3349b75", - "85ad74928704805152b38f3ae80f22687ca7b20590507f9c67b6972963a35862", - "84bcedbfa3b11f2e619941fa1f287499d8b7a28e5811b68ed94f3a7af9e58336", - "91289b2f08cce67ca1495ca1058b60f4ee9f774ff83365b4004c731714faefa9", - "8f8883f08e19c7a7d149715c0694bb8188106f25a3c7145bb7ef192b5f1a23e5", - "e5102c3a2ef5485aa240332708c5d551308b93d7909f134f7c40b68e7f54ced7", - "3c1920061c2e4ac704a593757bb653912155eeb9736d58187074a81e849c7edb", - "05730283deab2a86aa44315ec30b1a6eccff80c42e0456fa0e2a2e2218024bb9", - "627d76b8315a0a751fbe556d4de5b0562254953a2b8b9cc1dbd82f2064424f02", - "07d9acd355c65ca5f69731feae9e6b68aa54fef4fd66d8d7a68710d230db43c8", - "c7051fbdd46a82c1e6dcf03a16e422a9c335b7a91a6d80b20fd59da9087c7992", - "423ac212578654d18fc5b4f2e015b35845a7ed51d82a0d56909902bf2146dfc4", - "0127075ca59c488cf66f219e6befc967a4bcdf283fbcaa149f729f37182b634e", - "61155891db79926dce2c2eeaf710453b7ffb333ddaf5c80bd91490b020685d86", - "278e25e60aef536b8d4a7326b8cceccd527a6fef4ced4a0c5e9f3c039b4ae698", - "1380162453a569d33a213ae5c1b3c94eb5f3ed64afb9e0889dd8982e552bd286", - "585edf7d0c3a505d0c21d1441beb5502f77bc8ad3c434ba29b04e5afffa0bda5", - "e75b77800b8fa1a49f7966f5dc8be8900293f45361df4e69bf84c7d2660d0fca", - "4b09192db536aac6ba7808a138a3d5a16da185f5b286db0e719c630d2be677f4", - "b9a43068064fcd1a8bea5c555d9177b165bb5f1b52e6896242119f0a0acb2479", - "cf921e23c3038bbf5f36d3f6272753be3782dc9eb728234c1facc67949e6ec75", - "d3cb122d726dad580e4a26bcd33bc64fcac23f93157c70e15558131d4dcc7515", - "fa41194521e0ec3c2264dd1ffe1d15b868144fbef0a932268c795343e34321f0", - "523b6472607dbd9a081c0c52bf7ae628a6a02ac0437735237d3c9603f80c1a75", - "dc52aa5e733d9d73dc438c90913c5f1bea91bdbff190dddd138f89138c9602db", - "def06711ce0a63b5790e53b92d8841d2961b6e9ed5b183f40ea8d911795c528a", - "2a54a9f58b7ad8d7ca28189267b94edc3c03d090ed0cb11cfa0c2a2eb6e6609c", - "ab52ed8965f9b416ab0057b431b5385e5d465812d739ab7c2b50ce8080d5120e", - "c0b46406b187257a8bb6019374f96b0575e75811d336a4c886bd977a28856690", - "d7114219657964b7dde6630c94d1af8724df49ae75b0e39a38c2f996a5bbbac6", - "69ced8015cd0257c616a739eefb3ad15fe7e94d986b27b84865af38f465d3699", - "e7f69c8f6f28132bbb12e694d31c6e7b093e066b19b195f6af7d7ce425b6712a", - "67f3fe8953cd8ecc1dd4eed08700040fea70fa29b9230c43f2c89c17e1f201e5", - "101896ce1f92b4685b281af9ad6be7a000ff32c09e68ec168b254f30b1a6bc4d", - "397b03a6a2109e6ce04da0197091418507be1882ddf4679859f494c6f041a6b0", - "7733aada8f3395afbc523fd5d1f3b2231128290e417e24f867dacddd2d0f8257", - "84c58893d5b10dacce1fff9a9039315d0b385522d60af1ce7e1c3ee6989201ca", - "65fa9fac3dae0f969b398950fedd8fbdd62434efe50a609d5789c5a9c35334f9", - "decc7c64b2fdeb92faa9da67bed718b0f126fa4177223dd15b9f719c564cb210", - "0fc42bfabe30d1555af37d4408cbf25a1d611bda60567dd1d978feeb048e92ce", - "a9a4ba2fbc1ea534b40eb608cccee7fddbe212f79c437650f25421ceb2e1dbfd", - "e92fc1cf5f399140e1848867301fcb4a50d70894067032e7a89c8a90a24a4b49", - "14a4f1574a52d99af3c6a04bfa6c8117f074476b4f045d6c8cc1b24b01ccc2fe", - "7e4485758d2c257a49fac6af198881a7821f1bb24923a731221d84e0f4c35a67", - "8292a62519bc6f30b6e7fcfa73fd7bba66a6b573545fe4ba5ebfa2e2fb0773b6", - "f52737c7cc6f36374e19c53654b96ea1d81fb4116271b604da7c759e99a9eb19", - "8dd00fa00b25c0b850932a25d5639a58753585c4488e65371dc24aa909974021", - "a42e1b0f59302820befcca36330e48ab01296f2e1b44d4db44611399d76e3e34", - "1ada106a4a63231e8d061eda0e4f50f66834cf3d03271e23c7b64dd47a594efe", - "2b678e7818bbdb5b957dccddeedd73f88bce50bec56bd37484e1c49133a6606b", - "c40431d11a5e2a880db8a71f74ff0c05103010bcab00b46cf2c450a9bbecb985", - "17ae5e1790957cb43a771a54ca4c44a0aaa038b52c43e04520caff379a79c4fc", - "57d98d9b2ea412ed446c4832dda9a5a981639724a82b273aafba2ba9c02e532b", - "73ca4faf7708a5734faad5b601756a94bffd92a1d70aaa1e3c95f4f3a2db0c22", - "989a35f936600d09745c76fe66edfea487cdc859f952c1c00824c33e13da6daa", - "f221608ecd828b6d702154446d4c33bf4c058ff6bbc37f5fd77052b08fa19da4", - "5b9d77b9c96f50bbb96e1dbc9ba6716b7c6894228fd1c1f5eed7e18c3873f65a", - "6fa58f6737769b8c7502ce4dcf2ac76257fe30a5844435f25f1409b1e4831dee", - "9eaaf3f5b63f076b7b6bdaa5ba2d3a4c519506b12d70ec2a6983924818577f84", - "ae86f7f489a4f8bac4450c79ce96183edb63da8c234498c2fc7de590e89bdc81", - "ffb1c7997f9aa474fd5d2e2452a441a492b781c6117c18282186ce191872f5f7", - "b8fac4d811e1ad90b23dca38ab695df6f8e133d1baf9df2c98f147fc18d50f93", - "286b53f0afcd48011b0d283890e8d516212f58f48225a06f8d9353a436e9cf91", - "7ad8695f313e4a2d084c8d55149cec8bf1dab48c3694a1e2f9c6807c734d91f0", - "a15d19ee9cef88b6d6106cfab00a1fed8403517067d704b2e76cb50c30ee7c46", - "39d34be39ce2e927d627eabf0c121109099f6ca65e91adbf01fc4f663cfe796e", - "acd9046c9b16cbabe1adb3dd11985b67dc13bc70d1f7542d638121ef696b6c8e", - "fcf840777d0a0025b3348a16e2a4c1de2731f95d24db3e3900bfa499b1384b54", - "55467b01cbede0a1a57f45fff962209ee45c8bb1c05dd41c79f26df8ce049912", - "400508f5e88943ba4fa17ecacaa96378385249eaa3152b92a470a5b1639308d3", - "850c19b7619c16e70657b980fa5716ceae97bab2cea28f336447bab549529cf2", - "a3900287a43f39b783a087847fdd73725d80af651b6ff2b72ebc142ac357477c", - "ceda503e564df0bfe6559b31eb4bd8fc8ee99cbf4f9c0f31d7c12e3c4c2e019f", - "1d2aae7c57431881fa4cf3ff9f1375cf47148fa2fc49b5311cba627bdfd114e2", - "d33491a9e0306a3df5541b8ea68ea52f5bc3f93237a8cd777333ca24431b98a5", - "19570e962ba2f8372284ff194ad5e14e7c8c39baa9ef908e38eade3090ae971d", - "d8709c88f0540160bc0ea853ac5055d449a528c1fdaff8e6f3bc633751025f56", - "e4baefd5fe24ad7a6146ced8e992892cceff4447cabff92d3cd68c7a5343e132", - "2c5d989cce60855a12bcce1b05f3b05afd9b09c45b3a1033c158aa30e5c24c12", - "0a4adaecd5049480027008b96a036bc48f0d989e715fe501e7267459c156af42", - "4cbea1ea175263fbb1af5b59a867d1e6b603ccd400d8263b14fbf2b8b1eda3c5", - "ae33ff9efc4e21181c6646506e40063c29e260770d627c71168bea8d1690d2f0", - "0334db7bbdadd65b686b8c6540e07896c99fad735cd57985b73e89743c610dca", - "dc73cbca6933def2c1e6ceef8b68c33c7bc35a3dec0b0d94d0fde1a965bb0141", - "7754fa920609608321068d4f13ddf73eea2019c7207e2bd00ef637b0b547eada", - "342ed6fe682394ad5245e355f253ad7c2bfdaf8ed2ea7db2cd0b0b0bf919e56c", - "60bdcc3938f0d720a5ab3098d02f2265f868b624e847a91905d1fc23213511fd", - "e3abcd654e8e75c3567fba5caee1849d68a2f3e1d5dd28eb65fb1d7280035c5e", - "802fdef0a373c49440c1fbcb6e3e3b18c96545738303718af7dc20b833d2577f", - "6d8bfb27ca02acb4510f60c664c43c35834505e0f314fb165e6be75af3158a78", - "c9e3581f4bd185a1099b876f9203359af6d09f6be7064be6059ab47ee9bcaaa9", - "e966f3067406d21d0ea6c2edc7b5dd2807c441d72e0ee253a882bfcab851a1ac", - "3f99d11dcd6430b0a5e1aeac5d1c7d4b33f93c33169d63a6302e03d21ef97c7f", - "ab34fe0287a3edf4c67d73469411c82b7eb59d0294eb84933b30560ff98a5a1d", - "2c3a017807889f85083f29e6b1870b6a3f315d84a406ca1620578b91799cef37", - "bd6bc5cbf5cdfc940914ba351d51c1e486ba54c5b99be04b512000ec11a16f9c", - "ee22df0e7f7d6e7ef171e3b720ff0c8b4e10fb8525b6362f4175045f82235001", - "b416cea41d5b455283772a338a97b0abd65077bea0d173f71fd193039db7287b", - "406522d4fc08dd6935238a37d9b39298d08f308af715aa297682ee039b35c334", - "6c13ab04832d1e4763422d8d21cd222d034491c9635b320a07025d1062c0bb5a", - "7b1016e0b5b4c6ec422e32ec3f2b1b1937ef066cd6c5944f169dafd6384fca67", - "40582df4a7e3a6fe1e1585f9083d748510875f4644e4953b0f17e7563b61f0f2", - "f9e4e2ea365b4817ecaa34a554449b508c6280543f45904184088adcde768077", - "0d38bfdf383d5f78f3d449fc94f977fc9f705f94731a9a0f664516ffd9974455", - "96e94d72058621469d97d60b7c322d8897df80248707435c585a69bd963f20e1", - "45f1f6570451e52177481d370546c7ba6f33146c7d12025a8f26d943a57088e5", - "1dfe1dae6c8cf5ca799cf28dba6c8e35086512c2963c841597b86a0d472465dd", - "2e1a7472ce9b0575cbef2dfe43215276bd0180ca60a88125af849bfa8993e211", - "2f6c6013e7b4c406ede4361669323b05e9d2870d6cfc5745d55c83b3c96cf55d", - "af82e59225e309eeb50bf9d2565a7adba45669805375edff3854616cbe08e5d9", - "40b546bfb7a6c3d509f05ff8a3ff3cae054d2c551b4c86371a7d18c178336309", - "a86eab99d2cfa5d3defbf47e9dcfbaadcfc5a4e03211c5364c3f417ad198f674", - "66f8d1728aa63772269dca48931283b51d35484293958469166056c43fc5f07f", - "52aa21a297817bf0e77c94613e65f2523381447f0b4f68adc03eebe14171ec99", - "3506588a9212facbd998c84f425122faf401a6e187587bd2755c3e9697ed0aa4", - "05063ce930062d06727ab65a62ad96abb4ccf15e767eb8c9a2dca68b4e7efbae", - "54fb8938eb09372921e20783c88d525363eda7b1b34aba5a077e6df20f5ce9ad", - "4480debe6a3454812736efd73b6176da2f73e8508558020d6bafff224a5c9514", - "d661b54057f7bc5a41644a0a0d2d6450de2c552f48b90f28aaa1162d2962f8f0", - "80873215148540d3678365745870391a64eac6538cbbba57874c82617397b880", - "fb2fc4725bfccba1419b91307b7640b8c48bcaf2d4bcccc274405c110ed6b6da", - "1bf0a543b451b62d1e75e6422d5bb0c3a218cdd282b7e2d3e76e0fcfa67c28bf", - "ee8ae889d5b4ef4145555a82f41be433b1e78d2342455115112da7500beb21b9", - "aa328406606f0801c3ec15c8033c092a1590d16c2deb239ac456763f47318f33", - "5f81558dd69739b18f7f1c2160495450d1e0893f00a596fd629d243a47db85c2", - "05f63721ef8f97aa7171b195b2282c77bb5f89ef7df33a13edde260b69a085fa", - "ef581dbff7a4b86215b2ff8d8e8a5ab5d07922529acdcd5df460c6a45ea56ae6", - "4835c58f0a0261bbc6db10a1cadd3f2f576fe8aaaaf4ce13f5e359c67a0d3f5c", - "ec4614e5d4723b451ef626398adcaffbff577bb1330beae872b07fa4287c082b", - "0dd4fe1f807c5ed2e8c656ecc292f74e07bd7187fd8f86c0935e5c5fc013ce4d", - "2870328e8e9382a1234fb40129b0bae3c8f26d3cbf52bb49a13f7ed1e9c7cebb", - "7a2ef328ee24452e0ad726b701230bd93e589e40a13f346b1c194ec09d45e18c", - "faf4c53080cbfc73cf83435bb1121f4f40f57995d97979d0a8a40d2433fcee6e", - "d539ca8673a6928be54c7bae64461b906ffc448a5b1a132bb412cded9cc7a47c", - "baa6d879c5a6dc0344a16b638e38b8870ff43e9e93089205d2ba4bd8c23383f4", - "245e9bf90e999137c632ba3f626b0bdec251d92601ec73f4d4b3d592e9cc2bf4", - "436dcb7cbd4470387224a3a4c5e3dfbc5b4f09a34fd6473baf2b166d8128792a", - "d850b5582d2413eaf490d83d5ac110e863d5852e9e56adfb2cc889d38feb1402", - "749faf3af69896cc73592d70a8141fd3487cdab66bcbbdd9e88931e47c8cab6a", - "0aeb23c45b3c41360572bee9cd5c21f7f1da6fb48e8212738b5e158bd8d6536c", - "b08d7035c968fef9ef169b68308b7294c8c1f1c7786f36b2932aedb25aeea38a", - "cfb99742ebbd45f1ceb8256cbde1b2054a06381abe38e306b3046b9cdbcff9d6", - "7078d7bd372c616aba8817766849fd86e4fef5f555fe94c31a4117bed2639dba", - "7ec983bfb1af034f7423170c942739d57e2920bb66c181eb297c87146fb13954", - "5d98817fff4db18e1698afa78719d81a216490d23a503d6a24e2fc57c7692a25", - "df54a3c1e279404dd37352c4dc234b6264e85406f353d64b0421f5c63be479f2", - "e7a9c8da8a01106231fdd4c7ecb9a880e2b5aab187e111d2e201fa7c1c1b69d2", - "03e3d8cbeaf6ca60f50bcf8a4e1f4397dab4ea45af2f117cbe5252ce6cc99c73", - "bd5cd3672184a77907a526ed3d8793248813d04b51ff775a48d8caa101f2f09f", - "6757522bc415680b644d20fc82cdc342df7ecd859174d9128aa56f0353303158", - "84db6956a6a3e35554cec4a35774bb73a598636157a01482f419f135f3543410", - "77d50e2cc84b359de0a046d8fdba197c9b6bce2921ecb659bdd95ad7bb446834", - "720fa7f201672ee018a12d48261259efde541fe534187247172e7e0a997d0f66", - "7f094e054bd9d01c21df7f831b567f9e1601dd2635106f7b9879d4158bc2ddd7", - "ae031065e9fe8e0b2d31177e76d7efae645e3646cff4b1921e92758d20ac042f", - "1ed7c9e596f3f2d45627350810703eed10fb64eeca239e61f14feff4b1cb848a", - "8d5eac14a4fb43005fe5a035ebcc3dfaf8bd787fc6fad3585df51bedf9da871a", - "01a33fa505af0aefbc871761c99381bc152703ac80d3ef792ffb430a2ef3d753", - "13267a8e1a60fe34ebbdb21c1098a992ec37812b8eb73f9ed70f4aa4830b438e", - "4beac09155b2176c8dcf43c3f9a0febe277fb158c6ecdcffe025b77f91a7befa", - "3b693697cc6baf1caac1af9a0f4255437e7ac683a62337c557bbe90c669c3a4d", - "b370d2f311404ce39994c3f4958a04716eedff616a15cb3681a2d8237d9f17a9", - "b440e8b4255d35df71ae737382fc71d12195eae127edd4038f40a661156e67f8", - "5ecb57cfaf3f5f0969d7692fdaaa25a9a52a5cfeec582b55e34639a9e63a719c", - "f9d3e2527270b5c3c4703d0648dcfa4f3008501641cd23f8886556db36f659e6", - "62f3124f81ad81098aaab73f1fcd839aed18a84b802660492db2bfeb208c5a97", - "9e4f778a933368cbca902b554f73cecb8fc099a4b70217dd566f52c1adb29302", - "81b85ece26a8a753c6e625dcfc8de517880156522c856e238b60e91382e477ac", - "8cd5949b2c78e822c0496d95d35ae63a0061ff252057e198f6a8681c2894a57f", - "82f53ae886d5f2f0918b2dbb440626bf0201661c261cc60dad3a58ef28895980", - "5cb2c741e44ae9bd4bbfa1e95ed519cf762a7496ff703c00306ed5b9bbb0de3c", - "5dfb7c431352ad413d381d4461c18b60aaafb111b3f503c3aad31c4ed1aa76b2", - "c43c07177b5f5621801c1329633bdb04cee4f712f7c8d0d52f9ca02f51699b91", - "54d0cc937d11e0ad84b777fc4bca3e6ac6ccc1c047c99f835a3dfcb3366598fa", - "450eebd9fed229956daddc0c819e530f3b619fe506ca2212a74ee767a2ff088e", - "5327907276abaa61c0d584099a97ce5a8a415df51c8027d86a1d367ffe1acc73", - "135c8482e9ec11da543d8cc774ca2664da266c53e5af78bc319fb57c257a4c92", - "d25c985cec79d024f00173d2e14e13edd084ea3f27890e295888187940defc8d", - "d6dbf3589e6e315ae1e79699ba64d03801d723b90ea5619582361f1a154099f8", - "a78c17fba330eb3ab6fcd7e40a2a89e3a682e39f7d0e8175e5733e6b12464d76", - "34d0161ff8b51a7e92d00a6a122d0eaa14f982e6a7e066136e22d25028627c51", - "aed53e4f3ce79746459b54047de8e52d8e92eda46ec6cb3775e775422cabef35", - "78bc3cf80cdab748c763b8ee426fe551a24361e1b4bd1c2093f44ee48a79fd9c", - "3d7ad551fef18e067ad0eff3cff18d21f22b4a9e2639287a8e672e0430712fc4", - "ccd130623ad3b25a357ead2ecfd22d38756b2e6ac09b77a37bd0ecdf16249765", - "9fda1c460d38ea1dac8e40d5ac33a36b3ab779c10a7764d4b5cdc42f23b7f543", - "0fb8f9f08fb827bc99fe4baf134fa43ef36ae77f75fcbc36ad3d234e11b23f5b", - "91fb8877bab0408eb35937132949ca19ec5f03abd093e27947d11cb91cb4eb1d", - "ed6a9328d06cee1243f8ea9e67bb5f07937587c701edc4225aefc613b4eafb4e", - "c1f2d44c0ebd8193f7b2c8b7534d41ede1b2b38d8db0bee51ca64d205921d108", - "069992a8fbf2f93bebb2d7898617a7d43eddefdcef7da9cfbec75cd856e6bbbd", - "93369482a8065a643e72a4c7502a50cee35173cb8c665469985b59c7bcdaae31", - "aec1c11b53c57f2b06ea2ef7c06c6711fe9e934b04c136261a1be408aeac0be2", - "a112d7edec63de3eb1e7314079b0d37c08add6fc8ca93579d5a9edfb363e7fc9", - "3a39b9bc3f3d75d3e3867fd5aadbb632ecfb85fb81cfd4af35f108fc3d1bac27", - "97a3b86d8731ae472f3abd51c9114c58ad1d1994337fe86d3bf208f2ce155fbb", - "ea7d5387c7ed112f409b9db1beb8059262443295533650fd2fc7ed9dc26df7d8", - "7b187dd84ee6990a58415f4e385ea7dfc9b0bbb1f8c44538e4ad26714c6289aa", - "7465d7aec70db0f7f65d1eff4a1cdf996d8fd5347a92e9ced9182ef48f25fc05", - "b8957eb83ec8a62f9db485e8b19ef16bc2429e224e8ae480f19d45607a8c3956", - "611aa5c719571cb7db17a8bc44072734b95ed38bb822746eac839284dc02e282", - "599c76a75c2038ce91d520cc2b202d640e9010606424641a57b4655c6af0ef19", - "446adb1ca92a3cb41224e47fe8b9c0608984653aab4719f304fd440a7fa13eb0", - "671f0dff916d79ec6db9ea2aa180812599f571dbfcde05e0a2184d521d201709", - "fb8eb63f9f8c32ee3ad6fd176cbecd1ca552ec4d64c3bbac8df07627fa86218b", - "eb8adf12449bda99d4ddbc39cb85dff88b74feb69c47e6b7f7a69cf2bf25aa70", - "aa6ebb24000a701f1633e33d7290fbbadea8546652a21d77252187506793fbe1", - "d6e0afab6e46701552c61a582088042b9f44a094b698fb13994c8522992b9751", - "7d49d52b292c9adf324e169c152f4d3640f62013c736ba7c4d5f724f6a7d5a22", - "66a6ddc273dfd64a896303e8822264c6fee1609c22e5ee6071d7d0ac4ed7b3bf", - "93aa06316598d67c1b23b5a2742c0747167aafa823159def1db520c2e5cbb1fe", - "09a3c70cda5002ab337e59311a330e95fe88d3e421cb7803c4e7e9e45383c6d0", - "5bedb7252f777b9fb80099169ed4c74e55e62bc1b3c9f52385c9d215ea7ca7af", - "3ee86f0257a790311685d80108852f54a802cab064c58845c64c498e009627e9", - "d085cb63ea0928e14cf9de23c8f1d012b469770f9d6ecae166cc6fa61e1a85ef", - "c43641772c9554ad882b83ebe6457b0411e56407ff08cb019846df818ce97b15", - "81e397bf936dcd4af176760448de05deaf24180d8b5c78d1d3b60c277f21b03f", - "a8357996a8f9179259c52a241afed106eca030d36e9fa81cc502ade51a846c47", - "faf96ad1bcce85d2e280341b5e5281b486ac2435865c5363b3f1b10f063fd066", - "3f1155d5eb565e0abe062f73f5a33fb2e68a69a0d54acae0ef9c0e145bfd75a1", - "5d6ab3a94e67abbaf183f567a7d40b48acfa0a545b35e38cd189be710a963b17", - "0d89451533f081bcc0e17692a612d356360c8a56df5ebf82a3a045833f24c933", - "eef7fdb0f7b6c0b51e9a15bf928d6dac0ca745a1bc0aa1b7a177f6004c7535c0", - "4c2fc30cfefecdfb028f0ac328fe802999bc461a4b94c74bb2e3940b3866d210", - "fa9b79b4101329458c6adc6b342114c0fddcb076a80c1d6a90f9c65c61dd751b", - "ddad4dad2ac65102c577d0a91a534021851cc5c62e83674a0d15ce10d07dcc73", - "0c21732ddcc8440210ff9c85bc19385fd9b2d213c39af98bfc3eaa5f53005836", - "36148dfe39f64a5a65298ee2c15e2eeacbd00817df5ae6f90eb3b351a27c5b09", - "56e4ce6690495b82c42f2fa61a9c97dbce4af5758101a4af732d96a30088a5e4", - "3095f847c810d6c67b736ff9753b68bd3624d9609775ebf4ac438b5ad54d88f6", - "3445c52add137e618c2de9a2457a442302a2bb54dcd02b456240638e1e84456d", - "1a040bace7cd2b4377ef4bee40ffa529e733cf7bdbfd91df54a093dc45137249", - "c355390b7257a4a64dfdd8700b7be65d712566814ac52f5d9bb93b6a45382cb3", - "fa267c945eddd02108a1b7ae34e2a6f26ead831b1f03d19380bb9b7970ddfb39", - "284961f21835d8bedef790fac9fd88126b645b6fa1bca9139c03152bb0a41d8a", - "28747c394ad2cec210a999256b18190016253a7bb7cfbdb83df0acfc9a2c84e1", - "5c126e41eac4b39067b9840b1cdfa9e49abc88dd3739b27e1272de9180f46fd5", - "3f2bf46574a2b47a374c55e027b1f95e47340a9100444287cdf7f75a1a219a6e", - "4d065cb32cbf909219ed708f6b713acd124e5be7e2315f72ee8f0c038875eb4d", - "2eb0472cd84220b163481a56b425cf54fd413b037b7e4659798489fdb3f49c31", - "e94e19f6c7e4d2303cb48943551cdbace15eade32ab94604cdbac9921cef198b", - "7e794d1fbd632751bc42957f7b35802e0bf094ec70e9e0c3240b0c7bed49cd46", - "f4dbb7174356e83991567f50b6b9021958a37ea92ec27d09f129adc1f806d0fb", - "f38da091db33f39a38821c1ae51324cf624b84a521730b89f67ffc0803748386", - "cb8d47f3be2d4411b1b0ab7f48ce521c67dc1091d70ba1ed498bfe3a1bf26dbd", - "a4100bbac00de8315fa8d2fad10f078e58a423fa374b1b6e4715a17e3874e6f4", - "fa31b0de21e028b1b4cbcd3fe77f794fd5d2b8fae7c282129386125aef25f7ec", - "ad882ff7cba2cdcd966834bd7538692de78a733abf14ce22ce73d622dc331be3", - "847e0d6c53d392c683168f72ea8efd1b36470ac05a561f88e0ff98902bfbbd41", - "19cafe2528a35eef14861dcbb678385e2080f70abb7c2a1f6777ec4f10d43b77", - "1b04cbef7f9a1f70b3ae086a341e26d9a18ff9125da1ad198756c5ebc1d56bca", - "ad0d5b614487514b37c49d9ac387cc3acfa77d24dc02f0aecdedd31e507b7a24", - "db933e33ab40f9e69bd1f695c024114d6ef8cfac3667b000a24c2f259e0a250d", - "5eb3b7505e27703f9ce16ed16f1ceb0a10d6de5f103e1667c1cd8eec1afa26b8", - "af47d2f691608ee620772a5f03f74867d2b89da9a6af20ca410b4c0fc5cc95a5", - "5ea8f230bde029dd58a8153a6f515ae555f3e4c1b6ded13cadc976e57a7b02e5", - "aa32977570d90673ba04b118d1c09ff8ae0642769fc3a5cba2798fbd40af29f5", - "abe720d651f0808e8aea46ba45e51bd7f07459143ab81ac39361a26704221aa1", - "a83b1c45f9ef2225ae65fdaeea66701e10da17c002da931c8e5b9ea49a76a3db", - "eb621dd1bf84b906c0aecf8138b1ef80a3696ffe7277ecd1ffbd741110e134d9", - "704589b458e260758fad88adadd8eadc7ddd91b6321d9dd842f35185cb00bb50", - "0e8e048628d436a569a62b021552eafd852eb8e3249f52d1e09bfb45952e6759", - "68a78c78730e7d3f0c60a5097ad3dfd907e950a5f4c5430705aeda16a68d974a", - "7754225bf633aa3b1a9c1d4f018dbae7305054c9a24864b4eeac9c23c4988eb3", - "83b2926a42e0e32dc8ba77016ded73e4ef40770b52d9b273bbe6f7d97a133687", - "dddcb3db1e245611703f0313c0569d415083d771f1101ce499192aabb9a41e6a", - "008ab22f9f580ee48ab265db9819870c4ebca77f4461f1126110f07ad44716eb", - "df814a9cbd793852d87c2f2f7cfb96571865c1e07351c81d116ab2159db01001", - "c50433fb0504fa3e692e7e5d7dee7d6d5776e2b4b3a7187d81e43d96304b0ef9", - "13a701dcafaa09634eb32396d3bf909ec8f1f7828956879b874a3953b324a6ad", - "bd5dff7bcd349e3db21a5a11607b4d505cb762fc9a8fc039cb95f2f272cbb535", - "a4f0dafc12cc5bcc8408808eeb9de5e561791c268ff0b93a56a342098febe211", - "7d8c06f976fd33ea27755fbfcbdbd99f10da4c8141b5c5c55889864d936bc4b3", - "decbfdf0b927bb3b212cb0e3c0903ea0e4209084b8f401c70dcecfc97725f08a", - "0e0f7c9f90c355c80844f2d9c669c7db4051a2baadc06826c3a1ee06ce9286ab", - "5586c2fb73a33c02143cf1a46c0bd4bed814b7b0db2d6e834662ff376eddaeeb", - "50d5706b50785965015e63bdc494b77c484a485fd609045b979b856ea64696a3", - "9b3c6e52ecfa9e762394d98ab7e6e9b5288721a72a39ae2d53127c053fddd55a", - "42fb49cc8c0ecc016a287e465d7750c0435e2d9c981f928331255d53c72d475b", - "58fa7472a30a2c1ec63a02071d863306adb5ff54c58a98699444ba2d3e696749", - "5d78fe61dbd72536dbfa89c9aab3e6e5193fb44e16a06ff63a02d6885ab926ff", - "2c559bcb42f767deae2d1c70a6f2a04ad2579a3c5bf9a21e6b45399d6a011d47", - "26182a8d30dd7b4ff4e3aaa5efdb55792e02293fd3cf3b3a8c866826c151410e", - "1c23658f75cb468cd17f75b30f57e8d38cb7c1bcf3ffcdff0b9ad70a1c9bdc49", - "66625a1e96b2fff7cf0c749396f7dc1309d6785514a0e7e3afbe4b2004da3c6f", - "2263c7980b8e1c3241050a1fa68b47f0a01c3c4522bab56b1c7f0812a68f2544", - "341526c5ee94c0528e4f6e9dea87b2f991be27c89d0317aceb61b72c95763e87", - "2b8a72c26a312be2c4e454f43236531438c5b9c15d983db0e6d184106230c386", - "f8fdaa4b2c20ecb3bc1093fab9d165a6199c86da7d3c3183bbcc219478770719", - "a5efd5b02c05310c0ef84aa9f80a9d2e006bfe646822abbed71517bba38ea626", - "f445ce1c31bba0cd9242b227c34a7293bb75a0362c43b09d82c6bfdece80ab4b", - "1860f1883fe799ea3817a9037a76dc406dab006dc574e9086a66012b80e10779", - "5e88389000160a912d1434fd533db181f320f733ce162b1ed1258da53648d74f", - "0722f0010f054a9babc76e577a734291367abf358741cdef57cb22447f017aeb", - "83cd3701a94dc406d104c07799d51d04ebacfcd8995dae47716bf26c9ca33084", - "6533e59729ee5a87ca092000fb9796485a71fefd5d641c6e2844cbc2418be864", - "b7d2105c145de0450a47d32fc9161d35c1bb1fee86cf05c8281b8903dfd7b650", - "ea03b3e142b6683818171a615b4b9d11d083e25b7bf97c69a2e526af5f4084c4", - "fa576cd9ac84754841ec3b699113f6735e87d7ef0132b6855c297caa83892255", - "31a39c2028a9896d57fa02b535330c8c4d8a1c4c79f20a9acd8c96d83052fdd8", - "8d9f613d7dcd4f25703923c5819e2dfa8402111905fe20192c61bc550c3f259d", - "510909af7b17e962ad8e7efe6998e29f4d390c506485e4d560e44998da4a8a28", - "22a2cc4fb7cd13c3a694efe7d02be44f63b2ec8f37b95cfd84aa17eaeafd74df", - "6a959b513fcc17746f421a17e4e4aa3698b92860ff585f05f7b4f2fb34fd9f80", - "b0593344a958f3290997da7982d250d7bd18f6c78da09f343cfce001adef1f9e", - "f8bdf6b583c9125600618ba8a03d4ff961d6a1f0a4e5ce5072c51d0cd141b4ce", - "217337335c8b4f7f4a6cc9bec97976c64c09a8706b9e16a79599e69b5020d60f", - "74737fb7c2840356ac19e2451533cafc4d1cc204c45ee70a67a91da32ce970b3", - "b97ccf3725e0d3a670f613bb6adeebaf71a04af3335acb09a1813a6ac2fb8693", - "7f8aa96d278b23988373afc85c21285790c8b0a6bc0f5632c3fd8a9e8e4b1f03", - "94c4b8632cc08c53c441de46a60e7fa17923b05e8e6c46ccc8f3cdf02ef51ba4", - "6ab8a274ff6cd0e27f73709e65dc42687db9a374d9264e08f27d4287e94090bf", - "fbe5c0271c0bb56491421c79077a35d04c412cb7198033df6dbfc093aed15a51", - "f83eb2bd6de8de3eb4eb1c5544d07b30230b9baa29eb1c417169260de083c8c2", - "b95aea19b67665f87006a41e6787391987742fef18aee0d6544696e0b11997ff", - "85321bbba4780c41c665de8095e8bb4796493a1b4d26f2c184f16e5c290c192b", - "b47ebb447bf7c648a93160c4bc00d0b64a40961e56a86b8af69cb108c4bdad67", - "2db2c7fc0d7c4c70e30db3cd64bd77271bf4b3509bb3c4f32f80363a9a3cb4a1", - "bd8ea17499d55380799ccf0636cbda0c7ab89ec4248d556feb21a19209aaceb4", - "76ab09b803a564bccc020db5301f9e95b7df72e503808808c17e5c2ba83b57a2", - "6ecd5811642962a348c081a41600c40f25c54db3a5e0e47ebd716cec4786fc4d", - "6a3eae7dead53201d40cb48985f063d9e156531e084f186490ab8be43c8817c4", - "52916c96fcafcb96145399f4886f49abc3b000703b2d84004277a056b071881d", - "be95b956a282ecf85df8576b22aa28b2482977ee7cae5bc7c7b62b96537aa822", - "453978616c2c4ba87b0e9d738ca88c0ce3ade24307263a0c7fa2bbd6da78d6eb", - "4da9217953d284e0f9754b527a489c6270dde91502cda50478d53f241586d2e0", - "9a53ca9056d4890689fe1b899979891f4747281023455481ed9bbe7ce5320181", - "6d451139f83ad504f2f9bc0ce6fe05f0c82e7f028d1cf3e71d49a178b2a17f20", - "04eb42ee27139e52737267781692a229ffcdda8f4176ab3759ac834f9824db6b", - "1dede486c053c600adcfbe9fec1a32b1ac8b1964aa3a1d5cf7880412f92aac78", - "9fd6645c8463b0e9063d5eb12b9f60c9ce9eb17835e15ca036883f7fb2cef7b0", - "b17f998a06fad487695c98663b4f10ab2ca1c12bd22f323d51f97a68deec078a", - "4426b74e6d336b4f3feca889f973bb0c09bb1d6746c88bf14ffddd7707e68d6c", - "d88ad9fe12bdb581a978671714b6379e2905634d3ed61c79033fafa3bcffb721", - "b6306680c301f7414f6a8c5c63217e30d69325ae6a0d563f7cff5ae768d099f3", - "25bc66fd42473d27699a1fcdf7e4a423051dd31453044972b5ac7a9227a9b543", - "778e06bca49fa6e19d26b9f14a42c3b5d952f28cf4f10ddf5f04aac6b58aefe9", - "d4c05c2d2316843405f997602fb515f3f709304d2624e34603c11d4a061e7c9e", - "ef4f7167dfdc0a17fe13e95de6fdfa3a08206e04665d25e29f2267d10cfd6c1a", - "4a42f93464329e34b83a55bc9435e791149ad4044f3ba13c5e5ca9cc20dd7851", - "1e096d832e4c62a67a75020ba804300d1686c6ba570f3371830c60cc4a99006c", - "45ec8218d5108a305c14bd22330d614aaf772a2cf9d3bd594b7c8d24baef9c4e", - "7105ef8f3128d547e38e7deb335b9d0490c88ab53e12490209d70666963e4ac5", - "80d03ac26a3aba27d01beecb530b9055dd28b199a52bcc53704c8e418ba437fa", - "2aa6e130017f5c8cf0fa9dde556ccd9d3c1e02a35a2a8cf4496357b625bde9a1", - "b5f3e40c59450bb04b92b72134afec9e1392868aaf4a3e9169d6f80b5c7a73e8", - "f3aa9e395babc81aff63df529672c82d804fffa8262a99f132b643fc2ddf990d", - "57a67d47bb9a613e53e6e44105ba480ee7ee3d99b8187e5c3031117256f76bf5", - "f701bdda806b0bb6cb860163a99c0cc81ae4c336880183202c40c4ffd778b630", - "7a6bc745c6f4e0386726a729d1c6f9a72aaa9421f3e0a1481f4352a2c66f6f15", - "5289d908902555733e40e0d6e6c0f40bc9814e1896843ca93cad08d0907293e2", - "83a75464ebcad4672dc9f71d052f4c1a1f2834180f3f4628e21eedec5618dcda", - "94fa69f9c923b33f7ec2315c14e6874d72cedf62e656bc0430dea374bdb244a0", - "f5763f7e9b361d2e82bb38d1ca897013d85932fa19b40ddedec52a6ba4d52840", - "e1fed06e52699237d3675cc2c13385693f20a07ac9f402dc409730b008eab44f", - "d1087a2a29900264e6e29e2fe375ee1213cb92337bc41d5571cebcf2b61d30ba", - "e4a6c26e74255dcf8825656e0393fcf25fe9ac4d314101b9c24c738e3c95746e", - "2c4b4548397cab282c0e5e44926aa061aa8276a152788937cdcb04714861cdcf", - "455f89d9e79509a3b5c60631b4b40b6f277d55548a5658bcba7e6d80c1716286", - "f4d5df9747cfefb6aea4cf3438d7a55edea905359d879594ea7133f345dcaaf4", - "03b5a066106ac656315565bd7e39ae6333e842d74e6908174a188bbdda1493ff", - "7cc5fcd1ee0a8fa6a833c24bc72cbc6e4d45054c270be65bb1035789652a719b", - "a874521d86719d392d2a223d81271b8a2390a80907e0d7227cec7c2e27c1a247", - "cde624ce1b4bc5fccc32c1d7b7760c95654b3dd2525737af2b3099e8107a6ef6", - "adc8e27e1c3031cb3bf25c35160324e37432881e171ac5668d09e7dc6bc5348b", - "9c428555a10a4644396fc9ed1864016a10580a6c6ba4b2773a17f657d96c70c3", - "4f3e49ee975cab6eb00a1f9d046b901513787f3224f7d383251f0c17fc7a2e6d", - "44f8094cf27fce2efe27880697a5880915791ac911626fced58ac148acaf4e7e", - "ea572bd813add384fc2afb103553d8830be28164d94c9aca5a8cede234352baf", - "99aebf96d2599bc2c1a013965f6cf921b80489072c95019943bd0693b49d540d", - "3f820207ba723df5d058be6ecb377778201610f2edb6150cb8037a90ab6aeefc", - "389454a2fd69a876deb17eae6a58c5f0ecbed450964fce10f8616a9c8c1f1b94", - "eb7704ccede1d0ebced2943b15289f8427e9740db6bedb0e40b2bd4c3fa7d977", - "4e6ae7f6e3019e4f724bbed93e4aff9ce5f50befcf379ce78e567be47f2e249f", - "8e5b6416e0870eb995d974c5813b02734ec4ea31b81196fc46ea83208b8ad799", - "d542122e476a25e772fa4e081dfa3c199dc6d2b4bacfba0a4cd045dc05beffad", - "4ab7bc5e4eafe20500d1d41ea5eb8e3bcfd45dc10c431c90c318e6e8be1b9008", - "4a03ff8baf204f1cb5dfe14989638fd0276d3952a57fe455d715cf57c6b8befa", - "554e5661393055b76d468ba813fa332b28b92b8c06c5fdcb1f98a0c7c429eb5a", - "b6efb8cbbe16e4bd47bbd35f69bd37e50fdf3e31568ce9cefdd223e88f6ca058", - "6bb85277f8dddddb3cba6e39481474aefef644dc176c33ff26cc769ca7f0bcc1", - "cbf682d85291304fbc90e40026f0fd195866fc9a64f5fa21335bade2d7516dd3", - "a31c28ba266f86f0a56014641ffbef830cc2dba9fb6486019252139633a703c2", - "8c05bc483b77eee19a05f337608376c8859cb1a5d753dcf907a38c423186ce4c", - "47292dd953ffa916a6181e9eb566b1ccfd98536efe10eefeb6e166cd3114eff8", - "c2fc96ef794aa2d2f685773a391b043d76ffd728baa82097f2b3cc15a9342657", - "25891d7af9f1a3cb6c848a72170f113fbe55efa8b262328e60fc6ae328423220", - "37d44c5260082c60f8c2483d481e7c99b448c3ece6edb74034895e73318f5d8f", - "5f44cb71c8ad9695f65fdd7916570091fa6405c088722bcced2b25ee04d842ac", - "fadba086c01a47b8e312c7bbb49254447e378a51433f45ca43fb37c92c341bfa", - "e36c6092596028f4b1a583e8230759116ccba17abb5df6b030508a3a28f32f63", - "b59250e2f316ce41c73241048b5d8d361718c7611919f4d52e77574626d6c097", - "7bd0975c2a50806fe638b7077666b37dc41ffc738cc7120981a9e0b7037937a8", - "8e627bbac087f52adbb0af48281eb2bdd6334d26949d925e6f939f640991aa3d", - "58f6f193b6c9b4aac93071078cade566d5f3444097ce9bad6407d37d46cbbe57", - "aeee59a004ba49339bdd4574faac460220ea7c541191334908fc159696cadda5", - "72e1037ebd79a21daab1099957370e0e27db87b5f1b52bbe9fd68acbadc8d36c", - "0e8566e2ca4ba88be66aae49a583fbcde9967d1cf5a9030df96862722f849789", - "622934a2f6e22d447338f1ef76289a0a4dbed49d6c7d6cf266d25432156c7314", - "70028720684f091c1a85d11cd979f4d9e99929a73ff64b2cecacc95206e05ac6", - "b7d2af7040013cc14a68397d84e227ed29d363265e2d3d8e564c6416e0405617", - "84c54368194c4d7ff6aad3b8ea6a07e5c2199caadca8bcc5e9dd00a4accf2e2f", - "48fa0299f80086ea57874269086c56d8552c18fad299d4cf31af293cf713fd06", - "7eabd6ede3208ba4ff379ed1c70a104f3af3944c59deca0e3e5936df3877f640", - "3e18c55e6ffa09aefb1a325eb17732e8985216ee9590de8fccf7a490987b81e1", - "cda1b9cd00a57fe4a4f04ae0b9e0a63c704ba936a012826d1e6b5f5bb9cc17ec", - "8960017a4aaac8580d5091989bd83fe729208560a720f828aa65683e377ee53d", - "e8b65acb868d70a9c07cd6195af529fe53ea239b96c52c5baef6f44057df4a4d", - "11877833f3a7226ab2e41e6e1577abb0a701f38dfc9362e2ec74d5f25fc46fb9", - "a2be4b03fa0a391971e7158ef62b0764789d9b02098aa3de338fa43540fbc241", - "3a2c5eb9c842b4551b5ad75e4dce7c2a18ae9eaec55a1b42113f7f35cb7ca3e6", - "f8624c9e2441bad7166db2166bc969f7a8cf7f186edc4c04aea2e82dd2137ecd", - "fb0fa41f235775f5fc1c7c53301c1e22ed2fe5b5bf237132a0ac7452eb71fac8", - "067c145b3af628f05c0e8f6c9bfa364ea16c133404801c588528000a7fc77311", - "bd2889e7732f93175ee6689b3bfafef9104fdbaa91395d97c0761c165e78d96f", - "aa00e833fb4dcb2f0fb08865808f16d3c5a14cc0cbb19d70cfc819a8abd1ae53", - "8784c0cedbb645129ed7520e8eede91b392497487780fa8395c5439080dddb80", - "0d4d81221417f1d56c89aea1bceded861b550c67282e6a457e62c453683a155b", - "373ebfdc9a6ae08317f1842c2753ceabd7e49e8bfca54bf0656dcb5ee2517bc7", - "7b166163060ec01eae7704f79ca02c16ab5893d013d9b0e9435df41a2809dc98", - "29cc2683fe81ae74aef76a80cfbc017fda4810adf695d39af35c61810ca05e49", - "cd7471910cced70ca39af81db0a1cc1ec5e34bfa6216264aae60d4bed740ea67", - "50a74e6148aeddc016dbac396f73cdf974d641a43462239eae53df49c28cefe9", - "e214702c56574c765a8de6a7adb966537436bd5c7e1a63323cad8ed373c0a0c9", - "d0baa24bdfe7abe4fc8126d3f3864543a098f0908712b169af4d78f0a8b15819", - "37503874b22cfc8ee11e6d6b91d5e2015e5219b1f4f9e4059cafb5c10bde31e6", - "6b636d2119f4c294ed8fee27c91d6f2a4689f806772ad3de2489bd9b38a61e07", - "3a2057a34f30fde65106dd877e52a1c6c8e100bc845a0d7e2b0f3834e271a496", - "ca5db98a654a8e941de7ff680f88c081a3a34317376880777e3a3352d14d3e43", - "0e6a7239d4d1b0fe3c099b57294b7a29938963195209d7597af5c9c184135bd6", - "9ae6b0fbdaec4129e147221b594b7b066ce6311f24cc698b0ffc28e5c2e3fa28", - "30743f6f4bbdc3297c203ee7ba9a5d1a93bd501ae84cc92a78393599051c88b3", - "e9ca74a02340b0c730b7458dac640814647130659b2308d2318d187517f86976", - "9b7c7dee017fb947eff99bfc412712de79385030dcb5b56449f2c69ce28269a8", - "96aa1acdd56f9f98d0f00b16defadfb0d14b14c59a22af8df99a6a4009f27b00", - "867f463c9bcd892ad2ce6499f7d54072b9c8434ba0423477c407d0f0e1714cfd", - "3d8f99d1ef437d082539fe7edc0a0af92d97a8046fb7e25a1bd80d1cbd3dd5db", - "abd97d2d67722b2830adb736b9dfd5619f3a3051980521ad3cf172a4e104b950", - "67bf63ca193d211df365f22bed1775eff1c72ed2651dee18c0922d0adba7482c", - "93dd02c18fe117739eaf748d414c13d61b79ea69903dcaf667d556b4adb35794", - "13be8e3c397c51f4a3648db2b2bc650436c0a7b0a6ab8ec065d5417d669425e6", - "55b61418c0adfa7e6471938c2ef2cc4c339cb543a4505ef95aeac936b1d8a806", - "1264fb63f1862b9174fbd124371a0d1f6a37aaaf8ab5d69683198985643d9337", - "d6f93140cdefcce63c772515fe49a5d8c36f80c11ff16042b4854fdb6d90c37a", - "5daf34eaeb7df072a50a0a5f012256b65ff520f27c70aa9e9fb89df33fdf6a93", - "0187af2bec22d34a066ef906dc8282ba8a444144c15fede6900c3dcf26e9a613", - "cf26b3c6ce5cc05968d897b21fd2e84e334c99526daf148ff84e9225c21648a2", - "ec55ecf79807f904dfeb5a3cd0c439c985750f0fedd4ff2b96c07d39e0e83901", - "3181ef2115b8c092c94bbac72b7109eb2c6839f2df1945c0f1763c9739f1875f", - "149f156df3ab877950b9f46651c0a1844c786a8452343165a2ca4671d5167823", - "9908a5a75aa8e5e3493f78150a5f109fa59090c6bdb4861ae02f4fde84c3c321", - "93c9675b3f6e5308162838ff4ef0879cb590be57997d5fe1b5b654376298c019", - "dc2a2ca58cc8182d5e5b332e3515aef42a6d544aef79ee3fbc689bf85401ca27", - "7e1a41a775a8bfe1634b80689095b39c15b324fd081a3e99f4f0998eb782e196", - "f9bb24420b536bb17c24035360d72c7863499d9fc9e93e680d8b904b34316724", - "b7fe2d5bec26329afc94638d37223e61891b704329160390fd00d01970e05d6b", - "ec86950ae9aba0465ed98e52d30bfd55db61062e43478fbbebd352d6e4742ef4", - "f56691307301ac2b0c15e96fcc9081e265dc123110ed535c97612a26b5728735", - "4f37c1f2e72040a15ab5b3d0b717cb441f84da516c6e26444bbad7aa4d5e0ad6", - "2aea1ce9a527d53df73fa947689eeb53317f16eec97d206b1662da268802e269", - "aec68c0741e5b20f787988cfe9de7b7941b20dabef3a3833f0fe51dc47281057", - "5e19ef7ba92271a7fa7ea25e26c928d7df3997fd4b287643a97ee2cc09a7750e", - "1ad9053135c5bdbf8b1effdb2ffa26405010ba7a641f50662ee10fc74ba8c91a", - "29f1551cd400d3fbf20bf76aa7635fcd049a3aff5bc694d6aab96f7ef023db03", - "bc0fece5273fed7ce1fff90efc2c6f8e9a859cb654f9cfccf653d98ac56b75d0", - "abd8fc1e118e766523bca86b84813b573b0a8b17a998f6072b8b1bfb6272e715", - "4e843ede90486f15214d165a93d2afdfa3ee6887f7585ad00744e366a02fe838", - "d5cfd6d93cd809a16550159d923ee94f0e8b3652e271a1193768bbd2d733cdaa", - "db4993a7d00030548dd8b4163e47d1520854dbf4149f0878c8325b098f0594cb", - "1f3f0ffd05f3b53c97973801669afe10d69f9ee53db288948f39c1a88e99df05", - "f72f38b1128c2e3e653a1cd989128a6c2b731459530d5d3d036a146845020c5d", - "119bada1617d58cecbe5ae59177455dc21444b27e658972fcb216c7920f805e3", - "1b4fc98b1d69698da6a1a7a7fa48ffff93ea8ad0e0aa54f06f8a111c7d34cec5", - "61d0514718e85f2e32feed571cea7ebc295acf25b22b466ebbb2ddec33868764", - "8e0f87b3fc829a98df471a38afbfc522bb262b34a12673df02721152c9fd1956", - "e92ae179beed8501e46e0e13e124ed8867f627627ae0b7a09d79afa5585278f8", - "1b681127cc82a177978f66531bb44a2a0f589779ff2033f94548dfc6bfe53e31", - "b2290b5cf623b833e33667b839b86b2b6b031a5a418f20bb1756afc2f748a5d9", - "2a62b0d82477e617cf923bb18fb46837910159e8166ae1696d65606590d4ac03", - "10f9ea0314bfd1b6c8dfb966ae4e0d1c8b2835c0c861b0306429c88ea01c83b5", - "3b00111c458d16c4c5b84bd6b9ef8556be132a8b0bcf1170e1b2c85db4c4fe66", - "234ea1c7ddc08c6d8fd0099fdb20d794a883613ee989620bace826a839dadc34", - "a393a3ab2b649f2a63ac86389f8a4fe4594b03d125760d1b164ed87ea6877443", - "6d0157ecbd171e3baecb665d1f28fd000243f9bddbdc5f4ef897ef77616adb9a", - "39c00c1f3abc02b467324af999c8e6baa6cc8aa3c09747d40b263369501abb96", - "563b2ca57b0f9d550d3a724d6664617435cda3e2da72895c768380f60007e869", - "d9d404d0bb2066b00a89573071ca0b32d4049dfa803c4143aab75616d8722a3c", - "1f66bf1dfd24967864fb8b6e27f7e26d1e8ae77fa61aaa1d21df382ad0b1c0ac", - "0dab72bd5a89ed7a12852591e2ee22d2b116b5d0a8cbded8415ba4ac580f5708", - "2337cec7c962fa815205688380081a08412018680a09d0db87c1c90e92b5bb3d", - "fddda64bb4911421c4f861846a3a138b2604c3973b3df94ecf681d4df5a2ada6", - "281df79d0772a345c64cca22bb03aa6f53fc47ad77439c33b085f0acd686f610", - "e28e13608d95b26a3126cbf43b61616d838e1bdd6c9a4c84ec02e9e10f156bd2", - "efb458f93e42dfbecced88f379b938291ba41d17ad592062f930737fc651f78e", - "1a1cda45897c9cc3da738d76e3f252906b6a6248f421267b54edf7c683ba8815", - "672c7b852318d487627f7ad20fdbdd8a758a33c05d32c3f0ff17926d653463ff", - "0741aa1b93249e93983b1d954afd9b1fc17fdfcf925d4e4ad646505847e9d0b8", - "9a4bd7e7f7ca32b2ee2aa5392e969619b9049bc8d0b3856775d2f243547b8646", - "05ae7a63d3fedc713761a0b989b1207af764da4d2df53443d7a9b71176294d8a", - "f5eb1f41df6f2ada3bc1f43e01281e46228724e11b42c0f4fd3d73c27e949688", - "53021a3b160ce3ee33e43efceec03b2656b740e65dc8f20a6a7b47b44e22c03f", - "2f8f8845335281971af1aca5ee0910fc97369a73ae29089ea0f3bbbee361d2be", - "00fb07711f092cad4029dcc358d5c6a6900e50bfd994bbfc617f662b323f25f0", - "3b882c8bac321cad98bbbfd3863ab70e0953c4d656e2de4fa0ea0a55b7229600", - "498f1f807634e46292a138acdb177dc4e0ec0ce4b2d7cebb0f9382ceb40b3186", - "4823570b4eb04b60ff2fec08541734ba7f55cc08aa60b7b933a4fb7616b276b9", - "09d88e4c391fadc0486cb5b78f72d61ced8beff9f0912874d84cff179f02c85c", - "78144c5304da9355ef80a2222a582a3669eb42c97e994882871faa1d07206b20", - "a24c663b0328507d788278e9f626ab8df961bc12eb2b91eab22615d004b666fa", - "be71dd19eda2386bbc123554743b7c2d45415cbf1135b36bffb9ad3d9cd10959", - "cb90ffcd4b6051fc7484f65c647a1afae2c3dec66e2138b1ad113e444a5944f9", - "0b6f0fb010c0b7b2e318ae5cf1877a870f9543021bb1a43fc6f2cfe0ce545f4c", - "5f381ff5079f513fdc58d656948eb7966479b834a37fa6f8e6d2dd5873297a5f", - "d468f55120a756493d5ac5a42a6d2f03365be45abef4bba8076f924dcbe62d3e", - "cb2ee5cd8773ca603badaa9c0ce2e11872961e01cd9a8ae38219ba0a3fdae2cf", - "078f3289b7b16ee2f36141b91e6ddfbbcef0f187a633081ac32c22e1828d59a4", - "2237f2327e22d99cbaf1628fe811e7d756c191e6d8e030db571cac8d0ee18227", - "f084d9bcfb850c97f86c341dd62b827c18a46b77c1943bab6a6dec30f91eabb2", - "e8db462fa8b6837d3afa9220287b3c0a18d33180d72e511b36501a2c773a83f7", - "35c29e94b6fc53d8148d8d7188198df05d2034fe4e630e49fb3fdababac27bd6", - "8021919b957825a0c6015dba0e0d8a168dc2c784c62537a21880ad230c395428", - "fc24faaa407a751029dfb8937869e33fb72f9ce63373d2cd79ef60a04187fa48", - "78a79624d71530c9494768c97be2f053799e7430b1a7f701ed8e6b786fe41c94", - "c044d15e6b77f52d007cb8a544ac7538e134de6cb5a78e89dfc2824326ede7bc", - "5da393a1324773d3ebeaac2b393541564a4cc6702707aad4eac354540d03f01c", - "4389b8fd2eb61c7c5730ef1c2a8196b194b9b97db734ba4e18ceff9b92425ca7", - "626428caf072b28efff5b5a5601ee6e300055a017b17aae8d17ce3e79a861985", - "80a3c4d69ca33e84e4065ff7db9391a2e5ac85b4ae9efe07d7bceb71335a6600", - "5fc74fb9da9c5c9809ca33659280adc9a7ffd9665d9c596b8907eeacaea67f80", - "d5647e5c134e112f3219990f60a4a300d9d4c0d7bcf2bf8fee4ee624b9439b5d", - "4e0aeda32f7ac2224a47685e0e58241e0524e6377e55be9f3c6b93c0473bf576", - "12f3c663e11f49e2c4ef28dca5c36f59fb3549761c370536a5ae4fb3dce940b2", - "02d655ba789b03ec6446fce2888d3532e798e66c186775bd5e9ba12aa5b72c50", - "49665634015139c7fb98f2497789fae6335523a1c74828e5232990091a61c48b", - "e0563e114ccec5fc04130b083ddd3deb020d603d95c48d3b76bcde6d48da87af", - "c6063dc73cd106763d3cb9eaa2b4db4b5be2339c3af885b538da92ccd521f1ea", - "793591a74f0125d511586343c18a0f7863e991b796fbe95db52d1f53517912d8", - "f91fb8ea38d45a760ffd486d963f036f4a662e7e8785fc8193e5d33d87df78ad", - "1bbd3b098e2c763cc8c12b0b61aa2e703d9c678e50bd73f38c293da055b219df", - "4d4edb5bf7fd8496c429d3b509fbd407af296598cb107dd0f0b56f06f3fd353f", - "c86b9dcdd8f3abff142f690a0791ef357c8c6657b387dde814131f93ec824f3d", - "b38505253a953e28f79b07d524347225f745fd20f46da9b1095cfe173dc7bedd", - "b09192f0385dee15058e8ce753d8967891094d237885375c4daa1c60af647ab0", - "58402f8dcc4ed52bedbf408a1ac2f37dd2890597dd825334eaf9c3415df5b64c", - "d01208f5cf5b77fb27dff62d15fe326f1d8af9233d5ec572c026c188b26f6f89", - "7a0b787cbc0f4b0961987956f8cbc65d2185daeae984501dbb1c14960fe92bf7", - "d5b597cd9e1ca503bdeac67f0637cf15f39439d0566e68649c19c5f19d06e167", - "270444c23b56c545931010c69821cef64e011e60c7c3905fb1e161b1571dba80", - "9ee1f425d693240d745da1bdc4a2fa698df94c1f3c092c43441b29d469c7879a", - "3c025ed2956d38ce19dac2248b892178f72477c7ec3a89606e51cc9b1388a811", - "3e3efb2330598442cbee146b3ada1e9fd085f73587f5cf30a2bbcd84f1a519d4", - "680fc1e155e0e718a1d5406f9f60558bc97cced700523bbb418dda900a36693d", - "c5a3d1fda282a897f47e7e8a825c0fc362f2b7d07ecc637505c8aeeed1e692c0", - "e1844ea1129e77f1688ef8afff31bac9186648de48b7236c650eb4956492f444", - "2cd43409f0a361c8c65956c9b6b56a3b8adc64c99a6e8cfa73e6f3ec2db49383", - "fef97afb82640cd228d06da649e3d37709e7240c56f5907995fa1a34ffaec21f", - "c3830491db51feec9c63e37950b324ccb7aa3411416a411342b564b59bfb393e", - "4aefe32dd5c1c14ffc92caef39595eae5090056d355115282e11391a8975699f", - "af984bdf7c2b656aead16a7477cc5e69d376552f324de4abfed7c7af8afaf38f", - "e803456b8373f7d22a2c97d82e7612f8d46b477b4e3a4ef4a227684c06a52f19", - "a5c8b93a9eed5fc20efb199d297b6ddc2146339b2f81c1dac79a9043f9926985", - "e54f2e7d89163ccf6291f16ee0e4345269e6abd4c7f1e36b477c6e1f0a94eb3c", - "0ac7f02157a01934e6f5ef3a20b7b18dd0c5b97eedbdc49f8575caddcdc36c45", - "2514b1d9613a4893e7843b530672a238dc71dc439731d6f8bdd0f9fe4dc88db1", - "c2c96e54fcbd115b79656da4abc7a87738af645e4a4b8d2daca02e6152fd2542", - "d0aef620a8a5de209764fcb51853d651f0405653200e1b8b1a192a9a2775602e", - "6a22d09307f5805131be3c700999f2af7f7714c5f3958e58a6928cdd54beec76", - "b79b2173b6d25240b344b8f703d8fb779f6e1323c9fd69306f6671ce327df1c3", - "63e54007812993bd8ba5f96fe665df6b043e5166d4ab0ac5fea8ba4dee7d94b9", - "43f7adb6a923664626b1375a1e7b1daa22e28e120f879e92205a92a9f64d050c", - "ce040c2b28d142876d253401af881cc922fdb185a7381bc96a45b5c9047401af", - "994ce7d3298d6901c9558a7cb5d222851bba55c5554ad25b28b63eeb8e178b16", - "30beb4c41da0e0524c19dd3d7b22ef203f01bb6a153e9bc9b0cdfd906eab2f5d", - "223bdce116ad855198e420d5191e47eab92a21b0b3ce6c78eae813b87aa059e0", - "ae586ff65a51dbb7b4ded40774ea0235133d827b6ceb2584a1a643f909869e3c", - "245cb53559f873bf9d8b953d9e144fc62c54da64eb74b0360a9032533290bf8f", - "5dfaf08f219085b9e1fc136de35a74b3877e75174469191caa6bb6f3a40bfcf4", - "03f9c90a953e3d3d2db215a9a8636aec927b154fb3baa293134095fa05abeeb0", - "2d258526e4b6271eb79cd311d73d8551bdd13b299cc5d5f21a39aa984ace063f", - "7df40fc660a73b924316f3b9f31d210015e73756c4914dac7d6e60b5def36221", - "c56da001162fd33a30dccf7824e5913ff492b79ce351d26bf006981d6817ce1e", - "9f9fdfe1c13f6203b9e8e96cd0d049c26dd957ebbcdcb28677f2f93fe1b32625", - "3e71e5dbd2c93f230801cfce7d23ef78d7ced0ce9aea083f12ca92460bcc4bec", - "da5bc0f6c3f37518e317e3a360c9a29566c76be0ad8fdd4a6bc5c3cb347114b0", - "5a9b6e2bbb6e9568647879f03926b3bbf8d00a38566c4933b10e4eef65a0b401", - "17b3f23e55b9c0448d4ff0fbfbd0eb35fd6e96c71db5b8d1d53c1ed5868b6d55", - "4ecbc36b32b3ed032a94948df36fe6ce1e854e7c1beb7e3f69dd52e7ab65603a", - "1a900aebd1d16a8cab5080dbea3400b63170bd235eb8840a3b13d461dd8bae86", - "3dc504557fbc414c00fbe6ed70146a971b8d6d3b22d6df7a512871a103b67038", - "6c811c0659dbbf040641109902df464d8a62ea522699baf48e773cc52da7e3d0", - "ab2f5a5df7d650acf91d3dba2c795ae44be9e28c857c5eeef9152b1de1983d38", - "a5d7e86ab6749d04b84d4c57c647a0dcea231aff1214af35387aac026c2d3143", - "169ff63cff2d6fa2241c0de3fab3d86813f862567ef591d3c190ee4b344bf821", - "2408615e2f1341753fdc9717bcc500defec034b523f0c2d1bb911e6dc9c62209", - "e4fc519ae27eb877257ecbb48c8ae9deed84edfaf585876b545fff8fc232a937", - "21dd48dbc070d4a6e7c9a112c6503d8f56a8baec0978f85559b05385762718d5", - "d9b5aca17506a561f840f43133d1197843051eda55ef90edec96ac483af803e5", - "1efcf6564e620ec6f02d8485676889424a739b6f57a35adb797ff0373e12033e", - "3134b53b2914becfe84c76f1a0f3f270821e977595f973c530059612cdad41c1", - "b34627484161d5ac3cc1c9c40b9102aac864d66d29a769d0dd4ca9f33754de4c", - "43ab1ebd8a25f2a4d71575e9f77dfabc4d6f1ac6ba95fc9425abe8aedfa5d64a", - "cda021193f55bfaf01f6a57428b97b870d60221769727bff87e7ee9f3ee79089", - "e99d32927222e06770758ac8d23a2ad0c622c5530637704a5fe85041d308ad98", - "9e7d0a43e584ac0de73370d34299dd1b8dd066515bacb58bd74d9ae280c2c76d", - "b014bd89a74ad5284dd3147a830ad897e3765130a49623ad6dee282ee6886b48", - "07084bac8c3a8b5bac0eb647a0425553918e0ab5b96cbd0c0084edb18332a87a", - "28c032980ae5fd64d08673a3e39216d2832532dd166ad2bf01a61bc5b95f7d70", - "80be0f86bb4c9f263da621e76037a3769e48c11607cc17e68cd25037e8d43e8c", - "0d51ab33f8ad40537d7e5b0573fd9987ff8e032b7f0252a329f937db8e19353d", - "6a69976021576e718000972b3db592ee66c7db566226705b4fa4874bd141c402", - "f0c9af4316bdc01f52f90d95b341aa8317f57121adc98dc684ba72f125b3d2be", - "1a686e618ad8cc0f1e86718c4779a9a0c15a8d1af26016dc8bbba73cb4704e44", - "1f01896630e0ab7a50698a05ad7f4baa8d6e1c70b7d23d9fedd2786f3b82af32", - "4fe2189c0bd4549ed3e7b82b691bc4ff3086066bb25957d264863a2019e2975e", - "5c6714c676a91ddce521437ddcba0a4fc5fe15877b9e1e3891cae7939f3a46df", - "da3856cbc42a1bf4bad38d4bd812ca9f4f074c2e8919d4ae1a5e47208c735963", - "0207599f37123aef700ddd325e1bd4453c246dd0874418a0019795921d9c36af", - "6741ef59d64492a3345f415e9c6fa584cda321e2ad3b381124a16f34851bf8ee", - "21d98b993b8be9d92e1d35d4c15596ffd4ec2ad443dc4973f9f4511b5953d245", - "1da069a23e73898b565cc268b8a80783334a7549dabe7b4bc3f7b01631fbafb2", - "4cc2171f318bdfa6aa849f6ca3e182696b9670bc4f6b71f2b90011f5b7d4fd53", - "0704d81c848201ccbf8635477a85f7f8efa2223ca029370d3f3c7f15b12ed463", - "73aef4192c14f2ae7093ab87b09744f22d49d56ca544772c29a32173f3daed00", - "3cac69a3e88a574efee61e5decd6caef662da412a04d4104eb84a866988d9b59", - "7c3dc35556d72bca22885aca07ba53b7e8d485e84212b9bf18c68e87f0fd7d0f", - "75bd5595061f23db099d2b2f2a1aaf2bbe242304f63ffffd8e486eac1697ff69", - "9b1f3f9e01ae3691bdd7ecd419e608b42fe3ae8e83b2fa22530c4324641fa998", - "8f0f1540a24ad6d9f3aeec4cc552a57bef2e90e1d8743210406925df2370a16c", - "7490f26e05c33a972071e50960ca57294bfe6a7dcd11d36646eb0ec470b18c93", - "2d4580565b3cbce6fd7caee28006aad7c92bcacd7d871e581194cdf94e457228", - "8280d52cead40df18824c9fde21be7a55fc669b7f88f65fc8f69cea69415840b", - "6b5b7d29ac9eaecb1f5638d8510865a7df35c48cc5a3af8cdb1b00f16a71e03a", - "3fb261770480653775661191c6eefcda2c457e704a38146fb4a41061dfe1e290", - "d67e36ee9d7d138f44a0a9fd778a3d3eaa11d71c2f4c3718de526da808ffa52a", - "398288999b50c09348c52204765261b9b97a2f9d4dc7394aaaf7df85a04cf97b", - "6a0788675efce3e48d7d954c4bf198df7fdc4f40d4ba1a07345088c2ea6107aa", - "e5db2dfebd26ec1647e4940ae80ffe2e94682514640df6a8ae5e6e6de57316f0", - "aad947c61876917c3ac78c77d53e65862bc9f6a2745cbe7b14a0197d5159fd93", - "82c1c3b77db74bef875b7918026d71ef492375624635786720b5b88385490a24", - "1d7e6329c70616d42d44533c6727ce104b7f3ccc8b1b5a6f24d60fc08969753f", - "6a4c53c82b4addf508c5de88a3d305b55ab91e6d9278a17049925e7e5fb9b2cb", - "1ec77da0c8711266e0f7a5a7d09d8c22d09e769243da0504cc8a6b27884eed76", - "2ec3df81985d55ae3e26a59b8c72c5472c59a74638293b4af30666f1627d19b4", - "149bd67f6aeb131ad16c71204452cf66a3e8d7f634cb4ced1259c25190c5406c", - "3d7bfbcdef5c3f72ee69bdf5fb6c9746ff89de45d89616256e57a657cc02b797", - "e7d02954b4711ac8b432e6e786bdef0ab3578353341fade7abd06f96ce2ce469", - "b8588913c14916b7d6cf06a21f7ee9307648ba5e4843f12e723f59bf7515e89e", - "148064645855029297b8dfd1ea05581445babc1056cac1cb0aba2d009c4063db", - "dc42de97c95697275a8eb48e94f748feafc78fa36bb721e9ea0aca9b7abe6794", - "a8a457c65e024080afb61c6a4cb1fd06f99224fb7ca7ca8270e4c39e2bcb8ecd", - "e3286f81618b24049197271c7247b0ed2f61b6398ad0f8a789a16487b307c50f", - "61527925fb9771a1c8736c2671bbfacf2963fdc643a4a89f6963f136f1a9713a", - "2270bd337c844f6442085d3da10e7c6d2d479495920e5645654606d709dd354b", - "9cc96d3b40dadac602b363a38a20d368f876144660b82296108a29f60bb6d73a", - "cea8b3f80b2f075e23d5d4b99a8620c369aad3b485800bddca2be9246f6da628", - "438db069f152c2717e5a20e8802339ff79ce374277dfbef1cc76dfc94a6179af", - "57e0bfcf059d5caca09dfebe36fce77343d6ca786b0c9ef99c1b3c721be63e10", - "e4bde68ba5aa85b3a38a9ee314fe90702b8a92f735cfbff02b995970df5c0aab", - "bb96015e541c973a2f5d1dedee0f5676652f1ba0ea8494a8751018bd6e6496fd", - "c41096490909b76c997e9c068d11b144e0b2906753ef81c248e34d91985b7a67", - "a2ade5b3618f2e319f700a4f257374a39cb393d2b320e8e3ab1a2d168f2d5b53", - "daa9c230622b5ab59f142c53afacccf91f2bb08a115dfa9dc43d8b05c751fe88", - "7253c16d4be14240fec03406b501123b09687521edd0905345770046b9df4b03", - "61ef6e7244025aa296928eb38cb8ec45ab165425dbe5362e4bf1d4a16a8ba9a0", - "6876a41baf070bd06ad9632e4e5a17ded7e606f2cc7e4685826e14958b9747e3", - "eac65ab24ac920105db4145fd1d2cdb943cf9c0b57dee5f687c99aa636fef72d", - "84ecf0343ad8ccd017554cba546c02cb5b358293966ab1c13938f15c3952d23d", - "59128095134405f400b762d44b4ab558fb1bedaefb9720ff3446d931b8ac291d", - "d96af59ec3c2778bcf046254f998f28f1a06781bf68aa4ea90c82d33926dc07f", - "42b9ccfa6413298e433e3f3f29584cfd51c825fe1d53ba96e177d69c9d18d1fb", - "5aefe08290fe00fa731c499c867311a2fab7b210233fa1b37ce247281c556c30", - "86d0e7802cdab6f2dd3770290cd93b41d89f37804695fab11560f311ffce27a5", - "cb10c99b4170aef6ab8a6cc75a954d52b11920709c614fdfa0b4126658ebbe4f", - "5c85ab896ae4ba43facc5f5270eaeaa19fa040048d63f9d92edd4a78232e239b", - "257f1a2ef49fb7ff9eef04dcc31725f4cd4845f080beac9c0a4569877b9ab7e5", - "d57d7ef012f08acf48c6cb1957e0ac108a4f72f7cb56eba62493e3c57f51fa83", - "c71966092e4fe6ec595466086946d9c202f69cf9b2d995aa1ac8d5a116187cad", - "ef0488f90402ba41b0638097b6b30a2d0d6e2612dc11764b7fda0368f73557b1", - "6cfe5c5c545cff9714e338d59c77525435ad6b89501bacbcd8b32e4f30827ced", - "9f91d1a1965a31ce074737a23d619454b69baaf5873d5647342a8a8513e0459b", - "b259b40820f8a534d012502948138a205532d494beb427c9d700d903250f3929", - "dac2da8866c562746472ed938d719a600e254a1c857ec2d0ba695adc0212cfd0", - "beb04e2278b75b105d62a7efdbfcb146cd35a7a465dc218f6d79fd4445735d04", - "4adf4a6521a9ffcc8c2c4074a1cfd696c0a083b738015d4f5635f3efe1547322", - "951cf7f152a158ed5e7530868f1f8a0e65ff8c757ff1edc8dde036788f9b5f5c", - "b062756abb51b26f6411c53ec48de363a768146ad90cad9b8d0216e80935117c", - "94c1ad11e0cac52357b6885fee52e713bfe786ad9593b508a782f1ba16b22835", - "e67aeab52c2a6ecd5c9aabbcf4c96367171ce26cc62a7020e1ce830f5f2a9378", - "46d86d80d320eeddd1b984564ec3a62637241f1cd10f34fe90c50515263c036e", - "90f20c9572e8b770a80d6d4b610ad7053da45b5da3d94c7ef7e913865b187a18", - "9a90ec6c042ee25fd84c470b61de4413a1d5b1f60a53621fc1b68c36476b49e8", - "e4380cdb7dbfbc2b583f374be80ab7466128f21cfed09b53f8314164a6251779", - "570afb2cf22e42da272ba367e257d5fb301ec6542ab0a77fc4fd77aaac21607e", - "a93d7c058bf305e841718b17d4ba7733b173a31b358375ae9c0bc3f4848b5fed", - "9e566d0c778842e99f3596bc1e55809002f4ecf1f3d427cfd6efb5d4e2657443", - "01379cf061f0be4fc9d161168c1a3029104bf37ec2df5e52197d4abf9d345af6", - "06019942d337e00b851769f6e650cf27880dfd6c9da24bcef7951289944d7bbe", - "4fdecdb30e671aeadcdc456ec237352bec8fe48dd013ca0a304cd350556db1e5", - "f6cdb2fb4856bf8f5e9aaafdc4cfaddc5c859dd63166564728fae45035f0d1f6", - "5d655f1dcad34e48a166935a3411f1f18aa5e28979f4eb93346b3e66d7aebcce", - "e85adece9880396c21cbdb17460a318452cd1f8a357597398ce843a8096dca33", - "2dfbb5318783b149b88e03a57f040058ffbe1bc751a561a6152b076920fe0f23", - "3f4710f78e04ac6d6efb2b1e1ad169b35182278ad44e4e92d18f1d7738e6bd05", - "bead4b7e5466407a88b92bcf5aa448988032a3345c27f74f723f4595885fb87c", - "dfd139f87896d507414db42ac6453eff28b2631f182d31e8a591a905e2e58e62", - "ff723e32236a0be41efd98d9169bcf954729283a5dc39b044b9fa744905e8d99", - "306b7be4a0008001931ca75a4790487c99ca5a69758bba685c579937241bd100", - "fc184ac714ed49f816747be226b740bc264cb0879175372a6105e8101c09ddfe", - "c56cc61da451fe98cdc1675a7b52b07b209ae8dd55ac55a7a05122656b350514", - "5232bc7aa95a7a39d67c072a6483a9d19cde0238f86b3ebe6628bfebffc7af9f", - "05b60a47220f129b62b2d86ac99ec38f8e01725e3e8d4a8e035073cd04d96ffb", - "1e63be7c16ed7ad2292659339ce4ac4aaef9059f424ca8cd84fc5fcecb5d420f", - "cb161b6825026eaab5e102cbec1abd9f9eeead4808011f87b6d7b94c42970b8a", - "837946b73199497cbf5274a90ddaaacab6256f1ebf5dbb87a13c987a6920896e", - "d8de142cac008f869310f9ecbbf62c3a8e682649d57a156977e15ae945d29020", - "ab6c24477a819f21a2349d856fce4b969b27e17d1d55e97cc2a2ea85f2221dc5", - "005e144d2cabe842f048e60e202efea84b15aaac8fb9acd5ec99db70b1a2606d", - "ffc817043d797fe2811fef8f79e45651b5b7d1297410b71cf96047f5f2ae640c", - "e9c8089d69d31a88eef8f69c54a5ce6503025f6c9701cbc540304f027ffb5d4c", - "645ac9924654b6f09ad1678c2a33de88b73b407634a8a9fd9963fe6b44a3eb84", - "ab40fc5a02df42cb1617e488f6ad67040f3630586e9f2b8d60ef7e4213af7369", - "593d65eccf23c0780d22fe20ec628d9bb01336ee0895d813ef70a3686c948b2b", - "066f6c6aedd45647d6eea1f79efec3f0df869a49ae949ff612e0c0b814e6f7c9", - "b06d0066fb1b84eb27ac0cabd2b0f0af3179b7c8a0cccb39fafb4db1dd57b48d", - "eb621e1dc13c1e7ef726a273d77de1860edcbb0ca8f9fdd88de2da81b7018be7", - "08288f6b5f688a149ea26a6150c9fe333fea830935ce24d816b86c5682ce15b0", - "fa2f1a255ad325532307e9adfe25e4b8f20a86d45e7ea319b806b9638adfb0c9", - "9e4ebc22e8c8350ed5692eb347a258d721640b98e8d0544286ca482c5750ae9a", - "0b13f64c51f154234e9b873e7b521746fa7e1a5aa5ada000052ae8ef61023677", - "9ee9f615bf7b98206ba5e8586decef6af8d9088a4e34123d4cb8a53d671221ee", - "039e04785f4d60112e6b8351f4f9e85e4d7551c40c4b98a86151277f24302c55", - "43e9b7606e83a9442cd4e345e580a46e085a1776b40b515e0f251328651141b7", - "4251ffee5c30db88ca6415f2d55b2d2e57d21edffb8c1c2c2b65b87181169b3c", - "746be149d82ee1c1569f3dae3e5d80abbabcf15bac6f905e48b8760ca70e4ca4", - "fad8282f541651f77b47e3f67bf763925a840884f8a897a49bd3921de3e1719b", - "f34570a53e0b57fae72d2e569676e0ebb7e2bf828eb9cb4c4dddecf2f6fa4e0b", - "fb27e3e34f7e01bc49ee6856469bf0c57c260ec3b655e82ea570791e6bddcdb0", - "9520537b3ffd84aaab7f9298ccf6790f6577f46c9ac4c7b0c610a5bc3daa8aac", - "77be9eeb0279b5830e8bb41fc6677b9861054d56ccb8a8ad3c1d65cfa6f02c58", - "cfaacd54a6c54f83193bc76a3af21cd941b36ca1017eae38c097a0df01526c47", - "cef972a4eb3da510feb6172a0fe3b1d6586056837e8a5bd3df0a878731045bc4", - "f294939a50d8bd6f5e82bc1f29167812963e73d1c432d64840d2716e25f87744", - "c00dbfaa3a475000929a3ea96f196609753bf2d2de0cac8e324ae06ebf4a9013", - "ea8946127ab2ec1ba87cb46df5381b1248e9cba6fa63314586de6afaf6620a27", - "73fb40b3532b86f9b8c1f1c025fd2508bf1a9f13b07bed83627ee8677aa3a367", - "825853a5400e805ec97e0feae8e194477b4cca35f6cca6b200d549f173489278", - "cac2563d047230fc121d3d073d0a330f329cb31f3782c1cd640ddbb90d389d7e", - "144924fa9e93ea9ae771e7c7258fac73acf5035596b756439a60c973bad0370e", - "f897ac2a329fc6175bf0e9f615800e226497e671cb84ad1dafbd24b01f77ca01", - "0559258c4204e88073e85c8e571815ca0557fa79365b56e98be6da4de356f30a", - "e6f7899478550c3dd41b9230d39fd55a3cc75eaaa4c2e53f28fdfacb3fc18196", - "045e8e8af2190435307d1ff3e60a94eea9d8ab0b21bb2ca080ef85dbc1ed25c8", - "f884004bf3b6a8e78ed7c910bc2808ed699d18606f66e4fb5a4806a9213a22f8", - "66de517835e249e868710002abf20164a57753e12539c3c1051b2dff7b02385e", - "96f02afc372e92c506ab395aa3dd4a9f5e77c997669400ed0041a3f314c12901", - "93968eec887c75b5b2640f96aa6a89d99d6fe16d0aa91cf36187a1d99c0412ce", - "6de13e6c42b6a33ccd5889a1cbeb4af6d2a6d9ddd25929e36fc280b4ad188ac0", - "f3026315ea4e9d0a42b4385ec700059730b046ccaffe8a733d62912472a1e71f", - "bea852555438e348774214b457ca05e357f6b3430911f7f938b9f8cf9df19cb3", - "9c441f73c910cc292d998992611a33272f990cf28b26d36a1da4d47389956a3a", - "33e5beafd0fb45f725dc011fe0b5f451f8e30afed3148d8db003b0a3c62f3d4d", - "89eefd5395c89023bf0c5f8ec31bec4b04ad75faaa456497bf0a95bd48468aba", - "e7d082cfc80697dbfec0f9ce9812148e8626265cb66880ac902704e00894e54b", - "859744e6ca071dbf70ff7c4b443a3e2cba4ff0eb4665627c042f244e168d5321", - "4488cab8d8d6ce7344fddb6870701c11f8e56ddf423d0e5abfb3189358068da9", - "c9cb93b82ce50db057d358bf1e0698ebb7de317ba44f6480d65099f1ba3fcb6a", - "d9696b9788a16531a6b7035ad0e08cb735d6a19ffeaa01aeeefc364204fdb742", - "8904e02348a54355f17fc15a0886910d57aea0057bf3a64ebcd2e5b214a6dd06", - "21c66a9e75e8906f109d641f568160159e9bbf42ea93455aafcacd03c5a2adde", - "8db7492a06cdda119c29e4631b2fad96888ddab1b4f7486a9531079b8e27c887", - "71b2825cad3232fbda75dfc9642d0792a2c6145ac02c1b74b5781e9ad2fcb4cd", - "23e95a4a70c5c49757d736fcff2a9c8b4271595c763e6f6088936cf9dd950c07", - "151d903419081010959b78b74461e0c4f9573389123344f990b3a624479c0aba", - "1335d0941502763a82feb1700a2f722edf3a08e28a845598f507673d07ba3b29", - "347684a2b1c4af9bdf16743c2a2c43eb39ad8aa4a3f79faac5eaf22c650f6d8a", - "8640bd4be5047f72e8b380b5d3b8daf8af5f5409ac93d54f0107f9c097d2b2e1", - "0a22b3492fde37f7ede4022b4630f3e139794be7a78f559cf1e2b2e88c956099", - "4a96caca5d2e03b45b6e4274f16e6e255d4dbb3e3fd95f04f83da68b8f446dbf", - "2b39d7c51b4d5745efe0bb7b8d083b11fe2063b4047fa660a1c8ca8d43bd5783", - "47a782656ce47107891321bbb2b704746e6585b001cb0dfa7f2c61e0b73911da", - "4760a2cf06497c7d71301538bbefea07e00ad31e49f614081f4308f165758bd3", - "0b9dde9ac3c9253bcdbc274da2010496156f5df8e2af790fb2505299a9d02db3", - "f73225e5aac2fffad9d798afe77c8871970150df8cc1bbffdd1934f8a60c75bb", - "cf3a3faafe89bd9a9440981fa0f49344ef922a65ce2029645bdd54dfb7615ff6", - "ea45b296bf3d4392baed6b4d0640ac396c76657517f7f46ffcb454895dc189bc", - "02d2b85bf389d3489faee89d514990bae14c9ae80c90203c118da8cd89eb6a4e", - "4b89590c734a70c99d86629bc94ade10f13b266bdc28b8cb25b2f1cc2fa223c7", - "a24920e8fd9e6b0eadd2a5db23e59856d5e632bf75582deddc968e9e3ecc3210", - "76f6a2fafae8004d1414f4c108e0551c5089b1024f227988f1285294d0b7befa", - "7386da88609ff311f9f0546d2309454e9c87b00e5d284faa915ead1106efa424", - "932ab06f339e397924df1de33d6ddc23555d2c3337cb75b8326c876abc6195f2", - "25a50e0793888d8de8083714bea7a11f6b1768f933afd878909fcdd23c9e8ac9", - "28fa5349ef26ce24643ec3c669aef968ff7fcc860427f383d872a61f67579dd3", - "ce69009712f199effb195e91f5d0a440345c7873dee0d1703514e171b3f9b192", - "8120ac714ef4b774e2382f38578ebe9808885e4810c59b8db0e4474bfca349f1", - "5b4fa6b9df1f6aebcb3323e25ef863672c909236797c457392f51ba7b49b5b6d", - "d74902e1ff5d494cc3c21ee0a783d6af7fa88c4ae7e9c2798a6b1de46c2f654f", - "d5e10c67213a29003de082ecead6189b4535bbbda713383f57eab9ab205dae85", - "6c4d79aa4dafd2c405cf3d6bc68fab585c591b41f51da0a153d7561275700596", - "2bb515a3b7ea4a23f3d65e7cbf5f6cda6a23eb2fc0a54842cac0fdc789aecbdc", - "26ded6421ab4a4f0ecee1e92d01fce82d49331cb49fa259cf00f97f4816a0bfb", - "a03d915e1775cedfd4bc5f7a0a78572101e34fadbc55171ad0b7e462dbf69a82", - "f813e4e1a9f2ee63506b1e235f701105bd1267df8af99703cec78fca1800a2e6", - "c0aa88d76a62a7c71fd70a931ea24da65c49faacec50582af52a4b21a19893a7", - "e57f34cd16a9d74cc50ea29ae33032e909f265a9fa52f39e869aec6eca128d11", - "c3b4b7fb78b64731f3350996d3856da3f71313f2c3009fc8ce98e5cfb00276a7", - "22608a3f91b5f22e7cf95f010fada78668634175fc092b8e68f61459301bd258", - "cfb1845d593c72703bdbe97ca5e2d1882bcc7526b9fda8cd953a950205b5af1c", - "b1a4ffbdd04538edc0499e26155114839a07345cdef1d1566a08f623d1a23169", - "e953da80935c4ec501d958d9129aa946fcd214b69048a58d51d5a8c0bdfe1279", - "633aa627e499a3cd2f7b24f0a34c9aee1aa2c3fea9e1e40e33527bbaea2a8d82", - "c3033d3fcc8ed0d634f3045e7c0052465971f5f10de587e67f1a4e135aedee38", - "106b7cba64889b55e564effb64dc354ad0a4815459ae0e99792248aa71cd3a1e", - "2d5ad58f3d77aca92f3c05ef0188c5aa25951ff543a7e4cafeb3b53985e74aa8", - "211f0b6e1a3306b47e72eb4ac172051d8765abc3b9aeb3f3d45e0bd437e08029", - "7c76618fb41897bdd5414fc4b68f98be6bf5fee0cd8f88ba86afbd1cdfdd47b5", - "78cc448f4bbc49f51d4d49ad462ff0a1411a558cd6d1d5db8ef4b1476405cd2c", - "b469a7689d7a5aa20a99d70c5f406c2f74c11ba3a6f859ae81d55201fe194f23", - "a784de62665210d2089379d4aafb83d80529d2375a9415bb792291e87578b2d1", - "4befe8c21015e5d03fa7e57739fed99bdf85d9d1fc20f55f293bf4bdd6f7b333", - "f4c3b0ee592587806799cedcc2c39a07598999e866cab29d5247fe0a2a654eda", - "05b035e7755bbd0cad4ccc2f5320c992da6e6c618f5fd8690415aca5dcc895f7", - "bb9ef4bc51d9a7a19e7586b59bb1e3cf5249b4b71c1dcd4726230bcb4b4155ba", - "81f166c87a334b405a59a367e7a231df3540e330b15c14c04aad9149fc6bb34e", - "90d19c0ccd18495c8ff7977837d2193cf279635481168b02f4c44ace12328992", - "9d193c3d0651792be76dce8ca5978b64fe2faeeec2655c3aacc96b74a858a493", - "c73e3d1974122014eb204f371f910f1bdce9d1800cb160aa634c9e47c33c3a58", - "a36b81e75ceab2eeb9a03157f01cb514099498583e1bdadcf96e859f5fd3e802", - "5f963e6f63bef80c154c918c371e6014c4d03a2d0f5c881b6d10ab0611a664b1", - "702375cd933e15b7eb0a721710c2bf42987c2dc50cea9d966b0b018a9d12bce7", - "9dbf4798efd73f350db879de013f98cd53923a42124926ff373aecece325489a", - "ac646cfbb4b52fa4dabe9e0eb1eaead16defc8e60c2882f4138e095e32c3f041", - "dbff4d3ec47929d24bc65a8a7839329e55f85cc61d2ffbcb05083e786ec443b0", - "a8e22b372005d013b9dc0e091be49f972d1b58e77a7a7e03fe609106a1f5d346", - "7d42b7f3795052751ce83afd549011e4c53be3a1b0f3a1746d6b22a668299edb", - "7f94b8d7c6a74e44764eba39584e816378861b4af0ac10a66bd858d11914dd89", - "0f9451a67b34b1575096a74b0cc6eb67f1e272694acf5eb4020dae1e79356207", - "74d954343e8a925cf0d9ff2d4b2ff7a775a559385809d33f126d5a3b8fd74f9a", - "ab2e62e95fa8d1082b359ae6c83b816e9efed73f5ec2b7273d16748ed8b8d38b", - "4b9f11e88474a5b7274eb531d1d9bc2ba62b753dd9845eaf440da8d759e82d5a", - "0e9414330900a9959265c9e9e62c07f723aaa6b3960ba9d28c5e8495f315d70a", - "bada744dd51cb8f1d59f220a42029c83510af35236e0358b38c92493b2d9e6bc", - "65b8a639939a0bb307b61e48202fa04bdfa1a7ac92791b0486d40f3cca42199e", - "65871cf57fc0d99490ee164c59ee1ca42fb7962bb8008629a3b2b434cda611ee", - "82e930d687e1569e8b73931c376785e7740e6205d4fcad98719a16c84615b8ff", - "8b0691b0ee43df900c74e45d50ae4618ae572f80af494baba5b65b82d2d8f53b", - "c8ff9ef4039accc8de46404e1aa41531c2a0700a31d872c625b149d90e4ed127", - "c59f7b86aedaa0933bed9c35a6e359de6d26af08b6d03aa0bce3bcd11f4f69eb", - "272239be55cfa01df53e152405f5c257ba76bca007bf29a72115571e7aa81361", - "c6b08b0790331cc7a1c4e6ed78885db465a7f27fc73f1521069aba9393e9e1ff", - "9f343fcf22b395bebbc0a0b1099d87163f5804d81ac1ca22da75c22377abbcf4", - "8b56dab3c130ffa90fb2e05548eff7653d6aa6d9c7fd71918e3757e747c1bb44", - "6b7d8df11dd622e6d3438fb71bc534bf6dc8d0618c2c49de8842238e88f8f2db", - "a21abc6363d012b075fd68a5315b05c2e5d3c556621ed44a86f44c64215eae9f", - "772b7347a91dda719a942c1e6f39745f9aa529b5ae125e2fcf55eec3f5dc6f68", - "665793fca269070889c3ce91e312b8d1251ee3759f762123dc226b07ce6fb0d6", - "9ba84a977e48263e889f935c63b45b96bcd506e919359e81434291bf08db4555", - "55b90396dc51551e3030c097397f2260a5f713cfc893935372c3453c97799522", - "49718a72b9cacece9233dfb0fd0028d4ab903ed124a689a6ad590757777ef463", - "3927736c6908b2c194dd83f1ea3591d27bd9e8cc07af3e92604e4505dccc0a3f", - "8f6366b5a73451553608576a036697c7e00f6feb694aae6077393547fef000ec", - "220e7d34db6a46ade3af5e814ae6b6e007a232263fd39e1a32dc123294d9ba6b", - "702eb97aa286fe02131e10ff1131219aa7b3bbb60268809591b19674f52f17ec", - "33d920f95ba996cdd0596e57d04c8a5f53902a0ab187569b7fe8a574ee3451ed", - "ca43a7e34d16242618856a188b718e5ff0b99ed1f13e168b7b9e808d306551db", - "0bc8a720f3ac967550c9b863fc48aebcb7428d1e69ec5ee513823b6787e1182c", - "5a6eaf850ad0ef8e68f11cbf35fca81037ec2ef4fb8fb5a9928ff4471e65ee56", - "36933bf8109e5d2159c58df7b689b0107b83cc4eb5a09fe8217c7a7acac3c4ff", - "cd586e61922396ea27f2ede91591507b3b458120703f0d7ffa8a01ba59f8311e", - "bb7491d313bc76c0aac013690078d64a20b75a36d3ec76456688e7cd00c2a506", - "e0a3cb568ae00237349a667c1bda913a07d588fa93b12069c04edcd5faf8362c", - "05cf9be2b8db3974bac714235f7fa6539b315f4e24ee26dff9f7066ef5178037", - "7cb04b68c095e73b6b2210e109790c4c0e306e827b59a49b07833a73ac32afbf", - "89491adf0d4d69cb13ff7dda5e8ac3e35ec742760ea5b8e3af58b11f2876674d", - "ec04c1f0a85c7fe93561aa9d86280aa0319a8f0b01870479ecffe36ad95461c6", - "cae5826e779d3d7d6750b6df1a43fe4beb9a3a1565b83b6efdf3515c8de081e7", - "283c6e0420789e2d8b3259bc5e110643dc6252cfc83ceca969abf90a76ebdf3c", - "d795f2198b6c605dbda5a5af0bdb36b2a051e44d5c45371f29dcd5acc229bf74", - "216d3276728f3914626219adc64dbc3943f09a9f30942c4e87464e82cbc48fe7", - "0399fc378b50875d74a465ec0db703fe32bfc2285a12555088530c0e4d93504b", - "cf72cb5f6b02bb761534efa3434cc65462b5e83046bb80b5645f00795807161d", - "dad4e11ed4722380bf188a27773470e07bc017f587462cfae03ec0911db1b1c9", - "6b7b3a0f1c11ff82ee2abfe1e937f438b61ed32cbbe2f80ee24dc40690d83258", - "5a99bfa0a267a829e7253bc98a664ef8789b6e3041c84c2728607ba8a760dd0e", - "774f503b0076645e21a12cea4bef189c205786c8b5bb6bd24bb76ec703b49fea", - "4f42a3ce4632d704a4486f8f4e819de51c856c338df4c2a36d1906ac7a3b1f20", - "0e48e01694fa0d0b115c69603e167d3d0f75a07b7684a533d1a4af53dcafbbb5", - "707f4f347d2a0ab22ba39c1432167edd0e9de0f3574e00ddaaf16c8f0e877c18", - "9acba50cdbc908b7d699dfa4baa884c32fbfbad6500088a2f71cc8d75ceca9cd", - "36a51ce3ec30f3f39501e464c61ecd7a3096d933fa31cc98792ac9c85c50cc40", - "238e0a992bc6ac5d597eeab281b971c3e34d934060945e21b948fff7ffb9aab6", - "8a6ba75ff692e688e252a448316e3c3f4d992ad119096fb85962ebcbbf9f56d4", - "4078537e566647903a95aa14389de8176a697ae2b136e78c4e1cead67f6332be", - "38a96e1b1851d7972acc73e24f4a2f2990b4500a15a89861a81b157589d4f63d", - "556e79c735dc88f09d4fc836b85f2c2144d1209576c209e68ee3d9d129cd2008", - "bff1b8cdf0a02b6b7373eac3af39b62d27ac4e35272716c186af01b24898f0cc", - "10b6b8026b0ffb8d34d4a8bd3a6cef6cce72403472e6d4709087665be57b1007", - "58a06559d70b1072ad4d9d209e5b33f68028ea2da2b648fc66d8ac203374f5af", - "1813dcceeb5b73ff7a99cd166498a1591dd9906047a1dd9e62e47da4e12a5679", - "d8c0633fd05446b5e0e45562c3982bfb2732a5e3bc03dcb81a0fe4d6cac750a2", - "0c27aa89ef283ae0fd9461c099519119403d678b758f3f8ffcd5140436d1835b", - "d621f35f029ea097c8dedf65993a013efe9fe9b8d82dae17ced8816a08d465b0", - "c415d4d90a191d9d2f978af783cfc9da5b501d1128d7a76574e5dc25f9801476", - "d14f448ca5785d7549bdfb3f84d3804cd3cea8a46515de4c40457e475ae975d6", - "04dca7c1896c4c78de57ad3c9fc33901f75cfbfad0fd5e708a69126306cf7e27", - "4dfb61b5acecf9a70aa9af83e4ada4fc74df6a7302abcbdc84f6cf139bc97687", - "965ca0cc136b77e2f83ac39735e97c558d5110aeae46ff02d3a3c1488ef7f042", - "c64b6c3a6d8c129a453d3962e8914f6d53b12c3cff6d7a59fc30d81c1e0b8b62", - "9ca2fc57a02c3b3078567d2b72509811df14cca3f53125121cea1ef4881fd8da", - "3704752149c77b5b11acf01b7df0e79a93d0664ec9ec92c3d45599bdb85d6080", - "11c68c0520b7b6e3a7dd1851fca96bf774196e77b8f6efb22bea94f61fc61be2", - "91b60fd3c94de69de24cf25c90026c9ca28c5cb8f57f8410d3875ca6b47151b7", - "2c9c600329d43e6491dcaf0e9c8a732b4cd76fe34f1426cf30d0c02ab79280dc", - "06459edcb2a4784d8c7934b8c9eb1563e3382ccf8399fdcd0ff8e1a4e43befb7", - "d84b62e960f864a061d64e8131e43de738e726c2cc5b005a8ee16fb87960e7a0", - "aa9a2983d48ab7727b5bedb938f4ccd6934ab869ee0dbe686d39f5c50c2a9f01", - "22eee6bc5f4b34d39b02589c25aa1a13a2e8781ff79b16fc78cad3582cf17ddb", - "7f2ee740b1ddf6246c1ced7a971635375d6252eaa744a01b60bbf8e69e52229e", - "c02c5effe1ac8f783189ff7e6263bc526227b48bcbb06d8743eda4f8337af115", - "126c3dcb6879453c9851e5ce5490bdb1cd82daa9294c9fc41345001d0dae5446", - "e3b3e9ae80174aba5838793fb9a6c9adced4af83a95e1c649577845efe29baa7", - "89758859eaa7b10bc79ad57357a0ccfaeb8b2339143850da87e5373fec0f828b", - "f059376b72130effbd6b54845708897f28f129785834ff3edc8bc60ed0048128", - "80f4da3e6c5ea0fb352f38d7ed8185a31ec0622ffac81ac4ff15c2e6676669c2", - "ff23e26dbc9c34288936cac1852691fc5666c10f4f080ab53d851e6a28cebf4a", - "97f4e9a2fe46a611aec095f0c68319e7044728e76322393887ed11a44e90f145", - "6803827f6a491320e2ac256e68c9d25627812efc6adca59a97820f048defca2e", - "ccc84214c1a72f8ab5740e4df7c604064568c7fe418c2dc46cebc5f5cbe5bd89", - "0cbda4cf20b49f1d7252eb915a004b313834c481f14364c4ad0e0d5c96964f8b", - "00db20357b6b06e6391692e5404124a4ad0facd1fe46d0d01064206d9346dfa6", - "97f9cda0ebf2a46b596595cac273adb9218fbeee6d59ae75c9a6d1d81e17e4c0", - "3ebd54e39b64ddf8ab34ce5a8866dff78336abb8c867704503eee458c13de812", - "ea8a30d03f33b35c2fc1e4c57268326adf56071c017f1e1345f3450e4e00a0ca", - "deb211defe1ca43ecee8cec368c45396f25cf5fbf992b9d2a3e83b30e990e997", - "3901d42fb3b23c9f94db6f789d8156835ede35cb62b3cfd7524b33816a5c4440", - "a15081467e8c2e702d01272a34d3df230fea292e4dbc8527e320cd90c5ec6b34", - "26c89b192bd1910ec2fcf167f51694dc2410464717ecdf6ff52099d5a890df70", - "2014b1480fa6ebca088f6a401e79efcbc18044eb669a22b236f945d886f57be9", - "22781f26f46a0775e9ecc7c5d9039d3e30d41c91f8e74e5f7e71e072193a28cd", - "fdcb9522b7873ddabcbd2c08185a35ab7cd47f1c732153fc05a047f388f1c0d8", - "5e17d5b8c43d556888dd0e82a2f0507a6944c124cdc4b11a0538b31a266c30ca", - "48a66bf3af1f591a28b9b9371dc654fa1cc3409bd8a1913757cdd79b36897272", - "25beb92c2a2a6b58dcd92d0769440815db08da5bc341d84e6c481cd24471a7ad", - "ccdd0388be861825c5799f44d65bad069458dfb81bf725e4426dc6d368b30459", - "75710a507985d09aa946ebd7d8c55b2627c005f57afaf9da59a34ff096d3e99c", - "40038c031ddd55f92211b9431547f148d281596af7959d6e43489c54380b6482", - "e0c1acc5635f0e292f5fd83b65e1b451656850362788720626cc36a5ab879020", - "284e23248ff86ab658866e4c69f4fdfaf51b5bbdde0a7079183e9ded5c2ca233", - "6286c382954fa7863fa76ff274fd89151a45beac8b4e41229919761c4bc99942", - "31f3330ed13056751c17ba84bb007df6861acdad624ebc7ea9be35d7a0be410a", - "de7db43db659b3511f1f24135000d2840ba65e877c76e6ae7c5351c9222c886d", - "85d3666da388a0b32ca5e9c0825fd80e0447092e8eb2388cabdfb194e8ee6ee5", - "fcda0314a5a62d56ff08698cebce9c8045e11614ec8b46c7b61dde4e26b42cb8", - "fa25b4210283c6f7e556458efcaf13044d442287684695249e3e7051ebfb5f11", - "611ba1e018fd3519dc7ab9dd59eaf36dfb605b4c7937735178cf9ca3ee8adb04", - "574cda2e06a1d19795e0f7d0ed331cb858dcd530a078a1da8acc49c5961d5c13", - "0d2ba20d0c618f22c9f71680d22455d5a47b62b0a8383d30c304ce50f7bb53e7", - "b25faf914d44bd2eb2e5a8b83387275b016b1259f1aa96944273fd5836e1305b", - "1c6fea92338689257dbb6122e12ab4eb803a4b5011e6dcf17288373a6b4d0295", - "2fc938aaa4c6949f958baf7cb45eba14133c178bf5a0bb9d279f6454e52ec9c0", - "66d71bd47097ddd6994ebe75911cdfd87db56f1ee13b4380b34227c0ad411881", - "e2f54bd16a4914b3878dbe0fa084a1767d9f82c9cb6f8f7a288a22e586402197", - "62c668267f0ddbb64327603e8e6f0c6d8a77e1054db42df78e36d0e52132355f", - "2665883ec50ffa1c3922b79fce520d3c4ca726ad947ede3bdb6cac240066d6b5", - "3cede8e94ffbb2da216b0cca197ae6f7535571d9887c53628d8544d62a449917", - "8db295045e4936e592acc3875dd67634b0c74f6a88b7ba3dbb59132b5979a2c9", - "ff16e3ea2e1ea6c85fafda0fe7db8cc6389a72eb7db7b2eae9113c3f4a5854d7", - "fac719155767c86c85ea53e728537d5713345197ccef50c09d0c6aa738fcfc67", - "c75c1302d1f42a5a33c695de480a85f749bf02830e800b01188f436cf60efc6b", - "55ecd83eaa2a272e52f5f4247fc47b51c6876463782315ee886d6957a2a41e87", - "79f0f5178b1f26d44900211e6112e763ae08dc2b61370e3f17b313f26a61a880", - "33378295ce22e91b44e308776e56267820368b41a7f2f8277dccafe1773e1715", - "2d396ae378e1dbc06b451d445eaad18a5cdcfe719bcef2408a218f0d3ade6c30", - "b37af3d0f0f9b7f36f9b414e76731e3585b6fb815849c04cd853e3356eabe2bf", - "68cec6e989f4a9543d12eeae97ee64f7fb9ed470c319b1bbec2777c3d38d378a", - "5ed46a80961d44b50162af75317d378b156978163cf3cf16be3e162218edeef3", - "7d37e6f9f74675b2923339d0534b82294a0c2e4ed0b62bed9ff8ada823173718", - "b62825872179f6f27e29e359f31d1317e76fb9b0924af09a733648d48300e0b6", - "63644d06a6fc1d3feea2bdfbac1654db7df6cdde7c893b3c628c52577599294f", - "5b2f8794c72b49888a98c7f2026e26f82b0037656b5728d6ced22b201cda734a", - "d906c23547776a6dc6809b6654c87249f1b71d6bf799e259085cc3c28d35f995", - "f7060e4fec2e43b7686e53618a2cc2b2f469fd4addc2cd6da93ca4f38d8df151", - "a6cc7567b40b460bc9ebb2e1c2944437c08e494d253a30982d751ec7cc70d9b9", - "be2561ff2217238d0a9df472c2de976b944491ca522365c4b635c46fc243d416", - "64737b0d3750f7b83d37d8e1c821474740976993520f9783ee8de2ae5a814015", - "cf88edf58157d3fd17fd476070481784b9f37dcc6e92ba4496024cda15d829f1", - "56d7ced131c7790c3c76eb90040a5ab5cd397871d1c3a10cc17f5158838005ba", - "b7eaf4849fe02ea2591ebc5cbfd046b055e38683f8fb57b5bc3392cd3d7509bd", - "3a4a4addc22271c1dc499fa17a75c039cc26aed55445385d6e31c4d8541c25ba", - "d42d72cf612dda5f6a9dc24ebae97a5b4beb027104153f9c33e81124ac730c84", - "1c73190eeef415acc0a19812cbf173ac050d34bca6eb30eef1a1f6ed890c9758", - "51d847d5b60a05a4d4d131bac092d33956a658a213c74b83163f09c4cd39e723", - "b2d2e0bcb4122e87d3ecbf9829ad9d60f1ae18d6d14ad5f4e8ec142d09684a41", - "6b5ca2be17c4f3346aff43acd9e17ae970a503219f40c41f47e4d2aaca4fa5c0", - "1c8921bd9dc2bb026730e69ba35bcf4987ea927658c2e1f26bbfaa50bb3ef1c8", - "4beec18c561718d0b755179fae5b323c6cd85bae8737ed38645e273a67fbdd09", - "0805903064b3932d939926ae169c8d2bf5dd1a650ec4fc91ce40ee36d01cffee", - "3199803ea7986c700e56cd9ca1040d907fdf25cb6e7d774f6c6a79d8ceb19a58", - "8fa0100efce19ee9feb62b0811ea7c478f52138bf1fbfa63a8c1837b416e1303", - "ed0c8c560932550b027e538526f5ba1bf9352711e129ea0130cba0bfcd9bf60d", - "90092ea9bc1a7414df8a2b39cd043867ae97a4b5012567a6f8934f106ef335b8", - "ee8c5a58d9310c285a02cbabd488ad4181e3d2cbd32778a59500da9f5bf740e6", - "a4a16a4991db91602803ba0dfd5801200075dca8969fcac1be018b4402e5b05e", - "b6c121519a87eef57c6795d7b137219b7b19d83219ccad58a29f52f14614f85c", - "a3556f3e16123cfa71d7c8cfe24b8ab47d29fca107b385543b18cac5ff00f747", - "bf70819932c485e1d57f6c9c37d20cb1a5d743d3723a42e2cf9f4f6c39128660", - "857c7b116b36738d189839c8900ddee1540b4670b8137c66b4aa04963276c961", - "db41c37b118a452c9fb906f9dbcead5e9bc8ec35f7a194244a3a9e995380b06b", - "0e3a0cc2e7352f4d776399a58076534351928631200df5e6f1193d306caacdc4", - "95a212c03cf3f7409d70a2f20e220367172696863101e15fa14af4c2ab2ff94c", - "550d0fb8bf7ae821937921a549275e5c17b079ff4be91e5a33a3baf73cc3e04b", - "056e92cebdb25693b427bd1b2f6d18f5b571fa92cd918b946d633da37119007e", - "0304586eee6dc3ee559986f346669ee5fdaf8cd38180d02ea8148a8139a101a8", - "219f1509bb1e7e35a4cfe04c610b0fae057006fe1bffdd6e962929bea3793892", - "3e73b197c4658ddba6739680ec0f5e9ffdaa54f3dd4ff892da69b267011a63b5", - "0cf5a8ad86fe5314615297849dd69afd887ffe9ac8dac36b91b7369f415b9acb", - "631aa7b52b252957157f5b958991c8424287f2c48027c80c2ee92745c5bc7b65", - "33a824efc77fe4f8c06db9d5182a394fed138781ee2a6a91b682154991f554da", - "e288b943495ee855a6a6662b53a06ab8fc82497316de3afdf22c240135295e9f", - "2c5c82a0686a2eb0f216d675a3af1fe056ad9131e640abb471c9a41abc00c20d", - "08e1e9d4c7b7b906c3e11ae6f49bf10ab56dc127374baca71768f92c3df044d8", - "b92aa3fac0dee48bdf94f939c1fc2b09a0390610605ef19e2f8f01316f29014d", - "f511c851b4c2a85287468503ac3952fbdbf02e9889ea359159331c404867624a", - "1ecf8dbc3a306c4d2269031a4541de9d7b98391a6adf2d16c3661854e2a98508", - "ad1339135cb3561f37815ff9b0704bdbe3b3045d6f9e6d4c5e3bd6e968e3eadb", - "4e2dcdd2d282eb7626d229d0339b0c844dbeaacda143361fadce271df4842da8", - "86c222ac976c4045778cfb71c546cddc757f4138d4e2bd5b60201db75223e885", - "fe37bbfae196017f525a461f52edf8e8f377cbd56a7e4d61e3191ad9e12ac9ba", - "e39ac3b7aee9efbf26fd61982a0ed30d7dacccac25438721c5ccdbcef0f8e0be", - "6032e5c89a484665b19f94a90641f84ff9473c42f42452151990130ed0283006", - "e1137c1bc82a0547992977541c4a154ae130a3a2c91f37cef995ad26e4609332", - "9cd3f4e4e98b7e84a33d579cdfb46411895c7b51e20166b448486d7435defbc6", - "bf74f257241e2537d7b0267498d099bc6b4a1f8091807c9f708583831cb0c83b", - "a645730de7abc1d66969fc6c148428309315c7be6006d1bf56b3fa4337c64033", - "c254f1cbe8c38a3a6cbdc393da58bc95d1e3bceaae6ad20bf9075f9451fa5128", - "209a2ca829288e2e1c1d598fe72679a2c61af42017b10a1ec89c13292e74a153", - "197499cb53c1409e62006e49d966992199b4f5085245343b42442e7268b60372", - "59ef17a2f001a4f93dc708dfe26aa4a42955bce60a0e1178b35057c93746d1e6", - "8737f8547de65587838b565afbbed8797810a17487c60f2eab6acc57ca53ae75", - "a9bfdb3018691a896d900281fbe8959c815991c062432ac18d1cdb1c24f50f85", - "a747f97b2f547f7f223e6a0009b3be90d12ee30f1691728792a53277cf8c0092", - "4125c2edfaa9070c9a5fea28a24d299546a19343405ce0e76982fae47d4d6255", - "c36351624cdca8758952e7cb51afbc755370e32f690c3fd6af963546a96ecaf0", - "0184c8c53ea64acf92beb55a2b14b3b21b1f9dff056d0bee0413aa27a21a2852", - "8e797d9b15ab015b3608703ab003145bbc3c74c24cf2ed328cbe04a415cc53b1", - "919744d377be63c7492f88cf882bd2da2153d7c61bc2e8b0a61f4d9c45ec2794", - "66656b8446dd28414a55bf20121b094f60416b87db818978428e82295355a595", - "025e2d80198314ee583d8d1faeb1568ef820a568d8662fa3d2fde0bb2ca58ad5", - "ef3e049e52ce161719847ec3a1b4b5a9777525860c6216371fa158c914bf1515", - "a5324cbd4e05dcdc06b0f54429383a51787fe768e0800af9cc4bae23cd78cf34", - "3dce42cf58bb421ef65afa9a443207b224fdd898a30dce1cf22f6715630383e8", - "71227927191fcd01526abdeaf15b88c437172389dbed7ea92651e4fa070eec19", - "a09ec5fd1e7400d408ba1007daab75ff3bcba88112dc95e8e915afbbf85231c4", - "dad2776ee29bf5497f101d84bfe9160ecf5a95348571bea6ddbb0ca0328fa033", - "220d3c6c48a2fb19133f7153f3bdca238e1c1e18e4f13c3f82127debc3308617", - "abafbfc3d50b0c64619b521a531245f664d7805c0bf6746ca6ec5e08b6a6db4f", - "9d337c5bcf2ecb60cba2e44ebf2b2294c2c453e80609bda36437b24fd52b58a1", - "d74eabb0a4596577c9176c9b35cc876951f522cf8a9dd8d7736ee3c6967defd5", - "73cbfde31ecebfc5fe1ffec2f94fb9d078f5701d824c3cd795f4baa99a42bd72", - "fba1418b77cf218a703446d6154050dd9b5d5895437302aa5ff8c1e71fd3f98a", - "63b9f4d202fa5a57eccfaf8f52b648c2def4822ece488243804a44fd85f0e0fd", - "9cb9bebdf98cfc985591c34a364cb60c32484df19e2aa1dad97438e16c2a5156", - "fd8a000da7d78e9ffe70cd572f541037879b64f092a3f7152797279cad0093c1", - "ba012c5739c2400dac6c43b3c9f4362e2197e6132c519df840488cb65002e26e", - "12acd4ccf6892a09f37b7e2632a2cb5fbf5abb13e72fca2fef2f72b814e03517", - "ccbcf793f24dbb44e1ed8ac3353cd09c6d5b07de75b5aeb39cef6c42208204b0", - "3280321edce0c183cf820ecfba3521ce2d388b77ee5e911e90a53ce3c63c8abe", - "eb68b6387d811ea6088692d9014832a5fc95293e5e3b3d245b046f61e10374c7", - "e5426ae7b28ad802f978a03f108dff4f185800e14599a3c94a038251f1680765", - "07efb8379810f627c1f46c1b5d6c1cea546a6b9c324a1e4774d8b31b9c84f9e9", - "d9bbeef8274cdaf34914c6e6524ea4b728f1b6d7daeabcaf5a5c1d092afdfe3c", - "267666e15fe072bafdd6eec647639c0cb9ca7a904351a604f3b9191e7c02810f", - "9bc73490f12cfe7a6273c5c76895fbf84090c20b27441e7b37550ff8f8ed7be4", - "54398731b6cf6d12088252428b952ade5c12996f9e48080498bd6bf56d089eb5", - "54d486d47f2c843193dd76eb99e7ead374e58e275da1730dd54d2d4c63e39029", - "f5493292ed78183c586f5944ab1f200ce82bc3cac595af018c1a1ac7a1198ef9", - "87da6624c61575787844e8316a756fd7ce47675263b684e4e716b4eec7b80175", - "af776fb536cc908c6a162b0f7ea6f68c8e675f91bddbff482917fb1c3dd740d6", - "323e95daa1534330ad6b28621f468e942953c136330e059f58b10853f6ded180", - "807a4dac93f74995972b8bdabe4e7cfd8d4253b09702263e224268d82f5da1d8", - "24ceaa856c2746b09e7e26d427a115f67c31eb63f52342634d7ac5b75e298159", - "3cb7ef26db8a19397851268b696f34b8ea18742578ed39dd87df7e74e734d3f0", - "8313cd869920546471dbea99d0f5ff3ab52824a64d3bde45cf6d40f6842f768f", - "bec6c97ff8337cd58c70722a177565324807f493b73f9a4fbe0e9adeb6bce408", - "f067aeb9b49d92008ebcff005fa62b9dc9ed981d22753ede3d5499147c56ab95", - "960ec971299460b480cc3f2bdde589f76f7f30ec90c1102872edecb1cb3d7048", - "27830f3baab42601606c66ff50d35518051016543bffcba58871b4fbe6082ee7", - "c3d44b9d195bb421fcbfb0445c69035643a7d7c4d9bea13e5cfc3c94ee656ae6", - "db922600a345c50d2419fb8f7c8f94572a4331092eca3aae6c74e9f5039a3475", - "2ca84fdc865f001b86f0e8157c95e6ed2a7f3fc4b4b28fc80aa624a4475fb360", - "a0c51cf23703d985486793510c7c1720ee1b5e1ba0d4d35053fc4250be35c111", - "fb5c273d9ce2ca8e9186e44ff4b2a3ab8e56f195c75a06043f08ec4e1dece244", - "80ed407c87dd56ceeb539838c23a886268a7c26bc9eb1e86f438ec53ca511eba", - "82ab1e20c6addd15d7c9ac8c8b5a8645681c3bf4aaca88b0524e908368584993", - "4f911bb62e7a665d13cebba5d7a9cb677134ce94238124ef41fae1d33338c486", - "61306b11b914579cd1632a149cbe7c9960e9a771589d9bad408fb2daef5bdc1f", - "158ce6d7b6eefb58d536a647c725b0416076597594cce90e798b28c97055dc16", - "167b3efb92cd2166a3a29e4729deb809961e981a91e2c5f7c7c4db3c1be6a0b2", - "eca994103f8767922bf4f9293a369d6a358ecc479deb0f54e669548b4e51a2c6", - "eea54ddc73d409813034de279b89c6f8ac0636a2e24dfcd32e8add934ccf9a8b", - "81a9a1816602f144bc99e5326182f1052ac73e8095e5e95bee85f0d5b9ae8c42", - "b8b7713484288d9b34371589a038ba2663083c2a94826ef28ffa8fc9db8f8eb7", - "1e50008ab824794a9e9c6516e30f3cbb368886f0bc7dd79386ec96699e4065ee", - "316e9560ea24af116326e671fdd0fdb8b5c431821f782f78a57718a609dff6e9", - "3d0804ecd715bacec5585083f7f022d3c70bc6ab19f788529502e54a9d5358fa", - "a1dcc733ecf19f9de218f6e5f289a8a1dbea0d0bddc405edd6fe54c69b080953", - "fceed5b2085fbdbcda40f45b6eabc1d6ae95b8978e099f0c681b76137b4ebf45", - "fb9953050e842dede3890951221d81c558cd0dc2adeb3c4d68712c056a3001cb", - "ccd905acce3d35f12b279bd8f1c6c2d73093482a0f5513991ce7a8411f6f4f73", - "1169965e5cffe5174d77b17633718a61ea89878fba4fb81381ef7d1fef0923d8", - "2da700aeb2d08ed3a0e16fb66f6583b58a16efe63a2b41296f0ea3a31a441e89", - "ab354600010f0d75657e787e6e54ff2256ca27158da2f8b997a0e8d63799214b", - "bb6fa0e10de5c1b624760b3502e70ef339df1f7a8ed5a9111bb0f3f673db8793", - "7db1f005225ae29d888af8a4a133d6275f0d6107b5acf365a9c5a35bd88b6a4c", - "cdc34da6c240e4e414adb9e21d5bd115005e8d72a773ffe823305737c434857a", - "162c3952977656ca6ed81811fd4c5e87c01c54497cd74c37e60f5c9d55c825f0", - "9a12f78901804888da72c463557641338facc75f5615110d73ec1c890d35cbce", - "e26f218eea55f59bdac17192d350f8412cdf307dbd8987ea0a644360d4acb97e", - "6810b8e7a124f25834ee8c608261e197ba39cbf5159c21ed178555c9ba427058", - "f1fb457734e2bd534df2a1d8691f3307c1a32370bf7c0fb0448d3f2b113d934d", - "6eeec481dc9e6a3d92f126e89d548900f87d50a724ca966cfa6d64c2e5b1f970", - "013e0c4051e1c38a8e968f3721d39386dec9639deb56a177417ed73e21e287ea", - "9998b7b7df223c534fde6ed61b3c199a3106ad6ba18847414167033cb9ac9b8c", - "04afaae3310bd3fdd1df6012be14f58f0439bb854712f0d9c7fb5026bb46b010", - "0ade6300ea31fb0c2224b398d202bb604c9fa63aeaaa2cd4347538d901a7a2e3", - "d5d92c3d2fbf79d6148936ef89cb606be82b92f34720a87905344083734586a4", - "9b0634a160934ed148848c6524f18fb3f0312a2af0d26ee98dd72e2e40cd9a25", - "f25517d9b367fb0f5d838676aaa6146e0ffbf619e92af380755cd0fd121701db", - "769252d6ab2c8b20d9fe6b6d129b7a9599dbac7440704042e74460460562ebd6", - "eb92590063067363072c3db0d64e0f3ddab03e7f5653093ef259b7e4648a1e9c", - "a972e967fcd7a8c01daa6ca78b8b2c2ff5a3311c0fed2ce821ba40b2df78fcaa", - "a8348270647338a4ce4896fcf40570ef27038df481eae3f4dd025a68afdb3040", - "abc9f364a815d51a27d351e7319f2355b0409adf523a65187267ada825b115cb", - "0cc22f2417bb97fd8f68a292b5bd9f7c9908b6b533597ae8b261364bfe7b7be3", - "03f12f2ee20460c988575ae66156db58931397266c9ad4c1568a5409674e8ec2", - "16437139a14355b0677a31db59b811d636b529edc8569c80216a3567dcf872bc", - "a7d7ca8b8522453a3e911dd009024b14593e22db4b2aae0e812bb6cf4c37cfec", - "0dedd4e735cd1c776921fa3ffff213b56ee47191008254e1045f9bde81914f3e", - "f08ba8dcd545f51ef8eda56f945f2d5d9d3dadcd4a50ccac2877979734a9755c", - "f6784eec541e173b939c6681b09f7c040a3abd363610041227cfb668d07145c7", - "d1d9dd415678f61347c89a97babc0fae2e742abc71d799446a102c2e667a7e5b", - "48ccbf1eed2acc76892551593bb42274466f61feb6f16971d42a9a658c895c0d", - "aa4fa19b881f0190cf5b0e8fe0aa5187bb50a850ea1251e07e9298e0557777a6", - "c3426f43f9ce61486622e0fa08b363eda1ee0449a64c670374a58b9da9c2ba9b", - "48e96cfe7b226208fc1f475c82c607db485838711addeedd6a1f1ac757270f1d", - "bb93987df1ddc97de7f3679e7023367bef51c75c9e2b75724f8c3d0794ce7067", - "eba50e01dfaf818e4a8af926796954b8f2ada34646df2dc8379e7ae0090adc30", - "d485fc44a2c50e5759968bb08f482dd5761c6a5fbdb75f2f3c7d916e95374f56", - "a51b0ced457aa1720d95679bdf62509f10307242f6f9af3f82033e7c28ffc532", - "030944a9a90b13a084e7c60e6d3d02b532dea8fa99a662750b40cc8247e609cd", - "579179a8c669f8bbf51d14f9a066d1a1ae58f247a615d0b3aee3ff0dd933d880", - "ff31ddfc80deba990d3b9227461ced12e340d1c7e1e6f7eeb5a7f37513bf78c6", - "649afa34d07ef909cba1c8e698241858a80d99e1790aabcd0811f091a746721d", - "8ac1296daf642feb37067ff3ee55e22bcf9587f22cfbe9ec63392188c5f0b793", - "50a3542e6be91962d30410b5a43cd4e83f5df6fda4ef897b32bd0ab80ff57c7f", - "f24d9df60e4494c8895481ebc92c3c3eb2df7b04ccb3e320aa18b06d56af8e0b", - "d25e67f92dcb33966cbc46c3f646b452c145da5702af1573ed8698e2939a12f2", - "c39b5bda8232ad18ac21e2ccbf14d914584beea5e0f28c705ad3331e8394016b", - "aebcb446117cc51652e87bff480c5484de2aed94653e2d0ad97794a29d2aebff", - "836619164346152fa311de08e1806618310c191b243de9160386297d7d0e1444", - "645fe61779c4d9b3da6867e4664df663eeff192d85afaa5aaccda10b7b381af9", - "036c06e3b667287b181542f64b4e3489092bac208ba060a268f548a2120d5d02", - "896df2fb9f444899143ea434d5a701edf10bc3731987cf8904962a549c63a8a8", - "563830cc7ee75dc6914aea43701b4862d6d4ad29b4764899982e70608ac3c3a2", - "f04a1ce316412549bf74c5d2248bf9e42f40055c3f13cd057a8209b6feb8b178", - "19067d8645393003e47c5c92b8481100d1c3406170273bc24fb334eb893647b8", - "9c90ed5ff7f0dcf40030994dd43190ce269789f159d7626fca95856a977afc6e", - "8fe9b08003838dd826f3c625ca66be709fe144f173c5e0ce17aa53c52ec746d2", - "0d19f65edca1bf1206fc224779c8d5c21bf819ea74de639bc80b5a8706fb6109", - "ddbb947479d1b84023a2ba93bee7b213d32367690dec7e5d1fe9b7ac730ce1a7", - "08a603b721b2168562ea0bb07801d6ac9f484b208ceb96ff806caccda485190b", - "3d51a204d0075b6508c5f1ce4019acb459976da59c2a48b4a9ccbd6bc5ac235b", - "3543fbd9f4a1c70f1e4fa6a5563eebb702a9f0e9abc5c2757d5872f2673ba137", - "9cc392174f0f88ff7aa8d3575c181052af86e13fa76c1daf2b69a708a3df9998", - "b9760c5acab628908129c47af7a70fe0430cce7a6568d0a17a218bbecd298947", - "d4d9e6dd90d86ffdff9636960a7d1b4e935b2c80d87a3951453b0b2524f5041f", - "aecd4f4f3ec6c2b4b24223bf3830b9db6ee2acecf23d26b01b81f4d045f3ff5f", - "2401eef2ea72b6f8fc51f227d01a9caecb6fc8ca39236b02670fc55921ba607c", - "9bb8a558b0e65e5a62eafad4c761abdee187b8a1eb7c7dc4354507c3310a1a85", - "0b04132341e9c41c5cd541ece020200ebf34c60d633b64b0a4d385c18cc67c98", - "f5b4666eeef36bd57f829eae9851cbf15bd0102f835afa54fb3c703b19947da8", - "a41f1d101c8c300ad098767f4f91e3ac298aa4a473f0f10d6b85310f91384356", - "3d51d52013feacc40a3b7b5037932a32b30254a4119bbb79c39d5b9052f87251", - "84f6652119e29a20861e0e92a1448f08ad3cf1064e70adfea620e344e6a292c9", - "8a21cebad41c5e80122f185e9f7012ff4dfd7fb430505ac01b59eb838bc9e597", - "0c954e645a1d6682f5ee1772f67e3b2a574e16acec8768e95afcf7dd49003fa5", - "ba0730b2d412b471990deea4957042e0c947cfa329b286f596a33b3df0640601", - "5e67042f1f8a4760e9091cfb91c112c639d5e433eeecff5d8ed2cc74496b52f5", - "9ca017ec11b30289635df28ab6c29929549dd9290ffaa41eb13f9872d214dd73", - "55259ff06c8d2f95178e8fc81d9a0dd4fe5e525a18f711c70e37701c07960085", - "1390e75804abcad6ceb08c9adf6f474fed9435627412189af93846175e265d71", - "3ffaa5e5c2b5d642e3551c2eb11bcd96e25a95f5272cdd91329e78fbbf141512", - "3fc8dc6b00f04301f3829c5463646b3e1159167c3f8ee24936102d6df6353b1a", - "57c6795631c7bf0a7fe57a9a929072d99e3e1641cf4279b481c8f3af7f9491b8", - "e84fde266cde3dd7ba86b12bed01df6c09e3d780ba4989f20911bc3a2ab135ef", - "7b32e700143ac8ed72a750fee7d45a4a693432f6dc8a02837da0cb7f14317b06", - "7a1608e6ec2a4463fc15abd49a4c68baa3fb97c3aca55cfc31a7c3b2526ad842", - "e833d88e0c936f1599a5f4153b63039850ad4422424f9918da2114cfc794bcd2", - "6dfff357f29867fbb14c22a9ca05900ab4a0bc5e1cbb145cc33f0a63ccb2b47b", - "2949450d5fdffe6d0648f8805767a1f7a4e4d7cb6ef56a36e7ff023acbc3174e", - "7e4bcfd7efde5c56011f19354b4f81f58846bd0360e4fda33d35def15eeb839b", - "dd6dc7f0df7c6ab27c4b90dbc4e243eb12d6d010eca1bd4f2ab0cbed0d833f2a", - "b6f851b4c388f763d32532a9f8460f94e72f1b493a38ee5500affa07c0468e02", - "90f16d2829be8b58077c75961cdf2ee748fe2ebdb281f085195683c3d48c7ca5", - "575157887c4aff9249e710c2d69ba24b553457e08b8c18a9a3115ffe730034ec", - "6df19d3f876bf4a2005f701a51f44fcd1304319eb4bbcfcfb23882880f218402", - "408493be36ac5b43cafd0ea1d3e67525e08cef9d6285df14ab250b444e54cb41", - "d8e3606a1b700de5f62ee50bbbcffb1702f7f285f7abcb7b3bac07c7d0c18daf", - "69b227a53f90a925ce55f8bfd07cc89928bbae80608aadf548b4e508fcfc9058", - "01eaf8255ddbaa19fcd9517ddfab6cef5e98a32d56b288e3b204e1f31dd49ec6", - "0bc6949b20aa1b4e8a2539be720d285c9f0c49a86ac0fbcca79add39f2033499", - "8851e515b6db82a5b4234e855891cbf0c6f108a242e389cd9c85e41c2e8c45d4", - "a3e8b75579f4cf6200427deece23dd947cb0c2cdc1afc2df305c818ec123bd35", - "9dd20dca28c765bf3ed451a6ea1735ce66469b2667fa15f8ac0c8ed3c6a5fe17", - "c6cc628ab3505290c1b9a54e241e4cd13642e53e23f55a659652e8b383f3e4ca", - "9b7f48c662154c2eeda7b2b9ec1ab3108b83a4dfb639cf27f7242012ba24a8d1", - "ca52c0bce3c0b7a9524d4faad9a2040b88a08eac87e771a37773a3dca66a10dc", - "f3f6dcb7ef5c8dbf2354f8544500ea7ebacf60ce116561d0a14218a4d1ff2b2b", - "93404359df79164b3954bad08bf1adb0941e81d460874b1d4f561cb73fc5d206", - "b0b3b2bc2aa9aa11bb76189e5cc029b66d88499b3b4e884a0427bdade3b4add7", - "91c35b0964ee6b9946d099a62108a64578a24b7487d0806b5c96e799abac605f", - "b9daf317826f062787f88d20a78be759d104f303af0db6bf77b6552bb7cc5841", - "e308eac20eac2367e2f4caeba10d1a4f29955e11fb70cab5fffeafeb4c32e37a", - "c672db68729ee57f30d567ca2ed8a5fde57cce9fa75ecf9492a5fdd7c60c0f11", - "7c2477fada699773919c73dfc0ddd3c393d130ecb8e1d81c5ed0431e6e6678a3", - "009a1529383d501ad2baa813af765eba24d5b1ce97dca2a607000b900550fcae", - "24263eb5ea26006c2657af50aac1ae70f95b90c357944b14ab43476f08fc91a4", - "3223264f8c6ad8a2973c9f5dd68f471d41a2498f4b4ed3234d5931c9f70a9f94", - "ad1f861643b0bcabe258c3ea243fc5423c1f4fe95086de899a546ce964f366bb", - "92b9c2cc46cb8f3fe0c964c369746c6a2d431dd8b59e8167fafae7bbe1499fb0", - "0cb6a7987d680718765659e69c26c00447247d766557c7756914966c260b0507", - "a4f382da0c63d5e435f701ad683978e6d59c1771c3055ec643c7cd7330ceb39f", - "4ffb7dc70785344d4b85d8c0f159338ca8823820f975c64b42262aedd230567a", - "1de47132e2cfdd0f10efbe76d655939524926027f1bc57bb5dbff2a7684e77bc", - "4b995bd1a2556f174786b4a40f3ed0a38e4937b98918b7f7bca99d810c64c41d", - "30703c9d84305c198aa4f68f192c260cc7ec91938072ae9185568a04fbcecfd7", - "689ed60562033aa72b241415d94d153e264927aea6cb9d4dad04335580875b86", - "5edd01658c7e9517f045960dc58275c7bcc0251e6788d42ea8324fd7c01e62aa", - "88f17c78822d0b05c807d63a521a6960e5573defdd289b04cef403a632821539", - "f2db4efdea12c521b601b56645a79927f8b844f17f0a0e34a535dee4073cdbf3", - "27147579527066fe1e346d980a4bc24daa86410891f1434d466c76d38a476cb4", - "6e5f00cd9f1b608f0e01da85a8b02f9374f89600fbbd5f96ce8f60be2936445c", - "3299df1cb71c894c6f6a5c48f23ec4a7851ad537452d38f520aa1afb51321ef1", - "0296ec931b2f601a6f70812893d554ea88cbafedb651edea7bf323f03d2ae3c9", - "16f9842ee29b6ceb483090abca3d38410ce3f4c84bf3bc7e5ec01bffb9014cb7", - "5a94628f313084c7904698b8211daf15d9cf891bd9f99210d870660be7cfbd49", - "9e61f434038824becb938f578d5e8e298e174b4fd7174f435427272ed357cf10", - "9eab4f52a4ba8528e4f1a4e5327f31f324cdbd0c4451c1f31d52c4815b919d4e", - "043c146584cdd21b7eacc7b07cf82e8db1c45c7a3b54551acfe381c4d15f9226", - "0971f6924b89fc83268efb4c1663001c8fab911a042b21c941585f4136e82f40", - "39a2e085bc468757a9bcafa9be7168a804a4326793630e60e643925ab93ac9aa", - "ac06d2882210e8db83878779cd5d58f13ff769319098a6fbd95e65ef25c5f16f", - "406622e8f2e6300ad511dd2cae08f81c9ee299e12c74db13e6b315b8e71f1d0e", - "a38b87606b94f760299838868c96de34dd2d0e79ecd069e2dd10306ff1b5ac56", - "4abbbbedf9a20a751257990b2ef4e7b2864b16c520a04f49341479c1898253af", - "60ff0863833dc53532b2bc2db5773aba050f8f984708125abe8499376e7cea58", - "90dafe2eec433c82c65fb4981df71e89acdf4eba10c02e67bb725d093256f967", - "ad6119a2fd6c62d4c64b96df47227c7d12dd2cd94e7dce405374b5f5942ece91", - "d8d7e396602942829c3ade69065bb481d574bb48e66e305c0b51abd5bf44463c", - "b7da292f94d7cd40dcb581e29faf293e6052d51649fd3533644dea5a371f0758", - "a15096a3d1f573278be0b337fc8693da98d21f3d20ff044583cfee241e4e24c5", - "10dddaa668051fb1c9214426a25c2e10a4d0b60ebdb0cce901c01e3486a88f03", - "182ec8ec1783d810104c334812d3ef0a9540ca39cae1ad0e0073087f3a5f4fb6", - "1fe915b231893696ed3a6f7839ee7c7f47e12e6c512f461435beb5bf1182067c", - "9ac4ccf75210b5e9aa4d4ca0a11f24b95bdbf03740632caa045432ec7beecc22", - "4f74d1c53cee23f584272bcde79b926c1ed6338431c355822cec99d8b75ca64c", - "2b929a8b554843cccac5e220118a7aadf22c386c9a2a595dfc0836d37c339bf5", - "92b57314e36632652bac26d58bc239a3e8661ab8f43f5542c8c4dfa8507cc524", - "1deddcca6f571eb6c4fdd7e1c8aa759d2a829d9305bd335112f89264ab01ae91", - "489c3630e9f536fc4969f2a7752977aae51f3f24216d7d78d3eca6b64038ca27", - "d1789eaeee85c6781fd31c9f741defa4045e2395c3396cae53b139b1b4cc87a6", - "2852b685bbe8874bcb065fe48a9878c6c669a247a0dc9589b87944c9b4eaed27", - "af0c05271adf07dcd3f913d2d977e4f1bb09bb9c1434a0e0f3d8ea59da69ba5b", - "ff377b3a419b7c9947dc6c27321f51185063c5b33f864b062a26a509714fa0fd", - "bf6c69f85007b3cdf987e49c068ce38e0407ab2b47f116e66667776720db2184", - "e248fba321a79a189af2faebe4bbdcb8fe2daaed15547142c09cee923b453d6b", - "bd3d6599faa166d9b8e7f0364237390a496fc6c7e9ab68a455c59f0f15191e94", - "1f7ca778cca517a7fc201bb96c2af17f675e3894132065d375d15127c050e3a6", - "9c02753002415977c6d79ea8a61488f580608f931ab61ca75b6902ef01aa9b48", - "04a2592ae2539d0b5f045a2a8e7bd98d42ca2000340497818707602371eb0757", - "d0cf58dfe8586ba2c01ef4a224cd60b3e35c00c8dd7e76422bc4c7ea7a1afd99", - "7d46994d72302b34e036f2494f75e67b132800fab6bb23ae9c84c494dd626e5c", - "dbd0189d0b80837f42b450b570c87aa6ecdfdb2d95e7ecf4009314e341d319d2", - "4073ef8ee07aca4654d4cef092b5f4bedf6dde06b48f0c4900cce0dc379cfed6", - "8337d26424086485c3a95f5a973dd30b81ee10e82bbc8cf0ae667c7645d63350", - "539298878a8bacd6282230e6e99c66fa67768557288170c7d391a40a52a0faa7", - "2c952b3bcc80cb2b3cdfd230241a02c591b3950edd85a51970d0ea354a6187db", - "142fea876f636f1d733314c1f262f038c4ccc36798a9164f453012a83c7a4bf5", - "cee32a4f8115de3de5e0536d8504969891acb4193a48a214a2d6f600e4238232", - "8e74945f2bc0db1548027012687783ca84274aa55f08e016b0f508230677cc47", - "c77879ca50ff8602288f43b5bee6350edbe529e4d9a4c2c203aefc36026e950d", - "18a0ba44413bd78700ed099f38ff9e499356e305b0952ece3d0e2bbb8ec00cb9", - "992657ba6162a8595954e41b07ed721ade675e5dcb1d2637990435cddd5198f4", - "e5f1163534d225be5d73bf5bcfa02d2d46b094d2baa05ead08f0f9531ffbf3c2", - "f1788efef23bc84c72acfd72420074d81d6bbb3546a7be9aedb630334f6f1529", - "7e0455106f3d083b60d8e6a447d126aeb16bc1e37d59c20e9c2714c2fb7aa398", - "5abb022e63d1b8b61791d9c7d6d17cdce91b394a228139943bd9dd98ecb7948e", - "96f6600f6b813b5ea2980b490e9f8e893451d8fa530be3d61b9528cf6284052d", - "93a1e69418ae2343694b7e52606f8364ce471fba7a3191608c6277139babc114", - "a492d41599c3ae12563e0771f9da6d25dd4f9f084293c18fe807dd8462506653", - "17042ef38b2cd594612adfccc876ffd80eee1ec321bcbe6ed77ed9c85bfc5369", - "812759fc3200c3b2c77822f76624dac93460bbf0b21abd8bb95f1c12a4da3b44", - "f372c1c9ca639e89b0b28607a36123e0e6121bc7c1979ce941a503a6193ef9c3", - "d00b2242c6420c7fc2a5c65b74bb65113422bc68b451e4a71643b42d0c3f65e7", - "7dab42136f0f32d0597f8c2d67a457554f009d90a03462b65b65a42145bfac93", - "5f998585984deba435048a0e5d497a131d5a2d02d4b3a41a6ae092a08f01479b", - "e590258c14a0e17b1a8fd8d2f0d21df6556793a9935f94fa54478ff992895949", - "181fce6a34db1b4548944e7c8f9d1082d3f027cba2a72d559de26f94d11bf096", - "73b3d60ccb1d60bc1753af30b2ceea244f4090386e8e417742ce48826a7184ee", - "10411b09ec6135b23673c8b9a88daa757d702fbf19a25d6ac4443f0359d25889", - "42280582be77863df2b381eb3b76b3137b4d3169d2fa8c4a7a4f82149bc5cd81", - "c36c66345e0a1126fb0c56d613b302c86fefe98bf390b78d6475181ec390769e", - "b9bc5790a1d3d41bb9872390d6532b3519c039633794463fcb957822f1d90580", - "3315679bc07f8b9eddb7959d1a83a83a01f5b3bbd020c794e74e8915f74f037f", - "26289fa9ab908b148f43f0dec44c840029efcfaddb84919d21ae9ee2b2f45d88", - "e808f15795dfa8758e5eac18451db33333e03937ec4af7aa4c76affd4da8342f", - "8aef2500cc50981b013187dfbd52b68d1afc1d5024711e867c60cb59af5db12c", - "e383046fcf90b06d57186f1427698ca9ce4cb71e6ebe93fee036184b492c91ae", - "5bfca7ec1031e0ffd279441e3bbbb975f8c78f05146c04b629d9d8284260362a", - "19ab52358cf38c63046692de3b39088ef0e057b67be4d7649af130e9552a1b7c", - "192a9565c5d6287ee7ec5c51ce8871fabc437a9a05a3412513e3de124f20461e", - "7a173bbbf8d46a0ef75941f2ae5558eec057134bee18d7229736008367106299", - "74f090372058b9086bdcf2c2705d420a1a990c82e9ade2af306d3cea78e4994c", - "236e2525d19d2eb9e58a3a04f06cbcec76f58b9250ec77be566074b81b42a0a5", - "2990d96a96e7befe7de5c7bc97705bf75e0d35b3041a598ac7f4b0fd4a892012", - "fbcc6effb3f37a35d7b44f7acfeea5afe8dc088f34fe5596d2f3301378725271", - "4155b5ca79e88da0237dfc474485f37b7c951269713ed3e03f408c9a2508ac3a", - "b04a1c9c00cfd610af717664c0e078afc09a1807495c52557446e81126e13044", - "10200392862d9e33fd9685da0b46e782a7f785bde06072f95052d294564b17a5", - "55b177947eb0509fbdc8ac532572e2eaf2399da0f25682dd491e16b80cdc3108", - "2acf19f711d062cbaeca8f2de1f9900aad8e1c3717bd67cfaf5bd4028aac9ca8", - "ee1e2f1785e9e6b625ecfd6246b19de3c1775cfea6f7665a69c21d4eb348ddec", - "2ad4147380519b3703da2a7173a28996c2ec69f3b01c7aee7af8bbb1e13aa6c2", - "582331ceee0be9f0f42569955c972776df352405aceba83b19a228348959ca9e", - "dbdbf6ff0ea0c844ec7eaa34b74837ee0eca2175b92707b0da7436c545233ea3", - "94c748299bf8d7b60636ee044388df2e78944cf366de880577b5d4b96b18a5ca", - "695ec960ad3df627eeee17eca230c3dce222b987839c04915346c258c1251318", - "3457f97b6a0af73fcd67d647430841c54d5aa8a8c86185bd5966db68a9194542", - "9acb5c73c376adc7337ce24de136f960cc2d6eb75f4372c0c92fc484cad5fb20", - "2178bb2e12b0014e4f47006e8577e39c751e1512657ca22455d32c1e974332f6", - "a2b4f10bb40ddbff8ed0fddbc8f40140b633355ff470f9b6ae435010ffb776e9", - "4e15397b9ae534830b24f2262d83c2005ec709a5816067e26add2a10efde48a1", - "454accbd9f2537e94a895abdd4f0c8903ab68a30806240614a5acf81493d8569", - "0c571f9ecc66d852428ac1b160cad1f77914f768336404973a9e9daaaeea9d94", - "eff969bef1fcd241e59af48f1186c8c90f97e015b19f8dc0e0962b88d26009dc", - "f6b358e36d74b7a4a514c3d3f011f45b8f983216208db49756d23ed9d796d8a3", - "8b12fbf61f3adf8ff5a44a6eb2315f4561341d18568e515a7895041f35493fcf", - "55ff19879c5d2c4035cfe721f229980d2b1500d462691243fb71a650431631a6", - "ae758a7384fffa770329d4a626f34a2dae9b97cfa86887f8fc09cae2f28e0bfb", - "c2054d471be95698aa0730ca15dec9a167c8961ccdf4a89f81bc1e4ca62fbeaa", - "6d69a07a815f31403636cd21729a73b17c4d70bffa37e79b87b0c98c2da27163", - "c5d505dff81f2c7cff52f3988c06ef59681d156ace6a5a27f43d29e026f34bd6", - "67be0c23f4f59c6b809a4858a6cec939999c634ec6c12913f3f4323e1981fb74", - "9e4d44c1b63007a171d35820b55086eb97794ff1a7a9153e63a4ddefc32776ce", - "768ce591bbbbf2458e48b266c0e98bc74d6f35dde9af99fa2aca6cc2941cdab7", - "68e1278c455e27ca54fd70ae4411f9c27d7aa9fbcd0b56b7a04c39d9b5253c0a", - "d941c1d3422eeb0b0ce50f4294159ac0b90275b3ce55fb7175fb4c2faebcc7d5", - "4389ad6668f4c2da314577889909886cf67eb7293119137bb1fc577767f596aa", - "34701cb01fc4c85d238eccb04e11ab4a1311aa8cc9640fb0a25b1a18c0975821", - "3fdeb81636a5fda1174a464b016d49a6b499847af8af4e7610d03d13711ecc1d", - "cbb79e95c113bcdf2f8b59289b0b7625b0a51fb73e517069c3227793787cb5a9", - "e11572c2a22a563a8a36b4de80e3b19782623a8d09f92b7097b8f592492bb63b", - "f4df44109c9573ff1c4865c253f79ee59d0f09deaebea2e617332784e9462cf4", - "ac918fa11cf79520edccd485ebf15c1b5b9067a9101ef9d2cabf338cc09c4252", - "eaec253583e9b56e42921701f4a25623a56be8287a7a4708d9714d0b41bf5af3", - "ec2b6d956cdc4abcc2c639caebf71136cce280a0f5c0caf8ac30b4896c598b5f", - "b5b964113df838dda436643899b885dec04615092e35ecd3cf64bb978ff5f90f", - "02f52814a01fce295019edea07960f689bce187a7992c68f61519c237d7f70b9", - "d6aa650f938cb7fe9b0c87648c88cbdd0754c1101a90c341657423518b75e8c9", - "4752c28ef7d5dc675ffa6bf679419afce425845867fed76c784e0e933ee01fa5", - "3597724a27b3b5b03ebb3d09b8a7575563014431f981202b61973e113c8d3a3a", - "55f1adeba2aff55906601e084a3fffcfbf60af8e53db9dcefe4e47bde6604486", - "45b28746fc24d9ad4f4642f037572320295329aa8ae955673c09e3d6a338fe36", - "2f9290c05e80bb256380a46b92121b15e31e6baa815c9cef5ab60d29e97b9747", - "0dccd1ba3396e1a3011ecee75fffd0e10610af1c7505575e02ee7afb0588c5a7", - "7f6cc7f00440889cda8185772309724168f2c7415c79fa2c0d1697ae1802724c", - "35b45bf7aff1392d1e43f7336e1a157bad0484cfee227b90286dd94961ab8c24", - "b95cdd4257dcdfbf519848f6a79386efc3eecd90d3bcbe25ccb500bf5c9e27b4", - "791d323d20c3672967b3423bb91e2c63e0f344da5f0804e17c8b13c115adf6d7", - "9c0feb52e624292b09fc6465cf23133dc31c16a5cafe08ffd8678a15ab4a1c09", - "acdbe5d821796c76536d3887b1430531bdc8ef875ad3573f4859351674d7aae5", - "0095364b1d650e1be6f7e0444b5d977d7da33b72c01dec3c8d895357e6d9cf7f", - "01d1a81456294993a81303ccecbb4c20310c7cf9ed7d667d38583df373251a7c", - "eb9c833abbbd18b41117948ba0bfc2f5a3172ead3df75b0c2f39748eb32335eb", - "f79b5b7128296e2d332c93195865598a468dadc51ab5c79e3ede1bded1e8583a", - "a53bfbf8dee61ee41e0700b570717afc5bfbdc3eb0ad31782fee0d5e77e4bbd9", - "757f8441734fd12281c039e8a59111c7c58e87f16ad923c05e3b8a372c877612", - "42168fc419db6322901e3c1ebf3e7c7862db719f66629028cefab430460bcca6", - "72e93212f397ee69def76f418def79632c1d5542744b9a18abf270eb2915a218", - "62cbced84d8b1d8af62ae9e23f0d96cd94ee12cb7ea3ef8d098b7b094b93713f", - "5352b6bef7d37a043399a66cb38e564f4c089aae96e6d25d56512c2e03fe9d94", - "bd009b6eddd1cf54809e3134e162a8beef3533ae46d8f461d5cd8ef2cd8dbf02", - "6c58085972a11e55f97998e4872d63d93428fc00b4df8cb82078fc69bebfe79e", - "eecc77c36e38ebed16986c1fd370fa5cff294ce9acc32a0475d6e904db9152e6", - "b51883864ee33176b61e59ed786ae83b26cc370e4431c744d53dd5efdf389cfa", - "391382562d15850d0b5f03bdb8b82d00a2fd13a2103952da01e3fd176bc0d4ea", - "9f9bd72498f4bd08c1b8e414e2fcc5b9ddb1c0a4dd2a8ee515c469020d643964", - "f9eb9f2dcbcb23c4e82539c45ed90bd8fe7c9fa61367a2030a879541fee8bbb1", - "2798933661cfdd392702bf2784ebebed514eb88b4c29b6ab5229667370b4b48e", - "871746eaa30ef5d70a5887a45cfcddd093deaaac6cff36dcb8cc6557ff5319aa", - "4a070427661d05151fc0f4c37f863a1bab95397620ead3e36ae20d2cb9705829", - "691f5a23d7f9ce4a29b2cd5a45bd1fda15ba17bf793a7159f193099bbfefa340", - "9a43cab0072c102d8aa71fe92070e92e8fef43dac770567d2fa7835f76973e76", - "1c2e69752ef0672e2730dd8c06107c72c071592e81c1d41f8dd16b46d324b951", - "443f32a789c5b455bec4db33164a0872fcda51d4a4770f8fbf6672024a5e574f", - "a8ed432cd43eaba6809a256caf33222213ffeda2272face4e29104197c57e069", - "53236b61aa40ac88099233deb31c44ad0196f1bc152ad3de80334e66b5a5bf79", - "d8cbae1975ba36cb8f3196fe4ed04bd3ba77ca3156bbf7c7796e26fa84b1227c", - "5dfcc6ba1ffee8cd561ec2be571c626bd779bde736dc744e752c44c87e68ef51", - "c1e6ee3439dcb376a839a94027506588e3fcc1c6687bd67f2344609d627081f7", - "9d006572e44780deeb63d821a23a3475859e4889a869f1fda4e544fbc0262123", - "ca7d88d2ad0b2a6b2eb45c5bb6c22d4d60ad7d477491f1e9935e8e3814930314", - "8f1596caae724d266920e64003dcc902c50caa7a88feb74f29042a3ac422ca19", - "f4e99dd2c4de07702ef366f037cf59d5c6857ff8a2a91b701e49bc9c0f4fcda3", - "3ff6f39d026f7dbfc44f0755d7b656d87eac607ec1de08723f8770bb980012b9", - "e1ccf4a58e9e7bf5792cdf80e896fa945c85e19be4908a2689b38ad117682d9c", - "ca94623ddaf570280c7d5b1980a410deb80452e39b305bf930117fc30cb2cea3", - "5953aa317ff34ab62c140b8f6107c4947835a67b58a610004a58c48ccd5c60b8", - "bfc44b43983b48bd9b1e03bf146e7f78ed6ec147faf0f6941ca7e6281b6de9ee", - "2bf43a40149c882d3cb1fa9ef34ef082a598aff5c8ce7c44d685f7fc9a2e193a", - "b1c69589e7f7cbf6f5a346e14eccd904825e80b5592836fffa16dcac06fdb336", - "10f3dc7445e58a718856168cf02f797f918a8ed30eeaaa3d885887e90f031405", - "9de739d1419c2adb3cccfc8993b908eebaffa2c056522adcc52f5aa36210db19", - "73dc975c07e4e7299f41c26511b41f41a5ed3e404545619165f8f841988559b9", - "99bb1643e1c00cfb17f2cd5fe06b54be6979234075a5474e134836acf8922f18", - "2002d9a8b50243a708ff51c15b2d1c1e8dfc65d847133307401f9d5db90469a1", - "9f78e23190979962d0200d20cdd00b1a0f82ec522058ca6abdb09c9f8330b9ee", - "e78a74c6014176dd31f5646219bcfc9a65b272cd9fe89238302873db82dc55f6", - "1adc689bf8d7e63d627d6bbba5a984dbedc97160628ef719f095fa48ad0155fc", - "c1f9ebe0cce1a04325a89c230f75022ebc1b30641ba6c0166907f145d1471f7e", - "6a06dd71eae4255966f31d7023c43e2560c1e6e389f3ccd30798348520ab2d00", - "680ea4b4b7ca207e358a214aaef75b55b71ff07f629fdeb4180e41c5b94b9c0c", - "10caeafdcb14a87cc08c6dabd193db3970bcc41a4ef862ad445ef970361f4185", - "87a0844f3a617ad8ce308f4836b3e5ceac52902910e7bab233a04c51f308b0d6", - "761c3e350c2795430effeb42a16e66350b2b992c7257ed954c444e03365cf080", - "61668726cd14db0eb98fe383dbb9414ad6642ac98675b4c786086d11535dfa97", - "2c8e21e53d925af4075e3c91f80855b9a1ac31e6775767571dda620b159bad5d", - "7069b3ebaca6a555fa913dff1354c5ece94ab31679590b6429bc3b5c002a4c73", - "f2c4ddede43c0bcfc7b43ec3acceaca2013d562d889de79d450e87d1042dfd22", - "b549479efc33b053346fa3824af7250e12de2307191d52cb78abe73360ba372e", - "372a4bdca101c5d2fec67c4ac4de0e973b321e2d2c55b3c13fa5193c64524cac", - "ca20d7f88f3436b94a2c6cd8eda800fc738fbda078a07343c1ddc0e1be7c7394", - "25390a0a4acf0de04822b56c52865a0389ccd34cf53d11ad3ebbe363c1a2e588", - "44cc1a092150d7044b666f520d392a49fc5ff28251636f49dcde5a50ca43c141", - "6f58a70546815751f52b08ca1ed2b788f122602aa4330ea10d3cd2797fd6fbeb", - "40ec05bfcbd530087064cb25da8fe575f2e440e7b2abe28fa0db6f3ae01c9dcb", - "e3eb318f877b9b5cecffa0f1c9f1a7f97ab8f6adc2e3e010146aea136808d923", - "bc3a18f08a35fd53649f9724988fbef605d19a51c46c72e4769946fb616b6603", - "fa5223fca2568f8ce401142db826247dfba2c5256b3e3917727b1e8d0732c8aa", - "8657a884b32b5d76be1b4919acf7bf099a32a80ed263ca9078b17f17bf82ad33", - "2ee838350e18c6178f868f09bc8e8ebab54c985eb5f0710a58dc63dcbf30a799", - "f0ff1a51c14429e600751f6a5da5a74e89cf5c8a590f5a3f1f3f6ed6c2db7ac5", - "c108aea834f4645ae4a0f8f197459a29e73d92d919ada9ca96fd6cc99e1e2192", - "8458820960c1302d03eeb4e3b5621107ee60b55145d2e64ea4fbafdf805abd12", - "19d00fcf0e6a78861ecec540f2e77f510ab01712f8e993b37d8ad83e7d806fc5", - "9d87034cb2dffda5e9663a1963d0be2d90befdf217c87b29a3157552c95f021e", - "f3b24c6be8d0c7a9991332ba4f1401b724230b1177a01309d7659149ee997a32", - "36c705251d417e5ba8693d5639b3f88ddf1127b335855f690806963cb5732a3b", - "fbbe0db5e8f0e37511137917bcb215b704cec21ba35abc40c0a76078fde0472a", - "07e16a634f316e15650f7b98686c8b6269fc5a843469eb96b378cf550cfd4e03", - "486027e30465d4787d3ea41b24651d8e925cbe881d04579e1e02a4d332bb6dbb", - "95f34ea3ea3f0a80d791b44ff0cc520884fb48da531e4c9c912d6f25d59ea78b", - "fa6ff163efc8f34f570078cdf2e24f172ad5c7684b25251ae591edd3ac1b6f36", - "092b34a2acd6e138a7db0dfbfeab1b235333c591ccc97a224fb840b05a1b46d7", - "0f4e4550fb7160d184cdd3106e203f858ae005a7d2605dacf844189adedc44e7", - "f02ef65a16ad3ecb7d7ad226133bdefb5ceb904bec3dd42df07a40aafdfd356c", - "0f8003b603b37c73d67522022148d21fc76d928fcaf2189390102ee58fd5c080", - "bf5b1010a6aae6d6c15e6338f0d8263a5e0cd603414ea9cece81918cf0caedb1", - "78844db94f2d8e61e6f293d3391e3656d00fe2a1c7360414676c2c59a614d067", - "459e2e2a171222d0a53404d7b4e25aca2d71628069ffc6bb5366d5f503470d53", - "765238a6a6046e7661fd9748f544bfca48a9266c287f405078ba9b718c3616c7", - "a34283080d4c15f8683e5b500fc823a2e6b203be8bcf839cd33a15f4fdfe86d7", - "2d04d1ec50483eca09f23b1c4618c92a9b105101aa9db40d0347f821f9f9b59d", - "e50b87753886c34d6bda8f9a58483371c43b3a3edf7453ad2bb4d37c9e5e90c0", - "9c43bc4ce9ba2edec82d6b52159535189aff8bcac7c0f84db95bef3742bcb295", - "777c8b0fdecfd89c9e75177d854748f598a94ce21dc4fbbe0820eef008950257", - "0dbc75df7516364e248d931dbf439f8c6cefb3a1170d6fd1d7a39a413b71bbe9", - "70d160c20c10d4666789827c5529a75aaabd5b235d615b6b1cdabaf10219bfa0", - "b9472fa39cc7828a56cd0d4b1ccbabe85224e8dffa606634633cf564d01be67f", - "ac0bca0c31b8feaf23642ac5e9bded0d6e7f49604ae24e758c3e85df628892bb", - "bdbd000ed8932724fa2ac054ccad6b9af9b9d7f089d78b86eca436948c4b72b4", - "e572714f283bd787e8ce5b65d4b3009ec9038adee0f46de3034a13e2c6a3b94f", - "b3b0a6251f4b7b51bd89667401532aae5b0e331c2c9678b99289cce78155ec0c", - "b7811bb49c8dbb7f9705c76af715650c5522f24dd32339432fee127eb957204e", - "48c64e058c8c490e8a7fed0945d403f2d2ca262816ae201dde4b46ea074403f8", - "c0a7a50c270a3e6831550b64be3761d2075fa9139051ae82dca365a384a096c0", - "cd18d87b158a69313846075c746fccb9b3839d598474d66c561cc2476e2ca1e6", - "21a75177c771c106f6a9e6df2eb90159ad3ad6e47db350210cc8f9da222b9596", - "f97ec3b10e71144b83e4253de3b8eaee12b3b569d873b1706d8d2c76b5c2d85a", - "22f5b2f55bbf97308854ba8816febb135dfec04074e89139fcafef58575634a6", - "f64faeaf7bf5e95e0e83cd89a1dc2ab021c65d364cffeca5127a69c7db94f225", - "0dbaac5e75f12fc87c6b54ce99771873f92c024d2a9d8e27f1f1caf32b8ddba3", - "b57d0ab1ec9a6b45e21820b8d35121f11be86806c251c98124c2041ac2a1630a", - "6c9919ac1907f54d3289166d1c7ccf568bb235574c11faf31c7a8a03259cbdb8", - "31d781ce3040a4bcc179114514e33251fcd5d1df4a363ea845b7d8d8ed98fcf8", - "f923b019f436214834bf9298aabf8fa1861772d914a3b2f65c4eab21486f33c0", - "e5e4fa7218023ab0b96952e75ad75422d32cff1459e4252592d4ffa4493de67d", - "72e28450b94232305a11f3d48210af473074569014dd89f990ea932c21765ce4", - "2146e5de947597b0cc1493798083a10cc1dd4de7b62acbd1dc380646a2f11ca3", - "db7dd4374303c4bc80af0283bac7c8d9631ec6896dbc0a584d8714289819ddbd", - "c8b72d1d3bf34cf7e120720a539f3099531bb87f360ae58ac53c4b84f443b475", - "7667ec09be3f79ca4e5f3511518d3f04344ea3621bf98099ff1e16c4d9834449", - "15264b50710da35306877febf11256365d40a87e8dbb4ae838874acc4689dba1", - "abf25b1fda11a94efa0bc8a17ea0bf9b15fb5a1bea7f5e3bfe098b027a7e10dc", - "d3609698770a882b28a04c7b85e9c8f9f051691d6d94cac324c86d0f7edbdf3d", - "4a1ff5f897492ce9fc1f2347f89a662404683d63d35d14a2dfdb2d2d4f6db7d6", - "43b54448bc407e8ab6403758c764445efa67940ce9d658315ca66cffcfc927a4", - "a5d50a54fcdefb15873baa011683549d86a1c825387075e9fd70e5d1d4486e67", - "a82df66ca9f6a3789b841948f47d209817502802c63ba0356d83e1d44281e811", - "b58901e0e1ceccf612aa0fc94911d98449787d3364515d8872bec006200e254c", - "229c6692353eb8b188732637377edd525cea4fbc6dfb5c134bad76adf52e5f10", - "69487bc3f373017bbf7bd2cba167f1b286053471ba6b71cfe31a576a704d2377", - "8c24835b36e34378a183e5197c2c1f4c3468fbb5a651e1696139b579d560d0de", - "9015524feeff150e75e78d27c9696b158ec008134873ea36565f8d2023368dd9", - "fefe2eea9730ec09dc93da78e680df8ff0b331faeb34b4bc81574905b5d6d36a", - "2738531565556cf1483e522f614b7455887e3f85e44e40dd96fff24e0ff7a7fd", - "c8f19094e9d5afbb0f632cef865201cfae192f3afb2e58c9c29bc8832ecf2ba3", - "fc5e4b869841e7d2282b9eeaddb9dfa85b1f974e0f506d877af4335a16438dad", - "de1ff853f4504dc1e2ffd25edfcb760d65d54d1c6347827413d6373c0bc60055", - "4bfa7b1f69a6fe9665725d18bb766a9f094b425c9882798e78cfd038462bcdde", - "56c42b018861999cd1ce4d565bca5321460d34c8d9bdbdf8a993c1ff80400ebb", - "cc52a29e5f16f91c6b0d81aa6a32ee9c30b6a6b7cddf55f889c9ce6a7e4ce660", - "e8bdb05f7807cc0c8aeb3836f3cd36f3ea445a14c4dd313715134ac378e076f1", - "32211d701e210bfa13c59f3436ce29caab31d6be0e6a6da1eead8deac853226c", - "1efb8e2870ee02fcb37943fb94afdcfc0d0be995d81ff51163a100efa5390290", - "e06a5035d878ed76219113f68593b942e47d3e857e7c47b3eacbbc18c1a6d55e", - "ec8d138b8fc572edb3bf2c9d8a5be26d1b1ffdd770ba9c33dcf5adbfbc2e4da2", - "a05c46b202b732424bf394aabbd05d95c9f8ee22368a823ebaafe4a0e2ec7834", - "a267058b23bcd31a080d3882d2145b96d71407ce30e75579406c7568b2cf6da4", - "483b0f6bc15f8dd8707abf7afc6d8704ff3d5560ec56f20d00f401b67afd585b", - "42d03a24033acc0195d35fe28b5191726f698df05ddf3d3e10a295da49ca9568", - "e89d562ab67ffc99e93dd3007e2577729b1d135635328a75769f0d0d5f566439", - "2378ea8728550c75050b886e2cf2c59a2e036c9709073a201518bab72279e3dc", - "63eb8d2fa4e23adf1790b2a3aff016f4f781f950a469d120305095ab97e432af", - "054f6432acd867988efe062ac924f047e36b3bc8cd6d20387c1985c7698b405b", - "a43012576699207275de98d477ed273829c323954250c0fa29c9634810538d1f", - "eb394b9383a83e54b809c35976c611d4cb4ea19ea5831770847373d764b71ee9", - "b05dbe40e8f6c88fe2f95c56a6f598b032801b16230e360c091b26c06599be45", - "449c6ac9a2fa9fbd4c999a38c96a5990459142481e6872f1b99569a8d03edbbd", - "154b0575379f3954a631d9bf7672c061e42fed1e688c51d85de9b7bd5ba33bbf", - "2076ee8647427574cbfb54c3adf586d45056fde601aa2f75589ce46efee5b376", - "6a41ef93c8e2e4aab13a0b13bb5b4241013b69e07ebc342b562276d99e2a7a54", - "b06cc7efa75ed558a3b1094a864a800083d29d6f7bae73572f77ba54826d144e", - "b5042d17709412f55084a55d45570b62f1429eeec485aa264d9d6f4b649be99d", - "dab1d150dbc25ccfc308214017ce3f4dc62d1db128eb6910f9104a2fc80b0b89", - "44db2d24fe7b4511fc2054fc8be0cd9d1eb8121e0894d6440dfa560a8e97e655", - "9480f6cfe5d1a589642af64a15fe8c8dc6a3ca81d83cbcd398431fbe795a6720", - "2b5d537525054e24f48cd0860ccef35a56ce7070fdab5f561466efd0a989f027", - "f328e489a1620c87021682dd941de3ab68a9fee1fee60b20ffdf779113a7b37c", - "4899312e3cb019a4ab1aa2b8e289ed2bf80a5454dd98a8b535546316ddf34371", - "cee25c0604fe6176811544244a7e74ef205cf7924a841e597aade0acccc8e0fb", - "223e7d5dcdf87017de7d92a223a3f3a1e38f62eb40e5ba60fd2e47052b7a1337", - "82e3f92d6debae535f28e0eefe2a1e6bfeee11e5a7279859a43d588263470241", - "cc266a7789364d335bdc34264db335ed168f156fc40e9ff75fc7ca88203804b8", - "ce9502c11158f97f82f74b12576000d03a0dbaad51df547cdf3e1e670d8669ec", - "f23e6323978029d302597afbf076c4c63b3096b909825299c67cf4d0bb46e3a0", - "ae6cb9fc56bc0c95c699300f706acf30141f965806d75a010681d57ffae15eda", - "32226415f1cb34b7427df37eb7ab4b178ede4ec9e5b2d4ca4ec03a8b05340654", - "42c37b0902a2d0db3dc9136eb177009a39464c3a57da3cb855e646109cc7dff8", - "ee7fb7d4118de52e00240e4d796d91bf9705e1e457604ab964ba779f72d3c31a", - "70ac42900b70c56f4476a8f565921cbd74a8f7a1a95da3366c6fcea187b3142f", - "982a781eb92297d5bf4b4a8514a085e0c45ed574f695db478cf9d066b07f6904", - "5d9fe5391b9904dbc2ca5f6cca5fa7d1b4a1839e626ab731b8eb5f4bc39049ad", - "2ecedf124cd309faad17f448d1addb6fdc18a7b039d17989e363e40943a8fe25", - "59bfb91e319b50d712a958bfb3611a8cadf7adce406c06c77955e14c29736fe2", - "5e8d5cc5025f45198348d458172864fa4f9b1a43162098a0e020aff6715abf78", - "f4376c7c582f92aed061e0e95f9452c77d2a88036acdb7985791ae0e7471d9e6", - "5d83a28f224cf5a394eca4a39165214f3063f88e5310a838a739ce64fae23c5a", - "945df3e8f11da6d8238f9912aad5aafcf749d2e41dec9e0ab08ac20d99a7b10a", - "fd86c6e844765c33b5edef0852b533425ce3bbdb5cd36024251df0df24b6b594", - "6c1788c80b4e175d9f1798faa775be133bbb2ff709ee5154118acf384b9cbaba", - "fb997004016ce755567fd8fa656a7907347fb4aebf5e655919bcd27b9a89ce72", - "12a20d474e939a3b7930595d48deb59174dba2e0cc4bc9720262c10b0503e241", - "acbb042e1a2c7867417e75063051e1322ad214fbf205a299cbe6271ad06d3d8e", - "d74795548f53af128593fc6851f8e2138b437796226ebafddbd5d620cc619422", - "0be1221e9db49fbfc64e921be96bb2f04aaa7fa500b40208601e0b0c19f70a7c", - "8be633c5d3cd98de89b179e33e313ff950d7f53ac957bf70a0b7b86c63b0e92a", - "be15bb39fdff5d6839429e44fae52f55a53d9a406adba5a9e337a049f238ec15", - "ae1a191c339315515d71d21bd582110bc26d3aac0af1bc901bae1b350ea57aaf", - "a386596b3b1bd3b636e69f19fd557269c4b9ced3acd9498cb8cf8f9109f7f4cc", - "c941aad56914432c224c4ca3cab6cfe61c74e667c2024ba638fe54f8e58fac60", - "5612549ae3078171f7086d4cd19e80c2072629f1b5f3b79b259b9f72fba6e6fa", - "8ee72c8f533e7cb3d38586be3347d771c19cbf563bafa55f5cf47b2c8c17aea2", - "41d4a059ced5152c9e9df45f086d600153e2440d7bdb1cac65e6fa26585b5c12", - "d06f8fe34ef27f506e7cbff7560276764cc8efa1972fbad4b916fd4a5f894af8", - "11ef6cfd9a1195ab23bcaa0e226fdfd6ff8847546695871a57c5358fcb1d4857", - "7c47f1267280287a279696590ed6cccbfe82770d5cd1484eeadbf1ca985debec", - "b709c1609369e9cb821d00c1f56657eb13b4d6654a53c14f459bfea251899bd0", - "a87ead9cc0d2be67cd00e51d34541e755325a23dae723cdb3fd27fb22c12cce3", - "bd60135e18af2a033e9f3f771debe7c7935d61659e0d886b47ce8bda202d1c0e", - "f7275699fe8cf884d1c4f7e12b9cb09c44d4f3e23b73932302854e5b6825c902", - "24241a06ff871b6fa53e18563d831c5e577401ed962fe54d90748b3899d8df47", - "bcf1428f0e3c8af21fc415f667252b23e6cc1542b54f2a095fcc60858eb719cb", - "aa314970813edac7f911f9b39b6165a469010fbacc9f1c564bb309c158a04ab0", - "b6fff1185c8b97fc29e2090416fb09e267307b1d263000d5c80a8be2ced34047", - "5a5bd5043bbeb242d15e119e62f2ccd2ed354a38b7d07241634a4c598e2f2d14", - "a1e899f8ce659e3cb59cbdd6a82ed8f10a83987fd20e54148336682e61f8d5f4", - "eb9649103445830047c0a6515aa134c38584256e50b23e71905d82d0d738f0ef", - "d8f15dae75cfe0b0a873c8e540517fd564cb44625de7467543e057f8c6051bc3", - "5b67d53c2e4e0a771dcc2cc785a4cc1da9004deaeaccd649f0e392007fcddaa5", - "68f526aca1b88e5109f2f294754709204b55b396b2ed05dc65be169326f4f9ed", - "5fca643b04af0c54b9ea39c224d371b47bbe7f33fd3ab4fa065e40a91df8c705", - "ff8b678748ab819a6fa3d8691f8862dafcf4871ab3248f962b284278af349cb6", - "d9946ed1879f25e1840b5b607326d390cf50c6dfe5b77490a571e3a7a67d1709", - "f642bb654580e288ce37e6ba01b303d9e395215944a73bedd9d84cfba6f798ea", - "2c1940935d79770e4efd3eae0182f2747a95eb03344990937893c17697feda9d", - "31f7926116ca989784465e6c9139058a16cd8e06a0ed689bc9e6d4c8b312f366", - "cff018ef10bb920a263e1f5a81c1a69ac966da992802a8ce9829eb08ceab248a", - "88bd8311aa1d9a618d21db17d1698f39f6f4aee7763da892bb5c49cec7178343", - "dd008fda9e27a0238c670eadd3a3ac4dd6fa0f95964a5853041bb8c8d2b31158", - "79ca0c3d46d46f96e9fcfd209740d88f03166b14eb3d167c49139365e36f5525", - "161f9856c26bc8d53402e3304a22033ba1238111cd68c2eee1bec2c944fbceb0", - "598871478320930c8d9c6603fdb447ff58b4839f37fc696e9c06d386073bfd3b", - "79e39c2ecc568697e49e2dc75729cfbc42bb95fa1d0520482e7d92bf7571ac98", - "1dde35ae978e8f8d7c9038b21d34ae5c7de5687d18bf0f5baed22b38f283da1e", - "7a83cb34573628e4ec20f5acd906b9b7d461b3e615f71b8ee3f1a4cda9a73521", - "a47c43c5e8ff07f6e787b56cfc28ebd4ed02e710f02212fdbd24ab8e5a14ec6a", - "4f5d4bb6903587dbce245de211f79814310806317a3dcc7ea82f47f734d698bb", - "4ced014101795ccd94765ad86e29b054ea9190aae7752ea0db1ffa74e77843cf", - "55e2804aa70699547c41aa0f63b02f05c46f6dbd63897192a8ff680bbc91845f", - "11e4d960871527ed1a097d9bcbcc9b23d168a39900a1f17281c7ffa5dc6bf572", - "41d4b0144ae63e10f6df9cd81bc274b94f5c21de430679d6473f6fce6bc4d7a9", - "220712d77efa44a8cbfb904c0aafa0dc1ff495045b1dda20880b2b5ed2e69208", - "7bdf8e44e807cd0227995b781d24d2adf81c3cbc076a7ff9de7ec3e6373d2e84", - "457af73566d122814e93208bad4a38ee47d884d9f5780924a02e7e71c9530d52", - "65543f92a335a04c88648d2d1faf2ebba00c92e9d337eda0dd6fe1872dccc3c0", - "a285631af1d58a3f4546f252be9f01b2eb24fe71a5053ff89b1a422206235507", - "9d999c3f6dd78d47b0bacd754bb8be81f9cde10f1d21a9b471c13c78d2fbc448", - "ef041a7506d0cedb9e24abefddf53b6fce99442b87981045837a86103ece289a", - "b4c996c808e560d38447c3706cacecfb96656d50f89c7a0bb0f2593ae7d5294f", - "dad1a0550bfd9c8d0670b4010ecf88ae7880ac4779a071ddeda2deb7ffadf9be", - "1e6000b9781e85b8e4c6c28e6303e11d7830388f28de1289e13979925499d17a", - "31cd381a5a543a895dc1fcafab036db0a1226007e243f2fe5996039984bcf0ff", - "18f051012895c1409127f1d831949d59284e734ae70dad673d1dce07561a6550", - "17c77605347987009053392f48211c6ade02936fdb2f2d4b2e9fe161766f60eb", - "f183a5b5bf9fd539c4fd48de25ca4a0a5c34f45d954e5ac28a9d6d747f2397f3", - "e86b0a36122e01d52c9318763b65ade836014a7752940c801f8e28cfe78567ca", - "bf6acce2e5d34b3a732d04d06be6d3593313884d47a74be4d9cc007ad30a100d", - "f313689eaa9d3f130d719b2f34613a86b98037a97f9f9af536ee23fe799ebd86", - "77ae36fd3d1d5d09eaca9aaabefe0ddeefc59e642d16d13705e8cd1ca53a142e", - "b0eb41116edb2fb36cd7e535676d029e1c59b7d829d670826ecc3e034ff2d289", - "fb975f2e33176233c8e6d0b5523b5b07eb2cf5bc0f869e76215f4c5ab8493428", - "acc5ff06bee5915814bd42a6153297ef89d36160f389f349cf1ade3b2cca5325", - "0f47fcf2f064d476bff5a445d20b5ea7c431614fbc9bd98d6b25606647351389", - "3279e0a53f2c5ddeac476984f5ca8d35686329ea15466359df28a6fd4e1c4c6c", - "c50aed602ccd335c859c1ae23728ac3781f8681482c2c588fe53ec45a9f42a92", - "5c5f99bf38d7399f97d557f3eea6a6e22c50bbd12107832b6a10d6a452d682ed", - "8fbf646549f47c6bb22a1a8e80b3be17e08ceb84ad35b359ff7e178cc1455a89", - "5a0723c9cb6485ed4d6c5674fe1dcb3e1c9b0866aca82ef080d2a056c0e0bd30", - "12e8ee7464361cc68ff2d3992246182fdfbbf134ff15caa897a8fc602373b15a", - "2917f0f0ef272d7d36c8ca8b31c6981ccca6e97076681543f7695710568af592", - "a144d05084b50e57937933283230d335f8d9f402d68ccb5fcb6c76eec005025d", - "60cf377ff475c533ad54ee0a5dddcceccd7638a7f130b94385ae5fb761055af1", - "05c619ae51b098f6e73f17f7703527837d0ff6b455f4a1d0ead5eb61920f2088", - "a09e177767f97003c5b4f0d870d5b9241fce0979917a3464f36bb7d45e6e4c23", - "56ea08740b05788ab3cdf695f1d0bdec59d514f0a386d95495879f75c66fcad2", - "24cae1e901697ab678530abdc7b42fcc4b1a53c2fac18f6bd0c452f53dcfbc4b", - "f7c261125ba9dc397e9c492350cbf5cdb3f5f1d17ba84a43b2d3218d46c51314", - "09c45f101702f3d143970a1bacf2edf63f7c5c1b3eb199a967e548ea4fea1bd3", - "ba227a49b17763f78d551111e8e2504b483253ea7589e488bb58daed26629cfe", - "efda6691d28d7fefd2bfcd5aae2d0e83857479430e66a4d40ccd32ae693bd3fc", - "73083ab3462a52fb5913f8b5ad9b4f2934a9c1983c616e5827946949375a52ed", - "69f97620493e5a41839499792babacf5112330bee4d9f652cad8c046ba64ed50", - "05d7a9f9e162c38e68b76681d30917b5970d6afb7ffdd4e0ab8d879f977118eb", - "fbd6291a6808dbd26656fc0f1c4f363bc5b2b19fec692b6dfd154541491b8958", - "5174a5c86a40daa2ff2280a3997e7c1e4d9ba0a99345c25c4776a4725b573dca", - "e70029d682a1fe7e870ffdf02015e57b97e161bb5c73958224b98769618c6cb3", - "c9682357c6d8fb0046e682800a471eaf33b5ab81faf0f5710596c4c27f431c85", - "2074fde981f73d066f351133d673ed41702a8c0ae47d013a4b834d57dcf84ee1", - "3875d0d7bbc4fec08300b48331b3d079fe7727ee0388803a28f3a00f85194e3c", - "09296d6c1e4cf13a6b78302f0d345bce013c27dc2c01c0e3f7938021907481c0", - "3ccb8b0e027cdce360736d675069632a30df2569ed8c0d3c96ca16935d37c49f", - "01128748371709aabdc0d37c289bc369934097faa4ccbf387e83c737c81e0872", - "1edf4536fb8d72e8115d3cb52127071481e9a384bbbb4bbfa5aa10e33f55aede", - "2762eefc65ff194c9ed253215e2ce5757f74f6ee072bce60133b7404d91e7573", - "d66692b443082618a707bede80830156502f93b8ec2b5f854d42e1818b030ed9", - "81638b48ac1877458eb1dac5f6b4d891a54ba56fb54cc799301fe2dd5e7144d3", - "2985c398671480d390affa794e293683dd327b1e86fb6578999c2ab9f96d74fc", - "2a49b9c0e046fe9f6d914abb54faadd1032757d46f73a71b147356bbb1819d4d", - "0ddcf8295f43c687ab75fffedb280c6bbd5af9e7aadc264b02ed950cd2fa6f59", - "f101c0d4bd9b4bdec65e8ae5a834c5c7a5706bc5a5d5faddf5fec7afa9e5e8ba", - "c396360413403e4011f393cc63601ae8c624851c02636ffd76acda754e4997ac", - "cd20050a19ba6b625d0f21ccb3985c40f0e2ce9af6b93ad93016972012ac2cf5", - "ee41b1a119f72614903668640bc5702ca1fe17d7cfec4840a5bff5f684d70e59", - "a77308f7f0adfbf32c7d4c320d46d853f2bf279f4da25a0974e653046b541816", - "f5534e1e7e63ba49562d85845f2c57f2e90af649874738d041b86da10883582d", - "1a69f5d420e0cef3f91b9e7dd5de27487de71babce5e033162a953f2dcca7660", - "c2b9f90b319245fe435074405923a60034597db278aaf7c0106cba9516b27092", - "097b4b8ff3f368eb4163908c72b6b7c5d625329dd75df00aa7b9634a64a80881", - "a2dd14e13ae0743a75516d8cbf1bd4e02047e67e7904610760be556544217b3c", - "f0a33dbce08501a7c1d1f8f0cdd0a3fc10ad0f5d22ed7d7dcba069c11d92a4eb", - "4066330b9fb6cf9f82ad42dc66ec4c660cd20e37a65f22a7fc788aea6160ab19", - "5562685a04e865c9a2da4394c26a2e97a4fcf60cf545a78e87f613b6824a5cc1", - "d794766e43305a33e3489dc485646fb3300473b09de0b02c046f31cd933cf59c", - "a2722ee21c6133c7846cdf565c8c7734be5ce5fbe7167f2578f5abb9b48f8db4", - "790a036e64bb6697df8512216a48de7155e4192e00bce864a18005a7dfdabcfa", - "efe4ec6a30ca819c1366b5366d73507b035b641f50cba67d7511a579db262f24", - "ff2dd07f26f0e1912ed2e9003f4c293d09a0837fee2d2d565f240afa15a37bd5", - "5a84ba76d18aa56dd23d16b65ca2791ee8829738b1988335b6e5dfcb61f28784", - "bf6752b40ccfc9e91af7fb048faf6286bcbf89cef8009b27189a7540bb13818f", - "cd117310a7019fb648372edbc3c01b5e5d58813b87bca4920926dde2742dbd91", - "b0e6b1c6a12055f8eff354e5f1e566b585605b7744a11ea6d7fcbeb8f1b24801", - "2ece5cb1c0e2c59ada66b7416e7c7d2a4d5a07c8ebaf4adc7ae434086b631a92", - "c33e9919421fd10e8a0a7e9cb2a3a5a4e994cf649f491c2d4265f56549f01223", - "8de1ed74c476d0c33818521f9589c6f2254be3bba1f13c77c1f0f419d1d954a0", - "ad9716e60a526ab697925bc292fc714a3133b0bfb8c4b8a515f317b4564b84de", - "55994c095851f467f624ea301b86046ed1ed8cae5dc5b93d310684e3b95c26d7", - "bcfc2b226360629f68157ceb8ba42b37d5a665aba6c0b4d2156aae649885ce69", - "a3dc09512e691bd49d3f51ea6ad9584243483f251b589096ca0b741373ebc5dd", - "271e033f18378713169e9fd9c704bd00cfc5122d55ada12721f2ed3a7c8e6643", - "219a92ef8265bc89dafe2b657d53346f48e3aa9467628093721d3be7f2371407", - "aa0a2b1aa1edab1587ef007aa7e7e18c94580e272525e6cf37931fbc78e3054b", - "242f6bf016b6ae696ec8d7e9d5b887a23bda42dc2cd13b28e690ef6bf69a84c6", - "72386b18343565e945b300c958fc7d483708a65b6372f1eaa3c9d64329e00888", - "bd0b9b9c65396d0da9dd6a3b2a44ce673297bd0719bc4b6412bbfb47531366f6", - "5c345156cce734114402a86709124158f6d8038401d776e3f768d0c0c2515af1", - "d057f3814771b32ce2e98691b5cc1b5fee857306ba6e5dd33b30752f0f0abc8e", - "c02aabebd51d8513d672f18489e0d48a31d02754727e7628851accbd2f5e9af8", - "7de370761b58c03fab32382fd2f292261e4272ffa0b3d8a4fbd1820563d2f810", - "27484b2c406ba85c47e54d48ff47e12b8ae83fcb32e99b0d3125e3dce9bd033c", - "82dfa3829d8ede4d703527d66114d3afcc414d22b048c7924e13b5072fff6e72", - "607fd38350285e1c90a38670be3ba94f337d54fa3fe4b81ba494db6a3e666a68", - "17ae49822c7d777f549fb31e1871421e5acd77c8a770496089116717cf16db21", - "66471a490987e24463235908a9ba9acd62d68aa4b1715c6b087cec3a15ef1f25", - "35366a41642cd0d1568a0593a126e5e2af3511b0936b09bc09864d2ff9e6dcb1", - "5489035ec55a54c9b2bdda7a9d9c82f0d4f4ab3aa1fcc4af27d98e775ccc87a5", - "1193485fd3bbca627cc8c918f43688b55ef5f63f188066db3e5073a84da2cd93", - "da34d026772fbae984ebd083c20c74e4dd1541670ba88a3e32f64b2bc1db6167", - "0473f55d77c9067b314f91d7062527d121fb322fef03244eca6f26c23fa8ba4b", - "7bf22103d3b61f1b9c514587d95ced138a3ba9609fbe859f4d656b55eca6ec4f", - "ebe59aac30ec0c82e02f2860e635cfa2a32f0f02e81703ef82452e33947d6b57", - "d21e8369dd61d9ade8433f471783f873f2c389305ef027925b9bec40a3c8b95b", - "02a295343a8a1ab5f46d5d68755a1153feb107239de76f287f44f7657e5f953c", - "8a39cd0064972422b9d3326bc66f282d3eff3efc9be1e6a2a459eb41f4585691", - "b0a6f33b4ec55917e6850df6d3f29fe663ef0a5be559da71d0e719d56b267961", - "1a1a9488ef9f6d8ed0fff7c923815245a4512bf59fe8e79d1cb4a18e597a74fa", - "ebe915b067de4808592785cdaef89e77e07958a75dd33b5a66f30b3e7832e700", - "d3f573d22ce02e2ed21d7936c08fd7f833efa608ba93259693e315ab9371969f", - "fb243f1a7f1867395faeb1d4f90c2e1aa548ff306c01154485951c021851c4f1", - "b3df76eb833a17bf3ea6a0b726982557701836d514499acf837cc808b59920d3", - "459efb1da86ecbe6bfb8d4d8df33a3cfdd38a86b7b484646961952421f481bbe", - "496ae16709d4245641fee7e68ccbaf6d60d8900fb2f2c5d75542ea72b5f69234", - "41b995e35a982d0a522e2d69c40e5d0668146deb15ba282c9efaf991e2f55369", - "ba7f6d7f1c4d8a808308ef8d6eae6e4e4bafc0c6c53d64a7905e489fcb819f6c", - "23f27c8062f2e55252c1f442363d33d82aeecb3268ba49b92df24d8e7faa664d", - "3a698dad9c6a7f11e29e28ce7c4a7188805099e49977eeddaec1ea045a8f5f4d", - "535b81fb0d2aff5934bc4d1f0e8766a3cd00ebfef7cfc10e909be8f43d280fa3", - "cb0cdbf5a60e4000256bda4a133fad7afb318523c7c736a58e3f5f9fad04d7af", - "49f688a063f4d3954a46df16c644aadc86d52ecc52fb4b20c40a84bc9f6c9c15", - "add6386e67218bf176adaa1de2fbc2cb9fece9438219b32224bd21a4cd15a0fe", - "f4c10a886e97bdf626be070fe0874f2f23882799aaf499a315a3053f1410a52d", - "13c416e3d3cb13f4f4abfcb72a92e62da0242fdfbf537629218114feea6691be", - "f7061e8f4d0f0b6cefa67f3cde560edf54a25e5f911aa35ce224480a57d58057", - "f023eab6cc61d4eaa8431376bfc407ddb64c12d7e862db58c924e407869a1875", - "8a7ecd65ceb26f39492238b5a8a0a1283b9e8c0aa0f2c2111c58267fdc158a4b", - "0a95b73e1cccc99281304833e64ca857863c3076caff6e930bcf95079ecc3381", - "ee564620fa6146ef2a22cd993097f21bc1489a2d86a38a967fb32908ed527cf9", - "02ed1648ef35ed812d08527958304fa3fc73c140c2c9bcdccb1b99679b73899c", - "56d61fd15ba89081f919ccc994a924193510b0a3f0a82f3a0b1f6754fdbbaae6", - "5b3cad876adf6fca14c8e44bd4084d954fc793ba662ecb598128624ac0ee702b", - "b079243d9a037325f0519b3978615f81869cfe5776cac94b54ee7d0400940854", - "893c3bfa4dd1bad7d7de1ba8a82adf1d09a9897681872b02faab1fca823d8d07", - "70d492b3bda114a8a34bc4daa6f1fb71a2e2b37731a93f8cad1000aab812c58e", - "399b349cbd2630927996d72a4b3963bbef741d355eb1154895e188bf03f34031", - "1a2d57684a91f6f71961ea8e57f3d0ad831538403ee68dc6e2fd7e9c7008815b", - "6943e06da5ed0b849554d29dbf8c3a73b02eadb36fa677430e5b8b32fd031595", - "8a706053ddf77a3969749de129bf3fee8a816c061410d3560f0ca093ff8d82aa", - "5f58aea25dfb5f867e93166ce669767da6fe52eb654cbb57063fa294f90231ef", - "c966e4dd4f1cb93d46c09eac388220246bfe556868e270b239521db626bac0b9", - "3320b9af8f19ceb3ec7448852ea05017be6de57703fca40b5975e469851b6d8c", - "3a8033857332a0ecdfc1064b959a91b05e7652f6c6827516f8f56ee1eed4595f", - "df7813bb8ae7c8da1620627e6bbfcc58d721e6d9e0fc62f797c1f5a06f8d5a0d", - "20f7dee07c32639608a98b749789ef635830d6dc8fcdb280da9ccda6b0367a29", - "abe2bcb933afe37fe6358b4f54257df1c72a9998069a0764a7981a0dc4e87972", - "1caff47ce7afd4e3cfeffe8485e790252a24b4514da77be987317d19d3e94321", - "6c73515728e78920757f876df83e8f42aae06a31e61297c946957de8d3b1f1f1", - "8bda75b2b0cbedf959a27fceb955c5f757d4565d85202e1167f813d32a2d18c7", - "0c513acd8e1371db0fa29a6c54442a15812690c1b630afbd3af04ff53a792584", - "ba7963019cd868f0980c9a2d2b0e5cbf80e1b478f292f9f52ef07b397ce54a5a", - "10b4e67fa9d5e5893445456859e358eed9da945a7115c4a7cfc8ee6775911859", - "2a8f6642177005e8e0d6836cf062d71f065e89ee137d9137568938b195f1867a", - "14616ec3d2dc0f1d9f36f4341afa1727aa29ed43deb2adc32619eb7b9eb4e2a4", - "645e9d0640c2277e88ea43f7f34071816bc73ba4dbe87c02040882548daacee7", - "086523bd4badc3c7153291413956258d147e085a789f42497efe1f51548e44ad", - "cf8fa21e7cb06f588fb704ece551fefc61a5634accf92eb87fe1d094eefbeb3f", - "04737ec75d286fef879d029840097696523a1bd50833a35ff23a7b76053b7088", - "47331512050b3521b180ca15d624ecedfe4176debec4194fffb21b7fa9bbda29", - "7ed5462a2a478d2e76079195befde0b9c73e7a31bd8964c984f37882925d695d", - "36f55ab75434d622a8dcb6715e0682d94515dac892726a23d5dd95c1ab6da5fb", - "3954d03af5e3982886151d066b76393aa3115201ef1edbac1c108b8cf4dbe75a", - "6d6aad869a1626d21553149c87bdd30661596b62c66aa8945d536f1c97e9bf40", - "a51a7027ea75c53d7546b1637a7f96fc8bbc44f560aa0d3e4d3e38d3156714d8", - "0c4f338b32d9591d5cad46603e346ab885539008f20acdb3ad5c91b2dbff8e05", - "86e965ec7f705290c847a74c3857c3d0d348bdd507c3b096855b47be84846148", - "53a1ed65927b747b8410684b506a7326acd98752f7616e2f3ce7045fa710c50b", - "f9b38664ec5149b147a820576e31fff4b484c7c2b5908301e59acc4d34010923", - "cb47e41f53722c74846e25c7bf61bf0cd1b773edd556785f6b005b126df87fbc", - "ca9200a3de204e8225462287fb018ebbb311ec0c384efe6af758bbc044aa9e45", - "a2b2f9e88cdb1eb3c7a896182c75711e540e8364504f83ed142322f2974b31b4", - "c525e0c75b3ed1cb523fcc2c93b30c4dbc5f456352164fba757ca7c7b2344897", - "b594f57f5de524d30f72f1f1a4735cfaf9fbc8a3c72b529f26204b4d1e4fef78", - "99e744a37d55e4e6ca561a044768b46a6e494fee2edfa8280332f91d3da96852", - "31e987c364091f3c5adbcf5cf7562c98ad2d15f48a0cf8f02f0208500d2829a6", - "ee3de922d68d15168e57f59ccb2354d624b852c69589b1b12d44a771c86d728c", - "59d5256447b8a8e1159e3d32e1771610dc5faf553c633bff65fa2683baffa2ef", - "7ba86e112595b64e4e1c1b62ff6f8351412215d53d164be9891c159a73a40100", - "5109c6d889a8223117d15b1fd6261702e2eac4299f214453ab567c22fe837ce0", - "ffc79cedeffdd1cf1c7a4266aa9787fd576863c22fa7fa0a584410a3ae48f193", - "ddf5cc3c151c00e23ba88eb04f084a8343856c2fb66b2e6224d3001adb7bbc0d", - "c38ef63c1089d61ca2e4a76f4a2e12eee685f1d3eec8ffbe51d39a1c75bfeeaf", - "53ab121aa271a3bfa2f0b3cc1768320fad78c1f6303f24a2dac9ae2dc8a81195", - "62fa32c80ebefda1e01384eeeb76081537858b4fd3caf123c2aa6eb73dd43784", - "837dd27863da8dc66a43e2cd5fca5702bc92f04105cc570e139c30f6f44b2b7b", - "fc5a37b5f6af45927aab0b1434d5be0d2ea4bfa1ada6196241e581c3900b53c2", - "ae826af2756c99f7f034fb145b9bb8dfaa2ebdeee48809cafd0c6f73246ab2e1", - "1360779cd219ad51c691bb3e41dc187f542edfb02dffa23ffb205cc747ef0248", - "e84ba05d86ee8491a17e48673644d93efcc85a1eaf6c76049bf348e330cb6198", - "83b8b523565d284043a8e0a93c358c06d36c40c609301767fdb5df0ee5a96209", - "2d9006bddaba7588a39ec7c4b840bdda9be4964d5cc0d688933137cf72425083", - "43bddf0272ce2993d01cc48834444a69bf135859f5e25db962d2b1a640e96eb3", - "6ac35fa95c0feb50730f30b3e714c7091fdf03728402978a93844ca4ced1fea7", - "515a182878838281e05729b25c445c20f79b179fbd6f098eba2e50d1ecf5215b", - "f8eb2256828dd9b3bcea9fa5fdde6e57c24f7c989df91b3eb7c5aa4192c73f6a", - "144db3d71ceb5a7891ca75fea2b34ecc04caf90764c1271a70e8f18118d6bd84", - "6b71dee1275f6b2997b9af95cf2f10dd59263a534f9d99946deee9c3c3c8e429", - "f6716a163b70126904e2c50decc5fca953673a32600abaf30a8a38ac4ed57fd9", - "c70b446076c9a7be24ed462a4cfbc889609ea2bedbd5cc34ddc0c964a3afab03", - "66ec37be06885d94aca203ab5e600622d2c5b931f484710c1568be01695d016a", - "3a58af7c669e67094adbb8f6c330599c39402efbca2069c98e3160faadabc4c8", - "d0eebe9135947253cbcd353f195784b83b8ec370011d4735ea35bb65578fa768", - "e7eada7aaaa5357b628eb8949ba865fbcfb994f1b3df0c903b128b5ff0b766c1", - "0dad03e91cc29f0079f6deba6ab361ed0bdfa34e83cb234607b54769a277b1c8", - "4d6814aeefa95ec1bc9e4c2812552446932b3d4ecb0316e2f61b3c12bb60523d", - "f9ad1b9d6aec77f88cc8fea36bac37082ac708563b67f8fe097f6e46a6905c08", - "8b6b0606a071d7fd4b72a3dcaf0ab9bfbad38f21a24c751f641823c3222f9260", - "00623bc132cf47b13136b758a56a75a5692a548932ff689af1011427712e384f", - "a60ad17b98318d78567a1f32c3c1b27479f3999de39cebadaf54e4dc745af781", - "feb79a2bd1bf0d23ca63f6123d44c85ff3c064f5e83bc1cfc8a65b9aae4a583b", - "fab71dc965d20e3cef5545977617887e32ee3acd36edc32ec42ae71a07677bd0", - "3c5856728764b656f49db3968e2e7ce9b69ac63d091f691997df857382bee4db", - "d6fdcfc3e352cef1785a60d8e8570b0c7d999b9a22b981b8c7c4a55e12f7c509", - "1d941ef08e5045acf4fadb1fa94166ff3e7c0a9f31e02fb1697839f83140567a", - "279c4524435baad571480d04ea5c4a3cd37acb76a1f5971bee030cdd1b31c0a8", - "4ab28ab45184baf259193897b2f66f58a556741491de230049049389c1aa1ca7", - "eca23365c92aba060de477486180929ee637cefd02d0df471f0782abb2f6de72", - "a8fc93d6d5e95ff5f15dcfb5d31f04aaf2b9d26c18019c66263ed0202a0bda6f", - "fea0214189f9ae2fa37e6f23530724417dced1442ad4882e15a6639ac57f2397", - "4c1c05d2ff6783ba54ba1a560d8a16dbeaee2323e08929a67075e86905b2e08b", - "7694116cf285d5956088c29aa48c9273e6d88dbc5efec81dc213338036ef0531", - "7e42adbffac1f2144dab295aba034e687f85b7fe874721add40b8cd9a52ce78a", - "56de16aa2e5d1979c5745280bdb2ace8d9c2681ceb2fed39d9319bf71f713954", - "25fecfb847c79155fc4c2bee36b7a5208fcf3c0951c61bb7a0693df5baccb783", - "96f991f303f4eca0fb5cb6e0ab8d50729581fe5b9d5295caabe5b07b906f3fed", - "8f4593b9e39d4e1ddd5dd7a4cfa9eeac60f61760952cf021e1c871c7dbc3f1c2", - "114ba11f64742493c7558784463c51502562ce5698b7b59ebe0460a1f38d006b", - "2dcdef6c368d791427c694db80d86f6536f360ab4b5de8f1151f91e91d147586", - "25146f95edfa135181421b5049387012ef11f89e77ef7bbb8e8ca0f9b664a0f1", - "8d0d25fe89d8e73ce216a919d7461c0348234c07afcdb7e6c30daae35a62ddd6", - "6b3b8dfeecf08cc78ed50f9a7b70d4e9c58b25f4f472bb3f3d5890e852f7f772", - "1bd8175cba9e3bfe31c4ddff41b745689a51f1f6ae4a7d9836ff27cc517ebe72", - "7052e5b3b336cc11e4be6af0575473335b218ae0a7ad552bb2cfa5d2544e2e8e", - "b6f2b75b68928374a911a03ffd9466e1f77f74135df3a701b8e33775860465cf", - "8d17b5c4dcf6c833de2d7babb1d00b5b73cd962fd250a8c211b15cf2deadf4d2", - "cdf07b3aaf975f550be518e3bb60319f89dba0189d5f91e003c49916898a9570", - "970d14ffad7ce904ddfef1928c93c50cce6f56505f395d2a3be426642540dd01", - "b17bd7bd295608cb6f0400d28a6e2e95d5b5b2c2c0564e7e2d79b14593a251e3", - "7fbe47acc6f25be6c1ea7ebd8e751700f78f8fa3cf49fe9d6ebfbe00299f1519", - "bc5f91a8d527313d12212dbaa159cf91bed152ee232f2670d9515fb0e87c566e", - "3a89be4033a28f57e7a9aabe7df1f39e5728e6cccc61163519b392150650a270", - "7cf6e541cea28b120e34b1377d0eb1af307bc9d4989c6fe88ac9dc1a75385fd5", - "3e9755f024f816ce19a0c8951331fbb147fedd5b4bdc4e8d35368cd4ce75a123", - "92ac71d9e1409c82203f62361658dfae1cbd2763ab5f7ba43ab5629f87149bd5", - "b5824dfb49948cb1288ffbea56dedb982a6fe813f4b9e3c1e4fe3a599ea7728f", - "3361992588d05f24ff0e4f201345149f0887959401c7a45e58fb504b31a0d67d", - "5dfca2d34ca7a070b8e9d4452796097b55c981991849ec1e2189b92e496c72f5", - "9aa5c5271e05175f625145676005628a3c4e9c24acaf1bccde3c63fb50ccb9f6", - "14b759ca2f7781ad62ec9d4253c3e0efafb065c0ab06ade7d47fdb0050323320", - "3c4a4e9e6db5485d551fdab11b8cddfaab83c19dca5018421dcd2e157612d331", - "de4953f7dfd75d4b081fcb686b820b5c9271ba5bdc8e71b1d4901c6470653bff", - "efec8fb72ce9b09ba5d0b2df942777a875a3c9eab4453f60bb3ffacce0fc1187", - "fdb8fd10bc875dccef50a2bfd280b65bff25d02183766fceba0cc1dacfc5464e", - "0a5f22f7997312571463f7e6f247389e6f9a6b3317f7ed721aeb4ff205d6b066", - "4a8f171f7b2cce43e41abe44176f982828f1ee2c93665d058a3a255f431fa9cb", - "c373a476ccf91e1dcbf1d71e61c97ae38b4759713ad7687779413630ce70cd88", - "00fc40f4ab22b74ab6b94f76f4904ed5eedeedae975179ade1abf759f32cdd0a", - "663e4fc19c8754e1166fc480409cac747f1315d3f8bcdf529d6637524f0cfaf6", - "b602be31572e3335af6d2456d6c6a6515141ef542e4d7e3e0116849e7453dabb", - "0a8ae5f11aeb950ac627213c65ab7d23f0de796db1dc4a79864da232cc3c1866", - "82b29d9e4cc80ab0b9a17e86bb9c741656e375f8d31741e993be4ec347cdab97", - "636eb19f0f4af219a0f0625b475fe7399b7277541be8058320dc61eef0925a1b", - "488a25fb7a0f341680c16056155e39dd2b54d9eebc26624d2f28d31b1ea09bb7", - "5d654af3b0a984a9c26bced15168d350485b6f768085259428c3736c937f84c8", - "5b3e54a684b83a17ef5e9ea7da06d3d1898c06453f5a11de255f4600d284c94a", - "468b4c15aeb71cd774719c3bb148f770d6b29dd927ba65b9c514a39254a93509", - "450c575d772a87289833a679ef8ce020cb3ba13b33673b02b1754da8d2449467", - "27b111633dc9aa1526f32192766a1330c79dd0bd761aec0db5b920149b558748", - "9c9c9c066c7c53ca7825e4422c581f3fa8c8a3f46615d8152f66163d8f1f0a09", - "be78347a7fc22aa543e59c09de6fb3d764c3cdf982ec768c5fd4a58c49b70d3d", - "9c1d07645527076974f29bba1329581a88f8877ed7e983b6918973fc845ea9e8", - "04ecc24a24fac22a2ba623625716c8c059b86915dc74946355ef879ee3537ae7", - "75d7928f8e78de701888f3b70d9b423c54f704d826f0ccfa24457c78254c9bf4", - "bba590c1951fa129afd2b7e2e97ef7c9e0632ca0271cdd5aa70a6f391ae117ba", - "1592fdf6c81ceb99ff0b75b685f9a735d84afbda380efd840ad44f4f925624e0", - "7706b84da612a2e718160d3418f358d3f5fb3d6680d4c39335977516f351a6a3", - "fca271cc8856b47837a1b09d47afaf5561e8d2b8e4c1308eafb7f0cf1a24db53", - "7daeea633d837635646ccc082a53f09616205aecf98d95d2dcf4763d9edcecff", - "eebafd9da82c8797319f2d48f04519f4e6704c5bf4fc0c1aa18cc0572e6fef85", - "561a7eb36b7a9540857819d95361b39d3fb1a4032cfa1d86454e20828722118c", - "d12b4d1d846021de3fa4e5255e4135ddac89de295de42e39bef6bc3de681de9b", - "387693da484508a3cce46e1b882df29cd245f3210161d31492bd43dc0bb8449a", - "8cea8988490fdde88d4d2527e82124a32f1de7e0389ce80982b45e671772ee45", - "e2c6bec273dfdba7ccbe804fbdba0e1c2665b25d75537949b3e64ddeba455c9a", - "ec688cc055fae0e41c88d6446ba0f7d9c648fe62bf8deae866eee8efe49c2d3d", - "9457e5a939caad0814f4c10da67b51f660e55cf5074f778925bf010d0e077f19", - "fd3c4b134e4b5c86db0b652466a50a7120bc32f00f84f16d06c64477abf5e96b", - "5c18be1fd0bde5abb3313ba5c9468df0939327b3fa32f2d0cb04e7b28b5d24d7", - "eae5ce77a03d6b72848434f2600da3db5b3009558c02a18acb71f15ae5f9ae11", - "4adf02655e7a0c1962bff1fc486fe0fc1485bc1f7314db1c5a9f30113be89e49", - "702448c2e2e89442c1bedad179beb49257ea539d28c8d93ef231114e8d3879c8", - "cdbb3ea099147382f39e2805dba27075b7ec6bc4bd061214a9d9458a61600f9a", - "d8ee0097ddd486ef166bf83b7c433d77a31994f3006e76b8d219e633d54f88ae", - "709e2e9b0ce97471b003cdc821aaa0ded3643e0fd217a60ee9a267c5ab54129a", - "f58f966cea9d035a17fc588e916a4df6bb379b70307b1612d370d14b063ed325", - "b68b57583759e81586260db967cf4c331b7da58c6aa15d5cd463ecaf34bd1396", - "138db3db0c7e55c5e2bdb6c52c7277025de722323bda2ab795ab28858a675db8", - "22c7478be1fd0c1071e46d9b2a0aa85f4f3b783215cdbbbf7b18ac7e6cae4172", - "63a8f2a0874b9351799d83e619a08f07cf573d242b3e3870e8fa104dafa3519e", - "176099d3b9452ada804802a1bbef986c11cbe50d27b5551b2d373d8fc7f25642", - "5b411f2b3df6952c0155543bb49ce0337e359a7963ed13537b9f35f7e948f929", - "6b0a5689892cf4e8c3584521fc2aa13acabe035db35d71dd9aa2ad01a17e010a", - "87709d254a37cc7b9ca7fd7d5bceaa7089521031e956d5ebf74d6964c7cee773", - "656a6d69b5b95e873d9f79acc761103ec7f25ad393ca6d65efddceafc0615bea", - "bcf0ae3e2a0c814152e0be8c43e7045dd45461866d18a9b2869090bc231986e3", - "39369cc7393177f36740377950ab51c8f01df820b3154cd46044cfd9e68f7a89", - "0b1e31d2f2d14b69971aad9fe1066d3b86664d957ac0ed019b13127f26dc9a54", - "929ef8f5d063474ae09c771505a0a654482dc7a7bc7a691c85afe831597079b4", - "98800d9a578b276d989f809dc7366b018b360ee2a3ac2b3812c674a0ed71a09c", - "65e7c1fdaeee3b82484139df83b4d6ef578903c9abf1a745b02fb2d6afc4255c", - "1ec727ea81467084740ac3c173c3b25636fca49f5613246fcbece7577f69f3d0", - "ee116226e2196e609ad4236c18511ae1280dac20c939cd888fb955626dbcf8c6", - "b1db892e87c2df27530a987b8fb084a4675f511b8fd2177d1cdf690dd4cc9a1b", - "144c3bf2d7d2b6b8ed757484b7c31ebbdc0a404a33e39fd88bea7e734f4065fe", - "a3b5e3ccaef2fcdaf27fd0cf1531714ae35688d4f1cad4204611e7df641d212a", - "04d056817d63e79e7077dd504abd3dec0ba07f223476e6c6574ff4ab22f8e69e", - "46a74bdcec7954b1d93f22f9f7cc536bccf2a4be1720ae1438ab7052f423af53", - "8426d38dd7c55b699a837928423a1fba610c589f0812b5cf7ae2bf792947381d", - "660d47f7bf235ca8781a441aff4d1a5575c35cc0b1eb19e8c786560ae01761d3", - "7bb30d285f9afff9ae58252c79cf2f32525fdb24150c9f6847da38ef30e96ea3", - "56992699b7b89a59a8331a0fb160c749ebfab857f3d0ddc95bc930b88963ffcd", - "5b45c34065947c84d175eac4955598779c7b8aec04ab3b5de8af575f4660b989", - "16d901f5645f9df128196b44dd9d1acd797eb310d75e3da41554ca65e9e56af7", - "4b8370730d06bcbca49dfb0f2ae8be297e95ceeae9c86d1b7c9d8f7b9a752d31", - "4e81ccba2168f7bc8d07c5555755ed7ade23ada256c50efd91ff93c2b17734fb", - "84cff262267c9443204fe412684fec5ee37fdacc2a017eca215339848fc7720f", - "62a934d622f5eb5cf51887ea20b88f16768595fd1ad8c03a9c646cf0f044c394", - "d8fcc9a804a8c62f5444fdbae6a9296e69bbb2fb17f22ae4e17679387b834680", - "75c68481264ecb8b68a38a64d9909de317acd93fdd082d169fbcc773404e2b86", - "7344efee1a5fce5ac8c33323b65a3af8cefa415bddce5782eddb0f984144adf2", - "8791f40a2c4bea71b6998a6510716533ba6158f9a344c7e2740ff6da6a3d721a", - "f096cb5e7d5fcf6497b1bfe15bb3fd349d1ed52f1ab3d6c0585a4b8f53f81b34", - "441e93272c2549de7cf6fae6a721cec6593c3c20bbe86698734e2b090158584b", - "e84997997b8e331b140269c69dfa57812ceebc09d9ac093441d5020e5bc2e8a3", - "2c070ce20b96650f0b863c17a324c43f9ff1a8f4e3fd6aeb79b6bf4a253bba33", - "7052acaaacb818f2174d99725ce451f00ebac86869c1115400fd43f8a37d95ac", - "c240108f28cf48dd94658d7bb4a05007127fd370350332eb999eca4bd4b8fd48", - "7b61353283f4812a71cc917b914347c47747435abbfcb6c59879edebf8ca094b", - "4f976365e9686a39f6ded4f483f192a78efb306d04aa0f57a81d0f80ac31dfd1", - "65aa477e71c42165b59eb8012932e2c8c971422a7438f776b342b615220d01ef", - "d8ba1004938de709da8e40efebf76b343608be701aea6a883ee7d1edb22554dc", - "fc47d452dfafed89f2ecde50968fa5dcaf333bb8715fadf2cfdaeb1851ef7984", - "b5f1d03970e8005d43cfa8c850d1af686ff77e9216bcc008b0faf079a1046af0", - "62c2ba9e6ba268ac78284a0cf05f982516ab63b88f3b7762d806d6546338d59e", - "f354e3eaf32230e7687303960f2cec145c17efa5ac68aaee277980877e17d592", - "d75ca511a56dec08f66f0f6109a42fc50672b2a15bc843604eba448906b5ab5f", - "05947c63cc2e81a40ca168361b9e4eea490e311e565a833b8ba730d03f57ea70", - "e6393bdf3f453160f2cbd89d7f18e8893322a500cddbef2c5ee540adbb4e4f86", - "4d83acf89c916a4f1075a82e8904f5b694bcc32d0fb09dfb3f2e9f430308e2e2", - "e470745fca7fdcf9adef27e3736e7851428435c934a6c1664b97e0558372bfca", - "a0aa886a9d14d4d658ca0713a7a63d2ae76b16fb7586c545d030def0f62e6b71", - "de3b0e7fb440d03a9f5cf440a86badb0ae140714835be30b2bd7cd676db0fabc", - "f3f0af164bf0f0610f71f4cb88c663eb82860eae80b9cbef018af7cf19b217c6", - "26c4b3956d360dac508953e790f9ac21899df2fd4d2e8e1dcac4d368a25a0e7e", - "081aae1470d04b8298d98abf9cdbe62138520432e06c6ab83d940c24b7c10136", - "c75eae35640d9c778d5cda8dc61633ec18c333c44fedd59952377e941d2bf1bb", - "b7d939755519ec539610352364c495b23ce6457bd96fc7a8b6f94732a96a881f", - "330ced127c9b87a06e0b6d343ec6b955de5c3d8941b84ef88c522a5e1d79be92", - "15bdeb15f5857c41b05ffb3955ad178fa8317ae3e1212ca291471f1922cf4657", - "0a297245c447dc958af165f9a02173ded09d2fc78c35ca27ec933348d58b8b80", - "f1c4f36beaea9218c14d4385d50eaa8dc47444c54639eccba59fdc569fa543b2", - "ab7f11c38d32795f10cb2f02adc857e5d2684398c392b4c80ed80a84e823faf5", - "97194fcac55ca1d80e4ae4fbe1d2c62f18c1cdcc600d296133a05f975d88bf01", - "8d2bd1cb0f4a6ab77504c912747d0f61baea18d1de97a888983bbce94e774127", - "93e71fbc48bd2ec2b2f15313428c74b546c6da297e496f1e0f39c9455ef967c5", - "fa69f32b9b41fb08b111c361291d4a82e36774bb54857b2e1b69ffd899c95f56", - "603378c7c28407563f7c8dbb7e470ebe9b3e8aa3457162d76805054bbf805d8e", - "6c9076c4c3d95e88a303aa0d8b1902276cd4c797b027996c92f0ad0135b7650d", - "7c37d90b4799e9708c8c32ad22226c434e4b26f1b1c3823a172651ff58299ef3", - "1750d66260344277da3583d32cf5e100ad572b281f622f19220f881a5f7371ab", - "fbd7bbf8df91951dee7cc09bc0f3270de5106bee7325fd9b5b246e6fd3ac67ad", - "6b8596addcdde056f4860906748a90099f83cf087810b4b04551c976112c093f", - "9bf79b57595f4689358902021cfdb85902b24babbb5ffe8adb752e624a81be4f", - "72c8dc8ec366caa2e742ec4945376607b6e063d0262a0fda3f35becbf49e4ec3", - "90991129615cc23ebd50fa50e13e5b8435bfa5701d9b6d2632f378f44ac9144d", - "b97430ee51a2fa33e40c35e761c1656f091ef981e6a57b8803b574970930c5fb", - "25dc8cac38f707b7e693a2f012f1f2a5fc2017e0413bae9b3da63094165e722f", - "5461e4d98b636f7009210c677585a1036875bc240ff3340ab9ff02e27039b49e", - "e53bc88b8a18065f9ae3bd9991f8fb90b174f6f5553d00c6ccba49b241bb23b7", - "426f8c4ee0a5a0156c0110d043ff5309cdb872ca9466247b11d94502759b0e14", - "29c94b36b673f0cfea4a21e246f08320c5545dda91e5805c239bff7f40c8be93", - "f90a3aa6710212088062f317914ea91c8bea9e5d58792bf834a3598a819d9fe9", - "0a92985478d7f99bf9f66ceabc730790f0f263e4904cdb44dfb286dea26b82d6", - "90fd8c3abcfed61e3e5e332c9fb21f741cd7af1b7f1e9ce4d963d5a3bc090c34", - "c84cd383b3b3a53ff2c55ed78e16c0017d9e53ebba5b28494f498cc369c17180", - "30696bb812aa452eabb42a85e6888f5fbaa1a57276c065e63eb856eb531f31f4", - "45f6c54b83dbabd11ce301d0e8d1bf86394c99069046118c6e8b1f4ae6abf6f2", - "9c40e0cad12c0acf4b5e552d2e706a8385f67dba5650c79159efef92078bec9e", - "efc8c48c77847b56d7ba1d44023aba51c833f2468ef4a96112249e41824784e2", - "53bacc4ca17f4ff8ff250e1ebfd04fc5377e661b45ebc8f9b810589900d70804", - "4f62528b01f276032a946d6956f8baf6d5a276f807c3fe59e492d43a291c9a74", - "339cb3862391f8c74b9af4df7916dfc9dc96a68ba94b1068311a77279138e2da", - "121081d8942125b1476977dc3cefee333c47160ae2abdd80d0e084945d7cc5c5", - "1a9b224f2550b81ea8d885a6ad79f34876034bc1af87766e321bc4551e22b4ba", - "28e38ec5634bbaf5dd5f5cc177d9f9db9acb4057e78c3dad2bb4d18df2766457", - "3eeecdc49d16cd74aa415d733c9017ed0c4d688986f84ddef0be0201fcbf3a02", - "d2d3ac1fc038a54dee58b50dbf7fef6f1cf6e739635e93070fd3b32625a1ff9c", - "1df73b44772620c6d74c176f9b94e54d694b3f070283b0ef8ff6c89276e6eee9", - "156d04015fbca8ff4a37cd6f94affc224d5408616424dc419a2cfa4137da21b4", - "5bde97b9e0a863cd358325b68654906c9f8bb377991a21d85384d871884f1f9b", - "56350878b7b2f0ba06e38a07b9120a46ea51a0f6e42609a7c7cd9f594cdc80c5", - "a3962c292817446a6d4c29e01305d4cd8b4c1223b9a1793f455a533e94e41cc0", - "6e4a6be9c812cff678ee939b5e800c7033443c28aad48b70f76371e657ee70e3", - "0a81eda3f233efa86e3ec2af569eb70d79cc45e5966600a08486af9d606121b5", - "be308f2c4fe8baab2bc4e47bc1db633683b029a44b9b38d38b1e5917cbf08390", - "d9ef45ebc5ce482d09c1287a94d7473843a462632f4991251ac72b3468d3d141", - "1b006599f2932326577fccfe0488f0b416b8b5728559d092ee1cd245701917ba", - "0b0182201101a353ba9a410450471cea59937aa4d1a71ba7efd95b021828ef92", - "d791516e813d2d85b96e6e977b2e92f0c1b2a5d089deaf6022e3594e87caaafc", - "6d779685c9e2fe457b8472f6886e5d6bcc3567576943b72d35536809a0a0608f", - "ece7c14b2b0737b8c4edfa60542536189582e567e9e216d73cc95a20f5e1329b", - "8535a9680aa5af78a7b786098ffffa8fc55701644edad31c2051ccbaca9faf4b", - "bf2b5fa7ec7740e3fbcb2181882ffc03c4394ddb710e745df4829b5299240923", - "f25ad7a8586f177bf4f447681c92474129f606e0f6e8e0e1519ecf1cdd869430", - "07b270ae0fe3d7ed74d78dd7fbedd7eacafb482c9dc61cc2592c2e80d489fc6d", - "01601ffa6873e39fa0d9fd042c1e05aaa7cdb9b9fcda9952c398d25bc665825a", - "a71fc2deb020755f57a40980648696970124faf068a5679ca49b77ef24d9be7a", - "764eaadb24177c49766b3550f5b32e8f805f240e13977e3ce4250ce2e2e488a3", - "9be70b3267ee5d0f7813b68c5629e81e26db59ed00619ed3966a37e4dc7b5ebc", - "21e2518644c85a07c40c1add626fc0d8e40c6d440b37af8d7825e1efc19c1f1a", - "f48b1ade94e85877f94a73a5ca9e372a3ebdb09e7542b19fc96828db86cf9546", - "0b7ddf234810329600e93cf907ead8ba0f2e149609c9308e8f0faf35549436f9", - "d8c2a73fa618128a7a7e3946ab73e9ce8183b876294e8e38cd46265fc6821cf4", - "570123739e297da15890041cbedb3022cb1894a681b85171ccc06aa9ace27dfe", - "f32aeca2e978458c0ce75535843263f5df99583cb4b4fbb5686d46ccc53788ed", - "3f5c3166f48d42ca2fa52a65246601de005678cdb144e16caad4f3a7294384a9", - "fe9d64892f018234830954a682743f4d8f46a579c7c5474e9ca2bfd8dea35c7d", - "3e9fff79b61292d95903e6a507a90670d41cbbe91f3ccb0e9b95f75067a89496", - "0aac25a8231e6ccb18912e6061101e44daccf3a291104c6c3b73672d09f89d5e", - "d5c1460380e4cc08d5543a121e62ea6490e7a4dea37f14aac9084c8d937958af", - "fd84e15f3db48535701c73c17a23a5ac33fb65d5fce5bce1519df14cc623727a", - "3395f5521ead8e129ee62dfb48b9830577e55725b2df6fd993cc3131e63582b4", - "d90634dfebb39887845d9999e1f3c5b2daac6b50b03d1920fb6dceb8f2da4794", - "506886acc2d62761dd3446648903cbcccf62fbb90c963fa91b925ecd0a1b555f", - "8636382483f882df9e2920c25b128a916cd41f8815bb85e50bc2558dc8db2998", - "923ccf81721a39e4c3f19719da3fa611b9651caf5c7a2613fd11bd49f9bc026a", - "993ba884785c0d9086cc0c291e3e3a7f406209a73558bb70d5cb683f62abba22", - "8ffd7de386d53dedad15cabdd2bd855e530c4104733a051389878e7df48972a6", - "9756f33e8848104edd989317b54963fd63423f7925c889d7f96b662c8b31f54c", - "cf3bc77495c97fb8c2a8bea32cbc1552a8c39906789858a41ce684274bb4ac70", - "d545933f710f36bde1c2055d42ad4b4d49f7009035193fff7561b018153fe548", - "f54506986e2fd13d6f3e3f1abe443caf4a8a544d3289ce42d10280c219a93de0", - "28a37bf04cc2c22e32985992996987fe20733fdc797592c187533b37b070d39a", - "fd4733f7cfdd0edce3adc4070fb14fee03a991f49f1dd40a2cd673ee487054fc", - "143effb948cad6f1f4c93eed27efede43f40150c6dbb0af0786f3938736da42a", - "1b803f2607ec93016a706c4f93ae43ff3dcb033da232151e00150d73a1cf59e2", - "5fc3a1dce51717bfadb51217ae6b6dc0cc08f9e3c037a8a6df1ccac6807088b8", - "b7cf14b484061ff1ad38935df5aca7fc8d54653ea50589fee595f7d719dc8984", - "968ba229c3c5062bf8d7c6423952c7a611e82d031202c019a050c65e6ca5a895", - "cc101a75a3adffa461540c1e3d69274a311a9e936f90b2baf1f91f203d8bd9f7", - "94204e9c3a3bb5b2674692a6c11a5dc48521af1b54abab3c8c6379581386fc23", - "85faff8af1c52e3b5906f9162fdeaeaac5f47a7adc4e3e0c514d04e23e320bf0", - "388246ac2c8d54913bf2d23eb715b9f5a8bb155438dd55819e08e41987006411", - "486da10ce5fe668bbd9f767ea5eb5037631cc6bcf9b878bc24e4727d8ad8d15f", - "e46ffd17ec51b9b673507098e0c181ee5efa29f9f0555fbee12fcdeb2fcb097a", - "3515f6c703397d150b27bb330da8481c5a7149f348ae84ac70ceafc5a0e37869", - "015d680b0c5f406162b357bc896dc30a359c0b6fc820687173ff356d937c0297", - "a1422b19f05bcbdd874d0c722d4545dfa13b8c2c8bf28c61d5d02500817490db", - "2f71364f51ff9c8e2d0abbc95514ca97a8665778903b2728dff4ae385b1d37ab", - "72a455c6b597962168a91fefe7a27f51a3e0b0b2117e7691923a346b27c4c177", - "56fd93b0d8f63a85265a47550e070e6deb4e40993a9171cbe50d1f7e32c0f41b", - "5d019084776103ae44736db5ef18fdc09d4cfc36cb677c817cf8981b76b60b13", - "6ce8d433aca2b3879dc4c2215be3ff027ee8b1a360b7ca91f6e045f7300d7664", - "f5fdf144ceee6884f1fdffa0cd8f5cc227f07e4552743fa25ebb8ac7fa746372", - "01f9eb257a24fc079b54811e55662bdc034739030fd569bc5a1149d3fc720f5e", - "17683b90b87220285672a58bee5af07129df1d5bccc4ca8bab2426830ee68da6", - "0951f5ec0597161b06448418e03a13f921b9bae27e056cb585d24786fbd63795", - "02cc2a1aea82d68de80495d46e44d5d8271045bb53638571206f706e3db55410", - "ffe49fd66c19641104e5ca05cac34cbb3da3bf879932c3dc0fb9d1ed7ccc24e9", - "1606aaff43c8548ebd07560fd4e4473751b8dc4b31e8a876ceec91457679951b", - "16832ccbaed12257c9afb53ce8d14da96b65064869dbbf68dc3a5adc3d1b0329", - "247b69afc0de3c2db1767163cdee270ef8b2753fe8d3456743557aecb9abeb82", - "ef0ae5a129db920039b08ad43abd69789b27ddaa986c363a32a7711bca7d0c3f", - "66c7b6eef5f693158f76917d9c3df415196341dc7d0d0ebe10e7fdeafda84345", - "97094415cf7cd575d668bfa1f18122d856032419746f36121e55d56e750b4400", - "cd95d11e2cff9e66eae1474f5150ef399acc304d2ea60a4902dee998df9a4ea5", - "fb0af23b6692646b6df77bcf735f694436ce373811346e037c2e88f14ab076c2", - "38247a7d5427027fcd26a01870882f3eec4cf6e7eeb5c05fe4a0591948f4749c", - "a74cfa7275363a1340026e364ddde11dee5851b98deeadff3a506ca2f3c31c5d", - "e4f56c1868f9f52ccfe8257221ba86bb26e5e968dd1d33412d91760ccb60e113", - "0e8b16416f05602a3f1ebf48d9b57e693ac3146cf7ea297ae2b9b0ab2653a626", - "faa1d536d596a616d2026cfda9e41c0c7c92d5128ca9f5aeb5b8505a4438a330", - "8a3b54165cd3bdbc2399dbad59c39b9d0930487ad4c99ab0c732456cde179603", - "0e6d2ced3f257986f2bbf7be1a4a495af6cd80c119e4442d81f3324e075c067a", - "25943f73617fd5402c71cf53221e9f694172e938b2ceb4a156606c4e3bf49922", - "f22414c54ae2b1aaca95228e386ddf3562572114964f137eaa200479c3ef1c97", - "e5d1fcd1b84ef7b242475aa3bc8e3f036e2e36a53321ebf26d56933e1ac672c6", - "c8cd6b925254014cd2a93fa139051b8bbc780ca5545dc91e4beacdc7a283e174", - "c3ba30128555dce26c14139e9dc9743fea8c872b833ed64806996258657ead49", - "a196779d09dff8ff05e27b9bc71fd36332b90af3e8f0f4a211b12c6d329cb0e0", - "7e322558aba69bc81c1319152b16f76bae01572190ed3e081625b58098e5dc4f", - "037da73ad773c3f12ea2d22271576a55f48ee211fa1b0fb8d96ed770cb296239", - "8f6fb8a1bcb4ad587b0804a4322aa7d540e1ebb0604b0f7eee53f2b07f8e788e", - "90c1fc24b1f1cb7c66f5f2ee5563621c676bf3ea1306918097cc688e2bc0d91b", - "66ceafc3bd863bd47b0c0fedd0c8d96840b479ad3d72fbec4da56fe1733df20d", - "3f9d3873d0047be04352c495a32809f70ba9e2978443f1d91a0c47d7ac3f29f3", - "a8a8bab5612c984bf34350d86731504ed8cfa5199c0f7989f62a270961ca21d3", - "89ac9ad7ba4187520f8220c474ca9547575117eef61b547eec48d301d2ebbc8b", - "4288b1e9030bc9f581523b0f722455bb162f3f5b9490828e8866bc6b04cc4c33", - "be395e7e47ca03303947c9866a72b593b5911780bfac44d13a1d09339d9f75d1", - "f0b7caca0e9a227f8a3b519dba30c7403ba9a768c2d4c534d50e7153086cc421", - "82cadff0d39ab9f83f414ad0759cc5bfdded44d6434696f0ccce90e705ff808d", - "9f12cfc77f9d1f50166f3e79aa0d0db690ba8b52248ff49731ad5e3b221bbda9", - "67230203352b0a1eb5712a1a67072dd13a77a759f736974afc3bd517407dbecd", - "46bc0e357aeda1eee892401f29e693f730757949b3abea6d8116b8b5b0e72d2e", - "b741735dac0818d8818a81f77b90cbce489e4f227031c87befc37d36560a3102", - "407a71aedd785d52f227be12559a729bd97bc5944404e8bbf20625dd04e3bf19", - "8184a3179aff56eee35ac00ff5aaeecdca1e2ede6ac983a64596d4c2c5e0ae39", - "75cc57581a8a4b3ab4e1664a0f2141f4fc3781564968ddd9f7212e212f0e91b0", - "00cd1d238cd35bc5238b24e24df92463bcfdcba861f556a79a34ef17343f9fa2", - "5f030d1580bbb6821030ac02378538ffa9fd99d31b052c7e0499f15db1bb9ece", - "62005ed55ec3132dd5b31849000bda9c2c3162a16f456c58adca61eaf24e6694", - "213552decf0a751aec2f8282375a44ffe435b6eb7116879abfdacaecb096d263", - "3e99a4486a89ea1feb7b407640870c28c6d5eb75a4f0335cbf6656a49f58ab23", - "e875611306d9e244d3daa15ea3465bd70ea04f22fdc83fdc2810fa8a204f15e2", - "c4764573da6affe5e6c3ce7e1223e3a99daf78ddb189dee855e0b3b238fe2dea", - "57e7c693dd0e5095b23fc497804f333e3a6ffd29b2d7e461bd9691abce7599ba", - "ff45a536f81a6a1fad49edddb6d4705c78f1eed37456eb469045341cc063413c", - "2db51909e6fe0155292e30a12abdcd0ff9affaa7f7038d7934090ac3f3164101", - "df1886681b38591b15de97a44616381577baf092a995d0ef140e6f869e9f8392", - "6a0b697d6ebb88ac01abff2b00d82b046bb042204cf329e4520478980f89adc9", - "070dd40b53bd92ffeb53eb500a791a0dfd912f1134cd03c03b0d229156b32f10", - "4a9ebcceec58fdd0a1422020bbe08167b51640c8308756cfd41ad02e9b8d4196", - "4289023f4e220e11b46c90e145ebbd0362382b53c8472988045deb1870e60096", - "6d6be6a64de4b5da53fff00d9089f330804504ce17771323c1e69106344b6bec", - "f08102606417c672fae97a61998b087a709424df7e6a01dabd317f3cf9f891fb", - "811d425e3056fe38869d5a160bd9698a503151d68a04df780d8d3e7fcf298a59", - "bfe4e24ca451f5d91425926fb044fc5fec5071ca80ce084d63bfb83418a2f9da", - "ef06454d5724c20733f32885990edef6f573827d63803f7acfef3f060f7e33bf", - "500ba103eb5ee26e447a965a36704a124487e2eb2204699619b6d3600f0957b2", - "7678ecd767334c38b23c5f23a12591d8f85b6f5a6b86e80ac3ab8a3f6429acc8", - "0f24f8747715c373ecacd1e612238ae814a401266cb5958d5daf572a44f568e7", - "5cccbf3a0120d8f581b51ee47445124dfb67fde4b917f66bbba93b298e50beb4", - "3d4ab356dea70eb208714ca70a5623263b22902ac537b195fa199e8ae4f8ec61", - "33860766e194d917bbbbcdfc587b494eae7b049015fb90ddea3ac098924ac311", - "9dc82d9b7548e0f74d3b3374c0e86d1f32594cd0cf951600d7b89c2f1d2b1ce8", - "50448c9573b45dd2caf5e385e2b75a872b4ef357b7ec5c38e11b6cf4a5ed134b", - "d1b4d20d39c105f8e02ae50e3dde90b5b66f89876980ef69d4ae19d1e0420771", - "587294eb37932b98cfc10fe4e41d7ef9dccaa79b9101a7e091cf0c155f84ecf7", - "1bc0c602ebac5b6bb2661d80418ec335b5e76b65e754c121dd055c522bd29df1", - "724f84174a5e21feb7638437d23e0829ce3db2baa0aab1f21764a995b1aa7641", - "16c846f515865e225c5b464ab86a40c1af6cbf211ff11a6c38dd87426f6b2f52", - "dc0b252750529f6db29b769fadb863a168dfae973f31ec91733415eb5c55ad43", - "27187d192ca2c67c0ac3235291d8976ce8fdbeab83aa00576f67e437c6e3d1a5", - "b3c5de277b27a8553f7fbc456340894d517037ac0afaf34446effa3b2877ded2", - "c4ad1050d3e7ee261d04b5baf5a142696c16844ebb0eaa417e1292708a4b5ce9", - "d93c1c582dc7736b345739976cdec633b952e5c5683591fd9dca885359225d24", - "ddb30d1d5ab4cc11187a39847dfd939d6260c43c470a27f63b763adb2e4536af", - "2fed9dd8de6c5e260348a221ebdf9390aaff2ed46fac1f3dc300ce24b6ec49ca", - "ad886a72e0f5ff17f631c9c2b5517dc5da52bfc42ff1d419549823266c7d190d", - "b1f03f9c0e815182462f554a4ecfb243ef83a07ca5ece1fecfbbed00c27d748f", - "43cc51271d7631bb6087efb0a48cc9175774f015a844cf7318229312b8781ebf", - "aae7d4057ecc40e3db793e463e9c9c4a656698f11da9ea448c7a836599ca2e45", - "fef15455b062d8f87dc1de308bd7fbcc3b109f557b5cb09b77274ec3a17d0041", - "5a261d25ec393b5eeea9f1b1998ff0a7b1572afac52471b88d784c8218e23f83", - "62af93e672e8e81527686a1b3aa5eb0000e4da3b19e5496bcfd03ba35d7a53a1", - "9607e115c65dcd262f0d5ece85b3ec944521adb1693a4f1867cfe64dff6a1ea9", - "5e9abefecd2e20299219078ea65b64fbb8a527a101377950f80c8e1cd6fb0e90", - "66a4c397cca65a2f8db5091b275c6a5960a1bfc8bef34d28e03fd04df18527a1", - "4ac813794835a6a777d63d2a24251a9fea1d86d5b06141d4d40b285d003c5406", - "66175817cf696cb412f9613f04904137082918b84fed70b97088532bf15e4c7e", - "e26f80901cbe8c7ab3c3589c7ae8b82f42463ceed2e15deaed134c7d292926e7", - "e44f7722b785067152121514a298edbe9e6e1768464d4bc3de6ed114b2b66ff3", - "a69b867b431fc68b1971b4a83e52ab0148efebf5825418302e4e53dcb51e8ef8", - "20e955ec0e47bd7a0c37a225f8412c0a67068b065876110ef97c94179ddfc29a", - "c32da604073894a22ac7b6391f0744da67b3365e5f8ae633d420e56f173470be", - "a195843c23b320f9f21c8d4ca416b6548b75393f104383e5953eaa7c30625270", - "6505f56c10c018429b85ac0a2f37dcaeeee8fa5dc49f506f9f7fea0779b07b7c", - "058b424b2f59c53c9934a94fb640a9c5d081bf0c74afe6540a817186fe3ef98e", - "836ff798793faadafd16ba98a9feb109b95f225fedb11c6c3c247d7cb618d29f", - "9ec3d3b1d21e8e7a4f301a0f0716bfaeb5204cec80ebf18f8550eda8a7d48d52", - "15b814864eaa263bf252249419a38549c8cf233a3dbb2a1cd4fd101663dcbddf", - "edaebd196b69357e68fb40e37fd03857813051c2ab8263504bf7bbc534df4d50", - "3fc509c890b1b99dd562d7b304758aacb24c5ab4e9b84e7e244af81f3605d4f9", - "399c892e86da9d37b547565a47c88f91f5f6f3f36ed5db2d8f2279abe4b95ce5", - "3b96a3fa09e6777b3cb07584e45ed60da85a9f5a5b8e58cbd41415099a57467e", - "c5491b50b70ad82b35d8342f203e671a23e5f20cd1989320d0b2053f75c744fc", - "260924d64917d8675e50488992c02e5941e7cd1a49da2eca9a34f5fd8dc17c3b", - "acb0965ea6e5eb34041133dcc3995fad2a9a83cb4b5e645070c0b3a6944aa3f1", - "c0277ac04925ae2d2e70ae16eabe9c5fc75bc8b871cb8564eab4bea5269847a3", - "637884c8e90e0ac11acbc8bcefa05a97e117a41e5f6900f5fe389aa69d2d564d", - "29b4a401f36c29be8a7b9a8bed671bee09ccbb94e9537d3ebc4de6abd6f7a16a", - "6feaf6c3bce3a68b6a703d420536121297c06334bd049c3835a7f4a65f91a8c2", - "9e272e0d84c472e7d0f84a1f553f19a4119c495bdf9fe408bf24fc5b44a41801", - "ceb07f4b3e5a067ee4d5f194d071d527d999a4f5dc5dd7a14697716801f84e40", - "88b7bce81d1317eb8c1f77f7d80fb2b6d21c3e399ece289e4ce6542eae463140", - "187ba77ecb83b38876f8d3526b8d86f043a87b78c42b24be4e71da1c6618aea5", - "bbc0a7cb36f8674a2b52c14ce01340682bbd887fac91ccda6c72b1ae885f0277", - "5cac39c6c4a6c3c8d4c4ca09a357c8782b2765501276088f6651c2adbdac25ce", - "55fe36f4c9c4cfa6f44ad34a796907c8bfa59939b8ae232f0177055eef34c4bf", - "29222cd08f8fdded32b6be12cae842f0086437e8c49b37d7b91f06c39da7eae4", - "7b464ab573debea905b5182dbaa59d539b7615a63072c1308a83a771cdae70d7", - "891e28e848ea610a7c197e69212fb7a358466feb7dd995bc7f38ce70147b36a8", - "ccbc244682a1cce9dd1fca8fe4a703664d6e0d98422f3f90bd100d10d41f2ebc", - "e5994951a95891739116e282dcc629669ce9e81ca17e0867facc180a7fa3281f", - "b599da63875830a9c293ab9a97632c97da2d423d433c58b31e10d67e8f3f2364", - "a624a2aa37cb68d17cdb06d8b5c73e8be9a54bee96e2b4c86b48e52271728d8e", - "87ab4b2dd9c6073e5f0e84d87241947c95cf15b43b749318fde5075e4e763bcc", - "1ab7865964271d689adaae0f2682913589659b4f9b0025e54932724c1d9bd4c9", - "1362501de32c78e53d60b99c1095dfbe3e7f5d25bfe3bd5706987f3e293cea53", - "11b79c09f3ee7b543783168007b73393635ca7939b17ac06ae16f44b2cbd4aed", - "1ffdd30800cecde9a3ca35285b8a3663a3b649387a26158c7d5ab48fd5dc9e3d", - "08333b08d9ee2fec9163b9b0f75064cfbcc16e72e969db96b3a79fb6f8d60099", - "11ed72e07be16c79f326fe542224448e85ce25981bd6733f1b522b7273eb9170", - "485f2360fa0bbf2c511056d90790116c6052afe229a3fd609a6b9a849abda1de", - "b818ff11404181fd4487fb43edf5a3d7020beebc7815ece5239f100863afee15", - "234ce051e6b14b148aa214844db7c96381a333c2dc5d123fcaae0c832820b750", - "d933f62238d57241a12985a46c0ea34784ee4e736dc99f43a84176d35eb0a32b", - "40ad5cb768760c5f9866a572e36dea862993d932fe901932702cd445865e76a0", - "10ecc2b97bc9ea75e81fb10f80b0abcaaab22e58e79ae4c0883e205ae53c19f6", - "4350618bde396a2c50edaa905e56878ebbf490fc33987cd168e40bbf175fb885", - "5cb49bcba27cfd3a8f8b77b9d34a373f7d8a599ad229aa038e11e1676b2b57d3", - "b9e306958fa03e7fe0a2d65cbfcc998412932c25e6cbaf4e2f0a29ddc2461c04", - "197929e36e06d39f0fec83fe938520ba59e771ace7827c4bd953c3d8263d3197", - "69a6f5d636d0e050c495d7af01c09173015c776bcc1b9a3a5b2b019410fa2bff", - "47ab9336118cbec628f96bb38348a4ed2bf87ff564b1d77afd5ff9eca091cb38", - "7d27464cd052e95760fdcddd7baacc9c1cc41460d20182a97fc327f311caa8a7", - "934b3253f3d16f2e77243ba0bd40ebea14a2337192b1efc262247cd819a870bd", - "06495d44317c21ca1186badeb82345cb849d97833234c71446889547a3d84767", - "981bba7c16382bb13ef34ecbc326ae6a70f9068977ef5e2452c535622d307144", - "3d9c394c7b29a641bc75fd35a734ea8698e524c1d3e66787f60ecbe6c8a0d338", - "b1ad57c39442c39ea70bad84ee0bfa61eea5010a1d1a3856ac813f2b965ea2d9", - "7ecd9b5b944b9c0371cf83f6a02cb74187fa008849e747cd1cd3a0f28080c0c2", - "6d493192c04020d911274edf643eaf36386abd159b3c9abe7305b58e36748756", - "f49c7c21925d3088d9bbc00443ae5fca82dda3645709000a3bbff3f36ca493f4", - "f4a2af6a6a9aa6a3fdc98963822e3548ae2b65587f475141801ca5f08f5cc683", - "18cb8e2ecf9d4e19ab93def29844ca04d1a14482a0400220c8e1c5c205c52a8c", - "e8541ba0379e0ce96da6d8f0a8d7ab1921e498e020b751e727b0204f9e646011", - "a6ea67c24dd8fc975a32554cbe228e5df53a6eaffa43d4374d26cb6c0e3a3fd0", - "8633a96568f357ae2decc184e9e78608aaaf8448dd274aab63867ac289c69f60", - "5f10e36ba61c58f28f04c17f1db321c37d2c5c57c3d557be34a75ba40bbc0ceb", - "968d6614b5be1010867afe36c57b1837cb3d23b45e823fa8cbe020904a2453f4", - "2880c1346e990334d47327c2e029721db032508f9944842c2f26d5e1eb3edeee", - "178e6d0e93c1639575b36d976a9c55200f9182909806d9a1faa5eef870de13fc", - "4224c7fe87d2d9b7479017848e6244565dc9a80efa850df78de63f9ef3f05017", - "fcf4f867f955fbb3680be4aa2a93691f817ee0867cad2f2ad58ed8358383cf16", - "250f5a7ac0c8b174a462b0cc5a8d6119734bd29ac4a173e18b1915c122e242ac", - "c51f26dbae804467dd46293bf79b462da0c517e9eac2afdd36fb0c9a224630a4", - "917c907a4a4058cf06976e3d1f1b89cdbe02218724f24d55756ee47c77edadba", - "1cd80fb9b363495066938634b4215fa2f8477c0e7a1d2ee832a6773568eb4060", - "68df6ec66e5f3ab83d22339c73291b3723fd6ab4df91ab203fe844946b2f649d", - "137f8e84b1c9a16e8034f64542849cde1025a240327f772b95161890320e3e12", - "3eb49345464e35aa28ef4810a6904eed6a2e172467dd3bc12ac6eed16c43310d", - "646bd0fe393a25229bee795c2f97110e5c4c1edd2e350fbb523bc1ca1bdff596", - "d2a82a09e78a6a0744a98a4a4bc4903bd2c51d0b8f5f19f412260a28735f285e", - "a6ecf6761c207271d7a620acf818acf7c1b24190cb6ed66dfc9bac64723dbf65", - "911e7ca37ab58daed4bb624edc673dc0d889a6a861c180092262580bcb33cf90", - "45b0809359360ee0645c327bd8fc5695f181592ebfd39c3a60960120b6622188", - "538c3447a2623c9218ee16ed5f6f842f8515ec0b4d91259b504191e3b0c5c266", - "9db75bc73a9be7988e071aa51bba39c0f5e24c385f729ce18d134ac2609c612e", - "1e59a4b9d156fd4eeb0402e99515e1b921869fa00a85d7c14aff0228f3e11ec6", - "d16eb3ebeca08feb85ad52113a3ff3b3bb4469e0b3dd3a057c31c744e4fdc23f", - "312e8d52d1a2b594869b87d43376f9f78828d62d1264f9a28d6c9c96df1a101e", - "8c63d8bd1bd07bec7df380f2e90a7491802a391be212f846e2b19bef4a0aa990", - "54d542cd168abd288f5ea239b4a36812357cb28d027b02a16e2cfb1fde594739", - "97c0f201f1e2b2717b908dd739d005c48591448c39adfa6f1a7f11d64758d364", - "d5c937b30bf465a7b0cc2f75a14515c361479197e4a0c1c1409e8262edd42045", - "c441f14b4e819b4c139ae7f3ee37fa3b452b9df47c6731d266c094f887437748", - "31d8e8e0c1be43bc5f0173626ab7976cbee6513d1d226f908f0b098fd8e809d6", - "970f271b6318c54b8686b653d94739293346383b198c3668f620db9fd892760d", - "bcbcf12eef6f4ca96167cbf6c63c2caf1d435e906381549dfb35a003ed12fd39", - "44d5d2909d26e4b5f6cfee463e36fcb91b858de9c105f96547e5a62f68ba10bd", - "db26b4cc4a2f2915fd03bc8f34e63ff2bdcf3026a765db16827c345a489f8a8d", - "400219a9b23069a1398fdb993e73ce20b0f638f644058d6f91e3233b17dbb37f", - "a76b6f8893ce551687b6882f0624b5dc7cfa9291ff840d96e97b988d152e4a89", - "3aab84e4feed15d8bd95fdb80d9d37338218a83ad01eec820a0ac97c382b8025", - "5a811754aa1b957c31181b553a43492f2e9aea5278e28781c9d13b524cf57a1a", - "88a1b344967a1c2c26ed42abe07cb88351a5792c14200a00e1465d255b1a2d5d", - "2e9c1f76457a2637d5aaaa4e5dc39d0782c0c9274a455b033f7b69de48a95a4b", - "1b0e9a58a3a620b10166974ec636b661b00e2655da9017d7a65295413714d9ed", - "c15bd11ecb254f64e01dcc07e586db3e75846acfc48ec9cad4e1d7174aa12933", - "8fdcdecad92131ea86138db4574ea3cc250c785ed923f41aa72f8d9b176ebb07", - "41d1e1e77fd7ebbe88dd18618a0a338f1ac320c2693e3a3ec5db9ae554a99426", - "2c40d6e1aaf566c7ee8ae7c8ce6e2ddd0c0ce107618c2ee83ca192eb325fff0d", - "2d78210b129e57eb57cda882d1b8c1da26e42cb5d8dde8e939f99bb918f66c05", - "8025e01dd927a4e35578d0c0d046c2d7bf95707899aa6936810e50377fe2aabe", - "78d89c351afbd16147dca518d7cb99dca2dce12f46cc876d941fab5747bafa51", - "19c3b0c8b9d804308ebb14aeb703d8b661e690c53d39d522c6de2ba4d0ea7ba3", - "bffb0761d5da96419837d243d9b446ab5c7f29c280db2d5e806cc0f8b05087f2", - "5904c0bdaa5a66286e8e8ca1bf2baff8287ce6be4a14ec58536775552706f711", - "0c8ae03b3b480f8f7efc8aeaa7ebc6eef300a758fc9643f3958af634b4e350d6", - "f206ecd3828a545e65d56122497f16894f4dbd3a1208729ab2431b084ae3251c", - "13243921fc174c392aeebff3e2e7f0f2545cde941da754c5eb85a8430a95eae5", - "0493e8646a9ba53f0f732f3f86b8ebd5b05946fc6fe82b699c56327de5018ea3", - "b9350b2343d13267290a00bf34a3e552f15ef0d808dc7dc084d901cb67f84291", - "5c3fa0533ebb73fa3e8b6482a4e3de7536c2747b9dc02b858d08ee3550cb1f77", - "88fc8c36cb113259a1fbaceee9fde2463a1f2134cba18c715139f2451f1bef02", - "e4db3fe47cc3f2676a0e0ed1d1899320d00628e1fcfc8d1ac2701acbb0f53ccf", - "7aea68859b70a31d239ab37e84bd4279b0e9d790536dee6c8670193bee6bc2a1", - "3e5262724da634cc333943c237dcc62a19359ec8da638c2931f950b4be54cb26", - "351acf90f6a63d875865fec00783dec76c37a8819adb8c080d1b1a925554dd27", - "f8639dfc1de91fe14014977b5cac27e0a0daffa512a0bd4d446d5bef0e632781", - "4333bd8d35e76da40a2f4657ada05781d544b6da3918037752cbcb82be918120", - "d4953a95dd984dd18f15a56da27b1c370d51fe63079496b5cc6b5abe2eb3507d", - "7b6c1c3c276ce003b2993c23647662fcc06c50113ea6683745c2e838defb7d8a", - "9585b816878984784306bded56623e6b556f1ab73ff4b7c37a8b26698d78f838", - "f8137d57a373e0245b239aca1765f0e3418b1a4e6b362532cf6a2d030526b721", - "8dc6f70d88ad7a1bc90e852c57940292afdc9ecd110a08ac25a82ed4034edce0", - "f0eda9b03976882017297c62dcbfecd17f3f310b86a4fafa928a6b146a5ab1e5", - "f455ec67dc1f8bb847af9a6366eafc5297a36095345a70e72c251fa5d4567157", - "379ba82222ea478bf9592b2e211475ad7848d53749109f9abd8be9fda0fd90c5", - "b5be3d208142bbdbaa87c10729649c6d8bfcd914385771ddcedc61b35a2d5f97", - "a1efb41044099eb582e3184161f15601b96e0dad42dfc215bfc8e6d98da2cf98", - "496f67e17af0f196a485fd27bb4d2cb8bb8388d4e42ad917583df66a097f8eef", - "91052b0dc79840c474ab01afbfc6338ace7791c42dd1d668eb01bec20b2b8aaf", - "9ba96f2f5d441081de5a16f1f4fdf8f02cac6eb8f4668d7bdfda0102d2a45ec0", - "01f5edca06026475a807ecc2cfc58301a611a53e9cfa1a015a539935c225c106", - "d79295a07ec6db6c0fa62648559f6f57a8b108c7958f7d2cb070fe1e231857e3", - "70944ae23ab3cdef9814f4462f59372bd194c52b933888330d30fd0982974399", - "c6279758805ecfbc0e47c4f46d8c8cd23c0baf840abbc8f3f7bf4b714568e39b", - "6814f893034772aa81799b009c26abe66112d610dba68535d007cec360b610d3", - "c35f6b4a3a54f16eca817e15f39f2842ee11594b1a2babf1f6b92a163f3fd41e", - "83170fcfdce7786c7ba661a6fd82ee9d203e0444b940d4c045ed74fe42daaf07", - "1ea95e1ea29003cb760f039cd75fea4b6745938412410e7a24450dd51601c0d9", - "87d44600a0364d5297b342fe6338edf48e734e48674100f5eaa6fe8d148cdc0f", - "03ab99108127df96c2d5e512c248446416e3a8c844c0980f32c570088468c829", - "865456006a28a48e4b18c210ea728afde4226ac09e4ec729c4830c66c2599f50", - "b9b7c4fb05bbdffa04158dc44ee07cce1307f9d39a9fc05a9299dbaf4a08d04c", - "b4a13792380157dfeb25b61271cbb6ec03a0b1e2e4dfe170efa15f12a8e216d0", - "d0fca1fc187715304c3b25c861394954aacbc15df800b431f6b103222701454f", - "ecfa6d04b0fe9c5cf0af7016ae5e925888d483cc38437366e2bd6ff47dbe5a17", - "1cd504263c1e54cc89864535c91ae513d41b1fe773c589b378630656811e2057", - "ddb9cde9917116726352ce752144abe7557f4ebce52293bee52e7e45cdbb695d", - "ac4db41de6325b60fc7a1ffc756486a82852c861a51407b006d5a3ba5f364897", - "1d260b1dc488d096ecce4081cf67e6f6629c49e34f155175b6b7bb8ac19cb39f", - "7c2713800b4ffb9171e2964ffa4a005ef8244ae41fe0929c4b4ff4e7a153d02e", - "0c01e532c36a42320bcdd146ff00304976e4d9afe6a68ebc095557584fd50b0c", - "cf48c9d3394ee286fd09ac48e0a8d2280f8157c7a16a13a335d3d5ed3cc58247", - "247e506d5bc0fecc79925d84cb1564f12ed2cbf58bdcae22f848424dc1b3b956", - "ed593e16b9cdbc23661b21cfdd4955f6f00a1a1b7be2b5900e4a27703b766610", - "708ed9baf48e055ef0c0403c45ad2864b7c5292b65259f19bde1d2cb0fc7202c", - "21d6b8fb1b4f5972a069ab41f109f530cd36dd2a31dafa4ccf920623e8d065c9", - "067e4911055807a139dea17fe16d4492accd20508703a478cbef2b010ffc3984", - "b11a3272659b07660697f0023f21fa08bab49af6fc51ad3dd25db65d79fb8cfc", - "da2b905a3001f3f303aa2386450c03493915c368cf5ee33ce7651840e88c905f", - "3d356fd3ced8f64490a6778b56be6a811eb7670804b1be1d682b96a3671fc85e", - "a32b7f91c6b276294f337280387126cbaf0106b663aaad77f72ae825a783033c", - "b783158b137451b8bdddeb70cd4ccd8382cc888609e3fa28c54f010892be0eb1", - "ad61cc43fdc760e756e3df31201185c62bec912b827448ab67eec43dbced8a07", - "760ea84783cf5edabda9e9ad053b16a48530dff46059b394a52aee36b3710428", - "5e2718a4906f9a05f301e6301483e9946fd087f67bcebef2e7e7ec599ac4407b", - "4479803c7e6d712633612220815461548884237eb82b8730aadb383a17835633", - "3e9254f89ef7b59b8221ea1af74653a4f54d4ee113aaf76474381ff75fc5c5bd", - "693ad1b56256da17e67eb27efc9c911fc94d4a65e5e51fde85925e8004c8764f", - "7fffa08f52d014ea7f92af1284efc01987499c6442a322af6943dfb6185f30cf", - "0ead3625c68ab286225fc29bb54b0d2dd2b3d7085ba65bf0b8bc1e0ab3ac9d79", - "bf15e2ab635580c0ca7561e44eb0d453a628a51a0fbd68e1693d9ce51f196d7d", - "5fa6466593681dd1ddb70a30fecadaa5c83599f89b65c976a6d2640b495766e7", - "7fd379d3d86ecc5ecc1e4256fbed172e8eba83514a0d6b54ba5f03a49b1deedf", - "9a766043bab7a41a3db5b7d4dd2e7719977fe90da2ec64ec11fa1647d114fcc1", - "7e295c866c53cbb1e16efb1bcbc00ec68508a05044146ca45556e704c5317c93", - "ca081f96c1297f915564668d38cca7010276c3d52a4eb20781d0bd876cf08e33", - "b38889d1769f58ce2b3cd5d0cc7b411c1764bb96a099e5bdff4f1631a2d51dc7", - "dd5697fd7a45fa9868e3878289358f8fed87d791a0ee1a18262b155eb60b6281", - "0629e4690d67881c505b2edb11f4d076141832e3bdf89ea1762d22209e154429", - "6422f78c50af1a369f280468467b64282f76a2c972f54552e5ba48d02c7543b7", - "05c81be428cf0f14f845b48195da15728d19cfe034b9edbab64b9aa2903e89c7", - "997b4f461f52664a6abc1d9c26d25cef093c523774729a025326aac0cbb5c556", - "ee9bee7907ca8d0ca86063b95272f0f967951f223dbc49148f2e767ec25a9343", - "0ef3c8559e9501c22a808daf6c293a18c2b82f2abdc693c1afef8e85d14888bf", - "a81c9f831bc70ece99050b1914a4700eee406cb53ed11cb5ebd1dbb2ed3e79f2", - "12f34560520793f3435a57af7a45bfd1a4feff349ce00c2b026e89dc5e57c366", - "b427cdf837c98cd9b391547c0cf4bea9ac2badaf807e67362f7f5ee2a34ea592", - "c573fbeea877da393dc63e9a2866b8198db3e6f3cabb0b438535a3347928ff1b", - "edae46e0fd505f0dbe969ed3652369a302e60bbdf93de07281bdefbc09ec0002", - "a77df8e6cbec243bb5c7847be34ee89f17b1fc910444c18de00f0f89471e2588", - "ff8a4c54ccfd2180781aa9b7bbdf3485b05196c3aa96c6e1db2e0d742ef8d77e", - "642dae0125f47ad2c36dd8ee8c9675b22925f18b2b999da12848392a9c98b616", - "f76e28c9fc3a4640db366b9fac9782cd6788ece1efafb9d25fb9401b2a9248de", - "b5202476e7257e0822b9b30ebf3ee0a85217e33240b72b89195f4ac441c16170", - "8a86f3f14b4fb6c62a514c9067769d05988e39587277fd21e8a0181c44332b4f", - "c34a5fe4f015e640ed2faecc137f04a15b669f3338bd11dc5485ad1f6b41a771", - "898b06b6c988f3bf47ecb3c4afdf814d92455a8c3e0dc56f5910ed50222132b5", - "93aa26389b8ef3313ce34d6326f8d6f61e389aa0520f92ca59a4f4b0813a0928", - "ee961a2f1337bbc2363fb5417cbc06f992872bcd21132b99bbc03577d892e36d", - "e268778a679c1530d92c031993d31e1cc972d32870af9b25b2d865d9aeb2b716", - "52dba0fef88e269dac40df9af2e00300db6af3a4c4b1c55d228b4a582ed4322e", - "c10f49b15bc5095af23bba7d700f2c26cca98230f9ce36ffb56e87b9a47d1aa5", - "3d2a043ed4d04752aad0b2e28c6a2a0d071318ccf063e528c55fb227adc038a6", - "aa77ea4172ee6746e6dd458af27ea7d52a2b7952b71bac5a07be691a34a5d628", - "7aeb24051b0d7c4c5af45bc17367092517d0f857c389b3d1763645f004d701c7", - "05a7da62ee91861390303b0f14f78aceb37c76cc0e24395cb7fcb17a8402e88f", - "a366c0a5109a4cfb4abc4b0ca48168ea483515eed6ffe1895f9e7dc608e36ae7", - "79c6d881d6169bd6f29808abbb565318bf96d47970b6e576b36e2f89b76110da", - "e5838dd6daabd38ee573ededd32991ced6b2c530e9325774767ae25cd93f5d5c", - "34530e767d6b3ee54ce5a00eff3214c7f280a01e133747dfeb800f0624f632fd", - "b0da7d79fc452989616512b2366d5808e9f4982b661561c12fd8a93151ff7b96", - "035836edbb730c192a0ce2b0bbca714183d3b0932c82f358f5d3b69eddb68488", - "f7749a78204c89804e086eb84f28dc574ee510c0071d0e5189081da439c2a7ab", - "c9f4bda3febb96df4518e635e89d415f65107370b303205739dd44350712b84b", - "40eae6aede09792283dde033a80f454f761584fae796e4ed6c8cb5189a82a7c3", - "44e6923dfa8cf4edf346f807e84e993e5b22cf2b282fbef7b1d00daa4b946eab", - "d510c58b1768a922a6670230bb95a81846f38cb90fe1a507d23ae5275a597f8a", - "5369c90037afa4cabfa8c70d961d44460e10f3c037c833b24dc01fbeb843ab10", - "19db529336f1d172f51b6ca78f0d9b72d593f95c1180e6fe27d8ed120c2d3d9e", - "96b79748a9328ed8afe22afdb47fca8f6e3e209d95addc53a1ce23f187ae15fc", - "f53654d741d0413e04f3f7fb4d82438367bc14856c25743923386d437cde3f23", - "26b14c00edcfaf3485853e81c0239b7eeedc71487d48cfca849645ac2892c28f", - "b097adfb6cb32af718afdacfb752a05e39763f45d2e803bc9b5a24a6b4e7c5d9", - "608806544f4f47731503751a6397039690cd63609137b25bf708235ecf6946b0", - "bb1fe8ad789ebd2ccac5408081f98ffa465540d4a5a2ef11daec40e85728a66e", - "931a73d3c4b2f08f899d14737761d358350432537096a6eaac74c2e7098643e8", - "807278f969a8508cc658077ba3732b4ed6be20214686f15b37040907ac30c2cc", - "81f42ab601d185f76e7823d285c272da9a3d7bbc4a969c9c33fd96e341f0698d", - "ed2ea5d5c22988c175a06f933137dde8b9cb2989b7c4ae4d0e3a42c8bf51419a", - "b7e6f62062da99690424f9788500ddae27ee48afb37546ddeaab1d514dd744d6", - "46f3a9ba04468753a88686a6af35082ab2c2bbef2593e6f32cef106521271bea", - "cdf84eda4a9359d378e6cfa5263a348c8cc5b0bb246f6f7980e584b76972da33", - "0992cd0dbbab05fb4a4143ec8f769306938f41f07c9400d42c0865bc5a1fba01", - "a09774fa7468853082e9b9147c00b5d8ae7aaeca85cc9ee3341d6b254d1f7ba1", - "38d69a419531cef47aa9a80e5ebd35c7729e915a1bd1cbfc45690668027dabc4", - "5632b44d78f53ea0cf80b4f613ad5e76a5ee738b2ac799043fae3d955e9afc56", - "9d4e3bbb8911def416e9a15cb20990c7195e86ed75e082954c9334c58e3c0537", - "48034507ab16cc01e7ec08df094d0bbcf1668d8d5719e77a556c5f752f589763", - "4b28b2fa2e88ecabdb76f09bb086737407aefabfe4c55a68ab0e743ed2f7d14a", - "91b6f2cc83e1565e633fe3a2ee5f41361ce031ba87565ecf007c8f04ec2007e6", - "8f3750bbb90a5949cbd890ec4e17cb17ece19068489077a54a6e117f5523307e", - "617fab6eb0ba400419a74dcefc6f13fd1ae2d1fe62fdb47adc51595a193c79b3", - "f87f2b1c37d13af0077faaf0fe420fb8e99d6359485ab2e96c64e4cfbb4a3d85", - "07b9ec27380320f7d1a31118e52f865d3ebbc96bc05b67bf09b3a04651eef7ae", - "c8d51ce68f083cb6bfffaa7d984ca033bdf7e1a1e8e3e72485d82bd1edab427a", - "910dce4c432ae8253a00af76683a30e6132784bb031f51e2315e2d3b77b681ec", - "3a8ae54816b80cff50370c6601ce6a79a4025bd5ba31493dfb9c384bbd65fb70", - "1784d8b87960e3267e0f535e46888e17d3aaa10028aae9c5677717ced764c705", - "f31447b6026381bac3958c94f3302818ba8376d09ccedb6fb7e1cc133dbafddd", - "cbca9edeb04c1baf01c5857e63e2ed1e37e0924ee4b21173c705f338122312cf", - "aa85a33be2c0b19bb5116b55d330444f9d1b45d6a6c791d05657c3d0db53d169", - "6ef42c8c2dc158c16edc2d56d34af4cfdc0c4d6b73b03897542f10f16979f630", - "9ff17e87cf9b2ac4bf3af616949738d51e4c50cb76a1928110d3adbe5b049b58", - "1a6cdd1380790378968b53e0caf4ea5c865cfd5f4c5344524c0892917cf5a7db", - "9b23a265fddcb03669c4b79cb3f5923ee9524b3a554291276c883270c94d79e8", - "144c2062429536d60584f340fde41b35cafa8e5d1d19cb457d43763b3472e9c8", - "adc71f0f12dcd375f766cc97f42cefcf4b71ad3a2ef79e4d6f37e4a61f4c8045", - "f038d8f629b2f1866f4605522da14d131a676c94b1a11ee4755b803eda71e833", - "d7969903e184ef2ce0809c83c71534f65e4c1b91b73637e4acf6beebc84e3c2b", - "f966cf11fb646d854a64b77c0a0e4b07a9a01e2284976a2b1ab12ec95daf9292", - "ef648b85beac2cfbafabd9a2bf4e04f0bb186f28c9be9a836a7177d9fe08b870", - "c1b7e13366525e7ea9d4d79749dda2caa07614b29dcd406d8a3d198735749a72", - "d2c67b7501e4cdadf7fd9a89547749539e839adbca8960661da558687908509f", - "6b4042790bbd6529385768da4a9412be2b5e67426d0f67e8df23fd7f26375a34", - "6c565a87425c8927975209e43b0ff4fbfa3b1206c8ae7ac78217139659568806", - "f95d2e71b9735030d229fb7ee79c0fc08f62dcc29a356024f2e54610f8263abb", - "2c6221b2d363801c20e0edbb58a59072b72d6327196907a9ec9158632d829bfc", - "8d198d2fc0294e8849ea5a6089c9b5fec00b31fae418e78d0a410b8fd3c4fd8c", - "e1ac0e0c44514898b23fb47fd636d938cbccf9ee0c6be41f664af07a0760e2ed", - "3e33fb099753faf1e414eddec28fa0125ef2b4198682e30695ca7793f0011e72", - "e81adbed495f2cdd385c9c7143083946c6777a70aabab02578c85f8882585274", - "fcddca2403fecdfbdd9f72a1140a5e2bd4fb75f1d1d76fb6ff15897163ba953b", - "aaa7e3872a29e89baaff039d934ad0ceb1097c2d1979a661257c9a22ae6e2d81", - "e8afc26c008a2f24c411370bc6f4261450e5946027a812d7f4e30e91a7180578", - "c2d005020499ddeabd548da27de31aa2ee04683a6fe6c4cb587d6890082068f3", - "81df3736960c6d2fc4cc106940744332297356fab9eebb9164b5c415ec756fe4", - "b6e6310cff00bb8b5d62e2131735943ddedfdb933bb3588fe7e2fe79f8c78f7b", - "e36bac2359c9453f101cf68fe16ff4eb72be9c9da9145603e7f20412bd221bda", - "a54804d0a25007cf119662beb2b6d30b8ba04a898128d28a256c2ece201a190b", - "fdc9aeee05567023c90ab91633e8d59e81be8ae6b636616709f5a472be1ba6ec", - "7135e2f92f5876f10fb0067be9a85d8dc374abd04969ffa36ee62a8575a6c9b5", - "fc7b769cf79f6ee08d49f80693e3d874552190cabe95686984d8c323fa5f4adf", - "ebff3e58b2b285de72dc28c9b57359534ba414d51d4e6f8f9c94df71e5bfebe3", - "50232f3fbfd8c2798f214bc0bf4dfa5897bcc690ce0d8264d93baa822a0037ea", - "e87328280982c5a2d6a74dcd89a31603d60970012e5652a9d97988dd1631faa7", - "a7a1aff3e2ac89333e4d2cc2bd07362d8ab122b1196e2b81165cf79e3885415d", - "980036b1c82c7614ef766bdafa420ea480f1ac1e2884e9478476478b921eee6e", - "70596d548125796e383e9693f402bdd98cef17a8e2e67116e9da894c19f0b44c", - "861406a9bef809be0861101ab05ad50d96885daa1e0f3e61ee423f89b97e8cff", - "f93ce2ee955788baad453fe119e2aee36313807044d21299d141a28bc15a4c4b", - "e13c4a9873da0cd416586a803630bb55dd7dc11c115401ff4506cc50264b6d1e", - "0b6d7e3b72950cac5812e79759fbb0d0261042ab06f472bdca37665612999771", - "65a009b1bbc7163fa3801c6a843090a7d7154a5182671513110ac091ed86a779", - "c10fab140d53e4f1e01d5e61fc0f0c40fde85d25e39cebc45728b5e083dd2dd1", - "c8299a59591fe7efa44eed7b2b3eb645b8226b3d9da59e10aa0f605f2e16953e", - "3622beac9db1eab4b1ad65bc923c05f66680236c4b5c12ef035f554b42d354f4", - "63696a28eca3528e3e38c696fa0d792e74cf8cff2c2644e3d7c3ed9a35e0e68e", - "e24c3a1d0712f1b0d74e5fb7e02c812a83f63f67adef364f2166e6fa79fc08ad", - "38a30a18342b068ccb4d9d0a178959f7a6f1d646ee862c136bbb643335b8c0a4", - "f26cf713fff30e8b2a2c8ff2474d5aafe99bd22338e479c6426248c2547fb571", - "36a8d8184bf51316a6542802eb23d406d13556a56cf68a4ab6f8ac4d105e0146", - "06eaa808087a9690bf0b471a054a1b0083ed73326b6638bcbda2df5e12b848e7", - "f2dd0ab0049d56a3994d2df533f96ee787453b4fc50ac89a554c4f4ea3c6689c", - "eddbb8acef38658ad8b5bfeae02338602639b4c165462173ac824641181c900d", - "d751abe855a41e88d12107e1eae96bbf1e3b1975907ef8470f403a7c68489676", - "e4f265f2552f14a7b60cb7f63d549b81006ead67175fd397f9b769f63489f34c", - "4c3a975f662931306c06f6c830da979f5be27f03839d16489c53f295ea52aa32", - "4c26acceb4d673721005c8cdd6a4440193e88c34f9735b80aee2a33434784cf7", - "0796be8f846937359dbd958eb86692945e40cf130cfa78f5b6e82a117eb33bd6", - "1c778adff4f7312cbba8eb991ce3d75cf5601c6c0d9686df060c20842ee63d79", - "bccb5ecdec8c216937f901cfeb4d706372792beebdd43ef242cb607ee35782be", - "9da4976abd8bae8587e3f456cf9e98681df959c1ea0796bd9a9f103605459e26", - "f1bbcd8ebf4716b9b0fd081b61c99f02c159334267c454478102821a57b77887", - "8ce7bfb299f1daef1e3507c482007f608ed8ed54f67633697ae80edb0446ffa4", - "71639a099f03e1434b5d8be8eae213e9652b66ee0a2e2ff225c0c14f3ec0ea22", - "75dd6949c83ec2dca39ffb7d6c2e2ffb44c1ee86791235ec992a3e60712f88d6", - "6571cadeb2d36639998841bb99580d92b62effe5d2eab99503be0a48a2d4c8c7", - "ad096b7cedc8371908f67c5f80ad8ae92fd9731d4a2c80f0c4a5a289f93ca1aa", - "e53acee928931c8767ab064771c85168138b91ab42beec9aa2384c949c9c1127", - "1f426a8d196c7bb2a26d4f55d222a2faeaa0fc1a174f0c8949b79888bbd5efa0", - "b8cbd56fb427945c9eff4dcc9aee245fd35261e42cde688078f82f1daaf59658", - "763ce4b821734652ce7b32f9efca6e888800536d1b1c9543ad4187eaa6673613", - "9234caa1b4bd6d48943ce01e9c91f1077a3947f2bce0cc7f53b7ae73ad5be33c", - "8162ed8575982830aac79e1be48b652787cf93bae3dff975e03781731207c00a", - "a5facd34e92fdfe80cfb5e60bd29cfb9b76bdfe37c22ad2ce326016f9969de58", - "dde69fe74589f6fc81491e6ad40bbf410e6df2dc159f6b3b334327a76144690f", - "81d0a14f47449b0c1cee9d2538e0a8e0d7f190ad2b799783c070e8efcab5ec38", - "5e11aa6878833cda329ec7b175a31391c87b7d84932508e40b935dd873bb506d", - "6021f90bf326c557a8774bc90a1290604dc0b929dd55ec43a7a9fc653474a4bc", - "b1fd6a105b7cea13f4c52da38d50e6be858f0bf5261394a55b29244df63290d6", - "1c1c491158b8e82586c02f6a1144f895820a762c53cf5705b8620d3d4469786f", - "f386c9d814ade34489ed033934267c9f3f513fcb51cb96f620d16030d87136bc", - "cfbefffc45151df06d90333b036fbb487bcf0f1f4635093ea57b9293a8f080c5", - "8f044e64686e0a21f801e8c7f668bd990fc38de60f77470d847acec09feb3689", - "742ee6bb8e8783a7132bcc83f67c2392f7d1098edb33072913a042c7ecbc6b88", - "c679403b199ed1ce45ac17e1f29b23f7c3e83cec0b6ca754d5528cb01bd3fc34", - "b14dbbef51362c317b8d3a8c5be356c8c6c534fb16900fd258cdaaec88fd661f", - "05eb5af572d0062d7f16f8589ed2d2bafd1792491c3b7e10071b77c97e3e192a", - "93fe91a01b37c5e5db2f087d675604c8ecd00375a37f1d24d55d815fd0df22e5", - "ae9f09f8a39bc4e223cab1b43e3178a6ccdf63d83fa1bc8ecf5e0376fd0b4adb", - "64c248fa5ee0b018a025c63d2a735dce3f22166027f198d153a0abcbaf63f446", - "4af45cd93f38c7d808b0e978c462888038b6186aa827da28c5e0f0e067320acc", - "f092d26be41af18aaef32378f3251976a5ca5aa0d7e7d6f30a68c4c7fee80cf9", - "3cb1aa961b27b20da8d5b5e81fb38dc690879a40fda8c0c2e30e9cd1c32096fa", - "2c88678e1337c2b0540b38cff0a7b77ebcdda0a468e74088b847971799c8b16d", - "02a731711f54da50639b351e1bea9101cdf4b760e966b2f9c6376980e25280ce", - "f7265561f10720d3609be07bb8511f320d4b3e98fb9f4fb0c7b82278204a9dae", - "6ca5fef77cfd8f6c5e73c6c325f175bc29166803266fef57d8646d54e69c676e", - "c5c8309ec3ba758d8223696a63de28ddc19264e7f78de665253ca947d65e7c4e", - "ff9f6e719c877969a6014301fe4ac5d14746227180a12c55b04a0d422f4ef916", - "83b04b0e340572229958b1b8ae3a2f7d05acfd55502d7cecaa78556453d03b46", - "f83adcd73058ac7165d8da810b47f1b9d32bb694f85cf87d037ac1b613adbc8e", - "b4dbe0f6e9e55b2c550a468ae40a3c557b46c4cac643d6713371bfd7b115ab45", - "9508540db8302ef46f8b48d648f617cd9a26c55ed291fbc5cbad088c431b0ce0", - "6b1936041e03aec4a891c2e58722421341dcf110007b69eaff420c3163ad8aff", - "dc191cbef1a5abe92b0852417c2366f9bf0314d3e97d62e8b59df53745bd2548", - "f75e662e295beb34a5a8a8ecd1ae52a522de378aba81bef813519408c673837d", - "8a326c21cd209f85b2d76ab72b26c26bd7c8cc793190416823d6ffce2ed2742f", - "57a1ea5a22c9e787be70f30b5cab072f4d4df86155c82fd8d2303824ff9ffb00", - "1ee55244d8093f1542110fa84bf155e56dfe1de8f9af88b111fbe4aae528f2c4", - "8f9ba5ee150ebb34acd30b3d054d3a68c1cc538ed9f7e9ed00957c4a5d28f3d0", - "afb285eefe50ca97d953ab613aca24341fe6cbf9a890889a0f47c08e4e194f48", - "2e41b8bc30416a2956e76be23cc45decbbf6e066da76985e54ea4d45d19f5d53", - "4037ed95440cb5beb86ca2f84eaac5eae1e5f6344014c34f7eab72fa03f7957e", - "b9eae2062b39ccd760a80bafdd4f663529625faada3f93a6182227535c9ba2b1", - "0c55a49f1c5668212c8ce3b9a6a1129022e89636aae0f2c1e106837c286f8fad", - "38871f64adaabb6231c530999fec020a7745ab3b632c7f9374747b0c7d694208", - "bcf40abf997de5dd81c5f2909bf359f3fb830f80377efde8f62f44d19fd452b6", - "a023fca7fc02194d0c78401876a505a199e25ad928322893521ef49cebe1062f", - "56f72673c58e2838c0dc15508330ceabc777cde25c42d607ca14799d6ec06074", - "d521ef2bfc4cc22a6888ccc3ea1bf962d0bb853919d2995aa595cf2525c17cd8", - "47841a1e22b06c1173166fc4d230cf21d285144b97701110d9e78ab36687a69b", - "d910ba4c05b25552ffd3be61baa9dd253cc27e1874b6f80d2e82da886ab43256", - "d292ae37d2312c45d72fe7e88ec77c88c8739269f483595b701131232c56b412", - "90490cce165bda1db0a5593a825dc90930c49427059459e70e6585aa55169829", - "e54b1d6eaf8a65ff19a84d4887bb5428874215a511f469e10b95c41df9f8b7fc", - "8db3db24917328e5b2f0e8bd7347c3cd34a789279d7db2f29eff70aab4c3e44d", - "29f78d475b1a6cdc16532cd679f7101cd867940108ee6ee21ebf7b08ada7a6ce", - "a3f6a8267af8fcfd82dd370b5640d10af90b879320a0d8b552e04dac2b9ccf1e", - "5da8ce6360393c16ccd3b56634a1367eafa5166739591d564f612f8c9138cf8c", - "04eaa9786daa96f375f2ce0708a8c0f38d8b6ff46f6be354028d0a4d8341c1e4", - "c2e48b0d3ce65df04be564336df8d895fb3f0abaa49597b5c2582453949a24d6", - "d1b26b7c98bc774443f18edc18c1255013ea4835879b055370ce82cb1fe6e96b", - "594b837280e6ed312c7b8df7b99cf804ebbc3c10ba380296ad1a84161711ca87", - "05a8ed449994032c0a6621698a55976632b2bf5f8323ccf0eafa00cb55e86911", - "acb1d933d53bc09def327099739abd76119db2cd93e78f8eaeb3166251e241f5", - "5ca49d19ef8a823e0c0cd86d578294d6d0d90528234f2979d23ec00915c65d2a", - "05f90387a32145c4e0d41bb04fefb0c83f9ae62a50980deb1eb7d006fab17db7", - "78d3ad8861bf3c39e3b5b5912a53fa1d89f72d12209829a478beabc264cf5097", - "9f5f3feaedc3ca8dd0a27815d4c9f6bf6d9cf9a6c2fa6b1b3fe231af2c4fa052", - "4c6a58525b86638849b7c1fb507ab485d918f53ff28fad1be2ec3cebd580c9cd", - "e8516b1ebd250b0c599dfb5d9c705566d17b2c0824034839d9bdda143b331bce", - "36a2d275b7e234ee61c9ef66def1e26485a9996f60cd32d4f9a4ccb3bebb4dd3", - "efedb52898ca9e3ed71d120d7320e89c01be1d3c780f8a5df29d183469a6a390", - "add52ab10d6677cfb6fe2aa0652c336407e9e09e9f648017bd4080ba7d2a3b20", - "c2122b71347c38c0ccef02cea98f8013022e6dbba7e7bd42cbe70bdd9707e3a6", - "e2ce18868813d1142ca301880ec83a728369f1368731e8ee500cc9ed995d2f45", - "a5f2b75071fc7c6a5921a55dc6fe74a904cc077abc59239a79628a0108752353", - "724a343feb88bdd2fede6e38dbd7dc2fdd4651b4a738c08d20d54fe1972ee030", - "a4fa0c1d086b696e3d25b2d57bb430dcc45292b0335a106ab326a9c3adef5c4d", - "7813cb261c5d7bb09f84f2bebad235d4c94d998fda59ed6449f6c6c198e022f3", - "dbe54e75578fbebc85109cd7da994b24f93c0038c1db778cf92658f8072c7a7b", - "99daf068862151a43928470751eb8b4508e7fa7c610e38bc07f975a42b439115", - "54c3c6c29d429faadb12b57f0526d988151487e747d6f5d9a0afdb817f10e8ea", - "36e4135495092f8b679d5a3659c03fa1ab276a5b0082179a152da0657fc33a9d", - "bb6ed77a183be59d8b010e19628b81b84d365cd49cdda573a84992ef39b42e38", - "bdc10db7e4009969e6624996c58f321c116b4be5edfc7c7ca53608e8276156fc", - "db62dc06c70dc76c1936f3e6fb1b617508a4d294bcd381f3c8956b1daf17c5d8", - "ff92210ec0b698bc25967c7aa81e5a2602d2a4e56fcaf5b5547026bb9bb016df", - "821c239142de4771d4217dafaa36b830f94ab9c7e01ab1e8e3bcabd319d204f0", - "4cb45f5fd63960d504e2c6069b68f30bb5f632254c77cf71e2d9f6301acfd6e9", - "a75e3b0d7c842697cbd73f55041ac18de0e8782fe9411064c90fd4a47cbc4baf", - "13787b680cabf9f3f23cee69c9888030b63b2ba8e0613ec76ec550c09b11e1bc", - "5b19470ceff9e69d374874c855af54bdb9747a37855a2958720230105bb9836b", - "979e5083225b760d54b59bd3f8b854bf4080b900a7fb7e4a220728bfa09357a3", - "184a2b54f1e21ca4c7cefa1834bb20b099fcefefe1bb3c34d22ac4bb378c7f7f", - "75802ea8bddeb175a55b523b6b301df5a5e7972ac9c2ebb738d7279f22a3cb3b", - "699cfbed60064e1c6a28261bdb6866a1af12f585540ae2b57b4b02bf1953cdc3", - "144b7e8db729f61808cbbb35669b49e3e91876605fc26285736ae3dfad75ecc8", - "ebec4087cb0b265330e128be2752bddb47a5532439366270763fa30213711be3", - "b21b06b95f4668a3aaf0a931adc7717b39efd18c85881a31acf9e32e466cd482", - "19ef891608b50a4f2adca3082d60470f390d7ce11c56d16c13db54018c0f4a72", - "f7ac437d44782c20150b506776219bda9be8c4c03f850ede7de9d7f13996036c", - "6bd61af82d1119c9e127fd3323ab678bf3c58429369cf0f161dcf6301347ce65", - "c7a70ffd49c880d2a5f2b6f73d3f0d7b2c8110467a6de34f2c9c5f480924b07d", - "49e95f244ed597dca5e1a9592f8ea0b50b7081861518999ca8be9cca465dc860", - "029f92a02d26aa5d9eaa7137d0b0c673b6c2dc034c17bede8a929bed4c1023c4", - "069116bfce53874295cb3205cee01dcab957ef90997a0b5b858f4f32ae0211ac", - "b5ef573002b10da2106b4979a7f6247d921fedc11dffee18c6a382e3abf768ac", - "7c097c0838de452e7c9226e7510107b682c683e71b4fbce4ed0be7727f855b2b", - "5abe86fe6b61770658047a876926ddf272d3593c2c47e1f25851570e99751c40", - "a289bb1e4811ba46cf84113ff588a5f3192dff502d80a4212c9bf995904970a5", - "72623cc51848b3724be9d2ee79b728596dd6908a86697395d0ec4f9a35fc0c3a", - "238cc5ed6ccc867f369138aea73e436ddca91deabb05e8e611149c9ec3b8943c", - "2486c40f581778accf1fd8fe0f69f2c46ee3c25487e744eb1469f995c2a468d2", - "a4946b03cdcc8e25df5e7f6e0c7976641dde03050d955b239066ac89ef01e5c6", - "a839dd1980008d650c49b29cf354ef6b65c868eb5d94b231052ae657b57fc189", - "0f88ba791d9657fe53f7e648dd931e581c1233d9d83e334f26e7b165fe8fc446", - "99eea1d6b80b7e08f6d587c5abcf307e6704aa740306761a0bdfda1e46eae67f", - "65d4580b2f69b29344038c1dc9d10a1e07c43595067816d9accde168477a7e86", - "463d373698a0aa37637a703a85be86698eee0d3fff0501bfd938a7f8f28d9ff8", - "7eb8641382a4fb02cc65f19c055348141cd1e2d9aeb6e7a470616c435b0c384b", - "3e875433caa1c81fa374b63e2544156d6588ef332f06095b4e405d63bab782f7", - "c0e1662c57dd9944589b005fc425ddcd72372b320b9d0b5b403849c130f94fc9", - "2359092206f90589d81384b9d3fa6d74a678db11d590e0cb361d49ab6573167e", - "bc61345d609942f93aa3602c28fdf4d66184b65e9386a3a64131e6410f352528", - "151f8b00ff02fabba4c9d797cca90c234cc1fe2089cfb6d1b04f49ebcb765984", - "ec480ee7d65a677fe8cf0571e18f25bb9f156a092fe989d021a1b0833841b5bd", - "4b2a0154a90c3e31b82f82ce3f8c774f5768f367ef2999a77931aa1e652afba9", - "f77d6d73e93b0d0b97dcca7a23f330e3681b18304113c135139b66aefde1503e", - "8c0dcb639cac83ed99d191a4256c5b2563fa96eb27c723c774be7ea4effc33d9", - "fddfebefa0e4dece47d0916eee38c37cdbd9f855c0144d9ec2d065a917fd1af5", - "d75ac6fd52e836b055fa09358e4b527257e04176a4f7d60b629ea335df6f87d2", - "23a9973ee99d8b22c7036412692c61944f7af6fce8aedad395079a2c347cf012", - "0207c7b3224c89a9811cd77916065fb74d7f4db2fec79edcdeff18ccdfb80d97", - "6db91c358f67853520fdf86a42219f18f2677aaf88e1b2ad3008c8865db570c9", - "01ece430d99c6b4f2adc364e88af5d97198aaf0f3faee1293d5cfe351d28f426", - "92541c05ad622907a2af9395e8fd511a1018930566ff80886d5229e7476634fb", - "ee057997711d15aa6894edc09786e049e31540dc7d911e1608f3e5096e6649e1", - "a8ac53d93bf8f18b1d4ce9a43fb28f1c231c5fc20f15aff63807fc889ae40a67", - "fa8074414fdf7548bccfff7f2e1fe05c28699e1c1ccbe23869016ea3a64b4116", - "31aaef0cad667611ce1f6ff00fd59b6585e761ddee977e11dde2fea7552088b3", - "43296ec66889a01c3d05f65bcb779331331d7c0f14aca4cf30cd1990642fe2d6", - "77a316c1791b234cdfdc8ab03c5eaeef7730500b8d05f78d9783a4ddfab08684", - "695848a2d4622958e4f7e0ec47124171dec6e632d14bd3417bc6580de5308075", - "61fc1127fd2ff83289a35577e7add58682586dbfeee772cc8c04c1c6a6ec0775", - "1818f41b0ece60cb18296555088e07ac8d9d86217cf181f3de4d9f242ded4efd", - "ea8ea47a2c12db66b0a0469a6a5f5a917f78b88a9c144650cae3201991154e7c", - "72ef229bc0b8ea37fd363f61289994fbac9d5b21ed295f7b1c2521b6e7408a78", - "9791c138582d219c2cc9c4361d847847443c2e01bc1120571e6772cf6092772a", - "2dbc07d294e6a397b86196708c58ca15da17690421327c73851d11218b6eb474", - "f4b01d1cbeb4c7a56f3a7fb327d16219d5bd7f8ff56d29f71ae6222426f4e1fb", - "26bf73afe6a6814f153b2bf35d5640fdd8731995dc30f086eba20aa90bf8dfd0", - "c8ffee5dbf6b630309346a3bebe686c544651ed02c9a8c59b1d43d473ac5e667", - "e3a0dd8e2891f0b66f775beeb2f2fe46ab5c76a2c0fe39e6fc8f0b80d2a0b9df", - "4501d4128df22fbbaf4265cd619ded65ac8429cd0b62f7b29f3c97c85dd12715", - "e2468fc1343e8373df453dd76c21547cbd11e39a0cff180644509f462967e95e", - "425b62526d0a05e8e981d428116050eba854b030ce7fadb1734d5068d62a3762", - "9fdedb4df3141340b100b6b87dae2b05e1b2eeceecc7bcea1105f151ae96554c", - "15a1f12bba5355d9a23fc27ab80575349d3f65f8715ed7895c6a7655b62a74a2", - "965bddf68a311760a9094b3da844a6974487d38b734efb763832a932a1954993", - "81348f12ba4ebb32c85b386d87d69fb85be3a6da201700ae60bad9227a8cdf8d", - "3d4089904d6c56170c6ff58cfcb8228b9d755bba880759436c643c8a4871bf51", - "2ce530d16056796b6e85156e6232f0cff55fb46a5cc71679a57b0e8d78c32dde", - "bb97808cb4506964c78135c84ac41be50206df11e4766cc3847110306034de9a", - "97601ae05d53fb7088ebe1e874ba8b390e7c8d2b11f168910bcea360affd9356", - "8ebfff3afce42b0da040f8ecf9c217746bcc10773834f67988e7456966563873", - "779e7c4f075dc89d2cc6cab38a1a95f6f8165ff20449f79e50a5f924ece47461", - "fe57adb53bf77d3dfec57bf542786cf2877d415ac7c5c97bea2c354dded2b90f", - "e3164141384ec457a2c42456d4998d42b02f48ccd5436555aad99ecb5d38f1e4", - "90f061ad9eab6a3f7aabba8b10f2c95b2e2a3316320e74c8eb014a186442c35a", - "c1910fe95f54cc4d253310f615f9bd9dac3b65912f168f130d36726f4346dd4b", - "0268e2fbefe169130b555b146f4f1cd915cbd3610b03049714dbc1455062cc43", - "edc16edf8012d71d70c3e4fd51482d6ccbc4cc38532462921367c74165742cdc", - "c8275b2c19d3d0ae2339f8b99714c87ea4f75f331a9a015513e4b35cff037902", - "e41a0215a03f9459c02d9d07be95910e575aea6ec1eea595e3c3d49ba423baf7", - "be1877668396b3d4b7a35370c3b3611a0161cde5b88c1b32f1dc770c6a84bb3c", - "8de395c79baf4260d8a12d3effcf53d32983b55b5c8d0fd19aabc03055e319d5", - "702e84da1750cfe9adcff069912ac74c357b585681525ffa25d3d2e7b5009c18", - "da0777485c62d23cc54cb1743b663fd4d3aea00dc8af08acdf019c04fefec08b", - "7910028fba32064c1a7b8299842570387b08a7bb887e702ca90e21eb9ec38af2", - "958a05c9de09b0ad147c2a6dd0f7b164ee932341b29278868e62655a265430b5", - "7e00b2b24de63816a1ef55925c8d33d25d2ff394eed82315a16d7ab0ff0f8e7a", - "9b0a44fe9e0f0b46d1886a32f56507bcc85def0a2e8bd9dcc39ad047ca2a0c10", - "976676ac9c1f68171ee64f89278aeb991962d26fb809e7946cc4f4e60a6ca0e8", - "32d1cd0ce335f1e97f034fd21afa7e0edcf237e728c9a5478c68106e258da35f", - "14b21196a82a15f4985c52dcb345f815ba80d195e414485a01c4acf8727f47c2", - "a670edb037aafa39e4d3be5b6553359eebd7d00fd27441f721556c9d83428bdb", - "f3c1a8a583949c04160c605495bb5df980cd563f1b27eebb83f6b1cf95d4e9b1", - "5b0b2f8e09761068ee188bb959fb2fde9068b66437654bc1a2a71a65ba855bda", - "2fefeab063fd3de29a94e82e3eac649054adcd370b3d08038cb1caf51a9846a0", - "b26b1f925cb6952aebbe53484299e63cd64487e9bed63be72bc94f5c39fb54a7", - "cf26a8ed5f3bb0b2d26902c2642bf570d68319daea5fc934030ad096e7649798", - "bfce929a76dbd0df87f92adeae7631730f9d8a6e12b438d41f204b0117609012", - "cd09edbf303692b6075035f9a56eff205c48289911c1fdbd379b06fbbf060be9", - "d303dd6777b26e08d37b92f6a1906f68eeb8498faaa1b2d06e409ee152e93d4e", - "47d6015f2cf50f2e83ddb9ebddca6b03b7dda2551012cb9b6c2b492219cf41e8", - "334fa592cecca9c8816cfc4320fe070fd63e1adc8ff0c91d794e076e30b6f97b", - "149ba3f176cb5f442e1d011236fb354cf707e32b96106b61346453eeab116019", - "60d04b58c64ec2e10dd3c20de4b7abe4b085ec44af50d1a7374994beb6f84d76", - "f37dfbf164d218f4104a5ddc7385f5708c6fc0a6e0c49e6e0a15c2440d4d0713", - "a39dc8ed0e495a05c61414bc692160ed45abf065cd0acf4aa2cb19ce81d03a14", - "aabd62d6887b5c2cd5924e92fc81e8bec1a777a6cd5f944bebbda75e3aab1488", - "381727cf269811cfb7ddfea40c2428cd587179e5f26167d4988e2a3c5be12cbe", - "a311e01e6ef01b61e0ff3973455076a48b89b50e009d1eb79500491bde198c7a", - "d5a6e34f7356a38a40dd78f64bbc4f884440ff6400432ac8929d0682c9a3b84c", - "31c960511186935dea4b99b4785848e05059f70d8abbaf64910830d0df9e29d5", - "41905d64a06f475b16f06cdb3508f76fffeabdedb604f477b0c9bd81f045c100", - "362eb017bbd508b9dd8b9c28891eef73beb800f91882bc787382048f68b35d57", - "3770451a89066d176618720c85aa46c7eb74743dfc4d10b5cf92bf567d5239ed", - "c2ef6577fb4d715de7d0f78d5a4e66853b54ff1721f034dcdb799260e17a2720", - "66d83ce6d5d43ee9596e5a551b98df007bc7529e79ad8b3dfb8e76e8ce5062d2", - "c786d2e40787b0c27cf56962173b41fdd1f13803a59408f07e3092c6597f0578", - "52dd62c1a523cfe3784a567f0dce2639894dfbdeab1ab087c4e4b7ccb65f8c05", - "53e91e7daee4b3c5304dc839b6fa4ae079c77a5bc3cb63142edd43f55fce4427", - "4f7c3617e6af2f0cb3a8864ec4660702fb05c015a879af16de0eece29123c92f", - "27f1668e3c13474887d809545caebca10240ecd5870a76e4556897f66c39f89f", - "ae66bec8281618edd35cc1bfbe73a98968f753a828bdf5dff3c5e17f82e16318", - "a48c08a71c57c1e5383a947e930ddfa486a88944b94bcd257a5db0114cf5ff7c", - "d96fdb2674eb5d22f0ce1fd2025521fd604ca7989b6a36c53d5122c900d91556", - "068ac7d59c1794eca9b8960fc3445899245beaf47ad02e272e561ea30cb81760", - "04700a14deb6767c467c3df988e62d0d448f81189267bd4654be1e5ea50b81f2", - "ab461ef06f019d1a1ca8f009f360e9292a66e32a9b7ec05c5c5bc6b864b888a6", - "752cb17274c284526820e416817aae4852465704f1bc8ac9676817a1a7f55446", - "8c882e2dd77a77a3cc7cbfb26218909f7da26afc062d8991b6a525ce72cd335b", - "73d0da9e4a16afdfd0276d69f93db70461cfb173e85eb9a5021c3e1c53331cd9", - "deb3af10cb44843daa71f381ebb4d17923ce774b18fc0f065d48ce25fc3565d8", - "93193ada9ab43d12d35ca1c0c62f7cc33a13221dbb5e035b651f169e67367124", - "bdaa493e10a8bd18a04b5cac139a8aca26fe2e5d83e77aff91ad575a2eb3986f", - "ec2a86cbf859cd139830d84e043f2e90ba515d24f164686ac4e4db401b148bf2", - "442221351302cf82e3093b3e1823e71a18190b78f64be1b257c2e4a46083e45b", - "6cecb475ae7ea444576ce7c851c8662421f30b39a4ab687cc6746e43c8c79e10", - "25edcfd86139b1914a90bc6ad06715e7840810af10196a7708fc952db9eb8c7a", - "547ee2ea172979927ea5cfd44d417f2c8303c8ba7b70d420dd20c0007f2ca7da", - "5bfc3b122720b3523fcfb41456359352c2fbadba7112cfc1ab1b7028d83f6472", - "4723bf2a9f4dad763df85b569311866720954fb2fd115694b64455c76674082d", - "10903932703bcedde2f28cb0f1d83d5f889dc7fb649ef5b537d97c54804d0181", - "4180523cad720d5886132117c1654bff24ea4d767901123a8f5aa0fb7f5ddd00", - "6d7bac13e84058d2c721e06b39ee6417d23e6a5d10b7fba88996654169b77600", - "05490fb65dbadf88c96677777bc7e353e4708595e197dc542e58f03e1a757dd6", - "9ae41e2944437d168b2010caed889a287844dc8de1c870a81c7395940167ad83", - "b27c2bbd9b5019b43110e052d1f0ebd296bcfb00fbc776f6aa4778a15adbb73a", - "6a9bbc93ba00a705c0dd4db3310fe72c6cb01a0401c00c98a907f0b734ade31e", - "44583b482aae085abd55c97918d9f05a190f6cac63b95ec543450ce3517c6047", - "3a0aadf9e55de6771d6a0c415bc122a785889a14399ca0e41e48be92412ca0ff", - "29241b6c5ffd465f316e9fae8e9e8cc5c2c4bad9039d63ba888446fcb965af3c", - "c69d3fcabbc93970702fa359eef222124a5dfd441cdc83e7891e9afd079fc56f", - "9569e9330ec1e8fa176988d24df1379c95b56e53eca8f6aa855c629765716c78", - "6d47f474d8545d291ec8bb4718f2dc8cd56ccf6f6602804ac67b3d567682655e", - "cd04d517ee233659ebe8634edeebb514a7f00460810a845c850bba2e04f0e48b", - "1f845e8378e0a1d80719a8d7966a4724b679ca16d47a8bc478914a5a2c3dbbbf", - "2c641e5372b54b7feaf1b4819716128e818dff13c9b2fcb5d235d1f5f8869202", - "3dfcf9d4f1d80bd2fcea45965522d1a113e9e73a7d42f82088b81b1783e5408f", - "7c3557ce0c9d000a365128cf3b6b0b00f3422942fa37826af82beaade9392e65", - "772fc176fb61962df1a465c5a199b86251cce72e1b8d12b26a8ced1319ecad7d", - "04ffdd02f13ced0099e3c212999c2cbd1873d8659771a4e3e96da9961577645d", - "c26f0f6eef68bc0bf35ccce5739ca8b038c2c7f86aa1906f0e7b0614904c955b", - "37fa3728ac49dd3a6e4c52b439e51f776b7e08fcd166867f974ab7180289dc9d", - "6990b5077d40002e2cca35f0ac65a58b28aeb19d916474adb7c8b58b6b3a19c5", - "2002d48a6af715b2e735f253a199670be24bd53a77e999c23a842a5feb30b5be", - "6c63fa606dbb54316ad5ec78b907898d5ec454959cb8a70b45ebf1a3a869fb11", - "44eb42a4be0d3b140a23ac0513e9bca6a038c63d00155293208fed2330e11d3c", - "b423d7325651f9f7883eaf34d956a89ce918e84eebdecdae26d550e1b81fd6d3", - "6358a72cf1aa4776ddcf4a4912c92540510698fcb7d1d4fb6cae33b60286c733", - "4d2afc52f1869e9b4df95871eeff897ae22d83c476a1d9e2f272e6df5a70f8eb", - "e72aceda9e25bc300e69b83d526fc7f496b5b045d37f6f351bc61b0c3eed3877", - "63138c1581708dc2f817cf411805cf8ad8f72b5746cc985d554d1b641016326a", - "7fa4b24de653f903ac8a993fee27c3916ec568885c9621844ec365358b2252a3", - "a5f26dd3b1298494aaf1ab235db0dc278ddd0b85c4b2d6bb995fdffc62c27a86", - "b78081a3eed83493d0a4dca7ddee7a33981c1c82f74e54540171aab7b17db03e", - "cdb9565d9d67ad5305f91db825a570ca94499ca7d47a51c656d4c02138729649", - "46377f8331a075c90dd5940c5bebe9e2f881a6a51e3ae95f4d4f0a681916e08c", - "370553677f4a332dbb1d5432576089ac1564cf89f2b5ca2b9b5f8e24aa2656c9", - "cecf4ce1c019e043eaaa0d57c64d556a01cc1a1c880ae0ae56ac92d82225a589", - "1d1185794c978d4d41876beb97359dae5ef2fb277d8820ea35de39d9a8bd86d4", - "e558e4a2d3431a5c05c082ce029ff7493541819d7e9cef8e51f11105a8591f77", - "43684ba96269cb5a2c902df92301bcaebadf3b2394c1a0e875c1afbfd38122ba", - "de37093bdeb0ff9035e62e707977d4a4d4db303a889bba19810fc410e143cc37", - "f4b1c2664dfe001493d1a50c8b6cc665baebf3c4277aa518b1f512a49673dbf6", - "1a9dd3597131b340895740319b58a4d7d9a25469d71577e924ed26a5c0afbc9e", - "8b816452d40883000a8a4a36cd14cdaa4c9330acf7c9801c575191ddf4b446cb", - "dc79a5a74e5289c537b5dc9405098c0bd040d2436d79b2dd201f3a652fe75c91", - "52c14bd59319cfb16e01cc46a858be5df9719781395a27618869892f2546ac8a", - "611603a946d8fa50b031f97072e52302e2b21ca025e84b1b19f8a60ec3640df4", - "30e312e7e3620314811f800f3dab90a15357485dc47ff224aa89fb2ecd5d8b32", - "99432cc948e03048ae3379488a2e1c0460d51c68c593506190608570883fc7e9", - "43d4b171dbb69682e653cad5e4be91016bda06f97d1577e3930f173bf3b014c5", - "5d43350fa2ca11c4bc517b6d1e02797993eb9531aaf345f928d991853e33451f", - "f59504e07f1ac45296eefaaae6d6f54c1152eed8e3914a6010e7ef935aae2913", - "c2afa532c368a3157ad66f950672904ad11073ca99c2ad229c3ba8d3322053fa", - "0e674b0d447cf0f69016f5f358db0845c6140212aa94555802c0cfdb1be4a04b", - "9a1f2d591adef3b85c570a87fa26359454cbc3bc932581002d06e38a0f0d91e4", - "fc0797b3ee2e87514f41956308a7bc5995d2f920d0f9900b21342cf61aa7eefc", - "b168743701ce4a8a66664314b2e060799c5eba652eb06b814efbdee63fb57f52", - "d52e0249c0d6853d1f945dffc59825a8c92f74233a14e48b329930cc98bb16fa", - "0a15ce5243710ea40cce811b4b822af7063dd7b204566975fe8e7c9ce7f8a16c", - "0fdd166bdbcb1aa1022e95891831cecb49a27a4a1e7eff01313e8b4b063fe02f", - "ba3d2362f32da7099e7160517c4ef460f2e89acdcbb1186b24ef2b0ccdf1c4e6", - "e4e1ccac6decf43a3f83fc310979dd95d5bd4e1ead523ba95be2123f41b172e3", - "b49d26fb9a60872f351e583e78c5d134d0fcb864f2633d290b98146ca5c6c4e4", - "8d5377a0e63092d47e49c654cd751c9b0e8119866514e7dd02e5b08fe1b17a0c", - "57f310a2b6ca5ee3d80f62b44e6eebf985587ff326be08e43aef5e989166fc7f", - "c1265d80667391b9abafaf05c201d7c463ee74824de81ccda23f610675888ef2", - "1e949a77aea225ab061618ccec35c749311cd4f7271a46364fe2c7cced83ba36", - "3eeef9849c34d8ccc55666f4a3ed5ce1528d0c56b5bd03062ecf29999b587f1c", - "69de29162fc08536ae01395e18a2df0a193ace6f14051367ef51cb1cc2d89cb4", - "1c7fd850e0bef04e88c2ca79708adbe430d632ce616494ed3800afce90e7d05c", - "ed971b0157a56fcdaf864f9497588264543d65e624b5ba0c21a566009ff283ef", - "761b83b937d53a601f8056d9f7340649a1d31c8ec1c85023ca14d7bb56646a9c", - "b5f17d383d95883f8f77700918ae4fd7d6f6a0d9156a324033ede94495a0179b", - "3409f3cebd4d48d0df416d029b4b2bc615604e38ab44bdcecee08b684581804f", - "0391c4921004c3d91ed8887d25fe826cf3e407820478b53be64792c370a59b0d", - "b2c387299d37583c3d136f0fd7589db3d8103969e54bc8684b7afe70552a44d0", - "b3715403d72a7880d2f3f1be55bfadf19ddd2d7d95a0e9ad813da657d7211800", - "173326a9488df8c8a7d6f2f88be4cd43897f7769efa44bdfb305207892263235", - "1bb86afa5376f8e4f5fca3a0919a9d8dd6e57b9d1ec5d0cfe78e7b84c36e34d6", - "fed5fb81b87f48720f0eb282a82f72cea99c10a866ad455d90131b9b9e48ec9b", - "20ea978b2b6fc5109834aa9415d39f1312e0a55509f405c744a7e9ee648beeeb", - "a81cbe721196e4a16bdc756ab0049dd7a1416ce81eca155d8f33f29a0900b254", - "890998b943eede48657cb13a1cc85aea8ddbefbdcef58386c225e23a143a306b", - "25dee6212f595f098ec26437d34b90d5bee49fe941b4fe32675743c33011add1", - "b8c00d893f9ef36aadcf8852b8018b3c4d3d05c5af4eccfd627498c633321330", - "fabb403b59106d626baf63aae77b08d5fd3e8456b82da4cc47f6c3c59b7b93b5", - "5313e18deefe1bc2d8bdb6dff3548fce78b8f3056d3aec176efcff0a0930328e", - "3ff1fe83a7cb3eeda88698486235314996a4e6bb2253f7ce231e0de8d8cf52e6", - "0c8106aabe120de98973903f0d8628af12325f041eb37e2dc05f32d080076309", - "64e61759cc0e2199e7c28a3129a5b61614f379dbdcc5bd933f26fd918ece4984", - "854250481ac4bd3dd32d377199b356112a48dcb058b2f50cb160418895ff9365", - "234b68021b9614a12832a8e85df3a0b67c6097614e6b605271a09ff46db2e332", - "cbddd8b9ceae13a04b14f457693fdbd25c4873ffd446fa1f46b30fb47192afbc", - "1c93e0c166f225ef33d4011d53589f748cd4f48d1c7fa416489eb116813d4f31", - "58acef6beedf9a7a32f5e88c21e49ece1ff632823ff85b18b3a5bb08e790ab24", - "647484e1b3ecb79dca20940e15a6aa90ac3708d63ae83ff5d0f88612c82c4d93", - "64a62d2c4a0b7610da7a3e80ded7eccbbdcaad4c985a95163bae07d84e4219ee", - "7ea6bbd2854ce5f0952c178c6679005c30efa52094be5b80f4be84f01519c144", - "9473e4a3e01bbfbe240f6bb3e47507d80f1edb6f90c72c3495576dbaa229ee90", - "a37cea8d181ce440008f258f508f64f96ee69ceb340934c009b86512f23cd015", - "dbbcb2748270594931a8442305f0b85c40265814ce4e3c8dae4b9d0033165432", - "3bb5fcecc7efb79185c5cf0015e6ead2fb6d738b7b183e0229b4c56f5dfc3770", - "d791806b38f642aaaebcf7cf86fa9fee20448775cdc55220a8a1d44a7d38406a", - "4a6166cedae0353f00beba4cac91241eabba897000631c0e5aa28e18c3bb154a", - "3665831fcffda2a308a847c5c17f0e715f28e5fab35d3bf003bb297c556d56cf", - "d637f37566d32792a9330ae903275986f2ce3b8d80c1908db49a83d385c6ebaf", - "2656a3d15d61b9abc49d68fd0983a12cdef6a4d49e88d41d1b94321b013ac30d", - "0eb35b007803923fa5700276fee287b936f487d44a0135a373e16ca1e0b4d19c", - "862483388efac8e5522769765ad5bbdc3c5c66ed5b88caed1f2205bb02029a92", - "84da7f7d3eb118c00e199611e6895be2eace69f79eeb68caa97ee8f0a74e9d43", - "ac673ee48eb281b3d9cfef57b5f541bda93b3b07c53c649b4d0b25957ca4e258", - "98c145978ce31e0d0b8b45b23d32320452d1a4a709e87ccb8fc673214e201716", - "2d90d55b6f9c772585e976693a7c3f9295c81049f71d81a0f5adafa7336d87e7", - "d809550aced85542f74afb67aa7e261d947cd6cce76d7e7dbf5066ecc0aab577", - "5543c0459c0f5a7f69304def07c8e1f63cb16becebbf3ad92d805ae5344e422e", - "18f8ca72abf8f0eed6d1ee530c69becc223b670d1eece43251ac09f615306638", - "76e592928c9823c3c87c6e9765e1a15b2ea3892d7cffb2ad47dd1fbd111ce8cd", - "6b9607b2b5cac75d82d2e5f2a434650d0de6bd805f7ca03adfa1ef0a71853945", - "c7a4c02b93e8289c8cd3d34d0000ce8be6c3f1327e8d158fada82cb261279664", - "13a3a713c9bf9c7b99d7300950a45ef46eae9af9588a92d8e09071dcaf9fddb0", - "74e0cee8214dcff336169bf75ce41d7786174fd9978208655c9d0abdf85b74e9", - "00216d7655393616975c393e74e8ecddf07858b5dbc0ff63e1a36885156f7f6e", - "89435198580a237fc9b161aa045c20c4bf6a61108aada69053b15bdfda102df4", - "81c9f9c9e76eed111bbf3dce7565e85b84c92aeb1ad745eb81b3a160ede4a371", - "ef46de68d016d1eaa76c8722411dbc6067ad17892fc406b0574c46dc31953dd7", - "4c87f905b341ec08aa681250c933b0ac3d4d24c0b6124252d2adfa176109a793", - "2843617bbfc4d9c841fbdbd97c0957675b204fc3c0f28c650dc8f5dad2c1939a", - "f038a086123a72a9e64f1eb9234a1b6f258e04a03eeef55105e06cfc3552bd32", - "252d0a55142f6104975f7ec7096a6519f678061e7d0782119b11dc8ee15ca03f", - "43b9521c20accfb8d2149518f0db71437f54c972552f4f1888f06206e9edb4b3", - "64f4c0d4d4603cf94a6ef5022d8214631bfbd942b2b218afcd5c9683d2bbce7b", - "51ea0d047786fa85a358eda8c321bb46c35bee11d6b4dfa585d87d912e67cae8", - "73dbcb3bc15e7312a26b9a2058b6b4198aa7d0f58dea55796009094a0186089a", - "874a7e793b1e73e23e6d7b127b9c3ac98c20b171ca730307cf01f27718fa707c", - "4556e6d765c6dd160339582bbaecb27c0e695125a20177f6df0fe1a75edbc9e1", - "1b5b8edf40529464a5c006a1a56f0e004c6bf65903d867aff4720c8ab6da39ce", - "56b5cc3bfb2759d199a4dae4a04acdbef6ba303bbea9ec414726a52353c2bac6", - "c73aa5183d60642d22270d738ac77dfd2d8f3b11572246522422c049cb3a6be1", - "d2f3b6ca1e42c78a985937622cb93706b73d221af5ed3f82f3ca0ed214969e91", - "81466686ab1e8b26a57c08eaaf7532df0695530dd39c41462c995db7068b0eab", - "2a8885ca84c30e8ec96d6888260f20d6efe1fd87982f16bafe0d2c4db9237ad1", - "26dceeeb2cb7a48a2bfc2ab56b189e1a7c530f4d13f7b4228dc618949685428b", - "1b59db8aada5f6c49764307eff7a8ff2c7b9e4c79076c41e70c4ac0ea128b950", - "bd61a7c7b5dcc79fd7e9141f90b65844e30f7de306d35aa74da30257a525a2c5", - "df604bcea175a536928ec75723df0aeb3f6b5202dad6ca01f048cddb13362952", - "2cbcbf347ff90129216c2b7cf54b7fb8b0b9217450474ac77e144a67cde8d50f", - "589a9c3716ffb70f49765b8543447ddd3e73ca0cabeca5e5e23931e27c5a8f2d", - "76fdbf5bf24512e1fa352894f24f8643d32e865beb00feada7c360405eada5fc", - "d846187443fb0614b3b59b55996b32badaf4cd75d1b89cc3bfe2db37f7edc8fb", - "741b4927fd82dfb202e82bbe4bbd9052bcd1cf810f13e246a33f3b6a4bf17ab2", - "290e2408003b4261bb15661d6faca9e9d9559fe44275d882557ef86943ba22d8", - "6b1173fc9afe9f28b16a8986a81c732b3e737bc7b9fd8b6f06109ef1ad9f3cba", - "8eb3f10362c07d1862ce8aa3456409e6b9279ee4bdd88e90b095830b43e34189", - "33fa32d1aa79fe0d9aec7d59ccb0c8dc8d58ccc0bfcc31fbf4e4f0d9c59af451", - "aa4e98bd191e911791ea82314becb3251ba92f7fa8e7e7db553c9e1de0dbe07a", - "7d5e1cf8257b74875e02beded2876fc65b7b848fe8adf17536d7cd86244677ca", - "8b0f42225d0748b4201de5809830ddfbf2c60c16d51f4dc67c446820736a1f8d", - "b7a142e73a35df6a743e6d4290c54d014820624602ae82a7253085905c367f15", - "b3fc3c7f79df58f48c927f5f0bde3364d4ea2d63cdbafa7f253b27dd652c72cb", - "54277bb07279389fcc22582d745e92ec292a270eeb67e2aa7b1fef7a85145c5b", - "81ed4b91c1a0cb85d380f3d6091d6e24f5b657c761198957582a3596e53abb3b", - "92b0b27e697c793b22dc90db18a2a89f932893c1da9a341ab3ae7b2d99dc0eee", - "17aaefcc0be88969c749dafb9a84047953eac9064e2188d8be266e41312b59cf", - "ef5c5d6a98591453dc99416db1e6419984476343d957b228e318c81bcd8b1730", - "a5cd69ec85c0588e16e8224f62981e92cb759f0d18f15a2d0445dc2ac130dc88", - "d4ffcf80cb8fada1ea92c175565a98b5f4d028dfc1d47f8a502fd718fd5c8009", - "48749a25461158dfad2aa70b8bbfdeb7499848b00621b228edc350b762bd82f6", - "eaf40a61f7b4d6b571f3c81eff672697e86dc521aec83b204215238595bc03b5", - "f01ae324a2820d3d033f04ea2192fbe167c35ab955128bdd03ba8bb37073a0ad", - "ce9fd36b6cc9c16c2cda7debd7bcb7e340e057ce11eb01b4d98cab7643ed7cc5", - "b523d793ef02022cf488d2a0dc5264ef227bcbe0dc018c007fce47d702d95597", - "a601e11d81dfb7ddbc3ea44c80fa2093da99c8ecc59ce627cdabebf94c5e7001", - "619c4faba1a68abed4606e9d67af1bceed1b48bc6ab6b1b7f43557338252aa8b", - "28982e40bde9ec15eec19c64a8bb5673c7cde67fdb0d815893a53604f6e95b90", - "0f03789a73c2c4e36291abc6cfec42dc31f6f7e1b28bbf9ddb7e542fcd840a81", - "7615cb3abcabac440157a80e26393a9cdd63b24d0221843091da393aff70ee00", - "368c6f9f9561a092b8d19fb0e6afb192dab162f857b23ed05be126be5bc0d25c", - "bb184eb7a24ca9780326a73223800f3bbf88a1fc4923c9409e3c4d62ac3d59da", - "809f04e82a650c5c8b9a799249d4b48aefeb74428a71df73fb76b395fd7e7f25", - "bf876b2bb1a133a583be3f4c6d5fe1c88e1f87fec02001c077fa73283e7154fe", - "1cb7be660ba845872f199eb6e191aa7314a6c06652c7ca07ef77f781e1e57fab", - "02ed51b0078e1184e76705153953b9ec8ecf8862c8a7371ccd3a72c341143230", - "78dfffa8e01e3c9242c1112f59ee6eb86aa1ed7aa18e25bcb90ce8c04ee7a55e", - "ac8f3301731651eedad5329a2872a7a2394104322ed3cc1c4d076d8dbed8d9e8", - "206685077da3df440413f426156e8461649ca3a16acbd1e06a7250920eaa56b5", - "4002effe4e90ce96674c66ebfe964193b70d80bc349e49dbcd537c12357ca3ed", - "c5e14040f4658c6cf26af5f495f2748d3079391a598d212da02608e0b525fb5f", - "33c94841cf91683d835e73cf9658782734aa9a77102cd01b692fbf72a0be9f1d", - "c46a5468742d56685b5fa8ef33e8000e0f5e377723af78ed1face9e2f42dfde3", - "53fb422d65cf394bc3f1d4f8516934c57edd99a92d099a12f7ec6785ffc71ac6", - "df924393755c3f176f63e7f3c134809a13febbeb89cb7726cf66b8b6b187e52b", - "63af20c51e8ce36b47e2fb8836aa292280a65df51641a7fd459576fc2609825a", - "88fb4425017d5547cc4ea6071670fc704953d6f5e67d1152a6f334db62430dfc", - "ae65bac9a1c4fd1343dc9c259edad0ed55fa87a85a27fa45bd7a18d644b93389", - "d421eaf982ea2d88b52a2ac3dc8d2000af27f6a2d0f17177517b14ad645507b2", - "56c21e139a7a6b0574e65850c93b72f2f08374d043d4e1601586cf27a2daf233", - "402e959a63dc9f56f841e6864e264d09eedd2adce225ab6ba8499c1c6132b5a8", - "a3d603aa9bd38514198f1392fff0b4f8c7577c7fb41c407e9554588c892760dc", - "b40de2c8099490277d03eb0f51eeb5d940ddd5191b5011bc4925419d75bf7498", - "8f513c571cae2e4bc497d753c6547a68e12246a683dd10327c6b6de770dcb0b8", - "ec40b597e17bd7828640daa6806fb1731946c28ccc5ae62253da3f8bd9eb50e3", - "3319c29d278f5b8329cd31b6981cc76a5e89fdf646dcf8029fbc062924d19c57", - "de041b1cb14cf1ace8abba79fd4c1577ac3b33259dc1ad6c7370ffecc5b1a8b5", - "4ebcb26541ee36cbada54086b7fea3f3864ed2813dc9e6b672a961933e5b1775", - "1a152728b5a190b7cb7a01c6d3af4dd980260a01dcf422ba49774f74436bd15e", - "e4014eb2c3a88c2e52d87aab3315efbd7adbe94d6aa243b73d4f25b71ce3f9a4", - "07937a4827cd45d45eaf18d9cff01fe12f907225c28e4875cef0dcadb4c47cf3", - "67feef0be8395c15f501502f7bc050884c28b594b86d1a3ca4d91756101126ac", - "9aba88274ab2bd920a187246177d9315acf0bf10b41ef71660ffc3faf27fdf44", - "e40ea0247faba252d6cb47e159023fe0413d2c32f4553be88621f6cfb871cc27", - "8b18b484f61b4983a081ff664b0d6a267fe0f17d35107effd36ee0fbe9e6d86a", - "303bdc27be7f9d9b0756f28d7a4c704eae4a2dc68da7c79766d95ffaed1c313f", - "8f9f746a9412a107fd05772677831735925d95a68e421acdc2af50049750108c", - "c98ae9049fbfc13f31acdf8e0cc9efd670cd2c08476c02c8dd0d2205636ffde0", - "574705c56b8e50b89a6e0e2bda14a4c5ea9ea5b27483aa019b84ec75d71e8d3d", - "3124ef22e6c2c89cad876a570e0fbdd66fc8ff72a56cab89daaab6956641c378", - "5f9288ea0c70e1e48bdbb67aca653f5998b48e318c2921912907a04f8356b8e3", - "1a7bf92ee0580c548eb10c51d6b215465cab3bc1b917cbfea8869bdc08c5b9cd", - "f05f675d103399424a20ff4df56cbff729405b965636c70a51df42aeddf21e2d", - "11fc91a8bcc1e4097396c4e21562c46380748b14280ba0e2f9b18ca6bb811056", - "12774f182f531b3436b83b4aa5b64faf91735cd78d23d56d9bc2d7918561a2b7", - "b8c8d3e103f8d651e34067199e9c44e15217b4f18a477e55762c928b9233e731", - "8196593290ac719c3b811cc26605b2b17997e985328614444cc83abf1c6fd9b3", - "08147af935ca0f210cfec4bfa5c96a707dcabc780f74c523deab177e4173fbfd", - "26cd0322c4347442de3fd41b45fcb026e3919b530be58fc8f9aa79034b40db02", - "7ce79066165bc99488f759d821dbd053f3fd1c6d92504f3b38c8c1183a63b86e", - "7c265ae582156457f6e0778555a7291afa18f1449f5635011bd400bcb086d69a", - "39060db0106f7af5ebbef1162448a5117fc3f8246af35cbcd1c5ebbf95470384", - "0ffda977378fd7d3879e1d43fefc98a1fb285de5c5afa0cd82124a7a9f7e5462", - "e045f658f1e70123bf7ebde8b074f41609347b1eb129be011c89a2b11ef65fa6", - "bd631cdffa69ed4da6a3638ef30da73137d12d9d957813197990e31abceee94e", - "7e94766774b7157baebc731c7625cdc95c404f5b65e13e55577456e3761844e5", - "8eb7104ab516b448e1a325f9573e3220f572a5426918de1f0242998cc11dd935", - "81fb2037e36b10217444cf46cb51f95c26052f2c2257c2701296a47408c6beb4", - "1bfb381223676253c6df477961d3d038526a76473b28d733527e1cfb426bbe0a", - "85f4685a33f6dae4b12708f33125747eaa4fdbc54fd7b30c67cda1ce727a082f", - "9b45a98cc325375c258807e95f739fa964736bb0a18e9f2b501d8763d93a37e0", - "a048638a6bcce96ac351b80340ddf7cc1d7c710b4016826616cb8fd74ce3bbf6", - "f0944a375d3cb6da3982af58972def625ff7ed8985017ecc97b7889f7f08b360", - "00faf22a0938bf1506e104fa99b4e8e657e5d4eba37d5c398278c744455d6ba3", - "8e6fe019525712608046edd715c18b8301c5c400430d3ad70d042b4162c960e0", - "2d752b05aefffd8c9c42ba35db8969409898338dd137c549e14a13510a5aed75", - "66a3ab56500e686b925a85363a5be5ef883ca54aa4a4a7c65323831d9f2b21ca", - "d94659b216547484c7e294a351858c2a696cb32009dcaa7eb299380ae2922738", - "4fcdc4792f269fee1c701a9ea7e92789e9441f02797b21856216e1b6b0f67314", - "e56359576660563429031333b8d0bc624f5b3cc5f397bef1e017633a3d9b6cb1", - "8c1055bc27c240dc7509313c624cb18585f2dabd0c49d588c976b17646b75101", - "820690e776e4570970c3e40ad7880cd8eacbc60f3b720a08e550387a132d6273", - "22db2a4c27fa5c50f2ff7817d8fed616e98432a7223c72417bc93a4d0e261241", - "c14c3cadbc6113959384ae8b5af59f893ecd36eaa1308c95f40185fdf86f68a7", - "b82bd066fd469c0437273e96b76b36aa693fb3b9913cbd8dd20216ace67e6635", - "3eebaac0e59f70d8b478259301810c8c4e0066d91841f93fd5efe3b85282e562", - "05ddffe3e4dcf50a1b78f8f075c26e72337615edf8a8b0dfa6634853b482f3f7", - "adcb3a343b0d0f8b98a894448b185f8138b053992d3e4a7ac260292b7011e9c1", - "fdfd765b933604ac86601de2455736f82e320c3a95db68fa8d7c095e39410dbc", - "1a6ef1d71ee5ac99272a8073c98d30e80d45d1231141a3a286b9a32955da9098", - "07e627ac47958fe4d80677b56962240f2eb094f31dfc480ddfa16294d3957fa8", - "117ecb99b3851b28ef62d1dba836b4a5bb3a6b3f7439118fd7d1d56e57fa5dd8", - "0dc1a627e3b8bda901f8cb86e94b42646ebd084d58e41a11cbb584da80f393e3", - "95982e58a295b24482de11db628132261949cd75338e01b57b1b704b6d95e887", - "74d25caaf336b5d67b0e4f0333912b643086a3856f04c882f65000a755ac1c8c", - "81ac155b7004650832a882e6f339f492a45face036bb65d5d1eaedfae529fe35", - "3e0cbc1f11c5cfc2688174a02fdc4497791050ef552dda73c7fab1fe3eb3715d", - "5ba2b968aed9546739c415055773c4e784754a948941ae2e5b3e009269ce6aea", - "43988f449b7f87d8adef64b225c2e20ac1fbe71de6cb783fbdc25e87fd1101f6", - "88d4610ecfb3ff589c5f693d78423473c34f23b56173408db821a83d8f246f80", - "13a05014892381d7a8dc8e45d14e1d810703ce38b5b2c2e695d1456a95c714ec", - "a8ecf90351ca8b7cfdf37ecc5b00442c91232b62b2d55f633f5ec72e37e2a074", - "40b120f0333a29fed8e0602f80577286d648ada9408b55d0a0e806a7ddf30e15", - "188de2f2fadf94f4ae076325253066a0574badd585f86fc3b155e1cbdcaf0426", - "b32596b74ae9ac92eec29cff5558ec50b7f090757321c223f372a86c47c6d1c3", - "28f2fd62b500d899660fe9afe5f0eaddc08d5d094dc033b360ca9794b57f7939", - "8da7ac27c9688b045f9574398e2c04e4db6b5bc5b1d2fe0db6d5afea4b232a2f", - "aa923a05a5d8dcb2f78f76706f475db348aeea433d365db56715e87e15c56904", - "8f22db0f39e866730d273990e99c66c9df612cf25fcf59460aebf2d6c866c831", - "2e6d45381f1322da16bf1ce1050b0597316129676ad75f98672743a48c0142ff", - "6cef5d05dd602fad9a46ecdf5fe96f65dbfb8c5ce96a732dae23e48c9a353b2f", - "36269240bbb09e5bcfbbc6f267cc1873f312992f14061f3b55ce1b5720f1c93c", - "7f38f579c120bbde45501eb465d77e1ea41204ad63db3acb5e2f33ea8d65dffc", - "160a80fe05236e0c34a9077d06b62f176330a5214f670e13cf8fdd261bc38e22", - "d4ad9a1749e84588e14af76256c7b0393a3c5a73e0948bcc5bdef691f6279ac9", - "08f40c8f15afeb96c960a559b9e720f114a0c0beb527c3b8825fdfe1b7eae7fc", - "b03af8926d971ae11b95a115c0072528fc4c2171e715d0d7d33af26e7e1c7487", - "b27676ded609906dd6d590a4563fa1a818cfcab673ac41f4193ab8901b18e267", - "6e9efad33e43f0d63da8a4c849108f55d15b162a9d5707d5f4bd47bad6cbd8e7", - "d4888f69f9cd418deec952dbd3186d64c7ef2afb64ad84ecbfd0e81f2211f7f6", - "6f037a65814587bfe8348fa9d650c1d4eac2c029497f36ef570bfeb392c79831", - "cce9620f57eb8cf168b96d1d67246073c53172f1098a3f1839f0409b8dafe864", - "7042a58036e4779ed7e71cda4e16d7dffcd3066678e0b359925b15235d009dcf", - "cfdf1b2418de334087ccd6780eb563cb6778e585bf004ccdfa1016bead378c01", - "1d6546ddba4fbc0367db7a42f29ae332b3850953ab8ffde02352756399addf5d", - "89e38b15237afd2c3eee6fb229f99d1a3708c96ad60e74b6ece1bb2f1f32bc88", - "38f3bc3440c0ceb192bf033f7b7e2ce669a3bfcaee1bad8ff02245ba025e0321", - "a62758f582c0ed81fb23a09b8a79a552d1ae10ff7f2f0b29bd6d4ddded141ae0", - "6133423bec92b1209221dd0cab402b56553791ecdf9b3229f7d52d1afe7da5f8", - "5508f3497b7a4b13779577c8b065148b8b8b118b249cfb97f4739062399fe514", - "afa2917f346d7342a39a726cc3c44955abab8575f832cd6e4d686861351433b4", - "7a5e5daaa16be07f0e31ff6501dd46ada986a1924ed9a91b7a0206fc74fbbf35", - "2dfcd1e317c22bc80db5206422a765cee298ffd1468b1ea13973c77dea88bf57", - "988745990c4dc7476efb2b50190bc197fc860c55ccdafb52ff99ab01d29fd7ba", - "4849cd09446e16cf6d307d5ca0732e93fd5a3d902e7eeefab5c934d7bcebef7c", - "3f47d480bfbb5d4e45e976ecf988a87e4d82b3536f8abd641b5855044d63ba98", - "08a307189a515e92c4b13228f03f2faf74d6ee16a6a79bff1cf0af528003f02f", - "97787278732baab20e454a35f6a0f4f88a3a68bd2a51d3920490f10cb51e605a", - "e15eae7eced6e2897c2f73412f01b95b1915115d1cd4b349f7a43c4493a465c6", - "6891412309f1e2834ddf7c556729a3afd0d8ff374eff8d7e54789e1ebfc348dc", - "5cd0d252aa52cf75fa7a167ece02ae6cfd6836dce017f14bcc282e39ece6f21c", - "74d0e1cb3baf6bb91091b75f95dd15a723c078698d73e3a0d258f719d81bf0e7", - "bf30e1b518768e276c4e7d39057abb6c44be01ea43c34b32d997940f97156d89", - "50b0a8ccda02e3ae8cbf0a8fdafc90bb819fa201fa59972ec01146e0a0a03378", - "a115230c941699b6e3edde57e02250f0ec8f4df233df3256fac58211481f4fc1", - "939e3ea8e365defaaeef11e1902ec5bf20a6ba9f93f92369d62b8dba0c8ef6fb", - "f7cb89e7fc45af37afa51675331fd072e9e611fd0cb8c2bbff764edec6af4b60", - "0d389ac86c3157f0d9d241ce2fd2679b70977c6fb3e88eda1c0e6c2e5800c863", - "2858d973ba50c7a6864bf75ef10ef5bc6162fb5228fc1fbace6b1a54e1f763c3", - "2ce0c9a5e3c153a82b61721575bf86f7d082172d4d608c0e7f242801eb11e821", - "980a850dc79313261eb25e0bc13b3ec55b135851695f159b02c13f31af55d1e2", - "04e7323f33617ecfc053f4b5ac579ce170082026a88b6025ec718a33f4a3f4a3", - "83c51638cfc256e3716ed01567ea8516df7ad40ce865eab69d30a3ef539858d4", - "d962a5aad224b49817c4b3c7a07b93d07d43e9f4e1bd956cbd4b0bdb33ac2edb", - "ecbd4c5f1f041f85634d24814e094a4bb03121a8437d585c13253c3b5fb80ec4", - "a320d19211de44bda9016222e3892fbabc1d211650b11b7cc408b4af618c2f5d", - "ff756029dcc596ee15e6ff96ab17c9cf45c3ed455ea7933aacd8cba743f1ee6f", - "50b71c8c2702cceaab6d62132785597b7bb033a1366d0343d3378afb8525cf5e", - "5ce29d168c19dccec39bac25cadb5c18983d2b1d227b96f0327ba4a91d7e939a", - "bb65a02502dcb7eee8cf59722dfb4f5a896830aef98154d7bb1be7143c59d954", - "1f95ab89a0109749fa19e85aa9cb14ce4fcec5ed9725d1e77c28d29a1a671939", - "8ebfeee603d3bf875a15adb2cd2e454d32b6c0ba9d36513fda1e25c3d3ac748c", - "f3751d145384ef1ccb92558ed08446897990393a768fa6657ce2a6dbeea617e0", - "94d7ef706aed37b914ee5aae8a13c9dbf3bc6ad6a76e810592d2617d53841296", - "9c897285f76222144f78158662576f86be852f6959c43798165dc2c45b3d35f8", - "ab0326acac0b212d23a2840e6c58d5ce5a9e52e289d08b3a02166829fa5b98b5", - "b0aaf61e109a52333e990490ec7c8245af632fdb0b2ce1641fcb63135ff7e63d", - "3c0f4fc613318863eeb11c9f253e21e2efd2e85243410194eeeea571ba45d957", - "86920babbd29e72ef210654e68dd861dd543395da41d14225502ecf62eb122aa", - "a1dc65038da3e3d2198eaac559aa6b912606467cf9b491c34670ad326e17e426", - "c5b0ba7fb61fa357ce3e10b2e90290beec3746a05320108ab30491e959e5efde", - "336cd196ba8ca69d6bd3bead2f68f7cf8a3ba3428cf893dbafaf8235227835ce", - "809b54d4963cd4883e54474eb6cc819c4f71b4219735eb69b1992da0f3884de8", - "2174161f74c26183b1ed3dc0c900c83e4f0377fd87a9b9710a91e1d176d5bddf", - "a967dd7b7cf14d4af08a3c401f981c7ba218bc233de866da2584295991da123a", - "f2052b1fbe251ece7283a4712d5f8f4a3030b64e950eb67cfca17a28947d54ba", - "aa6560c26b8d6d60ca5d9731ac345c2754c67b4001152f851698cdb7ca8a743b", - "3bc5ef57a07533163249682c4ae14fddc3b2327c790523389119c30c50d7b7c3", - "1d9c0308923eab9c25b86a851bd680c8dfb90834d2992a3b28da03bbe6e1d808", - "e80bd324757dd70ef3a8d6d92b937d663d9e62f860d38a9686401f30a7304cd2", - "b02411870f73267373962dd514b58bb426f1be1d9aa25fe2c18a5bbe3807420f", - "2b45834e979ad2b897e1654472f5f8803f76b6bf73f7d6f9d956684b2672eee8", - "78e32dfb404c2a99190ce16af059c9aa57a753a9cf043ea11822845e840d44b2", - "7f3f8a2fa76d70d5c9a1ef7f3c15aeccc74442c3e6d14e5cec1fcfe506ddd555", - "44e74cf3eea58e021737275905046ed94521bc06c27bfbf4b78455640e52e269", - "cb5d2e4a98605fc8d9b53cde9e02ff54480836827e48a52a9ca9b079c7a152a4", - "0357f1f9cc29012690bab173df32be0e1a4765735ac4b0656f092d78de644f13", - "3edb98660aa37a789f332809c962cb7fcb31d56306e5b11725b74142115c8b71", - "2fe29a34ae4c127a61b813a5e00685c7e16aa93575e65bf78df1ac5a713654a7", - "fa76305f1c5a4127823f15d69706c69cd81505a6968d876acffab2c0ca2349ed", - "c80905bfd1c3c256bac1e6e4cf9a80e39e87f6e8416c47a958cb42aa3792f660", - "0272ac6df21b39b70f9b1d1d9d1a99af49f1978d4045e37185dd515d9e6bfec1", - "2505cdd0e318798fe12da231c6bbd5779979bbba9f5b2379d1d6fad04b60b9f5", - "a5b9e5c58268f887fbcc75bc57a745977c61110d4b9c7a20f440ad714d520473", - "e9f5b39cd0175da1149600b11f60fc72787aeaee5678be226eb96c1eee34830f", - "54b1c6757f63482ad48b91c72673e772d4b40db032e5defa1acb789646de941e", - "aa7bb52a4c967d935ea702fad8a44e5c376f773cd84dea0fbb9e6e342646c12f", - "afe5c0299ecb463fd48484935a2014238f7f588b1300c4cfe491ba52cd54cbfe", - "6282e52c01122290d51a040f81371772c6a963450ceb63d7b382aea96cb39483", - "fae710af438c72f288afffad13d73425ce72f384430f38907065f47503fa7387", - "60b819bfd31b95474910210192c373172348995e664e5a9459c9549f8a734c8a", - "c34f07b87d27a79715994fb9f73480eba9dbd437ecc84be270b3b43dcef93c82", - "e4305f53fbe95dae600de1ee96add6dcb42bfcd9889501693adb16095b0904ef", - "f2ba152482b91419e733f251b436d6c61290d232bf84fc37599a8dd783970ebb", - "6bdc2a5e722bee2c676c47587422ce64e20a6434865d8027d7e3be7d29965420", - "89733a0db24af8a2753e38b8cee7daf02dd18702f8100a58545e78ae186a261c", - "bbb8b773045c3b525d354f304582b5d7b5e1af19a292c6a80ae93c38823b07ef", - "3dbaebd2fa4abcf393bd50a4bf31b535e1b611896fbb755e86b53f7df028bb20", - "04822878e178f9ee5e2557a2dd3f0c2e8651eace67b7f6f1c2fc91acb5c398a8", - "bedd48c2cf64eff8068b2638b22fed6bde219e4792eb23b35ae1bdad6d31e262", - "217a8efa9b2560c7d37116401653d75497e2410f4a24da34e922d22f63db9e28", - "9ea56575458ed14d0320d4b89611fb69c605185aed54da2b25efa4c1024827d9", - "715540725f5b0ae66f8ce587356ff9b21fa133a9e418e4826c3e05828e021635", - "360369f6aa4a17ced7ed003e4d9950b1208e84535a9a03bd52ad56388ff35b80", - "630696636625903d9a79e6378ccf6c958399fcbe06884eac8d4f475b30884d7f", - "a213ce330f80bd035a818299f8cc2869456baf86694a0e4dfd85b47d7eef34d9", - "9d3ea1ef85b52e53b630f09ec815a98440da8deeb971c65a9c7531fa9dd5dbb4", - "91ea9653f909381435ef82cbf89d2e8acce8e527a2af02e9a73cae29e908a33e", - "72f910762d136a80ac3bc762acfb74ba42ab7b75a27a0f0137970d9744511d23", - "bfe6b977b70d3d533848e244abe52fbcc5d107d90a1f79ecdfb5fb4a41e7b865", - "1aa3988f7da7ef968efb8bff067fc8e9e4de82fe22e578a7dd8b14d04efe9d16", - "ce931a49443c9eb51d2a562fd10861cbdb25d494185c466654f8e6b1f83a1d19", - "3cd0ae7ac7cd411eec1743eb31c9e8c35e4d4f3ee113c29341088d5d325789ea", - "b4deba7405274e6f4d5fdca6deede4c032362878a7bf5f04b4547a89d3fded14", - "a25cb726efc438481433697a1e3bbde6f5d8406a3d73e550af545c90176e2153", - "ce751cf58c0642504915ca0191196ed0c63ae9925cc1dd9dcf5f0aa5153c534a", - "47143e515f29d666268ad6d58d650fe6957b1e94e409e8497991f56aedf291cc", - "8879c4db0922677b219bfef3c4e5f504b5aee131fdeb29f657fd25c5ce6c875e", - "2514e2863c4953f13b1a2af620c190134d8a007bd0433e7cbab558baabe46fdb", - "ca886301766b7fe5d395bb7ebab9828fd40dc8df4e483a5ad5bf31fa6a13f24d", - "b5647c4f1462513e52a492c78b7f3470b87a51daa799f0f5f5dfb39562e6a96d", - "793de4d6df2c712c264ee2a92ab4749035fd759811a5b21181abfb300b12c41a", - "25bbdaa4d2477879ea45e0b8efa1ae908236b8d6bcf5a5603a5abb830e8c6470", - "a9d8d55d10064b5f8bce895add044737aea17dfbb87edba11a696b0f459de834", - "b82840a488cfe8542581e5bd037e5eb992c14cc1d7beaa89455ff0392036dfe2", - "81f754396e43d6256731d6814794f7dedf6d02172e2f294aa49fa6e77f0c6dd3", - "b30d9aac9dd2582dff31328641e3b32a40af91b37863d21f9ee4c66550412328", - "fb979bca21bb53d2783531798564dcf35dfeb5f63028c92635605457fc7ab3aa", - "9d9d9752f0c0a7e12b453a94ae5fc2b5c04057a8ae3215aa1faa896c62a34a80", - "5747efccf45f74457c25bbb2eb17bab66ce845d77abef5004ddacc7cda9eaef2", - "5c81afc155905f1d5ee9865dcc7d4efe356355ec0810e7dd06867780cdbb0948", - "f6a55bcbeb24ff3ac4843927d596028cafb0eb9073dff9a1f34930eb6dead7e4", - "508d8ea5d9172969a6aeac4a054b46872689c8ae548cc16d227fde0dc867f8de", - "4724eb8fe041c4d2091705ac43883b8ab53da1090e00b650421566c4bd148ebb", - "bc0d5ebde4f43be607ee8151716442ae44b91f3071955b47fc115f9bdff87e2c", - "b77261ac245be5b19da8e0cfb1876138be33acb283c6dda8d814c8db57025cce", - "7bd8f3baca71c16d75801b6e99954de4338944a44c4b4562d038dab59b702eef", - "7d1e1ff16380f4bd561dff067fcc3f7b5469c2302b9cf4ef2c7a12a5c8e6e47f", - "414a8a2c2a991d98e83b765c5eb0ce2021f328a4919c9675f0997f4d586fe38e", - "951d3b1b1fac2297bb74cc78df10c5acddfb0346877c22754990d194558522b3", - "ea67185bc4f96e434ba8cacead07a630539b193bc990b91f2b3cf3a2a4bc6d3a", - "ebbed51ddeaff90f045aaf5ebebc5c0335ea7a5286cd51e51705767361ecfb1b", - "32128f6d851cd4153a685c80a1cbbbded129b854d0d064205a49a6c421f44465", - "3c6a2f724ea467bf85a15475dd582fdb66b5246cc86c26901482150c00a79bd1", - "e770a7872f776ea020bdc3057287245dab832cbefb97e9c841ba05b7e19992cc", - "b56b80b84d173ce79588b757fd68b6678f997714d6c3f4f4ddc3fcca39ad2a32", - "0b8d12b194240ef8e3ae4da2e4bdd62a8d37ca7e88520f191ca35f7398f4e917", - "6aa80274f4b3177c30152ac9abf24ea0d3b053cecc1865c5e58edc98041af42d", - "bd357c5fa40c332eeac4884cfcab43e8b62623e47ad7bdc5f58c68e1a24be139", - "d918bd9c4827bc3db5376b75f2860a070f1ecf13bc2126c73a213fdd0618b997", - "ae8d37c36a03f40eb57bdfbb9e4337e53a8cc0a385e65dd435f063dc4074a544", - "619283d8a108b9221864dd3c9478328756f7622561d215e2c6ef0186009cfaac", - "aabb0404215458c16c19ee4be9518ba63e898d002554236e13b0c4ba44d9d51d", - "866248c251da61f464bc9e3ea50fd1e8c6dfcbaa8bc12dd0b662bd25e910eabd", - "304426f0c94e404c7285c33044b7ec9afc18607eaaf2ed9f713da23289e4c061", - "366d633f88ac1b8e883e3ccfa64780de8b7f4a094311628b25e6a9a5c6e9fabe", - "a3a357f226989f1ebb2b9098d39223719bce1e563ea346c0362cbe2aa6a1c5e9", - "709fcdae53cf639a65b627a2dbeae46eea80ec86e02e1f9a280e46287ca62a74", - "07c3533c224185668a802fcb0c0412ba378e8d399234010a30cfdb4134415e03", - "5d99d26774b0f42fb78c251e12a5b7dcf07356a5dddbf5a69e34ca1194e26e48", - "cecca1b6506b295983dc254d91a898edacacbd3f3a10c11a26d88f316172b5ec", - "7352efc979c30135e3bdc8ee71c86649a8637024a1ab33a0672d456dda733db2", - "92b3c6ac4b0d3524b4c5579742f8532cf796bc512cab108c0b3bc39bf8c82d00", - "119946befd3a83120e02840b56065a7f4357dae868945ec4b2bbf27cd32cae3e", - "1eecb594a24ce861790d793599626b5fdc3ddcea1a035516aae9cf8041098b24", - "b9f4e43dcf87ebdc2aa8be6b497424637a1dd2a7012635e771e8bfac9f6d555d", - "cfa8c86064ecb2566140f7be10f7bf40c08c355aae033f607aec7cc6ee50d04d", - "a072c814b00fb08fdff51082af6c49ebe88cf0d82803e504447037043c8b1535", - "bb07e4706434f9860c87e5d090113cd610a5feb29605c31a51f9e797afa4e4ea", - "9fbd7741ea44ad4737befa84111e25df9c60b6d23dc9033021e8e399f14e5f54", - "35a154fba46672d349289692b60bc509057b887885e1a0eba62716a27ebbcb9c", - "6255b5bf987595c70b2b05d8406437e49220ff7ba13a332ff0c3c07372958ee6", - "1aed1ebba458947f11a2379e08e04dce599aed842db9b290be1e3cb11ce5895b", - "f67cd0c5a680dbab66f3162b6761743112736fbe3c6ea1c2bd17d916881f6b67", - "219f008157cac0ec7e1790e348401639457ab1cd663000c822cd8b541f54a580", - "c55daeba951d1fe0db47f45cf1d04e422cd93fbbe75a0f0beed1177bde5a07b1", - "49cf788541d5baf72082fbb3a7557342aa25240f9138e71f04a8f6c115cfcbaf", - "95d1698db524d4aaf7f09bbe1a62c54afa1cdaad5a9e4d356ba19f745b08d4d4", - "4c8e2eb635ae4303a8a5a354ebcba1c123dfe12e9948440646d39b27ae510175", - "8668b2ec80e26a2e99f98c6fe92542e98958db3cc0ad75537062b460e23af37f", - "8cdfd9bc6edcc7bbc7aa46f08223dc5c1c537b5ef816a598b9dbf71f0edfee7c", - "a685cae8a0cde000cbdc65dd4d3d8debb1e4a87f6e3a55c0fc551580bf82af7a", - "c29a1a9acd5a83e7a020edd31ddba34610b5439daade9968c47f52b7992ecc14", - "92701f58e2a909aa69599e6bfec1ada22ea7087b6c3a210f2b997496638e7f8b", - "648ed3cc17f42cd85afdd539fcceeb3bab078eaf45c277d344b0506abc066865", - "970c3b1aa01fc9fe0228cd28cf7b5d20ed6fe2f3731a643fa45b86dc5ccd6a03", - "e5aef8d5fc5c2f9c2815b727dee69ee999994e874bfcf5c68e2a7956f021219d", - "1747b29829821c6a5d08e529ea59e30c08f0789fdb4172baffd790065b06c9c2", - "1afcefd2bc77a7f218d33b506c1a5606dd923c333c48653bee79d39d636b0b0e", - "afde539845af7d4198ca250db5c096c0494ba762bf4504d3355cae7e7beb48d0", - "ab10fd7332db056a89ef54ec5ae77c98f1819463ab35eee1c702d3c31617e311", - "664e3fd64b8f9e11ddb5a5a3585df4ec1080b8099dc0e9ef9bd2202a1879c1ea", - "cfe10071a46adc03eaaa73ad3786f8df174668e42ba9036f288189e2bf587db0", - "5e73e39e4d10e049079bb7dd3d0571e175ed35d7d6f60395b3536409faea7cb6", - "30506b24cea42a23bcb0a7ef79341ebe22511d31ab7e61d11de3663c658f5f3a", - "eb095afcac1d98aa32fe24cee24fe0ab570ce1ef65f4e116e81d6c9677cd459f", - "6530eccf23051bfaaecbc8836734091f3dde411d9265ecf7a8e579ff6b0f0fd3", - "e5e42dc28de837bc1fd13d249ebf20fff0493e385c9e68f99c2c81859fea016c", - "ae935e1f1a6d1a49b58bc8424b7af780cff687fdd3c4a8784d520a36b7cba9b7", - "366ab3859c55f3cc850cb511b960be0ccc17f01791af72f6fa7658845bee7ff6", - "69c9d0932955cf9f20c2e1a42e2d8dbd402c8daf3c9aae18b943f413a5d64c59", - "c3fd27f50bfc520e3bc97880feb6c7576221dec7f63ee3f8e7c4afe5ea17a973", - "d40df26fe4fe4cc5e1570edcfb419ad03d725eb739be78d782b010d2fe0103ba", - "479338263f3ebbbc7a8377f10c922efefdbb10231995390b1d02e7c91ed9f2d8", - "58e84ee8802270051ae41360802235efd3dca05aba751515cbb5746554176ac8", - "37fab0574368ccd9d6be4bb8be8650925859838cc78a208de002fbbb5a8b6a94", - "3e5107216bd3e032fdc23eaa4b69b15b03096189a608701569bb15405e500d79", - "e4b87fa4f4fd3271d50e80e5387da6d8d86d811e97599a0b00310813283852f3", - "391fd42a215f59f22d865d6b88ca41af56ec3fcd1d2ef0a1adc497209a371ff0", - "72a9b6d52da38d559febac937bac6ca95f682bed6b968d713cd14e33ebc9ed5d", - "7a78f0238a5a39cdef3a1675bef4712e427fdbdbe1077150c8e7e4505cc9a672", - "0190e9d72c20d401c2160f124f420cb3e7d6dbb397c9ad9b663425cb06219018", - "e294bc9ea179a02f74bd34dae7c284133332a923eb1c631b4da39a47aa101854", - "b180776e47e628bd82b2f7e391239382ccb639936a87f379a9524b05ba82a45a", - "934e0b8ae277cd305f9aca298c61ab89bce2333525a1d7d5313de2dbc4c5a546", - "eb51d239390c6308ee8c1d6efad86c51eca2f4c9c361361e7ef91da3f1dfe201", - "15681aca681998dbac049f2472a7954b15892bebc4ce7f24dc2311e8d299b79d", - "265379e0bde13a4bed9921d13d80b842b203e192cf7bcb37146e95e04c9ee987", - "ed6b89c0578814a2d28d5aad5e51df482d192b8d2e54bdfb0b5bc7ac13982a80", - "e92b8635dd2521d667522601dc485d909c1ca0c26b11c9d49242dd4ce802231c", - "2dde49e2379252dfe0f8875a33148b220faaa8be30a381165d7b8ad32eafa8b0", - "18452b830ff8c5413bf10da3f3f8478c51209cf3234ee7e07e0783a0783fe5bc", - "b87013d1b2f0534f2b603bf3c962bc280710df7d03e114bf3b240479bbae6cd1", - "50bad1e2edaed474127d4e796ceb51ed0fb4970a522bdd2e38528dcef28ceebb", - "4c9ba51fbb4005f93305252e85e57b96b9272929695d20e46024eadf0bef4598", - "e020a13ea51f838b7c428dba3260ad554cf43c569e44efa922dab0f676130206", - "e53ad643b5deff3613c1551265cfad80ade4ebc5adb042debc81d06c50fe1199", - "7238f9aca20dcca7636d655eb5a0a15e886797740cf8055a52f352fe9aa7a7c5", - "a0990fffa6d10424d8c8004c7f8b198c26e51f54fd247571da0b0454eef27c85", - "bd6fe4016c9da6cf659edee42aef6c42f013371d27c296d3e93058cea018f979", - "ca3a0d759cfc8238cebb8afd02881b9c2adbdb9a0a441569df0333a9f2ba7b6e", - "feabbcd8baa0ffa2ae5befd3b980c22b746509485c761332b7fca311a4f7d20d", - "9aef709c7f43a8f3803ea58226a5b7e2563517e7418b4baca8366dafd4ba9f4e", - "8d490dc90a65a5cad712cce2c72fc042e8b7bd36f6454f80ce215dcd30c3a782", - "d193852301cfebb5e9a164e81ccba406c44d2c404ea4d143e5c47bafc9fa7fd8", - "e7c03df8e394f34ac747cb1486a51a2d95ebf99de20539255a4c4121d74ec0fd", - "17851e92436c5e3364ec2925ac9bd8dccd24ac4a7592f247b70659a1cbfb1303", - "2d1b130dca5ad627b92a33bd180ca51339a2fe3c67c6c61f60575908309caba1", - "148a2e6b295e78185e0e0102fa5e9f1f0b97370cfe16f24994d892825ffc373c", - "26cdd92c8d8e1d28c853b7b31cb8bfe2ffef34b5e9a04e37fac5008ff7c365be", - "c1fb62d0a632b4f3b1abe71f6300ea1253e7f5e7222842ab80f89bb123c0e33d", - "2db2ecfc56957aa139ab224fc4ec4f69683158f44474a71db8ffc7a76347b0bc", - "12b25769e696696a920a108097b9aac0c33f415da29dd499a252c3167e943f01", - "58be1c22b124c59b7429104f4c97ce02321377684ca7e4056672f1231d7b690a", - "53bdd8e67a1f8d21879ae178a8addfa07cbf833c2dc068ca813e6868a02db39b", - "c31adb048c72bb487d5292be7280e87519cc3f004602faabf60748e350526f15", - "8c9f5c6b74443fca3145d798dec12c645843ae5d69c951d0abe4716df6165df3", - "cc3311e2b499647f890d082fafc52540b06cc6673fa71b2c459b0366944281a1", - "18c2a09d3cd833b8a83c464f2b0fd87b6c83dc15dc3b7d0f76970d09068446f9", - "dbc41eef73567f550c0fdbe1e2fceec173670467d320479a478cf585da40bf4b", - "4ae5517a425e58bcb7a559556589032dc81508b51dd9aed318825dadaaa9cf29", - "3ce6b7be5502da7defb5424b7b50125b44903fc5e557daed18ad012b33d26afa", - "896c9e6e47501141015f01384bc5503cda11bfc33a4dd2b02792bf867722ffe0", - "780e24a8a107b34ac8270b1fd766e158ce5f3d748422b1a1f1fc750538e36295", - "98e990274ccc7646f5f74cc5c4e79ba53f8deab4fdc3f564ecfacfb5c8932130", - "d189a819068d03c21ebe09de3944e186a06732bc60f3c04b6b9735e88ceb82e8", - "fcf8db1699ce45895e69e19868698699cdffd2078fed0a932a8c140a32391807", - "bbcd3a7835a7b230dbe1c1ab5838b54adce57a72fbc5a4a3f119dd384628f973", - "782062f9a6c084452cd3f5cef9112811d2c0d57dd68f4f55b6ab627cd45e0e9e", - "16f39fbbc71610748c42ab3e8deefa21a76165af375544440902ed46fb038290", - "884cf6687270c1afb9ebba0248d91eded372c9a25360af5f7d8229daf29114e3", - "5f3ae3cba375d721d81dbe798fd82c5a5fdb38cda4b030a334d0d20cc6f73927", - "745c9a69f4c5cefe0aff874ec8649b130c960ab381e84b9874b3abcf50d024ea", - "a41bea02da1ad8a1d0e8ca01d5c78361660adce40ad4f7b1d6b6e8be146faec3", - "abe20376f3b34e400fb2a0123f2f1820f8a2f5be64b637d57fda7615aa6820a4", - "b4d4b8b3fc97c6bdc3881aeceef61c8c3d02c0ebb936f5dfffab0237c565414a", - "e462f049828dceaac4b57588be45da4675e2be54fff4ca26c21b1ff30d605c1e", - "d7414eca6843fcd8c74921628235cda8300f46a4b22fc92184c9685dc34f8468", - "a18bc4db31d6e6c5b627ef4deee717549b96e90d9139782b73a95e128b8902f7", - "6f051e82664cabfe5fafe6a41891beaad139210663ee45433ac5dd689133b0aa", - "12f50fd63262e7300c2881bda592627ba325d9a11a321178ab860687ede7863e", - "57a2fdc9d674edb59fe37a44a0bca1da07bc2f12e1bc71f57cbb5feb825bff75", - "e3aebf6db628296ae6df7dae009efe04a2527baa3cd71c8e0c75eec0fde3c76c", - "3a299eb7da2f095a53cfb63ff4756ac89d898759f0fa43f3e7735bbf254749da", - "29538d9a864f191fe28384e92ce7b6ca9d4f6609f13be7ae2d3ccc90009c3718", - "9a87d35730426c9d034883e12f4d9f0f024a4748c4a80e4705b19c5b4b5ea211", - "8a9d182894213ed5ed4563991c1cf7ffaf8de95da98bcb9238326fbb1675332f", - "9932018780d605b20143a69afca992ccedd9371e0783d829a85022b1dd598236", - "bcbf8aa573abd95c17c22298a2224fda26f3739888a614574ed92488826523be", - "c2f959aeed48a028c257b949270e53934c398c9f254c0686544f8fa2efe9fa57", - "89f31e0420a9f926bfe38a9b3eef181960afd36af710e8e2db915e9f2e30b486", - "0dfe33989d3f29e84a0d3202e937f0caa95b310a0254890733d5af3008337895", - "228f46c552ca3aa77598e0b9f644af37b6bc8899c6e9b69fe9199568ac5d6019", - "c00d17b059c79ee496d03c889d3cd075e7caa7e58a7164d54d1fe6ee086f6ab9", - "bc6db62fe8f9472fa10fe28f1af01e627ca472d74a4ac4733232d210b97bb093", - "83cd7d81cdcb8460ad943f5da2a458173e475e8ea96707907ec59d08e399a373", - "362ab2c9f75d3db4f3a1cf0e32595f508868d6cb0c69bebdfd0a3a5f1793e979", - "b74a210d4eea8abde92d0179312e7ae5caa86951f66f45bc26fcb1a8f3bb61d6", - "76c47ded55689a30cd2665443917378e0e418488e024ba386f662ec027d3064b", - "c375ae45ba4c4bc094894d7483b64b57b89a3d9a6ebf0c1112f24915d75af130", - "06c46366c1ee7b33287290505ae7d813ac7ac8044b70b71780355877263e7f5a", - "c6e91f962d483a78df77b0a215c73f43b8c4a4638aa667377a2373cf7c68a0ff", - "552401155077d743d4a08508833136647135b2df86eb6d732d87204e18b6aa87", - "d2862e306c27134ddebca6ac8a12c7f609c4a34cd8bfa1ac5b260292d9dc97b6", - "148e1a34d4f1222fecfe61cc68f1bdcc8d2b0b0b90efbbf56bd321c1465d3bf2", - "84695d2e72a952e80a008c008a099641eb6bcc36202ab0dd77842ce2f776e4a5", - "7cecee13eb45a3bc318f75473209b05f7d65fa5751ac027bfbaf6933d3b3bfa3", - "24ea2d6e607fee736fa0106d325d8e74e42ca59a1ca7fda67d23185827244a74", - "3b2ff1286a9bd87304ed38e866f066bfe3565daa13e70269cdb944d5d4df4eb2", - "662c9e2c5727a474d327fd8b20ee3fede38ee6e9fc9cf4160d635d2788f662f1", - "716b8ce549bb8342f15e66894a17f328712ab57a7905330966bae29cb8748506", - "8027cea920d5ccc632aedab5e64655115d5d33f8b5939158945723d39f24373d", - "4503dc1ae6f7aa2fc21244905a06f7b52b2ea937d31a61e6bb62abf3588cf5f2", - "ddcdf517a1530443c68d1efbc6910c02bd2c9c223c79a529927823e91dc8ed62", - "1b52b4b0cd49cbdf4466d185ad10411ddf40228582432602c08490c2f5a02185", - "6c0bf1b999fc61d39bb6f557b629cf73e62ccf82026bce4a9e16a83fbda3f0d9", - "292ed674a4f663b40ab9cdd43967bda8abb0a50cf8d2133525caa8ad49d83bcb", - "146bb7cc6faaa0ea0a4674fde9fc031a5d25975934ccb9bd875998056337690a", - "dd145bfef4db0208ec79fea18cbafbf1ffd9e185f27fe129f8c4a126f9311c77", - "1455402aac42c6091987794330014f6a2cefaafb16989a60889a5bc55ed95e29", - "007bb52e0ecef01cfd42d70e73b318c43020c40b74963c6564e92848f9033ad1", - "1e7b29639c7519e210c599629a6e9ece2dc964c277ca7b26b181a500c7ee34b8", - "f12e3fc85bca5a32e55d7ecf43c3c5a9902d5b093f7bebb6db0a70ef89c84032", - "87fe967765e992e13e3deb55152b0732e1d03ff4c6594574efc9f16b860b117a", - "67b57797ad843824be1faea0e1036d58aacd25e8d06e02ac10f25e0b71e50650", - "6b36d93af0f04b1e67454d3bbbbb60a53c3dcb23a91b98ff8a8a6ed5c2395d69", - "4dc09a73302f2a5fbc61341c719a24cdb01698fdc915c42cac984752601b79a1", - "3b4699a21f983de47917faa82992db648ebe656a1ae1e54076e4ace6bcca5fb9", - "fdb89bf0e40556e3849ef7bbad2c68cb659487497aeeca2cfd8fe56e72a61d7c", - "7a0c4b5074f6c5d287e828f0ccdaa4ca185de4232c3e09e78e255a65a9e161c4", - "0baf1e4abe8241a99c912d958daf9e91ccabd07cf3f5fd1bd87421f1447e5ff9", - "2e2caf428b86e8b6409c9e4ccccb713c226477079740efe2c12c42c13753e087", - "781921bfe2dd724c5d0f994ebf98534a4bdd7d1dc13bcccb85c4f776987ad8f1", - "58dae83ed89cca2cc01588294dfd08c0893baf8031f8fefc26509162405e3836", - "2f72b0dad76cc8bf4a65f0b671ea43ceac762530b5d851452ea337f5f4561221", - "73f572b24565beb44b3d78e2a45e77377e0426e9bdaa3231a50ad88427224e2c", - "aee008d41b1e0c63fb5f03db76d4b93c29616cbe924e26400ff65ce05dc9de6c", - "ac85cd7e79315db4d8a4e4f070ed617dcf551a523441cb94b438ee38465c3c85", - "0687b48ba2020dc4c13f5ea18ffc10e4d531e848f938b6341d712bf9dc0a14d2", - "5fe8fe00f611387c2de3bc61644b1bf714ec84867c9e61ee1f4b97e7986fc054", - "8310989ad3f2b4d07723e4ef102ec6df10387560abd68016f8d349451c999c1f", - "6b873e6b9adec1ad69f9ff33c6c51718086921a773a44f8290be7061eabcccc1", - "408dac50fc7b79f4711d9411acaef7a4a8e6260062ac25356d636cda18affc9d", - "e48b9bd1a3de1519515ff65cac9bb18c0f45f3ae4cf7539b8c964aa0dd1bacbd", - "e93449ad1ce5074316211bfb8e1283a62dabc62d1e0fd4d082aaa77650aeffa8", - "90c6d7da4c58528d620388fdc5ee77f7c2406e7f49aceef0005e8adee354baa4", - "500544ed765344bb590ebb5b75514ac49a393813da0fd6e7fab665ac95bd3f03", - "517331afc168900c8eebdef1ea9d1d402161b9ede47eb1536c4a346b4a5a80b1", - "770cbf1a567013b6b15e4b054cd61b37d09c036d6f49086afba9768d055fea6b", - "2da983c710c85af60b7610c23bf40cc48d8db92e088e81aa12b26bda3067b092", - "4ca269edcbc474cd9edce44cda4c6e9c6874bf6675587f8300e341548808c401", - "2881c2bc47600c1f04516d68e20d066595eaf91cec6f9b0fbb45ac252a8fb12c", - "addf85c73e18d14c303164a6ed895f064ae45ec50ec60a5d6abec7da2471295e", - "e7367577975e50e5294fe0af0c03573b08cfa987929470506e7bcae5e16ac6cf", - "dc705f9a59050d3057a57607a35890de678d48a0311212ea5d866b6b3fd320c7", - "70540048f56d9b76f76f1977891ceec585b85a05cb29bbe01d11e8b5c9f4bc6d", - "56d1e0eba3a45223339943ad90b7eb3d65701c5c9e432df23355422e073e42ae", - "7bdb96a30622a23bfbbb07bef4720a83072f7fff4c1aa4e1db498db91534ea3c", - "c440f3900fcf2f7301f43d064f5e4893b25b51a981c8f4a5818ee54cb58482b1", - "832e60350e4c566e2a92ad87699e0aa61d3dd88496dd5064f46dc2d04eb6815c", - "8d38910ff27a6d19a76a3deb1516c4b80ddb969aa1a5fc2c2e0609638cd68199", - "9f5e024694a88b2d51bb98660853f678a7f5b1c5fd23a65f6aaeac40944b8cad", - "712473825ee955ed55c8c2be1af0ddb46b77c290f6ab72d356c4ecb370c93811", - "093de8a21a4f0ddab34f04d655952273644d4525e895f3facd4ca6cea16c206d", - "8c18682db67f07d3a7c4db8a5af3abc4099605e77849703d198b27a2a7d646c3", - "ff01f3173fb7619f9d1234874d3b894d719688e22b51aee690fc8911f5e42a54", - "d89f3c7be9d7a709dd358c0878583c96c46e51ff12d9f05fa3b86c1607543c12", - "24f56f94bd7cef8acb49d426404e172912ece1006e508b82cb04a0d3570feba6", - "3ca857e418e781c52d47fca4298d1dfd687aeff2eaa6c11e7510d17429c32019", - "9748b3d7d18841db54de4c333383b9ffea36d021c726aaeb0264d4d577889949", - "9d6151d906a5259388cc1c29d83ffafb73a6e7e20b8e2c9a76afd1236ea0636e", - "cd21133e12f142acf51046c36d1416e702f78256a3f4604cc2db0826281739ab", - "74fa4c0e3291fd16c1599b109cd7adbccaf360733827cfdec8e5e59686afc9f1", - "145824b6c548f6b1957318e60ee7c0c8906a9c0636aba63558bdf0281f9b5762", - "5a81f706cd2b6b484da80f20608db74318bbe846dff0e93e3673cf0b8d63256f", - "a2536d9f0ae0c1bf9d2632e545ddf8e44ac417146c7670c7da633aac42622fb4", - "46758c700b2a101bca64dac93b1b35a1ab081c020d80dfe297facd7b43acbfab", - "1b96d9a0f9d8735e38a1dbcb04557d40c40de64045f3fb6b58e9f4c88db31744", - "4c6f23428edf923f9e83e01bc71c55d0bcddf355945f8508707e1c2ec4f14e11", - "141d631db21cce20a04ded1e600187af9ddfc127117cbc5477856a8bca1fa88d", - "7e20931527ddcfa4f9a9958c3acd98dd75028b7647dcc840da7cdcb11fa7c1f4", - "3881daf4f1a92faaa5e907ca56fec992dea11519abff3e2993a071eaa7ddbb98", - "3d42c4ab459df07dc966684c4ac503df4babf34e9013f7f170962d6f023e1912", - "cb74b8a6fea8a3414f514dce2b28c1902e17a25867d8e714302f92e50767ad54", - "8bcf2fdd2fde7df6a23c17c793593766a8bc9173ebc043467dcd931105d1af73", - "60c043f3778af7245f0b41d13192063483af7696c86eba6d29daa2f83138cbf3", - "3aed76240a980456261afbdda5c7b23efe1b4fef9225308775c7b25373534510", - "019e20972f2213e87623bcb304c86ae51a4214d161a7a18394f2b1fefc6e7863", - "eebdf2d7f4858b0c85ece49f2723b2461d0b077018459afd131e5aeff815d0fc", - "f7cf2fe4d802f5c85832293aad13034109a32b8379c7f8c595210be40b1a179e", - "4cc0450b820983e2d4b6ae50454f5b7a47adb90b26e63cca944494fd324a92be", - "3ae99d52434438f686053b17e8c36245b06be56be6e52ba8f3866e6d39c2cadc", - "3e0902c9fb67e45b249a646dfe4f97f02ddfa9c5d5fa20ea4180daa160f7d7dc", - "86333053105423d00f68e00bbb62e377f81fd713b88adab415ad4318e3fdee0e", - "91956f30790105bb9ccb63f11ae2cecfe6c4c90ac9a79bdb620b4434243c7182", - "0b27688a89492b20a76181f4afba44c4cff8bf51885b51fcee65c807f3fdf487", - "c9518fcf66181ded4db5c7172e06434ae355845e52c48a850361653b74abeb90", - "f04593c23ff96cbb816f36af7c645e20e57e436262ded6ffffcbd4c4c8cc0d1e", - "c68d72601568ad00fef0c47b9d5fbf587125fd46279d19dcd17d7d40fc77f85d", - "8ba000bc575c72f5c20462421d743f0947e8fa151609f892efa82030036ea35d", - "bfc4a174305a20e7b5f76a48567d76b122a574c704860fe6e82f53d43f7f169f", - "5a6e37fe34eacbf199566a3ed99f94cd5f9663036e8e2ef76a7e9fef384d1ede", - "49afc7bb3cff029f14674bf2acdceae727d6be3cdb7b98a80fb4af488c76d5fa", - "712ec74c615a87561b398fd7a9c2750e8a09f6b3720e169e9e48a36f8c9788c5", - "dc25c9cfab09413515785d86035622c6fbacc54289e75cec5130552a73e9eb9d", - "df53c7b98d886ba05f1b5ee53b608338748ec19423433cd6ed8ded6994d53fae", - "31626873a12f1b727c0f545189df345052a1597b291a2edb9711b2a76fe6d654", - "bf71ff3ba762892e0c531a3c415b5febacf55d9de6c9b3b2ed28880a4cfc0f24", - "03416ddbb81dedafc80290a9c00878133a03bb0eac8965330462502c43f63fb7", - "e53931f24af7c9ef12a74fca269ebeacec5f0596bc38c5d20317e4f908accd46", - "3b420d80240ecf42da529c0145c30031474dcf2aebcc52c558197ad8223c3f43", - "980a7eebf5786cdfafc6ce7a03f2fef4a2dde623d0ed778d5619f691df48e7a9", - "9aff38c8f845ac34858ebe297e353becc548f9c0feefb7a701a0178a6cea3098", - "f8937a552a3fa52ec9edb138dfa0aa757109e7ed0fe908878f06dc97f14e75a5", - "3f500043b01b29f9fe7ee6bd3c6bfd917cea75b583f4475c1b294d868d7ae01e", - "0efae8d8770fb3dc6bc3c45db546638827b978aeec32e45b4846c9b8ea383405", - "4feecfa999c8d6f5fe371d7efd6480e1eb2cf1fdf527834434193cc8133664d9", - "79cc0916fc0e4ad2dc6f789599e1eb8e6b1465b13a0efd1f2c65145c923cdfc9", - "13c35962099ca5137fb93a061821581140e0dff24546a2f6d4c247b1bd6f5968", - "11e84645a1ed5cfe0d98d11e1ec038df50909e910366a4cf1161929e6a3b50d9", - "5745b0fc00a6bdc26498e9f4b37b1e9e4249bae3d911a43e155ca318599d5c1f", - "c0c79f25ea7647fb47cfb0d853c57bd30e28c2a084ca88f37e157ee679e8f07c", - "3259f7dd21e85d650146a6e7fd8deb8fce893ab8eb4cdb3f4dcf6e9c9ef816bc", - "62e8c5d57c9cba5097033c7359194f02c7a86fb4b0cdcfd72e32b61d9e66bf45", - "e0352868317d9cff99c006311e57c99ccc434a79b4ae8e3dbfd729611965c078", - "bac38e0f2dd27be2931e26935f95cdaabb7f0f4db46da734828872b0d7545455", - "69912914f943a1b0f9496c3ba00139a86f81c73648b53d39bc9002340a1c2f45", - "3093e806d334042043db76cd7a5297bbaed8a50f8a3af02983adeffd396b3e16", - "fe0eda8a52e4471439f8763261279c8a838af2713bd1acd29515ac7299dddbf0", - "e5c5a3275c6c525835719843e44cdaabdfb76ed05983def34733f76cc628309f", - "9e3ea6751be0b117c0c2e6715bbbddbb916671d343ca5bffc10cee7e72f9cd17", - "65f2db1beb395fb39a07e5e2b82498819b725c38f9edae8a1cfaded3626e7e2d", - "8c2bc81ee94857e4335bce2a2379c8e009d8307ae2e1deabb5e1b019a5644644", - "e6e6a9ed9291f4dd4dc4130fe0b7c53b81290c8b000107fead3acb944d2b1944", - "7dac29d174b49537607c0733d677b5f7a3c907fd07ba3edb5a0149c222b66542", - "93a27d58a94bae72e529900ac64358958e1b387a8e8d51ee4ba41fdf762581e2", - "4e57cd7a9cbaabe542a82f40d812932fe54e29cb1c2e3ab5499ef5d782ed8bbd", - "f7f499dc984ef291257f8e18dd98507fbfd769a4d1f0f5ebc079e5d6cd49eda4", - "87ff9cdf40a2590656ba246005ed63e8c74b7624da0bf5da40aab9adb14440c7", - "a482e07107a5f614703f7b0e71b08db9862e00fe7d1d477bae3d8bfa8f69cf3a", - "9b7d88d49faf52680f07f2a8272d137b12913d2a66f3ec4498de128c472463c0", - "a7abf62053fb3b82c84aca38b687a8f6de8034cdb4bdc93d3987b0d151f8f9ea", - "9b4c9bd883af1dc6bc1930711550cd564cf3fa04ab0ae28b58dc69902c6cc041", - "307e31e80a5d201aa97830b882ce2f8f605ac2e23111ad96f1d0a7e8fa8e91af", - "ee80940b51836c90627af174a4f19cf8caf205c5702b91804b0b312d0c942127", - "4cd68779c258664c10d5007a40d7451e1aadc5140fcd8e80605120f5acf5c939", - "064ff51134e4567fce01bc18191f88b067cfa8267069e75e90a9f1c7aec3d949", - "fd3ef88e3a9922358b8adf7861abe023a76d5ec9dbfbf7a947e70ebcf746c2b9", - "26fd41a47085da90530ca7c34d3a671fdd19abd039aecadca01e70fc0bb8c480", - "6ed18a41759f8245659df6d4aaee67c92a7ec436a298743229b416061c480b98", - "403a7ce57467148bef0a67bd9fe6c7b5bacee9eda99a3155162c224badfb2617", - "e528e0598db82ba1970a04f6bed86a0069bb2e16d4867874c64739ecb518f37b", - "11a987d8c3f5735143bb7ab2d798ca5f77c973f106f3b986ee068f3bfd8449cf", - "0d21276cf13970e96a79de669fab27bbff1b5f8ea2e18ddae26a215975719ea7", - "c9c8bd50698aca8ffb3d587fef91e662d610ff3ac2d40b62adff396c40920b0a", - "1fe2f2474cab505d6f4f250f01c5bc68611db46c39efc28dec69f7a758b33984", - "41e04f3bc59017946b2612f89a97cb9d16a153ada92f42ab494aaaa10276f611", - "4b3b412846db80733b690a0df2dc3078bde57a1fb40ba383c72d678804182010", - "b410ea688b6facf739e2727c6cf7c4f481f66c331d259dbfea4b1615576f867d", - "2bafea0f832c9581a308c6770567af918b3f2aca3790a85caf488b6ccfef719b", - "b8ca1cb6cef352b52ef5721853413fde2fde92bec366ca4aa6e5ca6c98f9b258", - "9ddbb7b6c19462afde016bde9a9e3c11761c6b7228c3fa2212e354f6224a30dd", - "1036ab4c1c400c4a6476036d46e8be4471634834bc15ac7bee618ca1b207382e", - "3254d006ac891bdadd83429cafe5c1954a44de8a7b6391fa691e711455817166", - "cd817eb31a7939e0b6e4cc0a77b58e10356c1a2076e4196fcd0dcb09f3858b70", - "a4361d339d35f86ab4492c1b8d40f1bcb7d8366cdf7e0c1bed93955d2fd09753", - "9f0cfa84c4e7233dc12cd732007cefa47b7fed6a0df09a78bd0b83327c3cd4cb", - "83041832eb258495181a089a6688d03333c2af6717db18e15cdbd1f57e524b44", - "2d4163bdb962459dccdab874898f337ccb0652a1860fe6cf29f42daa2d16d5d3", - "30b359b3963ec9230a4c09d780f1d17d83378ec58ac162a8229d8da84bc59b70", - "ba75f92d91fec0246a4ec4f398db3bd2c144f6a1d0e396f665788c4569a5610d", - "e0416717a839e0512433ec957b02d28e90d3811155f4be97c1297a03f40babe3", - "70f3a59ebda926440904d2f63f439c4332bdf1edd1cb076a0c79faa7c4bd95f7", - "e599b5a69b44cfbf803d416c1097d856be94ac5c2485375a72f41d44aea4da2c", - "018047ec76538370fb92cee59614866e0477c42682a04276f70bd526afb9cd34", - "a885d49539e362bd54d94019dbfa8cd12c4e861fed77c1f40cb3f534b494a5b7", - "f31c09cf54ecaebb40ce3f02be39f045eb8df26facc232568bc908a12a504c23", - "3dbaeaaddafbb4e7ca450a587447d2931fd52eee616d3e40ffeb6f1da35e2da3", - "5909c772165b226ad4161442cefd5dc5fa2420a5c93d35c6e53d1785d5ff6f12", - "dd4b15a1a43093e60e0192e60b26911a485893737471bd43da9aa090ea0c7f9c", - "5cdba88758b6a5f86a27a250a8c4743a719b91eb88bfd793239ab4f2af19a9a8", - "cf4728c525737e6d4303e44aeff455ad930788d06ca9fb6f87f6459c7b0ac722", - "bc4ac67aefba0fb69fe8a37c5dbc49348b9c402fa93fc5fe960c61da82df0d72", - "1cb2e010088d2ba8f1c481046cf17a335bcabe8094647e8b822c94d36bb48bb1", - "14ec03bd209691258745eaaa4c85662d12e535067e2a6faa145465b08e213b01", - "204225c1d9845ef9925bdf3d80b08c84269d632624aa112b453d69ba5fdd90c1", - "22842ae5c529db8a6ed58e5d5db346d8d29ffcf5df19d55923099dbde94145ed", - "cc953c86e2e757e786510395b1134a6c374b603c50a3fc3746bea899ac267ffa", - "45f4e7a7a5e48cc5d5187255816f98006bb485efd384a67178b519abf6171c7f", - "2c895d72eb90a3c54825ca9cbb38fef5990b1a6289d9612093afc215905b512b", - "5bf73ec903cb6f67d2d613a1680017349025c6c340b5120edf3c81cf897feb3e", - "bdecb3a656660c4cab7285763b6fa79593123fee59d6800e8d01d4b057a072bf", - "7f14b3b8e1fc1f13e73cac41022d80b3aa5d85f42e634929393c1b94a14a9c1e", - "df62aa78af381b3c51b7dcaf9cde7f7b840b8431e6e282dac1102b65e24acec7", - "7503d3b04cc799e86c4c385326bb1a6aec9b9b7ade84ed5ec191ca5ac06a09eb", - "4158683318a6e4fafd17017d27e74e89b596e7827173e2012e88f07c4e37c9b7", - "1fa73a389faf720808aa325c772488389b633ea13acc4bad3c1b9c51cb447979", - "204afcba271ed66bf49d4fa6605c4dfd9b73e98d129408bb1e708a7800a95e90", - "ee196c3e6061d899b8df318343c7cf28b22bd0bbfee6e135705f0d38779a3de9", - "f9f0e8e7d2902ba57713bbb364116f7d887c779dceac7953ed3b1368812a989f", - "3a1ff6504b52cbbdeafd310a4a5f9e71ab1233c8c5dcdef917fd8c039f9849ed", - "79ff01a219dd2fabafb9a27d82de994834f73a4d8dbbd728364a64dc9b0bbcd4", - "f3416a24e82cd58de07d723acfccdd07c42b02ff506a124b19e888a8264dd633", - "c3f75d7fe9a719cec591be5859cf417a1aad860001104a2af7f2f4a65f532716", - "d8c5ff9479aa5573691fe4afabbaabac5f17cd4d2d0a158259f6a5aaf3a2d6a0", - "d645b34f4727e502a1725e91ec55045b677ced4c282d3495f13b7d298542a891", - "ff9c3089d4556451f7b0584a04ece7d5f1cac480f5c7a9b5a9785878ca5c3d9c", - "e5cd2a9a9747c366a4a747c489143451b47e9aceea506790924fd19bc334702c", - "4e91a51117ff9de7202c5b31d3d6d78b19c768aca4940218bb98c4424c20caa6", - "0d18741cd558c097dc260d14b970157f0febf3ab2e59cfbe422b36ae7463fbf7", - "8e95e5505e4bf3cb5f63c654e847aad73c23872d9882c2af5884909f1cffec94", - "5de0672f6ac4dac3e3a18163f82717dedb45e7717fc7aad728669a55f114f79e", - "370d3bd6c9ba63120271955f6ddb8de073ad070dc0ba31496a29d17cb2f846d3", - "a3520f06f3fef5c6c80db306b94fe351e70af57177942b66907a647483986aa3", - "13556bce585317fc0534b36c1cc6c94c535538190a27d9530d13c29a1868c060", - "81d5e56a6f4302be8695f0dce3ec65108048900412a4406f165c827b2497f287", - "41c17172354c2d32a4780ca1af4928f1ca51cdfc3036dad3647cbbbb4a3c5519", - "5d71e3ec3237474393457af56640be47f6dff2189848f1393da52163e61115f8", - "e2318fcd43a96efd71597ddc8f978f3a3291de1b7424ec137d203cffa094c04d", - "04aed2b38cbfa1c7b1965917ef56638a0d7c087c86329842f95d1db1eeecb7a9", - "c62fe553cd1be698eebf6be7f26dfba6fd93ab6168eae692fe16da9e3b4e6c3f", - "859d449fe1303ba8c004fb12010eb9f8162c90ec00f6e891a20c1143fc678aec", - "07590ee4cbd5c64d18f059c548fe18a72f3570a81777126724945291095e83e2", - "229ec79a05efda244c89c5395c444f254aee7a875937f8eea008c274e9d32a75", - "1d9d85a9101cd06d143032afafaeedd68c139bf141e03b14d7cc6b81b89da510", - "b9957846a3a0c08d2af46dc959c7e73a1d79383012f3260e56d7d2f16f33a159", - "84713c9f87978189d193f8046a96767cbd25994d3c399019ad301379293df706", - "fde6604cddc66d0b8d58345e71983da336965752f1760e9b98189f63fa167d1a", - "8679bd2c7bf7460c256dfe438bb7c09d851758bc3a12ebb0c56d71c2ef2aa013", - "88b95b9289ba7dfd0775a9fb78620dc56746209298147700f566f9aeb1981559", - "4af2d161280e6bf5f62b390f773f95b8372586fc773776183de691a4e4fe23e5", - "da4f30d19453b6d941e3f04419fde36bd40666e7ef4de0b34b4872d8ce542660", - "e2dbac7f1faaf6c3270ac73b7304e656a1e917df4d1384c4d97ca2a77f998463", - "80b598a6ae23018fbf3210c287167d2a022bcfadacafb46c8e6259c384078cdc", - "d726490e8d2903fe4aa3aa4307aa52b04319e7483c39178dc959fbf1b9e358bd", - "1bdc71ac6f01cda1291269a4a893535a7ce25e5b1545692ab6ba4e8b65ffc17f", - "a54ab019997096d8f05b0d0a82546353d6ab3a386d0fd1517ad0dc2387b5b340", - "ee5f7e788b947b46f12cc07e79f37482d5987e999b2235ff7c3081924493e30f", - "eca8b2f10f0bfaf24997a5161e44de7f08792c3a05170a8d021fedbfa651f3a3", - "8edf77d60ba089122165769f330874b7234c79f36c20f611679487d7495b6b15", - "60e75cb9dc9e9e088473fe30348f1266218d43d6c9b46e6f2a8c9f35452ebb29", - "1568ffdd24fd5dffcaef87d7df7b4f08f14afe9882d1b513dc14ef1472d1e421", - "2d6768ef117289b71187af543bf374e223b5a79be0fe47c1a5225bdfce688a01", - "b3a74303ee531822b7c219910b72a7aded76afaeb52dd9f6b258215ee026748c", - "75ae07ed108563d175b466f76b52564a26fdb48d5d87e6391489b593833d1ccf", - "5696672c469aafd16153e7f716faded9ba5910b4f6dabf86f3de4d1bc080e856", - "02bf453b0f30f08acbdfa5ccb4cc3db858c61b600f1f6feb085d5811661e1032", - "77e10b2e1b32475cde7ea327f0fc6898854d0948b3de0de1bd09b2e25eaa4e9a", - "210e45f9c34618e52ae5234ca2da32544ee94dba9e009a895dad701dad847886", - "6c665d86a903532698e2bd85a28dce05409fc1b492895bc28a4afd4a2052dec3", - "0d3b6ebcde314a8aa491f3d6699eaf104f27de4267a9d1dabeb75e4297517169", - "e9fdef6ef563ba39bbfa1027c9cae967fa9d5e261926fd17802094513d855d27", - "38fb63b005da56135c9bbea17285d55fc163a24719e5e5e0d01f4697c1a0bb20", - "462c30ea13d24deb546114d4f328caac4673b526c4c25c4fbfd592354cfc31b0", - "328a0c976cac6d88ad881edc6fe1f83fb10028724daad5bc20516c8b9e220063", - "f054007b09a1109af150cfe21c4b2783545831ec061d805066963524405527a9", - "6df7fd4fea277b2b7f18b9d3fcd48a48ef8126097df070bf3ad34d1576f6f0b0", - "5f89c036bbe4c2638d9ae408a2cbeb5f954b07343b69334b7e7043f68301f610", - "90ccf3c69d99a343a62fd28ca28cacaf2521bf308975b01c80869946932a2cf0", - "20353667005f50d32b4dbdad1d0928c933842d0294eaa883b94d86d78dcc67fa", - "10f8ab559afc0d8e1f5701f906193f1ca66107ca0c5c878aaad58ac854c66f9a", - "8a69ab2e65391b8c2e5da14284ba205c6c006a277745c22b7a1e16547773accd", - "51bae676b5c014cb8bfb2c69355cf1e5453e3010b6eec7b8ed2d328795864f8b", - "6f5cb1daf7b3ef39c31950165515266aa651417daa9b657e3ceaf9aa924dc36c", - "5528d4e0cf3c774bfc506dd12576b16326a25da5299a61db1de0378ae1b14be5", - "dba8be532cc2848a33096b11958849fa9874f24966860d1271c58e21652271a7", - "2e68daea9d6ea3bb204ef4e655bf257950dcdd04a90b7e5d51a10ac06d647e54", - "776139fb7a6bb3e60b567aada098a555750464e840f105a3e32b69bf8fb9b8a7", - "b7f8c22352c451b7b66c1bcb5c53659a8da4f167e1a8c6cc98bf35ae71510219", - "2a22f85a6108c53824ac116b80c0980ce07857140a3a834d1722cbc0efc94273", - "a22dd7a540729ce2775e614e43793639714ee0771674b91374459ce8b24a989e", - "e32d6f801f3488a4a3d60ad922149a09a1739c399611519141b241d20c7fa367", - "71a15d8ed4cc6b89f596b00dbc2de00c50b3c9bedf2f7aadffcfcf1addcff305", - "11d75e72db30ef6b6f81ab0410e882c5cf6f46c650535a48b402dce996551168", - "0ab018943b700eecb51afee9e1715e60b8e222eef566b110b4c6e0632397facf", - "a2c36704a5b4216503dec25969e91de31f16f9f6420849cabac87668404c1a8e", - "a795f237d2c4c750a65e825371f93172e416f39a0d662b1c86c9a63b3ad36f3f", - "a53a0b111f28282fcce202fb355d99c0eec65f3752415c911387298c89c753b2", - "d99677d4ce3f90aa3ece31c8b23ea84458156e10707907305bb5d876b3e01250", - "dcea383845d88dfd1fae3b99c2d38aad2d83ab8cf55f24d20324f07afda51c54", - "38f6263e8acfb9e624d3d76bff33d43c7b13f33dcb930413ad4765d06ed9aba1", - "0bb5b4b98d8ced96bf934e4f26768ba8df40a857daa2ec0ff0619002d4b5d5ba", - "d81287c6cfe709ce415729053a6e2a49d7151cd74928f658d336b76260986a9c", - "b0f160a559ebfe5cdd7f10ab5a47dd28a360c66c0bb8634ca92aff021ac3b288", - "12468c393e6c87ee81ee56ee4047e9ce2cf968a511ce6756b5da6eb352dd9a6d", - "4424db4275563fe9be97e6abd6f2e5e0af9972df9fc5ebd4d21f17dcbd628d2e", - "168251fadd1b4515b5d5589cf3df81e65c4fe3fb312797449bca3f7fa625f888", - "4c2c0e83cb4c03012ca26b5b934a6554424f42c83bee43835a3ef0f2928b10db", - "383a186b9eddb9b14abead2ac258675d4b26ce134a61526787b2b97e38dec5bc", - "9285c932b8a36a1f9b0a5d0c4c7024aa8f284d343c50848f1522671e25435c80", - "2ffa7232bf0621449fdccd4b8c890e7b0373f18d5d48b8c4dd14ebce9d957ad2", - "b6c4e5132937e6cd8f963a8332e108ab8093d1bb988e5e88879199a0d52edd80", - "eb8f3e35d516ac934ca030e3f775decd192106e52a08e287acd99eff4704e21b", - "7b317c4d4c5edfc6d45369f249ab4cbe3c969f2022b67eaa9e7d7aa8cda4593a", - "1d7d4a189c800a3f1d868942ef956e5ef025682493e7d4e98fe7955758bea31a", - "93257a1ed2424f7f6de86a4129f64ec7c9d25ee6c256182043f652bfc7093afb", - "daf6b197587c64a50b1ba9b18f2540a8c7d547540e371b25561d0d59e23ec04f", - "92554246f5bb7779795d3bb6b5c827ee883c8e2348ed638e70cd05e1bbb00c27", - "9fe0f2b6e5541b1796711d846fbe6915263e9d1b8588f6e2a741cf640e57d099", - "02d951e751f8a234c914457b84d2b2b19792bc6d9f980f461ce002ff71a4a4dd", - "67afd971e5da5ad22807aeee3003a7dbdbfc6058bd5257f8d10298f14ea63689", - "ef52380263b01f486c00367c300a5bb481845131753b8805968f8542945654bb", - "1c6ed78b7d48fb0452318e1ee84640b71752956cc27c5592dcec77d96ba4c898", - "e381965ca4b364e705c596f9f6ff655ea1589dff43c5681c7da9faf788f4410c", - "48003758262672f6a86fc712ebda2ec9d15daaf097947a5a06494cc2013fb9c1", - "57029c64e3f78370cb063cb4497d17be8c9c64407369aa8f001139a838b0e2fd", - "2df4727cd4c6e0447239185674f82924eab7d684cffd8cd70ee4a47a5ba6affb", - "03c77e752c29bb63a1bf16dd89f23c0df25f6a4eaf2af21c6a6c9faf64b06ea0", - "6b50b3bde2c2bbae8990d79905887bde27315f69ab79c987809f85229c1c46c2", - "9e5b41f597d7a0e7ae20c6376cb51597a090e870422e4af96315ec3c65da660d", - "fe151054afe207d5e16ac01c667b48e7d38a46bc1b77cf51476152ce6bab4b33", - "38c528d64b9e021462454d3b1c4d495556310a22b66fd45eb242af27ee59878b", - "00e4335c09889222723a1b676cf49a02eb16ff4f6a894ea8899616eb38d31090", - "54faef0367421f91aa2624f39309ed7c9e7e3ebb12327b21d4eb5e324e2010a1", - "8eb2e56d27973c4e5c3dc473c943da3a18f6fd53ead11c464c0067c9df0c55ef", - "e0232e270d32c3281d6bf21c610db80a727f2f6f1657cb6710f97e0f88fd90fb", - "f7dca0a18be3faca6473818b6a5e267863ea963556cb59a02bfa6d7639b27a20", - "ae1335bd15af508301c204c4cbfbaea92b8fa967b51081488ab7af36dc901361", - "25fd59552c7b230d2ffc96f02dd7c605e73f0e99324138356080bdc161754257", - "3be68eb725385fcebf2a1ef366cfd54a3719e3e51ea8bb6a76c71d9d4f5c975b", - "c622e2e48639e30f8824bf31375b95fd38daa0a8ca66f47af51aaecb3b1e2f23", - "c6b6d0de04418213e571025be6861973c4bfb83538e2742d1948d7ad27a2c734", - "28c9adf5a7169030b5c0131c1d7f499a91eed6dcc3724aaef095b523aa81759e", - "28c36610684304d6176ae5101fb93cdacc0e429f5f96de473e98353f6dabf349", - "9e7eb1e78aedbc646ca96304a4e3e358a98a040fef64c22b9d4a92cd5456ec58", - "939192a15b8aee12a2c7bc5157a539d61cb404709ee125effd0cd4179189b37e", - "d6c5113f75890c5ee47ff8c67b7209e31700dde1112735be8881a669f346770e", - "0a07bb839537bec18c6f5f014eb17921f67b85dedbf6e5f29ce847acbd2f3984", - "951e81d0a3854f9dea988588e727a745c397edc5b200a1cabacaaafb6b7afcaa", - "ec0b96de0631c1629509816592e533fd0692d38ebb95c78ecd637c0171349b42", - "53aa6fe2120e69d33713058254109d1f8999ad17621876aff4705870e9d0ad51", - "3d71a4a162dbd0fdc4cea7297a78230054a2dabce914534fdf686b197615213d", - "972c28a36e4a3f5b201dab7ba64186b8e1b7ee20d57cd0b66da95f0bc1bbb72f", - "17eedce04e0e46ad4cf6c964e4d531a34c6f1d3afa249c2e4f629f76663207af", - "038190d80d0d71579ba026021db17340b9aadf4f31560ab5791a1a66b40d7a7d", - "47db00043e2a8902796d902e560161f41e2e1e2784a1a88ed21aa004467fbd32", - "6089395e12e207b25194f8c18ac1a7cd43a85916df89f455797b21a80f08a30d", - "67bbbe429b2d5c55a9b3c0aca09460d9009f54ec01b6307ae765a2c4c229775c", - "346169a3b176efc18fe7f573bd4859c9640344736aba2a57ca0a7970368df194", - "a959d292ff100ff40a06c019134b094bdb8d8cd7bf8e7b7f1f8759615cf23e97", - "8093db659e111dc4fe76e0d2fde8dc97e29b8aaa3b1a17f86e5e2b856fcc9d57", - "a69bafac571568ed19d00fc138ac4c37ba28d2c6eaad3a2e25a86a70caaee370", - "fd5fc6d8fda6c53a4996bf74d8023660c5b255770667a5ed31ed07bb3a79b3d4", - "81a260ace2a977e3571977ede7580683098fe478b9bb8bf48a5635e168a8321f", - "61ca8f096242e6313cc94f07be7fb29d270e7ef4db83726902ca877c88a55738", - "f0b0f40ad7dd0c34f12aa899b281af9a39b72230d08e9cd6873be6d589303c1f", - "e6fd2584d85b00cf35d857ddd50ce482a88bef084ad0ad6676300216c482dcdf", - "ca7b5a7deab5018088eb178a2328574f2b9b21d93ae4c9ec78f51c145d778887", - "93b925f56592da2d2703e9fca4e8dd4308842b3b118dc7a5edbd7a31656b72f5", - "efc35c7959c13ec0239afdece3b5117886eca28ca448518fb311e3a6c1e92fc4", - "d2912646fefaecda32abd32e7ae0cf944c12cbbd0731023db415fdcf6326c37e", - "b00c8b5416efb088f982ee88f577d9801815cf1c4363041565af336e0d634bc9", - "19fe58b8ff48c3a0d1de5a5a92551b0ee3c36653b7552131f67d433310b796ab", - "d38e65076ad803cea3c6d7333353c190e90f7edadacf7fbd98a0a347e61a9249", - "8e847ce27654ee3564d6f766f55d35d2da5c15985c700227122135901d147707", - "9af3ea4feeaddd2cace071e5a436c213a5d7b0459263281cb608593d6f0512aa", - "a06a07a96a8b5619f4edcc126c6b04c5dfc4c1e640f05acf1cace0116249f729", - "83a7b3f32b3a1aa12911ee1e04ecb055f5fecdcbbceaba1c1c51fc46158d93f2", - "dd3856cd2b461dd7e2d2da08f773e5513889ae4412668651d730b9cd7e59c8a5", - "bafa7e4ebd9907a23280720a759ef67be408da1748951dea1d4235c1eb452e03", - "9ab747020d8126ddb7f795a33c5685b512766ad068f4d270c8f73c0ebbe73a42", - "889ca87de018e1b3f5ae85e3a26f41ed7320ccb018961faceb8f62ad0677b774", - "18f92a13a146cc83ede3cd62462a85eb7760707a6f9c77479283a87e618f0804", - "124bbe3ea9a956c704691282d85ac9b16c06feb0deaf8c1c549519c54fb764a3", - "5060bdec0d23e6fbd65636b79c5078e1d8a7c6a6c4d96f2615d94e38a65772e7", - "4202b40d725c4d19f5fe9c62ee41edabc0a99e49907e4f36ae4c014e3a05b22c", - "a442db40890d6acc8d2629c42697fa25cb15f61e47d671c057076d6e09aab65b", - "6cfd6a396ccc0529ee38096d3b000495e3d190cb1a8006462b1d84de6796b108", - "45412c6d1d3439070f8467c99fa817c8d6c715e42811d202cb4cf3a7d9fe5e0e", - "329d7081a4f48b4b0713e6ddbcd30012f3f052fdbaedfb8a5605480205c93325", - "3f0c54945cbbc1380b4b53726ea84cbfcfbfbf137be103e7ccca24b41c20b49c", - "1f1f69427a5d827114991839ae927f81bf513c5e6e34f148800cf14efa433545", - "978f96f643197304e1ddff433aa03ba2a8893b960063386672e7e8394342cd49", - "bc83f7bd865778b97123f2a581116baa40c90f712c126fff4c2c72e25f69b83d", - "ac168cec04ae1abaca4a8e691f83997927c2e74133221c923dc5e2f1bbc58a5b", - "9a2ff33af0b08cd96cf8322386a404f5b0573c58f645d389eb5bae624edb8cca", - "f5ed066449752c5156bd058f85c43840cab026cf91c49090b0f614b3406b958d", - "7bf5ba085f472671ac88dc7be726830faf2f41d4b2680d4b5eae6c2f52821505", - "87b45b1811ef77971046e48c1e88ec7999f4b94da63e46a87a77f105b9aa7878", - "38c407573915ea83876ec9513fd2b62f5ee20418f165706cb9ef9621eb4c4e4e", - "21e1ae48efccd9a50f2fed25d06c71eac2858abc8f0bc2f3241e6a62d318f117", - "c93a74f5abca3d50111882a49a0a57e4bad7ef28f382596e5a3eaad6f63a0aba", - "df8d0393d2d58472b6fd1304f5f8b67d31ce8ae7b668f071202f081afc91e4ee", - "a25553c30e8bbdc1d0dffa61adfd8fdb99a1454ddc2e3ac7c7c7d8ab687b4a28", - "78a3b6fcdbb0bc15f46cea4e7f71466fbde0968f3bc5c2cd0efd91216d4494c3", - "db740d689ac0e2e4847645635907fb8db5d8e289c68e5ade9ccc7bb35de62074", - "f2d9391f6ed619fcb3c56f9bcccea45347225aec3ee11c140058bcdb50e1c604", - "6fa854fab16c477ac4eba2bff4c0f775f6223a5562929cb46c83155134f5cbeb", - "0b85fe884fff9943fa36b8c109a28db9fd02903336467a39bdccf4493ecfcab5", - "2a646f30a09b028e4114aec5668ac804b1eaf007aa02886d1fe0f86983c3a814", - "62a33e00839e5fbd784b2b39439656976ffe052c714ab5584abcad20bb8c6666", - "57bcd489d361081006f6acfef36cf57d40d1ea6903c807f0d228bbc9c9e80983", - "b6c1f1dae595339d8d0a73e631aec49e2cec9716cbe11fc9cb3a319f12036f80", - "f85e4ae3f3f6143523eb1115cf2ef7e5740697959a68cf9296184acbb2d24be3", - "6595d23ba8a0f84a54188a7e6ebf95ec4decfe10d072c5e517ab68f9a1857300", - "82ce8bde98c85f9c0c3c357bcd5a04843211f178f71a578433a0b7cceb5ee23e", - "d976060ff800d434e48904c0f9de1b1bb68eedcc1cbcb1f2f51c2b8a5ae5c0b7", - "6b2cd92cfe8d05256d2726161038b0b05bedea746f600e32202c6907f76b29ba", - "0665bf66595b810b30b4f2d3cdde99bfb12301405438d7e0675fcd121007476d", - "e9e3cd0f17fae1b5e01adc4bebe48c4626c3e046fe03a471c05a1e4c0fa2de07", - "d5f253471c87fd4f27cc17c9295b352364474c3b496df9ec42b3a018a0ccb6a4", - "37a3c5d2ed8ba3236e4ca38a97c8670ca951ba2b1d8649a78200684c0e32fbc4", - "23e9e825079d44485670f32dcd5ec9ed544d6d9648abe16a51291015a0fbecd5", - "dddc5d6a539b30d5cda3742e9e7fd139d53f4249ec569ff6fcecd71327acf01f", - "6de125b439dba68071b1b7fc5f8efbe0c764624866453d9e038dc49a775c5cc6", - "450d672b890885d683b9314a0b57f8fec5767206b9e90df61d3fb5509f3963d2", - "7df53ea55e1b56b85d4e502c06e1e90629396d318f8517d94b6d3002d8d7fbf5", - "c50d3c37d2fbdaf91063e09f54b83a3b805f140c17754a7575c3a988d1f2c643", - "3443f77198cb40050f8ae6d99f1b620e585cebeebb5f4e151b94935b5636b618", - "a70163430672df787572e02ebf4fd7d46dd10126efc43050d5bd04560baa0876", - "c2f3afc6b99dd3772fa5a02ed5ac7baa8d289344c035c97a7fd13f2da9414695", - "14e91b1a1ca7093a66ad3b7e93c0ed9b913105cf13f5de3467ef89ccc1c04fdf", - "f21755e3510ee92d9a0ab0484a83c5d543ba52df66bcb1c630e89c807c81d6cb", - "f0dc57f48665ee6360ba0c1a90d8ff3cdd0253ecb21b8c4ae772aaf8346534ae", - "ed7c727b5a66e6eb7ba3c337ef48c82b84649e96dabac1c8f4bae16f378ff3cf", - "f4476b0a8fbbdaf84ea90beb03ce8a814f3c9472bc8f675505f65b05b5bab5eb", - "0375c560b9268110756efe0c85e4049415d7816c550364912049e12e1bd323b4", - "eb3d27847dc10630be32be8f8ff8c41b9a4103fd4d7bc4e61841de9b5756c3f3", - "9c833c485cee8bd3b90b8c48a4ca012e4552cf08612733685659a6d55ef0c87b", - "069006a78f9d2b7257352a0e6814a6cff4b90e3a5f4b51df59dcd2dcc6662e45", - "52cb2dac834abdb9d89ba2effb80bdc52115e25f39bf742ceae3a88d0802408f", - "4d4ad5744cdc64463ada0b63fa9b8c5dcfd4e83f59093ae4e363a22fce6ebe2c", - "dfbe451a2c404be06a154e77a9ff6b026f8ab3de61ff985f6b4754d9c6b8db36", - "ce9f04dc0aceed9448bd0eff438295bcd7778e93b8a093a6dbc9494d2c4e7a8f", - "ccdb6186469c4bf5e169702540f76cd4c250fef47533a13050f55dc2fcb4e48b", - "4094b6636a9a342a331ed6a0c645147b416c2cee80e18673004239061ad6f4d5", - "1a5905b28d5b5407efe6a5eb7fe2c76c52fc4721c11cfc66812caa1b68ccb7ce", - "df44a357cb8de712a6a3d48af7f63e4e4b4c7437c0deac40fbaec9bb1269d3c7", - "a6a53e38cfa02a0a27bae6ba9ad9312387599eb25a1f14e4c44b1095cfa7a21d", - "81cccc80e6e16cce5844b09186af960984ac2b8544de5f469a33007ad4d01b26", - "e3a4c79aa758b6f212be6c58570f812f9f59b9c1401391d08f8820172d80e40f", - "5429fcb43b26ab0d533408fc375fbb4b1523229b52d3647aa90309b7b4e0871e", - "7f4cdef85845d541b245cb93ff71796aa97d2fc8fa1dd13995dbb1d55da63929", - "5d3e96cec6f673fa252278ae166141ff5afcc17060f99a2f925632c9bc07e2e7", - "7f3ba748cb3665fe67355a929203b9264578c1a3952aaf73776eac7faa869185", - "0d910fb5e1db09bd307889ba83cc2b834bd4fdd416c466cb4a289e0c96667851", - "83c42a8838307b4840fb7e9b8a486e6472d443041a4759818a0d97ff90052a19", - "c05748080d76658101aa3c79e697bc46c560bbe4eb826192777a4969a649793e", - "39f1a48d5f4d500871496fa827e1207a2c84b7b02600fd0e95fd5ef2e41090d1", - "d2d5a63ee9f1b2ef02d410503932d17f20c0f3abaac8fc93a67008a505558bae", - "fa706c8c7d68517e497adf571d6cc39441ea8bb599949011e636d137aa877b13", - "32edecff164d0fbca2789fc41f008c7aed0711b946a3435f2d0074f39abaf5e5", - "e9ae5abf0a4160f0ab9fb27432680e55624b8695cde609ad3da3ed08d4c1b6ab", - "610aff09beae1be195be240cb4a5088e8a9a0b9dd105beb03a14e7b869e33237", - "eb2bbbfd30443e127e778c618e70db15c4427aef7e690e145b7cad14fda04543", - "5b53b4259349401ee94cc20870cbbf20afd91606e76b5e0714289f74fc4f9511", - "9c732bda72addd8e8920dc7e55fae2befe5d118a80e46278af282ea853ac4f4d", - "06326287f9b481f71a6b68b5bddd40d87ee6dfd0f00421e084dda9073bcd03e5", - "a10cd1b677315db27eb17071cc05a5a096af272613e5fb6ba26815e720e74328", - "c5b1dfcf37183528be3c1e36bb8460fdb81d29a86e3813a3cac4b2f70e0a0f1f", - "151295fe394084501fffb466a7465e12992b30ad6d54528a9545f20a2fb20a01", - "e25f0582c9eee5d49cf45d65cb77be6cf344b983f06807e330a677bc6eb266b7", - "a9b3c190885743a43c6352ab7275496072e7f6027caadf59d6279c2ed3afeb64", - "44174856543454bf2014d4013998355257f6c66d3317fbf03febc48b55291629", - "958cd4a9204a2ad6d8b72aded80098febe99eaf5ae5bf385e76660619b39e3db", - "f6e7b8dd6f2589ae693465869427fa477c99c8ba97a17ecfda06cfb19a89da12", - "58a449ca3206f8687205284bdfa1465b5474f270ca00e2e8c43fea49e0f55224", - "3f22f31a4c798892a7879ccab94d3c0badeb61dae687996a2b88760592756b4f", - "e2adf78fe744a554d34412ccf168f19e52c48f7cf7e4c202dad0853b84692ae2", - "e4cbc1128bcebd99afb42f3e345856dd1c1ae3641345557603bb9a7f0c10c738", - "a6e701b3c22921dbf886ba790376fbffef10d5702cb6b5308962834e4b6d39b6", - "1068440d3b132b96840bb6e0cd2cb57d93fc0713466661610e349059820568a9", - "63ceafee4a309c3944591d1966a914555506a99accac9931edd60d999dfe4f7f", - "1e7b9f920bbaf1a6c8921d9c27a0243ed2c7b487e16215ab8137f186d1ceced7", - "d90c68fd17549bc905d158c6ad9ada9a6ceb3d002c833c0e3a957c4e093c63e2", - "dde1ed6329865cf67e06fc3d13dd46592107c9180a0b8679a10b456219c75061", - "cc95d2057b9233645385eb17d9bdb342040b9aef5b13f898187312dfe09f708b", - "347778a578080228e6f7f12be902143dae91c5031053e45110018b3856092188", - "2c5a72398f9f26938837e509ef33dfd12795dfcb8a131371c3ac03d93ffca52d", - "da95635dec3cae9d97bd70aeea91684aab10c04172d6025cbb0faa0a220fca99", - "a131351428c9b6e8c25217e42351e81011d25fcbcd704688bf4f7966542ea6b2", - "e2746ef77ca63262b6377ca9b9617e388fa3feb2d834808a80d4e492090284c3", - "b930f1ef23330fdc094406593968ebdbab3b61e37df0aec5ccea2810178e0059", - "4f0ba23b97fb5a6493c2196745739e69eb2504182067201931372a250291a3f4", - "2630b032fda203af578a99bcbe234de1ca3383d2dce825b481a91f9d2ea3af92", - "57fa009e1c9754d301355c386e880b66fc719001a99719ba209ce4ab1b92e559", - "5160d2813059766334b43fa52988caa3639f9a6ffc4d3342c85610c944751bf1", - "fc84bcff7ef7fd7ff8519594a11ca2128e23752c5d170f0a3dfde76d73f990c3", - "0f01eb529ecfb1c58855b247aba3cd157461ed85fc6ea0610ca2eca7826716c7", - "5e13011b9fe6eab4ee002886f2b6d7912af41d3edef1da4c6c48fccd6fcbdff9", - "ab8af660515ea9edcf763e9a17b70b26826c17569c62edccced0c89a2ab6979c", - "76405b58fae578bc868da1c1a3e86b25657872469a229bddc1dcc5bb049cf41d", - "3c1dc119a4a2ffde1b49521a4ed29cb59afc3348dc68fce50fcc2d90220ce38e", - "4afe6b45e726f483eac53c0dfdbbca1dad8de0987ac30a95b566d351d6fabd3d", - "ad2439ac2471a768cc8e4aa1212d6e05d9f92812b6a8edcd6170ae6d9f39f1af", - "4923c41a66baaec972fd19081f48fea23742e8d26e90fbb1e7cf2db343b53a66", - "889700d81cc43d2eb2effa099aa8e6e057d5b3654c9be16c9dc5dd371ce13ed0", - "ffc8e76955c6c9c04f02b2050f662c6023b5a5fe7d283c4780ca8b52ef1af0a9", - "241c53e82a54156fca7dc95740acd614b63ac4526e0115c27ae65396bc226088", - "52067c395f9c2ec19df92b66f83087fe5ae7ab6c3ca73f9ac27344f83409f2d3", - "5f22eeafe199c2b1cb8a66a2ba01089d6ea07541a0857542a43ba8126007c21f", - "d60c112e85ebcf3943f9f1a8970db95a0a4139cb3a6ddb4fda7b377bbc79ada5", - "1dbe7ad34b90a902a3e9aa269fbf3948a4c419cb3631363f47818f0ec6d9f40d", - "2f0ff337c92c674a7c4dab4e29342ff23d38ffd693e340c82e8886c0f78881c5", - "44ab7635c34b1b5f16ac6ec806f1206df9b206c75fed67ba1c2d76240cc1b19f", - "53de5e61a2f094ee739b563eaf77ca7bfcc37e3184b93ab818fae1664bd0f68d", - "32d1cdfcf53e8a4bc96fe28669c0709ebcf4d62d507290c9d2441dd1c08e06af", - "77aef820f04c3993cdea7a74e6def0ac1b3c9b16cbce273f50c130e1996a5a3e", - "281d97790fc97fa73cae8ff6e8ca5a1a4f1e37e25703d71e300c60872b384c45", - "1a97b4527c150e908464b7848cba7aa2aa2dbbc0f88371f8b2c68acce01c87d2", - "a41e13dc5a3af35c2bfb3a2603e44c98e0c9a6f8b35a2cf44553de148537a4aa", - "ecef57531aaf9e546f0d0f118b35cb9cd6beb3821e4fb028ded99e550b2f953c", - "90398cf0bb1d5394a0f43438cfa1978d19abdf0abb72f2272668d27acb1c5e74", - "14026da034e9a66d3c8faa08b9e4f18e91b514a3af21cb6645df227af630c634", - "4eec370abfc0e46564ffb4214568c58446f2b92ee834487f55a025696d67b773", - "6ed439d4ee05b3b0d25b3c99dd8d61cb9d817d090463470ac56b2b8a7107cc53", - "826148c700eac35fbd8fa2ef9d28ae48856b5ce9241d970afc933e625cdddb2f", - "66e7b284a02be92569fe0e8dde5d94b7104d905bd495e9faf8fcbe7d6b73a2d0", - "f8d78f90deef5ab65c67b250c85ef2bd27866b492c3e7a700fb279ea4ac8c2d3", - "ffb82daa3688dc90d6e2d626d380eedc59b9eccacb9c5c33d432d09ee8c63a06", - "839ee3b21c778cd94c7428218f7d2336d6b23363879a7a85ab292b7b2b5f1558", - "170fcaccc5a47125462deab273be54d7c5dc64b0965ed037fa0259038a8ed2d3", - "67422f552df3317cfafb640c1dc5f0a3d85b8060d3690e3fc7f335a61a392da9", - "08d84f00b91bfe923fc7839dd93ca4e24fae85e53086dbbe2be1a7a9683d8bab", - "84625cb4b027510e479e530678bc54b99134a70cdba7707fafbc0411d3e19837", - "c0fc6043d8b740aa23b15bd0b3f22f1d0433f74e9d34134ac045b976bf16075b", - "5ed29300b5cde7f55d16c87c1724faee660e2ef93f140150c02103e3b44fa557", - "a75dde9ec24cb9be3c1fdf6ab47213d98d917b13de243d2719931a6bb31966be", - "9425a708326c1e97f3b1292f51c7b4c9e0316caaf24e460513097b155adb3d74", - "fcc9f92f13cf8c3fe9dd22dfb0f342ea6f3143d39f64b055779eeccf14f39fe2", - "872066420c198b41725e101ef62b0958e5fb3008e7483fa55c11430a68540bb1", - "dd6108697abe04efbbaa7034b2cfeb9ffe8dfb3c597879cf3fd0a4c1c30b5cfa", - "14a6677c6693949061d3324504e8b7539012c25c0f3fc46750230325e26d7173", - "915f242488d4f5a3a789b56e2c1b1a05c1391d8d1bac0490a011f3ef192f866d", - "2f02a95e672d26503263fad009cf473522a749ce2520019443d2ad605130251e", - "0056a838b7bfe1f77010b922f9b8274c2f435aacb01d6d7d33b7fbddc15c1439", - "d401fdabb94e1299e88ac2ac3f34d658e764c892f6d91ce2a81a5639afdfa8c9", - "25bba07e5566176c6580fd17125be6b35cc8d7f129423e1dce95173bcc1cf71f", - "b678b5b4fa196e7f98e0f4cb0c86973bcd55d692b25bb4e47852546360e63900", - "1ad02752d055a9e12f7888a23972904af9f0feba2be46c51c39574b96e0cc9d4", - "84d14f1a55573fcc03ac50118891dacce6edafc73aa739198ea45b6592730f65", - "1276294f547c176730ce2136d84f387a98afc317b4676b3a5cf93192ab4ae72b", - "a811337035f8881bd9eb4b36535f291fd09160ecd8ee2f611bfb65a9d2660474", - "6ec3e44363750a1a9d2192ce0416e09e818c9bf447729ac2e7816c7b41e84c33", - "50430c1bc0243906f3b28245e151bbb31e383b08e968d2006b632b0357f29e41", - "98548c92249cd51a311949880903a87c38d877c1b7fcc4340aad828439478d8f", - "4e597d5d285194911c3c920a011135c10d095ce4721eaa8c494219a2a3e42c86", - "2670776d883df1b1b72c01d83b4cbf4591db6f5b731b6e3d81221110b8961eab", - "e5fd7f9a827703574bd08f4d0627f4a1f34ac13608c414acf936a101b4246075", - "c25a2e4af4b240f24bccd8d7ec8b7115c169cdc90dc9a978cd75621523992cb6", - "e26abc0c7f071bb556bbb1f688285926d1cac65c6e9bb929f36d74d4a533aaef", - "cfce70d3d969456031b7225e9dc4011435e9523c8d997e20709060fc0d0a4fb2", - "e09bf8dd10a1dbabff3ffdd1d325f1ead366a71deb171374516d8ca4cf6bc15a", - "986b75c9a23d433ad7ad5494f50ec461cfbc40784137d9d660fd8a957d1f15d1", - "34ab0839d65d154176717eab963a45f8608bd93dec783bc2e4bc12be72630c1b", - "cdbb90074603163f2968cbee8769a57ea70d467aa95096123600f85d1722d30c", - "37445e0130c889b9165831c16ac35133a27252c8290667fc0c3656c64611ea14", - "74bf63c781548254c3c5599f36786a0c318d1de9d41b3b08dc2222b1ea3844c1", - "31ed40bdf0a26fdf4057dd0368ae3f9a89215e7b90d3e0d9da730264c35c5501", - "833d1e58eed0ea934404d50b85344dbe09e89e1e4eedf453a4fecc5c51a65b74", - "c828a302ecd5d964acb6f98b92d8182d66de798e1b9e4c03aa8f44748f6f730f", - "517a66dc3b88ce60d9d00c6af83f61e0445dda32f4bd5ef06d4425517be67f5d", - "4b95a0cc00bb7fb81a9076f85f9c9452db369cc4db0e9b5d8b6d6795ee16613f", - "a74db1378c6a11b301d5a9b7ef68d17ff4a7f3752c8f7aec7d0cb5cc842a1497", - "bb5d1a70587c1f3e97a53ff5cf51a5825f58327927a8d8212b8d5e1dc74fa93a", - "d075387002331d99023e548c7fc63c81a99406bce223db6ca8f01afc05c20ab8", - "54b52737f8e25950a23c46ffcd644069cc74e95571485cb1e0bda69c92786666", - "b07ea2f76fd1e33a5f587051364ccfe090c77a181d7453e4ced749a780446999", - "b30a91b660b3eb07fde67717c7b745e38eea709a21b3f0cb6c08d3b5d692feed", - "167acbb98d5ca12d7af88275bb82e9567e28d74414d9927ae710cfb948edda2d", - "7bf1d1a68e081730e7e39cc2df6aacdcf92e21dcca295651560739582be1007c", - "8c2f206952ab16d2fbad833b6eaa25262e46c495c19459fcad98785687ceb20a", - "3214114d4a19bde812a8b5be0f7d0c205692b91982dbbd16b638b89ecef6ae22", - "c87c1ac6eed045ea66e3bd7d4fae95f767403298878b51b9112f9cf1243940c6", - "19c1a4656b433891f7660765b84ac6c75b51f913ba1b32ff5c49b667dc2a2ffc", - "9e61127ec2c878ce3c3cb0631aba687976daa208764bb0b126c11fa7131cdbb3", - "c28a070f282fd3105ca0079dcb087f1d74b12116cdf403c70cff08cc9161d2b0", - "82a0f5b3f6a3a74421c5d4c16dc86da6a3c462e5ee510e98dcc95fbed2a34784", - "bfcd2402bfcfd6ecedea5795232942c5ed7f80545eeb35ac75d9f5b4f287a22e", - "954e2e2aad52bf2b694858223441814ec05cb20e30a0bbee3525656bd3a1e5e2", - "2fad211202891858f866f438e638f60383eca6e0610711cb5a618ba80bb3ab19", - "80f0defd4c04bb811769dfa5c6cf6441fcc05d570faedec5271a931c157fd83e", - "eccaade6e1a6ea96e8b44177a9b469c59ec8cb1bf64ede5b80afe54a4f8b99d6", - "3b60b1bb37316192bac451d4ae5d9f4efef8e37e8a842e25a93b90d4462cbf29", - "d5949ec8d88857502acaaf2f88a99c6c30f4e396d4a9bcd1a71540a6ae18a855", - "791a1dfe94b76197af64035d2a66c8ca17918030947db64e1e269ce5df6a3d59", - "77029b4fd25c83f1e42b34ff06d2c7a935851fbb2f37c6474203d5d8dd780803", - "e69d882e18d4e20e826a7162a5130cc0c7775f512a82a63fcff94b472cd72370", - "c188f6e1f317a1107530a66c2e27f6b0d17363b3e20ac6072e8ad5620b989de3", - "4ec1f4ef7ddcb0e1ef5b9f05ffe6991ff5a20e2855e2f8666714aa3435ad698c", - "efbcb8367a3e1512597ef7d9f928d2b28d83b5c811411993d58ca57f450820b2", - "b9a3f25dbe23b2d6fc1704de5d6de809f50a06ad427b1a1f00228175da57acd0", - "2a2e425ea2315c012da46906efdd61aebe70eb10b7b22072522f9eb3bc4057f9", - "8fa2c0e36278a5e027c01b624ab2ac4aca8000ae4e23da1df23983241af916aa", - "8685ea114637b751ea0a358e7e3c6cb5e058675aa396fe5146296c5a352b7dbd", - "e511be1e2b7bb06897248434b67d5d5c7de7ed9ddf657adc6cb1d0b617c7aec7", - "d8c92a89a5631ae2fc56d4b4922c1ab82cbb0d09ba30638ca53b4d8d78018cb2", - "51a6528ab44adba0483697cd1efcba614cc14c04aeeeb7bb9be0902153d65643", - "efe6315d46307493cc2a00eb259b7acd76b247656037c8f5b12643d258f969bc", - "ffd22379c5701c7482603795bd15066372320be215d004babe2d79165bc126bf", - "7a614520883bea3576e469c392b072e938bea9f04de556577fd4ebc838ceb995", - "9a2636cc09565b4647dce8e53d89ce372c8d38527d29169a540063277d609721", - "f96862a6ef2c2f3255c40a782e9f0fd63bb9de7898b136eb7bc8b61d066e1c08", - "50857d133f75524986edc99b9bef6a8d553d94ef77c6a7ec59738e768211e260", - "c20a4cb2aabfd6ddb4eb28231f30efd47b175b8ea2f443dd6320ccee9b8d18de", - "a63b96048ad7e327725f237a744b9225d9a93b000bd1b93e4767b965482c7e9e", - "d8b32fdaad1307ca7df8f3027a72256daa56f960ef7e54a088f2ad45aab25e08", - "24d5a1f1c3184b086c04b4dc8d288c28d0632e0ec80ea0669774045d013f7970", - "cedfce240d83b61e9b54553aedd3ba28b4553e951ae5b706906545b5401e1944", - "bf36abfc27eac31929bb405032ecfe65010fb3d2276201cd0f196443646c2fb0", - "01ed93702af66c2d8810cd34a070a02e258ff88f471156cb5f39334620a41bd8", - "b95ced4281c87f1b8c02e6679a2de34325b32c9409f9dc4abf462529f326a9c9", - "03c775e854f1ef4e120aeaa55062524fd0a930458b3f435b2c1f8706652056ee", - "8b4e7a35d7c67ff281b9a678050392c212899304302a7608969089eff0bcb6e0", - "d51087ca581ae37b3aeaf2547caa30fd0428353696da2c758be58c4dd7a86c57", - "40a22f961e43bb06d8a07c88bcad7a2771c9f741883fc86ebba33950ce808c2a", - "4aef14942938b5865d18bc84d940ee105ce8bb1db135fba0fe1123259e7ffd06", - "117f068a9c813c2302fdce6134151dd5b34405cc0682b9b464a73817ad556cbf", - "7963dad2dfa5afdbc7a2a628bda646900298137ef77372ab9f110f2c6b69e463", - "3ad8b2d572b847335a8445f9cd81b8e33681b870e141c5b51afc0164f873317e", - "05ba6bf9f2b69ca60c2d7c59961b2b041a87687a79ff38f8cbc4344baea07096", - "aa73631a2246c0c4bdee8ae8d6d2dc0943327f2235de3cafd962fa9bbb54b0d2", - "5aba96effa59cc05cf140fdf08a331e3e7f9b2f04ffb7a7389cde5779c4bfdce", - "a3c6d83346a983a5308cb8e9b6c16d97e5189ede0a903e961ad960438ce1e312", - "848b1754b49efdfe5acc5f915b951f1e6626b751958b89b36e0fa6c07103f203", - "7f8f8193001f3e50a38a8565eed98172e3bc2ac90a85073a113d703c5007b0f3", - "9c5821bb7378feff6f918f4a8efcd1861f39714ae8bcac07e994368791165d59", - "386262752198f27f5f9f9471bc499c15bc1c99a2221615b01d3a0770d23cddb5", - "8793ddf7bf42676b4f69437d85c90931169e3a15470fc386b6ebb0bcf166d520", - "b58331a94c635b16bacf96e8b7c9d16a1dedb7db0b3ee0f686658c198a50213d", - "6bb7d43488b0a46f223d0726ca5f696c59fb937685b0b1ca122f5f8c0c1d3cfa", - "21f4e1d2c249c6d9ddc018d4228307587d6f6a9641fd2f6795fd3d92c31d5cb2", - "b8de512ed36438541c8ef0f8cdabb28f4549ab0315ffcf2ce5a89c440589bbd4", - "3a2f54451bdd422fb3cc0987052b06490a270cd49b995187748a45176810db9b", - "26c156c430d381d1f0251ee9517605ebfe39e542bf6c18da0c05d6a7f58c2827", - "b80591c97c686baaf6443b409c266f980b602a5b0e67e6e5eced5f3fa7e24f29", - "71c641723070638826463e874c2019f2c0f835f854fc7b138fd83e7bb474435e", - "ea6cd72c3c45377c83b21780f7846e129f09ce386a5ca117d0325bf778e07a76", - "73f9c1788c05f81b1507057e34771d7d0549541c7d4389397397ea834c101eb3", - "fcaca6510f026f55dcf0a1e015787fb46220e8f10c31877cda0e8d95bc7898ef", - "d85b1cf54d5fd82fba07de56045d1c2554fa13866a72d08f907d6090ac136fe1", - "a7c687e9957a113a8115c2050467d14334dab4d950b48c478ac28f9129df0901", - "f6b9a98220104f9636b713a0dcc3986bea2351c9e5498382edcce240b7214fb1", - "3586a53c42ffba001011cd1519cbe2d114c210a27c1b5ad071ef8cd3819872d3", - "57b9a025d3ca4440bc879d021647e0ddd7ae81ac46f7678aeda6b2881fbf1eea", - "cfbb18b58d4277f99b61fa66bafc68bc589f3cd0098b3c25486912ca4da19999", - "f780b65de7355850d5268b1b7db81cdbf5eb97ce4adc4ab111c7ff10de47710b", - "2ec2efe9c81b4272200ba465c86b38b04f43df696e529cf2e144affa3abc0737", - "a239a269f175fecca9c7fbbfa316d1ec6e6a2ff655d9a2ee0221e31f98f49fb5", - "1182cdd77694255dda378c91cf2e1d73a608052d29b941e7ecfb36a5ae5a3286", - "46cbf55e736480e186f251400096874ba051b3b9c3e111973dc813be9cff6668", - "74f0780d712c761fa85b0b2507ab08d01a83610be74f0e32c085bf5375bd66fd", - "665d85f7a8124a26ebe6c23383f7b7a220861523b1b42eb3cce0f148deac27d8", - "b7f9661b28bef6b17527ebff230b3340175c6ab354acac1e35f303352a9ddc4b", - "5fa0a43c4a2e1c376152b7b628867ee2b00d0e9ea540de244d0d81a8c1724cdd", - "99eee76fa3a15e81f5874d0172ea88ac87c9d44e80a27edfe0a176ffd4d20758", - "a645246fac0b55b1028352870395d5a93f0c00f3856aa9177c4b1300b43dd92d", - "e3f8ed912852469c0fe50504dbf8419d17b6653de470935d5e078581fc37f9eb", - "128436026fb91d9ce4d467c2e97a1d4e3930f77e8ae979e55aba4ad814ca7240", - "107f90d4bbb22e39a245bfef0a8f0eea0c8c65f46edf185f2e4381567bec3a20", - "e02cdd4d3d77f4baa24a745052cb28d613e2258f8a7260b98b3d0fb0babcd0f7", - "753a478c29dd0dae0aeeae96e0fb0d643532b5417b9f8d7550170bcd59d3c86f", - "15973ca664d07e65825e82293f842f48ce4596ca683cbd9b964c916ee9c725ab", - "68cf2e8ad00c0ffb2e973057dc0f109902839f3da03caccb36c13770c95a6991", - "dbf03fa605b2c5e20008760764afbad9d684be9894a0fcfebaae57d07ec42250", - "9e5c2b5a9328b18018fb72d3789194cfb5e9c7d1d54eabc5ace56cadd941964f", - "51bea2c358a317184394297e29782eb7300c85741522d0c2cd08f936eba5889c", - "1b044bbb269132f9ec9245d6e3de1dbf6a6c524ae15af4ce43b9849858241a12", - "3768ecb637bdd014419b9fde86173e7211c16ed11d745599dc2ae2f187b70305", - "9526f117159330ddfd7c8692089a67f4204d803800c7607ec9432f91b545e221", - "50938118f578d3974f50a0c1005f7124d7f91709ca03d9d0028dd3e5581f935e", - "ae368158e878b02ffbcb59d3fa1d670b5c63e6f4f25f4fc6b6501aed7eb21ff7", - "e10495eb334cfd1de6ce69c424e6c38410980bbbb85156674625d007b7b92702", - "15019da4e88313761320901b85e85bccd271057d5a48c355c4900c2954aef04e", - "c9b1386c4912ebebaedb75058cc6e3a1b699f08dad680b838fbd5e93dc363ed5", - "bf45f65cda82006cd5c55cc75862fddfe64632238a0a4e03dbc4dd870f9071df", - "0dd267e2c85be82b5bf21e4f3e248918b816976783d25b289f3d3885e4f3cf14", - "fef16aeac9437df3bbaf8d1ccf773f129294edf8551409e275db7c41c6dd114e", - "f160051137f55e639a8697674e8a27520cd7db062c83ab44fa080d53b2fb08e6", - "2fb0a4a1463c24f5858bb7f85c1356b5f7bb4a21f6b094518b68b4e42b304cd8", - "de4a04e5eff84e71ca8c56097d241008aa2179083fae669a6dbc7ae1e0780b2f", - "238fbd4b1b86db302eb568591b5e98e4d8b1a674b9f7d0330200022ba150d6df", - "c08b7fd0ba7a960a6e9e8f02ab4cf799eb8c5ce6d5665844218658da8bfd7395", - "542483c75c0d829485af4fcb897a82aded05eec2c5a1aaca2ffcb2c729e7b5ae", - "b22d17eec0a10cdddb8ddb7f066d588e92c4d0ef0b48479efe617b925dde71ae", - "30bfe98d5837ba7745a7d56cfc46bcab23dc356ef453426f634c4e6b0945a4f9", - "ea50d56c81289d602ac078dca927f999746f458b0b1b7acf95644de5546eba1a", - "4ea7dedd53bf7b394069615f4a6ba739cd9c269a78743a43d8f479ad41c26859", - "15c42e455e6d023fa5fcc1d85e1ce3bfe5c7bfa2609186f878eb24f2e3d28680", - "b91912b73fca81fdf0c757e03ccb53d2d1cd35ef34fccaae9a9c4159ad8cd2eb", - "f2fb75f00033161a7ce915e9147d6b6ba06f476223ec39709d155b694091cb5f", - "aa45cebfe2a9871b0cb0dceb35105c955098736f3e506afb7ee650f5331cf8ad", - "7fbe20e6c455158de2c89a2848c5604b9f70bcb4a5ae178102be11aece701f60", - "114734021a2066c5eb781d06c700aca09439ea4745b51d72968bcd6e4567ca6c", - "5a802cd6940c29b48f7f70226e83a7a4967baab3b4f897a9f7c6f2e1af55fea7", - "39eabc1eb55f627467da93858e413913c2a5ac62becf70313346c3de0c8e0e53", - "88c6b37601b717844e5a5d0553a01c359c55380f547a2c0308e6fbea179deb55", - "0d4329b3e984184e461368652951120718e4e38073c002ec3a393615cbd8fa81", - "06645f500f0d9b85fed0d4dd2a4b031f4c8a042772c109d4e85859d42c3bc9ee", - "3f65f3bf3811e59d651407ec169dde0b6d0a8d4789954b560b4de8810d3c680b", - "8ea94a5d71db114cf6edb5c56b3a2c94f0336d3370a83cc739b53d7577ba0177", - "d91d366c38ecc05968160382eb620af4e138bfaa0e43b9199ad2e735fea63639", - "7b02290733bcbf30b035a376b8cd15876545f88949ff5351152f9e3e211c950b", - "1af604f6ed1c4aa133ef892af252303515343ec820a00ae49a83eef004a6b480", - "4137de4bb633eb2e48d71a7c07d77abaebf54f844ddb261e29c9351dedcee320", - "8c78e4844a4fbe6448670ea240417c90f31da207d48a8f9e81e24912f8c40ebe", - "8e7f1e146d03b8ec6f2bef1fd4e7b139ebf4f40e3d4a03452ed7bbe299e76be1", - "dc134a30bff51e630e98e84d20160675ff1051fa35ee7b63a8416fb4fb902de0", - "d9ff11938095ccaa5dbe62fb56a3902927236f093bae5a14b1cf1085cb79c9b5", - "a9207d54907705dcdddfad3c22e50905ba3e08f38bbb548d47a969e303345511", - "47546129d963e73d66b53fc37d85476d385da21ac68599924e9a995a423773be", - "f51662cd8d49ec7a12180fe231703338c91af16f02c348edcacd004989977d5a", - "9e4f3234615de22842ff8fc90e7715c7c7e6ed8d38cec7d3db198b729352b8d8", - "a1afc9a50d5806494eb9c86007df3c9e14d8d2d97a3031e884987aed70bf8495", - "9c0f2a86982a4520cf98df835f3cd69c0106521d0b594c79a0b8743ff85f33d1", - "a9bb8aead42a8ef1fbfe8a7e97882cca17ae4c78f009b92a0a9a4881682c37fb", - "bd72462100e781812afa984e8f690a0f59049cb1accd5afb1172635879112803", - "4411b36c2435d39c219ee1292d651f06c10b26490d47dd077bba3178bb00a495", - "c6f0ed5de6d0d90dbbea9bf27c153b5a01bcf5e6a6729ac034627d68b66450a3", - "86405ec6a2506e24ceefda01bec65422bb4937317b306a29296665bba0f90f97", - "d55646c1545cc3c2a8019165976a111034fc6d0d3172a78ca1a2ce7d2b14ddbf", - "b775d94cc96ebd3ea0fd1fe5854a2da0a46301cb22b8940082d6495b75840679", - "c383d332d21110c0ae54559559008f3d32ef42e9e8ccb11dcecd47419f2bc1d9", - "8f4be31f221a81043458d1ca5b57f1889fe9340b8c2c08aa3739839a9991e733", - "b7ad19db428c267df95dc1f992155a3ade9cd5183e857989da3715fa24ac93a3", - "f67de808af3a5fd303cf03760b835a33a1c16e564024bb9e2f82d7f0c90c5c06", - "4fa0c8e1af0e1243656a6f27190ac3d89c848cab89ee7808604c6170427b992c", - "27bd7f70fcd55f8d21a05c8555add6976758de91dc4eef277ec59b37250c390d", - "3a71a1d2253fdfe1cc6a324365384b452f567c5e7bf60d1eb6fda8b621981c57", - "a70aeef9cd33a08e360527092ccec00a6b2e52a8bd95b70e0b280daf52483803", - "caf841f6e2742cb6a174b9ba10f3ab188fdcf681093f03de5eb6b4c9fa009932", - "5766543f2c1486da01a864922661e0849307ba7757c27dd49fcb47fbb99a5b39", - "aaa9efdea2eb860171cbe66fbd6cf7a468c2ee40ba4afdcdf64efd657356948f", - "e29d244048b4cfde28cf7621a3cee4fde4e35c945aadab299fe75c146c1dbe6f", - "ca4538b0b955f60a496f010c5208d31f427dce8ab11274e9819dedf46b078e8a", - "61bae6429a117df027a53f275c15ae655718f19c7dd35e7755667516fa8a17ea", - "cd99c7f0e7673f67b644da8c478662dfeba661e60fe0e14e8c19e4d092dcaad6", - "4330e4b73f90ab4a37111da3e179271ec1f72d5b4d589282e081dff918d30ef7", - "69086688a53dc3f6de26144080a3ca4103881717858eea63fce7f0eb70d48134", - "0199bf9e10c8e09c25180fd7d17cead200861a99acd429d5a5478d8d032e5466", - "78ed18bc412d4a96f927551b21ef63e1cb3ea6c7c2678f25a69c7e4378a289db", - "93eb0b404271a02a8f8c46c345dbee138b0f35187345bf79f3485fb26e96ac8d", - "ddbe20594f199bd5579502d15d83982a9cc237a95a8e0ebc33c0f2a937cc7bed", - "d343e101060980dfad63fad7ad8632824c9eaa58228e73dc0330b75e1a68d0d4", - "dfbfaba78358b85b407738f0ad35fd9ac33f311c8ae449214371a64bcc2436e8", - "dc48d5678903007f67ffe04ce956c58db5be776739dca50f1a06de453e21d685", - "22b5d27847085b685cebd0e0cd0e6b1156c9bdaea73628c5f43a51b6923eeba2", - "53bb900a74e15c892601326ebdfd3ba8d9c560b2ef67329c220bed8167f77d6b", - "de254b74daee8015d202b46846eb2e0b9ba1974ea7f1e031427fbf881f24446e", - "9ed5168f99a527c21ac7c650a970e6391158722774a9b9b6f94b104202641392", - "f5a3b3d0f192f85c2c8ce3bf78ce78e3e97291e52ea9c6687d01a914c29ee768", - "a51c2c39dd5dddab7a77c961b08d1806d4776fd79cb5a00f6a3149fb0ce61556", - "6dbd478c3821a48ebcd5a5ad5229fd958b081cf487be1af89548f055715273d1", - "e7fe4347d11f8ff3e7dc78608034ed5231938893a35768938f257232871a938b", - "a31f95b2a3ab9ece46140315b7228663392b0ee55a0277033aa3b98e9579831f", - "2f15b24759228b426450223d07be746ee7806abc7659f5e5a45c759f3832ad65", - "3a4c935d00c70a58063518f5dcf56f245b073ed20626702693e06786aed6d55b", - "ab4d244096c0e42e46ec65e9a04908533fe7756dc03dbd178a9221ffd0dd3381", - "c259f5705f95f9123bbda78e9fa733bb0d7a9efbe19548a3a719954a9a174812", - "46273b5f733c4e85390b732dddff182a4e57099bbed78b380390cbc4d2700578", - "9c64cb95ef545fa3e13742d177d100e5f242f36a673b00ebe039059f811d31b3", - "1185da69aabab5f0c31c90cec0f12b0f2f1b631837a5194e0f8a6c67c4c43e32", - "c4168840435acb7c74a7321bc2cf46ec4aeae0b5b065b29bf4bc318dff1157a9", - "dc223b3253a110ad5e8f585c9cef6155e5624a470fb14da6314aca4f9bccbfac", - "df470b01c8e62ee0ea7c9cf98ee5942a1100ee2a46e48da7b569dffb75f32794", - "5fa7f1850261d643390d3334214d619abf619aa49bed553a9c52d9cf61625693", - "847b7f66693433a73cbba3531fc5c58f5885b512b15fb94c79659a40f1c9a02c", - "cb01034905d289ca8c5c933be2a4f6a89f390c528664d8e12f1e7c152f7217c3", - "e16f91823cf6cda8f2d55b7eb5eb058289f4d4ab40a38d1c2a3e353afc4a97bc", - "ef524849c985513c1ed9b3e476ea7a511b2144046580d0edd9419ece4d5525c6", - "e64142ecfaebea61189ae9a65dd731cb1d7471f6555d9a164dd9e41de7345981", - "2b594b61e508c3d6d11604d012d839e1ff7ed0865742df0fc32f7474e0b2f54b", - "802256ced3d4bf1433663f25de04790bab49fe699b9bd04f3e982d683dcafc59", - "ef9f10e758edf211cc976e3685cd6e4d53a0b107dac9b1602c4f767550974cbb", - "41fbe3ce6690290690e322825875250cf338478f9e796bf87e53cabcda34ae14", - "53868a27ed2e797690997c6657d63800ec5dca07c90e62501f805d5c216c6652", - "a39bdd83f4703d794ac69fbea79fd854c853e0eff101127be4d5f1340b32ba3d", - "fbf4e8ee0895a3616154671a138e94cb19453e8094f14234aa27cbb73fa86072", - "1db63c652e5f44bd98041faf1f1f218847ea48ac36c80f35b789c3b8644ea73d", - "965f517b5a15d52dec4624e59a39fee769f057a707b235aea87cc91555ea0f49", - "0dace410c7b1049a22a1f855b6fa95cc83f8875e24eef80d3e460ad7353600dc", - "a2cfa843b8116a84bc083f1df5b14446f258f56f030849d9718cb5cf773b53bc", - "424f5f6f62187b24d74d6f534894ee173320b7eefd756a3bf06af4328afd741c", - "ee169d4e6cde876f921113c0f0212c9ccba71e007e8939178419276df1191ed3", - "ef456a1edca68155f68d0f448568d10bfb42a1bba14d986095a4aa24544a2fd3", - "9479452af91d182a7e2c5c299a566fd7c4c098cd1682eedeb45b9bc13083d345", - "0db62f34ba1f7cee47d9a842ca29c8e053eca17bd98fdfc1edcbce34be5c0e53", - "3bc9070fdf748b2c8e65d9f1e2a0aab7d3d6a58955287154290733f13e7df50b", - "72921dd27ffc7fc91be6602254a99e76e6ac37335df8fabf2b5ddeb9c1c705e1", - "9d8d7ecc4a0c403579925e4801b9c822c90d3f7561d5cdb7f8000494fec17256", - "1cc16875b78ab9115f84aa2647e5ce4e21a91d3b58cee9687cd27a7fa43ebc38", - "29982ad4d511a68da8583b0342027ca6f45fa6b74482a20d5f63aa184cfea5ec", - "0f0b77da4e1e161b5d617a5815da852a464e2271fd8f53056562af059e77c832", - "dba308335a6edaf1df3a23b44bff3151cae461fc28a07608bbc798e82f09b810", - "97543c96fc79b75f82812fd8d79eb59c7b03e02293844f71a7bdfd7bd69c5077", - "fe5794338bec84a3135206ec590fc8fe68efce963bb3e635c07fd27e7ab9b76b", - "ccd46508180da9f233a2a37b36ecc3978ac012cb8bedf69cd7e549f6f8d7fc37", - "1cd53239ff89aed22982cb28213531dfd57d3fcea9de3383a0ee4d85e6a8da3e", - "159d6102348596b265f91e68aa8547d5d56764ebeb956835f9265dbc48b174d3", - "7a33f83a49d4226c6d3c7b476b4520c23463c5d216542df27bd8786093533eed", - "e9cf65c62f6b9d89345ea771140ae34927e612f0ecd5894156aae21439ab86b1", - "97e70345c522f97f534c572586c1ac6748559ee779770cae3e0d1e691f4c00c4", - "313e875cc58f8021f1a78490ff3f358d8ec2de2bd14bc822b36ed5590c55ce3e", - "533021333f8f0eb815b770d4698dffb275093e8225051df3737374e41bef3307", - "a2c526aca7d2ec26e385159544c87ed0bc04d572a2e1602efc10cbd2ecb38c48", - "74836adf21e6af44967b127b130c3e1ae22f11a0b80b946ddcbc932e8c8022ab", - "593e7fca63943e37b3b2b9a8426c6c961033e00f967b2ec4c15647e91b6a84b5", - "f537b70792868b95bd6c05cf5ee4989c9c2ea7e27ede21e1700fe238c9f9a763", - "0eeac07b91eca6b9b83c9e9bfae9e12a8992c997e44a13358e80e53a402c734b", - "80ec1b76d424e98da99310c7b3c16857cdeb6e4eb9a045507f6da089798e7b53", - "47bda62ba55211d4e92ce83407f418ab1d7095853a6d899c9aa00f8d6f903b2a", - "5bce2e600d08e1ad1fc558a73f72ebe8fcbb4a8a0b7cb2f523ebcbf6e42e14a9", - "0c45937fad7aa3b052099419322df1160a48a50a0af60541f1dbeaf52fca53b0", - "3a5be35b72cc75cd263fc99ac6ba7500ca6cdfd340defc41a41a05bed85c5044", - "40dc99e2aedb31ec5b81a501836e02ad80f06710cbd9e30ec6d6c216cebc450a", - "4a5d0493e2903ef535ddef99acf83eba538bb6686998a36dae18efe63257f78c", - "80b7bd59b15916bf31aa9c7529f3a33f0d97be3ec499e8d1e208f65f907fb831", - "8a38d48a95c8e177288313c2a46a0dccad52433ecb9c33aadeb5e67ac3491c39", - "9bd6035e7295fae6e1a0b3cde8f96017f2d939e97559e70f3785cd0c30116994", - "23ba7e07d18fc8e32524e4ed73e54ecec195f3f43fd0de0824051f5b1dc0867e", - "a91c79b3e971cf8febcebbf9f07404341642630db041a9c86e80f317d453ad13", - "1869b260d82b94aa71edc25cdb078fb5ea15f98399e2a5d262e518125a491611", - "86892563706fd574306149379a9d1f6e9e0ffb66cbe4b2a60cdcf3906163dd84", - "35c75f521ffdf892295481e85526835656511523cfd1e6e1c60ae58da61e0050", - "f70bd6385c0cab03b6c16e00da64426493ce4188e4a12227362f90b12712a1ee", - "c33680d917f7a89081e3773e43f3c8a0684599b7d2276c3e2005e94c89990a79", - "423a67d427f3e2f7dd39241d798231731f0458e9177f54c9082f4ee152c1764f", - "da7935f877fc6b733bfd856ee6f45d7a04be691418e3f3049f7d6475c08e4a2c", - "01cd037fec4f99131c090cae2b3773fd1d25c6c37c23c75449968ba7c183e442", - "44d730fe5151c06e0b3ca5426abea9b4986aa057d2f8e460c5ca3d4c9b6a3f60", - "bc7328a34e75ef907b690c173aa667d429a23ffec282c9c2d2ec29ac96d1ebdd", - "17967b744777665e79b3ef00673d9e3e08950c598ada5a67f3a89b5675a360cb", - "45227746320a60b6eaaa85268cb068e87dbf02f9fa532322746b2b91d656cc61", - "280958ec48c1c7de4f71183d0df3cfb83bd6fb0200fc3564b494b25c431b0737", - "9d5b245b0948832d9268a91fe665feaaa61b36304d852d6c4881f520da69386d", - "1d68350a199e3be79b27055f21afb82068517ee61c329c5cd9958439284615ca", - "b3adfe3d8e276fd8edc37751461939937424affd0be1ee5b63f1f7204f224ce6", - "162320575655be288b47ada203e3597f5326b4fd55aea15f314e7727fbfdf15f", - "bafb5a3d4e3fa146cab46fc8b32b5f36c904c0cd1ca1e938309e97102fa30f7c", - "bbb258135b493507a5925548d70e89df037e2ac65401f600fe93bf656e2c02c6", - "c029190e7e1d6b16b529bb03f12901f3d05c4806f33080a8ff65f691618f621a", - "62069861997c789bed8c7a13ca90fd7b66eaf11a725b843cbb343d2903efad33", - "91b3b61e42e007e42d277c235621d0f69bb93815adaef4cb08024d12265d3f95", - "c811a65b7449c46b66e1a9e17d78e9c28b2bf073db6f0fa5e8baa59d9ca73a17", - "2eb90bf6bf4044c25163327ecaba7683c314b458a69382ec5e182f5fe16ce7aa", - "f9a94dc1b7f44ed8279c31c23a95c4fe6cf3e15a48efa4f3df98c0648b16bf41", - "eabc4e4ef0ec7e50bcae4f5f3ea655bfa4bbfb1cf637c8d3b3b13779915ba4c2", - "2a071203bd3f3afbb4593eb9aef81202c2e0ef83c2ed7b4e153a923ea6a4bc38", - "526a125ca1f868ba2361c95f884db03c981dff4f11668003aed7e11782568753", - "9ac8e733471b176ed0b9ce2ed3e0abae1fba9ba18134d3f133159270a053cf79", - "fd66d9b7e5be9287be4c3965df85538c1f03b7bfd9f3b48c912f1c889dd74255", - "294d8b9ec9dd8ae996c7e547eb3bb74ca8eae160126caff177e968b32559ead8", - "ac08a2730931727ca8e0577e3cd3a92df3b1574806af3e52c022268af81a6767", - "c2f036f83185a3aa742d779d3bd346e10c49e562ee033477fc47824558f36908", - "7426dd7b5ee3a34cc9eb81ca96d75fa6e815685e2558707b28f20ccffca13c74", - "daca59e937e89f7ce585678cbce22a0281ac4ef042a6ccd46367fb2daa2bccf1", - "a3600667c37ed163fbefaa96a024a426469039cdbeb00c949994149588b3e1f6", - "32766715853e31993f782b42b0e27d4604efaca0b425e1bf728d2491d9b23aea", - "d8c2fc4ca9ad685ea80b8f0571ba7cba6787ef8825d5b7a8c79ceb5679b29c33", - "e9131e8c0e45c615b19342065ae00ae49bd77367e95c20e4ec96fb5d6ddecb47", - "9c800ebcc90a688e4249f556f6b365abeaf8665d8470646d16b0a145ed2c6f7b", - "85aed0b9359c7e4b575d530d2c8b6ba2a434d7bdfaf98f88548f4475f1e69470", - "dbcac414f26745c4c7df26a5785e0163bb196c1e03ede7726c39c7f96c63451b", - "8ebd1e7b6b9239c0217f41f3d52e837677fccd209bd526df5a78a5a73dee5755", - "866de99b0317210cee9499891250a28aac1438fac97cff19f9ac2da49bb45cfa", - "b1d5e372d2e802c7985345d86355101635d2799cb8cf2eaa91c4e73d7332c7e9", - "6d08d7e1c9741522f1c1251c99ef71257f9167be0ae8f4a1b5937de7071926f3", - "fbf070bbbe7af2926edca206b74a6613b5d01d00d9cadb3767024d7795376f12", - "8ce56075d4e6332ae2eeb3fc31933b6ec52e31481f03879f70703669d1846e37", - "188bb164e55cd4a20b82a5404046ab6fa31b0aedd2b5e2df0fe93dc859c74bda", - "b96203f3f442d5cf6f26117dadd30fed07073862761ee8d6224a9f35f0e1fc72", - "45639624c26c1cde7c65d722b522278dd1ed16b740f23f0aca79c74d874615e9", - "a4d7c35d0a3b287b86902f82ce731e6a747eacec37fd0e82bcedc9a6f28544e2", - "7e0843e0ca0c3037ebe249e91f91c0bce0dbfdaee94443b81d71f30eaed2217b", - "afdc9692052a6dcd02c3021e8f39e88b3152b044780b5f25fa651c0a79d890f5", - "790371b9f5c18209f832027a21ded53db0c77f20871f364884a190dd556ed889", - "93448a9d8fab83b7222613a53206a870d57341e7311c7b0a27d0306296a2e01c", - "bbc6243cbbc6f258a03cf1ef6fe0028188347b80faa1f5f2e9171fa5fec26375", - "1f2118153834ec1c7a114f3b8dc8479c611c9ea17423db6550f34111f675fc49", - "d8a7d87284b242e6d53bfd114934962367e09beca665cca9c18693b21f056ae1", - "5e89aedaafc87736138755ad4ed3203f7997008f002de582b4d6ba03e7ed466a", - "9e4f952a3b5da3d483d4805f993fb7729efac6110e3f1d03496a2417cc3b6711", - "49c4065c9a781a5e650ca536a1b32d7081161daf538cd1301b7fe96e12804e91", - "315a1efbe9c73c8801f08997b360cf7107957fc2b217f40b95cabc36d2c49df7", - "6004b7f850c623f33ba98f91ce3c5d1cb21f162eae0a35082e04bd60be942640", - "ba3a4ac68527d7d1b93899fdf3a6939b2c52dfe388365f4abe853d2af3e8ebe2", - "4e7224795db01dd9b721944b2c75f8d6083a4489d1fe238d3fce6f6c3aed7e0a", - "e872efac980a501fccc682cb3fcc65261a4a447fb775400314bd3e5d5cfdb30f", - "6daec7b575049f9f5c972cd871cb08e2b26037cbec57372bad657c5b9b04ffbb", - "5c41aa8be16e4720631b497fb44fc4164cc6c4aeb667e010685ac7b40baf291d", - "2556fc6ccdf5dd88a2842e897a1a6930c4186412088dcd918a6cbfcdb4a9e350", - "596f0e4b4c75056b7433373d512d93185cbe54cbbe91cc47d927f4adf1851b68", - "83a1e40797d174fc8008c6c72d8815cbb7eb8198a655fe27f587363666ef9e3f", - "ca8c05143f0ebcfea55240147c8393864fa3e4a05f4d965c90aa288aa6eb810e", - "617d3258a2520da390bff7b2b531c2a6c505907f05d29e65e37ec9936a12e5e5", - "2d037dee29f28447c3f5f0efcd5f1ec75f126e25259238f741d5af028b88ab76", - "17bef90913130c0a5eba814ca66e7b8339ae1d3d173243bdb0a9b22619a179fd", - "46fe22eab0e8edbb441fa40e24702b53ed07db2242f137c98c584e869336ece5", - "5485392fc4ee3dd41ab349d887a1fc91d4230b4ec4a965f74f014743bda8b3df", - "5453b2356b2c8067c5bc0672090326f13c6f77ea0a930d5a39e4e7d4626f3ea0", - "ac03dec535063cf2f0a324feb795502f1c82a621bec35deacbad5d8473e5fd68", - "0a14eb3cfa50343cd5365212c19047ffa19c9b48de510d9e55522e2a3c3e2645", - "9b3f48bc5d581642823091014843e52c7305b658ba13862fcc960f834bff9676", - "1cd027ee14493be98523157b8d56afce2275b45b6b014aeca46d687ab4b7bdf7", - "94a04cc8db08880d453f83d88dcff1c0d689bdeb6a8bc4bb3dbcf141fdaeb0d5", - "19ff1108dc78903d683d74debb4c34feb19a51b02b93e259eaa000a7e54702ae", - "50e78edca2b43048e20cb711a0f3e698e1b71e90c0550341b463c2b5b2e7d8c3", - "3283c4ce2b11c57512afdc978f6ed608f0bf64a235f7faec43404028d82b9f47", - "7954bb17352bb632acc1e4e82823e0d78f234b414fecb2bb5b2902c3560eedd0", - "6d8351a27e40a8515d1b5fa2b50dc649893c3cc52c2e836b354d73775d5b4d66", - "452c5bff2db534c4e7cb7683a08f61ea72e1670bd6b25cae716750fce0c80d64", - "731b6d044a0bbab344b21e0626c8c8b6dde83a64dd50b05433898f3326f0a2e2", - "9c2f1401234c0ffe17bd2bf817de80846fed05b1d428edbbe4883e7dab845e69", - "032fcf0c200bcfbc2c227cb30c6eba5535fc9ef55658258d5695a2f7ce9b534c", - "376a8704f062dd1549efde6b48e29d054f7bcb204cb0e98c8bc3c7d0c307c09a", - "2a6d412be43f2796c00e41d68c36ef0f94982fce84f5da4997bc1d0ed52a9669", - "2aecaf67832173ef18bf62319ca4d039d09222183a42d205e35d6381058adc01", - "23826c7db23521c1bb2c230b492092423ba7c202b7986c0b1f7d6e82a60d0631", - "ba77386b3fb7a1534898d73a1bfe25dbac894e832c82c875461dcea14569774e", - "8e27dcc8aa02e69516e17c8ca91e8a05eabfa2e3200e4539ce9ffee9319a9f89", - "7bd1c803ef7e7a0a8878372e0e507312c0651641c6a719d9b9109ca24895a69c", - "ea7fe709972de62d13804029b28ed8204d63e064a6d90c9b4fe71c343ffadfec", - "4b429d43d6c3a031fbc89e9f4f172921323bdedf262ff2ba2e1533dbdc50726e", - "09c7d5b4f59f0c0e1bbacb8b1452ffdf4db4c5c809dfa38883ba8e723df5aadd", - "7bc9af76e7e9b8501b8884595eabf01e1811f296cff0f09c542837a4e7c00a31", - "cefd192f19658ca6a067e4ab72279e570cfbde8d1515c851423c3fa0b07ce1ec", - "e1d4a33490fea56b1f490ffe37a82f38c23e1bb465ff70f1386551f6fb204741", - "4cfd743e1df2572471a6eb6b140253de195db2084addd690e21e689180586761", - "d7f6509baf09852e4828b19ddf1519f73bfdf3e6a8d795bbc1114992a4945ff2", - "14b24fd52808e4946c2f0401ba09bb0fe8c879b29bbcc78e9bf35ae782935ee3", - "f41e313003cae989099a5f465fbd0a4c42748310ccc49ad03114024d6bed2c42", - "2b7952baeba6e209df71df17af38fb1fe9d75d32c347de932528bd99c0f1fe12", - "ad9184d68646e4ac6d84081c8edbe7528af99b4af78df9b015ba4749b0574150", - "e0776e1dc6a650eb49dab3a6933ad1942eda78d710a5345c27ee9fc268f6708b", - "9a1d955dac1d461c93213d6a3df6f7046870e47a5cd611958b0fd8a44e5017d6", - "bdd3f4acd939b8518fe15d5f8bd35dc5e566403e81131a65f538f03a135354dd", - "3393d347cd8d13f15cc7355d81c24331afa1a1f0dbdbb377b41b4db5689fb911", - "07a87502695d15157b3b5693147e287cca33f5245928e7f2fde1866d71455761", - "30c0111918853d6ded4706a3feebe761cf3eb4e4ce0a7033932fc50b64322e6e", - "d56ffbc69ee52ed6abe408bbfd616ae45ead35066f1fedd1abb13af0c27c13e5", - "b94ba2ac33c99f3b54d0cb2a1495cdf786d7ea6507a1b0da1630a3474af4061e", - "65a63c30cbaf77366b2878214babab549ad1c763034f6c7824c7305301a717d5", - "d769d9bc6aeafca7a4d9f18e163484cc5fb44d15ed07e5a4b40c2dc70fd10b4c", - "f3097c9137a2fc239e0b8f1531cfe71d115e505b6a69467fd648215f452d70bb", - "205061765f42ad154953d99121ab9a67593e3fc99741a8ec2f221a6610a92f65", - "a2b0e76660d412ab48658eb012416b73b8bd37c7816b14c626d3bc48845e13d1", - "c9a9ef5b35e763054489f06203eaebdea3ac640e66ee17e1577735372d720d41", - "8b2dabf35a1610a3e172ee17e45005e6dfa61b5abb233e7dd14dc4491c9b5798", - "9c75b1d6a7119ebc7cab7a58b6d2d78b8e098f0e7614ccc57f45c8845cedacad", - "dc0e0b1a8f0a6b6e18b5fa7bed7e031b33c5196b9295202617f68d60e29f47e3", - "e30e2736561e7bf948d96f42e37e1a8c599dcfdc479768dd84a5330cd79c5791", - "1d0a68f8b0e8ab360259f003562b253bf8dbcd944445d316bc867bc74baee6bd", - "532532f3b19b3682724d60fda0e6082a043b84abf145d77e0aad565e7f1cfd9c", - "28c243764a23ae1012935c500dd2aad4fb089b40cbfcf583cb245f44fa730e9e", - "8738b7c8378e7accba0af41e054faa1e23c3302c30275b736f5a553c7dac1d7c", - "cae90d41f4ab2acc8ce058717d7ef19bacbe228f480bf39a7f1f6b9c0868a746", - "6ebe8dd76af765177a6436b4f18a55919da51d8a77d04d94a37d63e7a5ad0dda", - "87c135f22821c0063fe4b9fe4c3708a83ca0b905f6eca7ae8b77ad0c67c44f2e", - "f33d5c06696441f226e93d7bdca27184e7a7db956fc482e08e3bc5e701c33f58", - "40f4e4a8aa4c2dd9b52e42a9dee1a0bbacffa5d4bbedf1a3b12ee7636ac61244", - "66aa954aa114a8a375adff9d1a4260fbd2fc7a0f7c9271bd2cd32dc1c5f6d68c", - "c4abf7323ee261df1412ff161f90e84bf44e6d7a661646baa4033ff303fbbf6e", - "1a3660885929b703315e1284eb725af257c52560102e7150280a9cd5bdc9a024", - "6d458517f9e0d458063feda07cbabf7fc06722eb3dc78c3d53ce68fd69bdd446", - "55792559a731d9e2b0d52a500bce93edccba85dc5cb77c1d874c6ed87585e7ff", - "99839342dacff03dd5143d0a883c0e1967ed02d9b5b6f0400cfc65bba92a3ae7", - "1c9d48fa7b00cbc79043fa4378a7cb53460f20eefad67726564e44102d1147cc", - "0168c6a3e2fa1465b2b9c90a9968621598729524fc5457611a7d053328d6bbf5", - "3e14cd813f13c08343eb58b18ef74c6a1a31f66e7f2e013225ada0ce5f22c64e", - "38e6a949ec3e66eb54f8afbf265b20afba4be31027d7593b0b42c7d90d466d4a", - "61824487945ad05229badcfbe08c4da2449be4b173c855dd60bedfccd13997b9", - "9619a12b15e9dbe5717e39efadb46e1992d7ce2f06dcdfbc8e2f7b6ae899ffb8", - "ff19cad2133ef7658f34f372552c31ebb27fd795b444b7cca611dc50c3f4c829", - "ef32f4236475964f09ddd9ada2894292918af7ff1da55691a7ca34aa44dd971b", - "9a83d82b50ccf8ce4eb6c29c0d28dee6e2d1cdf636f94e43db82cb413c041679", - "7e19a6d8f2bc0dbc6233ece715ebb8b1d5168d070ec95b8fcdebf948a1a56a81", - "730dafdf2dfbf9a0fb6656274c17a9c9d222a382cc263eee6c2be1ab3de75e74", - "a814210f39160e2524e1aef413fe5934c5e5662e90783eb0bef975af7f0a3a9b", - "74e4a23556ee6b1b56ecac138078f55d95d7845ea701fbe52da6957c96456dce", - "a0084b0e90f35e38e73948c1c56025d76c8bb44d1a6b971e480a21a2525d6822", - "0a34f2a75c06d80ebd8bf976592a07b4852de48e81aaddf4db4d820fd68e99e6", - "f5fce713e5f7e6decce85ed705519eda24c7606b37605428269ac65775a5839e", - "7d259e5e9c41e4f2389b81e6103dcfe7be4f76decb2f0164226abff625720f99", - "7a940403e15663e6b7addb6ab8d0dbbb0d0709fb9ff3d8463058ba501de00039", - "b6fe2d71e27f2efe9d1dcacd0b18ba020f1743b911c6624341647312d2b49029", - "77584b1fc6c03cc66f55b7daafc942c181ea5d9f5c42c727372b34695ba5610c", - "49d3c56cfa5ea3a9705e06cf78afb50f9f7118cfef16ce9b61f1f18689547917", - "4ce3c2b310ec1969bfcbe1ccad1b6d306a6632420be593116af23ccee7f0b548", - "36ca902da81c05fe607754b30857cb94bf1a3ce8835c000a33cc4c38cad9875b", - "ffda3eee30cf8b2e17fa1f12fb51ee75726152ad8cd8fd95c1b36b93b35a3ce6", - "f7c4c7dd174285bfbabac6c76519f1997235e4efe04b2228bfbd5214fb1bf6d2", - "12e24d888eb8599362f9500706eb2d90aa08e917373113e17f80afe478468fa4", - "8aa2e1994c627f60d9606968e1b80cb66e5640b9d302ac7035da5c068a7b88f0", - "af283a262d5cd4d4e62a776b37526f6dccec88211ae2bb6ec9bb1f82eba623db", - "1a0e38c63f2d3cef52ace003e2ba66875c758bdaa1bc2575057d53817455055d", - "d403a813bd77499fbcbdc0e95d43d9ab126490139f5587a6b5c0b299c31b650c", - "77ea0157c4ac85eca7d8763323542c297b10ae9a4e1a1bc2dfe584636ff5233f", - "980cccd52ec1ac234c1ceadec5d9f080fd0dff2718eff4cbb767c23c722d52e4", - "d5665d214aa1c3f53bb731e5b06da3da5222c9dd395cfc8fe18d8d347718fb6e", - "4b7f96cfa168c93e9b03a1568bd8a45f649510a58a0070595f37c003bc7db8df", - "f5cf68c2684b8f286de526ec2905a94c7890f76c48f6db0421dc526e1f77a817", - "e14e255119206eece3def3f1990f484168c9d610c8379ac3b3e491fc65322b6d", - "19333a5661b49d1c3c19a7e076e91629dd01ea61bf75a69a8e7d43947d4d0a3d", - "fb308222f29758fb863df40d9b7010511c1771573e541449e68a811bac482cac", - "bf5d83563d561159c6957f0a3d4fa08f737e32e9c365136928fae66ba03a7c9c", - "540faa1fad9f1e795b24e815c554d62a17423f29cba60bb95aa14d1435ac850c", - "e87cb5c3567b4f0eacaba284168e6f49897e8aff1e0c00355d1c09901caf3312", - "ed0e8d9d18b2ee92f9f6c4023c412b9282bb858728764ed3fe854d0bafae9e22", - "9cfec987db11b92c273dc4db639da846103e1bb0eeb7fab490a6a8db0afc2bdb", - "f6656be13bc3790122e4c707fa9f183de585e8b3025a096ff3f43cb9f9574e8e", - "36a3ce8178ddb3de40535f94518fddc8784176409f1cae7cfa5f90913ba4c20e", - "ead9fd89a82be203feb48299328ec2cb623d3fbf74e0f6f5b68c2cd04ff64ebe", - "f768ae8a1926c749a29bee68dea1dc7ec6a68e7829ba6ded8e10c46335561a1d", - "a223786a261b4d8bca6df98d04aee994233c02b6b4828ee9b0f95fda831d6576", - "fd90acf1b222cb8a07114ec9e7700c3f2d66cf245ab4b5d57f5cebc439b8566d", - "a9b25c57c1b0a5bc40b3f4cfc9b0429419387246f34c9f7779fc807822d96dad", - "38bec68d2a3093fed34188d45eeedcacd8bb19f479ace91a95a7d512cc53703c", - "440afd789a10f03a05aa950e2d3098763feb6b851a9cd71a1c3852bd9ef296e1", - "516397694f7f0c23185ab3e343b77c855f46bfe89b26cadc642e97f6f8908d39", - "03da2f311c8fa31088c39dd92da8eda77b4e572a70a8f9f22019d59f9d76e6ff", - "0b678afc7c47e3c43ccd8a220e31a49611064d29761572ae3e8906706aae7e4c", - "fb77f98db91b44d8a371bb8aa465da2ad6705de9e2f4028e3619ad2238afae7f", - "dcfdb0027cdd5426b5c21e797024e142fc915497b18884427709371c43f52ca7", - "3562268adc411e3983da2fba22671344676821bd19a42dccea2d179a866cce8d", - "f109dce76ce5fd1e3c0f89e3b9645585b37aa6ad023bb3bd4801811320502e28", - "8216ddd4db6e734f6fbda4c11685cfb42f6569acc671f84d3ae8915fb05c731c", - "e91e37f9ef83b6d71b58aa808b5a335643e346bfe903f2f9f5d090339d147063", - "f6a64a6209490c7c7a36a3bc85f8451856fcea21863d15f329039974df330f5a", - "4394b00cc1dde9046cb18da3729305e3f1cb164491984d3c5ebbbf134f58356e", - "efdbc7529ac7f4e2d1b6ae34a6b9587e2e0f6c786bc50e83a6e92f93ec3cb58f", - "1ce4704280bd2132650cddda2f34575a741a22817c25a1f746427b0c0a1f04f4", - "4ea66d3c46418f1881b64c7f8da71443731be9d91329e808e5f605f02d322017", - "d2ecb899ede66ecf6eb2e14080d0898d210477ab424c93b30874389eeff43625", - "eca60b470790ff1030f2d155eddbe1b9b0588f7b179c5855b956bf39888e1397", - "c218f30e68ffebce6dd7a9d68904ca65f1ee3843347f92712460ed31dc54e9fb", - "b99fd5e8ec069c771685c7e5846f090e57021b70864309c36a565ee1fc608ef4", - "53e1c9d74ab619ef9d41cc6223e57c351621a49f8de89b19e449424646e8dafb", - "dc1c17b55da1299ba97c8f3f9a37db3a9794daef9fffc12331a904d87e22d004", - "f14e7f0749ef4b238efcc7c0b45a3e642a58585f738eb02c303bd9ed0d2c517c", - "37ff6c85be649f63a71d37067883dc64a1447f0ae8cd36db8dd5e00bb72a75b5", - "bc105654d56851dd041bd8f36d1984c2342d134e05eae97e29c8a27594920491", - "8f7a40018afcec1e4bf1d8b42145c8fcdb09c7f55d25331d3e1f093b0b3f99fc", - "916e91b0c4cf4a4c5a2afaf56634010162df20432e14eb4b22368e5eaaf68bc5", - "96f888ce5aca79456aec553954db6610832cd0b74de82b6458367691867cdd00", - "8fdfd7efaf833f29adec26736c0c32e6f53737872ef6a85bc3cf65c041eb406d", - "79816d465f8749bb04a23134c1fc516fe3ea85052fc2129c0bbd34e1341f4fb4", - "3b7d9a980750b58d8df4eeee0c9f71f6d81f26b771acc6ce215ee39f76220709", - "97fce26cc961e308f6a877fcbd2d4c3b1d848a1468951697df8d105c2e6a92de", - "67fdcf0aba2ebfdf990268ba0cba42b37d9deb07a0bb8e4b3cfd25f8e69579f8", - "1079ec8bf70e255fbcb193fadd062f1e662f0f84f5fbfcc6b3c145e2389c5c85", - "fb9988ef9becbc308502b99aa17183d47846075f7e888c9bc7d638be6b938ac1", - "3fb5bc59a5a15871f71e4a18c7f76c49ec984b3d2e7eea19bb6bd7406360cc72", - "6f50fb8e641b5c3e26bf9572824d612802366a915101623bfddb9c37ee2ba09d", - "24ce33165fa8f3515db4c3f6f8fdbe4b4ebc8af623ed0903070552beffe5021c", - "3c2dbd314a8bacad7e4a90081b065ec61cae4111705523ebb02debb8c605bcb0", - "ceef4f3bbcf37c4e32eccf1546e4279e341666fa8e2a1090a567f2ce0b597fde", - "e4e04effe5e2464dc7635e208f8aca3e9868d91e3bda57778ef33397d383ef3d", - "8da11c8b49f3d8c776e0351d6a9d8f61057c815f667fb4f2b917665c4d1e8cca", - "5330cda93136661c92f4889124359e0fa5cc788353fc7f4564338498e0755868", - "a3186ade399f6fda04ccf3d71c8b1ace84905ff6ba58b84d9269ad28d9a4d5d7", - "8131db1a3d4fe0fedfa88c64fa198cb6913762bfb413577c3ae48b7de8b6cec9", - "91bb97c822d14b37ac03c78c7cd5be1b175f520e5ec74b215cc820aff197480b", - "77b895d1ce591b87ad29aef5c57ef19b7a7d9247c2ca418469dc352050316688", - "0ddd6fe9627e531c8106041cbdd7dd27a034708ebf7c3379ec94d536a555fb19", - "ce420573bb549034a24ea52512f9cebca846dc10f48e6e5ae315cd534b4ab3c6", - "994996a501cceaafaf8cd82ad30a6219bb6f5e004763dd895a0ab36b5d3f58dd", - "60fe8e0309b695e8843ddcc2b491cf5cfba2ef836a61bd679be572cfa83b7e90", - "33caed0f408202e40414041125d50447b84b34690d852f0c1fae347909c699fd", - "25de0fc650d3dbde5f0e5a31b5488dfc450e0f24167182f48363327e9aaac2ed", - "60fda01fa63af5790989d11e7df6bd420a63f0b0f5b23969ad284365975a4173", - "addf3645a1086d8225a4f7b7c20b02582637fd5a0cb3a4d0e4348d04d25c3161", - "59c137994eafba5f3830e53b1e9f896038c601ccd74c11472549a0bf2f495de8", - "29ce8cb43eba1f52c46126d30bbd6626e8a966ef23ce40321a16797d31911313", - "ee2a4c1c2d2eefae14dd262dce9e3fbdfd98a2bd5cc086acce07b5bdad4f364d", - "38fb4476ec5bdff04c7f82be8eb44e1316cc0e9ad35cc36b2a0164bfb391baa2", - "3e2fba315e9bf81d830469ca07af1748162904ae0f914949a2ac9c1101618fcb", - "648f2dad8d407a1559599049b5ce4aa7de47e8e65e0323d7199e22d8762227a9", - "148ce0fcf95eef878a3bad4e6991c8ef575de522aebb4b50a416a27a158daf57", - "4e14ca6b9f6296f76b666a5fd00a5c38780b349dbab31edcf03d752ed0efc69f", - "ac98633e6d449d7ab65421a435eabbbe6ab144697dcf480f4febc5d3889c6766", - "1021e6489b88e660b99d98b79473c67d34883808cb299ecb8d22ef449c289b01", - "dfeddede7a70dc928a5ade3e4863c38b8ffc09b4173e550787dba60cbc49df75", - "25da2325f71650ef5b9ef315125ca8c80eb98520cc42dda77680731fc9c8bdc6", - "c77201e2a0a49ade535c8989fabdb3cf0ca6e2f683e77f4b9c2802eb428d3236", - "9fba61dc92e22091a7b7292bdd8a12b854dcbc45a3a2b2d636c42e405b6e6a47", - "b40e9fd3687e8b1f7c167463604b82bc736c397f6ad0190b2ee08d52386a59f5", - "456c45b3dadf64bfd69225ff57a3fe8cedd398ddbc301238166662e96013b8ac", - "b435c4d2b319da51141e5e9c444181d75202d86f161822d40b64f9e44ac4d23a", - "33148c53ad34b75860dcd825edd67509af5e9c5e556432b54e726ede64714a12", - "42fb5bfd1e5f1fd54dfd608220a10773313ebdf9b915fa6ce5e98e6afb5e87b7", - "8fee74cdbae6812182db002b0cdaa13e654327c242f500e1be3df7bd34a82d4d", - "e398dd7e5b8d6ab6d48219954c4c484fcbb36c2d7631617f9a6f40e64398e7d8", - "4546f0eed377ce366faf42461c1583fae06b0984c5d7952d716ae923c47c220a", - "08b8b6169d66c3f6affac6059bf1b121a4504d8c48c33ef1f9edf671b7c694ca", - "ab783ff6e8bc9a1456e4becbdc4dbea45363ee8f03aa6e1183f18c4d0a361203", - "5499e2293bdcd572af62ac022a43206a6f1327b8aa017adb91bfc99ed1abc25d", - "0d487d97779aa74290bfd181b9095e648980ce2b6eeb2818dd284fdc74fbd2a3", - "e28a791d2bf078d53e5199d314ccc024e64ccc729637535d124266bdf04a995c", - "3028bf069616da7157d90605b008bcb9ea07848f51aebd214fdaf12a1321a4da", - "61658faf591cda90a92149a4b479c70e2b88ad89db1905113097f7ee6c24aa95", - "5753bbcd7a1acb50c91777d63041b76b199d9a59ae6f0a26b2bcdf6b9e87c350", - "46fe4c8f9987c5b5d1fccb8a9d66ce554506717642f70167bd133e16837682fd", - "a185f7da75a0d10d5cb9a507e196030f4e571b24e3c5a82ce5b2baa30fbcd0ef", - "05ce564439f9a80283d3d5b091a0f8a8b86047f8052ecd109ff33e77c9c28bda", - "47d1075035b2a454277f064dead39a72a3a1ac1a9f32f8634999da8696f8b66e", - "1085d485882a3ec38729ccef344ca3cf765cd75afe8ec175d93d888ad7ff219e", - "d183b98e32cf712f582983c831a71bdbeae9c2785a6546a5bdd2be9dac7de9e8", - "5011ef5e8e1fdf4320e841f61bb30a5f3bdcc6bccf8169db9bc34019664ca708", - "a9592080ae6ee78f06014ea0021848fa48aa9bd46a8bca4d2103cc10c40310a4", - "c320471fe052a42a13d6550343d0f3b3317a66df3aa75eeb823d42e5329d2b2b", - "82f0fb573e4bce502077bf7dd672c0cef8edbfc3b28810cd389fcf8ebe947b67", - "ab563a19392a40c6676d8f0bfb6c437de078a998e198808d57262371f9045923", - "bef4e118888764ffbbf8923519eb67c31b47fbafea64560eb4a82bf08a378902", - "7bfb6d70daf95a2dc41a8248516c724156964644eb7e23175445c75df5bc1bde", - "b80c67f45af5f05a69e9c1bf474d3d4e53a3b7d19ac0b74782b566f20205a3e4", - "0c126e548baff3b0ece3b3853f591595cba939524d4d23586d1d89b978969259", - "cd6f445cddcf750d08767822cbf057dffeed086b66104bb3b01ffb5bce7bfe55", - "1ed6fa25a0106e606417a09d6b87e6fe238fb373a28bbdf8fc69cf799f015265", - "4c8c7d94a454b4428fcad9b84bedf325c7dc554231caa84c9d8ae5af51958184", - "89ae81b56d47771bef21bbdf46a15c4680ba44e07a90fd105ee4709c0bef6057", - "16a6ac0d7aca87144cfc9c957b5f6383f92ee40ed28d6cab6328771724b0415b", - "a269afe4e4ee2e52c21480b1e2fab370a7097fdc2adb9200ff5ea4de3b3d4c70", - "f4c3d59bc8c2b6612879146b41ad9ae913750d4c1898497d5b36b06fe80156e0", - "e9ee65f3554c48f46ebb499cbb3d5fb8c4952a5c3b4eb5098cb9b2fa3a1c12f6", - "bbc565cdb2af740a1cd8815714e3c6496009f7a7887e3b3416043ee976df0678", - "a8fa9065266088d30428e5fa4a159767492ac868b0ff00364d345440f53cdb81", - "a999471088f33066b60d3f41c320a083d4c31ba4d35fae1bc86726861ace37f7", - "3982ffb8c577991c030c04752e4a3c2a7188ee219ddd59cce4e8531d8657ab76", - "be5bb9742e4ccb50dc0afae628f607567e9675d46b4504af5416cbfb36211c23", - "066223f4f600c58a5e1c807b9af91b6cfa87d4651b93a97aec96d4b09d81260b", - "4aea510c1d18ed78b41936c349f63df3a0b7c449b7b3c0f72e1b09faed24722a", - "387b66cb84032d86bf6a95810ed151c2303e3245369d6add1f2c898c5b9ceaac", - "51424819d95476238525d2199691eba0a5c31432fdc27c541ecb889db2ad4cfc", - "97eb2a025d7bee110675278711326c310651d5ca1cb062babd4053cd10822ea0", - "270f059af2855ab383ee59917c2338f5fa44bdffacb2dbdbb27b58f325052d27", - "59431a06ab437307544c226500a7fa566845b065b88a1df4714473aa4ade5208", - "282f9b653d9f59fb0fa78f4da1e0ffbb95fbfdf9ee8f0dbfd523a71bceb2256b", - "dc3572e2148c6714acb76ff22c3dc69d7f83f64fc18577810268ab6dad6b73da", - "91d25c665f0cdc76d52c62aced56e629b90487e871e15c5f5c6270a76e75a98e", - "e1adfebbf4c288cef65b581014577e6d8019845960ca5477311daf94b3a7491f", - "498436b2ea1d773a1027e5b8d9295bd86cff54ca5ca6b0d3f1982e0847f0f020", - "7fbb1600f0921fd58600850a5cc50448d8af65d2bf931d3968dced137f37fc05", - "6b990a3a0c57b379be1302d70d69112b5264b7dc2995d082a11f83bbdb10b968", - "9d08f90ce7d3d03de8c1e5717f98a383308e1fe1be91e2c49d98fb6304105f58", - "7c2d4c2cd51ee3d01930e0eaca9cc6ff3cb0a2828e850658a531a6e9a36c76d1", - "4aa7cfe1878de3a577cb3c74b41106bd273b4f1d1507b928c7c6b2a47d98ae85", - "6d62dda0b02663386b083f1c60ea51e62307cbb321df2e2087c998e0b468a51b", - "592fa0e3b7b76cacde135fd01fcdab99905b4c686e4f6235091a5654ec76fe77", - "d65b16a2837d97df586a76f48f4b023dd49d9fb25802d8e8c2658d3fac8ab15e", - "390be14a52d94626322e24f4a34ec0f0603a06ccd2d3e09661b5e95afa9bd9d5", - "1ab0ef271bbd0781d9f7796a94e9064441f775171b736874546f728ac5903b71", - "990444f26f44fe24029d257ec51a80af20b4e912c7acc0b7d04274ca0002d9ff", - "e0dc7f0012af1bc13da31e79ed5436ec442c78b53608baaeee2d8e0f24612d0e", - "87145b262db1f1deb635ee4ba58ad10d8a58abfd75dc63b9f36ea80e60916771", - "d305fe0a7f874b97f5d471f0707bfb75948b78d3bd9fcb3d570ea44f5386a7ee", - "e13b425edee156819412faa615608c60729548da5adc06475718c656a101eb19", - "044e04335e2d3e9b5b817e30fc85ffc972e70a77ecb7ab60576b3f538c6b088d", - "a2d7d3981b595b4a47ff70354cbccdff1ff21bd13eeac0f66d3d1485191f9908", - "211a84fa82b9b23d0c10c484588b23d53ae7882a248050e1b2587fb3fc6618df", - "3e39e87336c752d99ecea6300ede8af7416eb15ea7463a9eba60488bc1ca7f7b", - "7b54cd2eb6038f1137f47f645536b5a9fd8f96c5863df6d995291f8167f41188", - "09ad071e363d5e242ee2cf0703c62057aff87a2a7287609d3cee392972048079", - "6964d488654f9c164a4b972ecb90297374dfb30c819f906185137d0e71325687", - "85a35b48b639ecff66d323648b5082cbb13b5e38629f1a7f6c9516aac5295e81", - "61fec1651657b7ecaa1bd6b1b2bc93a36cc41d1f5f177c0a2d7b666233ba9e82", - "0640fe17a4a8fdc53a657d25411d4a39b016cf99ceb04bf0131d7e0370edc865", - "4787cc4b40d233b4eac12162905b6bfb995cc25d473148fce0d25d65b3e6f96f", - "5c5f34bc46120511672f87904130b79a649f59a60cb71bab5173b28f6c0416d8", - "43a18fe1f131b66cac5fee25cc51107be0e28c499b18d172be838710d963855c", - "9accd5ba6b980d69097792901fbaf3f2f6e3a908ac27d91ef950dbe171693b31", - "1dd51304100ce807005a0439f64128c9e9f46b439b80350d13635d2a3b01c003", - "8ea6f84a93bb62fa211905c06ca1cc57fa935708c259256fcf7d408dc2e0d1c0", - "e4fd61b49e484aa948186ebd4b8f57c3183b12729897bbe009d6403a2269cb27", - "af8d91779158079f823130346635b367ec0b533ff92f04d3500690d579bf2511", - "029d6793ef7cf23a55d4826193e350ab0847ab4e1cccb9df06d2de2f89da895b", - "e9a240f357455b7092135a652500c1b566c35844261d2a3e39ae6359a05fe143", - "d4a7755eb68a47f399672b1180c7b88d120bffb31a9d410b9d4fe0d3bd9fdb36", - "1d33685c67b35bef06b353995d98672ac0ed5caa9f28946bb61997ac487447c8", - "689547bc4042b66430d8294adc0b8afa76413db78c9b749c635c6bbceb61a757", - "0a80ea8b5ca6e4aaea5dae122df23cb5257ac118b751ba283a80f2db0b08c768", - "4aff53496f3b98495e9f14f703490882f3a3653a49fcf8f80adc01898552cf93", - "bc473af02d951bf1253ecdc8029b5c9de003f4fd6f1b62e6767eedd4e5dc7740", - "235da088329df558480c20937d33c51da282a71be256f20df247508d19181a56", - "aef2213de66ee0544763d15239146fec63b05cfa471efed2bb75379f87c8fccd", - "c5f055a0ece153e7e3ee64dc05e35f4c0aeb67641076fea9394d2a6bf54fecf6", - "e68901209e1c807f82139fb1409738eb7df1ba344a7d0a196aa576537f923134", - "0e424b588f0af2e4485f60f5627acf7fb223a39c8a91cbd8f0acb56ea6e38ede", - "78a15c7132bbddb788501498d6b20725841611dd7a0185bd7fb16778849c439d", - "a0ea981c807ab426618f4d3940db9292406cdd12664d992188f8fa96bb0f352b", - "dae092418fca9fab928c5e0c707007b375cd9ac3eaf54b5c50dd8222cd0f5932", - "9e1944ac4e8c04ae0e5e6de455397dab8628d428b2e375f5eb0d7de0e7cb95f1", - "a2dfdeac69750cb082516ce9333eb52cf3a93b5fc3b11294f447d6746be991f3", - "0adba63000d6d4088de98af4a9d078a548c739eb55f45394b32e3c9325c57734", - "f539a7b02313b10c3121d4da9c06c65040e54d69558dea57b9c746234bbcb1fe", - "2fd622d650be114b72c57b19a8eff02af2b6fbb318805b110363c286b698a854", - "e8094184e4affe9125d9d08b2960310387e63899e32fffd8073c9f3fc5ef8197", - "0ea6c53015c533d191ece71004ab52a1b845a80e03edda5ad5276e248f076a31", - "8f73711cf1cf9cebed8844b9accbbf42656023571bcb7c9fd58779ae86bd820d", - "1b022510e6e5d85959854c16e6b1bf08910752659ee5897f685e4bbc555b83d6", - "93900099afaff1f1cf9dd18334fffa49a1d0aa6ac40ef8270c99a6ab424b565c", - "349cc245247849f7aeea610d82143d8c09c33b8e106af2ee17e19d5cbf97eb20", - "1c20115ea673a4f2fcdf3b8631579072e80b9a9b68ba6095720cb5346434a562", - "e9747ef18aaa4d583b822705b02f03552ae9e0fe6363799f5ebc7192b3cc2d91", - "a86cf8b6ad50ecdf5673cb7b9eaf70782953c139983e3a3091c5628c0241639b", - "02413792173912511b03a9795e6ba0d52dc09236d2275accf82050490fca80cb", - "4299aa0f8943ebbd6171627ba2318c4e0032e43fcb78d586e960c33e73362679", - "3a14968cf86b91ef518b32686d6deee7ce8d3f0b8a1a3390a883a4bd5cd13f54", - "1e4b84bb4d7c3cf8ffc7f0d2a3683c531c5ad042e5a355cc5780358c45d92142", - "3091b603a708f99756ec12e1fba97b0bc529321256f2d411b5650f97ca4d69ec", - "dba76a10665339db03ab68802a28cc941fe54f9d4010098f52240ed8f02e7eac", - "bfcd952651ad9c6103f493f52bd1250b8c4a0d1427138137dd0944ced2bd75c7", - "1c77791f0576c7a5552ecd9188286cd6303cd2d623a18b0bfadbc6f57e0d4871", - "565b21be5d8a04d37750d84e032235c7f055911a173404a0f5dcc60df4cc73f4", - "2900eefafc6baa126bdb77daff1820138a237ca5590163b16c12cdf62e76bc5c", - "ecda7e80545fe37a9a2d6e3d199938d67f3171e932414526d20bc67cf48560f4", - "e3482156eda29276ed8aaf59d6d98696bcb1d7536b6bee5ec797894beb379bc9", - "e6e5cb67e016ecf408d31d999b5316ed64634402a64012fefd9fbbb23a640ccd", - "51e6bc85af5c9293b5272f6acc1c1d956f3cdb65b87fe23c689a3a1857aaef11", - "fc84c784cf6cbccc2cb2e1057293379a6d2f576b481f5096ebd9a67b5a80be5e", - "a5460edda9cf6eededa261c9afa9889ae46b6bc48973b3918784c80d38ec6596", - "3da295e983598d0885d4d5e8e52448e92b68367450c5b701cb2fd893cafac61c", - "9ba34b7b8838199a86df9082cbf7b5d22f9c75ded9744cefc06bb5d49509e8fa", - "cf77d2af81b778e8cdf6d08ee88ca1ee11321721ecb4725ae55b6dfdb33254f0", - "75276f7f69c976ec70ec0c99adf7409db8d141a2e49d6b92ed83525a6a7b5b20", - "c04f12a50a6bb829b7752b7aa5b53e45d87d694a6e4786ec88367c4249c585b3", - "1ec17d1bd18ba6251cb9af4f009798ef3aa84f6411e379c2b6768ac92dc25c4f", - "e953d0dcec5a1018a84f2ad021961a86fa708366c41459eb7abbaeaeffec0d23", - "faea49b99e7964b1b47aba9fb7cb76124b9455d12eda4ba03a9339521ce47320", - "b4d906756147f13bb0010b3cc74394b995ce41c14d66d578da86d917640cb05b", - "365ac3cae9c19fd23cb2aca1b9d776bc3d68208312e6093d6d4fabcb48fc3bd1", - "24079360ed0dfcec9bee7991ac21f20d4300491f90e91464b42f1d8c84808d6d", - "dcbe3417284aecb394c4e5438a2202292f1cbb923b7ab6d1a9f7ff7aa44468c9", - "1c6ff246ccf0dff07165b845f507f54d9b10d0d29a2d5e3fe0ff3f61ec8d2d6f", - "646ea4c992667d7bb6e2863d936607e2fad31898819376d2572fd07e3111a7e5", - "2e01dbf77b8e928169c52d9b5f526d2ca38167c969eecb9844edb43c91c7b1ef", - "30c109ba9849c899854046384a1cc54736aa03aa5bf50c340814e10978e60795", - "b74c00021eaef969aaab856ddead13216c003a29d0be052f5e31ac90186f732c", - "93449b7d808ca9e8a77ac63e2be4e1e31f0c01c777abe788dc1d73c17e6f370f", - "a8f7f4b0bc8e68e05378153f2da184565b05cb94126bfd10958edd0adf909eba", - "f9712697f305bb9b21d13303ecd8987351ce16e64e6b7fd90ce588ac7b9274cd", - "2802a58a969c3a2895dcd2e66743370a6ed7333968db073ef1fb1a4525c50fe2", - "572275179d7ee61563b9882b5a12f4d15fffad4ba547a6b4520ffabacfe45a33", - "8ad684506ee0b95971767d3ddb1f9c50bdacf9fe8b02fec1f5b3b590bf9e0eb8", - "e6267c0ef05fe8c9db1053ce192761abd9b9fd129e8af936895b53bc8b24c3c7", - "756deb833bbd3858632c0f9d46bfbb618f3bc700880d10d783fd9f7fe00728ce", - "4b303d374539dbaebb5d0977b8467db950c7a3cb98f79015176898168a8e0c44", - "b2e4d650bd00e012effe7e962838baad57af4115399191a017415fbb91156b4c", - "98ef2b9f496d166aa16aef2b1c3b70530fe2019544cb721729402dc880585ba2", - "438097c1b5433beae57412e6fdc622bace7a27db3427ab8d48d161e454e3e3b7", - "34e481baf2c6563a185c353ef2d25fbb24678d2bc5c036e71698fd2a19995f28", - "80ed8f0a694c3beec79e2fa1f2d68f98d8459614fa10a2d2e7a662a931b7432c", - "7a8a18114d8de85b9e42b9a8bd8f4270af8618457bb75add823e2caea23b261a", - "4c10b15951de8d2ff75f2a143294fb90a54ce4cba4be5ae27c891f23ab3e0db8", - "452ead83c38fa45940654796dbbfcbecd3228c2d4cfcaf211c528874ff40df5a", - "0b3977c1f6cf08cc1c54ff51cdc28e51efc81ffbf85757163eb26c79166fc36b", - "d0f03ae936bb2283f3616cf410c77ed64a4ebc2de8d424655c9016f8b891c8be", - "91aee096d986b165edd4dec678a59201ad562717b55ff5c60acc5dd3421ddef6", - "4f15c98fdbd9748d22144c417049c60000466b67fa7aa1a214e8e783a0224107", - "368d04bdf36333f8d6b6a64a7ccd4e36d3b35dc2bc9174d581151c7308911ebe", - "fb1f518bd09508657750a6a6225bd337e706fc853791ee10a935362c64019ac6", - "a56d223bda34ab1276560f0cb0150cb09842e154a2c4f68c42bc7b7a9dfbc514", - "9a96b3cde40500cd1c3eca3be9352af3d4877161b827948391196082126ee095", - "7af6d3e734d1e8a35b9598453913e9f227c87da743ebea7db5d721bcdd6ebc67", - "094294782a0b36cd0d5b95e5b1991b3c83d54f45637af01b1d91463f7b94d473", - "6aabcdf4c07dda427bbce92b8057131787b18ed5762f28574e23e6d5a6be4a6e", - "75694b1d19b4ce4e5321986699de6dbe803f3f609cef4826bda207c066ea2cf6", - "dde7ee30a71f3a90cb0cd070bc081b4158744bd885a4fe12b445f4e666e0f8ce", - "c871e450c09a4798d7440cf50b6668f38e067594132530ca9f575eba6a4505d4", - "4307e5f8fd8f4008bd872acb76558f04fa5a2110cf8c1aa71872894b5b37823b", - "2e4d1ef4e99f26cb61b121f6d95e3563455d5761983db35376d3f3615a2388c6", - "a3c7d16e6474f845192b2185cfb2156438992ff9b30de4065140489a095a9b99", - "5d9c637097d511da3d3db871e42f410dc3297804ad7305b84443f72b7a6917fa", - "663f0518833537bde144ed5f498e7ccc183cf66b7088b61e6940cc15516589a8", - "0b3d79c895c1a8fba07c96294cd9603e66a6469b933189c2112b81bc67fdac2f", - "0fc14ebe00940797040d05a5bb4c930c75c821db90ecc1e00057610145df5beb", - "d48a5281fc5c482771efbf5533e8045a8002cab19bb694d3426ad7cd2e791cbb", - "381ff79d0620fd52e9e68610aeb8c404ad953b397e42efa88577e50886d2c8b8", - "04b62f07fd0c0af0c4d89786ce5b869c7a9086a6a78a56cc91a21b3573cd94b6", - "e64157180fc5de77f2b6782106f7a02801ea180d55047da811cb9d5ce2d5cb1e", - "282789f073d1f4ba19565f3f004959edabe18ba1b14415c1ddc069a1f533ffeb", - "58f1a65d9f16f94bb43bf4c68e5832507176aa44a6b4b30bcb58ec0e9ad3b24f", - "1ff257b21e730fc31b9ba728e8f94b3e38c067de763e779e060b2a35eb0538c4", - "d203450b03eb837b732fd6fc23c4e083f5626d3103ce449b7d903079146d0c05", - "b51b079bd753705c626a2440a70403f48009bd707f49052a04cdf203b7a6a372", - "12b3bfcd0c44f1a49c7a97cd96a96e300787396bf4f4cd737b7fe7cc3b772fee", - "fded33d617308c4f0d6649df845365097be475299ae2218874ddeed3f83610c8", - "2d88beba0b353d5189f0753644a309503574688f12a5100a35ddda7a36f850d0", - "2e7fcdb6f18ed5e49dd0536c7104171f4665e21e46c3b2e8e65ce573c62fbd1e", - "3fa1cb633c76ae0d5f132554eac2020d2685e36867a040e338f42092ded083dc", - "5aea5c74b8bea4f3a7d41e3fe217a66b473d887dd46e63d268317268b0ff15fd", - "a9697bc87f8c78c41ef39af5a6cc8d65b3e922643a5a8a480b3a4722e4a9e72e", - "2523656d25d7f45b86de3e345c372934d662906261ebc5c414935fffbe41917f", - "c4c8d3bdb723d5a6ec256a543a5bba6ddd10347aa3df451954819c90d534941e", - "281f3c26455250968964238400d3f1bf1629e89b5fe9d2e24c95b6b160313c6f", - "0544fb2061c6e19091e45df098d2b0fc628e649bfef4d425f0e6350ce0853c54", - "08eeca95bdf10f091e3c369f19412c019b46e0de5df2f7267ee3fce5f2752256", - "b03a58d73fa02fa6aa42a152525994650da4808cb323513123f5f227ae08a2b8", - "4a6c5cd7389536b80ff315982ef951949d285116176e7de3131c1d59d8cde8cc", - "c5648d2e3968fe65d1edcf96617308ce9c8c9cbb67782fdc596a90e2bd9626de", - "8b3db70b5fc9b8727383c11305c698fd9b801018642059138857235a9c60d4cc", - "d0faf76c7cb88a104d933c900581aa0de804a5561fd7bf815ded47bd9bcb30b9", - "c49ba3f2a24603dac875f214a17508caad8b86c8b20a62e900780561f74f4b1a", - "616c41fefd2529beacce15a058c7c5cf25da0bb68a0ef159a5b9a01453c9a23f", - "2acf6428d9e5ed6d48514347bbb24df4adf88989e019092733b52de4561d6146", - "39ac9b5b95754feba5089ba30942ef00315770af062ad1cd6e5109ab44b55c35", - "96d9b9a3049c32c58af4c5a5203469f943641de8a7ccce7835c5a2cae2d8cb45", - "af54fb05b22cf12187eada6267e0592ded626e4766867799d24e994be63d61b7", - "19521defc7587873f3be4435f83d4a41fcae20df68a9a4062eb44dc2ed1a59e3", - "72fda1ff47504bfadc4d24f981d9af2d6ccfbc812014486600a13239fea0f527", - "cd0b1990cea75ead5f7516ef4170360c7ad99291602f0a58cd68c32b724ee583", - "c70e95da679997349e404a1dade41b1a5167f2878936a4972b39db2f07d1835b", - "1dbef414d3eeb8b23bc0e334ba0c1a393c5e4bb09cb6aab22bc474b4cad98622", - "96663e2c53a66dd0ca4c14b0db02384fb4b3c551b04a49999e788d6a8844ac06", - "5bea236114775173cbcb5d8a1fed3895dd212c1ed082847aaa35b0280d58c76e", - "562f1bb68eb1e6be204b07b86258f7b61ed026ace4772045b4523c5bd11a3958", - "ccc3b47c3d8f88fecaf0a354df992669b0d8eb25457e7f46cd15a00ce820566e", - "05578d8a3483914a33daa2065e33b2402ca3def4f807a4152d9c1fb4cdd1222f", - "63f3382cafdf978baa9645fac33a8bf9f4dc7aaa45758daf6d4bdf15b38d2c1c", - "62b17fdcafb66f525d8e898bda3cd4905b52142ef3d1144a0e472eeebc5500d7", - "ee839624caa7db6e26445a12dd136b8b45204dae1243452ff21dfce93ed1fdb6", - "f778244f5e07237bdcbc572d4d3cdab778a77c64dcf14009f88380e3dc8a31d3", - "fdee7ea7daf14d096644b381deadccc08e0915612b6939209feb058a423b733f", - "f8611812d3c06a23eb1f10be2f94e9f5942bf0f4a10804573267ea4fbe1e4bfe", - "b82f90e764660ae0f966313ebb33e8b3d4bb253d99d3efd286107357f50db6bd", - "608a76ef4dfdc9463dbbbb3dbc0d9a1519c34ad67344e3f73c0f2c273744497b", - "bd07c0a2a0cac3e5b5f72a64bc6146d68904a93b12c5e67ed497adf83b725715", - "24b529c15c3035511b4e722dc966ffead3bb8005960f6c3ffdf9e0815d06e771", - "8f88080582fe044ab668d58e6441595c9666000cf30074a6c1478d5790c1eb1c", - "4a165dcaaf5a9465c29b6f641fd628f834a0720dceb5ebf0b31d477aec08f228", - "38d1369ec0128178148ea8ef84acfe99c3d4514b042cd02b8bded32ff39b1c00", - "c1f2bf218d48dae99361d48cae1c18ba4b1bb6ebccabfd96d70ac75a9c66edaa", - "ac80396c99e841a3f79e536a3eb7ab2b79e9bd3cb90c9263f430f7f1ac2041e2", - "0cee6f78d27e55e2f747449672e14f1bc1c2fa4bcdcf4bbbdbc62b68be156c2b", - "7f0121ffa169fd8f1b200e3eee38e1b464f9b92c5661ff97d69b394d5f72e03b", - "fd8d06851bc66b5c3c02b87b124967c2d3fc6a1de0bb5cc706113f1491dbbb55", - "6a71584e8708b57ddc20f24e9a11c481793542c92bf249a7bb21e89ff577640b", - "6ab9c8c4ae9091d5aefcfa7cb0344a207a2e8224486657e83d1fd5052cdf5190", - "6887ca71bde6f97c7d21e2717e75584a6171907223435a74f1726a13bb18b19c", - "1221c4054c6cebab0bfa15db72663df19c0cf13a6032e23796e55fa68f90d2a0", - "096c7029487b244ac92d885a96ce2d7a33d4e79061944d9f8c8f3018892e4b14", - "2c585670961426fd87f80cb2078eb1958556a76d35ab3b9e4fd37744490b155a", - "98f171cc32777a6ec2ee093dcc3e6d8d1b72ea93636f295791390aeaf748d5b8", - "2fcc017c610cf014146f5716aca513993370ef952d87861379412e01351f0e7d", - "b31f1416c276c6f47453a6300fd9fcdadd165ec1f415e94f02a38b766bef8173", - "b498219658413b29d35f800cc4629d68e82580d65dff79f7ab24d3fe7aaca55f", - "f2257d04d1f04a7506cd71d08e42c86dd698f85d735bb19275fb15c096e02b6b", - "1ab41bf725900d63c1260a24b06e2fe4379184cd4f04a43403213c94d3150933", - "e23c1ed75368711052b5997042ebc12e957c136fc0f119654f6c73d0104dce32", - "84665c7432c97583701a33b48f85ce4c98899304748f458e2a257e769e42aa8d", - "b6be7b9723a890c183f441a55cc3522f588d2bafb396e6256e16fc9025e63541", - "db4c911c33614e16de3ecc0bdb2b13b93bd4cdcf86e7cbed1ce7780ca165fd1d", - "5446bbab809634506b87ef83c10e4ba927976e032478835e7a05491e2cfa5e3d", - "5015cf0798e932f2b7bc28b44b2f25cc30c07cf9e137bde19c9aa29e0504f140", - "d4d32d4e920dce3d67516eb02962f7946ca720994a4c30a8ad8e4e243f114ef3", - "6b3f838868a44d03000fed527cd4c2c1ddd874acfd3762c9e6c2d5f32d2a16f0", - "e1bf93c7eec524eb38027c0443893df2081d39e278da5d741c79661e685bd0b8", - "6a542325dbda23ec2162f5145130324c3d9519b1e368bf4981d489d19ba77605", - "513e9bbed88e805425f7ac9b00adde3145e5fd1e0f8862c687559a112ab3ad07", - "243b9374e2c8c65d5e12a08b470450659eb0632d634c7ce3f81b400272312266", - "20155e8689932672f1530e5516b5c7369e692f711c521935cd2b7f35a5dd9679", - "dd4d4d597781434eda99e627eddc9a0536821e3afa99f965ec58bbbb982a2e30", - "b3c8a3d251beb9f80ea01bedb907abd70ef19730dcf0a35397f91adeb65c012e", - "e57c5ab4243cd8a4f5d4cf2970dfbef3fe97e118a509ed7d252f9dc9a982d5c4", - "43738e85528a5cf0e231b662c08ebf2fee799b92f4c7d6781e7530a91096ae07", - "9ecff0056deef37c9dbaec67c23fbf5104f2988fd45bc30f152f592b9a7fc500", - "d5c4829e8b9c0b10052cd6bf681b0bf0231d310bdb29ab7afd76a70361db9dc6", - "45d154d1776c530a736adec34a5cdd2e1b859d883637e23fd0c31fe32c7d10b1", - "2e456816e58e477d4ca08bf743cffb2397935b1ba867e02dde5d0de459c52674", - "9a1b9a3fe13a82ecc73b99ba089e723b21c7f7c01338987c276e873ba3eb703c", - "e7ba4c3e34c4807cd6ad6889e172ad2936e699973c84e19fd85d391ed71f207f", - "b27efd15bbfc09cf67ba5dda0ef98f94d2e04b038036ca703e7de6a87f0b9853", - "da43bbf619528c3aeb59be1aab2e0fd63059309e9b10ff993735322a8bbe5119", - "fa6de33dbe12dd90f9ef5496ddbac2b4aab121067b5c45df9be003803405bcc8", - "25468f4079b67885a23172b53468f1c4e88997860daebf451a7fe66a6a2733de", - "3a0e0e8847f607bcc80181737dc6a56293cd3abeb0e104bd51c28d44db61c488", - "eeee7384df926ad8f7be493c32921a785106448cbcb71fa48cfb4baa94f20137", - "b613b47641692e28689cc35053938c31de56f029376e5c607eca2fa1bf3be620", - "469d34cc39c39cfb494e4f23c04b4a94ff2592a4517b2802a5895a65ca1fe55b", - "f5f5f41686b5cba125f562e98de679b05462af99e5233f3214db39240ec77a1b", - "4ba5b484fe132eb08a949f3ae74c6084c7327e8a4902b504de80efe976d32fcf", - "9a0c75c6ccdb218ed430fddc389cba4a1a9aefb52e327f42fe01044cb89e5309", - "3109c6ea5bc419f5b9b79a17845848c29b1a0dbe50d59e66754d33d50882f79f", - "65c961782c198d5ed7dfde7fe84177368fdb91ac531250d1ebce5520da6c2923", - "9fbcca6cb59381a4fb689b13d2177b32ea2ce67f69923539f0a032a694f421f2", - "7bb6a980b6360ef83efcf5ae75dfcb69d5eb968341ba7de1c445af283128694f", - "db851f0b88b769f5f4845ba6757d888fd6a877f4681abd8ad3e5a3269af77d11", - "2d9c7c276c378ccc461948f5630d2e5f48269ba8446794b364a266b29736f647", - "bedc0887d2268cb1458b6845cb8074d78a3ad80589e9d01487d167f7d1795bef", - "c7ca0c79df1bcf6e8b4b14d13e8e5f097df638e848021112ec622795b2d1120a", - "71243f19a0408128bd90f027b09452b2b802279f01e1b88e302b80ccffecdc65", - "777ba26c01451b64b63c8118ad41471e59873bb55f6da6e9aed905af9b9241b9", - "8dc26f8eed26c94730f012c3550f753c593c90126eb9bb8edcc3f4b2cfdfae24", - "4d25ee5bdd76765bcddeb7334b28e5ae83f5e20e7b2e6a30ac1d18a0e1691d28", - "3a23a20066b80e14da6abf3eb5e14ed667e5a783ba916062726a0b9cf0a3ba17", - "b01d2b0526a106af323d11b44aeaca55c468eb78019d90458b563c62085ba443", - "344e13778e6d6c2d4cb16d9a1af39d8187c9cedff88d7063f51f8623605a81bb", - "c681d1f1323a288bb4490ef1cad0069a3269db05163ece3391c58dd482c523a7", - "588ff26673745585a2b9830de54d6cdc8e1054125f260478b8fdf9627d538783", - "4af3c1d5487b061dd48c4a1d6b4dba438dd348ed1126a0d466ee4372a2708dfc", - "4dbab0369f1a245fd17651e5c32a9ca7833df4fdd952b6c011cb1384f8e0c0ee", - "6af7a6a108b1bcf9162d5a310b82391d77d8fdba8dbe371615eb012120c1aaba", - "2d8914d264d3aa9a84b835c378b78c2f6f3f66760a3c4d8f904b9574c3f95372", - "49ff4072accc5bfcb5bde60682d17afed368b166ab921a1a222995cf35be5e7b", - "aec95bb01df4aaa1c1d04c742712e74209f6694ecc45a5f5f558a45d85b24c2d", - "a41345645e31315b6790e955a2e671d127b9f4e6888fa35a013f1af867892883", - "a1581b1850ba7db8069219afc43759466699d26a061bec2179888900aee97f3f", - "8238b777007e89537e483fafedf640e25cd0fae2685c04a05266f14ef0cbe53b", - "5b274a1b6c1887994e32f7ee7bffa6833c1675d509b5958e542837aa3e1fe17b", - "b5ca45bbfa17663724f141ac7580fb43baa73da56cf2ef131b3fb1d05137269a", - "c2ebddc710aafd81c4e6ebb0b1dcd8397af085f151a0399fec0ecd5052dff4e4", - "0ea223e6dc481a4f59b8df534da3cbfe5649b1caacd08af0bff9bae8e6f28e66", - "1bf0fd95aa2b0ca790a48db3c80709eeb97fd73f508b128042251398f150796d", - "ea58e0b036aa7324bcd21dcc657c6b88b6ecfb496b218863e2c498ff5697a03b", - "129f3ac79ddab8361d7857a289a17681936d7c1c8f1d5b2fc8a6ad479f34e206", - "2e5dd20ed33ba6fdc31f4612ed9629a0829998ed7a3b24387356ea9be0a65f01", - "ea8734c5fe0032ff2d72b16f66f1aa716e6aafe172508017ac1eb2e54945adcf", - "ad3d1dcf321f46a0b755ec8f7510591f6cadf67661b38ba1ded3322ed7c86c91", - "a2bd1ff7a6ec8812351e0ae4eb68d4a847ef281757ba1d462dc41621e7eba21a", - "6699a8fae933c01150e84de326959c0ef1701ce9126044403a1ff18f9408f353", - "ed21ceac7be108be14486872bd1e28942d684b40c64791a480a4023ef00136ef", - "abe65640f3e855965b3726673e5bf181cbce079ae6e6880e7f97345456ccfa4b", - "4c29f34e3fb846cda5bd17ecf3ea350717e8de8366525d532012abcf7315196a", - "3ded9a31f9d186d93832229ef68967dee241d10ed895f386fb307ca8d4f664fe", - "58fdf8ff117451b47732dbee8067e10398dbf85a604632c5655cf0b473cc1d08", - "26c53a872942648d0ae49894756bc518c0cdb1fa5d9b14dcc9ab3002ccfdcb46", - "68376015c32913697cbf0043364ed202221f138187c28f181ed22a6cf99d340d", - "83b149be4069aecf9ccf887385f364a574dcb4b07b47bf3024b13eab4fd545e6", - "d351de7ae8e1bd341fb8b7d8f76e7842a6c247f157abce03a35c8ead0749a290", - "2f323a96490e05ba716f0805daca6b29a3045afbcfa20dfd61144254882ff2c7", - "52c33f72953075ce54e844948da22834f4e7d5b9d547f93ca891dea64512fc39", - "1a97824ada3dba459fae2b6b2cb1f970d286e96ec45748f157a9f31bf4287390", - "dc049b2dc483535c6b3bb3f0f497e21aa619ce111584c40d48b17975cd8fed9b", - "1fc8855c71331a339103f8ab08d86e6bc4569941de6151fc95e7918b6edb287c", - "3a486984a2cf44978d4d42e421eec3bdd5d9448ce29a254f8989d76be0accb95", - "41668cc626c7429a83231a5a3669a24571ea86b605ae2d7894a389b215fc0efd", - "cd34af88009ab5084ba4f62dfd40358c124ad0e6598a6e97ea601fff77c11036", - "28a64a5c49d0b50b96fb7ea411a2c2c0786253c6eb9766038c46e6141ea1ff0f", - "14c09203de823ff916bcbe0a4d61138675706df21573793f8c7acf3c37aa6263", - "9ec53a86b771102178fd7b82bbcc68f43df3b1f5bc01927dbb36b8af58d184c0", - "b6722d5ddc72429f3a9c41c4a95bfbbc16636e3de2c9df192a4f229120d015ef", - "8427084bdf302aa017e98bd709387ebfac07ea54cc00884f382349e19a4893f4", - "912d372223f9f709f30cfa1151eee008f85dff1760384263c6ac51243581d13c", - "9220a12fabedf5f3fe6a68313de348cb10a86935393bc7a0de9566b7c6c94624", - "facc7c68b2a5e377f989618695ab50e7da07a3d9be5eb7b110e8e26a992d9f39", - "6f93cb938a3c7c58237e30fb366c2f5a8231778dd9e3b76ac5428943610728ac", - "4994b026c6cdb2638aa43dd9f7fdffdb5076c021e02048860e3e803e1504e938", - "ac887530e4bb394e4584b056fd3b21e702b16450ce94b8adba988aecb83e9fb5", - "ec84613b6244595094d5f33b548f4e4d0b34ef82ab46d54cd3582086160515f3", - "388eb355d4a5addb64aab144b380cb4f21f2f7bd5a1dbd66d0fa776a2c90f62d", - "ee64e5decd731ea52d2b1eb98d512c95c8664180eb3c836dc10fc5ae6b5fda6d", - "ad0b1aecf6246c6030eacdce49f52f7ba5f4e4cee3ccf61a67f8c42930b8a7b8", - "8116ae7f3d444ea13280354d81fa27ef514074c89af45d8f0b82434112f53359", - "da87306ddc0d1f90fe3ea14daf5a6321f9e50f5182ed709998fb3b6e0b63143f", - "79180ac0748bf74891e9ef558f9c853c284f343ec94a277a2fae7f685f2e765d", - "bac11016bd64726f156597cdb43ed4b41cad41a96f4b14a866756b54a16b592f", - "6d27613ddefff4c65fcc0d1e0aa0ff5c2329dcdfc3684f4a19f6baede90f5b95", - "8cd6066e5a0acf993f48391150ca78d42e5f931b827013ce312a5554fe3aa453", - "21438105fab74c5bb08078ec08370bd331b024069502063b71975fad2ed1f8b0", - "067acd53bcd606f33729c286fdaea6045632b24b0dde729e5504d1b9684bd481", - "f41c7d1634e3f8c113a4a5eab9ecbbe8ed11822227e0738610df2f47ecbc1349", - "0431d39d466cacbf2991e83bf6518df8523cd57bb7c9646336a8da71b20988d8", - "b2715a4b7ccb30e996746ea6eeaa543deffbcdecfa2a1926ebe5cb18c3c62ab1", - "8a2ed551e3d95d56f241c8125da40eed56c3b3e868eb9bdd19ef0bd7fd2e3b50", - "c8f2ad2e79b1f183a1c993521bf1e3971082994b52f8fabc0ae4ad7281ba3940", - "48688a26569409d3233c8cf05f58a1723b78bc172d76589988c08f88eb1c5928", - "24396ffd0b5b151a9a17c33d6578c01280cba22220cc04aaf786db6dc4f39302", - "2239b7f755f2d3905dbcc9ba77911b3294e268f75a9cc395d3de2243595d7d46", - "4d843eb9a12e7dd831f2b595f7b10cd1da5465fc32985656bfd278489c5db1c5", - "f1790ed4708d132bef8aca4a5043d771f979afecc9c756d842e95d139a5e986a", - "cf3009c365e2d821f26ec92dd16b028bd847de0263eeba7e27ecd38b7f19b0d2", - "a1f09186447e4d7d08edfc0236344d5da1990621f12bb7864479e691d6e376f1", - "5fbadfa3cf6ce8e8d7504c8caf8aacf397bf025ad4b9c4e9e5b25178ae0f94fb", - "b91d5ca4ef225933ac599c9144ab699f692c6928f8ad40c8eca13b4e07875a14", - "afee6b8997cd9c54b669618c5a28acfe23346f5650e75ab47f8d1d7982764924", - "6d2e5aafb1bc524605061f693e20c6ac9ae2486c61a6a34a99c3b00a74b29436", - "1d64e002872e3b1e20937772ffdf15528f83f79703b43e84811493434992c0b3", - "b0fd8b9f5c0f2ef04eab3b0ca13c646e6de6bc3ae3c68eb3a79753df0ec0dbe9", - "c004c201c79228cb3d12a4e261aeb7e8e7b62b5720bd731f3da922c63ef87a82", - "63af769f9e3887ee3f66125233d312019324e74cbd6f27bf72351debb425af14", - "e01db5ff71c5d35e0e5128462e21ae29517ef3a7793742ce4421bc14a4180651", - "3e4c0d34dc3be900de368cb6843dcca4a267fe97fba633231fe023ed1cda7fed", - "8d103c005756bfdb52e8a505959e1f93903eef9004ef52a537b9f52d0a6e8b5b", - "619f6b8f775602c58d2187614b4886632d20fc0904769cb41b0f18ed45f4c962", - "9375f7892b1da6635af40d0e9b62680c013368a4637dda3359efdd92bc135514", - "dadfe28227fc30f7deab2a6772c9442b572ef409e6f9209c9563cf5d5173e825", - "983987280dc61d1d1332d68ea02cf10724151fe6dedd806795bb718549d02ebe", - "b673f68c650edab2b5ad1353ef6578d209f89b9bbcfbdc0e3b6519987b5ac7e6", - "065d2eec0a2ccacbacc708b0a632a761cca14d18df4376fd5330ce25b462820e", - "f9d81edc9746ebafe3748f128a86cd0faafc9b4497b5950b97112454cc728f58", - "3b3e0b59aa9d439bc3dd8b93970c79cf92b0991f99df1b68c4199d67441814ec", - "63bb4cc6de7a9ac57cabf0705a269a201369e61fa4f01f5293403336cf90cf90", - "7a67f8728a639925006536e759184ff8fd552453b06f8b82a5360be23096ffb4", - "b3893ddb0b68fb6ccd94032f12e1b856f46a89ccea627b9194ba8cf07eb6ea08", - "4676e31f75a946476b609e78bff796cb203ef2b06ad85bb3497b194ea1d74690", - "a696e9b1a1b4c81e446d0154f5d873996d6f92a7469c5800310cd103fa8e23b9", - "1e03aa5b51c20db7ec9d48863e675c7cff630886e54e5051f738ee94c2e5211c", - "ff9b37f559a50d4c33de6506370a292b28d49719a464bb761c6c1673436f8c37", - "36f425e56f4c7b602762aeb316aed82ce2f3ac1ea2c52c9be88d5450f72d84c8", - "f0962ff40283635706be5ee1a98f4a88e626d22085197719b3893990fb153ee2", - "dc1b424a8eb3f09cbaebf57a36bc58f3e6004183e94b8488d8df465cfea82263", - "ba2ba1c5466e7d65b57657a165beb1ccf77db372f0a23c093e3524a1b1e8d8d8", - "09fe5be267ddd170ad0650feaf0d39cd013ddf9d8cfe42cbe4d397630d4607b6", - "e8974b491697b27d02fac12b21259ca1377a4f23afe328e79dc28cc80340bd75", - "aceadf1fe679acf873a47f05587826521eb7b7c9232f03478a7ac196788eab4f", - "2df808094d371c388977c87137b1b7cc733b3770c54d62a892b6867577a453a5", - "dcd1134e601856c6c01616037821ad7cf36f92e9118d87aba4136b91a7c00525", - "94bdb3d4857849223509d9a404375388535bd104234a955571c8b23855e39371", - "d3076ade5f30712714cb532cde8420bf814f49e7792e29cb3692eb86cf7769f0", - "2a604ce24a50e49b1a424abe43412f37573caa092582b3ac0a19f1f0abff0d66", - "37f9ae9b753067b258dd26f829f6dbfcac302955156e879ab815ed8fddb5a12e", - "8ef78b66a80fcd5931590e882c5eb79ed6c21a90ee0f6d9f8a08c6236937d6b3", - "38e539f87ab697810c4d53ab4ff5158874baae05710eba7c7b11fb976f20dca0", - "bcd8895c94f8f49258f239a58f73b83ebce4c587bada82aad541bc817a403d63", - "b2aac779105daa7ba2c64233f973f3c6a2cbb782bd4fe23e280d7eae7f11e26c", - "c5b0f454a37006a5eea434dc2a2e1fca744fb39142d2d4a9d5163784bb04fafd", - "0f56e9731e683aec5995a87c5e0295da4041f32aac6661a5698b43f3813cb8f2", - "d6cde7341124ac6dbd1a06144f0ea5da44cade124f06d45f33dec64ac339b89b", - "2b36a8c4de85b24d67e71d3dd764e6ebd4e07744b654e3936f223956f2f36b71", - "6f4c587453b058d7293d7eb558a529b2f5c2aa69b177476a13257380c24d3832", - "7ed8325ae717cc899627b21877675f15c4acd307ba0384608fc32d6e88dbb13a", - "6969250a0823b5de4f4299ec9a929a1d8f130b891473dcc3c895b7c01a2bfc7d", - "56f5f17b265459f5b639c03c2978c72bad0c609fdd044612ba35bc76f74c42b9", - "8004ec6303c4032a8424540090cf65c428f336ca6d535a9275e5b8dfc08901d6", - "0ac95da7b45a50b442ea4dc751246e3b64c787b02bf5a2c7aefc03cfe4557911", - "d7319a2c1d091745e89a38ea3887bb6f9102efb5bbac3445224fe9c26d5c9e6b", - "7f554a9a91a7cc8508f944db31115e880b49730ab0fbccfbc92577d3782c8438", - "a1a956a4d625803d01a089e5286ce08ebb687607303dfe2d1604d31cdd5d5b68", - "dba3ef6f34289391e89ad4c4754d143f371dcff4aa97318a3cba2f59750b6136", - "3e9900953c2be42611c5cd56a26684dc277fc18c98d5d226fc892af4fddcd9ce", - "3dc940a7650a50440a6a297088bfded1a701a5b8d94b5ce934c5417dd5254c9f", - "bc06fdea1fc953414e5278aae25515124af74a49059c9ed78552335c8f52b192", - "7a5cec148c5ba45c3540a3f2ebb9fcba60ff7287319904ddc0d917874f9dc291", - "d48308f2d5b51fea85574891a97e6698dd184c5a48a4cc7aaafaeea08e826c47", - "fd27c696091f1b09cc9f799371c6107a1a06034b7ea4a16df4877326c60d39e4", - "7edca7f7f764edc703df9c97a76796bb61beb5adbcdae5e293545f428fdc84c4", - "95472c8445ac73837e082a57b5aac7baa308ecee6edd46c6548b9f3ea8105bc9", - "26b578f7c0e604b9196593ca2973e26ab9228ce28a2bcb6d7da9902edffb45f1", - "c8aa689a97cae334e9a32d1a94f065bd0fe2f8895b34506fe1b81c8d82f9ac40", - "01800d6197ca51b5ec0e2f62cd9d16d5f57760d925c0bb8cfad7626688069b88", - "787967557086c4e0ac4c9225aa02c24d22ca59e1813d74e9c2d16c1a27f8c79a", - "ad9ac1f4dd808f154611876c9ac377ee4fd38d65c35030d760e6d74978b6d0d0", - "712663d8890426f966146f543b244f1a7eecafdba888d1090b5bc4864f6b7993", - "95c7103260fde37716e40b248f818f1238f89e13c97b5f9396e7036a9f002fab", - "7b9bf928594e4b7eccd40e895c374d2071d542de3bd6a8e8897d16a38f75299e", - "f0aae8696587a7de8cd68efb428ac9ecc2b0f3f3eb4b899edc63d067703c71b0", - "199de9e7a35d1750123c266e22a7553f8ff1e5ede115fff25d1e19ec4ad810cd", - "15d4f6e75bbf8d0ed6ffc1c7fc67f00022affb0e76c26f03825436d66d390879", - "cc691cf1fb0926dc26db0342b209a8388abeb4db09549d8e9e9326c702dd178c", - "20d08835dca5fe1cd33cab8fde992a499ac36ea4fc88b2b34eeebc2d47acef0f", - "684ab5103d39fcb18f8bc4ee7116377d23f7b4fb6d5071d2a86360aebfde8e64", - "d87035b15ccb9d78cceefb07309371d910194f3e30a7ced9ca8a16ae4274645f", - "2ab53c2f7d3d8b20b94b4c655ab6b9d6d1ce85655ba86cc9ca9f358a2c99122c", - "e1b19d65d77a2ae86ffc6ff9faf7075059686f54f65a2ee70831e44b07c60a37", - "5cd496256b53dc99c006ced9abcf3015b0e69d1f563e1ce2c0d1a7e7f2b1a2c2", - "23f6ceda42d86df259b066a7dcac0d5391e927eccbd040a18ce136f15e6bd94e", - "a7dccc90a032b421ce297cbcb0391fb0873ca8a82d4bc8f9bffc6f67065012e8", - "d7bf06f5edc5ded8b571e3be9bddc401ed61e9cafa08b4c0357ae07bf2af9093", - "3e94370c4e017035ceca24185bedbec7194b921eb40ec85c0d25c8319a1829a8", - "cf5a6e3066d154458c2d0f12526541872bb4678115233101a9f1ebabac30b53e", - "46a03e6cfa62fa2fce26965eff0dd3097b5d03547f5a2e62fb207a418d02d283", - "a33d925a22b45508976476dfcaf7a3e1033f993ba215e0d492ba0dbe6a1ec02d", - "30d253c21723a3aaeef5b4500497aab8be796406eb6194e313ada1ecf31f99c7", - "6aeb3925418144eaf5a40be19d6969284246bbb4c1cee4d7988c80bc2313e110", - "e8a8578ed22e1d66142f60105cfba1e352a35a850909b3f91c6b532eeb94bddd", - "81a06abc0ec8b45f55ceb8c11257f6ab71185514809f0cf49176e30a4a2d17a5", - "1deef709c6b7b27c458b906a544c5ab496fadf55715b6b4c9d334387d89a9472", - "326774c52fb3f4714600c778780f746a49e177936808defb1527d1463bd9ba52", - "5d930361ec0118e25b3f0356a3b138a5155c1916b6b423e1eabf7257ca64b75d", - "2a04e9e229532af0721c5430d5a02b696b06d168869d25758c80a2f7bd815ded", - "9fa444188d3ec58a9434dd26a8184714ca0f3aa759f6b0c3cf21fadf9ba132cb", - "85223ee150c81408e8b6fb06cac5b34ce48f0c57cf99decafb3e7587037bc86c", - "5309dcc058a23172df89cbe8d3b4ee60d9c22a2787335c75ad21716ad3d4529a", - "8f682f82662004899a6256be95d082006733f534eefe69a8c4d7909590a30409", - "e4e7bc38260e34ecdf316a6fd4043991e8550911cfd63e070868e1f95a5a2567", - "6f8aa2e748f9c6e0629b895097c690910a52578f8d880516b0b15535d675dc0d", - "2ee2a3ba525f80bd5ee20ab902879d31aa33712f97cd558673ecdb1b889cf12e", - "589d6e7800750f169e51547e46d0d372deb385927dfcc02e1c0711cf1af5e849", - "ecbde42fe949b1ed52fbfaa6939477719769847d3a1f5252ebcde097b664ea60", - "8a7d3c8dd0b6e6e06b8fb478cf86b9c9cf96f697ad1b68bb97afa046f8136070", - "c2e9a4244a9fd29a9b689ad99b8fd73e0565377627510f286cec0a03419107f4", - "bf77b5f634ddc3cf67f009c8b955a5071a32e6fd7ee5585a414f5754c19f3071", - "80aad352645b51080dbf0d283c6a13f1df83a4e4e4acdcb4ce8b5a68c1273fb3", - "c83ad5c05b51e0aa7c491135976d7fc6737023edd40b788ebf7d1a1b0ee7ce46", - "6c7c01ee8525c5a7217fbb20256546a25c873bb096a280fdbd52f3c12796136a", - "c378dc836c63c586c6204fc072d4c8ba6225a9675fe0432dddcc6fbc0505f9ca", - "ea68f059195aac65f8c37a9e71efb95b34093f13dade0a188e1768e6a8bb3e12", - "10f2e82288c1d030cdeb86ad1e6d0c6cdcf1b7c06f53f028c48b1ab0e8a2ef94", - "90bf0ea8db83a059dd8722ee489c34d32a64feeec5ae7958bfee4d8abca93716", - "ba8c5f21ee38236dc95f88f95c1816ab99ea7eec60883cb4c0d5b6db8f79bda6", - "4fe9655f10965bc9402c85d90ead1e0feca1a1da6cdd6eed426a990f8cbe119b", - "98a8e0fad4edfeca2312b5e5d9a63c16edfc3864b14c8f163fc0484af34a59a1", - "4814cd65035303a4d7878039fe75ec2773f6b11ab5efa63c8706f25cb97801a4", - "5fca723a22410211dc461a924d253348e732a22cfa0097cb8cfdcb7ad232e71b", - "04ba5a61a70073659432021260e46f199142918927b46a45896028299c27226a", - "cae5adc870f1e084a6a0e5a15199ba5f00e09befa176bc140842a882e7209430", - "9f4c42b09032d372e4f99a8207a5ab7ac292427756e2c750185fdc6dc4468387", - "60dd4761d9f60f596f088ab7988b1ff8211c3ee40d9ec501f052cc1659c0eda9", - "4b4b2710a1a14a6a2fd101484ab77ff3b62c58b58455bff1ed0a94c086836f3b", - "3d62868f01dc78742e4509c676b56df501b29602328743d3c25487811d007614", - "ac9a7a291ffdaae931f2376934a177bb018b18c9f8ac60b2951e5e6c9d2b746a", - "c5df2c79895f70ac966684e7cb3d65ec12922b9a0c07e0d057bfc8080a160299", - "a5511897ec279f0008fe379bf75d24ebaa61c8ef7aac8d28dd9ba7b198ebdd02", - "5348fce0886b738816fd64f284724324a94f361e08eb3b8dddafa06b8f7563d3", - "86ce4ec0bfe13ddec4a1e268329f4a9c398e0dcb3467daf578030ae8b49ac88b", - "07d4942b3c0d9642b835afd829f170dcc0df979b6a6e0d42327e48a7805c0404", - "de10794e87de5cb1237befe7da1ce073300ae4163ba4c97f07c3f8f1fcb90271", - "caa8718312f4bdbc66d3fa832d311186d25d608d6d5f50ef620a6297255934e4", - "342fa6a4b54b1e9fbddc374fa9626b38ef6c3d963881b282bfc3b280b5af3a20", - "e209a1fe1124724ddf78026d49be37d4dab1dd04b63d9770cb51ca5f0ee69a44", - "2a2902890d0bae4e77c46fb3abee2e6f72571570124ad5091b898f471e9586f5", - "13afbdeb0773f56e58df03c068fc1f7c19a3b06140ae1530171ab96c9422872e", - "f4990c4ff1ccbe5414c61d974fc8524e7985c901c1c0b578377d9c600079622e", - "f1e908ce1566636e4a0e7d9cfdafb8c7fd8f3ce0206acf8b2f5c36b36d9f8e12", - "556a67afd946d20dff8fae4cfb34606364b15c135a8d0f3f57e9acd5941a4a9e", - "a06a0d3ee40e7d6b929dbd6df6194f718637a57258794a4c96d71c6e0c7458de", - "64681da9341274a6143c0a13d68dc7d0a5b847fb348cc40e209371c5f614af99", - "76ac4b58700d621556f3ae2e6f0f064e59a4084844b07de53316fe5b64204f77", - "2adc30cc6a017922311009b238e02cadc200a660ad35864d33179dcc022577e8", - "5d1477a1142ded4eb164dffe037808be12dc52917b79504226b259ff9a682c1e", - "4c6ae04199c599a2d31e4109fd140c79a7b3132775006a5e5117735c1612e012", - "aaddbbcde6de819cba06df56777b0c07d96ccbec8f2d19fee74cd2e77d34509a", - "501e49d17ff819be9bcd61f471faea4f041e56b0bbd13a74886fb8a6d6540ac0", - "2b1ba9860c60630e237e555de0bd5011dab38e6225b39f424f8e1f34c54151af", - "c59cab4cf55b05c77d58dc1f84a62d1c51d3837b1bd4f28d7a02b5ff3053657e", - "af3898bc0b12808df5c24bc3226522d7a8c7838ca9b73bc858fd56441c18abc4", - "137875770a5594b585344748ecff83643bcb2c21141df9ef441dcf5d7b4ae93f", - "0595450252c3068e4479d8d29682011a5d257398bd78c9b9d0d4e891745ea040", - "540abbc2903591bb4b5987431d5bccb3c0be2cf93871a11ab67bd3ffd57053ca", - "b5452bd4ba2cfda0f11571919d9c841b7181398145164f5f096d447c24bf5eb9", - "403392165b3936f1979dcd4778523ebda4fed83d3cba2f8aff583776b214c595", - "0f4620b8829f33d209d8e449b1e756a43b95722e2825abe8d4853c96d27ab24c", - "afbc60df4e3108d3b9679015183ef1907e3f57a498b50fd50f38da2b5093c02e", - "103fe14476a960557e0d4b409c7f09548b401571c973b6c976282fbb4b64fbd9", - "48d5c6b643fbee60d51e7a96e145c78ecdcf41b579df10c1d8a59acfda000ddb", - "a577998d23e6b94dcede636e6695ecbeb9ac2af824f2fbe222a65fa5724d6662", - "ac0c371586e176f055565627d2c7c9c24ef67d217283684d394d53deb1bc63c5", - "7031fce8c48bd85360f713bcafbcf4a9bf875132c24efd1bd16829a954a9dfe2", - "994f65e6dde043b6f8cb310297ffb7e1dfd540fa607057a3f52bf3685b0ab15e", - "fb8106ab49fbc59369c0f468f465583cffd0ee5176ba4ee232737e5921280599", - "6c31aeda71004bb830854f90fbfa74a88dcedbf3f40a3089e97e5e6d157ac79c", - "e66f8c8f42c87785f3f45dd834890ead87f200f5757632f894a3ac6113231770", - "3309bc407bc8c792cc86ce5326890fab5ae1a684f71f35d1d2a5c8f750dd7e31", - "da183973ea25858ce8f243369b88cf641f429e7b4a8886eeb5a1ad3275ff1605", - "572fa7e0580cd2cc954980c0ff9188283170999e68c34e45dda66fd699fd46f3", - "f3ed08b52d9cfbc6c539bb3a588157b99d5398a45499df06c0ef23383425bdfe", - "7469f8807ab9d5a79fc525e148dc9c6a882950d959b473b6c701e91d23b9f8b9", - "20ff45ab93fdae7d0685292ccc6cf88fd24eb1fa6fbe0d59551386a0e33ef21a", - "427a247436accaebe74436ccf483624797d9b76c3af2c45b6f4f3600a6f52bae", - "ba68eb66c2b33cce2a6f51d788d7913a8113fb97aa904c4dc81cb2e484c918ee", - "3e9860e6e3b5a59356915d8f3ad2e78027ed39561b8da44e2d75c1409e175942", - "33ae12c0e435fa14e9d03b86ce1d7e7f6a4f1640434ec50cfb16add66ee38cf1", - "2dd931b9affa02204c0628b891fb24d4f1ce73591ee3ca68ced0b18237829159", - "6dee998d5efae1b5898088143dc150d4bf6fe48e1686e7652b534d68ccb62e77", - "e512771bf8bccd0e06cf7af37d74816de880fe1239c786cc41f4cb5ea9904260", - "bce13f569b1af3aa9cda0e8e8ba7e3b26eccf50688f907563a265f36fd10f8ef", - "7e75dffb873201b7c283698e3d9515fcf531081faf0bd21e238a3fb7b6913fa8", - "d3365b94239f2dfc3874227ac909fb7a3b043b91a85a31fa2297e226eb38ce1a", - "b08a64e113a0f63b7123163b81f5fbde2006b6c883c4c8e7c028ebc1a921554f", - "1f54e58209ae3d66b48b2a9675f5e624439dbd382e108279d1a5115ae41b0f61", - "23b49349b3806cc732dafce6a21ed135310f2b3d8bba33111e960ba96ad6589e", - "c4deef5865db9e1f939b136ae059cc62d2b2499290caf12041321aa8127f42f4", - "20d791671ab6c7443c11d4f2f564de54983bce4d2811275edabe97ed8e84a054", - "35e296eee3cee9e9c290bb5b50c4f45b2a092ed86f78165a7c69bd129c74b953", - "4c9af8e146eef931c1d0e3a2ef4da600d66e6246bb324df244cb543540413990", - "c50e5e86dec4dd80f587bc2ecc080f45f985a2ef7a0126b8c82e0205e32088b9", - "c957ab57293a26e3ba2f09c6bd32d1f67bef2a4438ab63d64380e16eba255196", - "b30dcf29274b07b6c6e4c8477a3f997cdd90c128a9e1f7c946920f3bbbfb800a", - "593d258b440f0067d22f869086a584257442dec534690fab203d8274c5cc5e00", - "7797854cc78e2554d1f04b109fb2663f54be277d45ffd837388febefadae0b78", - "66a989e493d8a9d33beafe3ece5c7f3d0123ec71b479dfad533f7eefe5d6a79a", - "e6f50e6d5ff768a918e01eeb1e155d515855cf4ed6dc0a989020d90039daa3d2", - "cd7971ff151b9ff52a16f994bb94e6e914ebba2321ae441d69f86880f240a527", - "fc5bab53647789496329d567d8df6433b57c320f7462c6f3d8667d23064bc234", - "2d4341174dcbc69e1bd17327a2c3636de7d1a78552c0ff293a56611cf081e808", - "0061dab15e5cc8a55e02dfeb6e050da62e7d3e51ae0122d6ac158cc3cae8e3d5", - "26211cd670caad210306c64851b8471a2f3c02c19ccd8ba23a766d370fc8ba48", - "d0acda7bd2fec9edb738608814fa426dc7b4f77240077a5dc57df66909112d89", - "05de7d6de444edc01f65638862fd579aa2b4eef3578395fdb566a7616c6159ef", - "108bd4573df38eb3647490b85e71234a5f758a61f14241ada60f97d421b64ec8", - "da342dbdee7b804843468a7a0e84d193d854c39cd30e4c7b12869c6957229f62", - "80083ccae690760666e2b28fb5338667c2420fb2ec6b5500305e5888eeddcd6a", - "adfbce7d3e7e26448249081a3341643886e416207964a4fe207b304992fe88fd", - "45550c5004f8a006ff75511b2951f9396ce98a71579b27044c36588c67f63e5d", - "d5aca5b6f71baabd68ca25629e454de62330cf04f30343e14b5e28376ad1a35d", - "cd71a996c843ee1a23dabc1f7f11c5a3bbb7e7e81ccf3b91a0f92cd21225a59b", - "d1165b342131607761fed2b48d916c2acb46e68331dd251533a0a420a56bc13f", - "9b08a745c131b76842237d4d55da954ec1531bb578ad165d059ac882da0e4b63", - "e014109c7ee6b84492f9e6e154942ff6f6d37b32bc72f9952b173b610ee1850a", - "782bec6e2952e40479b7f9657ca5ecc79caa159ccd5305dc23db877f93ab92c2", - "d9fbcfe9b81f2716dff5bc98515df2e916928cdd42402d78a10d0aeb7f69945c", - "85b18278fe7dd5cbc88150d0253d04de337caa453470e2724b1178a6a3e392a4", - "95e605519e506602f7729d79dfc1896779196145e8f70866a8faeebec234c92e", - "d4381aa7ce551a7b4543b53a373fba577c793555a7fd4642c1e58d7f0ef73d9e", - "8098aa408e3bf6fd14e5ac5c3d19461308cec7e3f8bf7f880328789d3fe1b36e", - "39388cfcafabdeb1938b5ce0dbef3585ec11716853e80ca50b712b86f73f0165", - "f2dedf3d11abfb7141666a53e921fd7d9b75288a45809dfb18abe590eccf9f2f", - "4204961b352c2bb47da9ccdf221819b268a5fe4d0c119b160d21bf3e751b6535", - "e8a95939bb618e31b3a257ed7dfce234049a6275002886427c07eeeb7c398cbf", - "c6a5ce99a6c454445b329c2a7aca85059e0009e3bd45caa474a98c96f29d7305", - "0c01243f14e221f0b6205152afd507356abff17bb8186def2c022415f26cd7be", - "4a3f93a066aacdd3adc82da30b73c45578f3f15083aa99984b35c42f42d832e8", - "926a0ad943fe00e6d96aca407d569d71daec3778d3e3b1e3e2256223ffc058f8", - "bda9963a849dae1aab5d791a18e145298a3f2af71bd939916a698f0cff884026", - "87ff4ff01f94aa3cf5cff5e1b2143501fbb69a7925408e2ac5baa9b18282101b", - "61824c1ecd17cf5cefb6e1c849abc372a7524a9e21e0bcb7965ac0c130f66179", - "19fb4516555b820a351cc7f212c1276d976b159d6e7fdf6f44010098e212e263", - "220f9083fbf565b711a67f6af081b06639b3953a993bbdbf2b6987489ed6876a", - "4e860691c8d724ee0bf1ea701799d8a275a00974350650ecdfce84b3672f3a3f", - "7a9f704ec34e85a878c8a4dd501d5e002c792104719be7a61c61b96023b9ffc6", - "7f6084523f9b3c12078b1c00a65173bc3ab0bc912cc00dd126a9c5c182c6d5af", - "04459e5f615e224fd1d2542a4f7f22f4caafc5e4f6aa078d3c0fab99a4662b22", - "7231683e650c2382f4beffa9f2cf88bd451e440e474041a672fd91f13efc9571", - "d357ce2f48edded6c79b5b594f0e131932ebbb4b3e9218f6f0f3a57e165d4810", - "d33d5f47665dedad58f894b75c3d11e05904502b0138ea7ec6437bcff0c9fb9c", - "108ce52d001827ebc22d9a44dc687578c833de5e8fa2f63ebc343e20c2154aa8", - "25175a355fd4c240d86b6556c3596819049860eaa1c125cd1b30b8e0d39d69f7", - "b03ddcda9467cce3fa048e5f0db9f24b55f8a2c1b853cabe4bb11ba411384f99", - "83d1ec7c0e3df97df425c51383dd383aa35a55663ae6e85171531af5060821de", - "621b93ccdfefe85d1cd77a176a6df50187e7270dfd77f84afaa637b9d7a5c052", - "7449049b730241675c6a900ae4ce1842c8ce850324f5b4a70f5a9f474f214c04", - "36aa8b49e2afdb5af8f6926710e992e05fa62ec1bbdb0627ba9c6941fb4b507a", - "6c579340c91fa9b84f1b501ef40cd892934920e64585becd5409305c7d4546ef", - "1e343885b242007ae69efb2b43688f447b4cbc1ece36b67a7c0117dbb5cb9b65", - "916e313c84b99ab4cd402fab25ade1d07531fd84be48f85f3054bb17989064ec", - "9127a6684ab875e6d3303d8f53f0d39bd51fda9cb7b20d630dcb06e4dc910fc8", - "987b8d050f923e63ee85172d9a211356dde53b0a40edb0e35c86ce246758591c", - "a71a4325c27dd9f2a0ae430649ca8ad91426e542b81d9dbe18bf25c1428f923c", - "0522df137dd52f1868c6e4a63245a45886602dc6dafc48bd1109acf73454e3cf", - "1b02f5dbb09aaab1d728d41cd6c1825c254b047c85dd73d0b60eb5abd064e517", - "5d03a63db6b3445067c9d489a46daa2ea4b0ae23f50a8b90b7e93bc4278c135d", - "94e6df1d3b0d47887645f1b5c8a6b25d9934fc6e9838bfbc3bbe3023def2cd94", - "9a8dfd0f886ac29001e6502a93c4ca52c5292d3d01230140108d88800526cbdd", - "fce71fd855323def789b1565f8c1a023f0cad5ce823185660316162ff028ed2a", - "3c1ba30ad07dbc731981c49ce2ed34d1d0ad4ea47438b64d2c86215ab2302f56", - "b45ac9a53c952414647cc63b2922ac525bce53e67985ce901ba1f220b0e91a44", - "fb33374452ed65f4c1b0f4e884cecd6155bd5d28df9a50053fa909a81f603e04", - "01a78c602c1937710d89264b63c26e8f010bea711d2b8edba7ed01b18c1271cd", - "f9f5b407437f06a572869110ee245b4b88f52fbe9b42b3187da06e5d5857a303", - "521aca2b391c9db71bc1fe326b1e2b8ee1939219151fc0610c81547a95913c4c", - "0e573359149dc7a640f9152f88801cb7ed65c9131b1e1f3e41ab4a9db4d93f81", - "ee69dcc109711145e4390f0c89f974177c9ca895b590ae1c740d3264fdb010a2", - "cb95f07f7eda31e4d800e442436e59c8f0b8fc2e0f18979c029ae7e25b123810", - "ce1107e4c7102dfc4877c9de3efa82be08483a6e6ffc9a704b8217ceb4849d2f", - "8226cc8077902ee3a2780720b1326c82a0ef13fb4c7d290190470191bb79ef8a", - "eace528dc6fe483103ede07ed14f415f8175ca47c8e14c0c3096bd72baa51a34", - "69d585316ec2d579f86fd3653707c8f17fd84f962450c8125910d5164d5baeea", - "539e914b664eb29acf56e3377024c33f526e3489b40b810085618d23d018a297", - "eb25e61789052a68bb59a78fbabff664c0f81b76715e9ff0de723c52791b2f5f", - "df80c274874602ca69c5978bb8054038d160dd5d986c8fdf9d25a7c40437be8d", - "c519f7d35a24a8cd1b331da291af218bd8e420a359ee42bcfce49557941463d8", - "9e3a1a5a19398913e73efe0dc243553d61dc90cf12d8715dbec83665aeaa39e9", - "73fe5e2f2591fae2023a29d3e2de0bd40b7a9264bf44dad92b333b29d5a2075a", - "c2a2f9911697268b8bdb5b3a8951b08609f7e930518a125c2cc9eec4dae087c4", - "588b0fba5c93e570f3f4d41169c11cca743ce3fb5a5ffaeb307e7ba2711c288b", - "ff943585cc9550dec9d6fa70ffdcb83f5ddcd7c89ed8dfc96c48dbbffb444573", - "8cd832321ee5cc8b30388de7c17ffaee403d3dee67c5754052e02c829dfa1103", - "6dd7d62f91c0d0ac8da788954e6193bb6e3dfab5943abf8b674d508ead0d1569", - "7959ab82b84697217485276009616dd9c59e2043c854a48a0ea8dbc259fb949b", - "5f96a644c23736e57cf6f62d0a217a0394cf846a9dd9047f1050fb380ef23558", - "e8f88aa836ab9ba2943fbfb75eaf8d718b528b492732c2173bff3c4fcd4d05db", - "746ba41c1a731fa1e18f315591307d5a3ddec75325227278d01f709136b4a071", - "9f0e1d2509aa9e0e43dd2e03135d844294a5dc5d17ddb67cfbd9d7d847449d24", - "5930fa046a2e7470790bf25768143df0cfd644387ccd093cb2c3876ff954d6a6", - "bc149cbb0a2999648bb133cb5fb3d9054e366d102556c5ac37d4162f7d961a17", - "02ec1b551672d376701d95768edd54fae58ee74fbbab565ccbeae9cc5eff907a", - "4ad4247424d9456f1897d97cbe34d76276333aa55340433bf5591276feacb107", - "bc03d23b675efc6d4fa924d591856f571505d835fcffdcde8e10edff3ade6670", - "cc37099476d1fcb0c4e932380be3a7c2bb073a498f2873418e33b394f1cfa479", - "cf4912a2babe67c9c7cfe789196489a97e90cb4cbad8cedf50dddbe640f197b3", - "9e15d385d5380c56b1ec6ef177ac69241a3ebf0ba06de1a75c970b5c690a8837", - "5faacb0956b1df65954040b7674099de11edae49a0b449890a4bbcff381a3ca2", - "7bbce64b3e541181abe66226104368c8e78dc648896cb7809f8fa7b49a89e29b", - "15944039cb5e4953433c9e439cf25de6b84ea980f98ad4b7a5e4e73106ab9098", - "0ed9204bb98c12bb542860e7166e193f2a728f6801b80ae518794a2c571f7bdc", - "69162d04e7abccb3a084b9f1fa69785b8d4b97039c97eb1b5a487ba24abde93f", - "a0f704e4c096a416279d7367085c3aed85813630410386aa52dea1c8799c3f0d", - "1a0896414a21726314ad871851f079fb8cf7c9cad97cf379aaf11b92013b8c7e", - "e1e1b04996b463282c20c187c7d41d5283f17cd1f284460cb8c21b2b78f7a771", - "085847ea88c316ec228aee9b66376312d8137c066727bd80b3265978e4edd466", - "eb30791d124a9162d0ffb66e200e004f4318fd5203cab80b916a3b3c618a281e", - "04c2507700f1fa9111d67a0d2b2216941419d168c35a0f600d1ecb9944da8b1d", - "8e89cf90b174a5ffa3fa2ee0f2edb022fb49538b6b1b04e00477fda5d9f31a28", - "73181dec0147c1d027e3afb680098ac2da676dbb830c718061cf7a328d1e8de2", - "195de13572208a9b339689ec384d89cbff9205cf2bb076afa7fae39ff44ed668", - "7cbd3435104a38fd3b3607aab820a872eebb43316790fec457423d0b0c1cfd25", - "ca61c536d60ff9d76028ebb32ad5916f4d474d2e032705d9af6c4cc014d7efd9", - "612fde442242e5b16c976d584e13cb7be61261b61f30cbe6f6a8d0aa7b4d18a7", - "cc9ceedfa4c6ca9ee114cf6440764f349415fffdc72a427aee27da46a17151d5", - "43da9d675d17b11080d7c08173675599e0061e430512eb66b48116ff293a4cde", - "855ab4c8ed1b2d121c3839f9306212852f36357cb467007b5f0363bc81cb7915", - "30f58e89ef1f0a449c3f35dfe1cb605c07e404625e2a6d4632f68ea90784642a", - "35f556b0fb857f77fe967479c6b81735a2f8a31e03cb2e1d0fbca978bed6990e", - "9bdca97f26bd4763c1d301b4c4ef4f25b7cdc9d1097d0aa88d00e328346662d7", - "45dfb078aaa108cf478e08b8417e1d0fdce5c7e2460d6de1596b1b0a4e2f6deb", - "b5890cec1ce0b72db56eee387f6954c8e6a890dd0b1a73fef74337f97e593d93", - "6ae2a14da19d5ab26e5963d5621d1ff6a6325c9c1b791b1d249d79d835c8daa1", - "8bd46aeac236950b9f200e38dadb4fe64fddfe3355a9ed549dba5ddee7017ff1", - "37e405b88f0d4b8d3cfd0c2d6f6e10567aaa4e3db6cfdb98b81c341357f6626d", - "4450e94593c956d605069971453f7881f609d99c9acfe62c7166760b15d6a9c6", - "0b5c97eb43aed8f7c3d42a0ddfa7601167537ca79de6104e4aed110dec89e85f", - "b9f8e94416b40873b0437e20772c4f70cf5c674a333d3d87fc7d6bceb860f4d6", - "d092a319ae66c256c27fd303697415d9502b2d326680851a94b0a4cdb74869ab", - "b3af8d614d729c766c3438324f4176869bb75c623043b0d37b7052ddfc9ef41c", - "72c5e15c3b0004d0a1959dd5996837865e63e1c60fffb6fea5d46106ee7b06fe", - "103919bb02219f605e1706dbb2d2ca9ce937d18eb1559905276127ef1fc0f465", - "e89df1a3106bc675c3ced23b7fca5a55f2a26ba3123e65c323006016ed3d2905", - "f504142037ffa4273fe544d04c74eaba0506eebedbff29aa15503d72b6fbd17b", - "f547b21fa6608a44a570f2d50b31e20d42d051cb3dfb2e2beda3e123dcdf3236", - "5c9541b1cda2b90953160bffa0851db79b74a82e63bb63e038a9c3ba268aa850", - "e26c5ef6b8acd115733f3b57fe7534e258cb158aee688d27596ac5faf36af878", - "cc92ac3ed8e36ce4f1e2f56a081449d8d232a5b9fd4170969db8ac065b07b68b", - "3774449c696ceaa9ce5f5c7d2be87fede5733037f87901891469cc7131248de2", - "376997b61f7d91a44034e9b151a85c696bac634cb41d281703020d5f964d90fb", - "297eca356f079700fc9e1bd084949abad87a6e095f428db4caa8ab565670be31", - "ae44e6f0626b4439efa242566ae22c421aa1dd8e389d535dcf0c4d41f775c91a", - "2683e66fc5baaa99ea7d6c2ad9790850ddc06f90f09e4e833250ee58e845c227", - "d2d61ebdd47c1dc7284c2b1c960ba24c0991dcbe87bf01c70fdfb335d1c72c75", - "74ecd9cc4396c1be8bb711de7527bec748e21a1ef6017b452ce0368ffa0d37a5", - "178eff8aef75370d0d53525d7cf21000256a0f02a4a6910af78a25c0c5b2558b", - "0b6e3e0f1a335bf7b7d93d4d56d7eb5e23237ca6c202de3c978e09615ff50fed", - "3d1b73248ebdd3e6f82242222d2f6710f3fc10367d3b15599bffbfaba0f8160e", - "5d4b7f50f25947903d3c95e3eb6d6b41f3a202801fd0d51ceff17d2035e19c24", - "4fd3dde5161867fc9a1ca32d5c5d98a73eafeb862a5f800de244b8c5d755b35f", - "8f294b6185c3b8aaaa1f7d6e9cd918de3fb2b88ca4985ba989d3ccfa12e71bb4", - "0e905e6afb79bbaec4267bf360369607f1f45d014d1ff2b2aa3cb07240c5699c", - "9b41c1a49b95427736ec31607b6fc8254993ef0c6f6ac1334ed12d0727ffaa35", - "f4b2fa00a9240f3011b6a51658309a1f04aef785d084e5414928659b76fedf8a", - "d3e1c3f60eeb372193591cf40a59fbd99fc533be30de4ca2ffe1646f58b57163", - "46a623e7cdeff09b3700e952256e9992de14c3a18d191ee4e8e423eb1b92a16a", - "0171c035f532e1490547f039d7ddd9352829a459d56cf9e7a313f070bb1ef606", - "4560008cf248c1832af7b071cd5e0537c1ef239d62d98a9561304caca579d874", - "c5fad331c6538bca2dff8e3fc26e875b4c9cc9553a8849792ce085608142f784", - "456b5dce069e1643116621e017b3f660522dfe12d2c274e640f5e13296574da1", - "87d4676063885fa9c90adc47633f4c4dc6fd421b09abbe8cfa4aa9eac19c2ca0", - "e6c3e0cab022ed74f361d56e1870396019c2eb937395471e0bc61314935096a9", - "92fee56101f23142d3f9838ce1bbefac315cfe1fe7a2d7b69f0159e60e616cec", - "99c1484da0b980c1ea49794decf504413d979cdfbf99ca38b852ef5b2597d24b", - "efa3ed781bd49b9dda9aa5ceac5fbbb31601c5bc1a6132e4a756434c265e53da", - "26126420cac3eb1ef88b3510c228fee2aea518c0cacbd965cfeaf9d39660ff7e", - "780241cc6956c188f11710598cb7f498d865b831ffe8de006df2d92257a3228c", - "1f9d0f4a5bda10f0b6607684576e7664f0839f5b2cd20ee73a3e32639e229d7d", - "7187fa21dce3bc5fd76453f03d5e3bfa1ce41194c849b52587feff13d2157b22", - "acb5b0b96f381eeb6badf210d6d9b69f6a70ef37ff739e1a87d061f11aefbd27", - "daae5a0c3069f05a81f27ad6c4730c13caba6417b5312f82ef6ab4f808b08ede", - "2a1b9a5c6a9d56daefcebb1ab65dcba5d1b582572e3b8bd3bd6e2f8cf6857ed7", - "938be532c7b2fc7cc675de4a36b87739cd3da9b8a9e6808df00f847ad87d2f1f", - "e11edf0d2354e43a0b866ca313f01854199cb5549967718f8a78a67fc4a04fa1", - "b1f672ce5f2deb783ce1c6a7f4a8c3f0899ea9d8f75fac34ff0b56a5c249efc1", - "d319487eb47be9922edd105347ecbcac7f8bcbccd9dae915c6a5a2918aa3cdde", - "e4c15d114b459f7d9071fba29f754d5f0a01224c60925870fe927aa0ca8bcf08", - "e712f42b32509900da59e1bdc3c78021e3615967118e30643733f9903df7e05e", - "e83900afcc96f3e6c6ab5af2a19d636e07fce263d9da96aa29e538b56a068cb9", - "f596cb655cbf98248df148f27832c30aabaaa0c71d7d079e9d200f087a88951f", - "b0cfb7a0161cc9651157de7a8d029b40af6a4279ab1dd1ffee060fba783e8938", - "5529992b95e6553b7fbadceab592c5a37f9da0d3958bb235f52087c22a29fb35", - "7210497f5b03a4bbc03281de9ebd033b9a414097ab16efb5db4afdc672ebeafd", - "2ded4ad02ffcad2e91529ebfa5bb2e4c0b910f9640f66dbc4ca7f2117eed5fed", - "97807ba25860f638575e07fb31853d03ba7996746761906d0a3a88c972761cc3", - "d9a2cbbc116fc64b78962d33b5c50f8d26f5bed23af65c974d2c629bc6149470", - "dae5d6e13f3626ea346bb13f465d006561f796018345f8d022060925edf9c327", - "3717f9598516a230c480ac7d90babe1f1373c509f161d3ea7bb24cc47a37821d", - "19a0620d7eda8c853c80bea46928c46cd71651954894b443ef00ab36c34c65a3", - "385f66d06cdd602135dfcd4f3d565cc2584b949ce4ec03547fbdf2139a5b254c", - "d4779d7222e2b46fa0d35ef59ef6ef9d20314b0b8819a5da2806195e6f97e389", - "541ef49e3bad8fcbcde65e4ff3b86d44d6053e2768e74824dcdda642cffe926d", - "26fd12148e355a5240bd1d9705126c40bf64cb0bffbc6136d12639dea6efcf4f", - "d0a2d96942d520eb3d27699f258bbcc86e7ed25f2cc3eb561c310cb91f701f7c", - "5611875747b13b12ee71b9ad6e5292cc95f763e6fd1560ed143beb9029b34bd7", - "439dccc094b0685092d10b103e3dd61519bf6483a4c8fcb2b7df043a4f8d4525", - "35688083492f34b94a50bf9c55687b36cfd97583bf135daa371ab3ae3754cf59", - "4f6500f60db682d55bda368997de0d5db84ed0f84046ca2255a107ec5be2475f", - "4d743b965da1606817d3945ebf9823833e9485d6655b8a03450810013ef2e048", - "0d80cfd83cd021f8792c1da4b67221acb7c647fc44f41a1b7f13c2cf4dc2fe4c", - "36953c68ddd222f3ceb997335cc32d8f42de84d1b7e2a7b0583bbb7e2a06d98a", - "c37310ffb5fe6f3c77975f8c2822c184014a41c2382fb2dc85a56c9ca0e32cec", - "73ffe9ed4c9db00774aa879cf39aae9a6a06a5619bbd60c75812c96369acca2e", - "e82fc4a4272f95666631d679f5e6aa3d4b2ad2efcb56a80c75b7c7cede1bd9d3", - "40a6409baea3ec26c385bc61f152de36714d64790be2c98a9bbad3aac2885c0b", - "9782eb1c43727abadd3c13b1289edd7eefdd7cb3d635bd9f870daf8fbe8bc0f3", - "3e63f4f61323f78a2ebcc384753e2de73478b3fc6fe3082eb3ee0601b4ad8e73", - "d4b520e4bde4e9f20edd8d89882574cc8dd02194f0b66fd734753a50aec2312c", - "96e641c821eabe06d4e934751a2cc046af7e0ab280eba50b2315bea5bf5e8aff", - "789e044de1b5127ec87adae365ae37644abed0c645f16e400fc2dfb136f5acf0", - "2195d34e9344d3548d5bbd471b82a679cf5328605997ec9703b61a4525a7ee4b", - "510ceace88160f2fe9ab669f482a1f3c50d6dbd3b0a2adf3ad57b3a0365d0599", - "b50d03dce6bdd5c4f48e0f09b19a58e27e8bf5fef8a3d629f7c44e5282bcd4e9", - "22583d5d84bb05dbce72f19a63bc7c2b04a7f1e0e09b7f560ff6d1478011a4a4", - "f95c0c67ebec9b1e51074cca17e93da4ee0273a8faa2ce6e2542e67bfc3fd0fd", - "0a229d0215e9d43a2c0e3cd0be6fc5ccbc606c06f23e49389f275d03cc336886", - "09718c6cb6fffd5fee883e6e6d22e61dc33ba045ffc90b6e9098c6c0a8fe5563", - "bea3ea9a1b5c4433a3129ad4e00e9ba2c191c8bf417d97142594623b63331226", - "efb6a7782318ef9f99e9cca8882490f1c08086f75def5b140008c9c0fcaeff5d", - "e9328d53682b463a5f3a362746bbadb7d4a3ce6a79ed34935457f1994c4ca949", - "310e7a4654ba89134b09142d753336a6210f419662b11482b691b1e4fa06aad3", - "92d17e291752f4d6d97e9242d1ffec0ca245c8d54b94c20b34fb9efdf763ad25", - "cd2abbfe5b311d634eb412e536030d24b9b46c2ef9eed5feb0edf6a7d6e6cb9e", - "b488c9db33a61f01541faa9e2a22bfa0d4d71637f5b15e72c819045242fd24d0", - "935fd4e67f31d9c2d7bea8f47c648d70f60d7ec93365193269265fbf59bb2f9a", - "f669c82bc8e72ff789ded3d3fab56f13418bd94b2c70a0bfc2e4137494ddf686", - "f09587f055d679e4734957d5e55766598e5694d4c8fbb0f04ce751ae78a3c77e", - "05779de039ed52917bce25a8508bbc66c4fddf4490cb527a51c88bfd11d045f4", - "f04174e1cf93ce673860afb6ec00f398c9aa97c51f6d313361deb1814b5fee15", - "14fbae404de485f7962ab5e4f53bc25dd36e394b92f11fd513450e085a198c48", - "49c7c7c119aff0301601ebddd3f410d6b3e7687c10460c7205b1cd7d444167cb", - "f3255abfcf92e52da21cc060d2d23b663f167f68d34ddd0c0dc852c79b0ad368", - "0719045f61f3584dd9531cb8044d52b1a611a90cf2ad0e9df94eb3ae6cba7b4c", - "e4c99116f77bfecb37a13349e843d32225764dab01624b3986796c42bb5c7564", - "838e5686c380291f5440dc0d475f1c9b66d33d3193b543661fee216399415848", - "3983ce91b66298b0760f65bf3c775c32a34b6d2bdd8e6921f1a9fbe718d95f42", - "17227d1ec3ca5e576e0f7f160d652fb3524c91bd40aee312307eda69ec2fcd1a", - "fdaa5183b14496ae2ab204337091ea8fcb52829838ff1d6e33e73ebd5f57c43b", - "fbdf06979350d883a7c6872e18528b1e45cea562e474cabd456ed823d19ecdce", - "5c1f1cbc180c06492472114d5f0692d65abf95f0ad9b823d0aa28d592a236644", - "91c51a7f01eb91a49ef0482eaf22a048f4516863c779995fcc89356df3d6572f", - "97023b1f67e7a578db8bafa5a78a3190ec6ceecf0cd89ea4cebbb8ac524a0740", - "e8f9ef2b2f9e31a6fbc214243c50c4e053d9f1c7b1fbfd0d135ac59f8faae621", - "b5927f47bc3b42e77efbb127b9235ceaa1c596b37c6d2f1ef3d2dc855b4b6ab2", - "bd445fb1ecb5a5a964b7d1edc50393a53c51d1e8cdf1942adaad0a509edce909", - "8c76da501d4030fac45587e32a2a78c64a440ad4dc4f9fcbbab7ab2dbb0594d4", - "b7af3cd45b40a33a6866264073e5d763576e792ffa52c814495e7a458c9b0d0f", - "3cc923c74975d564e6587c33fb1fa23770a33c9a430c36c606824fc8009158f9", - "050f4186adbbf8a001a491475d1c577bcb892cb0cd54dd6030aeeca5b27f929e", - "7f8522168be8402e3167edeb782749f25634afaad035b78a64a97fe85089cc61", - "972b2b720499ae1808b5a458c123cde94351833762572e10b7a5b0dc58b16c8d", - "ae74c9f2402aa4aae1f54a51d9343b2496c423f9055fe6f483034f99e6f9c812", - "12165d1426d4d7ecfb57bc00373f44b0f5d2a5fdc8c33fae3218eb44007a5172", - "2dac7d24c64fe7de0cdcb8e751652b114f523f8e22abd972016f8968d5d9a868", - "81b483088130353ca88f9245211668da87d621beea2990a27fa359536792b671", - "128d66bec056c53643f10a35c8b660d5b6d8df282fc0669907acae3dbd0c98fd", - "3a7521f3a13ad79e4f03e12c9b79166f86344c1da987c75dabb783402b07caa6", - "c7571dc145227cb7656c7613848ff80ed55bd18e944e2e679bc826967ba6acc3", - "bbf22b0da3905db197ea820a19024f57f79eaf69f0ab6f85a1c41da99cff0931", - "ee3ff28a4e3dd14d80ac3ed63ae8f774a98f76a15209d59a9d66cfe0ba81fd52", - "f0be788cad0f64f8ed32da7baad40101c3f321ce3e10b673997dd3b3fd9798ee", - "ef5f3698019385d5f131242a4ed04406dd95af443fe750b8b10cc1e805d3d980", - "a751eaf964675a41d0f55a892dfc1443adaffbe1de1579387aaec213598bc585", - "d5d6bd305b347c0e25aff0213858684e4efdb6112456bc672c924af14481da62", - "1a7f8373b1fcaad23bcd6848f40415ea101fdd6fef5eda6735eb104aea2ec0a7", - "d38c0e4acb6d8696da89b833994af7f9499c68e6837e20a880a22193ec5d05e0", - "8203b4549a7addab248c629dc3900583e89d7353673f0f87ab5cf4b19e330c60", - "e4b5a929f87c7c08f8f5b37f6a676916543b638ab95d228a35ed920ec2115ec2", - "c275af16ea89a29e25ba7c70162791b8e39f686912ba126aadb0bc3842d614d3", - "b471200411c8933759f2bbaacab54472673413f1c25b147f39b4015a7af73b0f", - "99a444da3b6946aa0cf42cb8359d8d5f588784d16430c1358feda6fcf90a1ad6", - "bd569fc83e5488fcdd772f61838d9c1e4a30384e050382f423f115f0efdf7e27", - "f896d644ead59b2e9d1c25f1a7555b0a20fb8cd19acd8cefa1bd950bf846479c", - "cf45a43e8d53b7645fb3e61187bbe4ac798ea0eb1e863912d61303bc11f914b3", - "b8081a5b519fca5dfa27b862c84c6fac7252abf8db1214d2abd2dca57567fcc1", - "7abd410f23cbd29b52b18f5691f23364880eac4dfce92f836fa84b45175eb9e2", - "c605945d1e19598e2d42fd561b00cbc2100e8dfefc413a33ba5215dd768dba1c", - "c900006c16767b14705a58da2e2b556587fcfcce5a1a03030bfe986ca3268c52", - "5dafe3f8eb28d02f679444f4cb778406cf70408bd0076e0f900c904d52402711", - "36a222a7306c75602f6220c6681a26087f23f652bb9f78841637b6da3345e95e", - "73f68f00d482c6736a1db8618b54e9d387638768f6d6ab50acab6ccd5a8cf2df", - "5e96628269dc0094ebf458b96cfa60d3ff8ab0762d7c205411d1e71f75850ed0", - "fef48fea534460b6b71192e59c5d934143406c69f1a48ce22441cc20af68d8e1", - "4d247f86e0ea61942a70fde08dd84825a7f8cb634fce4102f14d2295e870002f", - "9333da495d498dec208da0fbfd41b19d40c208850a900e131172195f54042aa5", - "f6c1b7e6277d27c3ae17414b8200bb1d5613bfa3f2bfcc6f9c82b87bd17b4519", - "5c0decf567f1fcd220a0c311a9194272012ff886bb0c9296aa8533952dad1450", - "1e7ee0494ec1afa25f19a84c48431dca269b15d213d89e37ad8259554ca6e1e5", - "9c3e2a046cba18f644a3f92febf04ffc05d22cb699b0cd9b410d4bb4389ac6ae", - "7da875e4848aa6f4981b78b6c8ad1bcd2df66f6e7b960f629c9c907e786f57e0", - "5ec441aae10ff124fb5f28754af290df56ac44de683852f1991614122196dc81", - "91ecf6115707866b759d62d19252126437bacb4e5498ca28dd62cb3bca8c0749", - "abf47f7d08af70e29bd65a4773eab04052de93140daf11032d4a1234116897c7", - "9fae89d9b081c57b7caf61bfdcdb7eea261a2be6068b3bfd5732d5721e3485c9", - "6ca7070aa7f983d7352cc051949bc453d7b699402a2cb96a742a19fb3a62d9e0", - "71283dbbed13f25f74b8d432696ad21a1a07a906e208702f41d1b2bc008c69e9", - "1d001838477aa9c71896911404bbb2c37f502dfcd33de2f59b69e974e0476771", - "c49f06f07a6848bfb965fbea1eae3f7dcef266ff8349b32b8a3529b403c9e1ba", - "14953cc861d457380ead49628dec46a03eee953edf87025f105d12a5b22dba24", - "e87a164d489a123d270f43e83b3d1ae570995fa09df91c04378bb25c28c65ff0", - "5820a6e02e27b9733ac2cb452ba00bcb988cdc437ea156deb0dc573bb3b4f132", - "a3be9f7f1911fe7ea11ca9427dc71fe6e700bd8237076352648323caef1ad708", - "d96093d2df86c9c2025c4f574899770b177105d50658e9f943af145598ff96f4", - "5c68a8ac66f5a051291f0a83328edaab3c05572692e73cc8a673c5ecec8f3565", - "f0629b3591bb4338eec912dd6aee99cb24aed18512407b5be83b0d464c062ff4", - "dfa6e6ce3410d529d979be560a8c16a4b308d184be687c7882049174c71f4604", - "ee3ae39e49553675cf9407aa721cf3183b08bfa0444a0daa5cb58959d39fb71b", - "b5ee40691d3e655173a08df88e59219ca3932fed547fca38740a37a0018d5c2d", - "2bccd143fecf26c0f75e8a6501d9f413574cb9ff6ccd4fc9b52054e2ce231f1b", - "7ea4dc1af4610ccc2422dafc5ea40aac59382b3f84ff7b9a4b3c7db94d3943d1", - "ad5cef34c1439396801bb44a7f1ad0d94ae9721cf921ae110074d604d7b3f6de", - "433cf429ab5cfe60331117585dd338591ad93f41c93003735a23828d7f4b1950", - "6d3b158bf82757f5cf8f208fed04c7c861821bee912a362847463a9cc436178c", - "fefd8e9a1aaa1d6d0647ebec222d997b6810fde7fbe6a08a59c688265d28b9ed", - "b6bbe570ff18e07bb14268592028f79415d106230e4d8f9a98b33bfe415c434e", - "d047856cc972ddf7050ccafd6413ae13b03ccc305ae1814cf1a451abacc0504d", - "e1900d89c3be41ca765122def00ccdde398a5b1d2a4f8fba0d850fb14a574654", - "3d3a3f7e2edb837fc638785d1b8a2195a8ae38d47a9377188262d83727b7f7b0", - "feddbd6fdf41308987ee4e7595cc4ed43c2538cdb6217323dfdc2331c779530e", - "a606114ccf12cbcb526744ecd7051abdcef2c7e6fd403b36afc482b3a6e15b89", - "6256db7b16922be3d3a77b0742c65d160a27669f3d1372301d92569401674fe8", - "94d3fa9e57987d5f9da220d597d103d08ea57438029b3ea606facd89b2458997", - "d3c2ea9c601cd5487518a858681d30cc23e8fb98ab73ded370dc7dae79856f4d", - "e250c2528c6f02e1ba5e1abb07f5401b87f8b114080d9d64b821f4c91a260154", - "9d1514e658bb2be3098f4c17dbbd4a31b70863ee08f537a28bff5478bda0ea09", - "5d28e33b31c006f82bc3c0c7bfb75a81622b8a842593c5cddc153977931b4e16", - "790d11ef37e19e89185e733cda720b4b020f7821589258696520e3891eaf4ccb", - "2a5b7bff698518e8310c733b46b4da86b0ffbc1db89962e8a58a3e5461f4c6fb", - "204b93d92ba0a1df930c25ca54d2f6958d9d5f93364d72e32b1b813539cfd035", - "3ac114a655aacbc3e2d0a1b8ed15817b07466350dc8f19f8006584800ba482ed", - "c8ec12dadc9585fbed26073dd9c66c90798a79bbca9706528f016d6368313854", - "cbf800afaa94179b58581ca685a2bb67c678745a7639e40c323f6d7b4f6644b3", - "5afbbae2407196c0e0d0f1cfa8d48b58147b27ddb70dc9ecbc764a4326bdc80c", - "0721abfdf40c48788beebfb9f683fd96b25c307aee5d88a1002fc6abdc166aae", - "6dcdb29bcfdab1a8888ef4ea1fecf6c4d34b9123ff01df3b942723d2d0d4d19a", - "ec23d01d96918c8639aeeb2124ba9f605a52ba218de8d514d14d6fc8a5722437", - "5eb11a09d3541ac887fbc5bfcfdb5b4b5ae47b866fbd31533af9d733ab2f232a", - "d3313a81e5da21acb9a23b42126a6fc7ae26a31c6e38fcaacac900c005e3b161", - "bc8d9851b28cbab7d333b5d49243a4e645e279f8cff5bcf9e7829596db70e95f", - "bee1935db6d0890e3918ee04bfd7c7266fd8aa59799c95153371d8830e334246", - "32d46a12b3b643da382dcc3428cbd9906c8328da596454eae269f2985ae11961", - "24ba290d6e1315b539e34ec565c6df65b6585fa6b55eae6a02b4313dcf3d4f71", - "f26f042071c208cc928fda8f112cb2a34fccb41175d8167a7586ab4d210ee4ef", - "950ab56a2c196e991b4489256f7ccddcdc209a5c0012d0ddcc94d181ac3c8335", - "80b68181fbfa8748d82cade1d4bcc5d5aec7c481db2193ec36276822e8cb7260", - "83b8af3988cf3e4f511c461593ebbc09598f0291dfdcf2de79ddd5a1f3e5393f", - "049574363b7d6955b0fd99a760c0157927fd62ecb4f2f18a9211a6d4b6ac7011", - "284cf9b3e73e78f9a55e774258c3628ade4e32583e038240cd40b8a1f3a8fc2f", - "5c440a1511c77c4cc812bcbc85e1404f1eb56c1cb0abbc4985b9807b726bca11", - "c54a49ab7526f370520bdc6174a828499c86924b8e95b18c4839e3f3e5f3d3b3", - "b2f0373ea72d09d68e3308df3cececfd8a658b34be55e94f6fe2d64ac3fdb780", - "85c15635bbbb721e6158dd2953af2073fa49323e1f6f6eb50aeaccffbdac2222", - "f573cb55919cb0d9b4eb42e8897c18e69a3beb15885f22bac6b3ca6258aefb4e", - "71355952edcaa797648b28c2e91d50ba664e39e425e803b812135715ef2da37d", - "d87db8d38df36e1d9f0b814cc6c278a37fd23edffab9d495c5abf6065ec63a7a", - "b63ab0bc58806445ca8d56c8bccbc8815f60dbe9d1ad01925b3753cab62d6855", - "b0882548b366a78c634d8c0d6292eec9ebb2598696ac9c647d1a81fc680e8562", - "99f6fb2c5d52636c2f0dd570fd7c694279564fc23318868b314260a38aa47ed2", - "a98150e811895d4108e277da4af8b895f97212913c9e284b30b8ecbb07113697", - "37cbe82bc8d8a79b6bc752be1ff0c20380fe61a636125df81456aa8f4fd0764c", - "37c414980ecd3386e1a36c531989bf58ea56fd8824b206325d371c24dd36af08", - "6b7dc0f001f3bd53e984219babe80679ece6d26a818376a386952dd6e718ee8a", - "491e57ae6c9f2c22ecfea1c707860887544f162a136158daf42508b88eebf165", - "d2ffd9dd5356c3e598548c929d6a44812c733a13fa8a77d08aaa9e9484e6d15c", - "26df5af7c15e654a5f79f263351a86e507fab6fcf4a6f411428f6d494e0111d4", - "81f6d4f635335ccd3eed2ad1deffbb77131e9880d8cf2ba64c97664f1e6762c0", - "73fd07100bd4acc10a3f0d8a288f4fa7c35e176b81e40cbd4c1d82b1d877dcc0", - "a1ba7a4fa62f97d692551f406c815f8f2443a3de1801e2bd6c258aafb0d8d314", - "df1669eef75db5440dcfe1b4196b746473ec81673698abb255a0e1bb9eb45203", - "05b594605c625510e5e1cf8f9a4cc264b3ea2e923f36c4cff4bc1e99143e27cb", - "518c35bdf67103a1e8ebc631c8ddbb0f1808b7573959fc60e34a91d659e89695", - "a03d7fa6023530f67a444ed6727b18b230dece74fc3f15aea9e96b02df5aa001", - "c9352b76e2e13194109fe4516df5ee97dc20a18362d5d2495c461915eae18101", - "61c6b0611ac7441f60ca78130c32316e947d7509b8785f8b53e3722c9ac75e8d", - "bf886057ff5870fb89a4a2701aa696f16aa60b7350b2d81aa4860013c0df60d1", - "312f344eaa25ac0c6435dd0a30b64825d528c7df56f4a8d96f860b6000dc0816", - "860dd7f6cbdc8d8045e208cc7f7ee21a2d093a91e65f32aa1c57b92c35dc0b83", - "d98da74cb26bda283d39a8b289ffd53513e0c05d04d1785cdcd99f441a8a7663", - "037841a4c23c9e9090e61ef1bfbd5aeecd200d7c3e61a58b32a7291ca8884ccd", - "b096e7220300c4eb2f352dbb4f7eab1b355e4fe848f5e4219dd1a6f7e48ba050", - "dcd6adcbb3fd6d8adfe4aa8426fc6189b2bff23adf5614c891f1345c978bb972", - "16e7274128287fea464d452f21a601fbc8714428c2e324c9a511d261ba188133", - "492b0434fdebc4eaaa9490f05b71e3af94daa0b1c82200c5c5af591f2516e290", - "cada028b1bb37e2eda7252323b5313ff0826ea3153b0e027be221580d3ca53de", - "65525924615cbc9aa1b1a554892f6456dd84eaf79c8e17ca09b007d79f8c9013", - "eabf6b27e4d338a15deb7f089f23da28845ee2fb01c0888980b7e684c366e67f", - "79725ad283cd4bac6d85890faf836477bc71ff45f01d07ffed198ce16d285089", - "d480dbab84f994bb7ceb1e4405ba239f5357021e0bf24e4b2c6a5ff1df0aa94e", - "a2f9b6bde2094bb29f372ca6d4a7ad7ecb839dec9de110d7c111dc565910afa1", - "ae0e2ec284ddcbb1ba1a0d6599399a97747b437713daf3f8d6fc97d960bef336", - "d9ef17d0a32da069820c99b485ee51a48f31e8f27536926eff36da2f9fc19242", - "7c45d9f4edfd90c134ad1da87e564d44efe37a9b2729cd9a0888d3d6246c03df", - "02146e3844bdcc7453df0b7e1051ddc9ab163925feffdf25402851088703673f", - "2aaf88da16aa82a3a6e563ef16ac83cfb12071d05de8f32debb53e9d7ba4a99e", - "28ea5f913955e0a4cad6e85fe759dd905948310c84b1ff0055298d85740ddaa1", - "80ec21403840ec7b0c7cb25e518a0e59fd6ead065bff11ffa225094eb6350edc", - "858cf59e948fb5173e8f2fd2b8ffcde0198191f6870380f70a1ec6a73e409c31", - "74fb3f3aaaf1c6e9af5200434f23bd20a5d71215199aca4cdc93b54a1a301adb", - "514ce2ba306c26a5d3cc6b3b83119b3db2284aacb10a7671bae7304689b2a6a7", - "16a1a0c204e6d69552a142cb36f2acb3e3b1e74d6fded72105c5ab80fc303584", - "65b851b24245083eba55a77f97b64b6a82eec97b1ca94761a10289c7c1ec015c", - "1970933f6acbbcbfd317b1ee251fc0162c3e54894fb0a688192716c3d8b906fe", - "5486226fb676879d12f4c775d09b473f111f58b3beb393abea88c6bccd62fb88", - "dee3d0b1018fd9f077bec66f058abc74324e1c2e08ebe5e7b5496826a32d8dd9", - "c752b2b166684bbb4e92012e00975d7b3367ab230e0271cdbe6b95e8c56f4a24", - "4f4b7a0da43ab711f3de9b60af92a0a46408106633f24b9005d397403c3bdf92", - "c4384b6d6a1efa4bae960de2ab788ed0c98677dd11b04de4b392d162e30756ea", - "8e9240db09ac2645124a30f65d67b309711a2ede8b2c719aa36014848362b14e", - "5fd88c113a9e062e7f80183793271a37231ff6f335a5342c9da71553c79692c7", - "3094b609bde6743c7b22a350834b003b1cc6302b56d835257083f04ddb1f3058", - "6a5155ee1d916bf87583fc92fa3d2f3af8c3ef36595eabbd8d97679bacbe7040", - "b1764a5c13c91998c61d604ba1abf030a023b8f39b91dee8b3730cfc51fd831b", - "2a23076b8e05214d2666e3aa238766dc5e93bc5d3cac1d47a9fc053de4151b70", - "7e7d4f0b48627ba0326bc8c6c5104e6654598b27acbce9f43f18da8669651cbf", - "13f445d5d02e902bfc6bee796beee665484160cfa3b3be94774bc5827f5ef38b", - "b41d6301dad8e61dc000275188cd98122f292768cc97dbf37dfd6f4184498404", - "9c71cbc83cebea32e0dd7fdb9cd70fa683093cac14f582cd8f1d11a0a4d9138c", - "d42b795d991ebc121d38eaf05d0b487da6a47ec5d07d69dffffb34955d809773", - "0b7e9908ac24b3ed4cc49de9b6842280bd82b12c73e2cd9f3509aced78514f92", - "df9b5ae902695593d188c4363f714f569384bc76ba08c7a2d86c7f4df90e10a8", - "62b96c46f3f8720a4d555c297c88f758c751356bae0f4a488f6ee5c3e58ca671", - "be6f25132b9372bfa858b9f56a578bb7d6886f1ac044569381e45d993bae1328", - "45bf395f7776a7ca844945cbdd2bd130cf18a8bee96f0dd7c443b9d4a84bf4ab", - "bee6442b1c61fe9c91c4945267396310a0f7f51cec3495340551a9f67db64d2c", - "0690464c7105c3b5fa9989efa99392012ae017d09e74a3e36263451447682272", - "01dc5deee73c5a244a72febbbedc82acf2d1c286320481fbaa28c0def6375bef", - "f2efe343f09f0c31f47e05e0116fed710fcd204efe809a47a2d408f83a23d3a6", - "380128d578944d124a671059341d6b03e866236f0b9d819d3723055e71f4f65f", - "9076eaff49578d80a72c83f274a14583baad8811a821a2580006094e9a9acc6f", - "a6506cbdf2615c12da7f5dbbc568c8685df63eb08ac5a2c4ea79d01eb15b6df4", - "f370a9c31f05a1197d05ed487f3c53a13f00903159734a8004ab9e093e5f83e3", - "e534e4b2a58224202dd1888ff1028678d387e6325effbadec9549158891931df", - "a798b4e587367af0b5f34c7b159ebc219037501bf0126aa0ff5f989730873125", - "d37a17cbed096c117a95256fbe175c73575a1e219b27634488152457e381ebf4", - "0347b0f6775f2edd0b6f3204a1801551781174b073d41e98c3f43d21d604182e", - "7e5c5403e9f75106fffa83f1194fd64fac179c5b07512b91bdc61ff09762a6df", - "fa0cb4312f419dd8d3378c4faf95c395ccea92cddd9c79f71ea92f90a5d88af4", - "1042b5b487c6efc1eae3879631e769180a1fafb50c96b5c774934fbb9749b375", - "09668d2f938221884f345005653d102c60b439f516cc9a7b08ee3b3a5478a1b4", - "b473818e18b7c4a44d63913d896d719e4328c942c8432b7d17558b01cf2c1166", - "9fa3b20af88c38fd5b6e39704020323b1ef9c57d98a9ff94ade33608064a9c27", - "3acc8e1092abf2977c647c3d0eed1738bb07681d4d48f55bb332b1e1650c86d9", - "373cfc6f5f83a353d4470a8ff8f42b57b83d495f2bcf72f8130821876c3e58de", - "147117cf39957ae8c5abddd8abc98f0d9e3f23cb45bf317ac25ee6a54658a302", - "91f1cf4efe2b9a81d956e17a4db8b477703bc4c77836e08942587377b1b8fbed", - "8dc2d2fbf1776d7aa155dc3e9bbd213ccd88da4cb68dde37301510032536fcfe", - "f8429ef8291335ceb62641a6fba9b55ea2426e17a9c4c1d67c63fe29f12e13a4", - "5085c4ecb0840957b393b8cdca66824321cbcb446c9f59bdbf53ae0836d4d2e4", - "3391396d1ce2cb2271939c9f9e93ca1d6851e0c60d740c865e36389b123615db", - "9328c87c789a5914a2a05fe9e3b03a535a70f93f2f22bc97cc0a2e8643b62f1e", - "113afd0d960b30a8c863cced8e6c9982ca8553ee0b8f60d6b6795c0f2d8079e9", - "6a9c4e4827148bf1187b876f21e35b2dd71c983e97643c8ec237b0109ce146a2", - "d68fcb964d91255e4ab8e757106e93e54af26499076403f6ff2829c7127cac48", - "828fa2fbeb1ee27c7f2cd91e6f218d3d458640803e4aac343cbe1b31a1a9467c", - "e8cde48dc2b5dd6e92860517250a65bb02e8ab109575a1788592217f89ec379d", - "2646229240a11231915366c464c5c2426e623f26999f09b307143be0b55e6841", - "2b102c399e32f752c76591ccce56ecc47bb2a28ad59660720e8a211b65ed2a8b", - "da73eaec2a432b8c98cd2c9c037365f11e55cd6025dd854c7bf6e6e99f1b7126", - "020e897b6c6d89288df3abc4ce5a0d4de59d050eaf843d7a787f0c47b36007bd", - "d616ad78dab124f3b894f41c9c80b4098762d81f7f3044aa7f4fb2b799ae0bb7", - "318696eca931e0bbeaed28682052989b20c92c445b46e988f8a118c5aecb6737", - "9a1536ef474e7cd78302522009487a2385c9b6d1ce726077c0d9093adcb2229e", - "4f2ddfa6be6c797f7bd1022ac45d961064ac80f8cdb39e4eb065c087550d7778", - "b224ca830487845eb259095a810320d39826238dc574b4545d581ee8454ce010", - "7298395db0f3ba22549728e08aa706021e967e5bc9a25dba0a92cdf7657b18a7", - "323cd5f1b2b56f6357a65078d4d860585407310d42c91d032ea21ae0291297f5", - "ca65ab2fed7676c3b580e01c0c40ed0ee678f8837a89da49bb3bd75091b1da2e", - "5604d375966dd2a4262e38f433fa7e45499c9b497de043d0907ca5702b1a77ec", - "d8c29a104c65d40fffbfef1166a70030c54e625f6b98a110b1571e8e17cc62fa", - "da660d55491b607a76f0c5d4be416c77a04570134bd3b3bcf24702e88423dc70", - "a4bd09a384476c0063df20e2360e7af87aaa1252b45e2a2073f0685bcfd47223", - "e7dc45bee54fba9941a21f959c5249beda1b6220d4c717da4c630d243fdbbc85", - "914b091eae74d219025b4a70a59dee70b3991dbbc3500d2c76c2cdaba4822ad2", - "c7e325004f29c5a3af06d8f69f863c4444cb8c3f40c407348598f18bc32b9bc5", - "2a959fd364d8665d6e4bf7185ce1278c060920d061d1ce94381539a09489dbf7", - "6a77877a73c3368a90494700084a42ea09ce0c666878bbb46a98b73afee1b3e8", - "f25d7ef7faa84d93e55e37099a0a9a448afaa104cead0644b0aeb749ab5af203", - "dbae6f530b9d72480ff60b66f03f7319cf4f991fef31d4ffb687f8e45e3584de", - "90d1847665fedc59a8a3bacca42a8f978b7243c9b6bbc4940012539c4526918d", - "fead30e42cff802d1cca223798e32be5641025a84a75853e012bd0bd136cbc1f", - "c5eaa4f7122e1ad151bfdd8529b62a7fdc7665b2e84930cfdcb2542c719777cb", - "9fcb836f50e14c7482490e9c851b6ad58be2c828fa25df02c1f2f54d7683cee5", - "1463b81b59d5999f4dba6cd375dfd9c5fe47b655c4810f504b5d9c12c8283d66", - "36283e4a08c7a2eb45e31424a23dd94be70e893c971fad292442a2c7ff9495a5", - "2baf307adcdc30da394423d4609e3c4ff37f52af8806b74245f8263b068d922d", - "c41a1af7ba35c7deb9ae500be4b206d6546170aa5dca8ec174f9f1bee86d3dd8", - "07ecfa23f13099455dd3294d0fff426186965037f5da4d1f99e05aa00614cdc9", - "ecdcee21ab1061f0399ce6f303130954433aade96b88a1026fb09954a944f027", - "babc8e1a808af3dabd794feccdebe15e6e14576fd02be587d39f77b743c520c5", - "982f09ad23a01eceac61ecc8eaf0cd38f3c70a4d904211669c954e0e69dda235", - "1720d64cb734e446669a40e3a714030f31c92097d00b1e5d40196437ba73204f", - "917a7aba3b8c910711ff637746753527c2813e87e7f1e3ddf74ee9ea64f5f63e", - "42376792b8e2a59d7aaf80fc100501d115f41edf9bb8f10f3065f0152530d92c", - "9ce56e058d8241c80413dc0909516465be4a44689fd65446c2c6b54ff6e80acf", - "c88c1ca9bfd7cdbe1ad74fb3bb1285450be72da83d0740fab417762a0c6fb3e0", - "5c154afcdf62decd25c0238045d64d3725d206c9087a53d7cfb08e7b8d415729", - "23b1e37db42b3b7bd51ef9dfb79d799b5a582e2159782dc5b6665b8fffec378a", - "4122ada31c7d66370ac69c685f48ad3941b2019572e072b00c843f90032d146d", - "9b05e544f867e81c4dc9b3d0c447e5179632dfb41c05c18b971744f30cb1509c", - "2c5fa170e045b5e859f34b23c054d6e5afbd059e2eb81f384808444add852dbe", - "13c966a067c878e7bc7689e5154d427c9cb3ac8d2c82f1cab438235580e7da3d", - "19032d860b0ef1cc8fbc7221385972975fd7b61dd35ca110b2d52dda0d40b64a", - "cb315cefee85d69b51de2100ff3f33629f3aa5c02108eb2a958f2f5e6cba94c0", - "21332dfcea58d66ba5707c33f8df62d2550c5a695a7bfc11f9ddeff5686ca0c0", - "7f0ff04150bad4184f8c8fab29be84d5d522f5eb2f4a58cc6f527de6308f23ae", - "a4b1ea52da0509f2e47fc9f32c4dfbebdbe55329d265f9284826c100c4380d69", - "18aeaba6c11f3fcaad7cac518bcab3b9c301f7b0503cc561c313b1e5e2169bf9", - "cb637cb3abd084716775b8dbf3dfb707db85a9dcd6a5fa3ea28cafc4aec1808b", - "a5ecafec3ca5f737a6c8e86da1312beec44964734ff0dadf1b7a30a1fd5aa6d2", - "78e0ff89ff726cdea63cf3246d7cecdb97965618b5c2c89a13a92d602f6617f7", - "d4a3948efd282b19131540a00eee82688abd027f61c3e5df4646818e10ab542e", - "aa04527c87477d9e1913ffebda888f97ed69c842f45a2ba4059c72a4b2818320", - "fa430465f2466cab3bbd8336e68e84a8a7035036cd12af9d8040a7cf5ec484e6", - "a9e2b8931373655ef63cae46e07d7a313f89cbdfdcad1c909addcd27f373ee41", - "eaca19c0f6236643f2985056814fa4c8566a1a948dfe60f0cc220f63e4287051", - "c6f778c63075b0ba8ccdbc0501e7303c8b33587180d3defffd851cfec9f690be", - "edbe77c22ac81dab8ec8266ebb50ea18981df43d96988a8eefceb196775d5563", - "e3601b19a712b62130fa10d96c3f6b0690e24335c5a1dc1b21f3b08a1b19187e", - "d025545c488b965eeaf35ea2e71aa2feec59eb43555e948d9d43b5742be9a1a4", - "00de12d09a62969ce47d5b049e008d54e23c3b40c6c87645143f566bfeeb3309", - "9a3d46cf1388d4f6d72fa646bd84bb07a21399802ea52a4196cd597b494e3bc1", - "738877082b276f762201d6c4a55f7ae359e5b9d1a608cbf5e8c48e0949d5d928", - "7c70b5da49f1046e410031d3de7c516c6ffafc64ec95841d7fca744455f40132", - "c81362b2c7b1b5e7e86296f85a23818cae8eadb88c738175c29cc1f0a69d94ea", - "e17175a0a61966bb1cb6d0b3d7cbc29e3e676d5838a377212968d6205a8f88d9", - "8e38c336dd1bcd59b81154ae67a1ac3664582430356a179dcab617aea4579173", - "8b30174129c373a7a083a1bd52fed57a2803d0aa3d811ea12bbc80ce2dc3275a", - "307b3b2dda7ce900823b81f5a572c01ddeecfc271847124d3752083ed1c04cb2", - "54905868a93f3729c7317ec43972d1abcbfb3bcaa8c973326da9dac9c0d341c4", - "258ce2e0ec4760cb5b4d3e15c2cd34aec5ffc4ccab3d5a7a8a04e8f3a4add262", - "b76796b7b51297d3f87ff7fc15d5cb1de7448a50a71795f200eed3299f5102b5", - "d175ff5a2fa65cf95fef72e9911dbd5d8ffcc0e724dd25bea7d5c992009195dd", - "e40922741230a9560b0e1af3d066aba8ee7aa03fe88a78213d62bfb5c6cdbe93", - "dd52a8d862e101e13ba11e05b3b8da9603a2a9278ac47f5a6fcf83aed18b9e8c", - "ba7fd9c12ae2b26961cdec9a3261b561085287b3262e0814c48554b4d45c24bf", - "8e28558808ffe54ccb4e6be126d4e20fd2eb2e0bce70af15d67a1b83000e8acd", - "504fc4952e39e26bb7c445f7fb2dfcb8bf771b3513c4aa61cc031ce9c9f2ab54", - "66dff52f6b09f45c824b56798a4ba1027bc9756b48313fb9510ce9aeaed7000a", - "e197a466ba4b685a15b15a14571536f1429d6a8a21200dbcfa03992b3b7a280c", - "a9a5161c289101c53f3aa74e13509f1be851485928227fb06dc0550c93b50ea5", - "5a2feb656f63a117c071477856ddb2373d464e1fe723936d8499c0452bbd4d4a", - "5591f2d5579afc1163008af4b60857347f60d7634e1ed87a94b2ef240d8183a0", - "387748ec1cde939792525e21b277df2c334d5c6040b50b12590c6a1309180534", - "25e8ba19f4dc7676fcf52167b48c76e1e80c40b8da1bd60237a13e65a6cd492e", - "10ebbd9fdf3ac8d282a65ce2f3ddece3a3149e6a953f21b27e9d1cff45174527", - "d48937c26c67cb4a195923d7a4362cf50c964be4950533d7dab767e9f800565b", - "a59b3297601408dcd2f19e2a6f6b0c62eb5dae15ef869930e35290086806eb23", - "b68f1d4413d3d98fda65f5792506a67ab24bd63cafa6f7f9712954b9fedb145c", - "ed9ce2f817c54686405c9eae85a89f513849fc395631dd7e2791e365357a697f", - "a823bd173db0f3137005a4e03d9f55d8b39a82456849a8de5991507df2cc692b", - "cb1b43e9f243eb6c1f3896e0a35c96487adf44f26aa81e14b51a7905e0970a60", - "1e7e6fed7bd2f2c12d622e9ce38d718bfa8e254604d380d89014de6bfa20335f", - "9902b4d87c1cd349aaa70aee110bf34ce58184b2d1ea741f393cfce7e403aef5", - "892db216dd879ece2e3a8fabd1baf42f721b609054494ec636ca7466f128ac3a", - "0bab46d3f745b0c3e59ba48fc613172d6d9b3cb0752a9f8bfc020a9a1d70c9e0", - "0ad18cbb49a0fd4254dc990d185bda431a8c828d4797bfcc64ccac4bbaefded6", - "3aa0a8ab16c930d87f58d0f43b89a14d047209b152d5bae5e023db5932d93962", - "82368421a23032b7561ec92f3d64e8f5ebf917923d48f37efebdab97ced14d75", - "a6d51ba2f4da35f536dcd6adb6b5234e962da342c6c315e01d6dea002e865f03", - "26db7f1b9bdb18769296e39c3ff3eaaa52032987a283921ced6d5925cfd36e9b", - "994fb97fc10c2bdd155eced5fb645e8649f11e5467e85ca9b6edd829957cf32c", - "cf637eb280002dcf93e88efc8880f29ca17839b6f2ac978ba48ae4d4fea816cf", - "37436bf5645ef2d0dddf23bc619985622756e590fd197ed83a059178e864edcf", - "4ac593bfe1773e0269f7cf46509b4efceee6d2c1cd9af89e8ccdaa84f54be7a5", - "fcae94bd5490afc9d654fe38a10632a24f15f22eff9c930cd3309660230fe258", - "84d39f894c8fe16976374c07b30674e05ba43c3cc0682bec26325aa0afa34b99", - "4ff0f78d2974e54b34931f379d2ec1dd0886035dd7f9017f3a8d62af51898b56", - "fd96df5f25a7be1bc777c35744e2dca956a7ff68d9722aeaaf7d762704ad7aec", - "4d4c8dc0048459661d5d390b4fb19525022d917440cfdc65386bf68c14f43a00", - "832273cd78997423b5b45fbb393d40126c253a8f7099b72c251934f366747af0", - "4677b61086ae2dee86e2211ddbc2d03e2a43bcc3e717093f3b1349a473eba87c", - "3a003c86c74c46503b632a33247b4a73f21bc3296bd49ed8357e1de9497b5deb", - "96d7c1a2766a904ae864fe82aaf2efe4500f3add904e0b6f5e9ee7aff23a3728", - "3cebb3500119d9fdce81132083678571ab929fa90e0a52639d75308110a57bed", - "807c442781f6a7ad9629043956ae079be04ffcad4a53b173c88d16e3af1ea324", - "3cef1365246efb174de02dfcdbd665b2b472a1cc52f58380d3a556e7fb36d5cf", - "b3158d26f297adf509bd210967654178fe35a3621e52ca8c2838eea2178a1078", - "d9d6021fba49c7561002525ff3f5d96ec449ed2abe04f6c07ead5f75e7d876b1", - "b56604bd061a6fb50eadeaffeb695aff8ccaa407fe31ac3c0e9cfb06737779d1", - "7522442c1f50e5f2733ad73ad90c3e4c4fecb4dff25c7584ca148d3e831b97eb", - "e86e0e962c7f06c728423e6ccd249f472791000868d5e609eb8a45ed7c79ed7f", - "b9d64fa18a6d5484503c50b6347cf5dc640c142f9568993c87bb66e97637dac6", - "94ada783b75b3b7fecefe8e5fbc899ec8bdc294f2f63ab8b8175de882a3cb5da", - "e7d8a266fbdd288c2a2f287886d732b6ac2891af47a7342dcca6e9574751d4d5", - "e77dfed6d07b18d60e47137803d42572bdf185ed6b5cb15c7b49e75c5d704e56", - "6323c8be5b2b93e278e48c07958849c305e3b4220439fb70a1b6d3f0b463e3f8", - "8616c0c10e9b3c312e874bb828128f97a37f70eff8463126ba44f0f4f90a869f", - "a33c492e1393a02ecdfba9c157a42f51f3d0bde322a3c687bef8ea84abb434dd", - "96cfc809ca13b9864c22262632928f3ef42415b191045e8a9c78e849591df498", - "cd2ddd0bf6165050fa7e2949b4354f29c8ea510b4f47d67bca0b509fbd1c9208", - "81191c21292ff7453cd7e18512e428d761fd845e183315620113685b341fa548", - "8a1b469e6187d446897bc6a54f973b778e0c006848e94893aee208bd1fe39b6e", - "95e852a7f6f68c7219958c3e83cb2ed6cade468946c433e28dbef259b5f8d7b6", - "0240c3bcf785342e64238bf4ac447788251dfcef393b846b871135b63c9c22e1", - "51fbb4a18d5c60b7d74e8b0b834e80e23e2ba6c1d7c2d0f93bbef6087d60ce4c", - "5c8adb8409fba5416d39d3baef06ab6c270dcfc09fba3a5b4cc87a1b1d8fa304", - "c42699ec99b198373fd77bfb783bf09bea6b12bb94329515c03b3c9de4e6a45c", - "9b0bde9b8ada9791b6459a858ea0acc668763bb18341c4375b2a931bd1e4b9e6", - "834e980a041e76e5055047e7a641e0c97e57104f0e576a7a25587edb0c08a17e", - "7e551ca88f2a4b9e25f715556776e3be9b20e831570a9c5702a444901aeb0728", - "6ecbd24e5774d20856d961b99abc7e94f1f72c8fa925cf6d0ecda649508d2e12", - "1d08ebab50ffcc0816b0291a56851c27134413b659debb0b80b0287be1007fb5", - "4e19a289192cb5d588c5c928dab0935addffeb47fa6cf07590f6e96f4d1515d1", - "ea676a4a77c81e82b81b1cc992cb9ca97e54ee5fa86e981418494e7144f5eae5", - "e6382a95c4bff5fe19035f5096cffbc350eb6b65b3363b8ade081b408ecd307a", - "6ec547b5f4c25419d2e00b2baa1fa05b54d1d1fc2859a881365341f496921849", - "443e5d6128243de6bffa6bcb9009075e073b1b4cfde008fb4943cef913629b0f", - "1d259ab22dcc0e507c278ae01a750e0c933ca245f773116dc29c66fb1d0fee89", - "2df95ab04e036d6ffe592b52b0654938e4fbc75973b2f14389db637e0bf43090", - "15ab990efb84f35b6f6ba9f964f04321e4658a860037c1a18fde99b6df7ec2e4", - "ed7a5813f76219c8565ae9f79b4c39299ba7f2128535d689d0392eef8ba5bb61", - "d04f091bfbf8f89ccb501beba172e1450707514800ddb68f717efad293812fc7", - "d3c03971df053213b071eee76e2e51bc3016f8cab4ba1529dab6e3bed4a7576e", - "b7dc74d1b7972ca57083a5c7d6967a831f0e1f030e2c410aa2616417e20af66b", - "a319e9af839a6448a1a0612e94f7fca7f74b05ff888f7afba72c7bb8f7196c6e", - "81e8e4386b6c430675e54284dba5fb8d86e7ae9995da0160444a5b5f301a4fa5", - "14d9a95b9f1226fcd529bf7e9e0e08c0aa7953743d23d1309f9124b16deda81f", - "7c383b57db35100fec27aaa0f3489f1b9d8cd6d39179daf9143f2bcb244e2444", - "c814e12a038b382d0b5f537b27471ab745e672020c5f15446a4d977c3a174d68", - "d95c80c93936fe675455f57624ff297036b0323ff576e7e40a88cc7f9e65a089", - "d8404bec3d73b2aee3f252f9241bb74fc76c42254377407bb5adc7905b380c06", - "7015c1d9df5f614aa629dc1dcfef1c285869c737235e8280fba83b823b31546a", - "e0d9488b6688d1b0c86e31219555332c3f6b7dd0b9b46ebfebe64bc9accb10cc", - "eb871ca26fc1fb1f1c03e0b9e97cebef7eba9e213a8e320b802e0d80ae85f1a5", - "3aa47bfb154dd4e070bfdaa45cc5ef9c34b530fa428336a7a1b350cd0626da90", - "4bb04f2aeda7deeb043bd616595493e9ba44d4729b0f58443ab687aba419239f", - "710c31f12987a1a7451b6a88fcf405b81d080595164cb0d5b6a574f70f0b438e", - "ccbaed6631201ef57de5d7c44edc01acb690c57073d34f099c93a3bd6c807331", - "5047929481d7522219d77bb1bdbdda07d0a927a856f805f9eec9cecd3907ae5e", - "3e83486024fb4c048fbbaf62c8f569df2385c515487db06fcc6fedd35cc6d1a0", - "17161ade67f1cc38a96c0cac2b0bfa41bdfc2d777349865bd68b2de2e1a466e1", - "5dc5fa6152175a8e3b3057eb89fa3373f43fff9112650e74bfab043c486b481a", - "d02c0710adb013ae2b25987f2a848b0e5da8db7df68d028988ab310ca9b74966", - "47a4c8a1e4601e89cf9835587a5c8276e8f81b26c8cf12352b2defedbf8d66c3", - "1860f9192ecb3d59ecbe13a0e729a642a867b2d60f91ede8583a445bc9a329ec", - "99ed2bd0b216c21949b4646d52c0375325502a67c486b40273a85a06d345e000", - "e59b47580b3bc8525ae6b81f366a8f912d1f80d9b166c30e736c4e53d2ad9eb2", - "25b85ae37eacb40ea9f2cf0d2b85000c710a8533bd7d604f5f4a47d1866bc8c7", - "b74a2652ad6dd8fde0d29e2d92afed6a1ee5fcf47e3d8f033b17cb863f428128", - "02e58004a986e48f0db56cf684041c65115220a5afdc8dbb3e463aff27343f77", - "1d5905fe7c646c6f5f4b65909196390d9dfd7f23e16b1c83cf835fb1b06a3fe4", - "9a502bb13b72b2c5591baa7e0e16d9aadaa6c6d18053845f2e385e1bc413cfa1", - "bbb51e1cd5aaa91ec23b95fb6c32df2a812058f3ef7821ef646ea2540ffebca3", - "e426c480018bd9b9c118735e0f8bf4f9d4de907e66a0c13ff05fc39c0dd6d6e2", - "fda937c2d78080912ba51a4105568b017e93c3baace1f6cc42eae8a911cf9d9b", - "cbd8db3a6d39e06897d7536d0c048daa7af98cc3cd69fc5025476aedf287a7ae", - "8616ae19abc6302c5da1e021fe1c751f2c31539012cbc811ed63789e0c32d108", - "9124c54c49dfb59bc7e1c06a0c126d123670c616080bcad4ecade4f086434784", - "bd0703d1231ba7603705a8545a1d1d4049ca22ef97db07eb53dfb8b0d5685931", - "b5367afd01471d7004cd2e0b888b228c1457e12e9b5f4f7a93c1138623db789f", - "8a85e676d7d8d24ec41f16fe7c6bd95975d3a329124b1dd4fb235b803aae9b54", - "99408b0fd786ceafd72396bf2fe8a0a26af035fd6cf64ce8d0fa4bdebca5c22a", - "46e9de0b4e60677fd45232adddba937bb0652c43d36547684ae26d79a1c1c543", - "6356da3f5ad575ee69cb78008c7d5ee44e58f740ae1d5a87ca439e908a2645e3", - "6866f541c5426fd56a248e975703e4e8a6fd07d30f9eca69e8d7ffc56ff09fff", - "b55d03aa5de48cc1044c759fc83a34d908b1f0c77283b0d794c482b44d3bb01d", - "de5594797cee9855cbb4cae24eeaccf8a1bb5d364a5df6a849ae9cba27b4861b", - "bf0a6cdc0615e320b4d4caf6e65f753d5abae4a1a0fd058f54f0b34d64109821", - "40e2ceb35b67fdc59a2d502374dc3d0b9d3ecc77ff5be290926928edf8aab7c1", - "d5ebdbb309801bfcc3562a536bd8c8a40ad3107e3df78139892889f80715b06d", - "d3a20c135556bd53ab6bafc3900f5adedfa119fff570250f62b1fc2036b8916f", - "bdcc24e68b999bd4785f22e9b98747c8daf9e676483fd9f096eb7a7e715be651", - "7540c4b39ce939d4320a7cf86335283d802ca99503275618841af6b83a032fa0", - "fd41b77871a3b0abcb32f20a8c408c35597011df22ded375a8d3d8b9a368d66e", - "2eb97801beb9e0d7d88db9ce7b5a395f5c385a846786be4f3fc9db65f2ebaf6f", - "ee4f0133ae037043aedca6fae3a94491c5f83b88ec56013a404380a747ed290f", - "7699574665c791efedeafa1654e158b70cc2abe660853a2c6b057b2af40315ad", - "0845083255bf0f15551977711b34e59ba1372b437e73f47a990e1cc4d60568fc", - "0d19d5421ceba3cf7a8f60d2be4ff925ab97da3416f1fdc7aebfef1529121c97", - "e2347958f9c2f38d40d635fd80a6059d87da3e4e50bbecd00e11b1600158b495", - "93e3744ef61548f05085fe1b015bd8a4a698de4b6fcb418b01b052fd391b89df", - "c39ca98a31d5e514baef695f6a437794199b8d79fe5f5be6c46cdbd071b3c482", - "61bf0094da5c29cb9a7edc3e07410e8ded2b1f3851d96be59620ff8506f7e6f0", - "b81d18bf28473c1b04e57a1447074baee6949337b07d2ba6b25fd600d6973618", - "4484958a4ae90ba56e747698c6011b2479addc026ca0b2173ec954c735f6e4f7", - "8587cd7e34d17e8cba6220c1f398b5319cbdb3065a927b90a4bc5d6d824ca450", - "b5dae2f587bddeddbb488180f79d72d9c78291cfa4a082f498f18ae8888a29e4", - "8507d939b6a05906a2b9d228228209472dbec9946a8b520c75b0718b0dafe6de", - "afd6975bc91a16a29281e80598a10a7af7bd9ccab77f9967c1da3482a85a32e1", - "d25d67d9fb28358e8b237219c95b18d429a1a2eaa127e9917bd1a2cd27b820ae", - "761084be15cdd08d345c5024dd1a483b3f9c961022bb6da3048cb3c84b713a22", - "3e01da3566947f5f3745ee8b4304aa51b23eceb0296c0b57d112901ffcac8357", - "0ee53e36e0b6288d682330ebfc5253e9ab169d5849b42275cad114cc1dc5579c", - "0aacc2dec2cdd1009bd0daf2bf2cc1e0c7a6ed7158858bbc7a38b3a2e49f7229", - "97021fd92477686d4568d161b6c3f5b6309bad12073e7abc8886a37d3e3500aa", - "576891c81482ba8df14adfdaa8a2fef2bbfb0a953787e092e5f47bfb686fe1cc", - "87a9ff3892985e29cefccbed0d203a71c1ff1072b529caaf26e8a2814fff4d15", - "59cac23a68563cf298308975bffadb3fdc9ea34148cc6ead926aef82881b184d", - "a4a4fc6c8e7819102fbe916e42429496587669efa6367937977fc0b8c3ada01d", - "254b2f6163c0cd8a66179e063a8f2a9a16f52b1cd0409eab69ffa5bf249a5002", - "23955482c03624349c6b7df1481e00ea9e4fc237f102d1c4359133219a89db59", - "27eaa7640e97c44cc71917ea121a70978bb8f85e4f7172a9ab20b74f829fb118", - "499a585b350bce40a1dd4b7a9370bb8e9b58a129c4d7e9c1d8ad0441e2f29114", - "9cce2a3e2e207faec19f61078705eb25525f417eef268342aefdf6917785f8e6", - "a505db4849674035942786e93d880109cb253d16502fe40eeaca77f310417cb1", - "4b769930a2a3dde1a34812e6ac637494364968453625ef426c982a69bc661750", - "0e47e9b26b09417007483ab8d20b1f915fa726356ea54b5cc966e567a0dcbc28", - "c496bf6b518ed9b4f6fc42323fd109a31c6da2c9fb8410aeb17c537e569a0ff2", - "9d6d413fa6fea592ec2745b6d2b89797d7b92c36ae510b15c0c7235a9f2e5c99", - "b6ce30d8f466057265916d9fab1698ea2bf94725d4c23db73bc5ea501fd3d08c", - "c730ebee52c71d14fcaf519e73f4ddd1f328947481d39bdcb1c04870b56a9b60", - "68a3faa5f803e841ee4a3f9293882be829b20798cade3c1e733f7a2342569b73", - "a9dfba2f7378efb0efd41e4d5a020de3b3af1cd8d3f8a49cc92f2434127cf5f0", - "dae97c03bf4494d8d6a3e92fcd4afd0679cfb339b4594f930c6dc4213c73f3a0", - "0a4c2fe82f3e9197d218409092831517de586f899acb27a4307c1617786c8dec", - "9dccea1961366fb5fa1b567ce61e12c609fc9f1e09c4688d09d47edb8e106b5c", - "9ec393f82a6d01b14ee323f8c3c9e6e4ab8e6955c2d5e1e155d095ee91fbfa52", - "932cc5bb619f20a8fc9c03ec68c0c644d2c095f79ac8fb437a6a412bd794e079", - "fa0ce9952c9575da71caf03708e9cd8f8146433cc153353deec77d9e658aabda", - "fae84fcc0a19e4095c5a9ec3d8991b082f21b846c3979106dc867039c36ad896", - "bd5ef57a78a1f806dbb392f9388a82abacc94bce75216ed95853ef93cd79aefa", - "188801aa556da8080fbfc06630f75320e60082f67fd693aaca8528165cbe9742", - "90c49e4e9eae54d7258455577e9a76d8b377cc7cacc8aa894005e87d58820954", - "54fb20b94dd3d9b7f0dd264edfe941925e97d0254ba996fdcb61d49ddb48e5f8", - "22070933d0dfa04a81e7dabdbb61e9611a9f966dc2f206cdecb1658a326f4343", - "c78d125050788fa4334fe945188e57dd4bc28b2cd852ed869e787145de756695", - "f2f54216b7ab642d183512cac2f1ae55060bb251138e5a906ab0627f1ce9eded", - "85b8cb4d6e7da283475323847d60a45a3600f7730ffe58fb807e0910cd010a39", - "47dedbe26e299a01814adb31b0b959e7362f2caae0b60a65a47778ec3e0a7683", - "c4322a193ff5b99d2b2c56f1e6b8337c3c274122e3ff922654b9185b0fe756c6", - "71e9a6e1c33b4eb655cbe60e7107679f68489f7086410386b90c910e812790de", - "6b9bbc5e8ea554396509c58835deceed107268d0dda6c523f2f1abd6b48f869d", - "23dae8e0d601d38f31e0d4e8d5e60a2436c200a501ae8ef0c79ddbd483f1e56a", - "f8a66ace73941b48fa77f2bd998f26afee1d9a278a2a1ef4ff61a800dca14fca", - "f4f921f8e44f03fa2534a5e11dfbbc079565442859f614d8bab31e153514f130", - "84c8d29060c837220cbb760b156ccb29f33a326d73b489ab6980cce1cbc5a83c", - "05623a9842a4bb94d1f44e9b955bb2c4317793488b6bb00afe386e84291f9e1e", - "b69aa9683f6c0dfb9a5bcbf47d35c4fddb716cac9e93e9f8b997ce48c31a82ed", - "8401eb19afb2814e4c8105d6a1b01992386f0ccacdc306f0b3b2795ebada73ac", - "49822ccbc66ca4e7edc9430f516ec1a4f72c2b1e6a759cc938253624979698cf", - "9161a060c8a5fa1a78070269245200eacbc5273f0567dc2c074c96a6cee68425", - "f133a12503fc6863fdc183406931047a3db01aa90970f47419537c3a19a61b16", - "7c384066aa45964ad119d77ab6ac1e662d65aef62a18f6aa331fa7b55b078655", - "fd9c6fa74bcdc92d5703bc376436ee30717d0fd66382b341565f15959439f412", - "dbfef243e7649ffb9542a8dab6e4cd5a0d36643cc43f4fb9f0bf762b5ea4cc86", - "35f34d63eac4bd54110c19ffb322cd6c6c151f4ad151876ef15a6dd8b85f0da3", - "50fe7f72911ecf3507425b80a0f803606f71c516ff51b5d3f9286f3c792c0bab", - "92b0ebb8181ffeb3a074a09238eb67f42ad11052cfbaf2a833d86a1233ae3b1d", - "d22d0261b4b51fe3f92a992bdabfae14dd38e4f839267d70b6b59d1c715b996b", - "2575b1a424e53aa586a8ea60307cf39af15c77e619e371e35a89fb68aef89bfe", - "cf5f55d76b886504d0523e520890576f58f9309d10607f49dbe823d86adb76a6", - "c03f49bd48343d374cdfc099a04346f1760e6499ec7d31ff06bce691563bd3ed", - "668e285527d86a90f1ab6630d8697f052cd9f7be477eeaee8a8d13e653eecbff", - "2ca4d75a110e28cfa9181eb9154aea029cab9e7be367f85165d82bf99beabcd6", - "f17c85c339fce238097e88fdf7385a6274aa0486b43f85a6cc434f6ba3a07e54", - "537817bac158a7e72a6403c938ae3917319a10598c14ed17b4826c9bef28bd29", - "51390673d2478ea1424b262c83ae3dbbf37b3e3da3c0578586ae29f3e6ceba2a", - "e4df03e06a2299d81bc5d90ce56f525849a811b002617d4e350ec40b58b6fe06", - "2ea2cdeb7b169d5d6d1f890a408a17bd6f49c294768230904d7c3e8cacac7252", - "01d2ce0386a7427680d9940eafe73fa42aa209fb20bb569af1156f81a7517af9", - "511b880bd58fb89c5580afeb7c1de194e62e0f88dedbe9202dc456cb4eee50ca", - "a9999d3f91783e88058015a537f26d85cccc3960eea0d322b5d38ea46e1dbecb", - "ea18b2bd117209beb948d75bf876b9b2c05e569892f055cfa594ea5843e71304", - "79ddc51b9647cabbf9e850dd37986ff00c037b5814bba0eb333fc2b34666b3b1", - "4c07d673e7129a6ef0f6921160cc71d466ae317d7e1e3f6b586c28b9e4396eb1", - "3fa8667c7311d64561396290b68a887e92d0328c63bef2faee680f71a3089fc9", - "e1c5b69747aefa1a8b951695460b16f237a53d0f33e7a9aa44d87ed7c080e9f9", - "2a88c62a8221c8932d8b64b8e0ded58c58f49517dc47b1ec3ba1fc10e4e7956c", - "13d64904e9b685cc1efd181855e286164400830305892e843ef04ea225ad0e51", - "8bbd05f634b39059ecb673a42ada4f7a11c933d19ab1f536dcf3b165202e3a32", - "578ea15a0b9237418f5c05529913af2b71742574440a9497f1310257cb0d8f6d", - "3a308009cccf496514c7b82d7db97d7a178664206de62349a903d3572123d9f8", - "e68d2dccd5dbf73ecb2f6169933fdb6eb8cd84e24334c0d2f67fc6ff31c8bd51", - "346f965634d0e335c19265c519c42cdca88c9fb312510d02e59995e497487b63", - "1b5975253cdd43fb1be895e1909d35d9e6ccc2357b7273977603196a24d755f0", - "6f1b52a0632db448292d4c98e816a13909ac7d7d22a5b58463497b94fc9acb68", - "6cf6801f647154f72393a647e3c42135880f7d13dc05050e18d0325fecdf2a69", - "cf48af2346e3101f676c22b9fc5a0ebd0f6fd5acb899f09632e472887f5bc6a3", - "17caf99eb169360c121c217b1509119bdf6c8ed48f89dd7522c99159ef972d8a", - "0183d15ff734c52d84e3a70d7c6bb318dac580bd97b614fda3e4e58b766e3966", - "ffaf75cc27594a75e07428de556fc7fd6a6c5e816761ba163123fa1c6c4d18fc", - "c3d495240352b1c2d57abec54799df8aea9cde117b38febd2874c2e9cf13d1b3", - "4df3c2706ca04252ee3d010f052d68e9af9cff5e00e7d6f7d8b930059405c85f", - "c212694a0df5eead00244089f1006792d1ec91f97656b19c3808559f929fdd16", - "c49faba693322708944250af811f06270e79d2d9602d2dafa1795665753fafa3", - "0b9d1eeb534b56769d7b1fe0512de5ce3a488546d14e221fdde033c849b4a023", - "a6093f70eddba1e4c66425dabdb234000e7e970865856a7a85e4c555142f43ce", - "a3be9a609b7a7fbe124e3a47155b402938a8f06c4a3d21e25828d8cd5710323b", - "14759767745701f6d0c2a1fe7706c1bd6d9a13a427e48269103b91c5213d39d4", - "3fc6fd66d14e2203c4cbf18a28f2f41d82ce56a2d9465d820434d32884e79424", - "56620e6f5fa8938da90e54dfe2edf097c6f864e560778bba7a1d45eea0a0ac5e", - "ff3fab721c071571a2308d66d7d7b3c0f39e18e8f9761f3a97dd54f2a3e26543", - "2b57f3faf7fdc75ad35d179048655fa5873dba423da0b05689e426ab811fae33", - "73261d99389714f8c7fc736a3dea4aec5809c38f35768303a1be398b3db7ae94", - "d1961090d834ccc2ff120819a88f92c124fb185b214684a0dd97a9b1bcd5ad68", - "355e7683385a6414de6a30365053348a79a9ca4179dee7a5033f918cf4687dcf", - "ae43fcf086a2cc8abbfef4d099b778eec4fec83f950ec95a33d1bc19251bc0cf", - "6c170ae3e9551d2ab98dbf11efedde661e7f63b261c9d5ed14efab1c984cb437", - "988caa906b6380a119997c531cc55f6c6d374445b5dc53af5e2febf861609cce", - "f926b38ea5be55883f9c7bf47dabdfd16b82e97029fad06f132f5d32e76fe7b0", - "2e369338f0ceab6d20bafb27b35ddde7920c956ba5052868ad6263ef67352ccd", - "f0d3c606873e0795170078490f1b18f45509e9cc28c10ef0c86752ad9a422c13", - "e37d57a469091fcb624125e0425f4833f134fc35f71e1d787d4aeacf91b251fe", - "bee8dd9db24e3a01ae05effb78b331316bb4f32edfa3f4c688d2311d27e062e2", - "3eac6689741b691b479dcdf344506711f33378781d6c6e0f5df44f77dc368d20", - "39a609ec352b27ca3bbb2d3d4919f11490679a0b38ba62139165e0cb5c68f36f", - "9e058d3c6b9bcdbc2af359e47333bf0136da910a1fd0f48fbab83d4db02f2c08", - "f544b352ce7e85bfed761fd55af93efc0c7900becf20d1ec542cd22bdbbd42c1", - "4ca6789e99d9498cddc5a307fa84e769720f4f000da85b7a0aeeda221cc635c5", - "8354eee3c46e3d3844d94561406e6ee9fa984186288f6b98ecc2ff7517a67791", - "6f1793c8be05f83c79a9b33626ad0f045adbcb3c7dcd7207dec4b8d549324d8d", - "d3bee40b673bf03cbb74a1628ef52f0b933d9ce6bf666f6420c2137c355ff10d", - "9beda9a3570f17abe217b1c89af8b1a94dae697243e402a6681cbc9a747aeeb2", - "28f5f7a651781b5466bca54cce324bd2b05cd04b6fd0d19ef5116715935d2e22", - "e82b62afdcc7e35517025c7f4d0a0eb5647da4147541efffec5063640e471f05", - "3319f1ea5bf21ccc641be6782160104ce3a46063648b5bfb7a81a2060bac79b1", - "357dd6a243d104e76056081c47c263907b0d596e7f670292f50a9ceeb206d7e8", - "6990372bbcefad26695dc1d7f2514b62d2f48d7fe6ac23016cf589619c5d969e", - "bcd42a97e7393dc1f6de848b21841a11bae157bef82ee1f84f615203bd0cfc00", - "148f8e12cdcceabc0dc4a6c18f8318547a81482f188a792beca194d9eb9c7bf5", - "63676ab8644fcd00e6713fd8c905da1e00cbced5e6a0ee564309e1786e34f420", - "30bc3400472ce06bead793d9d2d9c9d3e6d11efc2e5da02441418ae1187effe8", - "30e1c3046a201a099e19057e6b50dce8b119a92e999bff3f054c276c4b7481d0", - "b60eae688b5df7c5426b28b14eff9194926e17d89e4e7b7a2e4efb1487f11724", - "6eb402ae1b0a8e2e400ee71980e11d058cdbbb9385f255af681d37f72f39daa3", - "4890809b2f172ccc25eceed7256c492739cc5d41b298b8bd4a25906fa64fa61a", - "14faf1b696208df1b302e79d8b1c45c4bf48ab77b7e91a1b71072c70fc2dcd0b", - "afe0e1bf76ff206353c3683dbb1306964357878fd1c4253481138e7f66a92985", - "4c99a59db78e1481599b1eafb3ac23e4be63f26637d8823c88a629f01a5cdef7", - "0e837ac0beda102853ba4d1a0e8dc4bbc2fd9625d7fba93cdd3bdf3209b5ed9d", - "85313671da38c3172787c17545d452608791b9a18eeed27d249f229a6fa74f96", - "1fc0e9834a0e73c282a01097e7f43489911f40aab8c5f2b635580d27a9ee2f12", - "7b77ab04ecf8187a22c1ff0d41ad7a9ba40f1fc23a00bba49ac3d815b8bfa6ee", - "ed39b126a1b7e259deb9c8bb4ad7b931da530591affaeb601abc3dfe85192868", - "494b38deda701e773d9e51dece90af4a8ca66bc41c3f09317eb19cf16494e1c3", - "729a2357d973a9bca1299445fb7d27a8a71792d76e0025a0e937120f567eb49a", - "d0658d91c5eb7ad8537b98670b11631682323a5bb761c4d6b7c6a334e24e2bf6", - "3be4e1bb1694e90f8238f37611243c72e2785233ae97ee9937b3ea3d8e2a16f9", - "9fe9d7edf7a1ee3460cd6758f187830adf8a668c097fe102f7c1cf7085bdb2ff", - "00bb8663ba7d9c73f6d899fcb23d4804bc6b4f05bd1060af8c601e20ad696a04", - "427cf2b570c3c18191de1706abeba0c7660597f575efe019d90dda2b2a9ecb7b", - "b730df0109900d0d9570e0c4fcaef1519fb025560fbc55237d85264ad44e7ec5", - "1735777aaed8af5bc37b9dbce873ea9de0b21c1edccfc95013ebc8d48c1c544a", - "d8849c0dfda5f4fdbd328d0270b0e5adddb6c715f2cd610e321f28d7f91e4c07", - "3a920b7b7f8b322c60813e6dbec9d2ca1c9fdd8bb68a55c8b51d60e6178e77ec", - "f9553f03a9e5618f1d597966b88f7a1756c730bf7467f5037c4e5b9ad21a18bf", - "9a4abd471d471b94855c18d05ec5915c1a8d346aed7e278cda1dbc6fc9ffe4c7", - "5659be476c9f3a07ad544eaa225ad204b2073fdee0ddb420902324a5e487f661", - "8d97d8f171c838bd55cbf029937fb204a038502470a2df119d8fb48980a50645", - "db9b18d631a057303d56d78b40ff2df0b6f756e3483662d7125c40bc0bcfc048", - "9eeca5b9fa93d44f0b02747d0ceaa8ae74c9dd2c1476e3b30252a9389a3e4763", - "fb5ea707544a829a28050bbfc6499d5b5516934b5f798e96a4f645dee3b576f0", - "f9c82b21262ccf3b7a873129d90d02abf75ddc0e22624271722ba07126c05868", - "7d83f91fea1401ddb8585b2091ea018d776e3c5ab9066c91f4565fcf5e90082d", - "f48d04f81a733469d22863af1a465cd3b667b205b99db7cc88d235b792c2f230", - "c674d188ba501830302ed4bb83c925465977408de4840f21fd68e142f2a47b35", - "f0aa7d42e6d3b83e65609ed08c15815cbe1d1b894bde403e440fc3c1149adea0", - "0ec10b52caf83d2c7068009a7fdf144b3c1676b3369cfe55af0b33893f6513f4", - "3a6c4a837f0d98b8e0315746930d9bad9a7a24549db1a855124e3b8acdbb24a8", - "ae1534d2087ffa25f394076986212480780a2a1e995537fa718fb4bf5e326e91", - "e415f565e4e39b7ad64f369ffa3b6da60cbf54eea1a9d5a532a82adce2ae31e9", - "66a0bc94cf9f2b150eeec71f74027d5f1c2423a287e00311d7fa1c107cbabc17", - "d9616ba39d8e3ae9bde1f01819873dbe7600e7691fd5651b9b518ce74a0d0ceb", - "69ed176d33fcb75a84d0db79be98ce6192d3be907e7c7944c635d66840705485", - "a57da6e4f02e65d427bdb0eb347ff1050d9f7585d3d916c2efe18ef0b9e51e66", - "53689d07aa19f27773a73a91d6201fb772d02b83af48feaa6ff4ad21a587e162", - "b82b2bb572f40eac4f73cfabc21fcdfe724f92fee9b880054cf37d885112accc", - "a73e7bf7a85c8c1061dd10cdb11e5cb6f6f415c62d0b8fa435bf35d748563b86", - "b7f43456b6163017a1cfcb9fc36c503cc17c42a1899fa715059fcf12e87b88a1", - "a969cc516c66d9949e3b197c28b06a116fce34ed98d17591f9cfb67a74e6ef68", - "ab34c06c136c5d1e9537d469ea9d8e588df7ed1b22ff02f0553a14c87a7591f4", - "a923b08f1b5bd4b1df44e9e0a3fd501d3c3344d426d83f919b49eecd3ba71c4c", - "123c06c184cd6299b0486b87c574b8544dd9053d336408538ad0ece1b6b68c8d", - "7ade7f1ed1022143b9138bf54862b4f679084348eeea582b3fa8e09e94ee18ba", - "a62b23ad01ff25e43445aacbc33402fb1a8ca0274c3a5d6f889e544741e5a46e", - "9c794ed6230bfe0d0477d6626ec6f22817d4d890bd5e1ecfe707ffd435e5c159", - "fcee401ea3a531f27bc5d2b8b875e6b9d5a0daecde5fffd30a0c4cbdc8961383", - "490ede881e602c489289c19a4a576634c0ef6eaff18c3e6bf6d20f9044b15e68", - "2e77c0b201a9c2fbcf91ff56784253a709240be292e3757faa72bcb2b9548a78", - "482ebc4607c3a0e989aac61ed1879806e1bdf62959307bb0b5f2a1fd76a742d1", - "444c8d82853292f9aea82fcf50727c594cb705727dbb72e75ccaf0b9e4e37f9f", - "f19a3bd5a91fe59345b8a9d6c2e29194e7400d8e6747ef8b914ec742018725dd", - "0424b5057b15a1e22206a388a0e7d46a478302e18e9f314a3c321a6cd7f6c57e", - "e960eeeb75f7765e7ada906a5c894d08f423930a21d98cf03c730f01dcf2b304", - "009d3296fd99235f4bbe97ac66edcf129a0c7ffd8f668857cadd7de8e5ec79fe", - "c1d0750d100758c7c17f8f4be2c4222e164a232c95a35525a89ab65ec76df17c", - "8e5e7896896eb4d60244b7a881115d44ffe6b40cbe18e45478acdc04e8544e18", - "0ad0ff2f197c54b9244986ea1ae19fe3fb763cdcdd3f3a593c2e4644696cbd3a", - "e1ef025a907019cd9956576bfeb224002a3b9a5220b086afffbb70c1894b7f7f", - "43987ed72b47b775da3d67fa2b0dbf2d76a6ad726c8dc475559358da8274490b", - "ae750e8051bbc1ad71502e0328b0ee69386c595d352052893f7f16c0ddf386b1", - "0f9717e009ba5354654cf61f471dc5f8526d161f9b9bc01cad102eefb4cb4ce0", - "47f82f71c4a4d7feee5e76e354ac70a2b12246e00d0b8f03d63c34683a0b7180", - "4c606a0e42951b1dd3e0a4570e9ad2e2418b8bd02ad8d53012dcd14df2331cda", - "da2d2a1324294422c50dfa3d8359532d19e386e844d6de6e91477fbae3f34e7c", - "d4642e39beb3362a7d15a25725e6426e5fe71699cfb4446ff64fa28d2b24b87b", - "0dc9ef922daa942004d56a76a2a14cbf2ebd46c24fb75233d7ba866091eead51", - "346bb373d5aa29529a189577df61acd376f86226c81a903256380010859baf00", - "0734a936a34c2d20600fc7ba7d5ad09bbaca16b38826f74cbcdf4f627ed54531", - "5a7cdde523f930eb48e3cc4a4204b6385fc709cfce2d49fc505f947b1d4587e2", - "6b905e8952806af5ece59fbef89dcef4a8bbb8f8685d350a295bfd34c42a256f", - "f9c1d38aaaecdc20c951f0a8488a1eb93052ee67bfa745cd6315ca151fb71fba", - "0e8f5d29315951a1318e1de4ba6ea189574e4cec6b8e00d0dad96756d149fb8a", - "a2b07a7c89133a2b84963cfed798502709230b76b53e1895a938f2e946fdd27f", - "891516e7eb54decd13b36e02fb92cce50e341676704b2a69111f9df6fd4c26e9", - "bcd57ef4ea68455596b70cf9b9b58805620c8563c8a16c660e6aeb78410bd2a7", - "0b0c20c476554d9afcf9698265ed14998e98926ddf212a61a116a0ab039606f0", - "465fd5f1b99fff834bb9cfce0a2e7426644e55aab1b28bfe0a47941ce8e3511c", - "8933e8224798ca4a350d1f56e20403b265bac8cdc3d05e168ca161c3012dde23", - "c660af7f21314b6cfc8d56679f8ff36c5f82c4eaa477ca68172dd6819e78553e", - "332badbb1b0027e7b7faf40b13e907f86386bafaa3bd3046298554211ad229be", - "41ccffb0d5bf2cec3d342a51f7acb81396aaeeee3da8a2c4e73f8c63ca605836", - "b3993cea19c8eb7e9273c41b1beabc99dbac8853b13f88033b65c67af4a620e3", - "3b08a5db386a31efec0e705c38283b681191fca29e57fa5d7c7a0a858cf6212d", - "05c9939a2b513d1fb5acfeb962dc95f0b15fc357240cb5b7930a778a0f04b612", - "8674ddf50ab5ebbb4d10705de801ab2f8d2dfe04bbdd442e9ad2bc1bb5e68f17", - "019db6f021cbf8b98faca3ebf52b16ec1e8e4ee44ce263635c1e08ffcd1fbd32", - "ee2077ebaaa8f7ae1c439f7736c3e8f01e625b5911a8700a72874211c3d58d24", - "11b1083e4f8e3987f34d1ead2c8b4f70d29b9c7c56d556bc1bb5a7b30c457595", - "4e881fd05dbff4c4e4b7d940bbbab5de0be2d8de445d8eb51daf1cb5920e108a", - "0f539d585bf098f0fdc61c57e70f12f3b1aeffe6eb13ddc9cba175f25882fc83", - "22728ed8a9fa66ae29e8212b09d244733e977aa1fcacb2b9541abd832ed0268e", - "69e1386ba3d7cc328cc1c22c67cbb37484c8f023f2a32ae3982c7527db70c682", - "4b150a7e8cccc6d4ba8c75e9a357acfddc8266482a0a7acbe5a6b58947c261a1", - "78008ab4a634cb521d75aa4d86cc8d1cf51b7dc3a98c24529cec4399fe7de2b5", - "78fe119004083960de1fc545ec65696686d5e35e5f645d55c58a8c7cad91bddc", - "b50321c515562d52fcb76e22f68fb1e3e4525396066e767adb9ab7b36fa7010c", - "0036b052cd82a310266c22897ce397be19175811b7690b5335aefb76575f74af", - "3d8c5833fd83a30687fbcece0a2b8d0695bee21be4cde2c4153116d3329def8b", - "786b8d01e7e5693f00074a81fae2a797a1a41cec15af7e43753d7da841253ff2", - "a7ff7a475fd4423f8fdf08c9ee8cc70492c815e199625728e3cfb1aae63a6e45", - "8a48862125a9d4a6c751acde0eccc6469f157d6f67018ad0a730c3d267a1d17b", - "dc0343b42abe967711a35bfb5902d30188e975a581c4233c1855140920984368", - "dd133df27118a836a17aadfda293e31867e7b3e3bcae7950ee57ec90ff17cea7", - "d87b6d85a476385c2bf8a1fe2e1f7c695ce4b11cab63d89843d71ac82a918a49", - "33528d5687d5552f9776cad8dc91cdd2fe327a2a7cdf62b6c291a5607de3ac1e", - "264bfcc79723d84b4ec59245c74ef11e13e772dba80cba39134ab87683c833b3", - "1207607c581503ad6c6ca194d8ed3a9546b7af0d3e213c5ebf1b574381dfd89e", - "d4cec3680cd17f25a37ddb29df135dfb1dfd54e5689c5e1eb4b23ec00cfef1b1", - "2d17a340ce66f879753d70933b401612ff45eac8d531d56c4e44ae8b685bd94d", - "f7fec6cf9aa04938374dd68871e86e524e66d11f10a81f69b44abe23b1d86378", - "719540d1a286fcf13cdc4d3b3819c06f7e4b0f67d8060d020e189cfc27497d95", - "e70d3d784e1a583d1e00bd4e56c9bbadf473988ea1018f8276f66d9217bf0929", - "bc51dbee4fa38f9fe5ba0bd457101c43912d570e3e95e8a34bfff63fa7eb69bb", - "1fb0055a1b12e881bfb675e542b7269e81d25002a3b564ea1a2ac1041f03d897", - "859197a6997371ec112283dec7d0394f59c8f26564ba3d880a059463c7206c9d", - "c834f12c82deac21e15b7a4ebf0e5918340b16cdc223cf95d48d50da34cf0a74", - "6436037dc6bbda506a531b24225fc5a7f6bffa808f5140a9004b2bdc0ea709ab", - "30669b7f46e041e43cda9720e1cf89f0dc2f3885c5f23c7ecca96394612a8604", - "31f0dab7c16f34ac045aaa49765a471b0392d3728a7bd5b81c7fb37195186478", - "043df3f312a40711f5e0514eb5534df4ca7465ed7f60893d8b233e369009deb5", - "c8652c397d205fb28efce2e967a10d97556558d15a617fbd8750fa14b510b94c", - "47f0d3b16f84b774235921233a717b9fca499561f0ee288b34f0dae68ede0b20", - "a06efda4d1d1c4baf8f6f26d4c88f3630810e45b182d5f8bd0a0bb1bf0659c61", - "0c2abf50c467b967ac322b11a41ce424107c0ec2885f7f658a1c465db51c5345", - "808346feef85484d5f00e1ce72c0543681440f09e9da33a5ae062310d58e194a", - "b492fcd4ba7bf8751c4570c6ab157bf0b043c39b297e8e917f865a6092f8c954", - "bf6a54dac05ad9476f7bf3662b96b76d4b8528add8c896cdedf8385a4f981369", - "6a352faf8d76bc4f826b5e897b4fc91cee888caa2fb66731b70267d30e828537", - "d5900f9bde66b9c0f26a82e0914c60bbb0a61f5160cf7eb75c7407d8e17737f4", - "93616ac15febaebc3f7756a3e03c5c23b53f86c576073aa12c6c90a87855b380", - "ae4cc58dba3d4f6251e3d97e4874d45bf93b74be84f57d2b957788382f6a7f8f", - "9f9647fa5aa2e7b306a2e2ac3603f71b38a3dd22e15fa1587386c74bf894b628", - "36b0cc4d3f6b098f2de8d386b1516abe97756115b77add6998657e470f0cae61", - "d8932c1348b6279f70d424e0aa22d9090d9cbb01d974d7079e95955fe4096c85", - "c93aed529b79f831fe7f625e6f4bc5f9623f9c9afe60e7904c3352d81c7b3268", - "c34f468c503183a9e51756282ecb5c55ba3b73230fea2d9b184859c3b787a813", - "86996552bc66d4d2193040039e09ffbfb68d8e809039036c93f3b8f13f5319c0", - "d1c5c8a6bb2505d029bbd7b526ad35726f42403c5d128e87d79d88166b96cd77", - "a8f7618787a2294a53c75cab067c801d00a5c60d1122159418097802be69c060", - "f51a78f082fd5dd893e56388f1604c9dd1a7c3e020322c9cad301682d5b8f811", - "afb9e6bc485394474358896cbd2e09c5f4f831fe438abfb1cd84c0ed3f1f0aea", - "38704b97a8c30e34b2d2906229611eae5c92a64d86f0308d5979e13f5672b9a3", - "fbbd02da355427b0ed1f43afcff919dc86021171a33e0478c1a94c1e5c9d2d62", - "b5ab4e64ffb1308fa48feab3c8631dc19b9864f0a902ce9c742369ceb47d94d3", - "3de281a0b7a3ce8dcdefd7b9fa971451de69917ca6a85c0d532fc278077eb875", - "325d57e41bf1278a08db82abdc1256f558256a6c89c0b59c3831b7f49085b9c1", - "a1e17857a754ed70301b4349e88542d8a491dcd321d7bfae6d6a910dcb484b6b", - "36e57d73f6ddffc9ac0dee7b2004ebad8377cd58679dd40449409f384d41a889", - "a6b3cf3d8b93a8e8fdd6f0fce791f7d18477a018aa00489fee2f35946f3817ef", - "c2a3676eec75862278f4497bce36a989c3255301fa29ba94c5374a787c57620a", - "072efabbde7570bbd9be5950c70f18a0d9cdac8a6b77868a69651c5692cbfa00", - "f39d25262b215503e1ae84ee7ee143f3ed916cfca06a5cfc1883e69442eeaef3", - "a4d3213ae7d18287dfb3baab6f093539b16ee30ee26da3e6dee3997ec1c09b81", - "ed58419a3ac47f8c3bf09ca4184ced6b52afbfe6c66335a78b4cde4cc33759e7", - "9920e135ef36ef12d854e48e09aa17d2d6add030784e5374bb71840039fa089f", - "5d031b8487341e54b06fa552fa2f8e235842057fdf1ad4e11df5b3cb9e83a74d", - "a825299ea0e90d6585d861f1acb3fac597f4e8f6f6ebfe99b0599891c42ce54e", - "a89602e48b0501025fcb9589dd6ce2f59c6547e1eedd9ae762296358b40b560c", - "05a4714bc609eb9b9211746a3d3a21209b1a478b0575f9137227e43e0cb502b2", - "868ba8f408e7b3a7564f08e70dd10c3c6f4d85ca012a3cc19b2cb6a19e2d0144", - "bdc07cd5e215bbe57f0790c6ea50c5df61e7545d89deb848c7a8bf9229ee8b40", - "9f647f67060b47703fd63291027a19f3ed4bfec6928b93472f1252e652120f8d", - "ba66dcb145ca50700e22fc1ff019a9fed40a50d96e38b261948e5471cc4b2b15", - "1b1da30abcc13586da291735ed59a92b58963b0bd91f9fa9a23e189f4a1088d4", - "ac845dfb0415fee85c30eebf1082a408856c9ffea5d0c1f3136ab9e890173bec", - "1ed40c965919d2e787078185be02cf3cc5115790b8915d81e4d70fe757e8e0ea", - "38d2a492f44d88e83973cd8431e92a1aa398c7b9c9c3b70761881f4f4a1c4d99", - "680ba3057657ce507711f27189c445c9e3024c8af3ad8291ae32beaf91c532b2", - "5880b8efb1f2b4187b18bf13598daad44aa754bb085e9fecf05575ccd8060679", - "f35fe52799afa7c7a4bca3f7253e2008833a935928d0d6c37ba3712870e950bb", - "ff69b3eca025d41585b4bb63651e6c0ad7d42ce52f1d1ca6d970d9eacb5b6a94", - "3045ae43d663b8cdec44595dc89b213abdcfe861ea90e86ef3e058373560be56", - "5ef858c053ce170b6f6c46a8db091f1cbf5b9334d73f3fde625e088d88db236f", - "81dd1e98245e7e983e611c9857d1d070157d9cc67a5bd0bc8f9750077b92e5e0", - "cb666c71160a1a9da18071eb4b0e198dae40f8da4b0dfb70c126cd34fe0aaaa5", - "f2b93b67dfceb75eb3ae6acc2d5216e5146bc1ae4a635edbcc94ab5160ea1beb", - "c64c3d8736af177b02a6ff1014bb38ecdd8c72863ece0d5d0888395419840b82", - "0853af77eec5a5a1af633e88f0d44292c0c3ab81d6225f95329fbff8eeaf12b5", - "bbbace21d303e73b2fee0a4cd3c7e7297d32002ba8740c313f658d646cd4b7b6", - "7db78ee2f5d1e0b88c001e949d988cf94980d16b6c88be886de637315f31f9f0", - "1d9275bb6d665748d02b4cc812350bf2cf24fff5e3f68ceb3cb27ce3034ae938", - "853ac34a8141320c5136f41f1ac651a4b01fbbbfee9547780dadbc45f8234c71", - "c893b7bc1e0736533a4ac5c8828f825d3f5fe780ae6e554884715bf22282cfee", - "7465296211cc16ab515e7ce759859ef0252cab182785c6f3fc6d32ed8e895c29", - "a8a73bd6aad8b95b0e94295d11a58266e4468b56ef9f6533a9a7f3548cba9e8b", - "f884be0d73e82fdc75db084aaebaa82e98bde4d3f1769a37e29d867385c1c3a9", - "1a7802b003a4c669dc2bc1a38b43f4e5e2ed435b4f0ed86bb945d7ced02c027c", - "ed9e35727485026af7ac0e9cb44ab1b0626d84723016557d36a35d8fd43953b9", - "6dde6e0cc3376e95a89cbc4767d881bf6f547eafe12d0deccf130a64afce3962", - "489757aa365018af9af49a939f79757d66687e8f7174e2d53d780aa2a5642064", - "afb28fbae3dbbc34763a6ec18deafd19795a151ab6358eed4422159ae160fc77", - "8b13180a965c7a7cb02354b94ee160d7d2c6c1650d2cbc0d5d9c9627c206ec84", - "8525be84acc7403ca076bc2cb6384b78fc93487563e74940e45cb3546db15810", - "8945734fa188609e89ccb9976af762b40e9541b494c960d97a036a5a6b17bc4e", - "000d25e961ab0be27e6f226c236d9ab4cf7bf40145ca814be08ead6fc1f56cd3", - "daa4a7fcf618e88d031fdd3f897fe600e559498a2abd585547dac4194a80980a", - "66eeb41ca9af8070f54719313d2fd69211b5850161b5fbf6f5097a2904f8eff5", - "6b85641a19e9d0258b32bb261f96011ce03024eb34486852694aca62f9360898", - "e2a301a9368b334f3eb4163221922c4f130e581bc1ce59e559e8fb47d7fb2e27", - "b656a87d41afd71a4672c40d1621add3acf3048b00128b2ac20c43d67ac2d773", - "9632916e1b5f4558351126a43e803bbf5cbb751c0dd8523fb500ed2b0a76135f", - "ee586421a73c900cbc91305e8aa61684354b1004a3f03a38060d38779b766cf3", - "a7fe36a799ce51b3efab3b5777922e7bd185f64cf85aebdf5ed50237373a4f30", - "584faa49b8b2e9bbf0e0032d8f25e98ae451c689b61adcd2a1a5f0eb89ca6672", - "b9bbf1a5a745d23ebb2e38f59e8e1c4b779758db7d878fe2e38e753cc4972154", - "427239eb6ce64415e67aec5e98c8dca71c80616b866d279a61147e3b108d71c6", - "ba55426ddf8307c70f79c29737734a6bf8d3867cbb9f4d5edddc75f2a82c6c6a", - "b7449cb4f9a586fc6c0a268ddbf5d592fea6bbe4f9d63e9fca4b6b7a1892d78c", - "348bc4d4cd5c66c4d516eb28a7bf4859a469c9b5f6a5dadf140004e8d4320949", - "468fb2b32a1888d41d3075150478f354dbdbc7775edb2baec269cdd234826c96", - "646789eba686df5ea2ad38c743e2959c3d7ad962fb4e13c7e1284f5bb59b8282", - "b49ee00c45c2c4281272c58216f6849a7467e43b997fe29b4ef32bc1311bed62", - "f02a4e9e075c65cfc248d36db342da146bb85edee0d3b84ca67da2a155cd853a", - "4ad8f27a4944eb54ffaefb1392bb87c65d245f09c9e552976ab63d77944c201a", - "98457efd491d0f9f448d6c80581e2fe5c773702f160fce15b090fbf4d0aaddb9", - "e815dd5abdf500c2840c34038a39153c19e7821083213702580b6d42d57665ee", - "be4c108240ab3682422115b63136fb84cf8cc6b66b701a17d522e64f68aad807", - "131e69f3ce0bdd3de342f94d516286d4b5935a8174299539d578a1b4844334dd", - "124b14fc478f05f5e628b372f13cb12c3bec2fc0bbce00595fc58e0499a8bbde", - "c7d8f59089a8c40f18452c3a3102d89d47cba632c7cb969bb81b331991a84cb0", - "4e2864d69a2e4a58abc3c219717a8c50e1d571667e893defac27c205730b83d9", - "765f3c349174ba89c18dbd86d4e4a4ff76a4f045af477dfcc51c5e58aee11f5b", - "f593498c52498cf19287351a59ef0f5e30ace8219066b09d7eacd64f53e84be7", - "6b5107c71959ac46d86615bd5678b232be37682d7329f20490cbb2bb8f7af502", - "c0be07f37e13e8a10772ed9b41a8405229802a598274a1acdc955611d8768ba9", - "c31490239a1ba0f97b8e7facac6db0d0f0646ee9f62cb22fc083a24eea4bfdad", - "da415621820f9648c680bd382a52fb8cdf4ebee21362f653a75d2fe1b2255917", - "efc9b70bc9be92b7ec08ce99a9cabb04787fae1a4782cb7972a80a284d8c4110", - "704dea005703963f254e7252419f395ea3cb3d425d074af613a6c9403b086e61", - "03069be7df1417d8864a3e46a93566aaf42f974e4200066959ba5c87d7b31712", - "b57a99e3c6b3a2fc96f8f99e49b082ad8d55ac519194ea24ff16bd9394bacffe", - "5a23802976ccfc2c63879b7f8c82a07fecf4852fde8b02f772b86395390df1aa", - "1cdf2833bd985b9dc8972cd9f3c18179ac52e6e0a742a6bf875df527ceabaeb5", - "5268256a0626726cf9ea486670b915cb01dba411217d2eebe94613ffc4378cef", - "d5bf08c61a6c13822ad6e9ed498e55d6b2363f04da08e0d6e7220bd62e9b7ea4", - "d6b74fd49ed7c36dd0c04c4ffb2cc44a8aac7b37cc23230d25bfde18c790cd22", - "121ea845327ef32f574febc167d38a122c647e4545dd8d091c83f309301a5288", - "fcdb384c95513c79c9199ecfa844b29ba43c6f2ee9bc74aa0829da47c8f095c0", - "f1edb532a30ab246735a2d813f6b27aed723627612102ea6eccdbcc6e5ed714a", - "3616d96b8c7a8d96f800ed95fa42361f36560c14e10ccf8ffe6fe12c251b897e", - "d0864ba28f4fda74ccb7dbfa9b09b082515ed9e09eb12c939e9ee20d7ab88def", - "821114d016cba864110517a5481550bd44040a352bca97cb39e65b0faa598881", - "ed89013dc6f5fc339652b63995c313484d3b6d77aac1d17b7ed6a0d40fca2727", - "4f55fd75a4e267541ca2887eb3a60b819f51ee74cc53167e5299ca19c392525d", - "28453d176400b3a09f6e058fa173eee55e06355d0feaf890873b45e5ad7c2ba5", - "a515274ab4a8bd6b4920abce04770c1f1165ebdb784c10495fd017b9c9eccc42", - "69949038555738aad1732e0648a6abf74145add072f83f2657bf03d2fb6db02a", - "4f4ec67edf151477f2421316abb841479e1b5450b03882295088e81a7ecbbb43", - "34326b92c55f2563e74b962341987e2569d8177ee16e5f85682dc891b8517951", - "7ec24cbcb5d0d5fe2a8ae4ed02d36e119b17aa8d19a494de573faa2caa1ae94b", - "4a75ca2af26a47d033c6afbdd73f5eb80e69cff1675b2f0172269b073db053ae", - "17ef290e9e9325b1877f2e1a85231600203bc272a485f629ddb44542c6d1d6dc", - "7328aa4893a1c395037b5b6cd65b0779a5397ece53be266d88e07aedd9013390", - "35480a4b0774220abbd7868ad5d417681b1e68d55b58f673868b0c6169f78ea9", - "f4204ee5f0e2f54791804e1b80d5cc828180ff9c26bf347861453bfaf7cd489c", - "bcec56398daa9d25651ba4b0ccea617cf11be9dba64d3218d746e8a4f80b621a", - "1f7406e73a2e70754646d280e65d16a93c6fb10368512acfc83bd39470168720", - "a1be3c08a8dd1eabf6e375673ce8c4477c86ddaac2d5081a1b427b949b825222", - "36fc952734ef0be98a60601f98ff49b7410d3a7ad43b5a176fd77b7ceb4a6900", - "28106ad4bac69dd7664b0baeb73cc5076dfb46b9cd4df19a9db0be3c30ab25f5", - "3d85233c8354b64c4c7d97fab66ae790beb2f1343faac2a2b98f2f2788eee1c4", - "19fe10551b396e0b80b72c484d3c599abd5fc30d702789c239adc6c261fa8b72", - "ba7e4b4d6a2a7817a1988fd655a9415b2ef27d65e6b4d2062623d4446f52cec7", - "fa72435c996b9847295571dda7e31e2c474dfa5164e7357ee9ee2d12ac767fec", - "e76a82253b424bae4d93415936fad8780653066b356fcf3a4ec3f18ffd823acc", - "5940f034c411a46d151e8a967449f33383c4fda1b45b230845064d14f31a2f94", - "0ef827e2561a5460089a1c24ade5abf53ef216ef70171001cbe6508585165303", - "e32954e527696dcbf50f52785152398518eb77172b9423f7a8e708803263559d", - "2216b0bf8e89417e538425b5334e23ea9db5631199a6ee4ca232cd7aba1cad05", - "d8a86f81960509928f4f5588707b97d7abd2a6e4d48396e4cf6d69903e715f0f", - "7b2d723e504de444b34a176cb6a92c8d1848eef52e47db73177759cdba2e5e46", - "0cc3e28d78304f40982ca36a672d1df859f7d4382419418f8fca6dcdff9dc87d", - "a8b10338be7bf7502167be3d475f33478e78ddce2857db60f196c4e51987f158", - "5c29c9c7ca3a5c8c9e59d90be02bc8e165d209e64421b9397d4080d1d8299bf5", - "26fc3dfc22257cad9dd40e321b7740299f9a3aac7cc6aae9b1d0e44285c6f80b", - "2770c03d704328d322e87a30def750acc1d96ca9580ab25ed77d9dde16d682c7", - "551087325ebbade7d40267e6e190d265024d24d120668e05aef86efac483d870", - "5144d206a0a6739850128c77467b7db5def24a0829574d10327a702098c9e7c8", - "90ed5667f53fa59cd1be063fe23cb9a2f556d0970dcc7981f337da54c272d468", - "2593917bd8af0db05db7deba9e2a7c13152d3587ffeb5f2b3dac0d7f052cd00a", - "105c140aadc976ff0bd8a24d47544c46403da0abb4d89116083797a4e6a13e52", - "fce4e65054df94247c8cfa0e969b5ec76a75e1bcd8c4029dc9928132ce2501de", - "86d4874aa41cfc69b9ab0acafa0d6bb4252562d5e1ec3ca4a8f3cd5dbd13c0fc", - "c55cdf73075023887403ef08772bae15b87667afacf3e46ac1ad91f41fc77ff9", - "a229da043ee5d58c8d05d992a1bac9b411c50593e2fd55d2729badd90274c251", - "7155decfbe117448661b65035a5411d825f71939a4d9b64e58feb318f58561a1", - "12768a4b83a2fd8da30d698d334d4c4a49d23384809f2f0aa12dfb8b044e6adc", - "ca7d560e930aef1c2a4612f8565de2fdd1b0bd4448b8407ac7508cb5cba1b8d5", - "4422378b6eacc9e7f14305f6320f88288d37c642af586bdb530424bbaa3997f0", - "41a8d513b37323fe7a34920d91d7a4a444df1516dc00c3c2a56714c741e8b092", - "64298f90a0a422af96e64619e7f1ceeabb9af5db664281856f5596af8341d3db", - "996c4c063241bd02c27b714f45d8e5f4ef6615dd7ca6de900240f3d4f139038a", - "e64afdb42afe929306b657024e59fdf030fb585f083265537486de1332f2b09c", - "b8ce1d013666b850b16a96961486065921dfb35828f4f208d864505ce1573d17", - "8b6c7713e7076417f26866639f6f778aee816d36ef37f25d456f0dc77968cd86", - "b60c737258262e58541bb9326f7fb442a4b3ebd40361d6664666e95365717e96", - "85277469c3b11ffde8a1855b017cd12b3b6b8d34bab893c38493014e55852bc5", - "16c3219a344611d3b270c8442638c31188cbf42dd068519b05b852c65f65d87e", - "02beca7f06e83b2324e9c418174cc3e975052514e0df45a791c9115e060a79ef", - "2714e24d0f561b2e6fc5870fd83db3bba0e6b1f0e290c0e50b2c13976fcbb4a6", - "d3dfb1de4ad0f03fb9f5ca5891fbe2d3fcabda5c19a00f2c2867870a5e2e1d1c", - "ca0d8fd9aebc23f3fd49ae2361d6b98fd6f5e6eb8ff5f64a649840b7e8106677", - "c8bd8da0a810f448bdc9f1549dbd880ac9930b9bf584fdae7319669487836d6d", - "e6bb4cf0ee4a173a02536f223842895c417d24a86910ba8b486557a0923d1a64", - "f1838d85c64c07890cab6babed68d560e770ccceea359377dde8b2464614c0a1", - "3a14c89e03891b37dc40b6a466656584b4f95d6ed54584362a4d9dd38e6da435", - "4f7b3990b04f18d933a1e4eba8ba30a2007ff58869cbb947a71c7667a699f704", - "344d0f6b483b0b7acc023f250478a4554b68e5a05b79dee3e605db6cacf7644c", - "9231b50e724f655601aa14b46afd5c6fff74d4a4db67aad0ed2ea11161e1d55e", - "ca61a0a8e8c86bbc966b49c792e1c565cd38be23738406a8133e0b8015f90877", - "dd11d4ae1d195df6cf637f64484a097e0e48692da5b01477ccccbfe0045f3a06", - "329abf7a2b8631221d7c034629dee4975a6c82c15129a3bdb18e4bef3f8c0f01", - "0e171d9a13ab8747a9812eb50a0233ee927af163bd59635b289e7307d7667689", - "a5a53129e00ed761feaf304fd34254084a469b5e628a75a6f75bfca2cb3e7a5e", - "003fe77d5ecf1c47e11d55c752956e64c77ec452bf48df997a9562431323ceae", - "4ee3dcc5873832eecba2bf0d9fb5a244a2f1a72085fdf8c070a53be9e000c067", - "a27971254303525f5678df418e917dde07a74326c34e627fcbf6dc76edf583eb", - "a5edbcc1e6f9d726afaf9737d634995badf362fbdc12ba2aa5e4947b19b78e36", - "e589c6f6415ed66ef15edf3f6097d3fa4cd85c41787853d84707831d4f263e9a", - "27e6126ac51a605f97bad049ffca75de5008fa64efc3b1ef05b4cecc50a3cf84", - "4bd9fd0177d3170f05ddd5c0d099f90e39b398b85192f1ac20e5261eb1887001", - "e7eac4265e7c8bdd679444bf00d3f1efbfd1668014a7760a20690b9629c440d9", - "1f543abe74f690ec29f2ccb822c6e6b4ebffba7de32110d45639977982a93021", - "fbaaec7eed6f45c367f5cf23f85fa1ad32ea4aa03abd2a646b800e564ff991a6", - "f19710582172f225875cd7d749debe481ff97e2f5428e92a1706781e289ce23c", - "9a64e6873cb6a3aff011b3e508b6be15772a1763cc92be3421ca015338a67edc", - "f31ceef3cce0f2b76eac6b65afa348a96058f246129e4fdf90f2da144195de85", - "ded5e6bb89601f2a6bf7ac09594347ebd67333d4616739df5ee41f28c619a2e0", - "2eedd7c072ebf7480fbcbdbdbaff9be29a4973c316305bba309b302305b8a887", - "4f5a7eac627735ed327687ab3b902c42e1684d8bb5845c08269706055aea40bf", - "b67631fd4edb815a3827904fe14fd8c0061128c29f696c8b7995c7d64369b7e8", - "f536f4574b4218635d15a36323ff5bca4adbe6e6fddce6cbc29ab3792ab1dc45", - "7ce8d92d477bcdfb33521dc55e058342dedc86daad818df849bf889793a1ca34", - "7aefbc1d01f66de89e35b69d93bb3e31e3a421f62620f7de9358588143044908", - "eaa9cc7992600cb61165500beb76da03c57d34b80c930aa95ea2385fbf4e4d1f", - "476506e74eb9469904238546a4d2a82a50efd2d5540755893e0c2764bdc58876", - "bb47b3b5ddc3f15adab7be6ffead3e37896e7ff46f2c5fd711e75d803d32d20c", - "983788ea1c8c52b1d1d12f60e5ac421b597e4ba4e0017b79542e2d01c275a19a", - "903fb4c977580866772bf036ca0d12c69d8538d32733042241025babac048796", - "f4b60a7659f4875605177a316488506b8995bdcce4ae4535b7254fc383a87a4e", - "ed56b364f1a16c64a101002877fe445fac3cd3dbacdcae3930ea7b3becf91a28", - "df68e7de9c01a0342f305a1dc032852fcc6244e363e73b47f10cda4f874d91e7", - "748cd247fa44e03753b7fc2e879a43ae037140efe30e88d04ab8ddd05ce5f8d6", - "1152d4ac4f610e55d7feb7c142831fece730b92fa48e11f12870fd47731cb288", - "87a08f7809d8d076b1046c0c2792ca1e06c80afe9a5cd895ff0f17b310e1f186", - "9753ca9452df00e37460a193a00381f120eeafdd79806781065989f24c9545aa", - "8585864c75174c2cc9bd66d913a2869ff40a24a282dee6ae11dcaabd6d16641d", - "a131959c8bdb9fe2859d66f1be07aa992ee3277dfd8b1ca6449fc0dd55e92ef0", - "d9702df8c8989395bb42647a05865f3125e3aa5b3aded337233bb312018ae420", - "039b81f4d5ddcb742e57f9158e3cbd114368d783c0f70562d5d5cfe203e8a222", - "ba6e026bae8dc5d85172ef01b8288f662db747331e5fe1e1dce6d9a7b172f908", - "2a00bed1e39a59ce464b04c867fd42138b0786aa45138197b46938806fa1c9d1", - "95c67226ad82491d0ef9ae0a50eb8c218a7f56021d8de18bb81cf3320a74e7f1", - "2cc26b660ef671d2e8c0632b5e9c3fb76759c61739238d0f84372133729e9200", - "39eddca046aff13eacbdd8793f61f222c98ca03ba3548336417c76ca4a82e0bb", - "899d9cfcc3758189d2a0bce0cb48a985d247dcd8641e7c66deb8f36273e711fe", - "8610d151f602f2a7fabb64c770552870f109382f83efae1b7b753dd1528c6268", - "986b245601a37e5d073606b14ef9b956c7fe4e993530100be1ef1bc0145e4723", - "80dd31c4376231d749183770c7e1f884212750f8ef08b05de4f009164398d20d", - "1bebbdb510b2646ea2a3e7122f61ebbe08b33a9cbbb1accafef6eed6bec5beb0", - "e12eb6e7902880828afafe91375af20e2e53c579df25866ce65e6ec3e53010a6", - "e712a48cd5061b4cff350f6acee87e985e22040d7060aadb9723b03e030ab6f2", - "1c4c649fa1195ef4de2459d5748f2fad9a48e211aece708a898fe4accabc9463", - "31803e4242791c115f8a0944f3ce0e26e2a1b72e2283e6bdb301bc0b393c8499", - "e2d504216bde868574305594dda577d91acb4b17769952174736f7b6297bf933", - "f89e1da85b52d9e94baa9abaeabc749f5134a8e13d2963f6bef0a9c69a9128a9", - "e48b4433aa578865c6857c1dcd7db75c76185e7d8f62feef98f90896b4927cca", - "7dc45292e950d29a43141e7d93cfdb1ae05c550583df03e4626c51a970279773", - "8707f727a7c5870bf682e4d2b7384343e4f866d7bd4220b66dcc10821fb8cc07", - "a9c445d4005adc96efa7f31e7435f153fd08936d008916fcf1ce6e28d8576407", - "641e0a9acb65b4b40596b7474b805977fdb1d063e94a830a38642d0e5926912b", - "7c8718fde13f61771e9e19bd14e3b228cdd3cd3f90b942377ba4c6f81bd0e680", - "b1ece087b1a766cc57732b20088e7c08b270c6b5eb95880f242617c05c38cb19", - "0a6539f2177a6c2e651b511cda1c55e482ef981159dc01737b06f9832512a47a", - "a08ccab987e31c4f08bdd9194a9637b8a14d8fde4a70a58f0bcbefe5c8511e7f", - "5f85c9b05fae177519487786a18ee6ae5913727231249e4564668115354e3ab9", - "fa5ceb6edc6d7ea1f4bdcbcd27193922a614179355170ca5b82fcc07e63a9564", - "fb3cc4fabfbe1c4781f774bc271cc8b9a33797b1bc77c7b6bd668687c3a75fb6", - "8375a066529a7dc1083e04ad97da438c764cedbfa9d91543003ae63dba1d76d4", - "c74206e6b0b8bf87cbfb17804a06fcfdf659b2341cc87ab2033e27f1824348ec", - "80caeef1085715fb6ef7898144fb94c275240e113d1388430bc1446330a64991", - "287e7f2178adab5f84d3fba6fda8f036230ed54a40021b6bb5534512e1711124", - "7f482b6214841b4f9ce32e27240f205d6915183e4f47d883d441650d21338ecc", - "81760ab0b4c950823543234dd18a3d29088837b5c0ed978f7c63d459ebdc6d2f", - "ab4214e82128166c0b7cf6a99208b3e19744315f1090c67ae713d952ed92259c", - "0ff229ac758f5470841784ae5c1797b28cc9fb00e81a9ecb5b30099df6235e68", - "60308b5d7baea79a62ee8934ec5f47585699b11a3e83fc981897a8800e07aa80", - "4f28f376a6c57eb56f39484f31f5faf700574bade6d015c368c2153d61e18bbb", - "464254720296ae488abe50c4220dc4c1e1918fa8135c6ec2e3f67c80ba13ec4b", - "1b6b62375ef59fb656b6c7501be027a92856eb977d3e770210c5ab5646d7a8f7", - "a7d8a98efef1cb6f4f5c63eaf4ab6bc4e89c4d43fd86ded9c55cc7247a185a8e", - "a72c7e599764cdea3920f1d4aad8a028748bb8354a79166d62d3dfa45588a3ed", - "8999d5edbe3e7248c4a02f697a2a22fe8ac34aaee080d351c69acf7c93a1ee50", - "43e9bf772a4a2e1ed52cf50a2361cbb9959366afdd9b20b5a2ade67e9a296fef", - "b9a9164a1e12511ce706a75431410ca9cd5192663c423c32c1ef17edcdfbadef", - "c923c90a331e9f39f2f0875db02fcfadb4f68f906680f8ca3656bf472b602367", - "20aa31d0ea3889df958343a6edfc99300ec6e33db9579a7db1ff9db58338771a", - "5cc718e4337b4df20ca59507b453dfca0a987e1c7826d222a82386f882ae09a2", - "e3ba7307a517f50adb6b853d5cbe07e9e6a8b5a65b86c61c37129bdff47d1740", - "5e901b21ae826466cc0f7f467df405b3aff53c57e10cc8df363ff9e14ef44180", - "e60922ae47b5536b010e6c8d51bd4ff0e4733044f443c0bf1c1a00b00d0200ca", - "a8e0a913ad3f2c35e1ffcf0c7548e2fbb7cf642e09ee26b12339de1f453c43d1", - "712265052cad6bbaada7644e505914a11f54fc3de5159a2d0e50985c146a9dad", - "6cf63c949d8d51ad7dd6c904213c4eac81638c4edd73e58dc7f598a1add56cbd", - "2e6a363484caaeb5a692930d30afafb2cf3f61edbbe48b14daf67f205ee8085a", - "1e9fc4b8223712b6828733f3d8d03827b31c0400364afe3beda5bb4d90de29e5", - "8434dff16227e8f81ca1a27838f017e08d93274411c7090a70618cde25753a28", - "6c4748fd22c49e2d399a85406a2ec7b5c1bda973c11765e1cf02c1d7174ff351", - "fc7b4161807da211f3f4d72852126ca4609bc9b5ae1edf3986ac80b050bd1171", - "40284ae75a59b214a27b81c5a1c2637f7a84bd1a2324311cbc99a893c23e327a", - "bf2a4f0a0f3fa1d846c7c18e50a0dff9915bc1d2c759456e6aa749ca518d39fe", - "92b6e5002b0ff8ddafdab954ee601273bf2d5a9cf0da4b2dcf9f93ab5e0600fe", - "10f157f0cd5305c7bacea2d32b6d1f1c4c68d066240610ec11162e0513bca2f4", - "e83b7067a80185c1f02966b25cc10dc9fe0df8a695a457a074e15e9b92ff05fc", - "a287f67e577fac6dbf60638310525a8a4c19c40bbb9813ba5d19af0c1a04847c", - "592b801f104fb9df5e030dbe65c8c21e386f28cfe321d24a55efde7aed2a6c38", - "898c29687310dc0e3f1204c8c8a1b391465d066f5a99b684aee348b48fd50293", - "4e2e8085bb1a450498c1048cce54751b5ed8f8f6b9889f300ef4d884bb2bfa52", - "be0a79d26cf8c991db277becb3257cf88499247b0637deb130a88d96c6570da9", - "debee9693c4c5428552ce51699e92f5294a5630fa0e84921b1aa5acc573c5d1c", - "9c1a2c2a61943439865ee63dac9e666a0cd03a83796fc2467751bc398cd06a82", - "4dd8478afaa1870ce77e83a82fce07a038204f3fa1e2f955a44d076c7a2bd033", - "18d77f9b2bd1b27755b86ce2bc19c48107f3e3a03798a29b00ea86e206631c1b", - "898587b98796215d61d01891bb8b27839ac9a742f81a17408d8b94c27948dd0a", - "46171d162b937c68795c8b63b3513157033ca5abc3e71b64cd02e5bc1c723a3f", - "fff553325d17ba71f310ca04c5d0aa558f1d6e90f977e80fb2f310f3fb26b071", - "0a0a93696baeaa9504fd3d67673fb168dd3b908df4add11e1060d3d203c4b4a0", - "7a07e85b9c7c32edae3a5a1df1d17d8d1cf01020bf897f7d887cb07f9cbd733c", - "77acbdbbf04aa4ae9fe763e9a045ccc9d45aa726586a0e123b2f13b1fb7aab92", - "6ab7de7e7ea3a729f63790a95917c978dc66ef3a2e8f08a6f7248d83a20cbd0e", - "fc9a0540c6c72f0bf8f19732c0b6931a58725d7c205cbc746b7427581af6f70e", - "c5c254d4b1fb18f334e782ae3363d4fc3d79f65f47640ba3487bb513549b1ca6", - "0b3e8bb44f68bd3426cad8bd99b90507278f1fa6736668e9e8c6185e6ceb4614", - "600c2c70580cb178eb04703ddbc1969ca12ab87c582ae108118117e0117c26ca", - "320b10650efd8b3550ecc78c0d71679e25bd5e82724236a19b326589206821e3", - "743693da40e3b149107c92310b8348d125ab72ee1f95158bf50ef00de423f897", - "6a9faf32055f2bb41b6fc66ce8e3415ae3c36d71681602ea09ecb92c0c72c3a7", - "73b87ecc18399c6f17f58017ff3284bec1cc270c3cffd1e2ac3779dffe0a27ff", - "fcd70bd8589f2544eeb19d2b811fe9a2ba2c3e5e89d059db0979470c045ac009", - "6691b01a5f4aefed8bc8825901747e2214d8be0de2b010ea4dce1507d0921312", - "cfe1f75a924cef016bacae66327c09aba6d7d3997e1b635756e211c12cd7bad6", - "1f274747ace4c694279736bc4bbf74f5a7f94befb3fb680e67cb3c02e96b98ba", - "15299cb983613800c0f7e5ca98584c735d7e4ab89d96e7a463b2fd3f444e3dfd", - "1587b9aa0581595a22c4db1a922ed0d31b08c5d40db44941cb64bd3e61385fd0", - "904d9c74c94223bac8d26f6300d865f07a74db341e37395773c6a8ce487f1b3c", - "acff53bffbc1f8d22ee2a73527b509267b83f252180322aeb31f868f9354ad19", - "85e65e3641f96f771a685ff4e4f452da05733bf75c191760b22b9b4b74335d77", - "60ecf42eaea9cc4550ea6d9a9863976195275222aa938953bc87f6874dacd81b", - "3536875d0ffaa838f8af3bdc79595c34dc3db85b4b51493bd863e4df6631da11", - "7afc11a28a9a53ba74a437152d6198072216ca27b8ace00a39079f48cbf7bffc", - "dc5c624a19aa26401463c956dba36350996b56731494ba77a8bff4728a304f36", - "7a2a0303d2e7fe3147ad33dc5d0e0dc08a0833ac5279f0f227645f269c0380c1", - "0bfb860d05b8a0e4043cb2a1d8681b8338e300bc3d654b7eb308b68259077504", - "b73e66e3171cd734eccc5c3050d69ab5df374a6719d5e00a3e4f3b0a91562cc0", - "0fdd4a0dc7cef3d6d130fc8dd9a76ce039abb77a12e4d596c316c13c4b1d5ab0", - "623c8df0dee3dde763c0ae124bc3ce7ca45be6a489c91517526262c2d836d5f7", - "ebc9c534a01ae5de4cbce77167828ae7281e4e12f8bc3223924f792aab551052", - "7954624cc79b13471a323887b77effde54287eb3b93e0a31ef531c0fb0939de8", - "bab9941d515998cea6f65fd21a2aa2b551c934ac0acb4d7b1de9b2be2b76f691", - "6797d8b3bb3c2f8cd2dfe4474b473a7cae01a56042cd93d9893618b27ad66c68", - "7999790233c8accbbf43b28191853898fc83db83478974ab55efbaf49a4ac698", - "11389cbf6558cc623e4d1adf61b812ab71a9164e4d26e772661d1a490db08527", - "701b617d20f51c8c73490b44988f32ce4796b924ee8ee1a2700af905617ef467", - "56bd953292fdc2f59526c9787a67734e0a33bf5be65f6cd2d18efd7823ebbb99", - "684266efb5e34b1bb45a233d5415fe599ba35a6eb164943d1dbb39374015a6a1", - "53abba6e8c61e3ac12d8a584c1f25f6b59762c16a094de398a8cdc7c99245476", - "5d1106a1788254eb8d7c0b793928637bb3c4b14f325183fff621d6ea3738fe85", - "15c875922fccc1a75f7db437cc6c1cddf7f4f396197a188f2042ddac4b6c4862", - "7efc54456e9e30a40cf5b858e80dd74a44fd475cf7fb3ba2d92d428335d81c74", - "61b414bbac43562013b2a46c3eb7237c30f41a3c6728031bdcc137d75d86e7af", - "e5bee2bcfc549c5cf1ef0ed997b2167b16f606fd4e58c8200a466bb8a8716ea8", - "9da8f7c2ba142879a9075d08125542dbf1aabe3048c97e64647501d896c2f26c", - "40dfeb329c3ecdfc71cd3435384b69d6381b12a852bf3ecfe30085feacbe11b4", - "141a952fb4a9062d96c43aba0456ad273cdceb0bbb8929d62b086211a743b8fa", - "403f35170be166ab31e57b7e41f7b97d4c40557d0c861c02ec7916219b8ffbb0", - "5d94f1867819e423016aa5d4823c0c66de4acc3c850e2417d99a843fe3304a51", - "3b7ace42e3b553a30702ed9287a0029db789b8a321e48dea854c621a429fef49", - "8f805b40bfab2168a7a097b193c5522acb1eabb60713483b0f61fec9805e2205", - "3f3890a73739e5da63fa74f75510e5488a603f1b0900fd37f91a027e24e1186e", - "f7fa3bfdd8a3c93adf40eedc092fb36e6f3863f3b1d5fcc696c6ae4de7d3c55f", - "b99302794e739ffacf4c2ff1222e0056c23da72f59863d310364a93bed54b856", - "dc04db1bf88fdc06a7cab6ca0972b6ce7c1ddf4f9aac5a97da4770b7c6bbeedc", - "c7df7ea7b3d991a6acf3b2d0ed94adc0bf1a2b49c7bd0a244c104af3c71c2c69", - "70cab780b846b1ae3d5f97fd174d84f117bc9106b63ed2b3ff250ce084f75780", - "5c70e7d5eb838c0425fe6300fa3ad899b1f822f427fa2fed5a01e964f403137b", - "d7e62d006d0f4e79810f31ea66261803bef63da7ef25fe92cf7e7e3411fc9027", - "7667147f76790dc15ee994eb5ef5076d83ad547c4a8db0a165f471ef42811678", - "f06d8195e1afd00b3bbdcfdbe104eac8b77d5c6219896966a507f6f71af21794", - "86d4cc015597d8b3fef54f34386f5e28a11277d13051c78253c2aae66f60a670", - "9e08698bb9227e4442a27f7fef80afaf6f81ae184f91ac35e6c743a407ba18ef", - "3df8d67b49ba7654e8f1d442fcb25c42c8f485d8f3c81aff85a0ef42c6eb80f1", - "445642b8c9e9622a189d0b2d6f2315192946f02017c5bdebd8bbaf4eb74a9509", - "8282c90e9b05f9fdafb3d50516e82ee8ee6e30a52ec93bfe0ded4e488c1f3814", - "ff0cc5ebc81f9b0ccae716453177d683a114a3f38cd9273f69dd392fbc965bc0", - "6e4d3ee0b0bcc39b2505c7fdfb102e1d2a21e869e77440d22a11ce838019abba", - "a1fb01b79e038ef02132f787d2500f375610ec2f754844b39e2d730aad867562", - "90c36c90cb7579e3bbfc09941f508191b957a28c20de2ac74707286c28e622bc", - "8540b298e0b3126de1aaf3c0005c2aeb928a8304083bdf2b079403d9a0d7e35c", - "4c5b6f25ac539db95441109804dfe1cf479db81a91c9eee065bf042c3710aca7", - "55c335783714bb68aee1243b8d6eb8b08352e5dff8e4b3f5fd5520dea01ce0b8", - "f6869707381c6e0ea3601d9f30a9402b592ffa2c268a257906655782f3b6e998", - "3651eb22c5af4f7b1c7885a7d66182030bc0bb63f3c4c3e5ff8e638f37048a79", - "cbe82b9088c42d408f0470d05ec083ccee1d3d673d9aae334fd11390c0f1fe1d", - "85f0ebd8780ada2f2ed85fd9b98ae0cda91fb56e0b0e55281a20b601a6b948f2", - "940984ab88dc2a15bd715644177822e746fdf2ddcd736233c93541005d454bea", - "54ae2ce063f89a6f53be57153d093870118351f02a4c514329d3a28f6b3b5013", - "13a39409ccb138bbca15f5ed5e14ff05e10836a9ada3c2b1dbb673807cf431e4", - "b2db88e60e2c4774cb6f846bd64f5c6c0954ef9beb2c8a3b98bbe56ff00391a1", - "8d48fba8199a44a282cb9215341d598bf7b795b2b44466cda3e555e5cb29f1e5", - "82e4df7fafb23f7bed8caf2f25dabec2cb5008ae403125d8e61fc27d3dc0c6a9", - "61755731e35fcdc6b86c34bd1c62e59c7708951ea845e97f228cf6aa5b377b59", - "8b284e283ca085f56489add87ab0f17bbe8841995c8c5dd8dd9ba044657acd0d", - "cbbe8bca71d2184abfae97bb5a66c2e43b584cee36f366a0f12d0f6f72d1f634", - "5f04d66f62c49947cac4c56909bdd51768f6c7e4004655b8a64043286d2e0831", - "89dc5ac6244af2574028db36328b2aaa29aed5bd8b25bc8c84eb14677459ca98", - "348fa829a661073f5617756b48c2a7e6818c8bc500fc687a503ed4eb549e2abb", - "3b5b16b3a52c17e4de60d51fbd916765dc965823c5b70c94010825d7941cb226", - "875e328fe96e5cfc50ba80e107843a5a983a929de28914d272b73ed5ff5a8f3c", - "8ee893a9935696381eabd04b463e78ab41631b8498e8cba31f1fbf7456dd527f", - "4e731c9b9363a1d5c1f433107069807aea3d72e1666f60c917d8f7e99a327b5d", - "5fcb12522848a71767e3274880355156dce50d0dcbbf5da193118795b4010454", - "5ff7dd30aedefa056890dbfc5d02dc66879f32bb99a71dd75f81886c17eca4b8", - "5e4bb120727781446c641d30ee50796fe50de10baed19124a8c99ebd5975fc97", - "91f31aa5a09afa638ec215ea4a09e8998b7a268cafd4095b96c03d271a6c03bf", - "c7649413a18c53567a71c0ebf78f96b0308cf043ec188781293d88b6318468fd", - "a6f44582186ab207650aff22f41da76cc83e7f587ad8f14f6f8802b8e23ff0d7", - "25e54a3fe130bd31b1e796cec7d95d76a61ff17f6f4bd0741f96b0e459e9b61d", - "74ae6c134543d43ce0b65dbcde5ec1fd86f2e9faf75ca3cfb090762059511ea4", - "31c1e243cb6b7019f0832c8720e464388519ab6e42b578168cbea67a9f6dab19", - "8bde68509cba56e08d54ad0f3421b2523a4ee21db2abfaf378439102a18fcad4", - "37607027cd0e47ec7301ce423a7ef86ba650195545620eced4db2a0f610a0653", - "432bef6ab487a7340e6b502dd875b0d35e9345d764077654a7ddc70270cde6c8", - "1c3c845bb2970f303e632a81cfd89e94228ba63c5433454c9173b3264b30b1cb", - "79705f16a78d424cc99baa673cced5d3b3a0e22b863245c9a9456fa25915a3e9", - "c8761cb040e35ee48de6e0f946a6db26a3d12229504b517ed8a95f4f4a0cb864", - "5fea051c90bcd6d61dc68c87bfbde0e1fd392f7a473f404d1eb2d6d8d777926b", - "36607c4fe29db699e40d553ae94e0c71622d6f95d5fdd65d67398e0fe139ba2a", - "157c8d367b35dc6afd568adb4267d9608b41cbb990a00a208fa716f86d5b0193", - "081acc8849b4cf77c5c3664038f733e649948f77155721cae19cade81c5883fb", - "3c0598eb8c9ac87121dceb2f1789b3ceab75790ef5e9355e534b5ae4dcd25288", - "caba1e904b766f019ffb6fd87f249a99d0bf4d7e099225465d8219f3c48e857c", - "4754ca851bc6b2113daa2e99328deb5ffdf6eb24b2919b8348e1a4fe99057316", - "bd0eb1677e570c5e674cd7d752d2325bb486a27caa6e8958e5bf5af762923f21", - "6829e0c6bd410f643caffc3a9b6967b7676176157e2a97a7a2672b855baf509e", - "1c05fd516cf91197b57e18d356eb16989d0dbb8699e30c736774e6da24fd5194", - "be7cad693a5f766f336a8e3161f3b2061f9c23913514feadc83098e115aea621", - "f26a41a0858e3aa8140a601a649cc42ae7ca261eb6a0122c628563d80f27c913", - "4325cc09cd3e48b91b4e6a18cab78c89c888ad2057fc8a1af1ec207c23a1e6c6", - "12e93691f915d29ed80e7d6168c25ef7bf6109537017c08864381da01c439335", - "4353e48811875e2c9e76d1b81d95921b0450825fba0e97dfe8ff7fe522259318", - "e89ec9fa243a207f8fa74de3d72f28ecffe1a4eca223eea4a9fb60141c3b10cb", - "9af2eb481b37099913196b5f34878262f489f43d7b1f595b998bd7947fabfdb0", - "bd0d7d6bcac1f52c69b7de09adef0378fd9c175233d06ea1420caa43189be38d", - "b5e45e2bd074ed33a720fdb37a5cf4f199900b1e7eb4683040da289f09f8ec9b", - "d8499104f8d01ce9650ee482b79296aec7322308c0c7936822bf51570d72ca9a", - "1700d9c5efbdbac3bc1b279cd8e0524c8a030e7c492e621b37bc1e2a1040afe2", - "b8facff1fede44a56c12efd70cffad617045c4159ee773e3f106f78ae43bd11c", - "310e57ac82eee4352a18fb236bc5c61d45180f39fa9c90f2e4bdbff11c687b38", - "d1a315f6b4d9b982443b1bf00329345c1986994e94949adcc5dd5c61657753bb", - "91045d879432a79ad6de250caee8df4ec04ea6a42d54da8392cd3c168a780d51", - "4b73c6e01a0698f4b9f3b09598530e810d87c6ee5a071daa5921b3da273d1fe4", - "61adcb70148041536df538ba21e73e4b615575f4b9b42fbe5979298c5092ef01", - "262b6512c0984dd08bb8ed2436b83dcd9e7d55474b3338f646a32a8906aafb39", - "728fdeb598c708cf3796754bbfac7678edcad76012176348b5e1e6c16da8addf", - "41029cc0441bc0e751dd4a6b3c905040681c60d4d232e22ba9009fb7e6890848", - "b5bf3ccd129b11a3b2229a108383b027e384d8c283949d2ead939e2b39b472bd", - "542ac15445f454e44e711e16265cab9aaeefd07bac279e7dda9c53044cc1c970", - "ca0fc4e7bec68f4da88e6189239d067d73bc3fae69502aeae758974c9819d930", - "221827cf6aada4d3f7ce8aad4bc9115c768e3866123532cd38e16162adeb3c49", - "e8e6105e9ab282d5e7f0e7d980c27c28ac2e88568ef8bd69003631b8f21dde8a", - "f1dfb45c0f001d4f878d098856e6b4ff00b1569a7ae6f6f51f0765d4853ada49", - "5a4357076020aae1d4e478a004b9662829913d44fbd7a6a2b507461a085e1ffe", - "552834cc4e90b34a07639f7046f4e7e5109fe9d3ffcc7a65e8073227201c4cc2", - "94e18be17c9951804f3fdd088bc03ef466c35fdfcf228948eae1e7eccd1280d3", - "cdf6d790ac03398ea8589626c809777419b0252406147430ba9eb91cdff61e6b", - "7a9c081b163ca7039eece3cc0e2da0e09ef3eb4d590bc9e401d809e0fd7857e3", - "dc0fb13dfaf5ffedfa70b9f47fb14e4381eb2bf66208cf2f95f0ad82e6907a9b", - "b5badb0dba4f5532f77428fc6ac2876291852a3689ceb7257a03b53dc68896bf", - "e707a211054f4a7af58d074711f3005d92193aea4ffb7448d7b1d39454800654", - "12a6ac5e466d06937e232f74dec729e976fb0d3b8f1ec8d306a96368581ec28e", - "d2f5b319cc8a99033633b210ff0f155fdc12e60719b6d33fff42b7a400980b35", - "f0c979f24a8498788d610a96fef1d0059f24735c3766663627accdf90d0824c0", - "55f92b7d46a8afed4157bcf49c0d0341caaa0d1f90f3b2cbc0df995d590b598d", - "4f9eed2c3f6bd73c2b548c662a02edc6ef9b355d5c101683bd7787d52d1aaf7c", - "5ca6ac0eaad4cc406a95670895f56af051bc8df97cd94e8e7db724370229185d", - "d34f809f122665c5f0acfc7b2c206133995fa7d0d7a9813d3878d5a3bd06b0e2", - "5a9d5586e3d8298bbbf673a48515cb1718d464d9487b99343aa49180aea7a150", - "a23a85091efaa3ac3cff8e06cdfb121eab08130656e38e40a0acf75995e142fb", - "0de989d29b565129c0f27a5d0b3c22959d40c1495050ec478d3d4767539a1e8a", - "08d7064a331c1d7fb9488f826a090b73ffe9356e4a0fa2b045fbae214100bfef", - "47d34a5599502afa4602d590cd5bbac16c6ade3785a49f5c4b5c3cd93936ff50", - "db390ce4cc9276c834c9e1472638e46eb26c705b211fffc77177879e6b7cef28", - "1aeac4dac67b6c169bc97875c72de9eb754d63a61c43a72b6c60b458070c600b", - "ec61d615e9827adcce42c7a074a82e68bbee77bb8b9afab3c1c0d590671e028f", - "3a7e9f271fea40384f10f09d099041f0dd97467d7d014c53848c2e032731b8f0", - "4ad21810320b2813a79bc962ade601a79e2620c8fae6f7a21b04e1fec0070906", - "c40a135cdfb3a37c9db7aeb4690d6d4c1b354ac4ed22622787e933af8f49e363", - "bf8dedb7337c36e43b7482b59757a0f4c26a68bd75713abdc615941d90b8880c", - "6407076ccb50231cd6a9b9f06652f82b21dbfbb612938b0a42c9436aaf3edc86", - "29c9c4014c693e4c4211234b8a0b628faf5e77c4d0e5ef71e68728778b896356", - "3971bc84552d5fb3b94ff0aca0c0d9eada67d9a0db69b0fc3063b6d8a465734c", - "5dd921440fe72868feb07cb1d855410e7f99e5505b92a5f6935b51e2719b9539", - "080845bef0d94cfd59f52032a0940b7df655091b9e5bd4e786d967aceaad67b0", - "1ff439fba311fa6a3d8b2d68d5faf8e9d36e4aa0e2cd1d12446f52bb4cbf501d", - "c495f5549d407fa35a909be06f257bc1d77758a162a1371351f9c674f2b81ff6", - "c70241d43b18e2c388624b7680cfe702b91892575b8edece041adf5b88e83471", - "ec293eb4b6c0395326f7c23903d85d42806684b84b1d2efd061cc099bf9ae70e", - "4447018f7c3c92fdce7e05e9c1f8c6f820a73bc52abfa568c3869ff5ee1ca08f", - "f80a463ea9f877ce9ce0a667a9cfcc3fda8c4d7607293a2e278402c0a6fc40f1", - "5d089b18737dd6198c834d58efad2a3c40b9bafa5c52fce2c02ecaf53b37f58b", - "0d52c48c8e5f89f47b60da5379825b2b0117237c61f3557bb6b9d75e306ea52c", - "94830cf0bee5d944987fdbd64dec0dd0ec7cfecb5cad658cd86a1ec1318daef0", - "e8fe0f9e59690dbe0c9d62eb3b2f9e1bc074066fd92332c2405be130ab49c1a3", - "e005b6f2f7c71950816bd7a9ea2a86adf8461365a29e8bcef6de7ace2b818efd", - "59bc31ec7e8143aae1ffd17ee80f8a03049fbd55b1e2dd0aad9b9102f795bc7b", - "ca14a7881897533004d9c60323f5f03da77ac6ae66b20b978277389939320f7c", - "30384ea215f837f3369f770dec8c3399bc33d6ac0bf4b502a8020ed3e6a2b68b", - "a8c4589bf9e3086d857eb9dc010ba6ebb84e0fd668ba1a7ff0c9ac0af4bafe09", - "8f298778f78280b56408bd85be127addd22c1a8d3567b4671620c68e2e773ef8", - "4a43a7133dee940b684f9ac6851d5a3fedc287f7e4c62dfa2bc3bc8625180d81", - "151f0ad7195a4ba555db55ac3481d2a165d9f7b849380cf0ea0e02d28145aadd", - "43e73a96f28231cf80e306e77c9f8f210331b7f23f865e0ece0b06af715c3410", - "701cec10216ea560a2144fcc32aca20fc929e7ebd85af8a4038e900ff8d611e3", - "dfb01da3d067eb32182f19aaff203ed8712edbfedc48a908bc6d38e672c3d21f", - "7c8760623b4663ad865f908370651b4da04f8bdb4a76f17f54d5c17785aed390", - "2f3b419ad894046341c81e05e53a24827919e2a4865ea9553df1612d7e6b0208", - "24b71dfde3a05b2595bd2563bd86f19b3557f9edd703bdd557fbb260a1e54a1b", - "52d8f883079bcfd7a5db468a41d99310bb5d62702cf5b7c952509686683d6914", - "1b53be656123036e1be2f3f85bb6209054f23858426831dd7117886c7fe2e399", - "6f489326e679f5df8ed21dae18e96e900d1cac22beabd2cab08b0328ad694d23", - "651938bc69352908f7214800f7595f691bf79e6f185b95b74fc42b1f71b395b4", - "12d370ad8a3f272c5b1ad0b463f1c96691ec1d4e5bbc856954815e9479ce49e4", - "4c7d3514e8155366daaccb987f4a95d8d4ebfd571528454edae63a65690da1bd", - "a01c5b31f0d30d0083a81406c3abe5123a7d03ea1d21e253fcd35e035c9ff097", - "715a04095ca0c99a050f819eaea67c2748e6e83a64bf0263d7be990bc2ba02c9", - "23250f3294951365dcf0db60f56384babb8fe77baec59eabe4122e9cf0d39b8b", - "2069ca758205f75e3ba6ebcb0ccc57406f049e64dc4679593951ffc889ec1d6e", - "38732b536db4fc7f34b3d40ddfb5e44eee9e4d93f5b38b28a1736cdb3040b713", - "59e1cc17c8b9b9c23fb2fcb481afab13e14a85dcc990269cb825b9852e6bde29", - "37015ac098b5d80621849451f2999e60f910e860641f1dc00b4d16b3af939af8", - "cb1c66d3f53e6520eec545e8ba39ba2cd371113092cdc83fe2f106894a7d8757", - "e4ca28c7be6ce884b82ea2a8f8e2380958f66f93de629f28f0e6e3e80c9a82a5", - "3a54fc9aeb8986507a6f70806b5840265e80d5092f0ad7255022cc8d4b978a2b", - "9bfb6ad7c998c936e89eac98e86685338dd1e47fcfe1b1966406530f2b8b9868", - "4470e1880accb861b07a747c721779d2823cea2f4b1beb00b199e2be092efc3a", - "170eeaa1817b38dedab1641207fdb868d1cfc8f5e1a8549c97c1db8db9cc398d", - "438a67d35a4ba9e4821dea79e2adf67e0fba612e2a2fce19566eb4b92493e6f1", - "e2104d6624da55dfc727b80ca9c738f5ac01b72a64e7e9c5a83baa19a5bbe8c4", - "5f6f2135d600dd3ea2f8a0b848d997750d68866731dd2d1a29f194617b127793", - "51f7b93cbc9e8614d1ae8a8f8d42ea7c7bc85c746cc10c58840ae8144af9a6a6", - "a46036cbe0ac7f4612a310cdb242de2474172a61c17a105a127605a8bc4faeb2", - "e4f529d6343fe1755a8fea9143fd39ee42dadbe62b9fc401849954a9a0f8e847", - "8cfa7f79d732a6d24804a09c7a6df92d754ddfc0b18b806dfee52d9e071f4d4b", - "9903a5c048df0b7835b239f7a883b429583f532ab46425d361272fa2568f018c", - "b085ebb3caced0f7487592c742b6433058d4f0d3e8b62607a0c120ae54e47e59", - "0ed00e32307fa0a9e468001112fbab3898aaa3d6c2602370bce192d4c9c88752", - "185fd5983049f25cef54e134e19fb2e8ec99f44314b76c34392412ebab5d01d3", - "2917d2d658f0cb59e5f99c947d58fa1a9a40ca04f64e2fe4877be1ea4d0d98c1", - "f02c50a2453259b2cbe1146650d30f2f66bd3aca25e89132de26ef4f0c4d1f04", - "3e075da4e2ccafcab399c5f8d8c0a62f2f68088426590e240d3ffbc3800bd0ae", - "e15594797fb16f41c0a290ce7d8eb810cdb258fb803f88b208144cecc6e0d329", - "f7ce42d5688556ea54e6561a8fb461438d74503d4966116fb8176229cedd64d1", - "e65c634f49384b5cc9f587bd003c46e4e1c029da936ca8d6ae5b6bf57d840d96", - "2b9abddf8085dcf3384410ac9e233a2ebc7e552424f4206acd2a4285a942c6ea", - "62ba8ad2cd600b048f4a54eac3e38a862305731b765df79831d443cfc4ab1591", - "8c70e200a0a63d56f5380da4a9fee46ee3a64da71a4d764e3f72cecec722699a", - "9ee32461acede0e99606d7fe7e7dcd9c091c40f549118b62811f5143932c507c", - "3c5c43e6b040cafab1c80cb082612cbbacace05d451522ffc347510ffa725e90", - "12591b52e578fc034cae27e7b16d255a8c9ed29edb1658debaa1fa00623f39a1", - "84166cf6d7cf211e8358f911ddd3659edc4e822be6a90ba0eee9e557b9c56e06", - "7a089b1efabaf231115a1cf5ca595585e3aa0f4042e48b017ea81f2f97007e99", - "a96e7705c8acb78ea3ba051498add666da65aa669b47feceabe43eae8fae8580", - "31484a2e3661ab8b98efdaf40bc3aef8ac350d5c3f6f519c3161312449b31b5e", - "8b78c1c6e9e24fb209b8a952660bf7e1edd7060d77b89f5e64b635a043363322", - "2195cce7a95f92a5cf352db88f335a5bd94ef08e55c9d41ab42e7148be1fbab0", - "2f7d740da8ec4010e3b24ed40a99bf1efc5ef3532ebee3e4b13fb716dec4d420", - "f601993b971576ede8f956584a8070175e770db67de0ebf253c62e5ba5743ff2", - "2afd1165eb24868284a4c191ed7d79a22244294aab510f205daf66bdfd564316", - "a3c4a903fef356b87b3a8d73ae970c2207672f0ce86573a5d94d9fb97bbfccd1", - "4082f6739c5641ac8525d70efc8ce9a5b5e806d6de93735ce7489be249270333", - "ed955de80f741729e4c7504c1e87338564aa6d6978ae31e3e03dd846144a835c", - "2307fc371c6e97e679904e4f85f015adf3a59a3dd9c0045faa8a4da027dff968", - "3617f788320556012fcb74fcd4188d8355f1c77a1193554861077181777feeed", - "e5185135223ea287dee7b33d01b5760e1c0c472c6843897f44a17801a6bda348", - "e6d4e29088894b8d073b0a7f94699f9bd1e56073581e1e7a52e309e3eac33cff", - "a2b06b8dd180462a3214cca7d9acc007e2354416d5e81a63eeeb72898093453e", - "1ffcd49415460fba4900ba9945a39106f33fcdef8c732161772bdea68422197b", - "ab5d594a140dec179a78c975c53fd128eeab3cb49877c2315c265005e9f05d5f", - "9096e13360e1c2960b6d76a41c2bb0709c52018fed430832c65cd0f655266e2c", - "6ec1645af2ca6c4d5294ecc13f8f9b344c9b43dc13763c1fdfffc42fe1ffab01", - "51e34cc4e98dc1397ac035fab33788abf07ec82fedda69e999f700e037fe89b8", - "5960b50377d6eb344c431752a2a5de902364ca2c266711814b14810f98580192", - "d684318ac742984559c842dab690ea2aa6d82753879111995472fdbd052d62c3", - "2c44632f54ce85584e1250eaa01411d5cbdeb5c5bf3b31b3c80c078444babe06", - "da5b6094f855255ff9d9d18eff94ce2dc853c07afa0f624fd513bac5863b6923", - "9db8f5937eb2e86d29d6771495a8506fe3a265b634676fa2f6c9c59054c161f7", - "bdfd63ac67e6effdd91b08e63ae92bc462088aa4dfbb21e07924500cb0f9b0cb", - "65dae578b28386c29907b7f2e6931c01cd5f38ce62e98ba2a01f0d54d8244668", - "ec430ea55043ddaab9691e8189be7c77c371b6020d563bf7035217e89d1b41b4", - "3f2cfe5447496f42385bc2757489ecef8cdaebe350fca828a75cabcb28ae42c8", - "1001c2fc6f48f2e10a3e79b8763fcf2f7985e659fe51373222df54bbdc088c76", - "7b9eb76d1ceafc6fa2994250598e1f8ac3402794e2a3b6bf48b663136b48b4a3", - "e12d3452da2a938c7ccb5a3563416c9015421313c430a90463231f6d02fd0f8d", - "51d607a5eeca610acfa5fa3a30f2539d48c82abba4bc21e0b80b640f40002fde", - "44d93fd310f1e42b1d51102db04dfdad5c2d318799a82fcad38b5129dbbe9289", - "5355173db89ba3d48235897d0f43cae961ffa661f364600101504652791bfec3", - "4c33caa9cc39d59267647f803309fd310a964acc47aa2596fae8f5a075e7e93c", - "3825c45baaaf647d092118fab9d319b7544da57f9079158539bd342da0d54f30", - "0bed0df4633a42eef422b5b7288246f532cb720969a4c42e48ca44a386394689", - "1a89dfbf6734d4f7d2f009e5c945991f9f00c09d78190f4f92e00c9e6714986e", - "80accdb553179c83e5f1c9482ef3bb04758136ffbab15e2d10f75a275e31d994", - "98c0c377b868cd1f2f036a4f8227458432f86a2e6e26263ad1a8226613d90da8", - "3abfaf4aae4f9561868167ecf46c0b3f8c3e9a5e051dcb81381293460f7be0a2", - "64065dfb123eae86123fc03c3db27281faecf3911dffe9051e81f72782dfba53", - "dc897bf2dcd13d93340a145e00bbeae58f830e03f62604249124d782354a8fc1", - "b1c564d1e7f4952ad21445d050c6dd63493d9926de158affd8d44ea6522c3584", - "13f9e91d9a50cc7a7eb004bfe69ce4a5f478b09714833ea24bd2987bc2ae534e", - "32271d0ad764606389e59e9c154f9197a1da316fd75430848c4022afd35f9a32", - "523280b1fb862c135654127baa7f04ab39abc4f7f1dde9e24e9753e416c97723", - "7df7251f1d6378f48ea858ddb3e865456952df9f81dc0a883e969d369944a733", - "7855ed76e2509699c78301043b0120889a33dd6cc35d720cc4c3b43a4f812bf1", - "2402464f73ad3012fc379eb568bd5811e595fcaa1e28242801f29d51393acada", - "706fa25d8bd9dd65bc8942e4def8ae33c00fcd702500146986dcad643153a481", - "052fff8dc4bdeedea740c7e0c67046fd017ca82cda3c42877d9170f419476295", - "747b6cf2da63e8b2ca775dba4ba969b95506ae7efd8fdd63aae85b818e3f1ea4", - "4641f91829a899b5042b87aff930a89ee60eac122b8a6d459ce270f6a9151e79", - "18dcb742793ca6436fe1cd173cd8a0587f91e306628dfa1ad53e9809c6e43ac8", - "1ba7ba6a1d2dac0490dc4f9b3218c1a67a6c45ec983b61fa655f427688916556", - "40f88d98808bfc7b783c0b96b26735a386620754a27546ca20e72f1a3ad869db", - "d17858692276a87255a15a7f9b6151ef584e877d31be10a938db92f1e7f68664", - "d262025e985d40fff9734ca5808a0135e3af6a10242e5356d98c21ec9586367f", - "55f3883495158399e5bdeef791688c37813afa662768e1b429de48ce2f552147", - "8a5f87b73f9b2be041ea79f91b01b728feb1c38231dd872c231d8b287b8d59f0", - "7f887d0ea1db9114c03e9dc81ed14bdbba89fb4b5b02226e64301aeaf94ab498", - "f6a4a38b2acdd9fd948c24fe74c95f1ec3e0782f70737760025424d49a6e7e7d", - "8b026eef293d4fe902b519e3243e35ffbd56aef9ecaae7914ad075f306bba49c", - "7928be6272960eb91e0a94a2e7f12f830293600973c1f19b30b04a7baf9becd3", - "6144a378aeb25d96498c7188cfecd39781e75468c3c0057cc43eec8727f4ae14", - "5ad6c21a6c27dd0e2e2a4034801c2983e27a3823e9e9b6f6a8c4b3ddb859503c", - "40d2187e1958f103471f5461045d3b89307941821b3fc86fca669a5a0ca0294f", - "c0bee70460781386e9dd4656c9557d476a329bb7d53c99b558f1b3bbf3533548", - "eb30036b51d706a2165e0739945093e3702372ff6d6ff71c88a3f103153dc2da", - "a2e4f03417bd952858058cc8edacc1c02a37ae9b184e48cd43bf78eaa022683c", - "25126323d2a7f1793a4aaa1cfb8277cbca5224d49721a0f8181dede1c4e6feef", - "50b6764787debf9f2aca5223c01889e39d0fbd05f4c0880d184cd91a9ee94cf7", - "7a63980a48df9a2a5e09c84fe15bf29017bfb3cfe31ac755644916c93d544711", - "927116131593d8fa483337edd6d2a3152a0f58fdd8e16a8edda6ec6d823157c5", - "7e6ecf9eb3def6d88934b24014536d9fa9d2bbb35b4d92c2ddd5881c87c36ac6", - "9a73e4af46a01c41e8850eae9cf1e57c2bf07dec8dfa72cf48e60b09bbe0d212", - "c072aa58968a8a4fec406c54c3abc3f25a92750196841e372655590840cc6012", - "6967057f613d96253485aa58f28db5d2032d47e61493ad1d0e76c2858b8f179d", - "ed877d9bb8ea1c99aa733937ef7b7e32a512e7b27fac1a688666857d18bd5236", - "62870fb859cb0dbd1e4d4491663913d9caf21d63a2334d04f6352e1cc8c0c182", - "dc16b6b367686aba915166a728d7e07b9f86a8db43d9e4a45548b8036f49f169", - "54678ffcc7c5a8a500268fe27dc06c66462f01bc323078508bff3bf43be2db9f", - "091150c43536725c97a11387e79edaa6b131bc9d7a88882ded82b14ad27a7b10", - "82107b91484935d75f258f3834753138cf4d89812d607a9e56f8e4f714e96a47", - "d0bba2cf134341bc9b6befbefc8d2a407266239aa30f7a1073d654374dec12ba", - "132ef67441df9d3a1505712e795f78eb0d804118925d53a3243d3d94c3c88eae", - "f1a509b17881ea5decfe80719515460cc92ce92efcdaf32314b6a76a097a4b95", - "e6c6a0a98a60406b17e65386d04aa244f941c81e7a8b217c8fd2148f75b5b598", - "273f8d22c967d16b1e8a48420bb2de4776800ec04f4ada8431cb4ea875e78399", - "50d7effb04c8ac9fc9c35078922cd089bfb106cf41bdcad9054cf236bd3b922f", - "565211710f5cdbe8a280cd50c05387fdff55afe33f3476899313c1b4f32115a6", - "eeb6fd57282a01f777153a1b5c88c65b176a21934e60319bf08953246fd97612", - "b98d27e535ae38c3874e96a4fed2b4e3fe3bdbb32cef6cbce9711804a1695a2b", - "663f8ede7ebbe43de9dd2abfa1937be4f06df4e39856f2baaefc7abfa7a03ec5", - "822fd4ad358efc51efe3c6452338dd224747f44226b0a4820ffe51513d396e1d", - "64b5ec515ae33f82ba102f625da2b4ebb4e470226edf829c01b6256686864f28", - "a5817f0bb8b2432dbef1c916f1ce331143ce137aaaf9c1812f491550ca65475c", - "eebdeb5d7bf2983a9f69a90a68304adcbbdf3c10aee188a4d63d5d62979a6fcf", - "0c9cfe71dd5f77d99cbb9adaa48c2ab9c0d2aed404fdc8f91caab52e87404aad", - "e57852f5d82467efd8177d4604d01201add5f7fd07fdfbb696c76812621108de", - "882bfc3a950079662d57014c0034477c7762534bdbcea28d224c1b2fb7de6082", - "9551205569514941ea54c46f20d033704e9390ae3ed37e01337fcbc6144a218b", - "393cd648eaec782d47379ac0ad3a782e71215a5cfbe29683df7399d7b24ec718", - "82eb1a93187efd4503983c6ac5f502dc3e4e351686f473535fc4037e851b6708", - "390026fde24e52b25917ca237e94703ade8836232383899f9bf64a11f1ea5f8f", - "65f9848ff92149027c1135d1a8b5ea9768bbfe00cc48dfdff173d9ffbb3ec141", - "44ac02e7ab8262a3f6f1c338aa7722ccfbc338ef693dec0b86fa8bbc6606269e", - "6630d31eac12b82a88b3409ace1780a470fe7c3fe0818eb15b831a7c1286eb78", - "c0ac00766ba07b4cc751260e3e81bf6625b513ca5b78ffbc24b2841b396f6d0f", - "9a55d655757252964838d6f267481dcf35da2719e76215028c165bf33ce65a36", - "57cb2d5324bafb08c61244fb17442a851fbfd5d342a1df5b8201f3cb9594228c", - "5c449361895481b73ac382874424f20fd095dda88b43a0208aa8c3902e58d0db", - "cc08aab76c425af9b292c501e6ff8ceaa6bf9020c51fa02341518db367698d34", - "16204902751d7e33ea9c3061db44afbf15030d95fdafb175cebdae32101dd239", - "eba2b0f08685be950b8df443adcab628f8f7d56ca469f51df5e297cf4eb4cea4", - "2d7efcad07ef0654014f47e4fefb1c40eaca9b05bec82ac33f8856d72efbb91a", - "891c695ccda084a63c1aaeb9c3b3439bd9af8221e03bfe47ec19ffb59f6c5cbc", - "a6e1f764f601397a2d20e54cfcdc4c58bddcce84ef99d6fcd879df8e53f6a87e", - "f0bec39115c93335425e18ba7d17b6e679ba3183089ecbe01818d9d413cd7970", - "e947057b7f3bc2213c48a1a884e99aa2540fcdb248debfb681152657ca750f9a", - "9f0ea50460a3ffda520065b9a3d851d92ed33543da9f872a043596d7badab1a3", - "7882817bb64609574edc8599fc2ceb6dd02b1fa53931af376242cc96d3565263", - "1ee659fea7f0c785f5e40dbc9695acd7f1b6d7787fd6aaa8fcce2ee42a8a2078", - "53aa0a961046ada4057133f197c24f665454e6c3054e9393b9a854acbcfc6031", - "96d9bfe21801e0898363a33e30e2648455cabe7279cb8e36f749799ae7e51ea5", - "0f4ac93afa911cc17aa39cf8cbd5cbeffc9977cc92769b7865fca10bba2658ea", - "0e974b5e4db0287b362c45f236e33b8b01d8622d10b191a726068735b99276a6", - "3d208041772e4856e0e684dd11b83c3d0e0ac8175d54cf893ac950ffaa97fe08", - "200b44731f2a5abe1e8b66fdec82985f1b34f527d389b167b51eeb37073450ba", - "9aa9db521420085efb440e1af5626778cdee8cba42e7cca5da06af37dc5f002d", - "35f13f605372e8390576e882d0661d345bc1e7126b69fb9ca3dcd5133ce62799", - "eaa92a7b88ef6c4123079faff25ae2c38ed7859932603ba6708d7a71d4629de7", - "0cfb4227d9a287c59f287ab0add359d169ce2dee5d882f1bc1701042d686d2df", - "d096fccf040b8150c02a0a05f2987bc268330df231d19df5c31e5956a72ecf96", - "1d8823ed937c79fe0f65dbd455fdcb48f1cada89fc59d94a879b2a28a63c8560", - "814cd34a22559339d111fb57c2664530d0a585dda248bb1a40fc02329a11eb38", - "29e854cab04806cf6e32886609783b9661ebb6d256a365541e137d533ddf05b2", - "42dd727298b87710c35e66276cc3f38f975627f72e90d9c7a1fd85484cbbec53", - "f83a6089fb75dbff927c41c43f60df95dc72e1f329e04ed716df28eae1f41a17", - "93995d6dc58980e401de2b95525c939b2ea09ee765912d544da7125c8b49416b", - "29960369eb2663ba5c0aa38c37b102e273acd6e1b6805ed040a4e06bfbef83e4", - "8d177877230293031d9a3388341a686f167e3fa2cf7b888ae34f632329c0d38e", - "29fccdfb4dbaf6704e4f6798673669aef00b8fd20d7c7a53dec74ec388150f7e", - "5d9d6b4e40b31ace8e88af5ea81102022fcd9050d71fa8f4f8cb45fe919ced86", - "1d28145fe7680ad67ef2536f26fa84e8e734fb1b9db769d08d3bda3c7749d058", - "5da0c8245e628c6df784c6f0ad0c579346aeef06bc68193043fd235935eaadcb", - "dde3a4c73271dde6f671da453263cd4bd07108dcaaf46a8c42bc62cd81770312", - "2165c4eb2262099caf7d3837f8eb546af5c00d5ec38233539d1ac83ca012a512", - "80da5f3480fe96f156e1790320bf6a1db71c0553486965bca880fe82d67e3b10", - "b281b7f0be1ddd7ad228b44bd8fe7f24da349871c4a4d5129e502110a4e77e8f", - "f0c859a6802bf76e99f83a7a0d7080ff0e92de95132b6e1cfaa0b97fef539a90", - "3d602cdd5e16d27bb65130a2158343cb66f52a10ffd1de628aadcd899be2221c", - "552e4d65b6776ba7d0b68ad369a5ba513be9810eb91ea65805baa3e0b5e53e76", - "acc27cde1617b44374a9292ae6e23d29bdfbe4228cf53e03dbc7d64ef9c7a7e9", - "29a6743397719e4469a34d8db83a7fbb4fc1c6c5572953fc7609eb28af1ab46f", - "046c4ae5d5a2375d3d612a1231d0a8d911da1ba2ba70f6bdb3f45b7d9bda919b", - "e88d9faf12205696b6807ddce1c9e0fb0528b54c11e5e99a43951b5caa616575", - "acf06c1c5b62b9989f5da29973d8d39df672d243e5c098a56de001af8028bcbb", - "c67bf1b728e5115586dbd53b5dff81f6f08914dba62a95e2e0351e5ceadd3581", - "77569250d38b8e2afbeefd0dbf55b15303f6beabe1c91e8ad4180b41c80429de", - "12419913da5039b5522c060761d6e7556a6e7ab9be001b8ab5320b32aecd3ff5", - "f84c1f59c16b09fd2478897b6e7fbdcc704faef92d4b874ec3e936223545bbcf", - "2ac235555be94f3d75ffad3ac6514f107626038db7381d38fb0653928d64a0a3", - "4fb6d451aa522525de349be7f393e78b31b6076adeb3dced4310c0189b4f3a94", - "b7062169cb42b77b50ba57c7571706dc532303f4f3cb6675c98003f99ec27454", - "a76896bafe336c50ebca986e7f57f2feb7d5964003d050afd894ec85424de643", - "902bb4957e60ab9bb03cea5169b4230bc4f63be9ca86106da149145645fc9e60", - "10989fa329d59c12037877a10f7a2d1ff124e5e289b01ed21d1c936448b37543", - "2d3b7eed00d359c8e5f1273ef8a142ef1a2806ce8cca81503f7fd400143be7a3", - "e1ed06bcb3993d08213c6395ef5a1305e36d86e818f7be97a7bbc4bc75e0d50b", - "c95742360567b0ce03b55f6c308a578d2ad40ec204973be3de72536c4e267454", - "d98f2d5d312ef37d56ec7626aae833a9f224793a79025db8938bf76ee726cb43", - "dbef8d0e256b6dfda811e9fdfbf8c97b6bd4eefb21d30dab1b0b2e5bf7ff7e37", - "a4ada9f97c5d0914df49d83d71192bdc33dbbec547692616e15d0bcb1de0af55", - "5ada592bd49ca53ab4205e7a82382253df1e5539ecc625907041ee6aa0c0c66c", - "8a4eb6cea1bb49b4398fab548324adc0f06bb0fe0228168ae8d70a9048085e01", - "293f70be7e3a582f854c9de904ddaaccbdc617ba0d679a0048ff2d62b8c82561", - "e62337218030e0c5f9eab9640be513e74f68a2b6284448a16307344d6cfabb59", - "793425ef2c7e3f04045744f0b3bfae8f1361916e555cb8d6281aa1fdc3a9ad6a", - "16eb3120ded762f0d745e04d93aea6cd58208950dd8bc0d0c736c842720efc04", - "1751c5741957a388ff12aec65ba0c3efd350cb76fa6c2814fbc70d88b91e3605", - "850a030c0d3929405f0dd7c36f00f89b1ad4874fe65e8577bcffa7307dc558f3", - "36549a84dbc5d2cbd9c1284de7b5f14d5863b5b2875d694ff6fc0a5b1e3ded04", - "eb1474b67e3df66dd50a99eb260738bd412b6419dd374002e11067aa751fc3a6", - "2a32d02612699e291633f144459967acf8b8d330b4819a75aaa6957a37c8e4e5", - "005848e84b52bb73472724559dc6d22e5ec14f729a9d1ca999b707381d900424", - "adb754199076fd81cab796d20205d6d4d766b8e60be22069dfcf84a492bcc593", - "a61a9da2054171ab2a8e8451017c906ddbf07277f138608669a0b30706fcdedb", - "627f2fe409e348b98ecfb04362ff191cc3aaaf04f780ffe14dd1005f9f2bd49c", - "80d25ea8c9cdb6635d7d836b6a55b00a6cf9d024da21ae78c41dfb24c9021488", - "d6c777ef68af55b629b20ab58718e3dce71124df66e69da27ed69561605a05eb", - "3be8dafdafbc35c57fddccb6bb1d398b2b765905fe4ded38cd559c995e28a22a", - "bafa7781bc26e459303536605457340c60e740d6333dcf60ecb9d1be089c3c52", - "5d13c0cae88487d793805d4f9d88bac9f23879b12c595c955afed7ed278cace3", - "9e7920d6dcf3e9e42a1bca3b4f4fe5e03de4e3f5de3c4d0447fe50cdb655f6e4", - "2fe6aa51aa9458eb4844d5f77f8b1de5a1136dfe5c8d8dfca753aeffdbf74b4d", - "fd54c393e3a17af2b91033eeaff6be8fbd0261d1f41dde748c7d4bcab6452c29", - "1488c2e257c5681389b614f9eb992d76225d34fc80283749fe03f26ad06e9a17", - "69a3915ffd3a9e8e8916b5bdd253f77a50ce060d7edcf19063cf0584b44d4a15", - "a1f1701780bde527ecea126003f3d42da7334741a2c36d0f5688bc2b41f82093", - "d4bcd664274381c370dc2af0796d90d0aa6789cf7f37008c85d17daf68980832", - "f3f6d3d2900dc966c10ae274be88daee62f5f24c049c041bfcaaccbf6ecb4826", - "361cc38e5e341ccf36318c9953b1aaaa4ace98d5cc31b6ef2223781337c8b3ae", - "5838bcf58466d642da77b3211a5e924b3a00051ae26422f0bad4ca9d9db4e24b", - "25c0c94daf4143222f85713d0b38516dd7250393fd4b91c51f33bb83366e46df", - "542cfe0a8389b6f44f16d33568b178388bd37ca00be183b4b5eeaac755716098", - "d02121ab0e8e479b6fd9940e6b26752d54434c76a478d1551cfa035030c17b1d", - "b7474400062e0b5bb2d858d058cb685281891927535dd318cc833a96ba046793", - "23f982dd94e7a7ac270b22ea30930c4e80ea7f3e864a14d1da742b429dbfe9d4", - "21205c6291f1791b03af1ba58414a9277f067f981e2173ea1b8865b2994f73c6", - "2a7eb1b9e3b935d27d5f8f16d2490535c29b5d501023ed2bd8d32dfb8579b151", - "a09663593504796ebf0091e11c35989950d439b740c9e7a27ecfb3ca6c0b9c31", - "fd0cdc038bc8e5a5097ea5334f4336ce233a85b7a0e001f982d1e76a70b0670e", - "819c5090943906257891a1f2d8444574e28a860c37b69e6aac0dc6fe71a77712", - "98684f933c0a15cd3832ec81a761f6948279a11980f79c1341bd92e581c5aa8c", - "57216da903fc8c789017a6b0e0eb77746eaeb527ca3d5b74a8be42918a3fcd84", - "1889fcfe6849eab836b89504c56e2b967f7b4f160ab9f96f677265019cc7ea69", - "1547fec9bca75255609449ace34042e57b997fc80c585975d750e61810ecdb94", - "772ede7e214a7001a2b35956c2a6d4da440526b50798ebc1d10306c8c441de9a", - "91adfae1c45233f21bce3c013c3d25e85f58378e3b0554551c48d6420d732ed5", - "3b3119ece78b8dd591160e7daf994e629ce1ecacc0d883bcc254ce04e4d4b298", - "ca703d7100eb9a3fab5354ec9534fc90cd3ae0dbe09e8d6c2cc7f86aac104112", - "261666c491545ef131550fc9f9067926bdcac0352f378488971b7f36efdca4fe", - "a60b2e7e7c3d6de0556e9a33725886baa17f5b87b825ba65be4ea379b82c8bdf", - "903247b68220bcd812b0a9a197c0d6c423e7fdc4fd176dfd482e904fc31c56dd", - "a937da31899ab04c0eba7b192c6f67ac8345ef8d4ccb9eaa5bb97155a24b3cf1", - "a6c1371fa7c7ab31b9601418f1f4ead30a21bd7fca8fb9bedbd07c57c6fa5b56", - "687e70e72d4bd66c95bc380c0953ad1b6d117302de1eab921dc5846f5bb912bb", - "d3759f9348a8a3f53dbefa020bf20041daa2152ac841960f994734dd8591a4f7", - "c01d03c012cb03645fe30c6f909d04d1c6471e25f32d6269fc435af8f05fe523", - "7bf220eb05f169f9299f63a60357914612b8c41159b1e67973f6679ea35e584c", - "9e422df635c106c0d28f16538af15f265d27ff24dec9a1de3790c037f2378522", - "cc7e84e343fdfa19a3b18b0719b8488d9eb298f6ff655eb57f9c7ff08f39926b", - "63f14e941800f44bca7072dbc210e37294017ff14e639a9f015ff5448bbc4a65", - "c283ae33ac7a0e3efe8cf88ed2e5940cfa54a78bffa5bb03c6640c26e3fa74f6", - "6fe9e15b32cce40aca56bf397796cc1c3edb0f02480c7a22669abe4ed6d2c569", - "ac619773193da0e0d7bc1ade28f63af733eb46b508293ebcf478c2714469e816", - "a8ddc48d1bbc36b9999b0da3e7718f948118091c354003a783ef98da95e16a64", - "c133aae9afa815a88ad6c40bcab98b7b42ca776078f3e1d1a9f05d025c6333e2", - "53b93f28dc4f108c64294706286eb13050e033f932193727dbc7f86ddf616e1b", - "b384a050be86daec0ecdd58bea03677d1694f9d7476a03bf7a767a8b341352fa", - "2ef5d9a80ac24d312e5a289a4b62401c3b9ac68c58cae5bf9375f3e7967b298d", - "dc1ac14e2a977835c662c59d3c2799dafeaf1853914f792879e854540a07f150", - "1e77c840d248e9cb9dec4fc581185c528ea7130a1b1ccf547cd99515af023db5", - "19868d50316c653aa0dac10447f7dc745707bb58a1e08373c6e1fbb71495abe9", - "4b539f9a90c5e68229c041e8982611675d9fb4fc507907f4c71f17428ab3f759", - "fc149d11d16719f08da54b38c6e80ad2d89e5159bde7ed5ea03cb29b8960a4ed", - "aeb27c625d4ccea61e50b73c8118bce29bb515d349b0f79e414e3ecd8d3d0f7b", - "d94d4d3530c404edda22f97587ce4884983d5c8cdf7c24689c66281cc4115d33", - "5c616297916495347fab8ec69a62404ea295f8625a1b79aa6bf4c62a571da8db", - "69582c4df3b110ae970d7e9214c5e13ba9e408d4193895cb8ecf0dc7a13aaf2c", - "8dfebb6b3e08011f6a6939dc7926ef07b52cf05b0d20370150c07d31c9157f20", - "1fe455c5685bbb74a69b049d6700ed2826ea671fe1819697de7d0545b3ee9b35", - "f18953bed3e9b6a6f00605b876f4ee54c3056484eb14f9d8105c160245278055", - "890649e02cc830c6b784926d7267da3452d45fb3c10b4f73ad495c0dea5bb341", - "e2428a06949c4f4e35717a905a80cdbe97fa665f9c5001d05675d680271683c5", - "7b41d07546ac342f42968915e73b5aa129e05ddedd008598e0d2b04f08d6294d", - "eaad4dcb73266f94fd8e04a0d54b2288ff704f3513e4f2aa4d1bd792ee9b5ec0", - "4314eebab5d10f58fc15a431881ae4f2e1806f9517936aa55e9f2bafc133ef68", - "3fec363ebbd35731243a84a6f7f113b13a4dafcde9d9b06bd80c99a62ba750f6", - "a68ba0a51c0899a44b159e0f1f2e8eaef03de913e581ff3e2389334348ca0784", - "5c4e44a5e2576ddc3ef9f2f29ff0cd673245915121ac4ad7e7dfe938849513ff", - "d11f6bbe9ffe3e267b7afb2d502582a4e6ddcfd7b7728fc47ddb0631139cbb6f", - "9adf0ef7e6b4cea0d09fefacc58e338ef2885a7c0b5e7a5af047c87d5316c4d0", - "c0de2b68e661fcbbc2910110f79e310fe3c584ba09ad827edc1137efdd96777d", - "928e3448cf4e7edd384ff1cd4019434343b7ce164143d9173998bdad2c13533a", - "3e1d830b63a0f16bd2a56907b470687cdd21af48d82a3abb4e7a4640644440d5", - "dfbde08f9e0a322a7205bd1038a190194a1cd22719b559b702b35c6307f28a7a", - "eaac262a51653a052369c18716e805e5516c46fa0341b56b802cb928c2fdd19b", - "89302d4505ab242fa2ecb98dd15fb00440638720cead2c301e9e41a955327a86", - "d59e8d0463ad255f6e57a7ac07fef6450ec71d3488f594e757b7ff64f2a3a251", - "8d276cc15baf41469747ac4bb082e62791b475e81e760a0c67a8f64a8edb5b2d", - "92252304b2917cc429db71889a3aa4092ca371ef9b233d3234e1d47fae2d5e5f", - "30a38a41582f5484497a06d976a1db99fdc04d9b1ec41566f6aedabe579a542a", - "5ac26a508cd14387a438fe1cc2937537d5d49c7d9b0ca9f504138279e7f883ee", - "1bae40894bf914c630c48a2a5bcbf3c1c53df018038882c861195ac4d053c474", - "5a68c354804599dafc07e2c539d1ccf43005840159190d93f1c733469ae30f19", - "373a88a09fa930d15888754de47d9500585e92619dae72eb1aff5dad0e028f8d", - "f7e8d663a0d0a7c01003bcd02fe9d77c292cc828b4c3dafe900d7c046760904a", - "bc80b95ba1de32ecbbce86853e91c469b50c56b0cb72b35a78a4512555eeb12c", - "399a968d5909e6167cbdbbdd94ae32ed419a833d696426e5288d21bcbbdcb55d", - "5fe4c585f16f59083ca82baa73e2097e86e63712c7fbb29a9ccee495228f6fd6", - "6788728d53aa39e5c8af683e88ec9c40cdafd91ee273749c995b6001f0f8677a", - "82a10f76fe0b10388a306409c70deed0d0a5039efe431d97ffa103c9e238f90b", - "b870f022d9dd91e6e75cf64855a19eb61f571e6ebd539f2979723a95701c0db1", - "2ef41abf4b9a48aedbc3a8f8b01bf307bcac69c10e666fbd928282fcbc2a926c", - "76485b1df2978731a4c7353a16047ad80ca4d4a463a886c3f1ef83c206d964ea", - "a37cd4cd8171d8f9afd4ecf3991b7905bdea0733c75046a1cde9cc4defd557d8", - "f0f719fb73bd27fe55e465d41dd15e26af29fb2a1ccb99c8ffd0b83820353560", - "bac855811e424419b42e44626ca3ef7db8a495aabde132d2e2b26da666a8e71a", - "2c8ca792076ceb4ab051b37d3d3023a8a73d40684600f98fda7cd4e99e5e0b44", - "67addac35bc9320c0cb4cb703aa39be2725b22d0b14ddf3468004f799f8ac4ba", - "73a7e42ef1ca83c23244ec25059e9a7e4b2a1e08126e46244392b557208ff8f2", - "6a61e4257716bda5254c9edfaeab4e25b537d086531cdcd12917d617ad657b63", - "08fe1ffa72db49e914c2a6b67b7eea8c8c65a93975828cd223cda794af42f6d7", - "bc4b8f1017abb115d5f62c6aed8a7a3c35275b8fca067a8bdffd7b5f87b7fa88", - "6d816c5cccf219c9d632dd096dcc62f40c9621ab9f9ec65d4336c6f330cfe0af", - "82f81d60ed9ed1f26bb5af3a53b32c3c081638424d6565998c7dbe7fc7859bb5", - "67656eb8149b052457d188553b082b473e956d3bc650aadd55a5d037ad712c7d", - "77b30af96f960f5058a1e78941e535ddd23e91eec162d627c01e16f071370430", - "4a1b02a2862b20d001d1bf8e357d769253868b41858f81df854dd7dc66c42985", - "4b611274ce7a3a63e34f390b3ae7361ba1cf5f6f7f3c915cdde5662951791c9f", - "bd7d90795fb8e7df058851f41d7f177247d68e39d756ac63cf0121fa733afa16", - "ef1e2385c86ae08c3b4f413de66dd6bb30c4017c6814f2259279e0f76538c847", - "6a73b128fce082d0639c39ef111e874ea9d5f1f2110b59b7de744263ef8ec9d1", - "96cbb50a9ba2864d9238144a708dd89df0d10a51b1a254da5db52e1abfbe3261", - "caf5920fe1b4bd08c65bb3f631205e6424ff21db0286347480f9d3e59013d86b", - "2c5eeec60c2db3aea278bf7d0333529c352ac4cd98ca0a1e6ecaa3ca2ef4d50a", - "6518c910d7025f152cde9be453b321c5cb96f133af22b493eddea8ba3c5710de", - "342cefc08daed03f6e159fd930a114fc75ce3b5c9db4e2f6205c3b2cbb90a778", - "4a9f4100ac02d327ac4d5ce0f620cd9fe76f9563423a0dbbe0e25eda09a9d9ff", - "b79ac2b2f2fc83b58550e4ba34b008bee1716e8f92588b3335219c74caf51874", - "cb5edf7e2871108c75805f9c860f4d7574b4736937593a4effe37ff40658c6cf", - "53cdfd8cdbeab19b11306a9d7950226bcd83a23fe5079e36031c74f3b71e1bf7", - "ed99e038d5d2fbc46b65b2943f18dfa7086cf53224996f0ddf359de2a4bbb31b", - "26e338c433303fd54c7fe58510515998b8231f6ba57c0e0c40db81a4d3d39e53", - "887097c893d245ccdc1eebc9f24c7faf66309dbda9ebc95dc7e337efde64776a", - "4ffa7fbaad692827b380dbbefb472256f0f1199b62058f957faecd7af0111882", - "5c73f0a66e7a8b7ad76916bde4d8ae16db27bf383b6187c8a05c6b7a17581b6a", - "9c57c842bce877e010570e70483a578342b61feac787a57ee8c686b0b53f5b5e", - "e1f878a362d8071b1ab571fc027abc3abf263f059ca0830a833378e13fc2ecdd", - "1a2db1725312f0853bbf5fdd85697dc4d0c8445c8d8c5429bac729985b80a724", - "ca0a664a2cd7d9dd44179e63105009471ebaf6a65b64e960b6b021747ae8d351", - "301c3ef2346c54ba014e66dbe1aec95a3ce494300650030fc75479f48b82eddc", - "4420446f95a76cf2ad0bb630c722ab9534b016b8f5e96f118390c4c0d221eb34", - "331550a41ad816cb738956f74a1f1548cbf34443ac4dc896a5b72ca26a76d5e6", - "4610d445362a5f0d2f9161b2843a69f7cb37c895c5d29891cf0cbf64a5432b2d", - "d3d7532f4007121febc5364ab6a1642af5ec6b7df44bf90d6d6684bc641b74dd", - "aa51dbaa34fb42df15f589e3c1048884e4d378adc7b7b89621596a7ef247f68f", - "e1912ef31e16eb0ea7e010435a4164882a997d78e0af5562a44e782b3e0ef5de", - "7e817e0f3917541a9341995f636795f5f7569aad3af7ee53157d2c229cf30479", - "35a498ae8781e01a97fd26b02f3ace8d9851755e2f6b366c8987d30af113d39f", - "6f94d344ba0ea57d59a9e8bfc40eee02f3f6a26a3ecc7c8aef0d8fcd66681318", - "615e1c8c8f89d6f908fdb5cbbc18316fc93a7b29d2f0d82d9a1ebc5db47aeb51", - "16905e72c87467cf79af5a2b37a153f76625bc2553a28a741c879bdd9d54bbe4", - "540e513fd40085533b8aa513f4a8b6d063c5bfd822b67c6580bb6571b848053f", - "aa0dd6c0c5a99febdcd228737c139acee70ddb658959c9286d4321c98b008d08", - "aaf46458a13f9bc3170246de75e414e859b5066d332b8a8cd7a375a2191a64d2", - "1307de0e69201986c90ef4ec21ca66839fc468bf5ecec33f76e4fdeee45c63ee", - "0ac9daf94e66cb07b8dc9230f5a284b87a87e4d529f83109283120c434bab468", - "cdbfc35a6548857e3fa192ff21e39f5ce6f460e8fff5289318edd732b35dfa1c", - "064d633af8e8bc8138cd3413f8b726b6e53d8641709285f2724f8b3d56b3df70", - "861d609ca6a7c1be4503fe0b9c819fd84b244d70080be01e3f534a34a8ba2f23", - "e2bfd6f559107302592a0f445c5b3bec8656a2df43378a0a5797035041870ece", - "3632492eda5db1245f84355cf02b67e64899dbc96ddb92ba82cbfaaeb23ea77f", - "9ed7f45aa5858acd0ed0a43aa7e30154258c91d39e834e6e24094ef055471248", - "e32498e2d5c812c31d3534cadc68d14659d6d63b26dadd186a58a917e6215047", - "db5b0a1c6a38c253e32da2455f80e2406298af92e390e1bc135dc67aaf44b211", - "dd588dfba70ea8ae3d6a495b188c8967c432eb73e78c4aa5e4216b2c403f0c47", - "046e5c2cb8e22a5600078faf13441e2b845c0cd555d1a9302af14bb6c6dffbd6", - "19b0a9a923a9eed036e0c2d9ed306869bbd318f9d24a362163dee02ff669708c", - "7007ee206a59bd656cb323e1b061a48f13508a717fd623b81cd6fd6773c86d7a", - "32986a74d7fe57f647250f9ba807f0125d44234a4d23e93f0dbc173915389a05", - "d9380e53535f569dd7cc94b9e8134023ed0691c06e50993f4601455b14a0a4e3", - "b12240b93d91ddc3bd907abe34e6e8c17b491dc3f77fc3299b61bf88b1c6d66e", - "7d689781d8f06047c5597b32a8a409504c79c215e63918c597d917ed17b10d07", - "488032163e3323d9725a5a6014b7ad402b6833fc5d490178547b3d0c73f7bfdf", - "9476ae9f88253f2214df78d7fcc1b2af731bcadf40f480afaba763853364b546", - "25622d91777c5472020bdbcd2219e9c27b0fd9bdb9d972ff01f057f0fc724621", - "6a3e5b4f6884e25ee30ad8689fe7ecd37c7eea76915b936293164fd8dbda60af", - "9b2d21444ff36957be1bbcd9998a1572032071d1a0c56eead00cc3b03109b27f", - "ba0ed77b46a47ad65ffc418b1e745bc526c9bfc608eb5d4660e7a9ba6146f38b", - "2b4eca483a6030e1d3152962bfe15096bd1234c0bae9e7834b9d10998c6c3300", - "ab60ea06da7fefe95444bd81c74da4cab3bd17b360f2cd69e9bc261f4b3e09a6", - "375cd6572a3a63b32b479c71456d184feb7c673429c43a3c9cd0c1148402bba5", - "440340adb6b91cdac1d4eac6569b492f4ad975c6a66c6e6463969f274c5e8659", - "f643d701e1ea5df2c0fd2709cce8bf1a81721167c21c5293b0e112a8776c94cd", - "de55cb63766db9dcb5b8c7864fc5b12e152d1f9f7a9ed0449175b7e43b6945d0", - "3e079a2de1a767448d680f8e239ccca70828b8d1b2dfe641f76f69cd1f6be995", - "a684e262ab40e81db640b87840e7102c82918771fcf029ae93bba78a6e823c9c", - "eeea978aaf42824ef2f7e043f3d8ab4f9cfbd16b1997a37aa73d288d71ff3a04", - "4fe3bea329b8caefdaf9ca26512cf0fe356f3b91bc91c2de1286889139dbe334", - "af28cc47c32b6406dfb09a9ef1cc9dee63854b23ebe12244f96976dad61138a4", - "2b20afb931d90a62c51591dfc262b005ada0c6ea87e81d4589b750daa75e1732", - "9a995422bec1b02e82fc010d4bf0c87cda2a86df9e89a5505077590d4621f737", - "9ec5d4460e3e1fb289d0c2160f52a7df15f2cbfbf7401e0347d60e9a77393a72", - "3cfc3adfc0b0ad54fac457b734d1604eadfe3cd25e8fd75cbdc0cc786d46fc9c", - "3d091e0b1381e791f99eab2cf038bf4428b09a0fbab603a9db1d0e08ed7fc31c", - "e1129ee3768aa8df7116826111fbe483689b08da9bd418081ea7632f54bd9d05", - "63d1c62655866b2b604dba9448f86339e3d074a134843c23622437286f0e937c", - "d796a91830193c2d118ca38ede77c50fdcb9c722c4de7adcd783bf10db1bb865", - "d93ff79ba0fa5c7b467f6729241ada1844fc3574e2b6b1ad70c2897d689b1637", - "8f55bd4c6f9fdb0b9144e64692e5b76d4e3c16b5c52b6dbaa628e85a156c6067", - "585e1c4e5734505a98f35e8bf1ed1d850144a4034a4d87c5e3c8511281803090", - "30a76a96beb85ace88bb44a06b1c2734fb78569c4effc017918bb561133dee8d", - "e16c76fec1ffc3a6a6f67c191373e642aacdb9cc7269ff97cfe754e64a0e0f4d", - "11ddc5fb094a2cf5b7ff87e70d388ce886014db3d01f6a127ad9c3ca6bafc3f1", - "b8f6c7394ceddb7aa74bcca09047f9b8bf32f465859337d0937dd22bf871a4d7", - "3c3c28673299f251d6da2e1c4ba53389d14a23a890edce1a9c54f6de1ab4482f", - "ae21741a1afdf73ee0292b56f310814a140aee1018f37d47078559a0ce691be2", - "9341c39573eb340a7fc76af989bc6df675585e75225082426b91af97ab520f60", - "e4cb517d4322a878548fec82d47a335ad6649dab9f594ce681c7b0d7eeecb157", - "00cb28c3fe820968a687dc77ebc03e9b6a80e67088851a95322aeaec648ee028", - "f9ba185516c9d9bf431b6b7b8f0dd7f06d9660be5cb86c51d63b36a05d339569", - "5ad3fbe5d859115c35ec54108b98147493510fd40eae09c371619ac08ca0a18d", - "d1a68c378adfcefcb8aabdf01593f96a795e433fb7fc08cf5a4c6b633c9719f6", - "aa78c9c85e5c193c0f709aa5ece825b55a7168a29439e93d27950358263d2885", - "61ee46474a8a0f7b5a2920f66cf1e9ecb6d74efc69b16685b404c674fb50da3d", - "1af19b01a1ed4624834fd42617d91fd139e762f174e623dc119889675be67c63", - "60785f2f94febbd4758ec72d43ba32e32b417b3117f810553de2cdc7bbe9d65d", - "32eb41723c5f294b35c8f01014047f3249986f2ddf8afd87a50ad6fa9cad4161", - "c320b033ecc83e90288572698ca204d5a36ce4d5506332c244b93cdc169c086d", - "deaf2ee2073bb2a95b24635637e4a001cd0dfcb857962890a2cd2761823cece5", - "3c934a6664fcbc4fe3da607c42a575d9f740ba92ab91f1e35c000c02544b3f84", - "55df99a5a7f2aae47311e55b566e1f6120fdf9e53f04b802fc131855eba400f3", - "a5d9b3d5dabe7be6d5717ee7cfbc1619416148b88081fe65944ae17e8789ba58", - "e2d16f53c70a233475845935da085bb17c8fce14896811a9fc079a95039e3cda", - "dcb39f4f85dc0f161349ed96ce5c6f3c8be4918c2ea2b3bf2c8d0468eba37543", - "f0bb65771d4d6b582c253dc2445611e36b6a8275a164a811530413fed66b9081", - "699e6af35fa404afc00bedab672e078cc8256de5f48201467dda7558c20c837d", - "00a0e062bcace0861feda373ba3293d2ce4f69fd929b867cba4814f9ca029070", - "95b166ba8bca260404b16758e8b842eeaacd81b0879d1efd1bb2b9eef0875e69", - "a13c49bbf00d41126cf9648af88285a997bb5b91723d282a0c6ebcfcc45d68d8", - "261df05f17cf377246b608dd8afa19a88ab71d9c2b35be32b145a8a754a878db", - "002822046d761dd9820b3cc9588ac949c4dd636e6bdcc7d3e1815a7571087d89", - "11117653667b5d80a7b9d5c32bb79a0c04a430d1287441f6d942f1854cd21521", - "c1bd8b18b2e9477c80889776830ce4a5e33fa2b509c7d2596c036a991a78dcd6", - "c1ce48929a8c7fa720486f8d85499f1b3ce90894b4821f66d8483f75d09ada51", - "a9eeec7eb59e9c56f28fa9a75b7435e48d4eec6be463a4c0a628ca8bee25b3d0", - "b9f59236b1e15e8ca6ab518399a05b1ae5b31fe3f31188298e3b6e27d833ccb8", - "ef0e936b6d8216e3d6beff07cd2c585efc99411dc7ebf1be3570445f2d53eeca", - "cd5e48d1cf362315fe142c5155fbe5a7e5876334161dc8610316762aaceec5dd", - "aec32fed2bc39801e3aeafc536c616554d7331ab831bd99ba33645e81a6fee9e", - "3038c469017eb31f087f6241e3a8fd9fcf3a33252dabb854797c2ea4d0b66e89", - "2aaeec7166c807e08591bfb97e65fb194f436eff15cd108e4a468a2ba653062b", - "1f35b654d8bb7eda22c2296fc56349655a975c9311b395e4c456e7f105c12770", - "3f951ca36b19582a3d0ee628989d0740e1e35840e0f0ca1eba1b9cf5c4fc1b87", - "2ae59349e3d0e534e81898a0626df2752454be7cd8778e1c85f56cf5dc773f50", - "acf0d6a0124e565166abeac11a16d5465384eb4c0cb0c153c92c5857bf3d5fcb", - "596801442cc626a68a44d634e3483fbabacfa20bc122465976ff61af3d1009a4", - "72a5b3f9736f6428f6a025042b4e6d9678c5596dcb0de9335bd163f2a68c76be", - "56bb15a6c0b0a547f8d6ba842cc1a0eb23e78d78189016832b253a073291ba63", - "1b87a8cb3c5cc65221ad5ef198ed6c68bfde099bbf661a0e930eb4e3a680ed68", - "eb64b75e7373d2686d172f4cacd583d82f4d265b83fdb9910856c702e9e7eb28", - "5682e9b33170441191cdf895baa7b2d0327185c6972cd1598169e3696ff5ed99", - "25d4811e4a537410d1f1b585e4bbe0d4da948ebe9839fb36c1d103c36a69b5e4", - "2bb2d957038b7d626da669fea8329f6383d6409560d1dd6a90f9f4dbc3c018d9", - "1bfb724d97a1bc2aa9d1c5321cb3478779b985cd3f4e6ffed87968be68b872ee", - "72b271d9cb98627000be847e7854a012e9abcb6a9b5685e185c4f102105c09b9", - "97417f3719fd90b58c3ad8656778fe4dcc5bab00dd441d9f8dab0764e235f39f", - "acc30d39e7035e23eac5f0ece6a53f83c9f6d7df502ca1a2526864f9845ad565", - "aa17188f720ffd3883da4845ab84a07227434a30f0a3ce7e6803bdbd2f1e0e12", - "3426b02f1f55b4b71b9fd2ddb60c9876e605cebdc6bdddabfcab8b2f343d2879", - "8fbe87542ec57568b63ed61a1c177e383d69a4fa74e47a996a13446f77025dd8", - "2808d49b2f0fedb53965deec8a9e1915c40608be091d492a4432971bff2394c3", - "43d66820329089c454e850461852e8209b4094ab14b690bb375f544782839d7c", - "8ff3c75515b6130f11c0373fb8c4e53f34f468ceb5393592bd0261974358ba61", - "9a8559a022a61366f1c6f8969a94792dede501a78d91007ac1b9c79ff6bf73e7", - "1e7c7411bb09ecc2c444b1fc71c02d2391eeb56b4878516899a3fc170a548f79", - "aff20fc3506d0dbfc915e68bb00e9016a037074ce927fe067d17bc42eba45219", - "84aef9cf84da06729aae389527a273936f9161a70dae04da102b95100bbd19ed", - "677a3caba804c50d9943487ae246bdd4007715862555198491fbef3bac54a5b4", - "65ff9da3de8b20616d0f08a074c49d9f41bb8984f467074096a6f76d52964569", - "6cda5d48211a49a1d01f0e9d923b9e042884f0e10a7293f408dd7977d5938fbd", - "4055682baf025f6dda628a2de5c95a7c5654747521f583bdf789addec126f0fe", - "662d56621dc5eb1b7832e878e12d2fb6982b5a1ce7b29b17da1b9b5bdc259ebe", - "74e3440e6005d505f1629a7c9cbd835daff9247d3e3c22a612ae89b22a3e0b14", - "7997eef89f4f196e9818c39cbe7c982cb8e0a59321191eb54f19a4e5e82ea33e", - "23cfb01f119803429b0743108ab74d1c09ed117490c6a8030db283089084d987", - "f4ab4e452101452e9091e1f2f66e9318a408cf464fef5b39113c46f7d8987275", - "ff8db620bb3f826dd06073ccb8b800db396e99a98e134044252c6808b26b4d15", - "bf726c755e57b983c23c6f6b71dec0ad1fa1c2787ae878550ae90b164bcb9c8e", - "b653180943aadd15cf3f35157acc5820d7e10d430b8a968aeecc50045839c69c", - "6b9f1710b3cd75746e5119887e03c4891e055f311e2e799b3a9592ef96f128a9", - "8f75cd76f30699ec84128b82d13da0a56ecd5254a0f4dc4c189aebb7b3386221", - "c9ac930cfa275732abf6844a9635b5944eb530e68a17c42f5e2c16e004379111", - "648bb0e6eca54d5397852847f997bfff0f3696e14163678e2906ae4c3d324cf3", - "d11eb64e15c12775ae06088829466e5096ec242ed0db9e40e37487d3ac6f78f1", - "d42bcd353390a162b7e76d778b496c83e98534770f48c75327ab44b009270986", - "90205d906aa509162803d88c595f913e4350fd47c076a08f86fb187b287bfdb2", - "f167e310b6e07a84bb948fa424d23ea22754dde865ed9342c577f6c915b7d8ad", - "2f5b4993ebba5ae66cb03c915f006fb10d47383f54e4ee34a3990aba6d54b07b", - "a6e945301211b188bcaca587b5c93960af2a6b83dbb2aa02bf7753e878d33709", - "04a15b22fb833dcead077fa8f9f1034c9d19191846b3ceb8ef601e45c81aaeb1", - "9d04ac9d19e995178494f904e5e55492e803b103642cbb3f34c8a1e30d60faa8", - "0f31797a44cde6faff16e230899880b17937873340424a559aa41a226f80442e", - "aa8326b40ae2056d01d22738d33655ba868a6fb9a999a1eb69a27c23f0c7c95e", - "c262925dbde405ac73f524127016a6322711c802842f3cb9e1c426c98448debd", - "1d0edabd6956431d01888d910b7ad325d7fa96cae3c16fb455fecccec9ad0ea7", - "eb205c2b458b6cc1e37bca63a5bc3468584d68bc0afba805d7bf0e81abc733e7", - "d96572d659da717cfd9c29246d18f3e6ef29892292646b2050d2f6f5916f350e", - "aceef14d5e1ad0fb38cea88a9f5fe66dba485c14605c5af1e5f26d6b0962b896", - "98695e3d69ed0a33ea6eb82e9422971882262147d6cf6e97f7925a9e6bc2a441", - "fcd59b5a7354751b531b91aa46f751172f791e472a299cf9e7d53692fcdb4529", - "d91019979d389db043eb249a709fd3e4142f0ffa9baa7971dfc020327c51492e", - "836f3c63af450edcc80bba0ef2311bb3e3845513015877a6bf7f0507c4de304d", - "0da98980e035ac09cc163120e6dfd81942d019bd5955f472b918ff5531fddd3e", - "41f436e9bff38e3ed262833e98fac3cf4f9b95286969c96611f9d58bdffcca9e", - "2b2902219ebbd054f5634e0f20964bf05cafd0d2da1f61a777487919b4413683", - "67d918592f00bd9710b5d7a3c7e545ff7221af52fa9ea35a23c7788059918c86", - "b16291a2b6dc9d23add8736042e50a85728ce6cea445cb31791e5262789b5367", - "0201781d3be77615d09ca9aa20a0c572bfa3c09373754cf6acc9734e4cf583b6", - "61a0cf2b1ee6c7ed9a3c3fa69b3c23e89cf70be24cfa2b2b2616a5f8a20ec339", - "63c63ac1b46fac2d587c739108b51bf2a2be9f2a98aa2396409a482dbf0fc6f8", - "7a9517b09798b749527cad6aa7353799258627fd3bb43b363dbb99c353a12f37", - "d080b7e2ae54de15ccd5c1e7f960291af6d8e98965749f094299c9b49d152a77", - "d8805b2b1a06b88e43a3a6b759580fb45c7130ae364a0de19e48dec5d1b504aa", - "8e6f912635d0facc09f29e5336b8d2256b98710c6df7337ed3bca80544b36390", - "d3d0954fa5f132c4b8381a53ef67aa36e7b3d79215f0792eb498d07af2c309ac", - "2b8c61fb829ede4f65e13d54c2125bd1c817b1907c051bee1fe03a2c980b4068", - "975e8ff4f9c503fcf8371e21d4a61f2ca1f0ea90663421f967c0fd4cc88c3877", - "d9e92fea3791024d05b012cc4445c45cb1e3ada1c8d8c3f02eaf95175e3f573e", - "fcd015f377e393c5fea4f8cd245c7ecd92b66934c9ba5d4d0171ec96e7b45cf0", - "2350971531c1f2aa05c2cef4ab64aee52380908520ed8532d808948f3b106a66", - "06e7eb4f7b7e3c5671985bf69390f1edd7a75170d6bff22457d8975fa5d8245f", - "6fa229662166a3221769716edde5cc2156b1c1942e162483d1914d774426ed27", - "c515eec89e423a760a03a0c50667624c4256f819faa161fac32af97158691bab", - "545ec604399d5969bdfd55906439dd54d43a26f2b1e20cdb7094df53788cf71a", - "d654bdbb6255ddc2fc05532a0c5851797dfb1a3753ca71f1d9c00d16c2f3fc64", - "ac97e34df08e0b9191496081be5ecd5c1cd03be7823258134b0ca2b71da6ed30", - "e9716f478ef24b95f6b9406ca7aec210560023e99162c7b852d91481401fa2d3", - "0161d624274f7c98064e8041c86fb14adc972f6627dd69440a78fe7d850f5b44", - "72b59c35ff08b2a598bf099e64e44b283be76773a2f754983cb5f9e99eb5f1b2", - "129d4f6c9097b40c836fd459d085912eae9c680ed19d8ff50738f0e0f958e975", - "fa085b5223b2fcefcdd4876aff41e2809130bf89bda4785752234e478996ef6d", - "24aa2ddfe35ebaaf0565e396401f2fc361ab561032aa62c3eaaa5de91d46a677", - "947ba348393449a60e30703911c967e0592f716f51a2cdaf5858d324ae722bb8", - "ad987eb64dd8dae17a3bfa16d69338a19b2c8023c3f028074cc6f46cccac0375", - "0fb785c7d1cba547c32fe99b52a12846eeb29ba01de63e1a8079e28701f3733f", - "f7df7d6bf9a6b55790d15d30d2ac9cca8b3d5f40684636a943a146d4f5afa8d7", - "eff3495942782c123b7bbd205a357658e7115180c84dd2ddc83b7670de21c244", - "2a3aa1723ebf207f72d4f1b5b1f6509ee13f3cbf487ee8be764bd1ed8567aeaf", - "97c9ec6be9b6b973838a684fbe3afa91348baca949330f15a3d4956b4b4bcf1c", - "aaf88b626ad7b560e8b4e5531659ac98ac283abd14da52b4bcda098a7fb483c1", - "60c2af1e284890d062488da29a81dc622d5a4bd1ae673f767a557f068a9fc794", - "edad883cb11ac19193fc99c96977749f97a89b7107e2aeafb7eb18a1ee85062c", - "d73da1506ac9856cc2ad2c3da0eab9bb94417c3d5269f1856d56619cd090d327", - "50919f6c5ced5ee84b70ab29873002217c7016276e1b20874a34d37aa894c9a8", - "074affdc3f687d8ead4c50111ff8b46ad35e93a1bea4fb328ad16c18898f3810", - "3aaf2b62394b3e84f77b976b28d3a6e3228b214dd2a878045e8c99a99320dde3", - "04659f478f4e4c6465ba2bc2ed2b256510c98e8071e97fe7a7deef0449e98b96", - "445d942839bfb20bffc85de5e35db0cfe776e9d06398f387d79b8ab5694953ed", - "106d783a2ff25cc718f8e03432c8b04e0658e32219829eb18e1e7db528ddc1a2", - "44ea8c47bf3cf829398ae697c0b1ddb9d18c561121ee35501b0696e50a5cf7d6", - "ce7a5171972944b2c822c62a6ab972b94dfc1e48a78dd82b2b4ccb3a13c5b209", - "9acc300075384816da087554f2cd6dc8d430a8b029bbb5f129056dabe8509385", - "dab33e832a6c095d18f298f3d4a418b5fc86813043dd4afaef405f48dc7456fc", - "813a9201f4d47a51b2ba613888d4c581273e3a2d66f84e89149869cfc8af4904", - "f4f4ff2b35ffd24f54f4cc4d0b96a1fa9f9f93534ff4241816c20d6c831acf6f", - "27b9224b41d4d5269f7776eb37179fa2517e3a05a85b9a226473c8445c4047e7", - "6f3dc9c6e25d07afa7b0907ec7268ec4b621c192ab9a602c3b7812a8dfedd784", - "0610bf4a64dccc3176e2c603a766dcdff6c85c988374eb11f62c1f6055124017", - "f2b2e11bc093a101ea21fa93e1e5e442163f399823ddc0820cf5af16ba65d49d", - "df477b56d83d7d2f9b2eb88672bea130c8136a9307f34da978eb1a8d3a26e15b", - "6f4dc40b0a9483423a0e5d66121996302a9c16bce7be9f5dae32dc60f46c58be", - "db9d44879bfe51f110c08862062a65dd2c9dcb3564c538329b70c36f043f0305", - "70d6d020dbd774974e0a0d77df8e501b20299a3a983ad3fcd78ed38fd10abfcc", - "99f1003d1fea4bcbb04aff8e91dcd601f5b61b86bf182d20a23d4dddffdbc39b", - "4ea8b07bfb61d836b809fba17dede659b7c9a9b572158039414f5740c55c65d8", - "e95023b76d36aefccda68d5b3aec42b730e01f0ff37640392c040a0cf1fbad78", - "1b24b5fc7d2818a0d9f7f01216cd09003a2e234b19af75a7e6d94c01b21eb56b", - "50edd7b34d783948944cf2f4b69d19bd6e357b8fede27cd3a69eae7a8afdfd28", - "c600276314a07007a5980e20d3100dc181495a4583c2bd964e438a7acdfffcaa", - "b9da94a595e0dd10e6e9c832cb6fe22b06e43f074e6747885f368d357e53ddb2", - "fdbae6fcb8b3dce2bc5988f0ee6f491b5af9d67c56690debcca09f9d54391b69", - "f08074e9cc83c04f002a7f5895a3d9831ef5d81f5d324137109e358f6da49fbf", - "70afa3737f790a4b302301ade3152acccb965a9aa079fc6bac3c36374d3d6bba", - "5347a4ba2159b62dd710476f48ac831e04910f2cae66f47fb1f7b5307c15c84c", - "46ea6b3090ec6d563b1b04f4541c946ca92082c3353830c1e187243fbc7dc5ea", - "0aea1a1253172102b71f9cbaa61856d50671e5d91c9fe5f6a40b765702f46a8f", - "85c6538a570498ebb5aba1dc05ae530d65cfcfc4c477781d3ac9cfa1509e7bc7", - "7ac9ce5602035ce9cc4ba58b86c3ed13f699e585e5864b6eae0d166978ed6f98", - "cd16e8f239d8ac733da3166783aa52a2a8b44a6edd2b4fbaab7fd52a5600b6b0", - "c61d84c13370cd57cfa24c604e2b75f8cbe2c246f772b6e1f994ce6379ac57b4", - "6f666d9ffc6ff13ef53c0510634615eef28a8b48e00231b6153639e7d293e13d", - "4b8c431b9ba9245b3fedb272c91a8a98ea843780925e6de9066a74b5ad983602", - "85e8e8a76c22f322f8e65df5800e62709d822718dce8f6b5e8fa7877fc0f7ff5", - "93a8ff78ccf058340b8125b3e117d343e25be0d8fb9cd24c4f68d609d68c1da0", - "93cfcded4256b60422a3a35a0c94bce975afee95a15f3734ac3a3a076f6c93f3", - "ed8033f9dad6f13b1e73b134d3e4fc3303e6c1fa5985bcc4ab43352c21264f3d", - "ad58ce10603ab9899423a22c7e10f533caa75c3120b514c799c31e316163307e", - "52fe6a845cc80e32b87571c27ab33d633768573c7ebaee4a360f8b1e0b7d17eb", - "5a3298ab1977d7f65f42a612c0cfc4ea1b7960d7daf5c88c71ccf7b44f866671", - "5f5e26ebbc63e87c3711b52b80da9d344490ff2bc64f2edc9c361bb5768085e1", - "2d212516499b3625fb26d58fedefe2018ca3be16aa1351026fd4d6110c4c8b89", - "562c300ee944e60ceed24214b2b97453579a024b606c0b25baaef50440d41fed", - "59024dc6d53a26174f054326f6cd2efe453acb379b9d0fae47ae26e9d0b57f4a", - "13527b3c877489032be61ba5d22c5fc0d503ea6b6466ae80fc4f58ab081b8d35", - "160d02b589e63498eee2f149a4afae2ea96b74a8c625dd19711e4d108f75bceb", - "ca89e3348017c9b6681f6cdad2a1d49ec21d31e886504570cdb59a7a3bf2986b", - "fff7bfcd716069598bdc946bc2bc5b3e86a71d99b29f31c55020fdce095da4f7", - "acd6af906e0bf78ba1e3708602e27a8b48d1e59326a1c87a446a136897830289", - "d6e96326ff51f28ada3841fbe2ddaac56894250b2dbc5a56ec255a743dc4ac95", - "91639e4ec0e73fde9e440f8986a3d32719c230115b0e56ecf74ee52a684b21bc", - "b149679c7750d61ef52711c208fb150cf7723e08c3dfef59aee8956798f428b0", - "bd69d4dd603828a0d733bde3320454f7c59643def7ea6ae4a09c3bb1ef1dcf6c", - "3abbb890e6e97051eb2969cac0d1d81fa83bafe8cec9b5cfd0468766ea6ddcde", - "6a2faa4606227d1d6f7113ef0008f7de19e14bb149eb0a48d7149c206134c256", - "0354e8b15da79541395848c180f6ee98832e0930324a0a806c72faeb1352e381", - "15c4d63b134925c9dd15cec77d262fe78d94f1e63f34029cc964f4ba1182622a", - "e3db81454136a671cee1c27de4f8c3bde39a2e976c23d0e82a95bce824e54cfd", - "ce12c5598358728d38dfe82acfbf18fc61c2122de29e6dbf45c7b3edc83e7866", - "06926953af7dd5a61fc7afe88595f0672c62217c74796b043271bcd7be711515", - "aa660fb1985eb2233533f74cb5e515fc04951333650ef00d7fc41d3dd2b711fb", - "9181cb57eb9b4159f07ac073a99bddd6f975156673f330b6f2a60948121bb9fb", - "21864a5b566ba314c58609ea29d5fbe2749e27271ae2e40e26883b1547c63011", - "a0ba0e488c231587837e4478901a17293a49c7523787865ea60c92b6287666bc", - "0ac7e098bc4f04fd9567778cc063518c17bc5359e197da1b7c9a076685ca3eee", - "cfc1d00dbc1bdc4c9ae54e9a993d2ce35251b4832f674d77ed4b480641c9029d", - "eb3368310d4d857a943c6e70a106ec20ff89e1fa541bd0684427df8aab3aa213", - "8b0fe1b5a81afddaee59a7a82a30e933187899c0c4aa1b737f20ac37de9cb29f", - "54c6f50a81435c42a0e8f28248d4d0983672857dceee07e489d3fbbf6892a52b", - "a94850b3c0962fd95121d9099e71defe6f7a979e9e423cfb7abcb190c8432d1a", - "f908899fc8ca619bc1512ad3a0b20d5e287bb28f880889a7f0fb95b871757a35", - "e646d7f9b1ee617ebb5bd73d9ba2271fd6cb7116de10fa49f5e4afcecce0d002", - "6692a8569999f1128eaef5890df9330e5f978815e76cc1c3509dba2772c20a9a", - "6bbd6aced50f41d6e9f854834d9f9f7b6ac1902d23dc4ef8da34d45a82e60cb7", - "e97eabf383d1b664616cadf19559b9b3e7698febc6a669b3268a534044e15e0b", - "8bb6df0a316b99f13dc10a137e2e2c3f1eaa018d7da95907f5e87dbe4dc0b36a", - "ab22f22a45bb72644607217ab08b25220a64530f094481b5cee39b5127066c69", - "1225da13c610708738d7df3796e859b110a3b17f06e6c01b1bf65f9a76d10b77", - "afad53279c76112ccfd7f013e6c4cb648a76af1e7d20d084d874f5c1558ed236", - "e67d4ef41a974eb3352867dffb7c49b270aca7c7c117687f0009aadeb9be3f84", - "30388f3e2ff0749a1a2b09f79e4b74ca6baf5233f61654b9b1fd363a2bead881", - "6e1512fece8d344213d0f2d69c71e89413c43cc22be9bbd880b5de37b9ac34d6", - "74fbbc34d82237c9532dcf2c81de549b63b95bb0f3d99b728394b382e17ad516", - "b3528294679ac1a8133ef985b1fe04444ee60ad0bdff3daead72ec3a291094f7", - "17501fb3f67db642df594ba6877a1b336b958a413912c105f3676ad40a4dca9a", - "c6f6560caebbdf393598162d136ee66e3b5d5ea75df8149a7e6dfc4af7f8ae56", - "ad7846ae5ad4dae3648b84e502e9d6ef13b4b711deb637710e5ef61926c53295", - "aa41d1785fe26847e6031388bb6dfef859064d31fda8c3d87004c020d3837210", - "7bc5cdf1cea1853c3e50dc91e12c7738c59a497319ef55a5bb1138f885888f42", - "11c984f21a02beeea7a94e0f3c83dde79212a728355296bb9907f96e8ac2bb4e", - "0f0c633662dec2faa9afff3f093ea77e83e606e3da28786b0b9ba4a98f50e740", - "5ddac374cb0a2276b3acd182a56bc9f2f235e143dc0bc1507811ccfc7dd5c69c", - "1238e3ab3b572b4f9f13980100a53d9d33b5390cfd3ce2c884b0257742ae16d6", - "2d14641092b2caf89259ab029efbefcf3edfe817ca350afbc0e9ea0f62f3f174", - "12851bcc2ea76fd1085091227dce4ccced30e9896b75ba69166e53fa6eaac4af", - "615deff7eb66b8bf2d38d7e841ac67c60e1549ac055b6a42593bdd64c96057d9", - "1a777dc15575f849b3378d20a6dac944843ef2496c2f2837c2224661d3168968", - "c261e71e20de9d3cf3a2a7766d10b0caf2b07772470cdb49625601b2f11b0c77", - "6f79c8f2c4656e0edb9c5a776b260be73730df853ac68187763a4f94db8e3563", - "cdac290eb816bc22c9f6c615dcac40acc796887ad735eeef58d4e380a51829e4", - "fe2cb732159491aec5b69a542ddf444c68497d9124d5aff6d12150099a77fc40", - "4499dd95f382cc9f559b652803e137b31c81910c6f27bed6f381d522787ab657", - "bec145323574a4bff97415f656b71b19ec869706122a78fd2ae9cfcdf7d8f3e7", - "b63d9309ef59c2b4d6e74334bcbc587ff0a63bc3ab5d0fdd0b8f800bd8fdd6b7", - "7f08ec686750ab7a048a4c0aacdba2aa8365b480f5a847705883f9db1d120aa4", - "325197bfccab82c74edb7c20505514cb9792f826f79c677f7a251c42e5c4b0e0", - "d6e490a5173bbb72e2581dab7f8be3345a1e53c3cd9507fa64d4bd46231da587", - "1d529b54e6f4819d1323ad13a41ac26a8a7c79cc5488219be548903c1638157b", - "533772bf98911c85431b1c339af3e52a2978d425615d1600d30be7a0bc6383e5", - "5a0b74be7a340a4174663068415c36ebb832c574adf790f4a7b2b4466335dac6", - "ac883d717bca14118a9ea0c116727c7d4718dffcb3a613351827f7d87321d670", - "4cda6df275ab069a8c60a2d3bef72b73ef7a221998796c2c19dfec4493c572e4", - "fe8f12898ba951a0df07f8bf6846f27e7888ddaec1995982f0507924003c28ab", - "61afb7d6dd8ca84ad542d65b9a2b9aba3b2a433c803162944c604ee1a154b21a", - "7c26fabed116864cbe1e9468bda7dc3ae5d148b2f17dc2615cfc371d4c6680b5", - "38814b8211f208cf551850a0e121c7c40e18a41411bac01d05119b26a085de31", - "dc0c272a5333b5a15ae70f5cc4546484a89f8e6aacde7aa668cac063c044829f", - "aeefc05f52431b9156853946f93c38b3887a4c8c18a1c1ab6a01422238385f60", - "08c422beec758b04e7946600624caf79b68ce2cc04986a104245c438101d939d", - "f90388aaaefe90d23ebddc4f95eb67c2bf4d3c8d405876091cbcecc57e6015bb", - "bb758477439fa435ad7033ca49c85c5ff442fa16f283e7417fe79cf7331795f3", - "04f9cb13c829ab1bc378dad8f3603c225645598fbe98d3ada5a985da48cf2305", - "57abe386a26c2e37f1f4c87699421e1e703e3a82bf224f407c2e86b2e900b183", - "d58251d653c9c9a142240d5d8d2f8e493968f7772b22f30a887dcb4ea7b6d2d3", - "8bbf405c7c4b3c49b15fb6d589fb14f51f06c0ad6857a8ac5f241161641b2dc1", - "406b9e76ca92939e683c644bd1a0c6736eced7e7b3b63bbea73d91e435477b8a", - "58fff278234f06d92f36b45ff6b16e51ce6bad110a2dbb072259c5889abdd08b", - "9b53f19db95fb729aecb8980c7034e65453a1b13a9d99f962c24daea069b94b7", - "de1ba6c88b32c8a94431d4af0ca539e7c56be527625916039a5052857efbee71", - "0d7d164a37acfc37beb7f6adc0b5b1de634fbb17ba16c3ccda8e66fc7e4aa5ac", - "1dd91b1964dbaffaa9be2317c26cd4f28f7ea0482c86f68c4d04242b297d66c9", - "1bfb63b0708ba12dc47b5e2c67d1751fbfebed1cc76e85aa8b298ce6845e2fcb", - "e06196f1d4eb1b88aaa37e788fdabfad877872480e379315a078e40b84bd9a07", - "971576810798a5315c80e5bf84424cf264dbbf7d54bc11eecaa03e6837d8e724", - "de800cf60d3aaa01cb056a3b9ef005b7a03c149d0a4432c939d3de7f7a663125", - "e3502c332beae5d45ee74971a4b010ffea62eae34aabb44f7c13bd40a0213898", - "7cf068e7eeb8c9dda6bfeaccea3dda2ef6228c6f8c7efd9d40a58472a7f2a20e", - "a2ebc0086af52801962a1a9a51f23980d023217de00e079f6a0ee528a652b09e", - "b9de541eb171f64d60b494dcf2e823cb6cd1cc1a2c3a3060b00d19336b4a677f", - "d3da18e7f713c6bd034916def85046fb9189815528bc284b6ae0a070aa04641d", - "fffc89e1a6fd5e541f4c4f730a34c10568a989ae21f8ad517c846b4f103683fd", - "33cbd520fcf2a6ab8a34dc2ef9356a331001cf8692528c95a4587485914924b8", - "30fa0cbdc9e523d1e634ee549eee7c5979ad734470fb93bfae452d94bb6f9656", - "f82b7d8b7a0ef8ce09b9030822415b1e1c8404796b8ff9e655b471968a534b29", - "e39e7dfb18b226d91e3d9811fff60cedc7f92a41d58911c41f6a436bfde80b9a", - "5a1465216ca56ea9162f65967b3f41fc0fcfe8a0214b359142cacdde6ce285c3", - "c3077fd0938d6e2fb81aa98d9cf965ba9b01a2283f710c2046e4ac379b710991", - "cc055a2735bd3c5eb6d9cf46cfe2e0377fc9cb0e4effbc95919796f018d3a6fe", - "f6ad5db7a267448ea17ef39e38db5c369900566d10281793e0949363c45656e8", - "2b4a10be00ceedf687ce6d39536132c7273e5b75f8f01f035044d79a1a651fa9", - "a18dd8a1e536ba37563e254eedb7eab4cf65dae3fbd90e88c64914d81c67568d", - "70a4b9f46265ac2db597947b5f80e0b2ebe32df46e107fe63166d7cb519f6b3f", - "535603f761d8070527863ccdfbd752e1c1c51cfa059a057b6565f23e49690801", - "4a65ad74a64094418f50772cfd9dab8389ed0ca0668ee0f11e56a8351e765b18", - "233f3a4fc05c054b1c5dccc0c4799df653c089e97043505586787e161993fa5c", - "39f3cf82c6a0946e0b71c93d00baea97122c94227570b005a0a20b54f14fa562", - "9019e68f28db0f8b36fa910cc07a698cccc0a79e5b889cab39fc51f4f359a8dd", - "e59ae9be3596375dabe0afdcae807c1b873ad640d1d3fcfc944c6d4b5f0b424f", - "3f2ebb42d7452a5625810d438363a50d009df691b211a82a57119139bdaf8335", - "0886896a84e47b787eb276dfbd6ec622ccc15364de1379ba0748649a22f09cde", - "823caffd95ed581b32ac3d3a48a47c61756bbeabc564a8f77491a5dbc33dadf2", - "d81de6e60bd6cda88d60af52c6f286e31a539b9456115d300675be33d5b86a4a", - "0290cf3f63ca83356ff24cdb6775f6e3cf7ea2a53202b1c7f8867c0e6b6c5242", - "9a8b429cd11e4e89cb289256413345c2f2ea01e2d493019ee85b4241fd6e0b7e", - "47fa2a2fd507a88fe002ee4ce390dcab486d3efc1929587b8d3d690807180aef", - "03bbc25a43764af0a8f10a386f29bffd1846dac0ce63c1949a9551251d0441a9", - "fa280a8add3121bf0c2e10887339eb874d198d025b7ebe6cea2aa619f18bea04", - "1c7606c138784807475341736a977d3c2464f047438482abeda2263b09ce5a20", - "3aa21dbf1827b7bcb7a4a80afbe89d4fdc561644b7cb48c9163a62bf95bb3f72", - "d1f43f391cf58e8c55f455fa2929d6e13db6d1c62a8f09c9b5e9c491ff3c1ad0", - "629d954bf67afb241bdf5079a0948ab58d07236578ed562b1814ece8974d09a2", - "2b223fc6d024a28745fd74e10929907b1eb5e65362ac345b57f2c9004940018a", - "dfe798269194137d5fc27954e1e93fae69c66c5e19d7aa2cb1b43af5f7ee5a82", - "83f655a413482891f8c190b2340ab6b9d4557bab1a898aa4c7cab3b35050291e", - "1eacbf4550e10f49eea563006b31fef2c32f40165d55631eac884b15c4203d55", - "ee181ff636fa2b6cdc7c8304cf668a86e21c1089bba10262905b782c5eb0ec96", - "d5b06866354d4f93436f04f7ec9bd680db8ed0d789c3af813d4644eea7fcb96d", - "5fa8cc854c156d6a3ca72961cff1c18f7765784f32e18dfe5849be3fb0254245", - "12b19a444b32703cd934a6e859a3ab5a12e3058798cee2173e879e519427f43e", - "da7506aa4b766baf449a8d7a566c1622b63218510aed2754bac51e9241555488", - "db2863e083dbfcbce8098957b612fa83ebed9c7dd72337c3c3e7d42e1963d47e", - "07d2476a8dad4792dc68af70ceb289ad1c7d9c7db70242783ef4494a6405f6a9", - "f812184e033801d4b184d8afcd0744cc6989abb0955d242b8c34cac50c9b646c", - "5f486ed7193340c04892f1f9c7efddc3ee7ec893980ae6a27c949a8f6a0a4be2", - "f249a3a166890f18d8dff5e13e45676f79315112d826754f165ecc71bbc68f40", - "fa4552d2d450cd4c958fa06f01b1f36acf70fc9b81442f92a4d2871512978837", - "b7e3c0085ca418ecd3d2823c47ea943e295a08d36c27c2c0c0dd012cf75c50ba", - "925b6d71805de8b009cc0412ffa8ebd25c969c243f1b2a68cd379100d949a18b", - "5efa9e1234987f498352121122a0e1bbea1b7147083b9237f5ccb8d6ecd2a004", - "2d1d88f6c4741ab3b8b1954fddd49cde5943b264d63e40adf403acc2f708bc48", - "65aca8cd605d309ec45536bac9e94ddbc27b0cfeb39113ef5dd3e66c1fb75a41", - "6c717b1819a2a241c49d4e342b7ca0890eef9a9cf9941448b7b8f5c041aac548", - "76a31fbc24a0322ce150c3554487369a24f6e0f89c167b29caae59b590f08889", - "526185abf30820f1ea011d27554831c3719a97e9f7653c99aa07a7d03778fab2", - "2e694ca062c705a9ba7db4bdd498e9d6433219267bf322129d4253fbd9a9f494", - "9ac5fbda80b427518501a0626d4d20f6929ec38b832385e61772a9d5d0fde840", - "99b2100948080714b3e907a556fee4f6b7ca6a821bc29f4e38d673d3de78ac5e", - "88e6fc07962ac77b9e5e217e190bf928f256fdd1616f17fe966d6ef22ea805ca", - "0c6f46a0f679dc1ad486e0148919c2dce8e5d7605f717ceb81fc4891e7822898", - "f35f134989a88077a575896112092fdbd8f81706604bed8e332cf81700c416e0", - "6d61c482eb50cd3a2c6b6f9b178d754ba3db3f4a4ea663658508fcaf1378bf4a", - "ecae679614943852b8a50bcd5764e161c9d3544a698c219e770bd8dc06bbbf4a", - "a88bcc302adcd12801859c326dabee0fb45dc0b95aeb1eea6c84334ba48dbd9e", - "967746e29d14e0ccdf64d9d77f87f257088277f0214fba3a6e3ed7dcd09379c5", - "ea2445d356523bbafb61f2e93bc58f6f718babbc27a18b2253202fe1e4cf4500", - "2dae7ae22a9bb229a6c9cc42ac5ce02e2a7f617e0e305f64c292d43a5fb08546", - "2af425bda1d71ca2c21a9428e9cf17c6f397e9bca47d3e9969a2085a96de5a74", - "3c6223db3e783b450b4d2a821f804c87d44af8fdb3a7798fb08e1a7197472e9f", - "10a380d1ff5ce5c32f4147d58593f2eccab206c8fb29ab553514dbc22ff7d317", - "9c947a5b0f180a64a3fa484f1b8d0de18acb89c828f3f5d1b96234c3e230454d", - "45623ef33f3c6aa0370e1619636648995abe095874e1be0a2cc5cfcc12479f8c", - "36809edd62e0ddeb01902460a784d249a0864e350f9320f057e0d50954c6bf71", - "e223a0eb099bccb741e21696fc3ec9aa528c154d719308ce629493382f5440ce", - "42b6001026df09561d242f11b28af4803ad79e22aaca753d8006b185e4a027a5", - "3fcefd1c16e1e0f00531151e494c74b539620c6aa46c08b20714aa05c3761fe1", - "1de46b300c32d2b0b0e38758fbac700c644078fae1c558128d82a4911d5d8a77", - "26ec0f996d15b813448b76b48002af33c73c289971a3b9d8b33236a1aec253c3", - "3e6809e4455d2b83ac8587081c26fd1ded8aef346584bdb0a8eeb8d2bb1be9db", - "be9e0b586ddcf25d22cf99362a35029529514b549921c81699ce54ef775b4392", - "bcc89890694fde1edf6c90723d5e7d5f23ae9015cd0bd2128319ba0faa9339b5", - "f9c9d251a67e383254e4dc483be60a8a840b6ea899ccb0f12a75786a71792280", - "ca7ee45f985378b79b2e506296d89a44745ab39404f3f972e44acbf5e2df8b40", - "977ffee4f2a722f11d07bea28febd238ebae7796b9d25db7c0f11d1577dbaae1", - "2f773a3b7cbe586a7fedc30fa42e164a5a610e2ab50dbfe8edd770d0b778deb7", - "93fe26c1e1dd352146cb94f8c1e0cdae930ac0ed31bba1a6912a71311de51222", - "a442aae7517da39652afa9d0ac9272798694233d48458d439a0b1d8782187725", - "805f71a1f8334b9d3b72dac1c19724d12bc7797480c358c83092fbd1e74f56ec", - "4e571ef81f5e7ff6edfcb30371a0b58824074f05271513c17dfde7e5450ec168", - "9289df423023b613d1c42802c6efbc67246b20bf543ba385e0674afd08249b60", - "651c2f1e3bd1ea55c9dd66990728c7ad919e61c3e9437cb94e7d07d528945406", - "3875f1e03d05e5d58fb30693bb1bf4cd355ab20ebf5c7a719ecbd84db7d02680", - "d163e7c62874622c87833b248e42d568fc26a79a99a9b63a632186fd762f5172", - "6a60b16de26121e9de4ce2b449d9f8be04b5128608bfa6d60d7d96b7191106aa", - "f30237e01f9d31d4ee81891dbfd98940ee8b1c7bb6215d0cab30e137fa2699f2", - "4e64245bdbb52b80a7992eee97eb26c7e9f078e254f58d11009c82b6678522d5", - "a4ce098a0a58a791e5975634afe7b2a3f43e3fd89f46d9d90044af69d6e5543b", - "7b032d482e6570b0a92f890a249071055d096d80415b9055f5fc2a2e4f61a183", - "1ef56ad93e88cfa459df8a7eb1dd18e8c9c875740cbd52134de481d3e9e94e67", - "a731bbcc0f3c0796ea28858934240dfa429fde223af81fd7d672a0b5355a6a5e", - "5bdcc650d8fd172c1b0d08d62ec53bc71cf524153593b5a749244c53ae233b21", - "e3bf763c6908d633e300ecf71d88f0674ca18faa11a7f286db1cea1a4df63eb9", - "d0439e19d81bfa26ffd96195ea1361618b02e3c2718a4c07902ca9fdded7cab6", - "7495625651062bd958aa34a49f0c505076033009db334b2fce7a43f7c467ae96", - "59c6a946a064b6730323390df0e0d3c274a09d5da8c8be350c50bacf7e9018ad", - "114f59a765408cd23aaeb92f3fd6d0b30e720a8dde8f80fc70b25995594d3fe1", - "28530fd63bd1cec414cd2944a803560f32dab1967f94ec6477e8b6318443c265", - "ef4e64d6e38aa1f9db37eb186a9c24a70e42e4b96e3b6bd1f07a1d3c5b6df6cf", - "e4f01d71511002496c1298bc2388e1776842134bfa5e7910a557879105b85dfd", - "694006ac77a43b5724c0940515aa362d8f7030584a111bb63093e93b5d90bc2e", - "947ac6d1f7decde14f2240790f799ba2e58b7e344761dbd2864c741507cda9e6", - "9e1440125348cb46e1e1f84e7afcd626a525ddf0a4c604b1b0b328b7c9d06f1f", - "7fcbc85422011a30465433779d0149fd30ce8cbd202b0da5a04b1598a8b22532", - "d961e63d01e43b13899c2358a726e0ee4617e61a611fc76bfc7d2d347b093a97", - "25503dda5dafa6556665935bdc478496c3a2601ef84bded2cb8c4eca7cceac80", - "2813c3c445bfd6e7e0a00da6e8d3e5443671b3490380804ba197d24c914ea251", - "fdc15eb97003137cd2437b9343cadf3a872e84ed85293f0baad596202acc121d", - "b57c8c6bdb4fc82d76609e39b869b63233eb6fb1e96cf34b27ac16c8f9947e9d", - "e86cbc8d8be90e149bcf8a5c9079764f0eeacf02b2957e8027eb97071ae3f801", - "2c240fea914fde072992bed1897e7fbdb96ab3b695b65fca8d7ea996562265df", - "a153bd5122407c001f0d81d542dfed4b3c22da24845aa3427720cda50c225acb", - "f2593bbbf1d9f541c829c5fc3783d8ecbdff683e3afa78fcae3157773fa52183", - "ae71d7d74173022d23904a7394bf36346ce20a5e821eb598d7a495a453f9c963", - "94ab9f433ee0e7c765ecf8fbc413ac243f13bbb1cadae44484ff3aaa915257e0", - "4cc915e96e52fc11f017613c459c05cf781e64ad843e3e9aece9fdd15be18897", - "6a865891c0a0abf15e2801ad470f540f11c27e8044285514fea28af896c35a18", - "c0a996535bc554088791b5812f19ad571e1001e785d3621dd0e92af5ecee714d", - "1f06b0b28ec3504e552cec20d6fb80a00bb785d8fbf4f2cfb80c690e73b88e34", - "76dedd1a9be4bccdcf2f4607d614575e764bb944fcfe69642c242a807dce657b", - "4915469ca0a642a1a436852d688b614cf6d4586aba85eed3d8ab8408f03509bd", - "c5d74cc5d0bc5d6b03ae6967669e3104e9d3ca6b38217a169062fd690db4beb4", - "c6b6c0e9473f41d7c326190e43d1f97e717942bedf67c01235374b6a2c974751", - "cc4910e868f257ad3fad25296284654a7417686dec90f48c3437eef1ca785808", - "c6740fb4f1d6560d0d4dbebcd117162466831909abebc99b63a15b9c82683aa6", - "dfbf861ad89794e193513232db1f1f05c5e2c88a62a09caa574f021ce85f043c", - "7f3782076f601300f67550fe6032de90584ce6e3e8f119e1309fc0f342e04b76", - "18a51a53e8af86eef30eb135803f6724095f907bad5b0e9097428865f17ecf16", - "cc05e32d30620f7542f8f3105a5b5d81f81b0d1c682eab039c35158008ffab84", - "0fa6076a3fd8728382a5c29a8d7330575a460586630bd05b25c943d85179c8d5", - "9375c064cf2096a89a0dd4370ed7701c84628f16c45847b61a2a865c6d805a9e", - "10c7cfaa91cee7004fe4a2db7c5b05c77a60c808019e8f9b8e4806bf4865aaf4", - "574341521cbea090f5a12b819c02e4eab264809a437762336842455bce4f5021", - "ce30dfaff6418ba36e2fdf2cfedc6d741ee9ce479d11e19bd7a43cb003e5140f", - "2f4541ef5143d9278df5f086e42b803206e0bef0f3e14696e002e2f18aa6d7af", - "d88776661360f65cdfc5988180bb5398efa29d1b93f381efa379c4ecc94d912b", - "e6a015cc8b3921bfbbb79b558ac3264a2608ff0e50c91c58f309758ad8a8e064", - "d5683f317f8a96b66882e41f8f0ec145ae7f6ca46f71f86f27fbe153da12931b", - "9f48d0cf09ba9a91f7d899380b63eb967a1d78127070d8b8f6b3fb61d99a3427", - "4f8f4c57b33f73d02532be6aee38111bcbe8f8eb7fec489c8e0c1e618d5fbacc", - "16d436f61a1f4406eb57c50f210576a2db0b84ccca2c7fe3f765cbd726609270", - "1ce70a876ee19a3af6eb7fef9caf0d1dc6d28afbba4745dc1fe2da3873270e98", - "ba19441e11ac1e516c9174150b4173e51e51d549b34c168c099babc703502aae", - "b8c088fe8183318200b5c253b019e458f03100ca05adbe9e47a86ec6b3886ad8", - "363c2c0756249d1566d2049b94ac9e645a3afd5a93a3fd358c90c5f90cdb4a63", - "b2b9aa074c876be79424f26c7b508197b84bfd08b2c82b402522909c95a52d8d", - "f26b60a48a220201cc0fb4769bf725772a8cce527c26247725246afaa85faf0e", - "70b65e91acb8af7fcaa217e5b1116fc7ad440cc11600b7141521bd2bc27d67a6", - "af426d3c0caf0da512e3aa47483cf3e710ff5dffa76e700944d543cbc0fb90b8", - "3e801a01ea2980c7c0087abee2c9e4b7bdf6c15f38ea009ffc4ea6aa91906a40", - "d42308e9efbbd515baa0a3086fce039d19d75ca4a73282c84381375948b2dcd2", - "43b09e6963fecff1af7fb7ec78e447ef1777cf5eb86ee3a70e1a61fde9110166", - "677f868924c8bac586db656ec8816a6a166e5a405c4c9184af4a0e12c43a1ebf", - "ba78eb19f30a9ac91c55dc83f17d6f8de80a40adf791ee2424ae7963494d0ad7", - "fcc777d874c1e37fe8db4c1b8ab999b346ee74db0856bdb81d130c8278a516b8", - "d2605784b501a047e7fa55ceb52d6e84977e3d376192f6e042c0341e0b4d1d33", - "cae45e0690d564c0720833334476b12fb28f64f48457922ec2dd98908d56593a", - "005f3bf9cb39240e1f935b9a8ea178841443ab0ff492e3192464202e312c826b", - "5af230debf47227ff750d8ffad78d12749442f0bbf83798c47bbc01beabceb0c", - "cbaa2daff5c31ee79337c502314f5582666b04e07607900c9b9a1a8974738922", - "536a8d7db92decf48cef2ffdf0ce820b89aff239b3ad7a53cfd10e3949115c8f", - "da0c25102cf6aac6a4a5d6d7c4f29435f4c12bc59d23772e8830a72953419657", - "bd2e03aa5b6370f06a4cc79add312f711fa8c57883f7a617105859593ca27086", - "93593ae890bd6cd79326463e47fe44937c828827fe9d04908434dc53143d584d", - "5192de683b3409774ea470c9d52734eda304ecec3d5f5d67a25f773533461652", - "48eb975a67b33ed8a7bd603b0788c56cdca1d150d808a3c020be2b5ea7d2ce6c", - "bea195c4d099ed94e46943cfdc7b46f5befb130c684d610838d3b3c7c7aaa91f", - "afb11b220b7471ab82f831990883fb7b8d6536954109ce4a1423d87819e1846c", - "a8316b9a79208c5f9f0a61746a8e9b33fe46234b2573f0ce14738391663f60e4", - "1feb4f137966c31e2581afb1578968e6cc77160e109c7804dd906e09a578f471", - "20224d6db16598c1168cb47823fbd98b112d5b216ebfed947aa684fcdd85f085", - "5d8d45f55f1f44a0982c994d8f86bd887b7bd48f975319a9d6d8b27bbd70d509", - "80ae93c1c299f39da8a510b77b502afcace50758f2354323e969589f1c984dbc", - "7fde9a79a0365aa08c3680a9f5ba7144c746c834f1e765ee8b5f0d8cda079101", - "113f0df70d849addd5ffd42ea34fd588ff3a502359ffb3aa396180243762c492", - "c06bf77e09c71e793ce8952faaa9ede80f034d0274fc37df960594ee0e06097c", - "ff44aa5864f4558ddf548e6c2a30fe37d78b7e165275ccca8ca7382394f4e5d5", - "625251234e826cf565cc76b62f525dfce78281068b140b4e7ae50202ceb8701d", - "24b7a065012d060318d6ceaf6c1f548dcfc52545b0c60fa87f6c9a7bc4a119e4", - "56e70a71b2b960cccd88de145d51873502028d88882e3795cb009e987670d539", - "f94fe969f6b52ba693403f5ec5a04d5ee858761e54fd64b354103de0454e2e34", - "30ef93696b8305f9b7868c1d4392b06f8134d8c08c9b9a7bad19fb8485d3442c", - "7b75a309a7bd29cb01a4cb653b6f804399b60c8a0bfe291d58b60c0a8d89b1b1", - "2e24bf005c20a4277cb0da6ddf2b567a7833686e24ff1acd8416f99094e0a6f1", - "c0021054ba1def5be48853589d0c9471a879c197d5f04be281c1f38415d060fd", - "5514c573fdfa02c0b4f35d2302cc40d5a1ab5a74192e1f8bd15827ec6d7182a5", - "2860e835a0fd800954803bad04f4b15d5491dcf3b5e764a3e506737b1d44ee21", - "1db9375176a1e90872960ac13591d57b1a7f3360828d784720cdd0b099019dc7", - "4bedc1e45e441a01fa6d7777662417203f02fd8efc00314f2db9b0d949d95ef5", - "b09cbe6c8cc5ae84e3fda8697a62dd6d18c005c6f4e83828c58d47fc73bbd3ca", - "b3e480eb7e58639cfff8fce76b187c07394409f5e2cd4b8918d8da8433e0ac90", - "290cfab8ffeca8855671d65d96ade4fc52b80d58e33a9763708cc70da89be5a6", - "28445f3e8b5cabde76a83ca31685d34a252115572f89a28404dcc746b452a3cb", - "a6a81b54a26c807a8d0d2f82f57457e951051b0f4148d6f40ba3a89f21139328", - "6df03b5803921d989f881f243b6c21d71a0f2d040bc65503d785613f8f4817d3", - "97e0c4c32411885e118f727a679ba7a117a7e9ed726fd3b8368d979e1ab3aa8f", - "b65393f676bf2e744de8654c63b27ced4815dfd3f0a7bc1b8d632cdf932dc2b5", - "6b43dd710d9bbe009782ff0c45f68998631ccf0ad561c334c57697255a231855", - "f9c79572e4e6eac306df2969aee4021ff186660288dbc605c8c89ba9d57e31fb", - "44da627c1472574bc605a568c221e2f71878991dfb31b01842b00e644478a4f7", - "104369c7b7c7d051d13cd9d6fc7739773ba56793d66de09b29a31cf56ce6fa73", - "5cc007c85d9ceb190d805bb75bb6dcf0b9bb1bd473a3ab0f4e5fb4a8af008fef", - "78826865b1e492f1bc66fea327d605ee8b3cbe6758a8d09b80f998f2bb340eb6", - "814056dac5e4e844452d04f1c0dc4292aa1571bd6f2e7a2890db171f91353407", - "79fc021bbd32957a1a517f5d555404b2b8ec06dd8658e6a61237cc564830cd8d", - "fbb3fde633f44d7b00bfee97a704479a6597c3b3f47cbb41df43183386f1bdfd", - "60f5e73ba15f953565dffb9183f971327986c13c0c48f84b550b38a06ac3d60f", - "66006019df81d43dd648212bb9efd1053fae621490c978a71fb0ad069f39909b", - "cfd453a362323ae5b40bf854295e7d3ecbe5efa8e1ba6104cd4da80e9fb0bd9c", - "8efad43ff1913238100a985f376f0b9c7c21bb8a67440b582e71ea0dff5823b5", - "6bdf69c0ec60a79558b765a4ebfc15ebf22bafbe141c2d00e9276117fd3743a2", - "80bed8f5c829ffaa4d0226dd958260de70d81085b05b1b9d1dc9a89af449d196", - "2f3a4309d624122050e4882d9437ce95970853829a9537d81f764927dcf9c612", - "bf003bba663e4845b5323e8d46509660bc38610e62c42a01ba0576f003eb03cb", - "b37c578ff10ac96e2e07017af08cffda8e9bc0ab9afacf2ae4ef56f79c55e042", - "8125518882b7b52fc704f157442b2d2e7cb62a56009e94cc484c18c841e10565", - "232b00ae00d0df6e2668eb0e0d5c3eeb41b8c661d6e9eb43997c8b18f3d6864e", - "b70c48bcbdd7f2a7bf17f945fa79d5ee28a9d30b60f2f96e87890d567f721f45", - "5203c04e4291960ddc20faf0b8bb0bc9a2e6eec9ad9e53c9893ee006632ad193", - "0fa4e50e62ff8ad2204f3586b9909b6a0a3667d66d449590845829fc0c3897d8", - "777b9e07d9d5930ff596c719ffcc2fcf77ea8d0b0a20f20244f5df75f61a6918", - "7f88c7930ae604b627faa9431f25b6ed8aaa51eccc91ed3b8ff19ce6a37c1dc7", - "6bb3a5956ec1f0ef386a7facca0d54a477ec8adea7669e0e7042b6d3af8391cb", - "171bd78ce85ba62ead7137fa8649093d1a73169935ec6c56e49c5e4b9c2c6923", - "754e88aabdadfc857a1d1e4037ec2d9e6c8f9fada5e94609833b7b074dc2e677", - "2ed569f9cc4e14ce0b32317085b31022adbe46a53b9c118782adf579173ebdef", - "5781b9e001937315461528cb6715504ae3f147c42d9699aa4681750adbfd57ac", - "2fd75088a7383249ac6ec0805549f71953f58289dcf21d0eb23adb4816c2dd3e", - "8aacaefec5f188d3ab01f7a8db7048839ba49f848d795bed84acfc3e6f69958a", - "bf893e26bbcd0579cdf1bb70c57279d5bbda92b8c96973be0249b10ff6a2dd0c", - "e01a9a9e73ace0795f190c3d6d5a018d880d011d8393e2e97268bff9699d1219", - "f57b6bf04d9b0087db12471118fc6fc69e74df8f5f5e0be55a31a182a86a2956", - "e47aeb8ce902dcc2bd34f8a7e6002d7307858d86e2d1d2d5ddda92bddf123e32", - "e368e26f84360e9e5897742a5a9fe08f03aa1c1e138aff0b556f3a941b88748c", - "4f62669949882d8957de4e4af9ae888e8cee45dcbe69e211f640ebdb316f43e2", - "db04662ea101a647cdced31077db8a36ec7303da39791d323b02d20ec4abc9d5", - "83914b273e3770dde8b92b1462ad1852c7e0e52b6905c6739e3ffacb5854c95b", - "b951c76ccd056e92c7148a0a89db89365e4ac31f10f6de81deff290b0c9f58f8", - "d21d89b5b233e7460d3ce5dc662e0a6ae3dc646288e564e7ded3f8888549dedd", - "b5179395157596169c961feb776759c25aa09190beb7b60cfe91ec25fe49301a", - "69acbc37d59b7c32f081b7804cd0aa182d7a77b39e454f446abb5bc067e78ff6", - "448cd18bf9884a94495767771cbd8a9ef8e5941bbeef265a3450958b35840cea", - "b8bde9308dac0b5334c02c3d79ac1b7cd007e51b691f9f14aa2daccf295fb10b", - "12476826b9d5c2bc45d0c063572bd2bdd770802538bd8b7dcccd18f9efe32f93", - "f7ebf3401723876173447511409dcaf54aab6a2d5451a3d3e6f0d76beed40381", - "c153de97b62c07db526799b4a9c44eba391598f4766506934389edc9731498a7", - "42d3511012c5c5cb85f6d81d95bcf35333d34e3d3046b9abf768d84aafccd367", - "b1aa2c8f9082260df1ea3d52959e756b1c0fa2d182aae3c643d9327f01744174", - "cf7b1483df67e1889a52862ea0e6814631e41452700c62cf07b61c30420f6873", - "56b9ff5788397d414fb6ad8658cc1e0081aeb1f49f24aafba390d79aa8dba2a1", - "522ddf96e713e7425cabfb49af7c2cfc13956ac0aadc0143f9b140c1379c4488", - "e3b0f100c094ee26da0c1c01abcc4b4146ed4cd38a24d5048282cd2371c843e8", - "bab94c5dde7d911a9f8d1cc86d11302e4b6714f229c7bf7563255b0abb3ac6ef", - "61eae9f85703f49bab5ec0ae8358ac258abf219d3e1b002390351cb976ca0533", - "75f192ad519f7cb88a0c3456af68e9ec49fb4f128055c6518682576dae760420", - "5f351344cd23eed3667fb06904657557cd7ea7f4c8b7e0ee135d1ee2d01af4fc", - "9c4d09777c41945dde4d0dde9ae9db2546aa3608621043720cade7715ace702b", - "f25d7dc2e7eda99060b723ae957cb0f2aeb85c64955fd28cf71d8189c2ace349", - "c61c96e67fca2f15cd9fcd454b7d3414bfe3dae31e229d1c03429af65b93db7a", - "a461fe835001909d83aa0060b6d078186004e9a06efd0ff27519dc8011b45958", - "2be7f66f340785b91b2b4a72ffa190df3a17b46377e48fc86474ac30435b75f1", - "131337d6b55992fafb25975902db7c2ead801f99ec9c7b6a5f3619b838255c8c", - "723f73ff353bc3ee9faa70c66206f234947043cf39fcd94e635e79ab27926023", - "9f0ab870ce816403cd30286cf3e730c4b93dcfe8738c8554a7540586faf794f2", - "b59b5331c3706e484e4c2b6f36ca9e9555c6a4af73f24f79135e3da47f7e59d7", - "2e323f312bfbb2c92ce648e8fe8c236d5668ac2a1b9c8a9bca1f7d26e39a27eb", - "b957851dd48860454c1a1d98cfbb8baa36578fc61fd8d5fb53a0d31297ae98fb", - "4b4c424766252c776bb9bb62d53ac26e89a51e236362e980f4aa85e618d27d04", - "38a59a29b67eab9b78ff8a1d113802bfd3e28e714a80bc94226321ab326e793a", - "197231d138840f17ff6541f6abb0cfcc95c888a816cfac5b2e9d27f0012dd750", - "00d7506c8f9b825447bdf3c0c83edfbcb89c48a4293e0e6b439241fd7bc56ed0", - "450ff590aea3dff3c5ebc9df4e17573c8a336d3baf39bb4ebe95fb261582d8cc", - "d464d2f30b1fed5de94a42f2f38cfe1b43b78f700efba44e5b8bba6d74dcedfd", - "d70b5c0848e55c1b6891fc51325929db9781860ec8e625b637812602bca3043b", - "d3c2090189a9607d0b6faa992cb7bf8aa68ba5b643fdd96c49ac546f2343e212", - "e9482408151df0c9d2e60db519508cf73d9cc113d27a33796329bd0233d6b975", - "b70e962bbf38a68f71a4d7f1f500e04950785daa29a9b699f2bf09ef08cd2347", - "7e0c50cb8c31c2f35ecdc384088aedcca10fac722e453ebfb38d07ec9c5b7bfd", - "b18cf6513c87c8885e7f7a69b99b613c59b10a23e2c3802a0fc2f36888d19cb3", - "5e71baa800fc340c2a97dbe1eca8a6f55e39a78f512a80dd91ae038c2ba350eb", - "7811f16cda9693e4f90a47939c500d3d93970e02815ea60ee56322ab0941ad47", - "a4a159fec65376259eef5630b21c7c33dc068b9a22d03a0c8d450883cf998178", - "6b8da523f7658f20bbffb64f72d51ec142352d3233f2703e10982b7f412bb9cc", - "e6a2dc4ea241a8fcfc659ea35a6700bd754d6d190b1e3790a346118da4655c77", - "7586d924c111a38757687716437bf083cafd36d6adefbd6ecf4bb3f5667754c6", - "19eb8deac85c5f0fcce10f308be5d86f9d1b7f677794bf9a009e4e5c5de788ca", - "0050d0401c6aa223145e5a669a0e798bd826bffb4738f85d0cbdcc05ecdcd4fd", - "0f871a6f7a4b6bb5516ecbe1035aa0027f2c927d7bb8ec05157b05bf689cf0d8", - "171ff19fb025b00aff7a2b0a8d72f73ef9a9dbd30e2f40d4fef2bce54183bc04", - "7559ff82257bc1722a0a3ea9c5581a2e77d78ba25fc64c5b39396c19421c0575", - "e501f7a351472507ddfcaa158886b11c6cec5a3f67d03dd896d5b27a319a86e5", - "93ddf141622ec5e79dd71c26a9044e49b9506b584e4dd70a25d41addd2fc23fb", - "c8403aa4ac64c299986035c07110968ea3c41038507b91820bd77c6ab79126d9", - "a6dd0251bb4f5584964c66131dcfa83c1a87ae62b6796b25371312f36b733876", - "21f92794ded2608dd3635829ce88640ef15cef9587022d1fcb9660fb835d6ad3", - "2bd2cc73aa778251bd1e7dad7b46d7d8df7e309c21662db3a9f1f721e00196b6", - "591c03ca56a4474ec2ca973b3b648e4c69e9bdbbadb7ebc56378be1db7bc6f80", - "115df7d4b037a046cf811c12c35e29442d51e364b4ffe7e0720dff926cc56446", - "ecc4ff33e93d22a136b202624ded4dc1f7de04fe0087084b7ba66f27d8954440", - "e1f920b6da3d41536837037bc37ac790b3c4896c32b7d381f172dcd507e15c51", - "942a7065838859cfc94c0bb69e497c90fd0f087e4ab088b3ac90416c2820c4a3", - "502ec77d4c972752a8117adf00aabf1afaa5cdde67f4cc723c90a3d740f8f4c7", - "ceb3707edfc61fc0d95db21a5a6d39eacba6ba1d73c59ad778c8967f5b43454d", - "6f9312827532f1b27c62a3ec303c71eef02ad504ef110f9229534a898dc9ada5", - "f860c385d91e0bb9ff01166db07367023eaa438a2d060d7d94278f7ca059a95b", - "0a5aa4d431193dbe7e3e11800533ab1ebde718b14032d4685af59599f0fba0cf", - "cdc907554fcf782c7c960a8ade33f4d6a5ba38a535e54ca9d74a2c05533c6bde", - "3b74c1840e0f9c29e01bdee5a244c00c576503b4a97c7d9993430c1b6e11b72a", - "f0e795748a6f2394b5856a08a80b9154ad838a59c317762477afb06cc7afac07", - "6f11efd157aecf6c7241a137ffa33598d33c5c5afc2ba78d0e29761e8501cd08", - "a9a970ed2f5b03b67051e0b42a563aafad61fd5ca90c6048e0eda44fe2134647", - "ac014589f3a211d9d1d3952c3b52efc0b09a39bca7ba5953b09ea55bbf7f21a1", - "0625764b6bdc9e8195712747a3eda1e78c376c9ca6e59327b95031fddd8fd23d", - "513e6d9a2d565121029de33fbc4b9e9c298fbcf0221a3a5e18fd120a8eb0511a", - "94de87cdf8a3acdd49853ab7421b5615859bdd746da7c773e4c709f9ab06c71f", - "a2d76592cee8e088bef38f4ffd7df9eb2d061e24e3d217f46ab02a3a5da0fa59", - "6685885f81a37c17b259c38eacadad4ba4856c5a22194ebac34637089e944280", - "4e21f6caa7e4d06b9f48e8be849148446d1083549a15781ffc63ce04abe5a9c9", - "33f12245aaafd72321b732966b13aff2eb9ac06890551715e8cd4dbb80cb4fb4", - "072334918f63a20a1c1aa1c3414861951fa739312b584d0c98ac87d7b232f1e0", - "3ede5f16951f0dcb913182c3bf35f4454042b14cc176d59f8f33ce9e0f132d2c", - "68e04138156cbf52abd8650c6e46dd28c94eac25c3944e9f1f24857b97d2fb12", - "7ca06845db219070b1f5fef0f96c4bfd3daf5c526b7b0717fdfa62a11b414e62", - "61cf550e7d7abddbf7ab8adf89f862f071597fd9349cb0662836fc93a6d673cc", - "282fb4501b29899ad2908c0ea59c2110fe3c4f22157ca791ede0737a9d0f6f23", - "eaef12b59c76d4aff384cb3d2960099cca093d422cb3cf23d9d172b7e04215d4", - "d65f848045143de83fb7dab55bb9f71c8c264868b6374748b8f35c8ea217c7a9", - "f84ec1fdbbbb44d25eb715f4784d7b521e93855914a580c70b5e97d66687c983", - "e537a62dc42ccb81a261b990bfd72527b9a17f400aa691beb6261d9a624a8511", - "9c564436e0f7858cbf7ac654a8638963cd4ddc4d6c25e7124e77abb3535ac467", - "f6db09bdb59e324ef1ab2ba71104e5f3fb19178a93a2fc7843c44b9a4a31119d", - "a0840cfd92657c17a9c39ae8b8307e855adc7e59c7c50b405187882a26857785", - "655b7accb9eeaf05320b25e7c7033d8b3a6134cc0aecd8ab14495843eeea49b7", - "64ff1a07bf81c4856327681072e910ec9b84f61c1ef3d883523c9e00838c1c71", - "8dc098c2aa19fc43cb81768b4e5f0ee429da9f1d6002ccd2474bd38022f7bee7", - "67a48af700198b37fedb20b1b67ce37f44d22fa484b5be3fb706e5b372cee8f7", - "62e827c54c67347ac7f6ad8201505c15d26a8a6f73091013a80b21a1d140d090", - "fe8eb828cfa96656d3967f07a69e11b1477681fd78116ed61d3fa89840080e2c", - "662f12a5719a62e60e2ceaa11b8a5da08b09925eedaf76c42cb52572a4c87ba2", - "a0ca23c8e1f7f29eb7ddee1b24afb220b18efedf4c3204d121d7a1a132a7a2ea", - "74567730a4e86c11886617e51e0f2d18d1f231f513fa0ae5a95e3cc9d6763ccf", - "7b48ff7fa06957eb96f1aa6c324689c88f5a73b6e2092b027eca88c86317fee6", - "c35e718324d3243e7b344614c6224ebee467a72722a3f4f04e7a355a3feb9707", - "ea943481109f26ae69c777b0ab0e4ab08fc6ac1d8cd4e80422f29c0442d2a6fd", - "12cd5bc44cc8b28686c525599d684e78568695444c0cae9bdbabf7f0f936d952", - "d21cbf87a896785e30ef0e97e2b610b744f5ac5b8db7472672bb901275261bca", - "a83da523f2702a4ba148d32858fc979ea4238d8b43d0b42f470243add4bf13ee", - "3b334d8a4fe189abd34ae6c91e9aa92411fe49d02536c48a24634ca459871d15", - "de55b1d57bcdef473487a309e222d166e505b036126ef60d440d5c8bc3d82f75", - "955ef335ad0d2c352874d7d62adeb52e42d90ea47809387cd149fe7871e675af", - "c3d4b59f69da2174dffeba14920c113684c6ab8c86e7adaabc4ce178855ad94f", - "713758a23ea85ab34d56de90a2788581adb54acf4c919d0613ddc7d27a366de6", - "432b306619cb2a9458da6de4ede8c0b9d5f628202a94fa3de1ad8ff76bfdc996", - "5351268b18d1cd9b2d83da2e6a91c24a04e9ab08dd89279d9b192c1dda31a2e5", - "3d5e1f47bff60b992719043e01236b803b3bbfa3b209a0d5548bd7839650115e", - "e3233b84fb71a63eddecf1dcb5061e7d133a36d3cce891dfc4d0aa156f663349", - "4f68bc6175a99f1facc01e73a1135c8654877db32ca15e1a873183f98326eb39", - "adf319ebe69e6ab0f31bd59e3edd9516a545b9e7469197bc184c479629b45a0c", - "7e27de972bd19882dfbbc35251e3d9aa48e327b57f9cf91c588150fb1ecd8b23", - "f162e3814590bb838346a34683030fbf3a1a373002783ff8d298c191df7455a6", - "3ca821ee1cb281495121413a616e9d6ce7f24da1e8c22f8324aab42447c13390", - "77f3da868def6d1159d1582588704df7e9a7a64244b3d58723c9d932d38318b5", - "b9c28ee30cc36d12294587833ce2b4f4181d4f3824397aaacc40bc947b6982fe", - "df4d504148be92ef0e1efd74ddc188b12b8c2673174a6d68bcb72686b6b4fb68", - "4e542825767bbfddac0b055d88a77ca4c0ff78190e489f6bd72818423f4d9ca4", - "209a3d3df7f619ae93a8a29823b568750c92405e74c9f7b333c84ea20317bd36", - "fc37dedfa16bf65870d2bec1b25e643c3bdacb9597048e5e05c80367a9da2164", - "0a7ecc6fc60bf8a1cbfced8cbcd0f53797c2e68d5c767cb552ca8ddd1ce0fe3e", - "88cb2866897e09f897d4ac6f75d0f39f40d79455f1a4ba7b6f226970afd5fff7", - "c6c3c2b91c82b01d64ab1ef9b80e8fc285cd8516e212ff1d0c13245e795dd874", - "ddffa06e158e027a8ccb13faf1dab1ab6e845c87d6f723ec4b70aa8b3dfa8102", - "db2086ac126d2b9c09fc22b6e2aa6f19baba23b42fec325f0563d0527eb5bd7b", - "0d3e238d32459175a44833a682e4407f2deb60c4edf7bb90ac82e9ef02114d9f", - "e61c08b0c4eb0212fbc013eb72b82436e7a5145ee70ce6f013757ea0f43c8850", - "0f2c263af2f53a1145d25ca5d1fa374cc24d77007d07ccc7275a1a00b685953c", - "8b0a513c95a61f343abf364ed50177b21ad0933e2de9a9f4b3bf50b75645cf7a", - "667a9cd72a51dc5ebfe669c20b9f9f9484240b86d926ed9c17b152a75f71b71e", - "345f1226c8e2afa67c49c7b6e2954544987d35ddbd9453af1ccc566647a4e35e", - "3e854a427cedf0fbfc46731fe456566cff5afde51b4a397e8606d4ff5e20eef3", - "721fcb167bdffc299be05cfd7c25f1eea1aba2dc8513024cc07cc1eb880e4563", - "7cc723ae6d37281436b3d7937313c43d59e9bfa01bbff1d2303617b1197466ef", - "94c90602abbb79eed4cd06bbc91fbc9412fc6dccbec7a24c87b023ad7826f423", - "d84e6ed579af6d576147eb868f461ba321a13b3848862b3382a9e402c335de83", - "a6c35e071afe028f7fb5502e27d64d56c12031257922ab83ed4a2dc574bfd242", - "d16a33ddb2939d9631d8af30996703bc44c2cc0cfc269c8229efbd9c6686b40c", - "280720b6f0043cf02d9bc1f7f70a469df07a7ac16e95a97c608342d3f97b14d5", - "7f234113d209bf8387f7835d2e5d8478aedc8b9ad8ef97abd400c1c98a2b6146", - "54b6e29bd8a0a9ed103865808253afafdc788cc7aa3a6dd555e26c40024d3bd0", - "86aba4ff6d5084bb361140bfc95843dbd9444fd7e928238bafd200683d0395c9", - "da8210d8839652b77ac40748e48131be71e86d0eb21b01b7120bad19fd623098", - "14603eec53cf8b83f9ab6feb534a25337ebe09bffd9e429f24eddca3e35b9b1b", - "961effc39caa0dab0c96f3579c020fc733f89f0fec3e6d1b101cfc96c603f80a", - "9976af7f738f241892ef31688f983f62a51c8f5a3b87ffdc790960e46cd2dd7d", - "5b3e1c8421a84ef23f2af9ddcc50d510b8e8cf537fbfb66fa9bef2c5f7b7be81", - "77efb50c5c4cd5bd7954414fd97bad825a35e2e2b384e5692458f0df45f2b327", - "27ca8ae248b5da84b6f5f9d0c715f0bda18596653e7045912084e88c370ad9f3", - "31227d8322dba0146120c9013647b81a3c2009e8a95338a01ff2ea9d71d14abf", - "da6beecf2543675e5c0decaf6b40c10a2ad85b5dd2a73dac504ee97840b46a20", - "42514e799a70b47212ae1b6602cb6593d5c67d50521bb7e7a22ad53eca973e0f", - "0a56acbccbac6a5e9d81f943293b94a40a8ea8c9b395bbb1ec006d1fb7ca5636", - "67194b32a1626dc05324afe1f9633271af4e83a0f66ee0bd5d440c71dfa9769b", - "ad9730b8b5a432a3819082983bce0ffead30db43ccbb648d94621bd6445783eb", - "e371f98a3097d1bbf20267842c89af5d45d5f0566458e52a1c41c45cc55ad23f", - "9b2f8e3cf47cae490f7513cc9977fd133b30806c990a69b182d118f0a79ddd2c", - "89308f117a0db63cf6d20203af03031977d4cc5d4bb20108b8f9eed5e7de7a53", - "996cceffe36d37004e02cc5bb1a5a841b2dba4c47fe8c0aa4420cd65ae239e63", - "97a45bfa1c92ff16a35b462c531daebbd674a4677c615162b53809298bb1f043", - "827f0b20a1f912fd166f2c8c93a93195bfd03afe8748e18468190fa7c21771bd", - "ebbfb1c3ad07e7688a25d6c53a7cfd286bb1eb60233d5e9780265f9d7ca6c3a3", - "64b1e8f0cf6f24007b8a2ea1089db0697661444bd8e045ed6ef588e5ef91fa2b", - "033cbd2efb9ab4fdab3a0ff0b08129128ac1ec8b7c176de2e1cda1647890406c", - "460fa9c64494a7214b3e853dabb6cbccd77efb5683db7da11763278e1bf3e2c1", - "f4f269d5de60adee5216644797b771877d50c9ac52313d852e4f1ab37a530481", - "095b5b1172af8350337b6a0e9dc0734ea5c86fb8ad96f0bc0413e461c09478f6", - "eacc88780dc4634c95aaf95d56e8b85e988dd4791b4e1cec54896ad65ff0db2b", - "76f268d9d07d0acf37eeb8e87ad09be0acbc81e708a962a27f596843b50fff4a", - "65a6c76c68a31f64f4eada193674318a0b91dd1f808b1ccf859bf59b33d4fafc", - "db643942749a1a087af4f7ac9cdb452c96f6ac0fbc6d45493d7f38f59abbca7a", - "e4409ecec043e79e0dced23654899db62d406759e55e7419d2914eaf5be74edf", - "8eba0dc76cdb9f44791c2a47e7dbcbe976f0b4784bc0bf80eb2e46464d8eb3b8", - "7280958dc149cf0f74854f91d617e9530dd104c685aa21910b8d6c8bc3d961d4", - "9555fa3d9029c33748fa279554b153cbcd35686bb2a969dd64b921360532a16d", - "dc95bcc33f7d3b8ce509e45b4ab5d9fbd5081e3ff14e9c663306a457dbdf9a4e", - "fe004d0ab2e388ed95124f2293c6f27bd5f1edd5f8a86602eefab3f06e133ae7", - "5251e3093b260457a22b58fb83382a14f63fc4633434127a9c77fef5f9b99971", - "ce3ef45bbb02fe81654e5bc921f17ee80d8197f7b36b2395e27c65b11bc3fef2", - "33dbb84f7e94b3774c562f5129b87f698b36884a6e94795aa7296c7d77d49bdd", - "fae61e4c65061da535b5fb1aa44d971a3c18b00d384c753b378165a8a7d11942", - "62f93fefbd232ac2df8edacee826f30a3e65032142564a2a13aa3aea2748ba4d", - "e044e4735b23372ba1bfd1da61918881b16849653a2ba084c27406d2017b45ff", - "4ec7f020b8e1c3666082a44b3d6b38e80262849bc65b1e21c9d8e1c24ca58147", - "201a132b36336fe110fa6ad9c8af690c52d2195f811ac365b09fe34ad52e583a", - "4a66641c98d51973a9b5606d9e0d854cbd1c4da38aa2ff1d4c9cb0e30cef7234", - "ff9d95f82d277b7f47e104d1cd00883a26e02c77a7f91bb28a130d8cf5bc038c", - "6a812f6828d97da381eea6b48d22f39076f4b51a02d2a64333e72c1c15670746", - "2691931dd1a6946842e0c7ddd6739de672380e8868acbec653f41b7f0840dc12", - "696eaf35109757e5389e6be9c3b3b2163a71b9a4c6c87ae1baca9f71f82cf1e7", - "7ceb9545c0ccb423fd1987cdda97f6c2996d929786bd3cf6d6bd45347c9c22c5", - "bfa7b6b8a6a0b2eecaa68c9a353563d211ef46c5bf8ffc0bc5f51c47af21593f", - "e0ca40cd9b7f8d0ef7b3f72b077adef68af21a0fbf2b748c55e236271bfdb37f", - "add876c93162261b73b67676bbcbfc424c30b181c4215f2d96779019b9359d18", - "4851972b4977bd60100fb1d09c132c989d1438dda7d263bb2e20cb43bab4a1de", - "d63a7421e907db884326b250ec572c883b13abb627a33099265baaa30f2b8074", - "6830b1dd7ea4306c4d294e89256fddd321bb95738100630be8c10e0e492a77a9", - "ea2001ea86cdbaa80c0f7a435cd47c9a6321280c4f0cd641841aa8131cb0ac7a", - "436d7ceebbbe9d10ab3c4673208726c84108bcb54173056709fb008c55f0fb8d", - "5d42166017eaf7dd27b0496f83a84a7019a36b1086ac93340e8d11362bfab57d", - "e4a6bd193671109af8bb843bbf2f19e216bb5405a4e88077e5e0a2501dcaaecf", - "7cb7eb6a3680cf9652faad04daad84e972760dcb4d6b7582cbe4299ba509124c", - "cadfdfc7cb92e8f91d738d4ff0a858cfb3957008d3d61ef9ddf266c93120c078", - "3e7f1ef430d1275738a8cdaf190e83331ef164b9e3c45e94d9f8e7a7d42425cf", - "7ee8ce06a0204dbb7b6ac950bf11e8b3d65d415d9c99653a6cbc26721759154c", - "64079967bf4396bd863e8c86c51d726b7b2d67ce444d474b34abf775686c6ff8", - "6ea3c904c1025fff5a26bc8b81afb19b187950a8969521867ea312d31b45aa43", - "41e624a09ec9af50d719bc7ce96170d4dd7133dd816593bde1bb678e3d1ef551", - "f41332eacf0433ed6eea57773f17d2d4614d9e398187245d48170f29da432462", - "5311c5da8b1f58c006852e00d5d4cbac1a9801a490bdf70c15ecc086eeb21afe", - "d113b9f0040da8084e8def2a2826e29f29243cc0e4fa8632e2654a243020dc4a", - "662e0ca4c138a3cedd08fa1dd2aec04d79442e7e0be893c24d8e8991bfeee2bb", - "c8b91985bc4cf1cd469e8b1c734feffcfc66343020923689178a129f1fd011aa", - "e270bea49c7e20c5df05e59d48f51e6b56224bba76e92286e8a1317b2fb921c2", - "d8625ba80e082d0e78108304f505d65c3388f70014907aa2397ac215f224fa9c", - "44e19651b69cc3e9e50fe2552ccb182e29acee9c80cd5bb22d06b5ee115aeebf", - "995a40a3ae33510efeb110531cc8a3413333385c86abeff815719ed2a42da8fa", - "1b116b3d06dc9ace3c796e8458eaaf7e952755e4da57b28d23bb93e6b39c5c2e", - "a4d2b0768e6c3397dbeee52eca6559e1369da35d16712126a26c98bb2a6e7dd0", - "bbcc6c6c5a1bffb850872a819a11577cd5c96831bb974d169e1f07b3edfb26b0", - "bec4ce459556fff5db9cfb11b9b01e291be9108e63b835f3bfb2f6b4ecdcff2b", - "0278f33beb817c8319a7109f9ea8f3122403fa57d07c4b3465e48b3e86353aec", - "0cd3b35834237bd0d0ef4061c2a6d912f97ebae811c831cd649259923107008b", - "1f33d4aaec9699be22d1b2d5eff8831d1fa929774bf204fd460e27c7d1a0c9ef", - "3a776b8ba03c8f8101717cc65336f5dc4e6267f3e4ca940ba69fad538dc0a3a9", - "9ce84f02df6295ce47160a91bd8f8e38c43a78bb0056db843289b26bd71c2e4a", - "f6b5210f893fc8c5855ebf396b652979bc6afc1b98792b337e97366b9abf3229", - "4b44f20c7513c713a43ad808481a04ed7d2c674b58b1534bdfe90bf6c7d05e1c", - "6b80e683243598232694e36ff6f3765b276c7bae6717385eb022a8b284cfdf1e", - "8bd59ac03de966f40b3b833b42a28d68a4fa8c29999d8d3585772a6e37403c11", - "8905473a0dc141b87c66916f709544c70831b2dc4f78fe59c439991f3c068150", - "4033e02875560bc17ba6874b8c5bdf41a4666c999c5681151dc0354f23e88673", - "718bf962d5c3f83168fa73fd28bcfef7d0fa2373deaaf46097d6f405608ed2ff", - "4da676bbc74f854dd1616f04cf78571b0e1690409f0c69f6072c44bff2087904", - "2bd7d13dadd9b16f10f7caec5f4bd0138df55742ae6de0375eebb64b14a82b99", - "39942b567eebb52cb6fc2f78ef01b45cb0069c77d3018343485e0d9bde41f1f4", - "91d2c2ae1b564c567ee000bac3ce5bb92df0a8f0d18c32c72fb47bccc47c3f35", - "c31a4cdf0d8e3e89079a0e8c1c4c4241422ca00635cb7dd40db39d6d50533f31", - "7468a367729877ac76dba9d78b2971f6bff3fda331c1e4502961939ca321cbb5", - "5b70506cd734f774606f5822cd51485822c60ee549fe421a0d069cff63c7e93d", - "926329b8838d8634b7c79c3cf209418e988d80430e392fe6aaba314ccd248157", - "afc78f3c228cc18571ca2c0d56bc7eb88ce43b5db48b9d16e0764facb24efc68", - "5f874ac242e19e03e8c621b8bc7b6116b3e6f2326bf060b0809d3facf14a828f", - "284d57154719b007773b645272a748e7447f1d54dd53ffe9cafc35f7bb43c0f2", - "b050aae52b2afef8352b2075481225d78ced8cb34fa9b11f20bb07409885624b", - "d8decb7f057796965173ea1f92d6ca331eb4a185ff8a9ea805fb9abac1a2ef95", - "6c7e477597c771f8645d5b187780f7f1e9c99c4cfc6eca752a0f17e2a0318028", - "22e47da3b8ba942d7c8145c6329e3d38d3df6a873ee5c40c5a4e5376732f088b", - "b2f199b3bf73d2541ed8f2eab2472ddceb83f2b226e83d5c4f303cb9f330c671", - "d403219a5f6c893e77d51730ca22395b1341be4a72f5c49ead1afe89570eb504", - "fa108ad915229939ce2af9cfb530482ee9d0cc167f7d2336e18cda0bb5f04735", - "228307ef327fd5ef3fdb38dafe8781826194e185c719a5a92b5343476ea099b0", - "135ba1063f30a05a5b14a21bc5b3eabb8fd8599f6b07a1c3975a91ebc4d8a100", - "341e4314c3977c2fb05c5630a4b68f0c2ed8df3dd7b716d3a556abc0af6c81c8", - "54cc163f5fc7560ddc7670016fbe36d95d30e6a7cead18ef0d646668ece9b98e", - "2516fdeca0bd2a4802692413341540a67f2d23c4abf783f7c2f4d648e7b35b1e", - "84bced2bc48b22f226ba11556b3746b9aef71852be6091b1e7831b6d4002ea10", - "5645973c03eb1c23761855adb9ee5e25ae9527f839b6d6f7fa2baed137ca7889", - "65f1fee27b8eb000487d1f20b3cd9d344bdc3eff34d36d9fcf87201b47f1f1b3", - "41d38e3f0933476b50c77fba615c84de0cef943f50ab62768f2cdf9039f3473d", - "2a1a5e1b42165938d74871fccd93f92d890826888e8d850cc94745033c9748c3", - "fca0fa4f99eb65816d406677268da855e71088ebdf6ba2e166380ab4072da4f6", - "e1eb68494b543ba85e2b83b5d0c5b9275aca8b74530ed3b8653023ee123e8454", - "16fbf41f103987c8d03b38757714443f41a332579dd35142932dd0eb3d06b4d6", - "2f0c5df0f4dbcaa02707cdb90574c12e08363c8ea93df47110774fdc9c0f8f4d", - "b456a5b29ebf543fc3f6a9c6521d8a38fd59a2ac7450d58b77410b87fa478d86", - "cc0392494f1dba26a7dd7418f0422cb8f6344540c92eec4d2bc2efb11cb94055", - "0eb5e9bdad6f4ed2fef3521be8cf60a3805bbe686bb71085238f8fae3e217562", - "557c973e9933f1941446cbe85cccec5b9fa41ab85feb0b32557f175f4aeacfc6", - "18df01ea65619a834cba8d99d70f5ea114332760c3323e1258fac4f9dedd3a1d", - "9c1a9be23222ffb193b517a80267d363a23dfb65ba49d5ad9b03086302ee19cd", - "d5d8e27d9b4a2019f706cd5d7cc3e7a2d2e8e88c22eab0b7d72235602545274c", - "04baf676a4300733f8ec25639f4b8a8f55d8693e5da94e42cf9c9752ee65748f", - "dada9760310bf1856cac9653e12cda38ce13fb5d70dcb7af12bfe54775dd67d6", - "ea6e393b90b4b23230ace51a7acda45ce58f3e7254ccb1d3a1d0f768847bad2b", - "6115af94e2987d24763ca8bd98659b37bb77a34b03665df6a3bf1e90a8b56d50", - "1dc2331a6a08d0ebe690fa3a91777bee5235ba5121b6d1a0030179c9a590225e", - "5b8cb644b7c0ed584cd73d1d5f3f209d64f63a69d7ef5531f7631b0210c8c9f3", - "19831df4effb112da53fc814ae7f801e8c7c27b8fa9095279f07bffd334210c1", - "1999912e62274f5d68cd09a8904dbb6398d0549ba436d4e2fcecfbfbb7a92964", - "80d8aefd1d5c7c23ea358e563c032c5bb3287f660de2130d3c717681f5507185", - "4e7554ba790b6d5302659070bbefbb8b6565f9898ef7189381ea59a63d7a4aab", - "6a21c840b203d89d84177e64c7f6c9ed10d3a2d52dedba28e2067282d21431be", - "9a55817e4f42c449321f56fcf95853aa2531bfd778e4dddc1ba7a77e15dbf172", - "0be2c98a4e8bf8088ce34ec75308e80059e636b6db4eb6e795358713948b2055", - "b95adbff784cb6799ce7e79c81496ca2d091a2c58603bc77c30b2f78bc699efd", - "f0f81bb4fdb9e5ea4b65bbc422c4bc9d66105881d1e6d0dbcddc5210cea3d064", - "4b9f8ac52d6f08006e9d983b4cd7023cb046d9d8aecadd0fe80fb1dc39be527e", - "bbd260e00f824c47fdc6bd7ecd5759627346b77b6afd8f992e43a7863f8463cd", - "04507ac42da802b783dff40ca3e983f354a685f3a2a8536936cdf3a7fd9e1517", - "13c9f83b0cbf53316371e605bd1df8058f73f5ecdede3278cf69ba33ce6d1c93", - "c9fd0f0c89235f0dcbc285127545c2b8b19fbe534313bb2edc746b34d444d304", - "17449d75c1674d7f4a0e3310e0ff1b70a83f7ecaf8f73a64d1164b89f0de5af0", - "d51143983678a99dbd0d3d432781fa3c479f156b73af35131266313beca10355", - "7578e6855b378a71836cae087a81d02c97d645661d92ceb0d34fa06ab277b6b5", - "001f136f3a5e853893949ba0b7856f538f76286c47c6d08a295be8536e2cf234", - "d6aaad39e044f76918439e05fcd74e5588297a760e3977c483894e0850141be6", - "876df3ccc53c483bf1f223fdcc5ae2be106f1578b3f1f76b00fd0df1f157e62a", - "a7269b9d967e0655ff9ca1d396762a791ccfcfaea5007cb12d3ead8ec8dd08ab", - "7e2ebdd3af61bc12cf2ecc0fdb654ef0bcd43470883ac6d8d362bba935bcc526", - "0540cabce09b461ecf42766ca60d81276e0c5ce3404d7b6d484968d011cbca26", - "ba3a096e3ab418f9e793ead86e666344c7e31b74d2659eca777fb5026fa24083", - "39625bcd6708ab9f41028ffde0e5a2b3c1df418d959a59b97408decdb464e863", - "ac47e7a3ddc569266950ca64b2f303feabc4152ea89a59c043b2cbe9dc446380", - "fd54d1598d1a532974b3735ba68c7daa2aaf6d16ec8d47b3b3c7fe3124f77e8d", - "b12a80e77acd82d382e712b937a91125e0a4034479d4628cc286a664fc33894b", - "2964a9db9bfd51fe123ab35ac5f0bcd1490c01a74d2328e8a7232aa4e6826fca", - "f69a383fc68c62740bf9511bd25e611e4e921755d7f8262022333dcb99b64515", - "3e6ecbce24b304669c71e6a5b2275f31081e3ccf93ab03c1b1148975c894d101", - "8b86772d74cd36568f74787096ec99e853139df762fdc799736aec6d8d17aeea", - "a6f3b797fb6f91a16763759763f0674dc0d231096ecf084424155db3fa5894b7", - "71fce5bcb324606dd601e3fdb446d627ac25d1bd463673558cd376f131e95b18", - "c6394dc68d1dd59fb1a26fa8a8ab058c8404266594f684d3b337ab6d3cf3fb32", - "36aa13db9a5fed25f14c5d823e4f1199d586aad822e0f9082836d24bf9994935", - "a1a1fd6a8dbe542f95af016dbc1f0a7aac0071c0fcece25540f6f3a7df3c358d", - "86417d9fed052664e26189c2eafce8825580b8cf54d849721d586b3c2b55b871", - "badba5510b45b9ed3ccc62b5824a6549f711ad71ca27466e8c4449088c922edb", - "cc1f2e6c254ff5626728378d439494cd3357b69b2bedce131616c124f0619c2a", - "9ff0dd73b13093e9da74d27861702509c5ff316bde14f998983f42ed26061321", - "2a3070e112e067872cc782b8d957beaef86a78ada90d84001183b8a9de8140e0", - "5539c6fe758c233fbe14d3f7cb9d5ad53ef15ee58cfa119dab7065b608b3a082", - "e8b53741be83db4ef05cadfc34de521c4c721408d472f7b84299d9dcb57d140a", - "5bf254cd3f7dc46efd4a49ea558fd5b8f5833141c2c0af3a5b9eab49e4b55cca", - "512d29de4e94265d3e0b5b0d0c4f661d82b328c537c32ca8b42af9ba6a7cdab5", - "72f60732b3e5b747fa64a6d4e133d12d4c6c671e07a7f34f82bc71838bad3d5f", - "c33e2cacb6fb6b3509607c7205ec1eee0eeb14d5c6676f7b7492975bbf0e6f7f", - "36ebb6727608f55d53deb38e954b0aee45048cea2a015959b81b46662fbefb39", - "9d567470cbbf9e7581262fa875c03fedeebc83ddeb59ac9e97aa55009e9dcdc6", - "a8316245fcd9d664b029627532f66c7fbe059439ea1559392593374f26f79809", - "9346016aa831a7710c1c5c10bf22be624a863a490a467ab417feb4a8854f572e", - "2e728a798f371f8be742ad555a731a9b846390ae1a017bc1e1a028f517178ada", - "2000960755fded2c0bf2be3379c9dbdd7f02e09ed979c546d0b391bbb4174257", - "68e43b3c0b9b3220e056092d68e4984ff1e93922aec9dccaa2f3a5e41c4ae6e6", - "e0f8e7a9b4b46dcbebc12ea04eebd159414d5951f1188379dfb719734721ec61", - "c4daeb2e7f0a8df7aca1d907519a6e6613db9a0b7e9b17ce3c75b016885d7bb0", - "5a2731cbfc5da6c5872b9c9e01f2293c884c7b2eda7ba32b9d0c8a7a8a3a7260", - "b0fac1dd7776d0fc371668a62ada5ca3fa49ff303743d13c474d3a58e5015fff", - "389523f47dca244382c3b4afcfc97e57297bb36e827b834b58de47b08b19e358", - "7496dab79af7e555342874c005a7f3441fec9321c6c50c3543d51f1c8dcafc0b", - "8ce6a2efa7ecf01d8b2b8de7d4758efe4f35e6779ba8e30ce4a13a8d878a0e07", - "36eb6b6d4983eb98de3274422faeac6a48960544c3f1c834d8da3194a4441a80", - "c4101e9e89748731d95401cae2650fc6e472027e1dca0fd8c670f8adeb0ad523", - "f8ec132b52f5dc83f88de76e4c79d9a6db8aee9d3ffc490f94514fc50ec34d0d", - "743d4bc5ff3572177f4e7dc473f7d22c6e7e27398692c5ab31193b93bf2b5933", - "fd7d2b2db83630cbbc7de16e2126a1e897ff905b25095e50a494b2dcbb20f7f1", - "afd04f00b515648b54ded6818e4626d0a432d736ca905acaa4a20962e186415d", - "b3b3185f9a3ff52073abcbe0bee6fd1f454fc0207e047a07a7a2bc1ecef7a2b9", - "3bfbe4efdf3e8c85f48b841b30c813eef150a75464b6142aab7680a861ca4f93", - "363c659ef764efc331cce7b3e321826d8d03c52539b480f8514817d5dab770cf", - "49cd489c68c78652906604395cefb19cea4fb926ca4d92919bf82289ce572774", - "76aa0c61f791803f5d2deb36c9fc2f943690b3e0b38344ac4ee16f86e07d1e7e", - "76d41545d88de6d31a58563d23e172e3c21a55dd9ec23261b6f05f0887bf32c1", - "5c748857b85384161ae83abfd2fc8234e503f765284f211e1f65069a45733b6b", - "60a26f1c10c4ba776c80c0038f24129090df612e0e16187ec56964a5a94970e7", - "b22d6b1fe246cb00f6d08b58b243c1b737249c12d540458ca9eae583bc407eec", - "24c3470ecfd329d5b2e64519c7479ba28b54a4d77ab0a40702f639cfa275250f", - "cbc2ea63dd8c10fff18f667bf0dada06539eeeaab7b37dc70afb6430698838d9", - "319f2dccf151f49d47283309726fce789f70a334d8567f6834fa8fd2a8bedf25", - "ac9bcc96193941f85f374b5af6b192f2868cbe6eaee4f181b5570b4e77d7e0c6", - "10dc3ef793c856c8f8d48c723efe912f422c02cb97572796fe5ec27bf8a0d62a", - "652472f15fc4133d739377e875f254d03321901def280968116f2cb7a47f3d1a", - "ae56831794cb9f8125a90983dd35af256ffde3c2e4c3a59a2851d03a867839fd", - "ddeb8960174dc2400402d91f78e09ccc1c5ea069bb81c0f0389a7f7f866d57fe", - "102376a20b1bbc86c4a2ca783b21626d7436eea5cff81b50c1f46cf9ef0841f5", - "28654e857fea2c60bcab61d512b61ed81b67def7bf99223b474b499199709fdf", - "26ade9973565f3ae38728c079cd1573c5dd5deea03edadee7fe7db1e67d04b6e", - "43230b03964c25e09a12e8f6c90241d8945d6a80663358bb664b326288cbe864", - "1fb9b156e731059a1621e3e9766967af080e548d63526fe9a778957695daafe0", - "9514016cc674325b4f74e4af1c829ebc1bdaf7134a2755a6e6f852db398b7bbd", - "0d7518677642900220d3119ead563ecf2acf3b95d1e19cacda17ab3fb914728e", - "9bb572abb88653b5a69b6dd0728b70dc850857a27e537fca64b5bfbc82744d85", - "183b54d2cd29532c9d9e2cf378bed2393d378f4f5496ccec0329e6573b25aad7", - "759045790a40dee16aa1bc5f2535932ccf37786187c8b06626033fdcd5c92a08", - "79c465155f5f2e392f6af31094949c803d0c841deb2abb22661ad665b33f2b61", - "ce20569733b184a821e36c080353b97b871710eca65bbb82b8e58c36ecebda0a", - "e51369eec993153f25b3cc042ad5678c5f896a3cc02848fb5f60b6e40bfbd269", - "c8ee9760dcc1f64a4c6a9b1dfa08463995e356d0a2ad1081d76eb4a76f9b561d", - "073e0d201763df45106000cac320611d6c9af54e0d1ac9a0d5c8a9566fc8910d", - "04f68b1130c84cbcaf4c0adbac165d7c52ae96d5599c1cc2870c73ecf6bc23bd", - "8e7f52bc3345fe52e5c499a2355bca28f0d3c436b4a4b416ce4cf4324d0ac51f", - "d079cd5a37ab4d3aa02f9092c0e7d3f3c782fd71aec00ede301711386ee5a0be", - "185aad39b4aad16de1026357d02f540107266fb14f7af6f1ac75c2ad5b92ad32", - "ff5be6b0aed895b73df9fb5ecb1678653ea4af496dda7037623c73587421976c", - "2c5a684a0f0c4fdb64493f52017ee2b02565659c731f3ba7c0779b65cd6d6c02", - "623272a53ec865a557cd51c2a1a245ef1fd37bfcb3cd3a480c5bfd1a0f4d1580", - "fd61f9b113a3e8004ed498c39ade51c91854f9ef410213f4aa31b7ed8b9636de", - "e85e33f349b7ff484fee1db419343f0b81275d9bba286c937c3fb32d933ff11e", - "807274c13dd260035eb2f87e02224bbb48fe30acde21a57ef566d39f05b84503", - "176812128bda0c451860d41968dedbd5dcc35e511c08dd8ff8bdd69beab68e4b", - "b448d3a11bcee90978d35614ed058f873def6bde2c0c0be3a64a82e9d51dd6a8", - "3612602a3db06948a3ab9e9ec2f94fbf4fc1b8ebdef5bf30abec9054eb463881", - "d83f0dd56f348cf4282404d3da7e34bb8bbe44fa2b9854f4c56c477ce2a0ea34", - "7b7572a95d25a8eec3e30efddf2e021e5366c267e8a87adc7faa072adbdcba3b", - "df68f1ead193e6663c5ce509e46b43a5f547d579cc76e5b4c8f37ad0e1cf68b0", - "51c82ee73b2d5f77fffd6d11ff7a1909171320d93e642497f1ead6427c440c15", - "6b859349ec477c603dbbb9cbe46a21cd2bd605c03761de9918ee9865af4caa97", - "445e789f3845f8a95e2ee7f0f682f8d58c93a29da0fec23d8d4831a916e821f2", - "cc66e72463dc576d2bad01c78ef7952ccb149e5999c53c7c1dc5a2c85e28b3f0", - "c41f39225c1c1a3e1ff5b9e6b7ed2e1ee712f92c9762e91b9170c65a086130f3", - "8997a23b3fb1b7caf6b2add73ccd236e3450a0c4e16363f672e7b85ac50e2af1", - "ab025ebdb558c8c09f21e28426f1a9d736b3611bf612956dcf408740e912601a", - "60fea3128e755f2c19ae204a9761c9cb0853214160b261f8f2ae9a44ac554a5f", - "e5fd2c81bd8d55336c910f9ed8253a8aa7470fd3b6daf6e2f945f1993bcc89c4", - "72066a2fac73c8dbf0424b91650004c9493aad54fdbdf1970fa2c2807eae399e", - "708e484782434a7f4568564100ae0ce78f0be5438c731707d2739a03aa97971f", - "20bdca75dcf1d9c958f82872aebe560e4d99998b31e3f3861b268115b9bc8c97", - "4bfd78caa693ae9009b356e64ed9b083e45c27e78a1359ffe390315e26dda85e", - "385ae34f50829e0b83a97faab59b45182ac1d14163e76670f569770727ba735d", - "1d7db1c439071dee92fe5d8dcf3cbe2978d6686f3883e7213ca7ef574d230948", - "057ae95b77bcd7242ec2d418eca109e01b0b14ea4431cfc31bed2b332f3498f2", - "7be0cbc75a285f44b0fc9233df37bc4b26cb4fcd70d26345fdfc87f9fd815151", - "2993349218490408ced3549e1c25ebce114f8b1168ba30eeb14bd93e97b2d074", - "cbebbce4e912bde4615c4c6d3ba174e7482917b7528a90a74685cf1e2cdf183b", - "74d69b086828a8b20c6cc7c1298f57f66bfeb5093d6e56c96accd6def2a2d839", - "9cf5ed896dc1068e5d4d370b439ef354f28bf9752bb891b2442125257678965d", - "4d94a1623ae65e9a2763161d7980a52f27c6b24f786b6091a1cb17e7bf6c55c2", - "92d70c86b05a12f0b79cd678b3dd53776a2c4cfee0e46c20ff7ae6aacdc1acc8", - "d355b6910bf31c760925506f08b5404e0dd75fcb18f58f581e4e6eb78cf1604e", - "2d776ca3daf02e01e3c3935c5c8cb75c754656ed674eb839f22a397cfbb4e47b", - "4cf8c1f2ea13d7724604c0286a0f1343a8abe7c637034804f5dcc9a88f90e519", - "3642d706fbaf123c4a1806692d5cc708fd1658b5e30562281deec57283b05314", - "8f9200e3c646b337b284cd4da0eb9834b7867919e5475c7684dab4f4964b6531", - "549f71ec9bf2def52f0afcf4021a265b23ea10e172688a44d98a1a402664191e", - "372a84ac79e028b1b78b11eb2659a447fa6edfb0a04668fd24c78ce15456083e", - "ccac253f04d16e4cc8319c99ba26d32e0d80c9d7f33787fe2bae5adb3e3f1b1c", - "1a87f033844b602cd27c5576e4fb84db2dff9ba57f6b6ceeaf015a551d7453ae", - "20a28f87dd21a9189f57b0b44b89f0d050826a2bd7a26654badc459a8e266ecb", - "baa549ea463b21b3da0cc341e791e8c999a034f6308e6776b19e18ca0949661b", - "3be2cc478ea23d3772a55ffe855170483df5207cfa8691a1c30df2a70b20e4e9", - "9044c024a5c2285a5780c55ce85172f8805ef4bbf01d45f0ed6dc062c00db0e3", - "b404100445b88f110d03141f0f0df91971516cc2d80b4013a3643137faf23adb", - "411072c86936a8c26ef527aaf0a476c919495898bc1083dbc63f76aec885c54a", - "f76c2edf3db39ade2b923ee79aa64b91235700568589677e97aabf2f1f583ce4", - "a05a8655325d356e3f5a8c80c6992020ea3c3f9705771b3ae539c9ad88fda932", - "dc21832eefcc383927bf395d182dfb4ed3e7fbe26bd12585a48bfe7d5331aab5", - "e377cf3727041808af296108c266992e0046c1d91d9d79c1058826287d690c05", - "dce25be5513aa5f4a45418cdc6cd3cdb95b787fa68eee1421381b2fa111b248b", - "c2cfbf6aa699ea7132018ecea6be374adfcabecb20975dea70f4ee5712c232bf", - "a36df00e932307528ac149ba53df50f4b6a1b23a2fc513ec6bb6b96aa26e9a7a", - "2b0d81c2ccfad0af03f647c52e7fd8ce7df5bb2390643894539afc1955946c72", - "9687f6eb38e77ecda73fc672f7cf69489364907f065a65ed327a13138706fd0e", - "adfbb0e5b4e2248905e121b42458119b16174c6815ae5b70d9e93926d304f4ff", - "cd7e41082c43f65104cee63b6e076e58ae69cbe4b7ea93d990c06c66e139cb88", - "c3ce36a55882e4de403203c2b8424666cbaa5cf70a8a7a17cae3a5c0c7c1e853", - "9a8091481bda270a2ebb411fd7fee78cb1d0155eeb6a2a3f76aa70ead74f0ea1", - "9c405566cd516fa6bceab19441ff52c98a86e8d6a4f21c561e0c564a2d0d6fd7", - "57119cbb3fcad27da9cc4c08f1544113784f5afd0b77c8c6427fd863e63177ee", - "98c7f4281aaca9e51215868be1d9dd62a4ea03f90adb48fbdd63f8cb23329041", - "1dd2196d46d1c34566ab96629112c856d8907a76c45f6ad7211f88e80ba36414", - "a800fa9e2c0761bb8cb47c39bfd1d232d3a1681238c11911d63e8d00f159acdc", - "60def79b85370ed5183b504934169cb7e168484ac91bbf2b73318df1a8f1a2fa", - "6728133e24fbad364f1a7fbbe78ccc2207c5cebec20187a83ea9d786fe6a0460", - "ab2204c1db6d36acf46aa1c20528524473af36361dfc0ea4a5224d45d2b9a2a2", - "a62aa625d8c0397e4995265b2417c80c38ab086db4e1ad8963cb0a7ae526a9c6", - "a78ede87f32979d9117247377a8b850fd48f07b6fc158a8da9a473372f4896a6", - "2d4f69241b239fcfe36f3375498ffdb55a13048966464386f0d08a73beb91752", - "8382ffc943cc81e8cc57795ae8ff0a1350a7abde0459da1e2fadd3aa7c151c0a", - "3e856c0a2b592741200dd85e6d1f99909e031c712e770a4703df5d1738e71988", - "cc3eca5a2a8705d618fac0aa48df7005d3b5298e7e0bcd077af2af518a9202fe", - "427112eca7983354c8034d94f2163162234fec1dc907312eaac550c1f115c58c", - "ffb348a713c2ce8fb7a3a06dd161850b3a3c81e0d25312532bae9359ae7fd3f7", - "cc8b3c23a99718bd24c2d23292c8aeca5095adcba65f6b48d19dec85c9e20bf7", - "6bfa08ed62cabad4e32ddeb0de1601b72e7281656ae6cee22d5e793c8c63f546", - "821758b53150100611a7fa03a740bbfc75b8ec9188c3c84c170bcf055558111a", - "44c118f75c61a733c16833f37d2e1b08893af6a781d099425fe1a7f948a2cef5", - "ad57971ccd9f21da8a17b7bb04ef158a0eb65f430d126dc6c155732826fce347", - "50fba7d5e7e30b2ddc661d501a4cfb6e71d8321d0aae29b36fc5b658a50d0796", - "2757a7135b252cbc0a30404445c90c52590acceddd10e20f956bf4075dc7c1c8", - "ff129c0950ddd8810f9eb7e008ee065b71fb00f63ad3732d84052bef339a503c", - "73c0f2503cc9433fddae499d34edd60ca76ccc375a01530ef70c51341bc90f0e", - "298e8a270681d7302890b6d25576f99399b7f9ba75f8c759ac34ff2016359f6d", - "5fb5a2d3403fbda9dcdbd6f76e722e6c20bc530cb1b3b49b5b289561443ae627", - "234833fe0a008b292cb2aeb952ba3be614c125b84eee5b622c446c86481a7a9d", - "a6f678a7762e1f78950364169ffa31d717812cf83ed42780c18e807f8fa76814", - "0d9fd2dc7516d1da09ff061f51e74a7ce260f1f6ddc2ab31f95a90ff4e266388", - "478497bd1f5c547e5df3bb6dd8b51c8b280f6de7f8c539aca7935d1c7ca3a608", - "8fd1021307bf9fae2889c8830272d7b0bdb00b9f83738cbce55d4bad7aa567b1", - "0e65c87232f0ad3f0cea5a806b8e85011c05ef8cafe38e3c7466ccc60fc3e406", - "d1d65d5da362abe1634b8e308c8f0ae1065f7c4bc682ba347b93a3603f89530f", - "ea265898b8d4c363f1e970c6afa2ee41266cb1f429cbf7cd5c489f415f764e10", - "c8f04b2136925be173aa1ccf896a324977e0ae82db32b6d2739b7b49d83f82a8", - "02dd74e54af4bfb1ed0f19db375daed8070ef2d2a56585b8286b715f7062f2f4", - "1bac2d23e32a16ed4d36e921a3aeb2b28ded4e764d02132e5a0dd296f74bcdae", - "5d7cc4fb44fbabcf9d94cdb8025142a137b9bfe22de5554cb847ef0a1aefafb7", - "9151030a7de6c4a927157540be610116b9145c3993cb91710a70430f0675ac2b", - "750122b77ae05202cf443ba5631cd319610b33a2d0e93682013613c2b30cd5d8", - "331bcd4acda6675fc46f6695cdb6371fc260fc9dee07e2720386b04622c9f7fb", - "4c19c5596607b87bdd114c389981a6ffc8566775b8d7930037647264fb3d8511", - "972491246d454c60ccc3e9254b82323a9006757e5d1d32a4e6fa4a10f5f20f73", - "28ad793e220feed3e5b1f1de82e881dd4ab23ed5eab874e04be93e00e8e5646b", - "b5dc4ca228503cdc9859aa51f9b72354fc75b5aef8e6e262a839ea58bc0134b5", - "11971a8236b80edc580f11daa4c8ab0044b097dff9c5b85069d6058278b6d036", - "0ee168661e7334178fa967a247ca484422d46d9f5e096a88b90be8743283daf9", - "d1c2a98c5c6ae4ed2acb7324d83270b9ce8528f4db04a745aa26998494066fdf", - "97d209f9fbd11939350de54168771579c29e8560d192944c9ced62d35c16c07d", - "6bfc148e18867434d37bb20cb3cbaef7d26ed76b478dadb35a5937031c817fa3", - "338f6df9aa0a8f14f944845eff843cb7dd53dc88757e2afaef6710a9106f00c4", - "8abda40ec3a90a1a2e6cc2db6949730eb3da180235534ddd1f12cc855ed64d85", - "40c62c750b7061defe62e268b7b12c137b95ea11208a1e9bd72f1e4bf66baad3", - "3984ddcb5ee60def91956fec75faf415e907edb08481cf9b5c9389620fa3a671", - "d9601e6c7f9eecfce9dad6b93a01efdbded2751e56c839768f9fbc8f8489ae40", - "f3c1408c25b6458ca6ff08dcf7e4a1fcbf2131f67002a067bfef175724a6d0d9", - "d73f80b9af77d3ed3a384f4c9aea6038d4a0fff9ebafea515a0d9d3fac8c0ecc", - "209466f81e92057fde3e7fed561403a118a38460a05ba75c35994c888a3dc073", - "db601391c04a5bcabe73aae829e93e949d7f51449a6daa84158db6243cdc6cce", - "4b76bfaea2c7e2d507103fea857b9e2f9198743630b39d05249d623479021a4f", - "be8fdf75bbbe91e2815a74e88a475b2b5e36bc249a548d5c15afad08929c1a48", - "5f053a31e2032b51b246200bddf966a94d85a99162b63be322992a5aa3038cf7", - "d53282de92980c36049a574337a997233a868956e77f999eb141083143ff1522", - "2a7d98d67db7fb454ec77ea300577ba2d5a832c1815dabb912996d4bc312f879", - "5b05f8426536b57560665b54a46cbb0ae8e7579e1b3c1992ebe12d91bccc6705", - "1b5a13bcbd033278df378dcf03b2aa2529b417390e7d8ac53f0a2b6928211431", - "6741d4f3af5766b33d58544dc7dc9c480874eeb77ab074adacdcd1b80f1fd93c", - "2cfaa93dfab7f7f92de5bad21bdeb97a1a446769c8e910104d783d5e27769a2a", - "72cfc77aa0c3f22ed7be13a7d9bded1d10b1940d12c8ba1316626321030eb9c4", - "3f4eb12bb368b21e55ead2ea21c9f55d17b62046af118263e9c9972ee5c7f1ac", - "c4cfd0e22f31427db675db4d5598b7dcabb71e905be469eaa0aae4ed5969704f", - "abe4ba5c7ac1140bfa88d00c360e5217d037b5ab215b427e33d65ad460342d3a", - "f157f111fb64912f68ad103dc7e831155f68939e3774733e1b39dbf3173f3aea", - "c54bb031c96af385419f20ffcda5cb0fc1a1bb78f94dd311e358bda7cd093a8b", - "15dfcab0a31d874f85a212ae2cba028f70ea3bffe0173283d7c01ed441797536", - "69be933125e70d465a756f6af520cb56cec55cf26f1da48538bf3861a5893e0a", - "d931c5743791f7b3e0fd5c2dca9db79b89efc792ea693ebaad77079a61408825", - "1d167c61c2059773ede639287f22b7c8141d9cfefff49aeacfe2e1b5054e08bb", - "6e2e417058eba01f39ec7f9dd9b83988ff2f151ed266bfc6f7227b0f8fec5854", - "640e5dda122a74d04b207c7431a840ca1a84baf34f6707b4c99b46e685203dae", - "5f89dd8437c77a736642ccbc5fc07f98e24c4119a78024730d8b8f14f05f13bb", - "c246aedc9cf17c3dd43f604843353859300f2abce5aefaaacb773436f0eaec88", - "b5dc6926061314b326ed35ce9435dd3c904abe2bcb6c88418f1785ef92e1a0ca", - "ab60428ab513a61f6bdad62c224df6deca67ad5dd42217efa735da9d2df0ab22", - "cd9de7fcb29d08e0bdbd06e4bb9307d9bfd3dc43bad16bc511cf0475b3045da4", - "ea17179fc678755229c9cba1dffa10b94dd5b374bb7e303e6da1102d78380743", - "cd3b4409a8b4013a2f833a0079b54a8afdc098b110821a0491c1297f8a9ead10", - "77ead24f33f1dfa5e3c6d84384549af2b4e1ef941035dea760b950ddf3fcdc2a", - "6bb13074df7bb056e0a354368282c89f9f26cb2a79db67ef37db446b36d3183b", - "89ce83dda12061ce1e4ffa692c871b81807d57f20645178d34e81070587068c5", - "2ddedf54bca6679ffcc6bfd064f3fced1c0c5bda68b6d732e433f3086ae03d67", - "a080d2968c845d874b81af3a7fae8a6a77904c80a9c0dbccaed2c53e8453c10b", - "cfd3248630d560b6d444fcb06982a2092a8e479305393a7a4fd4afeaa90cdad9", - "675be520a313273ea2a753bd2a94843f936b8f912940bc75868029fb669afd0d", - "cfa7ca321d1e7e779e6968ed39a47b986e22771131528ec805c9199dc0097cba", - "e25035838cac1deda0dd2117dc6ee3fe9611f6a13bcf5effa7c1303df5dc9b70", - "3fd1bc66f23d431b59366bf89ab529719c698fcb19d1120859e5e6dd1e0033b4", - "8489e67ed50ecd7c5a3210ce56cfdfb01fed4336868e6a1f07354d9ce5032b0c", - "555d96c88f43092050875eb5134268d2af1608cbd54e68ccd3eba37272adc58d", - "e6a918f416d472c3095abcc71ab72f48f03fa83ba4dc29a7228ff2ca85f19d18", - "18b318536d262f3ede169ce8681215153c36d2288cc2132d88cc85d1830feb23", - "35690060603d131895a12667ba59a402ba09dfa5ae5b44e9430990c8df4d72b1", - "578d1ffb52dfed7100971ade8915f2670e58e954e9390fa746e1d9f7c95823e7", - "6ff61a002416d16c0b6c88e9ae43d65e26cc2e5cae1b97b4c78564c6632f0ba3", - "fa5b10a0f7456be6628e8df8444e2983830eb381fb563af73b2cc36eb5bb379b", - "6be56308b242662fc81ce57766abf138d8632f125faebc4d14c89cfc70e286cb", - "52fdc1e11847e2e252d9e4c92377a77df96e6fc891f7f11c26e81a64851280cb", - "2008e51daa2adef3d1c227b72e6b1889f8c4d529606995a9abba4367f4ba512f", - "a83a7c03525561cb4ec050c0faa0d40ab42b3b4865655c598f1528e96d26a2cf", - "1db0576012dab05cd1f3d57d5c6e995b1ff429c55c9623bc9d417ddeaf1294c8", - "511b41be7dc3782ca099c1f4cd51652cadca3d5f8684e06e85b2e928e1cff984", - "8a89661cbdcd0929dea109f2b8b949a09ffbd52120d8c61d369c4820f76a08d0", - "9acba493f2b00c2830c8ef7cd3cc333233aae860700ba4dc84df37bfbdc017a9", - "efa0c77b91b45453e9c0ec249a02ace71ec2f35e7ae0aeed33ec0f4adf9c7704", - "bdca13a736d3e3fe409837733c4f2d14c2296528bbdff11d9ae3bc1730d98afd", - "d6b1efb23d99a82ea4728ec4b5ee9a177ddc67f958486a4807cd99e50fd339fe", - "a80d5cc5fda7068a01e16c4c1a03f0d14e1c5dfa67d52a8f6e2ae92ece4f497b", - "6f35b5d872d412de16bfd410a509052493dea11ff828e0ce694ee847ae4878d9", - "ba5a01bc5e28cf4e580ec044f62675bde6bbd51c711c3abaa311683a62cd0a62", - "b268c94d49bdc9951a2a4e60115aeddf3c9d09224ca941d41e6c512f24ca95c4", - "a993b7cbb9878eaaed1b33cc121b7b05b3f0a167a86bc63e33265315939aed82", - "56b0d746f926e79740f6c9910ecc71a406d1d57e10ff4384b22faa49237c3693", - "9323466964d44bdc4a9ba69506f150c9b1ac45d8fdae35d0ea177180ea5e5ee9", - "5f4790a697fd94d0e8181cad092d27b9795be7cdd7ccf89cdd900eb7cc2e8521", - "ca30639c00208ef604f7f44be528194945b6d0b2aee5e97edb35b62ffebd5db7", - "a62515333976b0d2660cc19c8ecdbde55dfd1ebd07e3a75ff9384dd9bab8ad49", - "df7440c929c33b1a824f3dad1d78634f5ce6a426d3e7a3aee294a056392cb133", - "cc104f54a513ba4b872a4f418404c166b22908df6cfd5543d4b7cc4a3a62b4bf", - "c63feea0a2499cf7d05562e9435dc95565adb9920812ad141cd36a09c24abe91", - "21bab66578d45e4bee36699dfe854136fa358a6230c0f55b4463315f072a8b1f", - "0fe563b8f05ba327167a6c549b7198930935f65edb027d87ddba889b0183f347", - "705883197023f0283340d910684e449af9485fdcf0b62c172304a236bbabeeca", - "3630badb1ee769a491e91e3e47e02a2133f9ea7a88e049adf609fc5aaff247f6", - "2dbd27d9372c49ea1c1a94ce49f0bc7bda00bee16c3b50f3714fe2e8ec93b49c", - "ce42fe40fb8b5213bd56626b3c32fb02a4130c644eca0894121853a905748a6f", - "14917a98a589659063bc84b9804682d3cfb5c8df8f7b9f562b5525a29400950e", - "1c4d4f408e43f8873f683d2a38d20b6f1aadb60e6c3efb948f1ee77fa107486b", - "2f0da8f6f142d113efbaea1ec00a4f3b97d0f6b9d2fd0cc9b5a6f00071a166d0", - "bac40d1661d6edca1b8de050a112319a28cc7afe853cd9fe54fbf98f59336fd2", - "06fcc59bb57d0ed89bfb493f06b5fea4e0af778d80e1303cc738525535c73f31", - "0b945f85a56aac1014ccb843f4cac3afd2b8ce31f2ff5f13f2209acc41118571", - "5eb107782c8a6b32c8e1af0db08ec190e17316843b1ebd7c0c696931cb65c82b", - "03af52ca9f7a3f131f146f54ec6b8e38cd2637cb5cf9e84d7810b28d03d450b9", - "d9bd04c3c627d92d275a1be0fdb4921721ebc2e77d557a43b35bde4716fc9da6", - "a42ab029d0867beb37403c3a2b6f0d2e3f8ae810240bb345453a10bc5426b1d2", - "81223abccb679a29c38ae26d948c818442ddfd219dccc50e7750f4dd44838c30", - "b374b47a8fa73b3bb38053240473e1897fd7d4aefc22c2d1f82b714884deceba", - "5204974ebf624da9428923abab2c00619e79b4e9416e483f37e4f7437822fec2", - "68bd55132427f8ff7d369ddb0fcc169bffa4e65bd289986b1958f327512c86c6", - "e1182f0b9bf0c943d4959d8fba76b886182700732a26d6b72bf285087e75d81b", - "cc658b156423e9840f2372dca53c1b44679e8290fde3aabb08c9c2589c259aa0", - "31bb146e2346e277025a445015db4e534a7e13da45969e7ddf81092518833f09", - "0d5412bcc98379dbcf94e41b2e9f4f48fb7f6734100d9f08036ae5fa6f1f4a63", - "11bd3f98382406a1e5002dbf3fd8820c94fafd84e47315381efdbb9907b0f439", - "e7023ebc7e50bf911066f5d4066318067a5878138aab906de9a82b9082f35559", - "851b25adcef917cb826e9a6c45587f2f2b75559c9c78c9f35cabf001d6692ff4", - "b4142af9c3645395b8b3b656a49b6a387be1154702fff0e7571db3ffe6a8553a", - "3b0d5cd3c9e709dfd48648dbe86ae85acff99a05be368edda11b9dc9c20205de", - "ee354c8c50d0bd7475c07922efe07c0bf865bfc281307cf7f0916bfdd9f7d532", - "7c3bfa8c5dbd240426545d861d902ba12bec589a462d4c979807446b551ba3de", - "879324327caf10d4bcba9c96f13353f4199ae077817d2fed8db953e3b57b06bf", - "84a30a3e7fce5d3449575fb41f4e52b14262bb0b6f62850aafc0e0ed3545c968", - "ae5278e634cb5957f0b6bf3dd1b59552943fff6169fb4f6551f0a55a22a96011", - "6b85980ba055f51f5ebaf4d2bed4bae19532b8619abca4795a61ba6f812cf0f4", - "0eeb8655f8aa702b79e1fae53d8eabc523d81be080ee009cd36c00b819e43b00", - "bba4687c4a30bbc33a11484b5f702afca6f301e2294d9f03feef71acfebc3805", - "bfb420309ea2cede3aeca22b7e6a1e13bf7507011fafc9275cd0f99f057318d8", - "a9c19ecab68f2c48860c41e98357b85cdc239028cb27b3f0480d809dd705d925", - "0723aa1129a81867a04f8f6f83ba45dac2789e79e5e5c743b29f2edbf2556d64", - "9ebc21e4693900bba049316fc56aa739a66c522808ef5947841746e60e1076f1", - "a48857bd201a94ed94588ec0929081b18199a2c983048da77db9eaa6f482ab35", - "ef0d3313b41540fd5323d3888bcde7157ca19836d3923ddac5766051f4785c63", - "4e3a057eaf337ce4999e8309d9c039fa0fc020535308ae740b08799aadd8fe9e", - "0ec0971a3874981d5c3251e0af13bf97049a369ac80ee67456043acc5d1fea1a", - "7bb05cef66f3810a4efe9a1e54d7fdbeb3f36420d648c37e91f83becd7c3e0ec", - "17d483b0380a34fc495ce0254e67d9164f41778a61dd26cf4c37bb742ac3b7a3", - "3c93381dfa378bbcf8656fea8cd70f183bb76c55cc5f71787c509815d7bc5bd9", - "e95a6647bf27fd213e180601837b6354081b2e11418ddda26cce91b53b5e2676", - "e059182413846890bf3c44e3f1b3367c95bfe19485817df4e32a0dc0af8c1657", - "6ec1240850deb5d181d6c563e6c06ba1a0feaee418595a0cf2a00c1c4345bbba", - "e8880d92ce786de45ae510ba63596957a8a1ce1f64b52ea083d0a5048be16b53", - "f24e2f9d2f2260f8d562f63a0c458808e0753225ea29ad473fc916e2ac602a63", - "aed0081227e18730c4bc9bd1caaa5d516813dab27bd22298d30268bed235fbe3", - "5e861012a1b040b7139ee0501c8299bd32da70faccdd8d20ee6083ed5162e72b", - "3a3244dcbe948935c5d7feb2bf28f5707543daa714d44500f95d1d4fcff0a7d8", - "a1bf13ef394aa1fc811fcf7bbc62773272b93e56478818120c363b4c1b2cdde1", - "11daa15526d9678aac69427d8d67dcbb227bbbb27feaf015a4bc24dcceb80ada", - "3f829c5d813448fbda1e90656ce8acbf2d6fcdcd1f60b29a036d05aa8c4e337e", - "e6fab4750263251a2cbfedb562ef917b63a25f0bcee5aee3ff6d1f7938e4fe3d", - "1113869ab1b88e9bfc28712b9841afe01d52ea516d0d8ba8e14fd1727e5fdd2e", - "cccf33b829f2e61c9ddff3fd9adb929e559bd45e7d6c3dd914b891ff2a9ff70e", - "1d9bd575d6e1d3102fa3c17f0672581e16a9d73c097e5e0882fcd338da90281e", - "d7e9880c3dd6d221315e08d4a7ce8922f9c918879ae441486a6594fb00eab6f3", - "ff154a1d83c277abdbf11ea6e4b312ee36f4864c901060d2dda177d42d0c2354", - "54801c5e51f7af143bc0f99f78d9dcf577836005c1a6a025933a2febb954526c", - "8028d5cd8ad52bc5023bb6fdf13a58c4e4801fa5ffef12eba2349a393464c5ae", - "94580de43b1aebdf030710fdaccc2dcfff7839f369c634b3e1f62910fabe2bd8", - "1cf615b7c4c47d6969b3f35a5387758f055f59d45b203b730a2e8d845e1d97b7", - "df01cd343851f6d25feaa8512c79178c28350085e15650b98942cce095522cfc", - "a79598ce6c3e0ce26d95669e0a1739a781e6ceebb76375efe01731fe51d70def", - "88ce96c833ac1737a5f2a56e671c12bd20e44402d76f54674c4632af3a4b1211", - "c7ac56d9aa610ea6670840ee6ca770463eec10fff50ec22b7fa8693792782079", - "b36c2a18cd6257c8c0c7a43bf2c4ff7b50ae023ecbb89fa0616e55924baf8213", - "0e6841f4b08780b7729856c24b78ebc6f2eaab983006cef9097847b0dd0fac0b", - "d3dfce6dd890c3dfcb67e4ccf5c9d3916383c0baa157386ed41be0c719911224", - "656b83a600761d663742b21dfdb5f22171a7b0a3ba3332317fb444e8599f7248", - "5c3c000b53bbc9fd122f7aacd72a8d0104ee16c8926c25088f73d08a6c9e7170", - "8587badcbe435a6f21b0af8f9865ec5aae25f0bb8873f575256f5bedd7716fea", - "5cf48e2714896c4c3f0cc411aa5c6edf4798b49acb6b645e4762d96d9efb2d67", - "af3ed369aa094d8a3053269883767595fa84153c10ab5d531f5cdc1727cbeac4", - "d42f9e2a48a65afda101b232439951a7e9155c4c24af06bcf54d4e1555697393", - "0be87070d539a942882ba74109f4157fa04e5a7850d68c8d7930c427919a401d", - "17c3ce1cdb1b8e48a6d8b6846d22f5a83da6c34cfe91e4c56708b3dbbabf5083", - "d20ae2071df89d209270e7049301d5aa11b24d2269cab5a402a0f10e2eb4104f", - "13c022b5375b0429178aafa08a967512bd0d302b99886bc3cae2113092e82be4", - "4ee9c5b3f2887789374a357a0925df85ca60c34ecde325ee15cf8e8e8668f3e0", - "094d734125cda05951c18587b38a6b28723647e1b978b835f2279d14cb9a978f", - "df7038a09f430c41ef945757a5837d6a41f4f654a5a559f3ae8f9b14cb0756f3", - "422fea86dae172656c57291f0a156fe4149579cd704059be72f9a84766912273", - "766ea8fc22ac54bd9ec09a8937f65602989a6bc051670649124c1771f6ee4f1a", - "b7a1e54b80383301ebd6ee753e6d8072380301dd3db4a1eca41ce874eb56b22e", - "f1ebaa08174af277bf282e4a88fe57dade5f05534621d36553f6b662df774606", - "33fca86f767dd562c6069ada7548d8d68f0b022c0ab0664f61ecb280c0fcb748", - "d8e812f8c52045aacb8fae63e965707d6240ec8e6353a8735ba6ab59ce4ea074", - "ce1b32f8431cb1a425d2b97140e68d79ce1fba6fbfc206f11c2bb354f538a7de", - "860def35eab4230a1abfdd6b49be48d63a2dd998294a45df97748d98f38b814d", - "8087a56be9d59462ca0b94b4a05fd6ac78a22df347f542076a7acbfc13527466", - "a4ee0c1e65f5c5bf073505b20e44727be76703583b47b3cf5cc1798648e9ad59", - "0149392f6426506a4c3cc5ce584a972d1330735eb34eb98f00362a8d485f0758", - "ec5ba35a0cb444e5d29d73943d22ddc10cbca2248b00990c52d9092b5678960a", - "4ba1827bbcbc7898a12c280b40605c1b30f520137fbf764d8e0c5412c24a8c55", - "149b55624bace97b3adedffb9ca420e1d721a6040debad21ae006c999aab1bbe", - "5ff3007f7a17ed15886a2f4b2a0e414b53dbbcb2e27785c0144e5f127e89d871", - "f4400ac5d883fa72a08b78934e605f7d9fc5e479f8bdb3bd1d5de2179d13ce42", - "3897c0200a96849727aa5902860442edb2ed4a2804e469961f975e8d447be401", - "98e50067e5aee5d88aae51250ae344ffaf39f03df97df1967c174fb517a8426c", - "cd493d9788f35f06462c19b60bf12191a32d04d815465853e3419175e3941d3e", - "844565d000a7d11c706083132a978ce7879161f1b28e50ab82838b4d37623c1d", - "2d6a168eb3dd508db7370b07497512681d8c6b31ef7bbbdbdff6d9a830408344", - "72bfcd00f9a0aff6020fd44317d83a7dcef62bc43b7a048ee4c83370992b5e0d", - "e636e4a83fd9ea3eba31a174300d94aefaa86e3a842ec0de376f379907ca2a63", - "5a74b67cc1311515f01a4b2e719103d7961be9d4b01ac0505583f887b64a0e9b", - "24fd673dac2885b2507e64c269ca395c0f47fcabb93d3c7c76d6b742f1c2f379", - "52d3bb83002ba4a56b8d6ef002d431cc0e4ac10e160a5c97eba74ea0f37b6515", - "1189277d26cd8009b420b6ee57309e12987571641093ff44bbc65aeeb22aa6b0", - "b6cf3a94815232e701966bdb81cd9130d7e32e1479c33b6a2474296a3e0a02f0", - "03a69e0e8254a4f13d1bb8ffbc644cf0ab94a46a752e8f0e9fe560a6e7708d08", - "60cab769b009e6db90bfd42d4d42dacbf66f66e4f31e7d03ad59cd08427c259f", - "49c8e555515df468e917336ec3200affa8f2db8891c126503408cecd95351c95", - "02ddbd0d07f6340a92561c4bf2f37370b971884f11f67dac3952385b4ef33f03", - "389d8e82c2c2d7cda8ad9fcf62d5f9cbd63e7c3a534699e55d6308c530afcc52", - "352a8fc57c8d4b5bdb3373347a848cd27de7e70994579ef94e2a592ad3f6cd0a", - "9704480d16c0c16de7635aabc8f0337dba789bfe5836049ad25048cc7376e605", - "4b4e663700b3229db33a02e875f03b5f9c5520b63f22928adb101935fb537d7d", - "021e163e3504046e5f0b3e94badbae158c9afc0623c92ddf45ad1a786034a995", - "155fa78ef7f63f1ce06d92918685b84abb1a01bf9c1993b55c7c1d9cd7eac070", - "3fd180f26cd4234a17ff87ba731aa4242849d2f078ae14a755eaff947b4ab705", - "21960264517a8306a9838727fb2bb3180866d793dc85562670ec7a62ae6dc2d3", - "7d215dcd3e00290436f468c804aa419a00ceeb8d02213c2ad4724088573516b9", - "acd7419e9dc308a86bccd27b0403c831e1187e9b882bad1d73caae3eeb386fce", - "a1afc6d18b8fcdeea89e91a3bb7cd48c88b0d10f311aa68de455e7fd155c707d", - "0385690881889fb0c386cff0e64b6e9cb126f2de312af1fe6c1237b2aacadcc8", - "0fa28571f174397480489d4bf8bb5a9c7bd3fca312b10c3e7265bbf0387af1a5", - "f0db59a974305898107dd89883358e46e1079cf7107eca07da68e36cd431d2ce", - "3b0bda623c866d50da1e2679ad17a3b02fc04081851665acbe763ab54fe2d297", - "324f7c5ef71a547fe415097102cd966a8c95a1351a6a8f8dfe735c1275d52fa8", - "d651dc5ab9ec9e8b3fa91e5cb5b6547bada7419bd974cd727742b8c985be80ba", - "e04825a51d6dfbadb242e8b76f6a2f61c3b583cea7d2efe8ccd1558adcefaf23", - "775285835800587467f3cd4497f43aa7a8b1a86af511eb067613512aeaa13b23", - "7d97d890917289394ac6945aad5f68f4f50e3147e4719b61a99693af0ea50a02", - "445805e6ac12b56c7db76ea9852531741dbe8d129960d5c541d20a33d9451f02", - "b0ee84da7529cd20dc80f6f9f1df95a1de4ae411e45bc879b1cf852175c340e9", - "0d1d24a286ac6e280c9d86dfae7883b2221170e4cd00a9c4461ea9c6d5c191b9", - "06818c3a1531c2b57b2c2c458a8e7b723c0f4f780d9f16cd1f9d0a0ff2f4c9fb", - "32f64ddc4ea9d1842b7897c0dedd900df88a142a1f63f25d356ba2652c01333a", - "86a21fb6ebea5aa64b85ea1007254c72835a7a0539a090bae43d108adfc9b42b", - "6cc9809242a287b9558d0b04c2434dbb440598e09cd6bc716c8fc3881ed75a32", - "eeecce090c3020c610a95060326be692679849edc000f4b82d2df7d06e5c6790", - "fc93b943e28173cbfd74a4db51263d9a624c6a773feac512bc6e426beb0b55e1", - "aa43ba57691eb77d757c950bf5d55e0f1b733580c9b34f8ab34adddaf134b2d1", - "4b615fb9310cf3dfded5002712f448941f9e541eda37de1c65c6ce58f7e881f1", - "0d6945b085da196f5f4bdb144c9a4581260265b1e7eef15baa0e90bfa2189ad7", - "03ea6b8c60fb3529d1db2879228ff592cb3eaeae28ee344647dfc0420b4cef57", - "c728e4dcea7b9798885dc8f8f55e8abce3d1cc23c96c5256e75337eed776391e", - "f678a9c76e590d5f116fd6c3b3eb27a17af9f19144c2e04ba9194a817409e702", - "d9fac7b2b2a491018cfb430613bbe3351c993fcb58ce50015d8032a228fb4108", - "ddb04ce0e9f252108bd3361c476187751f3081545fea68e5e720b3914696396f", - "7208734777004171f319946d6bd70aa20f0de6664c09c86f944b7e0c16dbb5e4", - "cd4fc4d984a8c463308ca48ab49cf50fa2c65a77f780572162789299ca2dcaf2", - "33d6a68b7713169c8a6a3a7ef134a91bb782e34a09907cf46a89086dec08b119", - "39340fa5561082539322713fab0274a7325e36b48b86979e2f597cac52ebb8d8", - "01adceaf104489e6bf47d8a5428e0071d915f307bbe41768fdd1eae1aba4d4bd", - "6dcd22a5ef6df41146b5b06bed75fda8c4d84d3877e29242521d858025eba480", - "db8ca6de2ecbf1114f334d4622eda13c703bf2b4993d75c54eb9236d6ca08251", - "83f31e9055b473b1621d5fd91b24ce0bf74811e8d517042602dd8fcbc68df3ca", - "e22b5aec921f02aa1bd613d15963da19b378ea57feb9d87df980348cb72bbd80", - "88b72925dd2206f5a29d3fc82f3cb5818ace16b035adf5e5459613d048d774bf", - "9d4eb902379b0c7a88d6fc06bd10426c5eb178fffd80cb4011c5dfa4949db831", - "23b1c13dbebbd770c88e1f40eb654511a065ae5b3a676ee8111e129c8dd54750", - "bd52c0c5226b4f943e725d8031a3f9a9f223c2fb91072125183195ff2acb46af", - "72a0ebef41126993698fc316cd66f26c46f7c61b353c604458ed4eee57e8af91", - "6fb2dca73654097a2635871f81cd17f59f19b96bcd78ca33a6c4656e2d2a5259", - "8fe75747b4476e38e3903b26aa8a72e6e06747adc97f6689c4338928bc6eda38", - "18b037eafaf72a1d737dd395a3a74469dd5335fcd44ce3c79257d332e02ac7b4", - "eff08721358f11f016ac134598056eeb244d9042666c6502b9940157c842579b", - "cc2b265e93965918ae684bc820fdd4a7bf5bc918fa16dad775e107a5251436db", - "6c3443376282dfa613f5ab9f8f52c24c88f7c7d9146a963e20597246e990a5b5", - "c5cb8a51cf31b19828d08b0e3611bbee0135e2e0bf18d8e8d41238aefecf4b45", - "ae7193367d4f7ed7df2b3bfecd35321ed38865a767b730c51fd4d6eae23e7ea2", - "b31d5a96cc12ca9ab314525c774821110423889a2d58ac01342ce090fa061c37", - "fa9f8076846286f8f56ccf827893264ee09237afa3a299787167c35979551067", - "0bf5db29ae63165adc4213edb315d702e89d374e4e87c6717afd4a30183c7ef9", - "41515e3f347b6dfdf10b8173eb3901a378e5dc655064b195e12ae3f2562c0249", - "b4eff4558af2a71b3b41d2c3807e5af7f8291c3f63b1fec73cc07f82cc489902", - "cbdfeb4a044de84d4aedd602b95a76ef4a97d686f0c8a199991d82a169d4d772", - "5b44bc5b7c972af159cc54d153be3a76ccd2c2abee94d63edfd59c07d547cac6", - "5b108b347755d5fcb418cc7cb45d65b2abb9f051eea70d0625cfce81d4d621a2", - "c6c8c029d6975c306bc95b8e18eff56dde5e2019892291e728b03a2a843549cd", - "2035c793368ad224980c464bab1bb8cb7667378fa37db18f8b386eab07c8202a", - "da7e2b502917b0c8c5b9681c57e98f813f9c1ee02e4454c517bde7448fbdd63a", - "18610ec269856444ded56d3c40ff53686969b5201a8ccd679c1919fab0303a32", - "3c50cfe48ca269ac24156c139efcb71157f6a958dcf0b50c354e2296ae079288", - "a6f3c31c13f261ec206ad0fa56df4e5097270281154c98d9581dd40127e5f083", - "f8e0e1c47f047a31966595573048dc378106e3ec294863b96faed2b49bfd054b", - "f1fd95c93a2242295c0ae8e9e85496dd15cdb42771213ba8d8c301a102f36627", - "68a3fbce3e1d6d8e0241c5b16810a972d82a610c65500c2362d44b99a81d2a44", - "9f03fe2914a38b7b1f19f27831332e5c1922250f3f67c17e15b28dc04a43b331", - "53dd408f02afefbc86cece1f80af9c1343c1eae560958779cee98ab96e14ac66", - "41590549857007c1fa240a1c2d4d7aa0e6d0909a0c74bc36aec9b31f5b77d81d", - "618aeb684ee9d24eeec5eb247b85e61490e5c278893d3fe1295dc43d496943ca", - "1da5c9bc339c7c5687ba96d8f531a5c28c22f2db1e0d67e32fc2d99128ef70b9", - "5071151464d9237522dadf3bf83737a834ea7a62e0dd97d9741c996b9b14d9f8", - "69f78d62f5688b69162870f86bf1846828281a1fb53e00df3e55e2f97ed9885a", - "023b44c0145f72fe843d331821ba80f4256e2d2080030decc763e6add112a557", - "c091c3f7ccd3890dffd0b760ae15da03b92317b8ec1759f0ba9a8ad7de662c16", - "bd2a661c512667b1090e3a7608aa9481fa11fec3ce8a42071ada6c73f9e4e52b", - "3114edd327e05114cfe295e7a31892bba06685b41564a287894f132d09d6cf20", - "e36206bc5acec00078d521cb3e044aaa6971941adce27ffcd3187d75b0b22107", - "f5c1cab25f33d30c55e952706001359aef86bc0338ef133e5bea9880a4acd8e9", - "2fdc4a58350df102a2b3981c24caeb50b1bdeb05cf6894b1d512a82ba1ba23e2", - "da2cf704bc0df32d70ea1abf71f6e52931fbcf905e88e1a37bbb4f7f4999eada", - "d11d2ee1cab9152caa46cbcca6763754e5015f05ebdec320f425fa41c6a17771", - "03b37f54175cf359843e7c0fcc1fc5af5a388a4c21497382a7fffc67a560af43", - "5920045e0c4ce1b846a7ee694fa826aa88a80df6080930465789a5051eeeb585", - "2daee745e20a20c0c128f18c17eac2876e28e3709bd2f4942c28556bf1bb2066", - "dfddc52d712955d600fbfc5cf2818a0c6d4d940240b2ce5a772af637ef2ced47", - "2a84e086c5a5076b6eb3de4301cafeccf52996b1e3a4971ed0e692c047ed2339", - "fb6f21c3c92599ecd603947ffd4091f631304c2e511e82cfa4bf6e8b22b38def", - "13d36df58915081ba63eb7df7a90492ab5d637a0ee6ce3d99e15b52b732bab56", - "d9786d97d628a4d09fc24a5b5fdfc23a93889216c5c4f4e7aecc186a9e8a936a", - "6f78b732e2ce8dd2e69a1767afbad18c223838786111acd50b171add75ba034f", - "2018076e22dc2322826a7394106550591384e4d3252eb804c4041e0fec55edfe", - "aa64a4fcdc7e6d13991f53f1391d676f2bc17f3924436c9dd108d10bb8303838", - "1882c510d1233ac3ecc79b3d701baff5c52e8ce503977bae26225036d5f4ea33", - "f6d5ff601785e28bbbdf0a167fae6d167ab3bd1b778b31df3223ca47d6cf336e", - "26fc4d963112eb4df7895d50e23a231b3f8e1fb75005f75fc61a51763dea431c", - "41d4ff2a167e42b843fc6a2ed81c5283c152ff3fbdce28f9e005574dad5be7cc", - "f90ddde8970ba0eacd207c68a7c9e810b026ed5354757b30a9a522596e208e69", - "085a2a40b6d59fe79952ad7c33cc1f30d21a497f7e7823cd56458b9ed9177ba3", - "6b0a9e0e367d538db4fd5679c9cce4408e6b13a6bb8741e1a3710e9772f30c70", - "cda2e26703867b6b410597b4166424b9610c2b2775774637abff4624da15b6e9", - "9eac28ccfb933c870a75983cc58e40f80a7e8c959dea7dac87a09db32f075952", - "be40b6a323ac8664509ce8d4a5c4df41249e9d42e9e0b0d47164aae2aa340ac9", - "bb331d7316113a09ea64904de6ccc6133b662d0f39f66aa9773aac03e2f05a20", - "88dab350deac1f84aa2ba6d47f147ae851ff173608316c1b2856428e2beedb72", - "fa5c7f7a67400c209facb75ce084cebdfc531a283b363576331a1ced7af417fe", - "1dc1ada011354ad1d54dc00b0bb417b74010287a2b21a6fd76096538137fe1b0", - "bbb1b6e4938a4683fc0b95f95f1de14e694f104ccddfef4da090d5bafbd63989", - "8d19c2796ddbc58d4139eb8227fa095d4404ee855a5bc71c1082e111cc583457", - "f2ad44a47479375fc89cbf5bb6fba8a63135cfe02f55f83931274f7665500c78", - "f98253384a817aa397f7eb0f32c0ac649487a629be15ab28061a962f8311eb2f", - "04bcbea100f0e2b1d49c5653c186b8e06956eb3ab85658ae52253a612293b5d4", - "ac1160a1156b875c86b1f93a5c3352995954dff03ad084c8b7d8c3b19e35bfb8", - "8e8f1ad84c415ff026d61783dd34290ca91ea3a45ce9e3ebaf0e3f8dfbbf4217", - "344f39997e0ffd897142d6130b91e1d35aaa7a457dc963404bee7dfd4f5c09a2", - "a9ca435b19481011f93d6d4081569775b131961973bc1add508c94c1fd3002df", - "e18ca05d53c531956a958b2be26c871e479085f9b25fb133aab0b6507c00df2f", - "bb503e76a353a6cfeee0aec1779feaa1b0eca84eee716adc4a58be31e84a032f", - "1f5f873a861d9ab38f75070653c2c572f17acf8c0bf79ee7f3e9ff458c047af4", - "762799fc066bb8b3185411b3c2951e5e9f92e91674fabe91a0e1294814a43c4c", - "4d088107dbb8ca7cda92b6d82a7e4461ec2ef4772ab15f646a36c2ad52297b0a", - "038a99a35598305af276a5bc763f99a3b9b118d021cf1686a46b6c3a4d581224", - "287f6f23210e40520bbd8921226d9b3c07552c924a2002ddc29956a93075a458", - "83992c92851655040417e3abdd283391435d882eb70c63f722849e8d08136b9e", - "dc507c42587495ad827e2678903037ee55fb7c237e695aa6be21d626dd98cd98", - "06f2c1311f3318ceb7cba3d81d736754168399b60333ec8a13b4e022b6b67226", - "bdda94f642c13bf7d51a86aa28127cffb09a6f2b362339f1586ee8cefcefb9e2", - "82a3443db84001c40f70640fad51b94de7205d0d2533363cc51a43fd6df251d6", - "13c168f266b56d03c0323ba73e5b5ea46d2696d1cd9df6f6522f131b8bed213f", - "78a41c55ee2d23faa4c6b0773702fd713219d9b30c703d1086a119c37fe73397", - "45fef102b747442a00d0821995c7b5126215bdcedcbd8f377a4da1181e01c9e7", - "e63d6358a4eb8558cb8bd585b02b64d51cf1c25112bd7137e69555413cbbfb2b", - "e6f849e0f2c3ae99a5b8241d91ec691ae194826953996e53f6c752fe49cff5e2", - "9da442119d11e575b193bce026a765fb169300c73afe4886c7e3b40dee6cf7a5", - "252c40496d0c1f1929fc205bc19c0fc7a54342ee140c01113c4d50ac3e4885bf", - "461f6705b325b253d41188e7dc1c5ad51c5b53841e04a0165f65746878787c1f", - "93700cd96638086c51a1d03eaa1cc9260f4cc640f785bd3a66e8897b405db2f5", - "148295db4f027449ff0a6f37bf17718bc9f410278c7eb8fd238239cef379da05", - "873b590f36547032c33c75ad17b201ccb84fe1dc56348fe3c9c222b4999cca24", - "174a44df650bfbf26b72fc99456a9feca4e6c0ebe7b479ca541497631f082fd3", - "9068ac07d6501bac0cea3696a657880d419ececb7233f306f2f60f3ab622d926", - "e816c186cd74e44a2ca05bbb18ce1ae2adc7ec2555d69f50a80c37821a20ef38", - "8e0c520c60abbc75e31ec5d18ecc2340b5bb888399a2569e554e9c1a91bf1c92", - "1891b92dcdb3fd6b3acee2731863512a1a33c6b037551a960e98414378275a76", - "c0b03fabd2ce1fb77389040690608932481843179b9c3b0bc88092c07a99e047", - "d244308766bfb7e4af801d89805b4d6956caa588c78bdf9030e231c89a830f83", - "0fe8befd4a9071d84844d7c15e723e5480271d6b5c03732fd22a32162882dda7", - "45f42e04f18e00d2ff6b07b15d2142f2a72ea7e933729681b2c448e05ceaed78", - "6f9473151a42d6e0f38c23e7296c044ee67dd37ab05afe34bb5fe1bd07c7a9f1", - "bb8c25cfaf28d3d977a572e39c0eda38ab44fdf14bf893141aae306c06b5cf2c", - "bdf8b5d1ad3cc451edb2b1595ac68a93feaead5f9ae212f536d003be118485d1", - "20b023998fb81e313e7edb04005bc760204766ce206568ec073cd0224ee1cf11", - "debbc032f5b314196f7e428fcb7aaaffdcb5de839d7114217c9eab82ce489913", - "702989166073cc2b825cef60e29a70f4c87d5d52f7cbb33370ed8ed7afe5659e", - "9a06a04f57b88a58418fe5c81890f1f4da86631cf36a75243b9aed998b18b75e", - "ade875ba12acd3946aa6983a7df11ed84d8f87df59378576ed7986f60bdc3834", - "3bf8941505ea47dd35ecd1a305fe3e0eca68062f0821edfdecdad4c06347aa9b", - "1f27863c542695894d949498e55b7fc8897149d0354609d5208f8ffcce9ecd5f", - "198f814164578e52302c7ed0ac8ae22bcf817d024090ca451a95a05d7cc3b761", - "1a69e23c4123b558795468f9ce54eaca15de8b3bef539216ded63cf0de83e5fd", - "78bf4d8ac88024a68eb50aff0cae34d4789b7a19666a666ec8e6fffe83aa593d", - "e945ddf223e30cd4a2bcbf34be2265f9fb5b4e9ae687083b2e427c587a704b41", - "ae91fdcf1fd6cef864b35a93c9bf995dded4dcc1af5f2c1529e7c44f3d093563", - "fe426d12dbfe6f981c9b24f88076b0dbe1d26d6fd6ee296f4597b9da84e62c01", - "64a38713af13b6cd993d1bda8f692524313f9c76dfc062e3e1f0fe6d177bcd2d", - "f3d5899413c4bdc41d1c6dad5f99096b0440e329a2d9c2dbf41fd0e9d8031148", - "68be77359719018a77f25859c17cc8d7f240cd0fb2723479c80649da31598813", - "7c0de4a9b5490d0d97fde5beb31d480cb6ef1de6fc8eeba7d0cbe3bc8f76bfd3", - "2b69c40a2608ddb064924a9a7e561a291ab31f8082c6e4d05cbd5ea8c7bdc25d", - "1f9e59bc0930c5c310da509fda999d3553ce5ee7fdd883d576307c195fa0fffa", - "59c02703962d5ede3c7bb6e89e03a5830b57d8422aeaf3d1fbd74fcaeb6ac5a3", - "c85673bfdae367fcd196a81eeaf5fb6e8bef644aac05ecbae6ae6b1adfe5d276", - "a8976aca6496cd169d8bb96e2daf83d9a4ba7b4f810dcc6264154f9ebcd7bc18", - "6a2d6e85ad420dad4d828eb1a136de21d8d1d34f8fecfca85ffd4196991b409a", - "f18349181ff31e462af7bd1c0bda19f8bae1b046c8624134beb8511f4d36c1f7", - "cf64c218a59ff00f4832bc73f34a6a6cb9ad189521c919c62f9c48a758e6864a", - "a235a0cb6f1a3a53e1755078cbe83bf37a3ecc97f551d93e704521093ebd9276", - "db80a6477245bd6e3224f0db6328d1a1d2e0aa531dc2395393cd2ffcd2e936f6", - "1332493ca2b42464de52ff537675a14381ad5bf33ef54bf6cee692a06a7d4efc", - "b83b3601126313e535f179caab676ae8d7775828fffc53c7718f4255b82cb243", - "24532a515f9b5f5298802efa52b917e58f1dfab80667d5c91c03e18f5d45055e", - "8976fdad7a731aad3bce303f04aa2d0dd9b3cd44b56bd2f4f4e8de20a265e010", - "343e0e7ba7d310d1e473669bb63407cee78808ce891f7d7f82e7ab6aa57fbdeb", - "34a0b637460df988cb3d9e625db0999c1366988d785380acf8a8eb27093150fe", - "d5203c2e6c7276bf6ff5a8ce61b11989720e9efc870af286b308adf459035b0e", - "fbc92dd815b215e91c227bfaaf0840e0a1ab1999ce393538c3a9b6246335ce63", - "7ec5ebe9d7b31ff930d134ef19403d49d810659ec7f8425e0f658904a1283077", - "fbca3e95cdc1d42c1f54718e238e5be0a0596a11fa5cbb6109dba376bb5e2b5e", - "0ce4ca3f087adfb509be266b7008ccdb8fb476d5fa11a49f17f4d848de320426", - "262a284fd78488782eb6b260256a2c2b8be63286bf273a03baddaab2cff0f3d8", - "ee63bf563e6bd49483af78a9c0d950d46090f2c53594dc6905655da6e2e794ba", - "b6d96ebe656505800cdf4ae7857f37a9d393539b9c23adfc3acbccc3670889a1", - "d3120e161f225d1c6f6f190225b48b88f19d2856763fcdb3aad3e608e568d69c", - "e226fee6b9ce12f1776ceb93161824b1d1a5a23dd67e64adff46fc9795cfc30a", - "9c90b1d71054a9a8fbdbd008aa345e2888d8ce277a2da624de79f3b471fa29e5", - "c331a441f73822a3312211b11f31571b58ef70166cc7cfcb7bf8a4b8695b56d5", - "82969c0164dd10af29b93983a1dcea3a9058390d7766c686c16265080f80eca0", - "f3fc0e524570d7e86fbcd02b6dcb8104f72a920ecbf125fbbfecbe27d0a4680f", - "72ac09acbcef1499c390e8a658da327f5bf57e6852098dea468cb0e5cb4ccd5d", - "d7d67baefd8031587119e26d29613dec510a93598eba9a7df23c3e9bb5b94bfd", - "e0e8cbb1a240ec379c9e035ef6e73f4aea18a27574a3bf134477adff587ef904", - "1059cac301a5cdfd5ede362540ecc7fa9deb09f11c3e2426727f73a87dec7cbd", - "21215d6e324c1714f544ec67b0cc845b55a465423bbc4e72dfd23b00e3eb3538", - "1ab7618acf8ae4ef600bdcd99a5d04caaf38d21fea6fc2885e1a7879270d969c", - "50090aa77099566ac8f8f3ee5a7bc92eab429f5a06d4a0ea909d6e54e36bddcb", - "b757e8a4fa111a5e11cbc238a47300d9fa35db566ac2b8af1939c9ede28072ef", - "76da65cf1ba332aafefe9ba35d65e28b192799bce0e7fdd603fe76ba1ec82067", - "6f67eef2317574a7a111964b61ae7ca23bf7b285489c3545e2f754352ed875d0", - "c52d8b869f8110366594240d884bf94b7632774272e1ec73de1b3f3f36242a50", - "3eeb304cabe6838c7d75c505f6527f8c34b21a2029c575aa46da8c8d02d6d73e", - "7984fe798b179d7a8d7cb04aa95ecc420e78f159b35867a6c094b9ae4373dcc0", - "08d975e995500a3b707d0ec655bfc90bd6a3789dd88b61cdbd2afaa2edc062d1", - "c901810a735d7dc3a122386d5fcb0e990a97c67ee65d04bcc8a39acf6b53d76f", - "8840a182e1b137bc9b91b4a8e0d191757c7760fd32e6732a5f142adb7d995981", - "3be30e7a71e965e6afb06cfd4081f00bea36f410caae4100a49b40d3a28b2d4e", - "3a06a6680a9fce8071d31426d1fcf8e50d9398216f7b2262909d5bb872b27367", - "da77ca2c1d38c078346bc441ec38ce638732c6e364d22608e7fca63ac3281a81", - "c6ac7405ff06d660b6e2b287ffcce8489f77fe130c5bc8747434539e4f3c85fd", - "30e46a19f6b7e69403e0163c321548ac7497b3040a4b29f1c282286bfa026c90", - "a60baa7f063b58b28007b9d242a03a038ba7bfc8285f3a832a954f5cf45b735e", - "f743fde1d1a8d361a8f84deadebc4b3c57ed67b435dd5a3f834e0d792abc7150", - "97bd128fc49f5ca7e9714b390429b065c4634700c3d1424a7ece5cbd631b4b42", - "89ab328ecde763fb68602becb9278a08c5b9852ef233cdca2b27e8ee4d722aa8", - "9024343e586695da883b2307488b14eed4f9cd9c10f9431f3566d49b5eb66f2e", - "8ae72b763f66338ad37c190b870e0fe4b0d50ec8427a9a80070dbbf15a9a8e67", - "f870a3af07c8bb13f5775f8fcc89a0767f752381192278df581657cf9e76103f", - "3a4bb0d1c8386bd94093811cd8e884fc6fc317929251501ce7d3b9919ca656cf", - "7781371ebe8302472ea8445d31c1349960ab378c59065018dbbdd00771c632e7", - "c75e1e743b27019021494fa08e79c6c3faf6f764913dbe4bd556c93c6d6a5f2f", - "e05e72a49b72eb039b186d5d0278f0ec9899d8e79bb97be3fa7705b38e276847", - "e6d7fcf9a3c51f37fe4f0d72cc159cda2148a00ecccfc977a069b485db3371a8", - "bfe8dbce227e38e05d429bacd654b5ffbc33dfdb80866f190445ce110ad3bcbe", - "d482fde53a0efa064dbd7ac5d2a75e0406845fb8a06c9f11697b26932001f560", - "5d6c498b221ef0c5ab9da9d5a1104628edcf5b064b880a37d9d0db5dd0574261", - "8de99453106cb18d59b2dca62c5fd10ffef135589d12f54e2d8ac85fe95c3682", - "c741795762ee870cba6134c46aa48792b3558b6d8d8739d881dfa45a6ffea6e7", - "504c91889a945fa284bfdc8d83b7a03bf6684fbc4d13cabe1053d88db9c53a31", - "3e0f48c9cdb4e72780b2e10fdc843e2c83107bf24080af0d6ddb9702eea2fbc9", - "4df3320c2881a8a13ceddb1b72fbfe55c6192694ad03afcf8a4e78c6de2d37e7", - "6651e33ff42676096f6ad2760103c6ef673463a820cae542ec849d6c93287a06", - "f356a82323f0060f47391c837175e28a308014042702850d595a39b6cbd4c3c5", - "52f379254402771fbe0d3cc96b6090cf68a9f49baeac352cdd8dd916ffa746c0", - "2dff5dfa35cacf70cb58f9ec9daba390d7d82294f1c4f743d81c51f641cb81e2", - "bc30d90818c97cbd81a60da4771ae85543e3893d650474fb56fb2995cc3a1617", - "e28bc22bb36b44a2d75a5510747946723ae45db82c72407158f7980ce86dcd69", - "f49a589eed7390ec2fc286d7027c9b83290670f8e7a6974afacdf6ff38164153", - "746420a1ab6957c1beeefbcf19ce74a68471b1df7703f994087df32689caac5a", - "d79ec3e7f8cd6b12f73e85311012c22b0f0c981cfa3229456b834a2f4cec1358", - "8252d9eb43dd6f04aecaa4cff212c6a5fc2318cbdb45c1479089460b709d6bf0", - "8ad1a3070b79e9bc8156f1b09d0a719a9a5b172024facf6e58edc37364090a97", - "aa632cc377c9346caac8df406352cd245af4700526b7835eff77b598fa0d2c3e", - "f8d5fd6b1bf9ca92fdab4a07c784afd1fb03ad9fdaf93d1899f68a9087a1bb35", - "08580e075079145a2fa370794be36ca69147355a1077d8ae61d6b609ba1822bd", - "031f99ff46a170aa1b39a3fa3326e6d465ffcd7a2e1a500161be992e05648d01", - "87e7d3d5912c3a0d05083c2330857190f80b61f6282f9177fa165f8cdb297364", - "8667aedc3f38f4c2c566947c2b0e776687d81c22835afec56e5987fe3ddf4a0a", - "5f5bc1604c11141b3a32e332319298259c3161aea372a73793c18667862fae58", - "9739e4325d861c2f82dca7652ae32a83862c2b108e3c8a2a104bb518d3caa9b5", - "d58a209db845bac0347216731b2d060dab27a7496df26c23f701ca57a776fa57", - "d949f6b375b0f42b514b315bcec1cfbd54a9764656fa5c20907426c739eba689", - "c14ebc006fb8c92b0918f3cebebdb412267f9330e21320ba3b27d1ea83cad10c", - "f37024d49b43c8a6a15b2835c6d22702d6bb6c203a82ea18039afa8b66059c18", - "6ea670a448f73782d061185e391c3a8c3c38b9dfb7cbbe006ea5fd30496315c2", - "18a1c7288695235e91624243c50609e79c5a026463a6a7c363af58ebdf911386", - "4f22fe5914d675ab393bac1688c3fe65efef7989465221d9ed426f7ad7f8966c", - "e69f8c84f03ea06f152e9578c609455da723cb76a3c8716d1293bb83160e5f9b", - "dc0adcd38e273937fe5bdbc3537194732b0061cfd61c5d5b48a8f1d94627e6e2", - "70181130b95925f12c44c0491715703bac5f459d869bfd908d513adfecbb35f3", - "049364457850b981c424e28ec01da89123efb8c23d7cf1a83812aacb5d679f06", - "9c62d6c612c1d6130030a63dae562207a230d7bff29ad36962f9ef6afb69643f", - "13036fdf46b309020a34355712012340dd4f28f4338f1d86c491f5e834715c2c", - "bf33d6bea3037b69dc683b46624b18f20ee7183b932eeaf8f6f1432f0b5b3ec1", - "f5b6ffcbc62aaa3839363ddc7ee620458dd0be61e08a21f1433edc95a233f013", - "3324523b07deade85ead02d9566ab1c506df37f733c81a5992f2ff41a4a8eb5c", - "37ff7b836b013a2eb8aa3fcef5e06ba05feb2605ce26f1b8b5f3dae70694a9ce", - "08919b62e0b0f6d6acdd1a8c5ef51dfb562a768b0e299949dd76f49ed5dfa675", - "2fcdf826161be5e53721699ef73cf95d4345e1b3808ab308349a4ae868a61999", - "a53c85a00f672814f35cc0b10fbacf6133e9bc20c664146f65a27eeb40fffe0b", - "a60ccd19525ba3b89e6c5f2d477ea1a9f7600d7a6f3e6ac588b6b48aba95ba70", - "dd5ece32372594a79f834f4cc680bc692ae6df1ca444c26ccdd34d7028839372", - "be060f57f5f8c465c268bdf7dbb932cb2ca8a0ba99db42df44410dc9055c5eb4", - "cf69ed4d45ee78e716e212d1739ee35edd6d801d960d6a7315cae7adc65661c7", - "bbc874ac03228a5b18655504956225422ca6d69326dd08f7e9160bd1125d976c", - "c8df8fc7fccb9facb5affdb8b10890e9af0f82c6074a5ceab38ee9ce8daf5216", - "2266649eb92e9f62dd12c35de9d9ac61f422e4ed8f70b3c7ad7134512634b70c", - "afb00c87728b3444d63ecbc8b29a9829fd451008329c645a8bfa97c0e08f71b7", - "1f015fbe63bbd89d94c9fe61f76e91332ec3783ccb6beb565dc44e59eb4eccf4", - "20e1eeb61beced1190d24123bd11a44317cfce3d450044f9c83bbdce80fed800", - "9329846795000cd79cac94415eb3edd09037f48e621e5cf6370b8d53293d0330", - "30d1a8266d111115e6ce3e31f5115745330aa52b3699808ec7e2dae09b4a8e0b", - "0a4ee43c542c985638610c298109155b5be6fd4c54bdb319c6ae0b5743ee767b", - "c4d466db6b51b5683d89de62f83921d516638ec2cc5381f718f99641ff5c767c", - "90dcb427bbee634a154972c917478ef6a0cd4860c4184e71891b61b80dab2b49", - "61b7b0f88b7d9076c191164f227752592f2c6f259832f1dc34ee0ba5e318aad0", - "e4aac6f63060d7820ac47bfbb8bbbc2c180afbf6e729b53c94f520e2771c9904", - "7518f33d7fd37dfa2fe90c060e2511a0924e24072002f5580b4148bbc926ff88", - "b0c2134a15a9b1e58fcad3e011369b8f57e13ef91c6f8c88ac6a3a3d44657ed2", - "ef560d5df5627da335c1f1127f66913ed13e6a55f77ce649c347d186f3ebdbab", - "7729ddf1f8a9644a3b8db6158cb3eb8c771a184b590f5478d6080269798f5439", - "f25336ca74469eddbcde1d20cb7d06f8762ad8664de7372a1cf0d606208de3bf", - "34646aa76eb0a4154437313d0aa1e09822e6664ee9c5ddd76117f2b86f81dbe1", - "4b40fd9aa5b1b1360b7f4b747f5332a21f4f4a3b1a4284f7e349d5b7dbe113a0", - "e21ecbe2138dc9213dfc799b8b0f78e8b261ef2029f750fe0dcda206f389c6d5", - "b7de845d016e9e08af8db169628767e3f7d8e92d95c0732c10f0e6b02f26f1ec", - "84279a5881fc7e926048d029cd816e4fb3a9cc31ecfbef2cc479282c80a5a7d7", - "14bcba4e6582d53c12916594287472bf1e5b773c794de409c90eba54c899f8dc", - "eea35abe938cc6a303b86921b3549445f1cc8286088f82fba656323562545414", - "c7253f77b060b7e1091e4da32a8749f4bb28a8cd264f0a79197a1b34727a96ed", - "109952d7de5a5492f28465dd2df3f511c42ab0f45ad67ff4387a1777ea64db0f", - "1b848ee8542671774f28cef07a32d3deaf502026563d382f7237de06b080220b", - "47fb3b74dce89f917d2e428baa5fd1688de82d99c6b1682d89c69b70c01793a8", - "a0a3c16b520a1f8f1f30f0b50e6b1e1f1e34de71ceb29c689d1bd302dce22895", - "c4aab40b63017e83a1459ba09ceb7506215530a606aaa5f6c6eec6a2e4a6cbb4", - "2e3fec31d6f774fb491f80200a09f7db91c62b9f06742269266400b44806ea02", - "83d1f4bd4fb071c1ae17296b866acdb9a8b4242a6e8469b420044e4583af3e03", - "df648ff7b704fd81ca86e0582d414aa1d6349869e0aa375b90f1dda83bdbbd61", - "fe1ed6466e6dd6e1d94bf058a44a6e6ce89bcc755f6c4c9c18f529497c31004c", - "db287a55f71e4c405c2adc5a350b2101e0c1376558016edf7efdc95fac677bec", - "98857f954123eecb41e686b2b74906a28335ec74a04bcbff17b40a5bbc30ca74", - "dad3bc979ced99318660a64360bdd324a78de29326337a0282d7829b3ab572c6", - "45c976e438cc95d2d1678971530658f95498bebfe6ab110dce7cd931b3cf9567", - "74e6cba2a6be423bfbc82389e2b4363d4e2ff9337098a27fbc4eceb5de2a0013", - "6db2b2115c67808b1df109ba8c20116962ab4bd4e05585d1cc7153e6deaa04bd", - "14d22e0a35adbf83d4cf0241ac08c3e8c85e31ef935794527ba2228752be46a0", - "6a122f55e2c9bb6540e03072497fdfb2423cf79777516e16d198a5a629392526", - "31bab4070bb75519f2ffd9b7c74774ed874423a1aa187f6bd4703f97cc9274ea", - "f7bc76ba26069966aecf6a04445ea227d132390f91d242f942deb63bf50d7c9d", - "71aabbe23e24706f8cfaf84909fa4b385fc4d5c9fafec18cb7358e2d399d7171", - "451adf79ce801f8001a4678451788531f3112c30e3876e619ede67a2e315a59c", - "ddb59f793247259f9558b13ae1b6886231cca2d30a0257473488820e49f9866d", - "9b99ab92890f868ec06cd4046352bed54699d1b49ae7600cbe654c748735d064", - "3ebd920583f110cc4745e6780af66b38936cfbcf3afc6dfe685ab02e0e924a8e", - "aa3a8b330c9a8313ed03b6bf096cf437c8a80ad84560e22b7585af89afa183ea", - "4b53eb539033ff0f2e381dd33bdf62d1816aaf0aa45551e8e5b9fdf49dcfbab3", - "1f94dae86a8b381921168ded6794c31abdf46330dba6fde4f1ca3ad89e5b2f81", - "d624e4b3fe499dec636a85e705da357459084a9dd32889d8f45d43888b90b392", - "e64f0a2cf394239c6f6cfcb19fb14b0e5dafe719fa797602e6546d56d1029bb1", - "fb1de7a07de0cd45939dc71c0ec19d0792544418defa141705ae3a051c28aec4", - "47e8972b8fd06a9b32d34ee043db99cadeccb21375ce03e287ce0126f2f8115f", - "5d4c2b5e61d6a91a37f5633799a406f7b2208736c0dfb61216484ee6db2633ac", - "d13de18475db560f863fb548f30b6a54682104415853fe0ad1202f9873afe1dd", - "e9ec4fb057588b30cbf220ecbf72d470c3cbd5a0f73eb229fb761ea8fb5f6bf7", - "7268383723355facb1dd7f1bc30947158618fa2632cc75adb4a43e5b3ff28f23", - "7bbf47306ba33cbd18f1501b6bc5d3ddc200bd0c4a512729a487db08bfa612df", - "f550c3d644490bfa41ca498a9cbcbd35967cb1e911608c011a2ed84f74633444", - "f36b154786ea5414da48d67cf745ee63f935d92ae0340f1caa4a27406e28d3c6", - "984a9b447fab315ba2c68c653599dfdbde52b3eeabbec01c29c6353a05147dab", - "735b7c7cc6457088287154cec2e4cd4f1d7b66b458579223b065ec8e8590c9a2", - "cd2b62a9d7064366ce4ced78c0a914d45b057b90054ed4ee55c570ec6186ad1d", - "eef9d195ef6636791d021f7f65b555da2908853e716dabeb8d2b54bf4456b2c0", - "0a560986ecce70bcb106457e75d4783bfd5c5b296531a29313cfb9769b849d3e", - "d399347ea0208f6fa655a61a560080f1b7146673f9a4ce8dc0dd711a58353e87", - "6d4aa4f7327819df126566d0784283b8023d86aeedc16cfeeb53e3441b5d7875", - "7035a1b5da23ac27d05730655e4d4f1c4ef74e74c06e5ba7712b82e6be2db780", - "849d2084d5c7d51b585292fbd18d11d34f2dc35bf4d2358eeb317d1aaf7128d6", - "f00cca429f6b3333332f2d62db7c87839fc8eb491e809ad8e5570bee5d127466", - "194966442e512f0dd14ec9cb7e1d1fdc7e925341bb8d7f70532b1d3f1c243325", - "17f7e3090828ea81f5ffff078fa9b0269c9e553787034f5938bdd651133c3340", - "919af6b509e49a124f35893be9076614027988eb212075b4d728252760df0d15", - "53b848b6a2807ef1d210b5f5049e607bc38f6977aec1f488a5837ae71181723a", - "8ce003a8f1a902c8e0a874af8604c4975755df07faea18922805c7d95a70910b", - "4aa44a92c952a41317003efe0098e8f0a1c9afe83d7f1eb7bafbd5ea134f91f9", - "e82abb4216a67d097462bba9a3152d07ef5954aa34a5f599c8745f862da11135", - "799f60f59a6c721fff410b1a36212a9d2378937d8fabbcf6833326458343a450", - "4d963de3cc2b1082030b1d04ad120891ce621939664fdd27bb7dd8895544953c", - "6844746978f74e536f2be3bdfc59b0f34d49da27edaf48c066025403159e8997", - "9cc1a9632c270acb97207de54cfd40659b9fda5aed0f35167d1339688059360d", - "0b78117052dfb0cb057c9d9bf4c2f0d93f1f62b2cb7b48b6a097b49660306202", - "562c88ab9286c5542644389fc6c129d057748ecfd599e0262f01910e05234da5", - "59d67d66e2418f587bf21af66eccbc4bb269efb27ae3e56a3d41f0951b81e744", - "ab6cd3026fe2d1ad725de246f757d748dd856ffa5b37aeea4dd18719ea993fe2", - "8f51091814b1be8368e7090cfa43accaf7cf4a1196112ec4cb8b32c48dc64484", - "aef51ffe9c256183d7cd2c4e11001e3afb402fdd7eeedcd6b484eecc65567099", - "74c2a0f0cd119e2c6ef44ffb8bf4a70b53d70d0b3fdfd420d2d488dab8bd2354", - "a5acfe65be85e02ab9eef98869a2868e25b078479966f895c1e45a7f438f8fb0", - "259a84055e557869c79f90f15a9a424c9d5f0c1bd7becd7805d511a7ea247fef", - "445306226dae2bf42ddac75cc37e885e29b32de762f3b9c33e99b335575888ab", - "c458dbacecb0f2a66ccf5d42f5e2554e76c0edc2d6aee1bf8b851e69064d0bd9", - "987c2d85d73e8dd8fc804ba096308669af797f35d947d19b9d10fb76584c3ea0", - "6cd15838c8c44bb0e9682e5fcac52edbbeb11aa52b3de25af5369d6285ce269f", - "0a3e71e84ef57222636cc4e58b80de70ca866d25f9e33d5cd148bd73478a0712", - "5568de40ae838f7e71a6016fa05b3554641b47f6fab495998d7d4f877573dcd5", - "adea2be3f2e3021b86e11ab85aff0ff7955a5ea9dc753b001c16cc7362d219c3", - "169b0861d122fba13ae1e5b30346ce8054760d9852f1f889cc6291671fee124d", - "874e062be554ad2ac87636034d9d4dc619575170560bcc8cd9dcda8515103b1b", - "a4efaa4505f6265ee9c85c914cdfb8a6c8ed90080e2dcde3303da620c55e16aa", - "26188a452ee0ce731e3b4c0e344327c49f1a4671873aa7022be86c9246d73315", - "bcb452a0ade996ab256a05292d565fd033123b406c61a3275ba6245936d1759d", - "b882b7f6cfaa4c0e484eec8163b74da8f5c6add2a45fedd8a03b5ff27c8c9092", - "b306650e924d3960ef8af36f3998c2b8ae8da5c396afd0308dc4e87ff2bfa3eb", - "0c666b313ffcbaec45590d0626f8e5e2be576a315c6269bc37b66d5f1e6a167b", - "515249307a741907d68c009da955cf67bfce86e2429afe9131048bc86f541ce6", - "e3ef3112a8a3e8084da7af1ec9325c9c30ebc9ee713209fea8f44173b90e79bc", - "dfcba9153c10dd31c2a9d052d7eb99ea335cb27f5aa8c905b5f3a75210e7f64f", - "1bd472698531c1fcf75ff732fd9c526a9680f54e6b912083d18ba54f35c0f2f6", - "02c34ed406db53c1d4c42f0e56bf1f05e845f11e9bc38228452182a54e9469e7", - "f628b663395dbae38f1a853d557d44cc4fb892fbf32e8c246b6533ddfd88d80f", - "7e747d2a44f7d5596ae0bbf029ddac0bf84e9b22e4e9789b39bcd17f837d98ea", - "6a2d2ac677bac5d1d9e9ce5a5feb60c78218c508edc0fd06a7a2f6bb3cc87e08", - "ce5a7020bbf0627710ec0b884c1f5df69f6ec4a5a7cb535d2e7aa6d06bd8fe2a", - "7d76707f14e080227fba00bf4b41c61ed0a5ecfdcc78ffd6db235707c1180e52", - "2822b40caa0ed837d0f1a65807ae0c15a39fa8b06be2606c4da511f0b310e79b", - "bdb94f586e7ad81ac77363737ddf022f906f9851a492d53da881138b6dfdbd30", - "7c3d269dd346b1dc7440e977a879e1b2ac623eae0ab3a7a9cf9a17c07b5dc265", - "8d554d79eac0c90bc8ca66889f3e6bcd785b7ca1fc0ff1cc8c0b057dd3076370", - "435f6b86b3df1c3257f0afe0d1302eebafcc0cf826695f835bd5f891d8f13ad9", - "7b44b7f173536ef1514169ff1898eb93d8fc5f7f752469c792c20f079820e426", - "7a012d39dbf73b49592d3a6e86b08f68afb296b752d595651e24050ffc5a877a", - "69abafe1eb5da3d62fd53a49e069808a0a4355e21c5d3f346081aa64c053ee59", - "fa2040f24c3115ab8d2adc4e9aa5997c1fd7d3ae813a22f5ec7bb79d9d53d68c", - "7e258461123de7c6736bd302ce8f60ad8238f46a1451e1a5cbd6779d81d60ede", - "be2a8ac53640b23acb9bd4c336a3e4e15272fc005d740e6fddf8cc78fb1ad348", - "69a05bf1996b7b009afd3b4a624ba0083d01936938187d791f53defeda4ab387", - "a10251c1179bf80648148986c3f23392d89daee2de735df5db323e966588b90a", - "100eb02215987aa3d4649dac5c3d58b9a042b7d308cdd2ae536d1c412d9080ef", - "4c37957b1221e50a6fbcf7053d2c9b4b5a63d47ff2cd4f8242b6f7bb280c3fa6", - "ae882e74871c21ffdd284fb58c2e17fa4d25de7bc6d323a499c87da62dccdade", - "934f4cc38c0ce139190dbe6369a0fd26232548d109d3be4940b824a35e105786", - "7fe3d7b41f0c6ddbc22b281f92698940d505c12fc6d717497503f4841d94060e", - "195a5efa3d446fe830dfe062d8939d8b01ca6394c9ecb055d6eb902a17c237dd", - "1015070f171055c4d3cdc9c39ab97c6d2e3ac003340fd485430d3190d65d6425", - "9bea7a4354e918409c01e1badfb2befb1cf5d6d7ce6cceb3f76a05da2285b109", - "de02fcb28d73336ba7fe3132f72978ae750646133903b9ebc0d5be4362f1da80", - "b97a0f5a9d94d48471a3024ab2b32a98230fbd92ce31398334a0b6a48566d467", - "ad1d5408c95f281668a8212d359ecf75b180d4ebac7541c007589785e4b747af", - "81db481f8b418ed347ec8c43e9211416fce223353082986ccf0fef26cea2caa5", - "b22b2abc41020b89595f40aea3cdf479e9e70863042299de1f5870401267c2fc", - "83b8d1fa275e6e73c307baf55d59d779a5e2a7cd2f9aa448ed48ecb715fad419", - "809f92171e86203b229e12f095fc2ba9b3a7935a1802c105201bd791dcb0f2b2", - "d53198ffd660284c50c47f4944e266c52851e73422768d864466b9868d603b96", - "372f416d8b2f8915d2ce0322da8a6651003bb9e90006e4a7092139b56ce977b7", - "dac9fa4a141129c005fca3b1120062579c4b515def9660a32cbe4529cac7b4ca", - "8e6d1bcdff17415358d699bf3998e5a3cb0df47f3c130dbf86971afef6ae6648", - "001fbc9116fd84e8aa33dcfffb4db1e7de2fa95d606bafbac48f816ebe42a993", - "bb5c32929452abaa3e6888dfabbfe7fd166d234885efa814f79effe398b90ced", - "cef8d38ce18cead2db0cca93a7f0ea4baba20459190d1d1286cb756f49759759", - "fa5b9a13884174719a51c0e6f295af06f40852676cfbf429d77c8a0c0b3bf8cd", - "cdfce5758d0179aec48e8b8e794eef2922f0684c7bc3323ea81ea677e727f1bf", - "0b725c8db6959e8a5363a1b185fb6ae5874947c486fa4914a8c7fd24db008576", - "0f2ba021ad5d566e6112f95ac35786d7e53755db1b1dd53e5fe9a82d7cd3caad", - "50a76b2c21c759967141013aee9c630126aeae780b2177970af3786002d0ae5c", - "38c4d2d1594c6d881cff6f42bff77e5a6d07a2f6d34668105ea9bccda61bb212", - "7649a4e7bff0215faafdb50a1675d1569bdfd87386f26887f7cacf9af59d2647", - "c28692cc586b3989a0beed252c6a5db47a752526ce03759dfc4453a5bfed79dd", - "ddf9ecdef18afcbb58fc3628a5afd7929c355f756df8fe6a8372575e58bf8cc3", - "9342d21216cbedadd2af28fac7df488d456945b8c107f9f4745c644499239d05", - "7304d768b717f483187b2ad71b14631a3c5220839aed8c32c0dc0b1d963bfbe5", - "4ea33641fe9b0200a292f7c48dfe2ad8cef443cdec0d0a30d919bc4ca9a4d199", - "88640d732e83da1e7a52b2a621243c019132f6e3746c807d3a267dbf84a409d7", - "73b4fa6aa2353adaeb19cb70efb08427e7110fd90531697d9b9474574ac447a8", - "2a6e7b3c75177644b4a08a0b6e000df0af3396b348c8a2f17e8632df45c0108d", - "9256b1a803b5182e65538ba916007ecd0772da12beecf9e2be0bc519ef2472d5", - "d20eef49fcd1c6b49d7ce781efddc6d04c365c50f626ba283398ed2b35036c66", - "c5706e888b868ee5bbbcd7f5e3198c222de9ea97689ac853841790503c307562", - "d4e891e230fcaaa5efd18a92ddc959f659b82f82925b8c3c3fa927e416f99ec6", - "cf27ffa5d1b0f6156df52efbaef281d0871b03eae42fd9c7716cf0e3d51e53a7", - "8f5b1fb17f2d611798cbf99bd19a6970fd2a5468e0e35e238176c7477d248e46", - "27570edfe4d40e0dbd44b925ec5c6ede00f52c42068472c233e198e8ff80735c", - "9346b3e474f91b590391808bc91fb2be84c1441f36b77aca378ba96afed23233", - "c791e0b7d966bb28a83b33d9e67677e51b6b2efac18d5c04ed70eacef88344a3", - "cb6fc40cac022a2cd63232046e43a15c9a06b28c3e135d605ff0a6302d8f8906", - "01b5e7285d1080afc66b55906cdc2b596a02dfd35797de15a22086cb662c1d23", - "e2f6b97c5cd4882dcb5a418489e8d5955039fcde800eb2ece4a7781eb743343e", - "cf095c853603cb37c3bf9a6ce6ef4b203dfba1316f9d2ba85db2266dfdc4bf59", - "4c685eeaafa5a34c5eba421e5d48215e0dbc8b6ea9ed7a99ecabe1f282b31e36", - "1003aa4481d58af26ed65528de48d1872d38b1f969756994d5451a7da740c368", - "4ca47cf17f118bbde9f3e2cc52c635866170506602639f7f1cf2ed3623950c7f", - "830ae0a452239d8210315b969e75b328c097b03d0cca43e8ca7ed86587d17ae4", - "09bd7b73b6e7aa9858bc3f4cf2c262b45fff6ee37d26b9f0915aaa0ba147ecb8", - "f142a7f5b0b1d971e5b35bab6168ceaf9fec2fbeffa7f68eefa37668b4d725f2", - "70cdae12dea1ea2c4ac1a4a3eccb2c474bc9c41b314ce6bd12480292b80e84c4", - "258ecf5250d85044fb253ae0b71b89dd79e6c743f9d0fa1280e6660764827ab9", - "4317f1e24bed3973de22bed8f562cea34fcc4183a49e5a804b29b6f99881b13a", - "4e996b3adebf85a449a8b804f324cfac3a3f0cbf363b60f276aaff7807254088", - "3ea3ea6964d4b00a043009c03f72c15d74dc62d862d707c837b3e12268fcffb1", - "696ca0dee607a3459bcc70b02c0459175a71ad23b691e885e710380e86089184", - "df751048384372b862fe80ef2d4a5be24152aa0cb1a7f9042aeda03aa2582cde", - "f476a8bd2908f8e2007f25af9db303bbacd1898f080b4b2dcd973af02ea46158", - "08eca6ace770bb93c5aca24fc594f9c5f05c618ddd1ffb6b892c5f09ffb2dec8", - "d626f8e50169aea61909059be37f55e8ea767df8f04ce50c24b0314834d2ca71", - "3877ae790606ab4c302576ed0e9c9917379c98dbf72cea2fca0b53df32b34869", - "c7d7829bc86e27a1438b8127fa882ee5c86b2a0ff27775780d2269bb2ad2bf35", - "567394a8dc4b22b559dad5354e7411e779db9a0d667142d491d1f53952e48cb7", - "16535077d9d0f2af54a72b2bb63e3a9dbac130a44d2d51a4e43d5f52c6a26c17", - "ee5469cc74b7b8918863c2346982bc9cf7cffca97f11899371861a51cc9c7d8e", - "e367723ee47ccabd3832a7869d80f200604bd1a1e51d1e4888e0c4254828cd48", - "274b673387c444b2e84f53a6aea9a0aa8e9cd2c41ffbc9b620f8ee299f2440a9", - "1dfbf7a77c68699070d08bdab9dc3d1abebaaac36c1707914ec4cfad75c691fd", - "f8380f1c99e3319a6c61dbed8ea6d1049e3a979919dcf1cec3028bdebc4d2620", - "5376ab767e1efa85ad37b795b014e6acdb1fa44e7717db7f074db64f21df33fa", - "bab4ecf09775c82ec6da070ef123cc7d3c9c90b2416601121c4266ac5bb4e78a", - "0a0bf05f2ff77e6d934bb9bd7bbbb87d18956497d99f696cd917bbb366702632", - "04c77f7ee4a70ba749f0c32fc6a288e4045a2a3f7ea3bd3cfaa804549c88273d", - "33df1a73b25ec0e9314c273b163c452c8616f8559d15b89c9a67d99e95115c52", - "a4fafa2b090ab5879bb8f2d90f74950ab58ad5c089e8488a31bacb771a3ce1d6", - "0570678632323254851786c95103f1e0c778d92564ac40432db36267019c4ef0", - "0fe4ba5c4aa931796b223d7192dfff2f46d72eac15c80b88b2da39eddd29e293", - "d90a445b4f9d2cbb91a219036599e497d5d2f4eccd26ae084422958b3373582e", - "7e35b2d79379cb60de2873150a57ad820bf96d1d4178f20ff64e20c20e0761fe", - "2584569184044662f1f569b4cdcb4285065067258be13f996a9449c2e61f5260", - "a11279cd9d461129810910e82a288fc4af12d618165c1afac2f1bc63e49f2396", - "0912c1588c4a776ea7d2a8c2eeca3f31c4253b1d7c3de16ef4c6c92f4d1df421", - "16d08237b55a8158f02ef02aa041a2b4265cce9943575d84435155cbd870487a", - "3dfd535969602673a1da433511b45ab2d2929933fa9fc6a6d6de42b8543f1bb2", - "7fbf0da6f44af30692986c2ddbc70b8bc76ccf5b0e4e3b6f0e848bf548b98352", - "d30b8147244a5f6665790c3cf26a3547bbf7ee47d89684bf6019862582f5abed", - "468f2363242d12b0c020393da393f826dbf0f804b7519ad36a1078e23cf3ef5f", - "4db75d120848e0d97ec7b4eb3391fdd0a51c0494ff0083eda26b09a1126e7c7c", - "d799391fbae259fd3472c5a6cc6dd3398db980e90e2dbe1eb401b39eb05b3e72", - "253e509ae070efc96eb150884bdc8982b4d301b77c2f32bebb969940d244bdc6", - "03d9b8926096b603771c4347cefa048e1935366537460a8969a356c06e9820f5", - "c0844b4dceece74dfced1c29a4bb698eaf70157bf9ee24f67ac0a3fcbd8b41c0", - "c4e3a48f7a3278201b52bf8ad78f33d2420ae83b05b50e82a80a3d47e38c1eae", - "8a5135a0f73d156904e72600d04c34885865861ac213ed7ba626fe1a729ab4ee", - "fb084676d9770b832466b20f9287f2b4bd1e4de63f47903c5b5b7d92629b94f5", - "6ff04e932045a37cab678fa55e014e9e0f5c148411400aabb2c1c4e96ddcd097", - "e68d43a689e04503622fea574908a519597ec32aef695b0c80d7414dbbe05017", - "b752f7dc8ae30830be1678df4f719151427cb66706112f93897913a2a7b7787b", - "5fd4c7047ea756ec8b9d2ae7e989ca71543bae71670def6b20ff3c588d8aa08a", - "212163496dd349bdf5d861245f141de8e81da114c9caa9e1bf05059983d346fa", - "e26a9b8a3d2ad97cb6cdb2983c78332e4599c337234382ef3f36514a57575415", - "ffcf2ac9c37585fa57e087399903f1cc5581199354093332c571b96db904e934", - "49227b1114093f6ccaa756fba714b4afd4794f21c407c05265c1c3f00c82d1d6", - "040c874dd7022d2d5c21772ec0ce0f451fed493e1ee0ba5145e4295bd6a7ccde", - "b45e01829847162f619c98b34aeba491413aed98c781a83dcd522d844795b6f0", - "0e3111cf559490e6909950ef392c565f8dfb359e85b4e0369c03b28a7be98007", - "1c7c8527b182d948918ebfde92a266d4e4e42e622cb4b15c7bd47d37610ed5b4", - "1d01f374aecbdc14c4b062bc02c5da8a23ba3047923fe33b23d754a1f161a211", - "f6e200799f787cdbd712b7a50017df36a78f0a6074c134f7d3f3a1d4765006cf", - "2350d3b2de7dccd113fe000f07b1e09c414d279a2f33c2937fa73eb881a5226f", - "8a39e81f38e9f0f33fbea808fc3a66f5487a8d73147770a1f9df0ee8b90f2f8f", - "639290f8e0bd1e36850c24538add7efb721ccfc71afa165412a8e24d67645dc6", - "320fa452de8e7b50a6a2a97a0b7cc7a3848a6ba77ae4c6795c42a107a28c8b37", - "033912d589f41c9c2d7069fee1440e18b03b953d0804d8a5a48ede01664d871d", - "9a078e8f6076c33acfc2864fa334f69bc385d6415261f78280ffbc192076b309", - "b772a6790a14e24107bdefe77d696ce0dd80f6d73062a66b53d004c7126b1147", - "b3fc5acb5e3ec8b8adfc670ac9361837d38e0cb07b4fef57d230837748d9b370", - "8ce5d9cb067139afb7f370b63d0d816a404e3031a3d85b7b0acd0bdee4d6b772", - "1119fe66c6b4f35df8c973b753e6539d3e36a231e6575e50e53f4b3b7bff1d2d", - "ff9634990406b0e1318467851bccd6e9ab6a97a20c0a40f03d71c9caf203c98a", - "2ed86d45c7c99de3be14b93fd12fdd2c5b252d5acb931436514501f1ea108c93", - "4099453e03ba785da7f5b8ef4c3a2de64550846d4655dfaab222ba32ea15705c", - "1be280bef01e05e6a76ca796eda65bf4de622cd14227fe6d9f5825bb49d7142f", - "d5f1e9ff4d4d40a14e5ed94ca93239e0f8f39d63d67bd850a851a9f82c0857b3", - "b9bd25c27a7b31a69cf0fa09117074adb9e26f40a2b0f1755ecb52dfebb9e71f", - "b14849aeb7b7ade1f862a10faf8afe3feb1504feb258e8e58c734c8e1f5c586b", - "09cebfb39e597cb7c2af37040d127a46f75f1538566f12f396506c1966a13283", - "f9f32cfba53021cefb49cbf11c28bc7b4e6ee44e9740ecbd6392266ac1797698", - "7c5322f3678203c5c13ec1e607950348b213d5aa7baf52007cca37fc9e601627", - "04ff0b3dcac50b56b6b9c220b96cc2611f17ff371025dea2287a496b217caa7e", - "ae1d99dae3dbd04ba81d5cb469883fa4bc559d908123a00c1cf611184d51fb1c", - "0579c0303aa10da823299dd75438063ca22c95078ae9c4ba5255975f64e0d369", - "35933de3df5d785467120f1a80dd362bf6617549f83132c56ea5bc2fcaf28296", - "e7e9e2d156e9f9a67b3febe2201fde86c7b71a6278b2ea56fe7fd465b7c838f8", - "4f8ad80f63ae1daf5b919662054b0ffa7d9b3e5b168734946e44ad8cf15f5b7c", - "3adc6f5944f97ab53492898959ef22fc269b0f334b8d14288b03319c166fa4e5", - "def208a9cac7c1d7a19e4d279a528f06e78a6c0359bf60e5b9153fc3a19aabb3", - "70019390dad0f6af73da2fefec6d58aa5bb8104d70b7a8052c33ab03c67e7052", - "49f426126e59305984ed39bb58401079829bb4ac33378740bc091f562ebf71e0", - "96b5b15e5862c69feeaa2f92038fa4fdf84f9dafd9190e9d809edd6be4710405", - "bc477e6c01c9f69ca08c3b8a87aa78b6306880533777435ce30ac3d3f49dd2c3", - "4a5e384a5787e460994777754b9d6aa96407179ca7ad616f8bfc536064604da4", - "768cf597d2da293b46b34421ad3cba77e873ac95cd82732270a8e0e1f703322d", - "33f022b6be8f3f409e81fef7c9a912495fff817cfd51cfe086e659962404ee59", - "01de4988ccd1fe1225529a5b42e40d2efc00a86449792273e1b8595106d520be", - "577be19d74c923436d8947be56bc297d4279af60833ef7ea87570fb1cf32b351", - "ab34ca1273f7d5b55c6e832890116b56fda634ea3d7c955158df0ad18c826ba9", - "49d49c9f3ad2526d4545b7b89cc98f8494ed945e2c278269a04621aed5b5ad06", - "95495c14ed41210dd27c6942ec8354c4041fc9e4ace0ca20b0e39248bb18fa18", - "67f6e840dee8f561ef8df932ce3a3b503edf6dc7bc15b920f6f6d0b9dbfb3c6c", - "3d43420e6a2ec375e1c9ef06e72007591c8ac74130bf135778996012304f545d", - "77d71f87ac1a5361bd45ab106f534f73579ca0f9214dcdfea8a3c97047168b8c", - "96c093b0ea3d17cea3d8720b6c83dd3e6ea691150bcb336ffd97a67d88609bfd", - "0e43ebcc0867eba5cfcd83e763f461582ea9a3aef0f946de60e2b5df54b80406", - "0e1d5572a7beaee2c335e4b97d288b2a0cae7d23dc69f6333acb73775bc013ed", - "0496e7bd67fb5e2bb8c90540412511828cf1bcbdab9d29ed174bcf8e8c756e64", - "7e4aa7351cac1b42528bb18ec140f498ca8f22b70ba86bcf7b9ef75c7775685e", - "2b3168f9a72e3156378752824689a1bec76daba262fe7119a567edd263002c20", - "8cd755dc1abe203c67472336b51e580d43d01f507f6b536ae67ed38857583516", - "33633b1dd025db52f4378cfe2aae989c7e3563ebe63722a0a3e75d006a75507e", - "bfdb5dd1f64f041d0f6a74812de2c13b8bf13bc21c4447bb71839eb004a70c37", - "e53aca37620b5e56ec087f9f1d73eae5e2fb0c365547c7d724222e61b4a7718f", - "1bffe71fa3d24d9a931e4f067136dd9a134838df1d3d3abea38c4e3a107a19ac", - "a213b9f57b7caf1b47e034ca243aa6f14840c26deef1e7df97ca0fccfc6d8df7", - "56fcffbd276cdc22d1b33d702bbefb5613a54739f4b434c2d7ca131577480ac3", - "56e95e961ad91e0e51d91f584dc9d25fd5163e1cea9cf757a7995ab43371341a", - "d268ffe7251c21ac638f9d4e16533890104f4ca57d6c25c14a13e8b6073fc7d2", - "7f6a792cfaac68e7aaa12890993ee2a90cd5772730da408734159fa26c8b09fb", - "4108d1c689a7059f684963f5b3a39abbae0c277c9eed81e996b9f97e9cbce1f0", - "099e1a3d9206557b932b5fcd5d9f4ed2f6f0476681b89cf16b0894a08224cf2e", - "c61b77228e0ead3d8f6962ff549c639efe0072a36dd5f2b0b68ab7c8c7d9b122", - "54222c7bf75911a314de2d88cb63968a36112ad15aa64ef6aaedfc121aa6c68f", - "ed5e368d3ac56d3210ac5e28c2974e59bc8231714ac3025b41d57f0018e93436", - "f9fad32325769d6b026f014b59d856afc373cdbfdff1d394ef7797122303b751", - "5be613bc47e1947ea6c54f9dbfbb5b6c06883c1ed9fe19edfbb72648614904c8", - "344446410615434e68d00a6fb79d6509b05d29b8f7816fdfc389ea1bc0214aa1", - "a73bf6d7c482947fb853192ca37b774837ab7e0665ddfec48bda5da9424addb0", - "b7590150157703f816380e04f38b79247f0c607a97689ded20de3d1361de8b74", - "6d660e63ee96ec3fc8dc273357baeef43725e80adad1abe2eb7556be8216ce2c", - "44a749ac1f1c97d5cc8bceefd84500d1b7f305f92b39a5d2632c0072598520f7", - "3252dbfd42b2accaac3ff233ab65293283701436207350cf06723b999ce433dd", - "0bc0fa17036bc94737e69f9260d2d72c7781347cff4822c4ffcfb95ab76ac682", - "e893695331e8a5b32af621589d1d84e0f2bccc79c62bd45f026ee4b9fe0d41f1", - "b6d7db283ded522d7c3d4382e76d64e938e369233e332f6c999089c450fb241f", - "2ad2fe642f3f6ace5de03d06060dc691379c1acaed0d698b60b8379ae10e3c6d", - "28c15bd082281d7e51f8526564ca267e6101fcb05231b670ff84bbdaf40127c1", - "2cb5252598997571ac5cc4a304113ef93860a4f1c1caa66090a5d88055979126", - "5e29faff207d73d8ef08998f742ecd8acad019d931fe51b0ae3f8d366070a473", - "3706b73a731ee964cc824af20d451544fdb556064bc531b854c3ebe06b234ef4", - "149daf6633ef92be92007bdb1990d4416cb44f2b6c3495153965b8a3e300fd39", - "df085b69dd46e11831b05f415d09c1b0b30ff70a4a4e640231f91a10b1f3dc78", - "117422654004a3b753fc1d473449646ad49a58a8f8c9078f68cab722ca938793", - "92ee0b8097c7b27c66003ec9b965d16cc0442dbfeec5ba62f392f30b138eecf1", - "a97c53f78b3d7af5c4aa97517f65a8a2f790650ad851cae954e7cf9bf3edd409", - "09a4a659d08a67f7684f5bdf2b0060609797f2ee582a4bd8670b8034c7fcb283", - "0e7f5b8f44fe22c8aeff442ffde5cd45c4f8fb9b7c7d95572a2028982ecbaa4e", - "6b9020b6d5761ba1e582b09b50d0482c601ba47ae14b9d8d5a1453e84031a993", - "30342658e8d785af78ed24aa01dd3ff8f8557da9807cfa1196230ac8b100c6d2", - "72d92b46bd9afe883366279563d3a93ac92b55f9e05a4486de494e4fdd47c279", - "1c4aa69eb5985f679996e5e39a27de3ac6c2ff049ca1ecb3541fc821e978cc43", - "c71768b91ee7ca926165918cd1f62ad4a976fe87300f7e362ed3de084142f7e9", - "67dae782ad1215d27acf40c622a2e773d57da6e01ca754ff6e8f59379e210f54", - "de9d93fa2573214fb43d76dd64c52da7b494f9b411b15ce50d43b92c6ca40521", - "433fcf358c293c83fd361e65f1a3727aef67474e242c37a8faf22c1769427542", - "aa6fd053efc644ff210579409df6dc2d5d42c5c81c54d893fdc28a289d651028", - "63a34a0a4fdbfba72e3d65c13c2634ca552567268796df4d51b30e6b6a2b31f8", - "05ad5758604847f6af0f8b9b65fea9de73c59edfa3957b652475736b1f81827a", - "43ff37010243ab1a3e8e2f9f1f7a5bb79e62dc6b44abcc2bdccf1db47b30ec67", - "be4c377aafbaabcf956d18628287d3c0bc140a2a12bb4452a4493b8615dc57a9", - "536adacf1f08efdfd4604d0a731ff6f52e2bc60ce7ac88c8cba8538438733347", - "8cb816d5a8340c33207bac32e2468d8a4a3679cc4f7ba72ad31319b3db9aa11a", - "e99e73ded3d9e0bebe0086d4409ce5c44102a20f63bb8181a9e58496aa74a7e4", - "3460886bc280f67fd5784afd738251eed61a85d4f4cd2ffe7f99f81d54b0bab2", - "30d8df14f640edff08ef05a43dd288c4432413d91889594442ad1761cd007cc4", - "9b0ef0d01c8dadeb369fc86d1dd0acdf7a3753e940a2337654b1750477c198fa", - "2efd1f2555457ef57105feafb557da7d15e38a7447bfeb17f3b0edf7e28d9e4c", - "a539e825ceb5580f7c52fe764f831a2cd17d4786c6b8cd0398c5a29cc992302b", - "3872ad610019cb88ff0ed428dfa8179868aa95809665ff6978ddce810d5be43c", - "22b5c9b07e7fea2f4512bbed24d7763aeb9591296adb593ed8ccda4c04214542", - "ab86765b127aa73ed94a4b256c798420b20563a9038df8a650091948b2f12854", - "b9e21a0bd693a056ba6594807ed32788cbe8085a35085d1170b87e71233baf77", - "7d02d055d9b04c98e361d5bf0c253b5edb32ce52d5123682d705cdd679c2ce4e", - "11b77b6fdbdd3b623a33a6b72afdd8417b24c79a077e3abea791380e5dec2f5d", - "bafb93ef0c6bf389a088e01a1c8cfc7d373d53f5b2b95f482ba0bbf3cd938f9a", - "7b8e2bb8a2b1bac983e23f67e91714f84f9b3e14338d0de9236bb0177a10689c", - "470bb4010ec683dc4d14496bbca94fd5db41bdb3682c1b744b9fb4d37eedb8bb", - "52d573d6efdd321e57eacf19080dd529278068c4ec3835cea0bc653452770fa6", - "5c1bd28ef9d38371fba282bb17b5c9f0f936041474e97f3fea526736fe23bf26", - "5a8068edd68e9c62128cf83ce71723e72147d2069ec34bdfece9b19dc106bcab", - "ddb08ad420c0b55fffb9d2be43e6248b77a7b2cc68be296aab5b859677b79cb9", - "cef9be04df0957f60b97024ca4806d348e5638eec899301aa6ed8c6b0110ab74", - "1f4a94679fb90d26ebf8041d3e3d7a2b433d112e2babf2664ddfd6f903490133", - "9770b3fec0a6a0bef6830c921039f09f60b45fabbf025b7e914c139b72f04845", - "88b34c43b4decdb56131feaad5c6c0bd03e63370c173e7c3e4519c0d836e8978", - "a3782b0ce129780e397a88e7e6d35390dde5fbc17481c43a2a7c3bc64863e392", - "759bc0e7a21b87ef3b86c50d123d0b5763800b062237b9695c99ef2b5040547b", - "100a5cd1634d94cff847059347e6f3aafbba9d293ef62eaeb9a3e4f21f5fbb5d", - "24356824c0868ce37812fcadc6ff2655d2fb52de85fde49b9889a21a59626c95", - "3872335c4e34c73fb3f35594e40e1fde2ee69d00cc68b95606992b1c538927ed", - "19eeaff877beb35460dcec2472b290b419606bdc0f86df012ea499dede59f6f6", - "07e9831f5019b3c739e7af0a73dff6cc2a156e2bad5198eadb6381b38f621ef1", - "030f4a7dd82c494dbce9764b302e8a1638869b610bb19344f847366da4191606", - "9322ddfc3261a92e6c5d4ca2d5ffa7f74df8049a087539524cfa744ba0e0a2b5", - "66f09e3d8e60a2e96fc4f3b3eaf37f9b0baf6e49eced861128bf702502b00d11", - "60b9a4a6cedac2e4aabdc965beb09a3fbf789945037dbf4ad46b23e0f49da1aa", - "085768d2b0fc3dd8e5bb89e045917a121a7a224ee687f791fc40115a2934d4ac", - "b77ccb6fec0cd832f5076675fb80aeae254ece3a1ce5f58ed3c8ab99ab827755", - "1125ef62cb3724b2cac8ae4fd315a677771aab3380cda319deb8acdf547ecdbf", - "1e37aafbb5bf9dabd12baf85062c5835be62bd58868675a43ae6901d23dce0cf", - "bbaaf6082dfdbdb68d8e5fbebf0373e23ef98865b68e4955039bd26da827dfb6", - "830852f355ff22a1222eac44208ef7ee5258c26fbb959e4a007af2d64602627f", - "d43ea36921884e46cb3ea4555fd14369b84cfb0f8f9e509b6d6d5c3f7d2818e0", - "47d0a3ef0701b87f082efbb6d9f9ad74a58438e277b239398f3bdfba3c67d69a", - "66d1cbf3cd54e4d403a07b337111d8c79ad5d1ae1f1abb22b9549cb28afd40d9", - "0bae6cde5868cc3c53f21ea2314b2c6ae615862fe8732efaf9cc931033645d54", - "eeab29d6ec2a10d6d99627975035e945155333f4e0df171791e79976a6912e13", - "2e7a6dfdfa70934f66bd24576701a110ec02b7a83c61822c21d50f42265f9079", - "d5e49a78e14f81f81bc1281139b47e28c4474fc3ebbdc1da159a0d3fbe21e410", - "2a102c8c8e1680eb90105e5b37fac05d3d305ab4691077989140f67913d35753", - "b405e27ab985ba8d2584d4b4eac8bab43c45da2309020f713160ca7ff67ee139", - "28712edb005ba269bda28c143f68874024bc0b59ae5569a148f73e2a81a0730d", - "3365d83a762c24ea0b9eb04fa588d914db5b4bb407703f1a225e473bca0e61d2", - "387dcc746455686a08ae8e15abacad372a512948ddd64f2cdb2ee42a7993f053", - "911674f498c7bcbdc5f64705b8484e4892943684d2e7837e0bf8df7fc0ffb229", - "46adc18202c90e64f4746054c90fb5da7db6b22fe481999b20c93f10627b7863", - "4472accc01d51d822a530c38c803141b49a5ea51b11a8b9f848caf8fac45e6d5", - "3deeca918be830740d24cb18c417b72b48424a59aa4ff98fa591001109913fe3", - "fb18ab5b1d9f4f51de29336eb5bbe6f4e24a33a4fbc5fed96d297f98faafbf36", - "58a6ed3b11ba1e9f593fe546d76c22a1f654536ca8872a1a7f21287742eba69d", - "99b3c0d349c6fe9bf630ddb75c85eccb9c2dd33148456060fd5142c4038f5cb7", - "5b1473af1108b1535c96de1e333dcfafe769b967b2a8fc2d1ae0e631ea33d75b", - "bb0c94fab8f499bfe41ee58c0aed336410f87db7dafafd304addcbc0a44508f6", - "53484c7bebef3333ac236b51c7c6bf7b852095741adda19862dbd7a7e045b32e", - "2b040475331894b930593fe4e9f579b3cb22fb255fc005d7d2a83d26e183572d", - "df53e01bcc74675bc4ccef320228b23a6283e3b1efc6ae794ff7a07024e65ac3", - "7025da22ea35ee2cc443e79e03881e8a8c0d4028c2adc2b4901bfc2c04180ad9", - "628e6bee0d175d5e712c4680158661e24251e0b2d8633e891af0482023e4d798", - "75a0ea39dd2ee588afabec708f16317e61a0ce32cf87d2b88bba38aa7b06c2f3", - "bd0ff6c454dbd5884e022a5bf3b96604906e8d2cd0a66af18a7a687e012a355f", - "42724eb2acfd5dd69542acdef36cc8905471d940722ca93318a12b435777cac8", - "5f5ef032c8d3be572fab6f3e4b231059d2143a89122ea9d489e3162f48736b25", - "2b7982483b883076ea9df5f30c92ecf89239badb543471db61dc4e55035b1b93", - "987d98bd89a61fe7413e780e306d33248e5c47171aa2a9a4efa99b4143d19fde", - "166b710da53fcd665ddf47f2ff23e53389818fa80c7398f4130fb5a22b377ca3", - "f73e0bf8611cc4694ee8d4162d66dd06ee0f9bd8a9e07c19691a55896b92e9af", - "581cebe39f56bd2ad4f3631b4339ab33b69138f7daf7eccaf9f609e0bba0af15", - "c8a771c3abbf8cc0d7f87ba14b07165b71d93f6a77a651522acd097537e35953", - "f487f839b38d99263e11253105caa50aa23594dcb8de2891ada5671a225e2db6", - "c86179d49f0e1a601f76183640f625c208770cdfd894022cf6edef6ef5c4c18d", - "0416c48be24f9048e042a2463e9575d8d61cd17bfd40c7a637d1196c004a02e1", - "a164588336365a371007fbb5ece145cfd2fc43a68af97c540df1366db78fd6f4", - "a111daa14ae0b05d3ebcf554e99e056d911935ad5385b7304264c8cac3320206", - "1e69e9d1fa0b8f2f31be353deceaf1ad957022ee95427bac0f9a33242cdce177", - "d024e2fdd85c4d45035f4b1c643d6f80c2401e5facdb77b87801760d0af30744", - "c914ee8665bfaf1b03e8b7472ebeef05d5e2d65087addc8b639d365c437739cb", - "280a3dff65e7868908517dc086fb10ee409360f3a3dbc17c274a379cc1f57bd1", - "36e43b85b3a62994a1f37eb26f823e0366624d5c1227c9988798828cdb28aa99", - "c426547d2434a35f63cc03e9f6f4fbf13da13e4c54ed112bc6a76ced8b7d95c2", - "210d39041d98ff2f1065e6703f1c751bb60b53a8a0fc8362af21ec8376bb3df3", - "47bcfd8dd7bd4def333305d93b42786f2d16bce2839cbe4edf022f6c795459f8", - "21101c02c1cc2d0ba7554a8e7474916d3db8e590d8fe61dd12a706609375afca", - "53c342fcb77a7c1c607c55ba7ba779dc0ca56248e1546242cae50fb87fb43ff5", - "2fd0ddeae76af17692a58187ddb18ea20f70541f048411efa1967dfae0500711", - "334fde55fa10598d6a9398f79322201f7b5a5062ed34cf101c7fd680ab5724d2", - "0770c6e2952483566b653531f5cc8abc91cb81f8bee6a1748042476ca6f40a1c", - "9e8f52b290d447ad1fab8818a3bd213dbc374e6c476c80020a009bd45c533c29", - "808e84566e22dd0971760635f9167ac71d69c927c3637403ffb998691aab2740", - "a86236efe80d8bd1264495a02789ae43c09182f2310a6c1fcb6f44bff0f9f13d", - "36a7c5db27a5b222bbe43a3e84a06d7f93b4ea080a852790511bd6a202194deb", - "4fe895fad21465a91d3e7ee4cd99e989bdb46836d00076fcc7c23be70b23feb1", - "064bfb8e73c854b1ad56537e0047c2db6ddb9036836cf904c9dc68c3bd53611c", - "f3aa1bc71fc9caff5b2ae54b0ae350e48966b9af06998619d944e48c99671d13", - "3a2f4f8254746fe7b03a51b2aae15995b766f982eea839f0d7685c274ae0c12d", - "358b5cb8f52149a99ea6dd4f82d8cf5b8324e6927e163ad91c6fc228523e3560", - "d9176ac2b6027129335252f2b6cc82fe61f829e982c44871e66fa0f1948b8855", - "be038b9b702ec1c09591b2c33ec4143a7d78620bd5b43c77b09c1065e45a987c", - "f6b5ed816817bb084c7845e7a8063743b2db739b76afe12d66ecc66979b29c87", - "0a3126ade12d6130778b3b3cd5e098e05eaca0ba5ca0dd741977b27f4a62879e", - "ed096ed935f9daa1a960f256ad16d473e71e1510baedbe1972ef86581d60054e", - "9e19e9fbb60d8fb557c52bc5df43bf713e21208f5cd96b92f29ca43dc5157ece", - "9fd748332285ca84bb3e1d0773e83abac71d753321fbe8ecdb94ce17f53d665e", - "5d264e855a6f2240411715e65a5816a21d7ac99b8e848cfd5350918a1fc30480", - "46413c2ae3179177b4aa1fc99bb2b47f7f6c48f9afd542bad47107b6e984fcb7", - "fb3dec43cca5afe47f3355ee055790d943be238cd4e8f235e29efbeed6acfd28", - "8bbf5a8f7913cd7d12427f4220e3afea4b5b48ebb3070c6d2943e819c99767fb", - "284a27d751640a85e3c2719998031e614340cf37de69d7de082e8f63a62e97ae", - "c76cdde63fd6854ab3ffea0396f0ab32251677009d977a55936e5c62796d3325", - "24b2ef5fa82acd26502b433fadac5b2fdef5af507e36f025149fb30b85d20e9c", - "44b612330df7c9fecfc0854d977ff02a0a2c9d5d30cb204e24f94fcb5db8b165", - "cd511a65d8bc60ad8e57dbe2c54a998570cee2648c6e96bef873fe4a9c76908b", - "b6014bde1ddcc88fe83ae39a86275c73061fa583429a3b33727e038e59529cbd", - "64bdaf09ee4b756be4d2f776b60db583c9c28930eafdcd09afe3cd03738f62bc", - "6f5ea15e97bb56b761375bb5f6a57813299292170afaf2c5b17c09e5bcb9ff3a", - "7b293916edacc3f47aa97d63031c7255ba32b115d3f636a3ac38684085fa2a19", - "2e776f7084b22c3a721e62c12e46cf49d532c053719ed236dc3ea8a74b2ae5ea", - "c5fe5b9345873e93e9fb31e919591cffe54e3850266fedded8c60c917bfaf85d", - "3f892e10ca9dc12bd4adc5da6a27f6c574872c5e615b432b96366e25f1fc183e", - "681b527e165395e200bbed123f01570820f4d295a83764b1a06758c2c828203e", - "f91feb78fed64b6f77695ab0d729bec1f495f0b6210653113fb66f05d8c5edea", - "e59298b2582983cf7dffb252729b9418e7e977fdfb78894c48c047d5f3aadcac", - "132df7cf9d9ff50cbcdcec2df14112964cb90b9f003cd6456020bf4d84924fe7", - "1df2553adb002188922bd2f32c0527430e45752bd2092ed946afb53f3c26e816", - "a20b96b99dcc6f953752b4635ca959047ffd1ec6238b6241b568b2a79e93a1a1", - "72c2af67aa06c45fd8dad0b12f5eec106004371e0fe4cc1f4bb94442b75b008c", - "58b3952b196ef63d6b63c4367d5d92ed46e8a5592025584af1db95c6ce433fc5", - "28071923bdcb796eeecd844912a3aa90b8037031f048475de9eb85efd47515c5", - "e4a07724fd2ddc83cbffe181524ae606c17fd9cf6ea2b8561761ee18dab1481a", - "99850c4e694fc7c270d5df374970baba72b2cbbbf6bdbdddd8af8d556446ab57", - "39e5cca5fdb5394e59d4cd49cc20aede59dd4f5db407baced57256e0855be7ff", - "a9f6754fd6f8c9767c3cb6aa94e1fead33c75cda43353cbd640d37e241409bbf", - "d9cd47ff6ca19ec140238cc28ef40383a33e7f0921a728f8327a87be0f38fa7c", - "cb0604e8992d189077c50a31ff83445874b189dade740fab04e4e6fa397772ce", - "6a0d75acae3bb45932540fda334c17ce08212bab074bec8d97c37ff8b0450fe2", - "dbd732ded89241d29f6ca3ce79f55d8a35ad6d569bfe2e0624a34e3a3c6f2df5", - "3ac6b8d6efed2f33fb896f585903a38261adb5fce5fe6fcc7600f4e607e1c16f", - "74d37275ea36ac5500a6076dd00390b1f6e96ddd2e7c3f781bbcde0bac5c5ee7", - "1a5f79fa248892eebd17f445bc80439bf8ab94f0d6bd24520a6a87882d7b29ca", - "d07ca918e8192c3535eb1df97ef638295cccbf2391f60ac3dd506174ca8c9150", - "dda4abb1eb62ea9f7ae917f439747a30b0981c6fc4ec038a2f350c7db56da36c", - "6c9812271cb49665bc5f24f6eff751d09b034e285a36872859d86d878c431eb4", - "b85a5cd78f722b6204030523213830c552e8a8c56e69cac921c9d9cf64e04c33", - "d30e39b580e0bea4f746af8b0b7ed389a323612604557f9a10d879a5fd0c1cde", - "9f09cd934cf33d0e5d5676d7c216c65827b09ec45ab863f8adc9829c35c8e70e", - "5e47ad0e6aeaa0cb3c0b28cc3b5320c6e5ebd122d1102273667383b30bd57b35", - "7fe13939e29a6db1328380a35467f445ea95ea70144db353b2537f638a7ebfd2", - "6ee9cf454fc509b161442ea6b61006274f52203f9ff37efd3b9420f0f19c68f1", - "b1cc0a4509aa2f0e252f0a6e86ecb9a7481a50f3a90e084f81c0b29db3c065c8", - "832ed23ddcfd76bef730605a2ecc6c3e32db1cae0e251484578492a7adb93884", - "125481021a791594359e6dfacd22937e2337b2fa21a6a46cd01d4e6b5aba3213", - "3b09bbf1c4801332b94764f0d81bf6c64ca1c61e99672f812cab2f612a9bf820", - "014f4912e4e0e66f5833fb56325aca0fb44b0299221ce2851e8e3fabca5bfc85", - "0a7ffd7dc47c4d98c7b0bc2fee007e05bf4cbbb51baa8ceedf547d32174b4acc", - "2885784f87b624d75c6b39b1e9ef2d547db21f19d49923908713c1404641eaa0", - "50854b2db1bcacaee04de96757547874309df8d8a32bee1680d211a75c53d036", - "7c57910b21320857697abd3573639992969affcd1fec0e84e8bd1f8278d910e8", - "9315e412ced310b0af4639d26b50b6146ed475557e25c7c923605a4d0ff30887", - "d607f6b2951f7eaa45308331897e279cfd9f813de11dc1bdedf1e1ad89b2cec3", - "4ee8127b45d7709f890851c49e046e51677f8270906a6786496e1f33e23c586f", - "92eaaf8a74daca1ee1f2e722d3c29780dac5b958a00f49bae5a577253094eee2", - "dcb01d3cb4ce93136c1ceca0993b61d2864d27ec6a620ecdccec84764ec6ca24", - "44464a8510d519bcb1314c0558919e9236d28793b75a45d8e10a751e2c34b475", - "4d0337d552218285c62e4fa8bab543ff572e057e3cd359f399fa8dfe53b00262", - "3818573ceadc07322f16bd214ad19d95b086ecf9bdaa7df6e37da5b01f102201", - "13bb3f77b2c88b1032c5cfad80b4289fd0ecc0aa4fc0ffb31fc707bbd2b0e06b", - "07aad9d94b5f36e9b6fa0ed341d4b4ec4e87b9c6ba01579b8136305a41a5e2d7", - "cabde21e99f51a0f8befc37a1a5f2da1e445ebb6dd197441def9ed11c6436d66", - "88c092a0a3416f9a1a31d18de2a69c8fdce4df7241d6e18a4e4be50dba7d8485", - "9ee33c9484dd4aeadea3e17bb2c2be7519425e2f68b312a1fbf11b502638ad05", - "63ed824e83190fcf4803e1f9ec7568935648acc0c52d496178154e1b5dd32d49", - "6af75aeed352e16778343b01a69c0ebf7d711624ee0848948e2c46ed87f96460", - "5d0d809b2fedeb2f2025edb7d994992d56bcfbf3a0399ff1e8a22ce455c42e1c", - "8c36830201ca811666fe9057ea839d55ec657566252383cd15be139942fec035", - "7c285c16cd060809be8d0b99ee4fcbebaa0cc98cc1e5ba7c13d72c0d52e9165b", - "894fbdfe7e7569e521cd37ccd4616cdd5c57f85d2470b34ca96608546bdac75c", - "79a1e57901749ffb7f2a16cf4db391520114fb428e8758e916a40ceab57444dd", - "b931d82d4c0923b22a29dd21a9334b0466ff440cd55a18e13909d91c17f355c0", - "c88083d9e6274dc8a8f204229b151469f6e075c34d074112c62d18f04eaed79d", - "208a1bfd77ce75c9f00c9810deb576ba6b4c902bfc0934070a2fed66a12d6d9d", - "01b75016a3fc3e92f6ee4307e8470d395540eaa7b4f35744bfd003b067a3dcf6", - "bb27282a3c945fcdebb295cec8957bb90248e583e31e01fa9a8d7a75ede20e28", - "e42712007c1466354d3b66aed8d0bf28952d10dd491c7f656e6375397156e763", - "bc5fcec82eddeb4253c4f0d1aa483c977c3400ad2187b3d7d5398f24b2d21136", - "3eb675543a2be61339da86f937d959ad822f746c31c269347524d54745169ba5", - "81ea6be547fba80915f14981a9f7efe853ef5eb89a71a174b2effa1f03aac701", - "8ae02d12ba99ce65d3dce0921c470d24e0a65320b85227e4531d774f93ca7e3e", - "80ec0f98569e12088eda8ea46212bd325664bfd7829c8b05554e98dd82dbd98f", - "0bd106f6cb298839681e23801c2e66be579a30eec38d253de4da75677b86e7bf", - "5120a66a27194301e7d98c96197081efdc05ab02c218d151bdadfdc5fd2ff81b", - "e0a3be38a5ecdfb873f70b420772bafce8f0e27b3383bad5a2f4217aeefaa570", - "8042112a975381c7214ee728746ec3ed878c575dd23cfdf5bdea0284cac8a0e4", - "f4459ef7317659c968c5c73df2e41a0bd59813d2b0a44ba054e35b5cc59c5282", - "e56e3b65764ebbbf3936b55c2c7714d57db9a6be7bb6ea42110c36bfce5b488c", - "906657b57862c79106ee0dcc11d811a1bae187cd30aab4eb4229d173e25fd59c", - "331188fed27ab9b325beed483b24a6647b4a3a1d9e233279edc96932b86e00dd", - "b1271b0638d3aa42ff4635bd1f382b2b2ed898576f5d534f509bf4e524aba20b", - "316d113886714df527988acaccc2b331a6107aecb8a0c873bd7297f512952d7d", - "c126db9038ee9ac059832fac05a503b01cc11802d0024e0359fe47b73683ac96", - "cd4506004cca4e8aebdf073c0faf6ad7b37d537f8fb8527c39df80e580d13689", - "005f363515e865a9edef6d8607fcaca9fb38fc8c52aeaaf2d18957692f847fdc", - "491f7d46a021ff0e29aaab4b94a1e6dc6e868d533d9c5af8fcaa99d11ee63906", - "5d330dd3dcfac444915c47ba7bab158fbee4575278632f511bb1e59a96a86772", - "31d62e79b8a160fcd0c942f01c0e8474211dab1c4d999430a2147791447554c7", - "1dcd75d5edae5e7b11d49a5ddfb4baf368d7b2281fe5fc58bb023d16d257bf7d", - "09feff6b5ba481f2502cfa91284bda1c86c5ca2619feacd1df9f8a4e85687a69", - "a72b7a09d6ec6c7650d247baf66589ea59aea47f4f8dc427235a8bb5617a9d47", - "675bf98074ae8097810abd4a7816ac34b883712a4e4f6a4e2a0aecb7d5050abb", - "a5f5a3dbf5efc0347db561428977eabecfb8033030a90a4759d74e38b2e885c3", - "13cc68b1c04f562f301b2b55a591ba30cb99dcd78f4776385e1ad24c27e43ffc", - "62694adba9fc6778e624c23cd4a7ff0528f6eaf4bac19a82bdbd32d81b299252", - "3cbca3e70f044c7a3ed7a97119650ac3a02bc58731d79cb8625db9c2ecb4ca22", - "4426ad68abef5ceceab0a8f7cdcf41a772149dea4d5b1e13f9ec5697817ad5f1", - "d6028a6f7857e925d93f69ac54ef58908ede1dbfb06d378d8c0e3b2258e9f908", - "ec15667c18ccadf1e65c88f343392746c0223ab6ee6099064a8c5e0099d7ad1f", - "b9d049823ab94bde4881d7131d47d31a7cefeb832f6f13379f859086295a1fe9", - "24f2ddf25ba305d830f8a428e6c3d642d9e63433463afe719fe484b5cfe3df6c", - "04aebb3c1a0538baeb98ca540944adce14fc83ec64d93923fab90b87ec157a8b", - "423acac59d839112db6905060a6547da8c5ac93f085e181b86eab1911d1d9798", - "51d9ee76d8b8366ff835271b0e4e52749cd29aea817b42bbbd076518fb56c164", - "2c544e1e475ab64a114f420a06a210f4f69c6bb7593efddcc3a56487d5a5562b", - "ec935afe1742e615cba26bcc0ba1f0cd9d5a901f33d730056fe3bf6c0a20e257", - "f9c9d559372f72c78b69cd1d2aaabe3b18cd101876fb366c608a4a1a3d1a7ab8", - "75b421158c67b2dc17df5df3a739fdf9aab7abfce8d1b5dc78f9a9ec50fdb49f", - "2d972897ab7d5b5e11ee0fd9cb22f4825c2c6be9152e570d64816b8a00aae307", - "a69518c6de92ada45c9f60b4284b11a4e6b1286da38f45e901023e6413362317", - "d2b2d95bc3f5c4a32351f0067c59a90be557011c647b7c4e11d77737af9443dc", - "12bd29f6e3b0b15c95fcbe51c5e9e3d0cab369c409ecf17d7d33373c993597c9", - "08268e93e71e45432420eb02d0f3818c28a41cbdf312308d729e46392b189451", - "5bf3e04cfeef7c235b9d5d0e53494fc65bc6de60888e734fac1b030c267b8e62", - "84732dd80786ec350c8eafe00a12bc3d4a970394ceba5d9c9f7d20e9263b9eba", - "ee275f83179d91973e06e3e6920ce2286601a24c4b35018884e0bd28e94ae38a", - "c3ec9e7f7727928a002803c7a9f59cc7685f538372bc6ca440ce7511ff55d105", - "79d4d981193a248dc6b6eb529ccef6723e4f1a4206f822cb0246d4d4647912c2", - "33558f620b30ea34fc91e461545088da073662091747dc895bae7d3a6ddc745d", - "33520b747c2df453326747d49c5617f6468bff0178e06a74d9eb0f22ecdf9bda", - "4c6ab02e437ae77cacf3b1b8c8052ba841261bd79c628b9dc0fbdab98dc09a96", - "7214a9fe25f047f13efa15ef4d59228404a3f44d20bb5cf2daf309315b0c1c71", - "7990ad7e63314c7749d487580b0595a709ecaaca3ae8a2e8516c139948363d54", - "389f591d3d49653100a3c53a159e8677433e62e3a55a8c23b74b8c5970210c9a", - "850d3e4e4da5cf7d5ca5b5abacc592b7d0732c747cb195b7a562058b0a5ddcf8", - "a86f51b33e1668e2598f5008b3180af99c709c60665deb4919563e42afe0bfba", - "a463f43f9a2be09e4280efebc660b86738647117ea9ab49c7fdaaeb735095dbb", - "70b3a2854d371e2a80c13976f95bf34ca15d04487098afa4f578cba96e014df3", - "f6ba707fc8758cff5ff65954363634742fb234b0d145422a96b5f59586fb4654", - "60d9961266feb5729c77286a30f61d5aef53d52166082dc6b90ba25a0d16d6dd", - "130d5577d131568f8957244b627ac22821400386367b72def00cb9b0469d426e", - "138e35caf3ecb9c64d18709bd941feb25402b9e464e6f7cf42d95d4f21410a7f", - "437e93bc128c7f989b4ecd657e52c50559294f546a3e7367a27df11cccea2fb2", - "4d1aec6262d83205e3659a61da5f9d0fd6baf8ddca7fd3da38468ced4ab35059", - "fd713a3f7e80b4df9ac4e8a88cbc084899146ed88ab661c7e3e0dc4d3c9103cb", - "2eef37b819018ed136610df3452aff53d4daa11c26065c1e97d6c40605564521", - "99f707594fc8f575c73d0137ed73e8fdcf9d5dac7b3ab0e630bd227a006f430a", - "1a367fe5bec608fb0749917271251b91119fc28d5956180d4d7b5a5f6ea3b2a3", - "ce23b233428463241c48041b50c54afdffa25e39fe6ba49e4977f1c820e216a6", - "04c04fdaad7e10ba0ad6a8235043da15ef3b08e300d87970bf4f2e2c89330152", - "9f108b3dcb09b4215ac320a1bdfd405c226b2a0d4fed4416887a46bbbd1e8d9b", - "b2be854acc8f476bff077d19c7cf57eee0ebccd2394ce4ef9952570f525c2193", - "2ec684ed295c4113084489b14ed06c4ad53373be327f0ea7fd8eb0f458f6b904", - "47adb702e1a4c0d74a16db243927a79f19643a37c2ed452d88a043f290b5b17e", - "1de7dec1ed73cba4d33bea1bc9da92967f9f79b8bb358ac08d73ea1bb282e26a", - "8205848d7513ae65dd41c97afddd5ebc09450ee31d4ee9d34b73bdd2a4ce562c", - "8b2c4ab8b981ec1bfa519667a74cb4753ac8af5466c833b658770d670dac692e", - "499d827d4c15d9b578c6b71c841cba4a874803ec90db894ac056eb675b1503a8", - "acc598437d10758fd00be26f732417847521ba064379be8d25bf243c070a1923", - "c092900bb39b8e7e90bbc920cded0366422254d1a8ce6c1cc3f1ac5bb794422a", - "c4b09b5068a8f5fb23aa8f105dae509785672ea0febdbe75bf0a4abc22f5f2c5", - "659f56179c63c6fbaf0891bbbeb8316132f1eda0593adae817055e939f204f1d", - "032c3453f9927286b2ff00e3b00fbe004c4b39e569e74dd75ebfe51f8a8355ab", - "b190c84f54279baa57d1b6a6b0d5ba1df339ec555298964795422ae62c08c6fc", - "8048245d35dd7862a4b1e3b0d1f6835d551d43ba8418eba5c38ddb61ce889c96", - "a88447570ff07881d87098b3b5343e00630726f0c6ffc09518e5446d5e3dca00", - "8e3be60a7e191a31578b8b764434e020855a9f7fcdfa8108edc040e56eec038d", - "d5e01771453e405de63d47a6113682d50e018519febf32c96db83b11cdbeb765", - "428c9e8b75d970ac0e96f957a56302ece5dc349afd151290ec53f07728d145d3", - "851c15fb2cf180c696ea2f98c021ccc1eced6eea6784482ddb8e60b32e663f02", - "b890de55f5b47ca9189d9d7d318e70bdfbf6e0f548c17cf3c48bf7225b51ca31", - "63bc439f646cff47b739fc96fa38cc8f711c6f9f7dbd427e55e418da21bcaf01", - "9eb018da051426fbd9320bcdc19e213367cb99cccf36727605bef8e654793e7e", - "0d721d1c889307b2549c6992a0a25c38eaf0e795c118be46eea146e57c685cff", - "a7976a57ff874ff1bea376f27fbf892264f5aabb191176a7a79c5f848c9e48d3", - "f2bd39d4f173f185131ce77a72582a86049d0df6bd9a5e1d8e227245758ea79d", - "014235011cdb86d6b783b3b851ccba985cb08d4cd4f3ec54e4da9513f2fdc1ba", - "7e49e948d6c6178ea910e1319698d805ba9a333c5210153c8fae1e49c788a046", - "5bacbc0788bea8bc6506232c33ee1a2feec3311a4d0108d1060fd4c2f75c6b4b", - "4a4c22055d15d3d697db2fad40a6f644a4a7fc018645d4deb8b56a8e71c6bce4", - "71cd03539e3d19ea77a0dfae0ac466dc226f0d580998999bdec3f8d80703f0c2", - "b8fa8740caf7ab30cff4ef1510b60b5972c11e3c8a5d0df847626d43b96fdfad", - "e37b15b378af4557ca26040b5afd984f32f48c3db6a833708df3f8e82683172c", - "21c0b3b60f8ed82ad94c3789155f7b9507ba7729fd6c7ab1c1ad357f6aa4b922", - "db7af157cb750f553cd7e8ecebf5d576428734ceca5912b1b0c877413d58a9bf", - "b9ca1c4993b1361bbc9b4843bbee2a03eb86353bfd2c3bcde6513a578a79296c", - "4a5db36e240f817fa5b040944d9699d688f99836b496015bf2837625fb972a63", - "5a02d72772e6056fd58206de42a516a5607ffe9e9c778d53712256eab3b0f214", - "2635859b3d336f17fd85cbc4c0c0cee0de356a0d1793ab518d168ee8fdb16a00", - "137872104af97ef63a3611b130da6d055dd422c9c4640a589a5295f9c68b8639", - "073adef0d108043f73b40c04209e2f9766a2d56381b680f90bf776aff8eb451b", - "b2cd76c95f11c4441ead7a81c8f43aea55c12e881bd6fa23e6a84d49f7f9fa45", - "4ca42cda5ad8b420809d1d9c76571007552fa559d9c701136a0e7b723c9e4425", - "481c1a76de7bb9c49eacc588e46c166f3e27a63339f1177e5642881f04d92298", - "a2c71172d2822688b1d3840bc7c83096ba08fbb33366b405bc3a97f7f24a0678", - "0b3a80e7940fb6d4dedb90e3c45997174dc4594d2a7a6964244230de71b3cb90", - "560db8b28b02b7583bda94fbe15abdfbcb931dd081f6ac7724a6a8409f55a406", - "a8b7ac1441da99305794ff13ae0999b6ddd95b039bb20444269978ea8de7d5ce", - "aaef17f6be70491bfc7a470f4b6c209abdf6c8cd941b7a1a0f7d4ddeef768841", - "300877d33ca14590c67b5763dc5138cd4a93a97aec874305dd95121567335bb5", - "bbdc78c34cf8a82dd06b8cb298d3584d86ab545bec070f2c7f306db4d28d7cef", - "c6d8e41192415658e25dd53a6de32b6e62f92394fb682cc42fc3ce1c2b09ee64", - "8a6677cd9adb7a045b7bd989d565dbccd5828919273b420fd795428e2f1308e8", - "15714443ae0d22b9bc61b9864ee8be82d9046ed9df589b7a26e28f63a2312939", - "1c5ae93dfa1dadc64e20c7c47e58e2b98c7ff0fc7a1aba2d9ab3f82b5f2c0ca3", - "e0e7319a870f9fe1fc6767324ead5d63692d7168156a7143932121d101347cc9", - "96d166571a6be9a915ddf4020b13beb4664ad6e93c47c88fb4c06c5ca1d3f9f0", - "85bc2ce60e42b9692a26ca571d3c55439c44ae8e9b07bcc1ee31f17188763fc9", - "3fb435511f7c1be53b4b8aa11c50c6a79632ae94d2ad5cbc7fe9bd5231fbc9f8", - "46907642a24fa4f2e6b1f12172553e3377a5625a1fc52adff109579d5a8d0b5f", - "d9cf16ac4d37c0e0196b7489aa9d9ef6c0ba9fd4f23d623c72ef21b15eebca69", - "f61c940176ec4e3e5065721d97e24e0946c3781144dfff937f98713c5ba52305", - "6b8b6083ac30a6dbf5e36d0a6a2a9b1f7feba1fc0e92eae034adfab5e087a92b", - "b721b3a64cf175e913bb794735b29f70733fbcfbd857a60c9d7063c8dd09dcc5", - "2807a10dbbfb1eea238063efd7aaf6cbd6b290f7134b9ad853dbdefaa81142b4", - "5023ad3de5b3dbdceaa5c5d917d3d4ce8532fcc90dc8824873ccfd4246d50d72", - "d6f5d9228e24c7a87268c798f716113a9367e17d421c40b59f75bec7c0e5a601", - "45614a7781f1b265bff9463b0ea1846bde3ab3391ac994f7e9ecfdb5047b1cff", - "5694680000b3beb332fa35a5fa665cf5acada35a332e5ae7dc64a66210e7becf", - "e1d2fde5f487b7cedfea6bd755e2ae9045e6dc4f2cc10f52ca8afb7c24708429", - "59a7936220d2bf6f9cc9617031c156977743a23f8a433c0cc0e7c720caa543b3", - "8e233d4952464faf5e8a5de6fe4a4567234481456abb9b08796da31b044c4791", - "dbfc5c06e8907e8bafcec4b999b77efc1e9ed7c1deb0eb7d1f9a6cc2498c3acf", - "65ff277315b0e4bc9e5790a0ceadc922d6c5f2473a827c24088b35779d809aed", - "c9aa2ad0946f2a90d0125cc0d73b61a3456465dc693610fee6f87ddf1e469e5e", - "e4d9914a3011e35fccc63d0d17232e276f95ef1d4d701ba8ce7b7c55a99bf378", - "058f4aad70635e8ede38b56fab9dfb27541d66d94bb41029ee2ba106d82712d3", - "dc052507bba4395a1c25be32d7b88434246ce669c8faa2bb9172f72683efbf72", - "a4e9ea1d1216bb257cfeeb1d05e48e2c1aa905d3537a1d108d582fd6565f7227", - "37470dcad20d4e077ea8811c6a29d294c6b7115351170f14d0026209e5234830", - "0d46058b72834b7411ea8236c8b3457a11d6ca27868d0c5748c131dd7736517d", - "44df09f06302757941df343e863bd647128e326d26c091986d733fcd2a753ae2", - "92b0740a11852b3c2b869ca1d5dea4be4e1b8fa1aa888c361657af14c77d5d1c", - "5e363e1db5847eb1703af2095809b855dc709a1eeea4514486736b6f6becd516", - "a7612819718a971a9a43a60d8a7da999d7758958d2f8a969f1c3eb2613a856a4", - "e206b79945b7d87b4251a0cc5c8068509f9fb9aaccbff0999e19981cc784aea9", - "f36b87283291c95e7e2e2934cd47c02c49191c6495265ffa6a5e4d4a3433be67", - "2fbebd5ddb1a022901a7469089750b739ee6d60dc860bd2ae6efb86b30aff645", - "13a865c319092001be83d6ce9e2169e378d1cd889c1806f6550786d03093b32b", - "3894a10cf64a28088c82c94d43be2c5437a3e957c443997e91c1f4358f10c324", - "14cf46dd6c140d3e7213013f1beaf7762976eee1530998ef9c93d014d958bf28", - "533d272454e5c5fd07b9c12183d57125043af4313b2ecdfa34679ceb9d141ce3", - "6a59eb1b7a7cbe687f992df1e16cf66a284b59b040fcb12661a60a54440e8a80", - "cbd7d8577e5a82bd6e6d67c1dbcfaf2cddc9b256caa49f7e9da43f2502caaacf", - "391cde62b611af91a7365d4f2769155fef69050ba5397bf2ef0d23dc545bd849", - "7ce02d8409cb3451d4a24c3fefd780b075349ac48938bef16c07fc8ed1bc7377", - "a2c0bee2c0a4ae9b3e584f85711ea1c4743d2c5fa160b4c706ccf04c8bcafe92", - "1bc018740fd11ecf00109a6cf4fd3fb8dd28b092f284b1572cd19d9f5ec5dbd9", - "c7a345d3eaa11937befd357cc84bede0f83de64c3393611ed4357c44d0f8704c", - "a7fb455cfff5578f16499b92bc9499cf957452a5a196b89e1a573bab928d2514", - "19c10c8e85be98a1a38b3e985e3035b3c485508f7e250ad803d250f3bc9f4a73", - "1b12c4bfa379ba2243f64f316014ad2964c48298febff667ed79c802f90f294c", - "28da8c7719dc8fddf6d28be319b4003213620d33efc6c099bcf790dbb20303bd", - "38cb6d29fd90779f30958824f4dac97ce25595ff1361025f77dcb7c1fdcbd8fc", - "234fc4c2e1df2d57c3010d53e785094827cd2a6618f6a93d4c204b4c84315e6b", - "083fc603b222899331d06238f8c7a110e76277e1e416cadb946fd22624bc1c73", - "bd96d0eee0f3906a673d6ca568797e0274141ab7d70416926e9c2373bfb634c8", - "65297b5d0123aaafa931cb015ac29e0134c34a8a6915791543c7a82f4951c6b2", - "fe7086105784bb539161949e4a6e9bee6f04a1b373ef74b92a51585c4109fa3b", - "4cee4d9412b93ed4108ca835f9d9094f58e9a314357a18670598e63cb6f1546d", - "d0e29a3e8e662dbeafc415c3702817c11c85d69a90ed17a322172fdd31ef0d1a", - "f22fd83d2ce9d05295f7dae360894c287312f45eececab2358af4c9ca72d3790", - "92abdc0c7f0d346e84729f1b19c1db9d383a795a8d9d2b903b6ef0a379817b77", - "2e8696fca462f1fd06467ef6ec9f9a3a109a06fa78aa4e48b80949929f53d4ad", - "0688eb91802a686bcd349236fcd0bce96223f6c1446959ae159da19b5a4e0b4e", - "6478939eee49df9484c9256d2d7c81c3acb783d12cbf48eac39fa65965c6f9d1", - "4a002c3cccdea6cf4fe240abea0a8dc86796404b376b67a5fd78564374b13ec2", - "783ef00e9e558adb3f2becca2ef3ce02f11be0a48d30f0233268c35c0d34e59f", - "2afc453c23a8135c0344b1966924198a865b64a20129edac81ac9128feae42e9", - "fe1d5457610d5541bbc75bb926cb646b089fc509a6a885d1bda096b9c4b27c9f", - "c598e0160f1bfb48e9d96e2db01b5f3d003655bdad1f2ea98fdd8d8137ed08b0", - "a55bb749f207e5b2d215cdfae3d180b836e6449c30c3d9ec1d4de09c35d46184", - "267bf3b06cebfb436716bbfb7b17221fa6508740d15c64940f7279762c4ebe14", - "748702cf5bf2ffa48fd68ac75d387fc29b68e744e98ac9dbbfec31629fff3430", - "a3d9830472ff897a4b9455626dcf5aac59b399bee44371f284a0ae3ae00e3c96", - "7cff200bbcb8e5369ecee533c946c32a3edbd533e669df3b2ea1a2f9d92882aa", - "a6a02a51d868185d56e9e9a4255ba79db5531473ef1e02ee3011396cb628a37d", - "0a2233d4457c114f33ba17ded1a3b3a5bb3ba8f2b8361482b4a5dc189f6dca1a", - "2e77d4e95163513bc122bf3e9589325e8d1c12a72925b2c79704c17182490044", - "a5dd11aed3ab5eef955189c2b6c2b0c97a5d4cfa556c8bb1dfcd6fc48c56e944", - "8f5cbd03b2bacc4c119454ba983192b1b090950d22d4c3a71df631906a742700", - "7eacf9ee99d9083dfa4c73367504ff8f38c0857d6f4855e2dff710eaa3821b2c", - "eae8a29a84faadb931d544fbf7157e02abefac460dd7bc409f4e8e51453fb88a", - "888d5cbdc197e9dec0583b925be5c8ecfc223130016981039f4103c1fb6844d5", - "a52dafe18851d5527cd4b387ba6f762a31da21d8d07c032e3929cb1254e865e7", - "9d4291f3ac6f69b6241e5095d110e4cf7b28e30dec0bb8f8b0b85d0054c892a0", - "5a5df6795712cb50543dbef727269b4a2c53fa386928f71f7c0835e92118ace0", - "8b81619fcac0ae18f97427038cb280f149f2d8e8520093bade634c74fcfe8839", - "33d538b6d2548036dbc88a08e2c0598e08780b5094fb7d493ff005056881be98", - "593edbfbe2d0a41285bc64f73ee86f0c01fee17e699c0742974ee2d5c0e91c37", - "785168573fa4bfa63cffbf777ac0f70d338b34bedccd0727743c3aecd76fbf47", - "bf6b63e9a6ea78368c94f7d74465225cd1b3e5b6149e103438df948f61cfb7ce", - "2bc3fc7604d8cd4807fabdfd95c04f463e7df08e300a839b35d9998498dcda74", - "5bf1dd857fdcff056a434a7094084ed6ddbe0854d688918894a04acd38e3add6", - "dba15c67399212dfdcc11b2027c4591dbea69517425eb53e268a990c33fb930d", - "9b0043c8add7fb0e2cdd7cf37fa704641dca3bc6bcb0055ffd903587a630f3c0", - "eba6e5320f8c8b94497fdf69bf22d019a01bdee761c108f4e2927b8c38b3e3b0", - "9f9545db52ea6e22662415d1912c986d233d2196cdaf55a6258d1f1c26f9af77", - "74ed71a34149725950f25f1d91923ad8cb42590c6218b657e8fee4f487bbb328", - "676ff0f26856bdec36b3f68cc0ca8debafb8764f4d570d6e8828758f1e90c896", - "284a1b0ec8430e60bc2e86a97c3960d015014b169c6be7d190fe97c1feb33ceb", - "85648947cfd05f1a4a8c1028cd5783483669a895effa14cea5c2e5991a7cc903", - "d2461902c6f24d6acdd4f24923872ee019e94bbb85145cf7ee65a750a2f821f8", - "9e48bac2be6da0d8cf2ca94edfac18867925807e86880c6c12902a4b2b3e63ef", - "04236af1401d827fa0b909621a2dcf4570678729d0bdcc938fa6b0ab6c985a66", - "1ce546ced2a303f1036d195c38c820c93227cc7513a34206cb50e084184c4b26", - "425076e180ac484395ae783cdf33f6a7ea219a2ad5980292c4979951ebcd0c9e", - "be76fb2a460afdceb5959e27c499e70b03213aebe6654c586b7b171608ff4c66", - "1f31d5de274f16fee051873c22b5925bc61fd8de713664ec284f41bfb022505c", - "d9a060b3ba548dfdbe6e1b0e6d2538a5f8029f02f12a0a67bd53978b70bf09ab", - "09c8305c9a950e382b077e242d174c2da842c2e95e35f55a058a25ec368babe8", - "287f086faf5ff31a06f384b68d9d9535f121d6d13fb593c9acb50ed5898e619e", - "3bde66dbd1c51e7f4ed7a1f4193fd178bf28514eb1f0392376e7a429b452326f", - "67369fb0fda599abcaedb2da93be5234abb2a85a6688fd9839516898c30238eb", - "51e4beaf26007bb1d168740cfb627db2a54072da93af2507bcc7c43d74b62d85", - "f368a1819291e83414869bb78d734bfd683eaa0ab8a4e7deeab14a82e5dde73c", - "146903f06312c82801d40049b7a1ed95e0d6f84d8cde70e0614cd6f4e855d221", - "08ce37bc0d70d05d6b546a2631c34ab2b5f86c244f5cef42e73f48e046aea2f8", - "c78aedcc529c0e113e2bdfbc2d46f6654bf92c2bd5dcea26f1925245d3351cfe", - "169fbb371387bf698b743f73760960adfeb28ef4fa1262d86584ea5f79173e14", - "ed8603ca5a696f5bbb0a5e6cae27dfa9b463dda9cd663983ed615972af194b51", - "f3e715469a8137a9922bea2ab45dd29993d35001474452686fbfe8874577ab6d", - "8bc6a5a91955de55e179d423854dce1589e8bf4c89ea63b76bed672489987aab", - "7fe94897765f859232f5c9754ba29d3e6a62a758452d9b231bac7fcd9487f127", - "f1c0318d9081cfef7a4527a17b1f4f0450c0a31bacfa8d9cf91636a9c8b21c5c", - "8e65b238c9efc718c0fc76d5ccd5de0b312658dcc7244eb1c5b9756097c3a032", - "c40c60a452c0669b2b8cc04edb30c4ad8ac554fb96d35ee7224094ee619d10fd", - "9f77d870da4b7a9846e301c74f43d18e822b563296710cf8921e06293b162de6", - "ff365e3ed6dfb5e84c2ddf2330d7b74d9dbb0d073c2a6152963178578c3ddbe3", - "80b03ab0c7e01d3552b1604c9e9f73efc46d0fa6fc7fe7e9654eeaa959af7a82", - "87f21d929c2da5352063bf5de9478a49655b8f44380cc2e13d8d2968966f0a44", - "1f305f88bac05a643f69f452f3636e1d91756e06aca1575e1bf1e3a0ad72a274", - "96fde83ea8bd6be63b567e7db59ed76fdfbb4539fe485cdea9345ba47c58560c", - "49c4a670515fc6a865ab999cf85acc44e6697d8a1e19ce8c4f3d40086b03ce48", - "72693186f10a25978f51f305653ba908dd8879370343f1d845281f841937061a", - "911bd0e15b7081e28bca1cb6cd5bbde6fdd46ede8a2d3af0d7a47a6829a8d97f", - "759605c477ae549848d24cf7d1a2501535249c76655e6777b6db1915fbe687d8", - "25fb7d2afee0b57158f4ff8520d1790f6c17ef08eee0668282db529c33e27d5f", - "ec20842793a9eab8a1b1a98005e5c4a9b855d9a2b6a1268838ab3c01e6e20b4b", - "51070c9c060a1b6dd82fd94f24f944a1ff93a907e84c1e2cfe2070b953e34aaf", - "4fb7dd88e75cce65f3070e4f25380477a913da3a37d5a144c585195bba75b6b8", - "e0dcc501e159f2c1dacc3903fd29c3b045f95b1a097cbc0bb2e28f3366850a04", - "d7e41512d60b8ebb59ac419168213a4d0c454909478e8230bd4520a7997308a9", - "313a2448522db5ef96d97707706a868a84109d0dae88dec57c7255c4ed8ba1d5", - "1bf18ee9aad047a4943a83f80d660079089e7da7c088779487e5898be9bd53f0", - "28dbc17772a51f7c0dcdf3ae2322e1f82a1e0aa5dd4581d4c7338c16a7507d00", - "d03db9c5144f3fbc4b7a50f458230b15679eb56cf7b0df899ceed808665b819f", - "26ed106b7e741b8fcefbe3055daf2d31848bf55af47d8d9527c1b7c674b2064e", - "10d7234c6a690d6d22eed37e99d288831551ce7c873b81f9c9b4bdd0e1cf4d67", - "b987e433521546b1d5737ce2eaf0523544eb759f7c5952996d0e4693520ab31f", - "999168593bc7fcba91218dc9672f2498f3973b4468c5467fff54011d56380c41", - "ac5222cea140e1ba04d53e021fc1f71a638c2c580a6b47f765e0c36df95b2283", - "621b699a90571cab62d872d3638600c15b79a95a88059df7fde124577ca7a8c6", - "817937212296fd8ede0f76fa43e4ce772d7519cb202663966c2723fe62fcb754", - "c4aac10fd38f866db1d2e4fa069c3df29ead4314543340fbd25a31b510119492", - "9740a04401a3a98587c8f4c02bb94c566668ca13e8a065a9e3839a0bd30b6cf6", - "d980c00d391084661affd769e9f4b70ebea25fb7f9a89075d4fc9de6bb999f87", - "2bd9c9c70cf806c1ae7d48f62b8628459edad506632ae73ea6646446a778f07d", - "09d5fc64def7639d2369f17c3364ba7ad005513c3b1106d123b1a6e3d07a8b76", - "245c69ab6cf13c44d1336edaf5e635c3055bfbb7e023b5ddecbb0eaa3cf87666", - "38c844625d77aadbd49310e5a5e79e814d7a9399d1e89d206bfb2f6d235e2311", - "b4def011e6132b2f1e984dbd9756c4be4a559efc4f2e6aa378f0c2d3d68a8cd7", - "4e30c342ff96bf75e4fbaf0e83f3efc3ba27eb7b4ebe9f41ad87aac172ccc8db", - "139713673141659793182754a1a38b8411b382ac3a38a6030a8e81661d280065", - "a68a0d6afebfa51876059804724e2d591cd5637f1a4d05c394602011e3122870", - "66f2cb5924b52de53c97d9935927325b17cdf7c2ad3ec047061c17206bb91697", - "79f1271cef11cc5e2d0275926a89701689043e8c46fd713149ee453d2eeadfa9", - "6cae3f7332a972b2ad91f75218e726f0f9ffbb67db050d382066b2353810c9ae", - "2a788edb3b0652040186cff4f2149f3e216c177cd75bce2b213ae5142b9c77c0", - "b3c6e373656d9dc6d047f36c54b04465601c136119e17e8e098fd50104054721", - "95007cfd0ace181d202b5d753c8c23688cef1382cd9c4e9e5b6cff6aa029161e", - "e1dd90085fc02f39c44e9d65228275e1f2027f59a1e440dee47298faa03cbab4", - "476a334e25ae56a5d6f9bb84644f96b610efd34e84753089a94ebef28d18fa4d", - "17c94c99a2071705050021b918091e150ff8fb0ef20a1098a5fbc0eb89d15e31", - "7cb64eaeecb772afb41b0457012e5f8c4846118044b966fdf2091d65464354ea", - "bca46d7574a101bbf7cf663668c60a5401bc61c6295692401be7e0342e564e62", - "42bb7125ab86942d7a9e396e1fe169b4b1ccf9526ab7ebddf3b2655622008dd0", - "63414be5f5965ba7b01ec2c57f9a65d0c12aff49d5cf4756612c8ec24a75fe8c", - "9f641e7c50a3e915bfca0a665db0fa9e9b8dd75bd5e471e36ce6752f43d51b92", - "a1fa98acc2dc4e63399469882004ca12aaa158f5b1603f0489126c4a27ec60ca", - "ab5e9a6d9b53f648ed9faf575f87211b120e305e6535b047ee50f9b7e55af623", - "02649a2b1b56b273176a52b0d9c34b696e41b0b7fc5af340f294205cecbeff24", - "c29d62b728fa5fb29df1d57d76e403740bf7c1123390b602c13ef684cf237ab2", - "7ffb28d754b610b3e819a38ef5a1d6fc41a2a54b22f68a163ddba887418861cd", - "3f3de3f37a2d8b17bbf642d8477505f87562298e41455bbf7c9348555354917e", - "120a160ead5f7303c623345eb57e6fa24a3336b4fab619d9e2dfbe046a17bcb4", - "8e413465007a990c1dad5feef0908ad72bc3ce3560fbeac1466e9a0618d5f65f", - "abeadd7b3736d0ebac1de21c1ff816cee8abb01c30e7bc838c5e26d29a6639c0", - "aa5b1f01093c56a83e99f6eb4ee09f8671a09cfb3f036ed5b0628a53ee98a951", - "b6cf6ac26c6aa7667c882a07706f8ccf0ef7df4f6aa4585f1630f4dd440e2abe", - "b8c93cf1402b599a292749067c8bcdc84f32f64296f03da05a1ce130759bc2c0", - "fe80458f11d2c7a7bbb0c0d8bbc2b49cfb728b575a6b307616dcdbfa144eb3a6", - "e527f1eecc1671b61d7a97c29e1c8f2613f320ac4e052fe7431dcee0b399c6da", - "d0882eee7865497bbdb23f6cb8b53bed065986c9befaddd3d8f6776aed309da0", - "f110505c55710028100e46c7c65bfa040809ca4718e5cb837345d7a6af4197e0", - "b5b04100751a191d3e8c94c9c72de01fc8181d0c6fab9a5beae49daccc6f4549", - "b3d67e9f7d3d4c77afa686130a324e5208583ece42ae7bbc843d82beac87a475", - "05bc8be141694979a4d1c15db9f185ed74a77f112d8d8f89159183828a228302", - "8dd6166714f29a6cef6165c35e171212930849a932a75e00d7bf253ad8788a3d", - "5a916178f892f02b95a495bbaac350825534e8774faba29b3919b8af6054a22c", - "aed21a79f5d1940124ebf5e0177e16c4fd90561e0261fbdda4f9f53b97ed0eca", - "01399eae6ee0c28cdc16d0d6d9538757cb0a2d102b43afda2775b5788170edf9", - "8be0e69e030b2df44ede0640c7cf2f08bada7b88b6f09789904ff6fb0f12c0a6", - "bb8d8a85baad37d7481697c4c7d472d8e69a025114b2a3eaed6c94b80eea9893", - "79f3a7cd769953841a3aa1814d5f7f36fa5e4ea3338c9a3541db7b5beeb7157d", - "ed409688e2de7d0252bbe9b552ef5e61e1cb8dfbeb8f141930af39eb84615f79", - "37f42e22838cc1502b37adfba16fe400bdf153ec16c151b9d8e57ac6a0ffde06", - "ac9d80cd6c885b61a320a69232385fbf594c67050abb4273384e43db87c48115", - "7f5bc1b0757e91524b5e969aca768d5dda8128ebe565469219eac400deef44b3", - "093608767a58e50bf7af0c08ac66b2571e83757aae0796570bb60551c5ea0d17", - "4c7be4e1a735988570cfff25d9b85372f84e4629985adb3c03a0909669920a58", - "d4bd71cdf411eddebf4e769b423041534e009a15c7c6920d4b1d20c517170889", - "94acaafa22c76158ddabc00d32c55779b6b545f4d5fc1efeb4116052d34f6af7", - "c84d8b0ff881f4600ec811fb4bdbe4a3bd3500bcb9a5969462a83eb498be0119", - "5ae87cd9b6ffbe32a2a04406efccfd5863fc06d32bd0235a75da80686fc71b77", - "d1f5a9a0f3537d60605a56df969f9fe317b4c9dcc063eb12f9157f1ed03b1532", - "5b582b2da9dfd7809655a4a88a82bc2e30c68120f66b200320a11ae113ea2422", - "6fca699e33196b48b9a4fc08aae3e9817e6ea4f8866f82bf6c13c897aff82fd6", - "d1af9dccce58a957648c1dea697548ea55b448e2e40e9f6b60140c408c84d375", - "93dc33d1dca6da90b2dd7465805585a5ace5496dd894bffd6f67b3d574c22c8f", - "fafe5396950bf932bd9722fb74c84cd7854950f984afd4109b1b8196e5204a0b", - "62e46e936e213baf2070898e68285f0a78da5c0bedebd2bda3a7c917d599c2c7", - "39d3ff675745f1b635970afec59cccfd5ff1027a99a1955302fcf883d9ce6986", - "0c7bf0af39dc977c76bf19b373ad911f85723827c1980d7dacb3d3ba7ef8a131", - "3603103b3c95de13320ce61fffbae3f3f70091136bf1b2393226ee023e87c2f2", - "a5683148db7715dfffee3d73dc16f3c2746bf4668abc3a7a2d839de502b96261", - "e4d60a4f02191182e1669ada7bacfc8d8a40b84e2268840cf13f0aab85db15f1", - "e0e9d0c8a1c8ef30b8d5b4bd795ef8873d383cb52f352b42ae697d05e3a09431", - "9dbbe12d62c01e4107483e6a1a778562957bafd494fa4c4df1ea775bfa64b3f7", - "01cc00454a75a3ce8fcea6016826ee49813a6658a9c7063812dd540548dba845", - "34bbdb8f4e1fdd91932231db33d1e774ae01652c3cd910b7fa19b1d9ba1f2bc7", - "93f5f1040725eb8255f802ae09ddb310c058d5bd7d2436fb1c31947f7717f99d", - "3e06930c1edb2220e341fc108610eec64a66ef269f00091132990d15c4e01902", - "289c1a37f6d279a9061c8dca0e1a21459076b4402f9ed5c86702c49af3c36062", - "9bccda6e654894a754ba48eefc0f321ee67cb840ea0b17832d39324fbcd2193b", - "bd992504f5f04251d97389a87aef65b2552db0f5d6fe384e9a97da340222c842", - "14672a1985f90c074d3a7cff25a08cba494ac907cc224dab9311d5dc565003f4", - "6c88247de535ea91772c80851d7c24f3224dc84406f5425b8a9d824559a0b740", - "fb93a4f7d33d46061d513c7e70c623dfcf1264613387210e9da60d8c4d6fb028", - "6e01eee8ece8f5342542faeb8c076d552656c0e4f434b6c7151cf7636a1e8a38", - "9a5fc0d8ac0fb3f73e781256fe0119daf54324bef79c5b387662944b13e5a9b0", - "433d828d94adba785a5f2958a1f143f7dcedc4d9d37eb1a5b277434893f26bed", - "c32e67e58e50eb3a380850593973ff2840ebf760ab6f13db3100853a612f9d84", - "c67f791a427ff822b2126636e3ef970e402214685d41b459a5e90103371cd697", - "5a52aa6e6ecbb733ab6e0924a68eb5b95c688a8ff53ae781e7b20a3d35b192fd", - "7f146eebc5d16144f6386fa12c49d8d9e3dbd10a00668c33bdb1e3f51db53c9e", - "16558d8d2a7849c05a307768496031ca6a3f724163816b2d6164c2893241bbb3", - "f86d9e926dbd115712bf987df090b12239b5bb6764d44a7ce2c0dab26125baf6", - "f5193e5be2e4e78a524e86e556ac7ae446f434fe79bb95abb28237f391eda9a8", - "e115a6536e0c9816b830011ecc1e19cc077b2f5021d4ae53ae856cd79cb48eda", - "d751ac2fe4143ae4623474a58356ef8a9e21f327c97774a27af0f231dc3c5ba6", - "f1b54d34bf65e370886c4d7ae8c7a4339d066d69fabf5302873bcb6661002a50", - "e60de56eb8029776778ee3c7ee0dce48f76e0580885075ef6b0619db323fed07", - "795ef579478c1442216743e4a74e7f925ca8ffa32dda29cf6b6d67f587f3b5cd", - "f09a1670091c17d7bca6e32c430d7342f36ad116758cff34884dd396caba9387", - "87085653299ccf273fe7c8d9dfa495381e1a6b0060a964ba982fb2e1cfc3095b", - "20e431048f04027a6189b190d1731aee38fb71f6b49605ba9f73ba4dc04fa423", - "c5c10498fc619962f2228c6000a0ece4a5e05b74ffb111276272994e37a0fd3f", - "0eb91de1bc0f29eeb7aa745632759778c81021bda44f28173e6c4ccbff024331", - "9d114ce2e07159083403276c529d7ddb0c3403c0046028c38c3891da6fb168e9", - "b653b504541d9dc2c5f55bf3c1b6a20bb282212392e3318d059e0cb73ccdeebb", - "bc436cd11970cd07630a412ae8504054719f92dcb547f53982c3ff7acbe7b04f", - "fe435d9b1fb55bb2bc45016922e98cda8c03a11ff4fe54b5afe4fd127157e5e4", - "daabd0943e8a7c4e8107052445bef66f943d4a187543b2f7028fece17011e96c", - "bd664351f547123ddce8c724e235a3375abec4972d199984293a86098ae9cc87", - "fa5f12229a168610426db4206b0482f3ccf6a2ba888cde5c54723554d765cd12", - "85b7cc5bedd1448ab75ff648190a480f7c6d3af0d4fbf8828e491e2964aa5489", - "2065599b1fafc53c902aff5455912891e2214ef1528456ea6c4ae2704fece1f3", - "b7bdc1f92c92e4b82cf94f422472acdfd77ac14cb578b8bea53490d74452abcd", - "b676ec1d59844b2b9a2c1e15e0494d601390c8ad6faa006244b3d3d8b8c47331", - "633a46bd908591ab54ee887a3c594e36ac16bd21fb354d9f9a4d3497b59316fe", - "a2ee5c77c00fe2a4217256eb61d0f794e90a26765eddd6d8aa1fab41564492e0", - "bad89deb83cd836d3524b82de925ae7425261d0a6498c2b27ee599952089e2bd", - "d7896449cfd554bb46f716964f34314435b9e85c5b061245601f84cc6ff5a61e", - "f13d76d862059d11c0b5f443d1b8d6b147ce25a1f689f82a6c3ce712573074fb", - "2e6d8e6ea4e88ca93d6ed1cfaafe6a6e1bff61f43051dbd81c0f343f1822a3bd", - "78732ad7c5e5a61398a342624aaa03edca06206747cfa6456a278e5a21f4cf60", - "001b4eb773b7131fab10da3a0b7fe5a100f4455447c25ad08e39f78331e2f34b", - "c7842e9a99df9b617fa945fc3b19bcd318ae37c8d48695953264ab9ed1f2f706", - "0c5672071d0f12d6988308baa8a277eca9fba4cdff4990daabf62b49d8eae6b8", - "98b312216bf1111fc25e8dbb21af55462047d61ff4e34a261088ae3344519422", - "abb03b1f4e4817d45f432e8f1a9f8b66a1012ff9dfe6540b2c80482ff86c6d59", - "9f9fb164eb86b20b826a320e88583375c42ce155ee4ad2cf4148fd7a32726774", - "2421a4bcb89a51d0a3faad3e75083a8254e952ae77e03dd239a92d16df341bbb", - "3e248a1d776b0d49f7fece6413ed8efedeb4a473b95e7945e0a1a312cfd91489", - "38906bce70481e2eb2fd38c7541a00c4c59800a41d13d09846b67e1229c204e2", - "28891601a975f4883400b231a9eb146c87294026b6a6cd2fff4624a9dda19e89", - "b3402c1953c9e0c5652a65c866cf38c1b5076c571cec9e3c0d2b77a2fc7a56ab", - "7429e0f9449a906a06d10d09c2f69239b5fbc98a7f727b6ce1fd32f4fc6856a2", - "96f1c83da0051b6cdaeaf8387bbf0e7b4ed7950c6193a9198044615e192d263b", - "e54e06dca47bff57b2916cbc103362c568f65bd9979f991f89073943cd48dbee", - "b1cbda3bce488d7c6599d1d1503927793722ff1471512ece2f6e4084b9957264", - "06e6b89dd703fea4193eda41110e7206d37ee27f9b120efc881e6643022eaff3", - "af28eb8cf99e64e079726a6d33567c5ddcf9af6fd720e1a3856dfad0c4b50172", - "9bf5764b77240667961b77bf19c9d651db6c3030078d660d104e6b8e384dd324", - "bd0386ea28fb61ef7ba248b3482c4e15aff271ec429ffbdef8fae099c007d75f", - "f3c4c768ddbf5e2020a244c37962b87eb6c5bc9713ffe4a317ef0efdfac51cbe", - "649fc0a603c2af41ad37f504f609306f55eb21ded15eda72dcc89b32bbbcea0d", - "4809d7af4385c5ceb12bdf0099ecd0057265c2b969f90d08b297400a608f83de", - "2eead09d4d953cb5e9fb6026a084974da5685b9a01b8eabc56f6e67764854345", - "dcf41720198b2ece39dd9dd5b1700eb01f4cc9c30d30722e8784c27ca541d69e", - "60d136439b3c69e1d8ce12d306a07b1e0a9a766c1c543aaa16e89694155c1ce2", - "e3fd4beb3c8096981d6f5b042ea3b0e48105e504a674970a3bed43f52891ae28", - "729c90a9c3ecf02e8e206073f574a07826856a738762d30f965f707211b18299", - "50cd4f798bcd6953def7c899e8d44ff52bf76e44f702ca6ba156288f24227f5f", - "8ef1d8471bbe0d9c07611a1f3d6f8782c1d87b09b2c5edcfd7ab9a32e50f098c", - "bdbb94f58ad28dcbfdfc6229a3295abb38de04ae22f867d9b34dde8f4a45116d", - "0bcb9855cfd41c233a12c9e4539b83006bf315381349359bd07eb1a7c74c5b2b", - "dd2246f87c13d19fedee02c8541f10e18a4a0d1312cd5cc4c08618efc9bcd51e", - "77c625a2d28dd8bc529bf579852d84fbedcb44151c67ef867e71cc5e5fe25892", - "cb8d0fb50099da5159d76931dc336e0a1b99e94554f1b458c0948807274bc261", - "cc890d919d70b89f36d945fbe440cfb1bd64ee183a44b10844b3200ed366055a", - "bdf0004d9fc65bb1806501eed054dffaf92b8fb4d50205f41a7cac022d0e2ce3", - "2b9a7c79d96a79703a52209747f32a6c392275c98db9dd0c492d264ea631c0e8", - "51655eda99fb7c07dfd899f367f12b31d2138245930ae798deac7077a9fcd4b2", - "0dac2f6b2d8fdc7c937ecd2372c439a7b0181ac08f71d4ae3d93c7c0c94733d1", - "644693f961c1815050a140bf555a7f790c323a0b2df5dd03ff822083383c2f4a", - "7d1ba0a9e9d43629f97c69d88b769f34781658937aa972c3baaf33d73e4eb8bf", - "7f11b6372a8b846c45e2bcb6ff53121bfd6b41e1ea237ea48c64ee2c15bf6f45", - "f4b84719f97071c8835dadaa5dd3065cb9429bc6d5229e34b96960903e7357cc", - "6fbcf826b922953f8c1cb371ed16e01a57227af4ada1b020ef2e4ed3d8875c1b", - "357fcbea21f27f6aa45179625372957ff80f8f59e7895b1bc7141a6168d3b198", - "f06ca13f0e874ff6038848a2b3648c49e70016ee5df02a1548a390ff8f2f29c7", - "5681b542fc2fb4c665a4f42d394fe6901786b1108730c9d9b3e5aad231441d48", - "aa73b55913ae12a682237c9b8d19c1f151b4348c4a3bfdd19f04244c936004a5", - "78fe2feb20fe8dabf1eff972b2d5e532a7322c90ba8481102c55207b35280587", - "42e2fdf47e04279b91e230329c800427501b8cd5017c6e529ecdc38666bccc40", - "4e0bf0bbd99ebd8a4effa0521e9d6cc8df49e7291760042c8e55e2fadd68b919", - "36f7d7684577626bbbc2380b22fe42805d7e901c68754e5af02e960b35614c6e", - "c608f2de767931206a7624d3cd6675c704610ba67c86ee8002d68da55b73c7f9", - "c8d6059bdf910e01326369746e54587abb294c439b3abde77cec09dd4d4a37ba", - "1a40c1e6bbd292c3df94b45dedd8eb819212e277cec1ea1788c28f276783d8c6", - "bc41e780174c24a5bc1b59de7a0ed15278b4e4ffa7a2a75419e6ab098301a4c0", - "ad2ab5cdf995408ca1bc5064a931caa25fbe57ab856b5baf395a7238161bff2c", - "c9b211880b5a0f4c3c9e5664837773aed7ff3fd5cfebaf480da7b10a33661980", - "16d71cba7de4760145bad0053a54e054b8fcaac38f8d5275c242d2403da147b0", - "77facf018f39ba4dd6bde11c189872fcaef3eb21b54039f9beee613150c64ed8", - "a211a4b307681d8d3a8e53b2c6755d93d7a7f9cfae4ae1ebccace5fddb52b4d9", - "e2cb62381d418fa7bd8eceeb486b71733807e55473f910c72cbb44757091b935", - "b3cbf7232a624814241db45bffd73d616bb81b5002231a5c74d1694d27c3e34f", - "42242a8d0cd264b81657d5367ec049da6aacd7b9b5e147fb2b3e458f160dfeb2", - "b7bc8bf23c7264bb9f40a62c88b70f15190f7e02d56f0e808b38d865948a78dd", - "48fe50f73ddbf66dd9afe9d318a515f6b28db6c06fb127d67f2edb0c426bac30", - "f4427ea50c3ff2386d1b3aaedcc88501ed6275341b2ec59555964a82b84a9336", - "1c24ebb0ea3135c37994383baf1d8bdd7672aea40cb2b676d3f5305da1c7f287", - "a8bab044cb1b6593c31603b626eba286f74565b71821063c234d125715074119", - "67905e99ac6a94c7a49485f2d7a6acabe1d422c6028ab20094d339614e8e00cf", - "7e4619fc5cab28780f0866a08e3097f70a08f54c5a7c96fc0407ad96b0a9afac", - "db1ec96744e50132c2baee2dff25fe93dd3585f6aa903afdc00ebf77f5adcf1f", - "7729ce0cfe38deddab8afada9ce2c76882b6ac1186f2939377f6a3a4a57b40d6", - "008506a1a1d5e21a2e2eb500caebd5712133412b1dca9a0d167cddb83603b7c2", - "f6608cf8ced3975b7967fce353c1db5394c2178f017708b582d9869fcf80320f", - "daf23528dc7f02ec0180dcf7987604110eed03891d9e2e8b3881e50d4b696060", - "ea0967309d82a5d59494590b12d97fad23e879612a48f734342e2d3d5b0f50c9", - "19f7e533fc02da1506cb73a970151809d760e8b5083fc4edc2368d2ba06ef8ad", - "0561c6ed6eb792524bf1897645dfc81fd14471a8961f59bba509a7fa3a28f1f8", - "96791c2c3378fe3edf4faf0fef2ff3862627f1236643e69c2f7536154dc9ac97", - "fa40ecf295f5d4870f5341cd407ddfd050d15e299c7d1f2fa2a5ab43b8d23cfc", - "1b28c900d4f2f88077b3decd2846a08d8c13cd79c75c4ed8d871282b2c412233", - "df12a60f9b4786b8b2abcd44cf8dcd486207df906f39c2a4ea280aa9350a6e26", - "1a2ab5f71f4110f42805493e8c98cffa9ee80144a6c7855053a5f84f5ccbd310", - "64ffbee2f33b03794144afe64cce9f89d8f0485e855fb8f4ef42e84146e1e072", - "437f0298dd952b17e5df2c28493edf3b63c585398bb7a15aabc27e50c5e55fcb", - "3a84f0f0c6f9ce2db79f0439e771233f41d0903e7aa20396842fd99d7a87c7d1", - "3ce3856da580772299fe957d891c8e54b407f8f4f727919e27fe3258dc19bd3a", - "142ef9f2da96b1672b8d1a7291f4355217354765718cf2438151d965180fc2fa", - "91e662aac377375acb1b8248af11a5ea989b7fa31a30b326c306fca20b487207", - "64d0742143405a95596f029161028cae2d4ccb31cc281af83737675de6aa86a1", - "d502dd1b304c8cbcc75006f35d4d2247cfff419bb0f49558e5f84630eb8bcafc", - "98b3bfe59af57b5a3f634f68abe34e7318b925547da628ff95cfde29f3cf0c33", - "22f09a01eeddffaf7e89fb5340a0a9e84725559da8f5d04df4f74054e20e64ad", - "67655aa82ba4fd48ac3b8dfe5ce5931288881e8d87dffece15b88f76a8bb7ead", - "3f0dea1c1c873dbfde4c8e228233b19ed5708f505c4142bb707ee487d2265eb5", - "7a7a67c0d51ddc9908d46aa27ab42b487ad98137956713b478936fa567e26d51", - "d5c72b934b01a9c22d70ebd7ad54876e24a39d707013d88ab781689516d86a47", - "b279622f8432bf8762ef4bcd356d8a820782ca3ff6fac6ee1471c60fdeb3d2ed", - "fe2336838f986b74eb970e3ebd322d09885c8f6860b45ba9b9a53e618978e667", - "ff4d8570fd3bac3ab42ae9179838f01ec144443492a79af71a6f4d02506a8c9c", - "95683b210a11d88a6f228edef3166a6607df4643ae20c14e0e0d60352b89ca24", - "926894c87a97f4fa11d719bd4129bce39a1bb48012a9e85c5875f545239d6cdd", - "95711c4f6ee518b02718cd0ebd06bd669720f83732324a3c33ad7d77eeaa37cd", - "622b48bfb9d40d3db827393ddb80abfa274fadb7e08d56527629b74356ad8281", - "5b49610015649029b5abfeaa24b1b472fa61680c4107dff0f465ab94245ef7f0", - "5412f0754582af0d352413a3268aa544c57e6579076a17895140795fd0657143", - "b031ba2d7fb2e12b57ceb46e300beb5f56f90ea0eecd45a0ffa87acbfd30b75c", - "8640650124079e063ae11f442e20afe701cb5ccfdd5b88f220e873e028170b99", - "4676cb2f44f9976d03164b2c4726794ac7b0e4884611871b7f50f3f4fc05376a", - "25346fd12ccb16d7224451067adcef2316cd2fd81e13fbcbc88cade8de908030", - "7388173a75ab1fe73e7eae8a0256cd337235fab67875a7910f68505a9042a85b", - "8c9a9915d11896bd69c4a0d01fcf43948ff91085dea7f5a23e9c27b8ca013d54", - "0de04172835443308d3136f87358eb2de77fb593d41ba08fa94b853de569a2da", - "180330f63116eb179c3a0205b71fbc1918e728819a5a761b74872c366f2cb780", - "eb75d001016803a7e6cb640578e41fe5efa372f634b54d6793e9220f3775a558", - "55b819527f195439f5b8f1632efb5310dbce1a52be86eba010054e953b86a284", - "ac41cce0c61d6cb3f03cb2cd65ec682982cc8e4a17b13dd32bf1589517fe0b40", - "8147b11bb51bdb2d22593bb16c4de6e0a4ce424e444fa3b0cd379bb5316c4d3f", - "d2851e526fc7b8e4414c0c2dd4848b88a661faa5c970296f45268e85ffa6dbf7", - "a9b657d86c47a05f2c444320a028baf93bfff277d3be5f2af57011a66bf88cbc", - "d8925133b1cf82a889ae4583eed9ffd9acc0c9e2abeefa9ebb3da9c920f418a9", - "cd4c672a3a2f80f8e52df3643f373cbf7c9d815320ee7d4e3acefdf4d581d959", - "f7aebf3c5da68bd7ff64cea6a481ea8952989dff47c2ac84ffe3af287adcbbc4", - "fae7147da1eeb482065f0c70b8f4186919b583847ef1b5b1fff4f574b6dc2f3b", - "a586a044550a9f27bcc08a704c268680df4f6389489271a47076255c3b462639", - "461ea8f67ffafad0cdfea66a3c959e31101c317388aad3f101facae3f6ee2db2", - "7a72ba348e77eca30753ac11605a0d33680f071ac038c5dad6a99a3de41f2500", - "64e95af29d4f6c4847b205bb5db00feac44d7db93022c5e22992fff2185b9b6d", - "cbbdb4658f0d913e8e6b334cc43c2ef6c55a8e27c94a52df3035b4319c83356f", - "12c7fcc22ecf2052086ed20b379f89b6cfff155d1b5b4de58035eacf5b13fb53", - "c8545d24ba04d3dc7e907a0c29c1bf1899be86e57f044881ba1948bece4074cb", - "bd43bb2b68ed264700d187524eb43c648cadcfd7c6a64ea1e64c5e21eeb7a5c6", - "6bbab810fa5f60ff8f24dd4a480d4f429c273d05dc92fc7143e22d4c2e5c5b68", - "93c00e27d422f684ebc5546355448f33a70c74a06c547c8ae25ab92855cd5a0b", - "f2551b19b589e01b43fa5e1e46ef3dc600ee805865e1759e8365b3206fc51fa8", - "47fe9848d86b5b31f85d188092bebb7a08c87d58afa2307f6c65ed9dad758910", - "860bf1b63b8114ac4613a620f399dd304a1f959dace7467f3489d0ca01a2a7d5", - "8c8753412faa412199ce03b00e3e8224e35e94047c9ac277cca2ee5f598b42b4", - "09d436686758732afd34d1263f5470f89c435f7d9420efae3dc1d7b85a77b01e", - "01038732ecf900bfc4caffe075ad6bc13259a6ac42fc8092b5b268913c5e5072", - "fa1a0c46570c0fafcd5a594da3c19953ee56f41462c3107596cc8f1a706b5706", - "7d2d72f320c26dbf341d51765541182247e890f10a4fb0f1f44ce9073dafb63e", - "e7832ed14ec6526e603d158e8cf882536b18613f22228904721fb7c506dfafc4", - "e397ce9597996d9df7341b46d16c99a806ead027831fb1fc509f9f52320968a9", - "dac1ee02db8189f02d1911332b147043ce8728e8806d91ce1796a7ceb8ae5d8d", - "bd32b6ca9421fa55e7367548da84159497c8af8cf0cb3750da2fe8ae2dd69e8b", - "991cbcd912fae8b050246bd1e39a4e886eca2b3a24c12eb7185f43049673edd3", - "0fa6e5a351401302e203dcff83d0096648d717e1cae22d5d5e7e19bcd20681a9", - "84c619e7748a18e2bac6e50c0ad02c582469aadf04644f97e9d8f502c94fedef", - "770d62544e8f05edf89890ff683047c49d1009172ed48fc35c0cb641b576d672", - "425548a83c22554721c78b67423a15203c5e5f156f93bdd30feb80ec1199c888", - "0d4e09bf9f4ca8b6e087e1a55c39de570616df836863caea2c5550c17f36d423", - "0b5bf187b941675c8de7c3959677715f12ce4b27d581c018286f96e36a738967", - "9ab9543c3e7cfb23c0d2a8b9c07651ca400b5d865074d2db57af7c0c063a15bc", - "55dab6e977611fa88d6a5939a818aed65d3025e9e4c0889ab7f71e2d8493b704", - "e5bd023e4b4c3de94972de5efa6f9896f2066e0a7df330b35a1f26bca7459573", - "8fba91972687955c0424f582f924fd1ff6f918e04669d9d64583019911df13b1", - "974787c6ae44b9b2065b8910798f214fd8cc534401454ef530395cc51b316158", - "b7e4b10db381d11b9e6b3f346a716d041086af2b752242d45adcfb160b727f88", - "23f266454addf749fac805c8a753a32039cbba57656255d7f7f9e8602f37579f", - "fda5bbdd7c51fddcddeb1540475851e1e249dc0e047d95dc5c5ec92c2f7d729b", - "dd3a961abcb1a4c16eb88e2321b6989c5493d94927596711e8fb879405513ef6", - "51a6787cc26d23ebf9b023c453e1df208c759193e5b7be24e540cf168879a5e7", - "5c2359f1c2a18d7e198ef16f92a6fdc19a82e8884c3c2644d80388e57e7dcfec", - "e87d987076017524935e22d577a72726f98f2dd0c89c72447b0cd473b8ce354b", - "0bcc06a32d4b4b90a381703a443f3a92e6888a183e8d86a606de2fb30ed574f5", - "41056ad8adcd0bd9896215dd097c0c2d512d096722d2442d3deb3ae9e572c487", - "8a947d7a6eb27f9a86b4e09d879096dae1e306b7e1b2439a4bfa8a2d6db4557a", - "afeac7ac26ce9a89f4b20c9d78d228c0d5075096c54a755b7c6bc6e73c6d131e", - "51997839007dad7a4663315269f784afdff989fa861642ce4cf9f98f925098bc", - "246e4ac54619af51e34aa799d5fe673245b7eaeadda23ad154189bb12adbf204", - "19b17d5158a2b9b2d1ae835f98a009de8ac4ade821f9b188ab48c5d8840fb404", - "0804d90385ddba02e72dd93839c446598d511eeec38c5354ba595f793a6790d3", - "b183d37c3a0dafd8acca23cd5154beda243475b212d3ef07af444ca6f044199d", - "469b54a622c9ff78f197ff39191e29553b64284e6f85a74317f4070d54b0094a", - "a8837c61f896609877bba964738b83a46f8591b892db4f3ed7a425863bc932d7", - "6c8a78b40986068a34020d93bd35d7fc50cb54949408c3905bab9779c88ed8c2", - "cbba9b85285d8ac9e30e748d8ccf75187bf429e8113ea9a70be0d7af7e6e36d7", - "43bc39bc66f538a3745b2395d911dfe8f238a93a2f192157e6055e099e243c1e", - "f090004f844d3e26aeffcc072a6da1c829fb09ae2e50e5252e1975ad9327fbf1", - "5aa7ea8db3a3718960d4e35cac4cfbdd0d589a48f5e770c10dcbfc6b7263ecef", - "0e74322fd7d033b4c6009be1a72f8b98665630a849a56252102576c3adfa5d99", - "0007cad544d89d1d4361cdcbe4b228650b62331315f1a8ee331c3511dff91be3", - "a45a2f846b6e4cbc5e9d539fb11a5ddfdd2fd51c4b82a6fbc7b7216f62f460b3", - "312d2c991f07327364b6b262b9faa168fac98fccb3af8ff0808015291c7a3c39", - "f9a932c17cbba162b9c767af844e7dc95508767a053fa9e2ea48f710c65744c9", - "f39480d75f9c192e4f4caedcd51d343104ffdbaaa89e13c2ef7d9576888c3cd5", - "453057d163ce30630ec47e6ba55ce67997c4fbea9c148fd0dc8d5995bc82d1a5", - "e3c50704ef7e5ac4272b0c020660657d65841fdcefc235500735ef34a007ebf0", - "a92db66881b7414c6028630f4e20bd39ab4aead98e26d175d6d2d5470566e065", - "573ae81362b1cf31b5dd28288ee3cf661145da9ef5dbeec76356eef20d24d240", - "35222f328e2ed0ad647536464f9b3138d9d858d4cf9bc6edd4ec5bc0ce5e369c", - "3419d8cca909aec864c7392455c804c2f12d9958c29158199d86a1ec7112dcbb", - "b2ac5a690b378b7aa4324f26b54cdd911f0c7e4e997e4afe57cb875720bec60d", - "061984b1e079a085c6276741a452887d2946446043b3ef2fd4f3f3bbb2b47890", - "ce34a70905a92f78b3c3b37ba12cc53e458df6deb36e776142dfeacf854a7bf3", - "fb2519b641206ae7508be09ea023526f524a02c2ef674aa5456b85787c11de8e", - "b4f794366a572bb7aa49293bd6473cb443d26da2ab4de92f106c77f530a40474", - "a19e9a6806fa20f2c99555afaa054e39e8244826d5acdcd7e790eab6144073ce", - "de1159dbbd39ec2d440c4679d55d788a5219b564f10dca21bc925bde312e30b3", - "47df93a2a52bd0d1baccf55d87c0f8350bb1f8d994599402443f879d5a12405d", - "bc566f8b6b5b210ecdb7cf99812825bd1f4ac670fe5957acd6810122d0af808d", - "342c4fb2c928ed900dc20f707c6267e367bba2cf87e12e1357a9a4092176ca8f", - "a105431a470ead2d0c78bdc5282db9ef758f17aedcd6c575cb304d61dbe9ac3b", - "89197c416ebd60844c20cf4fd2409872789f64eb0fbd64901a80ecc3765b06f4", - "3915347d3a918ec9cf125efa2f271f7677ef3a7c5217c506e4a33135c1d6afb9", - "9f437743c1c236825811910c6f7c73c8772eda6814870293688c791655202935", - "beccb08fa424021f426172f26dfaa3e60c7ff2b380568fc219126bf8dffa47e4", - "24dbe2b01a968fe7771eb71681fb540a6b26e88c384f6598d2ca6a367a7d8f68", - "0cd65a6edc5fe3fa3423231d559dc0676f6017062c1beef30637bce199085572", - "289e715cbd9bdabc01b6175c38c283b2450efa62afd1e13f338dd98e9c74aa62", - "fca3117f3c15ea884201731f675d0d90813a673eaa14d4465e89436c10e53fd5", - "e92f1c7ed68f76b623becd1ac82f909d6e3d8d6a74dfc166e7bd74d4b4297cdb", - "c9e161146566051333338ad42094c49440866f2e0913a515324207584b45e296", - "c5ca33102f1400b3a630c9eed7a0eb2171d05dfc521fcf92e1ef7597b8f258a4", - "694fd738f24fd5ea734ad5710e0ebcc31377c0155b1e856aa9656e41692a93cd", - "4c2ec65b91e9a076769352d63e3aafb875c7ce93dcf70d52f6b6b0b21139484d", - "20c2dff101b8a968c7e930f0ecebd688c1b310466fa0a1d983139140bef8ac73", - "fe0b7e81ab9a965c30790f714b7cf7c0fd3633cae3ee2ffc94b6d11832eeb683", - "8d2f0aa14da4f9e2d9ca5636b1143522e8a63c068b85ea1dd3faa5d7a24c259f", - "8a8521a2e69b579a19d0febf722d7d4af081f9b29e3a6a1fc2f9bc2369e10440", - "02d16d85ee2daf1e59c08330f997cbf2a8084db86559f0cc8b86ba273a222dd4", - "d2d4ed964efe34620deeb2fb106f6b5c5b0a8e6f8a1f0dbe13595d674afb1a5b", - "d304be2c7c2dd2acf98b7cf27968d6fb98bc340d0667b5b4c6cb32f094a7a518", - "1c4a058cf92ed21e88b9dc1efdbc774a350aa3b35b6f74aa19fc9dc177709b70", - "48a67430d69a2d1c969f64c7af2a51746e1c38834aea1e639dc2190e668b08be", - "8e047a8290687ea389c39ff2d3c1d244ba7bd8b0b91bc49575917c53e45f442a", - "4f2b1de60190a592b7e35ae8d55ced5d6d771420e02f2c6545c1a81d1874cb59", - "6a7fd2d19bb15be9c765ec6ff7b791f45ac04fed8bcef40a50ae8153f487435f", - "0c199a3910f7245f8f293b17f5a4d30b898c5228476618adcacf4ed51f83ec16", - "9094f5efb1f4ba9de20b7eb357ad6807dd08015265e87bba87ab4f3f34cf6a00", - "ec58a3d54d39558289d27d482882528101255bd966a15820427fb865983feedf", - "458dfc045ac4a10cd97cb21f4276f49636a1db8419c53be4d50fbcf71b5c39c8", - "2a2475856cef9370319fbdc2667bef0765d29efd5d959b5ae1bdc95acd29233b", - "513ef0b499f09227c0174eebc6ee94c1ec1374ce0cee4613559d64299a4d48a4", - "b978152d3d438f8c760f20dc83fa98f4fa8cde8fc17bec7bede4c1bbe62e928d", - "69fb14e8d78abdcfae02018ed669cdfc7fdd6f0c41128d68cdcc0117ca7c32f0", - "1d59e7e97047032e9b0e24f7253e74acf7f95b37f01cc5ef00b889567a074c20", - "85afdd86138d4a2bf2dfe81c44f2979ea4a0e2b85ff68c198af92475b3a2eeb8", - "af91b711eb218ebf7dfb5adb9134b026f042919759e54d0edbf0703d0c0ce9b9", - "024c64e6d100a32adf3a9d56834ffa85e97fb1f94771b8b4bb90e6c8d9776a25", - "951a6b36bfc35669cfe6c0e5b1821f0b302a07873e71e1f15b24eb0db28acb03", - "7b52cf9b46909a12c44b44dc5f6a23ef39fc59b2f775de5fa7ce329be476296b", - "b3dc6cf42e53f1cfff726d821c12b2801421a2fd237d49995a8300a91e92d1b8", - "cf952a50ebf17795c403c520af574685b09280c3b731c4ec6a6c5114f9cba889", - "42ff5cf5da7dc19d1ca792aeea3ce8433dc8a622791d8cd1ee9812419cc1ef4e", - "1f49e09172ab1ecba29cbf5b96268e83f1cb706cae4e1373cbbbab31841391ea", - "b9145c538d6eeedce04c6704c2e9121ac07657323cb109db519dffd2240c6de1", - "b4b97880b78236475e6442e1e4104361f62d2c25c3ca7e5a27c7ea6a813bf960", - "b2c2b2e8d76bd668d07a14a419fdf723ee4dd8190f6d4404878781d7f4d331e9", - "f8a524e23d24df07382a56d57c100eb89134d19bc87b32cb0d12f1b67fe5957e", - "b36080be78f2c9d728b81d5da1d1c89ceb7ad113586b407ee00ceca88fafc156", - "5f914b84bf392a207db15801492fcafcd8a702e89349fa8c33c8914d4f2c13ab", - "4125f4f29312006d1c44b2b2543bfbc25f4f11dcfd9cde00eb7bb4ce0bb60acc", - "d9d878a3a7357ae7dd57d356dfc3eb107373345abbcce6c5157ea3bbd363167d", - "5ce2ab2e523a36adbcb30bdf8e45b92bd11094d6b9992f9c7548fe8d11be2b84", - "509be4c1615b9d1655b52ea6d6d9dfd7f55528f65d893dd4a0a3798c4922fa5b", - "f8553ab47b55273c00061303ca680a320bbf71dabe6246895d980a4b79ad787c", - "39ede92681fbac26b067aa5f91b58927c20d99aa12a244a5d198624ae503ed58", - "101a399b28d389b45d961fae4b832675c65e8e49e54dc3413e4ceda0052f47d1", - "4c6aaab5c2f7d9c6392c9637c20fe618a4ebbe8c57cb300c082556eebb8a2c33", - "5d15673bed471443e55e3c0075bb474cb936c0e1ae71bf1e3f55a26fbc264e57", - "57054f8c7400357b4d6a53447be375af551491de09dfd0986aeb9dcf6c42235e", - "90baf39c1b6ca83dda7ce806075408fbeb36ce46442bca08086f7297c8c4cb1f", - "94490cb0db06153bc2466278e1adc4d5ebd710175d0ab6f78734ebef2aacf457", - "eb35696428a79c1b332be23f72bc6cfcf05cba0f3d032acf9c0d7f59e824771e", - "83acb9bbd44bcb4bfc44bd72a4bad6517ea9f670f73f288884a86a13f7383874", - "fa135fdca2ea90148ace2f79693c17662309dde1e6ce3378c5330d27e276d7d6", - "d062e1cfed330e8a46c3ba85ec99d7fe98a294878472d2c7fe7a35055d0c6c84", - "50cd2d72265bbe4c1a753a0ed0b12f77264b7209ef2b4645979cef3692e7b911", - "3aed77479f47d0392923dab8b204e36cc69ff49ff433da242c79676ada38cbda", - "0047486258a7010c2ff11f5ad0e66195e27f3faa4087abbc61e5d4e8966fcb49", - "6023a38262b9243474c03b7602f9775b3ecc01be44bc6abb6454cf4df615353e", - "0b2667c162585b12baed903ce8f93d693d38faeb6e234d24fd3b7d8dcbf41b0b", - "4e35beb305b652a178d02b438c00fc693a31ddcfda0a48d4cc48be9e75d8ca5a", - "d0e65994a84d1b22cc32b98f7fdc10f0ee3546ad97ef6373b4b115e8c2152114", - "34e161c5ef17564777bbf8928201a32d7f00f368d97db257b9b91da809b8efac", - "f46f45f3b7742cf005541d08fb10d529adb4258fcb688eab3e9b6a497b696366", - "cd9fa98fcadd58a299916a6e4125b69e0074f5a1070ad207202f45de9fb6c038", - "4019f9a19e239e4a97754ebfa52597225c8ccd24de8f7188a4d9c51e71e8195c", - "863e1208a6ab0aa2b9deb79fd2732123cf7141355379c58ecdca37bdd8231186", - "bab9b3c73d636aebb705caac3518af942ae34e11268e434c13558197e013d518", - "ead481f2cef3ff37d0c62e71ac1ec1181bb77175fa4623f0a0411721a8df6d33", - "d8efd7b96e06aeed91e7e47370b947705e5370a61b6bc42b3e40b41d114f231d", - "d90bf4f24e731cca79bda6fc86a7407965e3707e24d83bdbdf427e906eba2b3b", - "2ed0100a941727782daae2adc8276917dcbe8d7f2f31f6332a58f91722a78c47", - "f85686276e17e369edcf712d718477b2c9e51270ecf6055bdb2765a9e5a38bdb", - "4c14b7ff618690a1d0cadaebf3ba5bb454337e4d8006446cc22a131c59d699da", - "16b091e1352dd0c67e41fd10d2499e7f00dc24ed8a0477546b4fbe5cdf787717", - "defa74c549c62fe995468aed7c4909d2ceca89efa12c590410851f47f168ae0b", - "811f34d5884048abced7fe885bd177e11a4d13a23f10c85b9d04ca5caff4f0c1", - "b68476067a4f3e95f9b84d5a3631c366be75fd325f31a38637473238a2e5c47f", - "0adf4ec4e6ad988469138b3faed5d4f1c6a7c1b824795411e9537af82fb64dc2", - "030e578eb89e2284503461be30cd96d2521552642b85dd8f026c129ff6a2455d", - "b53a9e2147fbe39d05d46affdf967d2530dff24cf63f5837208c54fb7ee82cec", - "d8be46fd1c5c18824b681a3c46ff969d8e039e5dfb5864677016f066b2982cbe", - "d8ec0ca4e9d85885100fb2ca247db6ec668ee4e39098c2fd1d2cbb294c90ce6b", - "94903804f43f1dd53f8efe26851591e5a3193ef7a8c5f48eb2fdc2bae43e39fd", - "d4f26991d4fa2359ccc580a27135d355890ebd906f3ec711100200d61e444f48", - "744e5e08bd2054ec503f585bd91bcd641082cb4717d9449e1345e68aea85b1ad", - "85881b81c843caa2926aa11421678b1ecfa9db92bd759a90f0a305fb31f981ba", - "90711c34caf74ea58ad4630dd54737c79070ffa3b239ad154e416bb92c360042", - "cc882644a4bf6d9fa63d72f0bf2a47214839b4e7caa40d308b17fedddbc5baf5", - "1879d1dc479083d2825df07c9ab60d49ad96a4a7e3c68fd4784d1d75ad7c1937", - "8b55e9dcf8b008a6d27b8932592fe7bc193c999117fad81d6d8b70dbedd82b6b", - "7651c69bb2e9e34e20fa6358ec32aa34de243b81222f3b59b7edba2f9b2d2023", - "0e6b9a0b64e7ccc31e2cedc5af25e2ec34a9ac995eb5437ae27149f839f30c91", - "4f728a6349d1d857d36751709fbf5b1769e80ca3b27a329ced5a8228547dfd47", - "6157396acff102f1968d0fc68d7b8c3e9050f35522754cde0f788f40f0b326fd", - "b4f1f514381b0830dbdef955a55ad18f443763af49fc1481637d14ff42924f87", - "b634a9faf0ea365602de0410f372deda4765635663773fc0486b73e32da54b3a", - "ce016986c66b3b91fbbbec0cc25a8f868d059ecd22a79c59c7513691d84c0a58", - "5bfd215163cfb63cb39a3a562ac0753faa157011b968585fd86d945c7e955147", - "06c6567a12bc9d4fb2a2d4d4c97034be6bdfb531d69cd41284f13be363b59608", - "98ce4f6c36d80682d22069a03c60add84ec8def4d5f1d094ca2ece990de0fec7", - "e74d54a7687210f19df0e5783d894a7042dd76e6a6cac206a68e10ff918c44c1", - "85217573232677516ee3cfc5d2ef0500367cc27a08dfa4a269a64b9a77953de3", - "0d9587635704defbacebab0277f10a09c1c9793b590f1f8ece74ba25900d7062", - "92abe646baa884703e13f91a74dde06efb5aca4eec35e1313fa9b8ea2ff96192", - "c34833a32a17205e95a1d36e582a9d7645c021efafe70387ed2aaac29328fb7d", - "80bfe77278dc78fb83c1d5c88eb309ceea846ee07f225df6f1b6e720d4a4cf24", - "9c5725a03a54e3ed4a60c070a650e83afe6c33aac855e0beda8df1d71b618906", - "538fe1bb96efb19decc7fe37128bfeda5a20434dd6d78afc72311c235675a895", - "6ec2f2d7c1ae81b2cb06db2ba89f6be5158214a4673173dbf95689947b675d39", - "4637cf3bb3c8018c8ccbef7fcf93626fcb08ff36f571f56cb2cbeb3fa436d945", - "e9751d7a3530a53f83caf60944efca52cccb7cfec4d4164ad2d2a6bc574cff66", - "eced548e9dfcdef1cc53dc4e3525a85fa9aa5b8e5ea3b87b06d3bc9ed9c30011", - "cc103168b01d0792bd6ae244970a91e8b4bb2810fd71a22bfd3481cb4fc5ab5c", - "5bf6963fb38ac92206ee719937ff0c828c9110b2c4a72cee23cddf35ac6809ca", - "014066fc13b5717cbbb9188b2ee2545efa68e7f70672a13fcaf5e6a116b69e56", - "3d8c390d4859d7a63700b9f4f8a442b5a69fc331f98f42f8b8b048a4649a6b5b", - "510c180d917921989aae5e5371aa7c73985d9d128515aed2dba0d946530e7abb", - "d9b6483d0104bf38f1cb170553849aa349b16075feabb1c4d077dd5cd4efe7a8", - "2ad8588d46e4a65ea9eef92a994cffa91898413a460d8fc76355b124a884eb7d", - "3e3d110323ca5b84cffd7c3e9a47ce895a00c9da80f28228d2192a6d6920151e", - "f52dbfacc598b0c04100a7e91192ea362c314bb30dc67de8cf90340eb503273e", - "643ac707e2e92b3ca9bf8743de847c63b1a1f362bd40f11bfd8398faa3350d66", - "cbd7bbd247825ea70bd132f70c5dc913ef97541e49ac336eb81eae224836e5c6", - "426f801c6d5cba39b24c28215a84a2a3c7556d0e01469b2166c33da534617b01", - "9bb268c2c97fd46296aa1f384263908e5dd26f8243279d8913a10cc4a1d87f2f", - "5d351fa05fcfd51ad83e7a43c89fd3d5cfeb06aaeba7c1e811f3578197a6f277", - "0849f6b983e22b1bf86047f10a9b9329790005bed3f3bd40695deae61811ee09", - "243904ab6475912af84f5d040476e7477b30c27972b3208db9bb6c0058c15732", - "cae410e454157e1e2bc53ca3f48b3594b088ca15b2ece76975423f0c617c552d", - "e6ad4bc995fba91cdf8d35bd9f2b7e83f822df623a94dcbd18942ecd408a412a", - "c29d4b60029ed300d63adff796250258646faaa70ef4e1d65b52b11aed0bd030", - "6115e99d92aabede4dc31d977988de3411580b0ffe68ac539d60da63927b659a", - "3b3ec4f57c391cbfa1fae0a28908602b92dd6cb256d15c1bb175c3e36ecc8883", - "e6b12b3c125a2035110fd38a745b49b83eee67fb9f2601e58c949d62d52d4c27", - "8bb94221c6a053ce41dab316a8d2c5914beef1cccb56a7252153e082d5cd097d", - "d53f98d0d661ce53a89a0f3a5ea5c0d7c9c207809467abba1017ed53abfb6212", - "8ed93b223122700d63c66145538953f203a138c809d67097a157ab181a9aab99", - "398676fdd0d7cb5ce17980b76393f6d26a91109e7ade972d3c2888838755b390", - "0b7de63f2d554bc3fec7bebc0db7851bd20447a1f8d8a7acd0e7a48997a54872", - "69e9593693bd3f1658666d697e72fc2e7538987ccfa7546e567d2df8aff0e94b", - "d20361a6aeee941e7f7566dbdd944166e24fa4e8cc8b63c5045a1232809c9430", - "fa909193a026a79940bfbff5191284740184ab13f1d135e71708f7f91e0634c6", - "9cc73d584238ad07a38e4a08022d18514532d8033186eaecd10f570d3f3171e4", - "e4139f623af3c7f75adfe3af050a5860c09f046d7644e0be02c4a6594f864dbc", - "a86c6e8458691f61a868a61a4b61f3e1bed2cec7656e2c28d941bdd1196e3636", - "f7a584ee5e33eb4853378d84337d890012104dc535aec6f9374f120c278e8802", - "2ae18f642474e1ecebb86f1836a80bf5f5eecb1036803445a677e2197d8e6d8e", - "513b33e5d2ee55d7d3102320eb5b59651cecea12b1c58c739f1dbdb93f7e4bc3", - "ba4426d70267caa560d83abef6061e1904d038215ecec0100d906904872af280", - "74efe46ca8c5d191322b018a616f981eded9b8cf86e8370c2494533331cbbed1", - "659870a12bf41f551ef95330a312be60d4567f047db74420fc24e6ed69b26ee6", - "62e7b908c58153ffabd482911d56276c4763547efb87ff75793759e591cb4876", - "3686501124d18a41fc1335915695e3f87eb2b45e880268c4ece0a2b504036405", - "e2ced8e93005a0e8b977ecd9d6b368e191eea42a743c2aacde46e1f927af8f2e", - "74e5e82907d59c8fabd7e59f4b702e0569c9ae9788685e98ea2cc54bed2be91b", - "372e608573f7aa80a59013b10461b4825fff0e4f68ce9aea486b0d60c201e961", - "db767c748acf857d4daa53c4eef98f4d849c8a0b7d4a9a9c32b948ecde839f81", - "f8abcc76ad3a8df346b8a6ba2fe28d9f60a99d6a40fde77043e0bda91cc3783b", - "171c19dd6d5666002657f510cad09ea50043553e45ecff8f0192a5a88ab78684", - "f6402830cf6c5aedbce46ed99dc22b520edd731ebde4bb05c1feb2a350cb3e0c", - "5b3cc52ad5325a9d1220f99b384554173f62d82f5ad61361f9c0c348c238315a", - "94bad5c31c8a0eeea51b127f19bf3f250c373e3b1693389beecbb13b4eb4a3fc", - "b97f1b2051b1e8988372a6836d6a69be0affa65d1e0ad8511bd0d8a52d97b7d1", - "19b50ae528cb561eeb39aae9f3fbfdf08c54d29bc29cceed380fbccc8fc8109a", - "490a533b8a1e4b78c6a64d51c9cbe7f118b5dfc851551576e6a64148b53c3cde", - "a339c3df577e29bfe30d0acefdf3bbcb78ef5f3d33764ffaaab11541af33a3f1", - "ba34344e81de08f6d5ed35846b74cd4f7cf71699e2cef66453783c46ad1527da", - "3f502a1ced873f5107c15ff604857c70d2af79e4cdb8615af4ac605a29ef3f66", - "b48a7317e5ab43061ae49e15311c74a5e31a135ecabd8f4dfe23b96ed1f769a0", - "527c5c5a01613499c814d9eec147a520ea6ea7518c4432f8ce2d9048839af679", - "f4fd2fc75e6880f42f136438b295a29c89525c27ac9ce4b9d02cc26622b657d4", - "864ac3b67c25807c11e4888809bf0b0893c228b0e1d2c2d134bccd000b3144ec", - "e6cf5dfde2cff74ccdd38ac3df8a33442c7f70f846ccdcc3ae61eb39671779bf", - "1675cbb11aeed409a6931fd2c23071ad96dc160b5d546298ce62e448359cbe26", - "b981111c75a8da353f76eb6b0ecb656842e79bb7c43f54fba2d242aed133dd64", - "e082e8a1c3aa7d8d2506af1a29871d953d11302e4be14aad0d318fec80a36c11", - "b0ce249564fe682330d762893da2ad01d3d4629475dd774204115da3f2d9d43a", - "65d5b503f33c603d1cd0a746fe2365b87f7de1ca82f4968d7c261fa047ad4acb", - "3fc0e6cde1e0b5b75dfbb619a00346ab58f8b097a9e1bbd3a96aa3b1360d9130", - "7298eb28b1915a23f04654535e85279313c3eda7c71c65dd1303775f5064ebe0", - "fa7fa6234fb2cb7711cdddf264f210cdf53fc501c5741431049f3ae06fee9b49", - "493003feb99913c4f229f8b66de7fe07f68585c6cf23b16540f26785a01e9fce", - "671e78b8065a5316d53661669863f61f2a188c39015ddd1fc65315d0bd1da514", - "a2a9068a524b3f30953a95a90dc200b4cde023037daf077c944981f21225584a", - "3f6ea55577b968f204ce33d016681742b3b82c6faed83a9e1a83deedeed8fc80", - "e575b4d6c847172bdec4616818c5a1b91027cbea92abc83a1d479439fff84db4", - "d115c1d85725db8e8837c946efc07a1117b4a14ffe762334092ff81b65a239d0", - "de4cca014e807885eaf128ce4cc760d2cd5846a6a62a8e2347b04a547e3f2053", - "edbfbde2ed3664afdac264b51036ed3955a042c8403d32d427ca08dd981e59ed", - "6e71672c0ed39cdb561c4be59d04a9b8173c8ad3ff531c8d08fd5b3978372ba1", - "7b19b20a93461d594e1a34b734d7d95a00e93c9e8f27c774e4bcdb37e58d8747", - "ac7a78e136c186966e8685d1280fd986840239e9c4980d41cfb137bc1b24ce50", - "aefede3a97ef47e4d53fed68c0a90b1c8ed42a0bad5d265c9011289515a75d80", - "5891ede78f1518af7793c7c2861cd363f0157b2fad2f024871deec9fda788b38", - "ff13bd6e05315e26f8ce9f0e9170481c39f9df94ace7d1af2e9378c9a968980d", - "811d31f57476e4e280c3c2ed407a067cceffa1bfed405975deea89a82cd067ab", - "d10abfe9b238ad3fc821d9d953801ce77689ebdf843d18583c6ae5f92874cdc9", - "5f7a5cb357588762381d97a47683ff74b53dbceb0c80407a958a6e59c59f4deb", - "c91485ba4332d38664f84f6d20e8d1f471b532b6b99a7f6727e3c593de0243e6", - "fbe87a6120b42965fe0201d2595b645120771564df046323ac1182f016294520", - "b7f559ac23620936443cef800516ba99a1893270857da0606b75028b03d2973b", - "65172a41ac76336d9c5342d85dc226c5b81a1f8fdc7b26430592dfddd143914d", - "2054776c7ab21f23cadec6c018e81a2290896bc00e7732431cd30f4c341800b2", - "bc61fe3b909b0381fff91b1d733a939695d6309af77ca94d28756e4ec4d513ed", - "ad33010f5920f43e68fb828d6f6b51bb58c399367336766038654ee98ae5eee6", - "2073bdd03a1c39d08d8adf1ea164469a320499b94e8bce3bdb16f5f796b2de9b", - "19f9119867dc667387a45ed888d45818ca662ace701e522f43fd827aa1a065a3", - "980a007b0171e66ecb629f8300160140cf60951b9d4f4c2563922799fb1d54b2", - "0bd9a6dedff354b162affa2dd707a1e28ce5b45b7852b3214ae117e8b2c33154", - "2930241cb65114b0b2f74d82fdeeaadacd1dca21f820f4c2dff03315d213159a", - "9060d18dc4c159f45f31e050498c1cd945d2da39c29d82a25f5bcf3b13720fc7", - "729188327d6cfa32128b6806eba6706835044e6bf1db4f6ce234376e83b7738c", - "eadce46ca2bc5545774a75fda15510eb8adfb36d6b4b60a97f9649b6daa7d574", - "23440429f038d0877308c68a1944dcc1c9c457ae26c7354c33de16f58e1af759", - "c8cfac6f8d43dbec0437685ed318e17f6bcd2e2ea099a4c2cba8bc596abfb95d", - "10fd07a7617b9f33e57bdb653341d7adafb4a43de0d37031537513bf773ad554", - "5487e830c8e6781b8d838273ce7240486f8a3db4a88c2f933547409294b391ac", - "096cfcdc1522beb810d8eb01add6fd80fcb797f8225d1408fc1fb7ece3ebff13", - "d1fdc7f035fc91c1a983aec31c53bd7a4d68c1a047a1d8a40983d091b43ac905", - "75cd7adcf1ae8130df0b95b12c02d377aff8421d5f743b2b348fd114919ca824", - "c057b5470975040c9ca01f2fcad247092053fc933acb7594f4ff1b705a04c62e", - "ed8599fd6bc9f4a0399fca9c477660ee7de575b4f0848d6554998d5ab364bfff", - "720bf98e7bd1fbdd3545c9da43b33f3adf9b3e3c4ad3cf3c9e4f0d8f4610ad1f", - "c8ab16a48f4ce6300addbe0fb2f4ca4aec75fc35656905c5421e68eec2b07576", - "6f8b90bb0f230b5def6584a90c58374285dcf04033b5660a12f4fb1786fa3f28", - "c10a16447eeffd70bfcc54ec6f79f91730d34a7d6cf672ff959e775aa988c1e2", - "13142bc97a6e17745e9ce1e12e415b3b86e8d3e273f14b3d937f78bbf339007b", - "80044fa614b8383b8f8ac68561c5bc292d2b48a18928b583eea9af6b88e6f510", - "5a5c1d28a3fe88353a2be9bb59811964500f779bf58d45aa20d36a0d2c23c9f3", - "271b66ef4e516786bad630541df105b219eb0c5d8da6ebfbb3a5b29bd3ed51d7", - "5df1b7917d0b6e83930d1864f89ea8c375742c7f8ca3d1e060ecb786a35952bb", - "0dd033a7a206e23ff9cab58e69c02b3b6da27b64ab6b0e58289e8f988ddd9ba9", - "3ba914701518c9716598958efaf91221aef6612f78ee18e1ac97710308119a7c", - "b54cd3833f66cfb0e4fa9bdb898798072627dd0ce4e3b3d40969575790d56afd", - "3f6515e1099ee99052d86fa618e56034d67fdafc0be781c7216bc725ffa80ef0", - "f000d293d81fe872260ba68047b576679b60fd8e1353525bb67c538c29e5424e", - "f8f8709b7e13c15163d31f20f2d794c85c08d572d67341cce97909b2e2560e8f", - "25997d2a4c0699708e7f1562cd37df0a49494e9c89cc026568a1888314865cb6", - "d541d86e293e9c804687095a88db1cf25e09227d8dee210409bdf48c2940fbd5", - "8563613427d66facad2568884090c9394fad209a0010f0999feff739f3dcea14", - "00009835e5e23ecd029c036a3f2df25bf9564cca53fe543f10edbce97c010b5b", - "01317b6e93e4c6c335c828eecd4d785e71c67070c219be21c1a9536cbef7488a", - "805e85f50248753f870aa0e6dd40259c8821477170bc2a73becefd92b31d1188", - "9661f9d5624e0d592a1283f604c2a7520b59e75f8f3e37450fa832827cba9fc2", - "45ded2719705817d2d8a7077eabc90fdc1fa009f88ee633914eba82334dd9484", - "4659deecaf9498a1e83153e69bb44b35ba46ae4756ea28e8f26c23b4e99e5527", - "40d01594f3dc29ff8ed7ced9f2e38fa868b30d5644464c804c043f8c27fe5966", - "5c0ddda14bd9402fb050f475735e5956d294057f82dbd878de08e59536ee0471", - "393da61dee691c68f2945424b34669553fdae5c82bb3a23660c3a60ab7fbc8c2", - "888e1c8c3eeec34e82f82c34a800e409948db3f3069daf4ef9f7c54c9ced3221", - "dc862392d0afcfa3c01804e737453ea1e413b0811ea1d1ba26cdaa9dc5c305e7", - "0b9eba2cd85bf95890299cbdce89f0bf6ca8bfff6471a0cddf8395b2fa44c82a", - "6d0e8b86613d6113aa0131db245a2b3b6ffb9f9934f826685c3af622881b792e", - "fabff01a16fc2bd871f308bec58fd22d64e60832837c53fb1d4de460df3d1211", - "a2477059818243fc9e9c81182542c813f88e179e63f79a04382b9823526043cc", - "7b96e79f0ec9b5ae51a6fb2bb3994adb4951ebeabb6d8f6352220bf0cc96d3d2", - "0f56c431245b121f5ae8bf6432d021910391c1a5e59edf5fb8540eff1e8a8baa", - "93611849e1d1225fa706aec4ea23632bb9d19e27f57ef19cdcf34e957418ada4", - "ec2447485726d1149d000f49570a5145eb05858f86c2cf7be553c372ee6337fe", - "2cd26f2521168d48e8c92537db3c62a20bd1640da5c87baac9e2d84e07ccafab", - "de919ac0083d9da8b763433344b94c94f75707b0a649ef001b3d2da98dd3cc32", - "1735ddbba3bff969d5c44436841cf5ed50078bd36f29258932e641f78cbd818b", - "6f2556600b3735422e453b19220b96045b73ed8deed05b713b42c6bc6a31df7b", - "bac6447848b3d2e2c595d47477bbadc5943d6b64ddc6370a537f43bae902e06b", - "7a9d2de0cf9ffcef214c192e0d0c54c36afe7c66553c2ee63ac86abe1525f520", - "5af82fd4975b6350dafd944197aa26d4034b1836741123edc61b7dc5a5253aeb", - "347524903e1f18d3925128350e13081d07325772e9aee924e9c59c9aa36f6f65", - "e46d03dfd32648c91f77619b98bf442f596f308e3f1e1aec05d764ab7ddebe05", - "9d8a7946f5df79fc0ea0e65a2df83eff81f75d8250affd9a88effa4a03bbf9c1", - "7ac7eef6b01cf8826bd89ac0c4ecbdd384e363994e0937631ae281d2ad794a56", - "263fd81888fe8cba32616e01d3b0d405ea5ceabc6df9f0739b02bcacb642f43e", - "aed938a91f1d8bef0e329cfdaab787a876fe452b62bf080ef1193c052d1b5769", - "9ca8bf8d9e2a31661f132f56428d6a4a57553e20447b3556bd7bcc6c1e60d1d9", - "783db27373b4599b9c80f3ae4ba879bdc3144e437e7f1806eddc95a2185a7094", - "7feda3fe132e452681495e1dcdea64291f959e1fadfd922f106ce8a14136647f", - "8b99e214b3fe3a3022cd431737c0500955cbf9885a19c77353f62d6bd484133d", - "d8fcac941fcd28f6d2c27998b3b45cdcd6301338c67c2b090c34408382353906", - "ec44d0210b23414772dd77cb370719d0fad57f950bc7388070bd615fcefba22a", - "0023c5ac799f93ee175cb5f8dd8f8c963fac8e96db50db417d2766e2e9487cfd", - "bbc7fd6439d721d088abf3e274fbf5a037c2e2c27b5e96b56253058b31118a0c", - "454754561a684c5a507ca65023717f4f2664a2a47d6df64ae05ef6104b065589", - "efb14ddf231905b6e2076ff3fbcefaabfb67624d67c4eb5e8da6454919193f75", - "46902fbe2f0e430e26f2c471aa891337ee084374461e8a07d1dea51dd7b74fa1", - "b897b8dc0f4d83f7a76cd07eafb21fb0a4c88bbc5752edfed2c66f43aa71ffb0", - "ac3b5eba6825dcd6d0bd598ebf13abf99930d6e9c8018e946dda9fae308307f1", - "28c01c3b8f5437ad602cf2bf45eda2f228ac38b91d8e7d73d5f4a425554d8777", - "bd7305d8826e7f4b22e51b0d89aebcb96a03e96bddca868ac028fbd6b238b071", - "699bd5338ddbd4c311b223ff5c0696534091839584a67c0a8e8f491b825f9fb4", - "8495b94e033dce373b3795e985635868530e01adc55934ef99dcbab4b3f02aa5", - "e5146db524f1c684005c234199a426fed36ae45b7637816d756d7c38a2680b15", - "2fa0b6ba5c8003d0319b1ed0a6022308c739f03d4a9aee9cfc10ab24efbad256", - "ec5607d4183fb07aeca7a7c4b6dcc27ec4d28c13b06c99f47df877acc0c68cf1", - "199fd22b91ad400e0a78df4475d5d037859ec8a62149a26f65f29110d6a80cbe", - "847fb32c853a710264ea607e3d8345d4d64e090ce148e6fb52fc16b6825e540e", - "7786d31a3227ef0ace77e893b9599a41de6b4aadc5dd5a77d97789f5a1d750c1", - "48e374f81899dcf21d690ca9a069efa6578e1581f924404b54247f9cf01e41d9", - "ab2e096a473462d769a82acd6d1fa7b882c834e83cf092ca43187fb9d5405b01", - "837606eb8c3b6f0707533d63469db552f2890c2cd98d72c0bdcda4b2af8c99d7", - "707bc3bc9e675c74a6faa907527e8e3001abeeebc0fe88af3fbb5e4d0b726233", - "2a4bb828158833da3405e612b694365bb81026adb4d7b2d057903a5773007050", - "cd0dace33d1a0db579dbe28a5cde210443fea702cb556a66af6c7799b9b9f8da", - "2c985145ff37dd134fa272b493b1cd48258fea014e7a5e1655e35ce0080d5453", - "ae96f9e3abfda04fea08057d5d10acf367239ffcb771242bc633ee19f4de43f1", - "8099e1c292e5a78935e1cc086eaf7e992fa1e2d0077752a164ffe3bed28182bb", - "8c7231a1c48596966c02bdcdeeed2f1bc62b2b98beed5e1b203d7f667f0171a2", - "5c08240b898d0fe714009f79b8ac00429ed815556223de56af32fb645fe9686e", - "806f38c7fd37dd9dc748d6306a05f34cadd451c4a60c0167d16cb831e0aa1e9f", - "dfd2a2339c50cf5b17eaed76d7c419f8b54ad01dfd185715f1774501e09c5db8", - "3ab67da9c4461f7dbdf08e1ddfab773522aa4090a1c33e5a0345a3ac97576ac2", - "53ef21c71f4ea0a082a3f3da8a05e31451f26d54ef56967a559361c58591c43e", - "4a623a2ea6545b9572f6cd49cc4f6b783e5e8821fdefe84829cfd653dc371ece", - "2498532652d16f8f1b552debc9183ea97849397404d520b1045da7aa61e770cf", - "4b78b68bd886d5bbd409c3e6c0c61a81f5a3f315547c7748e2c40a97b361cb23", - "8654d05414998992753d07faa18d8e0809aedc0a8403af2331b403fbc0a30fd7", - "e4039648d879645f07330f79befbf8e97d81a21672ea8831759aa4e07f187eb4", - "12e9b556ae885041f1bdd432cb5b7ad4e87b18b2477b8cfe7496e3f1fcb5ded1", - "3906dc0602fbcbc296d096b74eda53baf914f37db3eab1ed4f641b0db33ac40b", - "a567b0ecbbc903f8b5b175f938e5cbf00d60ec9865d97bd453369c065156a170", - "47dab9d3f4df471311bd693b341985f401166300102f3f5657fa5bafa39d813b", - "f02577e91f1c5f3999349da9fc0973df90590491257ecedf7554ce0242be5976", - "829c3346b65380926f7de4bf9e031782e44b520e9004b2151109cc2bb7e10baf", - "0fb60c87c634073dfc534c1a514e42751703e0a0c9718c3804546fec2ecc578f", - "944993c6ab23a1c7606b04f90c76ae7f0241ce5afce973f95048f9e223226368", - "8007f2156775d114992167f18e747f3462c99bc419859f5b7c6797666555f6bb", - "ef110d0b6ccc07a711af79be21a77e8bff35f7fd9adc442b81b07016410ac6e4", - "1f3f4242dd16a1b3f03909cbfbe8b49ed1576a88a9a5dc8c898cefcb1545271d", - "e9eaa6c8ea134587d4a900db4a5cf2132b78901dba3223ce94cccb8003273dba", - "d66972334d54688ec14ea8d34af983589436aa4946c08710c3fa0ff68b4852ad", - "0e24b5e6ccc7b405dca22cb946c020205a82d52e049ba9429bb8ab6f72194b30", - "b6d751912926152a93cc2007fa4f4d48c4d4b91e0e99fcf47434c618ba98357e", - "24643200ac114bf937b89982f90796e2e80998dfa9d080aff4777b56627bf208", - "af74c772f720c22b04726c5a5f2480f0ff53fff02a035e7d3656927238ee7f76", - "1dcd619ff6873d662488187b263d9fc4aef10f6da87626ba1766d8305708876a", - "feb8c2cd17d12ff09f08d4e5289ca935004e88bf98bad2c93f03b8f2d1ea55e4", - "e327c4617e0f45361dbd293e96d7045de423470a80790b6446ab2a0b0933501e", - "f668285665f778f06aaa1d321de8fcbd241d7c6702cc382ab1c67c8eb0247f26", - "15e8556ef7e1c7fa1116ba41891e101eb39ba0da1093d57fccc74068123fbed6", - "dffd572eeb9b12fb2b9a7c8c65669914a2775d10ec59ebf585e07100af0506a7", - "caf88bb1f978e1e9e9217b0c7a2d641251701f7c8d1c857b9ba2c66cd9ee7f53", - "a77476186c972843ec80a9c376cc3b47a1cbebf4d09b870a45b7bed6e6784a92", - "ffa3703f70b86eda9a016d7d7ff07e3a66878a835633aa586b9811038d4461b2", - "ede4ba027af085b99794271dfc5be12b233720020742e9f9513759af2019fd57", - "492948a6ef9ff1ef6de45a3283180e5b1b7d7be3358e6745f54c7dd3cf5dad51", - "f1288c4f2d4a2a33e55a6b6ae9153d2db828a2e14a9cd63321008477bdc5ef68", - "215dfe0944da29df2eab3e73f65fd541bc89531be2fb96aaa3fd42a02992ded5", - "d7daa8981fbad88c1822405e8dc00e343a4a5efd8dcc2f81ea2702157d207363", - "33225e513ca0fc09cdefd44c01514fcef5471e04abafce61f5a460f78813187e", - "72536772480f1184fda8e8eeb09330a401c51df8c018a67a7e761ee95ccb8d42", - "df47c7c19f43627a7ec1116b7242c01cebf44cc8c34a382fd140cbb83ad50d7f", - "19509ff84ecd99fbd213a642b8963edc9e9b0d8654988350d3148a1acba7d137", - "6952cee02439dcb9ecbeba4d7ab0c6ea1b7d86e98ea595211adbae91ab1cd284", - "8355113923c156e3ca25a04fb8c96ed904f610d64af337c30df658d320ca0471", - "f047a70a895657e162cdcd10e5066a40aa1ce970085f3ffb350d4039519d96a0", - "0b4de1f516bfe9824f4fde85201ec19ca0b1a020d9f7e541a9056ca6448931d4", - "891e18369d8bd26b92760784523e11882a2b086268bff0c7df061bf4cd0356b1", - "e413a8b3ad8c24def6370aaafe93a94e0e2391c99e379e2353ae4ef303379860", - "fa2631f8e11632db9360a76b46df7c87fac0a7100099422bcc8d7da7f57f6e25", - "f0ddc3ca4b14d9d9590f1f7eefa08eb659a89a67ca1dd997692b3a0cf9cc666d", - "fb67607f8c9216160c0d9e5eb1d4a24070c57372a3f2ee982b38c6715820b14e", - "6ef299f5a34ea6e00a486cd4942a583092e6a858d35cd913231c362b426965ed", - "c4ed00bba944db713bb117e4beae9cbaefdc3561c0d0b4c61bbbb4293e854fa6", - "064eb4846052dbec0cdaa60dc1c146df735741047c4cd1f52517c0153c8a3da9", - "75de6c610267995afc4c5156285f0847c53b9c2eced2a95bfb429a22e70ab8d0", - "29e84e6bed628e82dd8a28a4646f4ecc0bd71b588b83d2837734d8ac2a4779aa", - "cf719e56cf719557d802b721c2888283eb5686324bb119f5158a0f185cf9ed71", - "97a7a5c8eea077139d275aa94b503e7eaa6c25e278369d3068c03330cbcfef81", - "af7b90fabdba19fd260645b026b79c99e4cf5e5042f03f0beead80a4dac1daed", - "9a6406987fc973793e723929b77a00720b7316b275c3a59620ac8be47211eaf6", - "f79b2114d7110020039b1662819393d10992406a889602015af0556f2e0a77d9", - "77af27ca72ba00e4f75a448729752453ffe1ec3d88b49c33c6a0b47828271b93", - "49c203abc963c392c592dfd91e8ca977f99d2cfc1337a544ea654e20aa73e27f", - "58edaa0af38ecdbbf3c49350c8aa99578dbfa81572cdfec715eca6dea0c56a13", - "37da2c8b3d965785b28cd29fc6285556cd1c124daa052eb26b61c00e53f67e2f", - "d42df3bb06b9bbc0c7559f8989c7bdbcc4e906cb65278b91070c0525201b0d7d", - "4d78cdf92375e7eb12c089a57c53f020245d97aa7c9c868a154834063839bdd5", - "9eca5166d26d25cff10552eda3f754f13642e05cab3b84ef636e48cf7afaf646", - "128650c57920d0bb2c2e1e3116137b7fbb27f7c7e46b169c0e97c6f20933cc51", - "4dc875a4b43259add54c97f6210ad7471a8de17656b94e89b1c0942fb905294a", - "1fac846b45016041d70c8da534f3f09bf90785a85a5cafc2d810507c4f3a1ddf", - "dc18a6d60d2057dc729b2beffe4aa5181c777214611606d0ccdef1f54ed84c78", - "950bd2573e0527cdfc63c89e2e0057f291e89f89768b65f8363cdb7ae8a8ef99", - "d05f5df995f71e27d31f8025c9b41f6b8f1afb1f76e360417fea7f2e3a5234fe", - "7f050556a0cf4def383b69da2e5cfc7a679e5c515991bed57322388b2fca35a2", - "a6b393c9af6a51a385d23e526633daa8100d305b370548bbe809098b9ec38178", - "e96d12d888531559e8d26e3ffd607a6412e684abb9b69184388bd380d6f78544", - "30f0a9db5b18be6bd81b0f515634a9e3b599cc8f7ab836d92b2457d8ade3f017", - "9674c6dc94d33f3345ba216cbf098f598a7134137c5205db294ff95d7daf0d17", - "c302c5a3376a82fdb737844c7d0d3476ab5c39f0f4eb082a5015fae4e6d41147", - "df7911fb58d81b196f56da8bbf36b7e21c6461fa2c4270d14e7c1a9e4ab9f9be", - "1fc434e916d0c666d0576f9102ecde774d9801d112bf5feae25df7ff9ac2eb5c", - "8e25e8b3b9ab183afc80eb2ec393927888f76279436d17573679399823e58add", - "db48a02ddf7f53e77d1b244886d295e300844bfb367c2cc72c5565f1b12457d8", - "0d0a515065b9ce8dc87f46348e242496f49d9bfa1848588af12bcf9f282cbafc", - "6c609726936b6f1d6db743660a54766f725f9ccfb96936cb0fe381809f08bf16", - "94b38622ba5cd616d3edda9cde5d8d36481689f6e44a8cfd77437795843d3438", - "41e85a607d43077fc6986ae84c47a10ac28d719cf2f9bfb4633117f9d8e3d92b", - "ec4fa7bfa53bfff63e322e5f6d44fe25b05466839e196db354b58ebf9839d449", - "6c08f964c2f6607e4e5761213bd404af45ec571e48a49b2ca1882f7f346f05b1", - "68289636cc005186209b8088a2f7bda8a047a6ec2d8f686b9293654ced1e6682", - "99e11c08881ded2f5e2a2e2301ed35d0bb188a219580a9e63920edc57e910a5d", - "8f3ea76c0476ec39c78d749ca0f4d8e04144856fd68b052311a229cadd152041", - "b45119c8240b95b382514a8225c4bb65ce1d77a37d0f77e79b11cf299e3631ba", - "9eb3e0e1777674964513a5e8c5f4c76c2ada6e5aa08bc1f5a569dd514780b7d3", - "ba6fb87e85066f8fd8576239afac3f3f14e9bc9dccfa0618c23dd2cbc17b8b06", - "0b77031d412ab8f7b472cf6732db014bfb96fe1eef5a2b6a037ae6b4929b2a62", - "07e5dc0a1727c21872ccd8166033aa7fd1f114e6b653899516931445ef2efa13", - "9f81ecf246a6288407846d134d514a692f7fbd39fc82f1d4b0dab98ef81408aa", - "bf448d964e0b3f179c3e07db7d8d5248956bca2657c1bf0b202dafb6ef47a977", - "037b68a908e03b9dd1345cc665693ccc4728de1efe5fd7d1dc095645887b57c9", - "7affbb0b6944fbb9354acb00450dc9b1b831755f3b78e336074098f33a20675a", - "bce4c61b93c0170efc0fe1d838015afc918e8c8bda7b28c0760f69a34ba62f29", - "e7c08d2608504b4448ba7237d973a413ef8e93d59ab6a8c514568ecfb5c7fc5e", - "f8b81b342909220f239b68321bb381f7cdd34a808f2de7318e28dc9f57aa4315", - "c335b4f0fcf777759ac7e0dbd8adadfdd23be3cf6499d869a0e69158f137defe", - "728d997327acd91b57550ca17a203966ed246ca2e019b8f9c91feb616c536783", - "814a08d54fb97a1534d3e8335b7b287683eebd42aa6268db8bddb69a7978e258", - "8dcd666beb378df0be9b8a218da489ea1702c3caab8ae1d5de4b11bd5d919543", - "c699f65597d54bf992eeda2710680478df2be56f2408a371ec556a8bb18193e4", - "2f7859b21396b89760bd915e5cd2eeeea71aaa0e2931c60416aa0becf5a9489f", - "e922b47751d41e66709ea0266166c2f0a3c31f705c9ef9059b6b02b8573dfec2", - "079e9247573cf9b7686729995b005ed27898dc539995a0efc58b6abe51f9b7c4", - "832db4c543c6cdc730e59c78e8050c51260f9d1137bc5351604ea5bd9ce7f3f8", - "b6a2440f8bf7e3995cc0b26edec52a5232128172e13421655325cb1509233f77", - "efc00696307367d843c5c11bfebd0fce138d6e2251805615894b9ba6e49db73c", - "c7a4eb121edcf6a6b43fd52c6fa9187064d656b34ae63171b5b8377d7f2dc4ad", - "4d37f5b5790d8915398b347e7cccd9119dacd2d7d25be45202cb3863f4e2a022", - "6fc36d4262ab9b3bd50333c6ad3a124b22cc84706542e95da0002b9ab5cf7e45", - "90e96a12248271a43d877b8bed75ab9a9cafa875c5abf21d8c8eb37217d11e9a", - "c28b9e2e295b398eb22c695be6c7d5afc2fd216b09629b4f29b77390d17f475e", - "c6262458e588f263746eff257dc2574e6efb525fa00948102906786a06d90275", - "b8869e734dcb4f05fd5935a4a8961aad192d895678c05166be0d207e8085f275", - "6b979059ca22cf7d838757e7b1c186d04453950bf4afa2c3e86c0e7046c7d9d6", - "e49b6c9cfb5417004d1850520fb289e7b686c5d6104c0de09e706cb14bdb4289", - "6352e35871cf3bf22ef56fd8650c5c2f49b12be25adbc279d706e99b15a26606", - "aef84b678e13fd192d39db172d55e97545bcb60f6ec966ea8f8d8a25b3ca33a6", - "11e108b4a6bae27c6ca22ff394da0aaa79df8c717cbd916611cf3b1ffde1d42d", - "2a711ed435f97134b7c5808ac273c20701cbc19a5ac5e262a7693535a9034069", - "3b8290774422be23eff677396149c72b660857503191ac7c87972356555aac4d", - "ee390a5f86c7125fda28f3ea8dba46d8f3d609bcc3610de63e026359b989269a", - "1c057db5b5bbdf83ec86f2dc23c47d12ff1aaa1f27d157d74bcde406888bd590", - "848d52e284241ad2dfb5247ecd35266716529a5e2457da2aa5050a51c2975030", - "19a5ca85d9c45f118967289b6184ba34df743eddb103f20ab12cfc51269cc8b9", - "1aa288b70d43a7ddc5038134d57225f2c8e39d2236c33ad9eb551c9c444a5f46", - "20ba9db7bcc6bf0d5df3403768cdb27144a434152a7f517fdb3d3f265e3dc79c", - "07beb35e74246b84dbf4c6a98fae0ce109795927dfb46080c97fbbe879afe5b8", - "a36c2ffeac3cb905a07dd54519d5975e848f2c10cfad6310c25a3d6927d8823b", - "d604043a4aafe192a6b1a152e661591c2eb2fa95410dad5ee63532005dff3503", - "794f3b7204c243d80b8a7213de499dc344d67649b0f85a4620b8db951cb99c0c", - "3870b6a370c2622bcea9100eafce1dd1107c9cce9f863500bbe2eb116b360f30", - "e0a3b6cfc4d5ef0a4816c2c3f5f582de05eaf83dc9a2d8dcc1ea34ddeee9c781", - "f4acccb3be9100b808a52526cce41baf448217ca57d632c5eb0cbaeb14272bda", - "4a446cafce89cb87cabd7844fb329814cae5850cad8e25bb53d64ece96311de7", - "ba10262fe3d5fbec4ddd652c03b1a69d01bdb772863e559370af689e367d67fe", - "84e8d9197d40e5daefff1283c1d460ea368ce68a6ae7761810612d6d2ee29e2c", - "0f68aaeb037c90face3d6a546a7b39aab7d2bf97391ab3178e021fbc9d3bc1aa", - "2c6f0f803f658cf98142fa62ae656e44825ad7e1c915309b878f7e3966fbf4bf", - "de3e94a2b6358371a84d86184a80f7e38d568555b033414d3315352b68b0ad17", - "f7eefabfb3f23efc71ad5007bcc1f47bdd4ea66903e94d9f64824ade2d4a2fb6", - "1595ee1f922d1e9c7573de592d43017dbe1424602b320e4ff89eb8a7bc787202", - "3abb4dbc6e8099d4e08239bc2968b80ff3a5335384cd033d76d6630c425d1cfb", - "383bc0ac7eaeb4cb2bd48f5777bbfa0b585048bd63c518661e8196cd0c18e058", - "3ff6f6c19d316193c39f1e1edd233911f7b27af3fc219106391ee9da0bde8815", - "11874c2ad0ea1f586b0f480dcbd4a01bfa422b7161c319ba67a31bc17c835123", - "40b537d6dd682c3679bb83a314bcac0aab9c6d7f9c88ec09b61dfa6588b64a47", - "da0f6190e82a02cc3553b20934f47a338017e8175885e72d6127895a3c8b64e6", - "9747b803aea470afcbbc13247ba5a48e155d9e4bc47496eaff42237bb97a1dbf", - "1210bfd2f03c1e39dfd2092b6d25c3903324a6f5b578bfc9b0512980c6fa9d01", - "6c23212ae74cc474719adf78fc168f1ae563cbcf313b61ebf2a804ee9c4824cb", - "d9fd37aa46a99c5fce11c013f076de9c981a5cf26b122daa1c54ddc127056e09", - "848cef511fc3ad08c5940f83698860b261400c30f5b77f89a52e3059d67e9060", - "58ebdea83ed789bed55598ce9dbdb489e60f43d255f70fd80f632e05499f6c3b", - "048a5873080527747dc3f018491b5d53175a4a6425e88d1440e089e422899663", - "e64d135d583bbf90368e3de307037b85e8ed4febe7d840ea5a6b96753d7cc6bf", - "858ea25db95663dadb69be89f90ec0e6eed8b433af1a76bdc0ff2adca1e327c9", - "9fc664be52b7a1127cb606106d7ebdf5bcf4ad91d241f7fc408845f2aba66804", - "e03b9805f5887f4f33639152dc568074efd784ea9a89c63ba03853082a3c7472", - "4e7a49c63d85acb80eb4bad02b45dde68078a6e77705d59b615420c806d48867", - "112cd531875345a784c42b8203bdc44fd29c143e3b7df1fc5c19ae2161e32cf8", - "cd915edeb362e952c7ed595df608669890c878f38b44a1cc14599cd79b36c99f", - "92e92e2667ca10ca3cca2d315a90cb8d32238b542562697cd4020d22233526ec", - "045436e44b1778443335d51ca30871278b807971893a20a4bc1fc2bff6cb6577", - "393182f149561b837f6aeaa6bbb629dc10b652fd4256f3f0407e05a9d5e54505", - "de4868f7dba57bf305ac4d8223cf196920d959546d10e3c4188d1d42263637ae", - "d71197328924154c9652691cab5b3c243e1d2944a9478c0c2b5f01d1a79d17ee", - "039b28c40cc03592ecfe26f6317b648dcd25bf33952b9f748d88710e7f375e6b", - "d6535a0edf2005a4064f09b2c4c4efc2e5443669181d97e7a68c338ecc8fe88d", - "5b8271300683953bdb43defd8c395612b233a3ae0a89520977589f52d91ca264", - "3b9625e396eaaa7a1b257484d7fa7d30b92826a39da0c942138caefcd462f806", - "8ad0d42c93410465dacb3efd03b687fe5fbc6c105d282e26432953bb4f531402", - "e15e83088dfcb62c9b25157a7da2d7e3f72969a57764d85226088d7703f1a804", - "de40733f2dbc8ad674f7d45edaabfebaaf0ff86b3b6af8db0219081c3d8ea04b", - "ae2af3aeb2ad96f8e5f2a848ddb0976307142ef73b934cca1589ec503ef40e67", - "d1fbc7fdac8a4bb8194cabebfd358bddf1d365cac50d006f0d7a1070a6baa065", - "d8836359c06209defad0b81cc7c0f05aea2b540cbb653bb55ca06eab4d4ab3fe", - "b768909d68c94599f3a11e656402ecc93004498c05d93d469680b45207bff8c3", - "0444fedef3e3b0c7edab3338d13e621508c6fb0c47d433f96b05ba376e01afb3", - "a78e6b579030e6c499201bae2c0bee80ab0ec63676e2a0a4ab63445139f3ceb1", - "4c738056255fd1e4e32b42d522678a894adcee039f56970d846a730c9b7dd1f5", - "190f9ca0736166d08f1784eded5dca8ec4d2e33bf8898554d651803ea11930a5", - "b0df77e897531ae4602986878b966d9842a217afb9d6412e69d241a94b2bae9e", - "c9588650fc7d1c1cbe46bb61e242398dbdae69890ec9d34526c040a92e417e36", - "b258ba77a9b2bdb0902e22bd07a2094f0141fe7dbeb5342df7efb1b0b12c778d", - "80dd6b49a91d4d2a8c29fb2fa7daeb0eb7071ec69e5c94830fbb02460531fadd", - "89f15322afda8f2f397115ecee33f64db223b64add8ca34df930a163f9de43f9", - "519fe6e3cd9436a8856734c739fa7cc6d94d742b6b8cac42a110d03fb405c756", - "3373a141c6cab03a6398035e24911418882cdd1e028f4198f20c6cff608a99a4", - "4f764cef6e152ac983a46ba3cdbe9aa88240c2658bf03404700da4bbe99cf2fb", - "4479f6fb955a31f92775aab9cac69ff73a4404007509435981506a6e10f2ded2", - "c36e19492597bed255fced57229b1eb7ee30ed2cbf19abcafb02f6cff052b77d", - "f6c80e9802925b033e776786d796091e2eb45096c0a84008a9c98aec64e784e5", - "118708e0a11ba8edfb9b34bead8eceda5046d12abca5607d8a77b0a86433cc92", - "49cb370229749086ce7575c4a95f92c80c71191748e197a3994545070489976a", - "d3fbfe4860b90fd806383b083f55e60dadfcc183785afdaf3bcccc0634d2c845", - "2e5226aabc796122ddeb736ef27be7be7553131336daf80c1732bb1313c7b0a5", - "f6b118d039fcc49ce21d5c10d54b408929bdf965001944e84799385b728d953a", - "8cac39bcb536889925abf73123bf6bfbc9a2b7e809b94180b97e173edcb404ff", - "8b08fe5098da2a43f328e1570b1a19f794e497cd208699134ec9bcb84082ee49", - "24134d035252e4ab5fff66b73b5fcffde68516b7db8f96a7e6d8ce79327d2d4a", - "da38baab54131e6d7d792285ff2b8e16a93fa5b86117614c59363950bf652ee6", - "46c14d80cd27b0231a7f35e835a58be01de803375e976c2139be6372065d05cd", - "d6746d2b6790be556cd128a9ebcde90c6ee291eb92213dfeb288340dddcaa739", - "323d9ef665ab17586c5729fe4efc3d265d6d4be83cb2efccdfc4a587afeefc0e", - "854b5298dbd8dc1d7f070b22a960d49226e20a8af86c5a63aafc81aa4904cf7e", - "8134a661c76b0209f5249fa6aee1365297ac6daf61fa87432a85cf696591303b", - "6196d876fc3ae961dedc8205e4a88018a9d9b4a83e451aa0ed7f331cea62eeed", - "c96ca691dd1d0e39835f3fbbd3605d46c624271160b395a8278bfde8a20868af", - "ce496b845d82d896f886ec19ba71564331b12bc8389bd87f98b0a682512c4427", - "639a468d7a3ed32569f535e98f28b0c405636dbdec9b3563a4ee7250b4819d8a", - "23ab111c406e73de377cd60d5cefd510c2d20d0547c86937945e33b271cc8fdf", - "db0bf8eacc6bfecaa06df26284064d6b35652e98851ca0ed26725af1846bb0e0", - "fc103310f373d172d44bbdbddcd63bf29192bb00fc5e5b3b007a5cd587bdf594", - "11c59b49bc0836fd6cef0c11be0a5f0d2fe83786d99d93d4b8969a925295e462", - "991b91599d0f9cc5a8ea935e6e4d34dbaa3c5db26d15817ab9ce921670d5a933", - "a661a9e82739e5b60add393ebb41cb8dcaf0d57d3dd3266a5ed369903c214a49", - "4169e78feac3ffe76b500939a93a8c0a68b8d0578830a189ed7ab3dfb14bb8bf", - "ac877d779bbb3d391d6fdbf31133f7f9870636830e947911a91e38f98db4b0d1", - "8875388b19e7a50efb826e991ae3a6dbd976d18ec5dc609bff5a3476cb5186e1", - "6c039044482c8db31d96ace0100eb8026a54abf62ff6862758525f4c7749ad97", - "c26fc79500ebb3f19bf8275533fd5c664c6f9909f4a579241342d7790ae9c7e5", - "679039f4a7400edbf586fe5f9ad46171759132e32e6804d8658a46706df1cd26", - "d02baac423aa2a3945abf5e6e7bfd1160d596fd55e59c73794812c9e59dfa417", - "c2d80feb4ce323f773e708eb70ddd808708d0b33483af99095c9eb6094657b91", - "8ca8cbf3da9ef63ccac895555b83f722a7ecd8e76fbd99de5cf2f1327f321911", - "edf115b805996eba99cc7b484099b03e16c83ae9ae85c38585bfb7d0c1bf337b", - "0435567113a1398b3a383d8c9b328d456d826b569f156d0d44e208fd32db280d", - "2c340eb438f91a640d702c907021061f4c49b7b553c9b5f223e128a4cdf2e639", - "da59361c91212ef2254fd38148f8ab6dd4ea7570e07aa775919470f4b40e84b1", - "cf088a075f5f457b7fba3f28a5e6c5ace780e8d9b2a4c629f736cdbace804d7f", - "5b8cc13b6986c3614f0f31b324d5161f346d198dbd3a38fc1e47bff4de1f0a43", - "7c911a5973360c275558d9c330555b96571368f8b30aa1236ceffbfcc1bde0dc", - "71f1e6500dce6673bd4791d27c5d00a38beb10a11fd3fc1d0a834e139367bcb6", - "ef542aeda768c9ac4579093141773813a69851d3550f4dc81ff311f8f24a47e6", - "7533e2a9e64989762e580eca623a71c6b907ed9ce9508c55879028ce08b99ba9", - "f93b0e4bca3fe630e7f45bc59b7067c14e2736ee5e45d6c4379c577d6bf14971", - "cd60bd251cf8f49e881b5599f849205f562b22dee96f691934fb071b76c96d4e", - "2549671f0b662ca7caf9ba4752379978328b87364bb5d3c534b2cc749ecd5def", - "e66ae776bcf564fa6641695d8b171c9e417d4f8aaa6956e7aca4e809753a33c6", - "e5cdac99521349e2720e79b249db5dc5234d847a3d28b4239ae4b4e77f485604", - "18e464b2d760ee0ae5970c1c7e0ce65e447bfa86258874c30498288e572b1795", - "197b392c8bc9c162bb0a0c4fac1fddded07ef07b18b2f21186051ef35636b8d5", - "138ca3c6ed82d19f1b7cbacf48595395c628636aee7a0588d0ca8e47da0e80b7", - "e3f11ea5288147b1576aebe31756c812b7a2bb87f1d7d3d82086db80e05b8a94", - "1ab099bddb1ea92d2b4e54e1d32a17d81ec34b4736a21c96707c613b81e515ff", - "887306c41e45bd4c3a823e26cacf9a0edbfacc4357da6347013407ee8f07f7db", - "da9a1bd95c4ff9366fe480441066f3689d004f9784fa9b415091599a8eb974bc", - "d15c3d72f355919cdd73c18cc5dafcd6dbe7b6885b61220e5a6167c190572e3e", - "a1841cbd8cf4249aa45258a5d478bf854beb4c89b11d6fe3a10bf2a043239c3f", - "b8b4d43ee99c5da751e4f534ed53d2a0409f16b6038a176d6f1206d7a2816e5f", - "5627e19e7b4a39c12b990680f07fa8c5eb510c5891f3f53eb0ce8701b224e690", - "c5a2fbb745b7664cd5c9e1f14f7db0b5055ebf40be8c849642e6902bfd0d8354", - "fa73427a6b4a35a3350026adfff0d49475d4c09206a21e64dd98ff132f6105cb", - "fef799aecf87f5fda52f8248efbf7b9e7a9a226ee1af108ac5a346b5219203e2", - "aba42a82c90bbe56764377b18300aca279791d8a27364a3f8811342c2010e2c2", - "25cc4e6d1e9bb157d3aa47b1a3271160b7b927f3bd64e358f69319bfd1870d8b", - "e44a194ecf6f39d533de004040f1c993dc7b2bfe7264825aaecc5be76cc096f1", - "8585dd0be04bc68fa5ebd3ae2b887a0e50b8bd7b9701dffc7b741dc7afa23ff6", - "1e4175985e6dc1e3a64fd30f0f651c0a3a40f0bbda1f64c2c7e12fcde3f1a01a", - "c7a68c40948a5c02984cf05c8fdca6a461af04b935bef4b8ad867dcc46521460", - "b24f6a019c5274192ca2b6591fb537ad6acae6e83fef5a4aeacb0dccf619a528", - "921f2b9ef9dabcc741391e4749e8286335ecb9ecb0c7a4569825fa3fc5067e08", - "a14d6f00889e1d476cf0f34a3ef8a40ed44420e150c86ae0ae49639a3201e773", - "6cb7a9ca3c6eaffcf55989e3377e9b49d8bd7f02342fe0a8eed1234c2853f4b2", - "e6f728214ab01699b15903eaaaa25e1ab6b9562842b4be120d60ce72f86d94e0", - "938ab61d6ccab9eb4585bb552fc3375d8366e0d12ff4f7ad1c4d34625f07f456", - "a9576737283e071aaec287b7f9c9438d6cfe50bd4cfe9edcfb8b2a6620a72272", - "c37cad3626b3651e56e923f7ccd4af46945f934209d870a46e788fb4db490b77", - "4b060e0037488cb52bfa1b7755a4dcee2d0c3120a9fc3fbf28e14523e1134915", - "3a60ef098b0d12b53051d0f0f51ef7218aea144415ff892f137e74940a77f005", - "3ad8912c50e2c10f96feebdf36a0a27ca9cc7775d61195d41125df20c3e139f7", - "084fb5e00e4f7f6ded9b1b50f17226318dd2d95c28cfa36f67618d50742dd566", - "b4595b958781e24d2cb96ce6d3445590c7efd8b68a7dedaf7bec13a3a967c6e5", - "fa7343056b44bdb26730a0ab4bd87bcc7b5d84b3469a54c74ed763b4e5ee60bb", - "bbf87c1fd8f89ddf2834350e1a0c1d4f63f59a26b7c6b6cca293e865c48fe990", - "aa3f1d2bb2d1085e7e886c8c3b963e636ad7cdcfbae9fb3a82a8fe8147155164", - "66ad176abe475d8a4225494a074b553297aae0e2fb775d41e44458379e97cbdd", - "f7053a300589313bdb0ec4affcff99bd41b116d8c6c84eb07838d7a112c14205", - "623cb2fb254381e98a4e8b146ec4b09325a0f8d6085a3846f34ff90da280b2ab", - "ab559e94662dedb26ef3c832c81c83cd53e4b28107a093c6fd511abff74f8ab1", - "20a2196670511f23bdb5ae697753eaeaa9830a868e8c5136714bad2abb187d3f", - "6b3021464edaaeaf09e03c645710157697123a50173b61dfc2686a9c2b9968bb", - "71626fa8d00cc9a0d386071a6128fd7132413760a606bdb6f8d8258f8da5076a", - "d54f66ad33a80664b3d297ef575b7000c1a804165ef23f7b44664440cd3d1ee4", - "893ce866885d54a9a66c9210aa9f85acd2b88c0edb249c59b1560b01610cd3b9", - "4b70535a4858103eacb124d8b63c54ef5993696e09d4bb823320ad5bf5207e4a", - "77c5610645c30a4e93b153aa703559a653bc8bd80bb316b82fc2c9ed5ef8a792", - "ca125b498d4b2e1d70fa7780e13ad8341a5312ec828ead74dad48ebcf5c6381d", - "897a3dad6f5711900d36afe4fa9cfebec5aab0f89ee234ab541b6bc345dfa593", - "3bde89b78c3ee829bb0b0854be8e5613ff2650d164ca51aa7651a267886b853a", - "8f49e629d3cdebf87f2d5a6ca8e523c01d6f6d24eb1ae4980352b6d5e0d93587", - "b5d3d5c0752737489b722d34f54e8be380a3cac59a3bbfca27569a27955d631c", - "8e7e7df3a79a5ee1104b1ac4e840e55e6c3aa86fa92e478380df93514dbd1336", - "3c69e752fa340b4a38f82d5cdf2f2e5f50494fe2b4d9930534c5aa0e26a4f341", - "720e796fd01824b3eb6447246fedc766ce71c65a3e582d6323c360e4868e4700", - "3898f713f28ff1898594bb872c1652e4120027379d7efacf2df53b028c0676c2", - "646db0cf08bc7434577acf46594c29f934b3f6f91533a4d146784637eb48fbc9", - "ca2b1ac8e5a95438e98a70f9ef281fd3207a7b0e8885209057c1cdda9207ef2f", - "ca6d16ae27d4cc8db59fe329adc3ab249bdd5d11b5f83146b557c7cb84e5da8a", - "f08813e254d6382af17e855cddd645bc6eec27d9ea71d8b6cf28b5e3ac7663bd", - "84e39ae7c9a8e76f061b90064592865eba86dcc9bf2a30e4b815b741f1778c40", - "63147c81d6d4bd3dbbc82b46337bc1dab0b6fa684051857293ed322e396f82c6", - "95cd3efc919440fe45f47f1ff2ecaf341279f13cb69a81ba26a56fc8ea79d4be", - "3e2b73f2d931c15d40b23c7669992f61aea52189fc374097c0f6a8a4e6a8e918", - "8ed36d473ec885ef9aa57a88c435c1834241fd0d5d862789482defbf18449896", - "8260c9c01eb68e8bfd70f412834cddb85025725b33c0d313034c3cca29ccd636", - "b6f8b4425f40706a301a7adad6e4a518de94c6cedea3013cf90f131defca26b1", - "c7f0021f782852a94497458eed5c1a6622b9c3ec51149e867b19d467fab0f075", - "47231ae5a8317c93c81d688068b5725bc6376155c2afdaac7dab44e5e78c438c", - "5a9618ef907b5bec5117d391870c0d4f24473a2fbcf190b478e88b6e7eecea6f", - "c0f5e8d2752ab94b42ce1e527caca8c2d0c45230f1844bdacf07a0c24d959c6a", - "c163382025833c65c5d3be73715a98f751c3a0076f7d262b2cdabefc9620f025", - "10becbf6ccf1aec378b4bad51f1c22f6e6faf4de131d58fffbd490781ab0cd63", - "75b759c23e64847936511cd29082274abb75c5f3f1346fec513c1a16f4763995", - "7a28da110770eaae70749ad5695391dc4ac7138260707a43f8be6e98b038f353", - "f364bc5eec2c3bd53777f17cebc9b4e641b15e71ebead3efed249cecc7ba9cdd", - "34295a8b5dbe7e92d7ecd498906c4981a8841b48730d990e255435aa48886b0c", - "a665bec8aca691296cfe10cb82991fa2c1076daf1bb4fbec5cf2e906d233b1d5", - "a9a6ab77fd1e406f792178f949676726835832dc30eac18772bbdd082b316d14", - "3fa3355fdd471bf665a6c8532887a2147c639f39332013fe57b07384ea9022f8", - "e62316ff2d447d045ba62f54db761909491209b9b7b1c80137ffe3373cb068ff", - "5bbfbd50c5b86ce282a6ffe760dbeea5842daf8664cdd599e3df07e3cfcb7220", - "188568ef9759bab0ee7a94fdc1cadbb922b039ccdf17c3cd1aaf935f77c81ec4", - "043487ab57778c4f60dd18e173c12f49b6d13937f9033782141287d0029fc982", - "8e93940f573ae5a141ed51cd4de813c996eda2685456fdf48c8115e53835475b", - "eb0727debf4483d930ff38bbc8c69333d654bff8327d6f5494f2ba64668fd27e", - "db3150e757d5b7179838f289c5db4b747ab3c8c1722cae39b335e7f526c5e209", - "a7790c321e1bf436d607eb765e5d606a968b99d648533bfe0cbc3950442d0264", - "7edd596f60d4a87c73b1a77cde7ddeeb7d8dbb95a10232fccb34bb06b8be9ef6", - "f9253b346dc8531877b87b7b286dc70d9ccda053817c787d7c629784f686b842", - "d088c1508edd88c84aebe14263614836f2279afe5b09bdd7d2f18e320530c04e", - "72547d364059b5632fdb9a9d19d03bccb8117d016e54dd314576a30491513de8", - "2330bc61b86ee49afce696ddb30965a71669b5c1cdf3fa2d872fae4a551dbdcc", - "90e32294fa348c0517896b8f27742d97558285defc5671e0532884595eec0937", - "2e4cc068b7f17b1408deac6b41c8e3834695df84be4759d82c474cf4dca2146c", - "1ebb6c1535a0eb6462f3b734d08ebf077ef3c5f82787ce1a0c9efab247e00d2b", - "e0946afe8f0224d76f8560f1e740330a052910c3968ccd603bd22f21d6510df6", - "edc30288229ccb49263c6dcdedcea668fee153cd2c32fc49070d78d8de86e1b0", - "401ba99efdb9820b9659f04a9778f9fbcbbc3a6a2e5d63d7bb406a2ef7ee9d41", - "2fcfdf64cfa76fbe5ac62ae9a81cefab65cc2d6c9c77db7fac010192dd140b5f", - "b5053c2f2ee485a65f7f91a01a0ed24b90dd7c313bc9a316dc55b1a78c192d2d", - "cad295e55762256169a2aa413f5316281e99954cf7de4d81ba19caa9eb7f1b6b", - "ad03f0bfe12c3af407c907b0d1fd537d048e31e56cd4b4c3eb53857111365a26", - "ecc65f207987023c76dcbfd5a07febf8f602b0c8cad8e2e7c04cf04a4ac080fa", - "bfd61ef306b2e4e4beb20243647e465f66befc4ec32e652024896b17635e1c96", - "39dc385c552582fdca6c29dc7046bc511cf9301ad5dc6c8fe790d80a7aa73d3d", - "40e5c0f922ceaf2564e6d020a79783cf20ae1b69c66bb43b242cbd3172a1ac2a", - "c6eba0d2fb25a8177420b3a7f5515ce3e6e99c2f682db7bd8b624978c20791e6", - "5bbafc10d3d57ac81e4249f3223e39d48512fd9caa7987e7b40fdee93961d063", - "f9673dabe0fa8cbf33b338950fb5e5d426d015bef2d75196eb67823569a8ff23", - "2e966051eb5dbe87f2d8c3de001b5899e98959ff206d589f4f403ab90fcea752", - "32631d4746062b49bc7724dd6bbf79f264481bf6cd190adbbb07e981974dc6ec", - "e83ff9fae6cb87e4fbace8dd371e15a66383f8d6188609ca9a6b004832a135bd", - "58535691ee451fc82fb65b353453d4cfd5752dd859b5b78993655fe59d057068", - "5d11d4d0757e168229f96c90b27a4e7d467eed2f88d370250462f3f900b61006", - "562d4f51889b8b7644ca2e783759111b0e7252191e4b344dbf5ea660adee6afe", - "291d5d3cc6eb93080758b0d431ff1e3d3b7875e901fc60b09427c438786295d6", - "0d4fc42229169691bf508bda5820e4f2aff24a4c14bbe4808e966f3a56b31c67", - "ce2186a57b295210a9c2a49f890d6f3d6a17f496ef63547458dad0f603acd83d", - "6342404e2fa3597c0d0423979627faed23a2f414e342e1b47e896db6c740dd09", - "faf162cc6860fc42bc468113ba4c4be02ab495c9c997db40b6506c62de33c209", - "2138cf542a6f517fab0037bf7b1b384abb978e7b26a01f11bf6f5588bd1803ef", - "325d565026be8fe95e69727bab82c2e5cafa76cc79603eaf2b914f4d8631c8be", - "ba47541f2cb14c190964b8a05089d706822069cd589f4a9dd720c6ac9737efc7", - "f917a37801a34092ffa11efd7297445734988f780a93dba19acfb12edaff3621", - "cb67c8f6e5d3acefe32713531c783be41344b97cda579118a643f0104129f048", - "06a7a08d3d39fd4bd95b5b2583d7b1db3fa791175ea55e1789afce437cfa96ff", - "92f1d9d38cd01794346b10fe0f8ad0558936b292281a47cc612f6cfbbd405544", - "7a4290440e02ca43566751894f4fad4325da0f748dea3f9f53f740cc3f7d8146", - "4cd6ee903714bbe7a65345fb965c84da78c1b26801cc39d400b921b6684e39d8", - "5c4cb09e6e759fd1bc74d4a16b8f65b214ff2494dc4dc15fba5cef8d7581fcfb", - "f34603b86125919d3bea7d453d6cef5598cf9524cb061eac36427adf2c69cdb4", - "ca52c92eb30858ace1a6b15e82c82fadbdcf5a3df128f5bb3749c3849f4930ef", - "377dbd7e127ae06bcae93d2b8e9d0b0338f60b61623ab51867585e9a8943d2fe", - "551b4c9f9910f0d72d24fd08f04a7fa0dde792519a1171bcf238a2ee4620f79a", - "eb6441a4de5ead57c29be19a5abb05df0aadf941ab401086561bb07f39b59db7", - "c25a56ae2b8fbd711a58924010c0d90546454582cec5d0141de86da98b05522e", - "a25b952a6de306ec80bb90cb0e5ba4fd3cf2686ac83879e021e36e1bc4fd4d31", - "f64736f897c95e55775fc4d020039bdef258db721c6bcbc9101d2be9bdd2a033", - "454b7debcfa8c27ef6fd827d9531908c655f22efdf3754d325c08e6d44adcdbe", - "1f6b4400d0111cf08081c91d77628dd43fecf7ae646659d7875d69cc5bedb805", - "89e3cd04634028c9c2d45e6806f96fbf6d3e4dc21fc991a9f2f8cb4e374f5d52", - "fefbda068d7a19ecf88d41da28f87b8265016466e7b10adeb66e3d10ebd22a51", - "4efb073b939656e3976f354b726c90ab5d8bf4741d85580bf719fcbaf1084b87", - "66bccfc3055366ff51cef0d9f2abf4d5e67668ac59b00c5edc83ec34433fe68d", - "5ee3ea911eae5cba1e50ea3222775449d59e2adc041536516b41e81030706841", - "9f8344c2e55cfc456d3645a8c4746a8e3ab0d350ce355e40414ce6aa6559dada", - "5a2b0bacd5c5a38c5842c398807e6c70d91ec566c051dc909b5b7b1ff314591b", - "1183cd152a53b7981762f1486f99ff0d6aa8c9897ea2d5c1c39c2b419692c3a6", - "b66f5aeb207bfb85dc08fc86a53beb657a4ae43381b1a3f22c157c9ac8ee2145", - "0c7eca4f88fc4ff46e946af3ac6b2f5c6ba91464ee366efb5c75fb0425cab913", - "42ac85a38241baf9ff003e2c3fed868d2e7e0dfe73cc18988f99c7fc73cc14a2", - "2e16f34e9944fef868e80db2a753376eb1ad1d1d8bd90f2067d374a21ff3aeb6", - "ef9a723128dd13d18557bef316a37e5a1311836fe2acf89d18ed247bd13e32ef", - "27a2d5787ebf21448f1e54887e94f72f92cba72878d45475db30d1ea888398da", - "d1769080e509c0d9470386c6b9822e95915d15c1f08ca0de54a8b01743418f9c", - "601321444ab9b14b9bb2491ec3a2e8b613c1d04545f3428a0e8e1b136b321e49", - "84dc35c71ccf48970883df6a8abd32318582d7bed6e3c9aa6e73cf22d4e0c5c4", - "e0d69ce6c8aee98088d7b79b0e872303cce58fa34d4358f9f43a84548bf44277", - "85b47dc0a61b7a604a5fe0bab330d1bda667ebf795198403be0c4d1b85d3b691", - "582e712c859205bab3785d556b875b3bdf499db44da73c418143398ff16d06c9", - "11865c8249d1281c8f2cbedaf7024bf52b15b52e997e262c8548e7f95db6beee", - "1a81849a29b289ed707ba0e67b1fa3ac602c665f59958e09c4c691db560bdde3", - "7922da35555f4806eaecdea734b067300e834238b65b98a1b2081662de897a15", - "e4c2c225c9fa656d38bd73124b4f0cd91f22d812b0977751fe2e6cf914ca6254", - "a318aa6fa9856007791ffa20f533b14102f95ba8de1bc823f503044ac210a1d4", - "71f836da4e62fa4906ee14ec499d6cc6c33a47078907e0185dc91450c199009f", - "be85212e5706d87ad6a905647326f5547962240c5445a1728551fe84ef22967a", - "ab39ddcc1fba3693005ebff42e61d66103ca6a56eed0852cf744f263c4c09813", - "96c44a6d37f7ec483950874334b605196681f73647d452fdec671d64e9f3d083", - "17bdf6982e8fc5c48775853903307963ef41875420bdbf3692d2e5255ccd01be", - "a051fe628d0c40d4a3f8e44d78ccafffae21c4f837277608d3d156eb848f3693", - "c163a336fcc32c099b78b9f7e2974290dc98bead0ad9abba788c755a38b3d7f0", - "8cd135a2d90dfa06725124a62e490456f434638e2ccc3eeb3377a42a9b5da269", - "11b033db7298d43d135a0ce6339be443bd253f29cf9f14c37166cfeea998d3bb", - "5751bb74410a6f97fc81be7caad204b773b84727be6b7ddc47e7c8fd39ed579f", - "bf5e979209c7021d4664469ea7420c06948b99aca99e3a2904759c5e48879267", - "55ec33e62aa5c049f2a30abe330957228cdeb1da0d65f69fe45018810955ab7f", - "cbae783768d0d9b34644060884b612293f4b67364cb08c050132bd3911c95861", - "d4be2081f20b2032c7234b02f318b457b90395c87ee0c0803fa4196992218363", - "2a2e265af5de6de482679d52335451b7fc5411d730c04c2321e64f1d3de7ede9", - "2b75851ee9643e71f7387a6c8c912b22df5d165a668fd29ca120308b5b781dd4", - "92295a6f9541b6f96b82631a1b0479b965b4abdc7215cafaf76da4b6bdf12373", - "6d20e73f11352df8a7327d2f3b1ca91080dc0e009d0ebc27c4dc3f0292162837", - "2672883da7c8f0add62dbe684404ffba93127df3c3e4f39bafca22d169ff80c4", - "5820fa1dadfac4c158be1ceac032f1f423f98cea04a35a66652996bc1967b60c", - "20110b1ce6136cb894018e1196b75e99d39c67a281bc6ecb0516af20ac9491c3", - "9825430169d1d1471815b8fa2df60ce9e6b332648216c0e86eb0497407cc2171", - "16c6a79e6674b7c942159426e440c2bb155545c93f977fef4e9d104c68b64a52", - "121bbaa7f04e80ecbc982a7a374e4185101c421c0d0e7ca15ba2688f4c12e08b", - "07145b373f735affccff801974d943093fd114ee19d0a343712d7de76674c5f0", - "d4e3f46983d2cb11fa3d781a4b4d6a3231fc991ef97d0750534023d71882ea64", - "2e27cc3055865ac254cc14dae8d35634e553b9c6a51d9f6582419d395de9b557", - "be0bdbabff15d7d0081ce0b0a6237ce404ca5d626596ddddce0c7fc43c542540", - "94ba55e3c811fb53b50eeb42cf1b2471514996f5687e750414cbbacbc06f1f89", - "286b4526c4204c0237c256e7f655c32fdff9ee9fa0877c752e11a8bce78ec837", - "9a863b20b8bfb7d97ba5d36c56436a5d331b3237c9fe4f869ec03c1ebf386f25", - "7398bb5bca2dee0c9cab14c2b5463c121ce6e62f0ad7c3e20a212a6717a65b77", - "ece3352e0d2a5419a684b00d4921821b2d46ac23c16b86495256ed1031339bbf", - "73ed0bbe7446ef3811fda7ceaec6a94d9caed03093f4e70087aa12a6bb1d7d3e", - "ffb221063f5572d27021085011cbe12ba80689fe4b2502a2d78d1f9768552ff1", - "4be69fe8f45298af306628f99c332d668bfe2b6a8840a93ebb3d9e8a5a80e3fd", - "a6f8e156fb534f13f886d1a9bfddc218fc09ab54aeba08ce87f1b57793c8b03b", - "1df8dd15530773675c5fc1c2c967dc51818e5d455dfaa7634c71ad54a42e2c14", - "be079e0f03e3aa95ac12e69bc1a167ca072f556f2585879dd4154c80599b2b00", - "92c5a5500a2a08f45df65581684e85308055c15979efd896ff570c08ea00e32d", - "18f854a447aac48d66ca5f1c3f5558534775e804ba4d3462471c8abbfde174c5", - "981d1a62db38358e93b3e18f7cca40511ca16f56190c63853aed618d83e0e441", - "ba3d1badd71934a6eb63d02d34eb13db0875aa4938c7af3fec0fceccabd8dff1", - "63650e7f775224f34a895c993f1f2c0c7bc2b86176d4758c0299fb92edad43f2", - "2bbbf06fa64fce082a024a1aca7d5dc36e3e87054ebc132c64ae21442759ef01", - "63bee320be7085f0dd364b17abae6d698fa6d2b7a1a009043ad17325bc0d5412", - "2e19a5c962c734a3e672b641a6c4daec309fec8bb710c10af9e327ab21cd9ab6", - "ae0155aac3c81bb33f08073c09c62f6b3664f9f3c3c71aab3b62c90ad5882dca", - "962b42b512d3aecc6806d28e3bd90fd1a4abdd07fe61556c403927bcdb8dbd62", - "fc8b6361f35aebea3fe0cd216c5f0639224df5ac917c9d0ab73a98cb5cfca63b", - "bdea671885bc657b21f53d731130496e1efd11fd3ed674a4d98d7f112ed86beb", - "8922d65c43f9de02807aae1ae21ec77ee667ed4a393e6f4ed96eb2df6a3a5643", - "45feab309a9289985bc4d2bf9ccd080c2485cdc7b0ee72d83fe0e8f36d7a9b9f", - "93915fba669319e3a554cba23295069f5d38e43e60f00f92265f573b3750511a", - "da5133ad55bec13299d86cff35ec3e27524463e764f12fc03c762679adc5c9b7", - "96773cacae563b9a349141c091ab4037918c619116b1398d50663ed37877ec49", - "08fdffd6a36f996e25f7e3891cf745e60bae4771fc0c6234135208ce12bd1d0d", - "bc8b796daf4fb21db87cb783670fe9f9ac214ca5bd1b40c05b8c838a83648002", - "a4dfcfb6a6aaef0b8177525220148f1b0f1e26239df72998f342735f283ee384", - "43aab19a5dd007ebd4500d2bbd145dd00aba17369b592e9b23d6987014f93678", - "eeb44d4edbb31be572dbaa2255db6e9cab342a00db0f38688a8f86a8925f8ec1", - "8acec345e5acfe52652f1137c51a796398146d99372ec55b2939bac9c9cd8e35", - "31f7f7f3dcc6d6db646cecef6e2e00a70424568cf16982e4c8c4092334d737e9", - "8987977485d780e4c32ea8fc15f985cc4846b5cfb7638e4198977eab60abc319", - "9bb1f384bf4e2759feeafea2f2166135343eee14fa7c2a506636dd74e06ee408", - "2cb4ca55f870ed88a91dd31c94921b5985ecfab744cf5ebc01cbba3e86ae8d9f", - "d2631c86ff5a00709a007f07e34ab6366397fd8be2a919d564b959488f2260c7", - "f13038101aae65cf7e2fe67fc7c279643ee59d361a3d144dd60dbb0a05353fde", - "e02eaa243b62a4080f2950af8f167170c72f21daa6947dd008df7185d5a6f1b6", - "5d600d932549981424718b4e81921d22a5feb84a07ea2bb908930352d267c0f7", - "947d2327a52bb23b7b58045a3823d6a5a937ec2c35b73d5881a10be394f4c5d1", - "706b1b9e7cee5289ac59b77409af63ca6e8f56b6bda6ee7692ef52b8a50721f8", - "368b28c0c651a6c36cc2bce58301821b345b6dc3fffe6ca7f746e15728ef6a17", - "31b8d759889ec9491d4dc70f0ab214ace8078bfc405a6798ca8fad330345a4e5", - "68103d4d0ef233ecc4a845ac40c93a0059618c96740cb9b55b56b3ad4ca6062c", - "736ea7911da2b8d7ac0e6e26fd4c98bbf3bc0cf1b98d5d23120abca5ed45d344", - "7a2bed6c6a42389b4f7b5c8a6b277d1074ddeaf5667a14452cc9d7107999aa02", - "88135a8b55c513a60086d2d5fb6ee7f54509a4763764e4172c91ed62a8fbac4d", - "cdb9ad7d4c0a66029ed85bd6c760f479000c0f1a35d749c1f26ce334149a87c6", - "4f7693b43666a5a87179ec30a176be8530cc430623f5b2e3dc7e3ad08e90b9b3", - "63c0575258a047c979d15c4bd95b79eb583ee149d31fafa464dfdec7706562f6", - "70c64ed32c6b0584c144910e06a9c9e5b7f527cb83099b97a6637dcef88178ab", - "7b8fa136635b1e4ff696d378fbb5f09c569c7f1bc36acfca773809f0d9dce50c", - "4f5086d93436edba6866c1ecd09bce5b83060a06d79b53b8ef72032de398173f", - "6d6557deb7f0189359dbe5888ce03dbb928ef59af2d5bdf3bbb6616ca6da8d0e", - "30f4ce6a2bfdb79294b2f0a41540f3920ec174f5d0a1ee751cdc3af3dab3489b", - "3abb0d928491a458e2da08ad5fbe1a8283b7e065f7a4b9b67ee883e3c334714b", - "a48f99c9d3785a7977c77896b68363f0c4e8e77c3809184465f68d24d14aeca6", - "a2eb5cd50499b86f69d510d14cdaf538b51c4128e540f1cd83e33d28a71a1d82", - "60d1505bd0671791596bc1455731a868db50db7e8049e51faccc60f4277c9a57", - "ce4b1c5fbfdab118028fd99bb023d8869fdb9795edba0cc96f928fbc3fe99c0a", - "21e2e4934f9bba5e3a6c6bc2fd65434d3daace88fa081c4f04462e060bae59c0", - "9f68829e533a017de60d6319f2949ab2c173d54728209f50a8b011a586c39f9c", - "403b6a041485d40854d348d6cd0132d58f8b68f929d27b401dcda27467dd2601", - "7412a0305100782264c07ce0cd8f072dae58fb73745f9a15436842079f704af9", - "7b4434bb8d01c828656c832bef19fc9cf287c9941aa7ff396c607f0253c2dbea", - "f21598c95a2ca4714b0dcdde44da6e20ce69c624b3516fb3e990132df4a185b8", - "dabd8fa58835785d95d6fe72fd93ffb1e57714c7b9907dcb1fdd91cebff5ca15", - "49ca131474d63a34280bf85b92ebbeb66ddd4c009ff93ae4a54310d66b2d15eb", - "a0a124499ebf32fac80cee691cb4ad00e74566c28cbb7784bde4df2d9f870a78", - "c507a3ade9f4d66b4724e5185549805aabd94969418653689b6b7c7c73605feb", - "cc07aa86d4557cf1c99a17796bb19e0a6497d553361a27b43dcb9c1565be1cb6", - "635e3c0ced20461bbc103d68de8054d3c559641ae489f6994d40b786acbd2ac8", - "c88416a25f15798e53168de929c1ff0976b86a15e07290c5855a52294ed331bd", - "d707e0ae7be9d24765ace6bf1bf349997b660c839b5bf1201a6c0f518e4ce324", - "8d9aebf821344a533c4f713b97446a28fc242f4a6f33bfdc61b7eb257b3e0be1", - "9d84ed150152e2644443738bb6db45c908f6833b713113512b44d87ddd8fe633", - "3168b9408e4b09cebe95f5195d8e05beba162166363e8e2e4442dc6aa145f3d2", - "f80c219ed3aa3e5b90f5f9d82c3356823b21d577fb19e51267e1b8f1031b2325", - "2319e95315862bcab781a6fdcd2993d4e37ce1cc90424fdb7dc69a0ce0af2510", - "8cbf2ebb515ed0df749af1b59c68f1a434b2b24b12c6d6ad8600d0736876b99a", - "969f795568b61468d28a6185b2976d850b2b5400cc910bcfc6d01c74aa785390", - "cd8c6ede658cd0ceafa1ebffe11ba43c656c242060dfbc89188fa710ff970e1e", - "e474d302dc5d4fb87eb5b92f53e584d880a3b0c45dfad04961cca410fb3098d1", - "58130dc62f7d05b1ea2c936224ebfd48315f15b4fda26371b66b867989932c2f", - "1d38c7a9a5752fe3f13d4b36aceb97a5227f2a4804dd4cb6a3515b2fd40d63d7", - "542a937162fb6254d14f7021ba630a12405baccfac54a20cbadcd629b7441b55", - "72dc9888feba3a747ce7e667b1e60e4ade727df3d16fc9d9c3978c3a2871e62c", - "0c19f7eeec6ba55311b2c774caace2c4ed802da09ddf2e7cc49cf96d707e6a4c", - "6a2f37e72890433c3c99cb1e65f58253e8fef791c99f945a8643e0577d6a4c47", - "37f500f9b5c6c04b9fc1f0d498e39b9eeb12c4dbd795fda51b63890695bc521b", - "8a6a130e6c8efc4bebaede727db95a5c4b7770008735c7b7a0d2d826d59ed0d5", - "c7470b9ffb45f18db0861cadc580f5fa5acb88abd96dbc24974a608183ad58f7", - "dda52efaa1af691c9be968f2479add3b033012b58b7d0ceedffcaa1b2af9f65d", - "2d24545e9b749049734966261b1d366ada777e723b2346ed92247e0910bf8442", - "3d4d5ecc8ddc087bbdd965883f4e024ad73aa6b5b28307bc99a0abf9fdc701c7", - "36a061ec8eeaefbe75ed78b4d03586be7283824913347a062ca7c3f48a59ca73", - "fc3fee8747534f631f668bf0b30d8dbe10edfb65d6f575ac63d359a090c2ec64", - "98b5dd0b3f0e03def14361de679ddb4d649e9fac90ba72c05b9a958b9772ac92", - "9b70003f84d01433fcccd86e495a26f1a2a523de0ea31281084b0346831b7350", - "d8fc1b7159443531b37774bf36b3b68f028dd303e234608e99efdd594e91bae6", - "33246a49bb6e5409b979d69c88b989c3f294e8b198b0589fab67d400db9abbb9", - "4b2f027e1ecc29695d4d7c08582dfa4b407a43739500e0b8dd71465b59db3572", - "ab09d780e41e9f34bed39f040dabe7d16fe857244380531bf721851350ca8fda", - "8290fe89bea20a2f8809a8fc2056e24fcf189264ca96e255173c0545140eedc0", - "fb2713083eec86c2f2dd01770fefdf98d1707bed71e03dc68777b4019aec6123", - "9f3aa07a0fa4515b4138722bcbd2819a6db9f335eb01e9ada3152cd83ac64a3e", - "8258ac7898a5650245a83bc5859cdae8aac9a8ffe2d23479bdacb301b33a093e", - "cf15228ae5ebe6144a426fbfbe73ec671a992efb7ef6dfc302956d982ce6276d", - "36f94a767bc72bcff32ebb8979e873ee396f8dff968edb8b4870392967c03e51", - "2137919a89a44e4cdd275878f5ab9902fecea52182f49018b2e0e17cde769e9f", - "d5f95fbc5df6b2ff2013b5a7c9194753c073b212e5fb9562ad4e196aa42c4346", - "2026a06646cf3ac21ffa7fd25bf0f6e98f5370bfd2073402f503170069a61223", - "65c5109c20db450a4f2a872b2949854e240d00e1d46fbfa2ef6bb3382dd623ca", - "22b05f712438def7f3cf23c7c7421329d7f98e9912311421c3bfd48361e67d7b", - "b4b5e4246fea82638dc9e8b8333950d215b8cb24c800700b32b11c770a3f13b6", - "96c4536c175c45bf5eb523f3429dff60335fdce92dc6d1c0c55c22fdd36de644", - "61d6031ba8e7445ff3ad1b685f4709f93224f9f67dd54141146632235c2ec1ea", - "bdf27fcd3323a7ee8848757cec09c137809b49a4b66104ad48a0223b0de67df4", - "72b573f7dfc2d879789aba1a0ed44dbebca4830251307179f2b605914167c3b7", - "9306dfc5bfb6c732a32a50a11cc6a6a6207f917eee980a7e894ab80b115a5324", - "3d0cc7c4421f6104cdfe941a0a494efbe7ab43b18fba711f1e93ffdb48cbefd0", - "8507e040437e9e5ea101187a4f126b7c9fba919bf6e99929adac533b9dafc427", - "85c1259cdea39cc8b718f94007f047ae3f1a2d443355a4c7159dc3f720780051", - "33089d2f76fe92aaa904ac20b6e773902ee5c02ce51a8306d31f0dd2d5df2ea1", - "193ed65b5b2b7a0d2458d922f413e14c7d234548cde1cad958ab39db735b07ea", - "d803a67ffc4e96bbcf159cbf312b12ed4edb5e50f9b813945bcfef1e1dffff8b", - "eca8497790150528d823118a9887c826c166c3299ad385490fa0f5337e0dea14", - "f21d66991de36eb1579636697e87c9abf6d1d26995732b9de1b9239a1bfc5595", - "743cc8c2b3fb396b73d80ff9fba748a5482e49286703b86a8bd7d367048e57b7", - "ff6b73bf24a3f2f9b16a894ca9b36b2a900a8fc39eb7734a2d25d2fe4164c4c8", - "b112ef18a1feb905a2fc110c37eac65950c5b8132a59cc1daa1516618e51e9a1", - "0d8f9a96d37ecd903df8ef988f611e36e42b5c5d76ae595a51b4f7c300bf78ce", - "6a7489dad56e5df722bacfb6e182600230186732a9830248cf3a2faf16e67a40", - "2b514b05f9c21be4fd6aafdeba16895a8794f8162a194605a83131cd03e1f174", - "9455ff67a134770b6d7d023d4ef4ddf2fc8370edd5653feba5059370a3973273", - "202e1da35f47871a9413ead6386741f2b56c539baa7cc9daccfbfc640f40cca4", - "c253adc4da7739c0dd1ce0366f34a260ade9420a92eea693911c2d22e539b172", - "bd6275ba36176ce1fd378951b036170f8e5341c586773bfc7432578daf1fec96", - "f1aff91c3a74cfeb2394bb73e9725971e609deef0298bc5a89c8f73e2fa4430b", - "cee6e4f2ecfcaafe2d439d7c4424eda76497e7544afb9f57c837fdef9e82fcbb", - "c9af2192bbe2438f965808c333a2646266aaf3a8d6b70bf35c7ce94cb761a259", - "d74b2e0a6bc8944ee2890092aa963d576ab4b51d7df71ed672da25a65b88a8aa", - "ba9a9d9ca18629c14cbef40dd3a0f3a7015a6904e26d4abe81955a8a833f684d", - "4f363f4fb62399dcd35d5d4eb424abfb9e1dfac369e010b4e5c455dbdc43e3ae", - "ed696f750f9dc80b7e33b19f524047956707ca0a0d5acefc603345150d9b3383", - "e37ad0660f952fb451031d7845477017fb9163338106828b1a95e55102f7f8cd", - "dd07e87e2dfe0c4d9c36e1160e35eedb685e532b53aca9a421c8ab8d7c9c1cac", - "53b8c4a3008750d3962ff2af09494c8e0ce957e346e77b97df6d1935727d3427", - "382b1bde6c1a0c9087e28176844beb0817547e9770904ef77e4776376221cb68", - "b4c37219183cd6f21e6e69226e1b4f9599a099ae8c7ef2acdfb637b137fab8f8", - "0e9a20f6468806b42108db0c5948fc96584230057980978b5e5341cd32130c7f", - "1fd6df2f5a6aa8b56d92f14cd33f47a7404a0efa95e9ca434d4eb0847991ebcc", - "bd3998aef1319c465c41caa4cea454b16e63fdcd1201aeba44d83f15410c7508", - "15436babc2d07ed14db64afb75f59b0abb4f29632bb3c517b18efe5f463808f8", - "4235750b6b87d338c0b36d0aecee337b588802f01cbde9c0863b4271339f16e9", - "552f01368f598df48238c0a3a4ff55b487d63e56af713b8ff7fbd51c3916de59", - "bc72d8c939158cc7c571dbf45c3602113e40b57c92ac0ed4015e748247d5e892", - "878088170a242169534ed27502fcfcee4f6899f31f6d5d99ef69e56f43c66d26", - "c286d0e12970028b94042e0c6915bd905a2e62e553d5ebf7e6ec3e654eb32d11", - "b7d9081c5d29404031bfb4b9bb4c3e6459f1380da5ac8583aff204787fb342a2", - "072bb7a6b301fc0c018b3ef4d36624b88aaeeb35a5e782bb421ed0c393e2619c", - "4d8cc61fe5e602a9da1bf67bedc1aa7f5f0900a30567de48a159d7a4a057a0b7", - "2fe9ad0d3170548db81d2d3829dcacd734a9253239516fae54b31bd8fc2a3706", - "06650adc6f79e9130d61d47c70884ec14beed9d1b67be21df5fc06675016b8ea", - "a9f772da4fcf734b599e95f234cffd0dfadf3ae21fbc4907bca76553e5551033", - "7e771f7059c3034a967a2eea19ef363481aaf8fbf5f7f7881211fa5ac656340c", - "f3aebb0ece1cc657efbc07b14ac55d6e07536015044c25150c77996b090854c3", - "ea3f5a8d779e30386344d45ef0b8f8681cf04f6f83c4e67dafbe24b9fdfd7ef5", - "d9ccc1a9816effb2fbdb7f6e9eb6df5fc6479646ceef0ebdfff568bf0bee2276", - "789ce96a870be96584e3005b321eb82567412f8f2d50a4c1d999c72d9baf51bb", - "4eaa5cafb3653ffe8fdcfb95a8604d0581d0359d690f1e7997ed120991d983ae", - "a66dc7072d7aba4bc1d174d6469ab8387e6714f5db480cf5b12cf5da867ea55e", - "295401a848c1279a93d5f2ce980229185ec57a00ab4048663462257acc2d8986", - "57c9ac38eaac401418840871be9fcf9ee9de0d099d880dd203e33ee98f500d61", - "0c11642062bc1e0613278f102d737ac019d36a6d4a44832bf3fb90592a6177b5", - "a22b5e65324d43b840a75f63a9c9c1db1a269c0e102c60679e898926710bbd4b", - "028a9d286de91cbbb94f48d1b8ea217a4d03ad3758071da25cae29fc00f07c79", - "c20f857d21106bca363aad9fa58205bd9194d600130a66f8dd0d315b9d3e53b6", - "c72e529f1f2575a7c42187889c97bf29389ad5b0a7f2b7b30a5725541308f9bd", - "c609e9ddf8cc2c1d8535e1fe9bd122cc76e6672a6d1d9fd7b30731eddc5f8561", - "504e8c79c123573dfb34e682bcc5ddf51d35cf3a2fbc84544bc64db2f6515df4", - "ec94561541362e924199abd32d04c72edb27e681472f7f78c1ba465e997ed078", - "e4a62ebb0e1855c211a6c0842f83fed432a8f77c0bd120aea8b5693b71087b9d", - "849acaaeab2177761f1219168972706d5ff4068281806c11864b6f12d21b2736", - "3d6a79581bfa3095c0fc5cee4ef1dba12e8bfd51e5068fdbae4da03e1afe7468", - "0254627103a4559c47be184b4caa1873f65396157fd823a5cff6134078eb72c6", - "5ccd27266375f6516466dd4d7efa0b6053ddc35ca05aa21e8b54f6e9a174174a", - "febcfc8b72c03a445a4bb643dac73ea33e261862990d966e7e6c728364e98dd5", - "2e066b78badf9e5d36e0516e1dd585e5a388aeaac71f3086431385b34340f88b", - "0bc651273963f60f4c7c9d965b7c824bbfc63780d3b92d0bcac66a32d3f08778", - "c607460aabe59a613b1787ed3822d910f610aa39abbbb5ea5b7a325683ff80e7", - "cad9e27d62dba41e21225a8508f3c8a5f8aa69ac2b1c9b7b82ce758e5708380b", - "6c7889b3921da2fcbf456b07bda2b154bf02a60fa97c4402ac43c208acbfdfe4", - "cba11eea4a8f4b61d43b966573ac7c72e614b2f1f7a9c1d04f62a8c8dfbeba9a", - "4e73d871be574eb7688eba1af9bdde2b6c0bcdaa11f7f1311e88cdcc172ccbd2", - "b16b169140edb96b37d41aefb86ca2946c38c8e0514c6ba147e5aea41e7d8d29", - "68b8bb0318de9fb79edeab04602f3aea6d32d89d80f39667cd0f92bef2394fe0", - "ee045c776da5e0e62984ea9e1df0170f70e34cb8cdaa03095d8508c8d47fe4fb", - "0aa5ad31afd6c5ddefbe01c4f615d50011b6081af62e2aa838b3f00d45b20c58", - "09839c651b2f705a133cd425ed8ef7095fbb8323c6b317fcabff00c5de5fd973", - "86798dd630b7e9b7a0b49e5ecee8604585fcebf62d470930ce313f3dbe266e17", - "fdf1e94e954467c1dca2c2c492c32ff517fa7ad552dea107959370871c625c06", - "fb614fc8fec51d12a4c33948578c507d86e24ef7d9c0c5c54320b4dc1f0642cf", - "f5b948f3a2cd488dbe9b2c305fef75fd2f5836ff399ab2acff9704b6ac0e5df8", - "c2cb8d123bf551e32e54738f72d6249405945e2df991134c858fcd974bc1256a", - "0b3b287516d38d6d663179dea1363f09842c46e8233a4f172f8b20b3c9e97261", - "050d9710f2fed3ec1a3e20cf2bcf7e694faa5474fd935b0b52163d6da119a388", - "c0f7d399535ceff4f365867bdec0202e8d1bfde694377816b6df3983ca3cae9a", - "6e3f85e11a2c86678482d2f483ab22c2d029950b45761ac678577a07e5555074", - "4b16a5eb5bf41a7baf1923600d43ef93b0788a5c34d6f169952a83406b0a8d0b", - "04ae0ab98c63e0b7cfbb33e9d09d53805f5ba8ac64a9fda78d8acf95837c2879", - "ffeb9b01871984e80a3e387b3348ffcb98dfeafb8de30c7730aad3ddad203093", - "574ffde367dd1d4828f803111b55bdd0f3b89b3f369d87f34bbdafb044769dd8", - "89b83787fc800bc93f16741d4f31fa099a641017a7e2a910de426ac018bad9c4", - "1361d67cce5bd031c534feeae67de758d2aa7334cf16832eca6574e2308a2d1e", - "b946eb67797aaf49d2262371a65b92f198625c77c564fcdc1b8f4a96aa5d0c8d", - "54a0b17d3b9b54ffcbca64f2d2f5764dbfcf1ad3aacea01858d6972277f0fcc5", - "09e4a7656f0c4abec3a5eff67d48ac434749e6837fd778dc21975684f37d5c57", - "3689ffa80978caf7cf71b65ce5efb187b5fd9293a216a7eca1e0602bae944a1e", - "3fbdb441c9a5145bfd8bb0c0744cc8c46b4592cae4d99237693d595a04a0ebd9", - "dbb3c3648c317d548bdf80a3a317087f9bc2a0d99e518e99271b23867538b2f7", - "2d2cb2b7c8e2ec259c5930dfc1d8dd189ce1a162aad70aaf340444fbf68371e4", - "d54176ac6e6a55cedcd62eeb28f476214a12fa95d62bf9fc069930cd8b38e697", - "325740179664ed056c5814ead1791cf267588143f0ce4820bcb91657e01d1fe0", - "bbe432f2f67bd137e25214777545c0a10e55fec44083cd41855f973f146f84ca", - "19723bb3bc26298bbe0ff74720176c0b4c7099181e4401ea1fac5a75cc99eea5", - "82b896f51839a9282aa011b91bbd662b2bdfaeb1c13647f0bfcaba4cee57e992", - "62e3a58e8089fc93924687a17da612f762f752175eb1b87f73fb4e1317e7e8f9", - "13f078a3a0d9a67ed92e49e9d9bbfe022c3783b57f12f6c7c49c9c71f1d8aebe", - "cc90209e8ba2bfb92cff658a8f9642c7647ff96d68e2e8a2209948ebfcd2f43b", - "606dc38d9c62e96d56d1b3099fab12cd10140efdc5faa572b6fc16d4baf4b8c4", - "09a5d7b7782052305d5f5a7faa98f26e9165cc6a3304d88e3895d408dde0a609", - "0db99bb8b681527047027f2c8e4047480c39190e895ec713cabefdbd8626163c", - "65ba073562be2750426f275368b66c4ee79edf26888ac38f9e60a293a6329d63", - "a93470b4551b07a14c32b7a47bb23d40f3b86728b508be9f7ad208c01e2c7971", - "06e357c85bcde924428c6188e65d4a42f0363a150e458c18d58668937a1877d8", - "c98f181722fc8c132a519ae4166cca9c8ec0f045393bdd1d9c47cc8d9d86ec6f", - "30ed7d7d1775fd9024d1192c8f9dc3009eb9367afa6785d803a72ac05fad6a4d", - "12eb91c9d03b0f7edadb7b7f020c320110142893cd1119d714eeb14e6f52d3dd", - "068ff77c3e7f0fb154a33bf6608a926d212fc85cb393f4223d976204a92ecba1", - "e6e7304cae453eb2358095149302f6a4dfaaab3ac11e1bb8e745eca8bd9ed98e", - "74c0ef68dd455dfd21dd0ea1e7dfcd364f7ad033f8dfb33a4ec751ebb05408c9", - "1d3cbea6496a8559dda1a26f0ca05c4b2ccff0b64c50ebbb326c8b8596d88d8f", - "e7c665671fcf087edececd836b0374704b02ed6162ab0a56037e14b14d5bad78", - "cc699fa6222856a665681935214423e12674a82ca2044aeb8de7c284e92b20ae", - "8e621862fe0375800b8860f7b20efef2ea681fae822bb8e5a7d7955fff7d09d1", - "b1cf5053edabf29cd247153b9f55ed0f0b85b4cc45e8c6d87166d38a679edfc6", - "7c4ae544438453ba241356a8c8513056e91a155b9420c7fcb17db1392fc30830", - "e3505fd80df15f74342595ee2de187c0e2932fd95da5ab19c900aae24240c819", - "3dd271b1d24bbdb3beb0b5abd0366fe0aef824c808ff475d12b619a3dd12321e", - "f3f8a94765d9587a00f9d73a47bac526bb922a280f9558e0af1e758625e9716b", - "b14ea502d58f05321858a01426b46369c84a33c00968230bf33b3886e6c14312", - "e208a2b34146fa6fc6025d974efc2d8f3dd0d6b78c9528f9b007a88e8d0cd9d3", - "cb85d66b3bb9a0869a978008c7ad9e75286a424e3c13638e4f97751979cbc81f", - "a45910e7931308a4a7b21bd48f2508a27a8ce2ae119965632d700938d40c5100", - "c26bf5d9fa6e5a6ab2bcde12038f8d9a5ffd97b8876fdbf1ff4aa6fc320a9a7c", - "e0735fa49b2a88ab2fb680ab674f1ca9e2555dad0c4a671646799b3839d4ab8e", - "9df7d8aee0ee540abb893692d38f78859db9be2e54d74b28d0dc9a78fe836fe6", - "b539abb96ce59294037f294f7248eac6de476dc7ea4c6ef02b28fa8e27225e93", - "cb934885f45e6c4addfee1d9195bbb374149d3fb4d422d67cf2185877da0d8f6", - "2d54b7420460c82a5d78e83b9ad5cc608d4cdec798a568ceebfdf3cb42d965e5", - "da2db2a4a3891d08c5c3fb3d205ba4de6fc9a14310185b6430076c0202bf1314", - "7e38bddd09cc8aa8a45e69643ea9ab4b445431a83fe0b863ad6292f31c4d40a1", - "b9a7cc558383051f2cebb2cc08642742d53ab084fc01bc380ffa83bfdb687758", - "4f29b20ceaf877a346a7c3332ffd23e60aa26a12a46a4426d7660fe4adef2423", - "3ef65745f74d1b96af7258d782f8794c98a89d71ed3617fafb6b34773fd055fc", - "bcf9544831c7946dabfbd2b4e4ff216223845bab24d0315c07b1ac5f99744956", - "fa902d6e3390d1c5b1bdfd7e383b1522944b0ab346b6d5824a8e192daf849425", - "78bed5cc74b79a2dd14424372ccc326ec6c05a502280db22f6383e17faa4d0b2", - "ec76574ad5be7bfb2123e638261f30323b4dd6585ab5ae98347f07c9c83e1419", - "cd61db65fd1ca902dff989037a52f121ef3a44e160bef376a3703063c9652838", - "c1b2f0296dc96624c90d71831bc3e9d84233bc8ad76ab8ec81566a35c13584c0", - "3510dd7cf0e523fd07ec1c62ffd1683f1d1205fa7834af1383264110adf1b2ba", - "4a71074b9b5febf4c0ed5475f68c262c0e98f56b40b100820c0e68ffc0539c1d", - "af23ca0b2907a0532b48a3093dc7d3d0c6777ce5b14767b63716bd75f514350c", - "441bcaffe704cbb880aa7c590c26e9247c3670ff833d9e098bedf1f2f1edb8ae", - "79e72aaa30711ea3a8f3bb15dea068b86efaee67f2d3015e6e3973e9ba296fc7", - "1f38e8aee313086671a9636249e6f03c0451fcbc4c9de7e62e4b013459286dd1", - "18f622a84b52797d44f5eb7665f62b9c7f3dbec65f482085e305e0a971c8642b", - "922c3bdf8cf3990a78002b5e9e623c1938e31a09b43bb22936683b2a5ffc0306", - "2e7067dc64f532dba5162b1be07259d2ad781f4d02fe21eee112418075277881", - "fd34760ff7dac973c2b98dd80774b3560c41a79af92c3c366dd4e378629e1ef5", - "91b07a37b59bd952a0ea75451e62549c02007392da4eaada1079774d2a8e5ab9", - "28a2eb1bb598a80945f8fd2350bc3bc9b009eb18282346054d51e25154a2f1dc", - "09d6481f1f94f0334bd9338208d8b7f7fd43f7b5ded69e1c144c3f361f014aa9", - "517092f5bb3ef0d5fa3970fb211700e3b05f82e6316eef50bfbae7aaa823e1f4", - "0aa14369b0a3cff7f4a364c1482f25966e7b3ef629742774ea90464882017e70", - "d7b9482a5fca505f1257541e2557cc8509d574c84bfadd3ea92692e923a99584", - "fe88eae4f5193a13aa8c7483ead59a2acf694d981a65636eeaccbd87a92d3dc7", - "9f03d175cd38d15b3ff34a9efe20a24c534af08bdd9cca55fbfd845e0e5c7f11", - "e57f51019606d93abb24bc62db74e2d53846101562d1b62e67233cdefa2115b8", - "c47526ab60a58d2d33cfa81f6c8c34f5e5c048fdc1ca7e6723d85a27acb47091", - "06d6ea66538a4d45bf6e6b56cf6778c622009960f16f7e717f1faa6d17c1df8a", - "e050cedba945b83ecb7a4443a85796edf2df6511c7c34451300818b562c60708", - "1f378a2579abd1ab41e0ed05ece9a3d23216394e726b56ab3ceef7dc30bf4855", - "907c7af8e53ae90c63cb74334635672fd53726c205054239c3a7dc0af828b448", - "687cf7adeae9ce0312cd5648e97d9dba2600c73067a7f68bfa34f089dc28971d", - "8134024d03edeedbc2bf4ad859b858cac09a94f32a08b56062e72e9a3d56f6af", - "700615274b0bde6ff4507b833f9278e60245e4eafef6fba0206775b6d3481e82", - "e3201a0309efed812b3a25666d86ba30de183bb3fa21dace90afe4a223ad988e", - "853a2c66441fca27818244dce8d40188f9bbf7372ff69179d31cc30ccc836a1e", - "969f24ab9f3f3fa6b3ab88b9c630d82d138e4e292ddb28774b694a837c7b180b", - "026dc5c3f7f5775ece81a7b044c5637dfab37af769dd1f790031dc1f54870a1f", - "ec765a57bd68f1ce75b0036b8bacb9616fe28b83920c580269e4cd30713d94f1", - "3f7434f51cce0db783c1e0fe01d9724529bf93433ec95955112edf7bb4d4e0fd", - "c0e230f281f641e113351d2a5fdcc3a32a07d5915a5f2342e480662f9ba5f930", - "32b2c48cdaab0b5656f6a8024d1ca24b552648a23fd9c1c06cbf3b2817f8b11a", - "189f18c0869fe5222d94b054fdda3fc65cb2f3d15f59ee56f56ce9f264ac11d6", - "d035afeca13577ff2211efa86c762d5b88f8908679cdbfd36bedc3f9a1126faf", - "68b2b675cb46a8f13d2b3ff7b2c1c67f6df4790cb62868936899000e36ca6880", - "58a3bf84f2069cf05892d4bd0f05e6b39eedd2088f6dc6fd0bb6037a9dcebf28", - "56e7bcfd10e45a48650dff18ea1b6ec7cb51a3874f4b8439193b584f47085597", - "d625b8446bae2c1ab696d922ba66e3ebef1e3f1ce0d48a16a0ddbfb278231035", - "5702f61fdd2f1b0b2824cb4a63fff30f89a6d98e6ae0b8f27775e12a17b8a142", - "698ee4b779231b91f579a81665897d31df66920255f07bf47de2cfe63778ecb1", - "344c8bb9f07934ebcc7c2de5a24dd8d7f7d9959a8e09b3d9f4c7c8fdc3fb0cf0", - "ddfccb396fec00e087f51f3704ad66dc77586e6001cb030dee12c89a2f263b6e", - "277f01c851d96c2dd272d39122e15ccc605c5679f9cf4f83f2e0cee26501c8c4", - "3e9bad552af8c4c457747767159c4511a074985db8b133c4f1a9adc0530d6dad", - "9ae9739be23a31755dc0728cf54631844fd0c9202d337ec09e70995d31449973", - "a671dacf6fb24ba3e9a701bac1ee37f50a20b2cafeceb2d0806e34dfa148c045", - "1808eae66d97859c1d60a47b130eb74bedcd903c4f4cf46bd5963078b7fe26a4", - "e8d51a3d07b36a0f7cf99b31b5d84b0fc76af9a99500bb85ec32ebf834ea99ea", - "67b766a578850f82c7dfb01b2183140cd666915b3d11504e18a753c36ae8dc3d", - "5b81978a6693406379d4a5ebdb9b9bcdac79ee838d1a52af370a93f8d7394ced", - "867cf19bb64ab28ffebe1d1139f8be9f97b856df843a6afcac91c424c7ae523b", - "a3ff4072b6a62574376fc66cfcac11d4495fab5e67bb8d4db96913fae015a892", - "590ec48d09cc27d561d1bbb5c067593125db666168a8954a96392b33d2e5adac", - "624215a4e28a71f4a77f22138471f54c62fad269ee8007e92302f2a05136bbba", - "776065883dba14beb70659cbce654975328d2dbf9a8fe9604093672f25ea7795", - "c62dc1b6fc38f9d2f30e410a23b3380987a2755a92642241fadd647d038b57cc", - "21d8b4839956b7ac7933c7859ff96f6945cba4e815f55716363b1c8ca36d4fa5", - "97e6382d5a567e004b3da1a322caff543acf4b6342d08cf8800f77e4dac7b2ca", - "bd5e615a6c924a8c708aca2afea357ffecf3047127188aec5427bf97b198fba2", - "9b45f38756f7b5e293bd518f16750e959d59bfc00cf7c91b529d371cd911de63", - "71db9252b122f716dd3b65928fec675ff7b8163c4914f6b9ff75bc669516901f", - "1368b15289fd52f608b4ca934591abcf4ed4d40f52b4105a6b943be3976eaab5", - "60a8bd9cf14ba46b0794e3c00604c66de497ae6ccf54a401c043021c9c15eb92", - "9d7024727ac49cab41edda24c57017f12821daffd6f16a50596bf347e57e7fd1", - "29983c9c83096a628e530ab08fc85aa42257a0da3b6c80179407e21236cb088d", - "40f7522bc94a44851cc7f7a0be73c5654248af0397e48ba55b9437d673844fd1", - "bf82dec8bc979eb8e58b5bdf51aff539b42d9149ba6003e41ce1188e9f119f70", - "d18447e1c6aeba95ee26f91743b30fc9f3fe6a523dd9746cf83b38dc01fcb83a", - "b817328254c4f1fb8d18c08b56733b4952cf60c88f1819e20a1cfa5cbbba41d6", - "f6c86210a1269cb9de457f1d98b5f4f13256766422d67715815b217bc13f8497", - "ec9ad7d08b6abea6602020ab0542b9825ee333f49ab7e86600175d7c3bfb6f6e", - "4fca4610684bb460a91aacf99c22aca453aae6d18df4de1e8284e67cbf7a44dd", - "7e8af8b9ad3d2deb8eb05693fa31c177f1bb0c46374e897646fe1da09af0023c", - "73fc9209faa0304740e76230450ee7fb565a464ac5fc9f5829d2f44fdbc34755", - "a75a5dae2a4e48c4ee492896a081965ba4d86042f9348d76bac0fdeb141b1caa", - "335afa88fa7a163e2cd4c503d1106995ad31b2f4bd930dbd8921f6e6e54d1c5c", - "98854778327119a2e4211dd1ddc77f39963ab2a95b1e8a97b452ee14b53088af", - "91f846f0dbd5985968264130b34641afb51ac891b30ea2b291eed680eacb7294", - "4bb37f6c76396af21148093c18a6d6c1398cac8f2793c7fa384b4b60dd7205ce", - "becf768c70fbb5895bb2ca926adc3c661c09c1c2a5d3953bca22e59fd7a0cb32", - "7397086a39f56bd2d34da7dc49ce5d42757c2d6f557c22187038282c360115bd", - "2e614bfa832d4f81f669ccd8972eb2028d82143462e7a204f9f3253f5e90a50b", - "8f76c845b36b2997fe9f0671f68d5a422db26174f6fa1e2fce6fd181421a865f", - "9f556f4d151462e05d92335a15464ed4fa53bb2634e97ffe4b9911beed5a8ed6", - "842344b377025143dc45673c58cf5c965047304e18d61fd8827808680f04fdf2", - "4f7b8d807f719fcf8ccfbf4794ae5d745694674a49086550ca2f928fc5c867cd", - "db2426866f791c60096bbbdf1f239b20f8b375cfc739e29e062d85c43b7e81c5", - "8342dd8a0697f80e1953e807d6c51713f91420d75f850cf2ba51d077faa4f55c", - "273b22c00761abca481cceeae14b2db162e26e217dbb77dfcc6bafab958790d8", - "13b63e705c4d2f2f403e07f1e30e35899a5b22d327910297cf0b1af1b458d038", - "2ffa62bf371e0cdc62b3417051a572737411763f6eb4977bf6c4dff442c13533", - "aa58f7b8e4b00a5ac6348976fb74d97d5e4b94705659d729d30880cd4dd3d635", - "d1cfd2ce18014d2a3c372ff2a1a37b6e99c1b22a8836ca5452742865d79f56f7", - "28b6d884ec4d25395e9a7c955d577ed08dde0948f5069e81ca361c95e2c17ccc", - "881ba3a98a438cc01a7b36d0d158117a06ec4413e520ef9d24a796b9b73d5e60", - "20c2785970a8657559d4c6c80f3498d0c92908442e2b83055a985491911f1d07", - "14caa0eca06c36d2f4ae754d0681e12b19034d7a31cc5b9dacae48599ba99001", - "be45cf09d58045c74cfbf594bf044be72dce40a3b45318c2e4fe33c5488bd112", - "d9d7823824155ee939178f882c1e5c9f069d5d16cff27c852f497844ae7275e9", - "fabd9fc01fd1a15368f6b51849bbd011e9b49a31dc7a948641650f3fe9127110", - "e52ac8e8c52dbd78f050068800d15ff75c42f502f91cc346d9121e222b49baed", - "08e7037ff0764b2a5c7815e4f70043beaa450104b22cef853de0869b387f1795", - "21d1d74fcc4ad47cda33a417b7289485c566bdc5a9e2ee7d958724407ffba9f8", - "96f622de99c0d764963bfbc655a39c4e8d1cb259c48188509339931cda3b533a", - "a34d539de6ba86a24a18b96d96ba74184c41b6de837cdcc9d31c20ab4a87df9d", - "f25c1bb76e48c08e51e16a82759c3d013b7d138a0d4a0b8dd41bd36bd272ad42", - "62d68d3123be0c06982f51b37b537460463fa613d9adeb5e8107730342a2c525", - "8564dbe287a3c42067f0c211f9768a96d862b60860ea5d5f80e264d32d9036c8", - "1b84fe732c7fd0e1ee308e04b9a135a8767a0ca183899afd3d436ca3c385f7da", - "f76bd3e9f8f27e029332f06322ae674b40b437457aaaf9ec582777985547f3d7", - "0da6afaf96194364e43ed2ec553da80724cd70995218e9448e0d0281c24480eb", - "3be914385c7733a2a4060286151d8ed6e76977460fc81f14674eef8151860716", - "a6de09bd1365aa8164cdcdaca1b04a1845197d5e1bb48aa5d85b28a265861a1d", - "50f3c4903adcfed69e0d646afcf92c5b20cd36cb665a87f72fe5b1da2fe849c0", - "e02e0a1e641a23f0c236fec63d36f28d4e35ae66b474ce85730e9f275253322f", - "15aa8b0a4d017c570a1e71883982798e371f959b694c3bace7d50c6d4f19a6ac", - "4070b16b5f12fd529e9cc78eb0e862cc51403adf9cdc5b5bca4d184109aee161", - "058bfd690976ef6122f1fa6188805c70e3550a0d1baaa6a9347b2b9761809f04", - "d91e3ed2d01a1b691af7a8c35fcecb8513be4370e79134b51aa8d5e4f441b43a", - "b02b043d40b03de9f54cc8dd9643f905d8cdfbe7c3d6b67aa55c3a8d9b678a60", - "132242c7f340177bb210c4fe1cf91aa7b16b2fda82bd15b205944fc2991a6168", - "510a896ead671eaefa50ca5f957c66803ebc76b3bdf38596a5eed3ecf7fa9522", - "a69f6125531a7e70284d64ab581f1e79d2fb749d37d5272d01dc6b01940c8554", - "812ba5b71e695dd9fe49a5148ca273f7f2fce3b888917e11b5a6c16594734963", - "70d1347a14714b717b057098221c67a705f2c28f77752a4344cda74f6a3c2011", - "a6fb12279539abca97557c0b27ae20b6967086e4f75c573720466430700cfe74", - "9dd15c77dbe73f8cc7728d36b438f3a75e3939a43976de92a6864d0f61d8ceda", - "b468a19df192d1686e5632248db7967ad830071d28b734c7dfe22cfadb511692", - "2493017cd84ce81368cb343e04ed9c035090c9c5ac7ebd85eea9c5dfd68db6ad", - "84f80b03963c1e5a7ae076160ba898944122ee95aa10ac3f81f7ea43b51d9c50", - "5d03dc3747d595f02218f6d8a0d180674a8a602433ee697b6f8d219dda542ad6", - "cd231094e3eb62b7615a50872a98baf34e4b11a5d04f9f1dcc0b0be01e75a2cb", - "629398a84b44101a63c9e86245a7bf5645258b914cacb901cc27d7a999e8de51", - "c6fca4ca88c986bad49efc18e5817d59d6994cd6ab3ad1fe6a35425feaa11992", - "f4328f6e88f280f4c22afcf7f296a43d35e36dc449b6ff49c5d923c17acf3555", - "75b8922eb5ee6776fef6dce9033862939a461566b825475f7499b1719b3ab186", - "c19c617243e63932d7e0adae5f599e7a72ce5597503bc17fd77641d9e3a0d426", - "baf1f20962347b825aa38b98144a5cfa9c78085f99be46317f81f87c644f6839", - "cb54bb3ca16a803df8c2430ddb77dc57e33e540f24198fc4374bd6f86e522903", - "a881adf26646a44f92cc29c868e9990b7eab47013ee3d9979c63e295ca5991d3", - "6d1a29531c201df1ef13a95f40a0b5b4ce297ba033620adcf6a9a0511dc6b3c6", - "90e6797ca934060f1a4add1b1ee548af885f7d1d66cbac2d4011e71e32b206af", - "df4c2c4a1e2e61f4ff7aed70b5538327b547143327cfe5964716ba8130b72ddd", - "1fa8eea8622c9337869c787157ae129816bf74a39536cf95d9f2ff212c7a1321", - "a1eaa03ee022eb77b4823eca8a40c71c9272fba561a054f42a0ff39bfc08abb6", - "6eb7c77b39a593b2045b6f74ca70e2de5af7e6f2ec4e6b37f4ba5fcb914c872a", - "d3e1e28b23bd7d824fbeea20fafe43009184d46a193180b921c4be001030334d", - "dc1b0ef8bf6653853fd1c0a91c85f0b0f8e88d92cd0dfeb4d3b42b22f6edd45d", - "8474006992952d68e74cdb829ba196d55dc30bf510877a499b6b50c5b6660896", - "54b21cb9b820cd5b50d8da4326a273d2949514a81169e77f84b416c5342f2702", - "22d0d1f1bb4637c7e1b8b899886c74db9706acc3525f635a9d3f2c97237a737d", - "ad8462ebd1185d16115f3f301ed3e8f32141f5729f771545e20e50533b40fc05", - "520c99c31f6863c4f47bb007887a602bc7e8bacbb915fc4bb488d8e9146006d6", - "bb095fb9db36c35c2f208b66aaa7c5913fc8f069f94ba2126e806cc554ba3d7d", - "4222576e5089e3d132d54b1ab9b4da4ec6a9c6c8403bae6435b2365e311ddd2b", - "8ee28602e091a1671aac84edb4bba71539a3104b5e5be1d16a685afefdae9d78", - "64ae22b1965b83d2763274a4bc2a0678d25c32a192092ec184c52047272cf7fe", - "0d5f4133f95cabb03077b0f3c957d0512061ad2375175c4bd217251c2710c124", - "76abafbd1625bf8dd8398112548acd66df25e01f1fed90250cd4d50d3f61c7d8", - "af8170d9fca1c8691b561ac24197fc03e60aa876b9b351ca54e75b9532ff08ae", - "11e109136b69b710ad5ea5aeba456b5ba012ff674e19a1e5eb3a42ae14289678", - "d507adeac47b2f32677c809af36c90621a652700b87d16e5f883b94d7f7da4ef", - "6d81f496e5852cab7dcde30ff86c2f32c93ab520a7d2cda99a52efb6c171a96a", - "6e715c4de1aa9de90583953797c1e9f995037280ab9733c3d36c90c8a6d79b80", - "bde02e9af656828c3f8ea2deb841ceef4221ed63c354fe323ff98fcd5bfd78c0", - "32529219ea3c417828b7109c3dfc5b44ab3a78d859c1a30ef05efb0f7c0d1709", - "6757997add1e047ce91b6574b91dcdbc99982812e02c22507dd1030797597221", - "18dcb8fb53656839cf9cae3bbe03b0c58b740850a58d373fa1bcd8ac8a94294c", - "668f6f94e653f071a0bd41ce07235b7f0407d68c099674b5ccad970554e35278", - "693579c6694e267b4705772a3ca6f53245ef2f5890deb76d95688aefe3394de3", - "7c7ba9d631e6d3a47a484c0924e1da587a7af970abe861bb1386e46a8bfbfa60", - "d9d0a450752fce0d717e947384244d524a78e1337ccd699ecb901b06736d3a56", - "58253e28f78c7abe2b61a7069390e035293506689cf6f814bf2044b51d8ffa59", - "04b254e55af4285af70a5dc69ba38891d6beebef0e1c16dfccda0c77a39ccdad", - "657ffcdd8af3d78112c6e7fd13c4798e0c928e042f8e3754d410db62af38ccf7", - "3c6efa050a30d63b6388c48ff38830b7b0abb8deb8a161f61ea7272f52c726a5", - "8e25ca1f8dd982b83edef27af96ee20ed3927abba586ae56ce1a06df8826d4cc", - "321e3d2e595e3d9740676f157e5434227e8a10115ae1e85f82f38a88029537f6", - "37ff38e26a690728115492218d298519db10fdc87deabe8f87bb7d81991181d8", - "1c6afd75ac31c40ee72dde8f62ed3804df2d771e3ff68b912b825d1260c767ec", - "ba89ec0851efd67c679088d721db19020ef033f2692fb9088dad24ccb6fba32d", - "8be2603649eeca170f14753f1185c7feb94cd58550f863c741b9ff39e6faf7cc", - "95cf14ebe44f6bdf1987f181063bb5a81b8dffa95231f06a4d0a2ba3376b8dc5", - "2be452e3ff012a278f284f52ecbe609ca633f3672bb8dad18d775e2a8382b3ce", - "b1a2e1d78df7139c246e1ae0200c59bc0749982b624ae63f335732269295d77c", - "6b5de423e99517a6e84d18175385704436b11ea3dc26430df3fec25eaa873e44", - "b704bf0ac41586be11b8b46486825bf8de46e69e720bdf7e16d150da21984d93", - "5eff1ea9b40b45423241a711505ef96c89771ec6a870a5018f2ec5adeb77ea9c", - "b1512b55a86433e4027efb258cde922014037d804484dd22ffa347d3c36abfe0", - "377ffaafd4fe40f6400dd030e42ee9960ba57b71d50eb8e7dbb1e57bc13eadba", - "b3ff82ef66d637e148d278419673e00aa3223d5deb64b53e8a2edc3de964eee7", - "2d6619d7edae2a7db74933627101cc12dc08302c3b5989552c86a723deb167b7", - "c43944b8dad3b8caac4f3a37a4505db89970748558374811715f0bd4e762a7cf", - "2714eaf8a8245804b000645eae7b48c847299d71862b992ba84728b6b40e1766", - "c933993e0ae0cdb4acc7a047d1b87d1ee51db5d52a39dea8500a1f1d88cefd40", - "c616d6724248301e6acdc912de2fdbeac8909f15d6a05e1ed6e5729601e748d1", - "ab4fac80cf42157956ae38774c25be47c117fd0d9212f4e49496489699e355db", - "c4f38f5d7b24321e4b9642da30ed1781e0253d025e29fdb450015ed657fdfdc5", - "73949189f142e37f23e7eb992b1a9f05417bb8122110b38c3fa0962b8c6402c0", - "08c0b9231d889dfdc66de231972ff42b3e126c9c44ec829db78536324a02dff4", - "5b8af9aa598e34aabe56fc1a91bf0f66939d5a1bb1d8ab3126e34f63574ae283", - "82ba43222cdc4ae1c3da0ebc723a2a666408f9e1d06391d0192e02b488486f4c", - "eb0a78bb8e04cb904658c7b38aea9fe70a967f6151ae8c0ed228d68ae455c674", - "40f2d225d98e3f9388d67381686ea5ed30cc5e4981495e87f20a904dabab0ab8", - "90ccacefa5ed388b6928a5b81094653168c289b1aa683b2bf465ee9267bbe1eb", - "217570446fe19a04223e30220d44ca70d30789fb6ba74c09249cb388b7142b3a", - "cace67f6338cc438a6b5f98f806028d465e1d108deec24c1401dff3a23c91330", - "f965a86391db0db489ba0c4cc112ab13da2a8deb3076fe428086a6b2d16830cb", - "4d95db8c46c071ea149537f84025ebf49fe838085d14c276f2703f153522bcc4", - "82856a8757b0622be7058c305ba2704ce74a6d95bb2296e80268dc953d07480f", - "a0e9d472cf32317911af3f98c23d4d4248db6ae98bd0e5ee3a638420c8ba9a28", - "a1a78971a9aadff6923e476cf2634106898e911d622e72e89426c1a38c4b62ce", - "89933580672a06697df3f4bcb46a300deef07f5bebe458131300cae48fd4c886", - "06cec57e3c0658e99beb960f4a46bb4e32367fe3df35cded326b7da191a776d3", - "8486b398b26285a40bc67e8924768b3b159e6fb1bacc3ba5892fc68d02ee0544", - "c44eec7aba31c09270e1b6d3d0432e5e44bba45ae82b679e71edbbe3549e2d49", - "9ec0bbcdf79a5454629e36b229ddf7d586ef53f52e7705327099cd768a90ea18", - "ec46868ddefa92357c38fce1ec2d51d1d08a40c92284e9224473a2059851b142", - "d8a31b794e5c8ce7a1b34d9b9af344faaf8964152f8845762b5504f906ecdd9c", - "1b3ca29a4a9e9e6310f6706e472a1d67282df8481853b6cf80844b0f072a1576", - "56bdbed956ed998c76e97a00a2069c179e7b61c059568d048e0b6f8b735f9e02", - "fedb18beb5f787027cfa59419315164f3a4976a68d94ba72c930cca9e685f911", - "0e7c9a450d5e17141346ec1874d071bc2caefbe9f558c1e087ca8400a277e27f", - "a315fb53ab98621750c3637b6054fe1e9a0a0f9779eb9a40bed13f60228ee98e", - "a047e2c94b638d4d17b325b50adcb9a03664f8b421301aa7c76cfc6a7a35629e", - "d9d94cd38aa8326aa813713d17c161d6a0aa5ea9b54c80df2fec1312310dd938", - "fd1ba2d8469cfc2ce4f9352f2f883fc615e1fa8765b5b11c7b4f98451edb1b0b", - "9628c3c56b95786b87b19a61b5aacf8ebd8ae82b6a9abb67c01ded17e2ba0585", - "7b42095149f6fbf4abf14f33b59c72750c12a2acc2d4b27810acef64c52a0c18", - "3a8bdd19c81ef6152f098249bbe17aefa01b66f69e1548146e4147f4cb09a0a0", - "fd022efed64ee41bb2408db858aebed5ed8aa78b472842cdcc41f0dbe8360116", - "738960f256ebd041d28fc5e6f0f81c3149aaddb7b27ca110d54eacd6e8f29561", - "368de19de00e08aa7cd49ecb1d7a09abc2a27e58695daf3cacc0a5a3946e3eae", - "5e56385fcba399f6022ada3ea90f6da3e9d718d2e94e08085b95dac4feaf1158", - "f86d21d3862159c1056488bad3c99f97d2a792ade80718df522122c3125b5e2c", - "ecdf6b9afc08f59e8519c31794275ed7f1ea497251154db610cd95694659f6af", - "c62328aacf2c317ab3dbd44a26eb3bb9d485b6a65cff708fce7fdbb4acd10b13", - "85b66e0226e8e644d49375b884a8b8af58915d5723f867f009bcc92cfa33d844", - "994e6131f71143818930a51910da66d811a0a0c3502c03f71b491407a4468a8a", - "feba5de5ad5154deb3509093795fd939760d9b43cc9cc13fa540f65921d97f7e", - "402c96cc46d27b59adf5450ed52a6a017ce715f654f59beeecfcc0a32f9f7ab4", - "a44d3f4ea0617723cce0d17d81940348c53d2b176f059034ff121df2268ae554", - "89be32d78a5898047054c97b7a771acd53b52c8975b6830cfeeba7953404fd33", - "401102a7896b3277f466847d6835256f47e03b330940585caf7d5ed1430fcd5a", - "4a3cb4249004e8cfaa65a957f900d4253f56674084015ae95f990c7cdd7ac041", - "b34c13878ca17429b9c73fb0e51fd718e0635467b0631b32c83329f93d8c79a4", - "4fb9763d3b8a61d1ad0b33eed6ef4576d55af08988fcbf68e990a003d8a335d6", - "70f6b64cb8ac3827df813476c8f722be65cdde68abc215ca88537599669d756e", - "17f391ead84a2b16a4c3c425c20fd63c89820bc706463cde28281935dcd0a590", - "6c8c228346b90ed57cc9c4e02cb511a5da7068d88e86b59e861ddf70ee96f553", - "1fdd4896778c0ab453d0f5e8d3e8c6f2431153fb26d30c1ad8ce435fb5836c7e", - "d88de94b847ec48c3d7f4821f4def16bc79cd770aece085918e6290949222cc2", - "4265beaadec5c5f96cfc0e32b27e3cba44a7dc6d86985943698b23da24d3a4a3", - "b97928ba4dd4241aea9f634f5eb7abcb401365c83150041b74376bde1caa3cd8", - "977e9a20585a90e6e93d00940218f279b74a0d33aece998230037010cd0a0575", - "8d204c1a33ed24ea696340276012016fab8307d31aff9920f5e05a7546970354", - "f4036961a47f1265fe8b4f9fdd922a1e66b88155e37146c0bb5052d60881ba57", - "00e09eec40d180b9a233561c5125a8006ca51083e6a3ef4dbf707adfbb069429", - "af55ec148cffb93357c2fcf2536e9e31e1339a6c184a52743e9e005cf4343b1e", - "5ef9851ea2c5afd35272c443008ee17943e6cebbf79bc032310986a145b00104", - "3bb3acc4658ccb92ecd79243bdb102079b1e7c4c8e5c42235ab55e302a53936b", - "af0781047b75207bf92c4a33477b804b52025290023b2578a9d9f370024de5ae", - "67fd4c4dece77afcf8bc52d932a7d04a83fe2404139782d65e5c79b7a2cbaaa0", - "3b49ee80c2f0253da25dda5a3e9ad7ea149f1efbbd4dca210a4fc9b043975064", - "61c7331748594c1795ffc9e9377988a2be7cccdfbf81397eed6068d5121318f3", - "66f02f80e5afb2647f6b5f335eda57589ae54526fdca1c0301d1b426a49a43d3", - "311fa3d581bc1d12765dbc84313a280164e0bc2f8c7890704766ee71fbc9be5c", - "5163775c405e84c528836cd704abcc544155491c9a6be3d25efc48e23914d4fb", - "cd0292c401735870bdad0e352d1b559145f3d25d4acf905a5e6c1dce1fa6b4be", - "d1dca60b9f5326affa4cb4ad3a5a1ea6e816cd79cd4e46e4f1b5d91bf47391c4", - "3735ea931457ff6c6c995bfd66f2543d003339fa009cc1c840ee12fe3c2a95cf", - "f53da675463a788bc0e601f79a1e4b3b5aea4f546cd591d30794331f8055004e", - "89c45c26942a88cafe9cda8a7d8d46537d24f978c0bd1b3da17fc8d5bc0c6d39", - "22c539c41c9f06c4347df0830de385207c4cffdf28412da80d492d875362aa8b", - "1295113c4203a7d64cb3c893991ceabb9e27937a2997227e6df65def86c23f46", - "fcf68fa1523b782b5b1720b768da3c7375f92e070d8ac2ebc258d52a32892e64", - "3dc230057a2f4b2699130298c5f469e97f6d4d5dd5e6589e260c86f392f0b1de", - "6b2974c86689678e321a35eb72a896aa1c2291f1d7b367dc227f972f760bf9c9", - "d4efd2be34efa3c8b251f3ecd75013aadaa38f482fe9b7d8628e56d1aca01b0f", - "95dfd741bde9711f9d5f1a16ebc672cb08c30642ada03da858435d39ef498635", - "3aac4607b7d9a16e5c17bc0d6e0a1471755c0631277001b6a7b9fc0ce257abe4", - "6b4b51547a7aca5877ced1d217c5a7832451fa3cf7c8ef6704268d39b357b69f", - "c793fb16d87f3c93046a5040d4a9a55113c3269f6322751ec9d6afcb84c072fa", - "6d2abde418f5176f749302790be50b043876d56b6a7caa106a07134a0fbcf7a9", - "635ba22876a06749ce0289c6d581fd9d295068f3bae155ebf5c61b62c8a862b9", - "8033124783e95bde680c697b709baa9b25f304b6a79cbce07e374dadb3e71af5", - "0822ddb38f9e5cf7576da4f8b4647b4feb5528e1e98453b2962a8edaa864a802", - "9821a9e940af5a0ed2af0ccda3a7aa1e34ae83caecb7da77618a5a3079af7988", - "9f8b031cd1668f8845b0b6cc5a92f577ef0e71a1f81cad0286af92ab3c24a302", - "8232e164e7f8e44688747003b1bef65249aa7ad6bb4dbf6db3a78a3991ea7ec5", - "3814155abb38d0ae9b49c42fa37b22d95eef82d616a126dbb112b977e141f6f6", - "91785aa286f479f160c91312485754ccadade650e3629047974f1101d4d5f4d3", - "89e3a9d464ef741accd91f06cbfe671e911e78ee2ef74b6f11f80a2f5aaeafb7", - "40bb5b10cd346288fe14f226478f48daaa74bc813f298d1d8c218c4095155917", - "ef000326e133247b023f0ccdb853b5dda8716878cdcc45eb131d09773485e72c", - "2d2c5972ad7d5cfc6e36f92e6f171cea17b00cfb0763f2135f599f5f9733c0f5", - "c492396cff35209901e4bdffbc666d2e1e76a9fb3cd3294243c065e9efb87ced", - "7a380f53242164be46aab422ceafe28f8284c117cbae2bfa32558972ae4f6a4f", - "8aaf064575dad0e840087ef8f2b750345b75478f9afa3f2c4957c5d5f2c0f353", - "139b6fce165d10bda5c1aafd226de76b681a39b3953521b45961f9108f161312", - "7420d389ea9d209b5f62be4c72b7e46abe5e38c62b4f5083dd0947159c702693", - "c6fdae99569e0110e5b17d27a8ab8e1e98164c444431a46dfb068f29df6764a4", - "35e5d706d0987400695565ae12de836befbc4737cebf6b35222d089a844e1870", - "84aa8ced7cb7b913f1c323555458be6762d1917d4814ea1d41eac3dd2171cb50", - "fcf1e6ff735e5c0b30530252f253df74efef16230a91cbfa90fa798525d2b79d", - "a9f159457e29fbe6b3ddffefac7a3ad6d23141a6a7e4754cbf8577582d6efee4", - "2bf804651f94b5375134868469e63ca2153f497a69614a75eef70fcd15cd761f", - "087139f1ee3e2bcc351a3c66308785c45e61b1029a1dacfcb8bfb41b03f1894d", - "d1ab1af4e3cb99cc8012037dddfb6a35fd638e7b9165de73f224872f0cc92efc", - "26d81849fd06829b223281a480a34ffca0cf8620032775f9aa5be103d3bddf40", - "7a743f54e0abffa7377cd50893c13ab47d4c7aab33320976f7c34593d76e8546", - "54bb214e846479851843d0e4b01ab439bf3fa35f8bae6f24f1933661ab98eca1", - "736affc66f71b8ffcb6c35d23df90881613807838f437ce407195ce4e298828b", - "f2dd8c0ff7a1a63b3f2b39247f86e0e84e46558707df225363bb406d3973637b", - "554e2df68183259b1b6062895bca60993ed346f2d8f369f0b29147b192e61f80", - "50e8a5c22e96bd5ac1660cabaab6c690bfcffb5a37aa9273177ee2ea9de7acde", - "af9287b0688fcb760d043f4342ec4e22c570ae3aa80644518bf75cfdf7909415", - "4b43c7eef6ed425f642602b75a5aeb9e5dc233eced16d045923b8c46328d3327", - "946a608dcc8db8e0cfa2ca6b71cfbc3a2b0da932a427e31f4351104b9bd1f301", - "65620dd2652083fb0522ab1cf4ee597ae00b3e5765f34301f6b728fc48081444", - "2f6bf279924257e166e546e1f321bc2d5828214d9c72c2c4ca7b2fe1bde44a60", - "c3067f068c0962d4653a1234e18b6d772514891ae398a4d3f51384fb3611b9a7", - "5723fedab830a814169772cc254ec84175a7358cf0ce6fa9e3dc1bb39e68e695", - "2018ee2d3c7400cf962372c9468cc47d7b43d248b7b22f7bbe6576e49baaff06", - "0f32dc72fef69939f8d81fa390e861a85dd6e4071b8eb778d47a41389cfc2c0a", - "f71d516fb982e1f2df16faeb30a537afafb15d83f481dfbf5bf3b50536250705", - "d6009065206a3d6b5e235e3360ceebf2904f28702c65861c6a4f4cd157435e3b", - "d2cb016a281b9637a4319aa4675fbc464130cc015c3f499046ef522d3376eb66", - "6d2691d2ded1c8d8103bc0aca7cc07ebaa195f61c75c6b5a0dfda1d7d7cc7e7c", - "a47208c9a08b658c488d82292fa7855aecf189a4802b9e85e7077fa2b75c89b9", - "c52d2898d364fe8aa7ea95cd217d7d22a8da4ddd8de4d3953e5a182ba7256b48", - "f28aff92f67cba113e140b51d7944e8d4e30c84636a544716e2ed465d9a6d75d", - "9a1b8997847e2ec29c6d1948f798e6afec09821df71218fc6bca0c902f6f646d", - "8faea0eba5aa46bc960dd2aa52d9b85a029a556e6d4401a04dcc0b3f258849e7", - "a7da158be9f120cbdbfb48c0999edf5616bb5b74f40b5b02cc93f4cc9f0f818a", - "34a705d74451e462a2eaec23a6a8992c307dc2ab96932c56997c2d143ede3774", - "c20a4c8449038af4b9e71b4424d49e3b2546e80f936ec91ac811912ae3648802", - "635684ba9b0ef83b2821cefe56324705a8f80397434c171797c6e3f95f629da6", - "d3299f44a1c34c33a657a74c883b0803dbd3a7dbb6a6a92cc0035ed1b7f4e0b2", - "180ea893d99d0d2d350d3902f90af27738cc9ac8619e71781e06278bf9eec322", - "11e7c84773ff292db3dd70862397a899646c2cbec1a8184da08559b82495a7cc", - "f67156bebdbcae5bf4d1b7ea34d244463a3203e2545e8d409b45118315b8445d", - "fdfadb3beee7102bc39aa20ea763d2995fd54bee56c742f1af0263f451d6b698", - "6aa3befc14453da86a8b6ef68a031756d213d9fd14c497d3c7fdaae1efacbb41", - "e19af9af5e2f8f3b8466c00f5ccbb9e40d5b32c450dfa9a2d9e2ac59ef8abc8b", - "16335256980990154bab26548fd79682594a562bff800715c4a2637069ab7bda", - "e255256e15b6d0eec94f78190af8980adb38f75aab77403fec3bdcc5e2de3fb5", - "f720d6e9a8524e4f59d04ae607dd44925dba4d9fef3c9acedea2e533b0390e6b", - "6a457275e845fcf0dfc43c6025927d65d3a98e4b2d5fc88ca96ff412a1d1b83d", - "92f58861e0324fe82da61be05e64e46e370e85c376baf8e92b8f780965ddf99e", - "9e741f67626784da1ca4bcb0b65ae9fcae34fc762cb4e18f29e8ee7b25a1d5fd", - "5588978c1c9a408efe0eaab9b7ec277e0efe228b99f5ea04b5a0322e878624cb", - "d7ec63249b058ed0319b72bb86ab59d86af25ba3a77ad59261a51fa950f80ad1", - "3d7d2992db7d4452b818ee048e6374e11e7bf87c28b35b2200036f11983e419a", - "5b04688b102c16908044986d23bb4551bb1227e2d90c3d0dc35b9edf29f19fdd", - "9743ad58f9be2470de49a4a70121d0f335891cefd27a7f3f883d1fec750fb611", - "2bd31cf12c87ea6a60f145746939d08253cda246ea8a9625be163adf051bdf08", - "9c431d13ce3e3bfc51a94c276eb85f96bd98f247e3505dcdf06863a7ea22f599", - "e0fad82fab2994cfbc937aae62af468449745b5256901fdb1ef04cfcb84d2153", - "d36ba7ef1160e449cf864347c30d439c6bfdcdd534df7fee2b08e0207c6b62d1", - "ae4ace7fe43ad8bc51a0e8eca90d91696b5eda2d902b773392b3bbae28ec1f6c", - "f6a78215f51d30af7be8b8eada27d6b99ad96947b3d2ed566130dfeeebcb6f08", - "a2b4a0453dfed440db0a2be8bcd69910956b9167e270077067f86e842812ab50", - "e6a617a87d6f2cc8f504b4ebc812234bff910066e292be30e7f616e9ec2fad6a", - "0b4e0704cc9ee63d34b445f97a1c4337a0529beb290cea82d5be6c0206473a69", - "63ce79c4ef40120cf85cac95a08f9f27cf7f2f8dfb933744f14e998dc414d6ad", - "82a1963e7183d154c81a1f7e24b9447181ffcc34526bb6544dd0d0ba0bc3a96f", - "1c504993b850d10cf1510081d5dc8e002d09c1060bc4c26a604ceaeb54311367", - "9322da0ed4255d5986d999e7ad1fa3d6c0919682c26f5e70336598627ce8908e", - "e036ed21b1ed0b481a1d16a947ac3f705107f641be47278c24e04b50bdaa92c2", - "55eb8f25888c3613e3aab63f865e9e1e43d5f6b0f3ace5b8edcd0a35e5fee893", - "bc0d68f8a0432eda3b4bbe8d9c1a577e27bb11ee5659a39c39bcdd4a95e33b56", - "bc72b4a7d6f2a39d5bcf6b1201da811ab0ea992cc1069c9570ba71afddcd30bb", - "4174a5c90f9953849936db899ff9c072ba3f37356049fd6502cd8d149beabe54", - "fed8aa5c3a6bc3bf9c7abb79a6798454f70bbf7882b9b7ca801849fbc59ad980", - "5065e0e74b699866c32acdae84bf05e189c6193659be89d83b058b695b9d5140", - "ec9a5cee6ab054c8199b017bceeaf90f319c8333f300a6a947b0049bd14cc792", - "d221d277a92c16a6e9bc7f5b4a2f5ee0c7d96d7f3be7e71aa54bb4493143f98e", - "3cb234809e316b400e52a1d19231bcf9b397d6a57be92edef920b1abbe49113b", - "872aa1197da2eb5350b2ab468ac4119337dc77ead06a2113b7edbd7607b50d02", - "ee644f43a336d9aacbebac93b0874f42a0d4e4b379d87609141d46cbe270ab06", - "d37fce8ce4b41f2eccbf78f754e4068db5564624ecd51ff256d69bd69f462e1c", - "469645a87590005dd0d319403a36a8a7a7f1ae78d3439b394441c58b39bbd0ff", - "4acec76ca2bd8c680dd98833eb7cbad2b5bda401e70999586de3101eb2936cb1", - "23aeca44daae4bcf9b7134e53e2963a98ccfd0df1d6c72461545f547f4355f5a", - "719a67b33682111c76fba894b658f32a57bfb3cd6def60aef1b4d27314399f05", - "fe8a61f5c99c2df0adc34f957c08bdebe3329c348c1a14bdc8665aaa5b735fc9", - "84619b347674a7e6165d1a2242a7d8d121e9c9e8b265c9e5a110e58ed276431d", - "4e8278f0354eeb8f8f3d0eeba80d202eadc6b905e652b91e9eebd76d0af0f842", - "08162585d9d13fa52bb097a9dc14a5e681a0bd4873ed13fb2d4505e8d3d0c1e5", - "d5d5c759a4cd0785bc30fbc59a16b6d869cb80359b0dab820f30ade2895611a7", - "9f10405925d69f42f3ba16402cab0ab530fd2dc4e36abfd120ee3f3f636efd94", - "5561853dff064ee2f1d1f10e562f83b77e62f50f97b001b9c943f76faa763a26", - "75b331595b340c23f14e6286291134e27677834e2df297ac3cd9c1f8488df92f", - "9df1418a0dc01cbecb031da82053314e6b298d6ef01bc912308e96872607f07b", - "f9123717462bb54431ffc03ccd1de8e20708be6ce8ceaff97bcb0e78bad28043", - "897bd54003ca8e76a810e6709fa64fdac175111ee90cb18bf17e13128f0680b4", - "83c79418a2af42f003ae91d1781ac25847c45df04cf95550cf9b51fcd842870f", - "e4bbc9ae734b584294890d58bf290c696884777fe29f763b1200fdab0a5d0de2", - "8640492240f28f5e95e9948283ff594c03bfd70693942f2701dc2dcf6dceb588", - "5d2dfe9c9c15ea87b8d4c5c0261d9f84e9454c4647da8d1cf7ae86060b714aa2", - "44362929f7edee6cf1ea1a3b0d0fd4ca757dff0c8f47c04d70c8f1870c66259d", - "a194986d05652398c8aadf5d801a87e46c1155902e238d2b3b7efdb5ead28d3e", - "6e8daab2262bcca003617c815cdb34fee38d57d36b923e73303ad583356cc981", - "9f23bbf15625112f7faecf513501a6b2ab3822dfc81d980996934f13b5dedf71", - "21b6c6c7f5b9535678aa1d577f42030610a84ac9bd1367297c662e32fab97352", - "118948fd95655336e5df2429e1c80781c4d797b38edce7da1d2c0b2657f3e906", - "2ffee8b7e0551cf502002be2e77d5fdc6c9002f59a5de1b98d82598f2e87dadd", - "0cbe7e90c2b0a144c6379b37a1e90701fa3ccdbd37072a48915ce34e3df405de", - "52da1db9db78fa67d02b4aae6eeaac05c20f3b3261e7531211fee670a103ab85", - "44b997b1177b69df051f4d031b7f0557ae69966361481aa9170da8bdd39f44bf", - "c0be28a334fc68a34797cbf87807ba8ff2b426883e95b7c2c4de1942fe0d21ff", - "456f38884114adaa42eda14604e79dbbe36c5dcdc261fb331661586d0bc749a9", - "f927ff0d187a746a2a5f43606ce4c164e4eaa4f91cac359ebe3518d70f6e764e", - "e97c88fb561fe1ee11cc99af81bf169db743a8a9e796e2d67f72b4221523d347", - "215709db7da94222e624c2f35016c13ed22bc977100f1e4e3ff13af420981c0a", - "617305f0d84f6bfd82eec603662c2c4247a0c8d9ce2a8005445e10cab082d9ce", - "d324ec2ad50eb671b96a2ce2786bf5e81062817a9c4f437887114bada4d3d431", - "6650f5f9ffcf3c38748424c83eff40edeb66c453d13c5693adbbd5deb050a543", - "4ed86fa32ac76651fa4910b48fb25de3618b6e46fb1470f774f8e39a41f03051", - "4063534679d5eb741c5cd7462a3250f1ad16d096c6f14c9cf0204a5d7e928158", - "0625c2d92eb14dbf5f6522866906f6083af2c42a1daa13b1cac10124d2b49ce4", - "f86132ae013602f3cc71b70a0f7217cca5834e78ec9ce1e414ed2da0f2c0c753", - "4a4390706df79ae2ee93ff33fa744ad7250cfd7478107130e099c6fca92742a8", - "5d7ea76a7e4b62e6347b4e48d7d4319dff819682334ea11c5ee34997f18e5eee", - "48c15fe88185d82f0ac74dd9dfaeb409a142e46651ce49e39df24bc1d0964ca0", - "97c6e82f52cb95ad26f1555c6a6d184175255b45c92bdae8df92eec0a897aeea", - "055507ffb2d642f0bce83d6b16a78f76d7ab3a0c62967c86bdb0d38c5d0747cb", - "8d936a70bd74280d189d19faead28f9e433301e15be8ab5dc45b49cfb27f13ca", - "6d9b79dbebf5298858b37b2be9b25cee9d91e6b1c005cccbc01045dc21f366a2", - "3b49df10ad5d3508f46c4a3f34bbfe45605c464208bc2e7b2f48d15ff5983466", - "a7c2d62c2cfdcd66644d6687c25f809a9e7c0641be19c25708812ba4d4baeb71", - "10cc66951d145ce28b475a515bbbac52db1827da67156b118f29e62a516a5c7e", - "29488108321d1e552bf7601b7819e5841d1428e21bf5370906e01fee98523fa5", - "d066f13f35c68d205cdde294f249e6756f90d007b553f7b15d194f0fd439ec8b", - "eec2718fdc5c4cc56ff39c354322e007a518cdc2d80130ed50b39b13e1b0b119", - "9d11fc1a25713de80ab8095ff55f99869b56733afdef7555aafd76ca970bbf6c", - "77d7d4d8d8b4d747d05698ca498c3dfa483296a2e89338b7d497e92f503e5307", - "dc43d892683d425740f22fdb4f6c7b6949ce25de445a4bc28110ad474cdae9b4", - "5ed430f69cd9a2dfde3bc8bfe6435965d938833ee526ef3278d7d3cb05beac2c", - "e0ae7da41763b56bdda39d9c54215daad0a15fa163277939a19db0343ce8508e", - "8ce31748dd569e7bbc9493adb65f630de08fceab796bc1a061b753fa9d2a7e1d", - "f67e77df8a3c31009c7a97e099ad2dc67134e219677a96b7cd4acaaa00325dd9", - "48c61e3e1ee505abd63d0cd2269c927719521b8386457e9fa0cdfa9d117a2fe1", - "dbf0935323e7e37369ab78c8e8fa4cfee5db209adc46b26710a688bcdc971d1e", - "bb83928337292112033a883e734efe4e543428d0718747ed9030eb91761ab21c", - "d46b3d7acadd9d3e8659e7f6ae003167644b00a546c79eb658b25a11792a012a", - "f54a08349daf6d47e59ba5f4a8c55c12e32efc348fdfa451045b1eb231a28cbd", - "a6f3b35781ffbf6e35d90e65bef7c1378f98403a29d95b38bcb1538660c7a627", - "c76fb928882ee5af66f1776f564869dfc8e3965a473ba98a63b6d70d62d0a1c6", - "6e44bd56d80e18c99b8a6f0b3c80a1ea911e08c66fcd41b5bc718db48534de0a", - "ff1f3309c515639769d3d087bdda024ca8a873408880d268c51d82d73a0f28d0", - "48c6cfa02c6f8d1de576d34194f83f644863b3205b37c005a58a175dbfa56a09", - "59384c952615e22d0bd769e01b59acf5b0af3739a45e136445fe0bc42c4d82a2", - "857698b4acf9135a9f5629f72b05f3a73404266b4b9b65565d0c19f2ded9db09", - "3c253c631ccea20e781b0751ed1ab7fdd8d3f0941865a63387a7019a36811c24", - "b0a653bb86c01881337328851b533e90d8b409e974b10f0cabf2ad33ecdbf834", - "c9236a4d05dc475b2be7439ba2ce34e32d9d8a620cad9276d0d7fa0daaf484c5", - "5ee83ff80abf334160fcf6517fcdf751c0999ace9bd1e8688c723a765e81103a", - "6f4dd4787c80803c41aff7231eb10553af451b3bbb2833df65cd304a43aeaec1", - "ee59459fe54cf1837fdb248ff0abb11214f08c36e7d4235d6f1984abc120a42f", - "f565045daaeec7a16710d1a682daf4d517e290d324e8b446ee7c26594408390f", - "b0be3b152e9960a9643eec45ccae2fb491b53f7ab4576f2bba3d0d230d27f9b1", - "8625fef3e467ceea534491b8e6e55ac490f7bc7ab6583e1c67049ea985b72f01", - "28c8676b9121a11f2455f6dd8925d4b501f0f60572adf38b99db32ed4e7a3ad2", - "8952aa7536fde122f15d8c399a97c42e1a6af09b7b03b581389ccc8ca1a9384f", - "c3eda53bfd52bd2e259bceea93cc3205264d6014f8903a41d6d0b247738190ad", - "78df30356ce8c3fa8587e60add843a3018447cdb362fecc5ce3841b2dfb4b5c0", - "ab22b482f0793b331cb7a7c90c8f7df12636d92ea913cde9612afb2930ebc34c", - "a9e190d803e2fcd7da52dd3a676aee5150117095f60359041735d736ed502d20", - "c240578e9bca6553202f02dd9a8f064e4abdad3db6c226e6c404044d81698dc4", - "35bf0bda0f8d1a39fa372cc06ba30841815c7e0861652e2eeb596f926cf2c049", - "3855f87aba7475e84cc1bc460abdf4f59c40c27b97cd7829c67ac8e3a04ae5e1", - "a141cfffb43b6b21ed487ef138a5e6db3cbdf7fdb86533e4ac30c20549de4647", - "3522697e8b2920d04f3e550255837002783c0286271245053a069a70ceb469b4", - "866e7b64ddceefc93c51e5295b081b9f852714b10013fbdf0352993130dbe2b4", - "18f875d10372cfc53213802c44345b197fae6a11a0302272a175624f71bceeee", - "81cf27b233db70cca7cbc58015f95c5201bf8319d9fc6f42d38320a120e4d35e", - "fedfd27020d504863e7b37894e2af81558158b3e06425376fe576a1c5f98cba2", - "47f98fe79ea517cd595ebc3d745c7329c4094a672f428c0a883fd775cb219d2c", - "589e6365898e81ffb531b2893e5aae85d18d9ffbff9fe95ab3532cebe600d7bc", - "86e93c20693306276a154d1383825779e189ea384af2355b852898b84dd9a670", - "0c068a6703323448f7d0b68ec81e56fc188a4f67f33c93244a2ba216c92ef7f4", - "af1c14d047d1979ed6b50570f0e095d04189af601ef099001f34372b265c1d1e", - "25c4dfb983d6bffc27c5215b9d5e1b63ab0e164cb6cdbf691a128bc2782ac703", - "2b7ea0ae3387d24da4594d38f66fb98da5d9094ac4179d165b81d9cae659711b", - "6b8acbec278bbbad1bf0f8836d2452ed422de7cea86f20cb928d4841e24f3ccd", - "dac37f43b60cf8fd248dfc5c68681288df20e138c6ba46e76ab727552fbe5585", - "47ca48def048166a1535aba0a8ac586692e350d53ea30e6aac2f0daa9ea09c85", - "7d071dfdca8263dc2565ff7dd240035869106add4e8af221b532e4393aec1774", - "1542f0da7d62686378a6a7916c0377040aa92cb5debcf8ab77ed06fde0093e25", - "ff034154e5c68ef9325297c412d8e7497b47705a5b56ccc6b373a2beef1c37e5", - "551f1d1fdc2ff0ac7232eac803e5296a717e790c853049308a8ebad71232d567", - "71371fd8ebdad908df6f6d0337726b70185a475c8b83411f0446c7a24d09dda5", - "9edb67b3e0533b61a2628f83689a3a0f0ee9041b1fafb6921d2fa16583f278a7", - "2a9fafc4c66f8cbd5eefa540c469fcf1445838c15dde79af3f00e8867f285426", - "696b298843c796ff17cd4ab918d2ebc6e347650d9c56c1246372432992a404af", - "58a32fa2b97160ab0dd8ee544944c8af378d0e7b527e0ddc316edffc3044a100", - "263378244f92dd96ed96176efd0c8df1ae8f888652bebfa6aa99d226c532a950", - "fdba9dd287d8e786225b9da059b5a94efa551e8d06fd846cc89557ebfea583ca", - "ad1d9cc9cf1e1014902033669de47dc98a3d0b6f6702e874380dd88fbd071960", - "c274b7b687e252ab09eb8a168eac9a6b1aae5b6f090326570bfab357b671d02e", - "a2886cd0059ae64d08523c2b663feb56d1f9e6ac4bfe9a157b39856a5e0b8035", - "452812e2b71d3a686911ed6be9e84da31f52ce85dda42804fd35126260a3aa4e", - "fd7145c6a374861844c2a693fabc3d895a66e77e6d76923f74b0da0d94e0387f", - "b47cf4506acd57ae8f09f7939196ff6279077a8296401ee410ab764cf109b14e", - "3bce35515e14d8646bf7c4affe776f606c1b813d7496f906dd4191dba16e37cf", - "c13a860beee87249f63ce09442ace8a90701978c1a9d0d220ed0c0ccf9a49289", - "71e888b963d1abb363d555895e188e13cf4c81f2ad9d8ca5262b94cdef711907", - "00e0f9d8805433f177bbff644f84b0dfa62d25c11bd1c975d362d72131823466", - "80e36d3e825b75d92166cf412c599227f7496ad646cc4a063e06aba087be6d23", - "83578aa899dfe90f6a269291a774692f60759d7a8a6e62ffb1602583e976743d", - "a7029d52f2a00e8fd2e62a8d0da9c8e0173512c8633fc83748fe549b9f8b31c7", - "9ceb3b609e2a28a9550d001592fa7f7c411984c3e0b782f8d677ca637d275493", - "7ff41bd119642cbc7ccc72d02967e73634baa213284e64162675ac3fba5fc7f5", - "30880abfd372176ca5bc6de4e25d590a2d7a1e06a889bbe80da4ec9fcf43002a", - "4d701338dab36234dfc41740fb162ae715b7ce2fa7f95c58e2d9def9ed3b16d6", - "44dd17060c582e4052b505e7895f36faf3e630505709f8f825940123bcbc0df8", - "d9ea3a48a1d593489b3464d609b32913d09d847c64e303ca9705c101a127c4ec", - "2e6673b41543be84f3a74f79c488de4c212265c20c2154f7631b057040ca3a41", - "4140c80718c123411405ae4e5391401696f756e657dc4aa3bf4a5f3933ea52e0", - "99ad0142bf2079d8af0ee96a47720fd1531d2d195b37ebb1f4295f26a4d747ce", - "1113112904e4b4791e58f7cf31c55e158cf23395cb0c938bc7eaabe1b45c5d5a", - "bbf60a60bce37588c8239d8c43fe859d9bc8a734fa4056fdb71e72d2544efde9", - "1d0bec25c0c8ae023dd7dec4702a2ea9d776229552a5f6b14611979d97dc6816", - "d3f9b3a787414b85031ae93eace8c3a7d9352de952dba1c3079763091e49ea2a", - "17b2981afa5b1c599b37ca57759b9341a448c369ae0ca5488b1c240b4015f979", - "d6f75ee90965bd5a7013bae16dd180b7991f55f93952b9f180071a8fbf791fc5", - "a1c62af02079c56a5ec5f5bb9d236a66ad0f5f9efaf5e9acb32ce6154a440ae9", - "4824432c489012132c3d9930d59563e503d8f5e1707e65399f5b509ebd0c0ab3", - "a7014f59fdb2e3ccee3e089f4bc7df4a75dec2e8a0635077f4d55157af223696", - "cf1ff547a2cd9554f84757362bc991efec87c0315801a92ec44f054588e52ff6", - "fd1df5098949fdbec9d7183e809a86a869c6311caf1da545abba598678fb24f6", - "6c393bc2e7bc4fda93725efb284ccb8a705340aa7e0134c0aad8b51235cee768", - "e7c9987e40064eb03ff2e45a63cf6e128e6556b2f50019009ed7c0ff81211650", - "783d328ff3157a356472baeca8646f3595ebf7b28d62226084d09dabeb46a145", - "fad9ea7703f17cc9e02729eb915f37cfd4810124148a87b4ef4efa9ea9ed5dd8", - "256ec39afc0983f3c9e6902bda630cb097e6684d829ca3c1c1c45caa1f8ea442", - "54132adf8a2b552f464e2512531ae734fcc476d3d965d7e0b3e84157c2d5bb22", - "09d313cd3f821c5a18110b48f86ef02a798860a16499fb144c6b735e4d51ba5d", - "89ba9242218e962a834d0ff5e066c6e16d2c9478907d4f0578adc52aab02933d", - "46b2ce6d4ee70c5332784305a03c907a6487c1f3672faa9463a7c4c2cf3f0d4d", - "8ae24db37f2899d47a6924152d22b7dbdfd988b91943ae0fa992893ff4594ecb", - "e6b53d9d1822add02350ecfc0219afda80653b5322da4e23f91e5388484e6185", - "15bfe0b7da769f104dbc6dc46dad36273e1eebf500535b81359219e768700503", - "ceb480d291042f09291c6abc532fa0e920bf0767b266db26ada058d2d0fe7576", - "ccac7b54c583793ed2db405011e2252c2c8ff93eb8386096633ef86c2ff29f80", - "71ba2f65550216b6ae53006640890fc5731381f7d3cea429e5cb882130df0cac", - "a054aef8b54bf861e9a26613a695b1da35b5163395abf5aa37770b6d4964c67b", - "4a3d061eb202cbf4c2603a8b834e0b01b413b0ea25e1e369672fd9910b9a5e32", - "174e163f55c7f88bc9c16e54b3249129b3b029ec7f3837c653e99a4fc5ca7e85", - "66fb7945efa8022d0dc1a57d1df1147af230d60a4226a219bcccfb0ba773e5b9", - "3f3b06add19986aec353b6fdcf6a6a09c5ec94f0c786e0e2f57a2ef679a1346d", - "7e28d7f01ae376584a956ef26bf29f55b8f33f5bf51d637068c4449bf29d541a", - "079ea78739eab910398aa6c3d6c1ef0455d2113469ccc8ea92a8a28f135c1fa7", - "2d4e95de224c8a8f3777222621332795aad34994bc0034d3fde3a2fa15b0ea27", - "88f309cd0f64fb380ec8a3cf9db16d38dde9d26bac0c8e31b560c729a37076b3", - "50a5d3d89932c0dcf02bf052d47041db52e704d690bf39f1413d81224ecbaf67", - "48d7ff5e4ea7647404765d9d6c2cf7b280ac15c08e49659167f210a8593cd37a", - "90d311f53cb3a55eff5bdf9b8f1ac5e30500bc8535ebc1a2d8cf04bc639e0b1a", - "7b5b52046942454332e7ed7928f168eab0703af2a5cd6fdae2683e07344d40ac", - "1e5de049793511d0b7334e2910fa926ec8d4c13dc04b30f4fd4406742f48b3a3", - "ca819a3907994d69f387b613c9c15e0b9fe3ec8ad52fcced2e9d2cdc88034119", - "33b1626e2e8e9755389348ee6cbee540f69903c69fcd74c766937606ce96c0a4", - "79082be27fe9ccbc7e4ddc79102909aeefe540d9c20860f6ef978a4e9ed4414b", - "ed62a2cbce07c0ebadf9be213b2d78328c6fdbf5a8dee6a55fa602a8597c0fca", - "a37468076a4079fee1aee7c4b54dbe7f07889928ad22a6141473e8b7af27d767", - "9266a6a8d27706001d44ee61d276e216779d361d068df4d0d2e2d40403164d2f", - "443de30fcaeb1ed427efcd88b98dee6a8f7c8f3baefaa555f0997fd867e21968", - "52087ed528ba2ea6b3023acd2af9946303a748e786b26027e5b7d124cdee988a", - "3720bcbf0cf804ea29944fceae36176ae7736b2f752e32c296e23f0be0fbd065", - "0978dfc71692e5330ec5de20d1c30dc4babc575ce9117000667bfcca78c44699", - "055a653827b9edf2e166419a168dab2bff159d8e83e93922302886e6fdba370a", - "915d0346ccff228f678c7ed42abbbe53ffcc783ad29d5100d5ebb10d232c6635", - "978879039ad5363bab0e5622cfff33f0e550fcbe8d12a315b6f3c1de84f735f5", - "742e2c3e02ac9c3bb7642769e95e38c08679bf6acc279b3714b5abe1a99ff4ec", - "ad53c0cf08311ff8bb1b4ffe0586737fa5bf104b70f85512bba8db7399ffa6dc", - "d7c377b89d3d4771ba9d7dbb4a552dd6dc2d2f27ceb09931a358482625f13cd0", - "375af29d24c6353407a1cda0edc544a083e2e17c9d7042ca69979f5a7a76ac70", - "c5bdb2ed70d574247c36fed85806fca56a1b698db889a0e75efaf531eaddaee7", - "2e62d58635b0efdf9c58deaa41ab14990c87d852011bf372b5eb575df6d83268", - "4c980d49704303031724e97e85edbac0926b891e3bfcf93bdab26776e9d26cba", - "3a8a87b73e8174567de3bbe58611b4f747fa131aa0e68833823d4ff36fb960a5", - "b28ac090af42712a77551eae76d8adc86e6cd4b821e95d7bcbd387a639319653", - "ce8346190a2f659b735fa2e9c888e75253e9c8dc376a8113146ca629b37aa88b", - "0069cc94321b9b64c234d49a48780ff95fa4ebb2e1695f4e1f3dd60a68f92189", - "be6ed9897ee9dc56c663b3e94a33147d867cc80e6acf974f0e68505ae20de001", - "66e6dbdd0c1635e58e58262c15bf249d10564c13191fc149a1cefb4e497e29fa", - "f527c3e95ec69287995b346ed93abb1fe463cd2f9c768f77559f3ffc19536d45", - "080fd36a10ce798e426accdf5f0acefeaebdd49181f56be5a4b7cb126af43e22", - "64064b33b2443f6cdd2cdc383fa0e7237efabc6a9b56d12d1553c3e65da653b6", - "82488a6de9fd956d5d15f8e8288fdd7eb117933e8913d693d275967a1708874b", - "089f57b6eacf603e6ee77301f47fbb41c76db68967242daffbbac5849539da09", - "00724b77ac69ff4c79353d5b0c0e18185b06ea5b52ad7280ae6c929fe6b95ec5", - "f52c50fd10607072a6ac95e3ed8f109c4f40163e1daed6826a962d11d3214eff", - "8e4a0983732811fe9a66c44b853d0af4aefffa19a12d4931acefa73c48d6dd6c", - "620aa863a06950a7c4e4f186ab215ded801d4ffdaa97e8644454d0d5d0427887", - "01a2f30ea5bc8a426f4146e88d41c2aa32055666c7b5efe707fc178b09e21603", - "cb7e565ed9b14e2ac2f603b4aef6a4922d550b0cb78d8ac452e8ddbe3ebe4bf4", - "7bd0ac57bb3d0a4f1a4effb871787fd8deb539d65615a9dc5d905548dca1ea8b", - "eaee0da10aebdcfc977866b1e1b98a0955e5f3f2df738cc0c39b1ce4d6d120a9", - "648fa39d98b240bb86d2d2dd65f4d9ccb011b62f45942141e200182d5e495385", - "29ecdcf8cada5051f8b005c4e8eeff317db6c849fb5c8f88f3470732c0467665", - "1ce4bfa2e4182ffaa7c52eee27c03f5acdd25a446fa39853242b579b099871c5", - "85eaf6ef2edd44163ad109ad751288cc6bdffff49b81e68a480d08be7cf74c52", - "450f1b847c8a395f56b6d84c982419e4e0d2a09e448556a3786562643a9971c2", - "54d0c6a94a100386715e62fbc0d6cc9b1b65419e502843ee691bfbc9b027b268", - "8717935b0ab41778f380485652581daa2357ba9e5446abd9e2473fefa62cf08c", - "9fce07d8de1fe39577d480eccbbd20177ec8b8236b19237fade70cd1a31d6e7e", - "1de497d4e664a41f90d56d2940e2162fe3d901dc416ed33f958df964ccc0a9a5", - "d0b471235926c1e4a60a4b9870e3dc4b8ffba44b42d259a7570b6e8da051ba0e", - "b3dc7adf7f7a2d3153b4010e985f3847f7a1f967186d0879af0e8bf5643abfda", - "fc3ff46fbb95053cfe7e61d5a5b96dd25fff0aa91766719cc4a2a096d0a802a3", - "683fb857996470cbf9cc840f1b7b08b8a3880ed9c8b577041f2fdce3f9c8f246", - "e391fa4f36083c659784da758fc0221c6b4bd6b1e28ff729cea0ddf8287eb442", - "3761ef5d879d6a8b2191670d757ab6299ed48345c5a8b94ebc8cc6bb161a9b20", - "d610cf0b0a328d1ab20da0187060154fb2579446e0693a688d9592af6463fa72", - "3471d7b55eed2c7da728b5a91fd051496c8f27d3ba075bab52cde118fa15a110", - "328aac52b5e5bcc9a0fa1c8318cd2fee3ae5064d22f5ff2e6311a950719feaa8", - "7a65424c69b5affc63e0ebe227803ff4b30af8cea35b9d3cc14f1e3e2690ef13", - "970c5ee7b9aff041dd1a9c6ac3b6595ca3eef3392b53239240995ecb3ea18856", - "9d0fdbe5d9ac15e3c43b4a3a42c7a2afefd04f3930c50c09a3446029d3af9dc3", - "0615b7bab3452fcd718cfe5ccaf3b9ebcf2d58c67d8d135250980f5847c44e42", - "3358ea445a4722310b9f8843ae649e311c34d90d6fd708c205839505193695d0", - "93a12092b68bb41693b0791dba31865d65bc0fa00306207c25c3f3eccf635bd3", - "2f73d3b38ad7b0388dfec6014c74268f938facd6c8fdbc84f5b6f4f52459cfe4", - "bfb2c818e356f2a243c120c65c56b06e6306a2050ad539c21ea431c7b32b1843", - "5ddba0dc743ae311f9b1bedec7c1e618fd4f5107775a9a28f4b7081b4bd53ab6", - "ce8cb0fd4c2a8676dc96fc5c0c94b40b0e8092106b66d9871bbea853392c4c6d", - "141828d2b72531ace85d31ca799599a0a122dca629052bede1c56da87b7a34ad", - "916991c26e007184c098ee8d9504532a09ebbf63feb2d1792fd9c16b55dcd86b", - "8c35a961fc93fac67ceb61232513701281733f9909f06d38c2531068acf3287c", - "0f4a12078788bfe6248119a6cf2235b01354e7b904a49a342591b26ccf79a88e", - "ac87f8cc261daedc9ff51279c6e2d68bd413579772d6a84cee952717120cb192", - "126148bfb88dc0c708d130c2f085d51eca012e3c4806fdfce2cdde2c380cd4f6", - "09b2bbc237ab3db0be26637fc8486d9dff453f9ae0b388122d5eb9da143de6c4", - "db9e07657b746d55c391a6b7aabf7f4bd4ddf82bac0cd0e20d84e376b9070336", - "a2165d9b0241791addcc08958ac122b5cf4bff56ff0f7899a09b2ea5ef8ac47d", - "12fedf90c8ee463c4a12fc8bcb869f67931df921a5d64f22f360daf50586d03c", - "2f0d4db7e682685f6b3c86ff9a9f2bf6da4b05f9a69c2684c31504ff94f32f06", - "d83a84ca2ad57160ae2bcfeb5c22980dfddfc3b12c9f3d06a3b58374b2d78877", - "2730dffb846042223600afc8beaa2b40f389a0f63ca78a0909aad795f475843d", - "7d4bf5b8681ea824aec9024765f12dc70e0efc76994d22ed43c9c7e713bd746e", - "4434ad468dd34e008600b7275d1eba75ae0d8b1be0e1911ccb182c131e4b4e03", - "e17aa97b5bf5acc31012f2c91fa2098d82f3f0905bd0b5db073c35e99200ada2", - "527c225a05b1e097d509eee2f7781b0d8d89fee6850c032ae930762d2270a18c", - "b8c6333f12cd450567c389a3d6a28dda4c68b20cd20c1f99f087d17e854fea1f", - "2dac20208ec4805a6fc1b96ffb69f1d11e0c6ab8f3dc11c7f84ed76a1fc5c4e0", - "cce2528e5ed563b6076a49649d2a5f95e3e874388397b465294034b31ea5e224", - "5e8cd3bec9a2b38467ffcab8486d30aacd99bde512c36d5aaa4975d64a406948", - "cf24202aa137ec9ae708e0926fb13a0a55ee34ddf6346d9a32b42e05aa2bc3ca", - "119d52e6bd5bebe5790b6077c76edaf76260a3788a70a283e9220fe65d158a49", - "79d8d17e8dc05e7e0c6af1e2df3236ad69d49ad118c4ab03b984571d36c4c3ff", - "bc68409e6392106638c0acddf169ebd50264c4c381e158c4d2c287f9bea7d561", - "f702804c1cafa57e72adc7eab533df4485824fd519fcacc5501965a9f8d252c6", - "4b8d3d826ed65045b3f13e1a4c622d96be092b661dd9126ea57f23313f1dfb4d", - "9f0458ca9f14214e03402a196991355fdb78027fad6c70a2b61258899e2d9d28", - "5d7c8f1ba271a1b78eb236eca406ee9483cf4c55f03f5de4b899ef09e1832c1e", - "2dc13621802552f5e0d2777b7bd75184d49ee913e3348c3dfdc9e1a5bdfa7367", - "242b94b77c8609902c5327bf1e8e85bcc51c912e987492473ceff7bae49f2f8e", - "b78b3fdd597093855418323deb88b4d6c285cd8180658518d791ec8706a61c9d", - "152746db460ebfafe7c37a52837a1153432b85ae2157b8765e560102cb68d2d3", - "827685b99a6bbe50e4c265ced1563266e797008c51e4adedd3b2a316d05320b0", - "b26ee87f97a9409f0d8f00b4318e2a97e6e7fa6cfce685de275bcebf48be16a8", - "62aac3868145fc7fbcb4a401b8b12cc88d868278aa0b7ae33d7c68be40e48944", - "3d9afefae65de6c9cef20416dcef245744d276499436b35caf8a352da7fe628b", - "5d437cbd047345778201ecc9e6fa37bd4102164d988cafe46948ccc3f9c47434", - "4f0b35fd4a63cbca2a3ecd277b701674e5f58c10c3267e3cf917e4a3a23b8958", - "e8127217c51a498046cc84f8fb2fdf18274f3ae5ebde48961c1e79c96b46bb7e", - "f596676a250141744f8910e82194e4d949390cdfa16abbfd55c2a72c45d3bb9a", - "866aaf13da56309857f23b30cbe5e380ecb66c192768a1faa3db4ea725229cfe", - "aa2cb413f67f869547e1e815c451dcd7d58919cbc1659b399681fe31d8cd6f5a", - "1643ca615020a7b95db77230fc3d3cd7a0c107dffb72f7d9a1d7a8f9516841c6", - "e4282839df63e2b7cafad738f7d2740f63fc5df31110d6459dc4a1fd49c4a421", - "0ecdce700e8dd61f2520ac4d41a44bd6c0e41019eddff4b6d85aa1800667edde", - "2afed5c4f1962782082be9094a09daf9b5f60260b760514b4deaad2a4fe84868", - "7d9925a3218f11888adca66a036dbce178271271e4667107a73a9bd2d01116ef", - "00a6377894040bcb2cc1d6cc73abcf35769e73cb16abb21f307dbf0313e10196", - "c29d5b8c7b3171695d52ba8bc85a22612f2fdcc7e175d49dbfdd8b8c69864431", - "f04f6bbb908f96b1073a05c974219a56eb021b237e713c9850d4576ad1c96547", - "bc44b292d2764080aba788b34ebaaadc4a84bc884aa8cc23bbf0e2fd4081ad9e", - "77971d7defc756ba5422fa97efaa5c45aff172f4d6c9aa7548bd95febbdfd856", - "861ae3000d2ce180f4ec29b81b6368d3e8012c54a47af0448730bcca4031f0aa", - "16289d29cdad2ba506db0d932e7ed2d34d2787bf1dfce3a96d8ca10c3b6aa384", - "9dbdaa0b92a38ddcfee83112f1f895fd87e901e7a27394c0b739fb6b395244e0", - "80fc2392a87753940614ba822fa8f69e62b37a14a5c7cb4754e707d8c1096344", - "b4d4e113fa80fee0e66b310efd9d2df14114d017d1f8c07e76ecde2e6bca9c17", - "47d12cd9c651c0ca2753497dd32bd65a39fcae4f39407733c32942533c13be1c", - "3d5fbd7ece11bb965ac3d39a58cee728f70ae57218e4b0e054db579da788aef0", - "171f56ee4106f8405ee7a39c0a911e8db6eeef0eeb9a06a1e2506cef91c4daf2", - "1b9f508be399e4670fbfb5eaed42c6278ade1f04e1d960bde5e6026a103fe7b8", - "2184be49ff97271c86920fdc01c3654d88f83d752e6c82820d5c8bb952f98066", - "70eaa8ac6a58bb72a9b7808064b51068af61064408b43c3a1bc01a5a0ee89310", - "1b7421860b5937788c8fb37451f739236793887b8424ca6b64722fe8655e7980", - "65bc005be593fe2ddeba71ec300a97574cc515c799916c584d0ca36c24d58c77", - "f66857e703dc998e8425479b2e6147ec438e46628417a255df563580f62298e7", - "e870b062836289303d45314f62adaed32d27b41f050a2b6e21096d17369a9cd7", - "1439bdd9a5ed63f0a38376ddd9057e3f4f605abd87a2a78ccc4b8687785257ec", - "f1de7299fa731469bc4e0e0e11c9b13213f4f24be253662a71ad9e8fed0c85c2", - "eebb27ddbea2b7b65254ecb7b5cac0fab79fc1e6580f1f8278cd8e9819223af6", - "4bf02c255d19dcdf62ff263a66c6d226d7bf02880909194286ad14026ec5efd7", - "cfc093d8455105ee56e07caa36b0e2b581504aef3a13a3a9a5ef8ab949614de5", - "f894108782de1bfb8ac5772b9b6c2e83caf4df4216f5c5807e4369e53352425f", - "83fb3c11c0d297e11f745ff2196d2c33404043d8d9d8899ca7fcfef0f2bcacc0", - "63de8be940d193ee6f1da2a5b5532da46339471dd1cc58b726ac1c999487195f", - "482601a38fbbf603ab00d00f9634fe1521648cbfb485238e666ce855064054aa", - "4a63d2b4bee72e9bf7e56955a4a446fac5b22595d36ef61c4544fde8528855c9", - "f17b8cb0293c8c15de5c7aff871978dbfbeb2e803a597bafbd7ef41c8f1c6117", - "0707d1e27afb7d74780b67fccf72c0a40d9cc05adf624c8ef088a8964904d12a", - "b9a3d0162b08491b96f91036dbb1a1191c6b50d371b292daf6405dc4d5356183", - "4d0e1012ac83bc8d4aeb6fc6c206cdf12b2a399276c1ad95bf4bb437fff580b0", - "95b22a951c8230954064fd5825ffe63118687c4639b23feba3d63dd6538d73d1", - "43f0ff36f2da3d043d43eee70b7ea3fcf158e6074e3875825709a570b2ffd742", - "7f2b3dc93f3caa95a0f892008b1f83305e8c2643a6dd785f30d62746714fc46b", - "a75dc98cf7ee4f724b3c689aeb2f94004b3e4e698fb137b919d98f6dcd899f93", - "30dcbe164f49576ce03a4fa2e80c586da5c196f36ffde72fda4bb4dd78ba4d52", - "26f3302c1672007a73ed831856fd372114b3dc91d0dfa26fac071f8e4ffaae64", - "51843c762554a8bbd191e6ce674cc7c44c572065f5d2dc25b3c3a38ccf44b509", - "25a999385ab1429bd0597c2b8f6cc1c876a5d97af071bfb5d8b77af37089b947", - "d623cfdcf3d8fcf8b02077edab8ef8bcb3bf4c6d1858a3fa2b97b6f8aeb85bd7", - "0f1d036029320605af4e3f81dfc6bc4b115cb7838faa41ae8c2390f39e3565eb", - "4d8e3f1d90cd180e8e904b97f1b793167416515db0c74fbbe3b8002994967d22", - "125229c74ab8f9df24058888d3aa12ef42761b23ca5bdc670c37a4b895dbf89a", - "ed3c73df6d6a6da1124ec01b4128768379a07b606dd8fce295ab1bc59864f321", - "3375a4d5c0640811f17ea18eed9986d86db4534f423ceae1644c3761623cff23", - "589eeb30c7c12e9e833526af36020b64f3cc881f20224993343807f744168a3f", - "ede3cae3281c1e2c18483f1d9065d3ffd35b6b5795fbd5b1855564c4e755f977", - "31eccaaa657f452e5b1a4aa372edff1cd460c9c674a35a9e62e5a86e85e561b4", - "2d70032026dda2b37c5795e740861f65e997bd3ac59a648f7f0daa242be9d65a", - "ab02e88a568745eb8d6f69cff327814209f4d7e9283a4c1c4e0278f3248830f6", - "8624032853096e6dd176da00d8adacb9c714a48bb24513c748d5f0ec312429e1", - "af0668d57a052c45af82291232795bbb26d50039ec2bf1c96e05790f6b95b3b2", - "0a5a53b469fe35614865d787114ae4082069766898d15c69fb9d9d2c95ef4349", - "6024ab3de9954986483a4d77e2c40ff59313f97cd62bea42ae3d4372a16839b4", - "7392fde6e1282f1f20e003019d921f023f605904d9042c223abda072087e265d", - "09839a712c7010c51e5647e3cf1c75b31099da00d31bda84dc1d3d5109187de7", - "530fb27cc17475ceba3f9ced683c69ade8032beb05db24748ef46222f35997a1", - "5984261668017080c0b6e68a7a54f810fa5d88c14aabec68257644cf9e1a72cf", - "a7dc197cc1ae517a06e072b1942a4faccfb9de31eb7782925ec611ab6805dd30", - "573721ba4be5593a712f42fd9d1ef7ec6396f67ca56f9e3739a71d2595e887ef", - "f9f1a18978d56df59edf25644bce57389e1bc06a9ad84aca27cef81f5e998398", - "6961fae2ddad5e9c9e01d39c716c616726fd4c2c1abf832dbcf6e169803eb682", - "4c20aebd89499f4ab9c68181bd26b839d19db1f1719c14d9397d130df524c727", - "b336461526dd20dbdf088db1c13de4ebaf634053aa504db2932f0f9abe349a92", - "1e9265dcf7836a4273d5aea8fdb1c0e65e94250fd74a4afb9cf6b087c16606c8", - "07d843146e136edfca3c430932fb45cb0f0f0e90d391a49052799848cbba035b", - "fd756cad54ed067d201e5ed08d805f931ab3edaf315e71d4acb73e056aebb60f", - "5677e0155da8a6c595acbde2a5b845e3e3be1f180875817bf17d08b8ea239101", - "f2b9dc65618bad8ab6b95627f066e26cd1a41da5e18f0c8839cd1a479b9d89b4", - "55b1575b9557b112792f4e177e7e4987783245b4a1808183a0d8a5c44f643ab7", - "da68398b956522b9c88f0d5196e6333ab98a5135a8c79219ced4ddf3c6a81d44", - "418ba55bf17b30b6be1a8b4be919a9e231958ce450a57f30a1616da37e4ea8be", - "f8c387e97bdbc4368fe77be288b8934e5cf8436638cb0aca6f6b2f69ab31c604", - "db4dd743eab3f8cacd9a8075ffed8ac9873182b0db8ca722b71b590f46377c2f", - "e2d2598d10c940bf0763ea77ac8de4bb9ae45094f2f67de279da09457081ab9a", - "5e751c517c5053257bdab964553fb27c005684ea5e28e776420253045d9132d0", - "58281cd93d1708cbf123345a62bcb88bff05bc55399c970f65ce32c3c62c29fe", - "e8f7fba48d6adb284c36fa8976f6254f8139ac4eb6fcb063f436b9e10aa321ae", - "4fc202a997d3af11094d5bb0e041aa81dbddec7c148bffbe356139453f84675c", - "89ac4cf55f8dc5b1999521b3808a74c7a83afabd0297cc7c07d6f12447d2b925", - "4184ed47b9873fadaee13dc6ae7d6cd0d55480cbf75846ce2bf1eb70e7139dd1", - "20e2453ebbcdd2f04149c583e3840e767dd4bf65a826ac033b11a78fc715d17a", - "f8af583bc7f01e392ad4b34d8ecfec808f3e0841a142ff76a838f5c774f163d3", - "5961e8c6a8ce05a581cf1c3fe1213e9e77b6a802b3296d94250e1a29561b03a9", - "5ff269da596c54b398c4948b5ad6739a103874a66c118cb06614b0bea0371510", - "dcb4038c7bdc27c36fcfa409b8f8f4dff7d9e7549c1931247d33073258cb66af", - "68f6012b1cec3ec3937db116f1f099d0cf4c23d641bace626e60dc4dd3db3e69", - "62851f23f4556cbb1a32882229d9cbc9571a377748dc872403bf6ba4da099b60", - "fb81c5daeaf29ee63e94c139c5a3abb4d5dfd36620e3fc18a088001fd2b856eb", - "f25260d7f7f15604406dcab9c23e2971cca22ed2948ab007ed74f6ed66d64306", - "b0017f328358b5a7a4b59222e27b1215b9adfb63d53c4ecf77f87505381bc9a5", - "4530947e67b656f41827cb199a10b822cc29350ab6bc251049e06c3252018c2d", - "d0f44103f030753bc698367d95c9d5198ee35a3ea61828289829b08e7625decb", - "7ab5baf88e554e6e605cb86a74ec173ed6273574af41d253533231d59e192b40", - "ab9983f6a743afee0591399a5907bfbb8a7b181e5e770991655250cdfebc0d8c", - "78da9aab852fcafd4a27ac27a1075df939bd7465fad22275c699da8a2474d082", - "280b2fe93f77303e5a5e333c65b3c0a816af9aed9e90c4b14fe3a9df9da6d80d", - "4fce86a02076c0bb41db1945039d4b91bd5655895567419c2e5efc68c2d2301e", - "432d2d27ea3c3c343e4ea0d1d90c04de608faaa25e608594c4edd672d24b8504", - "7bef8a0d1dbefa462af4672cd1053cc124c056e27079283aa7371dd40b9ee5ae", - "8439889668d07c86b295e341423a31ab105976a6609e26b822ab16dc84fa95e2", - "e30e48fb3ee0123440209bbc1bcc60ef1b33135efa96aaf68059eccf2549a31a", - "e987cac0aa21d9056b6cd06884907e114b05487ad972310d5fc5e5cf4c97eb4f", - "a6bd1861449fb49965b7a7ecf29a7577395d6726b21f4e7e68af524a4ac7d9ba", - "e07629f99e95a449e17e2a66b6ec0f66d54eefaaba0b887a459400bf919e6d8e", - "43dc32d7d031b761a6c74e3330a69b76dbf22c2c8437550e2f3356e25f081140", - "7ce8bafef46f52f798634f999a3ad75fb336f9080511932d8779dd66130f2c83", - "98fb4c6113b3137b12afc59864c4f4bb374fe27e3e51d1369be358e2dfdbfc18", - "75d671a2835834a5038848ee5a8449e8608a37ae2b076d883d1920fe721ea83d", - "950f5a48f1947920e1d7df9b84cff9d13f16cd1d71c1276390eab2949123b82d", - "fe4846f7cdf98333fa358115ce0f980f43e47099b889c04a867f83037722de21", - "ff8b25e6b4853b4d81769b58423a8156cff0a3002113dd0282b0427d391e0fae", - "3e47196517193fd9c6e9cb5593928c6175eeb84a70fc16d378820b8a65324778", - "e18251ecb559280348e0ea676706db600ac01fc048add8235a65219091f8666c", - "b1e68838c461ddfad3c6eca8ed65b937f583c9c1615a2740042510ec887dee57", - "93246c31f8e5c9400a4b7bfb224eb5af0d81c45e099e93c823de2fdec5db8a64", - "5c1d43c940a699ed167bae7b4e7375c82d037ffb6209b03f3e814d565b209695", - "7ff2842cdd50d978e01ba2052e87ab0f6b243cfaef3dc6fb47a6ab5227893650", - "b893fb3c10cdf5e4ed6b9f832302e196bb2845ea967656de734065a859b85189", - "0d87b2e8b4b1ac2246e32649aa7f24ff2aca7d174609b69611a0c75e4d7d3c50", - "d947309351dacb314437fcca88d5c3e742707de75a9482806b4ea974efdd8ff4", - "6bd4561c6f5861907c0dd975c744f254d356984ba2bbf919ee16e2f0269b3e35", - "8e3ce3b9c8991ee2fd7d9fc247101b1d227a5d09ebf0a653b695562b8fc80d76", - "6d4cca5bf68ef1ed45b7fb66f9e83525f568c3eef1f8cb60f6099437fab411be", - "ec432e1e232c6ab4e6e41c37ee595c3af96e1743569cf92b2c3283bbf58299bc", - "265bc81b3dc695b0499f08fbbd3d9f4ec045ab230aa5897448d5c99c348b3515", - "23b0edd61f90abd6edd9638fea9c1fcab58e33199e535266c76c83e44cab9fa2", - "f3482c819c73af9f2c7e959a50d9bf53215bc78a1ff039d442ddfaee57592463", - "3f3ed7531c08975ed6d0aea311b13f5ade8890ebb718810200f732b2fc4dd0de", - "f9b1e9bb1c04508d899925e3e2337397d02f9c9d47900af080723ba4f14ad3d0", - "a238edafc650cb50e53dfe4d56ee75d5ec039b985df75187391c44e3e665dda3", - "fe0b432c49f9b7b4045810f664132097a101518cc50c62e08ed3ee39ffd22260", - "681878a18cab95b1774544ff5e091d6ccde2df3cc56dbd7721b1b710637711e7", - "24367688d5acca9b64fcec572b8decebb3a39544707536e0658f465cd9cde778", - "d27a33bae4d271944a986955b4331abca28f8963998fdc8cb333e9cc713ece26", - "696aa60abfb8954ee0439844e1b8c3c019b1ac880dc39b64d23615f739441244", - "0335c8af151fdaaa42fcf5fa60e40b47a1fbc4241fc0abf639080bebb74c7085", - "16503d3c51400eea02a65de145d47d6ab4059db501279024ebf85801c84a0a31", - "cc84c714b5bd0dc3e847c9057c9ac392b75522224f23bedbf3c301f244df20e1", - "db670aaa4635c9be4422fc8e5df8aea87a058a8218760b2ea4d14630a1de9a6d", - "0183a5bec4af7cecce1482c1fb9578cb77e36ba63606687e87f7c3cabdb8d570", - "a7ff7321bbebeb5223434e65accf453aca67eb95d8af70800fbb9569253af4b0", - "27a1b4ee37625f02040388aa0d19dc8801707257c9932984bb8ae553513498aa", - "dae7e8281f6f156bfbae8bdd390152f0e10b7a67d2b2607f6d2ed5ea1fa27d35", - "b1f8614e4bd75c21171dabad67f2e1759a7f460df7d12606a88e08c04489c4e1", - "9da4d95b12790e4dac91c558c275b88fc40b748e54d7a5b2823dee4dfdb8e5b2", - "1cba1490ba10cf2377ba3d2dd689c399963df25387061cc918ffea6439e8e7c1", - "6313055679fc74f24c37cec922114c56e6518d2bce1d2ea404545dfaeffc885b", - "0e3cc62d190bfadb554c3e582dbf54a975c6cd7e36c302ab11f089e8dcf53adb", - "405129c2a08522e2256546c730bd2e47a4790510e9d0a6ba97d0b42cf8df565e", - "5abdd1a641239dd7873fa0bfd1eac274705d01f69b593ba8d96ba049b54a2ff7", - "365d87f52681ff0f60a764b83db175bde5885d496cfefb1d19a961c5045030bf", - "a954130ffc34840c573c2d1ab3c2f81a083c5579a4a8ac07b16aa34f32e72332", - "d9205c4aa069440e9c422be4b92fa00130ed9bd4d3c5f61b9139bee0b0bb5373", - "4b3cab967721d28d10f3a9db9093590976e90a0a4948fe4851a9b9374abefb81", - "87626bbc8c0aeed30a0a69b7ed6a78c8bd852a555acc6fb3aec2e1098c3ed487", - "f856ad832bc74e4c383f605501ed965f3d642f25e368b5ca97cab3c486521dea", - "f7528e64dfd677fdb4d5e9b60a50bc7bd5dab3ea51ce47462ed0f1b09d1c49a5", - "80be093ad23fdc91569d9c85ec3324a5f8849fdf8f358ddbd63b9cd038a5be7e", - "42616e3b11291fd450786a42b48738c1ab2c2b478c7109decfa82902d857dca9", - "3ed27625375d874ad9207bd451ca6be87ce725d1a319bb8ab3c32a5eaa66e15f", - "d52401b9faa795f8be92b13cafba33728a8ad8eeae0f9073554ba724050f6aa0", - "47535d61d841f320a95bf067d197867c9771647371bb2bed96f8b766a6f74f7e", - "36834d742f95e46bb0e0d6f6b0532d6f6ab922fc4d2e8595da03518cf2d1b741", - "a468b6a617266f0a69c395a8bd927e64a3e2932518921256fae11bdb29f58a1f", - "752ab2c8b8ef74bf4ffc94717a3c5e8a41a95960b03d49d1940e7b93183017c0", - "2e411e6d32d4c010929ff7ceb9e76cf847b45b51c71e08069aeb7e0569e09661", - "215507f6e5922403179a5a78dfa3e7fdfa5ffc6a884f5f74e2f8addf8b51f894", - "d97623bdec1a184d7d2240d8800e09690f8b4bc53f4c91cde6d6c733f3506283", - "623f5248cc9147e9ac0417209de5f5fb17f5f639b5b727af68fdec62b7871d64", - "cf4abedbfdeffd912205a66882427bcbc77ccba6d589bb413e9197290cbcbe4a", - "427bf1c4c6c02dddf69970dcd76fb3d50a62f75d9cafaaaffd1046979c6651b3", - "71e267bf47465dc7c2474e65749b46d468fef24aea3289d4052aef6ee86b599a", - "6f56e42699691ac3c769a685100a332476e44fe958d147e6ca63f5b7e69c9dfe", - "2978334b059eb8f916e44aa0dd081648d6d775e341cf897c6cfbc8f8b4a32627", - "44b7b43cdeff5f013c0be630e10ebb898bdb4e84010bd78241d5fb34ecd5c04f", - "ab8fc3cdcf35f256b9f2bf77d7a0f0afefca2a3c99962f7a314608f40463abfb", - "67f0aefcc3858584607050ed15f0708b529199c17df4f061e7931b5038243ed8", - "3ec18ecba7dc6aa7f3f32dc963d3d778ac1c6b31210639e342748911d0ce5585", - "ed7772f4ec5cb6cecd343612d985b1b3c2e208db616adc73299056df90cbac0f", - "7cfaf8596e8fda2765620f29d816f60c35ef85ea6ce0becf558562bf1ee29882", - "93a8660f62b5e137bde84c4aae40d8d10d9fb2893b6c59b9166e5fb7e3c4a8e4", - "e3f776cbc727b9e72226077bb47bc9ee5b07592198fa92a4429072c6e24f3566", - "f3639fbb5c9c45257b78613bd5ed20234341769f16e78e7b68e80b48d5ca7545", - "a2b481cf0b3726a53bc6b97646e2dd32c7e4670960bb7998bbeea927d79e0b62", - "4c26045b199ccfc7ea5b69c0aa7e9bc5dc14107c41b7edcecf8356a5ec8e552a", - "883b57f37ea39c1164ac93f2a9ecd7fcad2baba88de0da173862005e11bd122f", - "57db806c55d712949effb69817fa28e353a64fe56c711dc0238bbc14e4a4172d", - "e5822ecc84765b78ef7c4a3fab1a6061995944994e903989eefd234683f4e919", - "c16ac2532b1b306015264fe24f7ea337a05c55191deab204efc93be693df26c2", - "e382aa9e2eeee9c00fcc56c4b9e8a13cab645aa6d70f6f925ee01826f58ca34e", - "a78ee6f41da160b73acfba15978b327c69d6c01188eee2557575e7ffbe4c3513", - "cc3c260ce0572194440d0eb1f5b6e417ae53ac1e06c755390c38c8eadb254a4e", - "2b4caee6f2660b4e9be719897e32baaddf38ab58f6f0feb7277b5b10dc9cf03d", - "1c6760e1c5e28203a0b157d10517ece0c077088ff23f075f12fe533d4d9135a4", - "c5f8ee5656e08d2e1791bc9aefbcac25ee1bb5d13018f840af2727222695b675", - "7dea406adbc13ffbda0bef3228c23e8f091b2c7fda50cd13635e34ca4fa43fdf", - "1e41a79115d29a91ff7259de2e4bc6fa355e2fd95f8544dfbf8558e4c407aa2f", - "5565b41ad7b34e84dbdec2af1e513dee6fa4671862a071a1288c5d135978eb55", - "f9796f8a238c3f3a180b6f7da5668af8e28a2de8f4a60237e3ab3baf40fd7ae0", - "73372001461e7a73be8bf0690a95edd7e2bdc73928fc244ceff9fab003368c79", - "0ce4f3783860f1da373fc1353cb9b3ef1bc11f8993ed9b93bc7f2da434318c41", - "6d99a0f6a3275cafcff92b1e1b4b65c0fdb0a2516345ee0f7a01c5eb7708dfa6", - "de68cc7de13539ab1e49bfdee4da032488953e8631efec8c7a85ccd95c013903", - "4d0563ad60f1de4d57304300a48dd74beeefe364f9aebaee1575190c4c9ed2c3", - "9a327b97833e3185c1237ad9785aedb38ce3e9302c4bf9fc92ef343bbf934b3e", - "11bf826a73e400320d0545c63bd3c8d7f9ef609d473fadf43ab06c94beab438e", - "75b0d1545a729ff0d15adf0eacb05f46011eedd2bde2eaf7b40a657fd26b4f4b", - "82a00a1a51a2d58fd4152550f8e18778dd4f600aada1f93e77c34408b9e102ec", - "259540d288ad37b34b4e0df2637fecd1e69cc30fdf6b33e8a0403dcf0a2b0a4c", - "e59e7ece2b50db5597f94c0585557c671a90727a5573b4b2d7aab23fcdfe9906", - "98257a7797bb082ffe6cbff1c76e59adfc83c59a633e07d012f069d6f1a7d4bf", - "3d53fd4412dbffed435297912b960dca70d6c4c6f451f4ae722b7847ac834d7d", - "8c74237f36270bb947d0d930f7ce6407b2e71401c22309a649ef7cc7e6cc92fa", - "ed283d0da5428e3d2994def6614e1a0caf2c1d53e1e1f96334f648c1de358d7d", - "a3c2d006c4e5cdc908c3fd75d06dc72f556552cd9bd30f26787476046b61e185", - "c1d2511457472ecbe5930cb427308efbab43f06b64f828cfad1940973f919b2d", - "9c5d0f831fc8c456d309aecbd30c7d041b38ba720224eea36e7e73703d378884", - "9c1dcc85bffdd9415c363d67728cb100c97833219586c668b5003e45f38daabf", - "67cbf616c2d2e13546d1a1d0e949b2933b247d55a4709af178d0488690889e67", - "5ee944b198b31c2dd4fd600b4468e80dac87da9ceee8dbaa9328cf5e13eb3fde", - "3da6fe5df291060d6e47c1563bf751f4afbeef493bc239d488784adc13a8b00b", - "329626e91b6eeb38ec77fd1dcaec659948ff1abc58d056ca4fb3c9962b34c5ff", - "6bca6cccf37c1605aa41ab696445e529038d20495d8892f077fb8dcfda534fa0", - "09454b241900a84e3868b5a0d65efa31a5e99e77f52be5be9464afb407559f7b", - "b1f8ec7ebe67b22e61afed9c84d44875e2dd9346055f05fe3330e34ed7ca2592", - "ca01c5b15cc74a015a792e0a214c86f65c2b0a92744c95a8a7af01db0e6b01fb", - "19ae4dd457315f6d52bc5cecaf58237210ce25af20e74a10e4c223ac44bfeac0", - "2b0d99234289ef2188dcc467502aca764a401b75bce4f46b23143e264774c6b1", - "20bd4053603edc17e746ca1b79dad6e7de9b5b55298322887889641edf9c4646", - "305a3792687fb0112338f015dabb60981e5a7564a22ec9d6e0ff4e6afb117115", - "4beddc540a61f46d4fd3dc72a1bc8c68cb56b047c081ccb78cee2ead21e69005", - "778d74bfa96c8a4868a32d7ff2c6909ee278cf471c315f3142c757c0b98c19f7", - "3efe70757be05cfcbe2809cca765667508d01c37d33309a1741802d3f17d6ac8", - "dc828b44ebcaaab49fefc8e6da07323ca2fcb1c5f25bbe2512e7d05b0e30aac7", - "0a873f73c8cf3a010eb18bbc19acea46ec15d331bd2730db354d5fe62edabf3a", - "ba0c1b16067fb971c6527695394611141ae99e9b46f65f4e947e3d1474a8eb79", - "92841176f50fb6dbb8934a72deae829b1f1788ea42d9a5067174aefd920e75ab", - "f0dd6808f24847e6242aed7b079116b35bcac99f32d10d12a23af1ad8be63e44", - "5dbf840c64bc04c246c205d1ad70f3084c4af14b493d501699e99e8977765911", - "0856f01990a7be5e819d626fe73efb775179a24f9cc7a5045a3db6efaef7616d", - "e88c055579da1c82efe9470b0034aabc0b69b6bb0a4f66526489044f17bc3002", - "bae0f46c326ab01c8ab73be972435e5afd68801f63186f428a5484826d79561a", - "8f2a56b7561ae3895c686ceeaf05f0e59b1b849a29d1926fe59b5e4e3526b6dc", - "b622b198bb1a6b7a51b0b937aec558a5f72121ce1924bf09ed2c832ed691823e", - "ec551e465ba83cbe5025b81d32ffe7e45c989b8ea813976075ca9dc23f43b011", - "1fc2694f3b3a922d7802eb7e74c08ea534463f143c0a4e324ee8a140675c6d61", - "445f324c2cee6300b4b2f4cfb10e7a0948d2ffc9dfa03be8d36533d194ba6dbc", - "47c994776b60951bde0a3a978b223030a1ae4aef2157b053666216f8c18ea045", - "28e9bf17ec4264c320dcbb75ac5d6fe215e35d13fff725680e9504b776625e71", - "3e8504e4e4cbc5d5ad1714ce3b2b7f2baac1b654dbc4132ca7f420dc48e616fb", - "a884e86e46dcda7f7057a375a1416dbc733c86305a364a9a8982ea8a196c5a5e", - "e5f6cae7b8c99afc37487022838e68768bea224a171c9cf96c21299ccb46ce39", - "724a60db03c8c455c4ebd5e1ea9cb9cab2450d400b36fbc6a16c1b4894de3d65", - "14c6c24a8d7d6613fe76b9d0e1faf8812b4b2aba357e2da2d33fd18494eafa10", - "881f47c74314a08b278aaf64bcefa41433c6da166cddf7e05ec9c807922814c0", - "558ea0aa5795c0234e98eadfdfab9e217c2c9dbea855194ad4df8e74cfd7d8eb", - "b087b139a0568ca74afba07eed77effdc359b5d904c670aa0268051f697e8f51", - "d51af2d275f2f9b6b69b81fce1b86e41a4b87b8d1f40a422f7010152a9bcffca", - "f6908f69e520a1ecbde7285753e448c19aa5aef1b54a721f46f59ba9fc8c3290", - "41ed80c993d054e899260506013a1d06fc578ef18f09a5a7822f1c2aa8285c1b", - "cc6b7bc1c79759f67032d01783b7fd18bbe6a27ad7839b61da90b1b6f45a2c99", - "b3f6a4ac2257e8314fdfcc1af7106a0afa9a67d7d0dcb18231206d8f81d6c62a", - "d8f5c418b835ef67271601f113c69402bd69ff38b2150bfad4566dc0cfe508be", - "dfa92cef304d89b0cbc9997241df73d491defd4a58aa716515b4589e9413690e", - "8652593b0285a67acafd53df8c6522ebba7d22f50ff9726e8b107f8187d2533a", - "22ea55a9026cd850e37b9584b0513c4d1727ab689ed16cf24f2df4de28e26dd4", - "4c67928e26ab30f49ff1735194e14946b47af7fa2c6c5a37c8b0dcf4377d58f4", - "6e3b2ccb1d86d1300d057b28cea1347f411f47dd0dbd9c83da753d522be03a62", - "1c03039701369b305b6a0bf1570e009c07e297e4424406b6a865543d33f8cbb4", - "8ce2db9ab3fac910b873235241d9f5be0f80fdd8df6fe84816778a1ae0b4ae0f", - "87ae769ec21dd0cef359760e2444915060d78c58904895e6ec779a49b3eb4ac1", - "b776bfc84b63e85f03467c7712bcf4162258d0e7ffa6de6e10f63a32e861a295", - "d2055ea9c11deaf2d3cc55d9deea02c9fece1e0b8c178987a902d55e28083042", - "a1b47716768d4179e419ef38970af4f88447c08944977711eb1b0f5fb947eac9", - "5f7c115b681c6d1cb067408112e4b90dfd82614169518231e38f025dbbe1e138", - "b6991a377c6f338560138d4cd718386d48b25ee64d71df18c8570ed7ed03c816", - "369c38336d2f8fbb2b97ff22ef889d2e735d2cc5db95bec1009cb5efd4f72040", - "85a0d193391454a401299d7110bf70e48478a754be04da5caf1a2aa6bcc57b99", - "1f288c4cef49d1783f757afcc8f0e4c8accd8270048d4dfedb93732949c18fbe", - "50d6794732c3efcabaea476346b5afb91fdeb245d1c065343a154879129c5ef1", - "02bd69da4dca9a24774d8e82e4097f65b72ea07b3e88baa9bd9c11457ea8458f", - "a548ef5ede6fca7abc067d9683a48319c1b9059f668d29ec85b87b3e6349e5fe", - "52c9e68dd91de72cb57fb1968257938476a25ea6e2e99b7a7cc23d08633f72ee", - "380999f07a2101a6e835bcdac688c4f36096092164665deac9887514c9406c36", - "2e78fa363af8e4dd8dc740e12c983de5b2cda880f8a25e41a7bd66a73529d733", - "100675ed981dc30c68da4037bb49d5c3ab008dede7ec2a6f281842ce0e6b2e3b", - "6b9e610067b884ade3cf53a3e76c3309a41a7b0e29cb569d1d4013d49d06fdef", - "8cf05f8805c13000007276a0244cff28b42b596fb70be76def6adc8f8691a4b3", - "598be975d45713caeb24d41929df23464fb451b1910f0c621bd4dee28578094e", - "b8cab257f058ebec3d205b29ad1b309aeaaebd67f4d0ebb3ff3a9fe6148c351c", - "041df388be6db732d1f589b7f743b7dcc262444a189d44a95f3cb0255b04b35f", - "a9acfcce2792181c6b73a080ecc97f5ee6a8114c679e04fbd92a8e1a3aebae0a", - "d4d7b6d13868a2bca99606c2970776648d222590b4b5d34915d95372cfdc2f97", - "10193ec1ba144d88b5132197ad8f3eb9798167d4146a22e428c886ac12442b4a", - "207cb8e972c35e1be941c35a62b3986f41554a27522376252a86a461d3932eca", - "c56472496ba664f76fff7a47b0739c006fd6b579eb1e3c53882feef0126e2b2d", - "fdef40d947f642d669d5555df30b26e90bde352aa8d6db9e14ca85b0e02aa18a", - "c2022a81fc8fef5ef57834dd243eea1f1e0a4034dde0c2770f95750109990632", - "fac2cc4cc15bae0b757dc75d53677009045d73faaf0aca10d0d960474265ec46", - "e13409d5cfdfecd6360c11e4c5baccfaca898d6947e370d44b984a218e816ab7", - "0668fadc0be370fbb5eaa636a8bf9263ffbdf410d47c35a1d83db883f28b9f38", - "ef5b3b3f14a929f9f401dfdeb0dac56c297ddf7682391e14cce552a179702f66", - "2808c40b54cd8c63b2112428a4a5a24674ef8e7b287bcef1c60026c78b63a43f", - "b5ff8bb6b9a6ae0bb7088da882fcb45c307723ac89bad0ca478560183f42900a", - "86d5e7f4c5792f6b0938ed9c32a03288c59863f212dc41211b988659280f6791", - "be0b5ea6f243a172d77357bd7e322e4eb35598d9b8501e08bdb3230e57762298", - "24e78db2e898579945fc4966b8002acde801d9faa4a1375f77af451b2318a40a", - "c02952647b8d8799164c8512585c47f0bb792a2518743464f15ae4e05b326e7c", - "f5517c6ccd9acb3761a572e7df4d30db76452f3fe3eca80d346f1779f2070ea9", - "94391b145df02d7f20c26cfd6634ea698a7379aa2d89f02dcf3804f1f465b00a", - "7b5136d57baa708ff1eb4070a97436aedf1d8bda758883d421e9899b1b579612", - "e1aab123c84ac68af132031f524f48f76eada1ffafaaef1bafb77fc73272d3fb", - "eabd25f0b6b0b93e6f1651509db9fc8a90ec6e7feb2d3a8b607f56e68933b01a", - "163a4152f5d3b88ac44ff65adc8991cec773cd413556c95d19ad74e0d9ff2592", - "306d17c95b028fa00e5b0151e7c0e6429f0b428a06aa305296d192c2a1fbcb31", - "7d4e1ea61b85faefaab82ee33c3e4cd86710f9cf485603215329a66ca8e944fb", - "d5e48f594a1cbbbf5ae1e3342d00986b3cd01261e2002c6edf5c8a269a85a226", - "4177eb22197d23dd4bc1034778257c8db57c8a1983696f14ddfec0450c46ad3a", - "b20ec51bf73c5eae548fe9ac9f8e3df2385699a32ccee3312cb7b8f29c1162a8", - "2fe59eb4f51fc8a36234df824f15db517f492d1eb700dee7bb92fca2a50460bf", - "32b712816bd5c0a5267cd1f5f49005535515d8ca5c17d6e0badf1a2c7a69d624", - "5b79f826e642184af058f3759ddfe76f2345ff8b0c09934fd8a44033514f341b", - "e39923344ab07cc99a30d9fc08dbf700fdce4b73db529591dd763f162cd71421", - "c6c4391e770d13e311f7986b23c9433b2b1b621bd911e6f08d2e075803aab908", - "3d1aa09b8aa6e72d5b38e169737c0a16db6a57a73dbe5c1d9c5fa0cbae5aee06", - "93f5dafe1e05577f5e582a36f19bd16ac662ae6eb9f47dfc440270d317df4ccb", - "c268883bc9b56a1c65cfa5c17cb83a1694b4602d48f42d1884efd3f87f3cbf1c", - "d2f8731c69849c740a8b1e31fea97c9a9d2a30b4906866e47af0ff759df97940", - "79e39f807981e8503a4c728c1aa8fc2840806a8b89013145e8bf92bc90337bb7", - "b078af86419fda147901030891bad657c92c2aa702ec13e3ca99844e5f956fc1", - "9984439bc5215dfae578241cee9cda7fa76b6f5c909bf8b5504b6e75a548ffa5", - "466274cd232847a0b8e6f5ac1eb4ea02daeac5a6012878bf7b41eb32ca1c141f", - "0e1a099f56656881567b3039debc918af1945f02c80940a13b4e0231bad9b2e2", - "6669a2b74cec1daa3869428bd77c19e2be4d98e569220ae0ef507b558367fcda", - "4c508e38a241f4ea6646d51ba4b90ebeb1d2067e3c2d06d1999f16f5e985a86b", - "04fdf2476e2908e3541694f45c1121a5be5059f072aa3c92b789ea4da2eec352", - "4bc23f85c2d1c9076e04afa7ee8526e63a858661aef7e227ff1d3f12753387ca", - "d1d1b92f0cb63684dad1eeedaf35863a17868ffc186b8fa583d12d2d984bb273", - "d6e0ef05c6c8a7856c31fdd025471bdc818009e8c6262c8f5edd0aa90061e872", - "aeb7d76fe2d4bd87dbd84f172eb398a22396b4fc3299006917e198d227a7c29c", - "ad0c091c7c4a2ac977eb07f0656b80036eb1987650d8447c30c52ba6cd4473bc", - "698ff7082aea499ada2f00a5c801a11a37e508b6b4a2286764eb1f272dd5f102", - "d9a2cd16cd728491f5c54a1510cb65c45e048a2c7c91a35a6cb504e6661a0a58", - "bc980f6cea0a7b7d91f069b557945bf728d224ac0225ff8e0614a5b3d72ef8b3", - "b59973fad27dd718a8418dd1542fca167f498aa5005284e8e5e1c5af21bc23ea", - "e3d7beedc3f2dbc401f565b9f5b4eb537e541c06d6b95428fb8453440add8f04", - "d51639f61185393d3df86469ce24e8255045293a162f0d7c75ea4f43d8d2d2ca", - "e8dc01a447e8a56c9b12f6ca7cb9c1c2314863c8a95411ab8ec30c243a410a73", - "89b8ce448f215332ffd52c9c659476e2ceac3a15dd7925fde406daea525426b4", - "d721e31c1045a45547c3a7e9d749a2816194fef26860f1d4c0513bd17a8c7a2d", - "1ebd2077f31befa6b38ac66bd023e353c1f0c1860b0ab494460154e8793f03f3", - "860daf00014583e4a834a985d8dcdfcc746dbd2f5e7e9b41b50085e206de684f", - "f468c820a47327e0b2c6c0dcbd7ea749a0cbd39ab95997912e012047a44c517b", - "9f3f3caab11baa2d6a205cc3f3e3b0fc56ef43193de7661300c27eb2f35d7c6d", - "a7cb63e4bd8306235f6f35ff9b795ebcea2b5bfdb956bb3aa0ef6f714a956067", - "60e61890aee3b2d291c561f2b113c2c864fc3eace6ade679c03d59fb12b1eeb3", - "7f698dfb00f941e919fd542c7d6ac5c12eb610d769137c042057044c54966835", - "594c225ee178b6e348a1d1d97cebdc475b8048a4d0b2b709105f651209bee8ce", - "9f3cb23024ab4f60d70805142c578c513184bdd6fb9287ca7a9f09ee84937a52", - "a602e63b5ca1088cdb9962bcec59b7854174c431a45d9f55d80063dd75b8c320", - "6fdf59c1a5379d1ee60c7b88283e739cc30ece4c451db447c238598305f875e6", - "936d5e2d2be30b1f783dc17f42e6f6ce4f0910c4296c4517b11eecdb18380432", - "d73842dd2a33f00035683dbc8e5073c9a78d14eabeac85d53dcab345eb8697e5", - "189c13aeb52f7976032ec329237383b3a659abb36dae2b3e700e945e6a351ddb", - "d4f89dc67ade4c5afed48d9c9f6669928d6c5930ef8768d826780add3b4004c0", - "091ae196b2a70a2337143df1ece7a07a4630aadd817279bb09b817290391a9e3", - "405464f5cdffe464742bdc59b47f2977628853dcfb2766ce26100e9d0761720f", - "8f6d7242dd453eebe2ecfdc1d1f173408f7241f4111767bf9462816d7bfd91ad", - "4ad6856e3cfb3e9319073715458ad57cecb2aa8baf9097afcfa25930f0a1156f", - "030ca1baf6f8a6d3802b020783179ab066d61830c14e872c8d9a9a5010e036e7", - "c967215e387f448c62cd595b08a818e3b5852e266e1c00d2f3b38c8332c71c58", - "dd99dba6769fb0cf81049c30ef1dd22edd513aa5f0d3afee6edeb3f4b4b7c035", - "fcf5226548818c6d631a2eb02693932f1752f0f2dc110efb0508158e9aeb25ea", - "9bef8fabe2737a24a5d3a6112b34d1f03d2bf29626f4f6cb6bb23eeb8c64a66f", - "f1a7ee5dcf5cd01ecf6da6eefef786718f76228435d6396e9b7db01a97fb41d2", - "5454b557a4cef47bfd12076d18182a560cecf4aeefc6f55a758a6ce1a6831b36", - "9b3e2097fdf13dbd8d20e56875a78611971835733e2a0da8bed8c3b7214fb2d1", - "d7710288e577c57752697a3cad3b60c982702e7b89f9abdeee60b709514c6c8c", - "a91b3bbf3d6b1ae050fb4adf7adccbde2ac660da6a8d51dbeca80ce431f86760", - "631c5e550047de9a44074eb8b1b7d705ffd696c5ce6086124a64085765f5203c", - "b046d48f30def010f186c9962b6e609f3f77f8e74085dd325b56249acc8a3b63", - "765a520582cf7c2192b924d57187c7cf2447ceef60186eac1b982020ea2ad731", - "2eab2e2a249eba48b55f08caf0e15b1de508df429a4969e84c807c8f84319b66", - "257f66021697ca540f33b1388df81279a3facbb35eefab1fc7740d95048caf45", - "25419402765afaabdde33939bb49a63fcc71d86757e7b8833dc31d08f46c9b7f", - "e0bbe12e1cd4dbe8c7421b77505aaea9c033eb3332cfa46398f92a0fcfc8e04b", - "0b94182d91e8e2be02b143dd403c5d261ad6c0f35475a27a027d07e1e1dfd9c9", - "108dbf66364cff6cb9208ac3e715884861df5c0956fa68470fd977368d9d10b8", - "bf447ef4bf1643c761821c13ea47caeb2b7684f1d0a82ab751799bd707f1a02b", - "6b4101d0668b7ab0582d0648be192d363ca02bdb85266f7af328790ae2008ee3", - "d440c89789be81b1f3d0602cf5f7e2306eb368a034bc6276e7cfea1beb1a380f", - "5f4a638ace85981259e2bfae66a1e78791314a3a6090d600abfb11267ccf4258", - "98aa4a112755c218ad717888b752ee8b560401e77e5b01dfdc0724fcab7f82f6", - "dc87b27b7f2baeaa9e173d2ae1dfcae818685d97f22e5dd81dbf0a25747b65bc", - "e68f073bfee53746dd7529d7d1ea2d38bd4a2cc78406facd5e9828732000faf5", - "df476aaeea661d4a3011cc359fd347509c3d123eaa8dd166269144a129a20280", - "a0e0a0b788ced7c89d3b9c148b30e8c71ee084804471f6500520f71a96fc202c", - "a10acc1518bb864b8e77d9b10fd3a4d3a2d0cf27be051ea2a7a7f82230506a59", - "b7cc18aab310779f2e9ccebbdd803ca0c2b16de903cc823285cd398d701939d8", - "0b34e9aa0892b3a11dc282352ec16dc95c3d0a6c479708e9d2d31489531dc41a", - "3322fb12bc20dad4c23a93733782511283b47bc5f523579f59037b99e438dd6c", - "18b7b50c089cd4ddd467a7d462edf5e13d4bde8138c4442fe83fe57259907706", - "b1545750020db964cec82793f6e3ff2844900b54aa2c876235af2e6979afc3d0", - "d6b2f5ca9b1710a7459de614c2f48fbe8a8d8967e3cf9bf0efc3716dd69e60f9", - "f3872709263573fb5bbae5f5f21252955aa8a2ad8995099d6a56af1f43532577", - "4af9df3bb39c73b04d577b1069f67741d68066e43e9f5b0779fe755b57a7ebdd", - "477b6ba9f1e4ae4484e5944cdc2b3663b8fe0756efde0c106424e55ca2412134", - "7f6c8af5a33b418d3f89da8ebf6393c6333914b7006de634b4e3ab1df55fee0e", - "82c27bcff82f5edcee7af6d0cde09de031057655376a4f6bc5de39f9449f2ef1", - "0c1eae67f8562265fb7e1d96c0858697cec9c76aab0751899c8da7a3d08b2e98", - "ce7ca3458202eea79f8ff1864b43f845bb87d3539f97d6cb3e798d21f0661a71", - "86e39f4dab1331d1e145ce5a62bd30a79093283a3ae91822d51f8c147f595feb", - "139ba1466ef82e792fa9e0f59eb4018f03fac55c721cdc402fc38c064910c7f7", - "c99b705ba534e613d13ebe8333a9f92fd5fd393353466ccafd0cfe72f00ca210", - "49f287d979b26ca2b2ef857c03a60d5b5a2962f748c269696d37d7d81f90c761", - "a269980e6c0ca9824643ba45451b73d0ee4c2b14a691d144d2a0e77eb44ca1b3", - "54ebd7fbe549f9d928f743dc3260bd224bbc799b7d4158ae291c621e08a87657", - "5f07b485c52fcffb2661448cbeb01a423b1750dd7ba0f05817fe8aa9a40be315", - "ef48e78b897dacc9e74e81581d86d1961ab6568567aec89bee3b67680af80d26", - "e0db8ff7953cc6fcebcecba89042cdcbc51930e93960f6a3e7f932f468f14ee9", - "c7694029494e9d1b239c3ad98ae9632ba1c0c796e19eb1267ac2176f87af6d2e", - "6804110c2c75eeb866f95add8c0471877c59751e9ca97b904271844e55979ee1", - "d0ce50bd012aa267c340ec3cf21c45ee90ba74b9562fe4a7da8162acd95d2a16", - "8c1f3c6044f305aeda2188def23a7e36c9ce23fb95bc6b21d3104e04fbecba8f", - "f5ad7e26b6109f0e1e40d3449275f16ad54f01ab8c4c6b077c6bd1c0206a70a1", - "0b0406de3e63372115b6c633199e78bd645908330e2610864303e01208ff1e80", - "14730d6a548b8b36c0576565c379c4a8791ce70aab65dd7fa8e8dce7ea33a973", - "0a3ece09c2486f53cd387fa68ae8aa75c87c945579edea13d42e22d88325064b", - "d0ff54ed7fe66433699d2f86e4e951690fa7f4fc718ae64b26cb25931083bd9f", - "d10fb1988a63a57020a90b0f87a8954ba544e9f48df3ca6eb42e6f72c1b23cd9", - "c7ea6e6b531c93eb9dc6a6044670f34a0096fc7a852906b6922e82b77a7756e4", - "b3343113607e9d2e1d93cb52fd78ea791357cd7fd4e134e7a03771a397037b07", - "97e505b405d5cd25d70dbc1fd518fab783b5061fafbfca9b9dc7c08e9e736149", - "d12ef9583ec88b1da9dcda9a6d0748213f0fcc3a678a21710a689cf5d40dee70", - "b256a63137c1c6f379c22e017cf6684e0f6a65da0d0fbd75c94bf01e02c02924", - "51b9e632ab4f82f3d41ca11e414447f08bdfc186f07ab6a13d28777d0bafee4c", - "b990c0b61156745e497f153c9dc832395121c96c7b0364ddfb53d038ccb1c279", - "0df436d3513ec9902555feecbbad2b11de52ce84206fb889fee8f29c938501ee", - "eea64da24dc1c51416f497ac16ac34b937d41c682d47b0d33b5fa8cb084a0562", - "5d68658b15dee016746587f056e0e37e5477c4f7ab4994eb802763edbc684439", - "d13cb8c105216ec5f144e1215d9b87c04786e4eb23a9e0a54cdd75bb44515ae0", - "8fd8a586c8980ed5555e375a9f19c707d0dc63a4b8f4e7556db821280bf3ea0d", - "e1b3175443aa3b1d75120f1df7263cf0ab4aab2fb949142450c4fe35731db31c", - "f9864544fdf4eeb0bbbcc5de844faf19802c1b9ee58a47611f125b94e90bb48a", - "ac5b4ce4c8afa3fc730897883133600d0e37b3ac3004519315c45ca9f66f1935", - "df29e129948a1df39c73f4e69c061a2912a7c5b295a7eeb0787f4366cc9b3d76", - "d4b951f023e28d2b2007e3428623737c223fdd46da44eda2396162b6a79beae5", - "e84db0a907a36587402da0020feb49dee1476fb8e5de0449ebb211a32825624b", - "a130f49718be264b21cabf33c18c5ae1ca34fdabeb0e826c75b0e5410885493d", - "7efa78bf52ecfbd97f25e55260e6619a4a16c680ad23254d47b60c81cf1b8c40", - "5220c31cead34baa43f5a2bd908fde8c6dd3605d31167031d2654e2ecb957b6a", - "b247833ada9387adc26c0fb21d353848c553ff7323b3bc4b62250a95aac6bb47", - "1ce65b1b1e79432c125cd49b15300bdd7ce249c1f5042071d107c2f1c3a7c0f7", - "fa9a061f58b04d77ea72396ce1ba36f0dc52a97dfcfa3f852fe5530e361a189f", - "689b4e72f5df1aa345f0d54249836ac187cfad976c65a6f8623daada33b05af1", - "dd8bffbc4f74c0a74e5abc7caa39a8602ef263f24f1a97ed4f8cd5668429b9eb", - "09156c7a76fc26546c0eaee2dc247e29fec79f16d4da6fca9922de55a9c1a170", - "b884ff92efe573a072dc766f853bc2e3f8da6d2d67cd9c64bb44a78a75ede0ac", - "2ca945bafa05da5d80c1fbddba95513e574fa4ea3385c3e327bcc56414ec631b", - "b9b7905b6f948e926abdafd5684b62ecd733ede0149d8360f0e4b2546240e54d", - "37b235dcd344e49d75fbe05f6325d674633a4fe75b7f9b736080033ef4545691", - "19d2fca91150e178abb4540307045ddb2252e4593bf41dbb5e8fd17fabaae59e", - "98fa27ec8f5d49615acd003b02914a7a8d655d0ad77009bbcedeb85e54e1ba13", - "2c897ef779c8ea1c4ff3b8f2114bf2320593284900b1610ee51011b4b2d0a597", - "61b4bc8b50ecc8a32db35d1c7197459208718d6ca2db4918dc38024af465ad86", - "f227325db9a9fa750d60edb4bfb038c37180b2fb3adfa93e9ca0949e40b8964f", - "1451738999cea0702cdbc146b2e0a491645726fc07d9f26cf374034482c2e681", - "4edb972fe71da9a66ea06c536beeded8b5cb9d840be9127df09b3e3a0280fc08", - "46c8f27ce5def2f8ccab59fb79e23eb4ef36c2c3d77da7ca755e66278ec6ed87", - "73a40a5ca8d94c197811d6c922f7714a8da00576012f7072a03910caa4909124", - "7fbb31e10670330ee28e20c7695de9c4d26ab768267da34898f4e87f35449657", - "aa3c72464a6a0936a6d9812ec920bbd4cc477674657a90eb25e9155e437b2507", - "27f4391475ba27695a01a3b8e9d93099dc5d9c9c51d88772b4ec3b4f15885b4d", - "f4409e8c3522d1da37afc7e0ca4b8e83f73badd7730eee274f3b4211b1661667", - "cee29aa2a4c7933419334b9ca7ae6d02d453d2cf92c1675810a7eb19fceb103a", - "0c63eb7842d761b1bfa724da090306df945c489889b1f4e6eee59637fa889cf9", - "df315000ae2b72f54625960dab9c1bba8702f096a69a6a5b0d97f88b70a69bf9", - "6c55cc5ae70e0da88ca956c4170fe46ac79a69fe7e001c4f2b6844223ab1d0ac", - "efe3d3ea594353a58bf57f89b81f4ded9a031a8dc39b10d42e4feb5a6f07c05b", - "ef08dd215b2961ccdafc98f881f25fa69a431f264dd14078c8a05c1bbb518907", - "d89fd6de8521aa771567f737616d4a9a3f2fc334fb235326a382f1a40ca6febd", - "4078d07245d1cc1895cb39ab458e8941e80c2a8a15a979394be5b7bfc3a97160", - "e6766e17383edf7dd0a0565241667a054e7b28bb002bd2b4b4b8f21e02343162", - "fc66e5899b50ab95dd35d1f452b15c24d1b189f2203200eae04aaf023a45c306", - "8790f94ca7b1260143c0c8fceedc4cc6fca2594e64ac834093b2e512d8404bfe", - "8d8ea55cf8179369d444b51850c3dee43c9966bd05dfd001cb4c8b3ce6c3f3c1", - "d7c3ce7085476a7f14da7394f4dab42010a0ecdfa4ca7b73e531ca3457ac536e", - "45776d2535e915611231bb4fd256bbf0dca126c7f95387adcba7467b5a83f3f2", - "496b44b12949c31d686907808597940c3cd4aaef98d9c20ff4960ebd42e26339", - "fc4ba88f95c7d79f5716cd03268f84629f35fe023ae9ed3bf55029c3ac5b4c8a", - "89896dc24bd4c8d4869179d7dac90b0f9f0e9ee8d05ce319f41a4f0ba4876aec", - "64bb66c13c3c43226d05ae82245fc632dd6a20dd77f376abd1b9343bef71e7d5", - "d6d7fe641fe93a3a4adf92793f5eabf272cae1df21073a80204cc02718b94fdc", - "4fcc5b04dfbdc1ea732c65e8e8cdd2712c52f66f41a32a17b1bb2a3249f92f45", - "6aad295e8ae5074eeff04527c35a0fa49b1c0226f7fa82be35337385cbe2be82", - "0145b6247d146a68495d8e482ccc348c551fc94a59ae503f3be54960cba2ca7e", - "0c95621ac3e1d7193b9683fb9ea61ab2079692b9e86c0cf7802898db239f571e", - "7acdd15508182bbd3ec6187baafa7d87a776531101ec961a2bdad373fc4f35ee", - "2190047e9ff5eb0da57fc08648067713fc5ef9b06e1258c971ccf093e21c7f40", - "41c0582fc89aabfe88e3b69322b7643e910d8bd53f8b151de76279878b9729d1", - "445f0cf41ff378a990a519d41f369ce677b4d0213b6a521dd570802687314713", - "a8030246b93cc8407916683e512a16c0fa1804e7ffa2bb49f211b236247649cf", - "32514ecd3117591dd71244bd5d98ef92b2bd2fe060a8b2d6379d7492b654e7f2", - "d9ad1f6506150f4c1af5b43ff1f9e2dc16b3d4b7d6d5d41771e7746f41bb456d", - "197eb73440cf4a9664417d78ced668061ae4f2daa10e31c2d148f3224b23b63d", - "43fcf78e109a8501c750fa018b8271452f83e1979305c38401f84f6bc1f7d9df", - "ad0d38a86387dc32088f8921bdde3e954c2d1c5f5380860a372b9d36ba27a0f8", - "3f3d9c0f6542201d96ea83efcec59981161d28a2cfe144ff669d08bacd3a64a6", - "74bae884c1d7fda61b65e95f80fa6ddcb12ff23bcb98b55562f2649a21ec73a5", - "544df62e133f782b28d9320cc6c2c828f0041a137126bec464d2536c5bbf6ec1", - "878f6410d609915280d7c2b328718a05b86aa0cc1e9f84d212785fea0f18417a", - "a37146b6d2abe42512666ef26c5ddeec0fb8c39218cc26a2dd8b41c80fb33488", - "da46cafa4a5cdcc9b628c814dde01d6de932556a464746e9cbc61b8e47cc2e85", - "1197004124ea09393b6619621cbcccb2fb7e6930aa26e834585fbb01e01a0832", - "3e7ca39c3e47d9cf4f2b123bc32a76854ccac071062fc201b8c0d75eff002907", - "9df13ec6f5c494be63a43567bdba12a36af3371e9fa0533d49e0acecf320a713", - "459d8c1e7a05c97143d1e9be4ec882349820242f1f1f1c082907391a6c770f54", - "c8e9faaa808023647f59ca07b4cc2a042eaa5e5b0df70ae568cc4c2347cd7253", - "5d0e027bd209ec9efef87ec6ee1de9093dc01edbe40dcb2bf5cdcae7827bc7c9", - "43992508de9b17109033295c268ff0d622968c8cace5854f5f4196fe40bb2669", - "cc5cd7527d5f5e80ab1e58bb37b15fc84103dcb064b9c3a9dcf2f5d103df596b", - "7e05767bf55e7616b5fce2da76d8ddad97c85f9304e379bd7513f8fed1c4c19e", - "0a35966f243dcb9bb34125d4b257a67e1ada94c8b48916bfd20cd83bff90f772", - "4589ddfb7aad560d2eda57a2a3a7f8d6e9a566a754299aba50a5dbef813a9751", - "b52d7b57af4f2fad43c03730721eaf077253df9f587d1ada820076e5c1412afe", - "44698c011833990da459350d21cbeda3d14a7ca62468cd36d2a341de4dacab3a", - "52675104e8b7f17cc10c3d6e158c7fa54d869a61693a678f548957d90a96f384", - "065a2e82c9dac898b0ace072850d80e84c0bb10aef86ba159f0573310fad778e", - "50a1cc16409cdc241d2a19c937461df3071c7f6dffbfdc7554eb42b95af8535c", - "98165c9e09ebcd29b7adcd9037ebf4f10b5cd4b17a182961150fb1fae102026c", - "b788e7ecf4974c8b6b12c375d6431ca4aeccc8070fe2b122f8e4184936ea659f", - "85b637d0d8502559a2797fccc487a5c5d1327c5ae485032c75ca98a1d0b00694", - "65f0a07e93fac0ba06e645be9bc0a8fb03146354107b707a5de1cc26556147e6", - "f7bbe45a7737f6568490154b220ba7b2f5d9d0378bd15fdcc6b0f5dae32071a5", - "257447277d93187323565bd9dbc7ca9e583da50f7149a5826ad84ea1e0a0f4f9", - "0a7bfbd6bce3f693df550bbff5c4230561da761d11b8e4f185bef34a04dcbafa", - "db012500335a72981f575d7313d791911e5b91c0ea0ebcde7a8ad6b1edab2724", - "8d34287fb3dc3a3c3eeb9cdfcfce2529dc84439c3dc571873f43c240d6fd9a66", - "1988ccdbe7659d6165614971d2c0eb643fec99b0e7bd7f3dcb788750a0b6361c", - "6f933e69838a91c5060f1fffd376b2b50468aed84f81186199dc1004738d26b0", - "4487bc50fcdc111de8d4c3df984ee1a33e72532c3d6079649477f83318907ee2", - "f5af1bbedb69b71485b3620e24594e385ffb8beffbcf57cd604d26729767bf08", - "ba5da2f8614f255fc000031fba6dacd0b405562a66f788a6d5e44a3f1b89650c", - "dcfab407e691c5d3606523e8de6a0d0844bb0f524737da16f47a3f7e501bd21d", - "4c5f30f3a92be52f94e25488010fd5b3f792eb6501d5bff69d6a17c76dedfc14", - "58986c8fa85fb80e5aadcad280fd2f627fdbe84dbdab9d1c8277fc5e45798367", - "bd4c542430951d48b47de71455e5c7c2bd3f8dde134ff7acf4d3a5b479f43db0", - "76881d18681e3bd6d2dc29f852fded305f15bd079dcb982d1ec3ae7e1818db0c", - "48595031472026a82dfe01db9859ca30cd86703e8e13a1baa372c67b01d650f5", - "3e02266d43a8639055a75bc967b5cb5386edece934b78b6d297eab129e131207", - "1632544b809fddd0022020fd15e04e7aad6aa69b215043ec67a77a6e779bbc16", - "6d66a8f95ce52dab3e44675adaf00fbf4ec872bf8a4441ab7fbce49aa4ffd9d7", - "fe3ad7a0db1b1dda0ca12bbb23a9b5892e1c36d2a1d15e8a5d8654c2da26f1b8", - "1a18dabaf770abc7797ac444162f14c632b67d67078c19098b07b523a5406b06", - "4b9ff49f1775e126e93ae4c33a85b78ae938d1c57ce2fd013fa917e17db997fd", - "2c7ecebcbe901f8cc1abec410bbbd6839ffbb651f03e54bff4b0dc9a8617d9f6", - "bd9c8535cfeac8bcacb8225ffc607beeb3a3fb5646aba42546ae92df0ab2a0cd", - "6075ede8217382359690fb5b8df3f64a45cb4e66772b1e454729212d940d0cbf", - "5330204f93e7bebea6c27458d87e42b6309cc851062d3636c2683981de0486d2", - "0e8413b6f74943769b8193166cebcb8b7a2368a66985b876222c51d838e88167", - "a4170371858b619c4aeef1c1d8c2adac295479a2822648c85060cd695a749239", - "c96543f69bec78e12bea8bf458e28f84a657287cdbf3ec7a3858aff22f16bc6d", - "8f67d5368f6a64c2913cf9099a5454858512e7cd5b2e3b97309cab85b7512378", - "cf669941c67e9cf03f2585b37ab47a00a139dea1b10e7940a6da048018077e69", - "075db7fb0a9b76ad16976e0036e0d476cc4a305b46dc75ed82ecf1471055a6f6", - "7400cdac82f69a9801a54542fa99ae34991150ccf26a98c296fe8031129a0724", - "ec09c423d36886a49ebae838e092e4b0d605ef74c383f5860d5a82d1d20df2c4", - "8ffab31def6ee079c2b469ace273b96dcad930de2a71349c7fcef70f920d1e49", - "176831932fe878b77fb2ccb45bc57b94b93b466ea0139a54e4b00bf07d5c7b46", - "9b87f2b7ab7f56bc072cc4e9d3a5e6410e82438c63afd1be29b477fe61b61efa", - "16e3edc4b96d15c63455447f477b56e84724d470f73f8c2b301881a53e27ba17", - "8a13c087500bcaf7a23a03c531e75a1df14b739310836e9923aad2be30a8dea2", - "15e73520a6f65e4b4d909fff76d0017f6eca044ac5c36b8ff1e5a6e231d8aaf2", - "4168f6aeeba5f20a513bf2ddc1b3d5e4fea12becc91de0f97938a35925bc429a", - "bc1dd6ab9abcfd1c81ee4455494cb78956a683bc6ce1605af41ee224da1155f7", - "c63698302da75d32b5222da62214100ed1a8d81da52444b1b6b62f0ad10a00b3", - "e204d7010da77af614e695074f23c6d3003e2d045c14bf1c7d81798c4aa60d6b", - "b55c9a552b120b3f846b69e1a29b2224ae029c3b4771bb98d41d188cb8afdfc0", - "5f813e5873e6eac6cee5f0f32478f813f649aac69d939539dad4f08e71f586da", - "6e68578beabb03bafe2accd2f43c49f62aa8ce625ee50d5ce4df9e458ff759a4", - "82a3063df512d45098821703f633a7d06a8b04d027d4b546149d8c6506603580", - "97f457cc5066bbfacde08f1cfd74867c65dfa612390f8d04a3f74eb68122d56b", - "5fafe898420e31c665464ae4e74536302e0b5f9be7380ba2824528b4db3a5c7f", - "6bba1e9b4b42ba6287ec9070a4ae7e847d33e0bd02a279d966e6ab0de1ddd8ec", - "cde5ad0c7cbd446d0d7b1d16c8a30ef040404855cf4590eb9fa3fd687e90b0ff", - "7cf16c4213ac8ebb1a9301f6a967b74e8483ccb87f3dc823ee6e7691a643e8f1", - "a4052cbf6577852df69f98e880bb70d41a0b08e95a1cd84b1655896eda45746e", - "f15bb5570b0e950cc4808df3e254a4c20c9edfc61fca058fb182093addf12a98", - "dbf10fad2167fe51d89247f29153800d066336275a7bb2114f4219f0423ce1d3", - "2fa14022d47065ae184e4798b61443a3bf6b8cb30480fb7bf8c0e79040ada4b9", - "9b9009f2970a52d232e1a649b79b91c5d7b45a5c3e331933189a766dd9397896", - "1df33030004c960b3c0161a33d06fa5b0e1dc71ff32542a95d380b2a0e91cad4", - "4d1d7a5aa53879faae2f1d88df35384eece3b5e516ba39f6cc2a9391e7df9d6c", - "507bd00d285457254c0e38304b459c513b11103828ebca23860f44e733c17816", - "750dd7a9d13742610d8820e105d15b9cacc800c9e3bb94a2b041c011fd490174", - "e99a46dcc1457ec99c65ef7c95a80258cfc3d80e3f8713c2d85ba352767dc541", - "2647d1f8e7a215375004ba455a9b3a7cce519a5dfcb3a3521d6b1f7b62075348", - "d97d00488f373c2a14e0c31ab3d54e9c56ec9be8a4a2d9045bdfc214daf2462c", - "99fd9ca750e1faa8bd9e3b2c1902837a99d8c658211ac9fb9283880a027d2b6c", - "d54665045ee7b3c27be290b4eb3750ceeddad0d2469cea3aba4c933b4a500285", - "8084d3f5915443af575ff4a96e0c2969a2658487c055855df172c498bde36744", - "c0cbef3f49a80d387611f4c096dcb5adb68ed76cff63a7e5cd45b48e20bafc48", - "fb222488762110e23826877e3d4cd1dd54737086ce5770c9486f3f7f42b17575", - "1ffd0aa96b964eaed287d4ae1765d508eedf8f1fbbbd01da5df89ca349879000", - "30bfa8d9367081132d6d548396bcae4c7323133b1ee8691fb9abf3e20d65bf75", - "0f743521432632b015dc6427e19568f9af29423fa9511fef2c8f8a5d0cb8ba23", - "37fadcbaadeeba32e10a49e69cad2172c9709ca04d69bd667b7a3982e3b6db55", - "50cebb6533608cbef69ba8f07c059d4aa43bf50d4a1ad71bbcdb33a2a5a16405", - "5525ce867dbcf60ae39408eec78dda18cabb639e1c408ee4c5b8798523748379", - "1bdfa2681f6c4542214a396b55fc12184aa1c28ea19b108907fb80a5bf406726", - "b5b1da7690602c3b97c69a1ecf1379740b8348a9d18655b7d0bf4a42c22f248d", - "ae9c88ed3dfcd5ce2b87bed1a69684344758b99fe852c0010bd30827be2d613c", - "1420d5c70ecdcefc136fbd0df6ef77e7e1107cab297c279730a979f1821fce85", - "696a2c51e73385afe552e0afe1a73b42203d1b13b1d7731a559b3a6f40b9f764", - "d169a9734c6ab97ed17ad5fab704d732a9e147b6c04293f155061967e9a34c43", - "56ed6e59b90519992026590c72d2ee78e6b47f9feab1ca19154f0828b0120953", - "293775569bea503ae7c374394ee0220800633fe696d74b34daceb853d3abab7d", - "6eee671a53d1a6245b05e33086950435acfa16b8bbb91d96126e299c24ce7d20", - "2d0845161185475888f5bb726fff944bcc902fa41b66e0e5a25177e0af2e27c4", - "d037fd663553924c60181f5429d2debd9e05146065c23d8af23ff8a228707fa7", - "f8494b6f171241c18a415e651a1eab97ee5e0036a1f69295ae94729242d67042", - "f283952ad7a729f680a83b10786fdde3a6cf8559bfc9052e6739afb2286bda4e", - "168400c0065b4c0f7fe4cf79bd113188df78d7e3df4dde010c9fa979b85bfee0", - "1da2621e33ba3708443da7bbc3b561348eac307a4deb87fa9960051b89d3909f", - "b664e35037499347291d126909c889055ff6b2c1ab64dbe7619e181a4433ae13", - "c2bd58ff4b917a022c5be79f9fd752a58f31bcb8dc1152e9405bff9145ad4794", - "be92742d4e6e8d7e1b5a3610e8a95450ec1661fdc64cb3c31a025948c6dfb03a", - "f80ef6295bbf4c91bac7daadc4d7ea6c324152dc402c87e82f26461df3e1a051", - "504d13406b812b19361bbac84d1723a74c79dad5accc165ba389b53d6f0424c7", - "0ead2731e2db4353d31112f659f34ede5de9c9dd45d19cbfa6bd7833aac26e45", - "65997dca3fa07aee2a9add559450d2ad127ff8ee9608e87b5e6a639db993b46c", - "60fc07a88cfec3d241c5584bfced15aaac5dce2f36f6af1c3861c7305daa2f25", - "641135767ec03ca9c46a8d5ac6a4d3328e306b2ca4f007b82fa39eb85fd11b7e", - "c37d341669d77ab2642f3ef798868ddacc6152009c5e4c1ec0a49b9dc4b0b2cd", - "4458168a87e5a7220e383e70beb9996cb52dd3423c12fc23c3ef9d19af51e0d6", - "a70e8eee2c4539125c862226df62ce34c9f03fb857e043992c2a4268e1ae3126", - "1caf50c56824104db158727e28ca04b474edaeaf497b9e6649c0388994c88223", - "07ceedd8a5e00115b051e7c0eb23f8a6805356652c56ef109096f1605c674ce9", - "18490bcadcd11a7728b79b03989bb0548ed8b3eecfbeb934f4a7c9a6ad939a7c", - "caf59f9d3d2844e9a7c090827c4af875d7d94074267d7d83d4666b75d0291be0", - "02a76a53a7b4dea40f2149a83c3030d3a58c46a197b5195ffc19917c9fe0e8d8", - "a08cad763637f9d67ee9e3730f54b2926391074c1a365eef30ed20d032e9d46f", - "37bed61034e1108d531ac2cc90090f9de6c8619a8c475fb2361eb6e24bd91460", - "5f3792b34f469657eea6a593a13687ca420c125bd8872dde6b967162da68cc86", - "5038d00fc6c063c4af6c47c805741f043d1a1045c8ced0ecaeaf9d340d3acf4c", - "8cb061111d8e6300133e9e82af377247bb70c4a0f1d32d6ad5f1b94fd4e9cc25", - "ba7ab2ef5ce529cf88580e19fc2a59f80de9ae29c70e1bdc70b613c09cee6762", - "3c1ff9960813ba1cd015478ec6a41779bf6af6cdddf86e9ae01976f84999076c", - "115273d25afd9b24569c63ca2e2278751bb227dfb6c722c09f2d653473cf5025", - "26be1a919ca6d04631b0e4952302f033c52ca2b0fb3ca805e83651b1a6bd0db2", - "8b9b0dbffe93d888c6a4dd21ff1f84c77c5d57d281617bc05d7abff79930e0a9", - "75a8ff29324ace62813eda879812474513fae2c2f0cdf7784044c8ef5dfa0dab", - "deee9c12837c2327f27fead95995af05ec993fdc75113917db00debd87be700d", - "45262b4f1ee63a6db070cafc0a0b7b707c6e003348c0087e831caa6a114598d4", - "63df1d099961766bd1db4042985d0f8dc513cfde8a67303852dfd4012e458ad2", - "0fffb628882fcb933825056260502effd07e6805b3c296e73a1a72794c958078", - "95ceb8ba74d9c44dbe79d3e1aadf4bf4392a5ac2b68686f2f11a4fd1ba4ec1f5", - "85ddc18e11fe45f8b6f3d9c596ce8150bfb6b263e1fee20eadd73d1cf9790260", - "aa0f056f131d764ef0aa35916007c724e2deb01baaa62617b5cfe30935749fc4", - "0f5ff86e9c651d9f2c701d96ed8eaa0a1611430d92fffc5721b12d8e1fd2723f", - "7c729f5a42ee1a105fb0e74e28524f0283ff1eea55c6ea8b22c12c5d6a6284e1", - "9e2215a2892453af27d1d1610e2ca2593a944337e5fba5def3caa27a068715e4", - "335c92964b7f446486d6a31e2596b649e57fa81860e7a2ba692349bfd1c0bb3d", - "d6c89c0aef87945f70ad787bfb1d292ed46f67d2b30361ae7f3c895509291d26", - "ea62d54f902cba9e78dcadffe774abd20bd540a4b8dbe2ff7d50de011e6a8628", - "92668f67cde7a85dedd832c11bab8933ecbefad6466c744bd155ed20e0acd63e", - "dfc08f4f24de2bc533aa59e6f097f619711fe90e0f0cde0dd015576a2bd564f4", - "cf13545826f5e2b6476c9a8af94488d9a7b1cb797617d6b5e9f7cfc053662217", - "70e063f063d5b2a1a66fadb1cc23fa4e6d603db78e510be6cea6c3ad84fce5bc", - "f406b6b99ac7d0a294a85742de3a0878918dbae44d5cc7ac94e1c4e5c193cd6b", - "59e3a2e722dae8e84e316a4a7840ee470bfe3873995a74cb0d19e44acbc80a34", - "22718f9ad9e4428ae34821fe630e41e19a56adf9f0bd74b4948bb84f107553f1", - "01e66cc830bd4db900e6e69a96376dcd0aa1f5c37eeea23664cbff98d4e0e98a", - "ccc52b5d359d8b8a269dcbb9bbdc7d94e30d6a55fe2a7d1845b86b7692405bff", - "f174b829b64969f58f66adf2407f317df3df189bd2e0eb40c89d2d2b67234f8c", - "d70ec71310d48f1fb8f9c4c7352dad65d73f7996eb08d5c83b06f7692b52b74a", - "795eb98fbc6a470e7f03336e02b6e6a150d9eb67e2a7c2ddf552e4e711cc2979", - "263bca0daacc046b7b45689cce975523fb1860aed89c48b6ec416a4b4061d567", - "ade10b551a73576d7902597fa81c0b79e7697dcf714385ffaafac757bc8cb664", - "82621084b520db899e33a95f4825a8d11aca9522c42bbbe58ff3e8568f42fbc9", - "9fc4754a2442bda3587f59e7f8cc6246ab03f09887584a587a6fb5e5d8576036", - "41525746c8cc4040e08d1a085b4ec1093c5c1780bf930ef1762527504fb01385", - "3d541775b09a86bb2c33e5b8a809bde1941db5fcd671de25db5592b54465189a", - "d64e389c01275cd7443cabe191eeb6c2944452f9b8061f574afac8d9d583584d", - "006d1f806a958a23d1eb168ac181c2a35607e9b2a41c4ae96717223757f89de5", - "366e449d01e40027dab9b0d64b864a422b2843f232ae38c0ed777aa2b8d446b2", - "5bee146b64dfa1332b826c8b985b1edf3505d163a4ed479a2558bf1c7e17bffc", - "08949991005e0063d39f8c77622c26780b2c53c0c052f378251f1e596cf18b3a", - "526da5d531f7bf64a78f8b9bc56229d307ff3460df31dd9a3435f45de95c3c1d", - "d63a20bd73517a49d4206e510dc3ad3b6bb9249e19dfdb961f1c84ef377f394b", - "84ef2cc5192911e95d591ab00e3ffc49f4adf153332be60eb158eed277ae7501", - "239e0e64e564f6689b04c0b99354939658d9103e3033971838092813c726516d", - "825ce5fb629a7884e0f60ca005eee73c1bba49226a102b4e5da3508f845fa796", - "6046eb8ac3ec3cc4acd63e941c538b3fb11efda1959c625b4179f8e21dd120e0", - "b91945ec66b89380bd359911f7627447a4d1e15c77fd1c53b1c73f2fbc5f14c9", - "211acfabc5c1884aba50142c658f1b6309b0fa490a8c427c6669c6ed5e9bd7a9", - "a4a446a7a19fb17cb2bfac561f2cb341581adc8eea3d2b9e258c6c024cba0950", - "001bdcf9c7b751fe72339d87687237894565483425772265ad5c980bf78d8cb3", - "90fca338841a57bd6a8534a52733ae6d206d7e4af23d2b6e783b2f9b1d5aeb0d", - "fcc0cb384132f3f04a56b7608f87a37e74a3c90031419d0b83eed0cce8655958", - "dc680ab1aa86f8317b2f3e04092ead61d8275b09d800fd75413d79947e865712", - "1a17ae4c386efcce9436bd231b3a504b120e92e0fc4c3cfdac7c37f539679ad6", - "e27a1aed182405ec83b20fa6eb3f2eabdf74c875ee2d4672898abb3a5ef47049", - "cf587d51488d39e6b6e15d005d7bd232b17483541f85f280d62ab497abd55fea", - "f2966af90b432c118a1593627c3e4eab35d4867876c084e4b329e0f5aa68f01d", - "cb92e42fc50c17fe989163ecbfceea16b59fabe73e22f46271264efc7003601e", - "6a91b34b984c402319551ca0aaec77f868f722a618a3cf474fcb1e48d553a7f5", - "eca6c8aea65bd6c157f02db4f9071260420adb2790a01ed302fac858c2b3ef84", - "7b595058d6e98abcca3300ee7ec01573bc626cb262ea3ec1e7fda7fcb4a6545c", - "64172fc5b397e001b871cf0691a85ac3a5d7c0fb731d02077280093061053590", - "64770b996eae5fa35e34b0c6ffd3d3fe7c7a1ebab6b375ac600d1ebc40b2e5cb", - "968d90d5fe9e7baa5e826926669d05427a13d0bceb7e02769e224d479ffd83ed", - "19b73f4fbd579a2aa8a9b85a32b4b1f417a40884d016bb7c5fa20c485b3da846", - "91f3c7f2ad2b03f342d3631292466c962d7c211ba0c6b44bad46017f22e6f8cc", - "a4d615a8102152868d251e233abdbd9cacefca2a2f251ee474fe77df45f54c5f", - "5e8d32dbfe6c052c3fdc15aeaa6244c76ea1f2e8cee04c2bcecbcfdba685578a", - "9b60d8e95aedb402863aa3dcf9e11315d89e28f4c8db483cfa8518cb3b969d49", - "8d64ba5c017881a53df468780bc78948d80880c8680d7a88420933b091f0962b", - "ba422c44ba865bbe355e8bd8357150bd39ec10967d46b5e5b0a9b96c6209f180", - "3766e86bbdc3bc3dc1f41789e4e2e54b863b324b8075ef348bb06e26e9f6235b", - "5ac6a9e75fb84c4ca4e73fbd97ce08f154f7c89afd7e2f999f044f445dca0b89", - "823eb80aa941262c912ebbd309883adce668b2ecfdb4116a33302557db42e569", - "664bdfa4d6cf8e78e6c0ad198bf7788fc25825e0c3168dad759f9b817ef3a3ef", - "75a389ac607a1ef92a89bf7001590d2fd8318aa82061b5d7c5edce8949bb1c3f", - "23c4f349701143c03e2204d4d420ea13180ea1532e419857d73d8132e47efb85", - "8c3e41cece792b00c04f2a33efc1fffad8e960d64877edbf9639251ee61c3e96", - "d290e30b699aedd512cbd889e8370c9a8b884e2474f6df5a1072c535c53c70e1", - "be42b84d59f4ce7684db17ff438ebea724f3ba94af018811ff5b3e51b7a1ddf8", - "76028911b02d67cd8328ffd400eb1159f8b396368fbe9da8f5c364fb964a43ab", - "08f28f8875d97261ca6ee15c025c475ceb0664a668d001a37e08e93a624fcc91", - "a669cc2f466800b8d47f3f34714a0b5b3e11ad1e949dafde27080e5dcea7e604", - "daaccd6ada6f86f80b20bcb6375cf3bb8b8e4a0c1174217dfd82637e607434dc", - "68b6d37f0a1bd71edba36b88f358f184255865a35d039f1506970086fa358a91", - "cd7b89c062294e8fa51c8c593d185eb1c81e1b88faef96b155bd1fe705aaa06a", - "2168c228cc7bb8659310dfb6c97bb7b34b39a697013441b4871ff0cad941301d", - "1d9377a7be1f39c92e934f604746f4e13527277a7f85fb84995091486e163c94", - "ca51fd3a1694e85ae5c4971d259401907b139f33686be4b0b6162655d5b8fc8b", - "59238c5694a9f81ee2263dd36ed9d4be270280526313dccc9504f87ff78c438a", - "9f0df9f6938dad4050d6c64bb29e4d6f94a92e974f3827b2a9bca473cac7ec95", - "67fc9461ffefaf7200d96dce772d678fd44dc1e5728b2332c81ead0fdc321f7a", - "5ba2457932ff6df9b51ec1cae18745d33bf670b58873e294cb208d80a1c090f7", - "8e5e66b9c3d9c97781b5f9f009e86c602876962297ce81f5b75279e3501151ac", - "26409a622a6bc44b6502d2820dfffacc3db991fdc2875437c5c90bc04905c620", - "3f9c66d522ded30fde38acff3757ce4a57c8e71b771389b6b96beef74a07c665", - "fd9ea93dd3a34d43b47efb446baa13dbdbd694410fa2f04c26a5df18726ccf72", - "a596158d59fb73722006da4110893bc38d8664e31e88f785e58e919ef4ff544a", - "1eadf6c26383ebba51ff5e04c50499f06c800f5107c3a628fc20285c1ecd0b44", - "45a7159e921352e411833c802ad187ad52fa2f5cff7db43a85842526dfcda45d", - "c4d654938ae13d4d15a76551cd0d68a7af080ae284d2656655c35454f51b2d9a", - "91754d567440688bda6612e20df092d8e834e96e8c2458d77525d7bf1749ae15", - "80e7486d98143ce87dfd6167102b42df22bb706783a6f4d2ceefbc441dce0687", - "b17136bc4a7ab4667ac5e10a1e47cb9e89b35746f7d8d2beacb10ae5186381be", - "8b1ea29d604f2d23146d6dd509c407090ac3e8b7701f1b3433149ff6bcb760a0", - "a1cdb8bdc007a6bd96f7ee379400fa6964fe961a877fac22b10b25a393722449", - "8792ea0a4b8b46702d584795eafbc7fded62771cff265598a080233aecde38a0", - "59f263c944de5962f0b44315e9b0a63801fee39b4d19d581a8c9e20575cce478", - "218b5c4bea005c9f7ace1d212df0fba26fd2c2c91756554ecff3bafeecba0f35", - "09b08575f5d5570c38bed071939a38e0e3119f5a240e1d81f763ab303a9a7b0f", - "e43563cd941a1b40a4ee9f5dc98d9a302989bba536024fb13502acf047e92046", - "3cf323c3dab7d1fa729dac6f1e5f272ea6dd478bf53aa8fbffc3e79ea3a7b43b", - "319ce2c6d501a362d5ed8c1aede4a295fc7fa33e6da57f95b0f074ac14c5a342", - "a7bd21b2c1ae7dc660b28c54de05aaa385c2911e2a058221cfe3305c6c6037a7", - "7db48db3102f1c926e9cad9dcf5569cd897fa3c443ff41192ae804404e0d20e7", - "fb31b62b1a9c17b68a3c4e946b1e1be56885c8dfeb3eba09b3a047c98a4a9ff9", - "6bf2efddebfbf25ae8865a03c1177ffdc94d196eecac39918b7cfcf706110acd", - "db448d0aa874b0db58703a79c6878b5f7a4fca2c896f19e7ebaf26ba6f47c4c5", - "15a1ea37c040c9fc6ea00e15f34de8a7dffba8940452d0f5ee858877707f91f4", - "700fd55794890ad799df7e00d225ae4a5e142db5b8ac0b16bc53100f1f98f314", - "81495ebeaf509520e028db61eeddc0d85d6363b03d6084a5fd63a7736033322e", - "8bc010f17723cc01aeadeb60935973cd618cfc1c4f8a91537b5852ad67081e96", - "32be5ad6655006b21f1c62059e04e42689367fd1df8c98ab53c05cc4a11af502", - "1ab7d6ddb9f50c55b856a077aa09856f3d0dee7e691b0a984366b2665b622c60", - "513a54d9f02eb3d68f71e0250c7fe4f01ed6e12f77f623104013fe5aabc4824f", - "d9829562801d0fccbdcb3c0e4db808052f9b7d25703cf1ad4ab4478971f55f6e", - "d5778aac3a22d4ce886d6ae7aa1efa5151058013296d4e8e3ace7cdcae90ae42", - "70ad9de23595cf52e1d1bab2348a5816a5be949a2b65ca1db21df053b3bf9f41", - "32e0d334048232075b0a2d1bc223630bd386073bebbcbce23df393683d7c8dba", - "1a8c69ff9d680232659d17903ef30cfecc4d03d6c4db55ef09f308aa00f02e11", - "a60bb443e8e1f584808c7cb1fb017b3336252a5f9d4d2afac8a3d97e05d3edbd", - "58b5a469be38f16e2eb52525597ac149b7388ffac8a8c8c2d412952fc1e73007", - "835c1e314f7b6615f676c9640566362b32a0107642d20cfd8d5f48c30ab3fe25", - "effd30a02713aaf183c7e921451ba37e87a5280a511056e402616ee018ef8f09", - "66862dde866387b9d71beac5f6f2b27b5d0671a4eb1e5eb97ebc1a7fabb1c05f", - "e9d19d74e7327575939bf2aef598d2be173903a2a7f9e9d81ce58f8f8ccd35bb", - "9186e6f89d7508a77bd2c235c007d0357f7a497b1c09a51e97f312eb16737c93", - "8b156ae963f3ebc2b005efefd76cb8818bea5ed7e500a835200fd661c0fafd73", - "4f1746df6aa685770a3100fcaf36a88df592478b815e7ea8371986a4982f9097", - "a7802b5224f99c0c6fcf470f16cfff759313cd9fcbd0906fb69d81525c81f906", - "2a4eb11c0baef2e20af02485dd95a2727694d4c1ba01bbc80acbe5a2b9275c69", - "3dc3f2202cbc15f5238c9d9fb23d530b73fbbfdb4239bca8b5a016bc0fe8e42c", - "258e68334b3da5270c9525c9e8e91070a4aea0cd6818842c303f82e9216fcd98", - "df19fa77a9f4c90376167ab2dfa61d0da1005a22aba80211fdedb62e0c580ccd", - "9867a524b5ed5f474f93fc822e78107bdbfbd62a9b8af9457b94bee10605b86f", - "06de6050b7d151187b1815a4019e06198bb23e0d7656279724ad2bbeebe6a6c5", - "47e59f2d5c4c540005dae55e02e1f46baf56d1e8c1bf4a5e88483b8d2b693eb9", - "1af25e43364f0a638113bf0a9c81e3cf67f6f37b45f5df627ae4ad52bac5d778", - "e5161b6867838101dd9e65c6e6791674b74bb2ce62cdd82dcccf111f588b292b", - "9aa9ced384007ed14446498c5a978bc0f030af1257fc6b3fc04347f279e4079a", - "b36181eda654c45644e42545b41adbe51fc887deb1e7ac1bca2f03ea675e0846", - "1b38b7dff12558546a6bc96621ee8db22a5dc0a41f2ddd44fdc3e5d6f34be016", - "7a2a6065259dc507b90be2dff38762f34ce32fe55fad5063a58f80e1e14ae15f", - "b0d57da72d39b0e25172a54227525ec3199861afc188cb1cbf82f6561b57cf3f", - "719ff35b00b418179b0bcb3f6e4fb416e5aa88d26a698ac89032c1f83a025585", - "1a5d1851fe07df762e98ff1b14729daaa61661449fd0dc50c59221d3b3b05f10", - "4dd55d2841e01c002520b4a2404bda7c563e8507c3c3dfe9ca3d8537eb26e6c2", - "5adc7001c70fc16e00701fd9aea75f7e8f7af7cc59a02c55c946cd60dc3a96aa", - "ee80256b82562efa34afa9645d18cae5cb74e79af3f18d9232d8b106299ca5ae", - "259dd25beeb25ddfdedf6aba1b22cef0e98d3d2ee7893d9e9b6319c7cd14f76c", - "e915dae0abebb7217b5ba2f3d37371fa495d10e2a523e31b62f126b65d1b1838", - "e76115643515ebdbab9d3f033d66130a9bbf5ec6c4610cb93adf35cac6ac7e3c", - "f4a46f346301db8070080db7e307347e82bf8d0c3a0b78e037ea9be55d9c0a7d", - "b13b125deee22333dbd68d5a610e34663bbc80a171e8bf88b7dd30671686af9f", - "27b5c36df905809b81fcad8e9a78090b79282e5c9dbfcf73600e5ad790e7c9bc", - "6842a55c1f67b50581adabfe732e310978874caa98703eb135d63add62fee2dc", - "31d2ee330ec984b49bd2aa6cc76d2020e5edbaecaa426ad2fe6624bc0e2730b1", - "a657cbbc3ac289ba58df203d6dd83bb5f454d63af1c5e62c9e706b8931a0fe75", - "ff6a6bd029074d7f473d4b5c511b36830f6087d798fe49cf36c1affa11d7e3ae", - "9ec4a14f880f614ccf927ad7aeac8f6568bf7f41829b7712ce5326bc8772b5ef", - "a7a016534dda0e8c82d9e7fac109431703abf24cbb01b5ee559aec1b755116e6", - "7fa5a2927d96b6a16fa64dad8bfa690d0089be1bf39699d0fbf7443bfae1ded1", - "fafc79144d51e86c654e2bf6c234c940e1de6901db0e5c9321b5907fc3043d86", - "57ce9d9b04f1c35312d43146c46c3f01e3b9bab0a9dee9f144ebac8cc3585a1d", - "0b0c5d47518cf457203370e87cbe7a718b373c81a355d81ac9a199ec4cb86388", - "daec153212178d5553979142996a08b421a708c0c42e91fc937ad78a94ae7d27", - "c61dcbe88348b47928922ea3ef640be5025c09b88e30460ae0188d24f69716d5", - "e7eade8b5ca4b440b47cceb365d606acd9654f3feedaf74327bec8bfb2809630", - "0391d0c8237239cc602016532c770e7c4da2fba1f6f981f642a311dd5ab05b4d", - "948ebfb37360468a47018e9ec35f9e15effd03b6aeab83ae6c2cd737d0322117", - "5c5bd6c4af4bbe95de25e2a83b2748f44949e5bd8b4554c2af538a698082f9a7", - "d8ae067310a1b01ea12948338c9300ea86a144656ee7ef5a2eff8465d264e4a9", - "01c539195e6c1f9232ad74a463a67f8945454994cba2b328cc6154ef80c0bbe6", - "4e6d1cd9ec840f99affc31026257e15664ef2576edacc26416f70c62c8cf38ec", - "8f3857fd1e21bf87361bce9965cda1f63ac7b15faded5fe34dd9a4a20db5204c", - "27f72d8ce31301c60f833c278e0f87e9ebbf3214ab396b72783b1eb12bcd3347", - "4b335b86782d06542630f0c4ec26fd40d95bf97b20012488253a5407da0db1b8", - "78c8f7915196c9376c6faf2c3b2e7fdedcc3effe4dbc322bd8222fafd08c14a1", - "629d772ce32c27d234573b3c76cd8a0a3c0c62d610d2a30019fa21096e26fe6f", - "a1d8b35f27ac57301c488e5035f7927867e465eb18774c59078410ef57654568", - "e3e54418ba07d81b6a57e0e059b1b04972f411a69f70fa998a338a3bb78e7d56", - "fd9634dca2a37086a455ac18e7863ba0ae1aa09b905edb9bf8117483249afeca", - "cd1e936cd858e0c6cc49e74d7829a0545bc179b2645eae67164b9ca86c8ae567", - "121e06790bb9adcb163d48638a7a883cdce25fe0532a23a2069172f182b0c70f", - "a6d64c40ff712c7bdda52e553c15575c1a04175002d4bcd5cb18d3f740263147", - "a628cbaead32dcc2d69aa3cf355aed26259bac3c16859d70430883df8fd50509", - "b8aed866a86b1b4a02f2fa6c439c0f5e87e1c36320a84a932fcea17aab22593a", - "3e034afa7dbb63eed8c9af74750ca8b56e453b7fa469c65d6fec9490d0c4e9ab", - "a4c67dee00bca7cc5cf398aa088e2e1da49fd4c2182b57f62e1b68d233631e0f", - "b74f8e641fede15e5a2d7c47b87d78aa9e799c35c25f9cebcb446c746c119d98", - "b40ed3d2d7182dd244b573254efa695761dc20aea88eeb362da794058119fa6e", - "9eb3f35d06334c7ef814510a9f7e37a1c3f2114535c6d83eeaf439ff29da4911", - "0ae8afadcd8d21f909c7e4d5cd1fdbc3c299d5cffac85a4a9f306d1159866577", - "bc90bf0f3180ed5b8b06e206b9df7e53ee0335b3c48c5b9ae6ae01c5138c57ef", - "2c8cad7b0a3ec2c132509bc82866e5f2b56ced9db4d3a232715c556eb0767623", - "64c6a2cd132eff982279b2332b22c0ee3b363ce1b806d31e68e597895cc1536b", - "f93e39d14f9a367008c006216213d3ac5952a7ceba9165e1e0d36da6f966fdd5", - "a0fcf5480cc5410ef3c44b518a69fc90a26ac5b60c02d49009182446ae4614d5", - "e943d84928e9d2c936e6bdd66f0dc9d2d33f25edf28801e691321b1ed48238a2", - "ea7fe17ea03ba315e5ca481764971eff4d498b26862678bcb06c6ed315754da5", - "c0fc61de53ab0f6fdff0635b9d4d60d94e753e918076cfa4eed96a241f036712", - "cd709a8f9a5316821be54848b7bccc5174d8deff6a6599bf5ec377c3dcd22b93", - "57dcec1743576bfd3de0fb9727be5d2d3c24352582267019ee5f88f6d6174baf", - "349e3a1048c4137dc1d409da9053cba5af722bbe2d43c2be041b6d8a1ff5135a", - "805673fce4f518fe4befb481c8bda21cfffa43fe60ab184d53dc54bf9ce67150", - "b9543c9bfd2dd4bc1be8723693f085f03e0d35bb1cd150b94078c1f1c77df7b2", - "76739c9f6ad75f63fc1f8e2c002817e4d6ce8ec3fc0c5d0c38fdb13824a95a1a", - "67485761000634e32cfed9e7366171a853c12bcbc2005dfd4968d464b751c476", - "226aeaebbc166eae68649fae4d9be3f6e83e2ba0aa0225540890c2c2e01d2681", - "b6c003e74094236a1d4f9bafe60e3da56c4cc9398cd92da476a7e58ed1dc32fc", - "ea6945c14d59a6330e0eb9497fb4acf6d02cb1832fe3feb06804698b2ad2d68b", - "11e6bce138ba396bc748e1c00b132f457ee9fca46702dafae3a136b80a43d9eb", - "f17b8dd8454e30c5a1d69608e973b07ec8f5b5e7749276a6f095342cc89b20f2", - "d3fca40810b36a75218f5680792aa67f7fb63c618ed5654fa2aac9295d5531bc", - "0361791af3ee201d5729846a5855d130a890b6c564a2f5d8eebc0c78f07436bf", - "0e4ed198e78b1237da94a0147fe72f42a0e895554e49104137776f43028c3632", - "b5d1edb61e28d76cf4406aabc341c1dd9bb40a338b1effe1b27b5c961179893f", - "6a523d42e3803b77abb7ac50a445ae6f8982780561529e8c056e97140f5253eb", - "5c5c9439bbb2561059a58c3fc516b422a4c231d5ca7fd9b7bd7b3926252d16ad", - "559663d383f29cff456f6dc58e9c3a43bcd8041a9ed68ae1097836f09b303ca8", - "cebdec8898f0e726ed4b8c821b19455c7f09b05573ad6888ea74ebcef262fbae", - "f444732f3f77edc8d3a15f1bc50da08f6c189f6b375456d68ff456b18321c84e", - "29b20a453751f0cba81e43b622aa8cdfce2d49ce0ff0bb78ef49783e2549c6d2", - "4a918825139c45557d710ec83d7649eee099416d92ac29caa0afdfe4ae6f56df", - "e49b900183f0bbbacf88527184f0982222a3fc9257a261f24ae2c42d04f7cedc", - "cc44a1ca3a875b22aa1990b7ba31576f8b2762a29db998f113096e4f88846888", - "19f104df28d334aa53ca4e73b7cada4d9ca9f86e792416381079bdcd66ab24ce", - "82c8a1ba7a22269bc95ea215c10c621c0e7f41ddb1127f0fba66dc3dc9e436f4", - "bd074c19d7caa86fe93e87467d9b4ab12aa45779b85c769faa8200fa9e23ba57", - "09c6ceab1f4e778f53ab5ac9d9a8b0e6c88bed2fe8dc58fd1e3afd2e2995f384", - "9b90239b66b62a3a531a8fc22a8e498ee6ed0c1f26143387f295cb289ae3b689", - "097a7f7f9c880ab182c573c0dd4504364ee3cbb190034cb3f11d852244d67ac6", - "ab0b94a60467d4a923039b2a9096ae38a0c1ebe8256285910ab84f0b095be3c1", - "c2dd1b086432b7476a2630e09a20666ea426651a3a2172f4dd4e3c37ae5e2441", - "d4683591f3ff60ed41b2cf7be88c10954791e8cf555916fe700b30d90dbbf7e4", - "834cd5237f4aed344aab134738c39c906418d501362967cb2201d0fa650c95a1", - "77fc6c3428a77ec92e72ea1b9be496bfc117cefe79571a1cb9f24abc60b4b843", - "223e32fe201b42ce0df4140fef90ce845dfdaa7fdb68df343997cf8c43ffe0af", - "0099ec1a1a53e29749787782af439ba954c501805ce2d6cdd88a50dc1b8ec337", - "99be28c3cafd65e1204513c1e90c059dacdccd4416dcbca12c42fa7efb68f127", - "1394bd578ee4b660b7eb4d5cda23c2fbeeca0518435bce883a169cc3551f797f", - "e1391123959d7dba4ac32d36218653a6216261c8fbc5e4c26e8b5f69cbc53420", - "835dcec44d068a733ad123305a7d14436f2e130b19f64ac4b22626769af6c384", - "0bf2c3c781f790b50b4005b9d37b60e002e97748ccb2197c92c2ec2f73e3a67e", - "52cb7ab20bc988904a9ad9524dfa450ad6f0e5e11f72c7e3d3918bed23692b60", - "27f5d7bd585f859e4298392b216a5088a746a1852efadb6cbc0ac18af815ca07", - "baf511d21fb0d75f38ab46d6de46f82b3cb88aa2607288f3ce929685992d1d72", - "75f3c4fac1d8da5f8c48ec2af6cbc36a180c3963b6681d033165b74fff2129f7", - "c412b125bc9a396ae455a00fccdc526bd51390b541c5068febd5f355e7035efe", - "234abd92afc8d1760ebf6740f65cf0a26b58d4073fee8b211672ac43c15d2ac6", - "8900596830d6ae3bbf26ecf9ee63948387484712b8e61b1d40cb16afac805b70", - "6dbe70e4dfc31a456f71da40eda5e4e1f6b08c4d1de5096b1165f7add79c3af6", - "d366161d80c122765f85cb1b37dbe48ea6423c911a5aef5b938d7106a6514abc", - "e58d8d0af14323e021848c385c9c972037feb75956e5036bbf9d5e6e0c977d72", - "2ee18f03d98acb945e134bc37460cb23a33ffa7bb556d1c9a1593a5ea2161bc4", - "3ba9c9092b37cb24b14f36c782f9520e098ccbd93b2633e73ea09a5da8322374", - "ad89cb008f49eedcb060abb361c958787595d6965da11ca42ddaf5e4ac3dd08f", - "ef2bc4cfba3f46c0a661fe8e32434e8f6efcb7e51acfb1f2dd7a4ce18a577fe4", - "e1a56fb916834335f03709b9e9633311f2fbbb9219d5388dd4378ac5295113ee", - "0376535f7ed8c798ebe58b957e4d1987e0d952a39705dafd2201c99c26a0f9eb", - "0b44ba8c5642cb5d6261a040595c393659f6c803165ab6996539e13855fcf5b8", - "38237ba58b14c6b8482596aabf0b87a3e80e0a66f0adef408d2c955f3e96fe49", - "84efd85a35b71edc7e2310678f1922357460c7994b3fc4d08cc08c55239bbe89", - "546aee2881a72e8941fedd6fa78561c63607ad16362f44124f584c101ff686a0", - "b0d4cac5be37ebfdaa83747672d979ab535ff5fac62c3697a6af80b320dcf7d1", - "b2b00971700425f935d2257c2592c562db1b3ff1a5097419e295d4ab5baadb53", - "a6d41cb4588296ccbc334e5b15efca838f6568ad87bfa3013a610dee60689a33", - "781d6dc7399a3bdd2b633b39f9f38e2c4e620926b9d574a96a276ea4e47dc679", - "48e429a7f71b6ba20bb8063360acae95ed6d0941d8787fd540a55530eb2bf080", - "f2c3bc2295ef2e3c66e2c581fb207b5dd5064338305f792b661b540bdac1a671", - "872871ffe5f7e0ba605fc7e7ae058a7cae801deb29d6b5994afc7e2c8e9d7c02", - "8f5c55b4493dfe3beca517e76a4ea7d0c368d586bf173764ed867d2b576d6500", - "8a5b3d32679a059b737af5e16c38e5a13e25a039fd018e80f96cbf25f2e8e331", - "3286e4cd7692097c00ea2ddbd1ba31b5828aed470addd9b06acee2759213e057", - "5fcd57d09aa5239349db3c6ea58a1282192f6f21aa613bcc85dd66030f480571", - "380745961603a24c2bcbb8cf430739a899137d50f667b61c09dde3eb216fda16", - "0ec6be633d0cc40f5765ddc4f88d64a01e0efb46f7609df1b8d6a1b7f90fc95b", - "371b6dd463c0ab65f1a76def7836debdba868b6e9a5079ea19485cf73e734a28", - "102dbdb49aad91fede06fba263e9f7a8a470f7ad654331dd9f05a7ddc9721413", - "fce74ded6e135083b5a79ece6594795cbaa7a7eb9c64cfaf92f7f1b4496cad1b", - "6daf7a4737b07a8a3eb49863b7a4433d489c2c0d9e949f83292b0ad95d193fe9", - "2ecdb67af8956135064c71c55c79c2ab7b6a674fab57d7ffbd94326413c61eb6", - "7ec22ff575b188fd13bd7eb6d2086315a130a698c60b1ec9f460ffa0787913b8", - "1ffbc83dd0701e1fcc3d03548a14f95ace680fc133ee00a6d464f74152143efd", - "4280c6401a5e850f22bb2ee46755b5c7a1004377a23463cf9d04962b91d5bf95", - "32ceb09e3e69969a9b93c825f28fe9e57d7058770ae2fe6d67ae1463079807ef", - "1ae0891b9c9f0ca4e2bd5392099885dbd29f91d4094f69ca43c4d47889a40222", - "78fbd8f5f15c87f24af838bc4eefdf294222333b730c969dc1225c67764bf35c", - "4779c0a2e8ec8de97b8b04474f05daa98752a89524b48903b573182bda2fbc8b", - "db6bfda2e2fc68f343a6b46618f3daf8a7f0f2c799a6c75f1fc8c2680f577e39", - "bb5825002eb56de61a51822ed91631e01e10a78b94159527897165ce5b357b6d", - "d051a056f961a30d111d2ef6800a3e2ea5d0a28ea111b013d703acf59d3dc27f", - "58f26ed4ee46e027051e592103660e84923c30206f965c1213ad94e4f8d97f7c", - "421be1174a5d45ca7da8f379b203e906ca5d5e3b3fb072e88ed854a75b0462c5", - "0537ac1df9c51994450cf99f3bec9827ce86fcbba1277c7bbdf5a6ac9edc9c59", - "976c51767e9b3d42482da2d11c058c314a3f39d04703275078e1215ef59507cf", - "0654f0b9a0506e0e39ae393e1d0ab477ae13f30f808ece89da8261024bad00c0", - "f25e713efaa0c242d4c82164fe3c9a1258403b437c646e5ca2328e20392d4fa8", - "c82cc550f44276cec0c62e2e458ece336adbbeb2af8d8654a4cd70a5d7e431f3", - "8d1f30a1d155970f3a3ac8827258eb64d6388fa1bfe09b81d2450a180a60c386", - "1fe25c640047f9d90703d218e38569ad17f13c633e81af4e97ee028346004fee", - "dd9ae2752c460494e3ece7200b64e5d8117265cd373c1d39064d96d7452bcfe3", - "76a67fcb738e7a67e5a2b23b04d4fb33f821de7436844b0634421a38736f88fb", - "0ba4ae30e7ee0267827bd566e529a6c8ffc08bba8fa43f1a2a01bd22e0b830ad", - "da941719d3c9c14d02765820fecb8043356c9c431f3863bdace2c883f45f78ef", - "517dcdf04f36de215816af1cf4c4fc92957c9faa957db72462e3bf96d3220ce9", - "2bece729377233e21ed6235607e6a5fb4a7fb69e110650d1e76d5ab127b45131", - "a557019a83a89e5888efa307107952d77ef80e8b791759afebd27e01ccb4200c", - "5950168e71677ccf0d38e3e8e446e82619f5f789d0a351c4f6caa368a6afa189", - "2dd5829617ae8e1f4eae3de60f3266813b19b10bfbfe3579716c8d813dbcf73f", - "d90d95cac57eb71b0feae0e39234c8faeb0c76074eea0a6e4209ed1855ebb1cc", - "1fb4f599764c47e160074f401aa1ca840d67011038f265dc680964c437f3b266", - "7a486d6afc083ff03c6ed2ae70dcf5ac71a887ce19848e67c342688f1857997d", - "187527947c8e6c30f1a68dfd2e044fe670ca604413aee5f6798938a8e67d16d9", - "467f190441316a3f74334077203fa9bb20ae35fd31a17df0a79a6611b19289bd", - "79e9cd6c16ba41667ab4dc81668d0886959038cceeb66528fb7a3e149fad39c3", - "6cc3bfab9457e20fb2afdfbb142403f28bca29919dd3363ab82762e2fe1d47b2", - "9f8a2f88c23f2707e80be9a652586f3aadfd48755c07915b8623a71a5ed55a7c", - "fb6ffb7fd2dd521e54df251c157d412e374fd5c3d330fa0c9da16c0c6092258f", - "a9db3328b0af4b32ebf6f27194d7ee5a4c02d183d4e2d3e721c184c78c680541", - "bdbe804a10ac06db05d38203edb5bf6a8be34e5b92dbd89ca7efd719d9526d9c", - "b316f7d577aebe6e04e15585cc0923bdd8c259b0431917fb911d5da2a62643c6", - "9f896072af4cbcc334791d5126f736fd8dd9d42e86144722b1c8025e3fd0559f", - "063cfa198bdbc11d91df8da66d9971e867d33f516ebd3f2d2dcf85b55448d8ca", - "d1ee8e81ebb65651afbbb60a8b341e4e977a6e726a1daabce7f6bcde8c613e5d", - "2e2113c21a9cfae288a08355734f5715a62e39f4a3b6755d95b060603d5261d5", - "4fb5e622b6e54cac970975997463290defed4ff0f634bebf1beabe86334384f5", - "0a39e26bf56ca487cee6dedcdae2698084576afe2ecfe3b19f1304d3a9e885c3", - "296051205cf164b45eefb0efc0534b2f47b67c38446773d2a6d6c5a69f0acb03", - "bfe7cd27edf6a0c53c43833043de45ae073b59bcc6e0ea91cd774f1cd39d3daa", - "bf81365d96078edf24c83df94b4990ae7c2ef1a3082dbd159bd44dfe3438b6da", - "313c7ac5308646eb907184838c9227342a1742adbb7e26dbcb53cce1631bef79", - "8229ac90610ea7da1e1f4d2611c7adbf223ffea78e07b7f9a95297ea60be6238", - "a33857d1461c449cca58dc98b45c5987e68377a8ff17bd773e6bae9b3ab2f9d5", - "4ce021d9b104553a105cdb47e5e96fc459836eae8acd5e6d1d248354646cc9c1", - "1c62887367830e11f13a3619fb255fd3757c5d2b0359eddb2c054bbee632a2f5", - "e401288be2f626f0cb570932d4b1483d770d52a14dc25d1d757688ddb1015a49", - "c8efc4887dc33e4b9794d0346bc1fc14b2a0e16cb243d36301005ddc6dca71e2", - "b830754d4a2e2a400cb14585ebb8f6322c70aa99f528cbed527bc837fb641869", - "bc6f8c4c1bdca45246b6dbbe4c571ab1295e67ed260f86bd619c2d528f2985c2", - "f4c7c402efe151bb0b91dd6c39e6c62dd3c425f69462297339182cb610a88b13", - "9673b2bfe93dcd277db8f234c0dcd360890093ba0b92ea20ecff28daf2d67d75", - "ca5dcbda01305254deff93d0febe90e4096b1dfe59ebdc3a9d736882aac0efbe", - "5a8290e39ad0fe37cc67728fb2d7d8e73a66818d719795493f359515198e8767", - "841f1d28e134aafc2db601384002881d08478da7a2d3c86fc71edd40cd15606e", - "318e5873163599c89fbe4b95f4ded0eccced00de124a3099785522777b61278b", - "3db09ac98ce72b879988aed35db15fa75c76b13e60179ed14a4a3117e4520f94", - "f1fcf0d7f65d3b000980023fd05c754566ff794ebc7d57e81463357d22549555", - "0b5339cbd9a93a4908cef9721d3fa98ea3a056a4fd2849c076dd05ff76e2034e", - "96e7ba337a07111fdb62f844fd88b20400e4ba6ee1a90728517b92dfaaaf3f7c", - "0c32dcb60d2f0cab9ee248b828f590df6f508c6a28c64bdb9122aa87afe6cb69", - "eda465cbfcb4bece325a7d3cfae7d46ca177b864d874e189f239a6457ddf8e9f", - "b6be2e2050dee09c6de1f5b16d780ec0e7e29b2f746a26b50cac2297352ebcb8", - "75e00e5273e168cc62bd3dfa7a92bbb3411535b96fc3d22a7a7f73549b97d138", - "9f0ded99997335274dd47568a035bda8398f4aba5ecb5f8df54121c50e931357", - "8feea50e1210a3c9522e99a0051d835b9ace6cb3982cd69a3b889e351d89dc6f", - "b813f82da0627258f4032e643b0cf4f43dbe8aebb0e067a885c440af97778a00", - "41d6fff9534fde537e1942c599fc003591fa34963bccafcd7263ca220a524e2f", - "2ad2d428782d549e1cf3d6fd55f18aa0604d3d82752e2e943f74a269ad20e1e0", - "d64ff769cdc0730b99b4f79a832c3ffc408bafcf214e527439992afed2f6447c", - "02e2eaeccd655541a04fb97e0f8085912b190d8390fb22b2fc2625be8a5f7b6d", - "5c75cf0e6234d1bca494a66ae8dc1ed6ec9dbbb347dec1ae66b0273a4e935d43", - "50f5191cbb84fc614af2c29d7890991127394533513c9281d2b50b7ceee3eca7", - "fc4e7fc7521061805ef4d0c5912458fd8194b8e7f6f9f254624860cd26875a9b", - "591e9a5efd7deda7bd555d43f6651ad2bc6c70a016121dead6e059ed92c60b2d", - "7ce853e7fd8e98158528087686cc47fd1c96c5448d55a0fdb46a17a62480658f", - "24291ba6e7caa150823003492fc887cf7740c5c6679dee98d6978e5ee38b461f", - "44dbbac60477f0e314e785f469c6845c05ac1892c0d3318b8185c05b1f0258d7", - "2473c1266377a8a76bfeb566ef0a87e7bba02993f4f7cecc9ecd9b6ccd0c4f3e", - "f7f9dfbd91bcb97f1e2b1ed2a4d8f94f68345418d1c5084bde2f20c1c649978c", - "f7bf980031829e1f11759e75ed64aa5efc9d3675b30da3fce30e94f1eb700dd3", - "ae22f1cff8e77d66a53cb9f2862d59644cab4dacbfa0a6c8d10cbbc836b12b85", - "c8c585e23c22351c66bd1ffc94f31cc3e7bb321d12273489911bf5574a225dfe", - "9a7f56cf28c6f2c2466acafa41835ad8498a39f2503e852b1929b9ab227f5b94", - "7d717eb965ab4ef61dc6ccbed047aa53fdd7895d37072ac9d217f79543f140dc", - "90d19f8dd12dca19faee886492129be6bd0834c04e830a38a07f9b5dee7c868b", - "12636de65491d9884d92bc533960d8eba8b60f135b72cc6834e810a302c84d5d", - "1afad5fe57b8d8cb3d7dc5d7225d506de7dda49296e740f06ffa2bc29d4bb3e6", - "86992bd380aa056a95b5ce318cbea31d46457f33fdceee95981d0d024c83d781", - "ebe1b054c3c33ad40454fcd26b7e86089689b28c184c944c141a62d1f0a54b00", - "6269d8bb2b9c0a7dc5d8a3855c748c03d4d57be1e1151899ede15187e739dda3", - "940ff11faf599c0135a3b70a897c4bec3a59d6125d9cf777ca52918b81b361da", - "95dea8d08a20fb5c55c311d5f616c76fed4a6a002165db8da58fd180741f6701", - "3ac17f6b61bb5fa3d46fe0a91f4f1313204c80bb0dc0e6c4a4ae6e41fd56e5f2", - "5d2902c1322cd0c9640b98d2500e8efde9a1d7a4e1d91d0ca908751022afe1e6", - "0ab904ddab565ba7f58b70e36351028a0724b0b6592be7100f304535e61b920b", - "acea41957a256d9c108fbf3865b2a4aead8ea8681f8a10d925e69420dac17d7e", - "d8313db9e405af3edcabddd43d59cf6cbbe3473d84e5defcbad7c7dafdb2b934", - "f0b912d2022a13043ab5789276da28e2d76b3dfb19d0f7c189eadd18ae46a94d", - "9330a4976a4b09ac91042a3e5fbed035d6628526e25ffd572f932f072d582479", - "be5dadc87698d91e6c0cc25ace2871f5224e88c1dc0e4c014dd2ffb9e9f098c9", - "8e2338a3ddae3bfd61ec8de1babba846f935e39a06894c7c260fec87ef4cce74", - "fccc09fa58cc9d6b4fb0788a5c0f62cbda84839e091f90a60a453543bda00e20", - "916fb60bff70039a7851b1417712721ce6bf4e29ccddcb4a4811f0d334e8fe33", - "32099d18cd27ecf6c595cc30933136b9e2b494bdee92a181fc7e4f3611beb352", - "ca871fa909aea3f97929da02634505d7d2a8b9b136644c57a400d623be82bb36", - "e95010d468bc166a699e4bd25654605b27d858af9f4f9aa726e2ef0249f15ca4", - "357e6ff745f9195d905ce0da6afa0005c84213d85c188a1955cf99f7191a7fe6", - "6620064b07a56cf7a8f90c9c2e5e7dce07fe67013d22acb4c154da407cc1e391", - "2b6274426182de429318838c3c1bb908feef959606e4073d93cce32450e7d97f", - "75266de389af7b7820de264c19f3cd36ee538b17a01f794b4651956e359b9e24", - "7cdb3e09ba119f17d09ad08b04c6be72b9a608cc2d26f09ccc2be3817c76f6cd", - "5244a01fb304ef605ee121d53e23fc77daa74f63c08b0f9c39fa4dd3728f7886", - "264bbba183a90a3954b85d1a431ab614a6ba507e2aea8fa97f3d1574b90d56de", - "ffb7e36c2ff5e078e1581bdc24514d1451aa4962e622f863d407f6c9bc10c93a", - "af2489b1bedfcd412170d3212d477a655919310e9e18b4ec34207791cb5fc86a", - "51032bb82e4dbf1db1cbae691366134bfa71b9b47f57e0fe06599df90b0ee770", - "8740285d74e6da7a437ed9945ec66b76ef909a84e4d62872de68f2e5a696c431", - "072b161ae9a7525b1736b475ef3f220874f98f67ad65d6040feb50d7a7d78d6b", - "d382e198c36b17087e8d1e2ea6861ff486619e2f843b5c3c3b6e4443bfd83076", - "a5cae5bc884c6365fa885fad03e45266e31a786ed1a816eef0538e5c2bb0d29e", - "e536de5626f74e85a6329256060ba8d3cf2e2da809fecb1a9effd4ba5fcbe681", - "ceb08f9dbcc4d95f1fe03daca9d0f022a4fc1a1fbefa1c5df6b8a1be6d0f54c9", - "60b9a11cb5febb89ad5f4760c0540d2ca032f3876e27f769f428623b4c8644fd", - "909cc0c904f9492def2ba2512f9fd8e646fe8e99136f4d8efa1cae04fc99dacf", - "17a075d2bfd4d0d6058cfffd1b589a927955f5d9a0587db6d4825823fa7c5141", - "384a412d396d8b7c39fa1cc103c145a47a4e46f524210d1661e6a08658d9fe06", - "961f3e8eb62ce99542d548da8a159b18296c7bb849588c0541625843bdfeb7c4", - "7c00f6a3050d3f39086451913d3d7051a62b49b0503fa7ea8c09093ebad712ac", - "3e860fc794898503af3007bad17208382ac7ff8b856ec64d445552feacb6e969", - "1fb5d510e8357b1bf167e611598d5b72315130d3c0aff1036a051f5b6652a46f", - "fd8f64dabb9097cecc56d4414e75a51eed9939b4a65f0c14c092b08b616afaa8", - "df2137a5b0c695144f769350ec1abd842b2cb918795ebcb17ee8d7befeaf2163", - "5b03b722a9ae9428a6e7c5d97652e2f015a32af78c2ec8a0e111b6c9a4fc8838", - "a2aabcc30d5efa60b57441c7a868aa0578994deb5a298b80ded1d7ae62041c96", - "bf6c72958655548f21e3ba3e849aba6c5663b3ff1f40da504392dbc0175146fb", - "308c103fdeea779f0197c5969a2f7a50dafcf9b24828ef5f51db19a2cc8aa78d", - "d617f2df24d0b35d9f6314caa86df3534beb8a75d8b5f18bd4bc42c3113f0d4f", - "5bcad5f61525de46ce0eafa194f047be5d87e48ee77c8c5a8c4c98889fd3978a", - "0660bf1965d15b90aef352745258ec45e5e771ab5bfc7595de0458c065e4fe42", - "85a8bf5a243c7f0afc6062b7be0d501939a827f1f55d3f9c8f2ab48968bb9e6c", - "6fec0d51c3db39855aca13cce70df96c5dd1335c013f5c196ce69aeca8d0a0ab", - "da11cf9e2cfc98f070f1ce1fb2ed9d4997285e66fd978818c83a37c9636890c3", - "2062b702cbeac8bf684a78ff605bcac8b771bf4cbf21ac67c20b2aa4470df579", - "c1b42a67d0aaedcdb716602cd3e75e90475c6a11ff2586e26b25af08f2106eaf", - "017e26ea77cdf98a5fceb0e39b22bd8aecd5165dd328d0da8b54e678a2d8b62a", - "90c1aa5e29752cf18fedfa71f0501f2c441b0f0e1f9adfd8cf6a2d4aa6210a9d", - "4faddaed3f58424792e4c618e9e575e32d845d2ddbefb9110d87298339a0e3a0", - "c7e4ea3279d17e7e3e5b6edae091caa3d3f31adf25dfcd1f836be872379ca159", - "269f4d1eadbf953c5d9c664c86f092a6725cd07a569109e0caad4c076ca14356", - "82d20024b7578fa424aa3fba12b4f0ae473b7d1c0f7049b410d34070e7745b47", - "add9a40b678292bbfc66f013fae3b797541c9a1aaa06b8dcbec742d5c419537d", - "0ec0d51b628d56eb089275d115925b5996b485092e63c6f1ed0ebb7f57d5b7f4", - "abd2b7dc8ffcaa02bc9c16fa0dc34b847f740b6b167cf8ce5f18e86da53c0f8b", - "2f39b64002aab775aae5192cae744fc6e8c2bfe1e7926b4c2388e7b1fdc9282d", - "aaae5fb3472ee418e50eed52da3ea2864d114325bb0bb03bf1ccc1752701f760", - "c8713fc326b3dfaa34ee091df7f78527b358dd77c5d9cba581d669fcb18e6aaf", - "19e0539ca91a5b7b50ee26fc72f1f30e588cc30204ca22f1ee2df3a5890a882c", - "c743f18795829f66a9e787c6e9600b4d507350a8269e18dfac37550c99fcafe6", - "a521708da19147f28db9e8dfcb72b13c1af9977509aa8508de6828034b56462c", - "9d1cf49e7308c8f9fe675c37ff45175e1493436c2d001a9be2c05e7de647fba8", - "cf60e0f0fe714a0f00b1b7f6ac753311791679798a86b97aa2c45b6eecb8cb08", - "a4ce5b81ad727588304ad3bd84ca5a0bd749fbea4275d1b14468178755a8f29d", - "2b024c3adeb2e0cd09d034daf82cfca48fdecc0e7631c542a0267f83fad0ef18", - "a60a68b8a6c8c6420c487c0fbb8780882f82b9f89ad54f5b0a3504012e7ad03a", - "c88d1cd46badf6c8d0fb351a0f6f4ddff3f1360b9aa60b41bab7b13fb2dfc125", - "51e2c63054553dc1ade1ddb9f5fb70fb87bfabd01289a196ce57d993cdd6d540", - "adf6c9698f401c181c06b5ff520f55c18028e64318810aff8484f5a5f14a6506", - "1e46301a503bbe6a68b8a9ca1a868942b2f30fbc7c5a46446604d5455a340c51", - "0f4775761b010c0af06dc0bb57a19030f130e99a0132c2ae91a1e1c694dd8609", - "5531417f8535069dda3bd37eef1c94d1daed02873599f85c2d5f450298ffef08", - "ffb64cc7ed8ab82f9b31827bc2103e5cc47372e3361d3bc95a77c5871e290769", - "5846a9f7ead087e05a25a4554806244138d43d34d8911419a59826768ed33114", - "ded58e598de4948ec71ce1df418a67626fced5bd502765cbcf666d376cf4a7e9", - "39a36223ae6e30a997e02e6a24167d8d9360e370d82fd2a6b30943ef3576ec12", - "e7e467ea49b1e30db01087b98863ca24fad06c8ee7b684654b092dbc5e6bb5dc", - "db13ac95ad9347174e40fced6423d6dad806b95bc30b878c3d8cde7233ea6d83", - "daba1d0aafac0005a6f744601fb7bad6e51f239e3f31f9612588a277a57c91f3", - "93837c5ec1f1faa02f6d23b50207e05a2b1e87c240ee13c321176116d4496dad", - "0d048a219f57267be3296e20bece0a2136d9a485487d7503dd2f1ba2179b3d2d", - "92bf1852482b9a7075d494fc3606aaaa31734280adc19d4f30555b0799b59623", - "2f922464f1544a86b7d63eddde6d00a44785a47e56707503e9787134df7f5ccb", - "2b609e2d0657b536c3542297c0ac08fa1f4812d88bcc19e02d6e16bd10d407e3", - "da82eb9de67190d92255acb611008c890d577ee3171f3b927b2261b2021fa008", - "2967da3c434f755bc59cc8ce67e7e2c514d14c94fc017377087968923b0f8d6f", - "3dd63f416b5a015ce87287aeaea9141778221fca2195841536ba4cd657241ba2", - "a0956091a6f31d787ca01c67a4487ed767a4354ffa61c0993631179b7ecd7d95", - "9bea19ecae6cc9f703fe59fcfa321b52eeb8d49af0896788071a15ae74efcda9", - "b3ff5bccf3b8fdc9c59d5bf8b8e104fec0a58331089c6fe9724ea9d5a7e8e075", - "c269f2bb4e9327bfd017330a58f0325365baab10cc4007206b15915d0a2f5508", - "1cb5248b83379c60fe3f7cc7b79b4a970145c8daef8578db32b320b74719c80c", - "57d140a738dc0d51e22eda1ac65865c656e9983a2c9db1a2fdd64e00273e4998", - "4060a0b6d015816eb2e2d65c8fb15a5ea684b76e23b60034247cd4df7922fd90", - "a03fc0bac00c790268ede9f06e79c1418e7984be2b0c53b2c6671e6fb6ca9d9b", - "184b0621d3c183c6e3eb9fb064c2d69a0f91e120f992f56b76f7db0fb054e15c", - "3cfa26d3f9348a37491c47ad0a8ad88afd68b94eaab0d3207dde84c9fc659f8f", - "6ce40fbe6ede479464b76ccaeb393f3269f63a4783c04a627b8a3510703a1360", - "b61ef42732481bff827ccd5cbc4ca8501c2d9d0e7a1f68424105fdbe63a350e6", - "df2acbac700e0aa0f95dcbe256610e7a13c4eb277a8998785c514a867b74e59a", - "efc18cb58db685848c67f11f480292054f71a4299d1959dc50251661a91afd6c", - "1341b043ab89a8ace7ae8531aafe6958856af8d6c8dda85e8f511ad7cd6c7427", - "3563f09621c328ecda918244335192e411ae8d340703003df7bbdae88556d059", - "a9cedaea173eb8f985d51f4225128215d5a04c0ebd6e60ab962c9eff280db6bb", - "e09cdc591510c85344c748eaa49d16448466612fa0f92cefc3e1de63cd8c1240", - "6df021136a7ab005d1343e543d869a3947ed3a661099b3c5aef8c1bc58f6d8a1", - "7920084f46e242215b886ef14ba56e062fedb3224d629c2cf961653875c374a3", - "d03fb7dc8197b5c99314faa816207c84cdba21687692772dac91272bf34bd95a", - "543dadc292cf0b8458807312db4fdfdc0077247236244efe8361b4cebe2e4d8b", - "2f60ae194da45a72b7f331ce59b981141d9da130b493ccca17372051d845cae2", - "045da08d143f7b9501ede481b9e86331cb216a2d4cb7fb4302cf1e7a3fa9e14a", - "aeeb4a0e10fe1ba527747f9dcee8d85f952195d6135ad3c7d31ff529afbe355c", - "efb594b8580f925e99a77de6d55a342bde3aab8f0371359213518b50708d0a79", - "3ea3209ad1582257315e77a9e67c7eb01c8e9bd39df50942c089cad3dc14787b", - "453d66cac9ec8feca504c0472d0b6d6caf52773976a513d87cde4e8bfbdcd7f6", - "102e47b30c770aee0f3bca5463dfd2c3ff93b5c23e8f0def8048916de283266a", - "5c97eea492bfb0a6f6818f996bbaaade37644de17e890e84d648f5a713440f76", - "25f6e725f244ad7908c92438c03c165d0085372daaca13788dc378ceda240085", - "d293a963996e76cfca01cb26bd95f48ca3d8b326ef2b9b9cad00f6327f449d2f", - "62d8bf508c697d3ce14c935a36a6cb0fd6c126a17a7f15eac0eeba04a1fd80f1", - "92549555f5ebe4d48aace37707f02fd75bf959071a6dde8d5c698fcd5b65594d", - "9bdffd00a3c97d1908eb0800d70b2f975b6a68632932423b5139de4544b9e694", - "7664fd3fe295d08f7124fa667bf1803a2e73509e6a0dc5125f45e2fc51872064", - "b009d0cc3b51371a4dccdc6706e9989c4e05464b76ad9d451bc5ba4d19903f26", - "7162f62aafc9a7f8af858ee1a8a357d27c86fc95e8ed1d10570a4dd8d04cee0d", - "1950cdc2e2c8076be0a63e46b4e6815ee07965cbe6303c2dfd1523810131a988", - "fda53cd2af2351943ce10e2efeef8ec05b8bee4cc2b48c287b5bb9bec6f93f9c", - "c27011ef20a3ce974e4532ebcdf60b67e7c620497524a5701b254471efde361c", - "bc30786a81a9ff44cc55f53792cc90a93a0d154b4868b9abbf169c1a2ad2d2e5", - "0685adcfdd9a979ae394aaf70961ed617377c19d8511317a417d0388ccba9239", - "62f2679547cd1df27777d48138c07dd92a1143d749499ea9cf3212f7cf05428b", - "2b06f37e49c935046ebb99dc651a78bc5c717c9b3491656d872de3ede0d69ca1", - "5bb2b387942f2e84354478098762b0559c23546eedb385112367588339440673", - "2605da3fb96734068b4703b51110c82b934d7b837eb03c269f9bcf31d88a7643", - "3a9aca0fe9f4e71e311ff2ecd4152745f29694d453878f83d408422aa8ddd877", - "82d3dc42435627a6529c18e89c0a002f847f6895de545637e9a6df706fe3020e", - "fe3ed0e6d44405534fa9c122f60db92a203ac262de5b77cad950f1525126204a", - "82345613e7e89ba496e68958197b76c0fa6da7ad5731a3c832017ed66e1820af", - "77bf2c716ca0dbebb2be15a06b761934fb5ff9454588f7f68212ba941ef4cbcd", - "3debcd364b3efefb4e59084218c2659314bd757a26ef9c86e7196db24af910e6", - "648427968a528e55af0aad8453227c6ef534ece18ba034cb9e556107e102c91f", - "4dbadf952f9affd13ce45b7df682e8666f402704c67849e84398405f4785a5a7", - "cd8d3558911abddec1e4b0b539803f9b1f222669543f945a2cc9d8df48ad22e2", - "123b9e91d81fa60be82f2b4737a4db24e54b1450defb92fd6d85a8bebe1a0608", - "d869bdf5f955b9bdd19e0d38dd7487494b0a55b4fc2f9d9563fb00d8ec80449c", - "3aba744f9a6652e71750dfc694e25c38e9e082f08600c777c712d96523e45951", - "715afb7e57258cc0e2d5761cbb24f2ce9e8db05d87485e6baab81739a039d901", - "4adf74df9260321bcb4a094a9f109054ccc8c152cc3f73838c4b663a66bbd478", - "565b12a1ca303eb3069c177b17f051286812440721bdab6a79227b05f9f6e9cb", - "be9dfe09f3bb920de5e3dc6bb55fa51ad6553a8995cd87fade9edd706c3461ac", - "224f7e1c6be0c250453e014349020a86e0f5fabf6bcb5833c5c16e46b936e59d", - "4cd0b727e2da274c881867f1ca9c0d85a7d26b02382a8dada16c587ff0400f1d", - "7adfba843fdec9e3ece68b3b51ae3d67b76f7a4b7dafa65191b90cfe8ba776d0", - "52ffbfd59447d20c2c5b2442e0e742e635bd75fdfdd8fd90485b4ef2fbb2ae36", - "4b25e2b415d9ccfa66c94a5773b45387534fa1ddc49ef0bdf8bd708d0f74492a", - "3a6ae1881267d4e96751b51f7c8667a121d96b718c053e5c370ff01e6a3a0cfd", - "5914976b22e3a7bd0e7e9389d3298530282d473d70aa4fe09cc22e844ff110af", - "12af4fcba52e85282b70f30993cb5777b4c7e473513b42f8190fe2bc4ae774a8", - "f2ae7dab0dabffedd1d5893d79183ef5ffd86fab9c2c1a0fc1e28eddde186ed6", - "5a3acb96673021aea940d838a0c8c752ef6e271dc6642be165cf00aaf0109bc0", - "4a36aaa21555ed46e7f64d1af870b1acf1de94f9cc4b66f84a6649500f0a7916", - "4038aa51e9aa30deabac309fba5aa522a9e299ac70df8fbdfe0310afb61ef471", - "93b16e29d3e3e5a195a0433e32672cfd5ec0b38b4a66e25e573b61a19be95293", - "6a29d09b4a081eb864405579a98a6e373ab15d0cd4395f45a533c78673399a2a", - "5ff39cf93ae0a1199131374dd1c2c7c3317707917d70e5d712d5f7151826f2e3", - "d241cfc61eb0fef342405c8b04f83a99b21440d785c04473e258b8b2ec45b873", - "3c664dfeb0eeca2d19bc2f4dae65a560aaed044632688aaa67baf15780227261", - "c4d099bf7bd91afafaf23ac37b7dd5f65d501f9fbd88b867e730b610793ef745", - "f8339faa2197ba5ca245b32689cf5d6de48a7eded3996d581eb3ed3ed6bec732", - "0f0ccd547c55e12fd5b78a240838d4382431b1df5480e8b542913b972b8a530b", - "d7dfbe664bc6be20cc806a5356bf04f4967a8b826fa1dc3d3bd119c038d8e40a", - "9ed1cdfe29ee15a3f3a95a89e7350f09c58d707ba5878eaf9b48ddf2369115df", - "880adb40726b14db484ff79efb2a423893eab34463ee71a4ab4fb08f81f19b94", - "cb8287db6966b7e652c3419f375079132f761a545f1d750c81020a9ca10bab47", - "3c20a761f2bfbb3f6aab36a5521f0c1e5f3cab806b96fb3868b83fcaf03ce533", - "43f7820cb59ff4afe94694a15afd3a707ab7eb3d89ac13117dfe35b079f6821a", - "0190244bd42694ca3c5752a1f01480e0d93005bba3945515f993037901559851", - "e6d3ee24b5f43b49d3db04b9315fa1e4547970729712a3b4e0150631f3ea50d9", - "8f6d73d84df841fadb6b594d356f5838982551f86295de27c6fa8f4f66962ea9", - "3aafee994e7e003bec3eadf6787ce57d2b38d083215afab770f574a8b273755d", - "8ad3a6b3d0f91e564d3ae202b582e84652ff6969a970a7f69184ed9abf3b42d6", - "d8630a0097dd6d71237f9933c3c79683c299f1660e1ba2e9ea164ec8073224e6", - "3a74c831fbed6962327707250536803dd0c9168d41f447eb9eaea22cb11fed09", - "014cab7513a66e4d16cfb0cf582ac37934453dd716a16ba43e8aea794eb76050", - "6bf134f60f9f37de55ee45e96a72ec5335ef4d8f5c0853516fcd221209b120f1", - "2bec337824bf2df3d1fefe5013c6ef89737c7a3705645e3563ac9f708fc35c9f", - "eba689b5ebde69205f1cc9329b277e54d430e356d09d863d3f7b8131f59b7806", - "3bfbe324341931f8aa9795cf5a97446c37baaa244a8239f8eb2656dba09e0ec4", - "ee0f5352fdf7620bd521dc873fc2ed17a9b8d08f4efa1867e52b93dc13de79b6", - "abd214ab14eb68c2456426befea853a5cc00bde52e286d68bbbd3d827d36f312", - "5cedd84c97beb49aa9678c0efe6c1fa8b6f13679b85392be2964a8ba54bbf625", - "cb0876b0896d0d2814eb9c8fb346596408fb0586e4df056254afb4f32c73b335", - "4ea42f635e4e4e03305e567cf8d87c32b86de6a269a52c90300b367fcb1b1c5a", - "f568725c9c528199735603fae766644ddabd010b9383ba4426a1270d0170f019", - "a9a1be2f2967e407fa932659d7d14bb57c2ad3d83ba64bc6fd05d40c30c79cc1", - "62ee1f954303d1a9dc0b1601e5ec71c8ff5dc456806885d30d4aa1505adfb041", - "389aeb8c84227e70c9ed0233ab68fbdb520a0c9f3e5dc1c12ca81b9036cb15d5", - "cb9d4caf312c0617661aa74fc19193cf401ff7d5f8c82a633af2ecef1782aedf", - "fd9fe1b33cfe9560258b624e9f4a9e5605dd081701b635f28e40fa75c9c14cc0", - "4272d6758fac731bbce89f10d7d2d307847b8bf37d5e5dc07a6682fec8a7b73b", - "2f9c5ce2ff674c55f73b52d2ec7db59a67c1e4c39b0f246b685637475cc68578", - "ed3f45221db106e59081d2a09ed35a309ef9ffdf22f3290a7128e9711273b871", - "622cd54ae07d32b355342b550418e58aa65ba2561a1dd4828b270cf2dc8b6748", - "49a53febd5e2491c55c6b975e40f1676e33894c1f9cabd598b8604beb3691534", - "5709054348e6984ac19dcfb0c41453aeee7ac30ff7598923a10ad008ad80c073", - "ed6485b31a0a54b371a4fef0cf8753d18bffeb223ebda58e88bf19323ea5fb54", - "15f929b23b7c3e0e576acf781d987d2fe9688072d71b1c80111ed381a1675387", - "5bbd393a6c7ce13d7823f0e8bc921815aea37b90d919609ed5c463f4bc4be99f", - "c322fa85a258f562c37615b4afba66683b9eb21e9cac5b825bfc79cd5704fd44", - "87ac8cc1eb70f191ca63a6aa00c055cd661d72f6ddc1be0d03d0ad4d58d8f7ea", - "35dd0fec1cdca15b365ef2aa5a959ec6301023d2f4707ab9e46fd28bebb674e4", - "b3bbb3af076e84a256851237347ddd4363da0b7bb0327ec364adf2986b431d3f", - "39be89130a1ffd26d136005e4307e1d2a585ae49015659f5d5674b2b24373a20", - "7adcb251d01767ce0de1c90dd1eceae227d08bfe33390f968d1e4e7090767d97", - "b78a60d15664dee184f59be25a74878a51a0b75a19a081e6feabd6142fd49de0", - "7b4e9285ef735482c92917f7a1deb0c87ff08d2daad533115d02a2f691c6ffd4", - "55986430c9d8942f6f2546fed49790dcb095f0900a634cde394512af4b0e6b67", - "76a7cbd7c029f32d88401df9f1e466ac7c5c0ad79705fbf3b83c46894807c775", - "278c48af84578cb9a5ac1e6779242402624e81681a6ff3eebd5af363d943a3ed", - "c469c11da10073157fc98f16ba054082d7511217e828f5f77c345af2a9e6182f", - "c5c4f59170efc1a15a9acd66b197b14c3e70c8f4100dcc76ab6cb59c7bfc7a2d", - "22e10d4f92c5110c7ff7b65c0dca77931c5184eb7d27baedbe8d3a04591269ff", - "719da67944fe5f3c8acb49df5b56e4e76685f0e696f45991efda2ba081ea7606", - "49041da896593571938f6c1508a7c0a99267a7f25e04d7e754fa7c7f0c2197d6", - "b27905c3b16b7ecb10fa65ed7827666acd402cfcc2a073347fbb41e5fdca15e7", - "33405855a760f349cc151f85b3fe0d08d7875768947695a1f21a242c07249463", - "52f7e0c851d05b5a6dbb9d548a244fc219686ab9bfc31e6c34bf30a149ca364f", - "fc71b38cbf909bc4bdef7fe009905a6d917bc80cd59382295af435214ff4e795", - "d77c3e824436579cc973deafcd928b748db66aa6ee6220e668dfe8504d216062", - "3c8ffa02cc8f9852ee3246da483028ada7a0c2090039d77965c9bca7ff52bdbe", - "d8720ca55e01cb9e83c08a7069411df27dfb8bac4a269612df616df8af451d84", - "05e243622006a27c59bd753088cb60013de0786dec9c3a70872505bb659d73f8", - "5c270e768cb750f435fadb8ff0c76ba2cb99a6f8ddbc1828e9cd711425c96473", - "aaba92d93f232d0ab70160f66770a7d5c1c05c71eebc017693601be47aa0faeb", - "27a7b8b583646afdfe8cb80e56ec57a0c4f075a8fd9489c680d42bb6bdaea635", - "5c6943a34707bf584ea6079a2e1c1a8e1f7f9cbb15ad233d78519c77dfe7cf1d", - "c67a143b0ab5baf857005f214ba285ff9d3351a11087735be65ec045d19a4eaf", - "4aa7201758c37cb4d483a7232049c8ac058fe05f9df3bf3f67a68fc9575aa08b", - "2b2c6df4e4368b7a02e9f0182d0f32e85a260032aa99acdbe068a7cd701383b8", - "01ffe1f0bdf45db8d6b18fcb991a87376e4e1595a394b497f5c5dc9112eb7372", - "a8024012c2c38f9df15855ed1fd6ff7eaaf1c93909e6501ec3ad2a1e3cefd7e4", - "b1abcbc08ca928dca38460e112e700a69b7525c70aa88f521576dabbe9e6c0a7", - "e0b73e17bbc5b1d24c3318d3b4b9f3a2a409733bc7f34649f59a3d6e9ec63dc1", - "0a37a378ebffaf647f962edf8d024f666fa2a1ed1cc80f6de446061b6c2e272b", - "7943699d35a160e05319acde89b75b1e1eaa3090b6ed066cc397e3ad9dec0178", - "319ed7725518ece601867436d2d7417e52cbda2bbe37368d817a6b27c5be6f12", - "599940356310277c71b109cf7431ddf94d9c972f985206c57e3d5578821cdc06", - "9593caee49251389504be3c28246f355edd2afd65687f75e102b69ff80d881a9", - "9c0b36938229847b34341a68d055b49759ab0f3cceb7bb868ed529796300f9b7", - "f683d9e8fcf4873ff1dbf294c74e6ba20129f22d5440fca63a07364843c8752e", - "47bec39814d324351f8498dcef1ad496d81fe128e0618c2609bd683e29a49da5", - "1816a270b20bd017e70e74c28b9cd86de2e30a7481c9a655b6217d755129b18a", - "2f9aa08dbd7f1a333fcf263d1bc769fc44a4a1b9df6468fba1ca9494d57f2938", - "e7fb76ccb4b7b91a6f5ed943cf03bb5b52f85f0f5ab840c883aade2880d2f8d3", - "49939f9a9c8fec636021f12a363d5bd3581a59c742e30906f99a378f0e2a0c84", - "e0f354820b5a7f230bd8735682483a097c9fa52ac1060b1a49efb2d30cc6e7d8", - "e124cfeffb70657bdd9d47ce0ae694e5201c3ecfef2fda71eb746b1c770f4ec4", - "4d30a4318858fef14f502241381f2c34589d106d8bf81b2500808f66a1783a2d", - "12f923df35ca329432946dd9cd1e0f155ba4a469ed4c56eccc758f215e16c975", - "a6fff4d69c1e6cfe7daedd3e0a20c86e0cf05356b4f90acdeb2313a208b813ca", - "cda6b2d5d160df00e7490ec06b677ff2ba80bc74c18f3ea655fa0542a4eac8f3", - "8516c463708e9bc211df490c9e7e0a0cbc873331f254985cf704e1bdee699471", - "5fb5ed9dd01960bcbc1c80fb30b3b110cbe01441c4e4984d4cf5a1f1071ca2b8", - "b124774b28c1323b82c5a9036b8411c9f1e4a50c957ad14a48346ac5e61e2f89", - "2bba89d1938141b95b7e3dc39cc36d2b6677f36a0afb72dff6aa8e81c9848e53", - "465f9ee67e7c1faf44ad716196d3c2ea4b1da8315867bf1fc039f515aea7e2e8", - "6f2ed81d6ca889ac1d8dca165003458bea324fabdd46fd39059cfc3c17c12a0e", - "132eeaf4b7f6a9a3e54a84179c29c422dea111404063f65fd66f01e9e46bfd35", - "fa09b9148ac8b65c370f4712359c028a141dc6e33ba1db7f929af4b6f03b8eeb", - "9906dcf8624b8ff0c81ef3a2e6bae3a4ce1ba3cc3b7200bcae49f29928238ea2", - "18b1466dc69741a44f7e35bbe1856f88049344d811d4a9a63fad51cc5d43b168", - "8609d5d617fcb5dd8aa364494569405292133b584e0a41108b32f2898d1835db", - "ecdf44f783a389b6794a974ae4706b525932c59720282c0c92ecfce0c70212b7", - "d5728ce0505ce76f560462f42f75ab67f9afc513982f0c0e97b36c5b4a9fa3d5", - "a8732d1ddef6d4e12eea9cfdf8ffd0e1c222662c7ae6b3f69a99e5f25bcf0c83", - "b4e3884f433ae88e09e38b4a1d19835ad3f9f504fd6711ee5382b14d32aa111b", - "187651db5173613e7977253978e17fb5bc9b0c04f764aec3e29b1fa181e08f42", - "f8f6b88cea40c769de1474407423d1152574f569fe4dc07cf3c99f2f3d95532e", - "d83285b3acff11ad609ff381b58274adfd4bba8eead351171925fd365bf75683", - "8a997305bbecd6a8776e2d91d71c5b255245479804701d764d73c16a2fb445fa", - "5f2f25b4e13cf0f0aecdccfaa4f0313589363255124592ce7f780a15bd6a0baf", - "384f8a15e72c6a8fc114550d939d6be87bb32f44a5867f55d433c806ce42f727", - "3c489e8e78abd96906d1c969d22cb9ec78a0dc35a3a9226bc5c622ba589153d7", - "378e4704f6d22d1fc05d7c1b4480a503af3f2e0b0db8a94ab1445bc9af58ed7f", - "85c0f667ec4d3ce9886f8fa729ee02eac4a460417c10d9a430a7d309c521c5b8", - "b3b1d068dcc0bf04a001c0b611e8cafac89ff2f146da65c6a38c054f44addc3f", - "880f9d55af0aa127d81f4ede0601a25c2ce354728d443c464c3d4d728ef6ce47", - "5e8809edd20cdc43a3143ab0ec0b0af0f1dab844e85ecd0e9069a522c62ebc59", - "8b917a8faca19a0083d6e96a8277a4227909f935e626651be83a1a30fb542ea8", - "0123c986ee31c556a2cadddf84f1bd10aef39e00437596497d48c04597123924", - "96c48b79b7c41a47ca0bad5bef15e47d11ff2c8334f1b2a45d929b06b51f9045", - "80dd7279594614b802fa1f21b9550bc3e5a246b1f6a5d9b5c5b08cafdf7bfbd9", - "f46b4717f5df82aa0b8573a8e2f73020ba1bd444fa176414064bd30e5402ff5d", - "10723d88aedef8d944228b35a70f5dd58051218590ae09504d148ec93f077f63", - "b40b40fcd59503a1ee4a5168f92e40f94417b80bec72e368032de4580c8d6d81", - "47dabbe2ce7780cef1db89032e802c980fc9a6ac1355bcc561af069e41e35d8f", - "03945b87cffb679e164267e7e427c527a01417c3a48d2748d65dad507142c6be", - "88428fb0f76df13d9583256895ac3cc30cd82e44545e29e1946c826df63932e1", - "40ad2d52f1f29c29ae953bd80256365ea8689c08c21e31cfbae80d460c0d2f5e", - "0c847aafb303220f243021968efb8c6b8e33f164c419a0cc54d5dacae85e88aa", - "3c0b564dd76cd72abc6b48b1762eaa23425b57683cdb818708b496b52588722a", - "95ca51645ae3b361a802798a69606f7efb1b617fe485d410f5e9115386896e03", - "6b08fa346e963cfba7f6957eedd6f1eb81b0a45cef873cd7f2a13ed332608135", - "c51eb3768ca3a20b73db7767517f61f602da7309b1989ed0f66c39945157a082", - "b396df754b0332e456dcc5cfaced4455a7e93cf27ccf5b2b688a566bd653192c", - "7a5c5b6ebbc575e6f02cf3a87da95d18da0726c9d7b426e9be4cdc4e43e2114f", - "0f926c24dfe3689a66f9666bb1762dafd94364dd3b4877c5424241535c414b65", - "d556f87be2a2084eb806d49f472556b0db6349404e860f3deb1806865f0f55f6", - "243365ab20643dadc1fb49ad8dc3ab677da066c0bed482239a6996bb8bae74d4", - "ed7deb5f13d0b73481a002cd57cf234c618e9acf4655444f50b41492938c758a", - "2d1e7e4a52bb8d11bd886998703f8680023410034f1410fb193f20e22ebdb91c", - "2f1e8b81227854eb6fec168182b8229e1811634bd87e56ac6f1a7e50e5152857", - "101ae211e79d5bb5debdddd45d4c03bdec1ddb068989e58422821694d073ac58", - "a5bb98ed5f58991f73fef369d852738c0dc626de5cc7f2bfba66d053ebccc703", - "b726582285ee217c22f09c84651732f99e3b9f8f769319ee0a5e189c1e4b9f20", - "fca8248f974d0fb890d47dda1c3e611367e7b71925ba73d641416cd46ae7a990", - "220e82dc981e11869f4165e0d852ca9a6f957c7c2f0cd2d8e656d17e92a3023f", - "66c08b8da34ad686534a138d638578a20e70a0ca52586be9c82526cfa3fd9aea", - "079e08fb0c88ef005a3ed2f60d8d968bf6ca6483cffac39eb62c6549cf0b3630", - "e825cf3ed36325f6ea3c1e6b0cc163366f28579d31f292000b1c34d9b008ffa8", - "bde7402726c6e637d5ea1a2ae9584b47726981bae23530394a68fc05bdafe84f", - "468521116deb846460b3f179925a3fa958bd058272cecd16e9c14db31bf924a8", - "8f293abead6974962b85a5af67942f160f473931add6992678423cac79cbc4c9", - "96001b2db8b980b2cc5c540f07dd5633840545975823ddbc6d9301b1d437c0ab", - "e74e6403e83b003faf2082f6476544a5c4880f594f2033307952d38a0f6dd247", - "fe2cc93c3977f8ebe4fecf568e81b63ac8d09adeeb37d41f630f474a4b9af90c", - "08edbe3803323267c5b3b885529d06e6f9127c0aebe6b5f64a61a626a965086a", - "58162ed05e3ad9a690032424d3a0e2d1f2355997ff48e474cb09bcf134100bf8", - "5fcb3dc92f3cca56daba671cbc486e169d7e39db8a49e222b4e948e964125587", - "9b609f3ee8cb2df23bbd2fb17cf2ae6b6e900f91b291649b3954d5e52d243d67", - "0910662110f1ddc20d049f0fb57dd03dad8adb98a4ae9625e3a03b973a848e0e", - "7735b9223e370a251ead4046ac5c15b28297c9e05c8e915dabf1fb7396e466fb", - "30fa2ce53bd4351dfe5bbf1771b6fbc34178fb451656a524940c6a2aaa08b048", - "056a944f693fea5899f7b6848b5467208395d88809bd733ba87657547558ba7d", - "c229fca78ae810fa7938607c57f351f278872f92dc3bf88fd84d40fd6dcb865c", - "732572b26e0b678fae736ce870728e6801cfea4b237c51cd1556c60e920efbb2", - "5a49a07db0851242be776178ce7e760e6762b4dbfbdf733af929750e044b7209", - "aec9c5630c3106ed8ce27ab139ef1b3c2e18b26dc14fcba8fa45ee829c76d9ab", - "0216a510731e70f16cc8fb00c37038c301f409e0b1a3cd2edbc09b3bdbb6e388", - "69a490c2e0bfc91252bdda94cc34c49a701aef07db6c4ed4088a86be7659bd97", - "977f5b0d4299009de12b74ff95ed6fed8f3bf1528ec5d15b05f760b79ce20f19", - "3fb68aa5a221f075b523b0c9d930ca7d0b0b6771a1bebad089283ef0c9e4d847", - "9ce7e470402400d43d93ba4873b4117a14ad15f174e0825527f98d35096223be", - "8cb90a19c76a1bfadfdab37474dee1b2d5a8e5384b040c51ac35f8c7db7d88cd", - "ae1681b2ca20cae68109368c2ab86982506724d7afffe35963a498cd042239f4", - "de355b04b310340b1bdd59eeadef74c41a52b2a42f1538d0992e41c22dcbe75b", - "e08dfd81688fe15d25f99fc1169fccf5bbe4b09a47ce1d3b3aac9ef8dccf1ce7", - "1b28084d9ce4fa7afbdf8b9d7d2ca0645023d062cee5457549a430ed8b017e30", - "cdb1e32261eb86c2705848b9da4633b3d0260ea375002b28da5d4b3436a8480a", - "d3fd51cabef5a27e895eb2c5197c6fddfd1be2974b0cf4a480c58a4d1461258b", - "fbfc1d9e2f1821d06aa5e5609adc4fa6edc09a9d5ca6862625f2f3aeb4e8c78a", - "7f0906bfc3be94945d511f06e17bf147145e50920081e07da0eac8ff13943a99", - "4e4013bef70994bf98d5dfceaf1c56bc5d54db54de63f21372f9d59abe804ffb", - "8c904005e922a60d87facb0add303562aa9a9e4a605f53d723173eff67aa0c4f", - "a6d7396659ad581530fd75edb103df9f0f312ac6d272947e4ee44f18724ac684", - "32f3126158771adfbc3beb7e8508c2a9ea895fcd37fbc91645e33b14cdd7657a", - "ade13ba7e0587ff9dd512d9f725e845c6ec210acd4ce41f6eeb673935e75cefd", - "659a40f6a7646f5c42b062754ae997f10a29ad8a50b5ed781612fe2e5c8b2db5", - "64d8e11d203a4fcef887929980f15d0b63cdfc2c6b27336677a180c2aa234a6a", - "1aba3c3dea16b4640c46c4df24f189f14a607ca07580be674d37ac2451f94edf", - "8d2e687f1c7c63dda49a640f2ae577e2727b956c56c701b6fbbe84d7d752faf0", - "964abe0fded0b3f436100e08b9fb9bbf8c6cf11d70123242c71904545be9dd41", - "98216379758e3ba73334210bcd75ee8cf762abe7e5a1459f3ab39877e0737961", - "f054503a48e05cdedbdb5e2438d2fb43c024cebaa770115d71a1d3475036fe93", - "6743c77e5b51dee58f817f10d4df2e8e566a9ac168bcede20ae603b011cb1af7", - "b9dd97bc46230d296529afeb9a68edcd2f051c0c8873bab02d7881f00fc219b8", - "1c995c0df607cb486a9bd95cb6338683d4a288e71502878e8e6ba98bd38075ed", - "29d62e7a3833f9b1fa9a812f7369b6ddd44b1636d3ac254c22adcf3f03c22f65", - "f6bdf7f2be42652f909db29dba585fc45bdf91666f9a01073084ab1bbd07deb2", - "568465c90ac0b7a6676906ca23977edf2503fd1395b70a23feeb12836188b6dc", - "13838d95658d10e7a09ebdeeed07427c7cabd9d0d310659503db1af904e6f62f", - "9d324514a7d806e9dddc7eb59bc438d1bc3343bd40a8d5d0fe5b4a9818a3c77e", - "6331d9711829f39a2999e0def8f45dcdb3508adea11556f2ea206781dada8865", - "5a31fb92263180b5d73eb1c62e868e087fbd1b446774887defe11af96858fd68", - "8bb1922491d1c926a5aed8c30b247f333ddf62730c9b393927b1672fe3c45242", - "a3e82f8b88d424e0b1168846d9283fc4e8c1bc25151dc1cdf01ba0e37609dd8b", - "64cb9625250c02036f6a9ea81f14c0cd264b1c4cd4f5a00535e521569de984cf", - "b2be64216b2a96ebd75da7f9f6c84beeda0d35d4271271450587125834abb952", - "75bdbae87221f801906649f3ca47108a4f581aadd87efe0144971043e5d17f59", - "1c9b0d2bbde5ad45c6299672d729fc2bebb72218f386aaf3add1b2de3777239f", - "0f79540bcecb49d8a4f3fe7868317d6a6c469214d411343fdaf621367e5b9ddf", - "dbe7eb05b2aff3c12de770fe2de52bb3d64099ada0339e229dcd1486a2c5ad7c", - "9422c3d0c07f591e1633cf4dac4090a0ae46b1cd1b689fcff1852c76907dfc82", - "7d2f1c62b71e1ff5f827561a2f28a7ef54097ddfd45bb6d91a46c652f2bcbb46", - "1b615bd6d09486715e7ee1ea14ba10b2a40e30c73dbe48fa706f47177670fa69", - "e61b95dcb8707813774d6a801030b5cdce330c5cf6128d83a075620857cfbec6", - "fa8098c2e7a1c0c4fe1bfbce10149b76ac955d1e460d8d057fa9a4f34e693925", - "cc88cdfbeb32d5e2cf5d46e4cc370becbeedf0422f746b352d9e83b12c248abd", - "7bda26429ea24f8fc7062d923f465353c5dd2afb0b71fecf06a1d1e5a622fa47", - "18f8db4ce33e3e164d691b4057a5565e7aeb08a6a76e16dbf2b10624644ff6e8", - "63c7941eb6170a710e23de838d5c21773470800bdacc8da567d489457df942cc", - "762d779985ce86d0785867434f02f1f3a5d04ffb783f11a7aabd7137a4d18193", - "80c7f08f9824e668390877662af379f251ab99d0951cf9c0da9777df550a8d00", - "d4fe565fe9e483f67c2a080a3534cfc28dbd56969f1dad884bd9aa5d05ec78dd", - "e7aa2559dd12c292167b68316c583898c858619ca39f1692c110430969036bfe", - "5bfc0a30091ef88b9085a09d439c77f56378ea28b76f3831cb7e9036021de40f", - "6f5447672dda5ad413a9a39c43ae70193a5af787ae843648a0b242c33af54377", - "3fe95b12dabe94872c4f8ae434faea71f25db81a49a4eb4810418205b3927cdd", - "a540e9c85093c8540553a4d5f52cac79de7fb57649f003a5e37a472c0a8e4845", - "08af7b3dbef4f08ccd3d6611c94d9d824a89393ec355a22aac8cc4637366c07d", - "bde26af9e66029980425d261625bc756e91d7de392e6c46aee1c22b58c9534f3", - "d4f9b17fa1caf683ef6ed5cbdbc6543094b537bfb542808e1e6b6821db5f76fd", - "b4bdb68087d1fa5f86852c3b53bacc8332de548aef436065d449c87bb038b1e5", - "0aef6681a3d5ec10b2868e0fb27b27f654fa174c8b0ed34d6e1912a00b6ad99d", - "786aa421c4373a4ff483c2fab792cc0fc81423d3b4e562a313af33b149cfc62f", - "e5469c109e69b98d74bc660cb68369204a56e37b261c64927707621d75da581a", - "55fa2fe1504e0e5b812b8d4a7e807e2d8063f20a930be204f97eea7a2b1e5fe8", - "44cd6f2fd344c863f86b2fd04a4a65971c2c384f2a9d2e74a4ac7844aeede043", - "d66033e672c4a8ef63852ee2c0ea0877f563a651e6b92adcc27f0c3dc8f284fd", - "558af0e9d7f739fa72566dcb2fd040cfaa2222c2c23138cb34ae4458636f8e99", - "9f12a53bf7872b25dbbd0b4b1199a9955c6869243181b3a127affce9bb6ba557", - "da3a1802517b53c154972d6577c3aafeb53b117dfa857da632c6e1db4c0af21c", - "74e5c905ee4b33bbcb4289dec47d6f70b53236bd0db2d216548cf1787bf0224a", - "fd5772182286a2fe9bb6df28ee7057887f5907ec08568163c63e4d322372c44b", - "7327dedf82fb623d121a06419a5b446e0177034be977fe05aa7a1479f313bc96", - "53ea02d52c35f32048e50f45107c72a41f2a02c6d701f5b3b28a7e523cfafd16", - "64affa0a70fe4f13a65b978fa4f1163fa5411aeeb413a35ea89bf4245c39d319", - "78ada172c20e49b38ff9d09707173efa8271cd885c103ebff544224e37c764de", - "31ec52fb21d4fa8522406bd7cdbe09a3838f07b5718a960281661ebcf135d169", - "9047227676baec863c0bf4947d4501ed4b2847bfd7e0cd5f720bb0224de59d2f", - "db31ff573a8587c90cec9c49fa5919a08dd76398387dd73348562a549aff371b", - "3894183b5d522c600b654c09f94fbe5b874cc81fa22717dcead335d1d45a16c1", - "4db4c160fe68acb0ce9319c2167f9fe6edae0f654145a7f1e8756a7e3b51c177", - "a92f390a3b61b7d11789db708e556b8e58486408595f73c7df7d966cf8e38dd5", - "5e0ae69188a2f8943655841fde83a33598ebafe896fcffc64e012e1b4e141b6e", - "4d371c3c212b5843f7b758ec049abccba11f545728ebe1bd282fe94661fb9c48", - "7e34530b6e12e1380f7e3cc3d79094771f5f103884962f88e86b0df5341ad78d", - "fed45edd55f2d9f1c52a529b0ec40a10a98e9d66b33c5246e182cb306c01ffa0", - "3a22fe51609ba2da20da7f6e8a424afb0fb22d6461fc217bea5dd7a95de826e4", - "28e09ab9fc352ee1201d794c48b58a130897e3cc6166bcf6b8eee655f7be2e8f", - "d1c7eb49f9eb3691804a9a887f9457de1e8c73bb6c02df50cd3f89b49aa6e0ab", - "186975d30cdc71c540cdc346f8f34e5320bb08f9f09a003396acdaff564f55f9", - "b1bd27325d25f7b172070370b259934de38befb76e5d4d67abe1d763361cfb62", - "54206b3d3339fd5114990a80dc4c57b19f998e07114c1169805e68a841aabb6f", - "3233a36ffe5d65d540c256323b1c9fce5e5b91320cf1ee9d0075abab0c80356d", - "65ad89b05b7dd7176443744a0ca6b3843c6cd37a784caec1e3b882b8803e31c1", - "f32295319dc4f63cf4117848db9d7a6586c9f3e41f868bce42beee8e1c157f1a", - "b0c41268313f1a5a9b2bbade29f699e2a3f2b1b5f183430d870b9e6394e2f0dd", - "86cfe63ba3f112834b5a6fcb765cfd5b0883052d8a258f3d08ad359bec0f911d", - "130fe4a821e3916c0e0a5668ea288a35f7a82dd3256aa7286ceeba673017bc96", - "00612a4959b0d23505fe76a51017d35c186941831f9c42a6a17d7c39e4724453", - "0114f25ae5000885719cb175cdb75541c8737c23007071c3acb9789671f7f83a", - "082e7300140f6dd44950ae348d4f93667c1bd84b49b892651b70b91505e41762", - "aebae55cdf84b8e12ec00aa37d82ea242f62a077b8297556b9dcf12cceaa6030", - "3a2b72d738676e02be515a33db3aac8a2d4c7c4fb7c154347e2567884c9037f6", - "eadb78eba27afa0906e5d4e2c3eb25abf3011625dee6c601ee9b922a0d6b3b87", - "a42f5c834baa593f580ce07a01d6b8e577db34a64fd755c419581ad10d69f192", - "c9d3ea9f2f1901afa1f97bea28bced4ef58a9745381715d70a3bd1d3fe81852a", - "75c099f825f3675308a8adf92cba389e119eb2f232b77373ab49277ba4f2ae8d", - "657ab0f36c03d9db9976675373fe52d53e7a0a72f7770ab5841748720947f19a", - "bc5eee20dd60dad9c3b7d73d12631580d4836c4d13e47e2563aaf7889be250e5", - "2b9470f8f75db35cfca0b4d9232e37e036943ad5d9f1ad9f8bfa218275a02a79", - "bda14462f8b82235ec33035c308fd26f6e7e84573b4e57351a488f3e63c63dbd", - "5743bb8ac1f6951f1429a653f444cf9fb74417151334e39de060b5c5d63cdc0e", - "596fed371aecfe79ba8f7c20641c818b40f8e49eb245511cd6676584ab3a4b9c", - "5129e5917ef7704d7d14564d773a0c2847642f8c290a33323ae3877ad5724a17", - "d040ad82e0daa592a51f8944fee89d63543c783100cb7b3994b6ee5f942e7afd", - "ee727422948fdf513df3f2a60d45e1501a304e5b37768c3892a8adb56b174ce5", - "362db4823bc269d0811db07de9c611059006a8cb070daf14ca4a15573f4b319a", - "93f33696e26db2fe27c9cfd2fec7c7d5419c7ca2dc68798c5261fe6a86a1f15f", - "99f1f584567cd346641f36f0c2f8efff722bb06396c165731b95a9819be7826f", - "26999043f8cc321b449e3ffe31489faacfb910990d3c48c4b552da7d99f4a301", - "9372bfd0661aa971ac22ec915652420101ed5e8742f1feb831b3f1873674a760", - "3714150a86fd9030b9780b9322fc643bc6f8c80707e79ef090dc0f38dceb840b", - "7c501a11d5f3e2b6109007c73d12d7bac7d4b2dfe4b9a91ca72417654bbd720b", - "e78d1124e31451d532d5f9072276da95ed0bee776450a8939e6f9fce2eaff376", - "0f86cc027a376e2c0cb1f4a2ccaa479f90f98f09d1812427d6c11fb5086e246d", - "b68de9b80290ff50efbc88986b13869269fe240397d2739665468f36dd86fab7", - "e33d695791d5ff1b213a225d2de300b165a63fe0d95c60d67003659e1380da9d", - "d5926cbee26aac2886fc533f66137f7ddb0fcd2d86d8ed9f5705e6d21b0bb54e", - "f24efe89a206ea5cf41b1f85c850cb2edec31ddf23c5ab82999366db850101bc", - "b1072b3ee9641ebde3e75cc8aad39d8e8347ddbb697e82e2cdc35d47969a6d6b", - "ce636fde26756cc08ce8df03ea586dad5d91c5008f3b3b1ea9ddb02e196c37e7", - "7a7b7847a8c655d47d42ec43ebcba8659327cd7496d4732c901ead2525746a10", - "56dfaca9830b35332b11eda80eaae954a11eaa67989525b939a093ccc1465085", - "afe323cae2c3eb75307a2c92b19dd66d5973060bd0c6caed8047833537ce65fa", - "d31a0acfc6a47f22e513822ecec8cc4ca6ffae301ca39051bce92268b11d5b6a", - "197b48e2b060a7a79095509596443752faff9af86a8fb0c19d1cf415eed6a744", - "49eb47e3b8e254ccdc2fe64364c96010e500f725c9bc77008b325af1fe97e1fe", - "d74b76b9a138daaa3c61babc4b1510e096786a0d6b61a4c69d00f5c012bdd407", - "da98cd34a1750422fad66b1718d60a16925a76216883c3d2886530a642ad632b", - "b5820ab96fdec095018c8efb3011448691f57ab83e532b7d3bb151394e971b97", - "e7253eff6d4c0b2f1fcf2386608335a8f62f054302cfa4efad006fdb0ef6755c", - "2a020690421f907d8672315b0a72f446430d3588e3a8da4c49e0cb6d525fa34c", - "aa73d89c3253f11e083ed034633e157c10d56988afb15c4ad89721985f0d51cf", - "7f2c103bc8fbc592762e827790c64431470250ada22daf7b49645d000bf3a82f", - "539854d560c240744d0e82fc2952dba7ef913418da6dac88a4a9671c498130dc", - "0c4e474a1863941d23e3a43a7a85a2170c70e587e6028b76a2d230ad563d7e03", - "7109ab613f2ac7486d5a2d822bdc961b25deccf2ce87f463c46614b03f5b06cc", - "161e09d415bae281aa6618f1546e885dcac8bfad473858766f183fdb320172ea", - "1fabc590bd1d71eb18a22516f6c7e961ad6a44175c636b661adac355077d0397", - "b9325152e2f09f8775c255070068907a4926d6edbb17ea609b2ab03347e56911", - "91261d12cea9c3baa051c2bc9964ada9d285257b749d9e5b2f9df8ce32c19fa9", - "079ac3e03cb476af59e1763f294de67b3048847269acc4f8b8bb4cba05accb70", - "f103f45ee343131cf319b618091596678d702dbea5fa0eadbd02caf8fc17262f", - "e8fab296fb9ef902af2097ad030429feb5b1e36c2c53c13d8dc72b2b92fc1fb6", - "13c52772bfa51bef4adc506a1eb4be3d48f374544e3244366f1e9552571ee35e", - "87989960b03b5a12ad3575a18d9dbf6534d4bb48a04d580ab1a5b071e91407d2", - "2ecdc8f93b8ffe234ea6b165e807039e812606f3aa642c07ca1da39cdd3d7139", - "a5169ce94a92d5177dca1b47b484f31710675936f58803a2a612c1866cbdc885", - "13decff35e1af410faeb9925fa006027792c31f2822ff85095d3b40283a299c5", - "651d2d010eb5a25c2b5d8bcf43bf77541c4795f093022996bdf8e012ab988b56", - "ddb6ed8eec6d8ffae0751fd3093f3113d922a6d5e90d65c2af6342bac0c198e2", - "091638d2a2c2e139cfa99973c55918a87b06d5865236cc40fb39a6346aa4da2a", - "ade0ab2d232d8710197b314312a484f9c87a4f4dfb30aecdc4940f115f92cac1", - "85d5f5b31cf81eb74058ad55c5fd198bff7ac91b71ca7de8a3e2961df439d2ae", - "0db75a29ff206689c2ae081aedfdcfa66c9c4dbe5b15d5eb8467b8cbb3e41125", - "6ce4d8817cb3e8dc08d74b03dcd133c841880acea6edb6820abdce4bd6329541", - "aff4d017f58b2f9619ea058b34ae9101afc68cade593d95f1aa5034bfb5429d6", - "9bffdc071ff98dc5c25616006b1afe873948d36f95290b860c3ae14ddf2d66fd", - "0fb93c692af390d986fcf95695b179327982d4682c776271f4b337b72db1800d", - "6376bc9594aaacf64141e8cbd8afd1cc94661684ad55465da58dcdf4c02a988d", - "f48d767c90c024eabf22d7728e0b092a5df5162cd75196bc6388a264bbacc0d8", - "12efd58f0e60861ce351123bd71736d058672cd97397e50aa4f9f3d56566f020", - "f0125719ec8db3520edba6ae4b381596cd1d29385940011b32e73341261d41a6", - "e49e7d8e416487de1e9525717db19e02aeca1eaca09075170dd6a25762425e40", - "a627c1f1cc519f4c3b46a05b1374991d968f80505ecd059d754777ee75586b06", - "a79f3b631cb9154daac460620e7bfd14dbb7c8f7533733e38debcef046813e63", - "d249e1c98d9564e878c1541d7e09c874f0bd3c4bd1cd8e7b0b31739736470471", - "c695f0a1423079c4ddb235d9e6fc04d7e967e7b7b4e5b2c263ec3fcb6cede275", - "e041ce12c590cbebb58b5888945cf856b38fe303f8e6542b0fbb9d15664441ac", - "53d47ab8ec9cd59b2f95c67dd7a07258379eac26527ffdbdf8c5b31c77b74b22", - "ff40d55c21d0e573bb13bff59878a4a2c3ba1fa043935cee2931036a1f4a0515", - "724ab512b2c9059aef280447f7a4dc7b9c4ad56f48a6477625ea49e262d62dc4", - "d0374415b815d43d2b7d9542a4beb2307586c5419a9f55569d71adb73a9136b2", - "c72eff9696df1dd0bfa0c4a69c2a0b77fdfb42a4a7776328594fd929d60d8af7", - "5e58f9fd08630d706e44f13e668ea065b1793a26b2cc81f290adc76b7dd4344c", - "315d43648843dac4f4afd30e239972c55785268d5bdf779bbe51d6c6b8fd1504", - "345a06033f9c9d8c524c28238a87c0c767f1b8cf39f62802919c100ceb43ce2f", - "2d21d2153d849edaa567840a745fc82c1183d734a55b19a5af135aaceedb3262", - "6b1b87099ecd66a7db51c99bd5ba741d88ab401414fce1d8762f17e4315be609", - "bb73e0847429ab5586171b99356bed79a29f21f7dc3ae7dc05d029c5250434ef", - "bb527618c3eb2fdd2c8fca6bf1cf94afc3118316b94855873d5251bee22ff0ad", - "7efd7bff4db6f740dc4931061b276df9563ae230d823e24198632ab059b7e632", - "9c1ef264f18f6571fc303a2e14de0571fec893c085a0c5cf27862de0a9b53b9d", - "f166ffcee5dbda3477a095e2358513d90aa79fdb75c3fcf876a67b0b3c11d9c7", - "ea9a3bf00dbfe93439af20ebfadbf87ddd521fd5e90239a91f397e5d38e90ea1", - "f2439a0bb40d787149260dd93a833b8515370378fbbdced51df094180ba64391", - "2b2b3f9a39b948999bcba3f265b1295a8f949f26b7b6403764da5f11413ecb91", - "36a4901cd32bf2e464f5ae67caba46367f11f6ea5c2b3e3251feb14970c5205f", - "b96e8e310fffec7008a4cf03f9f4405de21c19febeb4067a749ba226bde71ad9", - "4b0ccd1bf9a4a535fd7853e136a1175d0a74511aae276a112635373f58890827", - "9857607c2b4d4190328e62d6a09e5c0c3704791e599bbcaf7e6de449e64fd6d4", - "9a9bef9f9893f628fec772424638909a276c26b00f3b66a4ad5cd900f2991a58", - "79295f3783b2dfdb21e82d891c107a5a7da225e1591aa116b70e599f8310a660", - "591982b3a77fa3375c87368da110c89b3b20a2fbd3b3000a89ae7fbb02c5290f", - "6150bc81386f79249f78076c392218a98ff480bb5af172f97ee8074e5f821477", - "64c2da6d05889eaaf0c8f49d4551ae7cd3f25b51048f6e2d27d926c556ea36c2", - "868bd324e0c2ad5b5c4989f619adc0662e9955d4fa711b3de3ab8b89ee0d5746", - "9c6931fef2860990b5daacd264c92164fdca83c456d495add94d2abb606dab28", - "149c09317cc52e16edc2b2b5706b85c51423388ab1cabe6db45702b2dd8cd07b", - "45c9463e9ddd8e123b4437eb6075b919676b181923b7731b0e29e62be34ea3d4", - "ef55d4372af51e90147f6b8678a1570ab732ff3ba3930113697229bd183bb514", - "322a74d11adfebf4f500b7dc688f34883b0bfd9a477c2de4b95bafc6b69f787d", - "42ed1a99f4ecf54b5f479655621ea574c270b36517183d5ed17191f7bd098ef1", - "a91ef093cf47b218bec955988fd257c53a346028a3f803526647787881fbc2a7", - "3bae3969ff8c996c514121bcbd33d4feaf6930fed7fbbecfb231a2c0b7dc8b19", - "f6a2afc09523f7fac032478cf622056bfcc52253d0cb99c31b08dd01fab9084d", - "c2a4fe2e753c7e04462b375703a6a6b8641e966fa0cf15fdbd08748d80dd246b", - "dac308c71726b1343a3b5a5a58738a7cdb53c022bcb70f387d70db057035df9a", - "a8ee65d2d1aa17aa8e2d181f9a08ed265666fe086ad64c7faf39f37066e75bec", - "bc617314d755b5f651aa00259fbf6891df8ba599134f6a408ace3e780eba8be6", - "5c421498999e8602b639d2720ce21435fbb9723485c8a250427aae2d0e665ab5", - "2e565ca3264936a177381c58a66b16ed1a4653d7aaafaed81e8a350e228e4379", - "80d094ac811815ed45270d6860ddf7fdd7f715c32dfd74a0fc9d3d3d9a0a5332", - "55f36da5c909a8139d1d09c1dd9ade72744d7761bcd85aa19dad1e712bdcfe7d", - "176f5c00e681e64d9e5bb81a2ff21acbc00b8b44bcd176b5cad990b26c40c8ac", - "048a5ad605b54b3e0ce516fbef08507a4c373e3db7970162172cdb2f23ec7eb6", - "d7b44328701e322818c00c35a75c8b4473a7480b8555b036febfb4a65ad41d9e", - "c04bdd0be94049aeffbdf07169b3b0a54889bd09e492763bdd01efb61b996c9a", - "09c1ff5794b97e08dcf606b0b7b13222f319381a98c063dabe0d8d3f0c55a481", - "d14d40711465161311375b612d92d580b7173103a3b872ff3b8a10bc0f117285", - "c3a4f8b456394c2450f5feb3aabb968327fc086d42d4fe6ec5680a46aa7acabc", - "7c27290826f5dfb492edbc4404345115ec1991df75e6ed5284bb370e9866d38a", - "d5025b874c8418ac2825511664ed0f582ca5c13e5f0ff8a63d03042e7de553d3", - "c892d5fe7a7797be82e2d919d6b948a35c04087e810d7e6b9358d75b2bf7803e", - "3a8cc29616363869839b0aca3687e53d3b7699756d3f95464c834556a83a22b0", - "fef3ab837542a80e9f78553866aa6e08522944566371e14306622d695829a023", - "c7d01fa7f5c2185df8653930e76cb290a6facbe0a014099fc4daf4b1eaa5eef7", - "4ea8c9efd2cee5948931da76fd3712fc67a7030ec30399d96cc6e1333ee868aa", - "964d75b03de5ec918ef33feea9a000caa97bf1b6668e330081a75877bd881b3a", - "616291f05a9c9edc75bba55699eb6cd5c4d8fa2bd9c843906167fde870d001bb", - "821017b508d22d283daca0221094db09cc1291c599c99aeb41798ea84f77031f", - "c280c431a97121c65c2d65f8901bdec7061ff68c7a88885bf5422b14dc0c59c8", - "bc8b1b36e0c09f9122b24e81eec1d9023cbf3677130b48fce165b49d07125a88", - "1d4d3691a90fb2d318d5b62d4691c21e52c7b352141f2a4111f6594433645c9b", - "a12cc717a832014350b92125af876917c0bede4769fe9dfe6fbf57f1cd497470", - "07b679ec648418430dfdd684f9296d061796d544c776053ddff70c30312f374b", - "a1190182c890df6c215f287045fd966d681f9ffd6e8c7f25bae70640ca0e88a2", - "7077b37ce4808909e4595d4ea5eff3eae399e5d7ff02df6cfd3ed4dca77cd0e9", - "9854dd166eda3df19cca60a3e248aa8d79edc4bf401d120ec581813a8fec3f07", - "059844131d2e4b233b6c31cc9e8fe5ac6e67b046c62de67a38d627f6fb510f1e", - "4fa6ed75c25042891e63587abc463522a07b98d081a22c7cc1ddc3234d64be7a", - "2e197a39e435376dccb24cd1d8d88aab60f3a640683a9954c8813ddb1c13eaa2", - "753bfeb3da115ed1131063adb8963e531ce2565ae8b72cfa62d48ec3f4d442c8", - "c43839b99a5cc3022805038341af7f88f0fb3a1571c60d0631ecbcb5f6c0eb3a", - "180accc6f4fbf343c0b69282d94afd0abe4db3ab2e0c783800734821804091ab", - "5273425466c02a554512bdadc82530ce04ba5e90279ac807fd3f831aae2ad256", - "669186458d13f8f757f6297fa1f0961a61e9244a283d9532b0e2ab88994ebb3d", - "a35860b3ce2f2883c6fc4702cd4757dd3a1792d59d34b4310e1f8f80ed72e7b2", - "9032a6208eed8790f247dfb713c6237c86f52d7628b6a98d9a4b6c5a506eba9e", - "7e4c23ceafde8c6d93fe865abc02453f29091b8b6b8c0db5103646c5ce0eca05", - "0a38517b581c0742dd570c751a3417e0e7e2de468871e04a83ec7efb5b54622a", - "f8092c00de72174ec7194d0c484f314bca2e1a73b8ea350da4372d4b4eea3912", - "7f73316b3950429105697b2740cd5f7aefb16d64d82d8818e47cf2f190b3a82e", - "03a329162c095630d2e71ae39416f48f70b06177b5e2ba8e6a59b6d10a0815b1", - "8efcf39e429d331cfa8fbd9b6a150bd28605c9334e333461fbe02abcf6f86d63", - "a430680c978e4962aafdfc1b7c84ea589ff018fd4fb47fbdd99c41280b92424f", - "636fdfe664ccdbe608c440c3da14ef262efe46454bc877a15343c2b24eff3de7", - "5323f019c2228a9b39542d8d1b35f62dba4df545f504b03e1dc1d09b54cee60f", - "131ad607591554ba43f09658cec90ea80383b85e4a764fe4c6367b45f59e3f4a", - "3fcf6052c30113a18021f2eac78de0f0719423fc5adcbe2aabc27ebd42a0bf27", - "ff9e60a56cf9d9de7b37e52c722a76912db8e32075a4846d7a5f513bdc7b3a8c", - "109b0ea04369b7bf0eda6b426548f7b2a58ff780229742c1a1fa38cd7b53065d", - "67e42c088af468c05098b3bced435e7725b7b2d27aeb54ecbffb8aef90087861", - "dca9db926c22ccf6361d7321ef26af04fda9aea4ca04728953cf37953a26a00d", - "01a642b02c120f109c3b99716139d8e1a4e73ed1684e6a3aab99777310463073", - "9cd026c545a62a80b7a835909a7c5ff49aded0141344193b230e7b0438101cd9", - "42e45a729a6be9fb2b005178d0e44e54b52f1031057a1269c765b2c1eec7f766", - "682ad667fe7439469193f0c7ff347276e4f4cc5feefab3798423fb824cd422f4", - "ff20cd70a23ba4521426d1e52ada8e9ec7b72f687f1790bdfd87b0de5c351d01", - "b92b3a1509b4aa239a378efd7275790a9ba86ce60ff601cff39bc2ecb0d9f488", - "27564904ad321f5c736b7ea1d9e515ea0ce5eec80ed51953c36e58647b21fb14", - "9aaf53e93842ab99d2528d1df7e67d48776dbd23286ed3cbf6c3742fd078d82f", - "47a0ac94fb28fa1b7e5f5993457048967e511efd3b26879b74a883eaaedcf64f", - "938fee0e4c17d6c6ec537309f18ad326a3e70254398b8517b5f9c1e03c074c8b", - "477c23604215e2d4d9ec15fd348847737148ed9ddfde6d4f2cecd08c2f2533e1", - "2ef8410b9a08ded6a9ef160fd2279e62c3df51423a2df50c4349aaf05587bfc2", - "63ff59c45481c9952240641786ae77b02c361b28aadad0969b97558e138af3a2", - "2e13baa34e7003df88daeb8e25627a768d34bd9760782f7e802bb7f16efbbe16", - "e143bd9d05a91eb8c11d7d719cda3fa556c2147f778d23faa97a48aa8b14c919", - "d2afae71d9ad2c8c8d5f3c29c6aebf5beb9616df59d3241590ae89f30c4b2225", - "eeb0dc2059d05a0d28c9ef572d3e56aabaa0c2b6d1ebea933bd11f38f254fdd4", - "129ac8997c387f6139d385165c3a27b6215c542e17b37d430cbc4e790f949552", - "40bbe981f23b2ec3642ed4f35d378cab42235630035553e4f1cb7f7ed4c2a374", - "04467aa23a92524d5fcfb61af8503186fb9ea705113e8027c5346e9a7a85246b", - "0af15aab5ea226adc5f5fb0eb9ada02c7f6a371c46770d1ccc4f1a7ce66d9123", - "20b7056653d407230c23a076896268e89cdd2fd8c1717a7a1cb354d77e9ee142", - "a9cc964647bb44d97b998cd3534dc791033b6af65954eeaca572de431726800a", - "9049eb79329a55424d8df97f650edc9479f69884eb913dbfea2276f238586b94", - "ec99c18e0f6476a98fc45b7b9d946af553167cb995ae3729f7da43ca5524b923", - "00d4fe6c772a84b805ed36e37b51b622fd0e69a341e3f7e912786215806e0b6e", - "f405fc243828ff2bce935688472e2d2862a0b03cf3000c099bbc3a75dd68b070", - "c60fc70c53c79fb436a1cb09544be57214388df6fc033240e10316f3a65a2085", - "0e058842fc5fe6ef00ff8ce292e34bb738e07972a88fcbdb851d4b4aa54654f5", - "94ed7067c909a3f81042e6b1c0f11e0bd4fc25536f92952a877f633e3cb84e38", - "720634f2c043cd1bd590a42e622b8269ce14487c1e08e3c50afef3e4e7f95998", - "f2f2ec5fcad064de6b03745b39fabc4b69ccab18a2b6c42b32812d04172ad82e", - "6b1e40f0e422df05577bad54c5e72d1dfdfc0591071055204a45167b5fe652a5", - "738ed5a78cd5bd83cb5056767a0af332bd4ba67dcf787f557339c5f99c83d761", - "7ce79b0fd38955a615dbff22270e30ec22f3e51d918289fa30c390b27d90eca1", - "a6182ccaf00dc584c28cf5352f8f75543f152aa9129fad88e11e79e42fa4066a", - "65bba871290f73b9a5ea918926b35322ba9087b54d78fe90f39848597efcb92c", - "f7a3530d08641135170ae21781e4e114831eb9a639a3bae75e02ab41347e116a", - "260400e4729fddc2d536136e7082ff900c50849c1ecd21b9fbd40d883157bf68", - "5c730fef8b261f7591e1427d58c1cda4f04d0f66a470aa9696ac15396f08bc97", - "25bb92129437ee3c733e939ea3e89be5891fea278db24c1285fbe608d774b08f", - "7f594bbbbf88805e4473978f6e5e69bb514e531d015fa4cb961fb7f4517005b5", - "6fc3d8138e0cb15d8e1678dab2e3120970ed5bea2f5eb916622d25602858fa5e", - "85d86d4480e997bcc7298c3711fbc364d53d3fc8cad383756c55a1e4db241051", - "2b6536c0b638f2a062549b19d8701390ad83c85123c13762538e652c74d773a3", - "502629f2fb4b0ed0c8b2b6ea8000e4451ac61e03e5e1b2a9671818f2208b9a7b", - "187f3ab550311168f921d8990bed7800aeea4923b8ee06bd0e17ea8d5cb9bf80", - "94bc2f949933e5f9419aab5d300b5d4c27687a26f3abc26b0dc6bbedcd6a98eb", - "07e353e3c1b66c314dc0d36057b00556518e2a5b59967ee7e6a1f8f54c47021b", - "dac9e636c38dfc4f5ed833cc87a6356cd3281be8c5ca129125e0e574f8c287b5", - "e3c6f9a3aa02c606f09a3ee207d98650ca7c71c55ae9914619f29f355b775930", - "741b7799a73efbb3cd85818194d90ba5df703614bef18f4b8b48d2064448a91f", - "0d5c21d27de71937d87a899d65f1bc4eb4c1c71d5f32aa44b002c45355b7d983", - "37f8ff3c9a8a70bbf2d3ff55680d5f445286e05f1913f75ce0bce3a2a9958817", - "17770f0b4e015daec45b2fba7b489111476a25d27ca906563f33a4b9259946a3", - "33136b1003e76bc7ac24165b63f1f7108ec7ec63443121d66a5deec9126fa637", - "70ff29563224ee04d7fca7e58d66366210481f210d614d08aba4eab22e1ebc6e", - "c5728b17f67f5b0c0b1415eaea3fe09957af3b32bc66635c185bef7b49319e54", - "8a7287b71270a37a51ef0f83e00c78549f09af47042b0832db144d57eb5d1a01", - "702cea84d36ee5e9f2cf2e2060a8615efda1ff278bbdeaebb7b446c23d7a83ad", - "8eb433e3b69714cb8d8e9f0f0471aaf438cbb3ef17e405c2a53409f8774c7740", - "b766c6ea1f172169b73207e5bacb75bc86f23c607fe35a7079eb7812bc61280b", - "c1bed9e52a0a5c4b325442f59271e096c613b0cfc6ed7ebca435773b1b8483ee", - "8eabd55393a33d6c2ed344f2bc2a955e7a331f612fe99bf94743feaa61a34145", - "3dc7603047c3004ae10b37aff75572191e6c09d65654a93799c1b51c9e7ab7e8", - "16d74da505bc2bfe897f8130746c6d949f1e4376af35535f0ba5cf481f16d278", - "375001a2d9c6ee4fd6baaf6a77ae9f0720a6aa4121b04cf02dce300af97b0d8f", - "1d3adbb0b38c982d593bee6bcd00c79568a66f71dfe17ecb2956b252ca42e11d", - "7c70f697b71ae9ba2735c09533d73123401d2af130729c953c21c43c0b1e9ba9", - "bf87e6fee37067cac639afbececed7f6fac074029e1ad6f601f59459090f4062", - "a1ca73f467348a012563e1304735865f53dc73851dff9c054ef3613a5f64f190", - "6450e36ff9acbf981bd3d19ba055388cc8352d8b1931bc8a3397e70ce8d85629", - "0c9cb2f6fc372195ea51617e8dd3be0570df321ac66ef700900b3eb82fdcebcd", - "17487b439d9dfa7a493fad853ce350bf3e4aad20af8c98b0e36292fd121d07b8", - "b6fc5ab0e61567e644e2835611c43f9af9093ce0d63a9ea1671a859d33cfd4ec", - "3040494e632600da4d146f815448a107b004b25423f656caa44169b7d04ef2e3", - "260e4eb353deb9443f475eb5955c7211e9d1b7608441101fa953b9556406b7a7", - "eaaf37517b7d5c376e336bf0b1a1274cf491599c3c0eccebf66614097f586e1d", - "3dc6739a1cbb2c9242ac86df2040ef149e97817dc0a2a2641cc0a1511f409f74", - "26c3493599e934b3217808587d46fae1997574daec944cfbc3eb95374975f458", - "a57c9f3bf0f20b427fefaeaf0204e7c9a1409b43f83e8d57b749d7935974dffd", - "3998c3f6d9fbe51fda2b49a0699242a5599a308d14f8b6ae2730f38ba5f3a8bc", - "f9961f314c12505ce774319503d1aeb2d0cf2e22dd63e66a2880439a77858046", - "675e54cb203856fa5c8306a1f61cbcc30d9cd93f4fa1c8289062d5f63da2513c", - "50040cb554bac4b47b5e4562aae1926850b06694bc810a946c0606565d7cc523", - "05377586d29658353e04d4fc2fa0fd509e930859a7b21fb17ddb7b3e686b78b1", - "746a7b4d084ffc3e08b938f29428303f224752dd3a7c9a4fc38b9309e158de5f", - "f46535dfc320932b6c3a98d8bdaee13b0bca778109808b957899ffac385bff76", - "c7f677dc9348738bfe6570cbadad027d90fd059af8b121d3976152019972dd8f", - "85d9c312b28adfd7d74b1dc084a5cab9eaa6774a71610de4a1efa99f9c56f28e", - "948507f294145cf9ecc23fb2341fb16cb523dfea441ad6d52cd1349e9d988c14", - "3ee05e9d29469a45ce182ab3f84165ba9c900a1608b8a9ef42038ed94ea4f984", - "14d062367bd434ad5739bd348adec964569ebd2c92b894e10548ab19dc5391c2", - "4da381f745a15670f71d77262a0893f5037a8bd6a513d6fd6ffd7ff625dc5d3d", - "62825ca5c87ac4a9e6604c3fd6aac899d43b1a7ae32b8576ee13e68eb7278179", - "6891d522d5019b2082977c4906408b6a8922b3683822ecc8d31de89b59db3a9a", - "bbc8c95d819a82daabdf74a5d4c936bebf16089581a6f14020c6b7e0099b4ab6", - "12a05ba4891655d60256a91b0e0dffa75290844bcd1de725a5f3e71774cfd8fb", - "2928a825f09c5ba32174a1252aa624085039aaab28fa6e299da337bd0b194d96", - "d4eaa079d04fd9ce62953ccca35d64d7086423cfb49144ed6516343dd04d076a", - "fd25bd2b69724159941bc1ee03555d9ed9428bf5d7d75d753f5159af6ab7f51c", - "6609aaef63c781a9bef138be04173394f191a2d9ba472a8665961d8628cd29ca", - "465824e1948324363936f1084012daaf66b299810dbf75ac12db3a3e80b31d90", - "46046308f42c0919a05a89619e44cb144f45fd1c8ea2c1cb59cff42b803329ee", - "473f7aa99c44fc8eaf7cd9636935cc20e4cb8939e6a8158b36a4c49758621cea", - "6b08677095cb6096fc624c040060a8947fef899a382c09cdd8864d2da1193c8d", - "e8d559f93f894f5e0ffd5a56961d712f7bea4de52fe5d263ff358882271d30cb", - "0fbf1859eddf3bbaf93876a99d3648fef0a8cece79da8cb9680584646dd9c761", - "fe66be105b156ab575764f4431f660769e8d0490fc20a0c3247e8eacfd0787e6", - "7d80ddd2b87875ee88b2ca16d4ae2c887e44fafb1049bcb92302490b00b6d8aa", - "fa3e3493c45d6b2f0acb290ee7a9387382142172d6bc319ad276af1ae7266924", - "61391fb500956c5b481a6aa059d8e9d60052c6ee288ecdd421d0c9f9b78df001", - "35591f507a9d5ceb723a284fa4874bcf96a4c2738c0e0a81f2446857665b41e2", - "d2a0cc40ae409b87fa4350b25dda3fb79c90bdd336ea2c13d8c29b1fd527ba4d", - "9ed657b101185e53719d92906f7f6d04532d0954526b2bec695e23ff6f521bb8", - "03259aff56235e5f5cec81e3a17ebf4c86e3f0c4bcdbfb57ffd44c833a9f11e4", - "45b441fd6fab6d9398263e54c416d1a11cab3ab8e55c2030e9d5089d14b9a923", - "5480adc2cc0b05ec0e72c59867a1435e7cb4c17f0c2c9260205ddcbb9b365474", - "236860f2cbc0b483fc5092d181467d3452f122841975cc1114ff71efeada3dae", - "0de39d494c38de421021d06af36908b10ce00b657414cc2078f0c606af9a4b42", - "9b756b91f6a06f3e44eb36fe22d5f5202f404f6ca1de652d14c7fb8524dd9865", - "0bf62a3faffb748b568f66a4ef2f7fb596829140469f463bb752521c2378ffe0", - "27efcf025be256514c350140f66351183cb7e1ae5f6ec7af9fe7f6851df52632", - "f0d7b3b36c1a0a2f062d7a5dcb1bba2e12b35e8c3bc9eee914a8b2329df5567a", - "cd129a6e417d9600062c85f5b40f67596b0faf0ec542c82f70df84909f238671", - "1ee393649fdb797688af88a6b607e4e863730e3e6736f10b6ccdb5542b72e6d4", - "4187b3b6172161b03a433dbfbc1b3170d530f9431026fa219b8d356ac654044f", - "ea598d97f676d4f739c106c7cbff26eb193a0945b93d9f381f6c12d935e40103", - "6d27a0b439fc5e624d03085c57370dfb4e5e05a175d62b5fa99d1bc3ad9b48e8", - "d549832b1ad3ba7e96f22f5b7ed98d4a7ccc24278b67c1db3b904238804f44a0", - "592782f799089838599ab1c68f338f3d5996caf0116658d3e3a123f5ab409aea", - "20fa3ca97a8bd61c0c66cd173db51de54ed83a22f3393dc13e7e8db9549f7642", - "ca71b7737f3e049421dea6d15850a2afdc45652b8c0f502dc618f9ea129708bf", - "44e0df50bf97de28e3b46e1eb5eb2538da68d2664307ad88f4ef4f98db5991e3", - "d8b8b353897786eed7f247e779bee42a3dc868132b1487e7b10905b28b74f831", - "5dd28f70949c41e7e1e9bb78a123201d12809d1fe2e9b2dcf5e9bcd97036386c", - "b85230b219b38539f7a7330777f52223a869e58b67d8d7e11ff1ec1803f5e190", - "6238bb6af96d00f12f36cb23faea8fc683bacd70534d632e524eef84b7133ea8", - "b704c398deba09ed97605ae786df5dc1280c9e974d51ad386b9fbe8e7b620d8f", - "40c8a8047e620ecb69f9fd3974f8cc1f8f9cbb0ab978ed68b793780c2118c5ff", - "c5f1fa0b38ae8190e4a4e4232e908f2c44c525fa6746dd18d854394d115a5444", - "07142822df889fc7e774bdf84abee1779fab9caae51685cb262d2fae030d8742", - "fde32a909ee59b44e4dd6b74c24749d762688f834e23c980144e0a125d336dd3", - "cc4bf6a4cb374c2924a62ada8bce1c6de11367738b2ad5ef4c456878afb2215d", - "dc337308795e2899046cd342be82e57b2607a0c434cc7379c86e8dc52099ed31", - "15973cf94ce55af4d96d9a7c6387455d18b075f74d22c636ee94275b7d015a4f", - "e7788be55a016bdd00b002d480ed685b354feb7c387592a30db3a810c41e3275", - "02c8cc88a7aba9a3c52e0a63c23b79b266bd9ba1dba6b6e5d9b50ceb81cfb4db", - "2d9f77fb3763bae7bb17240f0e37984e25afb56a77cb8cc09ee23fde7960868e", - "b4813cef393ae6fe331ec1d590c35cb08d192c480fe63db0edbec631c79b8972", - "bb2c224e7b5f229323011a45be0ce9173f12a02b0f7b3d7fadfc9c1e259fd65d", - "db81a3fd68e4c619162bb341d1422249e6197ab342ef75415fcd717d546766b0", - "a3ac9bf63e8294fc9b0e6fb321f89598831e05ab876ea1154e46ac67293a2d5b", - "8c17ef264afbf75111e6b1b5a09335813a8bff0d90d95928cbdc22fab81d9de9", - "9a449e11a8e3c9308782373be1e05a8e6f2082986341f25510f802c945f17e8e", - "53cacb7e43ce8985cab392a0153859fe4d6dea7a3563390c34add9a804cc74bc", - "2c51b4b7f0e15b8035fa83ddd41dc2da8e3f92f2cfb561008fd8a4ba97eeae3b", - "474a6b34f0cf406c0ac4211a0363ad652ea1f4fe4b90255084841195bb9dafdb", - "467c4af9cd1301616cd7828ffcdfc880dd183502e1e51525563a40c2f86549a3", - "9d870999cc25f5d78279d147a34d919325533aaf7122f5b8a7c5e1818be164b4", - "b188a49d3b8e01cfffec9552091435553a12e28b9407869c376d1e6b70eb2f3d", - "b3eff7fa165e7104c9b55589ef1c7a91d42442b9039b854dc02ffe73b5ee8b5b", - "5a204b2e326e178a170d2c6e5add891808b68b156119cc905f54541341c107c8", - "f70f255cb829a6bcc88e290ac661d8cf7302c378fc5b85b09279a910892a8523", - "e8c90a8e6c64ad47c8d6586c4d3c5dd4caf92438bb8d444da93c4ba10b7fb254", - "9800e99af52ca43c371fe191e2cc4dcf7c5fb02c2e1d306ca1b645a006d73cea", - "116a9d0d5d43f9cf2daadbb967d6e2a10f8340533092a7ee16cf744c090baefb", - "57c23bdf9e5b54419fee496225f4984d19e9df986587d021e2b0441b7fbec194", - "f4a54ffdd344eff0285c8975fcb163c5bb5870fa9889c8d320640d2f9034d2ca", - "4d7593701ab0f2086d572cf2965f1e5f841efd9376f919c455744c23df68e474", - "0a3171a84431acf1497cc6304e3ed642a63e52d74ce523bc648fde1e27b0f700", - "047aec23339e3b6c8009b3361dea55f203f1f712a8819d18c9bc63cfc73e6985", - "64d3f1a938ad72fc9ab6d0bcda1dbc64e765b8a522cabb62241603df05557d59", - "d617913f50c2153e91129af9ab9d7e6c3e433aa0454ba55c363a71cd717b3565", - "898bf3855953038e74ed31a35e99500ee1c52da76e9d0d6ca319fd46566f4735", - "de18f7b5738d481657df10f0ff35a7d76e6adac38aa3011a452d298efbb7c0a7", - "5e00e3111dd33661fd1025e18b54ba5b78596d260955a4384daeb0191a1d889e", - "83cb8f7246c9ace9f65379fb4462757ad1e65e7d924205aef64b3f42b6eba2a3", - "d9a0a6fa654d975c78a667cd9853ce4be28c242bc9054fd02ab0c3e86a2ed83c", - "d8921b3d9c8a9df1cb32e5d2e32e6c538d0a621d27dcfef08f4653ff970cbfe2", - "1d86e3bda1e72e2773174a5dc670d2c628456d3cb8eca19cb809d2effe7d93ec", - "890b8dc9f572663946f2fa5051376b4d52d148eff82975f70aae2869e04aca22", - "4972bafd547b730be0fadc9371bc1e476051f622f6b6f2f65b2d6f6424733791", - "6a457c766641b8fdfe25d58e14b73e6da09a14487d83054cdfaa19a4b4cb6d8b", - "ca8c108c545ecf31ef900f034fd03bf01a65742ea51d7b281cb980b1ba291823", - "4cf6a11ad09b5d9d087e6f2fb6bd0310cda70ec82fca0b0c182093228dcd5fa6", - "7ea471cc13e1bd31d047469b95fedc979b711f2b06d9faf92a4a8353e8813151", - "bfc5b6bb3cfb072a90b2ac8a42de465951e5c0f495e69c48faf891ba49c3e8bc", - "5f54e3fae91b0cb9f4d0933763aa8164070a92e839e4e2a8a37d9c45c41fff8d", - "c09b8619b5dc8eb0c4ce81fc50b0f96a9b7ba0b4920d7f3f7171f1159b00c154", - "c891be688c342f91bae13c8af4e5c0a54a98ae29d07aab7c38169359697a8cd6", - "060fd38c7a73934425f5b4b06eb24373487736967c2ee7df3dc84b57e9b33dcf", - "5c7b344092861416e186ac69818a39f6be8233c5864c223ab21c3a4aa17b4c6d", - "f23eb091ff1d7c6c446cc00cf59745b5528784d9a2fea45f6b129a1d7aa2046d", - "5b3dceff8f42675c5ae01348fefe024fa4ce0bedee624dcc5a484cde503ef7e0", - "ebf13cd2199941d97e896753fcc93c605ef0b284f86bc4ba5f16648841df8036", - "09271fad301d87bc7ec958003c5381c798cfcb88cfeed0815f7f3fb081be9339", - "7daede3d94169ebe8d33c29f08e8e293b24c88fec9cf4c01a419c73042c6dd7a", - "59bffbbf36c9fd97687dfd22566b99b7a7df2a52ca59e24c57ad0b4f62a4e90b", - "3e8892cf3a2cfb047c7906ebc5a59ac726d27835a3ff2e654471eeff2c57fe7e", - "91c6370f94836e75e142d56ef441332fa1a53cade2cb9d31238cd242bf286932", - "0c6666e353f3dc4ef238b1c94e2d2da969d1fd48e0f384cadf0add2e983a0a17", - "e2db798a9f26ee0b4a6b3ce886a13504485e5d4a12e63a2b2829cbde8924e9b8", - "e9a9c30c16380661ed6ad542fce308e507cc169ef345bb4074d445db63eacf4b", - "d8660b99189b75231113abcf7b1da2fe38a2b041334704eeb825b7f65e94ada3", - "b81168d28846373406e990fab8d561eed4a147e638e4b093d7aaa2e5c6f62262", - "c520d558714a4e1d6c42a88f397f2b3ad8d0f1649aab02486d2739d432fb6b66", - "219bfac41ea547f13e087a9e1ce0ad6f3bc89a55db4be11fc915caa775ef7ba4", - "88fe3091d8bc5d47ba3a940f0a49c8c663c4482484bb88b8b3503c4564648398", - "223137b7a8c2e5194f750418b594fefb16a7497687c3d2279cdedb97b62a5ca6", - "6238bf6b5e27ad8ab2bcdd6377aa75932d9b3b7b1dfbe3ef3ca83522d31f55eb", - "7d8dac256a9f4684ba3b92012c32965331786a0e7ef9f105e490d9117197a65c", - "c1cf800e9bbdd9c619e7dc199431a77802fb0bf1ad0404dbbd95b9a2386c585a", - "b29c1013d8c0268a2f657b679e37e0d4697afa35793665f557041e7b47834c5e", - "286477ddc6b735ac03799dee6bd1393427d45d94fba842d331902f11cde31a8a", - "c48e9b0f51b49aff12d16a3c71990d491c116116d10eba7918579dfd2e1843d5", - "4b936cd51a64f0bc8eeeb64cebf4aaa79944c4efcced351e1947508e87813eb2", - "8a1d6a3c5f2da48df922a8489304804643dc3ea78780e73576ab22077a210483", - "025de67824c200b76d12cfe1c1f49eb0a5c2fbba0a2bf902add6f39d14774ab2", - "8d1aa77d6e0852777f8b8b18e3fcec13d4a96d765d50db605f9b09f6052d2ea4", - "eaff39aa485175f59d3e074587a57e086da5548e3d9f8138fc2d4049b2875182", - "0665826ee16b852ccda3decfefd84b18656b214a07cc9e699fc1bb6752382f2c", - "13dc560beb5bd738ed73deeeb163a31bb5ec33d80657ae757e3cf1bfc9876b86", - "88315e256125e27ddbed55f69e5f574619ae5b55f00a64d5cbc0e743d74fea40", - "81bf40a666b874882a96f6a64578ca27e40278c412e01807d6dada2d856c7723", - "e75613daf831f58890808e3dd61c2e7221fda00e2a7bcc1a546e49a26a71f966", - "7b366091049e776979ae6dd586d8871a8223aac654af158098591b099deb0f6e", - "a84c52b8cbe1588c60695974364582d15975150f11a745f22743fbb40fb13713", - "9e1423252db32ef48e92eddedb8bc794ac658b3842b7cca62e8a88e81f32a54d", - "2acedc0f2c2d81b5043e405483072809ceb13069184634576fb6ed2ce498b000", - "5ea9f20a8ab57bf633bc3523b66a4406a776028fada72d01b317625b880062eb", - "e2dc684649317bdb9b99133f59b37662e41f628b12b1d68088813a9c8fee9e20", - "3e970bc7a0ed67dee71c5373c971ec9149bfb3efa45f51c82b55f5707fa16d30", - "dda11777b17407ceec4037ce3878abae198fa7a5793a50b5e5a84b4f96f274da", - "2048c6542a7dcd7cd49fc2e62e6e0abb869ad6e9d3360a9a4da28c1779c08136", - "7431f819a18569984836fb116e48ec3566dcd30d4f4d650dbc0333decd1e5fc3", - "972c1976eedb72ef88f452408dde8fddf37ab5dfc5d43e5083338ebfb0a64e13", - "1cd838f51378d751a7af2e50fc4c3c286ec4d0be8273c3b3f9495bac2df58543", - "418f69fa62907604f7e21b06043ceaef60432668873af0440c338ff0a641cd7e", - "c1ec7094bed260c3ad08bc32cd1328331b8a5d4a7b34066c42d580d2f171374c", - "e3dd2c53bfce43cb909b7b41271b8319c21e6cad817124e2a83a4382c2c6232c", - "1e3e4a56fd60b2ccc3ce5ada2ba34493b317b3f32db25dbf881ef33ea2fff735", - "c5a990c4fa4e29515d603b1a3eb56e576f72439afb345fd74848ebb793af8bfa", - "4438adb56bd037e7062d11699a81b44da2c88a779ea0dd7ee0d9a6ba856ca5ea", - "1967c67972311c56a85a0cc89771d03fd91909722b40dce948191ed28af0f7d2", - "5685738e7e994095d9b6573df0e628b9c89d36e4d1e59d52b8c21f2992ca7423", - "4d01415ea6aa993e3b8864375f5b83f0bf146bf32024a6355a3cc96bd8df0be0", - "ed3797825453120b7190a85473644232608fb7386e369533a9dd960e911ed0f8", - "2e5854d4312f3b29f5d8c0165b0ff36c87bff9e8a4c601dd578471a6f5c5a540", - "f6a713855e9bda429e150d9f17579c138cb7fe247bf9605b7d0f05bb65187759", - "6044acdfd707da217cff278e9f37cd13221b0d1f1c8b119a84994678f17f3138", - "618f90a52d4bfb4642a348c91d69a5d9cffd5653ed8c75500b3acb64708be714", - "634410eb48809d2e79af6fb079aa0b0e78a5f918736ba58a2bbd1e244cb967fc", - "d06b4475cd892770f9d5b1172c0febdf108c0346d054f225c56c389e764fb406", - "658b6260c44b1668e44435552190a8c34db2d8a562284ccfcbdbed98dadfe0f2", - "58984db9314f35255e0796f9cdd922f598405a27b69ebf7269ae18d87db53edb", - "ed099b75a2cd49e561b87bb0129b8870e5ec571305b6a650740ae68ae8588529", - "8686700d98cf50c57cdc37bb17201d9721c29f49a51e47888721b47e828c4e40", - "734f3dd201c031ec6b1ff5e0f0ff90cb9dd0262bc0b49e3e0262123a5848fe73", - "226989f41f8ffc6cf81cf6415bf32b8a910efa3c2526bfb3c632452a0a4304d1", - "93fcd311305a21a3f916c32b00d657aed8388008d48a882182131907fd240d37", - "860734edf6e1fe6fd532e12673dc65fe9cd2475cdd4d6e19ea41de93546c2756", - "640a8b29065b1a9b8fd5af63dec7a1dc5f5e400d17809b992e32744160fc0da8", - "1a54bea5f87bc651a81935ad430c3f0956ce149d0208b84156c4ac54665719f7", - "4519ac3977ebd2439da2c9019b62f1056f5c9369b4a85aa222e9c205030d0273", - "8e8980b2f76ae74edffd5a4974d6564fd1b5a121b2d786164667dd223a8f0aad", - "45859173a70288efd88d20bda12ee9c062e02fda5475595d2385fd54c370fc50", - "b5da8d8978f0a0f11426dacc58548cd0275577d768abd59c1813ac76ecfba462", - "f87d20c80f2f1f796f9493b6009cf7ca102c0bd12004657b192f5ce0706a95ec", - "fa1ba1d1acf9b7680102a1bdd1ee835a4bb7dd8e53ebd89e510fb124e4b8cd0c", - "69f0857f0e335836e0fc84a77f1f74000f4b54210cd289c404465aa5b971d479", - "2267cdec8bdd409678e847a53e5015f952ff93932ef5b658d638040187950760", - "a5b679c138656c5960b196d5955cf371879aa3c3e90b0e86f05d2e1964e4ab08", - "cfc52e22f47b6491d5c581fe6c04f33cb15c64069280b8e81071b6b02e8214f7", - "7aa4c3bef59b3ec221d89d96cfad561bee62813b59d6675e00bc9f5e59b7ecf9", - "25c450660e2787e9b72ec396759b1b2495d3255c47e4007f623969201b69bdef", - "58bf979a47109114122dbe1fed76b97b413238bab28654ab55f3e1ff4be4a317", - "e746161e2a434286e97e7329d516474d815ddf11f79e14af78034594d705a15f", - "f5a8b1d63066744d339dfbf1cf5914aaaa1177e12c87b617f51830c3025c4fe6", - "a82a841233862d355ce7613d6dba4f70ef44677b405ab61d1383e32bd61e760a", - "dfb9f743c325258511c1a834c5f7750ca26ef8e24110650e921aee5f144c3e6e", - "084ffdaa79bb1c2bcc9256598caf5f5abbf00a8ca06ff22180783179eb3e776f", - "789d79a0e408dc07a357f1995cc3b6596321c9af5479cffcfd07c0839949c9c8", - "22582462801bce7f27e10d52e18f82fe86f89d165957f93e04c72afc3a3b580b", - "4ba7a48e3ebfded74024add379f12f5eb2dfc800cda6fc1ccc1faa14e36131f2", - "94b033de8d1c01b44973eab74932c08c965e0fe0a94f340610714bd8171ed865", - "d0cdad6778c1e53cb986e599ea15f6e3504638d2cfec6670c994d56222cc4313", - "25b02823405d73f373e4fa5db5e56d37bc20a5d742d339ca151a3d6d34f23371", - "f3dacc85b6c12fe23de7b06334ec3e988a688c710c3f94913629de3debe587bb", - "c5d36ef32c84add0dcb8145217a1ae44b7b5dc7f8e1badd6eef46dbddcf70a6d", - "85adb069b0aab11b37db25287e11ddaa6c2786c9cf310a76600dbbce71ae6de3", - "fdb1255f0dfab77cb0658d590a889f0d0a321e01a5ec05648418be228af06f6c", - "656316ca31c66c3a8b22c4cea225012af77d127f70580c3c82f1a4567e68a324", - "ae01cedb45fad98af3dd48440cd2c6d03ce29fe837772ee592e457d302f33e03", - "4bdc945f3824df69653a70a782f4b2cba5541d665e3f5cb67d53fbcb4611c832", - "ffc11e8a6002ebb2cc369ca8ca7e8572c19577a3d44463e11f9d3e82732f593b", - "e193182166dab3a14007837cc22f35cdbfcc7e21626afe07b726f7fd6e3e982e", - "f473213243b0b1fbd88ec8c52e6c7b907b29ef6d8e40a04e53e37a77bc874087", - "3652966d4a6b6bf5d7db07d3a4a70f4295e7e0faf200b15e16d457a599e3c1b1", - "73de91168b6ad194118957317fd07e04e59fc773e09d868322ef4c13d37ece17", - "4b935d9139c50de380337f15e82f1575608357165816890fe40d15333d698d1d", - "83f06d816fd2b7b3b15586d8b0f2167af61dbcc9d2fa1806d4a11d46dd6a0be0", - "d488e72095cd6585225329b0968f35d3c92aad1c730e85f204dcd5785137c446", - "9c115386d83dfe0a19b22151e5c487600cf17695e89103530b613b021f1e62c7", - "d73e3d1d1568bdd8ee681cbf9f7040148f90e8f366b8db27d0db01d125bf7646", - "f85b0866d5c5e76d9e909c417e1a7f2633f5dc4bfb702165d07605b3458478f2", - "c400c1367f55a77c3cd11c88b7fd466e9231e1576ae9f48d70e5ff1f2dae3648", - "08ae2d048ac642fbd7232112c021f30ce7046224e886db395160024d561626f5", - "61b77424a268068726822ce060ecbe5b74ec9354ae76474ebe99412e508b7e72", - "c8d66b7c79fd40d84dba050b19f8533d41cc0d2def601c374d8e965e97516fc0", - "c3ec36c54e81f434bff28ffbaff4be94d0f920dd19a4430cb359f14be371272c", - "d2842e4bf2e6aa486f115771ced23b1bb48a8e71539412f3e5f95bb6cbd9478a", - "8b4b19dee18cafc32041c30e8104da306cad7c4869fef4403f73fcd626667a84", - "3113ebe7753342420de260034396b5dfbd218dde361810aedbeae0964847a0b8", - "0a0fb0f063cfca1deb44cf609e41bb1f170b1dc862f564029b6043633250a8ff", - "4b639076d240ce76f7ccf8573248e73712967621b9a3f7a918991812e3dd0341", - "603b0d7e3822ee97c39f7541fac0b0bbf8ca9c881fdfeee34cdadadc24f0362e", - "62c0ffbe3746da28618a02cc7d1342339cc95a992eea23299de4efe24900e0a8", - "2a091e331eb695a9ea44707892e8a110ea556c1e22a9c733581667d0aa2eeb75", - "56a4b87ef0a9c62f9fec5ac5a45eb65eb1666ea147ef05830e03807ceca16d88", - "b05856005d81df889bee39e293270c7b2b6c07a1680dbc11fba2b71427d1b89a", - "8cf053d110768e8a16bcc42de498a6bd39d4556e09f76a00683bc987c551ad39", - "974f44f4079998c8d1d3fa7a998cd6d8a729c720b7ce7b95ff5b1736814e3030", - "7515c9c32669f73d2aea36745936ccaec2773a8ddbdfeb0b7f752faf6150dbdc", - "7cdf2c703dae8804a1317953294433fad84fefebdf266b401ce411e8ab466404", - "d50f4574071b1d7e748e9aa1ceaa01deeeebc6a4afc02c9170d9ec73245d8175", - "17e06b3f2e578779e93ff2c9f54b68d83f8e6d6d07f0a55e43b582a9723eae13", - "2e145db8d098c5bdcb8d126e079e07a7af7361625cc733de29e8e369ff368252", - "20a1006b9492900c6dd6ad5676fd0607cd1467878cbbbc305abbcc9c4bab9e71", - "621ebc5c50fcaf5e563c836708b69e23c463474260563471678599740bfb0c0c", - "7d642362f659a8f536a18e251ff37d8cb4f954d5c04714840fdbc25d90cdbf08", - "481dac02dd45a98bd7bf78fdfa2150f35eb1703f144a0bfa866497bd61dd7611", - "71f6983e6c69fea8d24e73d3730716c9698d14c5a16a4f32741cefdab8c11d3a", - "deec607a1164a9fc4e92c020a8d0768f60bfe926712975617005938d92618d0c", - "cda4b2b47bf3ad9d2133d7df2b22d92bc84a4e072c47e27097b7f829d6aecd39", - "dd4b0bb548476aff202f6ee9e7cce0102937bae843143802b35054b52edc78eb", - "c66411f80a059df7f2ee488d23a00d0f81d9149ddeae20fd44cdfc9242aff5e4", - "b46493e8accf415b8a46942a0c3a8c5b9fdd0dc03e31c75031f0671e2aa1e34d", - "ce70aa548d57eba8dd6937723d70a087cf8e16f4e2e3adc5cfa2bcaa8ce85ed4", - "4043bc7b9b08743a24ed6fd467a81694690fd56f8dd2f261c3b78d3b6de19a0a", - "bb25ddefb18066f1da201d09d5dc5fc6e6bf0f28c7003c768663e5afae349ad0", - "5cf5c0630a8b17232bfc01b879d229acdc1cd4fc2bc8375e0e504c4f10773788", - "1dc9d4c789663d381607970a93937cc38d9db3313dd7e5656aa9463198671271", - "8093f1a033c26f5aca511a889ffa23e19d02322e23f92fcf24ded5179f4b6fef", - "265ab9c6623240d4e1f5c2b7586cbbe68c212f03b50af0e9e1944a2da35bc5fe", - "b66fc3a7668b155845596dd14139e3a3dad6faf3b18f0d12455d427bbf09e82a", - "fa86fd8cb67584b3958a59ad7c3c5699715a1d76b8c79ca094e32fae595c56fe", - "2bc1ca6e11c9b3892026aa2845332bf4feb4e1130018c8c919e0be2217825d7a", - "df9ece3e6ef8741ed44e1cc6e81f190503018ca3c0dab0e371d4802db05638c2", - "a06af70d0dccd47eb8151bc4bc4685912fdb4c12a9dfbc03fb12fe8eae428ab7", - "99c9cf1f42421071ca21312a05cfe2a1bd5c7cc45ada2b6aa28943942833aded", - "df935b9a42f299bc1b4ce4ec578121e2514933ca1b58ce1b20e557a7994ea248", - "2c3b2a1d49538d68dfb9cf56c066e6af6d0189b06ce22a17484bb4d37b93a5b1", - "3cc8a9690be4131238a484e6fb5e43293ae50b2e6211462df0e0b3592aae1d74", - "a0e026e989d195f8099537961ee0112bc82e17162506bd2d43453f51ea240e8c", - "f43ea6616dbf77187f371954d8d65a7c6c21b00a4beca13c4b42a83242ebeb68", - "374375f5844fa652029e36aaaee6a0dad44ee0ddd61d7113dd0996eea8655e63", - "287c268a5a00c9dca3cac8de37153eacb8eaabe5422a96b9962690ea6475039d", - "7a45cc68d634b2ff16fea233f29e13404896d4323ff659be5550078b4667be46", - "60857bbabb8fd1c196ff7ef7ab64e7380711a9e81bc2763d31880074d8bf8a12", - "d1f3a65c858ef773b88c18ad9d575d95ce72ac0f9c81133dad480b5733db94e1", - "9353404ce4395cb944e61f90bbd12e58f700134193467e500e5ae20f235f5c75", - "97643f3cc881cfd09e0a6fde67be1de48fb78ac618f1ba276c09a13f640b654b", - "e2ddadca9880d21bc78d1d9310c23d73905315da6cba1db1c913cc630d654aee", - "5972d33e5c610d47409aab2311b117d77ed5dbaac12e2f1770c6fece77e8c6c0", - "949d5672a6dedae245db457b6163e8fc9d5d3294624db52ca7ecda91f6f6b91b", - "6611f4bd2a1162f090030659745093b10d2f8d55d98804c5a5c925d10794384b", - "9b7a82fc6dc4e52217ff9ff4d3963f227a53beedf7433c41486eda482f83d34a", - "0e07aaebe38f580ed25da7cb03b8e18f385f25f3bb5fdb9f8acab4f8f41d1bae", - "dad97657528dff4f46ef116fe41818ffee6934cc03ce21bc493afb5ed6564c18", - "a7ad17e55b7f149fd94fd7537934e4e9b856581e6db7e3f387d4749c10c13c30", - "1c8e3f09c898bf7c505b1ed369a10b7d625911bafd84641e122bc310d42a0673", - "5c87be422fe2dc51017706110d71bd0585603e8cc963421e7c19608f2616e9bd", - "c2d464f61c7f696492ef1e1f5c794787620c4a309051eaa9d1139e03bb1b534c", - "43c13fcb3435b7644804f7dbb4c2ed5168b06d7a0f284bed201d67825a939365", - "40b96350e95a2b580305e8e5a4dddc769dab28a5cce2ae3175f25e0124eafeeb", - "5e3bb70f29f2ec40171c2b7c1490ac047de300812a694c6905f041431bd1e8a4", - "220e9306d6441686a7a99cda569885537f96d1aeea09060909ca760b5fd8b92f", - "5f036c2731b32a7eac4de982f82566b1333eff9c8227ecd9012d1fa76dfcbe65", - "bd511e9b02fe41da12c2b065d1bd0374586f46f2fb09364199569f596644b33f", - "95e3cff495090dfc482d3cde43108a894a4666fb5f08d81ed0af67672f78c416", - "14efdca270cf81217a4d3d668b9a022a754ace9b310d265e1a3e5f1e243761fe", - "3c85d7a4150b741ee20f2afa203b9f575cc6dd6055288a0d07380f7ce041cd63", - "2d63c2c06a92d01e29c55ea401a10f0a1112e57295fdf2bf7d58924519b60c30", - "1a94ffe9cefdddb26aad3e05e4fade543efa167b64722fcbca29a221df9a88d0", - "4336b845e70d691bf038596daf1c972f181535e134b816106ba0bb24f21ee95b", - "42adcd45a8cb0ea99cf5c9a3cbb3709e4929556760defa2f44b565a25914aa6b", - "52b054431d358f28d65f8aa1d51c5246736d3a7a43efd8f5bd3e8041ae1a084d", - "b01fc599c4c8685fbb623b3adb5c146774faf6301a5b02205202a505a5d495d2", - "721415858062dc4cb8edb5235ad0268d0f42261a73fab41ab00c5f3ea0d2cb10", - "9939f93e56ce12bbfb82da5c5f4a4d3923f07102734f0c8a2933aa291087e6f4", - "82c7e725643e0fd9dd73fd6a1c6f9edbd0c23ae115c75cdaffd2d04586207ab8", - "2798d14a3ac840ff86c67550f96724f30cf72d57f147603fc6e6a47eb4cdce64", - "c58e73a750044451f9fb8d94b778e48cad0c49cbe66b007fab4dc2837865352d", - "f16b4c0f13f73291090b71857877739cfa07a80100b23246c941fd3ab33eb157", - "5fa1f15b3217911639b725abf7a814c4e830227407159a8fffa3153212eb3825", - "35ef51f09b38c4fafcc80ee40d442290aeb7d6753ea338a4275e6950974a562d", - "3a312e054508a3a74ae5bba38b3acd5ec5880ad6b21e8973f6fafe57efa91a8f", - "5b2924a682cde183fcd4e251f51a4f97e175da9f7b947d66a78e78c9a749397a", - "5e6ba52ccc942c87e5796bdfd004d9f778a124080f22d79aa78bffca9da006a3", - "962958b9121eef571e9c95f2751a7e026389822c5450794b3745823715809101", - "9c561ed1cb20b92b3200e6a7c9d591ae481001db186cd1117dd39ab942367bd3", - "aff735591d88a92b040aa9641e239a811d607b0f0178e0fa242f73895575d015", - "94b4d36a59a6e0fe1a4c0867b11f7b0605ac7ab638340d951afc4b3b0d5e7851", - "83877cb5be3dfa47d25149ec3cb5fc156ad7af3b4c7fb82ba616636701c395f8", - "0b01e4ef89c04324d81fd22246470d02b96ce4aee837a25f8f99f342603c383c", - "83f9fbf84acc0801fa0e662d306480cf8b0f1abf953ab701c900a25859ecfcc6", - "661342f3bb267876415bad99efe8c5cd7906588358e7f45048459dfdc817bdf0", - "9d510e15f73f644dff74adef58ff0639a79b3775d1c03c4e877031b634037ec4", - "1836b91258992b47df59a071b661b427be324ec77aae7322886f91a78b0e37f5", - "b401f330b3a78707e8bb5f202bb7a13739db4153cf18d95c3bbc4d62133b0a3a", - "30053e7594a631536fbbda44768f3d0748ffbc41930c24f734f5b1b29bde1eb7", - "eaf89d78ba6cb53f1735d081aedc0bbf8c32fa69d6f2bb239a8c3c76421ad7ea", - "ed63d3c253187e0450b4b746b25057438bfc4838c4c38bc830148375aeb41719", - "26cadcee7f2825babc229215c067ca6b07c569fadd063b12728ca141c2718a44", - "3a40797845ae3b29e047580d0ea9629fbb9a5f732e965f78802566856413f3f4", - "7705b573b347a4fe4016aa45e75d6e99c206bf9a75db6a7280384397a3e01801", - "7cb6066a4fe12e93bc78a1cc08f70a370b7b51dc13906b176a5aae1742544d8a", - "a63ce61fc1c189a9a7db28c448c349a258cf5e381ec9ba9e3b7ee1add2e7e39b", - "9456119f9be83d4b393f36dc4c49ea4064828667476911b6b4024b69a7fdf1c4", - "94f28930e664267a7a5170ccb6007933ca30634540aac3c9c5978ec4a1477f9a", - "6a28310adb68b93da7890f20dfe30a784e2feaf06d88e62961d47bba9c94d8d4", - "f73d88e1d1a5c058bf4f578e10d1772be5234b086e7528a5229ce89e7e8e045d", - "50478fe98ebfa1d65c98db81674109fc62db20903ccaae87c710aa80d6a98d47", - "910fcc306305446e88170dd75d88e84bb5b85fe9e261c62d497ad7df055e1dd5", - "f716811267e7f9bc84c3103c8103f6d638a744b1ebb514b8177ecb8ee71a653d", - "5cfcbdefe7fd451cbf4303910126a7c907f722d5416aee96ac6f258103418620", - "28d3594235f3660fe2eb536dcdba912acd2435afe727da0f33f630b42f3c8ce1", - "a1590b3ca93db3c52b6e9122e552f672c9e820f9817fcb5b6124bf716597e87a", - "13de8aa2f1308d8c821c7a7454d712b711fc927a6ef793200f1528e385221b49", - "fd3e605c2ee73500b19414a03ec0ffd88f54982b0cfc0de1682a0b714bfd7819", - "0e13e8064748f810a3a9d86c44553ce30bb82e2651c0d91e28f4e749b44f4db7", - "9712418a6a4baecd41f241800203cf22e6db41d3fc4cb2f919bcf48c8139c6e2", - "4b125e9687180e7d04436fd0a437d94263dd6b17a19cc572715c83b52a5cd648", - "6acfbb85dfb227aa80757d4a5765d3914a53d6a757bdf6aff9cc37dd079ff236", - "383787de6bed87fc4e51b3aa0c6a18cecec278d8b7e4b7c00002930fcd3599a8", - "4c4587baa37102130058d08a353f2ff56cadb9c5cd0aa46d042067316f465e7c", - "9ec918525057f08bc585081e89a98af4668c80223f55932c43ce9ee649f35ea5", - "5abd75b825b92d7144c1af8e63d0565fec6c363413c447931a5e766edb378a69", - "952f1f6f68fac8e71c2f43e633fef64d6d62211486d8f30dc2d9e6dfcef168d4", - "a935150ea08dec24e4814ec0c2035139c1d5849a68a677c6468f30cb0fc6a3d6", - "8c8cfa020d011f57a64a5df1ce9d615ad1ee1bf08851a92b158223e5142c0c2d", - "ec85e45d4e2dbca821f35358770065b8ad311b862b888fa9c5617d56d4aea523", - "5cd40dcaeb951ef072a066116003ba88df939b7b70c8359c9b51afee42c36ab4", - "59bbfe8a89cef2ee55405e0190955b61923170e131c591376fd0e3f5a1b72db3", - "ca5d61372b329bbacf7968073c0b20ab3ccc817cdfeaf352e36f51dc4eaef35f", - "d3713589ee04ce5565793994a14ab6557c1f5eba6d5b98619354a29f275ce65c", - "f2933eb81d0e6f65c33a5dfc04e5d867fae7050c7d33588c21787d2cb2419344", - "033e4751f517212e9ec764b3549014843ad0a3289705a69b840ab388afbd5190", - "6b3eab01948b98f0907689bc9f444f7f782fa767f182cc2fd83b8d654ef6ac8e", - "112f7f9e835edf8af986189ae123ca6c42b4ad8f9948416a08ab4fecdaf128ec", - "fee2aa8fef1bb972845f5ab5962750824f94ab630469898ca8d704999302f8e4", - "b203e19616a01268f6977a7d3a92441b9dfd1987fe0d24c77be2ee6411797d97", - "a07f6e21a691f889cc24d53f1b2458292dbffdfcd8813aad52d76db792761207", - "9c877381bb22afb2321d1bb6b399c72f83849092be684e20d30a6524db8c4482", - "eec99c56e60ecbd0642c0c6c73fca1ece26efa0c5d3f98da2f0ec2c98b406d25", - "03be57c24917496491a5218a55d980a3844590636a88af8b47f8212c92165ac6", - "54be2598b44808322a54ede28f60ec6979a52139de21d592af6854722e19d345", - "cdcda7001ff0a2d8fdb85d5b1374b00b3cd4e7c0c2eb9d6071fbd2db04890719", - "f26e1d62bb775791df45df58f3983b57ffa79b5ac26ae9a50b9a46b2974bfab3", - "b04f432582682061d139646bbb9e93bcdb7619a174d3d489176327adfce3a6b8", - "4c480cddb5971dd4cee869c8faf06c362f7ce052158b1c7ecc80eadf7408755a", - "5235f475242c00424bab2aacb7c8bcf04770a7f805198946ade6e993d3fc9650", - "bb65f8b14be50a455d951360e546579e4f4cf95176920e362e95725d881b50fa", - "f2d85ab69b53ffd7b0f8e2552a320333997c3677ef2fd5717556333e7113db58", - "c839b77701aa91d7ccadc05eec8c8a659c8c3b2d9d7c9bca2e70b49b1cd88092", - "19e5235372be257edfa41a559a0a607c4fabbb55b36733aa872fcc31e504525e", - "e4ee51c5a87cd0eb83bb91703920fdd23b8dc2d282668acfc09a373bd057e0b8", - "381e69f103da82848ec275d6d8381df0408ecccd766ac8f8d5b2e8751cf57c13", - "6208389f3f6c356cb67a514f79ed79c9690b53a451691db0ba990de5f59a1184", - "df278197866c6bb6ad9aecd2d2706cad6a8e38e42c33598c5593104c08f6b27e", - "589ad320999bb774eefe96301add849f840a1fbcc357e626b4a5af0359360bbb", - "a66815de47d5bd69d9e09bb9f0e75aeb4c52f92d32eba9c7b0b482ea384ace50", - "a447e00ef3ee92e1bdbc7b4b6158e7d51faebda08bc33e1631ad007a34298f73", - "d92865685522999a8aff83cc52c23baf401a9ecf3ac335f0fc5303608c8d754d", - "5a00636b0e7751865896a0c3ff320ec2a32cc9e92eacf12c829eb915eac229fd", - "483211a9ce6f998e53ac9c92c05ff018dba3cd7377e7f9370142b81d03a54e12", - "cad09c27d025984b7559d8e6e97879a426a59320d9ff1f3f519acd9fc33e83d0", - "481560d8004647260370c9c5fea48c8b158b6c2615d3195e4a5a3a30994218e7", - "c4a19f967196c953922475e4de13a61ad3221369405d70e17cfef5a1cc1c0b81", - "36fc8d7770ad06ad756bbb7080be0a860c0cfe8d72312a6377c0f979ae19ee14", - "bbe64f4bfb0da9e009f7cb5c9544a2b1f6fed6a3b19b2f7ae2e11492beaec191", - "d9940e5667f2ce8fe2fb8bf2444e5ec375c94460d85c2535c3ad77ba4e060295", - "e5387fd5b88283abe18c9847ffc0e9974fc5265002efd2235d59dd0b12e9755e", - "e8ea39d4e3ccb194c509efce90af26fb6872f75fae9dc1889d9b9cdf6b8c502f", - "0b7f8f9b0d0d26308a90322c83b59cc4702ae0c8de5cd059f341acff76c76b08", - "44aaf9e53d635f560a1091c258dfe7396bcb9af93ffda13425b549193ab0d096", - "115897b4b111a885468d6a6d85a2acca15b7c8864ea81aa6c921fa167bda35a5", - "0f91372d5c0b0bcf9fdd99ccbb5af7a1c5ee4e33b862c24afff7729ca0fc7221", - "fa6428aaff5c543b50d2e9ecc79a8ed0d65b2afa8a650d3828fd0bc6c540fbfd", - "228a4a27f3baa4c99956ff8c6f23e95a461ea30b950a89b682a6afe257a7e787", - "bd6df97c4b230f01036bb998d418c7de5ffc270554ca0e7068a72118c0028717", - "b7e4ea97c67c1ae8edd123463a3ad56f0cf118cad77b495d9477d7c611c1c5e5", - "0b74934c1e1470bfc5318ccc570cc843623f608691a002e6f71f43403ef69b83", - "48bd2cb5bedf368bc0dbb9991ab513a19f14fbc5f44772c873347343e73e23d6", - "8f6b6b91ca6d01eeb235bf5faea0a567e9445c4b3352744108d20a25515db125", - "05e6689a2134c70199fd9b756d6702108a78c7f75c75d4ffab151b2e26cb4072", - "c12d8c62c2aa39925d7477ee2d303a8ff1b71af1ba906a44228b24d56ed98855", - "5415f931b7cc19c7d331b79770db089890d794d49a825e31fbde33c0abdd40e1", - "a68bd34eb58a3c6279dd907c644e5cee8ea2e7938a876510d776805765c34966", - "1966fa514a34423347626cd25ee4dd9b97ebcde7f77689ebfa433642844a5dca", - "4f5700c8acec800e3fce5b0cdc03041507366351a28606c957c581ffde9e31b7", - "81467c1a740f22172d233b75046f6552507feeb61641e77ab24edf3e727c9192", - "65f3ed3715a0d0e98b8045b610b71b521f76f82f614cded21472b1ee20792131", - "8e0927a5ffbebffaa5bfdb18593e71e313d003fa399b1adcb4a2a4bb40edc1ab", - "1f9f59bdf208b0cd3c4dd968ee238caab576c709e269f7e69ebd6f235f346b6b", - "a88fc36f098b8e5217d74670dd81e3da6420946d4d36816d9edc7d94deea1cad", - "2e3da3152b3effd6978a2f672bcf6056d8325356973d1ea94ad817382637896b", - "95c41001b295de34e5427b45a8f4446f9d17a264dd2d3de5b7781f0dfd83eb3d", - "91778339e5022781c8aa7bbce64b88a4e5be636400a04035c3a4f09bae1ec012", - "5322beb1016222bf204eb68f0b2cdc2d7bcc352136bdb1059a2f1d7f43f32dca", - "5a82585f10349ae91ec7778d1e296eb15e63285bf85bf9eac1481101813e69de", - "7a812c81b5db2e56a63e501d05350465a41458787aa89bcb409996a29009c0af", - "9697438001c69117ba26495c2c7a510ab3e37f2dfb42cacaff909cb46ef4b1d8", - "a47a274775eb0980b13c309aad94edeeb4fb9204970370f8a2d2750b400bf112", - "ca47022fce31d7056921b872fda891c981f64aa710f02f3e0d9d4aab5319583f", - "9bdec12d3984b04ffae1a3745c87240f34f9941faa195c07888699f93b2590f6", - "5ac3252702be89c386e3f96c2f3f0331fa1c2af174a8b92539494f9a56f44d5b", - "514a1d03761e38182e4bb107839fd4e64b91a32a4bdaa9e4ccdefc72342d6d75", - "0d72bc77ccc1398f2bb273df5eeecbf912f8f56da6a9e2e700b766fe101e1626", - "532b1da421a9d61074256de55ff4475d472e9ec0187f774e6aa0deed092fea20", - "7d257206ae63b609e463c24cae5e645352009996f616e9bc7701c840eb22c8f8", - "9f5250e727af1d3139365d6c59021a9c09d4d7594ff88c2ba16f333fc5d09cce", - "77b738132fe2931c4d58ecda88ad5d6c1258705e68adc9b14a6bdc6536739774", - "ecec593e20b1cae5e32baba22c0bb56c19ffedd993e4d7da33d057c8cbf9828f", - "76c0f434a9cbc99b9b8d9b4cb6f5ecde287b80543775806b1b54d82460fbccfc", - "bb61a0c5072cd80f7a277d93510298ddec68a3a17fdb9116b8eb116ecdffde03", - "04a34181b55804b33d663690f3485064434083b9e94147c3bb776ae7f1a2c82c", - "69370a01be554ea7b20782aec8f7e6217c0ddf4b15eeeab11208cac0682ba67f", - "915d99fc249be606bec9532fa793bd328869db648a1bbf79fe5f7ea3f266de02", - "8f48b97bfd5fc592d2d35a99f69fbf484418baa32925e390caac878c1e41bdb6", - "01755c405575fc45a6ca8831ba2c54129b1b3472f0d8515820d7f3c19d5d6dba", - "253b1d3339d0c34ac60b9480f50cc193aa11b98907d3c421a8c122b43880919e", - "89b828563953fadeced7c2f8235c1fd1a78e4e65f2977d7eefd480f1ea90680d", - "2a1970e0f1844486637a1d22b6933b480cd1a8f2c5ffcbb3088ce84aca7122c7", - "c6b416c90756cc7fd4332fdb63a97581e0c446b873ce46a89d3d71f35ac4f843", - "b678042e801b3b79baffb2135f294389a8eb0db4c7dc5bb84201c1af5d06cf1f", - "a744c07f0952d4bb7e920ba0bf3090eb8685034db507b3597f8cbba60e63cdd1", - "4880d8b11a4e8a5711d5f4855c167e31af7339e185b44ffb4f04563bfb2816c8", - "0429fd916f470fd8fc7b8b2af5cdd32bddab5d11ff829d431e3bb5a345f6282b", - "be2675cf26be91af1e580f18409efbd2f4116623177fdf1aef1efdc68113883c", - "c45341c6a53620ecb61aa09bd479e485d2310afb7aeddd8ca46a15627f50a0ea", - "3cbdf09417050a8965b5799e4eb53540c439c0b59a5c15967325ef9431487fef", - "3937926a689683a60550dd622d0e801a5b87a4a4090224564190bc745570fdb7", - "ba19441890b4cc97893fbbde574d58032b3d353a2c216193b49b6a94c7ae074e", - "6f005fdaecde1ba3240a00d52feac616bb1baf07bcb4e42a44940f40dc265763", - "f1980f996f5787d20fe4d09cdb8347351ffa2ac0aee67fa5b953f60ce53bdaa1", - "7f44458b0e42cd4b58183ea6a23316ab7379901f20ea7d3acbfcbabe16ece87b", - "6d07c265d520df1d70a80b79ef9e9c22896272141500b49fb0b2a26ca45e31d8", - "d419600795813e99aecfc041806a95f77aefc7f125c46fdf02e2dbdc0215676c", - "51d972ca88ebe9db4efeda4c5ad73910c0deea38d8371bd8f042a3081be03b64", - "dbef5eed6754f0757710ebf00fdd715d90eb097311e834f8e9633dea5c3c03ce", - "0b59c795958e7494f4229f42f10410a5bcb0e212a0fa8c4acd5d4e6dc936b844", - "a06c0bb4d6b8ceae254fa96908d14d17f18fb405b96cd9bedf67243ebddef3ac", - "803eeb8fd16dab0ed28ff6bdb5262fe1ecf91b139543f1fc415b1fce6d2c7564", - "dad4147a6c7c2649614a7be4bf759801cb1ff4a6b3cd8eb1a188a43dd12adfd6", - "1a176be04969a4c8481da63ca15a5fd5dd48c5dbb7b0206767c0fe99ed595647", - "20b9c363b166d90cdfc5ea9b69bfcde2f2b80d27daea5ac26ab9faf70705679b", - "ce3d6c16c67bf10df9e94ea502de902fa10ee2fdb1ffd322cd70e4988fb3ea47", - "01f2931966071fa6341cf4ad49c5e6f89ce251927015aa404b0445dc0425ff77", - "7dc2adaa02d5767df1f34bb43e9a66032db347d0db01d4769a969d29e49ec236", - "8f9415d32f9e3d8b09975fd88e8e80439e5b41b92719852293610024fcc5cdac", - "f6d25e25bb2d24536da9cd6c97c7f98bb980e4c05328a3ef92d1e2ec02b0620e", - "7ed22586906df8cd353ea79a9db2332f662877e475cc168b91e407af926cfc3c", - "8e1c9f3a458444ed65451cee81edf8ac748afc436f5faea5264bfd970cd1e643", - "13ad1d0912fa8cd85c0c9955e540b4ae16b3f408b526dd123183f34f96aedd03", - "10da9a4e2da3cbdce94922d52c30bca880775f069d25bcd05bdbf43d09cca376", - "e13c49ea716aa00f75473611ca890c76dba603a2f8ca3b13823f01716d177b1d", - "372c82b2c9550ef803a6a8e13ded862438781eb673acdf2636e6e0123b9abb33", - "1e98fe831e2d9cf2fc7d1b191b7d18386516b8a924e48e7d3e93fee650c5baaf", - "d352b78d78a65a9cbd31d149c45ebee10b13fc06bf91da5b7e1ac7ad9ba7bba8", - "2636fb01166e9fc1bacdac4d13ec50da3dca71a751e5613cceff3e09c122f18f", - "770cd6d0885003767bacca2125add9051b9661e60888bd23b5c62ce440bad10a", - "046573c9b081699ee4b2906bdeb3818999ba2b4eed0cc0de42cf8f6590f9a9a9", - "e0f930c098354c682d21316e32439f2feea8aec25403e696d6c6a455640f39c5", - "222c3f02de588c3552f1260313b0413dcb5831fcad61f7e197c39d0a8d2fe0f9", - "287a6441289e172b157baffd4c67e462a029b82977d13724417a111b85895069", - "2f90d11e3c4cf25c6508010f90cbc4ea789fe90137b3dda5450cfd76bfaa2cd0", - "49170715b9d16c35d578b6035154601b7cca68775ab8abd7475de5c32f979f17", - "68b4c27a34474de5ba233fdf2ff544592f3086294e740f3c5a0343275e31e1fd", - "ef7ea92aea9bae8298abfbcf8868e7564c97b30bbfd4cd4f3231af15bf1c0317", - "fc0343f8b9805aab9925445b3ffe0db0d64c657487fc88582832c5068bbcdd7d", - "bb142131990a192edc5674e08b97da4c5e1c6fb9e17d7feaca7e41ef84dde329", - "9d9e949edb6b2f4395449eb08fcfe5edf4afaed44534bd4e3774aed81afbfca7", - "4c43f6786890663197d6e20d5d7518445487228e4cce6ad14fa7f9ec45814302", - "c8561cc8618dbcd15079a1d459a528d01af1800dc3950e6ede7aa59f9ef364c6", - "711513d96b78d380a69f622cdfcd254eb7cf13bcd92852c4bf20febbe7d49542", - "e8d1d3979a7b0367ddfdb5aa45e8a7544bd64d0b47ae348bed0e25d403fd1309", - "4ec558127463a5ae5a0e793a2422fa44cfd282f4437e72cda314773bf1904e86", - "d410cf7c7b4a1e15a93ff4d130e3926165a84f5f498b865504413963a25a747f", - "1900bc606da8aab7fa8681786011407ef496e3e867280fcb8257ec69fee13f23", - "2b77e02fa6a360ebeb39bbe40181a61bf46c534bf5e9f5979d8d5ddf3d040c53", - "a23a1ff7deb442ae282065ef8affd36d7fda08e4cc8aae4a9ec440ebbefd00f0", - "82ae3a653be9de1e6fee8c86dce73689d54bc1a06177acc3c44285aa7a252616", - "e7be12407b67c788b92550b89034614a32a3e35cc66c8f5ba4fb9a0f935e5013", - "f8895de2d6e5c48e85ae6dd2ec3a3a2f50efcfa4b12b429598caf33af4a9b9f1", - "c300ab2f9f94e140804359068871229ce1cf18baa9110e8ac738e354d707723a", - "14cda1d2acb56c6b6f6d7e921fb71a4184ba058539e943513ab0cdeb79fb5b28", - "5691c1a333d6136ac6564c9b332720334a2831ef8dcd0a7ee5b05aaa5571c8a8", - "ba8b72d117d6861fcff01af8f18f28c97273a9a03fc5a7b411a9c51c6046b8a5", - "0312b061103ae11bee0820c9d86fa82359e4c43ea8e00bd39072d42f27d68d48", - "44af5b099bf86d554f681f12a1fe8173b0f7cf1f7d866c8ed47d4be271360e68", - "8cfaebad5b0286e21b32d6db39ed27a84904d756c4c6b24f92064ac12aca07f3", - "1ae061399df309144bbc8186acd6ef3596fd7d37f00836e7654e33c1426ef59e", - "14f22f2633374ec4eb692797de00e65028671d86b08c9cf38d45eec29d439214", - "d014c0b5f913ce0fc83ab2cf066c749469adda1e89a0325d8ff1973372c7215e", - "cf6581f7515b74735149dbd4d732a6d7b1eb3c0cc45b70390afecc2ecf1f2312", - "83fc3bfc295482154f601d8504c480c2fae2d69dcc4a4f361f19ea64d5762373", - "d13630813a0ccb6b99f8717e105804103a9bfbb8d3cecb18be137ffe40db8c0e", - "114baeaa412156b09809b9a391399891227a49caacb9fe553d22d748c2f8b7fc", - "84a8292b94c38c3689f29050118d066e3670dad4ebb7999b471fdb23233a2d3b", - "9db757c4d3d8613a9ff96a5f1c72c7ce847769732bd90894a5e9501378f9e2d9", - "94ee8ddf45c7db6c1df4ffbcfc6b7e4f905efb7d1bc7602fef237d710b2cb721", - "f8d751aebd5e41e0e98f372255301e918e1203f0687bce355644ec1f67139026", - "e46df285d1b0f3d820cd882d3ec4bcf1eac09c0374c9c0194b6c4006fabbaff1", - "2db44835955ff344330fa5482e4db248af9d4df569018dfe665749e8a296ac8e", - "8070d0e793eea552e6b8361506d206b42e236746036928c7099e5881321b662a", - "e4f064dd0f2e7eb893229f7d2b5027253bc1fbc264b08d48aedf25e9292bb8ec", - "6117a0db14b0bf448a7fd0b41a918475a3f443d65412a4baa5dc4a2429eba166", - "1a1e6da1ced4b43f58ebfbc57ef8be425149525f101349973ee22f2a1e849670", - "7c203ea9383b88f76b4dfc0f9ce992055208d73495a97759cf36e79bdac153bf", - "b7dd936d56ad61338cdde634b2f0b0c0ffe5c225f4c471b9783a2f5615464933", - "053bcc57f394569bb1c8e564a5e75f40cee25f1f32eba81b76f05eeb97d0cf54", - "2da9830db8209476bef11862166e6fadb48b3c5d4d698ecbc880745f02c965da", - "b74e196ecb6fe19f9aed9f4b57ca51af6618aaff827bff32682c56a3c2fdb5e2", - "c0c06c177ab2068a1058180ad4ff65c6d6d6ec9cc8df83ca0e31a0683a3e00c0", - "26ee6f52ab40baa19375bb2beb1b2e2d4e064cbb248926a7d73884ba025a06b9", - "b6dac752a6ef2259ba54c94881fe16379966a6df3e875a2e825c71856c813fa0", - "c454d6e0bf981241bdc56786e48148766d7d06f35ef820e0f71660881baff808", - "914519030d559ed8788342c8cd86cdb593894c3ef8f3b4acf1eae4af93b82bd6", - "bff0281d265a010dee24f0e1076ddd0e32bf22f52e5d2d9a8ebce08f34390f6f", - "7db9570f5d9c7f61a33411f9808566afb7539359cb5f9da03ddc8b1d97087bf4", - "03bc5fcdc85105c00d7e061f56c7643140445b67cf3e2e2baa75060bdfadd93a", - "2152bc2f8e925c58bf7ce0e423501b652c7f78f5aedf1b0b844a3784b29cfab3", - "51ae4b0ede477fbaa76dd671730053331f2014bc6dc057c886a8f6d01075a304", - "4f2730e6555e70dee3b5eee83dcc0147bd3129026fa5c5668fc2a835bbbe1b14", - "a7d1edd4c76660df5dad9b836a3295aca2dfee49d28947453c4f6d4c18e83baa", - "296e573071ff44ac7208bd6e055a04692d66cd06c6815eaab24d7364441f53e3", - "5f130aa83dba95003ae2a80afe085279c1645f3aa3743d1d99ab67857aa67b2a", - "26421725bc5620f365235e90fb2826e5030c643d9d4b9ca0683b3bb8eac78ab3", - "d57bc1e7ed8b0fe3de0ee322d7327328e6685c03028c1afaf2c7b336a814274d", - "f0537d106d04ddd8046ce7f847351da16f965713de1c2ba2a17ad67871b3b812", - "ab23037448926e3bd3e438f5e4606fd8f22195aa9f273196584592d679c502a8", - "a715f5f9fad290dbb34d8c886f74d5984c4dc7a20d863c40cdfd9383c715950f", - "a42cbeb3574e5625a270b121c48f0175acef4ecb3906989941fb7a2a03ce4b7a", - "552052b3432848f99a420fe09f3588ba3a3826e90294fd048dd8994c1281ccfe", - "7b14ae46529d05bb01626282bc4b046c926ad555763397fccf43c3fb63431dc5", - "e55f2027f66f2307c208b4f7d6a4fd284c372e9aac95a70677ec603998e31c62", - "91b047f0db517fd7a8fd583d6731df6d5b98b5e91659be3da184f7fbecb72035", - "4b88621104e55779aa6954ff3e2eb26247d1b2c5fd3531fa87f52b4c543b6708", - "31e3707eb84a40aa6a3c3ed35997043d843083c81fc4ff14feb32296955faec9", - "640408fcdbda448933ca9b9f0a6aee0865e0adc63c023cbb6d46d6620271f46a", - "b577e2336d27f16e42cf96ff6e1e762cd056488045ab6271fc865a683705686b", - "580e74a9e47dc30be01ca68074eca279b6621dc12832422afa55fda1e8898258", - "dd479f7b545d9d4ee05047c913c42ac3389cd606421e92586195c7751816280a", - "a66124137ece3c1abda848e0cd3e303ea675d8d20e48aae4137c6797645afa64", - "c8bce939f76c881e660935c47b49ac85ac612cb0aa6b16082fb22a8325e09e29", - "d6b2bef91838e5adc7df0e1786259e492db7da9b1a078f183464a4057a78d157", - "cad78fb36bbc0a4d1d3f322e78c98a65940541944cfc95513f23e9cdc61fcb93", - "26999d17ec50cc1fc8822ef2c1f5a23b1e55cfc46ee64f7a4f717453fdcdccf4", - "38a4f9b74c2fe04cc66b5e010aa13749ddb0d7a25fe4d78d3b7f8c080b6d47c3", - "ea904ab0b73b898736b9813c53be6d6b0e756a6b3e6e691162f9940e7fbfe474", - "c1096cc3ff83ca8d17c8bf76505058c179139f4984617128c98e4adb7e9c8052", - "b7ec1c03711fe41f14559b8e9d169e91cb14deaf18ff281e14079cf6192217b0", - "352c23d10245b6733454e4d675894bf7a38400c0d4fd1230d8fab55115ac561a", - "34c30e2085d75d9d95e4f88b5b7cc9b05ad3843c679ea085b3ce6b477ef616e1", - "e14d3b9addbfcbacc5a9f88a3e047e675ceebc665dbc87fc39d45ef56e0895b1", - "526f1d363d6b264f2e5f79a3667c0b9773ab1fb486abc17750cc98c3da60de5d", - "e6875178c98cc8483c0a2066fe2511de61e557e9e05829de087cd18badd14f15", - "f24a5ce68bcc78be721a3901304a24f1292c4216f5d0f52ab97a1899814df7a7", - "ec1c7667b5f225150a242248bc71da0df66e95afc55fc9df2734ddea39ca73ca", - "2ede15eefd42073cc8ea7c99d4678abedaea284af112d2b1c0b2019d3fbdc192", - "1af46d4ae4e9a8a3c33d1ee4dd1118dbed937010a2845509a5983607ea067665", - "171980737075e2aef6afea403a7757f6d146979ec5edca8c7cb4f0b20f689a83", - "afaece6323aa607e22c12db81d16e2e41820d820e6a07db7fbb0fdeafbb3aa92", - "f1afe501d649f5659086eb6a628e0e266a36ad513391b39a1bffb93d5603901d", - "95837d6f16bde6a61fa7a7cab328b92af19f071e14fb08cb90c0f4b5093bceb5", - "e305d21db5328614de7b89e204c87c4fb8d494800b09927c450e530b03dec683", - "ab39187be2d08a06b74e49932070ecf4d95d4163149c96decc4083a56f5f6469", - "74fa001063c6cbcab932b13cac1b52c4851b24ac9dd897e8c080d21dead674c4", - "f3ef343c8f0ce5f204b20be946d69c795d13e8396abe5c7f54f89e0068a07aa6", - "4d5a17bb826934256a69664f7dfb2f85ec540adff34cb64af85c2a95df68bee8", - "9250b8eb17a8e7af418cd4c9f70b3b5d66005d5cfb704a95ddb18d3725767e62", - "e5c3c74079ee525213d39ee61b1b97a96f90b862b1ba16a116d3c77084b89530", - "9d0b791bf1485c19b97b7889ef21d98158fa761dc4e05c2be3ff4682aff54eb5", - "96c532e6c6a4e1534e81ba2795ff04ab855358cbad4df1cc061141ea2eeaa98e", - "a979bca8d97627b23c812e1ef31e1e1359bf7b60630b1c20b53d033d94fd188b", - "5330120f19b8e66a145e5e821f761ba1d12cec06267aafac0f6afe5c822d5443", - "bed008c2d11e4bdec2fb93f00470f0202dd02f1bf8d8ad4b501bfb93fa65519f", - "7803d2ccd78db8807f30526fefa7c735a6b3a25d9a7cd8433fda2419dd6e6b3a", - "04bbad39fbd813247f2e48f0a858060eb2684634efe1a804a6ed46740851ecea", - "3749f0aaa12a79dee45f1be3ee61d460c3f49479294bc64ab14bd1212c4fdbee", - "c65706c18d37d4a3903c1797e59aeec0efc4533659dc0dc30264be04c66d44c9", - "f36cb899ac12ac47a60db3dbfd09bb8f50717200ba76f2aab6da88fbfe769ce6", - "9382aadb3ccdb3fc4ff0b7bb618320d885862af8fac2704d765832b9da392543", - "ff45921b28cbdbb6d95a20aa130e6df141ce08cdea1d0eea69b2653d74529eef", - "4bd8ae4c9cab8f7bfd8ffd76ae2dfb9699a57c39a74961e459b90777222a4057", - "e190d5a44b08fee483125464984dfd4e3df6acd7af3c2132d57a9226703df41e", - "a71b79ad86d8fca98139bf76b70f9f2f1cde15a66fa7f48ac43d803a8c840b2c", - "51eb85b039a786327c28936977952dd33286dc63fe475145503095a89781f382", - "50cdef93e75023bee24d5f0e892fa46556365aa350ed90fc10a691e6ae53542c", - "0780ffa18d3e1f231601e628e36afdbc6f5cc22b6c34f57700941ccaccd5b679", - "dd482779db71e78d3047d739b9b1e75dd6fdbaa688a0bcc72481146c829a2bd1", - "1f12e7932e7a6b5f063e886ceb1e24e20861377d963cc5384fc40c3bf7311974", - "03a28410d49c1e1b7ff1e219a92a1676c1bbb8e18225ee6cdc53bae05c9c967f", - "955428a33bd4f96212e6648b56a2ea36735b9b5b04eca3a93179818cee7f912b", - "29ebd596c95f92ee08d5599b882371e85c85aade73980b4f172e0f3042394cfa", - "760b9604ea7c6d5edddb25afe674098b2f9e14f2ad387fa07711f83d08c81312", - "8a44afd1c44f557840b6805963f4d3038fa5c903685aa1f121cd24787bce982c", - "727f3f9b3e1e390fcaaf2656d4730c9df0afcd05b1423c57ddda776eeb555c58", - "444c8d4b408064c336a24bbb4590ae78063c8f1ca097f0f0a70687f1a00c712f", - "875e99d045edd78b276556f6991789a2b2f419cbeb749f454c036062fad8298c", - "6ae47f415fa9d8b9d3155d91450e641dc8c3a0a05d8dc84fcbc10fd2410be0dd", - "e1d75a3726250a15384f8f84324ded8315c53e96142c09d8f1d08c928979bc41", - "607c3cc2f85b034afbf056e189f8d7936fd48bd7f7e0a6191e04058407f5684f", - "e8e18a5ab03623f342b830698783d935c9310bb508d06243657294ccecfb79e9", - "d51fb1118ddf15370de9d483221a32136bf41a73ab02eef3f32d2d1e8c0a0677", - "c2674fbeee272631a7ff265edd62ff9377d9eb5d0f8abd957fe85c1eee79128c", - "a4acac1e14c62cbebf2c530f51a06621fa88981e466d4b5445f8c342b442b8cb", - "e618643eaa5f3910602eff90d44ed33acc93ab7d10ab5d7ab7281fe819fdbf0a", - "cb8bd6004eb4febf0d9c559e822be5a516e86f22698cc4002cb18f9aa615a7d3", - "3478a3cfa5e6a611149472078d9379ae5088f8ccbce539c06d2457cccd99351d", - "c04ca9b481ec894f4caf6412a0cdfc48908d28ded7f8b912cd37803d1abea3a0", - "0cd0aab0983815b8e6fb6d64df2f09b507f39b7f057061375cf29c5753cb8c5e", - "b819042c21d85f42b9647f65037a564bb5fa4f78e5360751c2f8f3a9872a9044", - "d9f6c800dd702dd57f9e6b18c5ccf38d5d44e3732f31b91fa249edbc6f9ce764", - "bebe829a5a7c90c4129115816ff9c124a3f548c986b2547f802463dfb4b473cf", - "eb5ac907052fe26f6ddec88407188dc2024c93f0bad453ba5fd56b22fbd357c4", - "56ece03c8170c62497a0ca42f0f298c870aa15123cdccdfad6204293738ebc2c", - "6385b8272c46428f7c3534652425f15b1344cb521505d546aa9687371cdf14e4", - "6aaf5edcfd4857da5f3a7c00db648745c00c2e5c538deaee138895da70c970d6", - "c1e0c1d808c607b9e382f841b7fde031dc54effdcf18acefcf35f1c515283336", - "d6c637f1d709f40a06082f0ef1805983646e630848587f87c0558acb5d6026ec", - "6d57f5c50435e83751a06e4864130d238cffe23e8f4b3ac131d16d7173c17d75", - "ae18b58028b522beb112486fe375139341106f7ead4629301f2566f6afbf21e4", - "d206984353fad503766ae54341aec20306ddd260acc4973df72383d615d36f0f", - "d29e5cce5955fc2fad41688aadfcd3c1966035e0019696dae834c35ae713adb0", - "5f3d913f6a2d25da461286f5ae8292a6921a80340bcb46e6581a13b4b3409f9e", - "320b000cbc6b523e50452b9ec35925e4ef402be3924beb5f8e0912edbcc40093", - "c457aaa626c72ad75dd721f563b5f30f93aff245aaa79b4c2738f4c203687029", - "6c94fa0e7eb462e099198261cfbb7287dba74d7eece9d7251679b8c70ca48eed", - "31f84608790f834a0922c777a037a45e02d8e0e9b69abf167ab643569fe0635b", - "e40418b892ba7fcf8b8527641ab1c5ccb59aeda99968e003352731e99e430445", - "21294f3e370b7084acbd954788d0d93cdda3c155be9a9f341ade8cfa01897e42", - "fcc994eefa0ca9a15337fc01d13bb1544dffd81422d0a1ba43d7e351093e34f7", - "d767d392c11cdb4befc7b8624e585627c034fb30242e01311ac9192215df7ace", - "88b10f0088328757953b15823f9a14794566b61385ebef6149fe70221b91905a", - "e0f1a6a18c791613ba96fc70a1dde17054d9a83dc349f6a68338861e411503cb", - "b013e9d9a92b69afb469de531d9d4af10175cd2c49953acb04ab07e6eed16239", - "e6dca0a6e79ad9a29e846e421747affd8fa041e239af833aea0b00ad77482763", - "ec6a13f5c3f4c62ae816562aed1b85876c5cfdf9a55a875c0d85a685862e4a1b", - "0608a99ab149d83046bc65b4c6c05ad778e7b361ad2f89ec8bc83de179d4935a", - "495c9305df8a6e41e412082741290b51e54d64f743256dbd386dec951e3d0638", - "f6805fe356e09591b50e9f06b224aa58abc05eb822dae39b66a9a7fddbfd9449", - "e95ba30e080db1d816d27bbded193c3bb6d11ad0977bcc66926006baac06fc8a", - "4fb15844867bd8be007d3835bf7508cf4bbdb57176ac69af75550c2c2c0d3aad", - "cb1f73db01da24fc5fc71a106e3ed698d1c153615974182bf2613e46245a4694", - "e5f881f3a93d84f7bb0c2478c3a187b3150cb74522efd65d85096455f8bf178d", - "d077a36e1debb29765e84f9c4b5340c8ae9ae70b36715580eac6508f8759ffd3", - "37d477cec8ce47fcc81896501151bf70b0556379468aadccb94f707fe37a77ec", - "cebfe0c287f6fb86852be635dd78022e805b7b299588ed82ed1c778b884fce60", - "60322c57e20170830015ec24668e7ceec71d9038b01dd600b0101eb53300390b", - "639d52d2e791bf31a83805cfc26ed504b8206a04f1783b7ad4df9f5ed906e66f", - "43c747e9ee15faec972c3275eab2c8fb8b02f64104d37545e70efc33d9cb10f2", - "0a65964c91c3ec0719656947d9551df58433b86454134930792a7e2fac8032cc", - "d28cd05b28fa0387ac64cb82cf6ac157b14becfce27760b0028d260975b35a79", - "53c7853c65e8a15dc9eff9758b18fd7fb803caec555db3b8c1df18168c6c6f82", - "d0a72dbe477c3cac22aeb76e3d953f2b22a97d66c7d06b23c7850a49e63af059", - "2f9a15f961bd44ef106ee055fe1ca561dddeb2672c62276d71aa32e024ec84e5", - "a4b6fb39bfdd6530eb5cd1e723b50f0b468f102833469d771a8faef7f4564549", - "83346307e2671168f78b7fcc53575eb71d4964f83633d361e48651f97fc74e8d", - "34e110e8384aa14c6f61615df9a7e9832f31444b25d06f2df81202c9132e185a", - "07766954a37f5a1479e99dfd4093a0963d6cc492b50668633c202ca622645f8b", - "44c590b9075ef5e1ad6c76400712abbcf67ca2d5f4231c609d17d4b7f5dc0f74", - "834f061d449d65c6ab2a43fe4e00d945e3dd0564df315448c46f18972211790c", - "9cc740b5ac3f083adbe823851c3f0adb1bba732f50e71b61be6ad7c977d36016", - "4fc3649cc5fb4d93c601f097b5dd6d707f91ebfd2c28046bf7e89309a893a4d8", - "090038f48cf77aec998e4f6f2c169f1a833ed695f9a5dc7fe57c791e3f8d205b", - "2f906bf42a9949dfd0a31a6aa65dd0ba15adaf1639ac01617794216d5087ac8e", - "421c69bfd0af7b39323435351f60e7feb59c9517918e170b4876f7b1f25c049d", - "40ffb19599fe846387348481772b714b770f7f098c1f84f2677c186154966852", - "4c2dda5a6a74b0d93d870896f6a1fec9704c7fbe8efe31159694d14e0d520f7c", - "1755719a69c215b5b4cdc0c8f5a18742fdf9cf554f563d590ccd47eff3fde13f", - "0699835e5859d3d33adae12624bf00c2e6fcf11ba145e3ee2bd305e49fe2babf", - "ab794e14e03e8880dc6c976dff8e1e3d15a34fe41953162ba45321cb8c52bd57", - "ebf6c38644388916cb09a354712b5d0d08fd7da3fec1c92b148a8796a4194cf1", - "ca5eced163cd2e5a88da592db1e1ab30f4ec38f7d3aa8784e26c70aca57b2f19", - "3976701600a438ae1d745089b04d6005f45ab3334036f7ab4d2ab624d99de9f7", - "cb4aee1ddef1710534ebe9aa5773e6e07f46ba57da8d173f1435e97c5d0460fb", - "d17cf0496e9ee69bb5f37782cefc80513d3e82d6c2b5ad5dff838a77ad1566bc", - "853d49c742cf430dc8ec27d1165c2d5e72b2253d213a3b6d377af0c9a9e4cb40", - "a4dbab0b96df55924883b4b712582025a05f7eaa81ba743ad1be8e94a4187542", - "df5187addf10f9ab3ffed0989b030da00fab3966dbc3447018ed30dce4b8d02d", - "01b65844415465ed039d90a68aaa81cd13fd1612f31a6bd59d3cf88ae54d59d4", - "bb440db81f94658913f6ac9eaedaca0b3db64918230cf95af0d614780d4959ad", - "8a98a673490dc52349dd8430d590465750bb5fa137a45d3633bde1919219312e", - "658dadf8a4cab45918b42e889a6c002ff06938d704901e2d83dcfaa7aff049da", - "d4acdb9435bee0f4fd0679a358c4a690bb3afbb8f13c9fbc25664a5433ab3615", - "e28d9533f76d7cb69c1c17f3f0a6969bbaed281ff419963b6c0b9a59b39409a9", - "2f4cd24b7a6bf041a319cdd5b998d36e53dee9317ba3541d32c4728271234a02", - "8d4d858c6491ff74230cc50df95f4e639a4312b561b78c49669e5ecaee43b0dd", - "7d2be0fe93cececb0a25bbd382383239c0cfd1103b38a3a8af1769e7cff5c01e", - "144850863e26e57271e2e5c60996f35308753bc60976bb3e5dc995be4fa27831", - "cd2d42fb07d89451f8d149476fea8b602685f29b54406dea15cda34b73c52906", - "cf0d2d5873caf9d140611a79b5715a2f18176e77497795d9bb992c13799a18e9", - "e32781909fc855716bf1286aff2af90bfe14793b48ede8b90e9232b061cd96c1", - "46f76c1c4dd1387a536e9f435722cf28242517447d50c7ad34c64dbe809066b5", - "d693757981407cbc653f4714d9955c75101b840c4f1d637b81d2719e84f23b4c", - "976ab5291afc4477e470ecc7175dd270914792aca46524c798f90493be3032ea", - "32bae72a01f37b5f5a29e8ad094f8c74f1efbbdfee22338ac4ce04460dd274bd", - "fdad725b62ad07e865add35428130b0727c19a7cf4c211e3bba8ae45818d935c", - "98a1b5adcca142513bee5aa860da861584be13c7d6db26bea1b137f621127306", - "9f500042c74df7a6eb5f1b553fbf5155884c50b54660b5d268e51539a0f2c4e7", - "f4f6d4ece2445e334f9ecc69cea8e7d8508b2468eef2ae55a8afb7ab1a7eeca4", - "37fe48912c4c5b1de01a1f56f510d3a24b9cc574803dd34148194852523e80f9", - "3332c7c4415d16f1ad079d4eba6a58d25d3436c21f9d22c3789d99dd4b703e67", - "5926aad34aed4734ecf2fbc26a718f3c7cec7ed6f3fc24a557447ccf74149644", - "4967df99455ab68ffd1debc0ef8c8e68f915abb4af79a45904e168ae6525a768", - "9a74848abc207cd6e03dc74755a169d13913b3aaa9f9163661bea1452749424f", - "a7ba828a950d9fe80bce30072d71084380a84964f1826837c88f95b865d705cf", - "e060046d1c36e320591fada6a40d89d10c117fd436771a4603b27d69bd29e676", - "26696701010caba0f30f34f153b8384876f8c4a06999bc1b85d4216dcfe2fc06", - "47634186dbaed2fc704564b8e368e0d0c56c9ac824a48011021e4a1d98ddc6dc", - "39a581ac6c040eb7a22bc80642304d28db86550228d5234fa7977ddb4302edfd", - "f68f6d421eb4c15b64b5f239ee04d780101cdafe2aba271d6988a2b7e520501f", - "b3030f022f6eb7f8c90a6a971b61865db6cdf8ca2b6543e0734e84f4de75cbde", - "ccccb30c0fc8b785ec4218e693e32bcf496cc4aa813b11f41d60da76c4b0daf6", - "74b3ce80a5b5ec56a7777258c5c94844cb884853f2fe470d0bfcec442201948b", - "b20847df55e1a235d9c77700f44eb86d94d3987c3df5d3e092d31e457fd53e43", - "5640e7df4344f6adba5a766a290dfaf2c4c0e778204b57bd9425b1054e4c78e3", - "1085d32743838e879731e3820269420c83597c6e272688318f4ad254459a8f6c", - "c43e83f701d302ef513d07e88180d8518708c117c71f3698720e82ae8161d354", - "5c408e84080a4bb88dc3da09c5673adaf4ca083c91e5512a76c7d1fb70c53633", - "20396d57e228e8a113c83338207e4b3e106cd4cd080d23993e61afc28e29021a", - "bba48e88347420d7ca84a02b2e04abd279576a23107514684a3812252a25a64e", - "4a7baa96dfbb80d065fff6d660c27ee9025be7f01993ae4a4a5584e8aa92a2e9", - "33f8db54dd9964ee7df5b48cf144806ab395797bbc1a6ba3521c19836c8ac514", - "499cb47e5f0be1be8c0e737f41f62b3b6be8a77443327258fbad58746cd1407d", - "853150cf1e48c22245212103054ea40277196276a2b47ff8e170e06f75718001", - "d1fd1d53380dcda9ef47b1aac7a7884fa9da5c6b6c0333fede0c1058f917940b", - "51fc1bcf1ae9c2bc7edada3040f6eb3386f7be825c3fb5e6e9e82407f2e5d7ec", - "6520907298f58a799d4311b3c97f1979f1c38fc3be112c4c81d7885af5ee2c0e", - "0dff13ee762148fd8e53687fdebc27b3d55d11e67779cbf82c87dca770b123ad", - "ab82a7ffa4cee13e539c9821ebb8cd9f3dd846eea1e1e8e2ea041eb9e8e117b7", - "07c4e97a937cefd036f267ddb91e428fd17efc8e97ca0c096752f2c22016f1fa", - "1a9eb004fe188f362387e0a307cd9d3be462939179efde8b7cf5b178daca6496", - "5a01c0b6be8eab65f8a7431864f1da5a00294b8b2d5ed3c769bd43cbee804bc3", - "bfefadf7c7d7cf2259edb9cbf187620e2ae77c8d976dd9d32d674e4f20e986d9", - "91a7a123dc6ea414503375f1e4cc885c0061998550fcc70139d6318a28532145", - "34253c547b3655907430217a7643da553a10ccd999e65436b9f684405d7e1644", - "54e522df9165aa1037229514cff2672e97dbc573b9973b74113bf26bb86dfbad", - "6cdc63feaff1a1e74648daa4c62ffc7ef1d41472d8d157dc8911eca53961ea6f", - "c566ed4230749573522bbda9d9f33b2b7530cdeb3057dcc77a6765f9b2152113", - "7dc81364d6b22ed6a571a8e068747f56d2e8a9aa0b5739d3ba0f40a6f1653d08", - "311c7e09fb42692fc557fe8fedf6517a1f1b5e20fce9ca058c943239561ab60d", - "0df6f5bbb4309756b22ec2d163b1611cf5506eb68896facf285c5772b5397a1d", - "179569e3b4e61f6c8754fceb5ab690ebf9734a9344be0e08ee3897134cadc2a5", - "8e395a063fa6f967fd4f2a3c37ef519c5f202f8c4da6e14d73a7cc500e3c0b97", - "1293e8e93a9da462494ab76063050f327c320cd6876cf4ceac2c97c3a3be3bbe", - "b8b62e4d725f40e5db141fa556ff08452137f4f8dedf2af7a62f2bed890d8a47", - "38044c3757ca430804d9ef46832f55cf98e719bc2078bebe9e459af2417ecf03", - "d2ba1af3a75f61fe913bedd83f0b4a07e107e8dff9b106e1fe005dd5318d94fe", - "e1008a9ca32d5187231a4687c97ee96a77c275a4f45217ef4fc64ab4ef90cbdb", - "5390348c0d9adb067f0fafc27ce5feab11c06306eb6e184cb7fb9c4b09479ab7", - "915508a8dd89fbd6c1a8972f52760c07166fb5018c5685aab7d0ebd9fe5905aa", - "3d326f80347024d565834f0b238c7ddf7b8871141131db46066fe3727ab71202", - "16a0263ce520bd6380cae5142f98f65f5ca19fec9f109822cf9adb6c53e1877a", - "1117119158a83ace51f02003c8527598b7e7c28796d3ac83fa5322c704102494", - "922240cadb28354a9da5129a56f701a64f4af932ea01c2cf0c55832aff48790e", - "a54660de69d068adcd444a9cdeb00283cf56e582ddfb44563801b2c60fd3f06c", - "9a1a4ec870a5c6ba5bcd819bb3fd73f51e913821ef667c2278f105eebd0f5b59", - "e8f705bdfc8d287f24372a5489d4360d606781554a49934a7f98f4e48fdf5f7a", - "4e32eeb3bf1b5d1f9dc2ce69bede42bdde38e25f1a6adf9d21e5304056aef768", - "52cfe10c2a590ef8464287e4da644f24c3c3bbf5775b862b1c35bec1e67c6adc", - "0301f0812866144b71c14f389d4eb8dc635ac618745af8e0bf34621a0cf0591e", - "0088285c2e1f5ab09b77d5e5e5e636369facd9378ca85b5eb4dd9890ff058a59", - "c22568970720b9029f7819dc60d9451c066c24f1e9a4dfb944ecb419e60d6a79", - "9fafe7e62729db67b5c8402919219ff5c1818c74d76a13217fcf4ff2fe2318bf", - "4fecb6e1ddaa16a4575664407648d6c0484242f9df30845f8888bed6be235fd4", - "e400f6ad193de5316c22aca27aefd37327731a64a176d8f214044eb7d6740ab7", - "740fec7834a5369d7a591ba100673fda0781d3faf4635e669dec048ff21e4d15", - "83332e3063e5260814f19ef9a3ab74a3ea255721a9e027d66b296a795d84df5e", - "2310918667b34abbfc9f6670d6115229d053ff8720e0b5bd655c1674c890f399", - "41f335c60fea9fda3b1a173cbe4fb73e24d4c22bec5b1e165d44a81b9b46f919", - "8c982bfc6a1107743c85de98de9d9ef2fd1326cf851dac662a5bd3023244a201", - "ce74a0f80c0ef6af9ddfedd28de192a682f45dc548a900467c8efc1186235aae", - "21b11c9fb3e5a01133d15bb31118380511f057ce8f178935d2274d65706fabe5", - "b98e902f1ce6b321019ddf6a05b761e1f3ad9850ad6d0f91161fca7343eef957", - "580c7279b701c00c9a205e1b36b9239fc7a848e0851bc4c5f7a3e90e97b349c4", - "de660de090d272b60f88d9fdf2df239464209d7c8286ddf4c804328598f2f0b7", - "809acfa277792f9416595a39d740a7f2bc2f413c171e94c07e8d5472aaa3d6c1", - "518d282bbb06e217e976b2fcd50627313f61b94bebaf357ee605e84fb548c1cc", - "ed599a767b665210cf145e48df6a07748af66cd33899efb0efa7cd983ba68e62", - "e8a0cc41852b22423acd2e8c30e9d9e92ff6e8c77f3684a6aa39efe748bd6580", - "b8844402269fae90f67e246a3d059440c3c33de295aecdb71710d6464e7b7fd1", - "e40c946c9e5df7ce232aa9de08504db6bc33680bfed000874ecfc5adc50ba96c", - "d7d590f85a27ece89cc28683cd6647ac4845bc4ce800656252f2a3d739018d66", - "8da16f2a1a64d622202db940dad1a6095db102740d4718b388cd943aab01d3f0", - "80a6659100410afc24ba879e158c7496742ee0788c55670358f22bbcb9d8ede1", - "3b1868892d9c78f47ba2b4bb55ae45ce6b623f20d762c31d8127685f7acf3334", - "1a868912a70a240b1c80a7c475f49e76cc8ae6488315b729a6505f04fbde1064", - "4ddde2457fb8eac43930b4dac8427983815208193c01471fcd3964b4d7802f03", - "3a3af85e786e30f10304ec47134debba175acb719bfb4ed35130af8152ad7174", - "fe7882ad581f98fba9eb215168dd7d284d70ceab81462e410a9d8a51995c70cc", - "344c0dbccfddcfcb9d29306f15c657f43a3c4d3c80e8102ec601622073092032", - "10a45253dad8c502bb97842750bf43710d11b0884078b7e56f8e8cc0ab48441b", - "b65f416c1c62fcd2a70eef6954b15a94412aea43e1778da57927f3a8b8750865", - "be18da7688d21b0eb1aeb6796a291223f071ed450022a7153e969f40a96636cd", - "b0fcd44b3b65dc91baa2724441f6dc3b77419adfc739ad4046c6e693c25478c5", - "10d409bcc9f49282eb31656fd4ff3c18832f3ebcbea7e9b72b8c4410de7396cb", - "559f1ad169131ba67606cef4fe13542fece8de1adfaf585bc2fedda146c41f72", - "9e1fe0574ad17bff6fe9f9a2e3ce5bddb617cc79d1571b5c8b803c3b4255d1e2", - "9ad0fa5614176e2e4a6713f1029c6e18f7d393ac0fd492a647a9552045e3f8c7", - "c4db9d7637ca42c41b1a7cbd830fdbd5477da5cd661673ea60644293c21b9d05", - "7e97ed45293c1c8bbaf2d61245db23cf8bb0d479764181fe98066878c876711b", - "669563ac153f2f356ac3408dd6d42d3aa4958c746414f4cd36974ad795ccb186", - "6b4ab8094d88c712003666db46e4e01dbb9640b1f16530115aa18d9ed61efce7", - "1ce82e147ad88a87a0aee18ee76c94a7652210704d74a1c7c0b871db601848eb", - "a94fd5cf27f7c440d1c86ec59ef08b383b88426e41aaf40d55da33d750ddf4ac", - "ff7237500e0469c1c703c21a541c003a0cc7180919818ff3ee0655b02c5cdf26", - "e538a691e3e2fd4d112492403585410fe4f9d2eabf9920f00c54cf0d4785fc0a", - "3383fd8bffb7698daf68a861c35c2f2f8be4416d232334af5a5e92cd69cb220a", - "00b9c6319c4c24a3f71d12cfb0f5b60e959f7cf2d0a3255d1ea99f3d1c4a3e7c", - "0db908bf49693150d1a463439ad002254f8cc99a55f89ec0099846b4ce571215", - "d19533b46e3457e338d5c3874a77e4db72d5a055be16a7c2379f3deac6ca26f6", - "35ca9831c703d14d1bd7368f1dbff58a08bd8415fca11af1126e16d0924c4803", - "f3e28178b50a5accde3d57e3f3cdd727ae898eb27b5dc2a8844e96607566d003", - "388b41cf759251e4a011696820b278cb78f11990ba9a838a895146399171438d", - "5e569406663993c7738da649ae6967d0532f1aa5e2581e0b1f72c87bb49c310b", - "0e26cdf7a80c5cc0ae33cd350a80dc1ae01d4fda868762de1135cf4db2c440b8", - "bc1d05c2648414eb0d82e5028e104ac72c6db0126d557d3aab3c103dde6ede08", - "b057bafcab1ab751d85131c32fa3794bd271ac87927639d062dd790b2520d9c5", - "4f2c3c9a7de10db6763d462b19d5006020ed49b6a411ff969a2939de51a2f00b", - "d751591a398b66c87e11f2c9973d4eebd1644604a6a1819b45de7545323e1ae9", - "df3c928e114910c28257a933c463d1524822d7019a1da2c679930c9ef5f6ba10", - "afb0d21349c1a05cd445dd29d3789f15202f7b8ab12998d888be2f88ae5256db", - "140c201247665ee98cc88a3d44fe179b73e6dc18a4cfdad849c5f889d3027db9", - "8b88a63d0d86255cb1ce3b8fc3f68a9944de57ce5218863b65ea11c97acbe9ff", - "bab0b5f76210f594a5f0dab2ed2d827b2dd27d4cb6f79c71f1952e3adb2e3e41", - "b2309bec0878cc560849aeaa6237cab107fc2228da2b80a3bbc12008cab95de1", - "645374b4fe3d7383d456b0f5637efcf789de991859445c21a500542db9a424ae", - "76225a8c7517505e9b9b02367b5dd8692cb657e01e1916e1365f00b0a2ff06cb", - "2e36e9201cc3b8bbc96db929b2c41750857b581a63088d4fe3f429613d928b71", - "a1d1c14c7ce3c95f0243dfa2bf57551587680bf6bacb7a92ddc31ab469e4bde1", - "9a42a000e7ba7e87e6f46f46e15b72169ac6e7888887cb0f1bba925084d2282f", - "7f88546cf3912e1b05f496e5b5062924c9ce4a741e7321e91cecc16fbf0a91b1", - "54793cd3bcb3f8b030f7e322f523e9ab890aba4b2bc44621a1cc8479b7d68832", - "cd5ec1fc66c59515a9c4d3a426b8ce351f076d68f2804ad8e38d0afbdeedddc5", - "e53448783d1461011f2a70169dfb693c613621ba4152e7c4f115bd64e3b2503c", - "e2593b22aec593dd279f2bc0ba14176b5647d113a9512373b185542d74b4c104", - "c0adf41bfa1f39077c91e84ae8903774794d9f49ac1b0987383c54425f205602", - "8d797b3110244819fc6ef2f2e66a79174b16e760a1ab7726635e6369479d0498", - "b0a48081b2fe3036f606dc4a628bfe87347c8b0c89b0d2f2ccb65c0c8977c72c", - "89dd8664412b1c39f8f658c3f0e4efac69b2c89b599cd0825ad6cfe642157bbe", - "9a6885f8b8c12608cf7e7daed824d1c4502f991271f7cbf769d48ccf9fbf24a1", - "e8472d3db2de28d283f747ee60c25d07505ccf4d0295738e49c2ca42dea4962c", - "b3b34ec5ed73895feb29bef69ef5d1ceed0a7ce885923ccbb8f6f62c24fb400f", - "94df067938d0bcd5fa80f75c79e4b3a7cac9e7c3aec1259e08468e8064b98b6a", - "7884f9cbd1cda5bca38d08e5baaaf0ff13de977375bc06fd519901372de9435a", - "afc3bd05bda1746789a7958746f32bb77b5f1126083c665ff26374c132601322", - "30df5a4913be18e69a38e8471a042f334fe42711e68b32362f8271defab2180b", - "640dac34c08904deb4dc36c0b0315db4c90e75a5d07f783a7dc7a9d78ab6c066", - "52fa35d4b175418adb783a77d93d853960729743c767b21a9e1762a76ae63ab8", - "fbb49a4b72c08f4f2de05ef11c50ef9f82853973bada0890168a0ecea6a36b02", - "788e98f5983d7c6fcdb1357c7d90178946f82651f3451fe76395445d7acf72de", - "3f6053306d58f16596f72e548b56e584fa401ac45ca63e9e299bf103aa490659", - "55215d5c69c545205eaa7d3cbda55efaa2f533f96a8a5e5d999957aba8463add", - "5fa1e1651e5a4ec5e86c59f31de757d0a3f35595e2a6c5131b12f66d293faa68", - "4cea2cc3c4d467ac56012c4cb0be65effb28e20071552b27a0cc40dd1ebef2b2", - "7a92edca8cbcf38ac515995abfb7bccc62ee3995f9e967da1a3e899cd75f92f5", - "85a089197d77100ac72357a94548beda9cf79ec9e328535d1bf27cb888fc37e8", - "53f2d7932f6493bbf2d58122b50a75d3fcc839f71845b05c46874e729231b309", - "18d8287a689ed95694579050ece86070c1ad6f8dd46f77a7829867f32abdff31", - "b9646bae86934dcbea669b8c8d9d8c29fd4a8fbed0b2250402080587165fbf62", - "e0ed609bf39d804cedb680da2ab0559b725b9dde967d21b45780dfb1998fc0ce", - "5f1d76e116b7c407fdb1c06d1a9449b42ccf2793097cc1abf1444ed43084c3c0", - "2a08e47edee341aede8b1ca058310b1306e0ba8a0ed53fc61c5047927cf47d78", - "ea96404bab26e57b1b1c3da6164428d0630b973322be4e103d2d9db895b37cb1", - "f21fe2d9d56d7c4ac808e69594b575208954fa254a88981c6d2084f5eee14f30", - "49979d7d9ac9be6b27506371b585f5638aa9dca3715c41622749cbf8ddc15e35", - "3a38aa861f607fa5ba9501cc2e9ea8360762f89787350bea49a67e0052f62cb0", - "78acdd109566de5194af55a3830a760108a21cd6f5f5270f4949c254910d782a", - "f16d1294b439fbc4552e2529e524821c1432cf03ee2046b561169ab44fd085f1", - "f3e094d2bb1c5ae98a4339d8738f3d022e263cc2b4f93b1c49aeffe898e26a03", - "717a424b95284860f421f4c2f032ccc1cebbc54d77f329e11c2ff85c7025b46b", - "0a3b80162b1b1604a6f40286347a22de80bce516a78ed9cb264fb1a633ea281f", - "f92cef8d060bf90eb1003bf77d76600e71b3e508cedebce9c3572bc9e3471cae", - "f21bdc73f52414b8c4be823d962deb46d40a18b341ad301c402c94a8f4107663", - "556710deb764c0e33b773d159213db7e37dcafa529bdaa8bdce76f917a3b7e2a", - "44f9a3468d32105d7fcc8166a31f344b8fa6639c4055b4ed7cdc3a53caa62cc6", - "29c871b8c13a2783e3c6bfc27d3d20f53849a5365504ee3a575679aeff2c66c9", - "1ffcbe4fbaa4343a8104849b03aee16db90927b506ff91ef3996e41b250e6359", - "8bef7613aa6cad6e5c95d0c288bddbf2fdb83291b275651b6a5c64b13f8b504e", - "4dfe251a49a7cbc8673589eb1f5095deae86ac9dddc8750d6a41cd68b424f9e7", - "d7274070b2bcf8abe702027f92f49e1513be0f195bb9fff8443cc149783772e1", - "61aacdfa290554ba07bbb4494340403e4ce94ff9f55e18e3e77ce3a677e6e59a", - "c25833629f0a6e1fa11129e7283f491ef14b558917990af0dba88b4f92455e09", - "f16237b0d5291a0c39c294a40440eb61f5a6f168cc50a8c9f4f40679deed35a2", - "af9be4b4d205339c49992b9a5c24983e646cbbf66575250883a573ea0f6e9177", - "7de6c9dd34b5ce730b9cbfc8729b9082ac15851050aacf91c648ee017509c0b9", - "319a493b229204cecc8139a626398530343621810f09f6ddc25f088071503a0e", - "9cc650aebbe87d8b7a3a2315b3cd2c91df2bec0de5c7e518c1a9f19bc247f928", - "02d5b785e1352b1c8bf00d08dfb6dc04afd8a550806787d1bb5f4e8063ed61ba", - "4c80639c6ea9944443a3dd56ab4b7ee4c7f33f47a7cd6f5668783d1c3946d2b6", - "ddcf22dab513248394955ebbeb40e469a0d2272098ed88e303fbf408f92efa13", - "3d836db1be130295961e8fb213988764d5fb355b808997bd9d4724e1c95b0af5", - "da0ab3fa23e7777dbf49be040d139a8f21e131fc6c14851879e3f950da8bd87a", - "7baf82f056ad506329df113c1d2913cc778bcb6073d4d10e62aab454f339627b", - "82e3f5070239356ecf90dc1a8ab3a685bf4999c2c9a7904cbd4dde2ec805053c", - "73312b6dc2b08fb4eab85c5c53983730235f6fd528a292d215fecf797f4f9aca", - "6d29baa12d9b1bb38edac76f6f1b22957b9c3e1a8163edb7cab28c56c15087a5", - "b7f83bb204bdbd4586ff3091e138b37f8836ffba013ee3fb386db0894cd28591", - "281a06b4141c4c943ba708566a0abaa23edcc22803853f2a4a2106ec9e7e0cb1", - "24ba402fcf9c29b307caabd5dba35778cb0690b3dbe49cff6e859bddab2add35", - "f9f0fe87b8ada8e1be51d843f42c18c56d50a8c6aac687950a85931cb197f255", - "29b314ff2df10c40f09fcefb5de736e1075727e8ae0b7e2ec1abccd1cb6ccc72", - "90f84731d4c02a0d5873a8be0c449b78729fa1a4aa5bfed5a757b973cb9294f0", - "2204715a03d41da74969631b92062f7e38e74b08f761becd01c8c6acacecb877", - "7298347a265e37c40511753db6eb45c0fb44f555592b163c058f767c306e917d", - "1032ceb3f1e3c3d1b5ab3cd44204c6271eb3ba5f91d32c721b0c697891c26273", - "34d17e3452a7ab76aa932ae1b0e1d8f0fcf3ec528ef00646ee8f6b6d53877070", - "e8cc66346d81e5bf3b665341b001148caafc09951532aae417d9138981e320b7", - "fa26c1ad2676f15ea2ef8bda217bf7a94875bf2632dd68b4fe0df1cf36c1a521", - "840e1759fbb471563b81bb6d43b26e8e848f245cee7c1b01d71c63370324f6fc", - "72c2451df82f4ef229767151e6a446c179d8f1fd391c2b28a3c65da2ed666dd4", - "343fcc992ce19b4a2377a0cc2b969f8737845ff13a7b00b8f1ac6d45a44640d2", - "8b31efa5770a72edf73935416cdefb0507b28dc30c17dc5c232c86f2a7a26cbc", - "318b4aa91004be303becce27a530595a6e7afccd3af2b49fce8d76b5ecf94cde", - "ab759ec120930704a52497fdb29892620e4103e024cb82f8aee9062b58450f3e", - "9edc37d591fe3672b74893dbbc271dedf84a5021f7240f8d04aa83284aff672f", - "3b23725dff21ecabab5890b7fbc1c6a8e44e69d065ac297ae2169537870fafcb", - "f5ec3bc171e84dc9397156b20fb2d8bc6551c255d975ae47f3a474e15ad0ca6e", - "5c7085c48dda2d249ff55c7a5e049dc97a19c9b7bd402a9cdda3a0580c7e8c81", - "b37aff9c6cbecb12e53d471d811943824fd9e022617fd4d4285309bae3b9a859", - "cd36006df13124c3281c95d42cf1f0274bff0a02f97c1061368bf5987208a25b", - "c05bb84fa8e03b8acd62ff7a2b63d058df09ad1b9c7bb6377882f4b7e77b55a7", - "217e5f1db1e7f0737330c9252c49d741aaad1a90b60dacdfbf19409d25348b0b", - "5e5cfc619b134f57f4521ef446b005ef0efe1109fc27fd1422727170012085ba", - "0854a6b57640b3df1e8ad3da18fed355c4d0a8b61db2c47af2947428f14b97f6", - "875aa39284bccb0abe376b02403a83a1bae07450e334ed7ff7d273ffd3cad4e5", - "f323ba6bf52a14aff630d18ff8d92ca3445d694405a056c578ada49faf381a67", - "bbad02c49d852a5af99be808864a110a69612b623348c11c3dbc5609d15a0e8c", - "3f39bd23911aa28b0ed5ccc81cac3470722cff2f3669df292c6d3ec1325cb9bb", - "4d0b11101a7b7de56d4acd857cb66267ec3ad5ac74a84ad007d3953a7d749511", - "3d8715d77ef8831f5a1eb3c15dd342859025b06c251a428d60ad6451c3d18414", - "e18c6a768a2af3e554663bba691a974cd7504a799327bbb8219db3c8f4f4115e", - "ff48a9a3684d0f5ed22a0e11c418c8c60b66ca44682a2606cc243dfdf160ffc0", - "d56c03621fee3cb5b026d9662e4501028191a66b9b8e19dd87da8827eab14302", - "ce62ac386ccc95f0efe51cdee92161d4218663507b7a099d6365932c8d61781a", - "fad7d0eb990139c771f638be177d0ebff1b390ee5b2f78d8875992baa138cfd6", - "6926427a977046d3df5c2c417487f42b2f129ebc4ef927fb9cf84b8dfcafa5c9", - "82fe69d3fa44b5c411efa28d3f0b540d5c88d07176a6c13faf44f9b14da2bf55", - "61941e8b066dfef29f372377addd334f9798833f71dfb49a4be04dc2be5f5945", - "5c6b2230e99b955ed3f9a13fa57a2d1bf1c6be90b03e7583b687ca352ca411f5", - "5106a9675d1d0798b97dd2a9dea9f42754735a81fb95bd34e2b5d7bfe430ab9e", - "68c1269825af7234a009f5115b955d944153009e229a867de4007bf505b659af", - "7011322549f00bed74394eca8c4b5249678938c49c1a48507eae6d4e2852876e", - "7199da0ec425e8f290bf92a0ce1d6ef7cfb3f53369d3cc99811996d9db0031d2", - "279cdaacbf6719bc8bc03a7b22b56b53d86ec1560e716720b5849c8154b78e82", - "ca934d4d90a2a66781bf4737ace890db4e4555accdf09db8b29a27c7afbf40ad", - "70d3bc254d3571c219ad3515067e18aee74c1de9283765e030b2ff22e21f9b1a", - "370efe7f3f5e1a7dab8a1e61507ff8f717a1071611e1e29db043b373d4ea1163", - "fe61b7b235265d3a6538fec145ce07ece7aeb37885562e2845d621a8b5ca0ce7", - "27274f84b83508c10431a15154829733ab38ec971e188209f4d783c5947e3da2", - "338aa0c10c29b9a591280d8cf0186b633e1f542a9b1edef544f1d46a8811dcb6", - "d27bb791bc94b66db1b0cf39ade9f803b0b36dff7c4a27d5d930c696c7823c35", - "9efaa40f7d4d2d8fef42654faa21cb8d763139093e5739bb932f9ae2d7569814", - "f82ba909ca9daf492bd9dd373bfc8f351696fcb4ec331483caca43b5f14c5a14", - "76db259263ed9d739dc60c3bd2b9c0a7962bca33e6fe4154dbd8daf43cc68477", - "b5ee31051c384533b037e543fa2ffd86dded80ed7fcdf0c0c6606522a09c515b", - "dc4bfde3de89672a043eafc6a2070a81e9c30c9e05bbd4aa0349b4a2207a2fa7", - "46a39e2efeb98d85e4a28ff0e8374c0d24210b59ee35a545bc896a2b8a1d7780", - "d10aac3343fd3a593da87e073dec1e0207189145c0c11ccca9335c2dbc44ef21", - "a9a6e336a5e086fd77cc556591d2a0c4e97a3a62e89d7ac2270041ab47914561", - "4f119d5e36522a80b89c369fbb02a0e550c730f2e74cd1bb3624f8469ae0415d", - "1f5830bfad6318484cbee5b31e1f0ddc04f62517712759d764c07314b555b660", - "e14a80fc338d84e081f0e3f74a950358730df64f05015d9f47ed4a7a1bb50dca", - "679dc5fd9baeb6a0d19202a941425673f538b8f0edd28a18b73dc0819a60294f", - "70b14374eee7248d68cded935de50e8f5f64b1f87c6100f0b9989b8b260dca8a", - "46cc7ebd236ea19c520dce2fcd43ba1efd5d93dc4f0ace9d60d15432adfeab65", - "9203e6526e571c7acd8cf1ca892e83f94be45f974987537b9f08c2d7daad5011", - "19de4ef361db538903bb828def772f576da487cbcda9c9f7791efe917640946f", - "bbb8ff1a0720643e8dc9339b2ed167102cf593dbde138578f21e8c10074efd5c", - "190b5454be88d766090e7af477aec0ee962eea1f4067d0c81a819bc3180a3614", - "60196666b6be92009cbac3a7e75a906f69499e83b52aeeaedc2410d2d93353fb", - "a8a20ba1c4b044e603dbd54154746d4072a29a0c76fbb7c75b3605bc711446eb", - "b1f2fe272ab384e80d2b3bf675174b874e3d522ee815954c309edcd88932bdbb", - "d62de6c0ef70cdcc937d43dc3532ec8d49d3c26e75a127100f38883f1391257e", - "c15957a84174b508723116f9829e361fd08232239ce1442a439108920b02675c", - "4fa2cce01550c8d86483bff1ef6fd8668f6533a47a64052918b89453a1551797", - "2a6d375b026b21e795fe16e2245469ac6279758e180ff6020274ae96576e52d6", - "2cd32c08da54c1136b0986fdcb5c095894544444ffc42dc465ebeba03bd8447b", - "6d9e750436850a07cdfab6ecf4f169383bbf54c74a5dd82fc3262e60780a4efa", - "eba5755ab41c49d6edcf1a9c7b2d7738fbef6d2136efd80df77a0b2358932397", - "6b40037aed5d8dbe03a01eb4dd41022bd1f4112b7af4150d12505abd0f44ada5", - "759d7def7bc100ef90fd373e584681663a344b5e63f6bd6ee5e6374d910780c4", - "6109ef2e2c4e22c64351f8f629d5222e8ca93991a7ef24fcbc3ce5b71c833396", - "eb725e122175d9bed61ae69af43c693c41c3b7be4b1c809970b93e9f3e62e53d", - "b14ce7a927250fdfbabe35ecb31fb5233af539ba39d106630a772c0431b9ed2f", - "7c9ed2db40ba50ae3dfd068f9789f0a4dad09838ba215a4710fa6d9123021044", - "5f818206ac97b512500ce30042cef43ce063859ef26a4bb6731150fe6e0af915", - "1434477239e01e4f25bfcd2885074c70fe630f226d6b083d10c0f2986430dd57", - "ae19756880d805d47a432cc353dec5b68e25a646ff05b2b9cff4fcaf9dc51f65", - "668d51ceae81a1e34c3f41565b8e8d2d13ad9cb68bd42dc1694f30e0d2afd838", - "eacde347b36b28fdcc41e978cd059fd0fc1f7d9059ecc502983082380c319719", - "8e9348ada794e61faabf23d2b46aedc1d15dfa3808ee963ebdebffc3b1ea4436", - "d6d0f98b56afbf93d3f2af23d6b24b8ad4d7394d34b8ea4a2fc5370d4e6b6495", - "c863e99219b3d2b03b38ce25103657fea4254aa83082a06af799750c8c391db8", - "9d00dd8d436f678eb47cf8d22e34de4429e13bdbd6cff1eb66ba8aa4216211a2", - "c1b717f645efb22369fccff030460b00fa307c497a8625a3a42cbde5012bca52", - "92a00861a845d9217dd53d7b9af33de1f8be73149ffd7569a742a6b3f3861423", - "684f435bea5c6631a0022ced861fa56c5390a76b2ae31fdd09517eceb36201a2", - "fce71ad8304912c372e504230db4f4d0d93e30dbcb29fb279c5feba303f8e982", - "f4787327dfc6a40ce45d1007524f506c79f405d9eaa222d3b3555d6cf02ef97e", - "b6d38dcbcdf51b1768f838a35a1fd4fe7ac70a146483aa3e6be9d7074d2f1f35", - "5614ab00ba9106f47ee4cf165792c8fee7067416a1ec0c45cbe3ec2a81e96143", - "96af18a5cbb0a712f6fa1b6e7a757c580349b42e5f1300a2c5059821fe731a73", - "06f10a9ea9cc734fcee0ef4a580eca14dac435c320e282965bf3aa3a12057a04", - "93eec83b3cfd7019d50e81237d3c106a4a8938f40cb1aef267415b243b7fcc7e", - "d9f17ba51997adfffbbfe827aecccb203ff4c38933356401f46addd1357a4213", - "fcbc0183d90461f86a2463bc523be3bb80101301c00e0b827075918467056088", - "c12ed6d85f244545ec23f553777fe0a30d2b724b30a217a96d306a3d3011fa78", - "a7742258b4252f33754c26928371f84c894ccbee45e5d7b4ce3dfbc5fb3d12bd", - "884b4f5f767f0fb84ad1611546e32747a9fad53fa01e5851d85e62653dccd0d1", - "f6e041dd1a9940bf3698877e524a310eacb2dfaabb6f1e4aa67748eda3b22834", - "23bb8e61058d0db89b3cc82b26e5dec453ae68d0ac59c93752727a4bad8d6fba", - "269dc88d7180398b7e859203b64ccf924f607f49f397e542f0ffa1eb6f9b30c7", - "5c56f2f84b43f82f91186b7afad87d4feb6eee8b38a66d3814b71811f804185a", - "3347d2dc3eb42f30140d08a9e753b8fd22589eaba429ce0fda3182a8f0e03172", - "38e2d70c39f57875069aacea9089fa0696f84c6f091ad9601f2c57692006f371", - "a6773a193271042cbbadf2202c9135b7c0d9ccb6ef90750909b8eafdafc0aaa5", - "6d4dbb05954bbc016d48a0b626686f16621aaf94a4993dd9dc56a599658f6050", - "8e9f6a45adf461f5fadb2f386b0ec910e43201dc2da7300a191b2750b724f05d", - "b83950d40793bd86030b04a64df99b5ca36a43dc972fc0da5d5fc05d76269d20", - "b5992e4215dbace18c7b33b26701fafce20a32673f4203047fe9300912012536", - "87d672837ee1b3ba234fdc00c164dc19b3d5e74e3db537bc6e0f63f4c885ee01", - "de109f373657730c23e984fa1d8376927f5d33043af309d891009ccae1fc33ee", - "26dc6984fd710d51e9b436f883f55020595ec11896288b39aa03db862b760f8f", - "5a7902df8e256268a645ed6e75e7e19f3fbb67f3651f05d2b16b6acce2e6ae7d", - "ad17ce09cbcde704486a65ce4236f64fb0fc727390c2c243b50e8569a5c8806f", - "56a0a3ef237fe5553c4095095cb5abf977540b2fd0d24be7fdb263af8180e21c", - "c82e2298d6750234a6acf46295873e731a389d6bcd6409c015e6aa7ab74b5100", - "acb36e71f2690e23d1f9b2e2a68cae34e15442abbdecac46b7889a341f4e5086", - "3aafbe0bfb696163bcd1c2a699a10346e1c016f14740a6a7e8b38c6bf440aaa5", - "36e81a200084063b83a6fb90c84dbd3d6dd9471520164902ebe3c014328453c0", - "57168fd2ffb3af873c4d09ff7eac1f68ee46f6e8792c6a0c9e8e24b6c805414e", - "376a3aff17aeb55fb1765fa320d4cf5a003afa9578faaf1afa89b72aa89f50c1", - "ec3d196c8f69717897ead51f7cf62fea0dc1e66ea9d036ac229e8a4d07d380ba", - "172f0a861446b381bdc95be67dcb972923748d1a9b05b5b4aea81a4f9ffc7e44", - "bf06d088979ebb370435c48b187ccdee45ab7603b6f39c8cb745f22f6de0c235", - "c362ed202b729ceb073e857f32be43c7c54989ec99fabba36d93aef76c4a5649", - "2fa385ab2e6c30ff2587ea63e9b89cbae4f2000b0f9d41f888dc29f75f536be9", - "a8cbe1990cd5b676dd6bb18e3be1d31b7861e4945acda9ef3b38bab78f5dc159", - "ad9550c186ee01a3d3e5aa0859a3db1abf22952c464dceb13a8aaa3653e256e5", - "55451625a32cf7bf2eb3d05865fb0545c7af06edb7fb38abf4adcde97130281d", - "33c90e0a9cdeaec7e9c722fe3bb37decc3183e8589d46e634d3ca3bcdc63770e", - "db5e4623b253be1905e7ab835bbadec9b37eeb0112d064d3a95a71f919563234", - "5fac4014096a3c1f13c0a096b0edb9f917c4eef6a3609f1751cf1de8c30b4d47", - "ad4b745d994f4b4e0ed5c7567a5d965bd792f3d697290ae69c8ae81da8ed7f03", - "bb6fd3e0102994cfd6508c8f7e661a2a9ce8677944383cc05784cd2e5492961d", - "bffed701459a008fca0b9b2e35076e9e4ddafc6beb68797eabe9c7fe926df6da", - "89b2623f4a9b3db581825eaf19041b389a860aa6ead2d67baf27e807a71b0587", - "8815e917070da34787729613e7f4b9f3f17c038b9b6ea04aa40d6f5959303aa8", - "8a77695bc3b3ce38a031cccb97ca4ba6c249765c0c2ac59e2cc39fc1a2be017b", - "398b1787cb7411fb2897c5215247bb2d17ebcc12159303fe5b7e907363a67ad9", - "d9725c1481c6476c48477e8f0df6d9c36e4f6af3e5b9c9424a16fb058e507b86", - "a1d40b468624a6d846daf1eb25b23eba8d29de333bab03b876779274a9530c22", - "22479486764eaa61157d64b2a6ff2246d313dfc9d4bcc89074720a27c280ac48", - "79b103006f8431468f5a13cf9c6ad8619266bbaade758bee1750e1aca221b88f", - "dce0c002cded45bbb32ff1f7e5c87de80ff8412d1681fabc60cb6556ea1f865f", - "f42befd9d965ea354844ab6080c6248661027b54a150984c6411969d0647dfd2", - "8d0163ae543793dba188b9b2e78c248f67b98408fdcfaabc49db23aa38acbc8a", - "1a975fe8eaf0506568765ff2e4b8a052bec3d9bb378a82478f2cdbb0f2b7a335", - "6f5087b434276d7ab78446a6685fd70c68e6381bc1d343c1c2c2f3d2dfd8444c", - "27897d0c779f276433e7295208dfe189cbd3aa30ebbf0ba413bbc6085002a733", - "796cc43b591ee063eb5af49c125ef8bd2ac4f47eaa71e8977211300dcbe74582", - "fc0dfe835bf2b1e410c847670f4abb4f66272d05687dc89b0e67cb653d095009", - "baaa588d74716e694a1cd6c6a4a90046976b95bcdb2dbfce8ea6f3b28fdbb07b", - "1de1bfe1a223645622cddd33fc7fa7a37d5023c6432aede7159a018f2d0c7db1", - "fa6191cf5423be2515fd5efa2c16c573e220eca007e126ddb883c4e6a7d4f99a", - "77ccb2f6682c19402baf146750c6544acf33964d88328974c643ec65993708b8", - "dcb0983d04f778cd29e750cc558d97469110425686c3b291647b2430b613b6d3", - "8c90bc4fe6652fb8fbcea7014fc3f19a8a4ece93c4ccf14884de073c4b793b24", - "4b17ed10f8a1dff81f2f93b9e1205fcc86b78020b4ed2aa15bcd7d801707676b", - "e7fba07f03050c91b282986ac8ac99f31f4c322b894c1f7d24b92bd31e93d53b", - "befdcaba9ebc0dded0b23346d9ad4d9d52d58e3dd48ceaf503d1588b72922458", - "1b03d2a804bd77ed96bfac23cd1f0290dfd32d537d630098d8615e33373ef856", - "f2c88031c170bf8e815fb371df9dc7278ff365ad4efcb9c47fcdd6f3a736e098", - "5961f28eafbee6c567064e12fb4dc4cc489e1f36d63cc791b73cb1979adf58b8", - "7e06af43a6363fa5d54fdeb1419d0c1d79c355143159e6eab90e5b68c19bc125", - "d9c6ce14c27b7ccb97054cd31a23d99407f399a555155334d935f09f2f2f3187", - "e8ff1adcad9281ffdab7e6b9d97182675af4563e735670af72e37f7d594cc069", - "d65dc30e2d85f3de2bcdbf09f2b846008beb8c35d3db66261c6c5fd7ed3533c4", - "a48491c25216103118e21ce699cd0d1ec0a68b504272f85a1b0e20d4de408f3a", - "994fd4eef07d23e587a5dcc587805f1e82b34063ecaad4a402054d7c4e6faaac", - "ef09a7d8a4b7f2a5e6adbeea004260418f813676c786e83d9f14ad1f24caf224", - "08559b41d2608ea0396beafce5228fa5da5836349606f8db3f4f6670fc2cb2c0", - "a62ce80fd18615dc6e68df35accb07f28218e3fca45fc04fd40a112f68773f93", - "f945b4ed311642360083418242ec1dbe0917aaef17ecf9b2e25144c3423cf548", - "fbcda0ad1d24d24dd9e064c297445e9f7ff73ad4cf2b72983981a5628cea4101", - "50f9f86acf2d08006857d6dc5db8816bd7a6bcda26fde896adcdb1df2c8f462d", - "6f765231888c583fac397ca57a29e6384ef8fc0be2b17475f8982e13d570267f", - "06c5cdf148ea9dd9d2ab2ef685ad4381506cc69534dd0000e8d79200411c718f", - "d5bc23a15edd2a39262fef887c2f713a7ef5db389778a7ac1e9ffd6dbd418344", - "eaf15e955c37e33394609f59bbd689a0d35ea443eae94bc08b0ba88b4a503ee6", - "f184216f3e417206faebee0a273ecd48470535ec60b427be4c792c830061ab7f", - "277bc13d3843410cc09376cc951633924ef79d6931551cb4dd20468072938814", - "48065da92830492b9442494e90e2eaa1156027b3558e1333b30268d9b4dd0ec8", - "7d479c94692f30e540d73edc1be64e16e361f6e10ced4246bed8b405d2657ad6", - "a14e00b51c5cddc83adeb3ea221a941f4ed4c2085107c137b5090fbbd60e5eae", - "bec54ae613799c88e77c23c7ab06d25f60ce3391df427ff4b308e67ddd14b6e5", - "2ec2fa3a4352d3aa3df55e5cedb6ee72b811bb914b47373ccc7da20807ac83c3", - "97e6e71c931ade7ca3992f824d566d493f79a8e15040471e52bc1c432a15ed51", - "badb01ac6f7a0c55030d4b69c9965e3d28b3a378f6536b6a0ddf51b138f5f9a0", - "bd3cb45cbffa943a5202e06d7faa510c0ef5ad92766160f8c6ad8b3e4ae41d8c", - "787000b6e5d24bd78346552996ebca88ce14a9befc220a39065a6223b66aea68", - "e5e8c1aef66c0da737e152b4fc6317d62c58bb9d6273bb6ace2a882ae4bb7ec0", - "2e1e74dbedacab1973044cde45db02281454713e976b7fd9dfd0148ca156432c", - "1694091bd5431cd4420555973432cb593a9c972b90a938f8fdd0db6ef0785186", - "daa13ca9c93175ce8a5e4b4af880b7f083fb1cc81c9e9d7baac873e40bbf9ee5", - "283452bc042239968952dbb8169dc248799cd65baeaea596d619328dfb283b53", - "939d06838bf2b24f8b65c09c2d978896e64e0f23b3e76a76e432a5adaf9a254c", - "f7f5685e284e4435aba9a64c9892e2cf15b5d2db66a70c284b2d080b8d2522a9", - "69242de54b6dce0638a160a3938f3619143506f3d423d389b65fb73fd87d0e79", - "1471e57e7f10ba9b0d2c191067a4773800d7e049f0a632beb7eed4907c3ffe6e", - "1753741035a70ca70be1b5a3b06333b51ec6026670d8244c1656742cb0da2c81", - "e2ca8104e150f07cf362084aa30b75b769104d157ed4dd26f0f56e39139a98bb", - "7ccd204a1e371b2daee0fbb57e42613b76dfb49cf15c7d3ea2a30932301a463e", - "13e9d7ee8952792edd2aa671d9ad32e96e931ab549f7745e5dcf7092d441d40c", - "82daee69f785b7afb1d80a89bc075c593b949d8bc5b0fc8562f9cd834fb873c5", - "109894f051c76dba92c2c4fa7c71301d132ca519d080ca3d847c7e2cd1f944e7", - "82a0929d5c2f533bc0bf6878bb8da76818baf4e4b5a92fc3310909d34358e8e1", - "8aad0ece0457a68f047d83f48d885dfa7045531a5d30ea932b286ae449fae104", - "3bdaf452c97106afd7bc112c539420013cc8fdbe126c81b39eb30d12813fa204", - "7db899cff8e3e645b6681131ca57558ffce846bbaf6a09c1be3f74aef8cd3e83", - "a173a5f95751c1514154efd6c3aa1e85a7c8731b88396fd06eb05738d438aacd", - "ff7c4f7668044e1e4136b309e9f3f2bbe03272436453b88d96a22015fa721da9", - "8c2d8d5854b786a313090dc5d176d4799ec09aaa58866e85aa27e541e24b29ea", - "76489e0672e836021c8affa33e60e38d2c71eff997e77e30d88826afd9e27819", - "d34e293b08877a47a8fab4b5474ef09f6bf933c72a9508da0ccc4b79a2d869c6", - "fc964b0587cb7c878a38b489687acada7a68b972913bb664ecf9e2b189da9c5a", - "4297465b4c96ef46f99043884c6ab7fd5851297dd6f0086a56e94ce88592094c", - "64a15f324075ebb69b82ce09a02a378b42519455c3d265a0b064298b160c78d5", - "f53ab872a8b9c1a7afcd44370f643eba9203110e3292b58b0151a38d384aed13", - "1a2754e2adf28f5ea79543933dca8b8e670b278688ea1c03060453cbb1c53536", - "7a3800267cc2e701080f52bf8080d3d42406dcd476fece7b9850195ce7736553", - "3c306ce93f462b6975fc768b04f0db975d7128c7b330ce0698265bb41a3f4054", - "bbd8e03dd365f1607a0b6e6a5a98c5669149eeea04d4e683cfc6b7e0ea10d96c", - "7634ed1c58006edb506f93886f75718f388571152b775ef96fc8c43975cbdecc", - "c9557c90facc54da63c26ed97aee01f0ca5c1998a872519fb032d340b56466c2", - "03e29a24e0341e4ab6230a5902feeeecb64b98cdc6a3d2552134c0369d752a47", - "59e89d529d526a42178470b3b750c4728bbef9757367aecee01eb224a7a95292", - "fddd53b6fa84b09bae3b629e515c2d7dff62a322b85dec7a1a774faac3b8e888", - "8fae17a7cc05f1d19b0be109ce87c419d4896cc4d6fb027bbaf7794606a966d3", - "ef68277dc5aa41e314d9faf83924b11f6207d8b4a990dadd96839196ceaa5812", - "f908ee65e1dc461ce19da3a352003c0db070232d17db839134dae45ba9d68444", - "71759740ea3eeff3d1b7f23567786bb5cb11809d736c8c39957a462914d20bf3", - "9096d33fa19cd86b4bf9567bd5f36f8a123e0224f83f9ff9bf5cfac48da95615", - "ef75a30aa30344cf804e12a5d70b54663bdead7bbe0a7d55fc1303cedde73aeb", - "08d548a4b4fd32e365cfca71d3903fc4226db69aae942068974a516c0ebb6f8c", - "46e96a91d62019bd1bc4331dafd7e50aea2c2303d807ba58eab6a09bb207c7d1", - "6093468716b69449747a00b013998e27b5de9845fc77bf7c02c5c9965883b7b2", - "20d45366655a8d2c899911d72da3900efee158c5a3608e34f7fa38eebb9010f6", - "236262df2d4990944d9977e3b8a45c600bcaddb650a4afe9a6180b6131753a39", - "217fac95c357a4214d809a800cc6f068efdc350b58af1477e94c9d2132d4ca78", - "1de9372895b3095ea0c5c03ee0a597aa00008a0f02e2c80edb78302546051375", - "9e5af0048d7145de5ff0a71c4f8ed9912bbae8cbfeb8126659532d31f54cbafe", - "ec3fba933e7df2ecfeac89dbd8b2b1f3d85be650dd14de03616f66ad5a251603", - "f4f15cbc19dae0400fa19cb0193614c15c6aab0648419a35a4edae731abe5857", - "01a4d3be317113d01dffb1f790ab238a014e472a9f1ef0cd28d794d93c55a60e", - "a45d00c6e4d8eea115ab700fce3c32c31b609b537bfea8f7dd56eaf7dc7d1e42", - "57af4eada4262877a1001618a57ac616426f67780ce15531f71663d926140eba", - "37785030bccdb61d4a6f219f983f6fa63b99eeb1c312336c17979c7bf9c6e73a", - "6d1d0689789f835f8ed6105df29eaa159ad14338f6d39de69991c5eeb95fc30e", - "b28d288ac2e288f0c0a8581a1b4004f7ef22fd593e8f94eb86e466ce9714aad8", - "b45455a7d7f39f25e293c5bc770b7033c5145904d6d3cb5d25d750346bb4c3ac", - "e3d20c0900ac4df66184f246bccce687b006b7d29e30e1f759411e692d8f7685", - "730074af4fb9301549e9dd437973677998c0b56e9279fbeb5fd781197a3f76b2", - "d0e548c67f4b9bf7e985d788b0bf4b5e62fce9e930019d0c995636f29c8d2712", - "cefc09e5a8e459f0e39ab287ff8da3861483e5b908cd9e5510b954dcece062f4", - "610816bae9215d2c1033215a7d433d592745b0f5d914b8e57bd7cb95f31a07f0", - "cde24cf664ea97d8f6a19aa9d9b51d3df8e529f1f4ac8fd92bfce3f60fe28fcb", - "6df6aae5673a2ad456fd681423209ee6f0b456bd19c955239b4d3ad0e49f6ff3", - "981a0e249bc0464558fc3f51b23c2552db2e6d767f87df798622f144dda292dc", - "5596ed83ed055f33429716996e43995c15e2c80591dc3396bfd2529cf81957ad", - "686a176b40fc792d4e12be81568777f7b81869bebca9c4e6de20479cc213009f", - "5020451685881ac9345415c15ffbda4ff6c8556ddea4d6e53333de8ef30bb282", - "9864f792551b118cc9f0bd7e6aeca776868cb85c401b6254aa74d9591385c5da", - "c8b8e212bc695b94fb53e0a92bec7077b4d34251aa8c76ae1ca10f3911deafd0", - "a910b1e4bf88b8aa700398755fba49b144e79c153438ca90cb67e7c4d136a9f4", - "bdc86ac07e02551136a57a561c84ddcabab72c84061971504765e40fb347e828", - "2c4bb8768fb40b95a8e1983c97ba4e723b301319439fa44f4d455a5a1410d6c8", - "c191de886e7a18a2b7281b5a449840de11ff81988a9c061682517dd47a9a50ef", - "bd6b4731cb35371f1c26076f5aae7497926f4f7b6d90d9b58f765480b4abd933", - "8544a21e08df9fd3e4a19f94924c59e8b8bcdc4efe60270a70d4d90f01f66827", - "53f284907a882c28cae3b3e67531006d35a6adb1f5e69840712a2d70291eaca1", - "cd3e129258bf83070c0ae887bc540e9923f37e2bacb3887414ff355383f9ffd5", - "21bb060e45fd69c108238844e89d52091d51ea4abd69e682466e06f170739ad8", - "37524fc110f5f2125fb2603050c4f79bd7a38715b09a1625f52bb034d4f37e64", - "1d37d2f62688550ca23319e560cc5ba55ca0ef2ba6f3925ae28fc47bb9604bf7", - "e10c426d825fd8d187d5d55f2b1e0401f815d3ec8af2ca6015dede867d05f852", - "1d84fc2f75f8fe72857c1167272b3989e39bd21d4220f7d8d6778dece9934407", - "2bb53f6fe88eddedc2541f8b7e9594e9f48821cde7423955991c484dd1df8798", - "df6a0fa8a216860de371175044beee98287b112e67a185b46d73e936e35920fc", - "242fdde2370832ffd4eb63cadc90f4d3babb07cc96bfb9fa3c13867dfb3a3868", - "e4aecdc3bc9aed042f205038edc494d3a94988cfdf6fc5bfb7d17b6749722bd8", - "96b5adfb7bda542b4c06ac3597b7319517689ed0e6570ee37fe2ac8e988c37e7", - "7c42c8418166918339526d971052b0750d15824f81f5aa6e9f7df37ca4aecc62", - "3d632a414ea354e5b1cb6e249259a423500b42adef423b3af0ebab7bbeaf58a4", - "1e9b8ecfe94f791cce8800206f2f8c9a4b8826d52bf51a5d839fd204f044ad6a", - "22d2114c325316fdbc015d158e3c249c702bf81e4525c85c16f088e9741107d0", - "5da9cdd4f616ade5056f79de45686ed30775133d9dd47bdb4714a8fbd9f33677", - "cef5d46c3a2254fdb42132ee87268e48a708ce1af973e88edb033189e5642e49", - "3610bdee38d4050608274a21feda07d86c9433515353b041776cd85f017e13ed", - "2b99fd05088a51fb2731afed05777f5affd5dd24ccba4596a355978bc07dae15", - "04131ef17d885a26b05195830159eb913dbb13b28bfa1ba947c1c4f912cfeec7", - "927a91260e35c51a67dc01e1494869e117450c6aa02f0b047234d4f393ba65ec", - "e599b3087ac011410a5afc33b0b6ae24de0e0b22fba45b4411bc8b6a9b3a8acb", - "6b8129fc26abe11a30dec91baacbe5648e19fc55956716f2e8c228d712859f40", - "5b6df6cf2202533919fa4ca3903c733bf2b58bd8c982fefc95793ff98d5b39e2", - "0d0559ddc3274c37be5f4e388c89797a376b4b130fc4e2a6ce0ef91f2243f93f", - "b9b8089144594fbf6045e7011833b210da95e607eca1304a92d2863e4c36e9bb", - "d14ae088a12a3445b7d57a4f5aed00cf03df0f88bdd6b61a6ae114756973640b", - "23ba70b3438d522e275687c9d52533aac81d0ee6b6c11cd25b15a2f9d84dd0c7", - "d95987ca54eec1e1e100550baf4e061057e32ef2bc972cbd1ec608d3e3d5d811", - "33ffd12bd17d2d0be36e5d0fd731ed3a3a9b50c106bddcc2186c20c1ab016548", - "b3a5811d628203b96ee227a8dc27b773973a8e10482c13783c51cd4b74068f4e", - "ce9b4d304b652d2438d5197f059803f552635b200a71e704fa01ec26e1e25468", - "8a2e23345575879a83d8071877cb7f2d2d92ac28407f47c37bc6b2e938b50bb1", - "1e052130bd23c7e7b6d389dc69cbc0883ee285227929b7fa175f9afc3817fef9", - "d567c25d577ae61a38219b82d4c9340ed58a055909d259d2f6918326f0ff6aca", - "5c936bf4c773bf3ef546803211e5a6b62c3e9b87f1fef06a3b277276e5fba432", - "5700b33b0b8fb2a98b1f352b441518cb752f94ec1d20cacb57d45f3ebda1314a", - "9b5f7593e33f730677be5a00294774f6144e6d82c12fbe01a4ad076d4eb7429c", - "110d21e0a4eccc39ab4527b9fc309382affed35337b8cbe49093f113eb86ac90", - "cce2d828e9497f248d0f32bcbe4881048d4829aef0ead270b0e75277e9e25ddb", - "10c4b81d3cda84735b76d0d03eda0c80a2e3cddee3675a30f86dfa207aa1ce7b", - "38c8293e9da2784b50d5a85c100531e68d0540eaeb0d3cb7f704ec2ef21520b9", - "1c10acd0285b4bd3f053ca40f30d3fc91b1c1a54d2119d8b0e81b7ccd2efc4da", - "8d8ed73ef3002290bc319d44b0da6c2d7a8c720752da91674adc5cf3ab6ca95d", - "cb21f1edda4100ba6243e0f2e693078a9acb4641d0932606f2c44ff69dd6f302", - "b32f2bcbc6ad0b66096b9d1caee494962fb31d2e9b5c77d80eaf8c86ca98dca6", - "46b44c9c767d795f49ce880fa5a9965c6f59472057e26a821bb6bec5536b82a3", - "76d218acf56a090fcb481f588afb5d65b34cbf516fa2629c233ee1a4601e7a04", - "7e317f28b9850446bc404282c38fb27fff6aa887d3a77a1c61ea98a54f9a779f", - "30f6c4c047ddfe09a798265efc73c50e74280c3e5cb6e301ddc32978dd254444", - "3beda168ed8a70ed133a434f63e491a21e4f7989c2d22d10f1fbc7793e01d35a", - "f6ac13f427f0fab18a51ce87d9be20753d784a7bfb5825927a6152cc543a56cc", - "5d2ce94108828a4100a9f232a33e1dbef1b73182f7ec65e7dd2071146a8fcdb0", - "6255c564e534492b0045d99b19d6c45894c02804d745cf6deab7760542dd16d2", - "3696deacf038a1b7d029fb7ef7a9b7b36fd785a9ed4c449ef82be8641c7adcfe", - "5bb531ce2703aedac524ef1fbf1b9bf7fc6a428d8e428e4c7e0e87eb8aa448a1", - "d27f1575b41af3b9d53a9eb5e5c085696d493a19b541f2b02ea40731d31d6ec1", - "1d3d933943d3f5fa5c468eb136888ba198af376edc433d2939d43127a670778e", - "c36b1eb2d46951f1610f101507578290d227ec43fe958132296919ece1af4095", - "325d61f3b05b18450723ec5c5c76537064d467d5ead30fc9f1e6c25b596177b8", - "a7fd6b566f48302dff488328d2587badb6deecc42a10380cc48dcb7dc724ca2a", - "5441a507175aa4fb39af484997bb48b9fc95f2806a1d6388a6b4581d663f1706", - "0c49211836e4d35e9f5eeb2d138e5c9ce993fe146085f5d038c7ace8a3bf49cc", - "1e22203320a3674373ea86bb7aeaaab817efe57c6f8444ab59ac775a1db5a649", - "7ceae175b1f1e5a8b04353441298cafac722517e1fd3a12a9bc465f138c6d0be", - "712cc2122da4f1dff0fa091eada6809a70a6c5038f94177428ac456ce4b5f034", - "a4e03e07b2859a8181380fb275e27003a5779113987b1a7c2797560151c5d9d0", - "441e476e4a75b5f6e13e649057fe38241cadf3f9a36597795fd721158cd9c9ba", - "540da2175bb1c890d101c55da803592df7bd3ce2b2747ed733d935570632db8f", - "31e5b3781381c13fed39157d9b7dbc4698811fac96d47a46a066fe16d137395c", - "c0e88dc1fbe857272fd7e3fce865ed5db038d1ff434508a2a9e845c85c475758", - "fbdd60def8f867f09bfe2a4d1fcf59d4c4a2a35e76c3bc4233162d55b5a3db07", - "17abe6033295ad41fe876fbad4070f9904ee72046bde1965ed71a00611ce79c5", - "b44ca06c5672dd783005a52617a9763e6c8cc9a3fac0f8f11b9966635a02f0ac", - "4b47c0f12b331f0e818a87a0527c3e9f7f9f1ea6edb06bcb67d3965d927d29e3", - "bdd4157a650f6a0ef402fb6fb46c748c5b165bb9da7fea0f8ef7cb3075d8b220", - "05aa5b74636e7c0eb6b7e30fed0fa85d0df814b370d367ded89e6edd817ced9e", - "7a5efaec92a493b402afa6c0dda7a388fbb40b251d3e8fc476a6e515a8406db7", - "94f679a6d201179fef734ea7025de07bd1c5ea294b34d5e65cb2381d627fb889", - "43fff8b258cd374803276bd8ead6adb90a8f34fb44ca7cdc0f0435a6cba2cebc", - "ad201fd222a9e5a03b70d55ee0d912becf1d6f7c7a18ebe8edfc60e6d4713459", - "e3b0ddd61f84264c801356c71892d6a1895b870cc9ab9d295d416e8ded878ba3", - "f78b0fa03148f41eb6c899697022c5f341496ac7feed9618f8c9fbd6061b99cb", - "6389dd1227b0db8adeced0e94e60a09eca8735bb8638a604c452198b56eda05e", - "e10799fdc82cea1420be822af42bbdb6cef1cd446bd0e6f4d69993c5ea2257dd", - "19f23ded207c88ad73316b7cfc883314e2006c303008b8ab870c19fdba5ca130", - "2912ff75f5965d0a687583fd63405ff0c0075ee3a2e5d8eb44f9bea07e4d8550", - "2dd7e7fd6549134e34411e16153f07372f2a6837daa9a90128e5508c7c1cceb0", - "a7beac3a9f1769a85547b9666212eabc46c665d2336ee80c6b67dec014bc3be1", - "1633be10675aaca9666eb03834f5b429cf96bb91891f2c1ac556f274c43cc29a", - "297e35f4962f262f0f996194581b0e649ac85acbfee542a3b5b08994769bc317", - "36eba87a15be531410251b86d1ec384ecaef7757016ec2c323c01a0a1c13663f", - "28e2c98f7b35ce67b5a616c001a0a8a9a463cd459fe01b8ab1e566613751bf47", - "498fdeed55dd172da9f83b4985f66571af16826596582edd379261f9cc07dc73", - "8b8d31972cf7e345fe73c7c49718e46f7524c18ef06254d011b734ec6eb6a123", - "d15dc3fd45148ab4200df7e2d7fba9ca335dd6a8eb2f76956c2f9c89462a571e", - "264489ac82826bab5150847618d0221fba9c17f0617e1004e2c27949569440e8", - "8d1e66d3e771c1fffc64522a1c55511b42a4999805c22c6abf253ab48560706c", - "707728db50699cfb232bd3960c8a7dca403a5b8c7c674ba87fa254fd73316822", - "90a153cfef7ddca66a9fd81d1787277d375ace6c860b4799cf0e035c8abafad3", - "8b35484ef0302ece022f8770253729f27f5d5c18fafb46e54c4a05a6b7c900f3", - "fbdfa05b4ed77727fea7c241a8e7998461e5b3751e545f9f583b62ab9840b66b", - "6d4a927026c4b47c16caae7934a529714279b91e484696a98aafed4b0d869309", - "ec7c4f9e498cff46d82229ffe9deab68f7c7560c495c8ac830a34523945b2653", - "2b5e16bd753222c6827fe5d953e5f5ecd5377e6e1ec2c15618dd4e6ce8cf004b", - "597e363ffc4f6839399048308ac85c60cf2687308a289af32586a3f626dfa701", - "bf06090dd5572adb5c529a0eea182c33a68cdd2a11bf3eb1f4d03d740dc79f1f", - "916405a3009beb8475a38784a955a04af5d4d38a46ca0d9d6ea46be3313923eb", - "bd13fc3b14cc5ecda034774732e7dc080b4890072d45d342ef3ca20bed509b30", - "250a0a01a22cbc01dad4a0066a20a977f0181b0553621df2c2fccf0f4f14f7c9", - "d21436173f8965e8468485c16cc93f7517c3f867c8db6b2a4327e5a872828c3e", - "39a8a5f9c8c3c69ed042b0f8aed976a0e8278f8032f6e378386ce319e8d0271f", - "37840fca3ce561748f587ec719b8cb358f0346141ec04bd2e3f72c39ed6611ec", - "90e85e378ab647af10cf2c671c14e2159507198813d4292e57d1becdc915df8a", - "7a335220a74c75e18c040892b382be17b5d14d795397045ada80711a238f94ff", - "b36d0a534a5836aa5f9317a6440c47f2e6988c5178aca80ed5e837586a0a317a", - "f3058dab6fc92bbe7047b4acc27c507ea4a57e84f3ab9acb1b8fc36e2b91b84b", - "27445106900a75bd7bb5da7f89f74a8475d1efcb38c67dde164dd77350a279a7", - "915552cc68ba8b92b92604fdd639cddb4206dd5c86a33888447597d7bc470eb2", - "3586f7ff8b429f327e7707495ca4c10db34089da7dc3500e9cf47154a686943f", - "9af5fcfc022d11618ec300438c5f802f493cf03e4f71c61c910692e349731b83", - "21d49187e701eced1c89535856d4f68246d490072cde0b4425e63c76f02f7739", - "a322023cfbb30e53e620c2328fa6fc78f6c58dc2fc863beabfecd877ae9a35dd", - "cff0225cefa3521843b6428581ad3d4ee4cfc3aa73998533a67bb7ff63b1f7f3", - "1e4e1b09397c94a0bd6b2347f6b4bb91831bc48dd15995df7f8221b098f87352", - "89c71752df9cc71e5c4f5f8be3d3a60f7c268a5972eee3ff7eed6b954c881623", - "8297aa667c1a9a00ded3c2c4e696fe0a15a7e65f9142f981ed9d5e772efc639d", - "17b0788303e4526693e872bfb1a65a86de837c60f7f33f5a4cc340bbb0e903dc", - "0f8b6b38613ac7887765f2f3ee5a62e5e63e5d8d19812344287949d7a8f8f7df", - "66a266b40e24c1f8c746f1ea10cd1af128d369869cc4efbe68b9c84029f52041", - "0160ba61267c599958db4cded1d3009845b7b4513309ec589d4a9986a2cc51c3", - "c44d6753de4c279bd5a249b3a9d4a66cf93dc0e6c3ea8fe4055dd12ef949ec88", - "921baa70e97ade7df36dd0ab366b582942b3a205c5f18f6b996551962b121d81", - "29c13e5fc54647e14e7c0ff240f5059d77358f29d5934d9382ff20cfd2c15ec1", - "82421997b1a189521c932504e6d680c9c7f1264a76a8873a759b10408084af56", - "82c6b54b211342c18828f3ce41f6756d1a61587d53e4c50a5c87cbb55e3ec818", - "70b38c1c676efdd437935f032624f2c9441006fb497f35397a66710958abd023", - "b967a8e54ab9fdd881c5156cb4b81d40fa319b1b6c5742b55f0ca994c646f0b9", - "a8b9af47b2649b7c693c86d63b0bcd5029f34a71d170eb656cceab42e079eebf", - "ee65786dce5979e3e2ff228971b11070fd3f7f5bbcf2fcb96cb4bb1f90097be1", - "da2ecdd389a6bb158981c82fe9f82987fcaee13fa5b70c8c27e217adaacf20dc", - "351dd092a28e910ec0b8cefc72a7cb90fc5248de2c6cad6573ceb1650c623af0", - "0848dc755daf1749ab0dffc31b2915ac73b821916524ab5f678dcfbf0b372f31", - "659be171c21bdbf2c7d6876a0c67887078374e5e4fca583a7c59798b97e9d31a", - "cd612043e514d1025009348dceb4527d8413adf82855e18ed97a35431fd75f8e", - "1e72d1830389a9110001d638ecaf74a1b48df7aa709b03bc68c8360148c406e5", - "a265652a245349ec723627cf6f1578f847a5e9638d2b63b8449453ddf97e04c4", - "203a7a7912ec71d4e308c1c5d5f3e9fc50ba85ab1585bea638b647b148a049c5", - "a4a1de8c6c7de5b202e5e949f740eb7e710f7d53c87231f6907717f222ad8ee1", - "35d05f32855269ac716983d1e2f270a4f41123e3c86c1814b9b4d2a53f14ec7e", - "f9668c080e7684414b4fb6dc953b7f007f872098c99d1de27ea9a65540ad11a9", - "a43fa592d195736d8619d6f5e1168b2237c289c226e47d9cf34d3f3b5399d175", - "39040271541c3bd24bd2c0757d7cb009e5a485fafd7b315e14d32e228402c1f5", - "582104a2d38753954856843e8be5388ec3e75d78eca3f80fa3bbdde3abf9864b", - "c654efe7e5256edc960222e9d42293555eff8d8a9531c201f012261ddcd1cd48", - "28f746347c6fdfd8508746f8fc166e0c001f3b088fb79b49faa5f19b27cd93bc", - "431d61cd0f50e060a5df7716db38da29705530f344b988645e5b64642392f57a", - "6e6460e42b840e3b75bce2d5a69b3488708b60bc06bd90166a10dc1fed269d32", - "ae796af2d2ff7efa65d86498ba68490018cf327043a9072bba556d2f8d2356a7", - "05f7fefe53dabe9bd24979bdfa7853d374375e48ce689ae8d5e7276a4a09e894", - "7b6c662973db2eca6c4f203295df8a2aa74cea5458a57c39e84ac2bda05b8b96", - "1d9cd7904993f623700a650b0a9e4a4aed98e2086c72429ff2bf158750c5999d", - "7f952cbb4951f4a925b12f7c43574de6c7e595f59d1e8a0e53520e8bec1031d9", - "286a86bdb7890e5a924c7d815ad46cbc847fbd6ecb4ee80df6a5ca38d4460be5", - "627b51c8aa7235bd3f288ed740378c53120f05a29270fdd0a601b3819e837f7d", - "10e65ef15c7313542410bc61056a858c78b0ee0ad4d0506a8cc3b42989030481", - "20e43e5c0ee1690cc5e948a752b2df682cd56889afec7b6726ac75dcfd5b4b61", - "2ebbf63f185c70de196e9b0e481943d05c200b26befec86d96be13bbfd83f126", - "b26812dbce0380afbb46079203924760908bb75890cf0e5d986284dec3a62a85", - "f1afb37ed4363125f375b9f7d13840cd9ea595e946186b1aa4d0fb2f86a440cc", - "e04d002492b852fd57f525ab688ba63c60b69dee26fe79052a81ea7261b62ed0", - "578d8b7a3e84b9e4b3f13afd25cf3348204fbcf87bf8cb89186fd6e5a908ac12", - "4cb4800dca4ee80c7d5808dda2c360e0a076b36ccf3547a5aaa146635542f368", - "54faad8f4bd5e41338364e4addd5a73ec0fca337f5e7bf40f7aa99a9b9ca2cdc", - "dc4063317c4525f64c74233373b26d8fe10937539b539bc4f802518ae56238e6", - "1fdeefffd75358aa8a90af15074f4caf6253e883ccb082317ef44e417eea9f6b", - "2a202a535c8da70bbb0bfe05629b2a0599f0ac0355237812cb2ab8b86fe74146", - "5b4278974c83e175a43140774154a9787f0915d34ff13a6479d88995a340bfbf", - "02ddd3ec90f980705d43499d7dd600a4ef1f629cb77a215d01c0ad1578e6dae4", - "5dfae4020ed5f7d6112c90e0276cf355c3f98bbfc889c99cc6120b19ec5d2bd2", - "81ad29f9ea642f38058f89781a9b77193fa4c34c3f64ff7d123a14234f4b8be7", - "e33db5410b4de776faf8fb039cd9a75c42279f7d8df08df074f191ce740f040e", - "67d709c5b902bb1a95c19ad4fa2bd24b24c03afef935fe06fa3f9e6241f25bbc", - "023eaaed0eb6df03a73b363d06deb790380a3e3729016c3e95956cede3720a93", - "3267495014d0bad6c34f359f6286842dfa9801ba5ee28948f5d2da51dce727e0", - "b2fe68f05c19ae6d0832c42777b128bf9986b03aee5fedcc79e95bc8b9cd3b8d", - "e4a9a0e6608f4fb2fa247c0ea195c6924440be96ef5f765c33ca57fa2d90968e", - "c7b38038592391a90c35b59b3d780416aa1b5c0d2143c6d2c3e8646387f393bd", - "d5ff2260315a480bca3225a7dab1fa1dfa6f6cc83c7db7593496d9472f5559ff", - "7be4f627712e4dc3fb0c3177685a682735853aa918d59b47f77f1f43dade80a9", - "d9a18c63b9a76a12e6843104c34d0cccfc7cd0acaa1d705e126dec6ae6ce471c", - "5496ad4e2780b4b492efc64662238a36fd846dcb29c3d2a69bea7f9d86790333", - "2fede6c8ccc3c03f6a3275a8c3d34d20fb6904ee7b0f57d1e5f1a9481bfde97c", - "c9483cee079f17b66f1da722129c0efcdefdcc56215e511bed6a81bf4af38ebc", - "6fc1f5790af86a066ed8fd7e1aac26933dac8a345ecc3e2fe82d5c290ec5508c", - "4331fb5ca5c2ab0217d72f7850c876a341c261bc6ad1d10d83ca9227214cd0bd", - "964e4fd079152ba025d2f9b5561ae6855b4e3ff8776ccc0534616cb63b230e81", - "694f6fb3fdcda4f148a3ea1a339f77c2add69fbfa5f5b92c527c1b0430740d9b", - "d7d1ad6f276dc4b70f36c7524686e284f048c4ebc6a0f8a644c656520182fa8c", - "48633649758e6be26239a7bcc99fd30991281b2485f830631745d200a4ab66eb", - "e4c3289f904a6cec174217fe125b2d168fd0991a6c3a8e3fc6be98853a5348b1", - "d125e47a59b66e59cd10f93f585c59b6ae0396b90790d66e6db09efa9074f9ea", - "d2636c85da942cc2b095e37bbc5b9d0d629b570d01d2346c9c17e2d85627ef9b", - "e25b32fdf3a98914041e0a0b5e928b0d813e299edfd3abbda61f78771b526898", - "c4d9962dd36a4331f4ef70bd5efd66366bbf4250f32d36c986d498d31b6eacff", - "83b422937b76d521387a709a275f1318f0a3b0efbec547da46212d34dd2017e0", - "4bee18cc1bb75c4bb293f6765e529cb1a809d2b17a3f39a284be2641ac3c5493", - "2aab1806dbc24c465ccbe10566d1a3f37f0ac1797177b064b80f3f39cade7a62", - "dbe364632a0314194c42f0623a646686e46faff8fedba69bb83ff942f32f4482", - "67bfc73f75523956df682f0e0317b282d42932bb70ccd1b8eeffac94e199e7bc", - "fb7ff46453ad87172470079dc1c875a6a62907b4907257cf4c1f9ac0870ee08f", - "6b428dd13bab1e46d3995b0835eede3443fb82dce46beacae83a459b9d8f0318", - "cc942caa38fd1fec21b422cbb230e841eb9fa08bc11fdba538efede8d985c4e8", - "d4d9dce673fd0c9e7eb0e4af14f539b9a41c0dad6686bba247b85b8583e70d77", - "247643fdd06b8b9c59cae9c05974977e1a5fdecfee6e0efe403c0f4a49203fc7", - "94cf6a62316ac590b9b4eaf7e96eb50836fc6bea8e1d4a08da2c45c8797d8142", - "3e3d990200b60085a4e2f8a6d848a676775616600284cef6b7d95a128ffbb86c", - "93886dc25a8eaedf07a9f674db85bb725ce9e9a45087d636baf8bbac7b05b96e", - "4fb04e6f11eb56d3b84fa9360bb2d0af127ca862c6846e5118753401b735d3f8", - "e5ad7a582c6c5074c2a51faffcbd621b5d9faec7544d230fefa7716907c6b61e", - "67112d675c4f1f82afcf666623594e1b4e80951fceeb3797ae42c103b1b0e13d", - "3745df7e2e621d21345f51df43940244085480763780e14b27a54a53ac4e562a", - "f7cf8c985925ea99d7437ed6bd9cbb8c5e8b1c5883a106830a0a03056893fffa", - "529cacd44d72b1bc30c58904395cff90e081adfcfe4ab9dc4e39069917800635", - "0505c4965808072f807b865a12a6eb8ce0179bef080ed1681c7a43736152ba92", - "2e1f703838fa068c005ff505272786e28f9a7c7e1e48b7385282c76c3545b50e", - "85e62d05063791328ef73ebaba4628b27390b972fbe978393f7892cbf077a6e7", - "207b85802ebf49436c7dea19cd329fa83e305c31344bb8ccb54b11fd28cd7188", - "8101437005ce9dd47321e0206d83324f1dc4cee82d3f9fc4b44ff8c7d3267dfb", - "b1dad37cf48c115f6c1028000b126b2e5fe47e9ab42de1e8e20804a5194ea474", - "437a89ef5b214f581b8907fd7f95f259cd6dea34c8239dbeb56a131616185a8f", - "28d02de6dc2f84af09d6db379a61843726f027469930e77ebb6407d0995ce602", - "d2523aeb735159f734fc896d8c56af9a320d46f4ee7696a01f68889809fd375c", - "1b486794ebe375b4d2cb9caeac26cd1afbfa022ceb1263f8b0cd128ea8c8c6d4", - "ba0280762f2f0dfc61f457fd3a8b31febaec03dc97167583685e0af83cb28501", - "f928ca005f083511ac23b34fea66e55d43edf51775e5a362ab3cabeab498e03d", - "383ce28429a92c62683439ce0e57f5b3f9a2b0b926295ea57d002ea569189c34", - "416e59fc6a419443e0e294f38081a392c84f29c4b8a488b29d1727790c6a7a87", - "ebb5bd7b9f738bafa23a26d1572a4c5935749eedf09eccdc2851da1d988701f8", - "993207d1f519cf46a1f0b0338ae8e7b275d2c90d64fd4da15ff59d2c3e39cb9c", - "b0e656b0d5288794344c9c5fb785c855f0edd329c08dc8b6373040964f972dd0", - "41498be247a6760f5d17b5768fb7ba2709a44e3a1f1574a445827981bd2ee736", - "2f45312ec3ef4cf692003bf91ee7a033bb19205581175b269a08aa950ab778b7", - "036a0db3f6246898abe840ea5b1371a2b8800c254b4eb3d8e66dc8cbaee69c79", - "ad9b7d1acc2fdaff1df35e26be33f7a9a6144af48e72e96c88cf58ae3f4944b8", - "64d6ca6ae599d8d50414176cee622aba8b946a929fceb2f0b09e905e2001eb92", - "bcb983aae19a4b76623330ac45565389aa36b18e9e2342fc14cff158975ffdf5", - "dbf60dd7c7f5892422806a206b53b17046e625104a12c4ddfe5c7c195b8e757e", - "bbdbb57dcbfc89a728023547d27883a93745ee1a9e81a299ed884248fd53d4ea", - "b893d7a60e8338ec7987286dd9b1922a589cc94476ff90baecc6c69910e8acd4", - "5e1679a937e41d200b97e7cf208826ca4c0fb3794e31edfafc12521d52efc9a2", - "b221b840736bbdf188aad0458d0d190fcba2a8b24f426c2315e2be15189c2f40", - "ca992f2734f6cb976826525d130e819a707cd3cae1d58c8cbcf1c94dc87246d1", - "a2f60b4c9e023a0ccd35c53dbf76698a176a3a03c5cd4196de9deffbe859f41e", - "c30e6b9c4e77295755220b420e0829b92e93673755685aaf864279449c9c9d39", - "21f0eb09271a17015fe2c6fab1402c23bfc4ed7a3f0ec1d277bde7ea79347a03", - "32c8f94c08bf7d2936186dd6aed486aa6e0af01fb70b4b0e1261de51bdf51a25", - "a89fcd87fa5f4359e8fa4d3bcdf00fe9fac9741490ae2bae036b21536f290b0b", - "a60d4ddf2e91d67dd790a4fb1bfb32c17fddf7bef89d33a5c5a841a61ffc540e", - "e2798434d6255a2b4c259d624b115b0056eda5db0842440e9b3493e7d39bc213", - "dd74679c3229b3b0dab3bb546223eb5f8124a16cd8863ca2ce2691aa1e0ea484", - "058a7ece50fd0f82266d5dcca099952203db3a194314281bb1aa4e3e3dfe5690", - "b5412d9c51d5db34e7308974b5f5476283343c23c4c39fe2eb76f173aac7e7e5", - "775c92e266dbee1de93adbce9109b1144057cf4bc7d8b446d91c0ca6004ef207", - "73df8f0966559580a74ea08a7390f1e6b0955b44504ba7df6d112804230712cb", - "077eaed64002b3e9a762d898d39668dff88fb90e63d728c3c6b35c09ef79680e", - "a7b5d1919097977ab549f3d63d3641d5958f7ee474faf82113841be4d2bb57b4", - "c2f199d93842bdfc597007ba3af72d30ce1ed7a40e59f80385d4031be4eecdfc", - "0cb620a5f26a2f6f45a7c3c4347d70d1801a8a30151f49d367291452ec3e925e", - "b218c40675589aed1798ba436f63b369d4a7032341ac644525ed784da9af4da4", - "154d56c0a8359f1efbb38c7548030f15eec5c28e2b67ef9a8c33633e67a3131e", - "399c64f60bb522baa40dedea329fca8965c91797f6d9d5ee55f1ac6c397bb4d7", - "0d9318179345dc6678823ea0a48785f8acec776d56b55b5e5ceb065bf2c3c70c", - "829920f4d2995d3c74232591cbc761315d4eb734987923c1da6446c38e716bbc", - "adc71f71fc3f90b385b342190fcbe980154fd2b9f814ff6963eb9e6b1e2fc35d", - "67f25c9abff0952dd15ea4333ad774193b8c125e936e575ad7ca9e61266fa400", - "fae27f9f592a591d221f1239568364339825e2ab37ba45346d11b87cf4ff9b1e", - "1aba17afdfd9d080c96e504a7c3573d6f9c07d143f9c8efa578be0e25c8058f9", - "8b4026439863f862debc347bca90dd8b5d130b308e791005ed47a2d9c0ecf0de", - "305862b7a54ca81362935c3bac4ead5ea07376e9431037c039da414bbca6c3ef", - "98392d0f27f16d1ed8d44b821209f14973c42578a25a210e00a40d158d57f304", - "c2bbfb9b32c0ea1b0311ff5d808b72fcf41d362fcf9b5332eaed07f0b754fdbb", - "476b3846127ab0a0dccd8c468592f208bfa251340c799567276899cfc72938d0", - "bafd540660ed7a59562efa287a713e4837ea6b7972ad064549373367c0ee839f", - "e984de4c6c409760a2e8509d0d9b1be2085ad0f9ba3b3ad46e38d657b50a15cc", - "794711c9f003939190d57b202dfd00eb02581798ebf0a7696d54747abbd4e92c", - "8dc901260d5dfee79f167b680db4d9b3807ab30d2a03f579000b3666a2d607d5", - "638c50c6ecee8d470e3c8f12fb10189b192b6cde748528deba45ff72859baa48", - "636aa9ea1840578bf6c453404211f8bf408c867fa8ef52453a98234a098b6abe", - "ca5c05e954315cce6e688dfac68407a235659faf41983223c75087cef6e5d017", - "d61bed90eaad9f9e034e02e54100540a5f103a4e2fe72b68f996f01063fcf8ab", - "d774b051567548e62734e2cf3df21f07c94005ffb6971bbefc0257c2993ed0d7", - "0535c58e6f0539cde90dd362a138cbd3752a54595c8b0d95d01305585c7964b7", - "db5285a67e18166a32de69824b51a67d84d06e38bb9b6bf6f2bf1f49d6c3b7cf", - "8ff0a792c2033fa0c6c43e1405920d7eeee423441f4787a4919f8905cd5d9fd9", - "6d3bd99253153040e5d98908225770876f8b39345678c02ba63703ecb1581ffa", - "9c8e1964b53b46a7e20e9d23e938444bb0c16d656e8f5dfc6d70a0dd805e54e8", - "243b6f240a4147d8a5cc8529532525b4ffc5f922c19cede8902f6881ddf2b175", - "73bd43ef00bace7324564480676e675ae4838dd3a4ca56e8cde05f31f98084be", - "bee3f3494a15d8492f4bc934e9d6563f1204ad6b3a894b8c2e6778fecdf1a671", - "3a93a79b3b32aa6dad1af4d2c90f55878e4ab48f7e43a8c2e4c85e662d4e8882", - "43c60695ae24b8b6e7d1abcc8e03642e68028ae4daf6be9e214cc7b7f821a392", - "a4c123f31e6b87bf695518ce473a38d49cae6e9283266e5b582fa6406851b512", - "50bfbf2f37be4dead048200e1a263b2b886481e88da0b17c50d9363ddba95f68", - "098892dba02786a6086bdd20cc927f0e802880318137e8b61071ff25322c004b", - "9aa7e9e6575d909736565bc5731e094a16c3414941818d59ee1cc50b149f88c3", - "8f7ff3ff0569871a698698eb49d88c31ec67cb7cf9ccb5cde26064786ff30399", - "a7db7361fd5f25dd61791cf1ee0cd5095d80072908ae83052b203560ad07837f", - "0e5c77c2e17b0a32a23a6f9465ad005a42e284cc50250d70440f8eacdc0e52ab", - "2bb92b7773cccc788324af912b7a5e2e543803a8cd801ef9c095777156d9c24f", - "b6e31268bc543e7e23b5322d0d29923fc69dd6a77ca29a255fb96cdbbee69305", - "e16f0486ec6cc5cb5ddf31328c1f13f164226d696efb0f64227ccf8cdf1eefc4", - "833a29633535add55dadf1eac793c226c538618e01cdf54fcc394c0d8721303a", - "8a5c9e840897f6bd0e7bac448c0a0ff9e6448263ce67fa686637fa59b834d6fc", - "d20018a79bd4fdcf9ce5012f863aaa6bd5d6ed5a68f49831d70275f84dad3d51", - "95746a54bee8d1109a60de65ed732af766a8aae7740ff546cc08b695163dbb04", - "74b78bfd30d6264fa21c2d98b546718f4e97a0a74de76abd4d4b1c5e0e236aa1", - "6f49c9c3997dc89e7fe8344a7b0d6d6a7eecd7adf677a838668bbdc267ff4f70", - "f8ea3d365be2be27d118cd38aef63a4cd66edd09693ad8565bc97c3c0bf838a0", - "6ccaa3e495fb258a5ece009d5338dbcaac8581ae4cd56833174831af39da64c9", - "90dcc7440ec2635e4e2417fa197d26d15d78d7e65fbf48e60622bff2e383b7ba", - "b3af1994ee9d95caba1f69d41c165206384c9c3aa100c5a604ebf63231eebf74", - "3381d3784076be48cad06e947e09397386e787fd0653b8eb48da26140a99fc25", - "c2c4875ff4a402443b8b103cb76a0d3d4ee4d458b9ce80d17e0c12adf4180cd9", - "b94ea62b9719767de5a5f74e4d31eab21bb3346bd26921b48aa7792546aae27b", - "71dbe0ce3a1690fb40cc72027cd1ae45bcc807eaeca63be17da82c9074be57ed", - "eaa8d0876a96991b6d6697c5f11f57961de68eb973ef4ddc3f48cf4b048383a3", - "2609262d6fa9699df01a760d601e161f1d02eaf1a853abad4cfd2917a8fd0868", - "e12e7e648692e03476a407ed1968819b1a2845d35ab85e6aeaec62be99fc0e8f", - "807ca6326b92d44b84450c8a853ef21eceb078494522bf737866ea6e577dd6c5", - "54708170f154320b17566e1aa610fd9a20f05933c3980d975b47a2379dcf1241", - "a3b8b51cc0b2db7d04699b327ef30215db0cb6b02e8ae03c908cb82bb4fdfdf7", - "0423370f91a4a51ca7d2f0829ce0c2f869620a3c86e389b0f691a049d88424d6", - "35ac62827e553fea201b6ad64dabf7abeebe276e1288c36df0335819ebdd2ca4", - "30a949f99a74056c18faafd632fb80ce3e9150874c519df291ccf2801d5d5279", - "768c39fea505e046ba82f17ae26f678ae242d53db53e7505e658a0abe4d3c957", - "895e5203a3cc60445764fb61bedf925a017cd0dfb3e2f5edf4a7c4c264ab2a10", - "0b9d9e1b679b74815a7b61e70f4e332968d38b0371d2c29d3bdb524047c63e80", - "27ef73a850eba2bbfd1872b6523c39855eaa607d3c537fc1fc1984142a102e5e", - "15f4f259660b4aabea2b5ecb52563d2f5b5a6790d0a31b6dc5af2a9ccb943c83", - "c1c1e97224113e5d46ce3966696d7974029929003e3085e00946b179f9e5bd63", - "8d83bc72bb14f01a54eedb72cf92722cbe291c85a8be0e93fdf137e9a893cef6", - "886a9551570bc099f7a420fd98c6a94d0b119ad01cf486b281de00c2908fc007", - "fbfafa9bfcbb557b17beb38633a4f37cc24ce0d6abcdb424a5ee9824474435c5", - "15c07fbedb2c34139557ea0eba68bbdc6fa440a4bce667a6ef49f25b37984fab", - "77eb4e41142d457b8ebd321795c967fba99d6a3f6ab6b3b49f21a58022556b0e", - "f90291331f3f90aab68877e0d323509d2790846b3abe8bd21fc3f1f45daab6a7", - "50eb0e7973bad27e938f93b16f88024164c5499c3bcdff68f4050c21b1d294aa", - "46524c393224342326a541d124f66a32136840b2071cca7c8b796aee4a44b103", - "9c0354be1a549bc754c800e3d05e2fd96fcc6f6e55c476b7195eaeea63147440", - "17c37f2e741e84f062150b6d2d98223da53a6e11605db7006f95fe35ff40ec1c", - "fb79847135c370647670e8571d4aa2e263232c7b759eba7aeac9280b7af51995", - "2b91b8e698115af7f0875bef14f86636ac377b29ad1313b1b65344e0813b3296", - "ca9004fe0c8b9f3a7215b072e996f78d09b7162dd2b30c3ab8c8f657ca02393b", - "32f4b83c5890ae97b36ba2b556dfae14f8bc5715318a1b4ad50ad1a1ba2f9b4b", - "e88d7f627bec1694b2f4a8ec9d5a081afdd8ef1951752285e4ed1774d6623862", - "6c5b779cb7e60b46ea6993448b2b95cf231765186d86d32d436f889151813244", - "1589851fbb3b90b25241faae40ca346bdc8c331de576060118b7478b155651a9", - "ca0e1d7f07b796cc585d3ea3dcf07cd459645bd84b36bdf88b424f698376b8fc", - "70f021ff0feb5470e5247d1b16e2234e11afd121878148bdfa339d2a3843d7e4", - "fabb39a24280b1cb66fffb88ae8d872be58638b101ff46a742912906d721193f", - "7e7a6aebbe7472399a6d58c9f2fcc6899fe1a4b60a60e3ccfb8748094b225ccd", - "7ce8ed6c109201b98fb2e1bb5d19ac370c21044fabbaaea0816448f032e4d2d8", - "232a4d8e5d52c5be29ac64a51f24d5decd103be2d5eb8a4e06e99c4accffb4e1", - "fbd51ad74bf84881d2006f5a5d75d32a5663de7deb4b406f9787a5cd7aa28e37", - "0f737893e84067dff85c43c7fdb360dd2d5c3be139c305c7ef9f622705942d1e", - "1a21a2dd2dcc77addc4e60ae391333306bc13ee0073c0de18ea3976943825964", - "16cf99f22cf65923118cf20c5a1ca6eeb1dd3f3af1e64f85970492c9ca6fa3ba", - "869a64351b4264d6a9499cedea19ee93a791dd4f01103952b05594034267fb77", - "e77a87da1826c8258c25726d1331bcee191abef177556cb925753fb263a96c4d", - "ed1ebe43f66a4860178e78dc3c6f555e03f9a5fdc0081a2841c4f96bbeb286aa", - "f94569b69a402f9e62b7e2753391722a5d40e9b59af07307d788ee81acd76aa3", - "d59a995446f13169d2e50aaef54cd19ea8614c8c29eda637dcce15d6efec4b17", - "a68e2df390a5cc8304e9fd383e5f7a1a5d89e718c6d7a4f8f541e0f6aaecbf73", - "da830f00fd0aeae93ab0d77b6856f105352bfb29d030543b7361c0a168df2fde", - "ad30dd51312fb41d8bde64a6057e52c03f873f0c17b69bff2ba34b08f28da641", - "ad073f297dc639a921047ea14b5e8f0d075dd001a799df31831db7f49ba089a8", - "e61df144120a85f324bc5f224c304cca8592b146432142d50c27d14d0746777d", - "0dce81c3e5c9be44213e8466707aa7133d6fd8eb62c03cecc02859cc3a693a7e", - "c95579e3994a774992218fab643077310f53a8a54267a2236854bbc9d99bbc53", - "21193fe5d0aac2157648e67c4fe7b90cdddd105ee8d869edd60d5e8129b07bdf", - "5c39dfe21f88bdaff87bea69b0e4b42f9a89afe9eff604a4899a6e8d18b5836a", - "d5c443f0fde40b834a04cf21eedf6689ce0dbc8c7197813ab85e8c3010f1edfc", - "906b7e29bc45fd0d3cd960d9f7d8e48984234aa0fb9e62929ba7f9ac735f04be", - "fcfc3e68af7d5f06e93c2d6eae4e732afb4e2b4959cdafe73bfa7d9aa7484e29", - "cf1fcc9dcfe659d035a2115e210fb332dd2aa3650547a1636ceb22bd61621047", - "6ce213a11cbb36563f78322aebe06be1c1848de4498f9dc5701c49c223ce50e0", - "6c887dbb965dc7e0d1a3f62cdac1661366332836c6000d14c1fba11ccaa90624", - "1d7a99113c383aa33101c4b950fef03803f04bd33f162f7b5e2368a2abd8784e", - "3ea1521cf562e8f0605ac58e9455989de7a04551c0da57e75e68a6ce62ad7991", - "9625e100e23b23f646a6395b7b379f3809e1dfccfd96d047965fe6d963ca3677", - "07a20736946883d3e53f9e0da015a876e475350d3574b51ae88a44026b4fb291", - "9e410ebe0b15f0a0adf6c97c0ca4abe81e76d49963d5d96d9cb0ae2c1772d4df", - "d0a7c13406202d5d2b2729363506577993aff128eb66db54ddc77c0ac71afdb7", - "8fa2c4af02bed9e0f69c547b9b83c6b1e98eba597309cf17fec9a7a3d4686dc4", - "190235c02e545fe039fd67704997dbe231827149f8465ef59437a8a7a50567e8", - "4df1a0530bfa613b5725b4be4300b45da8699244fb2e54b5505a63b8926352ca", - "12fa3e6155b4cee82efa2c19bec0dff2ed166d4fec29a8687f086cfd0b9d3d65", - "9ae94197ecb8adc2f3ff0c20e3bcdbab0872b6493630e9b3648cd083c69fefa9", - "247a6f09183d1e1dc717554c63a4d92bfbe5204bd15d91a011c35a1717e86c86", - "5a52b78d385725b27e87a5098c121d864dbc30a830c712b5977dc92f0e00b9a9", - "297e14ce19e9d2d1c042c565219420cfa38c5780962ad986ce141cff0cbbf6b6", - "da1f7fb653d7e9507b65d85744971ac58cd4b52aa55797c8a4affcef9ef4f6c6", - "a523466e3a2c544fbb5ddaf9f196ba2f8813bb27197397a632504fe2b6a14cf9", - "f6649ba422b5bc3ba46a434c1d08b1b5849f132cf146a3be857ebbaa45dde535", - "cb7fa31afd046b5b5fe6850f1d20a825e9ed4742ab28d0d8fe5193852ed82711", - "f36fce816b9aeeb0e595bda7785c40689994910177fa4a0780580eb2a2182ee7", - "ef770263aa30c8666a6487d36cc2b95135f6b45a9c14268dd64aff6c9ca0d95c", - "a9d18905a55296f1b2e61816f058fd37005544b1157a493821af13a1db338aab", - "d589ad249755f7c44b4e17261858cf53bec9256ca6f77ff9b474f69e5a7df176", - "5c8f6a82a95b89a87bcbe472eac5a3bfae274b6fc3ca61b9a227240f87ebf489", - "187ea90680c730675e15624fffac527ea4861452c15cf6687cdbb5f37d356925", - "944aed49abde83913842f00b4945af14f1bbd4205b70bfdb8a3f0df61c9ebccd", - "fe01f0f305af7737faea6e9fe1546b45511872ebf27653708aa863e26c83cb42", - "c8c36c0ec222ffff93fa26020929b32f07c67ae1218ec598ca79296a74e6e819", - "45979e1490f1b049de4722f0d8bbe958fc95c2daf259fddad2058f4181928d05", - "f81849d2a03077d4b77c21ed07967268d362021de2d79cd0d99f4f6d0b67c50d", - "54402d7fecb5402a043888f17216f9b86bc3e2ecdda0a8cfeb8f9ad9c67ee5c6", - "65df2abf7254d2f664bea1c7f35765c713c417440278079092378153ebb2a6f0", - "ac30dfdf0c049f693db72699fdaa219ff118030f72cf96da9bb12881db87bee7", - "4a57fb8e1192d81d9af043e67bb396114119717117974ebd4b447467b8d960ff", - "369a5f8a2a68d2330ca313a2086c0f71a67a5f6b44a4baa50aeddbc7219d4613", - "1250af791af07200b4808f10f0a8cf7d405fd28879a9c275976fac2976a6e041", - "cdde24f4c54db97b557f29b6f319f1c3af2403d07e1d768bd4f76b4638665c1b", - "a50f8e6899e9afc4d51c7858080a82857c9370f1b5e0e0c1d85afd4cbe4002a3", - "1e13d51619879ca07b5acb20d4a86725de577470120e95a1418b76abc7f70dbd", - "f786bb72070a04a8e60fd22166f91566a0a45b21bcf859f2fe71321f03d612b0", - "d67b40da84a403fbe8a7235a94c1e4d46cac846abb90b4713b62226b95a7cb2c", - "499226dbb47a1201b4e5b7078e771a3408801fd2f1d2e43868c7e6670e99065b", - "65fda9e59a6f285bdf6d31960f5239c8920082bd8396c1576e6fc03faa7c345f", - "c663b310d3c2f1990b11776ab18642b234e8348ac0027b34a165f03b63865bd5", - "359fd91d94bfe7e776295b68e1ea70fca7922a7ef00315393f685079da97920c", - "d4e6ed261114f6ff324bd02bccb6b748dbe0600d6169e5a6c24acde0868b779a", - "a473ab54aa86cae83f566ff407bff108e41bd3e52f935c7c68047403d7ab8cc2", - "18e5c61a79342a5d218737d713ef44bceeb463d7b3c31a269ddc7d9779f490da", - "b55d815072090f35ad94b9a4348150c0300010440ca1e14645e0c63c55e10a66", - "adf040433b48128b76b70050fc035fe1d44da73684c74618d9dfb9ac5221ae91", - "073b821107abb5352fa2fb3e5910a6f85cdc05ac9eb9f05124907fdf223cb0c5", - "85d02a0ed206439f0670ecab1e02b0e47fed1211405b170f8c01fb31269e2435", - "81c21761f66b385c2374472bea04de66aef932027006fabaa32c189107824d78", - "e68bd840e36166d9ee57c289a96cabd3ad912e421991f924a92e90e39f4f7abc", - "87773339ad09a3e91a63a522aa61547de0bcbf3c0ac8f87e07d18bcbcd94985e", - "17d0abf370f81040b3d041ab616c1d33362238fd4407a5ff8b66ef6aadbae95c", - "61525acb8ea82cd7f5d67cb2fc53cfcd7f8e66b0bf4d9ff54f58f63f4d7bd9b9", - "dc15baba3bac1d0647682cb9385adb619e37d6e5e9811939f71fd41129ed9d98", - "10c6e756e9b26a25798ee4787851dbb989b494508f4e28c73b461ad4a3e18598", - "1e0f5ef5537f4e80bc8f551a77fad30512effac61e6238c3bde99477554868c2", - "3d1fbc7378997ec532105b4bcd13a25f9e0a6231c5b538c431a7177c3e200c27", - "69c3bff6f1720c1abc7b644b4b61bf5eb89bcad35558fde52eb0e88277f3cc18", - "6b9071f0496da1670621ab1f33d4351b54a746a9ee03b5bce515cf58da4b4101", - "c22b847ce41d5c50d0a26f0ecfdc0c6a554b83826e1fd75c2dcacee126e7baf4", - "351e537190f31a5361175f9f4c28f59e4ba43c0a41bac6929eda9ec8b7ada4fa", - "cb5d7682e428be8c42e6dcd65c849e79694248bc8a1bccb31611da8e5e5a4a60", - "6567b9cea8dc1b405aee7e2d4ee179ff8cc2535491d9bb7f621100f26a11ca0b", - "41fd04ba6b6d7903947dd2695e29728a0c4ef98f5994dd657f4fb340604bfab5", - "5122cf6ab410ca73cbd69d1b3df496a877294c2619837e0e0f88e2270b42e968", - "62360e81402a342ef87251bc4bc590f0488976c85ea77e6b3c0f95a637b3db70", - "8de8102f526a86cd0d05536487b6e73525544e4ef7a255524e05678f4069252b", - "add6609225711023703fb96b7ad30db18c10a6bb502f63b24703c003ac4e720c", - "3b95299b1c2b66567aff5e523d98e8bce93933cffea02b066161d2dce5f4047d", - "07e57187c14492caff3e680a8393a91b09228dcfd9bef53d07b193918586a031", - "2ff45c56e32ffd3681bdf3a89d445cdca4031707b6562ba69d356816a2597d50", - "f8816d519f1a23ce936a4ad65492a31e727391382d197a7d810c0801cc6f42a7", - "8433a7a39c7cc2b6ff0a05515f799071c3101c8a319b53277b85429ee5c275de", - "130da558799bc63203f5aa1c41c41f47010073c8601aca503d95e200c5ead02f", - "cacbfa521a19f0f24bd0997ee56aa1b3e5ea9524b762fd77a3fa3ec64baf8250", - "3a2a9fb9e6a964e3d14d96f04a5a362a0208c99e911f1c2d3cd02c9d68f0ad19", - "0f0d57f90a568c4ae1e9157d83b978f547bf8dc8eb08afa5997bbe2c46d284a9", - "3b549a71cbd79a72dbaa0f890be70b96e049abaa24d01a960277b1c23cabac73", - "97d97ead7d963096c480d0566bbb449fce446f4f2056736e9b0787dd6e4b9e66", - "d8c73ad3f2e59b89b0d760ef297d1ae8616740f9e5a703ac9181a509818ec06a", - "a7b7fa3b1401abce571fdcd68214ea7abccc81d0395da42f7b79faaea0928469", - "523118ce204cdc115ed65d55ef77d42ee41c64fae9e4096c08e0779818ca690b", - "176aee9af4efe4c1e9852e78d691024940acdb646699eb0ff06a123e9571986f", - "db9ee92e00898a260b4f2265d13ab03ddda74311ffeb7b4725bce743716aae4b", - "dd684e6482c0ad281f046792dc49bab2e0eea05876a6677e877c69d977bc9b4e", - "623d83a605824ee582fcabb9de8861d8487caf5f2d131c6d7dc4e0e671e5033f", - "cfd342ba606b3847fcffdc620981d541ab91c9cd7787ea00064165d34646153f", - "70389b638170ce8e75ce9039c5c9d53d26e04869ed6a0a94e558270603c9788a", - "37d2bdea88b2bbdc08eda2e40655eeb6d37fb23e75dab66329de7e69b9b56cb1", - "8f95373cf7adf836603dbf4a5c422e8065c67f952344939dfefb44a1d16a1913", - "3d5c240c155549ed4adfcb2ff90c03f34fb59233c768712e3a2fb92f0ca768e3", - "88d8e2a7809b389c5a6a5cf0298462354d4416340a7217b8b3f2f38e5be2896f", - "f7bf438be033e74952c9432619ac0897f0f24ca20334884c220c8bfb83e5058b", - "77b4697831250838fea708e8763e250247bddbaa61124633dae410a2f6008665", - "8793753d1b916eef6b1e37d7b269542bb5e802dee8ae04d2d643805fa6e9f831", - "761ffbd8f3cd19c4f9dbb0141ab5998b35263141889f57caf1692022946536a1", - "9d475467e6f2aa46f6bcc0089c1b39b93c5fb17b3ade9adf0176f7ad1bf67b04", - "3f4d8c9e7152c890e17a6202e09af73f6af3aa8ec16ec1c2c587b683091218d5", - "66627df9b2814b107e122d168cf75c65cf7a533617e411d0ef983be332022701", - "550c48d8e91c0124dae42d2093811e2a5d0a2b20da1ba339bd12f2f156bc6a5e", - "2270f542da4c94c4f697f0fa0baeeb0c2bb5622e42c0e63ced60787ca290ce73", - "e030c6e2773076f9d6fff53437de2dc3ad4dfb426332004ddd561fe58689fbb9", - "cdefeb3d6008dc894915afa1753d98700faf336f21c092361172bd97091ffc44", - "54d2a9495a61c3e30f194ea756f5a4f0c15aef00111ae3d58b5e1a2b4f9234b2", - "cdde9b9ae079ae82dde5c940951ad475a2af129b9aa200d876b26257277a618c", - "984d8807c38f788babf47a035cab507a5f7d27c1b3178e2adbce6c9c23f221cd", - "734eb8f1667e6fd28a0b80dcafe30b2d9f95bda86306313edcfc444da129ca75", - "a607f3e403b12885c0a5fd15fe5fbb8fc706be2beec32a08dac68bb8e654a7fd", - "5f8c3c1845b8c42ff51314f0b8e9ef5f13eba8caab957e86342983491fa064e1", - "ab5b30759d380c0a6d17bf5e412374c707ffeea48d437eda2e0cad6907f1a5c3", - "64f348babde32c639a5e5c4b63f7a4de079ea167332b05502d9bd70bc647f9f1", - "022dec8c0cfaddc4f3ae0cccda70b4595b877faf20d9b4d7ae3c914ffbcdca38", - "dde6cc3bf891cd851ea58ee2db05f71968c1e0405ba17c102cdea0a945db081d", - "8a27294c90623ce54695fd5cfcbb1216aef4a2289d171a82bf00fe17257302ec", - "ee0b4d297e2940b9032208b3e2eefbf16c6ef229b2d8b7994bdcda1e724eda9c", - "b9cea9734b7610edcc1d616817cc17c4922b19f7754f933b670999527616dd10", - "2980fc987e2ebffb9c857da1912684200a7fb708cbf3dcd50db3058b3dc9ad90", - "a76da3eb90035292bd67315818e0ad0fe2d15d410e4dcc4983266ebbc44ebe29", - "fd4dfc2bc567c8c99083876ea1819cf743f5c1d39a8b6aac7283b7add964a627", - "2a5e3e77a54a71c3f738a1176c72f033319921aa1d740d07c00e4c28707d4b47", - "5a18e71652fd84952c513851a38701f78a46b857d79a1cff38aea3493be920be", - "fd51f5459d549c1298117d22b95a8fe1bcd560f9b5393592bf1d5e059e6a24e7", - "11b974c809e2427bbad938e5c31407b5ec0c63169974b7dc8e6b10879c4b9d25", - "14804355bce6935755be8a6abe9f83c9139f114d69cb515a3c14cc9885f08bba", - "bc24ecc14fa3cad31f193dd9ccca9296f2137424012d1aed0687e17f344ef216", - "b14bcac9bfe0263591966b8c12e5da3fe339a2983ace7cbf778649f445a6af34", - "e9cc6bad5d78cb590121e2a2f8d0008f38fa39ff39b4655bf572a63ee41cae27", - "bfcbf9015bafae43bb3b506be9a3a358bdb969f7a36446a002780bbcfafd506e", - "0320698820c3142adb1c415c71cb78438106528b7531a65e3f326eab73ffcc13", - "1295e04cbacb73a824b59b48203c7558d3ce0036fa66534b5cf4205f8fd1d52c", - "76a080f0d8caff7531a8b0588b4de9532a72d419c7e6edb75036dafa52124c92", - "43b02411936772983c2e588fca6a26dec7ba4c46c62b10b9ae945d39601f497a", - "ed39b59fa7f0f6211a71064d7b2292df59466d267b614865c8f434fe496d9f7b", - "77ef5e3005b1c5c750f69fc509783fa1a3adb7cc51d702b52a13d98e3ac03bfc", - "c3fd55ed6ddf14bdf47d213c71976c220aa39b927cdcb448fdff03d439c01b91", - "4f01f95bcbc91424f7be01f7ae9a5db474ebd2ca956950053c837ee7407c3deb", - "b5b917f7db6d265ebddc67581576576bff27d0a8a41638d4eb4e5dd33a53b167", - "e223bab6e89149e9a3c7f512b7872e281e7acf6ae55d2ef0d4b3efb350bb75b0", - "3873a1af6a786d22ecd6cb67c8fd462227642a4b796c99f1091a222f12f8e180", - "1557daadfc32cb012ee1c1f3d7b41f9a7d47d465b7fcaed7e4c96b8e40c0631e", - "061bf4e573231205033e49cdc94d907786949197a6195f97b9f8c870336065eb", - "4d3135251be2adea7ae4abc13422cb7f67cbbd51c5e9bafbe520c80a9153e87c", - "456fc6130c27405c508695619cfbe7f1c5bfe7c8034be23f922360e0b91fc9cd", - "8f138a174059ceeec4716147f566abfc753d258764ea93a34d167644c8099047", - "942471e2ceba853216c0ddf29468711cb1b8f723c131371583cefe7d6e70fb01", - "b3b5d90148f3981bf935eee744b7c359cea22f9b467ddaa44db50f334115af8a", - "7c2c610bd38dcffe5c370a2d477876cf09d8c8a55f8accf3b5565c3939d6ed7d", - "c4e1d24fd701a580102af762085a4e50031fd389baf83d301dcf200a28e38313", - "18272a1e971a5d9b70bfd8f14408333c94aba1f523f65384736cbc965ba1dcd2", - "2b6df5616a4d039dfb69c37adb4383ef038d8b467c8f546a917a2a1df52ece2c", - "e85af8f61df6b93a2749e4d9b23f7ec5ce72e9cc529b947e8afd5411b8fc3ed5", - "7b3fe0368552b2576da82debe245fec5af5c9d5a8628bff2e5cf299d84373aef", - "147cf4f12a519fac0a7d886a76f35563e1b4e44f5075c4455f1ccbff25d5a3e3", - "573ff371ba6ecb90a3aeac63bce43718e1fb75aacf0909c6c11785d825eacb05", - "0fe7c803b59283c98199678b96b444f9d6fa5f6dcf3aedd309ae016adcd240ed", - "d7ee402936d4de3507b644b5fe50e5e2fd86580cf1f391ac0b0014e0be2dd0c4", - "a0bb6e7edb7319c2e3f333c89b544ec23c40aa487efb39e2d0f3369397932386", - "a1387521123f4c0c1619a15dcfa4063465eb225696ab0a16274733f571d3f393", - "b49efdace258a160f87a6b73e40b44fc2288a2cee33f1fed3030a5606a7199a7", - "ccba6a4a6ff8eca3b0200085fb626217953f09d76fdcc18f0b378aa6e4332ad1", - "1dacf6647288df6860ac4011a4c9d62f8e5a3bdb50fab615c3bda22165174c7a", - "f0444ce1e70a47451d47adb53db01d96eb3817d66ac738728edebba40fe3cb10", - "6eedea962fbaa8332a883afd34161cf7c55d765b0f53fbd8742162c72a659bbe", - "434e9091f708acebf5b70ddf6ff5a1110bda371705975eeaecd56ae77127739e", - "4855c3e62c8622e56a8038b0ca1fb8db0d290f68f47ef2223c9c3f6b8a31a790", - "e45bbb4010cfcbcff61ce85c72120960fb47a1266110ef69695a235a7bd93ccc", - "c6f18e9341f263fba4e6dac81309fd6c1ab7b04dfc7309d102b0d1bd2249b9b8", - "433a5bf2bc58ff503fd65cd48245b323d1bb6d1c060fdff3adbf9c6dc4366c57", - "b99cc9a39fc4c54d3301a86ce2ecd167adc6f6ce7a7921269924107b542a7b44", - "886a2d35d4d49601e7dae7e8934ee179aa8fc7a08d392a95401c9fc4b9f75be1", - "77089ec763298f0c0027b54bec4f77dc5f26610a9110bf3dd6443a4360a152dc", - "4bda7aa9af9b2dad4a59910a0a41a1a9b20809410b6f586d485d3adf9ea15e8d", - "5350026aaf6349d45a1be55a9a16fb53138716572a4ae275ae0c98a15e65e9ff", - "0a0b422df0b337ec814eea59f5b86018431bbb77b8dbfd71f974a450f1254ce4", - "0060cdbf3756a99d8c826e0d42143d2ff6310866de21ee94dfcb1c4794bf86c0", - "5a6c670a58c227b23a63bfe39c80fc1ac546bd8edd76f96f2b274af7fd2b6880", - "f1f08a6bb053503bc917affc14b902392ddb4bf17ae642272f75b3faf39c148f", - "12d4942c3c6bea3eb4d93c561d741b72784dd4fce166a20cecf7ab146fc4f057", - "bad55fed898216b80fe5a7d9d03361ac87363268b93553a8442bb344b7008319", - "aca100e99baa6b9ba02994a19ce827439cb9336cc8228f72bd434600ae363f69", - "8c960eca2f0c24ed33d00f7ed816314772e213b5e305dcaf609921f350837c77", - "13e224250a432b5e22bca6429dfda7995c827257b0be24a846fa8b27ddf8b47a", - "89d0eee31dbd28c095a05bf67be33d8a3a116944a72c2b36da5db15dc7ac8cf3", - "cac15d6cdcc2068ab21326ebff29253345f097a32496a9881e94ea38f83746ca", - "7f835ca28cb54d1e16ead6c27a8891e0f0e62942f64ac4e7c261a601f25483b5", - "978533d6295aafc9c70db7ef550815497fd5b3ac6cccd7dc55b98132a8ac1e63", - "fda6f7cbe14fb69b6a6800b1ae675917aaba2c80c94974c5a37b988fb35e1753", - "566679b2ee14fd1bb1a549b72f21e633a76a9a620dc26aa8be754124986bd5f8", - "268c84dc247850e4c400244eff6937927d255c60ec6bb61601bc7adf9b42e0c1", - "397b59af97a855a31ccbfca94fd6f066ff910bbd2df3e6a6534c3a12936b5a36", - "ceb95a5073a9cecd480c2afc8a90b34f6c4301f181ee05af0c1ce9efbc7ee12b", - "3fde0aaa4366d395d3defe581ae0dea491f1f03192cd9dc2f473ca78b1619a0e", - "f8b229a5fb48fb90d927510e2eeb2101f1b4e9b37a92721a121c731ba4b32429", - "2469de6034146879f0f093b61b532a92cb3566158c0177340b0d36dc31bcc312", - "7c20c9ada5788f2f5e68597d9bfeb1694804c05ca476e3a162e1a05c3efb2c65", - "2e3abcb9490705c3bbcc137f36e55db65db7e3d6cd076cbe5fdc53f42d8cd2f3", - "77aa5ed78c08dcaa1f3ad82e5db1bb34ef8f1686fa9e02f7d9a687c35dcb02d7", - "68b0e8c40cc450b2774e4d5a8e21096e343fbf653783c504d1f58e6364764feb", - "dd0c08c97c1b171d09f01e7083f3c0c5296cb2d6cc097bd7f6d4cab62872e200", - "593840571201dfa849a4a145ef35fddd48c8c3f410d23d9951e2cb12d99460ad", - "df6dd6273a9e3451cb00c4a91b2bcf54b64ed074c82962f49a75b2c6628407c3", - "9ed28c8b93e53f25d3b4dbd81e7c4595680d0b99c3b15928ae4ded3a3bf01a49", - "158d3160a0f16112742768d36e1dbb13d3a811fd4135b83299b13ffc6f208f61", - "0b0af821524d8c7712a82ceae82c7776e7ab2e7ec07c42bd8ccc6a4c0ca77760", - "aae07a40168b11e6aad25c26665bfbb5119a86561bf86c9e8fa17af9596cb15c", - "b4a6eaac22c409d2166748a334cfd9757a8d7363a93d458f19a92bd2138ee146", - "6b72935bce50ee4bbc84b461eb3d5cb290600087e012a05502f2af4876ce260e", - "4b66b0f939e37b0ef4a362d2e3b604200b53b1b7617ec06af8e1cac742bfbe96", - "20b5b35dd12ed71ce7813e9b78b4cf9409e13795f47eebb959ea61e53cc448dd", - "aac9dc907e427fa65fc5c6d744ad5906ebe28bc21e6fb183708b8ce5783ec0bf", - "15fcd05d5082499896973a9bf7e8026c2c0b126b493e308a20657843ce43f82d", - "fdac2e26855354d97a9d88bb4530bef0d39962e5a0f4e1e66a215d4f58a4fb11", - "91fe4ab624f5e682b48bc3d5eefd942e7c0d5eb8eaf72226300477a996bb8ac1", - "34ad3154f949e956dd05cd5a1202752e49d00cf6cff04479d1abbc04c2f2b07f", - "cadbecf1bbe5b1b6f98eb0b1b7588ccbbd2407ff18bb2893405720e056ec974c", - "9b3df27c02a6b8a52ab417aff32c9e7b7cc326d8ab641a3927bbf4c49b8b3ee2", - "171ca2638832dc6e70161fa44e9602734a32f9af44b10ee806d87b97d8260dd0", - "d6ae68009c0082c22a2b135da7933ad4f47c01f6761a6901e8bbba34a107d335", - "7fa3d04662b18343105966939d4b686ce142f6b8a1d523b67c91048cc9eb11c1", - "32638ae9ec933007b7ff4f76d3fb22e3cf6322b4deaab4788cb73128abedf47d", - "88a89b46f19125de407ebae94ffd967b0c72f8801964b638309571b6609d8ffd", - "368a4ffc96284eab7b6d6ae58df1987d7d876ac89e31bc5f3fb84c6c5d8e0bb6", - "95e09b4471e6162fb51aec55cbeec14f9dfe4d490e1d29eb050d426dd918488c", - "5465dd24a2d5bee59fefe74c1dc147e58b15839d16da944deb9bf3cd10e99eea", - "ffdd8153b53e5dead17970880b88c552eac51a36add159ded87e846a08bcd490", - "9bedef24e6a9857b7e2b29f5381999900bec5916e705188191db5b1625d02261", - "e8d688008daea6b8e58624e80286d169046b987d6cdff88e9c496e18841061a1", - "4b9008f617a0305a3f48c97ca22184022c74cc9f3ca3cc2a53ea4189bb316a95", - "00b3ed604fd6935318ec36e79dca4b57dcba755cdea9b0c935ff765b5d368f43", - "ab0f701186a15d5fc56c3a9bd93dc00d7645aefabdd1eca7272701ce4bf04874", - "099a3485ac582710f7270fd936435847aef4259d779ed2feeb95d48c88bc9243", - "4785a627c0747a50e5fcebef2b7f2ef7fbc926c2897a9374d31d516efc9ce753", - "46c6fb1113a4470c209f9fa15eb66ef1c1cd0bcf2b30101ba645e5fa27776f60", - "11d77d14b6ede669dfed248af1f5dc1995bc217b670986dc7470de6ab6bf61ab", - "729d0b1893d6f50d7dd49de5ce06529834134a03c854e7d766b1d4ba6a3fa0ce", - "8f711434ebf9d97e90ea568b2e4e53d92c4b2595d95b2f69d4f492149aa9e1da", - "ba575d7f180afdfbee543c4fdcf0b6f0efaf78eb168bd7e1104663f36a55a138", - "950888cc7f16b01c8aa877f99c4d8346933eb7cd2b83605553fedd6ef2d1c44e", - "c2214165e26a6f2705062954badaa6404fdcc94d59eabe69345639b7a0f38830", - "d0bb75e430455ffd5b763704001b4ac807a899e3ee1632dd7af3010b7f1dba3a", - "a398bd72ec714a3b69402cb3f2440d9075f9c54ba3f0e489a23b00bf914f80dc", - "6157e6e4e67e044f954c97f8e34d139f37cf2604d09b0a8de4fe29f0e0387cab", - "4b0e85c181a1cd29ca128033a864247f7e042a2492398398a4f9c584ff0247bf", - "f94258b24cccb841b079a220f8ab7ae4c404b50902635caa3f9e9561639cbdfd", - "c11bc86e7e4c4318db4bf27eedf6d73d8f0de92c85a6223d3142d888dbda1115", - "b5181b80bc48822ff55f51e6e77c589c88616670909738d231caa961806bfd48", - "a5a5b50268cd18833f4d3f3712f722db570974cca8167b2c81d349247836ec69", - "3e8caff55f6a8d0a07d7e63ae3d8f04ca7446ab2017781a7f1e4233a3a54722d", - "b6f012fe8bf026808448a8449208823bdf18ab3ab45bdd8643c6c2cb1a1303de", - "60d8e2f732760c3eeb56fe1c39251cec7009d4cf2e63a75e44c4dadac6e58afc", - "043f7001a0203a16965cc4501e7e082b2ac321aa2a910caaa9dcf36d7c85e35c", - "d7c7d748fcb757a745e220835c2029374ebb994526a34a1560337bf601fd1e0c", - "a3c104c15e19cdf891088cefdd90e107a2abc1ea7a5d5b98d642719650504e9d", - "cda72369335c5c01f521b8d739357c4e49683f964bdd4e3b8ae34f5fb701bc4a", - "5ca37490156e6d7657ec9524c6c7aea2a6c8387bc62c460798373963373199b0", - "c35312539dc7561aa84489061f97aafa3ccc1bee23d38c869006e3ec1fac87d2", - "7e9129d6f37ad51b769bf75e7c0a0cd590c2abc392ef008c040219dc261b30a4", - "c6eda5478ebc5f592daf47d987c11e1628aebead2291bb531e5b88b4a710c88e", - "95c3d1d867376fa33fc8cf77aed3baa6638eb11cc7f531097a80543a83a04d68", - "5c67136addc8caa3ff552603c8d13df6d378e3bfa5d63fa3dbe4cbaad3b567c0", - "8709699866c55e99f82bfa63e9d6b7253fa78c958b833301f29d90167a8a675a", - "bd544693e24666e43aa0a05147f5a96b885c04b14a635bcdc15f30c4f345c927", - "2ca4f6adb2d3873bd52a52708595cbe517a6be397da8cc999585dd7f7b07502d", - "433c6df34cd4ad0dbba0e03ff00f852b0eebefe7e6877c86165967fe697ccfbc", - "9c8039a42bbad8e48512129f5035ac5c5a809cd3b6224f4e1aa398a0b6dc42a7", - "b917a8ffe2cfab786c85be0c9b4d66067d6c78e1e8bd297cc479fd188b4719e5", - "78f844a7e64ae79a357763305ee98e617134fb71c8573a3ac9629ac36af20f4b", - "9f245a3cfc22f4dd3b3448a7e86880b69d0c21e98b78059baa66d2714f3ff788", - "2c3bd405b409a95791178dc5dea94b26b71fb251f16d2e781036dd66f2b29e68", - "7e41e1d3367ba7a622dbce61ab27c26e96b04a37ffc25f061d232fa3b75dcec5", - "918b1a87e8f6cda5e067744555e9fae0de2b8fb833a138fb472ee66af4c4a5e0", - "aa408850c7b2de22ca7984bc1581ee5939bfaf05034547fdac742a53bc936c56", - "3c920597ea313f484ef60a79ca6c434f63018999430baa2dccfadbd1268c00ad", - "5ef6fe8fbabd644d675373ff45d6a5962d173634cd9acf74eb42fd04cf27622b", - "d52ec1d08179bf10dadc3e0276003d812ba04b6723643718b18ffa71a4dc798e", - "1e07337b5a3e2e978a86e0384f11419428c4501e96afb5b4b1322005125e3eb3", - "26f3d0e3e729041382fc16278ec7989a055e3651a07d9cbdcca5709810780c88", - "fc30440c98fc533bacccc400de48e071d6c32b3c8f32036b51b58380102e7da0", - "6f23cf3a4f3c95ef6cca9bff75ac8d3df40aa03f24b1aa0cabaf37cdeb4b14c2", - "a960f8b17aa354cee8348b7b2bef56d8ca5eec213e17c3561ba29a045b42ad07", - "dc7cef38898cb5f568deb33121851bf72527ce1f0440e395700b1e5a7c057cd5", - "e49194dcd8e19d1aa0d246fc5b060c3af9857e48285ff9641d051113708fb96c", - "aa11a40f8fef60826b099e1efef3c4c562b5350eb79a7f779d1e27785c71aa23", - "08152d061df392b680eed11a64f5f10cd4489969fb249a70d6847970c55b7613", - "861898df7bca6fa56cc74e9c136bfc6c401bcb76d19daec4dc64f005f23ac5b7", - "5cc6ace30303ed281d22aa797d587ee385e71c203f1d8a805c2b16552a01d408", - "4bacd2bf1bba83fa2ba08715ece4fd9884ca8e212db7709de6cec0f361de4c30", - "a608dc7adedb77b818b8b202c1f588951aa11afd7bcbceef77875babdec7fef9", - "7003afdf5f73e635613e9a849004f22b12e34a426b1185ccf4f01e42563254fd", - "9a8778c0b7cd2b056f952d3b74c6ff9188fa49381b5ae72cc2696d7df02c4ad7", - "dcd7ecd5bde8b6d4b71b264b10ed2d5c2005e3e7f5c138b6cd698c64cdec456d", - "c37b06741e8a3564faa3678c8f855f9e4d5d50497b34acd3b9e475bf5ff8c8ae", - "5d2c69d9938fa9d5175aa98c959f4978ce996b1526ea1d207ec038192cc1dba8", - "d4df9fd0683fa80bbdce80389148d147c004ed94f0a161fb5d63d19fc6c6b4c6", - "094deca0b49039b6d82addd3d91f2645cb88cb7f2b335e496d8407691451f102", - "1aaa97977dc50ba1a4fd9c9372dff8dd17ad8f8cf4a87e89823201407ae18e72", - "f2c9da45f423dd4f7d1cee577f9cfbefca98a8818c6b941419872bb48435875e", - "6ab72da67ec4e99b0b1c10d79c82e5c4c1a02aa7f6ad5f3fbdab9caacc4fe3f4", - "7c018d2f9d70aa8e1c7c947c0b58c45d9c3c7bd457ad0ec0170be843b6d36845", - "a335b1048a49693ce310339420a9092bec18860d7657b2f9ecf7f6a66af5a71c", - "9399666ae791485041a19817c96aa1e45c7a68028ebb7f980797640ba58f729f", - "03313fa1110a24d85e47e280df8cf3135bbfa79633904768e100b28e206a6249", - "b3781899aa2c35d34762046736280fdceef4c70909ab7a9bb64bfeba445abe22", - "7c76e5fd6763f7f6a28324461f9e441192d424ce81064d8c1337e26fdaed615e", - "e07df22dcc6b8d8c065065ac691379bfdce010f475ffd2cd3e9d8f11855cf48a", - "edd19ffcfb24652c3aa3cffde8f57f0b9c586a5abe5fb153bf0900f76993d300", - "5b2c479041192867219ff4b896abffd3b155dd786ad9526fa2ee1aa3d1cdab3f", - "650e10d84fb51324e26040e8b71f692711a2093434e01ba5a575728786db3ce2", - "11c356720b3d1833b60cc5be0d17cc54cf67b5bdc716d54d33627f1320dbfc0e", - "a6f2956d4487df2a2419b6a990e77a5529a9b49c8a163936381115a278a7dfa9", - "682f0203e960ac9869518506a0913f8bd0fe68480b7a1391b71dcb720471a001", - "24a45c265042f7858dbf6a020a0b2973be868066146bb3a493bed9e185328527", - "0d7810ca6e2ac39752291557a743db06b61c6bc23a88b942c8720dbbfdd972a9", - "4bbfc0b501e699aa58c4bde7c6bafadc1654b7cb1e36f421bce91d5cf648ff59", - "43a5538c2d3d37e4a7e451c39462cef710df218f1a3e473955fd27317e2966dc", - "1e245b7a9f8a0c69e80f97296553d2443da19977cd1f13c228ee494dbe7237e9", - "5251a27cd531e3e7f7597fc0be1812a44fdb578303aeab7db4cf5401351854a5", - "f9d6d3e8bf2804c0429c67cb385c75e3b85a4bbffdb0a9337c59fbd1ab04c7f6", - "2b84d15e52589d062a62881358c0dc23ddddf0158bd8fb5d1fff25a96ebf3b36", - "7590854ff5932c052c738dd0b9a48300a5054a2f3afb9ba1dee023c9b1780cd5", - "061c6c9d1b6f1760144b4e7dbc8b693040b92906fa370ab970fed63abe1858a1", - "d1da8d5bd5f71bb62b3032b4aecdf956e5b07342cffc61b26914676890080811", - "91601852ee0a7704d143d2832cf30e582ce4945d32df5a03485b10e5c8d755eb", - "9d0c7b3a684fbad4bab33a9b448cad8359878bc0b566a46c61687626d36ab430", - "4164c147bec9e6254f9ac1bf23b9b012c978af09bf72d28f6f651f9030df0405", - "1e1b3b9504bf70334086c813fa314fd345b9c83ead0bfe38fb83ea75cbb20013", - "a4c58b33b0f06c24de0dbebff37d6b53961f7fe2062f8489dd3456388fde39fe", - "66bcca454b287bdfdb2b127f262f9c6f5c346bc100ccbfd6bd0088eca61329d2", - "8bc2d1b3a24e714547a43db52b0369ae6e33af3b900a621f577df4a72ce23752", - "ad5708e4e03c720eb26a0713130d0d91bd777609017d8117edf11284ef2cbf2b", - "674c46c51a4fe70039ab06adb2532ad3e01cd44e2a40dd2c93eb3679a5b157d8", - "a62eb7228ef5fc5a022221fe8dd17f7cdb9899284a7aca35c79430960d3b645c", - "8c86f87077e71827489dfc7bab0cdecdfa77432b3e64dbcb9c373ef0b7c742ed", - "7ca7b4028adfd40ee3d1e07b13a0007a9f9d7e8917eb6b7cb47b46b78e34e8cf", - "3c1bc10ffe4287121ab710a57d52ec04c636c94765148e71cc5cc582fccd28c1", - "dcb0407b29289629814f0b0d8af560a73b1d663ec7271789057ef5c120c7e129", - "220583461fbd8c1468155eee02da3445271106cb547e7497ec12358d9b819d44", - "3c13d93a88588fe6176bfbf53365d163ccdabee07be769a394a6980b5cdb878f", - "b2f08e0043f2cb673e75a62f18701a1f6109a3535d49e9c55a2036d4aabbf01f", - "f8324844471e3efa27c486af7073b9a2a28683390af06607040c69d100041c9d", - "c17be71b6e3dc4be381323fd80cd28b5a0ac4e25d6f11ae019295a08c8538d1e", - "259c434d68cc2c016eaf42af7e521caf5a5fc643f16d61fe2f4a479a3a4870de", - "0f317e0538fb01d22e12128c8e7618bcf946f9d22582ac57679bbc13cb401432", - "c4a971fb38d6c26c3ac72de660a8883f6097aba5b4b910e87939eae3cec532be", - "1c4e193c81070f50f4c2cd724476efa3424dbefd3e399a5090b56d63d34f93a5", - "1fe237c3f4b646b215782bf726f549f6869710ff1e76e188bc3e23a18d0a4036", - "bada9066ae0a357aca9f9e08e156c1be9c93023c5fa8a0c3906cd4bb2001e931", - "c6011281ef8980df4b97b1cf7c8bb0cad08c3a53cef6c1ad081b3157a711cdc5", - "61d88f9a29201acf06bc91f308148980d33532f7ca1e5128434a615146244fd1", - "5ad9c8bf6f37385f5d97185ed34149805093b814224ac8f486a7b9aeec31809c", - "207eaf85149caef7e496cf7fff658d2cf672cb1dc8b45db5b729d16cb0bdbdf7", - "1477a57619f96dbd5690e9d1d47f3f1c5dc39a1ac40461fd1f063ecc6ccd8d20", - "77d083ce1f33cbfe9111f212b24b0fec48cf20752e34e662fc3261a1e849c74f", - "574908f0af594a9f3462c210b5bb83c8a08e27f0ffbc1f2a12b5d631e72e3f34", - "2268822bda7520cccac6533cff4fb1a8e93d48045dbcf15a40a659e53545624a", - "0d773b63058b7f623d4f6ed24c1464d33714fcab9828ae93a028c0f568c86dad", - "33862f23d6b6dae1e3d44a975645b8f13a87634b19154c065f7c38982c502559", - "82e8624f23b42798028bbd1e6584207d602edad1a6b0cf41e3d0c7d4a5a1a9d2", - "eb5789a7353c8030cbe4d6db17c010ef47cd03b128421e2e08cae3e988337bf7", - "925d340aa95a01a41076cbe43112dbff40b72331e9b4e185d2bae263ab4fae88", - "60c3d6fa2dc32fec3a1db940142cf16a2b4524b7d39b44e33ae533e221e4383f", - "4d80d6944a306bdad096012eb572bacfa56c8630119d7ec60ca03db15398ee8c", - "4cdd96983be2487c301ccd9c22af739921577d72fab0e1a5d6ffa901d579a85e", - "4fcf60833fd96d0f450932e96138882bcb64df164359fc25bbec68e2969a3ced", - "f01939f6a93269c17cc94f0ef827f6df521ca351d720539702500fdf5e644c6e", - "dfdbc89d343f66e2b75281475accb3e5f7c08873e0fb4c878410234d23ad9e76", - "baa6043faf438719e6195eac49743385133ccb4aee137478b01901b752b536bb", - "32a426cd16ec89c4ddc85b46eb1affee2d569f9bedca6485e9df957e141c0588", - "cebcd2a391fcd31097142190aea9f65ef3e676d08ec5957e88a691c6333ac3ab", - "1a417ad11cabcc92c738a13558744201a5c12102e2a2c35c138e34d640726700", - "51c594e6fb1e3771a325af38ea859100da2b2ace9379fc99e0880c6808a700dd", - "01901b786a50016c85c339f22a70529378982df607e96fdb5335f4734707bcd8", - "3bb56398dd953bbc0309074dd451c26a69f408fa84fe8b95fbf4bdb2875f988e", - "09431a8325b5151f13d52a12efaf4b8a6829933809e79b2c16d93556194e5a6c", - "0550f925235ca770e209bfadc804df2792b12bbeb476f9a101a5a2db639c34ee", - "28b41c4df0a32ba8b8794646f585c020966675c617ca63f4b2461f7b5e85bd17", - "1b9890ed9d342eb16e833f393b0153ade52a7e81883639082910f484e7a164b0", - "72d7587a153dd2a4b86b9f5d4c0d87f43cd86c79382b44ed95635e145ffb1778", - "45a89885697336a3971c0228f25d35aa3aec25bf5ad51e5a47633882d3890f72", - "89fc3141e699d9f3b587974014adf647638009e53ab66eb2657381b205f11c91", - "c09fa4dadc75572268f352e7e9df8c16a7bed278fd7505b2a7e1c4f8a2af7582", - "94c7e501d543a0b84b1ad13abea6a5f8997172f24f3b506460d7dfffa79f0290", - "764dca985fcbfca0a27317be641e0417a4c5954e536145bbd2dfd79f8eb13362", - "965febafabbf0726a4d65a50af42f6b78022213c405b3fed0484623231b9b611", - "bedae85f32cf9aaf15e3965534d62188fed5bb36709996917cac7107551b61f5", - "86161eaeda07688e85da4e4312fa9d214cd991ad0a40cb34fed2918059c6c495", - "a642226cbe71cad6168b4551288dbf6da9712776d8cb97f21d017b08a2d6322d", - "856de83767ee7ece889b4e2dadc7c39e58b9101441575d3641b32c19ac0a2de8", - "aa8632d065435f1b1eada2439435e26e6f9d7d2bb9935a9966ef32118c9af000", - "9b5cd08b59ecbaca09b4dc0b5f1c92a41b467ca7a9f4b84c5c8c2d9ac9f1620d", - "1af967b234ee49f037e804f4133532542f1ce3d5f66991c6a8e41bb4e9029f2e", - "d6df988753cfb9104ff05e77d6a90af22a0fae22f7104231363181fd55d3114a", - "dac2e0fb1840f42804e5ff8ff7bf0f690940af5691c4933a03daef530ce3c85b", - "722dbf3e492467c112f1e17205bd04049ca5f959aa1557a156bbf23a0d54fc97", - "3caa3113dbe7fb3fae4404bce8d459ca34a1e213d727168f061fe6742239a44b", - "b9375da8f5393917ecb436e502325dc1d935a108bf6355fa474a5bbdc28e8171", - "b8fdee60f2590e524d95429483528211ed928d4c704875f9327f3d114151c810", - "a4e2b6208007a3449fb643fa372dd8b5402403bee236842a459876cc9def76ea", - "e043e979b03c249a33c5d5c35dfdb7ea76ea7d7c61a347207524be5c94767c27", - "62d1bb2b5acfc92811ae0019d63fe9dd61b585c9bd09375868fcf99b1b497065", - "6479c91ae2e0357ed5ea1900bce43d7f2c788583257326daaa1bfdefaabec77d", - "f2a3fc419fe1a4978e24aa8897d0ac37ff5b53af76969127136ad35ef6631e36", - "64d594fd981679d160cc3a90ac85962efb7b082ad869bb4a2661eee6abc5469a", - "f9d5a78e535c145d52dd65ff53fcdff8712fbcaf351802be9d1bf56532d3f632", - "fa4e71171dcfc22c37a35e6fd67f051b1f78b0d43e26599f8e097038674f34d3", - "4cf4871bdffc603a4739d2759d7c5c50c86ab313e4aabf8adb107d76a472c813", - "2b0c295b7da71e3c97a073a8c28e12442cd439280a63fac4ab4bcb62ed735125", - "69690df1af2a3882c80d5206c55d6aa3ca62f4ba3825279dd30e6ef7ba4f1dd7", - "709476ff803c3c94627ff4e588684e747aea0fd92dcd13cece96805f7ffe63e7", - "69e80029d18e983d5c99451d72e66b7826d5ec1fe638e991d2dc6538f35f75fe", - "74c90ba74a2db331346c92a7e326f7fc50fea6084a1856a2a2b3ef45bb423ec4", - "bb4474340c8bd4ce90cbb878913afaa2333378942645193b85425eb4d1efb187", - "1e3c5dd9f44e7393299e7d2d31ff307eaf504bbbc460caa1e97d3354e273ceeb", - "f03ee70e820a98bc47337cbb0ec6502c8867d2dde6c622456e6ece6061ca3cba", - "7e08e6896226f88a9f429a1ab9858e2eb2c2f91522eaf0ef04d2bcd90e0f77f7", - "2ca1dd67e68e696f38c8e9a04514651c71f99332f5b1d1ded69c7d96d275ae8f", - "0d253814f67e0416b5d1fa2d273adb638bc30594b58243089a3a8d1a5bf908df", - "fadb71c729d11d44934a14d1daaec7c9479ec1ffc4aac43c3333d9adfd613ddd", - "6e18006a675058decbc300c4352612433b15dd475aae5b2283a04bd997fd2769", - "88e5499420e327d97171b018ac7f39ab8f0ba4a227768f900fdcd5d79b786655", - "0e69488013baf3305064c60f0df34ff9490892459cc2465fcd7823c744e5ea8f", - "f6d867c543023422137b739231d7b8c748908cf76774cf1ac935c52435a6cdda", - "130f5983e923933f729198337d413160c3482cc694a3f772ef7d646ecf33e704", - "4f1e5f57e8dcbcbb351e29b32e3736e8014a1b8004fa13d1e011b1b6f7132c95", - "986894e9edb6ea392464c9f91e60e26ac7a754b74c45454e134120d018574c30", - "13ec7341a1aebc8c4dbc3c7b13bbc21f25e669b9d10b91092a7eb03214490b7d", - "bac23aae083627f7197218d508e0e74d82e316cfe4d81d3e0de71f88bf3b8a73", - "7738c794df6ba85f1cd43accf00554c3d73c755873c27d1f9316ca15946c84dd", - "0a9b2df9115d72d2a7d1ac57fce4cbc656520073e891a947933ec591cda6fa82", - "3138783acf547ad294e8f25b298d960e20d1c56aaf18057e5d52090f1c2eb5c8", - "af0e458b470bdd5a82f2b2c0eb0e474a7ffc7d9a6b4a902896d287b7ee92dbca", - "08ec4332623de1f399a92abacf6980203794fcd4d92bddfd84a2cc828a6577b2", - "9a1f881eb604b7baccead8e79d04cca69b564fec95a278ac011767fa38f20fee", - "4437382575538c3ca4643a0660041283643783c7dd636529966bc548f858ce2e", - "0cb9667254a68d6996de081b9438e6fa681d179581e0997b448407c85cd6ab56", - "3cdd8efbbcb8cdbb79ea5215d8e2789c08fb2f6bc6d0bd678bdf50a14f5809a1", - "71c9d5353a66a3ba56ac03793aaeaa48442a45df39835b87354f566f3dcca852", - "92a193add0e27a58a0c611eaca5dbea03a1096d931047fdde1027992d73f7902", - "433cb886cab1541e6a11cbf03f221f2e55333e2eac5f6fc45479ec4d6f0e3777", - "d42ba9cc0e8d300a2cdbf7965f72d77df7455f821c0fa0ba18a746005355e7a8", - "920103206a00a5cf7e44affb02cec7d814ee2a1a3fdad615de408af3993d69aa", - "76fc3f8f28055cc45a7df604ef45938be5fb531483fccfaa711d532371bc1793", - "35c9d5e695bcd587c1e6879e742d2b731ceead6b368f2a82c5d22a32ff3c1634", - "f88542bd53dc371738f3b4fbf101bbdb0607199bd151907a04d79e612081021c", - "02e67b3ea578477ea88b2f6a783819b49ae05f3af29e620057246b87eb0dd6ef", - "617866dede89c066d455481fb2b04d43d4a0d642d42acfb802922d3c6525314d", - "676177a34955104ecba6c374d153945cfc1f2c6676eb8fffe840170b5a60dca3", - "8e63708529fb61546ae4902fd2fa22b509025a2351c6714c22e1fad366b03498", - "b30c5e47bb581697c9e957e8954fbec1d493b1a9131744bca71cb78cee77fe2a", - "97492a30b4b61c238a2c800bff54838deb0dbac76559a29d058e5c53fb05c616", - "124976a6a1f43148ecd2983c4085c4d501bba7adba7ee23291a08226a482ef3b", - "a0d4bb15d1d2094e4232106e26d12a44541be8999d30ab81909214c1e1415ef5", - "defee868a05ccc6bc6b3d3f22f4d4f3dce5630721a8642e17e7809e853a334ee", - "f3ffe3225f7e9cf5d415b001833059dcf25226c216502166d613a60e6ebd73f2", - "159f3b6a179905e8905ff9a94a84b2f7214a69f98d5b1d560c3b442b04fc36b6", - "2851f04a4e00caefcfa66b4544344cb7a04aa83c0d5bdc3d0ff3eeca5bcda707", - "12077ca94462a7cb1b051e556d57374fd392cf7c38f114afffc2a73507c28470", - "9df74669550cb66f09f84e352b9b120ff9327078552f382eaf2fa43980000245", - "253acdcadd9c5f8b86c52a91e515a67a9837eabf8d8808f3e7ebeaf2e4818a23", - "a49753ea498e8d0ace3c1a59c95f088dd6486e97e207a2fadce8e74aeb67038e", - "81b56fd4235b74a10d0799e237067ed8845a6cfe7c90481cc4a6f8f50c2ae4cc", - "7e052717db60378771c4e20f48a1cb83fa7480219de7a06e579c6987aea3f52d", - "6e41bc285bbdee607b7cd93608f81c7c03381fa8c81e8cb76e7f81898d01b265", - "fb9d3638634759dd5437acbc9d0d1eeb1abf1180adac1701f466c03b5899e321", - "0a3493791f44e2672319bd25df98f11406b86284fadf89f5f60e77c24bafe64b", - "1bd2129f9d4b209b23b90ec800b0aee828e226696150ba031d9df2367a5c5358", - "9e09814c6c8127b58aae7edd7b37798fc20e259cd0ab24b9105b41ac4d41e39b", - "32d6290dfc5277840b33e4a16037d3c13fb23dce1acbef3ad703539bdbf844a4", - "0a2dd56651430db8e808e7d9dda0567b97b61d593d5b44d3a996e3ac3702b524", - "4733528d14839a160f2fa3cb3b4fc254f16d11fda7c6c118fe94649fe4fa0ce2", - "837ce8731595361b82ed7fea9d3ae26204c8d1e65c0b34002748d743b5dda7b2", - "bbac7fd5a8d6543434d7827ab0658936403a61bfac30f64dfdd0cb1355ba4f31", - "16fcc3f5a3d7dd499e44db62a5f0083fdec9b7da88b1542043f9c4a8ee19848f", - "1e02225924a9c549ba5a3659e68d130be8b558187b17aa1b433ac5575b731762", - "c8814a447092c62e83e9a26d8df8e4c8dba605f0e0e4afdfa715417cb240af0e", - "14900624eba6ad9781100efef0b4212ee7f5ac15a785fdb5e53a4a6f09e62d33", - "3ab8c1bda31a264b846aecffed087a6a23d468287833d9650901b5aac6f37ccf", - "0107cf35604f6ff21f01ee422082ae94f5028144e05d87a300708df0c7a36e76", - "84b9a1c14f07e6c0c4162baef7821bb5984a1509e2ddcab3e73e0bd902d0f0cc", - "41a9466a35cf455623b8ae0b9879cef657b0ce80a83a71e9b4e93f1146c402fd", - "2f7dd7ce9631c71145f6fb37da879c57530ae015b3df02f7ff67c6bc07b5d4d1", - "8ccf6fbc4eeaacf5ff2b68894bc357143fa00187eaf8139ea3ca06e8b0791970", - "81c50aa077465780caa4f29aa32d4041bfa29682492f452dfd42cf01898394ad", - "9b44942ebf18c19cf8d8f0fa40224fcab828494f364b92f6498e863e2a5fdbe6", - "2b11531f1855fd128104b7043b61e5fac3c8404a26aead38a28494fa148e287c", - "403b67b2d4b1bce28b7ce0e80eaa1b459c065f592abf48021191636ef6fd0763", - "3916407bfe54c4f8472c61d6e9d25995e2028a9cf5d18165206fca06330d053c", - "b2977bf8e4f37f90214e7f4d5b6d1722b339771284343981de235a44e2491b7e", - "5b0f3b9ffbbaf740e1c0531416d229be1942166f2702f1aa686d6b3f9c3769c4", - "912ee80417ceb3ed1670cb8ac1a6964c5b7fc4a10201ca50eba95eb6ba951e71", - "2666189acae9d9c4fefe0143d8dccac77f668ca21212aa32d9d160008986b239", - "c2a156d6c4acd8ca22900ff9e8f823fa75f7634fb852e8a625eafc90204044b3", - "50b2e686863b4a3f5a0629b4d2f3b961aaccb76aa4874bf2269622b4a37cbefd", - "61711c07916e8cf77023f2711e2a08af8a6b968b998e7be5fc6bcc5cd1ce3915", - "7989e052aabb98b2c237ba62ebe875520a0746c56fba3e495b0a2f51fcb53afa", - "4caa9d54dd3257a452bd69a3002b452deeddc3775ece5d44bac8104d0fa69736", - "f57a802d4c67a8361d203c3d75df8a0256fbc681657057f7ab30431ae5c5b09b", - "443d9f5a3f44f39ef5ea638b04ae11055c5703178a197aae84da2b9acce78e36", - "a5b7949429c05b37426313c0860447c75ecde0b5a1ec1eaac23e0e6198728bf3", - "b2b8f96c6f4f469e2b35b576cbb43d950c28ad7ba7b8f990e202a3577634df86", - "4bd68b6713857378bdcfd16a0be5aa6aea70a4e1669c59db549c834e39f51d88", - "2bb627a3bcfb6f9f59edca34354a611bd23bb2682b6446f42a6595f9721cfceb", - "2b92d5b9f2faa3ab0e45bfbb6124a9dbe5a82125dd957a103e249f0954c9725c", - "403f16e95ba4a583e934857a64ca7b73c561b12b37f688d2cb5646025d35d157", - "8d2fb8251f8a81c47f31d543282ef8242f163642f2799f000d03787aaea01175", - "9e69454599391e5a498acdf870e3673e21ff0155e5bd18a63dbbf48d85ca5f39", - "2b2ce40e259fe2eaf2e10f1402cbb50167d512c03297ba35423aabeb0de75756", - "73ff4646f9503b4ebd982faf6ee036e3d520edb675dcb555a175c1ab671dd930", - "f5d3b54642aaecb5acdd965698a6f833ab5bbcc8f4b49103808792ebe59f13f6", - "9a432291995ec7db98dbf8b8dc7f2aed857b541afe705592433a3a217345e939", - "bb005c34857fd98afe9245345683324c1604cf3efc486790ab2880e349ae94e1", - "2eb2bd5651970d16275aa4747efc3b7a8d8eb2fae989d674f8de585785cf4a08", - "8fce7cd4bdb53538b7bd86288ee0a5ef4032a10aad65de9f66295210ae5c185d", - "e706d041fb8ca00381073e209074a990e2a0a8d6628d9ae3314bad37d6ffc69e", - "ef8d5f88c61b2b688d881f0276e7fb8edf7076086fcd260ec264af0b033d9685", - "a29913dc83d9785c1aff1b77129a3a0f81a5d77368a6f8c5417b0fc4b4f72d3c", - "819e5339cc184df56504abd1faa21dbc8780f97ecb9c4af7750c79ad9ec213f2", - "5d7aea5fa72197bc53b2788ffbaae14be0da643889fb128f45fb5bbcd847ee16", - "69548b932cccf5ab65794050c9f33ee718f364ebe4e9542e43caf31e1b7d15e6", - "93b113846fe95aa42a39d54cbc193256c24f8848a571899ad4cf394f70b66496", - "f05ff817759caa6a4f09c5d2ca8fcfae98401ff6892ab3ef361ca9d3a8de07be", - "17599d7e9d979afb0d822e8cfc243a72be1ab311a5e3c542f62db5e182361d45", - "5f8ea5bc53b47227a8139a31cd44b9389418f2001c64a14bee99c2f79bae9551", - "3fa1cb55b7c10b6d37ed734e0368f02a2a6ad721625d0965ece256359f201605", - "a992ef00f69c83e2a64e0b30b68f86917d87b36bf7a33c04111897b0c0a019db", - "1becad072563288c46927ad50b7e973f49bbe5fcdeec411870f6d35b4c01f367", - "d00fbab4498dc941f74a045f60242822a5db06e069cb4696910ede462253eb50", - "7ef0eb4ee11fbaaa4240b74c388051bb61a26523364fc7a46e69d532592f1a8b", - "4a326483168b2b215d5e4f368faabe67d75070d6da75ca5af5f59f7beb1d23a5", - "b6b34823b07d8b053f9681bf66a2a3f5ed42609760382e87872133318b97e136", - "85a99c69f25e95824906301b89bab27c712e4f82ef62990167fd3bece785a276", - "92aa8266484a6b4d17be21327983769e0162fd13bc428354f3727f9db3fcf79a", - "86fda718cb4428087511a8f9b7e0fe6c8a28c1c107009ca6f8c68167fbe5dc11", - "6b37e389a6e826075bd718b76258958cf9f68a4241e45341631a97ec8dc1a457", - "0e1cf103e0e43e9a19a61395a1e7b13f4d494eb1556ae0626fdd9c34d2180ce6", - "1888d402d52a7610eb373c6be2dec202d013b21382c18950ae6ee2d4bc34e416", - "96b5c9916cbd37e83de57ab7ab69634434b7724a1b4728ea505f9c329f9d60fc", - "085bf39eca268c14e74618711b249bb5041508c64b87982006f5fb62c253a616", - "d5e340b2235c8591407487476908fe1db9d0fd17cb153b898f4b92bf2f61271b", - "489e7ea819e5be4727ab703b2cc9cea1e1a3511032282d47d887841dcc01b3ad", - "005fcfd641c511d0c2ef934deb53a6a8a72c3589f872fed9b260a0feb03a2ee3", - "ff7c4628b85ed2a6f4f341198dca64c75db473fac0f2ed9412cefa7ec8ac7574", - "5f355bb9cd31d133527de055635f6f1453667f4401a8f3cdfe336577db7a1600", - "3fa9c07a4a53d04e465d5f936d6c2c04c5132b3dbbd7a3535461b2714b3999d5", - "21c511ec71259007cb9278819733248a2b8624feb4159a48b9d7aa8fb17983b8", - "ffc001e2d4eb3faa42498222a88f89b5ce38c1703174005247fd9529d81dfef1", - "897ecc7224f55e1e8ea1c677ec1fd0a3ee13a7436147843b5edf125375f5329f", - "2806b57b3354a133959fa2c2d180c645eb877b87fc21153acb2945508528adcc", - "7709864e39660c0e84e3d981531bdb5567907ea6cb2fc68a96af0d80e9773a9a", - "b5eb1d3d9cdd91512006f2ef6ba9f82cfaa481da2cf0aa011d49e1948f6736db", - "4d727d7574e40e7f6f34afca6f3ae475c31b493d9579aac519bad4488509a76c", - "ee9d2f7cf2ac992da95a1cb36cd5e9dfbf6871c85bbe8e68ca36ec2fd12aea74", - "5431d2b25de7c43a7ea808b5d383d8ddfb3158b256289679288f7cf744755c18", - "33591b9a060d8b187ad608e6db14d8ca7d88fb7f34bb8954d5631e2a381db039", - "4b2327a9c3da36ac1377a9ad21ae9a0b33b607aae4e96872d8bda768b68a8e9a", - "4f599aa385e80d24d3b2875a3aab4df45edc522c49b860148b76436aeaae9dad", - "6c33c97a1f87720d1d03ce2a96bac76390ece1456210e021c3ef1aa97f971d78", - "591f9aa8a793cfc5684b03fa2e0350607decf17128f4382ada393997170966ee", - "bee45f0912b4935711f0f01cc96f1995e7e8187a91be11a4a53f31d4a6ba0847", - "0d26678bd705ea1401a567b7ece7ec966451aa67a67a977af6588e79cbb98d97", - "77a46a8912732e74228f8c40a3987098474ed3321ccc19fe5ebb30c1cbbc46e4", - "96fc9d6efbf1d0afd9e10eeb8ad5dc858ac1ced2f0eebe32aaa59dfa79b7ba02", - "db77797de544acb0eb41bc6e60d9d80290e0b30bde83945a45514a5800aeea69", - "840f8d5dd8156a42e5a75330ed1b0195ff1be310ba8199a5342fad97f11a0bab", - "29421e38943c8d8a0ce4e5df754c6c95d06002b5f266eeafaa66625165694fa7", - "cd2e775a88f4dfb389d20e02c6d8fe1b3f903468fd12653b0694b885cd3d5d98", - "2edb394b48bbfe016c0d299c7545e3e34e20747e9eda10dc17f0e9bc6615536f", - "22961fc491bf4438b7e3e6d9149c3db744aadce61cfe73c000dc3cb834c6993b", - "d4924c4d043972f3654b2bc5d5dc7c319400e28eab5e8fcc448dec089064b3a1", - "f334d02f3df816fc396d2627bdce000851a323e819654b29d9feffd00f6812e4", - "8b2a2099793434c5e83d061a03a0954fb3ad1f7cf07fb6170b64dc1bf54154d5", - "2086a9cdaf8eb5bc0349fd5b87276bf5b2390cc4e94e78ecc7ccf37a824b205c", - "34d43623e86b5e0c2f78421b7d5dab3d7f9aa17fc57e5d9a36ce10ac8582dc21", - "67f167388ba8d262597248d9438fd365f0dec3a478a46587021fde0053350e30", - "26b30b28f24c1b8061c4bb4c9845fa2ffbd43752478f0aa0309d4b9b4726bbd1", - "33158ab2c4ddab33d6787fbb325cf96df4915cf92142b8e7217b13703e7da7df", - "aaf889503681e9ea7c826500e5cc35e9e0d66394c1db816902bca7db16e851bd", - "2e6c38e97f85a9e907ccaeb46de21d1c2a1116ca8db847e0c1fde880f62fc364", - "30968c1e3fac1582b99f60ca4f847461c0b5e7de3c9650db4487af999a51bc81", - "80d7b5132ec7f35ea80851076ae0c376ff88bee71791bad9248edd554267d918", - "b533f5a2c1738b0336b3c5aba4d6255d7e11a4e2fc63abf294c256e177dc7098", - "95f0e4a491956a873f1b197cc74b257d0b819fa7b0b95f07f56511a62d7ebab9", - "66b45a3860674700c74cc457f50cbe1e448285ed248286c9e21af0a28d43160a", - "c75f57b518586ccd95a4bf14215496000fc8f1f07b08ff7b3ec3b087b4a05e0f", - "5bf88d60220563ff9eb1063a260aad83cee222c0716f4ae6a006b684ed7211c0", - "7ca81349b31a6579b190c36e3f0e435e7ee487bfe1b5995ee6d460806fb7baf2", - "b338ec4e3cc092dfcc473b043972c8d1c9bcac18538ce8f4fcbdaba10996a428", - "630e471398dfb8123947f0893e2c54e7fa5c0547f41006e16cf5f2ffbd406c00", - "64bec508758050e38cd416304ba7d6f21c51d834edd82c970ea53a2eaae689d8", - "088797ebc702ff682ef25bb7c36980b01f3725df67387fb3d97ba10a34477ea7", - "ef89afa2a98c410f4444b104c8ff069cb1082172d551ebad57d16b13df3e1601", - "0a7140f305805940081e63054b1a55c676029be3e540d9a3b06ddf8e9726cd50", - "386857086fc9e7408f75f8fda995d0a5aebdb45507e3df87be385c0f877ba79a", - "379e4c44f6622d5bfde1efeb0838c371024d61221144c4d4eb848a147c1783d6", - "023b6b134fb46e808c1d6d119be02721c0d22a7f330c140bfb151a3c69beeedd", - "170861c9f57620be71ca87ca98ab86f207f8cd95a40cd2c9a25328b3854a4a42", - "f459f2db9ba98656b0bfab42cce4eaaa36cb397508fb1224b08f149892a370f3", - "62edad44ce840b1cf47ca33caf2868a0402472aa7d41145ba3a57813d897d539", - "71e7839fa2ec4d968d8fadd9232aabdfdc16dda1154f4872b25ccfcf7d5ccd85", - "832a61a231d18bc7f0bd690a170d19cfbc234d78d6657617d527c2b01fe6ab08", - "fa96f12853b3cfc78258e6ae1fb0d7b5c2125b0917b64864ecefb19d9f08c11b", - "be127f12562fc38ca5db3e185f59c6ff0821ed9222874885b1615dc195acab1d", - "ee0e301c4b8b27675da5df688c1c62aecd310f058a91a765ee97ae3312cf2306", - "9b947a6f876889883bf7e99cce675a7a84172c9ac76507ed5fa6a2a06320f2ad", - "7c06d17135004d26d10a6f4fc1e0f42bfbc58b5a2d337237eb3e18245ee5aad9", - "129e2d3f61ea1638eca848724eafe0f065af817e23ba49d26a24412cc24358d9", - "b0881aea72fbaec57bf2e4734d50e420ef570e6ddf2a0fdaa7687f2f5c1d0b75", - "fa80e33f1f18000a142a68c979a71bbc2e7618ac7330c1042d779500c5fdb507", - "dd3dc3071779a7aa70a9b59dd8405247bfa3186dc3bca2a03a368752c8ed27b4", - "5fe2cb06b640b9d47187aac05cc169534d51c630bd157ae555612bac3f6addc8", - "e60f16251179feba00a11806fcac3ccc8acd8d113adf5779b6dcd52252c5ce93", - "df9e1df541bc58346936d05287ddb49c3808b7c6da19a093811a259efcd833e6", - "6fc73d698eb755dad277d5203016ce97e144cb8993bb64b0fc5b43c96fb2125e", - "2f4662335e572d3f4a3bb3f55acefcf66955f1cf533ee111c84ad258983961fb", - "b7150bdade8a2a4da55de77ba2c0daa21da486396b6bb2fe0013134582be94ba", - "079ac36aa69b4eb7b46217daa343ae73e56afc740be7da05e0ade69abfc1ed36", - "b92289dc60446b1ee4b1cde54fc2ce8506a9a0c4b1c6bb23370a39cc01178f38", - "feb1a727e8b67bde9600e76c8248edf4a5712ec5d5ee7c57f02a0d965de4308a", - "e351ca1e4f6c7bc6ccc991d0fa1603c0ec201fd931f85021f83dfdd39968d6f8", - "bbf98b03917b6af73385f3b4698aa194829bccc4a8c847105d084ee9b9e09252", - "791b0c90c44eb865652b4b81457a3a2daaf6019e893f5409a99d3aa45e143914", - "10ea2ef68735c3183820ae8ce891b48043927d9517ee0c817c2c54a8d457480d", - "89cca39f0cc196b94e1796d6595fefb7d995cc04d24305fdd7a28c0eb99f6b43", - "4de0df8099e576359055b831a4f2069f1334aa013e6b0c9d8d47c141018cad8c", - "83fac64373f603e50071aa54d99afa89eb27f057a6959cdcfb7ae570eca85e16", - "00d9f1fa2414b5d286617fbe021845a89ba0677600d67290658c4fb10691de19", - "4eea845cda53d55685c39da3be280dfd94bfe0e338c4ada657abb74b4db133cf", - "7ce7a082d3e8ea4502aeea8cb8726d9aca5ee978051c4b0df9e3d403e5ef69c5", - "4a55b8b799110fe6d2e3cdc775b11f992bee6c46b7deb914befa32d4648acc1c", - "02e8129014e85564f66e7ca7b65f1df9939ae6efa8f962e401dee3bfb02236a9", - "08fe7cc47979225640eccb7d8cce15a19a5c82a2287187e088d9e6ac8e693424", - "3f041dd7e1d85c7bdcb82ce4b6b07f5e9fde617dc16de4146fb9d53bb70843eb", - "41c1c873fd2a0776fe17dee96c645ca6f77f4642771940bd62a242ae5d3216ae", - "8bafb882a1b23c08b682a1521510dedafc7d0bb3404ee4ca8abc131cff6c0b05", - "a6321b5525955ea130aeec90ed02b25c7fea7c9c163854626a5787b04543e7cc", - "b6f6261bf22ffadbe6ea39f43a7b4bf0e94602597af823f45cd77129dac5c93f", - "c6719712f36025ef37a9aabf002a3be854fc08e499c23b4d7d03dfadca19f7f1", - "33ed6902a64d7c7049c4bba88b10c1b60178acaca3b7b42ba2ca1bd1bdaced9d", - "48582c753f5ad15099ac7103f7591b34d7903e8a7e42b9f4c6bb77b8001c968b", - "0a7559ce3a2e6b2618b80d9329a89331b44302b70bc9c4357752bc634aa99e70", - "1c468158501e71dad8e57de17d344ead232255d46b7010ed1e2098a49d051e29", - "106813ef375c3e92f27315c0bc225b99697e340b2b96858b9b873b3f4d16287f", - "2c588bd64a9003ef8f1ff34aaa3b147df2d702a2c7fba54e728eb1e5517b75c2", - "9338d36aa85cbfb0deda9251d7e3c154421e2e18fe8ccdbb6a20afe645c6bc3b", - "dc205fb23599a29c40a48ee80a0774952541fe37671f0da7a185e0a8bc6622b2", - "010c2f2a06767785c362276cb8eafcf6e8525e408fc0bf995e54b7da52e372e8", - "37410c868d276c80dbcbb848711a34555af4cdcdc534500008870ce05e1cc862", - "b1132cf739ba7eeca561a013634109c6b86fc4733b6f4bf521ba5d6578298df2", - "59098a3a4778befe5c0ab7bdca5db51251d35833923c550ec13d055383acaa74", - "e440f422ec64530a896c93fe4313162aff5db8134fcccbfa793979ece3a9ee17", - "4771cf23e8ab92764ce615b6bc721012c7a29ec0f23367b787f1d75c6e00e454", - "57d4751096a984199c24085a5bbb06cceabec1b2f2010753cb131e4f5dcba2b2", - "987b43cebc6a8d9b33b07a1d61a2f694b44781f0b75b4248cc1cd889d77f9f88", - "93eb9f0614aaf0178686984603bb990ce1c6750b0ffbcf94d334777c53de489f", - "86bd97e82f42f8b6422f05acfb456ae5313f27fad4bc486d54ce40d0c21ed53b", - "87941ce0064683aa33f75e284561818cd241a2ed2d3d5bafcc34314c6dc55264", - "64354431716ecab537e9b0da38f808a24522e46d35d552ec0a4157b22b358a08", - "febb826cbf4a55bdaca275632626ef1955dc5fe1c25aa650d734c60ae6bab32b", - "e936b21e6f3ce33ec8e316cce567916120a4014162f39985981a7ce9df4e2df5", - "5f1fe156357ddd3b13fc5a4e3a32c1534f561374b1605bb5c2325dee812685e5", - "8b95a49f70f64bb2c256923c3d4b96692230f60181369a317b1509fafbad0e00", - "1c1071469fc416d39078b6058dfdf66446cd8dcbc0784c0e4ed572e9451ae55a", - "9977af5e7756a9fc80cf7da31ad8b25b112f475544151f3fe9979c4beeb59129", - "cde9ff6280d1493a1bf1fac5b0f9e51e90777149e46946bc4bd3f304c5d69f9e", - "2d4463c83e2377b20e0ec9717e7fe44ef79f61286e53899d7c89f23365b85dea", - "b86be01aad9ed0a48024348f4dce59fb98d76c3ed77fcb61b338f653ed38f83e", - "76fa64fade5c33b26e288f6e2b0f011a1c10ed6554eacb0be67a166dfc12adff", - "873943323736077061fbc3a01a20cf18ba6a04ecdc05419028edb473191db79f", - "b13198a67ce969ee5cc3c4fd719361231f4a29799a1302a1adbabe6694857718", - "d0db82ae3ba51470e6e9e68ea4e9b7278e4abdfaab09240258accf8b45169a19", - "b437371110101b62aa8003a15ebd8a692b72146cf05f2ae6af0aa36b51a1eae5", - "a9354028d87f85adf1370f0e6f42db3296f497d3cdd50ce85d44ed49b879bfc1", - "089d321dac8939c168c5f2ca7a4a9ee314a780de2e7c66c67cc8a4e71a901b7d", - "36c20889a01b466aeae5e8a75b8e485a93856a2784818ac8e5e8716035e1d6cf", - "713c6f69372abaaefae27d5aa59769bac03e0cdd8f489c4244c8cfb9460d6a5d", - "f05255309eadec7bbf9da5e283995ca98c81e78178022f3242eafba0284a31c8", - "9b83fcb1fe9030061b3779e9bfd127e691ae3a137bdbb3c9043fd829f35980c6", - "ce86006679bd568a2090ded39f0902930d2a8db42ea2a76ff5ca8e879e3044cf", - "80052a5cc9511d2e7e5ab729842a06423dbe4aa8050e78662f714b90551a8d96", - "a484d79accf174ac0d0f1423a56c5c04ac3bd2104fe4240ef23d9679fcfbe648", - "843a5449297b9f74530794fd8b788831dca4dbe93b68de38974385d2b5750e9c", - "657131e4d52afde40dcdc38c4da3edcfe2f8f148c006f50441f18e040db8218a", - "e485a158ca4e28874047c68d0aa19c4ec2bd889377481fb74625eb6bbb50015b", - "de3befa1de485096fe2050bc414ae27f2a4c4f5e4dd30908cf9e4e492374519f", - "9562be6a1e0672f87eb7d0dec8f231f20138a4f2acf95d0b4a3a5a8e3b03fc06", - "61ffd0e00021d92c31ea2e0f538827646d8b428dcdffaf33d5f1a9a9bdfb65d9", - "24f46756f6789126b536403655fb6e040a496e03f9295312c93369c379aacdbb", - "2a5720a427c800c864312138866adc2aacea1400310eb6cc6bb5f07f70b1e569", - "95192550cb846a83b7b7607d21ca1572fb1d7cf427ca3a5773c3b1e6042d4afb", - "ee4da34cfde7b2ebcd3f7f4a73a6f476f6f6f8a5b034efe444b2f53441988be8", - "7e2f91c7c8d4da8b6b5d86ea69ba998fb051c0d79974e4bdc4d2028f35b29705", - "3cc6b6b2d77ddacffbe68a6653bc495469c6b037b64ed64aba090be3045b9ba6", - "a8422e1cffe7f4ed4196eaffb62335485139bb3dea8c3b8715de32c631977acd", - "2776f6c06995ac447be85b8f89a915cf984bd1ed8fa8d9393c088d8f591bc28d", - "45f7e4451c7c05a7d7ac2dbb9f0c9c9d878fa302b63985de72532056d52da4ec", - "4e7c7eadaead452fdd262a4152de5fe35721bdd689ee8a347d731e420c5abe4f", - "8a68122a128e7188727ffe72df45530847d324ace4aa89fbc714c1764e55cbfc", - "88f385dbc7e666e4cc948f3b94ed0f45187325812a5fb7162eaa2e04bef62833", - "34c4496b7f33deba3a8557569330ff215147c0e5631f9be230ee32211341186b", - "37db01beddcf2153cbac83f5223ce88b974b5cf5f04addbf57490c95ce173715", - "048fe742192b1043a4b0865f794c5da899b1799879ea637bf2c70751dbd92232", - "435d8b94c261b723dae7f1862d59b766ad3d9616bc1e64b77a2f32aa9b9bc010", - "533ef4c0ebb38340c528f8ed839a029ee3fd6411455c1a2a6a6f7ae166456a90", - "2144be66345ba2873f31c1d6259cdfcc4254e7eda54de4e5d5dc426c80dd8833", - "3a99c16893d0e5a6f3c943caad4b8cb22a52bb414dda9571a0b0f1b417f72e12", - "357ab575c69fa9e9b17b0c4a963e297d22e91d2aae9b1654477908c99bd7eb74", - "df0445b2519436c5823389a2c2e2ffa8385eaa071c9fe460be53c7d91028fd95", - "a89715282671759ce2918a28466fbf85ed1ea222105314f42a99159fc6d9b24a", - "52d023f6cef168e3507b61e10f662d1b9f08e1de859074e6f3a70b8a63325e52", - "9600f741b56024348037d4b0c2d09472e87f94859b8a04068e8ed4d1ae020231", - "6fd275dd700f371cfd9ac8bf475f6ae9c8c5418cd224e2328e527faf1a4b4d4a", - "ffd32a132928d9ad144e3792403701b76a121fae2f0c63dcec32cc91dd4b4df4", - "c3affe961c8208b7529ce5b1aec9daff6438befa505bbf068b0c10d26dd7daff", - "279ede3d9e66deef66324dce99130cdc20f5ada9705c7540558c863111cc18cc", - "25750c57826e7c5bcfd210e148829504ed715024c5d5d1643a17af41f3f9c70f", - "a47033c5b00cd1787939f1d6ddd5160a4e57fdb7c6312a2a02e99d0da2effd50", - "7061d3bfcf678d81e4368b230bbac631776467796f0ba152c834deaf8c1a98b2", - "fe764d174a84b1bdef460fc39fe507147ba5a67773a00f97985ef607ef0b1c21", - "752bb997ef463254dcf6f0a05028b7da834671c89fdb09adf668834473082c97", - "1ca7c8fd7e166d96ea1394d388f279c0b0dc6e9ffbe43ac615083f4953cdf218", - "1cfce7c385477f424eb4ff0daa49e37c7f3201e9ae72b347a4b99b62af1cdba3", - "63c0e8e6b58a51750f7cbce00a8e78067969c5d6a865baf029a1cb641a69fe5f", - "36743e6ff41c2fe2b82a1b89c2f3f2bdfcf7bd2a6625e738fcc83dcce1fa165e", - "bbe0111371c38cb8bb8a84a269aed1371c4a327fed8a85a7912e5880e8758cd9", - "8af872e734eff639f1e36851b762e5590413f278465d4ecbc49c2e085875e4d7", - "c093ef62458d3c31cacbd024fe99932b95d0c872388e48a15decef1cb4803652", - "6d0d85a875aa57886691e0b72c661729a752f1646c37078b8ba67892701baf91", - "8982f4a4fd2efc850248e827b6196e7be1035d90275ad582a6610a1e3c88b8e1", - "1247fa8f45b6f29163558e1db09368656f6a2b55c19455962c9516fd64e5ce70", - "edc0f050947d49aeb7f1c42e0cf10ed6d1f0c8acdd00e8fc3c8eb794570809bc", - "e7dc280df5ab86b257fad709291044435d0b7be68cda5a8a1c17ae01e75a2783", - "4200b1681596c0002baf15366ec1661dced4ba0af6dea31730a3580c5bf20c8f", - "eea30c9f4a17423e9f6b920d4615ecfb17842bea348fc10cff807648fd584ca8", - "47fc50870f97a00eb93b2433ac37e1f95385b492511efd6e7706196eb3dbd0e8", - "2213641d58391947f9e81a4c4ce8d0d46d10fad48b27586fa5695a62d47fc555", - "6b29cb6a9c3c477cf4f7a2573ac5d1f84d7c4b78ccdf0478ab25313ec53f136c", - "a0518382285504df898ae8f4a8f0ebe191dff1a272a09e7f3d1159224199c1f5", - "3f959c1010269bc57fb714ab1371b6306d0dab20c75ebd462b92002fefc53b60", - "7f950fa23a2f056d11004440cef2fdae0d1533d9ca7113ba913f3dfcfa648af3", - "0a864cb19d77e477f6d9b9b40e71132dbd2427ef893e41e4abb4766cfa548298", - "e75b98fac48eb86bda4f4c5673b2ae39242454d67148be6850595e70ffac55f5", - "c506eff194f636667d9ffa6046260f84753911dfd612ec0e1df3dbb123500c3c", - "1ea0272e9844d16acf539ed9ede183a431d2659231511ea3540afcd286199a05", - "c83727c72a98dbae4339f7fa3b025ebc6209714f9e96bee9b1fa5b5c2fb82518", - "170b7122d2e9b109e6dd668185289bfa30b95c271af9c7d483e6191f6d0bcf52", - "3f8b28893acd32786d4feb97932ee299c7004d0a0c1bc9b407433da630ad0717", - "0f1d8aa26fef7f314894c7840021186040ff2c567bae668cf59d13d916fae001", - "70b4ec7cbb39e78d127ecd9e4d85e298d8f855f180e72b820a2d81c27f75b1a8", - "a92912ce3e54e8791593a3bc10448f768d091eb6496b0e5b633c3cdc3092f59a", - "afeae1618908a7c01e033d6d9ce2a5f057569ff90ce4e6fb5130f8654bae2846", - "62a8b05b62c492300792a7675b2a0c5c6a2f263f5d51a0e4d14ce43e75de8ac2", - "0d7139feb22ad8ba1de642423904ec6c2aa22be891388a0bba338e8114e55436", - "033d93384f87e2e68b331fc21b3ffbed3d1015af506effef24d313a1c9da0479", - "d907ebe417c373961810bbc49173a48a5e6a6dac1c3e434a0cfac7f154db9871", - "b301393281f64218bca20aae8ddde5d4b16fd0e30e2ec83d863f0c60fe0f6699", - "82f0e727b3b8ef5d87089ed47cd22214ca7e8f0e7018c02592e2313a2dc9fdff", - "da0253ac6c879ab5dd1cbfde7b2f2f66158c0313da9758069a6e1ba808ce510c", - "f9d16ad97180b54d713846f1cfb62d888b3b71b09c792eb24981efac9dddf158", - "3e48fb5c3cf8a16d07407859ad015e3ce234a5e2d86e3aa6c9439cbaf0ccc046", - "5e9ec882ed032432982d1708f84bea4b5c8da97a63230d95950ccc9ac87e5495", - "febd71b1bb6e8e6d3556c59f9fc3e1a3db4ef4f04ab0ec9b71e0c90415b4124b", - "d9908cd9f5169ad8b4de26893f9bc1d75fcdae5794efad4245b02b6080f63d64", - "f6e12a161d6a5e4af9763b330f6dd84e3a31064ff9dd39bdf6e52caa1561a598", - "2b3060e0e9b25c7c2804729a7c8bc263cf01b3cebc576130c01647b99a9d719b", - "1325be65f8a8b8aee5614c1e34084e3931e1ef3cb2f335f97d966f770e08696f", - "21cc89de6013aa0bf74a23cb50a58f857abedf83972a3db0403593bfc7518afa", - "0e355442540a7b06cb2448033e407c4e2dc1a9d8a717cb403532f39d7ea27459", - "acd823f4a32e63e43bbacac7f919b6ba3a8ccc6000cdbad39f2348392849e74f", - "396e99481a190ef0139a45438c10fc9cc2d63c45f67ac3f9be35434a1256ff75", - "65e77094d8f0dcb0c01a3fa2617812b6b64b4d8e13e26492b30de1e3ee826316", - "57ffa2d9dea291e310e98a422b7c057babecad567582051c7d3e53a7c7cfc280", - "15cce49eefd05d20fc529e9a924ab412285b519aa402597be6a99b0a97f5dacb", - "9daec43b9647891b3ce805f8aeaa2f157d98973d673c9c3fafba2ef4589cb905", - "b290ccff43a303b34c313302785d821a69d1006cacc31e8eef564ad9dfd9455d", - "7c86cab230443ce0b2eae4b49909d10f466c4f9d55c1baf7ef3b54d8bfe64239", - "17eef8bda2ea107e28374ad05f0652d882cdf1f713e6d214d4c329b09b368970", - "b6ccb7218d50ad8039b6e02697ebd113e96ce45704e5564cfa6f8f163629dd1b", - "e04d780b43c9b1a34f801fac28feaf22139bfa4942e5f85db4ba670f86b728e5", - "d712ac75814026f0309fc419c6bcef5dd5a18f556a25879f634a2aa47c09406c", - "954ecfde6f6073e5305594e9a4ef053ba048595ad763eed601f28f307858b69f", - "360a280804d2353cfda0c8a2a64d5c03d7fed36754065abedd2d089678855043", - "2f42138d27532f0964672e40923e0b21f2850f2e128ab68f620a3e4b5c94a75b", - "eff8d11cefb5636c68007ddfeed25803b81d39feed3fa409fa60e1fc6bbee6cd", - "b4160cf76b4e9bf65aef1fea5c67e5dc980e257047e22b28e6190939818b5452", - "800d141b467ffba02515d28c50d59036efa56d6d0b5842c16d30752bc89953b7", - "4e8c74000e62e3ec4bada39b1b2977ed98458eb0ea0c2ac0fb6c1118210c5693", - "220a637beea65a6f118fc7999cda5e64e9c1943058286a291ec7ff37998f77fa", - "c053fe5359d33411380a49605fcf831171611b21cdd2a9c171e10e21f8ec80af", - "cf8d2e5bbbbee6e699349b14c5febac6c9830566e64166fa4e5fb276a04ae98a", - "c975c3b24c20093eacbd42592e3eddbbdaf383421f8dcb29e5b57aaafb886240", - "f888b76d77f960e8ab027523f0f8afbfbf4c8968f179027c56c5c910e61d4f6d", - "0fc8c0535f1977a4b4b0212dbcf837479fe2f6e9a09a2de689f80524b46547ec", - "a4185cfb17a0bf6e6233612e9646508062a7471e04b09bce6a72176fb6a49c0f", - "4d609e7677af809274800f21a69c88dc971f81da480a193d27b65244eff38889", - "f61c28a35b6e2c141821f1c9cdce3b988130ab9ee4d5282b531332f7bd06bbaf", - "f5937d1af8aaebd5f41774d28bfae509b86c8074888f95a1c1c473627a526fd2", - "cbbfd080bb579f7a60f5c161c7b10e048b760dbb83922363b17e4946a4143718", - "159677d536f66d48b4f5f202e7b65ce246d067b4fe59a376ac89c641690e626c", - "592772d7e920498cb2441402834c6abb3d742247f5f51177c9f4d08e1579109c", - "991fd591996c8cd5b2ff57ad2fcfb4e8ff9a5b50a8983a518cedfbe95674e41a", - "dd4fe8b74c2ba2224ffe0ac7a13cdc23b4df08c3d6279ee7300674007c687475", - "12691f3eb680469a1a7505e4847d67312f651d4e0879fcd4de7b584a565135f6", - "7b6c4d4ba94d6bcecbb2eb674801838b5026f25a9827e9b63be95c80e7faf555", - "19f924abaedeefb59f7aac25cfa0a9f4aee982010f3b38124b08a6c60fe468db", - "d65194fef943fbfcff4c5a62e632b89ab7c11ceaf031a4d6e539573284304886", - "db5d714f5371f4dd666fcac21fd06cc27af0b9e9fa0551501c5ec3bd14ac525d", - "fb4797ded97cf52d3936d75b67caa739e351d7e2a728d5f85292d816090b4c13", - "c592788103dd3270602be7f0fea3807900402fea40bc2489f77d253a66db2f74", - "b5ab85ab67627511d380f80bd1ee7901fafcd9576aca11ee280f4e4f07184d1e", - "657f6fc6d0709e527840ac455a2700904c1c17492a08b66fa3c6787aec08b3bf", - "bcaec4f25466ec8770015f7ba782fa509f2372ec4dfa4966d3bb6072dfbdd514", - "4a537bc90be52b967b30636a68979d6b9641d1de20d23d697d414dc09f3e134c", - "8b377d6584f2f1576174ed9816814b2b4fd919ffdab61e1a1ccbe63123dc1599", - "206cd580b0c7dcaea50b564d48df31f7abac3a4959563335bc103e4a92e1e885", - "2b8d2cf2f3526e6cb740c832119441f6e3400dc49a3edf04b4f6b5ecc327e978", - "ef608a52fec86be974d99ea501c68dc0e503c08e46071182dbf84be56523a6a0", - "bd84f1cfda9d4a64f5e0f6aee29271b857211701513345c57d8f6d8d7fca9295", - "1de6c78fb89b3aea245c28f6499445f14457b3c7761cf3519589dab30f385030", - "27657bf02e12bc774c1ee60c224c1747f3a70ee5946b7767d925202fe621833f", - "fa71bfe6353cc7f75bff4482d5841afa9fe2a20aabcb91b95bdff74c810ed8c2", - "70bc5a4cb88ee5e64f92dfb6844a330f552ef339e2284d7c71a4fcc890fb7dd9", - "c975a64dda9d70188107c6d91ccc13b6c4aabd0aaa89037fe41d460e6b304a55", - "ec2e27e0101d6e371584b22cb3ca92c803d0ada01788477b6c0addd7757ee5e5", - "42fc39fcac38066f7f3bce0806bdb65cd8e81eeab982e39d29750eb97f0ad713", - "24369eb0bdf2c045e7e2d28a5c3d4c1932b633adfba4e4a5bf296cab3e19ad4d", - "766951c329d161ce03b0054724812f8b8878cec25a65249da6b15c4aaee90cde", - "2aff55b5dde47448fee16dd92a3521963d5ceed2d68e57145bbb9a9191787528", - "545fc3cfc456a2725a06c83ec48c0881834688d2499e01b7bb5ac853c4fd0dd0", - "8df8d795436c1abaccb6b61002f8af53f855a87c39fb6250b22ef9bce4ffb496", - "479f227f90073561bce1f4b4b5eb300e504e0e5212e71750c0db25e99a259ea3", - "c081291f009f08578fdb897ce2284bc04c32bc2a55190d906d73d6183a028cea", - "a672e9a8ada28f79cc2a867aca40e0eadfab2cd9db650585f1adfd7ebf140bb7", - "0541dc6b854d72358698df2e99d8a359fa74a0597aeb1816843a5cc1f23f7d30", - "4785fd54c3fcd4d46969e26cb5b872de568b53b1afca25729bb8a58e5fd7f393", - "c2ecfc67b94a2f148d24ae3d522708d55e69bf13130bf46b345953ed9243568b", - "0bcfcb2a204a381ff5a8f111fc6d78136ef2fa80de939a99f79b4d889feb4933", - "e8bf1dcfd407525083a4741b542dec22144fcf919c093f83b0519e82024f9c23", - "95c2bf64ce1f9e0e916ef94bc6fa08859ed0ea8acd9a2c98e6a0e0fcf0097977", - "9f58c9080f988f0f26b3def83609d31f4a9969c964e1ea3c185db7a007155f7e", - "9bc3ab15b7cd46bdb0f9c29b8169460ddb5c35b1d94017acdc5dc85b8268cc01", - "6d26ac20fc7e6392d76a5ea72275bd525fe6cd6129a0c362ee924ccc2639523a", - "db248b7235c349e6de9d33124b1cd338f96ae7916fc4b150b794017d5680d1f2", - "da050746d36e125d9eea4efe380ad5923294705dbff89f44c7db64d934e3f45c", - "2babb72aa642f69fc2c5b01f020ccd202969bf4523fe8308d71a2085346286d6", - "69b9e6526c486f8ad0306ea6e5070c42e8ce967141d472f4ad8dbf90b88befd2", - "fd5f86be3105cc66c82ab3f8dd5bc1e8598ff2e520cef1f07a874c3b3ce83ae7", - "c9f0dfe1d8e47a92cfeb3508282fc3961f3e9ed6a19ba74055722efdc4c0454b", - "e3ad9032c5a038200ef1b8bdcb016195417889dabb8bce5a648d53d29ba99597", - "1b0e943ba38e52d8a77e4e7277c3e55629e9932af86f9c1a4f30c4484f8498a4", - "785b07f87b48dc2bffa5c1d8dbe181faeb9004506baefe0bb8f0936bd1b4777a", - "07b05eb3d8ef9a6385bf67895879a0f25506d7b678f370a33d33fc07ba9e4d09", - "2d98155bed6daa20db6f5c7b8fd5aae36dcbf4daafe174288e656bc2472433b4", - "816283ea17044dee8255cb60579ecbffb4d858b0e213b8c52406ec4cd827bf0b", - "890087d5703ab2c17b50e6916e81a37de19fc7a47d1ea7489488ff081e0ddf6e", - "58db0a3eb6edcab166efbddf9aa8697b4f673982f9b5d095bf604669a93be52b", - "7cd9bcdf88348c39b23ddcb99f360ee2a7d56d7f65d8524a3412f86a1568ee95", - "2accb5f6879b9aab3cde1fdeddabb83231cf87045988c96a2c95ff73aa69c75e", - "98fa54c1e9533a5870be19791d28bd27e3274af53235a14d42f7d5847114f4dc", - "2d0fcbbda54c449a3052cb182a6573216088831bf36fe6d24f26d419f00400c8", - "680e806ced14cd4d2c06ddd46d92713e1effbe17ded79a4a4fde58bf5d502474", - "f49c338e8a0cfe28f69d4597f8064f917de7d526fc397b53ace893188d0477a5", - "5b568513a4b0f9b62b7f21923b5abbbc80867db06ebcaa8c4586b38c89d5ce77", - "1a3a22bdd3451ead6a70221d6967c069f27c83f568273f07e7cf6f2d0a55cfec", - "a14635a6094ff2339b431faf96a76b66526e23d59ac2b9db2f15694105ab59d6", - "9d613d0cb46157af3652cbcd31ece379317f75bbc9583cc520a8c1418c41286e", - "606298b45865875928e97d06600df43da95789bba13cbf959e5219a744a83115", - "b22758ca055cfecf2b9cd1632ec8b8d51aa87704b74fdc253bc8db35a2bf18e3", - "453c3078f7bdbca93c72324035d2391a4bd669725b78feb4f0e0e83350cb09c7", - "8e59c3ee937a018a20e2813417296f90fb0f5500cd4732ae6d011f6607c9c28c", - "7e4fee04997f6f5bfa3aba077406afe82cdb2b53e5b2558a2a407ed391864093", - "d892b5c8b8971c71a91fa1378c9c387f1968c8a700920c411991d42267665ee4", - "a92a83f6590732994146d75fa596bef4a03d777433f0af4603e8d2be9a45dffe", - "355bc6a30fa9fc93d624a610c85c7f4fc20dfae1b8caca2608f34b7442e4886f", - "801348a513b2eb51b30d99b01ba24874c55174dd9119c3807aaf4e2a39b66e2a", - "c7920bbb1c7a872043c442b945dc277224897e49af4eab4f44f7c8432cbb7602", - "6cb15f4c7bf5d1782af1d76e4641958bafa50a246ea76a298f903b469964c4f9", - "36087c757a1add7f7b1703bebd7b00805913947a11416195ee7dbae3fd42d663", - "d55fbce0d70c18e3bd53137a7ba3375ea791563e41f4035ca90b35ea228ff8a4", - "1bbff06152b0f31d62a6d7a01db547fb568963dd68bd9723e3c63b4f48cab4b4", - "26fb33690860752a7366c2edf423dd3b41f4f1cae80a9799d30626ae5fca9fd3", - "3ff92bccc769b2d26a62e07623913cc1ad5ac740b50392bd457eabf28565d6f9", - "c3107759c0f7659efa4a9514934e49f7d36ac6d2f9c6be9b32e3f8b98744d679", - "f706e957c5eb38158bcec0cc2e544879ea04fd6282e0f94ca71f57c06e8fde8e", - "12a1b703ed769a75767e7700f50117afd1f40bf3907e47c028569bcc131990a1", - "2a3bf999da1b592eaccef207fe9eb224059f44a806c146cf89b93769ecfbd703", - "6952489ce266be2bfdf3509a44c06ba848dc421d3fce159bcb70ee98a35ad047", - "0fed43b78beb967951a7af176fb0f42e371be2301452bf7318986dece1a3bd68", - "e5863dcf5d9757146546da1fcfbaa92f4d261d550fa4ffe63fc16ec7d0205850", - "26a1603dd3ae72dc3cf8d204186d3acee2ed8c5a04120b08165b68a81eeb7acc", - "0b8847b9579c0f160efb5580a08598bb462ee0503d1e9412e5705f3f1315ea24", - "309bb42c49d0fe158d955c6a22909cea54f8f8cda4aee95ea4b66a2126e6aae2", - "f50ef7e346f38f16c45a4685ed4a3e8b780b2fa102d138642e44e2476ff44689", - "f900fe3d9158745003bba4e9cff5030543b7653ecd95eed0a652335a63e70bc5", - "d38eb9fd03ff738a74bb9b9093c8c006d9880db469b7f3c68e5ca0fe3763f0b7", - "33bb581eb016a28bb7c8d4cd417de28ff45211a5758079efdad1a407bee68ed7", - "cc936751eee3b290d7ef356eab15cffa5f3d81da486c6963a069979c7e5ae0a7", - "7f2d276f79ee0099ecff52264e658ee1b859fe3a29d87f8d62bf4a4b7c144897", - "f8cea0802fbcf4a9e9969c61067202b2ef3c2147eed6e4edec5c9b315009defb", - "d9c8f5fad7aaa44c15399bfc4c88073c4864ed3f47b9315f6d325fddcad86f78", - "d595059f2ae8a3cde221664ed71b7ae54a1054c60eda2ea36dc91d13722bc2ab", - "1d5a0285730da7a114bd930ef390c0e4e0977b2ef9a2942def62f9249aab28cc", - "50f617b4f1899d89a5632480648f1c2e35aba3c3af6edbea6d0514b252068b94", - "9615c67fd4a7c52b5fc333b6a73cf843095f41476d2171d7ef631473bb562ec9", - "ba4fcd2c012fb3cc92568cd2f476747b7e88005e54ccf4e7224a14c5d938c1ff", - "6e759ed096862201d091caca225cdb948902a17e4da956708575f8b08ea211b1", - "61c0779f0bf656bd325dec51f612a403b5d52fec4ba273f7d3f50a5a75f65a5f", - "bb69d721250b0150b51360370dc5c527e89e9ad84bbbc7d4ffeb6eec6e913c74", - "b74624f259ff33f8377127528072f94c130b11a7b4a12b1696ec356fd82c2339", - "1563bcfe58ce5d1182a06bb7954536c20c9e17a21e1f31077022998271f57f1a", - "00015a2ef2e8038d1523bed1a01a9c676ec64e2c9b1144c096a9ae7e59997812", - "60696fcad874807591eaa4cc4e46ffe0c271011d27e58daa140877929c0b31b1", - "12463fd92ebbbda3f3bd5645e7ee060aea41f8aae06f36154c8ff27df15a1aff", - "91e27aa895903e7131c4876cd848d4391f6fb591b312e5434099514af74bcb9c", - "25b909fb1159fe905a8544e3d66304471f377166aae7764b0188a757b5d59c1c", - "093e764664a896601b499154c0d5e4ccf5d68c8f51172a747e904d271c3446a3", - "feaf32b24652d97eaee900656a2b297aef06af8ab1b8f065f6ad5f1e4c84689b", - "fb4962ac955b7c88cc001ce4f0b737cfb23f130117730c676dbbd27a460e6ba5", - "1580e5aa06bc3b96bc8f546424490718b895f71ebb271a2f464e8f666f1dea2f", - "adc085e5b95fed236309eee328eb431f8ccc19e782ca6acfd64229e3b9802b22", - "1fd72c80de77f52e4673c6809f1378e1964c04f5839d716984c999d0ccb393e8", - "570ca1c9f3f9339c59692460353dd80c18d8b47cf682d4a36255a2de08589aef", - "3d11bb6df8185d75de2fc06d7e408466f2d8c443e99f5aa5a43af2f2960d8f1c", - "ba6bb4fff1c289bf9771bc73fbca80a261fb05765f02b0b9edc7596dfd7de719", - "7586e761b37c50389db656de1ff3b879806a537a1bf3a3f46ba63ccfdcd25a7b", - "532063ace9e7a10462426c1a54c932a86cc9ad59add5b2ef9f88861dbd0164c0", - "35cf7d78b92d3f001eb5f93a9e3814f424fbc0ce535041490f4a14b1b3ced1ff", - "2cf586378d3d75182fc2a7c386a5720f272a1aa93986b8344fa0f00673ca69a5", - "62ee19c32ba329069cfcbf1dc313255380f9aa2cd3a5792ba2da42a627a70972", - "c5f8c5f4b99346e741919c16808ed52e81cc43baf84b39c7134ef2202a9dc258", - "3dad48ae2d82939fdcfbc8d8f75e3b35de4d3037084298b1fdd796398363da8a", - "567a32b7d81d2c63f20d1a2426f5a705380ff8459fcea16ecabbfd5b4324a2af", - "25b08653c1f3ee8d21d2ec2d705fe26e9ebe746d4d4d47e01606afef5e5a3b7d", - "dd8ca9f27b9a5070ac68f24b39bee484271d3916584694cc9a39a050fbb94a78", - "b5df5ac43f189d22af135cf332716b4ef738c1a468d517499d13962ea20e18d7", - "e60e384b004117ad3250d134971e691b2f6e2c541a274e3f94b9b5754a8e6325", - "68561db83052fa7f5b991668a2061cd4648f47fa8f16c7da2a2965f733a97f29", - "35213f401b2fe0df88ae00f00696617918b90eaeb3591ed25a54f3487ef3a8b4", - "aacb6566f1ca7e97c26d7edf0371a7724a7a963aba95e7e4dfba20775ad2dcbf", - "a911206629180d6d3390b6ba69731c4175c4efc25b54576241e7b6b309f305e4", - "e11c5b5f95b1914ab971856fbd048814b89e00951b02c6102cbcc3c964ec9c1e", - "8c92b780e824f0fdb425d889b43fc280f8971c2615eef16afa82d8853c35449b", - "3d002ee8d79599a1be291d4771eb48bd73abde0d20cdaf57b15a94512cca129a", - "dea9a327966561632cee360955046881270c3d70193c6b376f3845e7a3790d7e", - "63dbfbe113833a5c52f1075cc2eaaf5b67d83af0aac0b5f89aa3f28827f114dd", - "195c5dbda2eb0a6a2f053a8264d16ad16c73891f31b9d3efb6ce3c55ddfd3857", - "63dceacb937ff2cf8662330cdeee1506231309beef892c005fc0f29543060112", - "943391ded8be804fed80422a831df83191b99873e27bc965c6ffd017b3325e1f", - "4c1fd77fbedabeab485dab2e90a02866d6bc3365e30aa4918a8cf3365f12c4cf", - "a66dd08dba639324a22bd235bd48b79f7b41f75e2308fea259b660f6d5f8a4ca", - "88086d350ad648e037b63e0074860fc16a286c6437a7dde2e3071531a6cc92ce", - "b443d35b648a97b89d0a3c316f9fe92177cdbeb4e61577199df5f1beae141b91", - "1e573e885311de717c8bb9d8f53171d890e302f98e3b0dc77641c218f5981684", - "2e1c39697833a2d5f62954bcd12d5c48c258ae65dcbaca1849a4d65133aa725d", - "41034025b764f43bb422a28bc3c2b227a1c8ab003e7721565e2f3647f1686cce", - "8cfe4efa3d1a97a785cf8cf7f01c538229c250b871e745705675175db40a719a", - "886e8a5b7b213d248e66cb198e36253b60ae3bf3bbcd482404429528f4256af5", - "8cb3ec17d788ad8194e9bf62e87020b272502ea0dec14700f98648a4c43b060b", - "49c3e712c44b256ad0f265732b42728e74deae0c6565637564f452a0c500052d", - "b5b2ea47ce91a6335eaf909b7a1ca89710a459bcc764a91844ccc14f41aebf99", - "0e3dd1116b4d57f93d52794cd4e43c081dd435ea6843ca19de451a68b9290003", - "d51be7cc20bc5c3b3a1d86a7b5c2bfa91ec21162bed920a45e55a6ecff4d24e6", - "5fe791f44112c7f4ea3e5639b1367f4ed35fc4805803da745e6e652de347cbd7", - "131cefc3bc84c9bfd9886b3265de237bdc1c33a224ac27d458ea074aa7130992", - "3eda1c3c0ad30640817b100476aed5ff1508ace8c5e848d8769007e3481b30f5", - "d0e4d290ff29925b0d29248e64059bccb0b4998194e10a3fcff3a14d1d7d4a29", - "6ee6f5c67874f3085e9a211f371b98e63131e54e8ec073b2a99a28da24ace6c0", - "d4dc6aa6d63193357d42d338467b17f41b4c5ec8cfa9cafd58b338fce44cfe1f", - "792b599a45ec2af1955d112f4dc7d1e43ab35f249cb4c66e124484d3d4cf3482", - "563a85285e4e70e218bd1c6f45e1176e831dc61c4499da944b62f82266570bfd", - "d10dd3198e5ac6024896d3f710765a82abfab71ddf70775edbd28f08f1c4dfd8", - "e3f6b434a04cb67c74ec7576209bc83a66c6af6287807bae749f68d5f3db1bcf", - "d49e63b4486c821baa0af78c3c12b8f7b1a6f5ee32c9420684ad6b5278258189", - "439d8338c73e556528aa8eb95e561f38481d1492f1e7e63623856567eff1ded8", - "22ade6c9b0aaa32c1ad7b26cdb6b98a06da26666d58f9b49460999642186aa66", - "0169422da22d08ca3957b0ed723b669631693bb9ba5a74bbb0f3e12f026ca6f9", - "89b61645bc36d38ffb6176b95985a7882eccd38b32e2270254ac96a7615f4f36", - "cd7f80f9e10c9a7965a74e1130b1c0078267764c0b03bb8bf6a919669ac92588", - "63b9715bc7580bd3740572a8050f46ba99705ac4a6a30dbb0bf99915540f5c0b", - "018131e689592453565f14ace843ebb1b00ce8f5e48b26f73e5e61299813c2b3", - "067c68bbd97ac6a0cb7eb177c3c46ad12d796d8fa66b855c9ca2216824105d02", - "de7bdf00050a0e30f0ef67c5de2590e391c80f2dfa759db6b5741a0ca4b59f8b", - "389dc5347953a349e016f7089ea7560d55f5f82e90c3380e8037ca5f0926494d", - "ec2aa554472e31650916f989109348c69f7c584315a41e4045f017ef64099c1b", - "939fd19fe3cab4bb04c75c95efee284ee9b58897a11cc7486e528d8fbb839f3c", - "41f0cf7a1ee5c2b74e98939a8d0cf3b22da1e7eef2a2029abe361d5183c4f6fd", - "6503cc3248ccb138df07c1cf456233a19bbfa55437c2c42f3c908ba21f067242", - "fc17a36a2a1bf795ce3b417382ea29cd18714d89d091f4e59ac41ad3ce2b2625", - "49d00ff9ca30653de2ccb1cad94ccb015301f336cee932b729e52172ba90b9ae", - "37c993aacd4a05fe0b622b4c6abc5f75649b36cd6d07aff41701b64679a718d6", - "bebe280b069359613d2ef578d8cbf529017fdec83a05068770b1a7f958ab1c05", - "71b6cf6455a48861664f81154134288b8a201ae78f8a08a3ed650000f41ddb22", - "eb414e97ef6bf8b44e451db94240c85260a17e904184362ddea49da7890ad446", - "89b6c0738b6f2fe11528be62a886ea12942bd53dd1104b6aa7aa8ce78de0c39d", - "d9369e390af170caa67d2be132ddb28870e2ad2e43e786300fce069eed4e31b8", - "19d9b5e01809ec930a277e1cbcaf427019b4cadecb7f4649374953a39a4fb525", - "5b24fc0fd1ad6ce13e9c39a17a7b9bc8a6f668d49e643ad092380341cab08f2b", - "f5755d334ab30a79c3cc0d03b67e7a23936ccfb57c82cc9f4981f346fc131795", - "263a43d0a2d063727ed8fc053f3b9baa1349cfae091106b2991cc9d58dcaba94", - "09035a87409083f7c68f99a8b30c5a2ef0da7ade497db88b9070bef45ac4a70e", - "4a8169176cb9b935055ac8fa983472aff0757d6969a6421f52a45cfebff1396c", - "b2cba7b31e2e0a2c8c6e47d7b3bda92593d19d1f76dcfafcedabb977c772a99e", - "9e37a0fdd890133da0c304b852b8ff37de7fb75b0caaef9746b7cf7045c1d69f", - "1c7272350308c2a7168358c677a05f32c63fa5dceb1274ef386f976da3ef8837", - "8602c6587ce733eb5729d8e4ec4fa6d3c052ce21bf08213882808a13ff43e196", - "667f275afee5e6b40fb7a44a07228a566ee859b28ff25000981155132a195642", - "5d839f8a823bf2077ae80f2789416562ea47a7048580f77f8ab77133f274b138", - "4b685afa83b060c87e27431230f6b11d18e221f1737344aac721c99abbd9a500", - "7d8720b23da57e99bf4beee0a04d28887f074b512344bfe6dec264d51a5a12fb", - "b24546f4489823925583de65279cf234a6a2f1ec7690c21608c8f4de6d553697", - "9e86a8d027f55c0d119a37593ba9a3cca7a42c08fe219b9266d2e75997adcd6d", - "54ed7d69ca12351f563344665d431f20d972ad57e7b575ce3561a7abbfe8dbfb", - "9dd28f9f96a218e77a0787f0d13f6a68448adedf1b7a4e0af6b3f9914645c366", - "a1ed9e9a0a0a7f0f66c963d5bdc89cfe53d939533c0de288ae777d7aac538f74", - "18874128f8e33bada67707f4293d8924bb4e3c9d65c92f3e56a11d613fe4e5f6", - "f8f85687c35abac65ae7434a56efa67a670af5b6880cdbb1997a4de8a1e64f56", - "868d348e7d0e5f0d6a8dce74d7206d0dc2935d6c68ec0647971924d8eb82420a", - "2619dddaddc349977f1069e7c39a2f7177adb4b0c4775bf6753050ff95087283", - "0af84932cd47004a83bf515bfb5c10f5af454b40152351511f00074dd020a8bc", - "d64e4695cfda83b0e70c5f4ea8f94ff45bae24e17fa6d8d070b5119dd63ee5db", - "96857b4e12335db83cccc04bb04cb9164db00f5a6c5f72e08c7a0a8e24286a7e", - "d67ea223c7e234b308fcc4c4d3e7655014b2ef6d969b75e37506637de59f27d7", - "d931e174b44b22d380b59f9f91c5d66ed2fe82163ded8f8796514cd6a18038d0", - "1f66204b262eeef1bbfddcba4f168fa16fc40de304fdf86f08264f5c5ef07f6b", - "90f16cc2424532253faadec75b917a8da62a31134fa1f90f0eb7186e8b4b5ea7", - "f7c91b3bc351c635443b006fe4dbf1c78835e4f4b7a127d55ea48d726722639e", - "c71e23e50db40a6cd88fe1652d2515b85c9aa910213c582746da8f237c8e3b36", - "dd2d2010b0e70b8f24d97c4c1eadb8363b86cf911dd33475e436fad16d44849e", - "68dec2cbd30b83bf42a776ab8d3c6a81b19b11675b021f68dee1178197641ba7", - "197c62ac28126dd3cbcbbe0f8082c5cf20c1862a71290d073ab7d146b9e63b86", - "85eefda75551e85c5c4353dc1bd4ea7637e714c73cbdf6a5fe67caa2ad5343df", - "b85357a670b60028c6818dc528afe118bbfd139b0083abd44127433867f73ed7", - "c835726ed6fae15008756287e9cde356fb9fe3b55d16ffaf25bb248a1c5dc37d", - "4e54a19f6a0937ab41198047277cba9247fc80accf09e106934544e416f768f8", - "9a2935e0ef522f1ab09728bda7faf581b02af2b2397fb5724574066363c5c258", - "4a4c70c6d87cca7c1cef212ff6ca793e0d66d6ec5914988c32637d2d3c7f9cc5", - "ffdd2df79d9cc9b73c344858f22060f8f05832fb96914f71d0b0c67ef1c48a70", - "35983986517da971cdf63a31721a77e5f0ec19ffb106614f721fc0be6bc32448", - "53e5630ba6463648edeaa0712fd0f8adcc49b1648046fd559a9d59f0e660a674", - "9b2c1a792c3488073f0bb44e2653973481d9c99672af16180db5b008f405ed1c", - "b6a4526d6cf872dedbd41e7a48112663c250a17d84e44d71c7093af9c3045516", - "e0b5cfde98f7f83c72aacbe39210c89e462fbc78904cd73ef23468adea2f230e", - "c1aa5ea1fb8f47f2961673f6c823e0d9542b4fe5c9a9e83a2f913fb98a86d146", - "1ffcf8642e736d8f105fde614d08bb6bac83a16d0996ca6d0b313c6aa55c645c", - "98ec07f48eed4411da7f52ff3b5412fbbfae7cac8652e7f22095e003ecfdac69", - "b2d94ec9de6a5210716b81ea74ba91b2ef72fa80ca327110364a33bacaca6173", - "e534340eb719b47d4c96e243016facf2989d76666108d9c49fd7969d4180f72b", - "93288a460584e03b266417166e2c15f19b4566a8f9640be69eca6cea47d01802", - "1ef2641183c9679c4c0e18d7978553d7a8488b28de09f59cf19ada656c7d205c", - "143afa9b31f74eac98d5a865ffc7147e8fd70be0d476424e2b6a71cbe9b141da", - "13ba41955b1b16ec4c16220eefd50f7bc925adfbf5d0eb55f8a463d0dc0941cc", - "6c1be48a6990eb764977f1fd512a58800eebcb8744e1142eeb11d5186254efde", - "7d8573c60c638378930bebc9fca9f6eebac47cff8765ba3a0e8fa0ca80a8f2f0", - "7f520059de03c2e9f5ce97341532badd0b0da73e0c1142a217345cd3ae72cd8d", - "51a1dd811271a07890da6485568f4e52d3ecfd3f6b0fa74277fe2a8a0b5a60e7", - "9e1d940fe2753720af1868bfded1d35dcb4cfc284884464d32ada5497d644a48", - "32b433597e1d6414f24ec16be928c7fa5b380f9e987f06254f6d8ece4527beb0", - "f8753ad2ac5309786a4a426bdbe38d84c3cc2a3d8709604b990876b0074bddd2", - "1c8d82de8498cc71c1277525e00e536619b83f552f38403218e484ef9f1c7a89", - "207748dca24fb5e74ccb26c7a7f27e73d8e65413a831f135bef1608b45096dfc", - "2ef6084c211d3a54a3780142f9872b19535cadf927e06476430c17c53ee10822", - "d745971ba82dd1e6da70c20581ee5c495bbd58c422868c1b395a59be22977d69", - "584a43ee07c075d585d73b9bf1c86861118edafe4d872db9ed83a8a20555487e", - "100c96247f12d5f30a07ea9cd0f47224abdd0b07d618b07df8ac8b896a254b3a", - "90c9f2b3e267a671cbfab9696dcb91df0837c6de2973494e01897ee97f0ff8ed", - "d42e6c281da2941f782b33652d93d64a3defdae39f8f20ece494c3cda2bb83b7", - "85c3c7ffde9fef01af3c988c385ebb376c10f28c9f3c599a07ab187a4370e999", - "7a6f340cf02cc86195e200fa47a8ec2f0b33c316765964451fdcef533e62e1e6", - "c05d02d2b74fbf8797b9c23734731a08ef20fd0b4482d1986c28b20e9946e944", - "fde7201826a53625007724f7fdf61f4b8a40910dc2b3032089b8f6e1f434fdc2", - "c363ab354d734034bb9eba56cd10ef38e5e618aa1e137571ea4f527a6ceee776", - "96f354cdf72fcbdeeec2331d6d304dfdda92cabe57425fa1caded7f461c7c03c", - "88b4ec49a13cd002ae70c11503e2e935a508dc6b71c9d1c9492bc68826b81986", - "3e85ab19b34c4ccb3cea867ae32625f55664f41cd51fe723cf025b0052b75a49", - "23b472cd0524215ec37fb2d5c1121000adbdf1b050e9f9493fab35771a193b54", - "1446463c7d66da2d7c4e529bb04dc829b60b8cc8e0f7460b2e92b7b16788fb97", - "4df14bf3b39db4fb6aaaf95055a886285027aa4b9a8e1d84ce8a14d25281a819", - "f5ce9a6d52a02fc2e1bdfc21a1e6fc944b79e10714ecf3f9231cdf6a96b17a06", - "1d20c0a8a9480691df62dc4638eb899ad1d0930219c5c2dd3cdbada1858a4c05", - "b52916c71fcb24c25e3b70bd2b71f6033af7eb9af5e03996a9dde0f643a7322c", - "423d1062d759211abbb4ff3236fc4b1aa9c9760fa88a30f230bb9a81587e63b8", - "dc9a6148f83b61527d1543596f101fef6064e6fe11a72b1a6ca7a60089f2618f", - "c3e10b37cf70f876beba45f7d14329ddea24c96c3e9c8e6e4a6f282057be89cf", - "33446d71b8649536cb5c0c0970295c79ab3e346ca4ffce4445e93fc14ce1e20d", - "009cb2047d0d2707b2d1a12b9085c31ab91d1736090ca60df7b420f69ec64d8f", - "479e54dd753f35a46fd3a7e524a6ed2919ede06c69d4e9cda30d3b42209e1e16", - "15c3d8087e9e2bbb17101328eaaf242733fb18789b2745a654cefa798406b362", - "1fcc2453c4810b750609c2a5870aba248169fa9f26a41a04b5622d02e19733ff", - "aaad176e48b2406e3bb77a145d9da6ea0dbcb887ac393b6d1c7b7a624733d60f", - "88bb1b187417b5a64b4071affc1e0e27f1b54eaa508a9ee287d7dd31c1a9e11d", - "f6d7a6668a2ab69f724be7abdde89d4fae259228e27fbce2c20291cf215b6d97", - "f2df2efa91616d939185b08eb73601250c0f48babf37b60fbe7ca517f6cf3574", - "daf74428f35f5cff1110175c07ae3ae578fa2320588b59f02ca7005e9a0aacfd", - "d1c93dfa02a61afe0f609a574200fc37a714bc9a3f9e214097aff84e25bf7f31", - "ba5cd84ab1864b62f076bed20da7101c328393c5a45aa6fa9afd82b98b82ecd1", - "9df27f20691d1df7fbc1f0821a482ec54833d14378cc5e65ad3fc4f8de0d4d16", - "6e17735e1a1fecdf5194577dfa5b890e8c579992ad4346bde82d8a3105cd567d", - "70013ba9c3efc2b04144a4d7f5ddccbef971451ac33d03a1122bf7d466780a05", - "ba83d5b65dcd0918692a551e340a3f996df7fc834c60c41c4b078b8ebb886e5a", - "fa8f2fd5dd53c5cdb1a7e32eb06b58d7689566795d7b3b8fe8c1a22254b11c99", - "471323779169d104447759c88bfe7be19071e8d6e43c86cd6bcf91abc4bac542", - "f326a9463fa3e52ccf2a303b95c6aeeb70490f69e6e98ebb42af20f6a42315e2", - "faf2d34873e1c422ec108c2e8f038e2cd6c93e4ff720734c71eea446ad582493", - "5ea2a9b2eb9359ac165681bf7d6abbd8ade2b1a38c339ce5a54ee9b9a9ca29d1", - "c9eb1fbbbabf1aaada8ab40484445ba9395ccae88124a30dfbf4d90301e24714", - "34639095392cdd5f9b85f26b46be178a9dff9180932cd80577d58fee540855ed", - "808bbfcbcbf876668db3acebf47aa9f29ce1c0a73a9374a5f75a1754f852e6be", - "0f3b69404483d301aca2ccc1111ae5c21138dc5098d377f6a22084d0a509e54c", - "d4a20219782397f7a4051bbf15ced5ceb4f7c0c9266cb89ebce889622fc28aa5", - "b81d98285411ebfd9c11bb9c3d6772ad3b2c397cc0b844c89a0a55be77c64554", - "4bbab068dab7f5c362c7a3db6eabe6ff05a1dcb60e5f870f54d8a18ff9da9ca5", - "ab5ec566fbef45cc6d666eed373c35654ac0d4115509879f5d3f9eb9101fc8d0", - "6e69c81ab35f6c7c5cea58d257d77410299da0c6bdb556e516b60d77442ab7c5", - "c4241bae3675dfb8c9365e0f6a002faa0869e321f94a5f7316e55beb34a7df50", - "7238c9a38aabd34b2e5542b0008423228bdf11a5198dd4bd0e58ef73bc539098", - "092af3fa91edccb3f585a58227d1d74a66d773726d0ddd420c530746244d0bde", - "7a4f3982ec90854cbba717b632ca0b984946390cba9b7c42758206b6f9817f04", - "5cb0dde5700ad3a49a3db2c96344be04eaba0d98d34a0fe5b5549c12bb98137e", - "6eb728af1dc570a83a22a3abeded887f61d23911fd535587574c91a64d3c9509", - "427009f4639646af9988d0d7be3a5a1cc8961e9bd71315ff5e818c577cbe72eb", - "bcbb7398b76e57db65767bdfa298f08e16ff1bc443ba8d4418bc7095f095139f", - "bf610497189cb2a033a175e1d326e49d3db7ba25e0841a72cb81249fcf7ab2a0", - "da8d5713ba74f982d3eaf3a4dbd37940e5be7995afb0209fcc2df12e65b08748", - "c9158fed7aae14cce472431ccb333d23e60b8af3ad00eecc70ab08eb99224381", - "748c29fffdb832660e2738332019d1fa2c131b6073e61c268aaee02751dfe0fc", - "0ef6e12a591ae49e80341fe25ac50170ce3f3bb201191975e50c5f6082777165", - "b00d9b76bff3fec4032e87198f3b35e6622e02d7ff2d09a19f0f9e6c3d306378", - "64b14d763b343804c1d153b7d4f5bebac01a44d82fcd1c28c7e5777afb2c4492", - "2b96394b987e6bf59ed982b72dc7d5b9bbabd171742fcae7518780281811bc63", - "13ae1c42fc98c419a37b8fe66be356993db6d83b40dfecb2e15284a94e2c38d9", - "42601aaa827ea3f9b02a68093095db666fe199595bde595cd2882c5cb8dc740c", - "8e8db54e9e1bc45afb46d65fb71f4a1f2694201b4704574b4e3fee576318d89d", - "770f9792e0abe2b50c2677c2ab8137569e2df866cc419dc42f0813230c490d51", - "c85b89528b3a04769ef36b6dd86d2011c3ab813a215e7e3a12f4dd155103d048", - "7cbffecdb53a01d22736ddcf8ad17c6d8adf32af7f67997c4906976d79b18f78", - "f0f38a4c09e457abc6277604db59645665deb5be0cbd885861133b3c96f57082", - "6be56046fe36729dfcf6f9d903898fcae925269884332f4846522cf7e9e06521", - "b4a195c4dc99a4ae4ef27031ad9df8d54ce941bc75ec6ce70751198022059de4", - "32789b6954695320934a16f466403c62fa64602c14e463aa21cafbeb204bf354", - "6b269de978ffced8cc7ca4f0e13289436a6998f11aa11f455b5568af6500cc2c", - "6c6de08b250d7495fea1f45aad9fdc70a4566a14735edde4724d168bd50196d3", - "4f5b175c5419209d961aa1335f538122a81b90164073980e0b0255f287b5c044", - "056612018dfb3a6119bc52aa2cdf89444bc3c1b4dd8c400728f712dac909f54c", - "5ac82fd236f09c7e463b227ff0fdde6bf517dd22abf16132d2767a2fd28ba81c", - "1c881523ee6c3f163a223e05a27fa51b584bc0d963fab7112265383c71b65788", - "403d951191998018c9a57d50fff79d7a3a6a7bb7472530ada0d51eefccc8d54a", - "ef59c98c71f4e59e9850b564dfeacd289eee02049839ddbb750473f4cb918ba1", - "4d199610effeec45b506e05b2d5b6dff0c7f8ab037951a4cf50517ff2ef1e93c", - "cdef8bc886b21e0085c841fe8e983649d7a79a7f94f1116ba23ccb20ca49a286", - "4086baaeb070151ca5517b38e5d531cbfb6354ecc68c0ebf899859065762803c", - "0177bd991af0f8a6e5c4223a86d9ecdc05581adb8e7ec90786b13e252bc364a1", - "c463b01eadc07d307de339dfbbfafc7764b170f3c46fd25215fa4d7d499915c3", - "5adab307b3156170b878f02d63819c816b4cab81baa6bfff698db971347216a6", - "2c6ec1752fda77f11f920bb4cbe32c2facce2f777e32798de681209eb5d93bb4", - "39c59ee25bd6b0e4945d343f1819f18d2800cdb34cb33d90618ed9ea33dd436e", - "cd92055c7af44da42bc2d76bc8659de4021b6070cf5b66fdbe5f676bd947cc2b", - "c1e8f7d98bd80d212ea4a0a89d5bf0c85ffcd937903e50c36eb2908a85dcad22", - "cf4f11437c6b8ad54a5e487611e7d161dfe3cf6498e9e5a69d4eb71278163c71", - "1f62ad1a92c014a52f409b9b9dca728ef8e677782ddf514b152d7ddbde6896de", - "7e94dabef59cad41bfab99010479d8dd7f9b6be6bc01a1832494302ea69d6669", - "2191cec9cce0be1e1f0232ddf8d11a54b29efdf5178b4462c33de41c70104ec2", - "e3530225f20af237caf1e323127bef49d3dec9f5782613a5dcc35a005988446e", - "1189ef1b93d47b1cfecb37082be2f1a5d4a999ff443b2868f7263155e1991148", - "50aef899b7601ac67861a050fae42facbb99abbde99d2083209019ca151a2fc5", - "fdf78b9de9094ae78d6a34f76bee40314de820890c25bc9c58f33831838196a4", - "23688d817597cecaa46343d78d730790bf17e66ab00a644d440a2b2cd7e2f039", - "68c94ec1182f2736773260dbe9fb4ffe1afe6f76877ae7d5f18f00eed3978f94", - "1f69a45a40f7797065090d5d6b7f9b088a16b64592c8232cd0533adb4ca7cdc2", - "c4764016cfd049c4f791b5c9d7d096f77b96e6bf5585e7ea18afabc6bdcebe6f", - "f2b65f7ccd089f17fba6aa61c9449382c89a8bcf68ada0c7062deb1bcc3a1492", - "cd3cda6eb05b0750705a8e38185b9d0144987f6856b945d618fcceb7782b5d14", - "51e89db5e71c2c9056460335cfaff43188d9a116144038c5703e1dfe3e4bdc9c", - "27e0d9cfef5dfd8d39d8149a99a75afe8220db7d1a640f755272c82638c4d99a", - "3ace85e951682cb6d55cbe469e563157d281717e01c1381f14cc0952910334a0", - "71e59a65bd2d7421eaec0e3913e10a977d85048ba0b0c08a96642a87cbcf8a3e", - "ee0fcc729726f603b08acbed91c3a7cc6c5c159bf6cf98e9dd1bdc6f9f8cfdd6", - "224a9e712b9e10ff657393d33cb093537539d35b8ba806c921082207adf77cea", - "1a654add7c11374b3d5e914ca61b2e0d2c65c624e7791e90cfaae7d8acb82b8d", - "bf57c34edfdbab663080e28c809d3e499cf0ba3a25f163227205675968d8da1a", - "c3b9ddef2035f976ef9545c7d03b70b0d3756683c3e81b7afb4ebd0479387966", - "82868067ffcc91dd16a87fc44de3041d036f98c673f3e1598d2813dea3c33713", - "c11a467adb752ed8ed4f2052f7ddc2308568f7508a6e4a3168bd405b40449d66", - "5a7c76fbcae7addbff04b26e643a4ca6daee162bb1a9aee0fe0237b6ec45f16c", - "a21634b80ac288859a89e3aacac117ca1881da576ca89dac2d44472d58d54664", - "0e6522c7380412cef8ff676fe52be45efe8a77a60796df74733fbf263531f087", - "274b7fb222f4e8ff91380a7f877f21c7bd5d8df377f432e50b307b1fab8a69b8", - "90e93f756741f527299f61474add3e0e35bdf6b2b0b437446dbfb647006d2ac9", - "53a7d8273c6427d05156240e5e27372adb1c2521365f28d8014f37a4dcc0bd24", - "d09defdf585156be9eb40441908d873474a67c664ac0edd273dc45f9bce0bf00", - "e040ef643e1d047223b609b9fe010a1a64d79bc1236c4545516dabf826aa6c2d", - "076b1867e143bde0ed3ec225a3b492629e9da21dbc26c7ee5ae3e4b90d27d2c6", - "cdd8ca96af815257237da6759751a3c754ba5f22f0c757ad0d0aa0bc12c03ba0", - "814ac6b6ac4e7bdcd4e8417de684583de24e7e2064dea54baea4ad416dcf787a", - "8fda67f7a748de2a71d8b40c926fc845502148f8eaaf119cfb01f438fbf2778f", - "5fabe7c96d86903079cb9c06358272cdaed52745a783526147423cffec51fab3", - "14bd242cd49e11a790572f01b9bc67eea7d34ba95336c50d8b2731a713a8c304", - "d0116e60fc2df14cf89b5e6a6a94e1c6e9191a479b27ae652e3f36197c612b9c", - "d7c55d3c600b9f38db2d3cb2113389065355f3ecf5470a52877b4aa1bf87d6b0", - "c8960107905795f3ecc058a379b70fe7c70eeb208cea5da6302b146dbf70d7f4", - "5830a69abc062d93042aa50aea6eed40a596d46e1929300b3ade6f860af646c0", - "5f7a7ad9de759e3a2b7594639453b70de910bbc418994242dd3ec59c601222bb", - "830b7782339210a18d3d124f1882b5674b7f1fe321760e10b9155498ad659b3a", - "60355ee847bd52f6d94371a3cc211fe4fe6c13033692ac41a21d4fcd82a3390e", - "0ab9fac0106b080763dfd29bf1b0e67cc85bc747c62467f8b1ed5ff8c109ffa8", - "897975c39d2ed8c93062c300a47e74affb6a7d847c4c797e770db45945c19488", - "6c5f5c2395df0394e816d5c585255b8c8e1dde6f5c920e4fe0e51ca5c662abad", - "9ecc001947b7aab335c3c685faaf4a07cb713fca2d452d4f043a9989a75a266b", - "82a8870e5bcccd46069e0057b42afe4f687c73c621a80a29f0477103e621f33c", - "bf1cab4e15687b402aecad8b3c5bf9448e9a03339ea81ccab45551d03eaccceb", - "f6deddbf2a84f066487dcf32d4962ff7e00a77270ec335c04ec7b9441244b48d", - "97d7725111b1e59e1ace146d8d8bf6c1284b1278ebd5d8dcc3c69e36a8a9fcc1", - "4e4f9acf4c7587af1980ad437e04971ae45cc2572f5ade9c68717c8dc1945c5f", - "a4be7f4d89e9836ac4524d89396e6a214546e22fd5c58715f1533bb592ed39e1", - "954ae8ee9b1c1391b0c5f29aca43870c91d0919d523464618b9b306869911cd6", - "3550271fe3c5e09ae37f8c6ab1e8a67d89df9820fe521fe4e45399d06f4a208c", - "e7699a18036cdb1d6b8b01541d07e28624e535cbdb3486daddb9bfea9930ddfe", - "32942d7551e8894a261673b00f01250e8ce817b34deb1556b110ec30d8a27d00", - "bac3fdf30b832005849ed15abec28509cb86019144f7300962a826bba350645b", - "cc1084d639156658a9e4ac3093e8db63e8697682ce7187429d6e598465404bdd", - "3e9f8ef4f56f5a721e23f9a50fa25ac21fea5f90476a84c0899f4ca0d6dfbe5a", - "0d1c723330b071fa35c57d1fafda653d6be5c2a85f7cd0fc7339dc3cae663f66", - "1550394817eee96c6f61febf6ad53dc37e7172371c9a43ffdaa999f7b8e833df", - "1ea503e4e789eef6c518e7b1194432de19d6e77a4a61509b3528242295e9e9c8", - "a73cde8afe2d6494f0ef70b23f1a18dbf84963533694a8c45623c71a563cce67", - "0e6580807b101036d2b8a8112d85d3ab87aafe102e822a5fb7e08257118e27e3", - "2248820df45a3aad9fff9e4e45073022a785a5b2a75dbc995532d180757fbe2d", - "3ee67b7436fffdb63c2baad47dd31fa7254e5c673909682395bf3b90ddddf101", - "13ee5b73b29ac4fee92e326fd3104dc34e3eacfbde498d789f15f2b8a7400ea0", - "788f47793a866935385eb00ec957e4a1512eeb3593d5dc2278e7128a88479d39", - "1c2d6c91939bf405b6f7c5b738e128a73313b2dd34c7cd298bf2b8ecd75617b3", - "c2e4600daf148b85194a405a3e01b6fb4490f643b8a7e91fc506dbc6cd1540c5", - "904cf66cd96b4bd71d293a6ef1dcff279f657fcd05686449a89a6787acb96b39", - "48f88290973ca2604849f24053f97e1a36864874f8f9d4a6270f8c247997c9ef", - "48aeca0e3ba33d8bc454ad71c7009d6d0097fc5a198606fccb0748ea8e52cc3f", - "370366a7944a01bf95c0c1c6e408e5e82dca7e26315e1a3844d6f476e8415077", - "8ca4b66bddd58abd903f7253751d77864432b60a00ce1ad09f5b41fe9578616f", - "f207d46093505c7300f3676f57652c81575ec7cc63b888e739fe26cc15771373", - "5c63ced6f346c4824a04d211856230c2101cb7ae50698da8191c531a70528677", - "b32de6b46b518d7fd5a8b3c619a813af468a0019d24eb071742da04efc8eac13", - "0d36a78d6c1e6703c3c3dbecc37b38341707c108ab2e6a6cd295fda60f254a6c", - "95eb60a65b4a82f5ecfa62dd7825db9c280b9839c33f4e4010a3f70c07ecdde0", - "4630c7d3fbcaafebc45ab1b9618e35ff4bdc61a7468a26f4afaa3a01a4f2db30", - "c7e7a40108556422857ef9c63e93735a3e202f10e221fece575aba2bfb100116", - "bd0e285d30852a41cf7761af6e2db8ec108653ca2ec6d534dd1dab0f14eaec03", - "2e54c3f29f48ccd4de4991708fdf020c6980f1998b79f4b073bbbf1930192b0b", - "a684ee9ffdba47083d02c03cf29dd8314633b34e87327ee6e46ba4a6f71f5020", - "d639ea0c23c099de89c6fc3a487708e42478e84d0f283bb626f49cd8c9fed33e", - "1dee7cdb153740474f9b68b0370d4c1a8d137627618e198d586570ea94267e1a", - "52aafb28da9ffdfa94f1cea923d1c89a0ecf718be7d6273269b32b5f5e715a41", - "df830037f5518189403d886fc28dc963fbf6e3b0d367ec2471dbeb3f0b9d810b", - "11520c537170ffcf975ea3834b97ac6acf3c88ad11bfe0eb45ac7c032bf9ff8b", - "fc5898909cd0948d615cd8788ee3327821855149d8ae66911ced59ca6435369a", - "cfc2ebcbdfddea775a7679137237dfa36c4dec03c06011d3043d706f6de60796", - "35de15d67a4030cafdc41f9ea1be950fa659a1363e504fffd32a3ad1a330e24b", - "23249d628942e2199a6416c79d07c97032dac31a5a85cf7caac31d0a4412622f", - "a81eafcd7db330de03ffeb6fdcf658029fe36265308601703239be505caa809a", - "ea292765de64f732fd39db72e921d23bf4b0df5e9a7cfdbd68f30d1c9c7a09e7", - "4e64020f22931ce02254bb7dff1205ec178e00906d188ee656b2abb0bc0e72d1", - "3a6d0f403a35aec01981b920f64f29250d480f01b6239e1062d18002a9645cbd", - "1e207afa712634fde23a71df04818224096b6f4265678c32a652cc4ddb0778f4", - "c24689378ba827be9067504e392738b4bd8a5af701edf895c7a51040bc9b09c3", - "3e135ee7dc204b5fd772cfcf7ecb90e3a1b338f84eff19e9d3aafbc4ba22671e", - "7baec33e59e961e21362eaeb8d2d50d01ffc928cc825cb0eb6196818d424540a", - "2ac033babccf80a50b9f5300805d820e9b3a5e186bb90391f7973edfbe222573", - "2aa6a1535843c82eccd76e39999f6abed64f04d72e739e9c0151a6143c9b23d9", - "3521bae710593f112ec50e51490df547b61ee1cb74e29145c2b1aa32db03e8e8", - "8c63a92c1fd4da2cfa960d8e699c9e2029976ce188e9f7f941b63c8707a76381", - "77ebf16c8a0dbd47d5140b3cca7fe167836c04f51f5da41ea69f82748cba80f7", - "4846b67aa764a2f68dede318590bf56b9b92103f6450ca0cb550ae3a12039e7c", - "8d0e4c2ca331929ee50b93c744abd66ad7e930a7dd8c14fb6c03eceec65c3132", - "04f5681625ffdfade32600f2c22cb6b56f1e2db6fdee00b6def0b49661ba54e2", - "07a440f2215aa684229f70abd9f5a3f5b688e22f58f8e180a6952eea9b11dead", - "5e9763bb7642dadf3096a2fe9b9a16fbfefebc10ceebcd9c711eaf84426013d5", - "6769f3e49072a08a7f537fe0a1464f2f5f722106ccea551bea956ea07575c55e", - "7d699eae736a6d1248d9d3439e3252b0c55f04d44ff549ce2477ec36a1b90cc7", - "3a6d92e84bba766ff5848f72951d0d4ce39b37d2a79959425f9da6feb0df2e12", - "09676ca62a3e1d36376b5209cae14ace8fdb9a02bed7097406a14c160f307a1e", - "f93c0e09816f51e4935cd7eba02972e2dea12d576834f2b13f26157fae5852e7", - "1478d35bdedcc758752be7f796481f5700a9c405fc0ab289c2360ecaf44fbbfa", - "dabc397eb8c64126c1eb4b402ebae300702b254183057d7152332eebe074ceee", - "49cdbd6d92062d9d15544da2589bd3a1003f9871d131c1ddcffd0e1c9e504497", - "ab9b9332781bc553a7066ac85ff5a7394b8ddda2108bc163dc3e613088830c11", - "c13073129db1b54cca0198d19bed62cf3ca0ff608867263635b6ad6f008bbedc", - "a0d97b4e6cf0a4be2ab3167a3c32670beebfde87facb57faa04596dbf7f6d235", - "eb654850b436fdfb235ba9aa895d634c94a7b3a758d0721c739f3afb05bd1276", - "614ac3e0306c78d2a5806cf790632f0fd2c168ef5241b335977757a63981da0d", - "582d772a5e87a2b91278ee23ab60d3c20ba31b631a50351ac8eae1bcf86ff715", - "949bc1f957fc29f2830903e5d23cfad38c8d7087a67381d99b8def03ba4d102f", - "b40882e8da80fb08789372d3b039f9e4a6dcda2be6b49d6ca5b944c33f88bb0d", - "3619683f7534c5bdb4399f22a4d154df28679c2fed24da21ebbeb7219f5a0e5a", - "ff9fad402fc4d5934ac25f52b290ee9fdcd2aef11e16595c3267ef72b1315c3f", - "57b71d265914fc46e754c75bd7395e3b7585ee775053356264af96d9e49cacde", - "a04718aae0e01919e96e67afabc4233c5a89f8de0d0408356816c05c626df454", - "c2c492d559b6601802a644e616a99d13d958da4258a7f5c6627439f9340f9fff", - "0bccbeba0164d2c864c540c16018567c20fab0cb3ec00f282b38a355067e57c2", - "61da489c40eafc1957378522e2344ede6fda5ab8e656f011442128d9b17989dc", - "c0e30052052e71196efb35f37522f1591532f8ce3c96b25bbbd2d93cb119eaf5", - "4f4cf5de2e55e68a03054b7ba4888ec5b9b8188627175901dae42af19fe054c1", - "33f496c368f24426eb3b22711569f79744bb97d2eadc98097ef964261ebff004", - "fcb3c7243f2837a7b209561b02217bd2f59421acaf55e048e41457907c88904a", - "693bde1ddbe5841a7cec96c470746ec0c872a9d53b08568b3d0d8b6e1d6b4fe4", - "71b7c1489f29df2c835ffc06b736370f07a6be243e51323252043bc63481d780", - "760c47e8def8f8f88bc4ad6e76f21790aa92b3050ef7b1520f0a27993d151071", - "4a86bbf226ef78ed236b8fd6d71d396a35f2d6707003b8652d4188cdf4e6911d", - "9fe6c93850cfd8b5683f9311551e801210a869902f90731515642ad0adc9c0f9", - "390709fa4a5c04ce587f12962f7046204137179b8b6f14bb5d84d47b1deee467", - "085dffa328aaa0bebbc0f6b5db13a13ba934194846c723e0c9e193207f87c793", - "fd3c0f0621357166162a99d989cb858ef2a1094a176312f3c97a2c1b505e39f6", - "e44366a3efb469c486645b202092d5d7c128f0f561c2a60b19e8544d68a8c063", - "733577a5df6c389968b607ea19e5aed4fd7f4d50264f423816cf2bef3eee57df", - "2646b723ee8fc824a5d9bb260101e6dd2e470ce025f45a787875c11e42d69559", - "416ae951f258a168a3b6a80d1a75eb63777045c1c305db431bbdee14e6c532ed", - "6229760d912ca0dd0babdfedf85aed6675090578e82fe14e4a6e60863f8047eb", - "c46e5137c28f8cd68529ffc554e9b1f9fcd689f950ccf38e8aa57a67d6db725c", - "f710cda7762613de3269b474f156ca5c51f983f8c48252ea39c9199e8f01e7ab", - "9431379980bc3f1696cd785713cd684b33597c81eb647d452bedce5a2aa236d6", - "fc53cf8219ebd5061e06624e9fc001f80a1562ee7e3aba5b01a6ef2938827ad4", - "efd15dc0b9dfa350e2299823c86187e950be6d48dfe66a0c17acbc14f107d271", - "04f9bf93dcb176e8953f8a7ee45068ac7113ea1838ee9bdb5b14bd2148aeacab", - "3b4c0eb467d48fa46c1b35511b6fd02f3c39797ca8394ff8bcb790f17b5ef52c", - "535ee5c544e9c8433a8d1bd626af48dcc3e9c34e7653b02cc7978a6815ac07fc", - "d662d3e68a1970d4c1359fec7326b34fd9d729b0527fba7d0efc17516ea065e8", - "eed1d515194760eb4d9e1767485930f77a136c15190b6c48d005a53e8180afbd", - "fc3722850b028f7ae4c01147de2c027f297d3aea5bb3c5f6a8aad5ba67494fc4", - "6ade1e8e01bb92f07e52cbd91bc7ba5ccf8facc73b9c6b91ca84808085b30a37", - "1264edf495d6ba0dddb3300bcee45f06d37c8b7699dc8087816eb13f6a5eee9a", - "6b1abde8709cbf021d41e34b7bca0b99f5e49c9f38af0f27de3bd2c556411f69", - "7e717066eb2410d38f5d510c88a72298b8363c8e63b0cd753eb39a4572bc460f", - "ab02448e225187b65c3374401915551a00c77ac9859a1631b356cf4ba08b5b45", - "b2a63d9747f3d8f9e1f0c7735ee71d545d39d3a43220270c10195e50469be2c6", - "0a6b208293712071974a013a786c4563453e7279558640aa8a667485bfe17b83", - "556c0d89687d0d1f45a80ad7f66eb4dfd518e48a40d45314c7d89b6d2f91d1be", - "90e4a09f45233209db9bffe3e7e7ab6e0e7bb5856b73f73ccc47323dd6a8ed33", - "99c3933ab212c3cc7afb5542a8e06db78edbb54d6b42a2bfc491dcc938f6f374", - "50301a4af54cac065edc0e6a939ec5c98026324c1aef3406fa6481050b3ea238", - "a7e954480b168f3509d67cc6c6bd68feb46000276e5260e59f5e85d95b9f263d", - "2f625bf94ec46fef63adf646a04da9f2c8838b25a0dbb9760a1291feaa3de196", - "672b044c56cddf72c697510ca9e74d63728234bf8d688c4fd645bf5d947198f0", - "1f93d74f1903dd23271e906bcb0f3fe278d001ab33c76d7f072be6f4d7baec07", - "1306e2e08aae0d6f96e8a60583198075cbc33b87cd9213cc06a3e84d349ed73f", - "4c2a1d3305b3d95396f6b7b961b2fef782aaa756574b8ac7a79e8863f39fbc6d", - "577beee43452236cff95f1eedf3bb7703384b2041d3ef5e1e412d2d0b0e55b47", - "45307b5f61a30dad486a5b9e2f56d232f9f4692640550f7b92b9df0d3cc16377", - "5a44638effb6e62f32eed6e6e321bb4e1aa4618ce9f83617fa7bbb5ab156a709", - "13b95cfa65ca897e4af8b5e36840d5db8df9ead687e2f1a0fbd2c059b12e9aae", - "ae792e63613820b3a66bbf2c82afd3054b086e03d0460b5df59a623692fb510c", - "a2a6d70b7652ebc28e74f8e2f0cc5698f38299f1bdd0f56d3bba5e37f14bfda8", - "53d226bc47ad8b9e123b1f62feb6de4a288e0d91c28e2137a03ac932be92ca25", - "23160e7010680f1627ed49678f752b0525186ef4a6aa9b7e5743623a72135b1d", - "cf976ec254244ec789bf1d77f2ad86c473088d85c272ce5f20dbd4a881b0f920", - "52718b44759e8da172488dafa2a694edeaad58f4bfba99f3563ae3b1a8dcc01f", - "419f2148ed33b331dca0d8b73e032b4b1fdc9e12597da92eb214d8b5785d260b", - "950f1016eade9d8843873b7eb976657b15e5b48a683187f5ea979f5c1dd6c9f3", - "16329a3261d88d6622dbb62280b3d4b88b492f29d8f8d256cb4b663c6e2b45f9", - "8536e0dad67f5f0b9022e014515b7f89431342d1fb4f74ba02e315d1a473fbb1", - "6e314aa017cc2b14078c6716ae3372d163ee5e03f1f8cf2cd181543c81fc2f16", - "f11da45a65b81d8c47046ab8c1adfa369899a0851660e0a45f240a9228fd51d6", - "2e2ed82048a32c0a296e25ac3030c6027a64c91521b3f52d82a4603a0335b633", - "c010809e44b723f239c45a1677c753df80b8d8336d3863da5110d63766ad8d8e", - "a2472b556ed88a1cbbf6beb9ef13bbba1cb571f7b6d459f89578fcd1e5d997f5", - "4353326e6bf69c3837015e276659dcd077e3685d55c560c052ac364f8004c6e7", - "4d76557931e7e78772ead00d8fd909ddaa112e0b398dcd6795c350a023066a88", - "11af3c3ba69f85ac8a6f6866d6fec5ae900195962090e12e656a5da2e31184e4", - "e635eb1bd6dd7c4f21b317bdb2bdd66ec3bd3dc0cfb29d92b60a1b9b859d233f", - "36e00310ee9703a180d01176b48883ed5081ae21e364549d6ae476518176e218", - "13a2eb7c2dc27016968d12187ecba86fb17f38c57d8aaae51c634c1a42990c8b", - "195b0824a8f32fc06e0f613d5b45040aa08cd209492a0723cd431954ce77932f", - "1050c1d3829a7f2551d36dabe0271f52db9f566a13c6780592ab0cfc18c9fdb6", - "99a9e432e360c8bbabf37dd5d4ba637b041713313c2e77da4d6e62050afe19b3", - "5228a5fc24e18b82ce1320431bec1c9146f01718b65b8cf8dda5e9e48f7b4032", - "90cdfc6fa2d052f88acc9ff3a59798a838f41397c86ee3cf3dc06d8086f64c7a", - "e284e75022d32617d493b6a920b1afb19914809aa4cc792577951f19083eb950", - "87088951a3c150f146b0aa39b7f89fd98f4665cdeea51d325c29c81547637e45", - "d852e56ce681e59220db1cd809eeca8c754adfeac9853d1189d573b79d6baccd", - "96ac1a021bdd2a197334b4a8f3ff151e515faf0ab5dade64cdba6da9998b648b", - "9d8b333335d690c78523171b615215f5b09bec9e1ef9af80d77ab87e205fe2d0", - "00c6458c810d894d785a99f15bbdf567792af57ab2ef39a276ae81a9c7caa300", - "1d7176c9b14e1d600fa32785570eda659c74b5e9c2faf8d21da5d1221a8db779", - "154f6f999dc879eb46e6211f111ccf93e46a90e96201fdbeeb66ee4902399f2e", - "7b947d1bed7658d827b902a13b777f49c8f250d0f818c3c0fa3b13c2c3f2aa8d", - "e4d961df3be5c7c71d29ca0a9b940d511f8469858f6874bb214032767732010f", - "80a3f6e5ca51873748a3338ec0352dcb4e97bafa778d08f78a0d71d020e1c56d", - "d5b7cc818c3e154651fd9a55256b0e85c606e84fed9b437b1afa15be41667506", - "e1dd9fb20ca7051f4f89ad0993a29d032105993ff0257b7e13726e6b691350d3", - "fc6dc053cc1058f2041a73680fb4e814dbc8be3e44e78cb00af129db4b50b600", - "9c737dcab6020de28893721b3f385cfb6feca3ae31dd5d1a95310bdff8640679", - "b6a74b196d77ac89e9661c8f83df950a4690a357b6651b3483ac314f08e1be4b", - "9ba6241c1ab334cbd7a1970ee21eaf147fd6c01e5ca5db0bd76b110e1f251952", - "e53624ecdb6a942c7e1566d7a088f59cb267d26f2700957b64057c30209c8fa8", - "256e625b9b09a5c8ef9c9ba8e15eab24efd0f6094a8ec75c74b99298dbb61e3d", - "3c662a4e147680070eaa1cc52c812abb8701e3484ffcbf9a1b73ad3ec35ce824", - "97393534075a2005b34d0a96980472b179272adcda4081a1f5f3092dd07b3860", - "c09bed3cc801fe0ee52825b5fae7458a9a729c872b0202d903574caf95998fd8", - "66ec3882efaf97faca979d3650640d34927d97a35d0f47270713b0f51aeb9201", - "22025b6d36e35658e575e98215b92f0e707a68383c3a876f16f24024255f2026", - "b0e30ecb20416815c4144fcbbee649488d792446334e13af699eb4ec6a64de4b", - "f37d65316e414038eef8f4f85b17aa76624bc9a9d98fe84defe3bd655969c41f", - "a6bac62b9e55ff865bac7bb1c41a1eb5f4cc008b449599f881a6f738eddefabe", - "98266cc46956e5822b856575aca859ad76dd81d50c136b345ae1e4cfa24aca28", - "5281285a034013922fb2c2e0eefdea002bddaba418281d03ff0d16c54f599f49", - "a8ec724803d0788d6306fe1d282575fef4e2f29eca958c6b8981d642dd109a82", - "8de653f17d37eb92a6d99a61975d9c6866e5c6f4b76625dce3f65b1a357c0ab0", - "b7141d8b7302f05fe18d92ba6bdeddb1a9f28c360ece01bad6358be35852b527", - "129ec2a9e121ca4ee76333571eb01468e297fdfba1326459f00f330b5f8950ed", - "9147ca2cbe81c433d939d1bde0da6f069abb72efa165c699d5fbc0d800dc6c15", - "0f4f428325a6199ba84755c9ee124de5aa0095975d04f21f4080613c049fae7a", - "8499517edb6278e332034a59364a9c08d84b71a6c007b851ec87c8aaabed4a2f", - "b3439b2d86cfe0759166b7b896868d68367e1ae45d6cc58d353b4890c0cbcb2c", - "6f0b306768bc7ebabe220bc1f59d668cbbdedbeb3429da67f85b16847359e75e", - "ec56267284aa1c1139c8dfd86d333e1ea92e46f2b753bd039e2883d4d222a153", - "8dacbaed1de2eb86a6ebd736356de96d8a7fad3041ed80f1bace608d95d40810", - "9fd4448faef95834b5217991b4078e477ff1c7d63b787fba6096f4a277a854e6", - "d95b1bf5885b802c706797542d4a5adf832766849a33d8a5c228e3f5d6207743", - "511041dbef51147049b22d8763626e6fd60269a9b6d004f5b9d637117e617c91", - "9a4feec0fb231daea2f05994a7f2957560d7f31905114a6d30ad969c843bcb96", - "4d8fede6cff7bf624179af7f63d3056da27d34e05523127863852950a67a4fcd", - "1495e75b2a14e37cc13d9d9f8ebed7e9cf8a05b02ec1e3198c78640fb3f11883", - "c15fc94e0022989242a080231fff520b771c2b367763b5cd2bd0a28a36bba788", - "a3b1575f60287a8b60ed7389e03ccf1c8646cbb967b665b71d539be1e6c74538", - "b04cc2446363c760917f691b17b50d8bf8d47c764325c75542a1f92d61e52032", - "f4360de3721476f98d2e1814a757374ecf0eee42dc979141d4b5c47820f6f83f", - "412563671c73bcb4116be9be05416b3aecf3bb8f0a868bd298eca8ace1af352d", - "84acd419978a7c658dc0cc755e625f0e98e35800effe3fa462521ae5914fe020", - "327cd015c1b02380267b300ef229eadfba1ec8d0d4db0e6b14e9f68c76fc2f6e", - "f7bf1549d9081e5da2a37695634cb0f7fe7588799120de87c29c5c26f89ee306", - "e822ba02eb82fe65498b8df29101d284f3af999b58ea9ed2d110f46c28ceb7ff", - "7294fd967575393ec55843464ca1ad109211974ca93f203558c4b51b5ebf85a9", - "823085230fe15a5e15a8f758adaa09e33e21e31121693757543d080602b3e0c2", - "46e0a2657366af66584844a92be7eea2be021a1eb9f59a6ad7d1fc64d6c1d236", - "4ba374312fd18699bdcf52922eef6fdbcfbbfb8e6ab4478c024e58772c50ab3f", - "b6a2acdf1dbd6094e2ef5201a2f5f60747b8150626f60add91efce03cfc0e413", - "cff1de75db57f53ca5b1601e2d577c2bd24ed327df35fd28b3b8f21d6e1a0357", - "e1c7a481d3504f7e68c9c2ed8ae5335f4baa9bb0a5bca9480de05e35d23d0ed7", - "fef60ac5bcd2a5d6726025bf4cbca283fcbe4605fc51f00b319288b495f903dd", - "a74a63538cdeeab708bd52e8943c54b121464e6a9316832ac5fe22b35112da2a", - "281438e7553076bffd04daa6ddf513d8fe2ce531071fab1779a8c4b2ef103ffb", - "43718d01ef55210b895e34b242616e1c034148e9324e4a2bc92f570179cb81e3", - "893605c1887d49bfc8f1ba4abf77bb116dfcf802f045eaead58c8d8d40f9f3a0", - "ab23fca2829c2ad399a028770bb12b98e67715f5158e9a24db3dc40d1988be55", - "995d9f097763305f8f02ff6a7127b3349d9edd84d840f19fd88b4db166ba8bc5", - "dc238d7635424814e0cfd1d38dd8d5c0d9b8b89ff83f23e245569b15a881edb2", - "b6565486f8412e2e9af9b68fbd8a1a0f429360d9e84d35d6e8bde37e6250a26d", - "deb698d8aba1abc731a977a2fc1f25cd26c8f4059b16e59ba732028b58a16e39", - "c4b0e190b386aadf153c36f740ce0a03ebd254bc7344ebf1ec44ccef010109c5", - "c215e5f9c9a66165a32eed2c7285e5f46e2331ca5ad2746cd0d79132aa5a300d", - "50bcba009e3675171f2f02d1dd40b89975f594234fbd8f91fb535e786865bc21", - "d8a4a8637613372eb84f76b1bcf18ae9cc1dc1b5b501682d634ef871b8189bce", - "f8946b39eb356e7cd22c0e1f069d3869d19a8e8913896775a859c5f1b35e0c58", - "2021525e1ac1998e4a74a9daddb3aefdeeb011ba36930d36b944f234a0aa52e5", - "2859f52003e00222caec9056d06c1cfb6f21153842bb1a823679ac27bdb502ac", - "69549104ab77f53f3e4a5af4b581f40ff7843b42cbd7777ec359d595f6d96215", - "f60a573dd3b1161ab8fbe947f9b6e822c5bf783a295f917484afe9ba29f45e9b", - "b6afe52f06501479385c9c16ec541c5be35b1da4901c3fd09869b496e9bf85ec", - "ca97d412f57c5a9ed26572127e6f8619acd2e3ba1b783ccac4f822da4f686d0f", - "347c356fc33e0f190608734d4ce37793fd51d6ee3799a3a884f94bfe9af2738b", - "4d45fae3b9036f7d860fcfc702777b9c9190905799f43580c6f492736b859070", - "466a9f2174460f26728ce6a2a640582e4eecb66ae1a738962fd4b1885c85ff13", - "70698f75ae1ebdf8f3cb6c3ae09b93b07797067dc2b7112eead40454751adda2", - "66b4776284b9c6cab61b5d343933614c92ea0a31f27d2f565efd6166ca788201", - "7e498836a3a61d0c0e05f0e523c4835b3cf8b96e95b7220883a61463afe29f36", - "20917e5f4488502d7a2d3101f7e289b8dbede0c8f961c5e28403b6fa7a85c5a5", - "59994c6dfadbbead2deb02a587707b9ce2a994e2d26cc584416d7e82d43f3ceb", - "a7f4f56f41b1475eb41d3312199717480ba57bdd55c898cef60ec14bad6622c7", - "e0cdb0b907175171b0912f96691fd7ab592379f0adfa27da481c4fabd15f825d", - "d5764bb2e94280d3f75c56c8513be2982f1580fb6c2f3b956a608507802702ce", - "c2712f8dbedd2cd791377be4fc190ccfa3d2f0d4d7f74a12e3da3e5d41c036fa", - "8aa231a1b41801367b169d7d61ae1d14245eb323797806eb6a8a1886d286209f", - "ce8107cc7adb2f22a5cde2574fd9747d3d86d8f87fbd3dbfe6306ac79894bc87", - "d79538731c70947d49bfe4a4b53280c8266752b67f3fb9614aa4ac6242f05ae5", - "a3f09999d4b97cb8c6dfecb3d7f3c7249d1a2e93bd71853d0c80cf149155603e", - "1f9c34a83ab97d2c6677a0e81ed0fb9fcc64c2146f8303fe58cb01e0861df828", - "6b17ebee24c5378281cb53aa455fafa5c9042eab13369a35122171227f291c6c", - "cbd5ac7619a56e5d94bf77c773ebc4927286f7c64058720bee09c22c8cfc9ac5", - "c2cf8700e7e9e3ebb4ce877223e3ce0fa6c759297ee2b8c7de39aec54b324304", - "1fbb9eccadc574a13594a9cc0b26f52079566ddc8ac5e37eb765accc3fc0d98d", - "845a5348c4ec8154afe661ee8f672ee245407f69df7d7b0a199f369978edca27", - "a534a6810f961f19215dfb3ca72d51c8c702b893776be20058ee0b04d12e4519", - "f6d038f1ce614c9451855ea57e638ddbfe05ef28c73f490053a55327482cbe9b", - "12e25ed9af9705770d411df3e4aaf13800773d4867aa65897f3c930d28e9be2c", - "0751dbc65212bb1066d080e5918213dc493a79153b714890ef7b50ff9b9511d5", - "c13b3bd748f6b2bd02f974eb2dc3f9357a5fae962a5544327cdaff33b0c2abe3", - "8da31749605c32adaf9aad17dec7a8a6aed78572794dbda3787dcdba4300c445", - "72dd14f9dec591ba43245dcb9b0fce8ffafd66787a31a7e99888dc0fd18bcc42", - "26c1171da2792c33d3afd8bd98be49b31cc8c0446762d722ddb5c71897ed1e5a", - "ccd8737d5b5fbf28694561dcbcc97495a230f610f3488030840c0d349ef88c02", - "2d73763cfb3c7b9c13f7253cc23abe5cf3be6e3db61a5be368aa1d9d47102031", - "b346a58e37d697088c3916327d651a686f3deb6e83d642454e6ccc87ec8a21ee", - "e920f1c02348dbbe746eee4ae392825de4130cd477812202e4d228dc834fb197", - "2e11f8e7276653d0e33e79500d77e6d829e8c71842b045f1a3b1cfdbe275b92b", - "933af19d7a41331fc0676bca3b820f28f5ec0506deb328fdde61a823ce913f9c", - "5b827afddb50427e09f896694d0cf040f6fcda40cdaa7d81d84a4105fe3facb6", - "c74a1d34a4a9b01ca6b13625dbfa88d092dc8d85601061a4f7fdc5c038fdb50d", - "a2796be65306cad68c635783a905a648941174eb230ffe59884ad49596876feb", - "6fd4e57f004e158b8daec9da2236a1e1f6894a98207128bd35a749b41076c558", - "8a38c2e1148f1e4536a91482802f56084043500587a6013d3875f9ad4cb4e257", - "efb9769aa7b02f8ee11ebcddffd008dd6841c80c7d49bdf59cbc6c9000ca4b9d", - "3badf34c440f808e059c987fe433b0d721c4990d33bedbefbc8ce2f562ee70e8", - "9d5cafa8c9ce575e722dc6ba076ad59b12a632bd4b62858f2755c106a79578bb", - "336b70bdaa0cddf0930c601309b9acc5163e8bae5782fa652dae1611368efcb9", - "e02fd4d9d0b3052ba72cdae4ee913e4951c03e4cacbe92e91ae1f09949dd9480", - "21817adc338df252c9cd75ef884678c434188b0c3d558f1185cec0bb98dc0d40", - "f43974502b3b086b4d007a9936fb3e137e3fb68a65021fdad2ccbdf84fee3bbd", - "88b62768e2827198c9f46646dccea7cab68eb036de7bfcd91bd9b1903446e799", - "c2417ad124b326451f23bd7008bdc0f51fec71a76978f7417060ca56354f07d2", - "83b88f0dc8dc6c203ba14ce44854daf0feee5ebe1611ccde6af5023f9d14e08c", - "3f63683d2fd874e7bf40ee4630bcddb3cb1dc5e0117fffa6854d23aa96641d8c", - "03df6bdd08551238073a612e28525f7205f2b666b47b5e7001e3780b49b898e7", - "e960ece0ba4040581f805fd672b688b8ae8c523eeb9118abd02c1e7a65843f38", - "3d60f55213ba6879a94c31a948d95a30b87329886214235e389f5f2ac858c8a1", - "d67a1196c5a44f9462b3cbf624dcf2a3588b2d11da5e8e370b23404aba77eef7", - "3bfe65c1df826876bdd868422e1b3359e1e008e4a4f5fb1bea0d443a4f37e7da", - "4f1da75b5c80097c2dd1cab74ec9723c232f93ebb5e7d0c7df2e8d4a044f5b2b", - "46a92675ad9b5e684c3e05eff14fa7921e4771e1d31064594bbd0a07189e2dcf", - "88a5808c8bf214433fae0adf843cf3449e2cb4336aee36adc7ee029dc70b5ed8", - "e6aac394841b16e70bcac58d4a2c214b7175725e1f0e1cee0a51c930cba225e6", - "a8b45daca58483eaa677b848a3b2e89db73be60757dcea71cb9af1744264e1af", - "99c0a7bf076c94a605df622d74c12c3ac23f067ae09ab3740da106bb3e344ba2", - "4ec3d2c35179172ee79c6501df738435e0553d18bf767b4634bcc59dc926909e", - "8bfab222a542d86778f6ec6b289944169a67b207f29e7353f97cee1e4896463d", - "47591a4e5d76cff5f99a1620edf76d02e59ee5897e541c66d002e29aae3759a8", - "729704c73fa922ca7a3aebf1caa14f82701dabac7ad68cc3a21c33f828cf8d20", - "871cd1a7ef56f42afb6522e481f2452431300f857ec6d15800bcdf71fbc66d08", - "d78ee3bf18ea564cb9996280cccc7d19f063965710754a4095d289d4718e4ac4", - "2185368402c7014d7f71582cbac677d086ce3777a53dcbc849442a26c11c125a", - "d29c08d1bb715f38653947438b7c860e493a0d86f3b2be97be83238243451d63", - "8e239a4bedffb4bdba805147bcd6d56c4aef9c09d737284c20b7aca9e2f7b4e4", - "35d01863f88140826fb968b2db93731e7a91a858ab22f08ab9ea0024d28a45ba", - "54e67d877ca517f4086a7c0368d4c21d2ec467b03ef4f6abc2ed0e1f1c90d971", - "bcc05b04ff41b47c0a28114038eb5555a41d99d35e682b425dc835c4d5dadf31", - "82eb83a6baab3f7a7bc70a3dedb74614c626a35263d3dc0e17c086bb8b563563", - "efcc439aa8593c2e8a5287ea1bf6089239a3a917abbf175998962cf382370bcb", - "3667820b31d61a47abb543d49a15b7cc9e039eb31b29fc2d783434b93762a3c6", - "84cffedb775645ba19150c33c27c3c4d08de7cd2d99092ff3aa68d3237bfe65e", - "43176870a378bede22c5aa19390448fbba7ab458115371ea92bff009dc6f3ed0", - "06f234e41fafa1e9a36d4a3e02cde98a57fd2de79d9f4c629636ea8f104a6f29", - "382c5072579f6e016e84dcb1bf85bac0b789d2877af7ba4644773445d7468f7b", - "959e6838778048bc5936acbe404957eaa4e09f8bde43751aee714584d60946e4", - "d54a356e58b5ee92798868617a3ab9b34cd63b7b7e206407dcb66ce0225272b4", - "acc599bf5b511a23f1a72827327c3f36b6eed4b8e81ec5c0ffc92c92df6f1777", - "b4794f6993f655e51e0a87d40ad5174a2ff314458c50d11e36057e6e6cbfb46f", - "0a37e44cd27e405f632c3ee2587a034e3b719a2a9b20917fc77a275e86bbd0b8", - "679117dce2427e4b404d11380074ee1c2b2e8ad2ac1e4181772437cc9ac02b5b", - "b7d20d48a383c349658033f6424da3820cdbc15359492ef690970622b81e4d28", - "007a54ac0c4169a04a7b47714ab62f44a1bb0e6948ef869dafd77fe02bab03b1", - "53661df768bfb02de2ed0dea0101e10913b9cebb3ca750e45309fabb01138fe2", - "52ad83ab57ecaf26e1a8de84eaf376dbadf96b9dc6165c8c2630d8949b00665b", - "262ea910c85ca22d6a57319ef02355b0b7e496e878897ae08518205aa991eee9", - "122cd28169a93a32fe9194b0989134a9abb002e5b859e14da1a4ff01ba544165", - "51c467bc1be485b707084f2c313e14ef33e6515acb596f5218f1da853b254e4a", - "3c8a0a740b318bf2749dfebcadffcaefb8ae9fb822b83095c1866fcb848128e8", - "67d75f3068fbfdcdec7e0a009ecf428ca3947d2dbc1d736629c7fccec158c25c", - "33b6e7498f4aa1369be8071a99296ce4d8720264d0bbbf9337a6b30c1c5ecd99", - "8125dffc9e05d48d4068069b5af9bdfc65ea9b47acaec2a37e1abcf0e5cc3a76", - "743930723e66a214aa3370d7176d87722249eab42f1d26d7791850493b8f0e58", - "9771da1ecdb16ca48c3e07b87ce70a0d760213d70b90527f089cb75bf67a873f", - "afaf61811418311b3bed3224f659d0aa48ea984059b01862c780364e3f37a971", - "cc4e8da3caac35c529027203987dec3adee2f63e8f0f2c0ae6abbd75f2414cd2", - "f11a801cac13bd2f2aee5a3be719947aac1d26cf6f6bba0016a56eaa84c0f1a5", - "928bede8d9a3444de582041d122180ca65e238a76b775b4e56f2af7cf35c9009", - "79f0b4b3734a30b99af098e3ce8734e15e718b5db6efd73294a547b2a2262d74", - "d1a671091947975f26c051041ae5ed61dc7bd21ef57a7d5632344c5e28302bab", - "33e96e6531feed095dc01796a1950f58955c4587dbf43ccd2120006834e57844", - "d44d5a1bf70f38aee54cfff77b3f120408911e7d173fba1517bf41d601cf83ea", - "4569eab8f8d980e4374005979edece5d1d01586390f81f66cbe35a653eccbf7d", - "af40fc452fdaed36b5a21d0f6888e7af3048d935c45c707b99356e48f81cf7da", - "08215d6e14456d8b6250b89a3eaf8a6951c200c833c45320a38a8f472e865031", - "12188982857dd8398cd5ec0d34a38b04e4c40131115813f5f47c4623a173ba44", - "2fd1c9845f980320da8977098c06f3d5e32e4121524f78e4c59ee0252bee4082", - "d30443ace2691baadf647416314b09c34f5c73548fc20e878a4c4782bebe8c08", - "ce87b0ee35c7297f70e0bc9445e709f7e7fb4e1673a92dfd49aff769a82e5cc8", - "ee9b35643baaa10e0dc3bce292a3b4b7cb824994c2c4037f5639fff1af0627c9", - "1aa53c1581c41c0da2a3727ea21a6e25e06abf4d0cfaeece3b25bc06b2081335", - "d651ec6bc2f335505033d0217bd81e17dd722f2e85d5f078e6a235d4f61f92df", - "718aafa3180c1b962a64e619dffeaca5b1a2a0a88d47289d990baf4a1aaec3cb", - "68f6fd954cd87601f447f85448b6893c4f9c5c27cfc02bca0f6d8977a2a9bcf5", - "a11c1d6c1a38b495d634d580c0988876e19fba18700db3ecaeaed2071322818e", - "af3c806e505e65e1560f7625f5755122a321baa6a4b047624c32da500eaf5aa2", - "f139d020bbce7927d528be796708e32268b4398b4f0c24c9e4650f70881e35d6", - "bdb366d01467c6790c08961a46c79aef5c8d59e08a71eb887cb5005634c13f0d", - "c140e6d7f9da7a1f1a53890e9e0d3e167055e0d608b921e0e2cebe9bbb6e969f", - "2917d23914cf9959a23afee9664519d74cd760d4a53f109a4e13ea68b105e081", - "06acf7dd081d5be6bfb03f3c4d3affd7b48497d3a9ff698e556098d107f084dc", - "1bc25808686a02b6bd10a6d4e64349bde8bf3ec51b27ad529be6620662579c91", - "56ffacbe01afed7311363696d72b8968b07e49d651386eddafa43d48dd53a76d", - "e9dfeba7b9f25019e92c8762be66dc0e26cadbebea6cdb742bfe46fb002c817c", - "ae6388f68a05627a5f41d410278620a56f7c83ff5d4cf4320ea6e0710c634154", - "c5d785363e1506afd04a8bdb5da8e5e18c0bc4ba824444bd8f91467ca8325012", - "d5bc1336186b3cd45cfbd3c5afdc9df8bfee7a64413b62da415310afa70a269c", - "21dc77a14d2cea0e1d9c5e056ffe2f311ebbae5cf4093bfbfe0587d83a5388f9", - "f2e6becc690421527d6fd79c1a089781ce618b116aed401b05fec050a4cdaef2", - "4889b8ce30cf0a9ef6c88ef9312d7d91f18b5674fad8e9a8f5e73b4331118126", - "343225565c5e7067f724b31dacb86162d49d903697e79528687ac755679a361e", - "aada401b4c22a891dbdf58218b62dbf71f4a40ad071dae133d08cf964b38685c", - "30870e3b10e4a0aec558ec2b5eb2d14a57ebe859740beb5163175a6fe566ca99", - "36af1fdb69cae15f9fbb8ba545098a04ea7d7330f2aa0b77b3e4d25c52002a44", - "6a60deef869dedf42c341fe7852ec72599d78903eb0fb3f66acaed167380fa3f", - "b5b69e2f32b6a92f565f980a5b4d1654131697a427e486e3ea2e126c82e344eb", - "d98aa4fe4cff724e5823e218f8bbf92a11b55e1cece42726828901f7b2469e97", - "6af946187d890659a119ff0a705efb3128e47a133a796bb300984d835df4d759", - "7c5d8c06d93c53bf8e7146830b44240d5c428180cd709eea739cce21517be424", - "e4ea70c60fb2dd9200e75fd3c3faf4371700f930b5fbee6fb7d02ebbff0691d8", - "0cda085f75499379129ec2357b503e29506fd6ac88059fe49246c47ae04a9056", - "7e46a2402add4ec8edebc542e05be6a5b3b4565519e8c39cb0a64b9f366afbfd", - "968ce0d9a6bc9d6736f3d126d21ad5f7c535d50e9ddb082e79a0e181173aeeee", - "0767430cc330f82c1a1652472022316e976a4ddbca0549797bdba09486e008a3", - "5c1f270eb8bc2a81f9d0edb40efa854e8fb941e4524c001788a21bf3ca8f5064", - "15c5307847006ba90040a0cfeb389f838db570131f32e92c6da0460fd513685c", - "a1f790a531c1aea45be3bca9f2071d409e12a41d4187c65e03e5bebe2548142f", - "907094c5780d658fb79f5c63d3cc33230e2265d0918504c13afc17752229123a", - "96faf89ce813cabbfeeeed922d9e5040cb1a7c1c15138df4d6e7331eeb878003", - "87ba33cf982bef2482a580e0465a83cc95c4aa63669f094d21f36ac70e331b13", - "320fc3c703a639e37259db70be18e0247cad2235ecb8f8d3e1742263da9ffdf6", - "add38ffa44fc5cd41e25054d384cd08327aa4c228d1d91e61fc8513ffdeca0db", - "b2ae45fa580e23725947b3baae15c866a92d738259852c5e2ad91f43ed8e53e2", - "b802a76eaaef007b96daa738f9913107002a17f7a42f4acefad79e32497a72ce", - "b0b90f88e7933fe9a84e430cf0507a73ccdc28803a8206ef37f8217b500dc421", - "f55d6faafc5df61e640407b5997f65ef30c3b84da5da75f2fee33aa22d4e4563", - "dc3dd75bb8c7831f34fa38669e96a9546a802addba4993c6314d1d4b26046d60", - "21321a705b786e416ca12fafa45612b26f82eb57fc69a0e378696ba060bc6707", - "99b779ae1b103cb8a6390af655fbbdad01070a53ed74bcfd3ede4863d10a2b5c", - "1174595d3d4c7c0fcd793eab0a98d3c929348cf3ebc19496269ea987f503b01f", - "475ad775ad3c8b1b4b1acadf3d1b4507813b9c5af7e9f1ec68efaddbc5663980", - "104eed376fd4a4c1286821420e020bb72c2661c98660f555bec9a5fb14d70652", - "e4af8f936f2a56fca03c104848af6a0843c15e46a2e06708d0d5e3dca67d26d1", - "7440b5c2812173e27a59104746ef60f583f876ff4fb3a88e6af28a0625cf6f53", - "ce720600fc671b69984968e5fc13351bac367acd1156138e8cb87fb330134b06", - "aa7fe83936b2dc697b0c3dbc0dccd0b48bf5476119bb1733aaa50ba6ce78bfa0", - "8d84d5dab10e5bb282e0ffb1c4501023d7115123a12723990ec0fd928976c7d8", - "36d17113e407798628cc3d2d00addbf9628bb28c489311fe6fa9ca8f3f70f5ef", - "3f405d374bf9c5b3608a066a53ee6e6774352a83d481b71cde636cd6d8d2ff40", - "d690a64b1cf418a36ce15a758c484b3400c6bee9d0c0f189ec7b7cf2b5906dd0", - "74b32f28b8421199c33dee9d5bc9567aa1463bfaca138fba0fa90becff1a0c8e", - "56a4116099496e7060eb88d93e3760728b7bb147253b03002697060263bd69f1", - "ce628746281073570ff194c375d67344b6685c678de827cce94f58bcfd652c42", - "3d3742ab6e0b83604a701c70e2f918da87008b4bbaec8e4f6a6e47c189e788f9", - "1df2c1a7af145debce5fc8822078093ea65157a322528a7d647eb296119915e8", - "290abba74cf5ef0690c3850ce3439e9ee86da27d700598ecfb6347b7a45fdca6", - "33eb247ff0dbbedaa5fef6f6d5147729524829cd8ee47879d5dfcbc77fe26bd6", - "06bd589426e2fcdadd4fee1a22be5e7954e483a4cd8eb1bd988e0d4aa1e4797e", - "cb7d2a7d3c25aeeb12f36fe4c8af407cc1153173cb3b3cf6b212a4996213eaaf", - "37d71251d73d9fff9c902af874dd8d31c3913b704cdd554295362098a6601d3e", - "f9f3e835dd9955a9ff25e2c055920a6df9f8f2a1462d0a44fea6ab6a9e6dd111", - "d3f58af995736ab784c221adab3c519a7b014bccef364896948a4dd5361a2657", - "660cdd309e80bf25a6aa54e57a839d9a0a348b53c781a66957f8f44311637c77", - "4e22568bf74511821bd22ecd4d05aed39d411b9635d61592932ec41b568376b3", - "961b60fd137f0655ac64e90b8a15b0a3cff9c532b32debe8e44a5744ff28113c", - "93569c3d0957c2dbb2c7e0576655e98eabb210592f4bfc9f8765e5b1e22170d0", - "ad1a816aec652ad7cabd1c68b13e29ad7fef12b5a46c7f0ee0b8f0b482225a35", - "9111b7ed2f7a93415822bfee872494c1c53742804d0bba590e75fb6013e3f4a7", - "794fed3a1978ccf23bd6bf0631824bee136e3b698d9b9319451d6105034bf331", - "2f2a567d703c650dfddf73dc654ad2986f27972315692fbc085417f078531966", - "56b11d6fd5d456b753aeb67121fe137c8efedba30fcecc39baf74c6c656daf9f", - "d7b9c2225f281715b54b06acf22fe26c4e1e8e3e3bf62bb7cd02483854fdac5c", - "74df536bbcf332947818c6c583ef4e902d6c9798546e7d9e10f962491b7b051a", - "c24f9d2cf6f3173e057c9036b6008d2f84663403fef2b2115e6c63c089cc08cc", - "a2c52ebaa5b127e8f419ce9c5413b9e6474cab75256fd5c08c69dd7bb749ca15", - "5229de800ede42664a062447b2a4aaad3baca075a056f1f93c1ee24a63c3fd33", - "300417b2dd5e0afa3ea1a7fc890f7d69c09bbe597d2707fa1b8b7a55d8cd1b9f", - "9b509928c3076c277ef71ea8d06b8cec5c96729d231ddb527c616327b78a8fc4", - "d61610c052d9a2a645d9ea1a86f71eb8aa4a64c14db4c9e6c685ed3a3899890d", - "cb7aa1f765b21d301a6b4332ec7a241cabb8d8e562add62e11ec45f16a6b0c22", - "0af895ed7dac03575f85de2f5ed8eb07860b99e6e31b010af0fa1f2d9cd6160f", - "fa7d9f86db83f837499abd3efc2c06c9eaa92613eed2e0f96a31e635fb5f17ad", - "c34a9dc14b2ec3005ef1a5e9f08631909e524baa0552b518091e75ebb9625ec0", - "31d5eaa82d01a037cfc20e44a261d760dee6d40a8e0f2d7fb9a37367252aaa5a", - "5a7814ed2a4d5624a3e44292e04f0262fecba4b85d6345e6c4ac9ec8c22cad11", - "e00318c3c0c32c03e7f311c66f809a3a7817a9255d80108f2ad660d05575267f", - "ced16e093232adf660fbf1ce97e177f142cae781c23e70a0f2e92d8263c251c4", - "95e5635538af508061b5ac1d2ff279ee15353ac410ac58c30bf8012af40c8563", - "2672378ead5dbd9e96ad3288f6cd514bd735c9b8dae3603327600b7295f218c8", - "f7392c985abf529d4da38ff09fbc145ebabe4c117a956542094598c700c7589d", - "1bd82977ce14de192ffa8ab0a97726acb136652397d63f503c157550e990dbcd", - "2384227c1cc52df052d96ceddd999f2bb5178759fd687cb1295ff9bc8890bade", - "8a578529c16945765557b37d46ca7b48f8490076518a70f243b57532617986fa", - "b7a2081bf49a36506f3e0b217fe909307d70ff96a52ac2061cc3816d4bd90dc6", - "65aed5eeb946cf4b2f0276037da48362c722820bda667768e9ec0df6325b32d7", - "53727682cc009587059212819745811e0d83cced01558c64f5e7a2a1d9b8feb5", - "1a4609eb54a84d5ba3860f69f4a14b297be02b8aeb40fadf66bd6268e69ec8dc", - "59735eab9f4f7bbb6cfbb643bb91517833ebd1a0f1d81588c3323ee299b36a81", - "de02c75d371cab87731830344d4787e8bb49b3aa9eac4ceff2591dd077865089", - "49af0054322805a816538f5b045b060ccac27f037b497634a1916fe4b4d31a6c", - "53e952da79cad900a7e7f0783d2c849ed717593c55e45752578eab6f9ee26add", - "a6c0545f3208377fd4ef417232e17077ad1124c4e341a76f21feb96f1fe14120", - "0a1c0213cbfc7be2bf5b89141bc906619636630aca8030af676e7ef58666a045", - "9cb97d1dac7c586e3879fc5d0ab10b268d5485bc0a0f28b04d5dbc2ef4daf614", - "4ce615a19373b6d71d8b26e31ca63a26ce91eadad0749b783e7ab7f3c1f881ae", - "c80091398bb09a95adfc2caa410e1927aa8c12b69383d1e135e5e2aa8eab43bc", - "c1c813e3c16ba37c502992200600d80ec5d5a7428e9cc823ce09eed5c2e07e91", - "ad62df64ec4eae4e43d116977b848d9d7fa499f11d6a41e20ce414a8d78e25e8", - "2879f0d53fd72b42f8ee5ac2e2eac955771077ca9be0e42241d0f0061683107d", - "195c669d37830f1a5fa1e7d291eb098d79551cd290e4f075dfe0a264b6e365d5", - "9315c0246e5754a462ef0a129528e6d1bc1063e85e54f14a136d1b5533f019b9", - "1965ade80cea6aa64dc248794845fd6d1f128c55b67d3171ba1513659304dca2", - "cfe7f2852550e6788c15dd762b7ad7260e3ded0169d9d0bc7bd78a0066078dc4", - "703691ebcf859c56acbe704b75a00634e5a09ec30257b96a04d12dd48130debd", - "f3d28099eacdac609c2bbdba7baa0311404f0a394d3010108ce0cb9309be8322", - "09f0f447bd01980642c2d97280af0e952ef66c87a91afe174510bfb12c7f3199", - "2789d248bbb62e02866cceb74cee02fb5f9107948fa8e04c22dc63e4daf90d06", - "c7f0ad368972b00a8503afdcf18e87529dd0c206ecd3c042b47937a166545158", - "a46ed6a0f2f07894b9c9ac399db9255566d4c8bdda4fa3d630ccb86ed51a01a1", - "b7a0ce24eda1cba09862ca4f1350643e0780c5af3ff6540ac78bf34a7c1058f6", - "a41ba1fa60300dde243de40f2ca52346f7676051e0042d310e7ea67c7cf89c5c", - "1ea7e9293a0fe5aa5715fc575e0012c20ebd154a3275a69b7eb4ea8f63c43fce", - "1cd6c8e9d82e1da0f4320c237dca568f99365f4c22287909e5e922203793ad41", - "450d7cb7e44533eddc09ba28e8bd6e9af9961682d0112ec30d321d82df7053d4", - "5b44f91e650c186c119185ff131cfafd14468f1ce926f76e788afc1febce6e30", - "026e03912cdd220038d8041f29264e58f2e62c9913a9aa9d65213656d3f7938b", - "b79eb42991963614fd8a3ebdbb413a207cbe80f2a868eda9969befa6ad32613b", - "a51745ecd57e073a5339d04247e0d266d017d570be2802c89c3d3207eebbdb6d", - "9215a3c6f21c022471928339b5f020edad1511c8a0e37bee9026f272cdeb4427", - "e97b65b0e97251f068d34e163a994c87a9f89d72e2c96b52181f739ec3c73c29", - "bbcb9e3c724b10ed5dcbdd264c49e4b7607e85fe0173bd46600973aef2d4879d", - "68073cc37cf501c4231b5f895c4fe6be6464b2d3a6bbd341e2895c2a66db5a2c", - "8e1d9e9781344983520807758f719d1632f0096d3862d0b6b5df6b9186d0f0db", - "2c0d210acedeff7e56e0c2225be80e482457cea13a1a64ab5e4afaca1311540f", - "e8039f3aad16a48835e7bfaa934c80cad6f77b6763b3817bb425c0514c4b5c39", - "116150680467c444262ee4b172a4352388028410591bf84047f36c9461cdc733", - "8bf73d3c77ee6415c2e06c3676db7c4ca41eb6c39a2877a583f59483e1216e55", - "21ae1e642fc0038ad04ef9f1fd74eb46f713b02c5c348aa95b85513307503dd5", - "cefa6debae5b604b86abc18ccaa0771bdd23e2dca2f86763b1ce1cb67e07dfc9", - "f8d3f1a65c41ae0fc699ce89628c996d42118e466995848827544ee517cbed4d", - "ec52be246e1f3f6ddb0c3cef8f62952d32c0efd6627214b43fa5290275d40ada", - "8cac7c6430e66fdb81d9572fae143e6ed7e857cad008609e3e71d76905de21ef", - "3f68e6a26a4d7af0ba9d07beb8ab0c0559ed25023537d09979c597d15ec49905", - "d141bc317e1d2320e9bdd24f20fea76ef197fedf6af0a86fd02291e961190cd3", - "57853fecf9d63bd972a9b64e40546e5974b82257ba3213ea26efb5e6d68c7549", - "e8a77b5225067249496b78f9470e38ca7db919d98779d805e43249e5a80d19f6", - "d58a86d30a7ffa17dc917eeee6c00a44310c9e508e9e76095e973646937bf2d0", - "6f7b6964b8e0a8c4ccdd71b3e985e0200352928e38974afc50c4f83125c22253", - "7e8dec6caf9cea6df8a29f996b12cbc8137f2cf55839cd3f701e4c69edbc5e05", - "d9e60037d8c596090eadfb617474453c9ce64f92b35f60577ed5eb324ea76289", - "07f1d41f7c0ceacedd04d1c27d6461348d0110e0efc31f4b92b92f30e81552b6", - "10fbbc4426685841b106a3154d30d9e2528226c94c65d552f7fdbbf41729c48d", - "b9b1e4596b839cb72f17a8ecb0881d189cb01046cd96ffa827699a0962302e60", - "b1e65a58d9fd9ed066ea875904b74e0233aa98bdfe2742a896215763065b7778", - "147fe612027588c66361aa95e80bef1007b9ffd4d06553d53b4899f47b36c9ea", - "666aade7ecf5fc65d635fa476662ac28be10b5886469346173a1f034ad9ba0fe", - "bf22ba2fe39c9242fbea056f8cd88235c2a1abcb9d050a49edf07554905109d8", - "8f8036944bce96be37aa9023e8db3c43b89d4244f253e16fc808d2d0e4b1bdef", - "42634d891bd58901aad94f58b3dc684c981bca03490aa4db9ccda657a079f7c8", - "be3bf45381613b01c6892eb965f639b2493b8aeaf882510dde00b21973797b52", - "aea69cf72d0959ab535591f53f75b7beff33a3aa3eb60eee142071b8692f5e7f", - "11673e99a6ce70bff80451c377cb625bc2c17b1c8158517ebdc542fd3f8cab04", - "96483aa047bf0ec2184d1533597210b297cf77bce7f8512a20af565788a0b93c", - "bdae2766d5b853ae7bc1d1a1a56d7705da5d3bfebc5fd22c0665c3191ecf32dc", - "bfe842dbcbe7aff84b1ab9066fb2c7324d68ccbdfee8970e2b037a7e367f0130", - "8d22e1148f21b6fcef983e92a5b5e2c374d0406072d27e628846ff3c8745897f", - "9e77521d9cb312f7dc200ffa25f91392d5c56d5bbc1c63faaba4d21fe9eb6541", - "509914a6549e33817469c661ad368415b52a5a5db737f891a217fe06a44bcc6b", - "858c0f76bf1afa41485e28dcc875687a52f9cbb497168e3485732398beab9262", - "7ff6129c7793c265ba823cc9704ac6e106e96a4ae9cba7042d634b0e48d6ed27", - "949d5dd5edff9b0d748b012c48fb8d688497083b9e21ca30dfbd17f6deaf2fca", - "fa920c7c0d4e3e296ecd2926ec422de9fe2c983c942e4a066b4295d1a3ed3c99", - "37ba3d9e51a3a27ff2cb865262e2faad60a469fcc1dedfc82d20d2acf0e61f41", - "475a74b34fd7eb0a413f68a10a2141d1e0ea4c2259739bcd1f0ab220db1880e9", - "3d4355f626d8ab0780fb61f3c8cea461bf5b469ff1a29db41e6acc300d669d4b", - "47346769424286020d81c8d7d0caaebdb3e592710bf8d4415214c3afb771efe1", - "8b8e610493a5b6f35f8d8ebc018ae1b0c068bb5f9b9f950f8b927cbd0a2e8afd", - "64e40e18f3a8f791a442c453674f6604c9f43f3bf2a20e7ef6b5bae33d983e75", - "c29ab9f4a075a042647e5b1772736f38cb606dfa2368535feb1888777a7cfd5a", - "d688aabd9185f392dfdb88da1093387a480b8d9c968b0d6ed18b661915abebe0", - "25e08aebf4d74c84c381a0678b2da8d433e25003a316d3c733152d0bc8e9716a", - "d989b874bcb65bea68a2ba520e2a7eaf043f72b4b719cc385d7071c3de0abf4f", - "1f3bac9d448ec94ccf38e405a58749da5ba20928dcbf41b041e5c2b047b7656d", - "54992e9d8b5ff2fa949da9ecfc771fcc7f1471fc9ae17411acb6a8a24d256e68", - "62bbce2a64bd968cdd151f375ceda5c672b6c846d1e9bd3fa58732a4fc5a7813", - "a68718d299cf29f7169e3cf4454efd9a36e5b5451e0f103686274f4fb9299ae9", - "a702d37fd179da357575e390a11ff9e7996e3c8e82412dd52f02036473f8291f", - "b6d8372b2c945b1ec513ab4510e197d767bb3a0615ca4bb842076838b9e69120", - "0540e69ff55c4c3f2a1fba0f3444ae7a585a78494bc0681c26e25548232f7a88", - "b1445bc83d3ad8672042b0c178afbeb70f2150ecbea2d7771426b7f2b3811ac4", - "48af34804416f3cfd9ade6a88f05dd0bed6658760daa458d58a7a61a6d1db5c7", - "d0e82ab716b1aa86deec25188f521c432c0381b1125261160c9d9de0041856b8", - "2b43993129e1fc7e7b7b3a42a94801743210117b68a1f4645fc736a5604cbb5f", - "70a174458956c4aa1b57434f5384d9f38b2862de504ac993ab39898c023586dd", - "8d0852577806e0891fa5f304feb7a822c0c27b909b9228742682a84b9d83eb36", - "0efc335b0263c7843d19cec4532809e7151c69ae7eb9b7b2ddfffbc0981a7479", - "bfe5d3d13eb5694fbe20b6448089c95eff18d5bef4d1fe452ce637cd9b07b1b4", - "a8977750f5cfbff4ed1d6b601c6876ef83c6c8900a81e861e5afae5744af23a0", - "229b8ad0ec342ba9da6f06590d736c97657f7a7f8b7315c9e6715c8ad6befc8f", - "195cf92d2422168116331ae5bc00a38ce3dd01a95f188e4a31e7017906dddbcf", - "d9ef64d20fd87ae83d64708054d8de8bc68bb9bf785226dc7dffba089292a44d", - "9bb7c94c3fcd34a7cab5028fd010ea58434e04168bea5a4552babc733f89b983", - "d09589e42aa13b91e5c9d70c02f1051b7ae1549fcefb842a67f47764cc833f76", - "17d27b19bfbd4f8de6125575dc9e1f6d64aab0dfaae27210cb05d51bb9ceb7af", - "274967ab604cfd14dbe7a79f11906b4c7f260ca05d0528421a1634a56144e943", - "41ce1ff043a24030afd292f976184f38759e943d49d73d1cc065573b6a47c03e", - "b6c070d72d28328e856f310b29a863b334f0cc27e1a1127f298e54ab11e23dde", - "61469b5095f5acd887c1a2b176222dbb0c480c374f36d13c6924cc406278a326", - "b9d5c2e1d862a2dcf0442e4e07de85aa72b1482f4f86284310284ba0ef5d2fa2", - "148d775e6af6e47b507068c05306339b8b5db486632c0899869f07cdc808d44c", - "d8f3b00764c6f1af22ea9578d68a0a9b75ce80738ad40d9781f52e2c4d36683c", - "cb74b72b4fc571114634ba9084bbb3e9197b24151dfa1eaaa3b18df84b27adf0", - "fdf4262e226216406e5578b04b6e5182924f42377967aaeb8d57c93a4b713736", - "1d076af2002ab507c265847224dc19fe8aa45ae5e48b354a4fa2b5807b330245", - "9862b4f3acd773ffe438ee66a6cf593b8abfcdc4092d837de07fd7867b55e9e8", - "ca62b0699cf00d85c394bbb2bb5a24b54dab6360626e993542a7cf0627d12004", - "fcf83efbfec7d96e8b4d61aabd254b905e58964368bfa18aa6de35145efe90c0", - "7139afc0b3924c0c8c5e6a4d4d58c5a7e53192173f1cecc6d6250ffe922f4ffc", - "bd9b3b7cc1a6707664cdbee1fc006abe4a589a86bab88a6577d440ccea9f94de", - "b1462aac9994ad272034e8a946f6f7e418973a7d1894ac4d8d25638f57ca6721", - "f0d5fef2a623a1ffab3f138deb81f4fe37bb94b98bc9e6c45d276bb44712da1b", - "b4cd2864fd1e8339acbcb062bbee8b5539dad717ab1a81ad358b665ed9570b4c", - "c483ad8cd96eff7e6c61bcd8313e21258f456d7803637d224f06f41b18f477a6", - "ac4a62da5181218e661d70ab4fbe7682443301e0a12ba5ef3016840da2a1cf74", - "3b35f08a75f5d9136c14012fd45167c2c491eb718719b89d7445d37cfd4ed1b2", - "ed3e2a2931108386413b652c4fc588c6a94783403d47478f4cb4e4296c43469b", - "606af102ebd2fba6669d5a8c4be9515df6735ff7e0dee40425136192474ada1d", - "a04dc081b92874a580a9ff4e02f65ef81399ad53526e53be831c07c6685693e5", - "ccf7bffa9681ae1c675ee49808959a4e548917f6211447cbf2b243320f39018e", - "b634a150a1b9e3fc6bf8fc34e483be9ce4cf1d1c34e4387a28f537c5e49d9f14", - "98115f51b8eacd0aea0e666103902e46d597fca113d7fe6a9a21e4fe299def33", - "37006073d1605b68176a460e207a5fa0c2e1f059f7e1c9149deeb82b953c96b6", - "9313299435c12680e6ede4bee5cb414d54e3059c6df42c530b043d4d69083977", - "984d0444dd64f0494d3f2ee35bebf2a6164251abb0d92a038decc73dd52dcaa1", - "5f71c70835f05e53b44b995b6f85ea0abbf7b5acfd0b6afa551dd263ecbdf465", - "a57c8d1e2cb288c0db2b63490d08142fecf2f3634067e336c48aec9d377f93ea", - "c9ea34dc4a7a5187876de4e696a2902a71cc5f3ee856510a5b1fce05c7b79f67", - "8b5af35c5f5c3cee33c8cf0bd2556653356e6af1756ee9a2a87d59ec49eb9ec0", - "05d635d4e00bf243b9aef99982dd5da1db31127f645b45116408a8ca80076d04", - "555675a4879ba9f5cbae5bce611c0d636278a3551a72098fd5f42d0f453f24f6", - "5d285304a362a595b51363af1ef2624e6838d6334c39b8d6658b0e2ac1d5fb61", - "aacc78d29755a1cdce69e47441f059a50d0d55bc4868b169ef516b5ba721e462", - "f5ac2c0993bbe5a1ad97f2e67b5b1dfd5307c0fbaa670449bee74b0a1fa156ec", - "20bd483c01534eb708e86048832cd6544c449284108ce3ff6f6a21c4835b6c71", - "0e4e4f0e67960ac371d1183a975d6e4a7265411d99bf399f3e2e2721b7ad7b4a", - "ade7d6dd82e68e5013b5256a07f0e054586110e9d700745178778012e926e895", - "0e933ced4c5fa73a9c077e3463f7f1a48916b50cbd9042a8a11aca2b25c07b25", - "73e5bd0b5470bb648e4668771d0f1c973882d0139783dde639a651f5881774ce", - "a1684bf0c7c731dc912173c6b9ebe276209764ec993a43c2aa6cc640c721d243", - "5aac1359909ff24418a24c90aa743009a701b042123d14be523e81aa867c0339", - "8d6a7a2efb14217b15752824cd134a3e5601a4e853008a9b254570bcbe9f7c7e", - "66ab0b6e87bc4122a6669838ee1a05d801a7e96b3ed964ed6f8b1df40b8c8345", - "349c20ebbb8906bdbf65525cd02ee0dfe43ebafb8eb19a7a2c9a5e56859e52e0", - "2e56e585e79bffe366950345c164b7b046c48a5ea03240e3bed159986f22403c", - "c4d53a51142dc4b656d64554a434b6d656af1ea9065142757d680170e81e5cc8", - "552c3617556b6d9dad3352aa637cfddb9c01cd1196afd2fd65bb314ff4cc0001", - "cfece4ee8e41bc653aab2ff91f4eb29ebc8e2a970b8f30f6850dff4a0f6c427f", - "d6a28b75324b7eb60209e3e565471e92a4f01227b00b24aff96f06dec2cfa999", - "b20fc54154286a0a4d6e8c639ffd81f1c91070d79c38064a5a57fb20ffb613f5", - "9d6e166ea0749a309c1c31e86342511ca5c5b7ddb12a7744c75935045df5d1ce", - "c5434614a5b63ae511b7388d0ff60206d3c02d6889209eeaa475d31fb5236c69", - "b799a930c4a698f7beb088958b51a45b18016d1401a293b35d00c1a9458552d8", - "e4d482648416514f5a8424cf33fa721d16989e42d3962fcbb564ed293d2c8133", - "ff35adc54432478754b3ab8a6653f4c511d7ab53563c7db932d6f784396bbfd8", - "18d3266e5f153c1717d3e1df1a00e7a190101afd3ae93bb428925422d970fbcf", - "6ce0f6a1d2a8c9311c5217886a22be6d1c6ef71e80be835236ac06c24c981c16", - "07e9b0218ea1a8cdec460518e391768a378a739d986ce2b623e99414e242de42", - "412c2a54e793a25192e70eeccbafc6f2fd7c7863c782a255aedaa39e0f026ca0", - "68946708488f532657ebfeac2666611aca7827a60497e42820d2f82060479412", - "b242c862ab941de00f666dba4fd6edb5e8ababe91db3ea5b36431ded23fc794b", - "ccfd0df623025c4f41b3826d32ca6f40c5828f74c827f189e3a8638afca9d868", - "ca8a0a3ed6397d22d8f74059eb9c9d0db2964c1424ee44178ef2d8506a736827", - "064081ccc4687f5a57179248477793fb2c19f090a0fb730ff315978b2f15beaf", - "2f470f4ea47c12870a81db8f5f5054038f91e7222264f534ca239a98e61937b2", - "7cdf52670e53786715c6f6c1a5851c11a00e2a0f2b9aa8c1b757e1c145671ccd", - "f39eec004b382ff97b8c9c0c3086153dd09aabf778c0aaba145f19fc38d6f849", - "72caa70f0ab1993efe9d80e18849dc3e22393280d56b5d455fc77041e19334ab", - "63b46e454ad924c8074a4f696f5d7e2198b0c02b6f90a862bd04f32444aeda98", - "b962646d02842e240b56d4ddb68c99841d9c8b199354ce7328f2876d4d65c200", - "8de8abe2b5ce9280729172a52a6dd55f59ca86960b2822d0660bbdcf8eb24c48", - "9271b38642ebf778c7db275731b7e384f9327541dbaffa8f7a0f0e50891b0cc9", - "8a750ad47a4144b345153d0a896b5bb68ddea22460a57d4e1f5097869137631a", - "8841d30b18812b09fad66f35deda208b58a9dec2c1173fa82dc2155da11bf5c6", - "33b53d90f488c7d72374e14e7548c440dd8ccf5c9fac00042c05b0b3e66720f0", - "8848fbd64b41647b60d62141f59da35051b1448192b6d337e97b86d57a55a5f2", - "b2bea9dfb72854d1fc594f1aac0f5ece705248f80f4bb7f89bd1f8b9eba07bd8", - "27542a4bc5075763466b21e04e8a64c053d4ed69ea952776121bf8ea9bf9aecd", - "9f522dc0101764ffd071bce729002ab030b880765fe407a958249577421a18ef", - "1b7b21dbb500c2ed8131c87bc1afc329e6c50d0341ec4db6d6dbbdd2578300ac", - "2c3b5ac8c1a53931d017b214a499dd662c5f9f3b0dc0ca6333f1d54acf0c653e", - "c281ae444751af262638d1719dfaa2f741ee717d72aa822d20d41c44b002439f", - "6819d8574e8e139467d64c6069fe32b8ad4c69a546a6e7e38dca3b44ea4f6457", - "6d24f57d6ff7d38630bfea329b43ac65344343e13f0bc313f503096746089f61", - "1409e1f0887cd484f25556a25552affe15bc08fb3bc881d56b6fe184dc34badc", - "aed7efc7fd845cacd0b28d0d254746279ca2f6aee28c12f4391dd9f15e7ba6d2", - "f095e6e07e1016a2c3e519dcd22d79915a67743e7207ece08c1e9e943da7d8c0", - "b503b87b315a83172f9222845040e8dc9a48a41a8523f8eb911f0c7857ea5019", - "b90fd3de707c40cdec5c913baab5f025d202586bfd20f83e6eab9594df9b40f0", - "a542986cd4f082745529d4bcd893a642bfb359e9e6d5487f7c63814b35df1ba7", - "2c8b9a2a727b2f4971f57afa014ef38e7deb93a04f5b62513b6a578fb8f60efb", - "b6d4a5a5a0c67bae7e4ceb7d367853586193a5bde51c1137c4c0db962be4212d", - "00ea9e5b830bb0d77ac7dc9f3bf3f6785b043b9a57ecfe067f87e30df68a8b65", - "3e3db23965618efb1290226abff2c110f99aee897fc6940237a0916d455b7863", - "7c42022d63109db23f5b3a1c723003d80ecc98c6a33483e8fbc9d1e4186659f7", - "592e6853204f0ede6c26eb394d8d62d17e34bf68f5f7f7a2c7e3e3d8d23bf79a", - "a4fc24197a42621fa46cc27d80373831aae39ab6f893b10fcc796f38742188d9", - "9365c8a2009d64b4e067edfe01869f51ea6146078c36cc6ffad02c14df9f6c19", - "daa48deea8bc2f987ee76278d4d38d4853a0581e8fc6f9fcf0e4c6583f457ac2", - "5f2390192a73b231904935d4a182a0adaa053ffcdef1b5a4c59ed3f7e5715369", - "a42802cafa7cdabd0c3ea37a25684ba7f0dcb98c81fce7fbe1b5747b6039c3b3", - "9c4ecb7a7e1fb9cdab35acea33f33367970e4a0743f75650b9df32096cb69c69", - "0688074ed2c80eaf95f1e1f5fda15ffdd6fd9ffc0a7056da13b8f658dc05f8ef", - "d43e68ff1ffadb938e4a3522570b6e7c2b93a194e29b03af98e5667bf91b37ab", - "3f8e3f9a80ca983aeeae342fcf09ab56c4169c4e7b563d8f76c1cdc613aaea1f", - "9c12a61b3cfeb056bcabdc28f205c9464e644f5690e2d0682967046820371f4a", - "dca9e15754921c032930bea6986820209715ae89ab2001b7f8b6d21a3bc05b06", - "59f18090b5283ffdc7157718f06d47345199b8471ffeaac73bfc010b581d4ec1", - "2f748e302a7c0d89763218f33ba441b77bda915177fbf6081a87ea5dd1380d5a", - "5aa4d2066b8b4f10529cefa3fce1f9f4fcd3c3fe95b6668ecdc873ffc204b476", - "c62b09cac23c3b7b7b867c0a9116eeed86be6de33054d314dd4738ed6464fcc4", - "86e3c3a8b516b83d9ea52e5df2bf3508e9ab2679f82e8014406923eed9cf0aad", - "3c255acb57a16eaa8cc1928ed55dede183f15697483020c415e24e0376c04c4d", - "f276c478c98b8b86871ef3056e50e654969f590aa1ffb62d5f73422c1055f5dd", - "875a6ab883ce3409973e8c36d0574374d6d15be4d26deabca76483a24d546daa", - "04ef009196d1f221452ed01acb54c3c3fbb93b6acbc6d8d94fb6511c6bf343be", - "24d95e498510038dbe47c7be25e98d081bea924444f03f589398aa0454d778be", - "4ee42c9dba71f69cbf9dcd33e55cec78d8f156c9a9b3feb3330d6d85a5d060ad", - "9c53b6daf3e9204f3bc57f2b7ebaf342f451d01b701bcdc558d5bae065882a65", - "6e42b5b39c2f1370d70736f9ce25444ac1a9239cd1d5019b65690fb851136e50", - "9cad22e7225cd42f4048262db2a11198e44469a8a7acdaf2298875baa63831ea", - "f2b88e86add86fdc822749e96a585c98aea472c00e00f4652aabf6a85e1e8083", - "98a73f68da7de5cecf81f9630c41ccf26c428c90fb86c0f36314863641a88409", - "79589bea8641185ba30bb393611da8551daf31297425a868f64f57ca24bf9ebf", - "e147a50c899e9c0b2183071b3c9281a58d819f135a60c4dd42ebe39ed48aa80d", - "330a3d3ee89d2b411e95adc2862b4b3322313a0efc6b89fd037f9e728944647f", - "cb595489a51a3f5a749aa5ac7ad58c4aae7dc15684746759e0948107e4cdd944", - "cda26d01b7a4eb2cef569b17d4212a3fffa13d6023d0983205a1940c8b4e7439", - "6ccae42ca0139e0fa1a4b474c247d21335182fa5ef5b9219cc39e0feb341c3f2", - "08fce1afe2b6329a264c99792f43d6e549f9d67e6609824dbefb75cd96f14fc3", - "11ba4a40019f508ad007ae9dd90bdb27426a91139427d002791924b3eb59ebe2", - "405917db0fe8d976bd6c03b5eb78dbcd2d2092745d030f31a5509bf06cda253d", - "20b4fda12ba2dde38227e01de9989f6b58d6fa601f836e66e30268b52f97ed75", - "9abc0cad0c3de51f6192b388f3ddf595b8095ffdf95327ff0b3b02a5056f446c", - "ab0c0d4a88a6dc9e74a51a6d835c3ae082aafcd51d112cd9ab1e498026819f88", - "92851709a02476f3d55361dea740fb5ffcff73ce4da304cbccc3eb233a38b4f3", - "62274b354514f8526eef89918a2ec3860174a99f6a86eb100a4417ee311f156a", - "ec6d48f6c4a33bfdc44961e3bac4359553a7e11b7c66f8f6d6f13686e7e73297", - "f30c6a2915079cfe00e63b648de4e83115e82646cb654272de043ed3248fe5d5", - "796ef2c74ed3b54557d273cefcf127fae817637585853d2043520e3c395829f9", - "475a4f555a8c3c501f4dee505a8ab8deeeaee945e2ad6bd043d1f0d2352627f2", - "551bb31527039e42b1491741742b68d66222cfa439b3b60c4ef7694cf40e020a", - "b36fd88cecdfecb0d9c7380f5613664e079a26a0b0ce72e55b733b6c82694f18", - "55dd6ed4b17e1a823c081f09a1fe3bd25ef5781fdb3ef6aca82e12135e876574", - "e8c0eaa445bfa266af2a4631eb2d3cd7215f10a5e12ca24030a5c4cdb732bd4c", - "00f4420d53e52548f29e7ae11c690a9d8f8756aed407013991b0d849388a08f1", - "e5aca72f829f88bf3ea1d654eab1fb020172120e734afd17db89729c255aa1a7", - "2acf0fcff1a7b6594cc43158988bf67a099952261de2cf4a214609ae823ca968", - "adfeea7d91855ced71c67caa7060acfda533e182cd15b21c0766535b9afc6308", - "4f03c8ad47f41643f4c1981f4ebbb643c6c5028ba123b79e848009cf336cba73", - "d39e245f08f693da6521367c874a650b47ecb56a4c572b9c3375538a064ca276", - "b8304c829d3543fa2b01c8f85670240b9acdc4d832e57c4f60b5f7ab20c02103", - "b1ca13efcd8315ae00bc7e357d6fb1fe57c2eef63abb3577a2c49dae1b39d124", - "358b7b50eda669b55f120328a389ff72d1941774ea2046076fd9ad7e3d665bf2", - "8bfc13b9209bbc37b92f01c38fcb82ca53158e0ba4747d87c032292e0d8ca772", - "2e0ddcc15e6ece99ca4174ed58626ab6063f3a0249d4ef3de124a5c8639fecdd", - "25a23a484c7b64092918db17ba2f4e551b24b408dccfb328fd4576b2242b0733", - "7694227237888df90ccb4cf3c273d8ef5ff019224ae593007af2021414aaf9d1", - "c0f0e0e14a3810eefe58e9d3d4fe31dfc85a440a3af7f711fa341135e39d9cb8", - "eddffdb73f7903b3fbd222dd4f8f5373033cd10d0417e89a5247e3bcf188f99b", - "5771614f3953920babb18dda51240817d4ba23a964bd5f9a813b23d425efdc3b", - "96025fe46d95b0df6448fd0ae39963d2926109b1fc460cab3faccce4a0ff954b", - "ca504aa4d3aa00cdf8ec77983ca428d70a6cd243c34ef2ff50cdb2f426d016cc", - "ec7348d82bca1952642cd928ddc1b2feb88d58ec9932246a779d24c0107f9742", - "fe30ec2f5970ca889d239a492095eb917efa2b4dc86b3fd9ac680a5255dfbc01", - "2f74d50c7205245e2c42c293a138c18adfd4e8e12b180c8e00dec7ed6a9fc466", - "0166e79d18f9792acb627f9dff04f3133395beeab61ef3db33d07ef997b0014d", - "6df0da5b4049b31bb2c383fa83462304785e93ca9de3846538234cf3f0766aba", - "354260f6e2286e46e48121bf5f0126081e3ef45c3fbcf76ec57c76c5f264fb49", - "8640dae668e008fee12cb66f71cffd9223c55b9ae27f800d3f3c955ec988a2d4", - "92df3196b8b8175fc1397701a4ead3214431c73a3fa2cd44c94fd66bbdfb55d8", - "37a9f2dfb492ca60b7cc420de1086a2f93d987400981d8f0b6d5f0af22237a12", - "d9b94c9d3c2e8f377cdfdef69a073c7ad0f8c4ec59984821d750e23216ef7d10", - "aa1c57db546f422dc8dc1ff94a49090ffde86f78b2232875f25b3d259bb5c7a2", - "e839feb611aa3cc68cc1622292ca8fc1dc98aeab9f78e90853b826d0c6776991", - "0cf51ad7d429f7a373aaf168c892a4b493bb9fee4bd1daaca459da6cc5d3abd6", - "7e18c7fab8b5201630b29ba95489642856b7ac0f622b65b0f7cf5658af5de5b7", - "ea48341d5ebad6ce2475dc26517396efd6e242525d23602fb16b3dfde8e1c48a", - "5389771a59bc99810bf8e4389183d48fc83708b6a7362a0f240147bd476a3063", - "0529817c369a50917b58834899a5434a852527ba678998d1d213107cc461d7f7", - "06fbf8f35af05afbf4ccd6801f8f5ad0bb4277b887abb604f8c6757def5262c3", - "59de1edd898fd7976b53cb339a3ada9cbe08115e4bfc99f209dc853beaf685c5", - "ae82c98989ec2abc6c87a6c9c8418ed802d756a90022bbd5b0fe0c2caee774fe", - "50beee87264a2c7e1ecefa0e798f559af3d4c9520beac793477e938bf494173f", - "3b65f49599489c2343229f72f0746719d9fbf6a159cdfb568b476fdd5ed09eba", - "88346ca2e4b591a2cbcbe54f6b4b58075facd98e6598ac7936b25750c0f066a4", - "dad09d27214835786e5f1025062b6826197b8c1c7310a242894d2a73bdbf3036", - "4aafbbbceb8c56d323a70d8c8a9624355e77b341973d31d4e786ed4efd805447", - "3c0e4631111f5f138015a67175d6df92563a1539e530c20a97e8569333cca8b5", - "47d143beb1d2b0f882ee65a33530a8c53cb5e14a3d9b52263385ff60f9393355", - "e715a2f14f843d09bd17d471fdb905a6d3a781dc9eea98953abf0451b7e88d31", - "dd79e136a88262457910cb46e68b7ba82d8bd3fb544e482a9863e35f91f96121", - "49cf7d12dfed8187759ec8410233eefcfcdc6486d1c5767e4f08770df6389d8b", - "e4fb6d79169b73f0e82a602898373886061c7cbce69874409c6c1c3f1bbe7b77", - "8745c1d76179653966397389c782dcc4d176550e5edc92bc39001f6ef47f5c69", - "892cebf211a16c76f2941b0913b22a3e16f38620e88638304a0800fa53ebeef1", - "8edc0068d15e78a49b37c1187ff61610f898039b5a7abf802b7a27762fe090e7", - "82488ed37cac7a924f113cc72e44515bfeb2510eeea5c4dd557015896514909a", - "57defd5437e0284c38afcd70b4fcaeae8c8032516e723ed992743836e099eb45", - "299ee3c77a3e5c53e34b2ee3b5bcd2b405a7a28e11475951957b1c96c4985ffe", - "632834f868d497ce34851454add534a0eef0f502b5242bdcb7fe15d37d0e9215", - "368953c97d2f89ea3dc2bb90984dc6d797fe09260db7b2688d4210450c2555a7", - "7b177f0bcab36b5584dfad92ec84e33b0fdb9089ad8f4e66aee2069196b0dbbc", - "c157b5b69c842c94832a65eb590530130374f1307b7ca31856fa04270bce1772", - "c3d58564f6c8328218f5b8616afb138b608a6d9ecc67d02fc599800485216b1b", - "995a51009c4e7759b4fca02254b2b1e507aa1cd694add1f598d63b2d8f611959", - "fa0337e614778876a48d1bec0d919cf028e262cb43f024603f09bcbefa519651", - "d4201d43c22bb6accbb3873ee3c10d86819080ffc1e7f811fe45c997ae8d9639", - "3814ba600c2c6d098bb8e73de2a96768212139929d5b4e5140ad2cd130524e5d", - "50bd5719248500696261eb44b56b6c96af3cf3fd90d4c26a14f8912fbb258860", - "26e09f02d97a86140428fdf199aa065bd40efed1203ee48f80d3a016711367be", - "498e2654513cbc86a1e0ebc5c6802a800dbd16aa5758c705cacd134963b60a3b", - "ce042e161d94bb82519263a979f760100cefa5c7e6b13d39f0fc342fccfa7f3a", - "8b2ade65cfa5e053572f2de172cbe4a29a4a3f7e69e17de0828257c2e94f846b", - "f69e05d96c0747b3ed0a30e04e4e70af07adf2c6aa2876e685dc94c594d9a18a", - "5a81904811c20c786e6e76526004901197d8681218b90fe031595852cd8b8aa2", - "d65d46953b5192e60d3696da8b0a2e83883ae2fe92e40cc8d4ecc61761071aad", - "5c2f960d6987a972e35cb3229e22cea16bb0828b7c8d8f01341065745ecd9583", - "ec7a792fde7fc4e90bc96c206a20a23e2a51dcbf936935c9886871ddde5cecc9", - "1fad565eb87ccff0aeaed38d45cb92572b013554e5566bc26f298cafcbcaf33b", - "3f5c521e00cfd32b0b1aca23b4b898e45c9e8c4fa932b0bf422c9d3fe8396326", - "7c02a1c6572f523f1aac3c0528678409a9428b839da5560a50e0726c90f6d738", - "e4bd68529455f7088a98903968de33f35a1e64d543b4cbd3e3777eec1ef24aa0", - "14ce77d6bed610e5247ad1ab16a0ab740ad79e59a66c969b9f7a3029d5a6ccb4", - "2a300ca8b53c45936951780d3e9161c92ce68fee2cbd2efdb078235904d3d4e5", - "d9118df9ce2278fc7863a5dc772db8aa52ef902a3928a6998b59975c3c79ca73", - "069ae84a3b8726deb23e89dcd96c84f63cd644288549644eddf414ac50e350b0", - "4101d2691da3616b272e06250408cf1102ff0dc7d282a7916565b59bc988b771", - "5624c6d6832fc0d0d8ed0beaea96610cbe37b4d4adc0cb2d8498a8167445abef", - "253d4ca52cc378ca55558eb136e3b18cff0e219b522f87173f8f53e25d5b9e13", - "153b0917e4cb8d9b6b7d9534b6418507aef766f025b30455bfe3a4fb3b5ae708", - "24001942bec7a3481471d06b1478fc8896b7e6b67e1e858525cef78308f246c7", - "cdad21971fdb31bc0c13d05e334a150e806f87d82078a052e8658746e7da5541", - "d64ed305b28d9a3af965ebd63bdaa534135a3ca46345a85ec95126c4e04f0e73", - "78600ab786569c685b282e9225ba21bcdc774a591754b1ebb4b205151811bd78", - "3d2c0143db7d9b0ffb941f1b40471edb97af8457ce7cfe4f1689991005209470", - "0b77d3e93a1d7c9d1654e96c4bcb4bed7c854fed0707cc1707d0c1fabe87327c", - "5b5e464384950259b38d16a41fa46e081b570931ee1dfc614ae77f4ea23de618", - "f49220b39b080461ca6a59ec93ae332cf19aa6c575433804e49018f6b194b604", - "173e02259f45b9cb7f318f3fbe78f6b7e27761d47b81d5990a9af53e28818362", - "a2b05e9c87ae9e5f480918d40a6bd8b15405e4818315ea7431db67908eec5a27", - "2549357a2a3b99927dfc84f405ce8ee9fbf794e787bd0a68bbe1ee5c963ecb48", - "67857ffc13184b4523de4a5275a6e17746b04a87a04387780b9f6a19aa0601ff", - "ea885e96469e7ad90f8977055b2b12d1d8d734b9c40e2e16268ca02d3bd9bea3", - "e8499fb7764da193b906bdb0709c92bafa52885ae607b07582cc1326797a0bbb", - "49deeb88b6231b6f4fda76621aa653b84436c98c2429a9a660f49d937682ddf1", - "fb1e97bfbd6591c36e8fb3eb75cd1159d23e8e52116fbd1f2ce077aec6a0e598", - "857265614b8aa16e679a50c1f7d16a7b4564500bdf2fbbd57c9ecc4caf7de988", - "9776f10822e102007c1772855ad7a61f1196ac8d67bec8fd769d4e29985814bf", - "1b0d3d391bb8c6d6a50d0fd14ba42895a1ec12ab095f508892b1041a584444be", - "66bf89a994339e872b8037fbf98b0220d0c9fbdec6ccd9bb3ab00fde7402c6a7", - "2777a8caf5c1bf239a17bbdfb6f2ec50b2817bf5f9cff79489b77de2990d0d72", - "a91fd7637f329dc416e96e147189372834cf27249f69ac81931e8d51a0fbf2ca", - "96f8e4d2967dd988ab93680f4276812b7c1c9f112330abd0969e0e64d65604d5", - "6fd964421c7b1cecfc1ccc7614d77cad68cba750565c7a674122832042f8f30c", - "8605d6393081c2695dce38f49eb15a60f7e891665d690390b88fdd7051524ee2", - "75b6f8a19074d0b7c0bfde7ac90a28a74968faa55ab3f148ce5756df77cc589f", - "fcc60f5809bca8f0eeaa1cd71814746226add82074594e89031ef6d6e78a24fe", - "87746e0c3dd32a087d9ad0b610cd71745fd2ad4319470efe6c2e18068ea9ee91", - "f55ffc184a08d2e1a7bf4a2fca5ef00b7c09174a2d64af7f7748e498a91b3379", - "c045441dea51663b8457520f70289bb84ced0949afe172fcad3b1643a5c31f86", - "fb1958af6413ef19a6d09523999f019c3b863f58104b7f28118cbba257f5df55", - "4efa40a1ae2cff0187883d2258c4e9cd21477ef1e9701e0d86f2e0b3ef0dc4cb", - "d794ad1cdf22d955edbf94267a7fe54d066ecf936c8c39109d42f0e53ddd4a32", - "dbb671b1a117c065c4f88c447d1282956f946b95492985300b03b4cf5aebb096", - "ea1b4ebc595b4f8b04a507a78762575f4dfa564e7e913c23daf37a12d0e8ad3a", - "92dd40fc5e7c5a0768402e26dffd3f9f83b53e964e95a1e8dd597a859096d5be", - "3143539fbc3707cb786269d902f301d4a44d7d75f882de5308af98bfe88bb39d", - "0b7e7bd5adfeb186c81b2ccab1368aaf675599be42314a5c32ca757d344441ea", - "ede7b6ddb146ed1e39206449539671c690e5e8cdb2a1ff3011b9d04c6a0620d5", - "cbad6eea99e26251e5978e73589b080623c53efee1bec9f8f5fd7336f7ccd14b", - "a1eea826b47ffb6b8598e9163f4fa2cede7acb56f3d0c1ede263cbebe8a9d63e", - "d4d7c9bf681c7f06ab518e4654ef712166502540b82ac9f763812131089d928d", - "dbb96f6c354d5e44a160b93fc9e20ac648967a57c39655aec862580dd413898f", - "163eb3cf2524be076ef6a9b1d42542545673ef38d00f92a47775887192de5137", - "c62a4b6f5a470d467474140592dc37a157742ec85463cedff0ea4ce126915559", - "fc0274c01a9384996ed7747f7fee8f9d316422d2e4720df46664441f1e90e347", - "338046571f60f3eedad8562ac4c25e4e967e264e4e11ab2d2aaecfa63b6d30fc", - "0a0a990b260909eb6f62cfe1432c52ab35a7ee8c958c9af0fae092574756efc3", - "bf7e05dd0bfd98451dc74fc83c6b6c603813c04be776cb0e0326134cb9186a75", - "4f5c11771b83dce53abfafec45a9d640b607266887484d741dff1199391e71c7", - "7e5f04a2270921d2ac395ba69c0a1ba6dfb82cfd7e5cd2d66361cc5d98f4ff76", - "6bafddfaba2dbc5d5e8b9e9d5be68c6f9bbf4f675e106707b5934b48a15b910f", - "457a404ecaf75e5c6b4ca90a55fb860095a140491a2a3599207cc95ab9e02514", - "98e0f70c78c5b8d8a166ff3c6fbc10626e47a05d9545659fad0afdd33667fcd0", - "97ca2b50a708cefb0a69ceeb1eccee691e54f24263dfaea3727a0e476655c8c4", - "d698a8f788e0f1b3c1d1248d1572bae5fd507854fdd4ceebcb797c6d7c01ca87", - "7c722a634764c3c471806b69446b7970aeb187eb9f061e8faac296c097eacbd5", - "d5d4395bd2f9d4947bd665bcddf068f3598c458021da71cb8af714973b120f42", - "14c867a09c06aaf84719de071a67bc3447ce4da6d0cfe48fab44bfc204793fc1", - "e65592767b5f7bc7b18c21398c20ef5f5f23633160768f2aabdbc693baf40db0", - "c73cce9e43584ea0ecff67fd03ba78e4c3c61a9cd12c1961fc57928f5894f71f", - "04a7700804d09327b4d7fb6ba2f97d53aa65a3be9d927a811fa7a7fc47e28f3d", - "cc82792e550a5df18efa11c5bfe83eb4035870fb3e093fc085bfdcc7cf25a6f0", - "1d36f6bae8d379258d1724cbf7b8e74828bfad3270bb14d97cbf77aad6f55d6d", - "75837ca48368db2a451dec1d46a0b240351deaa2c1baffa73d3f5c27709fba88", - "1878d379444baeb3af59189e8b9de868d878eac05b942c3707b2c1136c0bf201", - "97bec68fbe49e13d4bba4c2d148b06928ec32c0e529e06f41c6162500b3ed2ea", - "c8a06919998e3579c087ae2d41a2b675fb04a45eeb92c7ca89048da409a85dc1", - "b6d7a8c7ec41a9bc6e9f8b1e1101be001a13df71bd1d9e6afd72687e03b2f8b8", - "73866ff1791b514e19ddfe55bd38b19658eccabd97aa78c5eb682509d9b9bdcb", - "d7643a07517ae50ac4b694729522d3d0a3c2eb351ddd3a0757d2bb11605cb64e", - "c6b133b6c48cb854c25951836db944fa58c81065bbc641990555466e6d1c08b4", - "f74b76a5a5dc912c82daf9ace90b6af0648435ec2881a69ec273abcede3188d1", - "e685c55ea2ef85a12fbae31f13595df4cb308c667a0d5e2825f37833be644ce6", - "da82b8c1ea4305dae2b405427c55a6505ceb2c11ed2f7174c5f24e92ef952a3e", - "c521bf32efc37778d5007e92dacc2c50a9b5505f6af45fb9e3facfc97a1d984b", - "9a93ef6f74148e724257bc4d95863f52b4575d6f79eed080cbac45631ddbcda4", - "52c1fed863a7c200442604a36dab5b7198953b7be53ca08f0fd554060436ec58", - "e6946554f2bf6f127ff0a719988d6b1c9c9cf4ad32a7b40a9858d22673c01acb", - "93072d1e94e7321b029a5b082549b8b93947290c366b9c1f8d1347d03ffa5dbd", - "52a092cdfe1c5f6a53131205ee58710ad5ff73b6f3f9c85d556882e642a5b31f", - "5282bb5372b7cebcabf9300f2a6b02479da21828ec0ec2ddb408d450c23099ef", - "84e33ae9d43e884e5a4029a25d79df4a24dc79d4528ab47f76e23937c3c8cbed", - "f513dcca79b7b0777c7dc4a70c7fa927b188cf7afa24f8d80e67a10278ba396d", - "2be32934c7748cda792ffea43f4616647e22a0b06d7ae2b598affd733cc9fe6f", - "9b03d4b230209b024772d6ee870a4b931c11b5ce4d2a04ca5e151d8be73f408a", - "1518e17924fec5f5dc34bbe662d9a8c7bb2c312aca9577d704131187e0cd4798", - "5c1209c9838e96bb46d6390e0649f017a35ad51f7a06cefac735963d7c81ec7c", - "dd730fc2b3efbaba8db5a54ffdb21a34e6a83738446d7ce2199fc3008ec15748", - "2a539d19a940f9e697b4a4e1fb664dae0e54d1c9f3ab6af91969938c5b68b70a", - "1e3217d26adfcb74e0eec9fc61b8121c84b8f2d0af19511abb65a35571f126f9", - "8ecf5ff3fc4518d58027376cd868098ae7555fbde517bf8e4183a044da004c6e", - "a9ab71ee23d84c28e45bde97ba5dc71efe84edbe7a0bfa2fe9c43d5d224e75ce", - "92210ef9d4ca95a87bd43770a1b83c528101e5428670f6ac49cb918918b2e109", - "0cf9c364b28297c3ec3f4b168138fee00b688f4f3a48b432818451c736103593", - "ffed6164a775fcb2e0c8fcf523f9ae96781dc6e37dd8adba8be6885d12cb6805", - "7fd3fd53b1e3f42f7badd022b8b2acd6761de27c05eef43ad554d5d714fe489b", - "484d3d2ae7963cde49467c1cbbb8153ea11051cc5f24c297fa2e3567066fd849", - "790c3fee5db5e7bd31b7577d51cf8bdc8f2093081a80b383a1ddaef017aa271e", - "38f7223245aa2476d71db939422facd46bbc8693198575d509479681bbdb64b3", - "949aed2e4e863d1cbda0dee11c7dc5bb308fe7b23286e937601396d438b7956f", - "469a9577ce6e00cf309974f97dd93084892f36a8ce4f74494060c5573165f41f", - "02185daf5566c688d1bb89b55f0f7237ea12bec8eaf1703a44d104e2cd60ada1", - "4d0d6f0e89402788e2f83d455f6f3c6a3f44f6698b7d700e1e998f9038225dcb", - "08311895414878200d1ac59db9c3cea75cd8285af6238528dbe28769d4330fa5", - "5ed8d666ce7aabf96c1b0bb48bc545c84e3bc3bea767306643caec7dbd5107c0", - "3335c9a3785b2ce9fe0d0480a1df3f18dc3b15270296dd4a58e3773b172e1aa1", - "99f244d5ed17b5a5fe210a9f6c4327ae2503c21edda00fa3fb94b1318d6bceef", - "3771caff2f6d9a6eeb296e29fdfabd8d8dc51e66a183ee29ed0515f11262a258", - "89bddfe7026ce0bd132324025f590cd05fd5ae55cb04fadba01aff605d649c70", - "8b8a5659e1dc8104090c9c906ab5bb9853abe2e0023fa080556aa0e509d2a1c9", - "ecc855cf051a370fa37c4c7b97d86d80120e5895b47879ae8b35e9205828b9cf", - "d796c7611888a7ad1cd4a02d1742c6e5299a45666304c7975625b6d7312a9c99", - "2db47297a1fd28cdafda51cbef73950ffa7a93e2070b84d402553f26c4bb5704", - "0726814cc254ba75ccad40530da81844252efb3cae07ac9e596dea5eac0fccd8", - "62fa95e3b01e73715ac9ecd706df69df346c6df5872ffa1798bc14ac85620d0c", - "e0b25261beaefa6d00abd49a11bdf7801273ec61a7f79bbf7fd2dfda9934e4eb", - "5acb9b9fc4555ef48ce4e2c73d2341ee98238be6201b729c4185b48135fa9fd5", - "ab309d4a99824ac5ad18459be7b96bf57dbb8f396e322a1168261b3e6fd4e3fd", - "6e3853ee8251eed88f27e09f89fd30415626641dba125b4ece549046ecd67a50", - "3f4b172b9d8139dac98a0ad041b2b412b93be1d25f6fb83ed760d71e1394f217", - "f623f262b4d1bc3ba2caabf14bb74b3e7efa21708c5077e725c0b8afdfc30901", - "f6d6f1e01d09c8feb220902b388cea12264b36462222748832de3eb946a56bbf", - "ac74afd62028d90d990a943dbd06c4d5b9481fbf16c4b386808545b52e8f3b2c", - "b8e2d916fd47beac2210d4b78f8d22ca19dba8e13d0ae725e36dfe2e14ba3faf", - "8a7f1977e16f53f5ae5c731d47f8781b6ece470870f3b844c844890731c2ca7d", - "4fc2e7659f2afb0fc6c773acaba391ea8b8283f04b0db88ff69ca7144332f121", - "9b9b3a2b26c729478e86b1e2bc2a2d3cd3ce78603ce4a57ad26606d4036791d1", - "7c38fd31528983582b1047023dc96157b011a3f5f1b0b773edecddf33ff7d66a", - "fcbb44852fb921fc086c07fee779cd1cb8cc602f02805061d975a316ec88f85d", - "9e0d95c0bae437e6afc0d919435b3d1e7e4093cbe152f5a3b3a82f4cd6bc3f86", - "3ce3537687f549610799b005807081298fc4fac40e3d9f43c4bcd7abb2707470", - "a8087ce9d5f509127c0c4160d422d998442ea3bbc362d8d81cf019f74c50dd87", - "85945f25770952dcec27ed26848086e4f597b6193e486117e09cbd072ff7f1f7", - "4182b20490b299be3fa2fc576004ccb0f5a16404c0d28d46bbc076ced050aa55", - "051ca8c0b930b33b83d6005b1d084e3fe361710bfc894a65bf870db44338f8e0", - "93eb3b52754002cf09d0c100e782acf8bec5997e784b357f683ed855a71f343e", - "25e383fef78baab69c62ffb6765981f92ab901ecc584d9cbcfc6baf82b1dbaf9", - "c385c4046665fb75e7a1bf12c33934304a0cd501832d0ccb7ab5d000b15d5782", - "fb88060413db315a070b0ae4eacbe1489f39f22b10713d8b084f1592b9d108cf", - "c1479d783774759f9ccd2688005dacc6918dace9b1d92cda9c4f5ac243e8e13c", - "10b714969653d1769ee1db0f6310f7be434e808b70654f34678f6815d5c9001a", - "c554909fcbcff4c696ebd7d0a1ec56e5a29a31e4563d57b2f75177f956609ebb", - "022f83804b921c15176754ceb43c05f35176c51713804e946cf95bb3ba174ca9", - "63c445b33e8b1d32cfb8784a6c8c0dd790d31a3f3ac0b57478ad41ef8526f9d1", - "e02b7c6305ef7445f2d2999378e75453e2f3581969f6053baf7aee01e46ecf5b", - "267888d321efe09cacf38bac9af893418215ec0c9254942f66d55c4169ecdcd8", - "0b27403c94bd5e214b367f6a20d2b60bfb44bb0b72dd523278b5aaeead4cf317", - "21032e281b4447706adb2a23115ecafe8c2181e58195cccdaddba5c75223a04f", - "c63c70485c861fefea15810e84a545c987e6b14e08b54002a64ce3b3640998f1", - "1a7b796e357b1209bdb4a24cbe6eb9c9858942d31ed19bab3924bf22aac5538d", - "14627fc22e77b2c9b04123d7f740ca09e5115ad46b9b75a698fda4c779509306", - "c56c185a19b6af2a247d76e9f4a91bfea86282b071a0d7258859147a0da108ba", - "93281f7d33ab3c4ec7c57cb6527bdfaa90859ee6e0756482a6e051be27bcc04a", - "d06eaac1de6b606ab8058cfc488ebea043c32342d9aafbad17763daac7ca8c4a", - "787bdef76d92015daf1f53aadc9a509a50fd3fa5dfea9953bb68ea1d7f05dac4", - "ad6865199a2f8a7325a2e60ad0bb7a51584b8e16139739e770a90d413c93e4c5", - "d43d71526833932cd9ad205ed5a65b1e16e8f0d4093bd759c840f9516e7a4691", - "d8313bff157009268d2b7a7501339989df6fae144fc64e7fad2c4d842b966682", - "3acc1cc9c593bfd6b5614f5ca0473ae5faae90f87eb4e046d1f49d8428e6110b", - "7c102807a1551a67d3c50f787d454c5223c0b70f02bfe00eddb9c5a6beaca0bf", - "4aedc2850e72842932497170d3fb10088a7e786f9d71096abaca20d84c1f7fa7", - "8ccb6c8d374d775b34250c24eaa98c9577f013bd8a490ed0480904bce288b0f6", - "7871ded2b2baa8455a75cba1aaf4c962015cfea209040a21645042f097d74070", - "ae67c1887a4367e61da11a4a2e41e3c796d994cb434f675b79d9471a74af0125", - "54e79511fb2463dee27879e0b1f8706fc52893d5c4a4879a5d50bf1fdf09c4c2", - "6126cdbac14e980cc0203372ddf84c4441b4acf665e94b7d0d5c2d0725c57553", - "f9ead2a9b1758740668cb96617716da54663a0613e6b8b83a4c9387db1240af0", - "9416b45879782a8c125f6655b74ebaff5acf5de3a913a6e6b477feb5ce613e01", - "444fda7cbf885e1d3dc28de05fa2e56faa1c400f3aa03b75f3f9f4caa2cee136", - "d106f33dade28401572ec318c83f1d1f2b7b696d17e7745c3773b46743f78c24", - "144e9ba3381aa7174eb972a71288feb48b6bf3cf23d416c491a4f7c8b3e6f071", - "1ac047e6e94b8b3174e0edf04ae9f739c96ad656c75d1a30763edc9702779e00", - "9f9423087abb627442e795f0c726a79ed0e2e0b2acaef6d2c18d71fd54e0e7e7", - "f53c1d1a9133a7dcf61a12b547c3dbe68c1a3cd142e747d971df7672f5f05d71", - "b3b3d3bce8fc0f6a5c191a8fb787bc3ef76f315fcce83aafb6548b2e00807603", - "a7f0fcd8ebc492ef5fdbe6139c82b3a03adfed2290354275f53b79307e142883", - "e03931c786d21ad623077c7b73a550c1059d9191f31eea51d0e2c191cf23234a", - "0db7cdaa5c32bf49d6a56d1dcba3a2611820d523d5745711b05255b36cfef146", - "58dcd7f7b81f78efaab05bed365b25a91a1b5debb44a236a4ccb48405d0b8543", - "c6c6f43d50769d99ec9bfa63492ce99410af1dcc7c66dfe9573a214405d369dd", - "8e1efdeb688fcadd9bb990f30bf393bf3b04b318983ac2c2945c9a941e8fefaf", - "ecec3f3fc534c061305756f2ebb69299f74a8fd4f86771866c324f83406acc7f", - "9aba911e47080c73e1a0de10ddd8c493d4a9e2c07e62ed337bb45f81f6977360", - "06eb779de9b936a68ccf819fd9eed69870f52151349cee9817a9ab3f80d623f1", - "b6e68c798202265127458d53c04b98432a754aafe92f28eeb8122eb51588589f", - "f472e09f33a61d0bb873f7d2847e216a7c2936e14c8092e38b08508b4f96fd91", - "88bf7118a55ede94c2d4c3187dc324bdfc070be9a2ad158e86514407e1b18714", - "26d5fec451f0f0adda5e612b65bc13cb7adba790d90f73aeeaddb66bfd11085f", - "8535a2f094f42a890fd8c38726541cf714ca2fc4fa5d1da1c6b67523f07a8afc", - "ff7f530afc67f3fed14aa640acd9633c01bd25e1a2627c2aed099bd56d15f866", - "046917a887c463eb7b7641bfc90b732662c36839df4312df85c57a23bedf3b09", - "f3f59852bfeee25bf79b1c749439ae0a8cae2926a2321a53be54ee836f2e4a58", - "88abe952b2868c0996379149f8099cde39cf8a73c8057710edd0e1da99af0b6d", - "1e7c3efbc59ad07f71bb1b22762f4e9aa7e4b26660ed39ff19a65dd5d8e727b0", - "6965a96ae38aae31ff473d882bb59123eb8899c10db22ceb73c715485cc592b3", - "b4ec4524f93ccf95b0572139a7753b7565f957098d5bbf486d58f5ea09d9b41e", - "99a2d5045769a5d9e6d51fb1c5eb89a05bbc8ca8b9d66ff58619da6561cbb0b2", - "9be16866162582b91af755f5e45d538fa69f30b56c8de24f7f09e1033f81c507", - "2146b9c0e11edf7ce644dfdefd37fdda205166f0df221c338f7366be28f03669", - "d21c0cd6e1dbf92d937f1c9a752c11b4d0c4a3543ce9431e125a74cd6f3a1c79", - "285d85a08c6361cb51cdf4383dfde6758fd58c6e205936d63d2481dc9d4f6738", - "6ed14507f661503360070e3af81a4252673a649aa8f4eeab21d72b51c4ab4e02", - "ccca7a5817f49582fcc13f2168fcca8db45c3fd85384e511c900228f8b0173f2", - "03c206c0d799eae370ac6e15db05e701d3aa836de40b153afb3142855f49a303", - "efdf9501379091d113cf458c469918de32be4a95ad2aa737e3ebd9414fc18611", - "a6e27ade35376108281960b518a19278286691334bef0802a769d11f6cb57a9a", - "df3c8b35f744cbd1ec630557dc3501b55ecbcc64ba4a56e7bd24e359dd812745", - "6d6955b78a85bbf71036add207b3522ac655caa7fa4d4f47663221331bf10456", - "12f34f9b65618d07cca2754ff79aca0df4862866c09e77cf40f20e13e1fe5f0d", - "546d790a6fc991471a37a70a0d44d2e0a2743f592b63a09a83201314f1472bba", - "91c455864e3da11433a71d6785bd4ef8898caca7d23329f5005bb08f2637f9c3", - "b252271ad320c51ae413beb5116b838bbb1c9c88f8216732b4d698930b6cd519", - "231c8d78ce0bb89d62ae1c06ceab1da875761ce0846f793cd4f01caf0aba3572", - "2ebd8bd3862e826a31cceaf0c3e52c2e2388a7e5b8b272a4824db1fcd94c6c71", - "93eba8c1c34ff9e0cb2525ab4de2d2306935fc29100993ed0d87d4bf64033b61", - "34edf496ffa56bc7087da93e4d862cae90f00ef9ded74b8314e776c81e3c13cf", - "2776681ed546b1dc95b54bd6bb7ed017cc0814d1a4472c78726019f7ae2e52ba", - "6e5453ef5ded93c2bdab56e168fe350f3a8ff50f44b22f918f017e6bc7408f96", - "9e7bb8e24cf960b35c9352ef023bcc12d520ae26088714c93a9c84bf3cd892fc", - "07d87cb62ba16b6e6201af6bf9ad967d5c1888282e88e75ffa6927ca2011f2e5", - "534be0f0091b26fad63540a2b357cf1a5d7b5eb1d398de8b638cbf3dd99bbf62", - "1ef7cad47693889b5a7d76fd83bc8881b70dbefa038524302cf9be0caf141785", - "64ebe810552ed68e562cfd2af33118709ae4bb8eb0e9a68d8b621a399341c4be", - "61d3d9a68f61f59ae1f98e2e77d1769001608d25aca8700fc17ff17e3177a6f0", - "5bf807b5c622a2e87bc24bb09df48ae08984f7e296cd3c978bbccce978bd68a0", - "96339c1bb420d890f3648674175fbd23db3500f9d425067ede29f153f78792cc", - "3999dd9e29977d619142a5096301b888a5b58ba4b82df06e272c17111ed3555f", - "4e98495ad0af340d0123ea53f45291d5878c963c2cb296bbeef8d717510a104d", - "de152edeb21ac8676a644e5f53c5ee7e6c8e8b04d01752d552fb1002f7709ec3", - "91174129a941d38db16e7337424fa7c08fa9d07ed4af54eee84116c3eeef82ee", - "7d043f0af9f887b371c21e4e185f12ee3278a61a570f9b1bdb5a2563a9b796d2", - "ce69a4915f22ace388d443c131cd5baa327bd2df5ad01fda7e2b321a239d5c02", - "d355217aed54135e0123b7db5d2856e70590897a86d8efe57b578b23ec266da9", - "03886aec7ba84051ab048277ffab7590ce846f96e6b1e36a0e9f287e3fa682a2", - "57b41e5af8ae60b4a9c9e8f451bd5855d0cc43c761c6f374af9159dde98e52c3", - "2d99d6d90327ef29d3a319ada9eff5946644de2cae135f57e658d36a0a49defb", - "32be1d1f6730ae8e2ec64aedfb612b18dc0b83355907a0d21ca63f815523d7a1", - "a5b41facfb3d34c59411aa1354e003699baf84e822ba6ae5bec495ee5be19adb", - "389002f79f3680581a12be3158e26f46c6560bd66e7c57369123f3f49e7ce9ee", - "9cc1d3110b67cac2b039ef847bd500fbef373f200b7444356f4f37729f38ac5f", - "ec76b0cbc9c18ff5ce1d2bf87fa87da82421f752cc894f19b1dd9dabefb5a44f", - "59febe60b47cf76f4bed113134c360877dfa20f9e5a5497d6000de8adf0fb611", - "a0d5ce035f32dc7beb23483a5aadd710cd54eab8527fca9d1c1f6d43ce4dfb0a", - "fafd5b96265487a98fb2191d9373ee1c7f758905f1c3dcd0ed1c27c6c3caf6e2", - "b8641c480d995f43e54bf6ef210732e3d7a75bce4fb6f8c10f08e1ede08f88ad", - "1dab9ad7093d93a0ccf6bca959f925ca09bb2728dbd8adffc0db68711487765b", - "3ee3a41f20097e787198f2f568ca3fd72190e40f66657eea32ce4d3d0f709bb3", - "591834bef3d9cd0a8206b6470d32d89f16574f1aece6f1c39df7b2a62d1c727b", - "37a20258be5509dd821cdf844a1a222801eeaa4972e92d26f6b42f8ac750cbb7", - "9911441221971ef6ff91b805c0136a0eaa7a7b81ad6a4d11e23660df48318018", - "fbdc65f2054d615341026698e23f095da8b6af2ba9f2be8881bf3dc641584e62", - "10c736d6598987728e88788a8e134df5ccae3f45ff8e4c2cc90b5840bcf1bfdf", - "1b3f80f75a735dbc945eea4ac0efcde8c775fe9ab499720b3d0a190227cf3be5", - "6ab4ff6637811f3cac1134aef4c2711581c06773c2130be85102066907d69198", - "f1f87ae625477c7a3a1ac0f93ba56d301a6cac50b209808be6e7b2009be6257b", - "57ebc4b5a69951e825629462376c2aa29e88abac41fe844f2b6402d7d2200ed0", - "626fc6f7a418f732a7823f6c948ccc887ca6f1d7e62400308c01cafbd666d38e", - "edb695816514bda659fe7e18a4f83abddbfba314ded3d0c6b380aaf7615ba546", - "805e9205bd4c7ee14aadeac131550cba0d676ccc08b0a1f587530cfb4b291604", - "81f4d26df3d6a7e4aa2c5b0341c4057fa6085df1afb5cf71fc7d2a1c776c23f9", - "f6e7381c6996531502a60c222184d98ac9fb68d340be320638e2404d615883c4", - "492776ab71aa98e9ddfbf0113b43ac91bb273aa242c302613ac98a16304bdbfa", - "b2f191078e01661e01ee09cef83e81268b20cf0da86ca4715055c38f8e327355", - "f039c7465a5ea1a30fb2635cb487d3bacb6ce8d00a4133c4cc6c42dfadc9786c", - "c3efcd836a802a14d8e4e3b03feb97d53978f1090e311eae327e26e6775c3c11", - "c5c3e0f3583e14c8623e439149d52a6fd242c5578322df823b07fa7119bf2aa7", - "3918ca1feb51174fb9c934cc67e2830b14fd136b493cf31579233b9a0546c2e5", - "feeaae653172a6d06cdd57a0dc3be9ef549cf23cbcdad145af8bc5f00eb3140a", - "0b98b6a0c1f7735cad807bd9bc7c867a2cf7cc3b679de66b1b49e83e3382e01f", - "415099e89443f06dbe3063155b861b07d79d3cfe7b7a4b429248344587254f24", - "51317e79b21754d65b6e65f9767f5f4a5ad1c0874a20361b374519acffcfb8de", - "1fa2940b3c529c11f03660d88beb3ff53250b431e60a82cf6b0ac88823cdfd4f", - "08432b40f8c188c67479cf3dac451839e58847fd59d429eebedc1b585404936d", - "d2101860b6cd04c84bfcec1ccfad42349638ebd2d187f51ecbd713afcbc2b504", - "03b89352ddcd996368b0208d7582e3927d7ff06ec10dc996f81b31e904cffbfd", - "365d352d26fb9558aa8095dbb2a97dddb848ff71ed9a1eb594db2fac0d6134b5", - "d1659494f88f8abcaad3464b35b97ecfaf05c15f5b683457501f2793961d0389", - "936a973a2cd85af2abb82a562d29f8a91a78f85075c122150e88afb009b41017", - "5285d75f9edd287ccd89b5e4b16b3ead540b67d4604612a6439e12162d6cfa24", - "33b91335d00712ac424c7e4915200c1896400a81d7e9dab91eb3e8c237e6d2ec", - "c92f18f2ca2fd2cee9a9f97654e47a138a7e7fbdc16b81e41e4bd3dbe6582070", - "9f753cb545a2d19cf32dde43b890553b18b01437d12a37eeeec8542b7a507ea6", - "5b6b1f3a40aae2bfd7bd229b60c9725d440f8a4a19d78b00738db3e1a7b6c8be", - "a58610d8ae6fb545cbf602964666763682d62da6cc06441055525f279e3c0756", - "70e9c6551950128b198fbf7fea2e5ec34c9652886c861d7ecd7efdcc7766321f", - "837999004cd9fb8a7d5637e429625e73abb98e6b1ecf06941121f489e94f2e4b", - "4d0d8feaf9b1076c08ca7e60d38d2dfa1426afd33b846d42196e462c822ef440", - "f92b794b289be2aa2b668dc8c7e5e8b8c35a5f5f780c64a1046a1a15fe75aae2", - "9f7d88773ea4c37f58881c6cc6243b8513c57c5e7297573df5e1bdfec87055c7", - "b32e0a93093e570fd97cd381d619aa9049b812834dccef3c9a4cfe15826d14c1", - "f453a0d67c94666f58952a7c1251d64446dd7d73c8fddad0e1915970631b2ccc", - "7e84f614d398879741771152a432b7792843f673e4f12457080e268497aa3a11", - "29bb653f88d9ec49d118b5144a616974c502c156bb224a825c54a43b83aca698", - "864b347a34b6feb28f967618ff153bca404809851fe56f3893b1db881b7be4ae", - "c0c7cab7d47f0e400da17591b45488d6a14f9d9b7aff051eb598a4dd7ea51856", - "f5d2dfdfad9c150e58b9a89fd7b280c929021871f113c96d33ecb0328514f164", - "cae38c3ba31e29bf49d3dd153687f3e884ccf23eaf78e4038abc8f0e98d14f39", - "5f8d8b180bd66c5cb81297814c52d565abfcff1afaa31c08272908da521794a1", - "3d9371bc6c806e97fc2e413188372b4bf9e0de2665a66e51242760e4aae94e79", - "beb6754474856f82823eeaff5ae0f0ddcda4738ad8065e87c4b6b94e8ba75dbd", - "70f9f88c511ddc807910f2f06a5fb279d34693dc60770ef702190f8e8335c4e0", - "1a9ac96d8102884b766996ed09b3bdcafe08f5afbf7109756197fba1cc4d9788", - "e3b26681255636d1a3ec480b733f5d3627ac7528adddac0a4cc875f5bab10edc", - "6973823d48cb326853d42190bb53f319fe132ef0d39e37253bf379ba91b5cfbc", - "101a0856e88db34ff2d8df2aa67e6fea842403e4049f7a45912ecda179c23380", - "5893aa79cf226a00642a1a43b8ba8cf11c590aa8c0ee77b2c3d8967277d40bc3", - "c271d0c583e60bb76f392f872d1132382e1038264f816e3742537f2299c89096", - "05e9ce86f39ae339b30f43982e1cc340c49aa9dcf6985447b7963e539869fd21", - "f0f39452d5c786b2465a604f18fd7a4ad0cb0c2738271f1948bd8361ca7a0acb", - "5bb351dbee6024d49adbb8d983e9427ea0f71d002a89782fa27f44a228e42792", - "9005a0eb9c25666b1b0bdd0deb5c1c87666f10b43ac0eb13422d46349d4e5859", - "e7feb6d77ebf2d8e3a75cfe485bdb66b55ceb77513f0c1d00364066ff6f2fda7", - "f823d2d006214c223090b3ae4614ceedf539d1184972a406d69f63cc908b6aab", - "972fcbe13aaa420a5db5befbdf86f8a45fb6544ea59638e5a29512ab46e912f9", - "b7a5eea4289dc5ad9ddfcaf29ed80db3b427f9e920703cb4ac34f906fbd43019", - "f70516f37e7d16b1cbc1ec6eb495b4713cc4c4ef8048e26b04d46377ddec4217", - "eb1b37f147748453e20a760606425878468ddb304c658ec4987cabec90d8d62d", - "53daa2bf0ab49f5491e9791f764354b1a9af21f41e499cf9d7b50582f9ea1874", - "69701f89b4e882771f6fa4473fe06c50201515cd3b33b2d5c5e8465a04833e89", - "5b965e18989e10f76dd23633d6d1dc84362eeec6441055009e844f35d7a128d4", - "a0cfac6ff5e8569d068435b37bd1dc059021239f8b353fd3dbf8d24383378429", - "5652d2351aab3901a488f381227a4dbcad9d318ef1b6e101e799dba6049707a8", - "85414a19b76e6c54f41b8be15d4829fcd99575a6b78c81024a3ad906d9162af0", - "a7f8a6191423fbbcfa8e3c4387f767f52aa5c2d4366f27e4636ea234f0c7f95d", - "1fca288d95d2e4ed808d0b0bd98dd4fa3497936822b520ac5d797b64dbb7963a", - "26e7764e23fdfd19d497c8eac72f34f7b4c032774e8e9a2b2d8e6ecffb42c665", - "c15c1c7dcfd8a9d79a7408678b0051e592948e69ed7a8fdbf3aed9ec2c6d880c", - "ee90bd19cafc38b4e30c1f155e6d15d90e4e77c8cef76dae939c7d5ab8d4dc0c", - "49ac64668b4870d79a82de5bdbe63d23454ebf5c5a6c8ecb3c6969f847c5e764", - "06ea56523ea88bc6cd1b9057eee205bb8100f9e6e5e66f36d544d4cf5a2d2f8d", - "09066241a908579bb3899f13d2f00d134a2db985b8fcb9242499e54530b8bd86", - "2cf7c176954cb0fefc2dfcfc6db36e2d752300a90374f43048ba8448b15d9d1e", - "ffaebf10571547415ebd5d0ba3daa2f2a3e0d75cfae7c65d52be18ddfbc4388e", - "9928fc375eedec38c6867585c34f68984b2bf3ce1450848fe39097c5053dba64", - "8525fde654827a01ce3f20c32b163c3b3d58aca2962ad74bc2611d7e4b2675f2", - "c3898bac53e1df4cb01f5f9a872d225bfea7b9bb735683a38f754f3a9ab83772", - "8611b487a9030acbaf08a75668bc3d2dc3cc63ecc27a1e871117f41722af5120", - "0ba8727db6bf9206892f047b48a7f9750d19f2ed01e3855703dcf65bc45b9b29", - "489f3906211bad00e63edb5e659b2e6b7c96b0eab14a65c49d09c20f9f40b15e", - "51e7bc48a8d81cdb02ecd90af2e3f5b0bd55175ffe5a025d8eebcdc5d55c6e3c", - "39d72a3c9416c26c295f8315dec9f9944d8e7c5f396ba4270c7048d24aa22c5f", - "d180c8ade38ec7043f2fa44296a8de1de2b45d8d684762698244364679a1427e", - "d2e9a4cd04cc4ad105804742838989365d66d0320d1c3c35cdf4bbef755e6836", - "b458a61816210ec828e2bf6fc7fd60f795667a28f0719135da54a4fe99859e7e", - "57dc96c9243b4fd9b62fe7a2af267589579c9ba333d2ec0fd8688f15d3090f5d", - "d48c3a8681cab0d6655d445bf342b641237d529b6d6671451d76b49c3861d69e", - "63985f8235eb11c89d9bf83544cd8fb28e36022f6881ecef35c24154a8ec6daf", - "d825ed31b79fb360f65aeaa2aad574045768928f33622e36d0a4b40023858f5c", - "75c17b24da3539febfc320a3a34ae260c1e235e61d58eccead0eeb2a70647d25", - "536061cac3581d9c299f8ef10f27bcca670772c407a183bd7cba55a564ac8fc6", - "a5a49b592e34649a35bda918a1c7c6cb7e601a0151cdfb0f5c699cc43cb90c77", - "b84a0edc62687a1b78a4f9fde62155e17844a12a86c02913175b7f1cbb52893e", - "25442f97f9f9b4ded9508cd87580a32259cef73238de74a0c25e63a780254c47", - "2fb1a031b2a3586bd1ae8233307884061ff12c74ac94bb90e133413e8a805ae8", - "0a7a482a7fe6117eaf9738744743b80c749b0f3f2257e59641d89ad05eb17f3a", - "522399b2ecba71fd1e8873f3800d19bf6bba9b4dedcec28cccbe4c41936fd6e2", - "df5eb9e82d95d46c1058c1f8183ae28ba20b2f7de8425900dca531fcf7418002", - "28281fcd13680f82cd402524cebd391a8d5cade850c1547b3f2cab3fc9a7e541", - "c753d3d217008b73688d152a515bc1f38bb9ae6dd7855b9683163c1596d090c0", - "0dd7015f866d4da14a331769af43a7c02dc93ff4379e1920a4dc4252d3ede56e", - "8241b16825412d5f94e4bfbf4a9a3aa47ed4f541461ae1f88c885f81a77b6454", - "77d284a6016b09920dd46ac6c6e812f37386800eddc39ba6807826d00c25d573", - "ec82221714b7a492d7f4623fc44e25dfcf185ce065006b608711d2d6fb3ff022", - "72c0b2db92fc1fa60d49f58b15aefb6b75c16a876c706d69da0c032b3402b5f3", - "78bb0c9b2482c4f29c443a0b320d3bbcf9785999e2b729e919da4696bc410a75", - "0cd261effaf7a90ac925b7cf968618197b6c8d454ff985836cbdb6700895ce12", - "fa30c7e0eeebd5e1552968424b51536998aa49ee02248485bbd6b72ad03fcfb6", - "1aa96bdb2e678175838a8a673cf426bfa8433f60b2ae526a67ad4b12f426e8f1", - "2abdf63b5847a917a41ef00515c3d82eced3cd31b45029fb169c3547a46e1c82", - "90e40b150859e771baf53ea2e17f01d7213572a662e747015a84797947233632", - "235a7f1b424e55a4fd55467e5d3be0c57fe52ada416f78c65d417b644f948ae1", - "8f91d5c511822d787a1702bcbe9bd494091e84c19342d089a22c1c798ae5c5d2", - "762a11a3a5a2d27c8d7e799bf83a29be9676c08c9613c7de2641201a245ade3a", - "65bfe6bbac2c757f27cb2cd62fdce8a7efa80ac2fd231ee97b5c5e4d55510a4f", - "bfc8da32ba6bc4d643cce2d50024ea4a65e79e9654e70d2865fb3eb7c520e585", - "ab499943a06f0422ccfe7699ceb538a092112c10908deacc709c7727804eabf4", - "323033165658eb6e1ae0a7053ac36d4d2e0269aae0a65d790914555ca8b5498d", - "25dea5ae2dcb052b4a272d2e9f2f2d83260c191d30b0ab2a4cd079d0e44b469c", - "cdb48a2e777f2d49b09835c97ef3f804763bbef9599817b09bb7f9e6c0dae78d", - "3ebb8138c90f12c2c8be77790f0793029a73a4a763b6b628bcf015380e0bd09e", - "73472e20dfd2af22925ee3621d9a20477881edd54f10ad2cf6959dbf25cb31b6", - "01adc8c52016f2c7f73c4f23c1eab9d67ba9f014a67d90783ccd22e2b27c63f8", - "364e27d1627825d8e0a5980b63b95fcf1550c54ce1ce3b535864f9d6b01c6544", - "71e8a3ec82319f64ae9b192700a41392e39d2f307f244043b8d1fb0fc53f52d0", - "fdf77d60d52a50bc7c48363563d2eec8137c927c7c1cef167a362ceeda761afc", - "da164664a812589d668ce10a331134b835956c3bdb2327bc590c683cec97ec5c", - "5de985e7c20df9a5028b83d989c966b28de7ce7aa25a7a506b41d213e96f1f8d", - "5d55d9ad8ba65b7af8d7d86ae3f76b5ee81a9e601872b53e168b00f4cbc09ecc", - "0f6d39a1185d01fa16a1470468922d0f251bd9830501b254e9123b8e869d5c3b", - "772438597c661f28522bdf0f784ff2ff668a11e960ea45a85f77a255b4d70c65", - "ebb268ed971256841355398153e64e2ed6b97e0f619a814bddb302410e3c364b", - "eec92cb5f8ede7d9ffdd380344ca7c031b63aa3d046b1f86c6b10345f846449e", - "f020729c02be95d0d2934a6edc47ff85fee1ef50559c4d0794396f9a9dfb2cc0", - "4baadfff89542ca4e6cb8cbe68c772b2f680d0c1f230d692133cd28d124cc365", - "292243e5298badc493830176fc35157ab9c3ead6b971c18f5863d74d40f839b2", - "9c0ff9a55dfbb133ef3765d727c8ba7bb37792cc50f8863fd3d3019efd9c0ee4", - "54529d9f1cd9f5427912f8ff8a09c33860a2295ad0a52ae2cc8b90e66f83d36e", - "4b860bf27c18bfe413036ecaf952de99d46b9432a5c20e62c63b6e4cf9f66ba8", - "1e9c9d42c7d95d2256629d68a4e833967292e3578f0d35384e1ae4d6d4469844", - "6e831a2da6acdb5475d5e173bdd025e5c19c02a000b343104fb826b6be82d9be", - "3634f10fe22d3b5c6fbb94d55fb5903fb82673c07c1f6a66955b4e3a0f3a2447", - "522ec294cab90d913eedaca5fc956d1682fd52ba37dffb9a23881221b2642722", - "f36fa7a2389a2b309ee9ce17e66f4372bf4c4060e0e094706f8a1e368a8d11b3", - "adb9a4cc4c1e49502c864c21a93c10c2745f4fd23558bc1ee1ec820bea806f0f", - "2f5511d0fed33ae862ba30aad1397f2a73a9a7e0837a50cf71b3e17b60d7d4bb", - "cb21be23b662e284a321b7cba51956b99fc0ba198ee04ec89e6be306daac07ce", - "b601d29ad1f4a5cdae6246666e782897dc27bb9a8f22bc5733fb48c7960b34ec", - "daf6b9f3be4b07853b5eefbfdb4af61aafa173aff6c981649d468bf52edc4632", - "d5109c2c4c24e747cb7188b72b3300d38c6f6cb6c73a05461f04e3157f9f9f52", - "5c645411db2ecdc38572c40c880e3a89e7556778e9d8ce8a472fe46e37cbbe7d", - "eedeb0efbe00d653d535d34091e1dcc95220b706d7ba56a391332dbc722b1e13", - "aecd312c0d31c64d16f71207386e9ae0ca159f7e0b8c8e07aded69a46489d75a", - "bd3398e718888e1c647bcc89e4bb4348204613d0f0db1aa550d5ec7a7f3ab24f", - "81f7fff4d0a5f363e317881b68980767e869b299d6d51357fe3866335f2d5a22", - "eca9696b140ba741de83d30f38bf2e4108a810cdf63e944996080e42e9f19d1a", - "3d980da8752252c2f25ed7270b3928b594a9f5151d5fecf0c2ad1137d0950d87", - "e57568c5fb2bc44a9605a7c8190c9667d8014109180b1807e8e6a8a53d6660da", - "280ead1355a53108b2d5e594f926ad7047339417ae8e2e3b2d7927fcf0d48d61", - "3abf5eb4a5cabc0de0b58ba62a9e9bad84ccc8583735a40f0d65040308dfb057", - "1025add14ac773aeec86994b8481314645db7bbc7d0113d1d0df1391347681a2", - "1bb616c97c0debddb9da59c92510121d961ca1a8909e69ca1fb987ddaf2a2265", - "5c2e884c9aee12f6ec57cd52ca42881482931a0cfa68c327f7536f7f8d10a096", - "097fa49ace37434a4d2ac9f47620179e3fa4f0e1de19db31d0753c7b0adc05a2", - "2d27a722656a58281af8b989d857109cb11762824ff04494704838113878ca50", - "a8685e1bc49092381d9390fbe0ac494fe237f926636d099d72fe7cda415087f5", - "7f15d5aaad83778f0a5402eba84b024f958109191907cd953b4a49e4a05e398a", - "b19980f285fdb25012db6bfa85ddc60d20d702b260b8702c29ecb8fc23dea3b4", - "9d21e7da1a432bfa8f9e2beb407c02878b0e8a8bfa39ef0f632581c8bc711e59", - "587f4ace549d10b5f1514ff66d3f232333feeccaac86984f0725a7b1cdd1ce5b", - "612aa5700182f64b62f47b03ab4d9012119c843714ab0e7e0772a9ee4ce735c6", - "c0d508131c13c6687c3ddb17c74f5c0abae4099e669ef2dc18cf9984df5cce34", - "2ff1fce43f50f5676fe7e8f8bc0c5c5824c87450f98cb9d22965773578d05d17", - "a3adfa5b2658a3573820f850665ed98761ef6bbc8f3a6d63b08d952decb9622b", - "678a7d80707f63cbb03eb3e0fabdc5f2b5d7f186619a4e95427f1b96e904c263", - "a33afc684ed1ac25b4095dd007401eb6cd5db4b77d6da0e8466608a4c71202d1", - "8e009d0b76d3db01e13333d9df3b669bab57e31ecbf3ef54860716487a6f8082", - "57d4244fb1ec81686754008144f75a850c7b961a00725c7139688a02cf9b07e3", - "05ae835f15f4eae8deaaea622fa4cc3778a013f02800050dd31345ae2f01f4bb", - "2e395e62ae975a9ecb72f68b0cf47443b4bb6132bb05569f3d66492998995084", - "75ff254e0b90468349bf11df567198fab0ca1efcf2f3bd53e477a7a367b35d72", - "6a27216d1e29dbebe14c4266d7c1ca53ea608e600134ae5e3b6fefb9a8e1ecfb", - "55a5cc6114dd22e4aa250ee5ad1a0f1ec56df12d3d04a8d3de3c17426a795247", - "96b6f523edfb9b3b613d89107a03af85e3d5f0d7dd8ec1b35619151ec354cdd0", - "11c1b7796a8bc662582dc6441fb567c1572fa72a25fc99613a5b43aaa040bcfa", - "d62ecefef75f2004a55fe77decc68cff5b12f78d8fa4cd3ac29ce1b1c348a667", - "79b5ee7bb01b8e6d8a12f82f6f9e21b43502752712b0fd7af8e1155e2f78ca28", - "ac3b82f5d3388446fbe0b4081ff7a4b53407f42ff15668f57677ed2aa793f219", - "8d893b0aa2d83d6c6a77c365bfa15fbed0cd3bbe7695c0fb1380dd1b0f64a996", - "0c47c6456b03f680031721f4571aab967249767a628251af54cc2fd4e9c1e0e8", - "cbe5b48e6fb2377607e5256a98d221add9fa33397a412e32bec317415ad44f3e", - "dc9c426e833a5f558aaf221e0e324309a04efe5de2c62d5c0e1bd674af191835", - "1e8399ac60e26f1c3b370683ad67f915acbc85ed44bfa28dd3ebde88bf4b8dd5", - "60c77c572d2b22c4ba287894ed1ed4c5a0c8a3b98f07d0c4199a0248d57ead54", - "e7f954c951c8052276a0b2aebb92ca76d19c5632d935b66d1a050f58f8ec01bf", - "96c151659ef02b7cf1cc0ba9b5e54e0c30121508fb3c05567a9f96422c91ba66", - "2eb2df34d9f7342070800acc47850be872bffbc29622d2d222196732d1cfd4a0", - "f6f229f9672f8add01fc7ced3bb154350ae0dbd647b5511543d38b9c2184710c", - "bcc26367871cd533e4d0b045855e419f3f660f3116515b93eb65333c535ff594", - "5f83f23d71763933273f73f4eecc579b6653cfd27472384c830d21c8a883d3c0", - "14dbb3a1d250bb06c2e51f014ce18efc8d7c51b5124a8598f37b57f4808e1e1f", - "7404ad1ac4fe8650490accdf5de9088d0e06332e4391d216fc2fc052923403b6", - "1756f01a224b1da5f6e6eac2133435dd8c8d5a45533f577fffd7e84376274112", - "c06b5f29f76c75aa4253ebecb9b52a7167d500da20bcd230317efdaf19fd7c61", - "84f14c3b73a8d387a6b5aa793eadd1b55437eb561a5da68faf3281460eec10dd", - "2bd4369ecb64034d184b8c9897c412292a2e33a5e146fd78b2fa983d87ad4f47", - "49ef22a9b131adb5faad39d1af463dd0f9ea137daec1ba69a85c1664ea30a30f", - "85d028467202960803c8946f9c2545388f6a64cd001e03922083e080c295ea9b", - "3c19b7e6d82afe9e370c6bae9a600ef8c60122df6f7a2e7d4e191b2478f54af6", - "48e331726c3d5207d1e80700f417abfdadb77b60f84e8e17eca839c31d639765", - "69529c466839919e6e11de3bc5806b4a0f401cdc484dfee9ed74d3067f3845ae", - "a705d91a9c72bd471731f41d10a9fd48cc7aded67ecd9f7f636052a54f4dc4f8", - "a7aff114f9be47b787db19767741af5b9fb6f7990aa0f6f528b474ee5b3eee60", - "011a40a344c15481ac056acbdd2bbf4057a7aecb03b0fbcc723a63a7bc429524", - "58adf5b822f1849e32c426f99f7fef845e0d818a014232e2cca63210a8b595bc", - "ace967d540ed03ef4bdb1e23003d2dd514669cf5828f180bc57c7d5c2fff8000", - "40e2dd78c0a78e3206bd93b8aa91f7d8ac4b3445c79dc43802afa925b08c85b2", - "4c6634bd599278690751cc44754f8f3f0123bd0a94d69e150e2ff05422adbcc7", - "1ce2d9a56574bd3827998231315ee48e459dfc9306a0b5b32e0a4f8fc5f6c610", - "d5e1e28498c8cd4e958539431c67fdaa2e313454f5f21788b70baef79e4b3768", - "28281585ee740c32c56e4bdd0b6864e235db242d5ac2e141a1cc767248fdda5f", - "c92878adfbb364805ae2a7b3f94f77abefd4e5e007c3b80a07d94d80bee0259f", - "a8dab495acc80eddfa1b20c2a44ce6aa1aa85a1f584387b0dbaac4647394a8eb", - "34e418e0e4723ffde126526db07f992eca29894d1ebf5a939b7eb27c1a4a29b9", - "d4abc413f8c4f87130bb6551a569a2e893e05f6576b6c619e06371a6b800bd36", - "a59305d99d342a1932acf9340e90ae664b1b3d329f4bc0737c4b546400e28e81", - "c1080a1f919fa049746f13f888f73528f0902db486d665bac862b1115b76a1b1", - "2fd0916887efdf0aca550d625c6a8f15a32cfe804aa3333953d83cdcc5b603e1", - "e7bef2aa1c20c9157d47a3da513b4391b49c7bd4de9f0665ac2b556c425b3fff", - "630f2643af68ba15c260d17ad6c46d50033a76165e9d8f61a1c4a250cff6e8d9", - "b409de62804b8ab873abc88ff396cfdae0b724d0943f2bb5a6b08bae6e74d10b", - "cd00dcf63436b04f1fa4463164896d3855949f2ea630f20be07ab2c50cf40d3b", - "5163f843c44fcb3640698d8a306d57d78d19e107f14cc4f60605d42486f23e8b", - "d3dcb78794899fda4559b2fc60dbe867e973cea20f5e369758d78aacca70cfaf", - "c78863032acc90a2ce559f29beb0765212628004fc093ef102ee5f3ed76eb094", - "11534ff21a85124bd34bd000cb65466f0aef9c7651607ef6285318399b52b6de", - "c052497152b95d11ebce056bb1fe22d7f1ab564fccc2b68f61c3ba327223baec", - "222a8df3626128b9b3461c499fbed044424293655e8ec6a5de17c573a7d98d01", - "55c9327118408a001075e1aa071ee7c6162ed8a78aa3da78e54a1039da39ca96", - "5497253fd8beaf71ff4f448fda9b801642e8c95241872d3898996561e811dc98", - "b2eae78f45a57bd540634b2cae5dd342c8c729f1155d89aaab680770bd187efd", - "076a31fd017661fce32e4a3a17ee15137c3c8fa1566c49b7c465c8370861935b", - "21a6d9f5109d6b3b0029d0a2f596aaff76a9175a6e0de05bf31c8045d039a61e", - "f141024d56c17180913643fdb26cfb5ad126f07bbf85b904c81e6e3174380835", - "d93e261bdc6d47e428476451cdfce6efe7ea01ae85bb235c54279f8cbc62338d", - "36b4eba3da25e58a7d9b92e4c49562a5be28ae96f09354a53e53ae09add89970", - "e2cad61b33cea408ef82af252fc2252c2f0a766eac5019afd8bfe63633b40737", - "e0906016db69d5b1ca762330ed3e6a8231d84ed5a06027e7cb384b63786e64d4", - "42ab775b69a62f5764f1f3197bd3c352dd1ee7961350e73efddcaf11c117b3aa", - "58e83633772a4f7ec199afac68aade85b756ad8a67f19178fa25fe48fc2d838e", - "39771a11d61861ec83712f88b241afdb475860d2f6f7fd4fbefb06ec885a0bb0", - "1598216304f8e354a6618a645e47109c2257d853eb893e350158b187aff503c8", - "901699c9fa6ae84ad5e7674393a1a5974264b79229a89307de85a3cb5c1d4f6a", - "b59000261c47fea3180d8860a15d88a7233ca76d62bd2c38bc6511b01032773e", - "4516f9602418a1fefc64b8038479a8c69ba503b306961f27e87efdc52f28fc21", - "d39c5ac5f2355bd22babb534216a4aadbb87652074fe2bd00ec63b5a97bef552", - "9260fc253843390647d26c574d6a817bacc5e6c18f915aa60b34c8b233bb7d66", - "a89198d62aa70ce0f4a59f0fccbc6c0456c8ca121964d0738c526649b525aa7c", - "7989c4cdf11bae70c2ab3d99e5fac0e8a20cc621742a142e8fabc7c8acebfcf0", - "7cc87883b679cb8c6b1a706a501aeacd98f79785e270da6699ce10d056cf0cc9", - "46a540b017cf55c22b70470f16a2f6786e605e582d066f22040f4064bd7ff5ac", - "ecfa90ca88d59519b0edd0484366171ebec572cee88928b222393bfeb5dbad19", - "ad0b73f875a1e12902163d8df7d3c5ffa8c38877edcaf6d748a30fa4f16dc310", - "1c786490df9509b0a56476f567d1b766c8625be9968a984a935fb1ba8d467996", - "2fd80e675e6e76b2b75f280044a397bb308b620c69903ad944c6c80d11a1abc2", - "535cf91d4302de1d598eaebc08f74cfea351ecdc6bd8a10dcf9361cd2e7372b7", - "9225649d710f945ca91399da53306da784c9f83becb45748c08ac5e03f7ad433", - "4988c1075ade8bd75c7308e175886555d02187b764ee0816225545ba6d7c1694", - "7a7ad454036c7970b0bea46ca4cd0cccdd07128ee34beadff30930dcc796c7be", - "43e72e0e43ce16d8ce67631309db040ae13c5f9747eac9a574544aa45dda2ab0", - "1ac30aa497a9818e2902369f2fb4c1b806ae7a09d86896f532ab7ac3c4bca294", - "5288001c8e0f0e822b5ef52e673f820db531f257fc66e7573a6462b10e01361a", - "05f7943b103cb34a2a18de131b015c2c686d5a8c8c00657577a756225cfd6f7b", - "b1a7d2bad75cffb6da162f730ce56fc23adcdbf1afffb25c2ab6459cbe37a0a2", - "bbf823ca96996f1288365d95ed21fa4e6006ba3453f24b06cce198ceca7f4e4e", - "88d28b673daa9edccaea56b9c616d8cbb03962185304111db05a2c25ae16e45c", - "9c92cb529efe670039c5e3f314b60fbda1c5b9badeb8f6412c5c9e1ed857d11c", - "4cb0d6aff47ed2eac4081a6c040d6c909ddf3308216636cea2f31cf50de4233c", - "1753f8a35a80df9bc16e31c8c32e5276feca3144da9cd66a71e4f3d6645323d4", - "c67814374064e9e81e9a3d16c28856ad0704c603a770f6d9d221ba712d65ddf8", - "d750ea55971ac3ef8dcdd5745fb54c5432bd74e06ea298af1f56791f8f884605", - "8ea6f92eb65be48d4a3bde35bb1d4ce6b5ab858ea0d3e674a2b92ca264c04cd8", - "1c8e828c7edb67eac83c6e84e6e5da9f6c70877045a1efb96438bc960dd1dfe7", - "035d3e132bda1c33f35be707919ff52a234cb30a498ed90585f2a78f276997a7", - "a3cfee666ae0ce11edf8ee120182c3b17d97a13faebb9f74d857ed1b443246af", - "ca25db284dfc13196e54ebd3cc0ce2c6b50122d1f20e7621e94e9862d99faf35", - "ae46dd3a31e038326071324879c8f79f8f41cd3490362466910f22a75c1f6bd4", - "42b1ebbfd469c58537338c496804f9ec0a59eefd302c69844b8f70425121ad82", - "9db315279e01c29ae31bdde6b73f94a8f3529d35686d0e705849bc61058c297e", - "cd45e154c45681b746e135ff883ce19130ab1aa1e909b5d87ad1e3557eacc963", - "c401a2f59bc83f8011f0d4e3b092e2502f916de3eb6d9cd76fbba19ab5f2ed7d", - "7352eaddd07e5c65943a019d05ef52ca0f0476862df82955107e2b6c8f61d9ab", - "5f307cce8ffa45a6113efa7dff2fb3873282224154e59a1a469a58a2fb8b442b", - "bde416cc929fc0fdfaf0775a162ac41975e0540087283000dd23353f9a3dddae", - "7fe868a568db2861fd9ab6aa1f0f49c48abf2ad38366137fafe7f0376c392a5b", - "29824fac4f71b49e23d23718eda9b9e6fd33ce89408acfbec899718051f36811", - "109e4e4e0ab355e2e217a181c34022c8f25e16bca38f8ae4e38153c62c9fa637", - "6bbd188ef4594cba7a9502a842835bcd014becf8b82dc4111ecc6f79828d474b", - "1669843c60fb711e27d7a1ab93ff954cf864319bc2375fa9b7829854cab4a45e", - "fbe73f625472e3fae19b2980424c524f8dec41832f5fe1059ada01f04acf2ae9", - "feb28baffb69161fb9f09f2025e146b6bf6770af9ad03b18000835a12ccbcd7a", - "7415db5771aa2df6131c35072f56690f96ab3b837a68ef96ccfbb04a8d6423e0", - "6af379a25b6feb90dbf38a4b6892a72d05473f30245550800e32cc8f659037d7", - "c9bc5dd7fcaafccadf4590cda5432914a701dd3bda237a7d9aaee851c53536aa", - "888ac8e858e4821fd9e04853b9425ef08ac97103f73940b4d6ce55c3be03f9de", - "82b3ab1888a65eba67431e77d747c0a9a7ea3a2b5f1128ae211d9fd83eb7c597", - "8f0efe9f51c31da75fcb0508b43527155229450081d45bb3797b319e072d73a8", - "d490c561ed67538ab64066c83dcb5ff86c27dbdbccba64d8f317413a2db49242", - "710263aa9e7b9fa41847d08e00bf60069fbbfe8da86ce2428343eb537b7c54b9", - "cb6e3c19b7267b2f1f53d2d9d5ab3fecf2b674bc39f8afd676954f781ef7500a", - "ebd608bdfbbae0fcdfdd846eca2faba15c973e9280afb1357cffd24ca6a48928", - "038cafdda69c828b0a64afb1ed88000e323dc2923febd634d5c66116f5ce9aca", - "fca71fd61aac61dda6d9de8483d1afd28bf1222d36b3c2fbcba526a3f7ac544e", - "9c9ec5db601f568da0bc067914ffba07f5db9335a06b36c354482148c914c9d1", - "9d09d4c4d823aeba88f0d9927735656f89f9c46ac09f299ae43025dcc3da0207", - "cfa964c50db37484ad2ee4c5cf51d3ab97b2b40113a274cb5a667bc4e0f45f19", - "ae3e2989c416e5f1fe07d73f5ebcf3c735e36f61110fcd65260b34774ad79efc", - "9e4b8d855e42b911ccaf47205de6d61861016e470432fca8414f0b39850e98a4", - "8abeb8d1665f6a180270732fef92ef7fed7913c845e5b699aa9018026e816a69", - "839cc6adf2cd369567e4a40665e48056474bf7b39de487d18cbadb5c17c4a831", - "b395fe96a3546832f59217537e57763ccc73b0b858d0692c21ecec4cd1414c3f", - "5326b06f7bf51ae546f207e7c1bde592bebc58666c0cbf708101a4e1b446025c", - "51c86a0ef5c1a81c45a68d6cde1e9b54c1d9b8fef13a9353502fe4606917b514", - "aa48bf4829df0ceb4feb2b385448f0704617b4328927ac8fec7e909ddb22d876", - "ac3469b6378bc08112a6ee7c3e1124f7b92b9d36dceedd3b132b03ab1b2df6ee", - "1adae3e11431eb6c2b475e69a77d4bf2e2b796336e80d827d313807e02beb1ec", - "7bc41b342f7041ae9b5275115f8446c60c64078a81cfba2d63d7b47d0fcb4ac3", - "993a74d7eb3309a327bace6870dad9509397c1ba82f6288cc4a0f0d8c8ed188b", - "097bed51db3b5ca1f1dd69d3c72b7dc15cbc5c4597fdb3256468581caa862ade", - "fd8a5bb3aad5210439a3d739f05ce7227df72090cbb9ed5c9aa7458b4c6cfdd7", - "e2da683685c39ef618cdd3c6c5be2b0df232eb2fd53fb3aa06741abb38dbd37d", - "cac2edb30fc8fe3f6e230a017cf619ee550a9a8af6f780df12a0221403f01827", - "8c3b33736ea64663b00c550317efe1240e5ebe92a5a3150b7b70c99ed33e5ec4", - "c49ea99b90b141f41b4d5b25840ec0da762029259c59bc69963ef3b6dc39dd89", - "b7ec91b327464764ab7abd06df1e569a2e29745ed8c1944f6c360f796b720195", - "bd8af9cfadd3e0ce20f5c5f6f07c66751d5651a2733cefe08fbd06e741bcfa10", - "e852b9c3f0e3d267c506fd67b5e9dfa940a7e2465602203d912210aaba2f5472", - "cbb6932f278baf83bc832fb0ccf6cc5f3195fd3447597ff079353a9d127ca1cc", - "cb0a94ed5f5d02bf0ef1f8ae1eeb419cc340342ed4f6d63fef91e8195bdb68a3", - "431ca4f131fb8933db227b1fe3b537aa4a090c3a7c2d22763f54e5027ceca320", - "97c158e0097c2fd4c076c902d45d7d64a93eb9bb4f0a398a2e656eea770a22de", - "a7d7104148aea893d86476bd0deba427079955d59cf85362ecd906eb059096b2", - "28ed9ad2f579a5f72d2f6056466b6c8c426779a0cf86f53b288514dc7f69555a", - "10b82845cea19f897eff32eadee8559238704b0a757dd66880f6d1d420ecd1ed", - "23f9bff773d9a29b8f2ad5f6fee5c7d54f6f20428618d208847861e696642c31", - "992c24e9f2ba5d59debe831b2cffcab8c1e3e16896ceae88f2c98a9f3bdb949b", - "ca55966e9c32c184c6becf7464b373db4563d7b5cfa6844a8aa7db45b6b96a7b", - "ac34ea4e7ce27deea2b6be116d102f61584316df859e6f8b6bb8bd8026150b13", - "a6e900e5a39cd3bec59f3f3d21ef8846f1d35f0337dd187406fa0d475f00f489", - "3565e8c578822123f3605d0dbe06eb0916746b0ccf85e0f5ed855bb76724a97a", - "b12628427cf76aa7c8e8120a3d65e72a8f887504535c2b09a9ae1aeba57137e0", - "a70711f82e6dbe36511bc4b7233d243e95b535f13f0cadb1652be675608cc67f", - "0a6af5622623109be30156e355ec8c3090ca1cfc45b9d7d73fc34535d94a9fd6", - "ad2f108eecd61ed6e89fa30d29de3d4653b87c5c2beb17d7a15b097ca89a7fa5", - "3bd27498c3a3645603f0c5b29977e08d571dac7175bf76281bcbb911b8fd826d", - "d4e9d1d685d97aebf6fc673d9c494a1a3488b92dbac26f1f85848bf24c729b15", - "db92a4880110736b760b47627350d4c5a5b32b07a54cb78c9ddf5c98628e41e4", - "864be425586014b05456a97008e571bcad88d825d18c39b58793bb5439b32a05", - "6db8b3ba27b84a8674e119f0e63f298ef11d871835d1fdb532dbae7af04d85b1", - "16287d576828df5180fbc1fec38011761c99c4525cf8d2bdd4490eb03f0b0454", - "6fb15d1987f05034dec17eb7bd27d9cc8eb8d781eff905e73a98d75514f78565", - "42edb6a4f75334a1bd85d06debecb2eaa18bc2434749a68a28a509119e924bf4", - "1dbef971452dfab7072dd08615fb140f2f5749017515581aebaaec20200c51cd", - "b2c3a3fe10f55264f33d6868e22c18301e01d31cb1b5a467f451cd319104ef57", - "3a32426b8ae3ac6ae6603fefb34fb6750550fc26ace90d9a5f3b71f3b83ebdf1", - "d5d490735731ea13e5f7d3164a39c1c785f73ddefca3aee2cc41ff898e57b43b", - "29396f202dbfaef2354f0e770da87709b75ef167d0c9ce909409efeee022c78d", - "f3e7213601133b8299486cba5de4bb317c19a1b1e78223a9bcda9c92fe65fa7e", - "24ce31fb4ae61224c75c10857553eea1405104da46c7b41ead9c7dfb20e8c06e", - "2db34c6bd47c192a7cc87614cb142f7cf21d556242f6ddf774bb3d5bab4c9b19", - "3f003ac3c9fe4f622b6d64a5b6988f0f0f459593de79d5382b07f10f7a7892ad", - "69328035ba0a1f8dbd1a792752d00d723dc45ec2cb6c6a8ce2d9718210a576b5", - "17949daefcd19952b092d2c3155c033ba87ad33f5e8d4ce032bb1c96c9a3620f", - "b1de515b5f305078f4ee9bcb42a2d1dea6653a470d767277be78bfd957337e1e", - "692c4c53f3259b1609742120d41f83ea24c30a2c8d05d29e2d772b04c04fa0b1", - "2569e05d833563b8797540d0df67f2f7cbfddb704265c8a87cc0e378aeb0ba2e", - "5de172a5b67b747a8801912d764f3b16acf5ebeb36d6aa5ecf147291dcc42203", - "2311a31749454a5469697acfc275d3ccc150be64e291a2ef05dbadc35681adad", - "ad328119d68f3b337e8315c0a520c3fc221748bb6ffad3b4769c93e04e5126f1", - "7a1166a82a38346dcf8bb07b53b3d90c6c1fb690f09b755ed0643669ae94af65", - "db5a741ba7c612fd4c2e963b980fdd80f2b35ed0d604bc9061c0f58de326d390", - "3ccd58ee8ddb6a14d2b5ede365998d3bdd179aad39bead5650cc8e18c99d75bb", - "4920d5a4b5bed15ad133717d4f56de483619f6199ddfaea0c4b71d3d820b4a20", - "cebccac2ef98a71591958e639b9cc6cc96710132910885828e20cb9ecd6c9e0f", - "6ee911829e45c4de393fe1a5665bbe43da94d820749359eccf083c60b36f8bad", - "eafd71d873124d0ff9bbdebe6f7553dbcf53b95b39070442a6745e58bdd3bf54", - "1459b6ff356dd004059d637a50bd8cb2b820be4a0a6656af1aebae6df270ff3c", - "5c103238ca04ed7df8d65c719f2e400bb44f9a87e72be74301b1d05fed4bb37b", - "c0a3c605d09f1998ea22633bf813d87152524b78fe3a8ec2ddf9c7a518407b3b", - "79315f72be72e9038bf9de80decac113bcbb03d15b68bbc4199b64b8d2e895e7", - "4f00771a6d3d703190fe89459249b41643685cd07c42440c5b05e2f900eb3a33", - "b398e9faec84c50a161078dac3f7b915e37b808b77acf01c4ecc9e296ff19360", - "47b27377d0860fc9b092ec78e64a7bc046f5a19edd4302cb3f460ccadc3fb695", - "a410adb861cba87e4b48c2f96afa367e59670ff266bedd4440dc3f3c6e1cdc59", - "d3a9d132a9dd965c0964bc632a70a2faff988746780eaf717e513913420d7527", - "40bc74b2361546c919acdfad7f2f9e71eae451ebd20ef1f27f984b14f686e353", - "86309220095c5494267c460173024dabacbbfdc6d4b0b9a83f59087204fa25be", - "00cfedffff63a91f91b5906d6caaeeb8f92ee419ed3b05a0387904f3cc991abb", - "661f95528c9b6b9c839f623a32fc59c4bfe90c7e30d9e1431d33c2aebdafb7c6", - "9091c8ab53416af2f7b47ad5e2d6fc8fec9e81b7f3b320ce7c625ced04173420", - "b043601c736037648d17b5e00e17fccfaa49308878385b367c71fa5618b307c6", - "311bd4bde9eebc73e9af9ed9b81706e9f8a45de534ce20e5f04763f40af73759", - "4a7157da410494515be7f75d8216d188bc0c8eaa455c4f903d926cb48d439180", - "149c5771bc34fe3b7641e872d44342ce341097f9590e0eed58775a6b59e10279", - "48cebe15c2407c410c52ebab6debed62855978ca502ecf25a93bc5c2898a4012", - "0118ca9cb97d9851de7a8b45ce20d540815ebae3247688124e08c8f417e7e936", - "d8ca23b2d2c08932a08aa70b103dc0d08209bddbe966966128e4a3a19ebe00f2", - "bbe1ed781db7040b723f2269e24e8dd6eda812bd3bb2d6a7fc96396dc82df58c", - "3d3650fe63c108fece7e0576f08b39524f7164e4dcb10a062364ae8bd3e88e18", - "adc39964dbf6ed632236aa798833381bf4f0ccbaadcd555ecab568bc5e2b1dcc", - "073dcd0201cccf9014537b5648857df253440ad1d5709b7a0ab4f6f5e90c8f4a", - "af7d2e032552db03e5773f756f3a7ed5e92e8c9dee100fdf3ce56df0709b359e", - "77833ab4888ba3feefadc762994005f9d4225b2bcb8e9e25b234ea9ff4204b56", - "a5fe4a7183dc49ee90a361b6f57a5a85ab6ab4558cfec719f466be1b4313ec61", - "f867bec1fbc200d7540228bb52e74a4c894d4d2bcdf4a7d64c5319aaf3e1d656", - "997f7a2359e17bc679737ec7dbb4f28b92cc5433bd34288c400685268a03267d", - "b005a57646f08f555aa9880206d5df69a04c0562ef1a635b9e6c74b45ef10c9f", - "cdbb9ed74894fc24b55981cd2acd940199b327365f45d51fb7a107bcc4c9d89b", - "9b6da82b41a20898a618622d355cde7cc226f934ab5f23884ba770aebb8d6c53", - "48ca49d98c3455fbe24a1d6c09828eb895177fde1d2f810aeebc90f9c0e18684", - "2d6bbe040c40ff8d61238d6abe074cd47e5a5e74b9a24fd51430d86af54e97b5", - "aaf44612012ef7771cfb59a5eb09380478dc006fe290c74a5be4f6049179e012", - "3516029fffc560256f65b158b8ea3aed8cb4c1f532d3e716bdc7f3c39f28ea25", - "538149701b65670cf3986a5d83c95b6f345e0096cc4228d80e4b32219cd8abc3", - "3f62714e5956b7bd6662fee73a28b45e32cc180f3a77f887fdfca3eddc29d13b", - "782ed9c97eff8915d9b000a41ca824521d9b67aaaab85762919ff688e3057af9", - "81d957f38c212f7ba5bc7e75ca8b884b0ec49d46793621fb833a2748d249a507", - "b11480f61ceaa8b1cc2f9b612c9d061643881108f3e0b3103cfde44e2d644fc6", - "917b207c0c23f4f78203e14874236e5043ddd3e31a01505ed0f0f0ef7527b7e0", - "413c559d3bb0f8a2cdd3a51a47aa929881d0650df73ad46ebea6312eeb7281cf", - "782f2677c61801532f67ed0d54a6d85e17981a7523ba3e52472b7b197cf2b28f", - "2612d252bb91ab08b5094924079808727e5bb6cafbb3272bac5c27505dfada6e", - "b90b3b2fad20f1bdcfc904fe32fc1fe943ac10b0e4ad1d636cbfd13c05e40150", - "398d3026c1e73854f9054bec6e14c58728ae6da236766940119eb3f233e33398", - "c3c60727055448a57802666dd9cc26f52eef23f5214becc1573ffadc8d05cf1e", - "dcb0bdc58f58f7d29a7834d50bbad3953efc993fd790578b1814443414554e87", - "80903ec3e8a3318952f8c66309dd74dd5cbc8ba97485c5ba7216974b811392bb", - "b28e1d1583a32063695b0f2c5ead138f5e9f1096e9495dc3dffeba62bbf7e482", - "58eaab135c271ce5e7a38361a4a10db48deade5d51efbddc002b782dff0e9f20", - "8378273fa87084bb7813b0780a2079aa2abc2d5ebe68701539edb166d349a4ef", - "fbdae70ea719966f84c561cb265b320696566675be0543f1c99753d307c51e35", - "75f4ee4e513579c75b94955c4196e21137112c2b639e1220c45373802db629a7", - "7eeba2ce5fb33d866191fc2919d31f824265ed1b3580f772da8e3e8e54bf7944", - "9729611480cd0c51942470a9782c51a824b8daa222100c27bbe41762f4b6be55", - "229bb9f35b35edd93ccc428298ad47ef858e2ccf147e4130dd39a59730f69217", - "2ab3695b8e29dee93bc12bb2b0af06dcbdad5fe031289bc0aac2765444eecad2", - "ff0f988c1c326ea621065a8a174b7e084d209758988c73e23b21dd2c3b47ea39", - "7af1a5379159901333f693b5b8da534916c05d68889480ee38a06371dad2c94a", - "57770842a358394127edf9d2f65db91b99951050f188517a83d69a7788f240a8", - "861bc09319be439a10ae4da7ac1bcbeca26032eb6ebc15274a9f5546547f64ec", - "2a6fae44deed148f337ddbcb7d6677286c58f231775e85a76f48419ac7dd9596", - "430f7fe3c0f5144130b559006d9fd0526fe5cde6cfd5d641be25f03c33d398cf", - "ef312396c6d2f9eccc977f1eccafdab854ff6e4c40184888d6ce931f01e0e30c", - "d085f5da66de75caa6cfc6748b30fa1e33ab0afa2b5b5827066ec8a14690065f", - "4d45aaeb1f0e00495b99f5fdc46c2c1e6b0fd48c693678de72afc1cb6f47a086", - "7d87be0e84286a37801021a078119c241d0637354432508f27ae2d88b0ab84fb", - "258da02e0b15ca775c2fd75ef5dc5eac216577e71b288028a3e3894c7237a47a", - "d57de6f9ddb3956b4ef53e3207b0bbec6da2d9c3d7f510917ebe6948072344eb", - "96e81d363179109bb1c6556434188eec37905335d2df3ae37b82513d2ce43d89", - "ab86f8244a6b2c90245406409398319386a0a9fc2411acd290facd9918a63b36", - "2a54967306fc028682b7dc3d862c9022f6952c7a158aae6e0d8300d31b6f9432", - "998ca4f9135dfd3ac40b20696452d3f0f770e5cb9bc1ca8dfb662237c16439fb", - "829eacc9de71f51b15367c0def4a7634656766aedb1ab5c00e253adabad5cdc6", - "89093940ccb2515e777e6b8cb4f1866ef86c10d3c080218d405b391c0f7cdb62", - "6454c4444dfe4d5b9bfd85b4d58b940586f85aac19dade92f5ed069497c6a39f", - "59d7e831ef8fff71e04718228957d3c8efc31af75fd034af2d62ce361b2e079f", - "2c207f5860683849899585d6441cf34c6dcee7e520ff0e63273869da11cb30a0", - "db45f5bfd51165130a2384b2c1e920c2eca33dddba59c948fa89a38e080d2743", - "7f306ccaf2111443ea49c3ed5904da4451f45af15fae68c23bb40800b149f932", - "2715f3508e88592c1b25bca7e10bf7d2357c0751090e7de642374e027f23600e", - "afe8817fbd386b201e31f0177f33d146ad3d77081abafcfa1d5045de57378ef0", - "eed92eba127cfbc706060c989bc493b92ee8f3a53888801eb0bec2392e41ddce", - "34740b1bd4d7aec83e2b385f83189b9b2e4002aaa60cfa2d2acb3ee772385b7a", - "7d534a88d749e4b54a6854cf339672820b5b5a23f461e885bd90c79d193c7190", - "bbb15af4d90614b77042a9e5703d4d081974bc0249486fbb933d325d4ac0d3eb", - "000e64969e25738286b22bc2579620aafb2638dd62fb5a81b37413c4adf035a7", - "664f9e9813f52d61f884c35a28aced54224aca3cbd3d3724ec410f9e6dea6719", - "f5f55875d531ae4d4d23d06a0434411fe52c971e298d3eb3ad36f091133e5872", - "cef62a06d6e7d77c7cd5a5814aa6be5baac995ecc78531de26b04985590999f0", - "1a34b459874581e4cf0ebfe63bf6fa4ff9e4dc996de075dcd24ea510705d20ff", - "d34905d3121e8f13a76576fa731d359cb19e2a5faa8a12c0b6befd9c048d6941", - "7e5e0ecc69565f45f811d0cb5b606c98424bef8c5cfe34252ad1a90b885a6837", - "d8ca3aca4f881221ed036dff45342d13c88d5ea7212a28865048458b9f8edcb4", - "ad07cfd26be2efbb0407f67d18f1637f3a6f0bc406b1746d0dd5409dee4f35d6", - "fc1320a024d4dc5b23389bdcb9db427e5a06f2043efbfafedcd74cf701ca782b", - "4e93faed8dab48393a10f92bd69f8acda87006372db43864396d8a2c560f6d6d", - "abccbfbb2f05a777d1f4567fd0a848f1d09f121bbeab2b7755aaeb39ab0cf834", - "785913e5fc29fb0cc178b76a6e74f498472d8d79a88b83c362d81d0bfc4de009", - "05f4249a78cd4422dcefdf393d40fb74876176bb7fd520569eda684ca1183389", - "f0fe1c513fceac0cbea8cff721d7e4bc0a2f3a581ec140b586016412dfb05d68", - "0ecee4fad1421f2f6f5cf74b7a509ebd2ad3fdcd66c54650e7ef5708f7e949d7", - "d783e183378049ed57c12f06c4a70cb53b4009093e095d6f7142dba2e6c9fca6", - "2959be7ed6efeeec5782d29c89742c46017f8edd18cd2db043e9123129600e43", - "81db3580eaa8327a3502732c988ea3e446567daf4b990178b57239abe79b64b9", - "fb6845e11c0f861cbbd5e4cb46b3cb1f5db3c09514148181622f4d4bcf8a3e0c", - "096154d294ba7861f0b3e30c78a4500971438b8a32cc7d12b4556ac43057b11d", - "ed8018121f21bff99d7554c23994c4b1928c14ffa8ad258db07688aec789edbe", - "51f9008d0e07908737462512852a6090e7de5e6fdf6e2d6f2d429728b5851d62", - "fed63f2eaa4eed81fef31ff0ece160c3a72141261bc8e48125a7011d378c02d9", - "7613b7b6efa6bc40f8a0e42d2145ae4a4beeeb68fd6a61aac3dd5030ebd1f7c6", - "784e90b76dfc81d091548818d7e0a33d57097c8a1d8099c7cb3ae5784b07911c", - "9e1154e8bef0ae67853c98c5a793260264b029a23f70e662aa512b9a1324e82e", - "772fb603fe25871a07c469097aa8ec8d27296b129989a3ec0b4c3019448c6f88", - "cd584447f75536319de4329fce4cbecf1f3239c7c7c08e2b528ad8dc36db1335", - "ee20b37dd9980ead5bdf8a78125eaa92190b4eb9a96907961667c244f21ebc4a", - "ccd66f066b5bdb65195f42aff79b5fb8b49ab765cbef4de5b4df7505d638a109", - "e82a91262f55f221300346353c84093fca41bf811303fb1a5d5edd901dea311e", - "c93fcc34efb9824007002e4b5994cca1a7351bcf91be1367e6c6c0427c47d9a7", - "0f30006db5d65f998663e145559b73c0eb89cc00f825a2d82489e49fdd94de9e", - "f274cdadf93d7928e130cc20d3858f6cea9e146d21811644d68c99286c3b142b", - "74a862a893213b899daac95902085dd0f775bf272393c367a4260552e3f840b3", - "e151657b4c2ce3d1f471285bbe75c561d395905508b57c11345b8cdc01d70013", - "c46458fd108dde7300b84be016de07f125f1f76b78e380a2ddb52cf62fed2483", - "23fd276f517e585e12a4338fcced39c8845d5e75465d0760db678d0e2eee5197", - "3e0e5a5a60a12f34d0aa7d317265856eaf5537af08ca3fcb01ff10e812da4097", - "9dc5ac59e23d4fc96629d99d754894e21de1c474b9c714b4004d0ddb8657475d", - "1a738653a32119f65bc272407da7ee45ee57b5eab51b5299bac696571861a91f", - "e8de9ac82c0f4ba9cb7994e91c12e8647b409766e73bdba04bc2fce0a06879ec", - "003a2f67faa37b57e45e8075d86561dfd5aa207f2e38a7fb9f80193ddb4cc10f", - "f937264e3e1a40496e50eb0c2183277d117600166c0d501f8d0147561c2f9867", - "15b1d692623ae1f6019b0f3752f117bbbbdfe6b3fcbe7de83fec486a426cf297", - "b47c89efc13bdc58e30ede3a9a7a709d94a31666e91793631aca9a8a8432cb9c", - "9e09a9130d96445a34066c3d4a77343955f56543313795031d520f27e5440f9b", - "4bd9d8985bd9a67eaa600b6f15113778ef3a3a6d4e5487b4cba3892e5a84d0a1", - "f7f1e54c533f0f6b1d889ac5490730f10079d340b18d8ec9dd5857cfb22c880f", - "09e66451347423d494557e53a0cd14efc9a995293d6bf6763ee9991871ae498d", - "7356b0340fe89407d863e7288fb4726b934ee4abe0e86f2a509d5eb3754d4dd4", - "b761f2f00587dabed374e2098d9e907228c918e2093afe56fa9a73208231f487", - "ee3571f779b20c5180979b385d7d3e51a1b45625d939efbc3b04280ec79a7a88", - "911d9db11406883808a4d33eab227a2d9a7a47f0f11ecaacb7f25b510ab4c41f", - "a3820e87242328b55363fdab53e068470a5920be8e0793ead61b5ca3c2c23570", - "7c5567943372d6da562bbae771fed5c20c47ee641700902f32d3ce18237e842c", - "3cbfd141569854a6f2f0fdc28732a3c6a8849905953881feb7d9f7ec768942ac", - "a5c6e9248865d57b49d1dd8cb3a6b09e9b3f1711a05e9fdfe216433fd75fcd10", - "3b0779c9aaf26d72a295aeb6c31c7c140ff64097606e11e71d2dcb5bbd7b8848", - "0b940457ee3e9fa6e6f63ce7cd5128809522851796dde1dcc3b11a15650f0e6f", - "456a8ce99bb61e577cc4f291c9e914ac18e1d2d8698e48ec82cdf4cc75f05d45", - "a076f866fd2a304f9b56bfbb2eb7dd4a91fc7a1272eb0d67b406d89d7a76bb9d", - "0a28a16e1c309666ec6c48190450cc1efe9defaf3ffb0511489ed8fba1fcb6cc", - "1b8fa3568eb1e82f9c8e35fca802159739ced3de5085203e64c8a81f00ba4af2", - "4a0eb173d44eb9743e3a0ae5c5f64db86303d3bc35ac6938895dbead80765d4d", - "2cf80f371cb3ab84cc7222b3376eb081f1bf8aa8228b71ca8abf586c63600cfb", - "52db1266cab60438604fe310422b6e2ce180cb852447b09aa456176665963f05", - "ee915f801628965f7ec64efc76048c05bf2bb73435fd2ac6511303faa7495d15", - "17f5bf3e13f6da60a42a667187c036c6c5bf29121913b05ea3a89d241e5bb14e", - "13ad5ce071acbb77cfc45a5a916de484d7c6ecded14ae7dc2168c71afd1a7def", - "db2a9564ce8a40e4f672f662b978e0c9c50195f9cd4fdb1bf269643f0de745cc", - "5d14cd4c5d40e95049a717dc637095804d723f7078943e6916a86c5754a3814f", - "d28a6b0ed0e336c4e90fb8448976e272d1264b2ede9b8520aee5ad69fc141376", - "5634a7d9f5aa4ee7d9396c69d5308bd1c393da2fe62d508ccc607cce0f716ffc", - "42aa5ffd88c13d4edf2b3e115c8960dc47bff4fa865a56385c464888cd00b353", - "39c879e8006a4bbc59755deb97f439107f2b28189102a23a28afafe7e771858d", - "c8a1d4d821dd5f931bef79cca7b82ba0d4554c7dfb9f1206b2b9915c8f88436c", - "117da026c363eb37169089bfde34fcd5a2f1bbcc435022d90e218adf9197644b", - "d46042f678d19afce2be2d12c8a97578d8571f74487f3ba3e11139383246ea90", - "5a4391efa0867af57dd4ef7ee3a671280d90ede6369bb57df55231b3fba17039", - "3f49888464489bbf9a648293f4f048008645e82eaef607f41be6589c24dddb0f", - "b8ea51bee7dea72f55fc1fa22c0706ee05d352446bca9ede7e4e95544ffb9672", - "2e676fdcc5c5eae3531789f909e640a65ea5f3b49345a7e7c95dd012a5d2a3a5", - "4df9963378c56fe9086f31662a0820b93bc27c81d80cab6d3b7618df93f39414", - "9ffe23d0c323e23666e7cbe30caa8895252ebe53e9ec3a794cb82f78d72205ab", - "b3ef2fdaa5b593d20daf56f1419b6843ae86c8a3e86c6c6f7e9948a2f3495c0a", - "dd8c3fb87358c5be0044468385d3cac91c79281fe2d24c7e077204bb31f67eff", - "bcbbe269e1f52e1442d7766541c8b91e881b2f4f1b748600a79e959d81aec661", - "26166c9bf884e2a87d415cf54875ecd5ccb8112eca11f18daf72e0df7dcfe036", - "44c7da5ed196f36217e27302245b3b53b0f13cd5c5d06a85a98b45416de2e1fd", - "07256bdd7dc7f9d2a98b614369f1e56f5f427ab043a6f548b5b6d4aa3dea0d2b", - "7c575988f2a10b2b3d4ab3c241e4a33861c471047d88048cad8b334f254b2606", - "f6cda1caa702d4f471ea592157aec8846a7e456f19e2cde348fda3cdb27660a3", - "44ae0f972c099021ed4b67aeab6857f6a6423c86a6c63f8d75e183c10b625aa1", - "72b679b9bc1d752456e072264b0a45e46aba10245bf27d0647fe4477e7624105", - "03baf8154e09da0c49ef9d9797e4dd51748e788ef8e8c0c04d7e2c6c9655777c", - "bcb530819353cb09181bb06b29e5e47bdd948f2ebb4df1221784864a9214f807", - "b66e9aa828386581c863e31265eb150be2b98ebd64a1286f7412294e633e9d85", - "685f45d7fe33f6dcf72158c4f565e3bc11baef0a5344c59132c1aab6c0aae7db", - "959935f88e7cff064760c38a8e9290b2752f81f6d2e6f87276c6d53fcb63b304", - "d6ad9dc4a0385dd1740d5a9af43a2722105e86a855fb97995fc1373dde1591d7", - "59beb12f38f1121893b8652a23c67296cdee6f53b7bcad1ec4fb899c3929d38f", - "e276165a806bcd0a938d8cb76e1d455014514870d3de713e69e36e1a5d81c4ef", - "5e0451831cc50eb007054813f90bf9cbd334272e5a27f9ea8bfe9279dafb8c49", - "55826c87ca2f9ce5dd2f96ed2333f7a63642f6e5503572f62a4e70b8446ff0b1", - "81b795224d23bf605fc2e28dc09a3bfc058533f8f436cfe2d67bfb9792b0fb08", - "6f126b2a9afd4e935046ce1e3362813754f6f1a1e42deea15811f20f5e05fcf0", - "f3ae2f37a7c107e07502a2c67e79c848f2f419c3cffbb2cc5e2e717bbf123961", - "5192f446738abd316dbe84e2821b3a8dc6d6b1778d2dcfd0fcc975e37a5dd8c8", - "a668d7b377843cb2b34b1c72bee2fca729d0934ec3d9f0764a74893848796b9d", - "ec8be552d2febc46bd5bbbfb09e9d9cc1ce82f18d497012b04f9669d0dd6c84c", - "41bedc3d60d67063369ffdb804f9d414d10a1ff787b28d55d5ad76d0e9a71527", - "5041369cf20565e6709b0fca650608445ce42b5318ae18a179331e16b3d73b24", - "022a1b42ce2dd1434d291689f472172fb3ac2add1482f958ec44c6053770800e", - "80cd8bed4efd00bbaa099c9677dcde308e4ee69b17aa8be5c9ee01a965d4eeef", - "a8b5ea63cfbb6fe9a96defda521e6b211459e7077c36a611510757f65b27c2d7", - "7468fd4061d78d1dd759452509d01e7fcfa23f4db6256c3c8dec009b6c12d2d5", - "9b52cd283b02c7bbff9910d209ae28de752950facb66cf6835d11ebf37b43548", - "be35e9c4af12f7ddba19ca2ba1fdf209db32f6dad393e6779ecab034b9358d82", - "df494183f31ca8dd805e51cd1b51a281b8f1b1ff15caf14fe481dd81ad3d65f1", - "7d0d1d067674361d88a420f0f26918a39fd37157d7c02aa9e81b4dc6771e9035", - "f10bf015535f115e5c8610d1a92ecfcdb0f2f4e49cd08bd95c987c3b97907465", - "0eeb888c11ab84c7d5dcd3a48ea34a70eb09ecdc2b933dc321e9d17685ef1cb2", - "7bb0e9e9b946dd18e5f006ed0b92a89f7597a7fb4004accdfdc75bbc1e726f22", - "7f5038f95f1d32d638f9a869ec10f6dd817fdf1d213ae0156b1ee01c527088ef", - "81bf1fc18fd0ed73f9361aaa2fcef23873189727d6368983700d1c15378da021", - "3e1c0ba94a5ac3b6ffdfca3f9fc1a6e37eff98483e864e54e8330bc34e240354", - "0f0f9642a80fe28fa2576c6d8024737918d1139302801c5bf1451c635589a218", - "f41c8e09fa4a3d881e07eb9f468cea1301800f98693cebc1e475c36ba6af48af", - "662835795c0a894de243d30d6312a687384e0fef9b155394b61359fe2bde8bc9", - "1e8482204134d533eeb8b533d4ff9cc0c06df26b3bce3e3b54cc9a3c323a5ad9", - "332bfe663e3218b502889000ac1a3ea12197cb78bf05955e0c3c0e364d39b708", - "44d9dfd02c548ad98b82d5edc9fcc6a7d23b688edbc8597d8a783e1cd2b47169", - "195afc2ed01a2063ffb2d6a217a8409e787a0eae041ec11eb2df4a7ea3c47756", - "a39b1d2bd539d6dcdb473054239016f3232025097ea12a8a8ae65495ac7c449e", - "af9c8fc469710fab9f61e38987d47729dd85acdb4a195121f5d0639c131e9d54", - "43faf9ba8fb12f72e7c9da23cf57fad8701df8f5bd0d656a2a3b448aada1596d", - "31132204e4d7a647b5394c9ba6b341208a563e6bd3f98d9c7915c3d26458718f", - "897c94ccf96576cd0163fd506de352ca2ed42b6333bb68b6f8608754f14894db", - "14dddf690db8bd10fb24eb030e664c05f78d83490c9933bf2e896958b6914e64", - "2ddc9ac5ec5909e815a50575abf0f1d4b3a2ca44202762f145b94e074199bfcb", - "515b0f486ef4242ca4876e1bbf84478fad1aa9b33ece8345f3c6f9cb8d0919a1", - "b65abe406a576710d872135a8b974838758dcd7ef83e620468a393231dbe206c", - "a8acde59f6bf774a245708e099bb9db8b03d87659cca22e31e45a80b983ec8e4", - "9c8fbace9c27a0cd5ea83d9e96ddfcdcb6060edcec4961d6129b055b442331a1", - "80e2d71cf8cb101e90722be6da1b96d2c61f8272aa59dfc7e3218492415f71f4", - "25f7781956f2454f6de887e2bc7d598222a44052c75f2fb8d78c36bcf9779111", - "4e42e2de480c934b996dfdbbc959cfc8606bb3aa3398965e0f2a31e368536fa8", - "52bcde9ab1e07e662ebac4f8700733ec3d46f6c96650e53a321d14f12bd609ba", - "ebfeda868b5f947d0aac391edbd6e8abb621ed38a2b882d259c3d02e3f2e46bf", - "643453e8297e835ecbf7d534954dbf781af654c0a6d6c7ca4afe518cb92cd17e", - "a3a4b1ebafce64c2aaf9b8c75bb82878074576c48717d43e8a822a29a2119bfc", - "0cc6a0c8bfff17fab284fc9b9340a924b7a1058e257962fa8c32eb9b9288399c", - "d06594d1ad6773eb0e669e85f37123334fb5d845832a37096c9e6481db23e76e", - "5edee8b6651011050e0dfdffabe0556edaccffa06e42c2f6ba21c8fee121ddab", - "1da48cde223a96038964d840dab77dc866002143b3f9c66b0e09559c2cab6753", - "d51335f92501f586075494a078004d2a7a0e6b722d6ff1ab5ee7bb4993b44a32", - "3d74660494b7f872bc15779abe89606bc7b459c9ddff2d51fde7ed0608c19369", - "63a1bdccb83389d2649481a02de0c6fb72d000c6301aad95b3be2690a0856701", - "d47b27ae8d7b4ac13864c971f5e89305a80f0280b264f31ed7add4fdb453b4b4", - "1da6c634ce3869caad7b064d0ca7007a9b97bbe3dbd347d9375b2505edc78787", - "7e3dae6e4967c79faacbe6de0f7ea669b7b64bee775fa84b17fb5a88d6f2c359", - "6ea2dc1f62748308dafd29ce600e8cc162b4b2ceebf3687341f989b00a71d482", - "afca4c23f544ea8f1de8bf5139bc4ae97b03266a2e291769c6c0724835771661", - "c16b6c53fde05369ffa7d85f4ab0d65f56d06aba8f4fe093e0b010bb7d4bef75", - "2850a429232959f608fe0323bed5afd4e194634a4bc859a1f35b6e09b80d644b", - "712a06424a77aca05422f7fe23578f0726ea81d218e93a1b0dca749b364817f1", - "38c13535e6a9b69d1b27fc2c9d660804e8db3ebda239622ea79560856224485c", - "c0a0a480f9bb241da10ff0ba51ba333b755908a7511ac296df861c2787dbaa8d", - "654a78ef73b62fabd7932d0f4b9c6e43f838338b7f5595f75cc0909e9421c525", - "628f69836a732b89d3d5e21bc4678ed4b13c1a89791492f57b38fb1e64bab611", - "bb0ea1d24fceaa7567d5968459cb5486323aa5b421754ba7c505d0573c69d297", - "d4b1bf4ca6894b36d4a9cdb56281c4ca61d6e1d79e398ac7f78d76cd163ca0be", - "1c02aa5c793445470386effff55235250a3817d692c029627b37b53ee7041fb9", - "89d2e4fbe04e0c8f7f579490e4effdb7c2c9e002c088bbf150493bd1d2dedd1b", - "174b63b556cb54945ec937991bdb4aeb9407879706311a03175549d4c6963125", - "4d407c945c72c70bb04d3e4c25a3b59dd94f7e6a1bf9dc9f43fad8c04b0db2e7", - "1891e2f79f7e667fbedeacceb96eef323117760f8995d50b5f1ae57137f31c99", - "f8758cdefa2bc3920fd7ef37ff971d4e46c912852ac14f6b3d567c5e17f197c9", - "6525275ec5d298d2ef13ee79803a4e2fa847a08009bf1628c2c2975624063bfd", - "2d3d14302593d332d40db6d3ca14bb23f1844c8afadba067d313099113cbb70b", - "f16be089619d3286cf51d4647c743bd7043a0214512584783040e6b4c65f64c7", - "5ac6b90ae2c65e2452529db320f886121a2b48e2d264c090e0767d8d8c20cd26", - "c2929daf0cc9bc5d0e8a444e7da3d93bbd429f575686f6fa04c2d2e8215c3af1", - "2e2cc8ebbbfada60b137147f231dc2f2e082b3ea9f97c4f817eed94c81d91b6f", - "d19b348e0e65156fa151c1501a466eed9d2d471c84c1a6e247e707d60fb34d34", - "03d99da59d164edf861ae70a58d49716857c5eca62096621ac48e081d2c9801c", - "19e4e87b6d128d90c0855dfac2c08ffac13ce90d21f1aeb527205819e5cfb398", - "be3e25f8499eed119855fb06fb104c403836773eb60d8844ff243f7dfb32e6d7", - "8a1ea7f91738df4d591b48aae56c750bdf8a8405264890c14d83e4c266d4a145", - "016ff9382ff7c616807a31cebeb2ad445a929b67d7068815f4e28f6305fae5e0", - "4c71813e992bdeec968bd51c961c92c5f3ca4a447617a0db850656edda418aa7", - "10010448c3c1d74b5c883fd714ffc44c4112f2d466b205258c36f39a1d0748cc", - "70d21eb88d111be64b479cc41fe7c8ce314b9cbbfcd71dbfab277b0a5ae931b1", - "c446fd9d9b0cc22a2ec3350b4a21870e611866ca4940e4407e9c334f6dc9554c", - "5f8ad47f5fbb11a84cdab0a077c5163150198f3c69cd99b79b36587040c656e7", - "a5d6126b7ebbc40cf3cf5d0db3cb267c1a7fd743abd454e4fa239b8c6c24e33b", - "3690bd922ccf8f61ce0062d367d048b690f4cc00df84c8da7a36c76c2bba5a1d", - "e06b3a6e2b692126aa614da239321fdaa9efb1527e84f7adb72eba5080b8b3fb", - "f7ad10cc0d4f393d84bc7b0a764c4ae160b1471aeb05074bf047df0e47591569", - "6a0365d17102cfa7d25b2b43693dede0b26368f47ee00b852f595bb92613f7e1", - "5795415011e775771003f9104b39bcdae8162cce109b1f7a1cdb1f2871b71ec1", - "ba7221aba7e3506e33c0b427bf572f15cab2d97eab39affe621aa98b85c26fcc", - "bde251ecaee90458a09d29b39b74e810ae4fa5d12d5b8c7b1bb89366af7f46c8", - "0cc5b8f66b9279cc160b66e1b123d1de1a6d655eba1b65653926dfd4aaf997f2", - "000dec67a679ab3115d5461bdd550b79abb11b6a356cda94fbec830c29e35fc5", - "198ff784e2f8a2c1b321e30d32bcb67dc9763a78e5966a1eee1b82ba7e28db25", - "af6d4100d6e2f499283ce99ef1832953ac6b7ff952e9b8a669117c11c0ce075f", - "01728ccbf106a6741caa11ed70fa7d2c49fbeb6a2556f27b278075078ba8af5b", - "a83d4f0753815669d6c1a4fd5377afe5ef417e59e3aa5fb7d5ad838248249932", - "4d45224b10765548158109ec5d773ecb6d6c7fc808d06c3fc6b7fc1d8fe89492", - "d8ed4cc5c7da9a230357f991bb19edc2635469c50535a53f7616dcf1d7c2d798", - "0096706c992bdbdae6bfb5bbf7600f9188e3775dc85de61abb6f55a82d6e8f36", - "d1f774f660c91d5bfd172de46311f7eea429a691bf4addaa0e1c858d7d4910f5", - "833e6bded2d40b423975b48e59f620634db45fcccd084c6dde53d27ec67bca0f", - "c3142f232413abf68f5224155bdaf9341b73c21c89e1f74ba2ba9845d05f0bda", - "157e6133cc5dc06e2ac4820ff9634092dfdf010dfb7977f4110ff870bb1f6b92", - "495c19b730683114acd789ea43d4037605ffc8ec4bdc26438da2fe52050d14a0", - "7d4e83ae47d8e1b97691a4c22b01a5a3b0147aeb8c2d12f49d69be4f262b6368", - "f2352c0e3de042a3d6efe8412d146d4712dfbd6aa6c25b6ccf0b7473159abd2d", - "88755217adc4d6c91afa4031ab313eb3e28e807b57949d969ff7ad602306e9e3", - "48e39c6cd30f67884ad78bc4d11bc710353f987857ac0ae1263274f0dd189cc5", - "eac9648db295c66adbcd3615f4ebf628d7f7b53a177f1f56cb03d4555456cfe9", - "0237eb700c4834ef76569cb03af850db7985735f54ef29c8133950876559a6ef", - "84a48d1a472a772fce7944093708dc665897b3af4ae2cccd9084865f08e5b6ef", - "ff203df9e2be75b07fa5fb70e70fcc3056575c0c49172dd148fe1e5e16cb9e65", - "85cbd9b03d763998fed8ce4c6a0e62624ec4b08ab2ffb06f94829a9961b2f9bc", - "9d0008158c9823b5a50f5e94bdfe63a4cd695a4bfdb8d93d6abfb6b9b126bc36", - "31017212273c3a0def182477fb78373569c3de1686f0aa0bb98d5a1a81e38c30", - "ae2c9c85f4e4dac81acd62ad1a634040ae9013bed6d91b947d57fa7ae13a6fde", - "82d1edd7fd496bf43e77b1fdecc18bc86ab3ed3109092e5db7d0fab7983b942f", - "af95596383edb1c8b6c2735bfa8f8fae57f86a9e1ccc7deb0d5fa18ae80070ac", - "e40d9b688168f9cfb98db93f4180e589729bab3e91d99e6f3316c4612b27a6c4", - "17168be639a9caba0049c7ddbab282db44ff54e23ae3a7b9ac53dca0ccb68c1d", - "4fc86f3d905fdef2ac7b4c48b8ee0bc91a6a6f1b8a5a4d01bc78ec8faaf6e2f3", - "4919defb295936e919a1c536c369621f0fe6c2696fc8d1989568db3b3ac8c0b7", - "f7c3a496e4fd7fc3c6b72160004484408f7dd1968eadda147ff109fb05487a50", - "dd30002623fb842ce2fd5a786f346e7b26ba1817b9434a3414b49a320e8b1019", - "0b9859ecb66f1c3f3422d84412884b155e00eae5d0274817936e7ec80d336737", - "b23cb3c776793ee6722a37be068cfaa0fcb8d86a2d2cf36b23b5711d18df3320", - "62c3e50a7e2d6764e116f14ef2ee1c282d02ee2b4344a412fa9dddf58d9b8a26", - "6397d84b7ca10a6c2a19fe8964e414a4b4c1082606233b3f1eed5fa3a8d1ae9c", - "0f00b7e846b72fd7b6484d335e35becabbfca7a86d3c2cfdd613793962576c86", - "b94860fbd3a0b7c954fb09b309621b6688eecbc062d522c2400906f0e90ea67e", - "00861e918d8b0102499df66a313c26ca0f1088ba2905d1a288186f40f362341b", - "0c741bb186e9c405a6a1d790a17c6b79141c4ea28f66fdf145c0411b416e1820", - "6d00f68824f96e0ce26c28fd513dc663510212a2f028d24423fc7f784592ad07", - "b667b170fdcc5e59c5b73e48df1e76a8eacaac7052fe50044fe90f28c7da8bca", - "92304d3818e258ab2bc81937f9da20d8e9033f6d1d7406080f34d875964c7470", - "fec69508b5223ffdf2e649fc57e31458eaec4964dbe25c821fdc920f9cfedcdf", - "87894c1492bb11ed3a3e999e40c169b5141941b4e667471def04d6a1e98791d7", - "3cad93521712a35a9372e8bf9fcad3a2a806353243ddf651aa8c440f481f5f08", - "be68fe0b9a46a41721c1e71937eb3194570c651e12e2855d0fbcfdcf54420b94", - "5e36825c67767121f76bf30d0b8179ea975698cd50339b0f4d03ea5ab9721fca", - "c4c58ee67802c1dc28664a64aa49046b84e2e398c9462634cb18e74cb379a468", - "ea960f8f0f07a47e6bc087be7a932e959bf2fb3f8558416bb3352cd2242e3ba9", - "64ba001490fffecc7cab2e52be66a79569d76d3c4ef415d622a9f0e5f8cf8ba2", - "813fd534442f2cbfdc437354dea82c18c885d654bef30ecaa767ac380a83791e", - "e9d4bffc0c03a6729796b5138dc20db5af3cf2c27d4e263bb4c51a5232ff0eed", - "143ced86ba9cd838888af7c8d09a93ca5266eb3a4f5dda8047e56a3884b8ae19", - "779c01bd330a9c46066414773b2938bdfa850276646cf9e25ea7ef8cc2bae2d8", - "0958eb787e27491028dbcdd33f21283104faed27f38b1ee14967fd44ff2f3bba", - "37ae6d090d133676c34bfde6c5e5c4ed52159e7d7297942b02ed19ded01c50c3", - "ddd8d20e0f15d4172f5dac0b06fbfe28afa36933c383da950bc284586c83c7c3", - "401930378735f9efc8a148b1d6eb5e1b2475b1b0e548cc54ef7f50c5c0e1f9ca", - "a07965db005c9bc6829a600b39c95e9f73a3a80639fa4a1ad7a1593d321e677b", - "0be700083f0e1af48dc9396d8060f25b2c305416d046127ca10e6d7c897e06ec", - "c429182c2debd8db226ec5d6f7ef2fda26ed0b56ff658140e492019d00f58cbc", - "a97a689d95e64c2b2ce90fbf405832722e15fd0256502cad94cdf0eb5ca21fe4", - "95fb4d83f8737b3c69c9ea20fb36aad0cfbee3771a046bfc26c50233b1d21352", - "d151d7363cc7f2e98005cb1ec6f077c4971a00329543c1ab7bf88253ff6e6ed3", - "8cece63378e31c46185d2b374329fe82f3ac632c2ce32e1171586663fe898355", - "039ae9196bd5a934089a55df34524cb98ab7ccd56a889e6e1a0de7484f1f4b7b", - "0039608896485bea572e62c3e27d5f6ccd680fe1013b0b7dd311d9a9c0d8eef9", - "16f74e8f0ed524f6fcaac6137b0906e22a9fd12fbf56f56d4ec64e6e8f99e038", - "4b7965878c87c4dd062274786dabc02f1267e7843d6b5ab160a6cf961cfd0894", - "e732403e1d7ee80d0d191bd83223823e28e0595fd391dff4f925c240beb2685a", - "962865b20361eb3c75cf90989995e65f959298d09aa36bbe9f411fd5217123bb", - "b4084ddb3a892599babe4d8a3fb77593be28bb4db32487d918467d4720e83961", - "bbb954d902f09ebbe396efebce478245ce5c46dcf111b9c389b06b9e8e09454a", - "80682c65e6b7132045437e156606b679e599895193d62e67b27d437d02fd7e06", - "d71db824ab9b0c59aa125b54a6504faa7ca2c19cef6796a7907ac2801815e033", - "b56ff6dfccc3241b027a9dc76090c53608d3a16ae338238081a6510516d91d2b", - "b68d1a5663274c34d2f1679895645d9c854fc9e4e098ab6401f5c5921b00a5eb", - "d5d33c97dfd8fb8132c3fe3dcf69016d0400f3802a5e165e8bcec64ba204b84f", - "c6d129837aef2a7cbfa71bab1d6d30342fbb6f98531213879f7437141de6381a", - "d0de8d10e8c612fa0b4def7a90299e9b4723d26d1369cc5a70e215d4e8cbc0a6", - "7ceab82a8a2e3bde67ca5cd7e6a07c6bfe022d225d1b11a1ba2e7afddb32df6b", - "d636c6f195b9c3611972e852be242fb38527c86a115179b2beaa5140fb44dc05", - "9906c9e64b675ba4e412358377143ae9d2109060b5b375d6cf3c80b28ea184d6", - "053fe7ea5ccea6b3ba6adbab523984970ced599f005dc1953bb2ca1e70583dd6", - "a2807814be6d34f09391d95c2aa154c17a66277d801153c429891f0e91031ad2", - "bc6c292e5d96440105e37d4d5b2612c343402ba53893181acc17fe1488d8c5ce", - "969ea992063c601e498473afa64f8cfaaafd21ff60bf101fbc4b865e23f08787", - "3c1cc5465969c9d887e05c39a4e007b925fc9a64d1695289d6f06246c830e9ad", - "c54022ec1a93f7adf34b85d39a3bfe2d8cfca3f682b32aa844be9b0763ce0937", - "f0bd3e5d77b40c17affab839852db66edfa560396bcf17df3f5166cab818ef45", - "04b877670287c00522a7d2f88ce1765ddcd8069fde47a274cd5a40f67a8145c3", - "4a95b4c3bbe344477b48a385569c23465bfe6f420014af921d76d3fc9e6267a4", - "ec5440607ed9df2d9a6efac3396e36b32cb14d5b0e9aacba120e009ec0bc8a15", - "268e19f6f88255b05bdad4a3d5bcfd5d0083fe62d0f4524b322fe390a0717952", - "05f87abe3a91eab578d44be8ca18e0a8884c0bb06c0458404c522b783a7675e5", - "68411a58fd6b2ceb24c45c662277816c90f12b31ca9c13ce63d0ec0aa78223d4", - "ba692b774b3f788371f9eb59d3e96dd1cf560c7b6453888b2b2a560069494d3b", - "835d03e82e112da9d1dd238b65e4c887aa87e3cf623b8839916a6a591d9242e6", - "362389953b41a41955ae5a77ec61ad727f332cc3af9a0bfd93afbed4c26b3b69", - "d2aecb7000d9e880c68135023389860140a4eb0d402e596531ca539a5e7f3d27", - "d5cde26d5c13ab380bdbb931671123be21d5ef7ea6fe1d4d7a75d8257204aec5", - "8682517cf251d3ab20666be3838daf50822ecb941073c3fbfdff5baa631b7ce2", - "0481ff744e911395c53b2de62e163bd27c0ebd640f781e6c6a9f1fc6501d731e", - "d22141fdbcfb02846758ff2a015029f0fbee77b3b9e982723ed5155303139208", - "abf6427aec1fe39555108b1633cf77f26c1e713380ff4196a34a781f4aebd4bf", - "a35bfe99b5b0a560f667dcd8e32ea0341dbe3c9207d6ae50e42f53773461ab9e", - "6564ea88ed64dedf595b14e84ebe29480e1de3012f6763cf4041e7631bb887ab", - "d022fe2b35ba9630dfa1739e8a3a6c9a1be395ad3f29e7bbf4796f5c2be0cb33", - "12989810fc7f72c6ffda6a39cd704319d5f8d2abf3798a4cfbfad0a138710796", - "61d663ef6f18ebfb0c5855593c08272a51d932d79f8c5e4fa9dc85576f381fa8", - "df018cca2dc6cb18de756594221c485a6991e899a94ed80e19b08473b714fb02", - "7eecaaa4a95c871d0fb78f18bee9bbe8c28d70019a88c8e5e8dbc8aed154eb42", - "b3b39427d4f0ea8d8cd6af65e059cda2374a588ad680b491f2adfa1925276b26", - "8084401c6ce2095f7dbafcf39c2ea664666632e5e73284d0501099f687a8a6a9", - "a4387b9036eb8fc059a49b6260b355134adb92546b0861b9e2fada57971bc13f", - "130da1bdcab96728d131ea93e5d396ff51ead3baecfe0d8d3bab920ed26a482c", - "fbd3d9810d986640b7879151a3b1c3b630daf6f33494477a71586efa6052a122", - "8a0846fe688b7c5d1015cbebbbdde9f59b078e09591e0b9e2c23c6fe267a30ea", - "896d0659cfffe73c497b3a1017f169a87fca991dd7857d32bff8e46f4a16e13b", - "ffc8be27946c437fcc92b22c6bc18309ee28fc75e515a0586fa82f620b4f212e", - "104975b89818b5a29853c4dede5e6e1582db760d018c09f36f8a0d96783045e2", - "451238526a4177bfc4cd133ec57c6d19a2bb8f4c83d957a5fba57f3a60825030", - "686e00998be3913bfc2e9d350e2be44b841aedb1eae62bc52790230513e3186f", - "2ef53e304295462f87a604fc932e9ac1b81ff74e4e270f1921b7bd917d49ab41", - "d4a93cad4a0f216a195913acbb09778b8813c706dbc93e109980031bbf9e2b72", - "c26232549bbecd4c2b69e842aa11234ef86396d0375469fbd1a0a0a656f899dc", - "6fb3f8930f57abbb82ce6b343821a85b4336598f544298b3b9e7830ba96d9fcd", - "a7c6b9fa352be11fa40e4597aada8f7b9858850cf9219a0c7dc1b85d5f645275", - "a0d215e7fe029e9e1190ffdaa7c2e37e5365c4f371e6d0d6450c3396812e2d44", - "8de80050f7def17b935494be39fe3c2e6d2019d70ec85f9ad50c250b68a9a63b", - "f8c544519635a0e001302f409f8a3f66f649b87aa64f693f1f016648e085caf6", - "614e0ed0d2872e00ac3ff2cfe5914271b7d69849b67d5557c3cc114bdd62a941", - "9e94d35790d5a48f88737fc7dfb9a32dca404db00e999232fa703f9ba580ce9d", - "340687500be4fdd907db3f8eacd8df6ed45f3c4092d1039b944cf7aa46f3e125", - "72b602f977b7d6525d90fcc836bb1b77a75767e9bbf94a99303556a6f8b66b32", - "91f2d248e462faa33fb452f52a8c6758be94b5cb244a955b735ca91d4cd77d2e", - "d3123f26bb9ea16290594f7e136cffb6d1bcd76ed13d8967f7853f4364467081", - "4f3e4fc80e2cab191f7bae08ba92cf6d8225a1a1bbab9225e9f7ebd475d4e214", - "86adab2b91b586347134dd2af0d86499b8dc7ea45055f063e975745b8bb34031", - "cb6991ffe5d5c75fdda07eb4050d1bf5ca538a7d0fa828dfa3f179f04f4bcc5d", - "8d457d9873e7480bacf403f0eceb56d3c268314899fc0164783c0c324d4482b2", - "b00f8811fa553c5052db6d3601686b73aa90f7dfba5540e8c678372772371ea9", - "ffc05ee4b2fdb8c72b2752b020eed7b151bceb53918956adf38631eed8416273", - "d1dd867f4d4f41171d77681007f68c8177e7f650c29b84d8d589bb51f6d00daa", - "af914b7002540e0608f9b5edbbc0c044f83c760f6a2fbcb5f1d6f9e8f28f9bf1", - "0a1eb453b549d2bfb0e7ba6463be38a6c20091c1e124c911268e29eff7562d09", - "4a493426acd6464fdf559fc0cbaab8ddd0cba40035e293d05af238d1bd6dc5dc", - "91939754acf9846d7881060cfd854de35f3de80d997dd7ab6f903204fc6393fa", - "1988d003b3d544beb86d0dce19c6cbd9d05a760e17580076c175e53d54b946db", - "91ad14933a32e3908f94a460652187f79aa94f2aa05a46dff2683b85e2e16031", - "b1bd6e9536ab304cc4e5da6fb977be48cf31dc54afecc131f3ddf71bc1892fd8", - "7c7d15238f7991d6d7c5b708560a7472d128d5dfe17f87a9088b128ed723e5be", - "181e589798b727deb34181b14e3acc757f5dde63bbe941f77aa29fe5aa6969de", - "babe6a926702db1d056b35a8a119f893af0c29060bcfd8d4c0f93ae3099c0c84", - "5827c45edcf27165b02db1c7add1fdb35e1a4cf1bd94bb6da875e66e3e324f21", - "b290f3ba1910e55b67afdc1e7ee693e2bfe3d514649874ee75747f7e89853392", - "ed1337cc2fee203bb833f511b02a0b377feb65c2203ddb333f916d2ea14b9819", - "0bd081e65266756dacd09ad50fde8b1631f9bffb6ca1b02f627471ea9272e399", - "817e71b678ee15eca196cfa54d0b15f60b3d2c6d323c193ba5bfd841029f9d00", - "a784cb1b74cc58ab0231b808b8a490d410be2597dcddff70ad0ade5a1dd3f7a8", - "26b0a9653ca81d8bacad4684a66deb8ff4cb409ebdb5653f7415ec4ab1ca7c15", - "51261c791b6ba089587bb22810f2ea4afedc4b84697fd045ad915accf696abae", - "28302363e5ed580d221970036dd3dca12d2ec15a727ffd0e01aaf24a52586c1e", - "bc5cc2eca3d2cf56820a9b4ded982a72c34afea09f20a0d0b93cd7888afe673d", - "94a2217094ff1a50b8d6a4e69d7bfe284ab63fe176a8f458444230522d3ab37e", - "d84dc4d2b5698d4e22f8f23f9adeafdf623f4b441344ddd36cd8abbb41c6a837", - "7ef6fa9458fbf7d2d12090a70348ad2435bb6c4b73db54c5346cd21eb904eaa0", - "4cc837e062a23d3a24dd68266887c7519ec3b51885a2e485f54b61d48429507c", - "d73eeeb56cecc3355609e3650696e010964be46a99bfbfccdfdfbea97704e32d", - "f0bb1de2be451d400c0197225953e1f86c60028fa86e3e31e7ded3a24f3471b1", - "6fd5c1bde8667a016bbb61c3f1fe89835715ef3e837afd2cfda1495eb68f58dc", - "d28048aa36f47923e360cb6f559b02658cd1043e3d5b8cad71b1d286c24b3563", - "710279712a07918ca7d84f002d4e7bfdfb18ee9a96f7ac70dcded3bdc8aae1f8", - "8c15c15e039d2e6c3f9b624f513341fa59f40c99db099adba6d669144a0e2824", - "020feb27e28c808fe599954b9ed709bef9b8e21948b20cb921b8500e359ddc8c", - "3b99118647a00d4563c4ca40904ae43e13331ed3e9a8896d3db2b6be39f0d04e", - "97e8622b7974f12e15ff05fa484aa3fb729614c405444359b3879effbcbe09dc", - "5eb204b7c1bc6c558df068d9a9c61c5a33f7646b90e80cb8bc517fa9ee41f2b6", - "925ff69c95b1518c7909b910da098abddee93d7b7ce17f1f651f5dd21fb1f4a6", - "1990c849a3f087cb7adff9955258c252ec17d7277bc61f67bb0e2d09534de7db", - "51a063f2b3353a20b07430ad7834a1dd63bea349e1d4864615a850f2ef6be369", - "6189b7337c49c738030c6cbae3362da65bd3ee7600b00137b6d8da3003e1ab35", - "e3cc1be4ff52c4e6a6344a3c040ccf2397fa427f047bbfd081ef1af701646561", - "3c29f5c6c2cea066f8d3883bd74859f8e0ca915ad4371267fbe9d50261c96e59", - "b5f6bdf956d6d3c01fedd206d644bdef122831da5bc36c821c951565371e304c", - "f90f6a8535eb6d7ad535d51a476d819140eed044576551c2e0c17b15351793fc", - "6259d98f2c607bbac2837acaadd2ece1e414c7c65c9a6bcc184ca64048dca9d3", - "6a6b1bcc01357674feea51182ece8f29dd49a2049ed907bdf1a13782007de17e", - "a594977ef9ed6d19e3bca79f52ffae348b9f7fdf86574f186a63d36a32110b56", - "05efbe864dedd8c7da038dbbcaf7ef91572dcef73e7ccd5b7eaedc18c54fc358", - "579be8010069dcf0f6d8b16ebc09176c377f1b4e9098db5571030f835dc4c4f2", - "7cd838743fedb9877e14aa97bb8b60c8be69aefb6bdfc8899489bb03cdcf8b06", - "20f0c2f941eeb755e47d895af7b81045436cfbcbd2a26e5e84384a2febb1dc8a", - "b84a5406c6aee4dbd3d30535fad1e1ce096704d2edb651d7357a3d0edb6e2093", - "d0ca60f8b607ee4826a193153784bede46b4c142935e8edd187ff3534158827b", - "2d53d435610f8b1019ad05ea2816e0e09f9af8b5e44fe68e729e980ea7a4aead", - "66c900f34086d602394b51676bc297790c77c9ef324ccb897931d0c235e4204b", - "84d18d7df69750a3ae2117237548dd1e2653b6732fb38ffc5b3290a94a436232", - "f8a56b16efc2496cf63859cfb0dca69bcc423a2df8d69fbeed1525d5b7d84056", - "03451a9ad72b6e1e13869684ed9bdba293adf328776a62583c8d1d3d9568a5b7", - "f356b4327848f79502fe77621cdc2c78853d2ec8e289b57afca586357b479c04", - "4595da73e15117ced6059c2a5abcf36b7ae016b272b0f869de8a8ea61a1a2ad1", - "1afe52081357198add994bfee05d563ea7d10c4c6350932d63dca0164f621cda", - "3825a9518bc9387a0ffa7c78b8704a93a16b710160fc72145c81884f0326ba6c", - "b3bcebdc5fbd793eae94e69cf921b4ff4886120a42b7871be450c14f28c24e19", - "260878424b66a3a3a9a88c197212bc5bca48ca1ea6d2b711f83f902d44cff61f", - "945f9a8f1b59a4ecbfb771474ac1a8972ad92971ae1630465d6915574f16aa06", - "8397066dc421047b2102cd9165ffe40bf8b922e4484bd0aa7bda8be96f1e957b", - "a2528a62e87146ea0dc8cf8e3fd6f585cf144cc6c253adb0c61f597092e7dd03", - "6b7710011bae62ccfb6ec5a4f2419f5dfbe41edb03df63e0d5708028bc452b2b", - "3330eeaffe4ca2458fd00443da9a5f9ce519851869ccbe9f046b0ac042ad57e5", - "a86899dab7e6206ab932c47886a9cd027234b4034aba1b3e423724034f8678e6", - "7a4c3451f14e3dce56f0599cf1d36bf37ae7ba13dfc89228b24dd8619c4368be", - "1bfc76768b3c587d0e0408f9c9be5091099d78c1d217a4eee71aae4fac177e1c", - "8cfec58c1a4752c6791963e2e8d33b5767eed745ac1af43510eb1a0fbbbb0bd4", - "6926e74be004abe792a25563ac5d66115628f95babcf429d1179415305994b88", - "c3faf97016597179f7aa54ec2642ba8b9c9c6d002fb421f11cb009c14b1bd333", - "a7b233c299388e74fc683cfde876ea3e3a722acb574edda331d779a5a434c9ed", - "bf694ae1071d87db76fd5593b5009f8990495b3bd4342a7181b4de218760c85a", - "35c169062b1c2e404495009f335f190abb0e84868ff76fd1fd6d8d4e353be3ce", - "9e750c899db644d4389b35a12fda04de57b199bf51083e2f26c3caca84578fc2", - "75496a0119313fbf46fdeaecff4ea5dbed6384e098799cf96d2f71ad216d0167", - "d291278f4173f195412791c059f799ee20e4751090639f484ebf1c51a5de27bf", - "559992907144b7313510521a6665928a65749655cff05aa5a342ffc2b1d9d3fe", - "6907529bd571ee8e15d7e0ec65a990351c3dfebd43e4f1ea5ca9dd75df8a3121", - "d81b09558ed7693f6d1bc47059349893df7fea8f1f7576d6fb14c2a352015233", - "106281a947dd28997d109a79597793cd2c07e350f4e4ea8559b3e74f914f82a0", - "659c38af53853c1e7997b260129d47039b81a25461a322c8bc4b159af5280104", - "f1ba94e80d655368f0d70090283a8d5028d227d2daf739ce3aecb9aaf446f8fc", - "68bf643369a4a408bb93d86fb1a8d30214b062dad641aeb40485b5e9dbe50ff3", - "030231b04973884fff451ad6704a7efa1ff189ad5d114f283108073fb946ba5a", - "46d4bb4fc83b7c1eb7e90b3e275cfb5d44b58cc039a0e73cf1ccff25c2ce69ee", - "1fc345b6e0975bbc47604e1090df035ccd7f5ed047b24424112b5ac43c74d128", - "9a5c4c4e162febaf5ce7b4f6d0b3b7addfe83d49d873be4a232c9c519c7e3035", - "67f402716551edc1103cc70f7b99653e591d1f54d60803005f6db3bb655dc894", - "22b9534b27343e0be25944e23ea5307934ccce10c8c4c063372b07c898bf6f17", - "ecb0dc7caba5642059c28f7d3f65101df7a28943f4256fb9f4792489e23a33ba", - "80db321e8b76a9f0255d7c437024dd3420f889d00c5ec63c2afe82f152a4846c", - "5dabefbef2b7f93854b31d711286b9966e3f5cf2dc5e6c67cfdc0ccd82c02c6b", - "7e5e584f3a099e6f5b375620763f77f01325f5144e230bc3bc583f9dbf75d298", - "408d78ed72e5a0264a60865ec4e5a2dc714840bf3b11993fbcd1d18819cc4468", - "cd55dc735af3aa47a6c08d838c1d6041c23ac755b08216a38356ac5050d08337", - "9126e72afe907ed93134f612f4b4d588abf2d4bac391b7b5c22b9a827e0e03f2", - "76da71b52c17ff102c50dcc75cd44d47e1ea9b19746679d0a5471d3b5ce78070", - "54f19bb87836abc6a374f528a1418e92680b7b8eb65ef5f2cfd0c4ebc814786d", - "a121f01164e00fc7c6797e23ec3f94d37631967f6cfc3ad7cfac022169be79d1", - "3b1c3e6bdcd22473070afbb3c2aca0b1da37efe20ee72d36a8cbf6aa1f0ca590", - "f2ce87e606b8cf60167e6889f9ae7c90a86696cabe473a3d6b62df0a3fe90148", - "ea9f24935f3ab1da3f528887be1be1a2fb0bd1c95c1fa365282b1133ab6d7ae6", - "8719b64584953b6c374b9ffa376bc90b078f72b9fe83f1209a7e2f53b061a3c7", - "070e5000109eae5dea9f5ced8c96e8b5248d4c1a534ec9afdb2aa54dfd9a6625", - "1fbae860459c716ed523152191ba45f8b9e4111f9a9bbba32311563822e83214", - "cded8a3c9ff51bb315dd97d44dc948e58bfa57d137b86879c2732bb3e44d04c4", - "8614deff15964450da891ff3c19fa86b13f0a853425ec640d023d338ac8e171b", - "3efcf65db4ecb82c8b80ae63a345c346b65df13ca646248bffcdfed308010fc7", - "d4c4e9b23e7a896e60a1c4a7e013f9ccd37f3b15e3f47402e5491236dec34b3a", - "57cb87ba196134b920df1bbfe3460d992fd6ee34280382ddc4fa331a7f7e6328", - "e14113caa1c675ff5b2f1800e7f84e69128572f0bad93b605bdd3b2b79dabfb7", - "ebf77f969cf7954a1f9f4c6ba387d2e16a1be46066c121a556a86f2713e2f033", - "b69fc9b7aaea6843a5a34dcecb86b02bb2b6e2d7d761d156fa3e9dc1ed2b0f91", - "a7f3e2ccf108462c58cdca515a772438ca91f925306b026061e5e68c2df3d881", - "ee6e85382f591c410c90ccb7a15751da42ab6252ccc4fa7cee2b65a8e1542aa4", - "97f1139883602b31d1ebeb03c62a44311baaaa307d9d524ed733735f8f71252d", - "ad9d9a7d4e7e875495a45cc668966727b77b539a1286333b26b3ae39683b96bf", - "75aa2c45a52614aee5a7b230d0d2c5af98aefea76f92d80afcca8ffeba40d102", - "50be7f009d82b11e17a68b96c728e5f97b31e6be37b2bd9d1e377b01f6517948", - "89365ef701535b3e616aa8f971c6362a5e6fd05106995809d0636a887dcdc308", - "f602c213350d6ee780f4bc2beb93720b17b8c8ca5699c258c339f6f2ff53280d", - "1241851bb5bb7b52aef66a50f86cedce7bbec3b11ab69776a5534ee5e6d58cea", - "1d9c5b36baccde8e11416edfec7352320343acd9bac32043a5376ded85b07a9b", - "4e22fa828ac7256aaeb3c179d93d0dd01e4a618951c6e43d306c6f3cdd37326a", - "c00b4ef5af4a1a12470504679d45bcd3573d5628b9c77350770b5c7c1601e315", - "8d323f5698b5c458623e9572c7a0eb24f6b0e2bd37b0d21c890973fa3946bc76", - "02f4d044bf6ac47435762bd801c72b94fc6b6df4505d5cbed5df2f33f1f2395b", - "9b2b7364058fa09e6aed1407bed270d9df6c86ce547e9bad209e431fe4dad93e", - "e38c3c53086cb28eecae36d3e24fed1a735a36ad25426d270d32c87ece0d5c85", - "43e802c0c191ce66b608583ff8a73283c8e2f9c855b8062029196796bf9fd1e0", - "69961d9355b312b921fe53fe7848f60343707c9a60e9f0df72c5c77708178590", - "67620b53e0a884bb8e46fe1cdbfa0ed73ff7963207a4327de73b3ead485c7592", - "51e6a8a6f920da1415d549b33ecf24521b531e26ceeb200fb1ba4c03a0dc85d7", - "6aad647a6a277481a97894c901c7328f6369238c36928062085d2ef0193ad1d8", - "5a193252451c1f02eeb599bb96ae24c4738e4a6503ec36b3b5b484c3a9144202", - "93cf32383b73546b22e74d67e2e48548079c1407464505011e683ef3f36e3ce5", - "84c7cc4deee3522f2422df810425cf88a76d5881a7cdd4ef29d0e11e62684776", - "a667bc376246322b80a1b5b02395e2f83134171e553f2bada35bb859921a2b05", - "7dd57943a4c6783bbd0adfcce8d5e3264ee00e89f1d26e6eb9b0713b7504d14e", - "064a544459b1ae79f2ed3504bf9b35dd838c94ddcf323047704e449a89e91f6c", - "8ee46980ef7448fbf577ba5976caa693cfb205776a39985f13a68f21919c1da5", - "ab4fc4b4763e720b017b7b32ec75125e04310fbadd4f4b551a2b11edf6303a74", - "b04136696624d82f2a1712b1dd980953e6ff128bd811cb99fa444fbb7c86eee9", - "629d8089eac0a0c3e68e293b212efb2dbfe891f480221ab8f46fc39da6603e24", - "e3944ed2ebc31ac76d581869a187e744e6d33dd57316142a012d07846b5d4ada", - "8489be37e87fd48f1b6a17a049590e82604b8cf0c1b66c08392b69c56bcd7696", - "033595381481272606f50784cc59bedfa65f22a2a4a5ad3504ef1c16b362c30d", - "c4d8f1b086c734d768d1db144b48036db8f51902e8ad82d34c618a3d151e5074", - "abc74d93d563c38bae41267663742fe05d3316a99df6885ba8cc68e5fc965d86", - "5ee984b485367733eb6bf67b657e47af76655fdebf1e8cf097db33e35aee6eae", - "207f4de2b084e2a6e8d0c643dce903599029dffb95af091ac6e9b84195fa353e", - "fedf210d60e0988a71cfcf6af3afa6599957a7995d8560b384f7cc3183096eb8", - "fd0fac710bc40b7d4fbc4c3fb80c680b06a3ead7e56a133519be73a9480915e4", - "25e0198f20946dc0b95b04ff95987fef9ff70310c8692fc2a337bf82db68b496", - "a751407f72dd1d385d53b160a8f39d245132fd786465472dabba6434efae7cd5", - "5e28170c6f42136e411c247f2d0fbf2eff037b5fb24ecab7b7481ed38d6f535c", - "39ec9340bec818486865aa1d6b659211b2812c24a407dcb78b0ad4a9a8608ec7", - "ec70f088aa88729931130e6ae2d61b304da81d604322fe9d3f22d52460c55134", - "b63c11c789cf6482c0d9e91edf3174351208be3ee2f5fbb35caedfe85c70bf41", - "a786ab6c4d1dee6cbd619284a22160058ec82822b2c4296b60c6fef248fd1e71", - "1bf2863583ed7bc9365319443879305dd78ffe585c70cf18c4335a6d8138e8f0", - "a052d654f6e298785ea24c5f6b7b3b18d69e219280b52caa704cb511bfd2161a", - "b4e264f9cae5d62f07b0c561926e4e9908dfb47eeb940ef2111f12b809a0762d", - "0254e6c7bd29b3161f8d6acb964171bdd8ea694e9dc5474aaba7f21c48e7cb5d", - "4b5a122e13f491f10ff872b52986f4f28051bec0cba6ecb800f32654a2645d8f", - "5bb2eddbe200ddb781a7a869e689947b2854e80ce4219bf44f52c23238c66a56", - "74222c182a2fd33a1168a5d65025647738b1a71a8511a055c4a3f45d4e8e983f", - "05607ea2eb1b7b62dee4a7ab9cec78b794c66b4320e63d8a9908ed2d8858d16a", - "7a0eb79bb94a324bf9d9b8e88faf961bb3ad3defc4bba3c4682c3e41add8f281", - "978a93e7fd3fa7a6382b38286cb1b025f89ba4670027f728308f536f8e3e4efa", - "3595a71f8c9d8f8697d246ca2e296bf5d7f9fe37d7db688189bfb5c457fb4dc6", - "4f01e278523aebe9b7893d0815486e5fc327e37cde1828b50c77b5b79a628789", - "f41f2d9aa95fa9d7b500d30cade469b3b9a41a79271ab4df372efadd1650069f", - "dc64bd89060a0e44d17d5864a105f17af52c5d3cddcaa325640f62567a605dc1", - "0994e5c5f8a40998eaf47e4201775cd27e7054a13c88591519a2f1ce4586dc69", - "d16717ce37b1f2e57e644015a05a4a2d4676ba5e12b8193ff3699938a3e7fad1", - "58890034d3e37d36e33b161eb4ab44eaeeb6b61b79ec7da4085a6f85e1aaeb3d", - "760f054d8323e2bd97426153a8828fef26f90219d5e199356a15e5f0d8c56896", - "a3b4845e1dae269c53de7ad69c0277f412ad0ed750f25abdb1e543200f465ce2", - "6a625208ce9ab76d0012c6d1c97d34afcefa3725e91c701352c0287b7b9eba1f", - "b8f21e0413c7b5c1ae17720f0d1e13bdb05a58e846afe004d5c2f5274c615b4d", - "5aabc9017d3a96e0d75951adb14ad45460caa0011b8e083674061bb04f9bbcd8", - "6b2a368c6994c76fe016267d20d1ae9729e5f375689f7ed3ddfb94f38c94d76e", - "6c997efdba0a98140d38bbbe2faf62199ddf685d7626f0251eea96f54c7d8343", - "0774eda250a13a17d520b45626b1d19331a19d2f2c43eeaa4453790456dda5ae", - "b39ae56313cda7dee92b3625bbcbd9ec44bea8b1a5d50300b9159799ff92d6b8", - "07204d8288a64748ae69b0ce30a0119d810ef63e059ccac55fbcd436fb9b9487", - "8360cbaafb7e37a6f0f825b5156dae8a2d2db06eb9c92643a06435341404c13a", - "2bbd44360c5463acbcf8fa27d3e31fc13420ea07c53c617efe92b71f6799c03e", - "ddec7203a8504d4f0f01955036f9f31c90878de7191093932e314d7cf71af1b3", - "28c99acdd2eaefc6eb7da0874dbe446fa5c0328b60d688a09fc0be8291a69b9b", - "0645af9dc322a274ebd7581a61bfee2faf807eaf1a5c3f4c87840fad80250f35", - "9108542991c7c8fd2a56ac4a1f93b24088cc36de4aca02e5377a9b20d30bdc65", - "0a216e5854d968c49914062ccf36e923e02c7c50aeeb3a5d14b69966c8cd5200", - "d3e7346ed1fce1be4babdf39971cf84ca5ac5383ef543264777f7f40d95778af", - "5e52607155998be782702a15a2c5699bf2e78b15d2f8455e96b80275f146e44b", - "bb15349d9abb2b4a3e1536db0d08a3ae759c898c8df6793733d9e8d5625be01e", - "f5aff04194dabaf3b7a677b886911f602fdaf0b52d70f68b7dd6796ca8c34ab0", - "f6418baa8e22021562cfda23403186a6368036b938acf458261d45cb7c8ce9b0", - "bd113646a8368ff7995687a62611282e53a370a5fdf4e52e9721dcac8425a24c", - "8b95c79bb1ad99a5f2be280573ad8ba4ad980dfe9c3b8917f8d6f947aaf2a415", - "1ea133131322d4ce4fdcf1e7d85ef6ecefbbf4fe24de01a275094f0aa7d2edd7", - "b4f2df7c2278a925c1eedc4d68012c11536d61e75718b32316fbaf8fd6826d7b", - "aeab64608438406340ba228d879962be8a076fc1d1dbe7308b012234d1735d20", - "6714dbc48f78f15bd6ffb98d57aa829cec81a10fb1445dee52939be89fb1ad5a", - "8584b7d0a7e99afa2bd0f5e5d9466f75ca1d37c92c48da6fbec3e2a1d9318f51", - "1b0e08d281efdbd3b150cb5f3c4cd0f933c0418395c207b764176031aac27fad", - "a8d1f1170452b94ed58923e2a8cc5f0643db6a5bd37da1afbb80e6980f2bb42a", - "e899ce87f526a91ce778782a141602f9729d978a99dc38597c1662e0b2b86545", - "1776950bfe9e1c95679724c813732eedff02821959e3794ca0d0613e04adddb3", - "4bb1f3e8c4ab27df7d9e680cb2a4a6309c32c46be35d713a073f084430ddc692", - "95b1c4ade189715b3352669e23b61e8b4989e18d4acbd29563347338dad056ca", - "afde2fee8d356e7252d4acc0bd14006a9d2939008f196a8520f3281090db6125", - "147df02036cb45ef8a14652c8ed8ebb6b3ada39c4185f511f05fd8b409f459f7", - "f688247129128408c1db55b21b1ddc16260c634c6b61bd536a52cb328a771f37", - "e2036eea1292fc10b8c0134ed037dae8122952ee8ae7d0e777d0f3409b191401", - "d22a977505466aa6cbf3ea0d779658e993c1568e6e87a72e617b6f988f9f3e93", - "7fe8b5a6ab3218ad53e8dc2417551d538d707341b3d685ddde822fb458639dd8", - "85b72c3a9545d73d323066e554fab5f0bbae34d339959dd07b512c5a5ac4ee05", - "749814e6765b3d00fe2bfd458e2615efddce9a1ee74add98ca4c72226daed9fa", - "b9183b2716dbc8a8117ce13c5ccadfad80496d783dafc11543cea80d26459392", - "eba95b7c20949b41ec754ac3e264876d8a09b4fa0f1262e4907b6fd3dbadf92f", - "271b3ad17e864ff26ea20fd01a0c3f58b0ca9d75d445267f99b3f22c4659e33f", - "9c0413dcec06a9287f124a6f778b23fccaa13f0fbc7a5018e86cabc96cd3317b", - "60aad76f9a39ad7fffd99fefd8675f05b234ce58ff9afb383ecac0a6bd210e93", - "1917d29b2dfac89f4c232d0a2f5cc663bdaa07bb1b82dc6a4a131a436e27a4be", - "3e718eea51874c7dba850ff3eee9f7395c4478e825782a7688791255cbbde059", - "65b0d9098802505ff8afd4172616d635e15c8e74f9f97373a9eb08d6278c9254", - "eab4daba0210b00ddc2a0adb95f705d2e33405b23a56ef946e2e10c20ba6f87f", - "2a718eee072487f6ce193ddada351b0be00f114557ba4985065c0ad8e7d714eb", - "27848135a50c458ffd30ed66cc90fefec3c9c0526d9c24ff9a0620b50fb1c039", - "049eba8530857d7d419e98788a4a97ec7dda4734f1b274411ddd030d3c67aefa", - "9a1911aa07be427c42d9c3217f570eb4c8e0f1adf35b27ab87beadf896b5b7b0", - "88c30a346ecc64d5a719edf0117f04ac6e92218102a7a70d55171065ad76aa91", - "29dc8206cb32fc79f69fbb2250a8f18ead928b06af1cf11d42eb09f683fb3426", - "19b6479eacd69a7276b5b3bfd10fc45d1d9f2069d5405785db126557543b8f1f", - "1478be3684cdf62f1f4f2f5d9ec12b2ced3d97f29d05213cef16312deeceb97b", - "e8b3bb679dc54ac05eefb12f7a345657e21b93822ae53c698b5e56ebd5c9add6", - "1b1e0afbb516acac9a627277d53d8f936a727cca12d46bd1a4f06ff0558ca50e", - "6a2a4801dc1ad28a582c6d1b0bb9e3a6858b8a9cdd8af6f24a347df5ce85a818", - "bd1dca6cdcb141c723ce08db78fb17a9817689bb609ba2b818cdcfff7d97a897", - "6acd7910d419a89afde5e85199ff54b9cf19dbda4f026dbb3d913721c7ff1d5d", - "9ff17c845e0253bc836c9c88784efa0973d4ee6fe93ce3f50e6732c49e69b598", - "28b6cfc22f6cf0b4a92d1c3a211a7d2042826f44203be811252c830b934e8ca8", - "fc4fd9cd9d8cc8988636a01a3d47dfa3230d67bff742d6a0087f8ec8fa0e42a9", - "13f02700ae1ee2bdea63ec8304ce0150c7f4ae5db8b513d967319ff33165e705", - "03a2f4d28a27c2e7cdbc30cd02db462a1fcdf4086ada8cb454821ddc228f462b", - "a034f83412656f6cc8ce5573e20bf7b526cc66b1f9a3dfc3f669b5023d04e629", - "91718eaff1d0b4550914c9f65e9cdeb58c9bd117c9f3f1958f8e41372df0e8dd", - "45018fb7b437ba394683eef902aecf7281d4cb5b052ef7cf89bc7415f4dc3ed9", - "0378d0391b8efa983f99982ecef5e9e2b3e0fc0a911fce35a4ded66f3905f1fc", - "d9dc2629df0d9fe3e30afd2c681de5a84fb631a9d921e731e3981c97ea1a066a", - "97a214032ecb35ea502e3d7879ab1825a9ae95effbfc9271aa68f68574090192", - "7f4523c557e6ff1acbdd7793ca78ab7561932efa6b0db999f8c34a761d4c09b5", - "92c4eaad1b17107db240a9ae0e66c443988e46ca1aeb94d3415d05feee603306", - "0da1eff2035504d38b602097b3ac3683ed5ae04f3cac04a17f8ffc5b2e05283a", - "9cb115cc78e074457d01c68f388a942a81b90b3e7263b26685ab00d1749f8243", - "f28ba02070360a0d1608edf6c5bdfe0c112dbb4df63f972bb0cca902df7e0c12", - "8d96f23e7f4a9323b1b021337b49ea7e368e3ec395364b522a84cd420fbb0caa", - "1c830014b896d69af6df55804bdc1b40148ee987cdf6614663980803de5b46d5", - "73672dfa77f9e8f203a98275547b461f4716729f52a0c45e759c4de5ec6eb78c", - "12ef5abc0c01711a949a2f2494d6363ec1906ca71262e6da667ede4fc724b0b4", - "43e878cc8a10dec1fe7a3487f9c1b77ff23fb7956d32a0481aff63a799b35b9a", - "b61c7c1f0760420b519a8121c8ea5262b0216873aba5713b15a343ea6d0986ff", - "2634bcf35085cc4b8566f5f6c9188a741595b893925734cebfa3578974d252d4", - "f3eec280bca0783460b81edee8dc14a98f85b86fee81f3278a0cafd5570571e2", - "919e23a89ccfd8d5658ff36b211cadeb7b6c4b2e5ef4688ca6ea66575ef9f743", - "a99e7a2f53154010ec1737714fe729942e6b82ea9d7ace1a466c44cbb96c4e41", - "4afe45cfb0780aabf60f5add62b3ecbbd09f8fee7aa6db159af95c09d4f7d858", - "420af6f2391327201cad58c30780c480e328fa1f4242ea9741c9d9f5ce36f5d6", - "13b6a02fa4b562cdfa352e5c4e6fa59f6d9244aa3f8815f93a21d8f24fd39edc", - "b51bcb3959b7c36e72dc1fe6d2b8e26aacf0b32a04d3b4146ce816be6289f889", - "771c05ca32dce86ae705030021e75908c09b8b3a8faf7088581408033f1bd0ef", - "9c4424b2e71293e01b719405262170d7c204fe7ebc9c1c7d25fa42e0175992ea", - "3b3237a63359eb47db0bdc1f9b7294736db2f019131ef8dfe021e48f106dd96c", - "5db14c58b35d5501c1d4e916a08a0b941f7ba4175edb737dc0b57435701bd5a6", - "1c171d7366f5b210cd75494a1718adfae5da0658a0e235da62a7e9938546bb9a", - "ba403e401cf3090fa22c51ec02387aa7bcfce162d1ffdebf51ff9f0e8995eaca", - "2f0e33272c0f07a93d7ff300f0667b6e8d14af402ee7251c4147191cf08d05d6", - "3ab47423b82e44373e8d274ccab40805600fad3b74e9fea5310ba0f23a944313", - "34183d1074ac99a57f5c0b36116e69ed23b56fd74555918190eff8ee2bafa309", - "3baa2101a8e3cccbec9870ca450778a97568b0998d9b01672ecb5bed1b765933", - "4c2e0697384714a02bb8209f259e6e4358c35c13b6062c07057385afd41ca6cc", - "68cc2fcdf0ec56495996a9ddf5ff66bd8292d537aa4790a6766d3125d101707b", - "d1e29b8571881de372e965da333bdb570f8339e53e6abebaaf5807b323d5671c", - "af278b17eeca82a23070a4ad86d0e23c194900c6c1332817c1f9aa0d612c2f5e", - "f0752e63598499e3411930423f7e115c4b371ef418b17be28f79207044599b03", - "c38b54b68dbd1576b39d81ce0265129ac6afa1e954438c19fe945804908694b8", - "305fb1e0d04823f0552b08bf5d7bb85c849aeb077a02e8b23e3ae83910c66939", - "2db01078aa0ac8c90140b691b42f6880d60e45fb5ef041996e85a83fff2d49f3", - "fb3e41b181c0e0c7b082c66fa01360d0a7503aafafb49a1056dd204f5b7c12e1", - "b67a6c5db1790d971261089ac3cba409e949af7f50f0df342dcfc832eb28408c", - "1b77b878a4e72f2aaf64763c091eea4acda06f84133b4a6908d2f6f37ca5058c", - "b79e118ac6cbc7e136c9f6b3f3d3bbd0386ea07c7e03acb2eb8fa210f1503c59", - "2949e41cd99c5cd4b40c1881db1dbba0e42b203c866757d6c58193a56af6a688", - "83729a3bbcad2e5e9722c90b91a2ee425cd6b02918cd74780215ff28023d14d5", - "bbacae9d91af0d90788fb503b819f315d180eb8331fe0b853e56c2c3dc816aa9", - "3781d33998daab02ea6af32538dd83c5f15452d019b46bc63205adcc2dcb5c46", - "c24f543e1766e004daad8197170379dc42e467bf12e5589a5ccb0df3dba265f5", - "09baa8871a7290f3ccd4db9e414d2fff07c58b83e34567514687047c26d416d4", - "85d4d385bd2797b92e6f06f56c06ac4ff895b17e5ea69ee9576914ad469f55cd", - "763256bc8bd21168168846c7b71632062c77d4807c195f7420762039b7b1c747", - "9ce4032ec417b4fb4e2c0fc8d04d7d9df76559ce79f05e0fcd76f3427756bde3", - "cf5becf0c9db7ea441e44b76b1400bb13368a048ca62f2d0dccd0fe5000b02f5", - "dd63a5aeffe4db3cc6c56a12154d58c62b77c5883656e7b283aaf8c78ef35656", - "983729f869816e51d819a71c6dd26de00747af437f81cc5fa21c9f3632ce2ab1", - "46017ada740384f36f60b215d826b70d5344ecd26372dd841aab1c6eb9763b54", - "de1a816e44293ee04426ece5b67451384857f9c5363f39ef2c10790003452970", - "c8eb7c28caae393fdcadb921c8a16ce2640a04663db8f87c5376abc6b9caac8c", - "af9e86027e5cdcb55abbd0ed299e7a6a971ed0fccf15ca028eaf32b4cf27c23d", - "d158b4bb7451463fb34efa41527c5840358a1c04661cdf0fdc793f98bc48e7b3", - "1f1023329183ffedf356587952773c6164f7e99ff8ff6b2e5cddd0ef52c7a9de", - "12289b3251d39493cd11e7b3d2819ab78ed6dd12d9350e9e4e56199837a71f58", - "cc0c092201452e2ac12eee9ec7ee29878c489b590a856437dddbe2de9c070e82", - "d30fd3c07c946ab8433dd5e5edf314a88d0aa7eeb3658519936aeb41a8004890", - "280539e6eeb3ea62572782aa95a4204a4a7df7530b1185e587c3336ebae5abd4", - "b0d4e7fe0b68aaf44f74aade0661eecc892354eda6009399a30dc7189262d45b", - "9fb54d33d135185efbc8f3c31a4a6a4eea18966cf742be96d1301b34b070b7a4", - "8daebeb814bb74677dfeb4fb839079ce4e43aba28d1731a4e41e81ce37c03750", - "eadfddd209779d3d061a80c0dcbb040240ead6585810e979d2116ba5613d0c42", - "53888f0b27b9fee897f0348dcd9d09f84cbcc0a4f633e49aed2afb0fc0c4704a", - "912fc4200f543d1ac72b3ba60a4edae741a6e2142e5066f36f738c601cf6dae3", - "614e21d9378d9405c46c0d69bfc6f3f0848c8ec2b2560e633f687a96d2adf47f", - "92873075d48c00cdd566da0b943248a4334669467cf0195b6361e279c3cc74be", - "20ea51f06aff56e660e16d975a0590668fa27c2c52ae9c98091cc230ffad5225", - "18570722089f8cefe5e3a2ad3af473ed01f905ea6c338f2ecedd16e48ce3e0fc", - "9084c514d3c4f87d7ae80e994725bf133e2b240be16f4d72841362f7f4989087", - "b5961c64e7deb84cc76164d1092ea573222862db0263c0a9fd4ba0e8230e57a3", - "4b3d673f9939710013d2a18a1c796290560aba0fe11f95bf133c2dd053b8dc30", - "ed12ccf299d2be66caa6c0ad77a197142ce7388730865b14f6badef80fb93ab8", - "cd63a5f1ccee3c2f33113e2f8d1d88401204ee175642de55aaccffc5b08c387c", - "502f04557a2fa54fee3c546de6cd4874a23b7a3d93f748f7d59d36f7aa601c9b", - "a8804987a03bdec7e44b0729f58fe98c3ec67dddedec1d112891ba9b8d85695b", - "b4259d936855d4495af87a6e7187f988eb066c131c1400431688de938ef45b84", - "82a22003bb0c04acbd5283a709067cdc0d3033f996b9b2c748139eac7c07f0aa", - "6b659eb4a437dcabd55bc3e3eba5d17dc2926346f17d05e5c81f9bf652cc5520", - "877cea2c0486472f9b3cbf92203b107218be60871a27a3f0ef62f3187731b312", - "69c83c180218e93fc4e8970640be6cc8e14fe5bed3265e94d9021ec801668ee7", - "4b34ef3620aa98aef837364023e36dc2058ea5aedae8bc390839709e4956cd27", - "f9e9caafbe484e7ce208fc76173a726489cd5eb4d2b5609d5f0dff504fe9353f", - "a9b2c1cdd834efedbbc7d39a8dd934e63c2ca95931fe12be72e862f84b8ecf7f", - "fecff8f4fb96a673fbac09a2e0c944730b113aece9473c8cd9455383234a2ce5", - "7ec6f05bd96ccee9d0954435683507c7770256750123c55c55af574e85787f92", - "e759ad40e3ecbb237c724d57ea28e245aaf4ef1bc8d6517f9f40d30c6a33f00e", - "7d40c61f782b4eecda86e569e49b14a7390f41245e243ac05f707044e256856a", - "d083c4ae3b0cc777954ac3a29d514c371a47e3f09fec14e0ae7d4ada5cd6ff86", - "77c9e3e2c64df2dd93236a587448a35ea27a5bed1cacef4097ebf776abd5bea5", - "e9347877b09af419d26d4b8554912ee377d83bd89f6aa4ca17aaee799356aab8", - "15ab3e0f187ac4ec497e0fe025747986fa15ccb351f2dae4e88b04be94d44e82", - "c791343686deca11f37e7b9720c795ba3bc0b12010115c1e4076f3062f3c4a8a", - "703657e6a9cf28ce78bea3dd5d34b3b2a3c1798c5b72930039be3ada4f316316", - "497778998172a0efffb5de394cbe757a8943e1fa7dbc66f769c0768a3bef6a55", - "a778973d5e9cf9c3626bd96c1714475a5319ce59462a8e937d5b9649ec02f9f5", - "b1da28238c1f71f677ff7d3a4a6ec207986ea07e737d1559eedd672292586481", - "96d353ddbba5eef86b0bf8f5818581df92dad35fdd8abedf689ea2ab2fef13ec", - "56f0b2250ae7e66f39dfe62fc6fe02947b9962ac4c9026f3210e42d5c6050d36", - "d9edfeb9b14fb79cd49b12306ab2f6765bca659b81dd853c9b63b8fc2630ad14", - "a016c07f9b47d41c0a741877bb8600e11e945661cc3211b897bfd15ed63f4ffe", - "5d899106c4cf87eade5033495875048d6cbbd7f8828ddd72f778588ceb8056e2", - "d5f34f190a17f87aba08eca1c3b517c6bc9ed1118d71c2691adca1e303913618", - "34b7e0e3fc9eab90a5997a39e6d2077db9c93d89f379d19c3214112a20a9a30d", - "8144d962570625e57402d5c74615a01526cf88f58199cc2c4db3ce87162e80a1", - "6ef6f69601fdc1d8201948cb75d1c78f6cad9b0f3842f2a8e18ba247cc747f61", - "d20368f656389768fec585d5696d92790025c296d83804279865776640bd1d6d", - "1e17d4a89c996a286ac989674049625f77c0a9dfaf4aed5c771f15b0bca73ea4", - "350994f278719b5722d98e9fb626a0a6b13ce12830401923589bfd5e19266cb7", - "fd18ff5a4793737f08e3ca103b178bc825ec33eeac319cf5475aff7617c8a4c5", - "59ca43ab5ea47f57e12426581662f3c048cc75ec9dec4b11d9fac489a13f5fed", - "ddc58e31439eb94d9be9f2dbd181872530d9f00e67f810b2a180dc4ad18be1fc", - "a8fa1fb29e16350df010fc9d425f45db4b072c9c79dc6821afe25ee3fad193bb", - "4ec2126f1b2f301be52447800be54e92e4ead62273e85b12a6e21dea135e03bd", - "b9e656de5011dda404d656d9b051a2863817d99adebf943171607c3bccb57ef0", - "fc271f5061880073e04dc7718edadeabf8e392eea22421b5bfce3e386991f8c2", - "8a2c3fdf2f6a2f10dde68a7823530c9947a0f99408d47c89b006319a3c48faa5", - "fc0043d933d3b57145a6351d6f498833ac03ef7f4634b45e0745e71e7860cd16", - "ebe66d83476c9e244c07debc039d41a42a610492300901ebed9fe85a106a42c8", - "389d1fd794c1c70c1f25a76b65dd869885572e133ea91791b97e19681f1547bb", - "8e66b0fbc7f710f33a414f056d93ef41d7fe813258b474509672f3c2d49fce6a", - "b0e19c3c493cf29efaefcdeb5a6b1e03f076a97ee5cf40086dc55e1ec55dc4c4", - "71e4ae5a3697b1c3c9a5116ced068a60602a624198633c40a0777045375905c1", - "c87f6e4e8e13be9ab7af3ae9aaf2e174ae0b60064ca6b1827a2e293da9c0f50a", - "d36a7d2a3741d0a3bcc0f0666ae5cd80ee56c64043133272be9a4cddf3170d01", - "127712bc49b7a00879a3688d77d735f13b4497102f297f6239e0d75461dcffa8", - "569cc8cb0ed50dcbcbc32b542e23d9f58d41401cacfeb71460bcc09f02a28686", - "1bbc9a8b8dfd10494aeff157b6b92e4aa0f95bb80bf60af2cf088edb8315b1ca", - "259b05459c2a50a47df15398c0c4e3b8753ebf7d46130c9bcb66a8b6e5ee62aa", - "61729cb731cea4f223c82ad152bbfecec4642357d8bfab65d199577ab3f24802", - "f72772057bb155b70eff9d96693ac033a3d8dde8973d2e40f9e661ce34f520b9", - "01878518b9c3e4135d5d4caf12c3546e6d88ebc8b4f6c9e16d1f126efaab7c64", - "cf48e5c911bb5a7e9116293c07edf8260275f7b2825574d1a727174bb0278f67", - "b9c782ed15f7e6e32fdd0711e0d27cf9b1a2ad4fa7e25dc3cea300a4aeb53806", - "7afb7d15b4d09a7ed02c6ca1f40ef5cf4b1f6af8ca96821f4599cead776a1929", - "f6a1b2e8155af1d1d77879826e2535cb6023ba35705934380ab05f65bcbfb107", - "a73c8b79f975092f10660b852a41fda1f501c63975ef3b913bd39285988b4e68", - "0b4a5720758421f9a1fc6c64522cf4ab38968c4b212eabe52388167012ad5922", - "f0203de91d5c7262dd0397eeefd0e79deedc6bd96106ba23ac0d2e8a005e8fde", - "055bc47e203c48ce86ecd2b3bc978f9834ad6ca8d6e192799fe6be76b830da2f", - "0b49d0ee21a40aef4d6ad7ad74d89c13793aab7e4ce6cfeb059f1629217a41dd", - "976c5c533f0f0dc125b30b8d0f2c0f462328cc1f7e0d0b57739d2ad7bd0b5287", - "db9adf995429a7908c0b95af440c5893c74500a4cda6f3540b262e0442012604", - "5f9e422cf87342803d154307a206ad7f14ee0211fe07f5cee096fef7deca8dce", - "f33b878bfcaec6e09a861525f48891929894801718ffcb1b9554838ffdadbec9", - "68ad7a44b2c2023bb220f18042c8496a65410dd7697a696b16f24f5c7b64b302", - "a14c1e75f2d787b426cd71f3ebfb98d98578f5163b6fb824817a679c799a58fa", - "8c4a8095818cd3d5d4de2bfc4e585bce8ec8b88bb628eea2b5dc1a885d7272bd", - "9ce645987df257fb5d171454a69deed4cba20cc437e5ada39c1b0ddde5d9638c", - "d49def1049c9d83d776e9f7d621a982b3587e58ef581932b30e187c76a2ef7b3", - "e771b17327eefc21aa5bae4e23fa86c890b805e223d6ec67655c69060b8c3e31", - "fed893ff9d2db241bdfb0ec93c69a430d592505533564b5d40a2f217476b917d", - "528568c34620beb65ba257fba65c1969874fd1f47f292d6324245f4a13717663", - "fa920b54d53ea9658d808591563710b422f1b1da6d8f74ea00a1f513e84b76de", - "57e604d2fc0ffca5cccd4e5eba5313577a503e5311ce93264d64c264579a83cc", - "4e7b890ce088c80c69f84403b8afcab30c138cfe1870d2c0a844d22332f91d17", - "6811b21244dd331b68cad3b5e528369055dd2c208673d28869f9ebb3b14f2544", - "d3c28171a9e74c136de316f1908748b671929dd7afdd9ce64145e57050adea16", - "ddae735f29cb77c0c8cfa8c9f77cd2aae3abce6b6f2eb0a41348dc605dfefdac", - "9626de06de241bd32e68c64c370ce5aa1c7b3bee3fa785f4d78cb45d1bb174fd", - "b77f69a1bc80f431efe9432e2c3c7d79cb80bdf7a054e951a42e5b06615a1a2c", - "4a05ca7895a2fbc36e4a69d821537401173c40a99087aeb5f73ee1f66a3432b8", - "164a9078c61982d88916729418339ded6450add01d9c5b27005ffd70530c1b6e", - "195eb2f5a8b2c4366ce5f07e1a9b18054859a50fba12d05f644fdfbc376129b9", - "f47f4cd1d65ffd55802c2fd1c340e20f868b19b402e537a254973329784c69b5", - "e49319aa56e6c6a9a9111cd38df4e8d9f58895ee2f080ebda54f7b40afb42ed5", - "c0b48324112cc6b57bd5c173cb82e40ef7675fb773ac14a3eb8a966bfb8fbe6b", - "c5aeb655d31db42f951acacc7c7525a435b419e18d0363cdb03934a15372f0e8", - "2068924109ab1572c38aaafb0069235811d37df3a6ffb1c8df2e594418380e0a", - "f45a281e3d13459911afaa1f79d2020632bc5cb2e1f744fd3a74586824892136", - "705cf551f9b4c7dacd4af1b3924d59d8e006ef1c1acb8b51d63cdc1f5397ff03", - "298825d97ad6b4cf7aa422eb4f24f1c1af2a05dc105bd870f8c6a92c813bac1e", - "589a0ca62181b7d45d5ea42e98a3c18e6e91f3a438ca0fc4f07b37a352fb6112", - "2052c686432e1ec01b7b1db97e5df62a24e0201409a55ab8a0834e6cf925e19a", - "3d46c9c675693949f4d3e827e7920252bcd8aa423a75f872c7ec283ee131cf47", - "a964a67ad7e73bb7aafc76d28e3830f9a03b09ede0ca50298d9ee459ba0df23c", - "1ec752d4f46f7286ba42b5d7e27a16f44aa9eeb10ed51dfbc46d8d3a99b62cc0", - "0c480f8cd61e50d9b3c051be053cebad999490706289b64384ac9dfb1483d16e", - "c2a6c856ac898eeeaf6838ff2366a4f4047e6aedf68ed55e4bf7824912aa6fec", - "a95e5c5a4c48a116a5ba7c21eb9a4a1e40a26b42196c379fa7da12d0106550b2", - "4148771919b7fe31d525a3b0e8a72d56005fbfda404403d848eed887c2ce6404", - "7611631b6ee40f9c930fbb9a7f50a02c161f3c70d9f23906f8b514497a7d3711", - "97232b9a707dc660718bf12520eac7d2c13a6cdc506c34d15d181dd4533b031f", - "d57ad7baf95e980531b90c1ecdf976a503f90b9da69d54438db84bf5c8a75cb7", - "9fb8a9df6586d7b88289c1b1bc4108b53716adb226fe5a02410a2c786870bafb", - "a2410ac85db109858a2c5b091c0dbe0f01ec87d8f8e6640c09c112bbde53f58f", - "67d717cf6bf5050aafde320aa0df26568600c79993adbc5b4be5a0094a89964f", - "178b6337b5014c13c8003040ca83106a355304caaba242a5e32158992476b81a", - "1916cbffc6f3836235c9460a4f77ed04e7d55bf277744517e3d72108b743712c", - "439b5972913a619ea476ea76a919ca5d622092b867e9440b91c4c5f72bff0a10", - "52247fccac9f43eac1b8ae2ca783a2e0e3ad05070fbb51a7dc9506ce3f5947c7", - "4e1dc61320f863e0084a7121c25efeb251eacbaf641a156e769e6cef8eda9bec", - "ff8617daeca72151fe2ecf0cef7f5957c921c7c6a7699e2bcdc183c49bf23bad", - "115c77b2255a50b76a087589a12fcabb83d61a6020431ad47538077a2470d732", - "8a8ef4c82405388bd4e1916e85604db81344ee44936046b2b30167da70dfba4b", - "46d5a16acfb2800970fba859cbfce21a1445095ba063ed25a56ad1c207556716", - "dd079f62a4ddeabf12c54f2bbfe01074035c0c28bbff6ba9cc6251a0ddb634e5", - "e31ff3048112afbe6b65033aa3de5d2704ff9e3d5242d637fce3c86e86f6268d", - "4c174f74b5104be0ed00dfa7ea6ed79be4572931edb21141b9237f0fb00b3e35", - "9f30d620acae0a0b1cd19ffcce9d50c882b8951a3b077d49655269715c837af2", - "7f5046fa4fa6ef1ce5eb92fdaec1b43d754890523ec1aa87846be514fa51d875", - "dbca0698ab5e8e628f40a8ecf41fa95f1885a43fefb0e425be210ca9487820d4", - "b6e577fccb6e552141c5b2049ddcd3291fdbe2d779db3038d909d39ce6285f20", - "c17c0338bce5af3e4355ee1a80c47d5560ccb9c4580eee7d0fc0ca9bb5857153", - "0a1fb6ab422aa1a2b7b9cfd2c0a280a0070429c7f8ef9cb5bdc1c426605c2b8e", - "af3704193beca0d96f5c7c79e898054cb57f37f6923adc4dca27d172fb9f9d89", - "8e21afb66c14c1586b9df968462a93cbe2091143e4abaf1e63144ad18249a9a1", - "3b8f0cc1d0de3d483060933f275a0449a146c4f6507232e7c0128cd479536f40", - "3010bb7590f1e745379f41e4a18d5397b510621962042bdac7389516e37d6e15", - "e90d4d92e582c0463d844c2086b986d119b3bbe0b7343f62414e8c62f6027415", - "24a782631d973329cf2063edec5bd5ccf3c984263cd9f5e37630030bca70ff20", - "0c85472c5e4b51da5d87a851b75e5b9d01d3d38171413ee4ee8660caeb67856a", - "0a1f6db8c788bf491c67e6e05abfa41c030864e71be879e10c85a0e9c628d712", - "ae38f33b5dd89494f03e2ec5c3713caca20961a950133093ed7dc9dcc13cdaf1", - "edca5166159b8fb3488c3670bda1215fa88b75583823b880c2c671cddf97fecf", - "4d6c3d9f093b9e14f9414d3d63255260d69e927c08fa9e2ac00e4618e0ec30d6", - "9ba03e0a6d4e2359452916e1d40d89320d4fe7ce38121a1faa2f1a37107ed697", - "f88a338ea8dbb6fb74882e1231efcb1765d248d4ce54f8d7e871036c4d787c73", - "9c900b68cf4fe774d7b0a46daf257f305d3c406c17324807e5d1b0bf1e2320d7", - "b7d3dfb686ff8cb43b72b23741c2bcd1a22d75d9ee8a5ee983612da341323771", - "bc55d4c33b44fd1d330925a710cc9fa305bef2753552e0ed7730dd1b13848b72", - "3094e13d0d9692acfaca6346237f8ca6e13082679f3abdeefa4ba072a2381a95", - "b0d9a8dc39b9293fe4e85e8b7aca04474d33fea7062c74816765994b315c37e5", - "8a9917357fb11891dce4b3944b4f30b2258997977a1091a9c17a0081652c86d9", - "555837f14937232f650ac0162bf5453304a09ac9323503cef6661d39df8eddbd", - "b65ed338fc233c1f4dc6ece8b6f42cd705649bb1d7f94f31986fae33def3dd3a", - "f75ed5e70ca004ea1b464dc0c609dc3f443e26b670b0ae4baf4379679d31f476", - "0404fae6c675dbc9309279dce38035a356e8d432dae7c547594ff6602f5984d4", - "390e21f4fd7f3e9f060c2ef592bc02fe3ecc56d38efa9cb935edf456a5613f6a", - "cffe8ba9dd33e898610d620fb9933ab1b6525aade01f16ddaade0b76758aaaf2", - "952efb04909d13e52571da89a469a1254a9708b86d2ef94000711265670e410d", - "e9d0d4bd4df566c48a7a4b0687dc5592c5e680e9b74fe66ef9630eaac18edb88", - "a256b122b6d51c7106feb3383634993089031cfd13af687672fea8be3a09965d", - "157fd1f84c787a99a0210db3c16a5beccaa8c9685fa5ca45869d3be90f20ac48", - "ba116fc9d6fcb043cddeb767dcaf0e03b4b58fdd541c2396b3b0f4664030ddc0", - "bab029c4125467163182f509aceba7c56963d6b454be807ce51ba860da4b6473", - "5d459a0c19020a8e27e72f862953681cf85b1809f12fa2d90fef8046bd8bf02f", - "10f650cdc1e63fa9be6309c5b3f117f1639992b0f4b5bee27744f257ae63db8e", - "212aef207e741e8e5eb7edddb8687a9f1c5a9240defe83f23983f0d4bf1ddfde", - "044eef813db7182d1f39c058fc979171568192c8f7d14f8ee163f38902426ce2", - "fd487d18efda288cfa70fa2416b62451793d1dbbfaaefc5d5c66ebb635b87a4d", - "6fa61cbd782eaa92a8d80e349553dcfedc89f2deaaa2d8ec24c91f0c7292be55", - "8543d89aa3c6deabeec32eeb7f1c5197c3847980ebc91a6033d377fa885938ff", - "eb2803b3854868000cf68093b4cba2aafe9273292a0e708ca5a746051f494350", - "d6d07deb45c34cb3d56d7afc61a9440ce45f8cfe32462e3d68dad7579f5b1d07", - "dec651ee22d64f54125a16642f9b6c4392ee6000cc48b768e0bbdf58030dbac8", - "1be24d308b8c6d729e13672fb01fde9424fb0d7117e6c01fac4661b8e6391d31", - "556deb5a6fad51bca174186e666b234a2267fc7a42365e7f6c7d27ea6e0ddf49", - "3acbe206dd2b5183f55c0b4f63f72a2501013c2465910f3206971c83e6e7889c", - "07cef1ba00704ff0df17b4e561e27196953df5850d917aecf8d752b6ec43a4c3", - "368122393f7c703beb6890fc30d8b852a9a52a8a79b4bd09d92773c32c3124b8", - "0e5fc95d8545ce883c6b839964ce1b03318fa227c6d4871475d6928b7df5f962", - "d07283e3d1a02769da063342b395ae290e1549c3ed2563ab6ec44f353d6fdaaa", - "d1ba620cc3927896f33352dc4b415ef93e31dca69b90367a7681ea936bef2a98", - "2b7f99caf9bc268fbc264b784e68ded8ed074a024cba4c5301eb6ac940a52cd5", - "41862410bd1cb48cade7686cbeca46dc226b3f1b68cf793770b9a79b2b5f7b6a", - "71130c5911a6c438ecfcc3bd3554faef2fb682be646cb6f4d08ea6d8fd16d35d", - "99116171eadfcde7c4c237778f6a99fad5a38484234228aa4c208e907a019bfc", - "989f8c04033c1355144911a136f81dd4eb69502bf7a2d54690c5d8ef9932b60d", - "6d69b79d366e778e9c5728c3706dd8c907d2134277115c1e1afa99aae99b2f67", - "e458a87953f6e92fa1fcde30ea8a81f848523e1a27be88e3f27f0ca568a8efa0", - "19b6e399204001f3e32db326e5c462bc8ba5079e1e41e271a9bee95b2949cc9e", - "b71c40bb29fb5aca2d40672079aeece97ecf11384523c1c3cdc797220e91ba24", - "a95f72b2afd70243766c8c90857dfc5a7025353cba379880f92fe3265593bcf9", - "b6254e418d83622d51f5996e1bc28bb82228fd24f5b77010b56cf2f9168f321a", - "a68a7236c87aebdaeed74a7ffc5e1bec94624abfa0b3342cb136a8b5a0e4cb9a", - "04f5d4e58642826124e47ada599cbe7d32e5a958c4471fc29fc4146267cf4ef7", - "744e3efda77147c237298c587e7e3c440bfae77b1bf240419c16f0fbf4ae5e1b", - "1557a13269af8b037f7e4fac5c2e349bacd40b2f4f8d5240fadaccbb70b19f25", - "c5c8321dc6c761d2310cc11e7135b73aef0e08dc541aa327b823498e9e7596ea", - "09cb0df0222603305febb7465f7721d0d8329242974c15111f3355ee2d243569", - "edc4b2cb82719ab22ee8c720c0ec543e1c1e3fb9f9d0ba274274452e60b080af", - "59bf8937600f91ba13cfe1152fc8208a7c3e6375676db6dfa124d852f0a52c4a", - "62c11de9902c9c5d95f8520a17cfbf2eab5218e1f5d44288d7d78ce5ebe3bc1d", - "de4b633566d7ca9f6e917ea504101728a85896221e87cb0714840f825c3582d1", - "4ead5cf29d8fef618ef7c3353cdafd8cafa168136714aeab3e3226aa344080d6", - "89aae082bd72962c215f721e13ad962f86f1c05feb35515bea7ecf32d72e8032", - "52e2f9f6d2051cc69046ed1dc21c99ac8e2a417900e2c871054e8d1ef6214015", - "03268e4239d7ac8af827d5081f836e28ac1afcb100642c86e26d63d2c0e6a18e", - "c4cd6c9cbb760d1bc691bb4cf062d2e7a30861805073fda457e363964a7ab7c1", - "2986332e588906c55f9b1ecb7bdfe69c58106fc984481d0b5f087e35dbb851e5", - "62bf9be4954927f9d889de5a829b4b6974bf702bf0e953057b0a11b6cf4fbfbf", - "faca5ed0a14e58bcef5d0e6fcfdcdd1b397a0299a8ebb80b966e776186fa0915", - "04a7940f943aa3bdb58a9fb21553a3a40f28c63e12d92436aebf90aad4cfcf49", - "173c5d91cca45efdc8c3a1c13cf9f754e67bc2567423044fab441dfd140c0644", - "8a7ba0e0ea4a259ddcea3454a83773a142c8ea6630d666fb4166cef363c3326d", - "9a8fb7ddf645a65e6010404c09f2ace660c86bb4f9cd10a9774d6442aeaad6e2", - "bc8f6c145ead1cd44cb2e36f618c24c931250e94687a7d58fc21fdb159644b36", - "04e9a3d22485d48bebcff5b2ef1abea16a79ab8618235a41189781fc20f4a008", - "bc645ca019b963dad653adee8aa6f0661ccf172365ab4d81e904023241c3fe89", - "006aab10735247fbe024c43309113240ea71586c9d4f43be3d14676964d4a57c", - "2f08304b60d6b8186ef1672e14148d2b9ea320c9f36f8ea6584b6b291af6b66a", - "364c4fd4eb9c7608501fea7cf331ad84063c48e33aa7370a5058e0f841f88d37", - "fb4d5d5a326434a77d6752451becb3853e2c3105ba8e8304a14e7767f15697b8", - "39e859cb07cef94aab364f5c0bf1a14b28d17de536652e63ca74624524885003", - "dd7fa4142bab7ad60cc4a613a623a4489552941274c4b6367fba3f9cb5a723e1", - "7b9379b00fc612e2096f4fd9a396b65150fcab5234b8fcf5d6a3482c1c3b7329", - "a0c311f5c109c933e2ed7c9ae6278988cd3f276fc802921eaa5b97d81c777946", - "cd5ab23368226ca6ebb253cacd259c1c7b3f7e5e7e2ef018525bb93c08062e23", - "f46c32c374e390cacd54539f087f44426b5959248ea5a8e66d12959a7dd1ba24", - "d467d1e7935db0a043fac55c55e0662a4661b66009f67dc6a0d577adcf195b3a", - "4c66970426bc7d95db6ba1f6971058602e71b4498d0472fe84fb04a179d29d70", - "c7f362a00c35375720c60b7853644f4e071c87abaf5fb41fc252a77d87e057b4", - "0ccb496c1dd8d4c5b847e09df43c8b215a56889a0bc4c586dce1d27d47972a8a", - "7a090023cee9860a789930890b031835d23a9416f7dbd280c2065902268ec51d", - "cf1051b60e02d463c348f8ef4ae04096ab7a62e5959893c22c7a6ca99e33ce96", - "65ed5b300d59768fed4e655928b028caa827dcd25ae5592c1467051a36eeee89", - "d67c60663897bf067737f18b21878dd423f647268b502ff5c7475628601f6f7f", - "6ddf7905cd8e1ffada12fa65ab76d9e8ef015775c6c5ee19b872ed608f4893d8", - "b3821fe330eb72781110e5ae2304666f7f70ddc9378fdccb01b106aa4e55a0cc", - "538bd35cf28db9abf6b7e8add7f8166df2eddb436a1ea3351aa4a6bf71324251", - "6182674080e07a6d9ab5250d28236e49161d9473bd707643eb959ff5a41baf21", - "2a2f127b9549c825a78438220a9ece68da52bd994a13cf20c00a3c7d6782ffef", - "2daf4e21827b2ef1c7249f6bb7e1b7cc5b360492bfe27c53beed0b1ec7f0016b", - "89876f0f1b1ee05740ce30179b7e0f238264dcd111532c0502bad88aadc6c2e3", - "e10687f8634aab05353f21532682571aeec19d70ffc169fd0ec5587ef5aa91fc", - "ece337e456976a9543a8b5e87f8093787d4c21bdf055ab74bc9319f4b343c030", - "64f0996d99523258955642512f9e570be33546e147439a2293c558bd39824d1c", - "ca55c455d9005dc6627ccd0d2966164b55b83d5caae423de1862c34048304d88", - "bcbe9bcadeefdd8b3d69635f6819e8f6d6127565ee3e46bf56263ef1ee1cf9d3", - "7cfe6ba4336b4311c9e454b0076d3b89ed8035da31e526c03df0325f85a0ea62", - "86acbc4697c073641283dfc62c17e987ef4324b24f3a526fed5c807a92aefad7", - "e9748f2cc1f0886ebb9e1613d637b4f1ee65e363f0c07c67f97b392708ec8177", - "80a258c4cbab67073203063f0cbdab72a1491c08af6ed0109a2b635003caed2f", - "736f0367054892c7bfc2b0444e0feaacb8d9cb795d2d8c0169a88c16a9975317", - "5e5365a2604229210b1183978b38b7eaa6f07b2a8b849b421e16b3273ca714d8", - "077a291d951202ef5be2bf73f6dbd1edec71fb0818f6f0945ef57ea3b4e57e29", - "8213c320257672591468a70e6a409aefcd5780e6bd1dc4a50610f533a130e681", - "dc40668b2a7ccf300b0015f172ce8dbcf598b86b6c1ccc3a3f9a9ede48b03e29", - "3d8af7072d9ca2fc8c3087972c3ccd425e7a1f6655c9740fc24774ff72fa6590", - "8e858b9ba2aa4232a977dcd73e59af8800a43d426f7468a94a75512deb4e4167", - "6fadea9900a0b06c8c82d5a37d85e1e63f3ebaebe7db254f77c76ef1cd970db2", - "b343e7a0d568bf746419d346fb060ef56149ab710e1ece1a71f0923eb76db368", - "44109922a0a8479092a635abea5f9710a9593aa52e7cb86900dbcd33ad005c43", - "03b445aefdfd8d206000e93c590edd8c8ce7d519a6ce53359abb6107c361ae97", - "47d2b15378cb8f34dc3e716b6bf7caab2b2c1f5d00ed843eee7bbaf941ff07ed", - "f70c2e030dbd9ebd3e0873feb43665624514a948a27726e6ef8cf1218ff63210", - "d92834d3196b280695cea254f5c193711e6a067afd12068abf600b00fb6dedf4", - "f2df0efe683f18531b9e2332f14233819464b1478e5dd1d16c4aef25e48427df", - "4faf782d2f367bb0d039c8b812e289206e42ee3bbaf844516b2fa06a57764d07", - "9507cb040e0e46b8b0793865780f8babe89826ba6bc86d2fd257a4133650d3bf", - "2e3dc522d99127397b0f7871862a7fa788ce1e89390520607979f15979d910d1", - "b133dc55782262a62ad8ee7b686fa052b27c05b23b2e0b8c4ced295210ff7c1f", - "efd95e217783d4f7e1816091803fc704eee026f766d2cdfcb6b5332e070f56ea", - "3c9dbd9218f5f9fd410b6e322c26fbae8804d3b975599f5cb4fd1ba20507bef2", - "3fb2abf32001b949638400dd02d9b4e520458fa7acd5f4c8fbcc5d245bc9f355", - "10ff51c79d9b5f52e66f7cd98914e0c23d10a0f069b4c21093b65143abd70acc", - "0dd84b881ac45a8f327c1e66d34817b985a5e7a322606f10522cffe9a3ccba5a", - "51ca790dc81ef302cc3f0bd07d1cbc0fe9d2141cc6f992de2d4c68a8e66012a8", - "288e76ac9aacde21c2b068ea550c6f7303f3491c6ae614fdc92857df62a0be8e", - "fda2c85e9c1320a54ad811d1d5ed7037239e2c172f693bb28dc192702635e04c", - "7f8fdcc04415a74ca9ab077e854f7a54f98438be62928487d22b9aeb82462001", - "7b8a48bd3e53eacdf5d6a3cd396ef5477ba9d6cb18e416bba710430a0644e2c4", - "967467b69dc57c26cfd9c05db39fe5d9d47d1fbc637d0979ade81210888c676b", - "0fa4fe5d456738aaafb7e2948f1938fc2a5bf804afb9ef08f26ce93dfd687541", - "36af33f24839420cbf8a2ef839c66601f479bf6ebc59331b1733646954e664ab", - "a081a8ab8072c79dde5eb0b6305a02cbf37e8e8ddfc38682e1536ce6c80dfd7e", - "6e21e6575c3e12600841efa0d9781d9af5fe78530e95cc2e567e9e0109e45a0f", - "85508232f4bbe9e7fbd3e2160f2eef829fc26ca05c7a1659704939034e2b3781", - "57d3cbdeafb4e022f33a1782789391c1c82f7dd606b12c96fe6d7c2a90702e16", - "a7f406659a0993dca0f28155e8a7099de8374e016a081b302bf102e3f8a7fb0c", - "26ae15e3b6516ad548c78083625d3d5bb32d4f70f7b82c518bc574b182beb0ce", - "27a145b379bfada994c1e0d6d84ad919f0a82a11635001d438cac668b5b0d1d5", - "eab265d14c67aee2dc629bd73dcd69faf93fcb06bc54bee27a7f6ff32183ec4e", - "95ef8813b144a5ad6deee550494022632c26cfb69d9c3fbc6b04409c542bfa71", - "edd8f460a0a07e2d64f47241186fccbb825829f9c4b9749e617286ca4d33eee4", - "f55d086dd95731ecf724116e8c3d16e7245565074da168b1c68089b69338c275", - "930dfa4d9ccf8f596ea031f386f738fb738fcf071f9e066eb4d2435b064b1c45", - "2b2872cd3d400d4497658bef7aed6b579a0e86e841653e3b031aa58b9023852b", - "0b7be25345fc384f9a843424040de14e901419cb572e6f9c88d6d4dca6be08c2", - "0356ff0caf67179b59a983ce9f8d3f414abc1dc7aed75d954f404ef640a01f72", - "16dea2b16c4a3c70f09140f8ca3b61f18c54ecdbe38faad56065d2564d8e378f", - "003b7a92b4e9c60883a96d789b81300843ceeab38d202a42a4103485dafa8725", - "428a02e14d8288cff3ee4bd4eaa9168fe0b20d900968432941d22ada68a087c7", - "fbff72a1bf38daf5f46d95fd6c4cdda5b5c672c312716e6c054931609c230e6a", - "63fe14e4c6538dcb5a785ef421f629bc11d00705d11106a1352c28c5a084c7d2", - "5906b385a2702ba09822c2f3e9543fbefd32551147c7f33d4853d9c48a48218f", - "4722a7c00d1dbe6a14ce00051ca1e02c8d6352fe365cd35790c1243cbfe16fc6", - "726a046a8ba4f127027db0b2aa3331bd85aa851d1cd7100a9c2a714e1fc2c81d", - "96a481fc76c41506c7f85994466bfd5f249f9944ba83a0b876abeb2275f950d8", - "30a53b5c419f3f4118f6e1a1465d42a18b1b9d0efa81878b0dfcf4e8c11a6f0b", - "91998aa95dc235ad24ec9f57d49bc7254a9922155d1b104de0dcbff3cc7e714d", - "fd1c952aeea5361a96a086ee3d61ed98949d098cdab5747590bb11cc2aa98562", - "36d412c7cb154b9295f179f569502af484c35eef09f9d4ef19d7776bc55ae1c1", - "f81ad7eadf14955742c2fb0705eb5ee7529b3e834d61e700890c070f0b7a90fc", - "81e71fd5aa1bf4c7fa611445845ee8a87513a0d144c7b9597ab1d944e7025c7e", - "212e2ca07fb425a4a06d9d5c8e8fedef8e01ad957a6380c9f36d1d68dd3e5121", - "e3ece41ae913502aefd67893cd956bdad98271f1d0ce640d202c9217d75b6e05", - "6eb12282a37a548ce823a047399cb4c4de08f51c0d992c38e0b8760e69d9896e", - "0939bcebb6efbb934594379f208fff4f5667a0141e1c8f1831a353763756f1dd", - "faae8f07af258c5421a798040e34625429cc8f538c5a90db3ead8839eb59fab8", - "2abbb2c7b7a0e2c064852f9c96a817b3fe6a197d23b0975cc9126cd22b974a9b", - "8995d1dffc98c50176d15660218a13c072653faa80d83f35c3d7a194edef5383", - "98dee79c6b7465fc7fab2406c7e63c0669ec1a6964bbb63092338f0572526c29", - "475cc72f7d561b5fe15db75323824b19645f930ef7962f81936de7299464e792", - "d293e8ff2ce547e4bee89289856b5dace04a16981e3b67fabae78229927dee56", - "fcd927913da2298e9426d5d88d62223f8ef0fa8b188bc507a32d5220dc029bac", - "bf6b0574f5a62a8582a872c02081c8eb91ca8e6f3d4d9e513e5c26796a6d2373", - "b8fde6925084853d7aff6a72eb1e53ffbf3a93d6d790e6021ff28942bee617c8", - "a473160b1b618bfb4e70c1f7a581aac2db126018de75ea9c8d3ac412f6e489e0", - "cdc35eed8e76410ec3ebb90ee543c0fe1b921f35910d16e1176d1937c15e20b8", - "bbae761810f520d65e7267b3e4068bba252947cda7ca69e05bd0c4b566ddd9d5", - "cc4f8c9c6e015688f9c0c48b951cfd1f49addf6303b44aac0a0e9b81121648cb", - "a910b135c7c06a3e2a3e98660295abde4add298c7f276f179586ec96bb93b90f", - "c9d9ab1d34b6bead61319fefb415fbeac29ee89aa60f58ef75d28eab0ecb10c8", - "419ee8039f863e181e26cf9dd525bdd700f891266bc6e0c5aa57f7f50dd8d094", - "48b64b21f1ab9b7c559c193be238eeb2e0aa4b884ade3b8c9bbaa48dfec8709b", - "76945981320a47d85d0dcd7deb28b1e7f6ddc0b9bfca3961377d51ed0c84ce4c", - "c5adc22a1b194723f69bf258e7dd517ba19871c9f636b2b850ab29461c3f7698", - "36d9fc32d7a677380293437e1fe0665630cdf98268cd5736c06dd2b939fa127f", - "c159f9777cc6b69cbb514bde81f00137be48d94d16b3e0292142a20c083ea56c", - "5933513e49496ca06ff3b1595f6e1824f0b8132973a8f4378aa43f3165487d01", - "47c86c4ccf69a05ad1710a5b149af418fec0b7c2ab5f97d19d3c3ec3f4a819e1", - "7863aa26f4da91012122afa3babc0959bddac52a786ef401e2b2c8aa094dbdc1", - "e86176e9a1cf1fc0fec2f8085607801b85cf65d00a4e487fada054662d8f7e2c", - "43bfefeb422aaeebf0870c93316983429e26bf6735507fa6e967c115e9a4c35a", - "95815550b027ab71a8ff448e3abfb2c7a05a314f1b24c0a9012f6debfb67fd55", - "62fbd1a42c4bc99c9d9db4af2773de40b10c5c92faeb135e273fa05bb3f3a839", - "7c9d25c82b5fee66531b5e183e2970739736ad7bb44502624863d25d8d1a8dbf", - "99eb3ad5f4051ae5b1152dc559f7985edfa1af56dfacc5a0369b1dd3c329777e", - "120aa4b3707e95cc34f5bf57e24886d3f612c72314d788d9e18556fd283f94c0", - "37d748361a84e7b071c8adb53a14b826709b93c50cb138f70f5afc96e6435643", - "7eaa7de520e35b2da365ad3072d75262526b844d26efc8d466a44661f1190f23", - "27f008b1640dc89563d5e2a09ed876a842abcfcbc7e050f9d44c112319c42dfb", - "c3ee6bcc4a958973dadf3827f44b3582f7769a0cd265c6b0cc86df23e9e6058c", - "b68ffe40bde0ba696630e921829ddaf8d695f003605d66e27bb5f13543d6ab5f", - "972bca3b52a48a6ea0446ecfc715f7b71061a9c28b588cc94a2fdc2151a8e6d0", - "7dfb9a0c23a344a6554fbce8bc9279e17c0d4d8ef11e1d187ca8fe89d9db7623", - "ac0ecdbd183b8bed2201c5a65552c32c84ab4ff35263b669272dab343fa6a0ec", - "847adf2e15b29261408a9ce4f3aafcdd6e1ca00693027fea987172e69456d9c7", - "d58994567a430f96c3a24addcd87aca26f04f2b634007c83a9a8e400c72eaca1", - "44a9722600b6e92709245e1773431eede33e8da290f52543b9649c726b3ed18c", - "aef9b45387ebe52b4d8766da2bc404aaa3e19ef7505bf04989872376fc1db858", - "6006fa281474dc11bf27c342fff40bda7efc3e79c3e409c8b2e024223759ca0f", - "49d4b6c4ba8950b71fb4fa1a5e09a489606f424d48fc45667302f19663ab0146", - "b9d7e3d5f871a036ebf0dffdd0b93545cd7f8837b0589d9acd258d16cf62021f", - "0d6382e5f08db6b45bcfe5dec20acd3eb7c32fa279c86e508c55019cfdd5183c", - "5e79b59b233023f25e56dc33cde3d3e5bb3b9c8320f1f70b13260509cbd35b8d", - "17d66049d6bd5e1fecf96fc0d2429c8aa97ac18f42e88d5907dcf3d38e5c1984", - "b768c4a3739a269e21d27f74c30c093aad59f3ed10997d03f7fa27c1b28bdc56", - "a57ebf45474356565ecc371cc33221e4254487ee7ca6eb1c5647c24e5f790207", - "3a4e5d3ab931702484caf5f5cfaeed1b199ad57daa912e3d028cecb799d3ffc2", - "9b3ed5e26ffc536e9ca9fae38818e636fb9bd5faa76ffff347d36c53f36f0d3a", - "244b46ab52cc340350d3d3bde1347db8acd11aacaa6654468b10717db3b9120f", - "30a938349882808eb540b7ea4dc5fb694f75b25571838d58b718375e58b00bc9", - "c2f64fc3249d68e74b4c6528caa4122f8a5b961a94ed15900109a76b0a59fce5", - "cd16d7c05d466d8aabd33bcd60bd354d464df1d5d2bdc7be9681298d33b8091c", - "55e600cc29ef351c3e7f54592653e8bf7ec00f20ee1cddde0b94569bf3655db9", - "5cb1eb0b5755095b31ed3b04a8ae62c0cbd33137ad1c40f575588f5c7aa6464c", - "5b576ccc99257a314a34c712d357432a762d0737caca37980fb8e6bbf811b66b", - "bdef48b7c5a2a761fa07f392ce46fbe30c887ac80b0565b71d5dba8d95f3cc35", - "b13f182c9516e4159ec0f227a0dfb4fbc9490bc1cef130d9d0fed8d918ff5c1d", - "d1dca7b5b73954df2e196b255d3b774cf50bcc1d838ea26c22becdca4450c0bc", - "ea3fa7fa400af2bebdddf1661dfb0f390c3bc30c10fe537c523c4398b7484506", - "ea035d8bbde358eec8eea0d1267e5ba6ca2d0321dca88e54f17e8e950693dbfd", - "3e2520d24f221b13482311d32824b992467398d23ac6980d85e67decbc1bea92", - "62554318f674e171c28b2eb65facc1c7d4adf13c0a73065bbed949b4e6853869", - "750c5a0876d73d718c44c1fa9690eb80b6a28b5e75cf212b1ba3c0b28505168c", - "1012cc7f712c8a91b677b394faeb13fba16cf42b7e03df18dcddc1880ef1e0c6", - "f95d39967cc36f20c790d3d7ffdde134fa87efacc5cc87aabd33cf4bda4d4f48", - "054e54812e115f47b4bea30a4288ea82eb4352c50ca4d9de69ebb923a1e467a0", - "c3c08d0165f20fe460ced412c7522c2e2eb958a1245d9e3bb58ed134804a3c06", - "551483392990f9cacd03e0774bb0b297d74daf1c1de9e72df50c05784a87c0d5", - "4fc22cfb19f88f984d4e15824904bd5b1f326e5607940fe01b42ad3e24e42144", - "07555219885ebb8f19ad22362431f7f40925e97ae2d81696a471e98168de4546", - "3d7f4f2fe93aa0880207fcd5fd290f58cce920c21a0380a793c34fdbfbe55b44", - "7d13c679e7c118503efbdd6f66ebc0396ca52a97de471d950b15d3da98f6fe66", - "8f72eb5ea02c83fab7485f16620c2e7d87f69698f1eecbb795c4955f5d4ebf92", - "fb0d0d9742c1bd07f65c2a187ca982b55ef7d4ff7757a9bdb96f0bb95064015f", - "5187b0f3f222effa4858cecba764b754cd7eaa3e9e26d11f37ffe6b12ee83043", - "5c4828b0b70aab2a0a881beaa68e48dedde2d29f27061363f380aa2362c11612", - "f4e92c7b9369961eb736fcf49f2121ae08770c77fafa5ad4117913d78da15cf4", - "cb239cde2393cf1f0682457b34807a7039e2933ddf5be98923c4ed75a3fbff23", - "9581b98330eaea35fcffe980422f18899fc965a742148fc6c1e2bedbbfdb3963", - "f0dcc4adde0879884ad0890f7a67002252640356f6fecbccc132dafc6380a44e", - "6909112ef6b2fe6d9111ae0e16bee0a3f0a686c8cb2735a2350dd5fa2cff6731", - "bffff0350c3f7e74f1f6d8678b6698ce923ce5915952dc48126486bde0ff6c3a", - "bba9c303880b2377e05993f21f6467a6508d1d095c27a8f6b8f33d18040589a9", - "0a29e6e74b869031bf23f7fdc0ace26f5479d4894a999c70cb199d2bbd542a3d", - "e8111ade47f0caaac95429ef07047f26a8ea55f976592af0e28ba05a1b32fa0b", - "ce794cc13294f08372dc8fc889ef3c08d0b8e0c38a61b29abe10c33c5cee3069", - "712968172534ed1168f534a8a45ebe611abf7093a6020b4ea408ef0ac85f335b", - "5343a9916a194dcf50a5dfee38d3b5568910b5d5bd7dd84254508d276f587fbe", - "a03161dcab6736cedcc54a930fdf2228ebaba774e3645b1fdd279a9c165573b2", - "383dfcdaff6ca813210e026f99528125b23596bee25373f3d655d40de842229a", - "f0d62d8ecb56fef076c55e3f4b8e08c048bca5b97b0f5a24852b38547960a24e", - "9ade4426379fdb587c747f94d50dba162cc975abf9285e51ccba6109d3eabc42", - "10b015db7f7b0226132dddbbdb7a01ea96a2965d122fa836128a3f712df87bf3", - "a6912ce0dbe8e376b80ba63633a1b13ece0e1b55ab5e693766a091ac876f9124", - "a06428c236a5f411e548c809eff1e8839bb1018af8aff17b12a3cf6215ffd08a", - "58d2dc71f80700b650b1c96faddb35f9722e2d16665120296642ac43f9c17a22", - "27d11210319158167802e7b335c7f550c3489068456813eb7e2caa3238007c55", - "d8e8d5f62c0e7c2733adb79df291789e85733f824970721e1780c1e3c476f059", - "e236a257d14a25faf7e364b4f00e6bc1478b9ace7b2eeb661f3847ab13cafb85", - "be0f67f0d91e28ec32ea01db156587694bcffdf8917eec6ee4a1e0f7ecd1abe6", - "915a140825c79a0547ae58923a0668dd72e2b807e8482abed424d7606c67c06c", - "62d41a78681be89fad4935d1bf3d1c1f0e9965532011668b0a30d3d2b448a573", - "0d9f66ecb8648089f5b0fb2ace06da1f8ace99e96e8eb2708f988f28b8737e37", - "ca9d50b7f9a384139bab2180679f58a597da602459890aa645072b32ea707501", - "09234ba532a6aea0e7c841151936fa12b49bf55f04542c8872849f79f2d5de2e", - "fea96a581b19c2b77d42d1bf9df55a440779752b10c2dac37b1c3ad59f584e9f", - "337c782044a9ac9b9a2376aae88c309d79c4d687b8bef4dca50fb53853272806", - "67ca2cf5868ce2769e5f5e416048c88647162aeacffc562f30534422096ee104", - "5a31140104120cb109428d5a318b068cdd127071b40966f796b723185c8cc016", - "052c40d0d4b572829a99c72d6fbdd3f100b6ab0437f9acb648ca69512518a143", - "8fac56c29beff924ee38b0f54985a859b279d4e0c509cfe2fb2c2002b3fc3076", - "6f304191fd87d60ef9f5ca2849bf56ae9cf0d03f6cd64c9129f7bc03a6fd5217", - "3f7fefcb31f472c112236fafa9179fc4634be7706f16622c16fb82f85a832838", - "12c7194871b1c1fb55bb5f9b3b93ad8754ade530ec05d320db33fd2fc1d47e6b", - "fd491fab211de00d720b86d2601bce5c72dd32eb7d03660bd15c719c11a34172", - "d832617eb26a825d29a9d90c9922c3494809fe760085edd804148f8d717134b0", - "022d63c5090c6154ea55af6d885e86015fe23c9a17176b81b8c7cf36c0af46e0", - "a9d0c4f684858a3bb9ca6e3663aae5bf0c5464be5f3fe53cef0c0ef4cd340c63", - "55d03b00c5a1fd99846bbc58aefc7a546552bdfd22d0730d20627e85f9fc10f0", - "7803a6a0068249e2d12f072f980f82df19c17059a24ce005f23ece762160ec3b", - "1bb369e85f0186bc2731200d4b11629114ae0a6ce70ff06e7f62351d864321b2", - "909570df484593caf5f081478d7729238b3c64e5b6cd72b6797ce7fe74c79fb1", - "efb0099c242053b32b7d855d57ff00a555955ce51cc011b49bc2d624f0cd7abd", - "327a086198c7d10a09df7c2edab2fb7ab44b6dd6bdbbd8ecf87adfe9ca692905", - "b8749bc4d6335ec05c7bf3f51fd6cbd357fa53f4dfb90ccd52bf2715c7d4dd9f", - "94db8e66cd0a9b3dc19990afc5e3be4cfd38800204920740171b9c97555de771", - "9ef6087747b3b7c986e81df9efb0a8a660ba59d110f6c20be214a5e40bab85ad", - "f528979d55f25d3072007fbde7fdd11b3a4e6112393cad543f653590295e9417", - "f41fe25d9d9dcb2e2ae630f0c7f17c6f4de96ae11c3ea900c641b74c9263f425", - "13cd3ab24116ac5a7a222f6c5d5221da7849a5f85b0ea05bc89583dd122d0950", - "ff13c16ce0f1d668075e7a0f96b8b421fababb939e9cfcc386cd97bcf8137edd", - "29082393feb3065fac75e6bd1367732bfd89d7f00d561671dfc1f72130868efd", - "92510539ca474f5bd2e3d62bf454f2c67f66763c88681e2150dbe06b97bdca01", - "8280a1a267f6b051dbeb56941e2c0a6b908450dfded2575b9f0600383e433d6e", - "f8d5c17bf07b3c08cd970a4a506d330bd38c69243108ba82c758759ebdca1f6e", - "5ef5b9ff7270e4de5700074e8d851fdffe1806ef709288850d5fb8d45d1fce7f", - "50adcce19f7f265661ed49378094500e35236132b9a68efe9cecc325e337d5b6", - "2ffc87d34d98870e4f8772cfcd50437cb48e1ffddcd61c1fc97b25da49e18657", - "5d18b07e2d01f93853ab88ba426b3fdbb88db8ec81ba60240251e19e1b11ee5a", - "dc5e593b1505508648d84796ae129daab87e33cc545a6460d824ac5f04c73fe4", - "b61155b8b5476f11093295fa28a3de34a59561a0a33784055999613676da2b35", - "bd08eb8315ce248a6adb1fd9fe3bd758718a7765455d416356fd340537c0cb3b", - "c4996a88902be48c746adacd3c8722d935e6331dcb862d65577fd90a732716c3", - "d165df16ae70eab837d754d869c895b9f8930208faa96ae4d09dedd51ebd4eb3", - "177e7a2c932b4be9113287c782751c42749d50dc5e41596af8b9d77f04285448", - "522c8b2ca1bf0d666f7c5d64da47db928eaf3f99ab554299d3e968622512f927", - "39c95f39aa65120c7c86ca4bbeed998307b1ec4b2c5c17b032aa72fe87cf3575", - "8ccc184e1ebe670f03ef39584706e3247b227535f6c4e7384e3c5307e2b365ef", - "712afdc4ce4329ad850187d3113b2b67c8560a349eb6bfb3fd3dc603ab0e5e65", - "67fc80277fc637248307cfafc362a8244c41c7ac766402b1c4b464fdc68bcb7e", - "c785758a94844e2353209ed9595fed4624f41f9c80975415af7445d69241285e", - "7614f1ff3dfcd4178fe7eb33622e3a862ecc1f652fe0f763f78a8c18d4c3517a", - "d3a26d0f52ed0333c500dfc8a7948c2b4b49b0ea68bddd906db532cf20e30c28", - "28e9d6cb3d9f9ac2b294bdb7d5d7b5a1c0c944a9696ce4d51a453e1fa5138e01", - "91d2a7837a291eaa4c856fd962410709104ac51f147237330fd6ba50d525bb65", - "ccf28b587465a7a4a3f9bb6537cb543509e27f564168587385283a2363688a04", - "676550658328c2afaa6bd1bb04051d93f8cf3faf3c8a0985a9158461f5e8c8e6", - "6ce6c581fd73bba59a16c77c55a7d3bac7bf20741dcad1b0ccd8f63ba04afc1a", - "8b845bc25ccf492cac3a3096d9ecfce219196501191632b107c07ae2be0e3c01", - "a17deed92e3037ea7983082b7ba15c452403bd5243f516f50d0727e0d3d22ec6", - "0628ebe521a95cc408451cbcbda7a19bb7a7bb107d986f3f52d9e8420201c329", - "34f48dbe8a5183c66d2fee6e8690e0e33d32a72aff4d2b7cbbdf53cc5bb88898", - "7e85e751a2a3a53fed823243026e4405fbf236c0c17b79c1ce6685e8a19b65a1", - "152252d5647403ad7c93a28c7d204c8d909eb30f9c1f837e09fba5cead5e86e6", - "a8a4f79764413a73cdf31b22443bced7c6c6bb5b616cfc3f81e239d3353e9119", - "8d2e1b1ace769d31159dc26c3178e77d699ee390641be0d25c8c28a02eb8273d", - "19adf7bb7259b8373b180fe55ecf1c8302a2540da8ae6232d6fab0394960db25", - "e07c5511f341d4c91de1f1aed8723daef45d060e0bb1eed8cebc1a25c85b95f4", - "328f20f1b472a3a839d1d955f9dcb54b0d173a62a1c933701e706659aac60acf", - "061976d0526b33ee0a0f444c1828ef2ccb874d6be38f3751afd82bd67cb76e00", - "b728214b86f3b74498f99530e05fb155d8a422f422f1326ac41e0621f7d1f42f", - "73d2ba8a99f18de48ae65914729986fe529b04f1cce4c6103dc420f157cf5b11", - "68b9dc01b1f35322d37db3df7146df902e120986f776b37eb23d9827c9ed150e", - "a5c73ba7e43515480cdcca0c97b831c5c1cb488643ebbd3e852e1c127bb6387b", - "f1d58402268e790a69d90583a50f88182079d6ad767de5091e8b53beddf11f72", - "762062ae01ed1f7e045d74d7c6e607d5d6a3a1dfa199258ebe383fe04fed1474", - "ba74a5b00daf60520b9457a8ca99ec0a13bf10c1103a39d63349152e837486a0", - "f9d8123bc5d881f2ddbcc6a7012f2c13443f095f086f4efd8ac167cefc6f5edc", - "1773d41534ca250542a30004539f546cd2d22aa5e4c79dad3ce542d3c5d940c5", - "7bf0ef62f92a12a1fe84725d4396fe416a870f17de293d2e1705bb25fe3de3a3", - "ddd3d3a408a0053a024984791046138ca9dca3faa93c6c014589c3bd9da2524d", - "89bae173ce8b96ec5542e3f94dc735be56584f1f375146f2e975775ec37418df", - "ebce4bea8cd7192d5673894eb53752937c226b1ae154810f3ca5ec67323651e0", - "2f47885c99ad76913c2d5915eccbd748390cb91403cdd4209bb832c9ec0f2732", - "9b42f9c40bed06f3ec17648d541178444306a2b6dbd72d3f71c471fa298a6ade", - "f52e4650e066faf8b279bd835114033db4dc46adc2dd6f6e62cb5d8b65d2cd03", - "63f8a35e32d3585a3008d971fbd0491ad5e3b3713bf1836f8ef837a2ee7068c5", - "7d1f0e8fca2363910a9897e38f8c40bd3fe1fcf445b2372a46eeab340767c7d0", - "cf9fcfe6f261f61dd18526466f6f28ff7f7155423e1bbf467f7755ded461fc89", - "3df1c7a5ac0f878f15a8963b15b6a14ce54c6b8bf217f44efcba4d6e658f962e", - "f4cc1f210bae845eebf6be1b7b677152909d036e789ce89c7e7a2b914ae168d6", - "b8bffe0e7c338a32a54e19523b17947a069b6c3b4303a5055250f4eac1326d3e", - "2608e4afbbf0f516c5cc575dc1b235737665eafbc4c9e1978044dc23029f3c8f", - "00fca23709d0d09d20f850b997d3f385281e3b1806cc372b957733e7d4053e39", - "7b73eef31b7500cc894427e190e6f187a77cb7b94151cc5cc9ebe630adbd0ed2", - "5beba49e519dee6ca29df6b7bc08d8e7419fc14599310d3398ef11e4c29af58c", - "d1a336edbf7a5fec1774c172ec08bfd249de6fa220ece2be3618cf9a3386a423", - "a092ab9d05e3a37206a9265489b7c9dc3695310d5cb9555e9a4b747e41181be6", - "9699aa284671232062690978a01069de3b6d3157b2e93b27975b7ad6c826c5c9", - "bf542d5ebac42d6c0524635eb63b33153691ba45b8cd92957942140cb4569f9a", - "a1ff0e808ee9ff2556b614701c03bf8ee28a8a9b9dfeadfdbb92d29e9de2b79a", - "752b46f6ef2c298d56f8077ba7f05c98d27e3473a0f02158c22277c58adc0fa9", - "f9b11a2787b26ff314078c624a84420ac0c1e95e3451e0573f206135b1b4deb7", - "d475f7799b0e9188b1d8b1fe265c4a590d44e2263a9d51f74e4f1da1c3750c1b", - "70045ff1fab9c07b2480713fde1bf000cdd1f1effc42b43fdb78386a8ff01b03", - "7247888f75289313636ec091fa5140b20a6b51780dc2277a4a28666518a09513", - "c1f3b422cea5ded876df5a617e635af0489b8223806e6699752081ea87892641", - "82dacde6622021865cab11b313c5baee4e8f1280149cd1fe3d383e868c6dbc95", - "87dee4010ac1b7cb6b2299e4bdc5459a4885576e2f7078defd1748729f40ec52", - "e8cf86a57f67b00966224e0bba3659798b8d9ec433c90fa52329b4c57f16978d", - "c1115de4fbf03f009e9d45ec3703f06dc72c1019cd457869713636ea64de014f", - "6bc20619b1614fadd8013e82fa60d6ed6a40d89a5a5e74648c85c7bcf73e30ee", - "29503a919cbc0b6d169f0f6fbfbbec88545c82eca2df0dc816155f5945453b36", - "60373afca102beea2f53fbce560bdcf5298936089039152ade258e545a621dfa", - "1625c4faca2a6286d2ec829ec95b7c4bca36f267892eec632bd9ea58ed9b74d5", - "194394339c957cb64afee0a27cac464afd57295daa4b972c4fea339d8e58ff30", - "d39ad1fb1fbf0ce4eec052bd6fd3caa5c5657ae32d4a97b37ea08cd32b2208ce", - "fa03dcd9187f600d06fe3dec1e5e9dd26163b133d3c26aff1a0d7e9208fdb34d", - "1dc884f6f2f17d11518b100fffa0828847bb456f21305065387a5d63b69a399f", - "dc187295efeb9fafb729afee09cdaff3d170527ed12461cfe35d18cb28078e78", - "89b21177bd4516d5def44b0c9ab17f6b6d680b1c127f23d111216e99cb048167", - "02e1230b6a9c7cdbc3d68838ce7af0c47814cfee99f31af5eaf6624ef2fa4872", - "035f411e10a9305623100598b6642db996b9ee9fa794d6a1f897583083a01601", - "49688413cf4e1bdfbba94bd71add453f2bedb07c79938d027b7585ef13270cba", - "1c657e83d462710dce25f7863d03b05b16796bd00af7d09bfb4a51bfec6ac454", - "9984a08f1afc3cd36ac41c88054f4c7a189b326fd9cc4523d6f0785e524e20fa", - "db00687c4c51019f0db43291d64f5777d4b4feb72e11535ae24b1041f63fe3c1", - "b895420e5f5152d69044b7fa5506e81e4ddf1c285925c300d6c0d7145cc8b5ee", - "3d5a4d05dbd94dd50bcf8a15972fcfc6bfada1e80fa4cdc559c0c6d0de1e6653", - "ff2d1a961218f0f61884c16022b18f048a6673f6541c666cc710a2210769af1e", - "8f18be4f6c2769c2e132556292cc01849c704253acfd803acb517c2a2fefa4f3", - "474dafd66ceaeb9e8876fc3380e2f19038dc35cc54eb7c2f8473ab8dc77b96ab", - "4680620d1135b323e9ef4d8effe0b0f9319cac4df7ca887cf60a0ea3e3164b93", - "7bced24967990780e10edd4a1f4619d70fe068d230e55f2dc2b815ac6e7be9ce", - "368f4c36b63334dd6382806d2a8b8d856e44f71b4cfd48c6a8d3d240244d4a46", - "0b899c67ad4589a950b1cb85015af1f4bb32556002a07b4261a75403941d647e", - "d69938a6c5287304173b6122a6dd996d26a06135c97f2a9f1f416a2d9615959b", - "d1db140a890edba23b1ab73a0a07fbdcbefd1735b7954adc75f558f3edbfcacf", - "d9c099c9267a78deb8395dcb75d3f9cb14a57461aa78e690bdf80fccd26e50ff", - "6247e71c3cc609768cb511cdc11ac3d6036eeb5a4805c683026efdc34ae78fae", - "0feffa86ea17c80c8001e5b66b80136a54e9f0a74d99d8ac3d94930ef5b1be45", - "f2b85d48e497ebff2ef069bf13e895a67c7f42eb908cf99694af4dc72f7e8011", - "077fa158c9d472a55505b66ccb802498e43edc4b6760c577326cc42bda53c4d4", - "5127e3928ec14105e7bf616573205f0e5a33493a603fe2ac543f79cb7b89bad9", - "761d8bdd2202fc881db3583b1545a5beb3c230369a1d99d21cac2bb1fac81282", - "36dc088421945497c2c0aeb96488d3350f14ea31063dd87d40c151800106beca", - "c18d580980b78cafbd941021e88a1b1ecc791033cd66118e21638c3bcf609547", - "cb62046259744b7860060319e533375614ea5d3321cd1ba817df8c5f508b641a", - "16254f72ecf718d43c8765984a3d473073e5551346ed1de2a7c10cf227b82f69", - "19315523a53f1ca92a4efda2f5665f1652c7526dd6539ea830bd96adb47457ac", - "400339c91da4f12802ec9aed99793c903041fe579f0b1245316b422ec6187096", - "45ee1d78adc06a7610777ac77926d75e622585261510628dbf27fa2304e50af8", - "df54da3699f513e79ec2f4e7dbf72a1c3457af31b338c60578db5479834070ee", - "13d1464852cf33466039fc77bbda0e203295daa8d0a9ef034ed309d5f63b4439", - "ee0c70fcb45b82671ce29f6f6a52318622cc961d768a92f6e709c6997cbaf080", - "43395d9bd5765ee3323058cdde23f810ccb53cfe598b7e31d356f570712b394a", - "6ccd08d022f3a76e1af4cfeb4b48ef246f76dd3f4a9ec493dd0b298f06a3aec8", - "e28ec009fa59ead24bdab29b6cd033e5712f38fad6f65fec3f49612341370c99", - "bd84481ecd3c35a5e0377dcd23c1756127f1ca675ab0b0579085827e02e92fd1", - "4225b32dd357cfa7e01efcc7809a482596ad29994426815bca1524fd8b9d74a4", - "866435095fc93502b57017212d6fd016b31876721c89284b5adc8a58e7f78eda", - "e84bb2d7988be66450c5619432a2a3536e5fb125abc182896cc0918fe8b291e9", - "b0d3a05539519bbba622ab04f4d83062300c427a4b066eef7c63651ea12a199b", - "9ea007c119c032f16c730d75bdfd471828dc382af3d21eb778eb5613df916209", - "d86f8e8ae9fdb47838a01e86896f0bb2a22dc2a160dd7c10dfcfa4bd5386de5b", - "6d27f83bb80604868af334a80daf3e295af88792b807e37b430695b5a17c120f", - "d311b5a163c61883f3bb1dfe4e45514c733c74cf2cdfbe086fc38aa8690653bf", - "7b7add4ecc4b578c638415d54d84e78eb2c369a56b152354d5b44059261236aa", - "a6406652a17250567de94685de5af3069cf99b3ccda67134ed0c4cfa746dcc6a", - "d66c75864ef542c804e00d5d3dab2eabf978887c7a4892045877e815b1e4b4dd", - "6bcd0c53f5c7f43e1772103250db8ffeb12a99d496ac10951b06aa12860103ab", - "c68b802c5289599b796e3ca9544acf8cd16e956b82eb409a8eab5f63aa8908bb", - "7a0fe98ec5e14593f2b43cff7426dce8e45cd046f2acb861acc8459fd0ac8d84", - "3bc83718c80b4ad99631e2880a52b601d36a1e79aeeb7db3e76670932786b61c", - "342a7445d3732d9fe0b1e118ae1e4b3935ae961dbda80d45330dd9c7ec5fc9a6", - "f597868b81d2aa7ef33894772b58340ed4a37a6c1bd082496c2eda21d4af7816", - "d85deca36ec7b2aaf691cb9f55248c650bcc6be7fb9826c821d96811f7ff2ba7", - "59d1b321e0dd2a128569198ee79014a9e72ef282ed7fbb9c0f0ee0aab420f6da", - "e101586de7d593af3653bcc6c82260de05236659bfafb52bc67b366794232b91", - "1529f4372fc880a0d323b784beb65a5af4e772bc670c44975397858d561636fd", - "80f36afc7319f6908e8e286fbb737943b42d443d90505af38b2f885ad8642ce9", - "33b3b633cd97949fd853c16a68fc7639faac776f76fd822839d71535e1dc095b", - "bacafbb27891feccbe55e5f3376eb00607d5b7a1649a02b93dab52e667508f1e", - "e0a5e36d295fe94aba3935c488f84ecfe693585c02556e561eb820a6c68b21ce", - "85ed0aa21069a903f2e5a3e4f2ea517e245cd9bdd2729a5f9363ce5052ffb290", - "91d80a8a37a8d73a08669350b42ac6935800d8f3ae9b6a24dcc7932f17a0c401", - "0ce2657c36d04277361d187d3114bbf7d5e03e3298afced89e9060964b9853ed", - "b11ba36b573336831a50f623c9708564f6aa5d0818dbc26deeea3efac191db45", - "2c08f93958e50113de27e34d785db3a5bb448d9681b4521807c234940f105e80", - "9287c31d2c520455f4ca39df1cc31e3bbe416933a74f173b254b4e467bc6aba4", - "72874549169f8e5238daa947298629bf653c8021e4ec3980d73197513889073d", - "622ca28d5dc49792eef16ab29236d636445ffe5773eb1ccc309d69a03186dfc1", - "bf6ccf7d5344475865631a21531e96b4ea424996d4d54ede247ab8c18af9a64f", - "fc05f466c109417553f08a49108da4ceaa21b4f7d23be871d0983e16a2e8fe79", - "16f3f748ee3c694525cd272edacafa159e667cab13b2f434dc28dd645ac62b43", - "bbac7f7519f2ef2b3f2e41848f05fabe11fc3e138dce360931b157159cff3696", - "9249b3272748d53df045c7c44289519d2dc8a8568bbeff0028dcb8242d90ac27", - "7417e729dc62d297c53a0cc686c99d4656cfa7d74bd831a4f28082076e795745", - "f752b95dd51f81206682a60329286fb51fcf9d121fe971c1d2a07a8f9f689fcc", - "547dfa335df3312395050ce8605f17491ef57651276ce20dab65d951e259196c", - "a798475f8123e38433015406c6b136c9210df4841c5f34954199b080bd827a01", - "cd20b4c9c0db4082add2da550b2e17fe9b3d57768c8cc09172b93b954b889ce9", - "9d0859d94af8edf58ed5d78314eb4e859febe443c44c1efefd49caee13abed58", - "04c486138e1b03da159511526bd5ed9cf5a269281acdcbb00f5e04252321cc96", - "cde280bf91648b1e48126be6a78dc9d11800f5710673e7046b71b8690ee70001", - "b64be723e28c92433914b1829765e6ba9d4af77c8df06a62ba2adbcb8a5e5e6b", - "06add38cfa21f0b5665afa12df424ec66c22bc2e64c064985b49996053033184", - "8b9b67cf20a0acef54a3c100669354932804e01ec622f1d7580a93bd784de7fd", - "556f9afc7d82034b51d3b8f19f5c03b4f72453f68cdbd9c2aa1b0d06506d1d5c", - "d9b2c0f68a7d34bccf5610fdaa743ff8954321e527b6e19f6c4cb52ddf39b1d0", - "18f539da28420b8c7c5723a88c257d34075f0e08055030e6ca293ef542a82f55", - "7fdf02e8a658e1bc6110f36db56acedeed006a7f675a4f450e37497899fc6dd8", - "14b46e521b52813141bddfcbb2b5d700461dfe1c3f9998a9facdf0e942571e57", - "2944d186f1222e9e0ad6986a3cfe29a996da1f35f41878336be0aa093b2f9cdc", - "a95268917398b5d4a37e08674327ef4adc677e4e7d2bdf9eacfd1d648b8e4560", - "6ba2db9196384f216512124a43711f6a7092583e76eca03dcebb907904253d91", - "14529017c81190f38523dfc174c194188001576ac8a568e1f8a92d3c1711f1b6", - "be06d1e7277e6e76b63be9556b55c93fddb9da69751852de339e443599af87f3", - "1407aca4ffbc776ab8bdac3670a4958f506e28fdae61ac466520491bfbd981ad", - "9ed4d032c5c910491069c9ac955c15afbe976cc0231018666918bd4c51e8a410", - "7b3de10fbb9c413d69a91dde853557064254b5c1cb9dd6e506e6ed239ed661f0", - "0979a9262903649b1fe8e7e8c649b48c8c8ea4366b67715d8725f6cec863c2f3", - "304af36f4aee4fdd337622fccac0b61b1f1b219dca4cb5aa153455732cdbde00", - "3896646445fe98d7a9cd838663bddfbd7e86cf386ca1ba4659e4ec29d6b5e20a", - "a2c75a716b378745a661d20221afdae7c522d1fae76938150d5855cc2efa4ae9", - "695e3233f0c608dd4ea8f1ba5c2ccbb96274c557d0540a0ecc912e7b19b50c0e", - "50f5c67b6908ee4bf4aa10526621ad327a2bec3cb0fb7a5b5e70ece297625e40", - "19341ad602c861201eeeea0f045367a55c1705a28b3e442d5a544ddbc8d7e693", - "4729877a9350353bbb4248cde5a45fa4f50e50f57efc45f00f106790ca592bc8", - "5eaa1a6a43dfa3ecdcb140fc18f1d38807f47cae4349ac6bbbc2397c4b2663f5", - "1b1c1a806105c94d49f299e14dc2ab195ac0d1ef5282b3802118175fa2da04f6", - "cb27843b9948af6d0a0bfaebc32fd7628ac6fc8a20c6f08403dd26fe1ef673e4", - "f1d76a8489b32a1cbda1daaf82970d00e05ae7fb67b634d424cbef8a9db1808c", - "18f71b416228afc7c6be0ebc5ca9a2343239c6ebbc27450144893352d42c2fe2", - "e24ccf7ff59f92efe24347de68dabf11ca140a2d2e7ea22040695c7fe1292ed7", - "3dd94d5c3b74f045de0b31e9ea60ea266b7d326302b426c8c4ce1036a2402ee7", - "ce39e48e0eee597b032d4744aa00529b42e7d5acbd70a0273ec53be56a2185fa", - "195a79f750959e25dab5170e245fcfdbc6a9a9a09cd8390ae1b9697545c5ef45", - "03286585b715138879f0045e1279474511d5b2c607b7841623142219ce104aaa", - "6c740c9275774578823b9cf219b294041283d7948f29fd04ee111a7d66e01d20", - "c8a5fd6199f42105f1e1fb369c4dc5e7a0278222057a20c52c9d0028b2b144c2", - "1b36acaa713e32f92c9e4df114a7901bee0b3c2060dc194d37bde7fdb92e57e1", - "252286de2653281322556f421896bdd1293e47b20e8a02df79b943134458c262", - "4de65d14364c04153f9c339e19641778154404faf2b82d73be791b402bbe665b", - "fb97551172dcd0a0820008df0d0a172bc151fbce39c5cf78b398a7083d150ef9", - "1e3b5fe614fa0142cc7661171814558bf35ef2cee10b47d9a5a857cea54b079c", - "2247c22b42da6c0f204861be3cf23a17f7e5cc0039661607df23828ef9649d4f", - "1538d268261beef349186c0f89a5462577fb04409165c647dd4df3baa8131f12", - "560a9aa72a5380a6d8fc4c86c4da856e05a620c5cd7be6ee3b981e0a11666826", - "ae6a93b53ffdb9f2e88e932322441689f3867cb7972a0db5066a7f22df6f3ca3", - "7b5ebd86fe3c22ef2e45ec29f6ff33cea104c0f7ff09fa1c93075d1393b5f074", - "afc3a952ffdb219c00e1920a3d978f6836560c175c7d2e927fdafd0acb1d7fcc", - "09b3baffe914438e29f1fb30c6146ae18f686c2ad9b8107014f56cf811164997", - "ccd5d01773002c00de5455fb60b73ef2807f46a32e083e56adf46e25a6427366", - "41155d9fbe5104883a27ffa44f21326f28669186b491281c6ff3590890c3e1fe", - "99e0b8f7d739430c1fc37fd7941e3f51fba9057aab814ec50fa4a79d3980679f", - "f7a904066a95d7abc77b147efbac7460f4569b728f8cf0365a32be2628734c22", - "bebdf7983a2f5a68b82cde72fcf63daf6c801ccf26daa3fec53162fc575fd2d8", - "808e8cccdd7294854dfd25c7f76da32098bd3a5c5338b5f3159542ca31b8f118", - "56d66aef2ab4b16386dfa747204d793c82a5d1475a06026fce37f3e429e8b2c2", - "8ad535876671c6d8c8b879dc6d2ca148995e148181db71004bc22602ec191407", - "af29cede4c40f485b254d794ed99988cfa6ceba19f2855129a5d2852b50f1ee4", - "f8436aa08aac8582def0e5d766421173b1b2a7459a54157ba42cbd9e6f26d853", - "5a9a368c4fd6e4c42649efe839b2d70eb06574baeb916f374fd365dd6ed118ea", - "02e5ab178a6c6dfa01e745f0474562f994c3d087b591a705d71da5a53acfee48", - "9fca55a388601bd14eb3fdba760daf435b0f3bcae8acebb27087c44bf4777b2c", - "ab1cbc58d3c0d51ed23a83f9a34b272d3aa4e6b600064210b97e13713461374d", - "366627ac2fdf1278c1d638efeb8543a8612ed245250c8d61e592bccb72527f0c", - "336d9a5700456b25d8e35276e868c00d8c236fbf61337092a59903375835c3eb", - "292dfd3536ad095cd4d1a487589fc326e9f4d731f541505cd1029e4e508cb0f3", - "4a4466619d7fe590a5e4d024937c1bc6444b38c7fafe87959f8c811ee612ccdf", - "b37787423345a86f3450c7517ac08764c3c48fb338432059898a4f2979375b12", - "fb06b4ffb6613e87c38694a94d5360df93f600c6ed5cbbad530a27597701bc41", - "beb5835efcab9dd2dceade0b56c057e82fb6c5acd7dbe0def499b80ff996b9ba", - "7b844e592893122d93d10667b1bb52cbd27fd58657303eb47fab207d31dec4cc", - "2aa326aecda8f7541a6e73388f70f817067c1af62177b7450e2415c96b783f5a", - "d066044f4a932d12a6eacefaec2ed05dd834ebcfdc33b3817bb2f5f627a9109b", - "20bbefc248b06508afcdbd26d04d2a586727b9a50f97a7c5ca2e2a8f9adbd7e9", - "bcdb68eab38bdbad3a002d03a2e4ab932ea085aaa3935643407470625575bc2c", - "48e5371b2fd44cc2d0c5edbe310e0129ab4a017f6ac75a9413656d3a0e8a09d2", - "ae2dcfef606676c2947b92cead9651bcd4d4e7c3131b552c8225ace1c0f112f3", - "7b57f0742ad4b619dd5b436642279bb85f54202c95004b94b3779f342f3511bb", - "c1f7b2b3032657f57fae6e9173f41992819a3cfd6dd1e548b3defa485b68e7aa", - "2f5a3cc0500067acb45e7e69d8cd28b74fc3f62825918cd57445910e111381a4", - "2baeb8c176e3cb21377237f543d5d012aef19736d247bae2d6d259f15b1497ad", - "7571f3493f20259ab39ef4825666dd29f2ed9c17f9d952f90beb6089dfd83d23", - "c457413401a831b7cc29b5db3b51af21cf8a41eae6d33eedb812f5d796ccd2dc", - "ee3ad4562040174a1c5ac701d40966d2729210ed34a0e65a7ed33b5c94b70b2f", - "ee747f9e0cbf61ab47622f0f37048ffd7633bb94a20ad81052a52a3e4fb1d0d9", - "49750b20de6de0c3b068a8a510be86351f60c7ce34a6acfa12173c761483fdec", - "1df0de5133d66bc5ebde7da99f673ded98b76bea53ff052d6ce04d301d821f3f", - "cb7f28ecdeccd1d66313a0322b6e0132bb06e535b50353da6f9fb9e1058428f1", - "ff7a52a8501fb7e7082fc9bf8ac4ccfde5befbc11bbf634fc55633839f322f4a", - "680145741482ab2a8c482cfb166583d937ec4ac900bf2759901d5ff036035eb9", - "0d65977bd7cee9e349a487b48750b3af22044ca5f7283adbc759c1bf6d281e0d", - "5166838042207bdc83b5e5a0548566dd5b4c6ba19094ebde6e33090ec55c2a62", - "53a6fdc7271ce5da00cf96995b33bad510aad49725bbab563a4a7c05f10ebedd", - "d1da2fe6341fd486a6e06e9d9f3491b432036df3835645683a33cc20821d7ab6", - "1f80d0fb63a9b742ad8f96acbabd5ad0604a7da3de4c4898a5c048560f96560f", - "acd544dfbabbd715b704f5b781a2fbc54ef071e1ed71496c5b85a91c30f53e40", - "6a53f6f14fa51ad87007958fd5559e72c170e4605448e4dcc1e013c57e76beda", - "bf1d0de5af18df2a0c1761b9e3bc8e9e357ba28cbfb7c8f659bc1d73ad6f88fc", - "91c4f86184dfb89bd12ba385fc43d7d94d6b7fb08147cc180f263a6893a31965", - "09c3073a4893733a02e27452c2cd1a8839e6c7139c1fb200a2c612e0a4837f0c", - "13919195bc38b679fb87281a7ad9dedd9ef7252cd324275e843d277a045bff1a", - "9cde3d90c7da2d705a31ab34bea2132b27a637197e592d7582d66c38aa8bf198", - "b569554868e12050825eb6a488ec297c837e44ad09cc936d1ce8ac9ebe65b6e9", - "de57c2059a7414cca5962b080330c4f748a37f5c0656deb2632d845564706c48", - "13b3c99bfa35b56cdaa68f68749e1fb415bd1b3fffaf1c4cff380aa274d5c861", - "d68c1a3338fcacfd610a6f46d536b2b39f1f4c42ed8234ce394c38463ab6d644", - "838834ac7e96c84f4d8656a42357fcd1646cb169c9d5c95bc36277e256e69dca", - "cdf211a8d04b82e467f009c4273ccff1f33520ac8f7562b99ddeee294e7ff26f", - "f01d7a0c68cf4e9b2be5378f7c5ed540f00813f9d91b834324583eab535d8b52", - "bacfc6337c62b9afd4f8cefe5e5903441f1155a8bf1c4edb2864352e2f49b6a9", - "5780dfcb9cba0059211f86fa3eaf90fce54c9eb69d3ff4082915cdc5872c1d12", - "040eb692ee528b9c2d74295074efd58c402ed2140c51e9312190d175063d049b", - "4ee2305dafb6d0da8567530383d841f761ca699a0d83e335891341266a254daa", - "820b7d9f3cdc5749210b85abbbdcbec706404d3b84644466a12d179b5e3627ff", - "0aa18552401e3d28d049c415f02cf452204878bd15e2ee7846fe39f2fa9d149c", - "9aad22140608b465469b2e25853bfb5e0e30accb544404080664aec271336cb4", - "2543ee88a5779038eee52c737fb328f12a650dc92b8912313c42e4a0fe7c80e9", - "2bd247dff6337865c8f5f2279cd60961b85b3c571479a7c039aae8cff414c5ab", - "a79bfc9bf41b5d4a0e8d5ceedd811b6599d3e0393b79f2730e7359b07e85d782", - "c4a55dcb1c24633bdd79bdfc818d5fa288dce4d727c54b074cb67ae56eb17785", - "3384432144fb3b43d07e466744ebd29cdbf135053b3072e9ade5945c9f25faa1", - "3b065cd3a718146d38e34095af2218d605acc5f715bc237fc59e4e8e0a9f828d", - "a6727d52846103cbc52d7db77c6be1da5654ec7a374f1af5c6402a975c277a59", - "c9e009120176544593b0083061cc7e986b33f04ee9eb8e9752723b03442cb5ae", - "f6c726daa8a620e08b6cddcb85c818fba04c3b3b37ec6f2a5ef3e714e34a3cf8", - "073bf6916e429078717315dab78b67c22a680636fd59f376da635f9219da4057", - "53318d201dce2ec49ca733587543cce5655bbf5355e00e28f5bbeaf3c77f4647", - "3934128480666614ac39db02ea526f364b13ab7e3d69449967e46eecd20ce7a2", - "60b860c7397ad3ff67f0b3b99a6beec7b55f9aaae086eb17d7ce4a9240bedff6", - "bb212df32ee2dc75d630cad2c55b034aaeeed09874552c21f3d4f1635097f23d", - "a087a47c9ceb6f45bbbb1d9c09f014973d0856ec779df838ca8c851d86e24ad9", - "6d576fcc8b94e53531bb530122e57d13adeb55406e2adc8a20c712386ef9ec28", - "61645dafe4e1db321f5426300caf01d84961b2c3eb2a13b3cb451003e6970ec6", - "4d5a29a72e1c9fc7991f031966c29c05ce01d64a4ef4db0cec86dd6ab145f63c", - "5fb6662c8b338a4e28f5e530f37c0e9819f05e40154a4542349e139ee1f905e7", - "622d0ca39e8154457b7476792edfb1e6aa56ad57a29c9bc3febef8708cbe5d31", - "c524ad8dd79f14f1a39097d948cb2ccf6370cd43e60e3ec44b10dd24287b8cf1", - "07912993088786bb059447bc2ec9d4bb352cf2d34559dce4feeeaf5831d50e32", - "579e29f252373f4ba4999c857562b5340d229339c9c9040e067f19a8e0755418", - "a6d87733f1a3dba6afe23f135b00fecfc7da408dcf0efeb46aeb0ff319def174", - "f406c70157e11b2ea537a6a982ed472cbb556c9ea5f0d43a5c6b303d5556336e", - "59a66a2fc29c564d0d8bc56bd45a19d00039e10ccc48e3ca3ae0395142a60a7d", - "3297b378d5d9abe7ed237452992978a30b12483355671e35037e48e58796fc6b", - "a8fa6999b8c1bfd8f3ed8e783adbf524ca34d5ef8c3da2a1fad134906c298eaf", - "ee62cb68bfda5aac8dd44a70baa024c441477cbc02c09824e38c6d0b70d2b132", - "a7ab4f25e894fb57c19290128d0b1b6d5b413997146c4ceceade102777d70784", - "544c71a330db976d48e14ecb468366ffe8012453ef264430f77ac519561b93cd", - "ab47ce112a2cc4df1be71f895a810b77e4903e4cf4961f53cc4bd28f70cee626", - "b27be1120d13b8bc4bd503ebfb0e41f2ee92fc7411a69879e30e291c3d213a4b", - "f31a717154000d3b490433601d2b79026bbca743d30f9f680ce37d61a8e12041", - "d426cb1b3b1d49e6a85598db70948688d9985bbfb59a1a71f3982c2b12d46d6f", - "91efd2b662c7d102c069f34f09bba11ca097bfe496806753e910e23bc7ec1751", - "359c530ffe77940a7b69d4eb3e51b028273de22f35dfd935150f13cd54c7b1c7", - "1a7cd3fea2dfcac5aed78ac051726f5e7e67b782cadaea9923447e13f361e444", - "756a46b07d7878986f966b650ef63cb01e81944d83442314a2d4ee033c32595f", - "51b87bceb78d4aabb8134cfaec67cb74041d8bcde21df9699ec7c96e93098a26", - "fd762ebb5536bca55c1ec138271cc84699779b5a20381a223c0bc82bf7120ce5", - "50fe9b137120c3f9dde84891c312b01753b493cedab4404390b44374dc771631", - "18a43b084862d94f5f5d1a8d9319001d9e013234a6378a99fa46d22687b53cab", - "592b4bddadc94966b029414b9d46a4050c83af15a3221fdb954f37e8191a3818", - "5b7c999433e869d952862113b7bbe00c61742fdefd666db14d1bab8e471f14b9", - "67b00222e19f477b0570cb24cea465c40b6ba51c0559f4c017c4ce3b89293289", - "86c6be657c8e0739db869dcadf08246fe5d5af410a1690c00b3f9c2af32bdac3", - "d61d70bd5f7581fc0335dd2cf66001234dcd6cf74d6e5d47e8eaad854c1b7c05", - "c0bf087a0aeda9d8e7b51ff33996f888c9e5f8bb29a2b168e0a05ae3d3236493", - "831a4f241b67e9e3d0d72b38cffa81362fdc9e10d714562548bab560d4c88c36", - "7f5c0d45792b6709be4f3e591fee04f9831314fb4a545faca09294a683c1abca", - "a788fe76f3ce592846934f2f3bdfe405c93222d348a3b367fb93e87979c3233d", - "4d0dbc5654fcb360f1d9526eac9f90a63ed44e952164a3a114ad038c3c4473fc", - "5ea32347581fb92a4bcb1c6309b6cca911b2f45238dc8c35d12edf72d53fff5d", - "2059c2f295e1d521b00828d2f70019293997e1dcb2accf7749c515f16c83b76c", - "09019577b30ad2afc67e09afd509360bc2b4cebd80b8c1d0cf2e719be06100b1", - "ae5e6cccda657050325fac467d29e814d4c377199caf8cf53b1647fea9903c9f", - "9e13cb0efa5fd30d984acaba62869586b7b280dcf0e13041fff8ab36794473f0", - "311084b4d8c788b9ad5fa2df07ef711e7dcfff336879653d989aded9ee9486e2", - "80cec06201bba2f754c75fa75fd6101b508f4694da13106ec0f129c69e1084bd", - "dff1bccf894b608ae0b6af5a072746a67edea54eb79aab5cd2d3214f9fd7819d", - "4293286da3fd4788666bd11b75558157e4be40ee4f38f2cffcdc99845486d6cb", - "bbb37a246238c7e3cbf6073b581ffb1567f705b5e820975e11d4a28e5551023d", - "697ac69a816d7e6ee5feccfb782840921ec18b1b48d95a38f41835cf8a18b75e", - "79dd5335ac96f2c2755e41a28a29a7b8619fc8ebd6a98175e836c729040f3f7e", - "97dc80bb88fd0f5c6acb2751b266dd1ef7a286ec9ae5c22f01accdafaa9df224", - "d8bf3d9586665b8192cc8c537e6d4c00f70f51e8c3b2ff4a266b8d339d3e57bd", - "0387a9322a0463999c213d9362710e094557027d78cca63de01abb85e21f6de0", - "14031a4fa9b9bb50854348fa72b4ddfc71228cc64c5f2ebcbe6bc1962af8e402", - "7b774d10f64390f8d0f9ba24050d67f39cf4fb6e3e2d9664af1a516a930390ed", - "efbf0f281364c2d606f637fca0e07617cb728fe7cbc91c0d076f5b8453d14087", - "8f000c5026d2831e23ece7a63b9d6e06ff988f9ff7a79085fc85b75449aebf55", - "5b2cd9125cbd50ae939d3f654eccd03046fe4f40fe1fefc0ef40a924de01e744", - "e4b30b085cb903454fe9db356f53f496f7ab1b610f218ca5b8e40c7869ac0f7d", - "47fc4fdf5b873baa3ebd1dc7fb8d627414e4abf0dc205b362d8b583365360d6d", - "f49b29e9a54e4481f6fac33a3f40a9d1bd372e65646371db6b82872d7e68c6cc", - "dcd81c78f59decd67bbce0f4ad92bc05529edcc9a978e1937ff3f0c61c9621bc", - "2379280550bb0a6b6222e3a654d3df8d9c5049ddc9d4a01ca70eb1be3c0b1e45", - "aed87381de3874737b347d50a7948521b023c798a2b1fb1ad4dd37729bdc2f50", - "8d64e677638d916380058971cd982f65396389ab418f668279d2056e594f0bc8", - "0df3af0ea12aed74393cb3addae05d11bcb21d5928eb6e2c010634269ebacf6a", - "f36237409011e83b85b621201042461a546f9f47f5bd40b2c03604cc46609b01", - "b8f946902ee3b03483a5d6bfbfad2e914e0ce84357ef2e7151ab30211de3108c", - "dcdfedb06a843e6d892fc33ba25d355835aefa59fe8f12bf608efc06858affc5", - "281a274f4bdfac8a596245cdfa25563da2b8a57eb99146d213e018816c061fd1", - "cac1d6cd549c45077652c4bd8f0e974a2835192abc651a07a240b7d8edb0576a", - "73b9c6eb8596075bf4aa206faaeb3ca301296bbf91c29a203a78c30a6172bfda", - "ba035b2313cfd4064ddb56e1979316e19f9ef226046c653066ba677777c51492", - "bcb523995c27f363b9e5f8012b15e4e73c5d1bfe682b7fcc23ab4cdb3c266c31", - "3eff9baeda4f54abb5647970de3e22d108492cc568ab421817c3c65bd9116fd0", - "19a29814425894c3580241fa9d661fdaa49683928c0ca871f6a1def600064de7", - "2eba63a5e7ec64b4f09a415f3297e25521544b87421b51cfd7abd7b29299b389", - "ce80d2edaf82fd91c6e63ebf9b1fe22d3cc61e60ec556f4fb1b0ac5b7fa66e75", - "d08ec7477f5b86bddedfff97334edd2db9df63536e2fd3f3c47277f66c439f9e", - "30ee69e5b3698ffc1987042d5274a86fe2011b2342350008dcb0f30bd5c2c19c", - "298fa5c91d76a3f7c8b27d29ab602069a6d2e05bbb899435040d287c164e0016", - "1971b3f834ca6b812f87d64b7783000c5c1131a4fefa5541ede89b2b36a93496", - "88ea6c496e2f6a6efc5f5a5d732c562e8dffc674a505ef1872237f643e5813b0", - "6ae4f9e2a5c9dac88c26230c17069f4120f6639f11863031d9e751e1f0f7089b", - "ebde6f7e66781d11da633dc597388e0c20024f774ee6e081f47b28455bb67fe1", - "1003e333e60a77742944e2429562e918fc06018c8d9c1b457e8f64d1f1998198", - "87c237895f7cc289aaf72be7dd4aa06a0cce9cda1a026a5a4c8ba193d25f820b", - "06baa0d803192d2aa755e5696ae332d8ca0a84de14c61606746b86df995188cf", - "75bf1b9f0920a4192080cf1c4e9b7c7108af6e8aad773593904c0fdc7f6b6332", - "a0d76190663f57e204024fb5dbb51a661528bb8a40ddcd6fedcc2f48d85094b0", - "318c2646532e0bfe4d3f13d541d7b1260ca33854fbb037a5d734b820cfd3bf32", - "348a619b00fb30ef84e96f1554141c53c4b8cdd2a71480bca4cef3fedefb83f6", - "c567ba42ac5932f9ebcf63e56f41c3f6477d5e602f36ad2eb8101fcbe4176585", - "663b6287f3a9e3f9b967c5ccd889726cd40e2b58a5aeb51805048399529d1689", - "d0e83c7ae60948683484379904e00ce996a12e9cbcbe56ccfca80f05c39f4e9a", - "add7cdc769bdd317357a053f83319f78eddeb3996ae10a0abeb4883e572921d5", - "d0742f798817fd6f100fc29756173d1a889a123253ec6cdff80c7c2795521a6a", - "aaf51f568f06d9d3a21100ae4bcdf7223c662099545d775b939b9caba34c1d5c", - "be3a88059611811eb611b1000f0aa2c2583bc690f24d09a7cd79951397fed34d", - "cb0b927422ef57b6303a0665e25d60e3d762d8b5e7b8274e178026cc72a2bd21", - "f045bd1f148b038461e5c67679cf8146eb5173c969b5fd16aae74f58ce3d5ddd", - "1afa0ac2a1cf25d378cb4688b9d0d5427a33d5c06baecc2e636401f55fc4e84f", - "4c8b60da08593200e5a73bc6b557a5cfb669f65439e8c523aafac0683fc3a51d", - "495bfc59e9a19160f90ea08c88ca8e3416a443e02f8b1199663cfcf279504b00", - "e38e34946e31cdb7e68e9166da412102bb202e63474181efe5b22b281353d58a", - "ede00544de054133502937f739e17cfc4e0b8e14a6a34cc4680c7ca4816af022", - "3985073881fa3c8943d50d4825c23258540586d16390d3061ca7fd9ddffcb9ef", - "8107cba566e112552eff7821ef0b8800cbbace837d71d076e2626ae99b533f9f", - "401c8151c70ab647aa69cfc9907c3fc3913070b9495751df7c1397de8061af90", - "943f541b6a8569140e1ae53ed9eabc0bfd7c9aa14a49946ccb360d01750aca6f", - "d85c807ce6cb96ad66f73d386ef7d369b9cf587ede061524000846986c06c29c", - "e06a0ae769d80ab35b445bf4e68010ccf796d844dc0bb2395428ca7ec52de644", - "fd2f9f2050e9c126dd6241d1dff210af710bdf96dc046c89de3b3e817d35e635", - "d0410d237d95c57a703a63f7ae726f2a80e634ec372996dbc549ca3a28d87747", - "5853518628d7fe4cdda7eb53c80f6db245689f2d9e163637e3b013901011cefe", - "69b2a4a2a6f314ff84b942360596907a424b7f832f36cfe5aabcdcc1b0dd8e80", - "a877d3e2f8c4b2798199a764ac8f278ef694dfafd0c17f360ec1197ba61c6e00", - "a46924830ab5359d2bcfec74ee65b9663428cfb8e9595a8ad10b05bde8c19f8f", - "367ba72ada71e477ff6777335c947230391bda80b2f8537f56024f4c3a1e398f", - "5120cc055a70f0cf6c60f6ade959736e5e7a19f23c802068f3708e232e6b2904", - "d539f3e56298b151432dd88d12e87d0d85f60d892145818a34e7f8ca74785b4c", - "7863defb4d46911c93fe503e3799331466327f0ff3e43a6ee094d16042b617c0", - "a8037ddfbb17cee0e276c76b5b5cbad92584a3058fd1791c38e54772084ad146", - "1180b4ef83ab3f75a98c1a54de706f1eb84b15395884c2715e230d48256f84a2", - "ddab260472fd8fc21f08209d5c718faeef8fbd7aa60cf5d86113cdf6918e5dcd", - "37b31f9726e60a37724b2e47ff22cd53b3a95f7e0b44c69fddb3f6263a755cf9", - "519bf48cfe8526d6ee1f30c77f9980431a79bef3e7827de794b6622e39b8a9ff", - "241726f12d94542193fe136f995a771b3daa0119f1b4d1bfe6b211d852ed12f1", - "544633033077b2d1fa3827934a22b04733e318efe150b7dac303366dd03eac4e", - "f13b002e3e82b640b11c2d7c56ccfd8f84083a0be1a150beffe9685d38169241", - "f2e06b75efd7b4a13ab96e191ed93d884965dac5aaafa4ffc47d19c0ff0b7694", - "64de4f88e1a239295c194c637aa368afe8f16458afb3ac26c1237d182132c33e", - "da3c18708aeb25e3498e64d8191a07ccdf00c3424f40b84802a9bca7ae803852", - "5c025cef1fac1b5eae5f7b348d090a7d8cae6df4ad4f034ae9a2bc989c10b557", - "dbc3ab102ef25af18f61ae36b2fdda826baf7d0bad181bc5b3c4d0b1aa47c631", - "bb6f5e4b2b0f19e6a155c4034d2e0d093b5cc18792dcd23dc4f08fe5ea6c2451", - "d0d37cf34c432d3346fc792b796946857b699ff36e031e11c1759967c35d7ac9", - "05d3504b79899b7df9e3ed25f93f988896568d9c4a511a75a01c1de9fa2a1173", - "029e70229db948d8b1d9abf2b4df2bd258938a229b6fb86ae5fc525c738ee3e4", - "e2f003a2479f3489283fc658e3fd538cb113a086a92d2bf3596b1814d5c3b34e", - "a4649fde594891362dc85059d5df36fbff817314875b08f83d8bf37e805f32e4", - "b128c6be78b011729a57ce7298847574c476897e11b7e476660848e604160488", - "a7d527f223f3d8dda03a42b0ca53b9e5ab4b355a310cba69d930b352ed19f0a1", - "405dab63276c72baf10ee4d23451a340f1008f341e0e5ea75435459ee1631712", - "ac836ee368d24960e0cd3b8cbc25574ca16b707b3ec40a627d15d9a768e4ffb5", - "34983a76e6641d25db9d21b5ab7a086a9161172c00f7a9c03ac13ed31fffd91b", - "aaee262517c988f55a43416c6de387dff5a8e7d8b413b5d465b797db3be2bff8", - "a8c4c65d6d3fd3bfbd690335277a514324ff9cb86506420e472b9557d3f70df1", - "3642520621dabfe8712087be614c59c885e8e6ea11e62e8ffc12bea10d459b25", - "2f2ea72f5d5c4b37c83cc6e12a7c15c8961f2c49a0b49d6fe8fa0f7d00145705", - "099b311867423061ed1bb3616ca3704e774d2dffdedc71f445bdc8528db19917", - "0da9633ec11faf301c12ee1a05d0dfd48e0be1cf9dc96ec8b5212e47d26b02cc", - "19a6f1bfd5874feba5e212c2b4be9a4e6dd9e09a0517efd7fbd3c95bde9d2d8f", - "cb90a5546b2183d595190388bcb37df5522f4cfc4bf77e61096e0aa0b5febe06", - "042a9caa8808f7153069b37d02d8569260135239bcf11ff727af684f54e933bb", - "651d5f35786dabdfffd9cddea0f6726f7299c805f7e5849ec44137b217676699", - "3ccbe99db00574503905d84701d41ab494fce77c758273eb2ecc4b086e1d76bb", - "ce971a7e904516b52e09f7dd049ff501c87e2e8419f442b6652cae346f5779ba", - "49c5deb3ff450f47aba9492f27c06598825e1cfc43afb15b618e255ecdb02eca", - "cdaff08a9e3d15ebcce93e683e2cd67cb67d8701f206e1084d3f2e4b97955fca", - "9275d8a37444429dfda2c724ac3af4566447babcf173304704386077f72c66e5", - "887077da0e4b5006eb0bc6901dcaaef046eaecc73ecba32d20eb3102e2f5db01", - "fc585b7fb0ea5c6f8fd1682bc87c085dbb8355215327ff5c8b55daba7164f5dc", - "f04efaa18f7540984dfbdf1ca94a04fdbf0a498a40e5284ce450a615a02d94f7", - "f1de84c376fb306f5ae9a8117353d5fded405df4f3a15c6f9b767d56ab9cd018", - "f9a9b0338aa85f57054a29831ad821ab649cd96e4464a3c866cb0b1a15322e02", - "179332d17379be53251450252b2b11e9981a46b06a0f38593271499aafdae6c5", - "b4ada80c2e3421f58ac4d304425167332d15314433b6fe0e8e9a639a6c2f8c7a", - "835326760adae375be1b0361b83df9d9beb80bea0def1919b8d762b880be8a5e", - "929ee27ee61c6f76af2caaeac4f546e30b67b2242072dc26875aa318aa59df57", - "1038ea4e9bf5771f7ac7e291fbe6a1ea6594be132f24960673ef7505aead930d", - "aa77a2bc92dc661aa7b55ecf3740a190938156a9555e70872a5f1de34d26cc1f", - "8267b62dfd1add58286813aee6ac8dc78cb9c19c73a0b707643a0237d02793c5", - "42a761a8eabb831aac9e066b8cc390051e720126d873a7d147e6382c02bbaf16", - "ff7bf885f14d1c31b3805a8065e8574698de22474f9d10a403ec375641c43903", - "22fd23a88ee0ebce59355e3de3719747330247c89ead07fe797ef5140e2f11aa", - "660b066e28a8fc7a87d1f7469a871188ce79d2969f78483a916d873133071650", - "e69e0b81dd5de46f6628b67a70c2307e92444b30a1848e38ac9f0dc45cadef3f", - "611fe1fdf26f74d9fe4963335f76b28a3d8ca9e4d4308a79300530decc300287", - "f6f0a43262eb718b7267de4efdb08f46959595498b4c2b91c05df48bd42a5ab1", - "b16c67a0eb4eaaa7de0af86427507b395af7e8f513299916485666450794b0ba", - "9cf6557cde39984cd4648e0a6cc81f4fc355682b9819cc74657b115387a66923", - "f9e031e7018dad1d81b38de2549c810b37ad2a656b8e3b36987857e39e2e5d99", - "e3612dee3ce89a32b01a705d38cb7e039ab7fa1a67fde33cdd004738e773e803", - "24055fc17382b5f3dad81fba9ef076c5a832fdd97a5b33c824f8c286351b786c", - "2390f8d647faec873abb6c05b4572c07bc6844513c7041ab7e097523eb8dc5c4", - "54683a2517def67cbafdc97007bf9c2bc673a3be8eb465b478e3446ddc298ab8", - "a44be40d51b042dcf7b72aab1bed436c079634c7ebdfec0a6a727eceac10b3db", - "d145d9e805148436354045e0c027302b4eeac855740306af19f0911081f7b2e3", - "17c10cb64403790b604b92ac2dbde3de72a319d16a33ab5b5f2279e2cdbdbe58", - "feabb3ccf7e008932a5090e8991077f44565d94dfcc8e07fcfa360bd08ee9280", - "e29b716ffec5a3a340f5a39b49ee15a5e8738710ede51c695f3b99a65a2e4827", - "e7c6b29ad0af3d9596feb2dae510b43b0626eb339682dca0a94f199369ba7e68", - "6084f32f3c50f17bfd20ad6829450e59547a4bc88bb7210ee00dfbf4e52f5ed1", - "5782e63724b37d118747b7182702b635b75b738919a5b81d254cd879d1e013f2", - "eb3bfbf85ee94d796231e16d57cea5953303c4b755e5caa581eee86207545760", - "bd1bf3c8087b7b1f0e579f88a7fac275a190c3a24a4ee03ef1e505764da441a2", - "e0511cae30b52649fa28c4157573886172f9b98780b1dbf4ae6c48b4099ff1f6", - "cb20ab96058308d22a1edfb942cd6317f24910dc8032e69a38704583747dccc2", - "aea788209f6f6d2a70aec92c7ac02d11b1ff1c6ffa5998d01c985cd2cd10f362", - "71f1e03cafe0b79e85f69b6a31f7044960c2894e1eba54998d137ff69968708c", - "e3e1db97d621a264001cae7e0fef4762041fefb6079f26fb99ace874b277fa29", - "647dc6c76bd7d3c557c263add8b2fb7db2dd2dadb6a95cc1c186c0c8d8c5d520", - "80c6a5466fff700d79ff80005eaf0c2b27f9d47529fd2cdff381e5c4940ac703", - "a042cb3f47c392343ef7b7e109d01404681de18bef966bdbe02d74d2e17996de", - "f7e827e84c6f503712a309b61460ca224ff82118c29e15e981cd137ae48f11fc", - "32f557f9a145af4cd58e31ad9647e8f6d5dbd9864dbb48e6fc6961ae09d20e68", - "4601d6ced507cefc7b215a6e9e487af6fd6f950b6d255766194e4e0df1cbbda8", - "146ba44fabdc8a9ac680ec6050888383148445e5c50614ef00e97a22935add21", - "567a8f6b27cefba3a73f9522b3d8081024f89069d70c96c2449b0c9935fd2415", - "578189fb48324517d22fff278057361662e7c3768ba56b15a0cf603b66e013b8", - "1a8db29446f6953827eb178b94e2f9f21774618cb361cb231844eae96f4f4ed5", - "e02a525a15e528b022b90489b20fc2967fcfcd7d745f9c24f1d1a0c34cea1d6d", - "84a7f1573da4c3bc35e8178c15e64dec40d36b4943992ec1e76fd368a27aa858", - "ae5a1f7318d94e50b8dbeef563112db7c4d6efb5efb05bdb8af152cab30242a5", - "728faee37334388e915aa560bc7c2b3b5296df68c6cce4e7c0190cf1e8753a62", - "97b399d45f4d580ba1380345d8d46494f0de64663cc16a6e8d2beb962f68ab2b", - "191fc26abcea02303572f5af40a5b630bc86176c96759ca780d04e67352b87c1", - "8764ecccf265f9c9250c9712ccf6e8e3768ba5137921cc5446f7af1e06870a5c", - "2e9a1cc260b1865329c9c94699de8cce2dff12a203bac12b3f131b036f9cbff0", - "a78e8e643482c4a69cf151ec6241dbb21da2e0bf3b7dfb7c82cdb439523eedf5", - "b3448af989bee81c4577fd76790aba872c19aad3a1875ae3b255a1e4d35005ec", - "ed16c8f8f65614f080cdb0f71ec5f3331a4940db1ed638ba635937ee5ea066bb", - "d2e484b006de11ccf641d131bff1461d5ed1c890c2ebc7d5e1da531180ec1f59", - "cc2d9e27744d6e819b832c38a2ab74e6614b9f5b0a1e59549436b867017d8e1f", - "0f3cbc4dcc45fa0078ba6efcf102be108515a70370b0bcd8930c6f34863c763d", - "6a3ed10bcc736da58707badf0fdf86f08080ef82c2f86fa23993400aaefcef49", - "1b7b897d883b894e2145efceb8e7821b39424dac2b1112d39f66ee04811aea3a", - "21a3eb7e754b35b0ea9e2f535cbab7decf59dfd42fb6d4a36f189aa35e702dad", - "ad56680afe65891285c3deca9a3f1406a849d65eb27f07977495e07c502ed61e", - "bc44a81525c1b428daf8a588074441051d3270b4511a9ffff5395be152f2bfeb", - "66d7ec8d2bae14699da72d187bebdc8b2fb870124271a1fad5fe4c89948f5f05", - "ce946e9e5762e2f12890b90b6dca8884d797936f2a3bd3b7c81d67a7a12e3cbd", - "a8832e399de024673673b058dde8565d44720142b16f0bc408b9877e36ace9e9", - "f32c27a27bfe99b08e7a48e74131c08b625ae7f012e79dbd40fc52dd3f9082f8", - "a82230079ba9cc9ec0ffaee70e08e8c68366da8eddf0aace5f341daf76996545", - "c1aa43ce54a1eb3167efe759d2cc7bffe16bb3b43da4bd5fcc3572609cfb28c6", - "5e9d506ed0985a58819c83e95c5fcf8ae579ba6ef6d49f2d45b00a2428463550", - "89af01f18de16e284630c8f5982078b8beca2fb59e78a4a13db5946b637105c1", - "e48d3d16667e0bc61c050e9961afcee40bb79addf0a0c77cc685b0d68b6aebea", - "8b11cb0d00bc05083ea90b3cb066bba7eac4c8d7cd4321f2b7a02e5a548798c1", - "38e636b88670070cd3a47e5562f0fab83b6af7e2aebfd222ff776191ed15f594", - "b5e26ca25be95741bd647a61569521be366e247706e79c9a0db4bbf2b0473079", - "765e29803b4b121986d6aac83f1a15a5e7eb51d783c50739dd16ea8bbf508dfa", - "b1943fc87b56ee633618cba68390e25dd1c1eb7b91d262f1a0d0f01498086bc8", - "fe9911526c7ddc6ad726e3da99a7e25952834e15430f2324177ec39251c8c67d", - "b84491f3297543ca24105730f61b8db0aef5d69f4210173254aff1fe4a3ae2c9", - "0a5dfc6a36dc6fe4e111999a8d8aa5a7427f8851e766dd65f4d3980b6b7cd055", - "d8fa4a7db39401464d7ba90cd15f77ed7c52f58a60ee66e34a69fa5284fbf269", - "2b0b5040d4a27489fa127a5681897ac56e3c8214acf6acb56b662e9b6490534d", - "d205a8976d541c90097f160f5010eaa25eb46b5091e93508cd0c32974e3d7e1b", - "793dcf740b03efcfc03c2c0bea58d3e991a96f1457a35301059cafebb852d4d3", - "2039e115c73429b9a31f0d30bbab51f411d4fa488d0901db867a8bcbd1e1d510", - "af31a306f917da5d05dcc1caa0ee536d7b813ce39eda6272053b214ffacd8c32", - "1e1104d4cd04dda95c591b64fe66541e0c618ff2119d541351022de6453c2549", - "270fcc93218f01960e7143755af626089cb99853ef43dbe5d1be403af6c5e603", - "b1acfe14ce5f0ddbfbf506e9393c5802b041c5b081a72ac11956813afeace652", - "ca47319afbe026c5790e0edffe98876438603a57f775037ee3a645e264a83244", - "f188210420defea0a974046c9eeda5c3e06976e29764143d8abdba0a1081d383", - "da684ad92c4bfe9436a76ab801a419f064a1f713e3fca61246a28b27bdffc5da", - "104a0c67a931c84f8c323aa98e5acf290a29e11199e257998f2fe5dea7d2436c", - "edb98a123daee426e62ad083e883bcdfc40f902bd6a2d76dc47c07151cadfddb", - "09c7d9f2420beaec05ac56124af6679e03f2e74fd5fae2ed916f179695bfd7cf", - "db23522c626418569036cc142b0edc56884ed11aff98ef0cc662d36d56e12316", - "bb27e77394a00d2119033e3ee83dce939fe71a21499a15a5e0a4a97294d0bc3b", - "df22fd3ffcbcc9fa25a95e5a1c9f853a0cf93a8cff18520751833358cdd92e1d", - "6ac18a6a97893dd35678e2380231de1598c3dcfbef5a7e26ac034a3926bad4c0", - "ff7f54a5d437bbfa0e8e9aee9ffa462027c716de44dce33f6dfac44d06ad243c", - "f8e5e6838410ae1635d04ce45ad5f85c3ca07e43de2ad876ae70946df199b322", - "484766901b27301a2c24231a6f86f02af0b964148889fa87a6bc6fd9b50a30e0", - "2fac16abb19e0cc2ab8ba005321015a97247c5aa1cbd9d4122fb402b9a4c0010", - "2d41d4a499b3c5d35728f9936ccb4aa66035c70d164c4d3c52ae8740938fde5a", - "f7817318490139d82ce28631e7d2e3e302f4a6f786d549793204b040c6e474c6", - "1285b76c6601cfde0ed8137b99cd517dee9b653f478bb72d649736928ee8b0bb", - "3b1b89e1a31e929450f04794af9be6da9d08c6b1f592d38d8842b98126c6bec8", - "de88c85ad897ee7285de68c1cdd89581b908cabcd1038d0be2f50bf5f93048d9", - "848b309d279c710ca8a89fc1256cfe805fc1b2acf6997d70f9be02d2a815f921", - "7b991cd2447c8d013feac1f7cfa6fd84cd2e94e4fcda0a341656738aa64b7c63", - "c09179ae836e10ff42aefeef7602917511fa1f84a1f0ee08c9eb340ce9c91c54", - "5c7ae32f2aaac5f7785575ef5d0dc276e3b1cbd00d689c7a12180b9804cbed8e", - "dbeab40cdd3be59b5f6b078d31557e65a690e80319c2db5c81e78f8d13e4c933", - "49b871030ea873dd3259ba193475ad9df1eb77abd3bbf66610ac4ae08e3066d0", - "5359616b918c0b7f1ae12fca7c3e561de7fe23a8faa802e809bcbd041a00a198", - "0bf76a9dfc2465845d8232942b7d3273fe16cd8fef051eeabe099eef116013ad", - "3dcf6f4c28dc4318c1e20afb08f29a0f6e361bfe1432a037a0ffce0c79fcd7b4", - "b04d5e805080f7380524805d89d6e90d7e004f91d28ee5d7bf938477906258f1", - "f0e3ecc7efd42715ae1ed400f3a2e8ec590db0f7f4b740f837840b3c8f00e4a0", - "e4aeebef1c04fe06e9061346eb340dc8701e358021e19976b097cbb67f053616", - "71c8aa8f754f3222ae9d5a1620a40807168e6c5157e1eedd347c75f9893a4455", - "39b1b7b8058b03bb0a94d2c1a1337c5407dcac9b4adc71f628dc9ed7d033a290", - "26ee661ec7a51460a5b3e95bd0596b39eafe62c97ddab67183e65f77ecaa4b6b", - "9531f038341a14ce757bb87aad8ec779398d47831b1f327a175640741d1a35e8", - "f013d6b1b09140c59268034ad9175916bd3778282b566709ac30f43744fd2971", - "034bcb59994d99ffa9ede51f1eab66f7d61a68af9b3e0a2ef04a28cd47f63f49", - "8497dc946c0d51c65cde28b7aaa52d38e9a2a77c70231d2461f3b09964117be4", - "6cf46a9ea6ec058e33f47c2579fe569a56527cc4b50aca007d7d94c35a1aefb1", - "f9f53966f67744b2a54a1fe7c4204f6c0245efffb9bf8c7c5c2d4a111d07c0cc", - "39d0e71283bd9d4afc86d3185f1325b13659c1e20541a4129d8d28b6a66d5847", - "2ca2071401ed21e8a9f6368a3eb14e8200ca610179b5f57a2912f966a85e0c0b", - "3c1bb8b8e5ba4bc83fa8f4ecd82f665745d180fbb8ccbf81355e18266bb9bc60", - "40c16a3a1d9f7e0408856f740d6084ec973c5417bef4d481468620d262184749", - "9860eaaa0b9329066db818893d6d22c39bf6c0083ebed0b11c1c5345a6134840", - "aa9ae1bb0a030e691321ce7bd79d08c5405f1588a87dfda39cb45e19241cbf6a", - "14a5ba0ffe5441377259593b6b925f53ae988f5502246c02a52c6ee7a2501cc9", - "fc3c6480a7152493af51ae5b644bbbc312e783296b9cfa5c29b21fe021173114", - "e52f3f2812a8930bc5c7e2e3b76b73ad860673ee6de6ab673462f3385034c1d7", - "70187ea3679d72bc64706b8c973ba1174a9bb12fc28d6cd404d78c02fff1c3cb", - "509352363df949409b7e38b429c57210bcd6eb6020e10c143b1f5e2d4df910eb", - "870824b48a1946be225f5be2dc58d5d3fe05dd3ef85b5629768ca4323b64ab3a", - "32b8df1f82acc5c464d0eb32bc5a8156ea4d1f705c8ded0e495bfa84fb8207e2", - "6f0be386d0f88d6686d81e3ad23d92ada9e43cf49ee43923f6baf74bc66b45d7", - "59a8c7710f7c4884bd52d0506e0a2231eb75abfd6dddfc96b0b66c118ab7887e", - "aaed88a21accf188c68c1853ec2e094b74b80d60fae95ca8f17089142387e082", - "53c52aa3aa2231e49dd9910add76e4d2e46de4037ee86c632a5237ccca4eb4d9", - "dcfc7c3ca8c524749f77de9fc1522c393e4c5cf37e7a228e694c14205c0c9b6e", - "e387eab6af0f3875857c34f651f0678028ea1ea9a52f23619b00be9018c1cfdb", - "ba09fb9a5be4ee99f6bf3f918d5fde53aeaf245454a9889ba00b6ee5850f8481", - "31be69153da47569f2cedb7c6bf0768097eb168c794dbd4972858bfeb5d951c3", - "cf0761748dab7b65fdd43efb98ffadfe380612bac4bd7ac13c1ececb575b9616", - "583f318173231a8dcf367cc30f626e5e47a9e60300291dca8acdd3a46e0d64b4", - "72b02a269019474a86f27a597cd07f2923e993d79a2a50e7009e31f8ea733186", - "ceaf03a285c7862125e51c513a68e5091dceaf619c917788a5783713ca86cb4f", - "188bc27e1fe63cd7e82093020c4123d2f1f0c4e6766a9e3ac2ecc7adf71a3ed4", - "6694a6cf0b9251887e1c86732b1bffda096fb723c73ce05cf959e2e9aef02601", - "09ec3933613a76af1e9e95c1aa4acc7994c01e72c611b476731f7cf195e9aa6b", - "ecb69020ed950f53e6c3b134839bdbc5b0ca85798ba7e4a1cc2eadbe7c4a5ccf", - "c226134324a474d17fd29de85f42fec9f89d3bb3622aaacb1f1173065c1f5c55", - "1498c80dcabf99e14f7bca09a44f8eae0ce2b63cd6d3650c0a80f26bbc839d30", - "9866b4e4c11e2a64917cbc5d95737a7f519d1765bfb3e0c63cfdd62e61179411", - "4fe7dd3c4484d753638285ff648acfbad8fdb66237b313dade9087a601d9785a", - "b76ffc4bd41a86819fc6401e2e5a98e669ddfe6187cde9d251953d648c9a995a", - "1a1d519b13a4353659fdc6556b73678756f290a6e8934ec0bb4dafe7feb795d8", - "a5ce8045d66a8d3999ff256e22849e7d0b36b0b3926c5533761a0621a1a344ec", - "eeb53f335eeb58738dbd5771332b23ec2a24e3f15caf83ca5a9d0dea4e6238b9", - "5fa4aae83fa5f0017a6c3463ccfb055ecdcd4f0a637d3c202e54b57c27ca48d6", - "3e7260cd04556b3de2caaa64eff5585cc47d0a603a681c4220c80e3f3c9f4dcc", - "75cdf11737af774dfa8ffb0876d6b76cec9d7911bad1ae8a5ecb17feccc6f62f", - "be9841ba6e8de75a35d6fc96580e342ca891236249bb9bf09b410a365020c1db", - "581e70c77259a6319a1484535bcbbfc929bb1229bfa5d2335f490ef87414ca00", - "0b56fe6752e8ccac11442c82263cd8a3db0e6243c2715a74cf8957a8986e37b8", - "96dcbcfdd6fa8e594804a87c15e2574350f78c527f6e1674b9ff8bccfb59f9af", - "f757de4c891f1ae1880bfdafb2acb1e0424eb6c67bd6496067628f8098629a5c", - "2930109ae3e1e1e491b20aaadd5a8006ba07034ebe7c2f8967b84904c91c5ac6", - "e4b47a326b3e7c332835bc0b6be768abb2eb8fd56057ce7f178d95d6db55843c", - "39a8f74d6573630997d6e07b75975d71332e6a8d3dcc3ad4b627c130e40cac05", - "3804db3df43d61359e34b041c8735ab5a7eb0a7715d3d2f08caaea9b2865e76d", - "e6b722a84a54fb6d469c34892bb1c06a8c70659c550e32e73e794293c60d000f", - "5ad4666c24894f2413ee3e1f937fe3c2547fb7ec6e79b52ba43bc42fa7774657", - "d749a5354b7fc7afe60244895f54c6ab2b21fa1aacca0d81bb51f93e7c49cc5c", - "cb1e6bd84a3c285daa188549a45d683f8707f0dc2e2191e2fd76c22b4cc9bfdf", - "a72eca99df2b15e16330c0ad8022d07c25d3c57b9115bc57f8c4f4b965c3a153", - "11cc2d50b227c60b9d15e794f2da7d014c795852d851949f80e34c6e8b171264", - "59d918d1ea64c090e961b3970fcd83dc2951bf3ac04dad382b6b020ef2c2f138", - "b4effeb5f41672e4975c7838075b934ce2c6a54a11739ad2517dfbcb450f0740", - "545060109065fb84a1ed1b8f0fd11d50854863d9dcc0a71ee9e52d1e7e11b66f", - "d989740b0ba190051f656da98e0b8b19ca3d877347537d519bd68d55a3b2fbd4", - "73208009be4225890923c0dd5ec526594635351ab26738b5a9e1830cd80c258a", - "714043587c0e92ca6cda4f217116ee899b332db1cfe0e38c4fc942e41908815b", - "3ed9413e2de49cfab97b428ff14b847892603f0db1df9a24a27bd4786e953d10", - "3c9db764d5ee5851755ca9132910304277ec2fe31f29f5b7138dec93563d48a9", - "366cfca49ca993a35e8ac620e45e92562aae102aed87e2e24922616bed407275", - "eb1a4786d054be842e22b6117c7379568e770550e404f4784075c2e24dad44df", - "30ae8516ada0dcfbb74eb8f7259f6315f254d6c22a0a01541e263f3a6b4828df", - "daf29ca93c159532f41ec5d332d7cef0bdf0c3e8d3799b476937186147ebab67", - "df3f208d52e5fb8d5b9dca34e570add6448de2400b5931675c3006d5d135063d", - "68db6f6eb9ccb4ca79fc5da661564b9e9fb304efa5284ebb32c076fbcc193476", - "355a1e01b05fbe85884aa947ddf32ccca5c7a45a5f28f7895c6031f3d621dc79", - "21f0bcd693119846b660ae14adfc6128569ef40537fab7ff8a78b16a56ef54c0", - "96ba39f2a8c90a28a2a8680d5a8cd0ed2f8df3053e5079e9c095eaf56139e198", - "61ef2abbc2b1a2d0883e88dc0695b1c4cebf59feb0339bc5851d47673f54626a", - "7a99b0a7da65ac3081a1b5c077b0bdd9ff198dd28375eb21bfeab73b8b01d4d3", - "d1b5db9c79b07928139d0ca561270c2862c291e33fa4c43b613e7abe361e23fe", - "4bd4a9ea8292b91484c6a55983aee7a6112d5dc3c61c80457ed9ff3d2cc81f61", - "bcb32519b28cb3cd9c6624920a7344be028de2bba6cc43129130763122c1d232", - "921822be36e641315b22021aeced4ab5a9f8a8c744be30bdeba670f01761eee4", - "f6bf18003930586d22a34f9a3cfca2ba6e09f48a14f03833713da747801136c0", - "dd0ab967fa8c41d76f96ffbf6ef656aea804645f7a5c1b9b29f9be875f339922", - "57518609e60ce183cb3bb8a0e1d1a138340e44ed6b9a205c031e9b352c176476", - "7bb8d18bc36e179eccc624fbd4855fec54fba80fa9a380e9148fa476256082d9", - "6ad3b0214dd1d5f4f52e66ad8e3645393b51473fc0f305561d7f2428e6f644d5", - "a18a82fe96be3fdf0f09733004612e6f1640c00f7fb2663fd15176d4e9ef0843", - "3fb2798cb41551b8dfc48709246f070aa31c4c2ac7fe1750dd7c70c6f93731d2", - "0ec1b7901594b75ee90eec2856e9c4d98f094d6409d6a4a04f55f37c1179059c", - "8978400ade0bfa49996df607532e1060f58ad153eea819d6242cfaa7d5fbd270", - "89f65dc4c7bf7b6495d2643d61b4aa9c8fa01c770f55032245bfee6b8c912a49", - "d90415c9f091b0ee21222cf4053341b9d7d5468d0fd636e7c2f5879da151936d", - "1d3b28e08bb0203937366b097021efe60ba3ac719dc197a1f0437081b587e416", - "eea2f8ce79b2205a70a279c0e672541218c984a3e0c5bd6df01495be54ae6fc8", - "8e370c17bba0af651e2cf9f21c859bd195ff2e3865270202797f9ccb96f8f6e1", - "a27cdea672ff10ea9ef76d597c91b85cc5d23ea59804c6b223d917fa3f08cfc8", - "9ab8c65bad77c1f0862e93cc885232ebe8ae37b35e4260d8101d05afbe46d562", - "e7a1c7711783cffde21b081288a9564a11fba3d76a799bf3778bfaef7763cb34", - "71b9eb20889ed49d6c8bd1e33a11cf0d74f946c23fc259771234e57a001a0c87", - "c48cced3f8cfc903fa609ab6aa73d02ec0d786afce19b93f27757c8b3a486527", - "ca8c35ed1e2b9765468ec055a7f669acfa80d8b3cd072cc6a98450ce686901d5", - "37ac209be6c7e386d1b57b9817ad0c49bd9d9fd9ea1cac8fc88db342ac99a7d0", - "60b120133213131c8629f630c933545ebda5278abf319cc99b3d901bfa2954d3", - "eb28ab07438b3518607c5a9ab47b14c8bd26f1667ba58bf4eced619fdf569bfd", - "de5f641b4f4f412d92785819166c7ac47dbfba8cff6a16e78dbc486883637072", - "ca2e2b0d1b4ef52ae7acf6494e2806fc829061ffc4e8cea4eafa0aeed39add2d", - "078822616c6c9e42b96ec137bb2f61e2cc5fd5d728344e8c670681b5bd39ba4a", - "15236f341c9bcb92393707c001c6fad96f615a99da3876f925c16b2a3da22b23", - "dd8cc4ef092a9af306ce2716aeaf12ad34e250513511d76c84091e7ce3f8f50f", - "e4e698b932a7ea06ea400adecee7f730d06eaebf4fbe21a3c9d8bafe0aa1fc04", - "fdc44fa3f87ea48c978a5e6942f5a4a228b8311b538905184ca50d260496dff6", - "ab808525462c13254994e89311b1932fa08f78dd5557d9fbe9ce46e22449f6ae", - "61bdd3864eea0d8e0928d74e5175abb8d73ba9f0837e3758ac8bb59c071fbf69", - "f186cf9961b52781fb32f84462de35f97e182618456f221b321ba07b040928d2", - "2cc788838cd7d036ed638fafa49d30a7ffc6a69ea3be57e5c19302919778d7fc", - "b95592ae7ae57a74cb0719bfc99dfcb701bf1332763f6658918614be9b6dff41", - "4327a5fc63f7cd98c4aa1658f64c34fd1577992110e405f0687217f461c94d15", - "75aa0c47d50501f8a5e1f4d6273de3f359466f956a38c2f94dc30a4fa9f52218", - "7b44e85fa025946ae194d911f2959c507242c4bf3797499b33ee16cf0813b8c2", - "f4f6bd4158ce6b37ce13a95c1fb3c80a82b19a3722ad3261f81f75018ad209ab", - "2e9e33b9dea663e74e6467ae606eef816a76a721345963b337c1d922a0a38366", - "3f0385cd6aeaf3289a801ce495bbe9c570bece99344dffdb9f43033cca982184", - "eb5c31a5a8aa8239ad589d6c45e53e7f65fa8caf9f6779b0be5b467f1d59fa74", - "8158deafba717dd9d186263f19d78325d2fb6a4def88dc42f288b785a76fb0e5", - "3234e1718827bb7065fb1d33ca875f5eab284f68b5dff295a44d6f1959bf7f16", - "16086e02078adf876f5bb3476bacd28029d0fedc5d4258afc8ed1b36367b7c38", - "69248ddc5d6d559af7ec75b4c8c7f264638fb3b97842a4bed12e07c97a18a07b", - "e1e73f6292615069314820747ea5cbf23c19bd0b14a95a6d99a898099e5c6632", - "6bddd1661bddef0e64878da743feb447a3e2715f5fdfa8c297d9d721f29b9238", - "26038f19c13b3d8c5f647ba57b513c2f705622c447d99e0d8c6e552b712e7e12", - "138e2a5112ee704343bf70da52e22d493c356ed80c2fb5bbeea08c02a0342997", - "060b4f462ccc8f21a273f79ecbcaef2a80837eb83d552ef3f7e1ed13b8dcce22", - "524a6d0c2ba7d6822c1d5985842559a1064e46f78dedb9f6a14be615bcd165a9", - "ed7efd5255f706a0e7593181b1df23fa16456d1899ea82776a8df11760bf138c", - "ab58ddbfeec24f2550544f54954d556910b3cd64792dbb1f53ce7caa267d4b2d", - "b99be0d1793ba69216eeabd6cea2fa30e47bdd07fa2c96740f3779ab1d150f56", - "7f999d97ceb1b6eaa4cac10352ed43037ce49c927b95b4c0a8ff8f58e3299971", - "521a676d423d10910adfa616e382939aa18807755ccbf39f07402f22f949dce4", - "bfa91603f93ad15f515b23c76a3996ecdcaf07f575653c1f83618f4f182f5e13", - "5cde591e93ad9951605693263bb468e23c3a94d0f7515ee6aa7786fadb2f638d", - "d7c7606250ba2794bb346f75813811bbe59b60ce1351480ce0edd0091a163b0e", - "f3216e876406267b49ffd37f566959a8acce14f21bf5032009f608f5a91aa2b3", - "00118efa3e4d079d434f9255dd172497519e405a460aa0adf0d7d04cc61e08fd", - "56c1e87edab7b61b2b7915304bf2e81b41fea73e9e9efee680e4160691f098d4", - "bbfa389019484833d83c5f3007778ea1a17eb2b6d93aff3543add0add7830ce6", - "a73dfe9682647e1d4f4e3484510f77577b0e495016992d89206211206896ac23", - "95c65b1b741fb8e3bf69fa45c102a8e77085f5ce1a743c1a7ca37b1154aa211d", - "14c7e5ba07bdb275944dd88a2666e1ed8cff4482a4ccc3430b9fcecfc7ccde9f", - "3f60d5919bd55bc0612021923fd8b08a3d1e9417e374740e79e7a2237b7345d7", - "e71ae743766f18939b5e9471f450db408b8f8c69a3050f67c775a0aea66e60ed", - "28c15eb3ac62c46aa752f01fa0b1e2e62a79986e85b271f8345d3e95452f33ba", - "a8090c502719a36ae2f77327094d815626e1457d72442040f236914c47522010", - "a3386e2da33025cc3104ae1f41ff862a9c97abfb1687597586075f30d679b107", - "e963ef385a5fee663fcca770d4506f5735da84fb67343fef68a7d82c692c2b39", - "30952a30f1a3fa0a5d834c80cff2db1aa449ce362e610ac14457100fc0328dc5", - "dadb9f72a576a0562c660974550d42a3dc0665b73f26f90fe6fba814eff5c23a", - "4c97471e3294448073c9bb8541e68a044944a61d633d68fa4170ca51036656f6", - "a870fde27abc2521e66f8dc00a2738c01669d5a093152beafd31fc6fbeee89d5", - "3cac87b3d58ebbbef3411a4ee474b549f492d754d3f79b1f30412bb9b4defa8f", - "61ba37f6b2d183303c10038cac56024db555381a59c5d2fdb2fa8be77f5c4e9d", - "96bbb2796b0c3bb8da907b5f1fd40d55d8c378939ebd4d00103cba5d50d871e6", - "24443e112ad43d2603c164d273fe1deb27381d23c62019b2ad18515a8a3ae15f", - "a9e6cb91288105458f7a0fec9d66356f66d4f0fa5c41712eab3e3f825a61d775", - "69b8d045891f21c38f3f5286ebfa8012610db9acd165c7e921aa11fa29f1bd35", - "bd47b3b9761c1a8bd3feab152fd503a0953ca2798113900a8631cff544f011fb", - "574da4a1a9efb3206809a547736e02cbb71170796c662df6216d45a47ddd9e16", - "4fef328c1ad0129aab448e8c922962235cbd7f02b5c5f2e212eadcac42901f25", - "6b3aa9590e18241c2bfbbdf4558b0ba1c92f1d8b32c5acb9fafaf4e018c083d6", - "add24b6b89cf3376281c1375a20910fee38d650e0e5bd7343e7ea776143099cb", - "9c3f203b2b258f0b5bdeeb14f50a7222def3cfce85f9bf09105465b8fe2f7639", - "73bb7b00f2e7549c0c650f4fca9cf0e44ce089d56ac341ee250c6835d0f46921", - "b23ee6e8658eb3cd2eef0b4296cd41e44d75bb9de11842c6cf111606f53395a8", - "1323797ef85ae1237f36ea7f4122336484a8da8074e6c36130a01440d85cc29b", - "c13c5d9dc5196ba42c3195dc6e5cbf04b892fc597165ca1c41488635ba2e423b", - "9f1b28c07c72a901738cc4190e06e09c54ba5146711ca41bb771bf8c27514ce2", - "f4ee01d5fa870edf2ed357dfc3bdd86eb52d7f79b6312ed0e1530dc149a9dac2", - "3290aaaa8b6b4e5075e91f4ba352a9111e4a628c2b6163829882126568f3b3f1", - "68aa200f5c7749ba5c442e1b916c12aef007c5dd12f4175ca04a513d913ab322", - "532027576bf9eea7d588241cf62db13a9defcdeeae33493324682a53a052d9e0", - "a027d4b4a3bc1c5b78bad0228c303b802dd6aa3ce6c486fab81bc4c95fe4288a", - "3b5614ef1dfbda8aaad92f50f9470922f3ea340ed38004379b35b3ee180b30f3", - "9287677e0b9fe349508412953f96d90e562963219340d3be086b1ab6abf0dc4b", - "589d0d83651ec2b85965133f5d952ae2ec72e82fa4a0511cffd928c2b2199d64", - "35dbfdac03e9ca324637bc29a5d3bcddab55b84ae35ab08b6708d5641e2233bb", - "024cf868368c994ec8089e145ceaa101880e1eb2dca9f1e81735f6854b00f52d", - "fea8ec880068ae348663b22d3053fb5f866f0d7c1de2471dd77d8cf936ed5952", - "1083434a3dc1501eaba2b9b4bd1886e5dccf9e7c4726be914d604e9a93462012", - "c9739bdd3b2a490b57a50e028338b5b014a3aa823786abfc31bd4e1a1e770d9e", - "565242f5c4034b2129ab98c5d6f7548de4caff6531dfbfe36f6fe794e985b704", - "d257a95959b3e02b868e096b6e10e20e3a94bfbacd9f4e82301f36308018761b", - "901eda4eefa18466896ab57b1c83fa20a88611092201317ba5989e56188ede4e", - "14fc266c68611ed760994c739d28427cc38cfbc50263cda2dca7ca80c74758d3", - "49b647001def650a91c1f4f2e5d1b1dccc5eaebe4fc677f56014100a01c4fb2a", - "0e3d24d5b91213aa40c766f842005b217b33ed04293954fcdff14d0122309b5e", - "ea7d7bc008c8fec8fdbdcb8d35e3da302779836d5b527f6c7881102449349ba3", - "293a0ba08969ae6fb9df4f5ea12d760dfb9adc9f3b74d171862b8d0c11cd7404", - "96f00f70e866ef6c3c2564a6305adb8995b5f88cf778cb77dc6d21c79654e381", - "aa30139317beafd82312a82ebec1927ecbf92b5dbdc275d51ae358b8e69474ec", - "ea4eacf95ba80c70c319b068eca9cb6217b7b3194d45bc76f94d90d2a38581c6", - "909b79122f5a9f4ff287047af019d6fa9d039ff77060ce0e058a9f03e8bee590", - "4de217055d10a150806b45c7436dad90c5622f4a368a397fb3fad77ee5cb5df5", - "b7c150f0f6b0030353487b1e8f7c01613256fed9092287d2315c7e7e7f63e01f", - "d9e0ba20a2590a058e2f6e44cb7541339061a4e2f6605541cbe5c6ec17cdcab9", - "6ddbb14c3bc566feb3c199903d6913595980536a1dfe70bf8edf8d3eb6167c91", - "9e9450212da512d61f830f83adb7da83ffcb3637897ea40e08ff6627343dc147", - "4e7b1271af83e6194f09f2f8cf7637a1574d30e94f58090d2a19ef1f2bdec8f9", - "14706cb6d096000697b820046dde56a48dbf514414b94534b1ae263007ffb775", - "28c75fcf9f6580409f4d278adc63620902cc6c5085eb1e16e89ff5053102ddb6", - "bc64a8ecbc2d8a01b14d43de8a0b38f9490558dd355d6e90477285606ef7dc12", - "4dd975f47a850eacad90f58d868d89b4e895da9b9c7ab7717f8a18de7d559e75", - "5ea191ebea3d9a66a6a588bfecda8ca4f3c4cc7599dcb177eb2eadde34249281", - "8ccf807ec365fcea4abd514f3a4290c123fc9b83355542bd1c8a2cabd6804ea4", - "30ce64e570947f0a274da59a333ecc1134fd515ca09a35c3146ae02fbc4faab1", - "ceff0ac31f8612244c7efb88e229172b6326ee9eca4d0cc6d45355684fab949f", - "415f1b1f0c2a25e08f21318c8f2670f7ba5908e892eb72265c0ac10167057226", - "cba21526b498d6217c1d4a64b170dab1a1b347c8770a96c7d4c8796515cfe25f", - "2240037befb35584eebaf1523eb2db84f8f50e2327c395ccb10a0a41ebc29ab4", - "7128bf752ff732e734c547aeac71c58b007608b23d56931dbba2ae17ba1576df", - "bcfa4720c54bf08375de48cfb5fca430c80955cac23ff70a8a094a02d18cc789", - "11f226239d89a2020f3f0bd51644b22ddf7f6022e6053506659d52569bca6883", - "dd70851fa3aa62e5efad70213b40e408422ad19cc63cc547b6912d3a6e510ffe", - "9d5c42cb9775b00ea6f6e44eecf10b3de0a17540d80567d218d24f32c39b28be", - "669e1d50b98522104462f450bb9e29c564f7369edb47edc771f046b7ef262cfd", - "0623809f5d64066947526ebc64816003be0f6f5736a5cfefcfa5f0590edd98b8", - "20618811a3111e6f6cb2ff98126011b61121bffa08f4d5f0841a3467c6b2d87f", - "c56f5062548e3f3ee5fa88f1e8b36bac085f0776c10d4954adca9cc2910d5ff4", - "a66e6e7beb3d378f1618a48db8b53e5f363e8ab6381194669113cbebbab92f88", - "ffb171097cff470ea2ad8f8a7c4bfe49e5c07f01c45fa74b2cb26bd43597be26", - "3cf816897c97320e1180eb8181baf52457a09ca0e3962e46da02b777c8541e99", - "5fa03a69a884c050b6af0fc8f3a5f7eae5e0ef867e77edd26815e07ed03f219f", - "d67f576dfa21467484ddec251d4d32b6caf5a76322a893416747b531c47c6955", - "f3b3a08e2a63ccc6df6773bdf16e2c9d3ac3db09d76f5be2283c4a31e7d0db68", - "5577a7751881048f86f5439740d402ee49b96f2f6446f62e0df4a1b9fecd29c7", - "34e4243f995ad54041a6bfd9785ee8052e74582dac218200aab33e4c80c277a0", - "18c968b64f527f7cdf35b137392ab45d08df3c933b56f1f8dc7c991a58fc59e0", - "ef82864b8af0592895174bc2264bcf7a2dbebd4088d375a24616549bb151fba1", - "f3b09b6a62ac1c305f4d3843d89f99b57013b0eb4aa1e4fe688cc771f3d6d57d", - "4aa5824c9294c6a7e208624de1698ad7fb6e8cfb0d4794d653dbb4aefc70ace0", - "3c4bb09be5baefbcb665081c05336627ca8b9502e1e5e76551d716b2da895948", - "fa2357f671b44d1dec8a22af42600d0f5f6fc58a2d73733349a5b9b576cc8b71", - "0e18b2ec0ea9e94c1bc00901b34f5f0e6ba38c939cba595523b6875fbebace2e", - "cd3f97e8ba8c07b9fc338c4b5a73f20916cb15a04c181dfb6fa733421d4a4cea", - "fa9b61c3730b59a1121882ca589ef9b10b58664d5912e1c288386bd106c4131f", - "aab14b4116fde58793cd54bcf87da683eceb5b49fb536028489ffa2f26818140", - "f45000c9a40cf8680f443c08860f14ba8cd94ddc36ec002ba9759cdf33e544e0", - "2b70f5e4504367bd282de81ade0e4d32cc5c60080b4f29cef61ff151b4196f4e", - "239eaa721452518fba3ab373eb2e12cbc79a6332411fb1906f8e4738ffa8071b", - "cd13c515f4290cd5e0b8415aa237f472bfd3b63ed87b500f3012b195f5b329ea", - "88b46da5cbdb8960078744f046666af6e86089af77f8450b09caf1ff7234d6ae", - "6f3324bf67722a4151e4a63701135d8c5bd06867f3d07f08604596a85adef92a", - "972d1919a13290e44d9aa64d01a1113da975ce666417f0d42dbb05b798cc9d64", - "c3fe7de7ceb92d345b44a89b00029566d153801be1bb25ada65e86d9df007864", - "46c35d0cbb9d8d6f94e4eb59c2199795c16e2592c958e6a5baee822f2b0c7836", - "d79377937e1043a65999de51492b9a400a237918df4e472b2f07748fd48d5b12", - "0e34cdbedf6c316bb497188881cade55b2846442cb3244302b0030a3986dd6d3", - "2b5c60f956768572e1d3924fad4b08bbce26e588060070c49ab1b47220c2c816", - "7faeff0539157641a1564433adc6a0baad14ced28129a99dd16e83c0713803ab", - "b677feb01ca786bf39391326f28e57ee76b76f7295bac6b91608be672dc52b4c", - "cd6048639a541cfae309c69983f659c6777bd8910f2b9e51ddba2a97a069d26c", - "9911bed5b90566046d36e7647814c48a6a9ab3563ef91ca309dc529ddfe66157", - "80ffe617cc04735ff263e34c62b0ffa7a0a2a2b24acd8f90997483821b82969f", - "dc54d16914100361e5ef8179c5478cc6d29bcc721e4d060aede1e8f76cab4231", - "5bd1a3e5b8d2ffeaf518b52808185f9dda4509bc043bd36fa09fe2d61a80622a", - "adeb742becb352efc8e8a8cb0831b106431785c4f71cf7b12d860c15e6537602", - "438f5a552682613f3eaff81c03e846a3ec495cff40a7e4fb02e27f23224b5ce5", - "8f9bbcb1b3f2ce232e19b493ad5f368930ad8d11667cf80c4a6ef38f87e1d003", - "eb1aee48a2a45319c9f85bd7b5c40f82033d4fbc7e33156b4090d389eba7ddb2", - "a16e4365dd299540c2a57a27ab21ac843a974f539352ee0d67a2f6a32d08bd21", - "1ced4de752dafd3580204782edab27122c04e05592cca3286bae96282c93b142", - "183b5509733b1a45c561d615235a92b6e493d70b04d03185a1922edeb4a9d4a9", - "cd1f8b39c68abf62675c1bf8c94d35586a411e54087b5b48dc1e42534e3cb16f", - "df768431d97b5bc9d1b48ab2bb86cf5f92a989a76b6c5e652b1021c34df8f53d", - "6addec1bf5bbb3a85f6ba4a7ec0a09d68dbed5bf48b88b9ba4863765406f169b", - "cd63dfe6e0a6f2d9420d728463aba321089d7997a88b3be61b8ef275c883e2bd", - "23b097f795de76aebaf0d52d89ddea5171640a0918e12b028b0d0ee0688868a5", - "3a0c6e6618a60ebe5979a7bef6abbdac866f7d8f1af93dfc5fa63b782400535d", - "cdea1596fd7052961e6459429fd8c052caa8a4b9375ebf9b2f020da2ec8e0718", - "4cbd0e47da1c600c5f81a7283d3cb6efc80f9f0fb103e3a14808cf3c5e07eac2", - "1e8b66cb558168039eb910252c76175777864370a9fa1dce2b8a239827ad39b9", - "2b9381cffd9ab3e94ef58720bb93fa363f5a907b4dbaa461746c667f3d3ed5a3", - "8ff1cd069d77fb0b1ef6b6d3c513b005bac300b3393193c702d0d8ae0d440b94", - "2ace18816660ce8631addb28bbcb0f43a80c9762e30e50f0cbe8136090f0520c", - "304f36546fa43c60a400c43f22d7a285e577593709c5bf1460337aa57f1257c0", - "1ba7fe1973b8aa79c3d22cd24d6550ff66ff3a3c66b2e2598866e24dcc449000", - "8d2b277d65a4f3521fa88c3424bb2f55937355eb6c0433ef1ea810687512be19", - "b2262d9ce6fb98491d1db00679ba7d5ec801163f2c661e8502250820c187ef1c", - "888f29adaad5f0cbd35498c54170223ec0a66adc627d215862aae92f01ed95f2", - "750ffe9f64290372cc9c09ee7af022637a4c45ebf2c88f2efb113b448d70ff35", - "d5985a7273302561a8be89e43ed41804cc79d42d30de45342d69b1662858655b", - "c5456e0fd44ff382d3bd8071f5637c0cba7c07e63379271394a3d3ac06836796", - "6444333673be734df867990ae05e615841978ea3378f6d8914e90cff6fe2523c", - "02080f7c4648b24b4d866b8175c0ec33ea83d30d483c03aafafbc46ac42ef1d5", - "bdb066899c6689643142fcabb6d8ff3feed1a1f45f2d9ade67ad8c48929517e3", - "2e3b2e93d863aeaed32c03eb09409a5f3d96a86e16f5c6baeb4605470a1d29ed", - "3465cf8d7f97dfaee7d4cab911a131d1fe47de75d65abb993a7edd8669fb6142", - "009e827c66f804c049b50afafdbc2ca0549fb6b974efbe387713fa40d16df935", - "0fedab646c1478738f5c7d78df7d550bac8548b5d6203cab172efc2a69644c2c", - "e002bdfe1b055e626395297202c19d7526f46553dad09a9c69b077752db4d4e8", - "b379e3db34de40dd2fe7583a4fc4305384d2ece2cd5f253ece69184c994000b4", - "5592fdce7731945dc2ac97ff407b286465de384a93f9ba5db98b5024e6f9f98e", - "eb242257ea5df4a45288fea73b80fd45dcfc25f1390a484f1763873307a32280", - "47d910d1a1141dcfd32bc8c4dc97e64fb7a054d34940d0115ce96c28c8dbd88e", - "32940b91e7d441e91c84ecf2ab6fda71fbb3bfafb0c68b7511fcedeab5f86c02", - "e8a5f02c65c7d374d6ceb48a1a6945f8838149ec90c9074e68411f1735084c5e", - "614a1b053b4fe07e187fcb7cef23118544bf4a5611380be74c68707f35506856", - "35e32fa0bdf2687073814ccf71260767e2288bda935a20c8fada43863c70fdc6", - "58d98433f0e17e1b3ae4365233809ce4bbfbb4afa0a08ca15b7ff541a847defd", - "047be3fd91cd153a345efa056c82c12868e3d0a8cce5bb4dd04908518c741aca", - "ffd0b97708a95a5abae3afeb3a029287f409589bd8a928f5e1a873b4779a2f42", - "f25e2a0c9e5ea238bbb2c7399daa779b035e4c3f14526c4f72611ae306bfe752", - "ed2c0a5414559ef0a6717107356ebbd43c4c947b46b3d248c1e8f371ac0c5eb4", - "b6dd22788d8d091752412b0b8e2d3a735b00a255528e958d1edc359d020fc163", - "5977690ddcd2f88ffc3b4dead5775c7ac92c2560fabdee0914e1607a4968b3dc", - "715691088d42df810a1e0699d462be0d8a2b86a7b372c2b6171d9ef1f35e8567", - "434ed8e9aa92253fbcb9a0ed6385a0dbf971aa24af835df861732dedfaf4bc95", - "6f3851c86d781d41efc21e5f091e0ce7fac7c9481b06174a2f38cdf4636fd6b6", - "ee645a1d30fbe8f25b8ef1846accc001deb83b6a1d360139f05d3851ae515577", - "15029232c05dc4921fde6c31c8f94777742d662e63b9de698dc6a9a1d926e1e9", - "4edcfc5a9a6603bdbd22158ef2ebcd90cd8b34359ff74c75134c03bff7babd65", - "bddf0ce1f46558775648d9e05bb67ac514adb940373e3e186c988d848a46805e", - "6f0e935a6c38b3374bc993a343dea718b619f7cadc5fdfa6302d1173f4a75a46", - "03039d74391985d183f883b6bf6efd8739579a067e6651c9c3f1b7dfddbea9a1", - "d623ee9fa79bcd7280bb1d4c94d70a46d16d037bbe738e7e3252674017136303", - "1ba5729725630066e8d984988bccc768a1bf2b6230ce52868446f2f7db2ba19e", - "fe9ed71d914fa0619311611407d061c80b7ceaddb8e551d88d19603863b70f77", - "a3756d3cad32ea0c55fd96867e35d67056b159fed461092c90fe7118f3076802", - "5c7667b7b30cbdf1a275b3eb5b6572b3d08fe461e14d94d88db8fd33eefcda2f", - "fe823240d23e988a08a279b34a4741b8014e8f5a8221fe069569887489bfd485", - "27272dfef8af5570ae2e3d8d6dc6d8d55486930affa3c6dd65904d0febf8f580", - "66be625b88d7cf788bb894fbca26a911cc76b0df116b8248bd3d01b5ef2bc4d6", - "2a57658f4ab104e26ece4acba922481c1b836a4e19c258a6330c8597ebe4fbf1", - "8f5f8c38f10e3d4984e4f291350694fbb76cd59d0968505c965a2bcdb1a4838e", - "c54f8d99f9a03c21ba9a8e30ad463e54d609d741a1b9b8aaa2ca0af3d4c1c849", - "d9894da3b887c2adb33158e2872484fece4497694574f802ba5d07144a1a9c5e", - "df9f3ec96036c799fabfd3fccb6181dde8b319e0f499be5fd099fbb09ea30b94", - "3a58c52971bf76d66221b0c6b2f4f64867d8194f114dcce20efac5b50ec4eaa1", - "ede59fd06261c6c754339d61e456dd36ad58d5a2f998cff1d75a7c29b6c2d304", - "389acdfd73ea864017110d80b74bd7e5a1d4ddb181f53dcf5e5703c38d22345d", - "670d146f9be3708ded34e102c712be89f9986a43ca835552c5db222a0c5a50b4", - "505b6e44e86e4a317f91df515e341d26954b0c1386e4a77bfeb2d3c5daf9a4ed", - "ef36557199454a1b2e5ea89b7c07be1dbb3aa4d76feb0278b9a840d593f0d450", - "8dd7427b163b88f5adac054d6937749fbb379dd65d21731b612d4bad45153358", - "7bd7aefb566abc8251abffa6ada1d959a60d74a23e9e3a572a71a5e9bcb24434", - "fe7f618f32742ae08fade744b947b2f2d9640d50cbf85c5879397a4fd45343d0", - "6810a1df476a591f3c3c695e8fae44e7f9e95d392dcbe161cbd4f5c8637174f9", - "a659ef8aec9c4aa2f746088d718ea36e2448d86a6e2fed26417f7999bcd3222c", - "73de244dbff25eabada7f1149969b8b70a395f04213803f65e58b4397e88b709", - "6b9856014646a3971b052496a5054cc1eae6a658b4073605f2b1e6ae19631e79", - "b44d67b89b42661b58d326c9eef809d852cdc4eb46de1def329331a8062a71bf", - "23a3bb99d155888a960f1bccc4f4244933866ffa33820c8c8f05a65a1f20831f", - "42e29ea3a7dcf6164ac6f58c11c53c19d2f53a7a86f276ff503b245fc7943896", - "fb743a758d3da6ae93ab3e30a70ca0d6ddad1b3466f46113dfa33e0097df6bf1", - "8b49c3df35ea468a29059369733545941c00dd3c8e4e6b6d4a4b9e1eaf5ba8d7", - "29616ada5af4bcd62bc39bf7be06c980ca95224b950cdafb7e8805e3dfaebdb5", - "646c8def2096db49f5d90d5191372b6f5aee7e6d1ef12ff839bb00d79da943e2", - "31b41f1265845b287d3e5ed8f71ff99a779df48dca48542e0421e7a2066364e1", - "7f7743f9f78f59226e8e6af9cb48ccdce76e1c60ef113ac2faa4af2ae6f95c90", - "73696499de995e40f12800afe1433403c2ba437b512e5175b07596fe663b90eb", - "dd4a217b8487ae7e49bea2b5980e64f7eeb20321ba88152f933369a8c77be47b", - "34055efac58a1f3ebc5a08dbfb1b5498e41f4e006acc9e27f33b26bdfd150a22", - "77c17900cc2e45af35c660d98b7fc0b724a38b021cf29bbe6772c968a9a39446", - "334d1f03cbfa4e61ab14d9b5c1c14e690220984c56e4af72d28a422bed655df0", - "aac3d3977b3142abf5e4e332a04705f37182ff29889bc0f0835c0cc9c060d586", - "da86c5e57a18bdffe4c2be0192b1c6309b03155233bfe7d64bb67d1ce570ea6d", - "e10452c9b952b18de0e6a0961eedf216074aca945717fe12bd5f0f4c75dd5d31", - "8ed460c300c4bc43e5fe5f2c31a0d38899a2d7cb295bfb9cf79fdcaa6379e0b9", - "fc7d5cfcdcba7efea0325a8e917f19171474b654c087b9b590106985b4c694ef", - "6a798ff8539a4627df8eea05ae7f5c711ef94a0ca4c4d225ee13af4fd0df085e", - "61bbb982b46e9cf63ca0060f66d687a85f95925282c8902f265aad2d1be019ac", - "618cc7e851c951b2c3b9a57aae3d9b5ee7ebff070b99dbefc89d9f0bbd82ddfb", - "d1441ad7ceeb0bea34e7c0df432d425743c2af46014e979ab87f8e36ff6d5a28", - "1328bc84813afa4015d9598e05d98284dce34bc5e182a691688cd9ee4ad91554", - "d99b6c1d2a64969af8679baf1d2f759fffac7f93bef702c2add1557e7fee5acc", - "17ddf73b2ad93bd0212ce72bca771faa2cf32fd53f200aa7715c73944882bd46", - "db35f5a414343d1e495ff205d00d725dca65999f18d2240e12b7fbae83fd701c", - "22d74f8ee128b2d6abfda7434f5da400015f28edfe6cfba55d3563e58d5f6ad5", - "a601ac325c727d2cc7a628ec7724d64317c5b131fe02c47fcbc0cd07a452d4cc", - "d602e274aff7eb6fa01365a362ed7f9186c8846610d1cff70c202cd7cfa87bed", - "a5aeea3d35bf16e5274f61af95bc9be8c8f02e8846f49a324de5216d61bc2397", - "d967a210b883a0a62c279262f5b515dc1c81b1fb051c645ab6a25675b973ea8c", - "1decd598bc2234f023ab396a84acf21f5b91fb91fa8780e063cce75cdb1ead11", - "b736048d55c910eb9d33bf808b9caa5e895d84f161543498298628241919a30b", - "460ca126009863a406bc41b7593310a16c87d61ad27262513bca9747035f9016", - "abbd8bc41fe82dafa1afa940d5a81351e3b2dcba0760d441b42ff9958b13c4d3", - "8aa99fd045badaca52cd55787dd59e94af25b4b2d9ac1169114bc9d3d1adbd94", - "e16669bc9b1648ce3906c80bd24b7f32a9aae6768e43d5b59c335830e73bf281", - "cab42a85034e23858ae877d2e2364c546f53d6b3fd4a4300143fbed9b14af898", - "3ae7e0e4cb252950b3c4b65feaffcdaa4de4f6de19f19e07051422a93352a67f", - "d835fd6086f3036619e977665e431a1ca653343e88696371f6b1cb3d10b4fce9", - "f11e2b9fafb87a6bc4373c0d3a1952164c14b3909ba2e2e66573483faa615aaa", - "667b3d3e95e4b773e01e814ed81b5e43e8e5b090a6554e5ff70b63ca4662a734", - "166c618873f0e6de1f336c634b347502159555ae8c9f723c8c9725661458a075", - "a5b15ed2b750fbacb4d50d3771f09451ad0d2c233ef446f38cbf736149b179c8", - "c963eb4cbab7f9445d18bd946185b17a6a15a40d578d6150c9fd503f1b18d522", - "86839b7a653a58e25cd32a5a6ca35ed0a1155423394247173f0722f0a69e3bd5", - "58e19513e97dce18f09d262c674463224dee6bb606527db19a41487f8983dfd2", - "5cca45ad3439e410b1ddedcac1dc29e56d923efb0748a8fed4f3ae4417d2aecc", - "6bffd7f752e34f2dc3a283d106d33c813ce2f7eb7a19b84ec27933d1443405c2", - "af50d61a0d4b55a73edc64a16b0053fcc0c8f1ad2ed4a978fc2fcabf66760691", - "0ae2641d15965ba6a5f7ed0e0e7bb11e61b4fb65a1d4652a0110ca4eccfddbb5", - "f0f558ea7e5000cfcea7284238503fdeac6db2de57f4ce27263d4b76a50cb14b", - "ee66ee662eecc8797db9be09155e15f508a4e702aadea3b9bbd0dfdc10d34a73", - "fd84387225a1895be68a50e99fa8a1b3780cea8942cb566b306304755818bc5d", - "92e3fd70af4108f22b6edcea4faafa625e1c4d1c551ffb62d147d29db6c43460", - "b54e02ba2ef9faaeb5e33711a70d30e9282ac0c9197dfaa61051eec042e63158", - "6d6eeac65484088c04a7eea2943aeb16ecfeca66309e861dc5bfb308feefaac8", - "23f1068ea98ea9298eb2fc85436a57ca4743cea149fe096a8b7b9ec0a1374921", - "e052bfb3cb6dae151c397c27ff3d6b9f8ca12925d46c863d8a04f1e700728847", - "217b4567fb26c5799105a1d3e825956ce3d2de9dbd66a0cc2409cda3b2ae8434", - "577db171e376094baf33b1cda5f023df0bd315cabfaadf932e8e1c7ae374c961", - "4ce532f60f139a9ee275731a9af6d6b7d5b29af0c84ea05e70dfe232eb42506b", - "afeac894e54a58889e19b996a1307913250b8d5e20f3ced80610cb4cd48022b2", - "45db9a4623248b1230ed2de01029bb1c1923f330b21b45de8686b9332fdca0d2", - "60a05878cb9a312ee413342784ceb9a1de9bc360f54ec39c1d81a100c91eacc4", - "21b525f70550ce0672dbb9a0fd939fc6ceab35190917511495a8badce4211000", - "83a317d146ad57184052d9798ff6665eed1c8c79642542dc4dc2a66e43e13303", - "7696782b7d78faf9fb8766f2000d5cd4a04009219327613263f9f4fa9720b46f", - "7996e0782974848bd5147f9fc33689db85178a15c71edc6a4bdcba90da186d58", - "7bf1acbe5101816f8879ef32294962a82e780c07041c18457bf93cb34e04513b", - "a14f6fcf0bf34eda1782de7eb55826e65d913d29df53a6084bda85f0574528b4", - "69ae9b1c75a3571b6bdb74d45bb786bc521ff2bb5b29caba9c6ea9bfe0baddc6", - "c4f1a30d09eaa7dafd240c9ca1e54915af042bb8cc854adb7733d237c268eceb", - "c37ba86dd9e41e014a88d88136f64d6e05f0d5c29806722b25197c1352b82c9f", - "84e04c7d410ff253f41aa5402f2bee0f038640f3229c5062e90f9e63d40f00db", - "80f731619ff59e3a55f1fa8ec59954bd71587675398e7391d91cdbf204fc0c07", - "db460561d7516c59be6ae2bdd00e2bae7a385e5d44d3a278c8d9b8be3f534663", - "b04953c20ebe0b3e95358e1f56830dd1926d27ac30765a55895bafeff12200a1", - "9d9d1f61f6d2e0fbb5b418e0de12df52c5f058169c33c98e7c536965cb5665c2", - "45445ab374a40ec82e84331dfc097eb6495b3d3468dfc621c63ec8ddb11faac1", - "2cbc24491b946a0d93c4ba89badce6a803b9cc691c423098e329390fa4748873", - "324fdcababaf563446613aa4acc316a0745e233e2d96bd90d8713f7ed4534de4", - "681b3456f36903fb6fe55ef5869a8e0b88a1ebc8247ab4e4a10402edc7dacf1c", - "d66c384e2c0fcaeb0a4f1792ece2e79f25671a8ae406c04ac845dbb0b0e93ee5", - "9afe3ff2cbe40357a6cd62574d7e4f6447e55a5aacd49e37c61576278e3a86ff", - "aea4944107c32504ff61f45bf14111438ef85b8393603156d19a5e03991c5fc3", - "22f6128ee21677260ebad6ef06e184ba3d9d16ed45d4d71e68eba0da63e3e0e5", - "c93163fe45d4fdecf99226f18afa3221a15b04411f3a80ea58f50b18aae0516c", - "ea4aa8e3b66ec377b6f446c61ebc0b9d218f8955c7f94bf7e2ce88bdd6d8a00f", - "4e9f04284b9d68f5bf32ccf6602822b1069d06c171730278a0a1a3e0962aa42c", - "c7645f60aeb25f2ffb19df67087ffe8c2846aa2128583a3004f4cab4625e701e", - "ea02ac0bc192ea70af916d3a719a4660a86c81db5183f6099b3ec5eec5c2da16", - "79dc97740e38a52958622d6a65520404dcbc8492cf038d365ef4f1aecd712a35", - "3a6dff857126dd83b4b8df45a276f1188358d0cb70bff3f1fb7bc48f874d50bc", - "77d83736e189a5f440398720498c8a4f45842101859becf0c410551d679ecda1", - "b8d14341704ca81f8e3c4415f5a71d9c3842c55f0cbf2e521b149c6b0b196313", - "b2cccfa9107df8a0196d6d2becc22162fee735c0d2fd303a93b8ae3a622731fd", - "08720d3d77be5c304905c5ab9b0dd694283cff029caf4798987b6ac8292de6c3", - "a68225fab10353520bcc4b112ceaec063ca427f207a88d6f6344a4dc152697f5", - "58ec79db94d1158742e7ab708d47b3cda25b43d12c7d2cb2c60022a28431828f", - "fb117e13b80b4b8b082a9f909427fdd2a3b72c94371676abda8b66fca7e98008", - "a0577174be68294722b31e732994698d91bda37ca1906491e51f7e1dd3a4a3e4", - "0e59e51bbfef678058a5810560501ed97308fc91d4109a28c6f3993396377f76", - "7c860f7d12fe841a077b96145dd34eb9385f4697f1be26de78fb423a961f99ce", - "37f555ac7b69b1e99e97b4cb5ec75fe2f92c136a1e954e5fbba929ecd4eea7fe", - "9466388fff2a85dea3b2fd3431883d3855874fcec28db64c19fdece6a4d5eb3c", - "96c8508de49bbab0a35fa52592aad3d076929545d47b1c78602e0c2f56314ca4", - "b4541324b0aa34a03ce73b3db5312eaf71b0b2a1176073387588e5e80a4954e2", - "7204873e4891dd1e2818c39fd67139cac4172e2b527837137bf28b7cff64b6c8", - "6e36812ed5470eb0e4ec02e44c4a2445ebbd7ccd9cd6a90743e5a80d134bf360", - "8968ddc63e0f5c941b81f18064e0a2a793da6cb955a70f439d0e56b58e3f5a7a", - "030b0addfe772b2c62cda4cfa16547131666afefbe0323cceb59dd3c4301d7cc", - "1d256492a5107c7ea353f48377a5e14e3c457a33f605e7a8a1c1d89ddfdbcb38", - "2d248f47dc205db17bc1ed695cceaf456058eb00ed8728d4f3aac32425f35d58", - "e649d4c27e2e0778d7ae09426ab9df60ea0f49f78625eb3ec5d636c901ea84a1", - "24d7f03c54f666213932f883fc6cac8359c249c229318bbb2ddea6842cc023c5", - "dc7363565e6f96e894448042fcda09fcc3feb5bd4ad3b278914b1dc1ce1554ee", - "d07c42e35bfa076c23a0cdbd4dd6fb5f1198d4dc04556a1d9e8e7138f8e2c2c5", - "2600238000d251ba4ceb86dd689473bbb094d32c888016ddd1c7f4e08d3d3861", - "8710238438c08642c6b316e53e2a14f257a427ed8ff1bf4c7990c94115414853", - "1cc4f62bf9f1eaee9bb3cd83e5b24f3602a4a729f56c0b5a274cea098049e95a", - "9e1356abb009279c92ed1b5617083c6a52c1e8573c9f4972be4a6ad0a757dec5", - "cc2b49650dbef698a1490310e41429d04f2229a45b995f46ff85c36f7dac82d7", - "1771a5a6658f6bcff42e8d9f02df3a25ee45d8e0a9919f973a9865ba4c37135e", - "626e1606161d92f5eb76d20d3fb3687f56b2159adb76449c9778db3449222c41", - "aa96a7b36afff71425ba424001a4fa327dcce45808024d4ec40a43579e1aa67c", - "197d2174663114c356594792dab418d0ae854fcf3a4e271135f8e0b0c2a3c23d", - "9a4ebb5cbdd8dd9b8439093cef98a6e0f94c8ee3244eff90dbaa032e84004197", - "7e0ac3ffda2ac629881bdfb12d544ec57aa8ca4fa2eaa90c4e90d3c07222f54c", - "807a08f75e007880fb5b20145b477c398adf5fe66c75c683a95e582ff710eebc", - "0fdf7bd7ca913f7bf8aad285972e51e80e5ebdc04d516d322bcc7de20041431f", - "eef71bc92ed8adaea815a95a62a7b9f86c50ee27ce9c299a08b357420bbbc969", - "9372a0db9a05c5407d63a9fc278d7f7bd8bca3291cf3ba56774c22e25f7905e7", - "7bf822309d2d5737c513d4c200f8aa7df2cfddc475021955e6ed180ff8ebe673", - "99748afffa570771f9f5994444de5ec57ee78df0d0930905c3dd966fff9d93e3", - "1cdf2434fbabf2761465ad6b7f73f7d9475992a2ee802770f2dc20e5c97687d6", - "3b37cfeef3193efbd051e77be8ac54b92f751a132c97b1043d2d3613f18720dd", - "5dec56e28ad7374c5e9e33c5761dc0f9880a4fce55ed05e555e23f0fc601c6f9", - "083245a924c58fc2be13e783b0c0bbf7b97646e414040a4cec46a4f7f14ebcc3", - "373013f82d4d02b439a308a56a8512d3a5bf67a01e0494d62feee136e3d020e3", - "5de2836a904e3a7f688f20b2a46fdb5819fa016d26af3c5f0ff06159ed08ce9c", - "9bf9e8d68e0e9a095ecc5fd4042a4be4c61d49e27e14fbb2988b262cc1ddf7d5", - "e1fe2bfe6883b64d6e40736ad05f7b8aa5391770a2a8d1018befb88258ef4cd2", - "303b4d5474878b3a8c75534393fa908439f030d292615383ffcc9e2a032d3ddd", - "721f037f7d90f302e99ce6b2d1af88470f091d5b4cbddf2864a07ea2098cb309", - "d3e0aaed93241c8c3a0c8c6e3752f798ef794dd7de0c309c526bf4cce2cdfb1a", - "7427e6286641d63b875e5a14230df07268a54e48db7a1e07585fcd4450cacb77", - "3c30183e831ea0542c836ff12531fcee662ab535b7efa49db9690f78090c0172", - "49c86d199711735c27a287e63a0c3eac635b80fe0f18ae0cdab40c451fcf3b64", - "0175812fca74c15fe13829bcbbd05ed6a65ec73746ce99473aab851331443f15", - "b4bc5743919e01e965c4877553bbe2bf5f4d4150f721d02653d23cd6b869f01a", - "1cbb08dfe1cd9021b0b3f748e6295cecb063a019352dfb653b7e911efada859c", - "bcbe3fad61b3186f19aa51886dfdb67fe52476b735e90334b9e07dc2310bd942", - "b07a0893295d0dadbedc5613f6dfc54686432ff11066d9d506c3f5b9bf9af643", - "90300038913552d7fae4fb3e8fc862c1846feb0bff3dcf3f3f127ac8e39b23ce", - "26b242a4aa80db1ee58df76535f395e027fd2f5c999a832a8af3aac6d1b41be6", - "06cdfc0265777dd311a92c45faa7d77a8040a6f58e82fb358900c74686249213", - "dda2d1f94c436b87f45197ca6e7427cf1e7e316135a10efb4a9c2d4ac4a3e762", - "7067dbcdd277ec0ab31cc54e3983ff9fffd5dc276d1778671e6127bdb17a9f36", - "84221f4a37a762b881b84b039c76ef9eafa0dd6118bbe7e2f4dedaa00d921b3a", - "ffd87b6e3f16c377ebcb7dce57ef4c90a9e97d7a4447df3ce2876769522d3717", - "9fabd0dd8d1c3da37df7d71e53ef71c34e73d098753dfea267622c1cc6d886a5", - "63355468f3ddbcc845b36ca75e57fe990e0f4aaea916e6528611e898980d458f", - "825b472a75427b2ba2a9f154c3da538314f41e0d4a820c090304f8b8a6e1f5d9", - "8c1f338bf7b75b09cc2638e58f54cb65b7edcb755bb4f31e851045799c647f90", - "5ee959f285df64fbebab2cea0bb92ba29c4c4713baf664c9f6d86059362b59cf", - "e7276cd0091e571ba72660e98397fbf81ee8749489b8e0f163574fcb1f00749b", - "2f23e2043706c807be13dfa3f3115b6e738defe2b6969c5caf29eabad028d347", - "1985c0bde63af57382fed546dc9f00584550acdc74770be229a73557213ba801", - "c89598aad081d55f79b0d11a254b2366ecf5c4cdafe3885576dfd010a2e76342", - "1315fba3d8dcbe8530ce78d3959c66383d391c16480c4a440cfe50e99c299b69", - "9247378c732f5fb67d5aeb96a41e589469e7ea359d97d40e876be6be3d1252f3", - "1e7f335ed35f72ae86c4208ffb927b195846231afd871d3f25adcb590c4ed935", - "ab8138115f086829890302940aa7212c21e4bcaa7085ac4bac49b07582237225", - "24a2445f402513e62e473f879a8ff3eb9d870e653cdd318378f1d4e1bfe2ba90", - "f08edf8d3a141c555ac6c5d0302d534c4b04257f5c0977d27d924587d2936ee9", - "6a9b4b200667e70e515787a548e764c87a4fd846ab53d5e2b8b279198ee6a35e", - "03ad7aee51842dccceb3e6c65d30791d9c027ad58b62a79131fe8aca4fc563d3", - "2bebd4140a2bc0302c1474268bf163bfef67053af3c9618ccff92a61b574c1cc", - "1f7df3fc172a6586c298ac060929e631a3df8ac9f42f29b8a936a4560f108a19", - "87a9a26b223b0671153931bb5cf2dea8ec0d6e7593e117b1150a9319b7ee5e22", - "4dc59f1eddce493e242bd5f5593ea5f5d7647056530f4226ed2171f4b146aa7d", - "c72e97bbd487934de1880677047a2cbb0fe64b22ca64f7756623af2396443c5e", - "6ce679e0736b430943e447aeccbca0b3b4771e3f2cdb55149640f9f9852cb34e", - "c4dd6c8dea3edb322f7d511a0a024d4a37ed9df2ec7e1c4f698f838328d3a382", - "b9a8ee623cab80ec8129124d1fb1abce687eb5130ecb38d67efc6651d0252443", - "4a41becfcc85a9e0bde300c2c19c18b0640cd07a0ea8074708c54f47c185b945", - "486e3e1fce03a4e83b663b720abc8495edcbfc97a39ded12823a41942f35d2c0", - "a19f7b8a60dfde504c6cd80637321f92507da7c58a92e617c556efe6d048cbec", - "5ae1d08d589505ec4546974a668e9ecd8e8b231e148f89347b60bcf7528576c0", - "796dab0c75f32744112ba508cb0f8aa83ca0b69ad6d518a783145e7e00f2fff4", - "92585080b655e20b9581d77b5dc7859e3723628530518f6d6a6f80f981486eba", - "e860b22fd0ac1fe8ded18ee03d8fc3680c8c40497eb85ea0df707e3a9d861274", - "439567e02e92fd17f1c540c249bd0ce141fd095b8acf1893b6eedbafe322b5fa", - "3291fcb862b3a5cbedba94853d54df986f63b9884830b85382cd72f9162d0826", - "399715201c32fa9a9c91a7a031dc464bddd03dac580a1d070b6548963b4b43c9", - "a995936d2199aea36b7db8df085186445e865dc586ec5d963932b7e308572e67", - "ea34640043100301b05db9d5f5bb057087773ea7c42d8f3b81c31fb6cc6d1728", - "3d481143cf3c2ba5ee05f92593a80baa1f6bb7e3ba9dcd32abe7a23a32675896", - "083590a76a164fb91e9cac4e5bcd0a18103b14f8c8ef01460a9b19c19d225732", - "a6e55b7b65ea618e8a141ace3373a9147250ccf3e67e184b35be6582b597f553", - "3ce707c2c5428785ff44b1818c1d9df54556e3a0990415cdd1d6df3b8a2a487d", - "d985ecd58d4cd94df8c57985d3ff4b6ad91090c5769fbd2ebb1b32787481803d", - "a73d80935e987dc58ba0aa7e80b99047e7e221d20b7c1abe1164c8f5394a8cec", - "ee86a7faf7d01caffad1b8e1eddd49194efb11875c414b6f6db5c1d2043cbcf6", - "22b19a54f8e8af8f0c6ce51debee343dfa87c75bce34676d1f576aac293418b3", - "01d6720f0b20c8b5096d5dcadff16f0b2beb34bf6d57eb3a2ef321e6bfbde23f", - "0d39e342b0b2ac9e729497598a8163be721d2940bd5c6f94f3baae1821f726cc", - "46f4f5b7c2135a540fe179f9bf6cad70c4e22846a12d8c21f2592685356bbb82", - "25f1b69fa75d40827f0bb2227c8bd6c1b4f36af98b3214e3ebb2446dc15a7e17", - "a784ac53ee746de37a2848494f6ee72716f0feff21a6ed7941eb3cc5a28857f5", - "36448392b95456eb5278ddfeeda39724ec877bb1eab780e203ba42f115cc2060", - "6180991dea7885dcd0c3992e453cdc9c128a1cb386ae8afb24df6604791b6702", - "04fbab4f7bae3d5b707e945c660faf5a3384a7b147c43d641ebd5248b3857ea4", - "2399e197c8fe33ac0edf6e6461252c62eff722133a47ba86343edce84a085e99", - "d9679a4da8cd50371a59407e66ed12d1a755cecd59a5b51b9c84c8108102e47a", - "22b7115d4b89654df4fbc3bf25eb7cfc96b12b28ab2826292dc4bf241f658016", - "3db353593adecf81ddaefc21fa4f2a7eae221f5d369fdea56b3f96a440fe48ae", - "2ecead7aa99f728c38d7abd708438d6a55a6632528efd2d74ca34f3e4c7856ce", - "9d9d1587439ce1004073931ba58c8dde826935dae0d2631ebf22a9c44723b5c2", - "990d60fe505136d8644a55abd905c75a0ec34501be303a40e8deb3cc65071406", - "51d3b544ddf6881359df7e0dda1749612091fca5e1a41054fa24d428e4364e6d", - "bf5de970a1d9737804fa20901df3457f5473ab65d34f60442d1ae9a5042027e9", - "9931cbd5f58c358f4c85079ca028f4feaa95eac91a96d0b606e34b47f618c39b", - "c0d74f7c8f6605b09203878f9c2e684d7572cbfea92eab76fbb44ba2706a7e60", - "15bcf72f10c4dfefc06f4bd89b457ee3018229dd98d7d9ae46ceede3ec4fd4d5", - "9dedf1e464f124edd1a205a853095128b9141ed4d4820407d376426139e1f2db", - "2408197cdc8e9bb21ce566dcdea8001a7fc785982766dfc1cec444219d04947c", - "a6599e78058b97bc7ec6951b66e62a974509edf5ce8f1c5471d46f1b3c89fdc2", - "cb7b7d4a3c1563cfc338dd3e79c4fa53f180f379fe85a50f6ab2994c2d976b4b", - "4ef1c26898b364ca1a2cc8de203ac946da88785b19580f6975878c3783763e56", - "eccb991609efee4fcb07ba10fefd418351e82fbcaa9a338dd7982ce9bf313f09", - "d86eb5be1a4e8651c6c1055f85bfc7c06e5cbd98a62c781d2c542a7767aa03bc", - "acdf94c522cdbd062e724df06d8e5cbf82f391a6b84cf451cd92716c1d8854ce", - "6628b8202822d194ac7d151a5710a40781aeb5dc4b50f9daa32009481ae9d483", - "f3ea924b241030ee26b2e68c6a7e5dda487a0cea274c791ba21c439f194b382b", - "dfeff1ef0eff4c2547d269e626afeb430b662d26c48f568d7e19dad4a889dd93", - "80bd022025c6c31569212f718f231bde04c652d83504b5167de70a39b552b762", - "0ba3a4d5f206846e446dc0d317fd8b638dbedd8bf66174e01b8dd74ba73339fe", - "194219bb62672a1cd0d4edbf7c46d47119cb1c132128be50287b7734ae7a7327", - "aa17a84854930208a4b08b04241d54de0bff1e58fe68cfa881d7cf00e52c6f09", - "b0cdfaa42d8a6c3c1bf19c1f9e02f41b55b43f84a15c0a0dbea5bd39c0447f1f", - "4ff20a85076378adb204d869f8c4ea2b5d0b434a2c83dc22a70cde630dbac095", - "5b0ea48e9cb536ccd222bb62d4f73cd5b5b39117896cf49d01381f073c2c7095", - "b798e342e434078c3f2cc681839f1285d5747e4c18a68567a53b18c0eb4d1a7d", - "80156badfaa57241cd87d500e144c6dfeafdace0444e29c506090543f5205985", - "a34fb95067cbb222720935aacfe185f949dd3da641f28626dddb429b57dd58fc", - "ff05f0566fb1746f1e9407df70d9f24f7cc5ef5bdf07bfe8e338eaf6263bd9e4", - "1eb357d40b7c093f3e71b9b5c24d3c3014dfb0bcacff88615452f03e0f8845db", - "f8c2b6c0c2d91efb8d66612e2fa4e5f7cfbb04510c9fe309f9f9c641cbc995fc", - "ea068be2dc6dcdc1102804fbe35e8243bb4766cc99e5d5791cdb987dfd5eefd5", - "6434947085046894796c6a2b5ec88c93cabab8d9b92e7fbd522a493f598bf77c", - "259ba52ddca6a7fef9dde8831421607d802129280dc126a02765135d4d85179e", - "a086b6734ec0741f504aa6730c899e3ff286ffe1cbc2de854f59e776d8fd01da", - "2f09bc51fd28406503d1f74fe506e73c793bddeb69b14365326e1fedd81ef5ef", - "4d656a7ec2e4b05082d238559dc69772805e9fa3d2277296b11494f646d34fc9", - "ba7297fa6142590b346404f509ddb7a2a612dbe6034f6363afceed9d11457aaf", - "6dff802a3cebb14cf4c5a9e3554e9f4e8105a0ceece618b629df34b7e23e1706", - "675ae7f8e6b287a1aecf07439cf23984032ab25e219a5b368e988af0e7c157b0", - "8c69733fc0770e316c71d8bdacb8c783e20af8b9006a57dc38a2576066bdcb97", - "fd579541e9eb1f58795190cc57150672aac55ed9fef5401cc4eea19d237fe792", - "cbc4f7349e030b73f0fa857e747f392d5663bc503f3714c77417a133ed70a94e", - "5a0d22f351cd199f4a32bf95f20816dd90e10bd88f2603e0e602bce613605ab0", - "496fbfcb0f26c7bded31c76c5f87d73fb4b1f90d3222c990ad6529d981775f7c", - "f1b0fb3733496d71ac8d3261236d557fb77053661c3a7089a620a9d5a37e1187", - "695bf3a20a50f0420ea315c1e590d9c919a9dc22d2e49dbcb72f58f36da0eaa2", - "9222e36c1f444e69523e2b0e55a543be5ee29abad3b7f27fe4518afdd4c8a59a", - "e6795401cfb7f938e45550174f0fb332bc6a1c59e309cc389d20fd08ad9729de", - "749d8376ad43328a9f45b7ef5ba058a0da5952bbc0fa5aa10e9ac9873ae17d13", - "5e67e4495d745f4faf1bc37fc07e4aac83151e96a0d97be04ff761b819d833f5", - "df1dcebe3084155851fcf596966d4cf68c8ce4b78072e3e7eb62179e17699f11", - "c6ddc9cbb55c240200de4be8efa2519185daddbdd849289cdcc7c5a61bb447df", - "c8100c1c57f4f91b75ca610176c766ad5b9cabde6b0b5f432c5b01627ec907cc", - "a3c5b947d93e76058fb85b0dec1bca0194648465f1a9aa11d36b21da23e843a2", - "aecb84ee20fe02a5d5a40424053d9b2ae2570fb8b0b145fea5a50b6300b0d616", - "faeacdade6fbcbc31c9350ff2abb2b8728a4268d6ba086b737a3930d339b5977", - "808996cbbbd67d0e26d411f1b05caf203cb3270992c30092dff3ad6240d2a7f4", - "2f278240fb043d7e07a617f128b62c4152d94fd862ba4960a8797af500505429", - "8b5072a8668f22e4f079b31ff6bf02d3da6597ca7c54ad0c3bab9b5117ad7645", - "c66c998d2b38745e2f2f2164eb84e3b4b8256a6f01c1160977a9bbdbd9784334", - "504f7502c27d0a9cb5ccef7d7425788444528844d0a26823c0db611f4e02305b", - "77a442279864c7300a69be7bcc9f76a2d692680043ff287cd90d42580b50e668", - "932bb18651dafa3fb85bd2e6ddc97556177eec4b95c9a8f668c6352c48428c8b", - "91f67c39fbda98a3b0b6d36e3904b40c8d43d0f28ded6bfd0d33785ee45b41ed", - "244410e92a301b4d21c21160db08c71ea2a6cd3640b802d7b918a5223ca6438b", - "7687aca04c3b1e0dcdae08c0fe4aefab62cdae28c953f23e73f78d7ff60cfd31", - "0df444caffe300e544e4302f6408f35ffff3224d3486908424548fa3e4347e49", - "b0c12afa311df67e845d1f59f8368d18224d405e8b1cbd7312b18b93aeb6a6b7", - "cfd647707fe77de2661ae7bd7108a341d097a1c636ef7fed701e114f5f9f6f08", - "f7ec56197cecc3f6ff0bdf41370cfbbd0db0571430c205ae122388f064435b57", - "5faf0fc1cf7a9c813c68080aacdddfebccf94adfdc55c1ab199f0415407d7a8b", - "d30109823ede0f91ce73bfacebdffe63f0941ead99f3f0fc5a546b7c2690c78c", - "de65e2d3b7e6673efaeceac1a1926e3471fdd1dcfca7332c56f977f37bd6d68a", - "875c9f81686158092c3ed2afe0bec84eeeed45ecd51cb54625247504722351e0", - "abb42d56cf1e41f6a1e99875ad4a7b7e73c39fd4f08a41819daede978c0ca35a", - "621f52a442258ce3dba49f69ac73db14d8fe0dc11b56c3335a4c0405577fbf98", - "c91f23041d9f2e7d82016c3b5d6def1c53844c45b1bbdf0272e741f565b4961f", - "5e711647c1d276b4fce7fa3b0ae9049e6250d21adda139ab5906b88822a3d310", - "15ed091254bcfd31be981492cdbfb14cc315d42db47f560ab8334de0f0bc2af2", - "eafcd9fd1743785ec75948122197b75060fe39d190edbcf8f921716c82c58317", - "f3eb6517cf05838851e928602ccfe5f7986b1930911a361857d66faa06c148be", - "c506b22677b9bdc0aa3780d824bac82dcc163d0394a207d1a51a4433be63dae7", - "37be476d45acb82d0a546ca648cf7bfa2bcc3727e1e5c3f6959edd1df9fc39a1", - "2fd7db9d5507b20fb94524482dfb7cf67c13fd0d9113d8dc4d7f165608a339e7", - "268fb35e670b6339888fa2c20f26e78b4157ad466f1839f2c9c372cf2515c4bc", - "f84b839581306d11d1ad0c579594b3a1e203266a7c187723beb445ce3e0f9dda", - "91dc30275238a614e969f67b07852ce11ea17d3880fd15337246908abd67e932", - "df8387ef27f3c5c138ab93d28ee4f1422c174c7b26155da3e85f53c3aff11041", - "9c4ee06781cbf42fe05ac368ac0a1181d7d65b3eb1b29aa303b9cf6b5c895c7b", - "285c8a47399ac5f3c80051795f03871e9cb4c01d9067e19bbf78200aa9b94c7c", - "8cffd3788573d76fd38f8912222984ac20d98524d252b5b9a23e5e37b71f81a8", - "a172cda933ee77635f3df78ffdf4ecdaf17e661ce9b54ca62a3090b5d1e47657", - "60b788b0e5911a9d364e86acc01e2286bc2559178de430c24663f412a343f239", - "e89c4a810708264b6356c818315c04c8ed9c73d8db403fe7abe1152f253d14be", - "11e039907e261ff23008646d4ade6b27351158396211f825446868f2f6af629d", - "ab4fae62aeea31eb7e6043dc95a27e7f742e3e1016a8b2e9b07bcef3b68f86c1", - "a6fce65d21f44fef9a055daaa3f4884d618983a1022f9c8f9d6391f034f80afd", - "e934b645af020ce05511329a0a0170c7d85376b2522f4fc2c48ad655cf08e81e", - "53c7e3fcd1fc84ad23b35ea69b449714dd0b7f7eb73cbc3a119608da85ccd82a", - "d226ad6a37451e2a40058006cf1d7d4041e5b8771d85decc5f2fde1a603c4aac", - "7f0f7f7a3742164799bb44afd1282f55c5dcccc90c1e8f6040062e3d53e16d91", - "7fd1df21c6a3e5cb805a077ea450923942b27e0f78b07347cec206ae9b6e8a4f", - "b7f32ed17ae55aeeec2f9a42a7bdf64d569c431cfba62accfbf47bc35a8b092c", - "dc483acbf122fa2f9458f0d70cb3b7c8bb5c33eafa295d28d841d1abd6b9a609", - "fcdc768d4a4b5aae21ca03889c5d0ab84952fdb9495c51c7b790cfba5c1e3af6", - "efb9e5afc225cc08a409c60ec2448e144ce2bda297b14e41f40e23728d82f081", - "73094a588fbb68bd90905d091dddb62e8e8e391c24ac9b05031af4c9abde4d02", - "5ef34114c581dd4e49c59c36e1087919a21d2d43ee37ede00a43bed69424508a", - "7d75bb3baa8e8c1eb5a76c2249af36d3fc2061b4019aaf694cc684fcd705135f", - "cb8c611926c4f592dffade6715e673f5df6bc7b9c869dded63a44007179e0da0", - "0535b28bd2ddc4a7feec2df719f9dce584b349226b301c9cdb7ddc28de15f587", - "14fb4c3706b1aa72cb686a927ec77bb9035616cdf68b1941d6aad3696a75d9c6", - "b7be7e82192f47e535c6e9df8fae05df7ce65e123fada89d789976759eeaef49", - "a87c4672e319f685a5dd318a108b363b924a056b3f4d3b19a320f5d3f0439231", - "b3a2e72990fe4751ba3c931bdaa8531a2455b46783d68b9aea92c05650ff660a", - "fe8acee7cb739d42eedea949e195163757b026ed4f9fd42732f3512e050e1be1", - "3dc4a93657bd41e4e6ea26fe222390e8ae091a6585890252cacb180c18cb68f9", - "af3b760b5bb8a325d458f5ce33159fc7af8bd54db687f2a3e7f4cadfdc2a2c05", - "433674f48c43b02034128ac17006eceaec92e5d416260ea0b46894d9034a1a97", - "17589157f1c6ca5b6eb1f237e8a0882676312cc34c5ee50fa10d0b56208bd027", - "a3c7bbccbe00ab1f887f6af6c30773194d6df1c710ded6e8100443c60f525c05", - "abd65bfe8d22a40fbed9f35079c0e4e9815433d26c7136ff7d14fbda297e6852", - "315b2993be53482036e709e1846a59564237beb5b86e775c4c63ef5c9d2c1cfd", - "e9bfb872a14344291c7e2c633a4e42b0f899296332c5f1b6ac929c3bdf6a0236", - "8d9f05c2b2923250d97f6653a2b6babec37a3c68963ad424a9ecc560206332f1", - "fcaa1ca9e267ca3dfec611ffdabcd83f874235bd3328999b542497d31e88a27e", - "cebc2f31a68ddbfbec8076db186a1ae5cfed181a23fcf53da4a64f6a29d27e73", - "efb7f623803de887e481a1bf94f1c268452e23b930e62db6cdf5980e77f02cda", - "e04084ef0cb9a04ae07c02dd0f9f453933d76c8e0158674bbbffee2bcd0c10db", - "9f142bf8a6b1d1901629cb070b0d4338e00769e8195c4e0c258e7105f1b417eb", - "8440889aee8d8b6799841cb7796cf3f609bcd4d969612f32d9d0553e8762783b", - "4ce1265d5b140c65e495c46e7f7d3e93cc57992218c2abaa11a9af75e0ba76a8", - "6c7a95471745cb925bb5bc15bbc3700d025371f1ec60349ba6dd5119a20e4ad9", - "fae520bd1d6bd5c4ba1d0146ac733c68ee02083939885df0fbd816f816a8e0b0", - "c0d3a9fc647be537f339ad72a95c868613ac9eed7dc8a17e6e54803145d38601", - "4c96cb61c39e481313914e5b8feb4d1433af7c538740c0bba7ea4a5c8c4d8772", - "ab6eaeb8a1d8f24032b785e630858506920609c0df239549990f6b2151bffe57", - "fa551c50b606b47a31aae545cbc666eb362671f3e18d6bc9bc3ed27204cd91be", - "1cc86cbddab950b690ef28e6337f274d95194fc8ae4b19139061be878d28dc84", - "934feb11e24f5d7e6a6c3796c85bf87d7f9b4f3a0a35c7c19277b5d44784551a", - "8d0eb4d0c25095ab3c91e1d103ce863e8393c213aa41acb32c2f400bc1fc98d1", - "19d33fb3f466d0abb59b4f01258d10fded1b612d3e7a6fdacf84bbd095db84ed", - "e916d1f44436f7bac868a038e671c8455c6ca08771cce7f72e044461d1030313", - "1b849b9eac555f77bf1f0d1964bac0b88b764599ef3b1dbe3c007f22e181eb27", - "4f4a96e5470ad5a6e3d71d7bcfcf9b623d2075df768e5b0c6d92d2f556099b3a", - "3ff20cf4d0d725d522af07f562ee2a156d997108be762c0b6fc9ef2578d5a75f", - "c40b5b46778bda2687e8a451bf4daa7b2752ea56a1b9ac96cb00b4d989565e00", - "98cb3cc60aaf658510660d305e03466117eca1aaa548cf23a4f2239538f3d749", - "ff0c572bbc9e1c970f9a2a0a308352c838336f79772d415a178be1d3d4e26690", - "18e60d8ff582be46630822f1cdd006cc521785467155fbca838e232cfdb207ea", - "82f942a440cd94cce44958ffd7d230bd710148e3e20ff11cf6e7cdd5fb4a032a", - "801f1d7597c63e57f82743ccae4dc99edf29aa0c97f8323cd0299808c9fe9fc2", - "405362b3442bddbc4191b2eb2228ad642ced24a722312f8aa80db559c9145508", - "c84dbc2a411a99f58c5bf1d6239d783743cda144bef967ff70bcc1e25f6b8c41", - "feef70ed9f3ad7b9f43e851be0e861e3b6cdb656b15df18eaaa45681f5f9d319", - "dd555e3e289c1ac34fe12283cfed7ed1ebb1af5ede5497ca0853587989eb982a", - "fb5c0cb91b45df038dbc508d95a4ef90197d57694447b58da1d39558ce9c9b0d", - "57c605dff0006623487ad2942aa664fa5818b3e5fbc0220b60e041f6d4e63a8b", - "5617878bfab6da8905cec2677be979b97d18f93c5d1bf7baaff1fc1028d9142b", - "24f22b9f2b4401ba474db75af9ff099b07357073835ed349c5a1871889a52338", - "d862d688994970cf1749e6201a2ff92bdec51156326c89c2fc1c4806b6c72d23", - "88adb6880700d85427dad041d353d4e861bc805e01d9e595cd6d6f74bacd245e", - "02e5f42b940018b9ac7957eefebd1721b5d25eb5ba53642b224a4062826832bb", - "e738987aac4ed5405e358f9337fef57bf054bea89acdf5728311a4a8a1b89b79", - "5744755dd85fc10d190cef73ae95f53b24fc33f3e1c22da9485c3d994396342c", - "011e40c998e0e5383386f4bd73d3cd7e415ba25bd13c3a32f74015d09f8c0c9e", - "4121fa689139da37059e9e6509a7c4d8e9b9492a0f91f015e88ec8e33d455a59", - "f53377edc02dda1072158b7ed74fc77861eab8a3f93382dced3543ef0d79d0a6", - "5046667e7717dd270c60e1090d4f8151a4577ed5b7c45f9586653f830238cf8a", - "8620a93ad8386f56636b802aee26d083df6e5155a38f52c4a1da3d245fcb8cdd", - "9808893b83f74b2d509acf4cbb4e6cc46e3f8754f8f1283bb8f47ce0e8e3b40a", - "da61f167e7113bbffcacd2296b42839d900fc98becffe7771bd802cfaa310d70", - "084114983426b26ae6904a29373354d00bbb2b3b4ecbc8d8b41e34bcf69db4a9", - "68bca9a1da9fc8823adbcdbc1f8d8fa87fd5ae54066e4a79dc2e950e55783ba7", - "4dc58cbc93d20cdcd0427349387325206dc9a7f638c60966f343de1b9be129a3", - "5588e94a78eccff241b8e41d185ce5bf260bc9d43c0d3961b7a73a465d82c275", - "8c9e7eeccf5561a24acbea5505f62f1dee09c888cbcfafb0b5db3e62eacfea28", - "41f99ab96542a4bafb9b440a644eb01683aa8a1c20c707d9c575f6f6d1567ed4", - "e39911775f252565a2f06483948abf197dbed4c2fd3e04f1e6ea73002674df84", - "0b8e2f9faf2553fc48b652924a8a78e56e6870073766e8179265894430b10499", - "a2173f06fb660a657f71a2bc8ac2ed22f5583d8bed3b83e8e650cf23568206fa", - "a740ca95c0b5c71cce746aafb03e7e3aa0adb0ad9d31ba5feb2943074b4dfbc1", - "17ad3442429b51455f36fa1b44bc2fbc5cda8d6e5470e25f3705a18a3745ee1a", - "e968e2fe12f605745100e464e71404b4c444733a9910370f673ece759b066c26", - "45851cc21e8377242eaa1539de563144d33ec51172d49ec19ffaa27d1062f52b", - "8399ca028b67153884d20a909aaf60776125e4efe33e069e0d516299e2301d07", - "feb5d6157828ffed681d3c3d6425a875b5043afca42bafd8758b04621d5b04ee", - "708a459bfbe3fc177a4f111abd1b2e9d5443cd172a6dfc867177eb197593c371", - "aa0c8f6a02e23d1c532b0703b4b44082f64a07741fbaf93b71b412200e13cdb9", - "a266b79aac16c4d6b4321dc6530ccd40688cac867b294bc89b99b251ca669eca", - "0bec360ab04c0305b537a421d69c7996a7f8b7dd8dc49c7951bd76d0496fe456", - "6709eae517a23bd17133353500527400c54d2822d40d77badb63e22d9b7a0a04", - "282e577c9294d708438248e805cc9b6734e66ded36934873509d9fa9fcadc7a4", - "da308fe887000b05c856dfccfd15c78b46020114af7c55282df3d6c4a82c5ce2", - "7049c8954d24cfd7e7b2ceca7546ef9ae21c5db2122fcd57b66f51cb319adcdd", - "b59a2fdb0463c15d6838cb729c66f755102c85a3975c813d6b5596e0e489186e", - "940487d5caf6896f9396c982e09a4bfc8a8704a783cfbf45029c0b74c52d9d65", - "430b57ae0dd97dd0fb01c5f9bb2d654b90a75f96df889020e58dc1a417a2276c", - "30fe1ed0c43f8f2bb2ac28a6d8a261af88f306c2c95089c19108fbeb6852caaf", - "7ce46c9b369934a74f8dd529bb77d8aa0c5547b3e465f4592a86e36834c20cf9", - "2ef64ebdb73a3b8781e2729a632b083ecba23113e6b6e1a53e84cf63e0ba6d4c", - "5bca7679e6a354d1955abdd2c673aabc5e60932e5502c8077801b9b8a071324d", - "33f36a5da977ed6ec6be9208a22ed4d36da312720d6b497b6eb11bd0df9ace5a", - "2608998c762aa484aa6dbc9a8250a1bfc9d3a6ea55316bca526498e6409efa30", - "0b8dbf0875bd3bef2fe7f663ad4464150b798b1189a3d72aece23f7d72ac2899", - "3de67f568e25a96583ea5dddf74db342de07a106f66983e5360651c6cc6a3e4a", - "e9c58bf259c349981c799e92a70955bbadaabf12bae52db021d8a29048911411", - "cb28cacfae4df2239698d00e1233aa2ebeaff779e8400a59e6d799a96392204f", - "5193b9a1e567046b108aa92e9c3a971fecd5704476464eb89b46ed25fe68f5ec", - "3b2d0ebbfa8337ac778ba954bdf3fe7a8fce52d4603f1478c684ad8935b2f6ec", - "6dc71e155d69ce63d11d4eb4c38382257136a9c145b4bca395308ffcb4b3838f", - "593d190dce57728b1d41c70608865ebd5bc65d8f2841d82035df764c94067957", - "577c7e345d14b5f4328fdd52c4c956fc7e9e15c75f81b35d892f3cf77db738fd", - "0aeb4ba3e9f76ac428afbc37fe38ed92cb1c310a6f94d55d2e35c9e5e39d1203", - "b787a60d4753669a91599859bc73bac7fa091c0dc9960e14e7315c21a0723f02", - "ccc6e885e03eaf56bb6ad64e4d008d01782dc8df185b215be28db6ac9d7bbbf0", - "ccd5ed7ae370d6fd89dddd63673b9c4aef22daf7165726de11f89052877c8839", - "3e7aca6b25575ba73a6ae34cec8112b8de7e155158c86569d866427686763a1b", - "c57a050a87c17b99b04badf67ee62f8a7240500912b49969ccaadcc8538a6c98", - "b128afcb74efa6c4ae05cb2c8a217a8f3dbdd649108ba5b8f593380592517975", - "bd4a9649a1483a1e136f5575249dda78d270f67219fc90bac5ed6fd6c645fc5d", - "56a577b3a6607bd4041544199cebaeac6cb256e4c74096846f82c4a055527e5a", - "9e2f65b49e87818a6c178ef59e9c615c54bda4e41f25b4c86d83a59bb18e23a7", - "da6895765eb83ee699cc71955ef094194d8bc4f593d98a711ed56c7d37c4efa8", - "02b445132e940127c728ab5f86dff3d613865e86f2802edbf362d7842e736a9a", - "ed194ff189d0f9142b1d47a86cbfbefaf90ec0254e8079c1ce5f1c01f44db048", - "36c9ec64d695a53be0101167334150c1133c610e9efbdd0b90572f6a43765343", - "3ba9336f640bc98e2c6f254927c305cceae091bc4e204e788ee84aeaa6ef1630", - "3c29037745c7e9ce11679511d30353057b61170f446d5f924c7d21184bd40c45", - "3edee500c5b31a823804fd4e0a2b25401126173eb731cb114117e86dc1e062e7", - "a109f1510de0e0358e683d7cd98b0806cbe64992a97d8decd7e12b06a100f7dd", - "789eebd1f23d18d009f862f44c4451005ecce17d26d7fabc60d6fa7d8d97e9a4", - "3a3be6213771c8813e746d055aa7b63c97240726d3a08d619cc94b23b5233739", - "64d3d32917131e91cd7b873568a7dcd3fd8259052c1e7092d6d5ab27ed00ca13", - "90e564d714783a1b4cfe41825bb061980f6cd868f7e83f3b2945b72c1102e384", - "3a1ca32eefd4ece4e53a6be397e21afb68baa7c9a6be10418c8cf43f37b50643", - "12836dfc49058bd79d08cbbed38ad125c6014d0f53ed159687c0a8a2e27c3c9d", - "0fb8be7d7d40bafb60f8954f557f5def4c270bf9ac40b353e25f1af44bd596bd", - "fe8c63be262e865bd968cd4d78248ed987f72ec83d78e98eb6f2ca6e2e18a8ec", - "9824f0bd387ceff9c8911acefbe52106d2fcc03bf5818254bbf861572104ebe6", - "24df61c8cd53363cd1ccd6f86b6089422d7b337fc387956f6c9839b9993c4971", - "3c1a1fc8559542beea366e3ba90809a844df2781fe693b346040cd1ff3ee7eda", - "70f8f790243d8f50a192def503984651d7089529606ee0430c54bc4e18607812", - "8d0a18e1fb564b417a8fe689614d3a903eb8727bcd794a6248469aac6985261d", - "8d0856dc825e060617b03c15be113a6b707dc07d28a6347d7bf2c0b822c9975a", - "e2b0617e07b66312fc282c868e075de5142a3e5c91971cc7869ad23b2cfc2e43", - "03516fbc5b85bb6ff31cc61b772e7863707bd3fae4dccf5ec69d55290379dcd6", - "d72d86ccf5d85af836ea73dbebd08b49e00d9fcf5003cb8f237e2878eaf0a520", - "0be0693ecc1769fedfdc280374700466ffc172a31fa34db99a09a83dc5b6e5d7", - "6a55b0f27dd62727db4ac66065cfbf52e2f6f9294e26591a23e8a64a5ea32ba9", - "54b08028aecd066c309512bb94b28c8b0fdcd48bc47ed1dfdca189a4b3f5306e", - "6feb94bda68c843d6ee6c17a1883ae652332caf2741b6f19417d31adecdbfa11", - "e42d201923341838fe7ed4721251bfc5f5e98d8678d13913032a74142b934b18", - "66d655f8f8afd02dceec97a16a6c4fa7b5e68d393dda54edaf9036acbf988de6", - "5ad3620d6c37bc30af04e305cba60e0f082911ef7e2d974356a43a44d1f8327c", - "d1ae9723c8ff297446a3a177f97caf448b9427484f4314b84c9b10e470de9823", - "33b5b585ef6fd329827d21dda7831cdabce0132d090781bda60028412f6f795a", - "0318dead924fa088e60d92e48dbe842277e82c33ec05e69aca9698ab3697f29a", - "87d33ee7601cc8b2a064c8ded316e4264f4bf7b4a1fbe19fe45b36cab9976f08", - "a8f2c09bb202aba1230e0abe9a3aecd6aa0a574bc877c26a01d858b725f39e54", - "4d382f12bed03a4e6ea9ab607cd73b3d149ebc3169b022c8df94ac27312225e4", - "e829263795a383f9cbfa393a2bea2979d754de44cecca37d77787dec54e00b36", - "ba8b1c36b8e3b54f1de3c7d3014ea4cab6c02cc1d28a3c98f88ce3606c6cc9ea", - "c846857b58f825c16974ee5cd660994613a4424363f5f81ca878c2958b52feee", - "1ad33990b813321f055c953ff6a82d26402ba54809530d3eb67f276b55645387", - "fd76d1794c7d3befccc49cec9471f43d784952157aceb3e5c1c3df76c90a85e3", - "80b628a54178463bf7a9a3f39258b6eeff950d3dcb1a2da42516a1f19ce6a76e", - "7d3ee2966253990e43668b274af2b84906ddc57bc1cafdea5e246d60ee1763ef", - "6b850b04bc68732657f1877f2684a76dd5029c0e658b21cf71faead796223763", - "c41ee950ade2bc7e37b4a37a39c38189999d5e143416ebe0470628ebe4f0bda3", - "b0c28ee2a4c23bc47e833999de63c15d1d950563b4fb09ce5b4fafcc2c1cd001", - "a2c48b3244a46d28010ebec79bae44f2b74fea29b35d125264727fd5e1d7da29", - "022aecd13bfb30bc21d31d03fe70cd5498fb217253ad4cf0b832bb8b668a30a1", - "ecf8f9c31225f64ebf3357740881a952b221af3d604662fe070664ea3f8b9ec6", - "cb1520a3dd2763661cf38d17a8c1e9ba92e87f95f51a292da85d79ad9578aacc", - "4616043a501a3ec9b9897cb2a8ce91085b5cf229c47e432273c5caaff0b0aad2", - "5e57c041b3a6d92682e1f84ceb54aa3a3522dd297cca449a9347960a59e8e2ea", - "8298c4d6c8924c6b7083f0010e38d7b94bcfba6e6040b4d4a743f18c418fd771", - "e109e894be54a7df9d3e427ea60b215a2651394cc99e793d4d04141082477082", - "4cc3b6b49312be41aa281762c7aa791778d7789a6f55becb757bd93b2274dd1b", - "754f4e1f7d71da2b9bb9bf70f824552ced392a937e92cb34c42542bd1f6c5f5d", - "22fd541b71a5a8dd93c06f47f333ccdeece2549a9d6a7df2687de99d6b203b43", - "a44d112fd8f2f8f4dfddbaf0b8cb62833f1c0a7eed87e4d47a940212feb1f079", - "b0479d3c14e4e95bae3bb26897302f74e161a1e793a1fbd3dd9ae0c83e8bf01f", - "b8004b55ee75da73f3bfa57e7f80d0983c12f282abe81e2d1e99ee3db2614b37", - "40efaab752648e2069ef08da3cfed608b4dd0963e11cc9a7c95e04289308f918", - "686393a1d5d6dfc6db2793e989e8805b257a0809aedc6fdaf059e6329c44d40c", - "c1eadddcbe816756338c07872cde9b6515035ab76fe6aa566419324953e9e8fb", - "3c08019cac6211981914e97da0176f125c7f422f84cf2cef127530a478045d3a", - "a88838ba295dc2d086be36e1f1e9bfeb5f6bf45cfe7d5cde8b476e1163ab6bfa", - "14216cbbdec5b97f5c53ed7dd1d78e5a0cdf6c4ef61c3e12adb401b105162e43", - "c64c39c1e097a4a05b9ec9d09e44f039f7d89d9857dea27f9960cd76699f0dd4", - "4a908fc011d46b908ecdc6945485f97ac0eec4989b8b2a088326bed34bd765fb", - "17671a443085c54929dee4609ee6c5dd487459874981176260501bf45eee7d06", - "9a870d058ddec1d6630ed17990d0e59b6be3b45e0501353022357ed606ab444d", - "3fd57320b9e4f804e21b9c9e8c5a29eb8880e4b6c8f8fd086e407944c76ea2bf", - "796bb7a7b855995c2da62f62dc8ded5c0bf47a2c8cc0b45e50edca8c8eea0296", - "6f82aad163ec2838c6cf3ddb59a0e46e79d56a0d58190bfdc5777c164fe4de57", - "85346fcf36d8158821945f638b55b1af041a772ea02429f0ad926d75c316d150", - "aadb4e2bbc751ed894bec18e4f13e50c2261c8e603e605cee459d1b594d4d73b", - "8c786e948efb17a8e0848cbe9488ae6e8c1511c8285651ff8c671913c3863899", - "dcaae32df1c0bd1dba2349a568d287d91c3e69a238768e1440bdc0c2839bb153", - "8f0185a8839aaf38205ed3738ac8fde10796480dc2b7f5d721c333ba9d86cd17", - "04dbc2181603ebbe892faabca27445cf0470438988aceedcc4058aef1bef94d8", - "da87d01a1ad7523a4e3fdcf7574f8bb4d945a0d300d08c8a3ca2107ab953a607", - "a9e61b0e9156ebb4d8cd8f3d505d1d20f1af44888cd3a68606b0b4b8534466b5", - "f65a2fa29fc65c3d23930fb55fb685e7b7c033004e9cf480daf23372ce4ee211", - "b4ed637d75395055cb95fe9946cac9ed307950b161b215e4454356a552591fab", - "f2639f0c2fa3c17158a03d8a3f2a75b763f12f3bb092f968fc62ad876bd7cf87", - "c151eeb5b8ad5a97dba69497c3f8a2667b9d2ee450b9d1c7233f245cfa4af2f4", - "5f36c3f337119388a6576be987bdc88f2d0244c1bc7fb4f3dab53a68f7833627", - "7f4eb21f5f52716a46509006ec41cf6cf5273704ed5391c297ce76b8cad228a4", - "83cf04306c5fb8789551aa25f35c4c1a2d2dcffcce446b210255ad6dc39fd9da", - "1f52cb0e66f44c4eb8b59801276e1051f0d56b5c97c610566662e16eec21383e", - "24a6b2076b1e2d388fb61f07bb13afba2c7301a89f80a89192df99f45633eec9", - "27caaa8ea29ed9dc0d6191413b43c4c600cfff6b6d195b0e9f05ff73f504bafc", - "ac93f8e9f6b8c60053a544649e0c82f8c48970fdd9ec861cf215f0af5f7e169c", - "f0bd89d47e0f44a3184b307a2f602e98e3ad548833b88bb889a2d87730ba5221", - "97c29649e488c1cac1184d4133694c4da7971176a6121fed6d6c01aef86c7008", - "5536896e59ffc96fa3b969395844d58f66209417053dca28752fe65b8171d8fc", - "dab29a1743d830e42b8d272cc212384eae78f2c825cce4c4882cebf6c1558672", - "1192236a6f051c17b1df84dd6d25163064d64263a0f7bf51ef35d07e72d80208", - "1f034ef3eaec3eec25ab1d7a3484381117980e4dc25d9e9f726962a9f89f6d60", - "1801de73db78d9653c4f1b8ca8fd05dfe96841f469e254322493c87295583f85", - "86a9ea043a245dd715f56a2c614c64630cabdfe5f8561d764b53283a404524b3", - "270198cb5d69cd497a09a746db57e5b647bf3e30770320d52f0cb55fca267960", - "a4bde279ffb8572422ba973edb5990067a97a30a7745f22b0e2cbcfe5dd7fbca", - "1487ca089c3aec2cc26d228e377c99da0cc40d4819c53b07b1fbad97c5eb37dd", - "3a223de4889f9a2944cb9e56cab01a971904956569e7e9f27bfddd38efc51fac", - "3238702d0ff9d34fde3c9ebfe5ecfc77e13d81b9d27012e1d0e61470cf244268", - "e0ac1985721e1461b54a72fa0e49f622edc438edf81f83fec78dd779dde2d94e", - "d8219f369c7802fc1ac59bf6477c44a051cb2b7bca2a74eb500b1dc21e8a3571", - "5fcdd32a4d6a9d5b43a6638b854b1e34d22129d7b19629bf0b8e12f6e944a9b8", - "6605b7c94c44a6f88ee09b808f35ea298954b1832cc373af856890bd4f14b3a5", - "2115f02f08af088cf27e46f32255e25b708150a8638d88a9b90116ed55263127", - "ca04c37d9e7a06edd2a1cf28a779f6897aa8d19291f1000078afa76b910f2aa9", - "be9b4b6b5c175476e99adef5a94ea3bcaa77e1f6b8c25e99effa0fe6a96a5fc4", - "2fbf408cfe4d82b5a9adb7301304e5d9c4f10cef010eecc153aab4e75fe34536", - "948d1ae8ea9f4ea5ecada12651e3543e6921d65771b4828db80760a5dd110e54", - "765d006e7f1b89af3d2146ef60feb2b684df21e0e4b3f0d2f26b75a03aaa77e6", - "4f6ff6a11e2c8d6ce1c57a746f4855e3326ec3cdec0363cd5e4c2c882e989fb3", - "df36a64439d538b7d1a33475470f6fa384f0ce97e9fe08f20f8f620a0cc6b815", - "556b2ed6fa5a677284c30937617fdb6a967afa34903b6c2b0036e470cf7ce322", - "f920c89cab588962e68499607dc27084fbf5619c0849ce720dd6afe05f69ee97", - "222dda79290d09fc91be03f605eaaa0f824ac09cc3ca5f4d474e060c638a45b9", - "83836a41ecd9a59d53a4d3b2cc7214a07a1e5f1fa11cb21b77c427790c242723", - "2d96a009c3f535edd2a6d720289b670eb96e2da096ebd169b064cad96803c5eb", - "0cab097697797b67649f78d89bc93fd9f0d4cbb8e79e7337acc70510b472d6fa", - "69eb8c49e339cc783a075600c459dc8643a85773fb8da047c770bc25af7bff71", - "342f1a8746940c0d8441115747c2aa508b1f6b6516c2a55ace1824081280101b", - "c02e9650e8a3aac02997275c659e2af6b890fc46410d058dd10b35d61301b86a", - "244069784c975b2d7a373cfb5c3eeac56e32a485878a508f6ba05466e54861ae", - "47b06f313d97fcc12909a8ef654fc8e2b33ddd230a78762574d4821abf057f02", - "b8ff9e0c4b1b03e9532d408661c1666a3a42afb0cd17e8ace79682b0e2238aa2", - "2433ad74927d9d8571369556403590b87a3599092c63e54c1c663277438cbcc4", - "bf892e1d0c2b610bad1c46c06dd437237ed9d3e780aaa9572b7918408c37789d", - "57c009f425f999cc1d6aab00ee9bf15a10a1a5274f10a72b3ad035219c2c657b", - "51ba3071fc37170d5fe564c3b9760f08036cafa71c2bdcf04fc2c7cf2a6c1b20", - "44081de290a5e653b146c604ab67554be7aee0481b2f59abf0de108d0c570249", - "89ff9458648a9eca26c3b9889f9acdc3fc1a0d43ca5ef35142a0699fe2870d7b", - "3ab1f8c626c633b5ec6a974662070af84957b4b7658fce576952b7aa13dc8057", - "a2cc44dcc49066c7cb4adf03437f5733c4413af75e72c63af7edb4179f9a8e39", - "3548f844aa00f95d540c7fa44cd6800f6669d984dd4785a89b8959f91f15481a", - "e31361844aa0232d0609566d168b9d5f1b37da256e5973a54ca23f14469012c6", - "7d073d5b6a19bd35961a96f01e875ce65e108243aedc55ae545b6fe9217c4882", - "c564ee27aeae82f2724c4b83b7cc5dca4b5cc57538c17a80ff014254985185bf", - "ea2e274daf28b41c807c31a195bec7f70d63fc6cb20a66a58b8e59dbe426b796", - "c284af2831f6cfab0f100fc90319e5ba93b654ba2f2d5b3b14c98266be225a61", - "a0645715b7f26845d57f4ae785f9828e19fc7a0b9171494925d976b461690768", - "c12a34e8a8d2a67ad80d3ac7ae5c4cedbaa72b40a269630afbb4a921724f452d", - "2762cffd0387e7005014ae143b12a2d7abdfd4dd8be7c7e93de67daf981b5b6c", - "2f2bc2efc37939d1843d2952b98e7aba72e4333e38eaa2c047e9bd2f1aede946", - "969a5c63104ae656edfe8c8ff4baf44dd10b4fd61f8750734eaa228189ced467", - "8d586bee0708935dba4265fa17ec6ec5055bd2de604baf35aa762f54453b1081", - "2ec7c6c9bbd8385ae98e73e84d6b450eb42d256c4b2d949cca41a42f6d5d7643", - "2ef734c7293f8bd94f1ae4e41dfe50ab2a2ce4b8ddea006c97232d103da5d5c0", - "5d69d32a79d705daad8f6bc62e567360209bd76e60b66720c611235068e45d94", - "9db47c5912ee6daec67c38398d3ffac16f511aeb0597b8ec35ccc1df73793303", - "a5d65408973a2a55b0cda080830089592164a4a4260d6edf943432ec167c74cb", - "6c3dea91de57e7763cd5615f1eb27d467b378731654273ce9d59936e25a9998a", - "1320d97f2de8927485c039ba29bcfedb423dcd73a88ecbceb0fcdb7f544b2d98", - "2e5126dae5b6513d7b01bf7252f9ead13478eadf8d0e1012053fa8b49d1a0888", - "6ed2814d01ead92fe46cec69bda031a21b058997d8d3598a468873fd99540f0f", - "053688c6525cb840911e8150493956f024a101eec9dafc915ac437d566e0410a", - "4c3e62e7ce325690aa87af4272db82d607d9fe9ddbbcd597de3c581d4b77b74a", - "aa1b0a457a536ed65004ad1775f0af1fa251d7e20155375af9ab1dccb503db9d", - "f36849b2575339c110499ed736bfee015ea66be810b9c0c465cf2fc5a1818412", - "7887204504d66e3f1709a408a138e9db0733777030bafa63d2211313bebea055", - "6d328f3eb7735c01f794ccb3f78403e5a5fd1e0d22034ec7efd50f2e60d0437c", - "50b1bbe162eae7a2a8a495ba9c0666730d17b3a0d26ccdc18a77c855da7f62fc", - "3dba599aed336ed2002f3b892c0a6648dce452fd8888da2fce34469c01d354c6", - "c4d2668104e038427b48b2154785dc76419df95f3a66a5bfe74a62067416bacd", - "6cc039604428fc348c02b405be3ba7be4e9fa728ed581642519be484a888bd8b", - "ba702de8228a8b836f6a86a61147e8481bd8fcaec44a55081f5f3e65752980cb", - "16adbdb49b214270ba6852f761cbb8a2f430c80aeb5b4301382b11d98cb51caf", - "5d3b1e5a1a342318d9b011a92705ee2becd0c18b7b23817f00a38ba1342b0de6", - "26a2f3b1d25a48a57b4ca105b9141221568edf9f212b22a213fdd9e180d89993", - "c5a0aa0573c1449576f4b7c2c2f08ae4fce96e3da4f906df3bd8ca71deedcc7d", - "f5108f0bc63185c9da9ecb6659a4671ec56dd5d3c439a881e1abcadd92fc931f", - "321fa93c3a0ff411168ed48e23e21fb05314127bc0d335d5273d596a34f8f039", - "413884706f34699e8a076718a118abac7079dae317671119d87899b136202974", - "8f3de0b5ca7e5af7ed22536766021d86aef2b6e58a64d363c623485793b18676", - "99bd3736e01e172170f20b93a4afcc7ed95a266a0a54601a985477af106ef871", - "35b4f3369ec2c30811eec7372c3a42520a2bc9fb89a0150494770e0c4ff627b6", - "e11ec6ceae2a7f3790df677c7d916cad7e3fe58ed413490f24477702feb6f981", - "40b6570f6b100af7bb319caecfd4e549809af675fb850b6851365554dc151cd3", - "3ffe2747eea829c715c57706148bfb90926c5b40430107b0de8f57ea278b8de9", - "9c5737318fcbcfc0b89bcaca98ca5f2a9dcee172e85f9fe0d7065ab2a6dab3c2", - "f73e3fbe79f17c928c487302fb57ae802a1b4c6cd925564527bade643ce8e281", - "f8085777b7812bb51e60d207c308dd0a0df8b629e5dc21740eadada870d9591d", - "b9447e8fdd6d5c2682bae305a606f26124a3deeb6f9730cb026723576d9c778b", - "ad6a0926829873eabfd3d7284990dc6d6519c734ad8e48d42822c770197888f5", - "5bfcbc6c8f739e2d19d36dece9380c0545020cba35bd4ace5767a6915d493bcc", - "7d43b769ee43e2b52c9c0de2e73e1a6b3536f1da5c6d3dc1908c9b9d37131fbc", - "5471361093e2fed4c304eecacb02b115e979b265a1b22bdb3a9e5d5e1314a529", - "3c7b682570474b9c401c0f8880ef3df1e3ee4a5ebdd006af283b02c5f8146df5", - "d9fa410f2fa42a36518cbc978c70e6a7e2d3ab120c3189e172b5083d2b56e050", - "ed936b2586ad965296da32fa17903a7c5e1d4a37ed2292f5a6f704543951bde3", - "bd50c22207760b5f23fb41cb2383c02772cab099067fd93bcfeafb0549f9b415", - "88d2dc00e9b868e4ac9c17c08411d81a7c377761dc614499647a08d77d44e4f5", - "1823d58d62f5c0fef2f6fcf8a166a945f51f76fcbb1ce7ef9108873db3d86c55", - "2adadaf62b6f18c25d4a857eb802a9cda32597bbb4b25efeb5a8ebd9dcbef246", - "9914a1e06ee74adc2f1c13b214650965ee4c4d1f5ded11b452fb0afcdcb5d98f", - "8dc03d27da954558d5f32c64d1f9d4fc84fd506c316b21f77632450ec5efe1b7", - "635359e54e4a82c7138698adeee7337140d4b0dd1a1d96f99894f226da9e2be9", - "e3c9d4fcbe5ca52dcf19ff34347fe540d43600a941ecf266adec68a1e69f7c55", - "9dc1e5e476ba2749ddf45e5826da09e9d85fd8e4a435b8cac9f28cc961997180", - "5b17f75269b65a32f57bf01ebe68d350701bd457b72f8edcd12cc4ff1f239c15", - "ccdc7572924ad8bf090bee54b7b9671ca5ba239ba69d8d05fbbfa584dd7f5103", - "5342cc17bc015a9e999ffa191d50bf4365cbbdd40d389d66a5e658585b53071b", - "9546ec870c2d7a346931bb1627e0de7d72ee9f6c8795cc07cc3dedd93ba2138c", - "175f2d4a251a5ab640d679e8c5f6d67f616b22011ceb647f95e0c5428eb42abe", - "d5cbdbb0cdbb0971b5345ab9b32aa202c40b44f8b1aa9a83e0750f037b6f69bb", - "fa8f20d16763678e9db5b3b54a50301de49233c3ff7f40d8d4473cff00a97757", - "eeb5db64302a607e6a3dcbf0abffd41553c28c03bccec835a8989018c2f561e5", - "8434b3a7b61d4db378a964d12417067d7246fa3a9bbcb6b2e68d20831f78cd83", - "474d78966c55c2603cf434158ce33c89f6b018648c437dac746e9a804ffdda6f", - "5a0682793a35b4bf2d10129f477c4e870c0baa8d20950a127095281d5e1e32a3", - "e1103849744bf04d3dce7925fe36372218c8ecc7582b5c69ee015556f62216d4", - "44ef1d0232ea85f47d2842ee12d95fb5f1efccc963ba052c4b683eedb90c40d5", - "672bc904d365673f8fea2fc9b433f4e0b6e35bb27a39e9b16667002d1cdecb37", - "2f0bdf9998fcdcb5f200810fc98ec70bb4b7766e3f873d32947de20377684a50", - "da55398f0d1b563a01c4ce357e9ae2cd8b46241f397e3e15b8dcf57d4e2e93e1", - "320910ddcf670b0bf8398e1e0afa40dfb19e07b65e98f4f27c2848f86fc459ec", - "2960c38775de1390c932e678418b94c99b76604166bbafae4ba7c253b97cc0bf", - "77352f3fd8660b277a5e99b8e1d5b84bbb07b313d8e37e686fbec64ddc474fac", - "7255df9443b9fe02b387259fc52176d5f977dbd0003b43e648c9099c3ba46ba6", - "b38590a45a35c9ee65e801f976ae9e298ab5e10d86a39a3d979606cbde245383", - "b512042bde32d69ef71b5566c794d215e628f88b07693c45785a4871d2c93bb5", - "632fddd8a69ed7ce7a2040e87e8f6637b3a3cd2d21ae3b83b49776c5633eea90", - "d3d3361d96b04bcb51fea28f7b8edc2f68757df2be3450a04613badf4b6777bf", - "5d0338440bd4ca7268bc4ab9bac33ea419b80d7e6d0081f3e6a7e776434bb7d6", - "7fb89d261482fcc058c4844d76d36bf80eeb4628d924800d1774d9b9364a075f", - "def855f73506971b43c1602dd6b3d9c00c5ec26c8521951e8edaf8913edf3d31", - "df638a51ec37f2d2910b88d304c87be23ea6b233b589fcde15b046354d86014f", - "987d9143ba22efb77038c219c19b6c6955c48f73991d3d06731fc1bc29495cd9", - "ae5b1d81ff2f6a63694feefdf0d95a171f812daacc1d035e4d7590df4e085fcd", - "d7f560cc2f91ac32940ac35ecc226cdc822a7be9bcbf190c1a50d361d3a79bd6", - "8f512ef39d2de94e90b38e4d699eb1471b26bfb5ccdfc1cf347fd334c6664963", - "8bda6b74f3be50fb489c555bf318b54696fe7b0643491d735c6004acbe8aed04", - "085f7a29306f53df286097dcc2cadd9fffbddd2187b39d2c7d2f7f0ce2f12839", - "edc9ea7e85b641b44d0ff3463fcc46f44e013b4ff5c40f278b14776aef6ab1b6", - "16fbda4eefe82df8c3caabb0591ab904a6677009109260ff2e09fbd370e9e671", - "271b34e1787d5516b53e13979c013ef6fe8b98817e7be9897b03b77b57aa1c58", - "2c9eb1bff4fe7f685b3f9810a782fe968cfd25b256e247980a3555dd48d65b45", - "239a8ebf178696d5735e6c880af8f2cf5f453ed1594a3b82afcbd5516c9c6c3e", - "f29b3e39bcb31fd80724d929fa53dffcf229ba5687f0b3c2ea5413556dc45ab3", - "e690d1e2986d3e12d7881e653ee18212a9d3fa2d02461101bd0a9425acffc582", - "1346037cccacbe6902265cae77379f1f2de91e6d247120363d73a0620a8ff93c", - "b054ba435bdd49c93a5a2f3462e9364f5a031fc27e71774cb1f3a66ca318a887", - "c1717c1a003ddecd5d298cca3c813b41b12f2091c38d11b05f2f51ef0743b964", - "d572db36f35f721187d391d9f71361253aae7628d935ae39fc27703fd1456d20", - "c0d50a94c37c0816ddf56dca88901ebfd627b0696c10a956bafb1d9ccbc13d1f", - "625b6a90f5930001e2e0f61432b250b5bb65e090406c3388004c708140d8d014", - "d42dbbb3e92e9987885aaa6df88cc23c6a2a73afe9922508f87b6c7b7d48d2ed", - "85cb441f15756008a72a601502388e1d67d05b39b40f33d50a26ec55b6e6ec90", - "94e1ff6c04d3e870335d2fc87612cb0e98844ad87ae339ef7730cbce49116e80", - "7d6ec7073f536d84490e8974202a71f4be04556e445b83841f576d1b87d13e40", - "5089f536cea8c0b187c4aba1dbd7e707593412ad53d34cfa8b7d6459bf664149", - "98b773ccb35a665db64dbcc56dbe6e0d24d259a4b13c98fddc8166507bca8619", - "4ffa7ece1dd201c2a3854783a1da25c3b1d27dc144ca214297d34ab4d0d6a211", - "3849b0775b4af9e8212ee8ce4259893101d1adc237d63c7c2da04552252012ef", - "3631a7fb7276812a0e41c62a75fbf10a482e8a72a1eacac0d4214b5b7727dc58", - "7eaa784d881f0ee9620475aaf3f8893308fdcd9ba09d610e6b9faee97a6a51d6", - "76506ec62735e4ca1788c429cb9b8c2c34cc88fb13048dc0f7b6831f3512d7c3", - "8b1570af1d00edcd48a46e09dcba7c5102ec927390427330319ff754f7a0d5fd", - "a756ff0a2cad3d323438f4d32945f7273605571549118349926671b5023050c3", - "665ec723ffd885921ee73b7f9c3957abfdcb07d2e938cd036f0ce832f05f8e30", - "25f83695aa1555fa37abddac92c3a8ea3eb45c02b1243396ad85e1e35372b91d", - "37d646723573cedb4573883e67986b91fb396da42f0ba138298acc6554b938b6", - "1da6a40c07135e85fe6006be53ab8f106f6cce03325dfd997169a814b6d60da9", - "bc019cb24970410665dd1fb6276de6ea1d7137ff9686f828a4b237c5a7a1a423", - "03ae7b4db1a345d5f095b03c48ae910e48be93929f02a5023de5b5e10c137467", - "f0f0029bd2dee86711202528516fb2edbd12f309519bd6efeb619bd43702d561", - "4729ce12876ad1711df0df4ba8790f6739a195b121d1ac3f113c5f38aa165065", - "7b9ff5881c91231c1d97ff443cca36b8a6c320ea60057d3526fdb70d9b7db3df", - "3f2c06b5e92ddf21f79b4ade75a1b5e615c2b3504e49f68755963c1e7e6dea81", - "67fcc37bf9684f509939b1f774160157c1be5e978b6d739dab3faa2d6ec7248a", - "af084818e2d9038b1e6cb088a22d0cbd51c8885cba66fd9a5b143b135b9639e7", - "56d7cbd13ccbf86a1cff54f15adbc20b3c2a1e0d6bffb08a50cbe8b796c14d5f", - "49aaea21eb61d6f4931134839dfe5eb579c43561d331b835c7e7b06b301ffd79", - "09a06a10c3daaf5ee4191827f45e8ff844df949bdf22e143c7be3fb370ebf1a8", - "b7c1cea45b5ea62e5e2661e03076fd682cd246f25a5c1154934556b6ccd88c11", - "f40c00c480029501b526e786677257562f8ec8e27cd80d699851b8eeeb7617aa", - "8403eb0e1eddff4dcf3ca256dbaf8c2d246eaf1777b39affcc7ec81b44edcfb2", - "1924971794e758ea35773919400ca5bc5bf292c660f861e9d9faa8088829862a", - "02c012c9dd1954dfd880fa3de508dbb4feefd3771ab420e3d5d4d14cba2e3d23", - "d6977e750f2ab4c2cf4fb845b13fafcbe5c002fa87f699ad4f1b1b34425f6d15", - "67215277b16fd5cde189e699363669386559eefd2ee5ab66dcda26af41454590", - "54f4211a260e331762d47313a095a6e9f8e8bb0481a68aeb76adc816001bfa78", - "2c23b49f649b414f9700dc074219d8941065d9a9eb30a9838145e3216e1e45e2", - "1fde95ab92088049424bdc59e8be5a329126f80a8657fe175831e21ecf8b5006", - "3722f5407907fe0ced8bf3d2805c6a709d82b42466d3afab087fd45931af6cca", - "31b8d936ff5e81f0004c151212060117644d19782e06e87165f82a72783a8606", - "50d2211073e0ebcf73e243e41578bd190e2903c03a5b2daeb8a8a4e3b8047ce5", - "d1e8d77a9e3a542658f85a62e373ff339d68f67d649faf85c88ef0f22977a6f0", - "af9ed156b7f9e76cf0edacfbecf194b0e0e484f2630e46844f6cfefb94113c64", - "27396f6297c055d241ce9a04cca15b027ce6f0f3dbe997deefc3d420c28deaca", - "aebe21d35e17efc71e95931b3e9a1000eac77ea6c0a64b46da951e5f116906a7", - "344095eb64d097a106110c5203110dbf960b921364dc2bcea1db2cbd02cffeaa", - "2d8613c0e56a05f78f39233bb20ca79ca76eb784bc35206d9382346e36c943ca", - "0886657d2703945a870e9a669a688e7b0e448fe1b8a53b3f153777d4c9043ec6", - "a44b658add73ee4765594e001a3b2111230dd96989a8352213baeb69f1ed3212", - "7d0bfc46cd326c80d4c7db6356aa76661b1920d844b2c5b5c2a16b4725e4346f", - "545050c8b38b3b5e97bd1c556e6ca9d839cbd0e22b0a33b32a566efc861ebfc1", - "e2023d60ff989cf36af090453c6f8bcf8eb67e4f1d1d2e1a5a2cb71353a0c6ad", - "10b9ebd9ab6c7f1159b16440ef86bdc34c124b0f17d1b40082c5a079cfbb6f5b", - "9b87cb8e09e1b7945d1feffe91b706e4bd891a7091b59ff9edcec8c751dacfd5", - "d154ec6e5517b2f838978e759ec19a1253ccf108de1af5a9f3dce8c16b362017", - "3bacc97d95acff2b638c77b70e9c623a01cc0bce62469cab51ee06bccdde1dc9", - "e16e8df1e1774bab0ab5502ee888664221065809d49ab3e8ff8a2c71eab55912", - "cb1693558be7bd6af19f0296a03dac4bef9e21a35d9527e25cb594d542d4be26", - "b58ac9a4aed3b14182188850e562183377790a1a8156e66eb9904673f00bcda9", - "007b9bb421f831dd8de93a0c1c38da793fca20d8ed6c469919c5f5a16dd96639", - "a609d77a1ab1b1f7d9be7d6918305218ec56d8f7e4542d1a01201ee53d686301", - "7fdefe377b219bd2886b574e5ffe09a0ec5a0060c24997e9181f513a2f1171f6", - "763fffe87c83b45dc64e02d5f85a579fda12fdc40014957ea1eb8bc11d21936a", - "7c8a63c8d6e0b952e56df947e801a912cc52274ad49d2c96f94f18716ba4f303", - "8374db2c5de84c08f4c45a7d81785673e814b90f5df413c4c6c99699d89cc32f", - "b26aa42aa36334b4676e927569377ee922db4ed4456e9194535e84a478c494e4", - "2d15f768eed259533abf819b78fab5cc2e90e4a1f061b808bdc4ff89d86e6852", - "0fc5fb1a83269688d05cc839f12b69d387efd6e774272994804c4409aa1f7f68", - "c7389937e43107bcd2c46c74cb854a8a769b0d1b61863a0b5b10ab7b22449ae2", - "a33d4d5a06c77af0b7ce5468d9d1ba00a7c8df9ec31ff5cd86bd8d24e537811e", - "add656162fc449cbeb364f99d71aaa57d882f8a0a6fe0316a2c858eed128d11e", - "bec03f3034bfc6a1462f84ea8389c4c977f12cc269a2886f7bf3da2b5703870c", - "3e0cb512d2aaf16be01eaf34cb3288b24fb09035f5bb0afd2e895863b142a463", - "a603aede1427e1e13f2e9110532f2c5c38207ca8ad2823c86349e7386f6bb8ba", - "dec0ade8211dc49e014a5cafc4206483d21656976569ff86686ac5e7c9841052", - "b9b3510bdd596f28b125fef2f74be7751d7a4157fddbdeb1722081a5dbc320ee", - "c3556e610ad7cec837b24cf0d4f8e16e8dd142edf03faf5fd73f42f43f4fb615", - "374c64fb89900d734a9d6ed2a91337986806d1a888a84526af7063f308142c9a", - "b545aa81c0ef21ab67dac08fc0d31153c44cfd3fb68d83a416eeaff71d933bbc", - "c596b9e25d731cd20a66dfbbb2712a347d238364db4adb7df186bc49b04a3345", - "5428b27ddb2e8670b56171653b9b390c1ac72d0939ae6028b5849cf240032875", - "345115c3543c6457601cafeba902c65150a14a8a204b4afa64e51c7092f316a8", - "04eb2319630263b508016af25b5ee0b0be56922b6e06ad892502a3117101846f", - "f3b7d92d707206ab7509b4c5a5416a577d0e611808d98c200168dff92852edd1", - "2820bcba7d2ed3b34434f7e710d2b3418254f2ffdf5f46fdc80d7d9b11e21b12", - "fa0f6e3b38d643ac68231d35f9c9579b19da35f67421c21016dce360c2d5ae41", - "537e92d5c39c189ad4323e2e5b73c4c0d687f31b51ec771c0592ff66f915be5c", - "d9ba5f8fe96484536f991bf0de875529d16d02af9a17744b7769d4bc0ca72e35", - "46a03e7b58361b8935c60248e23287ea0e3e8efb186ecc862180a0ef14bfc3e5", - "10f4e13da3eca4a730d10c9752896b9994376cb5b3195b4ae7ead8fdc4cb10c3", - "14558887ef28d381a4f1dcb58ba078d1d190091e909dba52972b5bd72e3c9d05", - "1899ce274602aea7d52011bd08535b9e0b331959fe99252f9d40ac8c32bc9a9b", - "1186fcf0333b1d83246446f7ff44c4712042e35227bfbe8240c2289bd9fe6c09", - "2dd6043a15fe8cf6817c53260df264f70701df2a513f4494588f430cf3291db9", - "d1be8ce3a4721417b29359f24c81d3f5552195801694ad572a0cbb41745f3b27", - "161efa2b76db54a8d1734ab44ea35a362df3e870e1eced318a5855acb4fdb190", - "f70d62d56522e1ddd565444b35d68b8920255a4ee91a17bbbd22f2f72e3bc9bf", - "bc525b6a391e07a03d3a8c3d03bab54545f8411707c1aa60c15ed9e44f515e96", - "dd921b21661814333e57a76ffa5ac12b6a5ad6067de7bbbe103c2f2b09e9a210", - "4075cb9ed862ea2f7223fbf3b2390375fbfddaec099f526cae149f9738f645ba", - "8b0ea9838d9914db6c5635af71c4e3756fd85649f269e7ed92db79707870642c", - "0d6a889a25610c5569735aacd85f04ce5eaef85a29a3ac0ca18be4316d0e8787", - "16745ae757607e425d77bc810f3126f96acdaabe218335db930ea6cd2d5fdf68", - "0094ff5d8d2b2dd994714550c384cec54539bb8eb3eee993e2c9a592e6e0e77b", - "246ac133795b28b88bc2975fdc92a81b8aceaeba65a53dd85b6901770f9155b9", - "6d0a851c4315b36dc095db04c0e9e2c11b94eb24aefb93d39601153475338d9b", - "680b9e967e07aed61dc3c2225bf5f25b5f41602e2222c6dca93fec404ccedc60", - "02c2c891fb0ae3d2f59d0cb6774e11bbc47ec6bed12be6c51956f1e4c427ecae", - "78d4438c2fad1997450b148b9e3eb04dcd9bd812c82dd04917ffdb28c11f9e8d", - "7abb4f38fd011b11232a8b94d889aef4529cd58c919e576920279393474802fd", - "e608bcc74088c7e91bddb478b0ff42989a4d8a551f220ba66a5cdceb68ac3d24", - "91b0d593a4e20b9b8ceef3232fa8bb1a8d40a1573db68cc4608dca1619d43610", - "570820abed4b291e609d85d4a2a582f23b36359583dead5ccba11c5b3bb182ea", - "832d826343522737ee2ca652a7b99fa7decfbfa8e199ad166ff85dc422195090", - "664eb2060b5ad584ed0917f7a003a1b9b42d0429bff5cacd1c40dcb4f55522c9", - "0038041d4ac86a5b24dd754bd42a4548d74d1982acd529c7123c0fc463bde6ad", - "65319eb34ade3ec4caa42984f998c4ec5c4f6b517c7ba2628a7015dc76b07db6", - "b3281404a68892e24860ceb52e313f47122583b9a14944b4873e12e22317baa8", - "152fc34c93c634d69f0a625778c131a90bbfcf5bf9a3bea66e83e366455c9398", - "c682a24b6ffd94c2d26a13704834ef542e9b506c97ec3019eeaf94e564291217", - "1e9e64b28d6c0fe72eaeb3cf7fff4c9839cdd7441b3c447dca65bdde0cfe7f07", - "071092facbbd99f7d18f86940e6610b9ef3287e558ab88cedbbf912509ed548c", - "d5dd969cdc82aa8607746da16df3e3ecb5ff83f11f2852b4d68fbba5f5ad229a", - "6960cf19f2eebcc226ff6fa7b7cc21a52a79d76818741b62237f2af25acab808", - "06d3d14648bfc27483b9c87c72502bb2dfc381e079285bc169534f4a5221839a", - "5f0f30502282a55ad0ea5acb728d85b705dbdce305110c3cf88f3503b2787efd", - "2401e03123589718c32c9ad177019d8073727539776d2492b541b2a5caae4c70", - "668cea02a605110ec5de72e25e3251eb08c85b2a9641067eca0a859ea8cd3d41", - "3bfc368e13ddd504b087f5856dbb2f527d18f0a5ff8520264e84d91eb99362e2", - "18eb55176759a964cbf36c06822e7a7e87fed0f8a37902baa300f31da4beccf2", - "350637fe0cf0eae09a1abf86013380f8222367297531531b3b2e3dabfb6df52c", - "e1b9fe612b9d1ace016deb586632f4ac1c4c9c1fef528a96be9135b802613b76", - "d5aa54975fe3ce78455866d943571168dba66fc6230690d0eb0c594b31d22917", - "1495ed5f15ba554d61402ee5bd256103f33aa9cec3aca49a35796fb9a782ff46", - "9ba1c664396ec95b8a539b2726f024d9b96cf56b277366a3493261d00814dbc4", - "ef06976d4095e9662956bddb797e3c46c0116a18728915839f50833c8ea95cfc", - "7126a89871fb6ebcb321bf5a631d0e5d4edab26faa6bbecd32ad15d812c15a60", - "f575922d2801526af511961d3f551f3bc0272c76925badd9c133a49f5f224c49", - "9360cbfca844ada14347aa4d4302d5e2fa172736fc1a38f7fa168a61c8f22318", - "63972c5cd6798ad2223999c3c07c10e275523170e4b48432057334e7e14260f7", - "3a9e3b578f460f4d4037c3b091ba18a23defc24e92202a928a57c0942078027a", - "4d1fa8a0a5f5b6cd4155f15b9aa1b5db9d8235d30819b23867173a5dc48fb696", - "bd648b5e017fe9797bb424eacf5196ec874d7400a5042dc020eb74e3b9d79b54", - "931712938781dfbae84d9ea7637033528acb0c42e3fe111828214ccc25e17d8a", - "09e15df1d4e001987fb0002404934dbf5df69e30d80798d9a643a6fae99db37f", - "5bbe959528e94a14614eec4c80c059c8f73cfb97f566eb8ffca7197300d3e3fd", - "d822af91f2397ab3429eeab8950769d07e49a840f6dd19a5287afc25c1f9a6e8", - "8dbfc44a4364c02429099935f2242737a46165878cb6a8a6f479a310d86642ca", - "21973a9c140e808bd4886caa4cdcc9f0d38ff46bbe08128902eae33e705d135a", - "7fe516655f3bc89c304199ee60b6208c1490c503450a680c32596e9f2c8dac8d", - "41f83b6d62cd094ebf2949eacb120d79df8b1de3f6e6125550e32f245da16c43", - "e6004a0e3515e2f7eba3eb95b66681aa73fda262c319c922bf716d4c62a6feec", - "d7b2af7f18fc5cf27ddbdb2543e515192f49bd5fb49923ae5145e83cb35b6d09", - "01f39050626e7b33c295b0adc380e26dedec78cafbcbab6b8e416f3586aecd27", - "c8bed23af1cce730fdf9609cc566dc57d65c10938bed95726303b5aac37aa00d", - "f307a2ec6aecf60a518464e23f9e7f0edf767744e801ab742ceec9790e2d9b70", - "213f2c9a93939984afff6e865592f551f1cd81a82f2048b51a6cc44bed6ba6c4", - "96820ed0571056197dc51b9ca3ac5f015c963321649ffc46574a27e8d59cf119", - "e2300cb4219d8ccebba0e86047453268fd96db3df4b870a49610ae4dd843af21", - "c7a8939eefdd711bb896bbb72597e9cc11daa33fdd9a6592357049d43928db4d", - "3ef81e891b7b5015421571797ffc9206637661049995baf8265d5aa749172cc8", - "40508a4cc13c0959166dd6d3aeaa52c628f97a757d3f31d16066539605eb4571", - "47312d268f0044c368b6c20918ec15a24212ebed052b8e7b29b76d08bb5131b6", - "fc18a1e0888e91566ef21601dc4ba2f0ed2d10d24531c16ce92040e5eda70e09", - "a72a71bbaf93b29567389c7242feaad94f131b4d265f9f34ea5d3a440b0b56e7", - "c0e17330ed057bec60c2ae5f9689f868ae4ed941d85e9e516960a58b0fba2adb", - "b9e6fcb11987642340c867ab0c80db68ba572a3f03e9c67bc1977e2bef909338", - "778fb6955ee7ecd560f8a2dbe122924d191dbe313dba958339b0d3495dbbf407", - "bac02649c6ba5543fe6b40651ec56708454bef1e6d5732d1def5da38b7ee3def", - "c8374001c415cc6cddef15961ac292a4106bb563ebd430e7932494390babde19", - "f8c0c13809effc06ad71f830dd1394705202a3e3f0c34c0eac6fcdb93ba63c49", - "ff6243f979a269ead6fd6512cd3e7973d6e190ea1885a472f0a10fed71e47fa2", - "92b9977dd746f8db4a45c079fe09386190f384c470c592c047280d5d5450f302", - "6f1292172aae54ef3db88128df8d4dba45a2f6a4acabadedd67227b96e4dcd5e", - "0a37426a97e373bace3cabba080ac4b560ddec92923b5f001bdb2c77b7d3bc68", - "3af1ee8eb13b138060fcad9b0217cabfa819d1ac5fa0ba1859bf1e0589726d23", - "d442215e200bc5b44c85bf738fdf83425512564b6884c1c78bb1c09489029ba6", - "9a25a0bca3f6635fc8feb64bb92ecbda8e22b1ff1cea70be2a223afa97ad15c6", - "266a666516fcdc1ca905a70dc78e9a498b817fa2c11e7526f73e3674e9df4041", - "6b3029989c7af21e74e677120d43a28a71f54a2b81345d56e7bb45808b963396", - "ca2bab7d13b1859085fdd96e2d984a510e71c751efe020ba3b241b7c55d6737d", - "e24ec402ff152117c4e765e23359b3d602efd3730a0392448b8ca25ecb6dca88", - "028a5b56306d40cde052612b4c66f53c57c06687f1cc98e3629b4e6603bf7618", - "40fa5dd04c73016d86b247e25b1fde1fe69215f5eec26abb3deab1b34f4a81cb", - "73f3b5ee521079855e9279685cb211ccdfc3e62aa678eaaa930c825f1f2a36ea", - "ac5457a0327cef822a39ad966b3f170c20b684421901bccdbd115fe5de32a910", - "7b1f40f5decd7ff9f844c37dbe4f9082bbd597a18a8ab861a4873745b36e5daf", - "80f7fe163c8d5710e303f24b018be51cbd749b6c904840fca50bed74ab0c7092", - "8b0c3a61c72ba8482404c1a2f08798e42d6e607b164b05ae3de26d435ff07003", - "b5d1250a66f6289260dfe5ed238ffa3e77af303701c7012867a980dcd8394d9d", - "9a794204bd31206100c702de279efeae5c0385ef6e76a7f663c18faac9bb0a65", - "fb514292d03b8cdc9b9bbe19de0939c3b2003263339306e91325030cc332bf2e", - "3b0e7a186f00aff2955f43b2e2e7e857b788eed06315d7ec621b4fb381f1f68e", - "b45251ba0d8ec6ea28c65006bcdbcaace2572cd672469c3a222ef3744b07c808", - "9c14d78cc4f678c968a79f032b10721e368c4c778b69fda26fdd55d2fb6421c3", - "33135fbc09d6659580ff96cd8d07a01d675b3e81bbf835b440b1010ae8398483", - "4619901b6cdb93dbb9a07f3c40e97fa8da89b4f2794c7e5c59e3a4e4d81798ab", - "ed471051e39c11406e3d22546e7cb23bc7d0921d85b49cb4dc9d2ff6702e5644", - "21b146ba7beee42672a06fa209ce2557ae810410d29050210f45912baa8c44ef", - "d4a97c1903075136aab3b89f0dd976146469b20e5ca730f0a76ba23055fb267b", - "1959397392c9fe4682ffa002244468512d8ee561aee4ab2d32eea23ac0aa5c53", - "ac54e597f2ed56af33f38a2d91b550336013e9824f2e60581bf3951ff6688213", - "c011ef15d2019a2456f415aa47196f34096f66a641864f5f71c142a37bfce383", - "cd7b9531e02df1e05de1f9c7b27b1f1b65f421fa261d85272ee3954e670d0df5", - "7b30be07182f595dd0f6927d0f734f9ca542f08661109dd3dca61b3e198c1d5d", - "1108ca1e7e3567645937ef54f4dcb09d551731ba1ef260b2a54ca1ac4bca34a1", - "554ea54f1e10b001dd2d64e54e7e740d9febf9e27b5e56ec6f2c9f804c0a8704", - "eb7b7c5d8edd3028556c3baa968a5984782fca676598a3d38553f671d23fbc0c", - "34e4d99e1014f181362398f603a9a27db1eb9da4f96efeddff0731b6169e0d88", - "aeaa52f4ad7e5b092b15699bb19260e3426d707cf8ec92c189cc3465fb604ee8", - "2598592370e1948e5ba0b81f8c51f4490b1f0986d181d502570f8a4c55a22e38", - "4e6f487e2e5a77d199b939d3f1e2f11ffd89ac196369bb79dd9a23d33dbd9954", - "62fc7f7401ae9f2f12497cd25683009a9c353e15ef754a1d4e38dd7918189c5a", - "0c5c2f11ad120c64cd1a2526543d26961230a4b43572120c8a2d510c87ce100a", - "8b304f481b5e79c8addc694d4ba77b7f0bc03ffacb09485d9fb16efad7e8347e", - "8d06bba7ddb48958cb5870e48f7bd6732ff4ad0feb9bcf7c706d83f8d9129683", - "c6f334938ac394ad6575cf66ba8066733071fb624487919a98f739434f36f184", - "49e15a1421c3ff6524b2869c02caa4a84d788318074a5856cbce4e29cfaa2b54", - "c278a88573669ff3c9d6c8d0f4f0619d3fb53f0dc2cbd304c0201c54bcb634b1", - "427d7df9dc15b916e9ff9737aff9e9b79778c134f23965996d908783c29c617b", - "a423a4ae828516fad4b956008d3a85e2180846579ae82a1220f570091537a6ec", - "220c4a06770c870b37b8ba6b4c310c8418b251e73621cd97f03dcd928273beee", - "d618fc57f8d55e6f9650796d885fa424dd0e759de0884b2daa9a618222074966", - "f3de91cc9f1963cc685f9e3d485f8c8dce216d9097c7d8cf35da5a30f77bd995", - "55978b5471ac2812d7d6a78aa5fa775ba09fabaaf5410bb58190f190e25c7df2", - "2af1e843afbcc52439a0ba9d964fac433b0e7ccba65fc0a0550d91f02b570b00", - "a160a65b22e7025b5b768b5b22b4adcd098f76406dba00a359e0c6264058a52d", - "772afa5020da54eb4062785b289ae4bd81ffea05addd595f253592280bc0249c", - "53ef2a0c216a283d40726eba8525edd17e94ea4b6932a3a69800eaf6f92ba403", - "e2de0e076be1fd49a56713d0ebd1e7a44a4cf967125b2d05c6173fe6defba509", - "7f8747b96c2e2054f5f1bdc0e145ee6fb374b79b7b5b87b3e71b8eeb0a2bee8e", - "555d70b83d9b493d0088dd277b6b5499600cb0f0bd83bcaf2a68a0fc6bb828e8", - "62271334c6f78ce41519bf34b915e198d0fbdd2c54ea0bb5fe074e6d6dc67cf4", - "83bcd386e5b2153b3da1bb39aadc6408585b3313d6603baaac308f703328d640", - "982ac5cce68732340e9bc97dbaec9be5f583c5e705ab963c91714ba605a75e37", - "9240ab154194ae8acd594fa19de7ebadc880fb965aac20544c2d969fa14a6e96", - "24e3cc890c2d574f6cacf3e65c7a1ed58caf8ef5a11fcf48cd0e36bd847d1061", - "22974974dd145a1ca692940f7b90c5b025611cccad29e2b7a1833e1d52357467", - "b46923201502c1b7973253edd6f9f1fe7cbb1f260bb90eda6951d3dac67e5902", - "0349c7e6dffadb53f5af192d84b9751e101228af31a33f0b3d1cda2b5d8362b1", - "97644555b5b2612ac8ed64e4a5a3f44d9b32cb32bbe32e6ae62f53cc7b4b8f63", - "85a501e0f117162ca8027913769fe6ec6f70f3c9927f9591c6e3f1c434ee9f34", - "0c510d0ae7f8a581d5162a2eb12c350af65b2adbd5f654b662e0fb6aa7965953", - "d89cc6106503f20100e043a2b784db77ca99b2c0da689c8291dc4c66aaa170a8", - "4e9fbd7c3dacdaefed24f77572444cb6089913bde118802085fc7a820c8a3f6c", - "a8b79f922ab197f57ea928c35121052c3daa68e557f870cf8004db10c97b2b46", - "29bb870208d990475c25b8ce83473e2b5d2fa7f9b4e6664b4c1e78d9d843f7e1", - "b0ce754cc130d5aacf12d89f4298c2d191a228df57a47809c7b2e4c2c6d7634e", - "0d7ae5a286117559e3543ed063adcbdd6241e8a2445c23501a61477ec3745067", - "3e27adc10b0e08be981eb35737dd7e0f0c2c519275ea6b1f6286c3eb9b18307b", - "532964da34fea50136df70d1e866601dc3fc203d33808a14b63b6eb5ee379dec", - "000b2fb0a89123ee49340582f9fc4d9b553a53dc17849a6de5ed5aa422cd7bd3", - "e8983c9107ee4eb9fa792024439c17814c30cdc126855c3ff7b55d668a54fd2e", - "403deaebd2f9bec080d0a4c3e29272405bf95ac1f968036cba990bfb312205f7", - "e93b4d5e5a1e38d1e3be8a934cdc8c23022e03422003eef50c0d0efa3819991f", - "3bb29aca1678dc27e2d2c097de7db0142f05d3e7a1e959fb8d0e8aa20ab805a0", - "2c0f58e56d22a6622fafbd3e17660b1caf8db544a2fdea6d812c4bc3f4388f1b", - "75071d97d5b214a8b034f8c1ad7812692c6fad9e90d8eaf2123abf85a660a6e6", - "3d1d3ede2c8efad667b7ce132f04d1c647b8fcf320e1821458c800b18e54dc3d", - "46da7a8d23a022b866a18dcf03c6b46892b2bb8bd049ce7a947610c3a9488da6", - "cad19ede848218667899d650d114be65b09c88535ff9847b7b29da23887f5429", - "288e21badbf0db0be392578364099298e7b4f36ff99fb641c4688001d9141874", - "8a9a6d8f8d0ec9e483f6459760112d5500311a5d7edcc7cc58b648e4be139d73", - "5e1c23d7ae8db77b4e5560a5412e5a25acc6a162a6ea899739eab519b95cf9d1", - "5a0a56282fe0dd677fbfa7441d38f3becbb74326ec1684175c6a6476cca5057d", - "a3498a628eb00dda5fd6a30adb9cae60def91836c16d7238aa6cc9684fec15e7", - "1521ba928a00b269369fa1a8ca3c7480ab4c6f0ac5343bd5440b4f3560c6c36d", - "67c9d1c5f710bb80c398b1a78123ae5a6cafc97b8503f547a847612d314411b6", - "4d7bf98e4740517fe1c2c3d2c809f801d2fae3a55cb7f39ec86e1f69ce045021", - "76c2dd29cacb9c24965a0cd7b1051c3f2c7559a87354858a409c50ae355e6a25", - "ea9a66a59916cf126699c8293284be8d7285462133bb51c5c98c60a73abf5f7c", - "53575ffe28b63add4df558f08de3d294927e0d8685ed339d573f8b221dca53db", - "9b3f11ca2bbf6d24fe73c180ddb53428f928515c976226cd57fb85517f023807", - "96e0480257adbfae33ee96d9f4b72ef3ffb5e9ef7e6fedd493eabbdba1aa29ac", - "e982e08a50b52c10726545cb87829cabcb66ff669e19e66dc8549f233aee1034", - "4277a73c321f8ba3cd7ac3eedc258a944cbc0d4c61827e04cf212d322855dea9", - "cca02f7669b4e4260a150ea6771bf22774071165d9b3e16d357c7d804a9872a6", - "0553e11c808ba99e73bd4f8894bc85a6fcea3daa53f6d0e3b24a86dd344129cd", - "747116670a47e0903902f9cab52f15202cf44e0ec37c9f13b8b2c75b61058f8a", - "e2b6d4aff7ca6fbff201c40521af9baad00d8d525b5fdc5e288db392cf1ba95b", - "f93e5217fc83551fbef110a4741ccabc4908fe4a5b153b7b601e37984991cc1c", - "4f0793d9635904edaea3434c76d0b43e27f9a56a251f6352cdc857d6ce045c4c", - "e4feef31ba5080e8f7f422a627a2499a812dccc2f553955f548803a4680e7b59", - "76cbe802a50cadab3a9a5ffef448464aaf5a4b880403d40836dd155debad016f", - "2f95405338f10fd4fbc50b49954d7fed49981759744a199813a2f5d44d12eadb", - "4723b26910e5722a4d7662c5790355beb171a9ee995ea629f461bd510d61c638", - "be063981b24beb8d277ea980e0fb69f064338554d075d8ffeeb6cb7da86f4dba", - "76aea20c5b2ec8535e8bb2d1f9a64c55019e6a0d219df4bb5893727377301c5d", - "844ca220b2701a0ce8c50fdca5e35c6d61b53569429eef34d58f2a1e40a45f02", - "d51ed2b73860954041fa3320c8a768c65551413358e110e5d70c81fcdbf76e6d", - "593f3a813f24eb6b931e149ca7c4abf2822463cddf30784a2e28f78ef794da5e", - "bd2bc13768c3852e2bee9aa974f431684d1db923fba73760b103d09abe6db211", - "2b381a21333208595d1ae6761acc459959f9ba4d9c5124c453e022384f218da9", - "76005d9f49d7c8f5ca166e17be5147ba311a6705d011845116a53de7366074ba", - "e9970a7b85ce415c0bc8ee5eb030e29d4e980ccbcda8533267b1d9161f2b8b6d", - "4f57451037befe2c345883f1be6f03e995ba47b3fc72275b8233b8d8898dd747", - "6f1cda58a8fbbb5240baafeb687d095c4ef68e4ecc407ef08405e54627e57d85", - "8e32861f11237383b8bcdbb8e716fdf54ca75de1ca074640484a4d7e4182f6f7", - "a7e96753ef5fc3b025bb19b4439a253034c5417423a8e2cd3653289fcb403896", - "30c97fef60c4f3a7b522a2fbf216036682825097b8a34499a7da5688d07a91d0", - "b59b6187610251e358a0182bd489b52333a0452270651691f91119fd3a08a09e", - "1503f53027154c4e7678da3d72e72738e153eb7af9d14758fd9ddce18198bd7d", - "6fab36358bdc1abf2c65229863f089615905e84e1c90888a4c64e38fc6eb40a6", - "fab042af896e696d89e6e0b05cc9e1363917064a427c9f0cac164f50f27ddf68", - "e910354f20b5c52157d8500fe8be9306bfd92cb973f295ed4007d02f93ca6f6b", - "4c92bbea8a1007f8c695d1ce0c5bd96aacb07d996267c5f9c3d88c65e9955162", - "57a0ca3e37521a182532252630371c410673618fc8d0ed01b16b5ce755ab97ec", - "2f89b4fc7edaca5db0d93d0f45f9b1cf5a397ec6dc1c4d1aacf4437ffabe2d23", - "ed11b714486551ae1650d057035ba0e189955a64cc8b16aa6b10cabdb62248f0", - "c5329ebb32ff99bbe16687a7d51dd9f81566f9e54e414c7dd332b6215c692aec", - "5720bc1b8c621e7538e3e82a80e9939b37dd0c9e5e86e90b6044b6dbd02fbb63", - "cd5a8f85a38efec1378c5b3962821555fa0e81d6fba9b2e7dd7fb71f1ca8eb69", - "02302d879b7327b4874030650da48d49f24d2bdb93327be28b0b336217c7f21d", - "b6b1057a1dc7cb4e8c387c8613e066ae965b309635bc60d1355ff967d8351fb3", - "c934df072fcb214df993fff8db2516695d5bb2cf1133311a8be177ef0c2de759", - "b03be6bbee321ab1235256dfeb3489d01ef1d0c2d3d3d031fd91a67f71e81e73", - "a18912b26b9c0a69fe3ff0b5246aee7bf2b02aa3a6c58c93c19b8df76259886a", - "ee2831a85baad5141cfd9e2e6c996d980bb91522b1afb311eebff6f504cb1099", - "bbcc9b4e156734e4c7b1b84d61cdb2209de21bd05f4fb6c460aa3bd46240441d", - "cce11069838b7e19ea017bb052b506050d578a2bc317300be7b33e97b590e4a0", - "2f0ee4573ddf4a00b68f3f676d4b2da34c559341e85dc280eafbe28eaba284dd", - "821e36a5585eaf0921be97193b3a5431b05276fbafe34627129f2e0ba6a4bacb", - "20fc7781b32bb98b4adf575f4d48e1a420764ebb7770d64b739e2bb56fa91faf", - "78f1025bb3974027c03b87991730b3d92aef713aa885cdf57e2d7b78208c949c", - "16f78869267ae55bfd7a54751f85381726c3efb561b412d64e4d60b3a894db63", - "b7329c6709377fc41ccc881ceb4d7586f0cbb06364f03d5bd97165e0e12d5ce9", - "e6e5d5f1b858ce00a12bc30643b287d519112428961f937f18e89965fe50a111", - "53b5158a6139d188099be15889633110128a50758d8c552d6ecfb17a6db1d84e", - "cd89b2eefa94ec922cf7c2f6bf9f757f965ce105b494249c54f355b00740d58a", - "903f72850f8cb607270e5de9cdc2f4a775e41bab51e029c5f3b3119ac82dc8ba", - "b4f2f64b6b78199480e3b43e2c01e1c04ef3e7254474a48adaa1b3e22d4134a2", - "20759b2e9be0ec3d791f9accd25c0fd3f9e41b170020606aac8ca5bcd99e5b41", - "7ddf5f7f962ab412660d46c91070bb5ca2cbf3df362474c3e85c7cbe4d576187", - "a83b9f8d40eac605489ba444085d01d3cceec4c83ec09d3ed5cd3526c052bfc3", - "a474a321245556afb7c673d7fef26a862d70747fc17a96ccf2b6bf75fd7582a9", - "a51fa4af3c1a8a622ee27c2a70b0bc3132e3b7c69969f71a32ed0ec821539865", - "ecc67d40f7527ea2f83b426f0886b62fee652933baf6ba29fd4f8b88ea28b698", - "7a4bbc28bb7e445e931a963f913a2aac347b3e1f2e829095d69346e1003f6144", - "24d79914d331908c7217835d75907ed91a48850a6894fbd8649efde0870c81cf", - "ce5e135e23facac88c0b60c27da3757063ab51f10086b183eb539d7c8ac50749", - "5a9e93f3bc643f34e67012cf273e4493ee4625f370614c433583afcbe5eb4bb4", - "c6b645471e548e2991ddaa85f47aad9aa97470aed5bc2e8d80bdfd57a2d1ef21", - "a0c1221181541ad3ae4847a8d55d66e4155227bbbdd8763f033c8034b719737d", - "6d261a8817e743ac2f982d225259e5f1e5b725d1ba7ef3b81138ccc8f55b85b4", - "96651572d529540466c90dc0381469b18e57ce8094654e996e35023bc0446333", - "3470da4409970f9806c041603339f7f53a528750de0b6e7124f1f4ca92f40acc", - "1f9257691fff53ca2cdbd82b60fe7b0ad1a22e3fd910134d632981a78574f12f", - "44e43b45ef72db6411589abe1df41c6af00ec63012a8894a0bf3dfdec15e5b9b", - "e60174e5da824b95448374ade89c227a4452f9690dfad6ff28b3005674bd1189", - "d978a7feb5c90c1c5f0a7ab8f9d027c90aeaeb78ccee9af20888cd33d5b26d27", - "b5ed7ceec12379f3828fb7ce47d3ed28a1573f4a189299eb7bcf206b33b4189f", - "53c07b05ed92b5b115d95f8767e2a990ed57ac1a28db14ed818c91736b97e57f", - "3bdb69ac146cc8d25b0947d15b1d476075d4cfd63b30782645f69bad001f22ad", - "c3103fa4a3c0abbc3cc22f8ec4db8bbf7c00b43a5ceebb44e8ca3a3b41d97094", - "03fa80156a141ae94f916ddb17bb7150f68a02b216942f584e180c448d1b560b", - "bd3e6552c4f179335ec80a78bbec9a77263df1fd1bf8960fa096ce237d4c0894", - "f8e4790812de93824f231264815679b4d6036a1574a8e7c9adaf7dc430cfd6ae", - "f94d31cbdc19ca7256eef7f07edb78396bac36e94db9463c6314fd3ac7271d1e", - "188389a24e9dc10edc6c4aeffa07873f91d01131abb538d7569700dcb31de063", - "8de5bdba0d9f2d96040a74d2e3653e41fdd9fcc21c5fc1413e08d7f4c2b2de0e", - "3a69ee1dcd25fc4514d94418716edac09c9a32b1d8a8c5a799741410dd605c0d", - "b68c593de706c7f195fe8ca78aa6cb826578dc568f0b4a3b17faef055c5fac16", - "92886ccfdaf2bd7d16d8f779e4aa69fc192dddbee3317129ad871cc0bbe50baa", - "7b4280143353f8ac5fe6c4d1da123aa883c007ddd900a43a7f392080c683dc56", - "58a988c1901e101860453af47ea922a2dcd8dc9649ca7da763671d791f968e2f", - "d7bd13476f4c5046e045ed91f8aefeed4d2a3478e1426b0a9d6585e22efe076a", - "3108ceeceb623bc347b83375e6b6131feac907470e50a6d057fb3cc2a1881411", - "58dc24d9903bdb5fc4b10f5debfa24ef069a1bf9810d0c44890f2ad8034a56cf", - "f4b812c5c8d20264ded2e3122e655f4976650369fd1a371652397573594986a0", - "3cb1f0b3ba8cb1223ff6ffa6a00d2e268073bf2074cd065e6324094e9c19e394", - "5ba3b8856763753b0bb973a4ce20ad96e254a5a160007567290a20a5f62271eb", - "a63a7c5f4879757089b43e8924d28df85495d7d44fb48981a205eaeb32f165b1", - "306fa5af479fe7a02a688afdb07d8577e4fad775e3f813bbf060b80f80ce15b7", - "c69c3199ec85d3c25b147f8de22f3491428a1ded01ac63585f96bd9f5749afe9", - "354e330b8132a558f38d08e144556738a9ab298cc1059f771418f5bf89717046", - "c15f4c4b0ceae2496ad7cb1fdb119b82c7588deabd0a196952d9e66c75b5027c", - "ce5ef1c6975f747c31f6f27bac8eeceec5ce7eef82bd2b71817f697f435da888", - "1bf47ec5539bc053b8e46fba4a7422fd4d1231f40c8c8363893227b4fe3c9401", - "39e4e58e49b5e57503c4607752c958df83f76d4114e2067e05db38407ecb2bac", - "f1b5a7e8f251171eb2592dc9d10cbdaeaad6799d240f3de9c1c68f1a68d94121", - "3ce10f8ecb7efcab4c28ba9687c68d9e548579d2cc816e16047fb58551f81030", - "69bb9f9d4342a117f77ee040cecd09c19d67c80afc952cc072212a6c1b08e290", - "1e1fc58d00b0e5e24a65a073f5c77e78403b9be0400e6863b2567c4e1c9ca09b", - "7029d341c9d2e2178e16daad6a0ecd98e55cddb55b06b02862c4fa208828e3fe", - "be62e7b042ec833f2325c9e206756f84351a10a16f1fdebbad2798da5c8f13cc", - "0cd475cadd2dc79b501d687f60f1a031ad230fe9be4023bad1af728ed5776d15", - "09c5d167b48e05b68f9c8ff9c911d7ffdfc113019547919673196385eb2587f1", - "94a9f4eb22a263e64af5daf6a4a45ad5bec7a2ef8a3c9a06d725af0404f22b9c", - "905330cad65ed812facc8291cfa53c4a23347e0097b6717c71db944c79c9c267", - "f0e97bb1cca3eed8b18bad41d1b42c033670fed2cced40447a0c547d88b7c1fe", - "a5678907497553d4f86af362df5b8925718e5552ca108d7c996c6713571c073b", - "d83a60641416f48b436435ea105cf1a684f2c2097ab979515a9ae405b4141715", - "7b90ed00071b3bb76f665099ed6db9c52069c9c7d42d0897177c62946ff80694", - "84e3c87e9bdbfed68695253f5c9a84c8c78abe1562e6a9a5a2766ca5e621ed2b", - "15ee8e4028bfc4780de98dc4b923acd35e2c0f4e6fbb4d5705aa3b1a421f609b", - "c8cf38b5b317bb6d754cca3fa51c68d23f2cf4530f1e272da8fb8be1da2905fe", - "0b37fca6d93256d7402cbf22029793e065b30367204358b7e7db0961c7a89ed7", - "0a5c402fb040b9998628b83c9d1d2131d4b75e57a61c662932d5db99f8603d2d", - "1646c171a6118db643ff6978dfc4303fa5fa00b4f0caa5cacf547dba324406e9", - "a073953285b3da368319dfab71a09d40a8fc385b8db6666a383d32aaa2c875ed", - "f30b1f02dc080451b495f9736931cc04edf3a17ce70f68cf8aea37ef880514de", - "a692e62946b70ba76ebd8456ed36e7b3d0c3ded98c8a88377835f49b4fb602a6", - "4613ca537b103687d2249df922dc48f62ef940fdee13de0b36222aa0ef7ba4d6", - "73dfaafc4f23c7e64188f57d0eb6a3f352815c091ea1d916df04b24f02046b1d", - "fbe836e2da6acef941c36136364bbe9e28f170485cea46f90468dd4e4eadeeee", - "1b93f0d98c4bf666a00e03af74ddafc7b39cdac0c7c379a5544224f5a55ffbbb", - "45fd95e7d39872b9a7abc9ed07ca2adfdafa06a3ccd2d12d15dc65855f58173d", - "d3b3833f621381f85f59980931439ea74fe45789b68862268f36dc1abf00f801", - "00aa8b27a9579c840f653bad9c94004853df61a69d79d30f50a99c64cef4cc7c", - "62f8593d071d75bc765a7f84d6bb1b98a311739439b48c05bd5c66fb73e02283", - "9f69f824d2e06a1e5c0eacdd8d0adc002ff054e36bd4d4a960e5d39dd9522978", - "f1fc33818ab1ed9c2a1d94a7f80d4329e5be17118bbd8c9e5bd30bfeda628dd8", - "c2d808bcd2d89bb14c2961eaf31033bfa72dee79a31c9fcde7b8bf305ab1dc97", - "dc757c1e2f7f2afc8ad7a7c8a1f910602ec33273e4ed84b6c76010dca2e21269", - "fdc14c8fec7fe3efc4767dfc3e7bb79e74d4119a809bf70dee75a7b9504f09d6", - "65c27d0568e7ce6fbf58b793ba44ca3ef463ba44322a6003e791c93c8dbc3a1f", - "743e6d489cce71661f6e2a430b12bb055997d4efaf648b8fe58855e639bc0fb6", - "daaea4e395a54c2f21717f6565f6a78646c49e463f42f1f74f65b51b1bede201", - "18cf6772a3b950c7aa9c0f375c0519326470011cb93eb336e17790b136d07352", - "fbe5a76e6b84902d82492127db1f3b5878a36c44905d9a735aca6d03986ad046", - "927bbaf980dd68b616c516cba6c92dba9ebf47967f27c2eede76f9de89dd508a", - "89f2174590bff6b3deada9c51c73bf99bb2e354768fa0f69759bba6e0f5cf656", - "a282d80daefd9eaba1da6339f8df26bc1c6906b4f7f574cf39ee30b972d3d703", - "494720fc38a969d9b07bd2f8667f2badb9991bb913fb14a49d3f817b197b7940", - "b94dbad7c11db0b72fa10a2b0036c9cdcdf6492efbcb85484f36e528e167c202", - "8cbc62bf1886cf455b8808b93d3f825125235b3af649440950a0058dd2c95c85", - "1aa59a2c4d2927e5463ed59b59205fc9fa120d812c227ff5309e4bcff5661371", - "e4e98242f0e2c6f9ecc42a922a65a504a91f565679ad99f2c30b64bda8cbb398", - "56dff66e23413a49336d9c841199391c19a00e1ff16bf7067c5a3bc8870a209f", - "06923f924ac5f9572e3a8a1747e819041fb75bd31c4cfe3139b5afbb0294a73d", - "f7d11238f5d8ba239a6a62925102a70256b325b32e5d6efdbae0fde6a3f63dbf", - "073aad92ea0d20dcdd11e1bfc1b9d3e93bbba67e647634923788b280420c048e", - "da394f18632624c3a07aa280397e668e3a5b0e1cccb6c50aaed68c63444fa16b", - "c288f14640271acfd286cc81537751f1275e06c21b84df6e76ea67f3d5201547", - "14dac911567ec568c82a5e806755eec543a8c251d338110560c235dd22dd775a", - "a2384315207a2bd42b14053114a83c45b46d01c649cb42dd301f0c99db1fb1a8", - "d3bf6cda3a086cc85d5ff728c615d3264f694a5acbc0d8825de8b24c64aea25c", - "38344df055628c73f0c34752fbf4de470dd851e3032732214e9dd1fab76bf505", - "9f6e0e1b93eb4f6ee4e9cdb8133719ff49cc2fd7b181496a86a8b3f7442dc115", - "427efaa062dfadadf6e99f4bbe6e330188469af2477b780ea5ae2606f00a8ce2", - "12a65276de4d7c315f3fb280b8775e20e6a7339f9b60dabbaee37722a8737576", - "1951d271bc47cd1381cbc84e504bee82da8a1caca722989c7fb6db54a636d095", - "640ea7c9430fab20fa4c1f2ed9e4fdc8f732cb883bee90b4c4e37066a133614c", - "673db70b5d28ed925be31592660c468ce4fc7aa9011f424f01e938a2aa7032a6", - "135734eb2a21423e877e49309b51d6736dec1eee6f7f97f5850a5616ea776aed", - "bfd699aa0cfa4ab01d133bfaa35a25e0b3055bdd35feb8184107efc563f9cd3d", - "105dfd65f4e0481916375e1962531a2ad30a8ab6bf1f9ab234d4d677ec95fdf2", - "2f9390e78b519e3445d43da857e4d18c3fc99e420e1a1b638b2c78c9379338dc", - "cc3c16cfde910fc5b0fabf58c7b3944cb09596dd5bee1a3e2f4616737985bd95", - "4033832d1e3ae880dae770eadbbc0505bd24d0880ba46b9863674dfc7799a91f", - "be34fee66260c47df818ffba4f49988487b012f9de579f4120c55efd5bfb02ed", - "8ceac67634cf53d3044531ace3de8897c0f8ab931412acee3713b02435a46894", - "efa1e794c0367c2180a00c0aa959c74f71552d3461333fb83b19c71f20f3e3c1", - "d741922c1ce8717a6250b9cc3977ce29991e85b302cd06d2ca2e971a0978a3b0", - "37f8822e4932d94f53da07ea2ad2b9b288bef760b235e88a931727419705c935", - "4648d53ca3f9bc2aa1eee437b1f1626ee3b0535e5ebc945676666a02abcb6eb2", - "ad7373ec197616b3d7d0da683857a24b0ac0136f535b627c8ed2078215d74e68", - "5465bd7cbba3a841317a5a29f532705eb856e796363f12681baebc0d137fcdf3", - "63557ea2bcd43d9b7b9f0438e2c78fc02c8ef75b168235e0b5e4eaebdbcd966e", - "5655a19fed18784b71de1c5927f8470591f38ca581f30e510db3f8575331a18d", - "053a0d8430b23f57391446dd30068768f742a05705a6792d13390f1e0b71e655", - "5412148ae152f94b723add6ad2cef0da84652aecc2f7ec9a8186cb1314a88d03", - "4492609adb84d0a10f413ac30e75d309b250cf9bf5856c50fb1a5814ebd7954e", - "1af36e3760df9462bd63590cd49274e0469847f1b2dfa08c8d5be6d6da489c81", - "34520f4a3af6563026f0f436ac823e7ef8650d072e7e1e11ccbfb8446c8b9133", - "dc763540046e26d46e75fec8775e432a2bae1e707c51049abaf3adcb21eeddb7", - "4f998b13fbcdfe46e9d4e42488f244b00831883a9be5d3bea8d604cdedc8565f", - "f1c67e9f298993c6ef15893b91f649524c12792d0034556ec3eb260ef481a504", - "e79be4d14fefd18b4c206332759d5c4407717179b400c0aba8e4fd977d0999d0", - "7b09a44909249db309825f6ea3a5f722d63b733f4ec9c166b09281da736ec937", - "a2b16e7948026ba48690003ea8ee3d63db70b1ae48c05ee60bf6ec1beafa55aa", - "eec482346af96bf5379245faefb993760db0bbde87b29dcb24889cd3faf18b77", - "6a0d9021ef58206cc29848a59ae63ac5182f8c3b4e09d3d8e4abdd478b4a9a8b", - "78929723eab8816d964f8b397b46f5cb3cdb9a717b8a83e075628f6c9244128d", - "adc25c945805a7beea2d686de310f2a27294703e90382eb533ac94d7830903f1", - "b6a1ddd956419b72656d2b7485450cfbf31536e8e90b98e54a944221de7360c5", - "6af27be401358d8df1be519587893e542bf5c2428898c5cac98a240f7e6f78f9", - "640dfafa0122a91508c9d71c83d755592916ae1068c17df3fe702785e8df89a7", - "1c2792d0d8cdd6cad20cda782e6ea777a3c40925481d9f9e8f77c7ef36668349", - "a1d7f960aa566fd0afe0600ec71d76454e65f7ec119b9fe9b39b9d9e0a5e66ca", - "aabc56569a98eca1416a2c659e7122e4a8623447c29f9a67be5dc43cba4f59b8", - "23e42fecd7dd2a5787aef925f927a5134f930b00ae383a2962462447865ef626", - "3d9e5cccf818b18f1f1e6e9c46af440abe4190bfc1795aaeba6b115ce0dca9db", - "cb6e38c6e2617a635361323efa2e92e8076dc394b35ea7db3fbbf7be4e236089", - "65d1166ddb7b8e6c39f334f474292d261e912b015ab42fe08dc7f809f8de2c31", - "f11f818589e21e6d38ef5e794f9bb132cfebd26b7f5c0af779938e51fd3115d9", - "1f553f9cbc78460e730a08cdcdb8a7467b519556b13895658b04c2706e900795", - "8655f1272c3db18acd55419e5549dbdf3b353dda7c178395f55ae239dc771c54", - "943cd1ac21d1a3715e9daba42117b955f5e400b2387bcd7a0c2286e4ac53f218", - "a1b28d61ce87e6ca73c5a12a62e32c6f0a641448883b0f69cccbe1e148c2c739", - "38acaea71149ec9c5f0ccf808b6a1f9ad99a07363b7b2e13dee2a913d4fb6e0d", - "01aa9bdeed06e54310b788ad695dfe4849e98b80df20e06af25bd10e6f87fc97", - "bc6a6c3082258c6bf4da7fca6d06f5d8e82a5eb5d7d0a19a036fd5529c98c65c", - "30362dca2c784ab1adaa8e515b9bab04bab4da75f429ede0b852292ae63dfc5e", - "35145f3c1860af3b654858fe4644cabb001d39b138424afb8f78f48dfbc306d9", - "017fbb06e3820be51b38c338a3dcd4c67b62b1bce9985baf9a7dacffc047ed96", - "4654ea3d3a9fbbccd70d8e3b27c450a1745b61040a4f224dbe4dc068c7f631ad", - "c0c025f172a5480cdd534653be968558a9159b7e42597ed4cef45b328797129e", - "7b75343145b337b4cd6d7af0ceffddb58587d3df9f8e89f530267f9927cf8836", - "bb3b187a25843e48275c552609cdfdd664e15e91a6764a637f4e7734517d93b9", - "956a5170c0dd5984d6aafa27f8bd6f5c890d477ef9b3498a4d4df5d7e8769832", - "cf53fa67ce7382dc56e95ca883644e4b351acbb8437b3338216a83795f5077bd", - "817ff5750fa9e8788e3e37d01d062df7ccbeee2a7f54168c42c355538fa6ff39", - "d9d6e72bb5e10f3a11a34be66df7b8edd7099e872b1e0680599c36f23fc8dfc2", - "564e4fb20e8a9b60b6a4d350ed1c339f0d52ee6690ade47d7b506e6eb1eb2d31", - "62a40150e3657dde236b2927303b47ca2898bfacf7f52dea9c6e9d50dd6d4983", - "70d3913c4aa203da128a231ce3e2b190b89cb1a8b69601e4212f87726258b0e2", - "19329cd354c206d04fdc69d390d288bdf08e5e586b9dd8708cb836ecdec893c7", - "8a35126a2776f313af88aa65b67d46dae1e3112964e05e6da9aa98547a28f53a", - "583d1aaa555d62c9b19a131d374869eadbf3e9bc373f05b66607546b0312fde0", - "94f1887f0f6fb34f3e52315480525911e06d2f37596a1338325f8ff47f54d5f9", - "04755662b51828b941e0f116448421c379c35b1906d0d800888df1f46af0945b", - "eca39d75a912d06c228c516de12ba2fa6685f74f00c511436ab9b9347158db26", - "c68a680bf192c2224da77920d1339f69249cff119e508c5915eba0420886da42", - "05b8e1e343c1a027e3fd8104c175aa06b58b8375aa7aa53f32262a2fc92c6942", - "86e87a74d956e51c3f44f09c27305d568bdb1faa36f11b9a4942eeeadaaec761", - "05b05fb6e666e9f3ab1343e073c0bbaaf7e4e59fb1b1408036997cef41333e6f", - "7ae0420b01268ad8da1dce968282926c79fa63053c0747b3e9bf1678744ea3c7", - "4b4803703aa0474f73ab1e9bf20e72748bb8f993e8f19422176f773b957c45e3", - "82ea90ee4ab8a7b67decd2b3bedd4b947b53da937f89d20942510d2411f8db58", - "1c1e6fc12e83d3bbe1726394f2c5768247d34edf7e123b5c4c72735de7fb9d6a", - "3abbdd6f46bab055eb5f4e0cce0086e537040eae58dcebd19acaf46569b4ba7f", - "43a5d603465ae8aa84b1ab9479edf075fa60b030084046d7b13ba7ba2e5cc900", - "eb09c0320d920ead2e7ab3777e446c52dd683ad221be46147154770e252f743a", - "f87c117fede6a6e24073e4824bc9ab2ba59026ef13f2e6cafc6c8c46c096601e", - "3b998db64c990afe910e8ce49dc0c437c3f5c7ce3135ea24e742a2e0d06ed7b6", - "98240c30cc4d7a4210739d7f32f4c92c6ebd72e598f608921cfedaf7e992a07a", - "8376088abc4a70100ce6426d52ec8b067a7491d7bdeb172396d9d198e2a96a07", - "4dea94ce01521fc889327a9362b4d433c0d6582ee9ba2ccbb2a239dbcd1a9d53", - "d66f0fe2a51e33e1dc431351d5c1d604c81a5f6670697a426cf52fc432b2ffff", - "3b9653344c6eb871ad773683acaff42536edf160989db76272e3d83ed38e74e2", - "e9479661a5a42c6e452cd6796c19d73ce6e968872d146efea86c9c22f7436850", - "44533c7ed805c78b8559afeca69dcc1e1dcc018c35adeeee6db915e4f2db9974", - "4484486b49866efe9e7960d2cdee563ed0f9adad542df11a50a2dcaa963f86ce", - "d449ee80831c54eb15cd9f0f270c4d3f1b7209247e356b422c172a5f45cb5a9f", - "8114c32e9d8629bb81f0a7d887e82989d706a772632d14fb7a75c17b9305fe48", - "5ac5afe554e3188e523bf9e09c2c89b3b5480993b62e6b4c1cbd552b22c7d62c", - "408ae13a6fb23bde6c48a3faece3d5feb9e0c97f90ef4d60a93a27a3c2bab93c", - "736f88f6f6f6be7a3545cf3caf69c446b252bf99da49ec6aa70dcc18294341af", - "4ba4aff7b5af625c3cc2813c24b28b4e9c7344c6f8be5148874b7ac47e8ea75c", - "e45372f95103b308046aa62ca1d77e8ee93b963748ad199d0be4811bd8f2e633", - "c1c1eb3b4cc9f08ab9ff9c7a2cf53199f3c175b5e12b548b003ae8c095aae3e0", - "0ebfbd733f76ced47dc57477ff36411ea7722bcd6ac46f09ee7929c4a2aab4fb", - "126eb2e5f77b6e65ee538a157ef29cc6af97b53e5f0fcde36796312f4b3287de", - "d4a5184f5222b605b525a339ed194f9ae384535c8bf97356186209c83402cbdb", - "5946db21ee8d9be76169f9655a75d674f577fec50aa5e501db89420185e4cc0c", - "9ab14f02ae08a50652452a8f2ff573bf658f580ec660c3ca203a8895c5f5e943", - "28b42b7cca7654020af969ce9a1fcaba57f6ea5c0303053e16e587eb97ffcf25", - "cb8d754d3f5101845c3c20b728b01099c640867b3d4151a889c94e654c80391c", - "0cabb080a9604be713dc221e91b06f0f42cc49dde0e484792bfd28672361279c", - "c02fc7240bd73521894b324d23e6ad3f76d55dd709b3a19de2037743a7debb35", - "0c14774f65f0324155401121a5549bb82fc2e6af620018da1aa064cfccfc9263", - "d56a50cb93ed00ff5b6a078aae1278f89448dce074e78c52cf1436e11cac17dc", - "30dfaad65d2a3c5f72084ed77d75d5b58e462d85d1c7f748cee5ed06acd418e4", - "b85ef172fa07911f71c5a06bc005911defbec05c0b74e8c7a04b819a6fd1dcf8", - "9a9148bd7dc0e84e916a737e2d129b5962d338d724043f9b9464cc5ff278ee42", - "0f42019eaedadb08585dd6d49cad55590abcdd9d859bbb7f08f9fd157c8f2150", - "3cbaac96fbb38ce7d0f9650452e85b3ee90e519947bd2fc6137284c4c5d35a5d", - "4fad86edc3c7acbd15ee839c05994a98127307c9ec6d4a374b788d01b0713dcb", - "6bd637d708ab263f0db48375944c861244cc0a5ccf7b2a874688d644c3685018", - "3227fd78ba84a4c9ea8a1c9551def4e0f834b80b9dc9c2bb1284a00c121aad9b", - "49072c8cc5f02579115c32697103ed4c899a46eee7ae49c819e2c6d5df329637", - "ef757c61a1521445cfda66d14899ed371140d588fd40795a858df3963ddb8e07", - "e9d2d965be4a9aafef8c624a993be741aed74bef77aadd4c7de1c8310fa42897", - "3aa068ae085265d6dac5154cf4772899debbdf39fc1abb3e488976f93cfa3349", - "80b53d9834fb664b078935985a15fa6f342aa8e6e984ff8fed418b4f24792884", - "cb7387e84c9b63eb54dfa511b1b35d67ae560205b5888b13f8e3604de5318979", - "86f08895a6d1a979c5a11d401934bd5baa39cbcb562a1d4cf2ad4fb01927cba4", - "d098b0f76d7d1c9b2f70093e85bcf29a56f1d0ad65ea1942e4fa824164e977ae", - "690b3cf493b9cef8f2af76fcd05bc70e4aba55d5b08ebee5f93329b25b834041", - "5f464db8e9ebb7f10405f1358e5ce1a9b3437bb17acb238a41841dbb423ded74", - "63b3cbd622061abe9eb611652292c5b2830eb966bede0fe3dde66f470a187c38", - "05d9bad7003eaffed78a90f3653617589a312063a6dcebe42deb33bf2413077b", - "5f7b75c250677146d9c9b73e3f57da3339fc5017cb1ef68fb592ec30de1b6158", - "051dd62abe3b4b239106a0b7d1d5a2d35c765fdb7297671f0862dcecd1633156", - "40924d6a2764e28956dc64f19baebeb7014993c1e7bd393ae7047278a93c5658", - "bd3beb6e1c5656bce21cc69c05c67ce0e2eff62fae30357d9c7ac7dddd2aca1b", - "f03fea3a339890099236d468b440b51c53cfb16b030d3ff635498fc70668d6be", - "bc92c6cd4a1310430ff93bd02453456b6bf0e98f7a4e4a0c5188562c5769fc16", - "63823b321196a87875ccfb52a5d20cd65caa266f4199681242962fc601b9ddff", - "5da55aefb2171d1ef4215d1147fe503a3b74d100a4e89ae5fb766fe11be2c213", - "78277b7a3855f4dcac141559c7d6864ad50440e5ca50bc5e99c6b540e466a387", - "d5f9ee36ec7d69bb148439bad103a5e0fc26be2791abec9ab7bf6573785154e4", - "e304a430207e1784db6aaba0d1323283bd32bfa2ce8e21e1244628884738fd19", - "097c879dc4e446ec8c0aa3dff1c463e0b7cdb81045068773500bcd8f081c98f9", - "deb378df5f6e76affe1b0a1aa4899e0c344ec3d3c374208df4e73a8d66d7e1bd", - "9c3db1f36e6ed3c4928083cbd91ae223e08b0f6f2beeccdc913c2555838146b9", - "9e813bed75b9ca52cf3177dbe48a05a2609b1b4f89f3996fcfa661cabc8b2cbd", - "db550f95fcdb41f745ccf3ce7e68a4b4355ab55af0680be64f91f8c776fbc675", - "f945edbf3a6554378cf706430469e6e24a366b900a2172ad22be40f0024a95eb", - "791dbfc20e823e2b0ec1b155f795fdaa9ffc5911d4d6dcfad15f0ba566e2db18", - "5cfb297b361cf0d47babbce8c4443825cdaeeac78c3c898698d16dc635f79031", - "6c264fd4f8a0a85b4e753fd084302e0048f624e3e1e4e03a07941e2370195319", - "ef7a9f3f09ddc24c58da55d8da195352e0915f636fa2733f2c24786457d1492b", - "593c692dd957a765440d353c00cafbf0791f00e14cbbfd186e5045ff328887e4", - "aa8584bf96122a4d20c48fc88f7ec4e4d4f2015b4b0ef7ef18ff3ced78719b47", - "4bd01398566e4d35e691c764f8415162136006fbd56d834557526b835b7ed0f2", - "a27242f96ef2f5c3b231408dd31492b96766b4064f78f5e719dfe15cc9b4433b", - "f50b9e16798e0beaad3e809daafe62c898a643fbe898fbb5ec21a5903fd54a5d", - "fbbcc39301ba684abe605072e3d12cd11710490f3128253922f2620e5f680a66", - "e8fd57c1c76d15bab8a84502fdd02c106556e0c3878f8a86c7833f59464bc9b1", - "3980328c3599aaff321cadc9e429b11e88bade0681d08f1e928394efff336eea", - "d2e2e46d6b5c4233391ada85784be8ae44c08d267ce537b8d3bf647f51c6a1ce", - "b031cd9e43aad24405b38564a5adb60e80bceab871a3ba84cbb91e66feb08a11", - "ae52622ee7d4c2222837999458ae0f844748d494d465da24f0c617c74fd141fd", - "ea85119978ed875dd07216d55fc0b0222501eecf22de97a2dc4b499928bf95b0", - "8825a624b347355a1899c638dd2d2e01147bc5d148ea02812a84ad3a4b604f22", - "c3d6ee809cf552f3b904303d205afaf68ad15223e5b71adefca44c9bb9c84e07", - "362976a9ca4cc14e228e6dd54513c82636aaaf5a20ddfa5348581e9257d4fce4", - "710443d761e83cf9fc4911cb37f06cd178468de97b7d88c2ccbded2a86126728", - "ed30234edf478716ada406f3aef16d3d433ff9e26660c0b6411230cdb8fb631e", - "1cd8dfe973b5700fa029603a499f052b8a2b05e722f8597a23fe886db14f0a44", - "caf94f7a01ec4152bdd3ef0b86d49aace3d97cd11b7dbe8aa6d134f08eedc73f", - "06b5a0a3ae633b173deb72295d4cb96b2dafb216a0178ba873cb4f9abbc41eaf", - "96f2f34b445b8e0f3b21653b454d34d2f90eb1cd9758105cd32eac32fc18e74d", - "1fb2c678e3f40ab201f36758bc1fb1b7313744bf538b50019cad53af63ca544e", - "093bdaf027b487f9c25ae7109fa3b3b6ccb2448952381a471aad999daa998629", - "7374a5b5bb66e20c0962dabf2af584cd7317309c5d839184b0cc5f2e6c1bb525", - "154fa90c25abfee11df54d5e9cf403a22e856038c1593a6551a0c73b7b5dfe5e", - "b4c8b571c849748c8bd4fe267e45921bff6651ea8bf4bf244b3849057988317a", - "9fa34a6797b339991a3874d0a68056b96e1140d846563503c39cf76b8c5fe3d8", - "0ab1225dd08958cfb5022a2a6a0106ca3b7372dc25d6b6b5fb01df4bda9261da", - "eab15eb0d8259d10b1ce2efe8ac9b3d5123d639cffdb89eba4569e4c91ad3761", - "8f8122fc8d338ae4ec7784ad064a3f84746f8c57823a83d34ccaa7982c603c66", - "943c5e390f5725a70300d61ddf35c75ddc9c8765fdeca32e0a303688c86db56f", - "d2df817305d0324e2732401c8762c45623652706dff75aea2e91df8f41617d79", - "37f11ddb2dec73ae2d6a616b0dfa2288a160589722f01b2785cd333fa9aaa143", - "f92f139267d4c4d921842f119f69802d17759a79f9c2279e247c95ed6d4500dd", - "367c55db7546a786b081126224c4d4d54a7ea016c849e2a457dc68606e67fa2c", - "5f6f6014fa09267a15f252c8ebd8ad6c366314c4bb2049dd8016b223d6f0ca5d", - "b9d474c5e93b9f87b9d45c2d5bdc0cf4bce337368e12fa27fd5f74803ed34c30", - "fb851a53dce40b1d5f0b1885e28fa7964965215cb15d7754e17ecde398cecf5d", - "5e03cd20223e6490c1742754bdec8c376bc20996b3e83bfcb7433d6d67273f3f", - "e40b7865f12e255c22865e2e4e130de114627557c5b0968f3997d27a7d6860e7", - "efa5001d013a4a90d2df7d6188f0036d7355f107b46e9b3838a3a77f188a7f75", - "2eaa02543be0b9ed4bbdd0f4dcb57a198a5b87469ad59e75e3ed615ca04523ff", - "3641eda6d74011c10efa48d9a5bb0adbad55f15c943631151d80e960232cf058", - "5fe46d12c53d0fd1c385a35cb3b24347fff477323aff1d08bb974824ce6dc503", - "5d29f2bfab72d493ffa81c40863211a22b5d850d3a093ba3d2bdb1d0a1d13431", - "2faedc710c707af1a8f8f8d1464087d1cf482d4ef9fd83be866127e3f488e0f4", - "09396e982b26ba8b8d5e249a8591ee5dfa6b6c50c5f08ee34a84c770af8111b5", - "aecff7ebce68dd424ac01d7d6a508a8f1ad50435a60389cef110b8564522b265", - "7610decbf8511ae2912594a27140a88d954ee89cf6e58fc969c27bdd8d98b9e5", - "04c063b1f88719309dd88386eeddf978c26a98c48b19e087314ff1598732b199", - "3e9574eb1dfea3ef70fd23f3f11d682278b19eddba3e1619c5234e2592484371", - "852b3e18ef6155a0335b879d83491a1eb9d2a32c5d71369e2b9e814c11e860a3", - "386275a4e65ac426e1aea7af4c8dfee873b1e84dca5f3f7276123e39f675aa7e", - "2e1288c70a8d0413e605f37273727c19f81e34a32defb0422d88819e9e1050b6", - "418a01f9c15fd6fbacbb7af1fa589a68c02bad088854f7d3ab27d85b1a3f8b4d", - "a94f8369164ebc29aa2fc84e25581088ae09b116e0a0c5fe401da37dc1a37e07", - "922ce2248de8395c9ab53928ff9c1a83a03ebe4268cf1ce75ddcbdd4d3e6c33a", - "62ff6e3d9697c8a920dee12bda329b1e9233b23a608bd55562e7dffee5402567", - "e22f55799e3459e3cb98e03ca96f1c2d75b893818a69aa6fbb9ce79a410c8095", - "9ac8c9549b5d7d889c630fe58f642651b372c9eece232b80a1964431d3b95ba9", - "458de6da57930da5bfee2e16072d3013f8e5570cb97e3ced881d13724d7af98e", - "4e0eab8ea7397ee7919c1a1f5102c8036635b1323aecfee42ab4b8693426ff38", - "d0229caa39aece1860a4f63459053615e28b9bba170d18bb14ce9823b52a0525", - "d5ce7f8b479c4fa7b42489d1f682e4eb8a3b83e9d17bc63830bbc3ab33a9cf43", - "5796f5c07854cfe998eca01e7f199f6e1b99ae3d8cb1088d65814ec103d1fab5", - "116d8820dbdcfeeef8b4bfca394d6ed4b8af8615bbb5d76e70d6342cf31794e7", - "d93d7218c223f7a87950bbc2738f24fc7c6db46df61c18dbdb79cd2be8d98021", - "70116516502b43e548578f148413f716f1b3534a040e3d930ba444dbaa438f80", - "94fcc745cfaa8fc04725d6a9e213eca9eddec627a3dade078c5b03b699be7fbe", - "94f1f5542f61aa99817d328e524805b56bf647624efb52e6abb2b0b6c090ff3c", - "2f91a4868554aba32fada126c132bfc00d21ce5f462b116c7c5e07a0977f51b0", - "0dd7cd4586b2391075542b110a41b6a68028646b7e9157d39d86d828417ef501", - "e36e573cd0e5511554b0339fc661fc73cadfa4912f7666e6eb9663a30cb3d213", - "9fca0b2d67aaffcc80ddd7495ede5254b77d55eadf087bd159b6194103f7ba9a", - "dfdbf241f727895cc05e7828ec0839202c91d5bc1b2fd3bbcad299f83e1e54c5", - "ce6ca21e58352a3a5dd1a7436a16bb55c136f53a7b0ef22e630d66a4336e72a2", - "647bfeda5c68e3c1f79f82f3ade4f3fe06b3dd0a04350587ffed11062939c13e", - "98474016ce32eb16ba0c0d932f49dd8dde10cbb3639951d0148146152e47111e", - "28cdbb22a032330d6e649f9a5d87cc31514ad6b5488fc38efeb7e110152af13f", - "8879c9db8ceee09e837c14a76a53295aa569975a457096989f10a11dfef50a60", - "b07e2e84c4ad76cf8f62b5f761abff0c3e7917c434157fab8a319b8a9648c6d5", - "27604f8757ef15ce24f8f6716430348f1eebf80dec13cb0f801c95b1f8702778", - "da132739d95e478c18e2a308629af2452414ddf59faa7afaeb993af368988f1a", - "3b54a1fc67822fca2db5423b61f36addc47d64c3393f07c82cef592f8db48e1d", - "81b5d9c5cddbb2c9b950598008d932fd8b39adb27cb8f03758919b805684ce71", - "1ba05fdc8f89b9e715877f59c486449c68af29f1df1c253256a93ea42dfbd95b", - "3bcd8fd6f08e27ee2a4741328d2356b05f0d54a3460c4ef51ca649f9dd7f2b22", - "0d0d72e14903c7916ac476a9be77a33fd6ba42d38cdc4cc4a9981c288f4cab29", - "1b02dde9c1475241ccb7b1c2e7b7a012cdb347cb1abe60765724d7c7f72b0b81", - "7d223b29a90516715530fbb77f8c9cbee05d2a2d48e7292bebbed1ab8fe7e723", - "06b5730e74813559b60c5de4e9c1b4b22894a720f22e8dba6d06b3579864c8cd", - "f41c97036998201e02f61cc2ef09e6cb935a39ad4cf302e4d3aac84b62298bfa", - "f2897586e360669a4077f3576d834f2f3eca2ec392ab3dde41e0f63e5e9e7dfe", - "522e12836084687bf8c611b74952e520e4d30e2891aa6f62c3191556b870840c", - "38c91bac13a26cef1bda884f3dd8353dc32d12faf646b565b623c2a6408cdf8c", - "9793d2b571a7fb07d0f82d30f83eeef3440ea0f44affa730674b668af734f1ed", - "31884bfdf6b9bc20014d6e68284ef0f49e722657cd14d6de40bd05e519d20ce5", - "69336e5422456387098ac45a00c5c6a3d320a49a6cc5cf80105964c79ab2fd03", - "4f2a2317cbfc1f9349c52b6dcd6d55954c4aa338f0ef53b750d08f3b6c145573", - "b34608a10ec7687cb3afd8d52802fe085b37cf97a265798fe5e2be63234d0bfa", - "3e0273b45e534708d25b3d3859a17eed9bc6cd6d773422f2ec00de452487dea7", - "a6c16b828843548bf496f318b2dae9a32998b46e80a39dafdfe9e5d9cad9cc7f", - "fb40fa2be339588650e0121fd63b4d3ea112f656abc646b5d91fb4f35c9e60c8", - "c4337189f9585f1c2985345ba32e957742f3936e9ed228dad12b26a4b15f87dd", - "8954379e51e8000d907307d6ff8f830c52366018650211b3de45be8dc5df29d9", - "5c123237b1e08e2bdf0d419378e172d6e2ab6db2b787f85f561c675ea76c6be9", - "33f43f3a0fbde3eb2c990ad4e4b82b91a165867bd754599682fd4ebce6dcd6fc", - "8e6a70d100f81642da4360b7b53c844c17e636e664cc86e922f802ca4462436d", - "89ff3c176eaf6ffda1d9a0e2504f993fce58a8f2c56c217306204cdbc0d0ad5a", - "3f738bd2cd8ab1ecc82997056bb8c0ae9c755a21824b89d2babdbf41a1277adf", - "6838c1bcd625b6b1bfac3b564b22333b7721add05c4e9efa9f9135ac67f92166", - "e12efca22f74b8743759463108e262bff0776f8cd741690547d74bf919d47f75", - "d9eae3407a8394fe75ee58c718c60c27cb6e957ae723b38387c3fc00324fb909", - "9beaa2f7bc083054f437844a97cb5eeb7e2340d44b170bee3092508569c9bc9b", - "74d1e858ca0547283bea8057a35d1c3436c54ebc5c5b4c9221632b3960c7184b", - "f7ee17b4c97138befb92375c5ad564e9479c9decfc6a9d4e9bea0a5344cf2b5c", - "81e54ed42cc82fec1c985ec5a3768918ef3ac2491c9fd20380c02676db4ad3f7", - "3e8b0774eead376fa196553f5eea6b20653ad0162f74cea3e18187adbbec5772", - "46c454c38db14fc2a89e0cc97fca41d4cedb4a053e7706a4f579f45e3aa92643", - "41a67bde76f1108d57b0e8ca6563c800fac235a592656202f3c36bc00c47dd53", - "1794ae07729c2dfc98cec90818440fc3402c0f1ca06044d1f45e928c940b19bd", - "e2b2d092f4b98d7f51791f77081026393317e57bd4b9fed9fb8b32bcc880ffc5", - "e091cd1582ee572e096dddf3870009f0bc2f1b95eeec16068dff54495bccc84a", - "3cc67caf1a4f5757669ce605738019545ed1da8dffb3748362b3581d37b40be3", - "97d8b899438b6cc627ab4d8cc3ca444415efe93bfc91a54ed677326c00fd72b6", - "9c287473555788da4ef5e99fd6ddf9c83ad5be3fd21ea5e92d97135849a67735", - "a1ac22e1bece122c665bbeaec891fbd870a754587e71355553c5964498d7f854", - "4f4e3024fa05bbea96e33d3aaf94189c280ec19d2b2dac38eaf168eb60d7f63c", - "1dfb2bcf94243ac83446d2c5c797d7c2d0e4cb63034716a006bbb74af5fef0ea", - "9c025a424557817ac0279090ba522156f57de68e6107c1c7b708132f845044ec", - "044acaca358bfa7ef746cabcd3eca5cb7f912c4af1ed11b1600905084124588c", - "3c4fef419e7e82be7b86436ce0688e88fdacbfafb8fcb3196789eb395e94149a", - "a22ef03b4637194089d1ac0818e332fd0944df349ddc1eda32e0c0d1b07a129b", - "b7662bafac6b768facaef70300426bf55505a3844cf94810a133874dc2d9922b", - "597315f01f424de859d8143133c72fa58937506b829f6b1756c1d1146788b639", - "e082b3ad0d2e9424b869273ce7a0049d50861e88033b451dffaae0adfb7a3bb9", - "cc9da17d09116ff921dd8466e16f8e66bbf0a2b5a2629a3195d8b37d3b3b620e", - "d8c01a99d15291c1cbd0a7365ee60901b7498e2bef37e558c1486d8b10560fa2", - "419fb56fb9b4f53fb0a273e710087706f499f62b828c061c1c602a3495b23929", - "c7ba55cc5df89800505b64e1dc5bf6446257f41cce07d981c26ab6b4c81bbb18", - "33db6930d0958f07425ad24825dd9df96a601b19375448d8b4585a07d2fc7832", - "3877b2d76e2d574d16abdb8def5301648c80df0f04de23f855b64c84447c6309", - "f0cab7022264ae81670c42c0dbd6bd8e68a20981f7db5aced9c56509da4e2351", - "860b477ddb6efc3342807003d434f7ab6a3c54b5ba5e2c124e4124c850da84ce", - "9f43d95b31c63ec1c9a95825f37b560464423aae1a0397e6916864967770f748", - "c85dcaca69fa73289952dae8311b21ab8e96b1b19fb4a0cb9143888845c5bc4a", - "1d79ec694f3f4ca87e92d6db8bb195fe44f98382f98fd246fd59b2a79d528408", - "56bf3fc8a2bf06afa778d779bf0f639c379dae688b7e9829fb7d25c79b86ba77", - "a078587f4eadf6037fffa10aca1cc94f17f5871d8d724fa5f290b77fa2d2fdb5", - "60591ed48407cf98727bd39839eb2bac9c01e759bdfb0fe5c047f0291cbae9a1", - "07a62ce9d610e5054d38336dd7752e58eeed97bbab64ff928b1eeefa0b41602e", - "7ebc41d161a8ab8343f98e4b790bcc17ebf06d3c3cd88911bc763af5a8936c59", - "3b4ac220dd445b5736c50c36b450ac9f5738d8cd71804295b32adcaf9fcaefbd", - "8bb31ee3b789b1f388638b96edc6699d4f12dd7cd0609d694d4c0d20adbe1b43", - "b13f52bab4f6c4d253b3f8d88f7d456bf1dc318942a6a19ad9f76c7667f7dbb8", - "afca8abfc32fa9aafe1aa9ee5b2543d9ac0563e0a30cd533f25f19ec25d7ee9f", - "c9c7b7e2f0121d3ef2061e482cdc9672d05f5f2e72e16f781fa9b3faf7ac3ba9", - "d2ebf87199f287df04048fe3800e6697ed63ad97547ceb41b11cf4a582f9091c", - "8a24baa53b232cf229715b95e49350a0958e523c582fbb180cf5574aef531d6d", - "f2ebbbfae264bdbf9a28d0cb81e6545c199d2daf0446735f0b4ed3597c1b0ee5", - "924b4088edd88b43f58176f85d40e03a6438e7a71d1ed834f420d5d1748e6b0e", - "cc5280eadc1a6f355ec3d1fc4c540092c0b29bebf6f1e1abde161e0ec766df4e", - "438eba3d0e3b2547df5a57be26c08c11df2362fd2c817f952cebdb0cf06f767b", - "5f1c41f2fd8a777cd3c67c979f93689bf6018f0ae72d1aed3dac969bc0ff960e", - "fbf4785ddb30e652122c346ace51c13fc2e47a1b5e09031c25d05f5b650ed5d0", - "4b81212c1beb7748071d95e0b4eca08c4bd2013a0dae47325b193cf3cdbdc759", - "ad240f68a03ec5da3ca70e25413383e408a58cf322f5858817de477d790a68a5", - "97279b1a6ae635c083499d1859f90b8e41bef8fed3697ec11fb66581a304478c", - "5e33cc7ea15768415bc9782ca5b6c9af1e9e25e0a9a5512ce6b5c06b8f18cf82", - "e5d5921302b03a59c0c0defbb856f2fb1b659ecf17e2d3149641fbb062670019", - "145dcc42d91c31fccf0d98ae05d40a624bff35b808bf1c97c8239db987229d1f", - "2d9441a8a0a117a384dfd6b662bf6e0500eb729ed87257e183fc8a40601fec94", - "f3ec0fa48ba26eebdb26a6ce75abd812aaefc4d835b6ce7669fc11f10b43b5ce", - "764e1471336c5221bc8e340b4126235d59245744ccfde3d02ed341ea3bb78de7", - "ec94cd5c12ac46cb70a9729659f246d4a82f271e54269530a5f3a7e252a6e460", - "01366461dbff5e4ad41d991887bf8fe6599a6d4b863f20681eaba2f1056517a9", - "1864c8ad473e70f17c498af9d20867b3a11fee9a22c31423d52ec1b4ac818b97", - "18774aad901164d0a64cef896f2ff3bef45cbf20321d20f5094a67127773de18", - "4e9ef1d405edf3a00e148faffc95f9ba9e332f624e63e41364361c14e449de3e", - "ec534bda009edcc338431794dccc44f464c68544e7ae2f2e87873db7f6c1d6e2", - "31cce86fa05b5f7d52d7ef9be31387e2c0cba006c91dd0b443ad5729ab7e41b9", - "0b8347463a685fc9a4d97b7fd6e2f72b20e9ac35daedbeddc07080f2116426fb", - "fb65dffae71088c488f17a41d72e3e2c123d3fa77c3502906cbddcad1b927f4e", - "094136898171eeeede07f2777f9edba3fe8625c021553580c748c64174c58f48", - "41f454212734ed0aef383ff0a4d42209c394d94178e0505d5949db0d4f0b7da9", - "809757d43a6093dbf7e99ace678150692f5c62c04dc24eb39753545fac41c06d", - "d92911fdbf574dbac32f4bee3298a74408ad3f7b94977a3155a3e7f75ab3c237", - "35dd5bde46c20e274542f3c4444c4599b5c4ee1f46f94156db6a3a5940244ca4", - "4aaf57490612f0df27bc1fa8415958794e4ec871e3a027a7ff1ca6f279912959", - "f814eecfbc24e496cad3fb6786ab848ff8b64825d5abe472c2ce4b26653a4ae9", - "6d4d2c151c91efd5964b16888406a31ef0bdcffdb54676be81a07c02a60e25bf", - "4e17e4876181e24daf24db7d2ed38289c58063fdef92f505e7562fef7bdfbbd4", - "0f32a2f2ada6a3ec33f71e448a0cdc6a6fb288cc03aa7b93a2df94688f4dd18c", - "b69d5a1a3e3745d5028449c57105a2c3fe3ae1555d0700791221f4b2f8749d55", - "1c1295b06736f3f93ace2b1ae3b08e9ae0e0febe43d0a1a6df42275e02f420cc", - "e9a78f39b9f1052ff23c6537ecb2ae0eab668510c4847faa19242ac4d73247a3", - "f419bffaf3a614db7180dd78336bc345bfc384f36c1837c66536125a12c3fae1", - "12b25b4eae1e671f400ab83c0522a4e41c21a9a0267a20dad0f67dfd1f9ae463", - "e3b623717b9b3477bff7e5f1149c493021f5c113b69d0a3cbea75555d7297e9b", - "90969477e64433da9cadbf543d734f54a681df806fd7588b96e3416c23e57e2a", - "af1a653e78a97059062286b605a1f576d7e668216158d1526144dcf3add7bc44", - "9e6014eb2e468c256ba030a554a74f81b416decd8c4e21bac88f40c6d6d0d61a", - "6a45883fe7dbe1989a29f0092736e2e0a3e38af4b370f1b90ab9c4c1cb97fbe9", - "001b8ed281bc3ce1db867eafd9ef44dac58ee0997049ef5ea929284e33ba2a7e", - "f13e34313fa85307403207b794fcab41bbad3c2a7d81f2f53c750eb423a6e4e9", - "c70e7cee4a775b6de1f1be8afabe02f4d64e03a0362d9304b9e4f593fa6748c8", - "2947d86294954c58d7406ad5860cab8fefc5e4f9e273111f88978215433cbbb5", - "79a5ffafa5e23cbe8d22513194e2d933b481c688a6d0dffcc88b9a336a77bfc4", - "8b0f67eb1998fd99b253ee89f8ca2f08d9e163fd0d5c52b85f51dbabf57f2755", - "dcf71071689003029dd4c8ecdc2c5d2ff094dbbce076f18c1bc258d9ebd3ccca", - "b7663067c02d2fd7d99136f594dfc094a2f17281ac89268b8d3759a263455981", - "65bde0493fa09e99a434f40c1f839e36bfac844fb4bd60fb70c0678ef6b38029", - "95448aba1ec9187b5efcb6f62a749d465484ec1b7bd735205f43a18b006ebf2e", - "a64cfdcfb0d65ceb142bb77f11385565b915a102556adf356e76e96dd8e49485", - "4846445607b1a0e9902a5954326ce15628b14424e566f1c1ae9897e29d729dfd", - "23ed4f2d7bbfcec042d598f0642b5b347401d7662dcdeb248802b5870b93b56b", - "e12acc9fa9eb2205243fe70efa7d045d67f708bd539c2cf63d53db0dd3b046ff", - "90d94c911add109011daf21f2fd299a96bed7ef924ff2ea308f3326eef344b91", - "f5f59b8dcf6a0f3f8c28c4fea86db7a0cf1ac37c5f92ce9a0e9988d6fdba2280", - "ed23c4e299a8c9e04dd1d72250f7464ef0907dc7adf7624be135ef43c6414877", - "2051f572b925fda3f1cf048166ab26a4add1ef8d0e5bde6d0c4721338ebdcec2", - "5db713df39567aac7cb0ae62e237b531b7596c4aa5350bfc837a6792b5562853", - "503b81dcd6822d1e03efa29f2719fd796511f9084376a24b94c0cf4af97eb5a3", - "07c2106c17970cbe50f7ce1c0340edd104edc768336a7d887922c677edbd0e27", - "8b27b45b122a282f8c2bf6d35201486f38a64bf26f9cd307075bd7220f57025b", - "1215da3d863700d82d8c00bd29e6d08981b588b0502ff3fa0af0f68c2e6aa47d", - "992e3e09ca4a33c3226a16f9feb2c8283800f993f4a38c212ea7607974244c6f", - "9d63dc06a73175cda31922da4a77b1d558d9b79db6abe09da2353d7de823b503", - "7f726b6c84d7b946d9fcb424fd80005b74c71b360174728aae94a76e56bf6791", - "07faae2d03e0ae9c76243c932420b07da21bdbd63c7b2b0d37c5e21f1e5402b7", - "676f3b31c8d9c6b0ec5d6822a9beee103bd297af37904c1fede32bb738c76af9", - "f80ceb88d3370d623ec293db4d888d517b6d8c91b0f12ef1198f18078b28cad0", - "5069248298248e062795dd67bdc84ec8935ecb1bf1bb032774e41cd3ec550314", - "328306a7ecbffb998717bcfd41e40b917ff12439e37b764c37424578da2cdc72", - "84fd2b192893b9c4ae6d342656e965d85cd46c45fa090ee1797074e2c9fa0aa8", - "998e91888c7abb9766e940b68d3ba52379183fd9d42dd4b3f9b8591d491b1cf8", - "ae85fbb1483cf98e61764dce6bde7b4b32f277172fbed32498dc66264e91f429", - "3f020e6201d479f03f24e055e519ef9028810ee2bc8d20a34753197c571ab856", - "a48afc5d1eec2797b64d39c8c7d1baa32843bfbae02b2a29592b4620c604bc55", - "0d8ff7722b4aa1b32b12ac861f0b6f360f06a5562e78bcc92c0379aac09f68cd", - "2e72724e5409855770c36c1383040de9f12f4277717a7f458e1f2737f3edea59", - "639c6d8b8d4e36bb1f7fe0babf263340f59517174e5ac5231c2a26d63e66e615", - "db44d0b1bf410437cc00b315b8a696b35e1a819ccfab05d992fed2023d882fa7", - "f72d0a28131c2ad1939238bc9a7c7a95686d31986e1a8d8e0d6becba48632f18", - "f6201a641ffd13371127ddefa4ec6bf4cb3291278b94c6d6306a5ec4fd51904b", - "1e9bb7dc8b550840be32184872bb44ac3da54886550cf18045224a86723a8eff", - "785ca784c1abcef72e16570339ceb8860c62ce079694eb0b3bd0686dd940afe4", - "50b19a462f1ff832d55f540848360fc2e1fade1864bb7ff230bde231e11af7e4", - "2a53d801bc85c7dcf7e6e19d5d01986e1665d1671075bbfcef3d4cd80777fe9f", - "d65d807ede412b46c737c7bd37a30414348cfc217b2259b1589707fce374136f", - "d3e9b80104290bcf8cd49a52e2937e3add363d53fefd16edb5c16c3a9bffbe41", - "1102f6d7ac78e2361ffea322239d24e8f555b6f5abda1f3df717937424719dca", - "3b9ae754ae7f9cfa689247d715d7c06a2fe942ffed95b8c0af1a8bb0ad58ac72", - "785d0fed92b6bcb99898ff1163d3d730712211b263f7a03f49004d2288f3fd2c", - "071177b0af84765372f890c3c68d2ff5dee7e3fb3ddb2bfb5b37905da3a821ba", - "06dd2bf159de59b8ebe645599619306d6fd4b2d3038271b1ee8ade690b256d47", - "7158e52b900e12d369566d2e8aa959ee56fa11503a8b6c469c747bab4cde1b9b", - "59554fd58275a8124d9269c9cfa06ef098bf1bd2da842ebe824041ed971f2033", - "35f0b098cc2fcd1ac8b207c7395556508edfd95f0ee35ba955c58bd7728170ac", - "f78da78ea9aafaced76b565974a285340e506ac240cab62539d30d04da3e19ae", - "be05c493cee84b7708cbdede19cbc51793fde1f4fa74d1a78af64af240d66e44", - "bcfa68a75529474de1fee6ec30f960cc6dbc4cd882bb2ef381b3a4b227d35e84", - "372d9a3c61a60b6e66742a39494483ff156b351c096b10bed0ca8c207e679391", - "8961fa6d5ee81449929991c0155fa6f4c050b4af233d1485114c46923146490c", - "757e1188b14b2f62822a96804e8899499c06b04ea0a01eb4c9bb0ae98c5ee41f", - "f5054e798f7b318e9ca3e48ac478bbe7e4e00682436f9b0aea1a787a671c40f0", - "6b44cedd0b020d5a0f02c4431567ac332504cc70bad4d883f3ab9208b2d28d17", - "98232cb64dfaeb4ab818f357cabe1a29293a4434b4c496c5e0b22eb923b80a05", - "907f9a301664aebe8d4ee6590bd3281710419e371cd412e982b66dc0af3d16f4", - "852d8780361e8cad44e5935d5a1a4e4efe4cc6d9c63a824ceeccee0238b68b56", - "6d7b10de0d0d9cf3e99e4f40292cadcddf4eeb51dfd9396eb14e3dcd026bdbbf", - "63dadb58c71e2ee1a38305692f31b249f3fd8d4ddb5ab173d90e56f83779eb76", - "33bdea10d71672912f59d5c84427cde4913b86cad1afc4c033b2cc38cda60295", - "d97a62b25f18cb334d2a8d5fab496d2f0f679c51e0af3f5e5af8f29408fdc52f", - "22ac4b6c81f35eeff8c5c1ae2600d0d323bc9207aef050eff694fa6aa50b84ca", - "235b15fbbf3e249ff3348bfbe958bae0e9842ae94dd96bfd63737e261777e513", - "dfd838cc4107dc537201b9249bfffd6ab88359b3f6c89a7b1167ed741230db95", - "596aaa6321d5d4b141e4d4c6d21e735efef50f098d3dbe1c87d33b9ca4d108ad", - "533e211f9dcd941c82560b717634678c074eba99a9413a39873af65afdcb2791", - "cd76ae585f889363e952105c96a7685096ef2281b9c3b5b65befe3cf605373c2", - "b08adf05ce8347106ea33b609710b6b4f5d88baed83d1adb75e68b4c9f2601f2", - "94321a431096b3768fb720311ba8a62f4415a9d5cf5efb4a2682a4a79b9385bc", - "62444c7245e70061a65d803651831c0775bb15e35a71b467e2967296e29ad0bd", - "889b87a23aaa132f4bcf33765aa7886ab1ae3efa0a9bde6fa7810d825011b192", - "13432c8ddbbb1ac6eb55c748449526eda9a413e18bb1ca09302cd81416316d85", - "c65ea5b28e0e969dbba9f63203d4d95fb4e91b81d6e5921e5ce3e4c694fc934f", - "eaa06b5442f6aa91970cfe2fe113976f8190efe7a7a9bf1e47238c07a46d8075", - "2cce2a2422c500e5b6f0dda152849fd8cee4019887b1cbf5c1218a765473a40e", - "097620b1f643201bdab58be450513ded92a30e60efde18d28eb620f09317422d", - "3a9831bd5c00bfafe7e1a9223c9fe6cbfe735792b671a168021b012f61811f1a", - "7ecea26cd29121b81fee208e535de0d08eb22fc3888933d858794dbe87b9ad70", - "2b803ed18b9b139d472b98a06d26c338bd40c06919ec435553ba2aec5e4bf459", - "9702f755958806af11b1f2930c4fec5e802993e3f90bc91bbfa044598d87699f", - "25d81fefd44c9fe1984a7828cf24f5a10988fe3b39b556d12a587fc7f1f17de3", - "0c4ca657bacd979316b3140bbdfca2cea8d0212e36d1431c419e03f6b48ed134", - "2d4a2114da317c7f0f26cf024ca4a6f952639bd26bc4d01bf260f590eb0d534f", - "2a4fa2bc87442d6497744f587a502b652806f4e3d89f86a1d32d49da777f11dd", - "539c428e94b339241ba2ae1e12950ec911417f57459653f40cbd19626894d695", - "9208a542657156aa6f6837b6257ea4726ad0dfadab8ae2c6378c79fea0e51f70", - "47c4fe5bc24a800deb988a3565eca3117483e8a1d8507452ec59cd645dc150f3", - "468d828c383f84ad01b0c4478a251a5f7712a71fa7d2902f4102bb32d390c44a", - "8372194af7ac1af4bf7c4d36c963151bc9c9b738d3b34a66ae28f7efc7047155", - "845e5dd7b003df0117d301d7c9ba29a4b7896268243c058c640831e217554a35", - "371b518dc8d785ee14cdf234998f82918945aa7f6180b04d9a3468d1678c5255", - "232b697d046f173deffc680b2aeb9195127d69ded626e97a439898c16ab7d9d7", - "3faf0e4cd56540ac83b3de48e06aa5fc19a5ea57ae5d0019aa78aad49454d9a1", - "7297dac653fffaeadeef628bb93c347c0c3755940a668e14b086b952214fc23e", - "1f8ae370a036e5873f138ec223391e1d5cde81b0ef51563db0531c78e31427fc", - "5a9c68016df7a573e24639ad2e8b4f146d34bc88d8b7e4319bc0444aa64c8aa9", - "f05b2f2a8e7c97fdf7944bb777f3df74450be04aa40662f4017a13de452182b0", - "77145b581c8dadd905700571b4566e9666b2fb8bce983d415f083fa095e6ae8e", - "f5abf062f2b400b85e955d7bab9db1949cc873914f0aea50d6d73eebe352b8ae", - "462fc4cc147d36b99701ee516f0a384e64879861975ae5437f6c3765571d69b0", - "511f4a0d0937e99ce345974e4722412baee99d33880fd40c47fe8e031e045359", - "3e2d0dedb66483938949255d9d9c45b2e9aa1ecc31d109a4bff6b30c1b37f1f7", - "070760ce51d44913eef7ece604353e8351ebdf45f59111c1fa4fd46454ee0a2d", - "9220bb59bf59e0f6340b0d59514221d225c033ba1145dd1cd65b8cf3fc5b5119", - "e1818620a05c06346af72b4082fdc74c91cd75015ee4f13c108aa833f1fee4a1", - "a9b34fcb55e9cb83a4acda953b806a4a400365c874a01b11ca7bb710fb51af84", - "a9d20fe21c25124afbc0237986dc42ad53541bd7a95b18aa5081b6d6c527464f", - "c3d6304433b40f51d64697111fd21c8d1147185840eabdc6a4fe3c972d0b1fcc", - "00f28e10a39755f7b01164df128678612d689a04474c27440bef6c335e5f4cae", - "60e3cbbb65c79112c3d1af640ae33a26783d016b66348618609773e7a4c8dc92", - "9f95857d0a0a1cbe7f16e6427194f011ae81ac1b1e7ae9d553ded40002b71f55", - "6d21a245015aaab4298ca501cf5ca939350be454661fa7d710023db91c26ba77", - "9ea70db0b896f1229be86bf0c8e2a4660dd8d6462101c181914748dd84776fa5", - "f2091309e7ac30f966ad61616b6fc406b68f4f87473b1fc2e29c0944c5588767", - "898e73319aa0e007f065b259e27d5df3639e5cee40146432f67b526f009ce165", - "df73f83ba315e76876d2a63aa9ae9d98e951fd63f477a4bbfb9a430056f86dc3", - "0b8281ad6af4cf196b6fb601ccbcde0d7b369ef1e40f7eea64861b2b2ef98a56", - "38656cdd5d46a88927eaaa52a46140c6942229508bd870c8da8c4fe25024b540", - "a2e6dad3672bb73773418906b26acf02015d7de80381d3adc3dfe3346e416d2d", - "e798531c00c336711deb787f6fb593eb1e9e1be441421de0801b105d270bbf1f", - "0b9e0fb516bcd37930828754541302665ec02c16238ecc1e2d65f3784e81cb30", - "c7513320feff4d31eb26e962627bd12f34e3998111bcf9e39235e70b7ec8e6f9", - "61fb7a653e312e0fedc0ca9987b932834e2d5ca700a3b14a2c425461d4c47977", - "ac16cce1dfa23bd80a8c153e45109173fc2101877c14b60cda0c00959675ecf9", - "58cca67b65e445af7b07cc2b403ef6bb7c64f879031e3f1249617c0f09595542", - "7aaa90fefa6aeb97b83f321fcb1936c177aa688bed4e2460f28465ac63c6984f", - "5f0c09e4f10de808cfeacbb33f830a7f1ec328744a0269a5d636fc2d93093d74", - "a856bb44af2bc9eed687a7315664c956525008c31ceb747fc258e8b4b50725bf", - "0da9adc2e7111e4d7b9cd7c84ef890ec96d0c50649cf2ddfd5b80ef4b58c211c", - "978d74ae93d5b9e5de77c0b77b090c6a196f52affbbed6600a4c13b7a751aab8", - "65248434a63a4ed45cab25e3d5eca413a54303c95dd85ae433bb71db157dbcd1", - "ff437eb065b8f5746e787b3bfb6e37b030d6820a15f3ee10215a0205ea3c638d", - "9d035800883038aef5ceb601f1dd8eb40c7f31d05beb2c98ccdbee702567f4ae", - "e794b5c983d6de9b65f1a95360efabe2b7d87f2a2696bdfc05f285382b0b1ab2", - "b49ffa41f49d1273e771bc9daad1317deddc3d8a57b0d009bc3c758c8e09d918", - "0605700ddaf9c3e5e3401f1aec1f3249ce4cc0216305b42f51b3bdde11f4d8af", - "08636e2eb44907dcee4804d1c40d7e6ec4311a71ead9145bd0bd7cebcc509da5", - "a1955146cb94049173121b8aeb3448117d45601bad9cd5abe6bb0e98179c2a98", - "ca135e4b008478f2a4c67da502c52c0ff128c077f31f864234adc25f67fedfd1", - "7b6c17744e787ad1328f9d2ab87a190e11cde4bf7ba089ed4bf9455f660ab439", - "4a60ef731a419992b9e99c42df97ea11ee1a3f5307ec123989d717e18cf3ccb5", - "817e9c4594147daecccbf614431d88b3227b8e8f377d7848605246c3f8d08fea", - "24c39d812c3372c5fa57097e6b419c776008d0de3f963e7b32003ed6a6819969", - "610ab367aba0c6c6299fc4a03c946f3f32683ce810034fdda9f98dea8003e6a0", - "c27480af4cf07768138dd4e8b24ad52c4ac35331a516c6d5465fde6137847592", - "082c5390111eb98a3b15e2eefdbac57ce8231e24b6432960837c08249eb29caf", - "8ee42ae6663dec885b7264d98b7637fa091730b7410c61fb2d809933d072e219", - "8081329ec9285e6bc82de5522bcc68a15615d0c3a213c9a509f105657a8248a8", - "1e49fe28fd06083bc01d52ab7dad30e76db5fcc80c9dd27f952f339f3644952f", - "325ec98d324f65afec4f05a1c3b227ae716d0632df255195ea9ab82b8d8f3811", - "414d2068acfddcd62a0783d6111b5e854b515a87f6d78e84d88d321152cef6a6", - "b67850703e5ec998302446990aac34b1fc385b04df73562c276abe65038db927", - "78a5d9d7288a533dd6ad4952ad7bdbec0c146e3dbb1696bf235fb6982e731c18", - "68cfef75f6683fbdceed8dacfc945336558ecddf7e7e027dd5f486393e112868", - "039c92bf7af9f119bf166b22961310714793c1d93e2eab2ac53772f9067f9a88", - "556ef957453bc9f376572eb97ab9e217754777aa87150c8af121171058d18e85", - "c55b75d183f51c464d7ea65be797e20e3fd4a41d575001fb07a82f12156bce06", - "a15272035c7b0189b0e29e163eb4dd6ca67fde26889245e1de5852538dff4aea", - "16dd04b91983994d44cfae63809a6365337713e98be654368e72969ce1bf9e63", - "f2fb80c25c90e4116b07248a5cf8f8e691d07ad6a44c5565ca85a24d0391d179", - "0bec9c04e781ebecf3ef7cca92f4c7c009865177f261d4489767c4016eaea8e7", - "607093db45e95cc485f67d0a75f290325dff2e69eb8e7f88307f25fd5d295e9c", - "ae14eed0a83f58b8953476cc1dbfe7bb61bde91b4df150fc0f87b96ac56e4db4", - "f094d65af0722f09ccc1f14ffb606fa977c75cd3596af56ccee9fbf10c3b4e48", - "516262ef34464aacd19f1806d4d0e02e3f9f2c65434e73d803042fa482c5c796", - "5dc6476e1a92498fc8e7b99a248325b2ecbed5beec0b1b0cc4942ab4793a4c96", - "ff2120cd695bf5837102622ea5f0b35abcbb7d52912a0a3bb6e9a2df1d084e42", - "bea68110db20aee7b4062eda1c9b34397214fee89b4c846833775b46da5f0fcf", - "45ab75e52c79bca27d604022eb221cfce4fb5bef51cd9581ef510d37f63ae1c5", - "af83ae06c9c49c9f08196fcda09efe64ad1fa05220ed70452e77be3c5e44beca", - "24936de5c12ecfdfa3a3b5675e4d0dc2813f188ad100bd17a500872074a77113", - "e4d441b3f87e6b3bf3e85d942e2c7aa82821d1566e2c793428978e7a084f7618", - "4db68289bea333317c0daa8597687d46e287a9727467b0e7b3626c86f7dbff8d", - "8ac6ed29959228a0cb72e249a8831c90c6a2e72bf5d603d59fa9037ac366c28e", - "19c7f780f21ffa162f80a8dc7d8be50b6259551613a8f79d240bb9dae1eac99f", - "f4fcdaa597c601ecc3243ddeafc85f276ffb5bf8774deced0e82c94e7a443d9c", - "96f2248eeb79424dc3b39cc293ab7e69533c2dea0aa529ff92cfaf1cd90ac5ed", - "698fdeb762032e3341b2a54893d675914e4b8d7c6f01e274ac2694ece780dc54", - "1d5e49487a03515a95dae57ad4d433a1ee935e6c4479550b178257de3e730749", - "11ee053620923e807317da481646db732f8490159375ea2d9f02ca5a862c5cd9", - "8e07c5bc1d884437de1827812f7976c7cfa94518f0320931bf60e942dcc5d5b0", - "b8bc3c39360da09ae3e0e632ec02adc105bb9ce37c3b478e73c50641d97232a4", - "e26e19403635f97f690cd4534ad22f036a1a0a2216e8611eacb778767839dcb2", - "962bd6f45c6e58c73246140fcd1f377ad48af9de80e44bb754c5bc8ec2aa2595", - "d06490eb99e94609695ff25ac5a18eb871128b46893a6b0389be2d970395081c", - "d8ca33f661012d1f348a74583c8d00a770206650c1576911cd451bb60a8fe9e2", - "ef595a547edff149124d737a18b6995bc21b8f5f5d784822d2077dd7bc5308fb", - "541c017e1d7127e3439e918bfdd5620e0885258cddb372f385aad40a3d17da91", - "d3c251e994cc7097199f347ffc7f62c2c10e4831ee99ce749bbab68ba3e2fdd7", - "d51841f74dce8d01649219731b540e349ddea2755bd874de1a1ed136a331ff3b", - "555702502a1740a705aad55dcc2b005b991903dde91f8a60b79b67d14e25a935", - "1c59552b26e9c61a0a6802ae34a97b9131f0ea725356df4d73da968c2493fb61", - "3180b214f0b1c28651630f172bf1f7614f6d2cfdd119c634b33f7d2822c5fbd3", - "b036d7ad3cf75570e33942859ed9628a1ff9e56f074cb179ada955d3c291892d", - "cd6d8e38dfe48ba29ca289f74a9d07349077039131c35ba8fced9cd7321b6248", - "6bcb10808882a8ca9c9f3c3125d4eaf3b289e6e8d6311da9d97d16b2b58e7724", - "b001982b216b3c04fc05de148f51774282087c2ae39764f293294ae054a8f9b0", - "ab28e344b409c982186f34163f9213fb667d849bf251070cd59e50892ef227f5", - "0c09028d1b567a025f04ff812da90f22ba7c363f67675c33e7a144e55161366c", - "6ab37f937ecc63a5a95e1cef1060b27219c1bdc05aaf42fa01c9fdcdf0fff153", - "d150d2d82d944768549cb931ee0e5f9ebb11a5c319fc04eccc71cd92ac85fa8f", - "996dec150bc2bb74224cdf32e2212e8fe8af6da0c47a7e52cf7b426402c59fbe", - "60d88084b3b13f84c111883853ea3bfd469e3515042833c3ba56a3d3d8711f1a", - "1341726bc4b85690397ce4fb8e30ccc441a4933333d9d01deb6a4b832dc14690", - "ed64a2b2af9ec0758459792e0d94176adbe9a3baedc69235c8d94d12310d4be3", - "f286281e159a56b17a5fc6018f7a437c5a5fcf2add83dd4c5010e2a9235bea61", - "f73d081e52ef3506ad1df13bf683752590576f2a8bdb1f6204e81482ff5354e7", - "d4a4b76005547f9b05f8500d253c2e6a6bfa9932dbf64d71db999a48d6443fa5", - "62797252c62c3ef5992988873f4aa75b815c7126727e00e748faa6a731f1cea2", - "00a891c11a6a625b85f97149db468836c73870cc4d6286838de55d4d670b0f51", - "e9720bae4e5afbcc0ae6849e9bc6f5a568d2159a7faa3b577ab8ad46dd9e3908", - "796be262ebdcf509514b95c9f2bc3d4acf0343573f89914174bdaae34221bbc9", - "6c4021fd5b1e45eef3e58268334c89689596a95a5810a96709b37e443ce7b56b", - "ed11da19842c86dc3bb60fdf6791900b911f8b5d97c2e3ae2ec1492442037168", - "8e665db837319e66a338715b51a05d00b73b58ff36d9fa5c4d2916e360f2971e", - "580c39d6f412b6fc41216079bb71277e9ac719d69290876ded13849eab435813", - "23aee354e97191ee0fbb73cb3df9f12d280ff7c10d0178ad58702f7655b655b3", - "f78e87d1c9195f206f4a7a51e529d89a40b42908040e5a0c573b27d866ebc67b", - "e458dbae4eae63c0d8894bb1bde8f6c46507d0bcd4f1089e8b945345407ea19e", - "15cbd81da257d3245de49e0db83bb778816129100945dfdb263914bd19f2e223", - "a91e18063dc23c7b996f3f9c5e2cbc336a285617bb3b0da292e6ec3b9c8da77c", - "270ecf6307f17db076045bbf0c901f37633dc1d8866417e5c2f6d04b02294a77", - "05343a81d26044d7ce7924a528849c7d9516fec3818e621309240865005a3aa9", - "0d2d4d41c18836c4f29dd791a383cc3d63b17e4a443a230dd69fe4482fbcc88a", - "bb01c3f7ea1f6b1264ee7addef424b22a1c2cbe2209f26917b2a040a58d93951", - "cf74f7a0c8cb6e46c5ea08e58b1dc70953eb8677d1195ff5485635b61f2b1d1b", - "f723cb2d17bd1dfc41cd99d1787d544c8c0ba3a4a2127ab7eef38fcf9037365e", - "094ac22e290311bbf519feb786c8de430b19389e73db9caa940b806caa1ffae7", - "a203fb43fb1ea4f13e769efcd95127783e418c37dee19acdcddc808cac476994", - "da550f74b3ed5824441842c0622282391b68f1de44c4ce5836d402a23b31ebb6", - "37453b7dc8fa202f1cf28ddebcf827193b08c048205c7167bcd7cf885256392d", - "050bb3676903a03906321478f2bd463cb03ce3ac7b58ae6800902e419a1f7728", - "9b4eb824a34a5deba65cb698847e02237b5a488abf737284895600d91e8ab3bb", - "0f0e017311206b97b47403eba05a16ada760a691a36f844ab8bc9082a4efedc9", - "580d51783fe18cc8ebb2ead7d0932bf1048ea2238f484f6fb04866c8844384dd", - "7693b85bff8ab9c2ee73408c4597f1572ee91044d70cbdc239125c853d8c8113", - "5f48fa707b122cf6066f323deaf4227d8e693fb717f6606b8bfce273030eae19", - "e0d7d6c0eca106dbc73668fa1ed9656e4e0fbc19ba24ed3999c2440c1c359e0e", - "8fe156fd8293509220d686df5091eceab87a588626d6b31016f1aefb24eab331", - "599e6b21b59deebeaaa42afb293aa1fffb289c61ff3c7912030a45f832f18be1", - "75e425961dcf6e62c065e61d2e865c4c834fb46d3e3416486aa020b70632ef92", - "a967188df9b3d2bbd6b1068ec2180221bcffa666c89465cb3a01585459259b85", - "2f96030622008504d0952bd6b4e9b835cc83056974cee163d13b93aa17b16663", - "22ebd2298296ff3079874c14d4cc8754de88a32d5f4ba72b23fb984de53868fb", - "16ee49463c18f0e53ec24d924294986f04757210b4ed76d4db6fb230893022a8", - "56c0aa357995130e9f85b4f4cfe0797459f803b316fe83f980ad2e5957b42d38", - "608547cb487c8cdfe33d47907826cbd50b2510d670ebfcf79ced91e0b9fd00b1", - "102f43090a4f518b634f632e4147522c9da6eb80c4c06ea9d379d910be224b26", - "2591c3254ce53f8d6f2bd12b5f9e1ee14d38d93634d1406b665d6d54aebe4410", - "83bf5659e353b815ed378c6facbd1288afaa7ffec7df8ba11a6474581b9c0031", - "5c2ec0c66e920f795564fe2b09bfefe9c5e8aa384c3e6cc9909b4eb37dce4e0d", - "ed5f08cb83f3394635fbbdcaa74bdff25d5db26f4dff7c61c199caf790b3eb2a", - "1164de27771570f4f7a7a1e627098d1a04cde010f6eee9cb993e134f3bcbff91", - "a39eddf394b7695e0a6ad8dee253e742d8122ad7c1d35140e88bcb57e698ca91", - "a17c73d3019aeb448f5da054aea91954e97839090cd9f82ee26e013cd32c2584", - "b8717643e408ad1ead5598b5d39c23bc2ac1c7576233c2ce4c8f19c7fde7dc53", - "2c27e65e672fa031470100bbacacf36e4356de499b540682c2d754982968b618", - "dfd599d02f5e5b7a1de965bf41e18c703c845ec67a1e5d6d4c58901da9d5e777", - "93789a04b268147615098ef130c80d3a19605f4b82728a413d2d9ba1b4eb64ab", - "3333af2f3157fe4dcddff98b55f8e1bd9c1c1a0e001ae59e2e8d1778ce7b87e9", - "3204121ad6179b8657b7cce1812eb2f018d7f5a3f898db9a9cad1973326c14ce", - "5de4f6ef5041e66c1150399cf156482d790595da2965d1784246a87df77dbfad", - "d66c620a9f55d15da045b0117b818c728eea787e53f04cb75dd1d42f14f1cc9f", - "4e16aa533343563678152d736b149aa49c96e1dbc80bace241d3f27800b392f0", - "ee67825e02a7799cede7c24ce135288f26bba1c03b864c0fa12d6b91102f4ce5", - "ccc8575187abe7885412fd5a6fce88780bf724c4834878b5484635457bce327c", - "53baa79342f5e41826aa0dab0ec4d86b763c3dffe3b1b52436228f7f09e69e84", - "7c9d29d5cb8ae352f092f6ef2daa9a754eaa96eacb626af87e91a100e876866e", - "e2d0adcf9b642d20e02c5d9bb43ff5db39a8e52bf1f73dd8adc9cfaabc5fb9d0", - "60d66d7b28408dea60fcbb85ecb2ac5e2e35677f270237c908e5c76a1045f278", - "a62e9032d2ef5719a7915ce19b2126cf492eb83bf572b052adaa4bda9e7046bb", - "3b429f828fbf03cbb36075eeffc6c2578bb9fc470aa8611ba5fa3250931c4ae3", - "d0932d4b4669cb9eab7014e422b19b0782a6102a1612f43b806ee08be7711316", - "c22e177f1c4f412d1591439dcc5e8bb77fc27914f243bb07058ebcea9b8f5ee6", - "9fecf5c43289aead19e6f8a6c1c5ff7f38303a3a42b1787a1d9ed5f9405d9733", - "962e29f1b99b1ec376e16a69f6c5f758dec998cf3fa76dbd84d53179438f1cba", - "a96c385cb797691b7f86c593806e855fb65183b97f7ab538da1203b42c469923", - "f249a478c0801364b0340099ad5d48e39ad115367d8553f53849ec21085b319d", - "877467a1621c69134936db200617634896f0e87bd9d14d23e3538459c20a8a57", - "f07cfc2b1537201ff70daeb765508b83d77300e6b71681f57ef2d9427f80ed6e", - "91d8f23cf29d772853565c769c3ca4f4a73cd973f4f1be1dbe43bf8c5f90d2d7", - "741add05551987ab4a47b3f8975bd7eb9def2d60c6f6f50ba7a629e08734897b", - "9c7129ef61f720c33c96d70087ae7af7be494fcbf81fd821fdb7febfe9bdacbf", - "12858f5ae7c764ded4f5b39e21f088ddc916a6334258bbaeb4b4d7d07f9399c6", - "c00398b1d0f354a2615145246bc648742a4d1453a1f474b31862130ff12b4efa", - "ef7ec05fc02c8cf73b26c847c1c43079428601fb8edb1dc5633ab21d01f66025", - "8093a59bd4637671075771facd4dab2be5c7d1ff42555a476e554f690c150657", - "e89857ec61d44010b170468cc52d6236e29dd74a1f05034b575d0d52b1523ba7", - "131da472ca906a063d2f18d0169220401f049ef5a555c1ebd76edbae0daf94d3", - "38ebd054e3061449dc638d30a60ac4e1a4b9a34aef0f615a9136ae408cf16ffd", - "374924b82291ffbdb66dc4bb9611cf1103f48a916ebdc2228ff5168c642f00b1", - "1aa19ec00d16da4101f8389703ca010c9fce7f84950dd361514d75d1faa1c6f6", - "7038e726d59bbc3361fcd88e94b0b8bceb733c362fd275ef5bf9ea96e0ac2f4a", - "fc74c7b7910cc5efb0d5e081cb77a1b72999599b080eeedd7e868aed6475e115", - "59affd90072a0902c29bee5ca92978fc082b9e99c840a14d588b26a0c6c599ae", - "e6f412b61d3e1777705ed34728f5cbc2079c978c345e77374c46eeba92a859df", - "7171dcac4f22248359c6aca45f2295ac5bd8c390411eff793e6279afe80cb8f4", - "525d0bdccde97da4ec9bdb2f17561b84120110493b63181a23ca3cd86cf68c48", - "3d89c386e806ba989f8bd7f71ecfde4111b5cdcc5e2896e2ad25266142ce39a2", - "218ff2c271e4397005c0874968859b1a1962e083fa0ab27f4e58d569da4f57ab", - "bea259b9af7984257e20ae03db88607d0c7eda05fc98073c7f446358836aa474", - "b0de54d782666956c625f58da60941e50a1596409195af6ec6124182a4312da6", - "409386886c4d3fc81296345dab968eef47c6caf9f2c451f5be0df535e7b613e2", - "6b176649b03de18401a7a9eecfe3358ba3fa9c10e0f566e480c8e4411dd17d0c", - "65d97bdfc02f18dc93ffda81b52cd1d4538cc3bd54108bf77a1649b9cc804f18", - "0718d758c9ce208e61f68caa2bfefaae03f44cdf78235d8e4e66acfe253bfcfd", - "9fbbd502a3931434eceaa50884dd5b33b467be613a1cd1a67c75c4b780897a4a", - "5a171e6c19496e5ae41c5ab8d397b39c44f3fa0bc3353263653ea07a1098a37d", - "784af6136284b36303592fa5f9d374f4ca2315a607fdf85d85a0781525264a28", - "4a99ce88ec400b513f76f8b8a50cc624d9c8dfc59de4c65d6f99fec15d2c3d9f", - "b802f6a56b80002a6de189e0e31af6a8c11c85c23789493b56f5ca62fa9bea9e", - "5360912ea4d1dbd60eb8504dd91e78080a5e109174687ebed7dbbe2b2f437542", - "cd6892285e8da52a8d44e24b1268c66f61f3ac1356ed97062b6a9baf7c758c10", - "474242d3aca6b555b56cabeec7e71c4e7bdc3feadccfe147c54ea772b33c9e15", - "aa54fdf991c0caf5fcd60eec49c2b6a60daf5daaab227a248bcbcf1e4ed58272", - "84cba170ada85732713d34a9811615bc84cab0b4082e4d10ffcc280d22e3045f", - "dfcb6a68105761e274cd64acd1952e47aaa04ea134d720f9b2cbc65495cd6a44", - "b34ba9c9ad64983b07349f9520efdf31d023340624a5a050b0d92640319097f9", - "677bc449473875f162d6342b4995b25d3a5a21eb15a7f08b2bb87f08e9099980", - "89b8d544afb22c4bb4729e5e0fb552d8e6fb40066ca79bfdc473fef5fb3c12e3", - "ffe293dbe4b0765cac6502a808a413e1af2fca53c3f9f19afafe0eca8fbebb8e", - "fe6c06f9e907a581739daea505520f4071e1c7fe3e7320587de4bccf8e722e67", - "0c8e888e73ae2d1d9354a36eff47358fc4ad9d51416cb6ba6099834aead02bed", - "5144c629c667c7164a9faccd4683f484b46b448f2a7d1d6705bde1388e0e7c3d", - "7cf2739e26d353f10296787c5bfe2f32687b0ea159285359f5f116d8e1568b8b", - "c68da30f2d0ded85b244036ecbf5917f9efdbfabf9d66e9af9dce81b9ed55433", - "45d2927a4570624deee59d04fc1610010e57680edd8a45f9d9f698e60d74443e", - "e56f5f7a91a2a4bcb306ef7b6c5ce40f2cdf91528ee93dbbd014f7d6085a393e", - "cde5dfb5089643d15ac3c6c0f0e07ba10e7c333e006a27ad44c8c4da410724c3", - "48b18d14b66ba1622fd070bdbac5f276f4c82140ad35dd3843cd9805f74779e9", - "6e20c958a0fa5e677eb2096c373e544d1807cf7b667b82eb7a21aa2d950ebe79", - "674193e57970292981f48941847fab555bc13ff6ae07649513d3f21a8b56c529", - "af9d633c6e77b191308dbd1af3f53d0d65868b9fcbba487ac2ad971500141525", - "625f84d532da7a810ca1ffdd3f95da4df6ce1316fb6e4cd60bca680cc6e15223", - "275065a375133ca6754c07a68888700a7fd2e4f2f2953b63670b830c7fd06489", - "ac08b952279e5ad66823ba013cd1f7271f504e435f4d6bb9951a31ddcbedee78", - "d24219fec739bad8f7bce36a0194ce7a18f8f5a1380de2877917132b1be71347", - "48103ebb0a0209dd7cc912c973f6a37016785cb024281975e959b75bf2fda9e4", - "0c4557805a48b63e45e95db3db1bfa52196faa400a646b4f6bb542e053c41550", - "1938528846419fa227899cb910c1b317d7350e0fc03d5651b1bcfef064673a15", - "54a7627615b41a0287e164e2d6542cfd99cc2ed463ef3a56c98c663b445f026d", - "6436bbdd58575874b8755a227e06d427cc1e3e83e3b6baa0658c3b79c201c528", - "b2ba5cd993e82b439395d9e7097053e2324c74fd2ebc6a4752890166f421fd61", - "8fc28d6b6f5500336f733875009cbd947731604ccf3762b6e85a54f2906ad93f", - "449a8b711e9837f542c75deddeaf44da2352ffaf5ce1c6a91464700f25f3d1bc", - "7214d2812593b33b4cdd795ebf6d46e9e7864e9eb45ebe532a10c175b5186e0b", - "7a21436bd3ea30a3a03690979e4d7201f60d2e421fbb56caac20b65ced6f98b1", - "f6c4be49686d504281da9126bc971d4fcd5c99a8789a4149b7d2892035554e31", - "d3db3c8c7f3dcaf51192c0a730ab004631de6ab4015e350052d9818611b5066a", - "a1b79fb1ccdca63d4d550a6fa3e41810ebeffcc29ab566dd16b9ae36e380138a", - "5c5e7ea698396207171d787201f60bb7ad250d335e5daa8fb133462cfc1cd647", - "6087caa90cd4796c6d1be79cab18772f74894d0773d51ca26b1a01a72b1b58e9", - "8160147d9bbb5eb6fcbc52145e94f897a95f9394b345c5520384e566ae110246", - "e0773689afa7b9c6e11ff5aea8acecae12ea20a56001097b97a210485518935f", - "1e16cd918f62ce1fc13df94f3c29d95ac3cbde667711b512dbc55ca322a96c55", - "8bf1d4e6d8befa632866aa5151aa11d9928bb4aa25c28b62bb862cc684caadbe", - "85a57a88c35309d8caabd709e33be2cac3e22824ac179e909604501f98bc937f", - "519a1ece99384882dad4a1593fd3b31693623e4cb8ef19920864c4fe29b7914d", - "4ffd7f6b5c1b7baa30151e7944a2585ad635b5d9c5755762bf0fbbc8c8d36021", - "9445aa5b625958e60930f502c8f615351a35269a948288475ec6df6c58bef173", - "d5152d20717cb16318764dc78e8cd034e850cc68751a366644f559b6ee446ab0", - "2b765c022f177154e67be5f432aea085d0f13e1523db6164b01374a474b24696", - "fba479223aae95d674a2e88ec561aa8cae406da9d876621b2960bdf8664a99e1", - "999efc3d5c79770ef5a611e4bb787923778024574912eb2f53321b3dcf6110f6", - "2a3033b42d8210701099dd05632225d18459c3214ac2b4caa63be6573bb63342", - "9f504c264a721fde00bf4701e967b13b5d7e40ccb0395c40a0ee2016a9d01195", - "47322b4b921c219374f5e3168ea4e9e512a546f8a2ac233d38b15963a3ec2a26", - "ae05c1af1c461dc0e5d33701399cf8c9364c316cbab5830c02c4cdabeb47e87d", - "0405b4ff0ef1a91c3fed8478757705a8ea51eb6ec848139716d0ae36a351d9cc", - "8aaf611b3b435a79d7ae843d453390d6e535ecc7ca93996b4bcf504980908fc8", - "5c7f720426c6298503c88eac368174d6108ba4cdb3837840c9d756ba2c9be079", - "fb36bb79c8a2dd067da3f926ec0e83cbfc4b22357ec2d3313df4572c13e683f3", - "49f0110fe20a937cab6f4a951f02c3a1666cdfcd854efb0d40f72a58d7a47ebb", - "248c6e2ea694f84cd42a3f576f0647833c068bcb710bcab3a47d90af5bd7ded5", - "d9577c674e7c62a93669b55216ff1bd42f587fb614bfb6d1dc313784415c2af8", - "62d8b6352d10a60c61c1d64d7012984309f58bc98ffd06320465afeb9b62a180", - "6f258f90266d6a50f4ddaa81af2fb738152d77d4d4803151d213fc04548dd31c", - "6e2b5e95a3a74a4d7b4d7af9dc81af5b10b369da0d99eeda6bf74fd0949fb892", - "f19b3d4079c414996949392146f78009a1db55fff314a4cf925cb6eb9db0e481", - "03f932d26da6b222280130cb9858fb342b3d357ee810322aad98ca61a1f8a85a", - "ba4c22d071ec285630f1deff08ef2caf9ff83d54db34088e1086a359362578e7", - "bca7a69232cf6c8622d30184b38cc7d4e39a7fb55c8b7b91dadce4bb97c82533", - "7c83364a6e3d8312bc83111e894db3bd7d6646f5a3bf2246f071ddd7677c373d", - "fccfb4c56470ff7db1c39032b522e4c05b51f33ca2ef51817eedcfa9af22b2c1", - "5ecfef7848ce840e7be4673c8ff866b2ee9809ce5bed19d063c0e7f04918f149", - "ac163490c9bd3acd91f8bb4a701ff9a782a51355f455a566dffda860c710f4be", - "fd7f7de37647be140a28e4040c36feefc2c57bf00f8ea4f88561577d0733b316", - "edf3b630b7c1ea2409a6e73a346b1e6b85a995a92b41781bb81e557f1fc24969", - "9cc59f950adf87618089085f4f0e7794f2517d2fabb294488f5039608d0b22f9", - "e02d6ad93d054006e7a916d4baeb711fb93a3900c4c9454e3dbfd1ab5e05d15a", - "ae3cb299690a66e92a4f5d5c6a3129fef9d848e6a26c949aa37de929f0378597", - "500932afa259eaeb7d649fff3a3c3475187d329fa86423e82bcd61eaa2eae9b9", - "eeb9249c30e3162022bef5bb0dfc148423b57c7bd211ef6fe64b73e158289277", - "1727cb066eed1f7f1fde8f05d91d64571deae229f35b3eea57b2cb1ac90dae70", - "3b5bbe0792dbd8070125e4f8a6142061fa65f2cee83c1bfb97bce34d8dd528eb", - "2dcb82c756c83d2264e760eea84c6142ebb42fa557fd2ccb9875b4f5506b9847", - "6719c616c2e01afee7b7a79e0419432f792d175f9019d40d18e8c3e9d84fa3eb", - "afdfced7e7c46c368d7d6a085a51ed09f65814aa5b0c74675e78300680a32387", - "b326582bb51c0c26184acf01b9af6bebb9a6886b180942b509671eeff3ca5c87", - "44debb455e2d5b2b98063928ff3389bd601c6a342de5c7b7bccdd265e5e6b89b", - "0986c4bbe0e59c20176f5ac75a1f8d9bc483e3f7be90dced648da7352c4e0086", - "ceab97f8d77138f4057e6483505fa118d74a61fbed29a7f428fdcac146de9b7b", - "678c4ac7e21d4407235a96d4b06d24bfef16a7f5afdc14ee4e2e0d868c1baa7a", - "731b2351e69faa2f800209548e0e0c69c26e4d96fe29f1410760483db505a8ea", - "4db3dbfb9dadc64f78f83b7242357b554546d1410a2cf6ec2c7acfbb7633627e", - "efca46d18707e539b5653d60ebea874d105f14bdc4fa80121c69f17075099ab1", - "89b6ee44f9d839deae75a96d89d8ce89fb5125efc136e1429366afc60ea5ce57", - "c661b852c8bbed2838638fa01777efd31fa56f264fcae891fcb23cfa45e1ddcb", - "f3008be906a97d105ec38341b2a8a1a53367bad780f3541e10efd1f9863ba466", - "e0499c0514861d76bc001d04e12796e082709aaa092dda511b726ca2257ee534", - "c5f92441eee9a678835d9faa33f7dce6f8f322ceea62d0bf842879cc3f8308ce", - "441f0c6c72e9d3d2a38df1513a66117748dcf9fc85c866adeda6a55afb11d0af", - "9d84be34bf9ef7475131b68e40ebc0c65679433a9ad460a8f43c2c7f59842870", - "6419a116dd6f6a8732770355169fa34530e21e85a7f4bb06b27e6356aab641ab", - "4748bdae56c6490341584eb0e5807b468aa618d767a948178c6f9df57370105b", - "7382467f28ab1db27a62e31cf37a4d88a4133fd0ad3616e24daa5e175aa6ccba", - "4c853942c202c77f490f442f9303a0c50f4e0195affc944ab7d6cc5b029f2f90", - "cbacd81d1cfeaaed37993039531bc9dde113e128812348b0506ece901013faab", - "ddcfb9cc25ec7f8e242a4b80fed8b647a58d5c42e035dbb4cbf92fb2e9189324", - "9f5f139a01f0c1a42015292ecd9b6e7e45fc25371c08d12542c1e099c48920d2", - "0f7c8ad232f2138a64f8d8d96d02e13c09b072a12d0b50b4e576f4ad39dfce4c", - "f90eaae6ba5c382e5ff856900c5729216ae747c2f2e5e297f720de9fc2299c5c", - "07188739ebcbeb16af267f8d6ce9bef7c4a745e87a60de08324d5961f7dc16db", - "9526bfa223d176f9277b0ae39ea4424ef8335a667f4393c71904a3b83c4bb660", - "647632814a2f881dbb9da86dccf18a7e5787a1f5f9f80950cf2583c91239500f", - "34a16657bab45da6d53dbe119a86b5c5c4d45fcac6b7c6547942b95500435629", - "b524be2b9c9f0d17de3eadab730528688e30e82a25346fd526d948b2f94a5cc6", - "7f2fcca2b5d12c286ce3e9d4e8367c5eabac89deb364b4b434967b0a159a5325", - "d12e63234cd0716834b8ec67f57c6a16920afc40dabdb36e18aacf99c990897c", - "813a40c93fb3de18420ee6126269da8298b08e783dc965e7b09fecd1e68aa1ba", - "38a97a10f7f48b62b7908eaa96a4b046615ea1752137b5c611a22d8a86caa229", - "4be93cfeb5330a562b60ef613d30c98ed78f5942c437a850af47ef661965d5de", - "45494a91cfabaaa49dbf530d3d5894ec78888801554235214c6f74417739a18d", - "aa32dc06ba4ecc27aa55e0d8bc1024aee1c52950898d611bee07b5844ef71ca1", - "48b4660e51ab9ecc74c84adff3b4ba797d14bf19642593e21ba53e6825411026", - "935d71885f7a29666cfbe3b3e66a8dabe4126a50e4202e405c9b6228a36574ae", - "054a37cea8e33123596ca03df29002fbf7cf1909f71421340c47ec365289ffe9", - "d2840420cf8f83122db5099edb8b02242c5c1d62ce549222ffec97f0f7904a47", - "7727792d52264bb44b1395686de2a4b58c60eb08cfd654b75f33462f019d9d9b", - "892c4e2820affa7cb7b5259eef472748413fa34db530c214aeadb09c259fedb2", - "da2d2e90105ac2d65d4c9d8a48d1f08e266bcf37a8a651a9398bf7d825567e13", - "3747fa3aa8d8d89ee6ddd6b33c10bcc77092be8615f899256e19a44a63591e32", - "32d4c90ad097918d366a10dac575285a95831ae16c6f1404e8f670ef26011cd1", - "bfe07f078e318bb719c41b3aff32c853420e153134bc71f761c0e64e909f44b2", - "18906c026b6f279b2e01738ed2e6a2603a1d7d211fab3f14a76340b9d0601014", - "75d5a6f167a9ce116c4a48a71b4e1ed70181b29220d5923aec776416daf36eb8", - "ef205d2034fabc1b553bbabb8ecd8ce79186500806a0e1bfdde6e597553fabcd", - "6790b9cb8bf8e10c11aea82af907dcebda1c6dc1aa1ee7600b79553c67d1f67c", - "b966f0cf7b27fdd0e19c39d10f6279dc96279e072779f14d75b836144641e51b", - "e63cc3a044d84ba8f26b9b30baeb9c091eb29a875cd9c5f96e38be4de31b006b", - "939213aa26ead5b96da77189dba9a4558789a279efa339207c65fce092e570db", - "787c36655398fcb54d1baf9d9a4190ad53987b2d62c1c05195cb12c3b79aea0d", - "934e424dc50e34f2a88b9686e7cbd1809d970c0f8e2760a603db72da0894c033", - "de685196dbff65480ff921751066b1a27b46a1b4db7031fe3f457f4d8b128400", - "38cb90664f5a12d4396824db52e2ff536e9e18ad8cf4bc2a53f7234212184b01", - "27a8556ada8e78e89efa6a09b66cf0790fad759fdc5013dd113c28d1dbdee19b", - "ee622ee44cbd506affc2e487cd4cb85b6688e4565a171085f446a10657d17e22", - "6dffac89a2415924da533915ca7d71992b6a873ef9392b2c755f41a06a68ef2e", - "61c9f3503433c97b02438f0fc614a245e469c06821bf7a148069383203c435f2", - "ebbe9dcc4b936f2f261893e81e42c1c7a80d02f57f2d2bc5fe4ebcd0437e140c", - "e4f34d77614080346b5b89d63486006a26555d2dc0fcc0c7397002a7afbd44f4", - "9ea084685916c30d8e62849691eb0e3303c5e03b6138c600a1c7628615ed09b0", - "7fe4a654dce35841cb3236fd42c2f6f79167b8a97943bb5ca12b95c0b9de885f", - "6397addf9a535050cb4fd600800e4a0fa9e6c13ae3bafd6e4d74ed5a3770ea0b", - "01c1947ce3aac4b347bd9e2dc04a23af53894d9e3ca658914ba7fe45da002180", - "b99a56e2267fe0207caded56d84185fb891319a579900d1b1582fc6b39d7fd47", - "f49977d73e95dd565a103d2cba6133fb01b4198a53fd0f3ee65d6b1c45def035", - "f2fcb3ae94a9458994ed446745015b6552f97c31939307c6a0781eeb9f04a590", - "56da376c976ad3b7efabc47d1103cc5226896981cbce10e9b703b9fb093eece0", - "b2edb73c341590239fd6d2ad55e4d4d6e9ab8add94c900d9748afdd50a48bab5", - "600a30a78ba59af33f7627f4573a4b58db6a44bcb926b368f0c302d1b5233c53", - "405dac41c0c28fdfd982553881337a4d298f3ae1c3fc0683287b34c03dfac4ff", - "5e9779dd9fbba76f1ee799a6d7be769fd175b1798f75c43fc533c14b420bdaf3", - "534a4373ee29a13eeae58366e33a74fea5530073e1410c93f59b25ebad5544e6", - "b33baea860e3ab6f1023a50068b9f1545e8c74ddab915e5c9c1e9fdc2256b861", - "8fcc955e10032c9475f947cf0a24dab5126a4c494d3bd87fdd4dc4406a169fe9", - "1512338ef3e28e5988d57b780d4b3de8077de2111ac5c771e17c4b2fe875dabb", - "d6c84aff7c5d03aa9276cee2b8ff5d0dd9e8245df1d498dfd123e9a21a53281e", - "c28080fd080c93ac933f3e107fbf08c523cdb83a232372a4f2ab047bc791c5a2", - "0232c657e91332d57202059159d8c1ac1309d1e3a535397db850a76ba0bcdb0f", - "23303cec1806dbc258482b4c34d685b75591b51367d02defc0662ed14b3a8f51", - "5a6154f7bf2df6f8c066159f3c9ff2bf222ffc400f2e0d24f6ac77c6cd471c98", - "e5e04b3bfa885cd0d6ef36c812bfff73fba0cbbc09d152a0d829401314dc72b6", - "9d5051e5593e7009dd2b874060b4aee0e0934a68264b3415f374e3ece16106f9", - "ccd5de09c6151dd03047eb2e0def5a9f1a87a76d0b9928eeda91ec54a329bb60", - "10765dbcf30fc13cb607507df1b89f6d64ef39f276236799fb613235fe37cb75", - "c508536fa62eceb24ad75b9f54075d4438807c01f9ecbd323144d4bf9bc66265", - "c1107a1eec244fb849a10f846d0ae7a52db5df3b775f93a49a95cb5ba7027bad", - "10982375252d776f4882bcf93204d760f6c7ba340b20d173ec83ddec789e4d35", - "f74d8136a788a4ae4ed86fe7dfbfe7a46db319a8787ec85b3d9a1de5ad482bb3", - "036a35e218944f034e2be72bdc8fd91cc90e7a21a0064edf2ed0852f0292851b", - "bec98d861c99b7a02f50b5017c07cf8d20702c4d4064af6df6e5bcdccfbbd79d", - "95936b55d6bfa0bce0eac3f06e14e09a2eaa8b521a13889535fd790c88839cbc", - "33658337019ee7f5426dcb7a042e13d4ad6ad046a2ccdde2b38a2982b2d024c2", - "137440b1f816a0097b3d5d61f83c212e7ea9f010e8c15a50ce05bd002ca67536", - "ae436c5d77a0179fda5dd63666b7a2bb91282976ad9cd501ab33e84f51b11733", - "df73056494171f9939f471b6700e7574942ac794d34c0dfbca4178625a644677", - "858db5632ba233795cfc1beaf5a40cc76a746bebcff33609728fc6714ee84a7a", - "456c885ffe7892011a2b7fbbc80d140ef76f53d98700eb058ef7661a0fe9e180", - "ced98f2fa64fa8f7a78ee72d67c91191a5fdf1c3eb9b019816b67a87dc697a6d", - "4f7a0824862297bbb77b1e3ef98e363723f003694bdc70f3a353c479f83dbed7", - "d959c9c664cfc78c09e0349d94566699df52b87f7496d1dca552387eef804da8", - "210d1b7895f96af9df85ce623c3bccb9a42f50b39df24f006c5c3f7b8ff8525f", - "7680d3ce51ed0873651b4ce6cccd3f90458a425c030b3379156b586bb0ebb4c2", - "e626ad78d8e918d7318a4520846de9d365d004e79b68a66d775be52fc6b382f5", - "b216635240bc31b4d4f611a84555e8cba67ef69bd5ed51d4b40626bc2c4e9802", - "2378c36b23f89b712096ff8ffd94b9bab3adf3785a236647ebd58a5354eb36ae", - "fed55d4f8d316d7ce9e6ed400117181a4bdb396f8621d94b11822cfccd257846", - "4dff12f26e801bc60395716d09896391d421c27e895310be6d8c3a072cf65310", - "99f26f14c1547bf0f81113882047786aa638fb71bccff4d523fd53de3263e428", - "2228ddb5eb17fc769e78126831425165772582ef531c073d655f3ad3fcd886d4", - "956a01d80d39cd780c30f65f15870f2d4487f461d4fded22ec2bf64da8ce9ff3", - "2ae2b42792396e6fc787b4ab3d54aa922d4d2121216a8da4ebb39ca870cd7ed6", - "267670f6baa30367aadc7262ec226258b0a4cf6f0c025e3e304fcaef9016d721", - "0cfbdf67399ec942d3c2657e66b0688d86fe2eba4c654dc3bdcfecd2ec6f5175", - "2606650f9c2b870faea74cd37ab8a6be4a81fd30497006135dfa78bdf5a90003", - "e222cd7f020663b188e01b521802924684f8873e9812d072f646a44164d45220", - "173ccf931a98b1f0711e39f7a7bb49b8ad1e796dde6084482268886ed76550f6", - "188814857e3e62da0094a500d8339068481e39dd1d0b9fd67c0e03596b7da164", - "fe3e7d5b5a13158e510b53d48118942be4775b9e564fdb88982c8fef4e3b3010", - "5607bbed32ee1e5792dc85fe0bb391564125f8ff8b6420f8eb7108b3a4c1ea6b", - "6a4a1fd36a64abc6efbeb4c57ed9c2141db69bf593210fefdf1df607122d73b0", - "8aa0935ff5df22d3ff3021381c293dabbcab9dd325274cc654c80ed490cfa2f0", - "e1a232c5c0438e15e971ea4c3effdf47bf9513e3247a7c9d073b957bda2213e4", - "849930f81348f585406782c8715036c8b08b8792f246d2af8283606eb7fb516b", - "86173f83e515265bd71bf08e1639383177aa5ea594058c4ee99723ee6c176270", - "7e55485a557b581063c9736a16ff6f915ff059a4c73982bbe93f7d928009a986", - "22835152ca978f7b01eeb31d63e56fbcfc409c64012516c5ac61b41fe373e6c8", - "ad45375a2da4fc2dc3ee18080791d4f701a06e8bf63292e823cac384490b3eb4", - "82708353577563039681d70c85e2bdb5a45e849d3b793f2af7a19b391c18f3bd", - "30978160149907484603500138a2f4855250fd994e8b36e140ccfda11f725de2", - "d384ba2d1ba784cc4fcb7e387e53b1c62eac73fe0452f93b1ea2f606343bd7af", - "40b2ba502d2611922fd3f9ae24d374ae84d96b6a602ac30b535dccad1cd88d27", - "c18f33f97b286bf09bc6d0cc0fd96f73d9d4d4c5a744f8a3d521266cd5a24861", - "9c3d0b309c76760a89750924ccc03c925264b5dac71d7a8d8dbf18c3d40259e9", - "b1cb4754c57e71b2499b13e56877337e8ffbde729f6ef71271f94875c4350259", - "b3461f9c0a65a78352fbf8b0f6cef3eeab40c4fb8a718d0f5ca83e29e938f3f3", - "b9eb2998c7eaef426c7f9497ba7caf1ffb32f8e17e12197f80eaba432b4b6d60", - "ad8ba1770fcdeea8e45fd35154eb989c48ef5a3028667e42832231ab2e0b9fe8", - "ef78e639a0b49aecb1624e8301d14e37a969a63c722c385e23bfd46f720ee8db", - "ceb0867794f92e0b0a942dd6b1934f7d643ee4a5ebd841f443cc1bf78fed520a", - "f453d8e2212e0870d94bae1a4de08b10f37d247b63d77bddfc37a1c8fb52718a", - "1dbd7876f50ddfbd579c45964c2ac0ea170110e56ada370f73e9985c99b75942", - "0e3e3b7ceda397d23b02e30c18bd4dab4445cadc21e44f2fd4f89b34951536f1", - "c4bee2286d3eabbf3ae68d70256832a942830b5e6a8cf2a4b8f351a6b42904aa", - "25342bc5cec3ae07d4139f3fca082146d1a4b9e533c288e31ab00cca4b697ca1", - "ba6ac50e0fc3c34991a06546688fdbc8d9a4285103bbb3221c84a83538a4958c", - "d53d50a04ec72274c69a67f05c04aacd970b48542e7041cff9a4549bf7d9f114", - "4b17ee0edc45e4bfa7d75fc27d6d7f4393423639741bec183e1d4ea091ce7a56", - "6a1ab92a48d49415e1db277c9a9e00fd4da25ea0f5b89b355a82e0dc2c0c9ebb", - "3e4e78af8d51f1e410c6e1fa1978b23702cf079c54e6e48e4c89fefa8b9b34af", - "9464bac8a18706031180d2f2b1c572850c9f5173b03497544bcb4c3d2e57f8a3", - "e23e0de94c95f740eb07045b6e5dbc9094745917524c7ed6c812596d8457bd38", - "97395c4b27d41585b63e781d68065c0765c247c37239f4a21d5c447b344519c6", - "1f6ec1a9d517d515ad1aad4a1aee097fe3dbac0077d7f70bc56a8e259da0b361", - "a771274f4f8ccd1bc65c13096b84804b007193f50cebf135efbfcb4be70d54e2", - "18ac0a21b2310c79fca28d952e7a6fd3b740628b6697f0f853879cc26685550f", - "1ee1e729967042d8e68b02558877ab2b574cacf44143c4ee2e0bbf066cb1ba3a", - "88d5d380489a2d1154c8f0ac47431d34bf999bcba69f29f269e1b524dca4cf7f", - "12078b64ac58c14f263ff1d4c0fcc29c0e105f2623867ee9c01ea8bb3ec802f1", - "6e0057b7e5e9696e64ae863f59d147b16b6d0e009a052ae06ac557297e9df960", - "cde79d9f313a01813cbbf38d64f78c771297cbc1089d4cb7adaf0d1481af168a", - "f34e5a63a6bfb78ec6e11e43207a6f5135656c49d1769dcbb347d9fff8564e8c", - "2a3d1582118b05356b043edad25faed4536364529ca1862216425051948fa364", - "a343e512591f8b411a22b28c0162c7f84d24150548b96745373803c08414b34b", - "5389a30660d40ffc7d22127708ff5e5cc9d9ca6e7b9ea0df97b239c4004093a7", - "80b8e29078bd4d1c3b062f74e85211a83747bc808ba01ab2ad7b7218cf1048fb", - "6d33109e1cc384b47bcd6f30800f2622470716829faab9adf888980467da6051", - "3af551d08d312549ab8440dd18846113f63d1b7dcb541992392f92424c2815d7", - "13dbd716ef1e83324b9b60ae12a2b987975a09f2400d34daeb3350843cb2a5cb", - "13ab317520db9f33db930ff421e2522190ad6745621b3dd9fcb8684510700ae4", - "d842bc7ed86b9ae919fe6e863fa2ceb9caefae83236dce3c15c2956bf17d17bb", - "e17748353923f950e455bc44a697cee42f7288292bafe01b2f5586b96974d959", - "b4d5607e3dcb5b6422e43216fcfa5146cbd9bdb9acc458a4bcd401306d4a783e", - "553069743d931b7a1cfe61351a4e1a069f1d6ff9afacbec4b2db27eb8ca95630", - "358203090294c09bc14efa217228fb7d853f819e2f28c47d428046a1151f2304", - "dc6f02ea9434b46c3a7f470d0f09b1f383cbbf826e8fc388f86bcae2411b1658", - "8ea4b466f737dc4d39d2f0a23fe86f437b06c3aa5db7d8e20f6e84bc755bc78c", - "6b7e5cc0e2ed641a790b917be3083c161c37e6faac2974ce2919a95a227dd2bb", - "9d9920ae5990ac1aa27d5cac421260e8c9df3d31da8e326807eb7cf1f6e0c639", - "c2bc55d582bb51bfac4770f7e5c15fdc248f4867f4e938eb96510905cc80b081", - "8ad3ddc1558acb1a813f264f5528a6bda4adc8800193dbd8a7deadd4beae76d4", - "96c720f2db52a38ef200c0337e38488825738fe1379be9833b5d70d10e9ad35f", - "30269ed11498dba8ebfc77cc127a298b2ade60ef54f787ba2b59ca69ad9a9891", - "550b80256c7037e838e58f79f1b872eccf91789a75a7741eab3e257c4a604cc3", - "e733bdb3181bd245d10f2b6a03d3c7adce8cd600cfa2fbb09b0b351de9c994fc", - "ec1c9a5bb5521b3b37a0523b83350cb2648c3b4758e5ee314810ff738321f80d", - "bfacdda4a96c3ef8e51e3deb7112816e1057a7385c5f5a8417e73eb1ca1054b1", - "6421db355039b51dce60971b25bb51aafd1bfa2c229263b3e9a0c8aa16369d4b", - "52c091df4453ced6be4082856ed8c2b8b262b881208a6f9a527beaff8c157c98", - "5339660112ad4b705c906863bc550d494903185f1e7b30e990c8f186dff06d56", - "47511c641617040ef597fdd892e539536b2f9bc1b0973c4af14327b997d220cf", - "8fd22ed31ff585e6c4e4f5379b894efbd072a7137b8a729a92902b032fd10f0a", - "117cb481ce19bb9f6b1680be1be3157f8838c978635515c37df3b3bafd875e77", - "b380ac532ba0259d47b6dc0d79af49f8340360af682204fc2b5aeab8b71ded1c", - "4e651cb1a611f7f5e7802af7374bb9b9b4263e2e5525a7e6eedbb212be51eca8", - "06da0c5d8462d0e07041f779e9c6fa35bf287cd500ae277faea014506d41d83a", - "4bc59fe1ec154031cdf5a006d40af728d9054aa78283282241074f0167ac9451", - "a955690aa700343714d74900bae6062e7b4b76ad2698f7829af26ae1242898d6", - "e6ab90943ffa2183dd828d833029adb1a92e8923394b7e6ee968c2209d54c033", - "061018680860ff2e45115412a6905d74fe714cffa400ec640a16608e35563ae6", - "a52a16d69b62b32a65f66751ce9b165ae22a1f45e96e8eec5da7c801ea98bdde", - "8bd7e568fb97cf750796720dcdd4c0d81d3424d73f97b9f11bef254e29cb0ed5", - "19ba7f17d96c812e5be67d400d7b1b5d6e8991dad3db210d220acab5b92c60a6", - "67b8c179adb6b9ed36faaf385611b8b503f56c715e302a87606dc8a744e96fe8", - "053dd06b942fc4de2e81276a1afb370e115085ca94598c2ca49fca34bf83548e", - "1ff6994abc96bec35e65c75f26bb39a0a39f2e91681d61032980e552d3916387", - "7f70149ba753250155790917250adc214e9474cd484826cc8de1dad9b0c89db2", - "217f85edea9fa8b1962090757241989850f85ad10f6580bd564c8e3a0f8ade21", - "0862582c260f7aac01c83f3e6b821716b24bec2a9cc204e271e1c97c618ff9b4", - "736477e1d8b194ec953d2ceb00e8ac1436bcb913ce07763784563ff1353efd40", - "11040a1aecedeb6382dd794eaa8fc27ee247789373df127d9415362c79fd115d", - "824f837008fc2b2ed6cb867629195ecae5d66aa21fd13b98b3816efec4776213", - "d7cb74cf7b92feb2bbd01b586d8c4378cda8f5934c356fa232c7cf98689dd793", - "b5e78895f36cb5138f9305e378df505d65108fa28ec02dc10bccdd0fb91c7b5a", - "c913c68200579a34f1f61346e6323017253b510848f312e0517c5e322d535629", - "1afdaf05ae1084f2471ceb8c40fe83b4c8e38c27d7b3b8add583fbf714842a38", - "f1c7d32540b0c1f5c8108a28e52d5013833b4a7d3747d68cc7105c85ff72b1f1", - "324bc1e8a8e1709c86a2419fa60da58ab00d581b6796f709cde441fe3e1833d3", - "a20e90436e1a1479905444e984c5444da163e5965b92aac02fee672d992b244b", - "87302e25bcc5d3d096270dab9b0faeba70eb2dcdadffcebb66314d1c39d22318", - "9e1cdf72f930924703e05364963306b1096af2d98c8dfa1f784da547baec9ef1", - "180ff069b4fe2a7b2a755019539d2dd4203e411174302f4739450762354e5053", - "86f4be2d7d0e7f72607b45e994d50d0f114f7a61bfa6a3ea8844a64c14aad233", - "89cfa215997c53ed720d94a1776edeb3ddc496a3131ac35a03f423e3fd3317e0", - "be8c28dc0f07a79e4e538982cfcb0279d694a46c65ed25413f7fe39f4085d836", - "4830e169e2a42ccf557c9c0e03fe395eb7bcd185f433560f7ad5974ee04bdcf2", - "714ce4d8a0559d681fd5206ee478ed35ccbde7f9ce53a3e00921e5cab28b5309", - "fea78432716c02e39964ede8241cdc956200b7a9a23ba8fb9f17b2791fb85b7c", - "c5552687e996ec9f1079b200f0a94a1d2dfba6502ef2e074cb1d8cc2fd9dbd9b", - "dbd37bed35b6c92be90ce57f25f8675bb4821c6f3bd0ebcac5d1b4c5f274e01c", - "ef826b655c5eeb732b0937fa675b7941ee9e53dcae3c645da4720286a484fbc8", - "ed39dbb93c52bcff6db3e46e90456201e8f3531aabda0eb11fc3c6c008eff775", - "01955b4c59fb5cf653197a8b89cbc2e4c1dad93b38c489246e9436f49e1f0c8c", - "51ac4086a839821118f1f5c3409c17f23b9950926b4479cf1560fefbf87e052b", - "7f5fea4e3593a38d969b096de864a5bf488e3b7c21a89de88f4805e45924bd3b", - "821051fa70c1c7221755628f9d169e31aedfa7217c063dab08eeb82bf7003d69", - "0092e502db706db238a652346ecdc1e90088678fa90f452c29c78ce223acddbc", - "3fddc97ec1e1ad726a7d23860292411211ff5b4182958d4530efedd67e6a45f2", - "8e580d2b60f87c72f2784dcd0f4d681239c8b1b301283a0e34b4cd35945d98b9", - "6f2cb56b0d2d1fca9fb8332c44487370f892cce175d75ae2aee7058c153c7f9f", - "ee87569ea0bf819121afa02bef237cb6f66bda2698d27879f4749d9aa8648f90", - "e21cb4aa5a02c03de935724560aa223f864b300437bbc96e48f97d27405bc80e", - "f907245355f60288969d8028f1b63047d421c444f873cda398fd991043f564d1", - "3ef6a14dbd341dedaeaf635534a0b9aa8f21ec37c4ca8a115bdf2653f5afdcfb", - "96e2d7776417d9b542ef6da508f3d96fd56beac4e8de6bb96afd3676f418bb9d", - "df793046a6d38ac615d72508022bff305fbde6b31ebb5faa63791e91daa0156b", - "e7c919ccae5afa4074d2bd3631e34e5ea6582b3c7de337f86f94fee45d6bd1a0", - "89ca71bbf2421e78d47a4db76d41e23b710d32b0a76af40c03762703deff5e25", - "7f6e29a7317dc0528602d1de8d268635796808760b9be92fbf035da1dddf83ca", - "9db0261351b87a7100b2e689ee223ea536e483d08583b0e6337359d5a9498ff0", - "d3399df8d8f137d2cd6d832ba2e4a13f7994c18c50081e8fb7d5425b0fe6a038", - "26882274b71d717dcfc51a9b484063f62c27506cc3f44f5289398080eea5425f", - "7e981c5aa694164e39ae171cd0c53f8b58b42ebea00ae4ff7e0d1026d44f9534", - "9a869e93c2bf9afc1ef2d5d1654022009e22ba214d7af314a48c70e4a600b026", - "ee77803791f5120203d0b45bbb7ddec5ccfbd887997e2ea255b202fc7240132b", - "40373ae028b1b6b26d52bc10d067c77b05e093ab4e296138eb0565aa6c9c627d", - "52ba99c76f6bb62c71a3a680ea8ed58c2cff972849ada4bf7d56d12286206294", - "2864908eb3d5ffa26b97ab20c6911fd517e1b3f9395d3db6b4c7721286c9b189", - "f6a9a0eb82878797d00b2b4e19a08dc4cc62e43d9894e95f29eb7c8cdd5d655e", - "a724b4bab9baf9b90911586615a6ab92b24af73a8d0a23afb6aceb6e4ac853d8", - "7f1a5b66d20674cd9329f9776fe4f3178a8bc20cf97ac5e121a5374661d462c7", - "3be387fba22199ba60cca25c49039e8a6fa3362a8c3b3c068ab36395a6c3826d", - "19d28ba71907492b695aff04105cc64a551fb596ebcae3ecf79d4dfa31f2231f", - "dcd7708d026dd54015197043346a3762b370d99cb40d78b3260d26927426d136", - "edc18fd5832c6100e40971bf1d5f1b5fab85e03ec287c0e14e8425ceca2c0fe0", - "47956da9d478bb05c49360a4d38bb598e04d2e1effab91c4de2bfa78ababfe5c", - "1aeac905af38413e39e9612e28eb0951d601dbc07a9205927a050fb60e735484", - "78c65e1ffac4fb94e36fdb9bd9cae6aadf36e9db2680e60beb8f9ef859edbd58", - "c835002daaf5807bdec93b706f4bd46e7471c70bd8f8d41131b0b4ffb8c6aa4f", - "015af7d93da89e565b5eafc289ffea70b206faa1444be46747d2c365c94a10f5", - "d855941473a96bd2054128a82d49178c62309676eb665c1cbb65aa1d8fdbcd6f", - "45ba85028759777b7a0970bf332fb8ccbe92f57e90dffb852cb57383b1ade40a", - "5ff9e523e3b880c898302ba1fb976b46f2b994d7c4ca1c4d33477b7247f1892b", - "ebf64d3b51605323e5953c1ec89ae6b3ef3a77316e9ef752164f0a7c2c3d0616", - "7cd6e540ca02bb183fccfc59663825dd8ca26f8d41da6a19191dd1c5fecdc5f7", - "bef84436aeec816fb5c7be3935b76c568b36b6973c5a6a9d4d4d29db1eeb7d5b", - "6c3c31a4890b7d0021bb961af844b51d6c6269d4a255d17cc8b5c3d5f5c75e0e", - "6772d6156300727dc522c54bf91656cf0fd8c930280e741a4c278ae7e08948db", - "4230f013ad0142161bb48b4422cd0c5d33d5233987865ecfccee724a0e215749", - "8daa9d9338d888e37f3ed102b2cb997bce0c2e348e5263cf5b757f9e3b220e30", - "5089e9996184b49e7f90d41be78dfe251fee9d391b69581c31ee49a7e555adb0", - "47fb575d69f4bb312b1d46bd81e60760516dbc8418a30159987272a738ce3c51", - "e6b2b3a9687cd042607ee866f65f99e5807a45d32d10b44a1424dd119160fbb2", - "970e11fef4299208dd3348f8378d54be28e0a2f174ca200229cdaab0023fc9fa", - "551dcd7fae51f53b7bb297ff524fa426345fa3a32a7b411e9fd4932cb52a0195", - "594ef0475f3e12e71b5d5ec1e93d4c3ade4d7572376b04b054a108c2dcd549db", - "fcca7dc45939e4aa2f296e40484d4898c885c2cccb71732fcc148cb23ce7cecb", - "72a7dc79427c1a3158f0de9df3d70a0cf726bb6ee86b9d27acf56d9e5c362c2d", - "25ae8bf8cef6103db6dcc79461cf87b6cde59d617660d33739d581f472f9e2a8", - "3e5e1c100b45673aed392905cd2b35d6fdc65cc66673152bba8eb0f5a144c3ee", - "1508064912ae70d47cfc4b882f553fecd8dad14b9a65a2bf22cd1fba76dc27cf", - "2b261728d4d863860766d07ffdd056789b2add68207d5c6421eb94689078f943", - "b09b2caacecfb29f4c2428efe95b61e5f77ace2a02e3fb35428c16c8da6cc1db", - "bbf0a31e951d0f0b6e213ecd8f357eff84b4552d8d7efb38b4d9711cd3b97410", - "6770ee11702f88702b234f4ddbba2e4b16c3ca732d9940ebec2f94b8a058ea1c", - "9a861cc33495da3e15be743d8e5d136f63091375a1c83b84bcbd2accd077333d", - "54ea76a0f3372b4917590114997ff5a88f7f050f6ce9f63db81a16d19b73834a", - "55e4c97e60fa089f012aaaa2e18d147d1e22a5616e9d2e1962527b87ea9a060d", - "85a3ddff62e5747cd0b22211fe2b2d3a68360780eeeaab656ab50b7e17f55cdf", - "635a8aeea439d15be137627073dac0c6bfef15f23fef8d7f31b40a6925797e3d", - "9dde37c36c66b62697b3bb84131a3c391c91201dbdba4d8f492a47bcf7b9a10b", - "874e244b56412062b42353928abe9bfe799194c56e9c45ad9ba2e129cfe01ac9", - "c7fa2ed3ffb4704ecfa2220106a5e599b1b3ff511a95aa8ecb550fab9e78590c", - "26dabdda132ddb13a940a951f3b78031d68e29cef7329799884f76b6cc195243", - "0961bc27b0ed3ffbafe77571d2a5e98904811c521e3db7d6beb0865919a4133b", - "28e8dd7055e43e4ee0c17e1be4ef8303ceba6ff20a614daded230b69b393637b", - "db38b54fe043aa8589a620128769cc52defbde551622ef6c4f19fb3bffb5dc26", - "bdc6903db2ded3f10bcfa703c2459c32f7372ccf4cebc33bb466d1b5cdefa57e", - "38b80b34c8353629195eebd8af39277ca0cdcb2a50a67b9d9a561756fe2e2dad", - "d18c1b25daa3ba6ba0597515eae9f8640c6a9dc072d9da0808873219ed4c9278", - "94063a4e91b2cc7d0b195072195b9f0cc39ad2ead6acf7b34d36190e12c76ec7", - "d001c5eed1fa2598a04a94a9662a2e396bb6341c1695d33b9aed49d167325358", - "8b555d1c4b3ff2a03dc04fc681c9f7f07cc293fc2753ca4ae1b13c086d3f4b42", - "00243475e183b8a1757f20c5e6f97f03ac3e0d4ab21f1b0ced18db64be310caa", - "2633c866e4e900ea683ad5e2d7336a6cc070814186d095f539e1af03ac89e363", - "5a1130717fc588aef2d7a163d96a338ff2b0369d7cd021dde0619ec4b90c620a", - "a5dc4bb2362e3569279bf70b1be09441a998149418bbae0ff882dcc6c69154e4", - "9efb17a2a55f77b1f641a81eb9d6bf48b9c6669244343ef781149acb2d3b8c55", - "bde6525a55f24fbed79b0627d6247f5fa858507feafc948852390778c3a9a3e5", - "f701b314ddcc58e5177095d934280919cb802fa065b73a46c8310339e23b4f3a", - "7c4d2a9edbf2c656e1a7a3156465886f54538d3257e18555b6736be484e213a3", - "6c14eb00448a1aba0efba1735634c61e9f40789892c122e0a8d449a5efff510c", - "19b40734c8a88913ca3d2db27fc73e1f8224f5493137363ac6966b3ac690bf00", - "17a19fab884a98c58d03592cb6a6310539eca082cac4ceefa08835039c33e166", - "2a084e04c5167e813208b24cdc20351a753255566406cbe927e2016794db319a", - "49ad246efe20fa575a10d59338cc4ce74b5a166a58678b2d4c47b50f56580e22", - "0904f095e894b248ed5109160c35c2b6a551a626e2aa05355a7892d387bc643a", - "b5bc2eedc4245b586ca61d15c763759389a971421f6461404c2a5e9a7b24cff2", - "ae735e112c7a583b1065006b6c5ee047423911b061df707ebc96b8f977ee62be", - "02083e0fabf360b418b85bfb79ddb5435533f541f5a7d0f761848cea8f95de54", - "d358046ec6173f1242f32dd5634b1ef1fcf5645311e01e9b74e49dc163fa348a", - "0da627ea4cdba0f39b2a7e56eb8ccdc35d7db64221231384069dc422cd7e6907", - "57a723e00d3e27e3f24e881edb68e91ae70800156db06aacd19be183539adcf7", - "286c53060e006545d8ea02ab65cd574bfae9fe9837029286812c32292cbf088b", - "ef3ec0343fbe4e353ad5ee1604641d5271bbb88bb85c1da651dff7097cbe70f6", - "65d49e6d3e3100d39a8541b2aab4598df773809c8f1ab699d5d893670166a218", - "ce76fef033b0e76edb60cd821a640827d5f48d588ec15cd65f8e47be63ac8e7a", - "422d724df27056311ccd3d4f1867848038cd88c752d2827845092c90210d8ab2", - "cf79f3050c2c3af2bf7ac48a4a389f245c327ad27ee497c557c81da2ca4c5af9", - "9009b78cad0b43bee7bb10bbf51782ea63949dedeff457d1387b6070bd13072f", - "1ec8769e0ba997d2181ce8d4c4f1d9cb9841c9c08f40c1a452feff5ec5ded7f3", - "4f5d11aab6771de9cd8868bed5422e10b6bfda4d9d731871e7326f88ec405528", - "d21f00e2e38094786d103f178d815ade646fa5debf6db11f266ed05ac92942ce", - "86cd22e04a194910ca8f81074ed61f444dade9c73a09639f6459359cb658961f", - "c8095e045b59a813fe32f24bd648834fe050c7b23ca4113505979067361b9f68", - "a4e67c6734b618fda8f5a1cee2d6d46c21fa2c51aa6872668df931e57769d094", - "502f45d71062bd2c62e7d50db6e4c8f8ceffe50a210fbc4ad08b8d71cbc20540", - "d58b885485064915bd5a27ede0a9b04a1a6c7aadbfd5e864e9e7351b2d6283b1", - "c04c3c8b4e3ac548aeedf584dd48f1a4cd1f472f746e0f408cd88ea0f9d6b292", - "1161359c7beccde34b579ff7970e5db44ec58f05502c523fd81b5cb1360747cf", - "9212eefa568137ed900e246ef382c5165e32c6c992be9ae08f6bc38a40208bbc", - "d4b0ead96deb818bb899b256ea6520645c6cea8edd2f50066d93404badcb79a9", - "959dd812c84a734b9f2312faead292f3fe05fbd8f96adf04afffab11db04e223", - "8d27a196986928112e162fb0ae4e794042f3dddeb6f094b93e09c021c2839db0", - "3289cc65645c60457c94fc81465855a7e75a125720f8df259da25636f2304f63", - "c6e99de9a361581101852f69d16339f1fc0c6ca04ed47a118e6a8e3b1eb029a5", - "3a6293433960e34b0feadba457ee9d65aaad128063a5d3a296fac08df3d63902", - "cd486fcbc56ce158e483078a9a498963deafc8439e44e045159282ae191febf6", - "8ceaebd6838cf19732769f5fd4a7e95ca73e3f8c917ddb83138d7f895c51aee7", - "46b5a536e991ec1adef2827b104a79d4103380ffa4ddd542eade983ce5e34b9b", - "dc5ee552c99d94fa4a970bbb7a705912ca7e7a9809b277a100a466a89ff3481f", - "6e3d7b8ab90c2dcf7c7137188684083113f5d4035c2ad6710cf8af8fd85f1af6", - "09a2fc5731ea97bce40edd58144116dd10a6f801be0fe39f2a0482cf92e81655", - "e91623c16bec7a42b976728747c2662c66d9f9c995e8238b5abdd0a863d83a8f", - "8a355e94cb4c3cf5339436fbb99cb1797518c9e99979e84edd5daf25dcc5ebba", - "e7f68883966b990658f359ca5fb7e86a388cbe1b15a2e4b351a6a8a3934410cc", - "b3f0659e092b2d60d98fb31d7fc9ee4b0d72199e9370dbb7dcb3a104491a7c3a", - "3122b8ec3a1380f468e75d11484501f725d765430dd606a1bf4821e3cd2624dc", - "51421cbc2105442c79687951c45c585fd2547459f96e7505cedfa1be6dd8bbe6", - "829e42e5d980ec03f258442a0b6d904d1aaf027d22e4e3c6efd6ccae29d9be91", - "7bf2a57b3e734d603cf8db43c258208475ca9b43802cd59f4aeb4da4b1d9a76f", - "29478f241eafe81280c70f6011bdee374f902ff6160a726d2f5a28f97049a79d", - "953b7d42ef19d3caff1a0caa9598e3b255569428aefa8e6c20b4fa8420c9ecbd", - "3a4bbbf04145f14f8c82fece8d38cf5189eadc5a0ef5a276f604746761991cbe", - "f3db6a1476a4d9aefa6da7f2ebcf923553dfd28add4b155eb938ba8a7429c02d", - "27e009142f49d1aa9e6fe555b0ec74cde602e73c358c424d7f25ab11dbc43af5", - "7a7fdf963540dc7222ac6e88f27bd0b63e3b882d21be01a3678e9c9ddf81ebbe", - "ab61267567e16384462893098c27dd25d2adbef31e60f1a53994ed7d8dd4b227", - "e8593392334bd76d78e638365d6a8923ef2a52e819267f31911fd404abf3113d", - "92b5226cf1f8426a7cc0e4cc207c0d117b562bb97d2d4b2ba744f8c51c5a2c54", - "384f8d79ec672b74528e20798c5143d16290ac6206107f164260047cb752cfa4", - "d45024d2eb7be0fd037c54b8d004e90b88088febe3c1167bb6b613d254bcb6f8", - "25ff71cdd1ebad34f04a4e74c3a578dc7955ccf3089b406df371e5eae3db7553", - "f15dd15d2ee4e989b8774e4aec0d5b4dd871951390b4fe45a68f1b8e8198b9e3", - "9a232aef7c1912395cf6cb354b01574eada71d55f4eec79c5c5b7c65925e6539", - "49a4126c8a765c024c49c21b9c62696feb8a7a59f352da56c3daae9b8ebbe299", - "802cdfae3d5d974a6539185c14c3114ab44ccc8cc86cd1ea46d8f535eaae1ed6", - "24ce86e062c01e42db37018f5b75867ed2dc02f21697f2c2066db4b59aa9f0c9", - "e50258e038ad372eeaab37fe535e0a9f4979d5d38ea4a8337848fa7600ac3d4b", - "f332bbd45d8b0ba7f91c350d065674cb86f7203050d776449089e7c02fb93ae6", - "3a3ce28da5bb0595e8631d01cb9975514ea18e0263af0f4aac407d0bcbf2b920", - "4aabd4e454d05854b05a8630904ed2c6110bfa5a6a1050a32ea759fe99fa7844", - "4009c63cc383f92f065e127e3334c98dcc905333b1719c90304d22f5a471d88f", - "d8e0ad009feecda7df924f1d9494b15034b8119b25276f21c4a4bb54534df995", - "ee7bc30b72e8cea15ac9c5be748f55fbd1d4bceae9847657e8f4a254c35a4623", - "4b88d2eaf55fc9bae6718a7cd86d7030be5669feac50b091e422c4d8b7185083", - "e48d0220e57204b6ee738f26311f7b8b6bdd92b04f8c3252a47f83d522523ecc", - "b6e3e4a0d800f5769b4f5f638225a02719b61f0d94305b553ee382b8ede70734", - "4052e5eec783c86193eda50f6e3099492e976b0610128be4fbca44cd46014632", - "69e6049fc6af77a5bf4eeac06f6f90e64aa701648488fd79f6fe7b4c581b7dde", - "4cfed1a8db816715b9bf486a6b2b749dffd52be1fc802ec4879fec311c437210", - "1b34334521e40beb695176343c66467bfba99035f1c01813a3649324c15c45d8", - "cd5f097c3b2dfa0e7930777672ca74cb080155f03527e2942b78721cb32d0d9a", - "d6c06771ee58201c08bbd14b9026ebd075c7207fafbd50fc665d5db7295739d9", - "20c5d46bdc4a2ad8e3361da7582a3b53302513be3731108f744805123216f63d", - "5d307de0fb504aebd34743294dd5b97ff669c68ba23b8ba795f87bff5baab293", - "2b0cbbabe8ba0c501f2915039503ac191ccafa103bd07a50a73623e154e8e9be", - "69dd481cb870ca30fa21ea734998aacddb38cbd2c824e8e86a71839ef642537b", - "f71e661e0f6737880e4cb640a86fb576e91b7209963276f8221b815451b3e24d", - "6e9d48308c74ebee963295e79cc4435d5024ce050300190245292ab04b069318", - "053b258c5497902eb63d45259d2fd4f93afa73d2d7ce54043aa5861eacfca13e", - "0cb135bfc4982e16a10ef02d19587a5efb90a1f444801be76b4ab4698621f1a6", - "4e4ddcbe1f55c4dc4f1b524d42a18888c97aa06a07eee2d115acac1986cd02cf", - "38908e8d38b57bee5e37f88822d654a261924b5d7395e5e35e7f380ae4168f13", - "5be215f96815ab67548b2c951395ca297866bce98b30c1a477b757073dfcaed6", - "c5af7e85cc5d4f2e4828d13609072132a9b633ffdbd7724f40fdc3c8f8415829", - "fed2c5fc0559139d24e425642d0f7c40fe9dd13794981b09d89fff4d5f1433d0", - "20613946fcf84c4d11a4811751039adadc11a00767274d48923ce1e1afe3c61d", - "78517f62877ac0c2bdee4154ef0d1680bcaf22e0504e4a3aa8738407b3fdd121", - "1b69a0deccaf7011fa1098489db0eb359c68216f3f37104a83400b81703161f5", - "2a8cbab61db25bf0cb06a5813a9090af60c9bd5a18f5db67a15f2e735fc07a0e", - "76c93c6707ed9e8a1dc8799f9cee64304b44e5a66e3b4099e2276e955ce87ce8", - "103314cd2d4e70f0bbb1a9029ca4d53d2868e515e34d34d4f9787454153020fa", - "a5454859ebda3cc3ffb9a733dce08fed497801341d848ed56598ebac2766bdc6", - "04a900be0fce7ed4608fa4310fe2e0102a1d8ce887feb95ec3e30e120f283099", - "9b45bbb902b64b03d4167ba6c318ed3277a872301e6cd00a7d18268e7780f693", - "4970f96b2ace139d40fdcf3d57d78ace4b72fadb17e64851a43130bbf0ce752a", - "7d187b917026a6e32330bb87caef7dca09e11047f3b0dd34862491d02175b755", - "cf539d9f0c9a5733d6b6ea542fa45c4d5081e4d99eb044a382441f8883d28689", - "51c0478f3b213d8a9248bac59eafbe536cbc41ef347e8fe2231598d14e934fd9", - "e5ffc2b808f71c1f3780af6850f2354dbf0d3ccf7d4bff33520fa3515fc122a3", - "680bfb5ea9a012605759954942619531d67f908c842dd534cb94e1d9b17298fe", - "c5ecab992338e3fd3ee932e40de216731cb6112987c3d74283c993e0e842a077", - "381a36c9740a1a79f5a9c64b2429efc6b8d5d89d028ba26fdcbed3b3e569cc97", - "660c9f77732f203a311ab5835256705ff8a41728b7f8a918c51c613311bbb11e", - "c225b9ad1525712ba0e7c95c80661333a3aed57d0fe6b98072e6e29ea9279815", - "6e61a946207036e4c3bee62c519da2ef764e9d6a1b2296d35a986809e778b403", - "3a707f9b5623886cc3c172cc6c6b9a7ec5b3d63ad2abc1e45aecd90dfa889ed1", - "b53a1cea4fa42e3c80c5701a0f613c4cfffa1ee67194cd7375f31d3fbaafdf0a", - "455ca1b5cffe51a80925671b06827cec3e2a904dc29aa7dc822531cdfaa199a0", - "b4ebe8e69be99d8e2a5096a73a21018c509790714f3129366c1db06ee961b819", - "b0a8b07e5cb36c9bc05386a9fb8f7525da1ff6a6efbe2bb7d09ed92d3c4d5a82", - "f117ccf8c209fa15af5657544138f95cfb79d7742afa5450aecdf51a5796af6b", - "6372014bc5dc9eb2b08669ac66cd1938d534f53f66f6ba1aac3c95c69abcf453", - "e7a0b0bf5a08a815c4361537329c2f8f30ec969b0a9e81a8e13b44ac2618ad78", - "7f1725a60305a49f9a6446559c3066c055aef595099320f2fa9c7160561f4f68", - "c2c3a19d5cac932460972222ed731f521b0d54e1558088f85c3f18ba2f3cd56b", - "bb240167231131d846141af2e6ea1b7c55bb22b2c67d12545ea57cf330d6a516", - "452eae5edac14713b75010999ad20c4ac8b477ae51a650be7ec72315a4c7cb77", - "4ded2288a9a0b2a33da0ccc9ae690c2277074c0fcc27962e0c35336992ec560e", - "049f7e05b3227a189b3fad73c5cd442f2d1ad472f7149a63bfa518a8703bc671", - "b8730b73645ea185c660dfd8772bf2cfdd11d1cef3bf852c46317c951ca8c7e3", - "baee148e2291a78d8d8fc376761116f5c8dcd0fdb9ed4c3352a1afc435d20175", - "4fd6f06128babc1499127806f92af860a229c7fa20b24c06e5eed2264f28794d", - "aac0b9b76ac7987fdd99b475b3b079f9e2e325457761a8a141031298cbc55bb3", - "768f3f6470b32f22999a1714838cfd8aeb325ddf6cba212aad9377303cb2eb5b", - "ecba3e540d23714c8c257c8d12bad5d70165c50542f5b8ffe56eab7509e24f08", - "0307b0926216d00f3ace14a91ef5d90a2014a84a1d0e0dd9f79cfdbdeb89d953", - "cc7cfb0f1a5657874ad5e088773f6dad608ee09b9fe4f868f9e01623226aa91c", - "544aa10b2b249a2ba876084601e38c799ecd3a70b986706ca3eda20678c5f98e", - "721deeb65c2f7ce7890536e0d05a8ebfec8dcdea1d82c06a6040de4bfe582684", - "233c8d449db21f688d73588ef1831f15fae681d3841638559a0c13371f4c428f", - "8d4247daa762d9c567357bdc9d9a4bf3559ae98c8943f284fe0c712cae8c7e9a", - "df08ac5e1c0d4f1a0a9a03ff30a66c8e59b077f4e3ec00582d8b70b4a407b5a6", - "e7effe0908c9733890b1c1b8b25f7f687601e552787c2330818b559e0d953734", - "737f5b0c74f13146dadec344b13cd18bc35a06fad05b867997e918e58f562c20", - "9fc96623521f868f6541371611f7fd88d26e6a8e2bb14d215c106e59896388af", - "4a7c23f57b3ed9e0c9fe17367b990c4335b4ecd212373b035cb30ec8a74bf9df", - "30b05594ddd8575b8e75cbdb39ab150778bab3a8429216bce06a1dae9b0dbdf9", - "2fd8e46534c9045c90c351f29e5b4dd06e3e9b105e9ac430b3e8ca3a363c65e6", - "633a24c7e8c5175279b9cd73da56aa8d5d19f18fbfe9be341a467bd1fa14a437", - "2e02e87e280ff9387f3c3e9b07e89a1b44c5dc7aad94535970921179dc775265", - "60cbf1abf8486dae5ebeb04708911729509cfc5bee43dfdbcff3c14a8d32d71a", - "767c304d404571f7e4d34b156fd1d6e6595520a39c2ae9549b808eb902104868", - "f840be3c958c97bef154f47109e07a70f4014e85f984a5d8c204d1b7d576c963", - "374424d8ac9fca3ad496a16859d47c731002cee0ca0cb4b77d52f3ef2a544e7a", - "5a61104468de96d3214af3364796aad1cf81f27b9d22b1db342b7ec3dc53aca4", - "de0927cc5980fdc664abd4473e7c05f8a835b6150eb227ac5d8255a2abc1fdc4", - "6aafa2ca2bb3d521fa16c0b4f3831e6abee87e6f6209239e4d840ba133c4b0d6", - "a2b286df9ec5ec8288063d8906ecbd9a1b99f844ebe6d89919fa373a7352b345", - "5de78c0b62f530ea61fa140ed0fd1171506f45b13a0864a8c120530da56d27de", - "de36537ca01a2593995adeaf6663e8f79c5df78057c62ad9914096f7374efefb", - "1d3b84a02424a516f3107d729b21f7fc36514c27542431c8390f60848e1949d5", - "1951be6aa2b373b9b1957b9cdb5b6e8bff7bbceed9c6b179887de991b57f9de4", - "17fe82cb12f7c27c3ea7a7e3a6a02051bfbdc1f119cfb814673a2c146cd16237", - "6720db32b6988cad0068a9370bb2d515ff52e3d6e13d8c88984246ab482d5256", - "de6df57cc29b76d6491f2ab642a8163677a6def11fe8308fc7c49d250756ae25", - "42d7482566c0412e550b48d8fa030da18936cd44e1283718c4810e6106ed0c4e", - "174212b00781c6ccb01ccfe91219f06f2d959a4d93886c082885c5443c795d02", - "2512db527d65462f2e7f8a4a6361aaf44a02b3d44f187b358ac1298e513b4342", - "0ea851fcd26265b76926855ce68d4e7f343a2a6741cc60e870185257da623195", - "aa1184fd27f49fbc428006064d159a04e42395eb8e2c8319b1e120ffc554df60", - "133886b0e3f42679b75885443592e6688b754533197938d07d9fe379804df36b", - "8b31e6170095ed490e06eb48cd317b91ba3036a449e6cfac8ccb0e5293124dd2", - "eb3d804d6d1a350ad56b840cdcfdc75b5d533355d0262837d7a4eece2bce45ae", - "16c8572d41c89ddcddaff123025379f2a108bc16dd50a1e3474b0ecadc741f63", - "c164fca4e8d9b7a1d83af553ca2cbe48d05793663bd2f3346e9a921520bcf6b5", - "36a21bb31e2fe9bd0760157e9682401e733582ff4e86c2e8c2be5376ae56021a", - "3447b20b0cf81cc477a558ce9bc4d8adf881e62b5ec3c5a0ca3fdda98a6fb92f", - "165715524d4c04e600b1f861c486a895ffa74fdeb10a0678971bb0fb7fa9c2d1", - "1cc3fd5eeaae2c0082aa2c517c57288b031a33b8223476b3cac1e9a373ffbe20", - "0fbc3a22c89610ee27c88418bb41a6f1c72f843026145a55ab5e0118024767fc", - "e89f81fc0f60558cbb523070fe8788cd9c8942123c7aac1f6a0abdde7b9aa6e9", - "2fe915b6ed79808d606842e218cd17a8290435caec856b93679693441b0b2c5b", - "60525d0f81b5c93edb3f4b4c262c7af382020082eebecb4a5258050e2c8cbbe7", - "389caf684e999283239099ca72267f3279ad6e4612e0d43ce682be5d9c736ccc", - "5fca5aadcec7618c816ca4372dd4b33b055f62971e769bb0a2520903e5422aa4", - "5e611733f1e1d2c368f3581e6b38abb4ecac25bc07ff5d4521a98addec2db19a", - "c5400f354541d96053194cf4f8770a7679e8e8594f4a82977ee74ce0a613531e", - "b9b41fc93559906aeb026d05ba408adf400fb7bafcbe7205fdb6f9e6de30ebbb", - "2365522b8d37c09d12a66990b4d666ba6ce4d208285b9382b2bae0f5b058e836", - "ed4d78bff9af22e0c4fc078818ec628e120e70501b80050a5844981163dc2208", - "98aa57ed4926a6ac104e6b68e53eaa2a1136bb6c7965cf8afe4e3b7daa23b067", - "a204843b440aec40bbc281f14e989097536ebfc8327246b22dfe9b6a5da7df49", - "2224f9a90398a582c478ecfc76524d6942a34b1f301d6e8d0c7863df5123efbf", - "547cc0df8ffe6fe1406150c961daceda18ff666f37a2dfb5d3dffc5468a02e7f", - "c2d0d805e250b39312b8ca24f0be42515a8072c4befd869a53fc0b76ea012a93", - "8d5553bf60999e487b1fe922bed995066e5107bceb5f0300acf9578bef5ac23f", - "8003517f93ef91fe65e6824d2f51e55a37f390f1edd4bf88492b6f537111d4cc", - "72667a25b028d025da11de9afd0544eaebc8812e2aa502b844c0660a08cd8b69", - "06b7c20e6c244cf261fda279ec12f11337492984dfb6ea248bf7852201c7a6f2", - "5ef44d8d848ba698d85d577e282f5833906dcbdbaf079bffc6b860c9a1a68340", - "5f34dfaf1a08811f2b9d65914739f84efdf4982b27a5cf60b7ee1b2d465e2a96", - "45869392cb8909aa91c8bcc50f510b16ff72a344d752ef77037f17adb63f6834", - "63c0f2f2425d844c011b5de1e4655b77ee306b46b0087ef43e80939a11b410f3", - "8070f166e51289cba6e38eb7e63d0508e5c701613480df2900be54cdc75bbb00", - "e3559eaf488b852322e18393255ba2fff2f3220b0a9aefc913c8cf3b2940baf6", - "fced030af22f2d6eed12ed334c72847346b61b48ee37fb917b532419efcd5b8f", - "6f1623077ee9a40054fa128c46111cdc780389d23e46672ce65939527c42072a", - "421cae2a43e835d87628ee90562792b0b69c8e9b7b2de1d60b118fb35e6b2192", - "ac830ea9e7c7e2d1b190bbc090f8d7a31e45fd51717974e8074b0def7eb3091c", - "d21079f6ec5a0293afc38d8cea929233846a07be5dcce6da86fa3419610b1e79", - "12dc30b98a100a3b5028418b4242c381ac94175b75449cb3736a522870fb9a76", - "87cec395e304efdbb3955ce93904e9665aaff9ea440295abdeb2cd0d68846fe4", - "671c0cd70ef8a6734c9b15807b979f69e3238aa3d00dcea35ff265a009f4ec93", - "fa4072d46b20402e1e5ce96b049d8b843137ff69c6dc65de20c587485cffd9f3", - "002271b8f71aef63ae09e0ebb1e3c99ad4e651b3ba27ed937e57dbb69e4e8d4f", - "ac70d07d31f07019736f2c00ceb864bb44e2feb034b2e5fb1bfdcb8d44aecb31", - "7e818c5dd8f0ef3f4ce8b7a98de7bfac7c6cf49a98f89b69703734437bb06032", - "dea7b0d8ad6ef61ad2d8a2365c2a7c2a165e9eab40b686dad11f957d350f4eb7", - "c31f57d56f8cd5c0308d02c6ee7932bebcfa0ad72c137453534535b613bfef92", - "da0fda12e2d2fe136d8f6263b96986420a2fb656d0088d2e04bff6b714fee613", - "d9147408f50850f14285651093f7ead1e04f81d336c9f07f60936e9cb00d2d0c", - "21e27b096404756a702284e2bec40ee34a981ac6b1d0afe8d9afc7fd82bfd672", - "6e67fe44606b9abbec868a617c91be2f44cc8e9cfcd1526c9673563f91c69d1b", - "d11e668ef2b5ded3ad57b861a1b1815332b1b5d62946facc6593fb84c4c6d74b", - "258af616d55b80a502da82489c1e39df189a2214177cb28de5e74dfa466bb9df", - "ca2b421756bfec8d5ef2eac7a962dd3d7276f057dd604eb0db3a701ef74762c6", - "7c1efbc7cb85d0c2c4afadd8cd54d4e993033cc3fe0943057c5425659b132939", - "38dbbde97f2e2e4bf5ddc021ccc01534efe7c57225b384bc109362b61607adbf", - "7a33dfd2de8bfd887a72af8a346f4c3be4e147d3ba5fa1239fa9b73fe56688bb", - "e6de260578011b88a21109fdea3f4c496f6197e2a28a559b358281acf5e8d7a5", - "295f80be980fbea007afdc894b9b0fc816edfa93bc5c635bd7e6d6d261f3ba67", - "f1e2505432928e67bb14b470afe782947043e6da9709e67f1fe1a9141a565016", - "17856a22e83b0bfda2c91555ecc84ab524830a0cc710ea209951215363f78c83", - "b95bef7983e4226c5289c70c25cce7ebc6eeebe111c1de06eebf950ae864521b", - "cb78e6ad4e258854a336b08914267e17af991c12a88ef9a731360aff371ceae6", - "c093cf5bb1107bd3ab48e38e0f397b2da351c4921a5f6e97ea5554844ca9c3a6", - "c99b7ba47ec8c98df4c8678f0c8b87bf6f0fcf5dcf27ef23017f774ddcdf9a8a", - "c1c72b51a6a6e3a30430eeabd35ded8156c0cf0343136fda5604eb8fde4f7709", - "ce645167e328cf5570640be53d55e8112818c303c992adb07bbdf642e6f675d9", - "d42ce455aa32daa134117c777c93cfc14e9f1597bc4198c708682c6db08796f7", - "0cddb4f130bfd4e553756826800f9049600fea740f75442bb13c89c6d3010d63", - "10fc66be89f58e5010691c4d3a824cf7c4431552356e228aa4cf2d9c67ccfe65", - "2a936c0643c055330b976aedef0848c27a45587cc32689cd6fb27ca3d841a53a", - "3329114c660eecfced321480299fe8ac8a995f1b0de48e3a6ede80793783ef28", - "ac07c9c2d9ba200c680cec846f011a0a35f4ad8bb9ca9d56bcaebc4409ba6f8e", - "c2b32b4807a20c39cbad93f2ccb0bdb36c428e090dcee68d0f856375d234a82a", - "f1ccc1a3186621a0cb9f0a5a209f429f62f32de86bedc7a254941414318fa7ed", - "d50c3e808d2b40817bd75288ef6cb9a722eb2127725f319ec1518c6da29cf984", - "4b2045633a1fcb255ee30db6cb48d1152e0d13e0463328dca0ae83f001c6a380", - "31b82639914d1c4397c5f892b21527dd7615432d7aceb58e4de3c40b640ca372", - "1085acff6d5d6d452c2a44924980043cc1740c4e8acbfc6a5bef90b3f2a47af8", - "93beb4a9766802bd576d6267248cc64e5dd14855e778b54295391b6e2dbc5174", - "69f0c986c99d6480b49ee18771a98416afa8e9c4768ad519c5b2bb481314e135", - "fff8da15f5ff33d036efe5e421e55e7f7cc1e58e895e7736879297f37515b5e1", - "19118c8e305d7db87b3c79903598eac417b11fdbd5404ac9c8d11005fe89fe1a", - "e52ad81666e4c5a9fb259078a8414df876a238af622be840cbd67bcebc87c172", - "af966ab845d927e8177eba9e235438e4d1c0ed70a25dca4cec3a45c0067ccb09", - "73c5d156adeb3729e02481d1214f09510e6793c4f48217e90ff544dd38bc388d", - "a725b7bd3a6c20a08d6032d0746f2dfe9e6f1e00548accfe185416371dbd68fb", - "a2e6ea26850423b6fd22a0b3b8c93fb22c56ad2ea027d740691411990e8157ea", - "84134cd4a025ea373195434dd4cfc78d96dcd726f1bf5d0fef50abba7b2ca117", - "05b63eb6eb0538bca5eb2de1dbc2fd223901281d0b29abe032c720ad2c11297d", - "824772d24fc4848f41ed4331b30bd84456964fc435c66a33d4f31c459e905f7d", - "260832d424d70c36cfb5429ddb794ab48d91d9395c0ebb743f508acc7e4b91bf", - "a9060db211396d2981a5ccff7b1097405aab29747eec34fc18593798e7112bec", - "59a7412f3e4fe1383a032228a23c9b010ce65371cca04c04313e5201dac8a163", - "9091b935d5f4a3c3fe695a1b686aacb7bbc525a1538510a6540f8bfb7dacdca5", - "15691b95fb47c558aef1a3d058d584a17f904b375dcdeb815c10fcfa4872d9d3", - "3c972a01de8a820c1eac535dcdf7ff9ed28b4c5238b2503797ce957a1ec92eac", - "db47501eb1937e309fddcfae562c17abd33146eb554f5cab2d25f6077b67e380", - "770aa0cff035b4bdbb4682b21f7ddd03d5e825f1938f8533169597350d3fa656", - "26f37bd48da88a1c256d13ff27d1be01e8a48add3705df0fd5d8868ee595b6da", - "c8043f7b0ee0d4910864333ee4756cedae9873175efd3869727b2494a717705f", - "cef19207ee2d5cb29295c4c2ecc0da4d8ad403eb79a5f9b1a58ca818350ed44e", - "662463b64041b9bdae07335806e1e0ca4f8e78b0c038d7f173c254beed37c9cb", - "44a69f6c844d87d086277f7a11baca14108f779ffdaa6a54098dfcf0bfade5cd", - "e07694b36e68b662e13a3b410a8cb3f5c21a8582b6a8b19f125a88deb14a3bd2", - "554ac42df921e5a36962abefacc42d44562dffbb77f1199465596ca2226ce890", - "67ca7c766c040121a80094804eb033d96852a602cdb99484d817e260cbd11205", - "1c6808665a99e2fe707ec5644fe7d4dcdd307c0263fa6d383e3c7b7a6c8ded81", - "89f209abbea27c3033c245c24ff419c10e7633ecf914b90f5184d765799720eb", - "7c185a14543f7145c7e080e52aa14d61bf90d7820ef55cb9f6e2c0acfad2032a", - "b701b1810bb0634f4ef042fb52a9b5295b00b56a6fcef201792a356246636c35", - "c6f6720e25e15c11f09248908767337bce1a6f241c6e55004afde33425fac6a2", - "1e482025368147cfd1b583842c73b941a11ff4a516a69037c414ce8d200595c4", - "774ff4ccbc91c0bc6b2f55e1b403ef2f7970e1ab292cb0fdea754bdb9a69331d", - "6c13a8f0126cb566aa403ef00dffb9e6cd47e51b6e802e6088b0835206c76cb0", - "7369ef690256a375cce616e2f08573d414f8729cad607c529e6edec079b8b110", - "20cee41d650c05475bd66043f04b3a3d3429bb18b5b8c26ef20519326bc25e3b", - "5295797b28cec0a38e47378e84274d0c8212d1865eebed29900e3d84f0b37d97", - "cf407d8e6ab0a27ecf8a205ebf2e0a30c5f7fcf20974a777d20f92be6db4e56f", - "a890c15e723916f86f6a39613ad891c70051cbcfffcc8e1b5c03396e47472acb", - "53c0609f80fe18828913eb627ad5e86453d40a7b6efb5f0e83884cb3fe40c308", - "64f704b0af3ec3058a5e84d5b8b10a3592a611d9191b1de7152e9c9e901c604a", - "be841ffda06663e62749d59a84744a4b24f8d4f115af36227e583953c2b30850", - "b496203cb2cfa04f31ba23bc9b9077bdbe88e72bb148eaffdfff53d26873e61f", - "04e86e0c263ecba8e4eefcd3a4bc159c44cb8781f17cbf46fe7f637adcffd24e", - "7862df7403d95652b1559a54f185a5b75236cfcd151e4a81ec846e7a8329266b", - "55a0380e07fe92d9b97943295f64731c9a4482a328d881eb669b49acc26fdd67", - "9d4429d30d99057c512c63ebb54fe6affdebf37e5b8666bc809cfede3ee146ad", - "3db6b363ac916a27130065afc0a8ba3f5833302b3c2dcac240bdd714cd99c56d", - "71b7437b5c9681e57ee33218ce2ee5e39a5ebc3ec857b04e10c2d30a1e16dd56", - "d866f67161125db5093daba9d28c4b5515dacc8ee81a941bb6fafe66489837ca", - "759632b7063b534586c49a4397d9f477384805fa1dfe0b07d257be4975a76f55", - "c15bdfc25f88d90d9ca2cd5faf3e647529626b80f3b8bb79592b78e6e27b9caa", - "4e82bbba9c8d510facb9390017401fa3d3ec2d4fdb2c022ff7b64cf48c0d4a26", - "8038aac88ba13c929e41950f02057f0b3170529a4db6195275ac6ec49513f97e", - "6995873aa0d48fc316d1c167e420c3ec683fb9888140af1fe872f99da28db865", - "dbf1aa6392b2ba337c14b89e6b2cd4bfbd28215a90d4e0def014a360f5037f38", - "4297eca0740986d517666ba9ed2d232ccaab3d6ac202102dd14b314d673f4e0b", - "d95583000cbca628a7330e75bbf5570fc8d590a6ba2de6bbcdfd68ae53027e0a", - "7565f336afb067ea5fada9601cb4a2b07cee73d7b04bd8d3c730484cead79a6c", - "5bdd32cb1da81a282f6a533dfd33ab4e127853ddc54729eb12de5a916a6c94a6", - "ec87fd2e5a9db7bda4e58bbf21b299f91dea66a308d256141aa2badc0aac6822", - "f6bd951d4051ea6bd75aa23b2a9aacaf84b2ec77e8c89b17a38fe048a5d02fed", - "6d6161bcb944ffbcece2f27e887ba114b8e5dd5ffb078d2daf478d776d4b4bad", - "c301d5bd3b0b3a2c0001964f00439b1aa37e1895d5ecba441a37cafc54588c70", - "9920173b9cb8631735b1f2c028a09c9b4d6e36621b777189e3e4552fef491171", - "391c5d192f25e54ba21b8f2bde515a72bb0e50d5ea787187c680f0020b8b6a6a", - "9c70be507caa9bf2572497ebadd47424f6e073ec82497a8735d3a6c0fa989374", - "2a0aa0b876549b8b0d6b41603c476f21e5dd3edc2396c6c0a8f1fd38799be3dd", - "9e577d29f4c39436f0703a075176a29c1e76d57c48f59ab49bea10a6e30cc7ea", - "bd1e4f6d8648f13e95f40e06d7148d454be3722a81c7a5d078518858fcb79728", - "510d30c0602305b9444edff4e61429b9b7483a754d403a28a0ba50b722c04404", - "617893dc64805f776d04b996b3ab3c17ed91ce986b155e52ca385e327e4a24c3", - "e1cb5a7506168f5984059293f34ba1e227d97aaeb882574fad2162371847c81e", - "0d12ccc1cfb671816a9025dea43194035f69ae6b8394b85a49ab94767462c2f5", - "8175ddab7cc60cc511efa2e704b720ceb0070e3e4de37b35282d403919178d90", - "b5b3b9d69658a947644fad851309049903f872d78ef545a7e6b9e84aaab4dfd2", - "f5862de1a2d364e74e896b54edcf05352d1f115de9c28dbd2103638ff4971374", - "b8f6e891926a01c625352704cc4208b7d61240df921bc0538534c226355b874e", - "b3b740cbbf81c29815995aa1ec315d207443956bd057b74695d99387d9f4650d", - "dca807936eb43810857029ae6ebef26a9e2350878dbcbfe6dfc91ab24127544f", - "d432eb3eea7d3165100579631741876ae00c6002d0c18bf8239727cfb1ef57e1", - "a582bf047d80ac950998dfe45bcb85d37b8ba367c8270674b0db509780903b77", - "1f21d5e33e74c2a6fcfecfe6f3bb9e33461e0279bd749fee89e5253230605864", - "dd22a7d01be30ce7a7acffd6337f8dd6e94a606faf32177c4d9b0527f9d93a87", - "9f52d718b40ff2fe11f2eae2437588297f925a91837ae3041efab8d73f946299", - "5ac1e04563d3027e3bad4186b80d678e9c4a9207c6360725d3fe2423602ce953", - "3b691375e3134d4203d12726eef7e24b5c74f45b020b5785758321e25e40a760", - "3d4e916fc74ce92be1b36922adc340cd2aa77b6c737cae66fdc373bc861f25ce", - "bfc0c87a7bb6f66a8de86205f65141c1346c9780f8b2dc2c4141f87543c9c31f", - "081bd6a1f884f6f6f47c118e092245af6bdb56bfb9fb7a3014539f2cd05f4c47", - "560079aff2b2bc59d7108e1a50a3708c25bd17a6f54954cc464166aad8bf1f88", - "72b911527814f4cccedff624e2a2aeecff11c22b1e34c7d247b24178b8d2878f", - "091f3bf6736d777088cf1677165325f43fbd05c0f1b06d2eb867903185558851", - "e5881198e31808f6c13546d5a56a074ed10d0cde5c047a2c8b2dc85aef43ee25", - "b8e806a1237910993898e11c15f9fc67fdcd8e23dca5d473736bfb508903ad17", - "37e2229831012a99b0290caea19fa460c2750f962a75e4e01fb5f76b3a06cb69", - "a7cab22b08d666c24136f2154185574e30a9be581c84986f02817c56e0ed094b", - "e744d39a801bfed692eef0df34916a9f0e78e930dbaa20049c34941db259b05c", - "50cf24c22e6b05355ce99e30a7baa7ada54634cb6842011351e56b5b9be47e10", - "4a59dc56d449612ee41086c514cf5d0158dce2c7762ced1f93eac8bf04a76b10", - "4faa168a11fad6f13309596a879e118ed5a6763f69c08f9333d7d8f5521a0783", - "981396e1c845621f6b66ab98479862d4a0a5f2a5eb058ad1f4e33e2024fa712e", - "c20b11df82ae0a47b1214f459910d27fa2d7fd44e57202b605f05323141dbc61", - "de67720bc8e490bdb09fcd748450cc7e0c5c5a999d7636f75ee938da53bee1b1", - "cbf68672c4e896fe9af8f723d7577c7057eaacf67268eab061db08d15d3dfdc6", - "89c6628b960975f67f1cbe7f7de39fd96753dd4d07e593763a8b5aaffe89cebb", - "330e8723d681a0b3f54ddd26aaa874f8d0902e0670334bf3f857cb55e59b14fb", - "27e5f8d15ab9e58b659b9ace5b29e43f006b872a8b3a02d22bc0b7a6996665bf", - "d2a3d5742191c095d3d5fbef21f0c419158b430cf38691b74ca9518a7d72ddbe", - "0407e7068dcb15dcdc23f7ed7bfa45fa120792fc66e4e65b12f46c130ad64bc7", - "699f8a10162228152762535402ec8a774d00c334615ce985ffca3bc032541662", - "9f9da7647acc953309daabc1d06b41cf5403ffe34dfba395c6b48eeec03d84a4", - "756e46fdcc80ea473cc22e6568d5d7889c58ea5b8bfa3cc937fd17727d5a4452", - "18a577b11ef0761ee8e6a7f3a85ba686b9758028993b8ad4d21e327dc0a51b45", - "728b137dea84d433a90eac4f7695d0f7866924642e763c8d76bc3ce47e2b3a51", - "fdda00a0a8cdc2d1b5631ed073be396cc1e0e55f01b47f29b5d8b6f65190a408", - "07714fecb585cf91e0b83f7e7af1a24a322bb940c964bc0583a6fcb965264271", - "6bb2259d64fae33f9d6168cf52850e593887df7252fb38d01499d9ded506faab", - "7a156624204c3638c14715d2a9960a6cc781186d8de029f71c91011a83795d18", - "1604469201fed14e82a59ca9dc28a27bd84a605033e7cdd9cfd66c64091c3629", - "e8788b6d9e049ddfefd2374cdac2be4eb406fb823e0d3270cf48f6b05155d41a", - "4ccea416551bf246d532e77351b48bea1ee02cf99ec729ea5985f2a139854dc2", - "47954dccb4740d7c7d1f27400412898180e45b1e98eb9fefbc6902c0d735c242", - "3805beedfbe3288b4611f31721e311dc32b49f368185be8f1636feefcab06788", - "0147732ff68bf9bed6a077297ae8b6dd158d5a0e82c736fc2b393cbd186ef012", - "5460fae9ae793b8ed0be00dc7a6ab386779f367174649a32643f7ca2667258d3", - "4a1cf441643e274a82d3ac520bedcf170ed27e32a8feb2e7982007b1b08eba46", - "0eade144566bde63b029de7c790bc97315172f1012835d0914aac9d06da8bb46", - "fe9b6541bae56046c2b9d05d2c910979cb167a1205b67db588e7d37917e7f74f", - "cda4369fb12d5e7f9b224d191914162d14431115a1875bfab006d7451336eb95", - "2e2053e3706ce27e938b7246ef07c5740c6cb9b87a8e4b04634d6d78169c1a3b", - "2b82cea15459a33e3ee0ce036c5997f9f1945b54273d79c871fc78ca96a70405", - "1d59c6d0e69d85a8b6117f9366302fff85eed52f539e38b3a395946b3f61034b", - "fcad64f0111fed35a5d9fe0001f886a28e1a2df162430211ec8ce62066f84aa6", - "e67cb2e6220b6264798e44cef6f359eb36bcd38751aee02995d8e62157ba979b", - "484576ffef89d146616de3d1f3e002ea8c91c6a7bedad6ae81ac80388ab1cd9f", - "8cf72b99bba28a9ab46bc779ed91d0837150efae732e00c318bc345ed806e051", - "16e37930d553ea7662309f7800200d05554c43087d30e2d65ace0b2fadf76ed8", - "6786e3d1f16d6da801bd8f3b855987bf52968e53661c1ed3eb45ee318378151b", - "6a3e12a22c088f40e5f8070b4a97f9ce0828894a5bdd5405d1a84898376b3af6", - "ee1e9d94b7982271a54b49566b67e472f83842ee4fe176bac58b885760c4b94e", - "2b77a4eec7354c84f908035e9cd4e412061e9f6c293cab4eb637869c84ffb9b1", - "28049872cdb48cb3f767c8f7aee50e7c51ba4aa626cdd7a5339ca0320baa1de1", - "ee9968477ac5c8159d88af1b6a68a6dbfce975aa92dfbe777d2e32d49e291cfc", - "e254bf4910ab6feeed10b67619b0a0ce93cd4ecc50384b1b04a3b50dea23d95a", - "2090e16f0870409661a423dbfea0cffba8e2ed6ddcaec2b5014355cdfc90971c", - "3077186566083f60b446383460e003d4e38962fc2f84e80ecb483be1fb12cca7", - "11d71574ea80e8ed5f865f33dac466b91d61eae48e503c4ec4853e99b362967d", - "d50f2dbe0d688ab855c8011b471764f248c60955e757f2df94058ce165bf7033", - "1f1a7bd5cb8ecb90bc99fa3f0aed0cc52a80f39dac6276d673536d96227e0201", - "c259de3a6bd7aa66823c784be9c36d767e00823596ae70a9f392125cd9f1af64", - "b2cdcae1e7a6493c002c9150c6f80e396ada85e43909c22016a4cc0b9cbcfa24", - "c9cd75acb2937c3a949c16d291934545c053b2833e762393212ca16c6fdaa963", - "8260cd507001301cb26a8f8fe3a33f4b4cad5f82dd4d5acdea02865bc40b36c2", - "05a9b6e4f46d46fa30a570d1ba6c6314f129a888507fb46d8b3fd21d4afd1fd3", - "7a3c6376db8c07e96f63195095e72a94603bde4bf386afe16447f83a58d80e16", - "514e50be47e0d9c92615912ef8b05f2da00934b89ff822279f5db864fa6b948a", - "114f3d9414cda7e3ed79d25a554691b6065dee6c6f2d99309025779e46095f45", - "918ce9844d5df309cba35853a052eecc1e51872c0e1578b3cf3971fdee477b3d", - "7b4899453f9a48b6dc983a046000a3c587403182e2697fccd0d96194ba113e2b", - "4e9ee5999968a60f65f1cee99d882e46b1e79ad18b398b5022d4ce1607a3f5df", - "48d405e92ec2ee3f9034b4ef260347dd16c9aabd71195915dceb53877df0e129", - "a64b0359bfea6c0f5e8e0671b92ae6ebe239432e52e151850609103e0a0bfd4c", - "032ea1d1b9f8a18289c693d478ca3275cea4e38a3c31ff21a10f824e2713c7bd", - "0019e563b61e6775234a7ff2e013ccc79e3bd0ace4211167a4b1b26fc03caf1d", - "6338b5db4a675465634153b480ba0bd7ad7c2a66ab7b995fb62c6a7383b10e2b", - "30a2547ee7d03ff37531e43cc05e355ed81b960feda2d1cc484e670b533212e0", - "cf0f1ba842f84294984addeefe18c267bc7b839ef0264eab19afac2104e45aff", - "3070290a0ce9a89bec15cbb797a94f83113a3010fc1ba0a858c9136ea88a4774", - "8f076d90d6c042062749ea414dd60cc1e8019d7df74b6ec78df5f0e418fa2bf0", - "17980c6aa794c8e01f077d3589d94811a5106e10a43bfca3f17be6a52151085d", - "8efcefef0eb361047a6bfbdc75aae8d9eb49ebf7cc78cec147d963d8120920b4", - "5daa2b444206f43bb39e3ef362d4fe14417470240490a963c0ee23048eb76eea", - "698edf60960899cc2c9cb61e432990e14a0c05a5a13c963a391503d98d0dc571", - "b6ed25e11757f3c0bdf7c66a340b47255511ed5c33a44213ae5f4a65a35ee262", - "47b081a78689fba6b9d91f8478056d2cfd83fdecef7b789ff07897c68fd6202a", - "a5bbafbaab4d12bf142561c53c2d58289f7cbd3b037bf776e00e967ca46569c5", - "182f02307dccdff5a036e7e8c849d536c2ca0c5f2cb571dbfc7a2e938c0eb4e0", - "19ba05f7395d1afcc49c1eaf11b3d76efefa36699ae604dc0d875890af71375b", - "9f3700f559d0379c4848c47249e24eebb0d4ec623c3c1444197c684e060e5055", - "c452c44b20588f711296b192edd73206ce2397f4bbd78db61838af723f03416a", - "d3966ca07efcdfe86c5d29ee73fe5870eef05170f19ed3fde1cf3fdcce4ab175", - "83146082d0dc73c30f4da6df35aee6810e8dd3f03ae5367a60d7badf221c008d", - "b13eec4d1ad8d51669a6bdae1ebbd05e6852749628853bb8f1cc333499dd7dcf", - "45fbe0bad48cf1a65512767d57556db761e885984a4d9209ed64a87dc4ec6266", - "46d3b6cc31061cfb99d6953db0c3f6b6d672404b611c7d9fca945b1ed28d92c9", - "3582c19fbac77940694fdbbae78edfe4fa7b862f21538fec3e6120bb2a86fd59", - "562024edc899e1c3ad4fac58851ff2363d22f04aa1f82b59add27a9cee4920fd", - "b3d9769b969993eebca6f809905ae39733baa58525daaee48b0db8b83f203847", - "6880a01a20168dd6e8ed21e3fcdc9ac6d3eead515f421de16ac2c7297fa7b0e5", - "354c5ced79826c0642a35073dd6b009e2103937fd6f533f79957f7c0408cf7e3", - "c8bb1e6333c391a26a75267c286cccf4e48b1599c05f402f21c2c81bfb07cddb", - "89c3425f3f10f502dfc722478f68077f6341091c8a2be9e6d07ba98cbe21a2b1", - "0fb423e8c67613d528089cbe66a884a2d084a1489637cdae01ebc968510b6da5", - "4a2196b4414f4d5b60f93d2976f3602a53e768facb9440cd5091d34212dcf18b", - "5a4e71e1ad3187c1069edaf0b3c552195e0b7cc43e4338009ad3210fbd1f59d7", - "f55df68f2a588ddfbb162541a9144f1a91186a60d94aa0b2ee89ea0c0e225c86", - "87af9b2a93972b3fdb2d8ef21dbc89e4c1678216f0ab55ff23e5c127b2eb1691", - "f16d65a77dae3893aa82ef9e07fcba74171173206e3446cccc64beab170e6924", - "000fb16a450fe87c4f55805aefdcea76d9a50aa012941137da7ab85c32d86058", - "2868bfc14ceb2a6dbfe2d3a09d280deccbaac95fe79e3bc1920917fd1618daba", - "c47576fdce643409905eb75b6ca56e21124c89bfc07fd9ac5f5e4c349b80a1ea", - "7db9d8b1c9ab768796918760e5a2035e49785f4b8b9a982a6537cb8c96bae68b", - "c7a8f2c9c5c47a6e4ee398952b16f399c512526875885473e4605d615c558b86", - "803a8762546d9f95ebb9d938aa3c95b5354bf730b4b2ce6298c0b86d9e07efaa", - "d21b2932838a2673f2e294598870c95e60f51712f2ff6021be970f2f516a1e34", - "dbd1b9c333ceecf87cb4fafcfb8933fb5b5b17d2609a50046ed01b0685521751", - "a89fcd64d7143d39b0e0c6c59e4ba03f5cf91ed0bb4cff625d5069af18bc4842", - "37ed8aa41360991e17d80a65e492f4ebc0e418237e100b3fd2edf842a4c40349", - "0ef67ea04d73cb6861c462481f80ed029bff55cd219d75c6383262bf1100fd3e", - "cf62e1cde1410a7791783feaf37873aaa2741b53b09a7964cbc4d4393b935d1c", - "ca09454d5b50d7f89441e16cf85038fb233c9bdd88d9adfa37dafdd9efa4c1e9", - "4941b42a37dc841e9e53780e8eb44e67ded519aa8c54d3212cac3c3d9c13ca66", - "890de163b76781776986350ac00d5ec556bba1b215c36fd944f43925df75a658", - "4f593b40ee3120e1c1da845f17efee7f8c8a784bac22222293b938dc7fd92513", - "61db00c47ac2efc3ac9d13cb93a23c91cbe1d569c45e9431884e09af99941a99", - "cf4728706ece8f92ba5e3990738f5a5bc29057d51cc22a5a6568e2fd46ae58f5", - "c3c6a59567fa252fec1c2ff541a8eaddef7731434b2fac5fab6ebe3540fa24d4", - "9552bac59ac73a216ca8e58f650bc1c77018ee582579238560d675ed4794b6a3", - "21361cf2d8035da8795c3b68b52973dd30f55cfa32063a1c8dfeabf3ae9fb647", - "2aaebaef7e19a1d79cdf37e60a41971882e3f02a9617d7ce6ae88662437f5fd2", - "d6f19a838be5f5dedda1e21806c9e1c697a11ed0be28f4c4b3a506acf1ccae14", - "5b3e479f5ba577c15e2dc3a224b84e408bd23fc89ee422cee8727631c173007e", - "4c43ebffb6ac4ed98060e64ce66b03d476a3ad7fe9f5f4aa3857bcc22e44d444", - "2d44418de05e99d337cf4e16949e31715c70193c7db4d16abb1bce793e4feafe", - "c7b91176100ddade3032a1d725816a443697bbfa9a69e704865a0f33684fd946", - "46f3c15db3743c12720ff9e3deb1f6b695952846a519e6075da6b65b328f3772", - "338bfe45ab47c4655bc9105194cdd266525606d01a5a27a751cebb684dbc8267", - "427029825b056fe242cfa34fd1f3b0d37332b316fa678019029d10bc0e10d6d9", - "7754bce2d23e202ec7e573ecf6d0f995784bbc3fd1f0620438c1a8f2aa9cc800", - "688fe9faf315c1dfc4665b4981a52de039d6d6a8f1715dbbe5fc25ad9c61d901", - "e8374f5563fb82a84111e18fe67f3ca4b67d849d054f681bf8a6f4e56d0b2b40", - "b7fd7e06cfc9e79323d9955cfbac1c7069ed89834b5e01c3f958df3b54ad185b", - "3f916b97b96514593d5d171aa8123ce2168a73ef6c5d88ecb20279c5cfcef28a", - "d93da121cc585e8229c6207171082fd312ca9c380f03b2529e5700a7986624bf", - "4dca8cea15e7ca92358e9351388b91ddb21e771c9a08b185b868a0b9aba984b3", - "f976b33a104efc5d076c633b85b87dc22fe84c4d9092c7fdfde5196915edc8f9", - "9419c34dc00568dfd799a82bc69df4aa72404c77c57d58eac70e74ea42283822", - "a952f51723228c08b1cd55ce575dcea3a5225985f3130af6be9942060cff3ddc", - "84be3ed804f5172bd5b44649270c6f2b50b8fbb73f03ee01f72b13e94d9c08de", - "f17ad9e7fce28d227ad71934e6481e594680d7799d71d070ec159eda7781a644", - "942c90c7bf191d78ce05de2962f0b2ef2ff92f5bca74566fd990c4ed136c2ea1", - "e4a170fe0213ddfdf613cb6ba4f57c84aba3ebc5eb8337d9a67ac1e86efc08ff", - "97a6b94330aa3f3f5f53fa6a1afcbb05b396aa83ba14c0bfb3f871b40c31e76c", - "3f5148e6d51c7635a285d81ac4a322cf62312e9a4851b1c7726803eeebe52ff6", - "afcc40a63881aab0e7dc2a4f9bc5f381e1b21a22ca25dc9a1d1d5bbf708cf78d", - "d9a2d0c17fcd980287d65fa8ea9c301c6729569832bb03b2b17c64b6af8cd09d", - "abf7365d34b38e61cbd2f75387c11c996f6087c25ae5a1aa8400e09f13142d5f", - "0002523430eaf4adc0d7b47aca83d4b4ff5e23b62f6c913ea2521d311d76de3d", - "6149e985aebb3fd16ea8647c5d398f42acc4a9b1c7b94d048db2089514c0989e", - "d95399668776b2e8d4b85e7f7b0b493a62d51636e51868549ed19523b198cbd1", - "aa235578bd5e531fc0212cb1a4b62f0a5c780885945f5b27ccb49d139c5f3b23", - "b417bb59e29f219c9ada7325d29d34e00dfba7d64c0d5548b35c74b1e0b59c20", - "841b601b754f40548a3769da015a7fd28ee76cb58b3b09c67790c38fb3c3bfb4", - "05e8d449dc01cf0012b2014806d4f6263cf55a04c889edc4d877c72873653c96", - "635d8a0052ea1e541a4b5278634f538f9c9e0d46b1ade5e4afc09bf5cd40591d", - "3e3a6f4df4b81d1b72bde8973b1d9983f8d68a504ab2a7e70be89534fde10352", - "cd9c18d3cac626aa398ff025e307d22515c544a9b780987de53c98732434519f", - "e7d4ad076216eca0584cc65170f2447374fc9f1dae5f03c651e28d3a856c778f", - "b134348ecdaefcbf5ae95f508f4ad0b0b092cedfe75b41c278b98a6c0b99cfdb", - "28d03eba6ce5499b3d8dc85722e916677612a1d9c52d7dd565899948aea16ce4", - "95f5581fa4c40e1670278e8a2c3274e46f9dc72cd506e460a68f6ff4d93cf821", - "c03d8729ea6a96d700626b9bb7c282dd29a91eb599ab2a216f6c53aea5d019a9", - "7d7c2a7db695099da419300cd72e52c28d9cbdca506d418d95a8b369af5cad27", - "769f51e9b43e47b4931a91a718b398dac1b1f6d9130e4c98b5faed8af73810df", - "95531771f5439812b801792bc64ab442bea7ad9acde6f27f468681d411a750d4", - "5fc96d840c1e2a68c38a7eca972c6bb0fba84c9cac3d6d1af5c0948fa9d91d83", - "8e94ed04e88f74633166099829d46f8ae43adde4f5525b7d85596f23196e3aea", - "a7ab632a3512ca3065eb3b232e5b44cbfab3115a813102d1a4612e49f8907c39", - "194a839fcc74db628f070d5a0007350310eabff277b102ec2cf80b117f78cc8a", - "0769e7164f7e4d3bf05c6fc959d903eda57c84cb88d6f101857505d391ccb012", - "718846ba0b1a52f1d8548722751c95ce0fc627d7bb206bd40260c1113bdf11ad", - "d8808034d093ddbaebbf988971a989729b1240eef643405ab750fad5d04c7ee7", - "a642141513bc941b536feacdeaa8d1f88c13509b8926360b66749cd309563229", - "cd4ddecb5a32977a7ab5a5d2e27a42b3eba6aa4b404da58d5b6d08001d73ab8f", - "17288af3200a49a150f9d77c71951a1c46b276505d1e2cc57f79ffc0e823cf11", - "c583ffeec1d2c603a24ff15b3545c7e519b8605fd60fab0f204f806ddddb207a", - "643a85afdba79176f4ef99834a3f21994013720ac3639cc84a7d947e595b2ad8", - "ef56af0a8c31db7090ef0b9aa7b5e19c0f6dd307ebcfb40d80594dc95f6abd10", - "7463b587bde49a20eba07b6cb34325c1517518d7bb6710b0676f1791b2816b99", - "ebd92cace08d31220502fa24e9d7e7ecca8879a3787189b5c9a3bd29d42e2bcb", - "59d34fcd14693607a7a4ed3a5dd5a88b874cdfcc7a9a571c19f843aeee913c8a", - "b55bfe6b2c175d74f1162d3c2d5cfcb379d6e653f4aecc8b6c6c8202e6a31c6c", - "c7b5ba424fa80f0d5c95c89c347db4d1c81639b36ba4906dd20eba7a415b5a6f", - "01483017fbe7e9b6fba3d3cb0cf7aaeea2ab7e5e88f5d91316f9306bfd4a4274", - "ea724f7451ad67c1adde179c69c957ecc42fa78d285708ae76f7ae404c96eee1", - "9ed6ee834176a2707fd74a7b8c997e7e2ead76eac1affd72d9fbc98a49892aea", - "d2682a634f92bb25304f3c4b3d9306de084681a88c7e8aadbff841646c3e9c25", - "abdaa0cca813752272f3e18bb22f3a008a7de93bc0cb0189a265063a083eea2d", - "b852606e51bd1889fc49dc44134e8d09e893ca142a5a4412ec814a56614f6916", - "cbb4b1d7ce469bef23119072706d977384bb2d4d74c6716e501a0549f92ebada", - "d5a30beff364f1367e3e064908e720b50cde0907ff80a0dfaad3261127785888", - "3eb0bd0391ccd768a62038927c44558923334f6e80414ab18577c9e52610a644", - "919e126936d559696d9683cf6c993d5f91621249b3f58f27792ce1e2e745707e", - "bac7c4b9f61325d3d26a0d7033516a89b1251bf4cb0cdfd7224a93dff4180d12", - "6b31a3c0a9354b8824ae667f52a135a2f8d6ab3b9c9066d44a4b7f9f5bffd91b", - "611da3463c09517d798fd68a4dc635dd5579b6d9c26343eb6e1a1805b47557ab", - "3b7e5fae9eb9718c9bf365d62e8482955d7953495def82045ebe31c521cccc25", - "f9b9778d8c37fc383168f816bb74778bda008863540075b9803f2436d6910d56", - "b09d31db861b16641309ea62eabe217a32a0993d593a74713544044f602bfd3b", - "0223f5886f5739b6fed5baeb2ff1be5a3815f962f5dfcd43ecf7e50c7a2595f4", - "9a0db86352b8403640fe46b1541dd1e24cfc032e80ed4c97e9068521877ba284", - "2304fc9d664404399e4cad646a395aade4c2124d69234107dd2f91865a1966f8", - "43154b068adc57d3cce34f3c3e29cca68f498d6bd942c9f934eef43d0a91b9b2", - "9910e6ba0c0d33a481861363da5f6229d0591142c3032b2dbc001656edf530ae", - "9860f9c3019c951b396204c838e29f23df1132f82f237f5f92e191823c157f5c", - "8e4c3790097d1005cfa96f0e7197736f97da336288ca0e8d3c1b7131b7f35000", - "8401ec2f77f45d645e7c90d5af5c8ccc7fe4181e2108b96b9d6ca0cf4e0e1bbe", - "113851e85390f0deb242a7ed4c0fff98e04f72373793d657db62eae625cdc927", - "19f1d933f428ef1333dd49551d9e4f27e4bae6d8eca6d487846325b95ac2bd35", - "d90b5cc3fb74e790fddac4d665fb089b2355575191272a50776557d6d33763cf", - "1ffb2442ba3ebc8b60d9976d416728baa8e68301e555289f4a4ee2dca1314837", - "d42f55e5baffbfcbf3b163135ea05e6077a9c9358b6532d28bbe4b1dc3818fe1", - "17cbd09930ec101504564d5cd006bc5ecb81cfff9ae23cfd75570d74fca07cf6", - "fefe5160c4d591b2148c552f2914ff81a0101798550c5322783d2bc190dc82f6", - "ab56c4bba8594b0697aff8b5c5ba1fc82cc1847a485fd323e28e7ea6c1c9942a", - "9bb2020f61f8bc7d880a16fe5e519f7e392e997ab112174503ecdf4fc2164550", - "ffa8d52140aed14a059321c11d852df8ca4020c058bad0bd9bb31f7113a7a7e9", - "89f7e9e7d3f43940543a01936cbc761946a22039307017a1a254e8b501cdf430", - "ace7d860f494e1964333d37fd8e958e4301ca11936db5ed953a95af9fe930b12", - "342ecbe9b133bb56ad46c563e9d2023bbc5d84353b2eef1d47edd775cc062d04", - "7580e3f5173d89f5567221d5377a651d0b80a8e7852ec97091bdb33bf146dd8c", - "aa0179aa592dcb2eb5324a57066807eec012bba7c79b8c425c75e720ae882f9b", - "8ba937024caea877fab46d6360657dea9511e7d24cfbb8d97d4f67c4ab50f02c", - "0eae8d35cf31002817ccff4a4438281cdebb6577907dc7f572404ac2c0cfe893", - "976e1eb50e47eab4c58729428fb97b0ea9e9e0bdeab961ec5da3ba112e28d3d4", - "4fc70f0ec34d39d4dec0c3aaebe12f3d8ec69842fe47dadeeb3a224895c3a1ed", - "0e31687273c34ecbd788ff4f50e26c0fa6c907c82c50bc2daddb498a0f9b9a3c", - "1f4f9165fc1ac31c2f8e10fa945d9de237d23bae6f911ff2b34bde4555556fbf", - "b117f17abb03a1a3b2f4b0826d6955a9466df1ee7edeceb213a2226043d935f3", - "a529d9fc59cfedb0c2bf4216a9aec2e2da278b47147d26ef9dc0a308a1f32d5c", - "220742161db5fa9bb3b5a64d19955389bc1c0cab5a607c6af63cd9ce2681d5ee", - "ddecd135c5395952c35d66aa90a8bebfb946b433b1166639f096db8c7c2d0082", - "81e1072efebefabe81b925e6a4f84601eeed337678738fdf63c5d87ac490f8a9", - "36e29dcb19d677d3dbfcaa2f26b40b36f21030ddadcf407168f868bace33a473", - "439002add6438ad149262f70641552e11033218328ac02be97f25d16cf4424af", - "5f4da3f198e58aea00458d5b64330870f0b0df6e34a9806e2d4c2736fba5714d", - "c94fba84c2cb3b2abc72612242ec3485d2f4388069f73218f3a047f89e2a4b14", - "12e9609b653e41f577a2292da6f5c85ef07e74c0d6d7fa274e30d882ea3526e8", - "e5b6158239430249f422dcc87862a9b15d629a4f21a95df445d65cf8422327d5", - "3c02abbc7007b97c504b9d9e167f045972016b61afb60246b0dd82569a76734c", - "85e779edf04181125cc19fb2476af82688c5b67e3abc41648a123cdedf2ad567", - "9053a066845783a0c2a6f46dc61351dd3ed88fb653dbec7facb24d2964a038b4", - "83f6d17b828addbc69f3f1032d2065d57f4be3cffd6482c396725b006c7c37be", - "59ad6860d53134421ed9ae5b00206f43b0a40ccc6aea21d14197f9ba7c128d6c", - "9ec1537a6da65d573803962d86a4da53e7101cf96010790671be9686113f4692", - "7c4b86ed039ddef3c5efc94bc70e04f98e8b5e62e37f540653001feecd1d3155", - "8b7882bb843d44412740b3fcaf7a62ee3af6e1fd46bbcbe52a1787861549b3dd", - "a6ac49c2678276665b477a63ef16b28be35425859e6ba836fa42e6fbc3a37d5a", - "f4fece6fa41b21e128bd5dfd7142449154d2d50c926820cdc3c1136553bb03ae", - "190e17022d95db720cf0cc39fd32d3f3a20d6e40b2b4ae85a83e580492ed3d6d", - "a81b207f74a78e6cb5eecea49299365d56bac712a12342329102f01979c81577", - "24c340c5729b2344a246022f06b2641f6560682c2a41310cf5c5408c99f32638", - "58f54e31bcb2f2f9de2d3c66b2a7b8e488c04aa7bd075aaea0737936236778fa", - "546765a582bdcd866956bfda15d51e650e96f284734761ec525ce4681e2ec450", - "c944184c6ef290fb5b6ab8cf176e927ad08e250d2101bbc61f7f7f3b38a94b5e", - "faf2ae9b02d0fd853716de350e4f28ddf0666bc3c64028d91d47557f57401ba9", - "dc516d89a8e9afa7a20fd6f7f4ad55962f9acc50afd24d9c93fdc59efd2ab478", - "a9f4a742015835c090237811573d7f6498117181daabc94f92d4ff3061581e3b", - "0a36c0999e1260d075baf2aadc55ee893441a11c4b11576b080642c2c6e6f5a6", - "39f0eb34774d1f3e11657c6e307e41f6bf9dc5486dc68bdc6a4859f3a6f2ee19", - "846392b4a677dd948dcc25ed05ba5e11d1e3b1d8d432a7a94e30be26e3cbaef0", - "f98a2d6277621aa5fe35d8b6707b1c1cfac1a5180127267339def0fe2bfa7129", - "3a724191af2707a75ad3bfec2a57f4ea6f475db7cd1e4099efae821cb01e400d", - "260034c23e19fbc572c985cb4c0e45b295ccec92140c2c041aafdd772aa06c8e", - "cd760a2283fcdbc0b73b6bcdbb77d5a89e08deb9a547d6e6448c98bca63fc37a", - "7d170bf00d41215e76685ed77fcf54d809c90e32545d5b9c36edd93d399d401e", - "f6ef2de8444e22de5355c2b95bd984a2e0331f5447af6ae493c12d3964fc53d4", - "ed39c48bdae5e3747f9393e8d090390a3b14481300e05159f6721cc30f43a149", - "c14a0f34212e38e18211344fba2b84334741d6c0c4c12c1f1d2cde8f97848914", - "a5a4f703d7bc7d6ca8f632299971060fd724025f1ede40794235e4d558eae91d", - "4373088f51a56e7c43b9f5da6b681909d5662666d74c0764161688122ffed19b", - "bf313d91a644eddd21c191e88fc52b44f9a9d620d36c7f9351e6b0de34d5f8fe", - "a09e513ef567491c1b7a6a2be5f2d61c606d460799f5c2b2eedc7b3555fc4006", - "e1a7c546fa4648af76f3f2bc170978eda2b7f534a0d6ea7744b3bbea113732f0", - "552e2d67a902b2ae5d5c397aa136910798f85edb71d33039b3cc7d52c19700fb", - "84c6afaebff3e24b4741d13b45618928ad9a7d9601e4c87f22faacf4ba5919a1", - "cd611d63e443c91cba1dc259c71fdb96bb70a1b78639166f7aa2a09b36843f7d", - "680508da91884b086ac08b65f88ef29d3ac7824a233f1a7a3586f19a7f9d26c9", - "53b599fd024f09b7426db59a066f2fefcf276a00abaebe505dba742ca6d65613", - "2c042696f3c92534136e1d969194464f9c33e95b79b289fbc24e868fbbd9b1a3", - "c7148b805aa3b4e45ab342947a985a7cb1ab2cdf54ef33c638ce11394d57e489", - "d480e416d4b458d5dee391a57a6a5ac7c35200509c4a32c61837bfcaaf54abf0", - "79b7660f804bb555df3ef117f6489365d666ae26a077c857e52115a6accff329", - "c534b55872fd6cf45744f2728a8b02d727f8969bb5bca5dae720ae7731e08c83", - "a2c17a7abdb34b062eaf6f6e23c618c79a47d2105c0d19b5b38acf7bb4ec6454", - "3e6b6c32e1d57efea2fcb79505668a981fd9d70000ba114befb01ed9ffabbfd0", - "fe01a597c881b5851f86be95c17cec7a9d1c8a1afc93da90430a41a86fd6b2bb", - "ef2ce1a6a17d27e536ad659aeb1cc089fcbc20eecb9729378675d3dd5a7522e8", - "50b64a4bf866d01fb273540ae92c1e2b08e1d45498bf9159aacbbf83d559e623", - "e15f71d791706b1d63695988d9b79c7b6718022c92f0d547a0c971447234afe4", - "198df25bd66be881c67cb18b1140238fd0d561c83c04a812f5226406d4967b01", - "d2484aa6ea6f0d778d483008140d42b8e8ed5f84208019b57b6a2c0b0dae02d5", - "6f591be3743e8c9349c14b31e6947bed14555fb8838ea4667b4e569b35d3d9cf", - "665381493b5c87d57757d5eeb2f52722e2f08a31d2f077048373757bc2246003", - "ffc3b3926ee079e63c9cd73d74c6ee0f5b1f92599461e221b1e0c7b89c918a7e", - "01a72b3700617b00d56aa7dddfe5b392f0f476a99e458385d625e5cf3ea5d2eb", - "b81501c6b2b0863c24bb0f39a005f822af5d48054ae1a9cbc073d64d3865dcc2", - "f4c6821b993d73ddac3377ddf26e2325be1f24d510335b5b99764d3a4e4441ca", - "9ce6a01f8af26587a9450212dfe01bdf5428cf3cf4f69aa65ab522721e9df9c9", - "76a33cb44956c0fc642531be60d36a715a220af79a60b1c94752ec3c1c1ed391", - "f488681fa492b3a96d42aff93f6d65efcab29faae0f2e397d7ebe4983f4f8228", - "9ad88fa7ffc35e0f784c2896ae0f1edc204af2984574b1e9680d449c7849e968", - "fc07ebed82062259a0826ae91526edd4556b9a12dacaa5f970ee89f45f01f9f2", - "2260250518bf9d1e0b54b842e9b5ce1b5350bd566ccfd6dccb77eb4208c17783", - "2c870ed93cdf0ffa87327c90c525481261c75ce71c756f2adcc689cea2ab4bf1", - "32ac2922b34a04c25b7e62142b7985ece3f46f7c80d334a3c5d39f272d97cefc", - "f3d73056cdd1d2821d81ce2bcfe2ffd7a59772e6e03255f54d0d8245083b6181", - "8f09c8540eaa8d1747211755cc1b919bceffe5bc011f54f9461ef88e65caf66d", - "bdd7f8a0d11349b719f5b4887b852b4414f2a90be0f959de67ac52a4224b4345", - "300635f925f60f6b0309a43f0036448c65af788b18d08c44e65b1777be5fed3c", - "32f0ed8ec2a1af7d41ebbae9f32bd4c8e141f4b4aa52d0af9680c05671905428", - "f38437262af48695c85322ef0f941abfda57f618d018d117e3d427ef4ac06e46", - "6a238dae1830b92d998021b40c25209a01555beeeade40770c460ab934d46bc3", - "6371f87cbfa4c6e0e8231d510be6eac09abfd543ce3f94d07264236dcef76f19", - "dde249ec72d725620ed781b68a5de4aeeb48e88c8ee23b9cdfc5815eb4d38d95", - "ab9a8ca591c36dff4147ef1fd8f92ce8aea1f9d0425b08c83710a5623bc8eff5", - "c6919d68dfc3da8615ffb70143b4d8161e0d73f9e3c310cd0af6b02ce54282a8", - "b5098027a4b4c80bf06aada208c0eb0923b189c579f48d5cce38202564b8da6b", - "52e53805215e11dea7953f8052d7c0d3e9e222461f95bd50dc25c683d061a44a", - "79b69c25d2cd3cfd6495f4f7c13d031595e9717c0f0c1060ea2d6f552bf2f41d", - "c0106d3ad941394e5edef54e020ec1770cd78f53099313abd22d5ac364ab5368", - "f466243b84a9b9fe40b0f4fb955ba36b95b3738e4b5523707d29f7bef0382d87", - "46c9890523af7606059907b9cb0c1d65a9d58274c92fddfe0346efd37da401c6", - "36f1ba97c152ce17bd1bd607fc536172d67897a0ad040060e7974a2042c3e648", - "20a55bd13dc1e38216178367144670568d1a43614835e7cf89774b493c5c12c1", - "db242ef808a848c8378dfafcd220bd43705dce30835b9bdaaebf6afaa86b14d2", - "49eec42b2156a5bf00af7e2c9b8ba87786e243ddc8479a63e8e235c5101abe35", - "38218854896a2a1ae21ddf8ce7e1c65938bf7d09b66662aaf43e73ef9a13552a", - "b9cde1ce413eb310da5e19e8df6a221fe4e7a78285ef878dd51bc319ee217b06", - "191cc691f76a3ac63a91ee809a7a90abd3b90c3f1e76b715e0907e3d70ef50c9", - "db84b126554335c3734bdc2d65ed1d991f4999ef3a13f0431132a5517ac92c57", - "c7b9f172a86bcbffaffa6e066fecbafbfabeb69528873720b510860b3c2f9a7b", - "e3f37a663a29acc3a0659ab837b011ea1fc1ceb66faa423f3ce183fe1264a6ed", - "e909ab7c3869b1f8556210e587d2de861af438f05b53b69aab8b0e1396be8c3e", - "7972ecaef8cbe381a55e519f0bc2d0e8595557ed1fe8ccc1f01f75579711db1f", - "056fee0495527d4319ccc4aa013c0724fb5293a3398bb398238512c3eee55629", - "b5dca56aba42b95e29bd431ee9ebefe15b752039250ad4b35adf0df1f4f658b7", - "9f7688ec6a235a718805efb77549e78fafd3853bfd9a647143ab06fe8edb79b9", - "97a485c0399660f821d14e694cc60696258fac9b3aef10b58bb73de8f14ab159", - "f02667abb99712e3c5fc9c9ada1e6eeedbc1b9745f9228f2906f23b0bb406265", - "9e0b2604f9a0dc89f11d717245e3839bec7a66d5e9e2540f2d41698e753cec0c", - "300d29d94c5408d56510a9219ddb2c51334b17e3f67b190e8dfb7828c49e996b", - "5021448ed10e1fbbeaebb9c5ba60502509f46acba63eb10d6bf716c207f4d584", - "ac76f850580d6f74ed56ebf8751414e1c4bbf4fae81796aec9bd9b110548bd11", - "5d87803bae805ef4ffb8fa088a6ca9720d9da093c34b237914fd139387cb8ff1", - "4bf033ed34c27a4b790c3ab98740d59f811a527cd196ca840d71f5a5c4987963", - "df36e19f14937fa93e54d181aeaf9d3a80cc9cab86f4f094a2e5c05b92ac650e", - "fdd02731ff636a4bff1b276dce18af597b82f1cead24d17cfa6bb89c1733dcb9", - "fd96916cc6a1ed8a5feed14c93f38129a3857c18b1b8e167d8f9403dcad9976c", - "29ae3dcb24fcbb2cca18f6bfa585c1d552a0ee9123ab4fa12dd5c86d0bc4c122", - "498f4000dd098d26449e6484c408718dfd8b647400ad235fa0c350c1f39e4035", - "31215620db96aa4a26a875993e8adee380029beb57a64ebe8102a0c978547c68", - "11750c2bb95fccf6df274aa749c06407faec1cde338b93e55ce86f8579ea5678", - "720e54a8ef434e1f4727c0a7c0d452fb05d72563af2451fd8b6db29d70e7ca77", - "989a30faa2c2f58586e7731c66b94436f84fa0e705d1669529b74e6606ebced2", - "051cd9b9c43fdd93d2486937a75c7330aa87877a7b181d6781b89a37149aad14", - "fbf91ee24fdeed17babad11093dc77d651561edee7452f31426c4d9e1c5a1cae", - "5ec384ed4366cbbc3fdb80f01b6adfeeae822e99cff53b47599e5f941e5f7f9f", - "f41c70c37e39f38fc57a3c99b8d8e9e6a2b003fd4e16ab0c933f7b7438d98803", - "d333784e83dfff2d69972ba93c7f93ea0fc5381dd376b4fc6aa042c78b2966a9", - "593ce8288127c0867fed0a58460187db3ee2df1b5d40a0d4c3b4bcc1a4f7bb05", - "7cbc140d4589342a6b0311befa83590c6b3800eb2d723ac19eacaf7da20a6b18", - "e055977e8ef61b420cdfee932ede06e7a42bbbf28f0689c11d1fe15e529fba84", - "9805cfa86967f34a73e93765b19e24515b3815de2f2fbba7bd57d79552c7a17f", - "aa5e77de141680c215b5145ddc78258c347a2932158e46ea726d4a50d2174b6b", - "1f6af08e2298c7ad6bc62fc7ced858b555eed9225f92a57617d00631e0558ad9", - "98391f96a1d1e0f71aba2c2d9fed793ec2b88a7976ad0f8c0f7e0a4258380364", - "4c559a16ec2ac0b6e2d8c211607a7e2f988b0303afefde283d2b97b1c5f88840", - "460117506ad5eec67359e5ee77cb481bed8aecee8b95f1d5ce0e5993230a2618", - "cdbe2f7f689e1f91391a237f9ccffacee3e47048b5874b4404f107bf5dbcd66a", - "eaf862966dc236fc8993b8844a70c102323032f21121975733d3e0019701bb64", - "9199214b08924ad5a7aa62c38ba4044c29c7542efd49b9c93a37ab157c6ad39c", - "31ff3e8f22d18ac027f33537a08fd24f38253e0067d5d5e163df6786febad3a5", - "d50f64674c0a40ffbdfd0d1b592e62ba083dcf37798bf61f30e6da2c59fa1263", - "9ff6734aaf80d8546aa6d8ca8dc62c30618e492648915e7fe754f45060579c27", - "50ccde14e20eded1c7e574eae0d948bf27ea113c4b7adc3ef40a97143022b2fd", - "734ff05affedceaacc91bff9016178f5b306c758c6364f727483792461168d29", - "f3ebf0310382369e235af2e2e83eaa8e03fe4fb7b83ad7d6d71ed72ef61d4a03", - "8f9c27406fafadcafe90d8e91de59d7ab013daa71508ace6caaf0e7a50b0775c", - "e7a8ffbeadce67456293f5be177bbc30dcfc39949757340e89d1db8bc89eb831", - "8081e6bb9ca423a1f5d5bf8bf9e27a3ec0da2f57e92050efdb3dd533cf2269f5", - "481e001b080e69739439a8d44537ddd11136fd97abd093a1b467e3b85230b52b", - "38ffc401b07aaf1407c5b6d720c0d0606f591c91ee5b186d12a50668b4e2f6e3", - "0031fa33c0fdb68f0f079a49d898f3e37026ca354244b9618f15844aefc22576", - "94bd263161e14ef723e64d376770cf689a3d34c0d2870fad87d92933da6a623a", - "34f51f5f0b759cfc11103b57da1386952e32a26b3ae4d6686f3b5bd83383d4f0", - "03904c8e89e9c7cf05a501387a9ce5628c452a147b880bc7a033196e5750e923", - "b6783bc32e34b948fd2b2280daff945dcbd96e1eab411e339cbc3576b1707d31", - "d7dede085bdd6fe23cac4ed382cee8ea1e18373fd0cd8dfde1846de991f687e7", - "f90c92b67931b0fe042002ba6ad66854f22ca104fc36ee49e158d7b093efdb85", - "f6a286ba612d3060429780cdd46c1a189b0afd0ec4b11dbb29d685ba1d4e0de3", - "d77501b3ef7d81fd8c94462cdca15ccbe0b049f09f3cef51c66f69202327d36a", - "6f5ad922e396b4672abf561007b7d832fb0f23b47c99d041d44a4506bba9018b", - "8d957ddfad5fc2bba4c4071654ca9a9fd6f0c029be47c0a07188c256f27924cb", - "0f95ff11ba5cc29bf611f5b4c218bac3e87d592916f863046d497a71e6d2d6b7", - "f17b0e1078b961514fb7ed9ef651bf38fc295741502bfa9d1dea11ad371d4e38", - "a47819c6b8ba692e5e0076b65380678768077b691f11ca27dca825cf17c8ce41", - "1424aa3af17f2ff733430cd1acd1531ffab78917d80deaf3f7e4396e48131137", - "c24637c899f9e2a0efb03d3211fa1b19449eb17705640d4e2cbb2f47082f8f25", - "e956a5f981eeb5de6294cdbae2f1e9f0447b74f58ab96aab96c7ffab3173f6f7", - "eabee7508e3984ac24d9b5c700fb4e2a6905d576bce1ecaafbd40d82157a0059", - "91a19906bb1a0e598f42250f9a52999949b64731f27589a1436d56816b4adf6f", - "94114b455e7e4390af1c659d72d5ffc643b76928a2819efe04616fded583b2d0", - "b9c621157fe1fd7621d72ae1f869429ea627fc0a2bae92b56f3d08125ecefca2", - "7ce3ad5c6d123dae5e53262a1f1b21f06c32306bb21ecc3030be25690e5d0b2c", - "85c53a5b1be808119833c61a163a8c94d9c74ba65812c166e29e6ecca9f1008b", - "9c640c09d4b28f68cc50d6e8af1f28625a3a9933a3ce26865f881f04998cbcd3", - "3a6d92d3283b653b0bff645ae8ee930d91c8ea095752cff7a03517480e443137", - "b6d5b5ab23c7c9df5269d7143f450f10fcdb47f4116511558c9862a95e02ba09", - "21d50748b0a165d81289fb96604f59e19c6a382fef2bf622a7f4435804791631", - "29c3dc0d219bd8a1de73c1798b67416d7721c0e162f51ef203fc2ff83990c0c2", - "87cd7490459b12a407aaa87d274ea2d411cbbb3f4a0994a531ac24c708327f02", - "774eda545851e606cda72e5c062b545e877053c1901cbf071b6f7f70274c2bf4", - "b54ff2f59bb5030f80050083b2e5c78b24613c4e5e20f829d64b861d1786790f", - "8e34840f6640f889b9048db50c2781dc0866905ec64d568cbcfa588ac7ea4310", - "904c94061ba2a7546aadcbd97148ca33d225c6572f57f9d35098ba7c554590d3", - "f97a0807af2f9a519feaff0273185d25af62117a71d2911245e7806f8a9959ee", - "de9069fe5644973ce7d916fd98ddc9d3520b266c3bc9ba1eb181a946baead4c5", - "2a07705548174e93f0accca34cbb26feaf7d0b9663d3326d71a8fa0196175882", - "a34aa1a130ae5defbd024bc6c0193241237df1ebb596fffdaa5ec98f28a76f92", - "85d40108fbe8ec460a4336b399299c6d5c41bf70b18a75bea0bbc2d52fd0f82e", - "5563776221ebe8261ddc15b17eddfeb029f8e0d37fb75cb42b6f04adc8b708ab", - "dc8e02ef98242398259b20c6a32730380569540e23044d46652e18032fcf4745", - "c7831a7a3df82a37bf87f16d47d8af8d048b77a63973f3b226f354b9eddca81e", - "2272772feec217bc5ffc11353b437daab214efb3f0ce8667ed69afcf42e704f6", - "3cf327afb20762988e6ab0d18e228ff634d480c5a422109f36b3e82bcddada3b", - "7a2cde1c541fb082c6ba9f449e48e962d3b7d3dba6ab6529139707982ec8efda", - "cab35bc59324da9a8266d56fe15c0a13d34c03610e838842129361ef3a64b821", - "bfb52c998229914e58e8e462cd6d0466661cbb5ca690036c2822a18adb9c91d6", - "d084e557a62a43e06fae177d39aeef9257e2062e833343ec99015232d659bc17", - "4da9b4f5d212f0d3894b957b764fb6daa360ef496b53ad38169530e44ea29bc9", - "9746e17b423881eff9801c585c79cdcbc1ad4d36454de3898976c999ccef475c", - "cf8da7ecfea2ccb7226116c4c10ef53cfef4f4dbad46f6fc159f80ae66f9070e", - "a9336a34d9050773aa7478bf48abc2352d66b31f2b2bc7a9b1d9cb6c0b22b5b4", - "fe286a5ee59cacbef060899ab6a0fc2f60022c9fe5bc77e0ccf136bb3c7c68bf", - "003edb3fbded7f28a6175f42edc783a6b0348bf7f1619bc2524abc2ad4fb8d8f", - "23fc958319bda6eb787fcab67fe15b09c3949d3e9fd8ff1502f5bdc46eee6581", - "9c43546c75575f27d205fa99f7d78b9d729b6608449fd38f262fd201f8dcd2c9", - "40c4d98523599a5f7973d04d282770576423074b13c2f6c17730b382692dc5ff", - "6c9f613702de7a13fd0a74edd68d1cf086cc9e32e185ad2d26c52cbbceb7b19b", - "41e473e8c0b1eb8a693085828bc53cd73c354a1ea028ab56f8b3452bc597bfd9", - "d86df5807b66f813300f38c206abaaa573bab1de022e40c6af0c3379e329e277", - "937583c26b1b926121666a020ce1b313a1fcfb7af6e2f77ae9115085663fba79", - "3c75f3cfdac86a81a28dbe44822f423d53e26293a4e6e287b3b98625f02db0e5", - "d4270d3a2a8112b9135ead079ac44e16c1dbf8ff17a9f7a1ce452f2a0781cf37", - "4e065e427e132af9491e0e8b4799e72b3dfa1170d47eed46a433d4da10970432", - "74052ca0a7bf0985b95f44ac5181b266a2544078eaca501071f88c01faa0cdae", - "88960be85ae4329fde295e46ef9f4f67ff6b5b7e121b0df62e6d1c878fab7cfc", - "cf17b2e894b01534509e9b2f30c227fa8f3967471f2f11d0cb6843605021e59c", - "1d89c1da43a90b1aba5bd285728a1c3c1e8f2786ddd6ed71119f420bdbc8b795", - "8b73c10e71bdf3fcc4d320e789ca292cd23f4d388a2912ff736446b394dff59d", - "443788d6c5743346c4ba6fa1a7516419e2af4217966948b3e86a4103daa48147", - "df6021ec06b9d0fc8babdb28ec4b94dddc6da8e6118059ddb6dc4934d2f02b47", - "d427d768140cdd832693b9b00da2c2eed287ed87ea6678edc5a88bdbb537e8f8", - "d4777ce44fcc901b55120d39d70f9207809fd8aefcff8141f1976ad1d2d23526", - "6b4c6f862e7fba442277ce1edc05db8d4290822b73ef3c4baddf339494e906db", - "1e9bfc4ef0eb73bd106f4ee676c7b087d3b457fdf46e02dd9410dbfb0ca940c9", - "da8bde0eee4141844c6fd04d90c0a62eedfd1b97fbbe9387c6f93fb3beecbba9", - "e9f5e053815e9e583e7d7ec4e51d5934c03114c565f242dee763790a1b78f33f", - "6f07899ad696b9a2768bf4577b45d82d4ba3b1c26472edad6b8a876170697b71", - "f4b4cd667f43d906a7319102f05ca5fdee29e8b4e5cb863505e8006f77d79245", - "7f9213e4595af34ef1966decc2170e04310430f2f42bd9fa49af1e5b09a6a24f", - "b574c1d2c6d0a69808c3f22dd7b3e1f5e9c335bc2fba13326af4fb01116997a0", - "d2eb8f37367467c40367cbbe495ab5ed6eb3c930c0a623aafb71b138a32d21dc", - "a8e46a637c1379312ed85a168af96144b4164533e4f97ef82d5fa75e7d27d50a", - "2ef10c78f5d2c33fa9828740e710e6c1f2bec778506055ef0b4a12a722c1fe6d", - "6dd3849a630970a7cd65186ebb7438bae18769c9efaef41bf1bb500353866ee0", - "a5a1befef7321f545e2a3112afca6ae28b4035cadb8fc1a7336f39c64860fae3", - "d695a52f7a504db4e070db9e23688600576974d78e01cf994246892efca6d206", - "efcdc8a425b3d774f100620b9363915865cd668ccb39f13c13ed6fae3e95b128", - "0d4d545da092cb7751b54ceee195b3fe2bfd787c10c01b5b6eb80c97fff5fe58", - "4d1e025681df03e38686d37d5c42bafc4052c713a2187770c7c93d0c4217483f", - "a416e7cc3636ed57d9a5df70cf965677fe437634c27b1dd10272943e4da5b681", - "026bbc9ee4949d0d989c7486f546dd27afe2fa102c82e445ad124f8ea455e163", - "e54ae32d1ab364474161e8a92b600f94f0c0e882fcdf58b724fa18946a70e9ce", - "f912f175e21fafb87778b4842bb8a0176009ea805364338032195f5be08dcb49", - "df9f15ef33a042e252aa321c62e3745cfc99fa3041d6f72de8f8495492f98787", - "1da3fe73eee154f6441558071e9aae4d99c3779b1952d5f860b9ef8a83a4843e", - "9d795351cee13a7dc4e548f6218f3322ed2b0e31a48b431a5a3634c87bb6d7b0", - "83bcc0f0d5d51305d3abda76e1ad616d885e2de8a0fe0da881ccfa78d5403114", - "8c469d015c51969fbce777e5f25a09dcded038009d54e67961ce33301c5d67ca", - "479926283988d5c2eeffd2bc2637b1dc7093d3a3161166daa42dee14eeb9858d", - "2037749d189a67e91611a7867016bb2582bcccb1cdb1ad601a48f26f8cb58fa1", - "3fc28040abd1be2a0c5a6508984b68b367b30d2008688bfbf47637d4a9526e5c", - "070716be8e94ba31bcc7c17a74a9b793fedfa4dd490be29010ded1e2febf2cc8", - "17e32c86b51d482dc8ace08ffd162d0ee3270d2890e20a558d3fce0186291856", - "9fa166ec416ce23cb1d990b5d9ba6e95b6999e68a79b69fc3d35a2f0dd7adf1f", - "88d95a0cacaa22c87b58306d43aea75d6dcb61d46f7d737e12b5947c62fcd6eb", - "67e08959446c840a9bff8ff20224e117e723da927817705fa99a340eb6f1fbe3", - "d99548b0c543438117133c84b72eb6c5e3a93f3d1d66472122c415dd6e0eadc8", - "1e21dcdd502afdb98e94cdd1f32d7d4b0d938d5d5393ffb5a407ee3c57f733bd", - "cc8f73d2407854a4bc02afed354131e969d7024d9991b3efd685a79f194ae0df", - "e6cb6564b5a59705b08cb67800cede355ecc1a4309b4b1c6f7d92dacd4998795", - "90895dfdf895d630853e8262d8e43ec1ec850dd88273cdcb023a6bd8062f48e3", - "d889c5bfcdd565c2118a247e3b93060d2a73716165fd970e3916e4b5a61d2de3", - "834210acf3c1b47c728a807b8ec5b5e38a6c115e89cb56f9d4d317364e0e482c", - "937a93c095b70a74865ff70e3ef6f38d43f262de0163137d968911bab1775f47", - "09eae40ba9cb20b83cde4fd42ff4170a653ab91ef61a712282044870eec6d555", - "2e96f8c402304b92568f8c668f841d0533dc5091ef585f6f6f917715ddd267dc", - "556a431d71d91fce4abc4b0151fc8fda7451a69c5b274f2cfda7ddde2e6d1093", - "17dc4e182f1285219973ab2b7de78a57a50033ea57a45b9ed1806c08527ea125", - "c65e74da6f5188357a8386132de12254bf2af09924861fdc00536528712a59c7", - "98f7c7989f8dbe9d66ca5bfc9d6c591586031579bebcbcaa86e91ef47fac6860", - "fdc176e9f997947193aeeed32fa5e0f3c0a66169cbba1a05c1b2c704d84b7a65", - "403865d55d8d3488b37fd9d20016400e765d2911a5b9c3f72f35198d36dcedc2", - "8fe03c105eb5ca5401742b43dfdb4ed93c74d770f6e36faf96af32650aafda6e", - "cac72a575533ae0358705f1f30d7075c6d7322a1c3039853e2d90a445ccd9dd5", - "aca63c77d74a30089e5da60076ab030f673a55654060f149f67d885ae9604bd1", - "8b45d310803b06926c9ec1bbd7674c4bb87d945f5f0d02ce7f46daa64b824389", - "198ad316b1edb59c96a7901bb20b07db7186ab4d772bdeba5c9676c318582654", - "cbb52c2f5768666f0c35ff9dc15ba12f2dcf8acbb4db3dd10510012b4c7dcb13", - "9a96df95528ff9fa432456759998648ee48c554bb86de2deab0c9f8c2544bf8c", - "3a3a3cf0098c2712f8412ee93223f0722ad6d2ef63ea9594d59d0af822efcc1e", - "5d57cc626720163a9b7a0ab88d41e08a040318be9bde862cd8676ea46f2dedd1", - "1c1ce0f657c917c93d81f412181e494cbf130de960729708014a763b2ba477fb", - "b281ead472cfee3d476d8de1cd261d38ae4636a81fccdcdd93df22435b502c5d", - "5f8aacb486d2eb3269b1fdd73d1977b1d6d247d67cf9ca59c23c4ec879cbbb67", - "aa1c6457a1adbfa393f51da269b4b5baf4d601e4303f3466b9ad1d11538b4688", - "9a62c10349ec6b3624da59cd9ed3f7c026f416bdb1487fc9dba9ea883b39eedb", - "49295c589b71f9a0dfcecdafd63a56b532963da0f3cce5c7377f892697eeecbe", - "98cad4ac64d49d46ef65e5a31d9e1a397f89170ddab5006b3c7a52c5aa7573c0", - "fb850315a66ab2dfe3a6502a9c652dba18a5f0e5fc760bf6233cb83080aaee0f", - "6be2138fdd1105b56df180b95ade8f73e6b9a1921546bf663415a07e4d5cf267", - "b32bc1c8161a03c694bcadc69ef0f44562a670e17c4e1227b6da7360d9e746e5", - "0adcdf9224448de17a3b7c546637a5f1e0881f7523e93c3659ef8ed14fcf69ea", - "eee562b64ebbce7dfdea32d57a6a4d4b72f3b2fdf7c27b8b3e194e277a1e7786", - "39f945a9310a4a53d519fe5993ae904b2e03611483f7c04f68f953283eebd0ec", - "a7b8e91b807d381bb5ae8e8baf9c1f6f8ab14bbfa7d76df39bc61b651c0a261b", - "518459d291fe159bcd829e8b872e48c56b333e961e65a5e7a33133b094144173", - "7140798d813512eba14dce839027085a25be93fa93b66f98d5708afc9c279785", - "798e8f9af7322db87eb9728660bac7925c3caa1b52d088a53219c7c5e3475fb3", - "93c82b165ca4b728b56d92839ba2d30b4b7722da500e1d5e2e3e716fd20e8c48", - "e78cd5dd5fbb16c17c22e86c02de06bd74a20a32f9fd22d13c1f1ce93e4c7cb3", - "898f64c2825a955fc6da40384c99a9521caa3fa8f9b87fcc8d6e3b99fbee6ab0", - "65d000403954852908e8ae76dc771103c61ab7eb0c36e552001ed43f385e8043", - "effde5b5ff1be7cb7addd2ac71df15e622544a85392bc2c326cffb457c2c1444", - "a023a443d26e334f4cadde683e3c7013870e71265b7f4323a9def59e9eab7bf5", - "360f1fd327953994fe28fbee42716cb5ed8d7314c55bb0393abdae46d9d148ba", - "e43b4dd93ea08ea4dd8859b164664ccbbd830d20371d5971abf5c4885cc39522", - "aff2a60eb759a2eb77680da01c93c66e633b388240d04802a09d655532f66ac8", - "647c9d11074a75d4e00b8b92f0697894a63bdaa23a7aa04443e3ca88231ce13e", - "a36bdf673b1d8e8d0e44d1af7d0c7c44cd2076121e7c563310b05ce685079951", - "05301f5bdf94ec7405f3a4d426253d000697fcc58bff48f696251660f25bb2a0", - "6adea83a25b3543ca49a70c0b9eabed54d790a169a4b3e997c1d5fa2f71b3b11", - "5e9b1bc2685f431e0b5d06039a9c7d80b0ff2fcdc212ce8c2c160245623af306", - "1362c1376300425005fc845b54cc30ed7324108c9da4eb20daf54c916bf437d5", - "324549593b85c0da4999dff02ccd867e62840558d13a20650139df96d368aec3", - "dd57a08d4afb73faff08eef33cdb5f66787b6b1fd0c2f2ae80fce801a635f1e3", - "56ac6204f7d82c72591c7b7ad59af26a17f0f8b39effb9c3b3189e238c844b8d", - "6fd5c44bedb2abeb6e226fe68554322bb5e652b98904cb56baff145fe27b1554", - "54cb8beaf6202b4481a1c186b2580a4cac3d498ad2476c273c80b581fd27afe3", - "457c1b640511b198acfe64e6c881383122fea09951d3a55beeac18482ce0a758", - "3d81a4e70bc4f34fc214e1ffdd745f779610fe875e61b369eee1729778e1ceec", - "f326ab5e1558123b11db830230914afca5eab16c5889463ccad2f155e06932c5", - "18c783136f3ff6921b9fe1333d08efc76069135f4201dd0d75795a08cc1ac32b", - "0a19f842329923376981970b11eec14e2c4dc64066b4c137241510756bd8f798", - "024a5b6e11672e8fc6da547ef66a1131162a670d258cdb8f1e4c1887b39e72d9", - "22988f687a57a2ed7a6b1435fc410102580e5057537acf4271a54000fd2cd1d8", - "e1655cd3ebd7ed3d77b52b70a1d025c43b4adf08ab67beeb5a5c8e732b3e65d6", - "d2c60e3d3b6c95e7c0363a7b1a3806a941de556be5e73fc649f129bb951a167e", - "2baf40b2279fb3667e3976f978411b12324521e5218d8c9f38d81170103fa458", - "9f3aa3dd424e9251d23410bc57dac3f0f53d4dd39ce3df7a29df98326f38d77e", - "99b2184f647a113467638fb213492a869d1a78ff43fa21765794ee2218641c48", - "5b29a0154acaa58734e58864972468f882f59a939d640b16569d876ffa8d4328", - "38b2e1702b4f572552c5354c293776d67c76443fedcfc8c94b3f230c9b66514b", - "58b0713d8a096fc7aee601fe442cb8877fd7cce8ecdd76117c00d63606fb55a4", - "5338d472d64d26239e1a29938fa0916a334f0287a6449294732f34c4ecd918a3", - "eb3dd5bbce62cf1a5976bd3c9c7d1508fbb37093a09ac92225ca6945995d37a2", - "7010302e3a1f72efa8bd7dfef2cd8c2489d5297969f7873e4217530805e1b4de", - "c3d124fec5d1a4eb46d975f91391ad7db37a0389b3f0308ef760055a18a3c59e", - "ab88d09a4fcae6b559cd6ca584e9e94aab10b823fa0d426ef1a88ef1615b70b3", - "74ec7e5a28835a3ddc5a793d9f7fd7d2824800001dc17332c562e95dff61fb36", - "04066dc421aaf07e17344cad232631803c082a374542afc8f8c8bfd4972c6960", - "240b73d74f7817a8524f6c9c3e30ffe9daa8287a8bf2f3037b27456a8d08e567", - "552b0fa4637d1cb02dd3c83ed8573b97a052ef5cb7f4fd11da00ed181d4e0d0c", - "87728892fb70d54015e85b4b4b9cd340c8eb9cd54318aedd01302b390e72ee9c", - "ebab57b30404e0153af53fc78853121321093496734dc0a05c0fef467c5df67e", - "d47098efe951e6aee4847e021740259c7dc78a7d8f079c369c9e0d23d8195100", - "838b7b61edd682b2f4a6239557e55c9419e0f69bb5c99e0b63ab9e2ac52f6c5e", - "483ac5a0d7821b6ecceb965b0f33df29d7c2a529d552582a2a56f70c98d6d6ca", - "565f3db52c87ece072df7fad986126e1eea79c289b92b518db5482089ec58081", - "e463c3ee3fbedb43131245942dd255997717a3388775d77ad1bb9f95dbad29b7", - "2696c93ebc5060da4e09f7b856ca5f33f509da190eb1a85fd227748df8d7a62e", - "e5a218d0b30d215e37c41eab5db6e98b5619503320e6d171a727ed1f3112c288", - "4068d62be9d0c8a704731344c2536cf7059a00a6a3de6d1ef71d5482e58eb3ba", - "26a4b18ed263a5a7f310204bbf31143dbe09251072518550ffe4ce2b94e5b29e", - "a8034cbe6ceffd28ac39d16dec48f27cbbe95d329f5c21fc9d7714062a2df2d2", - "5149bea008e00a4b1054269efea050f6d565fb54072ca34d462ef47d8d5dcd56", - "e95b7a4eb9434cae91e51b27d8d0d49981418afb291554133940707defa99a16", - "000b845e7e94b1961141c0c81d853576d4b022ab44fb10da20b42c8712560644", - "84564255d69ec6969db53f14d2f2689c9356f0be69af74f344db8fb4f7baca7f", - "ee7fabc6405b2d7bdb451f8405639ca587b934acca669e3201edb54e9576c11c", - "2e98a27a8d7651b5bc579cbb70b05661a065efda233ac41fd91725727b37e6db", - "e52691d9e47db554842db1d0262835d1713654b84ff42882f2e6cdcde9ddc3b3", - "6903fe220d0c82c50e43657160339fbcb40b0048799d6341bd6127c547e94b98", - "c4b4589f2c5de2814364c4da1aaea29007e67e8eb836e6753337a4fc9c6663a8", - "9db315521ab781795a06abaa7225a65cd10b0ba153a5790cceac3eebfd6a03d7", - "e74b0f4d4702c20eb5d5acf278fe2c1c9ac2ec797f48cd591fa460c08874e934", - "4ca016bfa54ff7375d64ceafa3c2fb48122e8bc7da2630dbe82d414aeb946691", - "d46af43ad775192ba35e97a0a1ab72c7935962db7c2d6f0d2b87f05335e9695b", - "2fe3bdc4e12f390f79ea484e3990e6202d4e8b8135f277a04830408ddc83d09e", - "c4bc05cec1313d671ca4b4d5cd466511f4a3416bb70d022636e636a47b7ad458", - "4dc115759b9865ffc6765a16fc4ce6bdbf104d8ff540bee24488ddb0f9a084fb", - "e2d18d8cc3dd503bef3d7a46d122bd975519452235c91ff9fc769c7e975434b9", - "bf51cad3072d6308d6044e73673c80cc4b5ee75c09ae9b3c2409f4a98907a203", - "7c6ba7451dff9eab35a84b8500817627d0cc6b4b7945c079daa1857df62c21c0", - "4d46b4ffa1126316e3a7487aae3700bd2b376da1e703d7c5393ed8db57c098b4", - "90fb2de7e05709480c666fe87ab2e9ddeadf6a7918ccdf0471428a7c1b14e096", - "25ef74c57e3913e61ce1ecb879bbcfe04d7525eec58a336c3e3a99a1fd812420", - "6d4c4ea9888f7f3b270f5397864dafdaec2c86d9359fe7979a7851f37205b487", - "749aa1b8c192c1f4c03eb136988abe9d466a05bb7b22db96d222c07d24cf2399", - "1f1c05cf5953f6428e34c2d0ebb912542a4aaf51543f6b3fe2360364becb44d1", - "6c2bc0cee58a14493f04d1a90824521a683a178d095e70b5e936d82f540b1166", - "79d856a4add83d49154e166e0bface4e776f23726af367b0bdf94bbe5399bcb8", - "86e264399e1ddfed2b7607b5b8d1bf2c7fccdb1167210c52a4b9ad1fbca37363", - "c869d4225de599708d644c2a98d787e78af7bf1316c367dc61bab1dd786fbe62", - "120e0d3991b3457951ec58d7d2427fdf3316ebffd71197c66ffd10b74d5aaef7", - "0940b75a02c803d80053921fb739e02d89f6998eb4758dfa9555181d5be7c7e1", - "f44dbd57482d08344a62edb788c37dd7895669c8c2bf5f1739b0a64426c1f142", - "1ad3d4ab51c98047973b9610dd43d7ac1723bbedcab1478ae0f9549968a8d269", - "c315225473d64ca7887b2b859acc653f3699e9c7e750b262262272b0b9c486c3", - "ec065566fa29b7f44fd34d54fca0413f64ad3ab3b901ff055c17584cf660c033", - "8dba093f3121aedd24d7f99bd9b398d91b498fe1c27f98c6b09b6bfe85cddf1d", - "5e584e1c9b667d50ac9887c5cca010e7f10f7ad4d33f155efaa0e6b2cbd926c4", - "19c69f8feb6002cb6e948d004710c6d62a4ea5e6c56b56e8e7af94949ff88ae9", - "d8fd4d9f257a92b17a7a1f26811e7a79a51c1b71022a04fbb51508a2579c09e9", - "8caadcc0eea446ccdb1ebfe01d0d3df96240f00f2b5f85835bd1cd2949a2ab5a", - "16f0684ed70c62e6cb17739af95f2cb6af5a50bc82cfe317bc55ac0fdb2e4595", - "8ce580f3eab01f3b11918e049371cdde8df39e5ab81a1471cace2198cffd28ea", - "d90f9a8b8cda64fc62add258511d2007fd0904dec8b42180ca411185efe80c02", - "cfc853db20607bdb61cd054a9d1a91271b1b473dd3dbce9c8c114f03c8e0c8f4", - "69826c54c1bbe7a1129afd50cd80c8123a2e6f887154cc8ff093c7b15d65dc1a", - "fadcb8533051d115c526ac658c110b1154cb1238c88858fd6533f1841fb80e14", - "6469a38667ad31be0a5103cd7045192f543c561bf5489c26c3503307fc464b31", - "b289f22f3c58787fb0e55e521646443247b419096698978eb7ac3fe85f6da5ef", - "fb2e5dfce3fbb75f2565c2a7f0577a66dca0964a7d8a6022bc67922f0d20f3d0", - "40fef9a396ee9409a8ebe05b17ff17ababf5bc7cfbe04257b052538a29d0539a", - "a6fcfc23b44974911857db93a19612f08fff8c51bb34ad9a5121a53939369411", - "9d91d1407a6391bd931f38dc81fb3655ac6c3770728323cbf4593f2c0eebb87f", - "b6d213b2fc996f5e85659322e021567bf7a6799ccca7ea23837fc8d9a2019e41", - "7e48a0dec117f34c3c8152bb1b55328b2e78765bb3e696b27bb2247a6d0fa316", - "fad8d989d2c88083da9891c164e464a40956e3ce2c6dd795196383cf1aaafbf1", - "b44c15da2a66918d648658a0ba93492c150b3d5d9b8604211f4396f83478b2db", - "6987a7577319d293b363cc2a1e895495dd39fd82b6d9b8985933d8852917f5b6", - "b429334a564869a0b1db5423a171acac8c82a3a38715586fca204c4b56dd6b6c", - "53c7bcec2acbf85838a1d074b0f3be8e6fca8b0f12445e29529faf51f095f17a", - "1335877ad16accd2b4ad540550a2be4f355b7887a0ac7071988c1df2bc20d6ad", - "e7f34c8aa962820efcc1af9967944e8c32ed7111a92d77b4b0a8b8bfd605b314", - "8d52f90f2c78612d602ef3880f400fac035397646c44859872cbe38720f7bb02", - "5dffdcd3007fa176bf889198f050cdee712fbc6c25fd302beda9b1ce3d73d410", - "ba186f3fce62cef254b8384bc23c7b7789f1e4afea83f2437e6fc250719c2774", - "fa9314af918680f63d0f7a1b539e4eef1bce0d25e2f361e325a0de2c8337b017", - "2134e32fd588bd9c9509aa564743632d9e1df99f07dc7d69fdd3552dcd255a1a", - "6bdcc348c685e7998ea2d5ce50b7ceec213510f95d3af35f3d804ef3af2e3604", - "17908c6eb8f1ab474ab732df9070e8a70bbdf33bb89fc513c84b8cc7b118ac0b", - "36e7bfccf9e0b95d6e1fcfb72ab30e93d8e1119f0d1b3b98a238b674b44032c6", - "a8c8bd5bd919a2b8940cc4e99ee84d7ccaf21b6d0b0ca80d7cfd40207c97bbd1", - "d5977abedfbcaff4ee5548bd09cf77a9918d857afe927736533f4eb225ee5ef4", - "3b520bbdbbc77f861d6f1a7ae5433f67ba3eef696710a218cfab042e266c510c", - "c28bb31af2e5ea69a71160677bb098fc2a6e8743b5ad7d47da239fb5c59ce6a0", - "cc86a3c1ee1e692a82fdb4c1d7ed2663feee4961d7732c59e9afddfdeb8b9c73", - "1cba7ebd804537313e86cfef037a8af921c23149d0cd42066d2b1d29a700af8c", - "9ddd3f7c19d3bf0e339a511ce266cbb0b5ed062f399d3af03dc2f235725ae711", - "ea540b1459a8dc7ed96166a7822165e0b25b6ccb4f176cdfd1a695b98de8cca1", - "75187214b1295d9d71f7c6682d5222628660961115ecf1168e7da412bd13c959", - "ca76a25b1e6a6514e5546a6d6cfafe759cbf95c10ff9008f693e51623865182e", - "e4ff83e1e3ed16ab7f6e86759cbc50c60ba5c136d637d32e2f5edba9528dcbd7", - "6db52060e5ba8cbf8453308eb1639cddc60c815e9279ee3ec2adc646b46951fb", - "8ead41d4cfb38373e15c4d9aa1f7e9efb0a4d9a7c31a05796ebc0c78fceb3dd2", - "839bd19b6ab4a4004e585c76e47610ea16b7f139a63a74c1df78744e0513a020", - "32fe8f851b080972109024a848567192bc10a6801d1e6c7ec5f1c01bb628e4ec", - "792edd6ab83f96921535a2a8e9068113ecd48d56c0417f0c38d3b588a561dcbd", - "8d3f0507c701d374e1a80f98454c5f078fb9209d1920bd49e30a310f911dd6c9", - "769f467af37462cf78850f3ca4f5099600f3f75621ba45ceb3934ac2ba0b9b61", - "c466574da5a20d4eea16b92bc86a3abcf14c366e8ca4832143f3314fc4274f1b", - "1f3e755981035f896aa16db15a0d2236a424ebe5980ba3b7b173df9c7abc6fa2", - "d82335d2bc91e97e1f0c96aa792df7508e13a6ecb464b1ce6b1136e8f3b9ba33", - "bc86c51eae0c54bec2c5807380f987e52f6dc9d65a9b97f89d8108d57bdd56bf", - "4df03a5fbd5aefc57568e44e7410deeeb86ea4bb4d54bbd4a13ce26ddb272a8c", - "49a0d28e063104e7beea7f622831ef1ff4941373a96d561c3268f63cb9fe3bd0", - "a029ffafbb9c9bc1da4429194451604592aefbd996b107e79226138c44afcad6", - "d32c830205351601048f467edcd5e4cc4911161b7f63c402c7cfa195725cbf40", - "5c963893563269e3a8adb2e20db229acfed1816251763caf8c1dc80cbcce8b30", - "1f151f71813619593450e3fff5a964ac24db3e430f72db92ca74d42efdcee731", - "48a02741b242f690cb1545eb539d8872f44e261917b8fd2693e4a547d96f7239", - "425df13c5937108ea40ce3211e5ce5eb9d60862b415ade6ca4caf89b65354996", - "913bfb637a17cc24b8ec29068308372bc1c9643ff8c2e9177fe8db3b08363044", - "27d2e39ca517a1e280024ac986b6b7d2018729e83c30fe5745497467d6a252eb", - "d80a24e5d575c479caa28138630f82219f31f36c70b534d4bbd01bac61726b22", - "5abe59a08860f29cb907b4ba597778de276137f87dc7287030361dc58e4309fc", - "7c2be8c518562ca9c027c9e8777f1bcae286f2e419d8eeba957d058e41f6ee52", - "a8e9e6db0bd71423ee63c1ad9f1683d57a8a5156ed9f244706cd9df6c723f18c", - "de98bb68c00191b7b78355b3ec0d75c41aa97954670e4fc1199daf8fd5826115", - "f620a14560e2f2b6b9cfd5108bf70984fe8d2a3763c1cd57bf7264bdb0a92993", - "3d7df65a04bf18068537fe335cc9ed5f242968047616cbf47643358709cdc828", - "9ba9db2682461a5c47c2a929d9a9808e680093656225c8fd791648d4be1f9596", - "9e3c541918c86ea525c3f93cd4ddd6eb37001b67215f1fbdd0a0f6e6a1224705", - "14865294b6b509e13b6d1a95df532162adafa34caa35e5cda1c93eaaff3db569", - "a2840e21ad66c2a883680651663906e1293a76ebcaf42e4218ea35f5a2120e55", - "6ec72d3952d30ba725792b57b160e90d2f98473ea5adb6bd9430d663e873b7c7", - "5bdecd0df0dca90aa1d91bef4d5c0d4e26823ffa12c76257d8943ed58c73b793", - "e5613bce74e550884d03fc62cde6eb97c7fba52482a71043460b389203df9133", - "e7cab4468324ea9b395c9f8804dcc3cef994611d2b53b273bd4b13618b0f5345", - "caea62874e4cde508d88b99fe16ae670334663c83efd7b6c4a7c776769a1fcff", - "baa53e688a8b586d723001a9720fd64b236d221cc274d0772da427dc1ae9cde9", - "2bef7c2bf8370cd52cc1f96c749b1acacde51c03d72b7d85df86186e2d419b91", - "68299e6fa8cb636f6ebfc96add4e77a69f7ecd9ea888fc359e713473ca178bd3", - "40aca84254623cd2fbc8606ee86b9aa9d71d12043957e9b5ddc02864f518a7c9", - "7aba65baae9d4ebb94dbd5871a8382049c3f20c93be4b2d7d56878a853147c9e", - "6a29b12acbb99f85c6260cca159073838465544f09c6fdc92c16f47d5a8003a1", - "4bc66ee918d88426f7be263dd69fc3d761ac2a4778d7e54ef28fea524e5d7e32", - "d0bc011c0c5fa8538017058b8960cac9132ec1963de62db6b40f3f1997822f6c", - "6f51b6ca03608f501346e46796771d957c057b938def479cd04fbb879d590810", - "affde138f59d23a279807c3fd4233b6a0bceb22b1fc3a283d684de68ccbcefb7", - "1ffdbb6627de109526f951d7d84b91859f9977b8d01630aeded5d6d5655d77d5", - "14f820ba7fe004525e5132346d6fe75ba7c1d0a27d220505b774066955aa9a59", - "f20f504c118fd2244df4f79622b5a6f3086a06c406a6f819955003d1171f022c", - "a05df436d13cabb84fac794c841c40dff33278c41ce02e2a677bbff50e884a39", - "603cab8be0c047919e0a87e45fa7638aab0bfc1ea8a429f34e625287a3be4dd3", - "07ccf2363bd16870a44c07bf01a1ccb45974ec7d048fd1c0d13c9192aa5f908b", - "dc02993eb89759208e6250291e4c9397aa92bb635bfb65df67e91c0c49929364", - "0bddc30fc10de155123f61b8848533afda0d738d39c145e12a41246798189e3d", - "68c9ec1ec15f33288ad789464f0079e887704bbd4f3ab6aaf7d0b8e17f864892", - "7ad23c82c22780720e2b1c58d2494b8b0bec51b9e0d099c405ac4adf596ea0b2", - "34506ba1b1bdae992906f2bfddbac5d81a9c00924cd786c2464ebd095e563b34", - "e00bb21bc80540212f6c7efa0ee2f126f0ca969ec6fec90f8ecc987d7fda9d30", - "46b04ada6b910523278805e8f0ffea2227e5468ed904ba3bca40de598f3a37ee", - "4a68af8d823b8d234217ad4e801d71cf393a18b655d58c76b4d6c51b70e488d6", - "14a59663f21be22608a20f180dfb3d912e9ada7d95c96cac2df6590ff7a810bb", - "db614dd5a687aceaa9c07d0f108de9efb3dda955d3a8dd64236b265edeaba7ac", - "76feb02c98d695957aa06d0439a2343b2c890030e0b65426b4f6685628c5f119", - "1c9cf6b76f31042b37008a5aa91f88a8f1c25d2baaf272d10548745909ba9023", - "8e9d53f1cc7cb1346ed13242fc4198af248aa395b14f4ff3920db8036cc56303", - "932d68a5f7156d76e52f791c8c88a732175ce7b708d33cbea12dc0cfe2ec3aa0", - "700c2eb16e18c146eaff3ee13f3cf7ec5ce81a56f12559b3347834c1f82497b7", - "db782599eab50ec5db8c47010cc07e726e0c1a41e16b168a8b3b9b7ed25ed99c", - "9b11aba449531ac1cdf871ba599008d0b1b0ee83464d94f85f7f9f436e5fae94", - "27c3dc150db0b9b45783bfc2146bba1d13b47670573bbf1dce26bab30ff94af5", - "ee1087134f035ab0437a56a87a8590aec1b13d2a2fb440b65c7cb9c3c7f9e170", - "196673823eb4fc71ee7b0266f2709656d3e8cf5d33269c857ce9f8d0828fa71f", - "8fa236fb7fdb8bde8d5dab0dfeaad7ed368cf91d1d5ffa3d9cb6702e18a907fc", - "5de03ef734b1e3d44be625405248152f7725c0b0c25a2797d624514c30372a3c", - "8a67105bb55a67c1e7e8991bec8049eb597c58afe16467435e2b4fd7f14156cd", - "a94655052531b05494d679f550230798e8d587fbd2fa4fc86096759ba5cd20a4", - "7aa3f8e57dc39dbcc5966a581fa7d676791b393d4d8f47400e48b83fc2b157bf", - "b18ef072822f259e401dc67ad82fc35f9f24932e2ed246e59b75305038475f41", - "b251de601ffe08527d55797df529d5442fc20c19f61fb367ff6f2136318f40ea", - "7ef943211bee94068fb3b7db1122cf78866eb2014d71c7831412910750ef1642", - "82c066ece026f19e9b512f3ca4e70d78f83686194dc4b86e03c8d3d79a84bb28", - "6c3ff1b4ff0dfa4c24588d687b269f7520701c175269fb3118b5823b86404ecc", - "05603d07e6843b1350f941a35697b6d874ae6628a4ed217ba5270fb47380ab73", - "9bd1182334280ad3c0e82901cb8a8462344c536f9a765dcbd605322d3f5334e3", - "f4fbac691472ffe2675b6c151447b864d3c58549ba9f673294d6c17cc93f5e18", - "008fb1053172608b7e0ccf2f08fafc03679c6695bb62690ef88bb06595b3fe16", - "1419b42d8be701d75350d3fb3186bbc8a06233144d7efa0597e2c483b3b6fa49", - "7aa8af5b9cc597ce434233339f9e30eea414446c38728a80c07584f38d391e12", - "ec509501ac8820f0c6defa4c453fc7be10536d907e0995da4fe382ddebb01e28", - "0bfbf6cecea97e707e1f1967a7b93b38e88fcda2e56b62dea5dc010cc34adeec", - "8993b14513d2a3c873c3a48ab99c96deb1c50a95620f2921ab3761990d72591f", - "300efa380b444cafad9961ecac7ea5b0331970be5c91faac441c5398102f4950", - "de9520df6d0637b36b3b5b67e62fe782f23aa10ed97a2a6a902593d0d0b340de", - "84608f58a1f0c2678f97215156602a7ffcf4e1f2afd09e12ff29ecd454a12a6b", - "c45422e31c6af873085d23433a79a70438e732ad1907057b7401146c5af88c46", - "f5eef6845e923d1f7dd2ec1e9aaffaa907a50a3da612d04156ca98efbea43db9", - "08ba032822f675254202ff844cb5ce3710fd078aa071c8fa4cbfe60a4c67b1d5", - "5ac77e78cad3ef7335a9ce77f589bc39666410eeb0a696a13e9a7e3f63053eab", - "b0bf07b9b05e3c976abbd86798abd2277b02d12dc28bff2f1c347da1ef5d30b0", - "603e7bc4adbd3bd968d50b3cdc78aaa842e1f7930ae0716c1e19a9581438948e", - "2f0012e12e119eed3e4067e5ffebf5d048fe9f310a1b361d562c1975b7b5e24b", - "dcb61b5725e7112351b53418e2575b9edb5b3b756be8d6cb65b100fe90e190e3", - "d7f7572b9b19c0f9eab9cadb2c80e5922a07ec94c95714597fea00865e127f37", - "b3f8a8f31c8e166d256cd4dc4254f711f0663140fc7473cab8aa22a10ff6bd0d", - "a0c9aa22935f77b71729d8de786905014ee9dd23e0362bcf4cbd9533ddb95ac7", - "1784a02235ba39bd6dc7ff3487134c6a8258fd412612f06afe982e897a8e4013", - "4641742d6bc92369c10d142db78c3f3fdf85077304f049722affecb987f5cd4b", - "2ede8fc317547bdbf0ca9dfdac97c7f57021ab6283c3d41a35c282a951e3b8c1", - "f08b3c3b30cabf299e01922a099f66d2e587cda8d76dccc09c26e2628f1d4b34", - "e5a39f55d74f37223d19d50b03a1cc0ba4bbc5d939d2d32aa5911fbb1b21f98f", - "0624a8b525ce69e13ea454f79c25e0b30257ebdde70043c7ebcf627d7c42e241", - "c6b0fdf16c84120d581e435adde6a02481ce54114209fea110b3b70f6c295af8", - "5ce6f5da43faa40d69e1df462c68ff60e0dff61de7060bd67fa5089ef653fac9", - "b4a7247baf016e002220c5cb813d15b1d36b819258b1dbbdda9f9d8b90b2e632", - "7ce630c8607cdecaddd049c3a9bece3fca31151da4edb4d30ab5fbf0cb3f1b4a", - "0cc887a17f0981c82581b3fca2e0b6452a1d63ae1cd23438cc7842f4477d5a5e", - "d0113f42ecb7bd6b74ca4c2f7e6fe6ad78494481175681ae4b8565e87aaf186d", - "2264907ca82e6fee78785c8c99cb85adc9ad53dc9dfbc2f80e5fb137e18be89d", - "b6fa04febc2c7913d25a9b580ba697cebd5e352cf567888a0f4a2c16565a2e9f", - "bd8803fd99484d37af011d592035f16f9979d9e645385966e6057c7174fd5635", - "0bd8aff155ef8eef6580524c42094c8838a790c397a311e7f286985a628442f7", - "dfcc9681bedfd14d20bf46e3866a0585594a2a49c380978a843683dac33d0634", - "bd168663be65fabc23334482724f393e41db2b0dcfdbe06f1a7e6dbb2d6fd804", - "c134bc41f3e8c2b7780bda46a2682a22ec0cccd7ad003968b901b3ac0acf1c98", - "c0c56cf5b0a84c91cdcffa58a131193b3d0283bf9820c1fa491a557610f7b084", - "6986d92a134103c563170b2ce1a3296f384dbfda54a80c0f98f5f658adb7c553", - "0c7b9729d319b3a7225f1370fff064ef169da878546dfc72d115532a548e6a8b", - "d64403a664a1902fbc70f6004d7e3e35e3ebe4487b83fc080a954ce1311ee808", - "7b3e7e0ecf84096301ea1260dcaf2531fb64743f6e49b6eb1e560c3e03f74df4", - "b07c01fe14b76e7224b5bc7641f170c48fde9ca6733c3a5400858b3877f9f858", - "4463dbc61349752a27447db0b35612494fd15a170a58b5e63856f0a175ac4490", - "e134f97f5c1ef3d85ac514bc0ede9076ebf58abe7d13bf9a8a84ec3edf5f0fa4", - "6b7c91a731c82833de121f71504fa79f7bd52a9898f314b8ec42744e397b918b", - "35a0069a26a81e87b0b008958232972c60f7753a40fc96a4f12e9d9259d77622", - "90f1ae4fc3ba101941ce210730beff085702eec7d49017f21aa7cd8d5af337d2", - "2c615fa137ac317b8e444c5a40daa2e6e822fd456b7b33885885d3309ee3e021", - "c9c43e65a45b7c06b641203fb12f55181363cfa25b73cb07a650ce6abba1a0ab", - "0f055d2305b417273b791ca87461ef8ebc361ab08c1dae55d94f423476a7ad91", - "02f1419d4ce1e51bad3123065bacbc3e71ac1627c71ada2e5882f5f11a280572", - "641eec848c5b897ed65805826960e19425b1290320c9e595d31e7e20c2093dcd", - "c00de83da06f7abf48158bb2f04156b9afd1c0bef54988f9ee57d60340776b24", - "06c8181ddde592c2ddfbd7fee591ff55413f2ee927d6572f1f059e06615128d4", - "c05de115a2c02ef443e5d4c6ce964dec349012c9bc96b78684181024b1ece2bd", - "ffc837e5809c50b71cedb2b549bddf3aa6e4e665d853e28c88a7822d9584c8e8", - "bf531a9a04fcc163e6679a7546056aa38b8b77841e45307524983a6639a296cf", - "d5a2220625f6dba9c3b1fc9f454c48bde058c2a8a7abb10dd317bd543ed1e4f7", - "0f946a9db42c9997cf8602b4e2a5e23095cb3037390126ec1fb1dd8cdda5ded4", - "273ad1997bc49bd5e07fd79bbcbf93ab4535dd99b4b37aa54da21afb4b3aa997", - "fdb5e835a798a969f61b320ff12b33a5e54f97b96f91fd5825782a652f132db9", - "5350f31ba1f9e20471940ef6e45c61d317787f469a8f7234aeee0d405b07a7da", - "730759574738bd479e4c8c11b184c71b34a7f1d79bd76be8b2414c58a6214d92", - "fb3e6180bd77baf7e856c88f980297dc6f799bcb737277641da3f71bf292721c", - "d0e7ffc13fcaa79b79df4d7d507f8f9661f4d5d945e840c1ae3e86a96d2dd5a1", - "40c57a0b88073106c9fe45c31ecf84186ab940d7dd1fd2e05475968398e1f06a", - "c632c43de09584330dfc881bc924fa08f8267597e5091d36931df41d33bb57d5", - "681f048587a0fa749b685b2c8a6d0d1b16e10f0d1e199f91e7d438faf5ea7afb", - "6a98478e52e84a6bdaabbe0efd17078fb649bd5301a0bb14e52ad217ad6c15c6", - "b2a4df95e2d4aa37f824da751e4b5eefcb1113b6f8218ccfafc32dc8f5973273", - "5e51e425a1d9eb572f4e82617e85cb1759394aad700e73a48e3001cfeaf4226c", - "4874683c4a2041023e3b4cde45ae6934b31ceebba40a7aea2e5eb68123e72ce6", - "e89683cd3c6bec8d6b9697283cae2e3072194ed599e95da472bf99256b07e343", - "1cd97d70447c94ce1f0ae06077032596cc8cf9e8637a1e5c064346fc31b2c4a4", - "49ae1f25fc2cfaf183cd770bc4cfe55de0fd0ac5c79b2d9e754b2793ffb39dd6", - "4e4252cdc1613f3bae2f14b8b236e7eb8de92add29b0c337c32703ee04bf16a6", - "3e41b1ce30b22acaadfdfe084f56697f26240c92af63a7126202e4f3ff6ef444", - "46c1eacaeacddbe83e6c18fea7abdfb236ddbaab5be703c13b6ff015796d326c", - "0e140c1ef63468c19346083ed82e0222d9894e59f08671b145b25180ec8d9b4d", - "cfc3dc42a1a77faa915f9b2fae574852e14cbbef9bbf281d3ed27c382076f6c4", - "280670911c25e02e8bbb3d8c1e7ef8578fd4a5884a8f4edc098698ea2ecc9f9b", - "288969521f6322849f2705c66332c86144ac6b00cdbab2d14cb96d1a77d7d7e1", - "862a7bccab01af51215231dbf9353026b257442ac246967299b275e9315bf0f6", - "93ef4889f92c66c1e67243a41591e3d259b194041baade340622d40252869aa7", - "82c711943569f7de2b4078e55b268f55f046ea9bef6a3485f35f4b728713039d", - "3034b566522bab3f5a6c55ae842ae954e4e2d0fa9b4960de61b4fcdb31a3183d", - "20bb4d9ac4bca818d5d988668f2d2184651dfaaa5fac199d07829c0ea898f137", - "a46ca686325534aae5ab4a470d2a051982dc5e7adddd4094269233556bafab24", - "004e684afcb3cf7b23418622e37b8eab50a02df8aea40334fe2ee979c5553058", - "70c3b84b795fc2a265be21a4cdbcc221829c74b2fc83ab08c7d4a0e111e0c829", - "c0fa181abab876957c862d7914b8c9776dd29c3d85179b621f62cfe4e3547009", - "83165f051e3316c6b6402b6e1230996b82251ad2e86643cc642d05b42b360a69", - "390b5855f284af43e9182d07abf8593de9ec11cf99ba365bd6d0d49a94969340", - "89a238eb6a9f0dbccd373237b972b75ec9fece40e58e6443b816efcbd4a9e52e", - "73dad4209c17880f3c001e9662582845f07a8ca6a29c1048218989c0709a54b9", - "a7cd4e972e3b5b205b978dd6b2de27d2f368efa902aed48fa8be758eb6bfdff8", - "6fbd02757eaf831cb745e77a835ecaa65ec46a993a88f36cf342b4e4ca117dca", - "eca43527e2711c50133dae7c4c9ea79b76ef5c7a27abcf42cda3e03f49809534", - "603eec297d325ce68942d544f3ded0bcba967c34a12f1dcac70c2ccd721c0076", - "540d1416e82ed85fac37ca358672d5c08d295f0d83114b79f27470db71ad675e", - "97603a5c5269366961d6990cf1320bf16470838d92b05f61db83990de54bce7f", - "2a469c2a275eb96096c8489bbb858118c60627be3924cfcbaef8fb102363d085", - "6e2a5f61f152fdc4f973215be979f52400e5a71ffcf11c75750bdcf892a51410", - "66d8c5da2f4c873a9ba58cd0f2711aa506bf878750ad7b441f4dc414d9622af6", - "1b839368c6b95b35f1abc847f150ff3be1eb939baa3551f54ccb2b455fb30141", - "010e14d9fdcc58d6626a28324c9f75e250e113b581a2cc0ca3c219965eca2573", - "a0f8afeb94b98e87571baffda7d3f3593bc485fa27e39248003587c8e2d3441e", - "38a2deee1dd8791f073c6950ac6fe946e4ffa9a786efc277c5cf2f286fbbc90a", - "252d26e5cac47828b41ddc4a09d397c5dd63c98da38bd091526293fdd68000a3", - "a639a242fd18d118ed66712598926053b6e144504c0bfe92f4dd9912065077c8", - "809bfbeb93f403c9f5d1810fad618f14a1788f242bacade1cf5dad9486d8e7f3", - "fa9cefde3304e33deb739759cb87e46461a92fd8f1e67996335ea8a07db94e6e", - "620a7723ad7b84d57cca3bbcc8ff7e7584f636b122057ba282e6444dd96d87cb", - "132138715706d6bcaccc09070b02bd42335926f96220ccd08437a81d375a0219", - "5fec442d283b178804204709dfcae63a0b00f5e956cb74a2692ec05c78a0d824", - "21c38dd0f0e815c180c1923bb7a5fba3fd71c407ee55dbdf87dc03cb8515d9cc", - "cba3438e038a08eb93dd4a3d5c421c27761929f5695aa82610c4ef7e3309bbe8", - "79af3c70de6bcc9eb7ccada601a547bf1cb7cced3335ff5ee17a5b07509434ba", - "3a67425f079beec4f5b90f9a4519409a079520cf691d3e4ce0f1eb49e2659f2c", - "a13cb53015bc4de26491b0d42b43a45101fb0be58934a2bc3faa0e5cfacaf00a", - "50a7aabdec903e7fd3a98dc94c69a6a5268160c9de95497110dc6026e513aa6d", - "96ef3e810e2c04e430f6579488638ca77854a843207d883393208e2db9721bb8", - "17faf5f852c10606cbb2753b1630ab9cfc379e5feff5ad0535dc86fc502ef1a4", - "837fbe7da6b47f072a63f545ec8ff4968b864cc2a5ad66a63269e461b496d176", - "7bef4a774aae8b01a11c8e3689bc00e360b5eb588b533efe83b1149b12cb7d42", - "992f44f9203f5235f8fa47c70ea1df6579463e7b346696d4b2f5e70e082ae5e5", - "2a3508d3456720bd8e90de2aa52f89e38bd01c5357dff6ce4e90986fec109e61", - "ce678c2af73b047feff79535c05cf54fb38f094ca4b5dd60e0c279a80834ef6e", - "d1c80875ffd7631ffa8d829ab842f124c96450f12af74c926a4eabcac2960498", - "275ab9b1cc73b11f366a80216bfc20bf05840f0a375f23e3411129e64e54cc26", - "114ffff5575a6eabc2e3d6b80f924b25d361730b186012b95a56f957e05a357a", - "e4d0ab45658a50bea90f56cf65dad1a2c96303899bab5daadf5d4f373cb08891", - "968ed0f14a55e9e0b89279254c140b148ffb8b84dcb33935ad361074bba39114", - "40d97ac66f9247599afac87ed8ea5893fc375f4a5ba6efe22cb78ecd308ce0a6", - "48bc240747b1e69c88b6aba09d8acf677fd6e3c9ee3aefacccab6eccd1b42a07", - "ba50a0a129bb065a6867e13a8a6953c337c098bd35028c240a81b7cf7613d210", - "1fbd3719b95898d1fadf3b6f378b89360b7ab7d045894081f7679c66f6403c98", - "e4d28ff764535795a10c6be300add9efbb3e7074ec3d8e3f4f2a95cff2503145", - "4e1294989020868eb165c7349d92ce800ad2786fb0987958acba31b1d1d4e5f7", - "b0f16308cd4dfe694fcafbd445ba85d64571e27e4f7348d2ed82bf857baeffd3", - "2332cb4e8cedda8284c0c9d5c55ec02e44ca01908faf58fafd2fe4137afda7f2", - "cba108a09a7ff592e07619a5eb2f0eb005d626f9599affe77db41ef6fefb0a1b", - "c00d94b92fbd5214e3ee24e79d3503ca21419f2cc2968095ce78149a9f8aae91", - "dc9b7b14139eb5fd1eb4e5ab12d0785841cbc6b0dda0599c84308d98c9247945", - "9d3b96a934a92e169f93b13e80fa51e0f4aea16bea177a65c1c9559bb9e99eef", - "bf89566ee8190c3161a523085226496b50d8e8080f324fa3c658d36975e6e607", - "fe4bd8a09a1c84c2e2edad046a80c15869ae62e02ef3391aa6ccc115517c6fc6", - "6fbfad58bd507bec58cff4e12d4fb91b43fc14e5be1267530640bb95ddb02fc6", - "8dbd3415d93725474909c281cf23e1309e8ddeacbf05e0583b3a2644eae2bad2", - "24166dfd9a06a45bdbb74e20e78b31394085b869044ac1fa2aa94e678e756b0f", - "781f14cb34037a691e207c269748cdd6070dcea2a8397639b0bfa031015640b2", - "3f01716761c3fb9169eb5ffc4be316b3a619c43725bc684ec8da919df15496a7", - "97e649a61b1f6499ff42beacba483f053181ebe188be86ca6bd43618155c77a1", - "3bb8d8821abd39bf28bed0c79bce65230159f055655474729f806fd7c3ab4119", - "335b45ea0b623f51ccbd73e2a63d984ebb333e13ea9a0e6c4848a7f1ffe4e4e3", - "895c6676ef99c479130c6c7bbce97c3e5833866026f406866bca120a4e87c09d", - "91569db566f396a54606ea190e19490c587ecc723a50d22511c352b3b4727e9f", - "0d6ffae74d74c0b97bf8de3d70a8fa2c8c450b7ec18efbab0351224f7021c9cb", - "721e7cbee8f5ea9c05fa5f138be490bcb028dbdfeb04d119e54d12b4c388c861", - "97d387d92583637e726143e2339a8e9c272f472d57628de95cf40525f1966306", - "44dc8b14fdf1a3c3c518ed3bd52afa125f99f65e4d21e95495466f0ca89204bb", - "1f59b83fb8a7d0b8854bbc952e0747402d1db1bfd7f30048fcb6e0fda023fcaa", - "a65cffe540382a294a3b4060acaa749412f1dab7694f68698083fd147159794b", - "5b0a89fa21da97d0d2208d93c1f4f61dbf3aa6f27294e597abddf43c24f2e3ae", - "7dad8f86d00dffa86344ab31bfd840b00e098c7d31eb27257dfe1b6dc864832a", - "da2c0d98e22e34a4075242bbd700d6fd2a9141ea771dfbed7b2b69f3dd923973", - "b40778f91acebc59c661a93cd77b5c26e1b9225d9c696f05ce6c97ba7c265804", - "d84be6d18feec13b234dfb61d144ae325e4888bc73be19dad3a15253ae2a3689", - "546b403f784e4a34325b7e4d8e47eacbfa07e647d00ba0c404103bd7d8adea67", - "1d6d9e24e66f332dceca36c4e6b92366e6c488fc4bde198057f4cefcef19b051", - "d3099e47b496a2adb794fd79e66208f861600753c47b2832835ba8b1c1365ef8", - "8d56a7d73a99e64dfc4bbdcd009f385b3ba1091ec53c70a6ccf2a5430fcb353f", - "744bd8855c53b5710c0272ad759009b9723e25fd023ba2bf2463f1acb70a0e08", - "254289554efa2c1e75b247da5d893011dbeee2e9a8a93515027715e9ec3ee799", - "af35e809207724e172c798b97d2a8a57665220ca0a9ec7bc1a7a919f33a524b9", - "d794fd0d9947fbe6c3102dbe2edaac6006ae4ce1ab3b354f8fcc7a03f24d2b69", - "5d87d0d6d21ec01ee2db737f19aefbfae651d07de730d380be27d25a202de800", - "eecbbcf3a99faf6422faa38817b02fbb5e4b8c343a28808b8e2723606977129a", - "4f66f050d1c132a5c28cecd85fd821355dec6e61e866075a38ef8c3830afc4e0", - "160a8f63a62e91144ea0bc3eeb1d2bdd7c66c3a09087621d31631436738b5467", - "75f935cd6d221ef460b12f638e6bd6754b4d2218f86097d68208bc60fd3b78a8", - "efa9956cdb55d5960bc86a037afb64ff9ff484b7aac24f8e4ead5b34a1d1ec6a", - "9d4b555bed34d680dc9d4f59af7f25cf7e031c85e312d1db7b3b3af82b00fb38", - "1931d6cfd1db3bfd3fe1709dffc67f6bd0d183314f0025aae255a592aa06b35f", - "db6bf4dc69cf1bd44db4b55e0e4276c42b1270c8adf7bd17e87f50b2a6673c6f", - "c93aa0c3019e080881281982463351c0a6959501de3d0a9b9714eab47d21235f", - "e54bf14e83150b3df9ad94e5e9e2a7de9a9c85622c11772c02c32b602fddb48b", - "191a12f0352f9dc07bbbd86bc0486bbe8464ff1ff6c2011dd67e405c6152aca1", - "ee01d4f956a4592824a938558b13b37cc4d450986ca9af9a0f927f4c0e7565b3", - "98f859f0aa589ba189b44ad74e89f3772012c7236f9473473743d017a19f6ca0", - "daa5a44d4e319e900c97ad70294b429b9170ac6568776cec12df33311c6f787b", - "c91917b947ad4c9a11cd15d59e4d5834963850e90fb781be23ac2be8798c62d8", - "5d2375c88afa26cd49accf18677b3a289d5e8f596e7db73d78bdca1c66c08b2b", - "d8db01f18862a78c48e9c3fd557de3f0d5c5ea845a3375d3440f07f965607574", - "b66f913c9033e016bd8fd7a11f01ba8d6533e2b12e5457409b9b723f7b82a081", - "c40e8e5ae6ec5b8a368fad146d73719cbd405d0fc7936ad5582de4d1cd3057b0", - "75d7a381756728ec976677f6c8907d7744de3fc2fff24c747cebc5813c6fa4f5", - "64e6e7a989ecb48b405e10c6b18b6a1ac028ed99b22c68903060e43fef509daf", - "60954154b607bdc2457d5f4aac11b570b85fe227c66c5937c0a21150b15e1b7d", - "1b4b63b1827d9b531d6100f45dd10e5770e6e2b6b2b6f5b8dfd6bcc787bde15e", - "a02f60da43230740486faca656c26a26b268457f7ee31a5d38b7a7ef1a860c63", - "fc0dcef1c61ac1d42246f012ceff9fe37735104babb77be2c096dfb533ac03fe", - "5583e123bfda233999688f2d08102f042351ffad7201a61ab55a7a313f69b97e", - "e25aa8f69380f488ea0c5193f2f187ee218d3ef671a8bea5a34b3480e2d99f67", - "4eb32138739477a90af9c8b461b70db7b3730c81aeb8c55d705913895b8135d0", - "e1926987b97cb71ab066db5cacdf119260c7811ed873ca8241bfa215ad5af184", - "a495eae51cdcab5e0adfc00da5fde98f02bd17ec5f38768cc3ff86bcdbe6c121", - "7ffd9667707d7bd52d6f89718e558c1a3d64781cbfd40fed62f91cf239de1288", - "f65a7946898f0fcc8c7b68fca95bce550c5f764eb9257e235bc4b41a093c062b", - "95391a126e473d6211089aac79f5641e5aec8bb4773b74e712f2420028e3ea82", - "37a302f91e1cd94929c0f83a92976383cc03ba400e4fd1ddee09afdccefe2501", - "72d760650ee947a50245b04d4b129e4fb2490721635d28168c1f11a59ca4279e", - "553b6a98575fb672a1834235858f7690c51845d67e91ff8f11df2e6c923cbc18", - "084416e54470826be882fef2856b45796566fc72bc6611d1e2fa8241d53978b9", - "45d45194376adb68f1a2782754eab05e6bf32b31e32ab79582f17530b9809774", - "303bfb80e5900eaed121104343f649862fba09a567bc6d2916da52519a7f1057", - "7f4db474ce1d10909808550204c910078bc8743555f55749abe282def1bb6f7e", - "3a3049ab4fc2d69af0c607f32ab60365dbf2974c1d1347ad865380f3b7c3b7c1", - "680e9e22e343cdbe61262d9ac2e2675a286925c72b18aa606a39d641087c44cc", - "6b6ae385a38b932bb49648bd34407d236d8bf867b1493f237000f5ef389f0336", - "a3a297a344bb2ee9f0645f9076fd5924ca6403144d426bde240044424f7ea267", - "12b5b01ceabaee6491afbedbfa316e929ef0a44bfbad275917f30f62a6f25ec6", - "b619c9f77efacb02dca3757497f60b644db718a5a3a70bd93e0e95f1bf224eb9", - "d7a406217b51e5520851215bf73830ba3b0713e7e230fb21aebaf3d9f2015dcb", - "03ee18da0c1d2e7f1697226784b1f198d76aef6342a2e7c910b48e5101bbfe13", - "256e4d3ca02c8c2f9ff211e6792fdefb69189c8d989fe2605814b150159df926", - "e3791a5e700e52882312c249c615894994317ad784c872597fc2bf46dd0fae0e", - "fbaceacd8e1aa8d0587fbc2deb6898148efe9bac2ec22e44805e883126a9caaa", - "ecfcb460a7129a7538593b96bc4f214299cc28ca7ed143d7940a88ab33b72570", - "7a0cc1cbbb1f4d3b2792e071d79b5fbe043d75f75bba62a14a6374b306dc988d", - "76e5c75aa5b0a577118227759b39d3e03803f5fc49a58dda1d769a1e7c0a5250", - "8a767c64b4211cace7d00ee4ec2ccf504163a9c2c8042ac2af975272da35d04b", - "7905d8181ce9deaf5b5ddac9bee0e7541c2da70fc02e681175580675401b4f66", - "68dccb2a5626a986c8d5baf43f3b7661c017a8cc4fd6606bca5be7ebd19d8bbd", - "3715af24eb5822805d130045cb392740a7158c283d82016639deb69b54e4d83e", - "a53785406c1b30ab2a2253070ede0d786c885c320dc1e8c28a374c610cb438a0", - "f2ea4f6be4915d37632740c6970dbdf26f01d3db1a2e5a667ee48e7644618429", - "4395367206fee604007d2800ec8e0eed13d82f2aeb62f5b205e745b7bba6cdbf", - "bc4185d90f6dec11f80c483a28ec90d99e3c5d595b9f680f1cd59d5e31f82947", - "8d2f586074eec0dc06577161deb18203945c673baa2ae96f2f9f7564b29a3580", - "b4c36ef5d8829a18140ca62033d01f71d88f0bcbf89a5b42a3d6b0fe68211ec6", - "dded3845d4d53739dbd82a571a1a434556444ac1db675f5beb47fa2ea11e7edd", - "5b9ef536491aa24b0650eab8bc97086681e26a455d923cc7fa4398250924372c", - "79f3a79704cfdf34c50128d9d26acd3790f63ac83ef0355296ddf0d7a54466ff", - "7d72bf4a3615c4845eec8797010e1b6e3d817b1d0083c0cd7a771e1643b3db22", - "37b81d4b2604647d8c8f2f6ea5a399f336ade9863b64a8f02de5f9fa003e4c1a", - "d0818e584d6b5aa23a882e1ed32f50952c8517b7ae59e7f7034593dbf67eeadb", - "1d4ea6f5135d0d6ed61d01cb2eb0b3903a389f83fa54fc9c8569d685efcdbcb5", - "634507b210b4469b6bdb35906d04f74c79cb1dac39a44be02871acd3e32c7954", - "1a21b9fa2b73345f3a279280a72173e3e75c0b322114b2a151a757061faf48f6", - "09854210a68eb3e665229b3cbab55718f409a106201efbc07e4cc01755ca6a8d", - "f1db6abfdfb2330ee145de461df4ec0bda5c0adfa534744132e2ebdafecec165", - "4ec2b95c06f2c185c47fd9bcb40d3403b702715ee235336237aa03df49cf434e", - "005df5963bf0b2b74b5a8989bc3de74a3ca454f27e337dc80d1219b2a3c9e68b", - "515c38094d64a6243d474cae551e2eed5eddebcab553037fa9128ca8a9c104da", - "941ed14b0dea8721a70b9b8ca54cff00514c09dc5da166ad6974a4c4747f33ee", - "9cdd69dfc10f0607cefd1e4fee5367eb9264542eb309fcdd3e01aa4d31a2996f", - "7f686a9f2691783a61b636b13b3a573636c68f28ea7ff4700998e8987a4908bd", - "7b183f0afd82d1653c7f48c9b5e4965d9c560d46264900b40c959d9efab23b74", - "307abaa0148fc6639684228fdffeaf9b1f2ce1ca628bd97fe7abc5592e1b60b6", - "dfd6a0639a124b1b2cd7878a6f2d96a96995ee68adc7d5acf76d460db1e40f01", - "49ba36e2d81705baf491ca21eb54e6069361b3a58fbca9c17b7db67df61a85fd", - "76d55435606da355d9096e170d9fee3d29a26f0c885577a82aa47b02ec74a905", - "14753dc4b339e3fadc23a6f818f3a4ff745a1373c85810f093433c531ab2504c", - "2c89c3ba61ae15d150b42372a0ffcd9f2368f10dfb0d7e0569bd78afbf14ce3c", - "d3f62a0c0b3e6dbe2e99ea11feeeb070008a0bd754b75c95642fc5a0a2df13f5", - "d42f71dd04e13394a5f51354a3baa5bda3f54eefcd7f4126f08f4fb841c6be13", - "b6dca757813cdf95c8b97377adaab6b149e5c0178e8afb35f02c9d80f811b8ee", - "6475a2e22a1e9757a2ebfd66474f3c60536cea46a32b9905a78314e17f2c51d5", - "8ac017a763472175c4ed502731278b5c43dee40e005ebd51eeba71e881e446e4", - "d3485f22afa2f8ccbd029599440a0ae693c781247ee8f2d2f83528c00f780ed7", - "28487a40ec3e8f6a77cfb8a867effd05902424fa247be7540c6424968d50fca3", - "f11df3ed577b8e3b32946c9d460a1dde92c61e24fff0a91f4c3f803a6089c9d8", - "c74bd4dadab72be036745a23b865cbb725825824d06e94d2703e4b01315084ef", - "56e28cdfb604887647a23ceffbd3ef7847530ba17f03832bc7ec1c4460dbb6a3", - "a54086a00254f879c625359070ae9eefc8666e660fca3c45db804c8bfab8554e", - "2ddde85a3bbddd09d02312866a3e9f3677c0ff59744b98829705067f6a14f9a1", - "4327d6b6cfcdbb8e7ea996088f5a4fe90c45a5fe0eab09da59b776ca6d20c88c", - "80a5bbe61ee5531e62d5b5139f0d482390e3acfc1552a89d446e1c85518dc06d", - "a729a9e87c6c341c222815683864884bfd45de000b1b80e2f42e09e47e883604", - "34e7e090404dacd08bb94e19e8f42325e719d12a178c719370bf70ef39e7a0e2", - "6c11fb97ec5bb6842e0c416b616f0834e63efddd8f4427141b2b9af79cdcdfd9", - "7edd30912b29b322bab39bdf5f141519d00aae93aec0c726c2d0f32d38b6cd8f", - "d1ac3153f38586750b250756c9c8d6e9bd60c0e1c16349216ed75e98c3feda39", - "f3ec961c8db0dcd08acd63d5aef616da9798875d12d0560b9a4d66300d5df2b3", - "5882bb6ea711937c31711bdef34254e6d7374b202db6f584613d4b4df8b60ba8", - "cd7b59debd83362aa9a0297d0b45b02a794d5a95a65bdfd845b5231de236afe8", - "de50924b99879f74ad5219e85a6aa8c5a5743474c3ad005c560f6f6b7a8b1f98", - "de85f956565e4820d06a20b11a4ce0b3fee5c4af5951e7eab61310fabe848d87", - "42f300e66c8d623ca051f6655142e338e6890d5ba64a993d9fb152b4657de176", - "5608051d27deddec58b6a4a869b53daf00af5faab764a8f831f492e1c230b1ce", - "32c8c70db0290ff40e0c2b51a669b1f42a18b80e27beda2575b2732f47eaf81e", - "26468e851e79cbfc8ae32c45eb8a4d7e8c22400a039be7632ba4981fd837b9c1", - "a52ac2f5db7c276d9fa9947b0342f95fac3c6c5b70125af55781e50e4429c0b3", - "89014f58426ed827636b1e1036ca423a452a7554b76f46b6516d654aa911aaab", - "241a96f6cc436e561a75fb6f9bdae18dacc4f39d955cc7e0d770e066d7da7b6b", - "2d1a57c2333a79d6c69d77501c36ba6aee1581cbe047ace46992508d21052c49", - "9c718e9b4cbe12ee40dc402fd5901f8d6ffd7b4ff4ddc97282e4e3bd81ad43aa", - "4e06dc2b2a22c109f8c82e8d5dcbe91d2b2ce1bf62291fdabb644ba157003cd7", - "cdb1e5ba9dc609d89661ebc42b622baac59b4838cb3c3d56c3aa44592be2172c", - "2952845f6827fae0ed2d3f9a92f17180a46754404b5de86d6502ca3cc6775aef", - "d7f31cf4baa3178f862d15053ee8f57cfe84df4a66bdd7c8e1ea2722f1d3ac65", - "50ceae26868c42da07a2312887966facb50bb85bd462db849340db25e4821f29", - "b7c90f2b89f4705a031f8750dbad1f3eb7b988fe35dfbe9e665fc121f3de5782", - "7188ae89248592c03ea45b179c0fa5aacaefaaa922fb01a14f65ccbcafa25068", - "5f98f9f0fbe336648b85c389b2a927314831e853fe4b9facb2da4c3e524dc19d", - "754c74343b5b4539c1f068a4dfd25affb0f5a898ee90712de3855188b58afb11", - "76e5831ade4c6b7fdfaaf69490906a3bf23c898b250917d21fa3c50cab3b23fb", - "c874bc5e04a0337f8fd0a3ff9fc31d34b96e6dd86fc22cb88562644255e5489e", - "b5d5bc2f9ca15736c2c95f6587a3fced33b0746b002c7321e8005d033433dfce", - "16fa5020faffe23a080584b86726dc5581dccdfec3260580e833a40d42cf6332", - "88303c1352629f6888803c35cd4a72f00aa12a00b61ac1bd2fc71b5770b280a3", - "c5d3d802902c28599418b9d174629b72e52063297dec556cfd03994e29c67a11", - "b9b5fc3f784ba41af902da96423a977c78660f5f7c378a918fb5a5da701ab175", - "2eadc4b769a8f08d79a55b8fe37c4715c47cc189525f9ad94336769b60443152", - "0ee4bfc093f9c68a48d08d5e351fe9064320b0c363aebd82e87ad31c1c2c0ed0", - "46082f46df2d8bef5015e5e8e681a4e094306b4629cbd4cc71de53e7b6a15ab8", - "4e544bac62a48e70e223b306bd253b6394ac882d2d313b8ad376c13e66c1fa7d", - "8369cd4f78cdd385f88769f590baac51a662ad18f26e801d52951c4d87bc6df3", - "602043be585f63d73b2cfc15612626ed170cd11b47e1b356ae81afd5888aebdc", - "34ecf7b9fefdd51ece7b899e4c758fc15dccc415e84beca1ac0769a25a5e9170", - "3c59a9602b391da2b6c67ee8dafaa717b73129d156d49ac403825324f89497f1", - "3b984214e970918923bae03c5bb509a6d675cd250fdda214498ef254fcf9c280", - "42c8f0003a83fafbb0413927d89430c66387925c21bcf39c0ecff046f3fb77cc", - "57fee023145742fe23bc35678ce377ba532eee0635a8825085ab2c8af9bc9914", - "5d7035ffb63a5a1a78af526bec87c506bb4abe9577579c2bd9e7ff32c698ee21", - "458e07d7fd9839d8dacd19d23f6bb0e70b8ff59f2d71884101ec20118038cc05", - "5f08cac5eefbf615d8bd3c55807b20ecf28093e10422de66ab45b425336b5c27", - "6b1ed55583372c753a7b2a1bab7d802ddccfca4a53c049df16cde28a9d8cdf17", - "8294b6c39993ac4520f345dd53b98d40688b6c48cff27fdc7aba3ead6b279f8d", - "e1ba3957331704b39d174ec077d1123fd7048cde0880ce1fbc8917c20a12097b", - "e77d3d45c17e972d5f48c1a5a7ed09611591983f145aa6fa18da0f1d7abe0314", - "a18126e35f447d785c08d4dce9852047378ee265290be3022e8ef18faac66290", - "4babf9dea6b79e772f8c956a3b765f86c7dd915db20b20c850f7d539aada6e17", - "64884dda5b1d45493606de8831a2a3ae5e8413853c887c6d23c223e716dcb61c", - "4dbac2b1967878c4e624f3d22a888e80ce5e76968b2324e319562534bfe5f059", - "0b76940b44395bc07f6128bc98e9c300ddca5b1e70c0f7fd2a34eb1ce61b1a2e", - "5e2f534883b1629088168759eab9919c0ba90aabe98537dfdf813a322690c34e", - "43a91aed1893dffd1f9df2113e5b6b5063ecafe639fc233621afd3c1b45c5aa7", - "ccf5751f154d7cf7beedae090fd1c503264de52f0b5e89aeebd5dbc3daa2ed46", - "2e722a1cacf0098f3fd4efc64fbbce3e5f734472bba036bacafb3143c69d4977", - "77fc1f2c33d00bb9bf795ce99efb7196be7b76918883039ae9a2d4223ec52802", - "17af992a50940f231ce84ec3d23dfd55697375cda012d208632894b4d0fd3b09", - "db165a67c2c8972ea312e1337af91fdc016b87f722df78d3309a713d33e646d8", - "4b1e6b7e6e67a56176c48e878287a7f4785a452f3090bf70e5bddde53f462e19", - "7199cdd41784d813ac196bacb6cd457e35f6008f8b9e278bf29a12edd4a68ea6", - "3c1508d286192e4a59cd3fb11add7870f7b800c98a7d94d22899958b321837e4", - "283217f9824c6da340c6f6cb0edf318568736c31c33ea4910ab2bc4ec58c3853", - "90011f6c0c99201a0920e7c3c0718093442381baf6774ca2ec87bf4e2686d490", - "97837aa6d0c91bb8d1dc377c7b932222bdad0a808b374102d538cf1ad9913e1f", - "779248acec1fddc008ba4d14e186d820f428308d04efefc20831a99388a8df1c", - "456454f637ef863d8830d0ab760698da9e43423dd8a03b33b0092c1c8650e6f6", - "71cf9d96959e726f3e6c28efdadf5aecde79908fbbdbdc46e442f5f55e041ac6", - "dc915654fbc796fb2631c668c964ee5707a0dfc23ad087e45fa33286e5a09a4c", - "ac3a2a9e4cb813bc4b838c8155f02c953ef4a92f9f00075dbb2118f1f5e3e7f2", - "cf88168f4fe560a5fc93be80a213ff14491f6e69aaabe0bc394719531133c2ae", - "33e055d050a2282a66a8a388107eeedc726d69f6925b8ddd40fb14136dd6e04c", - "0c9cb01ed9d09d7776c2546573c0b348c0f8565411de7f6c8a8cfae613fcaa64", - "43b055d582d8c6fa72c12dc15ef166063e893131d0237656e973acd448aba570", - "b9e0c614e8be66616b8bffc3b3c26c456332af3e8787999d0e86984611acf802", - "70830016f9869c095df7f4e34b927782cee92c66acbbda209abc49995fa0f9b1", - "28b52f01bb3f2ff95b46ad04cae77950bdbaa291df9d124be8349c78406f5fcd", - "f14cd62ee576d9ab16ec3550a8b22cf6d3aa3fcec4b624114116e851470cf1cd", - "4d37d8fac86bbcb0f3958b45a01ad4656f95f7c058af3d5426117861cc2ad2a8", - "fa31d9f8010e2d75a448d44387bcb9ea0cbad68175fcadc81198e27c5a8e424a", - "3f0a7c8e9c39eb293ee97d5bdab875abc6192571fd130a9a5bf8e48328c4f32c", - "ea4003ceca6708d7ce58293de713e31c39297275f901e9682c0fb08b1aa010a0", - "8b7cbbb557ead0ad505a9ae6c88d485b448f23a7c10a18a8fd021763971fa031", - "3d8e3c49d952038121b2ae1a9325c4cad9a2788892659103328f34ef31891577", - "385ada0f03b436b72a331f7ae94c511a857dfb11fd75c883a1c8af76520ced18", - "5aedaa360a6477e342f97df151bec37c9b8dd4fc1569906566e70ad99a7ca736", - "3c42f92ddcaac84d7b9362e082499e251465fed391950aea68c97d80fe88bc9a", - "756bc44c646b34d2722387c632bd27b9a6b99d3d8ef3b12b08e135aa210b8761", - "9b0974b51642f833e686369ee38720ba3e66f7338069a4e3c14a4abece404f7a", - "c9e76a700273d7230e274d7d6c564f89bfa65c37947118cf810119ea3016f62e", - "e854dd5ad5d67e0fbd077868d96e1555237debb6475693b60b424e5ce397c980", - "5314bb7cb58c9787f17fddbbc58bc23d2ef384ddb890bb9ccb6eedc318adafbb", - "efd62131ad08ee84a9da5372e7daa142b201cb440ff379450fc9e63161b5c631", - "7bae7c8a1e5dd8c56d4dcd108eb223f6962081da2566eaa74dfec19f25c21199", - "f229b64f9e2c3da1aec580f8fe5a1eeaf35368c11b8f03e8ceb5741f0e1eedb5", - "c28831b9613c6c793034f3d83064648b250b0c1109fcb8001b7636fd619261f3", - "a5ac4ede6ea3edb8819ef97b8aba9134357160e14f1b5243fb09f0c17755d10c", - "3d52d332e0903baa900e49553d2dcc1b94120e7e1ac1fbe715757723008e0f92", - "ef231bb2491db46d2f2ed24fc9de182d5ace09da96abd8d9728eb123a12aa63e", - "c383fd068da399a3955b2fe299f7a5b038d3bd4c7f4e96bd1707771d66b0e46e", - "c18f4cca18d6be11450111819816a1d6cacf48e43010b1ed26be49e92f77eb9f", - "9097e22e813c1b0eab93c15125b8607e593c1821729bc13c75ec31b7c8275147", - "4a7aaade54cfc503a164b76ae85f5be41aa124ca15afaf4460dc8570ea1cf2fc", - "fe00448df1619a210d92f90623d06370548ebf223ed25d2c8f25ed6fe3d0100e", - "012640ca9802ae669fc1fc99c6f17587ea952b1e94583768ec110b8947f210f8", - "f46dc369c4851f5648ed5fa49abb86797ab2f0f7637e5ca0237eafe0d7372b15", - "6513f7493ccd53c336063d0650f0fb0c3718f5d08367ab4ae4cfbf47c644a302", - "c459d96e5a699c0463fc9b75ba87cdf119939c536d0c22adccc7db5d980418bd", - "c44049a6af12afeba93bc0e0f600108525e6424bf1b53df631cff70d3260b780", - "3ad410b7839663f750538ea47ec373e0801971f7bfaadb63210879967e541687", - "9c97660d62c152d7fc97f1fc09e30031f7a8081c65b88580c739f2095eb7c51b", - "ec114a75a6e6a753baf8a07382b347cf9395f527f06ad2d9a42d8146362d565e", - "8414865cc8532971ca651be58e8b46f51496be9eeb4b4d71a79da12322ea417b", - "7bd3a186bcf395dff60a4302925347b816e96000c1e729a3849eca47ed4bc1ff", - "54f6a53bd2f5203b19076194aed675da33b1b1508cc13643ea4d995e1c07da76", - "67262d1934557e53d2aeb731fbe4e46427d1ad644afef6518bb157976c943714", - "0240de93a18c4551a736291912b9528433fa7f313e6c638064b1cfa65ba4dd67", - "f9b8ee920c73fc16ab1b010487a556e7ea74e1065bed892273dc130659298696", - "3b1933c203aa8f35a4c3890d366dfeb48dd73a6a6feac32167fd8abd123d18ea", - "59807a0959cde4177d3c6236295ac6a389c8a1662e258f78908fc897c7b42384", - "32e2ad22408c854cae894ba1f1e1e8db53a2352364637dfaa2d198ee1d4a5da1", - "382090da8fa5c7adf1dc8a3737decfbee9176388c2639446a548329ce03dfa62", - "b8fe864ae409df96c033cd444d84ff6e0a4ef9404361bd7ae91529e2f0fd9ce6", - "0c6839e389df584ceb656453712532a8be932d80fee2073120a70c1e38ec51bc", - "5c1fe6c6d119b5cd9a016761c45aa19ca2e7b4dbf4c87519ad862a3e28fe926b", - "33f261e65e05ff4ce260ac49f21174afddae4578379be281b4b3af1485e5f7b8", - "f36b2e344de0ef2765162d05e8de0e4c7cbec071d1f43188e1304705ae655300", - "9fe9a0406f61733adc5643ee72c3044adeed9e3f11d9a5514a3d3f384c3efcd3", - "a4182e92bf53b4c9d13c9eaf032aab9dd4b4e2ae777067aefdb2c75b8eff7cf0", - "84b602580c925fd19bcef5a6232baa0f7f6975b5d4b953e13e242bc6507ee6db", - "eee42c5ac03a21e5411e7e1536a70e2bd3d18506a1db6f1afd9d28f12ecfcb05", - "34ca893a159d387bed58c77c693f136404408fc1f38217a0f06955bbd25b573a", - "09702ba2402aef8eebe59c8afe0717d5dbf14a13ea87ca9792468714dfa4afa0", - "61f41b8b78e640b80d1c9384e086dab5709aca90d1c4d1dbef93c6abd838940f", - "96ec8e397591b0963febd30e4139e34cdb6604f55a997d48acfb89bfb3747b4a", - "278751011d09c45ea35112ad4d912977fb7efbabc318e7bd20a66d31ccce74cf", - "3748aec7caf9aeb957bd6f37ea064b411cbb72889d4037584acf76885d83dabb", - "b45deff4c8cbfe38aee2e8837895a959b0ee45398b189f25b74e8ad487fc988c", - "9b666c9a6478a356da2b7e6cee0fc373f376143a6d4b5dcb450b3a6d08b5a65a", - "4624b20f19aeec5a05eaf561d32b0f9dedd892c0840f99d4d660cb8e47ae6fc0", - "91776233e670e781b824e409a76f5dfa030070e5083ce20d9b753cba4224de9b", - "30a90c2897efe12649b35674541826116fab153b70a5fb0fae3433347ac6cc26", - "2ffa0d73c160756a4083e0667524f22c358ce451ccdf6768f893554355fcd346", - "b740c0a9961a3ecdf542949c03ed5e3de2a08d56d49e2b2d35ef22b140b5e0c9", - "b34c3d6d75df1b8464d500c6af3ef79fd2f8a795d35e7ff14826351425743ee5", - "3ab7883d00e8d7577ea7ffbad72daee7d8c4ae34c0f4cfbea9631d6fe0c6c35c", - "127be3bfdf3682be89d0ca08185642071d3b2eacef2aa15539699a95defcb641", - "47a6bf6d5b795d298baf5960f12d2115dc1b7f5c5b3d90fe4f34615fda92469c", - "0a4e24e9e50d48a2383190ad32ebb393314fdc680bbe44420fa0c98140baf612", - "272d40d0f22957e6cfde271f27a2c2b287dc0432d92a5b346772d12959a6def1", - "53f3436a81691d402fe9251deacb8575c16056784b833a78c560bc026e707df1", - "dc1229bcd437dbb526aac11205a78722f8edcbea2d0e997f68d233a04abddacf", - "f95df7a94b5f4527e41a400e4250b53c3e00e10e1e3b0d2b3b78a65ce96c405d", - "c0a48f43bbd4f35097bafe24bb7669006d6270f59593a2e5ea6f7be7cb3f707c", - "47c530ef662908af6318f4e4c147f6490979609736866a582104a53462e3c2ee", - "118baf78f128a35494eb20fb0047fe1caf132ea6c6a7090a35fa307e92e98889", - "187ec612f1310d02d180c0ff72a656db4935e218aea55b44b5b69f08524e3086", - "331e7847857d45f1c967d6e8dd86cc8ed91f49ce192ab6ca804d8f88aed12eb1", - "8adcd20da724448b7b164f787408ec51eb15af89e39bc359a4a6439f86620733", - "b31948dbc9f24accddcdf9f6df414dfd459571dac25ba42a31f38090b1ea5389", - "f154fe9e31cfeee4bbef90c97983dbb560d2c074e21ef75faae90423dae9d850", - "7868bb945bae215a21e6e97896b3586c9758d818af2fb0c6264ae7d8bc2b0b8d", - "45993d1b3eb6065ee622d807eb4755ac2cea5ed86a81394829fd9c6449fdc3f4", - "9909d3953b0f9f1ec2f4c76c399f759b17a6e978ba13d964f86c03de7604bc9e", - "116c24b616a025b282980eaa6a6cc2d06ded870d6c73d3c1f6bdadb1845346ba", - "b4c00ac86ec75d87ce5f3e36a0f4d70b2aa29109e34ea33812112d8a709b7e74", - "992ff969e4997af7dfba7a490a09a3de277bfc4eb95d11d6714ae435f18485cb", - "bea14c26117ab8cc5a5c16ba9ad0c8f8e521a469f768529eaeb5e00954a7b9f9", - "f494fcf3528e0e2596892563943e6d38f2676a433922df7305fcaab89962fe7e", - "3a818bcb4e3fe9ae004c0f92b41d4a354633b2bb29d4fe3d60c125b86b109301", - "5690e19af2ec4f877047b0639b056964f10c1d6492a21524717358a1fe016776", - "8c64d9f4039ef1084dab53041f89c677b81f9a3c8e2d5126bc45fe3431f22595", - "0b891482bcb8a8d29738f82086cdbc1509293ef19865a7c8f0f53c60d2c497b4", - "509cd05d159dfef2eaac6fa186114f99782c6f0c54892efcfd430325d1fd701d", - "f56247ea1c202c3af654f66a98e2d48338ff414c3162a307acc2e079bdcc5c99", - "501995e6bba00c48108d7b60808c4db879f185649a58b9430a4e80dc9358a8d4", - "cbabdae5cab546d6d0c11b41b8c2a7577381ee11d36f3395c9ec500bdc7974dd", - "5c312ef2fa096819f6c2d169167ebf27e967b2353b3268f9fea6f7f522be2b1a", - "410ae695b1e21cb0325b2607674c979b66ecfb0aecc47ca5ccdccbe1a8c00d53", - "2a17401c85bbb7846b57fe4d3285908f173db4546fe3dcb9af6903d850a38296", - "c0789bde25ba5d007d393c72b2796346b55afb59651be483ba45e8e92f19b2d9", - "dd0069636fd38d949adadd2c789537361d304b2792222d40a491fef20f6fc347", - "ec17923504db288b65059cce097404ce32c47b2ace961398b64c042a38e27051", - "2a7a2eaa3d453c94923887bc93668fb806945f5b7664062fbb1742c71f24dcf6", - "dc6fb5e3359eaf44e2b04bfdc224eb7e1bad4a9a1b8f84742792aa7ed3e05437", - "7aded2b2aa1f5b39702f2adb86a13cab200e5f7ce79e02de9e0af48690599960", - "805588c14d4fa4baa17decad619e1e51218a5b1cad02007f7a40f2e47c8e08ff", - "8f20d4f8cdf4490385127ffa29302ceec5532cbe56b1b4e06719a7f0b66a9718", - "102b4437e3e19b6733e9455ec20e448a14ce82b9f0b6d1c1467d1cf478c4a21d", - "56f1cec37472ecf1a9a2d6cd1fa783daaf38c66fcf1bd8e166b4093b9d695fa4", - "b7fed2e14fc879def3de28c78ca10b30a407fc69a67b23c578d58f0504a741f6", - "09d7e87b923e67beb9a646ee4a6529c15a8618ce269ce11ba350bf82c383d9e1", - "a4e410f5d2e7ec5bb4c6b48d5c1b4ec71650d945746c74535d20a21248ddb3ef", - "3f318e6e9a5f1ea47ab03a4de2c6bdc96bf954d6cfd18f44628584d56e845518", - "e590f90a42d96ffb2471659f45f656d1215a571d3a3a639640885b156f679de6", - "13463312f63333ada6be81bcf28e92f095e94ae355119ead3e1e34d39f0bbbc6", - "852d58e66d58e5b33c4446b45f64c62a6ddf517a744bda676b000e66e3ac4084", - "c710740f0f2734426b77d47624d602126f25191672cd168a77de697382f36e19", - "b8445fd020eb287e2c11a0c7c3221c789425aaea5e0310224875a6c70d71ab30", - "7513570901926d1667ab0ba5765fc6804d17c40090a1a960fd6f918994d5dca0", - "d896eedf4c652a44ad596f8427fd572df38609ff9b5b8094edf1900bf1edf452", - "8e2c48fd42b9b9b225b3717843c3be1c537b4153021578309b9d9a0a0d77506c", - "03d90f322c72ea4ba51e31d26bfcb8334ebb60ddc97043968dba549b0f017c5f", - "8796f5b393b8e3bc7d78e8e3aa607e94461a6ee792096b37f3e8ab8dbb9c737f", - "fe153a86a2c7b2399f60ee24ca6e63d955c9817b36e8a48edb5a24ffd6896d07", - "cbb3a15ae4a6cc0338fe4e187ba8919857181f741970910c131ef6d89071b796", - "3967c60f29a422075d5c719f341bd185ce0d4c1954b63426242d9b30cd89da5f", - "5b8d553c3193dfd482837a57acb4d4230151987c947480484c94e39fab46f146", - "1ac458a53b33668e99a8248ef9239446584286139fa62da9ef97fe8f6d1e5d73", - "8b69a04dba833aa0fac22ff8ce88489fa7572855d801467682b00ee2d72ffc29", - "9caf8bfa6c38856b37d19c1e5adb65798a4d12b9d387c4ede333fe90a5dadffc", - "ccfc24c79ded7177d4e5c9a7907531cc073195c3ed0793f84c68469e89d18155", - "76263bd12dcf96d109a4bdf17cb77d0a71f2157d91c64a9ce1e11f5bc43441a2", - "d1f48f4f2525327a46b48d21ce7464fecb954ace348592ad3027eeace4d00abd", - "2c16e4ac27bd0b801d5596b81fd753f2ad3905ca6f93654cb014c9d0a80bf691", - "f875665e666c58e6fe0327e38e725008341a4df37978462c65dced0df1006f1b", - "fdd02342625b96291e79d781f1143f2af8713e09fa24eb04ff6b1128049346ee", - "5a6c9365218d5bc04882063e169a88eb6857893921d962d5073dbca181f9a230", - "71f394412588a8b533508ad386ad2da2e385346fa5213b53240e6bf0e74497dc", - "f9ba46244ddb8cb5d1fc9f12e5e1932716cfbf1b5459f6bb463ed6978fd478e8", - "82328a58cfe226054b2e79bcac6d22ce93ab97cb47ec6a51f94df84a2fe19284", - "6ec3037393c94990b6457d0ddf7c35a7150e769f91c019c2f913cd9832c1d5c0", - "b8cd0a0ff2c2a99129f651c932dad0fdeff5929c58d8bfc71002e2255dee8d9d", - "6f0908f4f4fde301a827daded4c215053a0fafc3fe4ed9fc70e01b5e599efee9", - "3a74845d86873a0555aac43c40e7354c3ef9864c44bf1ce841d140b334fbdcd8", - "1162f3322e9d1a09ff94a11c6b0be359823d32cad43b44c8c13a61e44708672c", - "7dbd992ef071b0a2a178a34d175d04e5c4d1acc8401c2ce8316bbe2396b328a3", - "7b171cfc8c9251b4214ddcef713c009200e54e8e9d88ac23c628ff8db1d6ab51", - "cea8371fb6586917246bac35ab4d4df52670611339af5b72e4badf43ed4a06ad", - "56ebd01b3fd436c97fe6a4adf9f1644de600830a4bd07d9b7899e217db868510", - "c38fa9f580e076d1356918d650d3215a7e767d12ec482a99399e5801e0e2608c", - "0ee2c930f7bfd288f922c3e4966e06c8038fbda9ae10fd812c556af41909e68d", - "27c741e37314141674fff15ac038a70a5b2b0660aa57999980af4b7d098c3c95", - "954e8078c4ba08c88e51b5a8c57e8206f09604b326c891ad995cbb8b76afd788", - "27b2dba7601c68fd9b2c9dd5f833b1d51de17a31556dc9969059fa83f0267624", - "5b9370ff1ce912cf3a297dcb5aecb71ca97868f56fdb339f32bbd4150bde5faf", - "6d1da4a88b8c9452e149780e1898bbd2380f64011c5b6e133818f156740ec535", - "1218e4fb8f3259955cc5c33c362af7c817b63f1fe003f39fee8d40548e186f49", - "30f7f0e97fd0f3a6a65133629bc8d794c504cc46807a38138c6314c6da5868ae", - "543d7b0b333924dbead8269048d58e63e21168494d2789eb0a04e2f9775d5933", - "0a3e87e18c6c12b47afd77c4e4045a7ccac450bba0fed3eb13f375949dffa432", - "156cb8dc29b8dee4f9bf5644679e4460adcb3dd78193777e79fe93b15b714be0", - "02a958d8882792b0d93a2378c1ddcf2e5fee1e3809776437e0a81fe84fe1bf5d", - "e6aa77aaab9db9a18db9c52fd0b4ea6f665485da4e65fb775e624c0eaf929f94", - "611196d14a59fc3244d12c3d50fba4d0eb244c1a3ba501db4772aa70fe3c06eb", - "475c292985eacccc44ba6a0e15dad6dc4ceb5aef731f2b0479432451158f9355", - "b3d3bef20167c890fa09438609487a9d377ddfbc9411b296735e9049b888e1f1", - "f1d23712070fe4e97eae6eefa7a1e1f3b823cd38dfb16b0c7262cd58d1efe79a", - "619107ba9cfe02d05eb879ef43e749fcbb0cda7ce54ada42205da2074cf89167", - "559376fef4e58b33782515784ee94be9bd9219a5fe96950aa0c20a4b7f91a068", - "681f3394cc6b1fb3783827e6e96d3789fab0c690be11881d1d211e90dfc66a09", - "a1549712bb25dcaf414b13ff18b301d56d4dcfbf6d012ae0e6728cf794fc5afe", - "906178d5c242062ffe56528e7c7b27cf648eda08c08c63e80a9ac9fed46ea176", - "30e60219f53df1f2395d4318543ba63ed2a6faaacc2d10a222b88076c6d8b4c5", - "cea73f67919fd09b1d26988152c3bcaddbe7fce596d0e8c1a1b8f8427f44e970", - "1c1b7058d2f23bae93b219171d32b3c5ca3a3782f46cfa8ea66c9545d17f7b11", - "cd896c612bd8473f6255d18874b70447e4ff32e7d5827a986956068c6acb6cb3", - "5c3edbe5f10b2c695154789ee04cf89d50b437c2de63609a03e6ea2917dea75b", - "4489b31d2646f7986d8367901e22a1b66050de0d45bceb9caf7f9949dbf56ebc", - "e3c66acfa24a0c76e0da92adf2fdf27194e9039a60d4a895706cc54a9fe44a5e", - "129fd6ea9a8f4638b1000ec25efad4f38c0db6dd830f61a285f3df59082dd6a2", - "faba5dcb837dd600c9a4859393b21a7063d8d37768711bf77c98f7076a7053f6", - "30f99060cd586046577ad373d56a68b48eb9661762e673775e6fcdcf2598a563", - "126c2836b4f6184c03cc8c99edb51bc37bc0a9c9cbb0ce710ba7594b4e5f8ae9", - "3e649ac81a3937a49feb942b4a158d3d244b67f2e0a0ba20b5770bf25e621435", - "2b0e8998dbeae12cb97b2d81ca607831ddf7259a66e24a94f3cab98f1d2a9f42", - "ae671b4047ae04da295fec5604291fcb97f40280c82489c82c6eaae3593424e9", - "5a0f1b394d71331be2ba402039b51f66872a0ba24d61cf5db447f8b1a868d1e8", - "2a9eb8665e57721a83ea82ff99460161a11bfb327e04bd2ff70042cf0132888a", - "9195596f0428726b1bcdd15e6734795a71368fb1b2abe6ec744fd8c3f115e400", - "aa7b8ae8ff4a0d14b8c694209a286c9b4c84ccefec2634a463c86baf0a699144", - "30c4ea64b92e11d17ddb2a5d233442d7b4d9f9379e390f41c999729b06f5de38", - "c5db3fe4ceb8ef316e9486f63fe73a3874f52e282979bcd93d94e80b82671307", - "6abcb329c11d0b72fd2db01c1fac8264964eef589f17d4c897fd9e2ed02e16da", - "9aa97e055ccf3a3a8145b9d664860bab93c815f094296214143454f56bc345b9", - "a687cd658bc9188321229c25ecf2a4e00f91e5b07d8902bc33d8737576883a66", - "9106a745254ca17c5c5b596ae18d432bacb6006df88a684768e32a51e79623ae", - "9a8ee5dccf451721fb6d63bece060cd9192387cd77d5fda3af5f0ad130f7b436", - "fabc6540249299c5fcc73c6aa7552181ed5cf68947c305ff632da9217bb5b340", - "6970d6767d98b72affadd031acc36fce58e088ef02d4d4aa72d0cef27e5a1e2d", - "b604ca40535de096304ba970e24c4c20aba88a07f83b8d2db7ed7bcebbed554c", - "2915b8e2ba3b90d8ae3bf3ffedffa3623dbc0e455a47e91886bcdc3d9b24b3a0", - "492f565af257f3974af4a228b5424be83dafd55341bde0f86fe5ae67a256bf66", - "3155ea32762c0bca2a1f5ca75625f464c60459ef0fb7e16def6dbec8aa3cd35c", - "7f0a11ccb2d5f0d9db7a349a38938ae4b976fdeb1e84cdb8add778475e7281b6", - "c0b2c65763a7a4b3364c67a08b98ba4bc3b8cb7673971589c84f3f6124a02b0f", - "abae0e992512db90152e19a0c78cbb67b88ef93d80a4b68eda11920c05fe1ad1", - "c9a87646b650f9f22373ba8f9d86ab5266131d568951e3ce22a15a28f31182fc", - "1b49aba842f40312164001fcfda9ce6d0748da6d4ffe6eaaaf80360739cce34f", - "d7e526ed5fa019ff11e43a313a29e250a5d803d069e3fb6bfa2e0ecff5bca7e1", - "5e972f2f530cc213b66909e0ff5604cbd6cd20fd7a38018f828e72b122020c54", - "de882adbf5074475aaad4dabb24fa8513cc6181baceb16c4beb071fed561a80f", - "add0e5a3ab48f04bb2e7c10d1730396369383509a12fb6a40bf5491bc1052f1b", - "12daa8650f4829297dd28b247f0e08bc8bce86acb707977b83975ecdaf8150cc", - "a9c019aef766076fa66a26a05d2346e927d0b44ce978cdc8418f5fa9c3419010", - "4ddaeecd5dbc64b9fa07081ccb6a5019cbb18ca3d6962f9b2f9be974d051336a", - "9d169e7e54a7a534734a8cd9b40a594e0d3eaf5443557eb2ae8e5539c6681fd9", - "f010bcf0424899415fd34526d54f51748b1303be9bd94539571c2eb0ce6298f9", - "0725da0e164ef4b6f923bf9fa05cf182adf6efa593aae208cb500ebaf418c9f3", - "033fce5b1a138e15cc05e60b3594238f5296291ab3e40dc5896c7f625b39b889", - "1698843f5241875d02ba6aebbac25457688174f8136f2595532d2a2e0887c95a", - "bec9f624196be1cb838802901b73f520ccf7d073d35cca5cd1bb880c2ea354aa", - "e7c9ac9e3810bf5da3e199123882a8dc69ca96c4e1b255ac97c85dd3e1fffc32", - "517c18b583776311a98a27975743f1e2139084c611f3c706cae4ac96242db2dc", - "0dc3a9975b552f17dd264595c357631c06ad06a067ba39b73b749b0321f6d3ed", - "d29e3b458842d39d491c7936c211bb46537854d938234bc2c24cc260e47365a0", - "525c4d04e17644da45389de1d4f66ab987fae3aaf4dda06e7d921dad839af440", - "3e5b7e31c451fa5c65ef20cffa28dc1ff4a6ad7e6337005cdaf313396ac33283", - "1bfa487f3767465d6d54b6359ddb5dc0eed7fa217e21acf8538dc4a32c411563", - "5f0345d4f4e67b0620516c8d75c629d92cabe2bad8289362a3da3d532f96b94b", - "f420158f1b9cdf9156c05d7ddedd6e261d98af24abfcb3c12a6c39cf4b1b18a7", - "94490533cb13d3a7ffb4a3b01019fb4ca6cc5e769c37d5e33c5edf7c20bb0622", - "328d75ea1e30dc85e19cb13cc90db52a55ef15f3a4e8c279e81cf4eba078db06", - "58d1e1631d20f8fce74cab2e67aa75e9fcf2ee026679938b428968bd9943d21b", - "021ae3906d6c272660216f4167c3409f97c0a9ef83b8fab6d8209c494c652a25", - "4576a9dea225bda8ab5fe8bde59c9f84399bb07e1733ca98b9062184412ab827", - "29f0302cd20dda774737c0e515abf87244f9b3f2332a0a1449aff6cff7c68c4a", - "85f6c2e86927c7b15d22e5adaa23ad919eb2a35f339d48835eea2f545ef2c233", - "e41ff5b570b7e86c794e58a2ac097fedbe7b56eba7054fb4c19b05031576777c", - "7e101a6da0d9e7114c6b92fc49c7713a0cf9aa8e8646a3203eac218853e88543", - "148dc51a14fceefaffd638e66eb16574a25ecd677cc04a5f8ab6017acb65079e", - "6c72afb65ab1d0b33383d3697944087ce8e976ffb77796fb70737b6f185c219e", - "4443071a4a18e1211b7b298dc60a7588f2e14f07bd2001584ba63f96291d7566", - "e48e78a5ab1b717b1819ace4d141c76e9c630725e1675b5ad70eac8c9cd2023b", - "5ea7d242e2f1d986a2580d239c0e1e0ce309799f6e40c37390f5ec95a7dd2bca", - "c9cc26e3ce7c4e75371b78a8fa1c85ceca5a35ed04ca5dc720f54c09040960db", - "20093d77ae3b401a7021af9c5fc0b770ea4e31f9609d7b7e421c199de6bdfcbe", - "236d524c0e119aaf1153129ace869cbb3619532433f6905a2130d21187f358b0", - "3c7afa3ca324825815305735aac0c50c1c4ddf3de301a7c4b21d2a30c1a75756", - "8af79ef27055a9fdc513f3a8c0dcc3ee49d1f2a547819e987432d4f2f9d35e35", - "0a6431dba2bceb705de5b58ec61b2b256ef5a3151c58d7bf6ffc04148837e2f7", - "8f09ad769856d5e57137424801c1e2af4d87895795fc64bd7028cf71c43c6cb6", - "c0539bcf7b12d983942c28c133b9c2009ad40442ee3c24a7cc31cae51e3a246f", - "131649f3682919f2dee9bfc37f7e2de913d72355f18609d9994ec91ee0a15cd2", - "29161d79697d1169d0db924e65c2519493de341b35f7b4d2a7bea07e321174e3", - "3c604da9a14104640a0e8c365ed62c8135578ee9df44400d901e5247935cfbba", - "e15d107d07ab1dfe9c4776755d57f429952a103ad04093c6842ec21dda2d6413", - "160792b03b51eb998dd43429a4dc6206e09dbeba09cdbaf05f9e2cda0c0427a5", - "43cee3d7c83a979dd784d4883cbbe235e8d416a0e839760c3210c922f013382c", - "67717e9cd85aa529d45ccc6a07b20cb2abc46a7d48e99e802eec890f95c97f31", - "52b721a885181bb92a7f7f2f381a67d6f1210844c42ed0ce6d9b746d3d2fc6ee", - "3774d022d20ced0108aad75faf8f95e4a3e4ddc80e0aa5cfc8a87950f67a69ab", - "96b789b7a5d47cab886706d0028e0964cb86abc4f49013419a298a61f29de4c6", - "dd18607c593c2081e328a57bb38929bfa796a9ff51de7b49473c7d7a8e942fe9", - "97a45c7364380a4d461587cca36bdc193006d2ceaa9b05c91eefe7627e875abc", - "fbfc0cd976dc6a5afa705512b3eb82c96e142de033851df235a59125f252c34b", - "30af5cf33bc7a6ebc493cbb3649dd048264d535b2bf64ed05fee570a705b2619", - "4168982d97713fd0fb1b10819afd250d05cf1a6ce7e608d4e0ef353e5ed88d6c", - "099ace510d94a0eb76571ecd4b06128f7917093da073a043661bb72f6aa24c23", - "02d67bc54cae2d1fe0a1336c57ae2de9c7b845351b83d3bbea4ffef55825887b", - "da1e0877ca695890eb1471915ecc324215c104ad580255e659e524e983d4bbac", - "3453bc07235774fa083016fe314f554676fd9ca5593f277e8da4f8cbe3a3e218", - "7c9d30b9c1b45ba710074e70729f4f157a9c9871107612858718a1526ac37aa0", - "a34a6a27fb339d193305ca96b3175f5bee04cd0341da6c86c24095299376483c", - "4ce20753d7e3cb9221d5adc997df2bd4878ce81e69b6ae4b14453f33cebf3d56", - "0b5b291985f44363578a073d0478eb5413c477777db19a8084a4a42510aecc83", - "f1f9fd99b8d119a158f287e1b814c98cf8486524242a06b8e452c1315bb3dd52", - "2ca4352739ee158f0f56d5f23b4320cbabe11aa22d4b6938c9c130bb4d8ad9e8", - "d515b2c27ad95cc003389edfd55987dd6c8bfeec9b1b95cdb19d1d1bf0cc0f34", - "3a9013ad06d22e0e8b58d2672ab1919de9b3d921da71659b3956551c9b552c1d", - "33eaefc6b96041c64f0fae41a71e58876cce3dd8d19c8418602e0b762a1cf6a4", - "08ed4f98c42202600c2c75dcfcdbdaa46caec72dede1f74c8f4d26ebc1d933a7", - "08041cbcdcbc57f4cdd2fd89437f675e250e170cdee00d9fa6ee8d02d5fe8e34", - "7394760befaea0ce76262bb6ea833e3bb94fab455e46ecf70bc5c2f8cbdce13f", - "9a537e9db68c28a8cf368d14e5f4b946147ccfb55dcf044996bf16263bc3560f", - "f60bdcb3c110c3aa80fe1cbe1c6db50b3b813e6be96dd33e4f915cf3d9314e54", - "f8806fd5b52995a6c9d2a59a73bc0a469e31f6c4577e2f94c629931fbd2dbde8", - "87ec9a44f878c4727dd9a0abbc3eca48da65b935b292ec2299f1cac1ae67c681", - "ec29f3512a0932314e4a0aaec2cb3b0f37d2500bb465abcec1460e35eff14433", - "cb34e990e71721137e5ac9790cd5996053e9d8ee180412ecf3e2850bfab01deb", - "f938e997e59e2cf7c1bc0c5bc6a51afa4812be0a870ccd07704eefab0c9e0982", - "001ecd2f0d554606a94101e86a009ef80dc4e8460fa62b875e04b06ad56dbe15", - "c1f4b54411c7dbee8ef13b9b07891873791dff48a97438f2bfc07f8a5c255a18", - "d8c4160c0e1977a3a44066c94e87874511592adf4fcd54d3de56f2a8c4e78dfc", - "3abf7db57b0a2138c77c0cdac9d56c5d552a75e31a9abe5dbb10c5733362e15a", - "24a5e11c0b4d7bd550b3aa9cc3114d648dbbf24edb2ed54768d33aef68535678", - "390837a0ce8497075921bd4aa64f343f357f44b16df608903410ce449f11d3f4", - "d9806d83cf45c92455d3d96bee53f920d39ca5c65c06abac7b9462b32c80353c", - "a544e4f5567031290b9026ab67afb933dae08ef54017c5ee3a5a5516586fff35", - "1f58964ca375489d3a8e16a4fe4dc8e11af5f2aac265f7ebf45b0f1e6e693a2c", - "71566e5c35931e8fd27f8951eb3224b582d8e2985b8b7035fab51dc45daf790b", - "e4793c8ae67fa8cdb6860e8455fffc1c030e28bb1e1932ef7262e7b87d9e23f7", - "5a2ed678b55a9d752c20dc0653a4ab84b1eafbbd72d3cd1536739d6d90728179", - "a73641d2a03ab8ff822bf4b34190b52dfa93358a0249e9e02234f8fea056135d", - "a632b299541c7a15a54ac0eee8cbe6839a6d4be2c2b82ae6ea8bb10163b625eb", - "5f2b819639b0c98acfba46ab23cfc6780523a67028fe118f313408e2b63a2bb6", - "4cc3d3ad870a40d84645219fd343198f4a9abac1737e0b356634ef65bfb16ad6", - "e645273004bc36f29c81906d73dc27a7ab57a1325266e2765e56096b1a916c0e", - "e2acc3875a083741c8016c5c9ec41e3146fb4c2e878999923afee1657a767926", - "9812c4ee7cd86cb1cb0f942ffd8e6501fa318110a50c718b98bf26b675bd81f9", - "24fc0725922d0d5af89b622aaba2446618b149b51e3acd33b33e919d1f293d8b", - "c50f9c9a9052ac5e261d8da9ea34561ad845d018ab058b215b62acc5b83d7041", - "bc891a57d4c3a13be1c75f3854fd962a14fc8d46e30d5200639b2eb0360a5af0", - "d209f4b7f83c9b2a9912e1387e738462e0077c28660d2e8013be8667ed923ca5", - "143274b3cb1bdac315b78f9b5ef0bb2820ef783d907d40dac0585c2d7c18ef5d", - "6fe3099a31687d90a01508647e27dc91d10c305a305fbc47478819ee4daf79b3", - "157dd8cdd0f8f506b99ee4e702f55d5592aa43c4bc06512716bb5660ed5024c8", - "75fd7324a6c75ab7f2cadc959bf7842a1f6ec2e242ded6386a88485c02c8040d", - "15b3c56a66a845a36ef747fa8d289fc5eb3512ee650cd4493e767eb1194d454d", - "925a604efafb4686508bd2c0835687d151f899a15463a4dd50e2f0e8f8f451bc", - "99061122c36513449eaa3ea5921300a39200f14443280f1e4b573a4f65d6f43a", - "a9d643a6cac97211c09422f8a54731b02e4d2affc7ad671ba2adf52d1eddc83e", - "6477395e2511f8783692ca5777df3e8299c47c5afa5c9a731891b254993b0973", - "25d954fadbc74e0c4f0a4417b989f0d3febc1bc6bdca95eb019a6bedc0d6010f", - "1cd775bf0b65b5efa02e1eb25b7e1a1234533ea19bad13c396af1688ce57461a", - "a2610c40b13e95b642b554b8edb212e6c09f2a6c5c762e29baf9f17dcf6f5755", - "3074cb4487f5ca409b345d7014caad0851b94e4d75577722ac603da20c23f349", - "e11295f186135d2323f02f5655b56416b0bc7f0d999042a9d5efc15b5ad00395", - "4ad502cd238378de68199229f26148adf53f70f79f1b66161901413a6f6c348b", - "37f0700e69283d864eb31a8cb0e72517994dcb1acdb2478a04213d0fad48dc6a", - "71bce48bf5be148de458f5a581cd1b2dd3aa7d43333d5c8c98afdcca1ae71088", - "65b6147a129cd96da19a2201507e9283b83e939caff6552d1014f8eeb2a1bc2d", - "ad0a1edc2b67d20f45cdd4d3394bb021c39b924ed16c972893939a82cf72271e", - "4aaed9b0144feda427607e200dead1370bc87e8751655c73e18c4e0b851733aa", - "36b44aa5b873fc43591dfad9e2cd39be53362d5842a5566d3b5eed8578277b00", - "77e519cc2ade792106f1fae5a2d1b2293677f710d10803593237ac5eaf9e3332", - "16de460663b67f0d09244bc96d74da95e4a3c06edfe938682549c9954e291fd3", - "82614c5cdec68c90c4e17cfc53a8af03bff3349372cc9edcdd03ca1da7c5b7e5", - "5a6c306ba4244a65f505c0b53f16d0a01e2209fd0be602f5fbd5298f6ac2499d", - "c1f224ba47928f6c30b4505bb5ad2afc72f7595cff22fedc3a838945201bdfb6", - "4f6b9f8b65532faa022eb43a7de4fe1010a857c2096c7e2f8f3e2a4c851bb392", - "da8b79baab73fd1eca777996590167f79afd159876804f4b36cc4234d1c0261e", - "8f54be50c082c3568dea964fa6bd7a980735cc4e1a2224b0e472bedb5911fd60", - "ab286b945cee3d673f362c95bcfe8365d8bbae11b265eb97944cfaad834bd3a0", - "ae6b1d5abe545a91fcf8e5a0eb7e370ffe02285f5d46f47d96b909016cea8007", - "ff6e6ee4fd1cf4a0bef3f375816b52162006dcb697f2d6cb18ce90ada5d2edb6", - "242bf7d33434339d8f0a774402a9e9bdb02a478a403285716b737e5dbac59843", - "329dfadbae0bfe1dd0813237430a7f5ea59bc05980c93c6e9114bf921be9e1b0", - "3e2c014c2dce6aeae58d3057be8cafbdd94a4822b369d29a66e53df9635dbaec", - "65b351a9c59d7081fea2de0dc44f44c9d159201ae10073c7e5ca19cacf63230d", - "753ffa00fea45130e166417709c78267ecc1c65374add35986a244ab957dbf16", - "7b80d6fbc0bcef6448f463dc58d1426b91ab3439066d3370c07dc5b9dd3246d4", - "287a5597772413100cc231738f163b92629cc2bee6d9913803e0b064d851f71d", - "5044c881288084fcf21912e026f4b822f0b328c7fe6b896f9506e17080e066c2", - "4cc3b07e0fdf63a291fb6f0a7822b5e140926a9323b2cff00b5ed96a7186c153", - "31979efdab8824f0d28a06c2e444d23593113b7de1ad49c6644707ff53edda72", - "045a8a45c071188bdebf8def85049a50021c1999a050acecf2470b7ae3c41736", - "84765c2bf7df8c22cefa0e25ccd0f4c216990078cfe92c08ecc8b655c554e14b", - "6987906b5f8ccb018a6cb13a745b76e34762dd3573499a5306abf23a47399b6a", - "6677743a36ca2fd29a2a2eec13e2edfdc4edfd91644ac9da081b2e037c0b2069", - "8914ed9051150553988c23077c76589aaf97e3165d7b8a7e5284c160e27c97ea", - "eea07921b08bde6386d1d19a82f1c16365e7a0407163133ed5c4c36601b8b4ba", - "24841450d566744fcca36d84461b28766c8ca17d03432a66f88b2813dfe3943e", - "c98105f9508b78d7e5b6bed08e881f3c061b2a5740d6c4d1650893d710f47e9a", - "a74be69085b6cb1eb3f429e7b2120042184a3fd883a43b4bcbb75908e4f6427a", - "7616032697c57b7deeabfcdb33c05e86a83830cbe993c1bb9bfcd3e30f3337cc", - "b8c84fe1f07656c601c7b871aae41c1d59cd39dd01dc4956f479f18a92af076d", - "004fb591a9bb26d6ef6ab08adfdbc9bf2cfa423a1038dcd0217923471c45e98e", - "72cacdd5bc5ed5d33bd12a8e3e2a20943ff582d90b523fae289fe0adedeb69a6", - "cdf41a7948c978f76aed98ca45cfd170811e101d0d6518f551bf33739fbdd014", - "a9f12ce02af72ae104d3faee2f12ab4e156ed83dbe214b1c4df2c5d395b5448c", - "a7a43dd20133bc94bcff6f10c929c7617733321076a6e72d674c0040bc4f6d85", - "b397e34544f1894318284ee95d4268f1bf0645818057064b8627a7d8b9438afb", - "399b1b6f5cb805118f0f7156726a5d8127deed6317af4554a689075d8c5ca77e", - "b67d8873cd993e42464637332d4a0a430b7998286c03633f634f42a6a57c1d12", - "c9dc083201bf9759f3aeb41c6f45cc863cd3fad13e60e3825b00e57f4eec4d34", - "18fa7d5c36264620b67ebc93fe1cd774ebd2cc56ba26db381f8bcb4758a48841", - "8829e83a423f88aa7d1476cc275005ccbde219072ef251aa5f697e0e963b3b6a", - "7611d94da54aa70fe30b521174851420e59f8cb476db5fe5b4870c5229b6787c", - "7a53faa6f139237c22834fee37163886b4eadc5fedbedb03f98c4cfcfd7823c6", - "08365761deeb4d826ee4b64c7a13e9f5cd139458cf1f94da0028af5ca06ce33f", - "7f95456079108c67953396cdc4893454cf5a72da338a73014cb21ed739b208b1", - "9478963f1595a61bd7972ae39bd8c31763af3ea824b713d279f0a37a9e8ff521", - "5faeaea035a1d96408d93d7cdd0c57336f6c302c15476abd431cdb1598aed7c8", - "236781a97e357fd7d513d1e7b63d5e89b775de9c71b567695d7f4cf2bcea8a32", - "e6a1d59ba200989ec2fb6bfeebaa7f8d30d74692adc193e7f89e89f0efe0b4d0", - "804e28a783b1c2b8b1d2c30960200e9e8ee5db16de42d4c3078659d4cdfb9192", - "8ef92c99de689f482674b942efcf957282ea5e35de168806636c7835dbdefc87", - "ed4c24365b6a071524362dc330f33b8e314f9217a21d90c527a644eb981a4ba0", - "3a82b85114de3032e047217610ad59a5d86d541f780a80a1e3d74450a38b34a8", - "366cd95e90b3db012fc676a2a815f9646f531aa381e1d89e357e25175d334053", - "1abf8661f81eafc37842986a6e94498eec7bd7d26b21d43f6be77256150eb2d7", - "b8bda64678bfa859ffd1a6a0fdc6a78c8050ec815622e61c17cfabbf6570c756", - "3b8c3e74873e2ef1219e57babad0f4d2f926b684ed18a6394f78dc6ff818d441", - "d3ad1575c48df7e5f42f8d30db9d74ef47cc9429ec48478410ec4beaf99440b1", - "f3dee3e736ab0857c589d55afe7630e5b8eb86d9719ecf4bbc4d48ee73f9ce83", - "1d6227fd3c142e415198cf8e604101c4b3ab7be9447f3684a4c6627ee02dd5e8", - "76ab4e030a64d3f224a0458930f23fdabd044bdd7191e0496d8509e65cc26443", - "651141b90cfe2a630777957f0461008dc969b6b3c0959ecffc0bdb9b85651fe0", - "a760b55815ec7cbe4628c1d46787967714d578c8a383cd4547d2aa811e301c72", - "c6e43836cf877a7340b6ca922150ef3d4caab33e2584898fa84de05dde131553", - "61b48bfe019f7aeffc05918176f708351448de4f0bf694e9b4890d6bbcffe6ec", - "fcd3c2bccca87d7048d26f76bcbbf7bc81326cb1c8ce20ff73f33baf37f88016", - "ae19544c41fbecf97dc833df41f11ceb1fe8e3028c557c6576cfcd1bfcc41252", - "b8a6a6b0a44b133ae85c5f82740aabf70f74429735f636765a4707fb6a06a24c", - "8013012483187393dda582fc68b95f0859a7a2002a4739c93847f11ee64e5138", - "e33480cb1b2e1b4c14021b0a47147964d377d231e81680e040b5520eeb1944ec", - "49a81681d206401d0a0cfcb00b91d631b6f238dc039f518bf1c2a9f859e1db2d", - "5c35fc6320b3514dae5ec40f38664216a322ab6f39f3780decd9206f80972ef7", - "ac08c7ce20ab905fb2e18b60d373fb24c36a26818d2439d324c86f6303557c59", - "d2f7d429f6e5a654cd6c6c9cfa6e5457c88d1ced2589b97dc81984a7a41417ae", - "7dceff6405f98db8a4eae4696a973b96e6ea3b0bb262b4eec87653ad130b33d0", - "23f3e3bfcfcd91da935b7dc31dcf1dcc8266b9ec623b1beb33a061039acb3938", - "9488a81be9abc92092ddf6dc6d88f60713dde260b5571e44aae2846cc90b615c", - "7209d840f29aba67d2fe6ecf3ae2c3c05d397bf15cefa105db1e3f57bb9fd5b1", - "15d43fb7d23c72c145bd2fa6b0c61263c80eb341a2197f2d43f13911186569a0", - "689dc645f7b46c87413ec7429703791d0549949f71ee944cd203e245e573d8cb", - "3b4a2ff08806a6299b0745b02c1ca4ae47665db5ba89ce14623deb0d4817e7d0", - "da9c933d94a88e9a1922702003731cc5911c959ba5356bf58db8de029b3d8073", - "243bb2627a6cf2cfc169894cc995315ed4c6206929eb542be0aa4ce00e206464", - "48d598f571724cb27456ec495095014df709e933a40c5b112683e3a328274831", - "7d1c3c8b46e88ded61ea470597a2febca2d156aa15a56093fbaeeda6c0cb05e5", - "d22388674580baff58db0e116fbf3671ccdbd53254d75f10651f923e26294e54", - "9cd5e2ed0daac79c1d1a9b15aa6029009c3156508a0eda76a00e4dc81b71d6f9", - "f3b353a8f5512e18ae3316ea93d93211d174edd787df3fc3dac5ae84dabe4412", - "1b5fa2da525faa2b2195eeb8ec83d32bb7dfc108f89f854c2dc1b3dc3a870f73", - "53ad2b4c6ff2e432b568ca6f3d4010f69a69a2da4d2b68a575d9351847f4085f", - "e942ebf2b94d5229d35649b0ca1299f456584e08030a45395df83ea3743eeac3", - "8310de8ad9564f6002b99b3ffec2ec8a8a5bc8aa51645e829af8c516c53ba01e", - "7ac5a971dc45af355092551dad590307234676b93407296fb0723a567a2c5282", - "7de5653a63713d6aa954cb9d7b21765e46cd1fed58b054bc3cc614ebe230d41d", - "c91f05511d5bd05ae607c6577310de96c684faf3329f6cf6af4fa83e4a54b792", - "6d3b4650dcf5f00901a2edb46ecc24b6d1c3e593ac898e0c7fd1eeb5afa30073", - "74ac8abd605dab0a418854d319bd63292b2e1f3a9fa7af86ca49ffd3a4361c48", - "2a90cad7bfa4cf84258ede40466c3bca074008668c7711bf3c6f6bf5af274057", - "6f165ecfa9de6788f5ed711755d021e76ddb4b88b92b7a7d9b3ce0ad729f14db", - "8c6dba69c4deac2762503489efc233f8751735e325cab6fbeae9f60dec85db0d", - "2e58563de803588ba83c977c01185c15962dccdaeeb017018ee8572b27077b55", - "d1af3742a3fc31d5fb585361f4aa2f5491cbf6ebec5550b4511b07980dfcc07a", - "c3d00fce147c86141778248ba62f4fc99ea24e5b4c868b11c373de26a4427ab5", - "ed39fde22642e69907cf2e8e4e8cc4682732a39c81cd5e5921426dd3fed1ed48", - "fbbcd11a2645df48ceeaf2b729af445fa51c946657b3213f9e696010c4888cb8", - "a0a436bcfc4fa916574072d8dc2f9ea3bae527c8e55e86e11dab4b50099054b2", - "e403a69e6590885ce4468e6a735d14c25263a66977da962147baef95f0ab54ea", - "eb40a9c8e4f45b5e65d437f84c4c0e61dbb35f50cd1ec654ac23fefea70eef9a", - "3b17567856061291787b390d43d89048554553932ad5ebb3d7f4a2897f96c365", - "6c85c7c5cbc477d7cda9ace59d541111d44eef7ef261c0e754b7e206836187b9", - "856045c3d2c9c1f9792309e3aa5aafa076c315db3d42d0a6b8c8bfdd9978f2d8", - "5114c9c5f5952679c818b8022632fb7ba65de62c83c5e6af6384cde61532a063", - "440ccc01cf37ded8650b239c7c462cfa3694760d72e32c6dcdeb788478760df8", - "66da1a88b37a73a7a229a71e100cf7e2da2e717e69f88ae6ef18452e3870479d", - "a1d9b96da716f68bc13403c53b5dcd2187bebf8f4fc0ca003ee5b74bc5539785", - "93a1d590e2904c35efc9737812c586e417315fd068db6e6fb485b173631de6a6", - "c61229cc26e43a77b3be173598da801613f22fde89767a57549e5e73685587fa", - "7c354e9d4786c38dc83d265c8197dd660d1e17dd25406b693461a67206038696", - "48264d799641418df4bc961711a9d686beaf64c557a331a5b701e88b4ce147d1", - "514d4ba3d5f1d8216746958418d0c15bf996acb011d555ec6bbbe47f7d3e245d", - "14f1e3e84266ee7f570de287ab4e658c6d7555dca5c12f2d88f4e695d1f344d6", - "6aaa3555c40a3606d6f6a8b2ffe4f2b0944697d9d9fb8cbaf36c86ba14ca4051", - "3070341bd3d50df37d827a1aef96a8bbd49d2625834fdc98997675909e600516", - "d76928b20de87427bfea1ea4253566bd020fceb1c2c0c01a53667e98c8d71320", - "163901945bf16c047aea1aeea20ad45e64045e70f9d931d667ac94b7039dfead", - "2c4d4c84bd627d882ccc3ce36296d336cd16e700a39b1d25e05e88de48ee0178", - "613f69c695d7914eff7365a0b1dfb226df238a0a187bd5424422942f21fd2b2d", - "4df0d16b605fd0d49d4d68fb17d0f12f7c80e8b661af34c74f8d7372a7ffc70c", - "fe85e328bdb9040a89d107737f2d2bc4648a19f6f73550103b31b7b0a7023439", - "0de647b2959c47e6bff470ca8238dd8c7e897c04843d44ec074617b832da1464", - "72a7134fac4dd10bd6531562471746468b7eeea14ad70b0bea8acb72432473fc", - "dbca7ed8221925afda5bb4de78a0a426215ac156195f16226d21e1252eade6c8", - "92fb356692fe96dc370565d19455f5d601af32b4eae2302656a89ca4c7b583a1", - "8fed93278b518a95ecd150dab11551e0fa4ab65cbf1a2787bdae3e02cf104f1e", - "8bfd4058823e18708c498cff6d9e360f078330f4bdde9ba2606484b45ed7489c", - "2ce1833417cfa0e013858684959f904de42f7cbe4254b42da1ff9192a2d33e91", - "0c9a696995a83598a68376d87915f081225fd1bc8e9e8d45c9185ba68c5a08de", - "a46241bcf9289e0eafa94c5c507be2f6c170aa4c16e16ea9e5f92d4009cea184", - "14b14d1abd191b854f4e839cb8a6c6c41afe60a453a308dfd0116221ac9bf67f", - "85f9beef5f734343c298a5683c64c5fda816c84e46173a47c98b7722308e98c3", - "40f3c4d9134543ff3af8080b36f722dcefe09a3c062f2a74e1e5a57c29e3fdaa", - "2ebcb3cfae3cad6bcc788e3babc8852fec1a2dc79ee920b4b3eb72b361050487", - "2e9592d4c94a329ce12d0fc881cad9de7ef4da46a6a98c811f164be3980b34d2", - "1ce6e323113471d1c2cabc3a491d183745c1b8cac43117c5e87e3351d6fcc644", - "5c0d350223edf49e484dea9b593d314372bd9107983b951dc2cfaf26e2f89b74", - "c0952e2fec6382f091aa8b7500c988e5255b643c9bdb0fdc20006d1560606d87", - "9b784f8b7da9d08b7015f25a3aaa98e49e68a6d9b8f31a87a29367b20750ab1e", - "2cfa6d0c094e07f2e4495a5c5cfa05f4c53c6c9ed9cf2a5dc0dd05dfa9a2eddc", - "408305922b3cfc051e788c5c9dcbc4c9716e2b50d5eb90d34f5d1df69c676367", - "5701f7e00f75cb8a3446060d945559c4c9df35c93e31df6311a9b6a7c113e7e3", - "bebd25b5ea71cda494a45168e1edfbea8fdd6705d7a8a44a109bf1703f2291a8", - "bd139a23eda9c6afb5a654885e168f2b423ea3f5dab04e418581e7be5738c38c", - "f6c4f25c0fcc7165fcda427ae25b5a131d085907f4b5cffddca2879875114db9", - "11d7ad7178819d918acd6463043989cadf584cead9ae17857914acd5b7385e27", - "bdbaff890235777994cecf30d64261529343eab18d6a6c8bc99971631289b3b7", - "7b629723faa2afb78328dbba8e8c4abfb1ad6e8ba05866ea97d2a1e46ce6292d", - "244aa91c08c9d265537c9d724ff92893e236298955fa490302d4b70ac6c8375c", - "889b85265220e7ed3d32a91b87e2d4689037eb74251319c8dc9a8d942b068fcb", - "e5fe8750f748aa5889dfb75d2c8c0462bb7bbc5adf04a3214804d5fac7a9e136", - "2561a2ef028684a60c4b52f2b97e972d3b6c4a9ea30b161aaab863fdfb7316f7", - "57b7c804a77ebf854c081a5991270ee3f9470534233d9c22a1f4aea84290c32e", - "0146967dc5a3b82819ba73ae4ec2416e8b42eb23c08e5758cf9492277a744fea", - "29dbe3ea78556cddbd970f0ba257765bae4484878d166db4caf70821fbd1b2d5", - "a009e0b0fe952d7f91a46d37047cc5bc754596c678a421a508f95de12b35fb84", - "31c67aee207eb748c34130a01a09aafe35a187b9caf601a45e47b19b26de9110", - "8f50d73e4710254dcd6c9898d234680e9f152273c5e779a0d199fe7d40349cbf", - "d1cb9adf8c502f55ddc47275caabb7e7e70fceee742d89c59c1f6c2887171ee1", - "d1473327c4864eaf4e37e0b7b67f119de23a058e89f61de456d5d854564893e9", - "ab8906b3bd23f8a76a55b5f18d07b74b85066361203a04cfc35a2a4bc41e344b", - "80528374761d7053c3a9b742dd065035d47b7801f65129db2a90aca11a96d6bd", - "8660885e0f2fecba3fac7e57770cad07b41f49046f16ab98dde478486b5cd7ec", - "acefa995a68c7207b04c55678169920c12a4669b05c6c01e3ed6a0366266e251", - "e21c230cd942607b3dcb56d93f923c6d07e870490ae97d61a2258d1da14a0a69", - "1693025709a9c8fc7ef3dc811e38ff487375fd32beda0c7f8480f5086582cc5e", - "04e4c64ba6524a38059b1fd07cf170589007bbfc21e199a880ab4008fe76d396", - "520f8641a55e541759cacf957ddb76fedc2cf121ebf2833599b6e6a1dacb7e98", - "ee4e24d34fedf9a3d70d6e0209cd69a28fe3b8b2917815c01466d95c67606389", - "007aecef93eac0d42b44d5e800a6045aaa72ed1eef52639c104f46a62aea1170", - "e4cdeba6b9d0edc4cadb7aa817ab83eca9562ffa0745018a62a315dac5db2220", - "a12283ad627c85b6a6ca352c8a89350f903eecb568eb1326f138893a5cd301d5", - "2d8cae69d3a22906baa54aff5a6e43a13d477b44aec95068d2086f6b958f74fd", - "eeb91f04904dfcce8ca83beb8c7de7d2b4f24a6d4d7d8eaa15c94fbb447904f0", - "ad8f2c4bc5c2bf880a524f8b6d7ec5f8eaa3217d025622a9feb55d70d1c0e6c7", - "2c2c89a1f016d6618356537e1d525a7b8e970b13248b2d6d9b4011ab4119fb49", - "cd9a594fd5bec0c1e8cd55ff081996061edb3ba0848d23733c14d95f3523d358", - "12f04300840b6bc1ed98cf25e7c46ff0db23a88a25542ffab9d11a5b405498bd", - "4f077c00012d03f569d068b969332489852dc3f81832b0dc562e052b6babee87", - "4152631156f6feade622845fa204f0e502ddc64098b9e6582005db8c7d76a1fb", - "eac9c3adf2dabd0627937b556f4daf481f91e214c33c13bb1818f69f3f3b1d43", - "ef1dfb1ecf95b705e9ffbacc7a32df185a9ab4cbfc14ecfb65cb9cb8f71cd971", - "1e79ff1baad0ae2a47784e2c6fe46d32e722280b84743dd67480ccae62a24b00", - "3d3a2a44d11c1fe2ac4ed1a5b3f642402cd3817a8a743e38f182d9441e2a662d", - "af54d2e1bbdc36352a9d0888909d11a3b1b7355331b9bb523be6f222d1330146", - "4a6944f85647a81060cb6848dc5345ae8e1fcf234684268e50d6addc2173d2bd", - "738974a74a9401e47a5acb204db09776685313f680ec1b82a9f405ac6a98cb84", - "f005a353438b96a2c05f3b9372a0d0dd43dca9fc68bdb2e4ec593b5d581d32ae", - "d30fc0ac3c1e2baf99f3ffc5388766d8fd35e5a7bbcaaa76d0c0b53c9761ea31", - "ee03f812ca55966568bfe96351fdecfc81413c52d446dfb5013d7acd8ef6dc52", - "5c6e5e07c1fc36d359e0d08e6bc052c44a74a44162bb6247986a6f1096fe42d9", - "d41652dc0a16bcd10e80346f4514c2b1ec91aeb45e3e65b04b89f1a7d154da6c", - "e84e99f613d718a2afd5772c04c4bec693a1c7c66c9621a8a53eba7270dc97b8", - "268eb9319596ec52bb9dac9b642ec53c9628e1612ead46b0a0f76efd71905663", - "f6663370194bf40466e7bcf93c8fa3da5de5d2ccc0f46dbc0f89042bfcce6192", - "3e7d6202f3f33c7d7f4e9bce31ebffa7a56c19f52cb7dddfcacc77fabe5e0374", - "985f5f05a1b1ed33ddaa69b38d48f21fdf7b473175c46fc6251aa4dbdaad0271", - "ec615b5614d1daf307c058aba6c933794eac9f00f8145d1d4eb68a12bb311881", - "7152f14973e288fe4f89e76945eb946537844c86c49775e3262dcdf0ac3f6d98", - "35b4fc6fcacb4e5524d12e04569d6e30b67cb53d7059110b809bc11faaf2e4c4", - "6166371c9d9dc3a77dc593c17b9c04fe52fef80444451543c494fbc984da627f", - "b0a7b38554db506d1326d55ea7cdfe4ad07ea19e306fab28af4e441c2077a209", - "23b6f1e2c45032625ff3e6834cddfe4f558cb9ce9e4183e349da5ae7f07ba365", - "85b58e50a305fcd4eeb3b8f2cb96f58a195903c4dc3bfe72c1178ec5785999cd", - "63f79a3b201ad5db84ae4a6ad92e08855566cea08f10008c7fb933fdad4554bf", - "834a47cb693827f600a77e26198a38af2a084a40a29d0bf75d7e0d5a111dac77", - "0918f8ccbb91dbb413da82d61126789c40de55e016f51236dcd84cd3c1225784", - "7544a42e838dd0bdc74162a26cf4d3dd5c0b75da45615b6bbe508b05fd19b2e4", - "0273c21ee67522bf9ede540b520014874cbf72efe09903c2b764b78427ece865", - "8ec8396a4f05a334866b1e61dfd49c05f45623b64e8c708958eb62d62362a7fa", - "570027b18062063cf42bc26a55bdd9875eda0e416f71c76bef65c488dcd3de0e", - "722a64b8f545441a6e743cffec96d879fac9d73df1af985f8ca631fd40c75688", - "8e0b8e9b7b64ccd8443f827c5cf2b56c2cde54cda19d8d4cc401192ce1edd943", - "173d8fe615c8fd1140e6def9b6299244f35c3829b8174513b848d7951c10c1d6", - "4fb976a99be8340ebf67ec295e96d7689f9689688b9e9784c1ca1046a2cf9550", - "149799eba7f753ab3941cfce3722aad1a3aba013e0b49b8c0b3e7d1272e90dc0", - "e540075933b410b17be8d78e6b707b91ced625e8fc1c7f1aeee3adc9968f0c1e", - "53249469cea6309f1abb88ac47c64bc7d6e283c1c68875a5078832cbedbdb7a5", - "06b9b4d8ecc297ec4ed78577205f5c10477b852ba774e7556ac32b67a1c8f168", - "a0ceb5b433a414169dbbeb2bdd8e8e5f00c65a850ca827f5244ccdf177337dd4", - "42bc6ed2197866305a6538c8947a066828725ae015785b1e5df17a6c491a19bb", - "24b5063733af22349e07e743bc6f418d330bf0cc9c2c1db4d0e197682b0d8138", - "55e33d4a659f952aae230511b16af097f2874dde919a3c7a6276ef095ea8702d", - "ca0f90452dc05559b212eca050305197b65c9fa0489fd93cbb514c32de314e67", - "ba1a632798a4a45d5aaf9e45548cfe9c9aa88575740920688bea4a9e1282a7ba", - "eeec6fc5aa7b590478bd4688660532f3e6f26f195b0337c0d27adf3ef7b51a95", - "b5540871940b81c5aa661f5d2c3c591f192df0191b4f5a1a7eb15d182ce4c9fa", - "8e4dd651fcf43a6ce16703bab9badadfcdfbb50a1769df812611d5ff4be27ace", - "28b766fd1129983014bf986c91a0f4abfb9ea91f09df9c8da7910ee0e1556196", - "6c70ca90310cbdb60ba15e2f5eb2d3bb2cc6ace641116a20c45bf43d76007c3a", - "298106d637ed2731aef17f52a20289387fe02802338fa075c77b4694896c0d76", - "64c1d3fe8055051c9d5705e8c75577976f6f2229f0e226b327f6e5707c17ae22", - "91f2660f7ffb39cdc969ea6e54085fee2836a42167184567674f2271b71851a4", - "6b1201e53e411e28993fd40386b8e49f285b16efdadbdbec4c5ef1076be2f61d", - "aaed8cc57aa6d52f537a5f60dd0ce2e75ba6e3867f401d8f5626f676176f5485", - "281a92b82d4ed5fbefc09e4efa60b1323ab7b2f19b035bb7bd4b53aaff559018", - "0b865357fead2971579599f78d7efccb3b9174a33d567f9fedcf85bfb6ccfcdb", - "e08519e8b8f2998abf8c733d5354425b5deb516e3b80555970aa39af21e4365d", - "cc75f8eb90d585c9a81e7dce5250bf2ca62ba930108118579c138f8f56bb29ab", - "e72e795d8dd4ff8956ecdd470fd053e825f83158aa32bee9f900dea30f528214", - "da9fb68259bf88e7782ef3768250739022224dc3887f964c0bafc6e0d0555b8c", - "d74f203c7e86ac071d41fa5a41794d940388c480538d5da50139439be67df923", - "0bb2be9c2539188116162da036811292010746acd8d9a5e91490b5b69df41d31", - "d3e70d665373c4ba08e95e055c58689374f1cba0d6a2877bf5d5535ec087ec25", - "1df61cf29ed51d0b6bfeb71ef4ec7acee3fdceaacf5fbcd247eb7a6104b2b7df", - "58eacc430149b858b1e7b11979c8425fc587052952680f4f8076265498c6ada8", - "f54c8b57065dec7c9c246323e51c77da36e79a922b69d16a1c7980397ac6b09a", - "30c7f38b269becb776e3bf1ac7c328f83f9f5059af71ef6f5fd8a581ce164e9a", - "0b9eb6b90c23d7139a70ba0de9dfc1b3dbbe749ae79a15a738ab2e157bc115d6", - "e99409b9ce3d87871292e383c2909cf13fbe5b6d9b4e888009934b7ea3cfcf04", - "3d0cccc762be5923c81d537bf61e5568f432c666dc9806656e41d86a63d181ef", - "9410ed9c9c79ad13815467ebe0e9ba368118b93291fa1d2d1e088364d9f0fb80", - "5023ae4bc40b569b0a1538174380603f8b5856d9cddaac992a357bfa3a2c24c7", - "eb32e065f757e183bb6e55213d04659d3ed00e7bb5ff5f6526bd6ccb20534079", - "e334e8eb8e830c36b276cec9e7123ba677258e6a1a49c951a9bb7acb67428769", - "4bd1de514a20e3e3b23ab82656c12f135748d18c9fc8c1044a88050aa642ee02", - "7cfc0fc387f5230d1aa7b14afd3e95ee3d4c26a2e40e3bdebdf7d1980b198ccb", - "a4f4245cb2ffdeb98c7a6cc5c4c9701adabcd2a18538d003bd3887d054db6873", - "d5a1935dde45f9f67708a7e3cd927e636e9b72ae8cd1fad9d5febb727be07d8b", - "4c57862967accf915163e2dcb9d14635dcbe3c5bd2156cbfc45c1df6e8785a61", - "a897ce52a46739ec3b66516a4a32ed59f184018118ed8e369c47daca0ad71852", - "430ebe15d76c8affd3241f2944873f571866ddd9b356aaebf0c624fb5d600b45", - "74d41897c7cfd0c3043b371e2ae0c3e6ec71511cd87b7ccb07ee102632c5f777", - "170a250b8151dd14146806089757817b025b1b1c63c946e4df7b55a488e94789", - "bddf15c700d7c8656baa862779d51ee3c8f9b450aef9cc9c763865c805dc1c93", - "8f062013018c8f040a40a002e71a5a39b6bcaa32f1a8ea59acb8b0617dbfd0b1", - "ea88ee7cffe17a43eaa7273fafc25d3f17f8f4ebab81106d94ef2c16e042a718", - "0006f85d33b21acd2c352c5136c5209b9c72b3e8c255625942f6fa57b3af0aa5", - "346ba0799f73605474e750068a7c6557d0a76b6260b98d1345f119c57f23f9d2", - "8d9d2142e307f243253b2f1112ad954576414f53cf5f81cfe2edb9f37e2772fc", - "abc1d35eb50b28d2e1419ec1bed637c745fdb4989457fcd900c04c3d0e847e0d", - "868636a054dd4e9afb37cffac02fb9b8fea2a5feff12cb9de9d6aeb3966aae5e", - "2b160a51842a941c1f797420175cec7325a2bd0f5a6e347046a49cd2147e27ce", - "715a6a66a4235cee96c0778bf2bb8213920452af92d655b283ee191896c78d74", - "c5a8d3b843e4fb36d04f92d70fef05a4a5d9224ada4633aef8378624e206e688", - "526c300282f63dfb1bbace664617ee140b8215f4a255e6cbd5c4eaa02c17c078", - "9dffe7fa8088965aec996d2e68a0082499c10af9aa1b75a05ffa6a0a8e08e1af", - "db308e1f4ddcf19a8af00cfb47eb7adb4b409d8988632882cb8b679e3b323caa", - "e8bc5b47f93b2903a26fcf7fa1add4b4adb2471874dc3903e82154287c07d670", - "b2a77aec000f01e16ea55bf148cdfbbc153d6f8b27f694ed218f0ee5009a86f4", - "1c9aa0cee9bc1e5a548e5c69fedca41ae5ed3935e501c48225156cfce043f533", - "a44f6f26071a7fe880b3da050ff335d65f4f57e0ed16b7e7ddd6b4e83bc4b0e0", - "5161162cf6c19193dca91da70cad0ac1734e0ea71bc0dc33072c6553b2d839df", - "3171948dd497cddc949d8230fa9d1fd7b63af21a5c137bb8dd713b0c7a6a9ca9", - "70fae0148915c1af0b853854b7514c1d80541923caea638a2cc093a0612ac1ef", - "f1219df19df2291e30e67378b2c9b8c57dc7bf534663c997cb6ef843fac79827", - "a0884c39eebe7d7be053e2192f2bb5511b5f206a53c25ced98798da4109b2daf", - "cfaeaae3f5782a211b5e78b9a76e7a84850d6bb8b39d91594c03822003da517c", - "edfb664d4f727029e0e241d3b56924dccce41104aaa8cb71c8e0a3f3681a8927", - "917c480e02953d12ff6e701820d2120bc56d0c8568e6e99e3e0d0a08c5a77c13", - "b667df81cf39b78eddb61f68922af0fc3ca63e713e39421e8f69d78ab6fc16a2", - "23231ae6c129fdfe9b8447856cc21727c73222e2ce092897a9834034eef53d2b", - "023a0862ae9482e17909453d60cc359e71d9472d5aeef435e94050586617b3f6", - "8b25199330d523a0f53174bbca75036c23c02886ad59130a3f56e47ff66806aa", - "f0857ecd3195a96ad07c81a0fe72a666a7a139e7a4203ffc2a76a044d5722fad", - "391ab59e931f5547ef92d5df6744cb18814b8cbf5a87889e7a503837ab1426ea", - "362a00e8ac6560443326eb790ef2e2308288ec0b303df57c93b4d39c388d4b07", - "91a5bd5e4386566888bcf35c88c90d3b9b7799e44d0015a4cea0c6500033321c", - "2217b97f0046e2b1c19b1ab3fa41d5829a15d493b284b429c75ce4a414d56d5c", - "06a0d6ac8c92eb7f3789da6120135cf3cee0d1ed6dc052159ba7e5b7eaeb5828", - "4c741f8a83a6c825891de9f916fa8ce0ee97eaf80290bf0496663491252d5f46", - "21dca22e51350ec2e737de890008ea15ae8e8b9096aa6e069c0423d9d93afce1", - "2266e963ed2f3d2d040e72c90f2e626678a2f914205a033de6bd1ef423fa5e7f", - "0fa961152e174f480d9d4c11d12ef1244d0ebfdf47ac604877672b1becf5442b", - "91a65cbab5efccd12ad7ea9016e43861bcd7d1f9be3598cc277682b78f788579", - "9c4bb87fc1edce95fe4503196df322e2b130eef337647553bc82657f8d781923", - "77c53af6a5c1b25130ee2053039a97e6f52a43fce3e129d1fba9c7bfcf8d59f9", - "2dd7b1491b79375780ab4f4c33b8bf975ab32f5205e25d72d640beeca60c84a0", - "4bf810a6898bfdefc93469f851d963fbca6986d1652a78157ad3cf0e4a7aba39", - "7b76a76d70ea141ee6fec406a73549beaa01888813439ce12253da3cf31351c1", - "52b253014f3810df3b631347bbbbf6577f0d0c349c08ed13a557452643a177b7", - "69e489821c6e05d77178ad794906abfa4aaf3e0b9ff2333bf03a78c952971b80", - "4a80a0cdde60fb41c930d12103771266f26903db30f31ccb8fc7490eede70983", - "5469f32f508e907f4d5f2062d28420191aa19e370ad269f979ab2c4cbc009cde", - "b63124c4e3af454cc4b32570e9511326dbfe71ece5dc115becefe27b2601a59d", - "f25e236a6d92578c5ecad09b75bda445af6e853973733ce26f44b2b1aa9ff7ba", - "6c9a5904a2a62ae8ddc17c0f9924cd60c43a445b7879ea133c9dee8b1a5f5c01", - "81d91ce3ebb34fbc4df557856324094af54b32edbfbd76a5e15c925e0998916e", - "f0b076cbc5ab419eb403335642597bc8af1c2b36bdb64dfe845e02f975d40e7d", - "2f679a053e0d29830c958a76e0109077230ccf0fd0de3732db716a69e7bdb26d", - "f268679ea213f67535aae2cd0ceee8059ac464a98c022cb87d0de2544b43b342", - "513f852a2517095aaff83258886803d1b0fb1fcd332c6581d576b4dbc7d8232a", - "a8022bbbf3e50d606c2a8afb76cfb934ae1c83c136b54345763c4f1abc7a4dd2", - "1d83dd9cf7f6d66d0ba3af077466e6bf9b06b4cb959fa4967bdc37683109d6be", - "9c537d5f8cc7c9b263c2032667691da357e5a16c795d2485dbc1afae20881ef8", - "5fc3485989a7d970bf83c5cd8cf6484cd3cf5b5ade9e23b6cd36d490486af65f", - "a62260990abb67a5bd104d4cb8492d46676390eed1b8074cca960bfe47c4fc47", - "769082ccdbfad28f59de73adcfc74689560ed4433382603078db80b8a035274a", - "3c5a1918c525e2b4c79730f36c8ad4b32f6961d6b615538826dc7d6c30fdc087", - "065e3bab06972869861308d5fba58a1984b701dc10c812f72e0dbff3f3fd12f1", - "2decdfaea1d6e8cd2df40b64a60a37926e94fb69bd7d807af1757e24361942cf", - "78daba4d32254447b2e66b03d0ecd83a25f8420a0a9e8dbfdce1e945f6a16c1f", - "8de623d3c1c2dc1423beb515a8f7475727f85b3000ad05c9e7446fcce33fe032", - "511176554e7794cd0e5da88d24c3963d91e6641906993d69ae59769bd669c267", - "339f831ba281e26e75dc89aa134a29b17750d8ab1c221a7aa9cedb2a1ce46b69", - "0783ed08f22f4959b209fe0e1954ecee4557bfc9d65135b008ab92fb0c64734a", - "49a9747b5c0f19fcad52cff8b511be40f6ed29a947a20c7d313614ff09e91a56", - "d0de42522eb9b4c29e198f4c4091b31bc91526c6057c0508d91e1d77d2b1d595", - "36879e5d0599794deb5826f81522e556101eda9d9dec09f64c1b32baa0bf29a1", - "cee2b123017f1d6a7e87a4863235df9f268e2165e366d2140e1fae8691c5e1ce", - "d253515ef8a06cf955d88806a30c555a3bc662623cdf5ea508499cd8d10c77f3", - "5c1c4f160a5596abf2988f474bcbdf4dede6a8720ffdfabd1e56e5c02ee6bc28", - "049677a4eed16a2c176621104e45e925ac41ad3ba0f45518111722fc643ee2b7", - "2919be4d3d630943144123ae932cd0df3efe85a422636e5b9bc5844c9ed7a3dc", - "9c2d0297c5d8f92c9b058abebe22e8d342223e6c9cd8af9a6d7ce2b0751a3444", - "9cefab4093b45332cea31d4b5455d400b1039a1c5cba93b8d302f40d07a219a1", - "5435181f570a49908fb7e6555d90625a57b333957461e0bee9b0619a92c1439a", - "b1f380b54302d46553f508f6ba01c12ff2d9780141e6261ff07dd38e57322f17", - "3e0695c55c5c75616ca5ca90e39762f634a957b53dde2856dec0fa42976ca0a4", - "7398ec83041a5b21ae85e879f85a8113721968c0498e607d164f11b4a8b19566", - "21b096bbc90bac9ffcb24d5c3d9f01dd6401592f832f949e90a5af9dba22689a", - "52ed3b46f0f323b149593955453aaae20d4d84b87e641ed50efe756027ff48db", - "7d2bc63a210e8278a8fab5171c05dae68df241ee93904854dc7002112ea75f38", - "9a159e342a32ee15cf0ef79d23d035b209e63c9c50545e6b12a8b1bddf3d7ddd", - "d331bc6b090a4d3fab3d4f89b9087ef06e30f5b7cdabac9ae8735c0b300b2fd4", - "94f5e05595c5f08670864457d8ca7d80d30485ad03cd96548c867e9eb82b613f", - "614da3fa00cc7347d90e655a7ac9e12d90dc31d8181acc3dab8e880bcae4ae7b", - "39762c7121f3214541e5286e4952b9e23ee82b43de81617851ea223152b62e6c", - "07f8437b228b714ef30a9a4b5fa007520a7bb2d507d9c22ff6a6064a34c1ba7a", - "658955befea9077873b2c52d48f3e90e8aead404ec48342b0a97119f91050396", - "8b3d6977aa9e82b681fa6cca71dd6c1961d3253bd2c24ed157fc9aab2a6f0289", - "ab826fd4f00febc8ec79e60ad09b787bc65e896211554b8814a6a71a66bb5512", - "2d1f350fbedfd8fb5d806cc961b2aec8b3b44455ce995946f496ccd06f643465", - "63824a7825c03ef8bf330ac7ef6e6050086d979d2f02bdd0b3587d106beef25b", - "638dff4531fa667eea7e56532bc31e30e0612af2106ec2ee92058382101cfe45", - "582133e6ca09b247b410a342a31486c674d90bd3aef665a18a5b56423c48421e", - "ada82aa36130c489cc9af20c034103c3b5a4b5b2d3670ce1c2a0e8996c897ce2", - "66d55415b243131bc1845c6c9553c81734d961a0263ae910fef2cff6fd482195", - "94a0e993b52df3f6bb02687f95c822f410a0bf1d3c834d7f52e00f7aa473e18e", - "8218efab79fe13679f6e4b43181b94d208403db7287f2bd3efb229ab496601d6", - "e002650c067fa3bcfd2a16188d34fc90d856eefa730f7dd4c4a5b60247b695b8", - "57580a3807a8e9f739fb1d8a45659c54ae898d13720640bafee985b8e3b654a8", - "11a8c2f950f53c538a91c26b9f74fae75ec7396ec2dd17049fb31d1491e2c3a7", - "cd6c76ff1dd2e89ced88f768b70465dae423fcc33c59a6ec8b47f1a9377fcdcb", - "5727262061194628afc7ecfcad9b9b3f38c2f44051b670eb11f087089fd38ab9", - "8314973f6ea3e6697531368e362405e6682f5242b6dc6ee7b192e444854c5161", - "4d3342fbd8345ec55549eb7f79293982ad24a93f5eab1818d1b4bfea901b08fa", - "21393a68663424133b2af0571f140c6a7c22b3b0d72e10e5c1ac3c6d4234515e", - "ada7c770357fec3838bdf525a4012e96c58f050cd8c85b4cddaa70cccaf2841f", - "d9e5de373fdf7dd92c711ea3be1c03ff8314ca71ea20201db4669d691e3fe7f0", - "2bb1415bead2044f46c0071a3c07fb10e3834e6262484d454444125e2c68b730", - "c2fa33dfd87b91c5dedcf624d3c0a892354a764d2e97650615e16db8b6050398", - "d97bb2682c587383cf4a4b595a46af5a8c61c3a910ffd5d723107814cc4d90e9", - "1198c833b0474bf76ab3a0602d46b33bd18a24328eaeeee9c3f8688c848eb9ca", - "8216b85b586df10d92334b70684a89e7e863a7fa134b7575110ecce6412e2075", - "ab266f77bcff6906bbec921c88ed99832c81b8513f0d821e9ab7c90a78e9ef4b", - "d9ebf2b30e11415aafd397173d141e94d7e401e78aff678b4c53eb618480d374", - "b876803434ca17a18925c0c3a39d625697f1e9a65db6cd927eecf0e480da1401", - "bb53ed9b8833c0e9ad0fcaee2cceeca92d97baaef18484d6b42c8d53da1d3715", - "c611dbd33f6956b7c7c94d224622abd76cd24eb0469173efc5208f7c54e231a6", - "84968aa38ef33cfc3d0380e567d82e0898f906dcffc2138820375d7875c1f7de", - "906b8a0d17ebc115529014d91d7670ee308f97f9897f4f9029c59a608af47916", - "7b460318d79a196fb57ae0b929804124607450dbebfc40fda9ea1b9fa9c34841", - "69db642f52c12f1cebeb6c0ee1b01f2bc24f5ded09298b99955d7ea049d0f92f", - "3ca4182b0efbe146b26e0a2b3eb53279165f5f9ad3626c548a95650458056dc2", - "1d3911fe738d6e19b50cff7605d6ad3a71a7a93bb251727e92a4377dd8432c5c", - "3266bfa09724f9939ce9d0281be8d2ae791d4b621d993fb98ccf2868f20375d0", - "841f9025dee5a2d75786e1b57c9c033f93a5a1c96fe56ed4c6a8a35231f472e8", - "03156ecf82778c7ce517ca761dcc4464448e9cf1c38a5f419beef0f630cb5362", - "9ae4c3ecd922d7de6f1ed71c416f351b18e291feccd082e3fe577f382ed85ff5", - "a88b007e219eac0d459ffecd8ab0042cea35e79445608811fdccb073df197559", - "a2920be15f715622c1e5704c5ae648d8519bdb6e585e8dcdc2c3bfe7fd0d8c46", - "b8e144936ce7ca78e6a4463f36e6b0efe2548192e1c9b4e02ff14a414fdf7898", - "ba8de8415aed6b468c6e22143589b115f331313d9d3c17921d5713d63038c24f", - "4775b33e6466a6ce7f87d629921640ae6dcf1f1698e1e7b7a0377b8c6c634178", - "ae1141c888be5c7bb773a1eae788e41e9ee565e1e94bb437bb4f0e6b068f6b5e", - "f3294e80f5896d12721e978625057e51a57d1f551132c85fe9889ba7d92b54dd", - "8db870f4623b7c1f6422d12e05f6a8dfab24dd3b3aa19d8abaad7ef8b5634bef", - "8c167dd5e9fca083a9464bc2b822b17b956b7cafe69b1ec9936747a94d32dc99", - "f80453461516e564a0cb5837114c03e7c398d0a5597b3609d186d44467a86fbb", - "e407d83cd4fb68e0beaa5253657f25730989f2151726944378a7992ab24bc631", - "a74ed79249bbf495ffeb3c8ba32d77e473e2266092c2d311d26a084dfd894c5f", - "6ab69f5b1e2ed21ee5088efe42c4cb8d80c24c57c0b06c3b2b1f17d25466241c", - "56397556bd80679f80a9e856f622d4081f6aad88d95730e3269bf9eb4d6f603a", - "e1fa353674b5fdeeb92f37c4353453e9fefb9195af7bf822077dd464325c41e6", - "b972215f6b7fa80134c8217e059f766652f78cdc7bcf01bbbc5a4a99b6747daa", - "a9b202ca50af03e6329e90264af8905aa1de9ea01a9dbe928ada86d69257f76a", - "92f1e7b9f97bfb968310a65820f3ab7493eaaf3de9bda3fd7763761ba5db0dfa", - "ba48736eb58fb462059d82fb214038a03dfc9ee9d19a34ca3ec1b7382e150607", - "88c1fbbf19314795757100a60e9c6d9d9562a0c15f6ff315b32da93d3be6ec14", - "50378849d5c08d846a6c8d05850566a1501e487799cda5976b5c9e91ff165ab0", - "671aab0f88443f9a9b8a92ce8a2e868a1ae9e8fd29ff2faf2f46c508d5415b16", - "2db733c5fc39f6e84f1268f12f533752ca48d549fb39902ea59e6b3bfa260072", - "e9a079be49bcf403490f661317ef525ac89223d138a4ad68d5dbe37b7a891607", - "d35c3065fc6f80a14ca683b3ef636f5a0b823ab37a40e5572ed9d5cbaa6fe84f", - "4928d37c9bd43cc08b9a2325205ca81607f5b1e2803d278ddcfaa728b9981f0c", - "90804afe96bac3b085524e49e492563547c2776b597d8be0627edb0fc142fcdb", - "bea9c201bd87bde4efb66643365e59e31c019b845ea429a0b19a5e56a27cf456", - "c45fde7b4ad786e58f1c349135eb84b82442d15fcd7968598105f43f848be17a", - "85c62fad57e0bf27eba37ae4c395edf961610db2a1d2d34efb4bc6e0e2e52f8d", - "fc50b0e780def92ad8e750b1a05eb86a00b1d9834f314823fa4de41590ffa808", - "7ce309b08c068a48648b2122fd9d8b0ffe2f0831798a9cf5068b0407f18782dd", - "88a15155a1eb4f152b00f430dde8923853944eb18fbe126e6eefceb88d0a7892", - "0853be11f227286ef743e519b52b6ac0c58f249c9bade2fc2837558e7224f13b", - "cde0e77f4ce7585549ca13a28c22de84634f25914bc43dfce48867434c699539", - "74dcdc460422763d9cc4cc230a435e1818ca3bbcd1bab10c6c0dbbe0348b412f", - "e3379d6ee76416f7e4fd06ae3538ec2816396ccbc36ef2b3e7b50c5b41ea2d99", - "8ed75cef5a2061d055934a0f13ad8c808addcdef6397f4fabb3fd95f0be389f5", - "8ef650ca91f969b2df15b2e44b1884b09e4dde33a1a3bce0bc36f093d47a9231", - "7cb86ccf81737bdf709f56cf9b3e7467ca27b26b174d8c5c367cc088ebb54b30", - "05cf2aad4d0917ea7a93933a9ca69546b5b2167e97542b8efef4f381dcb12fe9", - "cf66efa3ee6a78910423e0c31192064ddbb2f743b0e5ac507d9bd285697ef0f1", - "e20e0f701ff5aa7eeafd4dd909f968921313a745a4dec872c32578a991463b15", - "8b33eb37d11e0c3c227d016013b03cf2215567312c3aea65ba05cf7e471b1bb3", - "7171bb40a9254ea96f8f5863606458cd238d415525a6fc36e976ab367527bf99", - "4328c673697bea25d3d588ec52bc2f8a806658b602ae4c9559542b9e1d392b55", - "69bde24a97ae0ae208fd608790b2aeddf4e9428e5cfedd9209b904619669843d", - "c72f232352f354da4274a7505775335d2702cf706537abed56cecd6faf2325cb", - "8610fb4734777f06f0176b6d3897847e12eedd25842bce755e564cd8ce06b826", - "de26fbb64328230f40c0d2970b2c5eda5a7a815fab9c4e2dfaa94bbd74be8a8c", - "da8fdeac4a189eaf5c1a66559fea6e190fbe1bdf70b0400164eb4dc66ed14a86", - "df5b03d0b6a31cbb69ff6a5f889664fbf7dbf301462acfb676baf22910c9f934", - "2bd0aae7abe699fa90f8ba35478d1359510eacc5c6c083e4cf68f1d44ac961e2", - "5cf06148df9affcbba255978a855a9b0a95b797f5b87c62c08b819c358370639", - "2e27bc2d032444c1afc6a540f49014ca6c25002f04022992236e11db7e56a3be", - "dcb9f446b7dc35634f088e932a48c1d493cbbd25719a618a99434e4601cffb6e", - "8972e09b16a0809fcd1196aa9a5798c45c7367b60924440e9fd4ac18f2a28d03", - "7c184ce3d1d425ed51919e98ae5cfa372334b393cc281fed02ab9531b5d798ad", - "d768d572a4dd739396c4d483aefb92a45f437f594da4871690029c47a3ba080a", - "2dd0d8c83d2e3aa59112550600c2ad6b3bafa285759b6aecb6d660731014f35a", - "93b98e063e464466a7e10142e968665bc5a87edd27da00b70688d6be2fc1214b", - "d56c5f4d93aeb2e8853b1147fb52f80fb13026d586e505dfcce86cb8abe2139a", - "6b86d564bf7f54aaccec749e39d391dd0dbcd7b4c9a64ba0e7127efb575ccc35", - "e0a19a7424f3ed0b14349c40dd7beffcbb5b2a4cd83c96d100062934b6599cc8", - "5e21e690854e1272a8b311e8c0bb8d20aedd5315f0f20425f1b234a7de291777", - "5026fe11d98e25bc5f49ac6d52a95337c32a7a445c9b6696a2b6cb31d63a4db7", - "3768ec83666b5d4999f382b77a6852b98b7c571674ac8da2d7cac11bc3d61a57", - "26bf9655f8854477c2cc5594d48457cc9a9e8e46c2a0c361f1323dad80d6588d", - "d25120763db02dfbee234cc5be0a3da10b1845c48439058e010fab3fe32b1440", - "b0dd06b2abfa2d2888ce3c37d0e287287be602008a86eb9dae1c3bc62b4a022c", - "03fa698da9e73f85f045762266a3cf374186391738b19b5fb50ed296367b1a15", - "39e5fac46814a3288b6256c37bcf1470c0b523c3739de46cf9c3c3c55a543839", - "67a1a9cb7e9332f755bcfaeae70188d01cb5c16343adee022da90dac1fc0be9f", - "ecbfeb8f15b48346e26f311112cd25268061dd95595d17568b24e2f8c87afd52", - "af682fca1f70223c926c7220ae0b8df0bc6739a117a51b9e0f818cfb9bcf4c1e", - "0b681d17df9dc31cdd197b60759f88eb461078eca37fa8b70ce7ad0c697b8612", - "018eae74c2683cc7480d7d2a624925e0cc803affca8dd3a08c3f2abbc0531208", - "ccb0b88b7d6cff0be726a371070cd117d5b895cafd47cd07e5e4be91ba1b51c2", - "d788dd58a98e9e07561465fba9bfb4089486e9942a11011ef9690a6a27f7b530", - "a12dbed761f83b6ab09d4162ab429b37ae405585a0a73461377dd7939cce02ad", - "2b47a644477d5cbda6ef466994db3fd5b21b56eed0b8c50999bf4a5a4e938764", - "d1f1edc0345fe1c3c0d4e7ae0d6af4fa697c9af3beff627cb986cc457489005e", - "801f5a78a47e13fc30e50cad6d2531669da860afac730c37e433f23d1398cee8", - "de254432cd69d321ea73aca5f6385b0896c5ebd94e9c71d7a941a2000e545b25", - "fc9397ed69e2f4668438bcdc5912b5796ca98a8f5f71052a989c46c1d7868475", - "fe0a599c075ebe4c32395274d6106e350d1c31a473bbb6b7f4aa9fce132c49cd", - "189d61611f904b76427fd1ce3aca1533476438f4d0d1ee853f50ae30a1479ee7", - "395d12f2143490d2b6fb97b70b1c5f2df538874ca4b29dbcf04a670366693e9a", - "d6d8da51120d37debc4a9f53076941dcbeb8adab6e23f79a9115557287f784b4", - "2a185729ba25985ebe4719444e13b094d8a4188bb8ca9629e5c07ebda4db6707", - "3a87b5d70602b28e24a69b7b3392176f6be2395c997f0afcb6139686cd74229e", - "d77d990705dd2d1721b5421ad3f536d2dabc51ab294fa72706ebf3efcc09b778", - "c9693c8dd2fe749a3c470bacdcde8c29b19e47e2d95e683127534bf6776d3339", - "141605eb9be3691b05f313a84afd81d1b46085903b40cd0ae7f4d837dac3f916", - "e1328f86f8e9a4536b6aec15c7e9b04136a220fd577ed4dd809f77432d7c4273", - "9960c2980e7bcc1e5c7cf92492c5069005a28b4420a85650c816afc8f9f6cd07", - "57ffb661319c39747343e450af0ae45c96bd799699a2cfe785398ad2cc52d654", - "12b5a2b25be9515ff2bb54a8ddddad4756cb474602c21bd428c65d9f696a4017", - "382572139cc2b9e6cf620b427ac6dfc20556d646f74e2e21b2eb2b92e7cc0255", - "0b412eb1e572855410bc49997ed372e499f776daadff68d524ef5f7e10636f30", - "a76775e81cbb0c320fc5d37eaaeb5b040219a82bd3b5b7b3e940ec0e283eaf71", - "1ec14610ab713fba99b24516b0d17ad64b606403c7702d200e5454094efb3d75", - "a112b2cbd9b9406b2a8e8a0f4e10706ec8ec477d5644ae7f5bf7a71742e79e20", - "7a006ff547563c60fa9c274fd59edc9240cd9edeea8c7a908605a9bb512b16b5", - "d291aea917d7212252b7695cb030ca92d4a6e4609356530f436fb19209ac414d", - "267a87988229dba4e1d53fdbf82abefacfcf01f536a3ea20f60d74c6e0e65912", - "0379bed5cf7fb318965ec9b496aadc573fb78d1570ad2c43703c72e6c6ed997a", - "8640d8c9c4706c6c4e0441b4d39337b160e8f1b8a3f54245816ace01fbbe1186", - "995e18d0631c7935c5a2073b54fd6e9e5279562aa857ec489c84a8a5b3e528fc", - "2ed4b719dd585d720c665c73fd58594e59fc9e6c0a4647c62500cf4d5b04baf5", - "bee021442818491d417680588fa2303b0ba7e0ae20166ee1bd7765f0ec6b4045", - "2cfc4161d1c0947fe9fd9a87e80ef31db4a46ef958fa2d48fae46572c341d85b", - "64f5f5bcf37a1b629ec735bec4686b3d47996f2a74b50c268c9a1592cbe0237e", - "42f5c691028b7386cbb54f95bb7be603fee5145f4f9b46e23bd526156561266b", - "932e0080057ec2eb2338011e622ff3ac36ffceb020b418beb185382dfa85317c", - "7622fb5f89f741fc19f2dd497023720e3439a709ba084adc1e0f766c4ea96d27", - "956d3b048e9eefc4e31c4389f66e080ea71a202a476124ec489742ce01ba5bd8", - "36d63e76101957ae787e23bb9fb8ad8f16df3cb49b618911a88f4f4db1209c1b", - "9d4deed3a54cb42541f443faa25e50c68a32dc48f3fe9a5190524b949a4875ab", - "852a1f822e3484ab5bb53e61581670e3cdc7d86d26c809fa1372a293beff2031", - "649b56dd1b704cf9ba2e5e50a3b6596c0c18ceafb140480d4ae329759880b5d2", - "15cf88fa7c9eaf986182caf20edce7dc74f9266b05c205d6293207a6915e5e69", - "b22b3af8539711ff2af453ccf9d49b4014042cd3127c01fd196c6a8a942afa82", - "a2eb1e3f8cd5f60ba2c808c4f50d91382f8c092f886d9af3db35fdeeb9037257", - "19bc00dffbca641610fa2882139eb2a339b927531e0950ec029225ffc1ecca85", - "8c3f0b00a6c11a42571b7c9b47fb03a43cafd7f836b74ccb8912e2ed09212020", - "fab7d856e1b5fe61666b24acdbe83b3a1aaf9da0540595d7305790dbce89e47a", - "df19608095c4ba3375fbe86ee36abe0eeec79f56a20076ac28811cc5929dd9a6", - "8a5eb4bd099dcb306b656e1af4e4a96a70e017eb7c82ab20b2714c0c8b130f7c", - "39a48b792215c6c3835d01d4ed8b910cbe595f671a26bb5fd37619234b603132", - "4b87f48cfeb29e557af113a56f79abd83fd4eaad4e773928c78788e8dc78a937", - "c2dff17f13a11a8cef4ec442a583498e1cbd310fb1df94a43606be1c106615c3", - "923a93bbf2a22ca188626086d56f57a78155ec9cdb1e963d176002119b7a4147", - "e808186a134acf2e71f0e042579b11c2679c6bb1148be6ba29db6a017fec4436", - "27222c79adfd035df5aef050a157fa1b3a0e54926cedb80ecf855d6eb9ee23db", - "90669d7630350a4b91e282f47c8874d2aa7145d9794046434843b6227ff418bc", - "7cd517acd635cb9ed46a111f0d9176a5279d832d4a4f1aa07e595a509efb9f53", - "de7e74fd73b74bfaf29baddab79f113875929e1a8be62f0451a2968d7ef40b79", - "49a06cfa878418649bf1d56cbbe80483f2a912c3d8abfc0d8d87370470ac9105", - "4564c58f2ae692545add59dab886a54a1fb502d60c797b05f5dd2a5d22691916", - "2414f7a6a977a2c0f6187f515048aa92be51cea14f3faf3eef6a12c570653269", - "fdb9933566e3ff94c7c7284bfddd40590037ffa52267621f7a7e0e9a9ba0e589", - "3127e45e94bd78d28dce410d3734420730f888452d1891dc55626f72a6bffdf6", - "5f15db0e92569d050136d49ac87acb82d4d9a233e7fb47e9bae11f8923312c00", - "bcf970e8af94712cfbd0d41dfd992ef002ff74e622bb63d5a1296cb5ec41f496", - "97080e7a95a5f2adceaaaaf602b746fb25faed2f39dea4148616c2bc013fcba1", - "6b24751fcb125eb7475003f35f54321a8b690103c9cc24c463dabe15687ad7bc", - "c1d2c2ebe2563087b07188f2a732524fa9bc89c14ad5f7fe667e70427e347160", - "498c20d387c00cbb1bfeebb2332c7308b4ab515fada16e4bc48e48c3794ac1d8", - "39708ccad55f8c915f0245b886883db04e1955389c061a5164766b39a272a122", - "b196b4d82ffe4b99cec70ed4a88489c31c274e35efc8d1c2e2472fcfdab4c591", - "50ae88ed27bbb62c96aadb27d9224d5265e2183b1a35e689df04ca34f3116629", - "09a3114cfbf2d5d42f9aaaa4046856a3c27dcd243521f574adb8ff068a208c05", - "7ca046cbc661cdfbdbc482a178ea5b28487309a8e11b842de1bbf7e0cb7dee5e", - "03d6c23c109842249fd79c7ef331ca30798bfb300f7d7a42013f7141f24ed737", - "a839feab357cc1c6b70ef8f396b218e752c1ce270da1b116e53dbab7b5a891e6", - "d9a4ed36984e573bafd801abd5f08f4b9fa214446d59dfc22aaa3815fe94e081", - "be0a31245379ce0cca1a164fbfba3d55676197c4a36f1756bd3ec26b5ca1a0b2", - "4251430b768a67b0b00d99fea8b4ec935d1c103a43cd6c8234b3079f313f9486", - "554770a4250398d41fa324822fa53d9f474326f104de7440155942d814aad5c4", - "4e0060c6574ab3107302dfd8f161cff8c12647264207d783342fc6aeb3e96bc9", - "25438c7ca3b5fdcbf588f73dbf894450ee75bfa504546e8756b8e874389ad031", - "942521e4ad73addc62d332b77986352978f73134f9de0626fa8f0d0e2f63443f", - "9393651bcf77c553b5423db9cef51e15a60632ecfceeaecd61b95c3893308ded", - "fb5087dacb8d4a8030af6218ed9f830a416a112213f1e30e3119e694ddf2c1fa", - "7d53436916bbb32698c2f78cb17f36f993d93f8c78988bf83897711eb3631899", - "da61de1099a020b6b0b8fc19bf40430bf4ead51c19efe0302b84bbf5c019d9fd", - "baa3d2ec6a11ce1dee0412b1df17d32359e8f574c701b17d7a02feb516bf9926", - "b6366942021a4a66f6505e8351268bce69d41dcbfe133ad999fa8ae78a94d03c", - "e445fdd36a87160538f6b366da44751e2081fba03c6551edbd34b7296af31757", - "b33de7446ebb0c74fe3b16b78e3b62353a6e1ff63987ef77d22e306f0b15df4f", - "b948faf689267859f46dc8a97ccdb9b160f72f8e50fb2017ac596c0b91f81772", - "1e9539ec8df7ff4c8213e1db9d165b4bce7d360600f9e49d5e8faf85e99e9765", - "0078c797043be2f790d4fe9e751778a4a90df90e0b0b77f3c1965edfef890086", - "743b1fcc2d7241987ed6681004fd99e0274477075d06f56bc333b2ea382c0b49", - "d73ca8bb7763e483e957431edc8c74a9bddda6fa29d1a45f8f2ab8f8957291a2", - "966551e464b70fca865b6a66158c903f240188f5b6eb8c9e1a8137a14d9088a2", - "a4d2cf333d35be92e392bc6de9933b8a7483eba7c28d8afc1b67a9860f485c64", - "f7156de1d2a74fd2dd36f562765674accb8c556c60aff3e5d820d53b4f216a6e", - "e93f1035f1c3ca7cf58ca45b740932020c0174a43027f953c07692bee060f02e", - "c3e67b652a3df63f54b92d031317adecd21ba371c70e9b2bf86853c4cbb2b846", - "a8f35438f2d43f78131032be6cc894bd4f61dcac1aee5c0fa6f9292ef952ba82", - "ebbc7e5b30ceef4c99b68474bccd3ad56cfd9d1e090bcb261635f27c2d3ee659", - "bcd4a36484a610de21964925589e2849da010675478d89bcf754374df195d0df", - "80cd1d3ce6b174855de1798191b44154752dfb9db846468d27b2e14e7cc23e38", - "0c13054f37c6383c7b6b37315b0b113045f71182fd551827562bcebb62f1d982", - "30ba5e2d6674b64973873bcb7c59cb56328642f030f4817a20d11fa9a6d1ce96", - "fc0b1a69b172f45d7e1174ace436063a9c7a532e62255ea5dfba4229e378334e", - "68e50ebd2fd72f1c5a16006be9a3c397924304b088447f15448eccd7fb11aef5", - "056dc3eb5e8ff6b71cc7284f7b8e9d537a1729516ae21ce405dd09a267f34fb1", - "72826501058d0c4aea1a7df0f1abc5b3037090adeaa277c925d3e267b39d1271", - "402c87157e2eb4a91b8bd2a29360283237691fbef6441e9a58f225de23e0be3c", - "c215afac00ba003d87172b486f2faecf7a7948f5c939da06c831f5490e5b7419", - "5a1db32557fe81d1770d296a37315a8ecbac438f206f7493180d991231bf2a06", - "1022bf89373955ab10f207fb43d743268751d46ec2d5553a4eec57fe78b6bdf6", - "c78d72b521dc23735730965160066fe047ddfa165e0a940f6e34d52f7ab330c2", - "24ccd4c48e184437cd87535476ed6d9846c1e85252252170662da9a42c13dbfa", - "59462f2e0da1875c1bc64d8bd632daf6efdcfa1de037801a783f2d0a7344ad4e", - "02c6692f15d82a5b775e0b43c1e9cda0fd30aac365925c0fabe7e9336ae88aea", - "77383ae2aff9cd6a26b553610ab67798c78e6a1df1c80785dad7019966f97b5a", - "feae3bbb2c7eb7c534863aa06aee8d10a82904ca9d1f6e74765c3e4506346410", - "7fe9c66fd56db35851dbdb1a84f20c1c3f152e5274a1a0095e2b44992f26907a", - "163607ec4aa1539d53cea64da130f549518108bb26b9d5dc50de71f92cd16e0f", - "49ae3a745eff4e54a0484074741a51272dfd4a58cce78315a45968e9ac50e287", - "9583f8ca6528a3d0eb7d754c53478110d236192d46f270c3ae559800477e98b6", - "ae3c41bfa6a7b490b385a8a99b08616b22986b6322355cea1f7392feb75ccfde", - "18bf1662abeaf90f513f70ad4e4055bcd4d62df0b14ccb97ca43c117642025f5", - "87ba337865e9659a011efca5145811c5f081598e6e446afc04f1491bb238f989", - "4a8c12cac5e776c876e4846f22a2ca0f393fb7443d1f61455e7a29c4640e70b0", - "1370b6f786545b854525e8018145a51496ad2007bb70a5f26af66a3e40f0242d", - "a69b2a106ac771171270b231108315f55a2aea18efb3ece2138a09e0db74166a", - "9c4def8099a99ddedb6e59a5053ae3b4ded9dcf3a081515e26217297f5ae87c5", - "6ed11317af2ac60c3915990d06c74ac802eedff3fb492121e2b1904437255ae3", - "448aa42dc2b5b6a5969d5cbee638dc5a30138721f31f95bff3fd4338dfb3e940", - "8aeb45b9d8795b1f280e30867ceda6999ae44bb48b378e4b2f32da04b5274f2d", - "c7fccf9bf9836015b86fc5cc61dd0d2bdcc30925bab2ffea2f91dd360db5de57", - "b81cd5ad36bd759c7375fc3bff1aa6d223462245ff8ff52053fb3282c3ebd0d0", - "3602da4651598988a094a1aad1bd5bb591d8cd9584064e612ea95537dbe9d2ad", - "04cf923924aa6319fe25370fef80faac6003902f364d4aa9bbcb01fc8af3ef12", - "990980d2d092b72c2c12a8b516d2c83eb9af8569eaf1400a9dba7a5aa335d8e7", - "ca1366248f837495e92d8e4f46298cbe7065520dfdf55c1dd9f770fb0f322939", - "9b370705848fc197fad1bb8478132ae83a0a818253198c7ed7dd90ad3798840f", - "6826f26fef622e1b4f9927cd74d5f294599c8ede1ee475061b45329742ff1ba0", - "3bf3fba542d966b1e616851b487f75a0d8fcb02e1a09c24ad3ad0ddd1954cedc", - "413cf8953b9944500a237e819d47793ed86a1eb970de88a7e67de64c7fd2b274", - "526cdf92c394ee8cbf5bb724c34664f6c52788d95e73aa350eda2ac84a32aafa", - "c40eb05d412f904f60f2d3aa8bec0d0eb4db6923f523e11d6eecf7f46ff256c2", - "3f05e6f23e9857539c678e206e84ef414be2cc0d18ac22e99d82742325d57c42", - "79e962f4a854d0f6c067b2d1541a4f17b879c4ad370fd33fe55627a34bada8bc", - "8221c96b1b672de8a18ee9f9dc82d8cb9dead6bba95606bf4f2a16707d3cf5bb", - "03c5b507ea3e8e9d4514d0832a32fc1c739f90b3ef10a1efe7bb2ac34992ee3c", - "df9683632651f90cab4326003bf26694b27f5e0b703e6964047f1f29bd533393", - "d529f123e4b935c52710ca54ea56af4aebd67d0c266efab013f5b3f179d252d8", - "beb85075c1b2cfbce8b00abe81f1487402ac249724dadd59b3fbd34f1c9f446d", - "c60b74f57dd2e0efd9c4524afaf62b4e375b2ef296b476935c456507ed3a0d95", - "ae96cbb75b06ee6952e29322cbe5220a2b3de155e8a0f4b61c1c52d9a0945de2", - "9407a2c820312d9944aa1cc0aef6bd897e19b1b6417f8727f498607560b1d233", - "e6ae3867eb2498c5eac22f2911a43f7ddea2bb228e50273a91bb58c1969574fa", - "2acbb1c3207bb4ca1ffdb4dfdd14969c6ad82e4c3eed2347ab7788a2b8386a07", - "b105f00bb15cce9ff3c66b134d878dd41c8c76c36648dd89cb1342e8ba8a61a9", - "e714b98ea9a698706d92ab81247ef262f24644556ab374e0ddfdf3f4d77237ce", - "921df99ba6541da142d9e848d9998903ac2f74abc8206df7d8c3142052778f19", - "187d666e2115eaf589fe38c7cec679bf1e6868b5e40300fc4db6c1332a8e8f53", - "ebc3687b40fc4c2da78c8ca9400bcfe97b08ec8b561ae8bb447614ab5b75cc65", - "41688f894f6f111f7d1d3d924b66ab49de89c9a3d602c8c5b0e96a753efd61dc", - "28f61ae6f5e2a1846964fd739abe7a32e3d38d27e8ffe0bbee83df888ccf2dc1", - "fcdff09a8750038ba22a54809627c5b4a19959561a3e4058f9444f9b0cf3115f", - "e8cecdfc7802fe8aceceb143e5fc6e0ec42c4a297f394072ca4238a6f9e90963", - "c276ffaba2cf0f6a37cc677ba3c217ec8b5eb36f994baae18d083316e8ada443", - "4cb51da9ea0e185ce7569ad8d0bc1b0a20044af8afdfc745b1ef9e582750d342", - "104771a699eb4f8e47cc479133c00dc0bcbd0a1e8d63fa51c7452bece03f6eaa", - "7b0dee11dd57d9937bf5a8818b85bc80529fb79d09b1382d97ec9e822823b4c9", - "88eda3ed7d6b288f90f8faceff233201227a41824a8581fd5d6b55ebeb4d3830", - "a5d99269df6b998639bcce25a5ae6a46064a6f6b920ab77282323d6cd2152071", - "d928a0335462230766fb30bbe09656e4b9dccb4a4133f73b38978cec5f32ccba", - "caa29d838b775dc137fef00de949ebe42c4195d3eb0e21a5f7ef6f07055654b3", - "13454fdb1fee2c988d017ad27bd77e9aceca01c24d71ad665ada09e81b89862f", - "cef77a1cb24be99da54fddaf2a7364118039a107cca9a8969be5c298e846d3d2", - "9b20cddb53d351087f1eac5cff37d97e5cd895adf7fc945756a32d2eacf0e832", - "84bd05669de95bed4d0bee26ff08fd0315b205b0753713af165f66c5975a2030", - "819922ada21eac32692f18483386ae670916f746ca9cb6d00b61c69ab9471c95", - "ff73e6373bf2664e901e9cd57c74b58115f4ea49f864c601b484060777521344", - "8b01706d93d5f291fe3db6b530054f8c200cde742314867f9f3ade206d5b3521", - "e8db9b6d1e6ee1699ee48cc3a8c947e5691fd70b98b2352fc1c1b8f25f5065f9", - "2f95f8aa5334c632d3fe7178b109017768d771450be7c98e9304eac7f7b72992", - "e2b55262a54c8c4db985ccd8d2be811d58173d022dec19e82b089d7b685211ef", - "c6f4a66bf0d8110f11df48fa380f82c57caddfa12ad0e27fd837233cfb8d349d", - "3f5569bc1956bebe2bb345a7388f73074b9fe1af91b8a1976bca376f8401c402", - "ee835cc0eb2ff83542bee6d988df4cd0b073acd1198fceab7f930f0b7ce0aa76", - "766e914171d038ad0596b2f5b2690d84053c74a1dde1490e3356408bad376c3f", - "f4eb0295cbb51f4349488021963b062beacfe0f6bebb47556a5ebd77560a091c", - "9518ed65c5ed3f7035df7fa607a461e8f536af2140ae1d750cc8e2b7cd2c2d1f", - "5152e3a4eb48ad0b7d3df188873e65875730bb1937040cf3789168d77a462e6c", - "7b91f895d1f689f783f7ee25b570aba04e440ae42a5cc5dae099b7035f8bf643", - "a303426fa876d62081a6adcc76fd32ea410296a69ad28031ceff2247965dc819", - "0ca25972b066af8d96a802ce0567284af295aeac73750aedd551f63cc903d941", - "f2b31f9c0e89f932beea0e21500e47edcc42912619e74fcc345903b210129dcd", - "2f17e5d3a16de5c71c8980c68939f15377caccdaf358ee6bfa65720b50cccfe2", - "1613b32919b40af412317649861b0eb20ce3f749338e0569aa0de7eff30e4733", - "17e14c5d1e65356daa5e33992742ff9d34e1f43d960729bfc1a18b1ef8599a10", - "62847da27e64db5a976aa44e8b324d1959abd8a1bd55245925c1d0c0bffdf0ea", - "305c9f9c6d5ba01e3658f922913a3617a9225ae32ead2e9fc8b0c1d7fdffc5b1", - "bd613a7c3329f1dde1a600e228d7b869dd9a0b1cead299166c9fc6c7c6d9b0a9", - "19c45cda300d01c477d68a75efe087e905e5bdcec7e9389444070da791c4cbf4", - "1b0d3e549431b2b7e054f3a01cb1bbac570b87652644d7102478559acd07d8eb", - "0d8d50019e9625915585ebbe04d8ccdca97fc4d2f58cd09457cc41964714e970", - "2851367e9b0cc28cec8e81093db1114f3d626a5bfffd25c32bf9ef18cd00a0f5", - "d05b867c8b77f9d3e1c17ead24c154d2b18aa74f343e05189d2c86e385035c94", - "520a869c60416c022da08e0e59672a0b07ae7bb8be53f766d45d60e5dd9367ae", - "e1d8b60aeb572878d783f74852b1fd4402cfe2466f5a3ebc3db2b33549d603e2", - "393c4cba73481b9b5e63ef1c5106597e600bd5ec5417599b3d27b1b6ff02a7cc", - "18e6801cb724655fbc5025d7dabae8a70faa1302bad123a4ac1e2e3d3d090979", - "348d52e7dfcf21b6258e29bd544ad0c808a80198def9897ce59a4c07acdd94dc", - "0ff2f2c87fec2151d576ed8d3bbd7f19b385414650880e7ac2bb9b0564631216", - "552b2c94b11bec2dc84da4b7158491101c01e27379c55571bb7c82784cacaec2", - "ecb0530feb305b86a5a5d15f4cacada07b0fa25ec925eb456e53e7f695443bb4", - "6c7557b1edc9d18da6bc0e139a79bd53c760c9372f68a2a63104611f0916116e", - "9c57f59ae0fa145a27bb79a935d49d7b9dca145484a28bcdaea80d3d9fdd5bc1", - "915df415767109ae84fe255dafe796b8ce885150b6f310ea2e675ce70e2b8afe", - "bc74abcc4641f63a7e5fd01c08d262170c2d4e44f095abb2f75463bbeb5fbd3a", - "983e0e7940b4ddd9a40f096e6cdde87adb617a48bf37295198890581a2effd57", - "2ac4cc5c44812e33b798ef2c5e7397392dacc257b2b8d30f57f0e280e049aec1", - "d4f42b45497ca66154665d0fa0c22ac750ff37af2acc425ceb875c3a70c3a9f4", - "4bdd648e71ed982d201968e998addf8d94975505247ab184629adcc9d36e186f", - "13f6f6b7e2786cc62b773351e0a3b8826d7c365a6f990a01bce6f6fc1a0d0995", - "4afaff58966d008131adfa3bdd3ff00c45fa03a6b02671f022e86d71cfc4907b", - "03acd2273de515513b568a5b7f280536ead075d4afcff73b44d2a005444c08c3", - "c3a8fbc49c7fba1c06ed1c1e257974c12baf408f2dd75cc90755ea2cb8254e95", - "e6d07c474c417a975a4148203373db72fc8046fce5eddcfc092d712998cf1f1b", - "208f69569437cb662d0b554d3aefef43f7fb9ff64027b5f9eecfb2726479bb55", - "e77d779ec5f62abc0f0bda6c48f38c08e1a48f326bb4088081d5e996282c4d54", - "508edfeff86d106ca0199cfde956b167be328d57e07f338d33572fe1080dae05", - "a92925ea18b57651f8e7d02f89951eba1ae1bb7e201e51520f42e70dfb6276a5", - "9e44175d7bd5c2e7af9b05f566a1da43feae954edaaa20c939de20f3fd416437", - "6ce6a002f01bea63d4dcb58c5eab655bdffaf1785728ef0181199d6e76f1d94d", - "ff3e95f5c1e0cc1225625e8956dcb94923c7e308ec016a3cd982643f5101694a", - "86d4a4235fa2fde2bd7a32c9faf18775e5c73f0f9b132b079c7f7237501409cc", - "5a56a3157bc2e16874e7a383293475d7d93e84c57b77b0a2198ae3062e2a3f1f", - "71a3319d7aa29b207dcb9eb725917515e99040997d3566d51bf8fe3215d09c99", - "52108d39f2e2aafe8df1f4db405044b7f706590ed60510d92b94faf7e6daecce", - "446e2f1434bdc228b4ab86f8f6a9e0e8cd388681e920b10c11be7bc113b36eb3", - "ccba7e70a38662dde7674977688d64784a5d4df4851ff96f20967a83042cab44", - "f0e0c5b69e849a0e025ef531ae4d0b2e45dee1d5ac77b9fcc2fbae55f98bf639", - "613ef0b78d29e0b21fdaa50de6308e3f36e71bbc859acb4126ece94a75d01565", - "3aedbb8d9bf0befbe694702b7870e4e5b543b5130cdebdae010e4b3ae366a3a7", - "f72c6032bcfcee69761ae7c2358c14551eba3b1ecac082fdca09c0941ce4d2c6", - "d77e703ab2820d13df456460a62002aa1ff99c99a235fbadc3059d824b18156f", - "888ad0c3ae5f17d0940c9cfe838a2b5c6432305f9c1f22bf57c071e1e2e901c9", - "880cec498ac04f9c539777b6a7314cd60697f922bf3d097360e96ece690a0cf6", - "5611dddca07b31942f61eb649f1260581fe0fd5329bf83793e3b190434a9d4fa", - "79b6d30ad531cf01f0c76d3b4e0c98895c14709072bdd00394392e189a5c25c5", - "00c389cc3978639f94001a409420d09016f38481ed3c9df2241acb178ebde9fc", - "f8ef9dbbf5555b7a908426d53785f88ea54abdce26fb6001904a17406f77057a", - "f44bce0e144aeec5927eb680e5ed4138faa82e4dc60e85e96da8b3804ac4ad02", - "997f9aa1ab54ce11416e27f593474fa780ae2e5c2942e3421ed09fd2f72ebaa3", - "9cc3b482c2ca38d674ce0f6fde82ce0a28cb9c20c94d54fdd18a63d14ec840c6", - "d8e5387c7d2a7db5d87a1cc0971f840f65539219aca7cd0986c1feaf1cfcf1bd", - "dedcbe165c3856aa190de791f1b573c82f14a45164f6b19fba1bde7b3b01688b", - "cfe79eac95d02a969f4e5225042cebea7d77aa6102bf1d141529d3042685a13f", - "91fe444a4c57b21828efe95f8314f947bb4301a12b9e2bc4b8fc12df4d913453", - "97be74f3a09256514cdec92118b19e7b9ddd71b23819cb811dd0b2ea5878c2d1", - "90a38871cd12ee304a87e79aad63c57b0f94bafad29c442124dfdc10233281c4", - "7f54f8e6498382528d4f3d21de066b20dd2cf8ef6745ca9d58ba35e5e3b3da71", - "bbadfac6983603c35c48f2e147b052139bf571627b4536d49bc14e012cc427ce", - "a15b964e5f96bdd7afa311d9d94b1fed8b8b0a7eb3b9d580625ffd126812fbd4", - "84778b1054a5c1a7e9e5ce644c36612043e79f5b56ac6c2f10d10ec3230741bc", - "d41ad43078f88a5a2de7475eec1e2be5b731f008dd14393c81f50dae50e09942", - "8a83d078a1ee766161f4725b2a19056436879a70bb904678696ea597675f00c1", - "295dd9bb80d1b48c79ef4ae0528847f54cbc76a02b4a58da45e0e7b089db167f", - "34ca81e7adcb180f9d19640e7ca46d56f92b4d521816134fa5463e30ca15134b", - "35a15cd8330d767bc1db44369b2f7f9705982fd4dcb5e97e32c47ea8f4c84fc5", - "15beda60cfa2ade3dda47fb9869d25d842284d735864ad9494b892d19391b3b4", - "1e7062df7488271eb31bc50fb50a38d1a95126151c7e5e8593b19b1aa880d851", - "78fc83f7d629400c1f45d0ebd861a2b7d1ca420095b4e4e1a186d5cbf544fd8f", - "a2a8273cd8d65d556a990db181c9dfd24a72166eb92a3b30f7ce094e23c81280", - "15637ed79e79c17fa933009b1bf50bfa14862296492454d53ea4595ac0d1aa79", - "d7dc2704b8b11603899e1165340ee34e310609e70131f036476f105f015d466c", - "f843b3892569fe12f44b2cb40e39abb62fa652bde1fb10af5586a42b1bdb049a", - "632e0e4bbc60c68102ad6cc77dc444ebf6ef06b3036d3c31ec4915f8c8409688", - "6bc72ba397a8c81ecb3e4ec3db5929bde84ff59f8712783620359e23fdab445b", - "48493e01afc6e878012620a09c7da518b5b24779a9a5d48d2b3301ba8e0e958c", - "ba459b54ed3cd369f286f8904f43a273e6b21a7e02b531882978528a667e4872", - "22896294a46317a81634315eb952ea84776d5f2663e53156cc19e1e9e9c5aa2f", - "f3adfa40edbbb0e74d010c9aaab13e63d8d2898a1469b9ee4f8a4bfd5fbc24df", - "6bd204749117305700593e13b2189f2f9562dc5ab75f28867fb246d74bbaa0b9", - "75fd61f563f17625602efa34b54d6c7eb806d13b13d01c280810b14c1a3287b1", - "2d55e4c8e35eea78c2b24fb7112956b20beb41ade6fe64ca153094d42811ca1d", - "d9d7ea3d5581d743125f7b74b9b5563c53c4f6e4d712700f34d87e78074699b2", - "7fae669e5cb999a0e007eb371aaef1567ae7236794f8e31d7d45a1c9ccc4eb1a", - "59711f9de370d491c6c4e559cf3593a0e065045920aed8684c2d2e9f376372a1", - "38b868490eab521ea0835a06bc8228b231651f1471d2dd59fe4e4f3d45716e8e", - "79dced7cbf11d4e6d25a860e30aaef3dd903b258c17fdcf003aad3179e1a84dc", - "5bc4820165574f418a9d0f25ae45573e3ffe8bc76ba6d361832343cffc1404fb", - "2c4c05ab8e6aba288a154e08545d03183c13ff602fdada4a7dff7a77b97e67ed", - "9ea46bc99856abf07917871638b49ec9378f36dab56b1d689cc6b00c46a351b6", - "1e1b966db24453163969b310a654bcaf93b0248156099fef59117d0ae7bbceb1", - "a8be5f875958d638579ef49e7fa1d3e19233563474a368ea6ed5dd1414771936", - "0385a47013fe57a5922d1de642d57a4e270eee371052b28e5f100290f073d4ea", - "56191fdd0fd6171c435e5f37fcc5d4335fbf61cc382883dd04438fea9e5ae458", - "d0cedc383a03558280b643ac0ae9f9376e10b892eacd730ccd7e40086a850e48", - "4c626890751490fe10480132fab6154f4a192ad60c238a57af274173e8372229", - "b70498ab920f5dbdd85fddff8b6d94a9a62d5aabfa7956d5d8f5ef4aaa7fc095", - "b7a4148b9643b789479c1eaeb037a54a79a44901815f5d5fa8899bd61547c3b7", - "05428ec8ed18e2da1c392dc84a6b29be2c463b05b6ab8563a945257c16d882c7", - "101a9db5dd6267ed0d9d130c9d7c68e23a4a13640aac29ee8be59bfcb4f53534", - "f948087b8554351b0c6ce1d46dc8e974fc9ed4587820582fdcecf99ee6729a42", - "9055890e9a27885bc7633e6267d822aff02a01734afaf396a0873e4cd63e22c4", - "8819904adb34d635bf78e40acfde51642bf9a903b55bb0cd15eb34d907120a25", - "4d6c00372492b01d3f8c934990e0ba86edb5430464a93aa2a63bd29e32dd57a3", - "8aa6d49f88d8a4beb6485c5d96d56e8ebe40ab360fface3858b963afb749cb32", - "59af7d14f376baa7aea6e94e17d957683484fbfdca7f79667df0ef16918d3f2e", - "8c0e55cf6d8a1bb8a331dc6482189fe36deefe2ef6c16f2d972c2738db93d03f", - "e3502f9785473db5403402cc4da723c4e3f1dd121ca856b231cf7b99d5b29db6", - "8dba9514ac0736f67d41dbc318e400d3ef7bb4b828f745ddc3f8d78423064ed4", - "0b6b4c7f8d7f003895e6837c90fc01ef728021883636378cd70988178b5cc7d2", - "efc346af4411939a6c5995dcea93a22b216453d5ad4a65e780fb2874aba529f1", - "93e85e7c232e6f95201b59a31cf8355b4076d71eb0f7c9530922f100decb84e7", - "a76a1b4407dcbeb89c2c8ed2d125ff2ad962661f56b4eef4c278190e44a8a386", - "ac9582810ef44f00a3adeafebec9d421baddf5a8638ae4ad55ef9e52af68117c", - "b6b49747b3da038af6d691faa9e6892cab18930647c1c901d1e78126d2b33ee0", - "040d2e3e4f15810ad1a0131f033e1a4937120b1df5bd4823e5ce13c29c83d0d7", - "1f5fc2f615f4c35bf722cbf6b0c8fbc1d4885bb202d237f92f6a8e3524837a1a", - "9cf7ea842e15c7e6539690a7a2a15e8bcef553c737871eb36d7b0bc4356dd485", - "ea728d935561d1326d2b7ac23012c828b1debc3eaecc092fdafb39784fcb8e8d", - "809d2481100b342713ce7fbfc7eb76ffdcb0ff9974cb41d787bbf93ad7866063", - "3a71b2e1f2ec516114e119191bd414c42ba4c0564e5b704f94235db6b05bb354", - "514dc96e58dae15c662b58c3c0287f97cc733ea7773a083f3bafc192923a492a", - "854f1bbc99c3fee65d3d4f8721812baf9418e7d27e7497b67184d83b2c2bd5d5", - "20ab853a676eb7cdeb895ce33492628ea28e30d12c4dd06b5d1f23745f435d9e", - "e165365f35a52d6c2fe66b1b06a6122084c44983a654ab5428f98d3b839745de", - "2f03cd828a76d3dfefb2a1f7cb69fbea7d4e7c63435184965ba50bf58af22c4e", - "8f02a083fb51d577853022ef0ab4eaad31c52a897d26b2f90370022d88f0783f", - "2ac612312633520507ee0ea9484422fc1c8839a7b4ce91ce13d77b16ab2467b5", - "bc0ef735155f0f680af2f8a9a0346ed0548da85e2659d2e8d8ae5eef674effe9", - "ce11c6fe0820da083409818627992ac698a9a8ab66f2301747a73c401eb721d8", - "8306b7a50876a16c961050c0ac1add2e570a8466aac8a3b4bceebe0d4e3137f6", - "4c95903c3c23f67234de684cdff6a59a2faf51b93da99a5544cd40481bd736af", - "8cbac3d43d4c190888aae6a7a0d9e2f6949f85f5d1bec738f8e32c187fd281f2", - "392e5f4c59e7ee524dd91b43d7eeb70a52c54fb091a7eb3549a8a1dfcb32634c", - "66b40f025ee1b5cdf852b0976272d6505d4597db300f03a432eae659b1edbbbb", - "f5b3f2f2eaf61f6a831d8f467c280ca3b716bef07c634a610f76018f5520a840", - "3ddff4ea7cf357d4b6541a221f36a779e07fd54786db70aae4805498ff59e616", - "48bc992f218b1540a951864e10021df0f60391b96eb1e5a4c53e90d0fb68b9b7", - "bb468f007d327538be6889d8cf98ba5a5d97b94567fde475cbd3a37bc3087853", - "7e5864184828c90c7083f68b676db5d5e7404a308cceb75b92033f11065d6fb5", - "877ff0e81dce184812ae3142ab3c892b019e4b1ca3cfbb69744c8ab47ab11661", - "e383d131da48fc8bd239285f6f03cf0c90a360dae835d59bc9747d6c1423b8ab", - "0bd85f9fbef2d3184ed76bd6595c8e756ce03fe3a9369d88c69a25458f6ad05a", - "c6749c08f636b9e0999331be0b0f9fbd4807adea68c2097a2e5a098ece89a125", - "fb571c925b3b0bb4e1d8ebab2a1c855ebab9da07136bc21d1d038fe1f898149b", - "a7e8de6e1878c824a2b95395f57e087f3a6fb5f2f1315145ec367d7873b9838c", - "e718537b9318519b332056259dbd47c9502213037f42fb6d4f0fd4a61cdb6fbc", - "24129c2debbf3e5fbe0eb0ff72fd4554cd75aaa233292729d75b6dac28385ca8", - "577e1de44f8767e29151dd661aa4dce8f159d2472f22f20841e641e185c6c944", - "9cd9ef666a876bd626f2d854ba365756b27be147b6229976ac0325ef076ac91a", - "0e1cb286f1268a3715beb0ee2505bd2589c691023dbef5dbe6db20573a4c015d", - "a03a8fe0c9ac402e58e28680175ad15e753382772b2eb7ea1b71b22b0da5089b", - "2d47dd3539162e02b92c06f11c5eb413550f438c5457bd452faa1846db20bcbd", - "d7496a7d5000a9cfea0a23a1724885c72be1a8d5d3e659bf24f2dcd6d2b83021", - "df157d8d07e9fea09b63782b3b5044c79376ba57d7df258b68f1291ad24a4d30", - "9e924b404c8a238f3b28663822a68538ccd1ca00b080f264d31dfb20ea484dff", - "9801f13c299dd1d783cc04df80b92f3547ce507c8c6a84a1d5348884582803f0", - "012323407c96ee4d9380ed05c4e80ea44d85ac3a539a3a13817a0a45e8f463f9", - "4268265c41de73c73e0b0025db8a4080afc0f628d5129f45eb1330ce5cb62b58", - "5038b4b8998e848bc4a2ec4168f516e1c2c85bf1fb5ed3bd5d22aad8664845e0", - "1eae0ac74985e82bcb10c656b7ae2ec09891acb09137dafd2cf86771dbb7d469", - "bee6c7a18ea4afdc0b1d96d476d6ba326b43bbb29222bc9345d5bc13ce632d3d", - "fb2657e3bc55aca55f0ec8a77c2608db9e0944c31b5944eb4d0fb69a2eb7f212", - "2bb58d7c0b3a0b23cfe0db7d3b30de6d6f8b171ff39e4ef2068c973412b760be", - "543d9fb52f590b587d0fb64c288e2c1fc6a5f39789345efed7d0ee72947744d3", - "d8bfe6b5b0da565fd4ef3661c40d19daf0dd0be4318ae67974b4b845d485434b", - "2fd1b9c59fd60b12a52b7b907c2dbcbdfba94526befc7116c8b3d206e38d0eb2", - "cf866e81164efd75a09368cab2754ebcf289ac0136f7b20b14291e4ab03e8883", - "2957d86e0ea866809fdacc9d3d696c4bf103ae4ddbe5a6a260dd8d8ee1110286", - "35bac09890e58f023101ce2133d508c903116f0157bed03d52098c07fb445bff", - "35b4de8dfbf2205c9589e869f7ab8aad9ee0a832306d186b2332522e3ae66094", - "7478b6c5f39738cf035b1de92d26281b07ea870124c4b2edd50366d700ff9f8d", - "73d39528d6d021ab73315f534ffe35182950c9f4b176689d45eab9286e1c1031", - "1b1daa52a65cda953f4d82e3aa90b69ec58e32c38ba0cdc65c94fe1ee28200cd", - "7e7406538256c65afe7c9e640476120a34d344fb4d6f530f6e1f7d96ec2c811d", - "85a85545d7a1a08b215b0679785ed4dab8acaa85729e498cd0a27570efbdf87d", - "a402dcb5d7f638814b8c18b556d7335829b25af09bb1a8859d325dc6666a0ea8", - "1115fa157062d6cd47c070ac6cf30db35531b5cbf36b5a6c69e049d0f43525e6", - "8a803869ae0c67777e6ff2aa7f13a884132814a3a21fe531bc9f1352ceea84a3", - "578c2d668e606c23709ab4f6e1b80481fc4ab4a24b9908a742d1d26dce3cf1fa", - "3bfc81301b6ad334b371e829b6861c3c0027214f2470d7e308fa71d7e20e4fea", - "500a538fe2ddc194a78386cf3be06038db4f1f5bee9ec309414b7829d224cf8b", - "ab962b6f9f8462718f5daa51ae5f501fe5a2d568c363f8c6e7464c1818caf59e", - "b9a5bc5f1e4bab3165bf259c31ce6a07df71df30892628000bb8639cecc73448", - "f1b0261fe2f39020f2fd848b5b02c56a58479d65dcfcf68a33bc5f20a56ac869", - "9e70a5b74b1153f231d0597bad60471219fe3cb7cf0db9759fdf13a30fd9e928", - "d4fa99caefeb6fbc689fa34724292400a30407c446394d2acd2c8e42418988d0", - "b6b0ea0a47d923a31cc8fb581e719ea1a97d0aa1a370bd77db071dbf2ab01a6a", - "becccd9cbc26ea36d7f79dccc05fd14b00d739170c58b28063d3a2d6382eb61b", - "bd49aea9087a4fdd4a0c0e36b2f8798f85ef635613bee48a80e821fb0b502dbd", - "ff7607d5e06a13dec7aaa5f285404c159fa0ab3965ee65093eeca37003c5f40a", - "ee87432f65cf5f446845ee4018596906285c81bc62bb30cce7fa72f90ed1dfef", - "0d91df99c491b182c386c5c1522c615c0a2d41d47e7c4919bd19caa0a727f97d", - "8f003b4c21a5a8b92ccea4751683ae99f705a28708a299f38fbb89b27302eeb9", - "1c72397976c4d6cd33b2db0052808008b48bb0e8e2fbf5d4fe24bd1e143860f4", - "7d66fb11cc300277a1f229c1561b8063c53bd1308b53632f103ff43db7a13689", - "474ec23d239e5cf312010be50d85fda5d26b31f8fc1a8dca980519d9ffc78c75", - "ee3d09d57778c7158ecf44fe1bf7582595fecc35f442f3d661b2184cc3fcb754", - "998ef3b883177e85704ca3af0debf4ce082306e8ab16c0640de7d17a2e0e2906", - "0ad7e3a96b501bbd8cae71f8a85c66cdd2d007c910c41d507076c3367f9706d7", - "c55eeeb91983cd21a26fb2bd13cdbbeb9c78c5eb410c835852b87ed5999c59c8", - "2357427f512a12788433f4c0c63048b03fa087aa65e8aec68965e23cc3b8bdc5", - "069b2c5d0a7229aa96949934daf7549aa215e8f32b8c4ab910edfe6e4edb9e8b", - "3b6b9822bad072b4d0c7fb28d9720c1525b35479573ead3581ea6f217d941f0f", - "3ba290043eedb589d183a93bc3b44ef2c2f6d9a9acc5045f1727080e20672ff3", - "58cea130aab793090af8730b7e8205be16dea7e4a74e27220c2d58568858ec9e", - "f56a7e7ac8222806cf6dea48f0abc6bb0b47291e7736323855845e7d3f633e6e", - "d1f4edd83a89c86fc659f91b1d7f5981ee7f7907683ca2c1d824ed2750ce78f7", - "6780e90054221bcc89f01eb867de3e087f084430ce309b22e4a169c0ba79f5a7", - "aff2966bc150275f985c4e0837b193f899d5bc5c0293af9c735ce031f70b12cd", - "1d9250b83546120a7de0a9768e35c28b70607b7e07bea0b80f11a2282067849f", - "09255bbc963fae56c5e0d0af09bce2c613b367d6f7912be02558d9c996b754f2", - "2bed12408e3f2befa07ad971da000325c893ad4a74596ce03a0c0f8e6ece7019", - "b2e311d67e73ea2138daefedcf9deb8c123827a331d1089e38234185dc027cc0", - "fa9a79396c50c991a0cfe3be5ec6afc46cc74b4627b8e1b1cc246c4656c7d1d5", - "b09b0e0372b67e616b02003acdeb061b4ec86d21668e83aa6d3c2e6b974ecdb7", - "f5ac43655594219e003a42ffaa6034d897626c768eb71ce26d76842c76dab6be", - "236d47f0f34ae1ad3680eb0812dcc90965dbe33660585f6190a817fed2328408", - "2c7adf799257e30d9e13fa00c04fc962f4a0677c2c0b13caa3f28a97ff2e70fc", - "91d3d8298e9c9c7f51989942c207bef54652358153bee50ed41bcff130948f11", - "3a9bb4a74afd2594dc18498830ccc9c8eff3bbafcf661cd9f83f10c841434a2c", - "890002245abf9b4b9ba8717a76215e041d3a1f68baad4a9ac8fd27ae1fc7e62e", - "9e7c99c56322072e9f9e595dcc562cf55bd44edcf95e167df57fc2e18dbe24dd", - "ae801a35c4d39057aa5684421f958caf898ea0abee7cbd26cd0105e984f30d08", - "33de5bea768943383eb2f721028d4140427a9c71f6d632781fedc6029ae28b4d", - "d425cd0de3d40719b74936b6d9d90901b901e3050d9a425dc37c5773b8e67937", - "30f348106200e6d7836d310947334caa28970b9d6ee6a24d9c14aed70e0ce394", - "d8f5f56e3e1d3be23fbaab0c96cf3444b643a3b62c913ee2f3cdf33e07314e79", - "f26ea1242e7a58144e5e292594df381b0c03cf58a54f8fb47ee9ef8db65b2923", - "cc0f51270302dbf31e8b2029f70a3acfd4461f871dffdb6acc187042e81e7f3c", - "bfac2ffe2caf39ba2fd1491c1b745d18698f0d4693080aa3dfb92ea977869970", - "2a2594e2eaa8d85077e6f5c23839c849597deaf401214b3fa2203ef8e7f7f303", - "830267c9603ae76fce44059287d2c2c05b7adbc6485e2da7a1619b0d2abe5c4b", - "5749b0efb00f0b602007297c8af5cdc5938f0a5e612d757474da08c22969e2da", - "1e54f52e79404e2279cf14a7aaa0d9346f3526b6b52d2f4ca74b5b78257bd6fa", - "98f00aa391bb45d8bb0e35aa66b465a711396cffa32eb03b11e4d11a63f5ee77", - "e4a776594832b3147e8e32c26849ba43a8c11cc85267e6ccd4207359d5db93a8", - "3b97b93f470904aeb0e675deab0df56909a03a8f96114a32e6b19eb81464dbbe", - "87dd36f1e79ee01c2deac028a0c1662d6e845167aaeeb3455e7e7058b7b631a3", - "26c869193ded9cdcf8ae974006ded5527058abd526f205920e3080df5297e11f", - "052cbaa2515cc0b091db69c7f6573ff371db5da984f456ac1f5738ae9d57fd3d", - "17b7411c61fbbda0c0f7074d6e778f307a6fbc26a1cc2b09b3d8ec89eb3a5a85", - "c5b53cee348f4f16dafc9bb7ed5745ca30ba4f5c4eadda6ed4ec9e4622c89276", - "4fee96f286ed1f490517d72d0199a4e638840ddf8ac400a7d71f1e0242432ca2", - "e47789f36a54db19fcddd2e9ebc67d697a258a3a2f1534c5686a2275ad42b24c", - "cb7cf4fb5a19bd38d0edf735bd436774aebf7213acbcc3c708a8b69b968fcec6", - "8f111fdf104dca3c2b2929ce2a6e8c61a98f0c37a3d0a9ca7e068e8c35006aa9", - "8a813319322cda90da49b6729bf76a68746e404882bd2d9f126d3fdcef54961b", - "dfafec0d7209928334b21bc95311574bc9d6834168b2ca492bc9a18213854367", - "144e21f2f6fede741f60d08344045cbe52aa7674f7ca2b960c92e32c3d0bc00e", - "370d557785cf315d99e1165d677e8e8591f4381a6467b191a4cb3ad84a2bbfb5", - "a403e64378c76387994e6f968879b4d80b798f99a8fdb7712ef64078cc894c28", - "77bbf3cec3af4c1acce27f4ae040429ece48cfdf2d6d69c34b485cbbcfba57ef", - "a4bb467e2e2b43f76fdbb841efdf93ba900d8343c74525aab103bbaadd3e5ef3", - "69cf56093bbcf6315b0fa31d2c0d0d96ed143db53b7d5f858e5142ec77062185", - "a3be4e2bd606154c5f2f8b1d98f9cb2aa59267120c43840d952e8e0e54eae54f", - "7b5cf7c7d1b152b6abaaf2f36d69ec71186662e1eae39f8bf7ebcc6345e73de4", - "75c1d958b2985c8b4d1bfe111ca71ad96a511dfe27f893481ee82872efd72368", - "29fa39c3cbe1b8338aa201ed100be1d673b89bdaf19d70dd0bdc2153b3c407ef", - "f2b0699310b64a1864a08a68ff4994a10c26cb6eb1399c1a0ecf210ed496757c", - "cd7bc149ef397f1fca31aa82c5ed265605fc4fbf6f6858b2f8e41b7b3ac3bfc4", - "9a29df835f2b6722de163fc9e7f5298fe0470e217e3aa8a2b07c75433755abe2", - "ef3e224b2e3aea6e44bf2c2761fc9e1bb383abaa27eb293990662d161a5c9977", - "6fb65bec75fc443e3e159a184810fc5cb46bf30e0d64555f16c25f0f6b565631", - "4110bfaf681c53eb4eca0d1615055fecf7ff4ff0920edee27224880b6c4e9b8d", - "b2bc29515afffaca802248f3a409029a28e9c7503bbd346d7b3347f26a82d8be", - "c4abfefbcffc82aabd0df3348013c990e9331dd2f8a8c8a3b0587e6043ecdc7b", - "f6c3d658c72f246370387fed5af6e97713bc3c1a8de075970928780a12b3d025", - "d01a12233f0bf82d640b32603bdb62bcc5733abc71dbc9db5b93c1e0bad52ad8", - "59a6968cf3564db35cd2b7a52043b81548de82e194b08f29bdea7e2e619c06d3", - "f42a24596ad7ec75d731c0890bcabfa1f44f51924954e9d9f649964d74577b40", - "85aaf5afcfa62521a59cbb4d6ccec8881b53b1684a6c21e410606ca5b9b4dc16", - "dd8af731e019b28370f858c2c368b405412100ce67981506a0190d528c87c879", - "592bd2f0b3aa95b97ece89d3e7c375a56feac530c438ccb1606f2b5f37e68991", - "7ef417094c431ee2718d9aeace9c708e38d58b29b32ecb1ad0f19a68d9864bde", - "697f17dabe1704e2c434c4f7726454336f1b6a5631abb8bc7c48df540ff87488", - "11634a9b9744dd74497fc43d9b07971ee8f0bf81f6e4e972211ba07e8fc36ae4", - "fb162c86ed1aa78d5c5b39374c996de9f44bb17dc2a14ce953ddef680c4dc53b", - "347ee9db4695e65be6c0f51c145f8b5007f2dcea0645919c707211b2b3526334", - "5af8d372021def2af0d6310e5cf19033e22bc2393b0819de22bce2806dae4dfe", - "06572ce0f160eebac1de1fd28824c5cc8e8e85a29efe8df73e662d4088144734", - "28ff406e16f59b58f62b6d4320d017875bd42b92090767c604b5156d5b98cce1", - "f804a5b997b23a2be40e548eea0d44a76bf6a322dacd0ae5fbac79bfedde92c0", - "e77c9947d8e19b68da25207a76fedf8a66af2013b72baa994c0f773a04c37e1a", - "d49c7f911dba8b73676840389e9d93977272dba9354218759ad1254897676ef9", - "0e75c994f275a30801c70c13ed5a5bcae0747760d214d9016eeda488a9ac6203", - "ab1c5b81135a21831388371c079b09bcc43b5cd58244c0f6a1025d5008b3178c", - "7cef2683f34ae8db949016371aaa513bd5a15b75c1c30171dee07c6fbbabc7a6", - "a33805ed0de7a235058123c51b3452fb810ce63541a7deda94b4f47862cb6bfe", - "2d4caf19372f29d0b5bb53184d6d798fc461865f4066251304998fce24e800c3", - "4b25e72779a05ff1dca3db3a77bc9ed717e63d1ab81cfaf7e753f06e8c55f354", - "ef5dee40ec8a491e07d06da81aef3e2074b18bede88bfb9d5497626497aea147", - "3ea225465ae6ff4145762e22e53af374f7bb8b34d9a396687a976c47e16c832b", - "90eb5f82cc341517fb1b603d3813815b8ca9ebeb1944b2d914ecfb32469a1bdf", - "507ce22120763400880022eba7daf0a4f3ac369c61dd9ff10caa4452b5c20b4c", - "b6c4ce3684d0ab7cb027555184af11e6f88dd4ce799c5072c154f44b37669843", - "09bb1527f9c9ac075d24ee3d31f1c93ab92f9b5726c40258cc84d7a68371eec4", - "882d2750d7bae1281e670653c10e733bb0679d26728bc69c2b4c146156bcc854", - "dba601ccb1379da679c3d90a19fdf8a17588a59148f889cc09e798e097fed5f0", - "e32291c03fea33dc31ecce2a6e6f9d18d8fc45bbecde2eaff552bfff671a505e", - "1d833173e6deea2f1ee574723464df15959afdbdca1ba3e804b614a05159de20", - "f71d6ee18e31dd10a4bc77439754087ea96a9665a8f38969ccd86ee9cd3ee27d", - "d18682b64700cbce904161a27f4b60f35d0d535332fb977cc4e7ddb5e47b0388", - "264e520db92ef6c6cb7cc08fff8d32c1a395cc138f8a28c18cbc98e248e97dad", - "ef55ffef2cdda2e07c1959a2b7b4accb24bf8ce93c8d512b8514273b0e025d9f", - "7d7649ca40c066c541eea687ec5ffadaa3314b6a0bc1e2479f1ffe145b514063", - "7752d4f17ab4631e2f3b47fa7f17b54d8ce41e36dc9e5028d2e5454d39e8e9e5", - "f35f5cd192a7528244d550954632e132fed6a122aa4ce83c81ec9a7707f35bf1", - "607fd2e4a42627cef689a49d1e4763d28efcd775f193e740d92090ef2c55b8b6", - "7321a38c3eaf190f71d9f40f54fbe24cc5bdb1824c04eeeb17061e629f7b1c09", - "df3bdf7e48593950da0f6e3d669336b80e172a364ab1e410555db6d235fb4f3c", - "417b5fc804ba147c3432711f4686a0e5c05a375bba13230b67813f58da0e6e3b", - "11a7bf060136dde2dcab65d628028cdde51bdbb5373a8d67e2379e8772031968", - "42e0a59633ac55006a8ce635ba249bed12c72c6e44ba4de8cebbed3458ab6a9b", - "df3d40b1e4cd97f6545e4ff6e94c44063eab2f43e3fde550080b7aa58e37fad5", - "3e36495dcc5a87826db3bbc2cbac0d673727058eeddea373db00fc6086ee0ccd", - "1967765cccb80e563212f7e54935089ac6699f23181112a74bbdd13bb687deef", - "714b29a843a7b65918bfa04249f6b0a025eaa06928c16338b04f50d1bf78001a", - "16fa525dab012178aa5281ea829d2d5a6fb38eb3270899ba5a76f6638f0fd20a", - "f2bbce8c09a041113513749490b18a4a71d0445deece3040ecf196a9bc52536e", - "61b85843f3d9c74e58f62e860a6daa8c7cbed8b17fff70ccb6418e47275e7207", - "6ab4f06b4ba591bda15263f1ffccb2d7ae323c07ad8b9fd2f558b8c0c1519807", - "562d1bbec88ba3ae8b9a4e895a6423b61bf3276e63066b6b57c5b039a91c952d", - "fe247f7b4d2648e8055ffcda064483874e86b0110c796e033602a26e790dad37", - "33299a23a303c9214319ab62a051e008296418f5f510873d03571f0bfbd505ec", - "79f9b8ae319537d3b11cd2a2208118028fa234eda345872f6f95dc26b230ba9a", - "23ecdccb6c8375e49a1795a9bcb99387fbb0a339138d45162281557fe7b143b5", - "d17a616eab2fa2cb7f782e83183bc68b6f6b63ddb3f62d30ce3106b7aa35dcd8", - "7df0361f07622ad970d1e46af6e7aaab466f776ef58206afe5ed5b71dff6c6fb", - "5417b0760ab784d7c12ac6758648b1daa6737d6e239d853f03f357a8845bccc8", - "de9dbcd9b4ed515aa4dd975a00516f8a8b15934329877473ed0a8edee7d7ac8b", - "b40510b71441d92cd56a75f81564e13e7ab6187bbb69b4eb2d3e01bc592dc731", - "b4eaa16041f75bd9400b2de86ebf81a86b0cd82047c1186bf4b29bc3a9d23cf8", - "d6f7290417a45e2ee91af2998651591d8ad1d2944c1f98a86efbaed732258bff", - "4cb60cd3b0121408f7d8e712ee443446c643451d134b229129922afafc766dc9", - "b9934d8c11b59ea6ea6dbf950e74943cc484ddfb0e442d3346435e25be81dce1", - "a43f3c5f58ecb0915cb69950bd39dc7b6bc06f53278bccadf1b1bc7cc7c67edd", - "e695243f19f82f15e73d273f8c0112fdfb75ac467f5b147080d57d019836406e", - "0d61fb845bd3d6811ba8e06044711b6225fe2d458c1b35e76cb3d73a5e5de156", - "d8ad3d69c7462635c290aa0911fd8aaf679c515fb13a9298b72fc09ee214b64c", - "79e503c07c610d877e84f92d07ad963c5d2394b11548ba172b1596b45b531d66", - "3b80de36ffeb574125784f9d7403a19eae5a34c0b68eb42bcfa8873eac623cb5", - "9a1c0e09bb695c4ed6ab740c53904285d18b2cabbfb0911e92ae74e9725d24d7", - "c3abd23c32f8a33b2cd3c3eec488878218da8a68d6a68cb0e08b42365ddf1a52", - "903393543bc2aecac36d1f7e6539d01576b2df12b966ad53a862722d123d3f06", - "f6d5ed9458c9e656f10e54b960d031a5b8d2fba3bbf0fc0c3a1efe20a8c2cb07", - "c6ebbc0de562903c0330ebdc0a4f748f9ceef8d9d260fa3fa42ef95133e84598", - "fa23991ca80e1765536e9fff6efef28fca6535b7beb3c9f9e8cba1b7a5e8eb86", - "2404dd368c035a19820c810e6dff10a6c7b6de2aa01e5d4b66a74b62b68442de", - "1b092d2a80b97840c7c7b1abcac1494dc0bbfc6b13ff9bc85cd1e2b821daa97c", - "2145d1e854938d5bc2997f6174264e7e21fa505a58060a2e1d966bc786470477", - "b9599f8a5459913ec8296d2331b5381415c893491c90b4ce183d6335b2a43fc7", - "056bcf954a24159a0e971b2d4826f531f7a645ba0dc12cb529a359e194150df3", - "8187c00e84808793b2a4ffed9c5782ac5d2537e13343a7b7353374a0db5c40c1", - "5ab98e6d3a745d5585ae9792f3614019aaf780ec9c6b3918ee16c963a81119e8", - "03b9f77fb466f2a1f1302feaf60e0fc402d533f44618cff1144d6b95ba6c22cd", - "09f8e8d6a52b2041fa3761aab6b4f362a996b3cb394af25d54afcced803ac99b", - "72a24d09000125edf331cd4267bee5b6d14b96c0e6c98484311cbd2afec7fb19", - "7a506d9c2762d245f30e349f6ab01eb0b0095ffc73e98b2f5e69c3b9a044aac0", - "c7e08d57256ae8e1477bbd8234ec4fbda4173977d636a2979ecfc73b3ba914fa", - "c8dc1e223dfd6f55abfb2871694573498417228e36dda3f8267164104c3f12e4", - "74a135eaccf4a0d079e78fa31ccb0b36e13f9e2a2b797772e137fadcb54294d8", - "79c899c3c2623a273592822075100aeaa9bd6e29f0ab801374e831104fd87d94", - "443d631a88b4e9142fdac468d75bd0e35831dfe9bb6696b9fa729a27257566d1", - "1deb3f24e96a4c57f6871933173428a5954b7be8f34aaa69975576129d289f3b", - "52bfcc5d9c6f687e679ece65a6faa0a5f18f4c046630295f724cfe02b3ae819b", - "c8fc89bbecccc38f4a5d3b280cfa43ee2ec7054eb8e3ffc2a691776ad77039cb", - "ec8e9fac9fdf46289e9620a556123aaf0ee6ef134a16ce121a968ed81f7cee29", - "2ee80a0f5e0a8a4e265b0cec501fe152f05a65baf96568095dc5b60f6a845c9d", - "3adb6cfa4b3dba5459425726206ff68f1b570c17e2c95a6482eaf6eedfc0d90a", - "ef6737d23f89541387e045ebb6cc2ce221a69ea5fb69443e739c1a53ba163f99", - "cb925bccae4ae5f130529c22f1e6d753531d6e2b0bfc5ae8b20b4877a929a77b", - "d56acb66ccc67a7f7fd86339bddc7dd5dac7ad074f88a9ec258da3a1f3ac1c3b", - "f4a865ad6abb6b0a175c313090b324c59cde5ef8bdc2e5e6778f59cc03c47b1d", - "63fec43cc4e14be18573a0e74a85fe89743f7ad16c5691cde99a4a755cf16d43", - "e5bab9e2e6fa17382423e386d36416d4be18fff58a7e4b38b062ec71a3d2a854", - "f101ef32166102b9d2ccfb1011bdcd178f5b64d7c850aeff73c9169b114fb345", - "1d2ae46adca29b7b81f3fcb30b64e7a8ed4365f7ad3a4ec6fd4b68579ddac7de", - "f75ad6cb026f1da964749f7f1989ead0ca32c4a36853048ee2af2b797a3d3810", - "0b5d96c35e22b7489482ef4b821c2ac8f74959ddd293ebfa015785e03ba9b190", - "372310720f86ad1f26cda28e0d0ac69e1fcec2537236e6b4b1967852f54a2e3a", - "dd0634a899b21a20e4fc3a48cb619786a3f4caf9daace7f3a0e22b0bad9d5306", - "c30b7f78f9a73e9e8113d04cc7d1a17b311c5c0c66d65bafeaf2c8955aa5b10b", - "bc7cc531857995c67cd555875db6b9799a84ec6c585443b047053ff957308cfe", - "8aeb2039f5a47451d1a7fc32cb41e577e75575ef0c638ed89f3c2e3663e8bb03", - "9d7d6c0463841b21804ccde8c9b0d405d2247b79f9dcd67643fc58490e39410c", - "737e64a582dbf045cbc67b5794f05b884681d22516dcc43ecc3491f422a078bc", - "0ef2aebaf3c2fbd54e649d75114f3c117a23bb94271941e11009bd54252105bd", - "e82851d13e3fba6e3807672b9958c0bd8dd5c91cae581d815a31f4fe99420c4e", - "e34f758015167210cdaa5d03e25d14d5f71026675937912b01c2090bac51c91d", - "c801fe57a6e96a5b379e46bdae49299e11faeccb1f27ea3e31f988fdbb03f368", - "90a512cbf70969e04a90cbdf80261f08723e9c4df2795c4fed79b7c625af5e79", - "ec937a3c69cc74c4d9efe44736cab13ede7e5627877874420a5d4db83797226a", - "1d15591872211b34bf85237ad456866a4dcb32a8fcf15f0e3755a0ae2c061d76", - "b00750f703dd3957e7e8d9975575a555c3e3aaa29db19fef655f8bbdb07469db", - "c176972996c89eda0ac921ee0e079432ff21913790b2ee166a90366784e70af5", - "eeff116bf3299d69d2e82a82337214700a7bd8b4c88b633597c6b150aebb0493", - "122df024612d42953d1dfd459f93bada27ebbfb73b6ab0db5bba3ef0bd03923a", - "e43e41e8f639f6e07eb404057b044a06b7cff52e8ebb035220dc3fe9ebfd3a76", - "3e833a4e435906e79bfe76e8efbf5b7dae79cb3229ad3104d0e848a7aa7a2950", - "b0ad0cac8bf0741604b0f0bffbbff54ca69820a523f028c4ea128460da7a3d37", - "0f75f16e993882aca93d6cdaac9ee1cf2569b1bcc7933317e417e835e3c9d146", - "837fcf77e53098ad63dc7677bcadcd30127b3a8706641414510af95935466cc0", - "2170195269bf764bae94ba3116a35b7b25f2831e48e99147134a5033411d859c", - "951d787752358b5e79331f06ec8e35851692dc778c71dae60acc17eb80e6a93c", - "9eebdb8d3fa5aab5821da5aacc5dc8badf27b89a23458084d2d429da4c5ed21a", - "7494ba8602da9e1956bb0aa15bdfc56d02b840b53e9f0f997ba8e69b99a0f2cc", - "b9c9b8dedcc628dc8673ab39695c563a9c3ac793a02975c66b94f017f6bd842a", - "df50fbdd6408e6508dec1cf9b5ade724a9f4a2f385ff254332b25cd8437b717e", - "0dffd68c905e70d09c6899dc35cf2f258d5c72373016560f9f743656ffb7a038", - "473caff275729090e526381f651dd20297d8a0d1765a24962e2c940755ca919a", - "2aee810c83cfe89d7f2f70c71171760397141bd8ded463732e3227b7a6f7939c", - "f52f29a4fb9c7782afe0e545912652fb18368915123a7cab92fb8615f0a5866f", - "33c5c13b50becd47396d97bc1db55a29ed250735ad8d3af1fe82b37950053c5a", - "1283aafc559c800a45837e330116ccf9e5b82b69eaa3d4167d12014c676569b2", - "0874c0fcb82e33525722ff87174a2769d5fc260e0d7386907a75f718f6f88062", - "52f4304111fd45162ba17320aedfdbb6e68e1ef54e9d2d4edbfb5d03a057235d", - "806d652dc4cd3faa39cad8c78bb4d99ef7ffda4fb4b07dbb579119d6f84d7e03", - "8ee08e086d9ea5476fa0e0cd9f27f8a6fec1540028ca39670a3c01c288f941a8", - "8f57c81fda2a11d5c6664c3c4ad94fd1cf64a94ecac58034d3b1eb717941129f", - "5c5b6199e79333dc4e1a52404b8fc2e47b159e2bfb4a30cf4bdca22a144e0a46", - "503c749bafdef42e3472c40933cf302ef6ea6f1739abee5d550a5da261e6a66f", - "742bad5bd9759dd673f8e719bb4b7f08efe2c779a4d3e3999f868f52e57af496", - "b57791997fff51fe83550b44f0ac55ed71c7278a6c0f908d00fe0967b17b4b60", - "4b28614cf63e0ebf2024dab8f0b9f2d3b1b9f91fac220b5c7a852ab8e49caf84", - "b42ea7e6a1c5174ed4a3bc15329d1250faf4099d070b8c91631a6124488111b2", - "35c7ebc3969cce3330593689d37acf64373b8e901320a075013a22faa6fcbceb", - "59e97ecf6e5e28ca05445ced4d3c0aabf7b53742dc1425fbec32db259d7b3a36", - "53be34cb11278409dd36ea2d174bd4054241ec7496c50b4fd33bbacf6602de48", - "197caca0acc2841a6d898e3ef3b616ac8c743f65305adf781fa890e53949032f", - "6e5e837f4a4a06aa72bf019cf907a1fb74c1413c97c8df02d69260837da11474", - "4b297a98dee545fef284ee16bb87055a210c1e910791e113be1028a7a151ff40", - "a82051a43b94c0fc0787453337884a765dac44ad88b445bc35d01961323611b3", - "b9a1aeaa808c8dc11acdc743cf1bcfef6271d23540369f300e92867f29523d5b", - "4fc46947ba4cd628a428dbaabfc577894f2eaa7962e3e91520b40e1716e79942", - "2cb467bdd30e4fc929c1a1b21c426f40d21fa39e54da7314052de56fb15b6abe", - "aa41ea604afdc6f0231862c1c7b40d2add25a5bfb524e16ac448d8723e6e4837", - "90f2324e89feae6782ad29c8ac6e1bd804185c65b9af75cddf49f76c07e3d440", - "8a9f1270377da82181a5d942dc55e4aa998734326bdcc0e1d0148d556fdd9e79", - "367b08551df230bf59d7a5314378d7fcaa31b39758aaefe7234edf9631c7dcc8", - "9bf9bc6080b2063ecd6b7988ffadf7ca2b34768cf3ca1d71095c043665e47ebe", - "81cff90fffee04e89100444840f900aec6985cda912f115261332361958d5ae4", - "5d252d193ea3f99f1f73a3352c9d47bea381cfcfc00e100b795bb42e133054ae", - "0cbce7b5464006cc367299107870064f0c8535bf4b65db31e00a5edf4fc88db3", - "c89c863434c1a549ad7e9b01305474c66b9b0546e9bd125acba47cf928af6db2", - "e7455bb70edd3d08a921c686a151f013d63116bbbb1db2f6ce559b0e913ba57a", - "266f930093de6c286260d19c15b03e51efea6d9b18514b3feefa7df5f1c2fc61", - "0d7007925b86e513be2718d74cface3726a9c39079787319a5d682dcf2ef0c78", - "d62905b18912c71ceb832fb9f2eeb147a32a94f92e7e7bdcb7d4b67eb881db5d", - "0da84cebd7e482545231c952220cf879857853ab262a7104f9a250bb27a2c419", - "7502a5df1668e2d4c901172d83dbb2ee0e969e27e49b8c13703a3d7f74a63626", - "b36d716f790981cdc7e3ab509f9568b5b6579e8af3e6452ed7c9a60b61d9f60f", - "e8f1032b873708286108d396fb2e7486fc66fa5b736b73a90906a853e373bd74", - "7df6737bac0503da0e93aff5024d82c94fe63e319c85b8caa6a1842555848a77", - "31bad026b8d806d63235236d5e7f29e145970472fae7e04ec823503bb486250f", - "c36ca825de26f9a7e6bac5723f06fc1a23a8628b4c78cff9d0c6fd9711fcea0e", - "538c0b1f4f7d5b62c9ce612c8d2e0f9bcfb8fc9155e301dbbb806bf01b2ff110", - "c272d98fe8439738b2bb8b3072728b52f2c669fe6b10d7eb1041c9c27d0dc784", - "46cbaa3545473c3738c9db7763271f31c2d23f52efff152e99889dce7bcd2ff7", - "f503c026cf39c32cc2cc6fec6441433fdcef022fd68f50b71c3985caa3beaeb0", - "d197102cb4b24a9769bfc20a7c6fab8c5044012f8da19438f628c75851633c87", - "4aaeda66d7955dcf92114147bbf3cc2aab606fb107b1356c487e8f5aad169157", - "2fb8582656df5158ab44b9ad0e82c2674b1e3c6b75cb812c7ba24dc311aaadf6", - "9e95b7ad8c93aa2dfcbd03b4d47b753485e8f0e52fe434e5cc5ba01572f8a494", - "f505571ee1fdaa4d99c7bd644db0e552da0ae9ec5a4455c3deaf5e2a3f0e1289", - "80561279132da8384f52dee9f450227cd452c6c263e04b9a1fcce285865d8483", - "13a8899dca30580ba2579e318e05e5e5b3337676f66e44fdde591ae12b86328b", - "c085722653de390565c33416612802df57ff6c7544f07cf4d8f9c498ff61294b", - "7449d168a0836bc361dbbe4ce6e5aed2d059be8c6db9e180ad3bb159aff863ce", - "529aae424fc337a90df892536f5fa4eacd95590363391e0d3b1ae5e958727cf9", - "456099b801ebeea82ddb80a824c8cd37fee13e318a394c1752f93132cdf0f72b", - "e1b805a60bf2e31850aa2c4e2165ea7e5a44a740461ad714dd7b49f8059d3a9b", - "a235335fbaa0c7d2790251d4a02252170045cc6d1fce48c2578acd92e03c73a0", - "37bbc73bf0ce6537d54791cb4bb10c0b3a5286e33932bcc8e8ff859bd6057012", - "3e7e1e0ed4975d98b59c3a4f9a6dd3fdb9d35b91ce6b35157b997bda4f47b68f", - "6860095bf7304a551467e373faff8239c31c6d2d78b5aeecd437a6bc8b6eaf96", - "b2eb33e56bbf6ccc071ceb03c5b04999307622f8cefe5651c90cb0199fea1e0c", - "77a1c5956ae156268043dffcc69522206015f70384998fc48e9d449b6d82fbb1", - "a768cf1468f2fab7d749ea83a27929172b490d6585b9a2b11e34c144f5496172", - "52c367bffc24a9f8e5a075c104b335b4f4241dfbde002ff6b0d24064586116d4", - "39e3a4140d08fb2c9266a4805729ffb15a088cb404e6b738e02873026e9c26c8", - "8964405b4d939177b5d84738617c40801c31dbccca48402d1e8575b1a9820f5f", - "8fada4be8a57691bee7bb09af023b87e42e32735bd1a81ae99c87423b9548d6f", - "d230e303dc1ce328d5024d4e81ad7818bc87399c96db64917dfc8731056291c6", - "8c701d725067fe799765ed67cbbc2f745ee0866b810eea6df6f076a10c65f1c5", - "c7c3fda74b721ac798e9a60d4d4701af4b93c3602e86ae1063bbec244c4dcbe0", - "162cefa01b5809d65972d1df9968779b8e91f0b1afb2df404a91238f87f88e6d", - "bfb72e2112e2e1ee664c0b045c97242ee758d42e87ced4309444be3248b19792", - "2311f41703e99406f418532ff6b1aaab799ffc48e0117995e0066d96bdfd7c14", - "a6815a856bde515f924c1fc583565d6724ceb25cc57b712c3e290b773799f0d0", - "45571026a6191d1087a3bcecca5ba60d6a9e7bded9dea531ca30d57616a74cc0", - "989bbee50301b99ad6279998b463a55bd85cb5bb93df1caccaa9c259a3ee14bf", - "2c88cb2fa6acd66babaf6866c92413c5e23216e131eaa3db63399bd407847a75", - "7e4d4e519d2c904a223158345c566082e7d1bd911c4e00e9439ca2ce30783358", - "c6dea92176cb1c39e60612723ab94e19e9bdbb6ebb013aa1569e51a36e74b0df", - "3906fd03e7ba6d1cb8125ca8e390e3bf33895b84db1db8ed0bcb64635182e471", - "4f604ca17fbafd889351ca118936c83707a365e235982ae1438d36376f1f20e9", - "38b786a3994cf8d3246981e8ed9ce49adac69a8696540f4b55c9ee88ffeb398a", - "4d836187010fa9530eba547dbd7fd50876760d0ffcda7ad9fdb3b07ae79c0fea", - "df67305b4b37d8e5dfe67daa7c83c883db3b8c4f7467292b9e6da5871d84f540", - "24ee03c3b83fc0fc3676fb4548d3af56712b3cfc29b9745380889cad054f2bb7", - "2606b75c52c246c7f7e9a7130659ec26ee1b7ccd34f0a80ef99c354fc6c35989", - "60184261fa6977350b000d416e47f95780b4a4e7d15ced2a171e2b7646830c65", - "3f0791cef1fcc2984aa5df5ae5979e4dc4734e22fd6467cde636f946c78cb513", - "4d6dc8eb63603ff5ba0f1745892e6a233c38fd15e7e2e4c8969395f774ffdc76", - "b3df7e17fb57cf526686b4f258a5c19c08a12df4596f5c09ed4b736bccf161bc", - "a2028758692744f58821b052b4a18baa35c922dd40e888461d3b560b4aca7563", - "1c56ca012f33d1ab487556c29abbdb5bbf190f064125115091c73a949e17c5d4", - "95ecc984c568752c9d4b3d46c3a827015d8de809e07789721dc47e7bc6282a0e", - "fab955ef36f4e700c09ecb2daf9f3e5f1733b943f5e200b4e5cc094f38cd2134", - "eab04cd2061a1e345327f65fa11177e919fbc08b44ab818406cbf0667aa1637d", - "28778af3e8dca983310e56aa23813ad6a0133b12ff5552d1aef14fce59d42781", - "f12df577ffc3ec55736cf5e619a66a7dd2ffcc3e773f6d3f1eb8b6eaead2d43b", - "4dd6ca77732e1e97c58e740ae44d40acba00eada572ab03cd808807e3bfcd656", - "ca7cbe89ac35b315569faedc1e19aa24108934fa2a3e3f6b6ec508dc1fa1a1b7", - "9aea190847b70bf486904290cf976246cbbfa7453b48378f42c606b4904c4024", - "da20d8674ef668dcb2d38a29cc7c2ed0be9ddadc0ece2a3d61bbc34766221404", - "1275f9a1413079a635ac06b50f5396495d7cbb28653b7a29c642c7f7223cde66", - "acebab365bb086e7996d11ea4547ab5a9e1b44b32c1fffcfbaa1fef41ece8b89", - "c30744c95f9d4fa3be61e663b42b44973d5ec110bdfbb21bcdcdefba7179fa7f", - "6ae3c7fc56072db52060089c7cd1d46de8bccf7fd7b16d12492f1221d6782de4", - "b37ef541cb121bdb2a993fe7b3a7217ffe4e3da84aedad30f3e6c4a859a163d5", - "2e7f2ba81ec673a20988caecff3967421b322b6f0f3ef80480f5310f934a08fb", - "1e06a6bc69d9d4815333fb46ee14c19ed93345ab24d0a010cc1d1dd4e5b75c77", - "49a394eb4dc28f5b4dfda87d7c6ffcf0a99b02adadf2dc68e1fc15956e537bee", - "c336d19a338fc7a54c081139510a9462387e78e7df43191a761118438e477311", - "4f9ef2133b2af15ac021b012709a125adfc7f00d4132977f7c15b0115e27ab47", - "a3f40675732e25683003f71587b8f388511806b8600af68c5480beed0ffee90d", - "1ab2a838db97d819998eccd607eaebbcd6c0c44fd4acb772febcb1fb9569e857", - "e09245682b735eb6a45699d838c7484a4ce25a70b255cfddac6369a648f8c479", - "146fc70cee0b2b829dbc2b670f37db1a54808ec4a1e21481ee9bd4fea56a39ab", - "2a51d3d9db844d6422bae278fbfcbd2c2011d0bbaef5494a2bf87407feb964fd", - "fb704c4096014f2cc9ca9f2e15cc13369e24180dba6f71e99a43e4632fb69e48", - "47289558218b0f652477a8814d23b5279501575a2e8079ed95cc9db305c24489", - "22ff4b3224afa144e79d846057991bf727d4122583c03ac24c9eb490214113bc", - "2024136686c1b9c38ae316f2b8be8d7476410d34d75a228663738bc9f47345b2", - "42dc053dbe7778ac9901e00d01e94808198aac54f49a0143a4ab3503f32f4c6a", - "b8109afc5de1d764b6686a461e1c6b68624ade6606c5951f09a3c32fa0aa893f", - "1fbbd5d3ddbb823190dfe693b83bd5f48a99cb26ea67642f0225de4b87276f72", - "a7ce2d3b1f0d19d312644134f01f9feb00c144267062d8063d14ca6b20dd87ba", - "ec5d80c636301f0cbea087f2008263aa7d2ea7123c1da941453d89c15fc3b195", - "cd0196f00e4a02bc82e123e35b16b72dd0caf0b7c9c40435ecb2310dfec3b6a0", - "e9492a43b8d3d6a1dbdfc5e47d0a51bf9c5a9a6f241c8aedf8caff1e932f4983", - "c89fefcd0c22caf4b09e198744bca6d8675256f54cfa299ffaacb4cd1afca06c", - "0b66484716ceb1298801622ff436c85920a924cdf3a0a8d857352b47243f2982", - "2add5fc44591ad8d83d61a1ede64beae9ae9d2be9dad9c8cc36e97411a0c1226", - "396e73c7978cbeb6b96fff1527dd09af0f48acd647353f49da64d5eda9668699", - "75b7d4d7048f9144bd689bb97abbdf3092586b9921f4ad20fae6bede4237d81a", - "07ca23bbd03ae85a4ff8d96b2c6826cc1cce0359a4cffaf72cd8013871a46c75", - "f5b2d454a145062c0e87e5ef242f98ac502adcd969fc9290b9b982a57e3547ca", - "876365ca6b4c60bc1df244c07f6f7e69fd80ad0a3b61cf1863c587241b19f120", - "efbb3e01c68ce0f5dd1e29662e26797cca72e75ab1f01de089ea301f2b733d24", - "e95602d6c49213e5dee9edbb3a94c21732fc2e817c8ba2e057892b243fe7a85f", - "01b66ed802b7ced7d17c292da7df1bc644e958ac227f564ce6e2f3d7851e63db", - "bf7b770fdec001006ca062bea6b6efcee525c0defb68f4b802833f54fe993c23", - "4944e05b281c39592a4d6ffc586bdb3db88ef0e9f308d1b480e1087a4540a923", - "e1af153bb8b496f627cd5a0ca1f7f0d9c8dc597ee231eb1d120c93e9f50b0748", - "a9e23ac1b34fc1ee8fe01e45ff93d8aab11e4d8772e0a8c4b42db37fc2973ebc", - "4539d4e469640f2fdb03689c29116ff49b58e8274b056938149f187e92ba4e75", - "72e31eab9b23d573d19e1f1cefea2e793ee542abb575ccd05facec0729f0a1e1", - "a5e8ae81a32dbea6ea53e3a41dabbe13ed40dec2c0c130e99cf63b0569e2dbc4", - "c75a908d83f27bcb7d6d019681b86ed7d6382aeadef6667b5f4dfe22920dc78c", - "663db3ad115d8fcb3bf8b103c9309357ad4f6c4d97cd7b6847338fc1f8c67369", - "1ebb8c924a7a5b2cfd2f00e6cd923dba87496c05a172cb64f0259b8498b06b9c", - "3cbef820d59b29a61af3df6236e904b5fcda95c4cf69a31b9677f987b967cd6c", - "1a9ac76028bcc26544555e4b031c04c035fe5ae8cced793d96552a32a7b16fb2", - "d3ce708e3e944ac5c238411054a2ffc710872d262445c420895ef327caa217d9", - "f695bc125bddc2f63bf01484803a177546e8d5664f678be30ffdb4e997a1ee2e", - "a73b9a3921060c39b3b54ff1d0614dfe3f002bca009217dacbf7a036b51538c4", - "041615f895761476a60c30a6fe3ab003c1ed780e963dd8833b6cdcbae6b2c0de", - "c9a9b83222f5e8c18b27cce804df3f8df56a3b69a31653167a0592abf636f251", - "6befe657d3506f844e0fe1a68a11db5704f5886cd8be9b744647ea14cca15b0b", - "64fb472e205aad5efb7ee8887fe8592904a9b1fe9d88520045dc6b87cf5c490f", - "551fde2eec9eefa4050075177b7a67ba258b0cea3658da6ffd0fc730c567d464", - "30d1b899056f5fd47d8e017c12a4811d67b4f06287047f38796daa4a0a8d830c", - "e6f6cd9cbb90d2d31e945b70f2dae92f518425741046a551423cb86307fcffa9", - "b039c2640d00f7cdea27d6d87ce2b58183370576fbe46d4f0d47755b2b99ac9b", - "d7e38ce6a471ff5bf2bfa8cb8acf646fa8001d4562b3a33bbd0874e9b55b32d8", - "a7f3906020ee6dc566495577d644fdea9a27cbc27a3e14c8d834a687f382d735", - "3307738cff5e765ab2da260d4fa41412b0f968121418567cc19d62f15e33ca1e", - "d0b56336c9e4b0f9a44d8888c88e0309de21b2f2ae61b0f2735bcb3122b809da", - "4e06ab268e3f43760de7cc8a5ddb776aa6e851f8950dcd5308a74ea2ca5c31cc", - "ea95875dd3f5395ea727eb8788e04c90242b6c97146eb050d6a451f4f060acd6", - "ba9863f40325d9b6a133164202861e4907b04b12d24925a27b0a6d2881fbef5e", - "26a345bd4284c4d3b43debd8854c54b8fd0d11947ce8ccafbec0f6fae1ad1653", - "5f2ca186e850bc83ab5edbe594b06f4d9e84b8aa848b585c09617169358aa429", - "701162a5960eba2f043b5afd0177389d0d397d5e910c9e7a3928ac80dc31db7d", - "aa15e26770c8c604d6a19d5c22009c4103907fc11834c03a8b1dcde68b68dda4", - "d6142a26e3e63e9c0d7794daa2e3676e13021de0ee89387eafc718e2aaede8b8", - "a925343c3f8761b6827703fa726ad1eb776d084ee0aa2a86358f203efb38aceb", - "7d6877cfd06dadcade6fc8b948b7bc807a34f24fd150e3025aac1adb0632ee42", - "9bca4ac83c97f7e21c79570f72fcfe0d692de9fefb7a737a6ea4b3125d9379c4", - "130cd9fccdd82ce52898a358a5f3e030763b20c1935263a2e317c3ab35efc573", - "372201a0e115952d7c455909c95264404d2090474c2edf614ccdfd33910c1745", - "9882ff41afcf2488082150a03d619d3f1eae029763a57addbaee7eda832366c3", - "6bb811192ba2ee09730dd064f3e61f31bc9801b58407ba15c87b3e1e868f5f56", - "f7979c632c072b1a5c94a44c2b6aceb4c59b6456dbb2cd745228af9968873cc8", - "b680bda86f041606704423fdf8d8c402c47449e25855daf20608500d303fd93d", - "2e144bfecdff2a66fe9b2b5e07a006c378f08ea8e85fe6f9a447215d0b83b2a4", - "02ab300fdcf7e5d5f6d8fe7733709de72176b6da99466e62d38cc6afd174ffe1", - "238d70834409a20317e563f7d996000b1a704ce36e33c2ed8d75b41d0f2ec9c7", - "eefa1f8489e62b5f990d4e476236825adceb8ce660577447acb94cd64125b15f", - "76dbd4751cde6c3c00ba455a86a0a9449cc55735cb503e578d427e2daf126d09", - "a6d8cfff7f551d4a833d7a0ec62bd0f005f5b743e364bf03b9262d880a644784", - "2d73471e139dd9bb2b985c0d2a9775f431271db516c7ac4d0ee99669a303257b", - "7b8b6a7f8f453d258f7f70c21ef65c06631cd992325df0db2983579ac90bbb8c", - "fc6484d3f5834b778ab53e11aa476b472dc700a569a762b268a3cce543defe8e", - "2a9a80d590c9b48d1b0c30edf377853049a13ca20c4230881856968e288747f4", - "9c2f9955cfbf34ab7231ac1eca3e3afc5ac4db6b48054bfc087b759e3f06c4f9", - "1576ee205e7aff14156aebb1fd8d5cb6159d275e525c90b15b5eef2dc38d1f97", - "39086d576b60f34ed0aaa40b1076604d780c53b9f7799e9beb8de952f370fe20", - "b8b1f9a0c030859e853dc0010c91396908f0421740776733b1d03fd46f0a0447", - "4952ec7747e56b57868f840f9dcf61989bfb7d8f7a04e14d7ccbd4a2973921b2", - "f00342b2c36cddcf2cb9c94aefc26ce0cc072d35166b735b0f2e105fd086a8c5", - "ab96b358ed86a4f03b16aee4f2ca067b3169aed900365ee5fba21cf5f4145db0", - "64e60889995457f988be5ea8d89e50980d785f217f7899f6bdb97432d490173a", - "b4a9499a136133367d0aa2a472821a33192579b4e83bc2343bcc92ca5a41d5aa", - "7e15069465a36bc764153e0593cfbb2a3bc885520dff6930729f6f1509b83e91", - "c0055f25766663d29e41784f8af3d687afe8a5ca5245b53cb58173ab16396c78", - "61a8e1608bce3f1dcaa47531074702d54698611666cfaa6512b54d613d1d1f69", - "cb843d9e1db4cace7aa18c222cc4aa665f7a55806c4c52326fd83551efe36d3b", - "b8d909ee21be802533414ea1116d74c99b035154a1b97f3743dfed3ff7742829", - "8e082c2053483c3bdd1589bf7ec91d8187164b4591a1ad6c0b1c34eee22ed8be", - "f9f428fe42caf09df0e01e612bf6dc75226c1edd2531f637dcc7e033ebc28f58", - "219be377be797de08f4088b5dc1afa91d6a21d0819aa9d83bd9687da862004ae", - "7af13a632358b7f0ea2fd498a55cd8ffec2c180672ca9f7968c35d32094f21ae", - "b93309c9341f8a193b65db9d61cab6a00e72a7df375068aa537d7ae83a5e04bf", - "69391dee0de1b337fa4bfed6e9a120ad51dc63f99dcf90ae479cfc285d4bc8ef", - "18a7e456edac4b7b06d742b0ae819f73ee92854775ca62145ec5b3284e2ecaed", - "1904a806b4881881e4a4f4801241b3aa2f2223e143c4564f44f9828e7d3e43e9", - "dddb3cb1cc92649df33cd7d81707a013b15ec9d2ed29efa4fb23568e6714e87a", - "b97a8e8ddd3f1c638c6af09a65a34986acdb52131484376739d91865a795ca51", - "8281f127a598448016a9873c31501b70d050c2e47e5329c15082c55e80c6705a", - "3e4dd87bcca83c130dbc63226ef8a4048ba391d084b833426b28457ef31dd1fd", - "bd70e54876a2dfdf18b0320a186b09be2945411825170d90dc1ffb171cc3affa", - "c4ed08b60390e6b15f48f4cbfd6c900618a54b43b13b0d9fd1e46ec7264e9351", - "c650610fe2b8f2625f566cb459cbc77e7be1d7243f2b72dbfe6caed58c6f1368", - "487b250cb0f1e450ed2be2fdabd5724cdecb7f3a420c4d1313af3fb0e772dd7c", - "1a6bf39ee1d80a66bbfbed8bf30c544c8a38befcbad911d8e2d13126caed0dcb", - "2c4660fb3ee0640cef59323ac1a6f37b144369fc0bb1c7b49c88fdfa2cbb36b9", - "3da9d5ecaf2c8c5e682dc82ade89080db16a33a2a54c2118c10fb36be6e25171", - "22a59de268c728d05aa1ab99bfde2badbcd319933e107a6782ea561f92fcaa17", - "551ad497f19facebc5dc74fba5d7b1632c138d2c8fe16cd93719dc5d509f46e4", - "41657a92bb663e8bfa4783b666a949b4ad15d94b1c68f254350e8784b77229e5", - "bfbfa7c6cefa8738c1eeabca27004404a6061368753d561182b28bce9e2fcf9a", - "180ad9ed9f910f949b23b93d1db8c99be49bc0551e71a50e60de97a9e845af64", - "bcbaebd5e72bdbb5330471d3effd1cc9ab4d01b48238b4c132cad8899c5f406e", - "b011a1beb6350242afb363fd2ef964726e464934aa54991b3aa6b776a63999c0", - "13e1be2f96667e25390a252bddf4b6a42dc06cf46a35858a199f48e8671c36ab", - "6db6ef226aa74aa58af6779e89579cdfa46e7751f84be9b2e61b8cc46c279b8b", - "35adf11c0df53a345fc8c25006df53f4099ac2b9b0c5c433c056924e01e6aecf", - "639c622bdd2ef518dccd1766be9a9f5b934f32f7e66e5ac3f9ed70fb921cf1b4", - "5673171194940678c8b6b0d583bdcea731fb5951331c6b679226acf4f6790e4c", - "89f11b26ba67add7863fecfbd840b64e0c0d68f97c5abbd0f0a54779b5feca4b", - "1222a4d4a5c543147a8fdd42c2c66aa8bec20ee38dd9cbaabb9c0b2fef033fbd", - "ec5a7aa0d5e235a902d30058d2cd2d8ccb0bea14c9b89c13df9e6800538ef27c", - "439a8baeb83a34eaf57e77922e61bc77d2c70429e36c6e41d0732d74683908d0", - "757b83a8f8489b42c182769ba1ff4a3a32f26fa42145473fb5fa76a12d4a776e", - "9c1e1493d78aa12f5a17b5b4b8b59a865bfd84f088e87b855555da0c5044d630", - "ba550c031025e6b9567c5668bab70189b5cce9a619b8c65b3a3ebb42ffd4ed49", - "27f7a33c83461426e979e49d1c2783c0cb90fd41d60139374aa75136370d8b41", - "51a08d6b12d43324309713db8b94955f488a07be4e17b67cfcf48e7bb50a4caa", - "9327453142a3b183c2e9687bca82a7d70c94d1e7c9004692a2dd74d2a3152bc9", - "fa9557bd896ea3d2056b3109d0fe1b4d92024950f0c76385c30088e48d896f51", - "2f9b5366a4728d864c75e8a98b95cf0fb5edc64eec2506babce3b8ae07658b3c", - "7aa1a646a6d970322cf225421abffb2c85f1607e3e58532b30444012622b705d", - "bc3adb5a5fde213512753612ed862b8879287c7d2175aaec259bc471bd206df4", - "040cec54c47eae1b94afa67853948ad230a353631fce3baef8a3b678a06eaedc", - "3b10fde7bed5d9ecdef097a0dc9ad7b464554006f9758e101a9420fbf73f4ed2", - "da6da7a6ab953e13c0ecae0ea79b5d04a5cbc00ee7a6abaac94ad7c7056863c0", - "1eb5e1ca844008d1a2fe81ac423c93d4898c0d00f5cf9519edf7a1af31020b1c", - "1bdf335d60dfe81fb6b4e9914f6883ff26f2be954fb01f25ae55d46c5e54ba8a", - "cd2a6b667fc3d392211b4913ae52f5165f9f63fcfa6532526a6ad0f6f92e3279", - "7146ec08c5629e7810064384e74c23cb1dd2d4a8e7ee50126a9ef7c7928a243a", - "dfc89f77ee06318489b951610c287c7452a97541cec66e0afa358adf6dcc8e77", - "dea083ba0d157854ffe3cee673a0ae15a460bc543482ae13ed098e6a7946af95", - "8a04dc0b7bbfa5844c242d94074457cb77a14f285083a1e0a19426c0483fc3dd", - "0c61bfdbc41e339a415fac280a8e70bda304f4b0fbaad9b9df8a63e9996073d3", - "8051fba0520a6dca88c9b3e133e225633c5e2f800c4cbca76997e1abb9a05f52", - "0a7c3f96573480693c23cd772639eeb2a46e940ed49a54051edbc1447e969107", - "902b98da3ca020b515165573a80827442f2856ee01e6e1e4f01b1fc2f4e80b23", - "f8452de82c71c405a35726b5c2d8cb72033eda0c2f801befcb31f2226534abc4", - "537a474cb52f2f64fba0276290d5d75bc2cbe4ec44ee7f3839e415566f43f1b1", - "b4e56986f1567587ab1113fa460dab3b08630156fc09a779eae9c9037de7adca", - "59291e96d349a3f85a4cb51f5a18e77d22338566e9f1703b644e03a12641e6de", - "59f5b9be3b043c6e9c799d5a9e87779e3e475b9def4951fe0c1234b2ae410808", - "9b5ee420fd692aa4b738dc8e84cce0b8e0aaf4cc7906efa98f9e1f33c5ad0540", - "8a839c1a368f332f30fb1b03ff12ab151eae4e47f988d3b1dfa14d5aa4c8003a", - "d8bd003bd6e1ff55fac08d025f598ad267e85c99bada479d3920be4630ecfd13", - "025a5f19958b2a562a418004e91c3809c6b81b3757d1fd41b6064b3569ca4f11", - "57fc28eba8cf6cc61b290466e0f5401513ee6d87f095995be706a32f109dcdda", - "3ab7674f822bdaabaf65a0ebdd2baa5b403d82a398dc83bf996d575da97ec0b3", - "d30831dfaf380cb5824bbd044fb7ea2624c24f72c16d81421a05fc5e54d86f6e", - "dd60eba48b018b66bca26f93cd26520b49121e0eff04c7fd772261d56511bbc8", - "1220803b5a718353f8b02d84b11ac25d75632cb9b84192d67e9c83504195f419", - "4f678c751dd5f72a225b7f98564816497ff04902f8931d2fb2ca875b196775cb", - "67b06798750763d9a8e0c01e9397e1ce032bdaa39f16f0697a2095e8a8b7cb96", - "c2d639d923805083af34481e49160aec1bbc78be671d15501a1ec52a6557e587", - "b228ed3b3c915bf9062d4ac3e7d1f33354b8bfb65a44aea87684b627a0dc452a", - "6fd48c0d6386d98ccb0f90d13781664a2435fed422d42b8fc8df760f3137aba5", - "5758b2bd4560f72646ef3a2e17f8d1e298c2fc99e0ac63940e8ea620781362df", - "d04f98b2d64056a4c11b71da8c0534a9f41640c4cda39eadd70dedca8757f567", - "929bece67bb6bcfacde8235c4839044699042e2d75d5668abe58eb22ab33ad22", - "01584865004181b4e5979dfda2f16ac29aa9091e252a0104ba9c3ae065faa952", - "34fa0fa06886d77321e4230d4ce0e4f79e0229696971304a33c97877ee32a036", - "b66fb889b31e3e18f2220c27e78438f14278866857efc854644087ee63857943", - "2106d85460536f2813ff0685f13b046f5e714c0a6736bf47212339d2e5a4708d", - "7d289cc1e06dc418deb3b5f791ac6143ec82fdd636d8021be01efbca20413d91", - "f20189005a6066dd264f85cf132a9e8fadc0bc1e96e72398e44cc046d79e18f0", - "2ca470059a13182d86af5e0f1198f9336e27f248531bddb9b465b5554284cdd9", - "3c06c5dae19d83697926d08e8acb25a5363c949b52ffa9e4e604835016e3fc30", - "4977884152967becde1929c5004a560b3be117b5ccbf25c92f1a8969b4d7e034", - "6db9d925bfa29f0a064a44d35ae207e5981d864a0032c4864079e88dbe2bda65", - "779b51f14e90aff393fbac36ccc956222dbb7f9e8dd7cd82b2a6289398667ba5", - "d17f4fbee120ceca927232f3a5308cb351d918d6e190e72c41bb7b4f7dde75c3", - "5fc136fbc5176c5162daf47740f4d7b7ff22e1aa9320e76fb4219284d8f7b2f8", - "7c4956f4b27c8f84d9eeb55d6b99ea0ec991222f82847b8ad85160d5e5d13089", - "b34627187efdb10c49db346c3842515cfb0270677989b14e3aa07e5e8056d2b9", - "a577a43fcf1e5e338b1a94c2337fb941f987ee5ff94836890f065407405626de", - "96e7ae52c6e8e99eb296bce47482bb08081597a13ff60e4e3b4c018bb2be2c23", - "6be2f630c2c36e4046804f238aa80ad0b92e7eb90e64bdb24ca6ba8feb571667", - "bf162c0e13531f5fae8e3be98f421de0de34cab50b2bd33fc42bd58b3c01b73d", - "31c0fb4f9256f16d9f407623b909beed6c3af121ac439e93a2a8f2f3420899f9", - "e855de0792483889f59a160434cdef9c90b8b0200667d661afe667e4f488ddcf", - "7054af6fe93f888bce333835049c70187efc1db38c9a9b77067e5fc6fffa0332", - "8a5edb03426d83d4260ddb9e3e9610eec40a176e088c34120b8bd8591ca02a6a", - "46650b8349c8cab12b07c5dfdf30b37354d804954485122d22dee6de9d5479f6", - "a541d97df5adba9bf81f40235ec5a3dfc55cd178787bfea235f20f2d85561d2e", - "03573f6c2bc57c96744c6032339a2dd7b9ed9657aca3cb45a3ec250ede0c916a", - "40691158d0c5dccc1b328187f4d0608a8ca2efb1991090fb73ae573cca5c315e", - "30286ff21389f0141e2f2fd48b4d63ff16c6b9e1e727ae9b1d1da9b67fe16d5a", - "5b4fd76dde34fe2030f9d97219574bfd6810bef5d8636648b52391ec3287a347", - "6f016cc91e0da5b4fbc05be1d3a4c768d0a94f4ad94b846d31fa3a42329bc643", - "89eed30fdf56ddca7f4fad541e11ba9ca994d60c137b80a9e9c70df754857b0c", - "9340b5d6925d776f6b895111d3e3097c556ce25e3fe5dec5847385ede949a3e4", - "0a7dffaa5787278b110a0a5719efcb89f1a238c335edaf072720200bbb1440ba", - "0cb272c294942efce0f35372386d0d695cd7fc04f95515587bccd01e59cbba8c", - "b2aab6f4d784fa17e224c7b7dbef7a7b99a449a5ff5795d04c65aa8eb90c9cd4", - "3a879e77b2e8eeff25ce5548505e3a08827041930e94f3bed9031bcd1527421f", - "64d8c3e9cfb935b6423c56413a485ef81977cf54c6b8325269c23e8a523a3136", - "f9f5c1ba9f772364828dd56effd4f495a3c25e51ef5667c4d9388a503fd449b7", - "d8ed3a79080903ba7d7af57577e3cc21ca28235e23377fcbfa7847d5612a42ed", - "fd7c6d5d41239151bd20be2e050f8a159ef73102e1b06b68cc118808b353a76d", - "db788519aeffd4124d7cd54ab5454c891b852c152bea67fda66cb9056e8b0be6", - "32320bcbf74485c8b9395ea6ed596be20ade6eed33fa4100d31f45bb6057eb75", - "f107b57fc4584a4d61d226600a8e8d7d9a00c4e0fe508fca55a0267614dc7b90", - "2298bb394b94c9b878a4b2ba1901816704c66219bbee264880a57c20d6ce0342", - "6d27f8386771efbefd2d5a0c91eb4b63a2429e660ca5b90ec98af177b4b6369f", - "b85aa2db855290ad4d378dbd7e88e94691c36dd24bba44f0bb389ee01123daf6", - "8eb352db54f236efc96be1b1d5771d03eddb401e4543d8587ffc945e75e62bd7", - "fda719e105c05bf683097a253b759d868a4624994e9179b7533b7fd0e1ef6e90", - "d05105df02c3456268122f7d3e995f8f36e25762e369f69b5f8aa725d88168e7", - "4cf8017d4a2f3aa62f7efc6d0e758d744d0132144b9a913e0cfd22d8e2e7a2b9", - "621a98cae049f236940cb98f88a7304fb20a729c744499946f560163f3b31701", - "4a8590149bbaf05590e039ca8528935df67f6556c528b5238b2101a633b03cff", - "c4855fd009df90b9f1ab120383dadfb32b1d9decfd82febd05d2cb9df11d38fc", - "9d49c621caa4decad95f8a34ef76d4070e4df047e86eff785d0e9af84d039b0e", - "0edbe9de3423269c52bea0f6c38a96140216ba40ffa5ea2b82410fd127a0eeec", - "efdbfffc7e3d713938f81cfb8e33e5021583a15ef5e1a89fb49d3c3884be3706", - "3c11f5d4ba74aeebb76b163b0903b89dca5a3163f3aafcd7c94cc1c7cfe939e5", - "7971f03a1e20465a282cf633e26c876a39830236784f1039ec458d2464c8c7db", - "a92e554afb8afbd61aba477726a7849d26df4b145d6c991d90a6f64b05767a7a", - "d105c833c98037a30a69d921e603c91633797aced7fd8df3747b59f8adefb1a1", - "321c4ebc09355e2a63a1ea98fd15937bd30dbeb89d54931f95680cf733b2a793", - "699365f5ffb43fdba965680d6a71afc5a4d956978d22dbc78ca0ac5d31fa1d18", - "47b0a90244235ce63c35b29faf220add8d7de4b433a42eeb1e1e67415f08eba9", - "af1a6b38c076c8e32aba6bf085fda2b3727cbb267861f8e1c5aa02f9cd8417ca", - "92f2344a225098f68b7740efacac546d8ea86df26edf78b478307a637603a24b", - "fe0bfd825996894e27eff05ae2bcd505eed97126bea9d589188bd4aa4a112f3d", - "7a5d15ce366dc8739b9e57566c2ffd41c4aebc40b2c167db2bf165430d30862e", - "3c4a153dacaa23ed45c2f42767258236afd73dbadaa699e57714a10d4b7dc7eb", - "313083ec5dc8f1ae15217e0e51d9774e3de93ee46d8e07608a7882da50d4b1b1", - "90e3fd4e66c80d32d1f6e84409bb29e6e90ea492b94894a9a80425b13e2a5b7d", - "ab6e8b5ca80a3df0a245101056938d1c3de158a44634b866c930f0b2792bd30b", - "6c94787cc244c346402911e8fc2cff21ff0aca2d079e6e2853386583a572d985", - "5ad68e051004112a41cf6c3dab87531699456362816a48657e4f2bea7d21d330", - "3f28641113d19918456fd4c37653b0d64a0552eae70c80e84930ed6b80ba4aad", - "b243aceeee65a414df189502e48a8db8e17e9eb0f7896a33ce632a0aff94f32e", - "dd328c17b5574a8d3599158092e1938d9505904c4684a6fe7e522a4d7cca23d1", - "a1d3970c4744340d906cf76af6e1afceb82ca3ddb97d9ed1b453f20ff5a36a0f", - "3f1da211d72f87f15b19de64489c32c9705ac488c811a0fe0c568365a4664714", - "a5256abc606c4566f77daf3bb686411ef067e0c59e622c05992e2cdcab62082d", - "110ae7b2ffeb20e1a705a3f8d806365ed4cfd0c87919711ba8b67dcb5b94aba6", - "f6d6d496b3733ec69d84b9546229695c3b8bb9c884e7656e6cdeead0d48b2fa7", - "e1eed27cdcac295acc63e8d3a2c2e82c8624db2ef8ab81a30a8a652f6fdef545", - "b032ce5996d1304be2a7c6307fc5df9fa43877e5d60afe3d32bb0b520cfe6a08", - "17453a75244912e3dacce54a67b3713e420a14a238c7cfdaac60060b883bd2bc", - "c43e81f0c6bae1d3a249ab4b85f133fa0a9736e129297d3a93ac7520ecdd5e2a", - "1b43fa7de0a6bb9d444e5b6164a5886b087dc10e71c2976c941c8c601f683da9", - "b09de081c43296448fbf22314edb6f35a0b0115c0177a66efba4367f223db0bc", - "0db7ea6c5a4165dc1dced08dedf858c40ba4c9295f5d1f7a1805bce3faeb4d42", - "d3029028828da3103202d1c0a4da6323d5a66b7de7bcd81e3062bdc8d5690e69", - "5140da77f0363950a9cc37418e6e893ac55ffa34ad47a4ada3dcae19479b137f", - "3829fc1fb964765f2531db032e5ecece1d0fd003c7c886e0cfaad1a145d9540d", - "8c2add3c8df26be442d545a8cc5e213eb0659e659eac3a20b0cae8d13ba4f722", - "0989a73b445694c00d28f0284e73ef8e0233fd465c3e5a5018850b154aa7e8bf", - "2daa89a394b84b77a67f743c6b2fda7d9560375f55721a82d827c0442cb3e3c6", - "24d3f6ae92ad6d5143cda3cb80ec77f3f2dfd0670754d6cb486e8bc46b81233f", - "2655e6743d1be4ba44a0f9723fd85b58a24ef37909d22bf14e635ede6d29db4c", - "6ac55c4c663e14463c04030879fcea1018d643fc390b9edd2b591ac73e450ded", - "8b0673706a58adf1665429c069122003e5084fd9336300f756c04bba52f3fab6", - "ef2c4474250a195a27415938871b5640ef097d4b71cdccdabfa76460319c3e3f", - "a5cabfaed9ebba38797d759b914b16b069a69cd32a78742fd754ff1946d3b944", - "3eac668b79d61077720c0b9d65d8b252e273cef8385c03b5a8be7359710559f7", - "5fe584cb4499d62f10d0cb0bb2a0e62f02261731da44e1ad4e476c3c4d25b6d7", - "ddf81d671318eee5c59448868d253ed256ce3e77928e49da99371d90bea5582f", - "6f86a363a7530ec7bb7abe9a4c720d38322ceb4c5c437957c8c5a35ddbafa7a9", - "4d5b130d36f56b2700826a878189b2ade8674f7cfc02d0e6397224cb5ff0c474", - "8e5c4bd420c485ba019ff429a426665334a74653d2dbdb38b9ae40d9fad6c575", - "152f880f51727b7cb963b0906babc7b331afb18f477b821ca80aba9648e1f008", - "0386388c721f743c6b011390ebcc794a6aa7adfb05cd86f8697ba84093e6cdfe", - "f97dc65698300d77b7e407bc4ec5099bb4ea04c128fe300aece34f57bbcaa0e9", - "c4f86fc931376fab06d9562a52a847accb30fad25dc75f2d057cf3db162d9040", - "3d78ad5951f1b63576f20dee9a4d1b76df5ee31f3ca8bba3a7bdb94dd3c5d7f1", - "5db7c0ad5e60c27a6cd60b442bdcc07ae5b1d85d536691f491e64aeb0c761ed4", - "df38137460ba54b26237f46c7a0b5333efeb549c48b458c0da1ac1784193f402", - "27efaafa3a58e53d2edea056b1ffd707f8bbb899f2b85961d268e729514bb469", - "b9de2b2867564f463f3d7f4f4b6e5c38fca06ed84ed4fdbc0ddaeec79fbc8263", - "e9b0df2d1c3f13cff039de4799383d97282b4cabee72c16c736af0100f25abd6", - "98bebc947d7eb61d3549cacfa04a43bb4783f571229b40f5dd939671c8d4036c", - "14f653f03a3bcd657c403200b20e66228e295704491ab560027f77bf3c9e76f9", - "476a2e6481b982e53c526bf21a6dd83fd7d41e84d5b9f3d701de397cad0cfc3c", - "9f478b09936d2be236991d8d83ec6f5e6790a9198c82602dd9f20ed4db368303", - "a9ea0e2df85f52feaa8ccd998fe62c8595578c9c346245798588d3b66a0434c9", - "4c02296b5cb79b59047d15ba4c3d6092460d7e67745548046d0b0c82cfc05428", - "5a2b1143f4f7efcee40c11618641630025bb20167d6eeb5aeb147e9aa7f8b9f6", - "94e594bd8f68c206e10350893710c3e238313b4c73864376d17f4f60a3b275a7", - "5a9c2199aeda78610d37bbac07b9cc5c5a64196ff0a90a84cf59a286ca56c01c", - "850cd63936518e0e9a268de0b2fdcf40831740adda326f355833a4b68f4cdba9", - "0754a7af72bdded2e30bcc5598a96336cc320c282d1c30f8ba54b43dad5f7637", - "18c6707cb9815e3f7e8e6142c19d839dda01e385c8abf409f00562bf4e863170", - "b0ac510830f5910180803862c69345c6ea366b6814a409545f948d9201d3d8b4", - "1077ee06f7d212b62241c9ed92504beaa248735dcff760fdc3eb4867e428353e", - "c3000320826625f89ae5a951deea19ca0e713948cc4a2421d52a32131dbf3095", - "54ec3a3a3abc29eadaea6e5158ba4405ec492d1468d076ea3e956aa321bf3b1e", - "87fca14aeccd8a6f649521da63cedcd63b742edd63bb627e10c9723d4cdb27f9", - "e40bade74bc2e012214714f8235684115f01cf9c3fbc683f128d318e91776f07", - "56d7ab367baa8660a41af8d1b11df627946fa48fea3d42b761345ea341173065", - "93ca4a512972e7f13c8df1cc88364eb693e4c557b5af56651668e7af35a19775", - "9b9399269be495807e9b02a2e7f820e1d03352e9e17911b5e7648685076d56b3", - "b20ffa064c0c830cf359c9c4da892541793a07fa21d68aa86ade56e27cd0de2b", - "d14719ccc598b937a08e40bb1843ec5a3a59d5f11ab361f25ef4cc0d5a5531c0", - "cee474ea0c4f5cfd3014f585b70cafc75a566614e2e25f8f82c0f301db35bd09", - "6cc8ba6c73ef8e50427fcdb89829352b3c50ab89ee98caad96ae4786c52e14b1", - "0d0316ced8dd6ea97d1fec16e94a69ba7cc5cdba5a66a0752f9ef1ca0060136e", - "2e9a58d41a96bafff4aeb761fa17411bcda57a46ea504892eddd205880cd540f", - "9b55d3a34c3c9f045ac6723631e73dfac2c7111289e32d759ffd982f753525f8", - "0c3927d1f8d702eb3dacba109c148725a54283e2e9e917e5122a87d62d0ffa31", - "6e7a930ad20430bf8ffd32e6e473819ab961bfc85a54cd0f7dd58bd57ff46b8c", - "275e8f1efac33ecf57d20103cd18ce6682da980b8ea6084a51391db934af10e7", - "0080d34110a393e6148d966d6a339ac1a9c3e4e33e14667cb9a6a371f4e7741a", - "d0c717503edccd7c7f70f91b08eee5df93e3146320ec53e78cd825b0ee8ce788", - "0bb80ca31378c5af7d9cf247215e94229c136fde774548305caeaa30bb356def", - "d91cfbe3afc6d7f8e623b8bbc90b319d2e38f7d2adee75a28ec10c44bbe8d224", - "f5b43f67ef4b03e23e32a88f8387062c9c8c22101b37526da437e764f223d236", - "bafa339440f10bb1e83a1cbb7a35d15f6c22965f121c3662d277bf2d65f95f28", - "1e492a2e436cd99687f550d4521c45c02ce1017d60fc364b5fdebe98b3e2dc64", - "393bba7bdcd1ca239127b63524756526920fed915dcc4f95d542c9d987014f24", - "6e45d4495c6799d71c814dc8b383762be11ae993207bb5254df4946ebbf1dc20", - "4329c557e1f549444a33bc2d6c7148ce0fb839abd8ee1bdf933199a18c97f00b", - "5bad46064bcb8d6e77ca3f86707567508941c6e6a585160e3c4e024f77e29fcc", - "4ea1c344a104746d259e2b8749257df49642d49aa66e9d2056be7d324d947efe", - "abd5928c75a4ffba4739c8d053c599493e385b250ebb0d93d1793b6bcb226f5f", - "3d609b899f6140486ff403f1c6fc017bf71fe9b7b8d5ea8e52e6de0122ad7632", - "465471959bcc05d68f6deea61e8244c99653cacd4f4d11cb32715bfcb59cb259", - "6525c3ddae8eafd55327482e57960e6758a6d960b2c839c20704521b6e339986", - "afeee56d8badbb619affa602c401465db5f8f6399b92a64e691b05ee90526f9e", - "bcaa49b0fea60db5655bfb0e17d5e781eee67511234e8aa7f50f56fa49a9ac6e", - "7a94207c63bc66a6a9c77f1604ad5b26635a50bb54b015b0bb6fd68d064b43fe", - "f14c13175765e1e9c772e141bb2a3479fa4a4ff4be1d483fe4a27c7da8fc1288", - "656c525d4cf8985326e8c557fe05a66d39bc8b4d374de60a2c55e3f07dcb6d14", - "7e0f0c5ca8aadd8c77df0e09926a721c16b348af08ee568489edae25718d58c9", - "9f9f1ccd616ffd5026824f0f4514f6d97fa8d4c6cc3c2803c78c0c19ecc7cfcb", - "3ca17436539e58f9b8ff2df13dbf070522211db719086841b6d0e5a3b4502c8e", - "2c335ffa76095490e60231be884d5ee78588fe74d88e04b8a426115bc3f55fe0", - "388e4378bbcd3982c3adb3a6eaa831c16d072b56155b7987a386e728c1d95c43", - "6c8e0c5d89aea3803915fafe3ab45e0279eb14c3a67df36693bdfc96462db121", - "e3af4cabbcc1b269c614bc74b6b50eab9f782dd9844d2aa2051ab4b3093be4b3", - "3ddc0ca6f3fac473fdc4455af9e4f47423ae39d8cd6df60650bffff9b9168203", - "3d9bc820b31bcc09f16e16db387e6c598aad45afec4554749a4b3443fca96b92", - "d30f82bcd1aa0b9717c040ae2e455b562ac88c84851d32a6ff98b6f54b44cb12", - "4c246894f6d30a81b19899494a54a6ef1714caf65aee08e0b960218e04fe1ed1", - "1e94598568e8c4a8fb30486d93d960d630b5094161d3cde7e6d23a6f9e46fb89", - "f9623e452bf06893f365330fd68adc6859e76d9f904cc0d3c0f18b592e26133d", - "898a4cdf77ec14beb77c4fc7463b15fdc0003824178bdafc8efed009b262c6bf", - "187a7a718ecaa10fc808d52dd24a9a187d817bd730387102eed77b3d39b5d689", - "6b8e48795829dfa1a35fd2f7cc86f4fb4ac2d84cf7b75185af2d0f34b955dd6f", - "b6e4a73d0d07f78dc8eb56232435db59925dca4377fd66d1e768e4f8805df794", - "307d4c1577b994b7c45bee5a1f490406738c0af4818592c205be8a75bfa43ad7", - "729456f0d5f88f60bae253c1ba9ef519363d05b19ebc7898ecbd65aca9969270", - "29f671000dcc48b088117714b23d0165f227723616dcf2dd3f7b5aca76980fab", - "23504d91e7fca340ff0ff1cb6d6c50a49bc960833c25f906b47bbbbce044041f", - "e8b5af1fa9c4937bcd154a651156900aa7ca97459201ec8f303a572b22f9a167", - "62ec1d99c92093bb1c5aaf9965448d65d923ede1fdaafddbc88cf9503b255402", - "432f8382e76e898669d705c84c91f9a9ecae8536e9491d927c7a11222e86499c", - "8fe37b7c52708af00c5ed11072c6ba5e12abb5d7469f9c144ecb08382eae9c51", - "ca9320fb2f9b5cb562016cc52fc95d9e9f835e0d26d5f4e50d0c013bd6919db5", - "f58e67b8fae06f401c8534463643306834267fbb57be5992d5330a2c291fc528", - "318e676da7c56114b294dcefb06c52d0dc505b57e6b86bd4d34988944151d7db", - "5b91b892d10aaa7b833f7fbbca1a85b07d372ad680897586198070ab13ddb232", - "93a0f0033095150c107ca38267bfede6ef52320bc1592251ac28cd782a9e9f97", - "d7f20f0ee9d46edd5d3faffc57decdfcf9423831b5d7030408d70e76b6ef1f7c", - "7466b13ab76e6c54a6ddc4bcdfaf9dc471cb98f5154b0477c9f8521dd1e65f9a", - "f01ff52a0ae205e166c1afd0f57b0728469a4a96852df0b839e01c121d1fbc2d", - "d082c5401204de571eb402f95ffa8a08fb062162ee266bd9bd44e04d8b6ddf1d", - "041fc67bd38899be002ddf00e9929f08fe2cda0edc9c5ef9eb2a91f3fc19561a", - "9e2c18a669d750b323697761422fdb1e4f68bc807526081904e50db8494d67f8", - "72e3cb9aaa3c5cbd5145013195355aebe673e6e25e3bca955f78e2cd8781fab3", - "7fced3b215a3ca3d04c829955462aa9799e07800597311d02b11ccf3e95fbf2d", - "de50a52370700a8cf9b4c06954e5d5b3977be1cc0972a95e6e59c4744fef1f58", - "4aaaba423fb7b0eae6987e08dbee6e4920c70e5813cb96291b25d9c2091b67cc", - "8bee16fce01f636eea5ccdf2c149fc977b8bc923e23b485ad5b4e3b428f6472e", - "2f8a5fa091101b916b0be063a0c0dfdb94c346d1d833c56c35440689b91039b6", - "9db59f5e4688cd851d228aa0fc1e276d8bcd8a793680cda031316c06ee8d1e51", - "a65e138b5496cd5086a2345ab148d0f051df27224f7bac7ab5e2acefebdc68da", - "1d394afdd58b510e84b7fcf3d69f29fc055141642f8202dfcf32817dc2b39ef0", - "c4c727facf156c0c8381b403c035c87c6a99a0ed7f521c44b5fadad738d827a0", - "36ce06e6d225bce72d3180d8449045925332b7cdd8afd39b69ad67022e72da86", - "56d252cac0930f1ddddd1757647468a371c8486fe2ab4a2dff47af6b2c858a3c", - "679dad526ffc19b2208af62d5cd99c9dbdfae07e99f679098ed01944959b8ccb", - "2f2312ca34c684aa1c7a08f98a3570f9b9deff28f3a8be1b7700a42227279af2", - "85ed9609255fd4ad05eecedf13ede7b078eda125b4507857b3e200431f8d1fd1", - "2a0c16899eccf6d631df27ab428175f2ae7346fc3f1c033ecc851d10d236aaff", - "cf330cab3f86410950169f94d099cb3d78b0118907a8c0fefd0832c595117c85", - "cb2ad46e9f1b12e59e588f1fc9e6efd01b4e86af388a7c7cf182ebc356f57a6d", - "98b10aabbd914e1ed574ab8e01c080f3e95e6260e180043891848975faf4a41c", - "840dfaf5ee3176df48c00f1bebc97a8d6ccba109682c18a56802de150f35e708", - "dc84444ce71684b0a2d17ab4460bb01c33c63333d4bae3091ac6421c4ea8304e", - "28ab78b5427feada1ce1517a07e7fa566e9b44b609e4290d5c6f5dd49e66482c", - "9adbf22094ba5641243ad62cea3c3c7eeb462f8a76e43c00dec75f6b19f2378b", - "b3f22adaa0b38bf687a682256ec3bc5649e1518231d0b608bad9c6e54f355647", - "badbf9d9e3d9e2e3f435d242f3312c8a08f3533b94ec7914583ac32481c0eec9", - "6025a5d3db77235dc7432fd71f0414ee95a5f8ee835a677ab080dc24124502b7", - "e5a509b380ab6c5b1d172e0c313f754b351247fa66e568584afb6f211a36d264", - "d339d7e2392f5ac0a0893e733eb15ef201b5013c50237f1cc3d467f681194bce", - "6ecfff030601a266ef9bdf0f1f844c0d1fa26c46c5f7904d804c3e9fbab12251", - "ef854d9dce403b9e18c3a79a7d99198ebaef29c62d145b01e3d4b8fa118319e3", - "f84ca61f91bfa7603b04cb1b2c5234d88563302a297e4863da6170c59174bb34", - "453e019fde41fc0ea1e5f713b585661988333069df7d5f01d9a5a1e0b32d2123", - "1263e34fe0e7eb172c4411eff376c82e989b78b0cd23d1f9208145365677a1f8", - "514c46798f23fcffad2efad3c3c762984daf2b35066031545c627dfe0a538048", - "6cb72e4180db13ad6379abee2ad723da8ae2776e939446f130ca920bdfe4439d", - "98e2b76a07fa53d5b246508772d4e163b9637f7c688d3516fe72612ce3209b48", - "e36a4cb6e0cbbf6912970be5ebd7eca8688fc25960a365f8f4f792bd13a06d25", - "0dfd0c508e89d0efb707da99c28e1bbf2b3f31270ddb2e1334c19471b57a9964", - "dc4c0531c160ade9270aa64955eca0185a0016b60071e1dcc0ceb68d6b03e5e9", - "0708e1d2cff6eff1d41b5c46e501906b8e422e91347986d5d46717adc623ead5", - "7d404c4dd3fd0b45b359fd11f89e5e269fb24eca8862ee8bade6eddf06d7fc3c", - "5c418408ac9ef2995a6d8d9062fe084ea7eecca7f6071dce9ef48ff014108168", - "8ea856f167d45b9b422d73e7148b201225fe489560e1ce5e672cec5d50e9e167", - "e56dce83c7664da7970bd3ff398ca4faaf98bec5ef0444ebe57d4dd3b49aec27", - "5d5a159650f716ab1f68e6e1eb1c4259e3a9c5bcf51f66e19970e3448bf9fa60", - "bd2e16bfdfee61d329be6c0b8f5c0381638a6a23ed1c407001ab1817d2bd6eb9", - "bae483aed7b60f4f6fc7723e2811da5c589d92379cb444de87d9799b99aa44f0", - "31b0f0274639509e863a26f8bce281c3d698734ba053bbe05703fb668de31c87", - "9799c498c6313bbcd6c64e0647ac87b05f7df866d31040987dc2e2b439024b9d", - "272a14f88c6351fb17d0e5024d04eb3f7a5cab7a48563a9978ca920eb7b8f9ad", - "4d3c5f78fc4fe48e292f745c9274dc62905148e2a395ef0d28d661e6fa473dce", - "08b8cda08224ad64c6e58f4759d54339d41867ea816f19fd7161fe46df657375", - "290280c4732b88fb8e5002122495ff2f4a51a260da09e4b9464baa63c9016cd3", - "9dea70955e5e0ee54d31112c7f6de420447b63ed2ebc7a2d0039cb24b4d9435f", - "60335fd4161f8cecf798efd7cf7cc387e25919f1163e7d0a4d7ca9f307b79416", - "39c910f7b686b1283e486a7866f49efb1ee3d07f9b6b8883735a6042ad8087e7", - "d7efaad1b55ec6171b5e1fb83967c3ca143598b96d30927a6f320019f7069e18", - "a928e817634e96103c8a9611376c06536ed974d0d9654c7ec01035e15736189d", - "b6c48fa8aac3af819b334a8926e94f1ad5357843eec7394449a8c094a4b4ac7c", - "502959f966ecb3083a8ff7ac61dae174b520a23f976ffd0c64727f36dc860108", - "d4d06d90ff90738a5e0a7b27c6a04e348e7614060bbdc9c82bd5aea645e0f95e", - "b6e0bb96452bcdd8b798b65458d24584e4e55f6af8ec216d5f102fb51e3c99e7", - "67a61140b3f63832952005cb22a610c0b3954942e24b8a9944d99f0d1d2d33a5", - "3c7a208875530285c958a2d3a3df3a4ca698528c29a4b2ac45df3e4e74820189", - "b876aeea77109fbb7dc185ff430960f4491eee76efb6e0eb40f15b6ed52319d4", - "b960d5c75a6e4bc7c9ea19535b6ca76de86d972a7c54c2d57aeb72d0eee5003c", - "bb731eb5e42f1dec7492580554b9964ac9a7631e0c7b401799cf8f7216684962", - "a2bb2b08f2b803b064f94043135381b36529eab853720846ba5e1fbd1a276758", - "55b2629eed5ed1c7dd9b923aa00720e89f81fd19f49d50a99b77facf067ac34b", - "cec1243ada3e8c81a374098ace11fd6dc58f75552694604894886dd42987b4f6", - "7f71762a0f3b0572e7ccb818ec6fc987024e2b720b02a3ef92a9b5ce887e300b", - "37b19ab5b313b5575ebc0741533eef3b6d122687ed0964d16df876940f44be71", - "6df50eea69bc1f09227a589f742cca7984cfa89efba698777aab3d32ec1a4c80", - "f444983176f2b71b30f1db62da8ba44f8498c87caea9e6a2c45c14f4faa4d84f", - "d71e591332fd786e2bbba7ff13a2598d8c0dedfebc49df5dce511c52657d593a", - "af8c307edd7fe9e2476350cb44da1892e492683f6eb298c4d782138562de97e3", - "5e53e6b71375a0a98354ff0aee9092b73e6b0fa2707f37fbfe26fc2b191265bd", - "c1d55b84cae07077747b4aa109a8f32bab3be123f72c78e6296459cd86afccd9", - "0d99e47176c57d5118c6974a336838fd62748a781e15018152d20db42abbd699", - "529ed599542d67ef53958ae6c3ab8a48d4aeb6a06d049579df8cae3494ebebae", - "7095617a82e22595f69bb98e3c13e0f01fe1cfa3200eabf6bf81cc4349092ee3", - "4850cb5ed923eb7279783ac06573c9afc6d8b2df223ede5af0d5b0b38d6fcf4e", - "609aa27578e690869747cec9db2aab69b139c1cdd4ea8b6166c302cfc2261bc1", - "1feaec1e61d88292c8088955493041e98fa88b110b9fdde4628e15f3b9d12124", - "1ae8770c4f1b0a18fb8f83488f95c02b3c069fa3b8f26368fb17570002083121", - "2a32faa8608d383221e2c98553c8d31ec29c7ec3c83e09f259204abb5bfb18cd", - "6c1ed7549ffaeaed07f3e910ec827fbff5b09af48edca43391335c3ac6f81467", - "70931f4c684328718b83c30a552d4202d7b90715acd21576256c4f5c076f8ebb", - "01a50a55a8d1156f516af018a492acb45c3ad919ca6c79686853f244d134cf9f", - "a4a1444e1b9196f385216e3e8e30560a5762ab387aaf076f6f5bf5eaba837c2f", - "d6f5fded67579d6e62b22288fc62d362daa6a6bf0eaa0d5af9f38ffccf7e7bdb", - "513c3ed4e9f046086e8c22cc7cedc594386c9e7a1667a342d92196d5d3adf2e8", - "b56174871413de2de63af465f63ec191085158cedc89a597f298e78a1f28b0df", - "ce27edf4d5e0b1a80bab8d9ccdc6c415ecbf00b37fd84538c42d838b4e0da0a3", - "db80fe5258d4ae91c8b4a25dc7f2722b65ffcb1dbf20676336ef1252c8e635d0", - "01194e437c8fb20b0cdc2cba3ef9cef6542f98e1695f25ad6aad3812bf7cdcf3", - "7bf9db99ab2a803d9797af8f8534962aa47de0a127d575ce9a8ab48249513a26", - "b6d494bdcfb0e29b1d35036221affebbd2d0a3a58510151fe1b9a0b33bb0b313", - "6c44e13fd008fbbd1ba47391c7739eebf97f50235ed8ba51ce60b9cde61f9f70", - "237f4d34f3eeb17d0682c6ab694e2618e2730b29cbdad16005731ebcf189b505", - "5cb8ba86f237d445c617992fe62f488c611d72206c9ac7d3abe81fcb1c68f80b", - "2ec086ddc9fbef6fe740ceff1316eb2f8284ac0abc3ca448e785b19123240e37", - "2ec12cefb48773bfce8be16d815c48f77d6d314b2f5f236c7cbf66bb4d12cc53", - "c2049f388418cce46f9a4cbe75e5fbb4ed2abf8a25117ffbbead7e19fbc7b276", - "86b7399c3a0b4f5eeb64c9ba5cc8cce0e8e5814493e1d558fd4f4e90b2aa82ed", - "ffdb85a0e9a8b70814c851878f4114d34376e7dd1249b30c3fe6d030935775d5", - "84425e9a900ce080d52e49eacaf45dc403f7116b270d8d38f04eb43231bc2f70", - "d6462f497a755d0ce121debe54d784de502498a728affc4d7d19bef6d3660240", - "2dc9415841f50771d16bfbc1403a9933e3d6f069f382fcd7d057a113117332d2", - "97565143315dedec6065412afedf7c875cc4cda9302b8ed5dd83d89f913f141f", - "410bc3b61d2a341ed9c56fe2152491ba7b0a596bdac4ec025519d0f251de048a", - "f13317570093364dcfa9b6c0e8b65bbddcd9ba059d616bc098652db1015de889", - "88fd1e596b8dc949596780159892bae04a60eef886dfad2b8604e8863f520c61", - "c181e9f2ef1ae25cc8007f6e8d32067640deaf3dc0f70b66c2f25972ccd8cf7e", - "9a22727a0a6ad2294fdd77b20cb17d2d224f97faa8d7e7d2b19714ebf39ad010", - "a2b409c8fb41d7dc2644cc40abb0fd6246015ba1c787ed8c2a3d9a28b87c261e", - "c89c330504c6fa96f970ad559defa3971712a1fb6acbfca7103767e7e8d34637", - "01f8496d1dcd7fddbaa6e8dc576ae35d71a194458d978825bd72e6623a0a506a", - "c473e046a295939027606368362dc2de577667f4fd37e530f6fab5e14f59eb0b", - "665ca336af9f6254c882fe80089feb5a0c7d885b8dc31844abd88bb4b3e92c06", - "f5410fa6fbab1c5ed01127b690ae3c5cbf6410680784075de63b4fc2f803971a", - "76254e07f4274ee20b64f33d41fb3b4cc837a7753180e1f28a73546e421c1f07", - "065a7a9295638cc6cccaf86f8383d40e71d49dd6438835efaf6612051a961df2", - "4234280cab4b96b51daeb4917fd841d87d7acf9121f0b2b8ec7726665d995651", - "522a8d981100e5900ed395be3bb201dfd89e5dacadabd2123aa7ab9eac0b8155", - "637c85362d2ba75150beb277d161276b7433b04fd7dde9069bbb01a6222201a6", - "4fdaa9d4705db09e4b5245b95e12ba3e60963191f47b131560130d24a0485f2b", - "b8a2700402eb9d884f83d6b5be861f7723ba6b8ac5082e5a9e6a156b7a91b018", - "2b28d1f39b9e402db3d427b1910ade9b170b9ea97f99d3991594a4181435e15b", - "469ab2755a1e3f1faddb96cc5cb355afe07f7233f4f0c2ac0c6b4998f81c8a4c", - "e08d82ab56d0c73f9e3ade6bf0db81b1f4605dbf89477174d8ddf10edc6c06f9", - "d68ed3817f760c6d9be1921cc328f10f6c26444c5a87879a9c3b8cd8a4e82d02", - "eece92adf40c9eece2ac6f59c78f4d104f668110e08aa51abaa270995a7564c6", - "e1f92ffe86fdc8c8554c8bc8561dc04b0c2cdd0a2b7a0f46a1a27a81202fb516", - "b46033951ede334b73457f8eac6f56e64f7db2a6f1bd891a8bc3f51abfd37287", - "e87fbe0b7c2ab1df4e292b732909e9ff8ef89aa3cfb72c984de51604b5f2e24e", - "cb490c43878a9b1690a7553783e5a16620ce0da1dee3ed08d8a600f52be916e6", - "0b08f47e6af3fcb6854403488138fbad909eb15e0fe2f9ad6694e69cde873db7", - "b2254c0ff51d26232009bd2ee61fce3b4f1ffe9e97677772670b9b951150fd64", - "be53ca8b9cb0324e6fc1ce946a26f4a373ad110db9b73cf13933ca827e8b6d14", - "a307ae245c56f41a083b0ae95ce7b8ffb89f62df29c599ee950bf2a4ea5692d8", - "79a0fb58373c664d2dd87f0445183fd622b14d0aad70d15c458fe41f075a06ff", - "90fbb89d6580912e6834a4694676e2896cc3de448ddb09684726ff1d8e0d37c1", - "ae696fb97197b83e07e8b76555f9838c86bb0a64e0e8a6d641be18735df8b1f3", - "c075732596e102632eab9031c1f9d9d17240908c688d672792bdab7f436064cd", - "4c63aae67cd5950e333a573eb38aa63b7b1f31a5e249ce9204688fd7aef8c434", - "3f15ec05fab78877d48bee93a2b7227c046d9d658370dde40836a5f7e313a94f", - "0541cf98f6974aa003512a6919dab701bb46b669ac6fbf971a8ad25f4413928d", - "95b104617c06750e4db359ac76ed5b3ae72606297324c0469fa26a15a3f66c37", - "f2a7fe9251a9fd4f7edde32531a79d60ff8451fbc6793a6bf56b2df0be9e5140", - "4989e03fad02b2beef7925f46021eb3ae9ba44ea348632f2c2cea96aa1251aa8", - "a94141607ff8b1f5344552fe2b8c2bdaf8cdf57289872b5f743d49655cd5ef49", - "456bca78b3d7d1dcffd3d9c30ba02dd25002fe165069ffcb4a45e1ed49eabb24", - "2f22aa2fef8ddc6c63c4c8b32cc6a3a1c25dcfe09b62eafc669d6237a9548c03", - "65342e2a78859f363c201dca11a8d4dfe34ab9b8de3d5d7e3f02470407f356fe", - "08c0425f4f7976e958ddcd5a371539755800b5a211000f20fa3757779d1947ed", - "b45ecc7e025d66676767de69294b327983fc2ba33697982da38f02b14f101e27", - "e7933e327999b066ef39274d1ed56ea940f749c333ecac018211cb538966b075", - "abf15e9a1d0e38ab2b8144b627c55b2df9383360177b6095283c59ac884ab954", - "6a0289f18a81478510274007f7cd10730112cebd3b546cf209ac5788676bc985", - "361449a014f8ec807dd7a68f1ec5be003055ce86198f335004213762e10d718e", - "7c25c6df12b1d81df574b3edd96028030509485a9e4826596d60653658315832", - "c4ac8516e028d926d7bcbc566842898bf93c2cc454d8deb82195269c2677a754", - "873e07d1877a01850cba9fbf0c5d2f65708e7cc445c0ecdda197d000a83eb47c", - "2edeea55ba2ca639f0bed7cb3b742f22657d08914b9cc2bac7f48ac514f39ac2", - "944b30928085eb8e581de9e58fc5f6b9b8af9e1010e9d2994f87dc55bd096ffd", - "662dfe29c503ebf99d85f96bb91473455a7c8f970169a44c22c1d371fbf9a20f", - "3fe054a2c86fe380653bee229e34b0613fe844548d7be3f9cb6c36f900bd357e", - "70ffa13f13946c5d6799d71dd381eec71e00dba0c8c8529158d34666ec8f4877", - "ccc69e5ba474d90a2ca09048c6e3e0439b456e42a186ef4f18212af8df7900c8", - "5fa757d4492f4f4f374c031a9e0ae18e3f99b89dc0651bae7a5945244589b98b", - "3b17b6e1db5d1315a67792173fcfe0ee0f11102d8e47944245876a319942c404", - "ac529850dd09400a78250270bdc2498c51d25a35e8a0570074cb2e0c9be51052", - "aa8b1f0bb63768b66981b7634f64cd190529ddd9a6bb658f85ceca8492ff0451", - "ce9d0b689050a37eeefe27e5ab6a4af93cf6d0a44578ce3ce048de64c65b91d2", - "ef40762a5ad7cf7b3c63e2c0893893c56a9df33e5d22911c938964c3473691d2", - "095260f13d769204258d0303c9af704e644f230f9befd636c069446177374c26", - "c8fc3bdac7fb022ce8150b2b072bf5765afd7096f3c4fe964785819d890a7fc0", - "df6f46da2010873117573f9b7669459ab9867626bf529a941e3549e53c13b128", - "d5b80cfa6f7114e671eda86b4313b10ac9ac4bc1ef46a616fefda64955514b3c", - "b66e4ffaa186336b22a06a18b51eb2778ad2873410cef69afff0c4a2e2325e28", - "629b369605bcfffdf4fa2b82dec2913f2c68ea62c43e35354e39aa8f9fe41f2e", - "fba9595f2b99678b6ff2cefcdf1892f8875832910516207043b1d88bc8b2bd12", - "72564cd9fc7e4654a29cb2bf31e6d3fdc6df7b14a2a19b306e21e85a5453e15a", - "a67e0905e8633a2c6f795356c0bc799b04e75850bdfe8474e3931a662148957b", - "4e3a50825b77dfc8792806ba2e2c065a83a5eaaa4309f1dc61ef6a49df94d3af", - "f3b7c3158f403a5caf0f63f9523f02a049f719f672cd097020b83af045a902a9", - "babe11e771333149ff3e1c2e01877d2d3ecd6dfd1ff396b7ac2a0a9a07a91ec1", - "2d0374802693bc31b8ba489c90385ec1d622552dd804c62d9b1ac17e60dfa643", - "8b39ba73e3795de0ef64b9eb3603ebf4f5a9efb1bc8569ce6907cc2616d1ea3f", - "571093cd10a39b6d8fee2cef393955c4c1296da24fbf12d0cbc5da59efc80b2d", - "7770e30c9bebe207655d092c31c300199f2b9f6afd9f39e0842055cdd79b8167", - "ba7d85b7d7b29e3e2b6d9e7c725e40fd8d46f250e3773332d60ee84e2650a257", - "c64ed0bc68c18d43f52328378da64773d68a531031a3de2b260e9153032716e6", - "122202e36aba0bba14f2c779f22f32ccd39538551bdef6c031a7af9f821c90cf", - "765b247a3cd802816ea40f04ac223573b970d94951913fe6873456e03a03507c", - "689ddc4d8cf3b4bbfff69dfdce58d54d1f720e39f06bbf53427fe717b182e55d", - "7f22af210c238a005717c80cd278e37f281b1b1e0502ab1c4ac3d0efed36a9c9", - "fca49e92e618e6dcb49722ae8744076a59d6a36f0e24efa337c575f50aa8ce9b", - "19aad0896786c274567eb767da533c57ed2f9c7605922093c7b14fbc046e8f61", - "5ef33eaf79325b3d730c4602e2f3ca37a57ae4b1bbd6bb5bd0b1253eacc5a7cf", - "ac33118f18b0388cbac300cabd506f414dae2515dbad5de7378ee3fbb2519d6f", - "4155d08726c2d10cb279e756ea8703a0a32cf36dd8771d4f877851fe5b0ee103", - "806479434e81931799cf68c038f4d83d1073c5c3d90c4bbbe95ed112115db277", - "e02872cafa3e177d388ce1291360bcece7f1ecd92bc44040e039703651d34a43", - "5800b088a2a12a3ce5e4cce9dd7ba164b0f60c2f32d41ee01521caec1e3c0311", - "7e03d2696050d406de08cc19759f324e16f5d7e835b92cc90783c2c9dc0c3f92", - "6f52498b6b9f8d9c188edb9125e4fcebcbe756178c357ede938b232527e7c67a", - "6d145011eea2b88e3a5102baf3713cfff553ce76c636f1722288a7136593fd04", - "55f6a37a7402da30e0c80a55d18b26bb0a2a98a1b3921d2b81b5f84a7ec37c81", - "6f8582eab21c7865e0b8952a7f20a25e5bb4fa42c10728ddab1f67ab0d43cf74", - "779867acbd52f52fa5629b567856519ed6c9b5a3194952423c5432965d127763", - "be9f3b331af74b3c9ee1ee224138d6ac144ce3d64a24e882c9aa08e5dba373e3", - "589afe4b45be2dfb46ca2f90694b73f688749bd88f45d1ffe986a5aa0a363cf4", - "b81722a6bb240f6ccc7eeb0716fb3512320144178b364cdac2f5d8ccb3bd31ff", - "45c240a950f182d1843d45c1d356bfa77b6abe27e9a3ca29aa3e89f7839aa39f", - "1cd14f85986ebc4aea9368e5c6e869a120e1631284b39123394f735fc8fb4817", - "113f522a507f3b6791f5c617f12b650bd5fb90d231b23943f7c0fe429531fe94", - "aa4524ad992d613307b2f606f3750504ac31f4a34010e1e34d47ac08c1b396a1", - "7b6c921053cd6cf116bdd87b01db6ea04d34f9a309c89d5cf6afa9513b58e33a", - "4a83f7d481566125eef6c35741c79b7727a9357e96d435ab6b2c1368f4acae07", - "d952e0fb7ae93ba6b3cee273c4ca6eaa6511627053773885c26ff07d5079da9b", - "cf81d77d3ea0c166898c84097031565631cfee832f547c68931542415178a7b7", - "b09dc813eb7440f59f4b5309c314f32666194a355d90c637dc23287e728d6204", - "5e1ddf92a44b53cc059134fa68eab4d078f0b2f35cf0a5bf73315c3eb82e9235", - "2ae486a953fed800418b9f772aaecdce9451423d2567c458612dc8df2233b81c", - "25836f168689e8a02cf524c9f9d7e56d41e4e9e65e26da4770f0104024fc1a52", - "131e93dbd79aa52f09e1dd215bbc43660318ed30859de0e2c8658cc1b46a3fac", - "0d29063ff88534f0d6129cb551f9633d04e0f71095c61d788868ef0f27faecce", - "442d12b7ba02e8d4ab8c1bbd265f4e7e04f357953ce38385c79f66d12288b14a", - "e5c34bc39a96b6a6d57fc8be6a48fd65abb2ab7aa568f6fd5d6fd857ceed723d", - "1b3e4eef6679045cc5ad0c2fd8ecd462780d07abc9fde4153baaa67cd4720555", - "e7b06ad5ad3efee0e79d249a21dec13c66921a545d81b2d1efba7d3bc656e9a2", - "640d4e1445f3dc8e43dc9197116441a65eeb41c24e305f08e99cfacb49caeafd", - "93563e811c6263ff765f601293e09a38ac4e56d28c6d0d9d7d3b8fed53ec8c67", - "c3831d9f7e3836a11528224aa4436ee8fc3cabe30e8fa9b81a8e57be810a6734", - "6c23ce146b8efe812771bcbbaec4417a57a36af446f979d1c47aef2cd542ddd6", - "aa0cf3f49183571fb2b826670acd07342d11bc973664a7584c12b48bda47b930", - "aadfa659331f2949b5f09ad74c5afb1ecbc22a43506673c38d79df469931e4a4", - "33aae07c3d0b651d68b69e9dc85612de48c5993c9ee1304b6a0e7e84d488ca26", - "10940e1c1efb6d5fafb83f5be34f36dbfefbee80c01f0c974e5d66a6c5aff738", - "b5a815d806d22f8b939e9d30f5fe2a962796024a80c7d1de3150976decaf0ef5", - "030a702552c37728850912004cb5e641a41921dc607b892899fd6c16449e4b2b", - "61c7db1bbc26025ac3a6ad88ea78d986ad27e8f782fea79bc6b7cdf12134ff27", - "c6b5279e163453690b2dd47d3fb25993eee92fd4e56dc1b6c86c298b1873b8be", - "728e0cb5d355100f1b2463beec5e945335f0923190a7a5f94d9c34f42faf1284", - "a37cff80ef09de219b88f53ef8b41cb07f44f0b5764cc39f449f655601e60c93", - "967a0ca53444beecde9fca5dfa50cb33ca9e8c198e086daaaa7eafd4d6e4fa7a", - "0caf4d4cbc0b261dcd0f5b6db3f7b2f9b88733bb3341c4a1b4844d8b1fbe88b4", - "9237522ce14d0dbf718b8849831f6194d00ff33084ff17729dd29f119d30f4a5", - "278b492881e39a5c4c0ea1f2d7c040e68f689a6b8fd3d76428a462565992b554", - "9d1804fb7b76462e86923ad1d9bcddc887fa76fc8f9736cd25f7c616389f90f6", - "b0eea3deef5c16ac8fbe4553c6cf4d0f2572e7d5100a54025a736b2dc4a024c7", - "d99856a04f587bca660d4a9f5cad55779475511ed6aaec7273c2c57a61957e0d", - "c19a38680593e6443af28bcdb27a90159b572834cf5e653d2734e361626b5cc0", - "0dbcd89ff0ab262ee612d7bbefd833654d93fcef7244938f752e9c9efe5b86ca", - "5033e5104a291449d952cbf5ab8d050ade718584b2e7c4a14d3c5bff733d7423", - "f97796fce342dd17c2acfaddc83baf0d14c04175be4b611fc501a91b1dd19f9a", - "51c40f6fb98683a50172e79162c6e10dc2250f884cfaa3af5e1faf2fdc8c7b00", - "5cd30d9e84a4da556cfdfd7d66faa10ed74134ee1fae4d616eca82ff3ef4668b", - "b9f3ee4908c4764c049f309516b2d6c9bdb2486febd43cf3aa179c62b22e885c", - "e0e7fa1729cd800d51dfacc82bd73062415546d81498dde20211bd965abcc1ba", - "88bab95599a8608120d03f1a142591b09d74ae12f7246feb8afee0016cf5c2ec", - "eab9138d4f78bf2bf3040a1d138abe51aeb1c4d6634ffff853851bb21b990d09", - "72136fddcd13a3f7ab194480c22adc7e8241208d940782a0baa584f220dbf158", - "f22011e563e62ebd0b3fa2db3be3cddef813d4850c6769c534e6279229f4a99c", - "50f6edbd8a5dccee27de69fed5468022a2383f33dd7d678e4c7f2c4b5fd63ff2", - "d41bf04c0e4689ecb94b0fe8f411de85f972cac5aed7dbd0754aafa9dbf0cd1f", - "047de14751c57e50409cf4b128603abdb9188d671fb35f993843a32a59ba93fb", - "9b453d335e5c8026d32901142ef8daca94a3cb7ad721608155089e75708718b8", - "0f515968a04d215670bb8bc2ee2c54cff20230c89136dd40dc004f6ed8196c20", - "a4ff56acf143f1712456ecae4ed8c24a30869d222ba43d771a50e4a24897550d", - "9c09723ad6a0052cce37e875791b5fabcb52546a50b728262c35ff314f632e93", - "dac8749976a66d9947f14ae06bb5d2046fd2466690bebb83fd02eb7cb961c5b6", - "a518fa47f217197e21d972c9208b0ff505b0ef6cac8b56411e7a667d41cde4eb", - "879104fd504ecb5cbbbc7ec8fcb06bb999f46154e3367e5ccabd566865516ebc", - "6fdd307cd814087dcbe9facf472c22f0ce76b1343664f7be31e4ed97847fc9d7", - "a9d2b89344813f386ad954ba909948d2736bc9dd207273f1b3f5220beff9aa68", - "bc8dfa606156e5986291da955aa3d925afc49b9cc14b81aae60208be1d6e1ef0", - "feb4cf72746e2bf16d6b7dd8b2d9d7d82be0c1a8b65f16f02df0ae27fde39dd7", - "670aff0cc40957f36442b32909402d388c6c6728220748c5f9be32013bf69308", - "8df66aad05244d8668c50da3237445a62f9f2f9a476d29170d3b6e4e77b14f9c", - "192828ba3465cb56413a57da0b035b1baac68ee8ed6507df991a73e2122702d7", - "5963d95099f8f28aac79ccd51ce334c87a0f2c6b89a3759eba891e535c5b9140", - "1191620ee976b6c0e264f9e3f2e43ad4e22321c687284cc1d564c731b4c4bda6", - "cd660c7956df172408946fa4bdd37701599f75fd2cbc4b0701977ea5c7279163", - "94e838c4937fa26327f0b9867f230c8c4cf1c7bf4a02cd9a0c44bce8b6db8388", - "a209e975f74012fc5ea28b281941ddf8c5415a48d72054d65a0c12dda7c95bca", - "f828bd6889e79f2e4b83ccfdf63f9f003c4d7825830b8d53603f5621f3bcd30a", - "5194915d3bc0444ec4febb5f8a5551a617c61b68bf4f1ed744f5b7072025f9e3", - "2275a22e76383750c2b52c0271b2820317a46a7a735a3e4b9bfc61952621398d", - "5ef938adf74d5c38285b66958b74efefcdd5ae3f0d55909db93a8012d66db25e", - "077d4f42478d123f019e4e87e0b0a2f40111b38deb5559dae373622043cd51c5", - "a3aa87f5206e87bbb5c71dea3cf8ebb77e97f9b80af0bdb6468a007a3f49b35f", - "8376a42885910ef56e6b16dc449b2e9592c8ce0e42c1d0654e26bfbe1f12badb", - "76de4816f7b6762dc82e166b63df34e7597582528630b0d895e30e7a919432e9", - "ecccae9fab8e185d1905d9d24ae66100de26f2b4f7c4cc3c49ab48d2873e07f5", - "73fcf00a6f6f5ea403736b56694a7283acd3114366f816437b66364af602a1a3", - "3943d9b2a8927667c66da3dd74e1dcabb953176d09ebb8570709e205ba38620d", - "8468d0df4b116ae5a09ebe2c968e43383d770920f4b3fea29bf88dccf82f35b9", - "01d597ff31e1e4f5e576d0c9f0c1eb1d41f55f1ee6f0989ca8cc1fd33a97596d", - "30ad7b691044c4f589d13cb461deef30deb14cd57ce0cf5dc89e8f5f4c498993", - "c7c86de14130d5dce52e2e8795d885704af156764253411e5b0a7c801469268d", - "c3eaa1a638d21c46d77d495c6b61d28fb97338f3d2bb6a83d971602cb473a550", - "22f5d4a9c95de58d514af45176763e359d030a0f6a8fe64bb0329293dedd0e71", - "85d5179a9b25995aff9d97327500e7b8b7ad241706521ccd3f5240c80daed787", - "65b8d70689c10844c13d2a0c4e0dbfd6ba0a816c1509c7a64a47492fe317ecaa", - "17ae89671099a5d787395b1a585e7e1f6b637fa7450d7ad706888bc32021ab51", - "a417c536680c6e7e00aff04a722dca7be71ec5eeae90a9e83e8dbb8127426efe", - "91aee875483ea3152e5ef0f56d5a84f337052302bbc4d35e84cc25ddfde0800a", - "e066c8374da718f3b65b7cc92a0ec423929cbfc59290f608f8d78f8895c8fea8", - "9af15713183bfa42e65afe0f617edb46a444708d9ff292480b81a3a65f36c6dc", - "d2080da89ff4cdfdd0114160b8763d31393740957d30b0d903b48a7f7b9477df", - "32e38ffc21f6e854d40cd93fb7d4c5664ab42d2d6f3d0eb670d911187123e8a2", - "23b0d86a7d6220a413f2824f5ab85a1f4b4f725f5eb6317e14335271766e1512", - "cef19c4e790bfc78092a5eaa774ec869b1ad40f4c58ea2497ed8f9b7feb807eb", - "642c8a451aa5eb07b617cbbfc9cf1effbe6d605634a85b4e89afa0ecc89936fc", - "e955e2110b755187c9da4e3b9c839f9bf6869db8d8c3c0e29f667cc33a3aea0a", - "3d502dd7f6f8249bc9e4c4bf21df1db04b0cc02c9b59f2c89d769cc3e195d751", - "b26247637ff5d80867cf2f7e4d9a393de3cb1d5d2604026ab9459dde32e6625f", - "ad5567c62c4497d379a0e8bb6d1c38bc50bbd292918fdc4f41a5112be85204e5", - "28374d2ef079572711af555095a91bc2ab67d2a206ac4927baafabd123ff829c", - "62d551f0ff3c81f2f9d8b3673ec630d5527567de866aa011240cf63a99d5f168", - "ba71f4340eae2b10b753d469d20b05b953bd35e6cf828e63523b3a6f460a7f52", - "0dc77563b69f00c6705cedff82e0320ad7607f518774a284e4e96382c674499b", - "722588f0284526a69d92ab5d2ac308260d58eef9096f3e1a91ec25d8c277b596", - "6c1bee3598a119641008153ed50f74b7f668d204b4660752c312737f3dc4ccd2", - "22572e26f635fccd4b7c76437c1ca7183c08120e04beb3a20f972b42eeb40f95", - "46139a557e3ab15cb36feadad07cdbe66bfb5876f38d9098ff0b160ecbfa8479", - "a7b084d4b508406d2ba9f2c7a0f12da924f44740cf441f33c67779ef47a19e89", - "0972290e6d06536dd715eac08621b1e473c417ca3f0e520fe2dc93357011e0cc", - "3c1f342d85d1122f8fb95e522af3e56250db321474503d2c5ec18c3beb6bb546", - "eae14e207a232782aa58dfc41c74c3dcfb4c793e30721dd1164e18bb318b5eb6", - "403d012987aec7df6b1b01658034da85a0c0ec4390b56355ff2a5dce07453019", - "18ec1d16f6715c9a6441b9508460c6a897ba3571785024d1e9624fa57b90b739", - "ef21dfcd9b85df8e66e078f08b5037e654d1d731c2f0ef32a24afbf96de7e567", - "8c086b6a1125140c43645d7d9c6348afba3c9eea72482b5c85e99777d6c98097", - "486db1eeb08bc3f1ae282b30dc6528237b7184df71b7b9dc3620df2d3486c08f", - "12e1d8fb3fd35ba7b1561127aea9c74816d3f9221484a3cc67089ebeb95e2f15", - "0f3ba40679bd2fbd97668a3247902630e0b17994e8077eaf94fdee80ec211296", - "be20696ccec6e0e2e47c9c0180f8f89fe817946188f9360cfafa565c8bac3fe3", - "48b59e6a022cc7a86be7a188943977d28d84ed794c7b40b7d519ba9850ab22b2", - "1502a6cefa17b873c511794d5cc0fcb1650a0027e12fd54f1b60c49047e1322e", - "bfe63ff572f9aced6751385b7696e0c74224026a780489769fd49b1a69d92b5e", - "6f66485f156f2e44e5c10debf84ff5255a45da1f1bf3c317f876f2b65c157dcf", - "4be66cfe13edadfa92b0f13a0d15b107cf7d3f1a8704f9e9b83d3c3ba8f4ab7c", - "4db781e762f5ea3e49f87f7e1b8806d1d55d8ca4c9d6043cef65bf2909e61eb6", - "8bbe17b9bc7348667490abd4d93e1d7be0878f06caa9e3e3a8a86eae90678da7", - "0a7847f2f5c98194dbe13a7b621fbaacf2e7a9616877e821d3a5d71872263c30", - "53614b648d1cbbe0ea8321be704d1c4d69e71d1f33163d9dabebf2225802fce6", - "8b0dce7934d8a85f5185f0881ab4b51dc96f5f2dee9e3ca4e8c1ca3c0e0444c2", - "ef6f4d481bf3bb85b87687d4f77eec08b57ac9507649e013281a96152256fece", - "d8b756be340872d2455c35233598e9eb39355997574b70036faf08d66c21603c", - "d5c7587ad178b1e56b523500955c09b0c45daaef6ae8c50341c104eae363292f", - "6bf6b91be51f1b2be37c4977b9146ba034d8909568b1984d89b5fa12f72b73e2", - "2a9f75065f56cc3aae4fc75b72cee653cf9d5949bce1b27edab3b4df26f18d8d", - "cffb88d43eb8b544f0c14c40f0c64e05c862ef207cda8c24c21eefb34f27a695", - "fa45e419cd6a0329903556d3b370bf949c79e810911da3f96bd5f21fd8b6c4ab", - "4a19fbe48d1a7cf332569348f3498cdd6eb25bc21ae0cedd1632eb5ca5be72dc", - "255303d8dceb8ffc9b016b4c8e4b1d0f95deccdf4fefb89c6ac26e63162fb4a3", - "e35b801c46cb2f080b2644d5ba0451a6a91d2a83e1cba509ffbd773c3cf44a6e", - "956ddf5e74c6145521a38c92f19c7f355fffdd50a49201abbf91f2b01d13e383", - "02d6cca6603700bcc7a031ab85967c96284c346e61c0497900349d46d4aad9e3", - "d9eef46148ad7d565e7edf1d9081d2e73918456ab1820070681ff46c697cb9d5", - "1aa51d59860e319ba199535aa85f470b97912001bcb07a4794e578bebb9391be", - "51e0a08e12567e1d8eec067d6c0077e4941ee2751c224d58975e43f226ce5c84", - "3d016f8976840228fce040e9267b795e98cfed6e3f28ed36b07fe61ae6bf8c51", - "67cb599a955ef64e4be14adfb16404b038383be0a4def7ff80e625088ec1cbfe", - "3fd7b2a9b55b91166eb69154ba749d9346a3914e68e41474ae723e98bfb437a0", - "90ebcabd8384592d9f3ae1c0d90f638c9637a4671b012d128bb5fd67592dcb50", - "2af0a848687f491aa5feb9a448df787e73a1938717e8bd104800ad3696c212bd", - "90e5a1142d6d20220a32f655b55be3c2221d5f859d0a9d659bc3354be47cd412", - "4f89ad7f47797d1ad202ddd3d34810b0fe219848d67f66335e38842c786692c2", - "4fe2f59374624de8162f0ec843a8b06ee5837755b352d4e237c4842d595dc7de", - "3a7e5a21109627b8b0f0c04313916f8de2666c03b3719c1917366a7dc523beee", - "9f2f8fd65e28e2d1408d5ed333adae332ee1d70c15c53223fdd5e6f0c3527f42", - "187a27d7385c26bc8f8665717110ea6fdef23b086bd9eec64075b29ddd615c02", - "76a0baa30987ead3eda269ead11b8c7d182d79278cdaa1d9d8f3f1052fd25362", - "847c650cdf6451b57a4ac6245c892dff9c8d926f645603c8240c9c6d7599a200", - "a9ba4d065cd14086104f1a6a1cda6ab6c7973645ccdd67775e9828e15941efcf", - "372df32f4bdad8945c73e407ec70a926abadcfdd939920bc5d10a0f7fa12e353", - "df397dfe103cd27f7cfdaa7961ef463eb7fe7d9d976495c84835d9b915946a24", - "9589d455696cfd066db7b051cafb63dcfa1285fd9490ecc3175d185c4bed0f76", - "99c8d54393a42c967d889dd65c2fe2ece31cf818ff52f06f37a436538dfd1f3b", - "b130e043f58367ddb6a97b5857f4ad83b9aa0a797e9bd8950ba27de60960b96d", - "ebb022254d908a18ad1a7b2495eb5be468ad5c6345ea0d4803f0104956d67533", - "4f97b84c13039b6ede40a57f50ec2b4f6242bba48a023d031e3f2abffe3b4e50", - "7e3c678d9218625e840e5b18f6fcfafe9b4fd2945dc367b17725370805a257e5", - "deeb907d6072ccba6677160fbb886a15b223713e793b156207c34efba50455a8", - "77d1609bfabec2b25fcabff9db0c09732c84580e7a4953a219857e7f2ccda176", - "907d5e14520ad5c4db059341bc89da8b667334e113dd458fb89ab4b70c40cc21", - "08d9dba1df0071e3ad96224d851058564c7308ccc7b924c4bc52b8d5ec4e67d1", - "ed902671a3aab6455b3ef682b6480ffbf0249fa1660f86dbe7126b5739f58415", - "c4bafd71f8bbd9b9874688d39419b1fa80c9d60c63c461ab59554148bacb198e", - "cb2f52ad3e8ae650f45b64c74c20939cd0ff1b2bfc943f50019b68e7e73ab3f0", - "f230bc4124677a7e88c731d0386dc1b8f1a1cc61ee6676c9b22a8f0725ae1f8e", - "fa5510e6139376da6a0977c8b16fd9181a51e09793e1860360c9a6c28a13b67c", - "b0e54f8e5934bb7938e7ecb61feeab506bbc42b5aff90dda15adb640ad181866", - "5bc57ececd834f28929795709cc5dd78fdf97cdaf8a3ba75d33775f68c54deee", - "a5780487a52c3aad9cd9f3cda4350413b085b6a77651c1f379716aead09faef4", - "c3742c7daa13e06795cb567b20951c5c08f842a4b595d94576a976d2eb65c2c7", - "685f89bab07f16e9e26e920bd9d1b8677026fde77105b5072ed1f0ce4e7ca39f", - "00a41af01e69eb683b4e91accc11053220a951296c74c9a0bcada5ab05c79068", - "9b7eb8d9c3679bcc1c4acd74d90c83790879c7d74d7f7d5caa56ee829e05c451", - "927f4b9d9fb6b71e2b7a5d8df18ede4b027c1c6ccb3fef8606409cd319c6a011", - "5b015d6ba39bbf221a3be94f03fac2a1bb1006a94ecd27c7d5999c3dde372abf", - "70354664591d164cf176254cea3edd53a25c3e889dd906ce2d7000c109aadc3f", - "70c70e9b43ac51c083c8c371f1f9ef96774137021519c45a7c48a0eb6ca41fcd", - "94e8dab542d4c2c981f71c418565a944c09b6f79279f6325b359a1f578072a38", - "5cc6df4aa5bfe7c39b895ecc13b5e860c7527e90bf55e1cc757d07c4568fef64", - "6e6812376a91e1333b90b6c0e68dd4f9ee6c8353c172fdd0d6f11a3654b2f876", - "8a4c0121feb994590e3f3f4f3652e9c48b7ac4afa1c1ac7de099b1c7a295ff00", - "04a8b09dd1b66c4b4eea659c5eed4decb0ca6596144fc160aefbd14c8d1d3b9c", - "b7aa9971f62a7841f4d8988184da4c18eff4e3d29d542018b38f4bba65999cde", - "58dee38ca1f2e67639c9c3bd9fd111074855b3cafb09748a26d056c1ec7892ee", - "2e3a82aa87f4d83d4ce22503044bf96e5045a01b08a580170260f1565ca71ee3", - "eb39e923ca3f4500af14cc0ff80750dff6b5c267aa09ff80b963c45cab88546c", - "832d7a952529f79cadf8660d234a2cfcf98d35062c9ee34683306501faed9df4", - "595f2370066c6e489cb4d3c1bad53afb5d4c2203a9c6386eaf603f5404bb3b73", - "1bc55a1df8b3b8a3a4febae1c2c3bc5a1cf824dacfc57eef9e3552ca89c1bc43", - "1bf8229f122cdefc6e54274b9fbd0e78e28a30af2291d9cb793d7e5cc0b6a74d", - "b56bf8d87dfad43f911f1c8693dcea3c560ff11d67502ea62d33f6c3b68bcf53", - "5b1a8e4c50ed8f317cd3097cc57aa0a611c2786bb9a16f1999387d019b725edf", - "8efd9e6f441ed352bb55bf6e1ef7e602196c29a52967002352fe53aaac9834c6", - "bc90ce0bf83c5feae495228d429b85ad4684a39dfc360d502925e95b3d591fc2", - "bad2d3c33824dac991d433ac4126b6180408924a5237b0f07021838502f91ebe", - "fc849a2f98802f657d4db8b04fcc75cc7128a71b984a088b830691067c6c0930", - "305642e2fdf313659fd06cba716d4926699489ab8933858192cfbd5560579c83", - "9cc3c1638e4b3a86febff05e9afffe21a7e673afe5ef1f6b54a078207504c0b0", - "9c1cf524a2bda29f985a694b9d90e6e44f620cc5f82a96dd07947958abaef24f", - "8abb9432156d894797dbd520d5bf568b87ce9f2136da517301102e2c34d0c297", - "9a0dc4a7b1a3879d3ff4525dbff68f38b715d46ecb50946bfb9c923d303c7145", - "d84f78d29fb872e0b2d715aaa4df0511ebb82ff5d53933c77c76b95c2d39fa46", - "72bd866c8720717d7e470c3bf82b3c8dff19e09774f1ad2b47b8e220c32f2b3a", - "634315f4b6356bf0d85de061e86065bfe3b067f521c55296756ad40cddb92338", - "521fbabb510eada7f1d5e904b539acc52a8cdd28c6702ff713465b89dfe38c79", - "f98f185061e6a5c18977b01b0effe29fa95d0e29e3edeed0725c722e81650f42", - "f6bbb80880e0db730bf24c656822131e6ef8347c7a4bd534b93e9def4e6df3b2", - "8bb6abc00216035a308f38a9950f644d30ac5f07a168d021728d27166a094b15", - "1dff6cdf26c7a665196b25ccb50622a30ff9e56385bdc8e419e6e0245a4ad260", - "d29eb2cf8a354ced3a65d0e96e30af87829284e146fd6d6ecf6baa8dc03d71a7", - "71981aa55fbe987027132acdce2182fdb3bcb41d337b4761edf2843797cc50ce", - "7596b9f307c1fed7e97db826228087bb68004b4b4b33d412b424fc02332f771b", - "9a246f43bce54d0b56818c1828f69bd775c746d0f43c1f0dc4a1e40c72e1976b", - "63bd919572552b9cc84daed74c547c7d3e2f0ae58e1370cdf47f691539130793", - "d280a808df637a58eaabbc2620e4e66f3b0c291505bb01bd42296155daab9854", - "9734a07bb594d5e447c9a86ab1346a822e045c80ac09d25ef246bb9be1835ba6", - "8e743dbebcb49f07bfd62f178f236679dd0cb92c721466971f3fc6eb4264a182", - "cc8a7bd9a3f8dbd5ad49780e11d43ce555659b79e501b3427d7dbdc8ed03536d", - "110befc1ea717d9b8f190c08f5037bd88d8ef72c17d8669ef3b4b1200cacc3f2", - "16655177bc793697a050bfb622dd2a9be406e43845cc7788fa973b2c9b9dadf4", - "6f2f8d2d16f48110dbc9074b424dfe3b81a886adfa84546dce2497f82f00bf88", - "f6959c501e4cccda0fc9ef476957bb8ffe583973af514e6e0f62a93a9332fc92", - "4248c499f7cc8864b6e73bf2525300cf2a9cb106cdcc93da677fa7b87f4777f5", - "a1dc7509488a3642e96a64c47f743fa638c1243e01a21e723eb3cd4de8ecf8ef", - "c08bee9e08c74bde53e875900764e3462c2225bedfe77208d2ad6aef0939610b", - "c12e1bff89a71d0308f86e2704fd0388876df9d1fa5ed69d36ea9cf836f20482", - "ba1f900cc4c7f1c468eda0fa027d3e6efe10b969a4ebc63d4d930b5beb027bec", - "a8b3d806dbe5a9a02a6670f0792ad5613f33eb364c9dc71e5c6a22c4f756ac60", - "d4513e4d4eebac8c1600c2339bfa615deaabb0e8ee41cde5ac4fd11617e5baf1", - "851ff50f307bfea53fa2840c3d236f666d69bebe8408a8c948ba9fadd9ed6530", - "fb729161cfca2a8a58944458206a4b4730f7b0699b9fb134970d97efa71a85ff", - "d16b8d09f202744c527b4b3486fa6be29826fcc61e684e4b2f3cacd7493a0c07", - "d0179f9cc39e884c26dd1327c6ff78403a94e40027867300a2f68d843ad38639", - "cd5c4df2393249b8a482969e6502c6ee746e8aef620a48106e8324a61bf0d13a", - "f90753462293420bec4e1b3ef2f3ba2f840a2a3dd57c447866f8e417fcafb447", - "bb4b5f52417ed864912fe7f8f49218a381e8a7677e90c6c5a81886eea7c77500", - "3293ba826926f9aa2c743be46ccce4699d0094b75c91ae29d504c37bd47b4626", - "33d8db0a9e740aa723dd7fff19cc44413599327835270bc0e38468e8bd31e2ae", - "6ec4f5ff93d4ce47e11d668589923f5db8c30f9a7b11788758c4dee028f3e4d6", - "8d1c3adbf0af612574d16ed40f45c3860e55d9de419e99e3f3bcecf2b9baffdc", - "cf19a2a1f8c0044d82adcb6a6a789e396f687290856be54c2c49a43d402fb26e", - "ed997fbbdbc537c375e5f48e2096f5f2f01c02e64f862797ac398bfae40a5f23", - "86965395b2e4e2b33279f737eff03284b8c51cf25888bbe98f29efc51d1c91c2", - "b72cd0390da0553831cdc89fb48a090694dd755528800e8f856207e142bf8e7f", - "bab469c8ada25e2007ef287e4ce36b4e7a29d6d7e7763cf66c0483b6b619e67d", - "e7fede2e1403df7acf4965f5fe08a18cc99bcc0e9eadb3e2add3fa0393b9fc5a", - "4bcc0a07ab1c04fdf562481749dbc7334be9bb2fbfc888cf5392543fa787147e", - "f1752c9f3ff6ac5207bbd20f3c4f6017bf7be49279e168b10c867943cdd47d5e", - "f28fe83d23569bd6773cf2ffc9e8698513b8e78b08eacd27d8ee183b3b7c9061", - "1f69913bd34fb91634cdac6ea39c3cc9ddd6176cf95950d0bb9d0e7971672af2", - "88cbbdf42248417104ed8dff496083b9eba1165789f919586e695938c733083a", - "6c9938af1541045bfbaf2bde1debc0343e2aa7b94031d3647dd31c220361e5cd", - "d60b7446cfe81b60441593a9080856d4a27da09adf82268dd884bedf167ed434", - "634746185b0e8b08802789d4d06794b19c96b9c50029c9355bbcf0fd727a66ae", - "36fd3e6acdb14826e403cfa1c9d3d41401f23f0fc0a5b5508024d9dab49387bb", - "7ef8006345d2dad6c474eb7cdc6d3ada40e47e82198e5f74a261c82528086ce4", - "d9cfa75bca156b0bf53ca0bb4f799506bdf9014fdfe80403ed3f46d0c244101d", - "a7551b4703128919f7ebf3ef8d2bf40963f9a02c5ed4c85d486a0048e97dfca4", - "7ce062cbba68af98f78abeedfb203c8990ceed08fc0666bc143e7fae26d42942", - "0ec0a85dfd04c1fbae43e36327496892788f435d94ef9b9cc8187252783ee754", - "6b0f7747e99079f1b39c6859159d580518022d3a5c3c7a76931e6231383a29fc", - "cef8022cb53a57f296a12ab893cbd76bb56f17feb860787ba65e8db0be2e410f", - "b4abaa4c8dfb54188e82b11a9eb71a2f76411b602e8103e65672abba03015c51", - "4c5db6387fd544eb20b1c5400172cbec481730ae5eb63d2b8a8d8f4397a2b6df", - "bc54f72de8a96ee648efadcc9d189b370c61c3f5e598bc85dfdbae4e4d73c654", - "3842eb5153bdde571c3b9d3e716bcc00e43f759c15ca984107f1214993393b46", - "6186176dab9b55c3323314027fd6b9b282628440c70465657a2173f168dc40be", - "c0cddb8e66c8e41be9959c42d8ea55013f8ec1652dbfa6f06658a502ba059b0f", - "91675253d7020ce4915523df72b14eff7c3c6be16025e7f25b669c668a3142df", - "7afaafb87e5c0f7f208f970d5bada0e0e4d355786883edb2192eebe78cc2257b", - "eee78f54778f5075a200eec83332cc53baa1fb4e9f242fa44480d3444e4106d8", - "82774c61a5eb0dd3eaa4ca0f7beedbf4d057b9df248721c6634526fad928682d", - "9ae8a287c55d4e93bc7b4eb5216c33c55c5397125a9edd77b8ee30a4ac29be31", - "3fed1ca289c882e8ab160e9941969ff67db764ccbc5a4a87f1fa39753edf0dd7", - "003c981fe9f1d81eef14b10f94917f7a15fa2abb1d42b0fe6833002dc3e2ccde", - "a8a9bc167a5dd88f07629603673e5454c578c871035a908336ebc960e26c9cb1", - "02ff36cba7707ce8b024ecde24ae0860d64cbd764f07c1613c314e319e698bc4", - "df5df1790dc96106281bcdac18b80fb6697751f0adc580c2f7ad471ed8fbdbdc", - "5e97aca8cade373e8d486f49a3e4737c704694de574f4c192aaa2cbae89ac685", - "7a7b0d84fb02830a1b74334a9632083bd75532516d946cbfe4141e2cfea41fdd", - "7e447d9ff81748cb75a01fc63b69f33855eb0e025c60eab6d1bd024ab6d147e5", - "001d6e31f60931e88cbd00ff61fb1a9b0dda09411603581a9203627ec8c69dec", - "51ceade80aaee4322641d884309a62d2d6f731ad6f54a2fb2f4909b13ed7a9aa", - "5f9a72f7e1096b95907212f3496cb9f8534d0f928812980a2a69e7e93d19eb73", - "34b9892c2c3673d1e8e5a94f2f145096d7b1a01b8740d8010c212d92bf0e39f5", - "9b6bfec9bba91cec9886f76ae6e64b267c4b095aa097dd62b978f80366bacd87", - "f313a99e4af10d5cf72b99c088db8a3611a85526a222829cfa197e6d6cf3948d", - "f593186ae04668afe869c50f852a31a06383f76403358810b6d307f377d1a200", - "1d39eb5584a68cebb4b9909efc5c36e44afba43aa0c0bdb7dcc966b9f81897a7", - "f7e719e8ad5c625dd1d56540c8e3df300175386c4019aac0da0c1179292de6e1", - "0e749dbebf64840db13ee184d8ab67285a77f9e277d01eec9b5d4d074a4ea4f4", - "41a300e53d30f239bfbc8e79eece9206a7cceb4b28630e7c14a5195240dda052", - "0bcf5e59649bc9b800e562aa047832a66cc14f9738d44620c71fd2b79b9619b4", - "f0def8a93122d7e641c077d51cfb29255d520cbb67aa30a1f17e479637d58bbc", - "84ae73598ac9b2ac489760f2e85519e2dbbf1eb7f2d5c108654d16ed9fce2492", - "9c68d2013d1f33ec5677e814a0a368e81338e69ba7ed61592e0c575420408986", - "5ac9bbc56805bce4fb7ed28dfb77fe3737e94b9074d4fa932207651da5d95ba0", - "c6694b91123d3dd76d139eb6e881862f7d4b374d6ea3e373e85a9f58049b689c", - "b8b8046f9a58610dc7c795aa40a3674f805278f2402f005fc78970a5503ddc6d", - "b396e149afa6b32892a6ab793b83a62e1646b8d57d73733487cb0580be4c7dd8", - "98884143c6f3113c36b830337b0e436241fdfc356ea43839aeded3dbf9f86752", - "562340846f5b483eb730afc6ed1f37fb22c5932081d8662cc37db551045cf120", - "f5c1d36ee0cc3bdc20e88e3dbacaeaa17dfaa46fc13f4dbf7ca364baf42804c3", - "7dd8eba8b2f68544134808f60b7c41e1b7f2f8df390ffb2f1640f5480215458f", - "4b541f2086ce9f7fc5cec4ad723938bf2239bcdb5d608564639d61b8c169bd3a", - "483f4578d1c8e237a4ce952e2ef7c9f131e39a7ee6b78a85b13a8a476e69df5f", - "519554164f11610b825cc2dfaf552a72fa922b63661344df32010001ead131c0", - "c71c0fe6e9e2e60baadf4df1a13025ed5c2d6ad8635882ca248a2a555bbc12b1", - "2cbb0d5428c11b1ad8aa59187b8adaf0790b28137051ab8231f3fec65d814dfc", - "5b5473967b9aedebd4e805838d4c5265c9157b39035b17904875f766f1afe53b", - "b2e4dd823b55a9668772d66673030ce87aef99ba710bcb3630a30982ebfa16ea", - "2fb112e24d9c133564bb11ab3f026ebc3f140434634fab7978cd242ef3caa7e6", - "bcb7d3f888478247a3d73a49649896679b3c5a72019fa99284812caae43c5dd7", - "111668f15ff8435763730c0faa17ee0fc2b6acf80fa8b495b8b2b7be6bf1699b", - "4628a8354b273a333aa7caf1621f7795fce8b767a78dd489151e6af2f7545b6a", - "6a56d9546a464838db35a3624dea087efbaf7189e43168b8cdcea24434bc229a", - "1767bc5337da67f384a79a69782e273fc85f427ddcfb96259e63dbb2c3726b7a", - "34017993499879fa41363528b25647cbb2a93505cbb9c85b32f057a1f0b27e7d", - "6f87e710c814c614f71934ac6567558fe67b6b6270ae9fff369e66f5a12ccd71", - "6a5d3fe5c83f0ffe3f1a1a5b2312dfa2723ee5d336721885142ff8c737a1f545", - "d948cb9a6b073416494ed13d4a02bcdacf2e05513992200e4d254672a0479512", - "ea25de67ece23d047ba518d94e8b203a522337106aa22f28330643fb23902b9d", - "6fd805f4a7f0e6be491197f255c2401e65cdbbbbee63cde2dc527deb3f611480", - "0e5aeb1331e4c5cbd9bde9f4e431705f6a01e1ae20f35deeca44723054bb12ff", - "32d89c73d1fb6f790a4aab4534e7e00b6ba8b4ca3bf2698445f76a3a2ff017c8", - "250a1a0b9838aeb49a06d1dd6c655291b5b28687e607b5a109d376e81d680302", - "b7d5b6eb612d0bfa820d8ddf374e7861b5d6865aa73d5e8557d2538877f21ac0", - "ec4b0142923abd2d5ade6f087852590acaa56887aedca00f624477fd20bef1f7", - "6b511ced43f9147796b58df44300dbb1f409a5646c65c6cab4a60fffc719b29c", - "4df09d7fa2d3396b9fed4dbe2435c813533811a6b404e0494c14f8ed9abc81b2", - "9777058544a34eb65d5a30c17bf3b47c3a1d19dfcabdacbc3fbd6228ad63d1ae", - "571790ca8784be17c7a98869381c1d6c46b1f2f4f09f03adb26c8aa07e33f3ac", - "4c907b1b3d7c24b2c90c88713f2fd9f301c61e1ef0242ea8ae94e5f9f8b6f36f", - "de1274e86b6d685d6f50fb03e0357bd610a54a030a6a15234e11326c6aed1625", - "b193a7fe8b324dd25bded0065aaab4e85bc7fb32837a79c11b32c49210aed2f1", - "c2845bfd74acfb2032baccafaab9bd39cefc8b568a38163c0c315c684af79ab5", - "ff05c85e3f440e9c34548989b04115ab74b9ff8a6010f6ac7d9d2d9ee41d7753", - "598ce227d8d0d076cb8b891f87aace656144dcb6a72e805100d2f182e7f4659b", - "bb4e80e7cbb57352bf4d02140ef0da96d04d56d4b3b7503b83feb08d9f270052", - "e829a973f4aac3450fee2761443e9e36d32bd0732c6874b783be046c8044ec8c", - "083f8f5e9859ab109e092da6afd131950065e639b9a68ea1a691c7cebff999fd", - "9bb3d3717a2691da035c0a5b7ed05d204dbcae2f86ba038f4e92a8f058993d48", - "89be7c823d8b1e9dd4db7ee13d14e81b056452f886b6688c8eca532f1f8a4cec", - "469416bcf3afbb1ece68431d138a4e1b6e01932fa6aa1ed267f4f7a674b7ec81", - "c5931c1e683b76ac7d051d1572632b3b2016617ed1caf133c8b7fefdf6aa1ead", - "26f786ae0e9c6d5c1bc71b0cb619ddeefc12c5f650ff20c46e50b56f37088001", - "eecffe6a788717003c205b19cfc1c302707b410542e7ce6dd4c9e39c0cd2b65f", - "d17f095fee5d06a41cef8b285c8a9e13cd00b052a6357b4caf35f9ea5641e816", - "5b61b632e02092181a8e098687eaa0e2c5cfbf8969cd53e69d936851112bd0ff", - "5156585e077cada56fe9e45baca76a04141d185ca28e6117835bed95b292b63f", - "3806aa1b1980459d0e89a8cf0d0f5dbf0bad2ad08b5118a91f502a6a0842b2b8", - "56907102659bc1f1db2547e18ec8838794ce66e24532581cbc9d1e3786029e5e", - "fd482182cac372d52d232f85bb62a705dc55241484ee439ebbb51042a9eea08d", - "f15012a24ed0cd53b2a8df6afbd656c2c9d5ba11f3118e2093125b02326b2407", - "89c5f39733a663a59fe598ac019b71e642d87a7a4a490457ffbc5452594db09b", - "fa5498f11e0da85369f0b016cf729c1d00cdbf260f0246327defb4eb65df9fa8", - "976f52ded1e4df7419f71b671df916c2e98d4429404d6680f9e50d5097bb0067", - "d016a50e518a57b0ac5e40130d0772d02a34653f3e223d83cf805d8e9e599951", - "ad8074b046d1fa7f3f5672eee0d93384b7b4c5c5e62b0f0dc2e461ccde4afbc7", - "d8d42524d3c93b34edc4183510f5aa2f6a2fcf668148ffda3a22ad53ab8ae262", - "96931fa93d740093ca4cb46c9d08815fbc2f713a058587db3555852bde4e45e5", - "a5d7ce43062d11e7fb11561116a94cc2b2227797c2a2dab1e266bdff073ab66d", - "8c6d0f8491ff6157cdc20aef715bde3ded50e3a32fc59fc6b6f6dda1552cb5ba", - "5be9af47c453380dd948a0f532ce46dbdbdbf6792a4771bfc6eb4f7301cfb738", - "e7e44bfc6edffd6761a63b1db1c30ab6fde3858b796d682dec95e493daeb56af", - "4a4110afadf727b4f43be8701f80a39b416523824840ea4da50a1802e0aef7f5", - "e39941e9b2aa04c586e81e013dcea707286857d2f170a8567feddebb35f01668", - "a98fc6e33decbbb61a909dd2814f3b9b3f419eb0367c78b71f04f5d465b819cb", - "5a0b88173e55f1aaccdb9641375da31eb8b32386d2a849f5fa3517f594f1e2b6", - "75a746b9cd0db6ba1bb08b0bf6f96bde2bf6a86087230d8e44bb4edaf9f45060", - "a72773e4d997a34d98b271ee32f33f5eb866f51a6943a26928bf3c6a4bc402a0", - "d8c1e72c4032671a83aaccabedd24f58e2f5cbfa59fac9052efab2fc3d1abef9", - "f622604051a6135829311f3b0da9fc91d69d84b776c64efb5035ca84df9337c3", - "4c07a791efa2047ec877f4c5f4f22172c477e6a4053480a9816b5973040f7a92", - "7611b10ce43d8501f41a545b6041c51b4422a0bd27829051de86f0094d768fee", - "db7d449ebf7d1ccaf2ad483cc7438586d678575f9863480ffd04d0e3c37df2fe", - "11bf295541e4a29c358bb31ac955ec41037cf5a824f40c554a84e5ecd2f05030", - "9a229266f146cd80f34e66c5a5077261768f8c453df0962afa2ec7e40ac07307", - "237f27459a878a97fe80b411fb700e81c6a6933d3070ce7517fb21066da17366", - "01a862ec4725b1ef2b4516c0008483134d46e60056df88849335285f56d00a55", - "f7b1c3d9b019a4580d09cd4ca1a14f7be7c12b10b5cb5705938b403f672a81a1", - "af44b5ad09f68a96cc458fbf38acaa1f50fcb14c50e5dcbcbcacedc1eedc097a", - "bb3be62c418c9ade1a36bac6f01e5fe87ee2cc2dce408e1a965eb3032f4f8d5d", - "b654afa49a51f6768a6938166f16ed8c22f259612cb2f07bd1ebc58f754c0d9f", - "ca8447af4f9d860c6121a0be3b0bd088bfd6dc42b7ab437ce32eb143efe5ad78", - "90c3cf1c29160d6e630458dfbe02387732400ed2dd58d4746e7b4c89070df7db", - "181949e4a19d4877fd1efd367cb8d2afe6e72869c913a0b861a250303c9cfbdc", - "2b3f92f8bff83174a57c21bc6a31d08887c0dc18f7347a589eacef3e1b26f052", - "a39398798000febab11d73c7138d71d295cb0e4a2540b0cb2509381f8896dfe1", - "a9fe04cc0a3bbe77e8b07616f44beda74a1ef478f126d1a0546c4320620f3926", - "abf59b4a7a525d9a203a7f3e93a9ecee94f4307c1510d6e53f82909633e0a1e3", - "90b400207dcae5dbbf24e474713ea34ccb0514a2f5c7bba2a82ece0e1a5691d9", - "3f37e1f92e39daf008a84e28014aca0b3fb24ddaff66dc9b4574002c2a17a983", - "8ec91ffff6d2853182238dc4a64f249197270219f3b9c9f255f33f3effaea935", - "2fb33aec3f185c2319fbdd7dd52a60318ae02ee15a4e42875a7cb65fb4a15ba6", - "82b8a9e61fca32e91a6cdfe0a5ff6ee7722e9acd7e7c7170bde13aae22e95bf0", - "7bd1881acb9610b43f4c664fc8fbd9d30a819ccf2a925fea0cfaf92ba84a7c27", - "fe2a8cf1768b484f6d0c27c5ab8300c24f07045642c0728404aa4f48517ffdbf", - "1d8ce77ee16c864544acdc326840af349085d135a757d2207781ec50825bc6bd", - "d904ef3989e36a43b6948a1d68b3940914598749d1e1952fe224f158655dfbb2", - "688a7ae13c310de092030a5e17de8fc16f7dc0ac7a2df36cc64ad7f2935b0a95", - "c3026ee7aef80ae1417cdfc742b35e2c28433357d5d7f0be31e6690df10de437", - "854e6e04aef1db3e871e8863c48a99a71327e90414da056f9b18edda646f3e50", - "b4ce7d966b99688af25aa5891478241b6eec648406c95e4b2b4eac504d76e87c", - "63c9b1923e1623292522b041a67f146f76ccfdbac1fc0a054fb44d6f9baf0465", - "978de2d07578f0040d76d5105f8786afccccd29f2c409090d04542ca9113dacb", - "cf18552ecd5c0d0796b0437aab69d28f4ea861ff741fce92fc1828df1c22eeac", - "ed85490daa9be4501c6cb8818ca47f4a03fc4959c2d3deb3b45fba9402a7077f", - "d4c7576a4fe4447f638bbe31a6f263a11d71ac33677d6d97466e06e38d50584e", - "33a4b55a6a06c9eb3d7582b492962cbe92ed2e8980f10ea622334b8b364afc0d", - "549a167198107e220c5095ee4c5c490992464b11aa5e734f5793a1e0e930dfec", - "0362adf64b802f23d55de1546cdc18ead5cb72657c366d0aad6fbe86ddfccb5c", - "b7a67341592bde4656adf2f79617ae28f5d6b9a65c21e2f87312b3b008f38656", - "cae05a857a9f9de5542bdfb4e1e77279e885d10ae47af1ae821877d981439695", - "bc971e3e6f91a53ef60a8e2dfe6a3294e7cb24487b9a02dfa7173b2557f39eba", - "5be704c9f2d3f0f1a6de370cb4d995e82890f2196de7f43f528b3da3be3ec725", - "a69973ee54fe2d176a3838c6d209bdeb7c2410df3ad8fa97ce36526350840249", - "90baa1fdacf4062e07731657e1fb27969f661c8039a29c192cc466ae97619673", - "4cd9d044d6141d6580e17c618f171aeba3942092a8bb6b85bc9f11c61a2f05cc", - "4390a178a14356903bdad2f65ba711ed00473eab43dbb5d4d8eea39b44175083", - "b818ce39d1746b0f1f521ae1ef164fc79a341310dd41a0d8845ed2532ee7a40e", - "1998bb9cae326ccfcea4b7a15b0fd61e9eba2338fb4926692ada7f0024d2ae69", - "0252de25052c94a3c93f53811f8e17ed4f904a72b657e1d1e665fa77e2520e0c", - "8ba5f2d8a5ab7a54d26dfcc5681e832a5bf72eec374a3d9082e4901fc49a4267", - "d7ebdd59e6c4a2bae01f938b77471e924061a4479352eb1a092a1e1f55349a6d", - "e438f4fb0f72e263d31a5704a1a11882b2be2fe247082de12eaca0d716a4c25b", - "480af224f3fb0cdcf34caf3bab9270a201c286246f67ed0bbfbe4d3f43df1512", - "6b5e7bf7c61bc9c995887b1820238493e2605484f2cf1aa533c732418cf7fb6f", - "1b01758eeaa070e169039bf8edd428571a8acdcf4994bf0191ff474557275ef1", - "ea243ada58bdac0f75e9b8e03f4dafff04dc6aa3c1dc7d1023eb9437868d038f", - "295e9efb1c0dc9dad4dde87da03324e3caeaa76b5f1637d911ae8741da7c7f24", - "7c086bc01ed8bb0f6539b8fcf28c3290bcb41629c753b533dd4bc9a1fb70005d", - "4a14fd0887643c7b2374c2fa873cb6fb1496335229e5d9a05ff374e32f6b7646", - "14d9e7615eca1a1fe7174c0dc5e8d30fae2ef5dde1ddaef7e7953774cb084463", - "5c4d0d08cf52a4a36fbcca853dc6490394d440c88ca263f4e1803553a326560f", - "43a4a5e27697d2a76d2ae20db7ca753dc5ca46ef8a8b9e7053f389b357641a36", - "797ea6b9ba6a4ddc967f45a8376c915960f1950503e8dfa3c6cc44e21b813717", - "844fe2ee87635219db7b99d0406b01468c235e2286fcd1b97aa9ac1419ef140a", - "fa18f313d02feecfda6d1a6a7832ff6423a255a81b9fa24b93129e020d01f508", - "52521511a9acca020e0c33ac3b3cc20d1315f8f8301267e8ee2829dac852e686", - "4110ab0287c8d184d940095826c3540dcfd4bc6d0765f0db11f1615e45bbdab6", - "6df29104360a0c03451e8b8bdb7b0c908e398ba91b8a52014d28686d90b9ebcd", - "5acd747ea7fea1820fa4a1e2c6df42f3fcf385ea58710f1393c34e9314b04ca8", - "86a97dd013036a8609401077950892b24f73c7d7e30a5acf828f8b213923692d", - "656182d851edb808863c8abf04331fc1c342f93c1e21e443707c64508e058bde", - "0c4b904f6c6fff4b893cf8d1ded297ce3ff5ab85921cdd6712c7b637b0d73d8a", - "c8a9191f0c426f29a3f5d39d9e87d1a72b9f92dd1dd667f882fb3489250b00af", - "7075977687f565c4a50ff50f045f2d49153f4f58c09502079596b9af9c269051", - "9d9ef1ac32e6bfcc7cb2f57c0adba7cc291c8c73996dab5af058795a91ee78d9", - "35908f903a455a24bf14e05ba29d3a7997edbad2d20772be6334beb7685890ac", - "9396c4438e15a7ffa4dc3aa00e97e7a94e3d4cb30427665f5f391c8e517916d7", - "37be32edfb818f8f9ad4bdf50206c09e612cb6b1a93cba187a9548e9e66d4223", - "ec0c3f30921222f15a6c392fe7b61bda8c6035315c1c76ad140ab4ffbb9348cc", - "e385fdcc019c1b0fe745fb59b5e6b2dbcff15f78495e88b6bbd8b0ec45ff5791", - "851fe06ea47954e7debb12d7ce59d66e2a5ee43790756a1aea123d4c290978a4", - "c465342105dcc340f7b8e9ca79439979cb294e490b8baaaf834e301c75a2cad2", - "c9bc4486049f28ba7aad0fabbcb11f674e88b1b5611354e74eddb3f8f119e9d3", - "9e78b9e9c60332ec8bb1bd2a65ff55723e9e099f2704889be77e0f1e50792dd3", - "eab45bbdffb244398dc99f7a6e37dc04dfe4bd81bb9ee31625b219269481bd70", - "99aacb6aaed15e262746e1228b1d1d524d2dc48c532b8b988458a74075014db3", - "f42c0df45d086e82477f28e593e6e97a18781a138b54a6a2cbf6653bf90de50e", - "b2f7355c454d4b63bfec4ad9e4c42b1c9103ee3d2459aa2e4636ec531ab38ad2", - "49e9e9929c7a7831c081ab25c5125b1e6d894681db6b36d37ed6a8d7fa422abd", - "d67ba402abf99bc93f875919947a37f266ba020bf08c750369c675abc5f308d6", - "6d8b70126a271c49e4766b777461a86538fa232416b27d64f22397e221325efa", - "18f2f39f60fd7ab6046c7e8fbe2cf9b7365b8ebd34f986d354bad4211853a86d", - "39874a6c9b2c7fc26c2271751915d904ddaf9a64f59af2cc688eb0ea67e6e357", - "29704ee114ec878e9dca6506b3323ef93d3fda715a88740e7e24f196d86d5abc", - "c15280459f4c58a9fc54ac9ca0304add060a8dc899d0285196724a2ac81ae4e1", - "4b4cdf388f75c59404d275f197a3ef4468fc0184d12cf16c9241d6087c510ac1", - "fa317e8b03a2dd1b4da21062f03ccd01a8b2e88ee2c998f0e2bcf2f3edb66c8d", - "cbfe8fa52c98bb1d2b4c24c5794faf6d66dff9270b97d8ae5a695727772398c6", - "8f17da3f932ea2759f2252c3539f228ce26c13744443aaad78be36967df675f1", - "a00f6841ef0069d166d2633eba651d84c08f99d1125d106238f3dd20ddb6d35a", - "4b0b57d80ee7247c3169c33929621bd346207725d92801513dbe091c39df0279", - "83099e14595e906744498815a35410decbc63e6e87599fac854faa99bec968c5", - "89ab7061c53eb1c0c4a4dea3bb83363ac67480ddaff66093ee3d9ee92eb4a4c9", - "0e697fbe2acdfb860384f9faecfdd3de974ff5c38fc237b6770ec72b457d7218", - "2e09234e8e742f7ebebc5f4c5bfc140ce9741a56f685013a7e9c246ae773cdd9", - "1144c71105937a29ac7942ff81af3d53967ad9dd345762a7d3ceaad96cf0178b", - "87972511b6fc9b23433f8175cda5417919d4d05bb88ddb5dbf0c70fb0e041007", - "4ba43c26627d0fe12a7c62914f3a8eca192594f0b07a0fb3e390ea790df4b1d6", - "1823587cef658ce83bc1614263dbccbffaedd5f137dff15551fb7374a56fdd5a", - "d1112665b31978082a3f0a84a8ac24011f50c00da4f3875a07b39d639371be20", - "290a04cd971130f00c80ebbb5c467cd6b9c52d9ad98f7baa0defe55a8020930a", - "4b7a9cddd82b1831bff0c85597103f591d7010c0231e837c52235512294e0ed5", - "943985dcf592dc824f5f485ac39134fbbf3db9c5690af5207045efcf40c17792", - "5507fd2816ed3d15187e69adf08bf075b85632b790a9fa6749a5c395b21f65c8", - "e7b4a7f38bc6d7922453af767ce7b87c0391f6c3208635d3d9ae093c863bae1b", - "67854df339239fc9d5c78dce9a3aba3d1a45ee6fd61ccfb0484ef28ea1134d36", - "f250656245d580e349d436d8d981364e17817cff2d8caa12ba8065be0d010255", - "cec9963a5d72fd0790cfecb49d34b2eab62d2d6a1e14fcdf2dac85c33fd26e8c", - "e072e259a645131abe07692ff2f13f2b6f8f2be6d4d170ea6c75b252d50738ea", - "05dbec99c444410cac92bbe2d0966ecc4d90a9206711b68e684f39010ff94808", - "2e378b8d03170c59462c7951eda0c947321b68dd0943558b83b4b946d04ffdf6", - "7daecc7797e4d7bbac34330578bbd651ad65a1ccd034d701ddeb2f79bf95ba13", - "ea76f6518737ac9ee0e8a013cecb26127a6753049d1b0090e40a39241a5c8fb7", - "1663a806344e7488349e6be156fca7189878e2c7e9c8571c336e43f5785f83e2", - "a45d2a2b22636a1e10aee1c5b39031c79a0a519e3d7474bd2cb80b7ebe7a19b6", - "d6ad6f7017f70ce78568a3efe9724c97fd4560aff31cc21942b19772581f503c", - "78fb9eb319177b333cb311860848c2d668f93e3da203b97bb2d757c1f310ffca", - "c4a40223621573134f382a38b28f0d4bec00c322cfdc31f56f73afbeae952e78", - "ed393f70b42726063ca9610c74fdec7a16632c0258844617b622a3ac05d1d9f2", - "681a8a054e279cb84cd3d18993e7233ee9471ea716430ca83d4961b4aefb5b3c", - "50ed87df5ddd7b90233a6c235557aa5356d75f42a16f028c2fd7cdf45250e5f5", - "e91e801881e33b911104184c92443e4c438daa9cf4ac4f82d636004908970610", - "d49c3baf6f0b13dcd0bf150299f4e819ee8f5eebedf65018c407f6ba2423d138", - "6d99523419ba9b9eb08bfcb124d1fac59f8d24b2a5b2e76dbbb0fb6ef62b3f34", - "2dc096e86039fcd9a662e02237fee8995e097ce83593af7e7f232deb3cf68c4f", - "d7b35c881784f91c61ed15b5057246a8c03449bc22e27db4a86c9c621402d0ae", - "bce4a23086cb3044f2c8c3eb9ee3e6390262f38effe9d3ca2bd697c9846c42df", - "a6fae853aeae4afd61dfb2e3e0fa5a9347756ccd962e3be14e941980bb75f338", - "48f157606de498f4953c069e11443a5abc367f2a2f36b32d63a0ad28707ff691", - "5567e30c35d94a636b8bfadf5193c9b77eaeee150999013b116b937dc37274e7", - "61bb9688e38c6f4cd2024d67e6ba26470003e029588e88b3b1ae2da8e85a5ba0", - "49d6c582ce29b830d86c98bb3f819ac8956e92adc403cb522b779f42211b64b4", - "ce5f2b3fcab00d58e40f10cf2ae4d6e191f502d200234231022ef3ce84ef46b1", - "9f8a0b769a78b00880a3a864abe59107802b51ab9fe816b94c15333a920a2973", - "b3ac2a0f6665b372924f463eef563ffd91e50167f53b39f7ecff3e5fc2f82bd3", - "e770cdd38f7fb323815fd4ca03d5ebe5c294d20dc2b2b17b8fa834c1a860e9cd", - "05b0120d486f314dfc3b8e3825396b5d831eeabbeff27ce9e38a9dbd64dc2e4c", - "c6d5322e083fbbb89675606d2afb6ea9f4cf2de623b3aeeabb6e48a2208a6516", - "4ff66b3c24ac8ee7c8501aba7a6cdc6fe25fd672a8b80ffc026e4154cb8914e2", - "baa72ca3a3eb3cdbca5c07c5537c2da518bee0efdeefc5fe04bb2cac8fbab140", - "bc1899c76968979450fa78ad0fea98bc893d9f168979c32b8765ffb4025137eb", - "c209ade49e2b1857dcfd2e81ec424b2dc25ed788b6f6755a2b75ff6e23cd365d", - "16fbaace5e5c3743224ee2bb89fc63acabd636e37c5029a1b3af2b4f593bdfcb", - "5c26d84658a3f3fccaf64f51f1c2d5c4868447056a2de152fdb6630435c238f0", - "86bbd9817e0b88624273ac82a18e106fce86661c4a4d5f31503281e6cbd5b8ce", - "458f707d4c9cfd85050bab6304dfc4204136e66bcb2138cdbf31bd32c5ea2b3b", - "b2420d4a9f3c7c14d5da771b5eb766c65f53fd75500bb9e82cc3a07ce01e6761", - "5caebdd4c61e2b8a0a04679c04789ab0b2ac9a1a72eee0f36636643ae8b0b0cc", - "5fb99a0df65933ee30d07a8df9a2115c070bcd38b7c1f3af6be20546fb3c243f", - "08526161c4fc4fb1a4865f0a33a032a3e6ee56078766dfba382c901b525c3f9b", - "575db461491bad3faa35ed776a76d6591bf28a38d8e2c6db1932dffa25a12886", - "f2b1ee41c9304df95fade57600edf2e7ee2e19d7a329916c8f936f4086ff8452", - "739fdc9bb09849dbd856ff35595caced53e0ebfb1a95d3b85fef5831792d7820", - "711658e2539f091e51e766898d9a505ff6f3258e9d034164af851ef25a9c6b2c", - "f14c57455909dfeafbd7d0ae0dbb1a84ab880adcb20269d57a7c1a9e6cdc8d7d", - "51f3d6a4b186d4e079a1dc7db33d0389a81fa9a1afe2b0931ed008cd7d98e861", - "80972adca0adf9fb7fba7bd3cdd0d9a2fd1b6e1d588c74e0bf9d56c281a050ea", - "b5fe556b2e34d28e1f28a441397097bb1fc7ce44588fd451d46455133195907d", - "e432b0d0c0301908b99c6bb7b1e4de73d4932d331a99ab543779b812c8831ddf", - "4fcb8a964dfee7775ab79e12e0217daaa3b22048209dd8b802320f43fd8971d9", - "18ba8b2ff949743bd1398b7239a3e42571482aa64257204fc2fdb4ce441c46e2", - "af40a5a86c8ed67ec6cc781cebfba47af30924b305b362c64f17b769be419e57", - "289bbdc9b0c61d13c8ad0bd3b7b873be35506785f509de4604b49d04ed2bdb3b", - "ab13fbb44ebd98815bad9102931a28ff001f481ed10f68b27ed34efd7b773376", - "1852e9dcb94f9f307b8fd9ba1db92f021b1c21183f975489303707dd2907a2c3", - "6599ec559bbab5e7f2e8f48fe23b9b3ba3d55e79ca1a4a018b71274ff14fef2e", - "30e2435a535db566228b02c37cb0978f1fd812d2d588b2f6536097c743285a82", - "03583e81c56776c8bad5292a50fb4f576984922165147fcf3409202341ba5a36", - "bb2ba94de13aebe47032ce6384153cacc3db687e12e7c776908819fca5ea5a1c", - "2eaf35a9a59c3af6412245fb1b811abc8c3b158e42d6a60fb265afd964f10be2", - "df5d4b41eea89e33510a5f568057239ff6430dd4016e134f21bcfa0e0c27f6b7", - "12095956e7fc1f1ca2ca3020bae316fae0ff6cb5bc7d78d4c06ed857822686b7", - "012501d33b14375cc067933bab0f12a2eab0c3b8fa5afe7ccb40dee89cd16da7", - "31e6df6d9f0277e780e6506184b58782853d0d6c14ee08e11cf77df41a232f89", - "8e058709ead30baee04b0fa438039e7620eb45d299f8930a828613f2677b51a4", - "a0dc60a818ffa3ec0202ba22b73a470b5aa1cd450dd5a43f1cee9c172fbef8d8", - "bb283933d7d03abb3acfd337a3f17c0feb88d61d4b4f82da565b3d91a6148f6c", - "5e1a5a7b1bd36fc469d2a91c4145a4356ba78bac35423e5f1ac56523b749cb12", - "58c41316fface005b5b236f423c9d2173c380f5037275d966980f0030c629c69", - "caa296916abf7c95e1a78b4c7bf08bd49453fad88fdf96ea9c8f019f27ea6434", - "20c98413d2f614db5436a2bfbab30f6e7df7111410fdfd91c40d6e65da865252", - "0f135bd6992848dfcd2546cfed830b3de82423879461b09b1f38ae5a086e1bff", - "f5198112ac14a820045791329b7937c77e990ea1cfa34fa5aae472d7e5a0b32b", - "68ec491af519c31593c01c365266d4589d6446c6e511e8e3f29cdadd09f80377", - "d64578bb23c8ba976068deca2375fe19309d67b2e82b231e9b3ab6c75b0bb703", - "94bcbe78039127b2877ce8c433e065c66e624a4db9d08630408a4dea1ef9d66a", - "451efc1e3a2602f4ab932330d02fe613096be08d60ed4564d6dcb9364630f0ed", - "908aaf78bddce2c6f9e8a6f719e15f20a104eeec2d7a4d13684b5f8c595ed4ae", - "1b5dce88c95c94165077e2773b152087b57a2506b2ef0053ed6f5a9d56870c3f", - "5331497d5f81e783d95167e0ff7c50fe4534d6ce0cf3b3e64c21153a528b9fd3", - "b2d59804f178e39d933e40d04321a5217390a4ff0933129ae15e6cff4f64635a", - "c8cf335d704a5c80fb35dfbfb64ad08f25c40fe16c738a90877c863cf894f1ae", - "43302119da4f6b93e971a85514081b9f1b51dc01cb026f6895d19c86b70ed944", - "3d1ffee89ce0836c957145d1dc0249a53eee39dce9cd203836d26f5913b04ffc", - "0e8638b6acbc8bc9a47655c61526afc121df28505050072e381f632581b61cae", - "47295eedc71147d5292ad6d86442ca6563944a65602f1631353c571be601d049", - "6144e97ee067b4b025e6c798cec2f1e554f9d3e59d706cbf71f387693ee4b360", - "0d1b7e56719ef399b48191f90c0f89f77c2bc4cbe7ae5d00e772b74201a41378", - "1172937d3a2ee8603f20a0b3885da29bc031aad6060625aa1873b78c6214bc1f", - "6458fc9f816e7e8a5e64fcc0578f4002202286652cc3d4adf1da2e3fbc3f390f", - "39308976390bc11f86558f7359848004b22d7ea6572a00858221a702e005aa98", - "fb27d7d94e21643c6c7b890e3fc21a96a5d0fd89615ae6bd6fc0aee99c23d170", - "259cb7b922055f6003b031ecaa02584d06b24550aa373c9eb69ec1e9dcd1962b", - "f52cf1fbd7e5840ff2c24f6ce533c19b9914154e4a78814aad4fc2eed4bf05ab", - "34bc01aa3240358ec9e923aa0be9a9e48205e9b0eceb382b4d22716b50740f3b", - "3b6acd1973a53264f846b0f2437a3c01ecd2e337f11e5c59da7ab5164a53cdbd", - "79238f0860861b844e24adfa50a8599dbaa51d3ae1c045fcedc19dc02f8dfead", - "7acd7ece1e97e20a21eed648a9c8a83922fcafdf7db967a9b98204029f5739d5", - "5a842e1b8a5e0040a18529d0143967be64cdc68b7711d5c6a593441bc1ae7802", - "e62255dd3ec9d95d2daca4a42d65907ea3cb5c64a97f48f96c8ccf56bc470958", - "43d5c7ea9e2cba0adc040420dbf3a50517e31f53c3372158876a48dfbe691d69", - "032bad1f9556d2983afd0b617efff8b7b0ef28cc694383005fdbc412d104883f", - "837150c19c96c5b8096e633e2847e37456657b62ac9b111a4df86eff16e7af16", - "477ca69d19e573f08665a698102dc222445855efe2e9be6426cf14bcd6793058", - "4485df9314ad436a7c6000b12ebfa812e2594c780252ef75a5cdb155dcdbae5c", - "27e9cd58cecbbe3da3ca8e65ee9e2814f6fa0df453c75d5e50ab74fcdd0b3087", - "d7e05426e4aef4450dfdf204ea48762be8e84638e5ee9e0643fd5edac89ade3b", - "84f64fb085dc0b5dc0f3773d69dd0c03865f1c6a766568eb004004b07661109a", - "06aaf3b21172c52d1e7246d1d1fcd31d6ab8282908f6fb706d603d54d467f173", - "90414e33a6be6819fa49e60ab5178271c5921b2920dd55340996f318d7727885", - "a7ac7c06132e5f7099b1e9702e03fefb7dadc711d0c1bd826a4989e9aea6c646", - "1aedf2908fcb97b820c0b72915c041e6a49d39d55eaf2f1bd2ddca86d7e01d05", - "053cff043a8010bd6b8c3d8e7c2760d20f94adae2bbe1c2555b84ee44ea9ced9", - "6a41d7501c6e27800a229a8a8c67751113d148a008a52394e5d9344b11135fd5", - "db73621933356630994e9812d7481d62e95715dac28706fa478051eeeae3758d", - "d44b0bf36f98bbf7855f3bdfcec0c950d66f27d75420db79cf4487c580800f45", - "14b3d798d3deb8a9baba490a02d8faa962df5461ceddca8370cb7f6413921d92", - "83c1c9c8da02ec1dcf0bac477590f7e75924fc867e8387ad40cc1674956cfe24", - "6e62e0841a3ebd456781e54bccf728623db15ff8357f77aecd04d300354eb4e5", - "3f12a2ea6a33c6a2a54ffc3b8e99f3b47b27a154ef8af61569da15b5d9c16a24", - "6ff658c5f0b1d7661212e7bef65865bbe83388b2e2d2e17851a99b51a4b56c43", - "4941ea44149c24d48689f0c6379c2fe14906e969b3ce651a8ad93302b09aacdf", - "8789bda74408d00cfa473ceaf7c6c008eb85fc13407636b7debffc9b5cbe4c8d", - "4774f66981698acc58df5b50995415abc1dca2239b22d5eb9469b28ef2598a50", - "17962f501d34dd1fb370061355d5cb2de4c5460de77f295d1659d4488e2a1499", - "ee681cef5514e5eeae50e4ae1f939cef2ec93f5b01b93c6c5f5683f1a28503b7", - "ba63efd398e60af6433edf3135555947d6235074c4a0df3d0c7bf8b8ceb91448", - "c67128d8c9f976044915aaabc88f26cc3bc114a648788475807cce72bbcf105b", - "3b9d749be4bd20686507517f4cc93004c3dc26012c17d3691bef26d878ca5dab", - "841594b0fda4a9fc91b8913c1686a7bee8aef311638c5be6b5c6eb1c078a541e", - "53d3033cfd0554530aa69fe7bf5658ec81dc6785518d043c8f24c2e5573049f0", - "72dd9b6abf5b0eb0d0b79d04bf76539c08309bc37c0152a24652033c0dedb4db", - "61e33fb0ab1c730ce4b9ad2b6a14492538297bb1f45c86ab652d7381f0ec7e27", - "e11ba4310df674885200eee57538f7438b0bf1f7cc93baf0f0b9259cd41d01b5", - "42edaf39ad44568eeb34be8c0ded7ee6551b4f1ebb36a56a24650badba7b82a2", - "bccb775caa5882e4859deadf994a0de4633ad192242b9f1237bf867298ada88a", - "8f671571b1138955d7295f543b3f5a1703575b82ef2dc80f881937ea757c3f2b", - "17ab1e814de46547c971dec9f70215e98601b7b9bc240a926241379d226bf700", - "fb423b03274a96710d1432005b4b1768b90b071319a5a0a514710a9c7636a290", - "483214e4fcea728803e7ca9b46f7f0a5b18c988b978fde3445c906a81c4f8af9", - "7a1f48dd1bb161c8df75ff8afec3f5a3c00c5850e75e7a84471fa43ba1627616", - "fbad412e16a460e4533db303f97ae12126a214989bafeef209b0848fccb820fb", - "8ba0925728419d1b1ab66f89ac2b9a8c7c77399969666db594176e71de9a7a00", - "dbebe742a63d8d5febed6c5dc86c8fb4df533322fba3c9dbfce3d52148c4f1a6", - "68a290575920dc673d9f0ae69602e4b6ea35f2c349e576ad7a7a6836865bd6ee", - "70568299e2b524ab299e809173b5e0f18aca9e109ad42f4735f86e393eea7225", - "4c97f6e5e62c71f56f1a96a7d953724339ed2a1453f1794ee738a6ba57802ddb", - "49613ed185c03b6ce9bb48af040cb632b82e04612d536a22671b7b516b3cdb75", - "d0909add427da913fa984381a2ae4ca3e0f20eba2295935ad545d10efdff39f2", - "5be9efcc7c2344fdbcf5d89868eddfd3a82e598e22000ce8bfc0ce4d3143c343", - "758b8efce65386d83236d268e6a3ee7b53b00baac42af99b3be1b90eb2054717", - "8c20a15e1ba4558bbdbab89aa73885f11a7953622ad3086a4914b9d9e23f859c", - "34bd3a8db1ef9d3b7bdb0aae613a37393325d8cea866e7c61db19fd368abefba", - "13b1cb19e1f23129e460c957b8af2a0d15fe6ecbb2e7f780fbfcf87beb2323eb", - "41f7a997d57e37a8563384560d9a39413249ebfb396ec593973b23247fbfb2ba", - "bd893148580050894f12bb5d392168739d3de8d7dc921cbfad75ee14f2e262dd", - "501237ef67351f61503091c4e5744c2e9029f29428111c2e7dfc1400f267faed", - "e5f35bfc2e0d1cae440b2e03fbaa056bd7a52737419deab1f4e29e9d397d20d6", - "97c168b50afab1c08a9cc06ab61e176e26a9be5c0851da9812266c2c7080a81f", - "169f5d490eb8fcb69751109b18f193ecf1b814891c919783baf2946e82642eb0", - "7e1da8925f42809fb1272d267d3a41d04374440c3b0a67e61fad06df07fafa75", - "5356dfb65271ebd68337d7ec46a577b59186485c404de56f7e87ef219a11c852", - "4b7fa00929ed7218183f06324afefdbd95fdc6c9f5be5140c0cb0d94aa8b5088", - "ba4c2e27d36b23a50dec304e9010c483fb7c8c698edbe2d4db89e19337a56dab", - "10d94458e110cb25b15640c2f3f2e5e74d3145070ae88fb62bd8bade88915df8", - "23412b3550989fb28060836781cf9119d7e484bcc74d9dd3a89bb64ce109fc8b", - "9a1a62199c29619b6ea03d47a5491f06c702b39a9745f4f74962f1248e71b893", - "8c6a5d9e6d50554e7ca202e173c6086ee98a0da89d44d01ae80a543e43e6c4f8", - "b73351fdb8784189d6c0323952b53c7ac3552425ddfb1ca307bac6bf2e8d7310", - "adfbe239ab6eaee01e81d2df4727cc0c6c110306e3905849ae681c1eb00d0bea", - "a3a8270731d13406cfd8ace7b693c0b46979b3f9fa7ffedd261980021ce80e28", - "d9c5c90d76d5692fa8caf73da9d2e88b03b93e6f6f8ecf4ac0ee061631426790", - "3e3f89f65a9576d5085c28d943eab16a1829c096d2f3cc70ac6584e08885a562", - "236b7f69aff57ae151872c539a4cf3c9b783ad4410ef8b8ed4e4bb50a0251cbe", - "c5b86905081436b28e23b3bdf50be1a2d932099de62dfb3ed3936001433e249d", - "2adf0119e01b8f3213bb922a6cdfe9b23d21b6e3e841c3ab13548eba4ac25a2d", - "06d2a1604c762e95ab33841f3119322bf86af0b85ca4ecea6bed6f314d1b7b0d", - "20548ee50773689c57040e8dca29d4308cd4238d8671d743965404ec659378d3", - "a6491b4f27af707a18290f184b1b508b8914fed5f375a856e17c49d052a71edc", - "de38c86f001d860f6e812c3cc12abb8d249c38fc5e31555b541c80fd9937cd6e", - "84ad21301d9619c705277c1f0314d2b031e97af329e8183dfc7f9934c9c3a457", - "5bcc6cb2d1d29b422c0929b97d3470740a1a47cebd7c97983d5de279760f0a0e", - "b4b6822b797042a7ba275e11cf837d2393d41a34ebd386a1b9a5c5c9b13ec2d3", - "3e9705d60844d4c5980d4bc6fb13e752f2470ff790eb7d169e4543a27e6cabac", - "513017c9879021b860bcee28945ae4ed01214a82b1c14ee582991bf71c7f833a", - "3d9d3281107ba7f7f0058166dcea58703cd7bc0ff1ed8a780c954eed23fa3bd8", - "a6a73ea78ab096bfd62b2e9dd227dee100cfa5b330dc42d73e328262840b96e7", - "38ac6829d07b510cae0edea30aeb448cd59f2f035c1f13494a6a25db38fbd9aa", - "dc1687917e4c0f1d934fe8bfb295bdfcab69845a0b1395c10fabd1d7c7ef9227", - "fb9dae5e5530f49676ef9eda5b24ed013d824e1d617159e4d518c6f3a2340b3a", - "0bc11f06346abf959df50478bd94098400318814eec7301d01589c424706dc5a", - "367b3482f18e58a6f2291449f45d08f6d441b3fbf3a5292056d27b05314690b5", - "c5b5d5039639f460f0563a70c218e89858cfa29381198fed08425f414097c642", - "9e35d2ebaf7449f9f4f7767401c4ea024691e6510fb2b99689f8e263d6939d86", - "e9714333edc8ee6daeb73755199d9b347411a76b83c68cf13c51ff283f2e54d9", - "0e21e9ba049bb9c698063f5546bbdd2afdfc71cc7befe5558dc3aacec28253bf", - "e8bfd01c4974e7090414e01aebec9f179db2fe577e6540a86f9fc7e7cab3702d", - "66438fee41391e958aef2fdbd3d4bed26bdaa47d2854a7f05d7d9cc7cd4f88c8", - "507e7f26e6fec9f4ee1095038972d2c482da64cc5e5d6e43c131b8c9fc8fab36", - "841cc383ab899686ce56abe170bec4aaafc1a8abbfe4e3caab48b8f88a66bc60", - "62f24e97ecee2bd6d2cb48999974293e0f8f251b918796d13af8e6a05065c013", - "2875b8c95ed9f23d0a459dd1bbbce9f62657e69445bca5f16597f7df1748d0be", - "c11c72466c036348d46e428015cd12005ffc7cbdf41aa111b839013cc49274f1", - "c153ad9052a8bcfa4305dd5a2df1c7d6909444cc1a15f50d390907c9fb14d2b8", - "0312ce09b84b8d6a9c8bb4ca45a67d54d39ffe17be07c4c10c70fba9c077c916", - "e79dd61b0c643c1cbac63ebe4e01dde633206dc0bccdd033b50c0c43b104ab9e", - "e12c2cea76c5ca2af4a8481718af0e5b9d44583fdc37a9de462bc93ec7804131", - "bfdc5a1f1674c15ae947c3a66afb69aefcb9bdd900fbcee06ee4482ba119d89d", - "aae7d43511dffd4910e7d7256241e5075b22d628d574c68252471beef47c0818", - "59b76e613809dc9dbdef5715c84edbe174a470f0be57f69f0c980b78fadf5200", - "984e2155b518cfbd2aeefa3984ecb514d05c7ed323a4c706fbfae0aad5290922", - "74512cd7b37f6d59337e546ce19a869a93cf07f8a0ba88e9ff15c06358daa532", - "37183e3d4f76698e4a63559a917f24030df61e6ffee1fc7a3aa461fa54ac72d7", - "47495f9ff240c423e168eb96da9d1979fe4497c9d4e05daad0427a3e97f614d1", - "d873400907d21fc97d3132b6b063ada3295da96a15a25f209e1e256c4ebcd931", - "e9e7ffad5aabf1e27d902f27c1661ac88d15c2ca8b4d81408fb808d29fda2973", - "7428eb37eb291dc8f6a372e331a7b2399168ab40543c7faeb3e6e27b3fa16a1a", - "93beeeb542a9a1342192ad2f2ab3fda5d7d18dd27ffe9aeee448597343507a75", - "9206d9652dbac5b7e729d1a3247320e59775b8d780f13200f7a5d6a8b1c575bf", - "5ca76e4bc7c8b653463e4e774cc98ab5ba87ec8409697c2c73c7616809dc8472", - "33e6b5c1687f4cd47207fae56b7cab72a69ee8f7501bef31a0ca07f02d206fc6", - "73d62cd95451b9426f10bf4ab4ec86204cb5788a252f4542e3d4735fddc48821", - "18c2b23c2ef04e6aa50ada23608d88d41596ccaf9c5ef16e6b871903221f8a46", - "a665acbc029b24248f6296c08d53c0ca0e2d8ac345edecc83c3a23782a9506cd", - "c911c5c3ef74119fd7c4c4046e61fca983928f5a7373d4776bb1d6b0ba625516", - "bacdc0744d2403df9d2e36818d9aba51a30aa01f363ff57397baf3b04da3a7ca", - "5fae435c8e324eaf5be575f0757d73e134448b3a6ced3e776c15b9b1f2bfedcf", - "71f217d190e2e84d31e959c9e80918f48b24cec066530a9a82883537d2a0ff93", - "765e4033ab3fd6a5601ffd57b6cb72a056155bdc41d329af5c0da134fe217860", - "c650af2d7c5f3cc1fb9b1eddf2f531795acbaf8226bf7d2a365effd4922633cd", - "e4fd6d06d29712e208aa9433f4b4c7d7db10fedf2bab4e684cd271b48f9d038a", - "2e7148cc80c31f1488984b390350719506410d20b9e6d3f982969f2fe7c315a2", - "70029ba9601bd9f798c7381d75b433ced69f386a3e4eaa7b8319799c1ffc4b65", - "4b7aa50cad443b7159507a7f934cc6619287b030060a47a2abca34202f2918ce", - "952a1b8dd9c02b6db0fb63df63d486f1df39557aee22afb8d93ed967fc861a58", - "25c5e8e5a8a1f1158786b4c41d8d3d0d2f4c52ed0bd574471f5c315c668d432f", - "e30da6fb3685057cd17bf8f1ecb0b70bb8f71207b8744537fcc2b4103385a530", - "2fe14849ab38d1c6c1178d8464e7eff2e23e12a6d0bf853d4e300ce0e71bb124", - "c9eb23f5c7e30ebcf965cd4761e6784230535dc5e74beb758c44ad7525c9e498", - "0b612ca71e73d3e120b75652fc0e4ebd92d00c7502959c9777d3c02b70eea88a", - "dcd17407ab6ee8d15ea90b3e7416055ee20e9647192886f11cd96d88fff0e0a8", - "63e76cdedbbd7a20ea5020c5a0724061d76f98c4c2c6c40f0f59b3e4f6b6062e", - "025f847ea96c24ba0d2e2f5d50dccf71b98345b653b6560b831e2fdba841f43a", - "16b4ee580b4369d31b96b63ada68137836e144ea08117194a171040dc90f3308", - "c44d911ddfc41ac4c84ebcf1956cc96fb61d58e88be0a3081ebbef03f7a021c5", - "b85c266f696a47d579ee935963775a9ef39f1f2c70db4b79fcc2c02941ca3e55", - "acfdefd3f111f43303f82f3dd77b050221c8aef08854785464074f496ce39139", - "7e81bbfb91323468696d56eadb0cf8b4abdbe3277db801322230623edbc40c7d", - "2b5b4ebd15391a5075b9fca24fbc9689b1077f30212e8a5d37fc0d0dc8ba19f5", - "ec15577cd94f201732c1717ca6dedf9a07ecc9c7596964caf2bb719f9acbb865", - "e2e493b9e759be921dec17054e29e69f8b9aae3044a7a1a0172fc05716279471", - "5842327c03d41514eddbadcd2d51903ae2abb7020854cedb68283d48b2b00469", - "3a11f2ad1521ce963a1b12aaede6c4853fb97456781834f1aefe9351ed1c089e", - "108c0eccee7bb9585e6b990a1e7fd0251dce521393b6b88e9da783559b2dbba4", - "d10c39383c58e29691cd09b8837d2b00d09b572b7cf6d6dac87d45f646a99135", - "a007b71dab26683f0675400e55e0d61df0050747253e5c839826612c519db919", - "4bee62db34e1b3c5f3e8a4a1d13fdc32a2610be7f06dfd4cf72d151ce83f0a06", - "3ef7a471d21c8bdbec533ecea06d6eaedf4e6baa1d8ddd34706aca059600ae6e", - "7e9b41ae9f144b6da0f00e4209dedce0476419b888f2d46342d6a06a1a8fecdd", - "63097e65f1bb00beaf45a01d7f741758126e451473d3b1d364419f8a84af636f", - "6a3f064a81d52cd497223ccdbc051f37551f96dd32cd18a41fd216905efcde50", - "5a0c8e08e0b7bdae264557b5349f7a0d20e2977d2ea641a87250645c2b010017", - "7c1ca45593844df2f92b4a78f9b066d848aba1bc63aaff1c2aafcd9cbd9da23f", - "ef2f2022d3a455c5ea40f81df8549bad456b4ee19a228996f9af230ceda1093f", - "8347efe3b91d24e2258e8111d36ca2423945eff11157bea351ea89d80c59b232", - "b42c7c9d3cc456c056cae3c7e30cc7c5e812dbfd1527fb9f69b1c648c2c6ec4e", - "ac0819027bccd11bb17d569c1f079a7deafd152eaeadbe426d310207f47eb71e", - "44467e9b3322d256835350c8a8fa752c660747e187deef57529a03a40bbd70f4", - "8264428c04cebbd0fe3f05efb16e92543f8a415a58032cd4d321be48b63f44e7", - "74894caa1f45765ecc2627254e86b10960bad4cee72b8c7b99c3102545e04655", - "1512d0da9cea7fcffc92a91757aba7119e3797e43d7b223ba50bc9d4ba5a6bb4", - "8ea6c96c8cfdd65ec1f7599f68d599530ed5f94188b225021a03f617865b2884", - "670ff919c205b2f91490de68d929c3743af46a16de8fdc18486ea1296de56302", - "e31d1eba9be335464c4ccf377c303cc5df0f21d6db3d403c5b0a1aff1f3bc73b", - "eeb1148911758eefe848afd8193fc64af044263b1158b580d176aa0fe3024fc2", - "81ac2483811075d49e8d7d26884b52bc8876ca0162a9560d8c388de7eedcca72", - "e2b57e61080744332a042e6380ce382af79709a772f1bcaf3f7ddc77beb14930", - "63840553d415848ea0528d17984366a6033fb1933c0b2ba59b47031869fc9a8d", - "59c86bf054626f43b02b49201c5a9a161c6d0054ed8813e492e301b833b3c18c", - "380db5eee03c5d0d810d82ec2ab05d559b18cf2545388fd65231cea1a79aebc0", - "8f5b4f6359fa9d8d19014ac0db75d66c508c1baf392dfcc1c0f7819430c008b0", - "4dd7772dd4d83d1c3554664d1dcefa067b53c547024de34b82272f4bb21d0571", - "99d4a5397bef08d130838d440229934b8d5e23e85af2f39ebd04a8b378346364", - "ca598d238642240be2cb107478636f968de83eaa0cb28b5ff505d3944fcf060d", - "604edac2ef96546fbd52a8280d3a0bdf5f4b8b2098ddfce69cee513bb51b4ede", - "b5c64d3ea373340e9d670722a0bf7c67c68fe0624fb0921b6196b096d46a2e8d", - "33a08c38d16c2324fa352ae353446e1e13729cb6d4556120dad88d8052e1e86c", - "a23b965bd67a8111ec11a8436a0dc7aa549c6a9947a180044c95abfc505ce353", - "9be6e902aff5a91ca6e0a469abd9db3a84fb1f6301d2a71ff2c04d605a1afb0c", - "c864fd962fb2d9855933a10cb8c00f22d0951042151a09091e777c93899cd677", - "e087ed7137116822ef84279f02c99de16e09349a32573eb84fdd9b3fe7db4d98", - "b70527277ee6975e549b84d678bd74dab4ef524dd7b0c392830fdb0e99c3e404", - "34658fb4fdbfa2aef6de26a4f9654c6005c5db08bf40597bea7f23ba397a6bd0", - "1026ba93ca1d9ae8fac6fb03cd71a9a1d94f8a9feeaf583a3960962d04c710b8", - "97120b25bfca870cba3caec0491febf8796cd7b65de52e2c8fa127c7d98c6d9c", - "abc33be70964fb7c70a80ec9b5b6049bd1fc17357c36159d1a32de4921bf65e5", - "970f9bc315df77b7532ae1a424c3252a401683a2f496b80ccf315ff17e51d594", - "aba93e2af10c6895ded3f8be65be08a558576e95261690e6f6b7079af2b84d37", - "d46d5a51fac48285aaa30c87bbe47afcea71952af374757e7aab48a99a8a83c9", - "66573ef2776ff2fa99804893cca972264533aa8e5d102c31fe49708dbdd08621", - "ec74528e3efb188d4945dd2dd3172d6140538c78e70a3948014a2990b63a514e", - "6c3c5423ab062c2e4b5df67d89d3792c52ac4876258e1a9a06d442685cc9e75b", - "c51ed11ef0b27037c2f60ff551bd768ab0e2b44e423b378e0e4cacd5f06e0ccd", - "9352018477ba7df8da8f6706d4a00b445ddeb07faf0c34000121d32be5cf27b6", - "fa3dfbcc96d33a6fd518a743e9553e6725540a34625f59473aeb8334f34478d6", - "a4e2200b440352c17189808ae72e7304eebc14edcc4f5837b29ff6cddf481769", - "7f4f1160baeddfb56b0311292d1b6b376fe417160840ccfe550a5d2387ba85e6", - "7b46b490952f5aaaf7e242bd32d6ee0f8182d727525c1e4132e245a7f286502f", - "d711651998b9dd30126b3aa4f006992d005973bce5e1cc1400932449cc21e7a7", - "a79329d3d78fe32347fbc996b4ead65b1755f8e04cfadade1af1ea9205ae9bb8", - "b1de03ea39077239a0eb087e41b111bc49a5086ba98a990873cbaa8853fca578", - "eda6a0e0fae8c5f83eed684414d8c9f19f620912955e05672da2dea47f315aff", - "eb145dde3470bb109d2c170761838c4842b2cc5f00fe9b078fbd8095c37ee486", - "0ac1fe4a167a7573cccc2ca6ab35b0438fdbd4f698edb0a49bbfc045503b3aa0", - "b2d296ae5b1f4a30d4cbb88161acd705aca92b31f757d2eacf818d141ed73941", - "4522b835833fa7963f907b45a87a4c845cea9a33e3010ff94bf3cd4e5714fd6c", - "075fe8839881eddc936cdfe60567428e11e79cfa794c20bca4f3c22df61e8cea", - "6a2dadaac22fd89150ea8f9e9c9624a269435efa200b0b62452fc2189345bbb5", - "50246a96ef998038626bced36139b84ecc7ce2b8228968549867821dfe64ba74", - "6129357865aec5a00a6e351216d639de1d8586a17ff5053c5b38dd22d4260fe6", - "50ccc96fc9ce177a7352e5be277030b1f77e7cb4f3af9ad14b3e14007ddda565", - "7631a549a0f1754dd78c364eb15b0e394024169814ee2549b591dfefe52af0ec", - "a3236b4f0ea75ff1a09b320d3bcdc3b9976b12a9de09bf9c432ff11928205365", - "f7b068f9f68ed5fb8db9e39b2bf7c4bc89d742788b7205047fbf1707fafef610", - "1be26fec0619bf12723952519fdc7b8a42768fec0246f95a66f8ff89bcfd9860", - "781c95f6fc9083707c657210c5d76bb5b657e7b5a0cb665bf985bd0a66a4cee2", - "a1dd64a5244f882a03106666ebec68a84ed74e6babb1b571f901fe0100fd1178", - "57d31769718c542cc2f4ace15c7fcf153b2befb7bfcc741c13d46f475ef34ba3", - "71adb7402d4abc0ad4e4ed00d11c8676aead9cf82d7fe550debf043ca95ed091", - "477a7dd04d8626fe09a6a7291cc763493272649a27d77a0bf8df0c530e9e8801", - "27170024414e7f7d315c0dac07b074633343898a3d51cac24b0b38a71705d599", - "c09074e5a2c8c505a455443e3f4dd19482ce8e6515219354c5caa9721a64ef3c", - "93a4376bb5d806abf8383087cd3f715d3fd544b18eff4aed1fc801f55f088f00", - "83870bdcb93b1c316076fb72555ae8776ffbf5673b541b35f5a374e19386cad5", - "593a7024a87a46f469c6d88867e6d879bbc10456ec786b93220cd770394e46e4", - "3d58fa8288846c40b64af5f1f3e249628f14f967fe22589a0e9f19f71a25bb92", - "982f6d6eabfe468bfecd2ac2d09b662371c009053d359d9d26ff2da7010be75c", - "e05aa8305e01a630ad68f03d1661257bbc639af4c1013491ef01792e1eea7a17", - "cc2afbdccfecd1078cdf1667b9893705a3079be988fa6af05898cbd7ff20ccb7", - "d472f324cd8914ff6aab9f3ebd6c8807666220c9a2fc795c657629d17ad82afc", - "1b2451d1f8a35a1c2b85c4d9abd98438b901a72c00e6dbe6dbff38375125d031", - "551e3546f9579dbbfe04472594c4ad92caaedffc98c267c31579149e650658a4", - "35d94ea0c0d630c7ff45191f8a6fe2d6492f1238d38e5e60bf8e04b0f2d05b88", - "6ef1709c39c433cefdeb0fa7b60b0535e66efab15fe4f215cb9c03c0d5f81695", - "190a643e691abe83965a6c9749d4468241e0c71715b9008dfc5ec43fb2bcb643", - "f71d7dcf5c57e1d507ca74fe55d0ede573666080a397b6a463a7ef35548b2fcc", - "46c1d8bd6217e9826e0a4c0c317e06758d9f72ec4370fd5bc4052e319eb74512", - "18b0d11169452928914a9c4f159d2e22f0cbe75fe61e7d2b0d87260c86d53ebe", - "fe594454f747cd015f69ec60c69d6e5c5da5c26bc5747540bab0dc5d796d72f2", - "e4919ea89671b52346b4f8445f1bdc08f902238be04758bcdee8ff4c125e506f", - "595eb8696fbfefada5cfc8c248bfaa94e33a48c1d0793fb3982b599272265ab2", - "a56bac6ca291aca7d06c94c1cbe7d97d63f2a1acd2c05c8d73c8a214d6ba4dcb", - "ca1352191af184647b9c39f0a3ca7e010e0357154380fcb4ea17f4a9e1a7c186", - "bbdc2c6d0825b8447c524cf0986e8b8d20a4b578fbea33e9ff9734f1c9abdb8c", - "e18f00eb5953bf2c203be98d4f8a81acab68439ccf148572ba25de7bf18ac360", - "dc9525d965a2ffbbcab3b9ec27da10ea592fe68687ed06c947cf1f740fb63c92", - "6c98243b74daec17c91de0ac4ce2466c33f525612fe462ff4cbd7502deb636d8", - "14a44962597200c5eb2df94ffa09cc6e508026dfaab227b49a60fffa90683b2c", - "0763303cf0d2d7733aae65d0cb60337394b9db12f692cec3ebd789cbded8423f", - "d829ba0fea0f18062c6682977300a592e669b1cb618c3ce1edbe9bca8da04670", - "2c626f7b4e952be9bbd84f287ae0a03531ba987c8589e568e105896540aeacda", - "628767ff71e5b3a60e305b3aa3dde9ffa358ff90e4fbb24c4b835a429ce2f5c6", - "22d303a0f276d21a65459da6c1555a78831a1aadf6528a6e4ca20ab71d39fe33", - "a88ca9e0b3e5aabfd43d8895808424a7ba31117679895014aeef10abe6c91fd5", - "4af9fb324b106fbc595ba1c5270b462b53ecd9085db37ab6b2622efeebb8b9bd", - "38dd2a8f341ed14335e843d253501e5645bdf586b51f191266d75da206e366a1", - "e6c67f06a312d8c273996b91dc1dbd07c085537c28bd32e77f6df6685f2a93a2", - "5d48416af4267670dbd904c5cce1afc74d2b860c723af2c31ab881af92f0e79b", - "380cee5cd9c5eecb849df8e0bf663b1801a2cd889be9e025cf6d05e57a869d85", - "d5169fe28d6b6808b9edb31b21821cbc0050cd669b00505fd9c85f52b8616bab", - "6f2ce0b6726fa6d4222e19f97883c461ce21ec4929d455cccfe710d2b0629470", - "81abb075b8016f8b2ca6ba4827053719637431275d1711853f4b576a955cbbab", - "8a31a23223a291b04177fbb669e24f8e82e5c25724806a050139049d211bbd85", - "c04d91fd2a486aae74839d40acbe816c00bb000b32ca8bcb3e726acab44f9661", - "a298e53104416b1a7f6c526350302f9188aca01f6c35619f5fbe64b249b035ee", - "08ca8c0df3c529f4713af792a47c2ede39a0a9534aba23b5f0a41c0114a76905", - "9ff9259ffa292779e7cf12ee7ab3277c1839e744ce02b878f7982160174606eb", - "91f6d348c9197962e24634ec81e7ea30b07d8ae6ae278c26813d98c57b549304", - "a14d58d54b7873ae1e8ffc4153acdf93072f12c41ff96cb3dc910a8952c990b2", - "e56089ce89f33d4209a5d38c91ea647ce1b40747a918b49e9d41475c67297fd1", - "e02ff6cbdbb5ae6e92030c4bbc9d33724c9c2eb52e135c8b21b5674634b1a050", - "b2dd75d69fd971daefead29f22b1946911e37731a6c06db1ab508af7792782a2", - "e680d87b240b2e72e79929b243767e2aff899b056ccc765afc29009ba7728e8d", - "a51b6ba6df3199ceeea235335098d8f7a2fb85b4f50badcaddceae297d70d626", - "a2d0de3a234d34468c928a3a40b3ddebc24108f9d61c4b8a1465738c7d998baf", - "f5c4d48ac4e476cd73ad6793dbb53ac29b2817b1ec52707d80ff4167c348724e", - "5d407466ad2c58b4fb9c6ac492ed5727e5c70cc421489955f4925ba4a75d9f99", - "58fc46ab6c48f6d5eca1574f1cba69cb274a35e5a778c3ec5b111c8941d07676", - "140128f195f9d231ac4b8ded82465cb90da76781f0edf8a93f424c3bbe596b60", - "d12d1116b816ac8477135f9340cf81e3934c3d59267012210145ba1f55182ea8", - "4fd944a98719ac6c34ae78a2a5859f5e5abca865aa68f7c081f62d0650a439ce", - "2ef8d9de3de9ea26918aaa78e7d2ec605a76fe41881c844663665633a3e9fef3", - "3e5de86b22c6c90b9918a9a1c2cf1ee820bbbfce0b5f5561287a3f1f22a9eeea", - "ce2ecc788e8032f31861965c6fb021a5f9ab212c3604a5bf3a01bfb8b6599513", - "4945eb0ca9d6044f2eed0a0bfccb671560e5b773ae98d651fe509175a9a15a81", - "1860555f2e7a69ad07c5fbf6063b62afce275241ed34e6ea440b7fcd75eae298", - "c4f0adfa89e0d2f69515b0d32710621ef1d260857ceb5b39db3fb6107be01c04", - "cac19d500b46320db7ff2a558d33444098a9b49dc1bbcab94994003e6b4712a7", - "03dadd3075456739331f33411455e9a28487e2782e15a89eca74c1f43b54140b", - "e2604ffed5b1c9fbbf1e4df0b56ba1782927aa2381a4a93d67025191fc83e885", - "b72ff2090bed103a6d29bc4ed642ef7f29d6d467c0e636a9ed141bb05d9347ab", - "5d3b46bd2033cfeab8a6ecdbbb0a2acee2150f9376ceaa10c68e0ef823eb4fe4", - "9b5d9ea43dac1ce4e4786af6c91285c6deb63dd133b1ca0b3fc91e89e64ce4d5", - "9dfb8f63c522d185b3fdbfcc6c78d55e1cf2f718de3d8cded0eeb3ba31195714", - "534ae5453ae6c89f1cabf99421b8f9ff49c97deab42d913053a910e69fbf9952", - "6d7e4e8570afaf9b493030b2c5a0a720000b172cef3bb36ace553d3abb90762b", - "d3ce2fde2957269c66f1cbfdf8a7f1b154923e71744fd8e2f23fbf77079df794", - "2777427e2380b79326a5609cef3e0c3178a7988b600fbe4a95f88994d10440d4", - "12e56f3111c7804d5e910f42bbe54c9a28b4fcec9e6e7d0c358cf478c60d88b7", - "9d7ead2bf33a706d51e44bf352a9a8f559694559f70fcd08504384b5b26a9666", - "475688da3968bb4d2e76ee053a431448c379f54790b1d88cccab791315c87d75", - "d54b2dfb77af535642b7e1406df5164399a85e3597ee0d78c87c10ee9ee78587", - "488283651872f368c94e5d4e1c314fe1b647e56a7fa8e6e29dfffda7d62dddaf", - "648051f7668decc26f85f33589079b3b0bfd6c3537fe91796de8cbcadb25bba1", - "edd141eb1c634e8a843408ecbadfa469e1d3b7af70d796a4d7da6f837adbdfce", - "02b11aa3139da0ee19660c58901329a8931604bcd055cba0de391bb157889724", - "e1eca84439342003db91334de63580bcbde85ff55d0704b3f493f3cb39553e51", - "cb18e248e707e8a0a6b90c9b9b8aeb2b0124cd402e7321b636fd8e5d1b6ae574", - "6eddae6ae3d18ea5f427f366d8b2c248b1188c1e941dda63bbeba8e9bf45826b", - "4571cd871180f35ee41b3241f82e2fcb2587710b79beda751e115f4670c314e2", - "92b49b8b9cf618dff0a49307cce98bb4355b552ebfb37d0ed6219ac0b7a46942", - "dac43a67c9a4868d036061ae347213e21c8f7c9a9ab2e14cfb70082b1b5b1fd8", - "81aa1f1d1a066506fc5a2c5f7afaaeb6901cd3b95ce659160d62f6f5ed0ec2dd", - "3c35504bfc19168f67310b204ed5e52d9a77c3cbef71745efebfb369b6564581", - "63c559a0ba0fd279c49e8037fb4688a025de717fe4b303358a1134f75cd27e2a", - "f4782906e8552bdc6f6647731506ecd834070b75212b98ddc2fe6be91e68bbe7", - "18564b2297c952a76a80faa9059f90368cb49d260f86197a2cf38cbe38e5f010", - "d16b1037a63927f949b3e38fd36a8980db58f2bb187e2755f01bffea2f23a512", - "5f0c12aae6e8b8fbf43e4857cdd01e9a75ad7a2d837018cc3a07d15d12e1b90f", - "5a2610c7bc44acbe4468f6ee777f6bc10dd9a2aba62b6270d238ee544b4b39dd", - "b0c4303f744913cebd601b1387c1bf44b70d72c669632f7cba9f8f76df1df0ef", - "11f4292b6f6e6b61d79e3650fed1f84eb09fa9dd9d28eaa79d5bb3971fbafe39", - "43821db0873a1343a3e0de0deca432ff919eedfcd09f12537d626c514d1b2f42", - "03154aea750424b3a5b1a4bbe537610ce3f1ce8885b44495f29d8b269472fb3c", - "96643f9048e3886441c77f9ef2019c00727dcb474176719776f57e2683a382cd", - "79195385da381dcd761c49ad217ad42bd871980584dc69eec1a3b7258010b22c", - "40fd3f530a85531da202b005f0d6417f38eb22a956422e3bb5db10fe188f6590", - "9522afa7d9442fac04a5dcc568ffd65c521895269704ec137fc8c03a35475860", - "037edb7f5dd7f5f4464495bd5061b10d8ae6975982f07f781bf92ff0a0062271", - "2ba83e783e644f7a4f8cf6bee1c3c6f2d00f2d8074fc58eafa16025aad35dd4b", - "05a327ca0301b8057b52081c19a2dca93a15269df618ab548fadadf45eb263dd", - "3787dcba293651b2b6091c637993142fd830ef999bee92c6fcf84424ca878ef8", - "49bde5f8fefda2da35123641509358c594ed76d47f0acd146919d4ca5383d6f5", - "9a0909ca919f711e779b789e9d3af4875ad7f0189e77e411dc58f6506b2cdcf3", - "b8287535b4f7f344d2679fd57da7985297b60320e3b68fa842ec0902a57bf5ba", - "275d7545e39b3d8a77dbd8996bca8614b737accfd7e2cc4c8c79fc9841d38b0e", - "7edb75aee2d54fad10b1704367ade80ac70fc900425ae584b928e7db16ba9b5a", - "bdac0b829b00782fc5054dc1e9e770707fe19b96e53e785a802c093d0da46aaf", - "bee93d3e797a4bb0e436d3552f57b9e9c4d0dee27ad4bf8c30cdf04b4cf48cff", - "e15825eaa026ddbf5456d9adc094ade1054d04574902a4348420611f6d5ce93d", - "d8a79767487d371802f938d52a891d4ac6ee8babfda18b2639cb3337792b00c3", - "6b86d147f62401e131da5dcf8c0ad1de8d0b03620f0be6a21a4082c99cd2507b", - "8f18624610838517c1c2a584cf632a3ecc3c157bc6bc2ceec2633bc0e7e6a1b5", - "d2bc99e14f34e3ea9c52dae7eb03f5e3dcade04501a205ad26d186da165519f3", - "994930d0fe9e139f12225be07a8ee71f072e8896d8d55268cb7e26d77fc71fb9", - "87f540b69f8becf1ad600a0ff4f6acf9dd6f67b35058c421670abef9681054f0", - "4795a42254ddec6677176cbd13b34122f2d808d844e6c4d83975bba0dde0614c", - "b6acf129f81076869728957065a1164a58ca1a406c6fdaa420d4bf4e042f9da4", - "7bc2811beb848f8d676685d9891415bafd110fc762eeb7f12b04a2ade95615f6", - "391ebf06d2d0c0188e1e6af1d91adc6ea26b983bae013cf57e5ef4dccf2a0ed2", - "660a9238ea1e3fb82f82d9993481ff20b83d9f65f0a2b7dc8a42f83a5957df3a", - "82119d544c1abf55a52e758de2cb7476fc224b0da357a84f8c989489e8476b3b", - "d0ca4eacf9e919fdc34b49298b66569e416664832f2d6162d512e1948213eb05", - "0ce513d8c0ed280e349c2e55a8858dc7f32449eba9a2d5c13495629746f44036", - "a6b74fae0040a78465171cbd6604bf1ca637ef9324b6e6ada115796f685ddbf8", - "a126cf59799d6b954f8e84c20e20c8c01c8d497fcf54619b864577d32942f247", - "d2050e312e3132048d54f00089d66cad5f9d668c8c06f1fc81d5bd4bea9cae7f", - "dd3692df8c4b3018a7318ad81fb1649ed4c38c454f491e48b0bb744ad5384936", - "0e8a7ece76cd93f0da122eb0f1d70c84d9e0a8a569abe95d1a759d073ce1374e", - "72c28677236741e8f659ed8a2d2c46c18205d98f045685932ac6a4d4f04fde4d", - "18d6607dc175faccd6e01e20c8d63bbe17ee8ea13b73e3e53fa4d1a1bc80baff", - "6f717d138b599313c45a5279d47b084ae3006db70e19dc86a0f4471240914e8c", - "ff7ac6832c5e2b7cbbc8f81be6e2f846206ddf2d24cb0fb604d5236012a26b60", - "c54c3ddf23e57066b360f5461f6e91ca389e638f17180b51e3268f9b9f693895", - "9cd73a3fc9323a77f20a97c997f948a3487d651e9d89f60bb85c3e583815dd7f", - "1d0d1f56bbf820e86b983fa298b5118e42f5d74cc2d125d88caa50205c480385", - "bc391b9e9cb0e4279484b0eecd6b18bdcab44842e76412d1a804265496f493d1", - "577a15e3ed64b752c1702d25940469009c112d922b20226ccbbaf7e458df1c39", - "c2620a8f632bf737c6d938c27a2351c891d149e177365537c01e4df011a7bb58", - "5f803fb54e0bd0113e2034243849fb95aef2c02fe82a266e2380eaaf6887e74b", - "5fd59adba7e0e763bf9d7357d2633ee7206fec9ce2e91e04544497e05e3f2ea4", - "f2f423703f306fd5681bd4887e87a26e497e017b3b3156179d9003bc09ceeac1", - "bba5677fd1d4facb8265d1ba3dceb3813af998ecbb3373b887362d0100c383c3", - "7c4e63760564b4b06e4f2943c2e8c22008ef6eb8bd957c65e4c1d7ab077e74c8", - "ffbd1b08b9b7bc9f18ab645a9880e18ead67a2b1fb0798a1fc2d590a0612aa4d", - "e971a1423deddd52d544b41aa58b9e1c390bce634108d5a057ed96c288025fa0", - "ef32f8fcb9d2084aed7fc2e6fb7a1a9f91565dac75da6c1aee925533e139dc47", - "c4d3ea0ca6295412b6aef4ee40f673b369136b8bf3ea75561858d922b187b077", - "095b8746ecdf257cc670386fe595eb17a3ef3d4115ccf98088d71bf59f7ba3e5", - "88f8efaf2247c55ad47f95f4370d5ebbbcdaba214bc593535df16dba8bba935c", - "8dd46809c8324c66a5adbe2f50eb52deeefe79d0db440ba665b6a2f3eca7504c", - "414ba9e05ec2ab3e168af61271e118fb0c1782733ea9f8365043f96f40892986", - "7ca531d68347d8729f78290e1160746dbf4509ff7344ce8bf4c3ccbf7d4adae0", - "03e2810fae40fa6edd19967f6e5138698423eec9302eee43ca36971f845d4ed0", - "31a9accc820a93a3929e4d69d2826b5f5de80a1b0fa6e8625eddea218a5c240a", - "26e81c7e9f62d2a5933868ce86b8c6acd97740778d28c8e5814e6d69695fe943", - "2f8ab597eab260aa0fcad24e75081fde0547834ac3c6488a00cb14d972e609ea", - "08beddd0fb31d82f93c52c489da1cfcdf22f2274e32a2884fef5946c78929850", - "d119ead872fe1a28e2d75427a70beb7c8a9ec3fa8af901c27945496ad45f2ab4", - "526027e96dd022199ba83c5193f9fe99b18e6f86f13b49b3e3497fed8ca76205", - "f2043a67847a7b1b26b7908c5bc4a1a0e8b6fa7d7f7219f9ef1f20a8a9c2ed7e", - "e8e605f9e2adacf5eea7086bc6973b278465c1b8c7b584833e31f0e7f2aaf2bd", - "ddcf957b824bc412023cc5442197fe22ba5dbbcf10ce2f1749064eae2ef807d6", - "e19c5c45edb84dae30ef7082ec26b18ae3ee3ff7b107676bca9e7a9de1a74579", - "182e8472677e462e7a4a5c8c541e28026b56e5367088598fdf8aced3a4f949b1", - "cd856a21e4c41066cade0a16227d5229211a0a0ec2017b3c5559b1adb63e7743", - "8022e2081aa7694d111860f1d4657989bfb6bf4a07608133e9fe33420de6d246", - "701bec7b0f90c8c764132708aa4c839bef37200cb8bc9b1d4db9a137bd1eda6a", - "861325d362cabab4b0543096cb6e851f7c47487410513c19c386fafdab0a82a5", - "eab9aea62d08ea360afab89d2427c149d6863610505b7d4f4621e14d4b20df9a", - "861d125cd91117350787bb7c43f42e817e0432bf4d3bacceebaf4a5aab3a7dd8", - "a8b8362a6349d64765a368dc6dadac455f5b4cb706d7d8493f500bd872408319", - "9c5f12cfd8e3786c1e978c7a368a86de4067ffa60d9343b6ceb2d5f082c97ffe", - "cd94bf05876ba1956e5d3144ff958d2dfa3980f4a9e69d3f190c13641f170099", - "2d85c8af9cd194ec581573455ec3dcb78d6b969210644e0b32fd17df10f77eec", - "f6350ce21aee8fd15b06afa26ec23efec4f900364908141dc421a986d3cb3efd", - "14b4721117b7fe22f21ac21785e74fc075beed377225d7a67474447f70678bd6", - "8a4bc7e76c74c388dd5c4b080cab2b27996763c0ae78f82ab31f9c3df761593d", - "6825f687dca969f8e4b7a9ff5eee2697226eee254b45a268a0183287331e4e26", - "de52a7bc5c3d2a7a1a16f10069bbf9c36f9ee3832c806037b84d427ff46cd27a", - "ef185bab26c5026c4e92307809513faa1a5d1f77cd93301a7eb974bab8066009", - "a02c39527a494782fec5aef92ce664b6e52ca258c5b7ccfa3166f52a02727093", - "8235de44a24919793c812273016b2741fdc9ec8b81d257cd2fb3b1b3fba29eb7", - "e8a5d5703780a7b3b5df6c0f69ff3c1284b37b782da35fed4467623c0a7e6c4a", - "5f14201784a43fd32987a3203f532bec72f330af90391101d28770a67610e9f8", - "bd9e9378f36ee7e3c66c3d683b75e2be535eb28f8013e711496192c45fad2ca6", - "a7f310b06dffb11a76b231881c22ac30fbdf34bd61ed19a6963cd4dc543f8a0e", - "57daab347ff24f180a790f567b9b5c34522adf2ac9ea8b160a7cef75f73b1abb", - "058fe23364d1c34675675c9370f7dd173d8a4a8e15811b7d945c8709721f0084", - "e3f3637268b06a495431f898f828e2182ba352b50e7f647f9726b5e3f1e4253c", - "99ad4450e6020561cbbf3b3441ca1490823878d1bc2f54c1f9b08e19a7dc40e7", - "324118961e49bd794df9eed7dcdd134335de9ff82c6e0bd6c35a0502cb886ded", - "ff8a1f63605ebf879f365396963114b177b30100d84ce9ba9a3201b40d8a4273", - "7e8ef4fc387470659ac54414000220cde6421a118e0b5ea913d32a6ab5a83639", - "9f4ef50cafb540dd112d8c9e761dbe47c171e7cdc31ff2d1d0a98f4e8718ff3e", - "36e42bbd12c025d5c7f3fcd84e5b79e5d1901731d6c8ceeabf4b45297506faff", - "ebbdab2063a600ccfb5dd07142731a2b0167d194dd65c613219f1c13a585fd10", - "03470ceadf618fbe2fd1a47dc0c2f13024e200be247dd60ac111cccb4f684f14", - "cbf4faf3f5fb8b7b265486c3b5b78770131ea6e02203871f75ea7d20fc564108", - "77fc8247fa8c7980374e2cdc9dc3f8abbbd14268564dc7bd175305f25378d632", - "81e79d343f6c26dea003cc7f9f7a7f82340260890376693b8abe6f8156e122c6", - "013820958b44d1a1cb00819dc0292cf6fb8e0cdc541c8d65c9ff90bfefa1f7a5", - "fd89406ae752d62275466933d2c6665804410ca6fa997a4b563cecb970a77b2b", - "aef4df298983976085fa91c39337bbff24bf687e46e92702b11b9b8ab747f6b6", - "291d60466816ea38795abb71940f051ea9e38ec2a5b356cbb7a9fbd7715d208f", - "50574d69f9cbf7dc7c7bbfbb2fb5d76e3910fa92763d8eb25aaa05d91295d5e1", - "fba574d89a6e312c47957f8fa10c6aa7948ce21693c650eb9362d88767edc6ec", - "58da4f8f6f35fbd628219ca97f4ac19ad229f91e6574ec6c551c21a77868b96c", - "a4976b78f36be9184b4eb87e7c2ab50222cb7fe47428d42daf3be7a025671764", - "efdcf264131578d880d85095ba6ba45c1627479f165dc4af5750431a58bf9b87", - "8b950d69f114f248c6328e50081eebcb34d7a699c3817d46deaaa34ceeffa372", - "2e7df5d9655baf2483856d176f5a91fffed05449d37fb981fa352886a6f7de86", - "f61a2d8710de4dcb66391a7c92db698edf99b71995e5a119b98bd764634c3b9b", - "99758dd8156c5d77507aec1c78dd834e96f0eab59b648f9ebed618fc1ca6d827", - "95786659aa22f5476b4d418f758b9f791e2ceb9fb4cf86187118329d55437ab8", - "a0978460a5e24b4485821bfd4e7e0af172a2eeaa200afdac36dbe858795902a3", - "a6a2f45fc278e54465538c7a80df275e2027db019fb52df8e0f0b51b5fe97050", - "1dd2c7e369ffee2ca3ca6e78d7321a49b44c03fca499e239e2b0e240402b73ad", - "ef73f04cda9c6e876ba07518f14e4c640dc120395e9b46ea68fc7ef49529e741", - "cb5355227b1b8f759f33863f9d39fb805b80d27bcf4d3373c090038b9b54bbe5", - "6db13142d6143e91eb2b38588201d52e3137a6da96e813ec6bb06429b2bfa16c", - "f3fbd3efd7f8c5fe9707272a434e3574f31564b5a884d6c0d01d8111f47220fb", - "424893fc6deedbe51d6dc2340b4fcd05006470fb79d4eaa9bad4c58c61c70d72", - "21184f6d4978fb1e0b6dfeb9d858577d5587fc897898d1f573bc517b522241df", - "b2aa150fe47eeebe864964b473151933296e355443a69cf106e4e361b6c86552", - "07affa98f8e54c2efee6d2ad46d236043a496c1eb2403186f19c146130227dce", - "aea10bfcfaec9e71fe9e49f25ac74422cdd863dc303b9346ddd9537012788e5d", - "28be4c2c599494033b310df643c95d3de238f382dbed912e4ea4732434020275", - "d5944462ca0fe650c245b829a4462db6b53772d934de528dbb1addba67758b5f", - "5e7b9fc2b03c75cd84e7493769e9e6d8985cfa17f17669c98963e19eaf300b5c", - "819496bf659fb5217c49a6232362cb5f103ab1c13307c999b45fb6009d7d7eb8", - "eaf1bc7a579ecc6c2767ddc6d70cfcaa087decde88c60a4cc2e5da6bd1ba3aea", - "7535ddd26cf3de0f5e2b3a3a1f8c7df9c40e0668b039cf343b5e37097c0b6199", - "ae2faeeddecadd57ad609a9e1a4734867be5a259c4be4752515b76e5c4ec15d5", - "db2d4eb349c27733e753f93aafa19b8067b67529e9ccf7417e39f7b90d634e90", - "9fcc81300ab6c405a456716cfc960f9002a4cd518be87402dbb64f5beea90894", - "7b2b1d758da31dd887a4cba1e93158062c3c6f7ac2dfbda68e2a184e119edd21", - "5692ea9dbf84a5cba4fd20ca4b9161574b388fc1e897021d8e7442457a27ffce", - "14bff7a02e7422c17ba59b86d9c69f614a7b610deea885bc64cce11661b7669a", - "dde63ee2b1db513ca34e9eda392819a8dd70bf5d160ffcfe2ae38cba35f041e5", - "33a1beea623e1a83f378af1592db28fa30dd1a73dce9c8eacc82a1cd1152e503", - "8e90ce52a71c26e527a66eadc1a0143316c121fab53c10e4c6c1a079ea1e2ed4", - "1171b4a9f23e6366a4e4ca47fff9fcec6685f5225b1fe29a52f47b3502007a5a", - "88ce5acd8d436d57a6adea11a345eedd889217c473f5955b878d2184b7f105b6", - "799e344f9c4d2c7026ab428b8bd9c1341914e832501e0f7b921271cf1db6e6cc", - "7576955f9653af241919282e0d1953a37e0fe81f1016476a759c51d4289ada84", - "67aaa794ada978fc6602a2710dcadaf876719e269aa086c4c9eaaa293d989f99", - "474bfa2748cecd6c3a77b3e875cd657fb31975c9d8eea6a1ec58617536372ee2", - "bbd6b42473db90036eb2d31eaea90fa4b1843cacbca0b827712dd26f000853a2", - "47925ca2209766abe70bf1afab86c068e2773b618434ccceef70b5872541c601", - "1cd7916b35978fe45f4921ebc7891b425efb0035941074f3aa14608be06679f6", - "008d897a1e11f25ad65fe43535eb882b2c6bc095bc80b9dba3d3d40bb64f7593", - "77c0048c5297c2bf5e7ecd8782a76ccb0ac6360fda15b007f2b7b3e5e7aba8ab", - "64f47a2d90f113725a16f3ad49419c0708fce4423c6552a97b4c9bb9e0e90b48", - "716d3859377232e3d445f4c25fac770205aaa1d0f3adad69d985a729224b9370", - "eed2e01acfbbf93113425019e5b293ab6fdc0a296b3bbeb458afc6a155289712", - "e3378f00fbb9c6b889afc992d3047e81860f156915159f0c6d2784ea75062c73", - "ae6a4e66b84f9a2de6d8cfc17ff3c5790ee718b3351171f9cc500668c01ae2aa", - "04266b2143179ed3bfddb31155d26f3a885e7a7bdace75ad1c00366fbed03891", - "f36d685de39090f30f6f948831c3ff2430d21baf123d63400d5606af0e92dd0a", - "fb4240e9cf2632c510555e8bac2e2a959147dd3c6a315e0452851ffe6c591aae", - "9797c7d5ac743dbcbcf2669cae204bb72582128988da0ab385f6ec99f3e2d85b", - "c3c5337adb78cd77a548cd918398647a737deb9da40b044f96fb5ef81bff35df", - "881cfcb504a8f5b8a86d5f6e033d958fde27684379ec5c25696961d0f9bd6da8", - "07a384633d7cef4b55f840e8d3767fb72fb25a55ad28c22de0cb731087ad5389", - "a768e3f7b418170200994481c77baa8aa8c5d0d08ba9e5f7840eee2f760c37c0", - "d43e2d8011f5eccfe1be79a0b4aae1b0afe0df59ec1b220b75aebba8e0b92d42", - "314ac45d40c68b4fdf52ea89bb9e9ebcfaa47d6ae7dfe4c4f8c944a47917d729", - "a08e9922a4a330ab482cc873a675336b0458d45ef7c8ae486ad93ee5191bca2e", - "1472c01402bad25d35b1a5119f3186d17fd175245daa38263d481a9787fedc03", - "d692c1f541eccc467cc0c9819fce83ad946b7a9bc1704ccef44aa6fdc906edfb", - "559bdce80fadec95cb0ead891fd4bd5373ba8376abd472867d0208a74e9f6818", - "473266440585cfbef7fed587d5ae542a38f316ac1e71d5bd0e74e3eced4b1148", - "3eabd43b3f9413200c39ab541e246e4ec09e8de42e93e5f4806028b7f242124b", - "0a66f7d42fa1ef0815cc00b24478849eb255986d0ab2c9dbdc0a3f1b5d0736bb", - "17841cdea0ff2a776403bf936c381c4c197a9474a0213d1aa45a9058b04dbfdf", - "0420c590a6a6c4a67ac067294131ff5dea29be7e5b5cdc52f6d5348c141190d9", - "73470c695a4fdae714140673f0b2ba8d21161987cafed8a2a1c4abf31777077f", - "110ec042ab92a337c66478d59718cb963af755bf97780218b27e5112ac8c1fc8", - "a2db27e2f872ae5febd0715b06a7cd8bae87389db4dfefafda10bbfcb8193704", - "c5b1c754b526d33bd35343d1a56a26ec62fcaf1860eec9f26da7a968d8c43905", - "0a3e6f63e9546d15a08f8da03e0bf955b92bea8c27fb7f2c240bed4abdebca75", - "b077aa28ec306373446561b12fe16a5b0a351facf4da99c96b698af3e837cfee", - "fa55e48d8e896c73e5e1602799f98d5854563daa6c8fb941fea908de9a74af8a", - "3cad60d1aca8d9d333e7bc70fa0322a302a57aadacbfc5581f7a4de0aea63131", - "a4172d4e179afb97dd72e96e3e3086f591c07e75222d75114bc1f2d8a0560c11", - "ba34813c2a2cc2b532efbd57372d05ccacfea8c1d54e824745351f5b8c47ce36", - "e2a792f086ec93186cea3b902a606f3033daa09afec3cf1f8ae471c52669e924", - "36463c805f035357699f8091dd385ad8ff6f53e46deb89b472ce7f331f1312d0", - "15dbf210c1a19bbc0a890a1a04dd8b0be21b2affb971fe3b6124c96441a97800", - "16ca81c63483e486b95e9936688c8593089923846ef33312c4d65d3c00b6d8e5", - "d392dece4c08477eed5dc4dd6cb6c656dff502720f90fec6e5c8f2451e56e09b", - "77ca37e6d0f4bce1efbb28407564005da9731e5259ca489a9cdffdd04eeac65b", - "5685fab19cb77484ebbf27a36b01d5b4aa6d8faa5f94f777feae68bfdac66c8f", - "a1b93e8db4f0c31ec9191f7a5ccc8346322f7df2b77244a85086ee1f202de3ce", - "9ea05fa69352ec47bbb589e6f0ad75ca3319fd6a2d0c45817b542901a93bce40", - "7b4c92a3f8300d14e3e7350a99b19747222b50f3cec352d0f0d330aecd61451f", - "6d348f4975809b84e1db72ec5d51e78e75a30a55fab0a4f67821a4c15138fbd4", - "9b32e66a48f8bdeb83eabd90c0adbca2fe3904b42f5e63a7590601461c7e6f2d", - "2809fae4cef60d87ae076bde8c0c14e96759afdab4ddef2a18c724995c32b93b", - "7a412d50e4c303eb73bdb08096d3a0a56aa10b5d0f5e07b6058a2de1d505c28a", - "032448bfc24b43805ccab65f08067480809c3ff108af218f005fba3e4fbf00da", - "d109d3de356ea09e2bb09724ed3d309432e13463c13586e627b56addfc632fe3", - "7900d8c18cb0ff0e753d613d534a01a85a7bf0481ac953091518b48efe02bca1", - "861b1ddd6bef2b31e888576f4f07601f2febef9f3ec5b9bb605664f02bc3a6a7", - "d9d4a78555b7bcb84b664faac67f37607af227cd3511cc0c10fe179ab731177a", - "0f86b68a50a146506e731f4ab69c6ee3e4ea2467d8c500bda90cea5200d4fa55", - "d12ef8acf68d15b82a84468caddac0c0a11d5af32450d364b08491f7e0c40497", - "e3ab6902990d46293e65f035b377594c50d2083203562159dd45a5d855dc4f8d", - "c9c0c1590e9596e2cb7766cbe7e667642cdd25e4b8bb3c316e867312c471ddf3", - "0ad46e0bb9bfa05d0caf966ab55b7bc42a62b21801ec3bf1db96dfa940a1a50a", - "ab5c45b880454025358abc11ed77b9ccab57f8ebe8b2834fc5ecb1449e8f177e", - "7d9c34a6aa31d7f0b9b76ebd23023021031eca4df604042ab6c0ecef7cf1d14a", - "62fc3d49a1fda9da9a8d2103d1ed2f9dffd38d983130b95df74ef1ddf251b69a", - "88bcfc4424aaab437018f9b1c5bf4f69d4ffc800f6642b19e5c52f95483c1ab3", - "dc2afc1cffc9c88a37bb3009b22a37fdf03d4dfe714d54be07c66f4f40ef89ce", - "650bd3adafece25d8e7bbb36c14d1d91ad4cdb4f398ae6e4c335b334bb193861", - "4d76cdc02ff6a2a7d090f56664148200cfafae5c2c13153a35a20bbeadc11a0a", - "0ba920ab44767f25f1f9564ff656e65f6dd9485d3bd26f5af0c29e505538c07f", - "2e5b88094e158762c359c03fe35d70d95de1acc42fec1cc55f9fadcb48646afc", - "9d58a7a8856f52c0ad634b5af78de3b92309319ab4a2640c4aed0796c68d0dc1", - "882d99eb072d55cccbd5ce009232fd1f702697296eeb16039f1694e6c75474d1", - "3ad7c9200adac61eaee33e2d58d0f5ac5f895e0315941b4cf97ed8f5e19d6a02", - "2b886262b89f9e74eafabf1ede3024da6b1b009b20de332a4e098ad8ada041d0", - "547f675161e6d6627c171c17959c95a42ecdf3a53632d4c3a5c03c4afb7d1bc3", - "add91cf6ce6969d274844e37a536f00d6b14e63604342f806843d2d2beb48675", - "155b4dcfa2892ba42f659624dc4ccff2bc1c7bfdca2963c2be575f47a669b849", - "a5f5233b5283ca53f8f7c855fece8fc7edaaff76ba2f441cfe6ef1837aed021d", - "96ea47d409ebe317d68e6755951b200326cb7d1442ab526a5d591525842c61df", - "78f53709da0fa44dc282396dc81aed3f0ecb80b0c5e744ec487ae35a174e04e4", - "b9ba8e555fdb8a47dfa35c78d153d536534d5bfeedeb5f1d687eb9658e71c53d", - "23c2aa68a322056d72290e989f0ef77d8e03295001a279c76a926a20d02a83cf", - "017a7e5bdebed83c8deda21738f03dd11ee6c16ccc78f62d2287b939111c7e52", - "72712943bbce9e6d530e084e525c2da3bd4eddaaaa64c782b239d70bac48c529", - "ed8f57377fa412d51ab1738c4ef50378de399c78af004f217e51e5d6f86a0513", - "9c4f6eff41dc10548a3ad9cab29ff5b68a9c58f477b9c8958be41fa3b9b152ca", - "2a5aab633b9d134dc09ff3d79439fb6dba22cd67999ad508662f86e396525296", - "eb9e96122258d3a86338e8489c66cd5689aff694f7d308ca3195e8d89a9a7ee2", - "1163c3bd25e7b6a5413fcc8b3e7219a839bcb26d049072bd68ea0ab9b7e6ef7f", - "95d70049f9b973165d23a44ce4adfdc5e6b695a67f5459d9bb7f7de45b16135e", - "6364d00e5bee82aa0445703f569fc1026d066fa7e2e7e2a4bbe1bf308a500c8b", - "c16fc4fc925b9a4b92748ea0ac8810d1b1f8a85addeec61ece9ad86495ec6ce8", - "fbb42c32c0947f0b40520e2e1d3e5ba2e4694d161aca9e66c45382f963932267", - "65d44fe401a70516fb6aa2117991a3c44ae8d161f809e1e5d093748dc0cde98e", - "a0a287e160daa77dc4058664399eb7a0ce078136a068f797ffc37e68f3152d3a", - "03d547711811f24a1ca369c9dda3e30702ecfa572524641dbf84c3198cdd249b", - "9c6795d86a0c0086884853d8a62a231c74a5b680bbe7bb5a0202de91b8ddcb43", - "c395c0614e4122ac3752e62fc2e8a25776b7d33a3a782edb1a453a805f6d740c", - "39c722870cce28e0744e6120adb0732ed144cb5ebda7591f380e4cc708e2861b", - "1d8804d67e992ec50e71c4b7038b09e6bc0c5b8c5b5398dfda5adfc51e0dd221", - "4872e027bd73d2bc0a67519aafa4e65044e5952f60638623b0714925487f98ae", - "2c7d3137656657d5b4ef96926934f9f554ef77f19782e444ca0bf441a106789e", - "aa24833e02091171f56b910be7d01315f3f7e9a4c6ec3ce22035d57745ac2b06", - "ec00245cc083fea94d27eaebd80532e916bba1984e8d128fe4a1e5519dfc9b5c", - "483f5a42c919d7e7869d9e9086a7dc72bbc9fc9a11f4d72b538e8a4f26fe1775", - "2bdbab2affaeb7491e8ab44d22e2de7ddd2cfbe56f385c20073d033f184573af", - "e2f505846ae37293a09f52403e458dc2967dcfd60069ae38caae0595282c622e", - "c78ef00db28b714d69949622d88e340acb08e17ba4f9412095d2443978062f0a", - "66ca44c7065702bfcdb74bf6c7322635d132ad5bf8f5e0419fd168e65492fafb", - "b86913eef9ba1853716d1b98c2d5c598ccfbd1651a51060a972269dfcb389809", - "88f5e45c3b99974eeab577d635057adc4f814c990c896f285fe0f12f21c4a211", - "0dab2bb28e36858d7148870154a5e5d811660b1390ee640f6f1b7a8cca56f2ab", - "b598c617c1aa3206ba1a6d9159643f29f3fd2496f4849ea84e63af9bc5279211", - "a9375743d8c5053b798aaa3dde0e11ac0a875b9a7f724804edb4684d570e310e", - "90883783fceea669f094816fb9c3cd7bd319e731efecd0b2525e56ce78a6916c", - "ed8c8aca8a72da7412e200f205d8c89e28850ad40cec1310eef272e25f8a4165", - "dbebcac18bffcc02eac52b0c9e0c53bfbb41cd2ab5524ef1d1f774926c3e3115", - "f9f878247d26be3653f45fd688d4748318693a535200b2f3c418f8624b8ad480", - "98c7d498680c355b89806251f71e12cf54277a879b67de32949c8b8dc22d1631", - "043eb43b41768898cd29bf89ec119e2f9a0765dbb30d422670bceddc740d6680", - "4b86027ca639946df65558a0703a2d4b961d4fb7c88d36263ec94f23be45259c", - "f27aaa93640e79a1c5bfdd8ccacd7da190e0e55f6a3f90a2e4c99e2a8781b8ac", - "3e9394139c39fa2f3a6a2107647a5b9869735a6acd200fe960b877ade82482a8", - "29b45c4fc9e84a0e93d838b5880134ba846ee8e89f0026c0c6fd890a21985426", - "78a536dd2c869a71ee6ef71869b24631e4a64b749f6a8060a37c0223556657dd", - "5d4b43a1086ba575b7faa6474dccf367d9194e2163e06230885c663bfd9fdd37", - "072a02104c80b254a62cca37299d2aa3aedfd99ccf358fe14e6fc50700dab182", - "caed30241f5701ef16e2e0de6c0ceed328814380db04d2f0fbc12d48f8a6ff55", - "8c3287458c5ce6964f557c9178a774251235001b5a68f317244a68016e60a58a", - "7f2bb95674b388e7b010f805b58bc2a649d81bff00142f8c3a21b1293aca3271", - "c7518d411bbab1411c7e1902f254fce75cedebd02ebe804cd58e39deff0f981a", - "fd5009812492b8851721f94afce8edf82f3086981a5df137d83e42fc96a66550", - "dd8b974e60c7dfe604a1774901f4ecb37cdf522433a3b16542d441751f9c5e35", - "053d2350c0a8cd5cad3246bae3d22d2cad71e0887fd0b70bec4574232e3510d5", - "ac9aee14fea115c93049d32f2386070f3230e3ce93263820fbd4cf651d73e204", - "bd30bc5a81a609bf0d7fefe950ae6c488a4dc7821642cffb345ad42b24922031", - "b3850308d90898ac40af593dbb4515e5a738e357639086892494f7bc98e9e2b8", - "fc69053b86c03d4408007131c3da1a23dc89b7fb31bc0c5bbd287a925df5566b", - "6c896d200083f9286806d8da1c0d3e933f9cef9124c4b7212035dba420fdfec3", - "7fb0bf7a43db11c339aff821135cfc219ed6858981340d2f45de9462fbb96f92", - "88e4093ce1badacf9d61533f0b8e8065873ccc6b8cc33b0498b6be48f9fcea80", - "0937b39f9c477bfeb2a9333350f100b73217d24beb9395572b8f3f85bcfd3c3b", - "5c58bfc11da0ffbfc8744f42fc4c3c734e49ed979d0e1b7a54ae790bb6bafac6", - "28a4846fb02e536863f4f75b880a6c13537c27072653a1a1bdde7fbdee631d0c", - "29fb759b15721f8eceeb17c5e64572972d18015ceb35921d5118e3c54c64e850", - "1c16f2b0b5d59943581f4ea7b3ef48c3d2791f25d86d73a9f0f7710af49b11fa", - "a48a552b19558018596b189761a713022470c441fa3953636aa42480ed167753", - "ed89a6d664fad9c61df1418744936369b4902737ed1dbdb22a84652304a10648", - "34641b4140034a3a4a504652aa61d8e75d228aa583578ef5e74f107c9aeaf60f", - "dfd38d4f3fc28ff3fb5332b0b3a854590bcae2f3d3d731090093d192be94ecd9", - "99a1da934e4a95387805d8604b5e1be1f214e9955966f1e27e7bd139e1953885", - "3860d4de8006dbdbc407b6ae7fd8d2fbcd13b6ccfdbe7f923f6dc79a39038207", - "4744b0bb4cd87fa56f79533961df9ae3577c53c1c645895e980c02bfc3a779b9", - "5f409d75cd7921af756c8b05b2ba978361aa5767272509eb4d09c07032197300", - "2839c98f3c9e658276cee3a7fd8d471622b8075e51c76d92ed9bf93edaa65406", - "d1c986f5897625876cbe8b8f381268e49e95795fc313b69a19236d8e197007a0", - "c28bc95697577a908d8cdb592cf2748780ff04d0032c92987866132d026e68be", - "ffd2a93431ccd9e6bb071b78a1b4c9976b18ba8d1e8a4a25bcbcbd7e77e2ece3", - "ac7515a36faf998716469cbcdd0d639715bfc42941df1819f713a0b5ae184b26", - "08f559dc5e840f783256e8ab381af42a688761f94ecd1c44df875a41af95682d", - "06a474d8a4d3248ffa7a5a3fe7e4ec4ae054735ab66a117c830d5b21c951e6d7", - "fcd2963d030972c7512b75ae4d85cfd6697fdd650292eff746d0e75955c45d3f", - "29a36570e63f9615ac4daf2a89a3a4c5c3d5aff792019120b6aab03223b85898", - "b405a7f2818dc0cb7e28a5f82444cc10933951f8984e688830633db7d692a96d", - "ce325e185c933f4e3af14af3f7f3446334c2d85d83adb59cb10468034769560a", - "363826ffe4bd31e11f37e192c0d6b37b531c3d3eb25db9d5a31529f31c8d8089", - "972a4e5c6c388fd8f2a752071f77ded1459ff8d05b0057f56ce0cc9e0369795e", - "86fcf436c0ec9c3bcbc6764a498a99f13a1440c7894c1e41564bbb5ec51bb080", - "527159ab6df80338767c42103348085f9ad4881e5c809e25e4d2cf5df6645591", - "57da6153d665ecf02ea3dfd7a8533d1647ee255d9a8100fb76b7d902960c1909", - "8589504810f934914ac138461a88b677f4355a9628b56300bb531a3ac7f62ae6", - "ee7e9993b39702e4cd352eea9110ea69a7d1ee9d48c4570bfed5a1dc953195b5", - "961ca1e0e249ace0d277fc4b1ef658f03ff060b4fdb98f9beb2613fc26c97371", - "507c3716adbf2eccbaba16f0c7d10a4cbc15615b898fb2355d1ccccf2967b5e0", - "7298054878a96857f70c75959b81376421492d65d114b6a4ebea0e3b3a9f670a", - "292a41e4941d201b7f119e6f3d6bfa48c8d17fec403b4ee3a975268d14c7be5e", - "3dddde8ac38b6c4a6c21547c62a3f91d420a9125a13c873193e5dfbd7d3777a4", - "c7aec118ddbdc0aac3d18691de282fbb41d3f180a1530e53e18caa57f63f9a68", - "910b73fb59cfd553792709c12bf7297484c531828ffccb6121cfeebc3980b18d", - "73ec2b27f0145c2b4cf70e2c200b8a4d9392c7a623e490909c860a234c1b33cd", - "a3d33ecfb4311ce31e206bd13b208e252690396f82e9e5d1b61bfc62d0041eca", - "636e54dc5b0c43843130c368e46720504513310900d92c10da3457fa8ee36ac9", - "990e070227da729e1112f97edbd81e33f9681f9141e12bb3a262bef386bbd61a", - "08513dab08cbccbc1bfd08c7e26480e661b7d827c6eab77cc868baf4280eb1e5", - "70c3a5a43b4b73fb989f177a9340f9544e53873c2f31e08ad1c3b15989090375", - "63f84994b938d4fe8dc2ff2b0500a1be4480f157c3dd07f0859f2c5e608ec481", - "cc37bd619845c398683ee0d048acb3aecd3c8be0f951a6659bf8cfdfefc67001", - "9501cd285b51626bd1042bb8775b25afd9d7dfcb96534933ed39c0ef25f618fd", - "cc833d759a353cc308e90ef76b63ed14d69d9ef074576931dbf2afc4c4e2f491", - "afae1d0a75a62733dcbbc04c4fcd2f6c4047d67a5315d2088733d35a2ce22e57", - "fa001181a543d2dc14d1e21c46752e10e4942c307c1cf9f92354031be8f99d9e", - "b9abb3c452aa9017fc5b9ee515df098a7e44fd813da01861ad659577e92dcf70", - "2d81fa9d5d8c42ca2b10aefeb0a7952fc9de2a93d22e3515e6541dd624a07efc", - "c4a35c7a515748c821b498156d4c07d7bdc45bb28b05b7c74563f0b0fca719ce", - "8ef3266a578f93f476eacd67b99c922f2fa0a9a7a4f3f13900bd6c879cc7c0f9", - "88e73b828d10619d103e2da8bddbabf8d43574e05d1e046a86183e6807bf3db4", - "a7279b303512333e3ee39f0dee3d7a7283eec0f6e926aad737708ec6646a4a1a", - "305e036d6b115343a7b86cae6e574608f920b84dbeb75ca4e62c1158041c0f54", - "c370b6a501949e4051e91a33fec5c72ba07c44992ca1ff945efca0d12a08f593", - "392e559d91dc5f800df761d2a4c0dfa2613b5672b04715586bcdcce2a878dfdf", - "1f59e5e96e80a09faabd56e7caed812da0a6e80903578b02cc2ae2e77cf5726c", - "b0b229314a80bad0eadc687e1f20fbd89e6bb5708904fe16929b7626b70a1adc", - "d98ad917b6be6f846c08312eb7555157778238eabb6eceddd025a0030f8004bb", - "3c3ebe3977577e236b216b3e3c819a0182c925357c27bd0aad8f7c9e6fa4c358", - "052b29828c44b1b521e232fa3a7a5e12de68e6cf4785690051546d78854becbe", - "636bb76c30918f79e5c9fac1a0a2e22627763a3c59f562360d5866f0a9bb0886", - "47c6a21d24e49408b313efff8242f265240c929a9d1807d6898b308bc793e111", - "bc778883d56536b29506db77ddf7f0ec3d9771b812ab524057bc3d2e0a6b8572", - "06f1ce94bc3aa65158492fa58561e8c1a1db41da8c31ee8d66f60e92763ae565", - "506270d583705bdb58b7f73e9fe396754497fd79c431b911b856d134e7dbc2eb", - "41de535c3c8c3c7a47b56d145bc54378096656be572934189c5f1ff7b18590b6", - "dd52d085f034d0da2d1a67fa89d1836faff2a7d2f61c2a116c55b1da0c88739b", - "49c2055da67179e28de4fff0e241d726e7b7742d3e4ba837561572fcbc6a4b58", - "77f6492775a59ab2bf47ad04fb24210dc81dee3dcbec21600c764100165f2901", - "a25ab86b2725e6ded9928d2fcb9069c74ac080d42bdff9d13f24ca096e8c381f", - "a13454f511a4a3d2034212d69ec390745ed62ffd50df5cc92123e6da154559d2", - "4689c232c80972caece3e3e3a8520c5d3ad61906634f1edae2be2be22fe1e33f", - "3f7add505a8ba5dafd634fa0e477299194456afe159f1127bec826de355093c2", - "71a008744acc4dd8bbc1ff19e513d627bb40288fc0e4828861c8378c647e25d3", - "41eb14c74f4eb957943ebb9fbbd3daafd8394d16d927eff677f78de85f7f8bb1", - "9034574693d14c87ea825944f7ae690813000b5deaf4689b27d98029494cd4b5", - "bbb33df15fe9f1c968c097501dae3a7296ddceed495fc477ef4ce0b54985ba41", - "b9046f53e47ecf073f015fe9f137286f3274ee8be8f504f6a3f884649a34344c", - "fdef905cd6a3359875b16cf00477068c5bdb25635dd3c8ee1a8935237fa2ff43", - "0025ad20c44ab3f345ebabf26dc513b6e91dd7dfa8431b48426da5f93d728808", - "b9292a5afd98953806d4be62a31e993d601d25eab79c4664713941fcd0006adf", - "d180737ec47e2d40e9b1fe9c3658e5ae1ec94a9c77ea750ba3d34be28e48024a", - "abb5cc5d516d438af43e1c308e4666281b90f80ea25e9d6c77e0fff8aeb865f2", - "b30980cb7e97d886914845559c5441d426624329f7b388d1e88473b439eab5b9", - "198a34568a5265e81f1c420e775116abdfb148f17d3c38e3dd2798ed9e0b65a1", - "66d19abb5413c794232441b6012daff820650c627352ba9dfd3c9b6fee6bc21d", - "aed2c9684fa87acd08e8e53e65590db3ffc5adb3c4dff690779fc8e047350945", - "e873bcabe5ee73e4b8eec1fc4ab2f8d9241dc7f3d249908a6c7c5c3a26021ea3", - "961f54641296cc712ddc5526db6a1a0fd75bf5a497656abc3ba5751c33d4abe6", - "bd86f70943d4246645dbdd8d3f53951f7e7d5370151c6a4d78fb247a754ca5b7", - "775b1a69de4e8120a89612aa116c9bc54e32142b45dbfdeb34f7c27bdfe009df", - "9bd354759a2f252155c4723b8aedcd282aa2ecac1a2f372884e735466c160070", - "beca4d28598d000c4d8699d43ff2c93304c1527c476841c049b99578ede35cab", - "2dc085383b38dbca79c61db24c816d22cf8ddd8186024533cff8e254352d7db3", - "be5e88652b0c2bc120545f2b98bbb775e4cad78fcbf9a1111a8c72f3b57db8a9", - "f254396ad009644801055f63fcf35ead4f34c805a34b13fe3dba91303b7fabfe", - "e40dbd7745023f08a5b9404d9032a66d9a9448de38a25e0dc85bde3899c1f775", - "a5de5a116765a6c8a78f4d51417cfbf2b344b7cd1dfe4063db7ed8ebf62abc1f", - "288a94fb759f5fb202b2ac1603996ad0f7677db86bbab03edcd2bf1d317d1053", - "238232a3b6281003c0ec693fa70a8b1ba8e3b44ed34cc0e7051466235190c2b6", - "7a298f990ecaf1f3235492022e898a5b00e37bc8e84774e930fd59128c1bb13e", - "7eaf44a7f2b9a6637ebb776ff95d835f7160cdab47bd7627ca783e9374202266", - "96cbc2b53ca95e91467322f9890996d6e7d9dc2832cf3b335f77a979791f5442", - "982008ff377567acf8eef58eb41ab1e1cbaf7f15408151ac10457787ca6519c8", - "4cedc46ba9d8024e24ebb097c778442170acf1e0c26d00e72f31532696441ee0", - "e3544457820fdc1250b7d1bbc61babfb5471ba00251c20735743d5061b69b24f", - "5c5cea567963f4f3926afa2fc05d97171e583621a62cb4a2bb2292c05c83aad0", - "b65f15aacf0e63d0551ff5ab76330441c955baf1daf54957245e7b075796d4f1", - "a7b4d858a2338bd6f3deba03fa90a7e4ad56e8b453b4bbff5fa289aed730df9a", - "e671f18a6a2e7d6c5a93bc15c68cb779256cc04e4385a5842696483917f5c0f8", - "0ebe96b2130e6c5b7aa492c271e003ef29150a0e32a38907e30bd5def8a80425", - "72893c88555e67284de453dd09cb5d06b5220a8a7816ac6b56bd25420b5f07f1", - "b11f9308b5e3bf2c51b074e7dc965bfdb77ca40657d90ff1beba3654284dde65", - "26649bfdec75d1d58dd6be14300856e1766c8ccdeccee3c1627603262d30e56f", - "ecbb87fba39f0db59da5fa43c919ee971fc434085361d3672fcea5e876b2c6d9", - "a4bfa2cdb79676e45037957040e4483a084f20cb65805acee2f5f131b2e8400b", - "cd1d07d95a8afb3acfe199e84d06979b6bed08310a4f50ca681d7f7d9a5ad8f7", - "e030bcc23966a242c6fc0f032f628e14a117c62140fb03b8220ef9eca9d454ee", - "a8de43bb8b79828ff5d68bc440878e7005c59b9aa502a47ac409758ced2f932b", - "b08539047d1974579b72f144c5bef37b9cd899ff6c936498a9e023f130d1bfa1", - "a139e006c492cc63890e94b565a7af3153ca765f5fd23ef7c8bc321ffaf9057e", - "39af9fd3a62b4941681f37576ac4b04593c632f952ee32f37304fd00ce46554f", - "5d763625309266e3db9824f45debfd2d808f744e2b3dc1e878aece4defc13ef7", - "8041131e8cccf99d034f69c6f54ecf36d9c79429340b93077712485c66c7465c", - "5fb61b37a654512fd46c3e9b5ae163ea1df4a6b17850b2f38978ae23347d07d2", - "b53c97d51a7d846912ac850d767d24e097d1b9c1204ea415842617ca300d1eab", - "49dbc639a20bac4c4f9289eed0517f81d90fa663235603cc6bf8fe7e26400b5c", - "9cbd6814f1060907a15f629ad02ca18b64510826d86f480b97127fbc5f4e2fd6", - "6d9fee68ae525a50ed2c74b79d0ccba15ce26350fbde50603181aed7be3d289c", - "4b0769e72bca429e025c7b21415ca5aed064d6cf0f2d46e223bcb76e398bb6f3", - "3be1430b8663b7d5b5444cb2b2b830d0d1d054cd40bfb70c68583a96b1dd110c", - "a3e2bb30d56c7083ae55cd126b040dcac63d580b163d66beaa6dacba721214db", - "25fef4a0e17c5b5cca3f741dd280714a66865c11a7f5a7cb52805e58b023304c", - "e34d1fcf82305cdca3ad317ce08273cae64dc1b0a0a67c40c81f0ecdd7b6366d", - "a41b140fb8e04e7036c0dfa956ecf10d0a8925642abc33174b2dea73e5f5a146", - "9c5f257b6ecb30ede496e5a542b9e4b1290b727848b37e81600eaed0c899b85b", - "c434698544936d4a12b3b7679b0ddec7cfa56feecdb1a66027668fc87d814e7f", - "a33732c94cecddad64636eef9fd0ca63a75eb7555b12f699d9d03330123ed602", - "56cac8611a1bd448c3a0129ee55022bf407fc5c16a6b3471774f0a2b62897668", - "6c89958a059b27b6b4e1d3a7a8a27ce019de61b56d231f03724feacd0bbe2b64", - "0b14d65d501ded5aadc234aa1431f2f9fdcd40685771e2efe5c684eabc7975a1", - "29609a9a01d39e61d5d0bd9ec29483af39427717ef30cec8ca959f26130fac1f", - "e9c9d98a1a6f2ecb8d5757b1df1c7927e4fd8002d273141534985390fa5a2263", - "73df201e19b5395c99ce45110679e6e5b62b1f5ad70ed26cee577d2dab50588b", - "efd35e15aa954836154c03e7779a3adf44f379eb4d2d52fb51a5cee8c94f9959", - "faab264eb49c5c2f9c8cb54c2a95d68cf9116b295efd8408b4d28635f063b614", - "43bd03af49c189b946386441d79c11799dc6437741fd3433b249afe4af4a01f3", - "0a48de84621483491a2beae415a6726afa9c6313e6f1a3f077a8fdd739f8ee3b", - "b38d9e52f0e4fde0bf8bce8a0e732c9a3af3fcd3c6a590c907be352b6ddc635e", - "3979e7ae9e3618393729c5504efff8774b55aff675f3836ae51898347e9031fc", - "e5cac65e93ca1a8e891d9ad58406e11a55605edb09db8de79483e9a6ba3f4f13", - "1b33c53a424e1198602e4d2139554ffdde685c17ca8cdd50853d29a3b17b6c81", - "e08e207e3b6503416ebe56a7427f9a84cc4d663873d9231396ef20337f22dec4", - "8ba777766f8dae6990e054e0258fcd75a8e66c44c8196242fad4b28ae01b08c9", - "ce2a73443881b0c706f9123facc5e30caee42a9cc342cae738427010b3811fb9", - "8abc37d6dfab39c82664492ec54d772efdb20921b22d059a1651bb191d69a5d3", - "58a310bf48e9feee1512c04224821dd08187c3eedca9c41924b681c9ea43b11e", - "01230c454a6326d48a99cd817e52925c58f58eba82e3f29599e84d8d5f57d1f0", - "d07b61f9e6453c3dec41138458b64bb83a106485d41a44a4087aee817c6b7d99", - "6268acad6833c3e53404dc16cd6fd976a193d28a4cfb55f6d5bafd3da7db05f8", - "1c1caa41e249a31d1771ce5b41696ff6fb9ed969ed4fd6c307b93287e581b4e2", - "89da6f0471258e0a4818ec7056be0e3d8d1f6dc46ba2dc9d72499e87b147f535", - "9f210d27f56bc3dc5941cdf8d06f29502e9bfd2bba98ee8254d1b1a4826ad402", - "71213006497cadc50dae970a0ce764653c167910ba23d5d45064ae94051fd17c", - "6e1e5eeba6dc9d4c9f65d3a4c3614728091095252cab21aa10b11aebf2ee431b", - "93e24f3b0ff13716b8d18cedea013d3bb52a9cf09230fa81d7fce4577e3a5ebe", - "b2fb859adc83db355bccbc03678fe5dbc0b4853b00fcadef17b07f1542ad03e3", - "05401521d179b71fe852dbf94e0ebde50a921ac189ffa98e5d6fff32164c1944", - "6c2f822088499e8c1d75d9d17b11529a71f761ec488167d4bb0ace82b9ceea97", - "9f9de45d17eadef9cca033285d106bb94f988ee35e56060348e602a92b0f66bf", - "2e877b5ad0d20a72720c6aace189ba2cffb69809506876b6fa348edd7dca1a10", - "6e3fd5c1a02704bc8a4901fa8151dc36d051ff70d5643e13cb5a8790ae72a817", - "7e53eb0e4b2c8e899a1b82090eea6d65ef2be017e53f94ab33e3079561d51ea4", - "2486362a5a35257736e3c994a6987a16b45b2490587e53804ffa68e182dea03b", - "3c00072f93762b0e1f5e4f94b04fc42eb87350fdcb0360555d804847ef16d268", - "b985cda01589bc590a2c6838cd92949ce44bae07570821e9256a5a62e4312870", - "9ecd6aa72910cfdc75a71781ff29441f75e178586538c33b3ce7a10b70a06a43", - "a3b83e95fc3a3f39fc48f1cb85810d9e4dbbf7a841bbb75ae22768c01eeff721", - "b9bc757f0ff8a526648cce44409f07e21064f7ef4c8ec3667a6f3771d850a54e", - "9fb2a4f58b8ea966507ad0241a109daa5a34f7334831a17f6426292b1823aa4d", - "55de587360f7283f6e97406359bfe02bd26ac2a555759c58c67e0f0fd5c30c58", - "695c41427ca2db3318c9d0d048ba05cfe8943247d9872b0e5ba7575863002149", - "00cebbbeb2a4f439c734b429dedf31a6348f4ac7a19f76d77013f2da6c2613bb", - "6e583ca1faecfabf8db967d26d1e6f192365e92c6d138c0bcc8cdfb24b9858e3", - "61a3ee10990bb831d261ba9624409bc2c319dd90648a0254341aa9b2933f452f", - "1743b5600df7315555c21a5b55a45eade2d8c69416903e6a14e1aa7656acef66", - "b0c7abc433fa459b1d9fd0cfb5b4b36960c4fb94a3ca31a76fdbdee3f14fd5ec", - "e7ec9417386040c097a6a854fcf9f2795c1bbcdae8e161b9a770947d9b91d097", - "b25b5dd470733460f535a7da3b35f10791e90c353fd96037916f02ae783366d0", - "4fe5daac7cf64bf603c689cb61dbc038b64ace2a6f23e1bf32b8ebd5aa036504", - "d53cca1bff11a7627b9551eaf44c6d42a7a8ed065503ca0a58c6fd40584c6731", - "3f940869376a56f0dea1061a4636bdb47629c8816e83cbbd8f1d85a68a5a9b09", - "19446db13b45e5e53226aba610f4dde8d775e2e3ed081cc5767b929f9c56f3a4", - "602adda11a9b7c4f2b793e3725ffee46b16490e788317ce4e317a8e4173c9a1f", - "d0aaae5eb92d12df04552db33592603ddd4ef4672780e699284c63031273fb8d", - "db5fb8d94a9e7a6578a2080c44500ad9ab274d538cf284fb0859f47efd082484", - "1b2d2d7d95dd64e76d0b269d39e0df9d62acb13ccc0ea19c2dd56f433139874e", - "3ffd697380926c87f5e316bd4c7928bd18dbed3462cd203e5d4290917f30fa4e", - "3c5eca79024cb36a29d02970d6ff842bd6f5e7ba9a1e5e80bf55bdb6c9825a62", - "699663cf5bc2aba23312045a03037a0d3afb7d40863c59605290f7092af0cd6a", - "6c4d97dd8a3f1245739cf8c10a61e4301993c9c285be80921aef1d14ce40dab0", - "69e1d67bb3f5302ab735b93807e3c2e01787d2a29bf870c4d6585bac0e9e733c", - "4e90f5c65c9ad4c0b2c09a2a4f01525e845a36842ed178c99f41a8502c4a1de0", - "f1f4b7483328fad97216eaec9bbe5231af4c9e3614729506e11c5291d145bdb0", - "094dc19f645d680b0e1701f454e6e1db54dffc34a6e1e327ef34b2e24fd2e874", - "8e8a4ffb7b091aa00d023a1c3fbb73708252322b9f0774960bb21b97ec6b9f3d", - "f8b30589df3db09e3102b0298995f6d351ea30fde75a25f1eac5b53e3933bfa0", - "4016b3211987b352cd597425d21cefcb26dd34eda1c2b7731b6dacc42632f214", - "d0eccac28207a71e4543fe7e2b15bf5b8d8d1d4fab2fc777cbe04f891f66f671", - "68f163cf18263ef0a9ee8148a5e0471567eaab057550b89ccbb43b42f6a99893", - "53e63395242c8496ed03ecd1d580c12115e96aaea45662c1080acebfa1cf7c06", - "d0a9fed91fc8de40243e7e91e1db20001a250f2dd012aabf89596290cd6720bd", - "5f6fc5bacc34f88227c91055b9ccc50fc39972dba0f4685cd638add93228cb4a", - "b193a9243f194e9f4562af4450b8eea8ead6bc36b3cc18d5470d5695ebafab57", - "8ca4f090c3c7d2a9ca8b4ff9949b7e77231c50255e679fe8dc53000b8ebc4afc", - "7e6bdb98cf5da621b6a1e4f2eca1417e49de787249c2dfc95ad193587e8dc104", - "b49114f61338e342d822ba30ad5f021d89d5c5dbb34a90f29d47d8d9526a6fec", - "9bd2d1412f79cfd695f88f906b2dc33956d754fe774ea505022a45b042947bd0", - "581438b0793d84e8069f76a1068afc33deed4247951aeb0b5851241465e0ed99", - "bd7e2cfb2cbcf9a56e370adb7a4c8683dae63977b914d1f904840ee9edaf62ab", - "8b26c7c029a7bbf28f7c54db22ef875b2de3e229938994bf5bf7d983f37ff520", - "86bcf45aaf2e1dfe2d854d64862ab599368dda3e801acc601843b277ddd91e17", - "448054e5d163f62aa5badd05aaf0605987e2588aaa4b439407468a3544a83f9c", - "a610903dc80f24cf825f9f33a02141c01bf3d33f484b04bbd7ac22a9aa2f4ca2", - "a46a7bb44970dfa5ca7083a7c220cca3d295063456c1fd8c0929754485bca46b", - "a98f392f53d59a0f658a07c55054e9ce97c094cf89267ff2fd3c1a6d3903adc2", - "ac5abd6a7b22724396dfc2853b34a3106e5d846f49d0881c9bd3821e7b7ac070", - "248c2d45165a3c7e00efb33efc26d905017537dcb5629feaa2f2d37679222e3a", - "2066c577977e18fe83f946ea25aa8914d6b5ccd5fad41d0f22c562ad2cefe693", - "fea5ce6b6d4f4e534b97d0b2b15361ff36fc437374738d2e3fc8bf0052527242", - "6aceb316f319da062ec89410c2289be68a8f23e050ca5063994dd4c3c2cc5ce0", - "89228206cc2b7cbdbf2529a5df1ea0a95a17b66b26b8e45f9516eac09d8e0b9a", - "a0368cba32faff7eea19b402c85685037aa2e79afaa4ed37237051e9a2f56ce8", - "48924c7551b63af3bd0ec066fe97c79d0a67b00da5d67542a2435092e43a574f", - "4c6ad8bd44de030ba6b05a2d3f48911ed40656cff2849bfc7b836ae466eeb05c", - "a2fb75c008bbbff45d28e927f6c5212f4db22e704a6f68b4c48e216e4a595937", - "267a0b290d65bc02eaf72596072c6aa48a35144cec7494cdde67d1ff5a97546c", - "7315fe93c98798a65df4044a55dc70a72299e752928718d6c43db73bd2b622b1", - "a412b00b69721bf4c3fb9b393c6ce53b58a62c5bb8bdd2c19194ad567e0b229b", - "21006246fc5f4b5be8d1391d291d66b0b2fa70881b5379d73a5c3e0a1f9a9e62", - "fcd186e7af33843e5db9cdf98b1cd5270d5b36142cfcc37d4331404c104d8dac", - "bcc2fd2eb749ec15af5205ed242670c798f1fbc2d999d6c3c3b6bbf579ca2097", - "e5a105671b1b7b176606b260db9063775d8fead3cb534f306afdfe6b256a935f", - "26fee1c976780cfb8e23f97c898d7c30fe1e87ac4b9bddd0d17dfe19f9918cb7", - "241c29b160bc1ac4ed018142cf43ad96cdf6b005940cbc6800a8a3d6649c8e05", - "073cad219a52bd8b9a6aa421362df66aee21bfec709794517784c015e9465647", - "6933f44577455230f968c46c77b8f2b82d296cb79cfb205f489adf2afe861dd0", - "d332324f7d6434822b0d82ae61d8551bf275a91d5b1cea53203d67a82b24d26c", - "6298da52a62b986a066cd3443378b0645d61d52ab4dff681f23b3a5b3d8bd88f", - "d75d90a24f382592a19b5243578b5e55f9232ff184751a1f5a1959b06d4465fd", - "3579eeacf0f9f692b60b2f9546c80c014895359057ae812098315dc9af710d8b", - "44fd77649e62fc6842659b3bd20be3f2005a6f1992e0d98a853c2a57b3833831", - "9497bdbfdf8183bf37bff607d5de987cfebe70270700115e0db26fabbdda9e3c", - "02ff98aab34ab535341b7faf11d8054e467629a7fb193b27207c0359e593bbf0", - "2745e148fee06c83c33e6b77956f13ed97c16b899fda14628668470cdddb2f87", - "748496dfa2f1a0a30033f0497f9dde9b7fad2b06f585f3905502c66c64b8e619", - "b606da17d66eef4c937cb5b556e954559e9679d3ef90a41b4e84bae1fdfcbc14", - "ec0639bc2dc98ccd5d46dfc08fd8d22a83598baf528cbaf9a6fedca780965279", - "8c264b8ae865328fa0afa8861e96f91554dfd7709f11f42ec12da01bd8a46987", - "672d7112764467051376b2d95d582f7d7cad8693b194619fba822845bfc60fb6", - "6cd6a9d86fd2fecd8e095e136c53bf6c48b6287ed63fc7450d467934f518f3c5", - "d3b3080ab594d164f8742f5f0fcc729a9d927817045f87681dafab09771744d9", - "a726886a0aabe7d33a057c200971b580495df1b4da84ebbaf88fe9a07da4226e", - "c7c7a41645c4602d0fe9ae21ad6bcbad12c3afbe436c6cf58df3c2a0e92e6796", - "1625117243eebb35c6fc1e3361d069f51c6f188cd37439188733f59f53729ce4", - "089a18e37e19295fd077a1dc546877e9a5b669b6338a6ca2cc8f8ad068d250d5", - "591d7dd48d5222e137cc1c7b5b4c62159592680e6109f4b9e4869911615946a8", - "c6446630b95625d896e6dc01367c11c7ede4f38ff5ad8e5a8aa5bc3974a4b918", - "11877cfc17182d8e854dd549ae7787dabf2e8fa86c188ec0c62f48e1f8ffba3d", - "863ce246040ce1c828f3f479c24c30a9cf971aacac77a7f5f0732aeb858fd5ef", - "2507195fb38bae5d3c743765f120717b2dbbdeb57eb7817a8de8a79cbb947ed5", - "636d3d57857205ff1f9ebfb960648b1a7e015ed7980d5dc91d80d2351dde935a", - "cd0a2ea970822e993eece5d55a143bd281c6b80461e6e4765eb74bc1edebd11a", - "b8f7d65325761158e706f7ab073b11fb7113e638d536f08602bd79de7c90fcf0", - "9ab3a34a96aee78854ed7e8107380fa1461933b485dbd789c5152992e492076d", - "6807ab09678f32e1f84822a4a0612c25837370b6e77117b39d9ae3b319c6f38f", - "0b1e82cc654eecd9f28ad8723db0c43a4746bea549af871e8df7fb8ecd30756e", - "234ab488872b20fac70924f992599916d307d9664106dade45c827d6ec7fde49", - "62517347fb44066f78249d701083510d7d1be634ed71918b52fdb334de0826e7", - "3212102c2f82572bcbfff223dfc40cf5c589161cd9d66c9910bfc4577506d9b3", - "2dbda2be1a9b5af727e396a85a054e996f399e69cd1f3b089266e50e26cd3b19", - "14d09ef0a1cc3006d254f4e91500f52531caf8801f2e908c579f1fddec4f8230", - "8ec28c12a264fcad3bce88438776ce7bf8185681c3e048d8d5bb51c6a0882138", - "a366252f3805edd16ee9aa7aa6857d2588c5919bad7d31138032ba7a1d96f3a5", - "caa663d83c7db35e7889fef76b44d43e0b5c147fe007f25a310ebde62fe9b33e", - "52c9f33711976be126b1275de19f67796c93980f198143d2d7e9bf5dfec8d68e", - "b1d88d8c01b8047655795705282c286e92d7845fb8e584ecbdb7d4f4f7fa43a3", - "09420e1956aa9e117afa9b48de1c87cc95d0c738deb955b0115502c241fc1138", - "819f4c849bda0297d091b81927756ed6605092573d0e6f90ac4a6d905a91d193", - "f08bb9f75e12680991bdbc286ef1787abd3307830c454974b0fd660dacc64fee", - "03f5e79a5b53bd8499d3748efdb6fe96d0817cdbf23f0c2b82d79ac2fd4f3f17", - "2fb0ec6b0ea68fbcbb8ddb49deae5578c1a821515ba40c22a1597c5de2dc643d", - "4b84e1f43cf472f36b83dec2f61e9da90d162732aa4101be348ba8477edd6df4", - "d7101165bfeb034ff9fe22ec2bf5d1eaa67163d465e8fdd4bbcdd6f2f5f8a8a5", - "5d69f251fd92102246e6eeeeff98e43a93b8d824d40e7e4582add48c9a3da2a8", - "4988f5e0006b627e0e374570a10d14528053e19a9a3cff7da4449e13441fc897", - "19efcf4d74721ccbceb57319d9eb1de4d526deae8d6ea301e4016f4ca42c97a5", - "f5cef99b5561fde3f16ef697196322d3fcb9bcbfe6dfcef43c766df087fa9215", - "cfecd0aaa7b8bb65ab10acd89f9d9617efe5028be2f2e2522e3e472a52e3ed92", - "b397cf908044db4a1ecf311a20c1a28247408a81be840cd41841ac574f5b9e73", - "8b491a2329718c27f173ad4dc4b75cd636d281815b7508e6098870bbbcb0c94e", - "a190dbcd095d22c27adfeba9418ef28e7e182d513da5f367dbd4316e86814ef5", - "9bb766de9fe354cd874b20b38ab4557a3dc153f27310eb4b9f0449bf98b8d6d8", - "2065237cccea0ed47bdf3101089dffbf2bffc908d43a638e149c8fafe76edee0", - "240e6926c6f38049aef83b1ab9d1575bc1c109ec2dfeea7c133c83767fd88bf4", - "055a4a105123070dcc3408a2a2873a5e31619a6f8c8a5889cd8395e28bb6fc38", - "a8b48bed25b2f703449ef208f65e0a281bb48b9ab3c436f1d23fdc2048ccefc2", - "544f383c68bae33b76929a77e7886586f5d010370f6923e0f874edd45ac1f91e", - "805150598785de3bf8e4c19f4814e52d4d88ea987756bb48eb982cabd9042e4c", - "582c5c1ad2f252191272fe22aad8b1e6da9a7ebeb61226dd2507293a5aebe73a", - "50e2c5c554040c57b47e15922c53534eed1842681596bbd9b34a0e08fc72080d", - "fdbe6467c3f2294b25d137e7e8fd05eb8716ee04d0ec3f8ac4f2b6fdd3b770a0", - "8596acc8103dd62844f16ef2c5ecf42a10fdad6eb3e546b7c941a5e742a694f4", - "47fd306a9956666eb9a12393140543070beee5bd299b77505ef3bef5fa83569a", - "a4d5589f7caa15187a45e067f73d54059fc4bcd738b092c45c68bcaa7ca09c6c", - "dd504868a272d1b8b361272be795db490385679840c164c6227279533b86c05f", - "4472f68252bafefdf7530b6519771724cb4054da0c9d24cc57d1a3deab4fe3c6", - "99f85472f12defa0b20f7a0fde4b1159f55387ee338f61a4030baac1641c6567", - "b92228de750ba3f87da807f2815edc08330724a744a0a5227c809fa18d4bc1c9", - "7b11f2d2d76c07595f4adaba126f79e4eb9ef2de85c9aa1370912cb2ce5e7941", - "7a91d0f098a84f29313059668b3e417222b42aac8364846f9aaa6ce4435d2166", - "f95bcf0971c9c1bfed2bf1488c9495922297eb838fae1687884acccb5f1e89e9", - "b8b8541a8a42dff4792bc8c9f345d075920d63ff924b24eb61aa4dedc991ef17", - "66dd25c67585a27292a71d3f4f75639b37b6431476ab256f67937d3f75eccc8b", - "d9631aedd01ee9f397bd39bc7ac9163bd88b025168c7a92e06defea3b67766d8", - "9ec36a125c5e0497b796bc08ab5b348ba0634196faea892c5c0fa735a90e2d21", - "3ce092251ce7a63832055cf30112f3ec586467515c7258ddda62efa5e01df99b", - "83dc726cdf7d607d45fae7b246cae7f6f14e80b966ac1c3018160eaa01f8d247", - "24a463353cbf77518cb535f3a63bf3be43e63267003772fb4c616c83612bb319", - "c5ce69f47197c97b6b111582d1b17c75463ddab75957b815522c034712b353de", - "055eee493f7175ce996299a35bf8da60d8fa1c1e8c2569332b66f1fb81c69028", - "958e17baaebeab15d956c5e50b5f4c09192770709e6efa280dd69dd84a3bb456", - "d0beec947c3ce80490087d704a69f5693520c671fe884cae45cfa473677bc069", - "cc4f561ca1e11122e5f9ea4846a014aeecbf122517acaeb1e1148979c60bb5b3", - "a8da98b6ef1e12b6c49e85b0e965f1ed1688f5e3605f06bb3c6ce4f857aa0bc6", - "fbd71360d90563e4fd9648c18ca32e985a92add0c89d7e39e86b18064ad4506c", - "7b83eea89cca5ff53c028e2a0adc89bd57a89456b36826593847765147025fd3", - "6f2bddd94b6a04afad6bca83bff9a1df353e35811d77019b94c0b476936d0a02", - "5a278b94d099209af7813be29232b07670eb183bdcfa46ee91f95b9b41e14bef", - "9eed08d3cbe968877087c67e70bfe7417ff05b569c2e339021828786c481c98d", - "dab2abf3a8fb63170ee4c6c85dec131a0ca434ae43983c69a341f9c629346608", - "6eacafef93a4bb35a397d53756810e085a7561b38ddfc138cac9b8332d9353fe", - "ef4310db249e04fb3ca9ba68f013a2a5d78d86d3af476efda60335612717c12c", - "a3296995f506b3afe6adb3f439f89000e208ffcead2ac29eaf035ba29e9fef11", - "8811d42d6b5cc3bb11530420765753430cd6b946270ad2465c3299eab03d77b3", - "a9831f0ca17dccf2708fe4cce5cdc6062756c3f6dad6155759adf30d4d1d5211", - "78e2bd7007137bf34def62d5ee4a5aea78d90c965bb0f56b4eb16341da476a09", - "63ea195feace2cb245e0ee5cafd9ff26d020f5146279c1c77a1c53b3f0019a48", - "020c4be02281d5fc8bbde96b21efd2d82a3eb959a82f5206fa1d1d5204da0d6b", - "261ff77e64b30aa1355a54e2a07b0613ed5b9b56da2ecfa242e494de17d5a473", - "bf5c19b11ab9e5808da2820944ee3359799a55df8badc321f8982ec001dde4ce", - "9891050cf7f45085865f1f9ab1c00323d9fc009e2ec18d41102dccd7216989d3", - "ea2293c3d16f4bcdc211d87f4fa0f3501cb0be470e9c35bef2017d259d1c7169", - "5b840135791e314ca9b47940a1e43d9a48a26bddbd3700a5a95d952f86265ec7", - "2559d23331ba10bb7bbe6a3d5bc9151ddbd98bad28d247a405b020c1f80dc0cf", - "b4674e59283e8393788d76e6b11e13c138e79f9bf2fdbc32c0421d6ebb037a7a", - "843dc435eacb532405749e320a680831484f9502109bce200d37281691a3c313", - "ee1d802fc7199c90878873cae2e8ecf5fc03e610e4ed4a8f558e77724f63e885", - "dbe7b105c2c00ade21db282ccffa3d1294b19417313077f6106ce7c326289d00", - "e9ac38ac4cc8ba1c5f659ced3a9d67b67bf01750019005a43bbc0a609d798b9a", - "4c4c58fc41ee7a16f621ec4ad292f03bd8bafed0e6a4b07313ac34777d2a44ac", - "564cd528729d84966acec64a9cd2d962e398592a2b8af10dcd3ceb36043990d6", - "35c9fd8eb267089a689d993128716f98733a6a78e74894c7de683c7ddb14637c", - "0b8c7e00084cdb7ba64e2bc1d10c0e85cb203561ea58260b6460dd3299281974", - "80332b3c1d3c24ae7bae3b1a85998124fe00b4baa5ed28346cb6053019e91697", - "4b698f137daaef99d80d83912371d4914a9e5dbc27e459531e559695be7d0f1e", - "d43772817f0933ad170ee0def10490bacd0dbb6e50095dd1ddbe113f33fac6bc", - "8891f0570b5da09c45f83e212a0f3aa3effbbc268343e6c32c38a4c851b07f6c", - "141d7a6eabb9af5ed78990384e9ffe7fd86b5d2a7e42b14e866d953b5ac62cfc", - "0a56bc24004cf821341c9a1344f4101d189b265f81b05a0845af022d8ba98aa6", - "d99c02f05d6ab28cccfe1ae4f5008a7d8b5c4c3b5ae15ca38f9794f7ddc8ac54", - "787291345fc54c97ace813a06dda9187a2fe2daba7b87fe3356cc58a4664dc27", - "1f2600727132ff322360bbc87cea42b0800db22a46bd7a7e1ea8469fed72c0c1", - "e18b74c237d4865d63d2a50de794316fa2b0b262bd207835614318b8b517aac4", - "a707929fde03a3b706a4b0d52e7d3f5be9d4b13c0861fad8f4f751593df907bc", - "700c9a1cdac9f88c85083347658beb6b6350d2776c27126f7a47a69e78351197", - "d5d9a8eb132991de3b54b17fcd6ec06ea436398e4510d0775a7769422e580f88", - "ac204e3b3dfaf8ea68f80577cf9c0afedb101d8650b8c39f0d9cc14f0fe7bc0b", - "2e1621c55425513154ddb3c565d464a552ae39a6921b092bae8ab88ab073defd", - "a7730f465438c1831b620c80d6c22279737a12fdf710b6a16d396a00bfd61c97", - "186452719e671ee6755aa962e082411e5a6061decddc6fa814dc215339988928", - "95ac251265c495a119ba8cb2918b8500eae385f68b355655c8aba5e0c0aeaa11", - "eefa505620270b6d5e4b265115bf14ff626959a56625fdb6a95a0927d8a1ba7e", - "9e523539187b758885287c2591b09e5d0e7d0b352a24388666b049c864e7297b", - "db80354b42b3be1ab79e79811e27ff95ff28e332ebb070121beb6c0aed4be57a", - "84469fa31221ef3e1e80ca530282afb67499530975a86a87cb97004b8f1a5cd6", - "65c6903ff58fc7c319d516289e3e0571923fe3e8b9cca0ac19bee65d1456acb4", - "a7f2094ae307d28cfc07b0ee145d6a4a6d89d4ca60866bbf0af258da5e3e28e3", - "05d3f73fcc398792d5c7441adeb1e6382a43b39217fd18d462c830d23c466523", - "e9363d8ea4bf0804cfa935186548dfc1177d91347e1d00221db3209d36114216", - "a3ada0ec888b79c168045e757faa284814ddaf3abf6a128968d62b395aa3ae32", - "16cbcbf9acf25e160fa9a73324229c94779cd418de03fcd2a4ec363a27671c69", - "d8355172dc677e06fa0f222a3519d97aad179f6b967eda9236c983fa144f2e44", - "86628d5e9d7f8429b430495f3c4e0b9da2dd060d541338b9a12421b26f5c03fe", - "b1db73838c603d90e97ddb29eddaf2d48d77be9e151c4062f0e4a6c4eeb1126a", - "06ca1b1aa2d47c19393077628bebfb917dbe6f18787c0a879c3b81c6eb2e5bbe", - "856749f6036beaf551e7734eb3402489dc2a249869f3606edc9394a0eae11501", - "7daa22d14ec736e6eff95197e1a021c2b3974633e6e5664f3268f1fca2610fe8", - "080db412955f336079c7048cf4ebd2625a62ce4d136e8923cccb82f7c9bceb79", - "16b152279b3e8123b26def5b5065d7dd857cfd96e624f19673d2202bc6baf00f", - "7b38d6d6581b0c439da2f0a38740ad1171ec194f27d593fed1c6c7dd5f3c0e75", - "8e4b48f4be39c2782dd819bcbc16c24c9e4ada2573640f962fb8297a8d3c95aa", - "f912f4b06afe6695c873b919bcbb5b6f32bdc5505034dd326462bf74206d69cf", - "d14cd87d2b5adb49ab2bf1361c68eb3cd5d257e6b0ea17f57c2d8d98b0966363", - "6b9db22979fd3c06a4c29109accf6a5d626e79b162baed105c330f2690b35238", - "6186f4ddb5e06cd459fb7fbcfa2dae0d7e43f063dddc1673862c88edeb5a526f", - "b302b834da9d0cd5d4193011759336bb37fd8ae3a8b65e4899f9c3940a543c84", - "05c7b149e4b5b38a71961b580664b2e5fb3ef32e5a1bf7a67268cdc3344af8ca", - "e14cee302cebdd0be5c095e4dd1a273c967aa95175adb620f8ba7b15fc6b90d5", - "59cf1e94b9e443bbe2318ea85559dc2c581512e8cddfb67f5fd7fb45f840c849", - "b14cba78dea3721382432e2d44cae5e8d180edbe2ef9b03951dda4ecb1283e3b", - "89bbe5986cb2616b0ea18a490cf0ccaa2a850c218a4e3984477a00c8f6052d4a", - "bde504408a70d2b9d24db5f1e5c2843218614fdeba2cd9840f81b1bc16205ae8", - "1c8455f93b0fb83674f422eace81a844d7bad335709412599c3698aa26ac8ad7", - "93b712b32a1a872bad6b629caf2228eadfe8af9a8eda40056724ea2ffc9ec21e", - "41d827c4f3f9016a058bb05c0d7ec0e79a848757548dac15aae7e5fb97546a0f", - "8168cf5ee2e96af4a7b896b5fc82886b99026841d73528ed82a6a1c419d091b4", - "9510d390e18b92625988a28b54f63e68a8e3ca62faa19084e7c7d7f98c547001", - "1ccfbb1b630c28bb35d821f343f6c85868b3b0f14e341e754df92f46fbf24af4", - "8a51b86da1340846adbc62e0a25957d5292b15074eca3fa783af85101a3b779f", - "a61d4ce902e259d96972d003505e66c02462035f4ee13430da97a10c9150cd95", - "989404626d7070cd5044f0ed848ffd6902ec0fbb774518b833b41e046e0f3c4b", - "41cb26031f4661e8d93a59931d472855907110fa90ec3aa76102065bed23a289", - "c5d7dc28a50d39d5edf321a5d003152f1a9d835a68fc2864f95de774fa5da16c", - "39b83fa130712485214f7e2305ac3456e15d2f3ab7d8ed982937a6c1973be843", - "05f3bc2bd18352f205240cee050ac48945b00eee8f832278a7e06eaae444699d", - "1d4f85436138e3a9d48dd844244ec14b447a73e98044b991dacccab6fb51278e", - "bcdd9dd8af6c8435fae47a6ec40e7e34462361ac240efd837069192a0394a81f", - "10f03279442f05dd42ef444fa3d7691234c518ed5b74bbf662bbc0ed454df3ea", - "0a8cd70fdea7fbe8bd60087358acaba7034afafb1a6c56d0b8bbb3edc6cd9163", - "5c604a6f4fbf0cff911d1642b848579de901de4d0c0797e42ca211e85d24ca1b", - "0ac83d015a6ad96b04d822a656bbcf07c98b87c7cd7c02bb20d7e4812e81885d", - "d172fab975840104965c7ed61c1dc1d25ed6c3536d688dcf7eb475b2535858da", - "d0721e7f043e6d85a46d6943985788d9cae3b08f08b8eef4a535ed51d1987b92", - "2f2e1f29785f4da28ece640e3ceb438e7e3a5d0aaff672af39f57591a91554a0", - "64df12fcd7f06625a4195323c1dd94ac4a25408f83cbb8c097242d0720f26fd5", - "48e37e76b495f3eab169953d4011c3fc083e8338b406db765db3d45397afb5cd", - "5340777b00453388045ab3f173aa33b9596c490f1347cb737181c6e843368b62", - "00bcf319a4263e55143e3f27ceac2d55fb483b6e59f992b496a49fbf7422a2ed", - "d0371e4d09b9bb448fa614f8fcd4f92912b8df7ac6d4c485b6ae7b14c535d392", - "adeba7015b1ee2fdd969f995cee78f53cfb7d3a476789d60030af552aa3ee67f", - "08f737d466e10548d98a29a0b73f9faac3e2e60efe1b514f04a4541d605f622e", - "3b6d2799447d528dfe271083a3cf24c213ff6c8f131ac09188192c8627bc3aaf", - "608afad527fba61a59c8d0fba74f6a5341b2cebf8dcba038a6d397a3ff410b2f", - "b9605531e1e3cc9eeabd5a20fab82b0c41638e9a20925ca887e177e0dc638723", - "02e4cbed990a2159b4c2964ddec9137d373c6ad1edab04264f4adcd723b08d7c", - "1d363202b9a21bb4c37a5f70fb31d00bcd597c301b2637a6aabcba3f4fe9d890", - "bda82f9c5ddde98e40639f8de4316a4bfc554fdeaddf6ec76c97cc4a0e50059f", - "52e05a27033103bf4bb3cd278f36c41015325c22fd028e44bf638b6d981c1a7c", - "aacca95d01af67c6ee14ccf3a3f08fb05e2dd9c0734316a8edac4e8364b28b06", - "4c26181134adcfb15060827580748282abeaca20ee1fa675dad820013a1435c8", - "93f8990cc43136d4892f6eb858da9837d1f2224e34c0e4dd9b07a58e3711cb7b", - "e4246d81438e79090a2063141955491c7c9453677d81735c9d55be4ee3f9fb2d", - "0bfc1841409e0d9e10bece19962dbde791b43366a4546fda0111bf57db6f8308", - "674cae7aad03ed9e1189f5213a23410ef8ba6a2e2f237cfb75e3cfc9c6249585", - "59902c257995eef73b78e2a742d21866b1b385937d07e5b8e5ae1f7821db47f3", - "f73e1c4137bb5b5152d669b81f2ef9bb122eeaec575509ec3588fedb8eac2b75", - "9c8c6b1c5a2f845e795e7c72caa4e3fc4e41ce127ca10967e5630ab391806b52", - "2d7f8af02bdce118ced1e62ae7a7464c0c5e10ac2622e27d753db2a075e7d6ea", - "ad92de2bffeb77fe3e50e43546b06184e57789f69236ce19169b26556566e4c2", - "fb8e2964f49c4f56201de030ab72897e4898d94e6d46115b9cbcbf0693044c95", - "72cd5f7daa215ead85a6a48a01a7487cb9d29e4de2f6eb25061c50711c53d6da", - "8f4007ff1ff32c8dc36c1d7741833bebf5f82df970cad1413dd2dd9e5b898793", - "73fca6edef9b04b066a671e5eec9013a7b457382eb192c3cda1162f39581e552", - "5f4e4be9eae2e51722a3febdcfa4bb09c6f09994021b4484fe8db4c53db45c73", - "274921d30991610c53b51290ff824f53d1c69a9c3fbd37c227162169975ddf1e", - "22b7ce6b8ffc63ad901ef3f1a1ced2b22a02fd9fb552f91bec84f75f36462d10", - "3feaf5d45508aeb129b17c72e8f25cfe3ab987efdd6c1cae58807ed004056325", - "b500ed958fd1d8771304e922b95a680e5e94f7696ac32dd0718b6ba77fcd8ac5", - "d84b6a713634bebedd79dd6ba5911ae343edd1f7cf8a9af483505c4a8b4f9d97", - "b438b7028aad59571f84c94a522c53d6b65d16380d8d4e9e2c97a01d95727231", - "8517b4c018a168b5cbb971ce645baf6289a8a94b2165b88c3ea29c4b6b5e9470", - "7ce415567a379419cd3954a1d2a714dccd9fdbc95d3be213929f2bad7eddad4e", - "019d8a87e040fc9d1302bcf4dbb936dd2966e7cf8d034e6c50bcfaea1fab9f96", - "b179c25b7f097bd044563a1c1c0d8466d38b0423b33ca7208104560448d462d1", - "22f06e15149b0070f49f3e48391eba741b7bba43ce6322f7f8e083c6c1977fda", - "1d0c16de359c2d1f2772a82ab9d70873f0e8108d60d8d408d17007e636a81d0e", - "f37877f376a95192f8d0a1ea98faa907cfca98123d394f190d362653bef56151", - "90d918327a27fcefae5953342ce44ab134956661e10e090104c5647b1365d192", - "a35d9896e46ddecdd253db1bee81d2219050f4e74909b933ab2a3ec744c5b63a", - "4f33642d08fa5950a0582292372e623cee86ed4f9a4fd9ff9a25164310cde99d", - "cb6e6920e05762719cd6dcf602e9ea77da380c3645089b89bc96b84dd2aba62d", - "6d222d26dcfd8229e5a6b00feeb924a0a66ac740402f4711540253020944bced", - "c26624f739a021e454ace2e7569551d540a290eae6a9adee1feba09b262f9dd4", - "bf674e91dcdacbda8c618739f218834b219a341676202daa3c0be810c7c5fad9", - "5fb7369053eb5f85645eed80abae984ec863572878c82779858eb598cb83f398", - "a1b919538dc8ced2172f508385c813f6f4a781f842636b9bbea71479d9090369", - "7d5214935e6382e0320f563313bc19abb3e51a4acbf66af32556b4f8caa0c3cf", - "d741286a531716195c424e96ca32dad20b594173e792f72765519e897ed42c60", - "8e61f5680e244aa0c6b197befc48c678f15251a0292a5409a7204eebff36faca", - "cdea7c54966a4ddafcf9bef8f8ae1cb9b41ef9455454be5758b84ada5a465701", - "83ad2453e245754c5dd9c1cd9e5ce533dcc03790c9b4216b7c75f4594969c65a", - "f4a53c7d09db9829c7a3529ba642d9ce6c6afbb37f55d2eb3491b587c920bc8d", - "1d0a1627298b24ad31fc119aa3fd136a862361a85a1d7513b6dbe75ee2a545c9", - "1de33f2cff3ade5ca0283ed9b719dcbc953c113b873c32f5b6a1dd8973cceae1", - "68d395bf86428ddc48cfbab2a2e111806b871ee6144b693827fc947faf15382a", - "4a1ff092e00c37ad41f69aa321a9e9a682dfd6f204496b8e14f3fa9c544eb56d", - "8e5ef632625afed904fdd694da484e3eca93a7884fb5bca0e2aa6a030db3a583", - "abc863254f02ca82198421aad70d15ddbee369b969f76fb515165321ad90d111", - "f4778637c48ca53744392e592ac59907fc422af508cd22c4dacdf92c2bc15811", - "93d2cb968d2767ac78e5872a5c5f56d47b66cbbe356d55a20efb83209baebac9", - "bed458a7ce5e81581e4aac6c89d5d214a8b9aaf908fda8353eeb2599450e4bf7", - "65d14722654c23110f1195f430ed6d138644f29cf02d027b8d57366be4e885e8", - "2cdd4e623563f96101e203f346fb8144e60b66fdcc8df3e18bb97d8e7da0584c", - "93988ff63f7b880da152a2d182a6abfb4a1a8bdcd5190346ae2ab68cf78357f5", - "9fce14ee49cfd0e82e959569c879723c87d3e00122bf9fae5d8a313609fa4663", - "1b987f26523a60a16fed7b53bc784f299354fc75a22412382f419c7785dd129e", - "01627270694a44cd5194909bc508f4e582c709dd1dcb6708f82c33bbe2574786", - "83cd8e2d19331412e4c0fb31e9d46099810cf66233d84c92a98fab41ce9b3038", - "b16678adf373ef65289ffddd450d3387b2675471cb31d1388bb943e5881c23e7", - "6034478845ab99fcc404da64361b1bfab86ac3c8db0fde0d361bbc3b7e400d1e", - "f4ebf6ae53597d372d07f3ca8805dd497f4506754250f0ebaf2bf7e09c397bb0", - "ab1e63033fe21c4dd631a3f3c380304c8ad011d8145a94811f53efccaada1980", - "e03cd0b6b54e0037383affbd31d47d1eaf8d54a62e32da0270afe233443be85d", - "f628e4bb88680eb55ae03a391963b99ed1af5815c6cdad237ff6f7f512c276f8", - "49f589372354ddc97beaa7bd871402372af0a4ca7634925a8079a16b3ac618a6", - "b3db5c4ff48afde50fa61ae1fb06f1e81fef75f9ad04482c49985cf0886ca04b", - "55d6ba15533b2adc989f75d56aa59aa9be957167e33cc19d92b629d50c38a48e", - "1144c4b602f56e7f6ec0cc465dbfe33aa1163627ac6ccd97b6e11bbb52e23b35", - "1a2cf741ff17c862910332b074f521b408fce3f318c18c7ee11ae5c79ed86544", - "e3357899cf47b0dc0eeabb3e57130c8ec3628e5437ef36cc2b7854ec0dd21de6", - "dcfb493d04c094c3ca2c9f61406eda1fd9a36daa3ee2f36ac4cca1bbb7d76113", - "0bb1f01247d2e8c8a7221b5596c05f3b664d31e6632c229990d3f75fb46d266b", - "107fd19d020a235cc97d985cf9b1b040aca5edda99a7ca83cb01067f14d9a067", - "7b7c3536d6ef141b144fbafe6bcd87f8eee6ca9fdd1d84ee1c2058a41aa233fb", - "f7d8825aae458cbcd78b8815ac6170533d73907c88131e866e8929c1907a0a3f", - "e9ead7b803d5dfdd216e18b79a26aac2cfb8d9da114cfa3ec1338b09f32d3e35", - "23325ee591801d05b931fc1a696636bd07bb68dbb48156ac75be213871f86c67", - "540a4e7f78b57f3593089c7112a013d5fcd298afd22432122be1dcc8cb122f3f", - "d0881859f3062cae2e7c4c48e61d050dbdf709d70c0330aafecb30c59b4b052e", - "76cc4197d3938510f03f6c82ba556ad30ceb09b707b5e93c3eac20f0e200edce", - "68a9e9d1d84d3b34ff33b1f6e66ecb10c19089277f21161ecaae5123245b6bee", - "a4ee27b7236d1d3d7a3b3bfafe044bc0811d822b9a0fc5197c4cdca528fffaa7", - "46d50027ec7786fa050e3626d2671adf5c9b092f3b27dfbce5b66eed358a1438", - "061cabda8b14a8060360bbf88c227b4e6ac22ed3d7f9cd887844a16059e82476", - "aa3f5f155915bf142c73bd6b1268716897069e9bfa9121433c965e94d3185e33", - "309edc6f74e3d86db877103bc4d2d66ad53880cf6b5e498129fa8fed2557fbcb", - "582a7d62cf2af2f488f7681c4a63d5bbc4c9853b318ece77307a7577cc7363ee", - "511b56b50a5772665b65f84606272003d43bea576f44e85dc47ff42b45853db3", - "0bc65a492726733b6818401429b2f296eec0327483c6c659b493ec0ebf3bef35", - "2a12c6ddcd08f51323c6248d3e0e7ba752a7d1d9ed799145671d57f41cf163e4", - "29f4ef0b6159889a7054d6cee9d979da5ad8ee1fc69201f194a61c6ce31efae9", - "47e3ad2a27f272b9e01466e53c9118ed9e98ec056cdd61cf608c744f3cd55648", - "9c15a65281558a8a5062795860d118c727d3a6d8a83d31ad7a1a918446a96876", - "6247e0a66a1ed3064464977bf33439e174dcfa81e59deb9b8621f0b3af77e521", - "45f2eb30f8c626aa019c831e63c094b64e45199c16ef4e93ba248d3bf7c2ad48", - "0e62fc209e4fd6d20742f46b2be853fbd25bbd594a53e849668756b7dbbb29ac", - "0c12686902ac0aa31aafed40abd795e9340aa4ce764a3b4c2f47db9f47ce715d", - "dc6d918b709d01a0d304da72f271684ba32cc086c68e723daff663f95e9919be", - "5c3afa199bc4a5c3d361412bc9186542eaf9f4ac6cede525623ff924cf8e3c1d", - "bd3fa6c62ac4184565669d79b1ac3f3cc32d5a2b766be0f10dac4feb696fe778", - "264c66373dd66588f9be405c53a47c288beac049f375bb1bf9c0fa61a3efd25c", - "c9c315438408c152addd237bb3633e167b7b26f2c0c03bc093ea6493913f4730", - "cc08b96f7f1dac2469b17eba842dd6dcd6b66b1467676a375acf37303762aef4", - "f154f9bc7de16a2bdcdda18fadadbd634e1f1f700aca309ac97526b5b38bfe89", - "f4a35bfcfb88f92dbed6565407a99f41cb72894146997c8fdb442ab7a6ad8194", - "facce1a733585b6a9d7afd5a09a3b1c880450181be4aeb984d7a7e71cda23894", - "7f7b081b20b4e2027e1e0333c554c1508e651218f8fdb77a905444711f914ec1", - "77e97bc22dda36c90ae5f9647558ae8954c8880f280890fa844acfbc8dc575d9", - "6bcfa7de1fbb356145e8e5f02d071ad3427e41685df6d74328a73a013c0cf07f", - "f79a2cbf0f4f9306354a5625966f6ff6be6c89d20235f921e7c1b3854e1299d7", - "917c9f5c5a7c621dbbd12fbb8235fe74f551a570e710eb01cbd17235d21c96f2", - "0f91a45dc792a062b69c536483cc082515695424b2110b888f28fb80dd436dbc", - "d85f3088ec1ef833ce9005791d711d8e10fd419f77104cfb6e33a4e1fcc5d5f1", - "560d472f578b19dfc49c514be891785311fd1cefe8295e0b419394847dbf85b1", - "6ea6868b67587ec84c7b090d0c080f1d2d4f9601c6a0d160aa69e3b8ce4c9334", - "269f08758a44c047047be778ffed05438a9c724889d23ee93efe6de9186e8e1b", - "e24a8821d9a6e041a62ffc2689b48e53ad26cd2af1bc07083a0d1b952dc22ac1", - "438d917bfbec4be0cbc821e58f186f8c10c3341181852b5c1d19da1a912a10e1", - "2f9676fa7dd053914b971fee151ea779addf23cbf2736a2f904182575cfc1048", - "2fe393dc210c693436934c0ece6d0dd1f2cadbd6f1e5f29a76a47f8ca779a261", - "63c07167e3fd84646288585cdd71cced837de448e8f80b4c341ac3b3fa191146", - "eeb5c43e53a5cc47cdbb727af9f2ced6c93f88573089b82e38a1656f3424346e", - "b22d4ab31d29c009cf77d4b7a9503a7054ad31fa35d511cc7e94e3942d6367d9", - "7149e553861e303372c8b2f418999ad1d36c35c568110e9e52ad44c0b5f21bcf", - "955d8b03ef104092893ad6cfc6de3992ffe1a9b0b8145a3cea61cb9af64784e4", - "b4a256a76af9eff28872678c63ed8d2d811fd728691cc50c79f43be3395e1351", - "557e3cb9e2ddec96ff1db030021de505f59641c5f8d917477213143d7de46c1c", - "6d5d96b0a7f28f8d5f39a3d02e227fbd6f4a39d22d8a0ceafa4ed95e90fb57c0", - "48a7f6bfab04eeca7299942469ecf0e984752db34d0ccc8ef089d5e0c2294d87", - "406b62b7e5aa41458ccbcb97e6f2773db1b7592ffd211062d68c4ce561540374", - "ae92ace6b33a06ead31c08aecf452c6cfb766211c36162de95f833665e046342", - "0c64c0dcf7bbc13c1432d01c16cd9bba414143e9b9646f51f8535b2d11fa4827", - "cd1f6631a75bd603ca3edc76fbebc6a222c5467a49f1b81c07e4334f3b81d73d", - "0162b7ba4dc8e70b2a3ee427817ff17957401dcdd0c275cba432de780a54f44d", - "2bd2fbbef55a2eb215c4760bdc9bff0c0d43ba5714a9dbfe083d508cbbc70055", - "2f2bbb04fd31ff6b376c044fb1d852839d0d8a04d56bdccee56e68864e59afb5", - "fbdb8db1522e76419ffe7f2431840f9af9e55bad80f1924b571c28ee25b31c54", - "203a51d8b2f4a21218ce2bb3910626f540b21f0d3a2ffe01d37b7310d3943a85", - "e9e999f55b73bcfc6537930cefb87c3cc7462e5ec3058854304ab6a69d7aee64", - "96612f3bc12b37d2e18d0739b04beafe93052b5fcc15f90b1ce9b579f9e6ec70", - "58d462591a66c754f3146c0e5b8884432c92060bc1afdcfdc814928b0741d393", - "f4bdc53983462b45179c2d89757c1de56f2a18991be03167ee8016f30a2e8ac5", - "43bc3def05678f8517f009a99cac6d82298016574f22d28a1bfd1247ca663448", - "2845439c8f35491699358114b800857c819adb55146da55cd997421e77830d0c", - "a1a6c4d80c0f8056ad3955d78b902b361ef60c1805b68dfc72e7d8257e373a0d", - "5070a140cb9902674c401d08271072028d6ab150790de14e91ddaa930a0f960b", - "b808c98cfb0fdfd295670af31417b735d14324bb645ba3863111ed78afa5de5f", - "3bbb0292df5ad12bbb0955d31b811033c15f556471975a2ca7e8101e63d09dfa", - "6cc9a1379d173e80b1fcd41967c5007e5b3bdd85bbae3f3b919ee013e3e0f65b", - "bf5e227f57b9ef4aced621e30a1b3c26d290e0bf218760b11d4e6659c921f8da", - "783b4af89a249010c800f71dce1b53ff29ccc9711302b936972a801a0a7ce431", - "abf8d9253d518e14de2e82d9bf92099267605510a6a36ddb57db3684d4fcb4be", - "90ddcb8a829e49756d1599cebf25ff09060b769fc932b144a52a27850802d12b", - "a012255905b4f74327a1c3993e53b1b04e928158b1101e341c01ed0942be66f1", - "8ef699ed1625a8c01b5b592828559d4f5705709628d7e4d42d15147f090de77c", - "631320d306012f4fe8d666ed921356fa1b568ba609ba8a5ff100019942408ee8", - "d98bbb93ae147e93b29e949cc0d8d389df61c3503779983312669ebe81158e9a", - "79b8b0320e1131a3ca03eeb288cabeb94808f7d1a4b5c693ebc3be620a31231c", - "83e1c2936cfadd8fe64b99d4d94de1d16e5d137c856aa0e53fdd7667f2c4e40a", - "f330ca08697737d458feb616f3ed0abeac5e67522989a02a50d21338756c02c3", - "0d59d55bea05f349ee92fe529d5db6c86b3ac156ce10a52772942e6dae70612c", - "4e6e5ada8fb07c3423d821094b7661f92fd30e638e19ad6fde7f15325657f663", - "5ee1851c284d55be2dc9da22cd2a84e49fd8f9c87ef15979b4cdc72c68a7f5cd", - "349c031b88c417cf46a6e0b629366638d4885c83e071bc3289b182f580f5b205", - "a9a478908af6a9623119e3933be7af9c985fbf0d7625d1864d7e8fe8b720fd51", - "0f0000c0c0a9040c84df3df4176a5eb1cb45edfe38cd7a27abac43453039c941", - "f746d5ee38aa29d315adf98175eed6823da69b40802a217ad3d53c89366c9a09", - "32ab0a2f4a5fc86a00f84802b502017cc07c248a7e2e720e3a54c9e7c309b700", - "f8df04cd29f76b84a4356d61d0ab4b07d2afb8f27be1a96a3e6076dc7a2614e9", - "78af41d310f3ebe77798f28bd8f19ecd4216de36df34eeb322c1919bcdb38893", - "8c00dac357d401d1d0c0ce9d4abc6eecbd51ee7d76eda4b14967862041f9e6bd", - "0bfb798a1e738d298dbc14d37fa30e1eda49bbc7abaeb62133cd6abf00de37c0", - "24d116df3b6c3d2cfd9d93212dc1d2bd4bf16ca853e9324bebd281a15eb58ce1", - "1c71d80bbeee8a25d157106bccbf8310f91c3c5c34263a0b43538bc6b5a7cbd1", - "8271b06ba149d28f437d4c80f406bd7eded09b2b2ac47e59fc5e8cffc0ed7363", - "9d20c887409a7d31c20aa90a7c91b564d24f2ff3251b15d4ee26146fa27c63fa", - "563b3b53144ec6c6c8c9499bac09000bfb0bb02e018147549a75474f0cdbfff2", - "47c9b53532d835832d46410c9148cccdf24ef62654e61421594eb9352e588336", - "86539c6ea1b2a9c3226ea511cf140ac34c7c075fdb09dbc4df13a9861f486f9f", - "37c2bbfa5a258c00f59bb2ec71ab5418e298ebd50232a8b83092e22dff81f0ae", - "5e7c0482e0d69a89c60166f253060c9bc7a989db53813ee4f6f342d7956b02d3", - "5933d8ea611eb76d134379cde971ca8bee5ae1de028fcb3080abcb3500b5872b", - "0534dc765a82a316b339b3bf2b25a6b6aa34c77531c98bdcc848761caafa48ee", - "2fd0fd95b6809ab27a3bde342ef65bb8e344b6197e6fe004ebe290ca2b85de39", - "305f2f4200176cdaf2556d1ff47aa06266d52b2e5a1a9e87826ab05eb61b61c4", - "634c143ee45f1ff31165cf7bdb764d71d7f055226b06840af2996a19406d6ee6", - "f4c96b0573224fd9d6d7416e6382bee96c45092db22b6791a3a4b7c9b381a194", - "bae6b70c40c5b1bb268df1f404c0fa9936ec02e1433a867bfdea1b537af9bd5b", - "17704c081f57f886bdf5125be5d270af3554d83c6f8f51d942000d12b6c56cab", - "d71cfaa232e18c20ff0e5483d5db8779cc6c119ce2a17674b3e550aa62c7928f", - "fb34c1e4f5bc12b7968c5b3160a20318d1bd9b2b190e917d197e6c91230c9b24", - "0746650a3a1617eff2a8cdcdc706ba80300f923e45dc1c3b0ad73fa9896a6776", - "8d4340322c8c689f8079db3238dc1e46f94bcac4aeec24c8fec748204ff26f0f", - "a74e4caacb2ec8dee2ea21ec3300f4a1f201034aa9379ca22b9e6e3e55a59f83", - "a52caddd08e5f3f333dffa1c76a5d141e4219c03830000e3d40d3d61ff02646f", - "9427900fffefb44a4dd000d40333ffa1ec5aed1169fcc05782e10d2a0618a2f5", - "aaaf01e4bae7003adb5f51a176cba97607e4d78878c3024b0895434e217a08b1", - "88cdd41a61bad2b9073103ba164b73ddc7439875a26e2e77b8bc186fc2ca33e1", - "fdfbbbf558edcfba464104e34a25ab790f2fa05ac2a51ee6400f49ae853ebf2e", - "ec25f753d897a0942f0eb59c9f606a0f18ed44dfced2fe2d35c91fd39d2a4be0", - "c38042ddf8cd09f3ea06ed2358626f6a556210054acad82ce6549eba3e4b9033", - "844af31b86465f2904c8a4d185e75d50bfc262a7d86bca5d0ae3987ccb45535a", - "21001271a808438cb69864d05e687acb42bc84ce71acfeee146100c95de0f0e5", - "eaff131e736f3ce11ffc0f76650acc1f00a16ff216a7c66ee3f24692e3309a82", - "81622023cff3536875a0c2f8619d444cffb11b7c84f2b21a3703bee57f33b7dc", - "0df7b46f271dd9dbee4d9e4971c8040be685bfeb5ae7f498a9ef0054d5b65c80", - "d0991e6f5fc52c0239239257f4520113537bddab6ba5c43ef185dc616d34d2d0", - "9f1396e8478bdc700d958e93ead092ecc83777dff58e75eb6a4497f08f431c12", - "87252f986bada632168fae527f8a6d7a8ed9c4eacd2b9b4a4bae9dfb272834cc", - "e54bb7b5122ee51a5ede8a6bbeb5616a6f651f0d49c0bc0cd1c48020ec7e2a79", - "86c4440aaf90db5a466824a3182d94cd663c278d23a5b0910fc1c0bbc72d7d1d", - "ee0c3eb4f3e5d2447255b722ede4eab2d8207082a1536d36260813358523c1c9", - "9a41abbb39c73b319c1e1c2e4927c4fa42b7f936b4e357b785a41cab254e4d0b", - "4e8c9abc3797f82907539fa45fbd10e971a0d260715851f5b1c0a6c8698e53a6", - "2083bed1a6ef97053a7237fa09211fd777a176d837a3886c060b2b3a027b59d0", - "7af442011243eb9fff3b093d4eb5a3ce291f291a89f89dcf640046f8a6b8e4a3", - "1b531e20aa82e4dc7c28bb8308ed0a3db1d4ca8ad1c2ca823617c0e0af17b875", - "757d597d63173bae4b9bdd370e7bc48656fbfa9bbc5a2ab5ee9bb0921ff7f694", - "978dd199e044ce7930249c93c12339858bca315b7c3e3041a86824105206a53e", - "1595a9a23de6eb7e95bfbd331921f686751b8eb1120ba916a99862d9b5384303", - "ad7fac202e8f001a69cc1e59c6e8294f1e1ead2c1e8cad6ef0e39a9d7cf3f2a7", - "d127440e2ec2df74054c6697ebab000e116fcbb56e9ea820c1e764faecfe6a58", - "217aa0381cafcabbaa7b50feaf43ea1fbd3559118cf4dc32525d2d6c6587d6cc", - "34b6191a8a4bb469261e18591889eea665b19edb784d89f421354ec7a2bad23f", - "bca37369dae70b51d72abed25126e8fbec2302a66dc348a71617b7dca94e8d06", - "6a04fcb7954db58d5fcbe2c5ae960c5a3d7c842d7ce39828c625d829479b071a", - "b00aa1d8c5e8b30b3212db8b88087675a01b133fa9537a467810c5417fc372bd", - "720c6163b7cdfae5981e578c19d98948f465c0ef449bc8e854330c01edc0b79d", - "cff7d5743e103c654e9459005d19978bdbec9ba19b8e4df4ad3ccbde0537559b", - "eeceae96331c38d6ff14e2234fd7e761349c8957d8e51428d97f9a43602bc9cd", - "90ade65df53e335a6881959681c89c32e0a57d1b349e60744bb770256b81654c", - "b861b8d5fff3b189b74def1d19801fee7543588940caf0dff99031b2e383b06e", - "76dee683a73976c027f8682b56e17094f9cf2a76e9a34ef7c4eda2a85236d1ca", - "12279ca5ba1b7ad9899a6d0795211723f03b0e42a803c388514e4e957a528477", - "32e590022302cb7f637e7e7d0814c586edccb4c7e999350f280827935ed9b8db", - "1b0f52c6526bac05eb3f9d3e07795ae42321e2a0c61b5d5374ea601334c6a87c", - "6717799f101b20171922c7969cca74464ac5f4ed17113881fa4560e20e94ee12", - "35bfcc894c30ac65be8df2a441760603a18265e1a090a55f6e3b5a3aaf990845", - "1a2118dfb7ed6fb8d0a37a2c418e63c98784daf6b5c07578947e89cc99c81b6d", - "091a94c9f5ac360e6fc19b49ece0e9e4f831c27ac85b555eec739d6af3d3f49f", - "48c5e8d831ebd6a2826e13a35e921a721288317c8de956cbbe6bab1ae0fe3168", - "f9d4068c706b30fe2cbc4af111d76e1aee2da12e1c565886d6af20a6780a2b9c", - "87d700ee00d9f3d2d948ffbee9e0fe460615f553a8e68086c9c064e6b2e203de", - "b469a9d073c2a76b05e11f732d8de654735958af050ba478c14f145b6376eed1", - "0e52b80b5b26fa5a94d105e5b3d683c8115ba5921d505a7eecff2188c725b2be", - "0d44bc58ea32a69eb2aa1b598af16e5cc730deaa8c12c150a0930fd89f9c8b46", - "290a414c7dee19120735fe5e8677a8fa41f61ee12cbe04c59f3577ed010becde", - "119f0dcc9d9566657f564e377dd023cd758ba9969b0d87b3627002ad21e4b26f", - "ff7e500c1a399316048e01d6f0f85cdb11935f3dd2201782cfd2f6ef0abe3f25", - "f20255d55438a90f1e76aea47b92a7848f37110df6d132a571395f2a6f373a26", - "32ffe6fe8b4371adf8b6eacf99ba9282cd1741d737e3963a7bc85005470970c3", - "74fa7830cc758ff190bfb41d6fafbfe5e884cf9e0351a1f6d4ff7fe38e739553", - "2f650875b1228dd46f3ff003088ba83b63be29d87159b39d6af04a2eb0c83824", - "9f2899d31561f47826333482f3e56c7ba0093b72d06b87944b450bb4af1f4d4a", - "882c6d3f9194c0ff01b93787e265bac2229dae7bb2de0b12ddd894bfd01de7ef", - "232b5d9ffaa07bfb04277d7028b8a1f3b1607aee85e10e4e7ffbaf6b2ac92ea1", - "f63244e5fbe7786afa24c4bae7aebe6e8bc3a8795c11337695b8ce44c181b24b", - "38b7c4b34afe941807decde9ee5d66eff3d10bedc038d2f58cb122f773b1e772", - "2ca0ffbabdd4c8c9e152aa3ce4e2ab7817c8709cc19bd949983b62d4b69fe0ab", - "799c9490a7946853c643ff866cf2dec7cf13197abc5c181e79887190f1fd0f60", - "90330018336288090a2adc7e27d4abee595968d9f9bab1edffa7a944ef14eacb", - "78fd8ae846b6f8f69ac5e9673842231d28190b5046d80278aadf9531a1e9af62", - "c3ec6add2f15c010da7298ba9cde728c49530cd9bfbd397d32ce38c4c4d8b938", - "b3a4f6dedcccaab5e6a1709a505eec1c7d6621a51a2892cf08602e0ed37798a9", - "da69316fb299ebc5c17c7552657305c2f0e2fa969f4649a9c414dd1ed84e0ed7", - "546926e9ae990bdc2f806f6732bc7baeef8fba789d191a089be5fa403eedb3cd", - "1394d21cfc5118e8374b90aa94d068a79955c9184fb437dbbbd48590dfb18241", - "71fbee5a0c974fa30b9caf6de98cb43e12ae894300c8739bc947f4871ab9e8da", - "b5c42572b9411f3c71269bb3ad4ad37d2ac5197060b1b4db3933aec67a95cd6c", - "9fceae8520c50fb29b569517b4808d0ff4631c098c3cf6aca510c93f165d48dd", - "fd8578be6655c1fc751af76ae34685e716548355df693c5cb186705ccfdcc67e", - "443f3c32ceb4fba9b88f24530cd721a2f57571deaa49ee8063e32da2e2befa2d", - "da84fc07c3b9a01ef2344a61a58675605d972d4d1165fa79a68f5100bf465483", - "0106b2194fbbb94a2d7463cc37da4a6406da15d91f1a9e2dd52c941705dc080c", - "603342a44b2f46af9a4ba5c99f1e19bc00a33787be4ee4fbc258f0929035fc6d", - "0ec0190177ba16362b1f7531370ffced9828b9b8c544718ea3ece967a3804cac", - "163f35ad249e71938b8a55dd377c95cc732ed8deeaa2e7a04b9989c51c42cb39", - "7802eb9668b40f1b4d6102fdb5bdc8e6ee56559e0b503c15922b9c9ecaa423da", - "f9f31df25abb2e67b8764d30b9f35031952b4baa80ac5466195c9e7183807c36", - "8a7c159f55ecdfe6e7c13e51edb6423670ac5016ad0065bf104b6220a9f54e6e", - "174b651e9c97cfbeee20ec89d1c179b088c04b493762f79b84a30e07b4e90a9b", - "48645361460427a77f91c158882e07927bade07ef7340cbb11a3167d8e3fde52", - "f97ac77fa237931a6ba665c95656ac9b2f1e808505d5f40fd217e300cc33aa5d", - "813f4df3a82662329d6b0a4a72f3a372366ba5dbec021f17aafcc70ffbbb8ac9", - "7e69f1691e7ba1961c7107da2d0be71baa8c992b8ec4c03263acddc8da8dad51", - "ba77e1176e693e937cef44c48dcf8a680667deea1da0779f26f99bc1ee6d2712", - "128b08dda0799115ac461a3ddddc7e900272680f37b2984caafd1889fde84fb2", - "533c9a6a4b6978d246b97bd9a80c55c4610c6a67abe3064b3626d1fef99f6eda", - "b469ae8857c11b338e7c0a8417902605313bbc79710c8ba7152e57a84450b9b6", - "f0126fb7040f1992828c92c5fa9a9a80f1476ca3316d26db42963ca64a287fd3", - "4aa78c83c94cfcf7846c276af4c4b8ec28eb55b90893ac355081778d28841fc9", - "e4f2aae4e1b86030c857fffca5d6146e7a0ea08abdfab75fada281cc3b719f9e", - "a0cf153d9bdd150ea72167c8bc7a1694f98b3b6745445dcf628deaad73d9c4d8", - "44282caad13c899e795139213d70a181d95c5d63e1c2c06c21a6eb426e6cbed1", - "84fae69129825c81040bbe75fbab2db2cde70d397532df413b1f0e16a2e6c129", - "a014be19094243699e052f4c5592bff9366517dce307f9410fc7514ce295e0d9", - "852dfdd5e4aded63ff00f917caf49b115a1905ee4e4a299842e367b887335747", - "4b3c32bbc8048738dde947b5e069985e13da5b568f8df24b7455a61fa7bf66f3", - "a3a1e978c6a358e7186c5e30811b9d8d7594496791d40e2a59885c25a74a891b", - "d55bfe2a87656a0a31c117e8fade6b92fcee950a6e49f9bcc1cef8945c92fc00", - "e24014e8a05ea97c0531e7eab7405004b918447988c7947a5eed75a5d446368a", - "0aba2273ce414d044c361c26b1efc1265d98271e9f22a632d0d27a5b35c450ed", - "a1144fce7608e807566e7ccbb95ec1ebd5318c5885693a6e41f219242f8f91d5", - "1225bfec99d4c19446054544bdfc36d42b31f8f6025aa4ef282e3173009de260", - "a76cfbb2c0e0a681ac2484f4163d4da05df4733e026b6d96823d7ae9b2705855", - "5020a00bfad0727bccfdab9137ef916fee97f1cdbe1d3378ae67252ee33ca13c", - "c4d9782eb9b7a2f890021de25b31b0a014a8251e7e8d6f45c580b7d964d1eed4", - "d0f8e4405eea3dc694c2e6b388417f47da3436eff3e541bb157fcec171356e15", - "e58aa8b8e706d690433996b0e7df16ce363d50722ce985a52a3748354a1fabdd", - "f2d211f8cc1cc0382c5a5498e8a64dfb79e82f3b21af40a45c754dde62d9ea67", - "6fdca70391e7ec447a63e89c2ebc68f8510ffa32b89e5199b18fe67915ac11e6", - "d017abf43f0a2b585bfc40a32e8f6085616320ba59bea2b76c167234083fcffc", - "4a2fc920931d53d44bb53ac0f6ace08043406dccdd4721db9c8bcb706330d95d", - "7d23473edc17035c8d0ee6a5338c4d8b487efc45c5e590793d1ece133d02c4fe", - "a1902ea138afba0c9d353d29063ef2f632f701138815246565b998ab89dd66f7", - "083bcb5117af18b89816300c2e4b33cdd36c74842918416de1ca4dafbd0b6be6", - "4a269735aa06196f214eb6e88574c33370bc82f5e36fb7bd79b1d493e064c6d3", - "29be961edb330ffa4a2731e2e5ed187f9ca1421af574a81f09b8ec888ac3a04c", - "36833fb378da7c4aacd8158f0c82b37da1f9c8b191158f67a4b1ce2e2c12a7e6", - "65d4f21a06e2bd7dafdb2d5e34591e0680a266bc2b3ba3de261debf04da6a3be", - "9fed642937ef205374edea249a5c8ee3bd29b15454f0c7a65b9df75829651867", - "e3148ceedc10a17155f9d97a22aa52907caf816e307fe335b9f2c424c23b2e50", - "612b56a5c09ddaf4dc4f701c0f7771e2247dc9d76db51b9966708369298bc648", - "56829570d569824a594347c6fdbcc20a1b77fb77717e9cef723dd8fbbbd0b789", - "3ad8d22be5a6522b6a08295084650b3830a3f27f70da3d3a8c16b4a5b0398eb7", - "8ec86bc0a728fa796324bf664f9f488eea3abea333949538e9705f795cfaf877", - "29853fec62c6724a45357c6a91495011824f9fe7d40ebd3f211b420d47205253", - "5c079b5dd5839a94fad7c6b6c9a58ae776db8b42fa5ff1372b89a7b264265510", - "7265486c8da12e9b63e44c38e21d755da2f727bb57f077d1f5884e3edf8206d8", - "7c3b98da7bc0c2fa6d7b5dd333c56ce628ae90680c402ef30adcdc7f9a0e132e", - "de76feedb0eca22cc485d0b074780d6d316119ed0782998b3ef54a723c2ddeba", - "3c17327bccea7fddd6af3e2ffe978cf5f3a4843482a5ede1c73a34a953691949", - "115808515d8977ad937331c30092585301b3427649986afb794b67d33ebcc531", - "dd9a02f70ae3632daa1afc5bee4aa2bf9c3f71457d09323a9a5f85e8da103b55", - "56badfbb215fe5124c7d2c99998a1e53941a87a33a6c57ac7b2486eec275661d", - "2398943b59315164bf5e06723928adbf158ab74bd59396776cef3a13f9b2bf4b", - "f77db45099279b191733b40a39a9590157391564dc617a605edc1098e1ce6e8b", - "c53932270e936f62959136799e46d01127c94a40c4876992184af9f5e2602ff5", - "f81af1150da258e416728bea7fe0b88c9679a2d70c20e62dd4ecf4bcd3d3fee8", - "b8f6c0447a960f9f58c96ee66781f48e40ec04e50f64f37bc33cb1a95ad3021f", - "ee88dc07270c944782e3ac35ac2a56e8ebec1bc7aa5fa49622f1fbdc4a0e6fae", - "76f23eacd559d04eb0cced48448a9b39bc888f345d9f50846c24193668d1cb0e", - "579e471641c5b14ac10d4edc4b3fa62b5e42a3af6646890d01efc984600ca5a4", - "06b181a60575371f05dcdbb20265e51bbe4cd016a55232c5bd4855d6452b9b3b", - "b0663bdfb5bdf163cb2470877745884ae9d68a269ef13045e87b335bb9708412", - "d0e651d8711b301101f696b34af14eddecf47a6d3e703a3b2c4ed2ad29deb817", - "c6014a3731c2d233eb096e6a7b910a8ac0a497320be593dfe4ada018144c9c61", - "eab6403a0be51d2a8a09c2f5f59d8bc8afd4d50a4a0b777f9b080038ac93fd42", - "3ff80883b0229c361c19521d37de6ae8a47758b85408dd2ff525046902e273c2", - "ba8def03b0f396f0f5fbe823958316a30f20305659ec003e7bf597ad773ef1ce", - "a28727fd6fcfbbb14215d2c046b182a5057092aca208b9c5a13630dca12a8c5a", - "7dac0f386573f59c481a18bd78dce09b2f324ff8ac28a4bcb0a050f6d571ca71", - "8a033c2f57e04aead547f40bfdbf4deb14de91f020a303be2155cb3f5d746eaf", - "8f0da5e85b10a3096727f569a204f24a4018cf24d5a3dc597cbfca23b09e22e8", - "9a272d74ba7551cbe30acad137a7d1c10fcd311189060e659da26d6ad6b20b8f", - "e5abb6f3c5aa7cee9a3500d1188af197be6ea18b3e79634bd2e8f436c17a4ee7", - "28790c306f0f050424bd2a6b5f1ecee5cf0b5a9caf652bf5c56469cfe9ac933b", - "4f9b6263e98af29be044daf7234b9a90a196802b221c983ce5d5b89f2dd31e6b", - "b3911d27cc8850579cc344b6d48ad73be50ca096bdf7764f788faddd65f56d0d", - "1e2bf0ab7fc9793df148c6037fca716e42955af9c4f98c4537302f82942895a5", - "069c82bb34e1a493966fece45e0637cb190279147e629d7e68f1b946b5f479bb", - "1e80c46155e6f47c22bc4173d04231a43bb21123ff7d95f77b4edbb1f8b3d32e", - "765d6538dcc088fb157f53275da22238b7f2251242e8513ed7a541e577e08fdb", - "d2a85177f006f3ee06fcf3fdc3724a6fe7d6f9b18a1191d47aa80706ebb261fa", - "ee5a535cba15ea190948d5821499dcd2e2366886a2c4fb494318f7d9e55b976b", - "e6ba7099d0dcef8ed0f7e866b27090611765f25f757e4f8101929f20c846f1ff", - "65a1f34dbd08632b5c7f1eefc4cf379f1f7cd5f799a47af55792bfbb66a1049a", - "51e4b1ef4f3717cd01d839647c07870a51c8777851be1eb172d049ff9ed689f3", - "45c5cf5a5cdd32bba5f2aade68fde85a1cfb335e70606568bdfd93960d1e5cd9", - "7a2642271097fafb09e10d04fbfcb222befd26d450f49e1baca598ae5a6f75b8", - "2d076b42e57350903c1961f126e5281eb123f5f01786e4fa0834f5e277add94f", - "bc300e7b80b8a0e0b70801732ef05280efc8eed0017b8be96dc97a72990311fe", - "282bc38d4a0eebd9d427ebd9f47d2ef8ce3b258f3d72c1006c409f269f22324d", - "ceb9d2fb0adfc7c13f1a3a1879da08a73e2da83d3057c100deebdb684780169c", - "f316cd25fc4848c91b02116aaa09a72800567475b493e0778f95753b42a11ace", - "f105d3a425e65b2669767073a681c529db2b67d17acc45617202186987a5d3ed", - "c380d62068b733fa748993c26208a1dd248e4d4062aa8f3437b72b7af2680fde", - "1b0c0126f7305df571c39b507d1552f7cb48fc853c419c495ef5ede9ed01a0c4", - "a15264ce059c1f864aa3e1dcfa33232ab8285f892f943dd7f43ae11d3816247b", - "222d3d5fae1b97a4bd58ef3b63283f242cc8a51c3cdf24897e9bcf27bced2f1a", - "af278f3f78da4af6a1ab3c807b645c798a9ebab933e94090e8e0c4680b25f335", - "713f04cfe8eaf94829090858fdedc3c24258c85c0569bab6d46441f7a127710a", - "518f0ac1c34b257d54e8805d019cccd93b2fbbced01057e17c4afea1b5e6e06e", - "b98f4acf72fbcb23a640555ec2db3ba06da7a11c2a2e579aad60b23cbd6d9014", - "e1283aa5137dc362ab975394e273516656872c4a03773e27ea1410465c315ef5", - "8bfc61512e6d381e6a7178ec0cef199cad5f1539aa46ca5a694245e0f60904ad", - "c162343c05a415ee0598e8409ef7648a4bba4b3fa3cb5a56cc7241f00be4dc65", - "b34f6cdc6fd8c1b8470dacb7c923af2f7ab27a0e925ee4f82b43088edb951a0e", - "f7258659fb639aa6004415e179322d45007e89b38ed242fb6a6461b11f76449b", - "9022b7911d6e2ead28ed79b927ecded36308657aeddd73fbce4c9474e9d8e8f7", - "89c51b5996d42251c66830ae8ac1adf70c7461e64c6187335d473f6e567bfd4a", - "f01faea9b941949aae85db70407d3a6581e5139f76403ba500fb0a4a91dbb23a", - "825412ba835cdadf1a6e716494857df993cfb32c3f6297b4f79fea6a38c28b8f", - "ed222071d6b9198a8a611c0314e2087136571054e961fe63256f4a27ae19e0a9", - "3bd1fc510539dd37b8985107ec2b462431767670f65b45730950600bf4816aa7", - "467d92c59f07a575a414b50fbb44cb1ac1a52c962c28cffcc5faec4249fabc9c", - "6f9ce3fe4f4fd9b8386b3330656bcc318ecda5f402fb35a23d7e997e72950feb", - "3eae2fb7213fd3d6fc8490f52a29028c984d6bf2d6c543589d87b187279d6e51", - "60048e3121e90e920b643e31c7c8d0d721d5161616af1e1de05db29e0d388770", - "95f6d86ea6e007d3a6cee26c3f19cf818800790491160856a2e04a5d8e961494", - "69077b0ddd85e32fec4578fa6de707dc24cbc45c9cf119e0f8727f0d62a6a258", - "c1e251ff50f3d41e33602f5aafdd237b64d46ec4ee04a72ce89d82540e93ce0f", - "ddd2fd14a8a507091b8a5ccb443fb49b75495c5358b26260dc431e71d979e4da", - "61c56e158d09a5e98f79ed60d2c3e2e1a57f27f658c680e9372553f0ddd2021a", - "a6f8407c67714fcfdb504a7a83f92c2a274677791c38b7926ff7d28f28e109df", - "df8d8414f52c182bdec352785b51368a6656bebd0e7d2c8e44a78a3d80f8deb8", - "73c91fa09815a3ce967354bbd77b4417b4aeaa7aded5f31e56d775a253eaccf8", - "8f015abc6cb424b8dc0f7bf4ab51e615577dff8ea18d5eaca0d9a6b7232f6f0e", - "341cbb656ec464d0143c75efd659e4b2fcfdab8908afc71e1aa178c2b2a2ee76", - "575706a1fca36ce48b31f32e7f9a3a114b2f73480e3f1c7b5caf1454275f48bb", - "962545fbe4c9f38d159c9bbab70c2cad94d7c1ec15c376c68012f177934d428b", - "0fa50620b4b55c0af9d2418ff525da5748f95f47a760da617610d70fc142077d", - "346c5d66b716004211eb8ca13ec89797a16a25adf8418aa24388b9cb028d7562", - "4d93f4518518d2e23d2aed0d240b394bbf8b2fb4cad56464e8f269ccc12d0bb3", - "c20934c0d867554f7b0086a071662f8b70f0443afec16ad33876a0e26262a14c", - "460538eb55e41b8407965486cedc4a3df92599088419c184807dc0bf6c7688ad", - "5ed632e3ee55e80e3482bdb9eaf9bc71123a2abc0e3c1ee8c9bc37da8d930fd5", - "f4c35bf1bffa18414061bd01a1f079c5bcbc2534dcdf6d48ad00b7d14c793fbe", - "28fc8f2391c8ee12d74bcaf69d6daa13abbcac53be033ea3f84d7d39b4097de5", - "f8597105b737f3b14249e0d3a0992bdad0b7429eec9ea8762aa3d373df947bf5", - "62186c54fca5c0fda21f2f05b8e42bf8ce605aaf52609dc468763ec733268631", - "748f2e1e8d8e556b00e83da2ba03e56eaa9ae9ba756d55c00fed32e01214e98a", - "35c9a57f04c043eed0149e93c68adfd891cdc2c6e1d6c71dc7eb196266e12a0d", - "e4e4ea1cb5572da92edba78be202552cdd35a66f4a8bccd3cee591b565551946", - "e25180cb4c7ed5b6b1beac0e16b323d38d3a255bdfa2741e432964fb1216fe10", - "311f52c0a2e391afdbf1d866700886c0c390a81e3e920d5c1aa01f37db2b7238", - "2142d29c251834901d20e73bfda511e088013af8f18e845ee341ea6fed83d216", - "ce127d2072d73e5b2154ba27ad2624aeb7fa024c9ed152862f790d0978b6688f", - "b27b78d4c941e745261c6fa69d881cc5b8ec604600af60e08fc37e4f8fd2a457", - "b9a25518422ab340a415ebbdcd99a6ac08523cec3924abe917acdcd098c5843b", - "9626d02bd9a540b5ad80b6b14279d47af23cc8ae71a78522a321ff4787939a3c", - "ac7d018686c61579ff4e7393c8b17bb36be0ec965849f4079d84e0786409f7ee", - "10ea88173f21b99ffe89fe4e69c615a1bb64ae4d922756009dc650d234ac037d", - "6c972cd6f991e615c780c91ab1ce35287ea0bb87d2ba5cb0359038e546813504", - "32dcd7d8cd9af4710bc25e9e08f9bc15778b1f3318fb57e396d501f4f51422e3", - "a663bcef36fad281631ddbe7889e747eecd02c1888d901737a7df4ee3a4f88cc", - "4858328eccd45601f22a4518dc69a4e129d5f52becbcd23d4b672323c264b213", - "e07f83c9097827ab4be7702a03f3eb3771a764c28fd521e6a819cccb01729366", - "8413190119af4e5b9bdc1cadc189c3533eb63d3d7e1fa4f47521f439064a0d92", - "7662813b1080e3c371426abac06e543058f1eedfcac9ae42b859f65368fd3b33", - "97c1aeebddd4c955af0218bf78283da7feccc6b4d01deaed2530c16b0e014141", - "c13c01ed0b369165fbeee6a343f1e12853f44226c9dc62c8a07973b8c39f967c", - "06e3aa8f4b2df6a7348540f3046e192804e9a01d6810e228e7a8b46c81236fa2", - "b7ebebbb3c0b68690d268a524d74d01aa899342b3676064789b9c8cbe0c65ea2", - "270e37be6ad4ed4d23fba0f9f82e4dd7975aa56ee71a60ba9dc3dddd7818ce52", - "d61645eb51a16c30d64e01f044c577aad8e1bcbb592864728e6666e44d999db9", - "59228d236676c6920367b569dd3d248e60b3ff4029f7be6e4b0deaaf06e97d1b", - "a2078016ce6ec79e7c9843ba2cf3e543f9d806f8814d958933d368a3526a4ec5", - "d0805a6997d67693c6500de5264b08c5fede1c78f5debc0be91f50bc18fa7a31", - "4b271e39f1befc274d2a4d628abbfefcbce448bfc4688b73ded5b26be6b922a3", - "3e7bce005c0931b23d18fc68911344e3aa866c6f75990d623047d96aa62d0285", - "f621a9364690bf491ec13a7a203d4f6635fed8d8ca77a53ce0b94f0f8d7acf61", - "a7127f2d41f787454b2c2d85edbf8b89858680ab0fcad9756613f01c33efe6a2", - "8b903c0a5a3e4d22d96a89bbb9849769c2d810d74fd6f0d9e32a47e51583886d", - "dab0fd3a5f627a1f4970f951bc4b6e6d2a215b0f0ab944353f69dd96028bf1df", - "b9c4ba6e4e205c60f16b8d0696778c065d209bcd4731cb5c77e5eb3c0b40c89b", - "39604e0da490844142c3ef67a6340df15263a8eeab9171533c0a640c77ff5607", - "18b858c58cb841baf1d06f215b3744f9a8f1abd8fceef5154ff218a77b7f49ed", - "f7925b418ab19b0442f1988d08237d5bdddb40a5ca9b0e65854e0d5023490a41", - "0e2ad5f5a2a853a34bc35540a5c7096a272d19aec03ece57d9f94e96f5731105", - "58c05334799fda370fffea2303a9c8695d2b661e6a94bbf8ac716f5898f0d0c1", - "670464a0ae6bc6ff76cf6243c277b7f968bd4f9b875282392fc91ceaa4f254a5", - "688fc02fc0e5ab5bcf051998e9a9578aafe7a2cc6624a321d2bf5405100c4c9d", - "102c5035a3b8a947ef1bbf87bf2b3c9bd10866344b38fc9f6c3f3a47839dd46d", - "26fa307bc8072ab2d7f67213fc91dca093ab4423e1d0ad2e8fb432025d09c454", - "de65c14afc445abd167e5ae6124e72d20470fd31095cdd89dfe36efcdecc266d", - "7133643f64798f22a6bae84ff9b5c60ec1474a7cc093ee62e3d7dc7104d97e28", - "03f9d97026371d64f2b10398313ff45b6cd55e5b3b888336285e27d7491c6f7d", - "44ab183445a9a4c7a76b362367c8af11fd1e90219bec33fb3bfc2bcd023e446e", - "fa41bd6032ab9769bf35692852ab764d06b9251a68c6ac8b2b845510b66180c1", - "98fd0c22ca2caea1f44752b4ca61413fcf3e696b9acc419954c8f3c26c658809", - "a8f107362fbd23d764558a99160c505c1187230bdd6932f9d877cffe54cea240", - "d901c315cb2fcb5d132aefc6899e38bd12569ea83a9250124969b1e7a5c3c172", - "a864cd70f2a1c78e8a4c6caf94d89839d59b8a9534a7ac311b2319263e20586d", - "d0fc09a332784363d09274c738152c3b190ae21d2cbc31080813db8feac83972", - "daebbda7085e2c171fa8bef71c265a91aaeaf9f58fcf3af7a45d8a1d0d954484", - "26261288a0732bffa980d5ad6ef02f15992cbf7a422fb7ed0230e5cb98af5782", - "fd1849e56a17b869a364457aabd95fb0cbacea355862d248409d249fc48ba7f0", - "e3e6e769a6d58b70a2af393f4fa14f7ad5e30ceff360ed07beb3e939b71128cd", - "1463d81f783a30a8e6994b1acc9f82fde160cce2c8d39c0f7cc53424ab3999b8", - "fae64995168f05961292184e02995d2bc0dd2cd3b7e4ad90ac439893bf83a6e8", - "586afd1a5d3a0402ec38802e5b515a672676b48873a9c950d27eb2ab1a402d17", - "892fc4cc5fdf9cdce0742eeed769519827b3d95b9648ae0f5b55c7151e0bdabd", - "8c1cbfd23bc80b9b0d56b2c49ce89c8052d9f20811124b2535304e298d1f1915", - "d32d04757004b3937c97b137612161ba6584be3019b98ebc654fe82098169d53", - "8abfc561fbecc5cb27ad85a2c09c910b23821730744e5c138dea3d331efc93ee", - "bc30483da47a26ed25647b864ae984acdad13f0c560aa838ff6da7b2ed33eed4", - "f4dceb6a2e9dd46bad2d914387ae28e8dd5062e2673fa6485b963c637fc3b242", - "4211f1c1cfeacc4e0edb0b07b970c1ff8267992599ac8ef2fe750b92362666c9", - "23c29fd3de914031fb71427c6ff3976a7ed2fbaff3c456c7ca716f89f9eff86e", - "ab0207fcee06def291d9b9af7a09d1d104ff02b1894ea739dd9406709c4614ff", - "e37ee9a36f321d4623d5f517578c8b2e65dd665a2f880f4b70a296912aa42ca9", - "97744be0d697cff3587f7f18cb40eb31fc17788784666f21832a92999c72d37f", - "28f17e92caae7a4edade3d0be89c234806958353926bb055bf406ae4d1775bd8", - "5ffa9871bc5621ad8e667a4666d298a4eb95ca82b67674cef5189520eb82f359", - "382f3dd5ea42c79aa13840104f1d7497a66876bbc7a655e7cdb3836d7d4a4079", - "230d15d0f1b2fa5165af30efa4e990b7d8c76c2197c641741231922bdc7784de", - "7b1366692a866fd493097c45c70ec723448576fcb3734f606897486cf4f1406d", - "bf43faab12554e7b010a53d32d9feaf096f6ca6b87ebd284c3447d2f16911288", - "2cb306bc5d49d482bf4370ec19b234c1b76d41c7b819ded26cdda8b7a64b44b3", - "bdb3df6fb07531fd8779057eaa2562f1179ef596f1b33ca6c29723433a3b5f3e", - "ab9b5451cce25eee3f2769238b20d01cadf710616639b3e58ac54d69dd1bdf06", - "3f2a480b5f002411a1baf9203810676baafe43babeda5f6bfb2cc5583abcc9b4", - "fcfa24b3253f6a88c67742f3b83112b2223c4ba841af7b89fcb690dd5803cb20", - "e138998f69a75c8b2bab2acee5af7da8eb47974429fd2d2202eb4cf6766b99cf", - "66bb324f43a96283feab5f14e0405c46ac1a81abac29b35f98c541a1031ae115", - "c6d1130220b043871777ff31f278812f06a3296775717354d22a2a333e362dba", - "9b7913ef3e95b477eeb5ddd3f5a39d8c6606a1a1efaaf5e60281df338ccd06e8", - "1147c212a3c155bf9a0de20dd8ec7fad7ee3aeb03683761fff8a9f7da6057ddd", - "764a0abd5e8482a8a6fac9acd39349846462bf490fec2c6ad5d3c3ef82520af8", - "fc3ce9ea98ea628c36cc49cbe39d67c80f72f2c2b565e01944907aad9ca536e9", - "0c06f2b510786abba2445b5cc6529c23f73d3b2ee5900dfba25ac534ae23ffd6", - "fe5aa1d27619843d04e4f1c5187ba059b6a79a91b3fc9a036fb3a9882abbdf06", - "3aa91a4543fe6693f52b582abae3ade8c02d0b4c29079e232a2bd1610032de50", - "5933d5575728b95367216431057e8fd6ae9605bc73dc9085c60bf3eaa2356c13", - "d311289c1766a1ab628eac6718abf017229a26bec5b49569e49f32c3c2f8ffb8", - "6eb8c8a12e5ee287965ac416aebe348cd330d75ee0bb87d2ceab5bde61857fe1", - "caf58a59e040a9efbcf40fb9da9358e3d315a07b58ef2b25559d3f852414b03c", - "322ee1a6e6d0a31f53f261fa3e5617f62ce81591cd9b73ca61d8e83c2eb738bd", - "c617992d1e31e77731dbc2c7575dac4db0b9758bfa46d004486b1d28f0160763", - "5ef0eda3b4a25d08d7eabaea3bd61b2733533be3aa56045a8c0bc27959bd1a3c", - "396a1aa71d157de79d1d5b7ec0d5a429b20b63372d6ee92401b4d50883eb9b73", - "b0a35056b5e96c37214e849f21c58b0aa7ba8831a6ba260933d091b4f8d5ffc5", - "cbdd59f228c529901fab9665a6206e7b7014ce10f4dc55659efb081e949dd2e7", - "c7b2a98f587765cd72ea3d20a3ce97bb93077ef3e989d9cc452c95e5e67fb8e3", - "507b20300d1cab862ab1d85e0e6e0ace37e9fced438bdbc46c12c741ffc1d660", - "d659c21ee11729120e0953061eda7f7ac0ddd6fd285cead0170aae075086eaae", - "d8f8598a1dab17b6065a487efe95034b5b8cec183efb9ce99d892b0ae73f11ac", - "00f236b0ab1605d7ad5389153abfe50faf730769d868ec74b6d04ffa4dfee7a3", - "329afc16d94b90a823e39ad8d084c4d66940963acd9a0aab950d74c0121196da", - "7d225be6545b7467b9a4194355bc3300aee04ddb8ed8ef3f43b4a8a2651c6cf7", - "775987937115fcbf253e5cfadeabea7993d065e2509baf559e6b2cf7d8a1ad9d", - "6a06d41532d1215119260f075833c40cd4391a0943758fce315e90f5a416f658", - "f2828eea6b056cce6b279d91c143185606da28e664f82aba9ee0588e25559922", - "18a9fe360b431b5ac9f28f3d5f62c8590638e82130a8cc121d91d5814d4a0fb1", - "fa5bec0b56075675f93486a70838776fcafff0d4a55f6eb95ebe77012b28bb4e", - "7c7c7a0ab0f39650cd548bc51ac1ab786a23b42786fed501ac12b4d438a494e2", - "f24567b47456c88c402f9b8eebcb4ae9eadb479d851ac085765cfa962795a8d4", - "d11a6ce40e2a4bca5842f377b1ba34c615d5ca689ee12d2b37943f7b87687384", - "3de435b557f68af80156cc8489da3e18b2c8ef8e961ea3b3f42af03e79de8d9e", - "e61c7bfdaefff02b301ff70137afabd71eac0b8289a533512f3fad1ba2e862b2", - "6ba5b77e4b70f5afbcbee961317db81f2fa87f2c66d3891e042460a62ca55daa", - "43803f80804fb14451a0b666160e30a5d1d1b8fa47046d4711a50a05f17377c7", - "e5608ae3b6af822d96ca988bfc0aecfcacbf6034678781c96d0b4761199b8304", - "7869781fb15b2c4feded53cc495cc6c39fa4cac35b7055f431a966c08e1031c7", - "63c0d9f267c0e38763e76cabeb58304430049633bbf8537f112b83955277b216", - "4aa39dd66fa2d8db2d1c90075f09951312f964514d0452bd70affefee80628a4", - "b7737c0afeb7895620d2068719b8e2dc15edbf78e0754f6cb82b58a2e4fc6b37", - "741524799d72ec1483ad8b799b7059fd3b0319f72bac2193d57c55a17238af24", - "cf0965eaa99aa9c2e57cce319c8ec165814326011599d580264dc62e2e07e050", - "40058b17f78f1f85999d561fd7a03b99777c6ebe7be6db3bded9019b75da4eca", - "d17421debca45643be9d4c026de33df9038b577cbd0fa7e1d5f2daf36e2769bc", - "f4fcdc5ca8552c6cf31fa88f2eaf34ad134a513890da916ffb7fd0b661f8bb24", - "cccac5a92dc13b286cad66e9b63b9e5108c5bcf15a761af843f4738cb2ae0166", - "6f51692086e0a4b46e38538b3c8c8bb8a66ab636c57fa1fc4b9b1fe8295dfd39", - "faf23f5bc89a2be668701114cd97c19b6194333a3aec338191770e6325ad1bb5", - "b7641ddae6b9ef907e2d59c9903c59a57e2a500c322238d95d48b74a68a9fc83", - "83c544b5279743f180ecc366768c988d7639a0cb45054e2a5f6f037a14126d70", - "f8127978d2de5e8056e863cc84a5e68f574169777683b3240df1bf9868a88db7", - "5b7eb9c0e16710852aa83a60e229c96b6596e9976a852af8e745abd237f6ffe5", - "3605b4f045069c084de398d87cc792e8dc3343b1b285cce61b10eb101eebbd73", - "5073ecd5a6797bbf42a2bf79bd77cd72187ae6c85c82b9239a74f44841bae04b", - "7f7139d45e25cc68ccfd6acba3c6086ce29971671a73a7f76db2458294b30961", - "d2927f8a7312d3c793a4d7efcd8682770398e59f45317c3a50e48f2f78bad030", - "f94e7f2426c9ac20f4c19d287e0696747c22d54cd2dba2e78e43aeb599cdce0d", - "b672e0238b7eaa5cea4b1debc4e1cbc84934e84e57b008e3e6bea746ea9bdd13", - "ba30f929e2b33aaacedd3aa1f990e38bccfd2fbc93b6b5231cc184d77a987cec", - "7e071adddc9994f2ef14e121f8adfdc55edf5247ebf9958a53a7c067692af1f5", - "6dee442481dd02dc43bdd90821424d9887ef44ca4246ce53285580d1a882a1c6", - "ef5697237971dcb964dc25d891d37eee21d62cf37dfd4c3dcfda10a32d30d9aa", - "c61a48ba61f9c262be2e1dcb0d66da90a6c5c1ca5a77d25e4cd13705930d9185", - "9ea6422d36f479b38f1b98647bf3927b9c693d5de9f314efde8618e2e76b835d", - "958d65a3ade1a4f96ae4fcff296ef302c7d825504bca9448f79c0dd5369c6dcd", - "ce391da4821812652d0c1026879a02abfadba16795100f440c4b24a6fbc736ca", - "0aed2d50378552269932697b98e5620c0113aaa2d048a265b41e289ad3fcf3f3", - "bd0e0c9ed195e67b47e4b15e7cc33d3f4cb3f00e1a4f4ac6ff594d5284334791", - "f6720c02c8f092812d011e091c32125c7e2bfa17e8344c1c0a3d2a299312324f", - "3808ea78b1448773e013c355b8f095d2dc4a48757923f47f04383b08a3526d89", - "3615bfbcc4f33d7bd2ceed20eac9cc31c3b2e121884eb6a3ea86e521179aff08", - "9fe8f70d8d6d0f79ae459cefdbd984ed20f34c09ad24656cc8c61629d46b1c23", - "6eed2372df87a91f1895b60ace563c18686b124866792c3a1216877d6928adb1", - "631da2d53b745977f010eb82e9fade30b84c8adf8fe2a7bcd402d793b44b0192", - "5c6c69ab90f05d4259bf78de6520026e2fde677c10569b4963a75af493951348", - "65174bfe280754622bf922869f7d2b42ea6897e46b04bbced1014f13734195f7", - "4606d8ad92e659cc69a83ef60537e45b48a9b5a7391a4af7d2f9d3cf5abc2fba", - "e6346e552bf398607a4b06033a91d41ac0fcc83c243ab188dd9429306484a97d", - "87fd6282f8e1bbf881b2b19e6dc67b50bbb7635fdfbc54e4fa4f2bd0b342a01c", - "4b0df5de22b781e0a5c16401bb55c87e9de48402f2f3a46d092c32920e875fba", - "e9e5f2d5e687afbd02513e47dcca9c1dce586c16872b7aaa01598f7693898ae9", - "7e4f1efd623c779cb9a8855c99b444bfcaa881b914ec740f4fdf9eaa03b70864", - "b54f1da5ca1540c5f1d30f375ad045bbf41dd091f8acbea84fe79b7b6c94be94", - "5dbe001850a4769cb54dc19feed11255448f138856ada6d67ac7e2246f78970b", - "8884a2524d6abc75db2259384cf2182b2707c497f59f42a397665e5d88e5cb17", - "b5e1586462e3e34aeeb00a6a468c826904ceb0c24d68a5765fcb07a10dcce028", - "00b12a5926c088e5a76d4f762087bd9ef0fd4ac35689f52ca3acb13f65ccd227", - "82afb8ebadbaec40e73b2fe0bd8026bbd75470d3274b9915f6d817f05bf27785", - "02a23cca578e0e5cf230ca77ed85add2ee8d6fc8524ac085a4d9f270d75712a7", - "e8a47eae85074a2ba611eec7627a5e7aaf66359c98ea6a0a5c508937e6a926d8", - "c13149d1f49401b59eeae0850b64980fe2bda63f89bc95059fef197ff745fe75", - "29cba443e299b2d53c4302ab5384709fb4d46b19ccbe60cda71ad90200e4de83", - "c36934591da3cf7a1f6fef61884420bf3d2ad169bba2ede81a3b7d70ad6b4dd4", - "04f87d0e7027e4aed630058e0e3b4f0dbca8dd6ad82503dd819b0836d72aa112", - "3a49381a7e118ebc2d3a0690efd1f2b1be8ab316fb4058123a5b82476f71bcf8", - "02868ea818b7e8b4b23471f4c4b3f30161c728c20d0e5ef2263c06ad9eb8add2", - "357ff0fe549a1b5487a326a47200e5f1c9b4bd7ee4f0042fb7b35faa11f0f508", - "4efac5e325253aa59f6999160979088cf0a51932cab4ac6e83c1bb31e26a76e4", - "aecc79561fa001e7cec01a8a3bf9d73cd1dcafdb1c74832f9828db17895e03f4", - "c5200d1c786ba0a8db56b6e40400697f6a7c9de79692ca9b2891594c629ce9e5", - "68d138b367637d990e8d412707e07b391533dfa635f9e59aad52863e25428561", - "6b4b73ac1b84ba6fee84779a5c03e689685dcd1c028d4560cd2fbb63469b628b", - "cdd81adfb981511bbab8448142010137f86ffb95fc8829589b844f7bd6950c96", - "da305a9e2d61ed77208c33876db5b65bf434f36c88ce037855b1074e8c946ba5", - "7b6beb8229d69cdfe8a2cac1dccd22963b049ab5ea4d84c893b4ae180d901590", - "49f4b8e206b60d49182cdcf9ff22f38b11338a66a4ee61d451564aaad23a38f3", - "a05b0a44f24e46ea7ddd9f2684b589f9bdf75fc1ae617e5fe96ceaff9ba25688", - "f6dbe17bbb3e82394ab8b8d0ec93fea2b1e9c337e2c5549003295810d6c6b2e5", - "ac0d84e62e3f13f2087bedfb4ee858f36c5d708bc52703bb0e15c5e10bd8da42", - "e8180ec6a776edb1b4c4aa8fa3294446ff44127a819cb32db0a1de39faefab6a", - "2d6c50263b483294cca3976b0319167444022f4ef8be1c88320ccd6860edbcfd", - "d6d04dd743d687c5061b8ab8737aa752a1b17fe218fcc2e8aee87aa14341cefb", - "f9121bffb20c5be0ed10212b7cdbe277b17ee7e287f6dd1c8eff4522795366d1", - "9a99c43a7cbc642d69cda4bb0246ceff79130d85d46db521786a6f8781b224d4", - "92028c290ec853430ce7631f8a93d9494b3ad06a0788eebb9efd901bd5e59ccb", - "8c0b3c8aa8886990026dcf61240aedf0ac772f01d2eed868f4d1bc43de5b6131", - "3dd7633054464499dd07a7ac74a66a2a71211065282b595b7a971490be14fd7e", - "0629b5e7437784bce37d4a265c04ea8ba988a9d808582a73878ca344788231a6", - "5ab7790b706855bdaef3353e037f65513b9d5165a59e99fcdf3563e251bf685d", - "f4c5381d6180afc4a09c06793368007650c9982b5657ec2dceed2981c1dff3f2", - "c1906201e4fb182cfcf26ec8494802dbff84fbd64ad54b5beecb66b3fd3d0cb0", - "108b99f3676add82749c75761bc8600efa3b2e5e92b8723dd2f3dddccad1160b", - "f5a3fbb5341acd7ac140af4a24589872f1d7e043148bc919b9fb670d90fa5dd0", - "de50933ba61030c58f86216fb8e9998ff6f28e3a4e288be3f59f03bd08e255ce", - "5fcc76a49b78208a7165566c55f489436ef3e79e36e6a4d979edf750400c4e18", - "ddbdd5f8ef5d1aa9a6786fcf54d0b90f5a3b996df509c908bccf3ea97737026b", - "00a66f1bd99ad7630b5d492c2f22900883766384e10263a4e8f7fd7e81a8b9a5", - "4d600606aa1685059c0c42e1298813ef576e96872d5e78b28d833248bc3a5ebf", - "2fd81259255fc3614c7516958c9fe79258b4ced606f4c002cd46f46b82ed5c44", - "f0c25f4f8f0b0a9432600e74ebde92475e5f8836a01518772d1366b576fe8b45", - "55663a9161970320bd77a8423bdec1ab2e21a79489bd24eddec6aa1ccfef0a5d", - "6eea20acf9cbc20dcfdc672a16ca62d76855cbd5a40e6a862a8aa0e0d59a9daa", - "83b700387f76095cb596656812d393759032ac0faf6c603363507df630778c94", - "e460c7e54cab61f1eae65cb16978fb8a7407750faa482de2efd4f47eb765a7ab", - "dd76f16f7202b12f157849f90fb3371c2269edc668905234aeded8d7c6d2beec", - "5d12206beff3391ec339e20270a50a9d4bbd1986f161b5d83eed492b99057d98", - "e8cdcb9a5525785eb7c81e1c61c873973994a354b0804c3cb12a724a0da00749", - "91ee97a3a12152b197754a2046ebf38557ec3c16c9f86d7f01ca2eb2055ad846", - "8d0150780e39ad4726f2feeb0514b73765d5b9c1e16f393e7a32c8d7de4d7605", - "e75fdc2065cc47f6479adb085bce8da7431677e0ba2d5b59918b9da47811f59a", - "e3d40fa032cd1a3130ecfbfdac1f529c9ccc74859f9d93aba16f943b0e1c7b03", - "e4527c89bd09c2dbe3f12612781749c7a9b6744adc586eca54622e40bd2748b5", - "cb232dee81d75e397acdb90e35206e6d526298eafa18c1cedcf67912adc7532f", - "c0c6e7c78e4f77b9018f0901922862903cb8ed6a585d9cdfd5848adfe528637a", - "b717577de716897b6329d7548296899a89a447805cc6f056ff9b98645f24c738", - "2451697a223f7d3dac594412c19a220aa21d621b9193cd597d99c15a75b2c4d1", - "b3dd3f04c85d2e3178b414355e7a22ab538aa6939027ca67b2a18501e1933400", - "c1f99f2a5dcffdd548f561ffa53b36baca4b36f65010b269c06ac457ae63f580", - "1ff91be008858ba12b94f5916ab64ab729b760be953a7481e794c883efb391b3", - "e45019314a649cf8d01e16ac8e8d7a157bd769d186463da6dc837c3a769645ae", - "e71750b02ab51954e7b417de2d9dcfc4a15b61a38095b4a0ac69ba9ad87623b8", - "f4151f79e0f070f5ea6de06b6ad99cc054709c4e410b94e64ca352414f802915", - "b26149ac6ec52e670b33b24b7fd4b9328820f5193c93afee090186226490fdfc", - "c74db8904d84841d6966cd586a5b17ca7dfb10c819591984ade3cad2d625bdb7", - "31870022e79cf6a5a6cec32b72fd4037943a7678524e1a17754539affd62f2aa", - "dc7817b6aaaef085ac1db7c24a66118e1a24121ec9d4929bebb822eaefd87640", - "6079b2b6fb0a68d236eb573c4c31ef216289272e8ecbed7b83f64dec571b3cfd", - "83af89a9e506f45f0dd8fa2d05d8a8a69c76a59f13cd94069db31e722fcae9fd", - "4a6920e9c9e201bcf7b6b035228a4967e4adc5cba3d72055ec548543e9ff9a20", - "f0137cfba970b08564ce1a5aba2334d7c4056f033707bbb697856dd08339c5ba", - "7a5ba2c52f03f1e042c85036ed77170d3ae4ddbd788b5eacb61924b229401ae4", - "6a7af70619059ea9dd678f2fa55481f717e25a0b47de11047366b73e36fb24fd", - "9a55fb34cc13a60ca59c62cd6a01deccccc03d9ae7007f694fa345a720101636", - "cfc4a1fb9c2ec0abb3985c1614eaac71f896b577445d026c978c07477e2c904e", - "da684ab3753d1955f84efd2a202dde997859939a6f7583dded435345f21d222c", - "137d177eb28d2478e321a36c4e0fe4afd41c443b395cc8cdedbcea3905bfe522", - "223be77f7699985d62c7c4e6864e8d8f2a48fe2e323d07f2b28886bc3022e004", - "71c29356bf39ec55f32a8ed0337773fff8a6d72c6a3e1f12f2c8b665da8f588b", - "585a90fce68597f2e850ff702e53e15d973483ea9e1ea05aba1d62eb2113daac", - "e5ea8a00f1484c7256ff8497a9bc5932c5ab594e3e6709a3ab20a64ddc166c9d", - "4df4e0aefeba701b1b9e1924d3d83957dc461d9310419537491bc4fa1dae3436", - "3090bf6009ab06bd584f34943246b2864687e03f6055e50e4af1078c925b98a5", - "a86e5daf26d13b613f3d1f3c1760cdffe537ef455393962bd9e03c360465b1c3", - "2bca0537fcd31030ba0d210a4ed3d349fb8e225331ea4d7f9a31ebef7b3e5e80", - "f6d4db37f6260ef11e847d44897741f1a4ae1e0de8586a667681d41626f6b7ee", - "b25ffdfcf15f4756b37c34ec003bf7c28b9469abb1a0323207838f98a0a6396b", - "c1baa19236579102fb33c6e8f383612f8f6fa1b366ede27e5d3f7f6b17651f97", - "5cb789cc32af3ebfcda3356daa03c16d4ecdffcfe019419a342ed0be656533c2", - "82f5a882897267477af0e03025426804398b1a34ef9e306e7bdd83b575832bd9", - "9cc1403a5ca48069dbb5f92512171ecd6c40a3fec92be65ad475c12f0975e3cf", - "6c5e6bae300d76d6273497068ee47fe81ad99413616db0dd8437ad8ffec2bb1d", - "c113c8598d77a68f3c1b426a7c7da399eb45968249ce1bc681b769fce43e6eca", - "63fbdc04f947155643eb118b268d05375a480084638c7617f5d082323111b68c", - "26d9b86a90de9e6fc842ea0e667e37e3ad7ab7a3bec83d023c80082e5eb3a448", - "f0dbb40694969bd1ca933f9241a1523fb64f7aa05a9eeabdbe0307941599d36d", - "2cbf8699b4004d7269e43d36146289c11204e41ffe0dce96b87e4aadea398a19", - "450b4581ac1eb6435f0e3c1e69c655a53f649057e557eaa14bf14a11ae009e68", - "ecb26dcb303eac28a4290911dbe0bc3ccef2b157b2725d5ae59c56376e46ab45", - "2221966fa0c1b7389ab8a997f1f9e5d11b80d59f44588ffecdb4c66a266bfb07", - "fcade28cf7377bbe35a0a417ac6af51a0b700902e4eeb6673f6d2b05b44a4dc0", - "71d4fe088d033ccc8ac22c49fb3905c4581fd504e8c43daec03ebc14cbfca3f3", - "ee5b35576dca1f6a7b32fea86a63f34bc53d39a6ea17c7b1976497a60d2ebe30", - "0a79b7718c9b2cba4d210de14bcd403f194ccd46c6888764a2f9a700937925b7", - "f54d4f21c142cbf5c9fd04befff26e7a1eb5a39669e5bda3efc7f12f547d9029", - "c92204577430941da1a7fa99a381cc4fbf6eeb4fa4531a4e04760e41c69cb8cd", - "a485c6a69ef2aa229c9b3d468ee25c2fab44a6a2be229abd4980b3a6517c7458", - "927c7f37b6a2c8ef1917d3f4213cf531e4052ce60a389e69b35d853595aef4dd", - "a92f6ab3f9b979a46104450d3cab6f68a93535e859818ac26b73e7b7f3feceee", - "0c93d859af60ed16d785fd72311f853ee2c9361f224de24fdbcabcd74d20de73", - "39d4563f1b793758c1c7fe70fcb89825a0eafa8c2e9bc1aed3059693a7c5ed04", - "c9901fd06b7a75d1b6f8cda78eff1284cf1ddf2f806f38e2b9899ce5a80c070c", - "d29e265b4ed64aa32e22b4fb0868c9d2db0303c93a0d422724ae553645b124c5", - "c93d136fabdac83bb8fd6e5af161118eaf99c563ca1a707a72341f22076735ab", - "97888a51be2e26fe430e6ed76498b82c399bb556777dd717714238cca17dfde8", - "d9bf6bfbacc7b9990ce2a37bff891839ccc4b84b4ead7e412fbf611bbb0796cd", - "cf8b068666774dc48dcbac2069fd29da9be252cb5408f801a5efef55592c47e6", - "3d5d403f0f695b8d293536ea731692ff83b6e5193c0b307a32df66f2a34b1768", - "ea6fbfa1a8bc05af988e62d2f18c7825a321040085131ca07658b9d02b88a3f8", - "cfb4c82e26cef48aa7f7fb06581fbc88ef5bf5fc6f654a06d2b6ee0f95413850", - "55d56207a4e5a5bdc5a9a239e436232cfc36b46bf1f0b0249915089b9c8c3d82", - "251c73fe0cab405c7010d317ad98fb379e5dbe35dda412ba73416f55c7a81a7a", - "21ff3b8f864a5c7bf2d7acb1282dcd6137fccdd35113bb8c109257a4c56a8683", - "d6b4bd8fb8749864286597bacdad62317b04a08eaa81b3dd4c41c4363b984702", - "d9aabdc10cbf3c9eacef9819858026178fdeef86c63424211dc187edeea7f0b6", - "e15dfe913fda79735ee6af64e7b120c7e51228e66e11a6a80f90b89c54896b03", - "4e507d10366fcd69ee7bed284f9f1dbc7d01f66dd05a29ecec3e63869c646bf7", - "b8a3ce6d86c3f46138aa0345e7eeeac636988f4c058ddd93cca5e578c968ecf6", - "7d3ea9d20ea12af8d8ec4191c68358e69c4aadc9cf755bc575e241729b21c4ea", - "5f870db8e37b3c90c7a1786fe4c0563e71d6be38469107f449155282c2a1b4a8", - "63de2c932519683344bc0538345f86ec4fc13855440ceaad5540fe8ccc57cc61", - "5649e94ca2be0665f53cffe40314586782a7f4532d07f27e49673275c2620b50", - "9c4f6642beaed6c9d851d9890fd2d0c427dcc23422286356782a9e31815a6a97", - "7594c45ea877500eb70eeb158d974e645118ced771f71cada0487c4f682554ed", - "db79a2a9ea4b3bd3d8ae4b036a52090cf8a9f8ced5b9a1d77546936013ac2368", - "d4f319babb011ec99fc81da71522d486d79f2556486a05bd3a7b06a3bb2a65d3", - "c723a777d99f128bf0ac283c2ec1259e006ea0b18ee57b939f7308d56a8cd9eb", - "47d76d6d0f0e4cd6e85ac68dec45700418fa44e86dc7b9a86e2d796f6fe7889d", - "ed360c2dce43e0f268cdbc8ede23a6c6b4d55121a595fcb8bb7e678c1fd928d1", - "484e91dc08e220080a883701b8c26b7902081aa06f0a7b92feea79eba2ef333b", - "6430374d02a6cfa776b246cbaf84a6b8618e5b372f29a018413ec00c21d15f6f", - "0d8199c53b7e6e8e4935167bac125f2e10ade714966aa125802a7534a153eee9", - "89d85d06ee353bddd545e13d00841e90986eb06eaddbd204dba13cdf999ac778", - "2005b3aa3462c91ae42b1ce1740659d12993cedb0df5b85acdfb62ca96f0ddbb", - "b1ad65a72d8be4d1ebddad8235bd770757a256dfd90babf52c61701e76af2b5f", - "8d2110162d9378f8e1a44223ede9c4061af16ade4b9c89bdd5f9aa4b27f108ff", - "a0510cd2a00482b0e885af369943331d442fc65ec04311b97462279d313e465e", - "41fb24a5caae7c99e003f3f0eea7e9f157e9ce33f0812e23dece409ac1b62a79", - "0d9f94a6bcbbd8b16090e2fc8a33ac2f3e086249e05e33c0cea025fb34dc15ac", - "3500bed2ba54aa485f77fc66e7c4ee2afb3e55b31b0a2ae9787107e89e47341d", - "6a74802ddcf634a7033625208d58a96da49361ff37995097793168a70a96c9b7", - "d0ace1f28e3b97c15ed05417190212e8cfc1140d56c3116c217888b856be9dfe", - "4292d2dbade91327bde8d2b340705751d5ccecc0d49c439be715e71932af54ee", - "4c79186f409b5f5b8ff5f8936d149bb38414f0037b88f78b7ae9d208be6ce6b6", - "373c111e5bd37c3f7c143dec4e3c9ea1c841c363b6db2b6b9f370baec1e9774b", - "0c0be3bb572f7dfc825e55b0f96823875bc9ff4e39407a886a1ab9e2910824bb", - "d17480ec3c10f7fe83fc9056f05bab065ef58be17080004079cbece68c11ce7b", - "bcbfb28b451de395718e5e4962f2c1ce3ecad60b554d3fa90c053c70f036442c", - "200032fad2922aac398a9ac3e5611d1234da4cf008737ee43ca15a59f07746a3", - "9647834b349948909afcb8322e5da621d99499b6d635d8e05bf9ed64803ed201", - "5c5c773fe04eb6f88135fc21ced169ab5167a6e3ec25fb269099b34ca1dc894e", - "ae8d2a2d5d03d5230ddc8ea6a305d82f5958b198eadc786d2fd5af45175d3b7e", - "5a902d959e39118817110ace590fdc97a6919ba998d65d9b7c8d7b97fb0c13d4", - "2a9401f690669b38cabbdf22227ee1e48cbd43eb810b3a67c4729eef3a52d997", - "d18a2cfa24fe60a8888e45e713cc6c6d98f565aa00b33e55b2d1c4614af2c32a", - "94f29521f5e482848acbd23cad85ebc1efbc8eb40707d7055dee7428ef8c65d2", - "f80ade5fdf428973d328deb23026484637226580227ec632a8419223051db43e", - "881006d7c2983e065ad12dbb09e4f41321ddf998f8efabab265377980990702f", - "aae101ae6fcf9513c56a0666290f75819af5a9708f362af35c0ca8beaadbee4f", - "1ce18d110f0a6248cf14afb060ea8b5dc167ea0b8ada34763127eadd252b78d3", - "39bd7c167ba539bd8d8b60d333aa5622cf7543a28d69192f77e1b7f8217cc7e5", - "8bf5a1626675ee94e0662d3a6f0cf3d582f93ac7e1546a5f85d565b1f26c65e4", - "455c02ed3b0407fed870b614a05992576d9e4a76a97e46941f180b1e27ab99ba", - "26bd2ccea8d1ae6c1920cd7b2d82d58dd0bdbcbde2826791ba30c77c8485a721", - "e42c7dd72552213f96b8c5686e00c1db234c8b52b206884b02ee15a3c407c80c", - "dc6d4cdc1805d182e7cc3b641cccaad5d9b3347e7d30ed1caea733278186f0df", - "d7f376426b061813a9f6fd059bad38812336715db7e47f2f6d18b4f36d84c02d", - "cf49e85f767f1fa740e03b6409bdf56f4a2086b1b54ca7259fd55fa89cefd922", - "fab8994faeddad6a9785787f904d8c61d45590452255dbeb76a8bee971d3c7cf", - "8a5cd709093b94573d572d721bfb705afbe0813da7a99c84adfd0bd952b669da", - "fc2e353910bd5d90126dfaadd57fbfa1cd9c2d923b0cf8b65fda70943d9ad73c", - "50d189e1eaac2ce97b3e1c7b70ccc8dfa1868d7157f8b85647e36f6815fcccf5", - "756dfef79a0821e44d3a9883ea62c6f37179f78692000b12c8dc0d832f01529e", - "46a48d6593671c332b5a728549b860772875b1b8fdcae2657d0e544cd2948888", - "df2e4b662004ca941aa30e682b0c827e6493a91ceb7b3fd778c26cdfb0cdb050", - "ed4ebf931793c906368f9f86f1286cb0713c74b5e4207fd8d8435ec7f689faf7", - "5e876cdbd13c62d17ab02b09c27feed8b9379089696e272361da9b96d6dc5205", - "a027ee64585bea7f3fb30b07bc067171a613bdee64a4e46bf9113e5d925194d7", - "5afe5ab1f974b11f2b171b17f8764a0d263314c348da80599f520821d53a6c80", - "35aeb92ed0e22fbd91b301f0b12693f6d4e6fac19c0924283bfc34859738b705", - "6e6ac43113f6f31dff6925a8df24edf39c870af01e87ca2c157de01a6b0729ac", - "ad13d4edeea61c2b86024fd8d93165ce6382df7d3132da4c2ff9ccba1e88061d", - "b43c74222d9a2132e2b278fed95883285df804c9d329b6343492af1154959112", - "cdc0e8dbaa0e749d5a49fbc09e8020fdaa642b7be6b006e19cc99363e4189a74", - "d77156ae93735eebda4bffa19a300ac746d9d4104016f9c718fe3bf5ebaa0c96", - "53cdea209705ff663133cc282a127cb29c689abe76fac4a9158a21fc5c83148b", - "cca8155823e6b99e6c02727f405673a80d5fb718d50419c929f823045d36d64e", - "a5db00129dcd7db5d572b1560c10684af37e65875f3908b5c16a976890c6d46c", - "500262ea89da78402f33887ce48622e5b53964e29ee9d6b2cc6bf100c1c1faa8", - "b61c103ec2429895e55b0a903b3ef3148a8c369a1c32f927fad8274ea1e0bd92", - "d11935a8232b5c15b2b4a1ca218b721e5a8d60a3642ae3bc3ebea0646844c897", - "6603aa70c27598e94c691c027f510129e10790f461abce9a8f0d1ed2364f1068", - "b10589aea19853b96c3a7c052ba46a7bcde8689c4ef8e179e2a52e913240cbed", - "fea296972c5591049b2922cc68c2fe9bcf040b4a7d9bddfcb9511d54a38725f2", - "4697dd7746e074066a0e92e96b0f4680fbe65475c7f36591e12c52bc09defd6e", - "7207e784850b773a59ef3fc572cc18b2592642181770167fec1f45e9bfd5d486", - "f49179b3176d9684ae08eb5606d970749b03ee0435cdfd6ee24b7f4ec7524d5d", - "7f978b57ed6170bdb12b8d8629fd74865edab8303415e44fa5869d9963061f0e", - "ca179164f38346155abd534b131f3b247f54e9162d2869263bffa5fb9c225593", - "da725cd24fc6b8362809b31fb7f1fa67aacd89a5c0804c5d6f3bbfbf85b26344", - "b89180deda65ca7b7eead572c9f18d98d36b6cf4ea20819f0749e35895222f17", - "ecc75e56b0d1e990da92103c2332ee3a9b7e6e9e5cf9652948b5ee627d42c8a3", - "01f745d956e9e8c075954c7145d7d51914a172e90a0183c470cf71026a1f970b", - "563cc5a1c5bc633bfdcc9368ea24b86ad477b5609a3bbb694d455966f11c93c8", - "5a415e2b90895d3662124814f62c9835f20653297f926bc09576f574aa15c6b8", - "1a55fa5216bdca55b8a38ac103ace8d6b28d99beda8684391da8df86bb629910", - "990543e2594637bf84b1432683228b476c059bf8c89bfcd1be7bd2f9fcf465a1", - "0389ecab6e99120043b577183405b4d0bb09f1d0b35fb1ec5b506fb39223d45f", - "8f7df4739faf0e44987b91650fc4dfdbf328a8848e75aff1f55c86dcf03bafce", - "8e8336ae2534b5f436757ca77d9fa3c26451261f7b29d0ec756e547e2f3e7511", - "404c58fcd4a5bd6bfc05d530ffbb15c2b23d3a134b62591b7ff56509660c4567", - "2280cc4126983386125d41965acf897649ec730d7ddc11beafbba8ed0bbe6fef", - "94bedabc2dbede2aa1ec298b1fb8cb6686404e9fa8f470a66cb4caf30a6ce712", - "0d1975b898a8dd72d945c4d37c899a9273f1dcace27224903e7698272cef5d10", - "f16bb14403e374d4bc884b5453ad4cb3fbe1662d9b15c211ab34dc26cc2ddf11", - "83119f92a2cd36ce6073d9d38e37d5e6e9b58640ff6dfa0ba3d199a01fc957d6", - "2e2b02beac92f876692161016b828f3fef7a0c0c899614f0864d519ba1e0bf57", - "057e3fb7ff66a8d56d40c64c4bbc79caabc850fde2e11c41f1249a6f5f717ed0", - "b5563c51e99061fdba112898bb4978bfc4237cd1aa8a1ab186075863d4d74387", - "9f752bacdb91ae1ffb75de659abcd5830072fec76d13e453360b9ba6cc02161c", - "edc19f75b36f407cffdbcc6466fcc47c0ea1ed601dd3ee2d67d8815357276eff", - "00c3ca71daf8fb8cc973e1a2bda9b96b7987b5751a54899e60a8a6e6c003ac30", - "bf34081da0f3ace23f8ef2c2760f70c6529aea88c38030a5596ad86cfc12feeb", - "3d8efa676ff32a277244394446f843676e71bf9f642b25131a6755812a27932b", - "ed66106068763afce3564319e79aa83206534a7bfc71325808c36849096cdd64", - "a49f2ca0102c6fa62d76d4e5a0e3569a6cb8afd4db2a8318ac1fc61b3cd642e1", - "ff634a6b0f6ffeca32793f16db4d8af2cd35a8c1525895bbcb155c023c0966f4", - "5b609ba252013a9eb5085cbd5601fb0331d4dcdb711a48c7e79826a1f5e941a9", - "a01fd0889ebcc6175bdd0d330939ab99cea55ec8b8460a839f76cd1b023ef1f5", - "69eb32228de8b49617cfd6d78c782dd7fc7fd9cd444a734106ec3c6eab61174f", - "f9bf121244976ebd65b5421a0e53fec1e5b2db5c640c8abc1414af61aef6d121", - "6df914c30486784f608b4456c5e54b56bcedc34332c433687ab39aaeb158f062", - "2c0e5d29dad08262d18ae3bbb89c09adb2f45aea6bc1167b9c6f977895ee24bf", - "8611f5f5d96edcc6039ae7a2e341156813a8f7bcb664401a6c7f035e237fe6a1", - "e4f0ac08d0d6c2f678ba74ca306fb1f72b708e1d5d12ab046901c31562301e90", - "cd02ab691b7a87b7c9a3caaaac93d74033d6444e715897b8f13790f1107dac34", - "5bb11420eacde8d3c56fa0dc4b09118052a45b37258d02ffc3c3658f32e1839a", - "758c601ffa79ae8dfa682328257dd8bc7b872363af831a6b841cb0da47f63fb0", - "fa835638b335491e604978c7bdd15283d9dc3d2fdddc96b81e4dedebd702eec1", - "2da2474417330c6f3470244f1ad6211f9f215262aaf5b6110048f3eca971b815", - "25d9849344b57282ecd5919a186d95f403f560de65b6c59e5455ad2983972fbc", - "a5e502316e9835d1e69cbc7cb606869f67deb51f7fc0730f35d27c2c89447264", - "f9ae619f7543a735cb15c41c94d00f80621536d68c77e63dce9e2a6028fe5404", - "a65795e0239480cce49c9172613bd80a2f0197ba977fa18ed21cba92efd9885d", - "1c6c793981a2d0ed647672226bc1ef1db635e2a176a243e87627233afb68da43", - "ab31a14d0c83b4bcc6b1cc9a25acb997d0ce0f0d5ccf6482c8c71eec65c17a59", - "0aabd83db6edd10ffef566c8f00e9c653565a52b48d62dc41b592166fc174d2b", - "d3973cb4e71fcdf05f6cbf5fbbb8fd6e2984cd1a2b123a1b4911a4b18177e4be", - "46611280397381d3eb3e00d67fe8ae4f2af148b845d4d187b1c6a4c1fb5461c4", - "4a646a7c903558825be270aedf38531fe6bed7e7323b4ecfd55931c33f09c81e", - "35af3f2a25a89edcb83cab427772cb0c9175ebbc097d5b2fb3148369dd9a022e", - "7292299108611a3a7880135538b0d1ad334e8bdffc2d2d2834f18b68de73f4d6", - "e11835a148ca04c4a6704eb53d6536749133732176b3392e2b50275e392a990d", - "34fcc4918e720e5cdee92515308ec60b19eadff01d28f3550cc13c9061259532", - "0a58a77371a2633efc076f0e1d9d296aea052e2e05cb2b97d51c569d6118d2d1", - "101bb14ecfd5cd9db3dedead29ed7e8f8a7df92de4f1c4144e848515183530a5", - "8e6ed401bc5c0e54712f5d4a1a4b01d7408f58f6a4c536c3a492f1c270463df1", - "843f3f82be792dca3f59ce3c4bfc0e887d088e9a821c58d583e4b2564d545048", - "03e56abaa3f72fd69c79df77d7e21422b9c8d61b94f0d6e3dc0ffa7c5e2564fb", - "55dc65ee80640cae0f42e33cb71c496f6da94c79c28897149b24ba5d433bfd81", - "b9c210fc33ac7c850bb1dc77890d1289025d63f67a7ee9c094436e8c66a16042", - "e284577262b88b41c8faae2ca12d335787b1de2b19c117ea87fe0385e46a57d9", - "e53fad704e0ff12adc5df2875bc487fc58ede203c29866409870f24ce87ab702", - "d40e69fb4806a1be3dadcb08490c9f4192ac5acae057de3b91482663e40dcd95", - "db1c9be54b69bfbe2903037dc3dcb2c3b19f11c9c97c6e6a6c595332829fd671", - "745ba0a7816cf27bf9dc00651bd49e872483578abc638ff5abc61381883269ea", - "18ff8e0233c84a15a5c546f7e16122867776869d607209e4b15938d6a6c819ed", - "e9a92d7876fc094ff97535d1d9c1ccc964d236d4e589f70c5c117f36c48cf3ba", - "293c23101b71c05d3f8cbc7897204956e091ce9d331dc08064ddc3dd66b1c58a", - "084fef4a9e4b53dcfa48fb9f049d981f8188e1927279c17bd8349cf95c439101", - "a0492fc9e7ed06f9f96c9f736bf4ddad794a617701d9fac9a85e3a87ceaf9e93", - "a3aaa36af3be78bb829cf66df20378ac79a374c12455616d001931f8fcee238b", - "e0c45ee328efd265ffcfc9e398b65c1a98590bcc9d852837071302d46aa906bf", - "f7a041eb60caf015333907867f4efb6fe931dc131d622ab6bbbfba65234cc301", - "a0e1418916a34bc9999c2d7f9f27a6ef8365d5486fffedcfb4430db94784e52c", - "cd569cf41c54721552b8e673e728953a8cde2620b87712f2ba5f3f67f8b8cbde", - "a48325978b30bca130b587ad0e49dd3d634a341b5e7d199540a807fec317c25b", - "fcb95f3bc0a3144dd3dec4283733b8750da679386037cebb17cdf80bbcda0e09", - "fc9e59731c9e692ee4cf68345d1c6e65fbe0d697e161e294ce28bfd5b193adaa", - "4619e558e5081ba2117fea01a19e273da557fa5ef141a87359b912ce39507b5c", - "ef6a5726e1d754ad0f7d493614ea4ae6bd6fc303d9c228c43f00c896c176818c", - "b5ca25c4a40e2295f03b3bd19b8d81e237ae8656031fee283dd8f8c64cb604b3", - "d7e7ac789cef3fafe7fd9c171e7f3d209fdeb13ff33f281cc407f81c0e243763", - "a833a3dfee8b4292151289c9ad50a16c4c049b9945edcdaa94339ae1db029d61", - "feb2b31827d6f02279be4b310906fd660b09a528f17d0e4e54bcf5a8724ee501", - "945fb9b593991bca47249dd9530581d8f2dd50b3234a732d961312dd82808dca", - "670c463d48a6e895d22c7b4959243b6203e8c259d1e00f4848c6d503a86e88eb", - "57f2de8321c9678a1751d84e63096e2b789fd284b9947be1022ad071a286ecf6", - "bc4d79fdc68bd2926eeb0a1811a1827f6ff02a3fd5161c04ba63c9e33095c5a1", - "1f3cdf68279dbf35ebe4bc69686ea9bb8a2d76e82490f5ce1797890d5b784d49", - "9745f80b56459d8a702dc29e362efa4fd53e2ea893b3f0996d92b1ec58d27327", - "37922b2e201f7c3ce948ddfb4919df6f05414e63b5b9e3ebca89cbe86eadaeee", - "d5a22db904d7dc594050e2cc2a82570e29999d9055d011a003ea48b31adca926", - "e3fc5431fdcde4a6d389a78042824e76c61053ac437567294cd6fbf0f087320f", - "b6b8c768c6cc26e6b08d4df816fabd686ed8332fc1f08aeb1a8a3ec3214dd555", - "a864c97e4f966c2a043e4ab6c5fd19f32f163781810e5658597706dd4ca3c1ba", - "4fe3ab191fc973ec1052d1ec60da7ee9ee1adca2a754782b3c2025c10c410180", - "cc62e67598d08ccaf72b618bf256748aad465b8d15d5963597d7870a7b7bb483", - "01d070872991a7b4a4414e6d911873128735aa7ee886631bdf44155e71d38c2d", - "9e99a4cbacba795cc227df1a8c3cd265ab39f34c468b64a5a23fe34e205f8564", - "acce4be8b53da9e9f7f53eca281b691d210420421041c9b8c3794bffbd0bae67", - "39ee41540ebecc35071b3077d510a2f7592377236c3f7265073783634eeaf4ec", - "2f7e50b2d77bdea97834acea957e0e33bee8a691d112aeb5544f751e042fcf0c", - "a4e584b83a76f04b16b0ee606c3be753b707e49ab4f1925c77faa762221011de", - "db13eb3e2747a40ca3959ea15e5199242789772c9ae11c51d33417bdb35cadb8", - "f9bd9b1e5ed3b2879fd6fb961a70c0f5f4b7b33a879d20a31ee07da30833c51d", - "4094710da856b604c7249d4cbde76d6ae1dc729e53c738a0bcfe0417c9f477f5", - "ff513a01db35236e874e7c9923a67241d2c1c98b0e791b278ca2a0022a0cf2e4", - "c6b8d504a252e5015889722abc5a8e8d5ae6e207099c43172dd6f83b8e58afb3", - "a634a39dcd85180d9f81124bdc35a2e63115302295c131201e04e626a72d9eb0", - "7f679e5bdb92e247b1f777a09fbf7b97ede61a2157460019a7d20a96ad9fc69c", - "1f79bb321aef25a2ec0f22c2a4f63c86d3fd76dec9ee13767c7851e11edafa37", - "5f9a62f51bde0a4535a40753955681fdf9ca5be0c70152f6cb278791e9e1eef0", - "78d171b57aad7e1ba16a19810433c74d63b37c2c624cb9b1d2e2324ea2d69dd7", - "00d1f01043a7af18a6544e5b70dc903d18f66333c279fd2554a5eaeedbe3bf42", - "c734080e73710f72ea3d06947623508ab13c086830e9ee4be72638846d0e6eed", - "fe55c1f065a061750a9d9fedc6cfa02acc633686cd0d3894d4d2b452750b7134", - "1313c1eef40d4f2a538ae5ac37805cff056888a36b69e0b306dd39b2817c349f", - "23904444eba860448f44472ecf36b02e84cf7664c1d2a8e0dde9c146469d4da6", - "95542802c502c29bbe67b8c775950e1c5f9d73bd4f02ab00283be77c43d6c78f", - "299ea95a81da7eb972795131ba86b0f06a1cc51c3ae3adf78137855bdbe1d912", - "def507d489e03ec5362e41065a50e46561dcaeedb7ab875f5ab087cb964f8268", - "74fcfa81d35529a3cbd197c12a92e58a4c25e13a14a5fbc6ad9d32c303c4f86c", - "e97e4f9eb3208c690e5418b88537c5bc61eea2df77db9213313cfb401f1d3e49", - "dc1257683206d8ac1ecba322167d89934aae665c51b04360188d9ec3393c89bb", - "77375802854c59a9bda921df5354f696e1ebf8c35300b91493867267889e7d92", - "cd33cc523eb95fd5570e7ac8587bbad467330f0190f51be5fd3dd021eb73b033", - "2f31ca058c1070d45b1096c8ca9e82decb18250714d382718a5add4c18f6076d", - "eab04c52953bf7efbb1ff72fd13ca281b26f426a5cdbd9b6f510af61bf0331c8", - "73b99b5de6c80869d7257e9d7791b1688567d8eed12f83bc312cae0b86fb2cab", - "46921b421218c037863216fac6efdff4f25f66134548079d7f24e80024d48e49", - "db47faeb54aaf85df35df67d98fd8b90377e863d982b0d8a94bf414bb9e13d83", - "68f70e8b6c4715b9775ff266ba80baf896ea5f1600b34894016c3b91350ad0c0", - "7d9d300b1d4019eb62c9743dd533e1e0f34ff27cba1e55d85de34e32e25f6c00", - "0f54f6d4365a1771aac31e627457f428b12cf15e4b4cf0ecb6c9fffc5817f366", - "f9f0c54a2d8bfe4a0f4d1265dabddba0bf717bdd00891944c580cbf8b19bb42c", - "b62822556f3b9d75e27813763c442e77954341e2a346cf1532f72eb32ab9f7b8", - "5c69d8bdc9addd6f61606410c5316bf1749b779b9793e1dd664fb54b98b62ef6", - "6472686d1d52579f8c67077a76819fbd2c48cf4cba37614cef884ce4c9cfb829", - "3eefdc0a3011b65b674b5405c39b164c6ad250620cc531076fb5f4df8cbf7115", - "12be68b6e91cb81e95eef6e17609a9cc6fa3536855c8623755e3adf2b8b826eb", - "0185655824aa50f5f1d0842e3a22dfdfcf1cdfc9d14e2092b68e3fd2cda252a9", - "912d8d00b0fb8a9a7a2521179b042b86f4881e21671c7b69409e32404c58d7d7", - "9f17590f18a37023b531e437bc56a4cc6548298f97173d3d6bb68d8a6838e260", - "162922c8847edf5752bb1afd53aa80a1f90f324a898bb145ed2457c099c3d1d3", - "650983ef3531ad66e937cf673944b0b9c03d96fa6308c1794498abdb61cbd85a", - "9e38acb797d3dcddfb44f1ae5065b664b375673912b53a44662cb404ec15f1b0", - "2fb0bcae343f6b894004fdb31d26582d9cadbc74aa1ab0551335d844d523c841", - "7a58473eb15597100c30677ac083f9d80add9e000d476fe8ad916d096bd01b86", - "6ea3f7295d701321c735873e1dd8c9499138524aa00b3f0cfab28b2014fa0d4d", - "976ab142e6222243b4417102da33440fc59233bb667609f24e632de97edb32e9", - "2d6fb94acd81cfe14b875955f597a821bd01cc04e8b5caeee3b93da290d59156", - "4740902e84cf367b6a2c04e6b35047e193992cf7cc64f6bcf7344c167da35bc2", - "8e842a3450bb5abcb98e9b6c9e4482d79eff37baa722115ca424d2020e8b5963", - "587e8533c9fc20dd8a3af1a315d707a4cc23bc3bd65c9bafda739c62464da99e", - "15af577dd72cf5399e0fe2cb539c136f2759f41944f9a5896e04b57c96b1da0b", - "3ffbbc97d7659655641c490fd2c1698d2699fc1a4274656832e8eae82ac2551f", - "125743f40094bb329d73398d73b5959182e8b1f593f38f67fb3ed0303cc68f7d", - "d05ac8bfc47cf8482feca6ef2fee61df5167cecfc8efc4cd5e84e65fe85672a7", - "490b6c0a49e73a8b96d23d3893124326c1e2593102b208076d737e9e61283c9c", - "851a58f22a008144b0fe0ca4bc007ef400645f3173f9c87711fa741b682c9320", - "35c0186e51b52d6273f3de66a6a47ce6d482b3fdf313c02e4398a098b25a9d79", - "93ce904a0244f0413ca7a35689287fa2901da0c1d24e5bf462b24a620592f71b", - "fe691a420a27f28687eeb22c424bcef1b0802d65a82fe0973bc4a639194d9180", - "6a1559936b20c3e161ec0b195fb5ec4382a15e7bfc1224d1dd9a883960a7b60f", - "ac08e5044662740994f667959645bc33b886cdef3529cd9033cc6e93df9bca32", - "15f5210023d3594d1fad4d45bf2f40f1c66b26f87bd53cc55ab8bfe83d2be527", - "132df194537e0c3c7516d43ad9a4fc3caf805ad52efbb511ac57e61aec3415fb", - "eb58c8170d602f25474ea7fb764b6d7164df076b7f10f77bf15c1ccb3a84fcef", - "b7830cef3ea861674fab7183c18f8b1c2652727da389c2381c4655f0940e5106", - "33e988bf7f9595fd477fb84c3daa1e2bd73b09dd3b1c77f16c5dae565d73651f", - "c0f7c2b7f3c25f520b9d4e96ceb6f0048e1be377aa744a51e72f0983e6766d47", - "37690b1b0297382e583053bcf5d289f5082f70a71e806e85985788a781f7ffc3", - "97ffe8c9afcca3bde508ff2d54bf83e11edf83015481ff556f2006303bad5bfd", - "52711b50ad22cf50b0c4f89377a50c3b9dde2ee9a2c93ff2a17d6a085d99e463", - "45fd0751366494b89604a62a0ac9c1a09e4dd832cb5087c82dff5ecc6757cbe1", - "cdc1a68c2b8bd1f4f6ad278ad5c1433eb1fbeb2191559c8562fe03c54275c838", - "779e5a558264fae9dcca383aae6053eff502f269870c1810ce02f33178b9a3a7", - "2761bb098e5ac01f09a5a3a53b7b69239fad9811dfb63cb71c3c7bdcc73c9faf", - "7ff8b6a1810de1050c190783ab01b5eb5e865d469ad8c9125c84df1b321dacd2", - "65a70627fa9b1de0242b6e090d25fcae236758fc46c8bd68132daba8ea29a38e", - "2f4ae3138bb2cd22484d7d0ff0e2dc1778b072e96be5b8cef7a9daffb5853451", - "61e720038832679ebac89f117970623e1de1ffb0bd257a22d66ffc5c3340de85", - "4a34f52f15d253b79fa24703ad4ff8ded27cf6b6268bb1cd088df62f1867375d", - "bcf66c57e5ed4f2e5a6797eec1ccf4bf239100025444cd923f98e9f90ace967a", - "b84c7a0118ca5734b0911de4d97c966a848a6edab184acc5d9448916af345bd6", - "4003477775df449c02756de243edaa98e060fb665e8762b09cfe37619b5f060c", - "2ccfed900abf3f8c7082d92e887bc7ebbe558bb43a4b6414b276fff1c99219a3", - "b299362ee4525e75512ce19839fa1184b7015f33b7323e076087d36fef5378d8", - "7386d52af94a9f274a26c3b206c43f416ac3daa613a99e62cb306c38b238f375", - "876c0cc47cb5efe5638a0c37da203da8d2773667516eedae83f806776ae9d291", - "220d45d4f05a49dd76a2ceb973df5bb1292bd7548da75e79106d7eacaf46dab3", - "9bdcbeaa676f0d24fff8c90dacd831a535df60f2d683139907b40cf20d7faeff", - "1025a7c3d08117e4da301cdba087424ed03bb5f61d956b22afd5d4a652c899d4", - "244ac3aa96fc7b16f7509d969f7f36e18e2667b813ce8fa2340d1813ce6282cf", - "70b92902765d4e3c3f0993bb89141e52d0f0f0e0227d68972382bcf42803552f", - "847449283df255554d00932cdecb06f55913437b7faf9a45ce5ae545853aba5e", - "02f2687b4a25dc102f50c5976a113fbaf4a1d90a3599eda67b7e3bf625b82747", - "3570a2a25d6fd91cb181639ff95a564fb986ee913757716098be3c3d4efc9ae0", - "6de8574b40fb4b8e2f118a79aea430575a5c0ed7c2ae81e0ffada6c74eacea4b", - "e772a3145b39334469098ad23f4299a0c7674a45e763e46634c1266f4a194634", - "9e5ffc0389bc80873bada680db48a37961f24220b4a0afb9a465112827f51456", - "4ac9890e097d82dbe38e5633e7d848b91dd4a7c05e154ce181d0d106bba99d6d", - "0c947346adcf3694d9038db21d990847b6a97d1c87d3a139ce25d7dbe14f1f79", - "7a6db62ba94a53e65a32912ab019a998833401643e986388f307c55cfcdc94e1", - "210d0214350e8c428c83f8dd32420f58ad6f2873e18e08cd65c5c1526eb1c2a1", - "24e2edae1eec068e3d4cfd23a307b06ae8d81a1f5183c72a48ca16678b6fdf4d", - "4a5b301e562e270c8dc7ddebd150a9ace3cbf3cf4022d20b2f4acf689ebd9c0f", - "f101b98e69d399f9da8511016e95fb01375be096b1a51ad9ef29b1077fd9cb89", - "93fa09aed50ac7582f244e6120ffc616dcdb7967da2b1a6e2bc43d5806447a63", - "e49da489659ac1e57bf34be53f5ebffd1573d2c11656846be9084fe328d4ede1", - "1e5180305a6d118ecf8d98ee8b28d2c4cbba10902fe209e8be3f92d7f863af36", - "cd5c4a530d260874b366f66ac221303060438b49e95bee7079eb1a65a70f31a2", - "824a1c28bbdb0cf8ac6a885a5384c1b7ab49052df5580e637419dc28b6b6d303", - "0f2101c7860dba2dac3abaaf5ce7f3f262782447b12cbf104d1e0f5fe5b5143c", - "9a77b0f3d8cea09e4feae6968080d9409a52132022463f3e4bd86f24935c987d", - "c0c482ab064dabf4a936b943ad66882917d0ca2411f0c3d2a549124634ebb835", - "0ebdb31285d6b262509eb1d89460650fe85ea616166c47f27b911435c8765b3f", - "3ec14b9c27619f4fc91bf884c1fe48c8786597a0fa04146403d7f2dcdbcfbf17", - "8011b15675d27f15430bcd3869caaac113889e2f5605e1cb9e93d8273050e3e5", - "9703b592303593bc5bcb96038aeed384322bcb5329c6444c437ac460af75d40c", - "b7574dcc0cfa067096d1e6782fad0369994b7fb48bb85ac707f463e99feac271", - "cdc53599be1d3456c6c50f5167e41f2636dd2e351ec1611384bb6e6f760124fc", - "bfedda9816498fb765298eb8477e1aac5223bcd8f8dcc2bc11552f9579cbcae2", - "91306f8d7affa7cfe3f071d2e764dbd9b302494b26de2327c59d47c0c5b9e49d", - "aa0bdd3014f8ff18f39cd09531f873b77adead96dec6cbdabf81f860a5c34f86", - "f1e86ffc30e26644971db2d8e8dbd98dac2d0d0060c24828abda17a795d1c5cf", - "51ec277175ba92aa25a5a0c738195f95f9e2454c2171cd3cf7a3200188f25c50", - "a93aa387d8a0ead769ecf52d18b5c0eefa38fcab9a28e80b6c25e54eec608213", - "d81675e43e71bede6966f1e0194ed559b982a88ce315c4f94f3057a286735ed0", - "13791a32d436154fc4f5eab5aa2714be78579c72e053869fc466611219a7f5ee", - "f50f5e99e6403cf20baf0d64dea3ebe4688afa78236220a948f07d887d969c3c", - "abf012600cd653980e9166bcaebe659074f000a0f71f7be90696f036a0cf0327", - "f13cb1458492ead6fc70d6ddf381642baec6daf2af53b153a09135c6b1f91078", - "a06032d69332ec34079c1369108456c45e96628e2649ef74f277e8bc22729565", - "9c4419d07a3d7d9c306da2b87256810de1332a27f271e0ecb8fb5c482eef9e9c", - "d7212422aa89adcf4c56e3dc0c4f160a81b9582bf425721331c2216579b986d3", - "50433cb7da49a0e1cfe776374638b61f763ac26bd77363d8e2c6a7446e06563c", - "bfe377de3c83f1d4dec31a7806990e396b042212c72de3bb454d74986bc60f6d", - "72b9515d9c3e2f2845ed5a9d46246cca21017c09ce3c5c5e2701dd36e15a0464", - "08372d4f73af2d0fe9626db6d1abfefa5d6553ef70af46a14cfb1720f68e7b83", - "2a0866842abdda18f88f4beaa7d7ff74e1c93db57f824141cf0f69ca16800a42", - "3d2d8bdae014a1ff62f558f76e648c039d18e159d2077aa303da8a2114d48109", - "ac0bff6c21027460e49549ed7bc8c17564c915dee17679969442c4db68be9953", - "bee54b3cd743ed620d5e6682098ecfb66d9f3bc4365b329974422e9dd8b427b2", - "7af9dcd71a78f247913261dd1b1a71b98cab9cba4582c89a6a2551fde3ab25d3", - "aaa265ed8615cd697a32ea94a6666155e5ace01b91557badaa5237fdcab431fd", - "3db21c06f636fece95dc3991b15b62595fff0c6e8f1c2bb8a74757ea14d91483", - "131197720992b0e7919bc2f5f71eda8fe4fac7ee11a8e3ec98940a6c5a9069ab", - "520755c1bbc72179bafef370feeb0465091ba9f038516da1e63039d39c7a0c65", - "403c2cfd6a4ea00056e920d5f1cf11cf5e28b41e10eb60d99daebc3ba7fb5107", - "b2645c8b40daf8cc47af668f5394878294adedbb8966a1ccdeb5add82accd1fb", - "50e5a53820012bfd2b1e35e045a3909eaa81762f0741dd819fde89d1a3b3930b", - "4b011870ef3848d43e07f2cac86425a33233aa8b0f19fe1dc4a338d5ecd4d489", - "aca5f6501b2b6826b41b5c6a45dd9c33655bf971dd54ec0222d73721454695e0", - "bd22116d0d1cbf3ee600891cea5e8388676a4ffe43ab3ce7864ae4ac50d8ef4e", - "d244ab79e7f998bbd9ee051f145e8d7cad052e379d5e90ef68108ef592c8f120", - "fa73432abe7e21d8b857df5358286b6feaa132414dfdc9a10ac304c616f55624", - "bcf91ab604d07d5243bec419e0958ad3637705d05e62b5a3d180ede900f8f204", - "63dc6ecb747f7ead3a90af5a389bab16dd06b86d2082170c673b05462818dcd5", - "a44106894635aa44caa718bb737bef0160139657588edabc8b4dafd058d21814", - "6ea69e44efed3d026f49623a721356eaef197428389d83d9ea196a13fbf7c853", - "c53c8529e6d30ff088ae74ef961af1a7ab7d68deaeb9ffaf0a09ce722faf31da", - "9e8e98edd04006000bb8961b5d1191288db6fed9611909b0af4b9c00ff2866a9", - "7cca2daa79d89dd580d9306d53271b8f469601f80a4b96656539f1ef726bb2b2", - "477d6bfa58fa7dc51071c433b11a859a789b4a96e889af598bd7fc2e3f5b6d67", - "0784260b5c34ff7e9dd4283651f87d42e13796530da209b03cbb55eedbbc423c", - "486258f88669b8a0390552e5cfbe805ab94c1a5ab11f92bb9839c13c374687e1", - "4f40f3ac7f8d50924253742e4dec7f6e2fb7b6d616332884f3afb989a1820a87", - "a12b5e665b5c53f5a14b3219d7434a67c79245e97297387d98adb2010d09bb0c", - "be1e773cd2341bb8ad35b2cdd3aa21d60cba586597db2c440f0b9f26e0c44589", - "d2f529d699dca2a69d74f47514c240d2d765b56ce6b35b5f1d969d1cb163ef72", - "967be70e7e229ddb199979d224c4898e6d5cb7a65c0a5fae82f81241243eed33", - "60c0eceee6a2f6a1ef9239365412683e535349d768828fcc3e7fdc088f25a4e4", - "1ab1741ef14b488759e7e8e35ca6ef02f58a44f21089763669e80ba87427a841", - "a48c4bdc13ee034bc19bf8c753b93385531c5bb2351a320c43a6a2390f796f41", - "ecd7c2d09fface2af53b3742ad0f6708b167413eceb9ada92bfac8ece913b7c0", - "38859b5928ea9cde003f6284007f27512d03fb71212367747ab664cdea9ab5d8", - "2e4055207643f1c31b52e643690f460874b279ce0856a311bff3254d8662fd18", - "9350f3c425fef4417ffaaedad046c3ca378af167083398f7a9cba3ef656de14e", - "9212709a52d7e99bfe34ca32863d8da21d17a6df919777ece8657aaf710fd847", - "c06eb1e0d7ea8c20521f759a7836e2aa486ac4bb26570e206672665241b38e35", - "7daf182f4b853576aa18c10fd991c2d0f112b932c8f81c052d7aca1d3be9fd37", - "7ae79af082a0b71fe7f7c5bf1265763999d60e02717eed0b71652bb47e6404e3", - "a5a92699654dfa4d7d0966a608c630420f3ffeeb36f72c0a403fe8d91289a4d3", - "eefdc476b44ec6bc2b4d2d4c6cd49d24dfb3203056c1fc7fdc58cf3965c302d5", - "1bd2c2d97774e2939e362f4bb030f58260452bc74488850b73ff987ed0c0f478", - "27685e67b7b9589a74719787714678c6595efff0c01bc32e6febb351a8bf19d4", - "81ac953f5c7d2e7fd91c2019f04ba799360d90c37cf41969a8ca19d9377a0d72", - "5866f65a340da912d68abdda6ff10bea9a3e633492d21f0a64526fc7089fdfec", - "62f6c0f0ffe9a5d36b5d278fc7e5560ee32d724662b3a95725166335784a1753", - "b202c4379aa511c2fca2923257f7ce5af1b161a28addb033256224c48c140ace", - "80771aece3fe9ba910f74ac3693c9bbe95bf7bd0c9ead3b9d95622dabaf9c501", - "0ba96311ec57cddbaa8dec1e6791c8950463aa647da875ad877af52bf95b5621", - "eac0c2af8ac4a501fadb16403514289ab2a53272c5aad306a7b80dfe1d5fa3b1", - "ce1bff4ff1da77041302d4ec26f00192c651ce1e1bf8f14eb62579779403bc08", - "75f8f6f864a7ec389926c6e9dbd55a02d5ba1a63055fc07e52f97e302f794aa3", - "8936c51b309fdc9e0fec74ac0ae1852e8890089a9a5760fa638383018369d756", - "7898d79d61abe51e5f41fe98be5751fd8ab79417afca10ba3b663d35ba9524ab", - "3886102753a3d3aec24ef62eed75394a058ab9b147fa869b915021d8598e7618", - "080ad83ac6895a4deb10e6aab5dd4d1d00c7e0000459fcbd0d71cc88eaae81fb", - "b627ba8a5ba89f5e29ec38c473811bc38a5318257e24d19fb204067da80127b8", - "921f2da32db493d1a031472adb64df9d707057c687997e2e87d78183f079e6e0", - "66c0660d346dc3c7a2ae7d87defc6991662d06370f8aa85fd3b602b55c79c10f", - "1181ed98973edb3c40c2aa095c1eb43f3d3ccb10ac47e5be95fc802e1d22d198", - "034c46bde0b4dbb8be22df1e406554bf4d061f2a51152831485c23c9657098bc", - "dcc2652643b4b339035a17e212b8b61a54783f6cac03f21da8f1374ddeefd28b", - "05c6e0f4383fe982c6a769402e856025d2dc07c2840c38a9e70743b3f599eee3", - "263fd5fc26ea99280f71cf38d9a9a0848f5aac9a55ed1ca204b11292ea182338", - "6617b1728b779c6df52d94c436389cad892e371763c36877d85873a99f233450", - "835650617a33b206ec69dfc6b28e43f121fce8e2d05492943033a5805f3d1514", - "04c2d0d7efd729e4e7d09e28291253e33d90cdf6222ebcc73ea4dd75ed52845e", - "43567e9138e1593fa3acb7e57bf27a4253b957ab63407c0187ec87f5edbdab1b", - "f8d574084c3c3fb023e6c6d8c40a4d836518ae57fb00fb33ab2cc68d37f57961", - "317cea726995fbabb83c70e41c842553fbc2c8a68e0974644005016ab4d06682", - "5a01195da6209e254d9d016490c068950081a69aab6a5bfe0e4b559b6e6bb73b", - "8adbb6da45ad46d43cd6a05a29d07056b851243f821dbf90426d15bea4152e0b", - "1adc62454d140355bf6c15d82eb6920863592e16fd7b14209a9b17055c0ea0f9", - "e8c63bd124819d769eb39fcae0b8532778426966030b47e21463f78610b6e983", - "4e7ad5deb05cf70283d73fd531b60233681bbc359cdb8465a440032ab9c2336d", - "a19940315506fe56aba53b5e2b5640e3d4b62135906a678637fd8ac337b27088", - "cb4ab556f059510bd6fbea9f9b7acdd7b883be89681a36d1afe3eb6c1a6f7336", - "f729e966c4de4edadd900241a43182eb9155ce72c7b7d5dff5c91c8a161b19c4", - "29a18ae9a5d5330fe69fd41cb79e4bc0dc016bdb3c5ac3cd9dff3b7a7998a25e", - "77ec601e1a3027b83f941406b4ec6b9f79ec25a50db378ebbf7944b1e18f65cb", - "92725f3dd810b96bc124d04eb4102de0cfe71c69d25adb2b7fb3c8a253532766", - "2918789eca7ef39f2805f7625859db08914fd8149da22396384a518391e1e575", - "71f2141aa74d315a39920d23ee5aad3590f105008d7333e0f7cf9acd4d96e210", - "8b4b4ebebd732e31556120dc6ef5c5d2e7abe74a000b8394e80687c497c67012", - "f6e413a7821e4912c4671a96e834a06e563233b4617e3312641bd049a2d9c0df", - "23865ce80f0b043a25ada12c0f619a5acb0a06b77e4004e1cee208136645b6c6", - "f9bc93346a39d3dd04e0d8d98277f00aac95a065a7dc522634950f0affc504c2", - "5f69a99babc60e69e475276a8f3f6748f0bc85eb1e65bb8a7ad17bacdd073c4e", - "07d4feb88f8fe2502cac33df334842ccbd073cb81fe7bf7206b0d0f70de12e22", - "7041632284fdc1bd0fabd742bc7e990d9a52e632bb63d9dbd31816908732b75b", - "b51d589e1838387e69bed3d8e807812dab6ca88b11dfa7ff4cf4b558df4b46bd", - "b5300988f7b51eb00138bad291ebe83e6c571e4bd5328923eb404a41c922296d", - "5b93a2f803c671d492cdabaf2194e914856125f6e5d9c24d9415e033d7868880", - "5181b873665d30a873115cfd0b47cca7626c3bb18f16e1261d6ab2ca8dbaa710", - "7c30844829fbb4653a54792fa50597dcb0df83047b04a9fae1f0d9fbbaf6992b", - "a35d160bb3f25ae806c5f201816cae3801a9b3acc9d481274b729f51e52d713a", - "4bdf45a8d4961f197137173cc9b08c28fd641666358e3996022631ec085e1a8d", - "456da9e7b7e5765cb9ce96713a8e06ee184c3c297f3d52b2e3c8482cd05fea5a", - "ebd998494f5eaaf2440296924884085b0185fc5277e6dbb2dffeffd842c9104a", - "a72d7d40ba4cb5a46880363392e8bef2871dd37c1fcb84af59c87a80f2feef60", - "e0b3531fffcc0d5c4e1c1eec6a54ca72aabed4651969935c5e48fd3d71609634", - "e9bacab2785f8baff75dfdb724dbe6fb13b51a700cc4499d49d5aa051201dfe2", - "10b510e29dddf392ca6a0b92c60fc8349eeaef26b6500d0b2fc42e7aeb2b50b2", - "215793843a96c58c1090707c72ced9823d1f7a55915f3653405f6a2316166948", - "a624a69564b06308d7087d610d5a02cfbd758391af7f01665acef5469f844e8f", - "f57b3f790620963a63ef5beb45c71beb276113d5fbe6646324851a64b3910432", - "22e4f32df78f4a6f6290686a2aabcec9542cc67d0c7ec72e089b213a649f033f", - "14367efb624b583f92d01ea9f2f84f5d07fe6cb0b609a189a10ab39699bdf42a", - "a378d467b2c107d442f69963da7b6c50f9e7bbec7b97c81c893fd7b4de0277ff", - "85ae8c88e097d10c4551d7ad8c719541ee484a51639c3745f3b9e66af6a1c1b0", - "9cbf3a3cfccfa966e0534b1a3d21f4e3aab15f4fa974f383340eac2a4fd99250", - "4d2e1e5be8a381ad9b7c4f4587172c6c2442ceb1d8e35c0a44ba4fa0b02a752e", - "0979c3992a0a55391bd503976569a166c3b0ee13ee355179a37d0340d0275ba5", - "d76314557222ded82de287bfbd08734fec2954b7c9732a9cc9b5949f6a642e1f", - "2751172f7eb7391a78b4d45ba129c719adac77d62e7a09d01cd22caf11b7af6e", - "0a7128175cc0d039011b38af1d9cb449d9678ed059b6ae6879080da2edb2c113", - "4ac98c6dfe30fa05b477129fb68d358372ab1f3b5f0d68206665e55072ba5ff5", - "ae75c50fb6ab243c24b4712923a1609a0eea7fe74af26667cc5a1af85655caf3", - "a14d0bb3ad690a949d40e6a4f1ab5286e146e4c3f766c687dbc0c76d15cbcc9f", - "73a6c01c1201f7f4270d39a873bfe0b341f4fbe9fe188f7662d977ae0be5e9ab", - "b45c7b12120c3f48c121b21c47819c3bd013d3282278351f7d48d829714ee9a8", - "95d534abcdb925fea782b469a060b82c15c90c5519f2be55bcc996474c273f9a", - "da5e62ba5b0801c5634e50a978a0e6ff3324068bbf282dc07e62be8a940408ec", - "747d64b5b1bc15c57d88360d8a2b2b8a67a20712ccf56bf0b6ec05e608f76857", - "60d4e5b71cb0a5d97224ac51ac91bfdbef00f5a3ba3b0a3c86824e34b6754c65", - "34178371165e0b27bccd0b66ac0df229a16463296f7a2bd7558fe12b4c4a5cec", - "6a5ded734f7653f561cfd5bff82fbad8d170bb215633e9b98ec6f95c42bf1736", - "627fd4e2400de9afb7082b05c3bfa6881e5be525b10f636c6a98c7eb09d1336b", - "421910d4f83addc452a3ba703c6b97ada12b3e78b8a1f6bc7806b6814e0c20d7", - "dcc4970f918fbe62b42f230c142075650f7b6d103ef42dcc52790893cdba0de7", - "6e76a9635c6794b820ec88f10ad3e63f80155479ad4a56dbb15daff33991ad52", - "24abef0381ae012f59ea5be8540516e41bf1ba91cac241900218d495a996d9ee", - "75055bf98b9b5014748fa9b9aad7e11e6fe57d7ec89cd48c265157119d427aab", - "a2a9214a64f3f8713789fbb5fd85f1ee21837fbf3a22bcdce8e6f793c4a1e08a", - "893e4bae07832ce480f8422fef5f188f8fd6488029ebcdcc2ee707ee4391e1f8", - "254685a7ff44e818aa583dec667623ac9168a2b4b7410247a270ea4fcfc6bd95", - "e9011689d57e5fbb189b25ba661430d079b5cf1f757a5cacce59c3bfe3f5df92", - "10b76c04cdb29401555198d11917fab1c67244f3dd1cefbcd7ec4321b99ae9b4", - "3f7232c7486b905ce9a9b34d3b3c81a2a1821e481657d5e4684f40e407fd7408", - "f255e99b2e2e63705a3e222597b0f527ce5174af20f183501e33849d7c4c0782", - "b88a3736b605fb39cdf07648165b746134226b0be4a858ab929516c3120ffaa3", - "54de13865aade5b8ea4aa4838640ce3d79a8399264040e66b31f7b3876897618", - "94e16a418be901c4d052930ea9df933a6aed5763e827178a74c736f079add0a0", - "eaac8b6e7ec14de2c8759bb8f5afd0e1b9fdd8f876c4a0a5a9069a0ada86e726", - "ea57631ee373f8a281111323eebc48527e9451f1aac37488f6be7f59b46b65bc", - "09e94da074481ca9ad7a7db130a80715b8c0f1a3cfbf1220ee35835b9455ea7d", - "2298ee3fad5f7467ee0d7746a2cb8bfcf8ed2e996cc39b8765b1382905bd789b", - "f9f2b18602a0f3bc91279ceb9bc903d4d0c7ce43ad8fcb350fd8bd1531aea8c5", - "1698f9a9d2058962415d3dd9838973c8a4687f13f526ceaf4d5dab906822f693", - "e11f17de8c720fe31fecf9a9cd64761526ffa9857f3e2a911b748110e56c7cb3", - "70d83a23b96714ae8e9029829d465d9c4a04e11dffa42ae081ec80eaef9fd946", - "50e315acdc2daa4f77224272baeed6fc6cfabfdfd76fc77001855bc99e404077", - "95eac442fa70f67c2ed6288a950c0eb6d38b634df7f127b94b0ff165a53a9cbe", - "1865e76cbece43d8645a1b4829238415ce5ad4d4893cd44c024c3d7b571f40de", - "8e0d95ddd5077ef9a2d4492e5804ed0956c5bc8577f50cc41825d68e56d091fe", - "748ed00a2a6a48018c7e989419f78e6b163165e972f5a2705c8988a502d1d0fb", - "a71f93b534eb249b6b45830c4b15550824b8a6c49a7d518117142ffb2bbb2b35", - "4c216f07f1d04941d5284106a035bc26bf5447307d81a46f4fc3334e27510150", - "6bb1f92795adf8a2cce2589c272d4135c8da43ed9d6d0481d02c5c7fafa1f4a8", - "b7bf95644c9a167296892f6824580483a505a3a7c0625350feba4442b3f32249", - "3e4eb4c96107a7987b9fee51303fdf3d68f06f3010e1ab7622d026046adc18a2", - "df60e3a1b5fcbeb38467a38ae1818ec9e2ed7b9fc4109f2b896e0a72ea4fa336", - "ff936ff1279b5ca380bd23804d8555bb08cc05b885ca884ea773f2ccac2b66cb", - "0280e11b710cc69f6219278124e2aa6efb0370a0ab0fad5649fcea0ff8e98345", - "a8233ef259cbf34b9ce11e544b5669eac176392a8909958c635695ee983421e9", - "4b0861fb981c8886b212f987869ee7e1eaf6515a1ce1f5bea4fbe04e83e73408", - "7cd912781db3925353d2d9040138333713c5c0b10a4e5cac3a785e122735736c", - "3cd41098a04ef56da7a31d3893a4bd2f9778656e62e4b4ab69308b49393263c4", - "6da976f5e96131d96929b0dd7df16cb0da2c371f4e2fb639f23651b98c4c1d13", - "a2501d0b76ebb930a31695a8f85af8e14123f0fbef3f132702427a8a7c753c16", - "844d9d0a4918e62d1199b27a742841ef706c30363d6c85932b7b6a241120c457", - "bf27261256f8862942358c2f3286e5671350595222fb2110a4f7bb55bfabf586", - "6918ba7de6da9b0ebd874845751644dc84a1046c240e5684a55447cb09e3955a", - "3d52039ddee2206fbbf8120bcfbf4980aca0a528b1101e16811adb5e1bea2e9c", - "61ada3db2671bc3429ea81a3af557000f66c04b067d911e1271c6dd3a5bd01b0", - "c41cb2ab2c89022444e02e4d8a8cd4411f46f973d0bce66c127b24fa6349fede", - "0d154e1d6c37afb5ff68451906c1b445bd4141bc41bca97d82afc23b9d15cecb", - "b531cab6617280fd7d88de47114c4754bbc5fe3d209e511c23510f5374d7275c", - "b22d0c93a71ca9b2de7b4f90520f0bc197b0e07b7bedbb16760964f0e019c5ad", - "1189f3d5e7ec7b882856eb9a659da0677613db557431cf8f2b3f97da6b356870", - "fc9e7fbfe6cb9f0dd3a5f15d5d5d10a34c02b9a7cfbd7b579315492249b4569d", - "8d7d6c24f5157051e92ce385b2b7f305db29597f5f544e1295b45a308e8304c9", - "37e76911b897297882528e36b8483d20c490c91865b97fd6e215dc7c4f80f49c", - "46b4f027b0cd4f22fb4db116cf59b986581abb3eedf3498c47934222c8ae7256", - "91edd32c97e16ab12fe598ea702b60097d8d634c71c6abeb4d5fa6ba7d434d2e", - "e9ae38ddc3a41cc3357ac9908852611c7b4340a17d834cf06a62e6929207f5b6", - "d9cb9cf98c497e9af00186987314d353a90bcb14fec4fa188fb28d7d9d940616", - "3b544e070d78227062fe0f08ffe3b1e2a747cdba730bf3b6a6894299fdafe99c", - "87c0be833d1694313e599ab0108761e04f130d9f3a890dcc2b53db6223436b5f", - "4bcd20b6327295dd71c1175ade722dbc35bb098f5025d5f177aa25a2052eefc9", - "9b59bd32c6d232e4e9510f3d4a76f468db439916d9bf2756fd3659c5b0b38bcf", - "7f5cdf35175a401c579b6f3954a8190d9ac09bfc617e33a20a3e0ca2425d2519", - "1778c2c0e71ed27c1c86c52b1905ab7b5a4781184b4aa9c126b903407385e615", - "4230c34c46de87a3911e365b1692b206781fdfc170c87f4ba1d9cbd8d6c4e877", - "1bcaf3ed301ad2d1983fbef053d6af5e93988112e9a9fffd19fc456fb84eac90", - "05d924529badf7f2a400f891b6af15df6a2010f04a117302ce1398bef7d95714", - "ce05faad1a6d3e5183a72d27874518d7e7b64e98af8d026d374cfc5c284a1f50", - "295660d78a2e9ef7e154077572210de494fed746faac5a7c99fa9023d0924a36", - "4ca204048d4a765ebd8da0bed8d49a4cfc51e20fbfb570a3263f314f1f7f3554", - "88cfe50c244a99f16d703ee7d0264d4ee8da8fe3e8226633a0e1599eb7059a54", - "54eda40d630725b58860d67bc990f1f2ed1cca516832b3260e1bfcc1291ecc6d", - "f4f7f48333e763829e592e7e70a056097edf0446dae8b2aebb6056235e8e8cd0", - "7e5ad6165f4965cb0291a07d3efd13da0d50f8dbd8ff59d32df60ff1f499977c", - "a9dc8143ecdd2981a49c52411d29057f2d2d645c5af952aeb332e6f84f472a89", - "704e6fd7774ddd471be6c510562d06dbe7c5a75706d766adcffd7915780bfd48", - "16451fbabafbc9829b3c3a59ccb8b20352ec7d55212d4668b793b3fcc5054962", - "4a54dbea6868ba2fa0fe029d8236c58b194d6f645be671b29c6399a6aa52e458", - "db7bf6608c56c64848708ee9087c81bb9c613477c615dba85c6a9d2eac87a90a", - "c0a74e26c4442b6ec2d862c3e0769eb102e05d4bc448d8bd711aebfc9cb10b6b", - "855cd69730575a6fd2d6d4d43068d0e8b4023e5cdd567ed7154f1c2898e11248", - "a903e355cc471c53d60227b64ad5d5edd0a6b21c9630b1e0ec585f980c9ba9e0", - "9dc27dcabd1bc24f90ce988932ca3e83dc5fe9afc02fc13b7bb53e0e4934f893", - "1a3743dad72def2c0c28a2799ad8716310ef5745f9b914573d97a27764c5bf58", - "4d94c82dad71c180a6165194fdf993ad22409ce541a6913c66f33654f0ad6c30", - "1705287c1ca1c3476c7bde2487f8c403aca2ca6d63872b2aa8f8a90d40f9dff3", - "5dc43b5656b7817f65884011acfacb5ae514ebdd64d680e0960b90f5216ae2a3", - "fca887a76388410bfd0eb3cc5e19c42ee4dd7ab1d3b976c16e354619cf89cf25", - "2fa1f63a6619b8c506d96eddd83f70ce8df3a269e73958a03b34c73cf2e55ed9", - "2ae6b0a07c8e0641379834b856f54e9a98d968195b7e2ed3e7700ac8a585bc72", - "a0c8d206623f09b317df3a042f989d030cd3b2e6ee365ae202bd6713e15ae566", - "a3a81b992c95ef756d47d8d056d4184f8cdbcae8173128e3c5bc81a9f3dab458", - "c13168c93892a083536880bb37fad5aa48a1b4488dfdb7c9cfcc0ac2a2069df5", - "db797823be608dfbc6246b21d4fec147c8f604a03e78c6be74d30f04e7cd346e", - "eb4d722fcf5136b130f133357c958c9a9171935624fe0f32c170b67969f33947", - "99bc365a2571cb4fa1cf8dd91ac4261eb986c623e19e3e7b01270e3ce1c418ce", - "e1aec0c0f7d4ed012b1a1ec071e7eb13bf26b1aeb0b6a8467d2a70edceb626c6", - "d89dc4d7542ed6d4b3ac59fa77d71519a3dde4f2809a19fdd98073fecb4f8f1d", - "5859aefd724ec9daf0e0f0eb979b07bee2f732949063f6c613ca68a260fa4084", - "7694782371a9c2170605548aa5e57fc39b083cf9d5b8d9402683a1add237555b", - "5bbf1d39eed3be468eece82d53ba53563a46f208328c76f00f01c6dd521b978c", - "e85a4d00429f55e33edce4e99872b1a36c08d948339b23785fe6cf08acd25437", - "acfb8fadc9326cf2f0e74dbcbf0e586bea59f0a825b004f697e04573c9cd7f03", - "455794307a763e606b4d54541e5d50d494dc047d5d847472f233fb7e537c56e4", - "55eb232c6122e5578c72db32a654166f7303816b44a01209fe00dfdc781524ad", - "46f32e5daf1e50ebaac3b4f952acb19bd1d9a569a003ccb9739c567882bdda17", - "85bb477d38b94cb78870e345f3315def55f767c0ae8a3fbee6aaec799d0cadcd", - "ea0d26cc0a2b6eeb7fd38e0d83b5887077617101e996c89790eb00ed40e60905", - "a1945d34065fa62bf46227d783ab02816ed7d8f35c28c31cb777682f255d0537", - "908006ac9ce62499f920ecb7da33512d6e109f9ab25db2d089ee81b61787a86a", - "c1dc0a65b7449da806e27966d3e761673df4c60ff8a8041f746871d3c4a91d5a", - "27f84db493cdf2fb4338a24674d834d6a2bad2b1e598862b5e76ec969ac125b7", - "d1697138d87cbfd447108eea7060191f79fd8cb028ca3c1c6375174c64c0e8b3", - "74527b3329f34644ca4e5b2b3f2809b3710e7a5105d80bdbb88a296ebf9d575f", - "8986d4b4f9c5eedfac4856a615c86c4af140281725092394a0fa40db8b29b6ab", - "029ba79e30179d38dda7373196496c4139decbc9609264a8a761a78926bc0b1a", - "11b6a776784800f7b30146bc2d0ba631b7926ecde30ae4473a7f5f8b68e9fafd", - "99e573ca785a2cb90bd88aebfb596edbbace91e19795421bcff7ceefb3ebf2f0", - "4650ea799b984f2b8c243f9c3718b6d2f74ae4d01587c3f3a53cfa6bde566f41", - "c755e60480a59566e8a0fbaffdb6e0f2019e2fffa67d32bc75d75197a318655f", - "8605523fa69fc03562bde6c043afb453726ed1adbe785db2669e8121702db3c3", - "d7de758769a784620c4929a85348e93f4b4cdeaf5920d01a59e69f8709a60203", - "893207ec9e413c24fb0f47191967c72341654da1934d439664a4539f47eed64b", - "6426cfad85db6e401e3fb5f486d113e97216cc2da3ff9e8c875268867aeb69f1", - "e45c715160f216726a0cde384680a1fad0d92611b627d90757390168addc7e2c", - "1876466d02942924644a4bb512c89cd17a10965cf43d5ab65a425de98dd81709", - "88da5145f8b72e2de784d48439aca49e807d17afcb9fb6cd652a41090722c818", - "dff7d571e38533aba709cfefde7759a8f78732d2df1ee55eb52f4834870d77cb", - "224f825df048cc59a46946d56ab0477a0bae39992200311e7f77ca6eaebb9c13", - "b27f3e5b796e7dfce5b927f11d4a185050fcf721e2c1fc3af2c0b08d000546cd", - "84c4d8af9fd4572740bbf2e714b686b5444365e136ec7f67e0c60503728a647a", - "b64b198daa94bd31bf4a9e80b0559b0127f16c41a124129cbe033661ae6b5c0e", - "88bdc0f60ca6d8295125ac19f4648b6ef5be600c7d0403e632703a55b830dc85", - "1237f09e19742a705a806941aa4a92c8080d9b3cc53245b7913d86284009b018", - "cb558dc4e178f3f8fe682b8a17b3667259be77cd411cd655c164c83c958d293d", - "369693cd65ede595f96ff63c5c2b57ee109c48dc69c7fbeb9a58bb8b1a00fe92", - "7a549d3ddd03d69fcfbb65a3026aa0442d84e854a60a555d0d0ff9f75e0f9453", - "556905000f86e4e4e8c9b08cbda339ed062c01ac7259c3b32c41b98f4ff3e5cc", - "33ffedb3084273d78d4ccc3a70ba2aa260bfd3c64b2d391e848b266c0717bb59", - "8b0529401c5b50420a5b0113985a5aa8640600e50f66fd273fbe8714a71759cd", - "8f9fb611c3729cbf4ec44292dc00f4b7f62e3797114cdddae0375f89487abe5d", - "4daa704f83eff2b893b1fda4a497d625ec98e2f525336e7e146487a685d2b020", - "8509d9645a4fbbca39f8d301d05059672a8be2eafa102366ab20282ba8f5fd23", - "af58025c8d973867f969e7ddd3a83aeab508b6f650f9284ac9bd806c06b83f7d", - "61aadd541e0b1921e58d867cb631bca50b21abc89f48ee401ffdad60b7352afa", - "fe4e635f2ee55d61be6aa48fadb96a5ead58ca406768fe26d9a173497fe8adf5", - "705049cb5fd19fc62273c5ba325dc0d389fded89bd309a93136a3fea30b549d1", - "84a5a4eead4c6e1b73f755cf8c95ce3c1c8886cfad0de68cc5c7dd37b07f363f", - "70fd10ea8cb36a98d17677fe5a42f407b89f41dbb9236a7190d389cdc54a7b76", - "8c1c0b61ee8153ea5acdf214e7a0bb4da79d98f0f8699cb2ed2815f962e872ee", - "f7048b6549d6098ca9f737f7d43a698ef4c0ecdf53e88189102b63273ff6c8ba", - "5b17f17b71c6041b7d926a36c272758bf8098abe0e1afee090f6fb5387095ffd", - "366f300d42b2ea7388a0210b68a19862079d2dc86900889623690dadb459d0c8", - "92687dc7030803b87e99a4dd498ae7e9b2ba8755efb800e8a4aee15e425bc78f", - "8f3a73d94e146562e428fae7be516f416467d1106f85b554e8d6e8a22beae1d2", - "7d22384b329b75e63865d969c253c64b5b9666bea0f345dae4db0d40fc6a9046", - "1a098af60bbfd30416ffd731089de69bf62a483fdddefbc850170df9427e78d5", - "0d00edc610b21451d258e71061943342d385610a5a0a2697595b5639c3d422e8", - "6be04731bac5c3fd47af023812ac11beefa2c27ff70ce5bbab33a25e4e869f1a", - "560c38505e3f1cf4247fc70c6a3e35395b54870803a93d08c5185aac7c2f1a8a", - "f119d5c4f956e38a9bb95fb9fe6af0504b12a445a1868bfdc1ae2ac172424446", - "5022559e6ee8c7e83cd9989891ad53fced7fc2a9610d6d7cad966560bb43d875", - "d48f18de026eaf8354c126d36fe4f69c33f1df6ee93e685f62703cee5e398dd9", - "11e6c9520ca52f1122a79585116c0c9bfb63f7e41e3c7785fe75d928cd804418", - "87f5e21cc06d81e9d282efafe68fd6a85418cfd2d7aa9797ef970e6f59f7c9f5", - "056476602256e5aaae9dd7c6b8a277ad570519a40b4d52a22d0eef87365d8b9c", - "780f710b6401f6b9302b6b23a057ab02d7a9fe0c92af4d35dc7ebac35698fbbf", - "f41badf8fd65c889e40a8425392a610caa3366f784a7828f552f95f7097a0f46", - "1b93f35b17b4b1f3435c0f10bee657ec1b8805846685a6609e9dd4a023fbb3b3", - "3bf99dce858d0f1ff72174c0b27dd867b1cb7963aaa50a2a1902484b249bb049", - "fe57b5b35893b29c668727ee1b0c8aa91406b4c3d6f3e6494b1a13cea6426b18", - "acf1ceeab6d67ff121f69c66b9542c403d4fb9b3f68882c951d7f09564e0009f", - "43a49e476c17f3172de2944f5230c1e6ca7a72f50fd350e1f4be75a8aa99c339", - "7904138abecafc55aaa6474a02468c9cb3cb7c03e13d367f5ec7a0be3c0662c2", - "8d88f4b206ce1b4f87e91b7012fdc524f36e1aeb576ca096194bf90c25569ea8", - "eeedbf8b53e74e3a53693c6cf0238a3456bd4ce2aabff83c9cde3ecb8413f210", - "a0120902c5e411d31d8ab807257b853184620bad759ecb5ed4bf3d59a9fc7da5", - "b329b797fc21831c0df577096aa1d3604e7fcca9b9a7ad99220d27116e316360", - "2e7766a18812b511a5dbef8e0d4c7c3fd8f4babb967a3e83a8f65e2ed0d221fc", - "04c81fb4e6441b885bbec346015b237d89eb64a8cfc6ed903c6605feafd6dd75", - "0bff3256298306d6a484b6ab2532b2d552f078322250029eca08e8128bd946dc", - "f2dab0497a31cb2b6140baa0d9526554d8714e146555296abdde1ed6b0ed2efd", - "fe4cbf29e0a5ec75dd9c70e85927714c0e0e1dcd7c091b91c9e94aaf35aa481d", - "94bcec76cefd99416ff8fea5fc9e5f54dfb157b9ed9f278b36d0a85dbcf730d6", - "44a67e4aa87ae194408d8642545c410a4728dc70f08271496fd9abc8ce1ad2eb", - "c81ed81413bac8848ec00723e073744cff28dd04829065ce7bc660b31b8a2f64", - "b5c12c39cb2747da43347d1e0d215d9ca89bdeeb8a8b028ad22faa2d0357765d", - "af1644aa432cf5b55060cf803c2d3500348b261a4a460b6c6c3dac41646c7da7", - "cb142ed9f063487e788b9518eabdf7d478158668acf052d459603a6ad658e02c", - "e6cc1d63b2817dd4d1892b0e9cbd4f2d330ae12afb6b90a2b0f0fac7a2729a34", - "4060c57f6b8c0af8b89a24fddd943e9e268ce42c5adbe1dc4078c665523b7389", - "06f377ca9403434c3380a6e18c0f9cdb0ca4129b41b7fa17a944a044589c03c5", - "dd2f0b19608c1c8920eca5dd3d7299a2eaa1a8474afc3271360f00ae311022c8", - "b6b39090c10e45387020bcf5859d2f6a54c109a778986bdb1871bd3a6c733a26", - "2a1ba968d8d302b1aba825cfd53c7366b0a008a1979da19ffb80cbab5a774bb0", - "228457b55f071aeee501de4ddacc0e2c353e30a7d5caf882f67aeb0e7952f962", - "97d05485dcef3fadf657516ad49256c38c4c103f8066f5a4eb9d8d3686d7dd77", - "515f131fd15a3c7d371cf74b2e8a6fec466d00a5afca132a3c78d340c9c3fe3f", - "3f7d49b7958b4100b138002e6136d460a1ad01e246eaf071b0df6d9fa47da555", - "7b89dbb8e331af1e816856f2ad0046906316eef2e67d1f49ff6c2d099e70ad40", - "58c28e06d681ab3d921b9a7372d705f4ab0d6ffffeb8f5fbebc71aa8ba4c0230", - "cc916b98fcbafbe853480560091dc814ac617228014821c33d23d36687425a5b", - "6607a2950d47b4da99721fc744cd3224653f0bb4b9c99e9b28423a7faa29dd9b", - "05312b32fb03707aa208c5ac9cecd0c892cf683c3cd11345bbde46f9b153f442", - "f1280826ef0443bfd92c04b2fda5686daab98924a4de205c4fdd3de2d27b717f", - "6470e54efbd80cd4adf03d1ac51715794669248c8d816d82b35bf47b1d4cce8b", - "b58d9609cc23a1c9db33e2cca46da691016113d147bb7a1f1be88eaff38b306b", - "ace528c4e44387623523ca5985eec0fcaca03a85776f18e91adb8f2e7e03c2e2", - "92d2784c8bd3019b02f7596277f4c444169d2ab923f1aecb428ed371ce7ef6ab", - "a8f898d7ed4d37579efec7f3b72766f3fe545fcd97122318f2ad03aed2e6525d", - "0280c640b69f3b45eb9c871155af66d42d8f4512d579467e59fe3196a29d30d5", - "74830a09ce5357a3ca6975a31996b5fabd4973d2320bd83db60f67a20941153d", - "26bd3d0d3b96c1d417fd80b3e92f45ce8900e28d80c1e88a53a07d74763ea15f", - "8e2fdd0a8ef1d0eed82833eb14763c014370222edf68fada38759382fe0ff278", - "2852261e49b88753b481c3cfd408269d2195e86327e15a818c9a908ce2f722ab", - "d6878acffbec3adaf6ccb168a6b4c8803d4389f402344ca4ca9f935034817083", - "ce19f6d1f91c7524f969c12a4b691ed55026349cf190d2ce6342d3a7895377f0", - "1def0d08db3fa8d872c5ab179d343a0be8d85bba9180f4c84d33ba993eca75ab", - "c4106cd3dae8595f7c2c6faba497f0cc1b726c4b9f1286f5a91a4287e46f9732", - "ebf480ea8cea88d384ae322d7c63774f6019e4269081533e6af2524e00bfa8e2", - "bbfc29ba64a59caf199f3b764e3ebf71b7ab8e5461282fb8f2b0121dfe2af213", - "5b6419b0e44da87525df355b9c7b83597fa856f537af02ae366eab811586872a", - "c2a9097735e6cd697328eed3e874329ee85dfd8cec7d397fdb0985eb344993ed", - "e2baa9cd86709f52fbb28b3193d9957480e2b7a9f44de3361d62f069e4c998d4", - "95a0489bdf3469bb16a28666bc67277e4d8ca6ed61df038b15f53573f9721157", - "11d9dcda1a55a2f926eba746d0108f7d7d8093c8f7137bce5d542ed47aa07f03", - "98274a3da6f333fc92f80a825a66a702a6a5b8587eff1498e5db1de042965a7b", - "c324eca88b8e4e56a26a8d6cb7d5bf411ec161ea99a1fac8c30b52f1fbd8be32", - "85ee86cceb91e53ef62ce79e0e231a55564f9a977660dfb4fe8a5919c77c1bf5", - "b2223696b92189616ce8a2b748a8915186d864bf882abc7ff34519025ab713b7", - "55292d64367f7d80dfb8f173e734fcd2fa49501554c2c43568c606e97614cb83", - "c98a8e57b2d12468d0290d3b0bdce98201bf97e7f14ce0f01b67c0301aab245b", - "14b62364f451f7254cc9409878b51de7fc667a01ec29e3c1f29f26d8f4442fd6", - "923368735ee15171e3d0e322dbbd98e8ddf7965053fea04c7e22fdc8dc2db4d5", - "5ca71710740de9003d395daae6163a1b32599ca18d34d8aca4806a831aa4c576", - "e3fca5fde7afea9ff92beadc0f5782088cf78fa74a9c78c5deeb7c382f5b1f5e", - "b53c73895879fa382dfff258a889d2bcf81ded2eae2b3ca5fa79ad2e14b51374", - "bc04e7e1981669c497222f9bac4afc1a9e15129053c5d67a10cb98c34b852630", - "49de94401ef6d87f99db95bef1ee3b0cf0e10e7419ebb9e9ac50c5b29416d9d6", - "5cdc144e455a687fb0ca6e23793b5c7b6128e78045ab4cdf97ac6a3f10db3a9a", - "20e545c99e2271cf694b4cb409b3ba0efc53facc9a677391360d329156b3a4bc", - "43345055685095386f9eeb3bd7f491044dbd866fb92052a70d001570e0565fc3", - "424ce9682658c21e94d9190109daa1eccd9b7debc5338c7df0d836fd6648a94f", - "1e9a82ffd78aa044926045ef4f91c75d1ac8d15e18b36b61ca36e8155ad897ec", - "0a5a4699da7d1bcba37d6f44bd8523a65f64810f94f6cbad26780fb78817b1d0", - "6079a2cf28eeeebf1c13adba30191ef34ed7b3049dcc16e26f4280d55358d45c", - "be84b4ced0e2321d1f9b17a8dd67d9f14b2a37776055e12d349202d49af5b4b5", - "4478ef0b6285942ceac28d49860c429f8816304ea2aa482625e6bb210b4096e2", - "5d372981109ee47cec3a31c35509a7389edc3ee6e5939c94d3c45aa53831bea0", - "1c45f5808c47c5b373ceb3ecd579317bf47c05e2654a91670f1dfe6c7ca14249", - "5496dae2a46df26df26bcabba5f5d5866e011557d7b4949832a7182a694e41cd", - "86f4ef15a6139dfe8853d0b9e8c80db184e9b6d6e0e1125b20cebe145da907c9", - "9f871ab1c5cf19e29451c6e9958548f618b1faa0cb1df1c0f9eb3704a914c04d", - "53a671df48a4ae502a077d6b7f1ae96defc8005f4354f39037bf9069a94cc91a", - "9b7809a7f8fa6b874a7848ed5e0aaea75344ab41199ae3b4f97175157e2216f9", - "6d8ccb4eeca503812be4e4b0c8bce68147edf63a8f45326311edb139885bbd60", - "9207afced536a82e3d57847ae93a5e465c56f68e580d2cac3d3afb2f98bc9cf6", - "93bbb129850711794c57893c9cdd7656e55643ffaa44adf3c4952cbc1c70c604", - "70d265dc79d9296de864c0f7a229c0eab196f0fb2e519ac0f4be71b3b4a25bdf", - "dfba2dfa4cf95524eb2fc6323f2143d9790dd4ddf9f90cf0b1c0572ad431a9ba", - "dceb426e11d06893ff26ac2dcbf94084db87048a8542bacecf8b1c444ae13579", - "ef67b0ecd96c25ba8f30d58c734a2aa7164a39d6f9d7397ca60bb417adcd8e30", - "125ca2cc05b6dbbaa268f624c9b6ee63dc91c464b8196798247174770052b876", - "d348906a573d5258528af97adae856f5a22edefd27f37584a1cea903d65ab0f4", - "5dc8d57639843994be9861497af82e9c9ac89cc415299786b6a62cc1ad07a5dd", - "0f9b283794acfc5e834c061fedf93d7eae83995b6d3b93df9a1e98d0546fb7bc", - "c87ba015a7f39d1044eb2abfdf9a9eb139e22b516867eddd56bdf027cb75e93a", - "a25056aa2eec1f51cb42ffd414a1b7bee5f4f5fae13dca351402081b4fa704bf", - "31674c8e92a28c6f35e030f104691f0ff2b471e7457df51fa7e43312681d57a9", - "f24a4485cae6c92d319ef47e880c916655526970f43c75587952ffa28581dd8f", - "0624aa9c8d50bd465a7b22bdb8605a94cd4c1c2b0b36816775fff4e4618b2475", - "e97e3c29fbd508200c6403a46b217a6b91c679f118f8ac12ccc827d9b63f8a46", - "2469ec2568298204f8379130b85cf720abd466bbffd2c8ebf4cb67584b85e97b", - "0cb9a7015361d06e24f2d3c454d956ce7330e287dcf32367b6d8fe134c082d8a", - "aab86392cf263b12589002a546fdf0f0889a5a453c5413fb6f76ceeaf076c7c0", - "504d2328efad40cdcf79b8f1e9810d1b3e4af1f4d14b0c7c1306f4c532ad2220", - "9772c0b17c230f9f910815e411777453aea24059121264ada0e314383f374301", - "b06568401abca62bb2cf8c1b0ce262c155eb93917283c12b1f04e5235baaa81b", - "d154a11b36abbf44643360e57f513db99e5626e23916471d2480299a6990dc13", - "9bbde27b72627b8367221e451fbc89c878d5fc94ae6bb33b2922b82da9f9b29b", - "015eff3dea0583b738ac310247960d91d5a73598268e22d8f4decc9f2c5bfd6b", - "8a8614c1052ce029cadc76492cf2e123ba886f797899bc32a4cec22b5982abcd", - "21eccd6a38a706bdccff8016bee8eac82209669b522b498ccaece4af15ad2e8d", - "12bb21b0095864b64d1f6d80a33dc9a7fcc79f510933755e8fd049f5a784d87b", - "4c768bf7d98be62d6110d5f83824826ebf6559a235fa59aaa9a61fd54da6017e", - "883d818da89c177df367642f8ec12e3f401286ed39cf78b618a95e9689cbd8d1", - "4cb1a88728a19d7ca8b6d03914d73583acd0ea916e8698f1a5db4fc4aa0ede93", - "7b7569f381254662afc65cdc1eb79f77917d0ea56d3b561895c6c3ff0b7efe36", - "7aa742b86d56b7a14da8a84bd3a06c68a0c419cf13a4c27170b6858513f4b0df", - "297a8634696b537ca545342dad3b3624bdc9319ce544ed6c077836e3b312b751", - "42f3affecf7dbb48775ee7fec6103b592c862bcc232086236588525e0b0f82b8", - "f65a572b86fd2c1ca956c47c8d1a08e0d9cb5eeb586ac5f88f1a5c3509526518", - "73a8862e72367f8dfacd077fb2c437e75415dd3b9596470ceb9b33ce3d845726", - "9dfd39f9b3561b0c7463e6c7d1ec9d75536b613a16ea9fc1ed60fd940a406fb1", - "5097d64fa2a0f7de2de34a6dc96882a8424077cd5081da739d336e0972af6030", - "0fbb9205b0f3176a6d8000763baedf0435125b691c6a3b6622723832ee109694", - "e800b08d4c8204a8d646fd736aa732173cd88ebdeb4a5779e7509791426ad4b5", - "7610a49ce3022f1c142a5fb108e5e7255ebf0ef13e297e113d3c146bbd62fac9", - "a5d6964df73ccb294f598bf185d2a421b081aba9669aff331648d0b355e56a93", - "8995b4893502e5dfc97a6982f5bec83f2bfb7792cf6003802420c2a57ad19295", - "1518156b1dd6d89f9964fdf0e4363357a167384902d7d9709e738474806e924a", - "6e2f57a95acaf4752d4fd02fedb00f83714c1421f61c525b956083ae73b3853a", - "173fe975a023bdbb5310d9e9086a11f26ae8d4c43ba6d45f92c5f15fe69e5361", - "c467d808032a8b9316ad05397633d29c91d8ab4e76ec7987b647b95c89221579", - "f4ac9581cfa1b23e57f2a192e4ba47749e845b3f7f692a6c478a38211018a7e4", - "439a8c4213da486c64140b2b1c7a9b0e3617a911bb07bec7042d42dda7b5bc03", - "d78219f3cc7db163be83854c905b98dea6001be74a97bac86823d8418bea656e", - "7d6ab2bad6bfb717f642e0aa8880e2b021584ed4ad074fac59efddcaf20ca2e3", - "862e6460287c03ddd8a105a09498f99f460e184ac1dda23748e87ed0fdd3854f", - "b9e4c50e4d5da24de8f025797de512d8f5b2fef05aecf92f096bc871c701bec9", - "1762ba71464e0ebb23286d799388d5fa53654386b36502f0f0f4d2555020f73f", - "fcfa3b772dd53ee0a8adbf5662b4a0a607334215236df34834d0bcbe3a7a9af9", - "26e24e66e715dcc31eb80f4c7f622241a9e4e0aab88700dc20b0d45e5d42a76c", - "fa44197976409f11c94c1c8f1740790f9e18d7d0e7cffc5c5b86ca631942351e", - "af76ed90053ff1cc43f476664740d2664286293c3a6ce4945e9481024c3bafe4", - "34954cd02405f521d6af63d5e5172472f0a704937863aa6b7ff8a9feaff7c6bc", - "df2e5c36053912bbc8f711e3bc32fe81b8b724016829a8859c9a930d23ad2f38", - "85a3816f07ed02516a46cbd5900d836a5942ea113e2901aa2ffac1260f3ff0c9", - "c737d9e241dba6efce68cc2d4d46cadc12f7d0abb31ad2dc0e12b8507a486bd0", - "290dfb3f589beed951835832441cdc4535f3d5c416d6a951a515b6948b5d52b1", - "bac36504fb53eec45323bad8c28e2f979f100dbe2b1e1c8d4a2a98e9772c1292", - "d2141388eacbf06bb76135fa9a15da5059763e03efa8df23aa5a36cb6848e351", - "416ecb987c269c1b0641f293f0a99aea0cf2ffeeb97b811cd9e21785bf66e47f", - "54caf9433fc25b455543ba0d724141a37f23f4779fb002227a6fab63f72a6bce", - "851df349bc68caee3e776b86a7be80e9e01fc103530f6a839911e1b070693d9f", - "a9e243e028da456e081299bcfb85f4ea4e4d1f85e2d90392150a20777edf1b1a", - "7f9385b13222b07f2a341e0f7f8f6527ffabbf0f0184400a7c6e16de343b2678", - "7a2aef76979b728ea3b484ee4540e50d1d22453d3474035ac86ad01e81a40c10", - "33f7b239135e3308233b4ef2826896fe85919f3245afe4e9e91f464ba978408f", - "834c8030f4edb7bae6f0366cf77c07405e8cc1d07c013786463d070975aebbfd", - "bed21e3818bf12dc36c3222f59cc273f9621d925767c1edc022954d9fb275f53", - "9e68893e1fbe8067b5117e32591f7806547948c4413a86accaaa6d96feafd7e6", - "6fc4b322b1d07534a18188d8a049304fb4ee22c2bcb9ee197fdefd12678e6c34", - "0e9df066894d8aca9990dcbe2bed605d98e26eba2738dd6a967ddfdf098b3c30", - "492164bfaf4dcac92af0bf7ccfea0c438df4b5d4e748e4bd0dff66b6e9539a1a", - "268dee67546b5714dd3eb53a40c910e67626215c8b00da6a391039afd2cddbde", - "52a79367eb933612a0e9d4c089bdf26f15e556f19fc27f79cc6ddda829f55415", - "45012051741cf13cb0b680dc7094bc7d3d922340bd3b6eaf050bd2b9e053c1cc", - "7e16ec2ee03ec665284ea7f1fd91aaeecfa1461f2aff453860d9833ec0f2d6ef", - "7319e34e7a3e147b67484615e2ec76673cdf34330da17f60b05f6bb00af8a2c9", - "84d2b25b2885c0752dfa507cb8db82e8835ec62288b5a826ba82df465062234c", - "d4f8c0869ce70f61cce8012cf2ba8fac8b025920f6c9a947fc38a4ec5cf8df1f", - "c2520232bbfce64b61ec46fb2a9f0e0baa652487d172ded6c9dca2b036e18c18", - "c8dedb8a431eb130f71fea95707bd83a7895fba4faa5b12cd26193dd0837d0f5", - "9e9471fa8e2edbe8cc8dc63fa8d3abff25a2a45e73e639d883d35c7cbf8af6c8", - "16fc5873b2d397c61eb69b2bfb7e880f9fd869fe9a4a712177425f911ea447f0", - "cce595a2e73e2b58f48f57d1c15bf4c40f2addae1742c3b04c2a4dde847882d3", - "411ec6130e205ff1aac4e8a4ebc02b4a59284e4bc4f9d45e403bcdd8294bbae4", - "5d4bc3fec2a1377dc169cf06f04c827189fa356c6340ce536acb6e73b9ebf034", - "747b1e154ce032ba68bfc7189a2d2cf54fa0c13b1d787b17abf8e2f3f284895d", - "712d45e9fde8adfa0a4c143614ff1cdb9ec5cf215216319018434ce59c7fd405", - "6aebcbd1e5dbad47e40922ae4f1e3c5cdfcc2287888d2577e88d950ff4d2e297", - "fe02e9e6c5468f6f1cebcff1ddb3ab7619505c6af7006dbd7acd5395baacad08", - "0dc5d033fb4e8db278d9d8bc58a7d42767443745864f1ca09a92a3c80484d908", - "39dd09287dce639f2b3ab559071705b9a28eaac896687445028f3d421ba19028", - "b181b85939d767068a1fe0e9a7c9387fedc975d772ac99790bbcb2136b8f7b90", - "c78e387fe8ad8430fa5c6ee1efcf0ed75c35aaf38819b90a34bad86998888b9a", - "22d9c1f9ae889b7c02a0cfc6e1952df5da9f6d2ede00bf8a6a813b4c7dfc26cf", - "5a0110bc06e418408f31ec0cb0d230f95f46391e246ddd765fc52a2a20b36afd", - "84931f33880acb2138054df675ef29a1841033d334b00c851ed300c88e56f8b6", - "c8cf2dbaa8b08a9e0931fd836a3e5a2b5dc6e183b7e98f037ea2f59b54af4958", - "ce6a221c8bc7b0ac0744dc31eaaae3d06218e8f09d31ed475126addbdd789176", - "757c9504c9f2dd522d7e5b90ac6d4ea160b85e60a643b1f3cec918c556f276c9", - "04147a2292f73d0f6854afb7d8770e344cdce593dee919b38f9817bc27338981", - "c325995d6c994874a6124f87a4da4b036feb8fcafde3511e3106f940f33b9ae3", - "ee77a4a19bf444c8eccf82b12938906a7acdf6cde9eabd7cbfab496e41625944", - "4601e9e4bc5c7619062329372f518936fa67da1945764eff46775b188175dd75", - "150aff38e537172862dada8e29e7c02a891ea2397ec6bc6771fd2673f41e4537", - "367a66b6c7358931e17d3c867bb99151ad80de370835e1152c69e405a17f15e5", - "3271beff426b03cfa32063dcb754bda182536def38bf1b78f57c76b3f9e03a36", - "f3322c1aae1eac1fe445afb84695018be280c5293576aca8d17be0707ae67a4b", - "444084108612099e27891e7f1715d35ec0e6fdcd2faa0d2e5f8fab0ecc774723", - "6f7718611ff0975655a05fe72e3ce213933eccc0bb6ba72e6fb4a3eb404d72e2", - "48991431aaa74039465f1d89abc13176101072cd97bce221e3cda5dc67dcc4ca", - "9a92ea314467cddadfaf57da2d6b5e8c476cfe0aecf4dda645ae29ab07b37769", - "d5fb227e8415b3d7d4c786eada7c422c4987f7c93c6e558d00d6d3414f89a9fc", - "c89a42a896be8fb42daac98f3f6f4ad6efe49af4fc9e0770a648b323c19bbeba", - "021f8322f3b776ac9dbbbddcec8bb5d4af367756a7ba930a760993546a0acd5d", - "71b57b46ae56790ad0961df3ad7ddcbe4abff21258b4ae8a4fd28980a8253deb", - "5ac537abc2f004b5da5dbec63d3ed73bb37d9818d42993e6346e1cb900525cdd", - "96cf98678555878386cb284db08caae55d58027c5d780a75b4e88b61a74d86eb", - "c0182b9031da6a6820f74a0059fdc67e508833a261427e724f3a4d5ea3ec0f0f", - "00ed7d0d96f7530957dce1922e8d81f4fcfe90d60834c4b991a8a1f22995ba30", - "a618a58482abd1158b4d89a7cda648aeae91e9a103b0f035d1751b708a997a84", - "a91465641af6eafefc297bf815015030e266cfa386c552648b278f85daa63683", - "65f281c431f1f93771114122d0ba09f07ee7306616756253d5dd125c4e4738a9", - "f6cd0bb20ac0cda99648d8e9471ba17b35331e8d113884ce5a96b538be8b5048", - "16a67e7b6e337841c1f933b3bac525ee79b66e7b2910f6adcf9ba28cb64814c2", - "7a730dc4fdeb4021b42ac29adc3f91db3fd700aaeafcc1e05d3477f195b529cf", - "b70ef96fcee425add999d9e533e88a2dc832219a094d5708b31df88b6a00d456", - "b34c44f0a2e03c7bdf0124d303a90ac0f5a72e31d63646f166f9d0c20a1c0dcb", - "db9bcb065c10c7589dadfd79d72a77d525f300ef616b2833843472682b529d65", - "8b4b4502fffb4971625aa27826fbf8ae9b6948d9a40b95346493fe1f4c88566c", - "a73b987bb4d922630311f5ecc9283377032dd60fb61175db20795702cccf7919", - "ada8b9ac7ad59ad80a3810f8ef45ff3b8844796d78611cc22d8bb9bfbab0b198", - "e855941f69aa0be0424782b4e3dd5741d65019ce095305a6f825cfb9edf1ccc3", - "df2108329d6e452ce946c44434ee5cdf06871885d91ed09af451c8c5e4c4b9a2", - "fa70ebf5bbc403393905c38547ef8a0890db2d0b0b34dbddb8e37497215fb9fe", - "cac30fd40210be7b41ac905a10f790a3ef7f215f2066909c2541c76a4b342d7d", - "9dc73f5c8ff3b6c648990ade9f18bacd11477a60d5d30278dec6b96d86f5b572", - "15c160d1199bc446a87f7fdf5609a78117d16cfb2d3d78b513157c0624f45a8a", - "43538873f09709af8131e49ca076ae1ff640666b8b98baff61778b21574cdbc9", - "e7e0115b1d4abe340ab8603787e7f797c8e65c43447adc927619236cfdcfce52", - "2db2b0b427fe573aa754bad519ce7c60f0c275d55155e884d351e9559cec40a4", - "522107aec654715eb0815880f8decba57fcae32dda9726eb80bada9efe7bd81c", - "b449c2cfecf885f2c9777b0d59179c6ffdfcec79ed9502422f4420d05b341eb0", - "363b1f964e340af4b15565f57aa0d3b51e58d3a8796fbe4004d9a1dcc37f15ec", - "3786a12ac06a7b6a1d5448ac53cfe8f5aa283a5f179100c56870b70532956231", - "c42cde2abdf30bfd77ca29a6bd3d99f0fd6546f68b81336dc039b8f133b9e6fc", - "176f2ca20811092e095090f5c2c9ddd26d57a7fee0b6b1e322ef251d2b45bc9b", - "43ea1ff22872fa53776b358faa4947767236e6b7f8b6f644a724c04491363079", - "962ddaa9da3118291ff13d92b722529cc3354be4e5496f7fe5114023bccc719c", - "4700d07634f92e0a54fdb409cfff46d177dc3f88448c6c5845fb33cb711086f9", - "6f993874144eafb8dd15d0611106d744e89f7c627345311f95d0703edcc1a8d8", - "d6a710cbb568c6df54762659f707cd49dde1875daa694d1b41efbc52f3c4f8cd", - "9d98987a11670fa0a2c75adf4f250c9bc86feb1d37ae196fe513428b1859b0b7", - "c159ada325484ab259c7d15d08745e215081b139956ac325522f56bdac60ba4c", - "96ab8b1d113f90269e73a94f11b1db864c45769fe8d3b260e98def1eb2e14b67", - "9a9de6ee3ce73490be60525bea335599ae3bec2ec3cf00dce08473fb66faca95", - "315257e8fc9e95ef918be435fd2b883cd899774bab1bcd4430fb274f4fc9a978", - "f7f02dc4cc1a6f521366c55e09923bb9e1be26731a94717b3b568ec42f37a494", - "d7943133077d26cf8d27e712b47370be01ec7423c78c820013ecc2781e16bc76", - "e8711c8350e8663306705a2e83949c33520bd3bd2fd11a08f115f6444831bc0b", - "113fef7da33ace2dff57d2fec68d1fa385a9ccf03f12148bf7df4a43403e72e1", - "89dd1b005e163a7300ac1ed99b3502e92c4d6780adcce4f6ff976817484f7701", - "774909e711aa061794a3158e32b568667e15b484f14cfef9f08bacb4b0ae3ec4", - "5f71dc654e8dd823480e30a97a8edc6ae22623cbcd4a9cf5347ea7c4b97cea0f", - "561232f94739206aa1267e53877081add0bf7d5c7712033855ce849e0c2bfe4f", - "21038fc5880997ab9e4b98a3f5a18e93c80b360695e931329eac52f19856c2ba", - "356d5e96d766812b41a93e43d1206d894840f71f07198869f9ea117fb0c34006", - "4b9526560975ab0e6229c4fef3a31db732d67264de613d1283bbd241b62ac158", - "b077969b40c2e3e57666c178aff7763eb6013d23b7ba022717f36ed9edf864bd", - "4a5891580a07e9c340a3fd62b1de0f9f0f1f226d3a61dca423ae59f388a7237b", - "c74ebe1086535c3d523c834a2cf6aca79443c6c4a4bf7a5a6294ac7f9c4b3b4f", - "4adfaa690a364b94cad6071317758c51883e86be0ef5ed5bab2c07058d32d952", - "6c88bd4588f15fdaaba29d97c5ca0cf673022b93948ff20a7d2c72308922d43e", - "85805825ddbe3b77ac3ef4766c828f6db8b08a384b6d0ffc8237f4c58d25fe10", - "c2a779f3db1858314a360f7742bf1ffa7b7d7e830d1016d802cd1544bd343bbb", - "45085183962362f9d6225d2663222c3965eb836e9938dfb92d9c9535af1aeffb", - "3272734e4fb33e8726548c8cacbed66e1b7737ba4ee207ea181bb3f573b5a289", - "211cbabaeb10906f54b1c796bcf8471463fdadcf2cc94bcdd82a9c98718a3e68", - "f5b0d6dc2306e0a0a1f80b7515388b2540348ca8c58591c47ebbe185c8cfb9ca", - "a43a046633a43b718630529d52ef2b2f78bce0929c82bb02661f8b76198ed7fe", - "4a4aaa01a0725b80c0123c24cb34c8514cf3d7468bf8ded09567edd6b560c837", - "9bc974d526f10c9efdeae4f7821358fa0f3c0686a636507d28b22bad3a9a05f1", - "6adaafe84a8c4504c32874a7ccd03e224a5e5c9ff36982f9ba00846592257294", - "52542cc1664076331862bd2f710533972accec00c67317374dbbbd6517448565", - "062ea12c9acf2389500af8bf699b4c68fb3044c302fadb8fef976d67ee6363f8", - "b86445f2f487ca4c7e2a6830b241ecfecb9ebac199d6bf93c35e7c447cd9d6d4", - "af6b691bfe67b1a234228f2d73c26a67cef92d80cea5dab5fd1b498747281d5e", - "4d7c613fd1f2c5e06c1dd6e6ef1a04a267ff8d3ea71b9363f00903cbf350907b", - "f916832e4d578cb70571d4185bc6554f321682c2bb5fcebdd385cfe17c2ce490", - "105f8dd786db344bf2824a80c00e2f9c8e0f030d06927b928014fd8f5be1b9a4", - "437224432d6e89f6baf60a9c40c3133fdfa8ae36242f3934f8bed089a89cb6b6", - "6c60ed687cefda5df6103ff1c204e9bc39402f4c85a1b2d372a8f3753fcad057", - "efabe9b59ca38071a39b2f78177875c8e9119269353201a9c1ce68dba2e4b7db", - "abbb5712075b8cae99eae24ac00a4818f0969f346e442273836ddd47fad5f7cb", - "942215eb0ab8aa156e9d132688653ac84ddff9a4bb5517ff435a7e3056f4eaa7", - "19606cf871526c2d6a99e21239b9d91def3b0d8f77f4a83b7689b43154889a53", - "821fd1162c39af712c0f040e490c9c01644eebb105b699647bfc56c105fa87f5", - "98300af0f4d76d987f9b65a9f074468170a58823e019cca5f3a298d5db14b0b6", - "b4a6f3abb09be24d9847496a5ca5884651d8ba272d0c6108edf899885deb5cf0", - "c16aae4d2669e23522bbf16e6052eca6cba510495c819f47d3d21679ca3d6744", - "ef4ea174e489a53a9f036fd3c1df138435430481d2b5b01777cb438b010f565c", - "6de0910857b7814d66bc09f3a08bd6608faf6d27426f8e7cc0fb82ae1c70e8d3", - "a53ca98837681a56638b044165dec15800fb27b4dd15e11085fa2ef4045499db", - "989db3c1c339d3f06fb867aa9739900ea459503140a3bc0d538f8456377b56d1", - "c20f43409a5c3cef089474cfcff4c3360eb48bfd8d44467bd09f63556d2d82b6", - "5edc47a13a16f6f0a00a8bde0a920ceeff05aea76d675dc31be61e193dc9ad5b", - "3e08672e1247155697a849e83645694f46ae9b390f1740fd899485f552e2d5a3", - "f8ebdcdb0656560314ce63e49f37abea8d16b472d93856b9b5b575ceae741192", - "4fb29e23ffb70df7eb2070f2d9498fdb708f726948647f902f1628c1a11cb818", - "126f8ff773db4c5ae75503d1153a87a726d40854da07d1470c39783660c029eb", - "398a0aedfd98a0402624a465419184c19b9cf1383357a49180300d0c849abd2b", - "493f545d3c2251dffe40f7427a39ed8bcd64779f866cf5b38deb591d09bd3723", - "23c17770eaf1958251114a1b09d30ef21eb666a438834485b009d2b4989e191e", - "e007d0c30a71d14b75f9daa300d780d74a60ec2e52c3f95a9ec72c99773d1d54", - "cd57c8b8e85f00ddd33f19f8e4a0fb6b19b9d792d46fad3b5f39a70651ba8042", - "565cfd2f4a08e12ad04cd22fab43c6bd11b82f2af53a49fd45c5bdbf95d462c1", - "fab3009d054c3a4a2fc9c1d8921329a3bfcc8c3aad2d2a1e33d5396f27bfdf5f", - "4b3037e2b01a00bb49471dbfd608ec72840cb91d547db62171e5b41f0a43a8aa", - "3bd969fdee1a7103afab0fb971dfbe0aa59add7175835fb098627a40c588b083", - "f5e8704c199680d38cd789cb25cb3b0465e877e18370e46ef64804d58cdfd792", - "f3bc8962792a3e23ef1205c381ff012b29aefc698b53d007ac67df4bb2eefecd", - "128c42e8cb38e0c1b3a6f1914588c0e1f72f1acb81106cfe3da356886da24f51", - "19359bd63658da2a2c629a885b6e72ee209aa5865cc8e048d06610b95fb25459", - "d7136543ff47ea001a3c548bd34cdb9a5a4d35da7b22f4d4511946b2d675691b", - "53082cdae68c524b6ae35ca860eee4cbcfe2060a557ad5b7ccb6fc1d826aeec3", - "96c9204ce584bdbf8f74983014d6d9bd35b30bfda87a4c22d2478a6da87e3edd", - "4bb14e6e369a5983c195b7dd286d708b75d505f268849979767a4d5d0633f7c1", - "34d7df484efb2d0b2bfd7c2f3541df003bd66c100392d4e2c84f6163a551087d", - "59e09a744397c011a281ad6c6d87eaa85e527b421ac56255efb12216b6496011", - "737799356dc4bac5023c9a783ae7ee9ca9f9a2b033a684b02dac14a198473808", - "02e5b5ee06dba785bd459bc486fcf858b978322a7db73ea3cee9a7fd3bab356a", - "7a14d2587a4f69510b373fb6611b81a7e1b05417b21b55fce089819ecf89ace8", - "84c8233819568fcdbf543b6116fa5558aa0d748d4bfb8d28739dfa366a28790f", - "ed9a502534b9f6bb24a3162569a9fb1735d72d97175e076c10f66fe0f2f1e9a9", - "596758d27d0aaf291dfccb66c5b37e3761c141b2aefc768b8f01cda90132da18", - "8f95b88ad16bab6c2365e289ac21870ddddd6b61a52a526383a1821580c27139", - "6d6adb8dc04f3f7d64a6193e57f7ebe7c9fe8757e4c18363fe03a29a9d4ab434", - "75c182c558f896688c5f56c52dcd5c0ddca7f0a28f5e323586612f2b3dd3e2ee", - "dcd4dfe9b38c65aaccbe66576ecbb5ccb5a1c8dc701e684676882ddae2939ec0", - "ca7ce851934a0593e6b75ff629930d8386273e0f9a3b68ecac67f207ca8d7a4b", - "09ee20a0e12c71d0b00b57ca28c3c64aae9ce70068366aa64f76858edd09dde7", - "66cb38e93f8922c45cce9cb2b86d1e84b1e410c1e392efad365f51d14e51df05", - "3a0dd900830ccd20a416304d4db16d1f2f57787e559bc1189afb86cc014db220", - "c1c83e11fecc0f9ef84f96b8cfbe8f0fddd3652cc661a9b6efe321df702c20ad", - "4cfa0380e73aa39f60ba6a36cbb3a27e61dbc209ab1b511eff0c1592c32524bb", - "46781e5a02c7427370548a42bd1e4bb72c8158240ad1a1d987315710ede9bd97", - "3dfba62c4b0341caa842ab78b8cf79cfcccf7a46f24f4b082a40392c4389bd6c", - "dd71c24fa4041cd978ebd6c4dc241bcfe7aa3aaffe8a535511df2a202ddd7eca", - "0c9b361690eb10742c72abe2fa5aeb9f798d8864b1e67f662f11155c30f3a7e0", - "69165e09cc4319a1797eaac20f516bb533882b5012d50533a19431eb7e3adbe0", - "e57178db5fb0e879177a77524ec37649a95a1d2f039fc8c275dc2c254a877af9", - "3634cf24962887f0b894a8cb6ae633463ed30d02d87ef9d99b9d41287055336d", - "6f5460e7f0e962a3db220fa809efab0f5285cab945603bfef3e8e0733c16fc4e", - "9b2c5a91a116a6e344a3fbc0c87e622566649933e0309d06d7fed496e9ea63d1", - "4b1b76c4035a4cccdcc8fe00d80dcc47fb5170366338a82f048f3d5ae068badb", - "0f2d27cc5b8b4dd681203bb02b5568b6ad9aef9f4f156ebe1147ad9fe760ab60", - "a78bb23d583e1ea2d36778dab4d197579536cd65812565bf67d6c558dbd16811", - "bf83213aa5457524a59915916dcedfc98ba765d1ce56828e35d6f0dfd3aaacfe", - "1ee72e771e62cde09641ee815165c79a1335625cacec11a4995548fe015e74c6", - "7bd0a049d58e1a5c121f1a2c1e19011743a8149f94ee1a95260d190c8a530985", - "a82bc396b664f3aacb94eccf3b08a44421d55559a5798cb03986271a96b5c15f", - "5863ad384248801ed41fb671d9ef51806e0b2ddf061beb11539563aed47e8317", - "ac012210607f3be0a2d5d58a392508655b2198dab91a47c462ff4bb4e32e15a9", - "e4ea324c310ce4db9e0440a7a6b70a75498695101b07d66f840283abaffaa7f9", - "5e193c24a50c06f924d8702376128c1ee689c9b9b55c4af6dac7037da330789f", - "1ed3c7c59464e9367667e9d90a2539f474bfc6c2bb52d38ef1c811452cbc904a", - "7dec20ee6c60800f9f36597a112cf41b58ce5eca22c0101813ced3125d10dfd9", - "71bbad379019fc98b05e2e33feb54bb06fdd20e3f9efe7c559b46c881fc16211", - "040d70fa5aa4d54208d11f99f90d27bd82176181935cf40adb03571dcc90a111", - "1b13558f21d9a4e4d27e74d07b538db7bf3920d4a1bd77b174e0b1428ad02f6e", - "7a77ca35371f4c2e5d0c44960b26427f1caf1e917c70e9489ab63811123b2a0c", - "f8c7973ad1dec59bf0b357919745296180d31b33d76f5ca2bbffa0a64f00fe31", - "58f085ea3ab309ab52a143d62ff6f82067201f5f6dd2784a258d7d88ee346ec2", - "197a8bd6403ceff8d600b240942c1dd2b632a7ec76bd51b3d6d2c6f6e6ddefe9", - "81300f9821a524cf16e98b201df7c03f066784cfae0abdaa11e9020b1e87f83e", - "cd67e3c2b79028b7872565abd2595d54bbc843bbf0cd3716b1c0413a84433ac3", - "6d136afa82eefc6439d59cf75753037196811f71e52406eba755260d2bd70f66", - "86183cee46b2b29abdd365e9790e9633ae2e1dba802b5a73323bd514c2d8b468", - "ece194ff3e307b46101e6452c5284a763b3a04066c08ae2a74b16e367d160049", - "4122c34a439c0c877ec40aa294230e30709412de25f484c23d04f65e853a2958", - "8ddb36818cc960dfca562a978350840cc831d2f2c3104289304b2dbe3e68e6b8", - "9767a4afce520a103c0d39b386bc6fbe2ca5877cc7b55124c3f370f235fb6baf", - "60dcd04b933ef96af6ec3bdc96b0986d9ba397b5540f6a1966af9e1b3e620f99", - "8d0859e4cb704288bc095b1583f7fb66b8d4e6b2e9057a54ac6849e538023dad", - "e332bb59c37a156db4a2acfda57723996eb4f73e287c2371f4ee54558c78d5b5", - "d79eb935ad32366bdb950d649500f209ed9def25aab0071bd732fdac7e29811b", - "6a1cb00f90f125905ccced9dbf62c9539fa4e803094ca6d2e20ffaebc82a9206", - "e685b19de8bcc8ae3b32e72453672c553712d73c2e38f6927d5a4fcb93d0a02b", - "5dad9bed92d6e58cea3670f8ec5e1adf72eb3c499f22f0f8c53abe2976ed9564", - "13f230e67e4ddf16d1bc79ae916ac05cffc043781a0a4d8dd6dda037dee143c4", - "6841d64ab743b7abdaee5913a87375e8d56a049aec8c321f54025d41a54b60ee", - "aa0af441dec6859b7dcb94079cc1b5c469ac3f266b8381b1c191b9615d5baea4", - "08a536223d034d6e86b358e7460b2c3dfd603f41f34446e2dcb91e302070e397", - "ca6903e2e4233a96e7deef25aec3c41edfedcf4438ce29a32992ca13651098db", - "103afdb754ed9aca212f21a9e68ade6607c8c6d5113e59705833664f5d2714ce", - "c56098b7eb5788eb7d8f63e8340dac47b4197632de05f66e31a49f8bd640f5b6", - "58cbdb556a1b441dbb02309d364e1153de6fe1284261d71e6c4a41c71942f6fb", - "629a41cbdd4f5610c48e3d95fdcd4beebf66390d068ff211452a0d2d29b318a6", - "2159cc305994075bc4353ca6fb9d6febfaddea1a18059a08fddd9a2a8b3419fe", - "8a67eaecfe56cee43e0232e45cd804c73a8f93654a9be1cb949a0bf02ea3fbe2", - "592e1f5ab832a6514884bf9cce1d4ac59f1750cbe9477903e4e5f367a2b6cb37", - "8f41ee8233284dd064990555910207ac1620d88247a5ea782f13f4d9a2e332a1", - "c305f0ed57642eddf49b0d6021d05438952a249f0809925880f9b1d58becffb3", - "cab83542ab82e0500581cb1e888ebdcd570f2c34c6671ec4938ecf3e1bf7c1ca", - "afff258a8492112aacb7d6f644af84e0cc5f927dc1aad607fd211d505e1c531b", - "c9d1f3271d4285164d160a59bf35fd4aa2d7d8da862527cf5d94791a44cf1235", - "efbc2e22b9eb658bdbd22f32cb999278a4faea0db48d9f85d06ce8aee39f959e", - "952619d822021d3adcf37d4fc882810ba095667689efc1e96ca3d6aff8cf8e61", - "42508ab6340f275902039f8ce9a8f8a757aa125fc6cd86de47055e85ba61ce23", - "ff034207dab852cf58011be9cf29be30fe228f9a4ac8a16bc316e02b834df4ab", - "b0b67ef5bea25d10d1843e46e224f494756c60222da90230232f888a70028c5e", - "bce53e98c6000973f77bac007b4994e05001d86455d639249b5d45e9cca431c1", - "ade2cfca2072dd729dc1fcfb6ea3174b43eda865b984df4bea11a103fa7d5746", - "be550d8bc7e56719c1a47b636831b35dbeaedb0caeb9ebcdda3b715803132634", - "bb51dcd6375067da7fd4a581c1baf80f2e36958ba188533c68dc11063453e237", - "a3103b322f779e260db12725c27a672bd54907ce6ae59d2ac7e578d67738475e", - "5d7928d33cecb33f136b00eec90160a01bab3b3e5a27c9976d6b41f41d92b8ae", - "25faeeb1d90fb7aacd35cb12437c003bca0d0034c933e7e42a3754832ac5f1b5", - "7750bfb74464ac043dd868dd110feb713b789484d02acdffa0edbc989b4451e7", - "f242f0814229513d4b50151950fc53c97499b1cb4ce52a5dde5b2846814d604c", - "c5a9836b253fb10feb952b3361faab2901d425e0e2a7fb8168fa4a8e92e535b3", - "595a338ab8859dc033f7c1bbe35114d84dc2646037b34a1a7c25d1e49d8fd6bf", - "9cf9843dc6d8d62bc6dea1d5dc246bca3c9acb8c08b6aaa427a4d879acd9ce8b", - "1031e4fc7655095bbd9dd52b80e58ed0f95c884d8353dda91d74944925f3aaee", - "8b1cf437391181c1e0625d6b48d262a3b0e631e882d038f4b025c751030bb599", - "3233292da8d796854355dccd4c49b7d1ad62357934c2cd81e46c77c64c73a859", - "5b800939f6aa24af6a69524162160c498e9ebdac3a65dc3e3438c06b0436d64b", - "75c07d6e9b50219cc85abc69df9deed0ad9adc5a826507d1bb380aa9f923ff9a", - "e2ec49e684b78bb42a8525363fbcc51be16c0df3326c0c50b83978c9e64bbaf6", - "4c113714f31551b87dd0516541c2f24ac551b72c88ee60d1531d85ac7272ac54", - "025e2ad88424306d7d2ee35bf5dc91b4e62c1da0a06e299e616e4daefe6b4daf", - "9978373db904316d9990b08074006d7053e10bcdfbdd81f68b5c43d297180197", - "5c3e684d1ca5be3acca6984a3352f0dcb4c0257acb5c7d9a5ff5e76a5de41bf8", - "d61d135d5a8eec7dfb657930f3d5a6c4a62d66ed3dd0ae6534ccdbcc4a12c870", - "696f771e9f6edb0ee26a1a10305800dd9faf6d8db62933a64a5696e6ece04812", - "2d1c5466414894a5c19fc60ba31a4005a1110c0a5bb03a624d4e282ee3a4dd13", - "55698012005684251344bb974f0488edfa5526df2c7664ce7abe46b3ddbf8474", - "70ea0cfae32e766a81c51ccf3b2fb3708a29594f5b51992aa226f9afd6e81e4e", - "26e725126da78da6cbfc343907b29ecb70f33dbdbc103ef11ac4446a3661e312", - "3e3a6f87f43affd2e8968c563cad590605e385c92bc831aee062d91f9116ae01", - "516a3213137f4a911cc77675148212e7ce9ecbe73168e80dcbc8be6b73477645", - "8d6ddee817998a9dce8765dbcfb5de7b7b5ea3b7d4b4470f12f098b9702582d8", - "8e568db2a1e1edb3fb39118551130081e9c52b0afcd53675ab39345174f60876", - "ce132c244282d150a21e844d5f05c62fb39962a70e750b76ea7f4731db35109b", - "2c0ea3ada2538ba73411fa1429f397958cd802b4462b6948b3b1e038227eb153", - "5424aaa294d279399d3d9006400d63340918e4affb8ef6546614df4f2471e008", - "c50e5e7373e252914b7fafaf6a1a4402b97746b3aca7fc76c025ea0ca64496bc", - "22225be07bc63fe0f45dbdc8ab4bcd549947b1002ba08c991159f1beec539267", - "cabc448efef3cf792853fdb85ddf6e8680c380b221eeda45be0b0560b1dd859a", - "34d4042fd7dadfbbbb209b19a71faf5e3de06ba3f90f30f1f0b72272fafa89c1", - "fff199dfdb7e384fd6ea2677b792a3153a52def5acfe4e15aefee6c0435f9b5a", - "c144f98fd7c0835c7197c6fca227dec699168edc22611707cc20fef878c03a79", - "208987015f5b352c96b98b6237989e6cccf4452431b6adaa39f1b1892299e472", - "f271069a8e1b52e352bd8e490568df6a2f727a939026985c65c61a6451ac32b6", - "fa43917c17f15d95aecbf7cf6718a251812f7c4d791a6747c0924bbb2034145e", - "4f11c5056de800d8a4ddbcfd4df105a0ac5b59aa0c37c7ef5503a8b83bf03577", - "a6abb545d43fbe059d57760dd4dfc4f250e74d5f830289a4ca5652c30da71876", - "a3a9f17e623b33e71314626669b48cca14844dd0e40c78b097efc46999d71a25", - "bde4cbd1142e372a889ff48e7cee2ad5a4e733c9fb93ef75234935ceb2021277", - "de3a5e7c223fc4f8f77de1b17daf47948a0e1aa942c62c774237176f8e2de3e7", - "19d1bff216e9ca2fb4f1cbaee05a54b7689020bbb84a47622c205299e2a291b3", - "6c83b244db51a195493750a75df6e4c685c0f05469214f92f66292f9d8b3c730", - "802b0dcae8df4d3896e48db117c53cdf5be8a0ad03a8a09402b81f30580bc496", - "475b6b83ab5dd7942a15d20adf5f5a33096a1d670ff6781ed61eea010d445e89", - "8c5a540bc6451a180650c5ae7360480278884cc308e281ac5078e73008b82b74", - "007dfbca7f4b3533f25bf06c2637b815fc0eb2585e122d7ded1ddbfcfed39e1d", - "725b347a37206dd32255ec8963503bb4257d7ef7ef84fa275f1645a00607bd69", - "463cb756c065abd552bad88a5c3ba612782d47ea76bb0296dbc5bd16a3ae1796", - "9783adb5d0176fd25ab7a48f4e23cd0a1e471f21c3d6cefe6887a2f586bcaa30", - "4c78fa498a1152956aa3e03aac102c4da56c203f64405bc7b526c17766e66abf", - "73da43d2f3a56b7bbd42f0332f071200c0cd308ab791e8e3411384d6f67b018e", - "705d0ed8924375865ecc215298db256b734edeb5af0c22258c5122e2d79f7572", - "29544861d3dcdf48c753ba0b2d12db983af52fea9de6023481afcf251e6862e4", - "e7c833664bbe569800bdfa4ca46d0b7639f96c6dc66ab94fbdb48f907b877e05", - "e31781be7f70e3ffc0c4672bc7fa61f461b5a86b5f25a1d6465b0682853d3524", - "b007ed2fdb330b7d4a39e936b19f1858873c7525d6a1bfb87de8427250c17328", - "3009406af671f7fcd7cb3d41dbeb58d87a5d9487b23c43fdc42759acfd33fb28", - "2c9cab32dc80286fb824bf5df049f916119eb9b252751b95fb20dcd5f47db5d6", - "49d58768fb3456da2a8881c6eb1fe9691b4408bde8f05676d084ecc706c0f737", - "7b69e859ac78d92f631cc935b17623d9900718dc51e8938f129335c979ec64ff", - "6d1d4e5e30a71398ad9ff5eff9416a1e9c38f91170f1969605f50aaca83d1f8d", - "d19a4037a710833f17e5596a507d38932981a526f044fa60d743ecc469a51b4c", - "cb1b9b260e49fab41a2a6d862db78f3dfdfa62a00da69e17e89601429ad3c523", - "deb8ea5bce466583c73a569f7cd1d84a02629193678d3b59c535cbfc18539c88", - "8611af280ce2f3a00a6459e22cf772665133e08a03a017d4a6aa3791fc9ae696", - "ddb4a6ed7da0d8d8bf24b231380cd343e31589c9b121e2c9869c474a7e8aa600", - "029674b6e2cf987f8cd78bb93d21f89682824629c0793206017893a67c24e221", - "2b94d06ffa77ae3b00a509252d71d1140cf2f81314257931484038f01890346b", - "b2f764bdaed27f06d193122efbbec21056265769d26ef2c94b5103747ad68175", - "b1c59cab378d42ea59e649e3d65c87d0778f6a548a60dfd5fb0b04076ed7d5ae", - "4c2216234e26bd309e522ddb4957f0d345525c5e19749df217b68bd079c998e0", - "cf22180f3236edf2b5630c487a4fe6dc4250cd229b0281248d77d4fd9b8b3dfc", - "41a07768258102b356f9780607cf2fcacab8f4e24e6775fa62a428873aace3d5", - "1269d633b6cbadc386ab25712eaa837f330bb14d8a626a14cca3ac228000ca67", - "93af187e04c708a89b77e0ef8b8bbdab18c3d6f6ed113f014d665117ea14cb14", - "8036f48517741141961585c3a8fffb841ebe39c2316cb1ee2e69c6e44f2c1eb6", - "46810491ccd6b9292305011e7e41ce50c4beb2364c75e092b1a31c81b690b246", - "707a389f2936f5ab90f1b36db58692d18bc1e4412b34108c09dcdf59f0bb9c58", - "1328ec9bb060c07492c8a269f2e8aa63b52add09642e4bb729f0a95efbc7d79c", - "f485058fd80994cca0ea363c8d22520c612ff1caf4e110d8a53094263e37e691", - "0e520fcfbb158ca302dae04dd7b2e786ccf65c7daa3c75d569397a084b8978fb", - "5a7e8436558a6354944fed0338a56f1c840f5c0981fde878a78b2f6456fec1be", - "91893f1f424b95521eeea245309d2ee3a2a3c7304170b1317c3f4b55dad0c7b5", - "0365f8674a1c67b8982839639f2b3132e46b1e7efb81f789dbe2b12c72114a16", - "4765eec663b1c1d258c7a525c3d07cf6ba5186e2c04eb5fd0f10ec7e8edc67fc", - "4b64481317da7c17571116906d87f3afdd35c92719ef380921348d7065bc31ac", - "e89710af483cc82e3d04fc804c785485c2839ba06efceeb108ec28d2d9ac9d87", - "32642e793b324dffc06d9b5f6254ea6f2671297a6cc2797594ce3426c21a732b", - "f3f861496fe3bf16bedcb51cbd23d4cc8cdeff2d0a58051fbce46bb7dd84b8ee", - "5bdd9782f214e29b9e0c236b12ae56ee354686547e5989b29b76b38e0729ea7e", - "d4831558b80b9e1aabab2c27adde25857e6003440af98a9218e89c5ad8de7798", - "d33601487f7da3d9966abb31b22b2ac9a51e33543a66c6733802b8465ce7573f", - "1fbee494e7386009191d45681eaa626eb173563c3f617c7fb91f2ec5818b5ce6", - "7d77494c785e6fc650658bec7383acaebf1b12c1f9f79c77bf848835852ae803", - "4db1590292fc7764f0b0052c457df336a29f7f2149ac11e07696e3e83e597631", - "83ac773248178096531364f0eb2481d2d6c7e253d5af465d2ab28bd95246f892", - "64615ab4b42f9f71a0608d341ebfde39eec8b1e67fb94bb18592a3be4d2e8503", - "7aad69507eb08e949616b91a7c1de3f231a4353b3d5a92800bf44aedc5c824bb", - "e5eeaddea71a26c007354ad02cd46b8ec4200efb57b9e5600b01212618bdedb3", - "1287aac007b5585db949a225d5964085e31be23fac985379c1d5b1ec7e283395", - "ee2eba33e47da049bdb633fbad3c441d69d9c1e0f55d7d3fe1c9e2e07987ce1f", - "f146442c36f4ee4894afb4d8f3312c363b519d990d062c97394a42fe0a26a928", - "6fb407ef507276d7726dc75a7d54c0b5eebf33f3029fe8232c61e3053129808f", - "8b172a748a3743bd796c34c14af9b3d0f51d46a9633945d73d192a392dc1489e", - "c71b07d795dc9ddafd0bacc8729dc024204e2aa39ec5096da1d749d73db697ef", - "e8390db35478cfb6a12eee4eeed2f00216ec51ac94889b36933b543aedec83cd", - "c5ecfa51e5181ca070ae060a35f8a4846279ce6557861133121791ed79fc2f4f", - "2f70bd880a3e8f5629afb8d451df195a0cd69e7e2cb274d01fae58ea44e16e69", - "7f2f3e0905e622b5a10aa338cc60b058626abcc2e2cb6d1cb00908149f46935d", - "a1e7ac7d8ab343d3a9dc74ffcbf3d8347cbf03cd5120dcb24d74d0eecda23d98", - "f253ffb86c3b72d96477e3e8e411686277d94e339c4cfe755214d709b1481fae", - "e824d53d5493ed83182206b73ef9175d2f5c232ca222e820325181a2f2f6a082", - "ffbc47277222b263f6e3a1d948a06211f0318bf3f2ce161b03c66505c43e28f7", - "92a83f25f225a707e8d6dd34760c333f4738eb022e01c47ac5bc190518f8f2a7", - "8b5146ba7876b9891ecbccc0cdd7e90a7e2fd27d1767b8355482fec8a65565b0", - "45adcb3fa09566e65211eeba3b588651f33d3a59ac6067fd3e789511edf91d22", - "272809ae8eb0f7cedda3f33652c0a559955b971d2f4312c40b83208dac4fcf62", - "f714e098fb8665c462bc459b371ebc3ec86bab5cc96881076ce01121275a88b2", - "97e5155e05b3b0ae50fc066613e2d12d28406fa23cf121bf6073fcfbca7a43aa", - "42003f84160a96b0b64a66c46552ce13629f1bca7eb16851ee9d3b48942442b2", - "039c00bd7f7c98cda5399584ed4f554d90e6d9e423ed57cdbe8c26020ba96e72", - "4d19d33c8ddd3f4f734e55b147d77883810c5bb91e9e25bef662a8ee64633fa3", - "80a69ce78870c2cb9fd0097cd1fe54fbc1ecb3831e2746933a7f8a034cda15e5", - "829e18f390e1a90984fab526b5c268456855bd12e8a85ab0c88a10fd87ea2002", - "ad4c1da4dd2a7a52aa07b6ae49f6d18014a1b5738c035d886bbec17735cfa407", - "e60a819d61abde64870eae2fc9f320c1cb346bbb733bf80f079db54c2af24f57", - "1126693b28c8b1ac2df713540c694b686a3f1a823c689924fb066f13b473df2a", - "8a769726cd05071d65be5b5fc5089103de1e8b47518958ebd5c660f4dc0e1ea3", - "55d9b9d13f2794b97a666e4d60767b6cb081b9f968338f35f54c7a721b673470", - "713a8d3c3c123804e51fa89c0207a33b049c21215b1fc70aa4a06c07800cd913", - "2dc0891b4c1e9012c8b476bed64dfdf8698d224de2fb458a1ac6ee54fc0e4901", - "6728063cd03db153fe8ab16e16f58e927135bdab51a3796f09d193995e8df740", - "e120da3ba9988a9f82c01098c98413b1c99d6c69ab882972070a81b82eb84ec2", - "7c1968336a1184744dcde90daf3b69876c3b3b2865ff458ecf4663ef43c68729", - "cea26fe04e0a8a77e96f33aac36334b8a809dc82166e12872e88e8c90668898a", - "443314676b0aed8bcadefedc5322d532d9d76761f959c3710b5a91d15dc22389", - "76759ba955abe1482052a95acaef265f68a65f73ff3e48b40236dc8ac7272da7", - "c892cd389ba57bca6f98f49447c65097aeff4db6ff96876c158ecf21a577d7bf", - "1923d17b5987d4bf6877466692d284feb17613607a781ea9cfcbde5347f5093d", - "7a8fd38c7a12001b1ff5596e85174ad0e944a4941c4054f47ad6d774724f273f", - "5c7ee558291fa83409441c6cd91f42eb18a28ec451601c9c16655c42ebfab87c", - "d1222897e54ab418b1668c25396af991aa86169cdefbd99ce5faf8087c0ea61e", - "9b43ee0aabfe57e30acb800ce55dc596ba2962bca9465729f7c82103ec754fb0", - "6d7791d525fe5d5aaa9b57e980eef27d90013fc2f33fad9c6a3c09efb7040d1e", - "9dc849c557cf165d8aff99e6ea869f71944a41e95b02566efdeefb68f67935ba", - "1250d34ca8cd3262dfa60c08df8e3fdc82c5a76428f1fcf08d9e2bc9be7ea2ae", - "9232b056ac715002b2a5f1d993a2053b9de73ffdd4dae4fafcd5ea25ad038ca2", - "d71f89d92e86510b8d52cd15c706fbd30a6699a956886a2fe80a2da429ca1832", - "21c7ff7b4c52381866078149635d8a55099412fae45386bfd9c6711c47e6332a", - "457453d854ba66e8641728cfadb17c5cb6ff7a37f746f5965697cfe89852a588", - "9ce1ddbce0476390d82356ba0e7e79a4f47244df89aaa9e33f4e8bc1882797e9", - "1e828da813adef9306134857734860c8ec79089fbe54eaf29d635ebbc463c5d4", - "712e03c4ee4962ed45fbf27851717034d95196eb7d52c31bb25221a45e80c3a8", - "193433f30daa0488d8a47af67ff5db4e245d2d4c6d1756a91160fc85a56e9cf6", - "73d111e5b44eae6c6b9e5714650f70a52571783d5083c1606a00a868693ca2d2", - "364d8bb9a8aa0644a5ebed756a00c9d409da40d124be587023f5a792e3088e07", - "398bb5a246e95c7fec538530fb6b176756b763eece94f00e7764735b8a2d545e", - "06ba8ba8a89378f129413ddd57e501bf3cf18f0b577969e8ba87c08417c41617", - "dfda5e84b40dd79f387c71addd09e9a3a07380197c30ee35a51b19e0b5bb3ad3", - "a8d200fb1a57a9eb4542b1175b29ce5f4d77ca38f3cace3d8fd0d30dbfa01fb8", - "9f301ca34d11c2e939f81fd8bc64fb625c7a7e6475b3c0ee91ee4cc9173db00e", - "bfe5f68d78b3d61d0aedaa3d52b31cd179768de402ed71159e9d5d57e4b616b0", - "acb224d8f9b267f0889887f1ed3016a71c3784ab72a5c1bc6388881ef67a465f", - "edd4b4de68b144a6a444aea778771a6313b751886781d97c46dae1f760ea94e4", - "640787bfd244b89efd461e6fd62932b570d2251c1dcd883ea0520842d12155bc", - "ead63560db2bcced49ac29329bf083d214e15749449893a2f9b3f148ffb0e105", - "999fbf8cd3748540b7399f10fa6c3c957114b4eb96aa80d26d6b2c58d7d6029b", - "60cc6d2c4445771a6e2a6ff55dfa73c40603e56ddbec31d1e5efa5e6cdb4a93c", - "036e590e895cb53b9255bdac2b489d9df8e65dce8996fcca4b05429c3cbb6560", - "9e9004acf3e8490871b8f7e6d5684b11d3d6c3e56ef4e87e9aaf77912bb18aff", - "982da5d510295b607297c49c2a2fac7c00674b773bf8304887a28095066fbdc5", - "e93d4f5284fcd5ad968a9a384e2d4a171be97fde1e358daa31a732d3adcec499", - "956cb786a24b80fd8f353995b2fa4630b0f864690bf425e2e7d2c8808d18b8e5", - "f944615cc422b5b4dd15c58a3cdbe99d027a8d9ae1b5cca15bcbd8aa65be1cea", - "3735b372a4792e24400444a827e6c4155b0ad7c63d286497db830ccf15ae76f9", - "51b06f5b0c6b0c8738a89fe228370c078459e3becb3d46e2deccfef884753caa", - "9e44f15c1e5a498c895f7a1abe1b48346dfa94ff0cd769c11cd0de6871a62a37", - "bccc9655c94b3feb26b68c3a3eb0b177e243f9416677ed99a3c8587c314e48a5", - "730cba88626704fd06b0c727741759f5fd896db5236df488f1e5e054d007b51f", - "a34c747a575e37bdd37a79f4016271642a3b69f42949c941cc5ab45aa53602f5", - "01e78d0e087c48681b9d73c9b0281600c9a9ead5548f0d1564f7bf61f8af5cd8", - "7d6738a46922d5cdda084d8bb53b056293e4f80053f65379b4c45d0667d730a9", - "fbc4fc3dcf84d6780b21082dbdad34185557d34183c14c4898f3b96da340069b", - "143923bd0e4abb3833303b6ca941a10030d569aa70023d368367202affc76439", - "50f6b96d0b4b4124d7b09fe291d6a264589c7261ed3ca2f9db64ebc46676b42c", - "309b7b8a3bc783aebb9fd8c35dd2a2f888243cffc9ca178bf39623a6be35fe78", - "3bc9362261e8eec0eae8478d98c74e52c8b799001df1bb4e0a770c413f34d1aa", - "c034c17424d82c13eb9102a2a675557b27ef6028022958eebff9875a82622f83", - "8e08d005b19c257bfbae77996d265acbf614c5d0a8f2b7bd47a3005245de5053", - "cb05d28476c70a562aa71dd5a0ada5b6ff306d8f7d70d91bbd498b25b0d0ed8b", - "fc382ef5bfde820397509495e6be75a913e4dd6db7276148dbb70afb45090a58", - "13e00e365416b46c652e54a69747b6a545ce0fb2b1d94e806ffb66abf6667032", - "cccbadf2b597f5a1d170d50de81c790ea6e736a32b7ecb756cf3c6ea5adec67e", - "7b23ed57aa137bf4cb462d9630353df69a2eb563c7d207306c630ff04f72efa4", - "faca12f1251215422b5afb5a561b1c9677191fbaabd6672b45f05223c1ec4e69", - "1983fed720846cd94a9ab127821e0c02a0215a23c75deec62213e58f5742da83", - "b3e427b6bc67bd9238e7311a247f8b0db2bdc27410df449330e401d0ef906033", - "788a5e5295655106cea3992633a749838b1f0750c6eafa689436951d7b9bac03", - "1da75b25b587396220665f1a73ba27607ab5ec73a002beda4a8c0e5080b70a22", - "959cbe8cae314032568f63191723a85c93af2aa73c563b9c87a5572843b12666", - "3698b7400b8c26646c144e3ac901b89bb86ad831d0b46a46692d1eda2e11fab2", - "15869c591e76b5face60ba197094cb3612ed2380f6fe77378f5572b77ad4ada4", - "a4286b0199769c8ce896794d511a1e0adb9fd3183ead46be99cb452c0114bc60", - "bc82326f4954537073d4aceb607d2b80c05e5e98e431d50e87cb27e548c92a94", - "027e6b70c352f0b9f4c2b67ca40eda1c7178dddf3df07b55eb2d04efc38c17ca", - "2cd58f7065dd742bc971f2edba3a88ed0ea35905d1f34eca7e827b38823c62eb", - "b833f3da2b2b640c98a18ba4cc35cb77b9f5e872af958f237a191d39b9c4672a", - "ab8a10ef4dbe08a2e68a55dece61fab56170c676e270a7379a745bb428dc82e5", - "3f67ab4d044a316067436588912d73435945cff5d78c3cdd73c2a8b0ee469c4e", - "abc7374d38a1c99d21aae012a95547be69353a894641b678561f379f51a4dbbf", - "9dfcfeebada3bfa93c3f6aadcb433465ab7e7dd0b80e174476d13d8ca21176de", - "b972380f7aaaed5d72f64118100dcb0b5906eb501ad17b7500513f287f906608", - "9def2f227e465e4818f06ee4bae217953a25230be03faa6eea2c4f25a65c7a77", - "8eb4abe3aca5a653b07c939cf5038e49404864f0eea7591171a2a215a27c09e6", - "4915d23369442a76414eea04b105afb0da64ae8b7d7a7d3a41168c7f8c366466", - "5e526e149ca18ddeb7ac1ac05635f81ba4ce346f5efd7348efef967c805a1b7e", - "394b19f0a9875b0c34753feb2b37cb6739f4328302efd5b74913ae1315822b1f", - "f7e0dabc254529ec8ec998bd6956c4a25ba0b9872394eab8a45d12cc32f9a519", - "4c4d209898ab369ae292ec98f034dd9897f74ae4e248daa50ebc4eda630c7254", - "a548a605b6891d38752dc177a71a669b4af7295beb4e35997cc6f9a858b0ea6e", - "d8f4e7ba94a43b54c68b6b2b2963155a8fe5fbfc525d5c8205391efa918c2341", - "2a876616358e1ea28241289d98368ee44f22aeedd9e937c25033c7c4dd50802b", - "a05b260edc09651f58ca22488c72dec0b7bdbb7e6a0108df8d67b5d3d29bd1a0", - "9104c1f70d73c4a8f8a810440103d478fa0e4227f7f966bdf31e7612e3179308", - "f8e7ec51116379e3883b9886c589540bb51cf6dde194dac3116895e6e10319f5", - "c2337f68dda07361ba1c65eba72ffeac7aaadbf809bfaedf392c75116999ab54", - "2847a9ce424039b80b04f094211fa2cf6b411fad494f587bdff0f37ea7fdc648", - "e1ca750b1109b282c229cc056ffec53d25728382a7a79bb506df58cd4fdb16c0", - "f3f33c56b5aa25b30300b9af70de845d28a28ca1468aac73ec91430603656bf8", - "6d05598b8f42ebf490c8952fe029abf4651fcb3347eacaa1b8274686f9d62cda", - "8872a66ac6d90983d17d1925a640b9204f6c1275ad8f3207c6b98cb7bc6df6b1", - "2c65c7971e4a6a41bc7167b1a6eb76e1e84724ec72ee10a8559fb83ae8fbc08a", - "944e972884628a9d51cc70c111f77411be22a29d934c0c923044fb0248842242", - "f6ba14ef55faf64182a4166522d54fc8f435a99f7f0857272952b0328e91bfa7", - "db756b4bc718ac07e6511e05813571fbbc3e4d0d134272ca661e0c96011ed791", - "d6d7fe354a6effc24f784357d45cc8aeca9d3cfe699fa54123bed20fed796a79", - "9d9f671c233e6aa81c76aeebaba8cc29eac0474a5499faa8d4df2f941577bc50", - "223f138b09c7f90476a5bd16d30a9ac9985acd5467b3da71bd39cb9abadb8943", - "da06f6e209de40d52f2105f30f26b355be3022329f6577a85e8348ac73a60314", - "0e7606b41ad6d12f908d9ed2c2e68aa7248bf04b79de26b394a634b67e6812fb", - "8dfbd588157b039fe35d1732d0ffa140726cf25cffa47fcdcece825a1f6d4e2b", - "76ea32ec3487cabb54f9bb1d0343693625272474b351c994637e4236b9586aaa", - "4d916d653dcfdd6b50e217e471a054e1131c4c270d7a0b172119ea84c0b234ed", - "e8ca7817e3947a83593260d630f3b0ecf5d1301f94df65ca12505bdc3533d338", - "da63752540b8a0e3a58c68b803b67f7f107ff7551ab72c906c4206aee4bba60c", - "782433bb1460dd894bed6501171c76ff3809812e6f20dbcc79ba5e521e7f08da", - "e15bc21e82d5b7d4b5f44674a87b5533abbc9452e3affdb0d87c45f164976649", - "9c5a47901146f0e91e04b51844ddc08d5e73be79b070ac969e4a1d2e7d75c52e", - "3d2806e9558f5322149dac5f2f7dc339e1e6e34374b1b3fc3387b70dc8268e5a", - "32788e1abaea00d4994d8319e917a4233183651763b7dec276cabb4f2ef45dff", - "9417d60ccd9cab987336ab0062fb2bca6d80cff4b670beafbcc636f1adf1156b", - "d9e718fbb580141dab0beee880b115818d976ad9aa0ef36cdb471b3582cdcb37", - "877547677162de515ad4fbd4a9e579f32bca50bf72fd0efb341531a77c490301", - "9b20fbe2cf41f356f08f714c5722322eb5fde542af404752794ff7d429997c8e", - "26ad77de8bdd37ae28e6ad748c9b9ecdc48b379209a43d3563f5b05745f07219", - "a662294e53cf64693da428ef41d1310649da247961ad9de77af4e386e0530f62", - "97a125471595f5319418f18ec9354b27d54e1d173a58059dabf170b763354486", - "7fb9aea5fd5513ea3245570227e8163c91f44cc716f77491f8bf08752ca625ed", - "30424add42e243ad774ad5e78a43bf32235da87749d13b198d63b644c55aec17", - "da1465c0d0d590be15755295a6f74192b4a38041928062443e29cf11b8e2ce59", - "864cc8dfe4b8b26c143456cb01554c9afe5e0e955fa1b5ee050528f153b609aa", - "371d44da93eda984268e3239c768d616f4488caab0c8a180c93efd30bcc4efaa", - "5f8dceeafd7c951df92447713ec38d4659d5a2803fb77928e32f9c9b38afcb2c", - "d54da3dea1930227570f58245e2f640af01f3982f4bf6b82af077985b2806f12", - "8d91c77d3d6e3bc58628477002ba49627fdcb72a76c6794b8c4e4f7a429c363e", - "2a4941bcdb11f3cef7f734b4d6de5a81d408d5e90a48a297a1f23aa0118f88b2", - "3c833dc1b34327850915b5862ba18b9a13cdda31eae1c4183751bc9f00c2af69", - "f74787ed2c1e206120b977aa44d597f1c0042a102fccc2d851fcddf4d3abe2f3", - "4fc1bcbfc821d0b9032daed4aec61b74b6135d28202dddf74ede22afeab146e9", - "53f4a5042b76a01a38eeb45348aecbbc6081655565cde8bac1ed495cfb5b2281", - "74547d27e81d96e325b738caeee9275b871666fbcd56aac87cd93e778a373a04", - "565be0b7f8d391cef58306b3a966e9bb6db9b7db8fde1783d386b6ca87deb69f", - "217bce8ddec4254556b4a4484116ec0a5903a5872fbf92592c0e5abe8fe85e4d", - "1abfe2f000b10d8fb057544947c6da4130c65510b8766ac8cccf27573b7f0f22", - "846fc60bf5d9a15f80af13ac9d2c56e708e164ed0816d831e2bafc3378d814ef", - "8faa4d9cfb66d8e1e15fdd0c187f86ffd65167cbe7e7fc29fe9d803261af514b", - "14be7f587982b0e8a6bd5e0d5b38e6cb99e45a4c11d79cfce2bbbbbb9906065a", - "9ca58095089db90757d01a6b495e1713a7d2f47b4ed191ac0d77ebe9ebb856c5", - "840dc22cbcf0505f44a7bfcf317c7a05aeeb5ec692e18021e68767b06ca3d576", - "1df2de0d0ae529506ab11ce74d1142653cc5b6ebec5658dc38ec4d4f31cef9a5", - "8338db4235eb6fbf7673b5731e3023c2bfa667c6d1250a6addb706d90e5ef71a", - "ee975486c18114d4d981272637cb28756b10064b786810876658b9428b8bab43", - "459ea70d0ba0dff1a28df7f041b593b0eee4771f3319cf08e6597b89e9da3bd7", - "0c546860428bd117aea35ccd2db1c4e0aef8d17aa42f45cc8e9bbc77ad6ecc60", - "17078792ac136c9b28b6b00a9f3138a3472a5e043126cb7202134b4b9e816478", - "8eb092563e1ce46c4e6be68d856a6007e74b63c480541453e1594234f42bb2bb", - "7416e5794e13221643a54eb5ba3b0f5e2c8ebd6d83342376dde96fa35473735d", - "938d66094125575eb7b39fede8e76d89d5eca5163b3c4d16737ab168ca735593", - "86f80209c55e644e1607846e1668cccb5a9f1db4e8a9929196662b09ff8cff1e", - "7e93c58f220fdefb23d4963db8d90cb058a4b2c9dfdefa3e2a734c67f68b7f68", - "46675b2ad8d5b1c63013c81dfd385554060dee3b5a1a277d4005f6ad15f909c7", - "65c7fd6b45a812309909026cbd16c06ed0944a3049c2bca215364382f0cff260", - "3e05d743389adc877eb48640d90e774e70816f5e8db90a2489dfa221afb066eb", - "d35a0ba07f51c2e8d39a4d1a4529b2843ef559785846c7bdcf727a3505171d85", - "e9342200308044f5f18fe9b1a0138ad80c1e4b2cdcaeed818ac6421b04151252", - "5b494732bb3dedd2b263cda14a792d16942f4e598c11c7e9d6890f62b14c6bfa", - "b9308980127ecc8e0f4ca1f624b7f03198933126e09716ccaa27dd96ead73f31", - "485b0ad4028d1f6fdff7a794b642e6b930f2db21e416ed6a967303cc70836cef", - "eaf2245dd341c06c7733ec78463a2181522edec96a33eb8f379153428edb56bc", - "b10a0cb283622070930c03ca6566c0f71d6ff37c38b72a02a07b7c23ca7dae64", - "9c7865ce9bb7f03359c7aad9c5523506ad007e3cb2daec110d110065eada9e9b", - "7f48808c2343d11df0135575e12bc6b2f2d1d9faa4091560ed8435c485c1a85e", - "49e9262d2b6609ba2f2c77d6609bbffb5c64af76d0776075270ceab776c8bfb5", - "1f39758220bcbc9c83beab95342ae156ef17b3eb056a3d7ed26341a840c6793e", - "4ba7d6f67a17e1065cc3e23da5ff67826a95aa0dd80c3ce80c63a4a9d2788b2b", - "4d0ca772060e1753a14871b42b608ecffb0e59119d36419a9f81632c5bb5021a", - "3f83bbac10cc2d6885cb9503594253f4c49added254fcde5a656ab9de7ab3100", - "009c98b7416917d776e827a401d0ee2b38d2a2d49e732afa4ac3a68575904528", - "d8bdcbe52d70c36e5b9ec33affda4ae8d05d710fdb1e6406b1f369c47f88fe17", - "a47f3d484e2900f07866d2884c4bd36cd237f087ef638709fb85ae923947e583", - "0e69f657bc7dd4c640b8e034dec134af128fde5eebd92dbfa98711217db972ad", - "ba679f11c89b2e62d2b7719522449f5918430f1165812cadb6fc071b287fa7d3", - "a066d16e60c26a9f6a33464e3b7075e308bff4eb291697f3773cb89ddcab2bbd", - "830abb4fe1481f85a8ba9c513d38d744239b6ac682f7d80e6408ee4af1325e1f", - "3b0ded2f4eb810250cfab5d857e22ec5522cae7161591903c72c47a4ac4fc69d", - "cdbac2a86b30cc27f94f56e7c2819d83ce6a9a77325d41bd4d630df875be98b0", - "a306b51ed28d171f1bbcd4b7518a9620fc892234ed2cfa03feaa650e64519891", - "331490f7a8cca1d8e0ab3fe10abd9f31ae88d5be92df3329aeddddc7307d2513", - "729b071db257f11bdf8d2f5fe0a2ab4253e499f2dd7cacffa76fb968914a5e38", - "8047d618f8812e90ae3d3401896277fe2acdf4f24747cbb308cf6ca64a6317da", - "7a4bd01a6cfefd6450fe72a6f70b5f467edcaae2a2ee6624fc3f28eb1648135f", - "01712a83b95b6473716c8a90aa07ce194ff54cc37b59dcb3896961c5e1b33a23", - "291b7f0f24bcd096c5d4bc86b61bdb2ea5e92f09bcd6d33a7f15f92303987151", - "d160303647b05844307df96d885ee1393f7396a347534bda63ae4e13afe4a4bf", - "e25c89384ee9d4a5372860fb1bfc1c96d0dd191cbc01be2855afec98f4302cca", - "f323fb8add4cb90b565539dec76f075ab3dcf794460248d085fab74068fcfa09", - "6da2efe071bd512be93e86534371758fe89980161322fc512a0632fd5e292f4a", - "211a136c98b437e05d6aa5092f02f7010eb8887d3040400badb8d1c85c430257", - "959e8265d8845994eab7c215eea1c131d4b1ce42706229246b741cad25f6e018", - "0b5f38f1113788dbf14a171c9d904ebdfc52816b537cbb5430cfcc62c534fb41", - "c0cf2ed590fac4ed9f29ef3c036e60c60a232baa5da93b167562c6d838efc04f", - "fd4e18fc0232321f36af57dc8a33abc1e5b7ffb5bce1c3cc41a02945c723a399", - "47d9a3212e2f1a194dbe8da62fde32fa186eada717e756efbb2baf64c3c1850a", - "0dde6e3db668aeb26f9e93378d947f21e12ec09f98bdff2efe220bb90fa0c78d", - "13b0eb6b50473e1cd1ec9f9bdc63bb43b9055766ccd5a54866e51a36a58cff09", - "b07d28c89e1fb7d8e17793bb6150a49275a171976e1eb67d4fae3abc397f6390", - "87fd282cf2134b101197f28248ca28e5313eefb406f25233f5d6c67e199331b8", - "2c030c3c063d0763bf23b81fad8ff3f28a7bb874225839ae0b57017522b7cf14", - "fc456c88bcec6fa3f188e2186c09c6a1d56982dcf26b094d73b17c43aa2f34a5", - "f6b18d5e3b2869dfdc249326339de85ca50739636c2c48eb3b4c98e63dac510a", - "1b751ea2ae279807f39d9c91e2d9a094ca7179cceb813736e29c32015b5f90ce", - "f3c051995af04e845e1cd6a09c6fd4da8dcf188c8386960cc6735f00de834c71", - "9b144e148e55e0aab69e0c759dab4174c9da27c0d8c04f23c243c62d606cd40b", - "16108d31cc9c553d27463b04bf8462a485d935d9454817b570918270757935e9", - "d0b73658517993f427d3e1797d02baf9d68546d0cd88ceb1f52f38e8e1973319", - "1fc4e3605baa83d813084bcb828089d7650eae1da228c0bf8b14a3ed2e22d922", - "7d8acca68b403b0d80bb152c17332c8791fa91339687f90e6deedaac37ad2593", - "1f3ad365203c3ddfe5ed92e6d85d2b39816762cba8149ff4f8fcc21ea6f0ce25", - "b0b689923fb5acc3c755691852ec3fbd7a7fdf16e12faaeea9c6e8abb557f1c3", - "a2027d19c55943d36dfff17ac709e363ec9d2b3c2fb067d42595c19f3c92d152", - "c3935a9da74499357120c49d4a0d9e7dfe7df995491382d15d97e9af5955df38", - "a91f6e36825bf26e5c0117922701f416d7acf33f5208885992298060dd7feccb", - "ac80a0e39433620966f0093672641e3209ea20dedb270cee0ed4f5a11ff357dc", - "e03eb8dd9b83306a3a00208bd07ff43d9a70f3fee8f831448b8f36dcc0fc0a0e", - "d21f9eca872424efd816c1e20cb20ef514294f10602b5bc3357a506a23c58f92", - "d23769cdaf431e97b4c1fce1955c1575190a33410bdafb1448268a954561f105", - "a6f4f3e5cbda805fee1a8e88891fcb52adce411c8acc3e23924065691ff8ccab", - "439df93c36a845dc19184227124213e80ccb06d7782617861b11327ef27695e9", - "8594fb1142da579a5631c2ded4cb0db1d97ea97a3dc53b5a07802ec3a97b90ac", - "de2f82fc8b10bc87181c8f184ff0de809ce3cd02683a6bd53d6e57bc46c377b6", - "85f49bc4b0db910a2b40ecb76f94b05f5c01b213234ca5d3cd95119af5598e67", - "10189ce6aed0a863550027e78e465aa9627dd7fb92648cac6184edd8f1f4c6e4", - "a6d39616a0605e31764370a38bcbf7b1bea46aa6ae1f7b701062470db6931022", - "46f566f129a9b9e61d6c1e963be8bfd4ef8822676bc2d6ffd984608917e03b40", - "95034e27a3c35b3afdf3a4e5df1af4f3802ca57e2ba3af317defd8095b48ccd5", - "1747fa9b39cd11bc4db2bcc00913240fb9514bdf250ed1d06399ab5f914b8779", - "ad3770f61503658c98b1703f93158a8d0a683862031ed11b240f81018358af39", - "59b6a8ab57f116eddaf76922f6ccd668d13b723be70e562c289c5b586ee08eb4", - "3e1ab92c15cecb9c7ea5607d65c219df11722b342b7c9856b37e97a213cecea7", - "87863d03a0a2db1e09953911e246097fb747e790d2c715f12a1b334d32bb0df5", - "69fb5ab281fd6cc7c4eceb3e465fe8f954003e999e6bce4bb9d6d2cffecff7ec", - "9dab6339f9e85f8782effb7aef28b5e0e3b096acfec1bc0e212efa330c91ba07", - "981fdbd2cf2829c7aafad5fe63c35c35c1792523a593f8dd6aac8a3a81e12881", - "0d726049d7a87fe3d844faa428316a9e2005a05ed9672dd2fbcbc879b88a0354", - "a51187dba50c45672731ea03115f14a444cd6dbbf88957c8459e85b417329314", - "e29b096990a981819775ab5fe4420b88bb541138c9085c74935dcd967019d175", - "21a81580557a5cf0acfef9ba087cf402aef5cbb00c85482bc08283c8e7162177", - "ad7b39f74726bc4c8d02b32240b2a33148f30b7235baf82802f69fff2314dcda", - "26e967ea92d3a1899378bcfc7923caec1f832838b0a5a78bb241e648102962ad", - "297c9f341d08afeebccc8e3f60ec5bd81dabfbca35c3a62a03ce5032a865999c", - "12365b9c446ee10efaf99caba1fcbf63723644c19de7b32c1a0780358f8c77b7", - "6c38148ceceed998faafb59f540463e77790b43bc62497864f547863b98c898b", - "b0731b5a65ae6291ecf748888f2fee042fb30cefce7912270862318495b0a841", - "8acf2ddd4b3a07701eb39e636d2889794ae57c8a3cb9b8fa91c8c5fc0fd5b661", - "a32d99d149ad4bb26c29ba07b08094c47c51bbba0ae1d8ca8f4591ccf4b58da0", - "1fbea6a16ff9dbc684ccf5da0f81929cf27c9eb07645d7593896bb242df240bc", - "e4c58f7fee33555e9642dfc6b6063f6862526c1728c071fed9471b9570546474", - "3ebd5fc1587c1813663a3b7bdf92b424967015c4e5e8f2e13d146999bde8a3ac", - "5b5989589c72006ac2b8f769e78bcbc2a40d2e060b6bdaf6a654da9139586504", - "a9c27fb89096a0e2f135509dadcfb1224b3100cca4fbfb3d4380f95a030769a4", - "9a35ea206af4d942e27673712f9f316858d01ffe14a4df147c639bc9eb7e1e9c", - "8aadb70aee05c9fcf4d78433b101c97809d366bb789f24647f2c053ee5210d27", - "ec849074d9ba5ef93c2183faf225953036c764a2853bdd2048baa7b1eda2389b", - "0b5c608be46b86a75f085525b5f261158617e84774bc38c76e9c459141d4c159", - "0ff552654a617752f86c8d8b7cc87ecf4bfc0aee893a5f46f41fb5b0081ef6ea", - "0c422b7e3216c0f0a4c855f6d581666d495cdb0f80827fa86771f34afd6ed4de", - "03eb6cce53c48a6c343700fde065b86831af57ce0cfaabbd326e888356f2b4d2", - "87378ee40b93dd6327d51a1a15af7cf19cf097c91e2be3886aa04cd82da83e24", - "188ae7dc4185ffd413b81fc201192c876c3509f674821630b538ad9c09ce31ac", - "7a2b44ad3bcb790d218116f7b04022862998cc6c92135a8f221baf21a50ee54a", - "33fc1df0c14441d29c2ea13cab44f7bcc9e908170699cd90c38f97f655116a0d", - "1d636cd40187fd147ae7b805e9d56555fa6ce0d60b9e35135caa27318eac8aa1", - "0d6990d8873882a99a81b2b5933b7eebc9dc3c91958afa670fc854279f61df91", - "85ea9eb1264ceb8736dec55820f4f9179ab938070d94b086ef1346a64bc58edb", - "e945b3e6a79572ce741bf78fa4a0018da816d4970dc35c661c742f6c244ec44e", - "d9d71a5623eb065ba5b8634a9c5fa9a569f6951701336e7763d9a53bd0a22561", - "cca478700ceeca5963c016185980a0aa6086e627e9c92b36e89cb87666413843", - "8a3d67cbb0253d2b739aa28b05c30a83dcd8370b3650e921362562a098a05aa1", - "ed19d53288bd500e0ce5b2a1cee2cecc6091adc5bd9a3eb6320a1d338f900fe8", - "8508a7ee74a858bcae87f1d9033c64881324e2737c030c884293a5eb97205f34", - "46de3fc4e8b87ee01dfca755f7da26549d981e82226a2df64437b06ed14c65b9", - "45189df3304fe6e589334f709579f1ee3fb86454272d6ac05bcc3a614b83aa23", - "98d95e71935cf67a1d673fd3ac4d4019692f7040722b11675b99ca865aa12d54", - "178afc4cd9f58419fd553a6371c672cc27c7ebc7ab4f8d7a33fcf0337a4ac117", - "4abb87ad6c2f7b2f3fdbb58068fd5be05cb2e90be70a2f7e3c6b78e72b7da573", - "cbbf333904eb7ee95122b78e31f756e31eda1d4a2d777e5cd553325a4656bc25", - "dbb534f0494210ae8b7ddd10530281f658f46662d40fa9adc62a0694a96cedc2", - "93a3d08e1c60404789f62b21f5cfc263d1fb9df36919715266cf087666561ea0", - "4ab64934a83a1a442bf8ae98c725a0641ece5d14914d8be81785ea12ce8df651", - "2de7e679090c276ed420d79370bef1935378fe57bf59dce40821b97b84c0e0ba", - "6af11a83db0629a4ea1ca07c1a29be46b6fafdf7352a42943d7c9d427ab9943f", - "546db4321975cd59ce5eadac9d29d9254e655d6eb088f4e883e33a343f36f7ac", - "e92a1b8f6221e5383071cbf7d47bc5e69dc0a865f0f838f759d7c1dfe65136b3", - "97896bef295e6b9ba2e447b75700b7f2cd66e9ac7b00ca1214fa6e92dbb5a073", - "884e454081300313783c61e9753d069b0b45f02825a5a6c5dc21b03928238c80", - "f8f33cb94a89171a96363e503d22b5778c8b7dfec8d83bf956b2b94a695b870a", - "caef9d1a1b394a776d3e0813717b25af8121db7e1e95710d9d9eaf8abd075e5c", - "a53d7155321b7f4a381d0b49aa7ff007f7a94cc11eb4d3d21a4cfdbaf68203db", - "ad8810771d165d0a2855c62399f6f498e6b08df2ea0798c7065cc2199c802c7d", - "c1a43cd15e31dd33756d64c123d9204443d5536e4290390b6e7ce6cc01bd49b6", - "605d7848aeb60e03f486fe18d8eb481f2435aada0006da37821ca77ee2ecca60", - "dc4425268ede855fb9e4ecd3f8570349b0c69a0f254237b77f421bc7e116d519", - "841cec55cf3662b878a23ba1b02cf482d0ebc56343ac8ef67e551d420c7b56df", - "bb869d4a5d98f7c7546d74bed813676dc20b7836376a6d8e22134471223ec71c", - "2844b62dc7ae6c281366105afca8b2658e96da7a6ac20925e581f8953fbb4e9d", - "00eb6ef1de06147706488840ceca9e26e17abd30d2f26fcf7e3ccc155eb71692", - "8edaafa2eee49fd4894ef09e2da853f8463e442a68b4fd5851cc9d950ef3c8aa", - "0d15480f2c3bb8de207d5840608eeed9715b5308012511d7fe37211051c6441f", - "17913c88ff02a2948fd07925bdd9d649744885b91da8a2dc85a2e2ebb5fb433c", - "083eb56335d9dc3b8bd1f1d29e26ae99704578699911999de47d3e5479656820", - "04128ea33809b045fe992fc5f8bd4d813fdae59dede87d4d9c9f2c0947c47053", - "9c4f0f60b7613819097ce3ed9f38a846ae564095ab1a383ee899e432a3440520", - "660ca2087a510d4eea59ba2b58b6aa33d90c5168b1a0644142678b351434ace0", - "33bca567e206b47db14069597c4af32d0c96efaf0583dfd6fd380b01cf6dd415", - "82d8fa0bc852148ee8adb722fc23ed2431e73d404e640c23b046dcf45f13cde1", - "c93ca2123b3d9982f0dc506c08c9520775a09e1b2a991d255586bb4859e69916", - "0b4ff20d2403bb95faa5a52dc1ac8e96aa4299ae589692a30bf696fdc43a19d3", - "0b6b1bde85bfaed4de6b3dabdf6aa0216bb5543ac45ae8caa9da9115ef36646c", - "fa86c973e27f0f0c4d034e480d73308e0be56bdf0dcd768ce54975c1219bc770", - "f85c17607962111922c9450d532abe19652fef5d0fdef572b2dd97077bd8427c", - "b07ccba65c9ac5d3207c74a538781f31012a5d24d81dd19fd4b23c7f067cac8f", - "3bfc67bfbc28909f2aceb30cbfe83c2edcae6fba59c5e647e20bea15d2d6c8b7", - "16122b4aeb162a13de6cbd198aadc6d555fe14d618823fc8e746fe843379d5bb", - "168d30cca6e81294e2bb5467560dc1fb17a3b5c1d29cc4043894552d3fdab5b3", - "20811f9e6364b0690651df178b38c0c4f4699ad1eed6572c2c661abdf9e78d59", - "0bf2c61a437d08c016892e20ee5248835d02c191ba5d2a7061e21e95b3315b38", - "7da25da997690a75a626f087ec427db3af286c31cfca04564d5c615ddfd1c0c4", - "fa33cb82c436821f53c06f78960824b82448064b670e6a802d71916e6cc9be2a", - "f026a0988d9a85af7e67d0f0240aa9bb346ad1772a094a4522e17cc38bd440d2", - "6a912c2a65137947eb852c36970a7d7472c0a7410e50534c34b2bd22912c2afe", - "d92058c0c661c52c781d73876f4036e4d080b8124ceb970ca60182caf6a8a0f1", - "769269d63d7f852ddf9beee49adf882ed8c457ff36bc94df885ac4aabc265c90", - "3e6e96f73989c253a6b77dfc69cc193a2ea87752f0acad639869b10c6bbe007c", - "2782110ba7441f083aea610aacba844d3d6c94b8a1f91b6a921ec90cded52ce9", - "118da205a7ee43fa7e40c87afd23fe7d81e975cdcd713641152e07a4960bebd6", - "b7671164d1b5d5063a0d1e0804a280205ae277f7eac21b4e6bad9b516e2b5268", - "0da46af3392064cb4a84f2b4b321815bb37548c3bdfff8a69df73a6550a7b7b2", - "300572a17bab160b6d0682a6e9d47da625d862f0171c47b610b9e659828d277d", - "12435c4f7655dfdf6c20b8abb3f94cf71a4ef0604cd70a5ba0f9c3d8f804b4e0", - "c6f6494bbf4b6b7618297bc2c33dcb0978acc62b10a874f615409adfc22985ac", - "388cc4d943b3f812bc2ef8ae91844daf90f1924f83dd6cca4043d89f15e1c5ba", - "8c2bc58207e94ea021e1a72550121ac826a12a9cdd56098f4a74c2cf74e62e9f", - "b34d8b15279433d2e1896a94a81339c03039e540f55e0d801bb4f5b1bf6ee701", - "0ed5849168bbe9922b3480ce0c57498896d94f18f21808a44d4875833ac10ca4", - "ea5bb3ac2a73a698c623f39e41953378139ab7e0415e90298c255a447fe4b87b", - "5168aecd36c57fd4f367304c675805a1df8a83a34a32e69dbb0eceb4e706ab62", - "feeff523a36a7aaeadd34ed9d19a7ab596c412e46ae6e866d5006a1d0397b652", - "1cbd78a94295b164936d66946679a470fdec9dc47e447468f5de1a0f79e1d319", - "33c802ffe1e2bffef6e80f6db47b5d7b10b20da392235341a97ae7c43bd2bda8", - "ecb0f3c51f865cd023e7c76bcbd2004a8b4802749cd2c5e44afe1035648070ba", - "c4c5029a7db0dd54936bbcf8d4b6b675b1d7cce4de39800ab0cd1b127a260208", - "22d6fd6aa21dddf8830d906f44dcc524ef6819e7205b74d3ee3d56255605b2c6", - "0b4b17f690cc016bca11ebb1bddc1252cf86fcb02efd6d7b76bd14d24102d12e", - "a762a5862b25e94b6be9d4a5fc77262931a7ba76851c63f4beb8805bd0e711ef", - "7b4c005d9f8845cba32b6e9f2fd9488307b72379c7138274604bace3a3d99215", - "c7e2713bac2014223a2a5ec042c0c2d266b0f74a101da699c5ca08d6d3961977", - "40d1edb3ee4e67422862f58f426d2ad042c6db2c0edb7c9994c853b0b5b238b4", - "ac14a650aaca7641c01b323288e746d3162af4ffba3dddb929cb9db2622d17ae", - "77f97ca8660ad620cd26f06b31ec4af56bc7ca768100e472c1d174ed8646821c", - "3c8b4c70bb1d63474ddda8eb33fdecd0569ad7c37c7a8e8d1efbd6965d874cda", - "3312d2b8bae287cc2f7cf9cbd05c9483353edf87139b2702bf0aa7f0c49f212a", - "63ecb1e44cd48f97af7d286a95ed4a1d0ed12c5065c3afa1c50e975b52d62fee", - "5edd96609850a2993c490b4ab29e709f20f42c5f4fe188413f3153ab7cf2d3d8", - "bfaf436b5bbfb3ee6f32c5bce1d6d4f9f4e9b610b8a59897ba3f96b0328fa050", - "7816d6b7828a274a648e14d6394d0f338ec6b9f1555ddcacd9be89e6a4ce154c", - "671726b2359165a941f6d29f7a8617578fbd77681199b9b1c64c8933134ce127", - "72dbeb201bdcad991d882c47bbebef1aa9328bea9433de82459b2ded9d3ec2ee", - "33d59dc1309222f15b363c0725bdba4fa6602fa50f412de306edebc15bdf640c", - "2a75dd4dcb74c6ff449ced097da9eae30cb4b45d35bfb2cfe933a14ee29e88a4", - "2c8c9592fe9b1f8b232c3b6e394887bbb42483434e3a4c8ca3a2d536a12da808", - "ceff9592c8ebc1d89bae9d0e09cac5b508831ce07f83197dcdbc81d77fb1f0d2", - "3d0e829d2416d87ab3103eb6884be06bea325e243866c1715745c4324c1eded8", - "f002ba2f3adb2314f0d5fb14b66195bb4cf1eb2f8da211e0afcdfd22b0768dce", - "9df53cc75fd4800ece1ac3d23906393431d5af2e57f9b2160c186c18163ddd25", - "2fff7ed910e718a0d0115f195783a40d02aa5699a7cfbe28dde7f9dd45a0381c", - "6e941534395952da5c9daf88cb6d627ec0a94afa6e0e3e14cfd450cecd7d647e", - "53cf82f1bcb70af4fbbe11c726421b1a5389306f5d168857f7e14e56edd92883", - "7fbf098e46107e3e61ace23d4beb1f68ba15bdc8a28d37b4cc333159961bdcc7", - "497ef4f5c9e92d8160f9573829ea0a62b1cb12847850d496b88282a9b3e0ecc4", - "65015da71f682bdc07e9a9cade3bd222c683c31035de7d098c18ede53eba1cc7", - "c8d50694bee1efe86bc241f7461199f7b7ef0b097071830c5174dd2f7518d0a3", - "1067645a114dff1a905a068041aed66a76d340a6b63554140ad73d1b3cea3328", - "ea4ffbeb2966be073351bd40a99e5195c1968ece00f4e071c16cd27bbb3fc493", - "c0cd270a519c8db3b17cd0a6842d321b69d8d27924ba201340e7abf3dcc880d2", - "0a29093365c609a76bd6bb8184478432b16a220fc69fc282eefb91392a031835", - "6740e8129b9776a19b10ccf38834999213d5143aa86eb1b49d5f2aad7550fb61", - "466457f7e44d58b1ca8e78d9cf29a7c73a80b2e77534a8eead54fe2f08941b14", - "de32d17ed707c8160dadd930c44eaa73bf9ca26b48bbf726ffdd4f612ff945fc", - "a46368a361a47d96c197d39a108ffbd2106350ea3b3b6e1e370082c283014d7f", - "c56ac0f8cb2a7df8c8e18ae2de3c5ad39c2a5761f241bab6668f8593aec6078b", - "be0cfa310b5effbde22a66c136f560a4c32735084b927b69e764b6518fbf0a9d", - "a487b41e6b0e6ca21c3f5ec3c3cf96abde98d288d7098001b8484a9c18945275", - "a9cc590c5315bad80b347312f75e149bb65fe1afa881719b79e7dd33594a80d5", - "72331c0055f2f5d97da0ce005aac22d6ecaa342643afd21604862a67aa5289ef", - "58eac4ecacca623e222c4bf0a4f74884e11f32d988cc18f5995bc831a87890ee", - "5fba8e8c7924a86c07c46f5c1922a3b70dfed80af8914ff0e1dcb48b744c461e", - "9cb14e33e4a1a7ebb9f1d75fb004196a546ddf04d8caa477ca6f229de624a522", - "fe3c2a1bee8aa73db40dd2116697b0d51fd051cbb5f37270097e4de77aa7c222", - "6e856bcdcad3a33f9eb78f94aa95a073c2de58ee0be9fa7d25bd8f87800aa6b8", - "8d6ca8e4f7d1e78f926fcea54ae3bc0b51529c94dad3372fb8324177f4333f5f", - "b7c79c814a810bb2256d3b3c99964a20fefaff04036e8303c878ca2aedc27bf4", - "db93e4ca6587c7a83776d465e42a2051010f9760f91e383b79a2d6c683ee7a70", - "0b12600006d9ae4ac8fdcfe727eb0cbd9c3b8de57f87c88e521ebf46b8543612", - "ccde691b84fccd31ea6833bd77eda949a1c71ea1fe4e7fc7dfb7efe76e78a3c6", - "8def0c7b8c2dbdbb019d8b5ba975b5664c62023deda8ea26149bd9a5366f14ad", - "920038186aaf1b56be8d17ab7d2e9d61bf9abccb60cd6ce4a531f2449dcfc482", - "2d7eeb04c3d4ff6ce523ffaac6dace46621253ccecae502a984eda0a1bda6623", - "0217b673bd48e897e26179c0aff1f1d7599bcae6695934981dec72c9bc294a17", - "80e216b1a69b9d396fb887218e2b29fa2c0cb3d9b19b55f9006f671ff84d168f", - "76f26de534ee48757b7153c52e73b7434a0159476ebeed4118bd5aae1520a1f2", - "59193abd0483069e964235d1c7ae5c9860eaa4642acd7e0f5a25524b913b440a", - "c44ade64c56f46dd8c095872111fdd51dbacc1c4e235aa367fb5d7d5ed6fcfd0", - "283c49fba63bf27455d5c983d7cb1d2e8bb1c2cfe1a44217f8275de751d6c1ca", - "7c0124e4a9bd1dbeaba836295f3f8734de5df2f337d1ac4d0aca33c2bb784b38", - "7ba474d8e42bb6af0e8962f9aa9a93e0e6b0b8106aa19c4f68f0dcaeb408d417", - "2c9421cf7cb25d7ad772d9861494777aae9c081c5f2cd5c99a7e0dd07ae76600", - "77fd0e4d9b8a808ce0b1039112eee73ce6e865d31a660ef48c5090dfe106d311", - "43fffe725926f5fb0b02c34e1be43ea43aafd2074931a2bdefce25f6cef5c10a", - "a3cf52f60c2c2f9a9ec3f439771cf719980cc90cc41c75cee181abacd75a811c", - "bb163ed6e2c2665f6bf82e65ece02ccee631318b3fa41148feb91d1e33bdf226", - "41b4a852b32a5bd0305ce932ced1d7d51c415e7f996e6aab33c9b3a9fc07d827", - "65e6d4d1ade1b2b19e425db8ade88268c2e2ecb57c6eb7319f682f565efba901", - "d685d692b71e2b564dc693b39a6a63520ab065f69e0243e4239f9f21462d0f35", - "2cc7325f2415911d115388297ef3fd2f0ec10439999c531b491e921152e111c6", - "578d076dfcf9dd2622645288cd73c2ab705398804c487b86b792cfe18ab6cd08", - "9b63c5bfa205f2d017eca97692cbf3400700ecfcc9194e0a021acba396604c0c", - "7d5d77ea4ed63b3f3bc94121662c1a685d11fa4de96df58010d00337980fbb34", - "bb9817b61d129f0d754e2a43c1144a87ce99d9efb08ae8bb8ec394d35c5a4f0a", - "99ac2f2102bba18308b2cf2fd43bc16827c9db2ed502883f9b179f319b8e5e30", - "66e72b2ec76020547031efcc984a441185922e6a5fe5327ed687a2c44a00f8be", - "54883a9849c6983b0711cb8c4b852bf4a3801a4b4360e42ef677886967a55995", - "e5f284c3806f8f99b5bd13a36e5e4629481f394ab74d9cce2ce21ac266a28277", - "812b8354c0c892e983c8ae800b30fca32ae176791e163ec14273dd1e3d0bb9a8", - "2da20c4092b4d89fecf60cd8318119c2054d588116939631f25c73a93791dec0", - "6ef1f068559beb36a83a4aac5e83c1da0f5b704591bdcb3f9052d5ad0f3992ca", - "8c0d5f68c6e66076f195b6232743ce05052fbf378443d932abf7072dd84d14df", - "0ac64d5e4921897a2a5f46e6a35971a5e13b6d506837454528b3304e2a150139", - "dc95c56dcc635619df86c57bc7856e003120a1d2566a5b64f8eff513dc54d466", - "35fef87732bf20c598c3d2fe0919e214a15adfe4f52846db8fa5785678eaa65a", - "78ede1f20edef9c65f6b0509f66e8dba18cbe58a135267f2b6ef8fd0abad5860", - "208d59c6cd7d81b90b78bacb99bfc651f045cffcced59903328981b89b3e743b", - "c764e6a07d8d8fa732dd596398e4ff3f5b02487e409e531e97d0936b0b816356", - "b739a80c4662cc4b0c5f410f1ab9c10c229bed8abfdc682991c8c54ba23158c9", - "b481423e46675ada56908138b0680f59481038e3ac277a218dbd6f069da5fc52", - "53087e449896ba10753963ea197d6d83795ff59359f5d961626da4153872ff33", - "d42e21094a6f37374d6b934aa848aab3dc747d14e9746937523090a8044e69d3", - "52a7584f704ca4b7218591ed4d14f734f9e87226ef0c1e3c6bbe9b3bb688a405", - "876747018748fd1bef934a9b09589fda99bfd9d47402f46bc4b365cd4ffc9ab2", - "159916e2095195661e058bc50a272012d9358530faaf224e0d949d04389e2929", - "e693177effc2a5199411544b4f2cae684864beb197b2d1b3635fce4231beb856", - "ba16c6c3a9a7ca6603f4572106687eea57e88a712f1a176c9a2e8a11ad745ec3", - "6415023a8235f781f2033b680b4fdace0d60260efec0655e492bce8e02d16ab6", - "80fe1fef8c9cdea403596be6a5bc4a77277b0e5df306d422e6e588f03f909f30", - "5bfad1daf94d19613e7e53f2279ebb6489907705f5124b4b9146e7cc60752717", - "0455c06af17b416e2bee4de8f7123ca5ad2d0bdc9877f91ac44df24b45d17555", - "4d0ba8152031b512e9e4bdbe3ef0d9de0f581608417181eacf5907f173ff4267", - "09db277d29c6de89e0b72f8e40548b367418b36cb35e32bb5179519e83fb172c", - "b2bae228d1a9dac1625b1704f8b6b2eb52e3a952c26c93e6e691fcaaa0b96276", - "4ae72c7f58c4856802dcd2bd379835a1e4252d318b847ddfb4ba70d897c4967a", - "9b5761617ea6487291d2e823ce711ca60b46c9a45a446503984be5a3399d0775", - "fbf98ef533f50c62c8e4c509f6b63f18cacd95ea922a2a43a6f579cafcc56cf0", - "058563e7c23886740de4df43a4ff004307883e929ff9cfab50b59099fe81e88d", - "a5add4d43c01460e7f30270ccbe849d0e893369a4ee1a1f1b64a322d6f0ecd13", - "03c37878959a9307614eda666aa7fdf74e2ca22e7ca43c77de4e3e42d786c5c6", - "ab79981e9c6f1788b702b856d27202b5539509b62fc068713abbbd64ab9a020d", - "877710238cc93589943c9df6b72cd2a753853be2ef8536f1aee168facdf835c6", - "aff3762d214f694186a98f46d3385f680b7abe11f79a126adbbb131f3dde859c", - "1afac5abd4b1ebc332c9e2f1d9df16ce1b57304082d96651f04f3905bcc16d29", - "3f606d7135eff127c6d34b15467d8019a7e8d83c46bf0a3b32fa316006c5e57f", - "3cad8262fd3bebbc7d539d4a55f88ff32a5fd86149630c331780a689e601f82a", - "1c8bde825d8ced0154d1ac7f147dc77162746c5c8d6abb6178a981e5219dde62", - "b3d03d32b3aa076f72a48b5d46c83d2a17bdfaff8ff84ec0ce3f557007cfec37", - "2a11a0dfe671873e87e827cf2c08361bf046abca9e6855f4a7012b64362bb607", - "1e7df9f458ccd777d43d30e4a930d85ab7d4401559c6f3aafbf7aba4e3b3ea2c", - "7fb66159b8c5ef99f0945235e4d46987749e742d32f48a1e53391b1625e5a9ab", - "4f5d3fea37df617888cbdaebadade8b0d983ff75eeb3a5d14a87281981eb9141", - "b1c33b76f7e72fab33959e9f874586472fb088e2d6749d93556a8c6f648f52e4", - "8b59e5d34a4c5cc7b44bee854f1c6b560ee0bdaa7cdc597fdad7fd44ed8fd464", - "0ac31deb15b9aa50f0cd4e96b68d94a433caeb391e9f27339bf9bb1705241f45", - "6deb1bcff960e63f0f35c740ce5a6ec019a76c6d126a292285ad776cff063504", - "e15fe48d59c361718e5edaa1a8e960553b5cb3e3d24ccab79e87c03edb65544f", - "ffb80536142db859ba90b8ae7af9c7f212c340f04681dbc7e6a6aef3dd81fde0", - "eccbcd7f96c16caa693392dd3510061db0097bee786cc8af9187939a4fd15eb3", - "e1ffcc95235476533e2c6e0ef3788e643016964196be7a60a0dddf04a9f381ef", - "64506538389e19fd238ef12f4b11365de86c3d2cfdb04276c62cef3deff1ad8f", - "43f6163873ee627bc2e2b4287200adc954456ebffaa5557845ade8d09982b624", - "a6c98d88a3410e1ecc6a64822fbf7d53682978aa91e5cb3d0893f90c87e01b00", - "fdd72d0143f33c6a63fdea1a4d10d4175681c6cfdf06fddcf4ca33e06c7a292f", - "2eaaaba8c4ad475f0dd171f55e07c7e5ab2f07c639e4503feda6fe1a186a08b2", - "c6cb7d30eae62ad4e220fe1252956d0385542c41136a601349e138a7a3d6189b", - "621006b075b9f0e77c04ac80f4c371ec65bbfb6f33c09b4edf1baf9c5bbd67fd", - "80a303ea728730c3486fd8d1da2cd90a3cb4e4b26ed9b9d11904fdbb5f13768b", - "a35b5591270c3f48a193e409fb8ada7d6d9decb6b527d8dddcefb291e7f4d328", - "f2c00ba3b6262aa31376e3657cc9e1c42108460b6ff8ee137217a2ff89b9ad44", - "868599b376d5df245e18f87c8cdc270a86a3eede1dbf12b339abb97789c5ef00", - "6f5931341f2f610d715b9c41150a09d09678fbf2bdeb1e9b1ff7ea52e8a5210d", - "4e0cc2cf69e73e7486ccb3a232c1b952770bd72a1ac405d18c0f4fc29b7f013f", - "26a8c5678c7ea5981a31f6a55fab9ef94578609d7f61eb3b2e80dbc25b1aa2b6", - "e429598b0dca6cce630e5bc19951ddc815280bbbc24a3990e50d601e7f9171f4", - "002244745e2c3203803d44ec8d2b9708ed71b2177244fa5e9b0a3904bb0f8f9c", - "74dcc149ffb8d6694e7ce4b57ccabc8f4ea475c560bacc95e473786b26cf2a0b", - "b79346e383ba38461b26805938d09b4c56d7ec31f68be7c704729d7e34bd7af2", - "eda0d203c7d9712c4f45b29acd39034213dfd969e307b9767e5429c81040d69e", - "2996d259544922ea756e35bea85b89c695ffc4a073457ce1a2774960deef8ff0", - "0c854dc316738ce5ed6be020b01b2bfbc81d651960f081dfe3d3bf16a23e88bf", - "b11154f87cb3b7b2b4ebf521c98681197c910a24ca32f0a54c7eb6859cb0968f", - "7f0dcbfd3d5030f76ba0526cf6681c4a7bf884ce0a12a79b9b19b9e8bb60d37c", - "760c808cf0266385fe9f3a27da837bd2bb7bd78a5a76d2ad65274227fccc8c45", - "35abb3abdfc69eabd8a55706c5e14420897a0f32426e5455a7044a562c48cd12", - "f4f3104702cfce11a55d05aa066b1810e383c3ee4e83600480751d6afa99d7fc", - "23cdbb1d4300be3cf4e49176f8428403a386a64695649ca20588634319761e46", - "4c2136d3b9fa744277778c32ada4146402aec52a324770399ec3d1c1bcc498b5", - "8fbd245c9d267b44923e1cfeec522bb7a06ad5785c25725ef7d15c30cf36f365", - "7c3f2b14e16056df22052a60173e843f4faac35663db34528270b8bb91c139e7", - "5ea91d797e824885671569acfef077b3bf4ae55441475117c3d155766c8ae3df", - "e242fd3aac9c4b46457938e982260c23db5c21feb4ab251c25572ce5ceee9154", - "c3bb72ea777034ed33b354c1836c5a08acc3f576b63e3964497127ae8fdd81a0", - "52bdfad86ce30e809187433bffa897b17aecec13965c5cd66329da57313503bd", - "0e0c0aaafa85fc893d7b694e77012dd146c28759d7d4244da5758fc4e637278b", - "28c4cd91e8820553b7fc5c204ad8ae790decc269072957e6f6f46d5c9829cf5a", - "1b9529c412349c51c13241384df10ae22e33d5e2affb08ef5e926c120624c775", - "02bed18f653f70f3e1cb9bb1ed5edf595cf349f2b477faf4e5749351af2ec611", - "6a9bcf22091da5a0a7b5030723e5e41f721d188d87218bb74ca96d9104c37387", - "ffedc9ea626d847f7a5e17344ffb6b8e46abdaf0e27f4d75560736825d391065", - "a80c8a0d512c9260bf0a1fcb7848e497787a1aca69602f188318f3f68975c73f", - "d31d1bae2275d1fdcd52a11b8a8da96fd6f7dd79c297e1f1ceb8bc0495e10f7f", - "aa3bb5949eff80ef413bff37a7ed663abfe466b7dd759c82c38f8f1329e0201a", - "19832e91bc0f7a5813f59046d05a4518e829498f3f9b6375a6e9cefcf0771305", - "79effdc4c75683d7247dde3703ce77a1cdaf26e55c1a023de2ab574d4441d990", - "ff59f68be64a42406c9d389cfd4516facd4f41c8f3e1cec50ed4c7fe2f50b587", - "f90aec145fcfb384c3b08bd07f9a45d6c10694abae105fc0522fc77c8564d399", - "dbbc31d0a9ca74ec8baf71795ddacbe492681dd86c0d406482db73ed94745d5a", - "cf2cd16d4bd443d4ac4351ee52ca2f7f4cb6a548aff3017498f906a933f467b4", - "65458e9a766fd0c3a65137d06b475bf7358062b4020e78426d872edc7c49f78e", - "af38759eb7b2331f1324e10609f608dd9f30b047ccffd6c381933d8b6229418e", - "8c33a33094cdfa4749f54f7679c71011a8dd8a97635ea889c55ffdccf8e83d44", - "f24f71cb74b845c523b32226314ff62df331cac258e0f51c0669258569b8217c", - "17192c68cfc16290b6bfe513db43355c46f9f699cf10462a47a614f93761781a", - "4cd7cea2958e15b15d79dcf4cbe4d6e165794616d7d08176a5d8d0f2b3dad6d0", - "97d1dd244ce247182e37e2587060754b44478535dfa99f18086e2ac1cc2f30b1", - "ec3ee3c9a1be25b5a31bd3bcd7ae1ab1e6a197ae7c0a22e6fab49ff43c4f6a58", - "c7276925f1d762ec473bcd9ef311600aba488fc9c20ba88ee0e9f54b24d58544", - "3d1f6e30208e74a2bfea93d72a1ee5d47131c566d00facb53a8dfeb33213254f", - "31a6f15d53322337329585af7ca3c76bd5bad0a726686d1fd4821249e9eb3e1f", - "c4bdb2547777d63b5f405c19af0a8426aa07e8a7065047ab8a387edac3cf58e6", - "5a1a4eb01100102273f157b77a010258223cecb205b7bfb11971ed76f1be5a31", - "d25ed48c0b621c0804344c908c5d999c2f12cb4fd4a3b91911a06025f4d2b294", - "55df12586201772182ace2e469905e81779e45cecb84995c9f7bf2de42dd3de0", - "e6562744a1983a9e07de8efb2f1d56747f79e6aa3b5269b89fbd3543ffbdf32f", - "00e937253de48955bf1a8e0d3f8ec5e09aba50cf061d40e8189fec16d76220a1", - "a77ec2508ad96b45e5efda52889ded10ba5d2a9a4359bccca58b6dbe364f193e", - "cb85c3020ce66467b2aca4a25d890076d123182e8483984edbcdf8f7b0ee7ce2", - "19f9838f4d0cfe71aee8009cc476ddac9ceda6f0aa84f66c5836d851ca82ad07", - "8bcdeaa70d53ecd48c9918c9f3711c05fdbd43bb3b45fec277b71fad52af43c6", - "3157832e054f02e3a7b29fbc5c6368b808fb61f90dc20f6f0d7e6c6f532111a4", - "b20dc8b5bb2c95edd9608d44087f8aec0a30ce5ed92f99d4fa89731a12022fda", - "84efc4a9f3c89239f1d830ce8d9398f6db5ab348ea7e6247dcd8a2cc28dedc37", - "7f08f44eb1d3908621c6fef3d0f0df3497a086ccca277373ff8e21f564e3267b", - "fc29c5d62e9ecc44a3a94bc3d796cc20a7b358960bfda5ebe94ffbe53e155f4f", - "bc12f789c6d95a64a4327e2a314d21d285d70e3ce297823ef006104578b367cf", - "f894ba9b7c160c102b93aea23e027c8c3a7a6c5128b3bfb8b2b51f24a61fb513", - "aa9a2fec35817968a1d20de919f89eb8a36373510df747966d2990aea95e67b2", - "332ecc7d2db72daed4682ec1ad7a6df3376ffcc51d5308b9ce98b28f5f5a718f", - "fea14605cf09f412976951f590e75c5e95161faf0cd01ef11a7948776980f924", - "a006d83b8c9aa41e8a5f941b3b39ecadc9b9614748fbf593850710d1e38dd776", - "3109c2f88c291f1f7f6471701ecf098a510b2155c149ca1b56507fb4efd0d7f4", - "8af74e78c4836546d6f2fe71e37f894fbdff911956e7ce42ca2f28db1ca62c20", - "ffd17e395528dd669ff261c984ac065d638204b22da4dce3e281268e25367306", - "2bfead2f659dc0c48d2b7b5c4dca6d839912a37d53f9ef8dec9140258b711f63", - "106025f88389112e1d9deb3e00865b90f1bd59c2f63ceb7db1ffc8d50bca3528", - "9c54fcb769d75d8d62b97e0c867c8300d4e09995523417c5dbd2fa3f0e76c301", - "5c32ccd7cd2a591edef6e4e24df935dca59663629caea2a2acfe1da6cd8b766f", - "1ed4b7e16cb18bb975e181adeaf057cf22f10a71c7aa89b298faf469d761a2ec", - "53a12514e593b215fd01675f1658a1b76e0dc66324596b832668dc2c827f5cc0", - "c5e0623f2701c0bd9a5f74e209ba7eacc0dbe13f76debb374afd47a6d9875bff", - "348a240e7f434dff4d2ebf7e81a47c251c5eb0fb01348022d6570a51dd3d6adc", - "61d7f8cc23ad0ee65e312d074292ac871e4f70ca821f25255c6b756270690ea2", - "2930a91d29ae0e8fd72f46447bc15d826101efcf89de93dbd6a92730033211cc", - "19afeda53f20d84d769841e24fb253447c496fd176eea11ce7493f98aa57ba7a", - "533aca4a96740f886a57bbff63767dbd19dc364835c90234b879091819afb70c", - "806f3abc785c6069a9692b3eb5f49c66c9c03973a969f1766377ab760f7a4788", - "8c8da4af24f24a8f608c6c84172ce71408631069a049ec348867c9ddbe1b3096", - "1a5cfc84af150b09f7620848dbb90beac17ce61156afa525caee1f9bad592a7f", - "5b4ee3be0d50110b30d85811f5a8b969000fa7790b04f3b5ceb4e0a94346d012", - "cf65e0eb09d8ba975a3df25886ce2f7981ff3d54ca2bca4e4de2620453d6d76f", - "18dd10c458fc06c170a046a0cb741612a378642b68e5a0baf48e446830d85ff9", - "b5de102f098101b9650a425c27f2f20ac3f8b4cb73e9e375a232b24cab1b565f", - "17da347403ddff5afb1b46a9a0dbfdd339804b91e2780df57d2dcba0d76212a7", - "fd215daca2398c08b22a243eb3991f448becaf60c11215fa8579096cd2bcdd1f", - "6300b3ce259da71a9ff16fa4bda60f0e1320c9fe8d6858f873e91c1ae9ff3473", - "4cc976aeeb38e31655c46058efdd3c845ab8f8ffb06cbcd2aed31a05b109c35f", - "96e9ab012d08e80f20e6901094c3748251adea31af4a79d5013dcf2f2610f2dc", - "1473318c0d4e25cd3c91cb56fe27982d06e5b61bd0d2dc684850e18d09e8434e", - "b0620837a64192a44175041e99dc85dd469eba9e56b225a5320d42862d5fb90c", - "d6292cdf16f838649e7b940d3e4ff097b6eba06db3ef067c7097a7a9b69beb4c", - "2a74a03511ba5dd46b3b173fce2fe2f649dc0f2407bfb63bde712a6b7d8ffbbf", - "7bae8a9f4223f7b1ca00f6264fad092e4f4284f9163d1de4f25c947a5180164e", - "f80a4a96ca59562c0da34dbfa03f8652bf74e30fabd025cba69358d7a860e757", - "85e7e823eeb3a07ee42a8d4f846cb6ddf5faaca63b2002fae8c7b329d471f51e", - "f16324d36dc40469f2e035d74664e64efac6b3fe7be221809a856f04af6d246a", - "5b017b45cfbe9cfbdb757795072d9366bb1af1e09bfc4b766c42a584f942b466", - "035c12b1c495c40b8f47db028553b5b6ee0813f4f117007848eec82975479e32", - "854a15ddecc768ae4256dbdfcba1e92bae7dc98a3883c6e5031a53247f415edf", - "7ffd6068265d65f339d4c8e1a82dac25ff6ca830be8bbbe634c120601c895482", - "3fafd98c9047fe9d2d2eb80a80330584851a2e398bf673f8d8be77c57e7913fe", - "243e3f1b5a6ad73ef14745d079c28f8a9baf09d4ae80bd9c8391d9655922c69c", - "6872d2afc96ccc41690b823bb21e2db5e88095521e729ae4a8450736ab753f86", - "b58a68fe9b2c5aa239bda9c7bea0ee933a517b05559dd17d710d4dd6b1b353d2", - "b64ec447469f624fc64f3262206b86b8a9a204171385a85f38b50c040d70aa54", - "e481b9b4fe32c558557d4509843ed9dc7e2d8f04444bbb98ef443328fd31f735", - "75395a5c8ce87a27731f7d846309315b9d7d423efc7177b4a9602480cb601729", - "189451b6cd08eed95269e75095ecc9805773166893e34a904105a6844fab5ff7", - "58fda048843aebb18a30cab831d2e736005e0338650bfcb432e52a6680e0d2f6", - "d120dd448fed3354f78eaf13c8949b36c9cb41cda7ee3ebf7d89c06c6c806bef", - "f315e441d2bd5c3467b44b6bfcac4b3ecf4730ddc4b895dbc1296577fb98b005", - "a292deae42509ea939e8f41c1320bde094800fdfb47a2548a223c6a90767cd19", - "d4f919b12c376fbe9b08ef886af938f9482ae2e1ddce27811c3b8d3ec31e4041", - "9a2804e9b01673e28e7e8f846685cf0a196abdfb42fe69fe4cc333c55209043f", - "c41b9b8db93b9ade180ed540acc98fbf19a051496fd9a15eb7215ca2154bc60b", - "f3239626278d1df91a9e0ed1852b779a2379781a860a88a5bd380525195a3ee7", - "f53b47b6253771ffd3b1f262329802d61621da6239c34b26ddd0807059a3a30f", - "15beb10ff1dc30c3d08c957c7683888666f4d8dfe9e7f696d2380c3e9805d771", - "e5ab9d2c6fd5375bac9c4c2ddca9c839f29fb4b1996e36f2a65de6ed7f0980a2", - "d5622789565004cb1973e15c775da25fed715a9ddee0a6b8c39344a3e4b0bcf9", - "b34087e055ca8ab9e12e5e2091bf0eec5751b6c18382b83faa1211ec7897345d", - "d357dd0defd4c29375a59c43415dc9a04f8b47857b7b1d3e05cbb3c47206d554", - "7f67f0f8582140f84ab94fab5db1f7327516062a2668d2a74970c686140e2e20", - "f6bcbc6e5568cfdb16e93900fad34e20c3b3d0f48a7099157f045784a98ed5e2", - "034c40a368ec5544818c9dcb102e97303c93dd288336544db8a0b3ee01c502a0", - "519d97c8851a85f25dfca46512a0b71db1f87f0689fcc456716902628dd04a82", - "bca7a35316026c705c63519dd3146bdb8b5ce323b494f2c80fe8341c1d5bfd43", - "3c9e3e9880f0a4ae188f0a52dbc7eb1666a91758072af30c89be200cee503034", - "c1bf373742140d787953834c7e22af7c811a93b8e65f92658f55fcf65e7169fc", - "9745d655ed2396a358dc5db56665dfe33239f135fa5267470feca067c3669391", - "e4200eae753f1e52b482463fa55565baaa624deef1c487ed7c3a075169901450", - "57be3e771d06ac9a62717b2f8c3831dfe0e626a5fc84cb27d380f0b68072bf9e", - "ffc526541b3566e966ddac8b7d210c71c36adc81995e90f60d3a7a7a7ec00320", - "95576db5e75405655b2f5bf496a62587b26b87f762a1b445e78ba2c7ec8f96d6", - "357af1c5ab43d15466b8b6e5d2bbf7d06f1a984dc3a6c32e252a85aa2e1aad13", - "1b23def59a4f5123d7f0e05efc759356f40082823d5572da33fa03da73f87d27", - "3691747203219d6730f7f952813e9cf33dc53416c583d62c081bbc83f5b97ef3", - "eed3c55315709da07af0bf57347f0ac0703ec7ec527d8fa9f6bd5aed114e0335", - "91884179a7f85e6cb73ac34c777d1ac95784d7bac1d39231e4232d9e979688cf", - "e70aaaa744466d41734b2ddd0154ebc838b18a9e2e6c472e1bc04b1ade0ec7b5", - "1e91b87593aa6c6d678dfac68b6ea5188e6716a5516e2ce4cda528d2621ee2bd", - "2c5ac3a139cc8d4d801fb35a018801994ab763afc4fe55109dad395ab9566565", - "f1b86ca3a28fe0aecacad10555061041c3598a35860498d1d48934f247eeb767", - "c5a50453cf6c8b26b5d4b8535d8d1f3996cacdb8e1586a2a0195aabe2b6b61d9", - "9b48ee764b24c7ad9130c5fa1c7d7a89403e53f48ef268af21c52fcce4cee700", - "3c69045029f69a05f5ff78c037228c3b4b2b3ce6d8644b9fc8c61d8001ecff73", - "ce493d92139788a95c2eb8551cd159689711441d49da27af9ad3396733cd42a9", - "77ec5d4b256fa523b28e30d32d64dc66899aba0c5086f74bcbee20a4417c0150", - "75819635e85e9480ebf26a13e62a3e0ba1ad67ac5ea4c749dcd2d5cad35661d7", - "6f666c4baf77dbe0c9c793082805e0c8904f3aecb7fd4406dd0ff0d2b6371101", - "5bef73d249a4cf1fce8047becfce2c4b11886c4391f3812a10755c984a445373", - "c84099031f2dc1058e044dc6cb5d0f91587670aad9f0224e39828c8543c57057", - "17690e8c673b01ecd42d94cc713ba3fd903a1192f5429ba133bbb403a2059071", - "4eb352a3e749bc9dbf9ea52cc4fd85d24df4d97b962c25bdd21543394ac0f166", - "61b17555b4c19925fc7d8817332b0f67275c6bc51e2747b3b5ccf2093cf3d152", - "02698810cb05a122ca651f55163b5b6455c94b3c03abb9a92b1a6cbe97ebf1d3", - "82cf8fb9324e59d7b3bce7fbf6a66fcb9e94d8d361dd801163b6eaafc8083e84", - "8839286deb45608ab9e8996b17ae8ca546f1fcd3f8debc4a1f400597430dfcfd", - "c06818d9339703f5ac0dd736c03a67bf0d09ede3ce3c9496928a02c97bdc5634", - "fb8c68f2e74e8ec5807e3661fac74fbabceaca5face2aa78291f0268b817d23b", - "c8aec6d575a780a91f11b28af73503efc3424e1dbf5ea7cc6b89a9b23b45dabd", - "47bf26e1ff7b3a85d9970ae31158b8ca14f63ec5e58a80e2cd127782d1c9a17a", - "9cf0f6b62f417efcb9ca6bd1c58f943558441ce5cb0dae563b7ecbc76907a3c9", - "7da9e73342ec59031ed78532f7b11ce0bf39614b3ab67fa59b625a35a0588f62", - "12c3d9eeb1d07645cedd172fe0c69fa0d87c67c8ce257810ca2c8e830e6f6d6a", - "a6a278d65a16fe34559ce7f795d58f5d7f4397dd327bad6bc5a1a9ba0ad57210", - "53a95ca9f31585ea98b1ee375ea2542f05a971cf7ff860a50f7d5c59c93865d7", - "3d47da487d5ee9e2e50113760e7bad8a11afab7e42fa5ff8906e80f61f2eabd6", - "166f4f82eb9030d749152b634c92de613f43033788891f5a4fc5376bf28ad9ce", - "206fb3c911a43fab7f239a3c94cbf3b48a2d3a3cc37d425262649e4add37ee56", - "c80aa7e4a2d5b64967516f5f2e90c6923c6a6cd62c6d68f875aa4f261bd155d3", - "0cf7a59738a3b1bee81fe745cbaa44cc739e8d49a75ada83b50aeafc17339db3", - "8e0e06ef05bafc6425c1c0acb446f0cf2995ccfd5dc6b06441cf3a0e65cdb11e", - "d08d812aa397031495573aa78402935049312dd6ffc3085441d71eff58b13227", - "abd3f462746c8697b3cecf826ae841d52062864e239d3402a62523cfde092ca8", - "0d6e9dc073e5355e2e8d046a87e90f01cf59ae55debe7c5f8c4cb818f7883212", - "af1b3271377bf28f3bec73a9814f619b18c4aac89c5cb7bbdec7df4ca4d156e0", - "49b6bc376660d81f9a1a4b942ad1025cbebd878d0393be1ce20a90897e157fb0", - "35d17670ece5f0f4e11c8a4d12533841c59987f4003c197d252e3eab85b00f07", - "c756b90896fb6718cd593c1ee42ad164cd762ac652f09532a9b902885e7ee842", - "2ba1119b4855c57b265d193de169726f2f2da35bbadeb02b7bb2706cb449bcd4", - "8e4656e4eb261ecb08b595b20e63afd455a7e4bc4c340d407ab1cb235028e8b7", - "a22ba46d9159da74632813d6e1dacec50e21bb850d13b2a4aee678d1c141c9b1", - "7ef125e40219149af008527033781432709f6ce6bdf798b55659e626c38d6e4e", - "e78119827f6ed518fa567fabcfe6f3692cef675b5a5fcb2c0ff4c650e2ec38af", - "b14906f876b348c883906bcf12bd5430a73850267a42d7fc897b02301ef2d840", - "0b2d50c7a13d5744997dc1f21d3ddecced420754c96fb6a71881b185133424cb", - "9656c72994090177f9117c61206b7316a8062a16e8b84202cf3b001a1d94e59f", - "369ba3804b1f76bfa59d4f92006c235a983469652bbb8b9eef7f07d96e4ef587", - "d7e5cb2ee5b12670471ed29ba89cb897a8f11707c345d3f6903321442d68125c", - "5528f0e278f55acfca8dd0915316c5444431cb153245e288f4e89e0b4bfa34c2", - "9dd0467d8d93ce0150169526edc3d09b1d128796456b731fca67ea07780d56ae", - "1522b1aa36e8113056fca5a79c96c39b07eee3f3c522ed65e6cf6afc051f908a", - "f0908ff3e23149c4e1dfea66451649fa12ddbce21b7744e6bec94dc2628dce96", - "1226eb671c7edfa3541c48553aec78a899a1e4431e9a62eabaa24a0058750b24", - "f52739d3bca253f7a6641c063b702fe250f1439cacf6978051046d118cca6c01", - "1a4f47121acad67f5f4147e7a74004de2d5155ee5cee8ae47ada462f6785a351", - "f1f59b3e3f050cb188c407ce6bdf4a4bd507ec959fb80f5a103b87edcd08ef2e", - "e6be47272a4c62c82433d217833af0c7a9edd3e77dcce2de4e0f3f430a694fdc", - "e0f98b2a9f0ec03da617e0cb1cd1a815b2b4ddc6aac4529cf1359b3985587ae1", - "d6d1f41717f8bb9f16cf2f7125b8563b517eec4a48678d6a83b944f3530ef125", - "67ba1fec787c0bd563fb79ae80f5625b3181c393f7c47066ee1cb4c7a3a38c71", - "55d1927de68b0279b2237774d9e22e4a8b130393c290fce177b3575f57abe641", - "1f218686a7ba679ecaff620adcbca0b67cb6ddf7a4b737f2f232ac86d7acbbee", - "dda9c4068a1a9f9ae76d02edab3c7c86816da711957865161cad81ecd7f5dc54", - "08ffcae70dca813311415ec7b418e15d739b0424d16f79b99d75255ca074fea6", - "13ac1f350caf7af7575ab0ff16bf32d42f8df4bb58ca2bf748e0c1c0ed65056c", - "1e3da361838a1838f3a3c5dd06f8d8c21037202af837755065f44a9565e448a2", - "f572ece878173e43c1977a6cae8111f4270e24e0003a06459cdb153580bc8a65", - "31f1776d679491d1608a216d7d6843506cd843dfc64e406d842a67b21baf9461", - "ec3532fe77c4f2b5aa1ada5f93180add0e170e4e8d094d689f614814c3b4009b", - "57302fad486391ce89161c0d1d42c57609752530d73350987a88d15bbe649755", - "6ff9ad45627303a858861291d17b778c38d916ae80c86ce8422779756abd7886", - "8b313b62517004c9c700c66775b49358547c385968d45f88637ae6dd5f3401f5", - "0e3148b374a4d65531ae123fd997e5a0ef681472962e11e31e5e19276c456685", - "41449c08751ee4c20bf852fd510bda693b4a6ca11a1be0761f3374b07a0c1849", - "437b4143a5d4ae200508fdba99412f68073dfb609c2d3dd5573aaa75f28548f0", - "4166609be1790bb8ee78399f6e621d72bf3a999a8ce98b8928e39d4b88f16f38", - "a585a8c32412c3ac71ff43966fbf728646c073365dc1791d481a7b9875d9db07", - "e79678a3a3ef53c28dbbba51c3df7dc63da1db55a023381cfe9495ad2f41c745", - "0692d4a43e62c113d83e85d129a53bc23224efc00c12f3093c57edb7a1f38a9d", - "dcc018f5fd12a06f38d41c2f5440d4e32a504fa5fe27e52772cd39cc0cce59fd", - "81315f1e07dc26d218e6bd96afae12dbcbd455f140360b4013e86c4bd72dd185", - "5d6a6082b236a89ca10f8eb56d67fd54bb686ba0b0573bc54e6046305cb25fb3", - "4eb6a621e02ec31ef0bb50bda5091f4a2c51407b09f2594d8f5fe7ec10ddc920", - "648c2877dcba49923d9297cd6ed4760842d71f22662f276f25b6a72d97cfde4b", - "662a34f47cb71e8aec86baa56715372b0cc0c4224b69a1b220daa98edee3ae34", - "d5ea6f0ef65a442348523bfcdb17bfbde7310cd4dc59f5799a521fb85f66a04d", - "ea1cf3be57e0af502737a74d107f5d0a45fc515cb071e076a2ccfb2fee41e80e", - "985fd946636ae265f004ddc4246b352c20ef3b4fca70afd221c963997c0f3dc5", - "675a3865cfbd3a8c8f6d8d9e79d0aa8380ffaea5f028b3b44dab74296e17504e", - "0f205a64d26566beeedf678c0a4b9e24f95925261ffbb38ac0eafbf7e6d0198b", - "432489582837d3a807b5220a04f4d4405c5451d68fadbed305ea748448c13d77", - "c388d084924081a583bb59274c190c8f04a55159575e296bbdc5c30ab05d410b", - "9003a239912fb6688e638e224cab78cde0a81f340df15adec23cc4ccbaea4ded", - "e81b6ba434cbb64cb4f5294da4524d0d5bec76e66baec41b18388526fa2c9edb", - "914540df7b4727c36c974143c2bc14edcf0f477eee523f655269aa3f89cf7ec9", - "4e667fc2642705c76d2abfe99cdb5f7fcbeb8b9c336c302b0599a18b12c5a0ca", - "b86b2e97f80a739dce2bfcfa13c18930a43f46089b5df92763f8daf97119e595", - "303e64a78d5069b3d0943be26607c9210fce250ad8dabbd7d26c07579bb87840", - "e1604f4d325e8046849ffc9d08125067bb4341795495a3156b75d55ca6c00195", - "2b991110efee416e6eeb1ebdb1ff6e0917d744f5553da0076e114f2a14c7dc6e", - "e5cb6274cd442a6449f05ca29d2194ec1a38b19a5e025aefc82d3feac9ce804d", - "dd0918b6384f10d82e387eb373d66ade8cd67473efe2b0cc224b2d600a9cf150", - "fc1d85ea728eefc221020651ad4a540532027e2f0d079f4aa59f13faee7c66e4", - "09b3f0a365b58e5fc10d05aea1c4f170479fcdb17b346245a6153264ed778071", - "fe1a73e413f2284771a52e7d4761a33c925017c5317a8adb39d66f6da41fb21e", - "9561b54fad9df7db12ea646e8f3b187e56813a5a0f548b46a9b0855e15573e0d", - "62d1fceecabe87b11096ebb96f6355ab58a89de459feee0b57f7b470e0d12908", - "4f5cd2bcd6768b09aec3d061feb0680347822a3675360725fe2d4139a05ca67a", - "973040b0085d571c1e6f564af555b73dc1d01f46488e9a45c3bbfd0c4c290a03", - "c4e3118844a3e479e5ac0125661f6dfb924671f333d36917645a9ce394b288fa", - "af37be6894cf1cd7066dc1de8adacb6a6f3aa58c090c23627be5c02a3a622c65", - "5dd4a0ab10a799000de1ede6b8d2063640c2d470b1652dfb9e34656fa6b4defc", - "e9ed2de4d3396c04c884cf95c56f82fc5d0c8950168ef10153a7ec5332454a63", - "6728814869406da24671ff5e61e7b026b367a368490110e224a1a8d62e49f788", - "bad83a59006d80ec819bfc4517f024a0510c65afeef5d7018a9e761db3d150fa", - "b466f80a319c566a6b31e683d3fc9ce4790838c483b8928819f43c91009e0889", - "5b90c62c19a76896cc7d24288b11b6720bd8d68d2262d4d856b92d811f8f13db", - "0e5da7a3586b41b2eb260522145c6fbac9385f4c56afba98e968dcf29c342cce", - "4162554b8a388e8347e2753b130f4e8a94e65f2dcdeea5dae551e566996616fc", - "1faa64d35a0547849d6f9aee48b366e1c0929b70704993fc8430fa43ae2cf694", - "fd7fd19ff3d61ab706a8f6d096ec354b21d0c49136eac27d616391a806d46066", - "03623ee122182e4bda739123bd635f7f8933059e36617e128d33d10f3a285025", - "b9f28e6e37d1783153ac8da4d0b76629bf283af24fe6d2be00c72c791314f487", - "cd0fe415a000a3d928d111315306c2df6bc39fae79f78b1b90c657c033b00555", - "30f25eedee5212741c539550424145cb363edeb9ac0642d414af65c853a43bf6", - "bf1e33c9dc80e0323d24da5fad9495fdd6a969817aa6aa2cdd1b9eb7d0f5d480", - "9babda0ff1d5c0028211d88be804782aba2be8924d499680c0a10fcd2ca2df9c", - "4153f599e87c4f5dd2ef309877a7af09fb410b36aaec02d0a1e2c71c9f6f10af", - "9f7a98f5a2339b681c6fd2a26722e88fba3ef9ca9711638597b12b9744842d0e", - "b49ba3a47485eba6af74046acdd6eb949c9af6eeb088e8d4dd7f9080f0eda958", - "3159d69cf93da0db11f44be915cadb402ecfbee25a76d4c343df48a7110370bd", - "c0f77bfdfe6fc6f0ea9e69216a9f0cb4e9f621f987444216a29495806aa6d8cb", - "c1c914874df4cc753cc9df7582189caebc6c8185b278383efe9f55cb26b60bc0", - "9a03a0790fc7f587658942d2a9aa86c94943616e60a11c5ffe524507059a13fb", - "decbafd7429ea782a177b783824d98a3d17cb027e36ab62fc5a7b888caedfbea", - "a702c1546ee3ffb4a06748bea67dd6b153e9ca14cc97263e6cecde8960e68492", - "e1d418ae7a28b47207e789eb60fd61b877a0abcd2017cc366a90555acfc67d81", - "a8f734e8371d86861a69ab07d35d4bf1ca12cff67981ab5fd08d58b5d0c81af3", - "bad84d17c7bb4bbce5102aaf648b031742ba5a41ffb72fc4f93559bd93ba0be8", - "71412093d2eff1f86cd69bda64e8067ccd35a0ba350163189f55b0be66f1a8c2", - "d2bd3f3f616742a5ce340c81641c8df5caba56ab823a8a2043b654fb5b886d9b", - "970a71f838632e661b24c89d051c6f4e0942fa1a5f065a1e3b161ed3cf6eca15", - "9f94794d7ec7ce52f0394e5c6825a0f1046e3fbb5dec0a4546ac8803979eb848", - "869575391c734042715bec9d15e0b03198a0f1ea5d11c3c6765204c32ba1c516", - "6c670c5afe256d48f0464930390ef0c100f3d1f39833afb0b0f9b9eb94052f5b", - "d4834f3a9847e0e7cc927183734d2002376977bed71c0100ac7165b36fe03977", - "38d2a1fd1b187282d116038c433afe75644375187b6c85c4c275ce79e2c812df", - "3216c42b01d70378bd1bf15e1c4570f81377fdff4fdb06aafa56c2bbadf887ba", - "6810eb57d7715a9853cc464be0ec09894851ed42e6f554133e65cb50d31ca87e", - "7b49e79ac2a4ef0f1522bfbad51b26842dbddcc9c00e45bc59e47c66170a09a5", - "8150067d076e8cbdd9c09d31d85db6d3ef72aa3f46e5837902d956e6542e0aa5", - "862e470f482a46754e6587bb212c2d7ece6d9016764a1f069b5efcf4bde71dd4", - "4af961b2fad9d02f3730f23a25c87159aeb0f91fcde0dce4bb0cf14e378319b5", - "70b9c0f500f056a8db7ea4fdc52ec1accd20d6ae0e9e2735cf74b8dd6d3fc058", - "afdd5c01fde59c2f6985131b16b4e856be2595e5d8961fc2336d822480eb71fb", - "8c941b5c4e7e100f4f8cc4b5b829db04c89f3b6aec5c7d2cabcc7c38a6e89e94", - "14fcd3b664fd2fe5a411f3585f2625bdf84f8e53348d02462e6562f9e2575a63", - "edb9f8168d338d11a23526121bc98277a43251bdc2d735ee69cdfed9c1b50469", - "df09300b876b4c46c2559b24fd1ad1a7c146603152f1c271c73435ff8c382335", - "c172533ee310d93cfb13b1a70998106990cae6950914ae307b1743cd502a6482", - "9aed3ef7ff3ad834fea84af460352e1d07c32f4897888c65f37f7922f53519ee", - "3f035dc48dca9fde6560de4518c6ca809b5972847272552320567c681dbe6271", - "ef92a549c9e1eee8df2553d0fb3127ed6e027b558e5d5180443ae21beafacf11", - "529af4fe13063b7b6ed339777d8fe9fd99d000c7ac4340b41f9d312ad7ae0680", - "4f0888a26814677ae42ef6509232b675b0d86e66a9942835bc9711c8d4776509", - "daa6bd1d6f47b0351e5f9840b54cbb2d8a903f540e1d45a6dc3c596fac3f5330", - "7280e4b2f911e8f3e8e2ae417e33bd36805715a565049ee9c3e442932c60248b", - "69133be8037531fb40d888ebe28915320011339b1792ef40f63f622a59e765d4", - "0bb1ff0453bdae035dec0b8234080447e2c9ebdf3aa02e0169d03da6b532b3a0", - "ffb20597eccfae2726aca31bfba9fd3eaa51fc23ccb495d27b544aa367d8c3da", - "8dbff7c3538349435e5fb7b0c90a58afe4e24b81baafe18207077dfd47b23e42", - "83cedb3608529809c5d5898ebeb3a7516d71b901045e877f4dd3fa1151dadf38", - "c592dc30e985dc20d6fbbc2b01b256af79409d232024ab4b8870bf5d36cfaaca", - "72bacad783cdae99505c47adc5d0a420a08131d9a61cbbac4c6cffddf4b77390", - "ab3c1349885b826f1401e52f8701aacecb4ea4d6dba98c128710990cf69eedba", - "503cc00f502ff4714c0d7f68cb5eb48a213a49f28579b7dfef72b96451be888a", - "012bd6ce0a8db4cc384363156e366b9bb1e25222e66d3e729275cc27663cb291", - "e0d83f9813180dc3d7f1b7127c8dc881baed93c20a801b2cd58b23ada4e6b6cc", - "fee4abc655d84708ecaceb21bfed4c9bf90ab78b66f0ee87587d48c0bcfdb2fe", - "ff81a4973f4266c628c97744dab15aded4b31e6bfd766ece2e1505d5b7311d43", - "4ba0898e10e703dd105807e555c18a5ea3de9e2e71e3f2164126be8dbf1bb2b8", - "abdae6dd45425d0debf508fbd84f7113e478de20ca4089d131efd8537f5fea4d", - "be83e9bde4b7b0649ea678f96c5765c3f850fd24b7400f953fc1c7ce4a14380e", - "9f3909ff684a497446ef33751d59cc03ca5bc643104e02a2cd7c12e9424822b5", - "a7516fb407ae34e7e873f81004b1ffdd7bdc2798e35320aae5240ecef6c744d5", - "e14e718c60720df2de8697148b724b4d0c0dcb4143aa8facb8dcba5661867407", - "61938e0ed205e5af897d26211976e67ecd83254a07c1b08749c91ee8d49add9e", - "2d4eb51c74abee627fee6b4cfc3c5a44e8bccedaaf1989462abe8b41b57bd1a1", - "cca4125e5a709a2174fd66959811fc0b9b740ba57859651c68dbee0c4307ec40", - "24e7a3234aed65ab89cf41f83af5075e5b2378c2e79399c636e2025bcd4d3e3b", - "1357b22814e702833cdf09b745a2dfa89d23964eb6faa8bcec17b721f97832bc", - "ee7b47df7b24eac78e5ec0a50c768b430f1d9ef42322857faa520c025c9e0ae5", - "22d08a76a9827fc1dc92c089c36cadef3c35eb7b5ac8ee3e87bf8ccac9219beb", - "f0c8247fb145dd53de1cd987ec4eed518b932d690c4eac857eef2d73eb32e3b9", - "6990a27ff0ef8ba92f26833e86549e147da5e8793d21c763939f7a36ea8ab281", - "522381930e2fc1336c2b1d3671a37842248d106c4fb017b360ae8bf948c7323e", - "c1bb00c6b1df330673591552f662f6106d74acb7c31cc716ce8333b51757e9d5", - "da1b2bb6b7d03c03552cebbc0ed1266c7d5b3d8f7f04b9e1b7b0b7f99341b1b9", - "444ed5e7f00d7f9bdd68552349bc829ed6d173ffb25cef3ae01be0ed9306cd1a", - "f4c281fc28868c8c7755195f896db9e412fcddd0d27090772f1e65dcc89b1f45", - "dde123f1ea46d1d6d8f4eaac93b7e55d363a085e07d3e4b8795694603bf5c0e0", - "6a0749072363d5f2db05c1650a212dc3554ff6b81e64343c15536af991dc6327", - "b998938c6fdc6992884dc57a02dc722ca4bac987889fe2b02f3455f774ac9932", - "023b2db453ccc7d07059f1f8142460a7fed618766703a134daa3b128825fff67", - "984e13a3ad297122caf5a545b497b9ea5aad8b775f7392cbab65f521f007e3e4", - "55a59172a9c1e270040c3b58b5a96d2a4c165c4bfc5de569a8364421cf6db699", - "ba911e185494307a1db00666118e61d46d5df18ca8f1c6265b5439100a39eef6", - "14082fa08a7f34331b565f45181fe1297ac444eef8ab044389909414e21082a4", - "6b96deff613f6ab2cce875e492ab0483ef02c35d59a89be5da43d266341cc392", - "6f9221b5f87045695f511f3fac220c8add81b5d489bc2fdd83ac4fcc8b480a4b", - "8dbbf53e669351a0a0863925151b2f38567e973fa450a00922b2d4d86d004cf2", - "37ed3e52ddeefac449104a6a74493d370f971fef5e4fa24154a055d01fb957e1", - "45ea52f2e68422c46cbbf6c005e977ddefd54b57d9658bce3e3656bf9090f643", - "cd7672d6759ff59c4c86f1f99c83694da44df468f001a1d38b43c3ee6ad0f536", - "706fa88071aa4941c4df6cef2f283ecdfef728cc54b10d4cc3f1f8c783897256", - "33ab7cd53a4ae48d64d66019e3968237d7a9381d0ec7e1f82905079bbcb9a37d", - "a2b39fb02101a6943657ca0d3a6af548c2139a6af4a1aabb1825cac451c6bb82", - "35de2198162fa2f29239a9e341ee695facc47df40264f9431bc6c99cad15e8db", - "5258b4b3e8638828e19944acf24d89edeebf53ac2319d1f811216572a5bbff77", - "8f37f099b1b813c00b1e58b2edfd9e6393dcb7239268d030f322d65bbae7b580", - "25f36dca13aa993669407a3af2eb6bddad17f202dee6499ff32a534eb501ac2b", - "83e68403dc0550a477634a362695995277537caa80359340fae6dbfe76a037ee", - "65ae131f947f785da59ff88601bc97f3ceeaa6b6eb16ddd150ef6a4a9928ca85", - "0c048b382c58e87c7f5620967b6e7b45582a3119cc8a035dfc5477edf79dfe4e", - "9a5e1868a6aad04f1828956491000d3f1a7b5affcf1a899765bf340d93506fb3", - "38cd1ebcfbfbfefb28db416b8c235d8dea9f656280ed83c8cc154847e4be2ecd", - "4904a291858c330abded8d53ebcfd485e5eee0638d1c48045aa248c24ac2252f", - "9226d14fb34b1e3fbf3aac747b66b03c9b199c70f834c5e7d58dc50d42901f40", - "e289860f28750a5165cdfb2ca659c64faf7940f3d446ef484ccd2bbb39ce6448", - "ff7a7fd24a646f290ce24f4cf76ee12d95dee4ff95c8fa51ffd0610d31f503fc", - "e2d42c5e878e507b62f546614d8b557abfe4f0f36a5f6fd6f6968be51c223440", - "b74651dee8c40c0b3fd5c04edc7dbe72736ac97ffb09c5413c569ae3c26728b4", - "0305b665500856e756501394ff72541c279a663499f2e90222579a3971e446d3", - "4a1946968845c36db5e35dde4d5e28aef541bfccb5adb2e49ac40ca15cfc7aa4", - "3afd609b53e27a58d734c3f93756970333b7d20b021977aa2869bd0d89e28944", - "554f38a4f29549d5c37b995bf3c2f7dbe04518538a334cb21f07793d0501e3d3", - "6ca3e6dceb8b3346dc51562052643a67197c3cdb9431b00b430c514f2c27a44c", - "1b134dc4476f1ca307c0793d8ff1d058b713df6a7744321cfa8e7f76365bfd19", - "bd15d9b10f264b2b8d121134f78b181ed2fab565216ab9bf93b1f5770f3ae2ec", - "2264774286827b700abc6c0ebe0bfb268193afeeba4c6f74444a1e352af81f3f", - "d07ddb188e1d38f9d05f01f5dd0fceeed3dee7668230d58782f2bd89cc71b1eb", - "ffe972e28d4671922399b91152ce889f099cd2936d79114b4dbb8f2c82d52041", - "f95f264f6a7aab766330b1324d122511c134c6a27567a407834514b77b3960f8", - "4c6de6f55cf9d45d207daf3c814a5173767f41740910162b20615f09aac033a4", - "1e60d5d4bf9593d48ed0039076f81ec0ca174bacac9dfc425ca24320ebb8cd31", - "4182df4d02e4320139a3c9997bc59eee835cf763a160928a24595a63c631b1d3", - "77e87af9f5bf1c476c7dad608cec3f2a8ad36fbf439fe4ee3eb07b4e598ae185", - "5a7b3bd6dec1ac697b604400843cd3d47332666d6330be3a900c6804523f9256", - "e65e9fbc159a2faa2657217b29709fc8abf33e6c2def517ddef0431cf1158577", - "ffdfa35b8a91091a22191fddebe13427e0a6d13feb87c05b4213f5f29627d681", - "be3d9c437885e6f2c8c21dc221ee652fdc1de39d0541fe9fcc5319b6cccdb33f", - "b01fca0aa7a42270035f63899d30bff4aee55b5e99c86c3b9d8bbe1bbbdc470a", - "bc4acaaa94a4bab93304ef3043a5c606408c7002c531d52a2a98d04c8545991c", - "ac27ebed8c0b67d7e3f4e7096256fd68419faff826661aa57b8c55d0b89df65d", - "8180fbd38a3ad3f26eb1a451c0039be921f8c1056e627faebf1d448ff5ef9b76", - "4b2a4a17ca59c9e33e86555d588a090cf3b05aa1e7865f72f166d3fabe575191", - "e206d72751fe0940070db3db7636b4c9d5cdeb76074aaf5f426eb01a7a8f06a9", - "3a01b0a8815400f75a5a07a2f6ecba41dae1ab5fade8f0f2afd2460693752084", - "208e29893a3280ace02921cc7a39458fd1bbd1ce3bcee9712909462730b0a0a3", - "691a13745541c859a51bddc9d8a11221f73b86b727e7a569542d734908e9e0f1", - "148efca94588178d350dbe9b28ef9bcfa7c3865af32a9341f54323f067e88579", - "2ab02994bdabab9de65cde771222efeec09b3c57cf667d598dbf0b05ac0adf2d", - "4696fb26ad5a10fdb829b2376024f331e9184e2093bb66bdda08fca888c2958f", - "eb187119afff7919993a9ca55b45db02d329adbea541fb6adad0e61fb7001efb", - "4cef22e18794755b6156b85f57deb5b8719af3a9700f37bfed3a35ccf5019d07", - "7c06d8fba7c135a3acbf8baca1472879c7838c5da3dad9c863aad68d1de3bdf8", - "b2a544bc9755e4182cf9d19b073e618ca1dc4c8791a9109d368b9b4ad3fd8a0d", - "00becaf575c93907b0bb8c17c91eaefbcd2c6c80f3f44ba057dd80a9160363df", - "c3b73a4a656d1daa665bb41ac1ec2bd6240db8e91f5ec190b4fb0d0834230842", - "4589c2072e0c9ba95e66c467570049181352271c4876ea264b53ef43d8e6a0f5", - "3e3ca40a0d3519af1fee0dc303caa3fb98aff8e3f1377672b557e7ec239173dc", - "b1c165523b74460d47dd1ce5967357efa9e7567eab78db153050916827373b9a", - "cf6c5af9181f01a38bca4b0395c442b0012e410a116398848794907ed07d3ba2", - "19a8a6c89fb53192c25d51e43b2eeb6f5381f7e502ff7627f86e00960544176d", - "03d1ec1b9778a5521f2217b9e0ec4c6e458939cfaf5b5e604cb49da06b6f658d", - "06dd73361e1f16fbf71136133d5ddee94588bd6dcdea3fab57f4390d2c5f948a", - "7e02d74fb847c9f4742822001e8e8d3a22b6fd6e1af103de995cd95ce03e15d6", - "2cef5263663387c6ff68ed2302c7af7d539cdcfb653529aeeeb11b2a4aa2975b", - "afff82cf414220b260f32226a9f4cbf6abe18f21b9dbee4aa9ca6e29a0cb08ee", - "d0108ed901347bdc98f0528e24052c58f4d302169d6d26eae2fc2619df8a2a80", - "feef2a8a6ce9ab9eff691d4e92e52c2598614a70f44795e5e184cdebecf511a8", - "c8afcba982436d57ed62e4e827d4dbd3e9e34c034db7cadce9ac45182c5edb49", - "8507852130b9d930fd870b8d9ba9c3e9ec4fd098cef85731bf5365443fb63030", - "e4215ea3f995481b5aedf416e529354d3b595feb18fda99c7af83084082611c9", - "dd4e02c685d8fe7ffec78503a17f8913811a459a6eb359a90996990268883e16", - "ef3dd34119ef25637eab4cd9a78bc307f405c77dfddf101c2f992a1cdb11c80d", - "bd5ffb2326ffef084f7522ed477ee8cb6c48f7d23728b9938674e9e327c22b27", - "0f510d3d065eef6ef737a7977b437a9b865060e1e8a4e8c3bf0340a6887b369b", - "e4a318483b872ceb512a366c856f487a63dc66b4cb33c686931e091f236376e0", - "2edc3c6b73d07f7713b752cc393e9b5dcd3a47b6265f5ca5da203550d6991349", - "b163335dccad9bc91d99ab5d0b8a5b6dcac038fa3fe4136639f6d3fd6a7eae2b", - "bf6f3c3528c19d08d71aa42886ce7f52c93f94411a50ee9657a04a88ba63eb1f", - "d31393bac140349199fc68f30c0fa1bbb23b144257b2370423f8237ba31decd6", - "c00618f63cf342d38638a70def79136fa79799fe328f867358a69ebffe9486a6", - "cdc2b3e7aa92793e9b58871a74f6c2011f1a007148df75557c0fe257a3db690a", - "5edc6e0bc5bddcaf991a314220c01fadf99f9e72d35412c3535467c88d7fb784", - "1470d3bc05ce40067280e22452440d934c0bc6c5d8bade7f83dc450e1e4fb078", - "f4c1c31649b58cfb143b72d2aba853fe0f06fee74c2f8a3b31b80cea19e8df77", - "ac0aa2827ea7c78e9ee1bf1184730ce615b08096a0f39a08f1e75153a061b8ad", - "d7a0b0d12df46ed0da67a3aaf08af1e3dd8333ceae8599ae8ca2b4dd806b6307", - "5c4512d7a27826e9ec8bc8ca0ce9da8c6f0482b4d585745599aa1708ff717f68", - "8b1fcea0618b2fe300fae61bac8630381c12fdd567297e7bff4ca73a1f1bc487", - "df75c60d0ee5ce4678da5970ef8937980881adea09b1456145908c9281f5f87a", - "c84d9ef4bd183c9555542db689ad04abd11a67e6572d0efeac02c9dd60cbd47e", - "6d58ad77781d4d10ebadc554ba5f52085059150a53d393a52d0d4819f0ef97a6", - "05a0ea7e50b29b85c580c38a454351c887473e540e8faf5000d6ab401318a4e2", - "cac1c44feb6e108ce802fb57982f66885cdb60eae9d2555627fba4ddad6d3be6", - "e5e3a33f2baedb9162d9364e535c179ef5c3fce58a6dc85710530560700f1faa", - "a87680b29dd030c86c79de9c2c7053bcf12d7b21a8c640ab8aa87b838251a039", - "7d009846155d352e186776f277a74dea57ca408e98a4728e66304b1b7896f56e", - "1d2f7c93dc5b08b3ab1c4a88a35a94bf8941a82d29b1799500ee1c1e5ffbc51d", - "161b704643b541f5ec6b9ccf866474d8c52fe2506396d7ef9c15d69ed4b3ce81", - "3cf55f4c022114cbb3c6e65eb9cecc276733c716ac9f26d032c4b3b33690d610", - "f024d5df1c81be770639b4c0aa770720ae90885dbf87697c5f23bc7a1381ad50", - "11cf6bbf3b4e5c08aafb03d343035624cf3ae3efc98287bb76f7c30341812da9", - "57a73ef4391e6c1f7edde3ffb7b8bb84bf61e1eed89caebb450b13442c7eacd8", - "f5aea25d0f585057e0c2fa60a599f496155e28a8e6c0f2f4933dd02e132690d8", - "7551751d0fdd14c1bcc20c8163d10382b34b54b4d3f7420dd8115d0681974ff7", - "1983054a6a9c50de116e4eff793599aa44bb9fac85c72b82529347e5d161784c", - "ab4b018d12cfecca069fe127e5286c791fea524635b6cdff0dd6d1c102b5d465", - "f78c1b4a52a85d15dddf8b5fdc69957b1052977660be56764cbf247c03a8e5eb", - "83a65b9bbffe7a23371f59b0e92a705378a2706bf379763ed163286028ef82fa", - "5b459021d257d8a9cece0cfb11aadf7643d0f2aef0e62b34b5bc37e99ee24c85", - "f5c4caf0418c05d747074e4b712b784631afe86bd412a2f88369a140436834c9", - "0f9e37b7dbe0e557c1cde224f87684fbf8f2e8850678ac235b3c253f5753ae5a", - "a9852b528d90758f71118baea74833d1936fa77facf6d92f77b7f14fa5afd709", - "46b9bc9d539a5b2c41865750f044af676fd9dfe74f8ae1382e221543912491b2", - "f99b8aaaa31d15320e461f86604fc88edce479f44ec7fe2ea4e53e284b4f0f4e", - "fe43d5426ac9a60a04dae912a924c3e4794b150f3cbb56f7a3f043a58367faa4", - "45c25f830669fbdbe849c6041b0417395ebae55a7ecbd47f2fa9f339da76dafc", - "2bd01a11987152a3dba05602fa9b34632ffc2f5242bbd96e56b2f06ff8c7de8d", - "4ad3456d7381bb245f7cdc44be1d50d68c73178d0bc87fa00b544810e3aad3d8", - "f36cadbb9700fec5c477cbe91d5c1959f2b8a7940542d0b8227e6eaeafb1b767", - "9ff5fc52b368f2a5163e66a869f4e238c09578ebbf059b78d2e1088f990fef2c", - "0e484d97614f78967534b649b06a369f44b9936182809ce1f7d6a9fb7e238c57", - "d8a18d2c988c1d8753d2c59054e1c8a7f97403f6e1cf59eab1482d252395144a", - "2a87bebf700941b32672054f15f45a820a64f15aff2e4409e310d1a415efb965", - "11ebfc236fb0826339e0655d2412a0c85330b0e09aec4ab57951037d5c0d175a", - "1a75129a5870077122610ccea3f80f20dcbf82f85b4d5e8452b9c097e7b0dbda", - "d2dab4a53efbc05b0e4a8c869401a40cafa72414a2a7ca0a6b2737f892cc89ab", - "644087da630a0b39fbf748c0adb870d7349e27a5c7b800f57fe2558d0728e594", - "1f38d69d35eab6818e61974be5ca41cc58c6a3d36607fdf533bd63ca46883cdc", - "078e3411f83fd6449dfb7463ef83d4a4ba2f7514b0625c02ee60ac84460c6d9f", - "06a96329e5562dc0f4252b803c04a13f1dcf1caf4b8f3d907b99217278737457", - "03d89b5a0a9ee046fc88c06f2355e48f9840b633713f80f6d1bdaba11b7467d5", - "60a405d395343f36d044b73e5dc48c515b0431d868c58e2ecd6d3f3d45d60dce", - "1bf7ee9b38ada77bdbc14b87621923d9542818f00889be17ecbe362b982415ad", - "d23bf30113063a01a60902caf342856b2ac96b07f1769276590d87dd404259f1", - "15a8b14617258d7aadd6ca92fe4710392c6b8f073ad112a17f17b2fb877cbde3", - "775d4b6884cef517b34f1e318d529512c284ca6c8eddaaa60acdb27785100677", - "d2f89d4d614a306690270c061b40edbf5d91bd78dc2ba4434dc10e89add829e2", - "b852d47692cee7d5ff85b32d22094e2d33a3fb4f664f5e70128a930b50d25ca0", - "423427a3b987d351e27a5ca288c524122fcb24102350c7120d8119172f08c77e", - "1b85e64ec67ed3af3ac52de7daef50a5baf0a79139bca6996ab4dce0e47d9307", - "c87fd3a0eedb39d280498722ddd13410bcfa9ed118fd50b82ced9d4adcc300a1", - "4973a0a62cd08eda94a5c6be41fb82efed6b4911a904796fa170498122b90373", - "d22ce00ca5e4373bf7f93502b898e46ca5ea9835860c7fd7db1d51b230b66cd3", - "7ac1d69fbea9208a271882239ecad07502e9fdc71536a56f9c5933af52a50825", - "e4abe9363f01f3e3a4342475452e584a3db0410458409cb2968eab89d47b53ce", - "f9d9358964016b1ec00f30cd07b75cfeca5203dc95e276f7381f119e81b3d361", - "f8c8a743e3028d956e6481437d969de628ba7ec44be3068b9c39c6803fae8b72", - "23361fa33a1454a6b1da1e21082e9ef1dd38aac85a03ac46c3858d67d2913257", - "9be9566690be0c5b7ae38e9e9caa4c9334703c0ec815ebcfeb5670bc238507f1", - "28cc93a50cbe9ca28eebf666de291bae9f525f4c19806cc1364ef50f1fcddbc4", - "cef26dbc3410748ba6a4b90f9f5dfd4babdfbf9163eb0f2264546553f844d1ce", - "cd8a78681492fe59bc8796dadd72a22df8195adf515cc26c2822bfef594881a7", - "d1bee60b945b5ce512537ae59d4024535ba4086f59276ac23fd014e49c521193", - "f27df063f5473bd40ea3ca0959c1e3af723257bc93320be14165c335f83dbfd1", - "cfb916a6f29445e37e5ad8cf3d1016fbc7281f1c0ce87626b9d8b7b6802a4d1f", - "53429e96c5076f0c8c13037abd675c6740661c3da43d33b57f92748a0c37b006", - "66ff77c062ffd8e771080cb74b74eed006727617839f8e0c689c8d843ff9305b", - "b90b533e73f9e4c09001209650ad9be4761f5f6a1623911089b1dcdad5433c0d", - "d94fc84b5a6a51d2a8554ee38884a1459e40332486c5082e52f58b031baccef8", - "10aa920a7b7a3586751d5c4cb6ff3d46e089c2e734a219a3bc452537e8e4a689", - "a0c12346ff3a087016d64b48e1e2ea49be2193a852f3691b497ee5a92bbdc3f6", - "d4d3c0585b488b16e517355e405c9805361261eed2fca0c5f34b420fbe8f9e02", - "1e62f257fe63213282e7f9107389c88ea00c1bd3747bf20a643a073f946419be", - "0e61dfc966b2f6278fe7caea6923612eb200615c55f44d78eeb0c88273b04caf", - "ac7aaaef0faa465b88110cb7c3ba1d15c8dc9804f42aab666ff443ec9e5e1a98", - "70f12aa0480237d41ed7e88e0487edbf1712cda1c68eaee84fe2c2a4df5c91cf", - "bd038bacf8d9cc75e08cb7657e8f123112d984f29ce1d71a4f280648dbd74091", - "80cd83cfc02726d9b9bf304fe41d3dd6210a70ee1f7070345a03d992c4fa674e", - "009a61938d4c507a58337e0604244343bd2dbe2939b6d282bd4d36687a8b5764", - "fbdf6e183488cd0f4f4f05189cab9f750620b2e9dc4861cebe4c306b1c746e9f", - "af7542eb4f7344e68767ea67e4f899ec9f5faa913d6b7cd8169f6338be5a0274", - "1392950b3cfdf48096b899646c6209c6b2a58dba43f48d969a379944671314aa", - "d7240f03896fb2b4c55a4cb8b5d20fac18475cd5fba9a8eff4f6528c96809834", - "cf534c575ea45285f8fe05e778bc6561daf858f9e86c0e67b30efe0913d4b244", - "cfeef73d2be1dff2ae4a737a2754ba4619c9749093d8aaea61315201bdb88207", - "dcc5a386b3ad59060f24a9d283f2a505ab01b09126528ef7480e7fcded2ed3be", - "c4ae3b537abccfb39540a02cbf355b2005958222c161928d423733ea5d837ed4", - "e29e78131607bcd915438a8d3fb62c3585f4ea1eb0e27e04b736e69bcb0b7dfb", - "9dbc33ede7d58d94d2f4a9011d4cb1445d4a6d6fb034a1dc9b6ca48b04fa57c2", - "484921a0f52a657248be6b58b783badca9066d1745e071c62268481f654c3d62", - "5f06379f1f4404a64cf162328aececea64193ef122fdd8ae8993abbce339668f", - "925320de0aeea9bf88fa5e679d186b4caaea239138987fffd083e72639123cfa", - "5f5a9eee3ef675ff53cdb6f21116282ad81a5ce39f8c4f69239315e392d14762", - "08db25a3741e9f305483914bb84ac92a164302bc5d012abfd1fc83cc65aaa92d", - "75951c52176fa4c05ddc6ea18ab1727021ecd4aea06a482e8218f60e145b5a73", - "2da49b0947dff6757c3c8314c8b9a96bc00e59714cc6d07430d9d4dfa45640b4", - "9a5179b6e348b10c4bfe55e74a6a94a53a2a93d4ddb250e661c103380ce1e6bc", - "dc462a17242acf0eb77c6b900cf876bf735a6de84817e44d432b353f0df7112a", - "a61cda149456f1838aa00f38ce7f3c6cd966196c2c369705853ddcb2f6ef0646", - "0af883a80b4cc9d74a38fdc81408e9b6c4cdc29fdd88c102446dac1d59edda40", - "74e30be18383e5b87beeed73046689e28706087d024adc3135c60f0e48d96a01", - "ec88c94bfc1c577099adf96e557615cb50f35c442e6340190193b6be6904ee0f", - "03cc31bc897bc26a33cd5dc018c2543f18a45e8680d526dc404438d7f0bb3bf9", - "9f2aff1470d5db349e29b23a0f4b26d7545046d1c7ca7fe235fc50445a94443c", - "34ce14794ce5c0412057c1ebf42d3e296587ef2f50ad42e822f4f4031584a5d2", - "f0cf487e602c7bd2b798aa4e5a52ac1ff51095362f18327ac2a67c5509bdfb19", - "e3bdc651f3073a344156c82695018438f105160f2a5e1d54382b78aabac14d1e", - "bd76924c60837812f27eada242ecc036436ca365133738b675e38f2e6130a2c4", - "19d90b0cf35e75aab44d91fe5eba6fd8c95b2c4553ad49cc95f5b4bd0426c29e", - "99f2256d8ecc33d9c5e5e2cd07f7ca5248e3a3cc5d9d0cedc9c94041d08b0a6e", - "642c9a64175ca4833130ffa9359c2d8ef274c2458539b2116d5f91a48e0c325d", - "ddfa915f533e1427be90e256f8bd9df10edfed4fe14d1c8855d29d9941cedc0e", - "af52f0fcac352d9d1eb9c5cc7f2ef7d5dffff8d493fb31c87901835f35385f13", - "650fb786a7c3ec96fb59bff8169b6b2a9dfc55bd055613bc3590f37ddd723027", - "9c6749aa225af2f470ea648d6a4f7e84cc24b96e653550cd7edccaa4df9913cd", - "c665dcb73ffcf442170557635e777560f211aa6d5837c8ae3527d86f14a69fd5", - "ed61e1492793267603061d94761171acd01cf8694629761a8a0d16f3bc685e19", - "4aa93a6b0631be63e9620f70fe1a58fffe8edbbae132482171dbebca60aba8b3", - "0af111f98a1be0eee5fd6b129c42f771d5f844e01b47f98c47a3b2df075c08c9", - "0c2e2d4fb42384b6b17593f764047bbcb7b20e31fcbfbb0597654216a6919ec5", - "057869cd51ecf328bee4c163b13ea6ce187d8dae54631c497bd67ef427f058f5", - "9625667aff802dca28b35bbb6d3d85cb6433749bae6bbf9207f1dcd504739ee1", - "525c16f3a365b1746475378dd3d49a14af26fb3abf7f48ec30255b3c1d7d67c8", - "82583c50b615dbd577ecf81712e422abb7f53239f10bb5aba59d404971ae63d7", - "324257a0b62fab64fe513d9a7f649a08699913fe31f1b091edc7e6058b734b37", - "ff53fad29094e8bf98c0a3734a27363931e751c276be09632602054549cb3e56", - "32ed36f838f9d9e41cdf5fa33399d1d5a3a1cbbe6ce93fa3af486a23c0d869d4", - "6b768d5f4425429a3d9eff8844ef1f77ff44829252ae2196d161f6ef0385db35", - "a3252fb9ae92a0e411d02c0318f05df69de8acacdaa7afa21fda727afa80c8d4", - "a92e2ad71bed3904fb7508185a5e3ea6fa2ff11b2b4f8e254f0aabbfde239d62", - "b0d8515a639a9b891e6d9deaf549bf6f0d0548da8a8ddc29b76cd26178dc3cc9", - "9445d0a91fdab96d2de5462ee54e86bdbff7e698911bb89e1eb4e77f17e0965f", - "bd5295f1a5b7c39bd7f56c482531da7d34dd938ee6bf6ccece5acd027c349876", - "27f7d6f2b669fd6b559799e0551a39e3248d18b2bf060374540d3edb9c0aa4dc", - "c3cb50d2f67ffb0e25427c2cb0487fc7008b87db5833a5a2bdb866995cce59f2", - "b0189a0575f94eba1042c4b2f2dd2502531bf70356d01a8440375cab997c849e", - "1ac0c26979e9fff78ed3d027d0be71a24fe8341cbbca27cb46bcb028fc6f4d49", - "6e9d44a89dd70d011397dd9a7bb126e504ce8078552e8c20fadd80ca5517036e", - "226b9b8ca70923ad81cdaba5c0462f8900fcbac1ae62ee478be2fb070dcc92b1", - "1214d22399d54ddca4f29aed4d526922a0913b85e1a1d932e74b1cf19b8d59b7", - "984e110a28d71152f6a8a6d255c31b61f193e3227288c080b94f07f1f1762dd0", - "b678740439fe33030ac667cfd5b2be1c422aec88508739b8bb6909a5dfd8d77e", - "9b6cffbd24e36b786588fbc42633efab65cf4354d9751c9cdb34b5aef303d7c6", - "cbe22a2d09235833f82ed04fa8a4d5beab2471a178661a6d48b9d1869580a482", - "b917ba77751a9a678aad38445d3dd0a7713ec1bc41dd6f61f69e532a4e850442", - "447e31c00093e77123b2f895eda4a242e0ea68b1f043328110c2789009e85c3a", - "787ba68988be8e9faa1cc99726b7feda17b6fdd36fee42a2be9bde4a0e710858", - "93b416b2b1ab64c2606781f2955ad954ac18f7313bdc9f076329694cb351461b", - "a00f0cf4d7c40a96f3a09cb63cff7d4433282d675532d9bfe9635108e7347fc1", - "e26753aa96a82e84c15142c7429365f33be24fadd6c57257b76bb50cd3a52184", - "69ce1e989404e1c80fe813f4242c5357bdc987f48bdb5736ece3578d57be6a1f", - "2011662a5b49b8413da09c37e05eee61ec019270ebe41d6a9aed1c39ab3cb3eb", - "feaf0e8aac25f9bc8691cfa4a28d09643665069041daa039f57035336c86efba", - "2567c645fff9b721d6b1c48713ec1733cf00cd4c7b07fba7a3c2c972d3da382e", - "284ad0698d75d427d1639e39bae7b4a518af42bd5133c412512074a270f42e30", - "f77d707f9e73cca5d9a715d966c25403a1db89180cdd0c34bdcfc9bdd44c986c", - "4c9f86047575646dbc2eeb9172d1c86e74d5f372a83f9dd9c491821c1034d0f0", - "fd1758f74a14fe46af9b68459ccac960046ac4b8cfe09e278ab1d990ae378084", - "7eaea37f06d31f5644efe3cebde1319dbb825f67981d64614d12d02bca290c35", - "6d60ad1558bb2fc029645229783c97b1d794a594a025aecd62c647e09de6ef3c", - "5896c030e09ae530721cf6511847e70ca83a19fa57fd648fd981492388d664ef", - "96acf63364dab98611e875ce5a255cc4ba97e92df4cf06f885dd8c4a8fbf2060", - "da8572b257cebfc8aaf955537f89b3520b9b3792db82639f6792bf11100febf5", - "fbf87b4eb6bd7a79d87e8a9eb5cb0b73d4c9df2900f703f3bcca911be9c4697d", - "eba9ba06b67fbfb8961622fdf764aa3569bf3fdb04dbcbecd442f99189ab3c1c", - "196fa78fecb654f94c4125be984a43462b73b81086db93c71b17b14fc3cac678", - "fa64d5546c652591eeb92de0ce83684eff311d2c3df0644eaaebbe93a7ddc04f", - "8cf723e60a7dbf1007b31ae16b2b994f80c1298ec02ed42fc0fd4964be043f50", - "9b9cb01c8e70d1c990f5b021974edc8381cbc0e8d56765b91a15ae5de5c0b1e4", - "4b56fbf2bceece5d76cf6eaaee2f818ee4ae0e79cd8ef26c8a5664bcdc82e03c", - "930be659b1811129dd5cbd0d656eaa900a8fde9023876b525d9f2f9258bd4893", - "4add422a939c240e8a3d008cb49624e816ede7c6641112d34e335a09316e0565", - "9ba474b42cc5d65dbb8b8b8dd2fab9d96f4e8984968b2c4ca5655ba51e9501a8", - "74b422e19cdc0bdf6ff67463d5ed5812d131ad3c5b58c85d17973f98705344b2", - "9d0fd0b6f0103b021cad07ac14de75cbd2e231093442fe0fabe017c36c1dad90", - "1abaaf7ed326b992aa74ec9abcaf6dbf6ae51da18a0f08b4c8c465c7ba32ed86", - "e8bbdce8aab9e9bed87432f6fd013dbddb2db7e6e8e2bfde4d4eb498a16de966", - "a0224650d455a5976753c1bbdb636f7e7ba7878823dba0fc86c5f1f445d8e193", - "aed0feec7f5b49517b847c8f097c967768db10a82cbfc6892b3801c7cdaf7176", - "0d1afa81b5cc5253b49573dde4e2f1b98db4a623f0b85d6fd03826e14f10591d", - "558aa15bf8bea37d79b223eebc9809a35491c4b69f9f008e3478b25797e4132a", - "f5bdbee9ae5585694cc0a43aed0d8d903c345426059552f967b2b428974f5cdf", - "bd21af82bd93a41a6cb978d1c6cb168ab42a9642d4e683b6029e16ff401dd12d", - "e112eea6cd1f440999239a209edfd401d0f8de089a04842c587c3cd3c04802d0", - "aaa26f2a9a15b7b10283542000493112e3581449a908b27334a96c06ec72ab6f", - "1ea053e9c988cf372d25233cb5d672a77b91f68e36ace0e14188b447cacc329f", - "fe2290604f272aa7a9baaee5210e90ca03e89d5fd3073d0e21bc169bde3c768d", - "b85873a2f540c03252b1eb517bdb282ff190044950ba92ef97c6684fec1da6b5", - "34b166dc404f8d621017fc4095320005150f3c966f215e166b86803493af2d38", - "0eb89056b55d077e00d3fabe3ca88f8743e02ab9045b5100e05766e3cbf5feb8", - "a1b659325ed82beaa6073d6ec23f15878c50ac0be0d9a7b5b30298a57983f931", - "cfb62dd2586fb03c0c44c5f9a9f4b183bd740680634fde75ad110f1d450cd932", - "e8ba9d0b63171168090c00a732ce7126bad124d660668e5c47a9798a42f21da1", - "19552c1f7e579d73fd0803b10c36397debe34f2ecfdfcec1427a88e98d4f079e", - "fc9ce21289908d95f276571d578c50a4bc42ee5ff1ac9014e50bd41135a88576", - "675acd8dbf2acecbb1a02fabe98d1ec569f8899c92111b5ba81d6a837b210700", - "4097826c8382ec999039cafebcf0172374c6a162d2822d1d7d6efc3cbf275a9f", - "e6c353d0995446c04dde81198967cf63f9e96713c2758d7b7e9c4771e27d7db3", - "7d2d9183eef6597d13041ffc16a0c0d07157fa998f4bffab22d7af82d85d20ba", - "48df6b267be4f7d8ed5820763f8485ffab7389ea8088017008baff7b422fa462", - "9b6c7d86284e9cd32952245808e571e2d60a9b8068a1d1fc510151a74d84d2d9", - "8c66407f117c465050f7377dd5b3475f2159415556c9b40ccf3d105664b41327", - "be4613392c01c9933485f944a6ddbc69d85acc31c0aa0ac40a0aeeb50effc917", - "5b32491a106905cdaedb0b4c15aa85bc33ba5e8d7e86c92353263d642f91cac0", - "1beb723c6c1711d97478a1402cb986eda5908eb310236f430685162959dfe004", - "8bd9d8a6e612004fbe7caf5317dfd24e0507ba34f229de89be710281f2536bc4", - "1dfa1bc78cfd2907d6e10e531ceef883661a21b1eba267caec3e0224e9d16b1e", - "c0c271e482c4b7fffadd5fe7ace2f46379f052cd7c2dfef26fe1e08779a2347f", - "6cc622814c433f5abc4ac551a4d84a4b28f62a6b3458b73054e97cb951df092b", - "d74220a23ab333b641f991ba02fdf83e939494a5b04602e313eaf98a24cf907c", - "a0c2300b3443327f2027043ef29b4c618968016c3fb8922f378dd121c9bb7458", - "137628be5feb7c80c8034b798a7411867c8f0b4e59027f31aeffbf4428e19657", - "e20259e255f98b9b4de8a2b1ffab7a1c625815957939c363a3bddb2bf1917cd0", - "ea27bd957cb07356414108e75216136e4769dad9fe818771afeae15963005f6a", - "05f7da0e411d1a8ddb8fd9091610b6a3b3fdb56b4f310b62b1c4e0901f1c8437", - "a58e6fb7faae34da3a1ca5e3e217bd162050906d99292c24a9d7614962abea4e", - "f90b85ae4d7157830a130853c0ade95cd110c76735eaf6bb5523a41a42cff85f", - "f6408b99b862c91060e27da7f6be6c813ea8f68a388d2bb8b46738575a0ee850", - "81a085cc036fc8529f207aecc2c2355013f592a4381504d1d32204d8ecaa1c97", - "b36e6d69a44ce437f1b54658bbf935a9b2222a351981676581f54367823587cf", - "0ee8854884672cf196fb2de5dfaeb6fdbe2d9c42e6ff20fad2d86051c4a31b65", - "d879f8afdbf197828ad8d231871292228671a2919797b59ef03564c1a52cbe20", - "81d29942cc9770cd0ff7f747acc1eb5d025adf8524d57bcd9bcfe2da7262d498", - "dec9bf0941fa21321f75a53510ce08ffdb4a89169d9db2a4bcbfe61cf2d9d1e7", - "643a076b138f3d269745cde7d033c040867e74be691c442d89dcd60447eef17a", - "cdb27feba2525f9550abafeab3c17a9e865b891d75aa2719ff0a14c86d1ac15d", - "e490f0ce63a1105d3980783badb6179c286b31b6aa548fe46d00593f10bb733b", - "8ed595e03edb94c0c1cbc9db12bf888183e611d835d29875cc7c0043906502c0", - "d6d0be1661caa94fba6f1ce30dad7a01b7f1f464e43b739f5ccd8831680da789", - "902beaf0f568052ab6d722c4e7d12b533f6396d523717b0c2cd99f3ece8ec87d", - "bc82a076f5ec99bf508d4cbb599bd7b4c6857dc7ab455c41a3150077ea141087", - "4d54fce0101ca4526cab1262839e06c821a9d6f7f2b4473ee5337cd3ea87463c", - "9b9811c984c788275a1ed9f98502b8b93b163ef88c4713ff32c6d1e2eef50101", - "9d463ced9ffadc37805857888cce0b47a2f45deeeec0aa1b0f8de1a22aedf06e", - "4c95dfc0025b47a014aa2224b37e82b94595226d872dbf411830c0473b40fd0c", - "3c36d033ea2c74bf88be9bdc22272757288b9f4eebb8428d20fbd059b92238ef", - "ad397f27254cf9d2ca60e6a0b3ab52582776b6f2eca8b841d97b7168b9694adc", - "73f15afe8d0972841bcf815c68b4d87261cde3fe159e80926d83d62f3b99ad96", - "755218f75df9162b173b660ff14ba8be823504ada5243719005c2e298fec6f98", - "f60eb81228339da75d19c558e13e313ab1f44f2b65874f4d2b7ac1727243510c", - "a6d3b87c498c71aae9e9b7e1c9ef054f4027de460cec23ed57f994bbc133e90e", - "3d80f589af26c290a1ee04be8750aa93807951053245a6a0d20121d32170d572", - "aa8a2ccd8be90ac46b07579e93b3c26866596dfed1fd177407ab6e24722aee76", - "3410aab1e1a08b91eeebb2485f8eef14bc53b5271391f4fd00320f3c8940c74a", - "8a75dfe8d9ceedca3f1bbb6478cd2fa71e226f2090f01761b02d21975d7d78d6", - "ec3e6bfac39645e6e842430520d9b2dee3699e1fa709ed794f00a27db584c926", - "eb68b62c8a7f01feb72c3629191bd236bf140aaf429cb667205293cab788f20c", - "06297ec5aa77bbadd6e4d05bd9f1bd1d950f0e09bf2a4d2cdb4d119259156ca0", - "288956da6a78bfaef6c08e03299ce7b2e741f3c5edf7ed38c7519e6e7c5a9dd6", - "11c7a21630405a8ee638beb5cfc6b5b502b921cff4cbf444b1d720ff9a460578", - "e7398ca21a8aecdd859facf2154d58bf02b6b62682884cfe0fb87a71be18eb69", - "85cf24a1b23b3d912b9d94131ab1e56c76779d1c4806539fd61c3be3d53bb8bc", - "49e90c6bb3afddbabdc209b7dd1f35fb0bb30e96181589e21c7e9f0c9bfce360", - "2485ead813c93de428b0cf93234a7c94cb84c904318fa147dd3f41c93268399f", - "eadaf99fb7fb263504ceb772a319e4b4cc03d1b4acc0736504a17f3fe380b64a", - "8b77a6356526e34d48e2af4ffe995e9f07e66ef39a721833ea47be007dcd6737", - "54c26ef146bda28d4aeab6dd51d9a10b4463d5382e33f68c29f4c136e15fac42", - "cf701511636d082c7f35338ecfe0f0eabd6368f53bc1e20794f75c8a396aa4c0", - "2c713be0f4b9c71af8a5ff0d9fe8413641387f833419d5ea7926369d091cb74c", - "4acdbbc883276ff7c548a5fc8b9aa10ae804097002ee79378a5ea30951dcbe4e", - "f337c3929d205011378d4f09cf89b3b8f7b14e2e22c5170a8aaaef4f090e7d9d", - "12f4813715363a37df85280667d7e9d72cf313cf8965008a66c37807c0d091e6", - "879bc69a41903ecbbe5527f179aa2f2044854e1c031281c1f0468f21bbe35d10", - "1681b3e424d2dcee2ff2db223e2572c18ef89e2a2138286f3b414027a27765a8", - "9876dd4276b1c288d44a9a99fbbac2f6829b3251b163a5bd7b7d431932373ebe", - "ef5ffd6d99fc0f6fe734384540bad840463596899c2a20e903ad8b1e1b6920df", - "778ffb7a7c5ea9892796a231fc0396c2dc7ff8581cbec47301aca0f3a59c331c", - "56905751c3cba47aa6b6ac99092d05985842f4e8acfca83c6958a33b288d5727", - "087b0bbda64e1543a6fe5b01992a3da50894d2c607a428e5ab9047d41dda8bb9", - "845928dd75db5c6f69f26fe1203ae5f477763ad431c9525aec76c25cc56773d1", - "ce50243a19e51d48b6775535c8aa8802bb6148cafb516439cdab9af7be21c9e3", - "0365d85cf19480a0c06a655945e95e341d7fe7d0908ef615866d5ea2bb757656", - "220a4a8010e474c33be70e5d01114284a8a827b1b1a188e08c6766678588f012", - "3c3f5e61a605c03781fa1868bfe19fa254387424a23e294fcf0b04a57a4aa271", - "bbb356f8aa3d14c760ea00d3d2f82cf99d9d665521f31fb25eed4cc85833947f", - "3da389ac4f5fd75e21b51e966cd0f18742d70ed08d816eda889b8bc343fe5d92", - "833b67a1845f0551c82764aa70df1b716be31e6935500c5a5d4a8a9a6efab468", - "9dc4cb63190ec90024541a05638b70c8e3d1e750bb5b6e976509e4841a0826ef", - "a0558b1dda3d9d853daf217fad56dfe8713204d3e715c0bbecdd4fc3d6bd52d0", - "b46ab463760d4266ef6cca040763737eab97702d59fc95884690e454a5d4c701", - "dc4c42ea33a80354a7e28109d69b8e2c11e5e51dc12646e1e41c4911813a1f53", - "94e75aaa5d0833af06f8975fdbfd21587b1cb7a6e3851b06d9b91dbf9ebc444b", - "47239a4d4d2dbcab929ebc14ee8db0aceaf8e71d6c807f46deb0af4f02a491ba", - "05df2ff57bbf1d27f7b260c3c42f4945b31e09d61f622b1e9788ad0575943293", - "f624f2be6a055421ca5ba581cd0fa34014b1b7a2cc88e399430e6ed01f8512cb", - "5c4ade4fc54643c0582fd34f038be1213ee1efb1b712f762c597f6e8c36369ef", - "1f762e85f46afb11dd6ba385a8c4b2aee84addcc3ed96e63a15b582a04e8004d", - "be00234373ef604f3fbc31479533c07331352417c6241dfd8bf32ece7175bb2b", - "30054f53649b36bdf27a6bd7bc7907e404fb2b5df958bc064d2809be1c6c88f8", - "885250e61c1c3e50fd359ae451513773029f933cddfda80586a7eae2a1c66508", - "176bf342b4bc6eb157fa3ceffd35ba341bfed7b4407e5acda7da71ed4f096074", - "55b17c77839169934ce7d71649755a16e7b7711eded501d9e69ba35d92266e91", - "7f1877ac4863186627c72c81c4ed103617787afa4398dc181df81b0787e0d550", - "228fe95a731b52d491ad9c5389271e791ba4192c24e36de005b6b4a3c53e401a", - "93f50369bd247100c715f5189936d786eb4fa43db311e078a4d43fba4a09c112", - "9d747bca7087b1267f667767c539c1443741d6f8a3ded2a60d71b481f610e5c6", - "623a515e66d51b40d32e1f085717bb83c1efeda0fceb1354a7ddb80b0bd04714", - "0c87c8f475f5076e34f3c111d36592749ef404a1cacf0cc32124a0fdef330bda", - "af6b9e7e61b39ceb382ea3e7816b9cd01e506abd3e45b239cb725ed6b443bf65", - "8dc50791fc72cfc8deafb59c02fc7d0ebb7e5836cff700302137484050b429ec", - "3a274642eaba022f7d1a43d8b01321cf18385db039720893cd92e68629abb191", - "21855c7c42e3575c361029dac6b36b960a9a6273a5990895e9a04c71b4a0cc72", - "6dedf2c1d621d19a293aa2c155a65c76cd59b0b80e323c3116b8f0d8da37d2be", - "341bc2ff89a4c1f5868d2af06fc70376615e05c530e89377b0ac2275ffb6d10a", - "1c0d64ea2457660ff1f4245e8ee7c406ff5313f63d1e1f692591ea52f5b85ddb", - "c491bedb617b1a46e27492c1585b1ecbbfa3143fcd90eed40b34343c0bba84e8", - "c4a8bac8c2e4937e4f04a23a740b6f1ac3b441471ee7612c5304da4735746922", - "209d895fb896ddf2f37edc9a2b6b29a3b40d62956dd2a167d41d5ef09faa14f7", - "b189d3608f409765767b9767e1356c0d8170aff3f2bd8deaeb79346978b99804", - "324c4bb30f4be0a2df83e193288dde835a074fac3b714004beab5712b817f1a8", - "fff004954604caf3670152c82749522977081fbb2cf233ca1c7c0bd642dd674c", - "55a391572f51a51b08de46cca2df91122c5dd04f01917e71371fc2f491c61680", - "7b50d0a4f258cb2b2f2bcf7a321e820afe4cf92b384651c843cd31c35af2f6a8", - "b5c61c4737676ef82acdb4a7830b857ae0f009a82f92cada871d2cd7f24be179", - "ad2a6878164656c3eebd11781fc582a0dce5ec710132811d765903798543f821", - "2ba89a082666e5beefbb6554d85788ee1c668377627d3ad9e4eff52c02751735", - "6311c33ad17712290233050295809e91191611d51418810a53e216a3ff86edbd", - "592af39899e34efa38386abbe2c867e4acf484b281f4f04c941d1f6fc2819fcd", - "95db5285af0d622528e6318cdf1da12c203fa0fd2b52330b12135ff55efee233", - "6c168c1dadc92603e28b361b8f46010d643f33e1682b2ad04e848bd518406c06", - "e4fa33c6a21498724bb8bee426ccba10a451d099f1f084abab27694cce50d5e8", - "a4bc4d8fad5d2c3612d5914f26c9fc9fc96009a0187a2e6f18b3ad2c5a3b0795", - "f5265de1a95a318e2b3d9feec9016e6553347d17254f5d7f29d68e872c7b5d1f", - "e2ec398d61f7c65ad7130dd46eb7778c65deba6f990289b7c1f6eb3e5bf16640", - "78fbd5bc2a769bfd73a6d846d9965b77fa7da65ba0109c2ca0e0cfec336920af", - "dadc559aac39b5176f9305625dc2a5b1c617d33647147d4a6ef201816ad2a104", - "7677afa8e93c50b915f03fb32081c0d311240a9dd0f83d3d1630655efee28b3c", - "f3a8b96376bb4c973324e638ac307bdcde1f5e905b38b2aa1e228f80d155a467", - "9f1eb0ae49868aa94115b723973712a0fcffe35ebc740571032f58b67a4ecef6", - "734df20b536cbc3a40a9e388e9b358e33ea9e67769d77f5944ff6a05fcbd8aac", - "140ba916a2e147ffb195489214dbb441cd63b9ccfa03e865f0048433807ba5c5", - "7a393ca4c6e489fda4ee7884b16709e6cc9e92f7956908b51653cb94fe381f4b", - "eff6f6c5f5e67840b376e3d3c3fb5d7bb8fead53377aebb5befb783a1bccc9f4", - "437e4ea320c706213ebbb1820be3b42fd0a07b50e2eb91ca9feb56cba570747b", - "47e1a2cc95de259471f10cf5bbe4fe39bf2efa5bb0457a856f9cd96afdda2365", - "664f7fa38a0502fc866f519ff780ff37a357a4f6dc752dde7dc478fdceb5d014", - "a1ed55f684e417c5bee594e2ba9fb651d1741d4d50348b2bc7677b3fd3eac5ff", - "4ababb9b8e15a733369ea375230ee1a94b6564ff234c81f83bb4a0d825dc7f78", - "91fe8a8e2d476af7369f4cb1eeb1407e6c6c91f4a7f22c33c6a6e5600d4db136", - "1aa813dd9838264fa199df4e33dca14f62668470c1454713ee0e2833b3dcffa2", - "d51054182b098ff32dc907243aa448c8c2e8a6f7820358fcc5259a17748c2e45", - "2d7933df8bb83afb7ef3ab5d1283eb9a5d219e6ea5ef87a1769c21701423a9da", - "d1946de67633ea43edef3e06f4abac6e9e89d477f12e1d534dd252c88568df1c", - "8ecab8ce65024a0890278645de3be3b0fff2db82f18effdd7d10270337eb98b6", - "74d51dbd60310e74c71a652e9cf932b0dc9dd70f22a76268f8b2d3c050cb09aa", - "832e43bb69e3053339907e770741d528a488df9c607d00a264c62785f99a3b58", - "8553733a19810a5bd66f39d08276373df298dd0ea6854eeca55f9e23e10502fc", - "f332aaf9abb1ce9479ebaa098bd1cbf5fca6b90660055f9afd1ca8c4d7196b79", - "cd9a6addf4f891d9dcad0c5cd926befa310c32033dd74aaa337710893daa73ea", - "d0185edd52b50fea980bd66881a3fc9a82563717ff36b9d249e07e7d9c5fb70d", - "1f5e98973536e42f6e79f4ab80a4029e15fd993b60509dd8120d0eccf7ef095e", - "dc887de504e7b3cd2738fa5002a89b2333aba5037918017b12238068eec79cd9", - "b602789afb2a5a1155b380c75d8b23e129f8b5e27d1efade74184ec82e7cbd49", - "fa201d632038771009d20f762e3e7760bacc82f10d0229d780d366a9eb9d9003", - "4f414a6e2b2108e55ed71f819eef081976f4f70f6c12a0bdacd23ae7b83ac363", - "ef6330a29a0d55cca972c1dbb7a5950e22b075fbc53e4a3d6112588935cb7458", - "1d4ec6e40c8eeda7c6bbc6720c5b83be6a0aac05b59b15017a1d89c213286dd1", - "ca45455122bc5ae3c1c740c448edfd163dcc500fd1e457beb08a6f142f94c2ba", - "530ba2b052cf1c4d891dbdcbf1abda0bb7acf821ed5620b4979262c954b2ed75", - "6b2728ec0ec99be9a68677e6d832af775d0d9f75466a0c690f7e3623da30f028", - "6a96f6124a2fd65803e63c29a606b7eec2fdf002cbd61fea2876e9900b341055", - "1022be6f7f5ab6437454e716652f28b928cf156312c350889ff793cb74f8629d", - "c9823d75f095f0e6103a9764daf2f36f5f146bd97fa79ce5576a6ddb6ce67163", - "dc542ce5ac657f3cc46feb1e4da216b4ab85687603120db2b3132a7f3251da85", - "b84b6c17f116337397d388c9d46c1e16fe67bb10ed6d688e538f5801f6376e2a", - "18565129f66ed7b19a95b97383cef16eb9db9feefaef8d0eae79af05b925a27b", - "7b1b099e9a052bb63ed79ba449470971dcb554bced55d5981ee8993cb01d79d8", - "95027809778ce0d953612e9aec5468c8812142dd48d87b1438a708a803e5158f", - "f67d93d825a59a0ccaa717835cb55fb6c067f9b3e440dbc8fc40182372297d89", - "abac3be9ac75ab56399331f93cf9bc04ad30e8f1ce0afdfeea231cc8131602d3", - "ee404c7ed9bce416217819cae5470acbe5cf6f349ee6f11c4836a14449908481", - "d6f57cc7c62e5469b779c382f755a6d96f3573aa515336f967f91ee7c6a4a5ef", - "9fe511582134670bc2af261699fad0d50eb271f835337459ecd3f85af4f3709b", - "f5cbeac43eec5949975de54bcc4775002c7d2d29e6c31e3ab7d7fac6293a6689", - "e5802afcd088c99698a4709fa45dec869c4e843a1f365787bf4a9525408e1bb7", - "dcaca923668646e68a2f0319c1143e56d9d2ed4f9fcbca5f8abcb2d3b45711de", - "da05564ae6c5d032e0fcd2af0c78029e05fab76d8ee9aec5d79811084241c213", - "9827252d7498499a624834f630a211da50b93949a91038e245d0c7912ec1ca94", - "6c5754f2a867ad51b9626b47f92e7b9af9f3b26e2e6cb729048dcac8688c1692", - "f3680b09a5ac34052654481edcaca732097866b6dfafc01896ed373b75e35426", - "5f2786e0ccacbfb919943fcd5b5a1c428e84bd5cc9c7f09099e0722b296bd333", - "76d1e3509ad912fc70bc34f00a9cba0e88b5656ea7cbe5301492cc7050302db0", - "3150e4dbc7edc7ec42cd4a6941626a4759d9c4a1a4b2708e32c30ae24c9e8c88", - "2823792a0ca4d11cb69da977161f0f78ec7d246caa09532117d37dc373402366", - "ac082cbbe4c87046d2085b625415a82a2baa5978eefce09efaf45b598122815f", - "4570b706900e213b792872ad05143cd38fcbb7a3a231ee868b7caffa84921e8d", - "98f1b3fc52942759654659096fb4d951e9d1ae41eddaa6860d4f15d8f6e553ad", - "967138fdeadf98c3db8d8cdbfec4d4c30ceb97b250a5320decc0a69a97792c9c", - "f2b8e534c78d1d1242a26600af250573b9792d84ffb3a5b069c47cdfe27ce40b", - "0f20208a44b66ee359fbeb87f386ad17904f1a7d6817c95beeb02c3fdcca02e4", - "fa9cbbb9cfb8c0c92831854b1a4843c0263f2346b04d1843c990be1f5625a88e", - "7c451e0f7fd266f826f47701612a6651f4aec27e2e152ad9c3104c16a996c327", - "ede5498558aedefe367c96cc91f14a0b90955beb06fcde4000f6395f9b0cd47b", - "d3620889c2d9d731f7663789a997f383c5532d1128e077b70eea0b850a2a3247", - "43d7f65ec4aafb90c894441163c8aaf94c84d0b31c27c1522f60d10bdb78bcf2", - "24a0f964f6cf23d68c6ced11c6a8ec8e4d3d3ab26ade568b342c7887bd8b86c8", - "1d882553ccb1db15e2d5ca610424b289eb32ae3614c42e779dae8157f999be59", - "2f789e5ebf9155655f688b1cf81c37866d584c42f9690ac53077660580b48554", - "f0416594ed0aead311c99c494c4e3ebdd7fac0a8e6f58c13de7742221c1e236c", - "c48e581538875828e77022c7169d0b41cef9534c0f742f92e605d486204b8a5c", - "5fff1adc8874136946a9607c1caf0b533e5a6179f952e71c00fff08d1df88936", - "13d04e1c199fb19efdf2b14845cc56b6fa1614575ba1d2f9f18b9fe3f48d195e", - "161cbab7ac598b20d64f5aece5a4144ef1aa7f16a6dd85354424c20226e0572d", - "659d7acf0de5e96fad31d1c79aa126005ed81711a01e9a8270c530066e49ca62", - "72b116b36cafa751305e7a8e3dee33f1ddfcdfa0a680ee8c160e21b6443575b3", - "ceaa71563ee91815384fd065026364c8e8a6f5639ce01465418a1362bda9df19", - "ef86c8a6ebff5af276dcd41948e4c882ef832c719f7ab5e28aca576c5bb59415", - "fca8bb7817f242f17ab1dff6019beeeb39e3fc2a96f2913b27bd93fba52a896f", - "7c7cecf24f2e8f27937c73a35b76999d783447034b0bf8462402b62775f2b6ae", - "65bccd3b8516a8f6ff84445a879d8da86df0c108fd40467782dcc0d888ea9536", - "be4e13e6f19c2e68fb3cfbefe4399e8ae9d270604c1cc27619c73ac5d2f6a43e", - "1e01a075fecfa4cf59e3fa3963f48cf541cd9f16f08497979883023cf3145c6a", - "f0520a7d1ddc18b2905dcb063a025ed7a19d41a68532f4ed45ddb01d08e0c0f2", - "03a7f8556780c117516240b796bb1229ace0b9b11866a581055f8892ad90c66e", - "528f11ef57708251227a5fdca7fbd63fd987388a3b46f4fc2bf7e17674f65126", - "0cc9ded1c95e7c9a9e46d4fac2a364fca20e161289769262a30481b8af6f25a5", - "f9a3e33c815ca1da06d9d6ed02628971bcdf9380b63600f988394be07e33a828", - "28fb8a75129326926f1621dc7906af0fe55fd441688dbc14836fa250dfef0d6f", - "5babd7d64eb18659b463222f0f02a0ff8390e61259d89d20b3a02ddfe68f86ba", - "4604903988b831f5404a838f0ca053263225738a03f1273bdca2ffb967e36e2d", - "da5b5b5c268f84f06c72ca4422d35834ed7068684594e022d7fe3167960acdbf", - "417c71ee6caa460c556bd14654e05110d30dd3b1989dfb74a7003a3efeffb33c", - "a8de8a932ace87909eecd47c6fc962cb9f43ac2a17d92068aa841ea82bf51a00", - "e860ebed4c4fcb0283a83cbf51af734aa5fa910f245b2612183bdb48d3ff7c4d", - "c70c6209976ece40a2bc2f933a4a21c2bad8bbe3d8f33f74e5bc72ef0e2115a2", - "4183699af312149f79dec8a3fc4e2fd5946bd0257ef457d9ea07394ba78e1722", - "2cfd40205ff525573708fbd6b3715d33da0e1ed1527c198d3e645e08e53c0d44", - "68c02693602c16794e3b6d7ee1cbdf75aa6a36e1fa347efb8b337c4b34ed012a", - "7d200946790ec5ef5c11dea4305ce114d2b6cf5e26e655c74cb117a1954286e6", - "53aabd9157e220e35835894c97f511298a6b503b2a64c49f0f02f7dcb88ec520", - "e1e3c674cff119b1be837fa993e3894a838e2613560d3c729d266795eda6a5e2", - "92331c10a89ff15d36872d7cdde63b0bfb69525947b5386eaf3fdb5e50f6588d", - "bf7ca750bc9524fc3479b10250b76811455144d5d0f7b8f1931508b15e7ca3a4", - "0a55ac0e8bb04031c436d48e8e0dcb8d252e3975d730c1d3274bf133f9f2055e", - "adda59079de90babb7bd3c87cf0b66591007732011f5e613331a42c8c22e8c01", - "6e63fab5fffedddde85b07b8c03992c3977f9dd0d819776439cb9f9224b0e351", - "24579b78450ca6df0fa8b86fa00ea65b43b9b3ae9a4a2a336bd36da2a906864d", - "6b7a385bb7d67f33eb635d2f2716a18ed2b2f1491ca32bf2e502b1efb6596aca", - "801ccb21530ad5308fd0ae776930758a09d6d5d379f1f4a5fc326df325ae59be", - "679ea0575a2ca16ecd1a0670b369fce0745a30bac1922b81a12d769434769cfe", - "93f6e4651d878a3643a44004494b7854f90ff99a94cdae55830a3938bf0ff8c5", - "f684cc9e8bdfbb1efc2140db901c6fafc1c2459c5bdf114a1452b4f6bcd87b38", - "d81911c4f7359c4b9380bbb6ff1ae3b28adf09580fa2e3bb900b484de22731e4", - "2326dbccbe7e92719c25aa46680172acbe003c0c6d6703095ba00139b3cf7c96", - "94c2946c17dd40617482b1ab3ff495350cbb0befc7131c13b8dd73e220735dc8", - "9c0f73c8c08a08060812437faa371bbd00809eef781d6563688f4d9955998b5e", - "6b6df74f4cac7907e863323808411ca2a41e6f0d9d66124873651f6cb3d65b11", - "5b7e2a29903bedba0679fd1672f5996f61614ab91d2ea96a093a499537369298", - "8de7a7a3ba2323c6f0438e018a488281a7a6a232443d03fac5932a4acabd920a", - "5e4b26d3ce08fe4cca90c30e01319fda626047f8128692920bc1be22192b1531", - "fb904dfbec0f333b50d19a77585232d434488a8d10911c4f6aa62ba663e647de", - "8c383ff1d1e9729a9520b5b0b38a7da1cc9522a525776b5be780d9170ad79981", - "89c31c994efa8c6a38a1f21958a4da213e63535c14e9ed1406ad515b76f123e9", - "0e8e858221792e73bb3d47489406c28d97b6b3ac20d93bed1d2aaa90591942eb", - "b0eb6e89aec3f49b942b32b4158cf2c93ca56ece5a21568775866642af05902a", - "53db035806c1b24d3888b36abde68e70f6226e3637c09036310f872cbe436ba3", - "1eae92fff06ddada5dac5711ca3f26c6df9e3c7e6694a0df07fb3d3901b03f4e", - "bd767a0372313f9b7bbd04e3606b14e6f15fdd8aa2b904f62b80e71f1de08936", - "3921d426547e442889af7778ac838bcc8e4d072d5ab6d61650a1a65df3296ea5", - "a0ce5f69ceb125d1cf87c6e97eb9f8fdcb81be8431fee3bf2c9da31a5f064f26", - "f69f8b1749378ab5a37cdeeb99a86337755278ebca2eab06db25ff264a340cba", - "8accd1d400406c9a4bde7ac06d34ed3febe419e1fe1837e8fa7862863e266f90", - "0d68d818b7cc6f201f99971e29dbd30218cbe744a4d636e60a29f8976e792a8b", - "53ec79cc9b40d2c627e16c21d03628f015a0e9a331452b5821efc2c662027546", - "29ba336da857f8396e7f244cf8035347aa12159e47226ba5b25da32bb9d8e29a", - "4c09524c7659c01805760df43a50865b3ca1dcc1a3963d5d8ee65ce5f6ad768a", - "5a3d67acb72273acb4442fa5f4e673408165e9f7c89faa48ff2672a9b656a6a1", - "1fdd0784baa033a3815375ab4a57dd2ee77acdca578001276338aba34c89a9c6", - "d8251f07b6400c33e4299f4957db7d5ea6c3201607f138bcfa53a6f11a8fefe2", - "8b552bdd8ec706b606dc872c50cec47be9ef1f941979ac7cba41ec81e500337a", - "e4c3e84cefd71cdd56dbab5a268e2d21202b287f0e76064049a48d19ea7eb35e", - "b78a06c1174c3b0f1c0ad1dec936da29e98b91eab926c187a2097a9a2d721164", - "6b6c9cca1c5c7e697573c3d91d6482cf985b7e2e843c0a93b53342f2a0ab8c36", - "03fcaf47026e0d64b30f92525ab7a80763e6b9b37a0ee8ccc882dfa02c713734", - "8c66eee140a34e2b83a41bcb9b93f0f408fdb0593eea7d00e4384bf133d04752", - "5391cdfe4646a0172cc57089838db0dfe28bceceb52b8a01142532b9a6321038", - "07ab17a2a6c955dd5dd1db4b19fb485223997102fb57b7036fe0b73aaa18b845", - "ce3f94eac60dcc7a6f80cc3f4fa17acea3a589d4f676c14179f07faf1ff625ba", - "2dad3c7bae4eaa5fe724a1ed45522f7190c88bdaf2cf81fe6f6f7e352f68f092", - "841d34348fcae44bc3f20dcd53fdf6d83a63768bc95fc5456bbde86170e1f298", - "0c315c916a343b934b4dde23c1434e45430a46194c6eb28d6f781e2c461df407", - "4b9758e432c6e57be2bdebebbc2b4a9526c68c5cbb8e4d340bd488db130dfaa3", - "fb14cb078cf1b3e0e2cf4f181ccb7ede919076d0184ae0c631d8110cdd8626ec", - "9480dff0065e84993faa66c082ad4b007f37bb4ade091f87fa9d65cc683188c9", - "77c36a5245f2ecf221e791d442be1eb3fb2deaf0cb8f4831affffd6e98d13a08", - "fcbc508a743a9122340795720471148b81e058e7917517d691a2c2823b488204", - "5c4336574eb821e15c71c5140dcf0a9986f15071760cbec8a10dee1eef512acd", - "6e0a1ded27f8b55fa21704c6544baa01148ffc781263615ad7b1b57c153a15ac", - "888f8f9eba9ba5c757b377dfd861ee6fbd92798a697cefc3f390c52ba82ae4eb", - "3b8cbb25a6e93f907cbc35c8618b7e820e6ff15b1a15a5a9626446088459ab36", - "9c6cd892f7758c4dcaf1c55bcce3e047397c7b566b0e927b5d35b8bdca08c9a1", - "0e2b1e16a8b39bbfd0b6d8ecf234a603b4a962ba4c8921696f03cffe3552213a", - "232274d62b79d76bba7078f3a2dad395f7338447515a2527c47e11eb00c5b5f8", - "07ba67ab40705f231b029e1a737cb254dd656ebef633f2fb1f84fc3c32573e06", - "4362e6bf42f2127d2634fe805750986d344c992cc732da241b8fcaa14b9c3d5c", - "c707e858385d4b2ccce60285d182a73b18410531cde084760bf2b183d9cbe0ba", - "190a90aaf46aece1dfcd63b7a6e5c787c5d9d7e1d3eb88069c4654e53aecde48", - "63eeeb500d31e29ed1595df86a5955f33b013a308c4faa2b67f5fb3d3091e04d", - "6bbd9b378b278301109dd37d77999cbf8c4528f02dc93c81137cdc31d5887b25", - "6ac6914fd6ca11a6f23f32b3504cc21a5314f04c498c4c0bf8d5e4fa3440134f", - "a926d9ddb60e9caa5570faee4ad710df7638033c5f7769798783136467a9a1a3", - "10b943a0985311951615381879b97c0f7ca96a899451102e1d5419affd57a2a3", - "c0dcb555309879075ac7be09b56e74a4250723268df07f3767982292321c992b", - "560f289ea66e4cf2d9f284d1bd7a4511afc8a0e50f81a949b1386210e98def57", - "9f701906d938ce9da489581292b1072ce6a10e42fc97572656c5ab713143bda1", - "2facc4c5d52b1275518e9ba39e2cf4ee8f68c55c74c10961f802465e1222605c", - "db64c5934c317b40121120a4ca8aa687ca87296c89fdf2dc59cbfbdaad0ef029", - "35e5925e8f410fafcf018d906c8d412ba91e460aad6caac6217ddbfbfecdbae8", - "3957d1dcd047d022773331083ea242547efa8717609e9267cb1eebc30572bc23", - "6734c69cc7a43fd13b370d54fb295f58e9e89de749e14c060c1c244052291e78", - "f99ff38b04bf6cb446853e8bcfa11fd7abc758ce0c2bface5a7acba3e3ed814c", - "f1e51e0b2b6fe705ef4628d9661a53f55d5a43662afbc2d8f9b0559bf0d44161", - "d6c801eaef0aa2d1d56658c5c80bcfc5bf3f0f74417bce502eb5560fbaeb3dda", - "61f3ef69527fdd03fdc115929e088e841a95b43aee003924f8c0104d7430464d", - "6620b406ba4109d9d5051306c005f15e133c8f1b7ad109e0c27427ef113f112c", - "1e1cbc88a96b0145748aaf745fb1a93ac4ba3ab5766c8abecf0dea3e5d08bd03", - "2682c45fc5b39eeff179d8f133e7392ff5600f331d8a7d95801e4fb22dcfc2f8", - "32086e554c6e805813ff0458c33dbfd1f292459e512123c53bc4feadec03abd5", - "ec02d577d0c8ec984cc2f53cfc450472dcec34b269f3f129dc3af45231959095", - "b2fc20ffb3f20b82c26f572b1e89d91885d794b75e786f6cb585bf392e07456b", - "842a377fbfb6aa75240c4d8f737dd77d1d173fa5f3c55505257fb7bac998fee1", - "77ce5168e0dfafaec5abfec3d8c6e4196bfdc04a2952261d9680eacd7bf2dd94", - "47d65d4a6b346147942acf93eb60d1827f2b901f1ec0abb4929f4891782e3ea4", - "08b5874af2c9a6dab3181ffd9d5359221c6a56fcd58ff92ee2af19ef90a91c33", - "0b7cd6f24c82bfa3b7c947cbd19f30f0432d8d2d777d1329a801cb343356fd6d", - "37fbef417fc72cc81792134b47145d112816b76a835d08591310c00fa88bc6fb", - "b71c9d77184ddb593c9cb48327959f16e09027707558b6955add632795d823ce", - "f1158d1d0d724f18163266fb3773b4bb05ff1762aabd3c73a927e87ef3acf49d", - "6fc0fd315c6615cef8ca36d54eb79d125487ad00f3ed7f902491062e5c902979", - "eb5b9b6ef3014be0c0aaf25e4589e3af2c1468fc3d51f3e270fb80220dc7ceb8", - "e355471b95514bf4103e43da64250eaa664e115d6271381df72b0bd80a2a1bfe", - "097ce246984edd787848055742737a62010a671123834300aecfa3bb289f80ea", - "3eb28f50fce85a42d64e406543f95013bd1db8a499acdc0aa43d87103766bd17", - "04068292727f41e26fc0a855b2cea8fd96a3e0935f2ef90cf227a8e9ce31999d", - "7f54d8a9721dab2c5f197baabdede1255cd3f16df86e4b445283081160704c9d", - "f037c78ce56c6280f608d7ec6f7ce6bacac84a1281352052ed3a07c20436f6dc", - "7dc2cc9e60977bbeb96865ef83054fb91e84b60870de462dc14b110dc9ae2fc2", - "354915e5759c47e04270fc0e50f7b2b0c92331fbf39f580aa4c9bea422d7f8c1", - "1bd260392bb85b5f8b772b0721ca95911bc81702151587934ad6de6065a8255c", - "b97493d3b112adf30be0c716cecc9af974481f7f4a916275bd8bb1b69b0c48a0", - "02876550c668da1fbcdbc9ddfdb11af342130a3c177e2f6f02370b39cb5a107c", - "d31352d32b7d6ed4dde92695896445a734e36c0d83338df8c2d84ba0f5248a97", - "84e43d03fa55c0f32da9ac0380810fe5fe061831f63f5a00860cc671ab0d09a0", - "82eb7c984f1183e45af47780c0f8c30e067b1ff9fe347e4a0b72cdb6b2edff02", - "353ab530a12c5ae4de0a30da432f39b9d12ebe6de783b8e8b86f6cf64d9d385b", - "6928217fdc585f11bc60c1ab8e0abfeb100afe839cb268b4da8b9b6e3f26e8a1", - "f29639e237dd3f4f6ac934e6e09b5933a236a687ee509b1673fe56579eb8f83e", - "7c52dde8c3d9c8a61cda92094a77dc590a26dd2463279d5ca7c6b9bd1e4e6ee7", - "ead0758ad80cd972f633d0ce0b11ca94985aa5afc3d75fbc8a3080ed6329e899", - "d79f9281d8a11b13e7d3c4fdfc3424e6ad118a3eed8aac7308c971e7cd41f732", - "c63a489eb5d412de6d639190a7deea9503883334cf302c69f73773411800b67a", - "9d77f6f9dbd1472c332ba560eabca041afb5125388ba8d98ee6455481bd850bf", - "2fea3afffc5a43d85042d73d233eaae0b0285493cf12c5293c35f89a63130295", - "e7e9458087cd3565cc634f30ed5a6551e2bab7cd85620177caa08b2327bee276", - "5d4a24881d704639e7ac679a97093fcc74e8c1fac802c33d72bd2eadd23b815c", - "83eeff21070f871d755089b1cdcc45ee3956b1ad69b66c75185760b876847b33", - "87f1de43c3faa0d13ae71c9bff5de3117d90bb14a00ea2584c357b2810cbb0ee", - "e6075afc4c21c73b818181e3d34d845bdd86d2e59f766ad4a964a6ca0a2fd2dc", - "209f19860f4c2704d720ef385b33e698d2b18a4a4177f986877ee18051e6b7a4", - "db20416e4fa05823af030e935d1189573a0b68813c6f7832ea3178549839e776", - "89bad2f6b578648b9d14fbdc6d4e8d50d49eaa20184df286bce630ec28252db1", - "d1c947574366a0520e1b73a9563193fad7e86fba600ce1ed8af194591ce4b826", - "a5b2ce5f5f1dd9e72dafefd9cac81e9cbbf8bcfb564d966f45ce78d6f4ef7ef4", - "506712c3bc4640e81b6018e75dacf2bf1857405663c208e4cc375afb5cd8c359", - "ac6f0a1d472d3b7d8389a6ec6da8fe53186e9da9cadecc45a4e4ab8d628d345c", - "a8ccd2eafd57d8f145060400cb5695e63b15b5e2cab37c989f727db6d5988870", - "a15c8316f07da34793a07734973e87e14825fe949fd6829a91ab647df90ed802", - "7ba944cc4af9f226eef38f43e2dc8cdbc77dcad10558218fc647bff9211c92ec", - "f6e8e992a3937a1fff1aa7dcf09e21e01741bb9e79671334ca76316dbd53082a", - "1f7cde331fb467037d26530fbc6b04bb6b88504f803cd9d1c572479aaf2392c5", - "8d5d23bb5653c4c0e9852f054bb656e810b0b9fa709ecc47f3f7e3e156caae7f", - "a15a7ac848e7dac2f0ccf51ff4ef9074f5636953ef3a7abbbce0f6755ad3f52f", - "1c034f044a1a34abc64dabb76c39ac9e49aef944d95faffccc3ebd2f5ac4d654", - "1b7862ae3804f36f80a6b809ba144fe759df988107463c3de951e62d613a5286", - "ddce582a177029cf6293ce361a5f28904d3001a2509ecd869ff0bff4eec14ccc", - "cc8fe318a59fe466a0181f82ca97f2e195b3f3063d4c7d1f5d7b82919e14f472", - "f81318d5d8a39e7378f02c48a90bf3580706e5d4ffb80df3ec4b3438fe8de067", - "e168636b341177569181648dd844d341e70dd05db2cdf3b489bd7738a2484cec", - "e345bf5348866e1651a410a330e0a63a0c7d1c13d556d0edcbef2a98b027b6ba", - "7bcaba10255487e1fc8374dea4bfa4600cc784df281e2e2481913a0b9b5fb4b2", - "4a62fec124c24ea3d673f6285c48283a068e2be5d0fd9399a9cae512e7de3f29", - "c1c5bfef6bad33565a89156254ef489c6849866d474a046e9026361b8d8caef6", - "1a98b9919b74577f821afd69632f867640b6037a74eaaef4f3d48599e7881c7a", - "a4a1ef2164b99c82b86e8f1e4f0c3f9501c4aa1d19ea3815e52bf6c4c445fee2", - "5e5c38600ed5a6db4975fcb7d987731c7ceaab54ab4a091ca6b789ca9fad64fa", - "a7805593cd8eff74153c8ea18305ce890f649815bf000d1588a3f466cef181ba", - "06f71d90bb77daf0a439a1dbb4112506519aab3fb33b756e49b039821509503f", - "6e2a8aa4e0d2616d2c8a98effb6aa79809289ff4bcbe5d884ed108910c28d22a", - "1e6674e0f099abd3a03da0009cb6e9fe4ad77aaa80f62d277f7f59cc1d18d913", - "598099682bd586943a210ce2cd6a1bd66f2bbceb0e7fb0739f9ea53f6c945419", - "969f95e214fc95792f1be5475765e8c860c6c022adf65bef156e3654942a438c", - "1022be4515134623e3c97743138be6b58bbb89b14c8b4739460a4374e269cf56", - "2a299a650ce5481532c2258b10cab6d1b3b37400ec3c698812d38aaf053ca32e", - "e909c7ca67aa8973422e3ade6be669da81719c70ac999c701bcc337c8030af62", - "76c3a305c85f62fb29f97819eae3d4d6aca9cbf9bb22876fac00dca23a4db2fe", - "a9fe72e313402a8468423d167f227d3117af22fc2c93988c97eba985aa87741b", - "3d3712a0319ceb9d29e55c88df13fc3fd41eaeb403c01f0b62a08f82e9e7f064", - "9829f3d9586ad563ab61914e7c2a99a00e5fc3e224e31fd123bbd72b0ba573a2", - "c90283f9dcff95301124d253adc72125f4b61427ae82f9a64b7064dba84e0d81", - "a2bfe90e4260dd4c2ed5f4a2bccf2c322309f48c73f4bde9b4ee3a399e92750f", - "dc6bfea622b7d0069c574ac8c873fe5052e56289207ed77756fea599dd9b3f38", - "d2b6a1f37a0dfdcdf0ede6769efb5ffa88cbb398f6f41665da2586f0120b3b31", - "022f275fbc8ddb47167d4c197bc108aacc7934b609e6a2b206e37c690fac3d91", - "b1bd6e725b59d2f476888773194cb6f776d6da421b3ea0c42e580f6fb0d81afb", - "7bed691de2cbcfd4ce3fcf82d122a4faaaf41b0c4a359a0b9d284d051f13abdf", - "1574fff6ba5909ff1be09abb3a31ee61da0c516f4916ae5fcbcc85e091dd650a", - "1458742901a5db37ab8ca187ddc65abffa0230942be9f168ef6ec510b48cbea9", - "f941235982b157d1833a09971e43826edb70729bcb9b0b38b5e6767e4efb79e7", - "bd82f5ed44487d340409964ce12fb93e18e549d7734b7fdc2e3e917fed8ba362", - "acbcc4c96f04bb49ddbaa3fad901a48dbd06b7dcab5ccbb1295ad6e53a529191", - "ae14ec46dfd61b7d67bc67e1f04a057014a4a5cd83cc5ac6321f1eef97d7408a", - "c9758eee823f92f2afc9245cb8cbb20bdf240f4de6287db417557a54c9e9f529", - "37921ec92910c1d5e85497045f9bd9b944fbd5f5b95420468f9db1563d9fffcf", - "0dbc148b5b1a415652b72b71fec6dd36a3ebcf2a5127c45de74f735654cf383b", - "469717e5a982d40478251227b79aed1b96fadae00b4a71786835f780e49dcd85", - "b0182217c914c0e716bc5e1951b30970bd0f83ebc399174ab2cd603881a26451", - "ea109b2e36548b06e7f144a63b9fd9ddbe895e983f011e4b273824d163c28d98", - "18531177357b33b03c863a28b8fdaff9ecfbad26a0b51e475dcf333387842605", - "e98e78d25085357c5dbf5c9af22fa1a52999c2ff019a2b54197d16a0a9bb8da6", - "8767b8ced6f35f6417f2d211e2e0de1e5347a6a5376566152108702de3df451d", - "60ad43f8389eeff68867b39fc5a8c6f480f238d16fa14f615ca49ac21384c627", - "19c2a1a631afd793e950d6946458b1113d9374c8cb7a0b3b2802bacf2cc9c43b", - "76a4179841197bb7dc02e8af4d36eed296bab8f2f8b4fe9e970892d582650955", - "e7e3c749fd95187340a818153849b8b9466cecb20647e23c27e1607c26ba5f13", - "8a615443c6dbb586b78cf9073781801eeb9f4204a349db49f8d4484fe3852fb5", - "d8a5a596ca9fde9e5c74cc4ff63664387d1283bf1ef84ad15c9d1f3c1f540741", - "110e20c32e32d5c19331f9106df32d699279c78279f425c97b46d5e2f8d397ba", - "248deaf905f5b7c4533a5caa21ff0d8668579dd8d94546c9432dce5dbb315978", - "5f3cef89c8e16c38f02aa6b82fc63bbf471a7207b43888b1a528910f833d4d95", - "5350275206b5729017229056ae527aa3ebb55c31298ad9061dee4bd9e16fdcbd", - "f07dbd96c497ba4f00baa0b7532bbb82f0be1e8140e4c5b1578c79e86580205e", - "6bff71313be0f3d09e35391c1b7e485a074facfd816ce5666678e5b058748a28", - "9704358977dd84f8272403212a1250368e18f84159a568b84b54202438ec46d2", - "8cd8c52c1d451c98104a671837cbf183d573d0ee48e7365da5988522acf26b14", - "1164657006eebe757a6beb3f19323ad2cbdb31b0057e7ec3cf6fa82d21167ec0", - "91338db02e420d8f6c30c6b538de31c13a19cea86fe5337d1e104d2aba658617", - "3dedd600d608f0969e808942bd045ef667766ce5c648cf20fdff951ef9891daa", - "6fb2f9a9c015c3223dc13b11507966fce7f6ad15ad5bb149305a7bd8e32c8db8", - "0e048af96ae26814740038b495deea3ad75c587777173b1ca71c004f7ebf0b1f", - "4aa03cf4994a90e9beb3774432f834a8a74154972764d19e92ff12f41eb7a99c", - "abecbeda60db896cbf297bbc60d0429f0217d9383362b65879a70b6abb5f8ba0", - "96394bea81e89d879a48fe2c88f95a21f14b5fe4647d5497bdb075cc574368f6", - "72c7bc068abae7d7f220c385b1b897ed1c78708790fbbfc2847d38f48d633a28", - "e237309942f9358b9e52693a0b7bc67f32d3fab6ebd6085fd552bbbf170010a9", - "8a5441a9b983c0923dcd793b34cb35119131445c5248715b85d6ce64e276d25b", - "4ae4ff41d56d7ffa29e03444b6ff757283ef73a79afa65e6b79d7caf19a3abbd", - "386282122fe3d50b58c078c9b47da311d52fe82f9ce32ae8fb275b0680675e25", - "8a9b2cba6eef49aa4d13716a9e0699d52813351aab5212a07f16ba871f65b93e", - "c95bfb4508e7b00cb6578f306709e84c9f2c0d3c3d26814ce7594547f1f934bf", - "a4a5638af556af77857867573442af01a25592165ad4dc4767d17a41f1dab8f9", - "88e708d149b81f941eaba9db682c700889ea47e1fcc12483f30f5afbf9188dc9", - "250f10c5da94747550aa76e7398a9077878a98dea7595332f9de004ed3076b9a", - "730278cb8ed3a5c26442ac26a4d8a8322f4e236d671118cc638421a534b01e2f", - "7bcf14fcbe9c6ab7de4db7649711129e52b00e787c7769216f7e0ef512a38695", - "9692c727e8fad3810b5cbdd96edff47302b5e8541d2c27dda0bbaf2f095b8f2d", - "ea86d4f26f1d224e586da073805b45a7822682811167534b7fc465016a7499d9", - "042a6153ec7143b1ccd759d7cb0070ce8085fd7209cbde6598612eb9bfe3a8c8", - "cd5c963768947469846c5f1bb9d635b1a8727d75837eab79fcdeb917d8ce6a1c", - "00467af50cbb70449d86712c106b765ee4111ffbb8ad9ea45330218c99e8c9a8", - "e705b10d4fd3bd7f40a0de687e0bbae78f4d88716be63a445cfc03aff2e1d2b4", - "1a359f3fbef1d6f9c431e662236380d4e48171e31fc387ff64046a6051475c6f", - "16ea4360cc693353578c0537d088849406778e50de051aeae3aef0662f293fa8", - "43de24e4dd052432b27c0401aa75a0227dd8ca51b0a2b38d2ae0290daa686ba7", - "f37932283aec6a372a2d85190e81b91c7636f32534e8381025823907be0b962e", - "e870138ab458a4e09af36d97206f797f6647236fe786a747e315cd080a02b527", - "7dd93cd3a6311b60132bec1a3e497c2c24f0231f1b60826462b4b9085095ddeb", - "73ac2e3d334ad6c327d0d5cde40ad1e3d1a36cbb0c75ffd6d6a95f8b2d1fc859", - "73f7cc1e7e355ee9b7194164a9d4b6794fbe3e73a17faff0912a1a32c8543dcb", - "471098f5de0dcdb0913189ba0c691cb758d273272e648ff6873743e4fd5eabc4", - "d6207d3a2e506bbec7d83c5e5f51183f399ffe402a7d893cae799ccb01d03803", - "d0d436a9e0454e03c079b6af97cdf75237566d5c5fe77b0a1cb8bef5af118527", - "f9b244fcd84e42681293c0688c307162112801dd922836e580bbc6c625bae104", - "6fc461c77b40356ffd83232e07a8a4d1d18ad8a0b761baafa42e0fccecd036d3", - "dd6dbd3367af10db2e27255d6ab8c2035d34ad7274ee90d1f4f4465ea7780b9f", - "ff48997cebfe0ec6612ad44e10397eb296fc89d033cdf7104d140ffe4939069b", - "8386523e50c94c5c004fb6b602a58f8852e34af248191aa4c94f67a0e7def931", - "fadec28ffc7f813eee9d6d1fe51ff917296a9204b81e86ff8e20564c2f2af418", - "1f9f0a542be15546429fbe41ea48e317578778bd307b122096883a618ea1b877", - "06758fc258c4d350266420bf5a61b6c2cde91cf74e6aa0ea84e5224211c61cd7", - "a93339e5be5db9e3e1cc8b98ad1508f4137579688a548de638fc807c39322f01", - "a7554ef1569a6be8bed28c6c55c08c175a936cbccce46a76580255b207164732", - "540934ea3b85104e11eb15ceb1643dcb83fb11d9f17dfaed13cdd5074d035f7d", - "90e9cc117cc3f27a9bba2d078e9e4de8370cf747b08540febbc0e567fa25b775", - "c77c5da91de2c1d6cc098b19748c74c779fda0c21d585b3b7af582352fea522c", - "7678e90ea6b57a33bd999e7e6a96628b8d674e136fd26aec465aea1910eeff6f", - "2b6393a8dbb7fea76f7c9ec13acb8fa1a6520f204f1e61688545bdf36ff8312e", - "0101e82aa9e9acb81f35a52b1d3bb0a4e7211a2dad4bf7bc86d15af9a26f3218", - "213bec71b38538a2844d2e2ab6df4a2dce5c5402f823f1d84bfcd6c9412f1066", - "161c33f34161f9c4fc1dff4a7a8e9ebd75754ac0608c483648591070a8600b93", - "9dd6fdc3a7e7779dd7bcf3e350a22c27c39b6c313edcc66701995d1d220bb54b", - "6edb582c3d2e49a3d4ca027fc60c679ba28e65a6d4d09cfed389a4e41e2b66d9", - "a772f68dc62e0f333b0be34b5ad7675b3f766dacaeca9f734e4f06149c801a53", - "a4bab1b9e1a5ce5fa1df585e8e337ce96d008a12ee7e3b4b9750543b96fcb007", - "10ba10484ca300d508d0a68086fa7ceb83b8429d694ac1e8a14a08cfd59b03c8", - "f1b31379630c54cc106faaaf457ddffdfebc5244d2ad49d4acf165c4754ce258", - "6c13deea4587d4d1f3ab12f7621613e799b684c33dc9277b9af734a59ae78fa0", - "07e1b4ddde6b5ff6bb81a9019af98538f98343ac9d84ab7fb328916a38176ba5", - "20f9535164956848cdfbd989ec1562ce743ee12a945d2229dcb03ee474667efd", - "9e2f56769b977bc14acfd4463630e3f41596cceca19c73b2d53d2b32473b5e05", - "856b0f92e7737c65923a492c96808d00d87597021472a47484d4a9767b17fbec", - "670bfcf607f55f5d8d9d2474e91589c3b6e56ee1807c32a6f07dbceca883f982", - "d382b5a15269b7d312a7cc51cabd74235519e0af843e4a1f5cd84fef94cb5d18", - "188a0bd308186fd33f8a37c9b3e0fe2b0b469af4d6e0e4d416b12cb6361f5b4a", - "84d54583e12fee4d4f119aa08c7f282825adc4fd161890b565d21e998abc51de", - "301fb8e509617060ff5154344fd8f0a94b364152ab478fdb3c57359c54967eb5", - "a6659e46c7282c82be75f49e364e2edb096b66f7c69ee8d81a0d1e4810d8a83a", - "4651a829de658af9f2e8c558f83c885ae4b61a2383a2015ca49dc23349672c48", - "101ed62208a6931ac7ab0700368ea8122f8206b4ae85b3e0c48b1b52c28e8885", - "77b37b465c1b7555f28dc96f277c994ff1f8476e416530fd0b4f92aa225b21f9", - "df11b1722bea05932c4eb270fc65ba350d3b0a67f476fd23899b012de2170d2d", - "aebba7b30fb7d26d06088f335717057583b0fd42ec88d94a0707552037a72879", - "8eabf8ccb953ecd391e32d608dc23ac0e2f32ff3eeca2d903aecec84fd9c00c0", - "221f5dcaf1a5c286335ebf02f2c8a0b9b4d72a3cc86680203b0450cb485e50c8", - "27b4c24b0d36b0e2a1a1077bf7f7bd487e2f524c22dec64563b9193f2f3cbc0c", - "44d3e91ef0edc1b1e91e3f8d8a20e900b05912388afb6c86c76a6a4a7266cd1d", - "d267d151a3a48e60e44760e8ae1171b449803b1d975c27269d3373e5dfd2e591", - "81d0c6c4f57dc9c0293a20e28cd4d647ccced1d713409b9805b926f92aa24b33", - "8b7d9f31eea5d6ef571c41385d4016ac556a4957168cc8e2c25806c6fec9e647", - "c4b7f71eb356c42bf6a6308d61d7bed07f5ac68907c658443280e876e7468261", - "a8318de38532dca757def1ec8c7792566f736e26e8f20f519c8d83e116cc4e24", - "afa61690174da44a75b5fa87cf0527d58cd578b887c2943d3bf56f3c08523a2b", - "2f2c05f3a4279aac79e534f5a4a4413c0814c0ed62ccc0a2d26bbfb3350a27a6", - "b815dbdfca9681f3b9e77a119052d460b8068a8760d588f14c0a397fd5bb9f22", - "eeee1eaafc7965122207ac30f1f3d66e5afec93b62b790eb4f7e1f1e0ef56348", - "e8c17e7eed6af37810293c2de6479a035a7bf738f1f6496dc278b9c4da99e291", - "21811762458aea5bb5d3457c88cf8de81b114851b70260a1681e1c923d79b070", - "aadd2a337fb3ee78f1689492f720da5b884201cc5a28476f48350692573a235f", - "823043a8c3205d5bafea9eb084d6d9b388322c5b820c5d78b2a67b3eb2b05a96", - "68cc03a1660c22168a837b9a6d2cd9fe8f653f78ea32138905a8a4ecc61a2a22", - "9609a57ac72e46a6d29b46226fb47ca0257d3b268b9bb3c497b024c9104e6530", - "54b87e1eab6a1b64c51f0bece06d5f110ba77fa7ab64ce5c76ebde2dd58e8d67", - "19b80622c3ba237b2c114db160e714341dec0b941d87a376392377d3103f69b1", - "18f23092e216c7d60725fcd2d8221d97c7041bcb46234043bdd885c5ea17fe37", - "ecf2b5517e01702ce399b4a5bcbf187865fac9b569062267225da621926ad22f", - "6ef1e2c3c45d6deff275b929376ae9d05e77a03e7eda953d31beee4bc844932e", - "32bd68c793325aa426c0c68e78b6a29d82e948be2c44dd27bfdd2a6ddb7a8f2e", - "56287dc1acd2e08c15a405febbf70a08060a86b6c16cf979d235a6978045ce3b", - "4a671c7a17980ed23876dfd92ecd7fc51f580478a4c9fd61dbf5515733ade2a6", - "32ea75335dcd60acaaa2d3f17b9e00c42ea56828643b90108354811f340d5887", - "10d55ecba620cbcd13602dbdcc59ec5f29ea12ae0e3ee30fb8634996e137504e", - "6d02a6df31f4cbab273bc8effdcc046a960d1c12fc0a599515ba75cc88ed7388", - "6f8a0c2d82df0d54d2782c7e70ba8970a07f37b8b3a13573412cb64a9f00870c", - "0ebb261f86e3006fc7094df3669153f24c928c9bb8c4b717b6270cde457e7c56", - "eba59afea5bd1271e4e743dd34a95d858d8ac7c04da8ce76d608d098205eb2ae", - "55bb491ca67d55e44b9cfbc9bd2c4bca187c155dfaf8ec4b6b6caeb026698123", - "972ba90f54ff41165e4ddaddf0a488bf30cd8d69a28c2d8745a047b423f986aa", - "5ef2bca58236650b805ed55ef7993ac5a867c0b7fe521693bce9f3c9594dab1c", - "f643696169d9893e14fec5142c1999b8883ed447af705e10b4d521a706a5685e", - "9547b2683a524dadda823db6dc0de829d642e92d5de5364c7a3b7ecd8982c24d", - "fcb87557767c35fa825f4bbca06034f992687a721f99b199e22e1387dc90fccc", - "1d7128686b43402bec9d3e6f5ddcc252cdaee80ecadb6bbfa408766087049314", - "167020cda285aa45a07c3f81437c844c7f4152af00768ea06a540de41c824c9b", - "2165a15650e24a2513ac72e31e60e8325d566e3fb2eadad3b01eac666459c831", - "8197c0d8eecbae4cdcd51cf6169e8ee333e1a7d2a6e722a2f850d2e7d81a5a89", - "c7d85ef332cd300678e5b9309aedac57de8e2dd95e5ac9b69563890bd0575a87", - "d9df2bd96b8380067135da4379377accdf81e73dc59e8da398dea9e792135b33", - "77a5c31f9893dfcbc5f4ba7cff6582b915f5aa356aaf06b7df852a9c05887314", - "0f3b94ff22223e776ec9d9a708f019acbcb7391e1252abf78486e20f22e7a769", - "197290a5ff0959981560e41af790defdbffce97fb8baf39cc4787a0b83fcf42a", - "b1d174936f3920555e678f1597acce067f69b5e3eb2372b0588cf3307a8b6bb3", - "524bde64ef7033670348c25b701adc65d8d7a8664f32b2416ec0304808a81d24", - "71c049534f2c2bad10843c6f2325139603718dbe54c23c40573174030fdfd1fc", - "03ab763d0c90d211fbd087aca625cb3766b51fb319653813b3042f9df8bf135c", - "fa095bae717af22b1ea6ce5ea55d45747f28c3807ef0be364e518149791594ce", - "f5b8596865c11c1dee77c9c78ad4e3c81661be5921666cfaef973e91bfed759f", - "b2236a1c85b10d6caf742e04101781629dae488d76fd00a8f2ace268e1718e57", - "eb1c36cfefe654f60b722c76c2988b9a44f8a73e2b71adb43fecb02fbec33891", - "b6a2b92882a54817dd57d3284fec7107094b8bf8c5f03bbfdc67c0a9e781cb23", - "163371b52e8dae86fd4c9e7b7bbbdc2232454f6f925aba64ae99fb5cc10b55c5", - "1d24f8bcc28638657c4b928e5907477ad7f2480aff4b2560d99711a63327b3ba", - "89e2b8e24625c4a61e3e6d32c5f41fd90061ba0cc664943dd6204236c6a622cc", - "2c661b76dade16b9507fd3c12095e00aee910ecddc5d6c7b6de9d5212df1e032", - "1111017a3271e58d55875f3c1452d365c264e3dd1274cd13185835b835b06d28", - "e60b5679e4cb91713458dd12dcc1b39a53c4443cfa259b13bb996b060992dd72", - "807db32a803596c79dfcb048fc6d385ee33f9161f8dbfd50c3c884ae10ae3e1f", - "7d0e64faae981c75857c36f0c8ba3ba1b68077da01cfcb8be96856dc6b171b4a", - "4421855f2c73ca9c47bfc50447c86bd56684a5212657dc43261072cd14aafd77", - "df6c526a27a47e13ce29d97bf427570827aace633d388a1e3bbbbc424057e92c", - "4a25442f3e2cf014c5a89672d5b8a4fcb25142a6112e520828b8f9c73e0b5d89", - "e2c0c05ec9c8ede93fab62d1d023930f7fab8c0eb7b511a6a31a4440aed574ac", - "4f65a5d947b3dee435040b89636a28283396552b77696d859d3d5f571f5696e7", - "2c2942b8adc2419132fd3b30f5b589a43021a00711db8c76c92e591ae3fcf0a4", - "b8999917d57995f2597cae1bbacc53b2cd52a0271d2e1764b933aff0d34fcfbc", - "d849612919fadb790809cb838f5cc0fb363fa924018388d7c5aa10f2088c7b93", - "711469eed15d3eb0e754cdea99bb8fd0270c378b10257353e22b2c2e4d474ea4", - "acf443b5173b0ed2d10a5a44ce5fe39ef41b3a40c1b38d4f60c1e80401965b84", - "6318dd1a084b97e591ba575ef950e94224fd355d69cdb896fd8aadc51068ce6b", - "b1aa617e15d485a50fbdce7d5b3c7f01942c0310d3241473e2910a017d99a62b", - "e247ef7f1662b47d539090f6f743624631506db9ea50a2aa296bd04b939a4eff", - "79bf3084fd6e5bc0e146b5e30e6c145695cd5a7e80476fa095ec11e9cc2662f6", - "2a2e10a5c012519936d65c01e8b695fdc8c92b1994418174e5896a41c17ddbb8", - "c4b659257acf14f7238f067ed022762af61ac442baacb56952f43f5f9508a3fe", - "8fb7ccd3ee1d752ff632d193e8cc58ed4c1ab9534555992dfae12d1f1c875498", - "4769b27c18b8d394eb4747f02f309485792b59cded9ba09494274f84ca381965", - "6341c718f07400364d28e8cdb952c8a58d5ba1170b38864fe5531be886bfce9d", - "d46f1cc568afb6be85e436c72dd01663046fa6d750a61a9876c49a01f7bc9fef", - "cdf8d81a610de24c11c18b9093dc6b7e9d825ce6b690ea242c6c57b39a73328a", - "79f6c183dccd4fdc7f47e8c400886d0196690780238cc0fc744a7805e0b04d5c", - "ccec2163b9a33f887a877e8b2e4dd56e8264da9194a3dadd7f40760bc8e5e636", - "cad2c3dd2d0dbd90ae20aa202dc48980c4a4ef6e2e4704d7f6e738462dbe2689", - "0a4574639d5e1749b1c0ad371b6cb97c523c967729d325547784fd42bf00b397", - "28146a16ed2deb622c46071a7e67cb91da2fff22d2ea725820ba202c90ab83b4", - "92d43d3849f53a1732200e8a02c9ce4a8582203c8c5cc85c58e00ef79a958614", - "eb11ba964f6fb8470c6444a8f43ce50aa6b6f25b78f3cb365dea3c45bf1419ee", - "4870d3ba44815ea9c0237670e42f225cee94a0071a510972e257b92ffba66014", - "210a37fcfd4f523224cdd28506794f5fc984e9ea05d6e57c9e8697fd983a4ac6", - "8f9783015cc594620feed69a8e69dbecaecb93435ca305a3208f8bc560d3dbf6", - "cf2d8eeb4e49d54c5783ac69b59c7cbac1344525eb53aa26333cc4c9168474b3", - "ebf2a64d903266411ed2cbb2820dd1a3c8ceb7c9573c394f192b1a2128190fcb", - "818c5877068f7a1690bb39bc1f171dc5953cf88da7260094b0553a965cc18fa6", - "f33c7941281f8c06ffdd606d4c8ead94d465f1dd049cb33a2530c0b21df3f621", - "0006dcdc0fd107d2770de6b5a524e49de11afb53c57a7c88fdd2b0c8dcf0c8bc", - "387cf5b3ea42ebf429655062183175cb9e2fa35a6d8fbe20657e617f9d6cb693", - "3762c1cc07cfff803bace3a569a960508d0705b6f028166ec7c489d5217747cb", - "008c22cf8199921e516e2b8420bd736fcb5e747204481a0222d25e8896b3b297", - "d4f2a573bc16e1ecb087371cdcbff6dd9f7611ce9d1cea15df1a21bb48ce52fb", - "a88a79c0c6b570a886cbd3dadb508cfa90cc7d71777e9b4f8c85c2a9dc7f05ba", - "77c42102f809cac8575cbd76dc64ab6f44af88c8b61e61644bef948fcafb1b4d", - "e707bba68150dfa61813fa8d986ae0b1dbd4fd6062a73c69a33e2236426c92ce", - "bfa3973d1498a348a0161f6cf79db4df737594ccd72c35ad8397c5a3b67d972e", - "89b359d8ad31ec26eb61afb5411ff4f82a728587ff9b86114f1b9bfc4a7dd3e7", - "d4e98409e9b8ebdf564dbe68a8f17accdd369b7de37bb93e05dce1825806b363", - "da11100185063fd3deb9e675ed02ab421a606ab8fe71b147bbfdd2adeb34f5f4", - "74103cb539892a8bdbef21420cf8407dcdf75a871d96b1474632343d6ddfcfc9", - "a4da6df1649ab7d3c025a00e7a79f3d166ad671871382c40897eab0f9ddeafc7", - "a60faeb007dde6119ab9da3a085de73fc6c7d8c88160dcfc5ea3194514fcf09d", - "b4de21f8e30556c3ab864d39fb9b780d18c494c0b34acd896049d714134f269e", - "5bb63db18d5e152cae5bd0ad56ce71fac2ac511bb29ac71f0a0c230b9f0bcfcc", - "af09e2e2d059bc1160748447f83d2080872d71e51c23c540e8830fa341efd6bd", - "feebb1320c21992b56ed04776f6a3935c7b619a726791c1e304e086d81da56ad", - "75a74a048e3de5d7c2e8c00093e221925e9d16801ccee4b751fae7ad70230ac9", - "7454a9b4a606574b247e375537ea6857d96b2db3eaf81d230891dc4d60415aae", - "27a9633e73a088b871d25e8260161f6ffe6c6a0252f330d4a05ad6a85df0fb39", - "6517920990068bae9633161a4b6bae6be7737a5d6565b22e952f1c4a8939114e", - "ab1c980f308d154f28aa7fa0a5d4a4732fd7f5c6fb770dc2ae6cf58c9ec3188c", - "053848f60b0e879e65af6d1137b5024825eebfeb265d0ef761852c03cbf8347e", - "958c0b7df69bdbfa2b4e2e39e3981e269649bb9b44a6e0d73f5e877b254c3ee4", - "7ceb3c69b4a73c79058b9c9c1ba7102d668d610abb8dfe7e5d67d55d2635e952", - "2901591f05307933b6c63bd7eb0cc59b653731c59a6ec99187135325b04a940a", - "fbae9bbc8c1485835484dc96ea932548ebdb3f8494e497b6d8c81b7987310001", - "96d43d0fb9b38de124ee3eea3a95b7b189c417158d926f590d6bd76238d9d079", - "bb884133ad3a8ebfcf0822de503325007ab347388aca5238ae50ed704c1696cc", - "bbde44fe8fb573c0c3fa4f329eb030db85b432944a9c82bc3b2a4dfb8512ab98", - "79118f77e3d7ecd4451bec21874faea7b2a320f67c44f481fdfcbd6d94db917f", - "0bf5361caf60f20ffaa5bfefc01548e31132974598910b91f9ee47df437ecd84", - "8577183cff96d40b154eec83c196d143a2d365724456f8951cdbbec0cfcf634d", - "c571facc393ef22345c9282f0fa7e1f40cc4545fdef5d909278a01a550cb882a", - "92d20a715c3a0bfa70322b2fa7135a868bf0a4f63d556063522c12537a4c0a04", - "4df8bd486021e04014f28b12b3fc7b07c5077b898233cb829dffb7cbb11d1212", - "c492b341e557b633057af649f04732dffb1ccc46a262fad835e617d3a468e2d1", - "53a304a96a250eee7bf14c36a75431282ffcac446c5ce3876808a39ac325fded", - "d910501bf7009184f7a15b402813db82333e28fac1edea36e0db523b1c198357", - "0fca933d1a3108296e5ebec807716ac4f8b541d9d1be88477d0705f04c7da1dd", - "dbc1197a310a62a87793083919b3141e188c2bfef7f92a0b33af57c9ebd5017d", - "624db4e1aeb9ec38d85af0235019e7de671c1f3b4ae698f050058f5da13d24bc", - "e89f3a142509893e7f0a32a9423c41fe6fef25d4d04a1d5377a45468555f75af", - "3e070842eb537711933421c7b14dde776741ba88a37f08ca3e3d6cd1e73b4afe", - "efb648049d6c399904383367f7cea4d18e840be15445446bc6e7df2ccbf257e9", - "bef06d13a4338673f4809fbeac3529efb998277c9e41602aa923cd6fe5bcd7ac", - "677ec41ab961cc948d0323256ed7f826550f7032fbc729a0c9b626557c206a64", - "a8e4e25538bff37730346a64579c873938288bda98a4dfe9b07afc48d27e6cc1", - "c093eb04fd2edacc6f79eb3b9f271daace9cf7490507be21318d07f7c8c35cc7", - "93158e408f671a3b834178ad501b68e3f01745abbcb5a2080e31af1dabd1e934", - "409f71b79b7557d11f87e4196ea85bf3188ce3f15f0a4df37c3f2434c7a314e0", - "1c700c1c221d5c4aa74b09bc4c16f1ce395aa855776302639c872aff96be4fa1", - "5f1d66af59d55486d7e96e40eabeff06ace56003692c2ab5ce49f3206fd5c81c", - "deb1bea5bc8c2ed8212a5e7888738c4ae36532124e1b49ac189b3f616dfb5b82", - "9ffdb59891ec38c3c712f917725551cac59bbe5cdc5d323395d0f68e0729c6b0", - "d0233ef287cd495faadd0066618bfb197252b4b086b00a4dc8ce8e389a8c0219", - "7997bcafee75753fe3d372e4aef013f73af5bb4be973363a9a9694200b79a269", - "02f47eecb7f04e159a78539f6866ece2f0ff87d9cc9ceab7322a3aae6d998413", - "9cf91e952e68da8ef856c80f8dc4a4a31e8bf99fee221d16eeb0e345d98ed692", - "81f93eb8730f190ea74fe0004d05e961ad9605b0eb2442f657d082332513c8aa", - "ac2950b6edecbae6f65c317b9a1c0a1d8ac69769a804ec83d63795ce7b85982e", - "92b9ed679b7cff04b06091c305e188724aff71ac4f28589196f17663cefbaf10", - "96cbada64abe114218576de76cc305de87329f1d1dcd526f3218f38a7bc6ce2c", - "aef1de9f62ed2aee7a0643f7233b09568aed3b77927445bb9797bb5a90f41cb9", - "481795c9481e6c525aa4f8b535ce0e66d888b6dc0240445959202c28025ad42e", - "ee504843e694d89611632455b790a5e005044290e2b945ed8a7464fe5fe5992b", - "ef24e3a03759c4f6f1ce370b5ba635a77ec6a584d76b85ae1f3b17adf653e5ef", - "b3dce7876cf97787d0df7a7514c18a4ec8c334be5c9887c25c54f12347ea0ab4", - "5de9b9e18fe3366122ebce2333eb5c1e75965829d9e199f3f0931a8bdc21dad3", - "30322ab0a4c3b840e751ed5c10c65ce8808a60a6b0ec5ea9f77831806c775ff0", - "2e94d0ffc071aa2c9a58d30e4bde81dca6aa68e229edde736986290b1e9b5ebf", - "7dbb80a721f35e8cdbf1b3d1527b7daa601adc73391dad44b8548ef3e07065b7", - "4ccd98877c06f5c5d39f771d137a54e29938a06f3d30a3e5bc0c4a6f5ecfee37", - "ceb3d38f909125b0b294473b4796a6c4b083b0751798100607e0ce4bf114c036", - "ccf04dcc34e7253f3570538d00ce910060a70df2034d194ac66b862811eb8e0f", - "cf4f1aba8f89a724b658687da6a983c44582906de5904bb63f9f0ffc0f239443", - "e19470209948d999433e978c3259f5df7e82442a63b974a7969c31b4f2a27ede", - "a0efb3c656563ed51ee86692c305d9b3937106218bee1bea047326f859ba1240", - "b326db86dc7638c8687b97eb0fc5f4c00178b5e1b6086d07d940b52800681963", - "5d59c1f21e45aa2f6b939cbc0effecf6d1faec6607ac44534b1bcffe45814cc6", - "e71e983ea882a2558f2b76c7981cc7da92cb4b6eb72a9e42125585047cb720cb", - "5d81a54139bfbcdef32151a8b844c6058c465901ba4c0ec77848a185203d7063", - "401841ce695751d31b4803320514a0b17eba5219ec1649e091b3d4a0fb6c526f", - "692421636fc75f9dec767c18846cd2e11b82e88c8a799a93e2ccbdcb3d4ea3b1", - "8ca8f8e67d9a5358d803a2f93192c00367e1f40a9d2412f3d33a5ddb76e79035", - "9d7dbfdf77419ca0126fe774b24e1ff825843b7b247e6d07e979d00703af1457", - "43e2421c208a7ba57d55303b3afaa31e8f9b6f37916d74714d42a7fb9f9d602e", - "b48210dae2515a22be67958533eb2da889b7565dd3677ec286ffea2bac9e025e", - "be57e491640e129b418c1b6e5983d03435c595bc0f1cda10d552f3a6d2a9c1c2", - "033202d85776c20cd9687c8c6bbea016b0941a7783d3936ec3f19660f0898930", - "85c73cb653c55e5868aef0427a092b6423a9206652c0aa0ed4190aa2344268ea", - "78ebe9ba565d75c815f92680e25efd4a8f48ae2c33817265abebf34b79e7a86d", - "c89db5f1169d2d97dbda746aa87dfc259cbd1fc1c4ce57285149b1a6f6f8cdea", - "ee05e28b7e374b94f3b2a719a020add41bc9cde8378381dc81d4074be11c4d7e", - "81b4f5434cf8db42a5f9b52ce344b286f369f8b027d425b76d75b343290a9f90", - "d8f361b6ea7fdd8996916a1db2f4987cbc222dcdaffe6a73408f4a05f765ad5f", - "24d6f9638c820371121c0e58921694e3e333d1c637e69677804a314b3f2ae0c5", - "e1924d07ca6f56854765c5791d6967f7f79ecfdbb9572520680b89a2c93d4a22", - "768c91f0c8fd1beccc3521e14519452d117c9038d5d5aeff95e5f9193d58061b", - "0845c7a15b51d78d5301a5d15ca1b3aebd81a80900b76eee3cbfb21cbf31b5d0", - "889ccdbf6050f8e93505a370451b49fc64aeb80c76bc6b55fec5ffdd6c403f06", - "8fdf5e18482db0f2b277d3bcf383106be8b63cfa4291cd0f631e92906ceee2d6", - "33a7a09af1172b524d4ce1cbac856dc9ae69e1fe154f18172ed4758c7584d1e9", - "6a8f0df94c858695c130281dad724ea8f2d6aa031b27c0f865107187f088fb19", - "9046812ffa7c0067fdc26034616f3918ba4cd6d771628738efd2c275895cf571", - "485ede4df618b1c1bb629c651e47a8feb9c2dceab774dab94bf4fc5dde07a39e", - "7252b35a05f21e2ed40805ca84b354ee4f78e5c157eaa11e42750c48d718afde", - "cab19d1b61cb07dbe9d7dd6972caab2bf1318d230e832da90e3acda5abc4a8fe", - "0bd67b2cebb286d4a63d0c3c9998f1c7911283b9ffc25eaf851a8d38c059d2ba", - "03c6fee471ee7c2c9a6a80843739d15d54d1ddc4938729bdaf30fa79dbb9b8f5", - "ad71b7a54be0cd839e6cd1abaac1ed8b9d85b99d672fbba06366f43c32fc1777", - "3b8057ba0acec9c374ceb25ea2bb92d757b61b1352fa6c44306d612120f7c491", - "001149c3f6ac97618624d0527ec7036cf5a9c0b7cf7675dea778d3006fe350f9", - "20583e38dd49474409a5cf14c248a7c53326458abe27bde8d206987cd6a6ed93", - "04171e8c58db9bf61727ecb7cbbef99d8a9ac8955652ede9b6211386fd8e08e1", - "915ce23f55ac15e9808d9aff7d069a1df5d1013fbff8ce4d972ccb52aa873de3", - "6a0ea5b6a793d5bfd434e6036d6366a7c3b41fa9809ccf4e2d79e8df38aa5ea7", - "0d469775139a852cdf93b7de591eb1135c6a20ac73d9eea988fbd357fdd00e54", - "3888140daa010f94a2ea9abaa37d7f04ac03e80a5f8cdc84868f949827f62d6f", - "7040021e6825e3a539dd3c2681fd352978a4e250bef1d9d1bd548da0893a905f", - "348f6e18cc562633d68b0e45bd941004318b8b1dc48efb1591c997d1c8ade72b", - "96f0fcafbb960fb8c349d03e4fe2524dd815c0b1fc773d65aa93ba525675aafe", - "625cc873f1cb37ea9fa823227b0a5f92cc4176c0e991e763b18bc9fd7bb3fb81", - "3eca306f207f39a60ce7aafaf5c7b67ae4808db0785bb029ce9b00b072eae78d", - "b9b51901c622cbef1136b8f71b68ff237d7c2b48bdddd3d7aec19100a95f0e6e", - "393c85a4cf96dd2d966022086cd2bf1a47c3d5c0534f9dae4c898555e62fcf36", - "e035f16143367c8b705a834308c90b62b045be792155148663af174e135d5749", - "2619a2b565d1ee9c6437002123cd65f9a90c7b6d898f35ddddd0bb7fe9befdfb", - "6f9184650b5df6dd765941cadf376d8337b540d81097ebf407cf91a9cf489410", - "02399cc0271408aaea2687e2d930b42a6eb8ae2d2bbeb0e2e5c35f03a6730e11", - "7f84c0197e5704e7946eed4a4e0e5e5e465672d8b875917672b670feb53361ea", - "2c469bfb2ad1e33e59a0699fab08f203a15a0992895145adc010b0584cd7db99", - "f9a28e379ba96b8a31e73b5e7c6043339b75637797f8690233189411dc3c14e1", - "7dff974abbdb590087700e204618ad4bd71ea6df05a6c80b30e4ae34cb0ef686", - "376f108ccca1a8bfb4394a556bb7d107ed5a7131954a407397cc76f94ba961ee", - "44de78790bfcdbcb1732b2c0aac76ed3afc5187a93d226d78de7466d42bac989", - "106e7fc4f6b7b508b30127700f69412a33bf753db867a527a4c3df8f2a9a7093", - "1eb094cde146c57908d1d10911063acbd817e381e183eaaf7b42d35bedc7fc8a", - "900024d0a1770c9132064741c4ace5e27162807c5b7d96247e74bd024401f53f", - "b9c265b79bde98d4f77e64b1106bb6f048add1cfe56488e88c646e7c29229551", - "e5e4434d0a04ad7656db6a59787f1c378fd57fc08124ed06dd7c4566b4b0b4a2", - "87dcb07b97fc4f3c90e5f65714f6430cd91c46f47e4e862938cc0c6d36c6e98d", - "ccc256da30fc68a8b9ca95217749444ef6cb6a7759188223dd6fc38d323a0bed", - "b19a19e52c6680430554974da81c916107f956de872c04690d5766c69dd417f8", - "a520c6223aa5f925921c1c02d6d125e02882354aa341c66885b421fa38743a61", - "a0bdf87448b8157ccb4df91ff1e76ffb1d3dd4f96a73d40a57be455db0386bc0", - "d5d8dc5f453951d71591c645d9894eb3d6d1646e93385514669707ac266b4bae", - "db9428ffcd9044a59ad7d64fb4f2db05590e8a26ef7c4a5ffbb7f559ac591ac2", - "ba0f1f38a22fb436b69b4a84c9d57f31958420600611e84b21a8a4388780820f", - "b4abc4bbda9338210b97596339124839dcf1dcfd1d7fd0f4d6a56fc32dfca9e5", - "1e7bf2e9f9ddc8e00ea0999387652aa70de6fa4d67ac6d9cede6106256f89925", - "c742bf8cadb83264513dc61d1c896b63e1637a51eff591a5f2ae79d4b327a2cb", - "0dae76d98aaff6520936b68ccdf1d0c28375eef3e91d84ebdc49dd4ea5608b04", - "416ab9739849f0996b35414926d308c59e4eb23a463e0092b9f15470e9ea0511", - "8471381f291f658ec807e4fe65f97edbd23a26d52e2e6485b3f9da14de18efc4", - "1308ace2e44b41fe1539877c458f19240c4a47299b21c5b06b1d927de4d10587", - "7d55dc3301f4fae2774df63b8706ec433243e9ec22f808fbe7bf0dcd1a622959", - "37ac7a2aafbbb756a38320a06d162abb24e82cb124d0d45d5e6490a8fce5dbb3", - "245495719496e1768aaf8ba93a080ec92d6d0d9625f9052b31dc2c48e21a70df", - "e20a13d36b803b006bb724e9f8e5699d34c8813b1db9523846252c26b2b4105c", - "f568ae73ccf271fc62c9fb067c887b88e2c4e3cc258688501de18f3145ee763e", - "044cf99384f6225757850aec709dba809b36ceb8e5870772a19020328d17155a", - "a2a38b9c43515a947512cb1be6a1bb1888a323e6b539683c23a337730cd94765", - "f7a7836bf114aa88b68984c72953cf449a59218c56cc738bd831ae7a6e75251b", - "eab422e90b3dadeba2bcdd4e2feb95e082e08b26665761a21b2958b08dea2671", - "577db4dab8c6d95c11d70db61901a9ea69d9c187fee4eac684533e0a2e98b58a", - "99d120330cfca97eec69cc1cf07318890459fe3fe334cafef2efd518f71de215", - "cb2ccc4895b2e39421b515ea63241ea8cd7cf59ddede1aad9142b23e4a5a73fd", - "797f72376cb884b9d6a76793feb861b0556d33dd23963034a704c0db85ec7212", - "2c3f4c6dd04d29ea462a16a5213a17d9daf29bc37d2f03de7c5f41fd199af3d6", - "6159e01aa48586fb2f07dcfe2c38e228fe3af1b4eb97b377b2ef89fb10dabe88", - "abcd06e8998b0c04684015a6f2a301dee98a52136af3263ba0df1ca4523768c7", - "b454a4afadcd4b876f08d73a04f7a430fab9d26df0bbb42efc4eaf9fa4c32b40", - "c6a7e443a137b87ed46c5d0df5f2974e81896fa448011c972eaab9b48fc03103", - "857e57bbac3772c1773a98e898226fb79ea87041d56e8d303f3b1e57af0ad1af", - "88d8006b180b251456423204f70f1132eb3577bb2e1bf9e18b47a30f67edb29f", - "aaf6e294bf637a3069a4ecbead614271fe54a516b191468170cce0b0721af731", - "f1e7113c76c0920fbeacd900b6548559fc7f13ae0a8f57adae6f45d33879f451", - "08285af6572b92a316588b48107cc5d85eb39bd51710ac92c9f1d8629a794a38", - "222582b2719068cdf69dd5590fb423afed42151bd9a5a4779f907c69e7166946", - "cf31c9da193e8913126d46c089303790ff11c031590ee6e37ee7be9dbeb795cc", - "cb1a24203e94b70eb0f6a607b40584d1454143ab875419bc5faac5ef34f18388", - "109abfc34bf944077f0393d658055af2910eedb5d009b21e54b75c90e4c90413", - "f14d69fee6a2e58521cc18a2253bf4e152f5a208796f32e8e1f1dc973d572510", - "048903ba51ae57386f9f108934f09cdde454a3700747b2e57cc368763e7229e6", - "2ab1d9628d8db746b07ea47dc371c994fbe19958ab09b9dfe5f18ac433f18f1e", - "1dda599e606ab0a45a151c02d844347d995b4d1d5bb74b2ee9a9d243a0a21cd6", - "3cc227560b0e4a1ce5e0bfff9dcb5c7b6d02585f68e256e19be6da34f5bc797c", - "097eefcddc71606ed0f2c8ced5e42acb7c0041a0ee526390a0d7b5a279f2ee67", - "0b88d30cff4f417c61eaa389332ffafb0e1303efba0c11c0d64fc6cd3e6e5c9f", - "502d9940fad35db85594322d071c9aad5e0324c914f177d4b11ddee2339554e1", - "c331e8d0297475c4afec51dad225caf2b99bb2ce3bdb56493cab308af3080cf4", - "dd4d32c16b603e8fc49468330f264c9c322f5c2b7f5f5020481d3eee5c58d910", - "186313f2a69e98aa7dc35fca798f5bca54cf742784b9d55d935ccfb2242b447f", - "681f0a32328da0b3dbab4d63e87baaf5ad04255826b3bc3325b3c4c1e5dffa20", - "c026bb97ab8b36c512ff57df1e4e45709576dada7c8ccdb1f6020cbeea061e48", - "086bb256eb728b384be787b4a0b33cd744f08a718eaa3a55c8d5cba53a465516", - "73ad37059745b3d357dc8985a03bb080f2090287c44e3a7ba5a782d7f870156d", - "b7f244c6d6b63c806fb35495db30f6bd9add2ccf00103f03b8fa5060615112d7", - "a04b5f076f824628bf358d7aef72472b9c52fb568d3b4d133d63f114e1627a6d", - "091d9e508d09f690c8cad309ba319d96c7f3adeacfc37565e7354f2a96d5402f", - "1d3730099e9ca9adb7d4bc4f9ffdbb837a3dd9e7ec6ee814c0481b066a6c5cc4", - "98664c3e89138e865f5a3f8b7f95f282f226f80d751d210f8af4711b715fa356", - "63f804f8b7b5266fcfcb342dd2238e096aff3a4e1e91c49b2248c64875a0a9a7", - "4446f86b2724a857f100a39d3515b61d59d48ccd7ce24f664d47a708bbcf8ca6", - "4224bec02d6c7a274c53b7d4de1d8303b9fa603327f01b839d44198abb99c312", - "1c3a8f7270fbb2bbed4b9430e6873b9a6e449b8eb6e44ca695613dff5df92e76", - "f85a765a1080b5381dea9e28e99586eeb776a45dc6de14dcd4264a36e3fe9877", - "4e65c4015f4b80bdd68830aa61378a37301b25311c22ecf7a639f2d6a5db8902", - "ca6dff14431f7433aec2fffa8874f96cf6144e731992931ae034afe59dc56b03", - "2a6921c69134c21429b953c2e1b85813a820adf146d6b9564dcf16b4a2f9e4c5", - "71953e5eca0b1ac7c56ccfd690274d0ad77ffd578cf3179930e721a35aecbd71", - "29d32d1d89d703ec20828d63bbf803df21da40ba74cde6d6b7c80a46a7496ba3", - "014188ea9371f76fbd96497a4d3d12b82d785c96b57225f9ded63212e570a18c", - "7fc9eb04582b212ae50c164c4c80b6954bd9a3f5e999238e3019887708ccd28e", - "18fca8bd0f7a6f6d6288015454452dbf299801faca9521a1684df889f102bcbd", - "d0d1618fe75dc91fc601e222acb1eb95351181d6a3c69ee453f5593978a88646", - "0665fbff2700a4225f5a93574b98ec8c7516c8cc5f6a45a83b6c08ceacb1d644", - "a0e2d28271fcc125133d10901dadbf74f7cc6617d57dbc4c249c382460872b96", - "f24aa5c747141941620bd6795a53d53c00b94ade76e37de7c8f2fdca5234c8fb", - "7765621234bd15b5414a4adb6f4112d29a3b7ac09fd8f60e1ec1e2be849b2b78", - "b9ed13407108342e54744559aaf8e7b9755828d37fff5838efcb040c01bad817", - "108bc8e6efea4f0c007e36f9fc2237510d1180ec245c1e6d6c11a8141adc666f", - "e197d0461ee5ea9ffdbe441aee1b3d0fb2e6bb5e5f48c86086211bab96b6b20d", - "70d12dd89fd9b3f8d6b8ffdb9f79e444e8ca3d30abbeab643f9f79921bda95ac", - "5896ce699470dd9ff9fb7bc1b0861b2aea93065cd0430505264ebaa230fd3aa3", - "9d9362621654bc27ebb891434f4cb1f44adb0ac50dac3aa65b55f3d127a97949", - "08b1a175909c5b1080400749c218fda46a43882aa8f22e62e2a3b62567239681", - "48e6352f9534c21409ab68b1c4b6abbc87e1abc3b0e05cd47705b8017a599cde", - "445b9a22908d65756c841cded3dfd7634ec879fcdb41c47c1dedf81ab42f9976", - "9826afe41d73ca06873464ef384e84294493a4ad40a4b37aa19772c691b7dd97", - "7819eb2a8c4a09cd136dfce8c228b33e6d80729afc347acec12956ec6dc88dc7", - "5fd15a48da265b1cb4e35745924bf489e6d5cd8ed3975d9cc21fac7bb647a301", - "9832fd659ed2b311662850f0db0f0a2fecb38f39dd06cf2692e2322d5c93fae4", - "3d26980494e5c22c7ffe202cad8de76ac75d222a38d0ad6f5b4ea5bd35142643", - "c0a86e90a184c67b2c6b303eca8a0bd26e9867e6cb5e4482f0fbf6609bb469eb", - "3843b326e00cd64ca6b65a690d9e01b6b254dbb9bea96ffa5b399a95a8ab9723", - "a10a9344a56a77569b952cbd0bbb80b35747436f053028cb05f5b598a2c8b6cb", - "e4aaaa9234ddb9a017be82f8832d1b7afdff2c0d61a6c5504888b974f11a9210", - "4775275336aa600fb0a617efdcbb64da807456884349a34989e31ff6480da680", - "c4d56092f728134d8b104790a8a96ba77b74b608c2fad041c17e6dade925f044", - "e9dd22e7d896a462acc68f08d073f9a8bceeef3e744fd34448780293eb0b3d0b", - "e0557f868b5d9edfe1fa0efd3815aba4a128c0cc323ba8a2debfbea42d8d0164", - "2b69631850f8f5299a5d981246d6264bd9977d6b4533204e7d326310972e31ce", - "3a5ff10c5b462009774029388ed9277a9c6f92274022e231343b4e2517efbaac", - "a31f8dd23eaa4dd5ff827635adcd254ef2a4eb202e24c14a3f6a10a05841c015", - "8fcf9f5b35181dc0859ccf325b58771e5eb0f39951896b02abf4fdc85f0dc6b3", - "320ab3a00860003d55041bb07c60f01debebb2a618bbf5e54f270b1a0bcc2c8d", - "109111001cbbfe3de21a6cef1e12e9fd726e5195fcc55f333e31298f1c885c41", - "5b9914f32559ef382ab11f1eb1fd00f6f885c2e3089aa972296362c68dd971c8", - "6f5f961f1b970b8e8101ea6cac81b751c4d7f89681d7dd3a6317dcd5caa90332", - "cfbb504a6fc61af9c04271db4d74975def0b9b743fd44e2d2745231d2d7db22b", - "323d2f25493acf773cb92b938087c296ea7ebb45a119099c5b6540dfdbfd02aa", - "dc38e0988d23dee2936a6c9fe7749fabf0a1468c07b6512df6a64dc085b1af65", - "0a373aa62d28c471e48a1136b99f7bf01a415bdbb9d8e25b33a71ffab7b9e96d", - "c4e25354658e5d0d876f0bc9db90b2c25510ba5e2b0cdb27dc9440373188ff02", - "2af07d0a8de747d935bda46265c95ebcd96a3612dcded42485079ed76115a491", - "21e18e8684675ead2e0dc5cf1d7e769835d96cee1d40759ec36678df9a6470d9", - "26e278b3e7a9db022c2a4dc94042f5a5207613620d4bec10f24ad36a8daa4dd0", - "deaa90a972fcbc2f440dad41038cfabf68f98ef2452f32797916cf9bc817f276", - "62844f657003ed95ac576ffb0220e36895e2af6489a46c8e6b753cf17cda483b", - "9dc613d422abe6815c00ba96f82ee5dfe8a5111200930124808899326533c123", - "ae027bcadd905e8f1149e6f5420a4be941d471a950e97c4f2f28453c23a2863e", - "12bde6c9afb4e46432215045c37cef77f1014a9e9942bf530fe482d86030c7f4", - "a6e234d12d46e5152f2e4a73cb1c1d7260b612856d455523bd56bbf8d2ea4b03", - "b49a795d2db833022c3304bc30a0596ef580562592c251d210be7eaf8ae23b07", - "8e0e20fa05ef9802102aec700fe90fc830e9b596093e6b9aad409d20c6edc46e", - "cdecc99eb751b66273e3a14c58512859f41810eb1f5966e34ef50100966641a7", - "b2eda8be54a43b37f8f73526daab561621dc2669a04b7c828f4bf997aa7d4bcc", - "8cb924e4244cd6839108817042f8df942edd27b5a15cabd625f087eea30b3b12", - "e0bd0c86a9b3bfc66c93bbd9cc77f6fa132b1c9577f1c9a6b00fe0636cd5c3a3", - "e9b99ce7fb09bb76580d45345880a8006352023faf7dace4f860b2ce6b114381", - "97d902ecdc875a04f2470c36f6265550837fba3053019a2f769c465f8804f843", - "f4fb0fe6cf1d49753a58d74db7f3a110191bca8577f023cfba30a59ee10a7d5f", - "8079b936b95050b595351b0338c7a07c64af10bc48c196dad2bbe36a64ca175f", - "054d35df4d8963ffe8b555940965bd99bcfcf37ad53c1876b54b703f382a63a1", - "bf94c373333440f910fc9e3877e924983cf23a95f33f8dda60358898c94f4d40", - "5c67304e52579a5f9e78f873916d8d5e38e09bcd9e00eb09c1f6b651dd15917d", - "cac6da17b4cdbe3b54021c429eaa4dfccb43813eadf1e52ebe112194d9439715", - "a14d11ce68adfe92153ecc323b6de7284b8b1f8cca3919f1191c5b12add1772b", - "f92c09358a1b99904fb51742b48c93ff2793b20e8e76501bc6297477ff5b5e9b", - "47c3b701a35a5feff0f5a80600f8970f7bd9ec1bb77eb4286a697f8b1eae72b1", - "39910a4cf47c7ac92fa49d1f6ebfb4d5cf2c705ceda2660361c71a79a7849612", - "a67e47475438078b0b6d2891cc8af1bc07b8d477fc203aeab27c19c07ab60b76", - "201f91bd0f77a0bf1298d28e8eb395fe0410174af7c968a846e73d944275549a", - "b2ec7eefad82d9ccdd9cb3817abf7e4503d69ff28ed1a9d39504d0098d225340", - "eb6c22e9719bfb250b038e12d9670b7c8492cb80d45d5a52c2137b25aa82df91", - "a1abad95cb5ffca2178eb75308a384ce9bf69c9938350122bb4a1af360ad9def", - "77782cdf728e3ef5cd7e0438e5f8599554352108f6e3336a9fc483a9f67d5855", - "b2483e21a7e56919b881deee6ca7792f47cc38f601d86fe79810933f49c0f391", - "17749a7d51b80ecadd1394526754393f63ef7b17c90b392f49cdfb4a335038d1", - "221662dbf675a5675b2a470a407f863f0dcaca7079203ed66b73ba9499ec9041", - "6ebf7cad0bbca5327b25b28ffcc290151358d1cb9e88ee30b9b2b3c717ec9e25", - "3116c280b90ac3c2bbf0e4be5e07142b98da23c06a06592af26aab3428e20b7c", - "b81ecd96effc7217d3d071ad81f72861c92ecd9dabf8cad8b995a3dd11c45745", - "70c6db8cf4c30bf8895574545e728eea02eba8b666cfe322b8ca358cbbf2be8b", - "4bda75d5310a0e2f162b49dcdf8a611ae3d668dd07b3fe5cfd777eb33ce97a58", - "0f547708eeb77568a4810dd34fec56b0ff7469e226b1d12f9de10d2a92aa9de6", - "31b675b0ef197d7c5fa9227fbaa5dc29af2b13e003eb7f6aa1fdf434fe855f09", - "308bd20f30cdcd0175976e9142ef4bad59bbb564c08dea857f4fb73e5d7562f5", - "f205ba5121f65c9619f4ab37faafb3e0b3b1b5491984321cdff667bf92f3a3c9", - "588f31b9496096741cfa22680b72ad88fc675fa5c8beff3e3e5206cd4d9340a0", - "87d55e91bb8021a282246e39b1461d403857f9d0bf4a851040923524f07c5f08", - "1936e771e2523aa046fd205716f022f0e8dd1a2853c62322af317dbe3455bcd0", - "4f2557c4d900141f30e305dc87b207cc5edd094d50b5867738c2cb08e2638089", - "7c66db7bfce57bf6f4f0c6fbb02d4215c2cb978f9c6f68dcd8808c36b8946f66", - "15602d2eb3d1789a95e3440f82d165aeea6ab2647b56bb13c589d7f0a4209413", - "0a529d0330b65cc5399e8991d37ee510847ba120c9ab61e7a11091eb59b2d12c", - "447a2ca34015e7860d99d9b29c5eb1843671d6978c45af491535052707926687", - "c7dfb2282790b50020d6d6c9bf81b143f822332ee4a4f873aa984c1379d3d6ef", - "ac5c241d6d1349275cd84565c1961f21fd0f5eeef8755c0285fc837d551fc33c", - "e61a1a2c722951caf90bc7a74f3831b53e87dc95d23e8cebb2d67cc8d4df989d", - "a626250a5c0b324efccdb31b5344734126746a77fd55afae663665427af2eb72", - "ed577cec9cd38d915941a39068abc1b661b3acf4a87ff398598e54200df2d7c8", - "02605d62fcc982a94ebe87669aca401f602800b2c2c67c9ce0d72fa791ffcd53", - "6ad3055a9ee721b7df0a2de525af1f30acaa596cc3d9d67f66a5a1fe5447d2a6", - "b905e60f8819d025e222114f61ef71898f04c8a4c2a5613758e6dc86f380c6c7", - "7761c9c60db02eaf958f54cec3e06e6f2848bf59b8ff2f7fceba456883b41cf9", - "ef39eddb3d242e64cb2f2c505858638b5572626724bc741f43e7d6331d28684a", - "101993e166f9b5f434f17cf657f48e07cf68b19c0a4baa3d6e5cf25e804c6674", - "8ddfb1e094fb99306de0ef1e7200a34270788c00e11f64c377ed8556327f9b2d", - "b91a109568b21976942c2ae7b053f1fb2acb8b6926c59f7ba5e25ad600cf6dfb", - "33f3655fd8a517ffc590cccbc644b85bc20e0cf85fbd3e333090845c16780693", - "1ad13e6044c52972879153eb0803a84d9d108edf338d60ff977f286be2a1926f", - "f91b2fc1fb17d2988002a5dced6fd509f9221369b9344745d2a0ffc6b60d518b", - "58799752eb72194acc4785a18fc4da9a6dfee1e51965279d95a3c23eff58a72e", - "b9df23cbd767c9ca2bea793f9366b948bf9d56e3eb03709686b0cb2da1466257", - "d3252aafe8abd0c716dbced18524a99d205de8e9236f918ca8c0941d8897eb9f", - "b306ca2352bfa093a401218632eb36263758fc9b8438f268de57c3daa9dec5b6", - "43352501355ff1bcdc0c350df335ff3a505508908f7d4251eb7e04cfe5234689", - "4f4dca16c17ccc09c50bc928457cb5d55c01a607cdf1f022c7563dfb18c749c0", - "89f6a4c7a6d49ef7f561722c96c39eee57f945aead046ae0515f2e8943bda3dc", - "74a757e329609087edba1c2ac656e88d07ca82280d806d2983528686b29c2487", - "d5fc174608c254a482b9adf3f0b57156e545a4ae1b0fbaa4cb7f193095dcce53", - "05297f081894d909841eef69404957a4227c4db50df0d768f8afecea27168a02", - "f1d600633eba71217e46136a77512e5c8fa8de2aeacbfdb2c43e4d0767034625", - "d977331dde3483263ea5f6640a2aa59f8b1eecf673444a44072594bbbce063f8", - "2de3bc5c3e00baf8fd66492e64dce00fd816fa5cf5462afad589acb64242311e", - "4395980f04cd1adbdf670eccc45ae5bfab14babacbba34cc90ce6df18f9fd25e", - "c37364d024e81b0ab4883a7c5f0fadb64d7e854670e723f817841c8adf9130e0", - "8155e31c6d020168f56958516f2cab820baa383f3fd160e3df2b931a1785e61a", - "28055db281263735873084add0c5ba01bc423b45a142e10d8a081967c3081ba7", - "41bc6daf82d82c9dd571bacd94595e94efd8a5d17a3fb995a5df0c0347da035b", - "bbd945e71271ae615046fbc9f2810d6572601b5837f909057a3f086038034980", - "775b90a6ba14af91aa8ebb0632469849d67108c1d960cdb543cd1dffa46bb3a8", - "88b314e99fd5ef73bc5435e28e7f431850240b18f1b7729c6ccb9e0e9d583750", - "bdae5ade03901bbf8c2adb00e14565a32d682c3b0045e4aeeebff0dc681308e6", - "9282eb8f84df7e34b71543fee9f4fcf1eb6e9ddbc079b76d06df556fb10a7657", - "cb3842de38b8d138f633aad82ef9d8ecf58a120d90021b09aa43863009c1d5e9", - "7a2d025508395bdd6fe3d99a590a097be9b9d870df4cfae8f8cf0f2f4a5751e9", - "22fa0344e6ea2971ece02c8243e75a582d2e96fcc590996254fb50cf93893582", - "1d3bca528fa980dbbb3c1a4aa15180885a5131bbdd36252b057128f27ba7ff81", - "2290d2a11c5aad1bd9776560be0e35805a7c604ee200a17923d858832259b509", - "8f879e7bf095043fdad8876ad1644e4e19ae9dc90a8fd65c908373f84011967e", - "345f8f0c25ab4608bcbcf07b6f13863d9ba6d1b87c730d4ddc3d6f7e0ba7dedf", - "351c08f8a40c6746e8e5ce052513679df7f101ffbcdb981209f3857986c10b18", - "b030eab1d1ea3687019e7373675f43dc2b32679b443316aa03299ea1ae05dce1", - "2817e8164f52532037430a201a7f175f5778c70885387795b681da26af1110d8", - "14a87eeb94a8357f5c3c9a2b043821228cf998a7233811d1b8e192ac96e1b764", - "3a667d67f81a11049f843a810daa29fb0d167aecb81f7ab9d0ca954fbc48e7d3", - "142f0502f054e0fbe60635596ea66203e0109224bf6f6596e8cb8907a6130498", - "ff1ad0961c426d31d0b0964aebc1b3247bb1158720dac3e89e47c909c6609ff2", - "08333a7139513644c51b8c4048218fbd17a6b3b8d8941e0f2e7e41d6963c7435", - "92011f4b5195ed172424d243de49abb9bd28a41166fd5d03e20f06b0c34a8e5e", - "06a0550187ff92cfd4f8fd09438b3a471ca35b3c61b0df3f96adc1879372628d", - "3cc54ce152ef269ceedb00a8d5ccab5fa1b32e8355d8ebb55de820cefdea03b3", - "69159e8c0123a6daa074db99a9e2de5651a2ace01a1ef17b43d2b02bf5d81739", - "4c35af8016c50bc0f65fd2264b99d926232fc1a7f41d639a6fc31c0492e12311", - "ef39fac89ae400220bb2c010ae96946258d65fd284d55c09a0b4f2b4bbd9e5e6", - "cfaac34be6a894517819406ac0084cd3733730a88a41c34491f242a74f3f76a8", - "973312b196c5d36c0bcf81258b99976d00bf8983b75c5ad39e8fbaec15bb74ab", - "83eff94c450b249aaa0573a2f5e7491448cefeae30216dc508ecb115d87d0981", - "46e2d6cc92f31e3887c90ef700d2e0c448d26dd7f96d839f66f1a1489e821d39", - "f5f9102cc095aace24ce2d5667937e52588c78ecde2f28c81151978bf5a91515", - "fd1dfe4b6ca9d454c844c22a2074cbfe3e920a12cfdb7c3965659aa43b2ec1e4", - "1c0ccfd2baf88e65260182a979b9786860e471aba051c4594ce175a39bba5d66", - "70cd9676506ca3edf77117300e4824032489d508a16b44e11eb668c91bcbf1be", - "245651d841e94abe9c069cc49cea990191f620b33b54fca9d0e1207bb7c2de25", - "ebd8ffec2accf24514213a19628f64a80068092201d3b5093e30f419b68b92ab", - "b39cf9259426274b449be31b54aaad706ff9f4e419dfc924676c0e3e74ddaacb", - "8489ba02703d29a07cff390ab30512984d457918a7376c9ef4391bdf25eebf0a", - "b093e3f59b97153a1259f2e4452772135dd586718083b64c329edcaefdf17541", - "300632a7c99cf581658ca645b185a6f678791af3ccf9325ebe9c5671b801e494", - "cd77ee997c9d97c2638fbde9b7fccacd96979fc1b350fa30c116016427450944", - "7fa437ce44386a60391f1aaf3969dc6b2f179516c050c2ea9718e20c141a2632", - "d73000dd6e3e054be7f5a2d5015879b600e286937908b9b8493ec1d93f0b7f62", - "e0b4ee2c5ec41c664d66a908d6fe9ce3c7792de38397ff7188811bdcd63ebaf2", - "329c57c891f793120daca760793bdc2d6c68a5852ce3b7282b74bc7986bc3a94", - "6ba4c0dc795306790273020a43a54f294e10292be053e89e5daff699b9589bbd", - "f768d028c6af63ed2a386c30cad9e50cd35f6165e5752e52d05abdbe0082203a", - "9146efe8950ed0235ed133c2a253df1f96ece4dfe7ec1181e39f42eeeee7f74c", - "11ff94f2e4ef9ec30bf48c0a27ce927b38265b7f959fe43bf2a0f61f02a597d2", - "09b022a75da45a8e8f3a8719d66dc0a283e152a7727fa04340760e63cc61038c", - "6f074a1581aea739c3d0f76027932c89fe30baaf5306f780e020284dc7ac6564", - "863f1e5dfc97a17d9ab5dfd3bb3444e1c95f8826f152d5d4c15345d320d9b2b8", - "5f0b402c550ee384bd8b7a2ad244dcec42f08035d0a70c5959830e18aa50221a", - "7a5e2047d35d0e04358110f4e184924df8848f253a8ea7f53edbef2e51204d47", - "b20b7451f0a09144bbe3435cc90e52438c3bce1f554274a5f7bff33c589fbe53", - "087c7500583d2b33db2b9b86aee66777094f1d2a781aa9ecd7a94cd725e46032", - "e21481aadc5551d623e7ea6ab801323b0592dd57300fdd6064e3d9332d7ee8ec", - "f76612e85b9b055bcac84b81f84e49e1277465621791114eb771647ebe6eeaa6", - "caedaf2babf929f9e3cdbb5cbd62caff1c783944551f6bed8d17fd1138df13cf", - "223ed93a66796b56c1b68fc17c1155f8e7dc73e323d05665048deaa4af9fff9b", - "9802c2093ece9c9890c194f3e81cb8602ad911cb7734dc92c1e1a559a03f9c69", - "6e001076c762ebaf61987996dd1f48a622a1c64343f2e08e4f7c154370e52479", - "79d58f68e3204e20820b0e1b531a54774403849554797481e5a47c9cbbe93a24", - "dd2ba4a306f71487548d0ee1291cbd95ec0b5d0fc7b7473a9d9a6f4559dbc94d", - "9410b6d8fe2ca67bb90aea7387d3c8c31590664d89b2a65d684b17a29620b974", - "72cc5322e8aa494d95c42c5c633f1b826b8b50f1c282aa252f6a57e33daaed78", - "5b1c73825b1e4a105ab8ac3b64d6f9f30723b95aa7c462a2ea68b41d307ac1dc", - "867ff8c00d6f9c9ff378028fdbfeb082fe683366f5fc47cf147921519c2cc1f9", - "d65b68b19ea8d0c28d2a1e609a47e7bf1bb12c850ca36c53813ae1fba8eec04f", - "a49b92885ae5679aca2fcab1f6eb3c1f2fcbc0cb585796b3b187632960558a94", - "26d63dcfaec65daaf1517a11e245e99a22de91a97cb1ed322dd0cf0b19a8161a", - "4c93f38ffc7bbd0fcbcd3b64a084c49e5c58159c85ccffaeed2af67c17fc319f", - "8d755ec5b40a160527ba0c8e8e73df1c34c92f5248f3f7fa03a58d5fef0fc1fd", - "a62d1748f0b26ea4b2f2489864c6faf4439c1235d7908e29f898d910014a8f12", - "0332f1cd337273ecb6ca45cf442ca36a6a538df487d7fcef4ed27397049240a3", - "c7da46bd2c673767f64d38c0515670f147058359d59846f0385f03a1fe86784d", - "4bfe630baa93bfe12cd143def8509894f4f12bb429dcb1f679c710413d74d5ce", - "64fa5821b30d0dd70513370716e3139f00fccf946924eed950cf3d6a5e469b47", - "703811f9b69fea1a695c101735024c0ba64629643a3dde77ebff5030bdb62141", - "06d417efbcf2af664088757262f3f597baa3fcce87eaf294b7f9111ead5303fe", - "d2a4c4a5cdd729d055f2918f68e153a72865efdf0c1ec453d05007aa355010e5", - "c703dfdfc05b75c94876295c3ce104460013cdce8b4b86c76aedf0779ff6acc9", - "dbc3fa70b1c3c01f1f1af7c5677c9b8cc30b218628bd1ccc911cc9328dc9df8b", - "2993ff195f471352106b1e366b24f5519d2a4c0c54e8dc477138e640d94418ca", - "5f94178b8add5cfaf6861b309d646d66229657dabe38be765d795f8e47cfd144", - "c83e97f07e3557ec30040f1a755fc86405afb2f3e0b16a8a2059c83e76df4f34", - "71cd34a999d72b860e802f9997aaae1fe698f8aa5ed1e102bdfdfdd9fc84b215", - "d4b7dce296d740ab8b131ef36d9fbe96172f7972113710dc5a7d104aa503c692", - "dbb12ff1710a3569525e6a9ed9ad06f4bcfefb067f4e5a551348958e61f43db3", - "43613695bd1a5461df935309fbe73795c949f897f2cb9617e9ccc2309038992d", - "21d131863672234481496b013dcf0458736f2f468c13da37b46ad84498dd7e00", - "8282f276b0b7a607a293acdfa54ed48cfcf20c94bd734ae3743480a7faff99fd", - "a6533324528ae4fe8c8fbe06f9ee3a1d04be9c14649a199f92da5392783b4062", - "6cf245ac6d1b8c395e61ca8b6d5ab6dfc1e79ec75e33f4b73e02485e856a19fb", - "51a01be0e97f10e51c9fbd217dec848141a7eddcdab40c4ed2493f558340d3d7", - "4e292e4e2a7d890e0b9878c8fc1285c5b98ad67c25731428515c78ac67c831d6", - "6ea6073d1c1b5850c80fd86438af9a67f92d3cfe1500b08ff66002d89f480c12", - "3840f3039cd695c8f7af29c0edfec90f9aa61a5f89829c4d6bb2760fc76c8bc3", - "0c458f5544c2588375df8b5475897d2e2c0bea95140b3684aec343700624012f", - "30347169171c59bb24804ab51912bc2a11e76d8d3c6f1dfada57a2d8ba1af9d3", - "a5a0ddfabfcb37ae9c0defd1e22b0c7be1be1d33232c8a4506ecea6a00f2d830", - "ef548f5b79882f0fa7b4617351c43ca5086f7a72d1ab4cbe1b05676d8e4b3fe4", - "b6df5e90011f66ed16b4ff659ed445e62fc01ab9ff868eb956e3233ef235763d", - "ec828c31d2e2c25689dd3d2dff03567b0a31363e30632444b516592063121868", - "a80f988c6ceb5069a6bd13e44c0aa03d7a0321bd496ce6eda33ecc20c4308143", - "7d9baf3a83f9ab7691d7e229e34f34432e1abcf1221d61a14b86cd4db4428ddf", - "975ad2ac9671b38d4d20c73ad5c2031be6e4ce93e0128f06582ef96e732ca0ec", - "ca1558b4b9c4c33cb724ac512e7656869418b2bdb27e67f8e90c3643d17c2513", - "1e42d3d1535793f6ea3deee49a6c1a544365b467d8612c36ea566cb02361333b", - "1e9b7d49c1c32d9550df347ea137bcf2257aa28e2fed44c474bcc2ced3768cab", - "add53e6253cbf6e663169a6c0859100c1dbae19d41948aa6a34f36a46108e4ae", - "7b8671dbc90cff6b931ca93405a5edc611b62b116d99bfbbd84307bcbfbffde3", - "01a47cd94129b9717bce013d2d71a7c8568d2297fb1c29bff68963426da8ad93", - "3fdbd8c5d51fd7652f19f1284dbf6c9ace87eb47c4374d7d7143e1d67a526f10", - "1123f4c28b12440c4868129b401936831346e4b0dbb3855bbfcd62fbbe4f8d15", - "cbc1546695b7ed9a0001cd122aea0132bf15b494dc362a6573675327040b8390", - "a6343d99764f481ac198424b9516d9a7d326dd0ccacea31d81f3f18604740682", - "9059dfcd87a8740ad6a8eaebb3aaf70bc963799ae9500cf792411bfab9850b5a", - "11c479551c04fba19f05ceb7f89d1658a85ca37762e99fb8fa6e952636b1d8b8", - "e2e0d27ebf9fc5bc7b413ec1c13191a14001ff4829397e3ae5b94667b9d67602", - "aab6dfa305d7b00ce545a3c42a1afc954651935b9a81856637d6db31120f14b6", - "bb8a77e926e2aa683f49d7164164742a8f86114551db30e49b545f21a7754e96", - "30ac81dab4dcb9a64331408bfc045e5e37de25b739fe8a0f1317166c6fae077f", - "79db551ef7c17119eb602d8584b00f371501852fcd3096ab7fb6a8dd6660b1f7", - "aadd114107c2c290cf22a61a1a44a77a39cd424ec1330b77fc781e50fcd97b98", - "6338c91e181a593aa59cf0ab2580f7d32c16259b320ef5b66f017134410032c3", - "092d9f0fe7c70355aae12dab5de5f1c337e199ba23a059838f1067e5cc85c668", - "11a18a93994a746ccca3f8d7d899703699fa66ca26bb624051fd97ac019115f0", - "81a84116c5a5a5af28991e0574b5fb8aceb20bed347c740588ff8e5b43117d1d", - "41711ca51191e1f0705aea3da8057df668a1ee1e1d791f5a0811b5db8bf0f6a9", - "cf2f7a07503e8083705aa07f10772af5b24a39240528ddf1fb66fcca1f3b294c", - "0e44fd1374f49b1c5c8c7b997e93c81daa423a63887c075a967d6cb89e5602ef", - "739955cf4d5a09fcb424e71d4749e9c6fdb87539f36c6dbac1eabf92403c2da6", - "f4f7d6fe821ac1b576cb98bfdd761a9cc67597447459da05d10c3ecf634b53a7", - "0a754afc33ee814796d93e9458338f0224f744345cead11ee15cec7e2b717416", - "45fcf9a018a7e669e245df73d7bc5afaf778144dc90ba42457e44add28d1cdc6", - "519d8c1d30014cc2d4e3e99d8b8042f37d48efcf745d9551b0ecc46aaf8ce14b", - "1040b5b63aa63e4d97ee48014c31cd98e629e65f5cbeb92876134772bb6db435", - "50a0908e1d6b952db738a3b571641096c0af830cdd481876690e169dd2064d72", - "bd103087d7a82744b3c69ed0b58b101dd6dba0e27356d48c5b3cbcd1d666d234", - "8f83435ce0568a4d5dea03e5f78c08893738eb74a443aefb1a40ec6790557167", - "8911311810708a972b127e6c102a3aa249ce10c332bc3ff4c4289352748b1051", - "2a2833ee98eacd4a61e11290a7e6b560dacb006e6a3f215cca915a1828fe99bc", - "6e392e26dbd78676da24d17f4ca6422ac497c99822e7a6ee9a3b858294a1bc64", - "b57a34ffec605b5730ec0bb4f71a9e5e329e804554ceefb9a3d8637f566ece32", - "9d1e9d0e0924e2ce9a5b150c08955593c3f79ea6a3d99601bf68150bfefdc803", - "a490724cde7df276a07a723ad9e3e57fad32c0e682c9f18f6649011efae154a8", - "e6649bea0ad39e1488f855b1d833021badea595bacf543cb5d5088d90386b6de", - "50cbe13836e1445d8a2939123e7953e43a291abf24ad5b31dab7fa49efb25da1", - "8f48e60efd61a98475f5527be1da4222f91ae4260e0e4cc91ccb822f92708c14", - "68a32e3eb135f545ed149e3f93994254bee2643c2a321983aaa0e3b17f459750", - "6689ae3cf2b7e31f9750f682e59b3eb0214c817bb5ffe7aca43b4c962699f3db", - "fad4f68f3dc904847e5a70cd4f988e9b781433682b528bf30bb5b5afc87a3243", - "bf071eabe73929bb612ba5524c63f1c05c85e24d4c6fd34497973a016c57f7df", - "29eac1a815a03ffcc638776684672bbbd814cedb3bf4f7e9f4b0dd08fd7c9dba", - "a77d495d96c5389f3c33c6176c12eec331c4a33a5212f3a19d036d3a769361a5", - "bf452dd2ff42d73d3206d91345566eb472713e820db9e4a9232f0af2c1fa3629", - "495de4ce8d1c223a595f9432c8682cfb073f6c7e7555504adb4b45ad06445480", - "e24ba744679f540cc56ec511df7963dcb61f86e4cb3b70670d0b659d98d46476", - "209077d76747102eb995944e5f71833395f7065e609ff305761a52bc2ae4c817", - "15ca36dc9d8d471f1c0f6e31fd0b8d07937e48b4f53ea9042bda4fede7709c1d", - "a4ac40bad35ae2c6569b79972b10eea6db8fc156ef35292e987e0720f49807ef", - "fb3c07257b89efd9d22dd5b5b49547383df9896cb55a436c3eb7a05d80844d2e", - "e3b0248b34c929d943fb35ee3bbd969d64c18a464c14688c26c59f2cc21528c0", - "359ad508dcc3ec0a537884371685535eca994561c5acba896dcb95467d998d55", - "348686c1929f116d030ce2765b0686afcacf2b457c91e186923b434ee9d84904", - "3c52d045ede3be452da32a9c302d828296efbf2df05d9e0ea5f4ec32df111e6b", - "a8843bd0779bfd231303c848c6673d100c39a32f58574cc9c5ac3e56b7c4668e", - "09a828fdf3c82fa99fbf6b85a9198e0016811f79ecc1b5f407d238b06db5d9d4", - "2a36b82d49069598a736281bc114f36c2d6c688a7447dfb3c2c9ea3c2683ffa8", - "20b9c8c4151fd9d89863e18c77b140b629439a68c7cbd05964397bb46b02ab1c", - "9450a34282277399d35a29c063bdeaa3734f941d8d3f5716e25ac22d66c558f0", - "288648a7142c74b476c9fa6be2945f3e65f068001cf5299f53043194eeb21d3b", - "00a9334a7f578e52ce9b01a4bd40c973299337afc8bea5ed6c520356158c9846", - "4c2c31d96949bd8c00d0378b8119dc25e51978d88529c8f9cc8ef2009af4b478", - "329a92a08b65eff31eaf5f67a6a6498ed26100e59148c02bb538220c8e3dee64", - "9496311bed5dc749108c4e139cc57d567434eb718f1006c7a1a9a11bd3dfce33", - "d61177e79c3b1f165b716f289e2d5110ce32363594c8c396e7bdd7ef391c7c2f", - "ecd2d14cd4a2c780a9bfd2a4af2833dfe419b7ad8380034771b421873c78b8ed", - "e9dd0b3e4120e82eb8d9591a2af5e87977fd4836a0623e1156fab2b7ffc71288", - "a338588e4d7bb72679d247f13cab3cfc923b0fca3ef18ebab2d16d3bd81f7cd1", - "b75fc3d7486e76e341d592fdb1d774d23c5ba22964b7fcf08e6d8266c82fe297", - "733b513c14720345e9ec6f4b28eceae1f038a6827adf464d7787a14e8e0719d9", - "e016134d6e097e1ca93706c94a42a25092a4fe33b9328f60319ac94d9c287702", - "bec0e4dcf173bd2f013d35de4b611e3375df128accfad95ff2830f1c0f647262", - "0e36eca0791f209e47d4c205551b38e0122fe96d5983c9849ea30adec2e9415a", - "7a8b797b9498a6feaabd4c2979db2d1311832394170d379cf69db3303c9f0f6a", - "aea8a164cc24c7b2d145848a9ac99ad1c85c557a71f82513f1bb323b954f9a18", - "2ce48b8f013da32223bb4670da70fe54e6b0409f83589a5c2fa0f749be2d1294", - "39f33d4a7803e166f70366637e9a119a02d875d7784c63a2f6bea69dc94a0d4c", - "2f7f2eea76990d441775c081f08c39e9ca220a0f395ca35aa4ca40251bc8e868", - "911b9be36d6b3a247d17b9d1d7c354642592ee93a846bc394a74ccdd9328b059", - "e703ef5869230de22ba8ad760eb4bc6e4f24063846f790ab1a7e53a3c5f18ac8", - "c06212d43bd1fd982d4da10ba3158b201302a6b35c4f385401bb367891d25ef4", - "025f9cd1df40c8247cd63bf557fc937d0fc6666958c3e43477d235916c0b2c16", - "6c80650e8d56266fe69620974b673a6c85b36987d7106756ac645a472026c680", - "ea5e5efcba6ebcf9bbb5d170107ace942ac55cd3855e752138c45d03d49d918a", - "a31dda06d5b642ce9c1ffbf009710baf9b18f63551aa7f9fe3fd8faf0dcc82c2", - "34001d017e617a4401520effd1b3af4c01b0221adce7abfb525eba0f7f948eb9", - "09bbbc391cccb30951eab9181c101637167947d77e31994aeb716b5b3fbe1e9d", - "b031a46e4d9130d74c493f7c2c9eb93178ddcc6e6f3f48743f61fe03fdda4656", - "d5305102945191b3c1d96754ce2b860cc04bb84e3346fa8bf05847d9ce11fb69", - "b44cc36774eb04627fcb2dafebf95c90e43090d208b53f415fa324f679ea57f5", - "d935b7542a26f7e3cb207f7eb407ed64b8a062c8af02d202205b00cbe384ae33", - "f75e7122d53536cff865ec244ca087fbb7cfae553098d26031b1f33900a7479f", - "ddcaeaeb021b14f5f66341fb0252c1d71436f56c8cb2e7be14b4ff81ab3b8a5f", - "9bf892ab617a13fec75589afb1a121eccf30a6de59c6aa803ef072a13e661029", - "91176f882bf6b71c87c33dc8a4fbf3f64c9f78caef6673f53355dcddcee82219", - "7b9ecdd901c24d2562c61fa72d825c32bfc21377e50daf003b12c4cc39d2365a", - "a54d71ba59c6f8d35ee37c9a741a21fdb4fdf331d80a400f98a9b31c39ae2b8c", - "2dc66fb8c4ee6d05ad030cda9fd7355a5e30206eca6a987c68295e8165ac8b1b", - "83e3ef1543967c03813c5be74c1f87ff9290ba979ae7cd3b7fec413af6b6855e", - "a03dff3fe30a2067e5d3cf445cc1129907549c10fe28f5551bd26c9d1f03ec9e", - "78ff3b21dc1466e06f23eae2909a56ca172613b0ad8ca3778d84a1c27ef51df6", - "6548666c49985dca7d188cb7f9714972bd8826c2bc7f5e930897d4e382e33afb", - "b55ac44850e7cb5e3ed4f6926f328ba261bae84fd2cd8736205ed7bd5fc0dc85", - "a1070e388725becbfd6437abb3d4feabe9786b6ea519f565c341adef33367835", - "24fc87c8917e33a7c4bdfbadb63e50d946a5963de22baee55f54f6ea7a332106", - "bcf4da1f4c5b2e53f8f78570faa2411fc9dc845a62c3176e00f890368c8989d6", - "0de7f71d00ce8ea92f399fe96d242e1efc594057ee721c326363dd5f3903b9d8", - "babd2f38aedd8ad027d2c49dd0423f12c90f4c8ad085b0fcd239755e7e1feb19", - "350c1cb772a41a2c51e847936e71f6f0d6e7a49224b978f054c23ff1866a7f54", - "1787d840d1c3594ec83887d0bdfacc6e02a3f3aeeecf284bb1cefe6beecb362a", - "da98c12a3f978095a4f42de652bd612538b4c9e687056a12ec48e58ae41aeb7e", - "d363722f52570d951e04b3d497e9f8699dad27d2d658f844438dd342b4ef274d", - "92ab1c01ec4138a60d1b882f6b61d479c592b77e224d706d1f5eb79d82aef814", - "2314f841e01b8fc0cf972ef82981c16a64502a4b0c945cc6f5f492e6728d50d1", - "5973775f8a634d71c94df9e15d5de7c035483f05b7a7afb0fa9562eb07c6ce9a", - "78e6039048366137e3f130efefb960199a7af0178eed39dc4ca422af6ed30b1c", - "1a3c532a257124b666fe0db34689bf2199bf1db6b723c5cb2ab6401600a4da3c", - "d064e17390abdad5dad845a6c9aaecf0a1be19ee8473738555a82cda851130f9", - "1f9166282c95dcadc86df53e0adc9f9bb758412d426bc3e8be029260736e9764", - "4d960d71b41de3ec90e56f11eea74905ec41e87938a7aa1b5c857a25a0b21863", - "7932fff512286cbd811a5353f5bf194276e190938d99432e0e08fc78111c5760", - "d0e352bfd7e65a9705fd9ead49572be998d8a8b5e0da7bf2c5afc942f2f6f853", - "4f342ad3de470791507bc522c81c07df903e551c7e972fa6c5af95c054dba1c7", - "75fe77592585f121604a2f024278157e7b58a8d6e4a742abb98cfaaff70efbdf", - "71f41ecf208baae0e170bb28c6770b32c443149b1bd7794f766ec8e27edee78b", - "02d18e466c5f5c57da360c670c1e8ca49dc3343cebe1829b64a6dd83a7b2fea9", - "40eb060b02e6f9dce55fbe640e6e725b880e652657fdac7e07218180e53477dc", - "dc2c854d307464f83f4aa494985499377f588ca3abeb07b99b512a99a4388be2", - "0e275a9330966b493c60132ac226e514f968e074fc30c9c6998f2eb2bf61348e", - "c27031eb9759eceba94021a6dea665236dbd87c04b0e20460d3b22094b4677ea", - "736e89176a4cae772d96ee9c8d0599d2cb2c41c2267f5e942c81bd48c17c3152", - "ae6bdc63fd0cf4aec7aa45913317cc1438e6a4e1be9cb81fd2231ccfc74d9e4f", - "4ec5f37c78f420b0f66a5ccc075363ba7fe6c750807b2c8e4f5d40182d8f0339", - "7ae577442a65f75dc49269be3eb85883657563528b57d1dcf43f26eedae968ea", - "cd0de837c72f47f6c524b835bc3ebfaa90ec3cb72c145073352bb3e28ea2d148", - "a45bab20b75292f7125e094682c836f7932e814517ea13b6b85a5d18beb52240", - "030cfdf1f22d1485c676cb6924dbe32d296dfeca049f5a92e5635380675bdbb5", - "8e66c960d70b875b02ca1d19af322c189fe9424cb3d4ed9105a61198ff62c714", - "a3ca01076b12169602a3334754944a9f5d5d5b54fa50a9d39dfd5540da114fc0", - "9bb49f374de0ebfb32e9638576ea0815697721095b10cb75feb0b8764567c947", - "f6aa004f4e9a5f64a822994400441073f39ea0e157d2de3490b7628ca67694e5", - "a2bd47eee5f49ca71f79c2535f29fe88507f229fd469d488576b0da532d30006", - "07e3aa7464fdcc08926a823f16765b55832f015023869a35f9d0fc58a5afdd72", - "9526c614ef9c7f054802057c0ed69afe046c979fcfc28154965632f4039aab35", - "02445b37db872342d25bcf07d1fb46410fcc545b5653f03c5aaed48a0bbe6d74", - "72738089defe9f4ac7b2c899eeda52ab0f17eb681256029e2ab0fa1182767fe0", - "c080aba8cafb561c5d6940bd894062f009f41571bf9528278625cb02d2e73f9c", - "cc691216d56a6f80e462b48f158a8e267e4d9b1e7290209c80f50b148d91f549", - "44c6d7a936ffb1fb794a621969410053631e1c472b9ce8e6bf5ec6e3977bcae7", - "a18c73c6a78ba109a33b494c59462a75499ea60d22dc41bf144415a2211fef14", - "2efed25db141013d1a8519ba195167c7e645f097debb04948c7daebbf1590e33", - "526f2cec9db6bb310e4bed5687e65344066a1d2ef5654a710f637146f2441d62", - "2f54680ce42f45b4d5aab5bf67cb170ed457c5d04f83b7eb70b3f736c8d40548", - "3b8b67c78237ccb89e6e33fd60072d93ee461c79705dd9679f6cbee8aba009fb", - "7da42e4b41fa3cfb4145bf8675075da57b43f7245f84bf67fb41c05bdfe3d943", - "31c47abc8af1f73922c66824ce59fcef8c93873c95c0714b1927f43566376bbd", - "dc35c08ee7967d653c3ea3fc5bc0b6ee519fbde89c2e2842d337d9923909b72c", - "0d5cb73fa97aeba1e7f328ad01fb7de250068e2dbc9ed0219e9c1b854c61950a", - "787745eaf45f7a3c86c7e3e62345a1d3457c4bb3f93ffff758aceb09b82ff6d8", - "2e6dcddf7c1937258717cb8bdf78853fc95d8b6a97b3db762e69fedad0f5fc63", - "906afaf161637d508805be1e391fc4a17419ae3181cfb8c7c372e845bfc34370", - "96de8492c234b2feed96e069b1f2b177f1fccd0088a8ca1b8a66ad0022aba66d", - "e2d14de81ef49cc731aa9e8b5fcfefb4c42d8e397a1d3ae5bfa23db5e5ac7678", - "a75bfadd88d0b815b8216d102b4ea3be7ead6ec02d19fadf9913aa20178a2f87", - "fe88789279bc482cb020a065c3306eda576f22c394ae8998dd081fa4e49c398d", - "c2e5a03726486b550232ef774503aeea2dcfa09f3e30dd20f7621ddbaa4ed933", - "ebfb8a8988cc149477ddd4fd08adcfb451726d75db67356abbdee148f23a4544", - "235dee3d016edb69aded0994d6f14786968e39c459d3df58eb213b58a0c1cc65", - "453d150683b08ded8675cfa506c285d679ac53ae1698debbb8937f031817f1db", - "b9b48f8f381261516b6a17bade3fd411931c8b5167c25ca61b306e1dc6defbf5", - "01c47079336e93ae13f2a86c8482e94897a4adb718ea6064a5558786d3b79b88", - "e0ed69db2f3b3b10ace75101951a8ba4ae34e645ba7eaa351dea7429b8a07376", - "80e21aa765fe7f9c4ed926890ed17e3fb66cfe0818ae82834ea0a96a72b7b2f8", - "0eb8f66536c426d8ac270688ad6d06358ae0449b0e31247754e004b83a932b27", - "652f2c039d1ec33ce1db3ba819048db5bc4b9e4a38a785bbf639ade247342e9a", - "ffc1f3b6088af1a59ad892c39da511dc5c419a53cfd53f861dcd38c7d6f27a87", - "5b756fc5309fbb78767ad60aa21fb6aa51bbdc130f2a89b81a7f43b401678c68", - "c4c748120c7a88d89f90444c298a8ea0bdac49e231cb6b9c70c0749a54e56a50", - "8c8c0a6667421cde4fa6bb02049bc1d88d007223197e6fe5f2f1f8d7e1b50767", - "dd37b34e4d330b8c5d27c3d7fb8a2582b90ce7e79154c3bb9b1e8e12db6fd4ae", - "9128391f36b3a3057564a21dea2a19a2a452accda17bc367e9cca44a83de9f02", - "147f52079b0ef6ed1497baa86ff308e9ec36cc42781dece63b4ca7d0999ef828", - "d7b31b4986b37cb0e4ee0e3fa3c8e6cc27c99092c677134efef1316ac21642e0", - "ad1b1dfcf6507bec82977531feebba46ccd90c2bc1c2172bb0758b30088a9a05", - "98100f2093d98a6471342298eaced9164bc40265276fb386b64e804d2d0a74d5", - "a766c1d92669184ea093803a27e295d45dbfea56938b86b26f5ba57bff255dde", - "74cf35074fcbfb5d6e5a37e4276ff01eb6935fabfe80ef66d2ff92dd1eb0899b", - "c9a7dafbb89bf87406905c7f2f9ed10d25a70c88adbec73132e5ed13b8aac5ea", - "32d83f276d3a5656122180836dcaeb02ba3f7d4ec5a8067838b61c466329156c", - "fd31cb87b6f58e78dead17c5118e74ed2c1c3f9bf2967dd1705a99966d741891", - "de7b3cdca39f5ca5d577485bb70b5eca78cda377c98dcbb563a7d5e194aeb6cf", - "bd9ea9cea1339fc789b18381d77ead364e87c428d07283e43c954ed14e1ec0cb", - "f6d4f39972ce14724e007d7b5b1ae939b861af580dc9e0981945dd78eba2495b", - "9c5433ea158acd87de71d296280f6870dcc44b6e7f7e33a3b7010149a344b7d4", - "fe2df21abbf40096211eb4b3f89b8a5d1581230fd93af765b248fa3eed419549", - "a2e2e53bf6f9026c8e3e36db78a24ffbb0c152aa10120830bb1b90207f5bb290", - "f203eb46aba890b9f0280394e9a16eade977ef6949862a9bba501ed83279685c", - "801cb720b98874d6517dad83b44b22a0e901dc2f42fa016eb840a18f62b3f6f4", - "1503dc3e83aa97b570b3c2fdaec694d50666b037fef05ad495b0ec1cb9c9d121", - "e73bd01534eef5bac4bc4fb5c439a88d96d6723401c2307de9cb9713c1c59e6d", - "a1931cbe20f8b417b23695ee394f092233ebd70e769a6ed4885a0d637fe12b57", - "c62a1ad88cf4989b3d41c29a25b93f354695324a31c82182eb42f052b37d2849", - "b8f70602853a88617f23c9bca413aac63424d0234c3ec403f471e7938839c816", - "fd31cde1b2a2538fffbbec98f34578d4f42873282fa36a6240deb6db1e51de13", - "6d564895e7951f47d9916f2ca1e9d2f0541c836be810fedd67e10c0cfa434c81", - "6f63a4fc4d9a8917a94d3c4be3817bb726b2c09cee2271a7be14192b79fee0e8", - "4af54df0f82892c007980c7dc7d3523581a4b13f45b3b9883546f4a47eca4dce", - "b752f9cfb99ec498594aec9083dd2fed0bb69cd4cbe7c46f5fa7dc2b4738f0dd", - "b576198664636f93f3be772b845b677fede79426da89b307af038a9d5c2c4ab9", - "47ba34ce5a7972bc1e9e5c470d1d2c81fd612357a21b89d9c4253b0e92318668", - "726a678959a99a7c23c84481c98daa916fc6e056cdf5387d63b3983546ebcc9f", - "83da2e8b7fc4e67f291d78295752d5fd21cdee9c659a83333e96485b092431d5", - "cb28e29ddf7f997a38f9c1e0ac2476a4e9e7c6c38813f3248d83ed99ae2e75d6", - "7528ae43a4cbdc4cf7d54842bba4a2ea946a32da671aa692ec9babeb75960c21", - "921467e5d6220b6a33c2288f20ba3f39b5acd9a5f778f8a8ba7f3be5d3aa8f1f", - "422a99a0c40270a6153f66a77fe475254863a4344a5532caf02ec108637765ea", - "dd772caef6919e11e12f130feb497ec02230803c4a9149b8c3dccb29c2cafca6", - "1500dd9fd8440dff1479af174e24578d5705053be9f3adeaa6e8f3a4a46d8af6", - "6bb919e5f3e4b7aa138fcc6513efd5c44b4651f756f370b4dcec9d1c4860e92d", - "b8557a8ec7c369866b002be7e28e83c3ca602357e2b8d7574f20832227679ef8", - "c96147c3d3a3705ffe4ff10c79ea46faa91316d1cc7c9a2a80ad6fc43a352643", - "87fe9c6524f95dbaccff7454857b247d2f9d2c233bc98090901779b5ce93a8a4", - "e4ae22a04ac3139e91d14bfd235db4c94fac4d0e2aeb26976dcce46f5bd4619a", - "581eb09b2c50c58973583b0dc4f45bc7c0628d7888c8d4ebf7e529a9386fea0e", - "072497a669321c7521d55b083921be51db9a721659a31150f1c3a732bc9de597", - "1c1748e74154009bfeac40be62f3cbc43b14150b703c7db3b60a3c9de9e68711", - "2dbcaa89920a1d81797e7aabe00dbd3baf59049c9220a5a011ac6d9f0c0436c6", - "295419a5f56288516d360aa8fe7a3247829ee6f949803b43f5864f3dfddb96e6", - "20a04e1fe13d5c43d21293e6d1afcead84cccaf9b72763b030811c3d6f2de485", - "756f1c870711193e9e5c9d20e2f8a5aa069f5ec29e7b0ff7611b076727a08076", - "8b72c621e55f6a305f5a95974f5c9158d7f42595cd02ff10c0e14e2ad326d66b", - "91f87e2d3b361c7aefb9ec851c8226b88aeff536b3a327f9634dd17d9febab09", - "2049d4d7ab5499db27d6847def1e8eeb9bc73e748f2cbfde0dd494f0a5ea7b68", - "15897af52fbb9cc184d9b6fa359a61220b13909e6a4f552216b346f0d2119f49", - "c6ca9c47dc45da50b161443608a70392843eb06bf8035c7f73787a76e315c09e", - "18cee47f8defa2acb901fbc01b8e7fd5def018c2ca0e4855a4948833a2d73314", - "8b1f24fd132d8803d0ab2db2ac794e8976176fe6b5666da0109f675385dda98a", - "1aa20aba0258463db81511a0af122b0f0245209cbb066a93f05514eed553da91", - "20e4b097ce5f3c39b187c74f7300da865b788ec4827381274cd61e0ae3c560d8", - "69be968dfdc5cceb22eb453bb8baac7259bb67da9c4f74c56051b2c83546c4ba", - "2d768d44f5ff2d3aafe61408c9b1a30b8f3bd10bead6271d8e7ab95a311a5dd4", - "83cf1f8a9c98dc20ea93e597b675ef61317c93e47175246e33198e90e60ad396", - "a0f754e66a414703afb262dc86b288d8c9db06256459eabd9c78d72b1809b648", - "70ac9da272f1a3f3936ac1454952d81b3a45688944d04e10806094b201bf675c", - "6a2c003c9a57bcb81f48a4b5fd51fdf39ad025c54202d0afdda1b18de287166a", - "ad9593046af8eefef81caf6234bd2cc41bb0bec232baa4b2e1b72d504771f883", - "1853257cd601feafbadb55d5f48dd36a2c09fe948205463150ced9fcc1e84ed1", - "a26c5bd92fedb2a7106514721209621434d8c4d6643609feb7c5568170873329", - "54a69176cc89f317f5588a8b7e0542922bbe3f61688194d75b4bb9c58a8f314f", - "0c1d609bebd7352b398d3cef1d3d7d277cd475d6e0859c3e39a9f9158f23497e", - "0f96178e5c1fb451cb09ea82c68687d56eb777c975940d9f48c7c6aeab84b483", - "7159216e1e3c038e15b5fa62b0c5deb9c21655b7bd59a1969dcc86cffe59873d", - "5d03b7cd6a5007ac6286f99b315ddaf2f9fd9d8e576e820ac490d4ffad15d3f6", - "9c194d239411e58881ad9d6fe67bd41d3e1bee149ccf0e8e876169a5368367d3", - "9df1f1b2d581a2caf9d2c5a515c4f201fc2df03a446c1ecf0ca04f5515fc4adb", - "f4ba622112b8f37a87f836eb33ec5c7811326b681fd4841d7ef04a59f2dd3d5e", - "0732edbb78e771c8748bfabb3ec0133baff2260918484167258e92a63c591bfe", - "1f5a5e7ebda8ce3066e5a018809537c7b94181557e1b5772ca502674517ad7f8", - "1ba91e8b71dfffd39408b6fda8b97918b94e092a3fb17997e87686968cde4923", - "8ff093dfa4aaa87aaf5a0f3f5f90272beff771082608973b0ef186242a087931", - "e5a5b96ad345858ab62b248bb164ca617a03f57bda1ff653f4e2c4d31bd905ac", - "22067a05cb64a5400db48e6004b7fbfe0281db2d0d6e975a83d784b5f671e95e", - "dd519231a047be6daf5e6d3f6d121602296155573af7fc50ee534af50afe1986", - "ae3797f3c7af4f240d6fa106d30bb82ae53d05240c7f2212ae6ae30dae32f6c8", - "dec0c10e9d95f0c6676cea4881921e5f9054d95f7865c92839967047eb694e9f", - "7aa5fc746a2a95807519d6c9a57394f62f7df40cb8ac1c67bcccd9292b5eafef", - "b7455eef3c82cda84c7363e1da0851a09c1b706cf28754d213225357b8741d43", - "096326a8e6095813d82c5da16ecd15f712f8f66e3ca52ae901fee5bb2d7f6f52", - "05f600526bb442cef3fd8f500f6156b53474be1d0ac0736620c25ee3c0de8b8c", - "f0844b89ef3d6ff472c24125b4109a5818f45bb53a552236ae096e8d209c3010", - "b279987d4453b2cb347d296a971c2c13dc931e3d7454535d1d663ff5719da598", - "78d00a8c01af42ac1e1a48c4c036a926d038c9f18182363d22e6e8c1ac5d7dd0", - "0f2c72964283ecfd41c97d5332b8546cae1f43a4ebf3d759a133b6b91dd06bd6", - "dbdaf24ef033fe85e995c4927cd4e4b71226e97056297b7e19a9051bd77d46a4", - "f5dfff6d08e6b10fb41edafa6a0814e554d62b45e44d36714fb9f548df82c0cb", - "8119808bbf81da4516efd78a149b61b76d6f4926dfe917cd188f607149eb6c9a", - "80f202d6c2e6d45b6ccc28551ca218f5e13c4ec0271aef3cde81e3f4ac5bbe44", - "ac6ae92bfb94fec2a0bd672c65cdf7858cac68b31d4a6b76407465f1bc252c6a", - "0949f3fd0d80ecca06174ce8123e34c8f633745c9d68da90e4b74929ee88577f", - "d6267dbaf0ebdfc2046212ada2c831489e529eb13a80feec8f3e012902ab9c6a", - "8a106bf0a44f2e22c93a0ca4884ebb0c7caeb83aa55472cb0c59d5ffd05f7b95", - "f715ec884b74bb09a43d7fbd1565cb33ae839f3136f149e2cd3a6962191c92af", - "b419eeb6584388604c3ab0f012ecf76bd3a831ef4949e6a23c7d2fed8fac99de", - "33b0938f64bf2704218dce882859c8a4804f8f8e2e11afe52b30608500819c2d", - "69d49d884122697e2bf22a9bdc438cebaf50439f0e839d5333b19329000fd037", - "d0a9e8d5700b626483d56f5cbc16149776aa1af111420278f9e0e2e56d3c3846", - "859a418d836de9e96cba2a38b6305236fa17c9a04f687dbb70264da4a5f139aa", - "765e86da78ca38bb352889012464defa5f6e1d1bcf812bc67c41fd68203d2b94", - "f3dcfc970b940b46d0b6a76c088600353c8da975d075e718a900205d26c0647d", - "03a424223df18274bca0291a718af113a4bd0441214be15c58aea0f33fa7ff2c", - "84cd30d1135910bf7da70be40704af48593f7ae5a9c23f81af7f8956b18cc5db", - "68b44e7a55df28439a5dbe9b6734618a37f3d374033b31fd07d920522cc1dee2", - "c975a5f45a1758818f557b17cbcc58f2238b7c50ead8f3f712c35e13ce05eb75", - "c3051db8c4c3dddc1f67b780ecd3fa319ee7ef58a9c4769e35467bb21605205e", - "a854defc2285422afae0f53a086ca2e85ade83b3f741bba4a97e4c0e46b9fccc", - "6f69a3795f0877df3bbd49f992df71551d0e2a4bbbd48f96b049bb22e112888a", - "e78b85d2f90ac76772884139a0ff8aba5099a83f97838af20e589f9eaf0a9e05", - "86092a27af30521dd7afa5f69abf3e6c7f402bdafc28b3a3a70f789ed1226933", - "d8daf4ff6cb8970197fb6a560b0bd2965c1071dbf3b7c300e7f76ac44f1d2b5c", - "6d21e9dfb038af5ebfa04489e22fad9360e25d14784ccff30e9a348d79d33343", - "c4499b63b4522e8716065ef177cd677d5eafec47c3ce07c38f208683fb9b2fea", - "5ff5a041fb3f9350001cf7176823732a3b4a53dce22b6e317a5a51c5ad1cd209", - "95f3e37aacab1c7c43e2de168caaaff0fe3f5fff16b067b93a9c600319371ce4", - "95d14ce9e3c5f8126f71f92e09cf9b54fad541296c3b86eea0b76e77550a1713", - "27a6383ad86b82c7703811be0dc29a60c229eb92287ad2a465a8a7d699118cac", - "6873176fec480e382a9642b8d48d274c90b675e0901e15f10d5464c8ae2d1536", - "63409709d73b6d22d6804fb7b75df9efd331994270d45e6408b924e51d7ed679", - "8c9076f87fae4755097e4336b5de7c038fb9e33ea1688d86418f9c96d340e849", - "7e445a798ec1867abfdc0b2419bfe726ab0b9df5845260a6017c13e8ec54d586", - "a116edc2a47e5a2ac676753ae20826bd1cfd845cd9980773453061db130dcb1c", - "1f480d0da9822b05e7842b988bd9d57c646c8f6d8eda119da21ec80d447357e0", - "f7559029206b152250b9e00d310520d6ebf161b4f2e373fbb2d24b20e79f141c", - "47eb10cd9f50cecdf5e200ffffe8ac8f611a2816c3fafd2114f9a50f71db56a7", - "a7dd179852c8559072842bbc02691b6b526dbb3b6cbc1ecd0fbc7ac69127b83c", - "518f0eaeba2f8c561b124371ada8078dbefd359bd09e15d973de86d7cf6a2fe0", - "d7f6130b86870a9b208fe2521fcace912a0f7158af98be5553ebf1b6692f6c70", - "788c1e412bde795752be712308e5f1ea885415a06aa733ea7e0496a8a568c23e", - "a7fb589a9d8a199c351321fd17b58820c8493498dc26095a439ba74bc224b0a4", - "e568d165666050d718bb4e5dd82e41accd3be14126dffa182316a14c35b99853", - "ae7c081c873aedb9a2e9c1108c9b2e92cb1fad6eb9e72f913ed4d3e1db4f9382", - "1deca0a97819ed0fcc051dd47861184e94b66d4c5e150c218c1363a82a7b2b21", - "d337d0dcac5cdccabbcda371d289223e74320a8efa61eed86366829aa6d717d2", - "0d7df4e8121d852285baf5129510e5829c4a36b071ed6b33ae19730a5375daef", - "ee3be3e359ad13f1c279ae87a67acc7c80ab1fc14298b25011f6f6ba6484515c", - "942bad9b7f89c397679fed6457c434d1c36a6c8dfd213afaa3c3533c044a2f23", - "50ccd0e2c13a706ad8bc02f18062fb4a0afbd0cc4b883451266418a553c027c8", - "8ab2682e09aef67467e4917bfc01e55089b6343fa7de6dbdb7e80fbe3cea4be8", - "dceb494325568a09c4b4527c65832a7d470c8a54663a21ecf6877f2c6f3bba09", - "ee8d972fda5b318d0697d70563896211c3d7399ca4ef6356f82cd70c899a2ba8", - "f32c8b100891e76432baf5518d1be1eb6f8b4f280ed4dadbe9914b1879eb6ae3", - "0580bc6d3fd218d5246c568018f19f9ade9a01566974903d20d8a39761ce51fa", - "0d7e30f63357152f10292944e4983eae92ac2f14460e3bf4348beff1872f4e82", - "b88470fc8b60909d72ad700bb35f78c34fb6cef94e3cc75f0331be973993007a", - "497c5b39d9cd78292510361e2570fcb01b6ffcf5d9c1708632095e53c2391a29", - "4633a5567046532993e6b2061c598839b23ab558ce5ba35afd6151e97f47fa09", - "933366996e55d28c5866d01c34a89e56913b9a7adfa20022ea4c6d8889fd24f5", - "2e845b2974c3a6fba42fd263758ef00d46fbc0f521e4d4caa743d36e9b94301e", - "309742edd201363cb88953262836dbe864267099407deab6c1c0c071a0d065fe", - "7057de48a1698ccaca5d440235cb7148f1482139050069ea94ce0ebe6197982d", - "00005e9607598ad61793de02ff0558ed8ff97233722d6ac775d65b3160936a02", - "d4f0b9a62c37d3abc6c7770cf4fadf70fe1bf87c53d33274a3fbf38daa8177a3", - "20aa98e3b2d51435f3f26b4cef5e78c1ee4e843d51015200a2bd52d8cb7c0ddc", - "a70f91d584561e2a3fe354b908562b49076f927a50b87187aa473386801bbb95", - "ccba8ce6f6ca4d6836be1e6c1301ba25a4c1732c0f2a272130a673e840427723", - "9f060985fd50d2ebe85cc1e4ea5f9d4a8ee8bfd77d15d1c628c6302705207f2d", - "13f25c4547eb16461c93b8c786a311643162a9ba040578ba104edce380ec77cc", - "0523fbae91a0f946eba5be54198395d174488a5a7df66484467b22c6452734e5", - "c3965bdc48ae69bcb25008d9ca46634d5d0aaada104878c19e4d78213e49b5f4", - "69bb6af000f27bc2feca9d160da8875d3c9e08cd5b5fc31f9b5ea7a1ecac34dc", - "74ad7ae12a9ab3e26cb5e9f66af001ae9669d9522e92ee71a1c8eb42593d7838", - "535e572f7c9f2dac3d611f6432927e74955c76e8bd509e200272f402d085254b", - "79a48ec51948b03d086216409f50557538c433def048a55fe01adacedd663bcb", - "1f7c7f1f9f35a28a08bc28d2afd38a3d52c09eee1705d1c189ee20e92b2d1ccc", - "4e149ede0018c86a424995248191af092507a6170d18fc32f2a81762492593db", - "7536303a7a5ba4e83c4da3a45370c7fbc62ec90710fcd6d657a6feb9f4b1fd05", - "999a2981fb1a998777363a75a7485a234ed8659285f18b96a30dfc8f267db833", - "2582027ae825f3ace5491dd1ef490a542fc207a51584d72af34e9e87a6f61bed", - "2de9c99385597d3dd5e6817d1811ae4ad584f5606f40a587d018cb2817caea5d", - "3f2b58cb2830bb806af2cb4b0a28464a06456462699f2c987859ea1467a5317f", - "06d1944743658a624e19eef04be618264c0766c235c15c6a2f6ed45923279ed8", - "76e9b58b0284a0783c22bc35877643c22f7adc62396f07e76fd084cfa6f1ff26", - "9b96b4684139831b047a3c4b58320cc633a78255c24f7d0251091a7e37c7053f", - "cf874407ce50ea2d01d202d26db890e49f05b9fa28cae5631a65418c3bc3a03e", - "90e06d585d598402abc0b179086f09405ae514fd9aab5c8856545c6b1d7b0e99", - "64df1a8d38bb1be0a98c7d32dfe459e64b6c10f1246295b51a1c9983b24c8769", - "75d7383b490058c6d2855bb1d7c63b9cfee19503a305e994b129b58e80f7ae09", - "5953f067e39ceda0fd1cf3950819780158cd2c9042e42304eb5b7de86ad99fcf", - "5def0a1159384014f96bae656ce6ebbc1a2f2eb05c8057ac7ffee2f530712f35", - "a38fab10d35b30acef5d7e28d04d4e8247a3d19ad33fa65fd79195b861fd1a39", - "4f963774152893b22bd678beb618849ec084342c68643a0eee5af7ba30f7b1a0", - "fc0becb029b27d0a5b812d106c8de65cf49e5954897ba51b2622b2746a43ab77", - "cafa1e8663148db569823602d61dbdcd424e20a974c57a12c0cd74409600c598", - "fa8e6c00107493863d2b0c4ac4d0f08234a7438bd529db2b354c54810cb83425", - "72111ed8180e67c05173e0c1ede0b71bcb4acd1fd44318f4bce0438bc1b2efe2", - "a51ee9ddaf7e1a83cccd9e83b50a8a5d4132700037a26d7ac25b7dda6844e57c", - "a117b608e16bd7a547f45e0e3e0eda278740a26a027abb14e11388608a22af27", - "332fa92a173fe8c6d94103015ecf56f0d4ab1b68ceb8bc21fd0865da5bd640ff", - "0cf12467c693cd825c04aef6350bb66afcbefab00a379235bb54121e0c3d0ffa", - "11070c286256586c22409ef4e7472345b905d2524702902fe0c2eaa946c4b0da", - "5b84b47b1fbde87c06835002298ba9c35290b176f0872530b89ae4018c548374", - "cff34c5127c3d9d1d0cf522cd4dae42d20099effabe3b111dba7508a6263e270", - "4359a2ade98a3577a6f5a24631a948401fa21dcdd008c982d7c173d7d80f5587", - "087a92daa4ec5b35b0368866e86fc3fd38603e51766a14a25a54fc731d033e02", - "e264ff8bb11a87b0798ae836f1ecf34609c1ab5a9f77db054748e43686e14fd8", - "977bc87166d802b5b4655a73a04a91e260dd705914ea92f5e79e59d0e30612a1", - "9b5269d3bde3ba03f7f9146015ad8b25c68a01fa4d26ff6d45c8a5435d9f4b41", - "6e6e93101c1aad09cb12d35dcadd1f49618c591c58950c354e1b95b52a5f6d48", - "0fff370065e740f0dab4e32015d5df765898280c1816559761ec91357ab45340", - "da28a8f1e3ef3fa80e32f2f1fc234b64b0bd78515751938567ef0a7843233677", - "61ed602d988ef892b40ea702aa8ba7981fe6c716fc8648f8a299a1c75d49f61e", - "b7da8e43d4c66e13351fedb04445c0bae9c39967cc306549aedc868ee7c53311", - "dbf06d362798d3fe3e9f6cba73cb8e6f35f1c613f258f74d6fa517de003f9957", - "add09d5782ef5694bdec023b0fd2561afe135a99679fb682ad2b6ce905d98a9d", - "63c11de6ce956ee05febe8212a741ff5ab2cc70abb6339beacbe246d872db68b", - "b116ec91f508317dcf9ae8710f1c9f35b991bd2b06d2ff23b30abe949b6bc28d", - "c27e8afc264302ee04d3e6c6d0a689be9bb0327f16b37bf9e007c73c5167852a", - "810a8d053f2c594e295f0e325654616d7be290110326b722697cb17163237e12", - "cb99ce51880baaeb2f0b2d772bc728a654240e57dc19cd00e5abab0aa57f5323", - "ec9a0d5c2c250b48508cf3e04399dbf843b214bac67648d7137486dcfc609783", - "8f1fc63631811a7d356e46e593d7ace524d7c9ccf63dcf530209c8f7eff644ac", - "2692a1432c5dccfef2e9e47fd0e03486a39d1fa49e89f48aa77bcf4346dd7b7e", - "d1dcec0714cd33676b0200018bccb5f2d51b0d429c620584c4417f2b093fe7b7", - "057c6b15783fba666f7c434b1a00de6b1708dd9bef949fd58727ca238e408fe2", - "e45ee1bf39ab48bd3c07a2ec636fe670337507cf4b25d226bc159d87422b9665", - "b0cc7a31f1180a916de74cb71d0be3ff09116fa43e98de6333d78c68142285ea", - "72ac8a64a5fe6d1273db418a7cb42d297d53281f44485b03015b0758aa7f01e3", - "f81a0de8e24941e5f7230a2bc420361d475b54d85b70dcfba6f8eadbb1083c2a", - "1ef6a1694cf4a620b4f472c09c74b4e716779407dff46f290387ed915bce4973", - "19a0d857bdd4041e8c66ccb48ccdff11df8765a908f6f34a7cd8c519ba1c7d13", - "3271a4276bf919b75a558c32475979cbd5143076e206ba1920cb556e16b95af8", - "5316ab77aca91432d557cf5f84b9a4bcd2e38b4af542d0bb02b0077fcbf20270", - "2014ca27e2a353be00976e8b3bcab7752872e18af52b9fa96cf436fdded811a6", - "5c2250ce757856650d2715307feb92c1234aa55dd15e57938b345b81c8123e1a", - "0a03a2d7c745f77098bb7fdd5e4b539163630dfca16d984b840a875781284233", - "668d2a448e051e3d69dea768c71eacd5946264bfc1f8ad888b4fa2077e47b114", - "3c57ac4063da785dc3fa7983a6d0ed320bb863a3a9dac6fb6b30f0b60ae47f5d", - "ffd46b74900ce4995e6103ae578f85f2048a471739204703c7857245362d09a0", - "54c772eafa5c50f9bcca8e3be24e6112ab10cf754fd53e0e106dd52d94757e8f", - "513040a7ecce61f82b2b164dfee85bfa11959e67a12133764f74bbe46bf3ff76", - "b43c387535a02c5d1e71011c77ec9a31e52c99d5ee8f4d25470573598505aefa", - "4c3bb13660f163b8404fcc55f612fb26eafa98e30e66897b8d6f817c1d28aa5b", - "6de918a676f7c3e660fac67b3c984e41cd6081b57f9f0e709a3b7f50ce88fc99", - "e232b725d764f319dc04cc89f7ff7d5921eac267fdea2b95b1860611bddb77c5", - "1602bebe15671515d025192ec83be5680350343595d9aa2ed63452ad3ed0c59b", - "973a874815ac47f9cab000960d9f652b30c08a1a5bd8ab91e7c110c9ee64294f", - "3f8d5ab8546257dd7111ebc8f5a0dc868d0f29f45046b5bae1593a1733748f0a", - "5abd2728d9994c08c5e5266e0f90f79f0ae48d7bc336947822a7791e34884b5b", - "8c698062506a57cc4bddc8131aad03dfc47bce045e77fc5d22cd8828f3806ec5", - "3fc608c6e82234cd8b43bed64d7350f0a4f884e9636456c68a00a1c11d15b4df", - "1aeed5f00594250a94a90f5127d0de7b34955be58fc13126d2570b60fe4bb02b", - "e0e96666c2a3483eb03646c49e1eb62ef2e72d23b3837566aee52cc4c259fc83", - "22b5b7e6f01a613471a477c7cc4eaab5dff42a8c8d41f21cdf444042a19f5d26", - "e7638ed9cf92642dbcf73d003fbc32c3b25ba8928a773a71a57f197b2941c41c", - "e866523ad77fe5f685e4cb25b585fedb29e08615c0d220fc65c388530cd834ef", - "e2cbf8f221beeda72d9810f2338ebf2ba081d2f8fe0ff75af494305b0bad7493", - "ef24486994c43d2774792f56b35fe271daba8d490b8d70333728b7279c1d9138", - "f146e5a8f5b5e48d5715ef296d4c513eef2abf92a8e14c4deaa787dc2f367273", - "0fefeb9d8a6fce390f25498ec85ac0183b6276396e2274a979b43de6c0e03832", - "82252807ffc2590110d5f0ada2574a2bcd7e0380a8fe1669282837fee538438b", - "6df742fc94e03d5c90193f796965805225955bd83e5114bf675c8028b58f9603", - "170a83568a86850e9968afba3640537484a54407125b5a77ab65285b2cd4891c", - "7ce7700944c51b7c856f48988fdb8d5c5a773a42d8a42ce16b14b220a4616492", - "9969754ce6779431a134a73f9ba9da715503bee0da63c0d3c4ec2b2a5a1835ad", - "8a186da66d98b3a6a4e814090420205686805ec693568e52c937687786421f68", - "ff12edb0bf045146a86c019722784684a49e662a04b627e84d24374a783bb635", - "708985ccf5b06ad0b877ac9a32f6404ec881c03f7f106504c2146e0038271232", - "19b018c8bf1bfe1fbef816f8363ae7ab28aaaa313b362156648603a0065ac1be", - "01421df9f29449b0e31f356346a6d4ddb3898ba3998d21a405762ce9db4df5a6", - "8ec7afc540935ebc3fbe5968e4ae772083481140511c39d16b29933a17e6e48e", - "43d3c60a71adc287b5a56a13a9a3361903a1a440ad6c015af71cc404b749fc73", - "dcf0700c619fabd4e2b29f7b6f9258470be66125805f2dbc80e6c2a16cdc7c23", - "ca19c95094cc06e3f41f19b72ec2f0732f0e42fefef1b571822372f57223eaca", - "9cce356f5cd8ab14a3c586d8166eefa5d221542b92883d970e062401e5269165", - "0ebd2850894d0c6c8b1870f6216da42d6636da723c7262abc2d1894f22a6f7a6", - "b457d9bfb74b04b3757652ec5b6ca084432da7cd49fecde2bc463a05e8f10ed9", - "e0d3f45c6bb366325349eb421f577afd192b1abf3377733a4bd6f662b3f58aa7", - "705c0599207eed7379934653ce6bd5440cec08f6113b00efcc60fc8d94ba09ce", - "e1ea600f9b1a10a4ab7fe3e0d65e388d0a50f6da9b4b009897df3d862e06013d", - "09ba7fc9431de8372d25d3a53a62aaf7d047794bdcedcf8176d6987a2c03e8e3", - "176110e7e298aa31992f732b77760a49ed8f21b67af9235ff78d60e029f28aa1", - "b1d1ef7eae2ae285ec516a0f7161131abeb8a3eef08c18b3cfde7b05ca5707bb", - "2e0f6cf08525c0982d487af04ae7affa8217a4dd12e10e783ed0f2ddb7b5a927", - "2c76bd8bddb9b0043a81a54e2cc379f133bf818ff42cf21dc024e53a236e41b1", - "cc3bd863f44bce3ac324ede8c830a684ff2ea2c79b38aad4cb273b761bb21680", - "0c2d96ae9bbadf352e4eedcfbbf9d14b6c9a0106d1f91a1b5c23521f292d0a2f", - "9b6e1e081ff0b4c949de40e1830c60cb84853f6c7b5dbb3a4f79d1060e2f16e0", - "68b8d330333688fb3c88b8bbbc503dbc9427bcb8dd52c46fe252c6d99c523500", - "bde048a59a975890a6aa2f5e074f3c8892b4a25ccadc33c52d7a7f1c0e595716", - "78c9ea4d159b68ce1110d895f4a0383a31141240fec809dd58703d80dd2de324", - "e1d68d8ddad808fec64830b8cac3e30080555badc22132ebf2fc60f52159b419", - "de1e9690136dfcb5f98543a3af9d1de8f92ce748eaa674e8dcd33643c1ee0662", - "b5917de3c5be772913fd3cd04cbb1f7fe81fcfa3ea7f315e17fc1f66118c47df", - "47e52fa4074aa625ce2a8c7d382c3784ebe2a1f8de780a222dbe2cc69620c529", - "d84b2abbc117597f6eb9d89c85f9ad8eb0df4de6bfc0d4e0432368c6cd319a24", - "a95aaa85c4fce7c9a18de26a722d80bd50da50aab7ad04c95ca53b0bf64b0f92", - "2f9e3589bc43dd1fc0c69efd890b95208d0d077c449ed64b2c5f59cf546827a8", - "857b895cdf5ab570a2af5b41a088132f97941bd1b6d69e495a5023c03d0b307e", - "fd8baca196a79af5ca8ab9c38cfc5d6395fa6c32800f1a1bf883c116630d9988", - "a870eeb69f9d40cc1170e3f8b3da1556dfca9405c5c26978f9da89eff8492886", - "aadc0c85426676cff494c44c59bea73f176b510a28877ea5246e7908cc649c58", - "c6b4b49c8adbad5b34d8d012620fa841c0bb29cfa98f9e6d7612eddee43fee44", - "c3ddddb2d710d4a8f2d5bfebadc87c76cf038fda175f590712e655e1e041037f", - "e93f0a9167e8ea5e4a59ed1eb55e905c73d38c447bea527bbc13eadf90f0502a", - "2c94832bc210294c0d7a85201dac07045b8bd37e41c863e9465769d46b62c8e9", - "09d18cd9f1347183cd5565050d4657773187a4b5f30d098e94433c865e6377a5", - "132919b958b493277b26ff951ff4c1d96d3036ee1031578ccf08a66e77e1a577", - "8348671438ce33c39ad536b6bae7a4c1f3680d3c6f398ccb006514c9a01fc34a", - "f9a9063f4679f7bdc346a3a7a1e83cba4355425d495eda0239956752c12156e5", - "f38b93b4ae5217e2a692c776f88ba227b598b4392f39f3522a91c51bc069a30a", - "9f53b3262f3c2b5e8329b170843a5a3e8f83dde71193a03275474719ff4fdacc", - "f3aff7fffd6f1b90524bfb915f2921c0f2081a7e567ff40fa514b45f3990e060", - "377dc5a1d3b821e4693e1d4bde840d5c590528af77a06abf116e29b9dc98b4bd", - "ca43506d46e3f7e4502b2e1c51724af30f946ef45cf0d7cd4bccb3c54ad705fc", - "fff0ae6d6a0a13ee10a24155268e7fd47c1b13fa26371a2f3775d33439a3f83e", - "dc3db7b47b5630011cddcbfc4fb48d461cc49485209ed1e485fed44fb570cf29", - "b3f0726d73b684a00a3406f706bc59b684baa9011ab4bd47d1346580bfd58b23", - "fb8cb0ac19a5fdc526bceeafe0c43c2dd947eb0c158dcfa235318dd1d1997220", - "36f8ff21eb2203de17b7098cf2ba9f7694b2addd66a4e3f4858e3e60337cdef7", - "6966dea182ce7ecf5d6549197789b2c17a2bcd45ed52ab920647030cddfae92c", - "1430a7da5aada37d84b89c0b54aef9d20e02214270f495cbfd19d1ddb2716cd8", - "0c4be45c4e9803f944804d22f4eeb694872e485083092d863fcf900dc9fe135f", - "4f632c9b40f6657072790150ed0bc9a5348673345a4315a3748b50aafcf25732", - "3e9756c7a914511b77d3c5de00e7471c3812ba10a64db6d32d7398c5bf3be858", - "5868d8398053678918b2f58b4820ce8c3e6769cbd90f08d727e80267507b50b6", - "208ff03c92571c2e96c5d09d70c2f5beb03f8f3285e7ae946ce24fc853d4f6bf", - "46547c90538b4cba8ecdb1e3b038a7038c10176a579a3191f1e264b236a23b61", - "04113da966c494a1d5e37c4d4b1bca20cd5a7c76f2cb33a6218c6c94fb79c209", - "1e56fb1a84d8fd24f5116e8279c031df1869601176e65ddd17192a65b1f78eb2", - "0c2bae821546abc67c4fcf3a7b140d1da4e8d6fc4e100f35a159a852bcc1772a", - "c012f7abdb9b2f52fb324192ba29fe19a2c03df2822b4771d32e1bd2d7eebede", - "8f39ab839ffe30ba6bd129b49ea106806cc87211b3a3fc5455b236e13f9db6fb", - "de13489e5fc7fc8e7ca72937db220191cc1fae07c9cd0ea9f026eeffe630075b", - "a47887fc51158b615d39a08f8edb2f588d6785ba434f23b176ee1d3557891fc0", - "3a525ef0e1b8d85cbbd996ec1f4ea9882331fb52fc450be12162ad0b2dfdd7c9", - "660c4b24a68d4b91f21b52bfcc293bcccea01d21d67ca6cba6ef1a12fd4ef1a5", - "3fb21396f31dd805be0957f951f47edee568fed23bd366d19be6a0a67b5da06a", - "34ece4cea0ab8e5b61f4663491596b63ccd68595cd214c2158c9dc45bec68760", - "b0f84b5d7059efcb405560fc48576f4e7c17805a80ee95df7da61edf109ce3ed", - "8e029fda28947a0b1577338ba9bad7f83c2d4ba4c94139cf598c406107bd741b", - "37c8d71f96d2d916daa1e18fb8f75685c67f1c50565def742c8a0444b508f2c5", - "4121cf66c70824862c7b81fb3fe7fdc27de9f1cf0b2526e162e7713381a4778b", - "35bfb401d163f58687e52673c04f74fa8454e72b3a5c7f3d61bd4e202c25b91d", - "4d2548e2609d114cca4408c8435e181e454f77b0bcdd05c04db78cad1adc01f0", - "d0c509557bb701b3021844df3b11457e97a4032179be4521866ffe7d687ca8d3", - "508f83635c2610adce77eb6b0755dfe69d2d2e0d0690de3489d908826fca4299", - "4bd0a55a41b326232e49f52b17f30dff6ff4546e4c1a2f2410f72dadadc7a6fb", - "8478ac598dae0289a4608f190cabb856de259f2955c2b26b99f7d144df1fdcd2", - "b9e7b294dd16cf0776733fe767c9362c35eb2b3c3153aa0eb6b075a90547ad58", - "acedab826d3362f2b8d4799503b0dd2e5c81dedc370f56056c2b07b0d106492a", - "249d86218b452ba722801db3fc280eef83bd3e0d855b09b2748cbe53af5b9dbc", - "ec2085a86641065870cdb5658435b8fd8490344c1f62f344651d5528145c7444", - "b771979553c6895402171c09f2e209ef87b8948f95a880c7480721ccf249608b", - "9c3f210f142f9bc3420247593af6d279fbeda30f0b93ac33c5e60b2b090cd175", - "2e14603ce7c7dcf8a97b859ad8998bc3f014105da9ad5a10b5e37235be7eec83", - "cc8f34a140b4f74395a412653ddf2de59ea04de10e4171e3ca7df533f96e9c3c", - "d76a6e5a8a78514c3bad47d305b4996b105a11b32e404e97b126f9814ec1c0e8", - "e524155e54f8ccf786e4443c274c06071e5f9d5c22b81ecc515a57fb76b90e4c", - "feb7c30de9187b963fe5ffb86b701a6a998206482ba432bbb818cb9216a4a065", - "7c0ceeba5acbea9ae1a398fccd204424b4b02b54dd620f7b5ae69c1ccac4f3f8", - "bbdeda3b785852173c6bf8c9bc05dc9dc0302110d3edb3463a7e7d3cba92a1fc", - "a9e407bc5d364e030fac9a0e3338c1b286df7cd43509833e03c61f09651869e9", - "9ec51e83ffe84196eec8427dd0d1adc93e8abb9daff7c1e5c56acaf7c9cf7d17", - "4007bd8efe6834f3254e5b5885515cabe5817eab7af79a207d21f65e9fcb07e3", - "f04cbe9d13eb9f80844f5035e17e21b4068319bbdb74cfadb5188e45edd22165", - "bcd3e6e2a202e03f002abcfe95080d8685291510657f6c40a74ee36e732e4854", - "8ce9e8a9848d72758a8fb82575a5f7285b325acee4ffe6569f069006ec0e7d4a", - "738d3a6d2e48452c16382d2018175423abde0d8804f75db5558a8babd84b87ec", - "028d733b9afd21a9bf6dd0a317ec48ea222e52b965f5be82fc3318eda0e4310f", - "98b9e6ce54cb40f92e2782ee19caeba4ff16643bd0a2bc6d22bb2d74ba0de715", - "0804dc89eb5842832912660cd64fea4050299b8ed49a23e252008aeaee299363", - "ecac0410fed883670248309b4a44c1e88b17f23d4977301cb9567f03fd825340", - "ca5d39b72694b69d8a909a45fe36603427806c82ecd30b5041e05b41771f86e7", - "7e7d326d820aac3b69233400544fd1132f7b1730d8f0a1ff5168b596261c5c0e", - "25d52b098688bbb55f786a047ea81601fcec7f020f8ba35900e6512756373e28", - "a1d3353fd5d28270bd51ac7ff8e2fcb829a92fe62a17d13745bdc88e1b0e5157", - "820a2afd19c80e554f1727268d6da54249c8a9c396dbbd4cce2d5625b4ba4f2b", - "71f4967b007afcae3b4d98fb17fdbfd363fcd2987edafd754467e1845e9e664b", - "88c5be2df36d9933acaa22949c7ebc7391eac7e5842a71e6d08c65bfa905424c", - "b1e8262eb1b2aa968a0be99c159d2b34afaf272c6599013414e4b4e38efa4c1e", - "2e4a88631eef943747e43dcbfcc201346d812959695ae147a05c8153751b65a3", - "e9c9e8649102b647d792f3b699e45248fc7afcdcc2d2b7efd1a683b6563cbd5e", - "f672a6b90eeb43ab4e817e906beb21fdb1befc72da87e0307b707472db548408", - "bf5b88fbd8b3458fd63a963c9aca7e904fcb6bd643d3daa579ea1f9df7491139", - "5d530279003f5d93b842fe270bb1f0c5c5d99eb7cf3424d951a5c9f86b4da433", - "364a6148c0e2671deaa6e5392f4b61fe89f7e0e6dc06b7b86fe3061b0f80661b", - "118a9a976a220ca00889ef1a4509980f88f15939ddbbe13eea6cdd1c8163a9f6", - "1cbf4e8adda61cde1348352e10f2566c2963efd32694ddd272614e6441841447", - "4311645d3143c0cf3362fdf8a7339095a2c38a7227593a9c344d224b38741259", - "96313d4bf5ab961d61c3d2d13a0539f60be88f85ce4e26ef602b93ee855f3eb6", - "e23c285af203777706ad6ff1fcbf9ce31da1ee8d3829cf0346b1c146b62be0ba", - "2a374b2d52355dc477e2885e25ce2d9a12b8e75361f61842fcddd47297b48844", - "3f6f18b4e7bdd9e29698bbe7f44a26dd975740280ca56b85b4046bba21017f0d", - "c23a472ac555411111e30b5432a909330c16a4b5e4ab3d85bdc0c3cd7806f36a", - "05e207eb42cdd567bd3a3d38bcc3136a81ac350d47ae4a3ee92ec957d3a7177b", - "cf82bd6edccffd93271a68ba5a1d4f6073b71bd6cb8a266cb2284e794cdf4543", - "5eb08dfd6bed9390b6e98bbc6925c4b7c5a0e7d5b85316b4e0b6b42a9048fc72", - "2ec4a8e40661cd2cc64ac14cb6fc00f0ea11a43b38a63807be3b0303b4616895", - "9c8b804cf24be385a29c06a692e7cc9d610aed624c8f67fea70c9cf87acb0e18", - "b066bb95ab0ac516387fc4258e75ae1c924d9fd0cbdbf87aebb0fe215c2836a6", - "76ad1852b94ea4bbb5e9a8d3c0430b332ea089487752f455bb4bef9010578bf5", - "71d2ca07623281f05e579dc8ef3b1f9cc01b9b7231f53499a851db81d0bf56c5", - "efe595c49f37d2a0ad4df2d1b1dad95f7d49718337ae26ebfffe060cccf0316d", - "e7c41f5bd4d10b1cc47a60878706becdf73ff513e7176b004936abb54e4211cb", - "90079581ddc0963f066e344f9732c1262bf82b6144e2c7221ad8c3c397d553d0", - "90c4278b2ba47453a364d4b1d18ef42bd2c3669e6335bd554dc13136d03f32f5", - "e4d064ce989882b5fa9fd52490860957d3443c6c83c3b1398533814f22926764", - "8afa3e7beccaf64aba8c3d246c201d48297921cf6704680ef69d8cbd7618dbfd", - "1b09bb3ad50d5f7752f5a1f805e092a3b2d39bdcdec086094f2e563b6bb8b614", - "f93291cff8e15d695abd6df17ff68bc6c19c05043e3527c745091109a6927b30", - "4439466a1ffc38456becf6110ed6bbc7422000959a733fc0a264b0660b7f78c7", - "e204305f87404081747f21ee8a156fc451edc69a16d59544dce83a2b68e80a86", - "5379e5e320030c231f389404d248f0d08be77f05fe9f75d23d3ec5492e7b5d04", - "299945ad12b0796613f570b6dbbf373c936114f4739b364180e8c5518baa37d5", - "5a9976fb400db349bd28cdcbf57b23c2efea483d1fc145bac0d184cf852963e7", - "175f4d1b40c5e283b6419e3516b7f19d06571eb58b02d23bdeaf83aee1afdca7", - "42b96a36f908bc63c9d7bc1b5818b4f68d771de79ad57acc220c853b687c9ead", - "bb055cb02470c2ab4f85551e4e8f4fc606f2cfc51ee45aef8f2ea5fb63ff7936", - "8b690ddb4a77742b883cb523f274f2a575bede32241b60d3ffb264f739d3e70d", - "53f082b5c694fdd89ea59f139a2a24e69c73512b077e2da5eaa16c8b9fcd0c6f", - "50f707ec17698c95059600f484e895c75f71d1ab039e4ee9c63120cca75b099d", - "3b53ba631631bd11bc698a3e1b88f32478f02ab34ad7a8582b6388a6615f4871", - "a161b8d36369f73e7b65fe8c78e4dc4861c0993e4399d4ed6560b63ac3c6bc76", - "1b65ef6e739a310c529af0503a4098cf407bf48324f8abddbca4c1865547f57b", - "eaad31ae111aa54ee37c1a9e83107fb873a45eee84b8659b269e07d0d7122559", - "1a1e2bbb8eeff54692d32b34842a8ba4fe73e4189a654dd7825bb944f2348d5e", - "5144e47aa92829960bcdedd80e3aa1fee6c7f0b60977e57ae022362bd20ae36d", - "e31a6186379a1f0bb7816c03537133fb5cf2cde61638cb9a3cc097c21545504e", - "20daad17d945484356f1c65b78776b124d397d8393af2d820a921ebf72feb293", - "5eb837a5c7a4ea1c25ccea30301746fc2c134655884d5a18f755ee55134653d6", - "f09d52c32181cbb20175f3bc7ded02c6b082b15991ccfef618a8035ce87ef5a4", - "3238a0a7cbcd09d4c39bdfc97d8fdece98124f0bed0c67cb8bca7abdcd8a7114", - "84f5763e099f341ccf51ad9254386f7ca0c330505d348ca2d092d5f397a4b2b0", - "b6cebead6e46ffcad54d9d9cb8fc96d1c2166f20fa166695324d9ac0abe65e66", - "36672012a9bb8cd6cde425b998cef36c8ef36477561185dafc04a6ccdab03608", - "8a6032125e32dec6f2ab8be8abe42e52943e214c21741b80fc4545be304669d4", - "117ab2c6859d60796dd07b1052c12d5bd7db58a98d0e02bcd4c0b77a1e6ac73a", - "653e13b8c23359d6b8d4a8aa56554b92e920bc96469e0efb80596d2d96c7e23f", - "2d5d41f88e2fec319e0b51818275acb0115ac553a41732f22cf084d100ef595c", - "45be1c3e7ee9cf4b80a574533292adc11499351e40411d29990b41003ba2d6ea", - "288dd75bec4d426ae2fb523afd0ce0cf30e5e2a11302a06f8dcfcc458375314a", - "302bbdd4f494e89e368eb1f5f9eeaffeb902881926e37e25de1a84d0af2b0b43", - "9205cab4a36043c310f1abdcbb8433065e6b168344ed17b97d6b6d9cf84e122a", - "4b1ba8527e6e06f145f448abb95f378a86b9ab24bf34c82714818810b8e402a1", - "7514b7edc6ae55501079fb311fb2888441d4063582562e42142959b25b24a633", - "097ed33ff4f21f335108d6ab71f44af047bb1a3634392b16a2681b646893c058", - "cd653c4070bdcd9d4009d4fda4109fe0e99982efe4954f16a63787cd15b418f9", - "25ae17c78c779f3f5c38b1df1b45be5ffc5790e07d15d25e31d33db292070a6f", - "dfc6f832545a12b6f384d1c460177f09b20eba9fddceeb531ebdf57bb1acebc3", - "954227ca7eacdb9341239e9e434e7c3d2d32373e782fd82301737d43713069f9", - "b2083e621cb5c0aa1a70de46e88db41f66ea1e9680ab1e346ce73798142190d3", - "bf5bc8e077b3084e358b6ebd50316eaa9c1a19f87e12acddb865ee5a6b3c81e6", - "601071fc9c5b09e54d98ec464a91089150bd54aa77e61b25a4a75c660b31e8d6", - "5bf236168b7ce118ec6b416c9122ad11f3fbfabfacc8833838368cffaf728b6e", - "80e893a9af93b9ff0d5b98bfc1af827692bb059c54714ddb6a5f67363e60ee18", - "80323f5698815397400d744f712230497f868dc5d32224d0469d311ad64d658c", - "93ea47fa1294324d1ac214c0d9167052c782658db2c8bf7af80feb9177fd9600", - "881bacda3580d36dc127f20a78bbe086739768dd3585898377a5f89774fe8e26", - "801bda85f1b1d62f4094e0b86461c768928d19cc0579b6ed34e691aa8e97c54a", - "3bd8ae43001be43fa215de44e692afc9a0463e896bef28be89d924e32942c890", - "3652d16ae8298f05d21773b1bbbdf42cf9806f697e25b479be5b592575ec8420", - "5bb872c82f16c83913c01b3e0314734520e5896c35dfc51dec6f5f23bcdb8cc3", - "2f4cd1b48bcf6722360bc73c9217cf631c0c4125daa34091d28b6a13f7a3f3f4", - "89b300e39ed0eef9eeae4093a12d33e9bf601931fb9348c3d5d0d1cf14cc26d8", - "cead2fe2a8a3570f76984609e1d6a203d1ff0ff7248c47dbf795154c284b1d6c", - "1d9991059a7265e6f534051b3e051582daa592b9da41efc12f490172f7ab0354", - "0a3f977f6986782fc1962c2804161795d62e8740dad791efccd524a0ff7dbec0", - "335d110cf140909c5e8b01d4e71c65de7607eb2ef9d0cefeb8641240f735ccc8", - "ba5beefef86680df1f87565265ee7fae3c4bba8e6e2f1a8109b5541f13879408", - "3690847b0f120455d84e4f8a0df50f5d166d0a0772b1cd66bf931506253bc544", - "122b968f5cc3036ff3b10d5f48a1a9f562790ca7abd1ddae18a0ab3d91e9f09d", - "d4627a19201d96b91d0a2863d5eef64b15bdd3268d143981f5059909f1f4e33c", - "a8fe503f958bab9732ddb0fd42186b4bcd135459c9243e446e75157421fe64bc", - "d1f83aa2d50383fc7b23915737f4d038772868f79b2daca9d83fea0870af35f6", - "2c05b15a5670def58141d7250ee76d9b8d843164ab8c9dddda43044bbc1c8d92", - "a9a995100844fc10d2078691e76a2c4cb8c14263feae0a1c43abcda06959d7ee", - "683f0c393b3be1787a45ae250faece8010bb2b6e52c07ddc5d5ccba75908ddc9", - "545342429e759f36c72b2455ec21e3aab913125f1593d4dce15dcc67e131a518", - "a67a6cbbad64aa6c977bcd5df4e5a3ff064bd58c066352476053c543ca83a42e", - "4c5cf456055d0719d04693f715349fd2893557f64686d68c60c111df185f4275", - "6b0c7028846f0713a6563e26c71b311ca88590314bb3edbec029752f6c4decdb", - "e64d8fc0f8c371247500bb76b0f378ddc9cde0a6503fc3ac6f7bb14989aede71", - "480ef62b340da205254b9a6abed6b8df0dd0a6c2cee06e00e9601ae30e37f9c2", - "f9ed5873ae0577d0c81eb1a92d691db3bd10eaca2c789f4cde1ee8b753107282", - "49e092b567fa1f6cb747c1dc174a9e62b624cdef79c4fa1ffd6b27ffc1f4c0bf", - "6387c72f0322b17431a1eee21d5335aa53a6db822579f194590841f6b6fd9022", - "5096e2c3c755a436814ef24a9667bfec232a9d4326254f8e4614e24ff0ffd9a1", - "468a3c0cbf59f299cd59b3677275c545d2957a214e252b3280cdf8ffed42f34b", - "2efb5ef8b6a1b910bf6431fb6abd904f3c5ce1ec6185aeaf0c22b7b3c653ac29", - "72a781fa6fe55f07456c7fdcae53864fbc6eaff88e3d64f8418786ac3375091d", - "f5d6b6393786dcfa74acf51a40191321f6e1348c44cb7775d0e03d1ef3f80bd4", - "069e886787b4411eadb31af98b2d3fe9b45bfc692dec15a87f47315627017ca0", - "625df1c6d304a7049b2e34560630d423aa7717a3c7e0ec55a6f520894663baa6", - "198eff60fdd0b7bc5aa6e07716504515048e00ac55d0512a7cee022918d6c356", - "872fbce79b16f955a29e0813391405a2f34627a54b2f9a42abd88153b4f57fef", - "5d71c3806766c1c5bb2464abf70e86da3ceca9f94e1688ee40768be54d7e1deb", - "b608f6919f75bed2c13fcdbff1120838d1e9c35266781234e34638472b8a776e", - "a44791f4fe7e8796361d68d95751591fe397f2a1d9c20f46df151b1f8eb07663", - "7f70a13ebbea88398392e6f3db3c179e0d355359ce5cbcb2973217c6a14b22f2", - "7bbb0cb2c804c1d3d9716b39ce3417214126da0b89c9ef656df1d0025927e198", - "625c302958a25b4c8d283a26e2de595cf25731c4218a29bdcc86c253a3a2f198", - "3d43e0db9ceb9aa424cc8712309f25f2238fd892a9a6d676321d8e4b6a63f085", - "b369a99a7ef1ab132b9f51bf714fe865742e8ed073369822a292737891300168", - "8beeb9a2c08965e217c90191e349bf864da6de0eacc748da1260975391b60a52", - "9e582c7de9710e16448d2b411fbca324c818b4579f4f418dc812f783a542b45d", - "58ff1cb4b906975ccef27fd94608f53470fdfe47c2be16d2c8136e4881758869", - "0c7172a6e094f3d1307e2d38ac69de2277ae37471fc8e9477e79bce0f5eb9ced", - "cb15872531ada0c65df0aaf1c683abec074784c21e59450529ed2336f23363eb", - "a2fee551b484094ff691559aefda7df2a4edbd47e718a56bc76d9d9bcf5eeca5", - "6a924b8f281713cf91e905634f776cf028918adc17f9a5bacd4127d45b27042f", - "d6dcb9cbbb68941d1ae8452c272f6b7640d454e6c27d11195df510bdada0609f", - "972d1dcecb4be7e80e167ba5afdfc962d7fbca02866c47f9640441ff9affe772", - "d60d8adf3cbee4a5c061eca4a962a84d553b57653fcb20818c80822403581d64", - "f47541d24caf33f53d4299bbcb038e803d6532a71ebb20b5f9964d8443d89ae6", - "59421473b5f5272a6b8a7c34a05e6cc4c3982a4c1cc58017b6d5981419c2a976", - "831002182156d7c6b98f6865f5dbd408657997cde2b840d3f3926e1a16ceff00", - "7da0d4ad32628d33d04aa8581cec37656adac824293eb4d8402e83af3fb2577e", - "221fa03dfe5167e9103df4a67d7a3fae9c070c859ee1c0c2fa7de418f2a2f486", - "d2c8a53edcab9c0819c7a4359754474b6cced96e05be970de4ae89b93ffa2fff", - "915646c9850ce941d7cb2e6809a7dff77e3f08cc7543f87c160f5b51fd17779d", - "8847622424c97bee07b52cff7d9d2ef96ed204b3a0654241bc5442d31334e42e", - "b9a90d1aa97b5c9c3e4338d7e5ae4f860a3bcf3cfaebc5c54593c069106033f4", - "5339d0c4b9dafa6342167d7cc7a1efc222f78f3ec0dbf9ed19d08f25e92cfe61", - "b250929926641cdb3cde8bb6a9f0f857a70d2e0686a3d09b17da813d255d989f", - "e28f1b62c9cc7901d79cf6c0a5a8732f39f9185ee11c1df45958ef60613ad769", - "96e89e4d0c7c2f8044147e4bccabfffb9b407b399226fcef4f027232e1f4f684", - "577cd0703e681ab317b9e7107021c335a573a2fa3c13fe047436cc22064b07fb", - "543e3a26070be00378230376f48e004436928588d4b2d71fb6757788a5d63819", - "f55b7fdb77e7095f52ac44b272af6835dc153787da8bf1aa789347da962ab99d", - "59863fdfa89b43bc0480e149518897ae5316132a515b404c2cfa3191de82048e", - "ca73eba7f81c7dfb99c212169f8f89a33edebe3ab799d685ad90e116f1078149", - "108f546df6693cdac1dc257d14a3c2edb8de4df2dc6f45281bd4f81f1ddca2c7", - "983836300307da6d0448395401248d1e767b201dd92be4e558de87aec79dfecb", - "b2c4cfc34d57c0bcd61f3c79b3816300d39eff43b24ba1ea35776ccd082dd2bb", - "b2827c975627570f844fffc53c80600b1955746eb1a7a6cd418252b6e45cb951", - "a7d3ade5217c39f42df335196fd5725be00b62479d0c6534351ad6f2945efd9a", - "2170aac77316cc222a1c78f96020b3c22f3824cc954cc0cccb5fa6a936d5127a", - "b874b1a52f1cf84596aa4949dac81d01f02564c7f984b522ac695447e09adc0b", - "ce7ec1c5db5233116861a5411db48685df080a87d97bd88b7846bb2dfe3f4af0", - "d58032abe7c0d7c4426261d6e28747ccddc99bed5d2781a7774735dc9fba4d3c", - "e98db98d3dfeb37d36b2a8b2b53581ef19178e61cca4275b96bda5db81e748e5", - "1a757f40e4605d006794b33d54f28a19ab4f803f8a5823b4d0ebc9302d0d1648", - "89e2610d31a9b8ce2e19941a962ee576e533cf2ba9b051f1b1fb277b022e6784", - "58e81f0ca91c9b5d17960cec50f80a88b17ca53c81e24df98c8c7c87757f4839", - "63998117f3505bc391fb275cafb4b2cf9a3bd68cb3ab0c48ca2a21401f95dea4", - "b11b09a13b561d54d3fe69ced65de5a06a6612ce51dfa82f437e5ecafda04e70", - "07e808904dc9d5bcb755824e218f8e1e6c0aa6136c7b3add01adf9a1b2db6ba9", - "223f2f174ef73c45e6e4714673873a89cdd47543f212a7c878c1757ea3fd24fd", - "d4ec252b07ef468fc8d7fce85bb32aa830ad075488c96a4e9e47148dc0508d8b", - "b9208a0ef2e62e12cf8800e4a0e967c1c5a8b8fef1b2d49921744056bfeca29a", - "77d57a5f4a3fc5366c2dcff0b85503e387aa56ac80815688a9145f2dca52ddd5", - "21d56d0e00b1932f32a209852a5b3889afcbdd8ef6a40ba1db8db179a01fdcdd", - "9e7bfa6ea92c8ae610fbd33e4606670447b9264e2baa20f581dc4f44d1c72907", - "d1b94f3e6a31321fbb0f08b84e8e501c59c6aeb9009dcbe98437bd575f3d7135", - "a714dc67d50e8a9ca7d8ed1198d3baf6769b2f016c8268865d195fb91777cf60", - "4ed35dd8c96c45ec01b84a8a15810028624061b0aebd2c3195f9d191faa3596a", - "f18fcb0b9b62c5f72cbcf0dc2078dfda562e516063ef6720453ac855cb515432", - "4af53cf976b5c0ed53d5db29effdecc09977f6464d2cfb87befb56dd979e248e", - "a1ad0cbd1ab3bb3709c38150f8b9d220ccb90ec877fb4cd50bd09731c9b8ba6d", - "d3c7c3fefa80e701df9346dce8a22e2ebb9d4d19b708dd89f16e1c752b044f14", - "c3bfcc49cee0c5793813e09c2eb5619d16125eb4c1ec1e3c042aaaf8ae885f08", - "15e63a83b1acedfba5e6ec74a06943b79e21e413cadd7b091de291dfd889cc74", - "5ece2596c989123d8d03e8b58ca6d9a9cff1bc2b9322897bb144df364e2839d8", - "91678a17bb4a6db2f865d94232d6733c90b1aac653d2d6a53030a1d408cd8001", - "910219e33a9e161ad480b372ece0fc7a9635581456811aac961a3308942703d5", - "3a5ca4c41a61af9915f6b88ee67f2e3549aaf418163d9a82bbcda3d822c0b66d", - "c93bc681a83ff6c0025a78ff4119ca182f37a826aabde92be840490936bbd948", - "64418ad99190f047c87b372d365f6bdfb9b606e3e2b2ea71499e822638ea8c8e", - "002e9afb15a5c6dd93b056e816cc329d44e1e985db7571f1d484e72110b8d2e0", - "eb3344a072827435bb3c98d3daed1233c23a7d020a8c78ee0772a4a9ab5d5a4d", - "4c8827b8df31681522990747b35b61609d0af69ea318ac40315706d13f5dada2", - "c300e2f17646dea944b83fe6e5ba57f47a33d1cd82aab1722755e9cf3ea7a1cf", - "ac7b009b4350e1373bc8e278802d1cdf1e1c675faab509e0f91174e2314b6028", - "03bb4b687456d1cc40de24210c5d6b4738357896e242256e4123dbd2f6d2e657", - "1348e89a098db4fd1cda55d5a3cc4105448eab8b54cb0d5b41dff551eb0f10c4", - "5acdf9f97a15ee364c042f7435615631867a4ce916dfcbdfe36130802cdbde8e", - "0cefc46e4007dbb10d26cbf029835fa364679537041ca2d98d448577b6473c0b", - "a3ce4f64d156a1d27e1dec674fe3ab20aecc5fa1b00b6a7fe7b9fb5c444624d1", - "f61de6b34c41f7118f154f9e562885145fac83e05457568deedb4478fe2eb352", - "6751a6124384940cbd09301048eeeeaec242c5162e1557f1e601a7abcab8476c", - "b49e1a51f8480d038e92b6ca3b0353750c716acab57bc3924eb4130dc7b71925", - "90cde94676e0590844dbe671b659a718bf8e610be5a099d8ce7b95261409a01c", - "dcc4f02fa432798c80000030d24f24467997616ee264c577208f68292a7a1675", - "69fdad91b90ea9a0db3f750e0789f58255b78897d9d96081ae0b6d591be1aab7", - "ad7c4efc97756634dd3ff54d825ce88d2bf9c7407bffaa3740beb2677b0309e9", - "5a130b23085a5d7e1c08c9bba69a6fd09f291136e944af976d86663f30fbda46", - "115b345048dfa6807305166d2c4ad717ea0592f9d6f50825ab81b31c3069c4d5", - "cd1f00b8e1f2192513b4b1f71f8d70e1fed21c011b4e8ecb5f9f7dadfaffcf39", - "e3b6bdc36578f5b72cc06b815b0126472c1ae00e50d76767d9b1bdc10e75caa8", - "8a3b214443883072f947b722c0348b0e25beab2e471011917a22226a32ac914c", - "9206f9614e1d490781075c534b8ae54e5eb1f2ffff7d1ebdfdc3a602066be136", - "4fd422991d9752775261f14009550b9e1b023bf2997b4d18a364818b71d63f30", - "9401b763512567893c018f94f99c02aa9bfe8a63a0dc3e364d569073bf7a05b9", - "c6046dab20addebc417299998b0f530db8a19bfa8a189c1b7d7a615ff256e81f", - "e50c449aec67496ebd4771da56dfd8c8f3a43a73fe6edbd64b6afe00732947dc", - "d5bdc50d182b59bf81e52b3446acff3fc4233e3eb0db50418f0823238ed9d093", - "9e0b3354ea52b31e4879e2a030423ddd1dd5fc69030875bf426dcfa6cb94b8c1", - "7b2ce786bc68511269161dc3046f345d81d7b2bcd8558b48204bff478b545f87", - "f05555a1db1d05179d48dfb75c2d6f81f2b23f95df6aa9a4f43e75b77cfc8a0f", - "1d3240da2b70aee22ae34644f412c3982881b0268ae8432096ddc00d04e3fc23", - "c11d11e25c60cc4d46ded3f483f811e663d1f56ff2ec76751734e2de72faa379", - "eb5fabaca45a7f5a45b2c90e99e0bb53ae1b931274a52fb699c523ca393879bd", - "bb6dc8e29439e8e6ac7cf13aaa159fe2f740bdb64530ba0b485d04f03ff24075", - "5b757a6792c370da96377d87c046a0208ce7209a38fb062437ebc2cdd71ed916", - "0ca3303c8810303fbf3448b5aadfc8db99ebfc4cb3268153633df3b9f3d0faa5", - "b4a57b2d44c22f76291b5b6429e6c8c40df742f20d3d035c05f9bef63c87430f", - "aa2932a56af0e0f340f7de64461841bd643a7831c6e0fe265d82524fd8cf3d5f", - "c293e41150f7be27f8c66f3dea50ccce6a257adf6a7af075e22adfbed1e023b6", - "5916a1ee086b273c4c73c25561faaefa650e45902d220edd0a4c9c856f4160db", - "2bf25f858380292392c04858bfbb81b0ad6f4ffe6b02f0f57809acdfb43df72b", - "22f331d19f7e7f8eca8a1f6ac15a6d48f27d7cea13edadd56b370a39f9d2141d", - "36100aa68420afbd6a48d67df9a9cdc8698dfaf92c7d6f089e399e1ea93bd670", - "2fafa3cea706a4a7b7a4816576bbb2f4ab9d062dabe1809d353e0a18a232f6bb", - "34499abbbcbdcdf9a3d647020d6443ac5c4c84f23a9d3cffae2a4dd4db31c5ec", - "1ea6f2b55d69778e2d0fb35c07d7ad5b1b29c13c9afde59bd833e8b50ce39e10", - "b811fd685fb8216f8271d6dae77590108815e754ab352d161dac27615525f072", - "6582eff6d2c6e0b341abf3836c041fc90eb0faa039ef1e22e3f1b97c9024e43f", - "098b16ab82947d983906f223a02bab4917755b6bed5d148709fcac4a9aaabf21", - "d53a857554be4651ed4d9c4bba173625884976f9c0afaebca1160a265e810583", - "a9772742a658fb53c2a612c761e34903c4d3be2b6e4a6cac85fd1be6007143c1", - "0cf206d4b631e5ccd598058fd1f203ac668d8a5d74c580c17e89085c8a624f66", - "0cf2caceb7b713aa88331ea0e4e9b0d0ae0e8649e994719584475983c0a17623", - "1566eb9780dc56570affd02abc8372e28cd7160f96e274a18fdec4d1923b6eba", - "4e86fb95f432fa8c80ccefa0b04e89875afab274e760b1a2e913dbc48d0d74d1", - "d76b4542b208e2161d6b235edbf6295741246348545abc4dcd10c3a06ac4d0b8", - "1d8f0e2a1ee7f5eaae49ac441ca0a2a7bfd5593606321c9d14edb0656c84fe76", - "59e65cf791b2da3619340695c8d6b558a6f6ca80eda1ecacaa27ad91c6031a4d", - "fa378c30244a9e222cd0566e70fec039a8c45d4dcddd921167396cf644b0d3f3", - "2efaaa4f42ff4bccbfe5c4cfd0c792c61136c29115c7393609448f58de068c66", - "2412b53b39f1586407bbcfb59c008a015c484c004f4e185d5555f880e7cd0867", - "f4f2ef8e5c29c2312ccf75c45b3f1cded3ec8a3e6ca1b6a8d6c5dcd2325de80e", - "341d07a6074335c4756fb1bb6f39cf611ed42466070f442166f4ae2ed1f52d10", - "c7d08e66249a719707c7c928aea591b74dc9b6d7b387327a90a72f57c778aeeb", - "9e3892fd486699032e2983c9e8fd0c5a5029e1c88abeb98459794bbee8ee7639", - "2dd1ee200c39fa69d62f4136003351f943323f00b9255b28243947b7a876f92d", - "495b1662b7ed1604942048429fc37e59e438a812b115c7fb37b7cd0a2791329b", - "971a6ea2bda50d68541519a7b51e75bbf87dfc4f13e78a8558b083a82f39dcfc", - "4784380c7f95014a76b5719314abc73f8a0fc5d505ebb9c4fb2b13d7248abf87", - "701a4e4461fed1b1bf7f08f1da5bc46122420c11168b52113166168075ab4fd9", - "168ae32f842cb856b0c2eb985f0e884192a1bd61f3a2d103a3160e5ddcc68a3f", - "9e5b40d009977feef538259f508c9007872ddc3f01d2cd489d849c8071b3d4c2", - "60d158d91dda241498548e06b1113d58700769c8f9a5c1189b126a4e03216f1b", - "211d3f79d8de0ada57ebb2c87ea13a9c50c34b557065fd569c7cbb907625f465", - "4a71820998967978d4f3dc67dd123f3c080f1e83da9d88b4e7ce8f21a300e8f5", - "5de7460da4d1dea642006b28b7882b5d316fc1afc23b0394154fd594489ab63e", - "92975ee178ea839078ff0eb82e664b765ee8009f1826e76c932a96877c5a5385", - "3c5036438c484f8a0cd0a36141492234f7bd62c97985c860798550b0c9daaf6c", - "14e8c8b7e0d7630a6cd23db74c9c888cbde3bf969dde861a2befa9aa762d3dcd", - "518b8f75bca77298d297c89895def454a975ece92565d7e337d26ecbbadb5a28", - "79111abb3132cf7ab21e7fedde6710d390231c6a437d249f3fbfbcb83947e9d3", - "7716c73c132961989ff2b1778073f5380c92baddbfe5368d688c5836ecde133b", - "c19ecbd7132b4c4c81739bfe2e557a3b69e299588680e1f234243b3b8f696a0e", - "79ac68b3059bcc77bfadc81584ee1dafa4913ef6c784fb9bf3459b74c08c3484", - "63fdce5877003cb17a8e09d90e1bd8a9a162e736d7ed789b314e2e5e6268f80e", - "2cb0867f01c69e572191f6fb7bc1ae3b197b45867b2f01d187ef4a4a6071aa3a", - "8ee62df587718ac5846a3a072f989ce3a3d6739fdc8ca2ac6b3dba59bb8dc4ea", - "7b4887b3b761aab7dd22b2b0f452924fbb55d4e8a9232aaa8377ca560666ab80", - "47206bb912c47629212c18e62271b17c6a18563d5f27cd3e7501410e5b0b4b67", - "d0ea2e9064a7561d49c0fc10861ad35301fb8e032889e0e521ae611e83927c78", - "fb6c5377f09fc060f6a266940befac8c838d869967b6ccdf39a6d2306c1bcf45", - "84561cfb38dd5cb79f1af765cc01f58ae6d7cf28a354b97ba77e2a3b7ed7a3c7", - "2a6c186ac5e7ee886d1a4b22685c9f9fa4e5008e7ed9f56e8a8e2a66b7bb0d0a", - "00b585871bcad4437ece3f0461aa20f5c492f3a4d490607ac3fea3caa4db37f5", - "30fb5b6abe17205674658f41b65357a09af9d926d3f6a9b279ad1e5d1e0601a1", - "9135fc97ca3a4c77c0cbea8db06c969322684b3f9d9db434e438f1e95d3ef595", - "5f862676713a0d6fb3e67d90c70295816c9e22789cb3f16be4e9b77b01377503", - "3fcf753928bc077f483b8ea09c252c692e24aba61cb1f50cd06b75853c9848d6", - "16fb73bcd0692c3eb57b6f761f229be58100d915d9e32c0d1f08d21055ddef28", - "08ecdfaa06d5ed2cba8d03058bd47f84a74c2538690390cd20ecf436149bb8d9", - "48e2ee4966b2eb6a90ac5f9c1f8edc74a6b4aa46d95f3a5f460ae1388e72894f", - "d04c48815741a6eca640f39156972251765975ff5c126cce734dad161b039be1", - "387963e3b0e497de9b3ce281f3338b441e57b0a5b7d033fe425f76907a413894", - "f3dcd794099dd5aea3f72f960b81d242b50cbb84400f9388725fc5515efaabfa", - "378074abd0bcddf530ff1264866690f546960ec6c61584788b94dc7037905643", - "6786aaf756da66d56ed95914d9b3908745cf997bfb8428c2c3cdca73948bddca", - "053259936bcaaf44cf7f6ad132101580aacd822958741934a47f522d43756ab1", - "be7ad5c110da20c5808a86f2756767d35055f566f6bd74e56c26d2025ef5bb7d", - "b9453b4b8a9bc55d72e6db2cb902ce74178239fa943e910b6d66c708e8493e8e", - "71777af544b5a9f7c4f7ea9a7160d0b92e69d3c2453de01f9c3afd79f50a7d2a", - "d90eb7c138cd227b0f2f2d4df4e26c3724ee19de62ee8c23306547c09764830f", - "9a296a65b72cb6226b97e973240c9dc0e7818cccc22ad74e9e7b29fbf20d53eb", - "f0ff75192cb6a51fd42371efd1ae7d31862a31a5672ac4039fe45a95160c6cb2", - "31f3a7ca579c25418a9a6e99ce8ad87385b751021be43683c3d33ac48d640edf", - "ca2530e649c2b3b118510f0e250fcaca6c8622f78b0583e0a4305334aaf35b28", - "171c45015bde15abf6518385ceee400d553ccfc25a26ded8d391feab165d8309", - "08a01840ced1e88a07d6f4dab52ddab6148e1ad72b29048eff8b3dc61d3303d1", - "8d60b8de03bf84388255ba50ef7fe67b512393879229e8404ad763f23bb6fedf", - "f07a346c473085a185408a5a0695c7ea44ddbf2a7413527089216fede7faa85b", - "075daf0ad7cb9368cd49a727b4c812294b6a5240e736f9b528f0117fe0b2dab1", - "e4112a54c5ed1250aa11f261b68a6854c1e323d7d81c8bd36e64151e940efea9", - "4bfcae760a9035c6c12aef24d80bc6ff4ec221f1e8aff7d95d98a713ec16fe58", - "a476908ea8a0492cadefffb7e6dc8c8ba058e409ac060a839fdb4b70b97a44d5", - "d4c8062bb749972bdda0d7efaa4e9d43d18f741768b7f11a240985443501fdcc", - "8ba2272e24261391ea726dc425333b08dc45be68877b62b4451ad3402f6ad759", - "d3fdacb5f985e4ab72e2b74a21094f8ebf58a78a6e4b9e513f2a5fd56f8ffe8e", - "3f39cf100655f2f6d08bf85e173fef2cecbb36a6a907a1c6678d4b648d88940d", - "17786e9176683133c37d948bc96b2ead30245ba8a902d872b0abb86ce472dcc1", - "70244150a92cb5405684b3c4c1574c4f8e77d9193eac5ce539e65050c917b614", - "14e94bec567570cbe9185ee8bb08a90249130d4597fe03bda423530bdedc4892", - "63014fed6ec443cd9c85064ed8cee82d815ce523088ba405f57b4a0b328e59a4", - "4e3cddacf7129aa9bf2d862bdc4e3751338213530828b4cd789c936c77a003f7", - "11126094540507d6724d01c2d40966543b29bfc28aa216913095064860ca04c3", - "16173e69a4de725902db493d4e0251f8b9bfea922a31d5297b7740afc4d2bbf0", - "ec27c71eecc2c415596a07885cfced090d510a045c94108ce6a9cb48ed913831", - "28961adc430c7429776f8b350ce4e9c4113440ef0ab3102ffc04a43537d661fb", - "9f02feacf6ab221213a069fa602ee5ed37f91336ec033657204d056c99243a59", - "46896589ae9e77c97c988d1dad3c416bddc08ad0e59cd6f090933b4338e758a1", - "8a22d888ac235c03de5b278dad42bb08ae31594850d43959287b845cf866642d", - "6b9ced37c9408ea3d65a76d960292a89ec2bf80601400413cfd032385fdfc408", - "db74e016946bbb6aaa9c5b0ca7bfe32c75b9f754c86816e9c3dcda3987e19442", - "66cd5ffdf0f8b1647a71b38d8fae0a16ccb054abccb17d22c331e8cb2a27f951", - "4acdada590a256f4d99a5e8f3e66868938861302eb978b2db8289bb55e4323fa", - "de3360876846e1025fd390b637ec2662d0071e23b0773bb1d13793423564430b", - "789811686ab3835028cac1e5aad22fa63b8731b6de339edefc4e39739a02d441", - "344aa31ae1c9456bd4c988684c9a4f1613c2cf26e1477735b2c2f9339260c0e6", - "77bb9a49deb3af1cc0fe5b873bf4d19949063343aab97caa8a8287dfe9c35959", - "df07bfd50ed8cf761ca1f544d717ea8efbc5297fb33e61e01119b680f8b643c0", - "1d08d23b0a1d049af60bae0f8bc917cf2716e7ff23a43b4432a7068342dd00ba", - "eeee77b875f4a4ce4954bb40fd6bb658b63b938771439e6ab02f644581282685", - "c92420978539f6be2b4ba2b4427f5c7efd92c4e2929e80dc9b42e274db1f41f9", - "c16cb083a53333b822a727523e5e033e52e487b920e45e096e69aed3c714c10a", - "b7bc3862fd56486de98d3d17f08f1d52d38f3d039df5fe52a267e306a6a61ce2", - "8b02aa0a8e5719f30fc01175729035f2a76bb907a3bb455c7fab82372ff55c79", - "ea0c329ebcd2dd28e44e2eddb605b9367d0f191694e58927259ab5f3dfb63652", - "4e777aa684cf558c702b53489d9d116eca2fd548ee8ca892f10f70232f4b953d", - "fe1b0cda7c191c1b83c82b88db726b63bd6e598dce7110043a1d23f027ef7132", - "333077746b76a1c83b35ef2e2af5cf0affbd22f247bca94fe9c3a878d84d9dc1", - "ebf5a2e6b78e8ff2a634578a813e751435ddeb65e12ff9566271f26c8ce44893", - "49b4f089096405b2879a2b1a3555f6a761cc1f67fc35ec0eab5fa315005977a7", - "25e617ec8901fe2401caf029edccac468a8b60c73a7c1e4ab97ea2ad94b7b796", - "3de345d19c978dcfce61101f4ff73ec0412361ea1412a38fcc31923fae6d7c5b", - "d6449b8aa8f13fceddd74d5b00b0657e6012f9f1b8d75a9356e71d5bdf5b1d25", - "26d70fe8efda1909dbe8ed2c78e0d58c2407f2b579bef42e0f9327a33155ff2b", - "013d694b73872e1ce45f406e9e27eb08450d753d11caccc033c6b4fcb82f627e", - "212f6085f228d258671d69778b2244bfd586fe18ff9add6d0ea133dc6b7865ec", - "32c76de3c167c49df4d08d924ea7400918e125710a5b38b1b37deb4211cb65d5", - "6a08f01783e3496bee16cb4f5d631caa988e414d9d0fe081eeb4244661c69c2f", - "7ed8e83fdfeab36c3d01b702c2124a801ef2177d4ad3691fb7fb6ce5efd33edc", - "98a467d6bbccf00092fe3cae40ee032f33edbaee6bd58f0ecc265f7b69656926", - "b7e700e71c3e81c0cc42ad68b6b5e7fc0e702fe84393f5884770b8bb1fb84c0d", - "3095f45e0ab0394a33724ab82ef507865ed131c2f9d0fdcb3778b6b5c90f9f54", - "88c8ef7240dd0b728a6533b6a52306221421f8acb3c78e3a9f4d65ff11124db1", - "3278f039cd56ba39b5715482c25e5595d89c2d11ce8f6299b38e916890b4e871", - "b0d742acccc0a5d9dba09ed79a03864d780fd13c39c7aa6434d152bcf8ebd8c4", - "03c7092a2f2caf196cad586f31feafb095a75c88fa75515473e9a8a0cc4db1d3", - "8ca3ef6bb17cdf48e17a930a3bd893380764f6d6bd4ad6e589b0a8c43791a297", - "c876ef737fc0e181c8a86beac32334a7a87376ca1dcf569bc22dd1baa66b55fc", - "6654a4ce4bbd4be15ce07ce3d361b195cdbf1090566d56c7d5df7f8c379ae8a7", - "ca406ecb7235751d73d5134915d22a0c835e618545526f85ef47f7f02d5256e6", - "80590321d90b1f77f7b7c7180687538727f1e9d8c6b5e61430e584f6576b01d8", - "78273952451c81d42ec02f61fdd434ad17a55816c4f73a0433d8a77748ca659a", - "4dac40102dbf7aab4ed6ec48a78c713fd05f0b45c67c607d5089c862cb694cf6", - "18e1e02e54c979c7c045c699d2678e8a875f4bce0c8058818d0b0b8dcab9bf6f", - "35c015ba200869ce798514f2d67dc019c681bf0208855e2142ed74f5f001a12b", - "799e40e93881211a98e38f9832ccef28e23062a758af587c899c831089a2b80c", - "2267d1e868301ac64ac79282420e03e002e276cec91c26867fbe9136fe09af5c", - "cd62ec17c8b5803a2c1782196cd9e5418310b65449093a51b07627c5d8232ec7", - "08b9ee5e59a7510d3244fa9b8a49d8d12828d8a5e5e91a87f16f9dfb9af6329f", - "d4b2152b3de8b00f309a1d4668bc28ca3bc3260869040ed9f53cb790dfd8f6c8", - "fc885b66fdbdabc53eb850537458df1731d2a70fec38bd4549a2291b03e8f57d", - "8bfb2351e2c1e6b792d121c740df2407ff51c3b3618132cbc04e85d4a3abb1ea", - "ebed6c20450d790b5beaea6f00dce31a6011e7f6de5b28bbbdee4be809caca20", - "9a7fdb2f80d6be40c27a3edce6eabb473ca5cfa3cad930d0c26b4f1cab4c529f", - "f65023e2e954bdfd4714195e5f6716c9646981baae5dbc40f23e8f55c5ad7a22", - "b5757dc5f516c3b732b7a20cf24e10f1f6e54e5d61d994ee47db52275b0eb14f", - "6cb54a830c702433bff2c350fdeb9b362a56cb646ff700b9b7ab86594d3baf77", - "a596b09c6a3f8bd4705953c1d1d78387f8b4a9db4fdd7445ed108b1a961860bb", - "dfca8d3ddea366da8310d410983edbb29b9d8e7f73fd01ab141bf3f2100fadb0", - "60c1c254aad010c702ba42fbd433de6447eb2922e197ecb057a79935a86b4cad", - "9753db274b82a4493a30b228366af37387155722a7290b1c14ab42e60973c3aa", - "b04b9c8d15983c4eb8080e94d02f414ee1b3f002e96347341010d79429de33aa", - "d406e7e21a7dd420f43688982a81f3dc598d66c28dca48bea5ea9643efb7b3ef", - "5751588d13c0dd3bf733b0c0ebef0c6f5b29879c7e7b84251418f914d6c6977e", - "d13164feae772d23087c97991df18e4ba23cca55e7891a190f8c2916366c0dea", - "23bfc676c4d6b98320897ad1fd5f0cf2ccc13fd216c61f92c2f72a1cc21e487a", - "28680b9eb3f0f1d8fc698c602c732f6598d334d41a034464c23b4c36842ee1d9", - "94ab2cebb7612b59d427bead39a78e46aaa80bd918a9d5b13ee7d95563f74df9", - "c08fa9bbc07bd857d07b1d24d21deafa5fe2838fda08361aefd9b84a2b6ac395", - "5562e0ac61ed8c1f8f160e394d6e03c6d6297eb3ecc3810677063ede90fb8fd8", - "34e495260ff4b6968684df956d50394b59863c6053865c2ed8055dc83138dcea", - "d474e23a63bf5f5648b833a2ddbbf8e9976e067ec6f770caa88303c68886775e", - "b5f91e22c9ff25f65f7f47fe294adeeaf67757bbb380e7795b05295f7b81a7c6", - "f01a139b722bae4e32bbe26ee6e5b20527b15b74c001e6b2ad28dc9a1175e16a", - "bb866051d2e5eb8a5bc5e8eaf39c00d9d807bb2df01b4ece1d8fa9dc26660751", - "636d83b6467818360c14bac83d07ae5c9e4bf56c66fbec66f80d8364e5a80aa9", - "df51e116e1a662148af69cfe893c25188b9d0fe57727b6b113150f6a3a27b390", - "fbbe97d13a1543a48395563a3fb862306c75cba1a0b5e72e782a6898868b9f09", - "340222faf104d91fbd47fc91dda264238dd21e92fe22612bef136f302911b106", - "d1f3b23868801c062e4dbe12fe94b115d5d428686d0758fd087c5efc08b06d6e", - "729f910901381da1ce9d10ccf36e59acc76a02c9afd5d9aa99f1903cbd3776a4", - "3f707d87ab3687efb9a5cd5f4fbcf882f84e3b24f10e08fd02d860ac8adf1c27", - "6cbecaa511493c458fa446841a19824c57bf748813f000361fcc3013e550cb8d", - "a3c1d51773d07a3fd373544a8cac2dcbb209ed60b545f99e2e3e77c37600f053", - "fa856a5b049a4a4aa20802fde05d18bac1496263e635e9f6688ed60e6777080a", - "623d868c3ccea8b1d87fd8b400ad59adb1c1297bf22ee95d93038f41ee3b2eab", - "44fbc9963ed4e2297d9c4d61e7c863183d8f943eaea2077e6e53b58c90864b43", - "09319fbed4f557f9927267256144971dbded0dbcdb69976c304cd5390832eb80", - "8fd036de533112ffeefbb26f88b315dffb3c76d7d021d80366ed57213b9f7ade", - "0b325411eba09556724b95d8aaa9c0e98004f7cd0fa16220a6444e6035ab3ba1", - "b92de0fa7e2246ebd8fe536f76dd83514626f0f2e26b3ba3509f6cc43efef220", - "126eab9640c22a3b2477d917d34e11e50fcd44f1433686e61291126542e17ab7", - "cda80e170c760e0e06fb89af1039ae5e34703a1a3a5ce03d8fe0bb236e775498", - "94910f451dd4a41c6117e21930f0263d0c748e4f2a16a8e48b49aa73b0262133", - "a98cc71e10e23307a7a5b4c81b142922f42e4d1631c913ba3942c5623f535d62", - "0ca05859a2ca6a76cb11220a98b61f26003f360269d61e7a839df70f6a35d519", - "1499b139e5602d9e7827de441a89056a8d4cb09b590f8e35d643a76cea3c68d9", - "e847e1e3320553d659b8661964045c8da41dede7cdbe2204b75370831b5ae3e5", - "12619f2190b948d498a66a3a775bdc2c88b589e0b8dae885d043f293bf25582d", - "251e44ed049afe6d2384045f01e22e238cb1f37dc874590303dbde23e991d764", - "736240385a5424917d27c622dbdb49f8299f5b2eb562a7ff8d64ab4b307c7243", - "6c9f174e4f63798bc7e477fcea8e677df613f0299b8ac06e9efdd150f814c699", - "fc6aca0bbcc6bd1a7a10f1a5eb11b0c32bc1e6e01e49285d2c966ac8e2cb022d", - "7d823d304c2706f946dca28e10f8dbaa228781510ed2f5da73404a10d9871aff", - "a27a9d55669bfec6142bb879685e458d3040fc53da78eaf449b1f630373092e1", - "a4a78b81e71d21d8a20f61848ec90fa552947887be3c421fadca0fb3435fc8f0", - "2c67707374ab8e94645282d91784932e082ac07ad01eac4ab5bbcbf48117d465", - "251382a5d6f480afd5bf392615d6c85e958e3c8655c5eeac75e300a21dc50573", - "383e0dc013f3c6d59d9ab4029b608a9ef20653ea647ee3a599754a77ea051187", - "1f3b3f716aea07a04c63c1f80e29f1904e4cfadbfa4e7e86412cd042e4f9c67a", - "d7cae967bff87817a4f403f6f59b2299eba9a03630fc88b32d33b86b46f3a7f0", - "b491eaccdc09c988acdebdf42260f64e559a1441b5419a00f3f463ce4a44064c", - "a8981353f4ca5dba36d8cad9a302a3e43f7509a247e53b4de9df91b8b2e9c9cd", - "e837b5c9e73c5c092a7eef34d242d49d8effd23a5bcf63b861cdd1130953e12a", - "9ec08f56b428d13e4cc581f333ec24d20af0104f70e9f70603ecb6f95e74f243", - "dd44b130ffd69bbb98dd5003217a11a3b8b95e1157bd2d8d3c593ecbd4fb1e3c", - "7bf27ff46e7af17ba6a0c030d2e115b6fb26ca689c375ed7676740a510aa1426", - "f303eafd872a2707abd68a5b1e257f9cfa32e348b2f1e4be285e3b32af41e063", - "d73e0dc8d6429d3173cab7b7c08f6612e4f9b38b89bdc591adf8aa784bbc339b", - "49bb41e6b4a48e01db56738fa9cb2cfd3012e9b77b7ef6eed92ca76bcf805483", - "56e6c31ad0bb1f234e18f25931764e21ba750180af4948239c21e08bda593250", - "ba5b9fdccb97ce3a642982449c6fddb51b64f3bc0603d6223203c4d509afabd9", - "e4063d68dcb713026a88503e525b75d47e3222f7f1649df94f8ff4fa79f206dc", - "2901354bb82ff7b4ae5809d4f98ad7be118d74537cc13f4b266d142b5659cf6a", - "127ff31420d7d0681e5eafabf2e5422d01aca97ef41f59f5f2874c6da3a3297e", - "82451a90ef31cb48fe6728a15ff7a9b4dde3162cba0be45c8627c8328014cc66", - "75d92705b1af297ad7604f6b7250ed5253f6fe63765cf2f029c1399dc0f0ef6a", - "ee16107bdf10a1eb9cee398b5b7a07df98046a7a58594093f77786366a8b4c14", - "db6069b60719510ee9865c9ac51d63d43e59f75bc3af01075eab3651b004e0ba", - "ea56dd7b01cde0eb6f17f2ac39314fb01ce830d66ff96c2bc46a5cbcd690d4d6", - "1c28461daa24721b4d2e686be48a77a49134437fe956f8f46ca28ddfbc4e81a6", - "f2c9037f4c456e65cae7629c4ec8e632e3b7cca138e2e6df909434da32287064", - "79645aa810a85d19fbb8de32b9e4f33d4e8c309861238efdc73816fa31dca5c4", - "1bd69f2c84ee88556f85f8790627e85bfaf6e6129b01c3a8ce6f5a96b31c8842", - "884116f61cf5c87becb24ab3f2576a4d9e4642f54b5c0d4cf3ddbef8f52ce3a8", - "61ecc7234628a420decd63f97141dd106001c0fe42dedc708aae0ef5288d9979", - "b6e6fca6b2122c0f2cce7c6fef4e57ba32b4f2003808c724c45eb880d3b36844", - "713b6b4641b09bdd481b0c2b0a318a482d52735ca0d9a53a47909ccef47ef49d", - "d364fb9be0b3c48784dce086c967a19944083606bc739aa64539ecff73645156", - "3c938c8c4638ecc50b2824a697ce5011766820b1d295281ece0a0b9fe1f017fc", - "eaf6ebf478c73d53d4692028d5a8c14d45b7152e9fb493ec830f6e8c5e60de2e", - "ee0e69310eaece3c1316d2fea98b9ab7d24c4accbdc628c89122e033f1e1590a", - "67aa943fe23a4cf6de227224bff5597eae44a836eb4710eef4908ca3f6af35b3", - "8ec7bfaf34c4a0a2e0e1f510b87113da207a4c8e6f43230cf27c33dd678688b9", - "8c08d14867b5802f565707ec6abe322c59ef216dd5c2f1e0d6ce38e700663936", - "f1dd8f8ca67cbeb2ef99a8bc6f72714f9928c8a857e0b10fcb8e3335cb0bb8d0", - "5d4fdc9cac7181fd8a6f2eb9a97ce26cfc183667adb127b02b46534464fe3098", - "e3ab4cea638a68fc0ccb73bdd8b3d8fa30b3fd43b1657899c490b85401e1286b", - "200edddf9b5093be3ad67c4fbe0691d181285433a116f23d3403cdb9d3237231", - "ee2dbdcf436a2ac5595de5d4b64833081440d77f488c5382deafc088effc17a0", - "81fd22d82d688d47280a7d2ed698d713efa76b1c4f24471f7676b18680715af8", - "f9bc1a8603afbe542e52c9157088a6e290c040a5c46e1a0a8502aa441eccf106", - "5d63ff08905569c2f1d36ce0f8ee109fa7678acb15bd1e1f787645163b4519d2", - "ce8ba811e0668e90f57f7646b1ef3547e0704de3290217302421a229100d5895", - "92db4863dfa4a75ae96eb1f89ed0a6a865634ffa0e8eb2f8a0ce63c20a09565b", - "b20e96f05c829da106ba486603c9ac4c92b400d5754c699f906d88bd886ff0d3", - "5dd156a271ba74601969bb1a1f2547940de56e5ed05a024f5a6fda3f8adc1ad4", - "1498f76e92f3a4dc534db95dfe1eb2c266545846ee14878d6cd5c7ec1faf82e5", - "dcda8f8bff7755cde6ac2303cb24515c0a6b58322befb2faf2327b12a8752343", - "210998c5a30d98802af758aa6759e5e13759a88f098e8dc6fedfeac082604ee5", - "aa6f0523ebdc8bd5ff91895c9ebf67802ee972bf95b2098bf87bc3ced1e9056d", - "74c4a93dacc2a08ebeb3ce82e40805be92df3394758b20a8a690bea8f21aeca3", - "5bdc2fadc05309a95d3d43ba82981a57e9a9eb1189ad2474b6fcb15cdbe8d9ce", - "aca21ae69b168a05f904b665d34955bbb52bf142308f89c2889542526e7fc270", - "a9fe178972023b55caba2f481092221e5aa0aeec93c0982265b48df33c60e089", - "2827be01c0d21a966753622a2dc2d44892ce0be503cead385bd44eb54a5244c6", - "847f2cc610a183882d19ae0b6629a7700a068b909a3f6490749a7f2b01a42548", - "3a08cf6843007e98ba065b83760d47533ce17d58c7fb941b10ae8b1d50f24521", - "955f9693893b8803b5b97e771ecc0e6093abeebd2ae6e4b30fcc8d28006e1b7c", - "d94c52aa70ac49eff15312a0ec1de7810a97c75ce33b9fd0440ad7a99baf9e2e", - "ced65ad9cd9fe04c3e1915aaa472b058a956297b11d6a73c334e3df917e72676", - "1d8a563b5d053a92147777099831ed81bd33a02a51d6c8799666c4b8ff2978fe", - "d29b1395ce9a72fbf2dd07909bc870079cd012e6f43235a74d697f687e49acc9", - "adb6e9713ad72729850fdb494c57cbb0292c985fb0e475d1f17b45bb5c7bfd04", - "ee35311927edecf4c9bf90ac98f3fa1f158fbd862350d65622120df9407e9d10", - "265d65769a7568dba0bdf56c6bd1bd7b1d48c98a6263e362a07db9b3dee0ccd8", - "5f493e51764a6399a9469521fa3e3814eb1040a4a91a1c3f9b61f95950b3b559", - "a48aeb08a1f6f66efa089231a04a1f3c9d4b20a729204c36a1c14bf2461a252d", - "2c8c07d1928db1a5eda19d5fe6b3b5a1056d48830ccf55324cc30fc633281a3c", - "ca1d9591edc54f1e85c68602e70eecef7556bb322d999123a201b6e75350a0fb", - "f90bcdedecf9b96db79358bf50f58e2662ab59391abebb681be5e9ec33870b6d", - "c5e0bf20b65576688f10db678e1dbc6064ac86d99964a8b4a6364908df3c79c0", - "3a1a36a32210c3d2f372c85cacd50673e8cbcfe6437ef7c711eafbb81c89d5bb", - "84f6b4de900971e093f503a47c24a70844fca8765638e12cb20e2f8219b0f9af", - "396bbd89a09f4993a39b845358f5f6f126f10034b4a47b4053f0508e84d66675", - "29c42b141746334a06698f3c1b8b3ff8be929f54570f2cd905aea3e06b26d59b", - "ca512a01e866c848629b70cf5a2f8b551fd724f1a8cfe7d0219a7fc46f076563", - "cb64b57b3dacdbf24d6efaa1010827ebeda315159f3b1fe794def85348bb255d", - "5ff5ff593f6bccec67a4ec82dca32708b471c6ee30be4219de471aebde110f26", - "9e6fddaa715195141033b4a1a20514773cf503b2833fd4331c20b60437d5a09a", - "0ecb2c990b5b6a4b02b40003a188e806fab3ef9569ae9817824cf56cc3606b8c", - "d38ac7b5d8fb8146cb94a1b8d773b9aee0f55ba096f4332afcdd6f8f56862496", - "13110a83835203422110e8747ff2564e2646cde2739d803718e099a0bf845da4", - "26050666b83cfb6aedac1235005ac41a366d2c8ac8be2717b31ce8eb772effe4", - "6f2ebdb716d7ea8640977da0d38501dadb3fabd3f31b8c93e17640edbeec755c", - "6785ec6b14d890df9395477e78df3fa911f0b6603f4ace065e6f3d78e899af90", - "bf375ce2a53f2a20c87582521bb2147e751ee22fba512883b2a360c6b02c6336", - "5cd9f5978b2124c28bdfb63d584ed1ebca775c9fd579b00206f4b51c44c3e245", - "4ebe1c1433ee64cdbd2c57f2f8674b9e630c05265d9d0c12ff760d7d26c91894", - "983686346a692acbd82122a4d497ef06fa07991295d189d292677d1374af1815", - "f3a8a1ebf0338f5ae6e6e13def80772f46041a9ffb64f1555deb5b67fe4deb45", - "97e5e018e5d1e9cf01db458795c599734d96cf792cdba8c72f570ad5f1fed0bb", - "b5277f92610b525250e1d95fccac9d4907b730f81f46d52e2b6657abb625ac8f", - "0fc4a18a33e7a65bca53ae36b881e23c4ef71d35e19451c38615a4a68374a69d", - "aa333461b40b167b4b274b2925ee0db433058b0b41447906b885746b6c3386a8", - "1bf58abd35ea348e0ac08a00a44abf6f288813ec7fe432be29ea148fd5121279", - "2de4a079e419183668f990d66333d1a50988c882cf07154d685dd2f50410538e", - "b8a8e7327cc3789f76adfd15f0ca0256097462778ffd25689b281e1bd4ed6e0d", - "9e43b0ca6f96179174b9720fb1852b54f33818fb47287cb55bec77ab7d91e046", - "7b030180446a4d4ae59ba52b58afb47d95b20fd8b1c9b2bc7b21f0f1356ca379", - "d71063cf98e0430c756338d04949f3d445c0fe254387e10601992120d0a1ee7a", - "e0a8bb69629284635f76a298a0546498a31803be14142b53882e32906c190253", - "f78d24830cd6170cf09a04da587b68deb001b6d015cfdda0744912f1ea146d07", - "da3788735e99a1d5012cb588d37e28ff5864ff86d79b8d4aaf533a4528db7c1f", - "a3c58c7a6de6eae1630e996bf5493b7269dbc90a52eefa6d8e4505a480a7600a", - "e637cd5dc4b49e310d9413eaa4eb905a1969cdfe13ffda5ccee38443efffa066", - "69ecce2304cd2681a2a90c2360205b830481c906a3a1c277ffd2d3cc8aab01f1", - "2cd34930893c574756f4bb7676bee9a39d170d9b31232e0695c4aef4d838a68a", - "b72cd86330dc72bd1bf072c6ed7733c1f09c044a4d0477980697ada2c2751684", - "e36a7c7b9fe3802e41dd8de84d2ac46f3f37065fe9c7e586c06e74c0dbf72ca8", - "d201d7e759d7e83c5a40ae67fc2650fccf1dd8a58753a035d7b5ba0d7e83104d", - "0ba644738d1a9133229d6b179b600a95ac2779f39cb6a8bc54d219e1109d32a2", - "26ab06df60460e5ae8cac3241840feda28325820594d394e37a649a0aa5db4f3", - "3c258a4b4b979362190e89fb97111c6e1dad8d760621d4cd7f354b5eb2e125a4", - "e86bec05d468df1017b3e95effb38fbbabff2b5e747489b876e1da1999ea44b6", - "cb6803fa84d7643f0ddfe39613ccd2b49b95721eb15af67a4c1ffda6496105ac", - "ec7ffcbddb8d60f99dc7790489031809c1d2b4f871d0891edeb88a3c4cf87219", - "8f6092ef7d8ef0003a69ca105bc66e75626c55bb44ddaef46cc1c3b184acd0b4", - "4df3c68eadeaea99ed54c91fe25cf1454258460b133c15cd7e24eef8297b82dd", - "50cca3a43b8274a154dae5b875aa714439d541954ed672995c782cd6a82a3a0c", - "5f5e829f4d1fc785872d9ebdbaa3fd6fab7591b9e433273f3cf1084507ed69bc", - "cf69dfbb16c71f9e49fa9a6e2431b5ac77bbc1fbfef84b8601168d2128bc416f", - "7d985bcd1aca33d335492337f43e806dc88c4e56592e5c201869ff4ebfe2dd35", - "b8f4785c15258b84acec5084c07630d9d56abb498c7a831e79d9233a1c48b393", - "6cb77bc61485ada58917fb5d75f007dd3a8fbca02b62367d752196a01acddfae", - "793c8be1a7dc873425faf463cfb4c3b8c54addad64a3ec9f873a0f61c9539668", - "7fba0dcc177f408f20d1c29b7c9d5e11c989ac15da76d3d7f9133f72aac6f056", - "8da0e1aaa7a6f4b25bf03bd3a89ade19aceaa9a0e4a6f3630c82f193cae52f87", - "9c3f8577ae960d62b027fc9356646a1455b714786a97ad63c5cf191a89be7659", - "f3082901cb9aa720a4e27be9442802e9dd4526ce6d3fe59668f3287059971365", - "3dfddea5a9018cce845b9ed24aa283ac3395d419065eb2ada3c6244fd50e1eeb", - "63dd6b8caf04f57dbb4d7c0cd3d661d239fabdb3acfde7c16f901d8dd784c9ae", - "20f705c97e244ee01ec4299e9bb534c2529e65f4db38c41b81c1e0c313370903", - "86ed1a599dd2c6d3efbdb4ca05746fae1732d59e9bc4c878f9bc33edc756bce7", - "8a0307e1c121813f74d38b988fd64c89877c41e6e58276e901a49974fc1f8df0", - "5eed2a2a5d7f9ce38aa768855d76485ca5ad217affe28ad1f4538a2185766da8", - "f67b67c652dd11a68daea2daa697eccf107f6693af240a7d6a44b6765927e785", - "181ab391b7af9f17aabc091eb6df2b0f5d08bdfbe6cfaf1fd519fad39db4c973", - "0028492dbc375335ae6d698db09ddf44dc84283e38973006b9e1d5894e8196b5", - "4915f1c4f2df57a0a751f132158bf538a825d7e6553e867e4516f7a6bbfe01c4", - "539519d6914e0328c4b2d88eefda1cf074a34b8dc250adf9172e597732f1ab63", - "b45d72b570e6e4a0f33b7a8ca9e64bd4e9e3792bb005bf4d99f234e841f732b1", - "a74b2e618caed8a15c1947371f0f23a13d6d5b99c8ab8560b08518bf4798b112", - "1dfce747d8edc03e247bad942da4ebfbdfd0ead871137ef54055c5087d781b55", - "3a5bde73dfba90ccb55b9a19904736273bd7a145a6b3f1a265a34e12148e05db", - "b98cd097ebcfbee36884e24b411d50c21a91571d80b891bf2872c313a20602b4", - "9134a69bf11136a76de5a283b6fd5a7b9aeaee22e93b66308f847ae2f6968020", - "f312061f1df215dbad7b1e05ef094afcb72dff022d3e319b2493acad094d18d9", - "4942432721b9c97c6661b59b573d30dcc4adaca2b013f6ab25f1719e9c532a17", - "00ca26a60f680696241c461ce4f74a4ad9f5f4d1c096b028070d2ee83e5bc3e7", - "aa27232172ba82bbd466bd2a34ba39c15158a49ff4a2019de515a6122b1734f6", - "af8bcfad07174806e7cc2559369f57e8d09ed6d6142c331c2bef348268ee8f1d", - "4eb50d53781a23031a5005b1ac2dc536a8ce64b06c2f6fc6790148ac242aef58", - "99b2d0a6853e578305baf8f1987befcfca0432bf47091a46ce65d83dfe884be5", - "e79704fcd4a9bd46558b15032ae8a79764abb8d3b0fd3204bbcf631bd4ab568a", - "a09cd3f4156e2442c64b0069207ee230c40cc1d39a582792f43dc9df979fb254", - "1cb81b225f81ea24cd846906d06f55a0cd129f2827b3c056e45d0b3fda17d706", - "cc4dab273e55026619102122d9f4b3f8d4c23b6cf6b06aaf610d9bddf5660c46", - "5b50bd3a65a3edaedaf7c1bbd3e4af6f63115722b442805dc110dbf9618f4593", - "2bc8a8af75bd04cc3e12705c97e892470b7c70f3d7fd65416d08a82114834b61", - "d270ca8bb2f5ba100438fadb75df3057fd8e8e35e7f28c54e6b7e21e8c1f737c", - "ddcbb340ab5aeb3babb9f8ee5381ab2e7e7df78b10de3f88c7d1189a0c2f0092", - "ef4ca6e67ddb325a9b8c4a3a5c1ca0a327a946fc5c0fc7cfe5285275b275e74e", - "0991150ce97af381eb427003d161b2a9bd417b4317681f3574738ccb09c02156", - "42635fb2cfe5b052ad32fecf6c420bba572ad9260feeb65ae530c5ff1085d005", - "acaf9c09310605b116c96c013b89323bea1020d81b6cd86d2870692766f36105", - "4b3a940ea607765f8196921520dc9a2094905e464d6ec65924c2dd883c8223d0", - "d98228a8028b215bd226ab9abccc8d99aa771fc0923e936f3a42c1cf4f283c02", - "5a72eb5c83ccad878cb526769b4317af07934701e6548783784bb9c9b16dd470", - "4d27806db7dc2053beb3f5f1de9c396c68c48c91677e4b353cb56f4b505c4a11", - "e3334fefeb1ed24800c298cff58e7f01180f82a625642dbe43d240c550587737", - "9835cb5ac2584936de4c1725f3f607114c79ccbb494d48408974e84116ce9eac", - "0bf1291fd1c32f1a1b7dd09aa8a62def93addafd72b83390d8c08c86c9fe63ae", - "54450bcbd098a64f138fdb044590807bf9dd700aa978182f9324d428c0802376", - "04b4714e06a89bd95cdceea769fcee1d68e2e4adc45292a7f9c46cbc4160c155", - "603399533bf6cfbf4a4ab2ac3ba93e79e0f65b2b1cb6e4069e5216eff4ac28c5", - "6ecc29308c30ebbff81cfc52e1bc08fbfccdcbd1f8a7737bae9ac933ec292f44", - "a771a976180d2f5468f63acd113c12bebb48fea08c11cd1e2ec89b1d86466fb6", - "965fad66c3e17071deddc90a6cf1093550a0fad03152a8c2dc1facce45d3205c", - "f2fd1bb5943d25c19c8000144c7d538b4fa8fc2762f013c79dbfebc122257e10", - "f1b2df7c28eaec3099ea18b3007b52c762916309ee23e8b3a5d2ca2e0185fe4a", - "a87fec661481cc8b8dc6b54b39fb1711c4a2e8511c1ef2f9c54344c4578b8f19", - "54e6b5509b0206381b51c93b10232e1990372319cbe593c5fa6410a69e0d7afa", - "56d852fd51376f23efc4eab8a959c430677549dbeec0b8257e558528eae2ef54", - "563c156e0b2282f304427355544515a7b264c99979681ab00fb06e4759716144", - "47f9397aaa5d50ce8501c19c3d147066b6fb2e44d70628db71c8669c2820e70a", - "f9af7cbfbb3c5cd2c5dae648ebf7d8f627dc7eff8a7975d18f9c16cd692a0886", - "4e99ab59f8dbb691be763357acf3b572c578b54d3b80b57c48e65713f8d2eff4", - "8582ea61ec350c32fe7849a24e42e44a0e04177be45126dbc6241e6364aa1ac4", - "60d488d4ff0d6916765cab8d0b1c1e1fa7fbe5feffa2f6da29a9cb679b0da34d", - "94939e87bdc8f4a45a3bf092a4cbd8c48ff275c6ba58026a161674feeb782a88", - "e6276325b908b049537204b3a1b0f8552a86a25d21e2de6c62557e92499a30ba", - "41e315fecf74cadb08caaf67b2fee91075e8d24bc7c97bf48fcf65e515ba3f8e", - "8eacd3c7d18ce7c06fe4bb415870e936be91e8e9914f994d70e550f25835c4fc", - "4b23705cce73d4ee79b64d054dad6bba1a021c2dbce8da551b2d06f5083a1df9", - "90cc83925077c8449ffcfb09dd411df3c7c521859098c14eaf35232868a375fe", - "fd11db031d03873883e9ba131e0bf2e44f6c356a7ae9f464a294b4b4b18252eb", - "d5e99d9932cd6eb44d982471b246e4bb0eadc34c6c74a8ce9b8fabbbb4aa731d", - "4e24fdb8c96c3c8c48b6fb5228c5aafc6419b863e7fdfe05f6b86d41cdafae06", - "cde34f97a432a8bc4c8e93a1e702825be4373feff940485845fda2124b9d1705", - "2a493fbe65b99eaf0b3c6c5a29980c77ffbf8aed5a4257726d5c9294bd781ac6", - "6876a659e1143dfd031d00cf6fd37a5f900a7c249d0ab92d9eb6a3d0c529a969", - "e693cc8149dd49f5c5983563c229695cdd510ab7992d824db8704458a50ae672", - "965a5d7bedf0b9273534088c53498564f982f3592338c727d63e2f6e4c1e638e", - "381be81ec07c26450f7a3d982d03f0b0c538aca842b889da715901b55c865a5a", - "9a5cd8d36e161b20aa7fc7f2a4afb91cb8543919978ecc1c7bcba9935efa2834", - "36107ecc9c91d1463b4dd3ca18e530ccf70e5a7337e8b86f5957ca07fb659136", - "b4c11a1e97e1ad90e3239318b0b83ebca6613a0f984415d7c49f9e173efd54e7", - "9932ffc3a7e392f8a3e31b5a3e6fc5f1ae43300250890b47c8773aa703102d06", - "e080b10e476f0abf62f4785d78182f74ebe5255764540f8bdc36e398f7269140", - "58bc95bff0c34dfd263f5330e3e1e952038f9db80bdf0d23060c988a68457409", - "2e5d077917e319d56c056cf046f990a5c5ded6fa55e452e93e7558afae46e303", - "971f8c342fc32cf4acf01431bb20ab50b3c10e9589b58ecf707b4c9957f17ecf", - "3956cd63cf4e61923df7e730fd92da6471b146a112610166787b30a070e8f3bd", - "13c90619cd0f96243b906a6f622cf27b023b91156653cb19d96cc44e9dcbcf3c", - "312726474cf3b3e2108ca8e030b1834edca032bc23d3f418c3bd013f95d415f5", - "3f74185a27c44c2493eef676c4e4740dfb32631d59fd2a93da044635a4cb5462", - "04ba345d4df0d4893465866f37708e73574a87d2b4d1ce0f0fa7f0b1caab02cf", - "90ff08d5ab69bc41e79c33b9df6123d012c0dd062917d37746ed5a534641ba63", - "d192d1fcaa504c741ca2b89085fc572f197a05e6ead8dd3c71eee1749dffdfbb", - "ee6d8590f897648d4cc09b009b7f59c61431d8691c02a9ca64bb56e30c9dbbf4", - "eb3333605a12ffe582cf0a4eedad8534797649d033048793c76221e95d084e6e", - "d9869aef2cc6a3d69616279be3c9820eeb91be337e54fee2f57ad07b11710f26", - "f339ef02ec97818c47c0833f04687588b91da47e597dc3861d4305ce6bc4fbc4", - "ff3ae9c167bec11a2a15bca1c595e1f993a44138520663a6b4abaff73a41b76a", - "3e05e2bc52e060ca2a38e5d26929f48cf6ddfcdceb6a13336cc6840f73a325f6", - "bce86b2336b2cc63e1b6aa3e2c55ce31c238d01f5b16863cab6d95553f85e90e", - "844cedd64687de21437a6e30e697581bc80937bd0c9c873c964b695e4ed4237c", - "81ee6d52b203dfdde593497f119629d9bd4dd33507965649e6eb9ce437cb6689", - "ac1b6892c68e0054e5343c733f9f37099d9f62d40e0afdf6a2b2f43075f0e1af", - "a02feb32a1734a3f327612cb6e34d1cd3dba2d128c43927e41e7d7fab10aeee3", - "4d0d102f6199f0cd56f8a3559f2d6621f24703c54dfb14f82060149da63b4bec", - "3cbc0e5d3e1bf6bcd2f0a0f3d8dd6705a8348825f9c52920fcebe10ebab6764e", - "50cd982372091a741117f5d4afef036e27c74cef241d6f5459073d241ec61d4d", - "301653cee9b8cadcf4f3f36baf9ceeb2f6bd1b5ea5cd5f7084e7e2cb3315223c", - "d4422c14d4ddde55672717fbd9af9f89597804b5e516af5ae470c3a71be69664", - "c7daa4bcb5f9a1cea603aade89183af7d780aab6e9ff29f86bb9104863cf731e", - "91b713d2ffd736fa51d4c31d6a0fa65d202103c086ef3dd2a68ad31b24ca6ce3", - "b7e63af0d1b538eaebd83bfd73f0ff5e4287496b9f2d2e8b6afa90c5a9c8d2df", - "9c39b398c85078e0089638c279ac0cf605b22f148dac27bed038e2b64f9c5544", - "ddc388168802f76b1833adaa28210c3c9d29badba7cde6f55cad398ff5affd6e", - "90681962f73e7b6c362f09959bb203ad511f69c0206960335141d673b683d876", - "ef748df5e676d6b2a41dbc37d151156561af1caaa2541a0368f988b48aaa1753", - "426a359a9daeed05ded56f5467eac3b4dd4f4fd4e98f43bcc111d5e00bf82524", - "46455352d731144d86dd0c86ec53ecd7d5e701c0d0908a244c73d1ed64b9edc7", - "fe805eea14e72e100c57cacc7dfac824dc05bb79cedcc3325af81bff11738b25", - "40a11c4795f57a1612394dff6fdf64475f0d881700a415e0b1402f20667601ab", - "f8bff5e3d11b3349ca0d01b295a72b523e4a611b9f550736dca086d244467287", - "393b56cdfcd4871a5398192febf6024094bf06c96fbc7ca18385ead6fcbacd5f", - "b595a869e1677be8f23a518bd28a529843a4781e0448ad7398c8e700bc01e13d", - "e1fa62b144fdb433ced00d5de20a79ef47511cfdc96dbad47e0897a233c73c42", - "2ce34d1c8c68df9fa190902a31dc9e3c578f548b4554f2d01b7a641990bdb1a1", - "79846e42dc70fe11fe2902218f22baf73585fe285cab203bf8581be9dc7b6e12", - "227027cfd22cb0bb747f645d54cf8b0528f76d5b1e20be65fae82bbf308c4653", - "9a183701bfd06d0694c8e94ffe9cbd3eb31b80ca86b221dd4531703f77ab6119", - "e4baae93c8b340e5d23377774a537600effc4b217c7006fac32ed1cef56f4197", - "b9c6699cbe57ce978469d453e0a9ba07137858838b55d3f6c68c1e8a840d82e8", - "c30841227951d936d37a4e6ff3812ddf11ca8fb3a70623df29affa38a258ab88", - "70b94f4f925aef0f4634334535d4de56607b26aa3210883fe7e324ef4ac270cd", - "63527adc2202be68b4111145cb5327d8ee92fa236e6101f4237c8106db413fe4", - "3ad340a5db6986407d43f59c51867fb27883e38a65fef00735d8b47533728258", - "56884653341c22454530e19777499311512aedf36a4ca6b25adb343db9268e49", - "6615022b3cce66fae11220e8f027437f5b3a683a5845e8951627c19b061e665c", - "9149dab26990808fbe3b0993559cdedc74d8a53984c17e016a2a123548ffbdad", - "4c49585492e9e4d950d6d0b4679ed8d994ac8dfd587d53e09ce2ad5225c75d48", - "5c22ea690bb901b69bdbec14ddae304ed9c5e2c120468996b182dace84755b94", - "b1b1f8280e3b0cf8b37b051d138298532795a0360ccff3e034f109b522ed0c6e", - "e5328dbffaaa0e7f16757d06d90eba1418431ec413ac1e8080243d5271760050", - "049c6c46c620bc4f6ac2ac393942f5b35e941034b1face25fd7ebddb2e9ed51f", - "9a6591e5fc9066edfe5e6976d5ba6cde79453d7766142df542976c9b24c56b33", - "ca16fdc04e3ae1803c995b32f587fca7db43b69e60637f026dc4bd8bc269ecb6", - "4a1cd2198a347ac69fdd85d0cd73ef1684b46661952a87c0f54fc7d9a8447ccf", - "0a45a87d3bcfc542b4b5c55a763efa1fa326794bb405a56b0c83575b3db115dd", - "618d08501b64afe524e1acbbbb22a91c53d8cf0e65e680e97839e0e085f7b7de", - "af078b277cf075cbf94b910fc6f0633fe17027b286eddc34bd9016e6c900968e", - "e1f99d92897e3350f5562499ee6e737dd653e1f4e9ebc65e15c3f6859e8ec3a7", - "706d199c2bbbacd240b5382b5a826b9ece0c684b9fe502ca040e28806c8351a8", - "4de8b4112f824c3925a477f8b07d62e5a0c32eb42cdead8e7a5a30ddd3a9d540", - "13b62070eb7d063b06ee7d6449f442c28c3dd0c4f1e2df796b852137a70179fc", - "1cf5c7b35b15e2352a85fd2ce9047d1344f360f030ba1ab9bb51834f5c96984a", - "a2c43457862532ee1a727a5c9329cf93266d06f583c8872c724ff6281db84499", - "0048c1e05cadd73213401a260d12b3ea4199a6bade2f8a666325a6c0aa831de9", - "698b3047324f89737265f760e018242e597956a828b24cdd23f85564d3600ede", - "ca1f8eae06f976bf6a0947645bfa2caa2a4222aafc1765f8c1662990c2344ecc", - "4d8ea75c8ff3dcdfb81130ad467a7010ad9bb820836afa9d7f6b051fdc5f9679", - "c709cf7b503636bc62ba83d4ce6b0d4af6010920be500ff25737d178436de209", - "70f8a01f9899ff40748abed1238f7f245c4586610da7073a47628de843d82dc7", - "d88cead6871b4001edcfdb703d9c6247b351e771f9ed5ce4e03aaf354cc71dc7", - "361a934cf76f8befe43ca13761e8a828a835c02bda549d1a3aba6e6eea40d73a", - "d3ab7c55eb52c562a4868f90f2c08240275733e685c940efc69e53e0291f74df", - "94835f5ef958dc6c57738040f218c0aaeb39a947f608b46d7360df9b1c1ed14b", - "ae643008c5afe9faee9c26ff063257a951751a26d2b3919cb21e47b1a1a6beb4", - "307aaa398de40e1a2d55085cf8dc56c8230bce5fc5db846ece7ba37234cbe05d", - "d12984150643fa7c018acaa44e4b69864a30f24f6200772b9d488bad8b662eb6", - "bea21ae7ac812ad7039bd44abf0ac2fed91451b86e6ed5cefa75e6ee9ef18b69", - "812b290824dbf24baed3b6436b1605c5474186484c4ba91df42c607dc36c9273", - "2ab45d9e7d772f649c65d04ddcb5d851cc797c65cc75fb3c46a22e7d220f09ff", - "6f8bacf43f179e6d7be02a133786b9c15dcac16390a262679dcfe06312c13408", - "efacefc93c4b3b645801bd9d4c3d21a16514e8ec1209e84f20761e87e4a31799", - "d9127ab7789964e73a70fe8ea977deb4badeda26f21cd2a439b47e6c2878e26e", - "5e1bbc46d6c70ba5a45822dbe790131fdf24ce133736e35722930504259b7af2", - "dcadd6ef34f1e25a02833bb54d0299d822ca8c8fc04013194777f39724bbac64", - "26f9b511155e3147b910abdc9cf833779c25d7237ece9b632febb32ba8cd89df", - "13c96199ffc572973a9d0cbe2dcc19958ba4eb9228149102e9cafee41b08e6aa", - "b29d41ff9d5d06dbe3424c3cc106b670d5042f739ea69302e21b986700c1f32d", - "ba4efd939c4eb1c7382cd4127ffb1e0a338969a235565d01554ea7306be43288", - "f72bc44abfdb1f72b3e036199d86916b087e975feb5e168c9cd2014cd36dfc39", - "d04fc8e4cadc75b2e2aa254bf559c7bc712a00e47e6546ee29a3052810f4b5bc", - "629e342f706ab684a06a940152725f9e9187ca959cefdc01a72e1a37fa1f2087", - "53adcacac3a378cc33c0b9e6be356d9b15bb5ab2d50c1d6b64c2382b12bd3893", - "055097a2359402bbe8342408aaa075bf1ec86dff4ea97aa90806ef6e2bb4dbe9", - "38c01224691f01c586b370be2a316c77630fd5bce888183fd814c19e0467fd1e", - "b0b78bbfce8c1a14fba5d353e1396fa38e4b25940b14ed1b7269991fd7993e5a", - "7fc460b9ea523c38b5214fb2d12f304fe27132e56edfd7a5f2547182c5589df7", - "70fc5cd04642e9f2ff409fc6c530179926a1457e1211db46515499b7f06acf06", - "3e0044190ec73ca33ecba8500da09b40174299c7d319efd18ef74aed1c47ad6a", - "19bd91f5ee349bfe7a52baabd8278beff2347b882c42cec77dc03d7a8513ec95", - "547e50b18a9567a980ad157c504b6c627a6200746ffb21e59ab1d7681492c97f", - "e642176ab6375c64fb401f6f987b6b696d0a189fc71c1b8c55433be0251fce28", - "10338166e80661cae49f9a9f2f3fb21718c5885d2f7808f7d8219f38332da7f0", - "2c3b6b02de9980b475088f972623cf2d12e4e19bb1069801ff2f24fbd50a8089", - "69dbb93f999caa5a397957dc177feda241e514158bc44cd5f2b3430b20bdf0d7", - "40c92469d547cd2317b4da82499d15175f989f9e01091ed83287cfa6006e3679", - "a173fb1682addf6bbf20ee28ee31e73fe70db3061a14e6edcfcb537894bff81b", - "226c2a0d018279586346fd7c1420e1327beabe84bfedd0e0571f939493a0106b", - "c355a4c376c0fc3e1271f2492f06fce8df28492a156f7384640846b080d2b93b", - "2c24e1acc67b4b8f3a05fa796584c40e3b47132bc8c4abb1ff06e07278caefba", - "fcdaefe0e408e7f723f93f436698aad92fd2eb6a58bffec3dc17d3cd335fd81c", - "47547a2dd37f7337b2b857b37b7efe8f41eff0f630f260cffef55cb2c3070d3b", - "0fbbafc149869c4524a2f93b3b4a0c39f244c575f223f96ad905b2c21c56465d", - "10874e1cc17f6353b3c98346f4d8fdb31e0bba7fe35b69be2ffb7e9f3848c9c1", - "672a4a8e7cafd0236089602c7a9a5884074d8fcbdff9cf04ab2bee90cab731a0", - "cc90aaa60b3ba38bfa09b71e6754f2dcfc74fe9cad15fc79129cbad374ae7d16", - "5e389996a5a3eb7c416aa71f60c549b09c667374cee61ad37e87aeb0c4aeec3a", - "fe6e789bd850ee6876d721ec68a9a0471dcaf1da5f2eff8afbf23f3cc3c33ef4", - "ed37e6a919778227924df243612ec856c0a6cdacc464a29e7f6879d5e7fb9c12", - "44009b0b5aae77e3e3314f6b3144cc8ec5d286dda8c7cf8ed1480201310f3a79", - "7cec6d4c075508709d47fdde0ca3ddec87aa242bc431dd1f765fdccaf86698be", - "20b3b07d1a81d6362976c9cb46d5cf12f0786300c8b60f6ae8b5bafe5707db6c", - "fb41639a4a317428ad034cc35c772862fd897d17209bd9df16f58c25751ead2e", - "467a8090cd97c4a3ef830244eb8b4d42e5915efea4fe699dde89cd4b1c8d3425", - "d04a8e14e39fb3ec29164fb9fa36a51cb075c2e313b2edffb73e2df4c55d3573", - "f03f190846402f23b5f12aceef44c798d44cb279aa12f4564a0430376ba360b6", - "4f83ba7b5c7ab703bfbf21043b0f60345bcae3dfb3332f5aec8ceeaf8fc5f8c2", - "555c36d2f41b8b9dfc4089433f329f401296bf08af87354349f09a9ac8a17b0c", - "eebc3e4509117a770e9ee0751b1edd1356d7e92f5f666c16e43f9ec59f5b8603", - "5cdaa04f02df4952d278bd89bcb30a3619f7c1b1fdd96256c646cdce63a554c5", - "d6e3026e8bc243d04570d88898fa4fefb358e15901318bc13df9afb02bcbe42b", - "12b294f8507892955891196abb8d89268576ab4d4b3508697c14ef84c2b83fcb", - "f077a9f26b276bc8ecb2609900da6c09a2cf3b3def7287e77965b6101e01f692", - "eac06c5505cbcb04008f2744ddf4488fa058b77cf0c99ead3d79c500f7049184", - "922d645593bb483839ec1c7a5d7ae903889acec1c9d128c2f544a1a0d0bc7bc0", - "e96e5173f1565d99054476e02b636526a5ccf6fd8d8316b01e1de989a3745224", - "29b48b05a2a5797b8fa8170428983f519d2cd3abfd6cf426feb41db2cfc39d00", - "c4bc1be68eb701a76dca9840215a7a46a7641a8a4c3b505980c97908eb051159", - "78c1c2a79b662839ba3d852503d12ceab51382da9323e260222f1b09449c3a01", - "989ad973050d8edb6d934e098772541ede64c87966df33382545eada235d0c8e", - "e09693a6dbb2c534a8ccd8adef8e6a997cb40b7c7928ba7b7cc3c0c1b4f62e5b", - "f6086ae762919ea4449d50da280c0b9d21cd351134845ac6861b45d6f691990e", - "adea4bdf9fb20ffba4381b7158374508c328574448da3fd7a5fe1ace88442f76", - "91434f6f663de40461f3a9dfa4a113a413649e9652aaa47c144175820454d3b8", - "d691bd1a6a5f5a7c28689c17152bb582815d5464db1d2e387e53676157395adc", - "6fff77840a5da5c0709669541d67738e63c8641d82a2828556023b93a999e75d", - "458d176aaf574715072f76c3ac5dc4fe4696807f1659197b807b4794ba69c255", - "01f12c957a5cc439ddddf014a3a3ab95f0ef8f304238c7bdc6b61eb9f7745d56", - "41ff038c9a7b3c6dc448ea0aa2a13f3b06b33e63206c1658fbee9bd3662bd1cf", - "0070f040a957d18f23b059c308827bc373b1c0b749b853195f85347023819d17", - "3a5333b864363dd532c9297e1edbe48d429282a101be09b641af6caff4757470", - "1744049f84c214db9d609369b451336d81f5b21e3409b239972a355bc814961c", - "df48edc52feadf2936779c65b64a98512841cb2f47a7ffc828a77fbcbb2da43c", - "92949335795706ebed6b0d40344aa39cb6cf290140c09e68dcff9d41e273dd3a", - "740540c2f705d7a8f94b29c21d2a6370fe4dec3ad6d238cf6529471a4e9c387a", - "0cddd4dcd05bf91ec2f851470ef1937b7bbbe8fb7acb3f295aff4af350ac222a", - "459433cd02a3f57d795b78afb2a0b6514c096aea0bf2d33b36afb490c3ff0b74", - "4cf706dc5017bbbf82dbb4f11a3be482e5e1cdfbb6514572637715edf91b9a95", - "519dd47228d3bfd9b8981d010533889e5f894eccca6d44e1969a51dc8826fa6b", - "f0078a25018c9e4e556f882401bf6e474b633e162780fd44097d7d7176467e95", - "888e5d6a8931aac2bc61c79fb44e49814275d81c6598b080f6dd600ffe2e2563", - "211243d9c5a01593cd987685977680a2972f2f0bfc20c7de4d5e5b1fe409b9ca", - "bdb14ee97a3f0ac489f4ab8a54ebd2bb420abd028316f4aa8267181f82c68875", - "d6456b91d9542f346e4f997af0ea5e6962d3864024c09829c2edf03c31a91e01", - "d3274382c5aa26a717b41ab51b0a5597fc70890c80b68e498101564de01aa89d", - "b89b8b5439e52d28696dafb7db3a9e3ffc74f614432bf833fb9fb01c561caaf6", - "0f9e73cf7b76bb5fa70931c1510756fe5c520c29e88ce2307cf482636ab6b016", - "8e9c40b96c6a6e227bb454984af048a4c1450429a073418a87a9f11b931dbe92", - "639d9730f5b46cd95c48bcf212a6221cc12789d90855269083decb66d9d02894", - "225ba4ab64e2262690bbaa54c6e3f7e531f369f9a2e3594e633a8777297000e1", - "ca47ec1206d113afdde9bb2e967b94eeb78f7dad140a7269dadb5574722e7605", - "8451bc093715e8c526a8b3f7f4e9152a3d54cf9cc9933c4cb4f5886bb79c269b", - "bebe57906e9b0d6e260205e0a7501fa84d1df38e7999cfcafa2f9d923f2e1213", - "2a6fab1f9f9ff464eb046a0fc51e94df5657a19cb3e3342f527cf88c92ebf550", - "f131c4f9c6069c479c45666b402ab1b0b25a6f2ddce7b47fc87948002996d515", - "2c845f80782b33860687ae4702dce6affb78f512f23d49021a50281ad73c5234", - "ded420cc09fc6b9c11c1438ba936b706df727d5d8861299d84f509dbb1cba55c", - "3734224ba02c3b5c07520a5147c97364a7268cf40c0cf91a897d0fac3c6b6e59", - "e5f86b74a8e4a494c65efd53b34f79a310d0d8b91919eff88094769c7e7b0338", - "9542e630d9a5f85adb69dfb0782001cfaa0f09dacecca5038e1516ec8d6aa399", - "767b698c4caef1e09081ab55f0715f9fe243b57a9d3d254a3b1afb610d56e950", - "443e153c193ccd28f580c9e28080ec82fc6617e6fe1e782f64c083e96f841133", - "fed35de89acedcff6cf5a8992b920760707c0d267c8a608b946f031d00b030ea", - "f22f3136d7de09ca677565a3e00e6afd537160c3b7e2ec12d80034f85604ca6d", - "859bb4cd36ef4bb1ccf418c36365c1d8b05ac283068886665685d30c5da66ed2", - "45bb8a25b05e3aefd44caecfb30ae6ef8f19964e324c24954a7db9612ae548ff", - "0f8c847e06d6fbb0f0b207bf2e88549ef08ecf7be24797d4e2de51adbe60c863", - "502de0b419c62188f00a024fb5b0d8fa4fa08002e1986a978cf34952422360a5", - "47efecfa66539969818f75b1a3572ad7c3ab4e45244737962375d8b9eccb5f7c", - "00026e0c9edf84b1d8ea7bc3655969965c90bfc8d522fe07cb2162b4c1bcd6f9", - "06804add13a784e69274bbedf208a3d949a881cfaf70808b04ab7e462ad6cfd4", - "0ff686ddcca3c8ad8a5896139ed86a20d79a06daf0ebe4709e99ee7595ffa844", - "1114035dd2949b9defd70dfc380d22ed245db1a789154ce87294753edab18572", - "4a0f95a821b1d9c75d8d07adc59ef7dc9d01c07037f8da27ed409702db926104", - "a72c8fa06fda8f8d7d2293e0bb06cd051aadbe31a81020736e80359de5d99a29", - "3830f90755ebb5a62435d7f68a01d584509cf5eba6147d813c37c2508145e3e1", - "2a7f2f857d8619bdc53f3420d9006ccb43e8e25e5838b2a107381162ce58ab02", - "513c9be69b2013e077dc3a2539a2c34feb0dba92b02dd260ac745639600bd879", - "99f2aa50a674ba11aad97b27d65e4c8d755d0874974b3dad760bdb0b49d891e0", - "e6e480a3d96c666bb4e689d9ebc286ff5fa2248e8cd290043e711ac6e604665e", - "bf3268b6c2388e23589f1ec227dfb9272a026b0eef6b464a37c211fadbaa3786", - "4c8d5f93de13c803bf8052d42d7711f70dd4da3aac502c271147b4d9bc33b9cf", - "547ff4c425d04805728a9f446ce63cb9434a80051e74d89686ac4692dc1f3a4f", - "34fb3c3b556b0321c63b6938f6702c9dfa44e58c822e02fa094293b05720e892", - "bda0800ab7f6722825e65cd982f74898e9e9b7e5a462f4a17825b3f0bbfa2b41", - "e6881664e88abec8d87274108b40d84e49fdf00ee5e89dd1002206454e69f4e3", - "2e648974a921bb6d96750f3d12ed26534eba326fa5df39658beb098a25841d0c", - "3ff59fe47200fe103dd63405c26844a80d77fd655909cea4bc97bce43ee33ed1", - "eaacaa6943d526f31b448ed6afe488aebba33e8b31ca0471e11b2eb8c0fa5c91", - "1539e057bc36c649473e2524b855d3000261dfdba35e35d72dbb783e23dbf86f", - "887d4fd568bb0f27b63f6d5cb47aadb6a3a16c5c1fa844baa3fd04f3da7ba18b", - "9898ae61d70f0c241d9db3f4d7413e012caef46c7c8c23eb76d62605178f992e", - "10353e4c3315b9078b6bcc7aa249a822c88857a6aeea4bcf882f8320e1a4a56f", - "111dab9a54f1703aae422aa2ebd824e48b8ee7aea5aa8a01d057e3546f79130d", - "f579cf53ddce7232b2cc57a1c19bc0a019d28343f49f26f5c83b6a88510a011d", - "46ec375672806500fe609ece061f09369fc3c24ac64815a19c2acbdcc13d48b3", - "d1c14c349bd0e7256e0ca12faae3b2c5b6bdd4526db758091cc3302323bedb93", - "8fc1960fbfcd7fc04df3dc430c1a4e0c9b4030a52e30109777af468f67ef613e", - "91aa1fb015570ba6ac2ea642cac2625ed97902caa47ced05a69085c3ad33533b", - "6c686eb11b1a9326982451427ba9ca0c0a828dfc724f040800b382aec8fb54c6", - "aa1131a0754235ff150e58bb686a33b10bdb5de78bc5139cecf827bc5c48a700", - "98502099097d1ab1c11686ad45570e7205549833a632ec4ed525440b06158676", - "a2d663b8800cff44092993c0f19468f1271e0592d8dbffbe4e5d454fa483836f", - "99a60d07ac235fbc890a8b34a45ed8dbacf0e971200b9073510dfbe2271c3ed7", - "92c971cb47cb44767ca551953c8fbb05fb81a16802efe8087f33912d5b4ed18f", - "e65aa03cd6f6cdcfc998804104ba8b7f7327f8e23ec7ee2e7283491555983cb2", - "1342be710cffb0b94495d9f953381b8e5dc75f639255e46d11e414979e0ba2c5", - "cb840e8ed2d16093eb38f40241ca0df0e2a1a048e1f293a7f21e8c1b9374f607", - "ba6523251b8bbd131bf457b559212adb160e830fc39fd6804d136351588063a2", - "06544de6bb3a12156b7ae7e341d3bfca68e16e6835eb97c2c4b318ceaf2367b7", - "f85b4832dc87810d7a7af457595050a13aaf125b7a08ec5bd6d4e08990027cb2", - "c0e6c893d9c75a176698b2e3a4c678f2f913fc7b759c861a9bf3d529a9b48fbe", - "cba1e959c6f40e5f6952aaaa1b3cf06df3d9d04a8b4d0d28d9eec5541bde7118", - "e5c3a6776e76429121fb825f4e2cd0255ee2ac76238ce3d74a28eda298483ecb", - "2c074fac3221ca8a0cc70396ead5535738286b45e8e5766bb3b47f0cf8a983c6", - "6f26f4da01354677daeaece49c08e24b6f2f50be044a235cf5c30be76b181aea", - "729ee39e230a2250d6b56ca34e64aa8fb9ce0693d20fe274be1fef3134b5f61e", - "6a05783009dbf12ade994e9d77c71f675a138f44cd1c453f96fdaba9397a3076", - "02775b8768c5f83cefaca84731610e82ea580497a17c5636a5f3f4cec6b7de65", - "4202b18c7d030da4231e2358ee97e56383cd159d9923e287b387115eef98ce29", - "a65d56743e7556a099eedd617a57213742fd0a36c529f626fd2d432ea441f7c7", - "169dfec0c88201a818496d784556d24c31bb2bd53813df2159a04857a4e8cd19", - "3c53052ce60d20a854faa1495ffbfd87e6b130534bf2585c061967434ce3dc67", - "b21fcd5f8e50e57f8ca78a5a51140b13198f0da59ad3f6213039e79bc3768e0e", - "878542fb0c69fea080450bbb4afb514d22aae564328431f234d0fbcc5fd12849", - "545f397729daef7022ee7e83da387703e28e7083245396c53f814ba417c3e640", - "a95560de0f703a1db48daff6023462dbb828f6ba85105daa3f3ce3ad0013c7f9", - "e74f3a1ee26b161350bf4824afd9167e38b5367bde683421752b3b5d6c5d18ce", - "ce3b83bc44e60da2639fa55843ef74b37545ffb3af5f9032a1bce22b4612c283", - "a781c22724f013cd69582c6cb6badb3c7bee13e6fb6dd742593e68bfb97a1f6c", - "d87d488d38f45052758b5304f3d3abdbc8e8810bf6068bb70a01a41cc63c3c09", - "04c4554f8c26269b10bedcc7441c53f8d41d874154883ad51508668db2722ccd", - "0d0394ffd8b8e735603c78ebae55f7415144667df02ee6f2324b5dae686efd28", - "ee52291b1cd80e0cec1264be271537ca64263e758bd80f483299e095ab4ab19b", - "69684d1ada93197068f8967667b9b107588bf447d5f926fe368e281157b2c06d", - "7493bcd5dc8202e5cd2de372c670a89fd9a56645240a83b293d6864e15bd1182", - "726bc9de0ecb14dde6391ce81a35144e152e50b70e50f600d582be439e09cfe4", - "3efdf3047542465e949965729d58e3f4ccf37c3f5ec7f9ecb002ad91c6d4485f", - "fbced11823d43445a6ddd9eade4d71d3ce8845152c735639cb042352c3b3cc1a", - "3f5bafaa9b27bc24c649523471279720515be11095138629d30a66508d766335", - "477024c604b7996cf3a845deb9713535590bda618f138cec3c42b35e0517e745", - "2bfdc3752e71bdddfdb48835361ade972ecdb39b9657d6ec46e4ea9016c3ca74", - "8e38d7736d49c067f6a397a4f03a636fe80b54ae06525169e52da01875fe7ccf", - "0ff46acb37f47e03baf55727373de96207ae4287f38366ef505584120ec16a32", - "4f994883b6d174bf8f4658edbf729015071f81ed2930a65f498cca81e7e3bf3c", - "fc023d130bd39206e28ae717b2445f8131ad5927884f3fc806f111a85f02f0eb", - "d8902a7c9dcae6be4b198eaa73c1cc4899420a5f0ea774897270dc0bda770a37", - "9ec5516fa2307c4cc1075c538cc2ddd58049a390d6c06a2fc6733f9c06acc94a", - "196656050df3501977d13253d51351090c3821cf17c79a432845baffdbcaeded", - "594bfc224adbff89aaff3534b34498ec130bba890b3624d5ba754f44127096c1", - "fa2a550471f4d1ce99e911620cb29f2f34daef89319b61dd8e0b5f5ab8264304", - "c50984bff285e1578c8cbcfa89aeeb5c99271fce24487eb912f25d66dc8887bd", - "076d1ea69cb935eb3e301591b47c3961c186ccdec9b6d0ecdf4863b49724a782", - "c3c4c8cbcbf88adf137b644a743205bfc0c43d2e71544cd5122c66dd3f9fde35", - "3da8f7632cea9da05578628b9a20e9f9b517ffadcbffbc592d2195f199d3944d", - "7ea3be7554272e15be3ea2c918edaef22ce4bd014273ad7f66f91d9b103d5710", - "2227547c21454bd64ad71a39b3d712c8ed2dad71de14eaeb4dc02f7bb412fd34", - "6cce1f0ead1fd476fd3efad1334ed02c5e98c7f96d81c7792b810a95df9912ba", - "87e48bd7d73da8d5b88887caaa1b5025f95d928d70d8fc5cf8e124f3e40a1720", - "70670568f6fa8efc501b057c6f5cfae51e2b361e4f7da300781ec0c0300e8ce8", - "9c988386180b1b819bb6194cd3a7b058ca861cc59305dad57989b1a9e5047ebd", - "3af05302b127dd1cc514e4332aa29def34f962f30218f2a6172a0c02f45cb6db", - "169863308f62bbf8ab023217ed54d7144a541707395062dc55af54d22120ee06", - "8b57be92c0cf7904bdd84453223509559c6b7506e09c1a480addadaebe1b8969", - "984b44c92646b8c4f470e50b7fd88f8329c24dd5024b000bb9d6fb1ca7b0e694", - "adc9cca9df4e25855016101fb450c7e3afe5d2a5abe5bde273a057e7db1941d4", - "564391d7759a65174308ecac2c6c2ec9d72189950b36bd27a31a68cf56d343ae", - "0252af05294ed231e4b98025e773ea57f692d71c76524c6a479fce90770ef511", - "43c368d10e46b81ae4248c6c66dceb63687c365a31748cb104c5f588469111f2", - "2b3ad6a5877d5a86ad640084d2161c9b43aa7573dacdbe9286c93ceebc9ec365", - "8dd97a54f0af2c310c5542f71264ad4e6058a97d660c24a193f3ba5c116b3ad8", - "56d8176d987f39df74c78f91b67e5d53a5841eb82f55b92d1de74ad5558fef33", - "16a9715d83383457f5cd0a6d6dfb6a9ba4d0221409dca7f1ed74866aa763a749", - "bccb4d535b8517b98106cd4fcab5b8e22656ef9977b4e6c8b4eb8865affd3fe1", - "7bc28e1bbd48f109258853c0cb98c4eb493676604122de8932b16fbb6db350a8", - "6da3f1432ecea5466588a90e6fe06d279083cea86e3f456e80cc5092661098c4", - "9960874c694f981049cc6dc0cdd696d79e48a962eff3126c7d790acf6002a55f", - "444e4edc0ca7db6341fd4d135a2bc7567663b1b501639ed80dba36f9574db3d9", - "f109ea074b7867bb665a2c52611ab415a9fc2cbe4715ddf4ec38bc4bf04a49cc", - "1431b84393834b4d725f8580061b86217d9ed2cb58914ef9e1e9cd2668345697", - "5d8d214f66e6da0e5b04ff07a339250e0fb3eb326e730da77d50b5263973f4de", - "2c4f865360ceec53997647cf9ad47ab15affdf4ccab3f56a75b26db7a7382959", - "79bcf61235d159d8e9848b72fa989192eba770658ffc3ea4b545eb8d8057569a", - "9fceb966cc9342feea0bd393e706ca009281cc3861650388b6470f483c23b763", - "e6797c15a24144705bb937ddc0a5810907a3d455cdf61eb2812245045b381cb8", - "30a9dafa2b72368b303a5d054fef9ecf753d3e9de40cc4bf90c98b317c6d2c45", - "f8e6298d8b4f8962ff07407d08519fca4e5cd3d75f42340ecfa7f03c84e5cb9e", - "3eefd462ae8c1b58acdd0d76361f5d3d6a0d8e79dc29e67afe8b46dbc2c9abda", - "9b132a6d5f777842681dc2f8d9cee7e054abdbfc960e7ab4c3de8e866135ae67", - "0ec14434fd81f704cae34042b7b60a55cbbce3885d4c5c3370a447f11b1de59a", - "895d670dc24c05847343548de6ca358387fcb88dd7656bb6b985f7763dc6984c", - "8fdeb1dcd7cc0e22568ea5918596b87fa0aa4d50f219d9f64c53434b3652e30e", - "66945716bd1bee0b492c4c4ac017054a29792129c00402a71176cebef68a214b", - "5d255e1056041c48250563e23c71ead72581358ac9ad1c805188b870623ee13d", - "6840081b15eca0133d9dd46130c319d4fb65c8fdb8823f33ffe58024d2e7b4a6", - "eceda80f28822bb11057081d15144bee3d51993e9ba0088371756f609eee4b7f", - "851a6d1cfc79c926b8a2f49e1ca4ae5430110b02ad205a718eebeb53d521827b", - "09f440b8201eb0b98ce6d77f92695dfb0446c484e2833d264dd9b09a08e2ad79", - "7318e72d6df2e60182e4d6bbbaa096ff8927803a8d2c38c4603cd462de8913c3", - "8a4ecd270ce28996bcf18a2ef42c91168e503918b46a3b7cfc171107fce56efc", - "12174acd3936b9f92e3d7e028f91835602bc060c0d22b66a1843a22cda0c866f", - "a8ca5532c4b5f4ac06b38a0d287eb61c960fefd9243aa7507aea3dc5d1a61ba7", - "0fa1f791911ba9f40a377801e4bbddbe3668192abc571e5573425101b39e15b3", - "1cdb225b5cdf5c877a295df033659294fc6666a917c5707d275a227252dacf2c", - "9d434d0b38afbae3976e72b29bb565c696eb14a39e6fbd81bcb7a030754f8048", - "e437b8f682b135290f1df1c02917304873d4aab825a1dabbf039853644a3f22e", - "ea8649cf8ec52662e39282987216a81bb52c98dad83df6e840b9540c1e33b8e7", - "be06fb0dd7fdd73849d04a485f580f26084d1aaeb023f109ed3a685ba1ac5d35", - "dd45d6d022cae15c022842b4c5da550d89328d8f8b6ac0b3d4f0692a8840a53c", - "a2105839cc75a85263f416ac6940bc3d7d7ab64b5410ad13388f20b9ba73ecca", - "91af46695e4884f372d60b43089c0243766e9c71b225262b49a40855fe008d31", - "c2da06164059d3b4348d5d26603f761fa7260283208c69d4aee2890b1ff1e982", - "89bce1e89bb13d23265ad35a4475a964ba11ca29765d31b668f17f16ea1d7db8", - "972131730ad9ed0b507b0025b6eca4463673d8c6361b40da4bd31976772a2721", - "1d54db9c486b232519201c6adde6f6ca1392bced055c5444c19f0696f820b637", - "b6097ec21dce8514f30badd2c12f9ab61990a17810d642f373df58397108e0bc", - "83fe509cbd399e1d565fa3a2d2bed55cbefece01c8f0de62a6ef98a388c18faf", - "9dd3df584d17eb274d9c73c2fb7ecaa8b31f846490857e6577c48680e7e76295", - "9beb9d7de74061380e21e6c057777d1acdc45850d26abf68442edd22797be1c2", - "bdfb25bdf62037c32734bd8fe1e4d517270643d3a7214e519a4c971c47c6e996", - "79a355b8aceffb87ccd8a10e6832ca880b132cfb62edafc8193e755ca5110a8b", - "445d568fd5560f439bf3e4ca9d27accd56643251682bf04d39843c294a1e93b7", - "5c9980c2704b3210e895b2305988eb19ef7669443af323992406661d25b2b115", - "33dc64b79dac9cb4f18e40967bd1aacf3630e19525fdbe9ccd805b62e9f907cb", - "271eec16d44a95fca0375cc7760af16197c9cfd744ba2a9a02af79372eecd902", - "092a52072aa0c2fb1d1e938d91531eb7b85322060197b383e4c89b799282ee11", - "3a0e79a5e191da38d7eb524d107432a647cd44e0768f67b06f1a7e857a9849d5", - "5af01600cfd3d7ea7caf38c6747aee83880b11aab29d83fbdc6b5b94ca7e6a7e", - "1c22cd524114ebc90467288de95c466580083284aa5d0f5edf8ebf73b89914cf", - "48f2e8ec70d05bf265851ae5e53161a5abfb0dbcde200b6d52ae462c1ff77a2c", - "f2c5e6b3f4f1549933db5b71a79ce69b75e86fa670cd172efbda76ba88cb71b3", - "23f0490e323d9f3e9be9c744ac218ce049883ceea942087f3a40a7b451acf12e", - "e6c1a2d28bd36af1ad440f9bc161cce29a427f0e426b0ef38799b49a12337432", - "de08fde37a26a25d8e536949d42dba4d494d4dc232751ecedea437906f1d4da0", - "3f94def01d96c849f56ebb9c8ed6cafaa046e53ca4b1e5ddc25e07dcc9b28c5c", - "097db13abb9ee2c3613fff693d48c4b3b65cd21f272d7064b1972200e29d1aaf", - "003c2f04d24d91e7d8da88f67ef3196276b7e1db0c372299d805ff50196af576", - "e23de5057c10e0222b91fb7fadb4e73c1785653d56dfeec687ffa209a5cc7cf7", - "c97cb57fa8165e62e43206f266be2e170299d5fcf698b483762c92bcc58427bd", - "2d2aa4a1fbab5aefa54435c73b1514cf63775acfa0f3f7e6217ce7a0634e4711", - "0b4ca54bc63bb8ee8019fcb36b0edca0b9c1ed92c70588293c994a5c4a1490d0", - "58929079ae7150c4cb43d1ffba3f2d67a4db6540813b1659e420992832eb9173", - "7551a57fc0f8eaa123d492dbd16d0c38dbda357ec5bf910bb33fd33829e31034", - "3b81cee51e161a17aa8a015c742496d56bd696ef0be9d20850039c4441fc1b75", - "ab6c02277101f40d5193fc6f5dac01124ec27284e02cc4e8bbc53dc585b0af3f", - "123e1bf52869aa1180fe84ad10ae711c5055c2b473559f1eb83d07ab64b61254", - "9b1f87f08a91634ba2bfc2ebb7ccc697ceacde49dacedc07737f8c6e47d6266e", - "c47378244d0444bebf1036213a45e50b6c00378fce721f3f1cce4f8f811a8b47", - "f24e6fbf3221a8a1f6d3e8dbc35573dcd96ff78813de1ec1496e5a017e6b22aa", - "a4d6a5026c668fa88caa8043f2d9ac0fa68ef4ecea4fc21f1d559718d82c5a36", - "4843b9b4ef804967feb28780007da85d1a5af1cac7748724d6bd5b72a638cb81", - "e4bc164064ea750a10210fba0ea9e471434f6724da217590f74f4fc2db1a29f8", - "c4695d7a55b95bf504cdab50c7ba97556753ebd498ad60f02ad319924f518d8b", - "fbadbcb4db1887a292980655bde9265a7248b3a5742528363a34a4c3d835657f", - "17f1f98e355b35eb90c6d15431215f07a1c1259fdb2fffbca7ea1ccf714db70c", - "92951e947bdd2d5d093a8bfc0c0dafd86b3de4f0ed685d18d3f23c089f144db3", - "aacf212cc33790586df23683d7a8527da360633eb4c6afff2a07ef339b9f4574", - "87ac1f2f223b4352692d47906ae1a8bcc45b84539ccba9ab1caf0bb4def06f56", - "ce4e570de691ae8aca1d3e0929452f7f088784e42d0db9c260af7d0aa71db72a", - "1f21b1cdd60f15171fc99ae6b2e3a912ca5e61689d456ff011b25fba6086ed9f", - "0281d4c7fb9e231390af9f769ed15074f366ea8ec95671afbff51f50f36d37ef", - "c9ed691987bd807ad6d5e1da91170695766cab137177e70d320048cd658c3cce", - "60c1d75c88a02bf4319ab546c0532b64a8ae0d1b87c2b2b097df78e39b9fc103", - "4a83a192edd0abf55b432b5c7ef89c28a019111809c6f6e3a89e83042b2e02e2", - "d4bde6c7b6e21048a67b493dd37cce1783eacc562807fb2d6c69a892da055305", - "34e88a1de108464b8717dbee0fe23587692f4c792d8ab1890ce0c1be7fe9fb22", - "26730a60bdd5baab332adc392281d6457194e5b98d48a6d7eff3aafa6b8ddb9e", - "4ee83d12ba743de208a5b709667dd4e9e87adb5355e4e9ed1f0302879199c218", - "c451a76970da36180b87a812b6ac82e6210c7861a0c9a5512a0ccb23be37bc12", - "4350325aa1ff2b606d0ef438c3361b1191b1543960313430b289df8005fbcdf0", - "38b60045e64e7ac02d1446fa47458ef2f2eb69b9577cb99e366b60f3a7048e33", - "de5787308e0abf857060f97154c7e7b48182062ad34c514a87f361631fff1450", - "a4171b746d7d01cbbda1d608addf4c79003b0e6455fc21bcecb4d1a9799c193e", - "7b1c1d7b38f30ef6075f7fae380567f41f0fbb38d08d40c00475a61e60f7ede9", - "4852d54ec1ca54b9e67e86f1aec394b9bd72f9e36a42bffabe5f16f38ff58ff4", - "9e327319698282fe0650674c22a5e88885ef957d5eb010c4c8f395a377ce4736", - "8d4d4c54ad4d0f59bb6a8ccc77c27b6654c7d5525ed8b5b45373dc3dfa75880f", - "d62fbd3235831723e1243619dd48a2fcbd39ad95d0e7bc768999cf1dd65dc749", - "64cc540be4fdcb95e1eb006189841488e9dd7251b94bc6cc7cd720ab222689c8", - "e423e3f5c72b8c60c0230b92cc68396ac84e78064ca79929d7f1c4e16c5d3864", - "ce25119097111e2d60d577889460007e9f95a665dc50b24bc73c363a3352895a", - "f350d3aa7461d2a0b586c8a3a8139b8b0e1b0a9dcfd521f411614c6b14754af0", - "c958622333e53083d039d5b1610d78ff19b2c334eeeab8716471dd505a0032ee", - "60ce4d1d3747a991e7e66ff7d56f5d192db2be18a39c0d5af03add33c3a38acb", - "4f39aad1f414c6764e1da58da2007d018bc19e22bcda3bbe83f75b4431979a41", - "4661df9e48b6f19db3aeb646e472ca8f589c862aa913e9d8c6c8138dc9f2779b", - "ea4a23eb55e9d5110d3ae6635bd749fca443fd0e53729054d4a220b09daf4263", - "4f1663bdec36635bd668a16a372f48481cf446bdce6bdfd7d431581b2671b821", - "f6f24be8063c4ba3b1043659a27503cd8667b70db622def12583badbb7b54283", - "70ae4029f0d4ebb48bfc46da24ffdae386f1b7a0437f44ed5be3d1c8b34eb956", - "16ba17bd4e120645933353349d65fa4166844b5880f9e62b3761ae46d14f6e06", - "824bac4e6c1e722a14332f148e20e9cf12487afe122f635e2657061c512c689e", - "619f1703dc9d273ae262e6ea6d4e44f7d91cf7a28746c76df21a46690cc92f5c", - "a01c17792eecae1b59cf441c58fde4b7bc70d12d3036a01b4a771b32797e6d30", - "02b370aae0f794b0dcbcaa42a9de61c6be517615b206e0b51c6dd7d262c8f457", - "efa1d79a35657a1c92542c50475cca539afb046ce7548c9354c78f82be3b0963", - "57a5d5042076ab5b2191ebff61c8d98653512d02a0a282d0e587285f60c84744", - "bccc32ca894d6a29f634864520acf9c5516c1de1ab7e48e8a7697078510347a3", - "6fde3c9a3354648d94ca0e0ed721a144a72f68575b5f4b5e3c2e34b8f1dfed05", - "ad209626556739ffcd8dfcf189cd9422d00a7f6e3261fd969366d6b270c67702", - "9222e584b40d6e82db5118ea2d1d261cd2979408bb10434775ac21a2fb204dba", - "fe79e747edba89babfb29cdcad7207ea035478a327d929ea9abddf63cdc89333", - "4a41a8f815c24c8317bd1da50a914a5c1ad36609865864ea582bef2c2cd4ba80", - "4c5843529cd61d4b33d33a94a21e37549dfed928f97a35f684b2efa12e0dea48", - "ba0bcb30ec2037fb91c4594a98e6271849aa62dc3fb5c0c94c353fb7423351a7", - "eb37bc2bfe8c90733e5f5f7ff99f4d1d2daa94eb7c6171e81238ac02283de3d4", - "6458732c2883abb850503ec87b191329577f2da1c593c26bc90c9494d1931b2c", - "49de0764088cb0e19c640ffb0fe238ae8a9287107a894070275a03626bbf637c", - "2b668e4aeeafc86698d8aa53f5b6888540c0581b32a880b15e05b9fb6090058f", - "376c74576fab9d88a157f125412e25878b6a7f7499fbf021e27426c8eea734ba", - "fa0c5c8f8d722b036f5c81d9a168e8df8a1d1a28bcbb3fd0b49378768c40633c", - "3b8ffb856063c5f0504ef0c0994e7210c9c062a92b3e4ac61deb1039af5e9fe1", - "adb9203a73736bf3d67fd9770b3d00720ffa05d3838042835d0b762dd052fcd5", - "6a24dc18b2a80e671837307119d11a40d27dccec2434864a1e0a971978d6d7e3", - "323b64390ac61013715d916dc2e2756d9c3f719e41ba909df934f6a68b752d1e", - "6e355f29b4a1269cb403a37d50cd79fe6c9e869583597833f9e332a00c601925", - "6c6f177685a1f67a216a54f0e81eae43ad6eb2ec0740ce2bf67b5bb8a23a77cb", - "ff369bbfa7702708c786f66842337c7bf146202b21a45e088c66d15c2cc932b0", - "0740e75f68bafc73ad095ec184d65428ec984958d5de30afb33a5d5e8e41b800", - "ae3841af13f91f614502e15406e3d0f004110f3e58519d91adc46d439657fea5", - "d4e03db59aa74babe281974e491a1a4f1b786bf45cbd4aeffa84b95ae8319d30", - "ef9d04d0a68b718efe4ce49281be593d5265aa898f308aa53d573e8a89ede715", - "cad8651e11860a3bdd441f06defa249017acc6c071eba13eec25d6b92b6031e1", - "1e26b7bb956ab7675d7e57137e8143978c19dad91503e685085c186909498952", - "68a445ded5a3b91ab86aed83682b54e7373615daf0ce6fee55627886bc9d56ff", - "c36aafdfa5c8342689682174f33f550524bde1aca14fad261133bcc8c1f4d9f7", - "0cea803428b7f98af814617c119bc0c66d6b12fdf06a68e0b5e0aaf7eaf80e78", - "853a7453477dd5614588b5eeff1ff6b55b8b11ffba15b744a4ae35fd8937c2a9", - "570eaa26e10b5b6c51d211ec1314d406c3046a80b591c9b6abd8e6e406acba0c", - "84667335ccc3153bec4d321cf3951a9be0a2770ee703fbfa7a08613037a09236", - "36459d0441f7b6bb5c3b8382a3e6513560213b3bf70b636f86086baf1458882a", - "4d82111dc660b147325d1b7d1d32ec1cda4d0aa6e7c9fda6fc678f6d4e682ede", - "0f6ef10c43e1055db847b62f9806141f995a5c1b77c1eff036a9c7ab458b518d", - "975321c5b9db74a25c5466fb251755126636a9e61cffe3731fbeb2c4ae5faae5", - "9d3a4e93b3c40d51c04c89a04573516b870a2d6d32b73e16b1e69e4d127de721", - "6c7fe1ba32770a43fd1710d227aac88a1775a0c7f947252349adac61089fda3e", - "07d63de8d5269758f7267c94b0e34308f6f43ea647783ac1aa5c921321cd9611", - "acb45b9e0ad201bffd21e8841d9b9b82d9da998e8596847f44576698de088338", - "c88ddf346f69b7a55b7d32972969cbbd2a71aa239e5b74d49df3ec954cb7ba04", - "fd70ba46232b1dd75ed6c91f059337dd7efd9d4f8928b2c8b4136a25e662cae4", - "3c30342542447ae820507513308cad3baf2c905b6b32e342148c34e1304e180a", - "aae5338b5247e54ce80ea34d50627a922fdbd5ad29227c2eea2a033efe8fb506", - "2107a2b0aba95120f37bbc752ac35ec0ff92ac8e6079c8d6c8c2a82f524cab23", - "150e8c7fbfbb8213e30ee72b4162c51a8672e7921a1c9bc4b3fe5f3e48496ac3", - "e7c65f4e27111ae7f30dc1135cdc1757589126b8145e1dd72df544dcce1d5493", - "e31f7aab926352317491afdad981fee7309b63539729401bb5d9c7861ac5f9d3", - "bc3589d07aa2af65ae641cb2975e022d4217db23a454111d50b7005f579820ac", - "d5212b738ab418ff903514daf1584ef3c4d5607174a8327b2666596b9d60856d", - "40c856f9465f6c9c36f818eca07fffe1b1d050f5c110b4134143f7503153cd27", - "e3a8416c8a7ed3c658aee02779acea684f739c6db07d734635494fafbdf02e05", - "ee202cfb44f62d25cd290c4b46afba73a3e5850ba9a0accd08e18e5dd3c98f2c", - "eed6b11f08196ef1a95dce7b83dbbbb6bc3ef6678fc3da58f297f75ea636f9c2", - "c9acb833465e999f6a57a5a818b6d7eee6f525e38b7363d7c52188c9392d97e2", - "0ba7a4d293133c404cdba769cbb51ad614d2ace89490dcf74f9a8e15013b5b69", - "416466ccdc34cd789d1684b417074a739bf48e8e0ca4fe9d541e36b9a620f89d", - "8692eb0c04ca6b645ac204e58277f99460e5e049af70304205d3467bc467e44a", - "019b701eb89c63d3ac1ac9ae814950e46408bb1b86939fa537bc68326b93b578", - "4a9da6cacbd5cb4d94e67925e84049f0d32f78ec68ad7bb14fc7b86136c5ce5a", - "b20a9ea5642cb4672d7ebfa06d32d3246b53bb5eb217f20d8e6b70fd223b434b", - "75387e9bd3357add3a3fbba7e6dcf090292513b9a410d7ad7838a59daf3a5441", - "6b33714ecf28976febcc8a09d492dbc5d52338d07bd430d040247502936fd831", - "bc326574dcd3d2920b6b1e82c7be5788e861befc83a7b7a0e8f59dad0da5a89d", - "2a45b8487b1d85dbab8dc9759344944042588eef0f591a54505c07657f72cfd6", - "1f647b9097399e40cb5739f3283699680f46273cc77e4105105829f5efc94343", - "e3e37c7deb0f367e39807f2bf106ebfd80aa26daf393773137bf6ff91fe329ba", - "51537347e93ac8ee4d2fb7b4977266bca7a8fb705574966e20b8ce4bb9b8b72c", - "cbc9ffd7131cb77976b2b7ce198b3e6f2bba82293a9d46ccaeb2ec41aea2f82d", - "980598bc51c192f0b48506c57e023368d49b9ab4f9733ee7934bff4f4857ac15", - "98e858b2fa7711b24c72396d7f973205454fd1c86ec4bf22f4519910c7b06b38", - "c1ebf3ab3fb4135c54c7afa4d38444821a07624bcdd6ca62748361bc00e9f114", - "da16078c3ea283d1e77bf7bbcec2a77346a0de9b0c6d5b587a5b7ca7ab197838", - "afea3c8cee5bd9928d22aa262a72b0194891d3fa3a43ab981198aabcd5c4c0ec", - "6844c1fa8739c9ae3dbcb128f7427f7c0f65e4f07926012391e90420e6d665a1", - "5608cfa9f41a94850565e9442de386024eedd7a77f278c1eda74fa7dc4ff6c5f", - "5d374a550b75be92d091728c903e291726f3d54c7f32f1b91b160d27de59842c", - "7f320b0f1a233e292e964efc0033bff777d9d7d059616172582b8fe2f4d5f977", - "9d19479711638807bf457c7b8f3e3c3b2f6a5e3a823cb94ccabb9f873dc3c2b0", - "8546aa9590f382317add84f2b96113df2439968b227014da4b0057472a750a87", - "7b64002a8a8d98abb7246bdaf0d80e965b0e4fd7d0f148a790e14a5e75002b98", - "e576ab9a670c95ddef0c10dfaa1d426c97e05865c8f6e02b9c3f9476479bd82a", - "a512811838473628efd9c440be58367b26440c00809d926beb13e4b10d7017f4", - "9b78f9b5523a5a838571888e281393535de2d8d474cb9b98e32df34d6af9bc6e", - "c35682e97b1feec7f4f70030249a90af0c0ed94448c8767583e23fe13664689a", - "469186fef375de5141da1a6811eba359993edf8e0c5e43a683ad5b3aacde8315", - "9bb03fb4c6e1664c299cfebe03a7eadf369d577c9024a0f924f66e7b1297e24e", - "0e8091654afe8758c22c40d285485b29008329c6dde827a22f9e8145f4abf8d4", - "5ed575f69abcfc8f8783cf366e5edb94cfc4c1c80432e05aaaa7130dfb1f3d4d", - "7110c41bfd5bf3076e8af10a9c1f9a71cdf7d08862db76fde1e40944aeaa054f", - "02b269dd00afdaf2dce50ad3369bc5d1f2e79a1331e33dcc444ac6c3a35ee248", - "719ea4fee930919ab3950c1f00298bea19a06a23b143566880d65d69b6939732", - "7e8820904f5d4678c1012f05da430944cfef18a4d29c9f595bc42132d3db9e04", - "bd7d7a83b5dcd7b298b6037737882d79c13a66dcb61f47a4a7f04aa059f42051", - "c124bd86a5a923b47a4b34e4467eda4ba2f3b1d47cdedd542050b2ac5b2858e5", - "519a7f3b3b0c0ee020e2a5f2d233b1f1d3250c4e1d6531f99c8d36a339eb74f4", - "d7197fac3461958530c85c9af4ef7f847ef78c514204b61414d499164cd50ddd", - "1e3a1ab9108c9984f83784529ccd21651f5b6ccbd2868227c14fc97838464535", - "ef1cb0fee432dc440cf0495a0a9ccdd1a759274ee62a8b37a11bf6524917294c", - "12a5314adab2907d12d2178dd662d517faa57d8e928c92982a347f2cb58d54a6", - "e3c5d4242926ed86848bcad62313b924662da331677a542f01518b1e4593dcf5", - "40f004009de53dbb2ae5ccd6a51568954bc1083b2e78d0644c3f4d996bfcc1c6", - "355a3fe83147c413ed47111c0d103612b1005c35d136d2688429320af7efa79d", - "26644a2ae0f0ca7ff10beb50183abf03b0218279afc978eaf68f349d7fa658ed", - "e6233637137dbe4e3195860639f0d104d3379af27b46ede5530ddfc44e192f1c", - "25c4efe90ff570305830f5deb646628351d5ecbeeabf109f9933822a9310c5fc", - "f9bec9ea5752a616c09ead06a770a96210030f2cf308db8d2b1b2c5344f9d202", - "34dc7b7c2e966f47bbc155fb3eb707669148dfa43e9abd7656341fb25ad6e05d", - "561a8fd3764cec9b3d2edd813c58ffb0f6bea94de18f686e94b46b9da60c3bf4", - "80c73242e51270d93fac9dda24718cab5cfcbec96dfef5ac958a65cf0863b5c3", - "aebb78d552d2cbce2caf868086582f664f650c0c99001cbde5c2a3da21b5dfc0", - "7c9ff51662f847890b50ca54f98bffe73c5b40a147bd5c54e17c746b1fc8af5d", - "809ac8fbd2f42dd5f4d185ffc445fbcb9e82631ad14d01db82db6143d45e7cc7", - "7dc40e9f8f0e00cd0ce6879ab0f7a0e7f8557e329d042dcbbfb6e5de91b3ff04", - "09f86a71e5b0004f474ad7aa9f9424c9b57084a83e2a8f665bcfb03099bc5382", - "e7bb0e5e0805c3c3f60909e3fb72c3b2c3531898ef2aa9b44db707a63c2af157", - "73c64fcbb0bc587544b0a5388c30f651278674b565cec3fbabcc8c2b750123f6", - "7a1d17973d9c7f2f30fddff10d3413cc8518bf725536dc0196b3b57b2efef811", - "e2492d1deda1047f6538f35977be229d5ab934ac406895c41f23438723b63bda", - "3c53f81e0da67e81d32cccd1d943aafba122f308ad47787d39542b6ee0cdd9fc", - "c0601eaaf3e0277d7cb2d2d7aad8240b6c051a7a1578ea44daf23d5755eb9870", - "a070adf68babd107f4dd5ebd78b24d2f5f387748e0f87838e539882bce275491", - "356ad59e5eecf9e596d3e9df574ab5214ff784455e8ffb34ce5eca92f79389dd", - "e83d847220a5a67b607b130309ca3d4f8b9de36bb43889a6ae092c4434cd96e4", - "80e6bf0ad4fdb1ca941217f9edaf01360ea2ecff168bed801d5a5bc976dd8d50", - "51d9b92471eaa9f047207138b80cde9622e863d368cb4d80a56e5ddd39dd0453", - "f651298505fc2415a1eac9df19b734db7bc692b0c234281bd3172a5c51886384", - "b2e3a4f5d433f4210d6fc3d52485725c124725e3ff7c552e333ad928f8a53da8", - "93fcf09fb5028b4ba84b42bf4c87eed6d4067925e37ea1bae23696b22cf7bad7", - "2c4b51833270bc8860d8128e9eb79df9850fed56fe518616ea7050724698d622", - "dad1b890849fc91ebf6bd1b914946850911b1d7af93234ec5e34f425060a109b", - "86985770590ffca21c7a8803112002eab25dcceb5e3ca5b7111667a93cf79f4c", - "a635fc15e55216b9a54f9aaafebabc9aa121e451a24a0b9713be167b620b7348", - "7eb74b6aa92d07f9a6e339ebb3c4ebfa67260dd3c3a4c97646e797f91989d2bf", - "cad1e3c893e26779f71ba09ef98eff618cbd81767d4a63a876d17531659c797c", - "06704295cfe6db76586a05bc10ed4d72346ecb72c0b22c7d195357df53092407", - "1d1934a2cb7126c991ef3e03a19487e9e9b99559a674fe3c4bcb95e839199f5e", - "c4ef9d14e39ab92cc61819e1fdf5f77e2fe1e3c2aa251c9def6fc554a213f5fd", - "19c6f50e4e89ca9338f7a4de9ee692c21ff9e4800291641a23a104449631340a", - "b8da3855dc1ec7664d891c3cc2ba61b3f74c7ed4498b1801b298470b6b1c8753", - "50fcc92e1a7060c45d3d116df012880126f576d5353664a3103c8796ed68db16", - "0721daca37d9b9501cdfab970af398e14ac5e60970827012136f1d91debb532d", - "7b4c6953f83257c0ad71271c5dadab2af2a81aec4507a6ef6b67ea8e683715c4", - "b0327ef891104850186fbf0d61b0eda34e10b92314d90c18cc61a0104062f191", - "8810d7c9a3a7167b3ee15573ab846b6f54501cdca19d564dd70bd9daa1b66936", - "54f8a29a850acdb125a036abb4d3c420fbd53b4b2f22c63ec1f35c380037be98", - "d486a091a26074d0a0763556207622a63359b8f6b5effae8c8f34e9bc5b4cde8", - "96eb4eab1a62a4a70105b19f97aa0994310b51f44b60693c5a9847b069808d38", - "318240d5fa04c9f9eaf1efd324e637d0518ead58db10cc6ed5d772fd6c29bc79", - "da2f790547c96b643dccd07cc9c3981c398135635e48ef64a13aefc9c00c5d09", - "2e822745bc144a845b78ed301b758952bb85ab7855e79eab470f8974972d9291", - "d22914f9389e4adf03a07c0c81966bec831e6586ef3b8f2ba7a744d967c12934", - "18c5fcc7a40cd9f7d1b361923be073f945bba3280d9c263ca5310faed4884493", - "6b59699da22403d6495ada57341fb06619a0674efcd3edf105359bc2c95560f6", - "870548e3ba064f9bfbd5b5febfcef548a1c9f3fc821e8d7dd3346c2d11d0b4f9", - "4a00e8e13c078bd3489813f6837e131cc12307aa98527c4fe5672650bd93cd1a", - "bfbdbbfa4bc4822ca4d3ea6b63a43c7170ce81511b29ab05f8568536c0474ad7", - "6a07a7e822eec8181c5453e4d151f7ba2ca8f048ab410188e749c3caacc9e80c", - "d2d9f05c90c3ec7660b151eb83272a5a098b923114ad5930428e94daff6aeab4", - "da50cbb6a789ce2d00ad5c52614c49c5c1273ebee54e0a0c68d7ae833b32ab6c", - "f5c3cb224c90a9089d32110522dfbd0f85447fbdfe174ca09348c2c17959d2f6", - "0d0015d5c3db2e9c8b11125cc57ba887940c6860b8ccf8e4408da53e7d443dbd", - "14a51d97a708bd4caf27e8b09b3ce37c9d683b562d63393df106923198bab5a0", - "c4321d888e25501116d2a74cfbd393aced5be760661da699069cd2c57048196e", - "f0ed2755c17495672f7e17a2c52a53cb6998d7cf432225c9f68d858f16e03836", - "68c4fc7849b694b217d8123e6bb33a03d0b88cc25cbceffa065b458731154458", - "7dea7ba6a5cd87d8acf2bb37d89115ca49400b9c9e9c8a5c0a1ccc396d35407e", - "ffce148a3472ddf88b0b9e4a4110d55029ced81fac49e2322c0c38ee8151d75e", - "f9963a3602ea79401411105f88c52f195e8de712658ce2e3716a1e68191bbd28", - "19ad1a5836244b09c2f44816a60093509128ebdbf0ef70df1bcd212e18c8e417", - "fe9a28d13fb193a0971acf9cfdf6e99214077858a7dc37010abcd7d11041409f", - "3bb23bb8fdcdf79566ebaf62a3d3d1b026db8920e0c84de377b09be03e688ccc", - "98c96a1a66c862364abe5fc714119bb974d4ee755187fe3f22a40b8f1e7feed3", - "602d0bd748c713608290c3af5d75812148cd2168d0c8ae6530b0b02c38d1d468", - "e14627c7f927528335fe555d1b2f172cab8533cfafcfb689f9ad0ad3bf48202d", - "03561e6a4f4b677579f7d71fe27478fabd5edf5ca1dbe8c512e4e4796361a5fe", - "4adfa66a57ea40d6316f6e17ba4941f8eaf5b5578d72c47255d6d784c89f3627", - "ba6b83df51e7d0d2e86dffa5769990155dace05d946e33d60ea78b7d12080c10", - "303b8257f262f9af092185b338e56c661d8063fa8701c373ee2d2ec69e3c0a12", - "3b6eaf5c1f8d05412a642c85b167ed3058baf87b93e5297d170e3cac7695780f", - "9dd213de24a184ec211881c7aca455803bc4611b8398e27d68a8d1030d40994b", - "fd55fb7867755214406cb8ce2e0f36abd7b020afaba73a6d9a8df7a91397d882", - "31fdeaa9117da5527a6c7bd3202ad732a36763b0d5ab3a3422d84dbe997d0789", - "c2245caced8805694f36b88a703552d4e6a22a304b648064310b091560b8d1fe", - "95415dcd84d1f55d9a1ab72d6536e34263d559f13e721743d9c1bce803843b05", - "3ced3d48d9aea02339d1a6a51f611c88807c5a47f1e909f778558ea346267051", - "60786e69277f1176e128ee3538bfc1d9e3d2ea3f126972de2b26b30da748587b", - "221e639c5d33d56627cf84823ff73ea011a4ca6f50a399f8528d4ee1660155aa", - "076270bc6a265d5a5c0962c37aa6b953adff4f20e40bb5909b626f78436f6bc6", - "8c26722a428255de3b85cefa80652412b40e09154c512b6a6a0b3bdee2340783", - "595138cdbf8f80295409ab4f79157d60cb803ced02ce410375e481663e2a1e55", - "d199f7f0e28121d157e624a0758ea3cd481f19d784fdb2cf86b036f6f2b2bf97", - "98322f3c85bbc8eb92fab85f25874b187fec39ca12d8b4f397a624b1fd2c81c2", - "e59d76ffb2479687ca234ab952abcddcbdba17cfe929fd735d6a38fad2afe26b", - "1d3eddbbd30af1e7df97c6fa785c419e63c82bb80211748d77db42d5efe2081d", - "02d7c035b059fda46e38d53bcab22737e57c45e052d65e4111cebe87d39a7675", - "c191947a62d232dfef3a1a866847b1ac7fdabc0ded4720665d74cff59c47b5b3", - "c1bf00ec980cf16058e1fee99fc93c5885a19c21e4c87803b449464c7f454a74", - "fe332232b442f89205f2e8847af6702f5bd0533c2c04d929a24553273cc0f109", - "8095d5bc2253ec53961962b32858bb88ec866e5ed6b7f45ff0c20bade086bde6", - "c47d805a56265f670b1d70700fe6dc46085382273c4e9455cd33524f3023a4fe", - "77b257d5408fb54f62d678990412396c5d528fc8653f54821b0b64d8b94f4b31", - "5ecb2668fb44b515ee9e32c3002d53779eb83cd0134ea3ba0852731230928343", - "953c9c040318990cbff1e4680e8a6d5eca713e0b9bd05a0149ace8de86c32a6d", - "c330d0c474cee408e85a28a1f00b501b1a1d04e268303e6c1ff6283a61971ec6", - "089d098c98ea84d62d6fac610549644dd43cbd0a4a87a5e3e8217c4bef55ff43", - "bc65b7df63d684de4849dccb91eafdbc2211da5e3f700a89b573f407194d2948", - "aaba0076be24739df0f574e6ebbfaed2cbcddc04651f45f54b1064c92dbe26c1", - "2effc5d137878afa2eb9d7fda254f660fb522cf10cf4eb0caebcf4f750c32691", - "ccc3646d48078762ec210e3de83378e02d55c46fd43d2237317ce2cf9b5f4096", - "09df6d608ae049f3679821c69521c1a82edd75abc06c680a52f5681bdf004a2f", - "65a4214655813e5ae61469aa1298f86ffaf69dd3dea6503781e17c03acb7db24", - "1c7ab8a86f4a3e172e425b2e1704dbfe89a99c5cfe62ab74a64462d50928d6ae", - "88c50dca272ac76535f96b6f58552d1b78fa3f19f05be4acc011413375d8601b", - "a4a2664a661bc95df989b9c0558841dbec33db366962480200cf62c33b646ab3", - "eed022ef2fa3db69f48f44b0b1adb967b22a67a4994c009e7286e1c8f7e67b65", - "ce36518352e04d78fe9d28a15dde038f91cbdc922a3a9a44b81d32303a5861ca", - "8c1b1edc6719c495b30c701c8690f312b6e3f1b5c8d25791af81993904a7f6ef", - "62fb7c7c440a07fec806196a520d1e863d0c00007325ca5e4d4bb879017bad4f", - "79cf35f0114b56eedd12f81a0949fe663eb51fe4767de441a50b63c09bc12a9c", - "536732d77dc961aef3e215eb80d167000406488b6f4e8ef2c15d75f0691871e6", - "23772a8cb3253363e1b5eab4d08810bbc4c51b4a587fae1aa33bda6a5c503a7a", - "b535a859e1d9105aec84c78b9e2637940b243b6673e37f59de25411d2ee0f920", - "64d40f08ee3dcdd7fa7bbf5dfa4eca314ff4672b88dfa2cefe8ae926c1fae2fc", - "859fe93371b44f108d2f2b80d81afb7373c1ff9454271ebd63aad388b92df2ff", - "2153b8c0e0c42bac3cb0ebe78bc20246ffe7baa9b185f41344bf4f6937467e96", - "cb2b4bf46864748152e73dac91dd4d5df6934895790fcc32184611d64ab01b79", - "7417f0d8880ef5b30dfee5282b6bc757aa2c4584de56ad9f47e205e36359264e", - "cb047fa4cf4ba3040b6203152662a1a766e32a8ecc8dd5223f25834bbfaf4e1d", - "ef40faf71f62261b77196fa16077c49f3925f388d4f22afd9786deaff93de114", - "5e9b5a57ffac9fdade9ced7f058bc85ccd5dab17851df833036ac5458f68dbbf", - "c45d632401d361490929cdc15c35dcf42c9ea9c93187ff9cf719874b2d9f6973", - "d601ec4c78b21a0c95160d017f2dbbcf8fcb812e2cafe40056f880ed3e253298", - "a64df527651b594fe42153c64671336716fbb0a46e4b09e9e933c8958aba961f", - "3a226e6d0eb8e93f4018a3ba9b11af2fc147382bc0495739ddd5c9c75cb73dee", - "33d9775c78bbea8d52fa92e35f562c723f1bf86084baf4b80fcf8c4f84c529e0", - "c4b31070adb23de3fee02300d7c06bbbdda73533c7109c6e4d79bde478a34250", - "09d13d39528aabc8c6d21323a980ec0c766132008aafdd87d34d273dfe72d503", - "0bf1b327e294c7c920b06aa9113437d594846476a9c042f8c4e97ece53b73c90", - "1bcdbbf6452c36fd47883f43dbd68648cc0674a537d4588750fb1552875f2bf3", - "6ec5907ae08f6e04e81787ea39ae31c04d042dd10c90d588de23f2d6432ae641", - "dce8c95b6c454fed401bbbdde8eb0804fdb1eb95d07d1e1dd4b99836150a2475", - "2ca30d99b82a25167cba0782fd38464f7f8b56f6ab808ed76bb5c340c1756813", - "71244a5767e9b2a042c3c9961f50865cdaed47296629ea9d67aecaf8acc7115d", - "5d9ffed87e32162c3299c1db0d49dd39f854e3612daea4a44c3a380bdddd3bc0", - "f13d964e2dde0014719846b8568630a0de44756462a1e2e1a5d23a7899663b93", - "bfed421ce19eb53be35ad9af8baa9404fefa6af87efa623cfbe4b7e17e151fda", - "6f903aa02a0a775fca0f0e9d7c5eea02f7c6e124a79c12a1842caf68bd3f9a2a", - "7bd39b5149c002cb27d66892c76c2e6c5742926bcdc6ba22aff7328f0b5385bc", - "69a1567e1d3a2d1d24660360b37e05a5392030272b9894a96a732f045e16a99a", - "bfeb55b35b936ea9fb48be2023d942089fe4fcf0352845453f26bd5f006175b0", - "60714e5ebafe11ff3c5acf69f8016a5d1392389457d147d9ff6cc2f0b18971b3", - "6ba52bb44e6d9e01da8d94fd3e3d0b074f0c11df25c6726dcfb0415a16370935", - "de06dfc435b9e8cdef937c05761438375a31ec842888c0c370523e9fd68814ca", - "fad299c215d8d1e1d958a538a73064cbea6804a28316f50e502dd52129da7d31", - "f3aac5b5f08d0bb85b8af59e7fe6b3712be7bce1a7611b9260f68d239cf207bf", - "b546e0f179cdc885e7a331928485db8893ec32bb254cbe9bcb83c96070208d4d", - "f7fb77cf6a9d47e2c8bb73e6d9bb8fc185c78769e0fdd8f31a132ce985aee744", - "c6168cd88085f6680e8c869260d2027fd21659569d8ae7abb37c09a5cd46c835", - "6d45890d6fb36ab0f100334fa1d050a6b9807d1477020793b9f9e2ec19ab83e2", - "517ac3e022545d9d60a693a0c73c5feac58585da6f5eae01af9e2fe52a7f6f51", - "ab9dcf35a5cc10edeb77798c44f5880c4547dedbdc53dc7b9af8893876d3bdea", - "fb9b5ae14fa080c1082ada3eeff19ab638acc5484e1f325d0a614896cd4d9bf9", - "67526db3cbb0e476221f87ccf2cc65847c39bc94bcf3dd70dff8aefa6df2206b", - "12489353495c507dff90446632e47823799eac956e75be8a2bcfe4af50cc28e3", - "324d513fc46541c39be91ae9a7201277e1b97ef0a1fcb39da3a0c254d5d3e1df", - "d3e5251be2e4b084b970ceced3997a699c0a6abd74409b6cf420f7b8b39743b9", - "04856e42f082ac38912edf85a65c101bc9984d84b79ee6f8e604a5293b2fa0b7", - "118843e0b1b9c779cdf56d1cc462342a3da3780cc22d9fab108498bc4a2c0af4", - "22af92c50e8d8c1a0a00f63c8d68a79c20b8da06b3a1b2a5ea5f430e4ea64eee", - "4ad1547cf405291a3a9a11dc38dd0adc1d9f911a5e1adeea33db9d3297b52e09", - "90d6122028ba8ef95bc1c89cf2860771bd1c514fb2ba16a6342df066a4cb2739", - "2273a9fcb78c329143111e783d749b6278704867945a1118944fcba44fff3c68", - "48bdddbdb8b9abd9e87217cf36b608a65e76360ec0422719999054986cf95ea9", - "54504b7cc7e766177beb29462bafa9c95d592c0b264a03b5f995f88701e09f82", - "d06e744463ba6de890af393e35cee90e4eac46b04969bc5d1587ca56c7bc2c6f", - "59ab9a3cf16fe76f9929c401aeda2a49009a33a9afd9faad0354452e8ccab369", - "6b612c636fb2235ca67339d3c151d7ef207dbf9e3197054a8f94a51aa6cda640", - "247a8a0ad498385375fe8e7bb33c6eb0d129abb977258459efa1dd459106091a", - "2a79785179f8a587426ae276685d7b5e5f2da3c593b3624ae8ddcc1e3b12b2f2", - "413e7d8a4958b944bf0623c4838905613fbcfb2cab3076575da26d4cc76761b7", - "bb80a64381c5fb004a0927fcc229642acec321b98af224503a47c313fb8690bb", - "ab2bdfa3b5f11e548879af132597daa6bb78c9ff48f0b17a45ecbfcb3c1dcff8", - "b34ebac983c9d8a95b9ed7faed1a3b7449459f49d199569648b00089975c636a", - "2bfd1028cd21fb4c786995cd8fa72ba47e29a90d8d289469244bae718fa67ed7", - "1fea68a2af91268b691475572cf24a31446f35343853c0962df172e1307d2667", - "0f8c0bc338d01e3a80def293ee37bfbd6da3280d3cb0446b1750853bc3935d23", - "e36ec05f1a50ebbbdf10329488575967ebb47e266d7118c04663d5bc796c4530", - "3805f4de3e0aa77ad934f808ff37df6e0f60d3a424482c5af8e9323193624e21", - "8a54bfaf8ebaa21a2ec9ebbcfff5e11104a1b5cc54b4658fb4b0a44f3b4350b7", - "a11de320a86a3242e2598d29cf1334dbdbdc196de2b9a4f8fbd5cfc47a34d6df", - "3d28ea020d59c661a843825324245c88924e6cfcfcf6221ac8e4e77f6ae52724", - "e4182d0f44fc3a2c7302eee052cef1d83061b8abc0137a6eea1cf919a191dd2f", - "5dc8360e6ac548214310fd255a3f7357d8aa8b1838369d7cdb228a0ca3184841", - "f6dbfe93b0853be4483e9e24f9474af758bf9fc80b55b73ca9d2bd8519f7bad3", - "86f00f1a20a832d64943df4151ad38263336d0a9308800c2b6aa4a133754ed20", - "337dabe9707a38ceb33b9074437864153778f1db2d344cd935ae146c44898091", - "0b0b226d3e65cf6f86f998c7f79ab1a6546e93c0cc4711f53151ae82e1953de7", - "8c343bf1834bad6c233b4fcb9a3e3169f6dfb02ca3a91a87e74b2570016c69a6", - "2cc0b4013459d97aecd8181f48d3570ef859d2820e5cfc171a2db5eb617ac429", - "d2038fbd410daa2c9c52399cb6f86a435a6bfbdce5d40ba98afd4a363203df3c", - "a0f2d490aa7d36a6c6dc0635adf5f26dab41d1dbda4becf8903444a2342933c8", - "9ea77ca423f70687e859238cdae65fb9610d86c23e558c139ed36e7c5f3f9401", - "c0c50bd2dbc97d51fa52790094c35a9555dec56c65885158ad8ca86d0fdbacf5", - "ef9f5ecf1d44de0914c80149ba8d9ac442a1228c4176bfa9a94db54e7da0eaf2", - "32f0d2ea41b4a627d3f5cbf88c760d386dd178c877d298571c62ddf0d4965203", - "9247df4b955f3dc3ff836840a895a517c20c06391efcda05d43b2c1b0ba47d6f", - "471dd6da8574939d1d423a2e49a375de9b29d1d30391dfc61cc7f0917addf0d6", - "777d610b0ee7010c98ea5de8c8a6ef7134ea95898a159c53c93280c513b569f5", - "82c762ddda11e11adbd78044543e3234a51ca16fe4d023c6d54299b15d22acdc", - "adf17a34fcfb416449c8f93282d3ac7da6d1a2e1e46418bf724a478f69bc0294", - "34164ebdbb2fb1ae49f6e320f766c0a5fb9df819753de7ebe8a51b2cff57c779", - "bedaf48d152a050e6385ce388e659b62d5d8e35c1dd9e83e1c4378d81f08dd40", - "f3d46128eedbcca961132269aa7c0890e5589a45119ddac4a1419655de9ff189", - "8d3929a8bb3bc71ee6375ad8930ab67cabb3936135bb0ebf6be5dad56ea1d038", - "27b09efaa1862cfe5490908c0d774697962bedb710253657f3d414c251dc6542", - "51c7821de762d54d6ba400f75bc9cdfee53c7c089117c4f71fb0954aa7b2d076", - "55a9e2ad0c0d9b6d7367b170889f59f72d24b7409e5ccb57fbbc187e2962d957", - "e67deb40bdd1b8491f309c82787ccb906c79a9f68ea497a8d395a7f8b77330fb", - "bc5ed4e6c497ced8a349cd6317e02d31177e7c153ca3ed1c93158a679bb63714", - "d00132d33fd0387b21888859bb34d123da05e2c6201c76f9a6d5628f9d0ba3bd", - "afdf4c9d2a440f47c540c36434c746c8406fc0ff20d5314557ed3310eb83842c", - "30eb134a0936f2702a5fec14a051f7e488ba420f789356772ca686d4626e2a8b", - "4b90aa0d640f5e637834a5959fc28971e0be488f1b360b11d5ba9fd6b293fd85", - "eb3e04f6d3b08fdcb9ac4a424727fe0270410dd44bbe1534ac6a17db3ea36c9e", - "55eeaec26661f61f4bf72eb9f06cef702a13a170537c879f9e09ddea181b579c", - "c30a0fccc12df3b28af4991713fe306f4c1bfa04fbf5ec9f022b58a09222369e", - "e3c066c993a25a31517a6fd82f7759f7caef1da64cef4cdbd3148f3d15c60168", - "b711072a93d871be94885e229f311bd07e2c1364ce0e010a41f8df0af7b9d473", - "d5ba74842248907c1a6c2b8b0dc36537fe75bcc7324ac802247266ccfe7747e6", - "9eb99bae78fa280c58f0bbc7eddac8e2366daac4c3d7f9007ed46beeabe5f9ef", - "57cc5c0241afdcf0d186b86de2defd919ce88c56c27b0a544d2ca492cee8b78b", - "3cd44205bf5b89951ae9962776b1a5d0c1f2251a4a91a11aedd3d1c39a9fb538", - "91634512ec43444cae2a9b1ed6ec9556fffcadd8241c5dbd6bf104e1fa416a14", - "f74e5a59e0f625b7b8fc564da8b3fef11eb546d38a5785cbd6d85b0b6dbe6834", - "5cedb8500a468a619bd6d31eeba1a25d707ab7ebd783eedf9cbf09581ba07ae3", - "2f78a3c9524115817c2a0091676bd32571acd3daf2b6fe7e9d69d99c82099a9d", - "52517617f3d3486890600cf0c9c9f5e8cf11bb9e829c602b6d39107e7652b574", - "abbd6b41f727e62d74f2fcf6605ae40a346c1e4985e33695d6dae27f2a6af5f8", - "03a1893c87dfb211b592f1fc8f0d8b58b69ecfe85f68e12e887336f60f78aedc", - "d596375c179abc68ff21e55082a847df835264df41519f3955e3fccdd9a79a25", - "a95b88853e08ca9672d95961ec8ce55ab120738b60c281bf4f96686d249cbf12", - "8609da73717f6ff38205d77f5babeaa72abe31ab0ec426727590ebc0a889417b", - "bbf55296b7104a9af2255949650fa78de11b0fff9dace2f7ca0af6c0cf0fe37f", - "aeca82e6d3de698e054470a68b462c3c9327cba829874eec4e79f7b8e9dfc304", - "70007c6b5f8aecb6fc1e2685e185d77e606247d6ce02370242b98418bdf93b8b", - "66e33de200b48c6b8ef62a03c50ecbd9c66872f3ca647b6eed6ff026e754ca63", - "0053b012cb6b6a0bc5fb0feffb1763768d37a41b07cb46101756f19f3b3370f7", - "63e3b3b815d1cc9eebad0d92df88d1da32b5020a786fa8b1ce0ebbe2b1bffaf7", - "5ce49553cd257530147bd34173de6094739297578c0af1869901388b60b0f4d8", - "6f7a7e27ee94c9ca5028ed6646568484693dfc913c5e840f3831ccd7a52757e0", - "bcc9d35da7f6ac5b9f610063ee9ed035c9ff01c04f08f371dbe924bdd140a4fa", - "65c3a3a6149170797a9aebfabf8a459a9dcdd9e1c5ba5358315ba38a7d6ecda0", - "d7bccb47e05af6ff3bcec0341da41399d602b2281f23ab25abaef01428985086", - "e7bb0830cd9cf8c91c8780487399088f8512fab2c3bf9c85b9d43560c5be7c91", - "175b731a91fcb9968ae3e6eb54c86b6960cca11fbd4d76d1ca2764b344369b90", - "b8ec5b8f7bba30187096e70e7bf416436009ad4a0a35deac36070834a5ae57af", - "b6784f247fa9396e4ec6cb9c9d200931cca23d7b8e36c052b451b2bd5a8b2a36", - "adeed90f9bf00c987e7e0b805e6080e8aa7269f66795b053b862e2fccb618c7c", - "a4830b40e38fc08cf2c4bbcf7104277c8a6ae357c8d682efbeb2205fe7d7e594", - "a2c2ec9bb442eb0d9d705888c5c4ccf78a8cf9a7bc15b3d8fdc1cb2ac95603aa", - "778f3581a47c8333676942f7cf4365dcd3101af3bcafc345b4728485810d157b", - "3987b27802d94e265ec510ecfd21b9620da4d8893420bd2d5ab331fdcd855b96", - "1a827c50691b0d88dd25d30098e3be15e713f2c7ece73538782b9aceed64ac58", - "8e57d28bf2402f6bbe37dc5ffa95816cb518cd884a6ac86e6c840d1b0816e824", - "c6e7b7af1cc48e7db1c4c30b4fe098bc294075ae4757922b086bbb19b52c32fa", - "712ae5802fbc4e56930c09b0c2b4f34bf89dec94b5f969a9d935869a05ca685c", - "47f64555597d68657978285869838fad8ea3501fcd2429f4a2ba90da0116e472", - "aca554d6a05c84b6e4f61d3b1a3c302720228266fab86bdf5e22b92dbeedc9dc", - "7cfabb9ee484a1de274a784a39dc1a7c4a5313929d34083dd5578511434841c2", - "5c22c3247b946c859bdaa0064e366ab3ec9b3692f32d6502b4ece066ddc14209", - "7e6b100bb25f376f308a9eeb350ec35f96088a6d1b23be20dcd36f184965a065", - "1c3d0fb6427e512771d268ad34e8dc751a9d742de32633d6a4bee2d8df1ad109", - "a78d1107cac375a04a5a2ba251dfa3323dc5f30ab7e4b03e858662e873a97330", - "1c1039b9dc5750612996c5dfbf9d39f9f7c9be00b78962426653419b1259dd24", - "94b6f27673493b6fa12ff9bc902cbff2f3ed0b8183217bdf762f4341d620d405", - "64beb769b9fd089e197587e76a5c18581bb01ef5163144cb108463bb4c2ffdf8", - "78fb6a6be948950bed3232b776294ab5a83a34f834846a561e66b02267f0eb13", - "eff0b87c813864ea77bec2a33ac73ba91b5a1b30d0ccf66920740e2892290d08", - "0d76e3b1fc17de7200de296e5e812380a4a30d8eac55a0d8e3e7bf704aca729a", - "d818b2e369a35fc323db269e547a6d27aa38a926aab39b9559d98fb02b91020f", - "6cd640e80416aa062bfc936469aae31263bd66fd81f68404b3fb715b1ffa1946", - "ed5140fe7f70988beba86f9eff5ef995d3c5d5319da848e3db678e083d659ea6", - "6347139de6bbfcba77cf1eeea4e0f9955233bf329c330b17c3f6752a33a15bfa", - "23f21d81203d11932f7ab53466856a6144bd839c874f9d2c6a7c604ea86bb167", - "b299a60c16dc46e6214e4e0d3b8456061062ceb5cc9f081c58a8a8c9551322fc", - "39b910aa3be792926bc53fcbafedafe596871f6f3833677aa743d2357ef2a633", - "8d1fcab1b8c8f397043d0a99c8db4109c764a5eeb9175dbff7a27b0d2d11b239", - "876251f239672aaae318de26184282231bab6dd3c2fb9816f9fd8d09cab43865", - "14eb3de6390abf38828ac9dde7bf8153f33e43f2093d9a0a27fe40bac3dd8c61", - "179a581b35b9b69c26d2960df950bbc9d6d52c5f672cd74b78fae35ec62b19ba", - "b5ae4391011dfe88a269f9f6eeb072f6f324bfa4617a287b73039effa450e579", - "537d54a03f72ee2ad2919f7cea0fec7cc2f425cf36dfc0a5035ee62dd1039efd", - "4a7a64bd8dc539b6a964773ac6ad06d17093b19a204585ddd7ed8544b39c1747", - "af34bd858e6ba4b1b917f3a7e13fe56382c7ffbc31f6fe9fe2b494cf3a0c3cae", - "c49bf9929bc592e4ec9c03c3e3506fff7092beba1700e6ad35d80a6e1ced242f", - "f9d527de9c2998e4d3100762136a96f452d1fa2fc61f49e6657ccc033b3a7173", - "c3e17a9730db83e3cb00b4dc88680cf0a0a55772d5c7c0243de3e7dbf0b6c878", - "19a16eff23070665c651ab994930b136a3e102707a781fd7060b59406ff8c81c", - "3ab0d0336274e0b85717d153da2dbb58de88ba0e526410597bbf71d572a8200f", - "2f3b986b9a5f9775c44305ffad53ea83b7e181604f7cc6654e62141a656f4039", - "444f013827482afb9722537b2957e7c551ead15404cb6f0a590b83faf7c77665", - "5563a6cb3a2d0315a050a7a8125bf0c765100458a104ca72929227efd9d391ee", - "94ed5bdb9e2136d893bbeb5c3ab293c53a19e1c4ffabf96e733296dda7039387", - "e15baed72dcfb580a6830bd8455677c9e084e0fe697f5ae2389a1de2939d8633", - "3aa3c20b5678e2514163b0428f0f55d6e08aeeb0b70404dcb1c7135c8431573a", - "503724ff21052cdbf63aa0a0ef3f59080c8fc4fe6ed2bff23a95023f35670c17", - "fa96861a744c54b82c31cac8544c9265a44998f65136d6489adc60c0bfa3c1d5", - "b3c9ce024791c395c49062a94bc5658e141f54124b9d926c537fcb236959fba5", - "155ef1db083bcd27eb01d7875f6a69ab8d91ea99f321a5c89bc26ef16f902962", - "1d00fe7b52d8b62dd3b49b9a690dce07eaf054fed0105acd8e9b5065db509e0b", - "e632140bdb23679dcb348a91b1bd532d642f6a8048c17791c55a9824ef97d113", - "31ece18b9ab7e3fa5a80b4a2dc4cb58f41a1a473f8e7d9a6870d609ced71a0e8", - "2494e218e306639d7e609c26e11e1ad673967b138cfe6fe5afff0b804e50f278", - "5c112f78cff22585e36606a2fd696fcf80a62ee90d4ab28ae6de47e7521f29bc", - "220b9f015870a596579dc8f5238e954edc8f865e3efe990c1f497ea45441255e", - "94f8822699a7ef1e5457d1c71536efa6c0c0480413f877cdc80c9b05e4657bd8", - "0a8a8cc68ede137205a80b337a39497e89ea6b9c284c0e8adacb769e2bf8370f", - "60947bedebd3825879dd8b885415762b92948f67c559a4d97a288260649153f8", - "f8974748704aed72a28657d1d97998b3856000e40b0cfd56952cfcbe1b1bfe28", - "63a42b848b4f146f9753ea2bca982d23072994abb4ea83a1b3d9972fde573976", - "a1de64cd1f1c8296b774639472275e044424ba373e867a22781c810cc4a5b3ae", - "3ce86ada22414ca7c571e5be27e09254d25d3cf41f5dd2fd1bd7d3b97cdc0abc", - "5414e97d8bb7b37728e61a8041d02fa81b46347b6185b2a3f388082d76feeb71", - "f9f70460ac5c4093ba53bbc4d35de0902ba2299120513138aebed8fe6f4871ee", - "f95180196cedd23b198af7db740b067b5a75708e2e5bfd6c7b0a3cd69bd864b9", - "7e59928973c9378ef6ad7a4ea7aefafb2c842f21a5c61080d40e02c95bbb7c75", - "1a3426c7ee3f46dd16b82ab40f768f76a10026354e74a4ce9fbf48d459124636", - "c4d13a586ed83a2b858637870981a91d98e058397eea487bc9cb1908a94ed054", - "b175e1578cca9b7c4c8a013241ff42422047f7bd2c33da678b9d34b2f73b1800", - "e246099da96f44f4b20bd6b4ea7e9a48188037f38b17633db1d3049e900ddb8a", - "52ee09cb37df43d43b3d492983a693febfa34e11a3880a70759933a614760fb0", - "4d5417aee6a6666404e9a923d7e53fb6a42c1e98ce15032bdb365589cb734c4a", - "18834331f3d417951a13274a7b22ad485958c703c98b6fc671230c1bf14c0c93", - "bba4a9848f2788b3d63812d02672b4809dfe7b69290bab186e22757848a73593", - "3ca0b380ed08e5854ae744fbfeedb2cd8ec4bbe54b1981627a40e09671d8636f", - "184d56e3a0bb2d882c51f6de9f2df137ed82b478f717d734c65416e7b83a3de9", - "25946837ed218ab55a701c9d4b7f4a62c893858f464f3ccbb9be608ac5bde576", - "5534ed46aa39c00e74a312413d53f56055ba45f2a7acbef86bc5a295995d45e7", - "c64f0b7ad62fa13a2e480cc69f5fa3ef7e69dfc78cb4d3271cff01d680b30121", - "e281293806f89a0fbba68e9d0cd9b2f6e1d10c12cf35e7c5c9bff5855ae553c7", - "60bfbdf93a0e36cb0f2f39b106e3c709da079b385ef941212c21c3c6e6200df2", - "850da6d4320a63077f3f3366059bba6b99978b97e1025357c67a9c259b665048", - "82aa2c646dd2162ba063672b5b63ead3ced34de330b56c9a059c1bebc720fd2b", - "5e049122a3edc539fb282b1257bf3b33675dbe48cbc5952a8ccfb6b4aa0ab5ee", - "cb69c7306721a109c58ecc34bc8dee19a721227633b9775451eacc146a3961fa", - "badd60908f709e07fecd5fbef4f3a8bad053d9aa8cb2356465e590fa57d4962f", - "dc41141e33c01f3dbc7cc32c188a2470f7c9a8f960a63fd82058f275d2ce7e65", - "6477076d1e35ff7f32134b3b21ac8a6b00ae848951eaad422e22ca73eceaec61", - "36250e86ccb23544043f72290fe3c92f55ab80d17ae7199bd0c59c38ba46857d", - "17266196d52b595e3f0a01bd3be428e204866204dc33ff62a7205d779454b7f0", - "f7737adc0da8816b7ccb336f283f91c478f4a4000a7847cc055f14151a37b8f5", - "d39a9c64e85dd2f18c6caec3886b497fc56ffd0b381b03ed649db59c6e34e72e", - "82940aacbe97182f9946a6925264c14382c8dde4ab476ee407b8e84e2a7f5db9", - "b6bb37efc836b7cfb14949f6a5130de88088d7efca91c54b4460ccd7c5935e6a", - "de986db02995c263be962485cec5a81b1ece255afab3bdcc4f2bc7c6df4f81e9", - "99c8667d7a6ce0f70fefe388a6b477f02654add6e61c2880a0c4c3375456ea5d", - "6c029438df9a47b4c6a417d1f6b04cccfd582fdc57b9d65e7c79d4ec5858061b", - "85c06d6ff8be92fb950daa31bab318834b8ab85cd3c12d4cf9a897e352f795ad", - "a7eea14e208e5c538bab478cc24a05c01442925238f02fc93db9bad269585dc8", - "04c13a50ab231170d4c418fc716b740bb90221676052a6c5c8d42385f733758e", - "bb9825b7ac55b9384dbc26e4b8404c5b681ffd4be4db877f9f647e8ac77f3889", - "6f7534788987952b48336d9069fbb74a41f7f87a02b15f181d6b98b9f8ecf7ed", - "15435c6d4b8064797221d7429d6265bbe0045c19906592f313d11a8ec3292442", - "ed66478fea01ab50f8916f1952e10c4762000c024c5da2698c7169af500e1a10", - "ca6a769ad114970ec589c1150492a695bf21d1b0acc3d64b62653199dc768ec6", - "a96e34204eac18ef3b2e5c68ed79f8e8cbb5d6b8e872a4dbc765c79a26fb82c5", - "7569d81b20f3e3d00889c76aadc8fc55beec5a76cb7b5c91c4e643bf03551efc", - "d3f9a3a03cfaea3691687fca5be1cfb98f760511a9c36361dfbb1a9088db30ad", - "b127f95f8eedbb72cb4780b17e2277ed7d546e3a9657d926c38d7a1d1439fd47", - "6ca09982316ece25913d83bc62e6dca7f441b2a7243eadbd8d55f053b31b0a3f", - "8459dcd448a21e2302d0935950bd78802ec82c2c3e01b9c3a0acbbe9e5b30fcf", - "565fddf995e41f77ba0a98fcf6d925cb3ddce72497ee550937790f544cece985", - "c4f094c8b9e5e852cb973005c97806c1a45db00f1cd0687eff8708852d578f44", - "15488a443ab60dbb39a7098ee57361fe7741f3b4fb49e1ceb87ac2ebd72834db", - "5ff7121d645f823a0dcf6f896e069fb922dd8f3368afbe729256475fa420d7f9", - "137f34d3a2c7a4be6779e05d32f633261e400909c390e8a25ed164b62042804f", - "db742efdd0595a3a026491ce919317203b044bb44744cf0eae0e6b95c8d8e9cf", - "4f2026102af949a1e3da7138475e51fba08f437a9a53af42a74ad40fbca622fd", - "dcf5d15528399a77443a534f8f632b592493bf2b613b3e6145c7eff3960b39ae", - "17e5c0714354f5bdc740dcebfecc35891b035ec70a90603e36ca487dbeb85e4a", - "8cb33cc309cc78a76c504c29c191e69c2473287c84ca4117b21c47fd7aac062b", - "8778a626a0960fe38690ad9dd25b9d2020a3e63ccea45ae50a0921dd4d425612", - "1e0fb382555bb04489f56a61a194cf4cf0f2a642cff0b210bdec50e4e6d7cc80", - "a33867f5fd9ebb39ccb815c38a3cd2ff54170eeee824a23e3ef7c218e20e489d", - "e4c53cecf0d6e2e360debd7f50697672ef97542c6db3935157939eeb9c1285a7", - "f5fad9915d575aaa0b07c04a178b4920dcf6812fa5fbae5d98efdef229b49f5f", - "ef0648e1d4425a3e4b40f7c01b3aeaf79633762814d7603d48f8316af291b5f3", - "bb7316f4602c2c1fdd2153067a4636bf88a91674b0654dd79de04f4f83dce171", - "322f765bdb1d58f55e3cd1e64de3da71f14ea4ff1e474296fb304548c51b178b", - "e6f7b9440f2f9f944346f42fecd1eefd44c2e2cfb7ad2e05938f7a91420d9c8d", - "ba5f0670e8745460d686f91f34ddf50df73a3754372b0dbcb7b075fa8287d9a6", - "4e310ab269605048c2093f3904a103bdf4f4e9e1dbfc21264f23fbcca400e8d1", - "ea509b631c264339efadbfc3cf647cec910eea4feedfc49c607de372fe44c36d", - "bfd0555c9da4481d6abd357f7a640c55dc6440252e120f0b3ac0c7c09c152f3d", - "c2be1ecced00a334e267c3111310eb64fd44edaa2e61511e40374d749583b873", - "d7ae6a2a242df96e51ad736fd98a1f72c6d4b04b371c044e52db96276dc2285a", - "f6b5776ad8ed8ef49ca1d837712a79abaa565b9a593137fbc60cb6ef9c0f0d88", - "42a175575a8d3a487a3544058f1239aca47ae1c367119fec6fe2ced36ace0baf", - "9a49891b14d056c609e18678d206d44a40c282a1b0bc84269440ab36e100cb7f", - "d65f64d2a45a910d8a5e7559966e9279ffa0f3c23fc9f237d2e57cd814800e5f", - "268708024217717f79566545e7fafae0a61372e4a17eede3bb2b0424b5e56169", - "8c6d7f86c751cb3fff27efaf0525a57ed054dec4fe07d3eee4c9073a1cb039dc", - "33ca20716330d4a9d7432499f3009221d7073af4181a75c2f0e29db5e016a5e7", - "c4bd814dbe642062c81e414023a70d252a01668d31eb55ceebf1248949d5fedb", - "52a9152e1afb398d27d29418bd0e46c2ecfe8a87c3491208a38764a2f3358f80", - "938708905ab3bc2e088e0a5a9908d12126c17122495b93f8de433ee277a2efaa", - "5cd9651eb465ef3568e7a72a44ca41ddc26ba2a73e1240c513b76beefc4d3572", - "100bbfa89247c735824428bfc05071216c02bb7caef69611a916d15d3d5316ca", - "7c22dad7c58070a830c976487329bc5711523c6a4c40734d08d0bc8b5df40266", - "5a2d209a315f1942fa6674350bc31c9347796ca643a7beecb9a9b72d8788acdf", - "8cae4ed0cd5c9b2ad9c5e80545af5218289dceb85f5083df78c2cc7725306518", - "454c2c275d31b3489e7cfefaf86efb61a867fa181ab9d8c4c8f88f366b2dd0f6", - "34ee8a473f8d69e2de430742727a6438471c05e34530c438973fa77003e812ac", - "ff06edb53d2991dfb9842a6d4b8005cd753d86cfd5f656339ab0b14b5b7079bd", - "b97b04a50418c76b13ee3de266b6921982af9c850ee866cbe584cc8415552b25", - "951878912c64d14788ea78ded4515633bb8bc2eb50683bc412b9f096e2cfab49", - "621ee7fb68f0becd9ef2d288fa41c8dbbdc7a0edab0ecc149d5e2a6d03d9c26c", - "c7363622ec4ff7b471cee9f0ac5dde524df5383d490db89fd7e9050df70f052c", - "d4bd328907b5b8993fe9e20b4894f825c7debfc293269001d736255edda8241f", - "efdb1ba6ac9c6a4e8fe3f64e8ba2a9100c15edf693e60c33999e61b1c9862b23", - "dc0b526f6ae8b0b6dee891bac2891bce4ba51a53b8834e374f5ada22379e00db", - "2a25008a2cca7952af736daf4c493fc94697e2200794fb139e4300ba2fa86157", - "d99c34592540df521d544862eda62f880c1f88a92d6ed2117af4faf8bed22a16", - "a4f7794d9d3d356c96bf56008056b12cebab3bb6928a91a3d8849f41f21b0652", - "32e1c7a6cd3d95d6a8905ac24e3c59fde355b9f574d43005d8b1fbe6335e6d84", - "fa03173a62e534fa4a3dca6e3a0ccfcc1206994954b06e4baebfefcb3c840128", - "b140c4d6f766a60b150f07df1bc065ea64e9344a94eb4913fc59f2fc1bec13bb", - "9bc381cb36a4270e2bdcbefa694684fddb0c6c48323c02cb804c438ad4c89759", - "4424fbe11fdf585a343b831451a75bbb4fb3e92c11424c8329580320eab0e7ba", - "f22333d1a29fa79a89c93722f71e8bf9890832da60c49c9fad95ecf6fcc9549c", - "2d0505a28a785ed9403cb2126e54172845db258e7e1b0ea07a4471a9cbacc6d6", - "42df554a9fc73ea767322d0a2589e4c6d71de5430d4b15891fe7ad9edfdf145c", - "98cd4d891e8707e009c30de01111012d84b14c4235224225f8cddf42a6ca23e0", - "2c6248367e1f781ae67cef66f17380700d8f25873eb784d7ee76bf841abbd287", - "4e17d8f5b8c4ad0f0a2f437c88d6b886832e650b50141cba5803658686dc29a4", - "1dc530fe0f5e01fbe08765ebf93efc0eaf012d13242e3c45bc765867ef4c78be", - "e0afabbf150eec8cedcd83553069de8ddb8aa8b32825349c87e119b0fcec6103", - "0f15eb8b6807669bde0cb0fbaee353b5eb075a721d3d23392b22a93279a1a371", - "857fca15050fcf96489fc6c16b93551227c54aa71e1687654cbc3ba197384271", - "731a01c0df4e56552ef61424752d09a86dcd000c5c962270f583b3bd82b4c920", - "2a4f5e4a324a8625001bccf5284677603dc1f955c93d1789d15078abf68633be", - "2428448619f9ca0aff61cb1172b0b575c657e1740a07efa34dc73e2378fe9f12", - "634fad5641642d12d7f2bded45e256e8d253447c0b768885a8a3eeabf56c5d22", - "97eb050c73fe8f4d7e81f7dadbbc2004f9cefb4f9ee167687d3d23111210e5fe", - "e106e0a5d737436de959af81acf324c8a4ea6dc1bde06055c2a719bdc642d41d", - "090c2fec4f278f527f98402717ef36ab454c5a9b7b50bb1a726042347f1358e4", - "611e66c0139355b419c5dd26fd2c9cf5f2cea143efa09afc469042661309b9c9", - "a2ae2ffafac4c903aa002a8bcc5b83b96755f746be9d3b4a8cd616fdd49b5dfe", - "e9f63494e1f03240543559072373e4bcae553e39dd45ece5e2fed9d26a7240c6", - "0c88cc492d3f1e7549fb5eb823cdfae5a64f9d660df28305bc281e1436280d38", - "5eeeb7eac55a4910cf3f6eb91844fc74b713c826685cd6dd87b979f9c2aa7cfb", - "a677f492823775d87cc3362e14c6d249b0b79a32c93a75eb9911c696378efc8a", - "7bad4910c7d82922dca3ec206ac96bb7583f9a8c91cc51958b2a17b2c703ca39", - "b0790dee2b65992249b514eda30bbdcc656b571e3d943b25ff7674a94d60f542", - "7bb9377946592424221b5b68664cfcdd1f4a5aa44869ea9a354b2c0f460c1131", - "16d559863877db6595be99cffe92f75d22208e3bab35c8c9a883ba7466218598", - "43e2df845d2e5431c90820d7b3940bef9771d7a554868babbaa462852d0d3edd", - "281d101ebcc8e4213c20a4ac88ac300e2fada85530f9be12aff2073a849bf5bc", - "b97db08028beb02e6f4ca800f58da022463ddf35b533093c9c1b58401a7a8e72", - "1b9565865bda6d67295b6f100bd8a466162eba7d2b2ec3bdfa2f5bbb1d2186df", - "b42a880912c92e119fc647c14a5cc761ffd102ce9be7afb8e17bc06f9743c788", - "2fe1b870385a74d2e13c3b80479617f1bfc2208cfa047e083f6f893812f6ce19", - "b88ee6249bfa6166ee6ded1aa7da72ce660fdfa4c8753e44e56a92b0c3c62728", - "6a8a77f0ed804b11eff9fd6267bb9b5642ccfc77c120fb7c07bb3470d7b0c0ea", - "17ff6c01cb296994a930a0c40763c1923f4f44f22f7b10c37e463fdd054041bb", - "ce8996931f5216db6d6711c75564df6fd522ead5299f3ddc789a9b303cdd1074", - "9b54aca7ff0b4ba2af605409966815ecead79e7dda2e4244409a78cb890aa55e", - "d9a9f551382c32c0e89783fb1efa6be05ff671d5adb0574fbcf68c45c8ac665b", - "4fc394c89caf60eedb5c14cdb4bb273aa3ec3fcf55bcaac9700c94e0795e8ce0", - "e1f276fe11dd4b9b4621aa63d6729437aa1bfdac4d6e7e73a1618af7b3e1dc67", - "63cb69a6c99f2fb7056537bc77cbd94eb762e715810ba7267dc64d4647fe70b5", - "0a11551c46f6f8ab617a89b66378f0613f212b34366d47a36ac63bb7a176a854", - "817b35b8f576d15a6b6241c9e4bbb51119fd9ece6e6cf0869659a8a1d120e53e", - "b588815e98c6873605a65181378b7df954ae341f9a5e3cb0448f531acd4b052a", - "41cf7596e3656cb9ef2c446999d96f538169d4b813703eee7fab118711456d2c", - "6471073be6ae12e0e4cdf6379b1fccf4266661892bcb9223baae522d2558fecf", - "85b6ad3dc3e238b443407aae0bd0be897a50299b8e377223500f0403ae8da050", - "a87478d04773a2fe16d470c3aee5b836c63af39cf192437c34fbcfc079eab9d6", - "29dd35328814bad5a0959781510c614e1fcb612ff67d812210a1494fcf7c0a5d", - "51c310799a6e025154fcd2a05324f549e136a304c7c1d8601a351da08f0b9ce5", - "584047a560453a5dffecd2e8e52f8e6b703966c1829662a36d2969caac858a6d", - "9b7e155c6157c88542861304b8f15f9f45bc3199a6b048081523177812278ba7", - "dc93db3fd17f8fd84a5eb24759dff76b7db930f3814a119aabae400ea6dc2d5b", - "af8a22f6037d23c66a587f90d949db84576f33d96274c31fff2e6de7f9adbcc5", - "a821ba2855d2d1cb7f1aa5af3dc462512edd925c7a2b3e81413171a277adf93c", - "d46145353fc78d94923d11a6a9eac6ab2158e1a4fea3b5c7c1a9c664ff033d18", - "d698a00fe76f1482f05dbae3ae983871006f7275665a19fed0815b1f4720f872", - "3d2eb7cb2939ff2df715b9851ec01a919dcabc55f0f66bcf52fddecd534b1b5a", - "cbd0bb85674994af30504ba9e5eb0713b636ee5fe72f4b6286a181c2086714f1", - "d677652efb8775d51e4aa72ebdd6d8f86905763b18eed9a30e0337af103ab70a", - "07da5b1a6d7a87c5965c02fe04dd7e08b61db13dfb86957e33a924b84ae1fa22", - "4db937e9b9be36b7218458a9b16fb1c4531a6693197bc5475f438db9ea9d033a", - "a2701f10df9a838a9ed9d4856780a373a7f9e198a17b7238544b907ab226de62", - "da3728c345456955191fd1a2b218dbe5c2b3fc5575ebd6b5f8543c643d480fe7", - "deb5cb91396b889f2b8acf397b1408940af97f7f3a62b83553181c5170971e15", - "5ced457675e28a349a0e783eb8b7e4b590482a8fbcabe5d718a67cdcc8cf7d78", - "475d70025bf4cc4b18ebc6bd6450d59d5d4716556adc706c066e851ea75bc4a2", - "6d803e9b2f400068d741b085671624ea66492464a53104d1e7e5fab1d72046f0", - "7e6f2e267a19fa6e403c5a3c3c9bc174ff7bab0293d3164d8e023e2e50f92f39", - "df3de1e36a45b8ea9b85282cf8511b1bba8e0ec5bf0812b3d885fcd6f866aed7", - "361ca7cdc7536c7b0ed8cdbabd3ab44fc229e299277cfe288103e27f738223e1", - "fc595e6d04fd14ddefdb6aac75d591d1371358fa0b13affdcc34462b93bb3e6c", - "bee3d9b83b649782fff1f006d85522b4171c2ed22aa9893ec3fe56dec5a08740", - "446ab6973d8e701855d76cea61a1e6942daae2f1c22691575139bc262e490843", - "77451d2ac254d0443c2816f6d57f334705ee86e60a4332a6dcfe23dea913ffab", - "bc05d1244d12b2be76f5d9cb1c0ef798f2ed9bbfc1b229c4f1a253796e7a4edb", - "f14657e26c84c29a1eac19d3028fb81918e5e594708862be0d3271858741fd08", - "70ae731473ab81026b617684859373feeddc66ddfa6c5f56458312bffcf0f71e", - "9a076abfbaeac76c2df7f81a55c6a6377378e204473391b21ce8f886c0b7a1cf", - "445e6f8fa9f51f4e39863dc0f892572f3c30ab5306bb841e98f7c40a3bb4724a", - "5c958feb4290e9067ea0e405662a35207f4ba49f1d46ea85de2a62111638859c", - "eb8a6dff28a2a186ca84e536458fa91b72596e2bc6b1a345eb3dfdf24907fca7", - "7717e60d7b3a1d2339baf873956f5597480ea318c9242d456fe724be707933d3", - "9554b442ce3ea6c162e742ce443da8b06d5a890f93d25b30354bab1593fd2674", - "49120ef80e5f2d83a1174830c76d9138e206528ab248dc909a29f80cb27376a6", - "858eb2b19c4a1dfe2e10d18ad6e7746ab49a2532852079741b1d75bf874c8b91", - "e4f5c5db4c374a2d38e0a9173b802074d543d750f073ae716fe88f85a8948c13", - "65c000f8e4bf88dcb331097fee0dd34e66934269a7cffc4a413946713cc2d3d0", - "c54414d3b31f2afb6fa1cb99beff17239f8d0902b600918d12a71049f76ddcbf", - "59cc0f57a55e148d668d9249cf0b0c1e8e0e1cfa875ffa7a6dc48c6c21130697", - "e2c315e25843cba4d4b9a73b71d40b280f9b09797adff5312e5c1c8c119d27ab", - "cdd0349b13db8b7180fba6b6177856b13227f54e5cfd721223e54adcec1d722e", - "b63a7ff9cd31ce99e5e36569fdab548aae32dfda803c8438596f16dae3f64288", - "bc6f07f827cbd515b5b3ab9e11bbac4f57c4e39625228beb41408abacb4e2cae", - "e61356d523b87fdfea05bd223c6f2b1d2c80ef93b5f88e5879b5a1fbb531637d", - "e12f38500c1161b2ac1f259218ac59ed7708ee29d077eede415789fba3fdf324", - "99c9e8e381411c3e252be49c80ae3857c66a23b9a895bb54f94c758e03a7e20b", - "533c5ffa1e3fbbab51d5e0a9a91f86a3b8e82c8fff1db64137b3c45a6f71b0ad", - "115b11d4969daa50b73e08aa6ba45edf6ea307a91cea7de21801727fdfca6a49", - "0936dfae634e87cff07e2d7d43584261e4c47bb8ff4c705244f59fcfd648761a", - "a3a2cc8ddfcb38aaa025cb3ff4957d71fa31c95acf432c2753812476183c98f2", - "e59d3edf691a19758a6f6a7f42fa12e6e5c26ef432fb258d880f6ef648bbe63b", - "664042813064a3f9aea65caf14ea147d246d26c0d05af36b019483a5a488a657", - "6ead6433d872bc855c568857a8f443218bca2b47b6f707773e229f9a7e85a94a", - "1155e4d15989fd97f457bd2fdaf7f2675a8bb44869a306096a20ab891601a053", - "ab1d09b02b4c7bbd389870d43a0035da9caf610d6ef1dcbaf2ada206a44f8dbd", - "1e67134f4af70666d266a8bb9ab9202df2db019810353116e7bae685c01add28", - "1e4f130dd50a273b81645ac9464a21a574813763996b1202aa0436921571b9c9", - "3ddd8300c1397b54cecfb5cac68ddf3d223d61d2543e70ffb468f956e4596331", - "4152bdb60873c9eda7857ded474b66c8d588e00b62b4d61a4a024ce0799b39b4", - "74a75ffb76d129ec99056d1d167281c3abf49a026db486610d77d208eb5cb085", - "9e166f4f07b0a7ebf0f57c39eba32c76f7a4a40309ad4a622680d82d1b6e760e", - "ce0572bf760008d4629cb4a1ff7e2afb1d89fc42e41874ee4dd25c7465069bc7", - "cca89cb92b54afdd843414d04ea03335f448e6c46aee5d886ba15ab97e58ce05", - "a99de5761d159ab199e0f6343360ae9e086df48f55644398047abf1b759c2565", - "94a063e9a0ff712f854a4c2fa02cb92cf255fcbf46c96b7a7657159cbcb4edc2", - "c18b9e24a037875da38a78471d5c870054d3cff076197625b4cbb02901834225", - "c4fdca397f5d0580faf3a3ae0746a854ec6fadbb5ca5cbdab0c3dd8c54c2c64b", - "ced4efe405027d757934da6de78b815a56abde565160f3965dfb05f888c202bc", - "a272ef511646b430b96d9f24b9a7b7f0f89cb5f2144498751863ec6ca533140b", - "4fb30035deede839237e32385ac53898413d6ea97c7abfd6bc99a311622a218a", - "8972135997a7e6439b099a35a095bb00dab36ad1ec86d13811e1f67dd1dcdc8e", - "01fa980dbd23915203c39e6f990150fa7cdcab6b870f9b75e5e8edbddbd51832", - "775982022ec3cadcde6b22a76f9dd0dfbcfc93d0bb04d46d41201f833a265346", - "4ef07440521b2bdd8accf720ca080357d46899df608e68c23bea03920e8703ab", - "07469715ae44405118cbf053d58d57967474bac6892004043042ed69c0fccde8", - "46aa46c1c269931da132ce635247460ace3c05ee0d2b9f65c4612fc31101ab4a", - "1a79e05ef36af4c2435b09ec42b8e3f16c43a82ac8d13ca05fb6b27ced03f452", - "d346eec8ed31bdbe7563934ac0f6eab1d0c37cc95eae6fdf808b99c8f0184951", - "9494f4fd9622d92f3e24f54b213e21436589d0664861fbecba601f655f07a73b", - "ba2c7f95ae50966d8efda3d55167e7da3d037e05f1102a4a5944077aa801f6a1", - "5687781d17aaabe0fe60da26d92bf075a49d04f359b0173dbb8586e40fb4b7fa", - "aa55a1a6dc2d32c336e354dedec7098da4349fc3fda264eb7e565412440a1541", - "ec815cf9cd0bfcd08b720d57f85663f4b8c5bbce52890371b7e00309cb4ead4b", - "dd68b4f968fb8e94cca16f421d93d7cf679c9894944d1556771ce8a0f547eac0", - "bb04392ed972ac321a253766268e8c9e0f96650de7b1e98a04571ec4cbdbeca4", - "9ac9383558eb72ad99fe37ace3c52c39aed327382d20c8e5a5dd848c3c2ee379", - "91f7b9727775b5cc0b8aa2dbf5207e1f542d5f65c908d23fbcf10b5e436d36d4", - "3fd8e86bb417147355127963ce0b8a1ab4fc0556ea4e973732d98ad110906c6f", - "a75b75e11433d9f14099be3f16597bec7db5b07dc86a3c68cc158dc02bc037f5", - "2d1cc3c742df8fa75bdd80bce97d3f75be80a7daa3292737a2977caa6495ef5d", - "627035cbdc053930fc44c7b40f050c89fd3cb3a9f813b6a4de9e8f31bda1f338", - "d0fa90f14a622b31cf6a32a6e2b8dbf0230a4f266e3289236dd8d5c14b0462e4", - "cc296c3f12e4cbcddee316ac3f035d8c3bcf6016c8e4c66b72dff4281dfa7e18", - "098cefe267b2cbefa7a1b50e4d2b8a898ad554a42df3d9e56a27875b820b304f", - "45e550dfc705c928487dabc1c7b9a834f3d797845f31bbd31d4416f62725bb7a", - "8dbeee6b95aefbaa64f8be00495c4fe5e4bf10a2607be393591e79c2d9ff4574", - "981b68548b231654f9cc6dfbc60a5cda593f0fd4d2d3accf8ed421055fa2ce71", - "5e1180076d251430e85ce172126a1994f4b9256ca5ce8bd752cc39b3f78a25c7", - "99adff9d3d1689b0656ec9e4c56c94d25c39472aab334debabd01e3a228acae2", - "f25668226c475566c96bb9b7c380cb5f5e0687c88690b17b1c52f9faf3a88b3b", - "b6d13c15c49bef52d4ba9f0bf826bc1f7bb2c46181038622acbf906f8e45c6f0", - "a6b71d50767ff8024264c553db9fedf857c9d047454488f27781a65a0b99e4ff", - "d6cd53dd4ee9de2ccbcb21f30af4ca94e43295ad7f314308df4fdd9b961d7ac0", - "21860e8e16b773c12934a53e4eaf6e86a845172ebca07684f94fb6d715d93264", - "e6506d46cc9c08bba971b9b88e1c162ce62eb0422005b73640a5cc7756846dfd", - "268f5552d16836ccd110e53dc137f2e2e18f7e7488fbc0fae4b5c7a7729d9db6", - "dfd37742119992d74bd444a3e5d0f3076ae47713a5cd85adc9852dcb96fc1ee3", - "b0dd6f206cfb1b762eb7c627567f35743b5023aa8e6ee6cd765a2d7cb7c90ada", - "b58e811c85da4986dea4680b9d70413cf77f5f0de52b589ff99b8af1134d4c74", - "d69acbfbc472e16048aec8d32f6c1569726daa364a9585e0d25ef76413f06af5", - "4923c54e18819068a81b171377073fd030f293270cf50bf2bb449bd9ed768f7a", - "415389a5b85dfee900bc329699e07f788e8032afe06880435be3e3f9ff398794", - "3de042d5911d7d22228b5d418db3c05a2c31c95eb8fd5a4112556c98eec04a2c", - "e254c68e69dcdae1f417da229c07b355d18790ff836685fbcd3877254626ce02", - "1285858200b66730fe981842a232a164a1176ac5fe4c5e5414c3d66aaa447f1b", - "b89854471318927790ade4cde29ad28380fdf5e9d21d51d737232e9cc86b0366", - "0186fd0dcd6471bb7747615941161e5b1de94471f7deb379607e42b705a4d4a7", - "39ac0aee094308857091dbafe12b5b734c2e7abb0adbd68c89c0810cadbd2563", - "e4ffd8a93fd118a0d9f92b3b1a0c923864614652c3068351af05ebfffe663850", - "e7959cc61545cdc2ce25ec72f3027fcbf5a9952f85e33a14c719bcd6f398c61d", - "6edca756a9b77494ed4bec9e497365eed8ce3276772e826f4d2b4ddbb683e42a", - "5a7b7afcda388f624382632ed4a53a948e06e5aed0b8c090295f2ac8e3a881e5", - "183d19a2135cfb758a1a3447db3992c62af2dfa4de105732db365e06314b5c19", - "32e8627652f33545feaeb2cdcf337ae6f553e2b7e8c9ce582a31e48ab2d3c205", - "3d4cd03a972f271025288c2a4ca670830ecb700d15a414768876c131fe5d0195", - "5d2334acea8c38a3b0f220d5b8035f25e538239c25b20cdb7d8a075564f24bf4", - "7c8e07db9efbdc73075e301d5fc0ec38a99b316aff020cc93b5232d6e6e8fc1a", - "869058cc0fa43d439fe78da6090c51447d11092a75eb9df3b2cdadaf12ad55ad", - "047b0875b237696c217c42b0bde2e8498621fd918471c3ce4330e164433ce760", - "466a8d871181da45f94caf8ac39d78c3cfdf2462b0b85c22e7a8e68e9c1678cc", - "62586daac49e2beb9846a2a8cff228442a3fe3e1782ef10fe3ac23aa7c3567f1", - "ef1e9dd10aeecd0b1ab2c23cdc6e5ff27f44b99b0351e1796ae32a6061ea4e33", - "3f9f963da6b0a6d65c23fc989e69386e7806f22ac4c6ad3f37d9a949eeb631d8", - "82241a4be7e5bec2a0057214dd6dbef564d9a9f292515feed1707420bdc6c11a", - "3cab153d0129e3df47e57e9015c4f63c27372df5c4dd876cbabb7755987097e9", - "63c2579ea27d0df24cf32e9790f0c34456799ca377a25e24bfa9e89c9de7d9c5", - "5d0aa06dbf21c86fb6bbc2fbfa356b974c5ef9d9129b2c89988b4623abbc64d4", - "914329a328e6de460542f920a027a7119617e0fb9a9401486160264de62865ce", - "3020aeb609e29692dc25c86844c296872e80d71e4e312089abae4d2a5218f4e8", - "9a333ddbefc6ffa7c6300b3d838b379f9aa32dd3c3407a7d4bbc9926aaf66260", - "c1ac46ae0e8f6f528e8fd00ca8a1417ab596d8161afaa15737290d188cefcc3c", - "dca1823e31b88bf2874b859fdad585ec1c2a1185bbd5d804f0ae668389a2bf03", - "f066042a20bf98860b4d8eb056f69af476208f79a30030077cd3f730ce78e956", - "b36c0dd674250346d8a23b350d48b48401860de5f12262c37e84ecdc8c268b11", - "0e2dca1a7f0423bd3ea8ec667d81de89d6c0ff50258d1f21f89a8b282e17e3b8", - "26e9cca2fcfa137c76aee19e2956047745aae5954d316ea35b3eff463b7be5a6", - "ec97b85ca82bc2a9cd4b301b9971f8a3d6c98f625446792ddf5758d12c3ab396", - "3a84f277522477c6c2ecb407a533469c8cd9bbf894479faa4e577a736cd0dcec", - "0de4132aa12c8ff93ea2e4fe553640ff87fd4986864da6a34a640012706e9e01", - "3a3c077e38bd05c82d33b8dfac0b88b1720039c7b8b755449807410f495a59f7", - "afd2e78369e97f4cf21f24a1d8e5a45e850e9d6a9055b3e004894b995e963127", - "e869969d4d25fcca42275ea51c417273891be8d2d279a08305a7b0327b123b74", - "3c75bbfc05e4a39187c61bbe00da81aecc0909bcd60bfeb2a999887b0f5cc549", - "511220d215a83d4288fc345a1fc1c8a9bcdf7a0e8ffa28e6d49882bd06573ba5", - "a767a51e0afeb29b0cff8f8ca684c87c5d16bbd808cf0a3667ecbabe97624ab8", - "58d04c44e155fb6140694b74245e8fb31d1d34be438bbd02ca8201a0536424fa", - "02839d8e3b46d9d874accdc774ef8c3ecb48929b55f8f92a7dc4c082de80228a", - "fe2365c7ff522864e08803102c30fbd5b6f78517401e4609163333c100a938ee", - "64b3ae484bc991cfeb4d5af43253faf5b87670d84aa3f1b43e15f7b3e87a6475", - "ad788a5ab1078afce7c51ebb06c4d8047f09d3abf6d79fd9a14dc847fd1d6cf2", - "7fc709b279deca1e4af803e3a72851da6d65cb4e3502c088a1875e7ef4b658cb", - "0dfe838c98d26061caa058198c4cb297a0cc8f2184a45a6230450dd46ea69a28", - "2ab11b199333c680a079171a17b52414c16a5116c225d8e687dfc80447ee0028", - "6d59b35c77933b707baa5f73956142e6c607b80043dbb50ff682f64dfcbfbaac", - "b8eac134a621e4a32cc3f8c10675a63d27b41c18cfe63d4254f99e719101052d", - "9e19aefc99b5da15909e6e604bde74b6caeb39dda8a5a58ddf4ce5dea096a363", - "63ba4f72a573b67e6bfc41f72d0c01401051be30684573dcf16fba3e145947a6", - "7b585fbd410ddfd602361aff2de932c197ac004bfacbd71659d6fbd99a7a7623", - "4df7f7ad5b230cf7b72fdc294d1a42ebe205bd1ab10110f437a80e0fb4854393", - "3501c2dfbc2d2df7505e3e5e85c4b28fd6f692aabbf57195d0417571eabe8f35", - "13fb19ed43a1272d7acbe251b301d26afce0b6a52e63a340fe390e0741996c9d", - "b09b793ef5d7755def8d2f1177b2e51425ace67e9f2825ebcedca7c88d2ff333", - "1bc0472b64388c5ea3c02622e05607e1a09663c6dc4cbbb1ebb919f57ff939d1", - "37a7d3fc1af6bbfa15a4d73e158322292312907db49f045d3f4b0295b4ea9d98", - "eed639b2276a476b93b061415de14196d1888db510790e3b69006d06ff31d896", - "f9f8506a411c63185c0ec9d45a00ab3191068dcc0d669a1513ffb2d0c1b36270", - "87eb3c2a2485ae7a5547659de99d2c4cc53e8353a8344c4a1f51777721cc559b", - "662d56e94b5ecc9a605dad2471b862b13479c3fad819798dc1058a3d11082b0a", - "7d130640beb9053d63a5001b30985907b4ee2a4d43c0e848c58483fb8328f07b", - "39f09af1fbc937847f771c58cb386a9371b86399c288ff22e4128df57195d969", - "6da41bc3e2b7c7512c63ea177b1ed9e38258f02650036a984cd6d281d2cc2623", - "db3ffcf7adc8c0c979732e4ac72d3f83fb036913a181259b05a76dacac6bc93c", - "3a4e1088b5fb3196d15f500fe218eb53c8f26a80aa4035d0a4e2abc8d2e2b28a", - "1ea233c98283622b52fb55f15e73a89df4477bfa0ce7ebca376e78c874d845e7", - "38ae0484242d393d9b9cd66a31e3c326d45742cbe128da52ae8b050e32c02a8d", - "319a8a240bc062c2531c026f12301d4dd85a93cc6bfeaa0503520fd09ee3620a", - "e33843bb3b932782b4039ef6f22bdab871444dc3e189823456e68da235af5c8e", - "02aac9cdc1e6a70bda6aa2316a1eeffed33b6238ae75cab68ccbca313759bca1", - "94fbc8f788074734b72b82d59765c1a2f7df19f52120154e898584e76deaffcb", - "781502f1481d1057c7f8d614864838be09b100876d18e46bf734070b3938e8d2", - "7264976690cb69fbe78bfd37af6e2466f128cee637bbe6cdff9273c670d9fae1", - "d530166ffbff85de74030c8739286576cf2b01ba9c6139ff0153580928d47392", - "d5ee9603077fba59072f9bac39e5e4f37bcae4d80e07699dea398cd73ddcb9df", - "2663c99522a8c60bb62958fd7f1bda846e865947bd360745cd0f04bb27c7f07d", - "9165112294ad9f7aa549b3f8678d08aa06083a348342f90de79f570f096668c4", - "1f170016301b5e8458bb370dce9a26578d9e8a3c738a3f6efc33820767797fcf", - "6d0d742532b4ccfa145fe0903dbcec0221513148bda141a0c1df29a261aef0e5", - "fbb74350b41a5dd8fa0bd4d1e8aff777427794828fdc845034175e713805f8cc", - "c75a1a78a67086b63135ba2d6f204ac6350319e9a9e3dc4513988358f5a3be37", - "bc2150b42a8803c2d4465b8a2e135c9555a36e0e8931fbe736cf89781454b43e", - "d44762f1315f199f71c26248bdcf7bfd884627425b4b81a89ba14d6c75995ef5", - "510f3e53be16b7e3e896c88ea173771f0decd2f4049ed552653bcc11c3e754d6", - "c64166d64a8d4809a11b328b18963c6a4ea153e3b8a13883052325c1fbcedeb0", - "aa8b789010f1140b23564cfd001bc41b4adf94398509b729869ed630c4b3047c", - "18f380aba1c4a4c68eec9a131cada5914ec09e33322e8402efa72f3ed53672a6", - "d84b0d20bf285ee0ab89e2c03de73abd17831dbff31873a954c83a2dba46ac81", - "596ece71363ad9d29dca09df046d4c5ac4c213f9a2c6010f468828976c47e309", - "b2b4a75f59c4717d1b47a8de0714e782b93e690222d45dec3ce1f2f5afab2280", - "9e9a197463e131abdb5836d7a9dfe64bf400b2bbc8faec5f8f12615cc8d6b044", - "022c46a4ea50015fe32a98a7b2e615dec53493765a8f10a917596c606f91f773", - "9c07698055d9d9f24b3072dbf1f9d8376d20ee689827cf6abadc750bda304cdc", - "642b0cef1430c5bc65f8a23397e4778562f6e73019f9b499f5e700ec6b3d1395", - "66730518c89c7948f8b5541f3519b3286168b14321bc1985fdbe468bfd2e1ff2", - "291936e5912793c3db52495a20faf4b1e9db5982969cb2b2863d9a87e5d00f5e", - "aaf086287aa8233723a6e39bfe459ef608c1de00cc414dc7f6c23283b5066ff6", - "6206effad9ee2e8d1fb1af2439583af397f8ddab9d11221ffd4644e34f7d7d45", - "1e112c2ce7b0a4be0015c3632a4957fbe89e43ca40b8299118724e66a2d2dd53", - "a4d8d81e8c3086791eaadeaad06d238fc90238b99a376ab82120940a505edf62", - "dcd302e925a6fc026385e529ead13f695178d6dd5cc3306d48a060cb6020dea4", - "1f0d076aba4464711803a5f021266d233d6680898398b3afc8fbf94d51661b09", - "8c7c91241573e8682e754bbaf6cb49e28b3a2d400579381b09a8afcc8ef5ff86", - "2d2646ae73f3617745c6113df1d02b1b458da9fb8532d101fdbca10e3c168042", - "9dbaa4860c4c523c75fae5f6bfa4e1b53863718c7adce2838e6c60c418e7137a", - "b90c2b70c0a95dfdeafae70bcc2e7c77bddc9a736758c8d5de77f71ab64aa5fb", - "f15360bff1bec7d98905e1caf4c8caa00868aeb1098b1bfebd5264ed25bf30c5", - "42375ce17766687e8a123aae00246cd6b2530bcb18dddc57b1690049b4a03991", - "37eca94fc788279b941d472ee78b50ca2bee818a4be763761f3ace6fd77b811b", - "f5d5ed1c8f4105134960d88cdd24e0c3fcd7f748baeccefe10a1fbd6ddbdbe1b", - "b1b7cafe345838400a3bc53e8c468f570fcacf6bb2e12d5a44b3a4aeccd5fdb8", - "6125d5803f43e7453759daa9c48fe26b819c6c8c334fe238497c0482520ee94c", - "2c5301ab279ed11e51378174f726cf08d1a3c64e1c95e196eb09f6b5f51bdbb4", - "895adc8a7ce44722b86573a95b085a33306d9daa2e817aa8c3984fb15dc3322b", - "3e31fe7edd039da39f8876140c10e183dab7aeeec094a09f35404598dcdeb22d", - "3cb5a5272205b6ad2bda154e7005de6a0b0abca4f8d9c53f760b1244b56e799e", - "6c51acd1339bdd5f98924cb1a6f52db484f8019ec569dc4bc9ed6056fe0bcad0", - "6eb26225809ea24dc981f20508cb4babe78a7a71e44176de48d9670278798a89", - "f11f3050a7889f88a64b53f80362dc1aac3b2d419f43c5d84c45e78f79ab4f5d", - "d632d892ce08d633615c60617c097d4e206b6ced191c9fe7a48a2314ae2be2c2", - "8536561c21a46de42074f61482e3f10b427bc13605e19cbf0b6907bba8ce69cf", - "cdda31e27632d75987e07f67cb0b3ea405ebc34b692d83ff79225f0e94162ffb", - "a3210295b6311911843f8b9dda089729ff6db420fd588c15899723ffa0a71897", - "61b8378c8ddf361feba44d3c4bc8620314d5730604c69fca03fd45f2fb3879d7", - "951b9d964b68fc1951851ba4680fcf9dbb4a973838f047caee8217e7b88a2992", - "8ed431bf8b8be79621339d5dcd236e314b985d851180d4c1117c006430df06ff", - "3175d18aba7dfa13164104815c7e4682fbda28cca2a20a891c6ede57a73af578", - "2d2fe7e50d420d251d1885b9e976e604b4b95c9362eabe068c069e6e1ff27fbd", - "777dcd4039c7d09380e72851871df48ad6e54cb9faf7fc455460f5e06965752b", - "358782b5adb3e7432614d45c659c5bf075b2c16ba545be9696be5ddba6bd03db", - "835be67bec88f591ee58009610eed3c1759844eb68522adcfabc810b61176006", - "d4eba0225c21acf256f7a7564653cf2a67905e7cc2427b2b861d6461ca39789d", - "7e62d356a9acc821174300162a618ff7cf550973256c1e0da4dd7c55b1965cfd", - "0a0e7aae61b7ae313c73bb1d960b6c121b581913c2c9c2b530d06295a13d0b07", - "a0a4bafae77c76792048cb01329ad5f0d3c46d59c1d9eebb8c948f085788d33e", - "d466ad202cacd679ad36be4c9a3a16608326bae6241ba9d4417c889d04149b6a", - "9f49ef973c629236c2780f61a27281cd291c2bb84212172eea4b7ce67c3803ad", - "4c91eceb41a8f4b22a595631359fa0a9f1d1002a6f3b98393dc76762244bbe2a", - "51ec6b8cb31c317626f41bddd34f4b8fc03bc5c49bcd3c1300e044dd4b0933c4", - "976c4a5748235872a922ab7e9e4c13985df8f71a3aa16f1c4ad8c0a00c091389", - "6c1ec2decfb05234a2682bba66be3a60853ca9e14d0e2fc0a690eb5c1f0f3c4e", - "801269fd71cde00572475d92098c3b91d58cf897d512136696b3701486b87c2d", - "eeeda60e6dff4440ee709302ac10fe34043b797e5ac9e17b3a5fae3fe31a6cbf", - "69c939d8a103df229a6644c569dd576b086930b9dc7c246a650155a02e9458d5", - "20eb01fd16149865db69fd7d28801d27783d56318ee3c714f302b6f23d532423", - "868d4b7f44ceaffb9c9fbf862a8403b56242eadc92199dbce7492f4d8b57435e", - "5c8c677319567bbca940b5b68734223db0da3a73c4799ec4133ac4feaec8e2a7", - "e9a8f89ec292c9373fb33160df5761192ddc1cbfc1786659fc7c6342afbe4185", - "bc70c7baa3f9f59c3381d223220507b3cf518cd2a82e8e2933f5f8e097a9e7e5", - "ad3cd8630c235c5f75a311b1f2a33243b7ccf16a5574579a846746ebba1b8a7a", - "461b831e1744ab823d9167acd19f97ae807f7af7fb47f4e078e8e28891d865ae", - "b18d0a90649f0e06cd99553c4f4b30a3463db6e665eb9357b00a4e82b8b9799a", - "ad7f5035202e243dafc8d4724c920c43a2f593104500c9b28c6b5b6bfe04ed8c", - "609f4b837e94704547bf46a50a74b26ff07c2886d038562ac257ae4889fe46c2", - "ca4598dd48ce079ec850bd036ad01c6facc0bd2e0fc64bf8d04f6687187d0247", - "f4ea140fdfd047eb8012223463cbb7f425aeb473c17e26ce94ca8a3637d728ca", - "8a924fa8c6b333ba98aa271f87322f09ad11efcb6f4ce03f7b3928b928604258", - "f1b63919575850f04c10ce2549427c56730f4a4dca170bc0de3d903fd64c723c", - "4f120ad44d8af6d92ba3b6ec6f1a786f054fd2b21d539facdf4e9a47d17e15ea", - "d4fe9aed05ab60b03f3840eb4fc2c25fbbf12907045ef4756fba7f9e23c97d0f", - "d9f649d3201a4e30863cb0b67f9e489e07e12b964b7f57fad4d0681d4a0f00d6", - "54d5c216de35224d8656237d1c249d4a518ef2b440869e5b3f9755e4d9acbd82", - "8500169a754134b16829a05cc18d627f4a1f4e5497d4a30999c3c3334f1d7ea6", - "26cb526069dd13f06471a14424154da53011e8e6a59f695cbc9dd02463dcbfdb", - "164320bd2280e8a1ffc0e28a077fb051d6921510ffc1347f3aca27d37e9f01db", - "066031a38a87edd019476b86d0f314da702335f52b1530b155b27428306ed7cd", - "ce5f5c0285a1dfd0808e5bf9eee3b2101b9adb920784d8a81012a84e6093ec91", - "0404320dd7e1d0363251a667a005b4f634a32b21046e22e554c066c09a98f947", - "c645d1c7e82184a448ac55ac4645a2fe1340e6f75a418bcc222e8ec3c0a38ce4", - "e1d002870d02493004dd7478c79dd7ce68540c47e892e8e0aba6571fd45901a9", - "a3370ad71afa37cd3292289315ab25e8834e3a8f45897748c6ac3714509c3f7c", - "99a1351eed690895ab679f3d7fd98674230bab9ce3f08898ff9b04e1d20df0da", - "b6560b4e16bd0a595990ad47cef066a912a30d89bbdbb64a88e96c6cd1e21ede", - "b28de07240c0a0cc59e9c52f321c462d206fd879b5f1a225a6b935e1dfddb859", - "875ca923ac1c31ffa3bc23b2ae6504dcb1da3330815af9f09bf760ac46331cf3", - "9a1f5ab023a177fea1690447bd063a45088c057efc3e9293a26d733bc255c08a", - "34f40f7b5c3e78f7f3440323ecf9a3abc33f5e498e2693eed9b9428961cbcfa3", - "c13d6390477604590548182f722d6b856268d67124765633647be32f997a8f9b", - "cafb9393a2bc2c5ca93a4d4243aeea78f13eb4755fb737d957ae11a187d39085", - "ed354e3516e17c874cf65a791e25bad310f5fe2f57959be4d4975a83e47d3318", - "abff8216a7949bc183452b8872b81f327b0d51be11b0c2c667fdb0458e72b846", - "26c5bfbe69f5e2ad7b105b2c9fb1add762ac2e1d2d353b55785cb12c5b7eb8bc", - "0328a4426ce22ecf1013db88913d1be337a96d6889259de056b1a3aab20fce7e", - "1951eacbc90e1447f2369dd1084c2e0ee1c92f48da692f2e652345fbaaffc8ad", - "7c5c403a905f5e781b235e1a03a18b5f1eefbcea6a137327cbe9dadce8c3e0f5", - "7ea05d3cf570e15a73be1c5947b3c630c598350f86fac8b32fd2e54bdd1c4d26", - "8bb8d1ab52bb7593546086f8db7c778fe94210e481310e0db92113878f66d1d6", - "3b80f68f0cc30f4c8471e771b6815bd633cdb10d9127f018c7f7988a1d5fde1e", - "915b1475cf9c034f647801bb97d9af226c5e72cc060c794da353a9c0e027de76", - "588a9827666463751c016285e378d8edd7ca1fc8b947bed6f62eb0014677fd70", - "50c65f03c90d58353ed91d90f12468ee646bbee6c0dbbdc94f1e218a9964cd17", - "82381be4f2b8421fda6f78fb5b7efd1963d00fe367f0421b5b7d3251b467f498", - "4c9a69464b061c8a25ae2bb03f178d46796596468e40ff613b0421180a611276", - "4699bf6e06e8f44a0c2597363bc66eb3cdd1a15d39babb1a9a208eb47298e825", - "0607c7227735dc87b7317bb95d20cdf525955564465d6f740a49875ef1bb96bf", - "7a2428833a4e5f87115b7c9272962a5633b65ce2c2ceb5c83b7cd1b73c0065fa", - "9fc9340ef5d76442cd683c561ec98706f538c11ca8f6a134d9396cb29237c07e", - "23ed3fb4e3fd253e1a29f993e3b78845a899c128c67edc9397620931dd76115e", - "4232f44cbe9baf2d40e4cb16f632a2f270a18f4471507936c6f743f12fe9640f", - "c78b79ad6be40abe06d0b81df848fa444b5a1fb026b2adae4ef4352d3364a221", - "993fc4c0cfd3a809d18e370f20d1e1db39a1d60096ea3ac829cdd201a01020a3", - "4b5660310bc76a660e842fc011558f6b30cd82c0eaaaf598488063ff9ebe20d2", - "052ff50803e1d7422c8242254c793d808905efd48683009715008af2f62251fe", - "f1494a73a4c6701a280698cda8cd08e95c56915a46fe490b3928ac79113bcefc", - "c041b21e10085ed75d32fb7a5a8d540dd7be58f4b3ba81bfdeea54b5eb13ca8e", - "284888caccfb6c85a045f4e796c39b16a67d56a13f8f429b2bf71315802f7982", - "cba64b86c789f289f27703e0ba90e938d74265fa7275a5f264411428f2cf5e2a", - "29ba7e713bbe7eb57207072038af4c6530f26f628aa189f07dccd1734ee393bf", - "b04d07ec6794a071609b03ef08ff0cb0a65820986eb6d968a33fdbb104d6703d", - "8aaa3dceb52a3180431c4cbdb2d069b502f6b999c0bd25ec81dad08fc24ea740", - "8aef3e3d0952e257ee2f86054b3a73a948b0a2b5e706744cc6b9c4e5f5e7a21e", - "2ce951bf45373d253dc86ded5c8c34cb641a438bb6180630d4fb55cc64c521fe", - "329a9f920b7c57933cf1a4da9579abf03c0ac41c7e6b9a37475b50936408818e", - "51d770428f1a4ad3e00aec04c2bbe45f03091c40c2daf1b154595252064eeb34", - "2301f6ad889f4eead49fea3ba54a347ee1d341a34cbbf6f8d4e39d1aeaf48c73", - "ba307000d8a018f45aa9cedd38d3765996b041cefdef510dd78c12d27f6b23b6", - "80a821f508d9cb646212feeb2750e77dfdade96564038eff69d13c509bd17140", - "edce34b8e1eb8a01d8c167749a7fd7be40b2709439a11a3ed79679aafad278f9", - "c4561b0ece4183c749136f7dbe8c39092d54fb855e3471a65c17dcc2b9bf9369", - "f2c311d57d9e390741be4d95b3f31532c026a207048c793292882e9052029df6", - "0f1da7e805014739c008face8c598a239d5798615cc2dd57f52eda6d14174fcf", - "5f1dc8d39b1c421f20119a205ff6a1bdfd54d394582b324f2c3fac708fc99fcb", - "41ad20e7e2caafe2379a1bd362d61f65a911118b2abbe3d35bf5c82c949987bb", - "74308a01efbbeb0132851c1e9030388830117c9b840febffd226bf410108a9b5", - "0408fb551223ee584a1f30bc2b3314c8e6b814f481f53deaf8bcada4cd991c68", - "4ebe4901c546afeb37b50ff523a65195ce0b2bf6e4258dabcf764101fbbb4f05", - "9cffcd144eb422e2c1862a84c791ebe6b1b432fc68aef853282fccaabf5bc507", - "377528ff0ff251fa0e5f24c50654577a82ddc7389756811adc69369c319d9e15", - "c8cf83ac14c8b4d6efb5ede954edf5283ba6ec02cdaffaef570e220f0911b600", - "12e170b15566e2ec936f66dd2c9b12e866ed5fc2d89a7eeeacb17bc6c0e0c42f", - "0da2c77c403858456a62dd24d25d42b21cff1f1bf3d5de9655797ac6da232ae9", - "a494877bf021a1d45dea517f66e2b05b0832ad481adffce31910c61e4266b755", - "af90cd45f2553734f9b2a591ff253772576f4fdd3d7464bc75f05ae905db8742", - "410744de4492ab27865dddf225802f80899d16978ee570f3cf3c8dfb965944cc", - "240ae21eda6ca098cfbb2ffc12307221eeb29fd25a0a48c944d09a1a4f2531d9", - "41bfd9c3435468db8c6e503e88295a18acd0522d3762b44c2cdcc0d3983c9d2f", - "b3671d16dfa2d8d3692321e6d7ad4ffcacbcedc6efc56bdeda5be99402f8b6b8", - "6af1b36340dc5095c007fd1c593e1db573159991eda52a2ead02be9abc7d659c", - "33aacf67f2fe18a0e9d90c619342950879d76d0c2b0312fe9baa7ec970990af2", - "6091be35da8b46df540660f88748971ed30b0d9808247b06f345412181a56f9f", - "84d01e7ea77fb66dda75af768af4df909a619a59ec114ca29805fee0606c2150", - "1c6299321f8db90e87f4aabf3d0ae2cb24a49db5edc383b3d27f583a296793af", - "ab0638af41f4173fc398eab84211f801ee4a1535207107318c12bcb2e95078ba", - "1edd407c23ea958c13975bffd7100c60f7d890d04f98613659a28c228c9c1f2a", - "6a1243a61841020e7978c606b52919a4477e2fface6f4e8b8ea0ecbc5aced89d", - "81819739446c4e6529e420a614e12cdceb3c0d46b03068c1efce96bdec27dbe1", - "60618a6ca9f565fe682adf650b867535a4a9b00f601255a4d5af4213d28c7b88", - "05ce3f5174a76da69bc512c015f1395d24060e3833dd89127ad9fab6d3636dbb", - "4826ce2c5c34f6b2dc6d7b4d8171145bb30b095024c700b83679b49236933eda", - "fbb86d835a1dec7afab137a63e2816c8d95cf99a4170301c710c2eae61cdf1a5", - "42c861d682fb097f96b9709a153f3fcbba8f3ae328b78ea25896aa63a75d0f7e", - "44aa20ee5af175c5516acfba95bc18a808ea28bd077083cb052c0f4ac34b3b48", - "47b12810506a5b2060cd7c235a0abb173a31e1b551c6e00e12c6d0df3cd284c8", - "918f18133b45ca704d46f8d3d0ff651804dd268a6011e98da7e4fac761d558b7", - "ad4a8d86ab60b1ed2bbcbd13f4c0355b4e2d6232bf41b22834d7eb1c71e85a98", - "f41d53dc1f98af1fc6da4130ec76a96d8c4d09c4b502ab62d20d81f21d726c68", - "5b5dbc0ebc8aff0108a078735919de857b70a40badc5aee34e6dacce371a41a0", - "1f872a98ec2041de0dc8b43d76da1d18361cf6cb09a3d6e36f2734d2ebc9a0e1", - "7aed26791ecb663f0c9c4176db54921ea51cdb661677058f64778c380bf7725d", - "22c44b0833f7a4e5623ec6dda47342f11fef8f010ee7595fb3ac7770070935c9", - "91f7522826204a130f531459e6306826efca71c2d15685d133723062fd376569", - "ec090ce6105194ac56f1f93de6b9486034baec4d2d9cc548f4a21b9a87d06f93", - "010959c6322d56f7e09020a6a4aa180bae752ce66c503876bfbcbab162181c7f", - "bd189f0290116c402e85914e39e52ef18e04f063cfc3d7bd285353b1dad94617", - "9470a5f59764cd3949dd605a245d9ccc4f9fea4db67081260ab22dacdcfcabfb", - "fec700d83d2a459ea45403655969c8010da47f8cead64f050528f41274cc8c6c", - "d49e480e51eb8c0e418deac8d9ef1156155ca5a9855e28ec5b1155c1db33dc1c", - "d56a0dc68edb53235e65776ced92bc81acba0700fa04d9ea2b372248a82b2a0b", - "a045e4c6b632630c1a762817e68f8e866a5a16431e9ba7642d6d8da4d3f56a49", - "02116bcc2ad7f9cf014a7b9a7a66b0c3ca53ffc6a1774260f9144b791e294a7e", - "66e915be04c2352842bfcc0b111dfe9d5de0cb2d44bf6ef29135988b3904a33e", - "800aa69e7bb0aa301505b9817668850afdc5ef32757be9a7fde187525f60ae9c", - "d98161f1ad0afc783e810bf3c9a83ec2df974227d2439669d5b1f1c1c0191dc8", - "a09ff860ba50add720fc42f5b635685b4446ced5a0139010f85c472acfffbd3e", - "f120ca600568230c79a35c259c1a49309e2d8045c4e700805de880ef909bc68f", - "e88f1479bfb7a0777f03fd54d54c5a55666a7551ab5906e389fd89b57d4c2c03", - "72417b1b579717bc6384b522a13b8fb585d42452e6c9caa4ab27bc9421fe09a3", - "d6f6b805db8207330639c79505539a9ef9e1a0eca09c7dfcb2206c50e533dde9", - "58b2157031ae6421a1108da9a05eae7b4aa7b391b2afb6a2d45293c54323cf5d", - "168f1460f92c7ffc99243ef1deee29c3afdcc6d7575ea8bdf745ecfdbc7eaec1", - "dee69dafa4e942ac9151fb636151ffb5ce746970eaa647a9218f7095c8fd20b2", - "018848638d0cb964e85b7837684a739dadccfee087f08c8220bd3940ec774761", - "624bebb8831843c742e05a2f6f2433934df0a075a3fd1c8f2b3fd84082555504", - "dc07842908d48dcf92365e01c746befab1f0ef489f2a17299364858c62ee0137", - "a85872ce785633d3ae87683646746d2e4a1c74cf458fa75db3fa331bece59a51", - "6e7bc0392963269a6937ad07def588555829eaababf517dcfc3b00df5a106117", - "a510cc54a96f20715355647e7d57173afc6a8ab665ab043c9aa43436dea9a720", - "3d2806be1ce2e52402a138146416fc59fd09525dbd9b1d860145196f9f26ba7e", - "f3de6d05da8f192508b51addb35852b416df591eaf4f816cc088042de94038fa", - "81c92955ae16cec3b3b3aeeacde13881fd5cbe1ae9ea940a96cc9b2d653b70ff", - "8550d466355aa1b1c8bdb63cfec5c91ca57f386c2723a6fc8409fd252126d4af", - "d14d42f0fd1f480ec939116e281b02a376c3bf1d3a2422716b9b2fdeeb2aecf8", - "3df0cb2310c1d27fb13df8c5e6890f670a3ebe197fa2b2a435c036110cb0e08f", - "ea8269e1b9b1047552a1d3c37dcb5ea6f466240fecb51437b83a389f17fb08b4", - "9006eb749a47714d0fa9e59290a5b01719ce3d6342e79fa9bfbc818206ac125f", - "f484c85f09188bc502a8731a8ad78ee51d001312a5d8617a52e5f1eb8b3edeb1", - "19aeff21fead54c57b6a81021e339c80c17f02dfeea3782c96ab813a00dafaed", - "bb16de7fae22dd4753f02b95b88a7c493a3b00b345fa37487a9aebd6be72900d", - "6ace32f7252730747188cdb862104d77af6f3d60e486e41c738e7c7dd54acefa", - "3929304f23b554adfd86b1b7f17f881377aa3c8fd4879b288d5f39dbf2f8f39d", - "c3cd8e4187915cac4eccda40087ebeb06ea1ae190b51144880760ccff2296984", - "7d7daa41f91903d005ef398b5d3badccd126a5c3dd14a47532468fe239769df6", - "2f9a8afaa1c568df4f4c70ef9a490744a74411581d9aa71b74a20d08930ed1d7", - "ed9fb80e1dec4d7d2c92bf433b66e61d3d25b824ebae7149d039519d281fb4ca", - "65392c8ddf22fee2e0458bd51a76cd8ac7eade28eb66ea2b2abcce5354d92bfb", - "1536a27feea65c9d72cc040d0bfcae90b9067e83ebde36ce2a14789ecb2760ad", - "4f17c44ab512b68d093a77799af7d8eeeafb37e972deb7e32fa9819813c8a99e", - "940ff5a776302bf9a8b8f17be9391e7ccf149ec0e602d944246b19f74e87dd0c", - "9183333665498411fbd35bc2261838e5b1aa88d44da47ed8af80c514f768ff31", - "c77a4894cf93ea645c7c5587a3e84841482d273e3ba627268008faa6be888dd6", - "336da2b63486691bce305b744ea12881180045e646a91a9188a65b1cbdf584fa", - "dd719ca886dade71857903795d831fff846a1d1aec60b6c682a22c5962d4bed7", - "fb4a7af27e2959e6aaf9fbb3914873268fb999246e81e2b99563978712695549", - "f0cbb5647ea66770938db52db23ea8db8572874644a51561ec210054d47598f8", - "34be9400b561999e9ef40163e6785e0d1ad69fa04b6c102a547b91ebfe5d09f6", - "192bfa89cb47f1c5571a16a75369b8a36be8c0e77c9d7537e20cd5c590f2b7e1", - "52f8b1fc99f9003ff994b4a6e3ba88443fc897fd043fba8715c420a25015fb51", - "9362030e1f6564abcd25adb2485eca9aaa015cced4086abf883b2179b2bbbc0a", - "d9ba54759a208e188e383f16fb63ada42339a9d72c314a9aa9d24f9b39adfc45", - "bae2bea38a68c936605c957fdcbe553b4d0dd310bfd10753bc570a5412995ee9", - "8ee3b7677bbd59219f12e9065cd3fcf21bb62b1e6efb74863e87d96c31528218", - "5a4b45c128f1b63f31b4abb90c0dd2564de4f4bea1e1cd9f5782b78fe3e4a4e0", - "9086165334fb01f634301eb1a7e98a82cc6672c914ea584d79262904cf93c1fc", - "6a20fbbdb5402273fec7de54b5da7303d48bc2efcce9dfebe2f872d9b2e71d01", - "557c76bb5efeec28024d250fd0e937efc6cfc348d5d0c500cd7439ab5a67c2fc", - "b9c796dd205c4cbae31b24bc93413aa8a079f1120e1e9a40a208dfa45c9a6a3d", - "9313bff858a987a9c8c1244277620b950c2df0ec565f72459de2ecda895762ca", - "03c272065f989a158da41d1fd155dae162715295731ea3c8715a41f4cf7c492c", - "b63d261739abc3cd19377ea3729e57960519a3af5d0305db6943996e9af4ce8e", - "9b5aa314b3a6fa39bdd8a612233b2722a45b0f6909e5fa02206b26706d155e3f", - "3cf6dac05098a1abe967561aaf63c85328a85b01d378ddf329570b13594c8c35", - "30436686645ff3e6a7735f83b1716a8d0a1711758059079743c76fedbfd0f2cc", - "c610f4ab91ba6e0e159d20af487831e663486d59dcdbbc7374367f82db549e98", - "0543ecd4ea7904cbc0fa6611e6a7b8e4088810a1e0dcd827bb55b91113bd03cb", - "bac9d4bee5cb6adc3fd7db9bbd7365efa160a82ba42ec3e3c0847fe2044d21ea", - "99e7b0f4692b5bf7f66de5c32e74149293fe646b68c997ba8a6008f8c258315d", - "16be8448d3c618a5040e5a8581bac4fb6446bfb2b6ba488f5b9adb3aba1b9cd4", - "e61958611b013dbd8d94544585c7dd2432acf50d086a5afa26e1051f2216332b", - "827405bc503bc55b6a2834cf28e3a4c91957d56a2f9b490c731aba4952f11ee1", - "fa395c44a47f9a62dd67e50e7751d1b0b9ee20d9fccfeb94c59229a00f283b09", - "69e2b4cbde4a720b69988b0f832e9b22fff68c6f0881e228705cc1e1894b318b", - "5c407ae45276d94740b53f4c9086b30c081d95458153adfbd627c6f768edb427", - "c061cdae591cc8a59292bf44e67e6bf1523d9dd4faa4f9c8772d6a00952bc826", - "ac507485f2c190be78fb4a5859d9e694f40fb63fc1807a137d9064624bda13bc", - "695f3b8f5870c62a75916364c36d5ec3df617d7d7107a352a680c121eb92a0f0", - "dfd90be89c6bd3f544ec8ffdfe56a5fa602c132ce8b0b1e94b3030c44d49f500", - "2311e2b32b448f2605fb6c6f83f97409390bd297bb684c4b59667e8844dc2d69", - "264f12e8495bd4b44007f1bf480b3e6e84c782aa77c6f39c99f0da7f13507f00", - "fe6be86a319d5f55e0cabd2552cb4bbcefa01b4889e27a38b474e789a7abda8f", - "fac9da9761d83c782bf06f933b726cba823431e8e0889d5048c58166968d4ef5", - "4f18342174fbc4e860d00f5439bb682d66131714f82a06d74fa21206e4088fcc", - "81969cf488592cd1b0b0f677fd2a31ba75441ea7ec7f96fd48c0db98b8d99689", - "e1400ce59e84ecdec74aab2123862dfd5480e27756b06c585edfa953832a170d", - "fc022cdbebfdebe6acb7ec4e693c67cb63d19707a67eae8339b7f1514b0a0ae1", - "1c947b9ca885563e149016a0298cc21828322ab09655e262d8485b3986b3c27b", - "a3627e3ca9094b4eb22c85cee473cdeaa5e63864539ef267d6b3a437ded08e70", - "78a70baa337cd402269ef43fbb8c37d3bbd9b5d83af54233539bf0ce338d9d88", - "74c8dc9106b717905a8e2cb84247f2f2227cee3eaaeb897fde47700f2c8bbab8", - "a215a051e846e33d5f164569afaf6287be4f8ebcd5c91e6113843cd3d2977fbf", - "1d8665b39f9a08f8cda158e2cce54d66c9e32149a23d3a2aa2899e20de3c750b", - "da08d982c99eedf0886540184cf251db8f2ebd9fc310cfb2a760989c9b8c7a5f", - "72cb6a70191e34e10ae197ea6f509b166395dbb311230aa746a9c3b1ec0c58c0", - "82c4066e6cbf08c098542018f055d76bbef6c346cd0f35127629127853747005", - "19aa9987316eff149b7468293a11730f862ced6245e8229b3bf31d3f59bc2199", - "0203e3b2f27949f8457163873a025751fca2d793ef13d96a5a4be8468f88c6fe", - "1d72d0b9badcd89dd248c5adab694136a8ea3b9d91825d92e5f323c625f19299", - "8ca79e0b3817b8d25fd12c25bfe5715a01a985a4ff7b3212c9d82b62f5ed9033", - "084dff1ce43de2e0cae35dfed895c7fbfb1b791ff4e09045c8ea4514a5b0f7f3", - "39108cb40428d8ef93896cbbd3cc2cafc028e04791f61550b388ab493cf3d1ad", - "1b4589aba6f864d96bfb4c817eb5fef933616085afc327e6ac2c7e964678b22a", - "b1d9c863422a4c4b6b72a4c4e25c44b969f452dac5ab7518324dd8fbe2fe828c", - "95858c283e1f9e7e84a28cf06e736c9d0bcf96afcd03596a7aa1ed295b43ada6", - "1e3ba44ec5f8f1dc942935907254851316855dfa6dd2a6a7444d75fb41de75a8", - "73ba1d76d4d29f614b8221c5cb33a9a357e4285321520e13d899656fbda3ef72", - "8359790c9952ccd186920028e4c9f700f7d5a7fcdb6b40f7a326af55bead8e8b", - "43c4a02bd90d0d7799f2ca0677938f931b92f69dd9e9400f88a4431ee83973de", - "8d0a5b5b1796ba65ede2c690a134ca95a5fdc77569557f58856689766a9313e1", - "784d6b294e10f50a56cae495d693536ed1b6ee0d41f766632f12e40e30d6b8db", - "f60b278c0c294200551a82c39c40f3fa176e3cd7a38928abd29ce245cb8027da", - "45e128172b8aef8c87126562adc6ab41de8f632ad9a08f5cb941338d53415e5e", - "3323e0d17c5aa9e1ce48d6773567d764ddd6c0706627264c573ebeb61bf14ea4", - "08660246cb6da34951a7ece05b4f611f718eab04feda2353156c4d302dd47eff", - "33bf8158083aa710f79ba559a38b033aaaa95a36cc0d95dbf8743f73f56e566b", - "db3f4d38cd979538e0553d65968a256bf7ff7c3b44f858d115689b623799f955", - "b9aef1005ccdc6e15410966f7049a120370f7c6b62cf1ff3284fad15c76ba8a0", - "fc6fa6b3e1c4d45ca92667d3b91e4c336d403149e07d117b6553d5cce305b932", - "79902285b63e49f01978349868e19f87606749328351b2c8434b16cca127cb0c", - "3f809ab70aa3d665e50605ba7aa6d63619e245e117d429aa0b062916833b4657", - "9dc2d18eaeb2359e22985ec50af9ce394476f038054cb0724f57fffc58fd217f", - "83ee0c9f87b1ba9586f82938d4ad4593de8b1d612fdce1e0e1c571b79b3e10ab", - "f0a6ffd3a116caab7d78c815f501bc6cb0b1f79456195a6f1055cf73dc7a4889", - "36a41976266c2e33be51c3c371d112c277449e2d4c077a76f93f14e599f88a25", - "8688262156484653f3033bc68a86b093d5b3d7ecba531e493936756259856471", - "bd4e0ac4752a71a826339ee87ca374c5789d34a25f432d2be0c5a7767bbcec32", - "850ff49f54c44389a6d5aa00c33bf80c66d1bccc03abeddf702051a0cd95ab01", - "3a6c7b2c1d3d1c26f2169becb1bbb9035df8426e1df1aa392cab3500de205301", - "7e8bfc036aefecb080d8573ee5485e2733210326667ab6b3e93436083a8f77eb", - "9becf25f5407372cf19f54b63a9ace601675b2261c7c18ea7c1e798e4c7c4f5b", - "f9a9f747796b84c12414d87c46af4afa1c93a26e278d52f7819fbe361cada19c", - "0acaf31adaafca10b4073d255155e37b5fa892afad36eee7da5dbe43359a77f4", - "e426c5deebefb8025155c9a31c654ecb62ac40f9b5f28936a0f3015fc2c5f7b9", - "a9ee069004472cf6500a44b9cfe9dca924ec096cc4ac0ed127a18b587343974c", - "73d423283ebd02639264eb5db29a27db423692fd9c109185ebec599c357f345d", - "6449dc203ba5ee36d265b7c35895b18d3da0be8b587705203de0cbd9361f5411", - "12af2a80e5ce44aad038772c6c3243171bc61cfae4c20e78676f82176096a453", - "7f70b6d067e82b3b1123551d65c22ec310b478328449511bd9791962c1dc0f34", - "e2ce3eb344591af568cd3f509b72bcbc0e16d516460250580bf48fe8d55adec0", - "c046257d2fe8eb25c76a7887c4896095beda75a98b7622aa9265e91389229a1c", - "0a5de4a687667883ed0042cdf9ac8df59b2599a2d62fc1e442770b5471396379", - "93c52c6252c4d24595c4f863cdbe56ecbb6459ef50e7a281e67d623f04c8325b", - "6e69a507bec9a018e2142557bb4e506beb5c900e67f57f01b2bfaf6a3a3f428a", - "0ce13682a72a1d439fdc6505b4b859b51659ea99c8168cfdee9a6046d8bff006", - "920150e32aafd88d89abdbc6c5d872c42f84498cbe560730e33369229bf1107b", - "5ce8224f0b647cb5ed5dd6962ed9ce51c9ee6b921d0309fb1f613c2e6f6ed3e5", - "76840b2583b8abefbac8b5b21495cf4588b80d886c4efb77dafbb14921e0e2d1", - "b2a08be0d4fc455433c03e2b4bc7c0b1d72ef6266fe2d9dd12f7014723f5747a", - "8703102bd049a4c3b6354a6232c6da438889e4ac106e10e620c7cc1e44479804", - "341c8261db200f9f1437af2c146a18c65096f675c7811934ba476a1f9a1745f6", - "d7a64ead70aa689067823ede48e1101ae858cf7945392c383a2a977ebdef90b6", - "a69e343c1cc70c60ad85ee0c61a368639f803f6b2925549e8a9d57c5ff2f00ca", - "217c842db2f7707cd7018580c1ea4a2a7b50437940352756468d66aeacf276c7", - "ec8cf07e13a5fdf36749e5f1f14f70116ce3fe5d926a01a3a4c2f920c46531d1", - "cd38c54d4efca3d94406af6f188004903053d77d0d0cf67ec94064082935ac81", - "f4638aa5113097a15500ec358886c363e27a26652aad9f2aa660d0a8a7b0d546", - "e1b0403fe2be1fd39efb0699647b914107c1fc86f315f5324a80180a35978590", - "db544c5679700fdbd0f2d0f685c955ac884648dc956f88388e20e57690a1a65b", - "895f3667a62263d68209fa5d74cb2ad00be4a4cbd8fb41eadbdb830d2788564e", - "580275ed11fd49604b11b7bca05b4c1930cd945502d4fb935ccddb54677a6235", - "b04406162d173e61704370cad701525abedbd8445fb14192641afcd08cea99ce", - "2016602a08ebcb5e065aa7fce99c6a95647f0ad18d94403f9e5e78fa5a0eecde", - "f4276ecc04834a84656d355d1b4c1247c733a2833dad3a4cc4ce6f04920f4a1e", - "79a673cc932b7c263d39fcc04a9c8a23a2afbcdda4f05fda8f697dbc238b13c1", - "8e1f5beb1c773c8a74d17425f419ea503cb00b379827eb07689c502527fa0932", - "33f4ef57a4b561844dbb55c892bfd315a7d09f774aab9401c9b64d7ba157f68a", - "f9b1a5c4c278580f9958ee17a7df25a67d748f2e95f06bd779b8a2a25917f9c7", - "984fe59e8a366913ea9499bc2d28c0a16ca3a91bb2334c6080a9358c2f5bffec", - "55f8e3724fd8711e66ce8072ece19c5c3a459d7823e33710659dc9ccba3bc289", - "8d7a86185d9c3ab8cc4ef01f7a0ef0388332c5420f54083c69e91de11db03260", - "a386c27520de6dd960aa26c6c9ee49f8d0cb1a1d9cd8fd7f723d364b11bcd797", - "f95c6378d87de750e58ee4308eb655c55f6d4fa1e44cf6d8fb2162bf7999c0d0", - "ecccdcfff65aba7f8396e51395bbdcc67769dfae09fe5b1a4c8dca9a103ee9a1", - "ffc1d47d88f76ac13d1855cc46a384d86ba37732268fca04a11085040201e68b", - "2e733653585c44393c66a9b257f654a86db15bb79a0df170a753438a43228b4c", - "2cdcc209da72307d0a0baadfd3a4102dbaed5c9f399f02e0fc8709a56d08c82c", - "9f499f78377f53a0e28d882e8df7e5e9d775bd0db29280060d4c01a496f825f5", - "bc58724bce6b781a8ef060bc8de581874d2eafd5493fe347ef7c09959d2b0ea4", - "9dcaaddd790d3d191562bea1899a82619b4db80fcf839d1f42cf6b731d6dd8fa", - "ccbba80c5417eee0e970855a18f3018d969132ee8098b19fe935844b00548328", - "07052d86f221b2c6451f00ff2852fd79b37d4b09ee2e67808efeb871ec4889aa", - "a0d36f57e41c1358a91213c20b2ebf8548a70db2010b3af2f42d11e1cfd7758b", - "de1c91d41100d60154603ed7b997975c39d734694b4405c8eb0806a48b3fe5bc", - "e8c5dee3a6bc6c26c07b04fe3bcbd210057a9dad5f5f9386a01f8b8a212db4e2", - "08807431992a439d8b62000b8b2218de93ed95e143b0f1b5d62104caa22f921c", - "3323df975370afe75e017be39a4aa9e734caf4d510fdb388f4843f5e380a019c", - "8271781ae519291c838b05e5ac46659275e400f096be7b521e7b455d1f725abd", - "d61517579838a6b7e817d6ee4ecc91d0cd8f712363a1b13a0f029463d183c268", - "541374f4c83475e865b324d65d8c22c0e28973121c1963dbeb351aa56de0ca7e", - "5bf4574ec2dc865c5436f8fcb858809b5dbf0979739502b0ee246261b0be786b", - "f3a540f2ed887adae1ba2ad91ef257a960be997eceb17d9d27efd2d10f5a8a4a", - "9e822c44acec4f02c25355acf3ff5b50131e18d667bb1fc945a2028747109818", - "a9b556df6c364b8086c630de7fea41f2400344e0a4f75e66fae37399e723a706", - "c954d59027fc63d8a43b57a42877c622d7f0a71372e7d3e805adc06de2b6c232", - "46c9844458743fcc1a423c518ed20bc5fcd4cbaf2b63283daeeefce8b9743882", - "2396355b184c5c49dfa3dc13c9ed954e74fbde1f4344692ce2f0bec846633baf", - "5dd9a63f8f6c31ee852c27b7ff36d1961f66988453d2641dcde52b5cfa561fd4", - "c5d8fe784a68b241b9b7aece8278bc7de9e00608114f27010ada923923f0adc4", - "f479582abdf3e02f1d7a9e52a0ade2323d74ce46a83469571e85440af5adbefa", - "38d0c9227d93e601fe5a22b2106bc08467ae389d810effc25068dc0ca70d2aa0", - "b6ec95b18aa8748a324079873c0f78ad0e1d533d6e7e6cec807281608018fc2b", - "b8d55bbda73e07fb80160128a05bafc35c138c50fe139a6bf1644a1d7230f8ee", - "d914378c3e726963958d41484230bb513f493b12de7eceaec3cde6ffe9f0369d", - "53fdf52c7ecc0b7c6602858eb958bd01971cf0b0ecd78a7916f8d441914893e7", - "ddc4a18025adfa366251eb8ce336b1f67fab800234981cb385e3ab9120de35d3", - "4f58f0c8c3055ed13f537c44a26b20cf84a056ce702f2234dceab8c9dbafa0e4", - "0edecb4d4f78876351df7188a341284b0d200096b915cce3dc8a9178292b9841", - "61d99e6876573ce577f061b6aa16763131e8b1a76ad6d80f5b5f5b4e5a23a1df", - "080febd327367bba10826547d38b9b5fbfe9fa0e40b0c17bec69fbfb7714dda4", - "3bef54ff908701fe8d5fe9d743c4c9f66ce38e639f726fde8bb99a93d54ecc51", - "2ebf3d1f0c6944b0fdafd4fa19c9c4d1a2db5bf56e9d04d989b8a3c03897fb53", - "d5a2686e4e320a19bc3aff3f8d97b5ffb40370894fcc86c5750a94589dd5d39e", - "1229c8618a4814087ff2393c02b1e7cac9fdb838fbb180e5e724ee178ec8f9a4", - "ccbe03e9fdaae24fa8ef4d7792cd76bedb85ad6c1ba0b8b5cc23414a3b230f0d", - "202e9ec84e0745748728cd9df3596b433c1593ab831da176d720536468e1767e", - "4befc04fee40201bb261862362cbdc073e41a59b18940c8173ed699c81260643", - "77d5f8ce7df8de82704b00e9625771bb1933a218d54c41aedab811a855c50bae", - "6e7cfc0c76529311c17742d769cea5a1595617fa02cbf7fbe6109992464b3248", - "9c75a668cae559aaa751aa50d961737c3fde745375bcc65ad3e412625d102783", - "11ef4671d898110f8aa1d23b0f57b9c1146e9e95717b1a87d652fb634f9f9adf", - "1ef77bf96217da720312c0670effc59dfd1c795cc21f0a5118089be919c0663a", - "97d801943af8d8ac3a2a5e28f9cff9ea70cb4421dd14e850acb12c6ef3f59318", - "c1c636155df8915a6063817704199116557c794f2f920c27e29efcd1c11eb2ec", - "674af25fe53830e51537ec613a12926f4be9554430dff5604964ea46db151727", - "e94d08d5b477680ab885544afca066547d28657e0dc10310c596ace66275bde8", - "4ea46690d80b1cd003cb81888f2626f268e00b688799fec87bd66ed2b621ca32", - "842707469266d64538b0cf15f9179289527abe32a2f4bbea304fe32b34a2c400", - "de75738cd11b4fd2b8c4b48ad8ee9140cd7fcd3205429b2715549301aa93b584", - "285a6824d7008d2973314a1dae05d6f5ba5c69bd500b0fcc5642ec24edec6988", - "c064b75d60cc8ee868ed538547f7e8129d3c6bbd60fd7e839fb61f2dfaa304be", - "af9622f9b0b02abc4c0d7ebac10ea90e0a2dbc77738e6af27ddb5d68f5d6dfd8", - "913b3fae465865e6f73f20d14e9762e13fea5643bcce5cdf892f290ae2a5697d", - "0f39e232841199526887682631edab40572cdfd0452fd9d39c121cbbb00309b1", - "2f539d79013588ac50bde10a7e13b33c007504a9cc743877ef5cc0230eff8218", - "2bcd4623db92921cecad1e7a498e32a2c4ec194a7f8da8338399c5bd36774504", - "6222ddbc241c2b815c31b90ed7fe42d82eb417cc68bfd13319a38d5e30928806", - "aa67f4dea3e36d9bb9063aea62aceb8f4dbd7272a9791e77be051d4a9f2b53d7", - "1f01c6016c247389e49549174a98d1baffaf8b72ff44ac32927d62bf29783fca", - "d94465c08551c07f36e8e0bbdf86f90c7c99c13e49206642e201f4412f3e750d", - "1fd10eebbe6df9b383375683e9c0460a1d56cb2943639dd291c49aa8c68a8038", - "dd243ec3997e3eb232b40a66fdb69c344bbde1578956e1a0de7510ed61b6d4b4", - "5e827c0ef8622eeb0506a53d502164c201bbe85b2750f3a5bb15d308db429363", - "ee571ecf9befab0ca97c0e52e0bf37136a65dbb7d503dae8e4453d720fadfc37", - "8f1e53221885fb478c0b58ee4dbc27d13228e38652bfafbae126831ce9700993", - "8ba31ce32b047a0dd89f3fcd643f89719e0311eb149b8e6887a7aafcf23ec2fd", - "0c681ee09d93d40b057d7352112ebf39f7886c086672926605e271214170efb7", - "afb733b89d64b7f514860de59f3ac79d170ea90bf0dd4d63fc5067676e09c103", - "c44093f846f57047e8fea3d820ea007a31de47fea545dec760d5b3e477e2d9cd", - "2add234c8580e429ec036507907a7ee99afb80466315c812f960e0b85aab2e4f", - "fdd2c4682a2dc70bd35e317439827e00f97700bde14c719d6cedeb792e18f541", - "55080e4c02f4d142896b6c3668e5ac49c85d3cf1bd0a1801800629f8a09ab73a", - "fc79cc1b6b7d7b0eec2faf6420245694e6bdc7739dc38284733db5e07c42f8b9", - "71c95f7b8a271e369e8399910f2feb34b7c936b28158d612f2395c4be1c77f2e", - "ca6d5483e561e882f48165f380e4f53498fbf7dd351423b24ff2c625a11aa986", - "7f05d16929b581c6c62708ba1f430ec52c7f4e0d1b70f153b60a7c03221cc51c", - "384e116e024187bfffdaa548f821effe09594573cc0b87c354817b4478780683", - "d7121b6d7b4d3e6124f2dca027bfd705072f3e83ae480239da85620c07080787", - "f6afa673d35947b6877059ce42d0d155436e87a8b3e904c622546b871804188a", - "686fdb83cfecce539cd6d3a795feb814bb20fc4cdfe3b275eb6a223eb61b34f3", - "7354dd29f38c654b84361b5ed517efd5bfe9e6dfe95699c18f69240b35b968db", - "992170b6e34b0d186e165a621940ed99fd20b143a7d281a420ccde219751d1f1", - "1c62c844ed908020912d96abe81115ebbd4835ef1c8b23131c271da5a1b8a712", - "b62374eb31bc378fe82548c18ab90dcae25d9abc88ec8125a38ab1ba82b66bb8", - "2aa49397196c03fd5a4d93d6c942622f8f8dd225e97bd041db74a756a58bb24b", - "f670a513a34015a3ac83cadf8b143417dcd851791cde01727147f565738bf018", - "873b29f5c02a1c49f79eb985ac51620e4ff37a4450a5c97ebde1a0e7703d0517", - "b0aa5fca91111182e6e58a368e7974ec776d93562a6e03880ab0ab4ce667187a", - "0d5f1a2fbe209b0f611faec0c675efbcc3f49e6c4613a5ece3ca3323caa02bfd", - "1ea9dad5a52e86c0502e0cc6b389e0f8f04b6b4e44faef98bb62ca8d674e5c45", - "d4db6d19dfc053a6a8c2524e64038047ab875d016a613c184b63c8c2f329dd69", - "bff92ae9d2b39ab734a9c2b8184e168da23d2f6baef7948565c514dc40ba5f8d", - "568ccc6780ceee6d8c41bb450f11ace4bcc7648235ae1d3eb8139356035eaf40", - "e977b067e78b767fa12f844510233fb550899c3cf21c8375299cd083dd3e2fd3", - "c38ba706100ec3c2184dc22597dab4b85b04cf8a41159913de141db5176e43bb", - "2460752a4bd952b4cc93a784dd27ce35c0f61c253fb5288e0d73bd8695d81f18", - "05cfe39ff62250d653a4bd7ca587697fb8116cf62798f6faba98b7390060dc6a", - "c468221463fe77e529982fde34a0a925cbef1d79479c1e7646e4ceb0d71ed516", - "5b3fb3badb8b41dffe4e59a86f6f468e18fbfb2c555f768e68ff2dea5b51e845", - "638a02a4ba1b96ca53630338f4cdf1b46764a51834f2c4ff8cdc0f1284e9eb52", - "34ee9fea82dca5009108c37eb6a7630534a06ba6ec38cf2c3c11dc176d8cbfc7", - "0e891b672be3b11f7dab55041376e155174aab3af97fb9ed3a1a1882639ae234", - "f5a06e846b9d8ffaad1e9ad998e0c5e1f85a23b36e1713ca01d8ce56ab1e3956", - "392a6c19aa62eec4a4176be0a8a8d359b5384da9abd0e94d59c12794a2dd0f89", - "afae848ddd2c91c58191d5877edcbfefdf18a2a9b006ca5657389e83bf36f108", - "a60b53b0304dedb9b221a215dfcb6e5ad128de34b19c74ed6d78dc6471471a88", - "e107399487fb4162698aed43e25d99f22fd345cdf30a5e2cb8c41457547c86c0", - "91684eefda8eb19c08f99dc17493521fd64ac01e3d10c187436fa67d7f9fa691", - "0cc41424950158d4b786f66e34fb90a04163925cddeb386f5d56551f72a7eb18", - "b38afcfdc639e492cbd508e0b41dded913fd954da409b245bcd4cb7e70335f6e", - "038c1f2949e80f7770bf88d247ed10f9f30c365d9dadb8f750a6e151909b95f3", - "8cbe442953969119f61517abb8241c189ad0000f7103162caf43bf27ebb57c31", - "3ebccea351071ca7f0e31fa8bd36c9e644b5b4a22604336305a60f4b2b468e2d", - "701509b9d414df0c856fa4a1f5e15d92227874cf156b97af3e41a2e4e3c87a11", - "1dba16d1f5e66e11789ff7c40b8ae007bd52a14b7137ca084cd613d770bd0123", - "d6cfa990a5ed002d2a9169e23c1720a2152bd0483b0e91227f493b76a9eb2334", - "02ff1cd2bdf1c7c1895eb40feaf1ed1446bea3afeebf35f616fa7b27e37fbe4e", - "07f9079780c08b3583514c8f8a6d00b5b93d33556ebd66bbcb4fd529ab118cb2", - "9097d96f605698cc2911b9f4d256b914b84b4be26c079791dea21830b0c7725d", - "2734ee8c1fee16c27d18c712c054c5d65c0e66700d81dc23e83c7de89e3f1c33", - "e7de9958e4dc540078e9cd40957a95a3363fa01da4f5f96751306cfe54019d8b", - "32bf40be40c8b4c9a30e76cd84358198393d855e74d96fd2c26708f385783447", - "937c36d6181faa67e1b1f1fa66ff952692ca61f886d570bdaa934028e43badc0", - "265d180ddff33342cacfd9fd7d50055f4b6eb2278ee96314a1804199378fd39c", - "e230e1b0ff58ffe2ddc828f6f3e855335c249090017ae6efb38361df14818ae5", - "bae06aa518ad7097bf4589fa6e9629b0c80b369705880b83e947513c17428b61", - "59e5ebf2b456a5c58743ac4334a63a7b29cd0344882784fc44aa7f042c92ad03", - "2993ef785f7e40aea4e69fd16149a02a14a651fb938b4448d276c29e74a6f4e7", - "b49c23fd02cc1e84511d027693956c93c4946b26369b3bd56f967c0539ea8ef5", - "3a0a2d2ebfc8b48ccd07df86612408f5008026781fc1b3351b7531a0f3c8578c", - "b2bf76898e05866416184291dd9cca10e6c4e51152c6cac67e7beec3383b7acc", - "a6814a2f0f6e27e0716be300091473e2e6ba93b590209df2c49224b9649fed27", - "65797514295502faa7a77e736a2bdfdbfac5828ac98c7b6ecec761c625eeade7", - "81de6c11936b4413b3c5f67a221e0f4e8293b294924d3a3d72812f1a3c5a1b48", - "3ae0da34c3b94f1e19e853ff0b34aa4e586c5268143e4cbc0e34e9bb1ddda43b", - "50df31b4b069d300d9c45724c1a11b4add66319da8b28b7bf68fd1e75a034d8f", - "d36c9756adf1779ffd773e47e9686ba3b1a234abc431e5e8500bec03680b6781", - "d7ef3c78fcbb34ccb08846e2b1fb7a8e3efb573517067b6f3bfe6fd06caf82d2", - "d0dfc6c3d59c5f5ffdd464c6af2350a6d7f89dd93744450b79fccd8d355e159b", - "9c692baec9db3c4b969daaabdb79ba7df156ec1afc8c74a9bbf906625a6f7cc3", - "c655290088e4cbe82dc7d93810ee058c267dbb3fc48a710908d2557549180077", - "1f3795e92ee6e8f4b235ba272999bb7cdc112c4f972dfb4ede72722fd8ebfc55", - "bc4df3f82763b52241d7adedce0927a0bf5b877a52a8cac75a6be5fb4786db69", - "ef92a2592dc69267babe8eb66855dfc9c81b469d0fab004b86e60430a1a57531", - "db503945344477dc6a72e80d1bb3dab56fa609287c808f9ee179169179eab8aa", - "ff12e3ace7490877e2f54938577153aa160f3fc46142821a5953b5bf64d44fcb", - "7c7138c4ffbed07240f6a7bc5fb49c719f7a8f7d6fd0b00baef04eeae6bfad50", - "e88f975d2a88d113162837dd87ede3cadad20b840827ed5378b8a3da0352a383", - "471a83b11d8fd79e479183e650b60b3f24863b50ef9f1e45c39bb50e534a5f19", - "f64c0f1d91b1a28f181a3ab3ce56ea559464ce16f7bddb04ba0b339f66aa0dfb", - "d752512a397090419f9ef278a0849c85aef858113fe8dbfc5022fe7ba6b0c8d4", - "ec841326bba20055046e0f63dcd3b532cdf156d26b0423984b7c39f7ae0e9d65", - "1734c546d58fa68c5fe7897e2b55e4ab41cbb7a5d69aeaabcf65c97fb83179b7", - "ea418becc04a77aa88cf6760a5817b56e394f9b6e31d721c2a492a1f7979b20a", - "a0c057d8c822e04ce7f0141ec765a4d17ce9d98cf61a45692347806dedf999e8", - "4dfdf84739bc9d41ddff9b5a9c61f6ebd788109cc57e3cb93b706e08280f70c5", - "4163cfb0c7ee0de6c3c1aee55f25db5d915618aedd4bc0e04a0480587dc18ce4", - "73e5ee4386d56f7bc6981d796eaa4a08bb1fb648022b991345c8ae6824f46e9b", - "0cbd7d6a5a05a0b704dbe7af71abcedd31af11aedd704fde98f6f47571a05cb8", - "368d352aac3697f4260e81e8ccdbdee2650e82c8c9b888fd010248b8e4382608", - "f4b1d64a7753105c40ce2ffebf6f5094bc36840660b0ed0d5fec0adc16f9bbc5", - "59d8cb8a012acb8c920d1b95fdd88797d3014f0619adbbeaf5348f5a3f9b34bc", - "cecccbbadf8ad62cc645e58f87374b16409427a541202adbe0db0732de191373", - "81b12ad3aa94b539739413067337db910f66acf51b1922a15a9fc801fa1be1aa", - "a5a43896123ac90299d7479d9ba3db3877aabf13b52440a9beaada0e48aa4573", - "2bcad54eb71022dd629dee624203a3a3d0b0c81e526b1d3f51dc2ebce91cd18e", - "99f884eed92fe697e95dbe46651e49c7eabfcbc3d2a45edf852fe0d59d6411f5", - "60f6827e32c4de8cb24d828fb74b89440ae2b42c8b8006a1590370a7bc390d02", - "a759947f931610e61d01d4fe439b5d6f4e33ac3c80f303b76232b4ec281bf755", - "dcc4172fa7b8355baf3ec89ccabdcefeda80435ca1dcea7cb7659aac7772924e", - "e45360b528c0de6031714b8d8c6690b59eac8566d096a85fa19afde8e133d88d", - "34023a20474e366c69935648c25e27ebe732038daa02ee6dd13edab804730ef3", - "9d2f3ecd16dde6b423cd84bff18c89e9ca744ddc32b126e8f94a0aa4a7ddf0fe", - "b18439435632e8ab744c70778f756f999f73e901ed54ca00184a27c5582dfcdf", - "c5083b9694f21b1c8721e4656788aab59545b1125123871956c1a3e74f70664b", - "22a73fcdcccffcb39362e2d96e9116709eb2861189a17aebb624b07e1e5e35bf", - "ef2cb48a75473014f5ad10fc1ab1bb9cdc3572915a3b3b44d8b7df5562b21f23", - "aec43bd0aba3dc5c08da72402dd392dcb9376728619ec6201dfd0efdaf189a48", - "770fedd0364fbdf201824e9f7a17425a040ea2bcaa34659e29dab7046c995c84", - "870fd202a01d6fb1d62c22023241ef0c7694aa7a7764731bbd7160b538fb1b0c", - "27d247bcf5d085210fec2821f22d4f79045741ccb82f99ea7f21b5160552a76e", - "ade022549f9147cc875041e46e2f09873ab75a4e4151761b9114c86025f4a83b", - "4c7645908e99c5f69ebb727fdf0bf5f17530a9776c02373180e6b50c8e49f557", - "f6e6f4b683280db9d51b5c1ed39c5fd232d38d5271c294fa862af8daaf418782", - "3d0ec93d443653231edd562cf6021c228fb7e42ec449629724f06c1b538ad795", - "a0eeb4dbc81bec2c1e4ddb651e888c63a3f334684a420a6107aed33622091f58", - "900b7fa41c214f86c389c3b2f6b66129814a2d54d485487f3b20ccef2aedf527", - "97904ddd15f97dc7a5183ca78fbd0e2556f2ab23a313477456a0299bd2a1145b", - "9e32f0d1299193ba5b853b7017010d9be108bd3d2b8f572a8462b9d723370f64", - "1a497aab48917bc5a8fc1232cdd8274fe31d4886cbe329e57e7be28a1e8dc994", - "60b639e38ee202245fe334d58c4db93593be7c5521a211d3d9ffda1c56de096d", - "7c06983b2947d409a105f3c4891b294913bd09c4e366d5197a60c6bdfb06d0ab", - "db2660e7fa1edff9c422b306a87b782139cd2fb892e755aa043e16bf176aed68", - "484a8f19c5f374bfd045868e0c7dfeea07c18716486517cc26ca62250280d9d4", - "5e3fd164b0a2f05dd0443e7bb1d493122b4309e327326bdc053dbf1fa75655d6", - "e2712b58c3e63291597893a6ffcf28671f5ac7124a9fc7002fc42d46e6c1ba20", - "b565f09e9e698020e75726051f2b2ddfddcc2e6d8d03ce2615c0298beb3630c4", - "0fe4fa22d2d4dfea52c1ea655d4d2c7a2f7e2ae70e3e779a9d3fd304d3079a0d", - "a3a7572a1825e5bd4dc58a797421dafa4e56eab3ab28e34f9c2d1e94be49da9a", - "8eb8c76438aaac90f6df6fb131394827976da65671606116365d72faf56913af", - "2ca52706d4a4e5a207e41dad4af125356304b64963b40aa4dd36e6cb86e31d2f", - "4658e88010bb1b944918879ee80246b3733bccba66710ccce3051a23e6c9b4bb", - "f1caf3fb65653976adc611ad1bc8e8fee3e838696a9b01b210e4419fe1f6f0c1", - "42770a781bae392a0d5fb86a0e64a5de4288a4952dd4c26c3677e0a32f11c0dd", - "17b8e32e241a23ac2b92c4c0655a07ce6ba6287c7f40f22667abceafc2c677f3", - "aaa2549ebe55897b0d13d6b0c75a14a9bf844a60f27520899b11854e9d3efcd9", - "bc12a7bec624b7b8162840b140810c9f58bd39753888b5e10adb42d71ca45798", - "565caccfe8b6453ad93191b9a9544c4e2c5e077d7c262221f95f5d37bd86c5e2", - "96d8bb9d54e3769dac34082815ced6cd8f792be6598616168f861a5bb5e16a77", - "0367bc722f064b827c2529682aa1b0125a04a023e8b759771d0449c06d9478ee", - "91f7c6bea4594194be5d02eae0cef7dc1e7c58aa3c8c8e4c9a5b67c93c8ea621", - "a93e063d8f75539bc0bf0cf13b278fea551bc053c46a26f12d11f8b425f3535e", - "a3ed7485beb2dcdef3c4789c5a6c8836b0c31ccbf953b7a2bbbf55e84c189e6f", - "a655405ad1997f87ea96c0b22f47d6ddc439bdc6077315a70ca31778bc10c310", - "b1eb12098d343ba2a8c31fe847f563fccd374fc7ec1bae64fdfe7bb64dce07cc", - "272beca809d4ea70494eee7777e8b8e987ffe5e1a134b5a7edd83654a69a4ea1", - "6943e637673838ce30d9628e0ea0777bd99a5f3ee50bfba188cb310121b5523c", - "6c703c88de5f7a58eeaa791ea5f566ca03622196af0a1ae6158ba44591d6eb44", - "690b709373f6297156e7552321e874e8ba0999352b79eff8c074136369c23085", - "6e3079a3daf3b0f9b4298eb4cb0e252c141d62fdfb0fad04cf68ee8a803c38ba", - "73acc1b3d9ba6c760034a445313fceb401352610279f0530b3db6d433d1961b3", - "0642fff2cbfafe299637ee935ecdd3959a5757ff59a0c742519761e0a4c67ea3", - "e9a6241c8f46b4137f2a631be0d78148ed2eec897d05526fc0d4b9336c3e449d", - "9b49319679ac903457e656e8368f1e45464c21c2a07e48af97bade8ffede80ff", - "66e03b44b37a806339838d0f13085375316783a3f80e451872aae5615a6da394", - "d6c62071c2404513900f2c9fe674bc02ef916034254d43e0176c08207fcaaa37", - "c304f9151b0c76a230bd5d4c56dfb036ea6c4652fd0ef91bd282f0d9edd8086d", - "4f5f2742dc424c235418f9bfdcc95ce3ae590f105bf94c3fbce8ca68270f37f9", - "40e057effb8f5bd4aaef95518ff30cb527ef5fd3bd1ffc0e77aec9b716233b8b", - "fe93a1ae60092e172556fa9c40d4bb4e530d47293b08e65b4999b0a5d7be66a2", - "26742df27aecad8fefc2b1e7290ab6fc73f139d04463b2e3a175695e4055042b", - "fd9d02395a6ad94b0d5388dd1aba14347411c84976049df2f8bb6b600b6b49ed", - "8afc8710a48728bec22dbbcc4bfcad7e07d296b8ec6edea0792c82b394a0a7c0", - "92fdc146a1d358f1cbf60f947fc3dcd2b96e038c5eac3396db6d49a086ac9f4d", - "aa9c531d195600e9e496458efb782b8b756ac3cd9565bdf56d5b58d169a7d5b3", - "2123857a2c16c2d2d55176bc42723719065a1f601cc799483f2e8ee00c280b4e", - "1913e95f0d030451e5edfd87f1b99e745062267260cbee6a846f0157f42eb2bf", - "1e9335415f785f42a9591a0c53e92f7d0a22f1ac197629a07200997978ae6ab4", - "014c34ebeffb430a2c0fb27b447f51debd707976aa7785c40e926cdb79edf659", - "969389ebe32692f53fb59a15507c3aaa121eaadd048356e4b556a792f759cc3b", - "70bdcc7f09860d96484c2f9902c92323a5edcded76ea7c854fa54e287b1bfdb7", - "11b5efb9ab1adffd30d78d4f6744f46674ad23c5f84eed0949293ed1a3938624", - "d487634f0952c8c51b668f1eaf2a6f6fc7c4960eec96aaa6091404f1786190ec", - "5b3d5dc2111acb415f5e0cb08d389a98e0e15c9d18eb3a0ea08e52072889f018", - "492ea9bb99e9d684aeddcd1d05f2e9b64c79d3097745efa2fa0454abd9eb484a", - "7b0fe6a9808cebf46c62959e7c7054568dd05c6f3ce6491883d16e8c053f4259", - "b6a88d19336357bb6aa147c1599c6d188b14755621454fc814ede3fe211094a0", - "6be6e246618f4559b8266c9e7063e397434d10e89ae702a1c2b4753ff2a0bbb7", - "00686f90b2f49d39801a81b562e77738330e2772cf83613bc38fe9dd9fa8481e", - "fbdcefd477324f0ce425187c878e48cf2cadc7a66043dc0bd2ead560b3c3bf55", - "44c17e7591370fef76e016af43c23d0573d35dcb1f91e02200094389abc19097", - "2bbb6def6b1320ca20263c07f4ec44d55ed4452ed2a6366eb40b07f835dffe22", - "da1a91ccecba9308b48fd8092351d8e5b2b5a71b026e14145becea21c6f79fb8", - "4fb58743be063832b4c4bae7c4175029101ec526cc9ac39708eb1592460597a4", - "2bfe79724f7d8abf621e3ec0049ae83399668c7d2c77f027723cb0473698a73e", - "84b91f92daab48071a232236f3268efe243ee028aae6a2739ff4c2f41904e89d", - "880398987203438f2e14a30ad96338c593e65d9eab2f82d7987ae963266cea97", - "90d3beceffcd3a786f978ea042ad8a400c253d1b557997347cdcd6c210801576", - "8a959d62b1dac4f2d1a382a7c66bffd49bf0046d39743330634bd3df4dbab771", - "bd4430d1fd7bf1643117c2a0a1294a60fd730b6294d7ffac158332d3abe256bc", - "c87012fbdbcfe5cc8bab9795ccbe1e082aa5b4215eb590c566f52995716be767", - "28b7bc0316691aae58adb036627af6c8cb88e766c3b589450e6d624f27d6a419", - "9468f89ffbb12932ee9b38d0ea24016e6ebfc24f0fb1a03b10c62a0eaf721dfb", - "dbcec08c7e2a7be2238a6353b82c7a62f73b2316962b0342a342adfc522f2adb", - "035b21e17a17384a5c304d2816ccbc54b77856fd92412487b9c77bd22ac23d3d", - "bc5a432a02c3ca882a23f6325cd75880968ed08b42d220a918360c38d8c07022", - "d779f1d6d0e1af2258e32694fcf812e102f14c290426774885441e37d92e8d8b", - "d8e05c02840b6da2e58989f0511b1961d2ea637fc65ba36f89fb2c2e2a71db52", - "4b545142db05edf4633a2f3f3c129374370e9c77cde9aaaac145d52f55a86fc9", - "e68a3f84737c8964bdb0d68be66a7d5579f5c456330d71d698d786ef54662258", - "c02a84ac3e3cab6bcc9366ee52bb8673a5c2aa43d7a3363c77d168d8313f4bb5", - "286a6dd9ac731159f358ea9f3aa064d35359f534823a2fe8fceda3f2f01f3e83", - "0adf806429647daa0af9befd0a892c4fd76c9f786efa714b9ccd82302837c475", - "86a0755e8cdcc1b94d1e50633e61c1f2497c8e8ba7e995b494fef2bf1b0f3f9a", - "a5215a78d1112f6010a06758e02313bb69fffc1208bd8a838f8480606945e5e5", - "d5f11b3d6b59d74805bcd2bad9ff5a51b1b6038f45e057963b70d89773c83621", - "ed866c1f2be94067e8f4ee8380f44dc4ea998970efc101538b63be5d751e1f37", - "fdccfe1f924a1582781f003d7dd3d1d59882f094ad8982fb607445f8941e4f17", - "fd2e4464f4f8104a4b2f0830ffbde227f1e366f069f4f3aa6d99bb768fe4d5ac", - "e8ebdd15cc75e78f168b8862704f78297f3174a7078ee3228558d1536f44a307", - "a3d9113b876bd10e6c5b9112bcda133fdc3cafd30aa6cb799e393cc549d77dc3", - "7e5846d89af1331433097734c3e8f2f1bdd7da1ec5b18e230f9e78e759e8fca2", - "4f498c6889c3169077d6d231a7d086335771dad96fd46473978f7a9ce74104f5", - "c7b57e8ebd535e7e2c88dedfcab5d28b24b112822aa4f43488cbc3ae9a001066", - "daadf1313dec976892690d07312fd1dce763e60fd14f7b8c87e6350f51e0a59d", - "f6ea239d017c60622d439e1dcbc57941d96770ba72b1175f4c19217d22bd96bf", - "ee90ab32fc7318e62791019e1e0a0cf6ed218208c2aaa19de561e3b286088afa", - "cfaee0ec86b82e3235e9c5c1aa150a95b2cd6a4b04f8c18d1115dedccad6e4a1", - "409f650335ea27ddad617f735f14d7af11cc87cd766be7f691df2f6363a8d635", - "fbb97981437a306d329be4f679a7e6f1ebfb38c9f8ea5b15d8b61fc0eb9d6a21", - "d82652e5ba142ea57e9f9d17b1f92bdbc261dd09d2bcb2e92ac7e473c97c588b", - "9d06a061bd9e3d45c364ef1ff2b93daa95c73597b16b61f0e175064cdb765069", - "a22ffa7cf1baf7beb0ad092925506cbf55cec364fe413424f56d96151a3d282e", - "3eb409dd0e4721e8e3a602f7e95e3859acf6d3f05e41bf22b3591e4b6bc10d0c", - "86807fa24e28aee9e19b577d7efed6a1731d611f0c3ec5f79406899874053e89", - "84fa51ced6bc22b05dc65bcd38dfb7ead4b75810b5f79ed9d3874f62c69567ef", - "18c4d4fa2c08ecfa65a6139fa83a0db6b8cabbac5c943f1299b229d4874d4294", - "03c14f37c1e2a45e22faa91517f37a297ae475446ffb311c272f5dd52d929c8c", - "362e441b66db2dcfe75d68d761b152adb7a136830ae3453e50d7f400a76d57b9", - "94d1a8ee17b63ac14556c1ca167d74ab7cdc28a5ac70b900f1acaf2208bf5335", - "ed054570c59bbb1a756eb47ba5ecae80271cba1668d4ece7cdfe0311bfbb125e", - "e7f54d94af15b78bfb46e2f3a4c71a165694788325560379aade875a1cd80f25", - "e8ae426a092f18c9f272e900ea37c3389743928d67b40b82cc69dfae3b1af7c3", - "1fb863e3d81a2e3519bc416d6144451baa7a2dfcee5e6d93b686c6235d853ffc", - "9a48b8b292cb09b5b675d4b69349b9e220840de08ede6cc45d65debd66671b94", - "ef650446756bcc9ff19f811d47d98cb9fb37ca86fd24ed3aad909133db9ef0a4", - "26fe20eb4d31a907ef71e5e58e90ecc23961f0361922787393658c36d98e036d", - "cce94b3cd8c59355299331a48e1a02dce1e12f5a0ff6b9314cfc420d0429b070", - "ce25c370d4fc3ed095bdad973b803f4c5bcbb670278305f77b9878fcb59ce134", - "aafe1dc97bdc914fc2181baf0579fd013c651f05abf46b9e002e252a6266cf5b", - "55d874dea75c9d1e5ab49bb987567887dd5f66a7b84e83051b16783c1bf1c098", - "f1c119cd82a74432cce9a7b0feec6eb2d971673000f9f7e83777c339a15bc886", - "94c7845cb8a003857a0eb533e528087ed2eeb7677feee27e5127693f6c80147b", - "77040f846aa0f774e735c7779fc2fa05bf5ae722d24533bc4ca7068762738313", - "5712e25f19dd6e60ccbcaac64b2dd40799a51df238f97987ab77311d0b3b35d2", - "a894edd0e90ae85e61cdfb5d0826df828b0e82dd0df82a9b226b15c3d28906a9", - "000ed0349f00497a4fef6eba3482fcfd25cdbd4bae39f193cdeadd508136dc6d", - "6df7a78bf95d308091ed551eeebccc1c73480a9892860fac3be3e5d90683b566", - "cc2067ca2521e8c644d6bb7de18f4b7a8d2126c57fbee52a9f8001b25715fa66", - "f8aa0efc4d7a4796082b353db7dffef8c5ed915b801c56d932cdf5f4a2370236", - "1a3a6b86cdee969350aac1b2a57152e2b7c0d23b2787b1bbe75bcfc6069a6b45", - "7cf019ea93599c3af4af475aa4b82d301881572953529855823145c9d93a7bdb", - "3f31f433a61d83fc2d1d0d666a49992a0179a43aac3414f0fd21ccebf2529e52", - "9f68a698e1977529a7b3102f8bec2e49f949e4e2c2102e5ec42b7a59dd245249", - "bf1b4bf1949ac57e84f65f12c84267d9a74e3ff4ecfcbcf1669f6e4719883c85", - "bca9308ae46450de63199d9292778d6852f17d2aeb78daa99978c0d36fba4074", - "be97d45cec7fcbcf3f6b26e103f5675637725031b7cb50df08ff7c58fc9cc37c", - "5e01d63a4edd3e66f696e9da8b4c55ee7bc82e1c2677a509dbb1172736dbbf86", - "99c2b233e56908931fd961f6ca7c96ed40337eda623ff56f8de8a66c0c9f6e1d", - "38c944905399d7edb17eb26bd1fb7e2003761406b01bb4d5b8b64ec29581bdd8", - "ac0509c34b4ee24e08270f08360fe95160dd1ced77aafdd591c8c80481f36868", - "4d89c47caee99b924d4a821a5d85e51602eb20c969e5a10b476d7d72b2d9796b", - "f19f7dfca0a8472aa4bd5eed799626ac7ed71683d682dbe089c42b6f615ed8f9", - "630acfcca7ec65242f1ba59d900256e60080d646720a57dfb2ea2057de6e2393", - "871baedadabc5923ac3aca9bb74303629187125bdb0fde1d719406e825028a50", - "d16340678d0d9c53280b568beeac946e4e90e06d8bc1ee3f5d674282d9b47287", - "a35923e152794c47df67f8a3a3e837bb039c6205de0a39ad8c6d36fc6ea42473", - "d05a9d743d00352052cfc05458f427d23e70daea917eb86bfd4f6f8ef0830a78", - "b2bed95ed3dbc0543eb806423b8bc0c3aa1123534e623be30f75e6170f632828", - "d27e83a76dbf5bce4e3e016c36a99728731c61b74debc071f0f2dc86fff914a8", - "d365b00a24c2ff597d4778b2b52bd699595a954196ed08c18099bb5b981b26bb", - "d444ffde32a6f204772a754dacbff4841379d830a5e396c363c682c3b7a1ee7d", - "14a4019fb8e27888e3464d5ed4be9fd7e4eeb1c0b6e5cefdd21dbb534868ba7e", - "48e8e83c1c856e313dfe3ec88e313855d7cdc6e7911434287a54b51c8b6db1b8", - "0a191756ff5d03919d3d73b7a53e44ba1f20a470256536b614310f76548003b9", - "21f0f7085a4868edd6ecbbc402f3dfdb1c7b5edf4f29ec199741583a9cbdafe4", - "1f27efd0cb2d788a206aa09b0c530162d940bb2f80770a72436b99868e96e608", - "f9255ec3cf69d05360631cb23cbf3cc822706b80678fccbb436fc6d96a0d108d", - "57fb6063898ed05ce4ca6228cf9299db9f629d22ba8e08f6be4551cdc9456291", - "90b6598c33d8c464665f4fbb8fd007cea3d85dc8f5a9d672f33b691e928d81d8", - "757b03e3c1575f83d05f7cfd9109682893587c099986f031e93bacb2429ab701", - "4aaafe23c9784115a0767db2b7d69f693e84064041e0f806af5a05b9c4f4527c", - "f59626f00ac72d00654caef091599de855dfe7715e54cba83c91d8cf7e8b80b3", - "ffd38a8bce751578cc72e7ea60a24a22b4c25ce9e996063ec72a379d87f22dfc", - "02895224dff7804fdad786a78cb4223db20fab843b0384b099d9a099e83d34a2", - "942e9a00e8d81cc0bbde985fc511b8d2d97e30cd6c401be502474a0c203db123", - "a07a5847edf87d50d6c58fdf91948d914019a1b1b00fbbd93909220f56d2da75", - "fbe38bd73c2cd0e1cdf99522390c0ed3860f3431062d154bc3dae320e5e0eeb0", - "f4720de4f877e0164dbb3e7452ef421b94c793b409f68083d71bc273927d11d4", - "085e73fbd04e6a1df4236628c9f7eed9e05f38f2af3e57306fc6640835c6806f", - "5ce92afb3ae35de4863d9fec31a1848d730980514b8897aa51a5f83231340daa", - "ac9a6be6d804030084d99226e21d2a3ef0f2a327f9a7131bcf24f417a612e8eb", - "64594736e4b2868756219f3aaaca3254425fe5c450761d95e13f522980ca6a8c", - "6f6dec4f2a3d3492308ec21069f040c452ff55049bc97e8118cb08eccdff38f9", - "b107a8f0e81f24d154b2ec3fd53dbc75686e0ebdda3d279947560afa078c3863", - "c23e8212dde08904b6e21fc4ebfd01550fab2ccf8c91a740b9bed086620dfb66", - "a14bd8562d6d6ea8633fecc4f502377823180d8cf28675afbd35ac17acfa8956", - "81445a33c94849e46cb2eec0d0942fde708ce76412f14f7c67f3cd8f31d7edba", - "2cc1de2dd5d9c761fa2318376053e3cd367580221e4a6bd08430791551319cac", - "189bc5cc5ba71a90a120ef6eb1fb4ff0af37ae23c6a496b993de6e721f20d4c7", - "f16d553fc1a353094f9c51feb090fb59c837cd1c2a159fbd0b96f411d00591d4", - "e3c675b0db2744b94320dac4fabc0582309ca8ca0e7dd94c9f35c06e40c2b8ff", - "48d8b1dcda70ac8bd5beab186eb27998d0fc7518458231adf06add6221a0eebe", - "63bcdff61feaaf76de8e3b2643bce3799a365102854c2257883bd0ad7880c1a8", - "b94fffd6b1a8bf4a1a0b034edaf65aba4de133ab78dc66bd73befa344f5c8ca5", - "e6dfd2313185cb5d7973b90085444950d10be893e7400c9e403042e8309da5ef", - "e14b8a8011610c166fd79543118ded6aa75b123e5ce5bd53e3579fce12384552", - "916ba7d43304a6101968bc56c6a6f423d26252941f00c73d1126e5030b1c6e6a", - "c796c39b986f7924e579feb5d9e30b79ec27cadc44c4fa860c6aa2e26b107ec1", - "584f49bd2a0e59aa3cd6d9173e091697a6931cdc72546be8dfe892e748b019b7", - "f625f746b4d18af453e0b1685318065e7c1e7e3c8e9fb22bafa66a54ffe2f8bc", - "9375b5c9122b5ba515f2914be05ea36ac079a423e6f5d5d70b09678e80ce897c", - "01c5cc12de2f21a1fe1b7ec182ca208a105f13093ac738e01e32c80cf0e3c7e0", - "d2cf4151b26245e3cd943530b0d096e73e200850375af8563308b4292ceb6c1e", - "dd413ed86f4935c6b878b21b218728a5cbfcf658856216bf82863515df0071e5", - "94ce56f46bef95b5699fde73ab5d6a7c3728f054ae828959d6f8e2f15dc08629", - "eca80d51b200a0a27537716d83ae831ff5e87aace388a4e96bfcd530475e27c9", - "5f275067da3bfd2a0fd2bf93582554365d76964f701a7b245d9bc4770e952692", - "fe9952a6a77e5e23385b0b83a283c6355c6f4b23493c1929727c0f22b5290a0b", - "ef39586b1b1c0045384367c879548f750dcafff4d8759df1b95d7b63d0f76803", - "72e8583572427f94de7971ceed420dbad59c48e1eb4b8e3e42bb7bac6d0f8b8f", - "a5f1d0e5ead770de7994244555cba7535482727953a4b00be855a197eb14b12a", - "292aad328057424019863c4f0daa442f4ac2c4008d5fae0fcd4babc8ed720187", - "37999972be57aa4f4144a81e7569add02486df6eb6fcb93f990bd94661b88cb7", - "b6418e891e6ccaa84fc42bac7f79075a9e58db70e427132b84412eebdebbcb35", - "1f5bd974060474cbb73d29a692d67227da3a80a5f492edb3e1b5374cf6012fa9", - "852e983bbbfc0e75dbba11a978c1922276632d23d86838bed17081b5d8d3ed1d", - "130c1b7ca82445dcdf5c0bdb377b4c76c18197166981d575500311c11b548640", - "ada2a799dd9614909927eef35d5620080184aa1c35784049cf5343cb2be7495d", - "b0a71936b459b4d3626e238ff80ab4c27c4c2dee2d5c6a307753dc545bbc343c", - "7e9f942d435a2fcbca1b897b4a46123fcbabeca80d4f3b5dcd3f031af92429cd", - "6348985584aed7dd2e6255e8551b2e511f02025a8d59216464e2977e88b65549", - "be59c9842b32976e58822c5511c1603fb0b9274047b0667f0627fa0415725229", - "86d27be61193f0a3db4878bad6c6d18e8031d74c12f918cbfbe5fdeffadc289d", - "092e3b660c3c2e402e12f7bdc2b4acf6ea54aae73c8d986333c4fbfa7b260762", - "6d68f1f67f93fed3ea4c701457899ec7d53e7b0ee8ed3d3ec0f68ae52aae378a", - "d5393b515bf9bd574387dbd1b299229d9bf445799907da615f2852416ff5eaf5", - "9a2e7c38bf6649f8b27dfc4241eb84adda039a70ffddd8ca8a634cd1d5f9d205", - "6cc4440e6a5c71d3f54570f196e1f2fc481a085da0229a2ea2f2df905dfa72e3", - "1b2e0328526fff4e654421b8a1911da1185d18d0db305705d0f6b99d92cc1254", - "60ec65d9d93b328fda5e2caca9feb81cbe3a6998e156a4be2b25a655c07ab683", - "465255aee9416838f7bea096ff10104797caf77fb0b834c4cf053583fdeae31d", - "4c500f22b9a700a4c7ce8cb435737df8e25fb598c926a778cfd4dc1dde3b45e3", - "b764a2c410ce9af50e07af38009c5dd2d6277032bd54be477dddee4c455ad7e1", - "c9fba6214f5c63610bff5da73ee5cd6a15edfc140b341c96d3d3844be1aa59f1", - "72b0b8f62398e7b024be41be0d32104c6f2d7f936211996d067e737a016a1b95", - "aeeb07b5942122cfe2bf11a6d13a27828168e805ac7cf727f87c3af451dc3fc5", - "b8ee750649626126c18e3fee3cdaa65598ccc01e65132c62a559ecab3dc8f610", - "3b63dc2785b5ee075ca3de1c0a060e94ca397baa1d8fa5330abd950e4aea31c6", - "6650b9c85e0bcc0c49cbe9039107bab84d6b2a58da84d3998e6e514812b0738b", - "d690b09d5f70e84055b5353968969c36955481421d1d33548cfe90a6fb4c8f6f", - "2f7feef657e334ad9688b53c28e135be7f0ff5fe0543040e2ceeae08a87e1a57", - "09707cf002671f6e0ac97849f33f3e741496797c555468798eeba57b00fec03a", - "e07d584355a712c5592e455ad4890fdc92eb9cad6e735a6783c8814bcff71449", - "ae6b6346ed828af236ebdcdd691ba071d2a61a4bfd6ad42009fdeb3ee36fe80c", - "d83ff1bc0a920e871e244adb32941bce69fa6cd03dab72dc01c3dbbc400de167", - "6c23180f9510c27ca3a0b83c9b999c8d90d08506a56ce182ddca2f0e5007cd32", - "59e40ca0dbd0399908ce8f7c55d54f1570b1e9fc98b1eb8361b01831a6797b26", - "a5c9ff5458635a792d2e57e97aed645307de68e909bcb524d94cc95717ef6d30", - "c07890b4230e0251bb95465bd4041588c833d923f986f4e0974e76297496cc9f", - "098a27b90543f28d7e41bdac8afcf03e9a2e606eef8579f74604374f94d2447e", - "772d20b4b0092c0f0e1e09e30152f1dee8f511d0413e84efc6471a449b160a62", - "5453b7aac68d9905153fbd6fe99dc119754a94c65d24daed76c11f800a7ae212", - "8701e59e210eeadabff9654bf059954ea83c284136832334cec38774bd90f151", - "44fa52cbc97526fd7375e12785307936c9521193e5609a9c3afb244579f73311", - "33ae58439688a5adfa7b0d888a00a331e381221038313771ba33e1e05a3398f7", - "cf66084e997bd2d088f42608fdb6ecae16e02a56170f7cc844b1ded4726c0757", - "a6dadd9e768a5703cabfdf1a6ba803ef98ed2963322fedaf03e453e46a0881b6", - "44d47d34556dbaf3077bfb967e8ad2253259431a5589e1582ec0fc3b525bfa7e", - "40d1c313ed27ff2eeae03142b137472e234c61b62107fe2306d4c588c2141554", - "66f04c4d00f8194d2654ad635a1dc411add1dbf3c0205afcd7a1f6d0e4cc769b", - "81adc04637f01ffcdfcf3e99b0682d6289acd1411d35798e06d3fbae76e2b5ac", - "a571833ef4d22fa28d4a2017b626319f8e7b121f75815b699eef9e4ee992e883", - "e45a7eba33a4bd636526cb79329e9ced8178759fe6d811af15af19dc1d925b84", - "84c0e2e4764fb49ad215285fc4eb8dd39368630509ebda7dca1267891108ec4d", - "3f2d8bcb5b6f91bb7c1fa1e171eef83c2ce2e83f939181f6504423fe2d68866e", - "b9f0fed48ab6d5cee012d2fd46e7d52483e15f9fe426226b3a3a4e6ce9848942", - "154704139becc05f6bf3badc6ce665a79d2b0f9c41c908ba7f5a78670aac78b2", - "c0f9239f4bfdb9d203a91d77dce45c56109ea87b9096318846bc2945efea2dcf", - "9f6d839ed768b85b23a6ec01d3fdac6753b42ddc0a6d3ca8fb771aa0ef32e59c", - "01e4026c312237fdee8d04b457e362b6982419318d3914a47a6e550491b56835", - "1bafbaa4e7b1ab48a0ddacff6f1b0de279b66e54ace39ee7b4c7e82b062f2476", - "9bf4f10e3aed7bf6690722555eb75218c44991b821d07b6e12446f2288d1dd52", - "5817af3f9b4b55cb5d01197af93b4e39e0525c5d9bca663937f2cdde078d8596", - "8dc308dcb1f05ce77611a315d2247b894b17a26f5b353e258a475167a012c7b0", - "85326c4c9ef98c65c2adb9ff79cb9c1ff2e16a871c829015eabc2b464d9e3854", - "ce24315cfa9be6b0cfd3486558602353fa5d07771bce52bfc454205652dcb332", - "97f20ad0595406bc4ba8469b689432cdc18e71401875a32a00b69379763d1405", - "c68fef4622d293e1e6505d4cd6d171185957db7d1b78587473bd5258c4607205", - "70b829e85d88c44c1e478224c455cb78c15af6877cb89f7d821a84deb90b35f2", - "42d711e9c80dac5753150ad9dd7fcf0c9ebc573bdbe9dc021095fa7a87ecf78e", - "c128bd79966532f2c0f005ebea9ad9fafd28c3222b34aa1f410695408835b116", - "5cf9ca972d035f5723a2aa615895ca93863c60d3e78cc171ccd5591e46a00b4e", - "c4cf17fdc9aa95f484758d475ce3ae3abb2020de0b45e6bc510b180c754e3596", - "94dfa27869c0100088789af29e2518f20d7eeb1718e0a3ce8fbc8a5454818d30", - "d50070fed63ea9d71099d9963fc9adcdb2f1e3036917a314281c3da91648bbef", - "ec36d07a3f6a2100e8aae328d46672fb961938bb2f20ad3b76c932e83803e2bb", - "2d1ac5f935a8b11bebe6cd500606287c9689b3edb52d1ce7cf56effd1a5b4c0a", - "55d7a47ce03ca21d0f48caa470e92de1cecb9479625f37c1c484a6c1dd3dec97", - "9c645fa7263e0b34597d5f3828861190fd181a897c4238dd5e230c01af7b2694", - "ad2b857ff90d4f4db0761fc17f6756048cd773054915402cc83bc8cbc576f048", - "567f96a7f708351d966234faf71227556af32c9a1e42c18812c5064018de6f14", - "73f2fc8f2f4f0fe97ab153dbc526ea6f99a653ae1108627bc1f17b81f0475c63", - "1c5c389503fba7cc3a4fcfedc9372cb4a15a6891d2eb975e0571d669939bbbd7", - "e0ecd174766d59c44c1d753e860f1adb4ca07d34a5003e3fa503f1c1772d49d4", - "dbee7622ec3baae0e4f040b6529a7607c563c47cb4c2b92a4c9a73a18068fc58", - "26b95ca985811697c85026e932964568f63b029e4de82cfd2c1b71c880151517", - "65d5c6a2200b468e8eb025ec91b50234d18cfc57d7f29f0c2d5a3389b3714f72", - "1a0bff478e57205df9c2a37a62bfc9dfa000fbb7df55b711b4922885581136bf", - "8ef5a6f474c21d73309e0addf199d002a04c59f1a71b2e8d0a77285602cd9c70", - "30f678c82891166af43b8ebb3ada32be84e9b14345b07a7dbf344e1c75bb3421", - "81f8d9ac519cc931c094fe88b1587411477cf33bdd9aa583167ccdc21065450c", - "db52ddda5f25577c63bafd1f349e1b4a8ec0381822fc05bda6c0ed80c18a9d1a", - "aafb1fb23296f368293a8768856c7c0430fa7b83341628fa6dd78c17041502a9", - "be5bed8efa4a3fd1827e7b2ce300799aa1a2dcafd39799e1a56910aa73a85e05", - "bf449756ec205f703a7ebb70a376b75bf3923dde3733428c9428a647166120d2", - "0daec1f32dd83304cf91b22b4cfe7b750182c1b27b8086ce91ea60187a4fb88f", - "ebdb20946ea1ec538012292f75a789514dd7c3f722cd4901d1bfe5e2dee3bc12", - "747ea8f698caef4bd58577f66b004d46f15075a23411c1213535815d56a928e5", - "5793b095435fef65f7f8ee9cb56fba95359e0cb3f136cc1f0b9a4b25613c77bb", - "2dd034311d89e575c1ba233780680b86b4d17df3e439c1b9739a67af37c136e7", - "859ddd7e69753e12c16cca0019270b9c865be56bfa0e830110415045a1436631", - "76737f791f5d553afe4e9d7f585b36f4f9c89a51e51693d2f387570599c8b984", - "8ecf992516ca53714780e2cc7b73b2e04b55438cd68915409678da1a63c25814", - "f39e2a05d3feb1e6dd6f55c376570a84f89cf84f5edf47695bb77375d37268bd", - "661ffe041f119b42fabd72b15089c08f0459ed51c24e6c7cfbcdbb5da05f9549", - "762cec982e04400af3870128b0f1aba1a75f5f057347927236a759dab0a43aff", - "c56506271e337f5ba817815a9efc2d8285790c44975cb9e60f3162815c0d3ee4", - "7dcde0ffef758d9a2da63f5fa3d5dd6e9c1edd415b98afee5d334eca87810b0e", - "0b19af7f663260fd4514d1035b2fc8fbedf5320709f6d765c5d1427e73cc377c", - "9a335334cf89485b335941f1b4a6c03a78f96b73293c02d53fa9d421ae540308", - "629045491bdbded0cdf71d95985726c707db53e87a9a06da9ad1c4da58c08ba4", - "7e20418213a2b11b8219307290099853a4c7186494b7303245885999440e0d3d", - "798b3fe06de01f273311afbb3ab56dc1f24d78779f171066be9245ffabea5e61", - "9056793891531b21dc2a61b031b1bf9f1df59e7f79af8bdb46f000aa6cb526f0", - "24cdd24b78fc6845966e24f31654b6650375a759543d75343c9d031173f4af92", - "373237b105b7f56e0ad7df59fd3bf251c7c4d03fd69c27bed23f01e74da73f7e", - "440c0f6665cb5909bb60c94218479a73a82b5f19f3729f6da509248dd79d90ea", - "a4d65d2033a225694c03284bd284a447fe1134dc235b6c9c2b466150086c080f", - "234f78965413835ae7fc7c7c2b091b177dbff3790f9be37e4bd65852a2ae5f8a", - "a353e821c04cfc4131954a49924a9852482900a9c9ec4168225fa02cc62efb87", - "bac1b3d98d2ddd027ce6f072c2f114a0b05f341ba73deb7830d348028c35411c", - "155e438015b248edf5f70edb2e4f5d74511021a49ab7464ba1ea3b0fd93a7a3f", - "de0812232ec42f55a25fb90e31e186dd9f0a328f840c1cd1b47f13ff9754c96c", - "3b566438d69989ea5fc5240cdfadfde41f9becd9d656d2001f95dce1a1068326", - "1fc8f3b3daf6720e70e5cb47aa013cdb11255290122a0cc4467c10e581dbc215", - "e7fc66ae76393e220d0c704c580d3234c8767b6f11ea0f28905ed46abdc48787", - "dd5ea16ebbd5da179e70bfc4ca4e8692d5432c936fd421c14f1335d1e32d374d", - "d2eb201544ac538b732a4cb559f181d74ad14175d3dfd4ccb04898c293b4fe42", - "6f1dd39595686f5ed680a37d8870f89a2b7222b5de1ba37befea8b0be429aa8b", - "8496af972db4076d50e7e87dd3ae29d6c5f47c5d173bc4fdb9861dcc24214b42", - "32ceb7dd64020c055a6804817e52fb2e7948257d70473bc259640dc92e79045e", - "4c6909784820ce5fcc77e04d53e44a686bb9c75a82d43f6422f220f3f30e9976", - "be08a336cb4bb6811fdb3a6e181124bf5a2d761e8c3f37208f39c7c20dd4318f", - "c54abb5efebc53896b3a737c1bacd9f0facb1f690f0096cc0775cc848cb171b2", - "851c4db6ea5169ce86c00a6e5cadcb7074b23c6595a3583a3146c31316db3c4d", - "91d04386e7db9792435af4eed16357fd3df3ff3c8f37a07c4be770e2d1a0d268", - "7e67d46a7e43abcdbe8bfe61ed1de98654854fec5abcedf95fc16585c270c4fc", - "48f0868c396639ce94a6d5ca77fadcbd6d2f3834586a9af601a30b5dabec5a56", - "79db3b2935768255aa0a8ca0b4af6c94850cb6608412e60039853ae79a250a3d", - "edde9b5e804c68e05c473607ae95f80d4105595ccaa51f97983834e3881464b5", - "c9d0cf21e41ecf3b603a41a0f869564b7fb216b01cf5dedc433ee88ab41f2d34", - "bfe20b09a387ee50befbe9096fdeef43562676c45d11e497db6f1b4b1c7a8c02", - "9d2cf25d7105562e0b2e252d969387327ed811145162270c7142d531592d7a64", - "ad92f13880f27b1e34c16f91cee34688a742f3e066fa50116b816af13732365b", - "77fe4e0c0c44d514037fa3a65ecc6b5ea2ee71972f9c67d77acdb1bfd8e7b711", - "12bc0f59d28a39777730223efa318be911838b489b76c5bc51e2f8d89a5b719c", - "9ddbe49b4efae77c794e20f3847bca5c8ff1bf7127255c61718b8f65a6316bfa", - "56e49807a24682217798b4ae5e7af22e33a66813f9eeaa8faebd7cf22c7545ae", - "11fa011589c00f800932cb57a45159061b271b40d2ca32ab6749d4d575bf1f6d", - "d469388f762844e0aec6d14ee6a4bfb710d7978df0e96b3bfa5b2850f9bcbe11", - "0f855909f0a0aa9e82e90b40693686af8d522843c918c13ada7c68a331084aeb", - "a497ef64e7caa07b92a0110d27ae16b212dcc310804f5fa1daf10f7d7441272c", - "88b8c6f34ed1404aa0d1daec32e3164450b707667a6d2effeaadb3bd26cd7391", - "ace902e50ec621844088e7baa1bb5f6ad3c44770ed0bdb41ead4b4a2bc0d140a", - "3d9feac313fc1e4fd6dbd2db323323884201219bd35ae48939c57e735a1bc629", - "27b703a0638a08037a365bd460c9ab7f9c821a52deb7157a7b26feabae6e04bf", - "91cf74a44d08712719d9b22d0fa273368086140f7fc092e9fe4ccd676c6c94db", - "2977ec2ecf11adee744bc3b4f630830e3db96d3a9228f6f89c2c826f8748c3ae", - "4fb9b5b4eb4f5c179ef3cbe111338132e0842639b7d0c5b856833e6fb8cb88a1", - "fbf8b26fc2c81ae8705537e98700240e79c4022b39bfac8427da98d981356256", - "bf8a472d5851e410f1b7b306d3a8058200cd94382e182c6bb872160a48f72cea", - "9c4b9e658f887f02f09082af748a8abded43a9ef832873f0fea007ff3b8e88f9", - "739cfdf8ac78d60bf8bb19d8457b13832300c54eef1cf47f34cabdfabc91bf1e", - "52f59c808e56196a911249993fdc9642a20fd27fe2bec75b8ba2e7ba4164e1f3", - "96e3fc9df17e3828c02a125a8d53ed8d21bd7906adf7805b2a64e1bc73b6f1eb", - "9544676f316c6c7369698858b385cf29bfcd405307a9df490ad774de98a0492b", - "d159c4fd747508f7529ef4474742de9debaaccace4121214a189e462b80b13d0", - "0dc7d9a5ba9332dd5b6a3cffb056b5770e7cc1d0094639a2c7bfacdaa8ab2292", - "f90f8c0c2920ed572afdb94edb502ea27116a2301e47738c3da68efd364c250e", - "4a40b97dca6b7efca2ca9616c400ba184d717082b611bd46515e91223604a517", - "d35e9080ea0b87c8cefbcd8c57533ccd376a7599fdd689ce8e84766de170c605", - "39fb4f94753e3130cc3e05b5debbd284b4c1f68f655c7a2912e55d6048e07ea2", - "4560e869311cae41e8109c7a66e6cd8fbed25425b37c641e70556a292d551cb5", - "e4ad772ba9a278d46ab5d9580b6c7d91ad61716f97435ab82b8416748bb4b614", - "049fc7145a9d7afef44f5e768ef717ef230e77a00abdc08cb5adefd44f36eb51", - "f033c5d8e6e27847bac35baaebc50ff9f4ddd365d8529849bc8529a0ac9550cd", - "53bf9f0323c888ff9d66fd4e807a6361f825cd97974436810491a014dfbeb246", - "1f34f80830265e33f624321c418b9b86f7b17d00d36ab335e8b6adc0c2466723", - "0c8a65cdc59bdbdcde0ea4a859e5b1ce0ae1541a79359fed582ee1e5016023cb", - "cb6c1bf1d00aaaf678255d1f6c61bb7a80fbee1674f7bb60add0b58541a6eb1d", - "6a5ba24ce9cd3a3abc4691f42bbfb6a6ab0a61a2160e068330c3c885ac075313", - "23b51547d302305a46db51a1023b5e5e080df374a65412e5d9ed197d547dbd08", - "461e3a4c42403f4174c17592b2e228aa5eabad7805a8387e926bee3dd5b14f3a", - "a047f33cfdb55f22abe79c80810e9f48d2065e47762d3141022e6c54fcc3f8cc", - "8ff0cd68bca38abb3161f9a89ee5faccfff27c0ff018d9fbb22fbbb149ac0bd9", - "6e167c20d31f11e4dc903032bd37d757fc5bef6834d9e1d4da87a563914327af", - "dce69df2829840dbd166e3200fda2c726a73c32ae9023c37f5874bc78487abbf", - "e8620c8434fc0446dabf8fe6cc3ecccfbae8e592868b8ccd3697e80946969684", - "8ab62586a081cb14e7d7352d167f2c24e23811abc8ae77315a62816fe2a414a6", - "b2a8c82c7c4b0e3235090f4e0356a43a3c2af7b005b4758f49db0cb3d03cbc2f", - "e74c6b5eca4360099a1a742fa90f7631e7339f03b2ecc95e0fa0fe4011cc46cd", - "2b8bdd4dd23e9fe32a8e6f2a6ca16995110b5406cda80dd8b944753c87c4f23f", - "c36a4fbe2c80dab6b3638b79f2ecad32ac79073cdcd804322d366752844e7627", - "57141c541c1b4a33a4c41a4f2f73700a037346f4c27626fef456c1608e7c0d35", - "5de4b08f7d4d631df61726692631b9650280ff142c9f0e857d1b1bae1af43e03", - "8677640a260498b1efedc8b7c5c3afbe51a66e627e903c64ab3817d02ff70962", - "031906f0d7fc9abe145c3af2e9842d693e1278c56fc030889b1b280167d02e6b", - "a7eca8e9280d444814eed1638ae4bb9903aabe9ed78b5239cb4b5d14eca8e289", - "9b4b6385e6202a509849de23c5e2b5e5a2310d500fd710874c1e7b3185933655", - "0c90bd5736957b8fab97fbb16e0782187197015aa46443af3b9eab666e99a110", - "8fc7b3b93564910110dca11b6262af2a74dbc3b24af3276f15ef6b53a6bd9d5d", - "0f5688295dfe64b70f779716bc0c161d95514651666c35b7a8bba96f1eb10cab", - "0963d78c7dfbd0d04f71df0f9c6fa17916adea457721205908216d90149075d5", - "0c0dbeae78e60f5793445df2723e0b0898bb24f3b53deef7acb3f36e36e31b35", - "607f484c31f5f0edbc769e8310bafbde8c4cfc8311e10cf70f8d4c2e6d7e0e4e", - "3d989ea138de6179f651a70bb0cded2b10f99c58a5debc614075eb612ca9c7b0", - "2014f8a5cff0b8adb33285f1af698914dd155fb24c6b14548c9b905715231e8d", - "ebbdd4e920854c9c0e2f819871fc35fcf69bb98fe4d7249ee127f6deef89ad42", - "fb06df0428b3cc185ca6f60a3b6973054fddf2fbc6f335d87d656283754d74df", - "7eeb824a5ff78496e59cd9218e47257d143822ae17011137c06905566cfed685", - "2ac1bf93b198d8f3ccd3eeb3f7c39e760eb33771bdaa9974cf7cfa3eaa44865c", - "3af7d9a0cf716543e0bf87ce5c292a177d5fab9d099356dfe1d13720f232d2ca", - "b3c9375278f8715598b8fcf4447fbde6e7f4aa9ddf45bc8ce7c23f89d39fcd68", - "d9339d4b9b552c28475dc8d58c6243f8779a836a6e3327f462f18116f9054d43", - "0c58a45d2bc3c90575d5a659201f6fe2b0bcaf814849e6459ee1a0b987689602", - "3f156c754a23be5ec18ddd8fc4e00dc68b72c5d4d1bf555ca5bb8e5616296026", - "0c19aaf806cf5a97761e482103dcf3b5210b5bb8624c8339161b033a94eaca1d", - "13297c3a0942973cf08b8c6a21a1fa041e6760c5920afd9308556d3b7131bfa3", - "b99b4f3869d136fb9904b7222f7956c25d8d5607f8db5e6ad70acd88633a90a4", - "57268fcc11dfd1969add7ccdfb9c60eef304200150bdeadb50606a5af4178da0", - "81fc88258965324b611daa4dd1f97f3ed51a27af4913982fa604fd8611e89529", - "540a144a7e885ac968d4d34328f154004077f4a9b5acc4c4a3c77f7225c30580", - "5e7c6ea4ba8d82ecfa88c3d0684eb6a4a0089b45315dff0b371b1b94833f2e0f", - "00a0adeb10fb2591f10b994a28e9eecddae16ca376876b3c7678d67755334f51", - "31743e9fba1439b7f197672923ecc6965c55226fe0d5e926fb0d7fd06988d41f", - "0b34841881b128ef4e6874947a56b98665d3517a42727ba3823af57716a6b3f3", - "32a1c4dda8f1a8afa8edd4029a1c867ece0c5d4ede3a0afa557e41a24553579e", - "7fba790433f8cf4c00c2756557badeb6f273f5bf8d3b0ae116bb0714e0783980", - "6ae892c4b361856f22866c94b8e7dfced5b96f5fcf5cab95aae6e68f12a3c5f3", - "092df9c16a034632fa3509febac6fd45e5b271ec4a375650d242f8069ff6eb76", - "7dea2f6be9d0bb53441dedf582fc7aad38673988605bd4ce256d5d76cfdbef6c", - "cca332026923e50ca8e245a48c9111636c1196f8be166f16d7070ad6cbcef2c4", - "7e97c7502ca2dd3f25a17ef7276a199f8e8f38b6773e7e7c870936740ccf1c89", - "a6cdfede81611621973a8afab7dc211a5c0d70c0994b33c7d857abe4c5037c77", - "bcb11f60cd44bc0d79b3bde612dd3a2f54a035dff17caf9fd8e77d4e42b54404", - "c80e35f061539c2e764b7d8dc4b53114dcf26b6bf70ab6f7efe040529c5399c0", - "f1e0f62ca03df8930d6f95769ca052e8e59257212f3d93d91c45c7242dd117bf", - "100da294ddc87da49c15a26ff9b6bc8f346260a448655cf9f72146bfc27b22b5", - "938c8b1a697be3c2fac20f5ce3b95667eea6dbacd1f94d638eb6a3d8ee9211a6", - "9841f49166ecbaa326db98b8f8c8c45d4e6e5683b0beeb8a501528a2e673afad", - "a0cbe1d9dd77a91755164c82f132e1e0d2e2f6f8b2731027efeb2bc7eef301fa", - "9d31d481e7b3c6933bd93c11b3d870118fab97c2f1f53b1ad9c9bc0778654818", - "2dd64ef893c1fa6e6fa4deea44f5990b4ee675e04be5a684c37c9cf1416809f6", - "e67f26a46bc456a0fee3f1bfd180db33d94270365005ec1bbe09364bfb620102", - "c0797105d595bfd8446ea8d7d54bcb13c798c5974fd7bc6a09dfa9ae7dac6f60", - "4cc58c1886d08d483e65c93719891baaa19906d0dbfaaa78e0ef1ff5198050c8", - "b7c061a4ac198f8e618c2a3ced12215904561d2cdbcd100170b6adc55017ae51", - "03f4fca9334db69e589114d5172a8cc13ce176ada440a3672234bb972961adf8", - "ed0c9364f9c53273a3561a35b2a55352a8196b22e24cd5647bd5a24cf6613e50", - "a5e64629f2116affdf8eeae700a640b953a9d9432c15f6c7d77c2dd3f8371011", - "e584d0dbb78b253d8f7067d429fcdcc139f8080beb5b8531862ff6100af763f8", - "7a22fc60284c5c0d6444ec3e12f21ef0c38037daee1da314e186cbca899af6ad", - "ca0eba3252129dff843f3bc6a5f0b61772e8b1e098104f782587c7c439be123f", - "e85f86e07a8f44f7ae7ed2e20bf45f30d0f923a5f6bdd080fa2a139008b1c27b", - "72b162188f9e478d2f6375b2a35ae4805762d1d71d130b08d73a9f600a220623", - "86eba5489c659e69109a1d6902b9d4f59c02da7caaeb7df3224c0834d12918b3", - "c9077a598486f42ccedf712935676457b67b95e6f605f0bc783c7b399ef44871", - "d08cc1c117ab99ec86a463562484fd6e0122da39eaa856c7362195d19c8b7e1e", - "cf019bd9660ade97207fe34476c85961b0ddb3bbb7b167a0e1180f7c27c39b80", - "1a9fba7af5f673e810448f4df1b3284d2026affd2ab7f579f3d4d1f818bb5680", - "82506431933fda7d12af5a2ed2bc932821910c798705aaf12909ca7ecd4f026e", - "d5511c4aaf5d9946a04172ce4d2540d0c9c3879e108cffd3a28204badd468622", - "4518c4ad35ca841bda418d81c46e9739feeeb0a48e2d6654ef70444bdae90dc8", - "40458c562de3816015fff203ddceb864a82cdd799dbe0310cdf1347364a1081d", - "e2a834b875a55d200edaf1f2d45f2db037688e9165dc04c5a4d913bdc2028399", - "dc0f5e05ee7295149d62ca1872c724e05398dddd255518b37569dbed6d9a3f74", - "e8adeb2c2216a3525441cb788217ad5bf8f7211bd481acd1969063184a4005ea", - "bde2dbb37f37283c141ad025c6cbf7e9a34733abfdf91d465d93b99931c663b6", - "80d9e3ce413a247757be78f5e16434be0a9b296965bb574274db604ce6e79a99", - "39af87f6f4272b1e6c9ac672f84d9e0e714fb3231a108fad269dc2833937f8ae", - "58bdf59ea48002be3a395de7983d21146bb223b6d377e5eca51e516682099d19", - "a7e9342faa3b9f9cf8fa513b568e791cee2568881308a1f61676e67576e9dfd5", - "060d34ac4b7a63b3b5ead729bea7be0de9411fc9e2cc96ff51d01024e1383655", - "375ae1054234cf9a06636a61cb3f163ca5ecf4a7af0e192dc180df6181258aba", - "2d791f2b570a53a57a687437c8d897fb3b3cee9d72e858ff22971ae4a53e6515", - "bb133c3409215a1259ff291152d2c5d2572f6e7dd3d59554333a9c70bc274a3e", - "421887cc4090e6ea5d086512ffef1ed3fea9f9f09454d7c3a12323b5870b7204", - "15b78b45f36f5b1abb32332d232a823b9083a0d9cd33f4b1dfd903fb2e5fc139", - "9090ee9ea8d3ffba549aebf5f0e1b43062b5139081c41100f5c0350eacdc5419", - "4b338488418a2512d36e2bc4d52d9596ea108da29e4103021822cbf7e7594a5d", - "22763d4275b7d0b65b17936e301005892ed5d4e0f8960a24ff60c69e66f5b132", - "74832fc11aadb11f3bce3cff6ef3735cdbdd87eba6f34cad51c83d02d27c485d", - "9e63cf52a207fdbb8e45b5c26f48b608480f323defa9673c13aadfa363d4fa38", - "e7f757725c5aaa65468c500145377f69c97609dc2c8764ba364a9a51569fadad", - "b87dcf28cbedc1d5a3351559666f2dd0b33be534541a1dbb7a31ee0912ec8d26", - "b63c1a73452f61fd18a12358c41a527ae5edde257515055b56e371331adb2584", - "5a0354e4275fc33d2a02275734c65928341db2436615af5ac19edde38eb7246d", - "7f8bf0dc7561606efb31832ae4925a14bfd0a44e31aa580f7fe90d763b03adf3", - "8ab4b664d00179e85286e8db5c56bf7c56bf3f9048fe4eada7c41f432ed7a282", - "ee49be84455ee097ca251cf344f4a9c88076169011c068481cebf1cef222fed1", - "9176a0994402f0ce1ef85a549520717db777e73355ddc0787f1daa56b5087235", - "a55174bbb0fad31506cab13e50085ff4e69c1374b546234d9f034e8fc41a448d", - "d32651a4e237cd7a9e73885d4bde6a673ba2d36b991e2d935e65cc0ab7edc4de", - "277b7d714a1d5d877092dfda86b912ee8f98f79c8d0bda30b25e7689dd061dec", - "822fcc59a860ab9077a73250e4860f209758ed433f18e744bcffc3a6f8ceb9b9", - "aae88f454e663a16e56d37f1494b2c4fa1fde4affbf64505bc01121acb5e25cc", - "3e35aa8d5147679088795c8ec3c3916e241787fee711d033505664a1c1296ddc", - "81305ed9f406fc18909e9532786b7019241029fe5328ec68c4aa8360fb0101a1", - "1985e6ad7a5cd23d96ec1997c1e1b695d0c6461272dd288c2ef879e0a3b91c35", - "e76a5ab105e68dcae27fc2ce0c2ce525cb8278100e74bfc15fea8d8623cdd418", - "ebbcb0d3212f684ecaf12238b74c6764890aa1e33997d8aad537de195f38d4cb", - "c3860b996c1a4a50d26b563a97a020271fe2f232b85920b6f382e071589b7eab", - "d0dbf900b4f7151fe9715f4de921c423ae4e8f40a40f628a0589e6ed7543bbb9", - "18c8d4f1dfade0220571d84ae2a9baacfc3e10be0d105e553062c36df2782e0b", - "1c3125c4f8f7c5993036139e65dea3e3513cfabb8c171b9be8829b2d93b7214b", - "792e73d581fa6ac1972ec16db8f633521d66c2724f1dcfe72718021d979e6063", - "0eacd4070efa740fb8c02e364620651e806ab21cf64490ea6894c7eadd2d270e", - "b4446a4d161e7161a6e050261a958ea806007eae728afc9029e5489a901d143e", - "5b233c9a580cd10bb1d466d97093e5ab1bf0467bd2715e47e81ae057fc118ac4", - "f73a529b8d53c1c41e9c03d0ab82d37d521c04db765f63380c5c3798ad3691f7", - "2008e88771d58952b3a575b2850525926969d5d594b9bfabb3c7a56c85e36f84", - "98b716c00c878aeadef0b5de3361068ca1ac451620ec8f8b717d2be0a094c8fc", - "b22660ff3f3a16efb9c51aef169de2664effa0349e5a3bf55ae24833ad2ab4f1", - "97fb837f24c7d50916199bd406a6d051babe90bdf601fb8841cc40278be9b41b", - "0f3fd09ddefd8987a48c36cb8dfcde374ec9d275069ca1cece974499dd3931af", - "50491cc15de2f25e311f44a7bfdbbdcdf503b8b1c78f96c30c671f356211e3b4", - "82cd28716787217b45f1e937b0f1052aec58a176d87e714e8134d38c8822cd6e", - "64d9871ceb8b9b15f13cbec478ab169885ae3354cc7bda589751d0429055ef05", - "95c0151b22b030b374b0289a47d8573f25b82950cbb16f1919c756a4fcc03d66", - "7bed7fd1682b91166f4786242dd78630fe1b04e9c01de33a0c615a091be31f8f", - "125a9553e296a3422b0d667e5c1a59be6e9ec006cf34e52487c6314b30c7bd8c", - "4c5bccd1f95eb5ab1d2fc2ac53124a4bc5a4d7ef7a405a72e88960c79414c0d3", - "3fcf293401880f0c1407755c13e4cb3fdc876fe272cc035b8a10a047cb25fa3c", - "b81c972153a08c108cbf23a801052a90fca7052cdc7c93c05a5931d694542f80", - "73885b3d568b18ace3e9981b79c9919eb4dab26cc3a29e035b10e17f57eef337", - "9f921762042c6634b65d5d93a978dd7d64055727dee3205f075196a48df43417", - "240d72d282feaf3d187db419e711767cb4c37610ce99b0c8fd9d4c3e67562d28", - "f7bd60281ac1d0f4904439c611c581ef07c9959f20bc17d89c6a24c8aa71f26f", - "111735480c5283e1d4a03d5dda6dc8b88f56df6b66aa026acfcd470dcf9825e0", - "fc0c2b2418e730b11462c38e6522c9d9a46440a0279d03acb44648343bc2e0d7", - "30f4e2b23117cb3c860f08d8693c1cdfc59dd5fc15d195b6ab2e7e4a0f1104c9", - "5efa2796295607cfa889feea600459170fbe9f724d66bbce939e80526fed6ec6", - "f60967d3fbcb9180a9b9d19708bb6b4ab2b12a94197c36d1a53b4286774b84a4", - "6b261d531c016f99edbad161d4ade13d70dcf518a53d53f4706fd2725d10f861", - "9978b1c69bfe6b7e7d99cca3651f76e8d5403d884ad5a7020cdc4933c4080c85", - "82b2e643f713fe68c0f5971b7ecc1c337f7e56e5914b6fc4d450fbb782e87a35", - "e37af11697032fda9c97d54c64aabe5566a6e0561debae022472b7cef3af7742", - "b1a6778e9f020d50340e25ecc0da2a103b26016e09b572516ce182c3dec6dccd", - "288ba6f98ad9c55a9eb1b7f984d7ba93d14d6bdb92222aab22f81a4e94154753", - "9f09fb92a989c17a3f9049b270e412587a06991b3422303726dd84649194c983", - "feac1b74fd0ab27ccc8e8597d0dfeb3f88e5992226f12811e790c90b5662e9c2", - "ce459f38e6af9582e300a36883cb182411dc0dbdc24f637bd932afdaa3de572f", - "8f101d8123e846dbf6074ff1b731aac388298ac835173d044aeef77a3542d12c", - "37b99551e648b933a70765f1594d75d8c5bcedc5d1b622edcb88e216ce2c2dcd", - "e53b62dcbab5a5af11b7174e2bcc99044a003eda659849f53ec33f4f3eb7519d", - "494b964aa167aedcd1f5ed3241159c0a5d32dd59b4ae526159666f40e13424c1", - "ef54253214bb2fcc783df5be0996ca4f7753ddfd8808070522c7dcadbf79785a", - "437420b6bd0cbd342ae1c8d9fe7035a0ddd47946a8aa65d96520bd57465828ed", - "0aac33f0b9c9ad3db28931265314840e17c4c5064a06f1930fb54a97da7b6519", - "fd8fdce3ff4025a23b38488ff6d54ee53dfe1a622d14adbf74753c6b17665a6b", - "41ccfb1fbabc452a22b4d74f795a72089325645bd066a5c550c4d786b1f683e9", - "5077531da0270a9fcbaf23355f6ffab14a9197bbdac942e20549ebae5180c4af", - "7d6a48720e491340d91b132a06c9c74f192e37e4cb89a5d7e4e6a5a2999a1bb8", - "8fe46b404efaf29339d89da0f4af2bf19582fa1400771b211fc4b27f4fb00992", - "484ed87d7a26bf8b5998dfb9c547018ad7e83344fe7deaeb3dcd37552841c7a2", - "e53dd761c995c53a2b3de6a8b60b47064332126658e01d70abd499607f94b149", - "ae673ed5a79dde6743cfb4fc4e5bb1572071bc6bb1650a364e00f88581914198", - "91e0d609097534c3e951efa41b66d168baf04f649e09ea1d5725c0b59f8e2914", - "3831be4a5f86f11f28975097236c13086d7d08d6cbcdcbe897049c27ca215d19", - "cfc73b18d84e7edc60b6b561a532bb9b342cf6268cc0df56ea56812473ea5893", - "f31dd5e586bc920cf809958b11398232e2d859e03948f4fbd61ade7c85a544ab", - "dac583308835f0549058f3246ee4ff48b588b660afe6a287ea2c36794e9d21f3", - "91dd7b5989fa11882da18ed1dc5f53cb42ad0f1fb87afa513b87db5620af56d3", - "0184af22af276029031d883c388bec6e0f574f733d6bdd6ed030fe6dbd579cc5", - "1197b599a9785996b9260172de4607a81a1ce6f1ecc572337f2e2964c2bdfc61", - "a7f8dd33c6711315eb6c10ed3600255305d5aef78c5de51280f144ddfe861a4b", - "800c7d2d74282c66610af5c68561c01cbb7110c347b5a33b8988cffc5fee468c", - "df6a2d77390961ba29997f7fd6225709a08b995b277300f52b8e41cf393ed7af", - "870c993ea391d587441cc2eeaf425302c9c0f7630107dd22b48879d9b083e228", - "a40bcbcda8a63a87f1a30f35b2d6dd938186c4e9ff4a34e09cf1004874bbe4a4", - "8fd8ec7fed15958781e7741ba957892f7ef6be0b980b244b17a68270a6e469af", - "a69d443dacf0869f0592228e7d96fa3e062835112577d42769503dd139a7b8aa", - "11e640bcb0f861b6b4bc71197218ef961ee863520fea0d5252fe1257099cdecb", - "c10b5f011c93f20ce2eeb61c621c6f2fe78b5bdf7da55192485a892e0d766e63", - "f8d4aaf127e1bd087bb1ae9bdcb2ab3c4830f8499360e0c607df5613cb8168e5", - "b27528f0fbfe4dedd2cd97bb7976fcbbba3334be635246062dc6e2f1bc44ecd9", - "28de2ca6664e0f51b381f7f91ff5dedd60d9a5d3b26020a334b04ed7baa7b69d", - "4ea500b441fd121d497878783c50d2e3161d39d430494097bcfe70e8800d993c", - "7378150be9af9205e9d745cbb9b91c6f0b3ac32821179445303ac99433b08200", - "f910de6c218f51571b1450157dea8be1f6f9354715b4b53e7d5757487c825223", - "e2bec55c623ac4b43c1104a5f2fe1529f64b0df9e0b4e5ed42d98eb1ea9b06b9", - "4c6ab253a968b0f1db47e5d856142d01c65b11f057036b57c17c31fab25ce29b", - "26ad237f2b9c1ad3fb18df19a6cf0494494cfc1659e37daa92d2cc0ea5fb9997", - "726d8edf1d44c5db9e215cdd2de3b1ffbba00ecd7dec06f92a4731cbb4785882", - "dbb1e92075b7fdbf553b6d5f9a908458a8354fb7fe7801dd87a598fdaebdac2b", - "7bc530ab4575fb3aa2540eeacfcc37186de910dbf958e54741c852d8bb5876d4", - "c55042e386b71273db883d9a1ed0d79d795570e44a6b2619cb222f4359f4e934", - "783a12a31e94b42bdbab8177558ac416fd59fbf74e46b0fb17a1a1fd336501d9", - "0ea246692f81b5a0cd261bca55f5872157f0be6f9983a31494c04478322847ce", - "baefb5692724f259522764a59a00421972a36dae4e3dd2793aef8292c8a31a60", - "07b627b364cd7af1c226a01cfddc838ae1cb581ff095239741ef61c31e6f8d77", - "8625ef8d8c10a76dea1dbdbe5cf2253bf0da688cb8b416d04a90503abdc03738", - "9af687f173b5bdb244ba441edbf2fd858017cada9c815778180e36d9fec269c4", - "86d6d93a9209f257d369a48a661962cfa1c4e4daf905c400461c7bee84b629a1", - "61b2c9141371a7a36cd9c607e43289e280da11cde893dc148d3bbb6962ca47e0", - "b592705370a18c3a3d7029d3ed1f070ddab323c99380622196e5ab413286a0e3", - "267355c2af32c47e6d52fa64160ed5802241aa220549bb717762c3df1ae0a0a9", - "998fb5b9b3b3dcb19316be950de2dcbf77344fa7754917b918f85bdfb3d0d76e", - "2bb685d6305a675154d37dd23cc69cbd93b5ee4c13dcb398b9c49b5e12a7a48d", - "79f1461f53e414e39bcf14478469de0dd937a32619e49313c1a6aac56d390548", - "0c2e7004effc3ad897945f545cdfa165ed0cc1799e74499a943ff6eaa970fb61", - "f9bab4517694abe216b9cb3ed97749343b573c61ec4789ce9f18f48417b07a5f", - "35d48c5990f8389f6d68e42fd494e7b9c10a80b79f3a26ad91e8935a4d4d18c4", - "ee83ee30d67601ad194a9b014626c244f55143ed100eca5d8d6c12ce55e1e3a3", - "5825dfbc3f3e02f7a5ea53bd6c35fcea0ee8c909d8f954f541cdc1e682513354", - "06c21b9dfa04fb6ffcdf2a012f5bf1e4659bbec4575836da9b4008cc032547af", - "2172f6e5884115b8aeeed21cb8e4825374e2ca4f92d4560c823b061c3361119e", - "afb7d4f564c59d63ea6ed55f1c30c91c045ca9440be659c42b512996fed197e4", - "6b8a579513c9ee6bca5c7d80317f6b8f59b68983dc34932b66965e303b07f85a", - "c8f083419606b049e57b3d78293d4052f1b7120aa761d2c01a0a5bc96583560e", - "03935b4b8573eb58cc38c86332de6abc9d9fec42814f6422f7a1478ea94a2d6a", - "02c30df8e97441c6e75fe2d5fc39509eb515970a9229146085b6bd691087b3bc", - "68b8484685343504490c0236b1fe492dc6507baff718e002614b9d87e2c8e862", - "99d076dbeab17881476d6780e6b54669879b85e49310e106f2c701781ff1cae8", - "b2c2daf4a172f0d2c4020e862219056127e4a76a1a84d32c2983d4507c2d31f2", - "b59d84ca9e2659d3d3c8bfe1dec85a443e65532d0d47e5a66a89805df5540cac", - "c62672cee7331439d0dce6e7f4949091d7f05472e9483a29f7b30788776178ae", - "3604bc13cb29fcf282a3ac4be091ad4b1b33bf57b7d50731dc57bb039dc37c06", - "0fc5f4476d448283a0be306e885c3475406b8e96fa13817b393ac68bb2086905", - "33d16a318dcc145761fec15bd76d0f79ad0d1eea618f164181a6c288a1f2e2e9", - "693829fa67fc2acb83ddc93f9e2aafaa75fd5abd8654d302555bc5dd38165187", - "e1cda5d28112b8f36a3a06f735b57ae2ac6ef4422d33696002e5d41401b15efd", - "b593d0a7e2ca32dd1f557b5ec50b17c18710aaf9b3a335d5101c6b55a14117a2", - "df2c2c4f2f35ab166bac94a0965bb1c24ace6deeb2aaee0ef1f5c15b566876c4", - "1c1195247b9991f704f4d5b8655d6f8c7b53039bfd4a9868a0789690faa2b92d", - "b566f9f870001c1c586d875a4cb2c459331cda6f75fa5015124bd1423c00204e", - "e498547ded3c40d70a59ffce782b3075b75717c43d65bf895354660cf3dce894", - "815db5ee0f47bceac32ccc3a69db9b6d47a9939d99c3dc847285b59433c267b8", - "b9d8abeee2be1e91f9c2a86b415acdc57f707ee19f0660940108af708ca7a9fc", - "79abecf3250bf61a6666e8e748419b81a15d5199e2fa297652438fb6d047049a", - "6e2b405db92c76fd07d09eac625a0e4e1a163d9be55ccf394686d8e313916e8f", - "2c8dc24f0ba4af363a55823eec35499be16da4bbafaf82cd1fe4efc4108f1ee0", - "487c0fc77f4f020eec2e9b8944fae489fa65a0b9b720bda64d2a98d6af84f462", - "006f1519602cbed151a594c3a1404282b8c1a596e0b2d7296e20326fb0a32395", - "25d8efad73ddc133ea59adccb72db30f76297471cd8c31bec01369322482286f", - "f18837c498e7571a0736c69f386a216d36880547322bb1513dce51bf0f3cb8b0", - "12bc667152ab219ec727630f93ffbfcb6c9b4ff96a35e45bd9aad0d5fbc71e2f", - "1c8d6da6ff569778cfb1bf20e45946f7e051811eb03b0c448ca0853846c74c12", - "16aa01b72e31e008ba11ed840c4dc95a317c47915d5f736e63e5cf085d4cce37", - "2fa19a732eea61eb7b829bffb33ccab24f75b307c5f9a2ee83595198acc2f8ee", - "8c83ab7586ccc72b3e38c33246a9c495859f6ddff7b057c7614f4436608cdbf0", - "97bb54a127aebb27b0754b3f5c5c3d8aa53f2e4bac095e81742db664861335d6", - "18d99e7bd428ad8f9c67745e43809a6036f85b247e9b151b13fed5f99ae4e2a7", - "940f8731c02828b1baa5e0c297520a1bf59ea425f18ff95f9a75ea7dff372fef", - "d0bae04bdb28ee2b323b677ca23aad019eeb0adc5abfb0b62333059638212b84", - "30beda5f02a7b885d19747992800709ad0861d1f7bf5a46bd1abd6544fda3753", - "8fbb96f4b7a6152c4afffe737032f800939d4a30f64be61c7e4c841bfce31a5d", - "926e97ceafbf1f9f40e5479a6170dd741f4c8f6aaa2ee12c0ca859156e123e2a", - "275bcea43cfa0ea3003695c0eb68532d42ab00e0111486f450c404faa1ca0d92", - "29f6c5ac72b2e3df039d192382ed1ab0d1d9164470411d918ddc258931c28fbd", - "e3c56ac09675ebef62c061b1b401ca835cc97438aa5155e5d5ad2f9ad9dc6eea", - "2c2619a6c742edcb855762de09f999ebe8a876fdc11460edff63a06f5e731a34", - "75262524a2a69fd42078d908ed6484fb7790699a04afc73f52d1b40947f28493", - "0d6e2d1a6d1c89e617fac8480de689c1490cb8b11f1c6cc615dbefe83c5a356d", - "0bc82c999c2a0b10171a042573a60b5a6cd91be3ae61f59a7de85f698a0cabd1", - "bbc6357acb6ec5c0f3735f7ca8dbad9d3b3c3f947e72d477bcc735f077221b97", - "61a9be8310d3c36d2729e745bb5e611687d72c14741f3ebda6ac5f6b669f55b5", - "093b6e42a099e87ec6e501182bab21d84d655aea3b0e5f401f431b809f75f167", - "6ced58fe84ac320d8e937685620a8962332fac14e76102e3b4e8eccbed8c5935", - "dde64c3fb399ae4ab276380367344b1d31f7f36ceb02664a96d97674fa226d64", - "74f7d940040455df93684a1e66f6abf33547cba7635f4e8dd99b32164c6da633", - "f91886435056b57e98e725c8bda053d0fb8c89d4aaf151047ae097165a7a6a26", - "0b2c77ba40583d2a3cd0b2a20487e33d4eee936187a55ff535fef258256457d2", - "37ba731ef08bdd7bf98f9e73a7bc68b3ff528b6fce5e4af73dcda9719beefafd", - "8df4904c172878dc58045d3a0d6bd13c7e2aed17738f9c91b2f7529002b56dc7", - "b2633a3f094af1495fc7a53b91da3cd6640e787587dcada4450c191a75d72015", - "a5c8de7911dcc377fa7cf0428bb8a416acadda305ed27b5fb4ac22cf64f6a9bc", - "8488a90decd543a115c2750cc39bd5b2706338bef15a5981771e5284a8e8be8b", - "236543f301e03e0a279a29e023c30a645ab4decebf8788c419167b5f76bca88e", - "efbd573410d1d48d3cf1edfd53d76e97ae3ee071daf5973706fb28175d199482", - "9c0ba8bbcb1666e96abf6cf2790f254ff6034354696178b955a812c83aa66dc9", - "0bbf71429436b631afd10b02790b6ee6098db4d00e20e70a2e0fd1cc67193cbf", - "6a4660e9226b7201fbcb14844e82b62b5e101407a4624541b41676d0e2206d47", - "1a59d5db844858561da60e8f604c4c7525cc1050fad2d8c35d01966eee39bd1e", - "546b039bc9f9e62ca1bd2ae2c53ca0a18e1f4da237d0599084f3ba6e200f1f9b", - "ebeca6cf9db223999845c72ccfe8d68f3cac2ea162cc1398830627b12fe620b7", - "702710afd31fd8f195dc00fdb3f443d9e6aff709602695e7fc01e5baebd93d2f", - "d2660aea10e9550ce188de0b429e9766d20369f1ab87fe65380fe6f61b383cee", - "e547949fb06770e00bbe37c27bf96d963777ec9cd74aeb0f979e421488887798", - "1a9a3e16c579ac5b8e9166a8a76a440aa9691a2def5d5518b8c2bc02ebb884dc", - "2800d622dec414eff499fc3f1da0322f869a7b785b479763f42ac532c3d008a1", - "a963185e3999cf38b2f85811e641d76a3fef8ef8a308d04afcc602aaa9d4d0e0", - "9b848bb61255b0bed620b971720a117b83301a220aa5b01ebf4ee502ab1b48d8", - "9c6713959045a3a7a4b96eefcaa58fd0541032cfefd66998b724df62341d2254", - "ae1cb53592f1a0b5b80a8ee14a7f9044340b9852bc932b20099a9b732d545d40", - "c759685d26bf00bad75dbb1d973cacd48aa992c1954dfe670ebcddf9439b1261", - "7609ea7fec856d2a48546b9520c2c388bf86ddb1a3ff9f96afcfb5a9188941fa", - "39fc8cde41b32a4bc29ca27a422b8acb3ea6945481060ce24264b279c0367b99", - "56375ec9fd7a3a08cfae82b2b68dbd06afcf15c539356b2b5c52a6236ce35bfc", - "855fcd025733d0f56f6c00e167e9b1b83127f32990d67b3d93610202e60b5ac3", - "5944a68a74a17c493b9ef8110c6465718c6f11bf6b8bd1a003dd6107153810e6", - "0e976057e5edfdaa980e9849792483b9774e9f5eb25212c51afa904a81712b8c", - "26a5fb8fa6c603fd0af2503dfc10bdfeedcdb9f59e400e7725f13d70a6aedf6c", - "8e7e537f536e41b644d526fe7fca9a322b8b550e3ea239bbccab49d87a70f47d", - "ff09f61de6d5b14d3651b963d369f86dc593ed505fe2c510126b0faaeaaf46c1", - "d0a368dffc1fa51ea41b38c474456af7b336048527e78cd623f9ff46da9ae42b", - "ded3c86465866546952ff1a218c858ac851a62ef320607eed56e31b01505f60e", - "ac808317de8a447df966f9f2e4d021cb68c43ed7e42a227283edad9d88632950", - "6b8cab995b1ea377732be79d71ff787577eea9419dc0c4c4d35402b25bd60c13", - "4c143fca17571e2ffe9bf4fcd8ce9da6062fdf88b76db4c981306aafd6d83835", - "04f6283551e3ff443528558eedb063c13956feabd629a02cb0aa55cd1a77a6da", - "659d16442b7d73494e5d7bebfe010ed7b1fa4fc250f458a9ecdf5baaa9e4e128", - "79503d1f441f26a61fa1db8c2407131d8e753c0f7603fa92e67072e9a8d0e106", - "b9e5f9e4e9ea7215f15cb752bbc0c54eea04b0af748c4ab97fe88c8fe1b96c1b", - "c1915b6e635b86ef9342f28adf6f2933f20102aa169111a82af24bf6fe40b138", - "7593050417b1b594c5543caf0bed98f16a827510efe09c632890f0077a238e13", - "12f9d6d425e04bc87bf73dd89fd45150f882e0b49e09ab068d3a92ce690cd82f", - "51e64f0ff58de3375cda496e67034f6d12731ba2273a69c28a47c0c5d5b1a042", - "dbb120bc565f33fafb3707c82f8ea09090d51e9b561f7ed6474abfbd3ab01306", - "1385d3dcfed0b5ecd7544dfe100680d5f0a0cdca5331b3183d2c85fe32cf2a24", - "410157cf87bc538338271f9aaf4d1add9dd36d1bac5457e51d0f747aa6711fd8", - "84cc03895cdc56e8add36c7babd6579041be17953c2616782eb8b9699afc8965", - "89f400ffb81c2b92b23ff2d122275372fb40ef0a67761b58be2297140de62dc9", - "dd61141921cf2743362a44cf99856d470d6caf3269d63123bd751b972e132cbb", - "4f50dcc9682e215bd8c3ada81fb287511185bd720de2370d5b71f80fc5760555", - "a823392700108099b72ecac63e1f5702a49b9226bcbef50ddeebfb225b8a3200", - "ec567beffa36c82b7b661ee326834e9661c127b03dbae82851a3f4c11f832b10", - "d8814f0428bd17da513cb1b3c554fbad8dc122d6e559a349188d0a6d72b6ad51", - "46c7376abeb98732c1ab6fa28297128664127fc402f75782c3ca8259b45dc6e6", - "72b318b5c26985f466195e223655c0e87d1bbe6675b56ff00e4a9b137bd00b5b", - "20fe1436e17f351c6decf8675a4821ef6204ea1745e48a5b614da65f3ef33c08", - "2ee78120289c89c826502073a70161683c77b9e2d89b4fee7137d8fb14ff1298", - "19ca427773c38893bc7ee3846d590a376c695c97b86f98bd57d6580eeb742e0e", - "0ab458308c51c9906a334aa224601ba98b029637c5b2116e0cdc6e5c9edf79e7", - "111eca86a2acb805a29ead466c28c0843a72549ac475776a9e73544080cd8817", - "f35b56ad6ffbb5f97c1ac621913773c7042abf5a4d7b68a29483070ea2227ab3", - "51b83c89ea69d0d9745eb5d7c9fbaa0c6d6ea9813d5c69ac28f64784a8e17382", - "775f672bbc0ff9304a454c9d6c7d220f49c7e17e561ca9e5cca16dd599e2a407", - "9a7288e4a8eb754f43a2751b1e71d35dc7039683cadff6f608225cc1e8b55562", - "c1dd3e362557830fff7d8d1daacfeffe08598c9b38405d34bf4180c9cfe276cf", - "0fccfa52feb4465ffc5182bc2157274d314794c11325f56b7fb2ccb9900bf5b6", - "8e1816248a75493217b5c3e9a96064aeaf95fa1dd6e63315ce1cd3a3c9782ab7", - "396046c09bbefbb6fae83bd0e5a293bce7c0eee576a0097ce3a4f965501e81a3", - "eeef7bc007973dd84d9c05199e78446746e451c0b35a3b1842fee2709d4a35c2", - "f2a5ff9520c688cf4d07f2291f17fb2d58a53ad6748f912c75534a87302bf0ae", - "0a5de3d208544d3673a151909532632ee3b8ef3984988b064e0182763d8e956f", - "a3251c2e06b7e63fde75c971a94ef9fd9b4a6f6889c5be42cc53006e15115055", - "29008c34c6f3f3853796f9642a821390b7240579121ac25721eb7b350647ea19", - "d15683324a0593c2b0a24094e967cdaf7703579a5b9195865fab04d310da2b0d", - "ec49495cd4e90dcb94e53215f7edba3d3e8445849433c1e6e99a673ccc5cd46d", - "d12cc33b105491971d384c2ca13ed800b0eb30b0e7ca48914bb30f48739fa354", - "541e69fc7066710c4d275c5fd05a8ca7a327c993d316dc6c32cec743dc05dadf", - "c241547208465350ba96cd35eb5896b24c4c06d6b1c3250b9995c368664ef767", - "143adb089640f49c87e461729aac1ce7e1a34fd3c8e6e7c13d9cdd73dafe48d2", - "8017e30f77ac535dfa8aa318bdc85bcadd4b341c2518f2472b68810591c7c124", - "e53bcf750a3e809b5eb8445abf5b890714108a7285c2b6189f6eb493d6bb65ef", - "9cc6dbe60ed7793c557fa74032fcef8ac0fa5060d4b078225c763ab3c013f29a", - "51fe513a2233a2b43a74ba619620ff419b204b18584974e95983043e8414d0d5", - "fed7248ec27d2bfdb8aaf6942852625ab5f50664b10522a194622980dcae8770", - "5b20dd1bc0e596e2045152b950da79c7a9c7267e1ff5c863032a260fb5632862", - "dc9519f395963356fc525061e8d775fc52e5915aee925a7430ad1c47377f0c26", - "79833da3c74b9787615d61f2eeda995211380365c554c5cbfe0c9f6bebf564dc", - "d1b71af8da4b5e140f89b467c5fa47ef8713d81a8383814c2c6f798a96c8fe6a", - "53fdb6f681ade11879b7931f17d7ce25ef7ffffd1d739ffd8c9285c0ab6dcb36", - "4b2d3a8467065c7c43d6be1c5a10b6c1253045438d0d9ee606be75eeaeefb82e", - "ccc109bf82f0e924b66ff6853b68e679812efaa80f3719542e66e0b7293d5c2e", - "95ff56145a1aa02bcf38912b3d3d0ef3a6f0144b18ee6cecdd386517c870e01f", - "a8de314ce8e47aaa4c60378c245a8e663c45a2ba564172afb1e8a5c139beb921", - "d0468b70714f67e286d664f97450b56198fbb6eaf10d972ec9b5874a913cbb56", - "d44155250fa7a7e566e4a5aa43442f928765ffe5e22cbbd8105d7cda4884f302", - "a56374bd9687b6bf8fca3ef7b2bf55518c6b39edb511bdfe69917d92aeb3ee6d", - "d5cf70b3680c6cf83e059feead3144cd7f21b1ccffdc74a046d8c365d2d94b63", - "74cd6648da9e42dac5b359ceb6be3ba53dab7cbad25b42b9ae360e55ad032e84", - "eac36c2f7a808fa0b741584901edadf63336c1e1fb911f9a386cc7a32ae1e93f", - "562ecd247986f3deed5930ff86363be3e63c84650ecc45af04c8021eb3ffd65e", - "24d4293e5a9526aa0102e845a9d446be875aaad956fa94fe4b223552f1cb30ba", - "a61e81f6e0b43591172ae6f5aa5b1773afc5479658a1d60181a6ac2c4b156cac", - "12ff8eb4a8e3b9de1bc2978ffd4afd9bd7e5a2b7e61521e5144fc6befbddfc2a", - "ca1aff8950fe5fbb05421d9bf0028aa1c5252682bfa6a23158f065ec163b9ff3", - "a06c0cedb69df6f5e0ca8a1a9a0c5643da3a39a796d3b72030857aae5dc03ffc", - "fae1a4498fe6f3f1429dae677a089762e4e1eb3bd5e4dcfec3c1399be884253b", - "cca1704e1b05646ff519ad8bbb920e7f113ecf94b156137e6667883603fa5d38", - "940ee2c8baade0eb1f07258a99bfa1b0c89d4d3595509b6c833592b651b6957a", - "59c6cdcbd333c3778bc7ad2598e1839066c76ee05fe146e97719998db723e29c", - "e908351fa55cf2c83990285ea542a75545eb9ec281a603e107fd01df9d19675d", - "1cb5f5c79d00ba67f44ec7cf380bd26c4d64b814523da4402dbd90bfa75f3e49", - "3e66afc513803cb8a4e3f95e3a1650a0f30345043e31ad54449905d52b6bea80", - "2a302f2fe7679d2083b0a10dd3f0f00b6c83567dcaeb7a241f4849ba6ca56c96", - "93490308b202830c84f39a7f367c3e450ec7634f4cd3f1cd76b2e2fff0c795a4", - "5205c14d2ae2efefc4648c68c5c03c2c66fbb856e51024c89bad166fb136f27e", - "59f479fa9d04aedbcf41344a2f20dc388124fb304750a3495c549443ffd50074", - "7cb7e08155d411f55b4a55c059249f930aa4e8b6ccd416479724da3e07dfc2b1", - "610f10269f4207cd6fbfa0f365fc3d431c216895e258e5e0b7d8297b6869afbb", - "3922caa986f0a754f6885ab92557ba3b08e0138c03256f309635e6e44a10bb58", - "ce2423cc6ffff7d65f9e42c91c3da5f8c8743192632995916e0ee9e519c41b8b", - "1b9e24b1e22322c85bdfbe98a76c9db4a55e549e366aa9a2fa76277d1f6e18e4", - "45311e0767c4d9af9ce8beed5f13b462d9235252a89192496e1749652102e703", - "4d315ce2246feb943b1021238d3d9e5df462f015a62f73be6e318fcd50175a6d", - "fa941dcbedace30d90debdd89199ea80cc66c47047d7c3bcb42f975a1909bed0", - "ff893e662274e73be1b78577d5ac62867646901839fc312cc537f9e372578549", - "d5fa1a1dd0ad60bbb949428828ee66844ef622884b4504360593cf5002c952d5", - "9bfd0ef42e7e332ae43a670c9dcb4eb0967180df5ce79b24d7f5c81d4ce872b7", - "4078bd67394581d6f9b43f26aaa4f8af5de5795a541cf73849776088049b6b8a", - "7bc0d6cbbb4f240a5c762329f78abbf6827a9ac1cb1c417db4633a5908c8a95e", - "a9e62d6fc9891fb629d57dc6938f179712b12f61708abeb999c047a351611395", - "8ad18be073e6b0d8012f348bf28d7879cf576294ea10caefa60bcd511b8725d6", - "cbe51cbf1bd8b7255e416b50e3567f84facf3b932d9101484914143279c9df14", - "76ba15e89f3c9b66dfacc7e9ccd50e967d086f131286d32bbec116fd8a3cb8d1", - "6a5a79ca7358c5c85269961e1af8560b21d2653b620c56ba6ccd6bdf46953580", - "29190e02d94791b99d37747aa9f1951837db47b2f6c50f6af721b61006bceb78", - "a65ae6bec4768679326cf0eb5f86299784eacd2b439d3568583a91523c0d7cd3", - "a18707566b717e4cc45a0de8266e6fd089f8c8bcb660010a14fcb505f4aca8ee", - "d68b520d2ce54a472e438f5183683f6e67498895985347307af1ed2a2bbbcfec", - "1c6ffce6f85713441a5eb75e3a84c686278a7d3f55c4c1325dbe9740b994512d", - "ef55b6f0c614b90c3f826fc6e6bef5f619c2070012a21edb60901a62a956d5a0", - "11c5a47d84501cbaadd4645276af3b1506eff50eeaba36293493e59eefd8a971", - "aaee80b0b81448391984fa4b8ab30fbe26e0ec29c519fe4c5c8f7999b4b7a6e1", - "97e54fa1f8d598ed2e54327c9253b639a223262c813aabe7029cafc8c8a54b8c", - "3a7dbee793a751ca196b78098b70c690d45fa7b5d96c60c779d606f99ceb4d4a", - "e99249baa39afa134cf896025ae39ef5f928904a8761a7ca140bb98472f6d298", - "7f7b409626d5eb82eaf31e3b23e68a4b02953660de5e9c30ccc86b3e36df3557", - "897caf8b8c2ae73032b6e642bd5d25dc82021b60bac8b498f7fb34e0f8af0a98", - "deab0e847fab85e4aec4d3f4a4d2ede1e3cc5afe66afd1f3c75cd510e1ceca02", - "3118cb15212867ef836977e68fd22d7a7e2fbd6b5fd7eb0fc90eb259fd9f2d33", - "0f801a59ab7c5652d9dd3d4a31d52597deb0ff59ace09f9647b2756daf63a1ad", - "bbcc1d8c11bdf7652a9510aac172218eb2bd758f6929ddd032495a37b9d9d440", - "5ca5764708b50043143e3c49d7fea341816847756abe938ed0701c1e99768bb7", - "dc9bd9a039f25028c93ded342be6dcac9e5ff89bb682f004dd9e7dd69e46a044", - "6b9cdf9dcd004617743c1c159540e9bfb73eaecfb04f84e175dd670b40c22441", - "5388d33620df6cf64c70fdcf3dda8544d708fc8a2d2a7c1cc2faab471bc6cd7d", - "6a78b9bcb211be1a1a5928e11bdbf77117d67935b343b82665846bde3a55217e", - "5d2d028aecb7f1f33535bdad815ac1bc8b8b8b80c1331aba3e870a2a0e71189e", - "b06d968365c9639c51b204c19d0039e44655b278bada093d5566ddffdbcebce3", - "f612856566f38b5b99e19b4e45068790498255e37e9f6e622734e6df2eaeea85", - "c535957ed9ef02cff42aff9775a8cbb7751f71a393c7461acdf017b45904f484", - "82e4e214b62a65f234958a01abbc85201ddf03753f2efd676ebed6b74de04319", - "03dd255c19efed0c6ebed57d948f3a74b459e9af250f1cca691aa9639b18160b", - "ae2c427567667876474b4ca5ae3e7f314fce5f4d9b57f04ad8cb5bf60fffae7b", - "09403ae3aa812679e2a2fca778812c37fddf51a5f7d7782c69445d089706088b", - "03d9ca7869d4693bb04848314a3c32f70a2e154b1c099fe0839cc689eec1c433", - "e5a0a7914fa67db172858549484b573d03a00b8e3dcf62866cd98c9989ad2e8f", - "f5d5c963690085b9c253fde0f25a1f8650fec9814645099dd142a17a794ffbc2", - "e470bdec33d2a16a4471680a5716b355ebba6978feeb4992b71451efc3056d9d", - "49b4279272dfa09591bf871b4618e173de806588d680237ac2da1b106f2d64dc", - "77898097e6ce4fb7325808cfafc43f6b17782a13b5435779b1835b4c15dd4722", - "e7c309e28a9d93fffd3d6868953b17fef09a39cc4bbe893e2146861fc9935c9f", - "48b602ebb42efbd81a0d86c417fa2f96b8a0a34246f5996bb04c8a267e4c3a01", - "3f1925427cd9551bc40f1f0ee7249c662d66d8c0a457c045cc856fa44ea97da5", - "aa9b21ed23ba8b2f065ec72390735c2a5dff979679d040cb1dc1589d70542234", - "617a097c2f346b568e0c46934540a27f368c625646833e935936c8854dd2bf16", - "2f8b8f5e07e22860636db02befc4ef14e8b1047155a2067b98b99103768ddd5d", - "c58bc0b1d580616e4356b033f587ba6ffc286064092dd0e62b7ec047a005f04a", - "9da890d37f4f4f97e430ce73b213cc373bb7cbaa863d98d00f44e252ce6db4a2", - "b4fd5878a1621027fe863fb6b7fc2340078231fdb5ee8b0f87ba4f0e92f76195", - "6ca708701cfe100979a9be8b0b91d5a0b357b019f3dc3af96c3342a7b173f956", - "056ad4faec1810e76874c8b7df57db21748f41916a043bdefc12c00b34fd7bc1", - "b2088347d56e1a2fa39edb6c235d095443c6f3d22ae7e81cf0a77d193b1f9ccc", - "3ac82121838851816b755e91b4a73ea80c0144eda1e65c9dede079453b31fe39", - "2247e742c140957b03ec59c52c2a92523b548488934a410ffc01c59c93bc5989", - "f64a8f98ca2d0acb390f2af222a5abf2de1d8007ec1a6ef9c3244542e3ebc299", - "dc74a40a423db4df4454a846124894ddafa01f233a7d253efb5e057f4a42d3cc", - "8c290b041677fc20462a98f96cbcebe92fccf66f8ce9e9c5e665656525aefdc4", - "e784e9f01813a1981c30824edd4ff946d0db9f97074f9e10fd94d6c6c4466855", - "6e90d91a8d56b471c4b2ddbf5a5dea65f4637c2e5dd6cc025ebbcff5f9e2653c", - "23a1c3f63346d1258d495ecff0afd612009673d0939192daccb1221c726bea4f", - "ea8f454320cc8ef77c3df78813b8779a5f140020d82d5d951987a3e831dae4c1", - "5edc08f7f4357c6f17964f62c069d90a8bbe09235a8691fd91d67ca851bcf5bc", - "5ed92881539c3fe880d5b636b3c25b56ae73ae41f09aaed5362a199a5852e23c", - "769eb2c411fcfebe8ca9113010bc8b021420b948d3f02247a1c1e51c728ea32b", - "4ded54ec8c54ef3f6c3d78e096e087bff06d49c966d109f37ef6aa748b968adb", - "e4a0bb7ced08d51221f93f2042dc87ecb864154afb5151cd6e7a51b542079f0c", - "44825e594f80400ced523a59bda454acc116f9cab9b63a840b487407f2e10765", - "5a656f67245e2470fd1e36e0a433683aec251ef3c29e546d1014990f859504e7", - "143869a74d758320b1b476380794b0ea452e2f40ad0c54943a46e4e68cbe788f", - "86b00efa19180a33e00b5cba500311c3e3c9c65b5ca3d2694f626fda69267e77", - "6f03b7f54fe539ba7ce5c1144ec7cb96aafb7b6d26e2ba5c4f600567615a26af", - "6f6410f8dc615dc8b8b0167cdecb4f9d5d16d09ba9722f66970e493c9502e33c", - "5bbe39de86eb146759dabbed09262cf2cbdca92fc2bdc068f534c37edfeec377", - "677b06e0c45121f55e066c62a3fa8814d078dbc42ec96bd0e0be4b179101a5d0", - "c87bb9f8ce06c22c983384b0bcc77289719b145df0d995fece2757e3a51eaba9", - "82243b3aba7b7b7dfc50e1a2a6e9a28a1b426fd910754b49ea1e7c432a4b4c7b", - "cd5b5f9548a328ba68c77653f90a401800d3bad7521f1129c8df818ecc7f1176", - "343fa305f348aa8245c781f36654699331ea4e5321703ab47b1d754d2e684b83", - "b4ba87958313bf317e6a5f46e9e3a6c44f3ad42a4aa271e1662fdd4a8ffe7b71", - "c95c78df4acbf330ba5ce49b49038d9a64c7e25937cefb0d9faa638d6ab5bad3", - "6da7eda73a1cf9c0475b1e7c25ddb7bbd9a0659d071e84b37c567d166294fda4", - "71660e2954cb83de312b979a81778c8a1772de427857d2f2c97063c17e94983e", - "b4e8076fd481818f18721da08d215ba10c6912cf963d39aaef87f530da024b08", - "830928b5335186b08055aa41582345a435d3e84492bbbb1df3adc9b5fb903511", - "44edc123d243fbbe28b244dbaa7a2551db8346592ad46e874d7d170de5c134ed", - "805580ffb289c263bb105777157c2b44eb7f31186f30535de8efb0d15301d967", - "4c3193f435a63470d65d57b093668c1b1053a487fe1ef3e6caef2b034420cdb6", - "f99a1f03ff1ce182eba1f911d4c0492026d2dea860e086754349d77ae5c02987", - "aaf4f5f702626dabd889a9e0ed18430b6d3ad300b4449cb7b02044c3e2fe0d96", - "e54fbeba0833e62026d303e55e1f25dffc283d0a05be66d147be59cf7e574be3", - "ea51d3ba9f26d28aa831fc0e2f817a4e5d2b97678a46937688d8048fea77bf3d", - "76b7af08d76699e2c318e4083f322a565d3e16551033e77f428202573b672a4b", - "d3636cc99d3e48b070caae62708d83b01b045306d5f84bf2f7985698a227788b", - "13cd8c32e48f68ac3b5248e37e553bfb688b863db9d0d7f93b4638c079f68032", - "62193bc6fb98e239c15b8cc94abb3c5fa2490083c0862c090190de7dc3e1b108", - "13d8fe3a59155f09a7414662cff4fc8d43677fae86806572eb91aacd87bb09bd", - "276619c3658ab301eaad4f5630e200800c16cda001b0bfbc5b5a7eae2e9a5021", - "bc519b3b6a185eb590bd23ae9cc78ab2e02198499d54926360a34abb630fc8cc", - "84483489fbef8c931cdde14cdd84bb32813f65597f818dee28dfb819026b5936", - "14d005443ee46e8fd3c7d9d43bc371b4f00629937e064fcbfde5eb5ad381e44c", - "d74a112c51e14d75679ea978deb518d4bf3e4d258fb256cc54114684adf9ba25", - "4ad1d11bbb89f45cc497d29b46ec8904ad657240d02d5fd2700b5a5390b70bfc", - "c19177f72685589b92926833f4228722766cc060cef0f66f59d919c74f7ddd41", - "7bfb89a4cec2e561cfb0a5250f715096ae293a724c7b1a75f7aa66faee91ae69", - "ffab52225797341957cbe9f81a6812e255f0d6da8fe4499a0ac4aef330bcc4b2", - "c17dbf2f87d2e991f1372e612cb4827a3e5027401eefd2c2910a57775a27f68a", - "10b6e501db3181ee37b8a0ce25d0c3fbad03e7beba0cdfcdde77ccdfb1bd13fa", - "7e83bd2a66a6a73db166b330c5e3cdbdb064d78abc200389d877839ecb0472e4", - "14d35938092c7f7d796ebe28664ead0f7ab0ce507f7d97734590d8a8a3701737", - "614fec19cd3fdeeb7ffc24d831032d12454dd8d204f4dfb7d6529ea38bc20d09", - "02c9e674f276fb8ab5cb741908ddfd9d94183711614e82ec39d7c5bb3b48c8d4", - "454b06658c6f1e73e19d217b927acb37064db15ff052bc9086d2d39004f94ecd", - "9bfc04a9e05bef9c6cc02ccdd7a24ef25e24cf1939d424ffd746f56fc0343ed2", - "2e2e10a053ed2745f6a5066aea950947d4a75c0e0d12dc91f59c0a0c2306c315", - "6e96b59bc3298a295abdaf46f58b90b52b927e447eb99d0a1777851eac4e8cb0", - "f4fc717b19dd8f193f6ab1f7a476655a12c9e156e1baba703c590620ea436fed", - "a64582906132a466a49ea19f1c2e9f43ac0982e11c8326941403877fe8b22bd8", - "47e3a5be67d79a04fd6173f9c1e1c2827ac51a440e650735dc8f6b33f6a0572e", - "fc712e72f4ee193f1c55b23a2a80a0743d7226c594e9b9e671b13f68a4e07e1a", - "0df2596a4ad9cc8ffba76914de6f5a32159dce964b869b10593d2b0c768f5cd6", - "fd409889020ec6ab5c0bc6b314d590b3719129380387050149227e0bd47c2603", - "bc35e978e9c99a3437ecfb78168155e6b6512cfc59f67e11f71092efb6eca100", - "07d1aa0de9401c9c8fce30804fe0e19592c8b4dbb8c972e8f82345182dcbaab9", - "5087b5575b3ecfe2cde969d974984dc1af2ec40a5fd5061e7fe570da307c6a3e", - "5e38a95d2e0bd5499178053f5ba83af02a25cea491810edaa27c19bc97e57e58", - "c4a55d985fe5c9003ecc69cefc3d1b5ae8655dfbc7e26a3b4f24e21bb930964c", - "2485a9f9898e61007f76c68f6c636595a2de72c7aba39cbcceec3d572c64eca8", - "5f0936891f0ada2c9d8f172c1b26f3a12ddb0477331f50a8deabecc25635b111", - "fa540d648791dc046e7fbb4e1b773eed090dd0fa27f6e718a8c3d715e0b2e223", - "9b6a31a30e801b923b12c0c8efdfcdfadb8fa63e3cabfe6c7375c6f1ab7da39e", - "3c08b746bd5c1533da9397b323af2d8e084880ccfbf7e5cba0a04df5d4fa7e63", - "a13280ca4ce55b44822fef16f2327619aef91f41caac9181e3adde7e070fb984", - "f75124e428312b7b2e2f2cdc1ff1d50a1a1ba5fb5f5caaf3a887743c1e268080", - "b3978e46b2f391c0a9e88586d115f8823ad8137e00032916cb4467b29060c826", - "4266209d9e934be9f44ce6ff6ce29e170b616154303842583afc48fe87069796", - "801ebbaf7519bf782ed3b9ea8b6bcfe057de2a7adbae67f1b26b24ae5529cbdf", - "05e977454fde437f2db756dd1b0b575fec0bca71d4943150265f6860543dac22", - "1cfbca2415653ad4b23a791ea46ef2cdb6f4bfa397a2b302e9f4fc47a611ec74", - "be516cda1bd47790c01601857aabbbaca665ab63e5aaf3251fa26eca41217db3", - "ffe7fca9417b7ab760c66184e1528ba9e0c17c84ddd7aeac6665f7320dd4a692", - "79eac230fb3d18ae20ff94ec490c964385c7b6ffc3a859be69a9694fa695e30c", - "5f8ed16957d2376bcf18acf162bcf63ce63ed44830fe9f9a33802c8fdc61ec7c", - "6dc18aa263c84af6e17dcea54de4bf6c6de9adbb3083baa08ce8d4a9b238cc81", - "89d41d48d3689cfe1ba91d30c2003373583e08e8c8a10249c4a6b67376a8c2e2", - "20abb4575be2628f8e3ef5731e818e60e2724708262b290c72834d7de5dade08", - "02cd774f4557824fa7c2a66aed6a8f2a3d0377d684bc95f2a75836f1ca8f89c8", - "ee6466157405b0d6976b3ce959d74a34645395d7d34bf2f6613d7348a90c600d", - "6d8414931d29e4472c99341dd04e1f7ba3ca6652fa4596a5a347a413f6725db0", - "ef69160bc0529418022cfc7c32dbe718551de50093c352d692adb442cc76499a", - "09122364e4cb036fdabac8e848161aef4947f065a7a77ecf6a1a59f8c954a0e1", - "ace0c0110b4272fed069edeb559741e5671d2cc80fbc60327ba7a79a1fdc5558", - "5ed0d60faac735e090b1fdeb4a2c27138f7c6fe129db4467759ea01e2730f4b9", - "cf4573fd3bbefcda814671ab857e2ed06c16b0f78f42a84f4bfca4aec7161f8a", - "c7798c058538b948feb12fed52a40b46b70f1ab41829ad334a3bd1c6c68b1b43", - "e876c2b0bff42d6948023b0e4a8228e88042a8da2eaf155e7a00fde2bc6422b4", - "322c42cb9a8b53fac643b1df1b07b5f836b47689237add9eb482f9940d31d714", - "04c30009df6e532fdf49104843e831952db37dc9c1fcc18b16cbcd11d118448c", - "76ff29e5c75b31fc4bc89bc8d7723a13c518371feb05d3349d7a0203acf06aa4", - "c8cc51aa74968991fe9c70d62c377b5d4726f5333de908684c16d2ea611393d9", - "68739ac30a4538cc5408f4fa0cc50af209a8b25b9ab9227a487bd11df74c8861", - "792f56a3f237f8f750a434265748d0ad11d2611fd56f575232c3492d204887cd", - "b4b4e8f020bd71c7496b4cfd0338c82b9609eebc08fe92dd2e470959b408222d", - "ad6c60d25cc7ba1b0995ec467c0d53a233ff652e528397373eaf393299273fc1", - "a6e8330b71d2c1cb23063a4908f216114f833b796195f0f582a2d89825c003bb", - "babe92cd806e98d5a3830a8619afe3b3528767070ad27dbd978be88453b98b95", - "f93fa37e4bd96db61c89f5d2ffd56ff4c83b42d60e31cddc7619a82fde7a90f2", - "994b5c13d8427fc402bbd893a906f7a737bb3f4563f342aa301efaa2723b307e", - "ef34de90b76e1caa73cf0fae02dfd9f2e9efbac5ccab43cba1d335f9fedff447", - "1c41ca4b4b8db2dce2197098f443f9a117ef373486575ab2bace10f9f17f99aa", - "2c9700f66fe1eefed4f7ddba57fbacb016c978c6486019a6efbffe0d0669b86f", - "aaed4e9a7c891f3ffdb78be28d37d7d96e4cd87510ce6c27e00fd70ad702f997", - "1df286c97f96d7f2c276363b84fc8a2408882b84c2f69036c139d9363a271d4b", - "f2ac3c8a42609bf7a6dc827a957be1a1d64f1b22658e8e1a67e811077898c4ea", - "7bb833d756c67d4394897a480f7cd5581740bdbe319e83b7332d6e30dc428999", - "1d077a4b1c9e7c6c652b0e49377402fa2ac3a6e00eaa9a35b380db8c08ea6ef7", - "cf74b7214b0ba48b320c96f082b060439aaf13361a4697f121d439584b7a599d", - "7f3022b2bbe7cbcf9a67c7eed2cca09176303d9e9814d85ae590e408379bb43a", - "daa2168fef7e30f2ee45287855d4e94e153e0b965d12d89716e46bf25eeff633", - "a31c5ea2032ca60de536afb421e1832b73790a28b8ed3c7baa549bf3494984ba", - "69adfbf040f45987738e8545cea018fa9476d05566d2904fb097f58362c3eebc", - "18772b27d24a743639b7465b369ddb87d67fbffd49d425351138e148395aeb8f", - "e4a21975e5ce713b5870079904166fd069bc7e53a55ae41e15e815b9560271cf", - "e1e2b56bd4bac8f78b777f197aa925d8f75e95b0761c532f29a0a2114d2df61c", - "9569b23d04a58c6997472e3cf267b80cf894d8ff13407d907df1d6043246d370", - "72f8868ea87765160633b149cd5ca291166a4b7e55529db000cf788cab72a564", - "981a693db1a629fa77f9152ea85a401aa8dab8faee035e94c236b40368978e3d", - "bb5621936d71dbc73b3753ecc1f42962b8923cf35fc32cd84bcae56e4d16da41", - "f06b504969cb38209700814ee11a087b72130c690bd8841130a6030a215aa837", - "9ef2f4d87551c7ecad11571110c6a12e4c6e96c9a3703cc9c41a047488b89aa7", - "01cbf6f1405f8e9a3f73e10f64298b02500e8b8f9fc8c355eda55af62fa868f0", - "50e699ee0ddac04dbd58afe2667fc6a46833ac9e1e7f121d69ca014d9ad14e72", - "dfe14a22d646d9e5d0d0906015cc538a338f477fc9e83da7e226583ef8186989", - "31095f6da4c6c4ea8d2b2cecece033bc7128711db94b1f0a88d5af182744eac9", - "be135fa69f67872c1560920002f0ba559d05d240f912f0cbbeac7b5b053463e6", - "07e10b74426e63102776881d827e4f9363d66fdb5181655bb85dd301f5aa835a", - "c304c64b90edff43bd38c1ccfc82e2414a0a7a9d633066d9ee421524dac1a192", - "7b738843276d53635181529da0ba1ce945d53667b03f55dbb2b2cbb62dbadbba", - "c7bfc6875bbc5371cbd902f67e8dbb5e079a7e7a599563f913a7cbe263896263", - "2dc1d265f9d1fe5922ff94934d3ff1cd655cb35e212560d17dee07b5758494ee", - "0e542b712c3a3c4f5ae60325f8607c45a60b8b521a6e8c46453fd3a75cc0116e", - "0d294597455b018db751d76a1597842e7b297f450a8454ca22e710d327d6935b", - "f56cca10ef31b9c955301d0d049e3ab4fa4e2c5a0a91152684206e2968cb5c91", - "8da6dc4e1b5b4dc15c1a0342be03ea38c7eb9258db63b43abfaa3b10216fde37", - "37ccf4d3cf64f7341f571366b8b9f17384c19c88a65e32a93ccb459343f2d856", - "33ccd4ab01b3967d4b5f4a734470ecc12b816ce91f986c0668137406b2db4b89", - "9445298d72c79220afae28785d3302111d319d6a42d8bfb73b53f76c0b2f8c8d", - "30cfcaf04536b718e657de2daf4b2874d318cf572c27946e649702a60af27881", - "3fb671fc488023c63c7c61aaf3a727036c3949c2b224e18dafcec0834331f98a", - "94c0db4709511711ebb710cbf0440a418939d72efe4937ef6e81992eb3610e78", - "dde475031caa8ed3608b9bc8777864d702eefc87a7544206cf2cf475dfb434da", - "ebba5c9bcfefd890b2f496b02e2483b8b050c5a8db4e87aa77b8097217723f4b", - "2630a1179a8853936fa30b2c039e05e109387fe811d534d4efd0b163518fc934", - "3a4c01bde8f07b776defb0aecebdce712bc3a3742771bfce980ea53bbf5d46b5", - "37784d3df1ce3a53db9630f3e6c2f35ce8eb77a5732abe16a6de6bfa71bcd8eb", - "6b2dc2628c6123ba84d4941297b8b5483c01a771cd9e5f356fa144faaa1bb494", - "ee97ccfe01afa90d6dc5f706d84c2cff114ab572ac4e829d8640962723872f01", - "1672792cd7cda1e2579924ec3659e0d8318076d17d2e4c9dc508ca5bd648844d", - "96f2e509cba3c35b91e68ab079b09a1ad4c77d74ebf10f3b771fac86c6c5e97c", - "b4d214a92846c25bf521232a57dd0616fdf741890ea7edd0025095c09be69f31", - "aea7e290c03a7d662ac753b000f597ff2f81ff32d9d47fdb1ab3c2346f84f0a0", - "23df3a4e7ea3823ce39c6cb7ac4e60766ddab5d9a98965bf4e55976241a8870b", - "9a9f0b4ee771bec07e43f6205b5f0f9f8c77b9c52d583d57cd28fe5ca8c2de38", - "69c0a6d593effd8c061527be30a26615d01ebab5a0e3cde926d17e4a665e0bc1", - "e3f7fa4bbf4f3abd8dd3191b230630d9e7bfbe990c093ebf06dcaf887f495679", - "c3792ef9b15daa3f99ecb73a37e6ac440a06003fb50d24c1ce2c36dbd93347db", - "35ef216559bcf4fb1aa53b7e34ce5cff84816964d1fcd53075ef0e3ad53c2167", - "86c823c6e1c3d3ea303692fd97b49cf858916520510289378902c138c44f52de", - "421dc20a3d10ec57bd1fb5a51733a18aed7e0d93dcbcdfda5cad5d4a66ab3505", - "e54f53e73778d85d44cbd9bc1e8b749cd956a5d92d70bff1ffe95161563c2fcf", - "57f776be0d118d59c1da357da91396055982da148b2fa3d9c6d1df07c8e88a52", - "bf3b62234f2e5d31dd2ccc668ecd07fc5c1274b6057ac2c428d69a138e09cba3", - "5d38881be4156fd36d64a787ae62e9a163a4f1320191a5fb6920833f6f6bd854", - "798a35951b73a2ad2de9022f8d85c30bfb70fef21946951e0327046a4b2e2dbe", - "f2cbdd79cec59e3e91fdb09b0a3e6ec2d77ed53e67879ff2b08f285df8bf9a2b", - "bce1a55923c7320826bc646512336fc2d261ebdbcc9b31577051c927e2f581b6", - "3a09f450a9a1e0703657be5d10a039a844ab4385b3bf9ce34a374e8b513765f4", - "14eb47a8e62c77817d619d2a14205f41c80b249a2b3cba4a330dc5c499216c2c", - "8cf92bda4656877c549d3ccbc4addabcede879a5517e5b4848a04fd72c8d1e3d", - "dd9c2011f2ee170da7593594f7da32d2972d86db2eb4fcbad88e5d62610c5c68", - "951ff5fef71aa1751c8f4337e35ed791c79a05bc8c8bb2a5d330f52020c0ef5c", - "6c83b1939f68bfa349181471c4cc250d3bc8e09b2b824eea811b1d299c46cf7a", - "af8d6f89d6b14d67daae1401aa43dc7107a5d4e1d7015a730b42e05505b523a7", - "bb45f45fe8555a6262601224fc0677e5858cb27dca02f9d424cac96fa634a02a", - "d6a9631a6960259ae833f69f4cea407a0d3d6de3f61503af0a5b3522a96fcf7c", - "8d7c5f469f915f5c575cfbfe072053cd3da47623e698c4bab1a02e793a49d470", - "bb746ed49f9466e0ac2f4673b52ad5eca88ac607161c3b289f9ef4690bb50397", - "2adeaf1e4dc1c0dfebe971c5fb07cfa975b1e3b6f2e0a0ff40e7329836c4f210", - "c54642b5c395074f45144b79b66f9962078ca055b6301fea189ef9bad7ad270a", - "62919a90963986b3a2e811d618f0aad0f959f3cf2617214c986cd3d9b80a31f1", - "757f8f2caf5fea9ff4acb74b3593510739b9cf3568bb4fdcdcd9fed295c19757", - "ea2b57bd84754de1e173a3004e40e5020623195e5397ce32335eb1a16f480569", - "5e5f8a5728d83d86bc26a648d2c4af64e34c6bef11f1254a6db928b96c3b1f1e", - "23b9b79dd0d54c169d5f2f31f9900151f5b4221f562f69125d1f195f1accf814", - "060704a080b56518111a78c1cf43f1621630da2dafc89d6115180248ecc7f743", - "2183cf215448d609aa94b471d1cef7fb27fbdace6d21f0f189348a52fe910663", - "74a089c54ab0977a668058fe0008c472b3e9bd4c292e0ff6a51c8a8d8f050686", - "d571e3d81dc48860f2769412a773ad521433617009d30fa68523cbe6c4571a33", - "678483c036888043a91190876ca018b399e1d4eacefcf3fbc5cd1ce7dfea8c88", - "436a96ccdf16daf29e5259c77c49d667e3b9a3d570b5286967120e9315124979", - "cd29d1b226db27f154a2b211ead792d48549728d78e52ff5de8b87aa331af0d2", - "a1f43868ae817dc795b8eef232fcc8f29aeb2c4470de788d99581c8708143615", - "cf2e2b7b01026f17de080a2856ac96dd99eb2ca265cf7513d1eba0d589b5b93e", - "781e221311e92c2188bba31018e93bcb4d60f9e9c1f290397c6479991c1a0bc5", - "2e52abb03d03e35d19f4f4e175302e9b111453d4710b3636f9f0beb14f54ef3b", - "f4ab70ad0ce2aee924d9a5eb79323eaaea58a22b60240d6fe700f4a0828de0e3", - "eead20271fdc3c48e5d40f1f337dc0cd9481fc0f57135c4f427653400ce34bdb", - "59dc338a6f9665d33cb8c66ad57d84e7a757966b5a83cf32a7af0d71a894a414", - "f19f38c9e0327e7a381a0db3beb13a7ad53556d8b3c936805742cc8c897c2263", - "1b7d2a94969314c69af9a3e9addfcece9740a4f6ca2ca156409ee3bda7d0f060", - "ba5de51c31fd0c8bb4f6be3d0f49056e5951708a4c1c8feec8f0074e58d391dd", - "4e720c54a47372e52bcd838a6d6cf70c88feea6e129780b8cdce03ea8462a2c1", - "13c866936564c49c2301e1ff33b93e9c7498e4f2aa2e0929f04db0990166a0ce", - "d0a8f7f94250e7ce45332af0a9450606077b5f241fe4e8508cb9d1579e56a9da", - "105278d09be4155d4db6320f4296254834f5afd109a38112372a154615227a23", - "c51c6fd6987d566abb5f90d41dd9623c6bdfac68a65954150b869e43810f71da", - "b56862d36cd822b9b23c3ef14c75b90f816dd2b6b16363fbd34177ed4289d8ca", - "2198c162824fa892e51d26da821c977ae48c090d4eaf2a87139db14c0e026617", - "9bd7b0afa3591ae45da8c95b85dd594a87fd949e27ed630849fc9cf998666ca0", - "c7ce1f9b9e4e3d192c5f606e85d863e593667b6c895a9ac988319509100346e5", - "e587d884ce292bb0a4e3307c9b0fd919cdffd2b591dc21e034f8b7295cacde12", - "728fd335cbe836aef16dc1f9ce6057d0ccd5d3b9db09e18041e7daf3b1f99cc9", - "3bf66144edae2ca06f65a6b6368e4315ff24f8f9b710c5d29f30382c6fe6ac00", - "54e7b144e47874146aa3c0d6fcdf646966c08645c436a0f988d521638aaf3efc", - "7d6bb7ac3c14e8ef624dd2c082302cc1ebb687cd28bfdb1ed4541fc527c3e135", - "2bf5fc5bdd9e31eaef4de2dc5e5c83ab32564530bf3951b259cae805a6b137c6", - "8b826216c349ca1ce41587d138577c16219f571b7eadc7f188e504f2e1506396", - "093083f60be4f95b21b75ae0b0feb0181fb452b10feec12f21059f78b9dc1256", - "db888ce1d57767f8e7c38b2370a5c54635cde6aea6b37d03f4f4476108612c0e", - "586beb4673928af8b30a015842c95b4eb19cb7bd379c22c20b622902c112a489", - "064e697976bcd0b2e5e4ad8ac109684c70329ed08ae91f2ca4cad9288ec81a1e", - "0c7175716c5111935468ff01e79d2b086de01798c875e443be679aab13871254", - "05dac429d04043d6d9a4524dbf79873d3e271c3444b268a4377e92a77d51893a", - "dd1acc853b40316722af185ccdc17be9edd1f5dd4ad0b7fe3e1df2733316fb10", - "80bb5b6b9c8ad876d6ca006c6f728a394e408b71f967fcd81415e6d84bc66eb2", - "0a29188ae17c6d7ff4c9ef35f27e73cf2753d47a68a3bf007c236b66d1358c13", - "ee72bbb136ec89875652614d40df11b1a9dcdd5918abbf6dca316d2de2d0b327", - "13727a370000616b353751caf5e49aa3a20d65081c10b0571c9dea01e6877b7e", - "57eeb798a4fe9fe487ee63f0a4bb8ad934d8ecaa017af1e1308368ccb7eab9df", - "c7aab982b79b9edf81e142d200ff332b30649e4331e80b53b241c9be86e33b53", - "5e5792c9808d811971e2a74c961f753eef9d7eb01ffe5846e4c7dcfa13d8ce19", - "21c03db559bd16a540b307d15958ca9f4ea12ee21244353b1ade829b33fd9ff1", - "074782b0727e76c34d5144c8d846d0aa5863674a39b6f0d407a587ed457b590a", - "2f67f937083c01938668e03cfc2a7c15649be507ad38014e5e5f21fd07877936", - "efaef89339518ce4507997fe02666df956afa993add14bc0b2e8f9069e084ba0", - "7c5a2ce89412a66968f0e111ba583fa07ede3a66b477712a764a1d610e5a9b67", - "3a7081507b7800737a1eec34d0ad9a5ff45983c02ae1070d0cfe484dac8bea13", - "cc6e6879a10d702ff34e20098bb1c8e96dcbd63262ac1ccda70df3bdbd52d2a6", - "cddcd9826cf6c6e8c14c8251a85fe00021d5d4a7aa57048c6c6d35a07c5c5307", - "af7a1138b8794a6ff2aff82678b746de481a4738fcb90682dd21ad42bf5b13bd", - "3b54706fb44de349f4ed89b5c399e538ac80ae1254f6aea06b71f415fd3f41e2", - "4db0f18047eed059520b933c48c7deb2fcfd84602b82b702d0a23779b8b6a9ba", - "90b13ac182adcc86aade3d8be7ac34a00fdc807fcbd80c9f1203e15700e9c7ed", - "a0677799f236841fd900f5e31510e7425ed3fafab31ca40a1c4ca69efc84bfb6", - "609d1ee6edcd68754f204db8f97cea40423daaed9c0d4f524700f3d0d8bc092f", - "4bb7cf40298e0d16838215b73e13d2e69d165bd0cbed3b217a6602bb49be12cc", - "b35eab0420e83ba16e4c729650f8f4580fdc2b2ddc23eb22284242c4549ada35", - "c78a97b933f6cc67052c8f26f58c9e98b25c088062be988daeac6228e5b25532", - "c2dc1930610ced27da2508fa407bc8ba89cf8b65c6d807192a119aedc28ea42c", - "f43626857e5d94966409f633f683f7cce57f4b7bad8c0e1f54759d6af141650c", - "67f76976f823135b9773d8e9d6b8f6338046ce7f75e5ea2ec63b72fcfe7dea7a", - "45719e7bea73c6e1f058428e4df9d8ec7cef0251394f34531d3edbcfb9fb4777", - "d8bb52e3f23e65996df810c0177f315ed9ffcd4cfc5c744cc6b5417531f77936", - "af9bdb735ff4cbae7ae84087e1b00985e4feb6acc1f9d32739842733525cc7c2", - "8cef8b99b27e2c6d63b3036d66146810bc67500e2c4f0dc52bd3658b93a0527c", - "e05db5ae9b51a7016cb7fd1dcf524eca9950d14d5cd9502bedfd1e0872f92480", - "664c6ebd605c4ec96bedc273a93e9ab9bec52216aeaa36ff26136cc4ffb6776a", - "ed8c3a509c7412be81d758c5b5c661748cf85dc2fa7b45849f245a2bbf214298", - "ccd7e379861e6a8e49ea550259671f1fda63a8442abb588521118a0913b0be6f", - "4814afb9f6dcf80d2b427765cf484b7f7b41d502e5aa299049ac5d19d6d4d716", - "0c237a0467c44a38697fe0f93ac85a594625f343d6c3e029f3a136ea212ae639", - "88d9962bbab4ec94d0027aca057397fefefc8426e995d8a8d3dc9e752906e6f0", - "07d6c8429d089073caa35ef367ae7086577c290e149c3d169ff8d3ad4fb68ebd", - "cb52d2d43defde4d1735994b30f74a7a42410f25b4c491b75ba52cc2d5f43717", - "a4e4df6952ea39dd3dcf435be967d9021d4c18833456c350e9a0265a540282cf", - "7b4b48c6371015e8caec9effa1207e804f23b56c333fe63d189b3a95dbc8128b", - "babed0b6e12d631e16fa69023264ec428cf165a35e09f10fe6936a5567d9db7a", - "cb1f98443a5e2474d176cebb22c35f5d49a1cd0dbc3a946fbb3bfaebf9f2bf57", - "4cc16863b4581c58bc55745bd87c9257fad0521376b363511c6dc22461c4c12a", - "9836cb237883edf2a26823121fe11f3e16df9ec9316569c2c4061f84f99563ab", - "e48a5634f51c5cca19a61829bef4cd6177c068044b98b29346e955ed245dd74c", - "cf22b04a22332b9146386d67a3619f59929cd88027cecf3d85ca4c1ede98c674", - "5cdac2b552b419e029451f43226fde42a4ffbf29c329636f8a80d4be8b116a34", - "3ff5fda0c76c5981082d1ecb4ad0b20dda1692131baf847681120569dbff3308", - "da5852f38a5687f95c37584d3ab246b6133459e2ccb97000926065d28e830a95", - "3d16d95356136ecddd3352eb27e992ca1719c63ffbfbde720162849e1f252d7f", - "38199479d9a7f82decf5ab4b911837d405ea8e530963fe39d853e7d08686f73f", - "2cebd63274153122ea627f1a45fdfc2e1a2d4cc434d82e075244b7aa311de7d9", - "2caef44e52b81268cd9c2deca1ecf07cc71c33654f0981a18c8291eabf124a4b", - "7ab66648f8dfce2a1ebec6f90790c1a12eebb040ce9a637a97355d64acaaf766", - "94a595970024f7699e2c863a7f0bc74c15de21f1b213667aa6382038a2516afe", - "b746426c06ed68841b15417011fa24a8b7ef7a18368c767ad693d658596f443e", - "419d95142476f8965b36e8cea3ff138c2d48c5b8f84d9f1ee73575fc24838e61", - "c5453e5c189b92e741344bf2222cba3a687395afb38eb8b721bd9f45526238d7", - "8f6972847aba496f16f4d5db34b7d6b7a121baa79c47db6c80daf250e94fb3fb", - "c9e037c5ae7017d588eaf11ab34498b688fc5b0e5a6bb3d4a6546a65418e2579", - "5af371bb4e978b9cf2382d9b60d7f6f74c38f276a9f43a0fdc9c4bc0ab8f9ca8", - "77c353221cbc5831ee6f25578908e4f454fba3f643c86899dc2b5d6462489495", - "f52bf0db220c557f444b88ec77a4f01564ed243448415e4d44e2088ecf8be836", - "efe6376e1790d571a6f322a2514d49749740c8ed8b1529ae38880c4a075bce98", - "e5789429351cb0b7c18e4ec709755d1ee2aef2f3e40c4eacf9d919af7f2bb3a0", - "2ddd214124d4178302040568ed8602c6a29e56e2a17359be56dc8e50c6855edc", - "36f10f29c11a8cfd54714e4444eba6b10fdff1b77690e3f4f91589ccedfd8212", - "41df2e2881314a8da699a20bed0162fa42d6473ce47b9709cb0ea6c8344099e0", - "fe789384919abd88c586ef6edf0cd2117d4de785dbe6baa38aafc22f8a27a44c", - "8a465d79d0345c1803234f66593e4fb816341e2d51f7f59eb98acc4f0ebba84d", - "062adcc2076dfc43447c729a5b009a1ab4a8ab405e6cd8f7774f71a557512e4a", - "121b7d047b7fe268734858c602e649e715ee84200fea1e92caf0a250978726e7", - "08a28a2d4ad0a8646189c643af6001e1348d32c7452a6afa603a73731ccedfc2", - "2b99b2f96aac877c67a4e6b4c6d6ee018e01bb5e83f3e55e797fd26f29c347d4", - "c9ffcdba571b051ad2a2c2d7c103f36bd16f660b0cfdcf3b57512e1ab4510598", - "620bdbf4ce16a866ed09284e1740b6b3ba75e98b2217067f6f712ef1e62c85ea", - "ed822146a71a096a1a75483a51972feb41f213afb0f9111d4be0517e5503d524", - "c19ec0efc13342a62136a3e39c035f6d0d9ed34e93100ce151366b76f9439848", - "7dc30ce6d9e7f9f4313b4c37c8b03af859c09585c12e5f530374eae819b1ac94", - "0ab7002c78461a4e908c75d158531aa467b8122b2c8fba7576342eefaa6e6bfb", - "2607b424fc93dfb7d27fa5a0b6dd39ae553b8784a75324f8a37363dd958e89ec", - "1c0a30a34d55b48ec1a344cbed5647596c9743ddd1f69a991bc0f39a08da51da", - "a6d199108d2454c8f94877299d3ca5e4d5709cdffe172d26492b6b430dc6bc89", - "75aba09e76a589915fb3b16f365bf1cd517bb098ee3413aef760f36e017c3fe5", - "adc4bfdf8325ac6bdbae9db17ddbf5a0ba8fe817336ff66f4ed8203db8dba24b", - "a7cdf6ebce23aba7e50728bb6ff6111bec77a20bf667782519179fd409281c58", - "64955daa6fcd03028f2f71bace181e734b8582e3852b9a6c948537fd66759687", - "631b6565c24d5f1e2aacbafbf6028f6914b025bcbb0fa5c0de180630e4a45960", - "844b6c34fc02f04fc81a8104cbf7799f373432eb96c26025c2663cad2d0873a2", - "f2a47baaa045c90d3c10c1adb64937b3a4d6fb005a3000e5eecd8397344d3258", - "873dbbc29b9bed0da1af7ae840ec0005f74e2af8b0a20290cce5514086d21735", - "7abc9c6ea86eac033e5eb8201e4423e35aee69f851427113408d15b28f2ea176", - "cc75fc5ecd6845fa4340e42019e5c61075aff44d45fc0d6b5aa35172538388b4", - "b0bab6b173465c8b7660e781df516d71f4c06e393345e74b74642530c35b72e1", - "b537a985856a522c755fb68df80794ba87335d745ed9172950c964ea4feb69ac", - "feb6e61d00431ac290876b7537b62d4404709c941790d92bcfe222b999365de6", - "bd454b35eae11101c546953ec23b3b0a722fe9d037c8a603a3125297da298d23", - "43a544d54b2848f386a9877636349e97fa3eeb67321d586d166505b8bee78648", - "46f3ed58aac92beed0b09f646779d440a5fe4147638a4f17bb2792abae998989", - "595df8c0b7c47b87c4ef23abafe535f9c262e02bfd25d9fa133f0ef8f98a4562", - "b6a024f0366bdb56452a8264547e98765da21d5ae82f64b1fa893eb97fe01c04", - "f6c5687e2a99f985d4bc3d99783c976405d94b9ebcb4346a285711efe66bce1c", - "1e71cecfce57de887c316a6a746c9c3921c885390274510a7edcfe7bfb513ef9", - "ad301bc7f14f4c6c2516e13216a36f0c808f2acbf51771df72e7dc68692da8e8", - "eff92de20e6affc93191a7a93f3fb631ca0e87b106c9bb96554476c3a21e309e", - "c44fbce0a8ea176877e50d840353b77e4f0b731540851b73a5829886e2d11a6a", - "b21c3f15417ca976ff36179a16c00f13c281cecbafd49cbc3e6bdc645b321c55", - "8f3736ea9935ae5311991b1b1a940197a06350d6a1cd4941643bb9b42d71d244", - "18e8b535ebd4e90b6fc75d3135c1bab4eb272ed505a5de6321bd5ad858760f9c", - "3c21b7fa0f0d1482f9b1a9d1922fd8cc7c1988c3ae35c94b00f787f540156c18", - "26b5ce5152540d8b446ec3e588d6214a40f294428af53c49ca9401ea0151f9d1", - "123240e0a5baee66e8d16dac9a6d9a69533f61b8f33a8419dbf25fc8a3b8e1a0", - "d94f7152e1f45907617cc6599d6dbf8ddb9bdd1230a98524f0c35d7124cda4e4", - "4e7364a3f1c710584c5be9aafdeae464d4753ed1e3f3f845738d157d7a2f2827", - "a189f3e09e0ceb5cce06311d004c95930d4e3810ff6b229bac4d3ddf6d8ca54e", - "b91d4b7f4f977cb929843341f9abb2e4866a1112ec85af8028ca53709e999536", - "511356e0e76804f69337dbb7bd8c6f0ce12f143e6a37cbacc8eb24d651445814", - "d240098c8000d9489dfe236f8d9bc4d5e6b21a0f124b4b833fdf86e468c00569", - "cbc2d9efd3a1ecd0c22588a492cdc221c5c3e417b25a441499ca6334e68a57e8", - "8543ca46ad445e9287ce5e2a752de8cfdb842a64a5ae53f901baf9efe7a75d45", - "59a8a2fd8784090fd9d15cffb38b82df606ff275fd4c25a10f785a3c410bb9c1", - "0fed142ff781da0ebb46759af0ae3f15b02d0eb74e9612fc2502d72eea5f13ac", - "5c606bb9d9808dd7130a9c58430863e38b7f73eef45bcfe2c65f827b21f1202b", - "8316dfc7a4fa110c7127edf8f785bf65cebf1e14b70c803acab77ada8c9b2113", - "e88d4c399508ea97602d9da55d589151a671936cfd7ec95679ef281d6249677e", - "3c9707c23f18849f07d713c832d40a0c59538cf06d604f9b36246c34f87a5ddd", - "5053b14046d391147e5d8eba36d6d8a5f718880398484c241664c4f5257e2d3b", - "5625b654113d9242e2d19c82708c0b5bec5552bae94d4bf01707ae22b8f0f94c", - "ab5545426713977d5e3fab0eda38f7f1a3f38f0e91956b3d53784f087762e52d", - "76a3d9daf568033217bb34c827842283d47e312d7bcdd05ea39b751ffef7f74d", - "adae6c7735111e33b1e824dc7e9c989cf8365aaca49cac72886e95cb6394cc31", - "b68e5ba42e28774827177473c30034990c4ff6e167c8f00177d722d4575e4789", - "1a5dd9e50c84f74bd12c591a8bd67a4c8f79645fef6b2db5caf11d85eb0cdb68", - "b16d90299aef6415036176452d4609f9737e1cca75c63a4b25361e20c4be9cef", - "3e2217465ddb1a29409d71121e211af159fdec46598abc10c45842538af873fc", - "2e7548ac9f731946607ea919c0305bc007ef522ed674e73d919439ee57883eff", - "98361a4986a1b74a03e38bc304dfd004c6e0b26e8a0c3ac8269f2e832503e516", - "69c77d4c066fd491acd0d9d359ba57f081726b1fb4fef75f19b1bd0147cdd3fd", - "a440c7a956e77e30f922dafd946c156a2cb95b8a99dd405e3990de134ffb0528", - "43f0de602a8897683e8a219c7d8d37ef5af4836e0cec15743824c4dda95e2c29", - "444f28481b951c63172f9a403fc70e24add48a39b8b721157474153d50fcae80", - "8a1071ab20155fa983b7db6e008479782c9eeb5f1956f1f77e54ca83225ab69c", - "205db395decadf3aea961dd2c086987fc46d415dfc01486004b388908dcc7981", - "1d7b606268d1308f4d0b56d45d2ac534c8fe1ac64eace33ca549236d57b09760", - "77be7cd55e17d019596e374164662b3fec7e92060006e8aaf9622374a20e4a2d", - "12582e2ac522dbb21c325980c21ab217d308b6f999c0720899af6ed186134834", - "3829be9d6f1b8fade6ba597835d168e8af037832e1ef51fcdc9bce58a544e23f", - "f3ee027fc53d1e49917282c12a6f6a1fa56f1b8cbdbb56b5b7055b557963ff02", - "deb7cf41e4b4f0ead7a14ae70f0a4417aca51020353e5d1abbf9b6e29535fbc0", - "aa819287c356ab4c2a5529a28370020b4d547da3e4d657a2ac05137face8f2c4", - "a4e39f615a56794f58a9d2bb4563afddd08e1cf6d481143f3dc8c051709ba6d8", - "fd1e7bd78e6ce059ff426981275a2637b63726d6e3d6ac87ba0c19b2afad92f4", - "b4b22952852aced35d727eb17b78954a7ba9422a56b6e1cd740f559291948a84", - "d6f2ace8bbe149504cdd0d823e9a212cf85d0501ca25db68a3ca54f5fa87b589", - "875a33919c39a93bc0f4c1d2cfcc99e472f8aba248cfd740573033a139a7cc30", - "7ca5c56cb1289d14485d12290d240eb32d650b477edc37eadf9ee1405d349752", - "a13892ad526aefc9475a5abc4258faa599b111e49cfab70fdd70ff5077e3dfa4", - "03e7f540a78141f3803faf5ac928fbdf35f9e1d64ebd1924494027d2eb16374c", - "9fe2030bd0664516d9501fd6421918a3c36f753e416422d9744395097b513e8e", - "8989f4cc22fa1daf5c6ac19d45334ca3995dc4506c3e9c1755b7b8a770d47a31", - "8f09af337be232a9f1eb5beb96206590e3a16ca3135d41431bfb61ac1488f257", - "19a72b00c35429b367ca56f0f99e44eb91e80db428115ba5c2627e3715737e95", - "9bbfac0a6762c9232f94229df43837f046127ea9cce057687ad9889f76cb0ac9", - "80b238217636d794216ef69de89bbe7aaf3e096f97e51f833aab5697aefe4f9c", - "2af64d2857152d6b3fdec8ba3cda06318db1df9dd92e7314ba71ba17ae98160c", - "8ad7e9bfb0646fae0431ee3d2729e6281d466f630dfea9cb6523d08a1a22f364", - "5507bf586f003db78dea09436b50895e8d5f9df0510dea870d08b275c4385559", - "d2c8d366ffa609f00341ab1210499975a2c915ebdd53c04c98d53a4c82fa1818", - "a0716b3e917400e0f4e5c0abb120552763cf77bbed2999948f5330022e8aed80", - "b3f50027fed140326dc093934b8a3d8f34d9d8b798973b24e310c6a75cb176ea", - "00d5462282216719bd02df0fdd4cb203b6f3b0e9e8c40f1f42f06cd1d0e1ab59", - "4f67e8ce854980c46989f645e29b6f4cfef70d6bcb81153cb220c70c28f61594", - "f46eae13220764385feee4b93fcd39d5bd2ddc609ad11d9188cd21ce870e0e27", - "2cbe3e757df66d536cd7539497f94916acd8d9b2fd9c1090eab0577d4844793e", - "871d29050703274ae67a23fcc72cb7047fd59b56a96e38546b91a2d04f688fcd", - "84fc2d5cdecd9bc18e60e13fed31af4cee573d13a5cb39edcedbb8c511f76735", - "99371ccf4788d9f612afbc8f228d44e90746e339788f150ca604a95b14a5769b", - "b068db7cd6dcfb3045d87803f6b255fd5d05f57a0c2b33011e19ea51529c90dd", - "cd22b25ecfc1b357faca79cf75d5406a92267eceebb62f0ae02f4525c7da7de4", - "b30f4de9b89ef523e0d36af66586ada79a35dacc687c93ee1c7feb3c8d539ffb", - "39df42fcc3560e71e17e312787d25623b262628441c48205e6c717f799a069ee", - "98485be464b084b6a608c39e3d354a6b78a19ddd4548f7630025849f47ef8ede", - "0b7b0688833cd2ce665ac07da7600e74d07e8b06aafb98930006dc7f219a335c", - "bc17ebcedf6f54873a4891bb343b6c83b1e123dfd8bf30b3d596212efffd255c", - "49c62d4c1b3114a2e15a8b4b2d7411622a54caa2d9e4268bdbad69ed39493f57", - "2e4e927e13ad1c24f042c341ca1c7fdb373f80bc7207671d2ad587c8b0d66f50", - "fe61f36888075861eadebe918cebc701f11a4746eb18967098ffd8d53708d42e", - "981156b497f746f776b7e9e82f0614014c1180a861d5368970a9dbacbd07aa95", - "94ba8884517687ae8f6ac8d78d730de0697c92d35164d336b60e02241824522d", - "b94c008ac4511822b06079b3d0fdf839f3c3977dabef4e2ca60f410f3a2b8b16", - "8d381acca14b0e79b3fcce9a55805744bf5ebfdd12b1c49389e8fd9e7a2e1fcc", - "3a8d28a8952334ee89cee60972f3ed537693619c50d2f610302743a33e69ec92", - "d6eeba1edc7d1797cbb2751581f8ced6fc959a799b268c521a95006aa0aabd38", - "2528059d8a68f41842e446606f70c99330c9ba4049cba1f8f2cf1a32c3c9e718", - "8fdab8af7536ca84f3799eddf152d420b7151447b468a49644e58a65669bdca3", - "143bd86e2848d9413fdeb714c73cfde40ffdd46c816de41ea19dc1e755381e5a", - "da71850b23dfd6e4010b5ade9792d8e83f42039bdfeb57951a81aeddc1871168", - "a7016ddc281bf3c2cfc1e8b1896c98bd919e4bbc65fbe7acce06efb8bd12dc60", - "b0baf15f13172dc31aff59e4e6649cdd5e045213bfc46e095160268e8a627ef6", - "38452cd088928d8d0d3ed1706167dcc74274b3d0301dc7b0796dbf10ae1232cf", - "882fc3a649cc3399f2eccad1e7bac4819000b1a0bc000cbcb79e96df19c03cce", - "5a6439656d7bf7eed078f3bda1ffd57434b669683d4ce04ea726793ccdc953e6", - "b4c6c5ac1d25e67953c86c06ae84900d96ab039e013e6c96d36cc381a42264e0", - "134ec59e1dba6e74f377bc6fed097c95e0e15c1013982c20649a4bfbbe56a0fa", - "cf23426ed850fddcc5dba75ff00e83744779058514496738699e8aefc6b44a3c", - "593e282b0915187cb4d3a5d3cdd829292cd3681e470ae930fe868c7f04be7c42", - "5c9d979cdd4b15b0aa26ec4fa3a8a8bf08fc5436e71d59c764deb6e45800c8f0", - "798c23838897019b701d94eb10cf2500571b5f1cab8b25237a5fd2cd0ed0d867", - "f08c3b12ffc78bd65eb7b216ae16f47e8f5d277e5a180c77409aec74d54a15e9", - "15d1357c74386f64b113192f686136b2c2e878b5415e5b4f4af3f43ccb095610", - "912927f984d11d716c9e8a42f39fb7c15d3ea273c5022b04b4993739a0783e4b", - "02489142f796640a980d9104365668a6e15c92e2a63ce17874c799b2598cb2a2", - "412cc2f209cb36ff0e0593dff083f6be3c750c5651eac35abc5c8847ab5d459f", - "571bf261d683aee6104fb0013f850cce7bf4ec18f8b4780cf2640eef1895a90e", - "1a6d7ab03487d6240e08f1763d5ee9b6260c18201977bb64dbabb70b6db6cb3f", - "12ac08ad7718137bcb394cdd10e44e4326791ee9b953dc2e97f50f62895e7aa5", - "b657529e35f4cedfbf8cd953173555e50a09179bee81559fdad67e491a1dbba0", - "28800811754f244bc2741bd73e12f2f109a97652c3cf1ba970e146b78aafc928", - "e5bfb49b3ded1a9b0febc8fc54bb63006c7e361b063e7a0310529364fb3fc0dc", - "9608b03f8558f93ede65e69ae8427027f7957f2dbf6c70be5026a1cb17d8ef76", - "ebeb1fbe11ceb985dd69c545c953cb03e0c24ce6218a3cef9d02ec2b5962fa27", - "9b180b5717eda800ec37ace9c46e2005562cd21879bd9c5de95c850618d5eba2", - "375dfd2d9ddb2244d499df3f548c00330e32b12bbf528302022e29fc0da45add", - "cdbddeab879e37bfbb802d6cc078603cbc20f0f42c242370355f1e8716c4c008", - "f20bd0c9b1ed33d880e2ab17c6f119b315784ee930090263e855c2e39fe086ef", - "ec6d82441996fd4abdff463dd3d494be5bcf60fc11b181c60d754e054462e0ad", - "cf694dfac057000cfdb1c550b4575a5349e40b610fbbc95e92b4f2332bd5b5e0", - "1a7577413e8bd377e9c4b86b00e38ae25a331ad50bd4795ade86c86daacc7c1c", - "f03c99b8252b07d01607c217a9333735c038122568eb28e3f9ff029a735b4ff1", - "179c32b7cca0bbf959afbb1c6f71a2138839f3eaf8886340559f3736a1bbf6e7", - "648b3f64822a7938f801d948b4717509911e537327849270cbf15155113331c3", - "a1b001d00f810bdbbb51e07471d81170bb7d6f2da1fd4dadff0f9990912d27bc", - "33fd22e286b1d94ddd66e2d9204c14c4611c143e623fc556e7897c6ee844e97d", - "e241ef92ba166693f95cb2bdbf96e1dde7344e8056452f8b9d9ebadc3d702327", - "34151d4c859ff546da2544ada4712a17f05d965ecc6af24fd24104e0f04c5716", - "afd87ead6fd7b274e7c1e0929915de71f43c1b3c953060bdeb2bd2b81e69023a", - "8468f71f5bac51f7bc515a85e97762eaf20a668d20b06c382eafa927d9775e7f", - "0550be005357a0e6ee110274f7938eef5519f3b866ac4de41f06bba24ef07e2d", - "38c7f4bc58fc49747e8db0ff97765670e810e0249c7538a362c01b92965015e9", - "290eb8ca5e34d38a94573393efd049b7d1e57f8103e017f0e43cf425d77aeb12", - "274b3276deb92154228419e1c703a607c9af35e5160dff2deeef84b985c0ac9b", - "94010a218d38fe61fbc563912cbaebe472b6bea8af7520381e9804b0cc91e883", - "5e931a3913558adb236db44d70c3db500e76836fbf450aaa2a1c71a381b4c663", - "e6e3e6632e944a71571d6da0c1c6d6075ce6b6b13913651fe4ec4d7a1cb18a8c", - "47a51cff727419169a732b84a2effed24ac8f13df609a11a1d350b1cdea92943", - "0a255d972cc66bbd318235b08ad5297f2c7ed85655ddf993d294370e0fcbee9c", - "92787f15da0c1b3bee3113afd14e0e1b3a1fd3ed4916f60a6ba7f5a63e9237bc", - "a1699472ee8903dc125ccf8399834bb17951caf821135a84cef7c1cc637df570", - "919454230e437664a0216e1503ba772434aa15f47856e661e837c051721f2b10", - "80c40d9586156484c34bdeb29c57b516efc0042360151ad532c6775251d72528", - "7318c0b24a01decd4db0df2efc8938d5be898fafab980d678b7a2f521867cc30", - "5e0bbe7ba58c44a1d93510b6d974d19fe5953c095c7dc3e58f829c557a9a33a8", - "b4bf31bdeba22477fd9e6bc2b343b65ee6060de3d8c1310ae6b9a4aa9f845008", - "08cb3512143fe1edcb312ff085415df74568fe1e97ec2d475069123222169623", - "7e9167399c25267a738bb6309280805a62be44c8093424cb26ec6d406a6682eb", - "1642997c51f7f71ae35d6c8e8aa2295c376d4e2ff385cc8aea0a457fc6f94c84", - "7bff969363121a5d946ee0c08d58debc24bf1b6b605d2d78d037f4b520371dcc", - "936fd6fec0b9d60e1298b20fa044b908701bf9f72d666bd0b1dff0b381fa8a43", - "443dbe086cb70d9ae3bd5fb7ef918df4deb8d96dbe8a01a90e8384814b94f55d", - "1804fefc39d4ded41f5d377bd97e8d0d4cdb642d4ce16729bbd2e9db446750b6", - "4cc05b39e60a2381fcd835f924288b22642d7835aa3dc8133ec96317b4f3b666", - "4448a9f051d958c06642a89e9f5cd3cfe21629f7ba401d94e7856a331027e2a7", - "77fe398f0c8d29af5eeded738bed553d22790f975c90968657fd7bfc8dfc8ced", - "29ca3c799e2789e53c716f09efb40e50f1d9557696eabaf8b5ee700d1a739ccd", - "a11a32a265289c1299a574124c7eb00b120b7a798d5548ea07b2702f8b7ec872", - "fb70e2421911df29d753e651e1ee5f08deaeae8222d758a99ccf236a92cf4bd4", - "d910a077f9a44db4c76d4cf498f62d5697adf23c50de5018148be23df3dcbc45", - "dd709fd16435442b6b6d87997e96f8961e6a79687dc22a9d930711b765fb9e89", - "65892db729a8b4597408c2e9fbfe4d0e24c620ab356ea90ca98b9d813abb2110", - "01c573a0fe50c6c742cd1cfe69f3cad91bca24fcae8d85b0fe189ae879ca2e2e", - "836825fe029e186ca2025183de5c1e7eb991e50ad836972538b2f41a52817eae", - "1261cbf4b592bbb1ca5274c382cf937245854b23522f053a703a7459aebbbc3c", - "a3518df8c15e2fed59214bc58e5fde842631dac357e22b2a46b45fc213506936", - "4fc29a37fca8ce76adf50b2731806df5656823727ceb12de968d39d090b5f1e5", - "8a9393d3b30301408cd1b2a25e5a105288663c092ed22c26bfa16235eafc27ee", - "5526c2605d1ab084e5639213f5e9d8294e3ecd4fc03011a7af4a02c9dad1dd05", - "8824b54c81e7b70a254f060f649fa936d35163855c471c451a0a16e390859d59", - "93be94814d7a189f7a579fae06a0712eb2e2095c56abdbdebe89c6afb4b67287", - "29721f127ed7e7061f6eb801bf95d520f36175358cb3cf4f0b3d00086565d3a2", - "ba7d6a3e90a47dd22d623aece9a5543e54b28f8d78d8e3dd956a6c82e396a0f2", - "c8005c076b3998d8fbed125f9d985de56752d077ec0fef5d64ee43e113ebb2a8", - "305fd90d5b03bd439732fa6c7f315c0ee0169dd73a58421f0feda6fe3f0e7552", - "cd1ceae194533967b809cd67f0a855c8846a73e6a609221980a5c24fd6e1694e", - "31cb8e05191e7e889866048bf6822e6d198a9b7d8cf54e103fa4d6404c0bc04e", - "c6157804bb74c5f7a2641455e46ea3f30e6efb8a23dd5f04426fc8a7c04b9c4a", - "4a0c3298caf035164310bdf44fa8befe624d16833a15955543170f9b31589678", - "84dbc252e5c3e5ed758a6b39527f1ca775beed8d8184d76328453f7fa1503b14", - "f6e6c013c2183b714c2d18e99afd8133f9aa03b9ac0f00affc5466575508922b", - "acd85cd6606171c9e055cea71443a7c04acb89b3832a0844d9ad1036d29070fb", - "68584d279187e508c5b040e711feee37703ba42d8d55374adca5626e24b0f2ae", - "4278f98ac493aabe6fb8390444eeb4822c478433bc6d77dcf1b9be5f09ab09c8", - "bcd7e80f816776daedc72aa184ca85622cce2f56925dee1591d774a5cc5ef644", - "57f597ad1d3236745b48c3c9362cb6cb97ce6e309d32ed39c49e406f91275b49", - "1990393bcdb68030c7f0fc514137a3b2fef932cb2697648091f57f872a994aba", - "0157d73a729ae3a3249b4c25fd286b9fdd14c385caa2421ffac694bacaf36af5", - "14df1af5dc77ea339d82eba3b0f5b71815b913b40f38b8de341c7a889303ce4f", - "2027949561556a82859b71a987fcaedfd3eec55de55016dec914ebbe84b5964f", - "81b0e0f2fbfbc65e72f3a35977acce03b689272273d2c7595393adcf3e64dc48", - "ab96bf9e90c0ca1677d9d0d74fb64cc3c7a0c7124ed48a4ca34fa220c63dff48", - "b506c9802dfcbb45c5cee88d6f8ab1c97155673c740267a3b15f3600532f8154", - "1e60dd896b4909c67c0b1254a790d72302bd848a77e0a4b173a69ec3a0cda2d1", - "8c4e8a70cf3cf4cbf79265d4ed5f6019b5c1dcca6e922b4430661a5b3c06c788", - "e3620cf6e7be6d0ee5d19d06b2c81f3dfa5fe5052e96a4dd60a7cbddedb0f001", - "57b91d60d82487effbe991c428f2e1d9596830f4ad43e18402829de26b92487d", - "251116b44480a0d9fa738ddf4809c516351c5337400d2a126e5c5350388b37ee", - "d90dc6290f27d33a2277ccae18e734632cb494bfe88f955efca3bb7251a1b052", - "ab8b0b0378846d0d04df3d63c2ed23f5a3f83e2e7f99f277c5a379dca8ed1ad4", - "767439e395d132849f042812a8d0342b26bbb58c67758f72a0257861db256e00", - "19e40f419dec74822a82ad1482433d2cf0f9f542ce59c6b32e620bfc6bea58cc", - "21d946a70c014328a44165f0bc2c8631b109e0e7ac3368516b6c66692aad8027", - "b1fc13c17e14ed490d3d38dd138a1e069a6d6266799e57020cb1b34ecb12e521", - "95f45ee624a229c1b175e05377a0a74b8932083ef3c709be77b965980d8b0bf3", - "b68460f073ede9b7c0c0220b3816178db3f96376381d89680ac89af88e6c3b49", - "2ab9abd894e5bf37697dc618ad89ab8d3024a90aca9fbe7262e0f37cab031472", - "41b4e33c47ffd40f1de28d4b313c612983a53485f351890b720a88185c096681", - "43453f8e867cfdcd641440e3de4759e443538a47a9db139fb8b6c54303f067fd", - "353395a8bb951ccd3db088ba3a466c97fbdbcf187f3ebf68fe4be811a132de17", - "cc0e898eada0369a9616d4b66ef835f94a8c7db9b56c84026011b36a32224136", - "2e502a400933ce980680f2bb007c3af5b5cf908b880b18e390b4bad6f6b82f37", - "2b84c5457b5d3a28a1a6e2a927f262869dc2f55e2df712d4e161dff7163ef890", - "fe1bec4770222f945f36eb7958d1b0214ce09c1bdb93d044df5ff48c52e16afd", - "8e8ff23f666625c39e0cc58d4e58a32e97ae46dc0539e3073f1a947ac0d77b71", - "84f99d5c8325699e418b62d05ae6344721e117e207eced5fd99dd6dc6fb6cf7b", - "49e57298aa53fd1a188a346934ed24c23b2572ff6758d799d0c102640c9075f3", - "15e426bc2d85612e1407ba5e430e4c16388a2df0f89214dbda97d90b4cdcb001", - "c18e042f92d84c72b3053c55252e914ad42910e786bb35eb15923fa2ec0df506", - "6a37245a8d2e28934edaa0db38760912c295845900dd540cae3ba6137c37b829", - "d4ab5086e0cae9635fc101ba6c6f88c2e4b07fdd8abb3990ae2c595421c3f66d", - "1dd68bff1353245a1c36b7ec8a564cb83556ed117694ddd171298bea442371d9", - "b1824d275332a2d2b50319589544b2ad8aa614d9437bca090e59b8e220e44ef9", - "c7db3c71ef9ad204cc541417a56981a2e08e0ccd6082022048c91c58e1852e47", - "655a55d51627abc497e910870dd27c1df51fccc0de77fe4285573ddd634948f5", - "548160df266d1cb53f3ac14446e84c766137842cb9210cc68175d6c7d6ba2d74", - "0d7484f88df766c877ab9719a8b576f52e4e6d2282676cadad06f156862b8962", - "6182a19f0e1e3f3739c3dfc276be2a30ffd2f8b125d1977fb836b6648d95236f", - "79e8f6dab35d5c93f79be9cfe6477f6df116bc8130ba2d94a9f3fcdbd496b08a", - "54faea87a2471d5bb09342439eb1e1174654a22116bcfbb44e8c420c515c5329", - "6606abd9575aacd117cbe3c6e5a98abb1548de5d0732be1ccd0ef618a768f4f8", - "0a57c41984a82f82e1239b199a783a46430f4a59b2dc0492aeb6af317befd576", - "3f4cf626cee2e0793424b695e872489aa3b044b02e1c1271fa9db59b45f4884e", - "6ca9054fa3d3ed74f6696db95b51847e9693a7c0dbbe0feccd090e9ea0777647", - "915e477e88eb7a0d20c8f2880c31fd575b90be21ace60e3ce2a11c26dc17dd7e", - "25eb8241528795a6a5669c6406d3ce88a4cfe27bf2a6047f62ed484b32534756", - "7c44bb806713336c3dc247d7c194845cb20ff8cc9dc0844f3005dd2bd966acc1", - "7e17dc7ec1d50ec9d5ff0b5b563ca35ae8244bc184f144dcc3de1ce27a82ee6c", - "2a3ad4767d1361e459b9d75ad6aed1dcf00853b7689a0ca4ad16552aa5592fda", - "cf7674028d218c4e740d4ce6cb963bebe44680f7cf343cf4c0ca8ebc9d6a1e49", - "4f21e477eae5e3c1edcba79efad2752ee7a366a51b414cca63201386cc518ae8", - "6f4b7f538c3099c1d7bc57a38e11afc414e7b5203edb3c130d56df0f819bba09", - "3c77bcf5033e8553ff29ab6a9d333c69b045bc3bf03f9a02a57c63ac3e328e93", - "273cdb151df081c48c1f3dcd816a9796da983115d3ee39353c7ff2fccb452521", - "883b09e583be57e1f230dbc6f9ae7b5e0464d8418c0fcec833312c4177eb863d", - "e8860cbe45e75d9b24fd21455f041b6ba6c462eee4c97fab0fb32ea57b8f956b", - "df39d4cfc474a780b7162649e5c2a684a90513ea57ec7ffd15339a2a20482273", - "073cc80e5de28c36c9c8f48528595d6e921c4bbcd57bff809144a2e11ef1d6ee", - "3d63f7bd95162405658ef86f7bc39f36453ef11addfcb2f9a48818d1bb23ca9a", - "63f3c4ac1554c54e979b842cdc1d4bc3a5c78b363b1c3e88983021388d35ec0d", - "1955e05738306c1ef806629ad7db646e63ec8521b16c08e505d6e399f8e497ea", - "6a8dfc3d2223109a005302dabc40ac8d00dcbedbae5e2d250cf81a93ce886a0a", - "b6717f09222cb944cb655b4e48210f865f5bd2deedcbc7ff485ca1144c4e7253", - "001946e6312d62ebc399a4bf3eb7eee1fd64e22daaa687d2d997195cca392e36", - "ba1fa757b0a44a8cd9190d93de690c2720528057ff2158d85978332756faf066", - "d5a974f969a7512b2324a90f83e2aa28371bd721756349fa51579ea92127cbf6", - "2b88b3941f6548e2d54c8365a8e7d490c8d7b99d32bcba150bd703c04fd60a98", - "d5d3f11a38864ba44185b4f19cdf84243d11d373dc8b05c37a6e2e143ce621d3", - "bc1c8bcf8b55966ae72049834c1729525e6233ae20950dbdc9984504798b5714", - "a768bb684771b84c8661ac4d07d69ee08ad6b188f52589a819d0b5cc71788da0", - "18413768b06972a25134b76e2481269532022b80f239f6c110c5f1d7b8a2818b", - "578ffa946c974df5aa903b4ad88569b44ac5f44d2c188c49f0bcb2727e684e9a", - "25029f4d811c9efac3c853d53aaac5fbee17420c0e83713d32cea46abfcc9e00", - "82adf6ed403d7e7f701303d24e722c7d2c98b685d4006ba5e863414cdd99c6c4", - "888931fca7d5ba3e942d17df76833a0c8de6938e45502fbf61a18db0ea4ddfbb", - "a712e17d4115fd1fb74fe9892b8ed15b3ea7fa3004394c4a8ad6e0017025bf54", - "47ba005e968296f1650c00a0e5704a67682ccac5efff91a2de81ba178867dd13", - "9cc8f61f8ffbc872ff74b7b28961442b7e739dcdd8e2957e8c4f03ba65c005b3", - "803adecc49deaf7659c552e4b918c212ee3c43a91784ad31ffb2a700084bfe52", - "335aa3e59a49bbd776d47eaea4c86c4d2e44d7a2a5929b4d27308789c9f52485", - "025bcee93e85b2239db507a77d8b3ecfe19f88b00476e52e17be535b1db15333", - "b69b78ff6aa66fb3933f3047c81fb60177326d67a8cef22309bc004ea0fec2ae", - "bf3be6f0f07d4b9458af6366229477cabd3eb94b6294d0342010620ac8487528", - "f1b0dcd5c77ff9fa5a5dca6cf9ede16662204f0ac68b56b4e8a99271d0d48356", - "d78fd628148e7ab5ca83c909bef40fb9ac4a082ed4d3476be6ef9990943ed8e4", - "960b797e51e3cbc20d2335543d0fd407facb5fc53f191483aa0b788fa1c06266", - "c1c3a31ddef3f41c4c9223d8fd49cf8d890c208485adc18044e54691e53715fd", - "046d9a79ad77f314cd4608f2158525feb296e356f82a76d1490544382f89d2bc", - "fedaf6b807c2918dbc610d71090317bbf22d435c4dfb0174d8425afc317046cd", - "5c6ba18bdc589cfc5812d8d0b82a1d4d71546665f4326b19c026597afaf3a8dc", - "4bc2ea644845fa32043d127e2346be5f401af911f0c3cdc6fb8fd18f6aa3b618", - "b9abffa49405a0e2bbb297d9a2823775ae509c52bbf79970ca469f14717ac7ad", - "9ea009e7a57ff48d41e6f592ef2088c03b13402ed7ff813523b852cc7de4fd66", - "927d6e9c346834359e169f35eace2bc3cd2d94ab16dc8aa6cb813b0c5afed5e7", - "e70167c9dc21732e5d30b6b31da33f4ea0b303f7812c0670f7f9f7d8df7f1b86", - "2970f7b959543e51ed6cfb624293bd3e8d32b892c7d10ac451375b5430990f70", - "92022393cf191f2de6d2423746d82b2fea5de611ba14da0e0152bba5a94c5aae", - "899dd9e8b1552adf0e476615b46104070ae64944d8aa5a66cadc8d8282494df4", - "f7b2e421a376117e78f6172d76fad247dc85dfca85439d714b185223d852d819", - "09c417adcb2341afe59ff7facca995caa5c2e34576275ce690a1d6042b14fd0c", - "842059003670be159d41d08af667ebb7f1888fefb76ef421b0916324dd801d19", - "8868c63aeea8d287d19ea0d289fb63660b857d3eb7de54e67848e70699aa1010", - "e6acb84c78c6ccf12d87146981114477b48c6a018b005e8ff0e6f4c0f45ea21c", - "31f6cb4959cb2ed833d7fa078eeed33d50b125c66539237cb5b465c79aa1b828", - "34f68d54fc05bfa65260c6ea853561cdb541bac05984312b5800aca36a5f1ddc", - "cbee49cf3726f798aef30c5d62c69ff4ffe227644f6d6b4bebf4e854adb4db4a", - "90a8c66632982085ba6932912ba06e8ce32b1ac57eca56fa0dbc34267c24297f", - "fc542513345f39f71257de3812e0e68490f2ee773f480143143312cd2739b182", - "9c9829de4e389810493c1547ea5720189cbad0c9c9f28ab7e058fc5b7b1f7fe7", - "12e142e412fec0b6a4c68e25b72e6f1af42aa31b9ef78c915273c45bc932ed5f", - "5224169e142a8da91c1f6c7071e53167c561b224d3df18b7ea1188a995eb8fbc", - "36a89c62f8480d412d558bac71e1d4000362eaaccaf621438935b3534295eaf8", - "91db9eb4ead91c3a26497f1d7dd88304af9f3ccd577e5233e050deaf96de8561", - "f3b58ab198846d4b6c101f3a18a74da540834f7dd4b864748f5bc8a3eeff8b65", - "f6e3b2e1c508545d595f04e13b8761e36eeaee7fbde17ebfc27c4da54a0184c3", - "616470865828324c419317a7239f85a30997c895f15adabe02725005f76e35e7", - "78f24da795c224a9040ee2b396f455b067ad335ec057776a9e286f67fc39da6c", - "e5f1c2142294ad15ac17adddfd672ad781a96991c4bcc0860a7f63cf973fe792", - "8a94850d1514bc753a5ac8d6598fd4e32459344235ae53f7521fc8d79099ab02", - "46ec5d61939fe0e282f4081f6df2e90a4c68dbb92181b8032ac68c76522e64e8", - "c205d5582599e6a22e8b4811d3f8132ffc80cedff5bba7f08cf5ca9f17904f07", - "d05900099afc6e98e736474807d3ebf7789117f2965ca283907f83054c017c64", - "aa8e1a47be7e70dce8c3f13306f529e33248e2ad85dc4e01b0005feda590672b", - "54881c5844b280aec2667467a4ed0bf570e20d351cdcf6322def3e4c7c236e88", - "b801fc28b163e52d183ee2ca846a06931ceb6af9f8910137d67464922235ef9c", - "ff282744ff07c2f2b8a952cd6856373aab6081f8bd90bac889246a4c0811317a", - "8eb769ed59696601db03445dc0addb70a1972d1ec5511ac9ee5ac5f6b3117eb7", - "3447b3b443f411a6d67a6e25d98972260cc1dfd4c5554dddc5fbd5e30a2ab9de", - "4c564b182acf8192740646d52738edcd3175f88683b5c044a12cd11e2f25a403", - "c59c08efc6b5938493ac1ac221100beb622c9055a4d6c6c5d7f020b8b519ae89", - "6dbabc8ee1144b766ea4e6c6ff6c60b24d75ed705bdd950862594e6c6c621b14", - "523d382ad44c394e9f94b4639d36d9eaf83c24e4cbdb0e6429409704220b0224", - "24fbd495bbc08bce84497c576e29bcc46c6d07db1108710e0be303c501de435d", - "af5b9e8e073a273b0d642245f08ef9de43a1eb8c01fa0ad646d95ac136e36c71", - "67921a8239761a3d62a92dd9cf45ef2b70cdea30aeb2bbdafeaff1d387160130", - "bf87b440edc5fbcf112066369515cf09eb52a3cf478d5987fe3eaa3db0ed0d68", - "6fa33ef4c418af34ca47154b82e070ea1391c15c90593c8221caa5c96e7f5d16", - "2f538dabcf0668eb986fb0ff387654dd62b919a70fb86f42128beb2fd64f3b4a", - "67769b4974724b452e711c147f97e69d1731caa05e5b909213862e32391e0173", - "f52646970d1f75a0ab3d97f8248f9f213606c3ff9148ab90065c15c7cf664465", - "2b3b6ae1f915f9963914bf93bb5ebe1ce0b953ae52aeb881656520443f471cd1", - "271b012c9a9525917119835b67b3a29e3b3156ed8e6ba67a53dd21d6cce3bc88", - "ce6fdb8612316abb424d4dcce6398200065602667d016f20eddc1f8f0574461b", - "58bfcc75561f3aea2432fb4185fd190b51e9d92b09586b0b408df9adcb451c50", - "3e3841ef5367c6ba7b69525e7d30f9ed0e9cc059ad1ee37fcd6680361b8f3382", - "720f0233c2869d5bb09b8001825368ba44147003cde9209280e92dd23e48de4b", - "1a498cff15b30929561e4c267167815bb13138f3c7353ffbf9811883dfd1802a", - "e31c6d355dbaee8c5612c354060958b8130541d2e25893dbd11c1a9a7030aed0", - "3fcf06a1d775ee8146d1a3faf5c16dfdecf3eb3bccaf80bc4a22b2b9591f6872", - "5660c2c1d5628c4f0cd177b8508ce9cb98a97bf40e3170323988c8c7a95ad2ce", - "ef57c3adc493a01c674d172f874becb0f6be6295fac5332ba76ce990817bdf3e", - "78b10f4986b983022a6ad88f339204240d64950dfd407452562cd2eedf31a7fc", - "41e2378ee0ef65bd0e3043331735eb9836b602afd4561159b4b9193efd79f337", - "bc4e2ba87d5341fe0c6b36a0b614ca0ac9e6eb631f921ac040c7b1882090b2af", - "ee9bbabff866f972bf3ea93b3113e5a2be5b1aaa97e14395cf3269b0a1a40b31", - "62b787e1536437d6badc1ea3bc7aa78d300c0f686a58db69d8d9e4a2fb38441c", - "2720cbd5524005fab9057bf52a21bdcca0d236c1780b961e0b17122f25a6f421", - "b4e6a3bacd43869de52582cd6ee474f49c43f951eeb771293ee660af35f17e1a", - "bfaef2d0468b4cfa4a3936d710d92e8e4ff1889d9f9986c1053a8066027e8737", - "07054c2de5aae2941113b8c881db7d6b80e905f973d64e6cb17063126234ff22", - "84275b08f65664cb1aadc57629aab16795aa5c8b4518ed4407f04f03ada79f28", - "5a190ac7434968fc59e8e88f0f5e253e083003a378d3fd489ac66190a3fad4c1", - "ccc0eb36d6ff12bd1c72aeb012c09d2868f179ad03c7ad6d8bebb5c205d2c905", - "7256fdbee6e2a9a99842450c1da3e7365307e1c4003fbe379a7180df98caf49e", - "0850aa18f2cc3b84efb1a90438e59276ee3b244feba718395230db34be3e08d4", - "e9f9765b2161b1124cccbf81b24a49242b454df8731fcc5409383b8de288e51f", - "8375dcf97c3f89c8972921b3b62dc65e829cc7f274b8aa9ff9018c44559b6f38", - "ec073b75c2dd6f3985c949735def73f7975c4af8d4c898ec4bfcdda5db550c45", - "df49a69cc778d72cfd2a34424d5fa9c58ec1da3f5e69a76039fbf92670807075", - "9430b7fd0ba7ddb20d496dad9fd43ea5f7115517784cc6eb74bac966dd0c151a", - "ec356793fbb94843b146de0c72b570fc6a2198b5b46afa2274b1fc91baa3ce5d", - "4c10e4dd79ab4958dd796904084c469b469b05ee01fc43ec81d9c8aad923fb9b", - "012beaaf74483882ebc6e20f5c342bc1340e33f71b3942d908a2c9b983198110", - "d9f7f6382268641bb526e63be0e6c224b316a120aaea4202248f85193773805a", - "d9538a41eea5d7ba2ef2fea4963f5c27f1785e98ac6c21438efd2822e2f9858a", - "9e03a513ea4cdaf98fe6aa2111619350421962be73193d8c97559e3178612ba3", - "0347562085598461a82bde2ffc03553b47b1ca513a9e5f72231e96a74888bd85", - "b7cf4d8054706fc6555d85ca41f1299cea0dab193c1fb4b08bc4fadfe140cf26", - "ea85a80d09da9da272dcd093d8c6beb6377658b469c5b567f59170da39a3d185", - "edff2f527580386d10ab41ab1a8a929190c7a44075bf1d5fe6557fa350188ae5", - "d5fa53b82e91e21b43d79600337d209728b41d7ef4236ec81603ff40bb05265b", - "5c90bac742655a8f541811e756ef086fe0523bcd3afb06ff620301901f07f51d", - "f1c8adf48ef62ad54eabd40573d92d71706724b89f83192398681e4c50d3581d", - "6175a310083aaac9a53648c473cb3c3bd7cf2c0466772d3547bc81c40431109f", - "f4d5d27dc298d72cf620e4f4e346b04a5ca00e5814040a40acbbe44b8ac23f4c", - "08fe33198496e2383507f0dd867ae1fdf734c0d9e8e7e3bcf4489068cd6542d4", - "60dac03722a7f74b2e4b9e1d36aa681efcb53105b750d25387ac0448c0c9cbf6", - "6f5f6862aebc5039b7ba6b571797fdec3f5d8890d26d2804ba13acdf96e392ee", - "6238b55343e01df81aec7ed296076f86140d9211e7500ea5489989f62f838add", - "eb4c9e1d201323b935c5b1da7f288f6be368d13a905336fc10a0a848937ebe83", - "e9e4ad6f4cdc3050077ae52e8449411fa338d4656c4c4ee94f20e42582bc5ff3", - "13a5bd571970b82fc05c3f68ced5f31c8ee4a6969e0101ebbf5d3875ca7b5b03", - "5d11014877041e3e57e8137f9e44ce82c6346ebd20e1076ba8882c5c7bc89782", - "3d27b5d804de0e94a9d3d294b60d5cf007c57329968897fad81c3c145c998900", - "326204fa896bc5576395f1d1e68a10585a5fbd0e7811159a25a080dce8a78859", - "1bb831d7d655608f0f810530e8957f579949e2cbdafefe79e9c6673a3c4da1ad", - "d0edb81ac55477e4db0d81253ccdb81944042cbed1af6f0c5af1f0f67e14ec1c", - "4e363bebb2d1ae4656f41611ddb67da32a0693663343918d742b0196d626f912", - "bf269834b884bae3589fd2c99f503b688096cafc5e43a92404a004dc7ec34127", - "d088379cd43a6ef53931b41b7417fffffab14b49e95d2ba8ec4e824ef616f70a", - "4bd1b6b31e16863f113ba9bc62136985e3c29b547dfdf63f1a205a88d64f7c4a", - "7e3bd31b42c190c2c4bb972c6a2ae400d0fff2a4379224d8d5eab22bfa99841a", - "f80140bb1e3ee3468a7fa241138d3e91a5ccf6509c9ebdadc43ce72fc5e74179", - "715e3865f0a791f38dd6221bb9c519f089294d24a56142205c01b04250ad8017", - "6da7e16b472632a937750f7973af3ee9ce6d30f8fb86a88eef95167b19d7daa9", - "3fa2fbb2283b60b877040c33d6134f715315bbe6fff79b2c2f67816d56ca7090", - "ffcbfaf9abe943b6d4766a2015038350e2de9988f8844738775869f5f9b9e7a7", - "a08990821e2aa676dd75b917a4ca6103239c2e90ed85ab6ff6ecec6d8880eb70", - "7dadca78a2abf5984ee4ce9fd074857686394a55cc4278492d88909e3e9d3a5b", - "4f3e0e5c55c6c5f957cfc64b40f489ee3332b32d42078c98c112845a58602052", - "a0b1828702fb930c3b096db8456aa5ccb7aaaf326e74b9fc51796409eeb50b51", - "8eba4a402fb7efd2ac05ea112f610411dfb95160919416a4c30d4664d16b9422", - "0bfd28b38fe6eccdbbf98eb78b3c392cdad429c9a35925ec231fa028bcdf6278", - "5e3e6f2bf5c00e6b26114b14ee81c1d9b4a0f0379ed9da74567cf9bbd9d916db", - "f8dd20edb5eaff4d193d17f69c5abc6fbfb4b4290273b7336d32a08767f2fb89", - "c881397d606e6259e103618975d6ca91b8330a1d494cae6b1da004ce2f380005", - "16da9008926d5377482879aedaa20fccbaa14a388b6863341dafed55f28b596a", - "77c307a1d48193a0cd3771112e0d50431581006e00fe04456177cfac239b5043", - "4d0dd295c73035b8fbf4f7234682520f32d841a40789fbc1279023e384ecec54", - "d8ea6bb24ce43c5d0a647102a416dca76abd1486831fda07c1a7b65e2f916fdd", - "73f9ad342580554ceb902a57cdf5280d587f4c3456dd4d728ae39c46e91cd3c8", - "04b7f9f9ecc686dee0ab5a24fe3c3b83a0c8300ed5f481d7933798b162ffc318", - "0b86ff618e6671825d403628b59936a686f180d4626efbcdc17c9d233ada1d6d", - "0232279c1e6f1e3a15526c1f1b69411c40ba3ee706efbe1f4ead359bf9c91dc4", - "4f770e05d5905613f4f2de9a3ca09a794b5e8355a3587bb585c444647b12d233", - "ba8006bf7a350cc9abbf8e630a8b040bcb21761cb4db6c34b2a65d6f08b0abc5", - "6d43c146c4a6d5227ff8204b95ff2c01415e5000620e1a9acfc0060cf3342e89", - "376664152b38388adfc48ed46eb3c4872de9612c7b4289329678aaf1a537c8b0", - "85ff4c8117086f2d650608bb2f9cc846acb5af4c10c04210b1bee5d403191efb", - "7b23e1207d35218ce90f7aa96b436a094ffcfc0dc70cf1663852466c2625385b", - "af71c920876941f2a16837828fcc42253bf8d04f417a62912feb311ca0e60181", - "117973ae3dc324a67261574f10adb4fc0b54fd213979c35fd11c700fe4f9eeda", - "a5ab1eae7acbed6150fd9ef32d8bf4dbfc564bd7609e674439511bb2b3ddd3c3", - "db2549865e9b7927fdcf06d9cbf0dcf137c045148767ad66f61d2fb18b733b55", - "8beb626293a052b93436b745fad851649023b8daaa1e59e76180dc4f4c3d2545", - "b0c85c79de00de0a3506a4a5db502ba9b70552cfde5d0e3f89cdfeb2c6bc9242", - "5eb55e483256d433ea75797e1697fb0b0de91a6a36c9cca1996af80bebe5a1b5", - "537f9e739f6f8fac0d251ce7a4eafeda908aa7b1c62982ff22127e9bf4b4a5af", - "f1f4e5d9e920cd4e0985cfadc4ddb2c12afc002052a6c8d1f5f1230fcfe0edde", - "5e08603a6d5f4bffda42b337deb75952c9602da5ea1bdc42fd096e612425830a", - "71117f53e686e99444217e46b81e785d74f65c03ef8649bc0fc76fbba09e8fc8", - "907fd93445926a0b08bb2518302ebc4c6242d0fd072788c9ff3553d6e71a1e68", - "e8a01456b6aca7eebc2a230a4426e5d4be95b80d659c738226484cf107ea374b", - "fe1ae1e80cdd82305a86709029d40205c855c9eee4af033134e3b9c4d8294c71", - "71ca688d925d74e00b9a9739d3b311f46e7611040ebbe992176cdc326d932b37", - "6d16726f4e333105c86edb384c709def4ff6deb525eaa43d4ee04f7bac516ceb", - "c13e41dd53b7213df46a5c7e281bd7759a63e7f79293a534eaf540b5e9ccf2d0", - "fd9235a9d238d73b1115d866c3ec8827932df6657baf3b469a456330763d558e", - "790844a0b8b4469855dd9666cf903a221a295cda120a28f65d1dac2c730fa6e2", - "e1045cf051103ffe764b069ff9393752d74ab0a350a041e9ff805a785d7f11b5", - "176cd4f5ea1a1c171ef7e50507962c4c32bf328ceaf012ad31250ece9a270f85", - "e723a40bae21e80a48e35750c712603984acd4859f7341f93e4f659ef22ca033", - "d93c076eed58224e2b1d0f59906ce3dc9c98910a888fe17a2aed115b82058992", - "c9e0f504ecd1aad81be7ebd9d5df79be4cecc7e4f934c20e80bade72dfec6947", - "48295f74c60e5ef9a4b5ffb661ec4bea2cb4006ea39b0679672fbdb296aa1dc5", - "51f03277359136d1464a9b957203e9e0f5200d96c4ce0967dcf0468dbcfa50d1", - "1831719f2ea0491b29d0859f073168b53882d647e0a3795f959c016e5206ea5d", - "e14bf40da87a7e66f33389e87b2e82c6fecf419e3bf673a66820724405853af9", - "13fa7ca0521aa9fd67078a738325ad25d392c613dc76b2a2d316f53a18f9aa62", - "c304f4a66695c99af9f3cff9c3b6069f1f72dbb3612e1dbd57b069dab8f05186", - "ebe0b8bfd1e41dcdf07e72efbfe12055ca1dd126a00cb272d9f204ee3f08fb4f", - "84f6ff486fc76bf2aecca12a887f9e10d7828492d936c2cf349b9864cd62ce14", - "aa5cacc54f06a02f717914583f55d38e623c843bfad477eb1741c63061de881f", - "b03abe7a3bd2815dd229b85938c55b79222ca8d82647fc99736b0bd85561e311", - "21dd1ee9d01a2696b0afc9e494837926fe2edaba3ac1d09f2be2ad6794a49d84", - "011580118e7a688bf4dc8e470e8e117a4b12d1f100661a2fa63901e4107da360", - "fec42b19a2b942cc1c42f14de32aa48ce5d9406c1d10b3d6b80cf43ecaf0f37d", - "ba2702a66f09728446103f7f164e84f6a8214fd1e6ece1cb775b55e2e907369c", - "baeba9a75ec3cda181628dc513fd8ef8389d239a27cc44a2981cd3ceb816ff23", - "fbf1e4849b97de530fd8793566f40ea9f3af5d60ff6bd4329d651254cfee004a", - "966a36ce101138f0a6ddf7ef841b282c72e405b65efead1964f24bf95a7f2fd4", - "f47da061d7e4708df92dcf21d5b3459223bb8f914b3e3f5506c1b11611d67e8f", - "48d6db83ecb3e1d2b247d068e1d66d96847d95c7830a4063dac64eed66cc76b0", - "0ad2e803b86d958dcfbf3ffa77f12f038055549695b78ec05717f086c13db8be", - "53aaa45c5d391b836e9791711a71455b35efc4ddb6f8dec0f73137c56222edc4", - "5fb456d0769cd9d054a23be30b249f9470d9eecd93b213aad816a23fd699317c", - "878164e9f2f1363462d833c0573c8f6669e28edc6f332f98d9421bb9e3ced89d", - "f9e25b2752444eac38dd2e05587c8362aef9ff5439d7cd96d59c4b2d033164c3", - "8176e72a340a803838d422476b8dba2acc9aaacc3785504f49b854dc4656de44", - "4a152d81bf315ac0131edfd0d28a6db90add2c7f8c4e1b469713c3b043224868", - "492b7c5e3dc801648fe172acf23844c505a383f2731a323d2e52327c7d3f8cc1", - "9ea66ea701e8f38366e0c4c8e37cc00eb56ee19f13ebfa469f2268fbe702a4c1", - "7260daad5a92ee13b0d93e8cca678e97bd81e276196df0915290c206544645ff", - "d2d1ea156597cb14f9e257885194225f60bc8e20a66d341bba64d3f54e9b4371", - "f00f1364875143ed224f23013fb5ef4db0f0e53758d5feef124ade73e25e03fb", - "efb0d82d7d76f239a9f9fa023b1655b083520114c96175c77e0e9f9848d3caac", - "738893d3c8bcb3179a786946fe8225e97bfbbfc7d7bcce12bc714a9e3394f74e", - "2b5c32b569d4b74901ff4202eba37175ded14b77f01757f5f5f54cb066c6a1ec", - "bbc52f1335518097d2807ed5e1011aa9086677dd5edb7d92708f2a74b52f2dfd", - "9f956e2739de459eef136444b0f1dfc9feb02281e71844837a03e731ef7f303c", - "48b27398fa8f2ffc8c9e93c436ee750aa3998661f7dfa02365471d9bad705f42", - "aab26405940032775e6762646981952f3fccf83a39012fbe23853ab860d66660", - "ba25007f86a9b3733398f2e87e348449e40c160e2cbf51f8ee2b610042810394", - "a1245320a886b9c67a4a2ddc26aa869d4447389a25424ada88a715a8ee1629ab", - "5b1043a1d0f938d747d5429aed4040de2b10b0d9052c8df17c69a012e4a5f18c", - "534a9d58c8d0006effcd63149bc61326c914813ca47e8488e3f20f5e64e2d9cb", - "66fbb32f6877cfa814e4f312b949393a4b2437615f0148898632853e5cde40d5", - "cb1b6a4bcc6ab7f4f5219d5faf03beb3bbb550b9509e1b753de27308f41347ac", - "461009c825088f4a397497e1055df6a7b6e150b1afc4f95fc11865520128e95d", - "30b76bf25d3fae0810b45e28e0c7407ca8c78b3ecf25cf4eb89fa39f16ec732e", - "2b097afce07223e1b2af274d3df3f4ff3fc41421f27fc9102dcba3338f2c12cd", - "afb750ec6d70fd1de65a3a59772637dbf95ee642fca38be6e493bdceb511d280", - "36e2b09f8bcefb711580eea3542c368555e00e255f9737891c5141eaa884d06d", - "b88aadb24331b88b84f6d39be22e458097603f67e371e666de6e7324a301d7eb", - "1f82a2c112dfd59a80f9168a62741e11bb0b86335be1c6a955458ffe554d5804", - "87bc3d763e1f73a9dd23d6f937bad46a6bf76ec38a5c2714b67744dd7b2c8e7d", - "7ade1f85df98e1bc388f19e78ca86e391659bf6f6dd7d616da465579fb2bb23c", - "c06db54c981132ced9e44dc88fc1437eb11ef11a10689f7ffc205191d569b828", - "93daf55ceeed8f1a3b501cde61c3667ad62db3dbab91f6b403d82c63fbad9662", - "3cae8d7145236aabcdf80f8522143bc1e6425db898c1fca45f44d7adc1a07ca7", - "d83470525cc8f2e5576a8ec7dcaffd6b1d2c7208f12935881c38370c674b8536", - "71a00bfeb5edd5f0bd2d236033be4ff093225c53b18764f61ffe99ab51f40f35", - "f6f971ddd9bb72efa8cddf6bad2710d2f2a4a3bcecee00c759c9788df1050dc5", - "e070ffb9f673acfe34f650a7735cc0d33435d7d8d10a06781a8342859a1ac714", - "ec562ac0829d850bba56658b1c0d8bc462057e6686764da8966fa71c21a8a624", - "f9a1f08dc9a3261d405feddd54ccbf7e0fa083c5dfa27cb1c61c6e89b4eacbee", - "0c236aca09418f27dc7c8329416db67835f285f0d4dc4c1706ada4d9b1e143b1", - "9e39df73320e3d8f8127e177ccc99f0786fb5d44fd7408d127e910f69fdb095d", - "acca3aca912f3962498d0f47629c8fa92f0b19d9404f47ab9a4d062bea25a93a", - "c9e222470c5f636a42a602473a9ced99695ee961a11c117f1bf7c77f01fcf69a", - "b4345a7d89e0a65fe683deddfbc6cddcdb13f1ed5a8afc33d598d8a1539853d3", - "9e3220e11fc4cf4ffc3486576460712d77b683f52857dd75f393ffe761f49179", - "253b7555d8c2c383ebd4ea539f76fe53e3674e19186eaac0354c30be4180bd24", - "bc21ce601fef98f533d2a05ebde2651d4c75ecaf3d268a55c7987dc45bb9c1c9", - "d551e82d64cc7de739a2701b54a929db3fa7af4d951ab182eb9a4724de6b0142", - "f990226656bd3c3d74d0fc626e3a451ddeb7d07e2b2b51bbe785d2976756c238", - "0bb105fe214e964ecf9e6b02e4196771cf6f1c6cf8d48d246289a1c121c3ca4e", - "fb19560ee8da5c986bd283cbc1f439e515ef4c4d2661d9ab9e979c434e6337ef", - "894eaaf7007346d0f828dc51691c5ffee2c2a2b5fd50462ca7dbae94e4bb222c", - "00710c432cc2a2a228c68029025eb6bf7425717d0852c0d7729b62e4ab1356ea", - "712009980c1da32db2ae434e6c39179da928c58bb72ba0ff371416f573e41b3c", - "47143c27bb83b513f28eeb798cb8a91f749af7a0f4a898a176a5e63b2538aa16", - "542a212d54a0eedee0359fa5a54120499dc0c0da3a45a755b753adee976e2e68", - "201cde699ac993e4b0f57503498a1c6c16a7f0a4f3261c2a48e43d94c8549472", - "a056b832f3d7c3dc633398e867830b369b9f2bf7c764e3d24896a7ab2add5382", - "adce66b9e2a66d51707d24fdc3dfcd8f0dd6dec5e9292d8b5301328cc64234ee", - "55b68a8c9117b22dbf5c6629e4904d37800d41450d29d7fec9fe4af1110645df", - "f9f7657f6ec98b7acedb2e253d316f180097abaaa394a31bc241cc36cd97531b", - "6b403fb848d64043bdd6509d6f7a7ea7ccc37f45392047215d736691f027001e", - "8f9ea03a43f940b0c45eab670264e388f8e0d31e25d75dc71b4ecb4ab62ae8a9", - "c4a14e5fb9fb6ec74c1a7c314430889acddb4c9ce18fd249118a4f0bc1533a95", - "eef5ae415cfbed2964a7e1c83ffb2e48361a45cbd4b1ef1596dfd8f2c2c929b7", - "1c4471bffcdd412072993f5fc5e945d5515e3cdcead040d82bc5621a02ace497", - "5d598886e0b5d65482ef8030536d9f5e7b2509a4b9ee93906ca98de7b7039118", - "fc9bb6a93c59d3a6cfbf1c0cdcc44b83801f9a10403b4b1c9072198d447a7c8b", - "0c670bbde32badd6159bf30f5b0e168cc8f4fbe8eba110c40b0638f0e6da5b46", - "df76813e50b832e62aa0c7d4540c78ac6068120aab36a623229db107f94fd492", - "fe50a9c3f98490815ad9b903a3b8807b7e61d3b23ccb3620e75ca2e5f570df50", - "52369eb450e99a87a2434db766b743ed2cf82eaf8605adb0f0ffb0a4d3fdbf7d", - "75778117072521ed37bd8ba167776265a89f55dbb1e37cc7cd93d2021fa3b6ea", - "798dc5182f08b9597dd7cf270350e92b9f26d78af6956342b0d32ff9addf394d", - "7b15cee1b2f2c26302d1ef8a8aad9c3beca2dd48ac0a5238734896ffc875ed92", - "abfaf8504d5b4f13df22cf5ccc524c5c0d067c167412efab0300660d215704e0", - "4032e36876ab99821e65e011108541518f98d6f9604efba2ce31ff5460a004f0", - "aebb01d4a214e14d3dee6bbc8b1730ff222627a554aff9eab3ca6ce825fabead", - "7af6a19bc7472175dbadf0b1125ad80bcfb3e6111eae6384b6ddb4f6bd5c1f80", - "146038a6221419106618beaf7214c9184a7c1921acfd3e22bd25589b195db2f5", - "48863053ff6f100c28d73abf22decc8a519b24ed1218b960a7739a584bfc0775", - "8339ef75d06864e79297135b64ddcc7ae22434a010a6d9dbb576565ca6df98ef", - "9d2e8253eaa928f9dd2ba4a1fb72a2c2dbe902a1daba6e3c73ca1d6a3ba54a81", - "523d8eef97dc747e91c71c3f40f0e07bccb7cae667f1de0c169c063717075398", - "fd9a77488de1cab0b21735ecac6c5b6a798589d0659bebcf502db6f507b03199", - "cf23edd861cb7c7983be9e079aebd3e5851f2003d51d29bbc04e00e0e6dfb00c", - "c98293ae00dccf5ad185033eb63aca4123c8be6fb3a97e3d93b09e06f7c808f5", - "dc5fe037b2bcc1f7819180800568fe7818cd8d61e83aa6379e91a880a7ca25c0", - "e6ad5c7fe579e9d32d8e8933b29a73dcaa020b807464cc0b38ce51fe1bc42591", - "458c461cd782957a6e58b58f437a1a3ecf0b9670e71c39ede78ee2f6c756dd5a", - "eaa461d8ec5f9cfaf2cf2fcd6d0ffc128bf0df0aa601520bfec8dcfd94d6cdaf", - "1cdf096dd97e7dda1fabbbaa612a78dd8be460a2ae9037e025f856cddb8109d8", - "1d7cb803dfafca883711fe797a79ac51b4566774110291b318238c6f3a3312bc", - "e51388507a0752984c9c8c4ec22727515c5727a30840d2cbbd679092ae78ee70", - "a53a6cbf6bba54ef22dd5aa14a5d5d33db00b9389b3b505bbc722dfce4e04076", - "1802ea5a650f84d620e7566cace5decd6bb704b7370da80b27244dfc0cfd068a", - "56ca97936979a9a95c1132f6801812d38f841f76a76cb2aae17d9b855dfed8c5", - "2366eaa78591af6c0a0982e9d7fb86dd01ab9624400f96b674ee89ed95b3e606", - "6bc2843e10c5e368e7924507948883b803e3d6eb7aa0349b4c94f8a6fbcc5736", - "9f2fd7ead2891f7408b782b61f01520d45df2ff70dde5988b304b02e3263ee83", - "a5c751a65b7adb3da35be5aa9b3422f92f0d1b10bc72147c05ec624bdc700d77", - "90585be0cec5db53bca3a70b2ed6053e21d8f664367a626fe769a0cd8afdfecf", - "a0ef4d4c0a67d4467f12056baf11a26248814f92b8c12a63d1710e971b182cae", - "fd913846632406952d30915569baf89a0138ce0d27b0d43732b4d841bf52a448", - "a763c4fc800ae728484ab6a74ecdf1a988c376f41f548a0fc50801e1d548ae5e", - "aa9517191bc03460e1cad0bb22c701e76d89d259c303a4b906f2661379aa7f50", - "63a837ff23870355e12c7c12060448e1b24d15622df5c0932353589cf414b353", - "5dde52b261d1042773cc2ba2d4c97bd79b6d114441784d062c0a1dfc3623002c", - "3f65e45dff159a217141e3501162eab104d21b34b26988950e3bc07c23d1c9fd", - "7c20e39d8dbf1bc2664bc50107c506c7e67464b1ac137b9dfeb0385eed055c71", - "deb7bed78b71bbcd40e86579e6628a6a7a4a86e5f8a5669ed592e680cdb80bba", - "8d579549f15a32a551ec5eb6d842f8dfd8e8b7398174abeffad32e03874218a0", - "e0c4f72c7772f3a7693c9846d514b8a4e2b09ce45bb52051cf26ebf27ae8f510", - "707d9ab89f38bd0e5d688e353ef104954fc60bb7fffbcc8522bcfd2c3d658fb5", - "7168b8873dfb53915f5344b92779f8df0befbf97e82d861c8eec26752c431be9", - "c52ae659ec864ebc046fb8174bdf4741cbf7b25cfb309bd50d42f237cd0105a2", - "d3cc96671905447845185ddd14a6a4a5ae037c525fa7739c62d14c2affc6e168", - "b5a057a806e188bf368c12b58ed185aa2ad6d62527018bd97bc33da60fcab3e2", - "989b28b773696e33290aad17829b1f76bc775dc2146a3054cdfb03cb86e0d759", - "b94c01ca052f64ebb955c857ea91ac8412a291a36a05e93807a4979fade73b2d", - "7def592a6af348b91a3aa8ae520f7162660a19925b33edfe7e3d873fc5c658b9", - "4eb5853299a21a5856d793cac1cc8aee0b9b9ac110c3c571a7a913e52e00da28", - "0a0c86c43b84077261e990494a8030096720545a5c0bcc077d21fbbb99d606fe", - "a0d75b16811214aba6bee2c82006691b629d0aa078e74bfe878e3ef37b64b841", - "d98d8761eeef198bbe01d694dfe53af3d3a7c84f47f0bfa9284c181660563d7f", - "dbfb5b40bcb5f32f54a9ec73aa57469b22375b05e3fde103db723fc9c60f48a1", - "1997d7aa2335c198b65666ac0eaf0e19e90899e125b0d76da0b03be74246aa12", - "1463d1cf0747e1f734b0eb9b7bed863ef62b15c8c5049533e1760ad1783f9d75", - "a2747e99b8c74bd070eacf61f35af30d94c0852981a9fe5c8dbfdbe95bd282c3", - "f26af0b4630d756f7fac606025b95b9cd2444623e8f032c04080432cf8258293", - "ae6b1079dfb0c8425dd380383618a39999a2927aa60261d073c9ca39e7b15580", - "7f3187a404442d84bf2fdccc7a5a5029ace9e2a9e53bfc327f41a8bc9ed2e382", - "cec87bf9a587a0eb82696fa23a9c51a3dcea0a6a7f2943a14234e7c173c98795", - "ee4b0fe8f6fe28c34d42635154587ca7264af71bb142c6a948bfd9d3e1fb3c68", - "e0670685ebdd94315c3d25ead81df8c6fffb59ff1eb25bf725e09ac30c28d153", - "f18993e424ddbb39e009d73b4450fa5c76e903ae1411015a5f8a80cd883aa031", - "4461a299ab26a18d13e2bcc7f87b27565c2b381ce4bacab1e4a2d6defd137cd0", - "30dd11363b7e2ec4dcc873c9fdb7637ffee502d8f1e730249cbdc724d71cb4f4", - "caabc1981812699fc1c445d3ff2979b8db8c4624c536b4bfb9d9919fb6a89ce0", - "24686281eddca7815a845aa8d525a12bc50d8f6c272ba9e649b5e05ea5ed1cc1", - "5b3d0ab4815079005ee9d24f054eb0ebfc8a65e095e25906065a1ce79d518984", - "c06a594dbc5914c235d65f821e6cc5fb21fc8a9be6dec85aae4727ee8ab3fd7a", - "cd44d9e13afa23739f635de4da087f0d33a48e67d6a1d743165f657ad465e0c9", - "8cc9ccccf535870eef08574f4d6da9af81089a5fddf740235b6f737262671df2", - "6552a6a32db3a5b8702038ad4f1ed527adac73a4668b7577066c661fbf809dbc", - "8f63ad7cd0236ef93fc51efc0cbdd3766dd8c4db0fbb6f97e41fdfb6730be91a", - "ba020c4a6b2313b868040fd90f484504f692c2cd0486b6cb0eebcbc4bc249d7b", - "da5669191e3b10f89201c47d3523eb0139590c241b70066957ad9610eceba72d", - "a42491a4eac564d345fa951debdc19b1122ae534bba506a5895f29e206557190", - "4f168cb91fc09f70d0a5aa57f92f24f729586540c7ae15b50661a938612b1a87", - "2accfa3dc60a5dd1e6cac7bbbf002404b7a107a5a273f8010367620859138006", - "5e27442a3ea6c67de63d15dbeb473128217fc8cf0d7d203910ada2d4653691a6", - "a47e294910ca6700c3a57dc0db78c448d5a2f32e2d9f970c49f2f1b21930e163", - "c7b732eac51797de2709fc9e418e9bf66bf222fea820845bcb0cd801db2f1ece", - "1f919e310da02d44614745b7139cdaae21bf1fd002974006ea030ae3355e3620", - "37cc0e8b4cef8bbd2943780892b9aed75d2006748960e9f95238f8e4a4dcd6e0", - "9b64863570344b71968b5ff7be25c7d4cfade8ff5310fd12c8c552014f7da920", - "47fda13b267bb7629e235bd43d195c8111866555c218fe7388543d981bad2479", - "25189802df182064e8d4b409f8330131c6579984e22b6a76b56b2fc709b2ab2e", - "07f009aa30ad5d06fbc6db8ba8b0c06780cd3d47462b6af23047877d89b310cf", - "c649213426cd27a23f32c5c2213aca43a4a357f22dcc5766cf43ebf662d31273", - "71121c34755ef312f014476ffb51b9d50cc9fd16c836a2d5651cd2476e9d53f4", - "112e6080079f183236e701c4ae53a8858b9e69549e452e3b58f8c251a22330ed", - "548042ab53beaafb8583dfee91d7d5214bc9219b2cec141d0a4663af89684c20", - "1d83e81d3b82da62f2224fbc29a4227f08ea2d25dde492d8be00d49df6224752", - "a3eb66743fb43b70fa2343a57e6b8b24cabc6f143bff6905aedb587dada94d6a", - "9690cec2b8252532d46187d048f531d850c7dee403cf19cc1382cef06b377423", - "71820a8b11318a72963110650be5e4be2b04b7e82afc16623d5721d391f2c9a1", - "554abea66936aa1624e6526d19f421ad46243c10c5d3d4417e13612d54683d94", - "d16c72a8efd63a05992d5ecd8b45457de7a47f9c62d29d35736590e746d2d317", - "975c087db6f9fa10d73c65d706771bab39e1b98dbb29058ec49f89cbe8e94d74", - "3f8fc2a096b6e95e9a11bd499c34c37895ea2237e95742db10928af47df6e09f", - "a3a0627367d3dce6d13a551eadd71f591e3cc12633dab27f121329e9c5e9cbc8", - "2d7f309dee839b6ac7017d9a93aef6d7819b796dc03b56693ceb881be2a8d7c6", - "e0174a50db734a6ce18cccc083b1c1ae20366a43988416afc8dfea95cc7e7ad8", - "456ee9fee1df7a3be7593209f9522fcc34ddaa29da9f36365ca5713dc9b70796", - "c6e00989588eb9557164f805b41f82c1c6a215f13017cbd69a07e934603a53f0", - "2d33cb35fab989d9e48d11ec2eda3034e29cd018484df9346d30d9bf82d103a6", - "7d0d84d45fcd89c84e77482b39644d970c0efba0e530af30e445652987c47bd7", - "d209322b544e0d6961a13f7789e4b9c54251b3d7c26c18f3f830ea643673401d", - "899abf2ce51023d0c483771d825ecd132edd6ce4c81f906a94b1cfc989d1f5fd", - "771fc12dda4521b6a69e04f75e81a28547b0b1e9f44057654f9b2520411c9574", - "743f6554597fbfedcbc7c24582549ad5920851b4155636e0128d39a2c9f935cb", - "7d9ecc8f35e8c68c0364734be5115253c8a31645a59cc05a25a98b2e7f61cea1", - "e624dc9ea9db31472161e2536d4a010cb385175116152e4230fc89ea059a85eb", - "91c74360b0e5191790531ad17d0a4ed624c75d419445a5855508e692b3ccd21b", - "90243a9994cf83b0b83dc5ab476d346eefd9a51307e4fc72d9b6046165fbc01d", - "b1896065d31123c6161b96326c660106a160f0747b0878d19251447ebad64f74", - "30631785639c01da59de8f2a9cec8999484c0606f602c226736533fe4d62f6c4", - "afa8aeb81ad043d18572f4f8c99fc62f11d5e2aab2a1c7184019da38c6c96a67", - "5e8cbb7b6e10a08e59e0af638cf34e5e05e7bb632e44b38a8254727252bf6455", - "39f388b0c0625d808b074dcd8f14920451b9e55accffba1e35752a6828296527", - "e8ae0af9b8922c5f83d9bab682a47f04abdf8ac172e71c656b996f54317182d3", - "3f7b7ef57383e49163ee47f631635923d192eb79f371bf5a066f800aaed6e62a", - "6f0432b6614f0c26b725b52caf95e9fc504be99d6acf9fc5ac49b9ad1adfc506", - "430bb6cb5d88fe496173319269f7f9c7209f3739fed310e7b4843b7a9186250e", - "6ffaf750f711b3ba444897a3c3b6da8b32171e8e9ee257c0675e6167eac3d025", - "db5f66af63496819963af16fd9d3ee80c53126f25fdfe4158f6730860451bc70", - "608493aa7a89d4644fed63020d5cea941fbefe987cb714fdcdd42a6209707295", - "660fabfe9ff5d36ef3fdeb3143d4d0fef6716c1915084e3957fb80ae979204c8", - "fcee4c4cf4293fd947dbd9782e7b65994884564e3b47d32bd03d6907b7272b7f", - "e0c85fe1b90541eb61325ae1e4392dbfb8f84d423881def92b04981d4f57af7e", - "d3d4d39261cbc804168ce03177545ddc5570dabff38a40001303cbbb3ea1a2dd", - "4bafad73eecc8ebeb2744b9e785278b5caab69cda9000c8e509fd906c458e9eb", - "0b4dce1d964ec68b8b3d537358b03757e585ef923a8dfd6917e56aa4bd5ad2a2", - "5d81e51b952e4681a5a0ad00099c271b586f8f1641961d7d332aff70a37265c5", - "14a94d5f53a5a78f76f45c588a8f96702e272e15961935bad5cb2410bbc8b264", - "21a2446c87fea6a1bac1ee9a96eb5e5489686aa7f4d70b7cf86af1f648ad2b1f", - "11e861e7983c62f0fcbf4aee67a28543809c91ddedc892f8a8a646ba808ca08c", - "bf8cb5b552cbe079ca83de0e252ad0f75f31bb926d40cf5b7e28bfcd3b2f0754", - "a2819aca8f31891fabb338109cf5051bdfe59a2ebe8e191acc990fdd76e0c1d0", - "44272bc677ca76d3dbf9cc1ad8e2dcdc733a5ef9cf53b969b14c90e74a5c6289", - "6257e199a542f1e1a905839982a14bae1b01361a0b42de3b7201eb25398327e4", - "2d934322c9d9f8b00605bf59a073880066691d1603d8fa70e816ffd684c2d02a", - "721a406d515d3d54083f84471a3678f9fddab5ed7896a451de67ec1e630890a5", - "ebd47ca754cea3df40c9694c8e05fdce8da37d7c4e0fe69086cb80c0883243b2", - "74b5463f18ad5f0b8c636907fbe530a237f6dbcc45afafc4ddf578902659f5aa", - "480d487c172f3d548035a9e2676bff467d7258286e2c47d73ad9bf81028ac275", - "b53d24aaf91fb068caf089d7a5d6bb37f8734fa1f44f2e94ac65ad298860e62f", - "2938e4e764d5b9db44ec0b405879744b67e420b410c980257e35b1eaac1dbda2", - "76c86c4491da12cf887056a9ae360727703c68c79f55a746589ae191e20c132e", - "01e48661440e4a95601afeaff2d4fa8ec4621e38867a0e24580ec027eff393bb", - "03dca84b5d45139987b89298fb7009446c56a5ef226b3ca271f5dbb08e7144ff", - "2744bf49779872152f82e8f19d2d5dc94b25deec64e8d086e1b84e1ca5384039", - "121e7d38156a42253a315ca9f51bfb47d2cb2f91c70bfa02ad248a73e1b2bce4", - "d12975146db2f451edb8a6a3bb84199720b60233725c9844b58aa44f8af6c1c8", - "48acd9f41b6adcb6cbf47e59357bcb021346b83c948598e2b588118715b4cb2f", - "a0c77b2fe49c2c912218c253df5518b5c808ecb917c05b2f47ecbf730e788db3", - "684a2a7a9f0ded527d90e3971e4d7829b72e1b6d876a10b2d54aee3d1251c70b", - "3d3a8a3c6c73ec4a0a0b91807158aff24e13700c3617ec4c92ab7fe1ffa7378d", - "a7353a79a4f944346c1aa4491ea05497c868c462d297892fc7f3f6ebe16e3a53", - "79b39b79ed9e970855e53d9ba4808b5de000f26363fc0f3b2422de95c95c5ce5", - "5d753f41bd76da4aa21d4c585eef326ed0f5fc424fa3e4018b3f1d6335ff4505", - "ca4b5ac68cc74e2d06c1cea0496a4a3f8f88162f9c578676b50c846ff429bc72", - "968a680b6c7e1669677fb65f3dafd4dfc7239720ff652adbb3b793a674713e94", - "5e7866c9c2ec75aca4a13889a1af2f4f7f2c9d39dccf729fde5e0423af6f2cab", - "aceea24d657033a6afd9530de28c3a02ecf8a99b39e2367aed1e07336eb80549", - "ad5d132c579869e70ef9cf768cafeb68ef785513ad6eeb6a70f322fa58644fa2", - "37dcc994dda8733c192b13757ba2076d850e0395287e7c022ae8cf8c84eaafe0", - "7b4d31c55fafcb306e3d88f09599a6e5da1fcf88ff0c92ca387e78e71cde0c86", - "a8d0f0274ea379beecb453d8493c29511bc79ecb71130551edff5a5cf0d041d7", - "fe7c019e4c2004e6cc2bb35bf2df6bd374a6d9fefe2b0bb112bb2e7e2c03436b", - "0e0e195de89df9453e38f478256fdf72bde38c9dc283d0aaf2e63cca7758f8e9", - "7b24b66a8f0689a0d3e292099b2b537f01d5477efaa2ed040a442ca933063820", - "14987a3d4cdfbb10d991f6cb55b56a6474710b0641359e4127f81524af53a191", - "9b4d9f1fb002a25ab98d2d890f6eb1f86b9cc3e3f75f0f100bb47e0d38d0513d", - "0a641f31d98d67dc7e6b0ab2ac0fa3294e6d8abb8c0f214e8dd7c33c7e71f246", - "2de738bc8dca89bd4e1f77c333bf477c8556eb05565ca75a4653c58dce935504", - "4798a1a38d5b6c0e9ffcb4ea4f3a68e258f0bc21cc53486a9c0803fbdc1070c9", - "63d5e9fc987e7303ae8ac7b3308c2c8728ca1de4ada1a76ff5bb8976c1484cfe", - "1ce7057173013911547b7f8788ed1ef8f7286d8a575a087e4d4e9859711cd57e", - "6b640f51f6330884add475dc8c3a1effaffd5d9fcbec3f4ec06ae3bfc6f088ce", - "56b13ce4a7b4a1dac789bda166ada41220232a6224b14dc9f34ba8cbc9fe573d", - "ceafe2374dc227b97976bd919303878cfd4a59ece263238240b0c9ffefdb68a5", - "afc754f946cc32b6ae10d56f2e4f518a76a8741106e64da5cc04cf66fcfdeae3", - "9c9fc133d6df37b782db4ec67fac045cd263e644f62ca78ad9d012e3db7e337c", - "c7134ec5607ba3e0e56d9870d249f9c0c467529c03237de32d5746e48dec4141", - "ea113f0137f030892a22881f188ae2f4b17e2248b92097ff3250ef780724dcce", - "028b1f36004f27c9246323fb69fe0212b3bd9ae34aabe6bc66ae5c15c60fa93d", - "0b00bd0b6eff03c3f250ec3a9ed682be5dcb0f38ae37ea4c1924c258234cfdc0", - "16dbfa40e69763cb1e62b845926e6655cba41cce1848c87eeddf98631a0debbe", - "1ba274f91e46dd338b27118d1dd09fdd894fe4fd6ff89fc2eb9ddf5d2c8f781b", - "4261881a63627a6e84cbbbe74a4db245bc45657dd12b9467e25ad4b033814732", - "916b1f16b51d6cf34a3d748468a72b77626bc8a038bf5ef9ea6fe5d4e892dc6c", - "0ebbe56af6112a7ed1d3ef718bdcfb0177a3c30bced0cc1ea170975240be8e15", - "a49a61ebba3fafa5e5bc849f1d5058804bc2a365601599014106d631109bb1f3", - "e2490d09b23cd69b6cf2895b1287ec64f73dbe7f6e20d2a972f6ab6366073869", - "876a5bbb0073fe3e5ad6a970940f0a84c3f5b5da3962efca6e5639c67a0a9f97", - "049daba3148cf061e769797791778707adee5e3e0f89799af1d7f4666b4ea1c2", - "40b31d465013faa83cb657408ef5de1b49d05e7dbaec107f54c67822eaa06b6b", - "f4d042e9c3653f1dbd9305738ebefbc3567e2dad8f02313be02aacf795403218", - "97f7b6740ce95cda4ca0444fe28648729a552472686179eed60be7c6ad88ec37", - "e0c4cf7c1e86b11f930bfef6abce0764b57b8df8a60118efd61f414ef5d31052", - "ef4576050046a408b30cb9552f8df02e4feb9cbd3906493275d78e712fdb0eef", - "2a04b21689bb59240c330e944beb02b8f1aec1316a0d3b8c2d3df0c17f0def10", - "a6837e3ba4f2befd4d66cd4591012a76b1f77b8de75d929532046add5ae68822", - "b15f235f4421ac56849d68c18fcda2d694b7fd8093754b7bcc7aa89645a27d6b", - "de3490adcae0ca610f4fbfb10b1f63a6bab8520d5dd03a55065e8e1d53c8f8ba", - "da6434f0bb60517b3797958292af7b684b38db3087970de17ed0bd3c3057a27f", - "7bb2a05e5c7cd3f36326de9006f34ba2b384129f710f776484a6b55be16de290", - "187be11464399234e222a943fbd83bc5329f5a244a38187e01f4e4631c278ffa", - "b3481cf90b4de29404b5b42b9199eebbc8522cbe0dd044d4291b1f03a9b8bb20", - "0c15655e1af83fa506ee1c94bbaf5f9f1649eb49e18b434edc700884be2dc57b", - "ed9feaaa6c45d487a3791ba0e1ed0e296e5c2ba52ada90928bcfd1dbe35ba976", - "5855572780f665ebe83649c5e38ecdb40662faddecab74ea791b2c998bd3afdd", - "60f934b1d3f9d5b1c7489dc6c6a9da5b2a892e9278ff0384e275e585148bd579", - "85e0c1ed4c144f6ddef24660aca790c09f4333f2b1013a9de8bebcb6a570a1fa", - "c38fe84df1eeae840f7d0f44dddbd535a1bc471d05f785ba3db3cca13a2470a8", - "803cb0eb3ac588e7db618813ce3a2fbc973e41156167fdf3eb10de4beeef648e", - "7454a08d9a8c1fa8085ef3357aea116bdc47624a65199647f256112df11dc90f", - "88157c46daf92aab25dcc759972ef4cbd3ab318814a291ba93f69f7695d2ac6a", - "d95c9c262a2febe3b95582316c0eda44fb3b5ff9ca384b5699817876d56da0d6", - "1f8d976f9b4b2aa45bc460b6a418ccdac910b46a63b0ed0d6b1d9ab511b9c7fb", - "0d9cbc016a8a8acf4acddef62e8e4e9ec4b3aa61869330f5c760886fa60b3913", - "2e683dcb2692a7af7f6e46016c057883b58691aa2bae23efac4519c52f0bc46a", - "65678bc943c3497429e6daa8b89193324c499d9fbaa94ab62a283dee9f44f571", - "c75cec1748a3e0e17a923924a9fa8493791b6624f2783e8b1cd3e5f3236c86f5", - "713ed5629f3f9c5dd5d5a91c257067930d71ade98092b54ab87817b2e27deae7", - "493fe7a183beb4b3b1f9df9f980e4b7d5a03802473bb6b37a8c1e7da7cb1f9cc", - "fdb9b76cb11845293a83b0a2c58b964aa0bdab611b94bf2330cc51258f5c8ed4", - "5a7abc325914a6506f7f83c4588d7373f1c927cb056343fcc371a4daaf19e399", - "e70bc3691ef997e3ac615e9b3ef1d166f49a520018f4b04c94ba1ef678f13d0b", - "72b6bababeaacf560172d7724893eaa13c60c955f8b867c0a361c1e29c5ca49a", - "cf86743e459e5780c173395bf7e402ed66f013376d06dae3d162b34786fbfa75", - "37ee06d6a9f52072116b6004518f125bdb0b7214b997e2c0a95e68ef4e60605f", - "bd12f7f72a95cdf13b1fd5a9ede266952111015c22f22c14de036eab5bf2a5b5", - "8547f477c823a372c431ff45924ba7d07e97472ab83c17b62205c3d57c7d662c", - "e89108b933c3bf3981c54ed67f712b9d67c7cf5aefed9dbed725c0c54128d889", - "2cc2f8e7dc2ba336273cd6b16b5b405dbb01d332822a30cefccb72fc88751e67", - "c047b946bfa7a370edd383c6f94aa41c3b8e9951c34f23f5343232167dab7188", - "4952d31f0e0a811a8e3240acc5f9c7e637ae5ebc7020487a2678691a833ac697", - "06ad57154083ef736d65b0460b35a854a9a9a3d053ea03cb9c1ff4a5d03ed1de", - "3d0d9ede7676b847ce9269225c56a9caf1e092810deaff9c61cd5d7ffa0b7c2f", - "bb0f48f26ac0980672e1536150064d394bd3d8d9755c958fdf147d9004bb646d", - "179acb3c81f9230a48000fee4d4aa37fba587a490120ee4cd3b5ac08e1ac3134", - "a9fdf86714b573dd6ef0907af6ca44f3c4533e183af55a0b48f1c460bf52bd78", - "1610feb872a6038748f167206558eedab7286ffd291198474df3e0ae34bf2714", - "4de6301a4b1a3e2a377fef138da4d5cb6dfcb8022fb7d5e7993063a9a4874f57", - "ade33ad8506547a96feb58c198cd203f965a80559b10e108f133c8875fd8d48e", - "de5830699954506e108766541d4c6ee4a3889954dbe956d13a64e34464dc4d7b", - "dbd984cba462bef21b713d4b3a47d2e89dbfa75e9f9dc1cde58b7edea49769bb", - "6b9665005239abdb1a00f0737c531c85be77bdb9d45c5e8407ac204545c4f7fd", - "bcfb33d616f33e56ec3137a98c441c7936082cc4cfd04d27a8e01970161f856b", - "98426002e990d0b0aecc77579d5101b293952b992bcf17fd5d73eca29b2bad42", - "da4034db77c149a222f7d4de4fd2c462cfd09623a75e41d433ba9ec7d150eb52", - "064066e6e929641db40188f70cc2f188995b18093ceb8203af97af4386bac3af", - "fe344f2e1a7b54dbc4ff7c66c36009b285318e7dd1db14e920d1777c6e8898ff", - "83d55e473de181068e078a99b9e6081e901d84178ef0b03f7f87aa87d0d50987", - "1037f1a8d4be10df1d62e1c75e0dd7f2f6c14629b18945b40c2aa3f8bf595eb8", - "781607be168ac6e33509aeabc6c199aa79e3d6a7aa3a1f26e9b216d0e74d3718", - "c10d8232cc119476a11f2299bf39ddea8c77b818d2c1171e49ec224249057ff7", - "d0b3de3f1a127decd5f90e47cf6ce2bb60b89b40da57151ede116252bf759c54", - "7a297fc3462ec3c7283da41fb840135b8e6ac45d6a96ef5a155ce5d52c4aa8cd", - "05d2667bae9074baa86f8765657e35bc31d99b98e261218f1e7bb9f13c26c676", - "a2973707f20584b9d5113e777062312428b6a67e6731c1425337c05ee7eae663", - "329efa2fcb56c16b67e5dd3dabe6e14415ee9cbfc6d10e630d855c5cc326830b", - "d4a2b189511381f6c96fd956530b623971eb29618c1d5d84ed7ff80c0a6052b3", - "200fb7b2cbcab6ddc9e59ec80a62cb096c601535e44633fdcde3979ac77a0323", - "f16f931fa4fe5ff5b8337da6604351267ee883f94edb61202229df6dfd843d4f", - "19334fb6323b02d0488f4b6ff1409a6f86418aec6662dfad02d8425ab614ca37", - "fb35cab009d84188dcc03b2fb7402ccce3b7a595f17999bc753536ddffed944f", - "b1fa850585799a207d59f11dcfadd0cda2f577bfbd7d9d318426345adf084519", - "27640057f37ec7d34e6d78e6332a0de81753a4d0db1f1428266e5aed2937abf5", - "2b26a7c75aee107ae7d032e9bc05fd2b664d522c790a149989b710bbf2dd1f3a", - "3a42936e4ea37780da139b19ae4a9e9a053729efb7f2cd36bf244fb9d7a9f244", - "753e3276b3cfe7ca0ac82a687a048bffe95bc9f4b76cd819576b70e7a4018430", - "59870ff106b1b2c939e6f5b7e8b16a801bca87817b0dbf197460321d1515067f", - "02e50b2fdde30a90c29338a4fb6d85d00f87a5ff5e93d9d15e4f100acc5eb310", - "83f833f9596f72191041302e05501949cd24eee28f82dc5dc25f68d203e29179", - "d28e8cbc6ccf2fedb37cf87541bf5327b040dd7bc82e7929628fecbd49529289", - "8e4e6f12bd48820cf28571b4c2441dd9d92991f41a4a4fe3a09666e8bd559488", - "a2431878e747b3ae28126db25766553bd012637f9b6b9885ff4165c8b1f3fede", - "babdba75696e67a73a1b2f31eaae961a488b7240a9bf124ea2a5d564c2f6567e", - "3fa42a535f03e8d0a0f95c64ec2f7308277d2acc6041bc8dae1d9aaf9b4b70ed", - "9e891d489026807e3dd3cd501b2326888bb4123c23e665a0ecf470b310f40b1a", - "ee0d5d3b5a2f39052aea9a1904c252df2f50c4adc2a605e0a96afedf90c00372", - "a7a07c2eddb1ac3c8d6bf6847e6fc25afb0efb892d325f79dfdcfa1d214a65c2", - "a00fcdd3f00f9da3dacbd7f2d1c2d39670c8839d2911d8aca6f765d03ede881c", - "2749553a3d0e0da6672a2ecc5eb63aac5ff8b6d21a3f923798efdd4040f894d6", - "bdb8a7d0018125869f71ebe741aedb4efd6fe42aefba3d67b795107fd30b8268", - "340a51fd4281bc19970eb03aba6145d9e830a2d32454e5222cd606c4ba94308d", - "ce2296f4359abc0cc2e67fc0febb6932674488d352d2e595b7aa17a854467b13", - "45a2d40a05003baff262e410acfab0b43efb28f92382b9c5472da469a997b4fb", - "f70e4381330e4d6434a48dcac1ad792de5a885286445fe9f5517469e28755032", - "8cc0e543302d90bbf2b1a98e82b53b2c811ac810e83185d5c295242411ddd72f", - "c8ef7a92a48af34019ec73da70936fabbc3fc44a94b3ecada3b8d856d23fd517", - "193c5bac2915a657e167be277694008a20d2285e1b6da5fea33db184d8851519", - "2c32eee7d535683d0e1cc71feac5faa7336fd86fbb5907c139597cca052193b7", - "92465855828fc336e19f5a50d1570d312eaa3896618a82ddb5de83bbd13299e3", - "92a10f7d679df00a2fd0e9d998da58fc65c77874d7f7e1aa7d3585667c9ca7dd", - "9ca9938a3d35ca0ec5e19363415d004926a7e03b812fb97bb0280c847377b037", - "74b7e5c6d08ff1c9cf80158d112495a2af971347b9239424514b7fadada0f9e5", - "c32f47e282f8ce1d7566e5442705a855b3ecd26c4f38819e68f76a49bbb1b465", - "8b8a0ad175873c8f2d51f292f3bf3d3c0ad69cf1d626c682605bcaf29f75fc27", - "5a1d910b12bce5e7b6bcf2eb3b6d0682adc5504147d564d14bea27acebcbcafc", - "24178a41009bbd4497275fb912894a5e2d7befcd84a5aac58f63f49f2eab951f", - "f3f1fe3b75322e2cba1f6fc5d3cdddc912b1477d8b04c35d9ebc7fd332a1c558", - "5d6d70fc5c246b22077f1afb2ae47610cc3ceffc9e0465b69829ae07f953740a", - "eeb38aa5daa3c4876cf26bd05b56ba422e689756e01b415a5be7d3990e7634c7", - "5f6ad85ae9e77b761fb2cbfd21b8ac8ca93dad85763dbdbd49bfa7b5c9679c1f", - "7272012ce4d2bca059fec4cd68956af2cee5f71be73057089b0a07b2444fdda4", - "2e1f93b54ecc5ab0bf1db8572831a6bec73e47846219446a9c62aa12d748f944", - "6b03d4dc1424d3da541df86c585402959c573a48eac018e5a5ab308f65329db8", - "a0878314aa5ad16386b47cedefaed4ddf3c4cf412aef11b558836f2baa6c24a9", - "1103ca71d353aba4278d6cca359838304c8bba37e96bf2251b8017b7532bb778", - "45577c7ce4190309ac307012419da47855d3464e0a80454fca5c2c8d37598590", - "255ae05ad9a1ef1011cd710249d5eeef07f5d29152e6c06801470255d46210f1", - "9802f9a25d8068a978c92e515b63bc5ed0e6d09ecc85ee15d36dee962572a332", - "9066df982b62d12ab34bd3c53f778e247796e74b6bd5fff52e3a341571972c13", - "daabd1414081c997b581e187664450a13f7c33cc5675714120b9d967e0e56c17", - "a2f7117be569b4edc1b1f33204551c4a27ce7b1382bfb932f1ab4bccc4ea9ad7", - "8d9592ebb70c42a0af494d6e24cd7a884123dc6e1dcce4f0b1f46e887ad5f5e1", - "dc4bcfdb2cc9c6dc4d634bee3fdb4b96bbf30612739a80a8899c0b0c4aaa9b43", - "212670a395d1c4873d8529847085eddd520f11bf27b3c0662a52c64f935f5568", - "42789813b1f3cf870d0486deaf02a40113c01c7100a1062094f5ad1b7cb08dee", - "d7905acd9dd09bb5fa18c70be5ce93e7d70b75c3e5ed41c17f66bb5ec7db021a", - "3bbd7a55837dae51e4c0767342266da3472b50f193966e2bec329b0866a23e0b", - "e464d70d50db7a14583fdf436efe601e33790ccc4e6258a3d4a81b96c3a0ac2c", - "b7d4fe7bac78f05949b637ec21ee89c47367c35afc1488084fe6fef96adcea12", - "19df4d252d6c299afe957df3662b72c986c6cc9688e95762f302ed540c92f847", - "4d960e2252afe90fd97909adb9887481fcba37222439ebe5ab13e93325b185f3", - "d9a22d86ba4714cfe36575ba847b91caada3b65bc65b94b16e7444d9f46736f9", - "f648b6cfddfa4240ba1137e7e635de33ccb23a28fa08d68c62c7624d4c4f1bce", - "7b01dd734ac9b07c212ac0cebda1d1dc7e85da8f8c30b95ff59f1d5a9318a6e6", - "c90fab5702d652617ae7f70d02c6bdbb5cff0524aed23bffa4bbec4388d0060c", - "64b907e8fb5c398331dd7e9b19cf39da2f5c0f14314bd0eed370512c57af3831", - "13962635b8f2f5b731d24a3f4f1f55cb6594699ab2bc3965dc01188718b37c4a", - "12d8a9690413bf9f6ea5000d8f3e430d75af9ebe7483884882eee712f1139abe", - "4c9955f7386f75df21258901fc4e06dbe24e2778ed0537d92c9f5a52ea9dd020", - "d83c9f8aa332f7c1597c26f67efcb8a1b17cbadcfb8112def60f58cc0c511eec", - "48a005493f74c07c3ec4164bcdf21da4cb1ee31d1f13c8afa6c7119f959fc86b", - "62ca1d4c9d837af715184fa599ad599863b14e8ccc7b8b9285210f10964f1ee3", - "320651d137dadc42d11e018b315a5f98eb486165241f17997493fc00ab025a7b", - "b5da9b7816d262f80eda2f2ad6df6125ab8ace46e9603934589adc5cd4629929", - "991443cdb33fab0cca4c0dfdd5d9ba51cda55ab15f0e2e2c8b89dbd55c6d9401", - "58bafc8184da2108849604d75fa7c89d3117e7e06307555604318fc857b129fd", - "902ebb16ebd623d4aedd52e3b4d4407c15be5faae6ff9eca220b309289a2f050", - "f886ff6ddbd56c9cf385aa1ffae646000f1c3fa763c1097f696f9ed90055b649", - "e437757c641aae48c01ce4a368914eca845644e68215068d2ad50a4db75e5fb5", - "77e0801cfab716404e5db5ee170c64187fd10bbb983bb9e5df5f31c374327dba", - "e8231a7d81c7bef8d2535d32c541317e50c09408ff2be2804d60b96cd7864ba3", - "b3a0f71305371187f91d8c67520d1f40ff04c4f77d5e1abca6eae1c310ab9430", - "b82357d4ba4c2dc446112dded6b6b192e92047347eb7a5b69ea51218bf40de44", - "9907f83c45c28ad4105ddf8adc8ff240af91e20d912b8cf67f7bc45dae2b9d16", - "9e184e3d612cc7cf8f7e33c2f2cfc71598ef855594f8331d7080d37d0915e60f", - "d54c37aa6d9728da3f1a00a04126044e025e3f9cfa7e0a914f2267e93c4fc00f", - "71fdc0a82d001d53070fd93ff91bc699687e4cbf00027af6dcda562a6d8466fb", - "268282d36a5d1f61b3dca2ba40eed89e37bca3f014c2df1f64b8c3724456e2ac", - "c9652523d3ee8887e5020544f179b1f275b921f224796308bd8ab8570b62404d", - "6553a7d1435896ea09675af7dfcc7c0c3722cb235046580a65287d5ec38d9b0d", - "5da4d3b527b76446d82c04f5fb2e28213f44dec1709cb9bdfebdb31a46803b28", - "602525dc12f4c1d2b77cb42a664d5128292b07726325a290fef331cecf5147f2", - "90f45f560862d08f34fe18a07c256eaf4aec669224ee272dc04233676fde31e8", - "806de743bbfd3e20716db43c5fb37048e578d241928a529426dd5f1c98c4aaec", - "f2e1438481b6b69e0006f368f212d42484133f1bbfb3a6ee052d06966b2a0f65", - "4da53a5d7afb7b5a49038dbf275d4efc5b110c7fe5b19a57c8d0b4a186408cae", - "16b61195b39ee6854508712a190403b3f6083acdb8685441c63ae6ad78ebe648", - "b1b417fef7a64b2562ac24ae4b0796237a78035733e171da5ab7e7d622ddeb4a", - "67efe2cadc24e2165de2a75d7cc039fad07e60f7baa055aaa455b6f7434110b9", - "e4f878404f0a8e13f2585e1beb4f7395b3e431bda7804586529a6347f3267b04", - "8fae6052949632c07e0f8ef8c631df03a6fa5162ac2ccd9b816b98cf5ae158af", - "b474fba088696f45217a4264ec5dfab7d4839dfa0e47be6726707ac6f2ffeb34", - "79558bf2b5cf41a78daa8dfb23e4bb055066c270525b22f05bec7284703027f6", - "35e9ce44392a269df02c5f2ec0ac763dca667377ad6316cc841161179fc09522", - "f1cc06737c625eddf5413e03231aa692f28eebbcdecc9a6d016c85506ac99649", - "b7d844aa7a3d9e8743bd594c41ec1e60077dba1a1717561eccb66237c899c8ba", - "2d47b5a0f5f63216aa2901fb8c0d6370a99d1f98ea0661b66208f02dab25979d", - "2b0cdfa9718c4ed8ce8475ba46f053a4081f63b4e32721752bd76934759fe426", - "22c507a73e464e4b1b7d621787203745e7700834a8fb3532593f59c8af6c3aa4", - "65bbde31b3981e860b1cf8a26ad65fcc30fd6a0e05857e29c72a5388b0602281", - "4efa3b6afb29159fd299d564fc18f589ee4c2aa822bd84a17ce3e2c784674999", - "2a22f787ecff2dbf501d53329c223b92ff51ac66323fbcf3f7872f66592f644f", - "18b79d2b763c575e1715b4cc25bdf5ac37d705c53889595964e913f3c878871a", - "603c67a9817f61ee888f533dbd94f4528840c526044640640394d9b2a5bbc671", - "d882f4a1b40ece6b06dd07952c5c54d27a94c068fdca6b051920689f908ccff2", - "17fe6b497dd2b1fd17e11b64a8136f8a9300dcc4032ce579f42e30999ce92bf2", - "e1cbe1c8bc21fa208ece1e9c603246affa07d67423d772cf81c062882b16ab47", - "f6849c8fc94cc27084f34690c337dbc672dc22fabe7f96367abe31b80e6b9f33", - "27afddc3a275fec17064693d70a5c3a3ccb43c9540cc0307866271903c584f9e", - "7808bea1b9e04d1d9db975cd142160a4a095188c5a0ec555592be0b230d51377", - "6d9a0c025b7b547cbd69d4d09fcb4a83fa23d50744e54e1a3da27d79ca745a25", - "f9ad56cdb6060d896abcc6c4d8626c7fe230307673a69f460043579d3971ba2e", - "91b4b3ef241c08e7403d67643c171746b8b3cfb9158c37bb6ec48edc7370e28a", - "b3a94f534c2ceeb442e4a0f492bf4bf50567be60dffded1e648f78def2df6b27", - "d75baebea643d8642626bce68bae7ea52e185fbcf6db3e87dcb03a92c546e858", - "ce1df4003328dd27f639f7e790b8e55e59727297a647a40e1bee6e209c8d67bc", - "659090ec431f82af8ccd43b5d20fccb722d031b3e91f2ae3e547ffe7c86e806d", - "69ca7db8bb1c6d337ef77270ba294525de6fa40dab3ede38d4c4e2e217cb6a1a", - "0a44a1e376975fc055849bba45e29c231fc4aa69bd56c5a56cac8fd036a4d417", - "59d867bf5aebfe9a6bb85315d2d4a1a10873c54777abe1db7d2f57ab632f2a32", - "d35378c896f4598660a37b433bb26bdd1f62acc1dd69e638f8b2de19f7fd62e2", - "d90e9625568c002068ff4700da57473e738ae8292475400aaae39f98fb1e434f", - "96ad034c40c045a489fff80621dc2dd21961389f96cbfd5b32b63f3fb411c35d", - "a863faf82f7f48ab46313a7868eaf2fcab427447e6688b86514b70ea62019527", - "1a05b951387ba3561c76784b2d2cfd3c40ddb8f2e426132e26ec9f6048c0c72d", - "b870f5d67d3f337ba6ecb1b3d43a3d6e134a0ac4976dae626bd45fab6116bfbd", - "fc02fd2ca9898a5232c759a203f88ed941073ada46ec86801e05b7a35a2591d1", - "00b1059e740c072597d8f46828c09efad10a1fe4cc400d58af1b31c653efff05", - "c5c63033daa92f861b69871f96ea9a417300996c9d5f34ea6087295bb073ea84", - "f9a74c0ec18ba24fc4cc8f85210fe9d2594d3c4fb2495b1123bb602e1766b5a2", - "0a8e7a7c0843622211904c721bab3938792b20cab2d70470a86361ced49adb41", - "91f14af81dd0620d68f0538af94ef64a42f1feca2cff69f0ea985ce7a583ec4a", - "a5e421370409ec46d375298a8822e8177ce6dd7849a2c48d83cd4b2b7ffac3a4", - "212c4b4c5d6455394a6115ba6b557b86091844baa40f7fc525a7651867a7bbac", - "2d2eb04854695d1aac38f26e5ac26ae4fc9a03b92d22fe29dfcf219f55cb6501", - "a5f11e76b7bb491deefe6729235760241d617f553cd73498b98db9c88695eac7", - "3053cd194b70e43ec3f52cc1a5ecd43ad9efb32a9eac3783e67153de68d3c35c", - "3e06fdc6dea6fdb854abb4f8f33a199b579f5781148a8e59967c7d78b5029327", - "07f80e798dec3ba2a2710d676c5e6efe397e70c1e85327713b25369ae23acb02", - "c0067b056e2a0565ca35b675aa93b7196aba4e233839871248c637aaa6bd580c", - "46e061df70701515c8a80326f473bc34e161efee38b66eb7ede2ab3ab8c322b3", - "73121e2d0eb32a516342bf1ddc01fe61e48d363919a1e0e5005d2505a8d51ce0", - "de3e427f24a0028edc5fdafdf0276392c39c012ec4563037036e9519a0dc9c14", - "03452fa896da472d7c9bf74eb306bb414014381f89ea3b5660280d4cc4c3345a", - "bcf6e5353a5d693f5d733fd01ae2bd804b178a0d0a2727cb7254db3229a61b92", - "a4a220c745241c69797937c5d92f162502561cedc4f183a21a2ec1347689655e", - "345a461a64c12fe70959b36c6400183f5342b0f0e8620a23622f93728f2e81a3", - "22a70012a8ff7d2b1ea6a4db453ca14d1b51be3ec6586d325668b4a2e5e8aee4", - "b0c4471d8f04c5b61e860a27141c8a47428f6225c04e79b345756242ffeb7a05", - "a836701e1aeff2c6bbf4c3d60c8d748371bbb36f6faf2a17ac0ee5c7ed38b409", - "50578d85a36a1e4c014ab3fe5981e6143a49388535d4e8055e68b6fd166c26de", - "cddd619c0ca623cff489e7048bb1c5a656145512a0f66772b3d49acf7c1923b1", - "ec51a3843faa71b10f27cd8cc4ff77b472544eb36deb13c5bcbbbd1abcd666a3", - "ebd271a8d1ea294a68f26a3b2c584ada88e02dbb182ef6b8bb41a7225d32736f", - "8dbeba724eb3bbbd7b3a3497271600c56192fb14c1fe2fff75b4fe9d017728f4", - "8f5493562f0f586a1f1168fc54c7208ed5bddef5bdd5abaef7da556b9bd9cc89", - "fc2167d7326eca760e40501e2b789f76ceb810514c68401e9f6d0851f7044607", - "4b9433238feb952dc3a7b4ce9b28fe6e445d4b4c25ac56875d8afe635f53801e", - "17766ec142202304331112189edd0374efc6da9f87f8d7a944495dabfdb66057", - "3f8cf10e24876e01eaca67b7bc0e9469d92a9067bcc63d2331ab29c347a760a6", - "8a116a5348f0d8b5c373484c943a87be003872fe875eb2740928409da99c231a", - "d01333a25cdca84e0c925e7711d521baee544a3a04edbbd3bd16cc102b060081", - "7f331c1caa42a6b830f39912b7f22ee57e19ae247f3b7bb05e3c6b5f8f05c808", - "dfb5bec7a01c0786cc818e62a91549f5b2142506214126266e5f2fae65ec66b4", - "2e06b601382d25e10b9ec3feb375196d8cf05da9ef2662cccb2e76b925f3ad36", - "d07939b67f2ada20d11c01565914d111ada0910815e56d83c27cef2f5c00e0db", - "1222f86f5fa9cb09d584b1161219ee59646d0c70f2a362806fbfe48545551e98", - "c6be6f29cb1ef42690e166723db43cdf335cc90e3de1b737b14086f85bf8342f", - "be7cc63ff10ea1bcc76f3e0908fe4925173d4fa07ebd1f63f68f9850757ff636", - "aa5401981912299f3867895f9301cc2b870699ae4ab5840818fb25e06c34cb49", - "b28cc8a086d27f8a5f366c29c902958cdb67b373c2c21ed2ab592dc47eae2cf2", - "a8ba4c7a433e82b3b4b53138408414485737cf3fb50adcfd76f690f4c8fe60fd", - "f019c3219f3f53bbd8e009c94d1bbd974116da825e0100f9b9d1ee9585803c91", - "7cf936d0ca65572092f0baa07faf68ec75500326aeaa98037f2b214baae9551e", - "59a6d376efc672c35069710071173707bac2f47d6fbab8bcf77f3795831cb875", - "0c0c58414f583646236cff3caef3739619de3a93d29b1712c8036523bb952fc9", - "ace5670609c42bff385eb767d0d0ca04168e0262c616c8f383b893912aa1f6d0", - "b1bed7dc95291547d1aac998b52d38571bc0a5488d8a17ce1b821d0732d43dd4", - "0b358d656432421637114688e7f225a1923940024476f6c0aa41a6d2622691af", - "9d14a790114c9f2de027a06b39aa5d6636c9bf85a048fef13b4cbdbdf02e1a50", - "e45156fa1570e9feee79a6da52a2eda8d7c3efdb8aecd3ea72d467d28bf41ee1", - "07e355ddeb515620da96e17943240563366ae4e746b669131263f7fd7e59822e", - "d556abcb851784fe18bf7768fffc16284fe82205e814cc5b5f5fdde7ae816a82", - "f38c6e871bd5d7e8c83831c58261c1cd494fe09d6291c0defc63f7d4e773f7e2", - "0385d1a4d9d396dafdc31cf024e0750dd28970fc4be1ae21cc60a68fd632e740", - "7f7c18faf0b6e1b1b71038c722249d4e108461e8d95ae0f7a281a67d5e52d7e1", - "29fa666dd69fa7589fd288a148d6bee5ce564061a6b26ca7b362c58b85d619b9", - "7c9f2e73bc49c9ec6cfc602669b4bcaf6e56e02b8a2f9e77e2e227af25173f77", - "262085eab6e6f8a21fb63a1cffe7c78212a93304f300d7c2d11bac09b5f64936", - "5a0ea357dea541ffdb525779f5eec0757247f893fccb45e4fbbe472c873a8c22", - "65468e30d846d52cd0c2f4018ce39317e86303295b241414c0a3e9e201bd3f36", - "d8ee759cb6905ce0a835836539f9a9d7f492f38bd66c2a643a9e29bd3a5f5929", - "b460ceae9da57abc4185a1f21874b7b1f90c620ca4338292eb6b279b61522f03", - "2f9e4d7eb9015dc6a4a52ddb2bdb9649be4ec9041ed88f288a5c14bedb6b3bf4", - "b84905a6f3fa413a26881d46103d6557b90c6521d3978de70ed1ed9b55bb15c8", - "811e953cc50c57a2769336ff4a56d029051d56acccdbeab1b0c3aabf6ba34ba2", - "a430a4a2ecbecbd6cfbd2b067ada3c0dd080cac2d1eac3d1c8662e130c0b927b", - "eb02d992f4f2b6a638d21b6aadce748150dca5520ea57a6183a4c52fe103d4f8", - "cf3b224d8ccd6915513a722cfa96c77bb5025ddae1c85b906239fe157c8c6b7d", - "aac711ef774fb90cfc3f1c12abb411fcc9f0b15f2801dbddea2767e6fb394270", - "c573ed1a8af27fa1efbec104ffb6f5cf18c290b0277b7ae10146733f028f4ca3", - "55e379c742f5022bb3b6bf374a88d85c338576d1b29de6590cb256b0c9c48b6f", - "d6b289716bdf2de4d9c6eba6b8f14b85eb3b800f5fb176c2afd88a51f5a0feb8", - "1dbf6f6c6442d01fc2aa23b3ade215eabcab35db1e5444ee8426fdb9eab94ee1", - "697c002adc3939a05e303137aaa399e222bf9b4d860441a1adf459822e9ab2ab", - "02886872e2c623e105e6ea2c82df177a48dd1f5baedc34abdc998db7bd76188f", - "44d77f71d5f7ee7418f87c78c5e31fa67cb6015bac519fb8d9ecc0b824f0f581", - "3c9ad8a116bedcaed5e81954ca343565e8adbddb76b94fe84f647cc5dad36661", - "3a5cded4b398186e34c2190a33ebec0880160d9ff3ee2f6204fc39186b75f02a", - "2ced5d89f7ff20ecc34eb1aebde4dc3fa86c1ac7d8502a29787cb64997c44953", - "08c891d3c829ed99e513a794a559bafed6d7a5260952a2f4f28c410988137f9f", - "56929ce6523a9d578b22ba83514661f2ce9717567c145cf16d5eae11338346de", - "98baa599f74d71a40a501865d1f6c6f714f0874be5c7ed8a6b78fdac386e5e26", - "13525cd4f70cdc43e6c4ce0b3f2d5d73a8f369946c1deffac53f1659ace9b396", - "943bb5a53c81bb685bedb769de2083918b694c2bb3bd90974b6519491ca77f95", - "c0afea51b246744676bad683ee11f7a93709d8c7cfc114bfb66e0d19394eccfc", - "7dfc47775cd2c79011b9a7aba0db7791e2a53bf810c1285063d074d615eb3931", - "2a153d040d010ede4f6a963fba4348b22292514363b3d47387835f277a54ecac", - "b37bb80aa76f35ff230799dd16aea80c4ddcd4e6a52d57fdacf694b6d5e93e43", - "c6b61f21671f03c0c91cbfc16f030ce2427b892a741ff170ef59cc672fe70d19", - "466a989417fa21a36299c6ee6d276f6a7d1af1bb05954ecc7375391ad47dc527", - "b946f3dc0d7112d7a0b94dcc472b983715602f3aee6f491d3ab9d1f492fd06a2", - "b25743434826c5e1aabef8be60e8f8c322ed2121ee6c151045e3a73ee2756e33", - "f80ec45e19fa6f5c1ef408e0c4f7bd7285658e60c16253e681e9fd4602aa82f6", - "60c61c410624e646d477212fc90b79db5c35633e496da57ed511cb82884517f6", - "77c0dc1c5d4bba6617d8deb3250b3fb37dee045e5563ab502f189d3b80058d6c", - "48f51000d370340b401c0c499fda0060f5f2ef93b70a5dd226dadcfad1c777d2", - "909ccedd284807e6a0e1e6f68b370c0df17be07dc4194b532ea89bee5951991a", - "8889691e1193f697973b98401d2c6434331b3057c906628bd24b358ae55c0414", - "804e9bc4567d99405b92900ed31cf54258cd99bc4bb4717bb47ee35ffa71f033", - "86550875bb72170fe4e5dea7141e86ea756389e9a02d9534492ed705d5b26508", - "61b30ae66f48a128442f9c725021ff23ab4d5bf2dafd84858ea6499fc5ef642e", - "43e07687d1d49e3f729467103ea3585fb35fdc6df08a2145b23a12e86b1d5fa2", - "2d490a9b1249236dbc35752106d9d98e29478730e2871747c31537fbb1c70924", - "a0de39558b21bfe6dd2b34b866c31e3c9229ee453026367074bb404f770da80a", - "7cd0442af3c262902c74bca185bcd99033509120206b8f7cb03cb0c541d6e9a3", - "b83d5462e87a8ce77d9f4d520c439da57020db17fdafbd472bb9c4fb852473a4", - "da21b01c63522c8a0ad6231e4c3d7ce96af439ad128a8831bc81e99f34999f45", - "5686c78e696ef650a4598330b0867a7c7dddf953032d8fef9eef858483b0cbd5", - "3685ebad794d5035572e2e6e142e6cfaa6b0855af692108ba9a8782b81d447c5", - "f0461e461132e6e55c0133c078d67028f004a03fe901203bc6bf366940098e4d", - "28a89dd4106632c0d0a1c36714f5ad55424b9ddca09511cb1865c2fd0efd71bb", - "5060f9442a75cc610f6dcb108f7d3c373df8c6192e50320842c1f91a015890da", - "d71301ddf68c5c9710bf983f48b397f43e4e01773b102caa2f1b5b17f1b33a3e", - "f05ca2cca73d03d38dc677507ccffed757bd533a9310fe51c01e96b2b3a7d903", - "80369a906660976a9e875940b56ab8e04df272f5bb1aa3ddfe1962c33caef97b", - "07faf4f0508e3eeb42e7c98e55f289e3afede628432f022f0e3158c39039b358", - "d83e5461bba8c7e16617a7deab1e6dd663c797c745df18b229866f82114cf552", - "4169273d7f5008a3b9098263f01b11a5c7fb2731ef534dcacfb5a0fb1472d193", - "0870dd3514c60d7ab54537d36ee47f1ac6fe2cb089e42bedaba1ff843bf71cdb", - "52c41708408cacf1d21c4b8f2a8806a855f6f5a960cac65cebc6044563c38732", - "1d4f937c2ba2708937ae3043fad41aa10af635b5729fb4dd80db7dda0809199b", - "482bfaa75dbe9eaaeb6cf3848df68e6d4d4dcbc938e82d3d9b6ead2738535f1c", - "8db5abed744fba3b74af08149609040c68b9db052e2ea6ed04b82197969314bc", - "4263cb0c338f104284bbdd52d93e69b30eef5eb0f1708ccf9ea132dc19ce7ea1", - "5e7913ac054c5ff4369da3fffb8e02dd91902b4f8b0ad55b54ec8560d8328c2f", - "191e5371e7b7dbeed7771e4345524a7151312e5adf1179130144605223eb43ae", - "c4d17fd9c1d52eefa94d4024fca9bf98fb330df8c0fee10fcbe609bbaad45060", - "613b00146d5def0f12d3b180e587d1b4345b1227c055c4d65de5a476e3025cdc", - "fc7623111030511aed51949b723e17adeca166a3ee4f1d52b58f8eee23600e45", - "53d09e5191988a5288570791d42649a8cabbc253574bbc926877cdab9ffebb5d", - "a200913fb1e3d1757c64257abb0b0beba7eaf7519498f82df4bcff9827acd440", - "3133273add8479303a5c7205377d021ee2b13f1d2258c951f68630dad30c4595", - "009f1f4782985f7e8d1e3b9d87e66aaf7cbb969b592530eda3e58c888c706724", - "433b910583f74d1a0b06dcb4fafd9a28f9a7f4f421fd1c96c3d7551cb13f319d", - "7934825befbc2cc81504b9a4e55b2cd3cf7d9214e2dcb378c8b6ccfcd969f8c5", - "bec87d8b921ae73064820614de0ef63d2cf2a2111654ba651fdcc675c9090287", - "d3e38d702731f33b641b11dfabf036d13e00ce96e24150676c34027d72f2191f", - "9d3af5ed75a1e066bfc6feef0727cfc4c15d144a49ef30efa5f498a797ebb5ee", - "89b9b05e6dbd3fc9797b8ffcc320579f81bdde564c3c5f307707b307a2ec482d", - "2a1e40ae60294fa8e1fe578c8fe2dd9777a2b7325b632a53d522e9c7f280322e", - "244537b08e3f16e520cc939df9d976939b4c44878912991ee3db3b04d8b09c3c", - "dd8d9121c02dd7a26d81fe7179e7b5a4d20256684f09f8447f33e0a96f9da4c8", - "e943074bd5f50b3c31ec9e80da917147e02e4515b347840ce3cf0ad40f839758", - "dbbc5988be3fe07b179d1364dda6938cb8bc464e3183caf9287bee8fb62230f8", - "7f820b0ce9ddb02a69779abbb894f3a24d037b8093016bce6623a35bbbe1a745", - "f9461758dbe483010c778ed1a2e406f3e5c3cc28e116e74d6d744dd1f57a0fcb", - "56c454a8a16df9ff2590209ea281ef1cd0e8f4ef652198e7eecd2cfb5a4d577a", - "a8fd83dcf2f46d536770b5935a6b4349308121e0c3eb8154d4bd1d08903ec95d", - "391d80c5aeb885c425ed08554f59f749040796dbe74aa91c3e35cf26bff815af", - "c7da04a1e83fc99dcb05d22ee4df40b783201e2af495ce237a5e9deb56893d11", - "4c57c12d13dce428cf548f659b64b64804e4ea5a14b2e49ab3182c205a3d6aa3", - "62f1af6c6d3b9a098eb93b7f75626d5003a6fa3fb4b9a6f3109b37fad506c37b", - "28809dc614a8b5b4ec96f1a81f601d797b9f7eea991f9737cbd3d3c171cce000", - "b04d2a5947946c27a9eb58b498e1b65c803b2979f05d8d420701593c1533d5de", - "309f943c48bdc7c833db8bcbcc219015e4308b9849fcd774d143ca13a76d1bc3", - "3fd4072d0b9f53a74be4acefe37b194dfcc45e74d8cc20a613f6ce23598fb8fa", - "b7e2a0e6404469bf73d861b5bb3f0d5f7d713b61f6da09fa7198dc47228a59a8", - "23df38c72d9db8aff8e39ad89423f9ae56dc42670da3b0485b6c60b08e9b8d1c", - "929c51d7bc25076529d208190f5a46edf184dfa1fe637b4ff097ba7e73339962", - "74aa427899ecb53f6bb6b3de83f571dc0a3d59a651e66c1ef4ae1a7658ce78d4", - "b9d34445bf6a87868d7e88a4ffe04e93fd4db1ba4ca6cf937c4dac86944793d8", - "f7a47704c4dfa04b5287cee88c1a8b7c4421b748114ea7b0dd6d87924fb088d4", - "82810eb46d7759f1a95fb747038a35ea4373e912c82883d92478c4bbc60ee7d5", - "63f2d869def8549e1919b5565143731e68c9419b26198424c6dabb28ca86943d", - "f1f13349b5c947abfdae0a46821dcde6d2413c974aa481c3c3999414c1bded09", - "f9c3928a3e6d5e3cae94ecac20ad374fb65a72fb0261eedeb8c2c281d69184c2", - "c5bf8ba35b0020643138e006486a4597925ae4735a30f20ea9eeb26502653deb", - "3d359cf440e12712b4429eebc5673b5d762c3a544cb8328dcc5ceb79229c0285", - "b46f91ba124d8e0706d5e4240ec6cb70e38d855722b2facf5234ffdc1e1edd1c", - "d2bdbc173125486d6d088103687ba6fd173b1cd6ed765f0821571af35e07029a", - "3e728eb40a4cd2370f39eb438e7b03ac1672f02c5e7ec16efc1207380d5ae7e2", - "8548a9f9b74c55656a049cac5c09aa8eb8fc30ea597e15433a00f5a4029f0df0", - "c7bb87ae1fb8c165dce7c8ec810b9c9a25ddb7cacb43763b2132e0c5a25a9bcc", - "a0b745d3e09bc72c522b6cd774cca90ca553d32980ad1d34c8428ee5dbc53c90", - "3c0c501537f43f05abffff598256539fa83da20ae93ff810c533a1167c7a9972", - "5c0f5dbf8c2c1a484d9a37920e6c756c0845de74376fc49c28c590e714f07742", - "c67d943a67c8d9de8786ca3f4222cb4634e6ea198dd398346c1f0950e6501a1d", - "9b405c8fdbf6c51df8613269ee0c36d54b1e9491a063daf89fc41157aee2b0b9", - "435d1f3e8d94fd795f30aa2a92b71f1c5d35f821388e1a075bc94e15bfbe6a1b", - "848dcc883f3d6ba399c1d2d2f9aa9a7ea912bf745528c123a7373533e1139c16", - "8502a6f99ff74e854284a8cfdc4d9346a3386287e5e1504b1d19680d7f2cc78a", - "27fd747c872654b72afd80c899fd00919f0cf26841dba446516f7ed6be0d9e8f", - "a1e9282077267aa873c53fd6531bea9662f07027973b28374848ad89e5fb9a0c", - "5762c305485ecef1037e0595c179dffa1dfa6136b34405c90933fea553fa7cda", - "21edf291a4391b56221863cd8158caebe5ad25d57866f6efcaaefc2bd26be25a", - "ec5fe5f5ce360b836cd6ca353a30088c244f27788c5459ab3ce7116a7c2e2268", - "a57fe2b295158ae16d867df39499491476e0099d81a9a94661ae4c8bb41c3813", - "f040d5081e661f6d6d74cce964d517cf4880bc17192ff85230b74b10b20af6f3", - "1f21b316c7dbab4274c64bbba987209ae2f82df505426e5466881c61c71abdaf", - "3dd3aefab2830ce691deb58e2c31a92b0cd0adfd98c5103a6e09d346e802a21a", - "fa4556d45cc219e15466948bcf0d4ca085ad22084e51e8c88f29c83ace8d121c", - "b2358f0053e99f7fb0d5094a91c153176c730837e8df6c0f61df721bccf19a57", - "ec7ebbffc4e8d765ac17cdd134bfdb5160cae0f15547141c16df6f8da64b6d81", - "95fc371d8d9f6aaedaa78c87f659eefed9ecc5052eee159717185698f97bb5b9", - "524114f580086a55a71de604a755e6405e7e318e89804477c464ab6067d0b2b8", - "cb0eda41cbc779afb6ba8cae23589104cd6147ac92c8bcee40b9f9caf51af457", - "06fd97515f8fc0acde7b82fd75b6ecb1ee6d07adb618e0c8f3350af98e82be6e", - "34d1da2179927d72769181b8b445612396fdefe6e3025738f34145ee4bafa8a4", - "ce2a791e265feb365792beb385cfeb6559e6382b2fae3ee9942ab869a2f2104e", - "39801c3d63b67480cf5e26f38207b50d9ea7bb038a50fb557d8aa34c4a73f0be", - "2d1d3832abc67268e0cce37bb9833b22f24bc20bc04cee0defe1610d98527e93", - "95962133dab19864555b70aae297eaa5b81887fa4cced74a982fef592009053d", - "45adcd1df3e42727521fe9f38445b9ba9b9de73f98b3d0cc421eae5ceda96b4d", - "fe0fb0b71b1ae969f005b57fba27680fb2ed73a0767e3ecd59e471b8b3bc2a8a", - "5eefd033b267acb6ed791090ea3886bd500f91720d1c292305f2e49acfedf440", - "c9eaf15952d4c2883e853f327cb140a39956b22d121bdda9210dd7023d2cced8", - "29d4084ab775070e4f521817e7779ccbcea2c95a032dfe187c0f0960aecc77fa", - "ad8506b5f2887c3e0807d3bd17faddb83d05e918893afad26df2eb2832905b9b", - "2491f53d9ab72b06b0a0889e75a6d54a330bb7f8657bc89ad576a9a552ffa587", - "411ec12a116fd0d7649a0a999babe6f1e48d3943448770eb8fa2fdcbffb3e4df", - "bded8bf35c2873301841d8783f8b91d7231a4d543ee1b86e9cdfedae3664a594", - "f81058ffe19eece621c445578beb210419a34181704d259e64775f90712b4ed0", - "e9021b0ebebddc86d336e5b44f10d9e1108d9cf13648d8a2a57f64bbcea878d2", - "7bda4277ca49bc229380fde4536b5393231c3da00a6e06d1a68caf79316eb4e7", - "0c04365ab812da9846e6dfbb59a6cb89871347bfd0bf45ba2ee810ea1b2f4818", - "0554af9130fb7847e3f97e2a1be963dbb5577370262aad3efc601b1b2f2e1ab0", - "e1e231c97c2a5ae0a276f43e68a8ea15ca5703bf091bb7f7883b2b2abfc0f8c4", - "b6f4f8d013af949cd90c78cdc332a0fb1c1c6da1c29ddb9a96cfaa5b08c858d2", - "0919491b013110984c10b13dcdd92709b9d2b463acee544ecaef155df9bc34d2", - "7bbc5cd2f05e6a6169805e137fa13fadf929d74387d702b21f96c55b7a94726e", - "92f4a488cb8041bc2e71b33a0bcddedad6822ee335a0dacea214b7468993d64e", - "0ed4d71e4d00f73c99147ed4d0a46d7a0aaee8a8760d4ebb4d649b84c4740a15", - "c920bdbd0643811fce6a1b0d4f9412e60aff6774749f667f9e647be0d04567b3", - "4481a27d682572d1463d7e76fae4217ccf1ccbcfe55c664c81bbf99f5de3434d", - "dd132efd1bdeda42d6482d96985a16e349a4e4870041dd8d5fff6686b571dae2", - "58f3af50a02306bed791c60c26552ff3520ee37fb58302d7e3152d4791a5f01e", - "06e4c22e9d6ef7477cfe1274031d5fbf75e4da2af28e4449e6d082a92793c41c", - "70ccc3d96ab8c518328c0c8f184dc476a13da25536683516b600d6055aa803f5", - "734471bd26548766dac6d33ddff70e4bfb12d60fce3e643e93f74f393d096b03", - "20cc70af77cbfd8fa162584c63e9b3c6b57ec004712af77bcc28bb96a4b25feb", - "5518b5ee65bc8ce925c5be133d63942ff1625d4de2ee57c0a1a17822296b2bd1", - "49665002ac27f57e6439d9615fdc387a91c04369315e0c93a229b13a3346e9e0", - "254cfe890db3533c91347f4648db81f8c4f3196288fd28f50cc2e32d0a1aa7a4", - "085ce46cdb482f6b319e54f727b6c8ceb6d272ed0d5e3ec81f6cc46d7cfd2777", - "b655daeb931a221b8159aa72a3d30d2a1a7a33b9a68e59f8fbaac6931681496a", - "0bb20f88b1cc53852895896e677bb846692e15f5a2e6ad916a34540ade2ba13d", - "5ea854417c50f34c905136fbf1c50e7bcc7e30d757fff6e931287b9c45feaf4e", - "d33d9c90f65702d2d292d1444c6c57617e6cbc1649f57a23b186f522385a9485", - "6f48de7d9622c14319437106935ad2f2767dfd6d26039ff13514537305989659", - "187f80bb8a8dff0286cec0d656321f92820557c987fc5a8932e837c449edbbc7", - "2698dccbeaca960ce0b6931108917c11a4ca3d19536ec6ad51932de46bcc83e7", - "0f97c26209bd0548e110a099f2ba5828a002d8504bed61586c191711827076f1", - "14e365151dd52ef1af6569a7f6a25b04c7ee22d626570e19a3827b494172677b", - "46d71cab49e5b8e5d1f4fd6a8fb5ebfa0718a5c5ffbfde777e040541060ae95c", - "94dedf8b2cc51d910e7645f0107fe27c58dced2f396822618bdc19d869ba6958", - "70284d32b727939b0de518beeae147addd0cf383318a1f534a7ba8abc30f5a7e", - "a45626c774df2b8eb885840f607029cc9cb23f4849dff394b56a3e2aa457b7b3", - "5e940201ae7b1095ecfe46ce74f7991afb0a4730f273da2de2295e9d4e970be1", - "41efda396fffe893509de562fb83d941ec21a496b13530c1dce8d166c138d03f", - "09a812a4f7718a14fd6d112d7709531c817d2cb533e51fe9c9f9673b9b6cf627", - "7b69373b559cd0745c35d4372280d07381e2977036c064cdbfb6b0967e341724", - "06731257539225ecd399bb2a71eea1e5079048bb60385a84df0fb35284d69f40", - "1814928cc579e18913a9d04b03fadd1e96406c8e96d23bf98cd9e647cdd3b732", - "c28022da31af10211ecbcdcbf9e9c28906108295fffe10675b639569c483e980", - "b59e2eec52741d08f79a570421d59330e1697b3f47544e642e8076c6abf360d1", - "0e294fbe18ae851e111191a2ec33e1b028e7b7ec3ac2f45ff200b16f73057b30", - "2c6372a85051bdad54f135c875725d8b872cf6bc817f2a5352af9db2fb275e01", - "1531bd673d6d55ac2b7d9b33b9cf7af1bfd7faec9d5d2d4cf8df2ec7f2f900dd", - "d97d87238c9f1bb4bcd38bf4cdae27eeb20afcf5bd07f2fcb39e03ef054c76ba", - "08fac777a04632275eb19aa8e4dc99550ea1b75f4d23b48a30cb0af77c68953a", - "ee2e8623e2d108f43bbe080d80685226d6a29fb75cf510263ccb138d81a429ce", - "0928765e1fd23092c3b45a980d33afed4766e5f574c37c2d7f92f844965a62b9", - "f447488fa883146c5f15de6defa6aea30fa048c1b855b7928e76fd0003bacde2", - "922717cfcb90887291fdfdb1c1775cb9a4973aafdf7bb3fc425a4154036bd9ed", - "762915369f29519b36c600b2d4ac5a004b48a7d96661d4ccc84f033ee103a2d3", - "f7246404806ef48c9d8e0396b5fe59039be8acfe94893d9eaf3353601c55a8ab", - "27b2bc35290c9057b1e524e63d885070e712cf76911b522cf9558f01a5f5bfad", - "72d78a7662bf53c3926dafc03c6ebcecefb03311b0f8a6829e2913fdb2d18c24", - "88c2dfcd247aceb0014bc868f949432430e7ed14e473a20ec2ee0a5caf7ccc5b", - "bf02aaa2a2f938e12ae15039980728948f37ddf612f15e9cc0ea9476440381fc", - "c09f0d1398f7347065d242c720b5f33e4319dc626e018250a68c63b0b68b41d3", - "d20a58e941a88d9e871447ba585cc39c34a2dc3141f781285639b5bbf4f9ac73", - "b52a0ee7b9c2345d322174f266b1754c3e80ad36bc08632b624b86e1181d7acf", - "311f50735405c3449b1a656f375adfc135c68097779bd99eeabdb7177af0d6c9", - "e389c61de93fce6b0f464738b84571912b7fefae639e5da2198529b8f4e67e5a", - "459f85b0801874dfdecedde797b76021a37074ce56abcb8fc348018b382a4839", - "ef130c09172b4a7eb87fba4ada379d2176411e1dde0bdc6fa9f969be576af731", - "71940925090f52741f4424601956ae8200dbd771bb40357768e96fde463a8599", - "0d3f343079df5d0e7d1e10d6e08f4ce7678ff8b6cf364219c806ae7d616260ce", - "ce1ffbf3332d6d6d26cf01f0b5107a7e7737375c0d193baa4ca41cb69557112b", - "7e06385bbbdb11a0f3bf8bd4925cccd4f5715521534bf3764682ec5b7815f835", - "17dbe8742e5c56fb56098e340614499c9eda08a8b047b585d1fe6366281f79c2", - "d7e8d8dece5eddb03c1b63361065de82ed0e061fad80d4069b1db62f0517a035", - "396c14bc4b096d4b8df28140d7311decff144cc59c1c45c5c1a6d9d0caddf437", - "b46963b870a86306bbbc4b2dbd6610886f393a3bcee3236f25d9a0b22efb8c23", - "dbf297977db77835e7276e8ff16b45510331c9efc91d841b20b0bda8735e4c93", - "b2731e25a33c8730147461a6b07c9f691bb426abaaf902ae1fac3d12a9f31c8d", - "b4d47459381b30eec033f8f42dffe57351bac191fee8720c9d74590fea983e16", - "08a16fc669dec232cb7d3286998da9396fe7c0fede127c8a9240d9e09d5d1d8d", - "7f4384ca8f6481c689bce609d19d58247074b81c806736eb03a39c6acd0bef67", - "459f138708e149e93e2054f7af9861a6d5247d356059ac0f5b774bc7c977304e", - "c6859420db6efbd9d68060de490bcd569b0e31b638608ad806a6f4d5a49d9d3b", - "66d7165ba9b3ca63becd2dfb4b2734486f1c69bc13fac26dc5e39ab5271bfaf2", - "380bba54d9f3ad893bb9c4ff80680b5abf6c8e1b6d606b36dc0ecd856a8494cd", - "560c03d09bdd86010af6376ef2ea3c884d7c2af91719fdf72383178a1ce42aa9", - "7cdf0dc92d38a519943413ba0758f06bbe636a1af1e3b4034ac031e023be8ce4", - "9181aae1e3523be2210801dacc66b7ef5282ae074f91100e3b53353beb07b4fa", - "94a108d4b1950668d41e3c58e106010a33e197c1394e3aa216de941ab5528302", - "c70509a5db54d7797aa36a44b14e0347751b71808b8788648444964db6dcde2d", - "a2fa19d4d0fe3f6997c4ee912eef957c796672af9fc7e083755358d23b2a8f3b", - "ec2f2b7578459b571c24d81759cf5fb4294f52b58d89046cc4f97dfd2db54d4f", - "c06b9c6cd424adfd5ae7851691c1210e50c75fdbca87192f1c3b2af7363952d2", - "158d63445b3240cea00a4ed40a1e78371ecf444a16e959a3f2692572de854ba5", - "a3752755d93be2aa7716875c67d33b7f4273ea6abfae597813c2e3939c359184", - "d93ac1c4d9825b6e73f1d50a1ecf818241d2f9fafe34943ad2869a85fa93d5df", - "95d3ad3cc033b24f1d2e444aaa2bc860e3c848c8d076f6801006870038de35b3", - "2882ee97f8edd5a1a5f41f4d6943a5ed0b29838f95ac4478ba392b494d61b3cd", - "91526fe132ceda5c40b5580a33f38214ee4fcb3cf77e9940762b903eda0ba6d5", - "9df5488068816e878d4c33db157622f27e4346d05eef779e5da11e459f939e32", - "05c253b2735f3fd57d7220bd5de0c9443acfd494ca9b325472f827ff505482b8", - "ff0af80069d94ee5f61ad0bb91f5242cb715c09ce4da21d3760d89a879706924", - "692f4eb24732eb4ec347753ebb0f9a0c3a7d05b2530855cc6009f151a680648b", - "87da6f6d010990ac6d2478f7c2016f04701dd66627c03717e71be6dde4e4284d", - "6012e299421e2f21b7236c4b6bbdc56d2cd01b026b6c0de54afc013e7cd901cc", - "59dfc70ce321499fd32df074960028267cd7605675c3242ddd7117fbcdd6f9e0", - "03c7f39ddb8d777c5daa5ddea620e433a645d702da25723bd3c92ac54eec84fa", - "96659f8933b59ca792fda41a86c1ba0d81086ed752776caed75a610d0da69254", - "d61eb0e38e8dafe521252fd170043b5113337712cef9f4c29a9895ae24ece296", - "c22aad5ba522aec8414582aef23fd90b78b56cbc9d15eb5880e7ec693c82cfa2", - "eb1a573fcf74356f0459121c22c970055b252409d37d823a3d2b83595de4af66", - "351795599a0b58c05683388631f6e71179298f317b300e99c990bbd5e421f285", - "4ebc7c7c6081671b9e9f02bbce781d4e33e72b25086c08fb5cec0f05d934faec", - "48e2ce7c98a60d532744bb2f5945a350c450de809e409218c77839077d2ff4a6", - "da21384cf33ce1d61aa81fbd4254330515709b377f5ba1abbe5ea3e6b414e3e3", - "182c9afb3ce98f053aa3c31d24af402b432b0f90e63c3e3ce19d67a368b346b8", - "85c246e7eb007ff2d24400bb067a9156355e3fc7a7b1509d013a3f32c220ab9a", - "38705f56c788d2af344fca241aec17857d6f5f57b5435d4fd6d945a01555e7d4", - "99f0d311bab63998fb1c4d4fc931a0b51576ae17bac12fd95f562b57106bf719", - "8c7b27a2178dd1dcc8dd05e5e4dd9d52dac08fa45adec9463e1f433bc3a4cb98", - "466e7dc13e82930e0aa1aa1b42bedc559c64d020a17426012eb64b2915e27e5c", - "5c6bc67f9a5a90d65392ecdf48c95e9617072699573d29d063266d3661274adb", - "64da77a603ef8f801cba1f67270e4968d55541429b43c012fb1a8fc59c50cbea", - "1397d157b8e440ef79e88c5e524cddef05a28a51fdd900cb2d3038f42f9b8919", - "2da7a954640fd0143066706f3c4c24f91f866e235c132c56622fed15a32d61c1", - "da6703c563908d95b2c4d233fea25b9179799d74c91915cc83e9f142a4bdd5e5", - "5bb30205d621279245bd001e742965a77241d62da6cc6316b1b169289b1dd1ff", - "6a804f9136aa4bd9d58307bc30fbf10ceacf5160f63408500fb243bad2075ecf", - "b0b532b194298ae19ce3a804b12d8da8b7acc47a5d38c47b44e8d184ef8a7409", - "451db0cb22480f9b60456843b90369728cca26f141f33adb8a8195576976b133", - "07572503d23319ef629b411aae5c94aacec5044fd3e431161a502c137bf6a79b", - "27c09a79e5b6783f94117ef2e6c14f70b140d2e15e551817e5d00536375d4554", - "044abbd2b1a1c988f5472e5b47343d7addce6daed67fdf2468a7aba64d756c55", - "a20a3dbecc03fe90a20a2d69adae149a2a57621fbc766fc74a69f0bcd8f8adf1", - "b5dff540d4cf9af582705781e7f5e0fc9f698476f2a0f8f26ee5436bb2754c36", - "869de6c0e115497559bc3cfc00a53f7ea2a589fcf63f6be805e1881a4accb858", - "a1e2272cf026333bb6cf35c04b11ee7f0efe2f18e81649537304ad598c64970e", - "2ad02aae36c03fbd9e10bc26e3fbe4771d1487e8304ce5f98bbb72bad51b24d9", - "ec86fdebccfcb747f15d934e7467bf6880ad5154efcb6eb8c7923d9f57a08f2d", - "754ec9a6bfd014b8c952d5a6ab8db5a32645a2125eb6b3c23cfd9fd15d5dac99", - "bf4caba19205c1f2b5a6c66d1ea67b7983f5edb39ea720b950483d79a0d57646", - "d6ab173a12d907aea54d46184a98701b4a24d0edbc1356dfb91f7ad21bcff0f6", - "76f29f1f1585fb9d9ae8721657d18294abb5494f0af10f47452a854daaf88818", - "65a435e0367fefffd220c28fb15228d5dc87a0a71b66d786c5218afb273498dd", - "2548b33e8d4924e54696f5da68bd8f2ed5f61aa54068d0cd6ee045f2264cd36b", - "302ed607fecb57c495e33ba1e9c5d5bc3d4009315f8d7f6b7244ea0909567d72", - "c2646b2d83458d1f8e026f70799d563c8406813a7104c4e6329968def310b32a", - "43ae81169e9ab1cedb9fb5c5d95271a424ffa083be7151b20a4e0069275ad8f2", - "58cabe80a79f9b6a190f475ae73afe31a6dd3e8e704f84051831352fe012bd85", - "4cfbeb6d95b5971a5190d1463e52efa034efb8cadefacd081991a2cb5597651d", - "7abacc0cd09214fdb5f970d43dba2a418201a84df0bd20df28ddd3c4ee242511", - "53cd23b863732d679199a0e7257c18428e9d5ed4b718cfe66177e4ca4d214c8c", - "5252026996cbca0ec2ca154954296aa82232b9a26cbfe9d873fbd5d5b3981ca1", - "e1a5ccd67d5244f4df14ce5a438a3ad0adb7d4f6b334f2c7290248dba7b13d33", - "23f3729734361dd6f64ec86892394b2665ba132eaa316222449c348a2e725369", - "94c6234fe80a805cc061419b694fa43d708443348ac63020e1558360d6965aac", - "30142e70f008122213da6a22e629c697995383db8a1097fed15fac9c2c790266", - "e1bc18fe9e6fcf601d0b3872f83f3a3c1ea39b9ae4c692feb41542fb743f457f", - "1fe5aca66ffd0fbfd32533614169fc4fc349c9936c065602620599523181b6a3", - "ab4f53aa745538adb6ac8cca9baf10eb23915d58d9c72a71ef7da567ca94ea63", - "f5dd14c6c26f1a687c53e30d321401a75ac4ce11dba785e5df5db404c874360f", - "555756545e30bc1b721e8951295da6ea56f3135440618af8381a2edd804bb1c8", - "e65309b1755de21c9b23f4410dffaf046d1e05e77a7a4d8c618bfe751e1c954e", - "551bfa4d5869cbd7f74f0a67f7dda04e84c642592c2eb66075cd49379b4bb1ac", - "37faa9ae68f58802ce24051a411c548b6ef29383436cfc42e768b3817e4be199", - "9f7e2a5381deb9e870497fba556ee88200497e138055cccdb964c3ea4f8e3955", - "56197c81d5ff95725c4fbbda28b147722cc75c02dd34ac9a31028bbae25d9460", - "dcc34f5a56ebeb577c57685a3150120d937e4aac0860a7a71a308d55feced2ed", - "d56ba2a88b4c42b89827b7d7da3cd92315c880b4d997dbaed860226890564cf3", - "aa5031c3c47e3403da08c89efe542b195869e60f7eef1164aaefc9d507ff2dfb", - "e44f9df45f63212a6dce1521933dca4592864b72b890a7d1a3e9e5b085042a33", - "0f1f2f06000f4e2c3cffd5c55218d5089a760d3662375bed3efee55a37261855", - "a8f5b52766f5c9a70092d094c7dd1f06b976502e7dfb4fcbb706dada3353c308", - "5b8566017237f036eefc0d4f1a9125ebe5aa003cab3111d2def8c47228327ca4", - "c8b42cdc39688c3328b3cc7bb9b6d152fde16a3a6e4db015dd4b260e4093d71c", - "b243b9b2646810ceaee0ccd8406f2399e4967f58a3cdbd2dacfedd5ff17c1009", - "9b56df6b1c17c84d044c6ba31b416a0105c1fa5d62433ab2653f721a6996ec57", - "12621e5e11bc5eb9c7f5d4e70c4d614fe392423e7098db4d06b37d78e7bbac03", - "881cfb51c055e603a4f2d6ef33a49e11770c7a3a1f0066353cca09bd9140bd9a", - "46a9a6e88d55c18a821fd5cc2e624aa7bc50b833e42b31be7234a731e45c22e9", - "51f4617ccbb76cf1472623b5aa112f2f83288eb64ae335d68748f162c82f7365", - "603b767a3a46287d6edb7815affd601c6c2de9d6b306f859606e037f23a475d6", - "3cf746987eebff9c8cdcf9b73feb03918d98e6be4471d55469bfe7e532abc52b", - "1f5e60bd6f72441e62a946d546f4cf2e1f05aced03cf05a798a0111bf69606e7", - "01d1b145c89019936afeb6c107bf245e225d2435c71c9e59a0ab044907979a1d", - "e4221794afc13bc7a386aaf2d9c2808c0066cd746c408879d79b2867e398f67b", - "e1493349c2c9c1052e7ebfd471e79d12404b8b9eb7ca38550a1ade39ed90635e", - "ee8bcee5d93a1c006426e6719275fb228fa8e97c4249477d7c4e8bd5884dcac3", - "76c6d8eebee9c40974d21cbdd7a55a1d16100215adfb156366727e6fd4b51868", - "d07a8bb2e3d338bfc6ff560920db327a96c83a70b80682c375c81bf593e8aa9b", - "87adeaa559849fccaaec234c935bdb89c999f0ecc4e81e6cb29f47d9b4c60711", - "4876b1d948fc3bee48aa404020b66b94774482944a8d8e2bdffabb43dbb1e603", - "e88507c8691635768c81514ed8e3fe03f533c5fd64b313c249adcf13e5a30a59", - "702ad74fb0f205c88c04dabd715fb20f174a9777497820e7545cf7056e47c59d", - "70a3bb73c12d10861ff36e424c197a162053d92b997dece8935c956ce36f2cea", - "217f7ef18addbda7a3ba282586f6c08a7fc1bed86757680eb2228036b7d72ab9", - "55b4d919a1217ccd5a30e23b328aaa1bb218a205a65a304b9957e2729d63950a", - "89cbd63325257d137665b366d21cdb766d283c23b2de53a21a60e3cf7a34fd70", - "ff08edf013473ba73e3fce4abd934aa29c52f77b5d37690e7d21758bd0a7feed", - "c64ccfdb2dbc2a6bd366e92d7e9bff70eae7b9030bb587ffc6273f44b515c66a", - "ceccd81fde06ced59851c1e347b2319ce56eff3096f22f3719b69f502fdcae8b", - "18ce522bc1deb6b51228e341361ea497dbb17d9339179c19fcfbb6bfd8b41add", - "3b5913c5ad4a56d37bc3f02e5f7648a350a227bedbc092574715581db6c5bf87", - "9f9351b3fc18bbc3742210d5f2a8aead99600f9197194d29da047cbf3f6a4700", - "98e7768187c5e46de76a45b4aee1ffda2d7326b8d9474531982c11abb40ea1b5", - "4817e896d0f8a7577c7ddfff7c6b52ca134871503dec2869fa9e09ddb556aec3", - "2785420e26c4fc05716f203dad8b6a6fc7964b0edaa94d0a6b241bca5713edf6", - "d027e9b3d7d379a663e5dc24ca8fd7498513472fe843cbbe1a4c87c6cba233bf", - "686d210b982c9a8d7588dba9b26f4ea4222ee09c41ffe9cb714dc6d16d5e4ad2", - "a42ea30afe5c37757cfa2048402a0750c807540f800f77c472e0de483d7eb0a0", - "8d138f37154aea0302e02afce314025e0ffe253f3bacfc0e60eb2e74bfe6a6e6", - "04b41253990c570392fdef13f3fb631a2b4e0facb77739c472776af26d4f7a04", - "b14db97929542689ca79272100db0c957dfaf2f501bfd5b720d5783326e845dc", - "f4d088e44366d9d65d5775f92a41cfe2a9c1e8a3e8edaa0db61b61e6367e0545", - "3e6d2708152549ecaa9c10c6dd1eba1c20b1765069f106aaec19cf656b288fc7", - "2f46c893910d17bc6f93071a8386490cb7b1ceacc218ec09ad073cea54b7bc28", - "2ccf15aaba06330ae936ea518623607098cf9e86ecf8573756099579d041b55c", - "8fec3c2bb71aa534c70732e66490beca1af4503cab55d1addd9f94e97bc5b52e", - "ded09f045109604a84e00332bf513e8be22363cf06cfd943af3dba0ef4f7aade", - "3e67bbf18912040a264b36fbaf2be2baa1c0f30d1bcbc7dda160a494f041b48b", - "6fbb70c8656204475a2c0678879f9e2a6149f531985aadff2e11571943653ad3", - "96a7eaf7ca3810b56e112db7e5013a87dc238663303d884afff7d43b0ecd979b", - "7df47a538127bc3f5e5713c696c0f726d474bafe28a463c6125708c6ba3f24fc", - "3999230a657b6453454e048f88ffe8d75b351836b6543565774100936ef8dd4b", - "31cc6979fbb680620dc16c0e78ed926b3bebed3c6f23a67df62c169eab211b5e", - "26ceeea50d2c2f3b7c67702f7795eac1be6df69fdacaf4a91ff75a9ec5989a07", - "6db8e02d41c866c79bf680920c07cd8f59c691faa3ad74900ed8284fb028e3c7", - "e220a5725bbebcaba37dfe5b8ecd72194ee15fc5b7a73f240d9d6dd79d5ed1c8", - "a9707de8bbe9499098b694e3e2a6c918406be2cc7b42e0c36c949d9d0377ba17", - "a7bdac05b4a1f9241f8ae7b1a1d8b7a1e06f1e5cd2600bbfb40a2ae3ec575a99", - "0bce0f3a76586494aa9279d398aced6b6137c2232f51f4459d9f12bea0f37d70", - "a924fc8bdb4a4e6e195f614270aa58b91186fb2c63edea5c290eac5501178a3c", - "29fdb74a7fda1bb2bfa41a288e086074fb30e93f6aae7a58a8045a81646a49a5", - "9569f849cae2994fbbf2bd687f8a9cd85f48504fac6c2fc5a98df22148dd6edb", - "cc2a0cc66752f491006ec96401c2dd3f0d71633665a4d48c666931d5a2ef4459", - "be19060322ef34527fe6a32cba59951f1474a8884a831d111292cb96292abad8", - "9bed00078446a3fb5400f8bccdf33ffbd9c630f1eda7adff4dcdd76c8ccf298d", - "f0c9f371a2b2030dc1d9a1381b084c73a5c364afc153738b2322fd8d7e16092e", - "00df7e74a06ee58389467f375745335939e4243f46a4e6278081550e03159046", - "9a794808744db16be66ecf590ca042d131393807ecffa86b164367a21b645a7f", - "385580082d349d11c1666addbc5465329d3561f7ba1a441f933289e4bf5d5aa6", - "85b0d1c5939d7b691a0f7b8ef23e404d5f63270456bf9b34217df4d9cfee02f3", - "0a5db5c7774225f058aae9fca645f610a55c69e68a0437c84d62d55a6cb139d6", - "d05b7261d5d38c3114dfa022b071d4001cc9aa896fe3a481698ca4db97dddf34", - "470c42d1c0fad7afb036f2f29415889609ce54003f6d9412c491f7d8442749ac", - "a9133319acd565a75ed930453ad66e8a79bb06c86db5fc715395ebea86bcdb3b", - "6c8f01a3a493510088a1284b7416c53a6c4c6aba4a1a17ff4a9b84218cd684aa", - "d1cc26bbcc8c3e64485974b95a663532dc4df3ede44fc6f75daa1ff63949ae5f", - "822609845d3106e6888849d50f148d6b550556189c4333c20f28ce8c8df98efa", - "e55fb874ad72619f693f0e0de1b85c9adcbbeb86c9210c9c16bc710739446c60", - "510f78417aea2321dd25e2de92f74a06a29f9f1ab214615994849d5cb712a943", - "16dd333d33abf24c7afd0a90a08083279fe2bf3e12f790eb4cbc3c48cbcac7aa", - "e54c3f9d35baf51f4c79f43139039ee213c24545500bd88f2bbeba69e7b33b6a", - "b597932fdde71b7cbc4e31369e7ce7ab45a7147ef3658b84ed1346d785959ab7", - "4a507286d09584d2c79802778b37e6f13a029c6cc5fec98c19208f362e29eaa0", - "1ac669ca25d371b24f1f4d63229e6109bb27f2e7c03e2857f44a0cc14d2f20f5", - "3174c497b282bddcedd7bb2a17fbdfdbf0cbe558e37cae209cae786335d8d2cc", - "b2844566ded0c19242fdbeb7170e5df7e11f15e685f715c7f0f41c1499f3122e", - "16a7b1a08cfda2d317cdacd3dccae14fe263c29fbed8749119155ffd50b99cdf", - "2f3c4b7399ab74b0759251d8bbbb6bd99aaa9061a15d1e1a3c042cd8713324b0", - "8a5def099cf9001d6f8a4a0cc3f7def73dfb3fe00df0ca120425169678e7c7c5", - "c2d2f49781a4857a2a62e81fc9886982f0926c8262f54740d480b6157b804594", - "add4ace0beac3af5a4c7d9e81811a81e46a81baecc38c19dd7ee8cf5b3336ac3", - "73dda39420c79374ac5745696a57af953cffc4ba049c17426959cb8a0369c90c", - "3457c379cd660c7fa76adff5101836802d736a76b6d0981cd1c87fce17d3ff14", - "2334ce97590f86fb6671120df1c7af9a1a35a9861b74cf6b0dcdf9b4b347b554", - "fbc5a334a648bfb4f34537ec512c5cc3cf44b7bca93e7724d6e1cd96987a8a3d", - "91175a86117d9fc38b9ff8ca4fc59a89479ad6f70b199dba5a0c0d4d2bfac834", - "7885e95425b9c3ec770c70597121eca455ab2cdf3b54713df311d63163f4aebd", - "ae0dc238d20334bfed68578cee95487e2498006c27c90b8a83bc3c16fdcbf071", - "326094e7a89a6297b9518cc503bf830d73ec0a90b23cdcede3baf3e447ef70a5", - "72e532f148e21c71932f37f2c86ddfe596b0b64db0a9584532f6ae5b87bd81ec", - "392c5b2abda4c3e725a1d6621ddec7d9687b1ae335ac3f9d3af26ddd9e8d987f", - "042417f81831d8a32e2ae72bd15b6fd1db5f7161ff670a1ca5f447a1e5ccd22a", - "f3756dcfe209cc5b28d24eea04b1a3fd5cf09cdb6e78451fb125e1ba804b1fe3", - "5c0d99fb6f5e32f6bd58424f976b982ab71f9470ebcac818cd5816e7be2d6300", - "71f81fc42f2549db43ad26f2a8f0561d63bf4f79d677b6afdf7706862b3e6a60", - "3a5078d8ff3124d47cd6930b6ac508dc42a7b64ad5dd0e432fb9152a0cc5aebb", - "f9278543be93a0a9590a3fa76c53370a5073108b149c31cc69622e845c8438e0", - "51f16aeea80b91ac1a1c9005051492784bff9359815a2003b210d3771a675cc9", - "bf76c81f4d67780e5c34f8a1ffd16524bff665781dbad52bb1e83019cf31ab21", - "52ba089a0b6e5f3048a12598571a61558de08d0f68798ca88220df0890945b8e", - "f24a8e78e7408edbe9df43094b446894fc4fcdea5b69416e899f763a90922592", - "46c24474f9836eace04803602086800b89ef8b7db93ca24f59aa85975e2537f2", - "1633c6e7f0c1cdde57ad6bf89320693b039539d9877732d8a62967ce55f7cb8a", - "3730bfe586c2ca23703afbc52ba997125b21f110f6e395e78300b61564999b15", - "0fc3537683629e44e2cdb51532c74347b49fe8f1898bdd05209417e9bf5df517", - "afbf9b7569c77914b6bbee9ddc084726da347cb627febb62ccceb25c0b95043d", - "2c04715af0d2f1dec584f830214a4e38aff4d600fd875f7547523e263d6cd508", - "2770527911a57ec70b7ea94cd84dc2d4eadc09c475f6a88c274125b34b2d393d", - "973276333bb02c3e25f3e47eed78326907c637bcd418f36629e15daeb5e2a1a2", - "6f5fccc8db16d524eb23707bf2c6db38be61c7e93b1e91d127becc5aadd5d023", - "e9e06b66df0bbb929989c49bc6b428ac6c0f9e5aaa0272f551bf1eda4b6896a6", - "521ee8ec5c9e9deeac9ddc09548d035032cf9df9722a35958d8f3458b669db66", - "985ba870c6b6ebeafd556a42088cd3c239822f98359d1c3be9369ca7f4b6bd8e", - "2cda722fa8be77a3c9e1f8c5c1eb5028b9056a200b8ee8cc4e60d465b44278a0", - "39b5bfc2a2cd01f943b8125869d51b3ff1f41f84e80f868baa020b9b5b04fcb1", - "00b7816463d102f4b9f66f8a61127f00a34144b9e9dac1d650839dbd468dd92f", - "f84de2362df4e0cface5b5f90724dcdb0e6c629542298d540516ad5967ce03a5", - "b931b5a0538f66dcc082d7f419250f9f850bf871a906cff7a29868526e989daa", - "805a281ab7fbcc9563395ef21aecaa738cdf63b8b1300249d99b8542db730039", - "dca3376463b378a4d26c234284d674a9254320fa10c63cd1c573b8007c771657", - "c6e7dea4b6a501777e784b36048cae9372ef9ac6df5c96b0b31196970c544aa0", - "e2f201d2125fab0bb48cacf3e861cd03232c35fa9a6add56e7dc549148cb0f09", - "409df3ab8ca1379cb0f9d5337485dd1069bc2e38e75beabd72254206f99130bc", - "381d2b3aeba857dff4096f3f3b38a54ef8cbfed085d63bf3ba84bac1b5ae1259", - "9b324a36b44d127d6ed01534cd3ee03a681844f561aaf73b3d0b4e8504c09d50", - "e94947875bf85fb2c35c551ca7278fbd941c9e46b05b9acd79b37859fdd1a571", - "92e0056ec34bfacb886c5808ccf18b0006ce64c943813b5b9a4ec09263c088dd", - "09c581eb0b6607970a753a44e81187d58e92195e2f71afb8e77cacbc46cf7c95", - "2347b4d12686661a639c4830b1931f8694c9c88f8063f47c7ccfbd7bd83de32d", - "a06d6f32939cdd0fcef96cc38db7d8b1886efb5311a49594054c6dac8ffa3029", - "068247fbaca169158c9cb863ae3b106fd88062fde4def51057c9ecb30769acba", - "2694b12df4aef6435f07f98774b545b622a22ff17fa2b349ea46bb317bcbfcba", - "c858762374211854b8d89bd6b72f9054add2f7a9f19f4f020becfb317779a52f", - "5d8db03d663df185e1815779801a2f1de1831a1b7fb00cb30f239306f0ea36ac", - "a9c498e954d2dbf70f9cec6ef8a745020e2d948d6837877a951b6fe0dba25b03", - "de4093b565bf59b67850b58d84b81f4ff85722ab23949b5aece2dfce31111d64", - "94e14d37a7a1120cf8b39b52a728cde4302025fe5c29200bbc7512ca2d4af945", - "4e8d535d2f594ec6e9ebb3002643d0783e835ec1ac27c8c1da36ffe35ac0e253", - "22f4b50ced264a009aca688b6f55619bd07ba517976431f64e25f7e9e9ac16ba", - "25fc62f906bde76aef7c9a7c63c24c3e3146cc528af261cd96f6fbd2068895cb", - "6965dd20e12b74d16d4a53fe08cfceb684498e5be8e4cf6fda42faaac2b82ee7", - "e2df5fdb68c64b19634e684211ca25f05d5ed7a1f0c63d0abec2b26ef091198e", - "7f325ae3d4e3fac252bcc6ad7862c758259326f0b8476f41da15e85a15eed3ff", - "de9c4a9b9b17b1926d3aa8c55feba44642dc01d06862847c0095484d39673a5e", - "2a5c3bac543397d978145c0d37d8edd5943041715bf55dc2f536427dcc8ffec8", - "9e1abdba192005593b7042e2f061e403c27d9ffa95cb981fcdd6d463c4db5781", - "ba1a456ecdc8cfd547d5941edd7b887753972ec8f149e9bc94c39b8c7dab98aa", - "1f618fc1705458e4302337f797cee66f478e426e6f358945243d9aaf3d84f5f0", - "3d45940c21c11b414b069b92bf7260f5d2143f0a92fd347f95819252eb1e5ba6", - "648d96a3a037db36703b980d0b9b503e9f4421bb5d40e2cab27682666cb84715", - "d2885bd92367db436ba55b379b5781776a4663112105153a11929e67cb0d237c", - "d67bed800eda6280449292dae11336bef27f8766d815c54104343e4b1ed57823", - "ef9a467e901a2fd893f79ec049c98661ff20e4d1780d78575bd651614910579d", - "d5bd8aadf4edb8794a73686642292db5220d24421efdfc2fddf8b14be6dad633", - "1dac867ea8753d67ed6a6fb26b909e666abd0af502c0f6bd59c4cf54bcb75db2", - "d09a478c254ba9de9746b14fd48838a07129871e465829bd8bbc9be088c9bb6a", - "98002ca0fb215d0ebcb7c25a20bc42ab74692a579dd5fbc99d97945507f7e1aa", - "a68af97aa3173ec25f46589f2b89242ac1cfe906e2ee165ce3a63f6970695a28", - "0e22b2e7c565e7d2ef252f0bdcc11e6d2a3c81e56c1a8a07e07830e1a43e3fea", - "bda11947d16bd0361d0960fc5a0e082d06ef40eb542ea7dda0d354a59ded9075", - "e2d794ce0c802e60a5cda13910fe3a62e9abe7feaa55e16b1251423fa9078c75", - "8ad00c55a48cb55a09a40da8be630b7242aded29c129e858df9b6ed8f5a78710", - "e14b1b11bbc3c451ebd47e3322a9c32f66ca19709e2789ae39b3f16fd0ee04ca", - "f903e229a7af2435cd5521bcfa73b6a55f04e4e0a6a11d0f7600dfbecd529314", - "4a67cdf37531a5db796aadcd4ac49a8f0b267b1c055d6d9a706b63d5f8bf48df", - "1c8800cb55cf7f7870b3076cfae5adc3bc69d94185d5e284522aa76598bd2550", - "1249dad73ee38eea0002458fe70bd1f4520ad1ce6060b07d88d6be8c47cadd64", - "6f0f4a2650319149bcc555a151ecfb583e881129c262007662e61cff49fa93cc", - "50c02c6fe19001ced5bd5ab5c17ed382090af8555f74ea3cbbd6ee6fbd3cb113", - "503f133d47e66975022cf7d40b41b2f2a81a0c2e2dba7a40210e5e4722a2921e", - "b3e8a85a2c41577de63df82eea6733183aa98407ce7360a4cb7eb236fede7c81", - "b8161d4c3575f1fdfd95db1f04a374868a6ab59c0c322733b22819f5c506447d", - "0d09e8c0b3a681f5aa08a36a5bee4bebea0450d853c92ae6fbcab07a45e0b643", - "49fe27f3d981230922afd0804dcf1d69212c440b1307a63073efb64c422b9b6e", - "4cf88daab11332c38e000f93e6ca85fac593e9800cdc4b33e845e062b73c044a", - "2b507088063903f1a798163121a72918ddb1cea18a6c5fde0df94acd8b68bf04", - "6b9cbc7610b390cb54bd9256d09a3a48ec33d9b62af1af06d8e3d0e37af57413", - "654ed0cb6d73c13b8dba57e21f6bc1ea6aa32f06e32312f0f7c3428b094a332d", - "2629d775e4695bb1debe4de71c1ce250e5d4217166ab4f7b9a49f11315213dbe", - "7064efbbd59c553d163dec019532046aa5f5c455daf09222c25e9e65d8ce354f", - "5db1bbf12ab9c7584c5844b6aec40bfa7802fe0a59c4a9750505171de3610eb3", - "f8250f40436a495d9e8e5b2b739bce27323b3568a723595ae877dbb4e86d6eda", - "4c5e92074f56b16cfaf93a7d6dd1afd6970c7f0825f5c9a587830b29acece356", - "321e2568df116845a7da49561a510957ae3df09b71bee2b1ac6c19d57fea1229", - "6ee2d19f4d953703be3ab97a9899544d253ebb5267b7ea2a4de7b5a10c6e5a59", - "27ed6a653c0494137325d66192022a028aa8068b4beffb7695a96b3aeaa779ca", - "4a3af6843f661f122d7b1552829151c33b408194f32907474630c89f2f2cf414", - "0a187244486db366bb52bc16925b3cf3a95b4d7cbf55a31691b3393738fe5d31", - "05176749768dcbc7db8a363be5b7a867b1351fcbbb232c9657f5f781b8a9e542", - "36f2ca6ba0dd0218dc8824bf3544af8a6ac1b80b9c303af39993e230a7a762d1", - "5684ee0e8260867238b10c673125cf324f66d2e7d05ae7480454debc4ddb6102", - "1cb1faf9b7a4563e9a07a2d62ef768ec1769f8b7d32b9ee70f2f9c4fd66d94de", - "501440a02fa4c6b7e81fc959cca9375319672991d93ef8b99b7790dfe2eade73", - "3b86768b985eb47beecf7e562b36d58c692fc83b10493f3dec4479d4cd772636", - "0d2dcd5a4606db8af62f44f1a1393148aa873077068af45944b71bba2ab23515", - "c2e5190b79506ce5fd0576c5753181842f159a5f805cfb82a8e5e2d742e0e5bb", - "fe288c1642c319164890eedd52f21ef01fd6f3fde8cec76f373a35439a141c50", - "12391039aee4fec33522327044e83d8569105615dc3f1b2a6e62038b94795cda", - "9c9adf052061910351964cdb151473ce3c2d401a4feff3426a29cd58bd838c0d", - "59c5fd6a5c1868ad4b0a23c0137bcc6322c181bb01130f442417ab389e26e77a", - "4e4311644251d0225d8788af01bdbbf715681efd9178e6efb941910d12d51a75", - "33534d81d995e38a79024b9bd0ae561f195f0303b711ff242b93f78f82f5a856", - "99a66665a2f535cd905850677275c5869fcc551612e88e51582c04fa16c0c77d", - "e41933e08dc9eb2fd7eef21abf205f4f9d3234e5b1a762c5616a4731addf4010", - "7b8a21995f452bdbdfea285a6aa4425306c861579fd80cfca323f5e42ddfcd3e", - "6682e0842862312b07a433b8358856e25430346fde750de2ff1380355a6053b6", - "baf7add4fefbde49980b83e0c72be611dfa1b9835805bddc0d3426828704b938", - "bbe09239004229c05d54814f80b7646a2cff9edc9c4891c6a0ec6b63a2b635dc", - "be3ea8f2dd4b4ef42ae8bc840a78f1f0e132793dfe6cc0231bbaedd4c2682e99", - "feb5e665138bd38ae239008accaf3cfb03c9246884e70db283372401e6e96915", - "68ced816df85ea4fa11030e94a8c8ebea4468ee74b7339bf4a3e66f52816f6fd", - "6cee31293e0323326e0c7830fe97016b3487170b238362e50d424e12bfe7ddbe", - "bf155bbae842e6a257aca9517f34619dc0e9fe931ffcbcfbbad0915e587b542b", - "72627d65755563425f6f8f514f6ae15405ad9efc06391991d86362cf5fe32d32", - "b00cca46fba8e470b210d1ddd70c3aa6435f48ec33b0e557d922999509566fa8", - "9736010e842add960e5b1d5f5fc572ed28b21b48789bfe1e03dd579ecff8bc36", - "223c94ef5351eab7b22ec7991a5be87d8decc04a383d0cbc538c8fdaf2296c8f", - "bb6f8d609c2ce3c2cad8d40c59a2a5469dd6e282a44aba279f219e6260690d7e", - "c7560ca43ef90746d7d25e80b3919002e77f225de4d648b227823f56df147bbc", - "96a1b6ba24802b9f42e8e7b018194bad552158ff8cdd89c6a9d5c2b93c6bfba3", - "1a8f2f685bbef7500842c6a25aaacd776afd5ed994968c554eff256b3cabe4af", - "a328b26b8404f698a73d9bbfd4d10f3b1d7e9108b7c5ff6598a2f624cfa6519d", - "403aa8c1f2429ec10abeb17b681d3e86e25a10a7bb23729ad3823f3dfd975bd7", - "e9cf75c235b9ec887608ed8a578fff15c0083436dca2f35146d1d716e69a21be", - "ef026ad3e0c86fc0e8dc163bc025a7d402c4992163de07af87e5ba9362e7bc3c", - "30b34f1d689025fbd06462c43e0938fcb9390406a21849f920c0ece81ca461b0", - "a2a72ee64bc6d95fff6d7e1f4c859d59fe46f40103236062bd06a3e0bee2d5d9", - "8aaa33afa3b1d4b268f824f029529fd3c9e9d797da4accef34b559db0e15c835", - "6b433187fd40eb1c9b483dc7251166d1cdc1c7e5da15a3e0eba05fea64d5a664", - "7489320536c55a40eff455ee570b40ef7d22e9a81f95c30b1d4e9b581d86d719", - "265f2209641571462d49c7d2dc83ac5a08fa57897da42e6348860c84d34b66e0", - "57fb04fe541aa575ddbe26471af6510611ab0f9da897e95bf6f215ef7451f4a9", - "742ca833bcf85ccca7397d4adb9767e54e69e350a5646c1fcab561873cf9c023", - "029224ae8e2df4694fded386912f41c97f81e92121a12ede72ad72158abcaa6f", - "0ba694d5cb775a9fd062c1bc7f5cc98bc22006f0a52dc6e594914a5f8710c3df", - "f3a9ec1990edeeaf6488361a70bd741a07d3d102b415942e8794e6b11fed2de9", - "c8293fd78ac98c10130df3f97506f914f846c0297f00ec597d5fde90a361ff06", - "7ce71aae24a93602d4f9ada6800b9ce92146e039a03fe6a0293700d85d114374", - "d878d4bbd1aff26cd814760ea7530cf2d8eefa21ad87f29609ab8dad3108051e", - "f5f534c35b296e3b816f149dd352b3f0dd0f4a698f4df2fdf718b2b1ec62beb5", - "55ace250080aa1a4781f2985f6632d5701b3e1741303eb2aca7457ae2676dc99", - "76e903ed98e6339c3191d1a1852c1d0d7592bb139b5e6bcbaa8867cb0140cc4e", - "46ac5397c25ebbb362eab1ca8683bfdad6470188ee939c35f03d24d8b692dd6d", - "26a2e15d14313b36e13a789675a1848ceb991e2a032f3223b6481a3db79a7e72", - "3784d087e45b42fd1a8885938a709584fb26c11c8196f394f19d60c5ae3dd0b7", - "0e986857e5d0eba5b6f5839301427c35d2769481b50e6c3c827ea36ee659e59e", - "c2817f10035df5ffa9cbff507ce898a4accea55ce11e975984d8f69c054955e2", - "98d1dbd9ca4258c62c3d46f3306b49573bcb649001fc61478a91be95f1fabe4a", - "ad245bc3c0a5500173427a9e9ddc0660e49b9fd9fdcf09a605b86705181cd153", - "d651bbb78c7037b67d747759ff3214e44fb1687b60977f7ee24699b805a28191", - "edd6ae00dfa8edd1242b19e1c39da455d0b13c2ca30fa3b4cd6e3d375f4a2fba", - "a1c9e0e006bbe774017a38ce90c04317ed819d4a21459ed00d7801101325e145", - "5893847ef9ee20e8a72dffb63e735c52d71c6a7d281993d4de0bf49fe39f686b", - "664144c8f6ad8109aadd0b0b875e966b8275de2effdd8b2370db53101ed146ee", - "be73af7cd69ee6b3ff3684324f4878ffda786d270f28e457433132daf682e35a", - "310edc24d9893a487fde94fc24c762cf29cf14c9b93d635461f307fbeb80c71e", - "7b172ad79b3552545e5827b2e596315a53e6b4b6b91aad7ff82bf500aa65790f", - "83b8317723131c59824cb38571f1f3529cf583f6060695d5d98ff5921bd4e677", - "89e2128d67bab15904d4b5dcb3e30dba3d8ad0c6a612bf53a28cf78958c48f7a", - "97523e47da5fea394b717f09aaed2b7936bd91fc11d746fe7451e6ad1a99d0a9", - "49cc1569caf34cea7dde08530099dd84f557e09ab1a4bdddf66c04b06541df8a", - "720c418bce14776b805776593ae11535a0f3aca4b7ce27a23e6383492dcb053f", - "53880a63b71a19a44cefdbdcf04bcf6a0c14ab3621886c5f8c7c377466c42d98", - "f5f663232f81bb286722b27e39cf79cfd7e387d905b64ac032ab40d32f4590fb", - "ff3c30bbcb753ee4827d8be6c0a269b7c4da94035a7deda3e6b87bc14ce5f396", - "9f99d6871b22c6b89a47bfc29ceb05238246a3ad466f50698a99aebfe4374f8d", - "58f1f11459cb0688df3afe3a8950d04f1b5e79e6a7703aaa16ab733a578cbdb4", - "ecfe8e502bdc4ce25b6e8092e7e6109343c4149e771b56ab7592b4cae051138d", - "b14b0f47065fd86bb06912b33ce7e5b119cf1f0cbc82773731c02d36b4a4c3ae", - "098cccfbf0572ba1f0d329c8d9d3355ac52e8e11a0e5f4151f5fe87a6f6843ea", - "3cbdc420423e91bc29f573be0e06e3bb63bb8e4f79a1f9194a6423a4bfaa2808", - "978eb895e15217748c46e73c0004b58cbe28c245d7523f1e758b5afe9afeb709", - "31a00b95dc2a23351dde6df482473ca9860bebc1792680e20134f09d525fe318", - "6c1ee2a865e8fb39b1b826279e32e7e5c48c5e0da88abf1c34e584c6f8e6162c", - "982132d8c2d938758062448f6bb7179b4e1461f23fd0aebd283f1dcae3d676ad", - "8cb6b3bf00aebb388a87f0b2a67027dd74625722c9f37cb9553908d3423706ac", - "45c912358f947eaec57a2e1b9e617113577a3b0c66405eaf583d7d90edbcb4c4", - "03cc700d22dd1656e50d9a807fc5e0d75fbc3cee40214ea061f4d0ce99e66d89", - "74eff6b3b6f18b3b1d19d4befdd8aa7bac3720db33b9813d8f763b8452c83452", - "2c4e61851fe4ff6894a3a88400a68edac722974553a619e98ef909fd3a2d97fd", - "98d97580d4315237afc244165118ceb37a0c09f5473bcfc7b94a530be8854566", - "284b330bc5ba3f42a8d84db67466d7899088fa1033479f48c06bd3082ab8396b", - "97023d336fc53b2f04aa981a3441d90ee0962b635ad3fe46bd9b20feb60c98c8", - "35bd4eefab4ad84cd113ef9c14026523575681ca72ca690fd077915649c72036", - "2185cd8256d6694c2a98655b81ad2b3ec4d5148c9d3e97ed56db645c807c6798", - "5bf5303398ece53e046796a2d9130b6a147a5a878be415fe97cc6401b9129f7d", - "cf085a4a7e2879a72aaeff86a4c706ed4f24df1a8e445e106fc4442e42d93a09", - "8dbb0b2a4fa1c4a856cd728f7cee7743eacb9d1784d57361ec81390e7f2e1ad3", - "75fada5c23370e1f5e900734ff8a928ec08b993bd0f83028d21cbf7b9e4fd1cc", - "8657ed27badad3288653aed2459a36aa8f152709df73c900fb996bdbc09346d1", - "3f285bb4deb143bfbb9926a19146e6cab689673a32c2f175b52c1c7b6ff59f1a", - "4ec2975441104576120f41790813e35172ddef0ba5c44836db403a8f0142fae0", - "8f1233dc72f4bfd23a51ef2535157e4dec257e2e048ad1ec8a88aa678a9560ab", - "944d0dd10649a5d5bc291c8e890bf0422b8c128831d4b9776f12883f100ffb18", - "ad0a1c35506255cfc20282e9a640f9848d095e68fc00fe1355f33a5a3331bc82", - "c5b2c6519438dac912aec36ce4f4ce159027288d12857d08764fa22236af764d", - "5c81a452ba6aa2b5388982acb131b2aef191bfc060970eff00f0f64e83516e11", - "7080a40b6ba3d96c6233acc5902073d4201a1ba4b8b77029762c0f61d05d525d", - "6abefa64a189854606444d39cb97f75ff332baf8ef65b979727cf6baad2c360c", - "55110f88607d782a96328146f39b2ffa6edb62d1d159d13c9ec739eb45200999", - "1059c7c913619b204638ab9be95a4a4de7084a14ea4e1fcf45d6da2b1332798f", - "1500aac7d169696b10183a9aa6c80a1fdd6dc7fe070266cb7b2aac644d3eddba", - "6dab8493838190a7d26dec8382f894a3a2ec257d153c57703ef74e706121946a", - "d35dd4799210d6ccadfc634b5f3af2951a1e09f83c55217bdb981b8bb626f9f7", - "e90cc0d0ee357b0f9b17a9658e5a114de8cc7d12edeb8f69bcbffaf701f35a36", - "78e3c800aca40685ebcd30107ff468f2be2976bf7c1867f3791f98166c06b670", - "cba97009096b23cf15dfd448209b243a51f9ae0383d5ec240a78419504ecdce3", - "64ed4f15a36155aec3bbb61984d8504e779a8b1d61c49713cb4da9bde4579b14", - "3c52c05c526fa115f3ebfffbb3597d66ca0b12e5205c80a7ff71267381303338", - "14237be484a4db9ef908624d520e25c764bdba838c198ac89e161885de42e472", - "ab1c392c4da905391bdb9879a85a3e8ed661da957a562324a85bf0884f34cd43", - "d05ffa85cfc5132504046dbaec144e6064ba4e45da165b86ec298af483aee790", - "2af7f44032efb9828d6bd327fdb16429d799c74579b55b818b5e6d490628fc59", - "7c6a9b90e128d0c10bdd9c4d2f2a2cc941cc2cf5d63fc7f4eeeb1786e2b95923", - "948384c01bd61bf8ee79b8e2326f59f96a9650039e26751b69f7e290e7fbed88", - "9e9c29d11f0e1afb14fa52f1a6d02a274ef85d4a2620ed9ca5942ee758352acc", - "5ec4e0a19d28d0f8a93d265e0968a9cda9f98f39788cdd22ab769e246183b2f5", - "3d596365dc95a41e88b41b05e97e60ebb398de1be044b6e1efb898857aef181f", - "c066361761fbf00112f36b9c130717727aa88da4fd4d09af036783f0172dafcd", - "abdedd14f20333816d218a5895d7f7d0fe9bf96ec00dbcac8efed5d92c38b9e3", - "67b432abd5abd793a7b0d685a891f95169da7835d0b00ff5794f48c9e38706c9", - "84cde1a2915d14cf45e5c397dacb3c14813200da3e9addaa803558f08af0ce11", - "8a171151428026fdf9b10dbc9b0be320a8ad8bd4016f586d369687297c94d2e4", - "ad9ebe531ed7bfe39c045c79ba7709402ac7762eb33a8a5a5e2de43d0be5e2bf", - "0a4b984805afdeb2f475bf159aad70beb79f8e00aabe23b76c81223664e6bcd4", - "0cf701a15b39a8c1e56f3ffad82098734ef036af3a6614aa42962afeeb3033a7", - "e01a0b993fda0efa876f20afefdbefd3a445afa72041a6bb0735732d6e1b2e61", - "405378e749115edd20300d74e5f57714d9ba5078df7fbb75e2c74896a9020dc0", - "b009c70aa18c0ebb41594f46f4800a07c2beb892236002bedee5305bcc71b6c0", - "da353901136614917051331b838f5071472a02c693c4d86d3139ad8c44f81d29", - "67421b8212f92fbb8e7a19dfdab0db4d1f3374bd861351bed2d34134a933c5f5", - "88ec9abb4ed2e8e8fae5837e1715daeed9f564e2d4b6edd26288e849afe5a7c0", - "1ff16363f23a21800bc930f0335033d5e9039a6ddeea278a283e4a343d095719", - "f5bb5d4b3331ed303aa9b1898dc27100efa7fc36361d8c505ea8779baad34ddc", - "15d20df10b3300e1412e9db63c0b07b58a16a741f2c0d9206066fcfafba34ac9", - "a7723d0944053b052c370ce8722cc0e8cb083ae591991f1bef0b9c7cb8a3c94c", - "45547adc4da96e75d71a32598b8b366b2ad4f65e78ce3f471eb80f9c40d1c95a", - "2973d1b5cf514ab24ffcc618b87e3a394754a26904d64fa4d3f606b21d0cc5ab", - "fd3d558309e5697cb2c1eb292927f7ff7a54e897c6324d936a5af6d310eeeb27", - "6eba807dbeed9ae27b6cef1af10eeb2801098ed0a69e800f5213e2e03205518c", - "cb1de6c171b8630d652d9e85a20e93ea33d2fc30d60b03a5913311091fcd2c51", - "e0fb5d0ab28ba1e29c14bc1f9f6f92d8d091c132c6a86989ffa7380d922e180e", - "a46e50278fd3d111b1295e64ca71692371a584e4ea69164e05e4806edaad6fe9", - "fae1dad9237c48535acf86bfcf8210b7aa227955ff2cb2082f716941e958ab3b", - "d6df50f27ef576fa79fb4a7f6b7a4280b9c1f1bf357aa033bd15981b050fb3ce", - "d0cd4b2b8ffd9f3fecf4df35bbc7fa9ff408f6c6672c2d9c925d5ee80374801a", - "95d218711e95ffe822b2c788988f78e52a0ddf03312f226692cc1d258a1eeaa8", - "4f1bd8721bbc58b607aa7d1db3da76d307988563086a6e60a7521e4ad1de55a3", - "6e38690019775835ac953b484ec995c8c6959ed3549f68dfc93a6ad2dfefac55", - "9131d8d462eebb69b2b39e9ab8a0e2ed59e38d7970cc8232b6dd01f45dc7c5c3", - "2eecc9c44abe720af4b46a98afbd77065a09d64bfb97834f22169adbb8e7fb5b", - "d1db1d5f4e1473545541485c8f0c93d1df95b655c1745c23db9f4c25c5f1ed62", - "472bc12bafebdd8f771eb07d0a7ffd081f1ed773aa6903e2f43f62f814499148", - "f888edca06a16069440bff2a9620e7fab8117153db1e8e9d6ce3f4bbba2212a4", - "36da622708c54faf0becf8f248887281a9240d5af1a3e9174b1f1bad37eb2e3d", - "355785c651cd67315dae30486bdc5fd8dbaa07c62e7c92941d1bd51ac069f1c5", - "0aaacd4745d394bcf1feb0f244855a66c7a17d10181abecd531b7bf619b1e8d8", - "aea77dfaf1a3289961d45970c771d076c5b48050da46505344d0891bfcb13192", - "b3c734d93e275c0e36fa8906b1a22f5f95309be6db5b5671e39c9fabf9725a05", - "c750ed88e9ce2c8998a9e2bedd5243aa55aa72bf632ba195f11d1e4278de7070", - "2a9e96c972e9847e1e7d330d12ba016d5fc8c1d9e66a6fce53a56bc31a45bf9e", - "f6f6a66afa0bca03f5c9085c38df550f0fa1454d55dd6e57c9b40cff8f945a8d", - "17c5141c925b4dc0a1a751a6ed79654f8c7d39918b51991f9dbfd459505d38ca", - "f541c2893e5155a2f3d2b9258daf23dee07d39125416c8e8155e848f607e84fd", - "c499ee222d651cb255a32bd71646277f4a90e346da755b434f1cb0acc7e632a8", - "9442a26ef87af6aeae04e3271c58db6186dc27ca4b8efafaa79e3cf70f17a90b", - "0e8cfc703428e9018cd32fa2d502990e9b307be86fe37fa04f0372e9047f9222", - "d77dc2736066c31a3feb334bd7fb6cba675a39b1b0774be1bf6b7619b8256925", - "cebe67b059f8d89e3ee8e54dcf5982cc5f2b8624e7fc93edbbd0bc63074a68d2", - "f9486cee0db419cdcf64cff1e8fe870e9bfe2bd1bf9909b7dc8a6843b7f862b0", - "1a82ea81bbd74e2fad236d09dcf11e5e6059b490ec8b17a953329cefa29bd38b", - "8f39c771118739d7c6370a9e4f9e17faf290c62216f6db947c93476003ea3165", - "6cbca5a1d42f53d92e3e986acffc112a781577af545bb7eafdf64904abcf5343", - "a850e559473b8d798f7d2eef6c7b3b0bac32821f77944415942b6ca192879ce5", - "4367eb02ce1eeafa34a142c854ed3f58ced2d2bb45f5a08e176663278b869f97", - "6da4ec8054dc2e91387e54a3f1fc8ab4f1901cf1aed4037d5f100f896f4be237", - "cb45461b24138fcdee9bcd34fff4c12808e8f5b696a96e1d3fa4cb55a93c5dfc", - "d7b85e84ccdedab3e910a624b55cbd1b6b0d34b4a4e49c43b0495a39d93edd9a", - "8898a15346c8f3be295455270bb3535c76d0d32547b2e97b15c29fb432ac7f0c", - "dc53471944422bd576c7140dfc81a6133509323cf58851f079dd6af9b64b9f66", - "ceb4b43049cf9a39c0142385bc9cbd93fa1faa5ccc3b17b5a4408f519b0e421e", - "f2b5339d01df4df0a565cb2ce67e3d0c51035e81ec62fcbe1b01c08d8597d0c8", - "fb7a4951bc9ac7bd8bc925d57592575701459b4dff3d69452e394045cf7b7195", - "1438c0f3a00b66cba1c745d62861106af04fc70459099bc053cfa5b5a4f720b6", - "d969d29199e44036fd16c297609bdfab32d4c5daf51591f4eee22a1e47e647b2", - "f6bf5ba21e4e5c034329e1d380912a2092c23636ce27fd755571670450d1b0df", - "4764789e6ff74a5182f63bd1bda86c34c1986c7c3d4185c0722d4d4ba70a36a6", - "7402f876541968e2ec121bc01d2af0853290cd57ef794f3d4923adea64ab6352", - "183048eb876fbfe411fd0cf735d103c25fddd88a6349d4f16822fe8cdb7fb6a4", - "3cf2021e26a12cd6cf4b6795e19bee5f66769ffffae5a302289eea3a746684fb", - "3f4c90800023abf522ed16a19b703bf847b0e4215e0498714bfae351d51b0406", - "dbfe7fcdcb6e8b964fc232131128094ca0bdb3f966bd37b0db22f93986a67c9e", - "312d09d60182feeaf0bad073a8b664f51926ce9b53b60568684f3aee975fc879", - "45dbd066493c4f47acfabe2f20130323163a76dfdd4cd0f68f7e1e0c104e9072", - "df362bde8e0d0438e686eeb2828cfd4497c60e3f655618bf8acd7c05af1c6189", - "e92f88ea6d28c807da7ef47534e4a315f111659006fb8a0a5fe2f1498f2f7053", - "7b536e8e550abf38d2af53d9f6d5c4b3eeba4f4998b3fac6b0a68e763b7e5d59", - "839657a8628e80d011e0cce6e1eaa6e4f5264ccb27267e93a3d101ec9c6e08cf", - "5e0bb9f6603220a70e49e930b5616aa0c48181924c1846ea9ea06d2fdc5962fe", - "efd2ba6084e5fb92faa02cbf167158a962f6f0fc16cad0f3fb45a49c767247cc", - "49038f9ade04a990c9ead01bd77dbc60fa51d21a69f78f03479ea49426262e71", - "ffcf9a1fc47a4bcb408a7c5e3993d660de55b27ace6d8d94b570392dc3f9740f", - "f3506bb3b1deb2678aace43ee367e9ea9cedb580e4ec33a81032092adf464a7b", - "631b1c6213aec4ecc8ae840cbd098120647ff6dfdb927f7f6568fd1df06d255b", - "32274ef47d79182e1072fd79bebc04177a2736f98ba75e858681a8578c865c09", - "bcfb41ec9017a65208ffe177f67c89f0034fb578a68695333fd0fc9f647ccf77", - "07e525a692e015beda6a8b47e35a9658b6339397515ee41c8ad7947eef03e2cc", - "ebce8fb8e170ccaa14f7ef366e7c7bce138c35b1edd19cff9615abd5e47dd7d6", - "6aed83831e4fad7db3fe5dfc088c54f99de20cbc38784235f4f46f3465d854e6", - "a61e17397063ff7179c06a53d5465ce16b512c3418e4d638fe3f6d29b07b5660", - "5852751387f22713ee3ee83183a3d42bfb9594e1cffec3973c12625069f27744", - "a06951fe4ae197b1481830552e1d9b5e879f1b7d2f9d8e67f3a191753c644a7b", - "b55e5e571a8f143c77e6dddb83d4fb301148c957014550a848bae83e30880509", - "730222cf0fb49ad8297a3a3a1e3358b24b49dc9591fde0dd2ec1bb7f311fcd12", - "93a0fd6ec5740765841d480873d96a896f16e429caf60f22120128d098add919", - "e56be84131216c6a9cc114d58b5a49849c24496deaebf25033b2179cc3d82375", - "977d6bbcb905daba00e77d0a52cbb5979f8e0f0b6dd82c61d27cfacbc1d3f547", - "4cf52e7eb57047622aa57f0e493d942b06c72cf81b8926884ce216c1c3b57282", - "8decb734121213643870b675f218156bb3c74d1618a517d3d113074ca8702ebb", - "5eacd137c815c5f956b9abacb5d89a4de7e55902633cbd5b0ffb8648d544db01", - "1f748195ac82d15b14dbdf2cb7b5bd7c74e6f95a695541e3200b3d9c09ae61b2", - "5e422a8ac498833d80a38283bed17efbb2aa93fbc4963f1bef18aec2adf60907", - "8637947ddf6dcc57e5df748aa002dc4f683754627af700d9fe554a7c446bf9ca", - "aabdcc931700c2c19c2f885faf984ef38a92c43cc69abea6c4c6cb98a8518a41", - "b0e92370f3bc1a6474df94742ece88f6875f6ce561432de9cdb30784f32f5166", - "1aafe7d236a030e5dc8339eddd0af8eabc08a5f6a9d92d2586dd347be47cd24e", - "afdcdfc6e3f8c4bed0f79ccc815720f4cefa62b6786ce1223b8980272ad189a4", - "5a5a71837eeeffbaf111db9657184abc3c5cc9850d3bc576b8bf763d5d3b4015", - "91297ac866f7d8e45a17e5e0e7274cbd738764d98e48e88c0f06a52cf61ea64a", - "a6bdd1dddc10cf6b7c302a045df15268508181698c363715e28a726d07b885dc", - "3bf0ed9ee932c6385ade932bfebf6dfd8a2be63dbb0ee07185a4f61280e59fcc", - "252157df92782d937c973381ee98574e314597371fc1d05fca1c579b2b2ddab0", - "fcb0d08f21640c54ebd7a04a5c2b8dc78f411a875c58fa61ef8f9a3e44b60298", - "76d16c78ecaf0390d013ef80cf0a73f211d2f5432f2e5a2f3c898b75dd3fd898", - "f09c37b76aa3ea1a429d09b0e1792f42bcf41e4aa88400a06125411d21940346", - "e9757f4aebf512f3013e5eaf562c7a16407e808c07d032a350fee76eb62dcd8e", - "744746633c6984d692551d5f786c0e358c9505b8da1acab16cebc1b84d944f39", - "b9d34a54a0d5ad6769cf8ec5dbda4d87cf654823a85813f652b8b7456232d378", - "02df29a571563e1ff6c17aa01dc08104a6465909d2589bd8f70a42971a762afc", - "5b5c9311a8f699acf31a1420adb66e6bd103083286deb2a80bfde6af6971ed01", - "eb3bf13b4950599d4dbd8f468a74d95d78627a302ece6ec8a5c9deddb36cda39", - "c30e50f02956b2c1a14812fb455ee0224d7e28c528f26f31c5aeb1a17ea21ba7", - "54b7100d2e4d2d6924badeaf4efd7b48d55a8701537ba130b4e8ea66f6d029eb", - "6930c44cebb6fb80c3bd604f73521bb6b249c7a620c99059a0676067eb0fe809", - "f6b1e7e3cafc67784096db7253b0bfb2b4f339fb3b3a7a3c7cead82aa4f6c15a", - "ca86e761164447446c91e29ced8fcef10acb124d7be52fd80dd900f904581aa2", - "7596269f281928cf5259cc933cb0e22b7eb0f877427f15688f8bd853678317b6", - "bbf7ffec747823934058bf8029b67f372b7d963a6f8c3847d60837ef027de83a", - "e8ecab0d0cad7611a1b6aa999466969289afe99ccc59ed7159ee4c5672f94331", - "94fecbfc2c80e646af27d74d5714903c491c0ccb51e06cd0be6fbbd62b4f1d7d", - "6566c656e190588b9d2f62567124f1d111a41da4d3b4fc2bf9b10f7bb5eb3bd0", - "891cd128119f06cc0ec7bca21c61dfba3a670cf09843f1f712a9a8909b313217", - "f680d61e26d63627d5fc7135821fc319e9913134adccc4c40f01aea5472c8d82", - "33be26eeddb98eda78ae6751e7b383e9ba71270e5afae6b6cb6496886d7b9427", - "68534b6cb3d5b1417eb64bf6d448624e8035a6f52c09d97d083ea6f4bbb47a3c", - "d5a5acd1daf11dd75829a91f3951bfed69bdf9a7837859923aff9b721b240bee", - "11192ef0fe5c8181725286a93648476591dc70acb9b5c365624cfc9fb8abd54e", - "2c40a68f7bd433c2c1dbb3ccb993ca98c036c25dc8e76726d41721c4a30318f1", - "313816270b40e2a837fdc6c9a780bcfb622e9886cc4fb828073952810a1c15c1", - "bff0c8ea4a2f69c0e0625912e805276301c601e5bbfeebc83a0814f58ecbef2f", - "1773927c7d8c117c2cd03947090df2ed7ae7c7f146bf7141d0822c54c018491b", - "0e42b71f0113f3fa267286206d03b47944773e7f742734b0d833a407b507f74c", - "dd9df6739109448b278db4f757e01be9ecb0637a22d14057d388c53da4cd7871", - "aeeafa6b4f15873372687827f9a134d726776e449e249a9c7179ebba6d00d519", - "3954e01bea05d46e0530fccbae89499773c1b79d7c3d79f7cbcdb5b1fb82216b", - "05c831afebc8127e61f573eefff0f9434495e31d64ff500b6d3928e1fcfa675b", - "e1fd4f3bf102f51a86db5387f66e0300ae8c66a553cb0a88aa7060c4da4dce30", - "1eb6345c4bb8abaaa0ccfb0269e1d0155ffad518bd585260daa28322662f6645", - "7c36041250c651a36db98bfc577341b23394952b95da78ec479cfc0abc549901", - "1d7b427bb63160c712d2c37a76be773881c326619a30b96daae8b6f4af889f9d", - "8d37e1398c517e9239511e65ab4986732766eaee7bcb85312bf024e95ea98965", - "b00efd868f8e0eda640015f4f656fa7a718dcc8fdd3333a9c7dba6e00fe81419", - "54459ee4a9ed5703e3f6b316dcc6a4d2216521c177eb69beec3ac78d5849eb12", - "ef5465c3a5acbbcee494ef42cc0f8564849ea3e4ee77e9e13a51feb1b842977d", - "2c8c21c4fd9e0b7e95bca73c9b948e72402b9c99822a82e041558eb0c2701467", - "f5ca9866cf961727bc968d5c5969372e88152e69902f5ab59b07a01f787e9de6", - "161f64a34c3115b64e1313e8b015d8169a1c85ed42341111d9628e89ca3c58d8", - "c5cf555ccb7cea4a5db655011baec70daacae6ed665dbc674c31a4bf1423dc4b", - "4e3a09969d4c6848e7d2248344d12af4a76f06f830c446e12dc545adb8415842", - "a7159087f01ceb9a818d00379accf5d85cffdf05dca1487533bd3eea655f1951", - "b5596fdaea1028040aa3089b55e713e111b92bedb99906abcb682e63e4847658", - "1a7e31a7c6be933d1cd449bdcde85871090d44867026e66323b3ea0b40521e5b", - "a71235790d5f59bcfd303e4d09dd7647a550e59bfb0f06f377710d425c080ea2", - "227a7ab0bc94411601cef375866446705cfd8e9c3b53233210ee88259e9171d5", - "0199cb170f052d96e443adc96ab030bff9523f99c623bed614b26b09123c9c22", - "4cf273716c639a2a69ae35e5c2d21694e3cc7d0da3773423a541a18192f26146", - "5e9b7ebb36df96796b1e1a1a97e361b13ed762136e0e8224cee99f1cc79db0ed", - "b73b018cb4b4f941b37c141dc1105d5d4c8f07915a4aebbfd71cd1c5e6828430", - "2060755fc0fbc13262a21d86137550270bcdf9d88975560e3c1c6e725fee076d", - "7f83606ab1eb7f82e49ac16ed676e13b6c47ada1803a8de9a46b182aefb4f6fe", - "0ccab7df65af6183393dd8138b69fe3195d2e460bade97b02683400ecd1140b6", - "6049d2c2d0831c6328e1436e842dc496c510aac59e4ed2469e8ade703cc1032c", - "e60ae44db4e157b3323cdb2b9308d8dd06588680ca13a19d513d155d378b158e", - "b29e7fdee60d88fa826044c64305e0365a3b36023cda9eb08c29aad76cd032e7", - "569c1d4c97e008ef938c06181fdbd57ed78a532d12166b3b3dc61ff606419f5b", - "d6874b3111657b70cbd59af936aceeb123d2e5fe40c9080afd45f1437fdd46e0", - "cc00e85a6f2475801145ad56e65f39065aefc752834629e105b04bc4e80e20e9", - "04d119b3caedb404286b5554410a30daed2898ce3e003e2e3e271940481dc953", - "ae8e1c2dd1053c97af05ddfcb470f9d3da09473c801a768996ad97e12cd94239", - "7c6330b6104b014bc2d0cb7016b4497343def97ef828b7d2ee38ccceb18a616a", - "88bccab60358082955a12bd32673cb532aa36d68557101b4d8166f47903ef9cf", - "f951403fa4dc64a0a3a7465e4ee7d1435d27659f1f8f5fb921a9dd2350b78d7e", - "2b9fbf53f6d68696e2429b314530774aa15f5766405e9897daf5db9927f7e00a", - "d697e15a5697e4b4385ccc0797257d2a5869b792f0fc40ec7ef1a6dc84f18b24", - "283c8a6b10baa327e8d34416559a744af44efd55b156877e8c90e9ae70be4b79", - "e58d4e0345027302f97222f01204b4e8dbaadcd37f3e13fc7e4e892eb6a7853c", - "28454da3f74979de03c52ccd0f4747ac3911ff5c87607ce292251d591f3da522", - "778523c5cbcf87d4a20238dfcf4026a33bd79c862277957edcc1a88f3b28766e", - "718dfc6a131aa89ec227bb25d7a6ebc0a205285b960aac8dcf0186e8d50c5b2a", - "c8566d61582f2cbb396aeec52837b1ce71962cb9dfa28c3fd7b8938269248d9b", - "ec36a3a7cea95d4b9b543d3c7b3e06e784529830787bc3342128095274a80234", - "9dd0faa1af5b86512d4528cc21c484f27f0b8dc6c17c0441af6457d7c5b73116", - "365bc967c1d887fb67d587989188b1136f4ca9907d533d9453aaa6d5ce630ad6", - "d2e85f8730026170539362d0d8876235ca24775e6abf9628706810ba62d25266", - "0ea4536f8314112663e78f62ffac59993fe0c87e8cee9517efb23fcc5ed2726b", - "847f4d1c1abbb28f5247ef511fd4e14958654dd94932e9f4c3762ab7da155d66", - "63802d56595e37ae11aa16613bb1f2e55ed3875ce17d18c76c643e44be97ca76", - "ae1e375b292e575194c3529654e2e7a0e03578a2db238aa236ede9f3e01dc230", - "a2438e629e17a614b2117aa490b2fe916cc2227d543f06fa0bf00a96f1ad89c9", - "58632f5584fc0ad61da137f949449e48df0a1cb966090cdd2f74640c84dfc434", - "88dc90724343a4a205e62aea11d378918d7a722682bd402c7e3dd2bb216b3ab0", - "5857f53a37def0932e363b1d7f3d3fc9ae5bd4669e745624b240474f83c5c448", - "e3a67ba61f9b131ca649a771acc22e0b85297f0bca5e7997fe1f22ef0a52855e", - "a5f4730f501d1430e57f72a9dc404c6cc2a13a93d7e707cc6ce769e4220d6d73", - "c5944cd03859e7ddcced4f65d8b4411c9ca3c3fa5aa91f150952fa16ac7fb060", - "f0bbd4e1646b227070e758daf6609e8a16869a4119c0e79efb5b6d2d43ed2b5a", - "c26ef53e2bf91ce4cbb4adab62e4748844964c5fa9e6eb4963d2d79de3f584a7", - "87b475cec3009b810786f35fb5bcf520511edc0377a91f64709247c111f01ed4", - "d3cf82580ddc70ac552fb303090e2723fb153e5a03684c82ca5597bd4c440a1c", - "351bbf079f836f4dae701fcee47e0400e07ba123bd74d01c3b2314c3ccb2fce2", - "103364d0c3065ab3e932cdfc528ea8e45a1ea2ed2a716bfc0be3da2c3b4ad593", - "0e0c1434f2ee1fd0fbe920c7a48f6d684cb42dfe68ba88bce4a9eedbbbbaa648", - "c71d87134da7f4f856fe52a584fc2d47c3bbebe7096f53148a4c79bb18f70606", - "a9452c9a15368bd47542f801b00133eaaf94f41d9f3021d6a00f59beba286c10", - "4b85efdbb6fdb46f87d73c5f61d0e9dedfe0f2d1577f3268f643e9c813edaf92", - "a049d2275bfb89e6b755609a35c617ec3d456fa9ab84295ae3c69889dcf64f5d", - "9e4471552dc77e9a8aa1143e848d17ef338236dbe6f19879e45910f94a8b8960", - "56dcd91a7847c82cfb0983ba5b743850c7ff32da5e338f89f2d837088d8db2a6", - "2a0d5b1f25184608761ea26e55c1e21683d62c609c58907d00737c4220f9a497", - "89ab204e7c29f205ae6e7d198161d054949969953050d207f6d499301e32a980", - "66d89fc139934d47eb80666cb48ee2b2cde0f20476dbda52fa085bc8f7338a76", - "76abcf8eece37592b9ffaf8c856bf935dce4cf464c40b0c7dd2fc4618b16d257", - "fd50604e29171261a3f816bf0f715548980dfc9325d3834f5e32518751917983", - "e627467a8fc0c9cf719175fdf18b4d227e1af90be7974a0efda5edb72c499683", - "86b923f9d1d7275ab60fbaa71371c2348850a9ec135d793c68202798233a29d0", - "308d1263df6abb9e1e6af44002c1b229f9d9e662919bcf0b82771be72abaac2d", - "a7a696f4852cabcd189bff7d5313131ac42323512b7477a964fcc90098f4aff2", - "6682c0ec06fff08d7066a45ea912586cf9a04b267b6ff23febf530f496fa5a40", - "ea79ab10b23beb7864d8698d846fdf5a57d7fac8b1893f26ca9588b3fdcd88af", - "960ca63851ccae8685a526bc554189eacff03358298ad49f10c14fa4f5163c68", - "a3ec9daa18c9754a0acb1a5ed21bd777ccbaea7142a80864ade00e0304ece60f", - "b141c22572abe0e4b7bc3b34e99d59efb013f7c51400b15176081d0520fdd241", - "fd85c42e926cde71b55e2b775be6ba9172e67a8c69c1acf5a14c5cb17c0a9be6", - "74cbb3fe2ace1f204966b812c7e5d2907c769863301f706ba4a7ff15a0ab4109", - "9154db8f25f6718b9dc5ae1bab954bbe31b5dead13c642c30050ef3d58720679", - "f63db6475191e81bb8e73eba8f52b642b358b424bcb44f418b153c4eb29df635", - "68a27b5a1d4e02cd72e0ad3fa15d18008ec972aa2ad35ecbf39f5e973e442907", - "c1a237b68a559742c161d7345a67e28f9011b91b1ed95a21cb0f7efdcbbb157f", - "38e87f513a09366ee1735059a245a57ce196c44533c9ec817ebaecc716d2d291", - "cdd7d53da1acf7b374a4eb90f45ed71f57d54cfd04b01d327ece2acd6e9739e4", - "4820c36e293384f5b3ea0b676098346097a68afbf5cd42001d62854d636d1c76", - "8575e432b318ed11dec368f0f526ddfed992a5f9ffd529a101642a567af96187", - "2707323c68e2c4d29d71222536b5c9a2db1f3288c56c83f71d34291cd173023e", - "8fe506aebc9fc8188d3bbd5000cdf838a04b94ffcae5a7e3c6fa5689a7a4108f", - "d1ea897355dc8e4ec995a9f87613ad5b54bbfdcebfe06d651cd20bfd75816847", - "0fd704584377ee256f160cf9c5b5b48d6f5b8d07a6852f711ffd0fc567c39032", - "ae91164958e74f87eb2b5f4f6dd5ae9b182045a43e5e700aef4dbc436d0958c3", - "d60b04a4ff6b171675f38e89f9f5b4104627328fc79a68a641eb4d1b017ab325", - "d08a47e39bbc1521b5db9a96fdd822360a5aa15a1ef804144ce1e3fe8baddba4", - "d759a279f0ff283f089a594dfc571c923b113e64c323376912b329032c5c585c", - "c7fad81e8406e9725c557b671321f046634cb674eb507537bbc6c587e22c77fa", - "7ebae9c9c071fe77e8f43617c7606abe83eb3dc78686b8e674c510b7eb5a8441", - "a5bd0a98472bd75b082a5ae4471ef2eba0b7e4a086f0e68e48bd10ae61026d2b", - "9d729e98c2c666d92c584086ed136280387d999200ff5f3aaf6257ce88e09d06", - "37d88c710911e8713618c8602837c77f49419f244271ee5f579c8aae107a134f", - "27880c446a7bb6b27b7726615d1f8a693a3c6e59803c89a70ae26a194c1c13ea", - "778be34ef7012bf8c9791719229db7fd8f9e4398e8ef828f7ef935a6c4355207", - "ddf89759e5d82c3818d4e07276738ec409cd34bbff343201c03092b0dd9375c9", - "22f697e5377265a54706245e51b5d40e1617dd64f165a1481194e793546be115", - "d5243746142beeb7b174ba20acbcecc2a578525b9032ebd09aa31e1db603932e", - "d7dd63359b76d4d34d4ad7961a45d6cecb41b7aa7e6c6a9d0441e02f5397b539", - "f7e382000bae36d6cf7dc3a71f9d036377d15f6f3afc0993c56de05fda665a94", - "9edf1289c1381910cee91dabbfa1b2f32c891d711c4a77014a0e854b940a51a3", - "305e8f12d32f00eee2c7296b3f826fbca9e35a5a554485ac1b9b45a777ad1e7c", - "0f7cf804e851ee4ee25cedba008b3422a44e8af137b731182f27d9f1532a51f8", - "5caf261502d277b6d29526cc5b9bb4c2fd357a93daf38c705485671118f73d39", - "d0c2fdce9dd4e743df296a504ca8b7751515fe105a33963b131c26bb2996f3a0", - "df6c673735581bab23cdfbef7c9f99eb59fc847be3db645e2988dae7591b262a", - "442841e8ec22540ede24e42f2cc96ae428f22dcbb707b276d61231f81a9fa8c5", - "2c04af63d9cd9515e346fcbe039f4279bfe1408fd5ed2096a11e1285b0618bd9", - "aa9567e76a88d2e409406aa71e69d7e697c8bc82a0a6823c16bdcadb79aa9034", - "a9287dc594aad1ee3f4e5e39d817559efdcc7efb9fb838dace909985c5aea5d7", - "8495ce137c8942d1d552341b892a6ef9a636f35164e3617a4fa771336569dbe7", - "134b17643b6263a399a6b227a17d16da43c12d0cc335d49054aeca53f54f2209", - "5c9e21f8f762cc404701778cce9d8ff452468f5a99734fd9b9e3bf2596fc75c9", - "025a14b99da55c8bc39bb64109ce37ea6d68caae675acbc251acddb9215adaef", - "a5baacbb6e701cc8a015a991e9ec7f2fb353786f7ba7f8f15ecca3809908348f", - "570f62b707f8925aad78e78557efc45802348bd513194553ebceb8d499260f11", - "d6b1aa2d5a1efb225ffc8299a571b40dab334904524b612cffb6d11b53c884e0", - "1fd044b844ddecd8346db0692a519b09fb559cdfa06947aac70bbd6a91d8bab2", - "efb7f437433f0921df3ccdb6ee3fd9f73a78cc8fa3e5d02d4820df66d993f784", - "5b206718905005e717a899eae26d8c924e83b6a7569fc6f27e29d6c8b6d7fd77", - "055a60a233fb8ad604cbcb81ddc84b4d49435ea72be1c0aa8590f9b06e4ec1e4", - "fecf4a7c110803883b6dc38c63522bc70aedce52cfeab37508987a6d2c3b3581", - "f4277e04cf8b301c83c9c3299b50692cbd45f3538541ca375121ff2d57b660bb", - "bb01a847180b802cdd7e30a3d66f9062e2c006f008182b3aed065657e4670330", - "db64e29299ca5cb4acf4444d147fe6833b2985da05250f9ee3f165bd285035d1", - "589e0199f3407e1735164f863ae984191b6a23c485eb5f93293fb80b92495613", - "b998bd81c6b8c27096c0efa20a0a53b243e41e2f1d44b7ed53c7afea945a5313", - "d99f0d436f431831646deb71678afc618164002eb8e7cffe4c028f30745e53f1", - "254cf4c3dae06a1b43268a249071b996bf23cd1a7c40d0367b0e75ff4b04253e", - "bdabbc2cf6ec9598f9ff5b50d5005726028ba749466ecb95fd0dec212fcb7535", - "1ef058f0460868c08e7a9309bff1ddc6e9f56a66ad401636326ecd72e0c0b707", - "81e0d20d9b8075a2cb0407b04e0ee79eac0750b81517eefd37050b6161bcfb9c", - "400307a9e5bd6e50fb400920dfc71dc63aafe6ad50ab73f3e96b45c903f435c3", - "0ed126ae1e77f53182e7429d6da90e5c43d0e1b999f73e0be23a7b8f2a40d595", - "50a7b5bbce8187ff02766bfeaf0bc841d3083d9a65aa6003f2cc1d322ae7ebbf", - "e0704e5e822b763fa51e69fc584226d78705faec95ce2c31fb7244962a0671da", - "796129103041a6909ad6ccea1ab32e234802baebc8149b8e16c8fd41d7c63e30", - "c2f4dbd4903959665b168a06d1dcb455c933ead54287ddd3bafd0c025f123e4b", - "38b8f812273582d4e52199acdab99d034ddd2bb04b1414255d48266b0721a406", - "3abe0cc659789b4f0e76fc4233d5fa94c41f4feb20a63ab0435bea5deb6835ef", - "1663ae00f21e7d01cc37e6da3b4448b666c0d87ead2ac8a4ce3f9c7ba2eba11c", - "2cea671822adeed76e2caa15e37908423c0fd7ee9427db35f47245f0c1e27eb2", - "ba87986d62de1e47e0a48d3823358520accf4e312cdccbefc28a6145c95278de", - "0b547ba6d5d1770099e12e2e463b25467a1bd41b0d33675355c1ccbc9e2aece9", - "e9d781900a799f7c3bfa3162d05d295133a87fafa3abf5becf66c5f7fa62e036", - "3695f4aad49d266cc04ca6871b4c91c378a8b68a914f79fcdc5133c18e96c24d", - "97bca2bee59f34545a6196dc7b7ec532246f195ee07b93be7191e7f297d2a360", - "a50448ddab7a2cd75481e2d0641e483b65ca325071ca380216889976303db582", - "c554503711d66770877d7993a54b3aa16f5682da264ae171fa63144638b63b24", - "9c3552956b12f444ff0b77e39d6e7b68de30951761f0f02603d3ef625f1a84b2", - "1bd0500442f5d01572fb0e724d597f3f9773be882eed2d0b764d6b790579bcdf", - "396934fa6d5b8993bb909f2b1969df1d457e5055429b121432f33e8dc09a345d", - "dfe8452cd1bea94dd366bbb332243908b10a63bdba56ca6548dfc2871f55dae5", - "b606c869963dfc4f0de8a22f20ab6d16e449c13b6f2ef07981da37b26cf29c9e", - "15db560099df7ef4afbd1ee7180f01cdf8f35215d745953be35d9f400cbe2746", - "7ee9299cd861e322b864b02e96d927dff0ee614f0ab9cc828f15d05859b21048", - "63fd42821a4af28ac4e55db19bcbc9312855bfa2839e3a281fc9c5dbda8557fb", - "0bc98201bb54077ed4c6e86da2a6f74964c7459d6f195403e3e87d684bb64b00", - "2b358f99e173d1a2c85b326401279f5da8f38bfeb929ea63806ddc478d8136b0", - "574b7faa875ada7b119000f5446db3ab3362b159c7cad95585baeb7c31b41424", - "ff464123739e911acdc97db3920300dc3adaf3716d0eccdbfc1217a1793592b9", - "558c5e12c68e2582a42799b4a02b6a6d3f8ccfef32bf22fee4a53109041fd192", - "f279a383f4c0bad69c89cae14ee93ecc689aa73253bcaf3dc2d20673b4510ae9", - "f9674330e266ba300baea2b0f8cb1fed4ccc24c5632e7563a5c0dd75bc3f6453", - "625dfd910972b3b2a574db0449008d483b322f117e5fa4b72b48c05b34829969", - "1801c83d7558f7dc1333b11b5ef7f9f316b2deb43231a2d00fe52f7d08e6e378", - "84fb7a432db832aa14114cdd41f2edc517462c8094087c519409a35fd76cf98f", - "374fb14b03217f99012ea342702e4e151895ff15e046f217f6a2f05fc6c7dfbf", - "80a000b45aa1032019c742aba638b691ed819c89c460635179e544823c42525e", - "2877c2ddfd309e46f4b67e36c4fd46657c7a2bf325739f9eda8b9dcdcb44fbf1", - "e5fc7ddb87d7e8c14d07b2270be5a8496c5c4ca6d8f0d1e2ca71d151f9c34c63", - "09e0bcd7ac27ecb6a5ebbd15ddb4c245a159cf65d6de6019c2074646902b4cc3", - "a427282167c4c18c78aa3f36e2a25e5658a9f7737b39f67ef0ca982f0a0b55c7", - "ecb6c8a7f3b971ee17aa4edd453311bb7d77a4a03841414830182e1c11100803", - "f668ef0edd2aeca9333425852c358af8c49b4f85a3745b66d3e25f8af21141cd", - "f95050167ac98cab9c71eeafa42c3c1584765974cbb22666b161849e71c5ce90", - "3fd24a892cf55cf532768c1d5624736a7562b2b188c7d126ff4156f961a2393d", - "73872d6d1f25f4ac4408a1fc44e1626855d57d4faebb3fde4b0afcbc7411641a", - "6bfc1a5ea8831f65d81dc8e3b876a0d40038cc759d19495d449d9a7b72d6f375", - "34add552ba58dc72bda50115265137bfd3f775d85d16ca0b7d89a75286b8f97b", - "082cfe47908e3f96eb669b251f176f044ad194ae07d3c6d29c1c5c4703021ac8", - "48a8b26c47cc7bea79ca6877b14c42f4b3409fb20334821ace1ec280c61e7651", - "222ee51b783cb14a9a02e1b179cf5dff348409101fb10f1a8d7613485a8d4038", - "597355758d888dec39576b02fed4361fcc7742259b28625d8566054f8e3f768a", - "af5647fa01a25e3f31d22dd392d13e4f618cbd69d48d2560dd8237452970ae58", - "355de7a7d02cb990630fd746e17cdc10a3c1b54bcd709d63142ccc2faa1ff0cf", - "7c2381aa0a8eae44aebecef94652cff66d78052e147bddcc01e264b5db872ce5", - "676fd57841d549bd90cb229b9d2912be79349943310132338532e930377df5c9", - "d743a2cdf80d8ddd3bd8563fc9fbf96ffba24ca9b59c866dbad45933c8500ded", - "2750dc686b27eba8803456348d8acae6bfe52143330a15e7a33749e9a1eb6a60", - "2d8d649194085b84db0b957f4701a36f857c0d00744aa60fc2e4e1e0c52bffbd", - "21a99417bc0c6e0250172079b372a394702a11cb903c8d3f45f24027da58ab94", - "bf5e3ac1781c9d2b18ada82f0acf18cba787ecb7772ba832463e0f330de49c4d", - "bbf68c4f76812ce3768f585ad066c28bcbc3f106b238b117059a990a5015a97f", - "79b5d21dca0ea65c6280ae2781d4605e004a5daba340a5becd00cbd9657645a3", - "71056accf2d32e26b6ed1b302e4123055c1fca51d4966a48c78692ee3c151ccc", - "9902ba28bf86735f28a9051064cf9a6caf01bd515423746037067e9de54e8fe5", - "90ef487830d9605872f07abfc039788c5a8dec9d5ac88a447c3fc68accf76062", - "5019fc9e7b66327cf4fd5c7eda5b3a404241511187adf8d488a78bc602da9e7d", - "73ae641fb9d76a1891ddd7181905477cfdd09d18c731b13b916a8add35384789", - "46afb128448e7f08e55515f95bef17b78868707018afd98440513dd80b1a7d13", - "2b3aa266a051ee69ce73f7b59652a0dfeb3cd8d31180e8291960471a8366ec53", - "176ec257533028df2da61b16b436ec5f35dafc2b90e0ab89ef4677e1657d869c", - "780048cff755c2883c34a5ff9544d95d65300f0b1c79cddfe46ea463012ebf07", - "c74e3fbf4a5034f13b0600cfee75e1e68a6086d0f30ed70aa21d864d6bf4433d", - "82a5838d91bd4f10ec2bdec5069d7537c2cc92bc2b4769794d03ae40aaa162ea", - "de513b7d2e9e94085de2fe7dbab49e62e6e526e96a2d868b9222c3e1052b810a", - "58fc29af883c7f50227dc67d0ca69c0e4479a7a8de9181a0f8a788fa29d8bc7f", - "92ee6c9b9239f7dc78bac58ec9c753306c163c1ecd861e42a317d3f0415cf8b4", - "110785f445ea40c4517b382b7d36e05a7ab114770dd0a8d3cf7fe2f24f5b20b9", - "00328bb4f0bab6f242ca2e1d6870a39468e44ef7cd155e327ecba15243638c84", - "ba83f8707761276618aee5f61a0c032b7a6fa582804e4ad9b7708ce3010ebb11", - "85abe87e5ce099b00b28aa192c608c19331172c9b3e6f2643ae08f9ce1733023", - "b16ed9e471f7ade642e49fbfe06503d806ec03ac159826495f59f5145e0e6197", - "096b64088888d7c6e5a3cf34c0decbc830ba9bb718ca251f64c185178db3a8a0", - "e243e182f566f68c6cd9793f9da5929f46b729d6e70750be3b8cd8778c3481ab", - "d67ca7bd18878a4e405fb57c5c6875d3c56d5f44f5df7ec82bb4ef48fc7464a0", - "fbe18d7936af93b423e68660cdef950fe3fb19ca91aa67fffaaf33b2cb295de7", - "7c9bd6998e1a5fda1366c925f39c7e10c4e8e0682a9fa5abe19cb0db453cf92c", - "43f1c37691b8cf39ce23ee895d4bb7116aac17c4cc0d000e38ede0a771cb9f31", - "b09a9940cad79a9d900e4aa65c3e1357bc166823a1b549d3828a80418dad54e1", - "088b8cad06282ba359773b1fe4a76e5a106ba41854b7c83a9c7f5dcba9d30bce", - "65fa18c2149c1fe45d1e26fa9507cf104f763c284c12dee49d516e5ceb36b74e", - "3e1154de8f52086d9c6ac639321904afdc23a4365d845c924d53ab4bb9023cfd", - "44e7b5c662bb335cf0439a3bd4b4a08fb788bcdb5d24bf07f84eaf9e4c8cb0f4", - "297b93df298fba7f38f2e172ebe36c1465e4725802b6040f661b0691da96a088", - "6485bf9704202b79f8a4200fcadebaf9e569592601908d98f5a367ea1ff4a5c0", - "6edba30be4dba37a68a046fa964155f396532b2c7c762206f2c3ce904cc253d2", - "f288c0b98153810f2ae6f0f30e2b6cee19f6d4a95533f594d6a23a2937579bd7", - "091341aca25084c8aa5e4fe5affded621d3c6ed181353f48eb81df9d595c162a", - "6027ebf374c606ff3fa4759783302b9444fd8918bbb22067675ed54d43921668", - "1f30c5082b814bbea67d41dcfc8c833835fc859d40af11e1ced6bae8df72b391", - "0eb3d0caddbbfced373f02c7e3d1284d4d9a7653121017634f7bf89b0f211544", - "ab73b9cb7f385e1db76bcb746621263dabefc89ed755edd8f32e4c4f76ba0cb3", - "2f979a34f9b2eaa028b8a0ebc4a2e7b596e2a2e884bd1e0060b7b342ca471865", - "554b4e3b46cecaf4b335510deac8445e8bebecbee93314b57086dc0c797e9b96", - "6e37e9b6dfe0ed1d2d82ee2a4cc17b25f4d47e8dd2a8c8391b8e2e7da7ca4865", - "cc24a9e86d9e47a4326fa7d24a421ed258d150dd385ad497383ac6cdcfb29514", - "b52677e0a1b2d5931a4658f72806bd0ecb16d05f3db04faad8dae77de7a198d2", - "fe9f649c8e26a907066f702c1a9b1c704d77e074fe047efb2a10aba039b22df0", - "3857cd57f5df486dd550087f20ea4afed763ce4a3764aaf148d816dc38a122fd", - "1467233947fcacc1a0e20dfa9b8ae954d3006a2ddbe761e1c4ad0760ae554920", - "12b7ecf4200fc9fd3ffea9f652ff9e325a35daa14d703002de2a17a797d1eab1", - "73fc024a35f866ce8aba11c1239eea9634ce4eb1f78462f0b020ef12a65863c1", - "bd944bb1326d96ebb84305010b1d2290a142b80491bd616c234ed8d10daef6ff", - "622391238bbf3c5482119ffd15c940ce36708bb3fa9d21cab31a1fbe30e7cbb0", - "a93402c88e84f8e4d14f832d97d6e3678132b33962a1a5ad1bc03654e5cb6d35", - "b31ea2df2558dcbd81767cf7eb4c8a008640dd87c69c055f1128ae940ef3ea9a", - "beabf5e4f9d6aa1f61eab39c10dd099cdfd4e8622b610b846909f5f3b4058fb3", - "817c98c76a415ebb86ceff8f162c3c377bfa49fbcc9424335bad87146f68b863", - "b0893bd7cdde6f591f925dc17c5d3cff5b83d68aa5d8f603ab588d554c6d02c7", - "1a1d09e60655738137d987f2c19c259672ec1b16e1afd5f00c45d7b1f020a7c5", - "147b263909346ecd971844de952147d6e1133cc0ea589ed7df599bbacc6550ef", - "528c67c23ffe2ce9c914ad274ad23c5465368f2b13721aeb2c9eb7d9c8245702", - "e6424e8d957e9e131619926f2546cea6a2afed56bac1605838c63795612dbcc3", - "bb8658becaebd524a5c64c3b9d62e0d0546af7209a7eeda1f87a8b5b04e7a547", - "f45ee2691ff3e51071ffee1a4fbc8d0798e03bbd52101c653f986a8f52f97344", - "234c064e6b930a95d38063fc484ca0cf856436ea2bac4b85e42109085aafd2db", - "6c27b418e3279fc287f1e3d8144f0aae793716ba6fdd39fb2e72c396c5e87a99", - "07d1d47e49cd3e5f28fd90196abbea698249afe467c19a2776ee2bf8f1c90d17", - "14d68b4ac60f8692f066b42e884c1561f131543760fb5c3fad54983f235e5394", - "056b18e0e37ee78ca9c547ba165dc3be6e084638568372e91843bf676a27dc47", - "eb7f022acb1372d3c69a3507f4174971632fdbf828ccc0b0fba3ecdc8e18df26", - "d7639202ae68d14587d3c116b7b697a104158141fbdae57f4b6d806b5a2040e2", - "eaec2187ad44dbc859b20c93d224f2cf16505142b823783058de767af8eae77c", - "13697e6866ae6194454f59cd490a286b45f4ad9f8ec44bbb7b4b2a4dc3ad0339", - "833baa383a81b85aaaebc645dcff5d82c29b2496a4ca5b4d4a1039c9fc0e6b9d", - "61343c2ac3eb1c5a629764bfca8c657f88cd217b1e47488c09c2cc75dd511ab3", - "5f997c842c6ca13af547fb5c7bea9178dc19868b84c0268667bf919063e19117", - "6447f08b33839abfc5ca47b734897b6767636b23c86964b55bb724530011792e", - "61c6710a2ab2245e2254c2dca954375155b957779b27fabc63ad23e5e781be6a", - "f1346eaba0d53baa539fcc47e8a60a95f8de4280b31ec3b3f507ac975d8dbda8", - "80431329c96cc9f0cdedc7a13deccefefaf9a1b2abd9cf56b7470f05948cf303", - "43d2317f9901ee783504fb3b6487b691a264e73628eade31bb75d2f8101a3c39", - "9b6619d466f66e9dcf7685c71985abf85f43d3d555c2258f47a019c9bebce46d", - "09e5f39e920617f68183a40a6b525995dd02e7fc471d693d80ef121683ca1eb0", - "f9fdff7ea6eac9bb49551fef3ffe478e1c0d04af764451fca7768242e12d4f8d", - "09137e78a49c7d7349133eee2ae8c2c1ed288e45d51001bb69febef0f0ffb70d", - "dde3e6f96b75e046490f74d90d08bd0a720043c9be82595d169445b7b23fb7ce", - "83ecc83fc3125b3beea7bb4cbbba929d7952361805f364d36573f8954e7ceb69", - "8b6524e1e491e603d21d68280bf58a1144867e4490ed34338ffd020006d331cc", - "f350697b60559d44a39c3a10892136c73e5150cf4491286e0c5770041cf28fc5", - "5b71551488aba4419774c0ecca45532f1e5f61f2c4178b40629d31c4844a9dfc", - "7c881a799c0913727feb5a1799c317adb62d45488e49930b2d45bd8aa2a26284", - "66f16a31afe41480820a3b4a8e4b32581a1766361fc50077f8f074fc2fc85484", - "31a2507641e28b6bb018c4a48c7b34280bfe870a622a6c0fa2c1ca8d779727e9", - "71042f3b0b844d25b8154f571dd49206e6cc10a00bff6a863bba6c76c9a5ed8d", - "7b8b9a0f6b1c18753fe25b818c9aee2c7684b87af50cd74d3410f4e405267553", - "c42a11ce1245f9f07f85abd0c6ace13c88b6e02bae5da5cda03f7fb64e7b75ec", - "4c8a98515bfc7d83e7879297195e3c3717cc93a3be1587c18e8a8d185ebee26e", - "731ccafeca6a880fa67acbce3fc9d2fa070e59366d0a8a5714be7108008229e1", - "814cd2cfb7c2434370199cb6036da67e182b6f8e1ee09478014aa38ce263663e", - "c286d19978502fb03823c3a4e98bc099f3c2dd7412580d86fe357564b1f4325d", - "291770e4a3197cb6a13c2ddf050579aacb36d18cdfecd47a4c4056960748b43e", - "39cddb1bcd8e60b30ba1aa106fb141e3fddf52c0e2be519431c0abfeeca35c92", - "c2e874bfb9756c6eabf8581543c3babe81042c86088247419561ecb525e8df0f", - "26652d14fe48ebbb42be4a6b91714f65e1f511810772379267f38db86147a08b", - "1bea1e277d8b9b50a578ad67e33b34de8ef6edc58fab137294bccb98315ade59", - "4427a3648c1363b7f76ea4017b9c3a943eefbe91d85a961e277b2098bdcaf7af", - "5a4d016ae240f263a39bc48ec9879890c67469949910c19efd461c48a5aa3e59", - "57795b132ec64988b782c4017d6be3826f5bfc89ac50b6f8bf0cecc427071f45", - "e8f0df399e2cc7854cd60968fcbb71ff1ce153e582985b7159262389d023e314", - "0d069ce5b26a399b149be30bb0c222d83730d0c60fae3f46f2f4fc6e54b39608", - "1e49bd09a8d6b1039d8c65ec01cdba173e79f99ac4b08cea8d16c0d5aff655d3", - "ec43df0166dd8e846bc431569214267b8942b1684462bd66ed3af0c4c64eb959", - "d743f50a7f23fb061f23281bd9dbdbece175b63b398673e81125051ce6529e22", - "f5f979bb6ecc1a3c07ff6c76987c1448dee2b9231c2cbe6d1de621c5af2bf28b", - "27929ea29d47f325709c6ca3ba138c012f04933597ffbb52617b47c7b75d7b69", - "ee38310e840aa3a5c34ffdf6d9c3ea62fefe2243171b1db570d2da44ba234e9c", - "1d4062e5e15d379f7ae2ebce701ad0a19d0a3be821506f6b181cbc1e4270056f", - "f46afdaf19f7b7521d927ac810aa1c6c353bcf3a8b7ace16c42663cb752e018e", - "e296fe50d1d9c7b78cf953c7c1706bfc3b81db9f45163c3a1a1b32ac1421de80", - "20e31df91b0566da5387b92975f08bf958a1c5313673cc7d1081a231a54532f5", - "c19aa1236b56c7021ad5b83e05aa4455a775690cc6395dde66e9f6aca5e85c39", - "3d576e2173f4685db4d6920513b7a66f9056bb91ec9fbfdaa09947697a48a81f", - "a918d77ad8257909955ed086e1245ed76a0045eb0356517a435e6147338f0d06", - "3d9c806731b9ca80fb1366500bc15204a2a2027a8646a4753548c8dfd43d7c5d", - "05287cc4009cf9b3f5b48b5ef4dfe4bca0cde7c4c7f266be2d27d1d241b357a4", - "af76e4ac83feb61ba027272b98264b6be46eab1eab6b1242976e53d1f962ec79", - "3d6f9f92dc60562a92aac3dae3f87fa59f6a5dc9fd554fc6ff87a5431472e362", - "a8897ce86346c10da119594e4f8ad907e1c3043e74bab2f1e7ceb6993d3b712d", - "07fe9a0664b7b8d03b5a5ebbf0f2f455afddb424a394dbb67a6ff68e4f1d4437", - "aea77178f9624184d8127bbcc01ceb54755bca7bb69198ba1121f7d9bac27384", - "a3b056a256a0608c2a7793de380c40a1269bd5f712cfa5718f28444624581cd4", - "538a8d2e5c2821227cad7ae037a1a72dad24bcf9337eda8cc10424462569c0a9", - "8769af545447314810058b1a526fb625d474eada1106cafecfe6385efe42fcc8", - "350806ffe9c81a96f093a5eb36f3268aaf200b731cf98b9d795d724fe87976ae", - "9b11ecf1569d353a66fb2bb7877b8905744385e7d5a95642291df162ae8121d1", - "57a9bcfeb9db75611c74c09529b31a578a3737175fcf2bf3c9996b377a5e2313", - "67c7a0bd53a2a156425a82a6b31f680fa7bdf5dcb4f2810af1055044ab9768f5", - "c6ba7a9c9a67f9d77a813d64d46ed870fb739a3f057c91788df23fe74ede62a3", - "fddac300909d3fc6263c5d153484a908fefc7bb31430cbe1f44dd9e128180767", - "b56a05d6d528c4c277ab73f201d5423e90afb5224bceada040125b3e5549990e", - "ec4ce6bb11a159dcd8918feb799735229a51689c94a6571df638170df11f6709", - "f5d5dd9e27d8f1b849832123c9d5aa14f44d8cbd7d73cc645f0be4cca13cf729", - "3c0bffc6ae1a66a8d87205b051ef9ff0f2e3ac9e253b7f08427edec5d7bf9eb8", - "440da2104eb2a553b7200f7f91651c26297e749e08cfb198edf651f7388c078a", - "92a807c1784dfa9362d59fd38310264429a34faadb4d630970f432fa86f9c52e", - "f01c38be923e34f12862af54ce1cea8b52ada4c05b8f54f0636fdbca980a4d30", - "9e50ee8d2f22748a1b8f702558731fa85c6ac2f8cd7b0beff7f3cf156ece6d5f", - "acc032146b8c6081ae9ed4ed73044c4a41027fedc9801d0782d751842c36c836", - "69113539a0c3930a1b3f051ae8965e2d8b6be84892dbde58cfcfe5277bd992c0", - "d86057fe5da34ee4684137036ef050f5c4cbd94d050164f2ed4f7642f71cea1c", - "1af11d059a69d8eb11c731e64d42f1e934154bfa3cdd7a6d49eecf57c42dec85", - "0d6f19ac13d0188d601b53e2ae32062460d2ec1af86ca143b7e879232bc84949", - "3e5e81380ec6f8b135bebd6eaf789ec4cb0238c320a010bd6d9316e9dace159a", - "db5ef308acf89b1cef6c9e1ce92b262af6ab7553ec97b954e5b6e15e91acecde", - "71f080e80aea117ddf12f773ee9ed7f98f8ca9bad9835fd60e8a9349b5244560", - "e4b46a5e65e5e644b558a0ef4b3bb1d2a79ef7ee175d0f4f5bfaa730e77471bf", - "87f39244fde1967c862a93589cf0507caca8ecb17f11a8c62418267c9d42c09b", - "f5d25c9ef5e6631a42492e4155348ef34e71ca473e77e2dca0e0226bb2de289a", - "563246b4c7d89b2aea44f363224a2e731b12eb6956b4a408679686e2de2aada8", - "5de2fa4ee784e05d00564e406a3c748aeb96a0c737786b904bf258fb68eb97bd", - "f29c12df6299eecec26ca8602561572ba15b603e3d2ee23fa03d5b716c0b475e", - "15bb27e1178b0db281cfffe69946a69199302fad98c899aec34a7dfef9378895", - "b4f978b3fad0dfb328b23aa82b0df3c024d5d61c2b7635d94a91d6374bc2596c", - "e8ca1d13a990a10a39567304a81be148b87a69253e9a590ea17a5bee1ac57f33", - "e760f6fd0e358d6a81c061fc3b2264244bb5268de4871059cb5a812c752fed16", - "523602d5064845ad4a68648ff0ba8ac30e525f5d2eecbf721c5ffda251f99369", - "49f77c849b597d6186dfb406b425ea69545a8c2c8351a2ca743b7bf39f1fb8c8", - "4b8be296502c07ff0057a0fc33c7077703578e62ae8267fe18ab60ab164e1d5b", - "8820452561a00f52f45ebc836ca5100282d52f36cd34f13c3c035fcfa0a5aea2", - "eb3f9636fa95ef1d2c3960ae4b14bdfb3b314d1972d83651c9dc8fab31be1f32", - "cc68a718ebbc10d7ae4b2db21d57d6523a6cd3830f5158820e23135923bbb2d2", - "6db858cb81fd5dfe27998079542422aec227903d294ac9c0f31e55dd8f1f715b", - "b333c367b9bcc153525221b6e420b356a01cf8279f45e98affff157dbd6f44ff", - "6d095275288ac2edd473cf05652de674ffecbd8cb8d0b8929c49843645027d2a", - "56cdb50e9312e3b04d019fa3b76ff022ed800c42fd69410508733bebe74950ff", - "379a2ba7424c9b155af4032e148bd1eb893c4dbc1dc91a42a7d54d30190ba506", - "d7a5d1e583ab078e70b0d6833c1cbed5a681a319b7bd87160c9e1d475e962209", - "57f77761d19890319db47ebdb1bb5e297cffcb70fab1aafe06530ad321d7defa", - "9ee6c789084a0f9210b03d5c4b67bae60921d0145d211503ed4bd14a46a449e9", - "94c47f390aa96aded9ea2c4c045ff66a9c5f0514f251d8e23c84ff771aeb99c8", - "c57b5c1b663a6321bbbb470fd23a388074f8045f216a65fc2ca035d8ae76aaa4", - "6060f407964701990245f11cd6a9ed38e3a4e41d6e1481811fa93cb86ac3b851", - "7ff7d8791711748d3b6cb0f4f155a818d6a6984f4887cacbf848ae3509cd33f6", - "afcaa518fc98c9fe263ef2d174ae2cada36b487a2e75e6d285ac5226e0c7f227", - "36e685f4a1e3a12112597fe57b02586abcb97f7506fc2389ec47c4c6cdd475ad", - "d26ed9fc0262534d6ab5cd87ee8a72e9807988c4abd44d7b710763377185265e", - "00efa258d77fa512bb256240287eff93336c6f8a50fabf127de05024d112ba48", - "b39018f6acdc7a802aa323a6c32a2a3246abdbb7e9274e6e2280e630fc9601b4", - "54a7fcbcee40a9ec5cd82c206ac0a4fdfe5f807521cdd3e432c0dac47dc0aae8", - "4fe0711b7b0272dc15cf0f4395c8da1a1ee1ef9bf0b69d9b399c991932c1c76f", - "50758649ff07679e44d2c0ebf4ca8f07e987788a40a0192117ae22b56655deda", - "2022666ac563c587d3b73c9a39776806008d21aaf57c1da4741aa4ed05b51538", - "7cf39566a34f58b3abeb6549ce31dc270c2edfb7c574b1ff07b1fc6ef42bac73", - "4bc48a6b3bb966921f87a9a52b077444edd0f50c73d4f587af6496779dc389cc", - "1b979325a8c3f101b5fc62ae8888f7579024364f4077fee938098205edcb2183", - "c38295b6eeb3a6ae34bdc3fed8b9c1aaee7b333dbd3d855c10d653fa16375227", - "0ff7fff0aca61bec38779b0da7d30482052dc4f3b0a52e0c945b0a3bafeb80d5", - "c0790af4d34d652fd3f5abd2aadade381d1f86869161823a9a33294fbfa783f3", - "ea02bb2d121230261ad92042969409ac928508e074651551ef4bfafdbeb5ed1b", - "8e1b27824ade370dc1fd5c97e85ec7b30825bcb1da96b61aad8307d0e8b37faa", - "9caca395abfdd03b9d89a51bbcd68588f241cd1a985ed97263c7044c9fcac5c7", - "a672a22320150669f09bb068aa3496b62bc665e575d2c70bf9d7a1c277cd221b", - "93708d95cbc4189e5d9f1c1dc7ac7e991b6a3e998598e39415328140f004b3a5", - "238990c23ed3962edd6e6bcafaa0eb836c104717d62fddd10bb46b67cd6668d6", - "154c359c8c5975e37c3f8c25ff27a0a336b1d9d7cf6b2559e65a5a906d3ba1e3", - "b659a192238cb7a93a1f7754bbf5e17439e2482a9546cfdf1d65a66d09f89412", - "c12ecaa19eb4fd98ba02c82e8d8775b90edcd875504f3cf0386cb9b954a0bc59", - "49df27c65c60d4535e088040aed9cce0fb6467169597bac17c71ca5c6b824681", - "94f6c66f0b074144905d9679e1312e828a5340209e623aad84e9c9066aa0017c", - "c1d719641ecd47db77d9d3488c1181a6c3f2c478cb0435c72601538f0de15382", - "84b30f4edf8f6853198ed54468376b61288b19e4083e9bcc7689285ff5345669", - "8258a32a2b4e62d1f25aa0838ffe1a420cf193dcc272269faf7e480b538be815", - "3c4ef74147cd5522e1ecc983271b6a70dc10fd30fa6b49c572f6d5e21d5ee1f9", - "554e96ae4b94164221e182a78e100ad6d7d62455559e9fcac5a2aeff12105a0f", - "db682a43bacaf7eb35663ec68ec541c0e4f1ee3c225348db12a6ad76f30d7271", - "fa37617f2590eac8bd1b907af2216fbb02c23eaf7d53be317e9f8c1a6fa5a46a", - "b26b4f7881e6957a6907f2ad2a5a10acba466d769a7637029c7f5564d3fa4899", - "ef2eb1fd45651d99c7f49a8ab26db5f7fd59215c6f3372a2463c8fa47251e3d4", - "3f87a1740129a9408b842729db4cab55ead5eb0864e4dfb0108461fcd7cb97f8", - "678f123c973f6ceb6f72340545a694846f2144955173bcfff0bae4c6a28b3141", - "2c53bd526249ae9a21cae2cb7e1e5dfae3d4b2691d7aba06b50a862fcc8afc53", - "8e8f80649db0ad6c3be8826a9b040beedb1a91b06e17c2af2e4d22918756e62e", - "410c3dcb4473b33548464dec57907b5be124a2a8529d0e10d0cc563ceb66cb82", - "86e8cf52c5a2296c270ae535083870d2caced177601b21bbe1b90c1abbf36af2", - "c4f41be724fdbb61ddedb812cd4566ab1b405697301233c0bb09be362b1b800c", - "250561c6ecba4d1a1496dc5006ab7ebb8ec4de9cb65c9252f6bce34c3ed01820", - "18d828537fca70ae6aee61ffc3bc0c964fcafb859aa2b5cdeedc49e6dbe224c0", - "5230aa377813e250a64fc8fb9ecae179da0cef09393c2984c61c092c574662b5", - "ed9d85bf293350b50e1fce6bd437e1219103e7be490074e0923ea0585a18f657", - "ec4b75b5d14645b3ed297ae8f2cbbc506d29831bb2b5052f119a7f61f165c879", - "121a25da14fdcdd73efdda66d2e9cab4420bed56b35733dd9283f566d551e7b0", - "5fdde484c007068ca41d13c7c06ad4dbe3edd26d07de1aa3665da55bc2e07ed9", - "e5a6c4ae25ab36f0cc5151f80315ea09f70994cf5acbbce1e563b185261326f1", - "494430200ce55f6d77b2aa83033ef759c60882a96dcee881a801ae9b4ed7fbfd", - "b71ce77355c10fb6059d9c83aee47e73464c3c65a398de86156c22d67d68fb3a", - "7d5760ca5642742c545c71483646c7c4fa37c30c707ddc4ff11f5becf1f17fc4", - "8f9e195711015927b6b2bdb692e4f70d6cacbf8c4fa0b66405f2ba5e4b91c0aa", - "c445a711812a2ec21a0c6329cf85b964657f7318bb0f575c6ed266aa0877f333", - "99e465edd95b88d0381bca82f79b78521d97ef5f4c79ef0c5bb0cd1698546818", - "e0bdff5d77120e3cecde30454dc8f2f81aa62c8b98c1ef6a99cecba6e7be0a6f", - "8e508ade4fbbbd00ae1e643ad11beeafaf842a6a728bf6dce310ed34c75db01a", - "9f6f6a00e45a9525b40a352807942c5689e7fc5e56c31ea3718d91a49c10ade2", - "fefc7bb0c3dee0eed06882ca73caff097230b84f1888e9aaa9f03504b8ec1e40", - "eb35c38fbb2aa315d4baecf5c9a21cc276e9e31153d7de9d46a34ed9c87a14c1", - "62a476d3ecc0eb6c658555bd9561f052a39ab0255b7451b0c4036a222f4e7315", - "6805fa74679df1c9c13dabaccaa5e6925b9fda6a3d2087cfa0445afab3a1410f", - "e8a2030dff5cb8a7275dbbd73c420e2e65af82d55b40d8dd946e1684fe2267c1", - "818dfddcd9d4150219fb8d2082a15795f18a53d4e33852db0ec3e30d43bed248", - "be0ccc7ab5e8ecaa4e9d3b834d72bdf4f3c9b8b9f91cb4d65268630cd56ad137", - "dfbc74562ddd117522337c2703a3959c95da437904eb127241cbbad6828b763c", - "d7ac17beb9653e205a2e45e877937cac7403405a2f3dee3a57d533713f3fb93a", - "e9c177990302398cf09d99675578b3c2d80ef322c76fc9944e80429486153fb1", - "ae61333724e8d00d21ce5c97acb68985750d730663feee35276a1286504334c7", - "514070d9a9b4704b338e598c540375f4704f0f7fc0ba5867ddcb6ded73f7bf8b", - "920bc0bbaa5dfa031b29316fd83e3ac459328ae78af4379f06fd443f352de0fb", - "300f588fa47b305bca09099b78a24873a6c48c7b2c66a37b96438b7fa92431bb", - "1cf1a29a0bfcab7d1868a6f2a9a208f2e2de7b069079e1b14205efd147f07b29", - "a08fc205622b0888812b116d57b1d715489edf036d0e48afa7f44e86d58112e1", - "e9f6e744cc97a8c8db3123df75503449b6b807d452f27ce721acd7b743d231e5", - "523fbe3e6451eb6d47e96cf19abea2bf5847faa0d2b1855806afb066dd43a879", - "499b0e71310ca98c27274ec50ef5805e82a5bed0a39a16e3d6352f16b981fb8c", - "3a6ed69f75d90e2e618ea431caf3275840048a67f6c9b9db339663206ecdfd7c", - "f58fb5064e08ecf169dd2a7121880e9156d422746e15a88103ac2ee9e4c9530d", - "0994521b83558a4b4fed0987a3cd2b250ec254f739381fa79a8046525b30aede", - "e3146a6cf3c0628324f446a278dc252de317a43a4fe2db7dd46d363755de9d98", - "8e3c4acf8b04a0f58fa4fb3963ce4964c9d20c74e39df714b34f29170182f49a", - "44f7226b437009679cd57ede47e69e9b184462147dba44455aa2c56b5163b850", - "207657d57304e2660d9475e9d2cf0429a0727ff1439ed78392c103798dfbb024", - "e3b5c9b5ac6f48fe14af663c503103cd07ba2ca75bd2121d83884be35f19da18", - "6ac5a39bb5841f044be76fb64a6e208894783060c5c9459f4363f2dd9d15ed94", - "7882f2223be270993edbacec638ae0c9b7dd57bc6385fd8825fcb37ed26df782", - "65c51eacb3b388b56dea9f4c549a4e2f81e197a46a85777673be8bf6582e1b8a", - "a9ccd75fad0e04f20087fad8b0535f6a48abc761df296d5b82565af7910c0a31", - "2856ed449e345dba383689eaf9515143ccfa9042f7859f1f07b37f2f8bee6e03", - "8c3c0ba41e6a558d80e1561ee31d269bee1daaab600e1e3f4e7d65999b89edf6", - "9261802f14dc1e86e62c6b5aa52710c77e9e8b96243e37a942e7bd5e535ba4c9", - "f7dd4b2482d8e8ba2bd1d73e27a6a0b31a3298d827927ec7273d08e6016ea363", - "ad68ad4e31e7f9276ffaf6af6429ee29ebcc523cc102611f98c0bee3ba4c9bc4", - "bb73d624290fc638f8580690d452f94c0c02a17fea441ad20acb05d2676f6851", - "adb98f8da26fb08540e3c9947288b5843c33baff82a62aeefb9b1dd4ffbbaac1", - "d4cb1efa5148e6255bb869fbb3cdfa62b2d756269341bdb90a8ba948cdd98054", - "8306fad7f39d1d97358d67802708ef11f51859d270caac88666185ddf08ade81", - "fbdda25fae9ad9639112022ece4932c55d22cad20bfba1f1e4e0b2d4b1abf7e5", - "7c077d98cc236f5f3bc8d2897923e593e00990af0b20368c36231500a57ef033", - "14718162dcf013cbf0fbb10482299300147161f4e4e5ddffdcacb5186f326889", - "29d1340c2e3ed16ace442f4a2f6a11014134a3e99c0b8a76cb8f6fc964ec18b9", - "f246295e6d2679d07ea7eeaddbc982cd85a34ff9fea0e58ac9d1f346bc58a69b", - "9c9fe5701870ff8f844d6a763abe6f3693024ab6321dca032d5d6e05d7a52e64", - "d68702b0358badee50da85202450304eb87e41c3b94cd0837bc39c9d5bd05168", - "809895d4a4089509c7f285425d2278a4fee450133ba439a2a0c18ccc9b83b263", - "d406d7d50fc0486b7281dffc65b2aa311734129478fe9842230c46756faefb92", - "b7c509f39918e61187e23e02dc0ee18072bf5dc1e6b0e8f657db80740b50baf5", - "31d40b8a94be3137d980703b62bbc396ff8a25587ea7466383f42b7e4f784096", - "201dd791b3b1a91736290676c7a18d897999ce443a95326cde23fe61efd754b2", - "1ff2755fd19c54f2c3fed68ff44ae1a1d1396f070936ad5134dde0498a51b6c9", - "bd7f8844f3d9a420e1959471f12fe3cb8e4e8d45cd829c5c9da143c67a31cb9e", - "fd52aa3f78fd770d840d3dc3cf6c89bf5ee5d27e1d72a24d1bbbbfef9cb5048c", - "1e5973fc8dd82ae776d50ab51ce5635128e83a424b6844ef731f16896dcb11ae", - "d55c403d381b0548bfef875ef2d36229dde039ed2f899d53f2fc26e938299a35", - "b8e4e1a4ad3ac356407b854a68f7e304e2d256dfa9d8871fa6a3d8365e812e74", - "a3399a5d0b69a45426b659c5a656d8c3b2fe7171c383b057a883f9767d1e484b", - "af5f75b2a901bb16a185beba84ba0e794d8a2c51a9cd280e6c93cf0d572100d4", - "65cc78891819c326cbeec8a2a71f7e6cd7caf8a14f518363f997d701304d7d9c", - "0bc1055ef2882d375c20d9f728105afca39ee1b96e8c04eeed589158ef50f703", - "e1893fae08ebb70d8d1036a91294e362347e42c43a6be8f655b5d97ec205bbfa", - "a589f49cda877cacef39abd6a51624853e6b80305c8aa71584dbfbe1ba4df090", - "1651e589d5f9d8ae051d529145a0223ff49312b7a014eb7b5e7984da03846bd9", - "659255940f53952c9e7e8079efe8959d7fde4c51cbc79c2ae3ba0a22cd1bf8dd", - "238e90dde888d9ba6055a40e1dd0fbb1cae7ec200c58b9769be869d52129922a", - "3d63a1a0bd4e80bb843578d9fbe76278ac2f7c5d59b72e898dcc0f904d09a541", - "9d953ab82ae5af31e263d6b589de97c3666d0a350d87e6c34eba6c5405330413", - "121c59e67564f880a8113191d8e8796db1f32216858d9923a00f48045ed93cb6", - "8f1151cb2c93ea1ac0950a8b1ecd9e297cebe0f1b4563b9f3d49cac2f07564e3", - "c530e65578339280dafe81395a32740f4a86952da75f667905d8cc8b67262534", - "476f3343febdac2a2d2b1ef33ae6f9ed9da5c56ca9aa05a7444f972c2a4eb13d", - "198bcc68c8da5c8ca74084898fb642a7a298192a8a131c853ce1cbd077f3ec8d", - "6d03d0cde83f099c026826ba54494cd6d3fcbd4bdfdd36b908aefc6db98fbc76", - "506c21bde6aa58509c373e71d307b9fb49f8465d7262ab9d0ff3bb58ddd73cf1", - "842c03661b397e6ab63c4307658764d817600bfefeefb3f6f645e106354c54d7", - "eaa31dd460e7d2f5b4c89360312c557bd0c19e93ef0b372b79349a8023ce8358", - "329316f59d1d9db7899bb5b18a6c2df3023293063823a0f0c1eee0764a090d0f", - "a9ef03ff98d1e875ce450715ee6e83267b0dfadcf075f60582d3c17e40f38ed8", - "5025b067a5ea9eb6a0e5ab0d399ac38e799316716f890b57a375c91f1c403587", - "fac7568466e1357bdf1420a12d70fdbf5888a26f7ca9617a40779378f8248912", - "9e3b00f1af62cf4a3e66fd0c8cb7598026191546714e48d6003c39a92d37ea8c", - "29821a2ee6be4e4c0d947f47e61be1a4b2d68930ace55dc6fab10bc5a89c1daf", - "a9a14e74879202b4185386d772bacbba0f201c6917a76beec91f4ebedfd98acc", - "29bd51d9352a3f0358d2c02a67facae15205a7d0f40d6254f40cfea53d30753b", - "f1a349fa957aa62bf7cbf615eb5cd7edf3a07b2d2e07d6af86f566c11981bbf1", - "8450ac68dc9dfc32889e6a7d8b0d2fe7304398a2e249288e2e30f0f354b6a9dd", - "5f84926fdd893661894b12f1822b92a109e2dfb5f1ada2345ace9064c237a62a", - "52db9115f293541353a4726a500906d6f9062926fc9b9d1132bbfe32f26019fc", - "e7aefe8cf1d51f2c10472357efe251634dc1755449d80bac0a52dbeb634274d6", - "3555ee0e7297b5ce36ba076deb949c026e66958c29d11a7af1b4c8201f2c09aa", - "d6e2e48cebb561ba61765ac719abd7d0953bbf1516a5e60f26c8e2b5c690786c", - "ab4fefe7e330fcb367d58a020347a016dfe4cf917379de0e0dfdb9cde57d80d6", - "37fb3a5d88afe6d6dd2ba5e1e27196f3348d7a50f09996c55727d98da46b3153", - "d06bfe7b6c6e2a0c31de3aaed3e0628d284437438051a5d8f7776e41cca048f0", - "deaa438f8af899b164e79923532dd9eff5b67ec99c4f09093057944a54920408", - "98406e62fa9f0bb996a0a0a49db9dd90e58d27d77452f21c39eedfe92b3f0cb6", - "f3418a4b81587d1a1e9d6659cd13c9a91aa084837622579047a739d8f95ea31e", - "9a83074aeb98fb469a8743cb96280eda9b6aeb3b07d46d1fae218a6fe28b408c", - "65078ecfa5210343ee17a1518e4b326211b7137f58f9ea799d20adf4ead6a4b0", - "5deb9639da1074a3625c992ac197f60177b6a1221cf91819bd7862b93fa14fd7", - "5cef1d2d3e6c63cd8a8791a830ff2f71ff55ebf0ef0963036147a84f1e103ce7", - "b1b95cc941f32ddb1447aad07b3ac76a81f8c8584634f49cd8cd1a83758c68a7", - "25b0f89d05a69f4250f0cbb2ff09a74e86bd66d03738ee3b4669306e544fdc85", - "375d046f258957d5331d575174e8b0ad536c9a4820fa99039c05a772de8d5ce1", - "e116df28b9af0ae39850a0edd341c0c0318482a5732dc98d904a2e15d3018f93", - "d57288e70a4f066c28ad7a3e621158074fd62c820ddc2c3922dfa27d3dbfaefd", - "7a916284436729822c7e5775615c7805318c90bbc83eb0ffd44b567530919afe", - "f539d56f07680216cf0181a910468c293921225627f2471d61dc19bae5535237", - "c00079ceb75fc203ae2622c9eb5c8fe4d4b66e7a23ae2f81d8188cfd035255ad", - "529c824fbba98ffc6711d08b7ba1a81bd83cce1dabb4c3e478eed331db5b3a79", - "5e9014ad4b79e572f7df57c0f264bed05ae24f327b6299cb5823eaa10d029d4b", - "e1d475904d269a61f013418252f28ef6084b08b643be2c71262f257c03f5312a", - "ac5d416ce373322c04ae9024ee1a0761250629e5c0fb6d7c9db005e604fc59b7", - "3e7b3c4c48f76e800728574af31f77604edcef9ef7cbfdf386f6810acc737d41", - "fa7dc1e8df8d1de8fed40bc74471201d19fa63a87ce474a3f7025272f5e70794", - "600b850b6a5b0bc035d68aa6eb29d54c54ef590f27bddb51b2f8fd13b58196f0", - "c76679860875511aaf3b8639e6b1681e6570e1058b7eb3258694451ebdedbe70", - "fbbfb78d5571d2df62ad7eed3b87f37fb9e782b58e3b229326facc9e99af549c", - "2d33e1e476742a47985e4866c441a317b493d181852ea2aa18a8ee9e8cffeb0c", - "428410e6b45328ea4c0d27a80b0c69aaf8df4e8281858364e409fb02d9d46777", - "c4f1b1d27f7a7feb89b405a410d6cff5b0d6ecbc39850e232d172c3f2df324bd", - "979f2bb30693e78445393dce40c25e494528ce40ed54d4a20d11747ab15e2d34", - "27fd207be58d67dc2b5df744d345ede86ec0690f4f1641486a2c455a98135cf8", - "4524e09eba4a360f99194861ebcfc4d9c10c0f49cab53d5ccf7f7ff1c94bd32f", - "bc995df2ad5fc71ed6b044eeca151588987d8674a0eccfa3785fa76ea1a530cb", - "c0587682ae06a50c7558d6588ae5e8406e8502b0ba6bf75437f9fdab91ca84ab", - "eec2e3b2fd93eac06500e4543ed8008392f01e7d063c16526e7af1b29fc614e2", - "66be4e9b53827d22b8ddda79396ffec4a04b734631d21b9532228411e0057e7d", - "00423747657c2592359afa65194a829f0261495b44ec9dc20ac2f28cf9c70f35", - "2d9839362b6217f4773caf48d045f81af4c64bf155bd7b2fd6cfc31d4ccbad01", - "8846c958837716a318320860617726c652b0421de5cc6f3a616245bc205b71b9", - "1f5673d06a178bba9e33d8d6e38984e547a6ffbc06f1030a0dbee09735ac84d4", - "bbdd3e9baf7d9d93cf19611864d1d0fe2b887b420bdab426bab53b15c37ffa60", - "2ff2aee98b18b684d736eca20b1eb14bbf724ab2cbd29cdfbb23d1335ff0de02", - "d476a7e4cecae81772219b882a239d75721e799d34d80d7fcc28c6f7d04fbcb9", - "faaf7994653dd44b2c393f5ad2997729babe4aee15b0bdaae9fd37fca92bd7c4", - "0fec9b7984718123ef618178a444bd16dec3fafab7d50661ea5ab2203415306f", - "22238fb5955aa3f2332314c2ea88fda930d6d68131b223935374718a3ab14de3", - "ad3740e5b349da03a6ce55ba2c888866f215ac499d10b3a83c5b9f1e3dbd63fb", - "ffe2281f03889c72c2ef44da228c9824e587e315f1be3bb62ce20770d496ece8", - "25a7c385dfaa6e7b835ce33008abfa3e561a2c04e18537f5a7217fc57ed9bde0", - "5e4f34d9fcc13eef72f43eb4faf9e3faa28e768558c48c5626040885fcc682e8", - "b3411675ad4d614a331775b7d1e4b0982c38c3f19536e615945cfa9b255c6935", - "675ceab95a191d3d5ce5faa484caf2cc88531018222d52b2d39724ffd98c07cb", - "4f06c970fb0e1437eb951e3ee48f60b04f491af9ea7e1c1c3bee9002d639283a", - "19e3c9c3cb8552e2605ecdbfcb4cb34307e93346beca0dfd280ac769144fbdfa", - "037b9250050a5372ccb6fa1345d7195ac2f3c650f6ba80a8157650ace9bc711b", - "9d2a47efe96c449f52d85c8131920136e83b8a66179cc6adfd16390d2291811c", - "87fd4e2c7735bb6036f0ccf64a4d82fb65ede90d63919ee9f188c5ef33c8e6ec", - "3a0ab4d3cee66b92974bf4b1a8435123d1ac360df16b241183d03a083ab163f0", - "6a4c62103da0c511c42ffa689785f00bec49f1f7536a92c3839042eafc963ecb", - "6ec7435dcb836e3e84e44154d0ad0e56840aae9e89416f03e1b66c1ef57b52c8", - "ac8f5b8d5684dda88fcff004cb8561de245bd8a80f511a38b7ed67625e631650", - "6f059ff07261995212355486871a44da657698516be2c3ddae2fb05233e6f633", - "514754c767305a028eac92c747936e623839c9fbff510b37e2f5bb15173d9dee", - "cd6fbaaa6bb88d691c08e8d29caf2429d16b55c6e96a01e2b5b51c5a273925b2", - "4212aa1dba252a0e3ca4dee553f233105ad8097b0588f767b40412f451590830", - "254fbdde002d19e59bcb395165cfec0728fc8368747b10ae84967b4ec685a401", - "b50ab46aa1c0219a736d84415a58b3ebefa47850601087fcc217f68b5f54dcfd", - "95e6a0c4feecaf8500df5f2c159204b7f81bd4decaf1e6f4f61a1e98e1b789a1", - "cbc3055ba4cde9c05e0fd5f71be33becb9fcc665aa700cd090c38862cdc38c1b", - "5781c75f8d9a9621d116331e5418529115c8ee6c089fc1ba11b2307d16bb11eb", - "9334a4aa6aeceea55fa90ace4870896e199fd2d8cf605704403026623fb38013", - "d1716d1f1c74f3c5af1713bc87075af208a02a55325f336cd64094bb4fdab6fc", - "20e2f16e1eb869192724d23139558138fa06323ef22446da8f27d57785135091", - "53c881933e1277c547668d44e051633a9688ae47b4516c2e678c5023964a3bd5", - "d64add8910c59ecc6c0a1bc29c2c4b3456765f9d8cb23d2d4a68bcc403d22e7d", - "5fedeef918174fd6a2448803d16bdaa5ffbad42ec44c129f42b6f66384912233", - "3932581c9515e4cf7997cfd78ede86a8d8217af2daef70b30539523695b6c060", - "c3b805ec1de7736107047a5d2a56cdb0758b43ce31454ae7b5e0abf4d053f98f", - "22088f3803fff5d9e9e77f4871fc94a88d07bb15d19008a5a3aaa766671b0ad2", - "dfabcafd40633dbf0db9731a849b2e41db445c8ae195dff2f41a9609456b455f", - "716a77606a408b815afb55470dd0de0c55078a5c7c6b7d93b7f55cdd46f3e484", - "c304db6dcb8010f8fc503cd912ed967610fc1084f2dc0e8c54b156aa933ea6bf", - "a9c0162cf023bcf5b9c13a9655d0451be64a160df340df1d5bb3e2463dd5223a", - "4bc40f226e54913e4ddb6e80b7d27e31424e718ccb36b44ef730e0f44adf6460", - "cc1a9b27341ac827e62df5e0c0cbc7275966624412c15c9dfcad2d2d953d03c6", - "fc6abfb500a1377d087258a9697cb11b831615effca9599f402a9337e6bf2740", - "b1276cdf5a63a4fc9868461aa19f3f0e3fa86e811f291c73962513470868421b", - "07721ec94ca98b80fc6258b41610e2d6e7a41f204ac28d87ca33ecbaa0c21a59", - "a89dc9197196cbdc077704b37a49f3b11f2ac7a0ae3a01ca20b3b5419b789b88", - "c225a7de8f8b9a4998b9660b49ccc4456c44f7b91e2bd77f191600af1dfc6278", - "eb182eaffbd5b6596f19a3faad7eb060c3a7be320a64e89942413f0456e9e759", - "6cf66a3293b2395257eef2bf3b562e83933ae3a5e44f82286de10680efaf5ca0", - "f6171610e512c823f757b4562be002e4cc8efacc271fb7a276b327206eb02878", - "7a75a203cc3eff5878d49ca58d7976b37eec99b9aa56c1603eb002aa3cd3e38e", - "9fe88d5d789b6f6065df8b48beae032d666e178efc68c556b9132f3ddc685707", - "0a2dc012933ee9205b6cd0824158db4aafb9477e2122ddf1ed70db02695529ea", - "725eec7bda196c033ae621fde16bc0528f6d648eb8e54320b708bb08a50ecd0b", - "1993d2be39ccbb98b155f30ac16fc6f5a19240ef18b12275b74a17eade378546", - "eb55f9a054cd82af43ee8f0e7b482752b75799e5facb1791525896126d162452", - "755031943f94d32d2bf037c8c72b58b4b5fd0b3c516dbe0c758f861932b49009", - "9654124fd21949a7847a20c68563d4a7ce37fc4f09fa3ab880fd86a634591f16", - "0a99ff89ec286ce662bd48bc8aad345f09b998c9527a3cb75e4bc98a40565af1", - "8f1cda40f9f5d63d41d15500866c617d9eabaa444fc2cb7d4860f1f46ef47b4d", - "6b6cf4ce8594e905d47b4e623dc8d1f8c54d9a621737bfa9c3152e32b9902fd2", - "0f47c87593d648a3df71206023cbf272709d607717c58736030335fb79df94f9", - "e0fdabc6e0c697d1673d220dd4605edc89a666981f2b84ef0d2019bbeee20911", - "6273dc43f9e8effd740ff91216798f946925826c5e0d1888dcc3565ce4e767e4", - "7d30dda8ffdc14538853a6f8cf61ee5718810289baee2db33609ea5b51087145", - "3097be12e8410b1a6cf6b9807c34d4328163912844fe128101854fd601c4350e", - "657abd8b7351fa6b42e1ed1d486adcc5e7f3c6f9103759bf3f0c01650ab7a1c0", - "3bb6b6c86e723f6caaac7d27a06195c7401e58d6a7c67d95eaf99bd89293af7e", - "f168e2ccfc3a96a60b4e1ff110ce564a35bc3c63002fb03133c364cb3f8670ce", - "3586881d2ce75550c34d8d455a7eee5d8905972f4e59dcff5631f68d1952f022", - "9bb4da37680af11e4bacc714a4894dd1c1c0f876a7c66d172030540d355f6d0d", - "9f8364605132cc224430813cdf98c3a7673a8b2a0db526a4bb2f281bafb70877", - "1fd1eacf13334c8a52c30ed8d1ffe6aa773388c32526eb1ffd5898a50e5e17aa", - "af2a9d9ee5a0b5eff7c06e16882f9dcdd916a15f8c476afe79109ca801fb4ab4", - "fa169ba983ec0ac72658e744199a169041c35e4326b8f681b13981e9951c2a65", - "a546314161e00ad94335ea8d7992ded9209ccc0a787eb42c40b2bb8ab72a5c8c", - "4214f13848c3f9d51f64a1cc19397eb4fdfa9946c015fdb8fa467c9a2df8aafa", - "f3b447635c067f6cc5d620dce31e0f171d756a5d4bac3fcbf543666a2def0e87", - "8186ccc4a2f9f97248c2364ea805dde019d83673755cbc2062f91297991c3751", - "4b78a2f1b4c4d77da954fa8a9ffd69acc418d2b13af0b9072e820249f87749a0", - "11a43eff67dcea7551960142db7f92a5046031b336c46c29ca2381c806168075", - "c0b031e018113713106566a5358970f6d3150ecc40fe3ad3b260d75625952103", - "4bce57bc7f0f336bafbf9b2b485c33c63e2a5372a0db8a75062bb2f5867fb839", - "1dd864c4e1534611eda8ff9dca06ad6b6c2adbb06caeb0f4ba2426e39f71cdc1", - "cf7ecdd5cc777f73ad14b938a24ff855cb3ab9dd55ae00411115b481763c4d46", - "afdcdce86930aaa40f24a659ad31c8efb1bb9b711a15ff0cf750106d495549de", - "43ee2e6930e17c6e457c22553f5ebe6fd0fb300b5c763b7f1b34879a8f462c96", - "ae82dea49ff7b9da92a34e1bbedd2fb2ecd0c0ccbf9f06a8f70e44a617906503", - "b7845f82b65c7fbbb45f1a4ed776643b48a663f37f0c64f5a53a896307d65c77", - "1ff95f534cda5b86edc591b792c2db5a158658594f6e24fb06002476f54ccefa", - "e25c829c78dea91c4ca73c45ca28410ce256ae32df5dc1b30736ec17b1e07c62", - "e4a26b8907f4f4be0645e7be2ec29f618f872d924848526580b0094675624f6e", - "56c9a6e1e66ce3a95b5a0c63c961cc6d8a1192f9371da0a7c12074dc1479934f", - "b40a08d3fcfc2ed7071f41170db560d66ee6d2639c07e35415b92ba41b89e98c", - "638f214e6fe3c6c7cf80cf6c2ca4947de351ff5c32ed0672b0c415b532475a94", - "726a5c74e68ff2cd815a4483baffe96e8804fa07ebf5cc4af7ee02efec030afb", - "afaab18f47cb2bf3235ef9f76c7ca2d1f8dd8be092819b093a2adab513f6e6cd", - "25a5c52997158b5dd042dc222997d27acb3f4ecd95fe83c2cd1cbc81225d0955", - "771e9f0a5792d25dd1ff72698066f70ec7c32e9542857c503e5f23536f963698", - "a8122b234e3876974152e2a00a01e80127b4c5243a9396a5db7679f43790da35", - "280f7198f2df76393312c3c6af1169019fccdb2aef93e3e8c8f4bf48c45f6e46", - "a09881897b6774e62ec4bf9270ce04db600738264c3b040944e7b782b0b142f5", - "083ae83c910c590d3e98fa8f43bd905d873ac5d665ce5835443fb77d9e5cc5b4", - "80446a6b3e60aeb599de6e3780e6fd64fd73efafdf06ebd731afc436146aef72", - "1d61585d4727960e6f898f6c3e91e59c262c204600941827c714cec31754e807", - "26579572b29957b852b5c6d3df93dcfbab688977de04e344c2892e8caea25dc6", - "c400ee3985fd285fea8eed87b8196163394190dfc98ba3099d06d7d253a10971", - "9cb8fc9c9476050182bcfa9a943afdaa3f5cabf338f2c3bb40b949e9b96ae995", - "6033e4efb2b859e91a1aaf5d98b87f948dd4c5b400ffa3a546b6a9ba50d991ac", - "5e1b5e095d94f5a15e2072450b8bdb0b149d2dd5eccb722eaef9d4c3b040c449", - "1608afdb7b7af69dfb61eba1e38424ab3181b4992708f4a96ee21cc29830a5bb", - "2b423ebdd2ef0ffc0c6231d45f19c5b69abc5a0058f245ffa6372d4c85a6df8a", - "cdf67727cef98c7d1773f05befc37716ef2ea0bb4f4e076cfaec672a2d31c7e1", - "a7d2bd38a243b186f17fe2c5ac208afa4f2a404eb0a657ce33262c3d6e86836e", - "9aad796be8a08256f3a1cf2e7eca7ae00841537ca86e827396ee135909b5577d", - "531df613c51374a201aea4d0cc5d6cdfcf9cd407b9071fb2e24bea938846bcb8", - "635eec19f5e600c03878d74d36bf6f4774be0070e377a9465bd9e0e140b91048", - "38a2bd695f95737cea0307cab539683033cf1a7ad4654989ebb0ded456209d2d", - "a2615722e0328b8d1c2cbe949ca6606d72ade075034a3f90b95605962b863d84", - "ce6a8ebadcd4d4c772fa4e6e7e37849336f6158b68e1e03f41760b20af45223b", - "d6d600cff3957ab719e40a9f7a54f5ccea0436ce4ba6c746622742d3a30abd1b", - "1c4ebfb3200c8ff554d846465cee1010a4514ebee7b4f4eca5949ce4b753b31c", - "4063fd5319dd6e6f16cd0694fe83245fafd6c2bbdfd50eb53ee70ad90b3c7a30", - "99e0fa701371ceafa1b84d978fb1f01cf0604648b428e286a7d340eac5844d7c", - "2826a2283af6c705ff99a905aa100ff2161d395988fadb9d42be91a0d0f9bf1a", - "82b19c0cb479646acd24ca67769259af7c9e9334a06b9ec1e6b5269bf11f706f", - "d8d249bf90d01c5b3225d8580a13782be45dfad2d083f9ce93911dd4c15cbb0d", - "62448e2c6cd7ba65cdb73130e6e0b6fc296512319f24580ed64de2bb737a3261", - "11ee514f7c153a064773ea53b258cd7a07240eef1d8d01f69de7588148ad9bde", - "4ca2fe6a4b775ff90abf16518954d2529db2888aefdf790540750b900db8a81c", - "543bfc7926edda4210b107204e1997dbf9cba047bff71407fac07a4b6a74e306", - "2de36b9e4e54fe44d2eb55ab3d0d0bf88e16b34a3b4b1ec505cf3296b85f01a0", - "0e7aaa78419deed00e473c58f79d4b70b99cb4ae845ce3b332facb005c19fb16", - "8f9eb67244e206b028526a9594c53e423a3375355fcd417adfab8cab283c1c69", - "9c9e2ff5ed9a3ab1c3ff02e7d733b8d92068285b1df677b24d7abb13c736ea2b", - "0c2c54210e560e55735ba471dc1d87ded71ac9a16877ae4171b8668f3c2ea8a7", - "43c9697cb9a1a334e217bc953ea84184a3c1f5892d905696aa99eaa8fa3faf5c", - "01aa5834c0123cf3d2c53a08a1ba776867864441a744d96e6bad5b89b9e4615b", - "610ad875179e9bb5db6871b4fd6999e8d488c0a250a9462de83db7b198cc68c2", - "b4f5dd1c39cbd2accdcce51351436ac07ab1bff75df9e8f12f0708250909a330", - "8e52758aed1d1e5ad7f30cd060ea217ae5248ff64a49682ed6b690d7dfc9362f", - "a724663a51e30727613719439f516f2a0d857c41f30aaa44d2f2d228ccd10fb8", - "f7f50884588e13acfb6f587ca720789b606f8df29b24d22361874d18430ae99a", - "c26d5bf1d21aca2e37215cc7017effb2893ff42a863b932b23e15fa8e5b8744a", - "013521d8f4a8d669de5ff04daadb91f89790f037b8301da2cbba3fd112d3930c", - "f14ae3d5b3111ca3c52a8e47903d878b381a3fbd969217369aed41dcf824a4a8", - "6fdef89720eb4e3b7ef22b842a3c1ff3bf5d816dddd9e4ac08f4420a3ed5db98", - "196ecd86f00658803ae9e51a009ca1ff12eebcacc5426b093914aeafff0f72b4", - "aec3f046f59ba6e89bf9ad76a9924f80f06f2af0353a64b6e547516f754433a7", - "d8fc0988bc1482e713dbb8ce2acf3b9702a80d968a14c41c3c1621bf241d7407", - "3e006f2d57fb707494ce379d90f7f7fe3f0a9c31374a8708c0e283c4afc9da14", - "e161796502ddc26fc1e00660618ad3edae3df99cbbd007540a15efb572ce2995", - "69f71135e1ddb287dd0974476b3460cff1f445eb3d789505ad6c76c1c528c336", - "b5f75655347378ee9afdc229b27458aa990e1d7be9467260ff4fffcfe9ca1c05", - "ea77e186c7d6e65719a5216c7212cfe5c59be5f7f9b0b6f0e56268394a5d180e", - "7e93f3ea0af441e21a87a1dc9d6fddebd1e05533908f472f42057e2d10c9ee36", - "1ee34adbe41e88fed04c4c5ded13bedf2ea663dd9f2f8b6bb2c1ceb75d04ece7", - "2f0a15090c0779d73fe0421cbaa5f5d5a55204016f1c4ee9102897b5fa0802ed", - "14f6082a70fd79d8faec6481566dee3b35609b64fdde88a285059573bc59be32", - "cc84648421620a4777c7be0913f72e1dbd6ff2c1f360b60ddad5c207e25402a5", - "f9a1f39f5d8343bd71b5b28464041449c6801f6e263d8866cb07a4527f1a35fc", - "b057e7b4837fd396360f08fc4ca7f20ec13415b4801ec371f55343fa389a5ab7", - "27208d13481a88f537833b4f9b89c00d4b467e2f4914e8bbb476339f41d9fdea", - "ff42cd50330024e27e0eb8b17c225632f419613c5a00b763cdfa51d8e8ed2ab6", - "fa6cee39618ebd9eac231ee63b690a0c42a9ca90da07b7b57659fc83d0fe4cd9", - "85a3aaf300886673c65d5491f8a27158c7f51e56346e7ecba6b196656342276d", - "46cf17742c742fb50e277f2e7ab8e8a54623395f315227245222f25e905bb5ef", - "d5717be2d457a4e7c9a3fb16b4cb3b0d33795b325e6fa86dc8e41c7c43fcc21b", - "c6e65efbcc0711c3bc9955c1c677d836b9278da9890d248399ba0c7607257c57", - "59f6f5f7bef8f3f1ecd4800ba1471391fa62c16f1191b106fe4ae6d9a5f3fb57", - "b20157d92891066acd30331713b3573d7ab1925b3c20bca6193db8e4aff2366a", - "1fdda65e9683522830829416fa15cf47e5f0db312cd87cac11d9f2baa0808a45", - "447b2bbf155d4775fc7f53e8189febbbb410048ff14178c5b5bde0f2af744f82", - "e0698aad4593e73395b9543580834118a20e3f52ef8fb17fcf34eb3b4581a30d", - "ea7a156fe2213d6f4655109862b0a559d37a62cdeeee122c2857c07eb1aae654", - "99bb6331adc081f58eb34a94f60e3f33b88771ea48b1ef861df774e4e7c98cb6", - "236409347d58c67d3a5179b5722926ff3b01a7d76af58695f7a3c413cb780178", - "da4eb338af885338651dd3874e4e000d710ce62a88a2a50e1fdcdcc183696783", - "4aa2345f3be0501669ff6f27ce61f062319987d9260f8220a7d315de51f01f8e", - "131907b7b10a8a6c2799888057f449c862eaa22885487bace33d22c699f8f857", - "b7e1cd940c1823e2f441dfbd54aed809d419fe71856c96795d9f18ffe4ab4f5d", - "d27a90926bc9fd7e6280dcd5edf160a99a12d36e3c7344af16d6746d11b295f1", - "863c534f71e2671290991a055188646764bb0e83f605086a6e76f1e91b961533", - "06be873217562547d7a3a9e34c2f65bc8dc780481eb13bfd9dc238dcf42a70a6", - "0b86f3b7f2f88941ba9ee3801024b743c32faf2169bdb9c5b864d0b935946ad2", - "26996cfcd3d3b8ee1bc99590c9d2fe4ed18a9968a41f282918eadabaf990ac5d", - "165ec6f23c0d4da8b5f745423b399f5ad1701d97cefff04d479a70a3242ad216", - "4613818a0d0029b1c3777c7bede147ab078fee8b6e524d3d3ed68ca22b6652c5", - "b594a17d0e2c2e0698acae146c422e937c098a1e00fd85cb745abb78bc3c75b2", - "8e49b2256f6c63d2c3eaf43b5a1b9f50497b28132a5078085045a2157ddbadc1", - "1744a7fa585bce4afe47700866c1ca95f41a14de3011d30c0aca4c49d0557314", - "2f83a3a86c40e73aae0325cda7c84c8dd805aa728086ad619367f08ba9b5db4a", - "9392bb17995bae6e1eb728dc609265fdd5737ad6ac3798b32b9fa1355bbd761e", - "8f640ff977041a7b7695f78ac26e6814f0657046ccb34d66b4d6435bf3d8266f", - "1d96ba5d2ed3a244b66e41043a78d5902e7eabdf7dad3abba8e5ff723db64303", - "c8803112b0ce5b7585f174b05ea46f242cac4ee5485bc3759f5f64a34299532e", - "f14abd89b8d639a85a7d3f9fd683fdb2809d06870d5994b91616645bf851caa2", - "84737e8c6256bc70c0f85462fc303ff4f5bb9644ff70d634d37a36fc4c76f5be", - "f67625ed065b779aaade8b39a730e89af44cb2697d951165d0fbf2433efd77fd", - "0fabda7a7dc5d825587b502f2a58a0f9752faf34b62d219421f0134a1392338f", - "3aaeb389d7d85522b4dd308b329043c16989026b4903f0be480c9cd18bf70d46", - "94f1b2a3bf5a0c71d4c586d51d6c08d88c7f2b1b223a84a6149f6974963d8db8", - "f4e5a9daceda9c0db5c78bc82b7d1b2f45427274c75df46cc5a92995e98b4be1", - "88ed74531e92c8963720ec4fb82725b85cfb7f3bcfe005b79a5433611821565e", - "816aa330ab641ecbdd329222a9bf312c0d4d810a845fe39ad577ca074b8d10a5", - "d670644de59b7885acfcb54c457c6c965a110e18af31ccafff1fdb0966fdea6a", - "54b0668fcef834ff335985fb484421d8284b7537fd25684286f552ccc8df2e34", - "cff4cafa97ab61d6808371e150a49adf038b7bb5241db513ebd1512f6ad3969e", - "92e6f01c2d8703822fc164f195b71d4bbb1cacd854fc543ff79c719320448584", - "e76391be0361957ab50d43e355279569f5de83a6bfb6573d40b8a3e5f26baa8d", - "5626428a9849ceb6ffc2001ef9b811a6cd3c22a1e75ba9437aed18bea06c4c1c", - "f285afb6e0964e00d0a8d5eaeb7d5812d298165609c140fcbaedfd76c349b876", - "a901d6732c5bdf5c8cec871c90054f4c1d41ac37d01c80fd1e19f0bae9e7f2e0", - "40bcbb45e0664a074afaf24c83be77e16c7779eedb7ca78260284d9915dd892e", - "d87924a1098b2c158b40a11abf836040c291e4896a933cb1a6fd7a536092207d", - "4dbd95e4002ecb1d3c8fa57d30fc86cc97431b889dff786755eba633b534a2c7", - "3d22fa138778e2f08b473d7d7efdca8ea797ebec9416cf64928147efe3b4a3d5", - "0b43bf97c0f0d35e70212852bcad0a64c2ba266c6ab165596bf103f09ca69272", - "34a56fc0a43c34c9a7b7feacbc6b493fe77f3645c24d51b2eff788658a675e70", - "f60bea7262a93c37d53c101a93d6c388ed1be4403ba7775d9fcff6964b768889", - "d9aaf00c9c43bdbf815e2e88f000a03c93ec7ac362464c86ca3423b97edf5235", - "77917a042d09168fccfd88de24b813d98174bf9ca7e4600b830bb61b6628832b", - "30bce158b1190b06a2354373f4bb114778636e9048fb8cf9bcbd5f6106a5c4f9", - "b91556dae0d244ed15eb8905bfc70608b9a4f6cafeab1b24d3b38ff93aaa010c", - "be909da6eaba5e555e660f5437607c795c13b243b266feffc50f0f38e6be819b", - "de0d9aa54c7c7f625754f6ee6cde2d304c327e7fa2082c960e6805a1d8d555ce", - "da9444f49c44f7b25f76dc4ea30dd0376be1b703bf2285141a71c2299f535844", - "ac3d5529d3601fe1157e91d9f101f93fb60c72abfbe976e9fb02251a50591cf2", - "13e40915fa3108576c8dd61d579fd877392b8681cbeaac2d405685394af1ebeb", - "c8f3e18d749fd709d2470f59fb24fa9e5763b815731d4053f0d032295d41ac2e", - "237dfe550f3f7700d59de9dc0ce91f4f56e45961f8c98d39a6354393072c3979", - "fce58828fc7e393795fa00afb554b15f175d21eec6706e33e4e5b942022faa56", - "4995332e6170a2dc91e0e748ef75e9e6913a2b0239114fcd86bc41069418b323", - "d9db13c57e1dfaa12d4c682ffbc599d5b308971eafdc816e6c4de7b1b2c1e3ac", - "d5ecd8b39420a7003fd1ff17baf4e1b86b1d63bb087ae83cf8969381667e3c00", - "43e3ab161bb93242c91ccf4352b0e0321fb7d7defc3ffa96b62ca9856e3ce6f7", - "fd7896514bdefc728cb9c7d2e32a89f9b34a0e6a834179a3679fee6b0bfb365b", - "3e7b18a4389e38d0d9180a60e406280aa38352dd6f6eed332e5dfebb582b3954", - "ff4b6d559c5831d8681072521041ecbd4b1ad749940d14a1cddde7bf2629fccd", - "66942360025f3315da703afc83c50ec872857536d5889efe30c8df8b32f77df6", - "b53e173f059b65c823989ca14a44cefa46faaacfefbc17453cd3fc94f8602a97", - "ee89105a8904afc7a7ca9f411eea35b96743e106e7120b6cb90ee889e18b0b65", - "c35f48666dc9ac34d716247ee62a24512e8808126acb27a097a041c836f2dfc5", - "e9adc6f8117f4a37b1722786bce4d5e0d568de599f4ca3431baf61ccd278b3df", - "8cd1a1ed36874bdf08ae918756bbf1b8edeca71fc7a973576eb0b390f4816e88", - "5a5a929992e78b4056dd319ef903f77d291bf93b3659c9fde2cad613ec556438", - "d10d1233fa642e892a5271fd6fe0b1770495a48953d3ea52b3658f9969226704", - "2b28a7b206dbc5783deb2e14e468dcc708bb8916b4845f0080cca43eccd1b979", - "6e399d19a20029ae286b3ddb554acbaaaabacceceb9694a99b37af6fb028eb45", - "5bf585f85076a1ce6a4c64e095ce89d095fa74199b33770b7399fa71e6a71a26", - "6c7757f86b993cdc505fe4557b72abee24f0078bdca0a59ad278b687ea8087e7", - "263a8fb6df04d7ec1592d4a69ca1bbec9f37973cd9367fc2933b67997e78faa9", - "916475eee16333765c59b9dcca378491fb0005e77ca43a0d6f73a5a72edcf6ab", - "4f8ed745537cf160d72968912d130aeac651f2edf6d52ae14e279962a1a838dd", - "2f9349659960d67429c4236a20fa8aa28af135bf648c69bce42ea453da1c25e9", - "8eba044859132e5d44dc474d1dd9a1b67dba9bde3e1612ce463a9b2135d77163", - "2669dff3fc96039bf92b560ecebd6d923f855d8e77e633c4902d59be45ac2a8d", - "efc9dace42aee00a7975fa3ab83595dc7787f7a1f5f85b102de78c005b514158", - "3b573282beccc7750cd77d442c0229d888384f025e64caa988bef6f6fd082348", - "7acb65e8fa6d3a74608c1b61889ebf8410c57bfbf53e50bedd649e92f24f78e4", - "2cc60baa2ac49b27f50d1ca0c17765e20dae132d23de9f9356068631145ca3d2", - "2ca36fa49c5493373e8718fb09da8e74eae12c2866fe3ee133843910b1a24cc4", - "9775e840ec2c6a00badfb6e93d3b14254d777792db7f962eaa3274298ca5510f", - "0ba0290043e112e562c93b9472e94971c762d782123b7cf44105d223ff5d079b", - "95176b2751aca2bb039a93fbdfa12f7c7e47f61015139fe803ef943add6d78a3", - "8f04c80abdb85f0fc523dbc13cecd31e14e254225887ac9ea3e1749c9137182e", - "7f643884cd7d037a285b9be14531c9a35d120368cbada9198a4da8bcc671a37f", - "4888e26e3c9b9562169a59a2b6a182c20bd5f1c9ffebe54bbb875e515bf08a4f", - "dad29ba896ffbe9987e4027954e720cbd615ec642fe4eefe25fbc876e3a28173", - "4a261f34e687f1ccac7b6a10bda187a5f8f9c8cd1805bfdf94557bec8eec2638", - "f62504a4357be6a5bcc2e2bc5de1009510577db4efb4458d436cbff12f29a2dc", - "bf623e53f9f469430af6ae7e37a5d80bb37af1d2f2a741a5b765459bb3afe62f", - "7abc2e86ddb2e52c1a67296f2e075c8b8d750f4108b29e4b9b4b0b9fea75f9b3", - "e8feee6d0fdc829214dbd8bb400b374148907931645bd3ad0ef81afebf4d023e", - "d8d82271785814b573667b416ceb95aa7225fc6c711ad91a97b6cce33bd1ad3b", - "b07cbba7e1123abfc59c7d9bb872493b8829c50e996fd898884b184f211f66d6", - "bfc5eefa0a92fff63ba4b501f5b4cf72ae52278080c4e4b4d30a4eb1b4dbbe82", - "09845c6b31b06b37d4f2b2727d58e4d25fb14cb04b86a853726897a4ca6625f1", - "8fd8f839a8fafff972257f7b1513a39ce565eb50b0eafececef4701a99cc8540", - "bf2610f9dd93667c53c669020bb80b455f54f0f3c69328db469ccb39e4e77d25", - "53384c5d8aabca05fff419fc90360bbf8ee6026a05d648c61aaa6d5ca847b20c", - "1fbb58a1703a981915ed3509c74c7e3c1427e6f3ae24e7c6df7f3908c36edbd1", - "7e1b800637be5a5f15bf9c74ecde34cd61ac406c3aa9a2892630c1acda2badb6", - "37ec5be9066548de1ccec9e174d3c3259ab83a2e8796acca72f0c104ca8eb9c9", - "01034fe2f5ef12213a6548f31be4246d4590833c9b7b24602009a864eaaa6e55", - "cbf3f4d33c5cc9527ffaeba6b48fa2421b15e8a1a79fc10be197ec088603782d", - "5537aa0da3727cd6003f6e79ead7a3710ac86501954cebc92a9ca820422a884e", - "bc70dfd178e30a6904b072f4e9a186a0fc9e8dbbee73340d1563248510b18943", - "39e30ef52dffe8778af10b67e8ccc6d77d383dfa64b12616174891637c0ea28b", - "18033fc6b65c5819a5d7c57db41399d4097f6ec07b7c7689f0946f068b035343", - "fe0d2ab1c3c091a626accd603285a6b129302b56554552e17932fdf6adca6e22", - "63ec75edbcfdcce5343d2ea1234b5a3ea5deed7be7acf7c7c774260844bdecd6", - "a374bcdb867bb143d1fd925d2f901a18f783b75425616f27e6ccd58cb1de0556", - "ad47aecbe3cfbe219914b544d988c424014f0dd22ff7c5b54c22519874d6b507", - "3db1b61ac79bffd062bf96ddde57540bd073060c9ab6a50f68688f50c2f4b12b", - "61d981cbc3d0b1aa46dd6e450e1e677cf24b66ef6ec2955a773acbacb5bfa6e0", - "0bc6f55a1681e52c9ce5af7195affd9be76e9ad0a6095730b30e2288f1b636e7", - "9d70a166b26024c3cdcf751b21fe34d131ed2dc2d594a3a78440ec8c914b45c1", - "a01fda9f485f488d46b7511c12f1122daa0f2b02806a5397efd22e1eaf2d5a00", - "4b2e757c46beb4c19239257f3cba4bf54cc3fa2bc17de70a50cbdc66eff9744a", - "06dbc40c7b21f1f5cd059523fa91a23a4f7b5b90a4910043775e202028d55851", - "257cafb69ab5c0edc5b8bac4e3ef2db664f1d1b1f0cc60689e7a2944445dd7cf", - "688e4d02c1e694216f16ef0d30a9d4a1f8152fd193f85c39fd16c2897703e856", - "f339191c1a60da1eb9349823510e1b4f6aabce27c4daf5f5c1ce7cc8e27528f6", - "aa1253b8408fc06c64421fff6c6d34b6b812ed8c050a87efe91dda0b219e6583", - "b72d6d59800978e327d1bc0a7de8f6d6c0c4511af198c4a9e78e00cb3409abac", - "acfa0c8abc62962aa3a08333ec02b84a98ff3072ca6aa7ffe932032e77300457", - "615e08ea744571bc75bb9b3d6d19eaa50aaa471ba02986ec6b83d54e806e71a7", - "35fceab9ea73ca3edaf60ca14cec282f8bd29ee34b595b3fd0d32c89fb338243", - "5043c24c85e4853ec0a28bf8b93cb92ee0beb1b1d494d4a343ae60bfd92cfb0d", - "02a08227d2dc984e088a96c3ae45beead582253bf94319752feb54d7da4924e2", - "57432a1740d4a5a7ce1ff65f3d7e5b47940bf4fcc426b9ce33e548fcbad0db45", - "f3fde39a98de77e3441c91864ab949230248c5aeab268ff8cdf70066246af03c", - "da300f82c6317df3982e257689f5231622c8735f50e79b5c32abbb7a11fdb62f", - "23732900b7a226d6193f705a674aa6d9d7a666c792c6d58cf2e5c68c7e889f14", - "4da62242450587f9de0324be8a887d9c71a0aeff94f59c8818125a08fa74ffa5", - "7bcc1c63701eaceb53e9ca9fac3b7d1761877f50011f87c489ec8058a4b0bf2e", - "9112a12f623abf568898015a80c9734a04275bcf2093bdf6293e1bdef2ab184b", - "77c00e54ec21ddda617ca3bbd24ed5171e21978f4407494087e3c7da86d7b057", - "57ea667ee189c51541159c557edcb522c9776e06e8a30a9b8764184b4ecd266b", - "8456241c0e51df839b9c92760cb4283dacd4dc3584151c0c366616e05d43499c", - "9e9e321c96100e2840142001b59169f8d80cbd2c25955c2d5f68c542bb044e40", - "e8d401559a9ac9dfc0c9249052989b496fbae6fe5690fa8b942dfb8213b49281", - "6f7657dc170d1c852fa6e6b5f869ddbee038b8ffce62d1cdec0fb06e07b476b5", - "3e857d217146debe6a1b8274c44eee60cfd96f840365e3164ff9f5c905fef1c8", - "4c2bb8b8fc09d3ff75b883ac3e7e212a9d022eb59f9a050939d78b0c5cae0f67", - "8f9ff1ee66b1e269ded33e1b82dfb02d55d79d46ae8d74e2dad6608befb2f8e2", - "e8ee6cf90d7c64ee0d6cf0e6851624d7b8d7de00252e24462eb24d1faec4afcf", - "c1dc19c3c3f446ee1a596f87868c2271d67370a75435c327c2bbd5406914ff29", - "3c7d6d93ade88d73eaa62b7db539c2001309999377a2d7f0c23e0329976889d4", - "56aac888e48ab4174af0e2b4254a1ae270e06e372ab45e9e20369739a328f6bc", - "fd36984b382e7c5321dfa4925d7be3d71841fc3b0b079d9ebe99ac91bd8ec28a", - "1e01505d35175ca0d00dc14e7233f4b42a317c91432c296f8f2839a72272d72f", - "5eb77895eab1247bb9018bed09c02da9f71bd80b345c0884ecef40a21ecb73bc", - "c92e06c3a4561c88417ada688d8ad839ce3b37485525e116f0ab92c7d8b06a40", - "83c753bdbd852fccea3f18cde88aaf368e88eccdc7fbfd67f4da5c06a0c91f46", - "6d22625537995fab14ad03b937713be23556a2e37c761d06b309d069acbb5336", - "ca6c8816fc21e7eb1272d8e4d1ba5d23c8a601859fd18bf10df790a25c7f3c33", - "7ec70f596a509687e73b9e74c1f9d780f82c74b2bb9cfc6d4907dce89af30653", - "03200cea40a00d141269610bf27949219cdc8a663c145945f63b87706d96cb2f", - "6c9b727786d747062ecdd14437485a7bf7c4152954cdf12a1dffdd780e24c266", - "f24ca7b0f92fa0e4423095e5e8191cc867c62609b2529fa36a3ab7ccd3191b73", - "568cb143a37649a0a7505b896be0c42756ff07b6f674d9f54281a20e0c8e0ffa", - "7038f9b4fca7c8c971889eee91c841d771c749b82e8fd68c8ed544f49902709b", - "58f4ad4994ff8932f5e84b21ab00381ad235eec1f1545b77c40d5780fb968676", - "5c4dafed4386bcbc55eb091547013cbb32f7bf1ddbd02936a5d36b3cc2714954", - "7e9cc6a59b9a324e0d988189df01ee90862ca7368f5bcd71942f5b24e708de86", - "3601f9304e123fcffb2238662699552bdef13d6d205d0fc8b29e0606fa0cd360", - "e44f14b89e89a90ec5d13e9f667bd2c3c6d0731d057ddc5b7b30c3b2c5c92ca7", - "922b2021ba41463779351bb8b6e2bcb875b8f05a29be7380cc691d65109a7990", - "1925f16020f0367de6812dbc6d571b9a94034ca023014fd344324afc5366ac21", - "f4ae7a56a94abb06a70fdbcbc24cb8349de91d07a5b97479f6f7d211b7e84ac4", - "28cfce2231652191504cb00ebe7d8ac82a5735e7dfd05289c16f18c081f51cd7", - "6d7d161550c45dcbd2660933e644f993506f749bc93670b19ab5e32c8bf4c2c0", - "3a3e388537f062639eeb54fe0655e43b6b1ddc63743a302bdad4e31dfba00769", - "c588cc228a01b89ba8b1698641cc9dbb27682bba27f47fa84f5f4235cf343aa3", - "78eb5d8d1efcdedb56528ef37e3cd6f2cf1f468f2afdda47c20938795233af63", - "b14ce397980e27a7a908a11ed591a3f6d672668a753a776a6f780e13014367a9", - "7cc75c18c4801e7a6a2b94e3bd8f36192caaa33681ca6012a857b011aaf55f4b", - "d08dff186ad4829a66a436004e2e7089e759c1746ee321b37fd4bc873c7f98ce", - "80d3e35f834833fbf3c8c90f6e8f332a579330a329e4699262154dcb81c246cf", - "15b283c9f529cd499ed95143878559f9453770939493274480deddf765fa1424", - "eb94d69bf82c5fedb85713b3773f96382c4f05d1c38d18f86d7f4b08a31222d0", - "d2cfbb8d4515726dfb6a99fd10bce7314014e9e9302fb9a85b5eaa59f40112fe", - "f31d53bc9d56117c8427424a1a62449ed6b34e110fccbb8ce24ba3351ef9ca6a", - "48d525c823a8c227dec2fc9a6df6eb322756e920d79d591c8e9c0bf9dbbeaa70", - "a6b96d53e48d12dcc42d5121f014c1a187f1a2601a8d550729a475926ed20c03", - "a2c932a709baec23c04511c9e431e675f7f74a653a2ba09d0ff0bfb76961b3fe", - "0cb9b6cc435e3a0ab1cbd692ac4f689d20dde83d22ccfe033aac47c867ef6c24", - "d25a5601a9adedb40740b28f79c2ed550864914a3a54b0daba43d5adc3700fb8", - "e2aa7f0f9f677da8fd95739dfdfd47ca515414625b66360bb3dbc3dbf0230262", - "256fc61b854ec4c4316851858fe4fe91d49f82771acc7824e2c4c4d47499517c", - "20fe0cbb52d90c4a3ebbde231287e9776c690ac4f6dfb20463f3dbbad7554191", - "86d4a5aa85b438a30063ecf4ff2f870e0db7e44032c039d8d14019b5860780d5", - "bdb5abe5edf5fc41f6420091f2c90ffd7eab50983ec6a524fd78ecb8a4d156c4", - "35c2436597bdb10da8df601ea14e8874db51b732f7a54ed3d7eca379c1445c40", - "16f9a0bbabc7a18303e1aa935f064a07f94e6995d8513849a4ec9f8f7b2704a3", - "61d32cd94710c7408d8d0ec8905fd677ad6e3824d9070fe0a17d7669597b4869", - "75b12af8985040a7eaaadb78600caceff795af3737c0f3f078b39cc4a948661a", - "1e5ffc963117ddd741a1ef42705b528d62d0ac607fbac74e914b1673eff30a84", - "ebb3106bf88dd0ff5a48d5940781e3322f14e84f942c03bf0440327bb16524a9", - "71b118a0ced79d0f2a6b57cb6235373312f06f4f1d5b78172723e316e45a932d", - "855e60581a0b88e958d35de02bd7026904c8292a6ec3db58680c0e0539ad33ea", - "53211420040b5af4b014e40fd033edb5f2e0c9125bc6f07fc13286548d45c430", - "654196e425eea7360c133b807e718cb896723ba81293a9729dc782ed8f2f2c3f", - "8aa4c3a17deba1d9512843fb5a9d79b728af5d128ce1d2fed1d0e100818cf8dd", - "945e9c9e8ca4ea74c3b613c81df68be0f7f52b06ea5a9debc772bf4c15d526f6", - "b0b519011912e0955eb715f68b2b4e7753cef31f924ccabf001d140c092c09e3", - "40abeebe0c21a8e919e86ab8f16642e2c7dd2e3ecc0c5e747cd854eb80a95ba1", - "975256ddb59681079ca3ac88351b279046a07b272a906de32267fc358121d37e", - "742d7990b5a77efa55a9ed6070fc32fa0d2e5ca842e3d2f60ea0293cd403483d", - "0fc8a3dd61d8af2dbf7dde53df7ac54bfe697062126fe594f4bb9d345f4c9990", - "e1523dd08aecec4754027c40dbe677e19e988edf7ea7dd61d83cd9eeb92a6830", - "b6cc13a87f0a08c2e6d40c8d28488ea66351556459d680ff3d0dba2182068d84", - "95c8ead4e00f062a166134dcea99a3c1813521c290676dc6e1dfe87418c98941", - "4c7a404b3edaac3271ec4ebf115959f3a1f69aa3d207ed7da1037371981e4b11", - "eeca007373c28c82c43598718a14b1a1b92c79d6000e5b56a19a507bd45f1fc5", - "090bdc13682117ec909513a9b5797076825a83c6c5d8e744e2f0281e855d0859", - "e4aeb02edd4d6c530c6ae93e555bddf95df8c015af9268356f0e94c17757ec94", - "83e9983a4d957c5e057b06b6e20012458d102509a78b895e408ede46c3ccdd62", - "cc34c30a7236faa8f5aae0fd5570ad3e62d1e9cb16eaa6c5ba5430414c4b06be", - "bd5488d94d2c04b5393a9290c6cf84434931d470d1702ce85428f5d59d88932b", - "0ca9660925a88da683df5a2ad255391d9b51c7cdf7b4a8ac138b37d3b98588fd", - "22e2741d1abbe3e8c8905a3d916a3cb7e5cffc4d3c236940618bcda71f85aa4a", - "398a50e5e71970499b968643e26953df8e3b017a21c11b86cab8094f8c1a9c31", - "e17424a3c3e661b2b07f73bcf7e66988ab8a091865077dbe78bdb66365ee271f", - "f52e52287ec1287579c63120037a7e04a8b5ee3bd3f477ff7eefa3ecb65c192a", - "14408022d120080e54db1296ddaa5a138925484b88e629376e0e0c0ac388fe38", - "af1367b4f60b3bb9e3109f43a8b54218f4a77d7197c2d07608002cb7d97bff4a", - "42d027a8762c9be6207085e32f24fb64bb66e21c3e09325e3fdaa18e7ef0e5ce", - "ff5a2cf7ce640bb8496695286faf23f80bedad20d012c77ffd3846ab88409adf", - "e52e36c6fedec6c811cba584dc5ad5f1b9f30018afb8a21e7015c2f2e7a3c78d", - "b28286c2c933f8f063f9bf37e36c06ce1fc9a68fe696a53a539062c3717c091b", - "d7c69102cc14639e98148b2eacda9b14b95ffe93b186bef7eb285e211533fdc3", - "5764390f416d127a5361ab6fbfe0a7e2b5e3ee0a94b5e45320525f9f190b7f9b", - "507080683c50ce4b2e3dac59b64bd94871addf18025597253c9d112cb03a0b60", - "c8d57a7ce3f52b904eaff2a4d52376e60b51847d1a0cc7c89045495895f8d08a", - "5072f3ed3cb9406ea39bf4f510d5d94d81dc94188f5c0bffc4eddf42ada6d3cc", - "6e8d7056c8f04708f19daf6785b377e9f55ca71dd78be7eb6246325cf76984d9", - "0a8e17ce447197ecf587bd1d16fa7b286494e2475e61ea5f0cc23548e4d3fe3c", - "97a887f870a86445aa09b4e525e9484c8d910be0387ee7094d99040ad5a91cb3", - "da01e87187b4bbbaaadc9a7d3cff135f3f7b548e68b345fa824b32a06dbb04b7", - "ed695b7ed4ee3a49705fc75a4d377c6856d3c11007cb8e72ab86af4be30ac07e", - "1daf201b7547715a5841a693ea0ea194cdd232348b01f5a9a9ad70af8d46af6b", - "089bed3e3fedb0f6b0cbe906628d0437fc8e95b117ff3ddde1769cfebe12789f", - "5df4ba842bffe93ded0e7ed9ff658a2f7b86fb5bf1b6d664940f2a5c328bff90", - "d6e405d7dfe3f6f6432256f2895eaa4f4cf629dd5f4489facc9bb9f6d109237e", - "9b3dbf7fa0ed3ba1e11d01afda61862d49a688c03127ca53b32bb147631985e0", - "01b1be7402d60ec7891b6eb9bf200e565fced35287fe0c8ede0336e548e856cb", - "cd9a5bdd09b8c6dd7b39d0ff0f4c4b1249f97b7c94b91c6e41fac2de7ec47f06", - "94e0997513e2757c2bd8800f53bdfd99c69abf80d4f9879b8d13dbccc258e534", - "62387695a72832ae854b9278cb5773912af88be206be76ef55a4f82e33867b39", - "dd0e68953dee5962b3e57076e7b48303b699aa2f4b24511c8c4b76a974fc8c00", - "3a15c8b7a24268140d3583414574f7fcb3ce44bfcfd4303374ab49f4fe99c14e", - "4f2ddf8648b057ba0590aba9117a7d425a9e454230373c41859ff8334377200f", - "322fd7192d80a8ddd5433acdc833c3f4e3003e4cc542400e2e0f237e23d3d8b2", - "ff93cd917fbb031c889468b5fb72feb78df194c1daffd30dc75d893cb13ad047", - "6829031f5af31ac3212d01988ec307fe497fcaad0b04decf5c641515ad878c19", - "d9a7ae6438d8d7d1bce6e25563fe414fd761bf44812f883d29a87b1ea79b264e", - "69d7536228fb5c76d4d5d4fae8e91df575fd809de974b40d09d88aeecd134f9b", - "52d57bd7bac6e509a4413582e49657ec88c2c39eb516243c14a8215d38bd463d", - "8d47567cda8a0c8851856c1f269372d322ae0671b2598219d82def47bec8aa92", - "0ee6046c7cb628f36946eb48e012ae48de06503263120f96765a88010279362f", - "f97e4c79780947ce30e091c5af50ff7464427782cb96a49acf8e90f2a0a6a661", - "a726659f84f435e355287dc66b02a584931e0f366c6bf35fd6dd099853e3cc60", - "0db66b890d7038ccf260e0dbfc40025f71449f1d2c7c4464039654c2259f7115", - "e25c35e2a0d1b00cae7017c7730270aad57b6dc9ae2b395dce99fd6969a6134f", - "4c0118e8ac50cbc77b0d1470e31832af701569b09689a93f4019005289f6a25b", - "9f64383990acb9853c29dfc04c57628c1d64ce8531f0f951743e76ca769170d6", - "b33f0f266a9a64a3047c32bdbc4f51adf82ec8b40326f64a66f6757ac9b3dd10", - "15e7d52b671f286fc03d955f0e979b699065decbd982715b286becba2b96d474", - "721ecf4a32414f84b6daf67b0a96eda19248df994320b517313b847194ec0207", - "eb55fd34439d9d6db773348d3cb60d7121ee439077aadba6895e1b2b564dfa68", - "d69cdd4330ddb4aeeff5a99f869e00490e69f0af1f04c7f162865bf4c867ab3e", - "8374430d39dbaf519a8225b22f20b2ecebb8d022f629023482180652a98eb5b8", - "026b9a60366da7e0f4e181c2aa51751ab53b475233ef9725b112b8cb4d6f70e8", - "539d2d2000c660f0e1045a1282e7425ef8abc5348b7d90b7bb0aa41614eabeab", - "4711cafe4a6fbdec2a3b6b71ec125a61c05957138b4b705db03e0ad5100495bd", - "505193e4a56ba98b20caa34a38c22959ee6ba14e8f398c2134a6b86dd3f04e95", - "cbefff605ec6be1a2d275c81326946ca9085bb33a8cc747be8e47c178536e427", - "90009556abef526710f29ae01b02abded09b3fdaca4359e127f44d99e174f794", - "5436f95f10886e699261aad2e16cdb97097be4b43a31d05b8965bf23b053e288", - "2570d678eaf1aa4df448beb788f0d4f82869e2486267592623efd696962fea04", - "30e43403fd3df7c8ce56f2c041ff51203503d0d1a1cb6f73a8f465c6f92d6b33", - "9fe704eaf3e0ed3f269ad7e29bff9cdbb1efc806d943e15f9be4ee5228a82ea9", - "7590365d2425cf511970a7cf1f2fc564799647e1856107accac46373fbcef3f9", - "6ddcb8708ca947d63c027f899709d1c399411a4ceb469fe5183bebc86ce17f41", - "ad163f50d31a631ef153f559fae930ed447a73b7f6d45ae5873f504b150cafb3", - "78f1c86744f54e98dfff210e274366e01a2672cd0692818654072d84548a4fd2", - "db65a2e21dfdd25b46a38c1961e17ec651eb9f97191d444f7e96242477d9bdb7", - "26f53145fa701ac8780288459c0bb6012f02bba44d6b72046707d4ab8bdaec1a", - "c70f697e57caa528ded32a22ac121a8b416b3aef72b64385f104cff4a1a9b665", - "75bff846e4f078151befd2379f0208d0f17ea0b73da108827af89b650598ae3f", - "8e7959dc8d2071ddfe73c84ec0e814b978f0d2a66cd5abce5574eda75b51508b", - "1597aa12e72c76f9f39d12cd513cc34ed3d56a03dcb8264a6b4198278618c68d", - "2f71df68f907733481c4d8dcf6ccb1ce908c5f68501cbdd35c3fd2c8cc511f51", - "6f217ebcc48d8e9d36738ccf167097cb1b72ab8ebab18bc349031bd218b7212c", - "d4a7ee8336894f2e80a84f8768d6d9831b8095d4423d5918d1e68039d3d41b71", - "5ce0b597e36cdb2ae9325c4c686880957ee021e38854826b34f832326c67b8f5", - "931ba3b10c9c48d2af1f5a5295d06d2a5154d89f699c381d5a4ed1dc6746be78", - "0eb0b97d4a4f065cadbe145239d0bc98a8a9689e278b6ef90f9b8d4e0d6a155a", - "c590e6bfb2ad9786d36437d3ec4315837c91d285e3f33732e86e689fd44da445", - "4f0833b1fc8a0a986177c8bedc84d717e18cf9280d7b82a56e63e9e7fdc59352", - "f59e908ff191d8e0ee81356d5ad7351851595d6cf9b25c6cdc799586a27a11ff", - "c1e332916becbc1ea8c9e73e9bcad71e1fd315b01f4eb75b719d32e2a46778e0", - "330520d658b0e5031d4ad6aee6913428857bbf2b29c5c6bae04b9872bcb1508c", - "189244f33c385afd3589ea34a7fb2a52e59823590356b3ea80c88cd188934f72", - "d7ccdd49efdb2dafbe5c1dcf2ca7d4e3b3cef65fe6207de5df8c983f200f0832", - "1c026d79250256c96b109a2b0695dacab268a16bba7c49aa6e947a117a9dad8e", - "f33597b149bc14275aec206c67b077990e0ff8e8d01be9069d446171404a624f", - "aab1f1e1b7ebd2c390bbc5a1ea9d56ec5a6e6eb747536f8c58a940e54d0c3ea1", - "bfea97f5d851e76bf6ff209c7e1b5fbb31f56ac609947c86affd9dcae8e5078f", - "670d3e33da8037f7d4752188ebbcaccfc1d83151beabde60ae7f417797903f98", - "ae30a1a03f86fe92429ed621e454d1a822ce8f0b41e81dbfbe3508d49f6c4755", - "055025fa433b6c5a3b3c646407c6ae21aa20686ee2a347039307f955bbd44ee2", - "8fc8ded9aafcd21c95a4e2a6170c9947b9a10eef327588d0c97316dbe301627d", - "6572a5201d4a60c31021449d440a53b36bb176c2c6a4b93e30efb0bfc5af5fb2", - "3aa02c111d2c53c9ce3cf362ad0993120292822c07ab02af1cf0a24231a7f4ae", - "bdc3c3992cc1f3065a8e96a396f851eff90d8565eca037babbf8fc30b41ffd23", - "a4c72bb831e9048a363231fbd107afdbaa2f035b98d3265eeb9a369d3a8e1258", - "b8125e2359f9e2de33012c0bfc81ecf9da2339257c1b8d3ca7c125664034c5b7", - "e6f9d26fcbc64389861e5c321cab2b63177a2a6bd7033cbc67156f5d94c8f0ef", - "fc56edf23e99f2043bb194e1daff5c500335fb41aa97e6c6b73420f812a58e29", - "138f4668058188d81b2ceab30cb3d10fdfcdf9dd58798d5d64da000569d964f7", - "0ced2a54e12062440a9efee3409472d01413c8f2c6592aca968859a1bf06180b", - "e0882bc11efbb92357f61ecbdb0633fcf3765109df84f5662326426ea3a1d1b3", - "8222a2d84fc893a22044ec03e16d968796f9077bfdcbf76b917391960fbec35a", - "f51d0e6ad7ea7aef6cb25cb57a17af3c5b87c9b4518f08755e72529aa1c84196", - "239015c557b84991ea0128e9449130ab739fefc7f13e4490cc4610335077d028", - "6da57dd3995dc7ed45ff26e218bfd0dd6727c77dcb9356fae37c2cd044d221bf", - "abdf433c35a715effcd94ed8be8de4c42f9f0c0bf7dafb1d810a7f04b5754ce0", - "1d849caf36cd199393114c15b4eedb53764aba9da149931e8e4594ad337d3141", - "fe1a486e7aeaf85a1bde53b14deee9f8fba11359e10bcfcb108a27d684aba037", - "02a3ffaa67b48bf8a9e51c736eef55d7beac04b8cfae1a7d8a5099249eb0cd45", - "6ed1c2100346014b98bf8261530323d60d46c1255557c8fd82fbca4acfa0f07b", - "41bb4a86172b7f519f8a91fcef0ccdbdcaaabc9d35bb1fbb759637147656a849", - "5e88ea1b10c262d53156baa39e5c339c217e5cc3999a6e94fa5b9e71e9588607", - "411411e359fd59fd67147d038e3e7486de9daee76011fb58bfc5f8eb60132c4e", - "8969f8184fee65541a879468bd9df8c24d14408399fb294eaab2463734d8c02e", - "4e3718e69f62c6bf9a7e2d511f7e079aed0a9036ea02449bbfea23abf28192c4", - "8bd29d0268933a91d5189ed28db161bb2e9c149ebd23f989f950f127b6b8a615", - "ab48d300ddb0f0fc4dbdad8f729773d094880870a49e2a0e5c636b82bf1fa720", - "1680810eee94a4036e780d3b6dbe2113286914df1e996fa3d33f05e5c5041db2", - "96087f63e3b8ea1315265969fc24f451f81198dc4603f8e585332f6d86596615", - "67c02bc0fe1c80d01b5ea46dd4ad576d9f4b167c8a5267e72a454c2802fb1596", - "6f4dfcc9f884a98165bc05503ac2dd604322b27b7aa83512947a72674985a1fd", - "c26f46352a4081d3bc343e89c9f75f2b3d93f4409ccd916918159d5234c046f5", - "d9687372df92a0c5746c2e77df96bf2e4ff726d4aa4a431761c47850fbfb6c4b", - "c50514440c0eca775230130210976b119b606a1fe1cbfb5d2401198db5876841", - "f5eef5c68abfa56255827f478eb48f8c82d967063a762496b7794e03dcf5997f", - "cd0635d42482e6171fdeea890a6c7a89da12fe70c4427636d16b6348dc1881f5", - "4e967d2e9ec4cd6121d0ae6be9a250c3e49d003e7243295c4d23e0514dc7cbbc", - "b8ae17ba0b052fa7fcd7bf03ad5734271b36a82fbb6a36443af8ae336246fa29", - "9b68c72dcaf757d73d3313066cb704ea569169a298d86fd8bdd905b0e8a75a0e", - "967ee6111b9229ba35aa8cd8eb2786e87c28bf1b23c60c56e59abb4460e75f39", - "59aa253d72d2be99ed03a72c4436880becf5a3fa29e2b69e475b1e6fd048675f", - "0fe4e72750dc6c2fd5c3e560fce66d11380c4d46ba0496d44e8beecc2c6a4002", - "cba2a20409a08efaac41569436b6d66cc6a3c4cb62cb888c9f5e507d53fe940d", - "fcd8c20288f49b4a04ece09c1f7e84f34fbdfe42fceb4aeb4b62071156a9ba7e", - "0e0a27afdf631e5ff921729d50227a39a34734aa578745406e54299b2a7a10cb", - "b42357ca9995d0edba3577ff6a45b782f05f967deb0e489c3eb163c4ac75dce7", - "9a3fa5e64288b29ee27ea9ff32ca425ef80c516709c633bff12ab2a3a5ad5f6c", - "dfc250e9c80424d3cc217f594c7d95bc9796eee6ed11a0422923709564babcd2", - "5d2cab37606fede264ede12f3b043c523c9cd2799fab36a18cd1b6dafed58eb0", - "702f2281f9cf020c21344e4cfe471e898f79cf15050d7bdd39dbc577e3dcd133", - "f2c7a0421a2b76a408d39bcb241323f82c8fe95566e089894543c36f07d097a8", - "6cdffbadf785074e8a1db9d7cfe2079bcee410f631e31b964dae399b502409d3", - "5d91aa8cc20d854eff02bf2908a10d2c3bb46e8fe065f17bbbce8389cda2b3eb", - "f8120dc28ffbee05db83f6e7a50d1d9aed9b92c60c39315689499665d896e4e4", - "3d5261d8dfee9728600bc684bcb3d7c81d21069c3c8f13708d0b2d4e1ad6d223", - "47cfb8045307d66ea0a3a36d884fcb27ec9c0ee9e6c29561c4259a3748095c99", - "c74592298a0927d9853fbac39b62516d806e792fc871049c43186131b4f0b64b", - "90c5e61d525873a7e636a06a6a15a6c118ddb450abfad31d348ae226395d365b", - "66ee4de0efa11e5abd97f5e1c344c07aebb4067986c8d4a1bd65b42ff03834cb", - "839eb4f5e5ea91597cdbf530f800a01a102632b81272c9f2a5c751b5d0feedec", - "0e5f0c87aa2235cf9122693420dd2c8da251ac0afe8c81a223b0397d735fde30", - "106ed6225cfae614c3b47e5f5d6c2821df42b01908f9e010daea109c50acfee8", - "6ed1508d3fbd0a9481a33e1f46178b6bf1a58cb7a40cecb6ed9545a7a1ed3ec3", - "78580e01e1d5090455a919f735ffada744a22169232defb8c65bab06d2d7e420", - "f45710e19c732997f83ee431b7fb7f6c8a57b4fd526c668b74a7000be023859b", - "1f6e0d299ba2b9ee283f691708f946daf60c98dae4df136e17a1ce8184947698", - "0803537df9718872b0de86598c0ba4cf4ad4f66499652864cf09e4ee894e26b8", - "66585bf30d7bd18daa608b294a24918dcbf625a6c55c8989126c3398f1f00226", - "4c351c39cb4864eb46098674085d006270b596742f1511134090fe093a371e52", - "4fc28b5b7115162efaf7ec8d5d3415774e8465abac0b896b1330ac8e831cedb6", - "6f0822fc2dc5b960cefdaaf02d6c1ac7653fdb7fd201541acb7f5938696afb6e", - "1137e44859c3e9f8b84b89db426551f1c9b00c8a64db4a2233bd1feb0e44c046", - "9d11eccfecca58dc4c41b7d7cec841dab2de37566d75a607613bada629743e5b", - "eb9ba6843604d48d21542928595fd47511f63f1bb8ec4b300ee034743bf3f8d6", - "809abaa9f3e094df3e264b52b3eda6406190f89f583455e30abd4e2b6ac56b7e", - "ea3e4f6c057fe49a36ac6efd655324dbf05ca8cc551d824b222d2e78e3400a4d", - "8ce71a17ee7621b62ec5a240b3543c2a7ba04c8a644a8a50a83576af7c53e1f9", - "07159a17da218884cded5d47847b39a1ae721da822deece18bd8f2b5565b6caa", - "279d97c8e73b096c00d06055e79dff9c13569fd6255220dec1fa58d3d512418a", - "8effb97df2e4c3bc5ac8d5569ef6a80c9dd778eb44ded7757972f9ed2c3db235", - "56f2c9491bb18ba4b613641d14f6b130d7620c302993183df0b06693462a7fef", - "f8c7cffa154403eb0d647a1402d118102a2ba5a7e2ad6f0717405bc716b910e1", - "137db134df7aa813e759b410c7962a5cc93764d585090e754b234da8ef21954b", - "9554ec0e940091dcd6e0992809d381480bf3c2cf1f701f5a29413744d8d19934", - "2cb6be17047cb53d1e153e4f716e98b7bf7afd0e16cfd11baa3a0910e18d805c", - "105bba9668c73fd3dd7741006a7d299b239d5d96cc37eff110e8cf7111f103fe", - "67f0ed17ffe6d6ce750b1c0adb5190371f68a2f3d77c8435c7d18dba11f0ab60", - "c7644a5e2bb87199dc1831fefbc968748265906b58a50b7b58f2ad5a3eb189e1", - "4c2734ca6556757d96310c38cb42753855bc3bf9e4f3e7accd28e27e964de57e", - "65c81c23ed3e5c84ba9d353409a7ee984fc128143992afbad8456bef7d9c9079", - "a3bd6f749bf9e393d4e89c088cf00efe878409aedc792ad4f0bdb94f2adc3414", - "2477865846ae889202ba07d368c2338e17af8789de16f644c7ae7155224a48d4", - "aeaa71e41ad590a665d09e4c037e5bf55595aae4975bff3ffe1af4b02dedd30a", - "8ae72e82ebf546f7414ed843635e2d2562e21458388e3f36734839bfe63a55ea", - "d51d23265a458a77c3aa783851f0e687d2684077a3b4eab727035a706db9c270", - "e4fd84094573f2620ffe31df948b2b1d9e91bb1adc916175531b370e1bbeca18", - "25bfb1ab3a91f9a9bcf530642f2d1a85a9f776da0b2a96aff59cf0eeff9c8a9d", - "5bd446c3dd1558d22fa5180d170858e5c0fc2f092f56ade28494c75460d048d1", - "947d260b5592e99d6d2409913f0c00c72e25fa31782ef6a12eb64afec6a5f73e", - "1bf4fc0c08b801db37b810cb1cb7174392019679f43f991a417146b1786deed3", - "38e908bcdbea0e6cc4c06594dc6da0886d268bdc624850b702b6b16647907bb6", - "e729dce3b02f9bde10102a915fca8451c6e89d3660dca95b54cb566c6b52a38b", - "396ba726ab1c1efe6cd4ab11c4dc1d25d5c4fc191f539f7dccdcf1c4324f8d3f", - "24bd535d7d0a3943b1217ba1e04a23c8890c53e17e2d4bdb31b9a32507ba1223", - "bf1d3f5a0fdaea0a2e0d648c3221cc88930a736589aeeee3e4bc3e99b62beed6", - "7d44c2ef768cd9c7e6517dd11282e5a3f8544499a3356c4ee856ea928259d7fb", - "fd720daabefefc52fc7d91583555287f93ce3b383374f98b3d945f46933d61ce", - "f0cf876b3a028dde22c25cba5849097d15ccb70edbafe070912f5bb0cdcc42d0", - "5fd47a2d3df5704d508c69b392cc99706b211eca60351f62fef39e71d2111078", - "0dfa54d2696b8fb1f6f6399a07a8c5f70c846349337a7ee912afa6f284d4a0fc", - "48c2d9124ebd3e1860795273b1e591de6b6e86c3ce4751fc25e924edd7545b3f", - "bbe9baeed5f86469f17003215d2d5d68930823b908f5dd2d61465fa73929280f", - "786573ef9bd06e1dab11fac84b91f967c07915193c12fb07e46887c73bd9d9ca", - "ddd3ad3a9ecff41e6a366395bf33a5d87e75b69b02446f8cbff036fd6c4fb487", - "01c73d245cd07ec45a4af0f565cc964c010173f522e10df12553d375ed512ddb", - "c9cb83748234d1e3d9d148e4fe119105723b34fdd7e1bc967c03bcd20ca64756", - "ab6b59c8fe223ae1466276a17e113eb3aa0297c88ca4472515a855abdcd1ac08", - "5055388ee84965c8d8556245862d202edf5af2b2f223140f380bb921377a764e", - "fe407ac508363508442451679820db14ac57d93d030e4448be75ff06bc72503d", - "f23fe2334bedde9afdd579ee4cfa650fd8e00026528b85eb33c99b6a6462f739", - "1406f26dd26771783771c3ec119bed52240cbba4a9971284472aa812b45e3eef", - "f2e68aeb2516afe009c82125fca33d6393c17ebabdb84efc6fad34bd1fc2f536", - "7bb47429e933f119e345980903731064ff1d535c73a5fcc3c23476f25382c760", - "2d67c9c492c13616dccd5843a2ff6812f75846c08954647d13285a0222660df9", - "619b2ca9ff4ede9add7c0a0c72f3b5f4272cb76484cee650ced12fe0e2edea8e", - "ed9de9415cd2f9f64af33735194096676680c7a93c4433f3b5542390680b7554", - "9d4e7bace9c9024b5d325ec44694c553840b118a5f29db710a4354a24fc9abcb", - "872b221be99ed735f753a51d3a21af4926ec774bf3ad7161864e051db791da25", - "94f4060b64f1e70ab877899546e4d64ab6a32c0e7167e92d979c355b6cbbabb1", - "49d7a49f3c2d91fe0749fc60328c9c6ef3bd083d3bfe3ec4362039bfe6c67aa9", - "e2adacdc2bd58242aa2851d9696845abbe48d1ed2d1cadc74a6c33033c695b22", - "49151285359398434e3c03c278217e669fd55f7129c708670eecad5b91558b3e", - "378234dc9c8d5d8cd8e3ba722b699f5c1295c39a5eb6224bedc901d79316e9bd", - "60cf16c075ea9e30fa07ad9dc7d79e5eeb8c72d46cee9eda89517497e5da9721", - "50128c417f57b3346a90cdf8134b77468635192be2e358bde6bf093ca28273c0", - "7cf2199091c6fefb95770ab626c67258236c81cab79845b441913245c22e77f1", - "7b25e8f23d5a9a5c45ab809299d9b66f8d03e96a20308546f469a8fab97f6228", - "8049222cc7b2f62b6713ea822f5704c0f9feb1c190904e530096689459784439", - "f36d47f50956ee1e0e241c634c249d0f0d4ced1e5966f888232f190c96dc4ec7", - "681022b64ddd777e1e54f92e6480c675969ec2e68d50318a08e294799b53d430", - "6b18d7f9d5d04b9ec4d33429105df91fc0f7d8fb07b5e6acd92bc2135c92b72c", - "b3c13abef86d63513590705a6f5d7b104115ce72909f5ba414512ac3edebd851", - "76ca5c98a230e84c447b60e8354ecd325b51297e5ab47af100f5db98ca2c16d5", - "5ac87a76eb99e9ccdc10349f5e522126c988d40de028fd6d5592df12eb74d5f8", - "17ecd2591d104e333a6f32eaeaa9f818dd01326e2d8228dcbd2d6cb5ad32ec8d", - "134e637ba06704d3db8a3d492ee4ae58af0411d8d91a43ae114700c45e4eb9c2", - "a09ed0959ba75dd23f03c72a67998975d42171ecb8bb7cb4df1c25db68c6ceb0", - "0ebacaec79cc9c9f51b24918a597ce4f5461f67d9544a7900722b93446eab9e0", - "0809c36bf0da5feae9db29faed3191256ab95735b68293febaab65f820135237", - "36aef02bb5dd93d24a28f737a9fe7d92291162ff5aaae8079fd4fb4e12dc6958", - "f9beeed0091a28b00878596baf6c5561a8f37c28acf4ab6aeb88c1c6357acf1c", - "7ec8a3dc92a01096dfc366c287bb6dc6543ac6fc51c92cb439a58f0f9b734ea1", - "adb7ae8271cbbf535ceee4e296d35bb4edd4972975481d89d9632243678428b1", - "3926014d6b40ad0ed041512e193e7fbaae61f14337e149e17162fa23dfb9deff", - "27e1fee0d78a6705e5e490cc007e5a187e76fdcd7b4b60b1e194c8315440da9e", - "4ce353a5ef846b32e1642359c19fdef138354a6f2a9f141fe0b8205bf2d57e57", - "06edd9a387a9d213a662c656a2ecba9e5f05f1e05be84288112f6b71cf90b6e1", - "8d5c64ab82c53fe7f3cceef4ac26e61b6b3af7dd4cd864c06fe0ca3634f90233", - "a54e2670f20fdcffac1cde67932352058f6bf56638f311dbb1af95408f524828", - "05a36207a5b355982b1c26d8119686d2935f37367c51a0bf0061df508d6846d1", - "28bdc2728c08cb0d14b26dd5cac047ee3cd4486652d1f641eae5ed414dadd7e6", - "237a41abfacc2dfe9cbea00089ecda290cf50f445e56907785eaf6ef06032863", - "776f45b942d43ce2cf91aa78e68950a38e812938eda335c37fb3aae6be47f7d0", - "3d7922e79154978b3111c5b8b222398e6a16256a24ccc506ac77fc587097beaf", - "f4bcf8bca138c9102cfa462d72e50352f7742a4d6dd8c5eb55ef7908833bb467", - "c4e52fb9007286b547ba730089ba04ca8a606f2dbf62d05991793e96a0235faa", - "f8ada277278c02bebc35041bdf8459cd0ff3603f04f7b0ac2e52b7d8979eeb83", - "6e465102ca83ada452f484b9e8d6adb9f5fbc990af74694cb58573a8e5b78ba0", - "d5c1cbd3b9b1ef0b030f4a564bcfa3a83ae4fa02a9707ae254136d2a36476cc6", - "c4d4381d1501f65d875247a0266497cde265f3bfcdb0aa3f04df83ee8dfa320b", - "d165b57971970981613be17e4e335f872b1a0d014eb03f553c4e6a6b7dcfccf6", - "0d3022c0dddaea5199162c09a864012afff1428e5dc960edf42eda8bcb610017", - "1297ea0450646cfdbee5ca3c4d3ab44b728c08b71509887b2352af534cc48ec7", - "a5b960b3300495952df06a66df4e1aba622efd2370320dee819f859794787d44", - "582c26f42d82e65a37688209bf91ea40bf7b70ba637f9138c989effcf7b838c9", - "0e5265cdc0b5d0c64d4225ec59f49d2edaf2a935b8b478caeeda94c05a536184", - "0a72ee25e1b8b7620f3e140cb44c7b8a55ea7a5e8fef70574558609bb075ed08", - "cbfd3182c6dafbdc5354524bad203f72eb7039b3a3e606ac43a0b75599c5e5ef", - "026c104413784b2efe4e221b624d0ae3a3b2fbac4c601f6445a5d2ebde24d48d", - "ffd59bccb28c83237bd7d808baad2e404388f7536ae42613ec6a4968585a8033", - "916cc705e7078e9001d6a20e8778ef1beef03055dbfc3566c738a7a5b47d2e74", - "4c6d841d182be6a4387e4e1019c98f7ffa3ac89def282120c8c6244392309fee", - "f2b2dfaed40637a15b66edd12a48b0956cdb6f8a9410f124f261cf48ef447279", - "5bc5956f6eef4ed63d50add63c6b8b9745fc588e519c9675e54a52da33110149", - "d88d03f8ad1f53f6a935b0649e3851e0c13ac0abf3604280993b8b81b2f8ab24", - "3c8d0303fcfcab4c752b50c31cb62d28c7b3b9b32a0ba3c6007227d36ead4517", - "9db1467bcba2e7ec8599c004f5f90e0c5b28fd8c851a36f0717b03eea330f0cb", - "192b44957c6d0333686bef8e526a0b97d5cb7fb7d3c04cff1fbf4e03dcbde58a", - "2e5f1835fc63426e6a41d802c7b1f13b94a740db7cd45033a942b123f6b06378", - "42e389b98df59002c021db1f4c4b4a08d3f7b24832216cbcd89a940b2c21a538", - "da5aa0916066fae8b94d4429336f1bfa8d8274d058300318f6a354fa37d69fab", - "0c23a397b218df561f9d0056ef437f28cd1e23ad55a4bcfdfed083e2f703fbbd", - "8dfd1a316a4c5dff90ce3293b93d328a26af7c6cd7994eb74f4eeff7a59d152c", - "6b9e77c400b788e221a3268103240852a486c0b395bbe75848a56b7eb0eb5b08", - "a83c88c1055017f10820572f0061113458a36980f0c617e3d67f54a7a578a1dd", - "359b909de632f0df9125cc7223e0bd1bd528d2d9d16d151d7ae3c611de4b3260", - "40a756165c17d99ffb8a7a0c937320d01f4397b8a0d77bfe6ef0d5bd419b3bfb", - "380271e57df3ce2819514adc4df8e27f212f612b2a21b3ffcf14a255a6993f05", - "9e3f777dcc460e845867fa951d8e272e7a1807f06a841a7e3b6d2b212e0edb70", - "eeb89de523c6c425b6a475c89b8f5a8098ebfe3c2e621c5c470f975fc2238a43", - "45f1ebd011efdd00c95ffc6a15ecf258d847341f9e13d87944c56d5cd0f1df5b", - "4442fdb244a4ea880675222e5af9f5b7db3c5ac5b4c7b7d047f86f7f87c72bf2", - "43962c08dd735518d7f916d60c2bf86208acace5eaf7004d31dd2bd71ac00d11", - "297f9f54420827b6361a8b413600636477ae59ba4c3f84e119f7bc35e6ddeee4", - "f1934bef4ec6844881bb9b380644ba4240271d155cb1bda7ec3336d6627c5d04", - "616a36d94222f5129d6cc29202192432b6bb13354e68ac05083298e38615b295", - "0061f010f3ce4c4eae18ac5419aab5be5135866ca087e5523e1f54eb93eac9a1", - "bf2bd4a0f05c871d2abf1de72758d7f098b0adb01272195ce7b2abd8b6075f3d", - "dbf7c9e27feb71d6016427045982b3cf28620baea42690dd8409b5341c93576c", - "ad869ef407a521210a63f902911b4b7549a6f3bf9cf4ba5e333c5dc7506f7346", - "92a8dca4962e14d367c4bb1de79d798845d78bb27f5f57f1d00a2e3333bd1105", - "03506e60934a8d7b79a03b7779507548c086b5c37ead281539114f8c07fae14b", - "08fd398dfc3cc14d9c073872e7b800ab7f006c85ab4ac6686e3813dd76ec73bf", - "896ace702859d66dbbc7b98c00d8c310df81fa7435f63698c48ccc73dd2a9829", - "8e055dfae3dffc022e9f70fd659fbbdea5a4e9f566b612ccb18731daeabaeeb7", - "686e96517be35b50376e5958dab08597de831eb470e867d9992ee1647f06e319", - "ffd395c6cdbca3e76f8290821fd35044756ba05cc5c55fa8856a5342c87152c3", - "4a6fdfce3b1618519fda41154bf7f9774526b6e5e0954e0250cf6e55deafe7fc", - "74bc3bc53b0e208901b4222fc7c1df719eddeb2d80c06b348e37cd58c17fac4d", - "98e8384b6935ff6cb1603ea6111527f8e7d09d5d9979daeca83fbaaf0fb4165a", - "a70d82abdbc8d98173a1da12b3bff4e6498b2fd4209934f52d9a1a1f8779ed9e", - "0decd0fef78953e85fb2ebbe8cfdc5113926bc153afbd2ef90edb3909a07e20a", - "ec0b1b6fc1c9fb5b71060b7695ea16394b01aa1883f76ee706c2e48dab64d0e6", - "ff104e3bd0d5e4436c9a4be42406d5b8d3e4a4bbd5032b67d8159c0ad07fbd44", - "596b75e6fd7793d03c88b4e3ea08906bf07cc85c81d4336c1b28c08d0566bad3", - "c54a682db880611e61f276e0574f2ca00a4abcc282ece1b0ca71d219a35fcee6", - "cb96982546d1d1de221f096d30ed78e542b4ac5f068f72d0cf7d9b0f485e6ccd", - "0293f75864137c913f870a4e1de45eee35e660f79275fea472f7a6c9ae2067ad", - "d7bb2bc3760c31671e89959e0c1c717301b8c2e8373c7436bcee557303ce00ad", - "c9148acfe4eb3f057780ba2528d7c74f617569083fc96438bbfd2d243f18641b", - "12d0f2b5585501ad5625c71f096c355f923ddfa47ad7e45c23a70f526b559833", - "ab8ad2a37cb5f46069f13372ec0c0315eee8ae93f8711cf10cd21c7b16885eee", - "9e3cde7596eca722ee7db9acb7e31fe3bb5539cf3fb8461c562a09684baada8c", - "b69649078ed8fc3ae32b87ab251ab38557ed90379165a786fb5eaffc585d06ff", - "fa2e73eeba535a095b88af43bce2f030ada5722f74edb4257de5e3222d3705a4", - "55bc8a190e3d41fab5cb1b307f283807421846bc037affc3e294f3b04d1f397e", - "f8a962a9eefcecfac930e337588814c57d4d1c5a518f11c3c78b377ed8b84b4e", - "0a9fca298941559add8b18953f6ad8acb1b95efdff9e0358e28895b8d32d94d0", - "0b6d4f91a0871dfa9d100c4c8030252f4f96b16df39438e679a15384b11df391", - "19aaf83fadc074842f77ba3407662107e0df7f51cd354cd8285f480015204247", - "5822b514bd49a10dc9b7fc96be6ae7d18267a44e8e09ac13faae5f809714dd71", - "adb7857b963d70922176f4e7c3bc0b672b05347478bfd5adae9d7109d2962cec", - "d3b0f435433545df46ac582928855e49617daa53781055343fcabfeaba54f245", - "143892115a8f6bf20b54c1310e9c1fb88cb216b728584e4f0af8f0c99bba6b34", - "f8e678eafe15eb14ce39ff97c1f119ec04f3c1cd9f5e9cb3f4f877874b63eb50", - "7517012249a282ccdcc2e4a62021b492bb006cecea757eafd334519b93ed8625", - "3f3523411eacea706c4968e0288e2c56ece3dd7e098709b86c5abd51932040fb", - "466fddc41585cb2089d61820eca2888c101b204e4f1bb6409bebc48538474988", - "394b2ae0f6ad53ed6447df8297206f8396bdd82a4b4495833ec838804526dbc6", - "2e608c799d796d39545fed86cc9d83f7f5a10cd11348acfbad895c3b75e47540", - "6ab6b660103c1efc03c8521e7815662aec2cc9b8d6e53ff9212ac0684ae42bc2", - "94c7d867117f9af280a5f5871795a65caea1c53fbef59a7ffc97fddc40334aee", - "f9ef27f6fe817249b6ae150e3c735287726815a140c626326d9cb14f4b40057d", - "31adcb0e4d2e296e0c0480de5a06ecf55a8c9b31ae722808c9989221caa04334", - "7c05295d11bcde6ca0b0adec73017ab035b11faa3c144ca2d330e4250b1bddc3", - "0f9201684afd9d7a8a9120f6a0229b0d7508a970ecafb33a6608a7494085858e", - "5da8d3ddf32f5abc18ff4cc48801893f751f767508074c2ed39db7cbe471d7bd", - "6c6bde25f91419a17b32866f6a7c94126d649e7aa3b57afd3fc8ad7b088283af", - "dab48203371b01553b153dedbc802edaf05e1fff59c58e6794f4bfbec86b9c8b", - "62525e8b1e064b7154f30b1daa39c0fe1a13be5c394f75594f33a8b7a0a89c58", - "d4b007e0ed6a7e8db73c308e626f888d967dff802f72de5479bdbd0be07fce56", - "df22e1c2424bae8681f8028dd1ef8320861b5db81ba9f604e3669c4e12b7aac0", - "7efd3747503b7cfd1575defdd4c3079616316b9bcdebb76c53895bcde60321ae", - "7feba54e8465a10b60ed1630998522d46387b8103858b20be8439a49f8dd057f", - "5e5c68691e5fae4336e42b1ba3afdfaf88f0b9a714581bc10186ffd7733b8765", - "a9d8c57ba818877dd158b8cc20bb76659e6492a85d5b3ec33f349d61cdb77202", - "fadbeeade7551a952048313669747e8bd0c3bf0f3148f40b234430b478cabcef", - "6a0b932317d42bac3724f078641979e36e4057f2e8df4eae4043ef15eb1d3ab0", - "d946be28a27b98f2f7f3bddb8fefdb22d2b1f55aef04c9ac52141c4517ab609c", - "929e0751d4036e56c5c91961caafcf42ac765056da45f6b3f05ddea2b57d9d90", - "1544e9fa40c4307d3e48d8d7be03e10a4ed8059e481821153f536fef2c5b0ffc", - "176b47ddc8a7b28e05e9c4db09cd7fe03df8a1c425dbec54d83cf3437e475524", - "71e95ca04e45d8f4019d5e6b9538baab9b9e25951cad2d94d611e279da8e45a5", - "024bc5689f6ab4484fd96e9fbb4018e2838dbbce4b4363b53adf2f27ef1a70d6", - "c7952a80e1dc895dda53e838c8ddcb0927efada85532bc229040deaa4d63c945", - "7a208e4d7a53cfeb08cad0fc3b709ce05ef58659966546c3e455d18b335d3355", - "67e21cbcd8007ce5950b204e5267800364e5535314a89d6d3bab2a1a3c65c13e", - "4f0ecd2cfb3ee9b8e24f0131d0f2673b454c02b8a25f6362a51c89eca609538c", - "edb856a66a1281517e35ab1aeb9bd1a6e5c72d2e51c4e06d0030b8b749cb5a12", - "0d7343542ff36b49e1fef433b0e8e49347ce1a49492711fb4b355db3d0dad944", - "0ec55c70fe9218e6307edb7f00cf0696d4f55baf6e020028a98715f47bd4bcf5", - "e4f2e6e3a6150d6efbb5d840499e0052587061296de20e82663f72420576e64f", - "def7fd0996b121891de319fbd3457360875d08b0691ed47897212d7dd15cbdc4", - "0e4884a7133025bd44e140cd32c361e0ae99867293da72e0d3b2b9103cf08da4", - "a0517e6d94e4308943061a997b9d6deb4ddec82c88139e2a2570a2614deffcb4", - "6e34cc35235a71a640af029b2f3f15decc74bbe6016c3d82400071adf0792eb4", - "e4fd4121132ee6d9cf0389bff1e43f5eb5023e5775d1496e76e8eb90994efcf8", - "b2e3df5c881babd817a24c98d9addcf0ac22eb2eac5ea41694f946b854e556e3", - "07c9444760c48136d95bc589a7158a2d165394531dc388c94e51f8be1a7bec51", - "ff2d1870fb8a99de0fd173a9f6b6fd36d0ffc7ad29645cdfba096ccdbc9a0ac3", - "c1610254a8daeb891be83cb9eecd5b3fa02d77d8c1ff03fa4d7fe9546feb1004", - "67546256d7e7aecc83233a23ac2ebc3298d83bb17a6bcaa1d6d0051562a2f046", - "32bf56b2333a726eeff21e4812b19a0386baf5cfd403e1f3a3ea9c944599eceb", - "863d8ad546fe646a5ee3bafc87b49cdf1905f20d06b3e83d67dedfc2126a5d72", - "a982fbb0f9deda2f5538cfa74eaf66820eeb5697bff97f2b51456c5db952da9f", - "2f9620c83dd65bdfdf9614a7c086e984103d251ae8cfa84392d47f9030312bda", - "76b512fc6577d8f48c4b84c66ae6ac94548b88caf24cc2b2043f2d356a2872e3", - "f9fd394fe023856462428998f79f6d88060742fb80c2698d9e33982b7c93dbe0", - "856c2ba93350b14d110589533a7d6c0f9bb12d45cd08c868f28d41f201057677", - "6b00238d4f6323673f63fb1ac14d7ba669aa8c00dcddf3f6b2650d66a59d8b49", - "8804203bf1b41af91f0eb85becfd75132d6f288c34804bd3ac0255727ccc2c8a", - "25fc7e0d738c0749ce8e3648fe13713ba5c9aeefdc6ce4c09d044a925e0dfea8", - "246dc387f7cf4e1729254077426beab47645c43a548c9987d7115b86473dd724", - "4903d44720c0e9f598508c72d795a55bbb317dcf117af881f249eb41e07e78e1", - "2970f9c390e8b6e89343ea6f897f1fd0976e7c317d855985ab76fb39e2027b29", - "b07f7616445bbae380ea24635e41746a1031dcb0489e80375367c0002488faaf", - "8c1fe3a73f8384f89db99fda11b67e1528b4490c9ec7c22ffa3e40434cb6b5e5", - "307e94091c013750b3934de95fa7936d07f5fffe078a49d8201a1dd8e52418e2", - "c9b9596b83c3e39e3fb5e20d053f0b75b8a1579229d0c6cb1d23c8bcf90257e5", - "da176a9b107c806b96bbea131d87b10ba9b99741800db4e747c6897db3f34b25", - "03173bc57860881f42b2e3effb8cf27662326fa2a2139bc9d5f36f4a20e1a412", - "79f9c1635f402cfc21c1357638a99c93a063baee2209f4830f643c41b6a9f61b", - "eba0b38fbd8638c764d1187297819c5d25c993f78ab5a84f1fa56634bd6da29f", - "ea6112febc113959f5767fc72426f170b8cea167138750c1ce81e6360ff582bf", - "b3cca350a09ff63a4b89e8d9e70335e2884d00fe80e13f1d62b207843c28425a", - "ce99fc77c24ea5871d87928c3848db3873291c097ac5e698b3c95ae00eab3222", - "f464a8ccf5388a2aec77438fedeabf2c6064ec439d1dfca7fc94b52bf4ce6977", - "528d95ba47c913929631e5e5b2b41a975df59907ca8c868873e7b3e4ba244d16", - "733cbffafb135ae5fd19e39c3e97a8c611b576a0278c7a64b90653e98207a68b", - "997d5786dc1789228959a8710a518243e7514165e41dcd1d14283a7c2da93a18", - "cba91dea8f4374e6db147cf2052793b3a60f082145256dcdee3b02898cdf4246", - "70892c958e7a4073d7038e2204c535fd8fb19e75ff986f636d313b3e1b088fcc", - "c87a4de1d45b0978b768f6d85aff4152c754a96a0ea5682cb3a7950dc0dca3cb", - "58217b646fda6d6e800d3e93d1ac53f69e123ea4bb3c7059ed58230476057619", - "5c89414ce4b88b3b8b6b79096c2c94552045d3a9c30e1d1987298ad775443e43", - "7816699d2c29a50be7da6162b33e65265185c29a439cdeea63bdbb397fe7dcd9", - "f898124a0580c9d1838a78194350bcc7cfcd9c343acc250766222159aa6a6d59", - "c03f1990a8d54e47c9aca89fa04f3a5b5bd3aacf7c5eb7dc46d6f81e4f6c2251", - "f6427dea22a70958f3d2af880efa0f314ee2efa8391089a61821646b4a109d10", - "84a96712513baa6a502f6e628b660277cb2f428ba66f397922d25be662133731", - "c56b24c6e9e611ad847bb96d8644a8f09b24d87532c748ed40618b7f6c89bd3e", - "4516552f72477ddf5d1931ea97e1f2c5be5c368ff3f71557496791628faf0fbd", - "13f9c63ea2f487240884c08c69f916e92a1426be51d260e7b06ad9c2b82539b1", - "aacc04bcda02b243100685495b31fdc29424179f34b675d923e73281b02b5f95", - "7839fcc8076e6328cb0cbaeda5e44c8e29eee4fe663011a284a2ce4e7ecb16a4", - "341172262c526bac651db2a7568ee719b8c6ead0f47285124e2bcdecb48d4f95", - "b5028e80dab2d46409861a8355e37a47760533bca7c27f99d1c3620081caa58d", - "5fc67544226afa7bac673adb5d203a6fda94c30b95ab98afc3121d90d2d9d12e", - "9167471ec3a8e69bf2d4e7ea6965a9adc07455630f049139c68b51558efbb5d9", - "5a3a8e05a5218fa22b28b9801a08b2f00c5043dc03572bc9b91b70b3034e24c8", - "2ead8f31e15197d13df7c31d838a4e1f678ec3ce328fe1662b2d0ed280af15ac", - "fb13115912ee025309c9e32b91a24cbd4dae138a3aa3084ac5830ed3f4996b65", - "34ddef85fe3efc51b1eb7811453c19898e64a4bbc73016a1c8e73ebc1b0a3839", - "da139b0c87c0c6bfbc04b83405ed8541d507287f64142981db47369d69c19e6b", - "0e8a6a5351e1e12ed52a23288abbe604b6ad36a4040b457207f6a95abde59317", - "26392d0003651b0899f76ab3f40842ac49f846f55ae34d0db49fc7110ad08d27", - "2159ff8a1a7450ccdcb09b36c4c83a20ed419fb8219a4965e8609d4050839463", - "070deb3ebeb8e1b7d4cad77ff22d98f92c94847cf5e816bd29ee7dc89a4a3d52", - "4fbda7b38d874eec00c0aa55b2225cee972dd49088dd28040a1bb228ef969647", - "e7bd6a5df7ab64068d9c904d5953a3317f31fa6398f2a86c8848917c2ec9607b", - "bdb1f36322e107477d21fe4fe30c716a9d49bb2c6407246c62db09ac6805171f", - "2efe0188741f1271aa17b69dbef1c2649e0b0dc58d0fcb8c897fe7d79b572775", - "fc99a89bfd6fa94bc3a9ae160806083d97710a360efc8bd05ac362b15381ef63", - "7e201c4beb71ccf00c82288524d8f97e3105fd851fde425b9a54b969ce4617fe", - "0aa0a37d7e97179aa4e76c25223465e5e5b6661ee1eb047bbcc2e7cc4e51a27b", - "a746de122acee8a6786f78316e6a8a313a39ee23f7d26ee27863fa88b4c1cc95", - "d5a24d0eff8076256ea2047eac1ff3af3917b8e948aa74bd70a56937ad40cd82", - "4ec657384b1985325b11aa025d4fb96d909f8581426d5567eccc028ab523342e", - "5500e1aaccdb7f58da3a9777e1727baf41f4c8cb2880fd5542d424cea83d3a30", - "f65b17a2f4aa2e519600f10a2630c736cfbf960a106001fcdd1f5b78d429535e", - "89e4d82e9fd48d6cced991d726b33d5ae8610c0466284e1f2102c6f76452ac4b", - "19c46d7e31b93dc3932b333df2f6edee825ff28e4e683541367cc970db1af751", - "e4a1dfc4f15571926afa4fd0aa2439528f8e0209d3f0035999e0e41a5574538e", - "5082298449e0244d859966d2220ae02bcda4ee445140251961da7b55d3124c30", - "94e633c7109a5006ac133ed2ae5ddd3c6b38731cdc197fc1f7872b15df5fb644", - "c40934a1443c17ac215ef9d5945bf554f7f82bcc24945da6469acd8ea430cbaa", - "452a60c89577f3439e86d0ad8a147e8fb1b718e1cbed004d1b61aabd3ff46427", - "32f8f2dbf2a3a84d21586c447569d551442d21b6f7fd5644cd2fc959ff58f935", - "d3d36195d32033efb18863385efee48fb8641c70e72e27fda663605240808502", - "b76b473a17a4ef1c083c5f8124a16e2e5eb819f5f1a31aec3fc1286ba85e311c", - "919b07e331ea5db3a1c2725657360a180c1a8b92860962e61db9edfb23787a33", - "87738f8888f92abe36c3ba3f212590c2387544dc9612c4a6de71b5797bd9832f", - "55128aac82e8b8289d1c363f410700ffe417db1316766590bebf6b062d06f3a9", - "d2bcf717c97e515c277148c141cb2b4315208abfb6e975761011e18d17826e3c", - "f92dbb982608fb1d266581f2804e8662f7ea50cd83e055ef258dffa743a73ce1", - "bf279b9403e527ebf086a95f3ebd6cb8502874556ed3f5c542577ef3b1fab008", - "4e69ee65e5d06a69149204244406e87ecb858584955ae5e4086179177061d622", - "b3325a72c5a73facede894e115a6e405c64ef8ffc26366a7dee51e408dcd5555", - "adbe8eb7eb17f29bf48cdc299264f389a75f9c256f796b66785af9917ab58409", - "038713544f5ba04247c278c5e115b269dccadd9ae0fe0656bbbb278adc85a28d", - "60de1efd7a9f4b8e693c39f5e9a1d112bf02861b055f2965bb9989ec8b9c3e0f", - "1af1e9d6af7c8d89fcdeec179bf7602ddabaa160c43b896fe503509bbb458004", - "90db43b970644b7ef29260a78bea9be7d8ca61862d8976c9d9b4c6326dcd6439", - "5472f00994b1dabbe52a843cc3337e11a33df78d09428a93b49f6da4128e53a7", - "e151064b9ba4e6fc558222a742ad2c3b1bd2a3577208a317fcca4719b25e27d3", - "16b9a5b9a7f2748bf03652645832f8ae8a073891c8652d6a19e9d7ee3dd29747", - "ba4a682407a9dc1fb0ef863edf79074c1adb723be6c68457f27cc420f272a6a5", - "46d19eb570532a3daaf647861bb12718ac542ff0ac313b0f64ddd1f0263207ac", - "470b78aadb66cef06a590f098811b0b6b4e5690b9ba5c8c47e4c724d44df53df", - "45b9e360ecb53d73f7f30b35c180cac4a81d2aa8186d8b5e0e430f2f545ad121", - "661f52fe8c487b53f966f7fbab777aa8181a69e32cb9cc8273237a28654cca22", - "572740d9f8221b5fcfc0c864f8f3c2ca8bfe5d4fbc038a7bf8dd53ae56cd7c9f", - "51fb0e6e33423d6351c4a4692e6172c29371ba03af351dd139f9222ded8cd391", - "1213bc9a40a7954bd566e4ca45f7f4faee3977e15cd852c5dc8dbe36d3c3ac08", - "e3524781d7c7827fefee5778a26fa07e43b1cbb63965c763e20acca3a88e3952", - "0677ddea758eea2dae825ca90545c5729e0fef535fd9b9d256ed8249fd90f44c", - "68daa64acef685d84681b8008cb56149321b71bb2ea87f743360be6ddff31779", - "9d7dfcd4795110d2df0e9ae79a9a9146ee6009e20718f644eb1418b72c180fd2", - "159986b9c3dfbbf6f75d8b7ce793d659f39e9a8b84c9107c8fcdbac807d8cef0", - "9032e5b8e2be7482a6597e42c4032b64a2d96f059a3d8005e3574ed6d8a82671", - "7304fd3f1dd5b7b88bbc93088f55fc77aa21476afa7f8fc779b4cbe4a3bcc303", - "5283a47001973879c4cac0fc6bee4726c1ddb8cf77878e428f0c4e81477b2098", - "2b36fb35a3c3a1f9e7217795b150edc998f9cee4fc346e63bf08bd5f468cf042", - "ba052dbb5ee06747184f8ef89f6618969e70520cdddbfe9c5c92b6b9ec7864f2", - "a3cbc0bfcf0480af8d981c0b1f485f8a634f0b5d9890306258e5674415f65686", - "9d04bd91805cf33c0d465f3a3cfab123a62cf55cc00e2fe5b20d3e6a50d7d44f", - "0dff10ab8d3ff47c89d3004cea7ac947cf8247507d616371fc649a4144ff5f32", - "9e764e51bf474d1c491b1b88803c07c02de67d8e986dac527901eaf4429b0a51", - "7421f64609aeb007fe6618cd43a3b2f8c366251996abe824ef888edfdf0d48e8", - "c4078c3fc84535dd8df9cda08fabcd17489a720ee6b8bf041ea99ab8345723bb", - "2df96edaf6f9c80b7354215827b7226c0acabe3fa794686610e1e405fc740dd1", - "4c2b567a9fdf50af36fa95d50a7d1bac6f578f038d06c8ccde83d35190d17c81", - "e723f84824a3db69fd8b38afc97895eecd92a76d6cd3f0336f8cc018948c83ef", - "6dfdd6a82206cc9909a30edf10d1564d3a00a4c2a408613d85e27403eeedbfea", - "732474a22c41042ab133821447aa25343f7f92d69dbed4ef13a8297ef8f59655", - "613e81c128e2b00813c149962c7d37718e6b5d61c3fa78c4ec2e561536b117ec", - "1daa94cb987a19371c89f3717fc454433dc69c7ba3fb33ab3d32e5e3f3c7553a", - "1bc984273551f700fd35216567342abe9e726ec07bb836b86ad556296cd9ec88", - "3a1cdb755f1e1f75659710c7a1e7c372df5973ccdc1bbd4e3df0fe89addff4fe", - "57a4b715c7b887ed194c1698da8959e7615dd83498c70d1b13f59778a389d171", - "18275dea75b6352b1d9a454ab346cf1855945e44966d84c13e80e81f8a929cca", - "a3d62c993b2d47eff562fd3f1b993ff053adb0acf4db6e206805cf47596a1363", - "3bcc3e7ecf5c5ebdc79e61d641d69caa8134f8d9fa595a662a78dd367667b557", - "2790d032491510e9bf0bddaa3ef0f30a4f6543506f25738488f42eb7cb489120", - "48dab174821e7d7984343c58678378fa064ac65e0d4a213930ac48c00ad05621", - "78d452cd65476ba2bc0c975fcc1fa99d486b7fa2526b06ff28310768b6ada5f7", - "8170d4020cfbb662549446d1c35e02afebad1e47e83b2875a2f25f3e5e484ea2", - "47eac9c276e4e57dcaada72163152d2bce4181e51854fbf782b356ae987097ab", - "259bc733bd5e5fd3d0dd2f3ddfe5a5ccf347741f20a358ca9715f62fd8c255bf", - "e599b5f3523a0dbd3875c8eeb689448ab4f571c3b754032da4a2d7c48c7d4658", - "13ae965ae75696169ecf03929aa96a251ed5eb6f73f083f6d5d1bc28e163c4a7", - "46a070caf95148355248839950050b538a0e19e42bd89675d6578ac94398b486", - "a313be4458d8cb46cc73ef77e2eed71da3bf9514d0c8a3aa46e5d2055ce709f9", - "67e2ec9665d06622a9d26d5ea7cbc86673c4a5f9daa2986960904dedca37a1ed", - "3367a5fb4365001023c54bb532b9695cbd2c8472fd55846627fd16c7f01a6e95", - "4c09690f7aa5a04187eebe832e1783464e87b431459c21d60e99a0ad05c7bd99", - "cf773957c5fc40164f3a5ee1f4b2c54cc4bb005048b55c21c27c622a8e0bb494", - "86b3587841edbf76c6b9cc736177ecf1193dc599c11a28d5d671192e65c1ff00", - "2dd914a925fd032e6cfd248597ef281b2ab8c82556679b92e103d44fbb4b8a2a", - "93f9883d9061b6a2b17490626ea7feaa1e07996a1c6dbf37086dc9c61b5a77d1", - "fa1e2a90661696b8ed67a6567bdacad85db67d2b2ad7d75512b0c35afceb91fc", - "fb1c4638c6c1d2e48712af0e1eaa39aae98714e8ab942e0267836279bbed583e", - "36f3f3fb292a2d44e6646971acab7c089f974d4fde8c89eff6fb0bf66e185976", - "050a39ba9c77a5ba3c237898d4a37c38cae09cac0d08620236e57c2e9d420aeb", - "3733d99fb20e111cb7e1d28fb09c86fedfb404cb8b31a0fb9b7401afba076f1d", - "b88e89203d375789b9e7fb5d1989a833d3226a00a3cdcbeeb44b390efcec7ae0", - "b7e7a0cb4cb4f0894cc8e22e52b40abd96c195e1592e8021fc8d1ea81096e38c", - "753ac845e691366b62828d6f9030a2b3bdad1b9c78e6995c998140c513a3f1bb", - "1c81b90837ed6d29266bc5b8e715b4311e770f81f40de9bfa8f1e7de2861dda2", - "4931c628e95cbd8d8cbaffe75900900df8134118c5e9905d01ba563e0e11d92d", - "f1912b99d65170488542b4b3469a5ecc4a2cbfdbb1cad3408680089641ed1af7", - "b4b04ae7c513c999071e236bdb21e3cca08f1f6d02dfdc3fb7c9a850b5126c39", - "c74590ff5bb2ac56eab20e2bf0e81dcbde9ea1a844cbac024781dbfc4bac13c7", - "3bc590bdd6939b7fd26ca5cf81dd49ed10c6fab2f726d71a5d4efea633ebca30", - "c629541a285b3721ca44eac6d5eba534e80a7bce1eadb498956fd1e52c15483e", - "17fe2a78ecc778e3cf3ca0bb87c5f55b049bab63da91f1b02e5a278719deab4e", - "d662673ea755d3e0f611593bb54298b661d136edae4c8ff375f6d1e12c108212", - "6f2ea9ea7c4474ea46024b805e0d86ed188fdda62a0c11149b1dd4883544e089", - "169bafcd1b604613b873b41b088ca84838ed490c154deeb91aa4035fb271f10c", - "599571f2292d2d3b04fa1b8b828af7305438b523322c694495627aa4b59c1147", - "a5c6bad960c1e61f2f5faa653c000a19c0887b89a3647a8aadbb1d381d2bd5d7", - "4c1db60b0279d10e494bb617174161c1fadfecbb0bdf3fd1df867183fb714cfb", - "00a9d9a80406030c469d0ce4fed1cc632de26d7ed76acfab06fac18512dba376", - "2c7f3477197a0a152b4e0208ecbec47995d56273e6ecb9c8b3e4e35b5a9a05f0", - "87f8d91e173912a4c8a08d885b66a87d4ce899d59fe20408bfda245ded85fbc0", - "1b96b522d367517b354b393b0e87ebecbc553ea1800a9b80497ffb8d47422c87", - "96e25292ab0e4a7fcb462bb64b073fca2c2353d97252fd31a59a323e53967f08", - "bbf107ca7cabe54378860d9cfad2e1976a14bf9e3e15f7d37ddfdc1a176be22b", - "c2184b6718869e9fa7773611746e0597f51942bbf8c96db978b4d10a00175dcf", - "2564e093f30e0b37b022944f2bc11ce4efa5fc6c11a21d601c091c0208a36afd", - "194069b125d15ade9e10e08cca8046bc6883bc76d146069638bb93fca5f99368", - "f445ddba217b0181dffdf6bd71d58fd1f248eac55739dec74aca347266ef5dbe", - "ca94381e3f2844058c06f5bfa30463752dfbe42bc0891d2bc8150383a281a4bf", - "36f6218a7373cd317141fda781035ce1bc81df0f4559486b9f07f459d812bffe", - "1238a977cfa70b6aa9c792564ddab83d54c9c8ac4063efacbf6071e5b217d79e", - "66c58d59af6753914203de7776472439fecf0c8f63004245b448af3c566d1be3", - "783666bb35307afbc2259e8757d5be60037a0a74bead887f21d7dc4a07f1b118", - "fd3c839edb42d02472ca625762fe466918b9dd193e9889323cbb93094d519d21", - "4aff12d2eadc5937bc3098b0106f1d285e8eaad6642e5993aecdb5888198d586", - "7bf717db52b6462a2a22093a80d836b6831ee11cbd930bf2d643205e2e5802a0", - "304a788157350976abbe9dcecfde794b24c01589ee4df21bea581bc0a58809c8", - "87f3d153ce8d3ddd3620ce0182ee618d329694f58481b2110852d983e1aa778e", - "c026c2246f4ab0983624a5c7fa96f38d403e123553e7cc1fae58fe815d4c1709", - "7133bd473da152cf82406e744ae7a4a40300ff62a963f2aee6e0422b2b34744e", - "4ef68ea2a6a7725d5357011e96c3831d733427ce0dac4d2abf7a9ba4a481052f", - "b401c11af360ba994f7f6fc7f868ac32f13f8a9c23c4b078e84cd8678df04927", - "85ace07cbd606d24c86566550ac22c01c1d80b1599e342991ea45ea8ebe4282a", - "2e1e7aed5ab8198caeccba46c10db232e9e08c286dd84b1a0d5f6750b9df7010", - "aff450ef24187361724ef4cc9d50cb6d50fc5b3a2a40ff35056d032a787b6a7d", - "b700ae28e46d3f16e16c8c7390adb3875d90a3349154dca3d71fe28015cd5124", - "d5b516dca0a6d2d49c8e13821b6d824229e71d32c152dbde740327a5fc5a3a64", - "dc6aab33e1d87d39294f14340bc7ffd611ff1d6331b8e396cbd33bc7864fe4a2", - "9bf7a0118cf2fb5445e7e623418ea1ea53747735bd7f51da5868b3d5c8aa0ef8", - "8188270d3cf36fee83c6a90bad11d9b842dd2f4ad17118b3d4c987aac8e5cb4e", - "d295c613ebc50328e2a077295704eacd771c63529ead0fc35cd68f98001c069a", - "11cae325d7476f73ebfd257bda0d32f36a48128232410928269067464ac5c57b", - "07e8cd6b89a37d00496b5d44538a2a5a88f67c4e64b6d9d643139aff57d6c609", - "3613d58b56335d1d5269596df778c14f6d7b2939d4fb896d7d0e997e1b16c491", - "63d9605279764c6adcdb16222f349356a4e85b93b228f5a0b763de746cda5106", - "d092255a99ab8435b105777acc7a3e2d89f3df8948371babf6f7fdf3aa773f9e", - "395aa1d9f2ca7d6655fdbe889b2d08aeabc54c096ce78a4b4dda742247590e7e", - "a935bffa6d415e88c78c8a355ec9bb12aa4f9f432f2bb9f43f99f22b165438d9", - "34bcff231a48a068c8248c31e8ab008d4c60930bc51e2a684dbdf6d38c4370d9", - "e7a341662073ae50ddc8ea90221bda87a8049b27ec4b3470de4a4c3fc4a58f4a", - "f449b3dde5306ba68cdb3deaf1363c10329b277d96056c5ce0bf48b4d37e1028", - "aeef4de6e303a427daf45b5f4a7e41832fbe2f3ba32482b90765df8eeef9c055", - "551158dab67c84f9451d3ad0041311f3b7314b170df1716712931574494460d1", - "63f5493881c0e4fb9b5f575502067818b185b8f51f43fc64b265cedf33a70741", - "3f3142db7e1e11f4dd8766bc425946091b2568351dc9f9650cdc84cf3d0e29f5", - "97ece8df7f226483ebc3528418116d615fccc393ea74d1a77a7c4192047cf0bd", - "d6300098a36601b6264a33ac826c0366b8da1ebfe98ba08e011e832ff6d9e3d4", - "c26333f13b6e8acc11ed074c34b2f804b05e5e20e3866c0d09456b7f27822eea", - "0ed81caa8e6850cf573221188bce5be67b34468045443e7f3cf3906504c18ca0", - "9b9537fb38e9d0c95715aca5108d71b3516eaa45211f79c3d3d90cebd6e7babe", - "3983b501750434bc1eace18b2452c3736dc86d53153a6a71c55eb76bfea03087", - "d4bfc692fad10ea586143b6bc0b3feadbe868907f89fdd20f6f5174acda00a68", - "ccc50d2fe61092a57cee31eb3185a7dded4778fbc3895df54b4832aca3524526", - "96c66852158385bbb47f78ac4d75dabb84096cdf9082e083a2b2dd5ad4531a60", - "3fc3ac1fab02ed0b4566968e39029b4304aa9995d2bb4001775d181975d479a8", - "c0fbd708276ad5e7c393c4e4214567814c051e81be2f334b0cd15f48d7b0ee40", - "21dae42dbb1a71252c7810d6a0a9fbc6b8e0a63aefce80623ee814629d312f02", - "dfb58f461fa4f35f975c936c6a24d8a2a118bdc342011cf803af669222d47c8d", - "a01790f6773211cf8d702c6c4dcc6e861d15dbe00514360ddbc73b49b7ff953c", - "607a05731292d5dc8823d41be64d98bd76fcccdd098276262684d884ac05314a", - "51e44f2384a2fe7947be806823ca003fbff948f638c6de7eb9b5abfed025affa", - "e71e4c8962ce43e057795c6f29bb16f9f92a7145dfbee6ea3d1931298c64b375", - "1230e794c55bcf55b1e0e29de05c7c7cd82428f19b53585e97d213d8ebc65b96", - "2d2d5bdd58350437d824d9f606796099a1dd51aded9059df287e215e34b84f3e", - "0901b6fe487ada3cd627d8d2cfedad2cec6eae5608bca15c058ec37b5ea2452f", - "77700edfc02ac0c52cfe9e7ac0e81ed8a04b4f4a5f068768c97c5d3c6d3065e1", - "9740c1d48d17f750f3780dd642ec1775010ef7c3a2c1d981e2f3a2482e9496dd", - "cc5830ddaaa627cf61ccdf4f5bcaed1bed519c68a54dd32ef9f7a4f1f638e70e", - "1335473c6645ef1a4c28a258877559f61a1f3af6ac62733cc469698ab82d779a", - "f0690b3cf8725c3186074996cd6a44e09752bdbe2fbe106ffb7556a80d77625b", - "fcba1f546bc34695256c0f2ba439e5bc323a10f687f0e7ee666c9b30dc587686", - "7cf969ca63a34cb1c5a69f34994bda2bd32d8f851f9fe29c6767b43700fb17b3", - "f65043a3ef6784601cc2e9d4693909a694eef2eb2ca651cd1afcc38bf1c73035", - "6fb44e73d25a80f6b5cf3f9655a81664a0ea8abc7a6a6f3c5b97bab7003dd3d1", - "088d66fc9d828be303580cf02c6c407c355da8b48adffdf96b8dc04ff164f1b0", - "2af0f25f07952b53262033c27934a2d711ecb5f096f1d4bd686f36715bafafbe", - "bcac8d4ee77b6886f3a1b859b6581a7ece17504a87fbe68cc471c96a6c5a1581", - "de0644d107ac17e8b16c7d360b827a0a6023cee9ac31d775d1a6c2e6515c2ed2", - "732fb18c009332fc95c3f420328aec8f21aadb05921cc7bfd26fd77263b5f724", - "eed5d95d193fc4461aeed2cecc67c71a4e14491aa93f7f9e0959fe18dad0dbd5", - "4f4f53d00bfb86ef0a9c277d04fc8396bf32afc828217fbbf69ae845d6e95207", - "fc390f53b54a6cb94e576583a637d8f81ba10b7d6f0ec86d77711ede660d486a", - "6dd74c1a36d3d0262c1f2c462c11950db902488449ee2a721d9979525c4842d4", - "33effcc6aa51b9ca710ede29e446a76323e0260d170b15b7274fae3e24c8410e", - "e73d8b268bc04f26d4f794a02e578e669132175554436212d9c93383e59502b9", - "f4a13a78b360669208a10bb9c5711aac3e010e579fb88251066041b7a8882d7b", - "48de58cb014f5e9d8ab01081d73be4111015e81b06a09eb24cc577302fedd22a", - "62d6e606fa703804b28118aec16c3feff47e90efa183b404cbe6cd5b621eed2b", - "26024966b8990f27698ac48b4285f5caa888baf25e010cdcf3ef4d29520dbda3", - "d4ada7f074d9871e3c490add9044578f6d6db33eea9d53236044550a0f81e789", - "b4f3e413b4cd133412d7aad9303c71fd272e69657e8ee8daba7da7c685a6c71c", - "85589b1bbe5f8b1a4d9c1cc342f70817da199b1d0042d94bda3d9aa638296bc9", - "c9364df687772a36a41c61b7590c58153e9adb88eb765ff3f0e28507ea46cd41", - "2d0f10a24d2a9bf48bd21985301194a28315044209afe609b379e0dd1d08e83f", - "cdedbe30f71c9ce40b151437b1e6246b2d5cc72d4b0d17a604cd7fcab03e372e", - "3d512a8be8fd41e4c7727b4684123a048187510b3d28a08299ea070787fcfde4", - "e7ac5b511921f4e49dd46817c21616203274d0f16aca86d75e734c4bb349f805", - "89e01be525a69aa5addf770e8f7a2e2701b7212f01fa27d1970c966e06222b93", - "aa9f6e7640b36922307814addcef5d508551a1db4838bde7e0bf8e1fdf22500a", - "9c5a974695dff0adb2ce32afd8825aa0216d2ee1db223981f67995bb4db06079", - "f576d7d953a4e513a9b2add7e5bc323bfc26de638a1885e96a2e3bc812aa792c", - "28f1d184564880483a0b28f92d93ab4c8bb5787911714a371374a62ebe79d232", - "e0db23313fc4e34f7c277b5fee19c715c4e052f1c708f188669c2ef26a1f02eb", - "691ffa44ef99d31a2280acd25fd7b2b5faefcb11e640cc2a18dde9ffd5d30791", - "63f3d2d9e57b2ac40eeaafc78caaf7d5a922fd6308df6c6682e6e8b2088d2789", - "58c9ba62838200fdf5d54998543b59a13ba0fb346b924b8cf7b4f18575209ffa", - "5ef5409072d9b7d9382370c66e6f17618444f46737e022504ebe6f9cdd75a198", - "40ec49b5989390ea94001dfa875292d51bb4c91a49220ba836ddfb2c3a271a12", - "fcd566f1e93d5cdbb87dba98394d999c9440f1fe005ad8792512ef960f70aa40", - "b3ab98f756b109bc1f93e736275c10767f350329f016de0ee309a58d937dc0f0", - "64fd618b3596999f14355dc2a97372986a5df8f254dbeb6682b876cc5096d51d", - "3d4e3daf32992c01ea86a6381af0a79ff87659f33218a43cf6f92e709f14f03a", - "c58efbc1024fbf2fca1c62b1b158c556c30ec66db633cdb02dea0285b2b4f0b2", - "63a761f628b31e7f7fea1ea8684a20a886e3825d73cafca4e0d241a4a1e85142", - "27e475d5c4b37a58b81a2b5d18327140727c4a8a09617795d6fe0cd8d6ad653d", - "109160582e399f7f2fee4768e75e9749adc008dbb634ec44f21baa3dfe17a29e", - "b6d1d96a17869c95995ed6a7e76773478a05f8b7ee259966f9c485e36c989e55", - "caecb83647ce428eedc0a4e24c1c8b7738f5178d520e243169c7a29cafd9714e", - "f2ae9589d13a4958d5193708eb5f25b0f0db47eab1c3cb8d269d3a72e05e09e5", - "6f33048c606f25e28f564cfbec14a3953f48c2f2e1bcb7311b1e86f4b4c44ad1", - "7cebc6834781b60486d474c78ae4ba470b9f48822c4a9dc55a9d934294f5e083", - "37ee704a2cf3ce39f8698d14a9cc358b84db3a1325cfcd58fa4b5dc5ca60aa7e", - "7b1caee07676092e2511d20829a4139fb2e8c4ac2c9ad8d22ed42e798657944b", - "895450dc45236f970a7d0a0c8b54fbe13f0450cfb0a42022aca62efb12e39e8a", - "b8786b22fdf0f27c3ecf6362333127473e37efd76801fbf9a83a879cd6183dfa", - "796583e05efd12605c178af032a4776cdf712967082a91b9d5e685b937380a53", - "ead75c9c4bd95189dd7070853492c26fa71c183ab6f5bfd9072eb0359dba523e", - "72511e82975bbd94d581a066677e61e8c2dc58af21b3fa335a20c8a2776d695a", - "197fdab9fe4e115ca189ac97628831e83e484eb2639ffc5e759dbd8d6ece4d1c", - "8237d24612190ae86130834c669ad7eaaacead15b28b539c25ed191d2e65e34d", - "12a97d2534502a61613cb000ac491498131068c3d16c507276d9307fbf087172", - "d66b9b6dcb440f3549adecd3e3852e30a6c2a7d401130cb78864ff22c64b7a57", - "513940a3c22bff75dc9a7ccf2eb85d8a10ddda7416d6048003be9c85e5ad44e4", - "57ff1e05fb723e7207f87341a9734a8e75b06fb65dda95cb8523ba3a3ae5c520", - "804c067d8f800ff6ce7c71c32a3a6378685b8da230242688fef86cb173b21e1d", - "7a1811bc7467dab48c29adb844934dad3d7c5966a5133b39e1aa23da50235bf3", - "e2860d065703cc979fa8e624b20713ad7ecd3dbb85e6ea57f4822a9ed13952c9", - "a932c2ee2b2a2d9fd58a2745d09e794d0b303650eb19cef670add639fe300587", - "f69b22bd7f14c9a8ca8556116a60d22f1eb3cfdf61cf1145f21b8350b9dfd6a0", - "c2f3e81189166fe5d0f83921ca47bb07ce7f0eb6dfa47098a4dbc97288be7e8c", - "9bda705d672f0495b9967a7ad80bd62b9a30a802ef9d91d724701a26c797e9bb", - "9a3d8c8af7362e7870b5edf13e109daae0be6a9be8d2224ce8acc0ed5d1eb663", - "c9b06cd1e01cca6d3ec7c8177e0fc0e9a81ec6e792c6b2712fe8f2becb215dab", - "c77b7eed0bc1bfe43d82c905cf0d66a0d3cb8a609f65cf1b1c894a08ded524b1", - "2d1c09a7e0234fd4f120036a1d3f68a9cef5e0953c27df3885a8da74456ebdc4", - "7e3a283952b1c816a353033cd6708461c4c4405d78cdf6bfc74fe114e92b9589", - "9220667baec471663e38607e2a59556fc6f57fc098a39bfcd71605483eb0c736", - "c004a70edf841a975dcc7f83ba14c2ca97a40ae08a40330ab73b441cf53b9cfb", - "0e679dd5cc868b0f88426bee45ee63be406f8f3b3a416db49b2b42e465e29491", - "f18cd155fd15bbb1466e42806b31ca3420b7c68156bc0014d8868e5c865b9c93", - "34741787bbeafeabb33b7e05834554b561158c1994b7dcdfb2685da6030c2269", - "8708160ab4169f0311a8ec15055e4382ebcfa324b7b1fe2cf16d6cb0b09e9761", - "e4f72c152c42e1d2641963d799c07bb31869a24e822f78062cb3101b80ffcac5", - "c4b5af25ef329b3de06e608960bb5e49ce9ae93591a923fffd37819c79be424c", - "f9c40278735dbc4f81309881c3cc08a061526fca0e03577a5b243d3ed10509f3", - "11370f35d18d85b528e82fa6cb588f3314a09c7662dc7b495b7218bda09b0b24", - "765cf89ddd0f7fd416ac1e1145450783a9df3054f80fa7e8519d0782aa1a5c51", - "4aec0b34d139b485a362a77851f8265e79afd7f315e17e2b32e8ec4ebbbb13d5", - "2b7402e4228d8889a0d5d4b95c8efebfd387daf0eed58aa576e034bca730455a", - "b3e6324f695c71800eea71f418fdcc79877bc0bebf67f8518e6abe290aeb6d26", - "9c2641d325be78395e442f319c261f3413dbc77e09419ddd7e2c294ad6398fe5", - "672562b454613a43c14f9546c53b811813d4e1b965eba2fe79392bfb94c1e78d", - "0d4154ff72e56a292cb9b348849065e0fd48bee101f18cc53871d8c4f9619cc0", - "538575d25ea13bca90fdd84e2902049e91fd9edbe0341d21c0f743eed2dc446c", - "e63253f8c13ea8168b9c37d83291832e8cd5b840d54396288a097d95a57f4a63", - "6358f1913375c5afdbac8847ba127689e5e5c5ab06bfaead1000dcc90c4d93ab", - "3b489d6e13ea746f172cc96664b6c3b99f9bb9004fb3c835f96cfbb49ac262a8", - "c9faca7ff8d25161575e658ae9175838f3e92b9ed8e6e5c295fd64667c1d9bdf", - "adfb990fb54f63c1abdfcf2c10fa6820d7fe30e1f7be3c65ba78d397c453483b", - "0fb80ae33d6592018e7c1ce6555083254f82491221a69b1fc636a0e98c8b72f1", - "ccf0b7e569739eeeaf351870d027895789e3d1b39118cb7bc8f2a2f6161ae05a", - "6e2f64908bca232f7598415f0496b685d3cb2078775497ccddd2c852fb89774a", - "f1edd8798a59ebf131d4c01509ca6f494ec606c414ecbcd6264d73c0c8e91d0f", - "c915c924caab8bc7a3c9df59eb7d9a84b57a95d695e17403e0314b4c14c7962b", - "074cd50fad809ac705cd1d837f37b564b5d0964559d0d86e84e48330fe90b1c7", - "b69efd8a301fb957ea30d966e9be91c95f93ae4e555acabf8965862a27c464e8", - "366089fe988d400a21acea20bdb9552c0665cc56bf81864349ded03057339beb", - "abb596b8c159930d0110122ced0fe7cfcc9275f68fc927b5737105ee6f76b22d", - "54cfdcd806c99d14255c923f7af62866b8935ba33c168a7c9edaaf556fd7bb20", - "0464a1c67bbda73b4e9498b25d654e524d542d83779d5afb3c2f56addb3100a9", - "a876247a959bae79b93d5378c2c1f6ba8f3f3a8bd61a8be6deaba50ab019462c", - "88fed337da8bcb40ca1ec6e559767981be013cccbd157d563e259a65f05751c2", - "6ec6b791bd8d48f15ecb2c25e6e21f467fc698cd0de3c57524d83f1ead5f4e6a", - "9328a080c6f69f1a70f48c4ed95112a21f89afa73ad71a3e68909955771eff8b", - "8878f227765fc616e81b4dcaf5fb2c7ce10c353779eda259eab9e3d9289cd55d", - "1348bb011d0a1c77ef5e90edf41eb16e2dfa1f6752322027bc949faa2f32f10d", - "c1a2d2f71585d19b5f39b7a3ac6e4cd44538a976346a98c001e49726bf1c1a51", - "55e0fb39824abd7dea07688f4c37c919e50e65529162c0508c9ca94cee00bbdc", - "4e2d4fb7a9ad338a324c63de41725c32df4c620096979820f9c960f84a5bbfb1", - "4410f5006566baf446d0811bb884f43c6573d3c2017666bfbe4232511651dada", - "534b4d98cb421a873701fd4aa7b9285aab7b38b9e5a76b3e4f2dbf0f050db983", - "693f6c34e19957dfaae00834e22e9ed1aa52915f5c4152ebd743451c8849f455", - "74e7933e86a9ee7690f8fa235321cdaeb6897c87c9c21d19775ee101f1134e87", - "3b356e04ffe04174b4f60c31cae76742c8dc2e860acef101e4eb5366a2a9899e", - "b3e815b6d56138076e609f5181ecdb8006144cb33b11c0a9266a82a8f827fee8", - "f25999dcd38bd7a5d61abf487bb3f86afeccfdab406806dee3c1afd4a873e03a", - "e1bf2e475ceebb9f3f32903a5b65a3bda59940efd7aa3fb6bf2f16d719b5393f", - "58dc9ce10ba029f06f89565bd39838f67cdee247fa9fa1f0d8755b2b9b721972", - "0a77d312175f2af63cf5586ffdd85a8533ed82a7acd9d498fdef649bd59533e2", - "6dd969467121d278e5ca85b2f957e957e271202bff1a33b81ff937d500b62be7", - "7798479edd8431b14a05b339e69f295d495159a65f4ba7c64e05b778feea8ecd", - "47fdc2b6dc37b80ceeddcb9c8798db4bc740b5d57957db72c39fa49c302833f5", - "bee09505d50846afd42db42471642617ce2a97d8997bedc143b255cac274d88f", - "613b571276416c4e4211aaf6ec256ad109a8895a49a2134bd3b9a5417ae81a09", - "61d508e2f94d28cad2e6655e572486a0bc7a79896ffd015b98fac00ad2b44539", - "8a1849ba8d4072880f5b110d94d0c7903141312c14e65c1bddffb9f101036685", - "f1cea43dd49e2a73c21ba4fbb61d3398888dd548c1110323d4d57cd2d33829a0", - "718124c0ab644253d46df7a83089d2923e06aea63b4826e57d9655f513eb6228", - "b5fa8c83659ff3e3a248ab48126959f63e8e1719018fbde4fae37153a309342d", - "b409a4aa7ff3874b7f12cbda1f4743b3498d51659d1e3cd13d2e5c479821eaf5", - "8b491f0e840c87aa917107c2bcb01fff4339d0639645797c00bc574b437916ba", - "6eb977f3b8609f794735eb27ce45d7fb3f6ae4301273506db43b74f34977ea61", - "84c1d636dbdb83ed3d0ba0c1769642e16a85c54264e1f0195104f4c3ca54adef", - "9305089f00f767a81d23670de4a487182a1d4124edeaf367aa4d4841246df8af", - "1c0915a8300c211bb64ab71db2d364cdd15d3378451465df1649fcbbcfeb916e", - "e7a6eda8d4209e20f723645fe9a599fa6c08f367f4e7e3ac334ad650d6286394", - "3102932923e7f7706314d78385e1ce871563d23f68089cc1aa953d6c42404f81", - "ae70c40563e7121852a679a34bdb16e662dc34ea499cfb52aec222b8208ea94b", - "cfd7c098cfaecbf59cb546fe9b1a60c6688316f5d6efe33f58c96a6a4253fe86", - "48417806dd5a8cda3ba8ec894ae2f12dfc5188aa31c38999c6fd940d9430d52b", - "3c21b00bc1dec14dde7b5174f3dc7b0fd20453dde3e4b97f579870e29a8f6824", - "5a00df89e3c11e40b53ca825fbf9332dc267c8440f01bfcebe19302c3866b5dd", - "d0d330df82d552e7fa938ac33ac962d6ba0b6ce7d8c5a757f0719ab6fd79509a", - "ccd60b3a41ff44e20382d822e7a403ca816e08f360ef2129f36c68204386c2e8", - "3eecb17e04dabf1e2ef449cd73c17fff29896f5a77132a086dda21e5b01e5eab", - "5a3f914b84af794bb37c18c9ac5bba0d06b4ea59ca6d1c0404bfaa876ec0b48b", - "377543ba6bcbeb2297d0d9ff9795d3c28fe2489ecc88c530490cb0f8294a4356", - "483e8a11912da04ef47dee7c95f015fdc26f4824e67d47764b15ecb9de4d706b", - "0ca4d2fc20aa8c6e90ece22bf2dc3cfe614a1ec7f7b94d38669952483198c241", - "9ee0e7debcbbc8ba1f2e9f47daeab76da306a963112751de540cbfd43a5653b0", - "2287cecfb60293dd801e6042b0a309dd4be74d8135cc0b27f35a5cf681f0610e", - "c5eeb513098ba294c742ed59a6deea3e3e8a38b1a2fbcc283bf68fc5e56f43a4", - "942a9e880c41da70fb4a46a4e740739e19c134113efce10650bbeade79f5fdb8", - "9ff138479ed563c8141bc1436d7dd2e47bfc275dd13e0141b8af0792139c84d7", - "134c3efacc97fb7a6739ec82123871787d9fd239ff99a82a5ed5a3ede93d9977", - "6d34a18721c564b7c9ce5cd2f2a991aa15a46a23976fe49e38ce6181feb79f00", - "40bf88e26ccb3a030ee5a4ebdab4e014307fb15993b03db9887b842eb9f24dd7", - "29a565610dc88736ef903c99c0b18da754265f4faed194117b7d249e4777bfab", - "1617c00b12c38c00c17b325509f527de2ad80b4c0b297112b1f4f7b88b8cd802", - "358e8574a35242caa6987785247ed3b4338a786655e0e9efdf6f873a864a6f06", - "69de16fe72d13cdd57f4e1f880e861cd7069e53c56aa211400adfe953a820aae", - "95e2e3c1d1d58b67cb7bdfa9c76913bc6b819a01b5074a5efa431778e336263e", - "969958168b9b457819e38c57083a4aff4722a7149691a773d81bbf751c9605de", - "dfe4a0f8ff7970155599db9b5fd941860d1980291a204907488d730b50f948c2", - "1c0874304f81b4869e5f76e7bd18d3ce0a06fde126a851bd0da703867f1f7b3f", - "b85ef284d51e0b9671692aa94b8d66ec52b2a1f5a7bcb7e831b745a53d089a8d", - "c0df811537f1131973d4c8bbe1776d6aceaba3cc959c56deb264702a917b93b0", - "bd98fd82e5a5d3b907a62b6aad359de8ea3d414b62d7864fe714b58c117e817f", - "213c37d81cd9ca1bb1cf39b521dbe7167ed141d42b03bb8bb3a5e775b5fabdef", - "e0ccceb690fbe484f4ef7c73e154e3f97a6ed5f3613b92ec8bea67ed8c7e996f", - "be55b64aa9eee518ce95b6f48d7b59b7a89f6d2b8b705e201940008ebf2dffb1", - "0a8d05c48542488acebf36c7e2cbf5cfc7aff8d76746d762c27abb9686b71886", - "994f87132597eef86ee9f8649ed313cc062e8d6782b64f06ad19994c19ca07f6", - "2d03e69f1a2bb10404d9a2a9ece5197af0a376172cd4cf1c34ae0fcd1763e79e", - "a444f6fb9c40d507781b09f65de62ec0e1378aec06366ed2234c21e2e21f08b8", - "f9f3f8eec3dc9e7794944fa8c1594e5181003e115fd55ad3f65d0f3a284afe1f", - "cc955f7a4b3219c0c3fd3285204a8c517ddbe7268abc47bae70a2487ecd782c0", - "2d2e46e08e8af75cfa044ceccb638397372d5a4c0b60a3cfec417dbafb5b8072", - "91de10fc11d0eee467007734b0b5e57feb4951e968267ceb86f2bd7ece2e0a51", - "f40dadb2b18d7acdfac0ef36a50dfbb2166886aefdad1f9882a1c52df1c470cf", - "e398cb6d491b732e5e9d9bdf2c783904e643248a4273474cce46e18c3395941f", - "4615f7e423148247937e7883328301a8af0aefb81e100cb32a2dfa5d297a3a29", - "7847955d363d2e290ae22c4346f8f4e2eb5b12a07f7aa37514e38a885bddd004", - "59d7145056f6d1486341f9447299f2670844fb873c285832ec86b7071cb70bf9", - "4d493205eadb3596071a3e21a610dacf99f68234d88781f0477b5d7eacc8cef4", - "26f3aa949f80e3735a7f20865c416c8bb0e671a5950071c9e31f1846f8de5573", - "aaeca92897c46cac4e50bbd72d5c43423aa593b88a3f730f3d90a1d99942e702", - "b3df7f31fed4da849e61d9f572601c3f71ea7a03f1feb63c731eb010d2c9c733", - "b4d6dbee6bb62c1425ed334d67e4e23943c703451301015ced1a58c0aff6f738", - "65db52574da937933d45d8fb049d00b49c1412201d390e5fe6072bf57df55507", - "2cc7b46afa2dccfc3399ec11ba5fb2dd21b1b140a2b6707b0e8d2b1921327113", - "bf8798142c2cee6467a64f09a0d6e5143f7bad4b21296712b3cafd6897de5ac3", - "3d0c1a715d7d61b4b742f560c28a6844a1bcf5abcdea996486a79872be33f207", - "003b21510818e7f26b7452b12c108328fb53c05286c06ef80d56d8ccea50baab", - "6baebba7e68ff93f25a8adb449086416398ded66aeebbb4438a7559464c945ae", - "90524d06de1b24997b1fa96133bbbeaf1c9a18bb7ff78967a6be26ed7b5e82de", - "aa6f37327daa6e8afc690d539445ce6629434edbd1a894bde051998c9960fdfd", - "19fe99994a3f2ab378475eea13fc2ef464fbb098c99aa3a1a1730580f1054909", - "e8fa31d036fd6d84ea4456f081dcb132279fd930a98f80c995f18d554eb32f32", - "9b1ca0321567c899fd2446c367e80f2187f295782f71b8fe4a5f3cccecd06459", - "99f68f956e70448a0a92f429111949dea8261f967c9108645cb81496e9a93849", - "7e89af946a041469c7a8b156e6bceb0803cdd3b333fb0184c396e602d1cc7700", - "4cc246ea6fef1005aab4a496e54fa79d758bd9ee9344ecef929dff2e90aaf561", - "04791904e2cc9ba6a45c5da4db6b05b392473a697d087a7155f6b23cf437158a", - "1455266f2fde9b7586f6c33c61c4521aad5d2faee360d76d0257d0c452635ac9", - "16947f94282c39eee4453eaaba117d13b8f0dea1c96095d868aadfeee9248fc5", - "1ce2bf65d7211c2dadbe19a6d0e9c64ecb06fecf4cc097caa77b9d85c48662e0", - "4e6e122181c0f3aba9de2a8330c12f7fa7bf9e2f3e92594ba7a5badc5783956e", - "bf017ccd5c022a7e2148f782695f7750a8d722c6a3d35a37dacb515f65aef017", - "35a73a087e72be3fac7cf412e1a3cbf4862c86b386b9272873c1980b82769fbc", - "4dae6bf126deb60590e4ea3e348d9b5308762d055a77f29f6f5daf795016a854", - "1655c5b365a3488d000d7eeeaeaeea36e22c3c0509a6677a596e56b9ff7d7689", - "91db4726c6f10e6c8351f9e727fa40df7ca64626f4d6a35d90c07cb5a8438c50", - "8637513f6a26050d1305e3cfcff723d93661b7b187955cba45ec6d69f13db8a9", - "2d0cb4ce2ecbcf71e522e2325258fd5c87ed0ab1429452fdf1a0e5733bf2558d", - "c13b7586595319a9e24cfb90b820bcf1251b9cfb359d74c00c844dd5cb3810ed", - "60b1c88c365a23ffe20a272627e06084587da5df45cd5405b836f18ed140234b", - "d5be4f61a0fbb83d65693dbd1458b216fdc7ce847b53f70c79645d7eaa5f0e79", - "9f4b89e641404a840c50fdf10681429f44994a268ff6b700ddb07877df463a08", - "e2d60422ecfc5c44513fe5cb3e77af23a18947e3434a5ea6402848ffa8a0ed2b", - "895d52dde1d4e03379b11d4ccf985bf9709556b2cf3c4beb85026c1f4a3367ab", - "abc6bad7414e3378d8e013e6b316d73e09aa8944410585d481890e1fd74906bd", - "689934ee3f4c03d25654977525d9de0cda863335c746dc8314d6376dbee299e1", - "c02c9e368ec1565e721c5b99d61d77916094e29ade14b5a8d396e7533faaf304", - "f0f375a37b34451af749f83f0c60afc8a77df1fc55c2e161d997ae7fd5678fdd", - "d0b7099e1712ddd7ac96f6387897a5e077e20a547c4391312d8fcdd3dd0acbad", - "636890722d42b11f8a46d459bf0b5bb03f0dc02d2023d2952cd8fd54a8216d91", - "848288b18b6d50174cc78663154f1b6fb8da9b04feb5da6753f6635280e72f51", - "b74e6c9a3746bfe20d0437b4ef18e39a7f6171e17979c39d7fcd27f7d9242b04", - "ef88da07b1800036c644973c352f4c04c1735e027dc474136fdcb32add1194ad", - "ceef45d95a86fd8a00ecb1ed857ec9022910ccd57524e295714aa1bdac910010", - "04198d4c4f8ff29d1f112e92cb4e7302ef4585f9fee69faf5ad754f9e0b61ed7", - "03e279f0a01aa614bb7a3fb66c83ffc71421325694f4c481a2ba70a679b7d68f", - "7e2c96bdbf3c507d61f3274feb39ecf9b869f3bc79289c094f518c783e12ff52", - "20739869f29411d35fe738daf7a8703338baedd6594b1469a2afa470631a0f3b", - "dcc24dc9df2bc158202a4dc100d9e63a3ab255cefe8aa90326749b5d987c23e4", - "c9563127fc43422aadd3c1f4a24bc8c4ed0897a549ef6b8254d10869a14ef07b", - "9147d18e30f77ee059f006481781ba2ee56eb156ae1b3098f0ffffad0034ef06", - "0e5a48fd7a76124a87959f339ec6f2372dc1281ce3d26dfb42af1ebb4d2db0fb", - "73ab09c1fe82a9744331c6ae5c9f3507f08e7648874e1537f2cfc97a160e9fdb", - "b0304b96152ea2f2bf89128651209de1425eb433a311b275de0635f24d774ff2", - "b699053d6bc6e2317e2f21e816515fdc19515fd7f8b611d2ba0029f01fde6c07", - "885418319cb25258af881ca7c24208456cb4e9a17301a11968051cf913105799", - "ddb9f44269a3d06e44760c3310d3f62019403b079af418dec8b5262e052f2684", - "719e5043fff04a666e6d970133c069280835b4e1afd494e6f77b7bbce56454e1", - "551b6cafbfa61c978dfad10def883ae01845e50fbf088540b740440d7a7b270a", - "411bf3cad2ba505373cea146808230655ff140013106fa6d2f15524144012243", - "f6f0bda904020b1812d28f64093694b822f468804be77814381df1a9187cdf81", - "8f66ddefc62d012ea42e96b8cf3954c1f151755e8775f761e15bc0420b1b4f94", - "037e8f5d29fe573395e930f97d9539c833b354088e1cf523018ed25fc0618e61", - "c84f7430da808cf8a0ed2da1ce0d9c9e21aaa275fbee7e9decd04bd2feb1433f", - "3bb392f5223963b6ac9aa77ff489705020f755615984e7130218e296e9c2c7da", - "2f3204ad6c87326b50bad86fa0a151bd02489d901b1dbd5fddb26b29a8d5b914", - "e6a61bbf64d5046eeb7013661079dd9fffe9e9fd7142e534f876418386980cd6", - "02e9de79cd8d64e1ca0536d7516a3c3b6e233292f5b602e7ca93d7af70ea662f", - "e32acd31c7243cd183a3c9773cb2d4571c7a0e369ab23381cd4de9f4ef08f556", - "1b188d62bf6f75371e92368b1da376bc8fd3b4455489e6e7ec6bc51e0162df82", - "88687eff9066b13781dfee047b765e11ec389113f88d7a9d254cff4b9766ac2b", - "1dc8cf5a7c2f64f6f83fede60e8855b600d68e7bf35089ee96c7c758e7189504", - "f1f72751acc8eb20a537934484e8760b9074996c7b55a7a2872e96e7a89b0498", - "d2bc2e3eaaa536a97434443161726fac0541d57c8ff21690a0bdbb31dfb7062b", - "5cfabb93e0fd52c2ee0d319a1811fd1eec023066e268dc3a5188c67e69ec6e99", - "5d2f4f3efd23932f1cf72de0c65304b334405f8d3d563428a69698978f8ade88", - "d9c29efd267f05560b9463187f51bec014b29814dbcbab34daa78f14ee012dcd", - "64246a0747ab1c498aeafefc252726f301e1a5265a5946cede62decd838a4025", - "aafeb536702c766e83beda7f93cf28c7e4981147954a4c49a8faecae6e83602b", - "5d0f15279003163c321594f58534f9068fbb3db192bfd26e494214d2c23fc78c", - "e0d02d411ba0ee54e1cdb93ffca336e47268eb897839ac0086b85591e799080e", - "5ed9da38efbab4f885f93eb97d7f277e2ab2db03e51cd0bc4cf73b86aaf8fa6e", - "9e981a71420489a5e2a855e51d810c06357141961ca0796067357fc9e2405a24", - "a2d87f9c8808909652975ab5817d2c112979a7b4319ee195f3a174ca4b81217b", - "8820d86eb89392eefa09bde2e9cfe071c558a3972771e5d9d68dc5871ea96888", - "3d5c1cac3ca4e5e8287bba689ba8512aad43cec810727225f60f5730cf9ef814", - "4ca66f80d5316f0d54b6a0cbc9f7182157f684ccfd619ab1004e6e3a2a0b0096", - "3ffcc31ea12e2a6caf863c815465eec554f58c56889226092c80e5b30b2fba60", - "45923867d01202a2d526bb3fe0d88ed8e227a85d6b77e78bcb054bd4763fd27e", - "546d1cedeaa6ccb7ea96414640be557d4c20b5676a203161ac8bae97675856f7", - "3ab2ecf7b0bf5241f8a0f64aa5f0a1954c1fc04e350c32ddeaa1d37e162bfbca", - "459a8be05eb0057a90fd1a5414f60d2cff0c53171e912742561a696626a3e53b", - "cb337c5cd2aeba5ff9018a56381fd7c9a0c3bb1dc2b6d6ffc33fcc8e85e594f2", - "b2e5bf2ad098d5b5c68ac6eb7e20d2fffe3d80de3971d9af4935562940a1c1cc", - "c42ef202281f1a722d2d110661a20f089af076ec85501ab745b2ab898a35056c", - "60ec4537a91e0311dc982dc4735fee066d333f16a3780a698c14ea6f596c6b97", - "aced149182517b97f0b1e44da629e00dd1a26643ac9dd706ed5ee23145332227", - "516291dbe9767d49e8f3b7ba0e0f71fa8a9e02c074301d2dab231e9c15feaf45", - "e717f0f25796d7023252b75735979593df73c7ce79266c86cfa4b955de720dd2", - "2716511dcac2fa34a659a1a6bfca9552c1788fbebf1a202e285f0ff76de5555a", - "ef896da95e0056f114e7efb5b7b0fb25b0cbc012eb842a09ec370b80d041fff4", - "c3e54dcc729c7359630b048994e76d51c6297f53a0d5db4cae57367d53e03178", - "4fd7ea0cb72863f3759f3f7a3cc081ff31bf71e8286b2fce1274dce6e772060d", - "e1412b29ed64d60e62afcbc47896cdcaf0eacdf4576bb570a9fa77c53678a565", - "b3f386c7566e28ce35e0db07d53d931b07447f50e4f998ed469bdf1408d54651", - "726fddc2fff85d7e2d990bdd1316dd0375f9510b4dea973478b2b89cd9814bd1", - "1d1417f1de93601738a8139386babf1c52094aba0f827802fe5d148c70784654", - "aa3c51797b2721935592fd5e1018c060f51e1746a5c75ff72cf85d971c93a8de", - "2695002ac21cced83a0a15eee9cb5a8505a66e37111aaafbec082beb40fab227", - "f2d5f359ec955ce1913bff517fc391900dc6898c3380c4076bffe70ff3cf6ab2", - "3a292757a91a60f4b8c0ecb0a4982a1096ae28f33d9d1c3b03f0b712ce26dc1d", - "d2c20025022b2e24ff7ed6ffe76a0385db1dcba25f6fd7fcfa049cab95e8d34b", - "e1b1556d66a60bcf5964d1301437acccb6d5740a5242103c69b2ea67e9a60477", - "1f7c70ac1290818e1b8ff7a970591dae91c9c4e0468ac94448cfbce1c613602e", - "3260941cc3eb521a9911817097e5e1afcf053b7ed5c7fdccabf352685133d6e3", - "ebf4047c5e5ee55a4c50a3010f2db0a786c1e172ce1e9f9de2e0e84e3d6174cf", - "10e437c8d498dbb71a4ec6057a9e992bee4f6ab62ffddf8e605d93bfce2f681e", - "aefd0a9f4ca09dc9be7c3daaa6b4d272e5a8040dcf6c21164d525c62c86f4d13", - "5422d94bc7c51507447f205920fd06c6ad92f8ed48e647cc88911b73b5c0516b", - "5b39a31598413fca5eb01bb694dbe4dc2865dbea894ca5591132ce4686fe7dd1", - "b2518ad6da44ca9f0d33db43657346c70dad44e0302fbfac9f6780d685948180", - "20817eeeebd67d11b911d7de0764049f0e1e4f98a3de581ad7b15c167f857faa", - "b6a8ae76f48777d94609fa2a8094bf627c832f8d21d105858f0f46e6491041ad", - "e0b20a52b33493812ce507f44597553d2ddcbf32900ada843bbec1bf3beffb63", - "c672870be2123a2c978affa8f6c8018b618066d708d5010d503fde3f096074aa", - "f4cb98ad88cfd0d6eb9603ca80edf58c5cc4825a5abc3b89b1833ec97e15e65a", - "e84641bbc48e8391301c083df1696cf72dd1feb2c5aa339112038489dd9d2c60", - "d5b7600c307b1c05243aeb237dae7551a076a398d14cd18e4bbefdb535a4f341", - "ccd9c8b43bcd479a368316f7394b6fe97ad91617d3bdbb29e7581103e7dd5eae", - "dbf179ae5dc4a3c4995d0395712d3691e0ecd4ce3ba957039e5d4b752cb13cd3", - "4361261f684a3c3a1b7ee15f823f7cee26a9223c8be1d2ec791af595eb5aec6e", - "5921419761e1ea024ad4f9831d36f1f9cceef7a827e1084a6ab3c0373d35f90a", - "530811280156d92cd5591d5364b906ee889a95fe1ab5b14d1bb580e5341d5ef0", - "d600fdb0c4c3cb55544d3e46cf3d9141e7def87e3ae30f5d86899b7c03f2f66e", - "0633200438169e46891a6711f8238115684e8be00a0282d1e8a814716bea168f", - "ae87ae981b7fef61435351b08a9accb509fa14fac1889c9b4c1513822bf50539", - "dde37ae0929ddebb3ba836ae031ae2fe16652479c4716d39fc91ddaf31768ab2", - "7ffec1a820b47ef153b1da22be45ea15e9f61c9924543642b03c13fa4afd6001", - "69167134a8b30bf1e47da95f62d2fc191f62440004928da0fba1622938aeb1cd", - "d59837a3fd5a4d13501e95f9fdb4ac449b1576f5aea0eb7525fdf01f5a95c078", - "3e5ef43fe85078abcfc9bb368e7e3cb68477803047a21c7c36eddc5aace9dfb8", - "72ff8d726a8fae181a1f74eb4fa16253df5bafbcba4cd171c400afb98fd1cb6d", - "958f31fd843844df8592a178fd9e109592296f1d2582e6998d9ba15f00c01e3c", - "cd30deb003498a9a04f7e1ab6c0530ddc9a99057b70e538aa05488afc36ac615", - "eab38cd3c471dba8480ac1577f73c01af2ac5b0da5fa69ed3f4028ea6feb9d93", - "6dd7a43ac3002057ba79490d66076e3d5d9ae40a7242fcc7b435bd092d70e66b", - "0c562c7e4de58fa96cb5d4af14a56d181534f5dcda781d05377984d77071b718", - "dc3de01648360e66a64caaf3fb30c13c65a85ebe38f6a0f12c1b0709fdc502a0", - "e385d5dfd45a6fe9993d31a633fe70b9e31fe9498030f8c17ef2c22535e85da7", - "463c1ece9938cf71c8bec351267a3b4a4f1c780c2f48ef71cf9f7bfc42257a44", - "164289850a7f4d425048cd71862fe08697ce1a4ab9f26a003db74b4899a08cc3", - "16e35da0ecd0dea0539a4240a4feff732b7a4f2f88260ca53083460dc4f79468", - "bd87eff1ae59a7c260ea40dd4822f45a7cafc4fa4abd0ad06c8d8a92e719f515", - "e4eb8b6e047c90ba97c0f2644729f4f92289969bee8bb883599bae1855674ef2", - "5f9f96a75000302988e329a75bea5775073fa3f217b2561b934e50c6dad2abf3", - "5f96047a77a1e41a7cafff4dfa7999fb33bfe96c645934499d21ae5bf182f719", - "6219e08c3046c23deded591883b41809b0ee87c2b74ad344f0c9fdde6dfeb428", - "5317d4af85fd57bc4f8a289b5b536420821992a9d65f2edeade2f39662dc9f28", - "ad74173e6c6c89ef6d25c1ce2f492973475950e0f2ecfa2f1ebd7adf18b379ba", - "0d58396849dd50ea0181512730d9a4d365937d1a9cdf4abb9c6f4aea17f6077a", - "18ec3d567bed5384f8b8396be1e663d20b5e6edf548c47135423e6450e4fa475", - "17c791d7c9f36d438ddc04edf260aebfa8f43d6a19b883c1f00dccbbcf6b76df", - "41b8dd69e9478613c00333fe7a6953333db3db84e8c3a429fb495b523e8f999a", - "cbf584084c3f79cb36d653763fd05943877994f2e4fd6eb1dc51ca0b515afa52", - "7c9afd596327684cde7b6e45e4ca2d28c9547803ba8ee7f162333e7305b42d61", - "9ae1e763ab5d15e265818969b7f3acfdad39726edf1f7a241c18eb6dc9fa2ca1", - "437a6d7478d163d7f0dde8daa34d993b2af052c40cb59832754ed923e150d263", - "fe600788468d46d95892fd22ddec408f2e415d983296397eb5f99d9cbc3acfd6", - "31c46222b32b7352765290139d2cde9dc3fa75af0d0ad7770ddcb4ab9b19598e", - "2caa2c573c7937cbad947b7cbf83b1fba483f76ea46554e8cab1b05dcef00fd4", - "9e197bcba57e2eab4fdecbc92d6250844cf061a43f4f284df3642f0a8a9ccaf8", - "347c921577be412442d512345c665c51ce04ffaafe81a4b2f9b4bae9279db1ab", - "269aa762e921f64b1b8c8d838c1f5f18b9b838cc3b387dab3438ce477aae7705", - "eb542d7b74e771a609498190743e55ee9dbf91d700c848c87332bac07e4d8193", - "e35a16ec9eff355f2eea59de8acbc1516da6c0c3fe1bdd2954bbd3e420fe330f", - "8e57235a3a6606feff5cac085e83cd8595e25d8dc2bce9373df0c90927c1b1c4", - "1b870b8c33cbe16a8fd1afc815cb9b51d2318e4c7a94dcc19a4fc6b8e577c701", - "c8e4ff8c1e0cea26e5aeeef942aca1d27deb44aef1614044800c091891c040e0", - "b028b0d84834c3937ad92eb79e22f72b928c06a045286004ba9149d773726038", - "94653b4e3d5973458a47d1cc2d9fe5a82e3189416be76b9729e12b1df437299f", - "61c4705e9781cd2ec7a4f19808af1abd70d88d08c1ff3012867722801fb99bc9", - "3c63613fe9e234a8027f8c3380babf152c6b5840b6a7bd1070c45c91aefb42ff", - "e4e49c18b00bdcb1d153b9b344bd4c29e1efb35324a6159cf8933ac87de41091", - "1e98291b3df9c2f7f5ae5917090af5ec528f8b343220bccfa844eabbe373b799", - "d85ac831e25c0950ec737694c7efd00a4343ca7663eeb269462dde37a285ef40", - "bd17377e07bbe6e260ad29448073a65872e86c84e67cf1a5b760ad00043dd643", - "9ab54bc47af5db47944c7033edb9ac795d7e13a5f6ce3408d936d6b873d0ef6b", - "c74e497a09d4b7878f29eee6d99b96c020e0720efd1208fe0ccfb6c5d680a604", - "53de137bfceb3d7658f933d43a1f16a392e97554ef313d61c2edc56baf629550", - "4bb80056a6e1d37b4ac37d761b009dce7b4834184ec5169752f9a01495b54acb", - "349f89072079d1c2be727cc59e2dbd3f21ada76603bc2bd987b78e272184df01", - "807ec526cf2735da5cbab31e0cc664bdd9730e3e8ce18a43aa1f53e79602c9ba", - "a654bea86dbb819b5bfd61579c5d852b16f1d6be02d3ca7ca94115b398d3648f", - "e89ad4f4554b139dc7470207e38993b04ee00b700f6f8f08688fe91bad20ed09", - "722618b37c9b22f7a54271f3646f1ec241c687ca72fbf474663865d94a547606", - "677e8808e40da8859b6caa1cc8862d796f81e011a9783843e8f2fb9b71a1e9c2", - "b141a216bf26bc751320736f120b4780e41a14add95f0c254b1278942d8a936c", - "bd898103ba15767c3e1520d06c00b0d27ea9aabbb57262240cc2e6f0e7f293b2", - "8fb92bc2983d1213726275ce962b9839e9d4a315c0e09645783a87226480a9ea", - "a75820850108b5b31e6d62271e8cf89792196d451e1a351b1f9eded0bfdb35b5", - "0b073d741ee60e4a0838cf479d50519536bb5a5acdf4a44931286041c9b9e411", - "5019d299206c144d741dd88277cff27363863769ab3ab7f022782c697f1db5d9", - "a357ac11472c408950730090837dc3868bd37ac49fb2c3214d0e7af2257c20a3", - "7d38a0f7a106f3d0ab46fcf11da24f873ca9ba9c29eb9e65e4b884b9f31a42c4", - "ca317ff8b15da0b308c00f812f34b830e342a998f01f1b7a795eecfe6ccfc2a3", - "7cc415e6bd123490cc502058f020feadaff9e4952159d2edef9c98b1ae5eca36", - "391614b538f70c4b7beb093c401038220e2f6c7593ba954dca4625f690ba3825", - "e62350472c44e2403c9eaace10984645ae2c4cb3a1162310a4f04bf08479f49d", - "0a60aa5ccd52dfd41cf8e64134e509b400781a19791dfeacfe15c05ba045a0e2", - "38a90250d618c0afd62cba9c817428af12e613b54728c6baee028e080890205a", - "26519745b8bc875ff6fd0c255e4d911e7aedcb4c84c3087cacd5d10827ea5cc9", - "30d022b488f57af72bf01607a0ba1195d3c1bec6695018864e04ea99301093de", - "f5d35fe9671f7449d72ccc1087ed8b42bee7ca18732722722641382a5e4fa721", - "4103c5a744f48e46041bbc52b32e54f8806f5f3fd92a029eee0de9303e90b01d", - "823b56876d2b6d1bf3ff226b9947650f3c039eeda31df2c75fbf34c10acbd739", - "2fd28ebe0f4cffa67e621650361ccb2f340250bb462c774e2a2d3016e0602ced", - "719e0e879530041c39e3d0fb0adca07dd67ed854420939499c6b94740ae8af75", - "847aab588431704ac5b4807abf8959ad7cbfaa38f16be46e730f69ee721c6551", - "e0e465103f719e12443c5ab2cb7b312bea2ce25d24b208f7065e7b0887628ead", - "0adb68f120b9511aa83b9e2939bf556f74ac20bfbf1b45fa2b2ffd41e4111c77", - "0fbece0933f4e3878886fe5a5bb774d6f641064630d8f35352ad7aa7a319333c", - "e45471e8927631f20ef35d88d0e1db8ae63738fefe9695f67d56abf01ea003d8", - "79f8ae187b953c3aedcc2e7f0bb01dbd5ad96fb71b01e3cdd807ab50261e6384", - "fd4c1e3976ac5639fddb82f052afe471ad7f1d55fe84679427d96c0caa2da747", - "96bdf1ed0fc8b1438a627a6ce0e088e6371f81451d97c45566c2603d09923bf5", - "b3685eb8e7631ba79c5d880f866724ccc6dda2cac5a7164f0ece2ebcde0139f4", - "7286f0c11811fdc3f455283be56f232d14c32120b0233db7dc740073d87f5334", - "88720bea6eccf77ee4ddf83bad6bec2ff0c57d3bbfb25a2992f2d6751b9b7544", - "fe58a57bb3fd0d3155b4dabdaa1b15967b30f6ca0f48114ac937830db0e613f6", - "6122bb1cbd4c48b233f26550e9c23b1cbf0a0356e4b75d64abc98e22125f05ee", - "ece262b23957da8543f2ffd20e5c64b2184f9b265ed267e5cdacbc0d56816e02", - "8370ced5f377452c733275ee0720acfcdfd35f4d3e28fc187c01a8d5ceaca253", - "8ef017a07b1af7055b7b92f797aadbc6080661e899c00f08fb7bff4dc876b480", - "c56706e5baa5409cde4ba50aba4b9cf0031567603d46a4d70af6f55d53a90705", - "9df36a13f957b129960ea2a104ac8c19d96018cb2e23751b5ae8076de2831462", - "e862de0fd9d7b276fffab3099a7951712d424bee588c93c7664b57ea3055c8fb", - "81001c4cfc7871c24797bae1bae0b8ad5d2a8132b255289dcf8ae188ab021556", - "6038b4f8276de4e77105f9b0ac2c64afad2984d67e262d41e88f27601a383543", - "7c154d1f3ead4b7d06c68b2de03848fb27dd43db13faab27e5ab09a977f14e97", - "84f329f3f6e734fae1baac38dcd598b93618ceb57894a0b33c3ba599dc52c655", - "43670a23a5f10ad7f8a2397b01d60852363f9de681c9700acc1469f92c65ae28", - "5cc4e21f22a9d5de10f79412ea1ebbe4a8cf44a2156064cf189c5b38382af7ee", - "382141b7b9a1d35418034a6e8b3b5604ce29111d70ee190d898b87f4df4beae4", - "7c8a85c770eb210b5654fa82d3c92eda1713486e64fc72899d4f5bc13e7e226a", - "62278b9e5932c4ed0353de33307729bdc90f817abdb05d382871f3c28757343b", - "8df2842ff6909531116f9c38286b7590d9db0d04a25e4a8f215cebe1f86ffb75", - "faf3e2955a89326255a64a6059a67f1645f1cd3d63fe5c6d71c508ba82cb88e8", - "8dd6c8948436c1e31e7c51b2600b67fbe5a0b4fd4d213c4f6a6c4dcc017674df", - "e4691c5d2a1ca7313f92855e9fa31cc232eaa95224a98f5d199bf40be5e50bae", - "d5e6f890fadd7bc454e8a990e9dd13f62f80215311086112f0df183cd0f40749", - "a238c1bd2b54e440412f084249855f1db2468ddae3fc6fe3a1a9f85538013730", - "32f939069998ffbfefdfae5b9d40feadd2a4fc8b847c0295eff55a3b7b03f904", - "66745376751c0ffebeff1bf972c80159d69d23084112d7fe30d56e43cb5e7bff", - "e5f4aa21555e2249b22042eed4f9baea3437a208e197ca3cf9b60a4bf091eabb", - "0b79e225e9b9099fdef067d89b94b7de51acaf3630960bc95267d1c6293e0044", - "6873286607eb693cc6274757a57763f6301bafce92bf9713156230924050c8d6", - "9889a43bc92ef9a975e764297b99aeda98963a6d8d14e1f950338e105c03c571", - "5bc96aae6b46f250bcaf409239285b3df32cf69321cac346218eff939cd4818e", - "857310323cd62b9c4cbfbaa0842b88dae2cb9e4610a1500ad67123eb912053bc", - "3a50c897c26ecd84ef58a2a4ca47bf317fa58c51c54f8eaac3be32e230d2a17f", - "02a53077e2112c970e273c02fdff29a7626930b5afd9e446759cad227abf9925", - "e747f016861e1fcf3f18fd8cdf08cc2b6c7626626f453a35e7af554937cc7572", - "d08b9ed009f2496e89b8b3093873856da27194af20b2f7ff593ba1cf0911b34f", - "49923014d8627eba4e91bf7e3c775a93f8ccad5581d3181ec78f42fd8ed0ca05", - "d76f7d5571f0a714a54e222cc1d2cef7d84ea62e662200584910d0bc91d32b97", - "287b880a57b1ed9cbb007c95e1a54e9eb4cae01f9d4a67126dcdb817d4ebea0e", - "41a63804865f89d3eb72c62be6b0134543f141e09a3ca33f764ec995e368e55a", - "a53dd4a77c912a19343387382c46d8eecd293e4c73c7d489b254c2813d38fd56", - "e660f5e691871e9b7475f0df76da79aa4d033d35ee35d05c437db2eea08f64f8", - "c0614106ef60f57e95c21caed42814a177d84b6e135671be51e69abec5a9c6ad", - "340091983e22781dce779027a75cfcba23c3f39e3f876fb479cb9bf222cf9cad", - "85af7955fe279dbd0533a7e30fe3db87d9737023221d28c6b41f8ffb10e2e55c", - "211b6ff2f2b8281cab8f527b63f3e75f0e7afd8e9c5b826b384282cc611cf79e", - "28ceaf52f7979fcc6ed2e6fad6dcb70104ccd7e34733587bf074d47a6069bcfd", - "a7812609e1867ebe54d5a3d5139215f0e12f8e4a4d6fe32585446d1b94b7b18a", - "20f07579d44fbf44b8c74036603ede19e88bf67e189c26dd9270aef1795adcb0", - "6ee89c71992afdd3e382c411d1a3449c25d4dece03674c9719ae2b7ac0711341", - "c0b885fb9d498071acd95358bf07a27dd9c64b737c054ab690a70979d6b5f3ea", - "04f4b1782f800c8c5ffa3ae6c2dd00284e7581c5f2b071e19255ab5818ebdc79", - "89f81cecb9a4e8b854a8de135d6e955fca7094dfac1c50cd1448ee7010a836f4", - "24610b2c7c1563f3d0e5f285dc9d8b295c7ee90790a924565420c0a41d845199", - "8707ebecb77d2ce0564355951507263bc8e0eef5a131ceb130fd1952a9d6a3ae", - "b0c613289ecf4472240360b35587493727d28cf863baa5f389c3d6bf81110a20", - "9a1cbc411bf0ff14a8f12100caa5935910cdf767890b7ff5991b58d91604a361", - "ac233752a8beb7db3b9d440c9fb308bc1239232bcb3e4286b7b8c5daf2b34e44", - "5df0a1d6742117da718e5d9b096b261dbdf99e5f6be19834bb809b35ec52cf8c", - "13cfad10e8fb86d1a095181caf74356239c7cb3d389a66040c6fa607ee9237e8", - "b02b9e56ea45e7390317c9944073ab9219003187b4670d11da707e4289274c7b", - "4c7db9a609ef634eb2481cb69012cbafc9182be0e6c0bb7620d5c5f6b0722bea", - "a67b94a755d2d1a772a24848ff5dea9772ac1f5e0123ae6ce6027ec8d1754188", - "fd2740cb8f25eb8f651ab95416fb21f152a103806e4fe252978ff018e33db47a", - "589db5ee9d3c6cc4d4e04e9524de10339c8783798ad6f0abe76dfbb909c17d1c", - "63fd091074c7b748ed51fe488e72bbad373f373734aeee0e7df038142899a809", - "3dfdd95868fb3161314cb6ab47f0569f621464c617da5ed2f2fd64c93193c68d", - "dd5aca3ab327fcc2687e4051527ef7fcd8b09e1405c9ccc78bc3c2653303cd58", - "35c8f1b0fb5a7541e75b39e19db28c7f4f6462d9d6c8bc266e495401d7739d78", - "50b59a4c38b9eabcfd02c03ab8b30a30983dd1cba9bbe301a3a4bb20dfb53f3c", - "06cdc5b874114c944ea94ab62b9c896ce5930fc2ca1398e207888d5c8695edbc", - "60f4cda74363a64a55b0368372bfba9d59a106b0bfa056c06daa7dbb7e9488e9", - "ff90eb75be03c84b4955367597331520dfa9b20b0d939dbcfc415eeed59b8a43", - "4cccb6892e240ff0da96cb70534dba23363672e63ac751cff042814a60a9ae33", - "8f3f4a99b5a1907e9fed445cc2b9abb3ea65efa0aa60bb8d432b8852b78e501e", - "34b4f3435fefa1d0eb8bf2278f0b6df3c55b83495d50cc4aa59496922952ef7e", - "94a2da777a3948bb31cf25ac15256bb88840def3dc0e5ae0f92438f76cf03ad8", - "4ab7f3382ac2a23f372a438c26768dd95bd217c34414c0107e37915e74b387ae", - "94bd090382b4104f6fbb548372b743f931b1cd0cb52bbb9616eb33e2b1160a9d", - "d71f74f52dae651abf0b77e1f950dc477891d3a4988bee00243eae495c4e30e9", - "9a8d2a5abeb87a48ed521964d578282e0ef705952e0d61d6bbfc8e24d0f4efbb", - "3ed9614d3fc2798a960442c80fb98e510f70ecf709c1732828438da4ff5dc50b", - "cbdab4cfe8f3f75c69f1cd4e515cbbafcdda507f61c0fa811e261ffe39570f0b", - "ee51819e1d7eea06eda23a96ba89c5d4f4908dc8e1e7ec866f6b2c7af58abbd1", - "f8902a764d840b0d133ce9f04c2ca3dfcd63d6927594c083173c9fa75fb53d71", - "8bf7c727941ed46765140a5786c04b85e20a1bf8cf489168069982953ced3c41", - "e504464b05d57c4c2f487b27c0311c3965e8bbd28a916a4752c4c07ec2e8e1cd", - "09726926ad7929e2dba1a93fa961c992b4a3009b20ad204174eac8d2f7d526e5", - "d8c37ddb5f3e4a57269fa6ce13dff0e0216cb76170dfa5e8c6c9280348f68848", - "011adeeeec63d9d0c0af254ac85876b622710f9f169b373cd88d41ebeb947c64", - "8fb6e06989a48c7b6c7b479a1ab3f119c5476fd28e48cf2c34ee0b4beeac17e7", - "22954fae615b3b7b8e6ba5986c17554867475a1bd0b4a14b2412f57d508dc80f", - "8d3286ab8e07b99158c451e210d1113f73b2aa4d739884cbee52ac9f6e5e9281", - "35ec9ced9dff26457efdfdf184eefbaf268f9fe531f9c35e84a82f7cac9bf987", - "3fe7e18c1673171a0e8e46679c2e6beb6257f7996c508ead2a96144d83299bb1", - "5c0bdb85891809d510a40a714d1998cdd1ccf2671c598072e74f693a4e7e369d", - "8fb8cfa1945e09395be944402a9a206caa48b0b9069c73dc85523f8086be03da", - "88dc6763bf6b95844944cd83bdc4d914548e1a01fb51ce4346b1752b3621a6fc", - "1e677c3e085b50b6bdca5161fc59156ab1c81649c126e9d3cca0a130ea626d3a", - "9b6ece74fc64a6a510cfe8bf1baa140230da77dfdb95a2077347e0f812ef73c3", - "55cea1c47941d0f06527f93afeecca4306e1ecdb3a82bd6701215f670dd0a1e6", - "127acb743a794fedc0c28874acd4dd7fff4a8a6706d054425e665b575c3d65a9", - "367cd6f4a625cabe53aa913f7c57d28ac038da490bd60c6ff11e33067c0228ad", - "50f8f236968a83ae84314e1313297af9347b440fcb216929db3a177a226a5efe", - "b4057fc244edd8126bc1f724cd40985242524aa58386a14d516c2d5d791125c2", - "2ad9492e4a2cd109175c4bb41a3a78f3b3144510f9a8c6e9d61c0d983d2b5203", - "1594049ee790703d6bc40abe87ae39bee763e1b80d22890370a45fd5e33b9560", - "a713f5d5ccb1f3613cff88997da45192d600d577b6018657d12a103ae2620589", - "b0bbee971ab9d6346e830c339acdc7a905302d14f2743d0fb28fd20a8011d23f", - "eea81f86d959cb01e007b9bcd94dc8e9017d8db90d5aea65f10e8e4f401c94c1", - "38d15b78c089d3fca26790841ed3f70038b78af7f3c16b7c8d45624ee96424f4", - "e6f4692d7db73dc3e991ba8ed3645042df97813061cd9b030e0ba191b4246ec1", - "9c7facf1372760d0576f7bbfc0568dc5befd369592548f406d61f4ba20eabe66", - "1ea661dc349c7c234c72de0526cd3599a6be2c8eaf91710c0d4bfed44489cc70", - "2c20708a5e8df5e4f09a5c9f54d564171e1cf12c0c8796e40834113edbdf208a", - "dd8fa7c5607f5129a60377f2ba01c214d08018e6454392af7d105323f4b1739a", - "8753b7e0ab6a0b81430d249c234775537ee3844f16091c59e9b14ab5161e0f48", - "41e08fbed5142630ee90edf09d2f7f86e6247a8237dcf7826a57867eb0c5c3d9", - "1d3621f40cb6780e865d89d57ea897520e4d16e520f7f575b55805b1744d549a", - "f0bd42748a50e8407d2835377c7c16ec218bb905990730d114f99025c68b8ebe", - "e104a0aeb26d73187acd7fd82314b9726e513ac760be53c1c3734fa93743e396", - "08088d3d692c86c48d8383617aade108f44216b218caa2b5ebd1d6f1647a13b6", - "55620aa2af13bae853f549c778377513b061528b41bd039c524bae54dc785768", - "51197a19ba8fd36d0f2c9cfc50b4309e90d625106ac9dbe4650c9bc861913daa", - "a7094deb5bf527e38d8bf8cdb2e6f9fff504419b4e3951eb65aa5a2abaa695cf", - "555121b1e2522f1553cf239f93fd3f44d1c178d472e49a7cad777e0d13041b89", - "64237ac77309fa47cfa42b9fd107342ec035c14a09bce9a4d3af3e7c8fb4e348", - "af019c6c4c5b9cf11801efe99e437c3a978d0f365a47b89f3c9b4f4ea84eec80", - "8d8ad1bfaadd40a90f83b0d32dbbbad3635ef3aa8798971850f12d4123970c33", - "e1cef58fb1d6002b6f6e0f9f783f1fa217bcc61c00a5578299784926c950910b", - "d90b049418518d17bf4f3f7550952cc582d6b521b270b7e5280a874859c0ba73", - "de117f362c9f14d69e2e9e01de0df409bcb1589f09b323ec239a19e72aebfff5", - "12e834650297c8291e4c462f5f00cc4207881d121d15ccb3bc50265c01dc4807", - "a1a2d33981c565a7ea0fcee43ce4a99658465ebd29dadb0defb9979ce568a251", - "591323a851cfe6cc33c581a6517f228f142d800442d2826de1a877d72b0bd9d1", - "65cd39e5755d3fcddbf7b8919d481f0733bada8b30b7936aa57350e739815712", - "a9f82e4314ca9086163c3d19813bc2e7ca8c5b02c462a46ada0b8bd135ed3d88", - "793bcfacf8db285a281eebe1f0a689e2c9855d2f803330808392e7d7014e11a9", - "e26d56908b733d74ea21c1708e73dc57c87c1abb5f991b0d971fe097e67058f7", - "187d2dc5f1119c4be517ec2c9a305479473bfe885dd0b6450da83b961e5bb18a", - "47883c878cb9aa274f72fc60df2ab0e27c73bd914a142091a5397810197e5164", - "c80b3c6948b3764e453cef0e01d724c88e741a10d2537d7ddc0badef9dc9acae", - "4e8c4cadc43cfd083932f141d5ec921ecee2785943d354dffc520ce4b0c1d39b", - "f54c28f5402c2df182d100512a1107b2beb57bfe5717de4a1db01aac109a3ad1", - "825ccaa1319e9aa96291ff249aaec71363aab15af22ba23dc7aedc5281ac7f45", - "faa3690cfb318e7c617e09acd6e43b821f3ca2db765f02b98c651e68eafaa4d9", - "f4b98a1bae0f36fe822d887b27e7b3f644c710684a70ff32eda357abfd8c64cd", - "7c44115159a4af7f421667283ecfba44fe97222210f62c35bad7ef2c195d2a72", - "2a8fa4e5e8cd5f922acca8204ef2364732aa479057553a0d8c320879e0e0ef1e", - "30d074991db5bd9d7c2c447df2581927de7f597170e32976cc8a2967e2a253fc", - "d92618685fc2a94a5e715143d5a411b5a01f104afdca974a94fd012e98e1152e", - "3dc4a80a7a388ccc6e4a0d30c1cb8e9e5170a6cb68a5ccd256c38e161293d5a7", - "8e0c7c70d31e9f0d1f4ab82dbc8808e1c26834716e07b13bde19c91b6aafe309", - "66010a0620e45e6a12edf8b74f6ee2d9e9eb47b30ae8baf42352fa0e2aebb0a0", - "317e7851b3f683ee9dabc12fe6d6824ad790da67c9dab77f68320b5069e17fa1", - "b0d7616c1af1b306de691f798a2189641c2edafed30c8a504a3906bd05ab0bee", - "9d98b3442227c4d6b3da3241b9cec67462cb474b2db64d176586ad091f9afc40", - "bae9064234a26652cd974d08e0962d23f3c1d1911c0d1fa4eabf434accce2e29", - "8759202223009029fe82636fe9648eae70b2d13b237609d955643244ad22b4a6", - "a8a48f672a23ce6cf1a7f728909804e030b92fb95694c205e94461c9b5b608ff", - "209b8a7c52f64e562df48086f1a907111b91c4400bd2c05989db6d9af7ee1acc", - "f14ab85a33f6cd488bdf87a8fd1bc7958af9e22ba60ee525c45b5553c4f40227", - "d6d72e847efd2665703b91c75fedb6975ea481a5497fe0b67bee097fe5d8663b", - "2b717014dd0b0123747fe8de85f715065a4c506662c553f1abd50233e286bee6", - "84b2392a211887d5bc1c0eba5f9443ea825a5b89c9e48b9db68bb0058e7b8fac", - "4db7f00eb18edc1aa516e60c028b1f73a1f842bb68241505a7d82ff699eb51c8", - "183d40d5b8eb5316da050a64d646f9f012aea71c9a69adec982ccae3aeebdc02", - "c982851dada9f5a0187e8e8ce9499659aad3d4afb4eb7a4ec70914e5afc5cbae", - "45e81eddaecf7840f38ceb84511c0dba04ab281df713d6b2805d1d255a89642e", - "d217aff30ee4c63a5dbfbb0f8515018a7e1c8fa51bf78d33561183940d7e165b", - "14b54ffbf7b988fd88382d6001948a1d84a3c0460bafc1f914d40c0c90854bae", - "a5cc328e05acffba9fb20d0a40088b93b9adc91eeee36615211832de7491e274", - "c6ed8b6782f0b7ed622c1c81de5fb035533ba179be4c487e1a81f8981ea0bd69", - "8b39d47ddb55ce59e15720f43f4ce7a678b3a19070e9f9c15215e269d2f58f2b", - "00c5eee6c85539b5e1403f4629a4bc6517d6248c47a40d996765ab6555db1942", - "88a064e7c290a284af54d660cbd2a78b8a26f6eaf364372b0fcf8f854a5cba8f", - "36e6967c9b1df585bb701899f46295d708293c8f8775a1a718fe110c5b653940", - "4bf06091128bec7706d8576d8150fa208e7a56c4354fc7eee319e56ec0ea7fcf", - "66b7306b512d1d2f074251022f54ea3682b475a8d90f9397e52a7c0aaaac2c91", - "c6f86e095a9b1050c6a2548d45ae08136692a9ee4d852337cdcc41215c071d99", - "70f3c0808d069e01b330daae46756c6ef0d9cfca93b946b0375fb1b8e9240f15", - "adcca3bbf2628d7f068e2e1dcf23eb27875ccdf6e1986eacccf35f9c7270ab22", - "a19fad5b796e37ab257423aafd0ac92b10e61a27764d0a1dbc74e5a7d04d2b86", - "0603f7159af314fbfd7306df7c5688f6817c0f0d6a085c89c100fed91c2b6c95", - "ded14d0e339c3253b202219ca8582b93ee13be4e04e33ff7094ea1c1cb82c10f", - "b911f0ecd77e72ffcda64f78dac81ffcc167bf773d199ca013e052c7268ca931", - "32e3e061ac17cf6a17c61cf06541a5130a4f23b41bd45489b0e6c80702c0beae", - "6929a72ad602a31cb13adf60d347ee30cf5ed8fcdfc3872656c4d59f9961504f", - "9bcd6c4038ec6d8497de494896fe3ccce703e55cd214eea3b4ecd0c510fd0493", - "ef1821d61edbd95678b728c7ae4228a881a12db0f7622cfdd5a41648106c69bd", - "55dd926db4bd37f0f4e7196dcdeb0748cf6209b721e8b92fa3e3b58812e9f17c", - "4df747766df9f5c709e441b4f57eb8a814d080d37b593bda95c60161e71f9e7f", - "d2017580a76dc072f611188c7a08bbf4e15cee78996e015118a809b1e62bd123", - "edb5d0bcb369929c7ef27adb8582865a5adfd647c33172366fa012f41a57f68a", - "0c50818d3389921729f3166bc446ada868fc0651ce85c4cf91aa34ad83125678", - "b30941782a34800665c3eb9d6509dd8cc8269db063f15f2d6755558c934f96b7", - "3f94bf648dad0934c6cf363f478385412334eff559b93a000a63025725a228d5", - "cc4b0a8a2265496609589f215e854b3f76ef8e803ad2a9ccf06fff89fdd7e8c9", - "e6eeedbbbb24162e9a05acf166337cd26cda625696dfecc6b9b9d9cbdfa35544", - "e2b83a781583579c1018741e9f3c749858223ebbac66526feb361c18b19c8b8a", - "e6a602c4fdb09ad7f517644bcacaad4785ef1af8e475f61173f41d1892365e2a", - "acec5c4e425109983160700dd01ee76ff68b8dc6c50a879a1d9b7885625c8c0b", - "d6b08e5750dd8aa2157116abdb82e43b1102dda61db417fe902fa726b60d0969", - "c4646769bf4b84203e9f00c21d1f188032a942476aa588ea40be7a95719e01ff", - "3f62830ee7a66dc53db3a9538c3a8576f483e4a145b17c6048ddf9efc56e91cb", - "3978b7c20ffa231d7f3fe76ddd20cebb603fdfb5914cdb17db24e04b2eede32f", - "8a063b09fceaf6a3d54a9c89ebc594d95865237214569a1cbdbd9ea98cc19382", - "310086872078b8c964909a99582b8ef49c5637ae297031945c31098cff921fe6", - "6e5c6498c4318d935a36a499e37df095733506c02efe22873b769ce2cebd8c54", - "2e1e90259ac5641628b6e52b55c964f1d6c2898f7fbf5f9ba93a721c54161d3f", - "2a750e88815d6def4d7787a54bbf578c5545651e07b5581aebdb6337c97a4719", - "129f63f74feb2813c8d0f5ef87c4f187003567782ec2a5e1de747980c94bd11d", - "800b0bd4e7882b09699f369e6106bbf64a1a959c6bfed3cad9c4e818052d62d7", - "2fa11b600dbeec92b7fe7c46b3ff3841882fceafbdb3685dbf9f5e1a4578c59c", - "41f6327e026d6119081cb3bd35bded0f6d32696a26912dab894d3fb1a9433f0d", - "8899db214cab09e8c7385b69fb199956f0c67086261bd1042e9ed2a76c1f2f7b", - "1ffcf928bf06cc3587263734491fd9011ab64c0fab567bb142ae2b226dd3d3f4", - "8921f965e2b12158410dcd155e22a2ead8b1e9de50faa03b4de45487fc044e67", - "d81f765ce5373b788908ab02a5514e75cbd8f986ecd9876dc92338308c2342dc", - "c8196f7cf2c69f9342684d15e934b87f75b2a1c4327ecaa6a5e9c5dfdf362ed8", - "3e6332000fcc93652794bd12ea68eaa4032147a9fd0b6a41bbc1b878d53c6001", - "0f97dd85256805620b142a8680663e01dd41d5df4cb5b67412463e9f13cadc17", - "0e9217656a3c6fba15303a52aa98d1c9b7319336e4a40828600756cd47582f1c", - "778fcf68105f0c545a34d21c9f10acba73789adbadb3e3a35bdfc52e17d7c35a", - "159600a7f0a6ba2662852b647cb0d6eca09c8c2a3992f29ea67edca1aee83bef", - "811de12537be79fb3dab832d5bf57e0bfbee8574fb52d416055e9df29a88143b", - "4dde1d7a0abd3986024a4cc5f52d1ce5449431c503ae120a30de116714c534ed", - "1f9025aff28373b76357466cee7c01358fe3a364340605fd4bf0fe5c5f5a5c96", - "bf599578e3554d0aba25fdd824c548679db0493cdf7f5a0271e2df3baa62898a", - "dec751c3e79103e493c6416c229e76b67bfe44c0d8c5b3fa4e87faf19b4c89c5", - "d15805534d366b1ddf0ff6443436542251fb1487d07b55874c5246c9610ec6b3", - "7eb14121677940af19882961f4fd7bcf849bdb9625b5da189866cda6053c7aba", - "83615d30c5b9f5681632da0999e01c5b80b072b0be1310ff60b1cefbf54e5bab", - "b3e4bc28788466e26d2484e20d3879f55cbbbf261f2777cc8ba5dba468307379", - "7744a2b69d34be627c5a221f805650d5c6b449bad5188e02cb8eb48f69fe0420", - "dbcdc7874ff97ca88006bd3a00eade7ffa42543c3a0fff698a4772adbbbbc57a", - "c886782b4b7e7be4ade1d493a7f59174cb318da39b0f1fe5a4dffef671bcda66", - "7935509d52280c90aced9a0cb98ff84a876b6e544ffb1700f9b444232c778f84", - "172cc8a290d47d89bd70e5ccf5654dd73f299e3241884ead3599f450db3b1c03", - "afd7cc2efb07f12e4756e5f519a671052d030a289a8ab6c803b6dabc9ebdc599", - "6e8f8844e17ee84ebf10ffee1f0594e1861ce7a960d92c2dbc1c1e7bca842fa0", - "eeb761aa89e95b8122791fdbd03e6ebd96a098336de8a87b735d6690e1a3d4fa", - "af08a392e8a81e3337aa38bb6c07a95c615b177c087d2a0063f2600675d37718", - "4747df4b5683864bc8e2e945f7c64fa527ce02f2d335de13b95657e9736380c3", - "2e5a578488800f51a0aa7ad87f43f359ebb4dd71764b7f478d3e57d2fef3de6b", - "ec4c7c7ac6f87488e29e907dbe939ffae341c5e16f56b3f191d92033892c4a8c", - "0c92627b6473648e564579515e1160e867965648a6be888813218bbae2497884", - "e44c05dcea165dd05c1d25a6428785f44aafb1d780e4d09dd29fd2b1c2f95365", - "c6808d7fbeabd0d431a050e1920c6ce40168ef89220c2a7b57d8ef4d42ad050d", - "2e0d00799070e9ba51a9771409beac15762bea5833bf0444b071be4ab48167c2", - "61a26ac9cf1791530c849d713bb3b2774ce1d6fb2b9f9ec7819fe7f655e5a1fa", - "bf06c661fb48ab4d979bcca8feb4501b50e2e5896d5d96a81a764bbf411ca963", - "919176f446242a733009a1d6cf2bda5694c9cc364921341b3d6465db2ecc8e61", - "8ac5329d69334cd5edbc4ede4b66a5a18cc9366740504bcae26ce9d2d33f710f", - "e991d2af58f3dbd03f02b21329bef563ed12f36b583a4480ad45d8e083ebbdd3", - "04ce1c489bf2776da613d29fe0ee1677af26dd6eb71186c2f39ed09ae25aa173", - "a412e47ef883e6210c2b260c023b10819747646469510ad6ccdb4ce956608147", - "15db1ed72897ad97209bb3da0b7f803f1b99ded2d5563091384ed659fb4e4d15", - "7669c6edd7b79262b71856d312c28d775cf229ca9c722d37b1a57049bb5aa578", - "fba9fd62e9f1eee8c09faaaa689a381c13becfb9790a029f1b2b807c2026415a", - "3c584f41d36ebf0328ca6676661257936d9cba44ef5e3ef58e3f842628da649e", - "df7435b976c392041115e418cd373ca262ae556ed8221a3ceedd93d8275390c1", - "b9af432fa050ca83fe24f09f7e9adadaa30ea469772c5c31b1f6712122e81c9f", - "0872b435d057901ccb72501fe30d7968b62ec50fc859b535a694d7b654c746f0", - "a6806f53807f4178c5929656a030131e729d12a11f070db0fbce52e216843a06", - "add4c5f4c8153fa0947e288d62099f70a6aa866598f206832842e39465236f34", - "3c862ca37c02dc5d4f18208ef75cf62e4b5144ee3a674738b9f4f991b141edd2", - "f232d0972850c3431ada8ff2755c65935ff35929a94e11304e851b8ac475e2c9", - "e4c6202e0425ac28abc619d03bb83770e17994d2d66cb9d880e4a23a3a708259", - "0a6868102feb40ac6bd39842d21032d818e399b1c12d43436e6f02e070a74e2b", - "0b5ca094c95601e8cea1550c1923be133eace38a42d13bf756a437343126c950", - "f39e592a92eeb9fb8b63d1faaf5c8e54d3ed2057455379cafe30516547d4da73", - "f16a8b90773486d846a44f61c5854ff4c06bd5f431af23e4c95827ac6c2adfb9", - "af5b870814eb5d78e52f94981020839d0cfd7c9d96033e6ff82276d39266067c", - "7d19e300bf734b4e9c5de9578ec6b897754dbdf980e45dc50259fb32970464b1", - "6b17b896a0c961a0609b055aa6cfc656c37962a3bbe6da62dfa50af191841518", - "d9e86324df8d051b1b6099682bae6a0cadd3ae23e4230a34d372a4e7b52bab36", - "976e865695912d8b89849f2b24ce2dcd5c4a4ad2e3dd2fca5a6c50ba74ce56ba", - "45a9342866552dbc08bf4afe9527e5ef2dc09d773240ca1daaf4a9cfc2128de7", - "8ce35edce09e14fb2e92dc55128a625e006c5322d247526dbf355f49b80410ed", - "7f12d673cf828477284b7fce15561dbe9c8ee5d26af02ee9854b163d977c507d", - "95fa834619e95e9be405dda89f5e2477a5b2cf26a0b1fc9d90e7f0472e4ad284", - "f9e08fe5ae6395aa2c0e1db9c98b0a5ed54128d81ad63cafff57ab0a635733fe", - "b0b154edbb431baf02b44ebb4acd18efd74c57b08e9120409efb4c99c8a72686", - "23e4f6c199f8c2c3420b6ac7dc99645bfb446654e10ee5d8eccb166ea0bc5b2c", - "6ddfcdc0f98914aadebf72a342b54a4029479858a9cd52dc1e38a19c40929a6e", - "ef575192c824b9f9ee6c774f5cd8a770f56951f51637fe9b6546cdd8fec4ed52", - "6d9d6a2ce8284cb80b71e088fd3c71c34a6300dd21c312dfa54be7862aed1322", - "4b44f207b11def4e32eeda836ddd9e48268832adc814d627896c38c1e16c4663", - "7d7a1653d7cc6670bb25d4da486ab8da07df89334be63c92739e262dceca32f8", - "3f0909e12cbcfd60008482c4361f5c64b42d3941e1eaac651ad2f5b3c524cc74", - "871e28309ff33bc20f668eb1b2a794f33a05950300036b86dfa808fe7e73f890", - "9638223c97cee89d7cf89bfc2e9e017230021c5d31741395df64eaed050af462", - "9f4247288759b6161fce3488996b6ff4ecd36c72216c3da4f39a72982e9588f0", - "fb81a6926dde0cd3f5fa5e6690025917ec374bf1dc4bd8ce9412d3ca74190837", - "acffe54df28618ddb8b1597a84b34bdec458e5fbe1b51e4c357aa6dfca0b2cb8", - "3ba186f72d395cf2ed813e4c260d6ed57e64852edb7f1c7e67caf52eabe430a9", - "8d3bc83152ce9bbb2898d9588f489429de91c574017345cb458cc8603aa33199", - "b81c825c73fa27ce4a48368333c37aad582ad1bdc869ffd0c7072832ce2b833e", - "970263d3574ddd69487558802b0505ff2df125105c9e923c8bbd38611cdf4c20", - "0ed25e6c16dc74ba0b7e18d75f58d79a42294c8ec8482fa0a3e832512aa652b3", - "8e4e03442e380e1bc88fd4def2e666d4e951f03fb2c5954edca78b556a773dbd", - "a0cb5de662929b17d2c4d8b45c695da5435ad7fd1ae31a4d1f4bec3c631a34ba", - "968ffdb04069b96156765fefbfd1986a108e6ef585cfba162eb26fd40b85a4f2", - "888af55acad67ab03fcc0029e7876a5bfc773b8dd1cbd956b9d951a44b622d00", - "1b79d029d5aa9661496376a40e1f03d6081b8ea2f18cb1ebe724bc8b7e58bdae", - "71c664d51d78756600912628223f013babbcac95ca81a00d6a4dcf5efdd504f5", - "3b8bc470103f5db75066e121096d43b52e448e3f6f6e342f467f28530d5b9538", - "f1132831e6add1bdd36bd71874d91a6b66aded2ee9adf04e18e57d47a95eab58", - "07a3bae580f095392366e062a74ed158a8ee091223d5df6a31797cd35e35f969", - "00547dcea27806a9beceb7ecc43022555f48c012ec970943e705f661de6831f2", - "a99522794e0a8c805e18afc8b58dcc4b7390c27dd661f8a1a0b4865fd0c03612", - "39cfc294b754ba13b632daa553567009253b619eadfcb2894efa5fc047ebe83b", - "6a04e5608a8c126d63b65a629ce17aa20b2f6bc8a50ebe9cad8d21d5b792e540", - "4d6c3525b85b7e34e4a480869797a437fc2e715a77c01ad693f096351581afb2", - "03527c04e2d7faa5f25ee2c4e780f086b4cbd2aa51960ad54158f3f488260b09", - "e46226c7de83257a299c5b0510dcf87c2bd292bba82f2f525968d799f705236d", - "5ecc94c54c40464fec801b5b68c6f02b1496430c179aab29e975c0664fade8ca", - "30f1aa0ffdf52a6b75ac861fd9185ee68df90a086f2de5bc463fd2e66a26119a", - "1450ed6308168055b5cb80e5ad675dbb7089cffed6636da571591ee72ce1cecd", - "87d35fc7b53f25393d1083f977b1f61664310c2096e585d56b6704a2966af024", - "ffdd28899898033cc09109d52e0793a567a8a5d555382c6be3ea54794ffc7782", - "0398c0f74e7aa10ffefa11b05ebec9d8fa77f056e7f4b2005ae5573dcd51af06", - "b093de3368c8107c77a9014e23f6308d0d53f18bd5049de02200142d047257a5", - "65b0a447bd94a236caff28d5d58969834c88ff8d39114bf55de5db9c25b328db", - "d6d6e32f0ab7a064078da8c5b7459079b73f6c5222cbc0d96f639891e6c9e80b", - "5743f17ecd9938ca6e9dd00cb1d3ecc073116a42fb73de4798f516f9d8ef0794", - "058335819b212fe711e59b6711a5f8e6da3e586a7ff21e5e972346de2e281849", - "8fe7ac18e85cc2d52b26107a4fb65b971d960e8b66d59ece17521f4c3770ad54", - "e89a91841f73b4581dbf951579052f76fbc0d66ae60677bb82bfc9def65a3900", - "cecd86f6379f3c1d69ddd27f1f0abceaf63cff54e1c315cf60db69e03a55c129", - "5c53091258aae7f7d53fd8b062d911475c41569b3afdc3d33d2236a8ed1b17ca", - "72b318f1b4ecaa1fa19ab4050e623ccd3180314755398acb8558eaf5e374a646", - "923c67e534f3254d7a01dec632eb8dc4a93944e17bb6429c1ed24ae48f8cf747", - "a7a31cf1625c30c32eb418b83140e72595c6fea873b116bc81add4a0a18da75d", - "1557c46808aa8d943675d86f2804109faaa9a33f1ac0a420d03aa0db4118fdc9", - "ea747ba19ecb6d95c7bb651d3e86d07be9252ba7c0379328f3849181f3104cab", - "01f9faffa2de210b4e00f0ba40088280ae63cb201f65f0328c6f3f7a93f15692", - "0d1f86ce72378452ce3258f009089e7c8e429f9bf77d0af59f2b065d89efea19", - "bb9aff28e2028ed7a4b5c1765561aef10ace7fedbc7d96eeef4fa7d8eea9aeaa", - "41fdf4b20a659122ef53d95a87cad242cfe2b4de7ca9cdcf34749858ba010b8d", - "b3c2b96359bd52b22a31335d38b200cc891eb105174d0b0078fc7a56f66dfab1", - "32313b09225c178a256eab1304a400bd1c7ab39b021e6a7c7673b7bf71986ece", - "27634e7ea26e58397e37c824bddb2bf2921e162e0fb7966ba5bd00e91a5369bd", - "139d2f3f06c1f260758d5637b9daac92c7277b0acd6694d4eba9dd4ff7f72825", - "5cd05ce36da28df3342cd4f9272da29b89716ec7951d3a86bdbde72729dd6499", - "7358d96d318b8d065f1d9a1d372694db89d5256fd7d41a7c2e370c1c59533e8c", - "ff68a89f947467612fd337f294060ebf284321654097a91e8cf20575cd6138f0", - "6c889eb8a6b26e63540f7945ef252429f0fec850077e5788ccd38fa82aec4239", - "7cf779f8cbe62693a5f3c64aca4799f408aada2ce5a03964ad5d5d90deff071d", - "193a6b23c078a822524ea722647b8bccbe34255c7fe4247d8a2e72a564dd1230", - "da7faecc22c614840d14374d72e8241cb5658bd4c7eeb7c1159999f2adc25cca", - "a730ceaa523bdc37b2d21e6b52301dc7f19acfbd26e97af68e630c99b6943b20", - "53d256585006a8990691fc386aa04a1bbf4192462aa91a83b8800f52e0429df6", - "6cd22bed14e206b028918832198cf0855c736524c1d56e2421ef94611205dc60", - "e8a288b80c44d2235cff0db247cad845deedfda80573db33feff0660677cb36a", - "4f39b7ddebb5c14f8e22088df9a40ac73edc0a13d4ef8977b4c51f53107dcea6", - "4bc221ed19888ae25a05f35e0afa4ebf7a4cb93a420ac8be5b3ac8065d4541c3", - "33336fe0896f66465e1d74acfbb4312d938466bee676c48a9474abbd0d039c31", - "ce35c95f2503a8c19ccbcd43c5e7fde954bf444d780a8c67d1ca8fb11956032d", - "70d18adbc8816cae6473938fd49c191f5b6d1ece14b7d022c85c679d5a87c796", - "000d15e5721e116da32873e104d3fd8798888e58ccd533492d27fbff392e700a", - "b78c06f1034392d13047a02401c1d537fbd29f76a7734375f5bca81f9eb69235", - "3adf3e944f7411ec0ed30ddfe3cf15115d176bf3ceceb1040544c99cad9c9545", - "03aa9070def81e3493693cabb5375a5265184d0cacd99ee88730a23756a7df2b", - "bd7b754582c58f26963b8e4f2588ae3032b84254711985ef1bae5f9850c97563", - "fe7011db17df25364a15d8b4e4d65dc7a971203de314adbaea3a2f56de0f8489", - "752f189df214161f73a74f71e576ddfa0dfdfe82ab5b13223a6913b116f40bc7", - "2d73d2134e79576a97f2384c0cc2061edbe5e2fb5fd452e3443fbaaeec1425ac", - "53af2eedf5aa6269605c184b5b8146078652fc61e677911d56923b471b1d49a0", - "677af9b828844e1d36784ae4cca1dc5b6a421acc50c3b5a85aea4e3e593e10a4", - "9c4a4ce244c00b90747ae7460e8af8ad9640f4e67493af59b72d76b9d0f4b50f", - "510de264f5ca1835f80c84549bfb8f5dfbc246d45e26929b918a7efe302a838d", - "3ed603a0523c92b8d8c7b4c08722a310bfd708a4e46ecf4bdf62249f53a25d0d", - "4fbbfab062fd75c14377be4354ccc245fa5e11ddddb28c5ce706c01c34c96522", - "69b90114330dd236f4e0f38c9d3fe8c10fb4abd36225af307eb38419b262e23b", - "bf6d1fdc54c4d96e92f396227f51ecc5b597db2d774e1d96ee3f2fe79d251246", - "6f99d974b7f9bb40999f793064b4888c495fb030f603823122569e520f1a8aa9", - "48bcaf8577ca5b4706144d9f2e8b7488b63d839d99080d34314669bd87fe947c", - "8aeb7e4f16d0d9f556bfde7089c87caed0c3a5f04edc9d4c4e58cb8721c01295", - "f8299f1f98a405580e3c5ef74d3376428b6666426615cf9422a23e24d7311266", - "521885acf4bf0b967527a54a50c920dcd4f1ac9c4c66afd3407a73d81daebf7e", - "82b88a2f46bfcdd021414dbe5d4be8ada06d5c5a1cca678494f9fb84e2de3670", - "520ecbbe02fb370053261dbb0ab6e28b9e821ba7fbdb3896f61ff93a8cbc4dcd", - "8a7b2c7e44cfbdc3e40c2acddb14ebbb37064709d222474d36fbbdb62fbaeaac", - "0e7faa11d082461034ef023bb88e302fe54cb131ed885ddf1b60b094d7c91123", - "e08bbab6dd5d27eefad92551e70699b7ad112c61ea3167a77b6feee1c160dce5", - "3ce092dbed563bb7bf983855d10d242550bb32578891fe60421ce0c8b8ca99ef", - "cb6151f15acc3874ab6c04c7c21f30fe88baae55875fe2aba0be2b32889e3dee", - "b5004ede1ae4fe4a33a6d2f7144bbf144ed916f18b14693dcb447d43d9cdf3db", - "ed6bec45c879be93702a7f7f5989d84796668b7bc8559f89cea21da7e1816ecf", - "30519f1586aa15e33a5dd61226d5cbc1326893ba822c3211966f2db188f928dd", - "148c47dbe5cf927b1cd33459ac4a9dd7c4cfc95c3df5f1a42ed1ac14bcb0c806", - "5bec3abe14b73369c855bba1b70824cc7e11944dae589f5570ce6a45871d5e7c", - "e5eb54ea6525ac07c54d81de7f44b5b37237660272a77341375ef550c30d4fcb", - "04b46f032ddb217bdce230cb184666afaf5f16e8887b48df162fa3e5a365b377", - "2024731ff8b824188c3bdc2015215dd128ec3c27cf2bee0e1ad4fff77107d5fa", - "5cf0920b2eb3313dc3a6c1c1e8240a7feed163c1b081761e8be4a5491a33a6fd", - "1ce0380991ab7d95f0fc0042a39fcf80c88c77c0c4a216d494468c7eaba82815", - "9e89f56a56b21d1b2f0a31f7e8ee0b5650c453caea3637994191600a097f19d9", - "a92ea03d7477135395b0466a7ecb44ed7f03098aee9203a085047ee8e2b145ae", - "01fec187fd28c94626afbe10266a443ec43a2e2e4a799f96edd530d9a5629906", - "5255a688a3599ad81a8ac8f30c8c5fcd0d30b51c10d196997b8389e2c2ce6978", - "988eaa50de6528f8c6d1223ecf380ece3c1ed57585dc4845f6ccdc55962be3fb", - "a7727d83af731cd9bd739dda02bf6302c0a3a56f2f366d877999d6af05993c2b", - "ea2910ef7071c584cab81c36d1cff43064d896c197755d74ef49a6ca97ea9aaf", - "4eb85fb87fb2d6eb6cbe87163cf014c67a20cc073f0fefd8cf06edef3c11235e", - "352a53eee38775c48cc08a41ccad4fcc9908b8fe69b4d27ae9eed9fda86a9594", - "fff95d2914ac161e1cbe5a108f63fe80d8bfef6b587a301da516fd932bc3ba01", - "72257f9b8ceb35c07f0ff15a2a3396cbfadcc104a41a37e3bda94ef3871bc88f", - "8d15ab2df9e82615de2ee1621d130db57cacdc23c39d7792d785b0b0f9047cce", - "447e81c674fea517c97374e9879ade43fc503572692805d1f21c6f3a61a49cf1", - "ca2cf0cb7c1105757ec48ab9c760a6f34e3fa9a9615fe2258bf4fc64e3cf6bb9", - "762a95a94f8bcb3b662b32366069567a49bd5a9f2212885d4c6fadc78e9e1e79", - "26210645a9f3bdafa75b445494e251807e5c37378eac22e733967f547218dafa", - "37a4b81024bd76f700ccf0100d3c107c4af1e4e4a1fe5fd31925aa9f46ce648d", - "3e7ec940ba9cf7c49a78cffc1fa1352da15eebd5c3a773c5d254f74115ca0d54", - "9ed35d7254bdcde35dcb97bf7d1db8908f6504fe4b9271af806a916b2cf1426e", - "535d8839a6ee55d8d54a5d918c032355b50a2541b038ec8f4bc89aa8e7c01740", - "223c1de762d6ccab9929930d00ad916c3db34bb6ee33c61a0967ad11dbf8093c", - "82163f45dfc7cb8ec9526eff1f74fe354a3eaaf3677a6a9bba59281cea1a1833", - "515554a62486e209d3c42b00f3c61cef060b90560cb9d8d458e255719b6fbda2", - "32e1b186a4f733b71f3f3bfebd97ec70cb24c4cf815d31dae2322aa4aff60367", - "ff3bb69889ed8da484a6901d6476b77acb6585346df04753752b45d73cd2f20e", - "659755237c40caaaa8c7a2782e0432e86fe1c7564579cd92e85d65a64364e29e", - "d8b9b43df22e1914fa9c104d0ad8ae741fdc8725e1ec29dc8d6a87dedf6a5d4f", - "37525402d15cf966e25b8313efd2b863736e183e767ff0b790474849c9e7eb25", - "3d7f3f896dc4f8ad232d3069c09405cc77a54379e1c2fbe9b7c6786f060e828f", - "72dfaa52f0c8a6a025079374a1f32e229402de1cf0df6bbcd01e777404044299", - "157dd60dacd5d298f04c7d052fbaa952c12a1d7425c91f3404021d8f0733711f", - "1f68626ad78ffbdd810e9a7fabbbf2e0a0aea466da81d9a1d043dfe525a08b3e", - "77011e35f682e3de248f5388a4fb6343ed22de42b47582d9b7f001cda52e42c4", - "64ba08650f2b001f2aa16f26b7c4dbea0cba860da3a0175cd6b9f4a5a91c1569", - "871d8f371e6439c7fba8ba3c16327aeb35806bf888eecef6450189a0f854ca9f", - "e20d3eb66e97cc04923f5aafe7e1314e2c93e165eecb67e545762e1c69da380f", - "e901204a0e81bd7c0fd2b456d95b2f66df11259ed1884860ba61dfb441472737", - "d051cd94c01556a0720beab47e2c494986878c60d693c46a7cd86207ba5ac612", - "859c2bc499b1f191f18283adb85a57e769e9795bb469d08484a34de9ce0144eb", - "15e77f7061055086a97abfece3b7cfd8c882e156462da01a284e4b6e7984b9c7", - "1110137cfb23efcab984e54d46dfe57e58434b2dbcaf5cd4270524ede8dff970", - "d4eeeabfa4f4fd9664f6bbea05db7b60b83990596bc5f42a690c7ddf147d1fb2", - "650379cb4847bf8184b92dbf19d9a7b5b97f145009a0a7d94b3b52b722bf7788", - "143b23e0f2e1207c85d0d27e2a7ccb4b59eb10aa7158983415d52c2923919f86", - "058c0bf27cfdff0f60cf3c2f87a142dab1b192a52bd5c97c4ea09e76042f3ab7", - "c3d1c20a27c6809b907b0052e673106bd5ff7c7a790a1cf69621a94670f4120b", - "c6d1da52711542b333a0fdbe101f468315f2251d4b69b008696f5a50b3bf87b7", - "36e1c3f6cb513ae4a0dd9756eab2871c768c323399613a6eeaa8eef6bcc7eaf7", - "47adb9fcddaa6d5e0a627d54fff4bf4216aae461cb85bbbabba14611c5c211ce", - "90b9dd277c815c982dfe15e982b629a96b39f672e2a988c661a4416092a5c660", - "63b39f1149fafdac9b78ae3fe1acabc0d54360340fb0fee2b3c38b301f62d073", - "1d0cf70e077a67fd6dd72f62da96c206dc4e6499a1074d89d85c4258e0143b2c", - "b2436a0a8ff0767b0fc598d3a843533eff7b41d6d9cfe0dec7d43fb9d11ba17a", - "3bfff8d26b440cc02f35e349b9037587d2d7950587ce5dd0be1006f0eebe42e8", - "b3034de0bbfa8fd4d0f62462d9f44f71980741d622f7a96373a37bdf3eb3c149", - "070d111694ac78659bf69f819ea1d687edd0768ac9aef83fc1d3fc109349e2b2", - "d6d144f95d40be48d4b79134c2972f7a94b9faff124faf14b8493061e76e2c53", - "01af2601c65e4741962e81da6b9cb897d63b18832d294d85d8a4b5a23b8bddbc", - "3341b5549f9adf51a47bafb622eec52c3036c7945773c82b6134d0baf5b5e7ee", - "344816d37dd8fe268fd64aa469746d857e2662f029f5b56e697d729659d1936f", - "7e47af33af140c8c56a79e005cbb6680fe7932d808802c29e01bd1a656696fe5", - "423ec0a77832b9df1fad8ab06bfb8b2d07a17fe8b2a6df3e026204f24738cb56", - "9847b25e6e5ac0df30c2610e581eee6bfce091c9766acb56db34ac0a7ff1270a", - "872b1a0aad4890122bcea123a65772c8ac24b1b048e6e2a6b1505db83bc35859", - "46752a8475b50bbcbd6b979f90b16e971545f36b8dc9fec27cf6061a8391d7b7", - "89c66fb295b26eeb1ca60d238227933e7dc0ea194f5b4d8c8925e68d107ec968", - "2c42c5890820e85c25de123a772c41e381ffff01ce1c8f835d61e8b4447f5a83", - "6c902b123afbd004697f9492df3687a1c321bde1767e31b6bab30740c06f9994", - "cfca085f9ab51c0a33fb187fbf1dc1041eb12acfc9f1cbffa37d155b84cdb992", - "dd1a410d1899b29cdfa5c3812535920fb88d4007a459f43652fc2c6fe3a4b3a9", - "595eaa49b361116cdcb7597c6fc672fe84ff12ebaec3530a93a7183f8a6daef5", - "7aba8ab8b0d74114cb54458c4df2ee41aaec693a9f688e23eefbc2b5c647a608", - "ae784888543b8fa4139ac0b1f6180b753fa1576c979224b282c7a745467f8793", - "767abe650a63aa74046c6d0da64cac320190144b129a326682770bb6a41c6319", - "105dc967c158305b010d4382488e5c4d092f56259a93416e16b0069492372651", - "a85089c4f4d8f44e6c68c388e07922b3dda8c4e2ae0aee08dd4411a874818368", - "efa142fc4a8a684bdec373cae64acc6075d16599aea3651baf9b8eb40df1c2e0", - "41f71d38d3c9b22a4e7baf20ab28463d550a1bf732ea83db3c71d37fbdcf294b", - "7b36fd9e8d17e58797e5a99e1d41474c39bee7bca1c8aae1c8c1bed29d71c2fb", - "672dee5e944a395b6151e114ac4dc410951daa52a3a5cbc5ba4d7f9fc7722daf", - "3b318ebaf169365492e0d2678979148ac792424b522b5fe5a576fc136cad0f91", - "6a1e09956d996838a957444806ae97feeb4f9732931553d164f5883217000d40", - "0bbb75590d7a5f9a3d4f01fb8ffb664118bab828806863daf46a4169f1a77541", - "826b62cfe857f6bd92c2650b230ab2eac1d69293629cb4d84c765233225bd764", - "2abf6d8b3095397a05b61216f34faa455d281e52e23686b3e6e708a52ce9b5a3", - "d18a30f4c728cc07be30a9b342fe1bff6086bfd77bf50e5edcd9145be95532a4", - "a05ce244890838965487b42e20d486a993ce528062e86d81c1a850ee8d65fe56", - "9d7bf85bdf4f8165037315dc8c8af873fd5fdce02788c7b0751da9a36c9e2247", - "edda61dee053c7644378f75bc4a3aba6c4b7dd0f58d99758b66940482958b4ac", - "280aa45bd8f72133b9a57c674b4882d65f69ff60ea7ed633732605c37aac3288", - "c8f5325e61ae3ee5456e0e633002079b3c048b0240c2347a9ef08e8c9245f148", - "87bb675e8f3099e8a16a8892f9e36f19df903006c5eabecfe90c364422789d1f", - "9254271dbf58a089e4671dd629ebfa84b864be693f43c17a047c76c41edd7c30", - "170975a43080f3edcd9626dbbb29d5f4469753a5da36456a2dd03e3a6f5e61d1", - "d831cd8f2d5ed147baeefd9f7c59000338a6630acb80c398ca8ed3460b1f205a", - "232e08d16440689c87dcd789f724aeac6b4c91d3b75719be98e9f9bab9e5529f", - "07a83961bbbfb9249fb4004b7d49b856effe80acdc2cf767dbd45e580bb569ca", - "bad99418e9b8fcb2d49545d65c90d27a77466786c86a689acef6d09c072e5338", - "9a95ff7849feeb889b46e8c190a062f7d9ab2fbef4602f17a4d7b8432b4f3674", - "a3cbe8c744ee194b08dee68973656403c27ab121338d49fdb6436e7ea20261bf", - "04b08ec8263a0224b95c4d87fbaabc967ce4373205de4a307b55cc9ce7814ca5", - "340baaa1cd8216af4009031bd2a4a94928f8dbcb186fb26c2719fd68bc63d0f2", - "903ace414a1b271e443f237d448f8d44156fee5e2ae8df8d38e9f6a379dafc85", - "0c6ed186b59ee2f831ed48713e90d80b23ffa45ba77932f5f2f9ec0682423844", - "f5a0940e6f0c1f94827575a0631afedb330b6a1b16c75e6ba5aabcd409fe6ed2", - "e9626fe5222a52ec90af10691993ce5ac6eb7b4693bb53a6c31cc1ea75af3ffc", - "dd4ae7d60ff689ca7c0743a26e67afd9f979eb1d550a9f378145b1daf13897c7", - "09bfa2d1af2f93f848a90f2c34269e732c60456543786349a81650a0ba4a74fa", - "3288ba6ffb9b11ed54d644cf2c7b722ff54f953bb64c840e7e24ad8b2810aec3", - "3e79e4ee3e3c9147ef3d9d0843de21e0cfc2a75c8336d67f2eba769932809ade", - "bd723613135cdfa93bd539c3a74ebc5d15050a5e13d361ba29346e7b05b132b4", - "ffe9262cb6a40a906d6d6d310ab5904b2f31f7787f7143b344c1d7fed020182f", - "270300590a55c0d67fe43230f51b44f4f5e6abcd61f244cb36ca97374999a65a", - "5bcf462ebb844617a4bff8884b74979e55c5173664c454b0120ae809c61cddeb", - "f33ccd0d839657aa4cb9768200b8c13012419cee07285130142f0b4e7f1d1bb4", - "dd47c81ae952a4abfa2b348e43230adbdd912344249b53b00fb124dd323c2fbc", - "d6b2d4e1bf1876940791908981050d38c4a1080c010a0dc55460d7aaa7dcbe0b", - "9a22c65ae1e4018b61b66656bf14a7035f54f1c32fcbf77573be1e8275c7c84e", - "8740df0374e8df2a070543b7fa79915643385475b578cdb02e8a41df8cc0a18c", - "a2bb3198b7c788504d3c0302055bd6f791e10253c77162e84004a452dfb133cf", - "b3dbfe1b0addf627bd7ffdb7f9f61ddf8ad68feb20d03b606a1522872ae0b61b", - "163cd14d511f040b44bc4e5cd619c1a636b091e9e647c84cd560ad00ec929157", - "73a0bded2949a5f1fa0a078bd035670d1bcad8a20b0a2274782d9d62fe527441", - "cd8c5313aaeb8826066895d0ff7108e8ab530f73066615f48dcee186a4685fb6", - "b4da31757f966ac7cf0f61db7d557130406d36007a07fbc97017a0dd610db0dc", - "857a02052a1c6f698a27d640b48e11af717d2f6dc1af82afa76db19ac6cddab0", - "0683c17635c3d5ee0a396405c702d8a76291988ef7409aa2cbe9d9a5d0032bb4", - "f451c02f736910d6ddc906aebf42624a10e448f2a3a551c6999531005309c3ba", - "04b559f02b0bc34611c5952231ee266cd5796674aad008bf4b4ac4d38f6b49ca", - "434a7a9ef4dd94e0f4d5dbfd49e740124f7282e08d884505c33d9b6fd36286b7", - "b05333bd2b98b612ff492010a3eefc76b2cb1630d912f37145445570b18021e7", - "0c271b04592437515f9dff2828e2878190b8d3df3a08cd0d696dc25437d79ad0", - "dc0490e937a6005acb9be479339ad3a3b2ec028ace88739c45e463b2fe1482ba", - "6a0b890ac1bfbfa318987b2f0f46a5719c0971b194f7ebb89442b2f2e30e023a", - "eeb7d37a24cb53f3b7fe484f7a06d6953d0b09b011b9e38814f8bb91e277888a", - "242fdbf55d12c75017fa6bf487751c9823ef64fdb4db63f85dfab3834ed0f2a4", - "88e7d3a8061e3b3211a00c017a6532c08479a5324c304d9d90a4701aae37489b", - "578ff69636afca1888e04d595c74352380893ebf3b514c7230d3ecd619b87785", - "71195a5e9202f8abea03f63b31b478ea81ed333b8521b2e0b72dd6455ef81b81", - "ff0b487427c3f8073760801b459ece52743a3ed52f1e5bd0529a5ddc26292ac2", - "19b70e2e677f54e916b82b994b354f948715d478461fd9e1978a5b68b197eef8", - "b45f6b54dee6bb3c3004974e9ef318872e0b5d2717ffd7d4becaf788b6a511d3", - "943587a231ce110e7badbc4f239534250494bdd5c7ff4fe440b9f6383a082f2e", - "c97fda3af44bdbd9f8f9b82e7df1c74eca8842d77c8279c41d9a172ddcd30be8", - "2b1f01757cbff2899878120b7df647b8e6113c1e3853e6c57bf5aecba2fd04a2", - "884af13701aa48634160304aabca2ebe93ff8fd96312490d718d3477e82e9a04", - "acbeb89ed0496ec95d709ffcd3120b782fef6edc8edb05dfdd2c8044235658a6", - "fb02fab9f96f00a713f0e4a641cd028c3f5500d33ab0ad93b45c874a56268cea", - "afef26be55810e2805112f5ce4c367d68639773712efcaa92b2a862ea0eb0988", - "72519543be2e2e180c2d336dea9f211a79af8b72fc73bc17b86e5c3c4189b862", - "876254b044402d932c3bb342338cad23168bf2bf8eedefbace9ea4ffe5665a4e", - "cb7753b902a5a118b738edf60cba9282d4f44b1806b674a2d5388281c7d901fd", - "c18c8c03bda4c3cc1602d166caac25f1df7d2c8a338673351d11c57ca2df2906", - "24d7d0000dd190270a894f45aa2b1152908426c9a227e470aa2f573d7ef03c97", - "769a2a0b1d123820e0b61db3ba05c879e6462ca3416556b1e993c22ed0069448", - "9757c048c016118f1554cb259ded843ae22545e935614740cb5106c139f91a97", - "80249184963da17e735b8af3fe0b6f268415f0a9dcf4b528829b67c784c1b9f9", - "c0a7f390a6da17130f2778458d6fe467bc6092dd7e4fa35704105c418c952a8e", - "c0b5f030fcf59915acc9ba7b684e41ca315f32cf1a00864010f14c0fad541eaf", - "7e9337257f1bc72ef0dc987af1e26b88fb68b55aa4fc17434411c5081474e7d3", - "9b2d24481da3216af751adde18b84246e4760e59aa370c07bf530f3152b5c9e1", - "e68fd7d554b444fa93c09628caf64b2cacfb18d13cdd0cb1648406250fdf5b2d", - "d6bda8ba12ec06a0956fe5fee15ef71513e3e5c4590e8ac50ec5ba64a73024e1", - "947a6227e2986f56e6e5f5756fe7e9a8eade34c45da45c92acb7755507381696", - "937e4de8d3484b9bccd2d5aca03790c2a7049b3e23f318ffb5bc2a64562bca74", - "fafc22937cb75c5774a114c5ef972b8c8ee28acf2bc3468e6c09dcaa542df85b", - "d8c84d1c669d95dcad3781ec9097f9e7b57ac87f397717dafa2c83468784ea75", - "cf99649e03b4450d68121e40456a87a3eb4ea18c960d6299c19f91edc72efd5f", - "d40756de67d0673b5cfa2c4b2a1a9878ac8ff7c9ee4152941f2c329153c4a9a8", - "abe0dc4c3b1fe0808a2951ac26c9c90fea25eb21ed6f384d7fa68d7cd92d4e58", - "39d15bb7d2bf996fcd392d29cdd6f6e87d3fe618c56e0cec0f13f1527d54de57", - "ba90ab3a80ace63bc7cf5bdbe0d911b8639d6e7bad9edc7e335dd57495621580", - "7db0562622b6b152b17b136c91e2acb1e963f307133c88c41595772e4bcc9738", - "a8766276e1ca07449bd1f1a64a3bd49e2e95812121eba6dc74cdbe534b841b3e", - "8c45459f78fd34773b90c3f08ecfa7cde87b41244417b26873087b49ae57b091", - "e0bbf6516daa7198ae3e0a54a82ca96bce65a58f6720a582d2d887e4662808e4", - "e495c60652cd52c8a189ec6cc78b63a9457ceeee28dcf7654f3cd1c705b7b6b0", - "7fe6d3f036cf28b6bb09db50bdbf7860ccc77f1bf1ae1f2b6e71f392cd2d0bf3", - "b5fbc87f8be5d4a945c629f5e094cdf08210c234bbd4e5e1501d2cc1f31b3d8a", - "55a737173ba7f0bba7f1341b6e6a1d9f53877f4904b756d6286e93e08c4f7508", - "c6414ce36c991acfbb0f558913486d4cf6f3f782b08bfd1d70faf9fc4bcb59ae", - "537afcae43bf0864da1a452193c001891092503b59ee16f421ae63e642beeb74", - "1ee840b3d724372ae310961c2e2ab714106407e3746f5cb55bcca99b32d84de5", - "4819bbf912ff429c6bcbb8d5e7b1050fe0e89e6b8b62d3512b29e70dd6f84c5c", - "57f9ffac84fc3d9458087f34235093d7eec44b29fd807e01df6b01a67f0b541c", - "677931dcc39c57330a73eae0fb4af64104b9de43c3db7a12fad28df19e7124cb", - "a7a7eb6b5615f1f67fdc6c944c1b66ebb9aa26cd13610656bf07e1ce9b263e9d", - "35f1084c928e15fb64e15a4ac7e3ab0bb7b689c7fee60f774cb8e07af4812264", - "13f84eb0bd8b4cd4d2e14d0ad256fea892380ffae56c4d2fd36c93e0824caba5", - "d7188f901dbc037a39ab3798d0814fd2cb4b0da34470a278ce5fc9d6eed8f5b3", - "9e7187e76f3e0898291f31895753bee85f7062a5e7fc544f27c8fc984f1a6895", - "af4572399166421770c55b1c6e9084f361267064560440f69f3ba5cf613c9b04", - "b5ec6cfe4feab4f273b0fd045b50b874b79f50f53beed703dfe7e80dded2b5e0", - "7618a827cf124bdf65abac13144ff0178d1d62abd8f660479b55cd8353ea45f7", - "a3eb7ce904b6e4604efd69a8c2be48fcae0c6198cc1afd4c54dff6836135f366", - "2ac3638e8bfff6aa02cb0950a9daaaf0f36ed61f07b59523cc70d3ec02c9e562", - "1c1bc392108d384d2379ae61d736bf99129445de4e170d925a3bd30e4d278539", - "45e0d834b94c41b86d54f18435aa14537cb65ef7f77b7726ab3ee5c6fe918e10", - "e4b598dda7f826168c4d37db3f084bbc65e160649270c5567c9e1d627ee4df0a", - "2d762e3d33821ae4a5b2015c2416c53448ed25196c985aa31344021977067ba2", - "69b0141f0f52c1e82bd7a9d744b933da4513b062721814c52676881fa467aeff", - "50a912ec24f2d5e16decd93447da94ee294935438e201c592d26f7c01c23a1f9", - "5ce5c356d74111fdce36d68564d6fead11521d59ebb3d47b0dd97290e5a9d397", - "e4b3d30d7f914aab0539277bdfdc30eb23c43d1b56a392813a2cc956a6bae1d2", - "8acde6d25080f7078c25bd211d81383f688c71b4ed92bdf11faa6fd53075a438", - "cd43267298ea32ea1b60d198edbfda356d543f4a0f48b5a99d2b90fb0e479062", - "334588599d61485836eb8478ffaf74ae49bdeecac14e861961bccac826cf19a0", - "1c9f17c8486dc491972e7a60c324e7d4e49dd4cfeb2d0c4fafb98fd8d0727653", - "d0ad763f1b249dbc09ab2d16261834898a74164ec9b7607c203e5d24fc9641ec", - "b0d379106f5d84482d5ff5888966b9927619305ab3ec623031af16d31d92bb17", - "eaf11794e79a681fc20ab675bb1ea5629f65167f1423266abf749f6226aff4cc", - "33212d47163e987620e2179f5497c7b680919be85bf454b7c70824a2ebc7092c", - "eb382e76db0d9749b6403ffbfa5ed06c22b456e19b78a4f4de1a92cd7de89686", - "95aae9b3c9123f2c845c66a542f92fc11844c6f16b7cbdda12baff720a8d9a33", - "18b56bd1fe299fff937aea700ace53d680916e7ea91fcb4eb3d189506ce15885", - "83ada7e386c166c0f1392b4d960d115f166d0f27b468a8fa17478253975e8ef4", - "de6812c8cbf6fedf5047d6ff5a6e601ecbcb51653c399df45d6f1f972473193f", - "1a59e00a8eba6b79fc4287d9070996997621f22f8eda22610eb0e41f07c58cea", - "22d617c750e2c102389aee394ea0b4135e24f209b08198d44d095df05efe9e37", - "f2e2cd454ad96c9cb5777ab8d742fb8af46ee6230dbc609ae2567e0308140b9f", - "db43b72cbebfced14f04e0d0139ff579d4a6d9f72eb9700576fd221f35d654f2", - "9c3a4091b8eaf035131803af0c41479fda4c876ed471ff46100e4a25c143b5f9", - "7c97070bdb1f3245eb4ff2cd09ea34b43b7e63c25aec66fb490dc45e302db362", - "670bdac92a8cf0e9252891a4a93e186b011ac3bdd9d8c5c59c7d9ed2af61d8a3", - "2f5d10fc8478b7869fceaf6ee879b3b03b828f38686567bdb7dc202a95630e86", - "428d03090f2ca3002315cbe914aa8bcafea481c5b0a55553a8d43880be2ca8b6", - "e0d9aff2834bd32ece4dc1e8229a1c0b9ca6a9e622788080889f4873978ab891", - "0de0233aec23704624c9dea017597c1e0bc435bbbde29abc8fd308884f773889", - "eea21a23518a702a95354cb2818da27ecded9253152aac8f47b4498c2a2f88a3", - "f21b301ea569c4dcb7b6b453a6e94bee314be0b18a8816a2d0cb9a78c8651418", - "fd405f07c39890d874dee089d70942bdbe29b3cf5658872b576e8183bd31e820", - "deadacdcd4d9c009c796ea9e52af2ad5daebea641e3e139b4a133814ee27a441", - "b1ba011844605d6c5ade4dd3ee0ccb199fddcec737a313dd386ee8c597d36ba0", - "7c776c96132f7e4b64f6abc7c5b29177df01d278f0f2c276e2a4e10a3a28ff8e", - "efcc3b411fe5b478d9725de8a518cd96f9b112f42b5eda5ab7f0c2fe743858fc", - "dd26133f0017299ce5fa59ea72eecf6f22f5033b45a118d19871fd0899832a99", - "26ea6d3bde53181ae28d9a6f44b1a0b94583e7f220e440eb93517265c8a1cf38", - "c458624837ea4d597e49719129c78edae26eb9d7a8b771ad8a9a49b203b437df", - "0b85aaeb8afaf2d7e2d75a627f9f3f342d61606eefcd99cce52b01740d5ffd0c", - "7189ea229153e1a89430b99d30d7e6da3dab145a646e0d2117fe6206438f4753", - "b9afb3189242b5ea1052ba0bad1c607b7a2b9236372c9a7b4070a63c238d8d9a", - "91ff1945bbbb49f04faa2b7bfb82f5a8ea2f1b85315e0d5933b35130221a2b51", - "0e830730aadbe38819e831e133b300a3a2cef23c474e9ab3cec7e452d714c04d", - "4039008440c3a2f6dd5e7335c60ba992b709b4852463122303a9397ee59565b5", - "c8aa708b2c6c8d38b2c186b5550095d0a65859617b5ee93c9f1c85d4802b2f90", - "13bf8e7905fcff48d590f75883c4eb227a2b981e2c0dc5c01b539d102ac340ed", - "8e42dd88674ef5ec7a148b022eba5559718f962ba48d833c47c0b1ee731b5485", - "da451fcf7d16eaf6853f5a2f95b8a369c5a8aabd815654ffd13e04257e7cc178", - "714800655144129e533ba22d2e7c629a65482ea7674b840b0d5810d404a43c13", - "d551c17600a6d463819342dd23eec542b81982fd6287700675ab74aa8d783a3f", - "27f960154ce681e2bd0214080f81b4e472c3fa9ef120ca83c5070d0fadf70101", - "2cf92c826984060f0cb32fae35fe6723c5aa43bdc0b1e798259483640a342393", - "df3382142b7dd8c7b0b63dec6417a82b1feea391f850c149dee464ad4b340eb9", - "235df1c35faab8d950a01213e4524ef7b5b3df7aff3998c40e892c88768c2c4f", - "9c5ba9d7965ad58943a12a76fa3c632c0cac0bbd62390f30f9c1541fec767e33", - "05dcb5c296eb07175108642044ffc7c63e61a66998461e501f95f0c0f495c909", - "8e54bcda41cac1e6e8a130928a2eac77d3fb46b5ebde6e9772825af7da3ae313", - "fe93b4f301d065d45c04c4e2e43498e08906a49f1a2a41f7041af98dea1ccc69", - "39c8666b79277ec692a6c0282fa26d23bc7656d6d621d837aa761eee2619a2b9", - "8733802634265f93d0879fabbabb2d13489e0b9fa5d2ec7a831ff724f13df202", - "d6a792e64bea11257aece63e8dd38fe11119e1f2f21c2a81e6eb995a7bfa604a", - "acf53f9d177bec0af3111719d8ae0aa61c569f4749f9b0f292f8ecb4c785fdd2", - "c38444c593c3d952a38a0d8e77413d01840be5faee33f67cfafaab0786c07bfc", - "defa96b0e2a26f209ea548663c7a9198848df2a4f131262167dd7a47c757e5ee", - "fee7ec18b4a5487556d7911f256fa3f67dac42c3787cdce04024c681c8cf0476", - "56a5cb7a29db21a4063357386dd68ecfe6ce6fc29302e0f8402df5efdd263b17", - "9276a037b8a468803a39d6aea69bf09734a686ae972aac0d5d3f1228091ff88e", - "3d2360a99406dec0bb01db0c0feba7506e0999e0366a1c022523c0b3cc2bd3b8", - "fc736fefd160dbbf999193db933db23e740811475f944a12a350788535ad705a", - "45430fe0647ad7fc4b9b9ccb93c5be0e3552fa4d2de210137d45bc00334297d5", - "04045da2622f3f077d739acdd469d7c10bf4be61480be4226bd5e7968de0a5c2", - "9b67dcb6669dd2c45c601b6c760f1d014af945be370fc1262f185258b6708e34", - "4f87b3f6ab78e8ad556ef2f1eaf54fc04e5bc5d991a873851ded263de474f28b", - "fc3a7a05b9ccd56da074f08b865ca057a01797b64ed93400026754861ddc4bd9", - "ebf03ce2cdc6de8510e42e26f12f2a39ee690e11d371ef15a8d22fe19131cdbc", - "b931ba4e5b7e79caea15598540e397346948df01ca2e9cd06c53e28087bcd2c2", - "a9a8ca13e91dfa5da7e8a07a1ddf06f62661a7493b4ddc30105a3f6c980f9a39", - "7e2e00ad6b2ceca337fba719792c01e71e27c78edcd76dfd4d0e3e1a6d65facc", - "861d58f8d869d63c59db14f2562f0d7d8c246012c1ecc1bb794d0348febd07d0", - "f311099c2d672e585fc610fbdf6222d0884da7e256fffe314c5945b078a03799", - "ae8698cc682d01668380e3295e51abce991be388c0b147ff3dfdc4f7f0e78645", - "0463a073c8f07565a827ab65ea8dfb1f8c6f6397a723584003efd47674f66c19", - "e879a006e6665731d7777e10405e7daa92bc024c74a81a1652b4f139f3d99532", - "a642d9a1cabd265b70f2f7f8ae181be3618b02ede06d6d533f641386c6a23e80", - "a37171a31467800e29942a9b3f331f84d3c056fe019f79ed817e3347ec016985", - "f96d43a0d86bcf70ff6375b9ac0e55c05a9f4134afa3d4c178fffb122a70d2c3", - "068be3294133d4a877f3e3ad9ecd3388139ad952ecc835c62374da496b6b0a4f", - "4c41151b3cbeb94374d2c1a82c775b847d14ccc8c9b9d284ad75bf7cf09cd0f1", - "1da827100ac32a23f2250bdd3b440e2fc56bceb7f32665bd28c3ff58b3084d19", - "2f37bb6ae8c61a1e86650b4113d924cf6bda2f73586a7875aa41c5733caf5ccb", - "d4a402a28859d5ff677f7401874c675fb6ac48fd21f1302a36df474b312f1e16", - "f3309dc5adf8923d5023ae51824e8d30aec298c103e523371b8f87ac274139f0", - "a401014bef665318ce29c41b3ea51b32cde925cfeddeb7c330efee799c348a37", - "76e9c6f79e0cce98fe43fa5d127ce3edd624955023527a0b8b42f25d727ada1b", - "77a9dee025a8cd61cb235e55e660cf3bfbbb45322846b6fa7f62c2bf0c0aaf36", - "6cd459e98f5c6490efae2abb051f68e4a445f62ff957adf6cb4f135d4108d19b", - "8666d83025254b55417ac0d14aaabd7188f8ade7b2361dc567003f67bfefaf5b", - "212c268d3b1fc912df60eaa411d235cddd932af6306739aa6bb197aadd9ffbd3", - "7af71500df39e6a7f89c31c76c126a9ce803e0c29e3c8ff85fdffa087a366ba7", - "ea44418c2a8283508b480f820f57ee51d5dac6f08917b407cd437374238c9645", - "5e97f60b15856de67578495d911e82cadf3dae7a664c33863c9f3f0f82bea986", - "cfb9e813b555af728a073f78d24ee982b306005cf8e38319e4f71fd336e644a9", - "5cdd8e30ffd6a0ef7c9a854ea1902ebbd58852f072e20bafa882174470e559c3", - "d4dd06255b0536812a15249009ee6e0b602c9aa14a27e0a5c60096fd217c3115", - "a67a7b504898eac6eead9441f81ca2e4069f58503c8eae1bab14f71020c9de0a", - "fcbf77b7f9f83953e7cb89e52f21161fb72d0659770dddea94149c62e183fefb", - "be3697da5538c4f723368d5cff9433bdc9c30f78de41afa5290b633ac01d9f9f", - "060e50343160774c5ef489dbd3227e25b8fa57827d37d34730afd1a267f68ece", - "1b5a3fd4db1b2db02b3f9d1b5e86ea2a8c33cd42375ae1639bda603ac93defd4", - "18cf657489dc9a2314bb1e59f9ca54d9872ccaba882780a865d2fc65000ecdc0", - "bb7fdc8eb96cd512f9c38a25d68189736c559b077922db13880159a3000b1a79", - "0045d652cc976a73f4342033feb22cca1ae75e18c0e616011172492011cc60d1", - "accc0e4e06b63008a882592822a64c8422fec823fb5d8789981ce91cfb57c7b3", - "4c13e6441cfd4656bc4995815044335890814a4f9ea790c131087e8ffc1c4023", - "48565d12aedc3214ec16613884aa5cdb429c23a5c4215f5067752c85696ab8c4", - "25ca7a5fb3312a8ca10724f4cf18b7bb76b3ac19743e6263f47fce6e3d9831db", - "5f5853e2389a0a2c19a230bd22e504a6b4940a8326c2802170d90c6b77a2b925", - "6a401f2d340a7afde6337508185f712389d1db2b27374b46c06847c1f9511415", - "170768de4526b748528acaa1f5c2261a4ef4daef2d6ba1a7f9b5ac5f2aceddfd", - "68c869a586003bcead12d9805e41bec5968c7a38f770ab2bea0aa31341eb475c", - "13dbe6114e3b186827555cc5e8a77903d064fc33e7e091d68ec7d9c382fb7944", - "ca79c13096749ed886d8ccedb6c38dbe8ad8526bbd2dc0cc22e11c3f3c6dce32", - "4ae686b59f47f20f7c71d187f263aabfb13ba467b3f28bd267cdb8b133994457", - "c5bf530b525b81a3ca5c9a870d05aeeebe8f329c6de82e16b9e004810ef3b7cd", - "8a83727c9aa6dec47f23fac6b27f50ccb9bf9a8513d79cb309c9b718720c011c", - "f99f1e285c160349decbe09e3b5b2efa2395145f05a9235b00deed9268b00ca1", - "d37cb067c11a89cdda904b8e91024fe3183d930623b3dfc02771e69c93810b3a", - "f89506553fa48b298a16f7c7e3bb7d2053646d810e36c16f0f25fbdc3d9cbf85", - "983a9e6232a68f4f96417c32c2bfb651b7132f0a28654716279e11986380a796", - "4a7ba0529e44fda41cc6b2632fb90091ce8d8d787889231bca7f8c3c60226dd2", - "75639519418ce15050a912e93d386a328eba94f809f49e59e0ebd40dabed3448", - "077334ecd7e4950b96f3325043b17301ba4308f29ed89172e503f78729edeaf6", - "7441a0b77202c564ef6b136396e853834997e4c6ab2424bda4110c63faee7fab", - "cbfa551959a1134183cb3bc653df8ab83891f6d1d5b4b440c4e522286c18fffe", - "9afe45a0d15a19b29ab74c0dea7088cdbe3dc2697fc49a6bdb9e4e21d245473a", - "76cca4b08ba2c554b41b1e2999d051d4d5e91cd3a253d4bf50af84ff0ff9a605", - "2b22a3cff81e0afba95d5a1b0c617b801462ab34e78121354c1d5ee81bb2f09f", - "fcf24d46b897dfca8df1778c8c690c4278dd009dddc74533b1d1f951102483be", - "c06b7aa16fa5ed9a63825c3a412b70ef458caae452185eb4489f985ccfee700c", - "de9a95e847895b839b65538dae1f9162073ff7b416dac137d4cb39c920f0f5d8", - "185601e07a2f800dc2adaa8114eb24c4e48bd5250ce4b863fd56d50a071fb5d5", - "8ee82d20f5870ce9fb44c6a4515c863d9e7fd111a0ca6fe5b52e27c640d2c4ae", - "9ba6753fd9fd9b8df7466159c2f8608f3ccc00bb692bfa187d3c0c151b1be339", - "a08e32d02fb73f341a19b0dc25d7bf1376da69c719a4c9ff5aeeb82cc32bec48", - "59065a532d7e8efee0da39a807006f073dacbfee692a3fdd76ef97e61ba08295", - "0e1b4a48936c5b2bb70a6d76171e8d709aa235599c1540ee3bd3a77810248563", - "206624f2fb4572adaa1824e43faa686e6c5a9e76bbbe7451c2411fe3132185db", - "d65cb31fae7cb4827646bd5a2e875c549b0bd9442b8b45ebddb56b2e29fabb50", - "68417e32868be6415168b9b8f54682ec41a6aedd1cd1bb5445666d6ebabdba8f", - "1d0d64b6ca822987f9dcf671738c4fc8902fd26ac09d7e1889681040157dd8ed", - "6a4e6b06b33d22458aecaf524799507f1d2e27a5394dc5f86b2a310be2aec472", - "5def62aa2236a9c6b5225690a9e6243014f444e8e1d24d9b2923d25a39d060c5", - "f9fb9a8c5a65c592616ae64249850bd6e2570d37268d777e1c09af0581cc09ce", - "d531b4705931736db32a56ee44bb9ed6091f137af1d958d9863885572e96940d", - "8d957fbf10e71b41a0ace206f7a6fefef49748382897b86a90a9abbbc5bc1945", - "d872d2190c69206cd1ff0294090f1611e3f4472cf0b2484e31c33cfc33942f4b", - "1944c6f867645f7900b4257fd568f1bc1bfb1e674701383a67043bc0c84501dd", - "f6d8a64cab9c72c7b675f1efa853149da6a209331c01860e9f75774f328b49e2", - "1e6ad9a4906876ba99357e03a7f8f47771e00164dc2866205f3144f4467a32da", - "851a491dd503872ef97d2e08d1e27ec8a2809117ff182e308a9252f4fd138db0", - "ec6d827a3134221d6993598d23b2c80929d498ab2be42ea4a34045342852412f", - "6ecc0432f2dca0b18130a1dcaee44f06539c1ad611fc90889562d9a12bf00617", - "75922c2f04c81ab30a4f1402983737e2496187587f341628bb70a02c66bc245c", - "b06732961b6c3a1ab17aec7d0942eb68f2047aab76987c73d830a57b82aa93f8", - "743aec0da8a0bd5afde6ddd8d5fb0922830a480f6aa7ddb1d9c8ad64365c3725", - "8a3afde96c504505c516096537fd16ae3bf01872d52aecff6d80fe0611054152", - "fad3bc3c134d5c6fc8d1c9f0673d55eef5bd05a74b39da730d43663061c64ac6", - "6d8bf26bf2da3b8151ed28e7e8df1d56c37a0d6373a30ff0a654c8bdea3336d2", - "36535a14a0a2d784cbf18166acaf5ac47a2cd3293c8bfa89482bdcc3d78bc347", - "5a888fc0a8d5fe77e1600213bf4eafb7b2d73575bc924f4db88522c26fc3ae6e", - "3f49616a4549ae41fa288345cffb71847668d1078fdd7ee2465f81f82fbe74db", - "cf9859ab03ea1e9c4268917518c369e2bea2e6ed219e1aae65d39a73fe0f6d15", - "b9f40bcc49419cb28b9876c9c53aba2386948bad6e027caa8ac6ebad7a19cfb2", - "c23fb15845519e8a389c193f37380881998e2d6eb6c015e1e296ee76c5a4addf", - "d6639ed1e22c1c691e34866d4c45f016f310f35b21abc2891ae3169da8959e20", - "157082cb08b9a80ff7e84ef3b809c930eeb93ffb0c39157d3fc49c8677bdc1ac", - "0a71556405ee1797611924b1c2185516c8d6b1228f6fcb0441e7ea5338684ba8", - "33c32797f1d9200f8248f485e3e289ee845dc96a6efb2e402ef1b044fc1a3e2e", - "a1167f471edf64a10108cacc147a230f3722f875a1da6acd23e656ee5accbd9b", - "067dd13adfe48db80bc47c2caf1578403ab53444606744a0998a63a41a1c1a89", - "3aa510e737121fc6553cea2e36a51d30d3656b176f02502f7da846718d5cec0d", - "8066215f2ad35c6124b3cd2535d760fc4fa3e5655ce2ac5dcd00f00dbb7fe5bf", - "426b298f9dacf79db48b93a797f7df6727086b4e79b278674b5adb88872ad91e", - "f63992ccbbdc72c4fdd660efd1727d40904c1eb29064fb1825d63a02f555c0dc", - "289fd066c2e9bb82f6ee7ab0b5bc619a917a307282af79549df63474d7297c72", - "5c5e3b35225a128580260c17a318ca9dfbde2138730d87970bf1d56b2f070611", - "b1b52a2d58725d3282ac858d63a16649e4ebe184d02dc2e74a84eec7029a321d", - "74a56a0fd2e2cdbaad087d24c784210561ace13d6bbda313c274b503942e1dee", - "fb92dde1b46e980f2c8b2431e2c6c868e6c3028844e30b69c4f0aded8b0ad6c5", - "62c9aa3b9a6ee8c7106d417162c035529828b3ca877bb4291667eaf172a3daf4", - "49a6ebd7aa748f1d9423831dc813a5ad56e8097bd324b1a7b4c151db4eb4028f", - "b9416e80745724a7dd9506d71e91d0eaf2d9315f1bf6c82cd3e2949845aee8ea", - "e22f5357a5303be56c01eaafd7afd299f7f7ef4cece222e12cdff8fa5c3c7180", - "25c00c8aeff5e7278055842482a005e41e63585f310220c0ae2f8348c16fa50a", - "dbdb4ac7a78d0fa671609c6c0ed66dd1d42c473e1dace365652fb0aa2fc321cf", - "8711c1aa08d5ebe5470af7c69113379915c684e70a989d2d498b8de502c13931", - "4a2174f11bf3ebb6a34154ec8c1606f0af62be687994deca48e5b079ed0ec760", - "11ef0bb7197e5e7c2ca2d329e4f8625d8bc489a3cefb904a45e194daab9aa2bf", - "88b1ec755764435fa56ef627c49e8dab092e8f6a0150153383f6633d7d843199", - "16aa9f01eee6cfcc6bddaa95886a71c2d6d4875d34a1fccd448b91fc6049096e", - "772e15e5e941d5d2735a44bffbecf1d2996eff3e395078e33f272096e29ef807", - "40ac9fe2d55d10cb3d92d631b7a50efc1ea422128ab0d2e7e4784f300483cb13", - "42e543d11760ad1d9defac16ed9a4d304f0d727a73c65cedf5cfdf23842ab31c", - "03b0be1d1df43f977947425ee11d7e264f4c98b3488cd3ce6f376a751b64de13", - "1244ca30a58a848e35748fa74d38b58d3c6d2fdea3e7393aaf1b84411c6204e0", - "170a13afee75bbd50ccf430e8babe3acf12b1ce32d92993ec04cc1be4ee55206", - "9530b79f7d5e43b4a5ae42267056f6e4cfe9ace7d77d3f6ef53e961a8d6eb983", - "92b9306ec0a97c34951fb30f73156e687467cd71653d21638660d4ae5c67f6b3", - "445759dfcd503e159d67f27197e626c0c5146ec40efd6c2e144c404a5835b45d", - "810d9c1fe6cca49268272b339be46e706a9197d6a73d37c6c327bfdfd326bba0", - "ecc78c20c288327cbe76aecef86166a1f66630a93d3495b119ceb9745fc7026b", - "9041967339e6f778dc989bd7b2f6ea299138ce4849b77fb6701df6ec3505d9fc", - "85930eba3cb8be494a0ef5307811e5e62483fcc6d3c835283c835718dc5951a7", - "e4027058b55d2b4b4101060e4c245f2335ff0910f31247b06eaa258cd6311090", - "6892db15b300445997f76826a8334006f7830cf59cf8e4f4e63aa4cd4435ba6d", - "bfbb12249038029f3f6803a0a1a4d593a62291b16c939a8e25a5f67821b2ab4d", - "8f0e22bb08880ddbeb2bfddb5c76d597990c9fbd9077147404a718ff1cc3af76", - "cc30be7998e9e671c74f838fa8688eaa312ad9b16b8e3f67bfb5225222dc93cb", - "3488df72cea54112314ce58570321334776417e3e4a57b41bc087c3ae828b94b", - "2fdfe298c37ad488193eeaaaf30bf0db8df08df88a4d6c31a1572cbff9ed5378", - "662b7da1a94f5101d84d4b6ca336b0d65ff67efdee1d1d00efb6f3a43e5b9cb8", - "8311b705992fb405f0218e7f11acc5ba9b16f76c4abfae249aec272e5024f21d", - "31a75537ff0088f634d2ec1e396f905bcb88ad42db6d7568a1d24bada42d2c49", - "c9061aafadc2c2533dfcb20e14fb37a8839f6ee612e917870abc4dc39045a370", - "b73df7be05ff8268c10c7132af1a47463f75f05484ac4262555dc05730652842", - "434dea3728913367024868307c7c1b96e9d66be335777ef8e46d0bd9ac0f0174", - "910d569b4ecb100e5a2762eeaa86b32ca779c42c8a67e6fc5fbc94b7c7858a2f", - "b4df021a72a2d113c2cbdc990ea10c7578bb94089bd25a72b209bf8ed316ddb9", - "87e56f5615ab9d88538d524e1795b20030778796c6966111e1430b8f54190f28", - "8d7cb2612bbddce68534d7b73b3eaa858a457dd0b292e6525bdda0b853bce7b3", - "c704fc5465e69cab7a9d8c8daaf18fb8dfe60674e45b0b7e9c9fe61ba9cf9e9b", - "93f439eadcb2f0445f17c2bed788b2aca1ba99cff43b2f8d03bac94c7a16dfaf", - "d605c1a1254f269d6e7cd7629f475f65b05a10c88446f2998b49e9cdcefb460c", - "02047442a5a3be50b5556e58413b4f144143e5464672a0338c596e367d7359f7", - "fae55731a764d72ba74e3928f85f5eb8a4b9095dc8e355cc90f8b460e65edadf", - "a8ba37a8892691fcd2d0cb88f9a212b8e741176d03195439e5c78ae6e2bb08d7", - "f7c458a9323d64a8205a8c725f123af2e290aaf42e4f2bc6b944572410f76b65", - "3ae79b4193fb76225bf35d457bf27232a35ef19d4bfc3e6a7ef56576d1c2bf95", - "816ff735f240503dc7c0f713dd5f525e1ae82be71c87b656ae6efa3ff58fad24", - "408a76707ea95329860278b4fc7f0a27c2683857f5ccb3bee5c56d5d6b75c034", - "1400e6f74c181f8d799aff0bb2f8b7e9a8581f6a35129e1d0ec7da7ef49c5be1", - "9226fc486a8e1d10b5ba4297bd90ee6fc50db8d14ae81e73e29de33389824850", - "d8b2e6de397e7fabe5651cd4a19bdaf302d6710c14fbe19309f31076bcc738e8", - "dd6afd4b3f337ad6431306a060c77de0ad507e47dadec04f3f997bcd6f81f6be", - "0d96cee7d6e401399fecfc0bb6a8a9da1557a29f8ade3194f9c447ccb6d02550", - "293284087ee93120a0341acefc520cf17bd4feb87f1a795c0118fa7e91f121e1", - "e162476470e6c5e8504b4fcbab43be767f628a7d0c26da538a6227d9bcfeb5b0", - "48c64e4517261fefbb88b7e204b8620370fee9dea2f3d8d1f5a273e16899aa9e", - "3b861fddeb7cce01bc13bf2f75f13df6126bfbaa8e9628f7cf69034b05f4e968", - "c3cefc7a9b179325d5f6f40fd12d3a8923822ecda308b3a38333c5aae27d09d2", - "5236d0d38b9e1d56ce150afda1e96b90ce91de798c1cc9de521b13eb22c6e55f", - "93e5dd764bc22f887ab936299a49ad2b970833f232fb3c3b82e310597cc45cb0", - "0021bcaaa43a6c5b21b62c37e4829ec79863404739bc28efd320d9a00dd1d485", - "e35ac0d18112f4bc7affe18f36c8ef6e55e0a4330fd4e235ec597d02c58f60ec", - "3b20fdbb1fdab19199d55a30eaaf4b878b0586661d09bd7094d8594d1d87ad26", - "cb5f6f6a099359ec02a462fd7fc8b3e913b3821986b357f965d4759cadad59c2", - "27256c994b4f057cc30bbfec9436ea53715c49de0802bcd36f175e94d5ef1012", - "8fe4eca1baa6961813b75be37dd6fecb05780689fe9b6bc8d35ab6f3556ff650", - "26beaa29c96be8f6e32437c532cc2d9372103156c2080b385810f5c2975cf0a4", - "fd2db0925e290cc3f3f93cfc925fb53afa13270fec86c043b76c5b0be2564e2d", - "d928861d5d07ff4c71fb18bc51f5360029f95a7941d740b2c3d0d11858722fde", - "a6501ee97bd160cf93d08f8bafc2208577feb5d13dd390a9a5c12e62add163be", - "d112ffec6f4bca142f4d391a0cb30edba23d964f13600503144309173cb220a5", - "ce289914bed53bcc3520b1fee3feae6dd4202cfb9c1262c5acb7b93d061821e8", - "50634319a956dc123ff56e73e6e388485ded673735a6ff71838a19f8581be83f", - "a38c4c0a94a53a514f27b25bf3345d2e9faedb4aa23b17f1e445404babd14149", - "1a0e0656fe091990b74ff562f9e91eb5ddf3bb71aa589c8bf2f865c0a8e0cf74", - "78a48e9e580c008a9b2906863c8f7db0a76ed01edbbbb80475012f4c4e67de46", - "86ccefffe7a59557521b42091fa73617072f5286de83c553747f7f7ed13644b7", - "a9caf80e51e8d39091c12b0faecc51d29e91d46de97e65bd9e964a376fb37ea0", - "c8601521e945c691579d851fb82a4f37d9411e111ed8965d14de2a36b81e5871", - "c4d8ca9993bb200effe3cff02180f3e716bf55e8dc438cb993044c9574d8d79c", - "7b50b257239f24503a93082454c3ad3921dbacb892e6645a8a35bc990e016e71", - "5ac3c34f689480cc91ff475e1c5b6d296ed7182ac183277f12228c8b18eb21d7", - "c55a6ebc5bbe1f67d95d34600086045f99dd4942b9191b6736c3e9da7173808b", - "0e0ebcf8af479032c1edb0839b7201755b8df885e0ad8281aa6131a11c9d5b61", - "ed2d09df6a16fbff3b71b74d009c2a180a0d8e1772e2882f267bbe5acb1f5005", - "8133ac96e4c56077ae0011bf4ed58e661f2f9f38bdd8451d43427463417e07ce", - "406ffb206555c021678596f143bfcebd12ac00171488b38dba8f24885df544e1", - "0d9108ddfadffb8d67cf7e7f6fe807c0887f72718c30e355a8e104ef79157fa4", - "1a046ab900694d83318d7cba19f034810d8fe678c59d662bc7d75c43939eef32", - "5a6ec9455daa569a50aebc5a7a4f53f8b73f892441b906e7f50d4f44dc7ebf39", - "01fe0d8a94d43b1ff1bf0953a17f012d6e3d8fbc175fd588e7e2d207e1b07a6d", - "cc99ed66ded71c96eeace97613a7eb4b83810f0a286070349ef6a6019cc49b6e", - "54528badf0a8151f5c935448e15f09546ae083b0fcec9054f6d5aab6a90834a1", - "777a3538920d82ce0d85819bb4bbf94f1ce120fa79c083a6157f38bab3fe8a00", - "349a82a6e90163a7d8fe3be85662317374d07b3ec418ac7fe61e74fda62534a6", - "5b6b7a74d4f1962104badfeb6722fba2dc1fbe687f4b85483c95e20a71833c9f", - "da8ea2f6fecf780db685aa90b98357aa0e79accf1dc7faae6cc684166129889f", - "731c13941eef7e788e1f6736f152e814b7b442c0be18e2b70be1e2321e533fcb", - "9b5e111103f210355fd936fee418567dec7d323dd27f25a56f0800574c52c5be", - "ee7e1cac123a56e700e6f141cf95977de2f350a42c9572e8fa1f3b5a245fd2ff", - "5291387abe4c56f6a03c46af601e85735fa5b327cb4822846b2bc2d274952632", - "3c36125c9a9016e369266290addc85bda7039afd2db0a9a02968c6e83fe7e115", - "c534764d2a5c0d1db4e70455112d111ccc424d14df773113d54dd545d03ae8f1", - "0e9d4163298b83bfc9a6e547c97af9d18a2d6547e4ba9d2a078d2b68134042cb", - "cb202f560c9d797302af7bd5152656f038eda1959d9c3b3380d964077dc3cc34", - "3fc1218ef09b1c26f43d4fe867047923a18040c9e47f1e4e3d10d6d48ffad378", - "7a71a9c6849d929f7e68c869a2c4fa85ee59b852bf3d136554187c091c712045", - "ef4c8c23ace28db6959c32591610bec14cea156ecc7f3a8f2a5ccb614a7e511c", - "c42b8119879fe99e9d0293f3ca1bc4952314a4dd62928096c81f698e5ba50c97", - "a5b95e95b887a9e104bb375664c63a7b7beb880e2a30b3eccd2445f8d5c30489", - "7ecda33773ab56452ff414e03e95a6b33b6695e417f7de0eef4887d347a7aea0", - "aca992255ff79924d43d2d330a01157b388dd64478ca8baafd3b4a5a9aeee3c3", - "90f35600cd477c11bfbbbec524fcd9648eaffb349ce6146994987d3fab695237", - "57eae80d5c5f49536e5d8aba3306a238e0b4babcb527bdea95efafa993ad6a5c", - "f216269b1c8c92e3465dd658ad07d56eccb7c17a43f270e174e4020fd2b699a7", - "cb6c2634ebff162ec983c4516825cd82bf61772a22591f5d56afd624f33d0efa", - "fc4338049a530a9820840e34f01019925ca3ed7f2883b544a8fe3fc4696f0262", - "8001cf9fc41f381b3db14ec0025dae563c9f9a815ce6297901243de82727238c", - "825df2e5a51c33369007dfca28dec4c31cd7ab59872b9cd2c2ad55e174d73b44", - "62d1c2f9fa5d4cc79f5981b49a227fe951022b5ba98624916094d35906668b02", - "649a3fa8f727cf705d29499ee4ae569acae02c1e1e24dfedd05e7c9333246503", - "42dc19c28f642d7a43ad51a0d86cd377b2e64fc29295eac31bdd79d101f0ad02", - "cafd777999adf02dd962a914b1998076d4c978613fa65dc95e9bd71db760072d", - "62befb07bc5b4ee6b9735865509e997c1f5369caef36658c7d71d6bd67f4b244", - "0100cb9b3a3fef83ef471f433cc048b4c11b05c6ac4ab063f45f99553aefadf3", - "33f3b2a527029554a4d6e31cc27fa6961d118b90a36fd4cc24316f595362a2d3", - "998b4a3d87ae1b00c8e7c41edca9092f1200a5d5f42f37bd97169101a7ebdaf1", - "6f98ec9ef8c7d36599c732881bd2ae7ecbfa55f01dd5dc27e002622a4d6e181b", - "eb453a20da7023723dac931b6e86751b198955ab2760c3dd07c4f182cd703565", - "28d7ef2c80b3686b3f037a3cae438d165cbb5a869fe7e1c6d97352a86b760dfc", - "8568217632c72ac42c8da58264fe80184eea7d9cce6dfa193829f447aaf3f0ab", - "20c56be54b2dfdfc27641c5a4165f7fef67ac2de8250dee3ab5bb59ae34575eb", - "a2e153021cb62516baf98425aa3ded34c16872b7e3f36f9d723b6b2c09bd43a9", - "455cbfe88f463d222c458011a0a7bf3791b14450ee06321e475d7ca973a150a2", - "d6771a1c77b5592002e30c8ddf434a45fd29a2094ea53dca3c0c05242c1e8a40", - "1a2645b414a30e060b72e4b09b9f7f3131c5a0deb92007b49cabe53360f5fb90", - "6230944c2db1c10b08ffaa7876b4dd3007bbeeadcb128a35d6c63e0880e07187", - "e0f39216d4aa9f556e9925555faa9f86f2d753128e87b4d878ea6af685f3f253", - "6201810529cd812b51896f9754b0bfa0355fb3fe39e42ea692efe07d6bd223c2", - "f849815322478216bb3b384d2077e9fb5cf4a34fb0b9d260b4d89abdbff1b801", - "b840e8131a4ede588ad2f155500d88bae09f452e8ba53f380bdcbc72fb68a487", - "84910637b1582bec4647fd829f31f1379c01cf71b0cac620d60e34d6a9090702", - "e167b645423ac487b0c85e4bf10ac611abbcd661fe49714dbad2c3a42ea8bb10", - "14f40f9373f0292a71158ea8513ffc35daa6cb08564934bd5c29ca29a2628286", - "f8f5539e7c7ec22d8fd0cae4e59f183033f1791be08aed46cd8caaf2658e016e", - "d072c5ca5558dafb4d2b1d388905406e8049a2eb3d91ad0a09e5bd1e4a576704", - "c1ad6c9a9a53041518f9b109387dc32cbb379cdad557a0694260b740f8d7643c", - "9ad4395f8c1b60b76cd353633f1ad154a9c2db9ba74931689032058eee71e25c", - "b6e81664d52c0e3a57dc6c2f916e50e3e20b9f0d7d1caca0888cae7ddf72b7e5", - "185f2ba4adc0a01faa3f249d06b8227378df90bf2d0b1dd0dd4d5827383b6b46", - "62cc15cb47818326c433df0857353698ada83fb0bf4477812b3691a2b5ea186d", - "9c34bf2bd51788293c03f1d2331d5dcb1abe67e42507c5248283cae5fb6f2f94", - "ec7defa0a56764f74539d303e29574a43d1ae74fd63b2a12e56a5f0eb3cdd6ef", - "0dd840cfc39c0c714c409633d3eeda291021ac358d43f48eacf84e0548bc8546", - "8ef370a7f3fab2ab75785993fec145ef308545b0ea541de2719eb2ee3145844e", - "c383c815758ad2d712edc06234d1459b000d28e69a273595ebccfc446c277eb7", - "af2369d1a589f530c565bf959ee0586ebb15eaecbb186b9eae59f6bb939aed42", - "82d885fe9143272cb6292196ba04390c3d471c143a21d7cfb1e5b6ed7636e81b", - "8a6f3ac9fea3e64240fc8e34cadd327453486b5e47d8cc19662280b92159d99e", - "5a36ee6a5443a4bbcae2e75a2e20f13f2b2edc021d19836d2ce3723fca2d4890", - "46d41921c52006c1d236a0d66ba687bacbd82cff99f9a200a6a1d01c3e3f316c", - "8425250215b275fbc99c8106e0749582fcd41ac1c5e57fb554371d3725003785", - "cb273de4280c5a070b805eae25166ecb463f146044689e78d4c9d3a387075768", - "92a2566572ebd2cc381f65b2af46196a8ff8fffad561e933d06e71af3db178c1", - "32aef9df759437a711f642638f05eb3aafa6accf19f906c53d03002726c45b65", - "f313da50c9826613177f5ea8cd835ee411a86abee9a6709b95fa361fc110d320", - "f3b9e77aebd907b23dcca7fad8d0777f44a0a806abdad361ca0f8d3041a6838b", - "019170448ff4f5482eaa1296b3ffa5202282d86c6ab8b494274075d7f9297926", - "695f4bd85e1dcd3facd57403aa05537a6208d653ffdbad69d5d828ff1660d61c", - "d7110380b0f59e146e5efc8df652a1f0de1f0c47daf422cb35a75aa590ea06bb", - "0c295eb8e507ce34af659acef3d1868af805dec3ef7c62d510905e87fc58af94", - "f032518c50257315ec9ef1300bbf7a15b3545aba0a700cd7a8e455b1ce540015", - "5922bbf245cb2328b462f1aebdde2865122fe4e70fda2e2b0b421ced140ca6de", - "e1ff80196aed21dc74ab10ade13bf72547b8e40e398170e7141831c7b6b08d2d", - "a0aab7109878dc5c8b39c7a4177e129c06f5a3ae0c33d1c603cdc2fb59b7aeaf", - "6a2fc3e7e5fdb1a79c4607c8ce38a6b95969958413ff4cc992b7d4cde18f9341", - "d242bfef14900923b68ce6f67994bb0de60de6afacdaee14a77018748ef1780c", - "19ca32256985c5d06728e7bfe0d6f3a64b45d03533c4b5962f0fc87bea62ed2c", - "c4e33bd2b49d1b68aaf9880fb7c3fb70323cbdb31fa3376eeb260c789e27c47f", - "51a12a8c0eba9ca06aa688d3b6b06361d28ad3596925e2867a99ffebd1d7d1a2", - "c72b7f85e1306083d6bf5b0b621585fc6c07b571d0e8b06c2944991c15c6e574", - "220de67b80300cfa261aadd464ede83c9c42ce327375f36112bc8ea1b371bece", - "0275ab693834d70c8b2d22cb211a8a9b57f0cd2cfb695827205756913c2fee3e", - "ab1810da15b5b0bd2aeadfa73a8bba2d307e20d551e73443162d7ea45194dd39", - "830a881685012a81c1067dfa9bcdeb719945696bdcbb3f1a2fa15ebdef5ec79a", - "66b9a833b89634132920390f528cd7f5959e5d988da4201809da3f18d776f018", - "3ae3b147a42af36992a1a618eef5395de95c88460b47b068cfaf1b1275e4f93b", - "447d286e840e0cac4f909548b6c0c7d1c50e2495aebc8694038bcd2d5c9b31cc", - "0aba903b670fbf02d4f6236f5cef609faa637d420dd6e305453c7ab8e99eb7be", - "d4537012637fe3778f1a68c75366422c12f955f9807b5320043a56d4734ee4c6", - "a4335392bda0054a2bd9cb4a72fa068def48826c8dbe4028d0bdf8d725870ac7", - "fb7dc1cad07a4a1773d888f53b36a28bef6e6c4dc28123124ef77f5fb00830ca", - "3701f3f45dc0a8d4a459d3f7d1ee3ae46c6e9bffefa5afd5f632cfdaed66bea8", - "993106beacdb9bf97cd0edf90b60ec3242d347f965f2b09460bd68d96f6c074f", - "6e98e2b8418a528c44f8aa576547e642f70827735b352578b7f58a7276bb5858", - "59f30e67d2fa9403e4870cfa4da9b6b17b51f1ae429879817671063a96393c46", - "ea53eb11cecf4f4b8d03e5a1e4ead03b8d7c6be0572eebf1c7027f103e7384e7", - "00d338896ac3aa0a4fe26eb8f57abc2ae460983d27ed194b634f9bf85cee844d", - "7d0b5b87bedb1b7d964fdc5990fb71455a97255685523450ff7ce62fe5396606", - "3635849cbcf0395b000d4f37bb5ac4096ca0ac82c469414bbb891c3766610265", - "15e09988180632e85b4ceddaae0ac12a2c6f0c0d87dc0a75f94d76f7307c849f", - "02c9980e8f72ff7cd0e4cb9f6cfdec3bc987930d7f82ce3f0495e8e87de98a95", - "f986b9559f9ba020d48651aa6021fb18028f7670e681b5a7fec38b9410457312", - "fe1ec7872e770df5df56122f44482721a21383cab91253111412408d60e200f2", - "e1dc71cbdf3a06992ec279700b88d4fe6fdf0aee1ed5e85bd4a8ee0405738f3c", - "0ffb5d96306467c870851372653913acba7845bd934cabd5f4b37a12a02e50fa", - "ef32e63ffc97ed883fd33bbfd32de0573a10cb152e729a4cde4f7369b411853b", - "e7e247abcf15c5e110f823db1334bcdc6d3e8cf01d7699d1e9eb56d3066eeac2", - "ca7aecf57dd0758bed6242fc337a4613069e7a0915b4fd4b42274cddaeda87a6", - "e90d76302a400dcb18f60184655961d083e7bb7c42f9510d77f61ccf878e5eb8", - "4be597f2b1a68791acefc4db83eadb85d5b3678b998ebc447058d0c52a56d808", - "c875bd4315375cb438a989267e99479ce002aa43404182cd10edc1c2600e85aa", - "aa5d5373f211ea2766969a23d58f44887935bed381fac8fed40fb9ce508da8a1", - "5f131da28feb7b0bcb6b60b0c9ffcee6ff05a5972d8fbc5e3c35fa715406bbdc", - "39ecbd6c1520012c41599953c64f4fecceeafb0758d9db90a9cd0fcc3d4fc035", - "5e114b923f7d061b9229c3c68fd13d1c574aa7009e6ec8034ed7788e25e541dc", - "25c53fd8c5aa524f96bc1e94405cb4eb565f8df89609c7e801a2ae96d76525c5", - "79577523e25349111f001c05bde6d9b6d58f43559642a5268aa3a699f61b63a9", - "48e4e12b7cc3894f8276f06fde6a04e0a65d879d811c2662c8db3ea22371758e", - "296909bc14711d79f27df15fb0d1e0f4b348fa0ca8c7893f4fb306049966989f", - "f56c632adc8e89551349ecae363846b7f609025d3e0d0177101150120a99ea47", - "cec1c563980c5fdae42d378f4153fcd2b592963161174527a2f9816d63c79489", - "127729b4e3419f00d99d57bfa837af521b1a588f154bd4f9acd4fd7bb49bb4f2", - "c893b39356432d304a7d2dd7922b9cae43d3511a40035ece83796b42837b988e", - "09490a943cc6957371d62fc37d51d75de2410525ef514ab36b7af621fa9116a4", - "6f891595e55a6fd3e973ef459b4aa83ef289040c086848074b28e2cceb375e69", - "8d1e5dc6e3dbb05cf4f81b8188dc9c1e7cc6425696cdbda9d135f70ae3ee0a12", - "3506597c769f20770694d01b1ecce2622afd252d0e30747422080d7f9bb70390", - "ca81f3dd6e351aafd2ca20d1f043bf14be150211e38c6692a284132c6e897851", - "832a3c9b697ccc363a93a87be9a3252b2b70978a23c2be47daa4a82744c3ddeb", - "e430cd9844bf5f4bbb8efc40e1b27f7bc5a7ee48274296842040353ae431cb8d", - "27f3ca2ad531ea840ee83d031dd93e450e0dc4e6baed5a65cf3f3fdd3829a574", - "8e95420c63c0633031ba68c5c03a34e3084c4bb46a5ccbbc2f262f13c7d238c3", - "1fb472c56d77ba194b02bc6c58396c6b620e3b7a0ea3082aa1cf1c0bc21f32b8", - "3ee6c79ba9aa60149c6c7615e6bde6815efa139d35b4579f853cadd31a42cee7", - "10d8a3b24e51bbf0a58dc49b0c85d719a4f08188b86b61149178003f839453fd", - "07be84ab05ccadaaad7977a88ce1a6d6990ebc26b5a148d2e11f7aa0480132c4", - "74cbd65ed392d6e25aec628c48df2f7d1f1de3a3bd47111e5d8aa09b100d8252", - "2b3ef78c43adb5cff371a5ef1785f6490e18c2fd53650598bcce18b9e1a7fabb", - "6afceb5c22f2075d3fa9d0fd62c90f2199721523c076634d7689815ead726a26", - "ab6a09ac24d9f785162e169f5457ab90280c7607d2c3bcc0a072a1fb935e8c7c", - "bb8674f993d38fd3d5d79c8fb1cf1ee4841b933134159c6b41c8386fc2dafbe7", - "2452856fb4eea0b354a64cd06ddf2257e1881d63f52a2747cdf4ffcc174e10d0", - "7301d6acfa92c7acdd754fa9fa51f52080089eddcba878b614b3e67e5d5700db", - "b1febd94953666cfbcb7d151a41fa1d9a24b09bc19a8207f806540e726d3e40b", - "36e702545070d9df8f4adb964ba10ef90c9418188f4206182ce2103d326f2cde", - "54e802fe75bf1f456726aab374d7be78ce0fbf56989153d9b17e9afb3324542c", - "8d013122c3047b9b2a72e72627012ee26e8a9ed0bf95a7187cb7b5376dcebbdd", - "26ae991564dd6cd5e97d2cc903a91690dead5824f6986b6f36c09e5d23e65fb6", - "a8ebba2c522fd71b8ba125e54f8026ca079f6616be1f4e71f1042a4f19469f94", - "bc80cd1889ceb0d6c455a4a19dfd7801339750f2734b2a6cceca004facdc064e", - "3dbaa2c3e0506df518011c87b7d0be7af8d4c9b762522a360d8f91535d7a6c2c", - "30c916177d137d00cbfb7065748c893c90e92410ac959238ae7c4216f0dc45c6", - "6f7fa1ae899057bdcf54293b9ad5127865310ee59aa8ab5bf4e014aca8ac0b34", - "84ee194d87f2b389ebfeca65294d739d725dc1a15d4f95e66cb749b75c3663a0", - "48a6e41a6e25db8566790e86fd21fead60b229fcb44f2343e43141aa7bb48e86", - "fa818588e6995ce4089cb32b2fe860bda1b5ac1a7ea15de9d47f2862f3f7d358", - "646cfaad75ea909602f4069991a2a8725b18b5ce89720bb8d2fbfdb202c6db88", - "bbb8d6a2a057f0dda90c230a2479a9c043b1c5c8ab650c0f05c0deca18de59de", - "bde3d0a64447d7237a1297a90bcff4f682216e886f036b7358347bdb1537f20d", - "3efcecd22ddb219e5dc989e7cc4978291a45c36713c05deb0dcdf85f82277b76", - "223c527d38daf8d8c8b48bd7b66014f0f6b2e97ba75cad1337bc4097dae3a4eb", - "e5d037f47cc405f338979aa596af80890b9a24097c52bf685f50c5b760542d14", - "b657c7d08928bcccadc871d9e2c6d3c232b3182b9098241754c1686c886f26cc", - "1d3853269106f2218ea7bce083eab8ecaf583b33c0406d8d96a9dff8c018f599", - "7cd0eb9dc1566581f8e7a6648dac615232c518b17e3c96013e60fc7a1a474323", - "95742de246d9b8e95f4c30789eb54c541218f74121447c77417fa2d8f293c974", - "24ed7293d747633d2fbf3314db595bf89a863ffaeab1c8e06edd85d5fdf507d2", - "d7ea8bd8226053b1aaf1a77874ef5622bbc1e7c6484adf35c2c4ed33aca1a86c", - "3fd0c10f7d633a0ee1bab5602e412ae08faa934e6c809d00b884d650ef519cf5", - "f0a5323515ff97448e060e6863f562c476d126a458947dda79ceee8055068311", - "e60723b08bf070dcd3c5f4cb17832410f08fd436627b92c832ac93d07db3c0a9", - "a64ac3601e442f9cf21e49933dfa5fcaa24a074e657c863ae23b1416e0f605dd", - "990c5d27bc04085736c6f335232f48247115168bc9d50fb43c676323a08fc0fa", - "dfeeb959bb82f574cb0fb6e8596f8589a3e6d9a2ca66e91268f0b3e37f42cc3b", - "69e502672bae7d87bc8d0bca20c482f81469733ad4092e140487d6cb5e4ca40a", - "a60fbe3e94c758f8758cabec334d365e44559ffee9812bd2b8609693404712b1", - "2a8f48ce7a70da9686dda7099ce1ab8cbfc9489823b48f1e7aa6c668b503613c", - "229240d490e7e5456ac3071fbb55d00aecc81b9ce00053216990725cb875d8b7", - "c99010d9ac35a6970cd74993584aca3f08e28477a8248c5febbce684c6ab065f", - "7b743e6ae5da1343096f8aa9314aa72a1af4342eb3d3fa945e3ee033c454951c", - "683d9aea50cf5c9103905952f82c7581840ac20431b6d00e499db37256bf6daf", - "e9d1c8a3ffc37ef62dc8f22f7d10958ca3810a9b59e3eec714513c6970b360a1", - "10d46d8cf49c106ca0e8516bbd2846f8fe36a18bff936abbbb7269fd8cc91b2f", - "1a0209cf35d2264a7f9bacfcf6a0f748882112ad72c13ad4771a51a971920b7f", - "6710acac689b4376d505512af9b51079c0a4c6c9364ecb450e2359e615d3c30f", - "6dfe93b55fb2bc237dba8e5832728b2f9a7adfd55d11243c219a4fab3ef5aa06", - "722ebc68bff89409e3b690155f2a71104bce5b362ac2ea15eae70ec307015ccc", - "422fbde59ad75bbdb133acd9e928250bffc6fd56c27acc537f84624b2bda42b4", - "d39ec3bfb2da2d79cc0b4b1de7b4163c0cd914c41492ff42d5e1405e9bbf6b3e", - "e847476ff4dd0a0bbaa5d3da6abf2998b63cedadfee2e07b41ec28bcd39747a6", - "9b2a22f2fdc30f3282effb9e867280771172833b934998a978ce42edad0e9994", - "ae5f1162a3ebd56492ee1bda12c1c1afacd4cbdacde7addfde8cbfaa9b3d4afa", - "f2fc1571a6b65d61bcb909d77a115c004f1d8d7eb748ffdb2be8822ad52200cf", - "f79419ce06fbca294e68959a823faaace2b05ad3409278dcea675c49975034bd", - "17b9b9f7f766001a594a5ae9650503edb70327a588a67f68a172be0c19c877d0", - "e9c9b3dfee622420fed87522be3cb9f4dad48e70ffb124692c576cd0de61d0eb", - "dfa0d6753be4462d4d4c999e51a6d16c5b6f9581bfd4f954147ee44e14441b92", - "d48e2c98cbaefc1a44212c29bb5e38887065a24dc84190847a7e6145c0afabe4", - "c5dd0fa744625c5796c147d5425885c3075e3ec482b7f99b9a2498c30c5d133c", - "7546c429e9580ee74c6f5a232fbdc1a1a55937f8991bdf4ee18ea4f475a4f36a", - "ae8e2654aa256d82b195a2b60688fe4ad1bd96695ec892d64f19ee0545dc2b65", - "95c299130d1cd7c197f9d88d01a6782a9d19ed4108a01b68ca32d591f4c670c2", - "73e3b27b3afcedcc9bb50c7c1bc71f35fdc0120f652403d402ae34f5758770b8", - "d1f1129149cdc4e7f0eab1721bf972df424f8ba2f854729919bac5231503f3ac", - "7c88889c027873d80f83be35d1268727b04482095f4a9fdecfb9eefcbea51285", - "25d031deacfd65b5f77ef19d7b44a7f159fb1bc4e3c2df97b85f1a46415ff0c8", - "ad1066d53a0b9c34bb9b95beffba235ab2a29f9617143a3160e4402407e7cf5b", - "1686321a66ae6a3704b02a3392ed340f774d677bc84e1123fcf7122819a98b35", - "f96799769290671b0da2b398561b8393b395af17d963817013ee13483ebc8200", - "f810705dcbf355da1ec2855f9b007cbff57e1b5763f4b93f0f3de45ee6646829", - "dc1d4ee16834948e765505b000052209c5f1342ecc740ec7c21b348dfc5b6cbb", - "38304c11688056f65c000ba11440a1d1b5b0f7c58f235920985ce5ceda61759f", - "af5dd3fb90941b4e9a64ca642f6139636fff762c82b1bc39217124c9714d8665", - "049e7d8b4c0fdd4e96a849fbe9652498a3bc522152703f530df74d016749f944", - "acff0d07d45026315b4b26e451aa6681baea89555e2837947feb6ef9032d939f", - "3e4191c1db4555bc8ae52ad1e3aec3580cb73120f0c73197cc14e7d70a9c07eb", - "f81377578ad1a931d10638befa27576b370e2dfe5fd4be575af3aae1b1fb6a41", - "45c0a0652651da6fa1798c652947b58fbf574d7410ade9a86575e6cbbd71e7ab", - "98fc9f1151ccf16948d72f2a2517b6328e7a1aff98bb7502a4d0c6a1575b6c6e", - "dd14828fbd05f5893ec61c4aa6be43c41e75f188deb856083866020d9a7ed7b3", - "ff20c9a5f55c9c3630b567c96ed304e81badfe6751d1aa741ee6d9432e97eb96", - "da95a24a3f0f345e3c7f1eb36838988be9cd07bdd623bb3e52274a9344380ede", - "21a2752a32d0d3d31581369588533587ecfd2a9b03bb0b5402de135f3c3908fd", - "ebca9a626b4c8ef683e68f433065f18322c27d82520a33321842fa4d307e61d7", - "cce8d9f843f5caf9edbdd5f273be34c52bb42bc085f55174123b607ca9cabe98", - "7c39841cfb5a6275af0c1ab1ba88c44637313bda410a88ddf2700a1a53df7f2b", - "a64f61edcea535c4bdfe957eaf7b89f193d121f41d7e63334dc9c64796b46543", - "1da8690a7a2e773f63602c0a9c2eb95dca92b47c8babcb8adb5fa6a2e0797de0", - "fc3dd52e523966e1f28d4859607c3f3be22200c44f780604a4595927c2d134ad", - "ee133dfef128bfd5299ca3ad7bb698f9769c52c959d4d3090ead55ea0181d59c", - "80ad444642815ab1cb7c24e1b2e9ba0306b2aa1548ba951a5f800d1a1845111c", - "b4007cbed808e1fdb322369c1a4c58943302e144ae55477f36394143563c0460", - "af6efe4ea9cb15385e777478441e35626d3d8300833c99669fddc805f32286c6", - "fe8d84142ee7f6b3de5efb8dc7bc096bb9b00a6e4ff23772a615cf91f61317f6", - "a698345d4ac6bf9db7a936df328649c9509852b941e18e0b32f523edd944ac14", - "df5ed32b4809f956364fc055cad4e908f264aa969b3df4a456cbcb37cb81a4f5", - "74375e4ade399641b11b4efe3c2a191a50fa8b6c5a6d666454c3268ec40d476d", - "dbcad5c2f54ab24aa32121e6714cfcae71f45e118548475cfa4ff761d2a3064d", - "9f13bfbeac7d64f0b8b5e9fc84036701a2ebc22da2e20497883c992eb8168ccd", - "caa28a438e5596dedb99a2c05807ee3a9f9081c92f2600999261aba38b28d38e", - "b229fd95d4f80e04cc8116ff05090b6237f8dcb069cda25aa83857c8dd94dd17", - "facafdac739b47679796521fefb3eabd5ae01b3400f77e4020126a05253b632f", - "11b7f5ef3f373fc0d3613267caec5ccd5e1cd6bff11beecc492791ef85d40f2b", - "41b0dcc04a22bdf09f6f735b209ff5b3217979fee91c036751a2f005dfa60410", - "3a0b016f34d77148c7d251e3d35964e06bd9528408e460d6aaf0a8060f8764a1", - "a8093930c624539079523572285557f2806f8179ecffc053502995f26915478c", - "dce9670643b1f02c6d51355f9fb52cdbc4fabd78c80cb8a62e40d7e82da9d5a0", - "ecd7eac440b88f6f07a8f5171cab30fd833dd2cafc283f4a439d659f7623a769", - "e1ecaf9d3aba34c86926eafa3fdccb9d070bfc63ec3a14b2ad71478ac3739752", - "3bcba5d40b9f8ac02bb39a8a3397440f9a1e39b09c1580cdad7b787cfd5b4725", - "5b71061a749947dec65520393b5b19e4ce9080befc11b87dc91712dd551c8699", - "12e5f14ade8232c27ac1baf5ddaf47761e8a8b1d86e74f501c6d8c20c87dff86", - "aa05754ea23e77c28321143089e46d2e3e62b98167b6ffb59ab898d9cbbd0729", - "b9c2c8c443609ae33a5324b60c7321dee0e025973ba713bca1c86b821b25b102", - "e07228f96ad7558e660c2825b0aa09961a80ccc10f5f46a1be1ef128e82c723f", - "9d67384292f172440f9d8d19bdd5b6c4dee63627fc4f35d16e2123de73eaaa3b", - "d217b8d9d0e28c60db4d6d33eda5db6c3c87aba1f5527e65564cfe423ab6d270", - "72c38f1aabeef1266917c612d0a49d2867e0d818687f245571248c745f5c8543", - "f5d4a859ff76a92075fdf7e60a096d1f69bfc45c3594b096223d322b0832599f", - "c15bbc57daa8ea259a7e70ca8287a41ace5f1312a2c27590ab28ced7663c7aed", - "57860fc53d04cd82d51549bac9e34fc5f02b7fe8a81b1538393167ff1347bfe6", - "c000ca45998e30d5c0a7e66463055f52e893a94033c9f9733d36fef712d717e5", - "96fa4a14b6d888ab02ca4505230a2c41532b896b7b39c2737545094782f1da07", - "218842cf23e04bdeb35cdd8a46d8be837c48bbca8762cbbb678310ff9f8b84f6", - "7e3854946735989071b6d004597c74b3521c43a0a29d4d1c9b8cd85df1997104", - "e4d6c2e0f9ad45505cd4662af4a29a80edd957b3a7e0eb794c2f37d307f2385c", - "3f87285551513736fb8d4648d50dbd9d1adac64a09bcc5cbcf8e2fd26c3b5598", - "99889525c207842ba2d3006fe5e937e85ad3bb78f3bb9e1ba726400dbdcab867", - "6b2fd1186fb4be9d7a883981e78a75247f1c670ca36217f838be936fff8786aa", - "85b3fef2d01941d8282758d2e6f454a6eb2c2012aa9c3ea24905d9c225b15c9a", - "677a83cfbd5aa876d7f72c045d91ddbe72cb9a2d6324e6e285350c286019d5ef", - "225646323625c835bebddb647fa6ddde8cb0e4ebd6836580b810507432235855", - "3776c497d1a82180d033ebdae918d9fb1d22d76c48bb79dacbf3125f5dbaee8b", - "96e302de76d8db0c9a2989cfbc7be87eb5b9737a4faa9adba9e72c1e91bc73e8", - "1257fb7b1d5d2d2607e57ac56354cfed1c5822186ef98face17dc8e73be830c0", - "17224537bb5e74b7b9be581922f6c272103216ed09b6c339d87fc33a0a53c184", - "994b142c3dffc5e2a1d09951ecb2fb7288fb6c69c67d83be4ef8030548112377", - "965effbbe534ed115e24a3aa83c163ec018b823762b15306854c540f80cab5c3", - "5c34107878f3c31393b9c890a1a3739a6e81f12b0676bd0cf6083c9f1902658c", - "8c717b92464b0fbf400622c1ed01461fee8a4ce42726bfa20386bbf4d474412e", - "838ad2d16a09b921efa25fd9b829490148864da730e156c45d67876d4bfc31d3", - "9d7c2443f73bd59c6c34ef2b0e03fca4045f5ef0d0d77ae95cb68bfa56060b52", - "ef12f78eb0e542998b779e4c5353541d8a139cefbc0fbbe4a439b64e790b7b4d", - "654eaca6f85e0f903d13c0c5c69ab37be22f570d4fa1f3cfdf2f8b81a5fec1bb", - "d88d4e101995682ef9b533653a98cc5332f395abf8e130bd3d186e8530ebe63f", - "4e10fd4978fbe4c15984299285f776908fc21b8e7bf76ab3e82bc242663c9ff0", - "f7769043c359d88997fa46cf0c01d95587a0ae8febb469db7ab11812e5e90a35", - "2ec0abb6fb881f299a3b4e21445bbf49909c13527fb9c2a70ae8ad5f1c57c4c4", - "2512790bd0e9bbf9cd33625c78b9c4fa5a9e60a4e5c2cffe4af862cb44fe448f", - "a07579891ba52325912cb0d2d465868e455710978f20d7a4fec2dc5c50964328", - "27cf5481cbd227e57a98ae5eb5b70541119be1ebc7602e261db283d813280dfd", - "b38b682a9765810d1bca42b8b081859189a593e631c7f59933d0c988d0d9a6a6", - "932816bee0a70afb610586e97e6ed6f88c178969d060368cbfe061d155c94f56", - "1e28d4fbdb3c011d6e95def2c6e8ffb486feed0e5650a098c52ab005679ea6c0", - "7fb8eb74f0a73500fea879bb52f26524486f2b150b6ca7f6586e7cc4de32fbb9", - "c794f975538b085023a6d19323d96246cb3a04537705c167c113aa7435372a80", - "4264a9cd9d341711c1c368ee8a75b6ba3fbe5d87398c78024deba6a81c33a047", - "b54cd4fedd9b88a9cec2942039090dc744c112c380264103b3f0a8c9aafa6da7", - "f37f43e3981f41b50f481cd91ce2591dbab2b2e39266859eec798deb51ed0eb0", - "ace789c718239f4e61aba3db47964d44b4d5a3c9261d627167df29f41cda5a0e", - "60aeed0e95750ec284363334c0e8726dc839abb6e73d8e082d64090d04c25596", - "92428e5a1d7d3026a253cdac398253f9defd76028b6033bfda3e111c4bb9fbd6", - "9331dc580a33643c71ff792968338671a163316bdee6fc7fdce599970875b6d6", - "1083228d55de193a41cd053307e677eb2909cbaecbc1a961338c9e9c895af1f9", - "b752cacb0964f1a2f45725321b2eb650bfd60d1ed230c5bfa184a1ffb360ecdf", - "e6806589edb9b4f7b3e3143b9014376f25d61964d779138780b1ad28429d51c2", - "0b6125eb9ecc1fdcc4913c2be247ce7bc6d490a04ef728354ed439cae135ebf5", - "99df4b286e8d469960303ce98293aa66a0a635ec3f01bbc62189f1175fc3e83c", - "56f955c8e503609422afb56186cf203f34e33fe1bde0a415baa6cc3d6bc12bf6", - "7e889e0be223cbc358ca6c097a7c865b73bcf45612da53b6c62f6b0bd91d44dd", - "eb158dd3ec7accbf03b21c214eaa06df3277a0e90dd074f6f53d31f85db42266", - "5b5c5a2bfb395e37ac773d34385c8abc03444d71f8143df8b43d00522f8acd21", - "65189afab2919d788a3d486e74d038b32eb0b725af85a3009a43dda08f0e04fc", - "e19eaffe58a808222ecd0eddf1e2007ed5f9cc19972223782a9a37d8986ff7c1", - "55a6b80a13a93c87cc7536ac672add2f01831c436dcee283838efcfc5c2f6a68", - "d9e2c44b7544c54537b93977793c37293562a95c2881f88721c92e3fa7eaeb36", - "c46d2ebb08a347adb8e5935e1aab8c17b4039ee907111b2f428e5da54de21313", - "e6c67480cb0a0064b90192816c415caf8db9b12e9025c3b0405ce25c38bb467d", - "ad6e3ebdb93c0b4561eeba28df3168e5eba7fe48950f663405c6f265e83af3d0", - "ad8abb781b968eeaab1adfe4f6ff3a8ab7f64025a3e7297309b89a6f64dc5213", - "02637f7950950c8aef731bee1e4983185a9f988a021f2ad36f997f78e174d5ad", - "2d93b9b2207724469eb4e2ec8d266bee36dfc779ba4d0af1ac5282bddbd3fd9f", - "53f64382d538d4cc977048d2d2712adc6999f12950acea1c720aac80140f1f00", - "60d592627a23196fe8bb9584f6e95e45dc17bbd0e63c3e4b78945590ea0ccb88", - "81eafd9cc9a99752c8893f01f4b2fd8fbdb262c0a00cb8f517ec76a1a8a25d72", - "75d5822c2b0b1a01a2db995aeaed71c482a9b80a1a514fdc7bf121a2710ac9c9", - "5102af09dd7a2e2cb1386ecff91e2c1a2a3743181b9782bf8773a0b8a648e156", - "8332b49a24f4ccb43863103ed4a9dcbadc3fea305c8af10cfa5e5ea331b77766", - "e17a8798dede7d1a798bd50457eae64c45ac76e46fd25128bf83114ee1d6b2bd", - "51bbb17759bd227677150d5887946d598fc002f2d18d087232a9b4baf2ebe446", - "8abb9f4cb55141af6910b1c16a903a7fe0eaa1c33b83368e8aa2e3f15b100cbe", - "96f85a650d316e84ad0e6280d3f577f5b0030418c766b212e8405d25ddc0fd5e", - "46e7bb792b913c860582c3b3bb1799c39a04479000fc1d52bca2e4fbb2263e98", - "796e51d6ff8e54c4a87975136b8f5c079f104fad61d56b14ba957cbce0dd5928", - "2c668a2d337b68f5aad876d91223d5a7a43ac7bbec776265d8ce653031b58c83", - "790504581c2f96889ddcf576ac7ac2d260931ad5385230a552a40aaa27b57a41", - "115686318391af5a8aa194e475d23be7af15f9185708f7dcb890590826fd19d9", - "423f4923cbf8bcee22eb08c3f4b94288bedfd75b3594d36ae1f9315fe1f2ac7c", - "6872bf66700acdbf92fb7ce14da6d55f1ac686740faf741309d4524ada32950f", - "34eb4ae401ba60ecd6f6978ec5ad92680dc3392ec2cc4cef2f8ef7af1619a9a6", - "78872e73d0bfc552acb4d18da0c751c967043a742addd9f12ef3220ff48d5af0", - "7e8930e5b87be794a762f70cda5055a9aee2c75a71617143b1823969e52f180c", - "e92f65d8b1ff9bf7cfc30455a950c062d8bb5b93f7900fba6cb35744908e16dc", - "076becf41a9fcbafcbc980c7020242da9b9e96d276a7641d81bb3e3c1e293687", - "7a515e9e30010e62bbe2fd6608a026529344ede55ced1c96b41864d77300bb6f", - "b4962975138216321201d117e6a61cf9d0b45d36a0722ac281297209b644de01", - "13341e9781b753c3ae8896ac3631a80255a2630a5c62ddeae261bafe38246ba9", - "2726906b136618871407ac8d6bda030f2647978c5612ed656ec315ea29826710", - "d58660781942f3a76cac3c834266a240178eb4424a5937c59b4755d6453cff1e", - "93149e340e3f45008b79f387b0607556b85cf91e71873d11e6a1ad7f1ede343d", - "6bc6d7de16c1129f76db337f4d8621768a6db2fb96c5d5029af9c2ace81318d4", - "8d07e8d4ae0f2e432550a20061d0a5140fbe949ebdc579fad9be482fb114d518", - "53e2269632b2b8e71915bcacc3fea91bc3b80a2373a73ee0a941e77f9e0db09c", - "27807f06729edc4049e015c3405d909dbb23da79f0b649b45a8dd02d00c8a112", - "f53b56bae02b999a970ed666b7a3660fa83e5c353e3ef5de42e1a08d1c33873d", - "d92e1b2dc933ec91cd8b5f81284815c518db694d9acb019cdfd76990d68ec78d", - "3b80ec6c9e4f1f1e1e9e5994a4c7fcaedfa169187a6a867c26e0c554113c578a", - "a31342dcaa27629a54bc736cb492c1865a4137d00b6aebce76d5d989f62aae9d", - "f621e6939f8fec7fd7167220681722da558e11cab8ed13e083869a3a0b2aa34a", - "348a483141718c89a2d2df2f85fb16b1853987aaf1bd2fddb76c4027a3f0e100", - "7753af623d08ba134ddbf422343b8aa2231acea9e9a35456451b790146f9ad26", - "9039b275b9cf4b8b90b0a5c0c125b2bf9a4d040b259f14c5bbfbb98ca21b7461", - "eebef865a6fb79ee5159badfcee00e3747148de7a95553dd92d46f4c9adf7f45", - "cb13d10e9cb31095195cd770647fa571d3553cf5bc4f8a6e7ed3c7714a76a9f9", - "289baf592039f1ebe124cf57756e545639f6d80740f44cef208deb023f0e3608", - "2a6c6df2be73b9788ef35a844942ed992f70d90656dc4d3f0b997ac1aeee5ba8", - "8b450d845e47523a82cdd9c7c1e390c74eb729b81c82876c3a19ffb17540e2b1", - "f0ae9e68d49e343f6cda1fdb790389115560e8c8bcf8c958f73493790ac137f1", - "ea253b1f62b184632644799dd930cb0e7cc1048d796fe45d008590691b3ebcce", - "78e994d71c70cfd9a44c8fce53147ec1626ab1b64077dbc239cb10fc597eeadd", - "e8bb0fd7dd8328269e78c5b89209159df0009bf50f5c07ea229b4ce9d28af93a", - "42319cacf81d07e9a9f802ceeb08c67a711613e9a4d8bb575fabb795488d15a0", - "922136de01ddf82e0b2fbee7bbb494fbcb98f00fe9677bda8d7f6d0d657eb46c", - "d50c3528644231a87357ab4e02412dc763b1783ef1e5ecd453af721471b7d29b", - "f228f4aaa70060a64cc3ff2a887120bcbf216bd6ad03029eaea61e31de589a09", - "86066a2260064283f8add3b40ff5306c11278b0a66bceeed9bdaea89e4066c81", - "37d961abac658bc7d84a8dca2ed4a4a8bc06f426f14ff044eddac517d0bd8327", - "e77c967d06dd0ce121e4163fb23b1b43e877008a1f6762b01f5f32f88897b508", - "d84a2ba75f22d23189ab6c33a74caea37df8d9fba67d5f9b8fb50638ff25113d", - "cab551e6ecb22e096a9c26b2cbbed4897f510d410c72ac5ad04279a9fbbe7fae", - "54e682ee55403940d51860bf4bf1c284f60e5d3cd8af16b4732bca5a531769db", - "bcb6499be180dde2a151b1a24ae7da1124b10a12fabe4fbd3a6996cae301654c", - "ee53a554f5c235773b3c4458fef5c0307085c644c4c5fba8765d31c189696056", - "ebc01420cf1b7416f96a6480f6301ca9d1b9f874976afd9cf87d897607c34200", - "807ea6d927240f01976f9382e8ecc0a7056c6f8d555309006dd034c670560b6e", - "5bab80bee59d97e134543377957cd11935b445a15788935e2ef834f36e31991e", - "55a18464cdc52803d6776da278af6bb51e931447306f8ff9525377f6341101ee", - "0bb27e88ab0e30cd1421f56b55866b566bc2914bbea6bdef613699523576fb66", - "cbf832456f5a406216e70a438dcb6bf1c424f6a0a1715dcf813aecceb4c71e77", - "af50849d27acfbf18e148f17ef945705ef0292be4e392e33f2506619af3d5ce5", - "b104b4c664225ba72caeaa766f2b8746b0ad599e2de64c4c93b8ce814e5d2851", - "2d40d9b58e675accac2679a13d21b143e26e5d278c3466148c1c6077547ac89c", - "3bceda681424146069f4b2b4bc686542c217782788079c87e1d38f1dc3751efd", - "65bb5a7855cb5055e2e2093896ba5186ee791edcb3e6b85d87200bcc2ae59ad5", - "bb056956e59a418bb5ad3dad109198c45e77f1e5864fdb9defabd97bc657755e", - "f53546d5bb03fcb67a2ec22f15a3e73461272636befc06365d1edbb10bd98982", - "e66cae1f6889eb916aac88bb741ce45c3bb7d2ed5fe30bd96957ee49c62a1904", - "41aebc13e29e502b71731b95542a298b7b51c83c5a4cf320179579aac7fcf430", - "9ebeed95a90b0d39d4b23aa692252e7ac7c33e8e6cadb41ca316a5b61babe01e", - "27717c75ce1a443e92d32f55379040c5cdc12c7fce237977d3868075c1f2b04a", - "ba7a052fdc8157ad75b15c3b7bbf7814d04cbe3f87ae31c1692884fe9add65c1", - "737373a7e16f2d5249bb0696910ab6c7a48a05b2c99e869d8ce7ed56ecf8ded5", - "f5f04532c4926fbefec5c6b9c21b748c7288050827cad68037a55f0306e7f086", - "1dbd7542a317314ed1090160a482d776aaf1b2a15db8de2fd273e11248aac137", - "113cae49a14dcf0e42af3c0ce02958e28cc7d20068ba62a79279c9eeaa6fd8d8", - "275fabad33da8af562472627cdc74894b6d91a31589a397d0164c9d65809ca19", - "360ff2723356f51641d69115317905f9225f2d16ec4a99c52e9785c142fec424", - "8f0b8d3c7d402bb169a9d167c241d5d1d53ae80b9abf6e93dfb36ac51c8d29ba", - "f90962b7f38b1615c2eaf37371cb6c85fd546f094e01e7441fb887ae101fe8d1", - "d9bf91de277503b54b31a0ccd138d5f22cd597cd766f85923b980fa3f8044470", - "641bf4b389336f02d8e2d77de19a7839a8cb5b706017d13a3c4244708b989270", - "315f20a2d7ada1af312b2deeec308425dd6766b47956699ef4628fb32feb56e8", - "8dffbddd2537ffad0ac3b142d66bdfe8df27feebcf4b0c90bd1c8877fa1744e6", - "d8bb4732fbc4392dd31aef177af0f6c992d4230dd446d88c67fc98184622c460", - "6bf79a45487aad66f8c7e10ca81626c291683f20e774db3ef0a1bfbf4324336f", - "bdbef6e558542cdaf1f2b5ca35e51528b9c3cce2fba9c91bd610bfaa378f3344", - "605f13b7d62ddc6d034c75fa177ee00e22f44de9f207a333640ff982118a4401", - "87448f3c42a5b3e305bf94690e39d53d067ce4c444d97212766dac229d442dd1", - "3545dfd6503759d4c599929df4c11be1a5c56d36ef76034ac64d314b17175ab4", - "ec6f4b6bb73f8a6e27ca0db3e429021bbe28d19edfa04cb46589ecbe46b361df", - "d676a3bd32f178a326e570490590a7dd8551f9cd5d46264a084b74527725cd52", - "ece9149a2c75621cb88c46bd7c6d48493fe2dadd085d2ad71cd2949769d852b2", - "65399befba0dd0d8adc46aa7740e9bd91d6662407e85255a2a0fa72a5d921bc9", - "b070edc34f49ff2d268f2a6664baf6f3af75167eb1518d4da183d51837355b6d", - "942a24d2c2db99a470c1a5916e1180c72d38f5edcd8dacf04cf8b0de134c5a61", - "59359ea4c42c289740a4fece4b31497fcf156be5e30237aeb759ddaaedf8b095", - "5c2f0de02074522d4f5c80e23746da874f1903e1261a57af927d56ecf111e343", - "38204c7e27386d30c66efb1658753b35a2ff9171f9f8905eb2bb0ca769e87b7f", - "2022f394f5fd040531f51a460ce46a8c5b8b2cea8f707088db38c0484d8de9e5", - "90d4c3d62898d410d98c9a7bf48f4f7d28fcd1cfeb1ce145866b2b303ba6db67", - "7ffb3cf3a6cb85b1afa5e51c0c84c30cad0df0f4d59022e08cead5744ffa531b", - "22ce1fa7ff8e4494f84af44f20e93c9d623230048e0fb1b4b9b543fb96282294", - "07cee23ce52c18d52112a9c7401291e8b8c5514fe4e0b586cb983b3223f83fb2", - "da67859668f037c5297dc34ddfbdf32d8afc541e54634796bfe3170adea49a37", - "1f562b2e93b09ec6467bdcb2f6c94ce28579f74bb5fdedc4bbbf7e0acb1dcd9c", - "c26b91716a1f58a27c4fba79b2d1c338036257a695d7c8430a6e0cb6910ceee6", - "1c79de3dc0128f7ec9c5fd5fe9f72d5cacef63099af60c46340cbd45765cb4df", - "514eedfbb30ea14d1cdf9ffef94e49a2f22bbb5690dbfd73abac593f7e9c4a18", - "8afc9bdeded50c5c7ef10333d1038b47cfa46e1d0bebb81916a16a4cea44ca93", - "2e83e3c02f8c26996bede7acb742b3c594387d00421a4376b9b3ca4b756e532f", - "53dc0a7b7008dd315a252da9d58a0c5a1fe95ed5c7c4e5496554404a4f812eb8", - "3eb1de1d00e1278b8d33ad25a25a60a15a6e92ffb2662fa4eb1b51dfb20e34fe", - "559f63fc4afd52e4e7574796f885065ff4ddb4caa3b50297632417f5adc97480", - "8389f1cf44336dd2c28abde2a89e721d8257c0d8a89a4cda85df33089e2c1993", - "fc3949838bd8938950bb72ec42d3de2e0b7f232f3bcdadf13ac49fb9fb1e29cc", - "d60a54348c13d2030eab55db5f138d89d2a52770ff6ceebefb84b79fc0906fef", - "3faccb46af67efe50abaed432f4966e72efb4fae3d4fa021f82966acffde4cd9", - "7e91c443f7b332bee8f962099f98e5ae7b46cf8951720fd456fbd310ff930a56", - "64636e41d51e767812b549cdee4c2d8d34a127b6f430d3281e1bf06ce20a7ffa", - "7c1a32fcc22e8ea86c27b28b076a97373dc0337718dfd3966a09b3e62e62e950", - "78d57cdebbbb72010c15687c7c59726240c67320cfcee286a63fed7613caebdd", - "947117ded612d8399d4a648eeb299bbf9a5a623c039a3dd38b593d9dafa4e75b", - "577169235054216554327b6049d76f02e221f4126fe64bf5b34957b027616ceb", - "0ce9b8d8bdc904f751f7356edcb1a8b9a2d9f8eeddde17167544881f4b367e4c", - "07044af5dd22569e9adadadeab56bc2394d25fb3defe1037657278c03aa526e2", - "36b396c1b20f8188d780f19be1b296d23c1e1d4b49ed114de01e168d50ddfa31", - "2dfe7fcd80f2923c6f3ece2dd233a06d00ad6c2c21f659e6020d60a10b0d5d90", - "0103128c0520c7c8f7eddc8b81ceae68dadac7a4b19ae527cdae854426b39bb7", - "aa08cd73742039bc20dd8ebc62cd67bb99b3e7735b753d7b8e4c2f44c26c9537", - "bb25d17bd9ad23c8242f4107891975153a8ff34263c66e262f34b9e94a1d45da", - "4ebda614542e149a46ef82458d10f091d33b96287a90bf1fb6c5a902e23e91ed", - "a3d0d481562004d4404428b599ed68e6fd8841654cdecd36ba7e140c10d5c96e", - "84fccab8d405a15b3b2a1a1d0b796e3ea0bfc14c3e5f5d0502343c197e80cfd4", - "780ed500a9acb7806ad931e03871b8e07e92b6702e9d1ffeb09766d703885f1d", - "b8619ec4362afc54355ed1f049edc7ef1999e0c75b55b9efd5de8366e004abcf", - "4fe3a9862046c8660e25b9b6f4b8ecde2bf704a88532524f381adac155dafcdc", - "4d2f67144f46118f7659fb056c08f1a11c3fe601001f2e69f8851c60563d0aaf", - "c7fcd3829c917ace8509e05b0ec9e1ae887712029a26020bcbbb76224e6ee31d", - "fbf6eee44942d96626dd6a3264b07865a611798ecd020430adcd2274b455bf06", - "b950c354dc7fba7020ab07b47e2817918b802f9cf4b93365f0f3663743a64fe8", - "0be136590c9015e400827d8532b68231cac33d1d47716632c0acbfb22880b8de", - "922ec7ef4591d9c754bb68daa4d0832c8a334f1f08ec76ed215747efaed13fb8", - "6477388b2fb321291fefe3e0a4c00d48113c4bd6bb2683b47e4351a0f46572b8", - "35e9ebfbe9b08cb09aa51840aad3c638069a09cb18fcbe65d80b30555982fd1c", - "88677951ae383f1c62a1a73f6e9e17fb9fc9b6b75d3a22bcee1b3b9426819300", - "925acdf4ff99e83ce56387c794ef80c4e2d76da5c59a607a5d82f6e0e5a2df22", - "befbc86c8efb14d0eda8903a2768aa069be579edee278ace967a236c3a46c839", - "b64a00bc067eed0bc9074438a5e92fadbfc5900db4d0554842b49f06c117e163", - "efd6cca2ea5683177a552d90dcc4dfa3f027cd2756f23ea950b8170f685e545b", - "dbfb3989bab0e98e1f6bec5298bc3d98644325cd3728ef0b02f128a1fceb16e9", - "b781dc1a19e84d21f45b2d1466525afb5ca9c0b56b6899e9b198d32deac27761", - "4654573e9e24a012e8a37ad972467a4dac2fbc6f0e32aed3083494e117406372", - "76e5ce01b678a60aac39fd8de9caa12d408349d165b39e5e495053b5063c96f0", - "dddc2739c0de58e2f7af2acbf91158072c7b222f56f98a049387f38aeb293ce0", - "049fb07b3616c91ee85658017d623651e34c1b47bd2397d77126dd90d9103aba", - "81c4d0434d7fa07df1322a6395c2ebfa96e4cad4d82ade14126b4f59fd8147f7", - "e078cf504983d710da96772e28c655e0e1dec2c9820243a03ede1fe59a95b31d", - "93c68f487422817c1d5eb99ca70cceeb72ea085f02ec6c30f13f69339e38db60", - "5ba82b66cf038f584f4498f7a5ab6e20e466a09b9951ff3593cc725829c8cf00", - "d8a032414f990470fba3b38c2a6348007e27c51366b0a1d1fd59cc0247d58084", - "9f9db2111b8e9f29814698f02150b7614e16f08c669a9d40d42153b3bde83677", - "bbc4ccb5d9d3eee6f13541d3fb08a3d1278b660452bdf9d704dcdd0b9fb77fdd", - "ea07b5f78ef897f2c667793a21c134000e005f729acc74113192388127a015cb", - "bdd2fddd4d81d042d19cf5c004fc47a0c071af81d40fabbf54fc908206dabc47", - "f2dddb432919d192fae3abf68bf56fab10350fcc7220b5d353fe20448d53d78a", - "e208a36d2a5fc75566c43b9af4fef08700f175c15d4771a7a38b2de9fe47afd4", - "7956e8afa7c75d395cee8ee91208522d0af8162b1c97e5e02b37933e1d8bee24", - "be49e2f4e0fa089daadc00ecfb88d0bf94fb5911387c8f6e04514b913c9f399b", - "f39dc8fd3017a4190c021571b1a7f3d13d702168be6b2d79aeb218f37894b381", - "85379deab6492796d941888f9791235492b40d027f26cd9e1eff476892b20a97", - "c2015ce34009a2d25d8cee4264eb08c8f50e58acf060a6be81891054af67d85d", - "f51e9652924f4689e11f3c7f08f8fabac2454e61874abe3ad0df254853374eea", - "dbbc20e2d67b84f64c9735689bdf56bd7b1b12a60282e67e85a5858a97743b6e", - "de09c6f39305048b88d1ac9157209dd229fb38e0234886d889b4ae3fe78d3b92", - "6f220cec2dfba06db079fddbd737da250e9fd96df95fd52af6e3ddfc63b4cdb5", - "119cdd90936560ce053215bb7ee9dfcc21b00eff35aa6df27811bdcfc7f84205", - "dfd9995f74e86b06c61ab4dc1c9c59187a6997ce50d1df5c8b80e00a0b512cad", - "9bdf7805ad93d68153b82b5e65f4a5b5206e64e3573b511f8bf7ee39534d7be7", - "c6ba2e1adea32f4194fda1b826a0712c8ca7f1a49ade63c95a1800feb0caf117", - "ad3768a1d0559b6dfb57ff6f33abfed72ac46c71d0b334f400def24f4dcb2878", - "529af3de1285507bb83293071b09642eaeeec841471af032232539e5a0663cd9", - "b85de0f92fbc855436a8cf4611af52a2c52c3d152a5ed13c078ea2c8bf8ed55d", - "59f9b7d9b1c1e024cf49e219da054ac094a81d5d72dd28e45c801d4445732620", - "d05e5e46919c94578700bd91fed7c7da87502200c796cd1c6762c97e7b74a60b", - "20731c20151891eb7fca4a059b4335810ff92a4985ad31ee1849ab7656753b32", - "7275a2b6c791c6afe5fe6b3dfa64607adec42e41906858777fb86ea8970833ce", - "f09f80e5f55b4171227fd608d461df96b0d853a9f2d064891e7c07cec0d4210a", - "b570f3f851b3cecb736bff30100f4cfdc1f22465338e09614ccbbe7597b2f04f", - "99463f64a68449db65baec6a416aebccfc3c8e5606f9d863e3593b7a96486d22", - "c32b1b3739889e88b78ff527747bf63e80397563b468b19f116bf3c0f22fd62e", - "b8b996eae5f2bacd0e03c9e79aa600fa6a7e42e093ef11ca35d88609b3d8a8ff", - "aa581d31350f1cd5649bae5f7434d42c526b0f78acd4fbd51e75dcae1b63f506", - "454a7f34eab8c856183570c0ed26f16ec62bb05cea6e5d2909cbb7a56c2dbc2e", - "89b63b57df53017aaf47a614faf5594bea55bd1cb7c68dc5e227ba40cfb51a3b", - "f9e4c9ccd86480af5936a73ad943db049415c92af2eca5d7bcbe883c5a727d42", - "93b597f18b271e91051c2304335b2410f2bc9de310dc5af9be0fe83b69e36c2b", - "96fcb84b639e6c07181dfb9bd9f8a1ff8edf173caf9d9aed5c1e3d92bcefe930", - "480d65a570ce9a860450b3357dada24bdd58a99aeac7cfc580d93c837738a79e", - "3e650104d0aa44845bb3b6e50eb71887db50834365daa0a2699675d36153858c", - "66df6b791373a7adacd3de2584ddd57b7eaa4a48fe6590fadd8494d19061a91e", - "bf1e3679956d933b5ffcdfb9efd011d76f28c87f6eb0ddf44513e856d0227d8d", - "9530ff8d5e1b040d12506d25659439733f5355131ceaa45c185cff31b427f211", - "b86b23c076795f30add770ff00b119685a331fc7fc7c74d0115ab389926dc258", - "7d9c6928f0d5affd5fa98e89f9a4917e543af233ccb54cce8deceb3a99ae39a9", - "0f1200e80b769ef033e7c8f44acabf417f35a76854fe7e0f1509c0f5a39212b3", - "9918a5c348eb91ecca1d4d8156d6fa24a13a579383c712d43a227ed4ec4f7e28", - "dc25806456ed55af845406f078f585a4f3485223743e076cad53d40d58dd37eb", - "b8345187c35cddcc248430895fcfc53c2930e572ebf082c8f0a9dc19f881489b", - "2b16938886daa274fbbf7102b539cc5728ed5c2f628503ba7c85f2c6c45a7e3a", - "f255838309915fd3433de2bbc3e79487dcf77610cbe85a17c453085f7543b393", - "c4b42efe9fa235faf08bb85461d6dda3606d54f1175c0c38e2429ca6071dbc84", - "d523678af5377a40ccabf753c4e55f14ed1452908a041b71a6d3035bfa3434b7", - "b7db0f709d94c05dfb839a36fbbc924be1e084a2b1b891287e86f873c0778834", - "df1737303f10a7a48abe387e09ce622cf64ef3557130bff7ea39d880df86f13c", - "e7eea26bee4a39aed3066a377271b291018d6f8a7166594f6654b0cbccf77029", - "60a7814e8b0b5afbe06a09403b5ca082294397850908bf19984fd672c27101fd", - "7875ec86c7c1383ac11e431da3acbd3fc5cb188432625a64857db440ffecd3ed", - "8eebea6a21c4f274f39d8581e755202fa13a5d3c90763933781bfaec312356db", - "076dd3ebc5e590711b33c53e5e65e8e5651d602cafed475315b9998762e9bc0f", - "134d0d885171feb1e7fdc8f0e311792b16a7ec2e1d9f3a8a5647d5f956af9020", - "fd075b64d32aef523036359e516ac78a932d42eb4e08be1762ac1adf5f169e93", - "0d99c21a58eae6c0cd2bdee07cdf429083cb8aacd938f0c6abf44d0eb6b7abc1", - "f59d33821e1151413b79bbc3b769fcdf8a3a32d62df8ef3a9756bc9f1479cf2a", - "e85f196f86a9c2c85044af31792892c4761fe3888c5e855951fea180a7ab834b", - "0d9ce44dbe0e89183403e4b1a1e536e4921f3d52cee78a52a6dcf0e4f3da46e8", - "7820a401c6efb76f40cf4f2a3742a3275774b4dc5649d668dc024e7eabd8c274", - "0c7d744e37771a575aa1deefe1166f13f58b3849f8895370d0ae95cb1dcc22f0", - "e34c554e9c8b69fe3510a3ef70607ce264ec1350b21861fab5bb1231d19117ef", - "bbf6dbe220e61d3a4460af71241d7ac2afc09225b92e8f90182718b74f135d5a", - "dc24a4abc2408b51970fb22b08fd480d106a6a7f01afe8c127bf69da5efdfa0a", - "5c758985801f43861406955b9b39cf2f0b5087b43358e9379ec88c116f2e8c0e", - "14cf825024a3cd9fabf49caefe96bb9529c6e90c89df8240015e0b458cd7c0f7", - "514f85402f28644c18085b60c789cb7241ed6f2c1f7d1fe76515d165182e7f97", - "e36fbed54e3ad1bfa1e5d540d289dcb02b7d28f9487013f5a729c5af08a2965c", - "016905efb38f44e4771ed31f794b664ba0874f79454504b0b92a40ca0888bdef", - "20ec79fb84e01a01de2eac65f4df26bf39c9ba4ec4b6cd2d0b17a2ae545cca86", - "f296767d7dec0cde153e9cd126fc1e0e28331d0edc866a58c06f856233a6d6cb", - "0accbf4d3e8513b3bc82a591db7645ccb926ec12f6f8d58f413520ef6db382b8", - "7da46007b40d88d627bb57f01fe407f3fd0e8b0ddd624d71396f56f312dd061e", - "ab9a431bb120fde77f08709f27c7bb8224518183ac2ade8e4312acfc97134288", - "7cad2fd1997215d820e21caa084723a75a7bdb9a28bd18e5100e37080e4d627d", - "949d098d69f0193a7f4c7c1c9aeae93469bd541aea50d7d8adcaa3280c6d1096", - "46177cb51f4ac988b918618b61e01929b20934932154f5279e51e086cbb03b46", - "7326884b83e2040b4058aacbd287d102bcd74df74b27576271823e47672cad93", - "ae3dc520e2777bcedd784f305259200697d3da9fe32fc05f64b0247e83c8c6f0", - "18d91079205ff0c1c1e092af8c1877b5e944aab51c12b8d184b33c3c6b54772d", - "08a7d61ae2fd92e23179c735115b1a7daeec43d8c1149a899d8b0a3c043fc35f", - "434a2ad6052a468f361992e131ffa7c5e0f63551648486e6f39aec059ded9e21", - "b3eca97d101663e7e647956ef76e971674ba691708dc04bc41a36282791d6efc", - "6fbe75d0eea895f979a8589c01b4ddca43b7a647a3b3e7eb7e43316c596cc7be", - "b39f3a41ee506a953f725d7137f485c247f93ae51b7a76862c7a1a2bc0ec0ea4", - "6cfc0fa7e2f1974ed4d090f5bbd95db78bb27605428c0c86cf2331d97d3426fe", - "cf46ceb32b64af3a6d7d4e18f16027a06d3afc6a97e0e51154a80b52726dd477", - "ef46a616a72d392b9cef4ef4891785d35fe25cd71c024d84c5279cef500bf96e", - "2d4cb0314ae465f00008ea49db64ea025ab622dbd1ccd6c96aab9624ca1d0d6d", - "4eabbf86d83194e5be9a3e61360e42972c7dbdeee0d33516a017897f307627d8", - "a15560facca8f426b5ecd2db45c612047494f01f56c9d49cd9265f1fd2ea526d", - "a35b610d577bec435e95277291cbde0038d91041e4ebbcbe88c42adf6d94e935", - "14cae308ec68bb3438bda9c3caa86cd9fc175bcc437571439172afd703cee89f", - "875e277058dc1f008ff938ab33273796410c23298f8a722ae726fce4463f3bff", - "0f09d2760968264780b3b633821dacad8d45196649b1dfd5b9d842c76b4fba33", - "9c4de184376ee3c4ababd8e989bfa0d1fbfb93c4f30cac5f32270faf3bd724bd", - "c155c96189a32d6f04972032e8a0c6d7335c6a1ac3cc15d4072ba0cb951b10a0", - "d215277e35343eaf51661ac722fe4322cd84f5c24a331ee92fa43db0beae2191", - "503074d05b74cf9c8846383b9fed46b0a8d826f405cfa85c3d961e0ff88519cd", - "e2af99b901c6a74ee84d4d81bc397a90cc5b661854710a679ea813be71b7211e", - "71d1df459061bfe3ab2c96a269bb467f3f5d69f69d0e1e92c53b341d06fc651e", - "19b910b939fc286770861c024fe3052339c98a43a824fe0e1e4a6d4c50f7e213", - "de73ea05646e2d34b5f21b997910c2195699cb00f707ecdcb1fb9efd33826554", - "c63270d882935b1f26f65012e0459a18ecc2495c3346cdf8eecea5e11c501d51", - "3bb91dd27df5283b4d1bb411fd79a4019cc399f6fcb88b77aaec0ba209053003", - "07e8391b1aa84d1324ad66736532f5f7a4782bfa38e5d42df5b9787739520e04", - "5bab72d7247d89370adac0ca909621e51f8a03b22f3261bda3758e90c9d9998c", - "73440dd5b4462b0764cd33bd9ebee34cbbc0dfc7f3dee432681cc629636e6a62", - "085cd6e0b68a79c40ba8fbbe9fbb004ce6c2cf49cae2bc31ca02897c0097e81b", - "5b10241d63d69374a3379c7a6869f30fa6a5eea3abc04d6b766592f671fed487", - "a3e95f840b3ecab93422844fc3e463122cff3a44c027a1b6f63051497e969d80", - "46113430bf099738ce00fd7980f48640abd0a4adfab99f79eb16f8a80ddef716", - "43ebc56c8c2e38ecce30add6ac4e682ae96eba50cc8c1469bbd4eff43515b69c", - "32bdfbd22d92c4605ebb4e0d0a90dc1e66abf4627bd1b64f623a1cbaaa4dc4b9", - "25e215467302429efbd9ea25ecf8859a4f5f5cae75c53c12eef6c6b94d9c3edd", - "2d17410cb135c4ed485b1a04947f5bf0ea6f4f6c2207218ce19a56054c90212f", - "981514332c3aa5a7f302ca3b92817409f6b3f6a91ff14f5e833a019209c0d52a", - "161238a6c9cb783eee369e8a96bd299ebf5aa30dd0b94ec6a197fee8b7df80c9", - "c721fad17bf36fe486ac7d95ebd10dee916611c4d469312322b7185d6b2d555c", - "7d23927aefd715624377de611c9a26ef96cccf2a3db1c851c5efbada19b2e3a2", - "e09a6b43758625bd89e70b260262192901a8e838d9d4cb17c5845191e3e01b51", - "c06e661f4c56e1780789996d7a66de23e670071855651baa9c8de0fe9abc6e52", - "d7c303d23d1b4a1b4558023a66019c80c668aa6bb79262b879f6d0c7cb09fb81", - "f4c2927cd1655613976d864fc632c81d6bddd72cba0398d15094ea9b7b52790f", - "409a5a600439f0003b0ca221240c619952ea0745d922b4a033f69258b6bc592b", - "2798f9877283f94667d0bed4e547b097dbb2131e796a34c4b43c35a7a01cab14", - "09713c38513661ae407b302415024ea3ef807f619e74a730ffefa11edcfba48d", - "fd9509c60490fdfc179e4c5456163dfb734d7b847ff1ca65ac535275c850dbbc", - "564a8f1ee91f6b39f14f1877a07b56118ed48e5b9499edb5296102979da1cc19", - "132a6bfe2d6b175d7f77b964832979fba8a68145180399e5008645cadbdcf485", - "4842421e230f28b1783a69631814bd58acf527ab286855e7df12ab122822ee02", - "4af7bd1b23fecf6467a5bd2155cd5abbf47fe5c8aff43d307f2b8abcef822984", - "a68295077fa1055413730ae71efe57ee5068b787e0c74f95a3f439c32748769a", - "e70cb77462c31d6bcc85d4094a7ab56fcfdcd06d6bca00bea9196dcbf22606aa", - "af57f0e570b86822ba85043e90d9d021ba10bf2e7f6b1d84e8075f2a94ecb7f6", - "bd6b24aa37b34469f83c1c7243f1a3a84ca913aa40d24c2ebc2debb39e953cf2", - "b1c8685b6bffe800f64b513797d9da9415ab2e9b697ac3cff50a61105c5ea980", - "8d16cb140a292778f48a4063eff6270372b9f90624046884534b8162f1ae568e", - "6b22bed1c3d7b5f6aee26af00c1d6ed97fdb429e429988890235a2483bc2a656", - "545b5a0e2f837df26f73c5fd59b040db0193e715a5470c4b26b213ecf933189b", - "47fcebe2b463ae4784f2acaf98c423ab3ad6665cd3af54fceeaae47f6e6461e5", - "83f304cb3e64398941d974288c57b14d1f16395c8296a1183f8253da271a2ea5", - "ebf7ac017af45f06b0ebe01567c70e992d27866dbf6d459d149ffeb45a0c141e", - "e8f44a09d05009bc1fc4cd9bc9268769c064e3cb92b4290457536ee0f2cdfec3", - "ef70da0c0b07a8872024d91b361e6240435b0f860dd74deb904fd08d066ea6b4", - "e388a090d52159676d86b3fab46e4af33542c4344d68c518144e90288b2b2f0a", - "40870221fd45dd2d502cf219248288141ba0ff02a4d07e0bf8dc07ebed7e2c7c", - "e0b751cd2a599f27db2688c4b5575d286d9be3956adb59446101cf00b269b486", - "7bea90fa1c2cf3e138ba5767b7461bc4b41cd9d4dcaf8f606c74930ad21e9c5c", - "9c64ea583cc5f6a285c1ee399431976546a01a5c775c8d15d68669efd99adb43", - "2d9af2db32c105f6b010db53ef4e7b2ebb4adf4c8814a91af6b56396fbe7e91b", - "c2f5aff5c99d4d1bd2063ffdb3bfaf3c650dc1bf5b5c67214d45048171834183", - "8986397615ca8c7ee67d9b97b489c4dfb8b7f14587782bb9c906f8ed535de6a0", - "08ead78eba90a21bfcb1c3eab54e196e30db89a83064e7b2e9a0b78a19dfbf9b", - "3f3412745dcf0ca357b0bfa3ca51a8a0ac30a34544de5a217f4a88844ca366a3", - "1d89c1e1420398457b31fc905f7a839bef2081305af37447de71d7505f3387bc", - "ec52fd3dbf881551122858edf81d250363289758edf8b550df4f5ca9f5376bfd", - "e272bcd2b1423bc12c5ac5ecb9f7ad0f32c55b8b400b14a34f949c2c786da6b1", - "425ea74e97bdea9d0d0b9897c0d2db9457d9d0c3f203f13ca87be77ac1c317c0", - "9ac430d8aeca065a46e0d9c48ce6fb925cf72b7f2adb65cea2441548325d98aa", - "025013ee7ed6d7b708ed79e7d951c9bb65d43ae3af930965149152890af41ffe", - "51b054bf946908ca7be4b235fa3f73bb5e2a07ab54bf9b63cd13c5f45ee5d76a", - "a6a1eb216c53079ad7062dc5d8aef10e489fe531495f000df487a4e4ba611c08", - "ba3915cab00f81eb0726876fdb3e10a39bba35c1387cf28140253560dd495633", - "572681deba31c58ac2848eae246e9868e980c0df1088feda71a2f339dfffae3e", - "5c1a68158416fb93682f0b7376bff8ba8eb37d2083a221cc1769468854cad32a", - "d7565c84b1397adab4f9dfd58795b5e4d28cda9c98d22d9b4405ce1fa4e6cb69", - "8ff2d70cdcc8195dcd442736f0e06d2fb164b3a71d9c1c39e35665571cb76280", - "5ed00acf84e0e8ebd6955cb45544736830d3a34aa0d4db52ef000bdce24f0c10", - "71e1244b8faff171c24d96c93086c43b824224c01bb067725819058eccf79b0f", - "74839778cc01c476831b34897de2a40c02af5b10e40cc80acbe5934960585f62", - "6a362b0dd72be1d041fdf9258e96e7f579be1eabdfbb1ef133c35dae1a75c14c", - "91065d31ce208dc768c046aed02675305ff6a0783606d1e884426296baa79075", - "697c67a680109f41e8b3bfa2fa14bc14a29b4abe1b08d53051ebd75b9c66effc", - "0af3cebd873a187a8e6b9dbe11596c795e3e1ee1a612763c4877e2b25842b7f2", - "7ee7108926b430dfcfcc5b89cdad754da121548847f1014b8e042ec3effd1e21", - "00d3b8e58763306e2e817f07496fa864c2da1df3cf4ec3afdf148ddda37b1658", - "79229989afff73dbb274d949baa5252a0f453620952b3c3d9bb38d520657d80b", - "240f67ed3416dfbdc4f6bce7afcd3bce7a4e9900bd9e720c9e5a1baeb71a101d", - "19e7d913d75507dbc063d6be64dbfd881b7a56bc07f90748db7af4bf2ad3a100", - "14e73e555a48b1c3e9c5adf20a050bb2705e83e2590c862f44f4c0d2bcb95067", - "fa947e1a9c6af8d9a449c3a054ff8342dd5089d8f50891eab5a33a85a5784a83", - "1d97c27d5bcebb5e6ce2a40e39b6909f6914d6e5c79790beba6b3340f2fcc62b", - "f62ff2c9daa1cfaddde7ccab37380922012a34f87f8bf155040bd48e17cde71b", - "8a90b4d74106421edcd97d77b25e9a384b6b60b6233a8d31e76cc396eed21659", - "550b4927df53975675e29d90b650409bafd17e1f1e51d0a107f035dd79b56542", - "4fdc1664d2583b8c84dae025f0d737025be58c36467aa611d66b21b646c0e09a", - "b283f330eea2e94827fc78a3a69a75dd5c0b50abd8756daaf49d959b4df59896", - "9b3208013f46f2660be9340c9e6228ef3183647e8e7bb3de1b4b0d2fded54c92", - "4202af47a5603dc84c0ec955b3daa47d27661c117724b70c958ccb8e694528bd", - "1ba8c1da02c0c93c0c4129d58aa6a3e0a3fe7940dbea2eb293571c058d6a26e0", - "ea951a0e3e1171b438e8d97f69d76d9d5aaf222a51b4d6a9d486c55d5fdb4ad7", - "6a99d4647f9d1b135bcd6d0e4f8bead36215c5f170af50b38ebb50b8cfe1a007", - "edac742a3e711ad446a0cca45d156d752609de3fcaa60837739ffd56e35e2e40", - "a5d2d6907dda41ca2a95a8f51f9530d09fbfba6d8f41c1372cf7a61f0ef4ac78", - "a086239baac7ebd6cacbb3a3667b7be8d78fe0bb3e549ffb1fddfbdc9f0fdcb0", - "a07de264ecb31e553b3ccfaaf505e6a3c64da07c8db086a8083ea22d37c4cb19", - "4db1fa61ea4120112d8a51537521627f45b57782306d453f8022a15110a1f5d2", - "a982c3f2f31dd82497cff12a97ad150ae1605b6b8eb84773d591cde60abd3133", - "4774c929324cdc14cda9d4d0555590a60401ce3c3c406908a7061614796fbe6d", - "e98aa1546a4d9c82263c5479b2f31dcdffd0a18fca79658b1c622db8fc043131", - "98b9912c6655036f80225246138449535b2736abce6c00f1a412de4aec1b3007", - "3e81386a85abbce8d3206d420be4bb2717c4165c1998d6f7406c9f084cd0780b", - "c7ab28e9610ea8e10fafccfdcd2041e8349fbde0e2fc403c477b0f8e6960165f", - "6c901f095a0f0e87bb16c952d4df24f6f8b928ea4e3257553037056bf2a4162c", - "9f286e67eb0437d60302b70cc37337cea6ce14ae94f6cf35448d6e4eb8dc1274", - "5937c8d90e20b6e5d8e4bb88eff4b318957aaea6e157d5c2f578e25699a9200d", - "9f47fe4afc2845ebdfaa976c1d54d4d04b00b4132c5d081296aff048407d794f", - "c828a09372321aa1f1f83598f503747f7212bb5241cf27c7bae323e31b9fc3a1", - "af24623a93130864d043181a389865034f45ed21e5a8c67568aafeed00eecf62", - "6d4648c8285277c3e68290a9e8771a5942b7b97a5cc45a6e9b6da667c4ce8048", - "edb04bfc2c9de23f0f2164f1f35d22cc3d6b61f7de03d80718332855702e86bb", - "5e8a195def23299c35929af42e3aa3bee33c9981d6daca21082da9420b522862", - "bcc77f0fa1750a036641742f6101044e59086953b33cdaacdcc7345b446c008b", - "123a2d97c4108c7a801df6f4a0cfcc78578c3ab3a58fa4c24957a61afa24636d", - "4ee1bc7279c651b65493cc81d8d7fbccf89aad5aefeae78b8d939312d230fe5e", - "893ea06d366e5be9fdaf8f96f02201c036a7564734d5bed2d5e232a374182dc9", - "17dd9ce77e342061fcefa7bc756d78ba6463dcc52a3dd574f6df834c95ebb24a", - "307cfb13cd7a39cecfef48a91ed50ad3c2998c067e2cb32ab221b172b90000d5", - "647aaab4a3abe01c436ffb3f83a45b51996e210e70c48757911685576a488b43", - "24dfeed2a4e469488b31768f2ccd08c1b1ed9d3947da9749da32aff085e786a3", - "661b7d03caa2909b25c9bad585527f35f2b22076682ec9e66ab397855fb16c9b", - "a3a8f0efcfbec9218dcb4dc1f3635441ffb5392a8231873493ddf6e2e0782e04", - "e195a80f6d4d201cfa8b0f125badd594c3916bf575ad0b96cd74ce6ec4b5ac19", - "648444bd5c05cd0797227d1ec8a2ccf4f5fc2b7a17541e3ee81f982d03354774", - "ce865064e5e52b720870d415aad410828f60d8232fd5fd32a9b8120b75c40311", - "0dc2a098cbbbe846e831ca9a78e43cb454278f1dc99bbfca99fb675de67486c4", - "3a31014ec03a45c75317749c6ead300e75c3abe311390a18724c90898a98b170", - "374f7ed52cfe688e09aa2daa8085cc6546a35129f1829630696365b4815545c3", - "a872e8aa6c397c0b36ca3e96526539eaab7d26b9f88af29f83e93288e84c9462", - "b33307a6b1ff6ef6567ee403347eeee1f25558ba216e3105a076f40f2fff2811", - "1f93d6f478d7e3b870815f2b5a80731b2315955d2e71df2e3e4b9a0e7b036b32", - "9a3da50a8ab3458fd88fdced86c2535291f31260f441ce303ee3f7da6e62bfe3", - "4003dcbcd2a6d9c7c06836c9a00128fbc48479edde5e40b166cca8b3ed104ad0", - "34b1859ff5ce01ac33ceeb5edb7568016d06c9641a3ba9ecb31df667fc03ea6e", - "2c0805c09637b52620830ca847d27b5ae65efb50419426f2f5007f73c0ee7f0b", - "f4c2ae52197675d73729248205c04ac076d5392f4402c7e60b6cc27a34bc93f3", - "73e2e815d3319d1596ebb2cd939c1c00570e2736405aac24ea5651aa4c84330c", - "c53d7d069d7cb11188997366dba2ee0df7d563165596f109694a5af9b8107d74", - "4e8de0b0a820dbc4fa1a81c7799048b39597ab979131cca585e2b8837418aab8", - "e4ef421b65f4ceec94851fd93504e064bb173c35d0f0009195dd3cb1d56582dd", - "8e65c61c769a354e6b592b18a567f89efee7d5c0bf844f5f1012d05bf3ad82b0", - "d77cd4f3ac5c005a4e65439af3fc563f9ade39027c62fe740b45ab2d1568c779", - "9b1c43780af0744f89ca6fa2f8b5505e5ae0892805ebc4ed1ba189d674ea3279", - "df8ace377d1e409852bd0bf90fc0fe871f17c6f120e3523727c615fba9ef2d5d", - "4c2b509105f756f1c1ba68d3483cfac44781d14ca2e77420b7d4e01d1b4855d3", - "8d30cfc6002ad4e24549c53cfc32c352d6cfcfa1713bd983db99ae112b5e205b", - "a6c32ec893511b8ab649ce8201e5fa6c069259c7e482046b23ce20d0a7fd7062", - "9c3530253a23ccaeed4bec0f76e8168cc15cd5dd67d3eadd59c33da6aebafe8f", - "1d129bdf40920930638f8c5141eb502b09e439c007bafd2cb02702ff34be984d", - "2c58c1060b43b9493db3df8d4803521339608e936c8cad60938a18b63ea56eda", - "58d14adc04b080ea17d139521b8c2124fde7e7671cc3691b6e0a6a30c92673b3", - "1f547681fd6c34f42cf99abdc140ea4fe53ba410ea78091018b4ef20096e5dcc", - "79746098c3c89317c711b3201a380e0ee2185898ed856cde1a08b6b8c64bc082", - "ea82eb56436dd307525df7ff3ffce3fb9df8e4868c71b18406c0ac1e2415d639", - "e0d65098e0cefa6f4fa528daa38086b30002ef31b1fb24e6bf13a19511c1251d", - "1835f5c4b79f2d84d083fdee2031b43c2005d4197c26dd02527f0ab23ca61165", - "3b23c91d67e7d6572faf87ae208478c867f7d7b7575fc3aca05242d526687b87", - "a7fbcca4743cbeb714a8d6247e43594274c231043c12ecfa165509d71e0bb45f", - "288af3921d1903caba221e21043494b885f14aa47100e526d561cf1e808a440b", - "89f7f81053b24ad5e18033750eee6b455d37d7e8a4d8a97e2751c948d2eef62f", - "779da159d267df7c726c62552496d8319abc4547baf284eb0b319de3db8892ad", - "8807dac4f1d053b588039dc5329f29edfcb09cc77a9e10dc4245075ecdb32be3", - "d63fa75c8e805584a13e1eb5c70bc0635478e88eff13ed5989d15a5f25e7576e", - "3fbe5b091fac1aa28a7b7d307d89fe5fbd6e5f3fe902706a2774abd257b21587", - "feaad8228a9f130e35d0cfe1eca655410204d97eab2eb965aed59e26a70553bf", - "3943d5230d34389f76cd85379f5cb18977af517ec1da85c217ae8289b1563cb4", - "28efab69e576db49ec68038c484f336da1d994659b0255e90e76ae36e4e7437e", - "c0af32ac8e6615beef31044742bd89ed7b38e5932c86e3cef41a9250fbf54866", - "567256458303b76757596c7ee5771743489ddb93e774c7c52cb9407dbbc6bcda", - "efd576eb86ae8abe107af1677d7cfa3441f68de9a71fe7e809afa3c30b64016c", - "f14c8f6bb7e8877ba89fae94448a065b3940075420f1ee7f5a4eaaebee754d1b", - "0e3ee45efc8c68af9615a60a850362dbaab10107a492cd81a29976cf33a48bc7", - "13be20b0df6f897da8bfe2d30179438d8b628679ef8a01b6fc212706418e7da4", - "ec48231f2b00f3acd32817cc6ab8e34862ab6b1d37e3335d4a898feed6e27ff5", - "f0a2b5aee636faba8b09a95bced7713e2fdebf7010bedd693db445c4bf027dee", - "1d624b93141d84842eedc0f5d11639edd2ff382b3eb3c9fcdd140350cbd6f030", - "37a8192dc9f903ebf52c6116844b54f29dc23701f0445d720630a5826dc3fa8c", - "e2c3fd8d80ed45fb140ffd0fb5f6e1552a60f80a32223adbdf2680ff672966c7", - "1fcd24935f8c2756d4535136d49b45bfbfb79489c5c8b5b286e3e391798eef85", - "fece90d4d120ad0cc9710450e2cd6bb04b1b3a043bc9e72ca6db759b88826cb2", - "c484a6e13a8331dbb9bc1580e7f6572fd991e504a75f920144457a42c95169c4", - "309d179552cce61b94ed705bb3796bc853767236413a0d273dbd77f1317fa041", - "80bcc0ed33746bdfdf9547b90f73952ad02cc18fceba3a2d8c5af9b6fba923f6", - "b4d8e54b25041245fd9b0dd33a714fae7ff683a0c26342f217939b5232315398", - "fe77397dcdfd323a2d5beae77efecedaaec7b8d735ce2057b04e3b1706c92ed1", - "40ebc5beedb1a68aade6cb55130a34bdcbd111d21cf050e752ee45e25c2aa678", - "60d00c59875c2a8a3d00ecc453adbb32fe11a8608a22730ca3534f919702ff99", - "73d7642522dedb616b3c1c27f0f4de2ce8206960ed8c14dfa45c55dfb100354f", - "35928d50690bc18b840ec37609ce7fff742dd12d50ca715f0f606794acb3ec8a", - "bbdab41225af7732ae12ff0a1def3d7f89fb774fef9c7d719d344048a6536c48", - "f9173d8ba7e20e2648dcb2a877a32b38dfbf3c917aab9856804a7ac0cfbb8795", - "0b1616ed1153ed95bc64188002d170ce46384a3693b35654ecd1b0a1e9c18638", - "bc6a5db49e3343ee6b63a51a001d00614ea65831e70dfd375c83f663fd56b9c5", - "3deeb24a411d16ad93626f492a3ae89cc5868bcef5f923b43f9ff33dc0550b45", - "ee0fc77a69f73c7ab0695129fe5f194887aa18e42d2422d9ad8238516881b5a6", - "cb2702cadf1949119ebfe744c912bc0c15260420d0e01c10e9ce308161c2baba", - "026f7c04756b331a4db104fea6243f1878df8b94a78d80a66fe7d1f4b661ffac", - "c02162533f45b6b4c17c26e57b6e4177851aa5d43c2074540ff0153effec72e9", - "3363e3d5bb5e0c5d43384d905c8d29c5e3b9c73934ba99689d4a01866619baad", - "507299032ff51845608aed48c5de147c21c8e82a45d588fdfc2c2d5408e3a250", - "197296cc2b79ea0bee7aed684fdd9c0518f2a288916387cff71aef5007ff31c3", - "53c6e129c3e80dccbd22c6d93f088e94dc62e3d04102a75683ed9c6251d4139a", - "8c05ab0ab2213a37baa6d3c4139123104e2a634f6ae988f5cdf2f7f02d1a6529", - "04f59ae0eb37539ed4532bf3a54a968a5d15455df7afda5855cc9341e83cc6b6", - "ecf9f3c82f7551fcc327807c03b2ca9d035806406974ba763a281ba5a525c240", - "7ea35b29caf38ffe3215fcefbd71f4fb98a244c6f9bfa7268976aca9b52f1938", - "07d56d8d9b78e1b5ee65bdf259bd09cf44ac83e9ad2319071de33e82abcf09c1", - "796c15911cd0716459868921d6d31b138714b750a12021045925e543abf4eddf", - "53af7b0081cc158b0a79b583a4644958e20af1f8ced2b32518b71f147574dc63", - "edbc9efcc15214b9cd6b8a3ac3871a7afed3bde3dd88aeade021a383129bac84", - "36222234a4d663ff58510d2e6111801ea5d185a23fefa9093441f612e890df64", - "e20ef33753d50086f0e93db3ce844825853fb16e85beeebe3845025093d90c58", - "e2bb670b1d459578e5a6f2dcaeaa3908e73e9042c6c9e73373cc0f1685ec74cf", - "c00123dae80e361f52087c67a34462d4bdde62ef75f4957642ddbedd7eef96d9", - "ef48f58bb452c0beca990e8f3c55e2c8ec621f4f20ae222b4ccccf754d9e4fa2", - "98b72ee49fac5067571c603ef55831d2353984006d592539b4565324b300bd9e", - "86c1506ba1b97913a21596640fb25b7ffa6900cfec195b14286314e43427a8e5", - "c271913970026bdcbfd0d49740787e768cedf9a1cd3c3b2cd2fbb813bbef59a5", - "2e404b3b8f3d13f2235c5bd88c92b8e9f40b9590843e5cf5f67b02c0eb206ff4", - "41fe4b3424de367be4f367f6d7986c63882933911867c8dec7eebf6ccc1afffd", - "4826554b7239ecb790da1c6861006dec5f5fbd8d625b5615787295400d9c2a3c", - "80f8f69d3853aaa9b1bcf8910dce406ed77d80f56fb9c4a755b55b4a8aed99c2", - "6994dab5b7f808a5956bfc681dde93b62cf5b03a5ca0614d406682ac544d18c5", - "db4f304a26682dde2383e7127b845ba0b4d1503287df942f95e9c28bc138c98e", - "d8644de0d128fab7d2e755577c9e34c09df6b2128d2473e8a76822205f930285", - "2f023a2824bd286f4a27cef4213824faf1580cc1579936198ed4f0fa8e5cc7c9", - "d8bd215a29e4762c8ae79970ae35a58e797ef4ace18f6d9232836adba05a48e2", - "00443365b11985e14eab5ea0bdd327e47975fa6539289a9ee6fe7daa211af384", - "1574f6a25eebea336e990767ffedc3ad04bb2e380327ada4cb2c1a225960b9d1", - "fbd462ae0aa3e007d0ca1b250743efe23931df26ab9ad603d59db069014b71cf", - "6a3d00550ffd01fcd08de1865c12ea63df24f1f87b5a306e0813711cb82bb0c0", - "806f33cd5ac26a3cd4cc283737ebd8d76d6a42ef2e62a87f04131952191854cf", - "5d9999122976c560845b5658ab52a14298889a52aed5f52376bb17dbdafb6d30", - "c20f68b7872bba64ca9c7d91e4da2fc425513e8df132ee3d745c29e16840d9fa", - "e79e2ed29a0d0a048c059347101d8eedb24ca263ce5be77f3a7e21cc4f79d1d2", - "22dcd732a627e452fcd49539d50ea818ac2f0e2158ffbf3ed0d1bfc80d70e93c", - "62e2276ee97f7b1e855ef82b210a24685870cc87a4965a304f41f4e9ead1eb6c", - "8139fbdf1ca8ca3dfdec9a9d786d21751aa4675c17b58bff6345cd71c743c492", - "016c5d298fccc06bde245cd29a813f9e7f2cac7ddd6007fb7bf53e8654730e5e", - "abdae52705ed03b1ceec53696e25d6df58da1013baf82ca36a0bf8eede9a1b9f", - "836804629f6cbb07ee986660e2e9b1427d4c5ec7d27be0926cb4eab69ee4a528", - "983e79cc20fd2a886e357b80b06f9a674681984303b56121a8f0db3c4e56a025", - "8cca58dcc3587a68093e61fb777f6be114e192fe912222d57f0258829d543d08", - "671ae210c69e286077330b7f81b88eeca06f39393a195b886d42896f2af82f7b", - "8c0b7648718a0b1f5d3418099a348bfe11492e9130bdac2f0e204e8b7a3850a3", - "ae19d261702afc4a0844160205d43c00eb63e96d067f3e4ac55630098522f62e", - "fcc7b9611c8b63166dfb7a4c4905b49b08dc7c3b7c3f7221e2f239802f91accc", - "a6af1c377be4f2eec885f8e79e82e39fa3424484d7e0f3b2e37ce151e992a18c", - "b9abff0287a9b6de56f9d1aceff60b860bdec3d8d84ae5ca0249ee13885f496a", - "ed14627062150b03b89a7a1663eec2d2f3e511ab6dddaad3f6800b70ebc5935c", - "f05cea350b294448925dad6bbf0841fe6b71e6c9af80e8a853fbe8bd76133e51", - "689b7d326e385f4ec7d8d7a38aa96b24bf9c33fb070e8dea18b36a9bdddf9824", - "9b925eccd7f1b97e40b9355597ddf1de013fa1b0b4b1d8f0be18423a2e5b8faa", - "47f7e2ab5682658e3b31faccb1b3c82a4f3a46da06927fab078771792a5b90a8", - "50a396b631f5b2c03bfde34460d68bcc55c57167b003a129dbd319d57c889b58", - "05feee4560e1410c09b788049bbea2873d8f8d31a3c552de88c2bad4092f5a12", - "3a98d41745e7e6622d4ca3d063410a02b522b8d09f1e4ee2cffa1cafb49e138c", - "210105df5cf42c5cde566fe4882aab74543adbfa60b1594eecff4c43340a121f", - "cbad3f6180422ecfda97a1ffe7c32c033c71d9642a0018a847fdd39ad70c05a3", - "8f00d0007a72a8b6f0078cdf24d26452ce35176ee993af091062ee52ce1af2bf", - "9395e103a96c671fe3345e44f71d3609009d10fcefd0a154cdda5a45b2225e44", - "09695cae001fb51e3ce880dfa978e401163ba7d7544aaf5ccb788e5fae1d2a8f", - "be255a6eec38c33a65d95115548211d823e3d823da84aafd1c5d29045bfa5aba", - "8f484cb0e0981b7cc93c6ab6ffdd3a66fa7b9e4e8845004bb2da57ccfa37a163", - "65e5c60a285caf6310f0dde25b8716c4cfe33189c1c1ba75fa1dc50dcb2b554d", - "cb7a1a47b7bee329f5ea15b3cafd77638b079228d593605c2348770d6b478ede", - "4c12b06806b949d731cd1d7b6e23ed9a06a17718cd07b01a023d55a77009f6dd", - "342fd2dbfc615bf15edf4ee35ebef54a7160c0d464741ec856219b5170797a59", - "dd7a38045a5374a7e29d76ff4e27f4dc41c478031ec953e362455f948641ca03", - "42e83407a9d309b0e2e95c157f079615d9b688ca8c7887d6c3394bb8104812b5", - "8c959d845421d3df74e99941276a61dff619aef5579ab299fae12ca781e30776", - "18dfb9967f6c115a7d8e02e2590a82e640eddeb883dfa3eb0d1d2f1b171c5e9c", - "ec628af4ccf7a6fbabe8fe26ab82b8360a42fe800701785c889d8b042a56af48", - "e0cbd74abf5f61d9d2b3defec88f40dc872da7eed5256cac019b5cb8b342cb11", - "58e8488b6eb6c4804743fccbcc12dd470cdcfe6ff8ac2711828d68d5cf737d52", - "bb0dbdfacf13615caeb766598e9bf53d679220aa63418f14577fff736e393b39", - "3464c37340a496aa8b9da9b2c96c58c999182e286a9590e18bd8aa3bc5a34201", - "fa22abc46bee2f9776c3a39d03333ffdcfa809bc60ce8e2789c577f597095206", - "9826b714e9b043e4383a78e4062f916aa48930a97f44854721bc247d7641a874", - "b7ff3ad00449e9202784d5e891cd9a5895c74ed5f8b22cc65ded12157a186cc3", - "5441214b1b72ae56a0463c5bbd12cccb90e07342e861f804e1efad3287767b50", - "0a84da44e7e7a9934e44e0a626c23a79cfb57f199796b100e7155db9677d71cc", - "92428bc34c07b602198c3a5b3ca0cb999fc86cdf67cc6611ab28291dc36d1580", - "d15633b0d8ab6e19d42e8afef3a82a230aab93d03e5f82872262d5ad59d8a4e1", - "1072185895fa0a30a9d2ef772ce68289e3e115cb292dd3959a812863d63d44b7", - "2bd4e92cab0ea0227c6364394b24fa41d4d9fb5d6ad6862507226ca3d8c43050", - "a0a779b64820c9af00cbc5f0be81c5db7651f294752da42a36c0f0079f962c6b", - "44bb0404696f23b3c53feb88d7121e974a7363f34866438b28c4ebfd9d876f16", - "a9ea6acb53f67ab9ef1133209eeda52a7a379546bccabfa7579f4b2ebe6c38ee", - "e2ede5103064755604a2abbbd4a9e7791ffce15a4f887426da0036493e310a70", - "cd8386b75ab4982532305c332c1fa3753863a3663569b117bbba825c4293c0bb", - "8960eacbe8cb6b8eac6d90e92bb975d68fad5711bbc905f3e8c73158d9845908", - "edbd2b3882c4e08eb28c80582c36ee7a166147831d9bc6ee0ddd545ed100bfa3", - "cb7b721b8e33fb2cd76eb7aa419c413aeea2f4c5691303ad5cf6517482d24415", - "cb6c40bf450d597307cfec6e072c7fdf2d06f74f68b8a7b21185e75a603305c7", - "ca2910c2428b58133882b3f597bd2cb9fef186d017e9f4eb7de6c35f68644459", - "22fb63e1c0be3416b9468497a158c120b84904d9bed725bf2d0bcbf39e0e37e5", - "ff7621d34d998376820da1eb8eaeff3770af6c35d39619a4a3e5034c00335614", - "ce8b2648edd5843579bce7ec4bc15b4303ab5f1f2193433a3364ca0bc47cb52b", - "0055efaf2065e9c18b3106660729ad69be6b9cf3f33370188120610c833ee2be", - "7c1d6f1658020492ba8f21c0480972c94d9cdcfb37747855356df35b361bedfe", - "40514d1453ebb53cd8d0ce68c37202a161d33e8c9f19799aeb0546bb64e9af85", - "941633d5601413ac5d98c75e082eb531cc3a6414b263e1e6bc793e2c483ec27b", - "3fda70060cce5742a5dd4557c47ef8de16a00fb5004f108a8bb7b95c73c7d6a6", - "4ce5dc68cf967e5ab1b9db701e8dc1771ec2c5bd760f1f11235efd143b49f592", - "f0dd75732e6335473b20c8345bad9b1dd546a29bb8b00bcb052f5b26e29ef287", - "9957c266e53b9aec2528d4f0e8371922bfa80db81524103c0da39794b5d65275", - "eb501845af23c5fe021032c94778fe9da58ba5ff007734ea657c807f385bda4e", - "c9ec1df8777590544218614896ef77b6d8e50fc8bf335ab3d5efee23623e4d4f", - "1206c1e834c1e8c3567f0e60ac8df27f8f64f2d4d6c3eaca6a5a4c0a9c0f9f9b", - "d01bbb9d5e359f029ef651cf8e7cfba9c4924cae3029f812fcf01da41ae1b6bb", - "86cef74fd6d73858d954c5c7922c15070c9ae07b737a13c18156663906d7fc6f", - "2019a8af038ec8dcbb9059a69ee4608cc288bbd5452fde58cc7b9dfe127f02a3", - "298c651c56dad3b52038264bc363cb4b76eca54d72ea8a2104a56ab1b9431311", - "c82c3b8389cc17c0c10131ee8739e7be2e236ba1801913be772d31bfbed6fe13", - "8a42a82764002080e67741490e5db12a2103dd7f888b762944cf07d1fac195ca", - "8cbb19317581b7cbb807de357145b3f3b83b7a756c511de98af78bf7e6f97493", - "ef94b4f50d518add5b6afaef455a158efb305644494f1da0b79a84f26b4d1bc7", - "619e4eb29e11ec1bb92c52909e3b3b74da1a67c3fc574e32f6aea749a07cdd48", - "cfc1030d1e5e4f60997a0b82fdbad4002656b322e911063bc0a78db4047b58a5", - "3fd8b08856676d352ca05f9ac56102f31a7bd94ffe3b813c2d49ac6948f2ce32", - "cba9ae70a3ce4a9b64afd8ba4a40a17a0dc766fcd034cd3b11e5c344e251995c", - "84cf626e333178825d2e229810e656173bdc0adf981acd5ccf21ec1868b6bc08", - "eb9ae87ad8e9a0d674633d190c1637689e9bc84280e05030f6664808680589a6", - "8ab6f33676e25a69559934b7a70cf311de604469d279c3b89bcc6e0861f903ae", - "f0c950f75298f960e044df22c0e40497299d941dcbc4cc7d9b4f9fa3947035b5", - "4e5ff91989080353d69d286b47c9b1c5b3eb3164a2a8100e6767f30738324071", - "550129601300c5bfa138be4cf4ca9d59e0f98b36808b9b86d00821ef2584f8ea", - "776216b9a1d510a04fc033b7ba7238e15e386f8114336ab61efb6259592f2f21", - "76f343529c482fc36f0b8376a5c28e70e484b73754c4657416a419ce7f8d588a", - "4ca91ad7fcfef15c817cef6877a7370b93b7a4ee312dbfc67ea759d6fe06f7a7", - "8b8b0a2c05dc75f9059bb2d4f6e67641c05ad572903b2f06fdebaad59ae081aa", - "9f2e3e36df864aac35ac079107ac451bdd47ff925ba4c2b19e344587ad0ea065", - "634c64d13dca020ca09545a81c8a2028b1270eb4204a350b78ed26e87475ea32", - "3c00354aa3f231e94d11f6f4cd4378a4b1fdf0e777d7df4c0992b1f284b2d77e", - "0faa4243d92014143a5b326b5d3fba742464232de67f2a569eee44abcac63d4b", - "079cb684ad8810b656199adef0e772ab4057d1b2ac24477ae0da3c9e80893d60", - "3683693d887c01c09add520e8b1cebef330ff775618b1919fe551070277b5bf1", - "92d1e76ec4be32c28adb40b0372b72d2b3da340f1b2bd65fdfaba2401902d286", - "e92448dc9b4bdfb99a6f3af8f5669382774b7efd5d8ccb35ecbdb87b08422e7f", - "3803d28c6bf4a0757899ab0576897719597a92bf56bfc53b07e1618593184766", - "95afbc5db928cb0ca71258797dec7190e48973dc83f974f3ea05525a11bc746a", - "7c10084dae93e72fb223ca0f37d758a440ac4ca074af5c3d7415bf4cb86ad617", - "7b0f2c707113ddbd9437be2eb7d3cac831c66a31151177ebc04b91753f036391", - "df264137c99e3f787e3fb73922afcf55609e2e5de29c1425d7167c858df725df", - "db3ddd6d2941ab48588518cbfd1a1272a9baddfdd04e5f28fd14e9c3bd30aa89", - "3062e2a3dc3e22977fd9ca9551931f3e2832a989761466587f261bda402017ab", - "e51d64ec3b872c81396efda40dcbe9e250d166dd73973e99671c9c832cd21918", - "10745dc139eca7394dd84ccf743f024a97d9378f7b7cbfd2671f89ecbd9874c1", - "5c62b3b0f86fee6a21dd43b13ae8a48bd9b95e101ce99ea52ca9401180e3b1e4", - "e83fe5a6eebd2ee2cbbd79c07e8dc893291fac1b18121d0cf423af14579c1479", - "42be424555788477d90b8c5c5cb5e99c9c934031c6bb201611b7f59956fa3602", - "4f13e398764dc6c63c889ff871cd144dc3850067358a9147ab49b0c31d939c43", - "d8f870d1fea82da702bf3a7146aad97b7759bcef4c23194bc26c36962db01b7b", - "bae3f7298aed3fd8b80df5a2e0da83800fc4f1ee7290971b9cc22d269e9dd777", - "fa116e062373a06961fd440005b816f95bfa1e7bdad2167d4d5d8092e7df4a8b", - "7339c608231128fd254f010921554230e9008dfbc5a9d07d6c0e4401f57cf9a0", - "ba704dd336123faef9cb28cd80aff4fc1fca93dcad27e3ed81ccfac31a8a892d", - "6306ffdd4d5f021a2bfc1075bf108c2dbe733a4f5c44f6a5b2e23da7b12e737f", - "5f1114afcd2acd29407a96ff43c73ab24fee0dcc99ba1e837257174b1690a86e", - "a8d741a03ab378f00368b8fecf89f09b8adc7fe26467bbabbcc6dd02fa60fcfb", - "59127c6a04f3e85a0a1eabd4f0158f50c09533d63958b0a581e14cd369600870", - "62ed45318d125ce3e85b0e2044367cc6b45eb6b08f6e1a712c339b5883029ef5", - "ed4042cd4665966e9dd52ebde93033d298cf6573535ee47084e1eed95ef6f2f4", - "d96e59b16d0e693513e4093d12c8cdc7e66ad8acfb7f0354925725646948bc09", - "a654c4c57d539d451ff5dd0d24b46dd7f8d41a69904eb29d6346d71b4c8bb6fc", - "1792bc96d5d98c3070610c7b1b017bc627d5b2ba5d116d371528bb36d7bca945", - "cbb1afac181442fcac41abbdea040620b83489abfd20093f55c55a06614f67d9", - "89bb2fa0092e4c8b4219ebd66fabf09a4fa3a2f19cbbe700ddda78851f07e6f0", - "7b420bcbe4336880b9978413f6d34a64f9b38c8ac510ccbbe186acc7c6c94b2a", - "9fbe2d949c5678cadd2b7ca8aea7af2618858bef7df286723148514b7ddda886", - "d5b302050bf07b3e6d7e2234c81002431e06681747ce12bb0b9637adcc25954c", - "88d60c6eeadff75660306670eeec9c3d953240a8d64979176bd76c2195c8fe6c", - "914fea3f087c7d42c99da63b586221278113b130635a38cdfa98fdda87bf3da7", - "84ff2bcbd20477dc1ad8b76dfe2588bb8b843af1f58339e69a2c2c1fda7919f3", - "d34a8aac32068dcd9e0fbd138fc0f48cec9e22f1ec80df0284e045fc188235fa", - "06d78c26ff632a7a7837d8cabea3aeb92264fb55e0a1eef5a5fe2b6c75867710", - "8fc80d94e5b97bbe2875beb6fdfb8978bc4fb93c66f4dbfeab368cea4bd71645", - "ffcfc2dff09435f2bf1dbe061cb6bc4b5981495d9dcbf7259035cbc802be9143", - "337be182ee8ca714fe970a855da8de7f16deeb93c8bbf9acc5573d596de99771", - "28a96b2f206c068c256cfe60eb3603dcd51641f59955bbe78b73452f7aefd325", - "1d78531615d8015c52e694691861cc5ef07a88ad7865884e71e1e3d660d0173f", - "b90eaa9549f641b1860073460fbb03338126b10dfb73293d14f5a393244c46d1", - "b25f014895a0e62a37da70918334695537867d18defa5a079efd3ca76ec937ae", - "1c50a29c7d3d79a82f9b85c0a31b1114af21ffe4a5857a1cbcb3187b5efe1fa4", - "adc65fa2773506ccc8ec756045277e9d919598eae9ef2efc56e354cab2e509dd", - "b7a0e6d3aa5e2dc69b11bbf57bd33426e48c76cf438d0051e20e43667bdd6049", - "2b154530afa128f5a80ecd2272ffcbc4b7d81241c8a81b7b8941509a5fba4850", - "3e5f8d984bce28a6f89494d1c178536db9ce7004b226bb9fb9955d39ec6479fc", - "02a1daefc09e70090ce514314ec4d09671378fd59d5a5d41fd977f898eb9d8f7", - "c36ca6f796c3f115002f8921a9ee9873342699377559c4cf9e5d3682e4065efd", - "6b528a141341e6d279be41c383ac993e00f4b9e4e0d83b31cba6cd13e51cbfde", - "05cb7bce7233353c81bd76a196335b3534b3cec6e4dc913089714f099d911bc3", - "82148f182692c71e0f1d48a8df36102f18ec2ab01172d4e6485b6595bccab163", - "a2c0fc1d5523985702b02f36093fdf9634f8ce01d0814211be92dda6b0c61a84", - "f4d476c01e015e02a9962a90b7fba370e89c11b03a056ee2f1ba0223e9be5334", - "0d62fb73f5b92e231bed1bc3b9eca92e0e2d33ed37ac9936009944352796cc82", - "32655417fce6f3d5e517382d81b0a055a985bc0375be5b6ff39bcb9d53463b85", - "be6f60f0979629312d5204fa82289eff5a895b919f790c87b168eadb854e8dca", - "b2caffd3dfa038f28c545536b62f2fb626acb549f0eba8fa852ce81f56f5bc5e", - "6d601bf33d1d6b1eff5039d040d7bb82469b8d29bb8b67280449ab75cf5068ba", - "273dc6846634385f55c51ef5fef137a886a0958d76c14ebe31a53abcf6aa99ab", - "fd6f41f668d7afbe47e5d576132ffd5ce34197d9e9c0245e95e292a793e0130b", - "4141e178931d2791c89f0c01daa18a4789b63af4c9cd0fd217ee0641ea345a2c", - "56f131b58bd159bbfaaa01d5226e1dc9cb6971cc972f586d5076f41710dd97d8", - "a6c20cab2dfb1642e5d85d637469f9e650a1a255d49296425a38d951d7b16d9e", - "c0454fbf6eae6ce368f8dc90715e5f9de1b0800ed04580c7097e001233b6854b", - "63ee33a2d234c52faaf4c51f13ccd7a2403bc9545220ac691b07941c4687a97b", - "702980b13a0a8b1dfa8742ca08491c4d0991b6d231a953612d9ab14d0e5e775c", - "709b3d8d4898a7ca59d7cc3be655f1bb84acdc98bd7a77bb0c58b26bc9351206", - "617eebd9393ffa3bdc307a23f33b8481087880c342e54551ba041018bdc34aab", - "db4083febb2eaf43a8c3236e1accd1cf563688a035a6c774ca30dfc5b956551a", - "5d01beffd11c41895f3347e8557be0a7be7383ded0be40d44941e53ae4c9b453", - "5ac97c947f25fc3f3b73069f97e55d195a487537762e47c9726286793047e564", - "0902bcdbf74af340d628f27660f1812c87e3692e972a8f7e8e890992fd791e0e", - "9ace293c1b57e075bd6fd4e27fb9da0c9a07e3d5545725383d00e76dedd9077c", - "f2cc7d4a96fd1ba7d25cf4455fa7b768aab61eea28e08775ceb55e1e5f6af77c", - "6274ad7d9a4ac26dd4095690eeef57b67330b8ab1ebbb9b57e18185a29ee65c7", - "1ee535c673666cd0e61d6475f004b56f9f037cbb2283ee6ad234dd2248d3c010", - "737c5c382788cfd61a5954de8a0975cbef58b5962837275bc15d88b3fd2835eb", - "4cd8ef6e74525904f46e044770c1cf98b06290d5295a7d217064750de5d644d4", - "a1ae5596d46d07eb567a640b9d61d6852acf26ad4b397000da0b33e8add1d2e9", - "fe010c1c166a535081631f4c648e6f216e4afed5d404b7ce6e73bc9d056232dc", - "22d796f1a76a6b00c579a79d51b8b8b760549a5a0d3e3b837b321a3ad3923fa7", - "9fa9e54005e6598242eed3f2b44ea615bdde0c69b1320ea466047ce354381b5c", - "68f45919ae75221f2c40a377197b445b9071cbd4f410d852d4e8941f995f5e5c", - "cb6b3a150ab16bd1cede069c65de31d14ba7aae52cfdacc82f47e6a082de1bd8", - "1f9342ef2d58de1f85642820a68e3059aaed237f0b2182dae49b66211b5db841", - "d57ccf32e8a34887f503f50f861e414155929fa47459b548569c666d30031cd2", - "d89d89ea2b6fc8adffa6c34595f720f281b87603c10f0a90bb1c52099c0057e9", - "211ac2c4f3bae6bed2db93d9bdbf6cabec87c30d106dc81d675b4b1869a99242", - "793d0f1597d16d9d0c581d0c8b44f196e2412f29c5a7574abcbf020c4b666905", - "f9db97b8ea7aa552f2663f4bf738d3a009a71aa6276b0fa47ff34d9cc825bf8a", - "f6005df32500e090ffb923860f9d48d6efaed804455226eda4a68b4fd980f6eb", - "1fa0b5b9a3aea29433db85b7553d43afb22ec2311a0816e8bc91d0126daee457", - "8d3440509d345113853e7c394f7b9e1f3bf2f1995b4eb4a09f06bf47190e413b", - "f7e814a0b78192b6df8b0d497f61740ace3fe8a4b608f99b3cc1dcd83b371a61", - "d9a33cbc59b243957a67989b1cfc588503bfa024619fa3e36cb8361fa53955ed", - "d032d2121b58ad08d5a8ec7514116bbdd333c69bc44bd4bd7dd0ae8b4e4e27a2", - "4a8cf7154f2f053fe85e77aa4eb4250a33d1a0b8c6e28e418b8e1e7f32ae51f3", - "49244324f1706aa03d501b6fd97596b9f4a6b546f0535301bc975e51249f8f0d", - "20f356421424e331f863216bd3014098318e4d9116e8e1b8251b03647003cacb", - "8d1a1e43a86d9e0e29935a531c8c2b3d00eb7b763c5fd0975f78ad9eef096df3", - "51be7bdac6f4ed714e447c3b6d3681bea091942b1bdeead3898aab37ce88d180", - "4958cd374f6ba6f1abe35f7a24550d2672e81c154924c8e5c916b0ea26809079", - "56b4a1bcc109aad1c433cc023a799c0bd42f5945c9076fa771f38b253fab71d7", - "0173d973d2a9fc9bfd703c21fa417d58500cfc95e4c75a8cd18fa8b5c0faac3c", - "d3d3ae6ad4cd58c08c8ec5fd90854b05af5c70eba586778509249c4321bc1699", - "00aa8935faf8d8ed3eeba56b23d651da06194fa6eb1a7c498782d20f085852cf", - "0e9bd9be2af4236214f5a6622930f4d520a15086dedbd6dcae2cb1aeed595ee5", - "c8774305163f8d0ca2fd3ebf888c1f5e4954a09a198ffb1596126b539575425e", - "4b1aa882ef9f8db22279db5d86ecd36b27854dd2d830c4b99a50ffde4af3a25b", - "ee957a9f5d8c5c11c30e375e48bde34b2ff4f36cfcf374175846eddb3de83718", - "ed63a1816fbd5b30cc15e0fe2f318d301e040b4ceb79d3a135026ca947fc0fc9", - "19021a5a94f4d4f5a796ccbc47afd863c513a2c45230864cbace20d40c29496c", - "cd228facbcdd84346ad591b3ff81c8d956c94b1eb44b6d2a0373686d1871ba27", - "0e885d78da95f027852a0835fa2eed76f9aaae2eace7a993bf982b0bd2c792c1", - "1d20696fd486bbc96484464b050f22fbbcad582a0e7980251d39fdfaaec50daf", - "03302a412e8b55486fff9caa77ea2c757ae7c0c940e12645c7dfca0ae414c9d3", - "e5819c572e48c59fb594d393185537d78753193a68ab6173231b1e711b9d3a28", - "7074a137b4485bd3fbf6c90df1f7a9ad9991122f980075bcc05fb83a3f4affcb", - "10ee0564c6744271a5be846bd097c1909c57b86ffaf7a87ff660bbba241cf55f", - "e68951bf91303f2d2b86021e9fb59b86f26ae52340f357f39fe74457aaec4b68", - "7a5a54f999bde690e1c600fe1817685cc16cf4545f588d11740a9735ec51b9cf", - "c21b7c55a4321fec7e9b5b8d62c65ffe09eef07c21ce56c1f8b24ee9d3d0eb48", - "bcfa4394e7b1d5e438c43928acf0b517a7c15487a5b3667f14ccfdc45bbfb0d0", - "97a6dfd4b1132a6a13459b8dcf630c5da64c47c619e1bda7622297059d0d8d1a", - "9a9901ecdab01737f4d97650f5511f831bc038128e6853b9b1b2ced259e0e27e", - "82f3eeb53f5bceb0b41159bd9312ef766ebb87678aa558429ef64934664220e8", - "42689139bf2c4283c509e7256f177dc40440c689d22ff27c6082c0144b6d1ca5", - "00e80ab4177d99ec8831a448d9f002e50969a341d3efbb19e663f1bd91a9a2f1", - "b19ec43bda8f28ab0955a02fc7315d3d9de622b3d3d0e5e6c6153760288caa7d", - "36f628c682c32c032adac7168d38f443edcc38b7391638863c381166feb4f5d3", - "bbea96414f09da4abcfc017f1d863fadda670f02315faa63bc2fcb6619b0c6d5", - "3ffe1019430a7af6f460873b6a1e19fee129d5b21f1388c529994e853098d31e", - "68cd2d5f46d14b3d0feb047b6d2cf06d98ca4439e5ab9c2813dff724618cbe0a", - "8e1fd85f556412e058cf09b4daa0687782de7bb99f2f1a47b7c9f160da68d5cc", - "10e211a962b00ea368373bf454bdee9e87450b36bd309797dc28f34d7ee288c4", - "7cd849743c35dadc52373cd31e45e240b96fbc4071ed0581c01b78b108cea385", - "2c33554c66fbe6a4079c2559a663f4eadea83c0c9452f940f483fa540934a15a", - "2f031ce5fd7eaf1fc49e2b724ccb9c8bedef5af3b8aa5c7720cf40370dc8f58c", - "c8b53ce24b57eb931a9c2bb1773befb6dc7c88d486a855b429902f1b56c83113", - "06fd80eea2b00e8d11474f319bba120d18d4b335f7a77c1093b14b680a59b8fe", - "d38ce16f01dfd3193313416f6840d2764abda410925c073bde3a02d0f7815717", - "3c79d0f1e6769e44c228e91e356df78a3988009ac14556cf67c5b239ad70a039", - "39b6c038f84058821a8e2393d2f5c0e732839963d9788b51f2c21f1b3402cea0", - "9393b969c26b29943299f0bf88bbe7371c55d5058d35e8f80cb9b2999c4b4c12", - "201b7a129d512e16fed68a6cc6ee61eee490b026597d75471580e243067b6af3", - "aa5c76b263cabd30215290ccba16585fca322f20f897d911261a2bcdc95e6d4b", - "d563784d66f6808cc9ccd404103371ebe61c099d3bce0697759e1b0b9fd9a817", - "d78328bbb2ad18438c198ca57947c5ccda613e00828882cfa5c08d8879e792a5", - "26725d755365bfb3447567c47f5dd5e25b22c0dbca40b8768c41de76b2ae91a9", - "23fd3c26c568597aa38ba9d2008c6b354ecc957dbd47a6dff979b45401407d4d", - "30f2d1529312521b1d91fbbaf8b960584a5ec817c4e501619a47c45f831d56eb", - "1fc246466ec5e3fe5b5c539cddc8096f7ec6a87c9e29bde4be726946ce2d5546", - "f4b7a7ff1c74c79d983e10b603fd27b63ff6f8da8f9da5b95b6604d2ad4805e5", - "7b95d8632d938c3b2bedaa7fd9670677093b77b3422291fa5082067f193ee18b", - "3ea6d13e9fe05eecfc5515e5de030478ec7666ee8a4e3dee0378e4a3b7353298", - "c38654beb17ee6c16d92dcf3906f07bc8a06a31b23c0a63e5a618783458842f2", - "92a106a2b6e739dbfde1de0e18a49a295f1e1ca80d14ede474ad046012c7f77c", - "cb7c73c1aefd6dad4d64a1ed0ea876b2f147563f4cf974c039945711f959713c", - "44ac6ae7bbd80e8c0d7f7f4988fc4cb45e31f6c8e5b4ec28ae2d6a54d60922e3", - "cd284254e3d7fed355d24c662385940611252deed31d3146beaab3df22c7b323", - "0429763c8ea7308cbc5f0fcda840dcdd23877a278e47be62ca0e672b4d977338", - "806297f83e92c4f97bfd4104a9453ed158b631775a3fc50932a7c5a54f19b882", - "337936077496dcb5308e444d5b9f2ab821d73fadde026c0dbb6ed0e31ffe1bc5", - "f78e31c7a39437bc34dfcf6caec7e99a7349f2a550b032944faf93e63fef6062", - "121f8a2892e2633dc87e3a12c819810acfe2ef6f2741505b493980976f70d012", - "5e7bd6a41d0122112ca2e17b83cf6b195863466a29ff01fda8d9523c371e75c1", - "2b652c62cdd8f7f238e3506c99bd115a3c8ca1aafe349b7d5e334803790a1585", - "466c95b9715b95a9eccf40fc8f97e9a23e0c0a6c177b3d74f58e53f38d7d1db0", - "4ca3d21210ff26f94b1293de7fcb491a43897ee19ff984dc2eff71a347aa39bb", - "244ad4264fd73778f83f8231b4c53f235572419164665fa46bbf7a959e25b619", - "92e3f5d47fdb6f8145405f8c21b51176b13adf5c387ad808b3159fcc6172fe5f", - "86c15aafa6de1c5c815bf23bb0b280768255fd559f4ff8517ea7ef60bc88c85e", - "0de218b5f9aa4ce5900eb1c50f33e432c0ebf6129c72a3b7dda92df1238b6b8d", - "72fec179fc05484cfd367e94cf17a0b89683e3b87cae8ed116588a5ebd740b95", - "077edb698e0d53b7b70e7f8d30e61e05cbaceb13e10831a96bbb6f5be298f384", - "1a92ec3119344081a6d393e6760a753498d8ad8b50c0012295138dd5a39cb18e", - "048091da6a0a9cab3c4ccbae0a9e8c7863f3aeb9fcedae76497df808aa0a25b9", - "3b403e5d77ed0abeaf160e621eb57c4ac6f0d24f9435b8aabde82a9db76ff0e2", - "41d8219c1ecd503507aa81ebf4c9f74ef68312f584875fd9e10b4ea972811793", - "605c8fb0b811d0b172984a48c97fc7d432f7f7f35b26187e6a84f8f2925df3ed", - "82ae5e61edabeb706b42fd3b28773ca17b57c0bcdd8a98defcfb01773e4c39d3", - "cb976e59983d76a997c46a6ed3e339ada8706d73f2c1416977e2e8cb08315f4e", - "d9ffe0c3bf640a223d6a95e4b2918d9ff6243642fdbd70e77f19751544b4d8fc", - "8f58c52d3d259d5fbf3f63534273505067fe69da9631c677747c0f8cec4c48bb", - "f287cf52fdeb0901ccb0331ed2e1b34a7441691fc714a8bb43c6c744ff4566e9", - "87b6d2a2047a1e4108e26804e54e9d02a8a088245b26f90b711ad495189dd298", - "4262b41886bb07d8f7738b6efdf752daa6ff3ad8552a366775d451b795592f53", - "ba36002c112a0faea050136da900d340f28346f2f16800a68b86593805d7b13e", - "64f3436244597a25e9b6e51cfdfa36beafcb4862902f5fbc2c2db512b9b4be4c", - "40c893ee63f25df6f5420b1492c06bf99909a382883e4031c9eb493534006ca5", - "a8a90fec3e9b61f8f4514ff846d35059de8966dbd3d98ef1a050a96dc23342d2", - "01ef40e8290e09a1b32e4fe37332d6dac9c59afd5e1124d68fd7a4d77d517e65", - "a97de2561b151bfac80a8ea6fd9b7cf7535631dc2d20a6b1e37e4d39b7686db4", - "aba7bd0395e7ad5a7e9b2ca73514a9feeda4efc756b05666bedf8c7f417a9988", - "b643feed714f3b9eb1257519350021f535b91d9dea1c63901b5719d7bbf3ef91", - "aa4c073ee544be31f607b406c694c5bf92593d260e79b9d328a166dbbced90da", - "945d46f60d14dee2aca486bce494cbaa37d87c491b8652c2a78b9d87e7d7bbb8", - "aa127343474732ac8fcfaaab27f718eb8643a9be409301fc384197286d5e8350", - "da8ef0c6f197df89d52206d7182005cd796b729fff90590b514c8f2f0a8bcab6", - "bd10891c1f9a3ea5ef0279f53b73204ebd1e926479ca9c6bf4fbcb38b1ecfd63", - "0adae82dfcd4f6b240654c53ec5f59b224bb826e19b4b465e765ef79872b3f71", - "38bb5f5b5f58974d1be576098457fa711bc9d5af3bd4a4c245b173b6f7b95e9a", - "6200d0b7bb43dae8ca95cf073ea009044ef11481681e0e8b808f7c4a45718004", - "06b9f0f2114ebba242c428ac0d72d3168f84c3a07591cbaee8de3d8c69e15ff1", - "395a57c3f7909e5e0f22a021ccfabca09cb17192a863c03124a7b6d2fbb1f53c", - "f6c23a6e5aaa8224d0b888975b2ee2692e3bad6c0f3bb67780e653ba17481239", - "70366b4363f8fa7390188f536b8f9ae4a9cc1e050981dfe874ca8fcb17b672b0", - "cf8cee020337ec1a75451123d73585404d37a9a06477f4e7a541574214fc1ce4", - "09c2b35bc09923119240e6c53e0d0c475533b73926e4089e125dbce915e58e3f", - "b8bbaa6a32e48eab6a93330f3178d7af8eee359bb17c3cdb25603abd423a121e", - "ae4ad2a307da79b3f50e9171930ecc3b00cbc33f3c6e7c3da8d33cbff7863df8", - "0334f55bbd2904c48888e2d1b78d3bd73d11d3bb664ea966792984b30fcdf35d", - "5475dea5277ff90cf8e98e49c35d71209b68285db32ab617ae237444e31fb2bb", - "b9b04243569b0a8eebcf68339adf65f038ed1852e92f1da87239b2f572613b8f", - "10f32ff7d9579ce159a3a03f0f8bf2219c44f2259b5f6f58afe190ed058f8253", - "c02da99ab28ec0da14376ce8eb12f021212f6c7751f41258968563c7e4c9bd0f", - "e6bda2dff1a9434c1a7e2fd9a8af567345e89c043e7fb6adee0b9a183f580c15", - "9fe379c0206f69db556044dc8e7c311951059497895fe6aa760731c0ffeae433", - "312c60dcd86475e24eba7a68dae8be3b963aae539b89f36f94b23e6268e7e49e", - "0da7118830753edf5e5d50a8ee5677483b72eb2d1f06c66b453ea97c5e179ff2", - "0b6af56806fe52bb9506a41144b85984459ba0031c6e40344701b98d5af41479", - "ab7a599decdf2776ad28b00ca784feaa665d0f4d5b866b764ba4d254ac5f89b8", - "0c68f836f83411db2acacd6dd2b5dff98c6a624b64c4d641048688ded5c6d2bb", - "6c7befadf9dd504378656d6bd5108af8576fc01e3a5ad2973c14048e4d9a7d40", - "0473ffb7e421cd19a4256a4d0a0422a2ad4b87bd980259676dbde4e381601f9a", - "4cefa560248ae1f593156c66e57fd15972105e2319ef4c0872114fcc3f3cbbf9", - "ae572ddff892b24212e057c68edf2551478974fdff703a9c59ae71e0aeeb7add", - "07d3e63281d45d5e4a3e91ae3526ec529610671915802e4559fe3d41af5a187e", - "1f99204e6d3b2928c4bc7eb4a137545a89c3aaf9218a5c732b911492eb7ad625", - "21ad85124ee46a19542519f357c0db14baa7035def8db158f5d143df4c069ca1", - "58e7a53da6a30ad54a1814384f918d0f5324daa3c96ab0162c51637d988e11d6", - "cb14adbb461278d5b3454d1cafb00b34fa5d26dc377af76969f3a35b6b40d6b7", - "2504f777c1abb285ec2e2b5830b169e19558c71d8c26cf1790bfcc9319d600d8", - "73a1bd2076653d886fd070833dab204e6b4c68929c76c5a09efe4e00b4d144ec", - "8bd90ced57b7a955eda7541dafbee32d3e45311f34537f9ff40ef063bc433327", - "28b898650a6d80c2dd858813f99e59f419c4ebb2a57612a5ac09e188d67851c7", - "0da5c6a58c2cc8beac67e15b04adce710a6579a4e9a50db92648e331be1d1cd5", - "0a6a4a184ff79911ccff42e4bf437b7ea0c7ff98569298f4507ad9753ef9c691", - "0fa22bdb362de0d61cb30dc3adeb8acc8797ce8648dc5cdddaf72a2711298801", - "4ca7f40ca76100d750636f8f6d02fffb2658e8ca903e5f6d6e00355649bb4379", - "8793b8e68fa9c618c23cee56415990e2cc3f9d983b5cf2af05817d07943e61ed", - "2f98df61d34102a06cabe2f417b0f2d14b0981d161de10b32151c9bcbcde73ba", - "5b8790167a65c4338612acf6bf3ba2150ec1fc7f03666a3cf14c88560f1a0fff", - "4c8c50a0fc8b12a91d5a1aa86e78b6bc35a1b826b19e365e803dd3261ce1dbdd", - "16c5c48bbc4b9aaad83bc2e83beb4e3f6b67b9a403b5c503070e482a3a0f5ca2", - "4918abaa5df358b414b3f14bf3cf6e8c3c8da95159eb7cfcc7f185a7702e4449", - "8e2b1ec72ea99383f13f400fac94af74a02a64cee9a27d0f5cc038193bf7838e", - "3cbcb83ae9abb2f881e463ff04c2972cf0ed613871a2e36a349fc67885f59c02", - "906aadaea39334426812c49b643341d25f50be2ee1b95dcb45a9b91ecb47f91d", - "6f32b4a9df8cf2121e1acd219f689e0c7a8c0f7cb1247abf0987894e36bfcf88", - "c7331b4fb295c04d001f9b7d454ad1b61d81abe65601371d3d76d625e332e4c4", - "1fdfe598270ca28a6ff020951213600a06d71252917fb10dfcad881d931a2b3c", - "a404a2931dd5117f1527867a498b1c79194662c7e977ea55cf28cd621670d22d", - "aea7a9ea2dec5e662f6117834b6dda6102b794bf7af77625386a61d76b64835c", - "5e235de3a0fe496d285aae9e76702b7fbd93a8a70da0f617e11cafdcfbb81e29", - "31a48329da3481bdb7706c0b54655b74fed1d4b58858341ec063b0aca241cb65", - "b5f435396222470252aa7deb7b849fe01b8beae7495a9ef36ca3595b12beb0b3", - "5dd2534d87d385afd1b48eb76ffa5dedc99f58a5bd46a37a855406e2b7180eb3", - "c9e0c03cb562bcd5f1ed03d6faed5f27828549409135efe719521903fb044251", - "1a7ccd0ff8903f98ff29f6b163e0401c1957002493a7111c14dd7ecc56e92041", - "f391284a863bd28a7aeeef78170f727a63a8f41665590594cb130bad4b901393", - "8e58a1013e263299ea7b31a13c1acb2c29f0bdbbd674031b06be70bf0a1b673a", - "7c933e27a81ff673fa343ba7a9c21891043240e4bfb0d4c69887251813199233", - "9ba4575f26c90db45cc03d62a5d5be912923639537305b559afb3007e4d6f0c5", - "4977a17a46745d73b634734e19187d91c939694ef2e48cd8d10371e37b447b4c", - "c3ef716960de7150b385c8b4eff58edc39ca86876efc0bc0649171f43dd85dd5", - "261bd71a83cf985fcdc15a769c90009262faf07ab47f8b9185d282ab10cf72be", - "1a69897d4358f727bc370c12151167aa4e68900688d4789cec0ae7c434631b68", - "fbc4792e40d9327ba5efd0113cc2d44cb4b746ee9f147bb10294c500fc710730", - "f21a78009db38db4cdf4920ea3472da82b0338cd5ef8e4e8d850ff63648f5a35", - "1204d3c0e524bd38586b13684ee9515b19902775c8c68b752c41484a4bfc62ec", - "2afc246a9dec4ec6cecc8f46a93a6bd760062139ec763b473f7e5e9c2f24abb8", - "6a8e57460600e81ceb674a44a6b7df50fe5e3986d3b04d2919cf6749f12b9263", - "7ea486981776c9bf35d1f4d89ee8a8dfd1c984f9dca70125902c6625c2d6fec4", - "d34f9ba4b471f76f7a963e9778e5bbecf2ba6e66ad1b01d6f7b3c1208cc5ea8f", - "7c585015013631545ad296bdd25fa507058e2a7b790ef4ed17dc5812dc75a8ff", - "19e778d038a9dc50f4eb205c39c6187a0d969c49bd7c8daaccfd5aa0a90d18b6", - "b36df4daf3e9d827102fe1100301450b2ba3cce947786cf11b800071e532d5d6", - "59aa6e16d47629a3ed4e17dca47e32b8683af22bc30c26901097cd48249d8c59", - "bdf2e30cd9dc9c00bf977ecbaa5854b400e4818b42a40edfb6823dba8247647e", - "7a35afba9f6abdf14311b8ac6b9be8e7ba687e051b08e0efb74ed467c8520ff7", - "f801f4c14ac3c1216bf81a19ec632216638540bcbda72844bb3020767811790c", - "f6beb5dea0bed6c2c21605fa914ed9374e046e4d78f30d798b1e10b03314cf4c", - "41545a8c0b68c39e534921af2660d80216aaa8f42b7746ee128d41a00aa03cc9", - "43a55d23ad4db293933f7b0f510a2aa205304fd0173b45b588b559126fad5f59", - "f5d148b12587b23add1b275fd5dc97ecb43e2e8736360700dc784a81046ecdc2", - "acbaafbe1e5b7b400b2614c2ae307187d714633bdac2126f47e572b89efa4f11", - "0ee5e9dbe565a905d077d6243aedd7bbb259d2c8dcf5199d7bac1c0f7760c3b2", - "2bca19a31637bfdc5946315e1a086d942f99fd7dbad0238a381cfb6d19ee888c", - "e703ec5c957d2a73bd0de6611cea55835c5e17857d7311e0f7bd9bdb4626883d", - "95157a1619a060d8ee151ac3bcdd9dca13a236e204ce8cc317b138ee68e97664", - "791503851bea9f96495a5c60a3aa1ab8114f5c2c90e21ca9bd87a4cf624bc454", - "a1968b6cda792ed2a2a60f9e4451ebcb5e67a687531851b083a4d7211403b205", - "0b2a1f2169fe12795a9ea77f018a57daf366a7849693098ba4cf9926d92225b6", - "ac8913100f99e047ce2baeb9f2abfb326bfebba4d28a7a6326eb914e92285184", - "1ab92fa917e4012803ddaa3aa0272443c62d5161ea6987eaefe7fd861ba3e677", - "14812463142a202a8c904ecde8f8be72c1432435afd2e67b79110e2648ff5446", - "cb8349ce6b975e787d1650e9d841b7b42b7346c229562789395ec2264bf10db7", - "1eb939df436769081b2b4f3eb3ca702ee8946f1fa783fd6955e54a51e4684591", - "d48c37647154a00faab74490c43d0782225a25f3f82b205074c8c86d924ade16", - "85259c42dba92983d2b080be3b1791c2cbe71e582af6ce8b921b62bc77e84250", - "dce64400b763a060998770c8f8335de6e2d2609283b0dbec47e2baaf132e88e3", - "868857adb40cfa9418387c9cee5d06c7fd56cb1d9b0ca17a837feb22b3598efc", - "357f5b5f27121a2b00d1b4a6e4213697ddf66f176f7542931935ea605c5bb9ce", - "f09d0bfef0fc1ccfabc190b04c1f225bf33463ba3560e87351bba4425ed38435", - "6b10fcf1a25195317f2fd5fae95c5615d82f74bdba96085bf9968540dd5ce491", - "243a0e2748633d56adbe3afe8ba3f7f13d6aaa2e6db1d8bf2bd773241dc2c46a", - "03530e361211b922e5a8705fa0431ac7062be083f4159e4dbed07a450ca9ca1c", - "8d07fe4c4ae6e56ab6a9b86e75bec7696c39bec46624bce0da7938d11c0611b4", - "eac2fda338a62f67a44cc3241d23e4ebd8e02272409b6d03d4390bed508c6931", - "57231087ce8da9f6640092195e9446832f53a82e2f699a20b4d7e9e33c5cd35d", - "5ae12f9520ee923811881b40b04cbabe20f2d7da26be70b3bf6c119722d01d56", - "6029d6fcb3480435d068fdc671e31f4b54557c4e45e214353aa6f537349a1f2e", - "a4c970eaa1c4069d7bcaf60e63bb76cebd69484dba361efbd3d7ca91f17afbd1", - "d03a5c278b22824023d3010940c4021a0f15d9687f753106994429714d7c806a", - "100e07e2851eb08063ab80793d9afb99f56a76417a9fa8326c84b8b377d67612", - "310a22df0ead69faa9186d0cada80996419528911f1f3e4c9bdf99d2a6bd08cf", - "c64327b746fb19a73cdb8a111193332240dba3daa919fa251e409c8274cdac03", - "c5f8de6b7216cef660593f221d9dbeb5f9efff1c30d8057bdbef7fa1b5b36264", - "794a6e6438ba442ae8e6a4e9785dc1adcd1e6cb1cde7e81b3cf47217f2a74209", - "309f1f76baae85b3410a2018cd56971fdbc68028644b0c60a46f129fd718890e", - "6348dffc6981230da140b3ce99aefb5bf6f2332e5fba78559e8c2225a7f76e92", - "670f0f0a7d304df29c0c4e5d0500e3ee600dd6d4e1c516fdcb824e5d5ebaa7e8", - "ee91d29dcf31c8326747d69d6bb1dda82406f5edcdf3b18b09b82856d2e3e5ce", - "ca5eeb19a48c54690ee77b3105a9b29fef17274a106bbcf819237e32a17a8249", - "cd01bd9ffb70c8b53632a1038e5304a03c42ed3ba39e615e08fb520ef2d01b6e", - "5ba9c00454027c0d62cf0f5f2643d6415d17d49fb91d6e9f9e85d46cba57b9d6", - "7c020350697d923eaa3b4a273f0cc777e171b58a80f1985f206eafe70d8f0da2", - "5284246a9209dcaf086180397dfb7c815cdf9696d893048a3a330a9526938a09", - "7ab36a26246841fd0b55767458164f3baa412cfa3ae150b729169fc5e03932bb", - "1f7523476fa123cba6c17b81cc0b0308bf6ed3228f8a6524414badfc8223c2b7", - "77ddaa118ead5fa87618b92546ddae2ecc8a6cf523d5468ad5b163c3c2a7b0a3", - "cd426e4ae21766aa96935167a1fc1cc3e6ada1adee94be66df0a6e726fbe26ae", - "925f4ce229b31c3b353ab9637706561b511bd7db042a44fcff0e88941a92eae7", - "ab268c77d0d97e84958ec34d88956829923c274a4c62b9ddba243a3b8c8df32e", - "4e00e774b1dbcca09bc620e3e939b94d8acbf097eb4f443cbfdf74f65987cf78", - "29e8d48300a72b1b05c0570524c5c196edaa7f94831f38e87d7f1f5c74a8d4cd", - "0687ea05e7cfd9f4b66d0c6a099e06ff3304915fc11f37b82357aba83eb4564b", - "0082225bf3777a59504dad23788d5964363c7ada43864a930b166008c404ade7", - "d05849a8725cc64bf243427521390c17db80890fcc3d966d8966ad15aeafbf19", - "3a7a743e9a2b5a84cd09446c070cd019b9d302d31c1202001a4955568f1df732", - "7d1189cbc88a02aa4c52a0f91ab12c55cf8b67b0c53e274f3ef645757f70ecd5", - "5779c01a63d63e7c7434b3943666b362832e36e9fcc3b8a62fde31bf5f4f91ea", - "b7c208c1b315513f8f95b488cf09172a82c238d40313d051a45de0341ebd6cbf", - "641c819fa1363414b0e075b431bda9fdb7d253154847e0dc363881b9c811bc01", - "d2aa0f796d4f68ab2f97ef71f5ed7c178cbc910f36c96b0127f04ebd5bd183aa", - "3d1f23e6bdb3f9efb5fc110684871b81a4e69159a1c96bd54fec9f9db2edc1c1", - "716e303f14dc63ef31690bf9939bfb0e7cec9e2ab590d91b5504316263cc4e98", - "6a961307fa8c415ebc500caafc0067078b578d6fbd8838f51e5590be25a3585b", - "073a669918654f399a54b7e059af783213cbed1ae84c8a2a3e182910d60f4bd9", - "3a5a34f4cf0a2841cdddb81dfaccbb24d405af431486c4759507fa4c7c6264f6", - "9c0d2ad83a46b43123d2fbd0ed6f9c99095b750647f1725b1cc09932e6c2e221", - "af96a6a52f175dea3718a00b8c6a4be8c09c38afb002a8923477c0e410cde047", - "1ac5d8cce8473f82f30e9e68004cfab39d9f5b695468aeb3697c76f431d4ca06", - "a0080f3f209f06487b496bf94c84e543a35a6b24be1e9a9b2e596ef33f182931", - "d5718c17a66fe779d877ef73751a6025f55c1af5cedca83a215be0588a7a5590", - "b8a3aa9483b047bd5fdfecb3d1b23a2e5cf57da153e676334c026bc5e48acf27", - "f3fe08cfb82f7ac248300e73c76eac7a895211880ea3b251b39a3ab49bbb1a8d", - "feb8a53f6d2534c6f6db1f0f5aabdbbae1c18fbe303c0401eb660df0e697ce7d", - "0a4c82a7e88849a88062f9ad1ea1cfd03dc9f649c2ae268b9768cbd50431ad7e", - "32e982ec9e7c7fdb5981aa8b517e34e2c2c05ddc570edad9027117167ed91cb7", - "f75339e7556b54fd42ad770717ee0bd623f7cc6c90795a9b7255c4ace598d14e", - "ce3ec949f3b62774621cfd550ac1b981aa683bbf649579818c212dd0421274e3", - "17ca37a86120de91b53a70c413259df0aaa24bc468d2549941762f5c494f2298", - "ae8a120c3d905c2e15a7a2dff188d0aba87d975036a85262aa4799fb6d062dad", - "ec78b73a14155dafafa49b105bda19c247038419dd01c1affe44f66ecaaa769a", - "41a0b8777ac8f442dc14d1910102e2e1e382a722cb010e78f6b226203686851e", - "e31d5975013ed2350d247937753d0822b43b88ff62019f33e2e7e4f525b38ad3", - "7055137692757314c4ec05537bc165bbe803cb427b9f88d18ed46b276e5bd681", - "718bddae55280fa9cb329bbe5edd32872829117f6e0980ea9bda3d8e380d0325", - "21c54847736e0dc1cac0a6e7961b2df94d6f001db9b48ad6f404f7017645991f", - "4482ffcd1591d5894b80af7c1c0b522ea1976027b79d2d620ee26667c4d4f866", - "e2e45efab45d182814ac4570cbe559825a236178c01190c27e8ca5d886425a46", - "1561457ecfbd1b4419895ca3bc37f68cf04918af6b3d36f10942073d77a7d44c", - "60c3d670b048f3693e7e8d0dd410ae1e5b95424a1c898b4becd059ada592d6b8", - "6a48492c56648eca16a55fc52d9af76f57cf4c1773baee6b597f3608db5620fc", - "a5af82902a91cccaf976082267eaa3bd02f936f6d6ad53b75d2b48d2b878a75d", - "d7cbfdadd772ffdd9f7be22490dff41da7b5dfdc4bdb4c91abba4075c27c3f82", - "4eb11d58222d9e975c2d81a52e6ef36fc3112f41dbbd1efefc589702cd3256c6", - "2080b6e65dad8bc6ea37b5b2d908a40ea005827ce4664201a9de1d52bc21d243", - "07b6f526d5eafd6fd0c949c796bb51b34da99e3b5cb4fef1af1a22cf7f6ba0cf", - "b4112ed3d0c2d279f741110177cf80eadc6f34b24a5fa19c35c64c6e34ee4834", - "ae0255c05216af6d447ff255d2607a6dec8ffb03aa7de711f4d9adc89d4334ea", - "adfa5c95a6694156aab2b4b8ec0458ecf15f074e0a95dfc7bd1241055b066ff2", - "0a81884e4d746b303b00414a603f92224310459a5e46b8b7ff77a406e9474b1a", - "3be81f70de3f76602954108395e4a8fd076bb55ab827ff044a895336dcabf359", - "a18c2f63869db05f37a1d6f9444637fbf5d63f4fb5c076d3ce2df37db213496b", - "b9134d279dc8e4ee3421fcec5c0ee5c28a97edf6d92c4803b92da06097bd7548", - "60d6f8f6581d5a997aa0dc1647ec356c09a5f1dc21ef5c118b3bb22611d06fde", - "d9ecbcb6d45d7c7c6899c05e3067bbcb4be37d313cd965e9e3e5142e5a86e7f7", - "2b5a8edb37bc29a8c50bb13f5eab6a2182e9dd27f65642eebdc7692b40fcc857", - "2b929688fbe16c6722a860590d4940e7fe0f878676f8c3a378526eb68bcade2e", - "72c3676259e3ee3ca45b59b3e9c1feefeaf7393d8a7a49e97cd7066cf53da099", - "bc3c4e798907014131389f4c125cd8ab5c8598dedd720cdd7961adc66d45352b", - "ccca65339fce0b8b20ae6329a18942bb04632ff44f558b4bbac9fe553c3b6ba0", - "d90df9e2340817e1094afa13bc3ae66ce1944ffe9d8046fdefb6712b49ab9881", - "8263de4c57391929bcc7e02f2a212d9a99259ceb8a96c25f1267865bf0e9d0db", - "70d49ce9189921c81ff1db7065e08816bc93cb6ad4c7a647c7a5b2ba874c56ba", - "289a787c5107b574a1782c43831bb6ffe50daadc9f6d72b9d72524dfc55251cf", - "17923c413dfe55806268e5490f063585dbf4f06c081b6167413bb9e0fed2d410", - "7246c5685f15b5631bb2477e3f8350c0cd22399428323eee579fcf6eccbbe322", - "08a801d1644030958dc27072fc925097aa54218e63a005366caa01f80b7c0426", - "27888d41da169d391718ec941243bcd935beb61329e9316145ba61bbc9c3bd4c", - "f40dea48b5f2daf87d8c132e30fd91dd3c0576e5586f81b4a357e70a66788487", - "2bc7eddd49ae288302bbbc979097105a2c7c9e6f7644fef102846d6ec7053d78", - "52bfa4d9355094242025762f067717f5a68d91db6917d74dd2ff2d83c9155491", - "287c56c4c6301377354e9332c60b31a729c0fda64c05def7215bb6822426a7f9", - "7a2c3667e100b4db4c54e3193b55f8ca7d0ab111669a5f2641bfc0f3ef4acf47", - "354fd6b3661a6254bc031ff1001e89c03ec0343189bcadb5f0c8eecfca66a1e6", - "f1e94b15468fe40ca8d7633474451dabfbd401a2402127b787d8e9f2681bd3ca", - "70aeea506fc53223b1fabc83eccd28e28ee88417bf7f70d5884690f6b372c62d", - "76ca5b7834566ef5fbb2b6924e2845960b1c39cd376b12a02c1ff5ef7c1b590f", - "44635647ae4958f758e647cd22a90dbbb88443b5246c92a16529613d61a53eb9", - "22760bf6fd68ad676d7933312317b3f2041bd3f6c5188920a930af30c94f5e6d", - "662dc7011d25c3b8442227c9e1945ad5e197bced2bd1c5b94a1b639658813c90", - "6a3b0f8ac7aa776415f0d2e7acb2dd397b795eee406365f3c6c1d8efa4e40bbf", - "a8dee5b7a43c4feebdcb5a2445b1025e1c1cd54881da4442bc5f214cbfd89d5f", - "3d89a4d2d4c79134495495cf1cf04f0de9f7e8f3d0c58bea8e5dea42d089d516", - "51be5473c03bdf6f0c0e16a44220401bf72026e0ba078f0a3b5be67cd854560e", - "f04c952dfae8f7896eaee8d7bdf9c40a76e9143842968d7503a2d5769b51f935", - "99af5f5878d0d049cbfb8de210179eed8908d9b3dce7cd3a318e3d4d62790034", - "53b5968f5d3e3e428c97539620e8c9b33b5e79af006fff3177701e5fda66d7c4", - "3171305df55558aebb2ca4b182344637b9fa7da3020da11989622d1dbbfecfd8", - "b5b6b1c20998e96a096eaf8cea66b65b269dd75fa2c4214bcf1dd8aaa49f0504", - "c8ee9402c2deee035cc5b7982ba8cb5768cfffc65135ce0258aeb79952515ea4", - "e3f796782ec61b680a32dcc14583b9c2562dc3f88346ea9166780ae10456b235", - "3e6d4595754b02a729049ffbcc948cd021cf3f163cdaae8a57106a357207d19d", - "87bcbf0e03f55a0a49c54e7ee381d6b1411860592a564e820a22535f3da08afe", - "72e3a522c0418c72f1051e2905580c7d9634002b5f1370f7d8a5626a97c0e140", - "5a282534d15490e0a1ff5412576a4930cadd8009fde3c452d92846f27e8cf4ab", - "bee2d44df3b69f4358a7bbd1217e62aec16036007857caadffe9cbcc10e57399", - "91fd0921136cdb100867561e000d45d5eaf821e476d81a81d9009d28aa5b71b1", - "2dca60f0264b37d7152b7973f229df10779b836aac2994db5b0ee4a17bb60b0d", - "63a562701089afb0ff83ee244ac7d0ea719aa448b9e131a85d7b60cf6bfc8290", - "b3a36274eb1fbc408a0367056214174ac772325b4a043b158bdd3425ccd17342", - "8668a51ca0b19d5cc1df3cebb7564ddfeefb85e6e09fd4d8cd1eac0d11792e90", - "89b44dac79aa4f6e17b69c22907152a8628e95a6971f233bd315e4f8c2eea57c", - "37bb83f0baac2f172b4c541e378b87225f70c1f8ad17c3b237f97b31b1b6ccd2", - "3e060f09938a9f86d8f5652b0bbc39f33d2ff2ad321cf299ce68fe8b95bb104f", - "15f8080e36b9e4de6b92c492d363d18c3ac71eabd8f90d911d1c426561f7d0f5", - "1168bc3113c01818df7f4af01e89425a7af90fa7a8177599f2be22e4ae6cb4ee", - "1072dedb3cb751510469e284720ee9e0923feaf6862f04bd1f1bdda38b41deb8", - "3c42f839412f434406cdfb201d69dc6c797985b06b9b332eadf9eb20c6a94b1f", - "ed783cb531f011b6ff7f6be628b2a0c4eafe1c61c6ea914a4e062206382245dd", - "ce854749ff69d28088c7e0f7533691b07fcdfa1cf4c71c0c20ccdbcb2e8ae343", - "5daf2b279c6956fbabb4093e220a2c1009367daaeb8b6d5d706795b05e0387f2", - "9757511e371475d0af021d795a5c0feb69feaf3c04631fc5df7b9a307bd7ae3d", - "64910c1c2639bb032d02d001e1465270586a6dd0a6f67a074f1bde17cf0c4dbe", - "5834cef3a3de1a2e75c6bfa41770e26563f55510eafb93e7cad713b95fada8e6", - "6e01e502fc2206972ec32f293bfa7f3655ad31ef97f96cee0388b4dd7e123d60", - "ecc7c02941a40437d3224b4e2a7f1b1221c77b28191c247af4b58938e5f2200c", - "3e672adcff7e7032ccd2803c292371bcf532e2e6ed91bb0701bc2c7d9b5dda17", - "671764bac3e0c9fc7525aa6e7d110ee406023d299d2b3c6a8f07e1058bc6f1b5", - "19da02542a963e3287bab95de5dc4fc9593f843ace43cb2c48a7a2b403d43ac4", - "0fa550222ba1c4a7bc49d769ed27323d9e57357ed0c7ebc9843e7e3c8a7c99c5", - "67545f75a4deb2ec60c9697cab33cd921a2227355dc3f17960c565ced5e02e75", - "7d483fb16f90a801d9f3dad928ac711296294d86558ebda0ce9cce7b7e5a80b1", - "d11d7ea93c54bef68c33476095b88d2b5b8a9f8f47922c8c6c9aa9e6a5c91260", - "1d1a1e7c636ac0368439e03976a925f563532d8433982a01851a80259303ca2a", - "3867c0774833963196a85add247d32839843b5401cf5b9c8350c8548c5906343", - "693eb1c990d2569141e8b22f51cf2c8ab2da963515e630ac915e108870774adc", - "f8b978e7447e876abd9aa6c12229214c49b8cb5c383f1d1e432b5f389b08a8eb", - "efe6bcca01935f13112125cb204611b9d0b65d1e448ea507ae1eb4ed7fc04bd6", - "8c76a3df54603ff8919ddb56a80e0b941086789a9d493970c6cf5e0b44cfd2f5", - "99d69e352810ccd7a12d8b5ac6abcc1978989e9912639cbec1d7d50501217ad0", - "a9f26f5d2b14fa980f8cef563beb6434e8e969cc02a0d951547ef0666634027d", - "ec2062a3f64954e4892780e811bf2dc254079c28153babe30ce950ee9888294e", - "b05b51005fe8ede5afc09f2d2eab8bee017397df2702f8b008457a714fcd3cf9", - "30a23122f6f36434de691eca5de4e731806d0f7f1beb751198f5095eb9678745", - "9e24cd5322daebbf0d67aecf6333bc9f9fbe05538d2065774b042660ff8e538a", - "c536e59d9b23ddadc2c896802c4a10161a9d256553a0bd577665e863cc9ea344", - "d31a91457131a2329a7d1b67a33ca1cce03ec20706c41f67c8ca3680bb00278b", - "83a9f9f7fc2d998ae06e525f632340c23dba74d81e7667ce549584d745e91b6b", - "d436bfbd470fde6be484a2f7832426dca20bc32113af42709e3ae925690e0cfc", - "34c41c6aa8c38eb01f4f3ebd691973e3567addbbfcba30049d05531bef496282", - "666270cb870c970bf904b6436974a7b929c62067e3e28359599de82300a55464", - "3893d29e97dbfe07f6afe0c032322be586ad65c4d063cb38095b5544b386843e", - "c0b146bb7c4918492a01f0322d03c3f547d8c97e4facbb3064f4b8e6f2be941d", - "ba0b48bc329f1dd1879b0c056e9ac2661d6862966b6e8c097d477b611570fded", - "f33431c83f1dca337453a85c9d1bd0b5bee4bd554fea0b6bb4bac1be0c411409", - "1fccb81fdb17874daa6ac2f200a490f4f5993efe6e098067b575174a0fd94b35", - "87263719971888c4b99eb8991650299e73a3dd5acbe647a077025616c09294d3", - "51d7b18c6a4cccfcbc42b6bc9bde5528fe5149ef14ca7c727f75184e78bfccd1", - "e602e3b9e2cb2d73b0d53a20ede33685b679c4ee8409d198675616bf7875fb2a", - "f0e1c6a39de1a843197d44a38daeb4f8f66b572206ad8f0cc73feda4ff7e8d52", - "be8173ee39e56bf93be60e44a6f8991a1e335cc1d8fe995f91bda58400acff33", - "5c7281a0796fc0a0c37db6fc791423ba2e4e86247c894d5a8dd582e0baaf872f", - "3a222fb76b355c72d349db545b5c7371550cc1db9c00817bce9798254298521f", - "64edd9058a0ad965b75acb6d55e64bb3c85fee693ff6e453375d4ff5dae2b89a", - "c6da38d2e9f878ca14796c9d4ba390d4a7e004a62c4fbcc7a6c7c5f1814d35e8", - "eaa807532d9c2dee6a4671302acbc8644b70b9a052a15c13f4eb9fd1e4962b8f", - "e90574ef07920681611ad3cf03347fa3089e2f01010d6366f74b9375a09876c9", - "7869ce9c8f5a15884dff063b151d2c5964892b0263b97c84ccd86bdafacd165b", - "ab4a45c8a150a6fecfd9771b08f87f3452c4d996008a72f001f3b111e4eb078d", - "113276c4e2deecc179bf544823148173459ec27c71a08373f574f2d1895b4089", - "6f3aaa63584f045c5a178abc8d715af09d3ad6250e974fcb6da72055186c6dd4", - "1818acf94e24af624ba88838bcacd240e6f894ef78dafa954779ff029d954920", - "88830c071b8a051aec2924dd6e806e1d3ae4065a9548c4b0334d293e0d691383", - "785a10ad84c935b9672af67e9d7a411c41711368eebfd21c788b2caea94d50f8", - "76a85f19a2d39c33591d254cee314837e3d8404fd464efe8969ca07b6a17a565", - "50c9c763073e8f1502ccffea145be0bfa5b7f136a87b1219a5868ae8a5a67187", - "15e6ef0c3590ccc8778acf329cd41dd80ab173713633303472e674dcd30d4963", - "858eb7e3e7c27d50143db5ada9119c4c88830ff11dfff3386df46fe786119c88", - "8bd554e61a6559126162b882820c94b498c401387ad94a0a4a5d1dc2f925ee87", - "a01f931d897372f9e4c80f80cfd1318d48ce44c2fb570a37fe74af0a947e0d70", - "2481a8fae7dc12e6d939cc8475ccaf5651f6e9216e30fbb25143b146abd9dd56", - "114340fd02408f668e9442792caf1f0e33d94a60af43d725ccc0f3d3134a0630", - "729c67e55dc0c51b1fe798d58754d9b006fd60e3006fe7dd2e1865f8e49a5965", - "123bf1b9d6fdfb74ef3e47af5300065e7b4fcc2ea208349d3f481368f92fc60c", - "a57dd8456489ac85e619b43509b1292639d29362c82d071f387230ba4956b8a0", - "af850f4df85a36a6f675aa6d68cd2cbfe788af048e64b1df069c690b22cab51b", - "2cb560c157a2152d8faf439849848130bb31b7a4de6a5d6a0cdaed6ae88e3c8e", - "e47f3bd4bb8bc119d33d9c0cec550f8f949611780f3b77b2031279e829b383f6", - "39bc2eb32ef4930c1c03b4f66d1823320d6af6998bb77e42cd4c98ce5eb226bc", - "eeaf5476193a7d5900b15986ed9bcc828ba3dcf13e5e8540f26b3e4c9a14625a", - "a48f0b7d0bf438911e168521031aadcb2f1d7049089763cb8e600d4f27c16646", - "f474c930b2225e903b6762177bb558a2ba38fa8641d6a8a05832dae7942f3c73", - "b3949e47c45b50e63da0a83a058b919e81e58fc3ee7e6e38a089ac6715b44d98", - "c62ebe57f06d7f36f6eafcf3562345fcd2991225a7549682826084d089dd81d5", - "3e86e6c5f2240a71d7905c3649357c039e611c1b36859cbe3ab54281be61d853", - "cfb297ee04152bdb8465e878245a9596aeefd5a4f19b4d78e18a3bcb052e627e", - "25880671e2d98b5f17392645bf83bfb3b4239a01d4f112bc67ef23e129f69154", - "14e603920389d15121cc324dd586520e9ad156ed8e4a4c062cf52e39da28891b", - "167497400c7b620bb82c940d8cc4df33d5b28c5f228d18a94c604b276a172874", - "861b4af823b08587218411d749215946b1f5e15634a8634089710120fda58e87", - "c5336d501486b58f89204faea109cb7e1ab1f5dd929ac4ec79db922b082da450", - "8163c5b5cb39e51b68759010a79dbb16b396c3d5a3b509983bf61c5234f995c6", - "aacb7693fbf770cee33fea7bcdf383a2facc91ac0a7c39e714304e3e32f20f6f", - "53579360bbfe2def15119259e7ee9b2be808a6093d7e5fd571354c377d6a23fa", - "2de07f70a79403dce8171fbb27bee5634b8430975ab7a6a136c1f38c5573286a", - "503b4ffbeb596433054f6705791b7c87d8f5b2ba4173999bbfb4d1fedf8e60b4", - "7b097688fdc9760ebe23ff66e1ce3a83cc077610890561159e84ec8dab2e7e45", - "c98cd1db1b6e70ae1f74a730e739b1a5ec11337c4b4630687afe1b2f5d7f2077", - "b464b5f1f68360d58330dc47134cf6f88e481dc784474bb868aec0826f748b5a", - "239e0d066adb9cad5d3431ad06936c44e41b80f31af94d5d1e0ec52220b7ab41", - "53be2e082fe264e519a5b6128e042ffc5f77bf90334601dbc71984e8da1e1363", - "1a5c0e6c6851976567b0327133391018be02bebfbe02c8ac2d4dbb08efb57098", - "2612e5ab765032ff7e91e0fb550abfe4bdec05c7d254c926e90fb8907c0884f3", - "7c9c6b477fb5d086852901bfa09f2d31a17190c3ffed4b16d6477c321370989a", - "5315223703c7101dc98c6c9fb533a2c0cf4cf189c676e2f566fc8a2744f9bfce", - "46d56748226a099939a3561b0acc857f557839978320b91419c479b992a5ed23", - "aa593252e612c51dbdbd50261e8d416088888b1289abd520c625511a781e0544", - "e0aa157323137d3969a8cb700393a0a328ad5520fcae68672165de90788d7b85", - "4f8ac7772b79a788e67bca94e9eb3eae0f20df6f984c3e24e56f2d7ace12f06e", - "3848b2ebde860fa898324144201c0617966cc776aebe77f4a45da92038bf760b", - "69f29919f7077ecdd8c088284f4946f552542dcf77b91ad53faac90e833d31ce", - "de94ad826c03070ba935ee846cdbf0c3fbc7fe4d280e089be13fe0f1caee5bd6", - "efd2ae878487cbf6dab32356129e094d4666c0e3f86f73b9f052f3fc3a57eb35", - "bf94d12690cc0d840772f3a209dc9ea2b4a7c0269ea47687b779707175bd6998", - "b121d32d4c808d3b94d2d528ffe2ee116586045cddaec59e7b695bdca1cc4050", - "8fdab33b0d067aea68e937811d6f52466d01e11301d0587e064e08ec7f64f383", - "185da2d6f9366cd5f23e8cb409efc410c710703978c1ccfbc985d1cddaba2cce", - "9d33121ebc3eff70be23b4d182804e49284b3a899bf9f0a636c9a4b53cd29db5", - "af441473f568c94dcf9834de96bfd168ce72b593108602529e273834165a8359", - "228e87ab09c3947c80a292d59ac2bbba2af71d0215f8f46b51004f014e45d4bb", - "3b09599bd9f5c84ee7a64cd1998cfc72b16a939c84c953b6e25196aff1e7de90", - "e4c303278627ca317e785de87629b871e96cf548f8f6e2af47a0510edb0c0fa4", - "15896efccbf56e9a4cee9d59cd055fc301a11d7a3423fac8b8089284c0bd2ac3", - "3060876963e5c28442ae0c77c432cc4f7b517e0046f99d260cca2eac5207975c", - "1a73527d7a5c4bc76e81f4e010ba3e73ab48bfa5af7c2a63357d902e074b94f2", - "0cdb774c52894401825330ea1945722242088a2da5585b71959d45aea914ac25", - "3c45e02929af60deb0806b6dbb51e35c97617dcb8478df3187df067b178b0572", - "b563650834cb87dcf92fefd2fc91a5965f063380c4dd5c69cf46ba3ed5446afe", - "f939909b87763548a10c281cbe5668b714f5fad083d15a81a14eb42b3f417ba4", - "13d23eaf854c222e0cc37b141e661214e32e49ac34628d016f3c233c93736ef8", - "2d11180c14d9195b7118b428f76d704a3b12bd5f2e4957728b926411b7ba0908", - "1fc4a7b80274c11aa97a1f3b14e966fc55dc1f1b1cba5ed8d1d75862bd39bad7", - "3929f8db2a94e17c4cbe5136e7361d18c4d78e13031cb6a6516cee8cbfc8a0a7", - "5ef286a334e3b75a37b4406e6cdb019a2bf7e7fd22ec411694135aa863b3c024", - "1e7543e9a33ff5480a29a83786563b8ce915c3f66192cf793dd8815da4023046", - "84fd7b4ccd22d13882590a1bc08e57e15233cd3b47251e69abbf34c9b151e5c0", - "94651e24df5f0b994a8704396783faf9eb8cdeb9a9ad792a8b5a607cc53c4b01", - "49af4013c3bd17159e1db5e67745574f671ba436c1c15acbc588c8f303eb9b98", - "bc79ed28cfd0a6becda9319b45426b1e684ad42d4019cdc510cb1ee329ede5fe", - "0064dbd4cecc273ff674975d9c7820da2fd0224cf556d1d265c8bf06cee64f9f", - "7e357bdd3adba23937df97dfbee51083e8af181bff541a80d8e7d4266f65d1f9", - "1f86ed7d971c947f9fe3f4c15ede12b9de05b5a8c5b6d66c9b4257f253cc03aa", - "990f8d11a8c6fc398e470963e71c2b7708f1e55c68330afe92b30477a00e9b7e", - "bd6fdb837d5c4a8e2a9a2bdf7ba0e7cf117d2a25496f05edb6eef67fbd41e07d", - "703d2ba3cd6e42f41599268f4796cfd000a752f5057f0b948ef103de9d067bbe", - "a85ac68724313b3cf562c4aa14b065bc2ff92a70af037a11f53a762a9b7acc10", - "a848cbaa8964cc312573f8e812caee4fa8334b806176e10f6dc298bdf61b8ba2", - "57ea6946dfb43e344c59ec2cf5598190b87c3a5eec353729d1e8eec552f60d44", - "c6c96909451af3e055f699d12d6c453698c1b6604096a80646df15d933f783fd", - "694c0ea4aec7ce911e020023166c486552003ff04dbd09ec966af686facc93c3", - "00bc20a6e706a3593dfdc90d13508a39581a4dc92d2560be59c0b8e4b542689e", - "d0a31b305dedbed48e39cf2b5b2e456ab232968f08a30aaa504d3d8f797fa228", - "deadb4786b724ea2a014dd60c3568d101dac54d7d473556fe455fdf1a80a3e55", - "068d0598e36be5df465531da933f033fd05f3e5e5aad34871a1bad4b039d33ee", - "29e4ddf41591add11d0bc72036f01e474f2ee6e0997fe5df3d5bc84164a94968", - "8a14651eb9ae7174b8515523b4eec074ca500b66193e248112140e9dbcb78ea6", - "5e1770a8a9da10a42daea5695739116c1f5e50f67b809f790148e1ef8413e625", - "bbc2d3342a7cba590182530129eb38cb2b00392a5bc1323efe100c75919a04e7", - "f08b0333f81afd7e69c86c7da8f953dde197cbf9bc2c0992a0e7871aef5c113a", - "c015334de7d373a204045150a7e66b44b9331fdbaf682489c298843cc9b832ec", - "a47afdb4401fd8595db28a485e8cd4e5d15517d0450da1b6cc53d142f9ee9e4e", - "bfa2f7ad8e8a68a746c6fcbfb75fbf079c43ffc0de633a1d9a0d14cc982bee90", - "8d96447c51408848a46c4d25cf0f48dc668b8d95b8f0da9a008ff537b0114cb2", - "2082181b34bbac06b2f5795badf999d8889ea8a276d947790385ddda2dee1c4c", - "a49f6a385bf5d2f3af9db8fb5c857e7ffcc1a7d3cff3fd7dc68313ca324e4531", - "4ba46f00ff703bc6e16432635902461c777cae057b20390b79e50252706133de", - "da1050dc739b32a2d2afee87fbcd0ccfce95e6dd851c94579aeebdce4034d395", - "76c949db70b7b998131bd3397979b42843a76a9f02589690eb00cafa5c06a3b8", - "2801a8804055ae37685f0b853b98955b514223dd0491025fc788b30de1caa043", - "3ecd53eafab5f1c70c0587258beb9c9af81ce6237b7d227fd9fb1ccd7ba55fa0", - "dc461001a77a88ee8c2a8d7ac9b8414e2fcbbf2297dfc12374264e64e3f44d6f", - "401a4fbda78acb968ee08fda525508072562543f7049627f5a5d0f1b284a216d", - "edfcf412aaa153cc5bb5aca01f8738439b28341ab5e4967c60fbad12d55848a8", - "aa448958865621b086ef300e363b1f1c88acf0b140d6952a021c17bf09e7ee46", - "90fab39136e66703e98b297f9c4ccc41757ce12c40f6f252ddd9919d85fe0465", - "b54fb8f47e1aee425de032c674a6266fddfdb60fc25779f175347f67bebafc20", - "08c9912b10000fafdc504d05aa7d499a79917f00f4bd66ff922c50931c823435", - "da79264f82fed2412ef5907c16b807317eb390d24a433c422c258a8ae5c56d24", - "b3e38b3db90c6f8dfdbd204d30599f3897e7491b52cb6502e3a8d4229001c001", - "d62d04e86acb00316924acf4c8d78deb52b1ffbe88c58b099b7055709f0edc64", - "4b0d6cfe16707abcc6f3a80c2d5d5965c35c8f6bffbad0199373d31dcf004947", - "1df77c5ff2e8b21bf26c9e8c6b581e6b66d889c3e01954e1ac2f5a8dfc25a7d2", - "860810745fb727ef52ae2a34a476b35f3eedfe595e2774ba21f50ad3f7a0c888", - "7fe9295090d3f2225ca30fbc5a896cd29f05642e76a36b137caafa98e4b363a5", - "dd6a819322a55eb030654ed6ccfa871c13488239fc0aa92a1b750c2cd8b35738", - "c98b6dc9119d4779c4112728e4868ce1697e6b81f6b408dfbf0e5b53d7aac1d9", - "950b705496938a3311525fcd18bbb3a964d8382b055bb772f516dd83a3058107", - "0cdd63a12d53ca14ad38cb139997dd0dd8b517e9f4f92e9838a3037c86e4232f", - "fbcc2d5f3250c1344ead71325a2bc9412b4cab5aa477cd0fe49ae155ba5ad9a6", - "c02dd0cb2e868d36e69c181c6cea4f13130dbbc2af145d10c46ba1c6823c1cf8", - "7642efa59ab321f6d5c48f47629872e4aad080083d45bd0ce61303dd023528c9", - "1e0a1a0656498424efb03c3d5b504cd293d73c012018887e6045b539d36d5113", - "0c038638b2eb9692c6109d0ff95798a51fb7d0a7a83f53bec88a97d7ab435e6b", - "47b9b9c3c81122f7376062127573ddeaba382fa31bf75ec4e62fb2ba659d23fd", - "f4802f8646d69d837c4a5f0f3b758f50ee801b82b19e00153290de240fd5ac96", - "dcb66fd02797aa51d05337cc0a8df4f004ee87ca234ba2b133875aae675beba4", - "e21e60ae12eaf197e5ccb5a42b2bd6350714100c5060778ac3d9998180874e37", - "dc9559fcb2fe038f1a8e5d1cafa427a6c7a6f9d430e06fa9871c78ae772ae531", - "83a9e8b3d8b0cd3a25817989e66a53660c8531b60f43b3ffa0241acfc8e14aa7", - "f4441adc6ff79a8726986247e89e31d95fadeaa1bc1559b1e82aff4cb1e0922b", - "8fcb18c187cdb7214623696c8f65ce82048ae5997c132f729c88f411615e7ec9", - "fa11ad1ade754a3eb47715a922ab21d44c23057e5893f1365935673a6e19b028", - "2cb10a574f343ee79a955987b1bdb4c7074ea652510b4e709f331c3aa94912cb", - "b09f915eeae3f202eb50ce5d0910ca8417de82e33eacd8cd171b0335d98b3256", - "76f592d0f00dbe0a343e12cdb3693c93a341f65e74aad675014abfb93836bc1e", - "45e1bab76e9e0c9b0f2503d83163a818bf0b1eef968eb21e84fa8d2b83bab4b8", - "6a4cdd789ff9092c2c509b9652513916ffb76b78bf1ca6fdb198c4e46bd8fbf2", - "effd2b155d759856d244671f00082f9c14674b44e649327528c7fbfeeda2ab2a", - "fc1ff77e3a287a4e3abdc36ac83ff874ae48a97f68fc4ed3fe8544a434c359a3", - "06918b5f30dc7218374ebb2fd0336a3041db5ad87144c9a663b3e5eef7e77fa8", - "494833c046ee35d5948ebbea628ef71cabd93ec62f776d9d0f6c00c004afbaec", - "43977a5f9acdb83b5371188da9b90cced6e86c4d6c2255af35e9b3e8728ff955", - "4b98b39ec8fb5b07b279014336c5be95b0ea78b5cba2b2f31ccae5641dbd5ef7", - "ee17461f1c329aa785fbf0d818a648fa8beca766338cdce10b2419a17f1ac475", - "c04055fc84f25b98f764981d2e64f291d1ec5ca8da076b01532e623e2086bd65", - "ae99e4aac72e30f0101d78b00bf5f95ca5248761704aac5932d12ad8fa43cb34", - "07d251ccdf534e62fe3bbcc42799e4407ccefc1d57be4ad59c5120a24d79817b", - "a5a3f2a527f64448e8a2ab419d088ca1cd534d2b3ee0993d5a455e6f3e0dc66f", - "9503d72106bb3468545127dc77e2dbc457a98769261264ecca47d1a86beb56da", - "e53cf535faf6d9d8cf4d6683bd6bb683b9152852770a48c878f76c83ef90222f", - "801567d740e3bd4325025b437d7c5f86fe77250eedecad135ef65732deb71f77", - "ee438cdcf330cfe3dbdbaf9e890e9d25781a45ce4662a96394dabfb4d242fdfe", - "a25682c1ab0e7ea2f62790efeda8ea1dfaa48f5e3bc635600a52f87e86317301", - "1bb2b4f9215085fa3b03c016f9553f7491a8fb938c4c831b7f20cb37a087676d", - "6a34c4802919ec16b064dc10f006060279457a12dc28f65bdfe301301ba23310", - "0aa5e9fd2a734b69a247bbbe83444f11f5273e960f95181d684590b93ae9ff3a", - "63b7392dfe903edb85405b37b4743ab61d0eb75c2ed174b607962fd82f0e6232", - "9002d44db8f3b118670648e7479aa18ab6aad8efc86941a2290849376181cc27", - "0f6859c82dc519f29d5d4d7d587162b48a66efbec10930f1dee3130c6605615b", - "ba5161bb97b5c2f1b51944dc897a3ac50bf638cfc50f96874a02ca44b7e85d3f", - "d4a4965f82f18d76c6499979ea3990da387bd1e0fcb934dd9c3ff6fc4402a4af", - "092465ce77f6a334642cb7c86ab7775c8e250e8ca2e4738894b752a8f02abf87", - "0a25ed28e1152cb208d12323edbbda6c5f0ec436f8136d36d4447b7b51eca143", - "f6fbd23a3686eb190bbdc96f4afb4a442ca1869c94fc87453a717ce33b17d7e0", - "2bfd7464e8c13b84da1dca4dfb5fecde72193982f6051a805c9a112fe482a92e", - "9fcef205abdf7e4c6c692e8899941a4525fdd4dbcb17a82790f2b78bbfbfd31b", - "2c8bdb5733bbcb513dbee5b24972fb7a4aaac69d6db16a7d18972fa5b3886040", - "603e0462cea82e62a72e1b358df76ef221d02bf97223f932e30ef1c4d6b3510f", - "3188235feb25d2bb58eac03649171538611af9d15e9bc40d1d2af62f68cebd85", - "1f199a3a26f6616355e04e716e5faf9bd8a4f9f5bce60eac9f265497cec748ca", - "8bebb741e80ae6f51950fd52314d3eab4834efa41a5e83a348519afc33e17110", - "e5fa74806fb61844c7d0f480192e54db034dfab91bbdba073c4e1cf42e81150f", - "5ec77e46db3e81b85514b9753a949210bf49b7feb1297e0aff0892630cbb5103", - "7743b1ace66760dfdd74f4a6fbde46426841cc122777e02d6fc35c51668882f6", - "8885061d46e36a16761608555f49f5a4f43637f16b0eeb8325d8647c95198daa", - "3ebe9c74bea6158b9c5a58fa1116285bb49cbcbe31fd1c945b70d03a485990e9", - "d64343ffbd907850e79745fa050ea023358c38fd6ab0d8116b53640f6076c69c", - "276a80a2ffb1c90a461d8cdf429efde3a900aa1509d2b00ca38e89e7ab9d2f58", - "430a18162812923dc5a3515aed94228a053a27fdcb13d3699cb31ead0231a166", - "cb9ab62517368ec4badf839a4f05c1992438e5f87c2b79c4929c27def7eb41e2", - "4142270424769796f9dc344d9e1988ace30a9fb0897268f61229c19f3b651ddb", - "b02efe2698f2a6a839705c0a89a51f5ec4e17ffb7fd2de37873399e715963d9c", - "4f4c19c26f8da55b1ff3ebaabdc3b9f5efb469125184c41d812ca4bb7ac726ed", - "9918f12ec95a6a78a6d7f708b6e168ccc6bf75a335dfd64f12bc2081e113e4fd", - "ec083c6874874ba65a07d8e4b4d8021d84afee669081167f9d16f450cd2b87f6", - "41c739e5855a08ef86c9dcf2215381b33f0bcc14fd005350faab193190b66697", - "c8d80d3d30e493a73bf000d7a2751fb1904450ba913ad51ec424bec65f0f9ac2", - "aabdd74f1a8c6d251a276541379f312ec72018f800979518ea65fa321870fc09", - "10362f2fd3b43c024dcc0536168865ffeecd2ae3fb6449f25f6c57986f848d85", - "3c3e77be6695002b44ca682e84201c306652eaa7ec0d7d442c836aed57abff9e", - "7cc73b82282b92decb7532d667c2f203e2fc8fede7f1a7b6fa98e1f634be2ea1", - "5015cd834a2028b3a8464bad61ed428e1ceead8bcc97f072974757a8efa70180", - "02aab356e07708dbe7129eb1fa55d61ac7e2cef0fedf9ef4b023b86084b88e83", - "09ace8f22144dffdec97af01868704b4f735edc49b4033968a8c89c0b3fd39ca", - "53a9f37fa911e18630445489164f767c2cd8bfeb59dd2bb78b426ab9d28505b9", - "cd65ff431df4bcf4d362b8f3f7a3d2fc4e0e558a6677b9c5d2c0d9e01ba32e42", - "d941bbac49bc626eff1a1dcc25018449859eb1948bb09dbb39a90799b982ab6f", - "8d6cf7f306ac7571a0d53c1b57a6f15d2a36fc25a8001c5fcc6320807ea689a9", - "09f07d167ceee2cb2f52a94665f0a30afc8f8421b27c37c9909578e228b2db1c", - "14e348b4bab6da66f88d5f55ae9983ced8c01e448d202283ba8fa05de6265a5e", - "7285a3dd643ed855bcb66ce17a56ee19e94559665b0c2c29be34c0dc37781475", - "d92193b18de7b0d711f15b1366a865af987e43c4aae0d097d3f0f8133c18d2dc", - "176556ffc45fc1e564f3d01d179693636081f75e904acf84ab701678d40eabc5", - "edd681f28435c54fb327628eb3958e953125491be55f6c944d9db0bca4fc29bc", - "6c78cdcd45fe343814e21c1ba18f9eae369dae866e11e5b056f3a94166ef3069", - "46a89b53334969057da9cb1db5ac5ad6b88479969991f89c3d08309d51814f90", - "809cb74339069dd14cae795b757cacbd84057f4a0a513706850ad4fb59e162a3", - "32a6ed705643d1cdfbdb615cbbf12259eb6aab9ffe204b33a27cf390f80ec895", - "683917f60ca969e0a38fb8ca71b8f520a1c09d1b2f31f25937f10fde369c6ace", - "6df4e93b298bd994265deda3c20dfd3305e7fb8045b5cb0e19150916ff0e33d2", - "1586d8e81cea54ea187baa1b32c35ccef92b11a4f60b1293bc39eb461e37f16d", - "50448d8c2bd63e7d7f6967a5311b953955a8a5d24eb7c1f8d68bb60097b33631", - "0671b25762dc24b6b552e388f4252a14b13ddb252b87668f32cc034d236d9806", - "8d4f4c7046d3874df64378acfba27469fe0e32f5dbdc0a45722a46d3d02d444b", - "97fa097ddc09134b8fd0fd3df1cbc77a99f85ccc76a59e36921722952c4416b2", - "10d35ddd178d6ea8297f5fc764c9f685cbbe7282e34f29e232d1c3f72ffbc53a", - "3378a028f6a27a4a2dc8c72c9f080d786b89bc27748f2318a56cfd7ea4cafd86", - "d20bbb97d0bfa63fbcbe2f3adb8045927cec992e3c7f652d8857de2c3e6ef051", - "3a06f2b5b0d6a50145c16b024ee6f1e86501f9878a196a2cae95198b001869ac", - "61a027f4c0f5a77be3e53eb2fb9046a9f89e66fa7bb62a683f40cf9d06533f49", - "6f248d5fcead94c77cd9399fe16455e051bc52642757e2356841c0ac3961a960", - "22e5546bb6d3bb61f1166f4b6d75b60d8da2d20e37d2d5f3c1e88264dc32a02f", - "caac39e5aeb5f9d29cea1eb2f0a795352c2edfe674d74105dc0edfa0f67d42d0", - "10358152e6767d802ad40fc23087b45a726f85f12a355e5846d5697c8efcff15", - "63ed97d5bf2a31b43cdac0d1db0468d87b5164977c2031ff26d3e58cfdcf0084", - "f6510cc09a87d83f7d7d7bc15a996d66ed0ba4760ca79b8995f25f74fb662617", - "f10518b0b1451f1a3fd3a29a44a2b78bbe4d93882005fc813631610c374ad080", - "c201591198dbccbfa5bc828c2a2d0f126399f845ea57f1ece6571254b2f84527", - "39136e623ba848f9c3ed49ed309e9c3799b16a3d4eea50c31815933b8f53af3b", - "44e641618ef1b2e8c812a9d614e9b67001d97d97bb11121864a79f58e1feada6", - "61662c42b064f37c97dbe7792aa0a318bdcbf51fc675c227d547113357f65479", - "615fe8382c33621010fac01774a591bafeeb4532ca56235b88be864be4831d7c", - "e0a359eb557c4f367db57628dc2d42b7e87f95afa5fe41ab4d6e53bae73bc5d4", - "d3fdd5c998da7502d02496e784a72ce3849c90467163f5decec010db720d5f00", - "dfc5b5632ff51d9f7d059e2c5c01a36fe0d7649d7eb46850b34793de85d6e5d8", - "0a47c087e37f1a6448015460895e8e0e5d81dde672be53837443b6cec1d88894", - "8ad1dddf4ab258ac69abbc1d39382f7300cef75d426ae44e3d8dc46ea6dc515d", - "393a41bccdda1d8076a2d9e7fa90a186794ca575aab22e5ce28900e67532a2cb", - "45471207834e9c19528d2e25f0ca82e4bd8985d73b1f0ec23ad2b8896ea1edbb", - "8859938536ab771d4860dcf7fa962e077e8f3af2259c8c9a13d378ffc6e6840a", - "8b771594af920a3ea7f9784e810791c5374a2bd8eab83c30166fb98b8c12dc0e", - "85bc7ef96146d0fb9935222f6ef47e5a342b5ddc81b8f2053cbb5ef206a3c982", - "2d44fc2901c47c0a66cd73fdcdb83f282b16c0976f687bfd0c17be6c13cdf351", - "5cd4cd0caed8cc8f8c5e240ae3b1e3310ba3baa19990ed2069315dbf0db312c5", - "2ab38af4c1b872acdbb1d264e816b60696cece994c3f3732fa374af1a47adbd7", - "87c2fd69556e605fd50e16688afd72bc8fea9f9f3da86a1bede34aa4ed3a984e", - "c6e9739dc41efd96ceda8add80380b2d185a1dc6a8599e8651ab33bbeefd453c", - "87b849776139db159e391ccbee43b9ddc7c36d962a4773144d92b66e0e64e934", - "fb3c2601b0a0574ce00e024074811f3bb20398bbd8aaf44def22d32f3d694b05", - "83ff3faf39f41a646385f4619d61ef08e65ef02c1095c5d928bf1ef731ff2b03", - "cbf7f411bcf30da1833a0d978111713447b6d98a0d32be234d23427d63d893b3", - "58cb7fcdb94e2aceeb416a06391271c518fd8efb8a40f87fb16a2cfae0849fcb", - "67509bb16663f4769ae9b6fe42d4ef126bd6ee9f3f33b96441c4fbbeefd1704d", - "7a3a820e9f0a08bd2aed438230111d2e2232db172a7a98e744e7b000bee52520", - "cd7f28d309e16d92489d3c39072783131c995bdae1ec1fbe14dac7af660705a6", - "b80a622edf7115b3396d3b888a645745e4d0d87c0af5aeefde4617ec00ebb71e", - "0628705b26766ce24c7760fab00ef3aaae0022b4fcf9fa149d8413e9fa4a151f", - "8355d5ef4b643d1f2e3abded40c39412ad99691d71bc30f372ca6af1707d34e9", - "83008dc57f3939effc6788756f53cc9bc25acf88b6f3443ef3fa04035f534936", - "47a9eca0cb8b8a9d2c10a880f904f5091b1acf47d3bb9461152d953cffb4ac34", - "50358c3115b0f1b870b6e74fbc5ccff9b3df9cd26e5c6af29639b97b34ca17fe", - "98619453976a7c3f649563ce0c0ea4ada7b45131b2984a84b1ae1171d4703da9", - "cf0cbffaa76bfc2e776bb439c8492bc2b1892af321c05a3320d9fae8ecff5f7a", - "cf7cbebca5e744ba91b2a1db37d533e95a812b4a50d2b14fea8a888f0d166588", - "d8496c6893c3130e3ed6d294d540a13b36d3ac2fac52964913bcf8163f79c2ce", - "2639febfed2c7c470ed8848179aeb652db459f520305f50c9dd8835dd90016ab", - "6c5db3d3686c43212359afb124b500dbba40bc05457b63e2b607651698491d04", - "e6adf1ca68226f6fc6a770f76c4b8b1fc58b22d6504275a171024b761d49b62b", - "0eb6dc0339846748f9c4350922e386c58b4910c2379a333225c535c0e916febf", - "1daa3a8ea7b0ed2eedcfbb414b87794f262e71e995f5b936c13cfeb3b1e00c33", - "0c0bf6856de2ba3506f143addd54d118b80216e0f5d1db5664a41850deba97c8", - "2076c8bfc8fb8ffc70e700ba00b6ddcc89294b71cfefca491e48d2847536b746", - "69ea3d6ca76d12335bc38402f6abcf16b914f267d4e59aaf78f374d5fbd31d5d", - "10734ff77521a4d24ba109075d902fd42d318d0416f5d8f48f04e68e77fe024c", - "c087e81351e8c02b3e7a24ead178fb0b660b17256ab7e5ee32f3f1cc40774038", - "fa8f130173d477db8e9bad96071033effb63937353086bd74692fa4909f76489", - "18b7123c2059d098a3c367538752d0c3d58a10b08e1e439f60d9646b415c1ad3", - "188a967d6e5e429771599243e1ee36c7275408272b9a3ab2ae2beea1352c61b2", - "b8f4ba766a69a022ff4e2737ed52d629c7be77f5e7376347feca800edb783665", - "c1dc775a1c4bb85a2f2cb553ab48791f861072233c6ada7bcf8e05aadc17d429", - "d2154ceb50895288920dd83dabda3b1ecd82a19838782a3bc5c732e01ccd864b", - "c16846253eff7831a59f342ce59a7b361f0785869c007d227895dabf62a5f875", - "06e3f45135b933348d1f6ffff1fdca3a3c2891ce2c275047235f1202a2dc1155", - "b713e0f6526ff463f554fb394992913d3ddc9b802623ca3e5db22665ae8f61dd", - "da6f37100edd42d3908b26c7ec99d6e37c1d7fd2d625ffa50509abc666c62b9e", - "10fa9781434b3d88d069cf9274defc193754183fe539103d741968fe2faa75f6", - "a3c19d0bb36068ad459343f3330f98f6eb4a59aa8feb6bfb017ec091edf700a3", - "dde53523aa71d2770f127f7454a8267d366dd792f6e01e1ad7d2c43dba1a4668", - "e64d1f9a281d21a09350798fb0717ffa09044519f24ede0ce1c9a93ebc435d55", - "88c32b47f3481aa6e8702155b74935ca80dcf88b16386d7fb7060f1afc787906", - "508015876127db2f89c5424b82fbb99fd0f774b82f0720ad47d48a5be1fc2f8a", - "47e11e55b2d2cc231b8af11fa30b19d60b4e05534bbe84668b4e94998b3c8649", - "ef1a3dc620f87e70cd7f3458a78ff9ec6bb3e090565469d7a8ff643dc43cb9d9", - "0c155ef1277ce2a0de6ae7f6faf44c00a5ec1127c2a7a407a4452e2e4e109467", - "6e075e97aa96ea29ba73382650da0aa8f4bb09cb8a53435cc862f74a01b58e6d", - "58702b76aee269caee942a8573004bc8be5bc4f092bb47eb895eac53c31ed6ed", - "ac95b270fe9a7a8c0ceaaa0436147d10a152f6de7a83e15ce58596a2d13cfba1", - "b53b6d3c74b78dd0a27d458bb112b5b215851088596310e90bcab6cbe10e9518", - "d96b73590ea62aedef3cdd924e3e66fcdbab2cb2a9d556f5b3a89e9b5989b7f1", - "f977441bdc872eecaa5f8ba4461b34e4293541dbedd4af2a2a475ef90a018148", - "df32b28d89c2186135bf705603c4ec11de7ba462751bed58b7103dc8c7c48043", - "e5eddf444f9c7f241ff11ad663b30e5214f9e022c4966f29c50ff3dbc692ebb5", - "e168b3ffc4ff27b0bc6a9530d75632dfd85a1dae917c7eb2bc007a5f7089bb0d", - "b2d9c32386369d1ec8c7b368ae00488505d682f06c4d9eb307dda11faed61c45", - "fdbf000599b2529cdb05731bde9b930f7137189c5a7f425a86f06569aa6ae843", - "34ec4aa4892be7788f214074242dcc79bf43fb0120467916fd2723b7d4be9f4c", - "e51019d9ac8cdffb14d2ced1160b1c115747678eafe8b3ac5bd15661d482cbe5", - "cf74b3ce613f2cdb1f7aba1d1e4bbf1fb7bd05e058d9729854bd554803dc938a", - "44305e846133a05f27ddddda69dfbb688ede33ebd60dcd4cf8f09edf7cbd3137", - "daf8d5c05103a5d8543b477dad173cd5fdbdc941288e860f1dee52c60b733b91", - "666bc6301d2890c75cb5c2037f356b2c1e261889bcc83fa362104704123622e5", - "4514f5a0d821b2937f10718975389061917d2996554d6eb5144d33211cea0523", - "0316312aa822c3cff5628da8f1ff89d0f2c868cabd7e90bd41181ca7c8fe8093", - "88889f830ead8d260be6841296099f0e4ec05d07e7f1adf2e12e23ee899038a6", - "a8fe436b9b7b94dc71a1f732a8ab0a89f69c9869f202c06100e254816f329a42", - "1a22e3585ad52d7450883643aae6dd65ccc5d4b68c7f8a20562055577febdeeb", - "a08113c3f75e0e4ca44d4d490c1c5aaefe4bee79331ea2392192a79e6ddbd533", - "489ff58becdc7ce984d91a72bfda9d0268e28022ca43c8921c1fb6c6fa13d1a7", - "51a66055dfdc39e52b5179029e430cb13363bd8acefc30b5f70450a8f69c813b", - "e4adaf14bcaf820b2265d6a2fd52e30d13ec707f551849d1ad517d1912f1022b", - "322046ae7eaaba9a5bd26eba8247d217b980800e2efa544e863c203ad1783cac", - "5f32ba6398d5c21d66f6ba049c9bab63f64befa557d4f5968689c961ffbc1fe1", - "be0e41a4415b1a6fbe6742022dbf69ed0e4cb176136ce25a6c537f8ab16e0f90", - "18541fbe46b652ba5756f8020c092ca405b56db4b14151dd9052a0cc2b94c6ac", - "5a26a00fab0add247eef5991b87a45a6dc53c6fb0a0f0634f559f04afaf74f46", - "8e3c51e51e90ca1902996d7ac80b4dce0169384ed5959de5a0a5ef1eee28ce6b", - "fe50daa56fd843e280d8555457476277e02c34b7cd94a077d76805bfe78efcd4", - "6c4614816cd279c4150c471d899f91c5660ab03aa9d0f16eeb6c12a6c399e58c", - "0ce89244db4af21c8d0ae5c903b20e48600a8f844135fb8abecd19c200ed9b59", - "a0992a0b8560a1623329a7eb52bb09d5e06ae35b3955ef3f8930b8716837b8cf", - "2815e78eb3521b12153e59ae39fb21e5e3e41af1a9c9ca38e4282f574b0a96e2", - "54b05c526405cac48559ec98155394247f150194d53613a255b0518184466351", - "de0c5bf9851b369adb9a703d11ee17d70aa26c620380675cbf516c9f18896613", - "56b0eb37a891995fa3d781935e2c9b601964b720a536be963355eb0d6dac814b", - "eb7b878dca7449b8023e4a2bc55d47a5f30137dacc3da9ac73801a91e35a2215", - "6373490e5c5c05721b0e243f0f04a088920b34ae1caf788eccbd63906d250f29", - "b66c57b91ca1c11c8e4cdc2f43e5cb50344bb53d18723f87d328a9f555723655", - "45fb3bb32d54dfc987b0d518790e6e0dfa059b44d99f8a0b973a37e70e7826e9", - "8191da262433c1db3066c1e7b74396d122603761898821a55430b32b1c64cc26", - "948a068ec3cd9f54ec407c8439d341d393e45b8854b7c5bf6127903b789801cc", - "8d71fa89f7d6aa79d38944e26fab65a3e2352be3d1d1220774e53b2b93a16233", - "fc006163b9951e4aac0f005b1f2fde63a597edf78dd2b5fc0094260a5eba11d8", - "bac1caaf7f46f7833d2f69df0131dd1a44a841774e02ef3b7d29b8bc4b0493da", - "50c684a2db102c6cc2d6d7537be95d1bd77971ce7d827065cee885878e4e8edb", - "7ba9dfeea2c2de9cf1f3edb4c94be26b70ae9cae3cbbfc0ec931934f09cadacc", - "d3c67e19434c47f2e46628480ca1f02d4d22ce1d7791a479474e2a7cb583c404", - "abb6befa1cb58efe79c7bf1da1a128ea0a2a6b1bf5fbffb05e810475f811d6e8", - "e69b86729bf39bef5c595146b66eb80fa10c583e014f423a482183f1386b1bb3", - "ad568315a1b0e63640235455cdf0501e1c00c1d8d971752d911f958c8e52ad0c", - "b06d794f0b9f2388824ddf55bf74ffc58f4065ef5b28d8995c9d5d53f330b127", - "90e2a7a2c0730dea0f6bf161f77f1d4e20c332fc454e6caa69d9a2d98ce991c5", - "de9cfab716b284e5270c0c65105672a4f712e4858a78319d01aaf16f640b10b3", - "b832891ed4564f65658cdb7e0cd3321ebc96b68c44ee1d39891f788c1120adc9", - "073f7aff37418f80376a5a5c4d7b1357e56b844543bc4a04a3f37fc99b6c574f", - "335eea01dde8143cce02dc4bbd166a8437c3b988d710c47c8b5b50ea532ddfe2", - "9ee15bdadfef1cef097c81448cc29bed52773e91ef1ee4e9dc073a3fe3e6448c", - "e164c8ce8d2c4d0ff413f69f269bd947ae9382a1c78ad8b62cfa9b7c5cf2bf4d", - "b90a0ddc16efa56a4929a6e436bbe8063aa7fa85cec6ce23a0feac49f86c6453", - "c508f5f775e2737ed22a98efc4c2023da4b5ee3187024edc2a983278093f8d20", - "99143125ff2541fa0866c44b3e54692ecd97a44a338869784aee233ce6aa7132", - "67c2aef42299ec42a7d2891bd24d7a38e8f3a347795c3d2745c3dc3604f4715c", - "1d799f8db241aa85b1220aa29f65b80d6c08483ca53fef0acc02aa83358837f9", - "e474a88969ab0d5d20f46fdc2089d42d9c81bef0b36cfb1ab69bc1f92dd2f2d4", - "82dbd9da01e711b9c2ea0baf335f2f9dbb125ce390a511ede466d084f2a17e8c", - "4c46b14f18c49ae38bdc52da57aefef10c3bff177f235493e86d6ac83e111d65", - "618204afb04557817dbf96d07db127fbc4cf8fb31a4b9f08f5f956f26ec74729", - "5306f9a52b942d52417512a3ad018da741d7a4a81ca9441d4d69b35b47730e4b", - "033720cde8ebb3f90f6879738bc3d54d5923173e0c9a8496713b4e6535781f11", - "eb0230aad64b43bc64aae6e8d635e2e1f773d423094b6c8830e97eb47ed2d036", - "c2ee9cba91bf83bfa133abf6ccf7f8fcfa9b7d22741bac7aecc0e2651e367796", - "8b76e10353dea94c93df9a5ebffb45c8b7cbe60ed57f27769f484cdddb90e7ba", - "61e15f2f566f0b50ba0d2fc5ed421c686cf82f8e048170517901cbbd3604dca8", - "3db69a14582c42b84972bb15e998d1fb9180e4dce876856d03748d2a299d8f43", - "9260935e42cc3bb92fdb57a4941bef124cdc8117119c0615a13ce107dbd4be4d", - "6fe3922f248d6252bb65f0bc120530e1fc624bf50550065dd82d906bc27ffaf1", - "00f4414ebf67c2b37af4414fe97fe742d5a9298063497bd287c2368ea066d291", - "7afd23908d956d3baae46ac4fe7971f97e7d7df14fadd2d02014fdc029a421d4", - "3f493be3d0c59945359fa4c94d846e6b4166e587dbdd70655fec42fa37ef50f2", - "163a36429efc8360e4db568dc543df6a254345a4439c388a32c2ce0a16d18965", - "b9d6c88122b602438ccc57d49a2519069e724f4f9658423870006b9a458fe944", - "ba759d2385ad3a3c9f3181548c1049e799ed44792f0d29908f8e63d66a67d1b8", - "e6c8972d8967308af4803e6dd952e3aae94652c1c491416b2e713adf7c3b6f10", - "0d45a1f42f88c068ff3e41672c2bccc7df6a5341ddbe49110017815f1cce8266", - "6950d72e6f4d30c80b37167baa87438a2633258484eb44a563ded673af14355f", - "abaef90d15c401f938178d718c6bcb115d222e3361d81aa5406dc5e48d658577", - "b15e3f3a7ad7891e506701e68399481c9b2d99a592ec0cb1c418c3acf797b7a8", - "24fe7a6714870b6d9e49c277651c7da52e6b03c0158fe5a5c4ecd1ad61dbc52c", - "830d5d51969472b018dc950fd619efecbe21ef7cb4059ed25f5b080427179082", - "5df3659a05a695b763f84af85c3e218d881688a7f6ab32e0607fbe20689e274e", - "570c3d37eec69cf319c70c68618060eeffdacaccf579cd2f79728d8dc6535c2f", - "bac110f079573b2e5637a554a92ef27480cd8b63572530e71c92e529a60017b8", - "12c6277ce10cc0797c4cdc1a0c7ec2d6e4efa30258b298112627447e532034cc", - "27282a081b41b23e0f723e782d316c4a36b67132e1907ef33eec4edc564ab67d", - "e84076c10dcae4af2672ac4eb53edab1b392890f9f9ae00803979d96b1cd0710", - "7d495aa0746c7f19d0358a5a0177e8dc651caf547a8387d56809f92bad7519bb", - "389ddb9cbef3990e123a56b3fa70889e6b0ca2dff5ab94a8cd262b1eb6b4d802", - "3a2d83c903808729af8d50a12457788b2539be58b6d442bde82b89c415e570b7", - "dcbdecd23694b3a1bc86cc8f762459168edf16bd8b5c1d44170d92dfca64b165", - "3d89da259a8ef568f8dad353fcba47bf5ad95e1aff3dc1f52262f6f2381d180b", - "86a5f5e77c9ff4de7cc3c6f1ac42216cee084522f26607a06cd18709c2e2eace", - "7d862e30e98b8289cc7155b5cea1e7347de02f7b90b9155c34540c0d06a23808", - "8cf260a47649a594b7c09980d8395756a0d420e9691cd55f77dc5e67d8e02c01", - "7d89234bccf8cb2f9004389f7c4119a1f7e3eb7c0a1b421bbc1249e25450f0f7", - "18f876d6e9ffab1e67f186b85392d74f354030f79f39e2bf11c1401a37f196a5", - "0e3515c2673b922c9f70c914a8f63f7bdf618f4df07dc12b57ff6405dba68b56", - "2e9e4a4447864d81ca738e370f85c7e9568777395610833f96999196c29ec64a", - "12a52c6198140dd4a9bc41008d8d3659c92a7c947f412d197ffec6ee01638882", - "211b1cd702f29ae0e00f04f94abc0d02feb34bf53f7a483e4450137395f7314e", - "b678d2952dd274322b11085b1aa01084eb38991d794202ca6ba7cb5dab6a6c3c", - "6fc5ea2557095784535bf6e36352866e5597e13db09df23e15fb959dcdc66e03", - "85101dfeaef75948d5eb46c663ad3e6e16515bbdd88e86167be16353669d9f83", - "c1da23fa44322e17c7032651925c3191debded08123a6ad69542843d356a0771", - "2df76ce7b9e7879d00195930b2bc572241c01e2fe3723d5d608344d4986da5ba", - "14a604442aac2e3e3a8829a8031a3b4c947c5685d6687643c92aeba7392b7e0d", - "da469cc934866a0c453ff07081a637c857ce6396aa280d2c0474f211a20bec1d", - "29368d5003c1ff05b52135f345e3ddaa4a4e379f0d8bc88afe2b194494be2866", - "a8d44f46857bff12ee1303fe241834b65c602b60ecddda6f402f864c17bac157", - "a693de6f898999e2bf7deb84cca685cae358d738c50ef052a884436ff13929a4", - "85394b54a335bafdc3468e03cf2e1ba1b43c3306f0c85d7a30b73f930f6749df", - "9363a5143917dbe997ee1174d6c7c5f082b61230fe4c29f3327f6827403accfd", - "6c1dd8bd89663bbab4a298c92802ba58d5303408de3636b727114186e5839569", - "3bd6bdee129b6b7cbb92163feb841446470578833f089c77e3d6f1b54dc97afc", - "355da7780399d3149a156af2d1d684b48c9f0109cc3514345ac6101fe3701974", - "834eb38d76c820631fb84275a43b291f403ecfe1b2ecc04e2605cdb66d42a672", - "c228a3dd3c10eddeacd42b5b72201e728ade435e5a45da774bc74facda1d8798", - "b34ac2b35e393447a86a27c17f55a81cbc2cd961b8af0ca1f0be46fc7c4e934f", - "751f75afb8f220c8445648ae6ff68105573f61606e5ebb8af3527f9fbc1e2c19", - "01b6b9045315a33cb45ccb21c92c22da4bc96a98fb17be67c37e481727a0a762", - "27dc42ceccad89cfc9515e46d64ce4a547eaa5e0b4d167f0cc5fa3c86af2d9f2", - "b3bdcab8082d41d329e76a9b46ed0b0c0593dfccd0c077129f9c35092813ec80", - "a8613b9152c1c998721c904047ebf02611bfceb4c99d1463d9da80dad356be28", - "31c07b34717fa89b51869f8f93da1dba6e2e5c9bd2a4229883294bbf523a82a6", - "6189f9b94ee10e98bbf1a7551762659b791e4b184823d6dc411bb40472912e51", - "0fa0358c3b85e63f26b7ef3470fe53a23f5172f7cc1787a2d7974744c5eed7a3", - "d03354006599635b692ccd0f836eed64ccf9a07eb921dab5fdb33b1d0d94d5be", - "2dafc04079e0c08dc752229883a2694253fdd7971280456508a82569e5def822", - "d48437659a1b0fe04683ca69bf5bb080c76b195eb8c05c12ebc095f1dea62008", - "3d6a2d6826d7b1c9e7b0f0dc68f70b3c08a349072b193f3c9643231551e39211", - "f47c986a0f0d9d17a121d369d06f7dbe2738c316c5597e13afe041ef637d938b", - "6c466ba0380a17dd6b1e2d11e1a8f1259ecc417e61a3aa2be631b8737e51f0fa", - "e4cafe78074aec62e533e8bfd11a08121ef4e70aadad7fe52424b34e56026e97", - "789e86e341377d2fa9efe79dd7be2a23cb1bc2d6e5e7805bdfe16faa6bfa3d27", - "5f32a9d9013966b3215d5d66d866ac35a007672534f6b732c8317d6ef5896c6a", - "b934c03b8df02c69b0ee268ed31486cb5328a77a24b44ee8bca6c575288bb5b0", - "4f4a29e8b7c13ef6e453cb9fabf38f91ed5068fee037f33635469d7901d02c59", - "39d18fe73b05e6a54ecccdf7dff291c7d3c52d4df6e189153ce6733bbad52a76", - "aee9c07d78bc57a30e5c53f789ff3195bca306373402aa04abe8d18148ac724d", - "547c68f2e240b968b275bce5bfb120f8a9aa92fa78553df3e9e37bb636f364d7", - "acfb075b4e1cd251a10a459ba15197775a80b79a26440e5b0f2e4cc53d82c019", - "98d786253b7675130b066b21455c9c8d1a6ca59d52ec51346f11220d1cdb3702", - "79332bffd69e32d9aeb590f8586fcf3ead73d44c8b3f4d95bae5667e6a816e9b", - "3648d94e91d5e0865bcf486851380bb25b0b5fc8af5436c0317fd686f2cafb8d", - "71ce6efc23f4d9ef0b58dbc6aa3e0e01cd24d2de55dc1a286fd0d3ce9a44fa78", - "1e7352a365b24ac68b58d5d6b9aee456e23869e2af8a1dc2a714106b044058a0", - "1b6ef50ee7340dd7935525fe300105b6cc34941aa299c91d0ca535afa78972e5", - "3585bfedf8d602f8c3181e78c809e69bbb565f353af1a912811c95f8b3d0f3a6", - "f4dc9e460c35f0778135cd065fc028b80e08a63423d47b206e099823bffddcc9", - "1031f842b8b0d2e80e01200482d73add6fb5d246f0dff4861862660bb7ed2459", - "71aaa04dc6434f47cee27922e7c35f36153b3bdff8d69b84302b7089f6684a32", - "e2c319aa50c0f2d063a357a02b425b6108c20acdc316fd81717688403a99d691", - "c41053c4211169ff4c57a8410a3f89d0e04e0bab473c95f8e64b4073cdd43ca4", - "2e55536cb7a4338746a29f9a98f105bbf70132858c0f35b9a6ed6d4b57d847e5", - "36ecf7e08d67f51e7a561ebb945858fa2ea3319eccc707606db627f1d7cf7741", - "bbc8239f7c069e836b941275b29a57ddf56a2b3cf360edb2a61ab847fef68573", - "cac6048de8de609667eb900638aea504945a01daffb2e120dc7ad4d2f61dbf33", - "b1622aa0930d10192374e30e8481e45312818a2ce443b4362ff9536f61b89c3c", - "99490d3410242d25845604383626bbdf0f5fe0151265b38bbbb2c58d126417c0", - "45fa71875e053195de0b7934bd4ca3d01ffd20ea39ef0a8af3b01de822aefa23", - "05c642d161f149ef2bbf759197561a94cbb4dc7a629992b1b1e87ebac3ebd69a", - "a6e1a99af94ea54cfaf70c9706a1715f3fcdd6f1ad5beec9d030fb8f783d8a91", - "65eac9f5b9f0eec7ac8acb8709165a0c63f1ef676dbf255d395ce418529f03f3", - "f964d0617d93ff8d75cef3dcb806693f3ef50262b8bd580b4c0fbed4c4ec8bac", - "947327964557cc3ded7b74594d33e8ea58fd5c9e7744622634dd389640887f9a", - "d12a6b76447f0208ad8a36c77847030b865b82f998ee65c058afc578a88cec6e", - "1be4625a27fe228f8b7bd848d191cd274fcfa60fe5b340cb9a397bd74acbdb64", - "c92d9514d100418d345b3da100d1b2ffd24bbbeb8b5ab599865ad6da6d2fffb7", - "05f585ea221827f845b88dd37822ed0999ecd1c0676355bb0bf6be77d5e6bda9", - "b142691171d916f3809b783b158db0573b1fd50749ed6eefc94da6f4839f58d6", - "b03a2760b7b411375ffd787d7288804db0503b435d4ff312d46d76b7077de753", - "0f5768a06df03d60190b69f913d043eb214568efdf6d5d78894fd1492f5e8622", - "ede961e29d43dd5fa8a16f8c7a1dff9ebd69b235b75968d527675a8763ac6e2e", - "6ced56ea9fa945c3a0b88606d0a2d9e523ccbb143216307087e49b006d8a19f7", - "82c76a1390bc77cf762d1c6a2d2f2a751dd0b8a41178711fb55d64ac6f2f9ed5", - "05ecf033c6e64bbb2fae6b338bc4bd43dbe13f7f923012c7eaf16183681f6c0f", - "33b5859329de84b85398a7fb95f524b66b12843a1b2409fad763f527488f71d1", - "368f0ec9f388335dc61f77bc5269424de9751ff641f74afaacc00a6e044e6784", - "2e5410e607c309ff1d91b29bf0705efd30f878a5e2f1238594b84e34cea29e4b", - "f307aa0ff2eed7f269896f6ddcade06409e4bd75b838501628b9da606909d9fd", - "45ce59de164b5fe80d7cacbe31fcf992e613198b9906d929eaa55954d751965e", - "c20c649d0b4543d9fb2476eb06662b951c069d7f473a96d8723fcc0e2ad0c8f0", - "1e4435b2973b641b37ae13db20f52b269d85a7c30ebfa8f53beca3a6db862acf", - "9205464305c2206ee53f1ec3a372245783e625d307fbbcfb64bbb9fa00c56b39", - "49666d620a660bdb5c4d0a2aa2f83a628bf306916a5846b7a684dea6ae608514", - "42d240b48ff41b50c23f9358dea5a72e461ab340d828c2d1b36b3704fd2160cf", - "aa834a78852ca767e29f7be472536f8b44d382f0f406ef1d96f88300d41d66c0", - "6ba35c424f305a0ecdee72c94f96d7dfbc7edb1ce893abca6c7a16618b440162", - "0d30a060dd3c5046de2190daa8b9fa34815a89d9b9041bdce327ed09e21806b3", - "c9e282c462432e2b9fa0b6af64354aada227a2bca1f3f7156b7c06404da903a7", - "4fa578b666d9f5bcc9a677d4d625ddd0a3860cf3e83cf9103810bac5ced3c069", - "bd29ba28c275254177558b35be8f83ecd27b6ecb0ca5835af995d7219e37b3cf", - "1e638fc40c0523d5dd70c213f3831d2f040bb445223c78f5cb3792bc5e7e385a", - "119632943b1084314cf0b98c4e1637549c40c35932b5e5ebeeb5116ebac227d4", - "555b5615752eeb664eb9664da4ef74795f7b1e9b4870a17fa38b28fa2947aa5c", - "ff4aa17f7ac6e668660eeb43a2627a1307fe69ac4aacd938fcd29a8bdfb80c6d", - "60537bcbfb13269d1b0b93ae9e187fc44b6471156c3c9a1799b0bcd8a89339a8", - "07c4cd77097954bf105822d2f2f65f18b419b222fa64f3d8cacd2fb11a99f1d1", - "7c599b6ad40b59c79cb00f22b1b1f3d2eaaa1b451c6d798066e5b5154c73ea0e", - "77afcb4e401aa41dbe7092f1f33de1aa958d5f51809a798da7eefdf3e6d01494", - "257ba865867cf2c9887378dd1e3b7dad29d9a6bd0f8878317d561dcf0da3a0d6", - "6c2c96bac6af60cb8773ddb8c97a10b8bd276badcbddf59e75291eea70794f98", - "8662729c72260e7dc6fca75fb5f4a7cfc0d6e199cd49e4b507a9f24e585cae11", - "19e4bc98cdb6f975d9a232df17236930a38398aea7607ca861507f23f0f4c862", - "2afe6729e793cd336564b9c8ae68faed2bb00da8edbb809eef0b0973f13d28d6", - "986738e1278a0abc4e45704d65cf8f26b1c3ae5d145db917721446c57861f2cb", - "4695cf83ef897bb75642760525f31d3f0fb0c2778a2dff81a2969ec3f6b72e9d", - "7f0787a4d7e88fc2d47fdf8a53ada457d6c4bbacde1253cd51d1404a17dd4d2d", - "c76c427b7fc983fc36871de3cb4db10ba0dbeb52dbbedd67c11b1de554af6a74", - "1809deaf590eb4ef6fcca5892a0c53df39b4925a5224129f8c00390a422dbddc", - "e9a32cc8705acc8538ef3c7a08f8753d87917388276e75a1c3a44b7a30cf4daf", - "80c665642b1729f9bf916b5aa93f439da5d87eaf70a9af985c07414dd8b7d452", - "26c1947c32973ecd0515884220d40be03b93af3c36e78ee807a713d27e148868", - "9236fb0713507db6164d5c9507588e955d3c3b39d8b3c64b2b68125504aafa94", - "c50577f1c4a813551c4d255bf6a1637a962ce298128f9abcd57ae37dbb0ee229", - "d6e26c211950f00ecb981c3ccdf482d6c05a9059a5af3a572497776d612ff446", - "266b6ea6d18c8468fccadb566af8860d55fac0ea83009d0128066effa5b69f95", - "40ecdac33bd000b628c24d7936802a51f880fead161b1c76a52967c870a79d1e", - "58cc1138ab3437c188f00ef4333c2988ee4f5b8534e4fc2851a2f3eb9651bfea", - "1c1ce5472f50e23cd10ce5945853eb81f657516d28a051367cf21ca365d94c07", - "ac2a3ff0d2329a60e5f22985ef134d392cd7b3b377c46cff64d71211eeab3073", - "0d98258b9188d6a92cfb532104ee3f86303d019c56495614be476dd2e43344f3", - "a4d4c0fcf04f673391a013181557271a28722d99311fd9a5cab2eebe52df4a36", - "679749504dbd50dbd6630f83d4d0736c5b5c9aaf2e51a343e8a3729aedbea4e0", - "0c8b42285bd4e6ed4fac8a47843d63b8d494127664df0722a88a07a1e2b20741", - "9b824b15b7c16e317f7e713e9cadd76c888e46a96b21950a54b981114cf6acd1", - "b7746141f89cf5e801ac1123024c26b5de4598a1ed9ba37fdb71044e42a16bab", - "5e86752e9aa2f5237e5b432c090211bf851b34b8698e03054903822734313aad", - "7414957e70833854ad4992fe1284a528a1815ebd5675efed2386419db342f2c3", - "a26f4cb7c388694e69b9b379f4da2d74dd5f04deea6d7b894e7361e7a6011846", - "f7257772b9b703d647c5e79aacc448c1a2fd6403b1e94299e4b6bbd3e18ead10", - "1a6b0ed771c7c5334b27bcf2c7d0097d4b4887c226e7ead8c9a3bbdc553b0bab", - "0cc9d2fb230f257022d7c8b05224eb086c0ac9de000e277c87b28d2621daccc8", - "6d4e5bac3a65c08476bd7ab6e22696544fb56aed3855c269ab0f05b69be83691", - "c083009d2ee46b9f235431675b2a89795c9f660953429cd746ff7463d7b04e6b", - "1292727b65644e5d05620df9e7d1805c53ff24ecd21e950900e2c7a957c8a7e3", - "bf3674a7f9756bb969ad876dc3bd9ff451bc9fde4930f47e2a703db89d5833dc", - "de7a9f4655f5e7ea7f6416152dee6b9fc8f454e298a4b2148e8dee6ae37d2750", - "c02238300c8a2958d9ab3ab3bdcfbb78bcc74730d78a0f2882a05dff669676c9", - "07422b54e2e356fa52e644e9bff7db4656dd03b58f83ae0a485a4e18c54027d9", - "de0127cb349de38ea6780a1237a022503c714c7b50f0502f5850ddbb3af12196", - "8aedf8ab83d48bfb039cc9b8870e12e2d84a3d72e01bf2827b126a460e8f32a2", - "971b67771a0d043a38263d4bc7699e8f3d7d0db20edf52179ad6836cf87cc4f5", - "01e0939bf30e14305640dda84f83080052cf550dcacfeb849485794744ba8069", - "8c13e8d4eca81d0802048d291075544c1801d95486bc442a26f5af13ca84283c", - "d159fb5ad72f0e002a81c7e9d6326b3bcc50e41770b17332f02a0d4003e16ac5", - "2a983fb7b33b031ce9c82e5535133e0152a2d24913361c65e33d17381bcf054c", - "a512e8b816f7ef49ddf7bff016172a5b7b01c62cb6842866ee1c068db9e325f0", - "3298c62ebc2a18c45a5d64a9b2ce8b1a26c5bdc4139298de49e6c816100e4f65", - "cb3b47c6297c906e11c869eb831b4227d6301ba5c6b6052a595816b28f265b1e", - "83b15afe09755a371d779d461fccad353be23b9adb9e194016ea1ffd795aadae", - "33fdc1f4ba8795c45e489744a39d8f6f774ec858676ebd83d06641d7ff0384f8", - "ca0dc15ce5cdbd1511c4753ba72aa4bf6dc3e6b111c10078e39e9cbec55607e9", - "d80611903f6b28b7b6a5f1a2fd31ff0834558b3de374caef062aaf2f27b7f520", - "8a519143960306b883622a4158d3e2d476cca8eeef7669cd061431b0d7b68c9c", - "e2b8f0ffa121ee1b52a86e8ddb3f94184564b87ea3edb65c059454d76351526e", - "dec63df3e39e1db3ec40713ac55dd38c2ee599bd7b49b1582019583e3b9cfdb7", - "f291e685ff5d68f5eb439efa8aa09daa7f2595def04816ebaa2d8f080eb97a0e", - "41736eb815863e7c1066bf621afafd65548bd64ca43c6c383fa6be6142e8545f", - "8cf71af316e15d50a27edfb0c490b9b8797f3c9365bd1654df3cd8c66499de0f", - "6cb652c49d3edcffba966c6cb1cf4ddcf08629317d1d5f6249cbea22a65c5b33", - "11c31657999dc81065943bd7bb251b826e5098edc2d5ae94b59d5d2b4ae0d8e7", - "2384fb2f0dea31b6c8a0ea6b7fe11f8ab1dc50895d5ce2565f8950a4b1d56c36", - "39b8ad833f617cab2ea23927d52878db78e4d43bec9097835cac8fd547fc73a6", - "c81b872a770c6e6969e8e706273adc6ac2f04d09d7b7dbfdd0890fc2e609ea89", - "a2a882f837c304fb0cd75dc15b089324970d08b3c7ca13e6f50969184dcd50eb", - "5619455156f8456f2b799285409923706d986729cd016c10a25c4b134adc21c6", - "205dc7320c614b7b3217b4005bf1bfcbf8c1853a986aa9e468ea03b575f7c6ba", - "5359cf54ad847e066a1699025a48955c11fb55268da99fba348efd25595c5328", - "e433c3304e5cdaf2b01461bbc758536b786d2f5347c803fe1600910c7c9da335", - "e4395fb9e3990e5494f35cdd55b9530e2b75b1002dca40b4797df4602df5be50", - "308e36bd9a152259c0db44ed46ee7d2902cd0ae0872b6ac3a867ec9b06796991", - "ac21deb20626df4a3dcf269eef9c44d3667f36b762da2a2c9cb4c0687a14e5da", - "c915dace27c4167bcc619662447d40733950484991eed49823629d7768e8b3c5", - "78d10df4bca952ee2f11f00712ca14464daed4af29cd65b1f3ae701c50c7317b", - "2ec6e18cad656fa61ed3b0b7ceaf1ac42e4674d37f56618936bc6aafae0ac085", - "07dbcd6f27fbf410f53ae877da7d6efc893c6a0ea1fd7a5e418dac95111eaecb", - "01130c75004ff8620f6307b064825a4c87f6aa83eea8a5365408c7b9080b1ad3", - "c1455c7bdc9011d1ba1774babe822a06d113916ac5510e74a0acfd579e928249", - "63f1889b147512f21e7c870360f1b55096e101c976682789048fd910633ef5fb", - "b2471edc5f572f7fc15dd1595a87aa8b7b6df8e641d92eb429d853fef2b56aeb", - "f5d287d4dc8067d8425004e8eb5b983b4e032c426221bde6895b711e37bcf01b", - "099aa41fc16a1fc44e0730fc02657754831b592f40c56d09618388a796b62ed2", - "d0c883dff732871cbdf303a0f92cbf9e38e180d0da57e9e0bbfe195eb9ff21dc", - "1a07125c92a4fe52611cd4b25904444b1b270622b8acd02398b4cf012fd9fe63", - "8e326c67dc84ba647ca147234944ca4cea0190ddabe72e8df74a8958b4ce825d", - "e11b9bf4ad4aad2141e1844c0d9101e99923753304850668c112f18bc5afbb12", - "652e446fb1936ccd344f2e294ee2403f11cc9aeb0301228da492d49c5d909a31", - "799d772dd024300dcf85b07b31b5a9aacac7295a51b834fd49b2b7198e9e9435", - "920d1c04eaebbcc55c766608cd37b1e16b6bf871c93c31cc4b359c6f0b31c608", - "6aafd1f79c456ef2eefa5fd9fbcc7917a8fcc351d9d383fe0b00f789437d3c15", - "2cfbbb6b7f5ce759a3ab78c275272742448ea5c7d5e15807fca0c12bf1a9be9f", - "20adf714633340ed5e9c67d98520687ddef40e463907160f62ea44f623933b9b", - "d489c03d7c1aab557796ec144962040cd7384fa3b6dbe3b303cbce9d1565d348", - "506ad3def44798923dbbf9c2f2c7015df0663ac89c5c15011c0a6a3b4f7b1dc0", - "bbe516d1233524513657330987dfa5a6ad288cb1c6f9efa74a60d2528cbb0faa", - "c7ca5f956ca28f874e536c3bca6c753115c2d95edaf3e81750f8cf2504a83c67", - "74b38578966514415062fa93d9569e7bfa5af44fc83a263a87a41315416987d1", - "ff153a96fd9b9d5e90721a5118b197c830ce212b49b74f27c63997b1df843aa8", - "2003f003518347012f1c6dec0776607d1f257f08b0670e6679648ef2d4fb7314", - "fb1c8fb486a7c238b89c5fef5b79fd8b8ef8736665dc41b3c70f0af42dafc40e", - "cbde5efce068e6cb461a533d45515a9e2a605a210faade892dfdb0e890d7623f", - "10f81a96f154d676086c5dd338d12f4ac4b1fbe8cfa3a26f45db4972d2405448", - "a5d8f687c7ef1b4248e1cdc97f67ff13744db581e436375e002b85931a0532d8", - "7b4d70993a46f58a744e6250e82f6ddc14e26b5fb16a4944da1e6fbe90316631", - "64fa65830917552ba803db889b727520a75c251e0c613af997a29be42799177a", - "d8d1691a11d44f8463f01c99d9585a4ec7d989fbb492ee889bfdaa5e0dc29b56", - "e28c7d39b30766fb067efcf07dc4ec07278930d26ba6a8ebe32b0233ab89c75a", - "d490857f8ab371d114b0a171cf0fd4ce1cabf61e4bf3eb33374fdc69cc303f1d", - "a73f86c06c81c760f9b267069711b80ef758588f7de5b70d2cd1538fb7de09ec", - "0ff545f50140cc71fc6a1085a957eb86f21a0bc9702b3aa8e5a5f90c94c4eaa3", - "bf1d3f5bba2f2c3a35a3f986804c09cedf61a206f6ed57c7945bc35da46c5d67", - "8c46b2321c4895d97d2779c0970815d0d81f17064721fc6b2a5f5f3c68030bbe", - "6cab6a40365dc14f6908bebba7307ff7767eeefde14e07480ab85b97d07e2fd5", - "785d58f6d104edbec877a1ab0fb058cc6f6845d1cfb2a05d19c9852345cf5bbe", - "96ed636c003a2adf052f5c9ee03e7e1ebb673254a4c0ceb493c8a15b853e4675", - "c5d75964dad982ab840403ab1c8a38544b70efe248eacacf1b75b8c36bf28123", - "3d1a7a06f8de1b92503263156a312e4100b106ad66e228aae792cf90974f46e0", - "f726d57d2a11d39d1d05c780815e33d4f64849015f8655ea514f21940ab883de", - "ecba96fc24a834ce86f7131f712483b40c0331470a4bf87a439a02e0e4b5c1f6", - "723891c8373b7258ddc71ae8591fdb1438f8a22038d12f2fe77b88821be4235b", - "89f5b421fd5774ce4f3d6003bccacf90d63ba8a89f943baf9769395cc3fb4814", - "3c6a1425596a3c4f414a78b09423daa2bfc51e2e1699c8d2da8bb969ef19fce1", - "3ce4284fded60a4b8370d9af346d7a00d7672057f61fd4afdaf5573ea765b157", - "208773fccac3f997492aa3047b98ef2fd5afc74820a6c5514475af4430bb0d96", - "5213f5087a3289e7b779a0b59680828b523c7a855bcc378e6cf3fe2835487959", - "ebb7e2f8d6fba40481449f93de9392388d4de9d7df3159e22f75ea149db81df4", - "baf35325cdd65c91eb8a3e48e4553457dbfa7b53af65e15134a6b5f1217cfe26", - "371ab40e579b7b96d3acda135c6ce821af8be987aed1849b7b5d5c782af069fd", - "1d9bf650870c278e9b3ddb7aacddafca8c43895d0b754c72a6825e773845b28a", - "0d22a20225bc55dc4fecbe0ddea30f4413ef67e965f7803f4f239cae30d84afc", - "d4a2ccad84f2517a44487a3884b193a1e8fb497fd221a8f318071757363711a1", - "06813ff4d5b1674dc4648001c9f0066cf7dd90741e257a6969b17893d783d078", - "e6008df75fbfeb0b6cda227c51bdf240103314f4c5491be08fdd4d9dd13b6329", - "456a09c6db719013dc432afa1d313b76f86becf153bd82b75ca31af67c8dbca5", - "52694cee9e20f0c5ac277cffc9ec38d1e5c74e83041bfe20aed863180c7dc16e", - "766a973335796aac16368bb7f6c73e0815f52229ef31815eb7d0ea909bbde1fd", - "40d3862c4234008cf86b241f3f56c6756fd3874ad0d9a4fc48fe328eb2d8b21a", - "2758bf11d651c5a9d6369c79e68a5cdb576664b66300ccb1f50a02a058959b6b", - "a6294d4613afaeeab2270710d2ec033e0acb7c0030ceae7edd8bdd7a53501a9e", - "86583859667ef1e26c298d9dd351854739e2e484ee6d51fc4af5cd3404b1a22a", - "36fbce462935cc9256579c8a23c0b08cfe0bc7a1e800664395008dd37b09e1cd", - "7b19477e0b71a2afba0348d1b1f8d6b159120fda759a37fac387d9fdb3b244bd", - "664562e9fb19c9a27a78ab368bffad3020842e91bc339a891b0ef73a22441e78", - "84d1509ef1d8b4b1ef1afeb7309ea28a32c438f4c7e684cd830399d08d225d49", - "e972cfa92a0c9251d7d56727ca6696d7d36b323126cda7f5fc3512ba79de62dd", - "73c5485c98a976cf1a4ac3e3dc3fbfd6648131db1a1d7968eafc7afa19b4612e", - "efd9553454b5071434cf34e4e2f734209046f8b72ac608217529b84cbb897add", - "6e09ce0d7cec568afe50597b52bc43276b4b7a2b4cb713d85bebd8059ea653cb", - "a91cc68192c8a7a36c10811f5347e0d6f7927af0992d85353203def73ad76bdc", - "96c6c51f5df2f69818d41c5f96be75b13385102fdf3a50b31ae320700af43f5b", - "7b20ce7dc59659921713af229d903b38703856cc6904232371ccc4c68bdcab26", - "81c9a2b93c4718a15eafb74842bd3b99695086efb38ccbba77244e30ee9bf0fb", - "febc56e55d5005b15558ff33b98849182ce26ced7950e93edecfa7adc9a0227c", - "e5761b2b41d1ed712bc3463ef7a4201f24601a3507e17c2db6855f71b2038f7c", - "da8cfd97de9966e432f5e291b64d25af1d214cf49d5cf390e4a649a0d79cceb9", - "9473b12c6975c4bf30662388d4101a9e4bfa5545442c02a5a082eecb004dda46", - "ff73eddc6050d05fc7b9e4d02941c24e6ce6e49e9c82c598f1022ffcdd97e6c7", - "b08f62a310ee1cd1723c81866fa1a7db701cdef566fb3105d529af7afa701d54", - "65fc8ce60eec376bab1c5345127d3e3ed1a66498db12fc56a25646a8a0006335", - "3bdcc65194d9135c88871bc3666178b560398c780c8728cda5787f3e2794d436", - "4873271601c479ebef61754e7b7da1cbba38adcb586c11c25aef13c6ee3cafa9", - "a862c265bc190a911b900c95b77774398e723e7fccb6a3120d4475d5b2b3ac84", - "083efb4ef4cdd597529ccb31dd15a6e26c6d6152980e11eb2522150dda2717be", - "97bb863256ee6e7b7ad27eabd359dc347c7ed55207ba1534320e2c274d9a1a57", - "42b783829758fc4486f5f017ab2c590e1c558b16de1407230e17f31fc8939e19", - "75d2bf805ad5fb4ba2ceb41a76a1ca479a1f8168743fee19e13032b75d1a6ed8", - "520de377ba992921ca3cfddec27eae893bfa45c1ad4a93abca66b03d29165279", - "47db76d909bd7fd56be2133d62dbb642356db4dc4a55d49ee84f9bd0ed4e85bc", - "ce34833d16d40cd426b8e8cb63cdd7a3efd9e3ef0f77d8cbfadb61e9fe76ba93", - "a511cd9cf559d1b930ea8cecd6c6bf905e5e82288121112f700499cb148dc92c", - "cfc9d61ee3293e86b9d221724a3d4c2db48284026c68f7377fea00000e7f7809", - "3a98135e83829edba4e81fd9f0ae417b48c64549c56f049c0986106cd11219e7", - "f5f8ac94f263b9d05634fea48f8687010ec6436c6650186f27932905d9370826", - "8d0cf0168258793a65a1b11aa70ccb8d4c33597f2a6cf55f4530c6ea4772346b", - "56b9d7d8d193aa923140063957a445f1bb10fd227bcaa803508c308d38bb459e", - "e0609390dc7468ad4aca19d89c91cb2188b3c2d0344756c727ad24eb89a1027b", - "27725d7c24a8fbb29741acee0a9e962f34ba17de1dbeef5c1627b633737117ca", - "38c5da06dd11b4d69669e2b42e8e62aaebad50696a958c0418a78796b77cb504", - "3c7781afb06e69e4fdffdea81fde8f3900d791b4b746fe7a2512643555e53447", - "90d590b44896a9ddbc6d3b141f54ef9b3cad7f4f6f5f269b3a2774c6d32a6b84", - "6363490ad951a395eceb1314f4c8bcd54dd0521b0913197a673c512c3efdf304", - "6faa55ab27161509f28776cd9ca28d32934fbe4845cefbfbfa34150e3c05bbf2", - "7e32d228e3f4b19e98beb12c0fa407b0f56b08dc6030d7011200c1b1b7264cf5", - "366b2563216037bd34490f4b427f22b6b3df7c1c44887c0e7a78aa02dc25ccca", - "1e4084439ce79253844efe108908484f90beccbe858d7260177c10f5dcfe52bd", - "4715ddbab790570734006e9620c6a908fb1893aa8cb674b5f6ab4fbd6b0f33db", - "24acc4d5ca3e7b6b76d67813718ef6c3dc314aeefb914a59feaef1e918bfd66b", - "a8ab90ea1f39a09df6bcaab87ce083c5a12492da1db82d62657ab3f7ed488ee1", - "b4e918e82732704968e2d172ab68e081e4cc9300fba43d14391c0c693ea18efb", - "34e457d6401af5b8be38fef2e4d3f087f7e48dedf4f99f7624d044a25d2d0dd3", - "1ab616cf46308ac3b4e7743c498a5ea763954803de3490d0170a946a94cdcd7c", - "1bdc981abdd8713d37682635b29f960ed8be31f4dd30eae34ab3749f67cc38d8", - "c063940edbf588908951bb6b8699448e3f8210aaf0c33124dbc7421bd0e3a4b4", - "3baa18d67772776b3d67a0a8965cab10ee4cae95998e5fce19f2adc84982286b", - "c3cfd5fb4895358f21cd65cbc403c031eb3ab950be463f266f4252d46a5259b8", - "a56ca2a556f8c3f7d103ba35be525c7acbd60dbe6a469be8204794de9f1a27fd", - "e2e8f97243194a9e2426547c5ebda8e28a85432edf68755582cf7a846656c45f", - "e88a20609486ae6ab40049ae09832a1ec83e94e1338c6f276f04a94812dfc622", - "1cb5be18b8fdee33589383b61c3fc37fa2f44dd6f96d88f112c3f82fe7752a8f", - "0d81153709185afdd7b7a918a2895c599a1716596dbd08156b36ffd80d187699", - "08a4a623dfec4543cedb67dd82a1d2e222a66bf1bb78dbd89b5552d040b9cd61", - "45d6dd6ebb079ecb9440e1e686b2d729f2ecf47814e345e0b2bbc78262e20443", - "b0391c47c9e73ef9820e01409fb7f4d291cc1702436e90e10834d973df58db5d", - "927c91f89fb82e66c93a1cd9d1a5bb6b7c1f2f48c219ce9167edd3cbdbaa1c1b", - "4f7a653fa81baaecacb412d4e0e3ec7ef4fa68a63be2c636a2c2b4093996a146", - "50e361af40bf9ba859d86c616309f8cb8b7ffc77b1c11b378495e3c695aad917", - "5cf1f99b63e608bc1e7c0cebfa442cbe92a4cacea659ec8ace33f319f37f5388", - "393e31aa1e2aec929ec6b3715c9564e6d54b24cd2c904fd4b0670902b4207bf2", - "2dd4f7c3f0c003e92a3ce0bd6d42a3f61a2b0498d1c8b42d8a306f9875327f6c", - "bf4c0799c1dc6218ccf3b9106d9948b901fdeb9103aad4ee126b254611224624", - "c6fca3a3b44ff16c0ec16446240029c21ac46fea0889defe12930dec9ec0204b", - "ae4e289abd45b58d58f994286a53d235b173101a86547da4069cd2eadef90689", - "09e8ba74c2ab23f78262c7ed2709a3426fe3796680cf77f9020b48e3cc98e5fd", - "c758c17515414d33708497695ac71e2b84ecd0dfaf32a1441c6a3139e717aac5", - "d552457fa56ad1862540ab487307f023c258e70243fb335387c1937491bdd024", - "2799041cbc780600415dea75b69a0e7d0523dc032f059c3b24a019041377a2bb", - "6157791bf94c64d6ed045ee85020a88784077643739125099eb87fe09d6a3b67", - "e47bb614b764f33086e03aee119b3e723d5da00db983081ed4bb950139e637d7", - "68195dab3179953f307fdd3fa8cfb4faf066880b97af3a2e211cc54186a34b59", - "c9c0f7dbd3053aa38f73f0b4d76bc07239718627cafdc89ba57ddb3cf1c32351", - "8879beb0d3f2229a315abd47eea22bd83aa2f9ecca13f12c94968727812a89f1", - "4f83d1bb8253b634dc54c4709ebc1ade409028b3ca76f2d4dccafb6bbd4c1bdc", - "46c9db0045fa9eb0cdbdddb8d87a4e5a668e4edcc756808a0a22163aaecd03ec", - "9603c6fe74f460576fd3bd3cd34552007d5a2e9a6f94a2877d3d2a3dc02b174a", - "e053904576afd8c74046bf78d8dd468b4dbf30ac9a5103b61578447604a8f70a", - "46a513f6c80cf605b8cb57de5d385da23db41fb962de0504d971d9800dc6278d", - "33000a4918fa7a59678bf7fc2565eea58fb4091754df82d93b03a5e05ce8ba41", - "dc4b7cbedc302ec21f78b228e93b091ad4d19aa4529a1eb0440833ffe776e7cb", - "0f873eb0ee69f8b6725f57407ebcd25968148ffc98fae494793e0d10b42f73e9", - "5ef8a07a4a3e45fa2f2a388f73b23e59e8214813fdfb25533c0d68c0f2db3da1", - "d912d89899d3b6420a0279c9a1ccdec3116e2b5e0d6048c453358d557fd7336b", - "d5f5894b4b7fe52260a2e590b7b174f1e93edf20a7266b86826eedc885ae1abb", - "485159664450e469bcb7c9fd61416bce345de7c8dd9ae682e98b6f0a7bdd3578", - "b95a695a359f44d55952756284b24a2b85081fb15992bb7873b92773ea59fba0", - "1bce755af787fb86ded42717e6ef97be6584f3212b5226cd9e15c4c9f359a8ec", - "b31a5714a2e4e6c79dfe10b226d1c1ea6830ea276d75e8d419e389199c5b8945", - "ddb3a4aa7c57aba9e4bb247a2ad5971c2415eba5eb45e9c4d4559cbf8dc1de37", - "5cdc1c506967f26e9a72766e50f9905f493981c4650181c46685d9f5db5da0e4", - "88698f25fecbfeef97ece5fb34aa919496deecc91a26a2e7d719917277254f16", - "6d6b89b39eeee52c8d4a840c5915c6827c96d0a66ceaa4a4f609ac787d626b3e", - "113b3d2b72e9c71516b7034bf3ef43aa137be8c539c0601e68bed59ba690f10a", - "5a3b95fd92acc90dab5e45b6a4999da120edf51539a693c655209d1e4990c7bb", - "91cdec97f38ca79b4170afcd414f245b6d0a994866b2f868de49bc76661abb16", - "8c7c0aa69cd97b0d825bcd0217581033111c54d373f2a155d3c9fa3a8f739e61", - "6c3747022e15f617d1067384e0e7419aa2eed83df69b515731281bce59901d6d", - "cf927e72b669822251327547750f86318076f178f7955e149fa32cfc27ec525c", - "469705fcd380a21dfd039b8787a6114cf6b28d1f5365b0bd78da72f3a7ee3eed", - "bfd2de21670e78c6a77ca3e81715bc68a5c8300e941736139790f808125226e2", - "23d052cd4165dc7a90147fb48f380741841054f26bc16e495802db0254eb698c", - "b1ff660088ddaed85bdcd447db813f61b62558c26a184d6b3bc09be9b1025675", - "1874eede489059b92816c9fc92971eb9541504adc002e0f4d79997f6dd9a7b53", - "004d8461dd6afe8f2700d610386509cfd6b0d049726bf6ce48adac888da13645", - "4086084f6bfeac2a5b562a4b3b37919db06b76879eec18926ec3b09f7593a681", - "017846fd089b53989be3fe21fe7e3c51e9840435d7d72dd7a452f7d002d435f6", - "2bb31529918f4a7875242499b95581e5e65b32260d1e913c454cde74cbc1fd77", - "e70a48483534cc7eb46ace1acaaf0dcdb4ff19e09c041b6d0bf815c5ef743567", - "beeb2f528242f957506863c551e90f8921ec0112a128c39f1f7ca6fcdc7b2a1e", - "e18eef59a65a67c72dce35beb3bbadcffd34c1756366cb6b0ffc41a0dada4e4b", - "a1e43afaa2f68182e30b7e24425069317d813308fa9bceedc421e15bf1da34f0", - "cbb632a2b66763523e7fee64c2fda40851d86af11d3b0d600479c90ab6b1e1fd", - "473a4cdb81a6361371d7f04e3d62589bb4d37277164881dade5dccfb989282d4", - "be2b68305228f456cea1fe467c0815a695035e1c88cfc8602d9794121995a000", - "d8efa09939980b2be9d8667c31f0091867ad2659a727763f3d41ae940b770abd", - "78ff5db3bd56b22dd9e8e2858e54568b683a42a136ef3931ab23537f048188bf", - "72174eba5c413c961acc30822ff644de3b6e941d11afb9adda9840ef2f557990", - "e317bf658f6bd35a333c83d25b0e2ade87ded3c578ddb25bd3a34b2df76566cb", - "c0b5ad01c84d7e3bab38daf57eab87b6c23f152cc14e43da1f1dc13d86114904", - "024c925ef1ccad189fce907c6a408988d7ab6a7d98adaed0d394899189746641", - "5480a5a4a64ae9fd851c9fec11071170d86a748867ab2840fdcd5202646dfdde", - "d59f79aeb6665b8b264c1081d146ce853c306a7b9f4373a7aa903b6fd0b939b4", - "90ac631781fed587dc47215cec10cafdf14204989b9862dd8cb951cc7b7b6221", - "519fe91bd29edf6cf2789486ee8b69a4f08624c6f9f4702098ecb96852b4a831", - "1f1e21e8681f7692bbe1c743e7adad3280fe803e5a2338774bdd06f5b55d1906", - "18fa1f9fc5ddf4bf6c3c47315623b16cca82c92f7d9c5d4f02939a4852b240d8", - "f8e8c080e93158b52eeab63036fc83635f472501256a822eda4020dee3f45d42", - "fbf0536a6da94a8afde57b3f50830e8fa84a986bc78b3a06eb183fb968bec483", - "80e2410d4bf2465711d5e31ec11f5055fd67feb55d92988567c2d174657efd4c", - "51e424890bac96926456cd6374ec333b0436bce664a7d34c3a25aac1a27a5f68", - "fecdd39d74cb9f3de95525dd300d27ce44732285674e39a1edb1bb40e8fc7d5e", - "b0d4a7689002e9966812d1e5ca3fffc4045bc094c21c6d16b94660b3e2ddf5cd", - "379efa19045b5c9b0a0044c81fafc7366a0d342f19ae5744a97ed3b6d2d34c00", - "8b46d5bb3a6f0e3ef7041197b434dd56dda5d4bc7f7b00f4b58b8fa248164c99", - "ab1138f199a13a7dd66a403f4cbeb30fef68c9e9cc73f1784f7b683afa16cf19", - "3ed54b79fed06a72f996b773c646f56d909932bba2bb47d7cb8f5a11ece4062f", - "4fb3f9ab25cc533f3691499e3152a7e339fb85b3288de0a0a064b8c09ee123ca", - "a2ad446dc6296482768627180f0d266a2e4599e20f6ed78f92e7a9fa1ebf4d0d", - "1dff9ee5a4295cb8502a4553635d6f9195dbcc4c4c8cdd3e6fc8d49b1bbcc59b", - "4bf388c9db749968f5b469ced6287759dc3e54abbaaa5bdf5d7a7df3645124ce", - "ffe6371f51ec748707c9752affb8402f25dea82ec39be1b26b6dfb3dc8549a4d", - "479ad62b462d1cdb99085520b5db600f1fc5b206f771d61c7e91b13b472e4818", - "a033e0c641917bb41ff39e56965902c6b77fb07a8114111d5fd437a313a0adec", - "f27bf29034633edb0e82c308e9ffe64e072d078e3b50ee5716f6623899779266", - "b28afbe2b7f230740f4803defb3031f1a8d6572bb57709ec62841ddf28afef9c", - "9553353981da71815df99d233c812f7a2053a7a7d4ac478a1d1b99bf49f323cb", - "524fe254978162b02f0df202ee925ea82d9022a44e6a79c5c09efd2a68ace7ec", - "225b274a269a0ce5cecb7003a4b14c8ac30305490d6dfb7087a07a61c5d783f4", - "d8bd373a6e2c5a9f7309dd7e42fe25d48a3fcdd984b2c34b683448c3d45616d0", - "f196b145c1f006b5c7d59520507884d41cf8265036c37d97874d81728cde3f2e", - "231d22fcc774a332cff672f56e8c697aaf93ad0f61907b767cd5ded62f868beb", - "bcf85ffe010898d910f6baefc3a0af66a9a993d681c7890a0258fad5417518e2", - "86c3659936f5319520ebd75a04f0960b4f204514115d1a388d7e6cc8faa2f73f", - "fc71a7d74a45904cdadb863b375ce8a1dd41c2dbb553ff363e6f1c57742d3614", - "a0ed080e0edd4519f039b6b8b1320d736c09c2529f027370b2bdf999a8135942", - "ceb655163b9daae45615d1df3c7f0e6b5d4cbef2f98aee41d1aa44d8a170da85", - "f1ec4a97cf85877bc2d6784145596452abfb7f9775f95802fc728c8ea20baece", - "014ab45261f473934ce09281a1fd84fc96af6695176bea607ebf47a7b91b32e7", - "7b30601dff9d96eae94aa8db209af8f84bd51fa3e05c5600579979a24eebae12", - "00468b4173e5bf541c65b9d8968137ba9599f6c63cd314097aa6d48ff53270ad", - "7e27bf6c7eec470b33c42799a6f462db73ae59be083a5189dc7ca4b4ecdb07f5", - "4d44522e2ec0e933e248faa854b3da876439e587bbe3218cd594aaa5d36ded3c", - "fbe63b35920c40bd9647319612a7567b3a04502e211f98141b26b4d66214bd71", - "f3a122f136258cd44545ed53e82f267ef6594bea423a5eccce1b18ca1982294f", - "c6716c661679409fb25b3bd5031669852917d72c623d1f49bdb94916c513e314", - "03b32763ebda2baac4da1d904196859bac56f11641688ca30bb6de5cabcefe5e", - "d77ad316942e912edddc7ed70063c7378e860e5dc5067c92ab48040c752dd26e", - "eaf773bcb696c30f84f0ae5acd21dc7c737e0754180733a280c3d12d3afe8f96", - "4aadde6ce353436bd67dc9b32ab94c160cd013aecf0e08a6a69d75036bb1e2ec", - "dfb50ca9a523bb7cf6dd456713f8c652f1f18ad869165388b98a771449384625", - "0ed5c65a63842b8685c3b1f35608d4f0836db28f94db82a7f6ae5feb0c000750", - "60bbf4f56e42d7a1fc84133fb5529b75e707eae01189b56a5471bc90570dfc5b", - "b96baf06f69365a8fef5a4275111f29a5c7cab00d5bf9a83b701300118d9c275", - "c36bd73ba71813a5eb2b33b3bf32df01e84d8cbee2504ba17cdc33f01500d5b8", - "3a630822b6315f6530c71e81b352751039449c4728d7c1fe82eaf14dd0aef725", - "6874ebed66fb154fe92618169d0bbffc50ddf605550ef636f04a1eb425170f25", - "dcc35ced4a2c29fe55f416071eb2787375c9dce844f6b89e4100337230c5b89c", - "5499ef4f3b6f452a7a6b17b45d6f2343af6eb91186e76c6a07d904910c797f60", - "b070e6fe71ed039c3184885e761035fbb7f53b215fb414a5a8452f7b4056fc51", - "7cb1600fe1996f74eeb21dd94ce85eb5a41b21415c43f286ea0d4286570f0f5a", - "ee4ae4b6ad23e4b429ac829e3e3415e2a170983078a8bc98ccd4d40d986aa13c", - "5b26cff0686aa6b8b32228bf183829bff8066f4119c7e4e45122815dfeb0a0cd", - "494eb695c8601e3101b09e4e50a320758cfbe8a09d1a1d02b724afa77544ea46", - "e4a84d933e5495fbe7d84d08acf11531e4abe8e2403a531886ea0ed39d6c20eb", - "531cddb574b093887ae3ff396f21dc96373f7c1600c1af4fffee9b797d1720c0", - "804f9d43f4a7899bd6fa0e17b74b89b3b22952c05d4e9265634ed5cc905f7434", - "e0f79d3c25db1dea844d5689f138eb1c02f5db77957f70aeed5634bda065c726", - "752d144a8000eb9768b8f98fa5577dc99ee48239b04cd2ceff35214a4f861ec8", - "ed427beab99f727d61b4fa4aa1a3ab92dd69e4356ab6154c7b2dee9019de5ae4", - "5da1be021b13e7dc02aaca37ed9ed8b96d8985dde3adf8717535320707ee02c9", - "a93c7ec2cb9232e4b3bbe05df9cd0b844d17b1636ef198b066eddc0cb8892cf6", - "b3ce9166970bf3948cb82572d09c5036f7d09c82171ff1caa98a2cffcf540cc3", - "60ae5b642a8fa27c4e312baed4857471478aa816cdbc5a34f8b2317908644881", - "ec6c44bef14de87c91de33b6401e37590f9195b600253a1bbccdc8da9b5f898f", - "53cad0ca49af5008c0d0414e3f1a5b55f2fde581bf381f6df0e74e58978bc54d", - "47dc8918a7e23ec56dddc71b177f4be0c3cdf4e4dc909b5b5f38050d821bf1df", - "8ba41f23bba94f89ec29f28d39693f905e1051174e45fde6feb5bffd859b7d54", - "fe1c92e9acbe67e19fb374d5b1746af35649bafc22481e78480f72b38b6dc5f2", - "7e261eb61d80378acb8a3cf4148cdd46b1fd61a2a37c290365081f3445b43590", - "f49100e1ff7295a54d822e72726f4f39a93493f56142b049247f636017109607", - "08247e5503a08a4acea56d25cee975e212db76fb2100854f28af180950e0000a", - "ce595cf188bfd16f1e065157837ddbd3ce1cf2bff9a5ccbd27266d4d327e5bfe", - "94d263830e4ce73dce823d0132927c33a43befb612fedf96337af0928b008786", - "dcb06d35032da3cdef7e8471eee657a367748df3b8fbde7e110b6332799af133", - "99be68ce7afb48eac13e1b659bcb7360332924427e8122d11592ad30f794c246", - "27f5e571bd0c69939071115092d3fb09f217ef548c27219da5904f2f8fb83887", - "3c832313bef1dce7d4e88eaedef4ef702037a322b1bbf2c207cf5cec2f67618f", - "c23a6b6bed03776da5abbfbbf5909f91f6561e6c44b37efcdddabeb167bd11fd", - "764227863ec42a2cf1a48572559e1f11da5e17f5472c0770404163399fa610a9", - "45379447e3c28f1335b2289c4c8eaa48693b53c6b9b22eb14f1d822699fd4e6c", - "286b2f9fd28615ce3199b7265b676e132061f6a156d5a769dcb26c6f5fed4399", - "47a4534c304b4c2b69b81c3721d86e9cc39a7f92a2fbf7102ea6655d11ec28c3", - "6bde9f0aba7d94a6fd53d5c4c7e0aa82106ce317c6d12d44b1259e878975d39d", - "2d88f1e8c9e9bbd4ea5d6f6ed32f49e47f2a35c847b9de10dcf191844aeb9c48", - "b8e826c4a11c1cc63d27e9d0a2f3c073d37bba901bc7f415b4316cebd3b6f9d5", - "66a5e8cc4e88645bf6259ddee07493041b61fd00dfeca4afde9e3c34d7ba33aa", - "3749c0f490537d9badc85e2faa972919a192e9b9a8bb234eaea7e7d86f1219d5", - "61cc35d97d79efc5a7caaeacf6f9c5c620cfa89ed55e48c8e5f696844201c80f", - "ae92a432b1f65504477ccff8cd1b9195cec2287fa35cf3e26d24b44c6031891d", - "98d7dcd03b43855f035a4572cca0bc7db04c902c3a5035e1e32c14fb66bfd197", - "210fd11353c83d4e836f93002e501ff09d9d4163b011ec8734ac4b62bb2fa1b7", - "d327abfd95bc7ead096eb9a82a23d3d7cc145f927d0f95023dc4c8d45203f4b5", - "329531297eb4b5c7b168514523efb0c4b798d2c2a03572af77257ecf63e98038", - "7d04d1ca80c00e81a8d1656f2bf0808fee6b828f957000b73b7457bb172d6568", - "0bda15d92d3261d6bea6484bce1801e694c1a1d858766bd9f8035687dd20de0b", - "d67369bbb6de64080dfad660ac202c223a73195ed93846e8ee946291c3087011", - "51ecab9c36990b8dbb45586040a22436d58cb3e4c19fff0c880d4dbd968f2b0e", - "7f7de0b5100933f960add6b246b241999ca41400ed0fb7f39aac8163d638282f", - "9a0c8a1e24372a6312bbf216ea0907b2c340324c960f254f60e16a1b739423ea", - "a0cff64230502ee99ae71a845927a7746b26ee0f450d2050efd6eb8d29808deb", - "87376f57f39cbf5f6d16e6f36716a7ea88a3f4bd80806d0b8435ace04256d5c7", - "c1f0e17739a943fc03435f0506db6619fb057872c6d208f1802af7cad4192f9d", - "83e0e7b01ebb363f3d3fead3f53b5110338cfeeeeada728a8e5b3d9e57072c3a", - "03c708acdd1802572a78f8670344398c72512b589c8524bc01025d97ff4927ce", - "1cc05665af23e9532cb7852cc8c09867608c00fbb45c1a3d283e20f74146da67", - "518cf4816c330e6c0ccf7f6db7c746fcd4c9c0925206201ccbeebb41f6bd5e82", - "ad4c34ae80dce69e45754b7bd801b9ff7226f61f43cf2b526c0c1601ab501af4", - "166b5fc35dda5e2a9fbe79c3b00d6030a1e7519e724ec9551e1286a58fbedec6", - "021961f180ea6bb7b99f3548323010951b35ff46746c034db4536bb4e1750311", - "0fef6ef43a86ded9f4b2ff35495300d808c945cf73cfb1b16b270146e9c5b22e", - "7a7d4c78eb259209b41324e7bfbbd755037ccc4008600957ed77dc50091a70cc", - "6c7c1cdc90fe93df653f827eb2d9b89859e60bd0b5f7f80c36036755de69ae49", - "5939c31e7b23d07b8ca0c90f7488cfa24cb6918ec156577490599e838b7fd908", - "4326d265fe4649a10571d3c58b79dfe84b89794fa8969d429be3e5164a5f6633", - "63f1c666969b954677fac25966c4a8ad862d59131901811c4f3855b7abe37a45", - "c53b7698d357d271b194ca081b36e5ca259d570d503de9f2c583d911704d5925", - "08cb880f74bd47e6f4743f9ccdc54dc1cd1cf199a71b5322c91a415b6e3b6479", - "799b5e88f3fe8f4bcec7c8e0f09ffafbd012c42e71165270f3458b0102c7e698", - "9b18d5d782627faef3cb3ad4df389e1b6d39f5d954652b25d283115c6342e581", - "1182499c77bbe038a72d6c2ee337a80ac852a3cdae829e9ef04fc408d4ff846b", - "d9904cb02496b2461026e00584f943243dad3a8aa8a026a3a2b957277d464dc7", - "ec642d709a6638ca282d10ccb154cb34593e76bd2399a310973c6622c7e0ac97", - "9611779770078d49972cb3d8bfd7565340367c8c0784d312f718f50847565c70", - "2a3054554d1eb56e588a5ecdfd45a396069c1e5fc628550322f05c30bca29afd", - "07536e5e9fc5d6e67ce68cf658353717db5360b30b65deb2c2cc9425db59656c", - "111e78c49dd8b39c3c148ce0c2de841cc0ac0090912c12f96081c53e684ffab4", - "9f5fd4bf7bc1aafd04629b1d5523879f5a5e145ed27101dccca7c19687c97cdd", - "704f041a63d27f6a8923ff672529c6c113421059ad74394eeaed24d45a12c462", - "6d216a3e0d423bda69d8f3d5a2d47ff184e420dd7c2dd30e1fbb6c45de1926f9", - "c0d4e67a9e642a80be1f6377a542a8738938bed8089600a6b9e46626147301b3", - "a41413613e7989a304b2caa180c4f89d64af9485d05866659fe71cc11dd4188f", - "55eb84a846db0ad68aa779d0ad78df56f0959075309dd1ed98cbc41f73a34a28", - "a88e4b7fb8a20d768c790909098d351e70ba32aeba9bcb879a4e0abb35d12889", - "cca330dd80536c53de1e05addb62b06706ad7b4d7f5c923d77038c259cf19edf", - "825591b1db62839e4711ea78d6c2e0796c671b8322402af50d48c14b0ad2f4ab", - "6b43c29a045f97af311a7310d4843f33f93d5c457e699d7375f12e718b5093f6", - "6efe65415c60d1f462269d0cabd9eefe993b7a9942d2bb2d490b8b681dbda41e", - "510d2779749488e46a67989248d30e9e2e80488b95596efdea673f04d4d913d1", - "f5247913c1393c2432b3bae80282b10fb4bed6dd7ab9e1a5c3b77bd5fcc9d5b8", - "0f1354ce7cdd9e3e2a2e39c5c36e4289d9ac0c09b9665e919ab253ccedcced1b", - "88f86eb9f7fb7f7c080d3a48f465d17e8f77be8fa0609d24323fd16b1873949e", - "1c745e927cf59cf67c4560b2ae8caa8d05a6d740e5bab9ffce785bf611e06155", - "6b0267d4ced8ed81754702d76d12afe87f5c7caa8ea07b362a3d88ed261fea3f", - "35c5cf338ad3c36989b62de63e5330ef71e5f1b409f2f1db60d23ac485587971", - "8e3bc02e4db155c4b00e8d60c931a8cfc55d901a4f56480fa4b805eb6efaec71", - "da2cae9e5e8e11fdf9253ec3f0d97d654a942520ef2cd165203dc9751ac991e2", - "98efc7926af9613cdd7ca05d611d87a7cf7ef57c66efe7ca0f91a712892b37da", - "128cb3def5916f1d2e00722a48f0c188511274184a4fa3df8a1f0deb16e49049", - "622bb8e754c38524241739bd40c227f49744dc051b90da47e0d6a886e44d76ce", - "3299727ae4d7eb281e51466abf384ced9ebbbd858121938966a4663ccccb2bf7", - "e89bdbda8a8c30b8536fc8614e664dd5fb20210ea9e4019be1ee09324f4390a5", - "f92b87b478e9c6d20423dd98a0e4d141397186a4ef0a38e65a45921c9bb8fb60", - "7b9b077e7ff8b479827b26e2e2548b1733392506351e854d6138b574c17a8afe", - "ee40b18003c96de55d9e695844953413d9cf81765466fe53446a7234449a2a17", - "32184355fa3645d4106774cf59cd65c2e8d25bb9195013d7e179e8b03c10b690", - "84bbb45b5d7f7c95ef6f06812957c86bd785c26691a1a9ac0d75275a55411117", - "0f4520944656e0da9d2bc7fd6d40d0de0b8f263c6c27cd9421a728bbfbe6982f", - "e411d3affa1fddb4239196308667505dd8c90752b1198f69522e3370a08b1365", - "7519042c15f618d9929ac81481dc8480fedf41c3b07a6a8f1b40637f2556a50c", - "f715ef0b9e88bc398f94f2e3cd67a2da32afc83779f156f8f511ffd604ac8a15", - "c99c8e4ad7886a10de594804ccf3d515cb0d8173e09eea7dd5fbb175ba775555", - "5a25ba2cf7caa2ba645550ee9a9615599b6cfd1c0a4900f76c3853585f3bf981", - "206a8b5e5f62a435faa86d9a7f0a50893dfb619a22d017e36d60d238861c8a65", - "f82dae03bd074e3daae8513adca457f1ede5b8c950610fb0f0185e6a9aa80245", - "7f51444430584a00f31fee673a136cfee1ec2dadfba174150e995f986287afb1", - "cf0b2b1ee2c5a31dadee2de8d63eabd397db315294f8932651e54fa74168a77a", - "1ad9ea97008b20f4fcc752a676a643b8ab08b269aa8a1617d7bf42133088d77e", - "80d0ca0726b31dfb6fbdbc449b8e8147cfbd0f7862d9c0ce3993fadb85148dde", - "23f504858c1351ff929878e931ddc82bd192837135a02d73bfbf9e8ff9557453", - "8f98e34d177d685ae87d71def1570b504029af322f62530f18473875962add9a", - "546103dd436acaa6ee748b529fe7217ec93e0b5f2c5ce7d6afc439f97b62f035", - "48c5029bc8524628fc523e070adbc8ba53ba05495889a2c45963ad4bd7d9df79", - "4f7b2309d143bfc49ef2c8d242aba7deb9a2982a2353d5af622e90e0bbde012d", - "1c97131dc3a2a5d94fd7d7b6863d1acf66d09676ab25d5e3530e16f9f4201986", - "112bdb01b6506b52abdee40718bf0066ad1fc90218298b6668403a6ff963185e", - "5e311bca35f04ee492455f54dc5049e53aab6da2883b7723ef3465e026528d3d", - "17139e2dfd0e8a3879ff8fe704a0f91543dc022fd69dade761a05b9c9f6e3a5f", - "4209751d731d2fac33de337bef41a933f6229c5ac3dc4ed5c5a63851c4343bf2", - "bba19baab03c66be4c41c9f5ff083a2791a8a5832c58c32706ff9ece6d1793a9", - "5b4b302d0041bdd14e41277f491b8d3691838f17d40cba98c58c49821d7cf114", - "2be8243f49f9f2ab52d7152762c7dade41b604b28c96d90e3351566cdb731e17", - "82dbeec09f0719572ada2796faccb16406a63320b8c4f2f307df99267e0913ab", - "5e4b30f808451c5385d32528838876cbf684b09b5c020bbb6ac5e77ef0742cdc", - "9e668f04e891c765c40666dfe5671dc6861ea127e504f8897a38c96ae911329e", - "1dab110706a9df10bd987d40f35986654c3d6b289fbfc80a7d9b44a5b3fbb5b1", - "a84995c66ab7a0362dc59490efb05986961e0987c4583cd416cd966369d7ca53", - "b3497c5d24d6d0d493cacc4b65913d20dd69ef7c0448eb22b18f3f8f48f1dd32", - "acd098eaba27af16d9c672df00e4840b35dcd6bd936fbc51dbcc4cabe1238a98", - "0e553830f9a9ce87408c80996298eff7596d095e89a30d9f4dedd2ef91c1f40f", - "8c3d1824ade648764c9cf6a79629c0ffc4635265450a08c4efe34e5ed22de398", - "032acba5003d86537df3b6da031a2a14da6edd4b9697c89a5cc3bd2e0f3948dc", - "fa460e7f45a673a246e536c00f5dedb2803a5555b4a195241b478835e89d2600", - "7bc51b9fa70a9008e79d41fdc5339b0410a90b2d65d3f8fdf5e8e0e9974c7789", - "95bce00c6524725e9802b6da44ca6e5be6616661a54d0365cbf30a0c69efbc70", - "c20ff540025788a9c8db2169351d3b8ea63ddb9a029a88c32b8aca3bf5e5c4ca", - "6a1f4d3b26928f108f29092cfb45fec92d9f0856b098e5adc324e8f940afd6ea", - "6877a8c5b3bf3a8f130bc8d763ee27b385f3c6f59574fa2fc8f0039b4f6ff9ad", - "62d69e8e3916a42c9d518d7ec14e41df5f4af8ea1a8981e6f0ef5b8fd1d76f0b", - "a9dc09a56166e10ce02e470502ff2dba96566dcc195ac81cd9a4b794d57443e5", - "bc3443adf76bdea00e1d753529e4c5d1cf3791647240b5d9716be3a9a589dfb6", - "621ede5332d6456ce6a7b69e4a919bd1620d8b58d00aa183c3075fd4a11390fe", - "314a39d9894b6e7127fc6e077236d39764a8a2a622df7a11848f55df5e08ac60", - "b9079e52835188e8d75660d93c94716ec1ee1b1afd84155323a43cdcaeb99674", - "17a1a8588c851d963a3322bc60176683bb643e5ad2b94dc5fafd5accf554e2b5", - "0b17b2057afe1d1c30b655e850ffbcfe9507116800f72d5c8930fec76f6292d8", - "afe4556bafce1ded5ec99738dde3296170e60f3d6e10eacde627551dc8226fb1", - "b6d5926bbd4bf265c37fa8fd62673e969e7e2d45372a73f729a5a836ea860140", - "8fefb0f3d81a8745f79864f9f5401eb39c79db260e19004df69c5fa8543c551d", - "7640747e67530c92910d87950b5c6d4e2ec53f096349014d93ae6a00fab0cf58", - "a5f3227ee33cef538b039bf08304cce1dd4b3c26ae0a9ebfed962a15678fe68a", - "40c2d5895070a70cccec149697dd68f0c6b7cf1ce66f0deeb4203e881b9af297", - "a24ec2b7a63fc067ea9bb1c00ff69aab3621279fc186253d800bbeb83ae02d2b", - "d06cf323b9cd737bdd9354782a98f847f145393cb6f07e8224d95729112b80e9", - "2db378efdca0df49a3244586d96a4fb6588a9ead16c162e312c30b2b661897fa", - "701b86314472384b20d6e152a92cb79baced18ae4cdf5c42ea62e20e65b545b0", - "990563d5b2383cf785d1d59d91367168c33cd89d8f4980e1079ab284a14f88ef", - "3ba6fb2e482f8bb27879f2ece97cf02dfda7a6c1d52c94f82ba0f228f183035a", - "2884ebee737d18616622bac73754afdd4230b1ce239602f2b47236e4d3c8fb21", - "0ddaa49a7147dd2316693de11c4e164f5b66d108d396970a23aac85f6aeeb6d9", - "96af1e2e95cd9d02763bb2a85b60fdd76eb3b5b8ad882bbb32b346609e0adcf6", - "0cebc54f8753188f872aca52e4f76f45de16e186e349a03edecc54e02285b81f", - "2eba102c924bfa618d6136bc7098406f72c73d69358e425c97988ef5ac61a700", - "6b351746a791593b6fb5d2ee51a37b4f4822ed3dd21dbd16d14147960f76eb58", - "5fc7f0022a1ad6cd6709fcd954bf94515fe65277b2b4c4581d8c53fa8c4fb986", - "6fed872241193e98f1d401956d2305d4dc209bd93ee10c038f0c576fb40ce2f6", - "4ff58c8f46e4adc1d54904c13903f2cd5025222dcf1771f7ddae0245c62824d7", - "f151d7e902ea43729951063a87b54df462e1a2a803294e080d0bd385eb0b25c5", - "79af6b721d5da210d08dccea3dab3c5024cd155edef82082f6693eda9a639041", - "afbe2537aad4dab6180d3b1e6f84ac92520253386514dedc4fd54fcc8281d061", - "954e326fa12bb3df4129cd03255fa279f15f6c083f63d5910411ca3af8cd481e", - "ed03179007febefa47713c37a78d95d19ca0c118b70ac916d44c9f720d0e7095", - "b2c4cea49c1bcb0c6081d22518253f66b9adeb6dc34089baa17639aec8b0c9d5", - "4348df38f540382321c6d7860c00de653fc5e03bc08254ad7e4833cf77092e72", - "d181219cb227bdfa79716de45f2ead44dc8b0e14a540f59e398036b41870e030", - "86b615626bece6b930a813684121243819368f2a1e52e6c565dff95c19ba2aad", - "81fccf1723a7efdf36c4886112d33babd91c0ddcf85ee30b6e708a841a193e9f", - "99a61ce7f58e4908ce12afa971bb256cf89a9ea9b556379c372bfeeed1be4a80", - "67fa16051ad6ec403098d32bb565a0c432708ab51a68f6f235675d10123ec0c1", - "3d8b2a3f2692b3345ee547d2a631a51218794e9a64ae2afbba638a8becf25da9", - "cf0dbed228b821282c094fadebd24f4fe2fcf304d5ea7bd6a843c6e2ba89588d", - "0e07b43352ba5d66cce35b1691de446f7ad480f23c0b350de77bf9b4d9710fa1", - "dcd09139c329fdea066af9d6d307b190d5743eed9e7fbd4b7ac8ad32d5fd9467", - "80e10b1a37129f78281cadbad7a669b50a9182263a47acd6830669037fcd0523", - "32ee503e98b4fe728d4be5edbea1cb0dc06cadd49e8fa4ad6bddf8123d164787", - "d1e3e4145e35dfa1a63c7416d88753a09dcb38f5be75dfda5319afb020717a29", - "4eae36b71fc9a16ad108eba97d20de8a04c669208e4390601dcb5902838a1efe", - "cd4cd540eb9dbafc5a24cfaefd7f35bfdbc9192c0a0dbae06b710ce68cbb0849", - "45b13ed0bbc3aa2fc2ec47b828066b698f4bcff731eccb0282bedd28ccbe37c8", - "7778d4ca77ee739b8eb14b656b047ea285c4495e7afc449b9cd24c5dbc3d96d0", - "a1c049831c50c4d7d5ed35e8c93b3cfdb889c34a06613ac912e60c4db905e0dd", - "2ce27d7e480f4abdb57aa13ac83b82c131e11d6b822c73775e5bf890a0f2c6e1", - "5938a5906eb7f20e7d9690f1e655069c27bde77b9847ef71feb0c1333338c8c6", - "25cd2753952e9b35ae79d917136ffc2b55df3cc8262b6eaea3a23ed9dfd009d7", - "fedea9d67c5892da0abae2718f4d389320787aa633686fe851f22c9f60c55993", - "a7b5bfc32f777c08ee1f54f785e91f3950ed47d0f283e126b1f3f18fac96721a", - "f689a02a053316682bc89d4c490e4e7ec502e6001a1c1522cc88d0fa9b00a4b3", - "116b07fb68c1575ad6113f563841022d41b81e0158620d0f5ed147f2e2cfba51", - "f59a13520813be80e550c471a9278d2e0aec956b934c10c8ca2e52df327e3a20", - "b111561030417fc032ab0a9790de5121bb5577f8f22126b020a29b150b4d259c", - "dfe584d9f2c7bf89cee787f1f917b0383067cfef7c7090165bc7ee0ed4a274ff", - "c761be7b1dc670a7f2956232b58018f9ba486ed01504186945278d24a032a538", - "861644b66b79fc271376b6bc079d7d78ea80c95ba3cfc5d7d34d65fb7a921a20", - "c62abe7e78bd5165edddafe0ce42641050034be72089c5a2ebf6b202edd37bcf", - "ac9e4868145bebafe31a117c38d52c0b646a2b0ebdfce85d62af5f03c94d4353", - "d9fb1a336b740f9a596bbea1d159b5f3c1eb6f67b0c9eca3fbb8dafb35d8a0a9", - "72c9e0113318d88a5fbd17ebbe8d4acb49849855390b0b90f3c2171dbc786173", - "85c7ad08fee6110d0d084cb62028f99b74bc3b68693d19bfdd5be535f5c41d1b", - "d927a976212c9b8c272034cc31a3accbb23e3eecb79093d7eca8a41eb98a749c", - "106283d8b48923bf4409a910223d44f90094dcaee8753a30306545a08b9b1a0a", - "8c23b15918e438d21d09378ac933468c5bd23728b3e0334447bad36831a1aae2", - "fa82f8ba5e40e8cf9b045d5d2c7a1b2c01b0fa8b41f0f955d7de79a8ba4019c1", - "a28505d64c33ac73d7269ca1a2a46addf8a53cc61357665a4d243db299df554c", - "07be827c6ec64cebec0bae8812f20b7f199a6c4798db2e12feb0383ca4117160", - "54434a4d28f20c3329560b9183240e9a209a4f62a537f77c797e056306b41dfa", - "9b0fd29706790ba9a46a9a3250dc287da476fa574cbac383d4b1cf31e47e0134", - "6858fed3e7e2ddf6f6ac57afc807d46411b63ef5f3c625bf69b027406acb9f74", - "1f0ca5209cf900c7aad41be737dedc3a02092c7802b23644e4411564850bf4ab", - "5f94b2af71b014fbd23742ce4373ea04b0da1c15e15d6183a2667d8d2bfd28a7", - "81ecb489e211adb8db4c66eba8a1df6f78e12a0b45a12f997b3fb22e8cd56634", - "fdb78b4b776758c207aad20e2f55c504a68173618082b3ea20feb70844b3280c", - "15f2b858236ee44a807d3bfe259c4680ad7ae39ed1b2c7edf9c5534f9f2b1c24", - "a333240e19aa54e1d1c0cf93bdd1a7ab96daa20a1efcae55bf6c80aaf76b0e5f", - "0971a3944a6aae407d44e75897276565e78dfa8cfcac8f590e8b7087df1a369d", - "cabe7b36353110a2c471b42af0c8450e758a8d63e506fa4d4f0727ee0dcc668b", - "0bb9627fcfd942e06eef274863c12e08442817f6e4e3e8327ad4eeeb89430771", - "a70e6bc22b08600f6c19cfe11672f1c8ce69fe74f3310a58222f426361ef5686", - "f7acec275c86b3e59625ad248afdc07910b7be8953ade963a217fe7cebec9c3b", - "84b98d2ccfecbe76125d8e38c892be32ea87982cac84036a9fff753b2fb5ff78", - "a0453673fe8cb7d755b633e79f4bd84621d10c1cf285819e57ae245fbb607ee9", - "a61138b3426d829b8fd46eee65251c796f4229d5d9485c879e6f48a48b529109", - "116515aa14c382558e6aa3882e1413bd911615e0239c1c6f2a837d13a1bf55b5", - "f77fa7ea784d0b3dfd0a1d0752d05fa0c28327bd2085e12c030fdea8bfcd370b", - "df1dcdbc4d6366b304caa1c6735f4f6868ab418173e1421481100caf3ea67b99", - "bfaaafff1b652c7d4b91bff9cb2cd498dabb0927fb9afdd885261e3dcf997172", - "6a4d7b6e96a05ca338dc9e9ce1180f03e58985e6dba63fdd68834ba05ea596ef", - "5f008efaaeaf652c636cba1f5ffdb4d0ca19b1f458f63d7cf45a2640f021afeb", - "cbaea5b3cc9572add0010c48facd9b5f57a0f80f25ef0dc3c92dd8394001cfa3", - "6c69b59813ab6b8f0264a464924e0a81f497fdc889504c935f4a87448b279f78", - "880b575841eebf8ec063cb3aee710b3d28399f6243996fedb2c149f6c89a5fa7", - "762f7ecc3e6b6e450300d23cc099de4a7cf8ecf744e82af034f704f48b11db79", - "c0941df70277b516c11734d74b518ee212ca3ddf9c17eda61de0e72397bfdbe0", - "161c80cf49a73ef954e5c3514b71019bbb9c8e6db55147ba65cf0594850d5a15", - "c10cab9f9059485e23eb94e4f500953f3142048d8eb1eca5e584c7ea6098dd9e", - "dccf4176fd0001e2b40d8b838fdb328f24ee19f77aab609cf9ba4bcc077deef1", - "0d8bd5073f0b65234bc74e812e890449bd6c9fc877feeda76f162d46c388549d", - "28e0a6c00fdcc1eaeab7cb9a17b7bceb44f064bd11f8f85314d1d6fcbfd22657", - "ca144bb6f73244a177b185372ae66997a9622a550f089b987cdb6c55a61d9e22", - "ac5d53c1ce4266bcaea5d05dae16dad1ee697602a9b09dc8d8ca5e672a6cf1c0", - "f24ea87662daf206ff820014dcec53585e30165c88c04e51bab1611b48429543", - "bbd821615ce2c380bfe14ea09d5435e5640d261137f182fe2aa166d8222ba3df", - "e1beff9c93fb0bc30abde75acb4840b98333a9be17a64397d18690f0bbe56380", - "2095499c29cd1d6d0cb1d9c03bd933dff10054538e537cdc70be49ff60efcadb", - "e11e616b7232e0362eb08a6300ad85f9fa6738b3e2e1706c1da186541630f1df", - "1fa6d763e7352f5013a12f3f03fa3477b61ebb992043246d2e2d0b0acd1338b2", - "e90e6d7109009b9c6dbe0a9c0137a1a4fcd567b51295985bcb2367c83390857b", - "11e99b361c9eaecd6b659b225e3c967c0e61671e38acfe756fdc36d0f166b0bb", - "d8a7306b1ac3176e0d74fbc9f802d56a971d8c15d90c5b5bf1a6ea65cb559dce", - "16bfcf56edd9893116d5ffffc7549c94b134f08f44de3b84762c93942703b417", - "b0295a1c56dfa616db48a17bc89edbc447796ff7533763e1d5fc5589d238b218", - "69eef57b12f0a3139c1af3de79cd7e34562a39bae95cb7c63eee8d5a4d418dca", - "9d4986a1cec1b0ca4496ed8b5d85890f4ebc480bce26ce8073ac8fcde12369b4", - "53d585eeea68589e91680d6b14baf758c326c3dcd68d55d88f0aa5e412c6326c", - "5622041d75d85e6fb3cfba362d40be9d2766fada7e9be2a678302ba7493233cc", - "9f57ec596bb1be2d592a341b6538e450f153f8508800e81061eeab7ce73d3f65", - "aac2e5ca13da63fad93ee5f69eb481d099ffff891349bec9b84daabbc9719488", - "f0c641b5d4d30455c7021162b4e576effbbc40154ef23d4363384f306de78960", - "b468212ff2ad64eb98c5bb95c0587b4c6b91d2a2db66786b3443e078335e2982", - "4a77bdf73a0b062a0c5551b20d9548285b89d6d42afccbc3e200d434e5df0289", - "a080752feb06f4e452b2cc5ee119c2cf104e783c7869c80096bb986d22817b96", - "631d0561718db7615235e99b271a3f10c15cec90f865d5000a52c9f136e1a5fe", - "dd559ba045737ec4c06fc244ef1305f09a6e55ee6ff108e51b97e9de5cd88965", - "9c72e634661900a3ef5445ae109daa94134b13b0100dcdd4255d74265d47f794", - "5b0131e2ba0ac9e212d52ce3e65f75bfad3574a7500c16fdd14cd4d0fa74bf12", - "f10f1461e108c0f13c95608216dc3d09008c2b07686c45a017c787c3d90f3a92", - "3dfe6a7244c758259700d6ec07aaabdd8c11cfd99449f316d2deb3ca5a490b25", - "3a8f789bab4996b59b400994fc36a7df64a6d22b3e5bf261df1b765caa5ede94", - "5c3810732d2eb0eb5bd40414aa64842257decf9d34a68d983c57d4c2b71c5f7a", - "126452a553deae6abfacbf6919ab261f3a56edcfb67eab8aa3ab11c27bb2c279", - "a1648eefea9cf4416e121c3e8bb3e43fd6efbdb04bd473e57b15e4499276511e", - "20e776c8802f281e4755494cf02706e83185c3b1e88121c7e5958cf1b8443f06", - "bd0ad919cb7f3943f9439794a141cff0e29101269b5f5dc638d2b512765b4459", - "c798796882bf2ed99b1ee71e8b3b004113bba40738c8fedab8d2075e51b767a1", - "73d145ed1a3a2e3d9e72e8b3a2a6925656f3ad7bbd6fd4bcdf23c55506d2311c", - "a3b57e1f2d206eff63356b80006a98e27c7852678ef9bb5c5a9f9a1e6063f63d", - "ec1316c876dff390845add38a89db656724764f0fa4a7e78699de4ef1f9e5ebd", - "849d3b740048c1e1801d35645f2e0f5a3942e13fd1d0a310e26c79e1c93fc5e5", - "ce7d12df68ee747099adf050d7eacd463ec734c64e0704c9135c1dd3039a3698", - "77b256410a0517fbcf2bc82248797107a0808959c73e5a6f8500ce67b91d706c", - "998d78e51f5ec25543ae3762ce1f8aca51b58b4cc17527d639cb1143dac0e849", - "4b5753a87d97727c8c73bc2cfd9c149c8254bedb9e09166630f7967725a5a81a", - "bd11d9df9958bcac4c1e54e6e4a8a5be144a960ac9e1672996f6f45f51f834a1", - "c13ddc18a15cb22941b5b550442fa662596dd6189e1513c74e137ece27626aa2", - "5770cc8f0960497f2870499235ebaf9b7ef5d54a99f808db498d44aefdd640c6", - "1d5d40980e6c110e64ad633f3eb5c5c838653c90791eb43c5a5b0c4eaaef7484", - "5dc50ba6b39c4cd9e0de05a4608e09d1e62a99ef84e41df046cf2f10ef067830", - "9397d0b8f91f785d926af55725f10ad8e767706274b42dfea01ad5504ccb1f25", - "03f021104a76fd17e5447921b7d5bdf107a53c15d1a15114ea8158ed88c64951", - "1267780d0ed12067e9737cead89cdacd2e25dbd9be8ca1415f357fd152749f49", - "6ff8cb11aeb810b3a538a52ec1f44a06dd613c1697b56f784345ab320d641373", - "e7ab5415691e603fda2d861cc52b58b653aed9bff3e8d119c6e8b05d742dcb01", - "253d93f289c4f0b0cbee16a9c4cb1bfe51d12cc6785cc55f06fe6cab7e8037d0", - "d919a8afa80d3ac3c28ff685a865f3b75c6520c7989f91a21c14d3c0217e7d6f", - "e35bdfa2389de81694b75a3fa56696316ccd8ceb53b7ee89d22f04fa42595d6b", - "3d5555b36733848aa76667c55ced89507ddb507d1e1e486bfaec94eae2e434d0", - "053425a37362367e1f14e7c26b65c59ea6135b0a60449272871e349c99e09052", - "efab34952be8fa3dbaea6ca40caf27774da07787f23522e8e1cb8db273b98409", - "000901f8d430e64bed3a42c5b8aff5d10495c765731bb5b6dbe8da8bcff5c507", - "8746763a2f5688341c16fd1d76bae60a880c1e3c7dd051335b21beda796546e1", - "631ebcd7a91d11149904c0978e704999844b6ac02367208d10cc123d9b65b5f0", - "189ce2ca7fd114e034cf5d59d3065751287d54b0033d45494dfb3ef964160bf6", - "558d91e2c5e98c097c9b99a806c72ee4b670416cf58fdf37c87ae457b52d10ea", - "79249170cc92d8b95abf19bf700b398f537f0b9b574958833b1d9a503df2f361", - "5c5f27689c20c570be8b38b95e5c27fd95d90d7f9431bc64a94e3a930755974a", - "e2ff87294608ebeb03c25b59e12cf57de7ea40deb8cea1a15950c4112e9028bf", - "92ed8d01f83dfece2459c4ddc7da22c09266de9caaf40598f28d72f1867c139c", - "e8407ff21370211a18414d30a1926efc0f10a0dfbae46c8986dde9ea8fe3174c", - "d2b04b5f64cc8bb56975285bb7102a30ad56785e13f07db59f35e6f1f5052777", - "20b24945262f5f33947984ff7eea07768d7219420afa9825f3ec262e325fc81b", - "975711c01afcdda845dcfa2db2def5149cb6672a4587f2a4e5e0887ec493b9c1", - "37d68e54ac2a7b2b716cc4e2676c0172763b40072d1df322a1323847fc399b86", - "8f39ab16448695c50c4073f79c2468d046119cc169a3b3187c1f1dd1626cdd4e", - "d3d3137f10840e404cf96434b06b34cb036294691758ecb602af1903c7c3d442", - "d16b19eadb5cc6c7008f1903a8686ae9fcedd9a6af5f692802ddf1d6008d0434", - "1adc7ec9dd633f95ad3a57d2c9fb593fbdebf98f4deaf55a29a1872d391ccbcf", - "ec191c35169c03e611582013dada6432c6adf8bea5e30babf7d444ab86ee287e", - "9071d5f647de1bbca72d0af362d24fac2c2a380ad73681e97b533a0809e4b864", - "ed53f97869ed2a34ea51ad04885c7d231cb871744c75b25d6fed1453cf90f690", - "5a22d480bc36b26722ea38ab2ca67eee2379a0e6a7af895f74aed5988d0c0d79", - "b4cae831fe92ea1219ff8110d46e9e2db6eb661a1198d7421e910fa636582b73", - "cf3a4e71d607e1979c7cceada38fe95ce909022136a85324fefd71b3e805d6c6", - "1fc1833a0edf288f02360efaef6d78b8725aac5378ba1127d8930f899b76a56d", - "b1a340447920d76c31e0a811de8e10961d6955c1ff55525d543294ab62972501", - "4755d2502b6ff7c8acdb058e072b89cb1a9e24e2ebb65cbdff2d87eae51165bc", - "ee90b620d15b7fbc6512fc845cac57ef6e106c99defd69d5cee62c3837f89dfa", - "54234f6f1fff93f662f98ce4ec17d5d8f90dcd9a70d2e5618c988d38723f02fb", - "99a7e6682308f65e173bd8bc0fc384cb3422ed9902ca1f4022326ec1876ef6ef", - "bd496cc83c6942ce4a2c76e50f7ce77b6ec660e5cb8ac31067809751e1633668", - "35f9c8f1ae868a3ae044c88062c8a191627421d9a9a37a269e19ce0305f7114e", - "85c0ec44d6c0669b1fc3911e19f263d61d2fc8255a28329e50f5a87f512628f8", - "a667ceca330bdea123eefcfd29370dc8a14b61d7da3f2a42f5759824c817d927", - "b0f6f2d8b0b9b5314d46714d651bf3b07d3ac281a3967f4ad618b385a3b93fa6", - "a9b6a9b2afb38d70c337afe435c4bad0bf06120bf7ad371f2308bf77c0a5e19c", - "c6a53e22e71330200450617c179bba6cdc6de4bca770ee5c6bd7a87fbb18576a", - "f7e5c9c4738614aef6c9cee2deba7c31841fb90baf9fcf31cad9a7bd7363fc60", - "2314c3d9a5a5b85677013490ceb410587e7415c28aa34fb5a6704abb79c243e2", - "3c7f16e0ba64a481f85dfddb03680162939b27f32e072640a5107f94799d148e", - "40972777d110caf7743579f19b535dcde750bab734024feaf75cfa1cca2d24e0", - "f73d7fdf68a554fde5e3c60730c6781c8df61b88dca0aeaf27b5039cd14f5f45", - "6d34d0c49d175d69cf197c8b9c5eabd01b91e7df999e55a9e9ffb93e56ad93e9", - "77828d3547b98dc5b46538e100516d40b688efc1baca72bac965d9a2db385ad3", - "bc7cc1386011470ba750e45fcd315da4bade16dd0997d33928f67ccb47b297df", - "f55f6844ed16f36f2db5139a18dcb0244d8e5f82f6a62ce4d9cacc157f7e7170", - "f74ddd4243f819d6af3ad03d928b8f7f387644c192fe1855dea6f43f6fe1cddf", - "a3c248f53263380662a15907a0fad4494aca232628295bcd1e5aa71a8ecc28d9", - "85522ec376dc39b46b2c3e73604871b10834caa984f14feda6a51df52959293d", - "d910eee5d810d98f54b5c1e81b64138fe9aca51c28b5c828871ba93cfbc65533", - "f061c69a029234fd29c2857f9c9930617873579701ffd57d94503374530d9c15", - "bbc941b4563188b60bcbea75d0ef9d3d03ee0d2ac9051a0aa566cfdd881ed5c1", - "1fe4f8d5c48abd465e41b7b6dc0697676a9a13db83ba34a835aa23f4067a889a", - "ce2b8fa4e7d3a09aead76e0d233722f84c603e327d98d439043808fcc6cb3a41", - "de15d7f6ed6d45f303aae009707dbbb69d02db46cf5944b8e3d8bb1fa8ed847f", - "9bc0d3714c816727c1be160bf94aa81f6635e5fb3c7f25a04ca8925842588a54", - "7f2a0350e9a0fc0709d1c5c2c7c2626ba8efe68500f937dc6e4c702d70b6c069", - "b6b0b98476576b2f60ce206923c92c0550696b6d8587574c424676d2e1853677", - "4768f3c8058034b5a528e55f3584fac1ff78195f4bb5a4cc05feb15e9447cd7c", - "9d96252376bbfb96d6b5f44e6a35a5ca443bfe120d9ef1edbbbe0ba9664c4be3", - "18ddc0733008b8ce86c5ff4a0ac2b619e174119b8f9e3bf26abc19e6f5b5c8eb", - "5c56bcf1e555166365ce3dc80ef67eae348eb394d781509dd521ea66f8c1e2e6", - "98336317e533d64b64ba5fde9de6927a57707d9fba4dbf2787cabef8d9d2f4f9", - "d645b2121431846a6f3f0c43c09bce724f3ced147195b18541b039ab4d267938", - "6d691f6432632d38dd5ebe10956aab1ddaff6f32cbf9a883f3ad8baadcd9a286", - "3fa0b1099370d0cb5816af860bbf8ad7f824691b76f47a21d6273750fe62cd96", - "12e42909e8a6cdcadf18b2b71ba7cd85d898889cdbf7a49d52a0a6e2c45146fa", - "beaf9cb6312c472cc2a8c0cec3e1a68c7cfb88335c88d6db8b556510d4c64c48", - "36c7fa20cbd6bf35f942aff2ff706b7539e036164dde55da7b49b2747ca04418", - "61a3dade450a97b30fe50ae3af4bcda9f379a65ea4cfab1047da4f55adfed951", - "4f749884f7e6c2787d4e21dae332a984771fae274ba269b4dbbd9d3209ec88a9", - "310c027c98a9984d06e9e15b1943996e764ebe39f49feb842009d056474db7e3", - "aaf275325baee08b80034eb881ce1cecac7f1305d0cab7e45d3c5e54acf77bf5", - "f1e0660ea0e9af8b455c777fcb2f64879a7e9b8146e170d8d23d5218fe67862f", - "fbcdec7837b5a37078a316b40664f3fdb2dfd82fe3a1a88cdd0a03ba7736fa80", - "4350fd190ca5c2c6ff7efc7f61a041cf638a3f97ab729f7197e6c0c677a83f0d", - "427d1678fb73d440a1e21dcbbdda69e276a1b2987c4f06f8b108b421b1d368fb", - "184d89c11e63dd43b50bc66f7a16ba1c6937fefb5a1dfef25a34cb2776506b02", - "cfaddeab1d091104491b82a33b5ba00d1fe6530ca77f6c056ffb03a2c7a6fbaf", - "803d7f29257d47ffbc11fb75fd56da85d5e378de140b95111b76df945a55a02b", - "2caf55093d735f6f2ffa28bf6428b65833fc4afd40848594e85d54c856bf5f55", - "d512fa739ef95fb9df7b0063c4d3855ac7f46da9b401a196666656b6e340f872", - "3e8d82f5c11ef6366e56d45e00ef96764633460d405da2ba5df71a3bc490ada0", - "0422d3b4f0990ad0ecaca643ab3674a65639e0142571a5cd16a3818b4faf7191", - "9160940ec59e06473da15ec59eb4e2c0dc57592c8a9b4a6ec2f4d5052ab83dff", - "ca2aebdbaa566265631366af272869ce7bf5f2a9b0593d2dc83c18262589765d", - "c63b1d44622e18bf0b0d13a0095fd56882353b267c1733f43182a84ca926389a", - "6dba23e7900b30bf25eb88e890c56f3e0301300f4e2c62e4538f1a7c18198676", - "781512e083702b04a742492a570873c3d381b0a65f32d189b114cd7360774ef3", - "a12a467c5e0454a7df84879aa0405442e075df043822f7e9b2a941c186c26479", - "bbf8c2f13a968b198544dbef0cde958d836036d284360fe6e0522a204cac2bfa", - "dd0f9bec5b823b528de449932965b4f54e925f82d4dfafa81adcc42af08a3d13", - "de6e59b40255a1d8197fec983284c691747179a9fafb139d4fef95770a23c66a", - "8021fda09a1ebc793435f8b0fe8e67808b7a95f8cba82e1aba43f9cb2b6dae81", - "af4f27c4e71b9ed502a3596121943ce8a2693e9ae3dcff44aa4615d28d182227", - "ea488062a197ea35d7439f7013f74b1e2b012bc2979602c734b4bc1da5ba4554", - "879f8f124305154e0ce456436fd6a180114af7e0389867d0ff604805fb771d79", - "1e5802854575e2672699d1bd00703de0822d035f99bb799a77068df1b7bf23ba", - "732c6f9a440db5ffdbb85a99c69e53a31f1b8d98c8d348876c4e28a8c1577eed", - "09bf729317fd60dc81ded414431381fb49993394ad1b0c87be1f0f239ec9f13e", - "8d7fcecccb91e5980ffc5c9d8952b7a34bb5f291ad52e6e4615f884af2b3aec5", - "d7833dafbf404d3bf27704ecc14b68f76b131672d3a811a6826c1fc29b776462", - "bcf4a702061e20f4deb5c3e2d9a58b5d7a12a400bde4bfad92a92cf167bbeb9e", - "e9a63744bfa70e565fdd825b4ae290ced142abefcb58e4fbc0365e817dae0d3f", - "fcda92672a563ae8b01ef72106c3943f534a78ecd473f7559f3f776b7b3f5e0d", - "55a02d8e8b2569ffc7dc444ab40662cb82bbe6100dfd33311d288a9fb278db87", - "66be5bca1bde902eba3c1a61b4bf15006bb349bcacebac1451b6c982eab39cda", - "04bb502b838f64d70824bd0176785027da44f5f72a518412f4b47fe7d042f4d3", - "b021702c64a8be24f260de7455880d0979eb913effaacbd7ba56880c65fd459f", - "f5a5f8aa1e1f5fbbddfb5549cd417f741d010f0d573313820cbcc36dcb027e10", - "dc136d97fdb9b34a36d4b825ee88f664dc15f69eefcc511b386b96ad45c8a1a3", - "77f07665126daa50d5c20bdd88a94c9678008298d44017195191bbd8409e3fea", - "2fea7f640ffd1223d0c52c0faa5565bc9847faf3977e526f845e315d519ed75a", - "229fabd00a29a9bee0f48096fbb3bf92b9b67a75cda255cef5848f22ce6fe3df", - "6fc245c05fffec12e9c0a40669e901eb0295585a4c1e8df5dd53859e5dac6d15", - "c43d2a45805d68f5b3810b96cf555bbac1b78c0aa1aeb30e071068d6c59f5111", - "db9bc85d59b65978ef9215ec3355fbc9b8d00dba95176d2f8dfa4fd18f819a3e", - "c8faab8a803643a614c28f371b83dd028e5cc38668c2723b9255846b844553c8", - "1eb80fca04c56b63d3e30ffa166a91da55724bbfafb4f3d6777e3aaf6f139614", - "f144bd2408db31cbb151479ca1c8cffac93aed429d473c440b0432ad63d173e8", - "efbb19588cc9ef4f8b3567cec7c9850e3bd6df480fa9eb77c709aef9d40986c2", - "e35ac54c42930ff1ef7ec984148d30c9f8d4f1f7a202b1a5f4c3a955e541cd34", - "5b56e662ba5ac10e882115becb51869f6332a84e4d293e08dfd75198bfd74414", - "a4a3da26dfe22be48e903daa728f4829de6e23c2512e4938b245d258677ab0f3", - "6d408a25e65b7c8904d8bd0d9572a03a3fac2cc28557708009e865b26cc12543", - "bc1532f109868cd07328a65c15d240ce0e2e2343032fef59751d14d0299b3d0f", - "1c5b7a0a880d0a8264de6b952c6f4b2f5b29ee740eb57e8048f5e614d684b85f", - "0c9061f49dc941508fad585678a1f1bd5b714d8541b6f673780ee7897d806ebc", - "627d922feb9ba492f1ba8eb288da8f944673e45f8babda857266400e115fd0ae", - "d220fb057a65ada597f58b52ad0855d1366086f7af6179fa3d76981a23769b6f", - "0dda0ac935ac0d44f8e657694a7f83333a51f66d5d82583480b20150d528ce72", - "d8b12f3b907e830b095ff20d50205cd6724e5494fe836d63afe5c1b5b696726d", - "8a30415ebd95b36a8c4fec5a65f39805c9fbcd47175d5b53cdc6d11878a3e14c", - "a2438e6ac8950cdd62870a245808ec4ddc0347bf446f3e1186774ff4e2abacc9", - "be86b29def637cb77f504517f637ea97eb0cd40095507a824ecd37efa6634530", - "f7a457849971699df20ee7431af93186b3cdc54215c5f613bcc658b788206fb6", - "106d903a6724623e6692e9049a739a9de156c8d0910af62563d1652559fdd0e9", - "649b7064bb39ca61b64900e8350d9700e3cb653cde915375140ae0eb3041ef6b", - "108752a25b63955cc49d72098bcef7530243fe886fa06d577c5d52e35dd3f91e", - "00e6b6a492badb767787eb9c244dfb67ce51407b127d0618f7de37eb4b98114a", - "eb70a3baa9cae6c8deb3be3409d4104eeab72bc2ec9cce417649a7e30d4c40b5", - "f8d1acbe4aea1108f3ff9ea7950fabc39cdca42d8b65b95e6be1b76e25ed2b1b", - "b880ec65bc1cce47904d83e2b49908a37c178873d1ae9b182637c891d451ca12", - "099bbad6901b213bc92486a9b3840918fc325a164b7977bf406c322a72e6d4f8", - "da16e8b31eeaa3ccc7a064f14fbe21a98923044bbb1f8060765c65932e923fc8", - "58b8d9e38d86170c71678668af883635a53fdfd90ba71769bd06ba0fcacfa389", - "56e652e2adb13a043dc65033ab6267dce4c8b305053e90e3b6ba07025ec7bbe6", - "65c431f2eb0e6960b6f3652aa8aa745f6c2b97850e3c5e07b5b5178fa16111e7", - "2c9e5673953808f24a2da81ebf281c61186da774eaacc9e4a31695bf8ad9230f", - "6985ca489ece5629e6df0eaccf07352c329c2f39ab864c94adb56d6b718db9de", - "076a83cd0692445a9da370f06eb9cfc0aa76eb85cca73e9e929bc689525fc17a", - "d708e6ed7218e1c5f54bed3ef3f982c59ec0159f81a55216db2637e567092061", - "51ce8ee75da31a089a105b5a7d72c12b694a7328ea47c86b868ae90eec593bce", - "c2b4bc04bc61618831aa296aba044efd07dda23e525c7fe57dc0dd36c865b824", - "26f0648eaef923ee23b315e83c68ef0a7bb531e9741ae39f3f5aa187b092c1b6", - "9afc11bfcb361734ded3457e7e3c80698999bf86564bce51235da78a63665c84", - "927f3feafb8570e7bcad89528289b22d3c3a505f48b49003b5e991a411cfb7ae", - "5f077b6f4053086b074dd38db097dc81bf212cdce9e5c3a0f1cb76ced2ded9a7", - "dd7c114a7c8b74b53ba906c78f0654963388b32a7448c361608d3718182dc989", - "c8b3ccd49806aaa969ec57b4b5bd5031d63f298b858a8929304ec87d99e410a9", - "dd214f2145b0a9aac11ce351807de597b2c94468277739d66311691efef946ab", - "ef42a739ea365deffd9012a2c6020d1e7243814baf23432c7488565cdae43e8a", - "36df04714a4d0512d4bc8cffe5ee3324bc3cea0abfef749cfd71ac14ece81f9a", - "86fa468e7c4379f9ad6412d9acbead36cdcc3d9cd0244084c6d861278e9f4a96", - "3047e1992d19de6c6b820b7553400b4b8bdb9e6461330e16f972660fd23d1e98", - "fa500a9eb1fcb5e190b3acaf562e0a33f7fc628df903536406dbc0e3878fff5f", - "2b9dae4f91462801457d285e96d161967da09c7a342f49aa23ec0a7a88fc0ac8", - "164f6ad0eeb464827839e8238787ffc43f5fb5780ff14cf641d54f960ea0e7c9", - "c71b62f79028b5841212e67b4836af059ea8d130d15c5baff478e3b9b6ac68c3", - "572c0abd9fe7bb7886de92b021366950cdce27c04a963674582fadfc540820cb", - "c6dfeca4214884dda35dafb94c1bcf86864060482571131cf0d981cf6e1a3737", - "27659bad3371280fe3a1110e2b2c329419d594dad42c5cb4d461cf04ca9d6c87", - "9c3f0002d574293e68b4c638129965bdf64bba307cb9a3d342886f2f60ff9a09", - "bd4baf69cda8ba12945622101d206996137819e51d3784516a2b4835e632af3d", - "fc97489cb63c12fcb2ab93cb7278b583510460f8b1c5551e65aa3f62eed8e332", - "b07791d226d81e46fdbb594ae0a6c25c3fd69862eea45317751ec23b9ee28446", - "32be96d0288ddb1bd8ef988c6e07897b145f4e692b738ed7cdaae09fe391ec57", - "117a3f483c5d47720e263b1dc42fbea07ca90ba8178a93929ba12cc55df35c9c", - "56e618f2f3afe950fc797bbf2bf8e2f1a48d32f57fb4f03dc3be7a33dd9df70f", - "631d17fb204b36fa274720efcdcfbba293c40845719ae56513ecf6c103ce1b18", - "7c58aadcd5e12d22a64022ce9f7a2e82e8caacc7091042929b72de117a2e8676", - "6ad2e501b63e0f1b719eae0f7fdbebf9ba639b6adaf23d32f6ff30ba4e5057e7", - "1af8a0ed9c63ee4b04608df109db0bb2435145a2addb6f7cd18dc0f18e8c3d93", - "25d691373e4003ea37a5db6ff8ba8882faa53411005a1af433dc08bc3db12205", - "6bf2daa9c57789c038bd7d9424659e201fca01a9126aa397eae152b64072ceb2", - "1d5d40d99f2e4b50414f9baf4325abb11c1cf3a8e2b9a305cf1bc9c6b2a5265c", - "d12628688af582819c4a2a0fe1783c2094ab6cc89eb0ef8371009a581514666f", - "c84a440c176fd1e5d612435bc8e35cbe1bf5d198445f6257523a4a06b0af3ca9", - "944bda720e9cb31a2f31f061ddef45efbbde708240d3972af0ce3b98dfaea8b8", - "75069aa27c968495514bb4bc8208b9afba7615791c18bde8c75b097ae8d27f65", - "de20abe41f9985769288c8900338ead92052168910b61022229e87dcc39854e0", - "6c2153f1b24cc69d4b045f514af7865c3a55ff9c79418844185694279b68ccda", - "7791736c8c83597c50ba81c0f5d9f2a2b2cb386deae5be75c136e47d9095dcae", - "c37ff80b232ac257335901bcb651cf6ba7b43e6864737c568497d029d249c7fd", - "53c6fa4d02df352c1072e263891ed0f8412e2be9c15946e6463d355ce8c1b4ea", - "3c030ab0adfca9b313e810b0312c2800faeb5cac564711f8081e0f2f8be853c5", - "f17dc52403ae9e7ce899a8b8eec4e43f1230bfe9a89e25d297ab7b81b1c65090", - "2821cdff19b1fb45dd177ecae64af3f7a8807c11869f74bd28662f4f6f5f1aed", - "0b82018a78452036bf0ba7333fd38cb8af551805c85440253a32ef47f9f3ae87", - "17d3cae3cd89b9d3d25022049481322c8003e300fde67c549a562ab5190f1450", - "5f8c22b7d5c3c9d406070bf5a65cd5ef4155efce1c34a2dc2068ed7455db1a03", - "04fffe1369e25304071ca6c45c4a5b8a67d655a8015dc0efba2f743d025d892d", - "945e958af779ce7e72f2f6ba1afe8c86b40c275cbdb2a7a25570d1c511b6ac4c", - "681ba8b97d49018354d5d3eb61b9462d4289102f4871a45d9565cda8fd801899", - "778b4e41df7265ebfefc444dd3487b46d396c6fe1f2fc115f89c0efdd603e2e6", - "fa129b0c855e5a65b202ec47a40aa6a3197031b3491ef06b18ea9be31bb31a92", - "73f96dab75892bd2c7755dac95a972ee03073adf15093428881749a2bf68832e", - "598121fe890d33aaa9baa674858d27192429ae29c8db15c72aebff90213d5c64", - "ff7a38977ac1ca181e913d30e9552483844a47cf44305273450e82ed15d00793", - "23569fa9411d9c73566762208e33b9947464140f2a6738464c9278f4d2e8a3ea", - "c22b8e4a984ee7858d33105971c68fe0dda2800872c71fd25f925ae5d25ee868", - "e17150e833259512fc5b8f4dc87a06b28b39a3b503e6961aeaa9edc72eed8e07", - "fb04cf5840a3450db5d4845670d89d080a81ff3d805729c1e349b4a7ab56d24b", - "90bb835dc84399f498898ce5793c15fbdf2bcdd78d2e01b43d68916918638e7c", - "84846c4866636c0e067a331df93706ddd8a19c62f3e02d78e45a2aa75738bb7d", - "7cf52aec796cb6f46ceb857a3152f29691639ba2de5649144869d7139da1fe73", - "5e42006b0b16bbe8fbecf5753046b0f7f3c62c2fc02f59da3ddd7235e9c1059c", - "ef81bc5f39d05ce3e7a4f2008da853a196104059a926b0942b4dfc4feacc38cd", - "493cae2bdc65b10ff085c607ae2b59655d25b4a147e1bbd3a9921b7a84728cbd", - "5225aa93f4e352614909495b383e020ff5a4c84d01f2d0cc297533a4b6789f42", - "932d63577375a77e75dad832454da2708544d53171a2469a65ed88bc296b8028", - "d875eb2829c68644844ad7b3e49347fe6b0c86d3f0ab3bcf41dd3e8664fc5b6c", - "7335c604e977ae30763cdf940dbe8f6b216ecfa9e5d38db49d1f9dc30713a1bd", - "8be3ec9d370d07d2547ce06c46f506fc550e34e2c060c7c741ec8f1af7b8fa75", - "8c61a55b7e646a3fdccb3af447d54e19161c354c936b95c08662f7bb3af54c0a", - "976d14ff6c13797016f97fbba0b2e9fc27bc404ed1e5086df084c0923649c31f", - "0c867dbef25cf1604f32d1084486b3f27b97e25d4acd2a068791ce4b30de0e2e", - "bf60195299e4e7c89305ca9078a0ecb87d1d9851c5b081f86a728e7de91da7bf", - "d2a2bf25fbf50fe37d6a6c036dd01962d1662e3a4321707c2522b3fc5e47339a", - "9464721de6077104f4cd9bb7a4032c915ccf8bc2b68cab6451d250463ef540d9", - "fd79239247674a868819cb663dca2f48795310717731e7d7871928c4d92500a4", - "23afa2e05a64e3fcdbe66f4632fb07b24cac7776da6fa402ed3756d4933bc912", - "059d05b4e70f822b0af3598ffc5dfd3e8bfed83b2420c487630dc56fe632dd5b", - "de9cbf506d793ccc38260796485dc7ada4f5a9eeb669c3c808ee1efde42fa158", - "5a3b00fb42a82ea9ac424623dea481ebc17a8855f959b586d66a33ace4ba2c74", - "af9f2208c9d2b37aebf29a5215608c80fed6c56048b86fd3d300b6a0de27751d", - "72ce34da42affbae5997e2c9b9ece4d89576a76288b13ccefcce11d1093f9163", - "2a4055a05167485c6bcdd809f6e0ddf82d7f404e490d409dca2c916e7ce73682", - "a968a81e44b97da5ed1ab7d8bb9959050b24caad608bc73ce47da0699c6b2fe9", - "26bb6d7a0390aae4f103e689c18dd77b829c493004e9bfa2c6c8dc95fcc4d272", - "438830abd9f9c3a63f600720e9b3372fb969db6873ef9983d40b66aa6ddb46f4", - "ee59d6da5d0d8057166d42eb21231cc1a4835c8e041a14acc2182923b392fe68", - "03b00fc297a0bacd951a1bc651bd3f4288104aeca1a4585e010d8dcfac4a5afc", - "bdf45a5bec602b34483252477798aa5956bdfc444082407e17780bf8f7e4509d", - "0807c1e665b74827377d2b341a9296bb532cd86d876c7161d4d6f4286a275fea", - "158bc30af2be7ba4e04a67d08666ff8edf505583fdf1c8af4f856252f95dee0d", - "4963526d9b7abad81092942137118a6782ab212a2f82814c385901e8a63df93f", - "97213074d798738a43ef52153474517e10fed2da72827a8f125d5073c71ed1d0", - "2ae65b02d15175b92d4ef25856ec9b567a2dfedc35913857a7b031ce46dfbcca", - "05ec768079365b763d0612c5eadfb15d71c76feb1ac0e85dc070ccf36b02b768", - "e6e4fa3a892613746221678507288b3572abf10a6de5173c1a4989819b1d0240", - "b5fe20af6142bac09832a10cf02ab822cc8242433717ae05cbc73a584275f574", - "018c4b95ed225b8749086b798776f9c974a11a91b9ad833a64424fc7bc557e78", - "bb4689e8359504e77fc2e69d1f5480003da36befe1460c4a1df88560e5ea950c", - "4fccce90cab532f922ae13c77071a6506d83b2f9fd8559eec1f52934dbe6b908", - "2ec11b460a77e15a44ede218c8ed30cd8bb610d744ecb934d69c78c17f3b4a95", - "39afddc57b807b97516b385db395d1bb08f67bb28d09a57418bcf8ac4c2feb88", - "00b33a2b4df81489b6ef8a0b251d354beb7c8b3b51aae49c5c4d451ac80fae7e", - "6e84f1a406f593835687a13e5ef9073e1f6021a3152ecf325e310d69cdc15e21", - "70991f5a96f1e38f4ff595bea395a7e4cf988eeee4ab4a5cd7e4dcfb5cd265d8", - "6330db7f8212f288ae9ea91f40c275516a5dd8f491d4218253299d5c2daa5372", - "25e3e5249f41c55f78a8d9967620169cc34139e3e3dfb654dfc6496d67404d5c", - "ebc76767e0af487ab3f16998110ee64386bfe6dacbb94b4fa7386f2bcf84857e", - "3361066ff51fb557fbc87f5d39f101a37d93d43285c8230be4ee4852667e750b", - "33b6323432ccce7609419bff65a25ba5348d2a4fd64cbcf6f50cf97b04c46f36", - "032fa911d1f164d330e017c14904e3ec533562cb672194a667cbb923eed5837f", - "acd01868f96dabece299df29204d0489fdb80e17d56af0245b79ea14c9642d3e", - "770b8120456c2f87aa6a1bc670a0a2bdda11b79ea309f81c5d03903df053db8d", - "13708a47e7ee50ab80da8be4d82a182a986ccbec085c82283112d5512e068e55", - "99e76171d2177462354db175ac92a4b7b7454d5749a7eab368a98aad8e9f4efe", - "925166bbb18f7a043053dbc3cce57b7a6207699bd7e5b218309eca8a13a54542", - "1a6f3c023c107e3482da9ec2a76e3dcef484a9b5023d32f4390d64eeba570e25", - "07b526b9f6503a28eedd19619731170b6cd6e76f5ddc1b3dda5cdee160e1b518", - "facd2d4e62a31b3a627d5543eee658529d9564a57b8fd744ec8ee6c06e21be97", - "7a4b42f0d7f9230fa3bd716832fa66aadc2b9819ce614cde9583e341a602ba2c", - "505c436029e0b53fe006179d7b70c88ef07795f9da53b53ddce72724c5eafa7a", - "2f2ba5889a5b944cfc12ba4907b36d8037f68b1a947020c5b5cd11dd85706d76", - "2925a64e65c06fe322edc78174bc28cb8dae9d7bce899077201ea7aa2c9b3dae", - "4d52195679106c596d57f19f58c7768619786c7b61a19619f54bd1f127dcca4c", - "c8b900cddbdbccf81a4cbe90af9adb4c074a1a327addb45d128b06011ead0da4", - "0dc7315154b711189523eb028a75098fa67c0e6fbc50254e15e13da906924e47", - "fdd9e430f6c24f64049a82281b78974a3abdba6c22a8f338489c7e2cdfeee42a", - "483e92987736da01fffe0b68f8bdf6fc8f1e5908b0df5fd057d8f04688d572b2", - "d86ffb98de16201ee11978a8e930c97acf7fde1a73cf186008a8b47d2a2508e5", - "b30edec906b18577994e402fb54443d5011d2df0caa3ab2ea182be0411003bf1", - "14cb9560b7ee9525ca0760fc5201d79bcdb9ac54d9884bf65495b492380881bd", - "524914c9821756a5feee23ef9892084e5fef09f0c703e79ddbe1f3b314b43b06", - "3bf981ede7483feb13fedbe9cb7b6453b987a338617b17216758dbf4b3f4b4a9", - "68b565fe60bc3e847694e0711d7cfd3d4e4d48522c2da58bbcfa7db4ac4c86c3", - "2d2f04eb2b22ad5e253bcace0f2adc36f4546d4a176148c82c8fc96e99afff31", - "1a371a3709c529243bc8f1ec5e189491ba8c7a077c9147e4deb8ca7254433f6e", - "ed9e4b57e7cfb6cfd4a940142b32e982c20f7d073adf11a0345efcffd229a0bc", - "7693ef8bee47d14b4ebe4d28a79305ea4fb639f784dddc67bb8c034fd954b6eb", - "c9c4e71cd2ffa210dbbc15edc7a1737f1df10de2138bd5c2de856b778e74fdba", - "0c422402c7a15e3fed5f1e7a5731bfd44dc9c8a64fca9051840f1eb198a29936", - "98d4ea19d9f8c9a6ee704f8487d3dee005dca2bf6ec15d5fdf54e86041b2ecbf", - "7332582bbf1a015e729c51d8d7864eec24f20847de897a76a1121b64628bcc27", - "dae18c3cc8991a8d9de364ffcd249f3901909fe7e05e84787481fb2a7a11f770", - "1239ca017d5607f8c86ab37f7e1e9eb2bfdbfcd9d1a0ec81f9f8595b713258af", - "0ac1aeac542108265e21b672700025b193022bfa0ce90724a0d9b82289910329", - "d671c8161f0590f829aa7ac8b881c777b37621f4da35db74907c0d8790127387", - "623e344554bbcb45b62563b79a5a246227fabe42052403e2aa5980c11c664d2a", - "5f49049c9519f0a47e1b2bf53b256ff9d9d173c9200ed77d10da47af14a8a662", - "565e98bc66e37bd3786b9264c135b94600bfa18e7ccfb5bd700294e68397ff98", - "405f743c2ead48cee731906c6026f6de2268d491e4c132b62486438ffe283c8a", - "8c8a538b5996af053b8fcd1bae3966f53ee779ba63796b08b8158c4178c52b8c", - "78b4125267727aad974e28c8d31338510239d64f0881fec441c711ac09bffc9f", - "e8d55681ec84190f49ec26f7e49eb8540bef9c05e7aff21dc126d4a82ab79c08", - "95cc51eb74cc0d9d83a04257cc6a4b09e3066d83b18854f08b215b80ccf7b749", - "a24a62775df4ad27d1860890b03d424b60b414f2e89fd1840bc982838cba4b57", - "9b81093a07b707cef50b2a144c60d96100b83e74bf67548adb7b4ef62b60625a", - "c7379df0e52441676751c33db7ab231e8fa2973e2fc6653a01468377f1f3ca65", - "f5ad679909415e811215938dacb55ceb6b688dd28c1eafc0982e600fd2249a04", - "651be03eefaf6824656caa6f289d0fb74b1e350c988e823e01922cf179c41213", - "99304440c7fa996cfb6e3e9b6348d0721e3ca8ee78f72e1adf83056fc2905724", - "584cc98ba66800e203316687b4944f25dc98f08968583ff35e02a85480e28da5", - "0c8c095795ce116ec14102db05814a6cfd3cd67b10f4a141c05db208115570b3", - "700d29288e4a547efc7e9ff22b53d751330160fdf418c50fa398af7fd12db2a4", - "665c22cb95c5a6d0399182655cd1454e2e0cb1f4bfbd32b3dbd4898c09614b66", - "39c3aae3f4092651a54b4ad8fb2c03d275137b72f9d0f2cecd54c498a9413eb0", - "678077ae16d54e390f30043d241c12b3b51caa0e7e4daddb4c2ed1da244cb2d6", - "6afbbc6b4a13f788f53b8af6f52898f4379bc9d10ebc1414a83a00fe8e9970bd", - "48907c148644cbb37936f0ae7113fc2c0b6a02938390cacab17f3f9eccc3644c", - "9e4ffa1c5d832f620345e14e2230466228d7af697237a0b10410dc04972d45ad", - "b555dee92a6442c8980b116e2c0641853a6c24ae120992ab0ca2d0e74c2022ed", - "3e3c5d322f494005bbef328a4961fee89f246916a9cfec207e2df05d243c9da0", - "6d99f82cfcb42a18237cd9a27a6db025acd44ee3e77db470fcf4f03431c9ef5b", - "592678914bd6a2994d759103c318c48f6cecb00e501b742bf7f63cedff679454", - "9582bafe2f51ce96dd2ab9ebd10d2c82390e5805cdc4455bb0b66e6ca91e334a", - "54afe1b04fdde93a39f7ad2fec849668fcb26fa481e8f3f6a9070f1a236d614c", - "2936a69a930e5ef74dc2a4fb7cb8b1cc3ef9a476f8a67243eea823bb6d4358ce", - "8d6a773f54f7a2f4be6c22b8f0439fd028a0c334abab37c3ad08835f3d7c04e4", - "a14e0200ba9dfe93b4b94c10e87b6f2ac90085a7a370e8b3ba7b0406a2da54a2", - "636a8cebb11b412dcfa0b64a1e6b2be63e5c9715f6039a3507e476a62a5d5437", - "3592847345c0d3025b6bc06f899f40a2c075c2dec3f1c94f92f56f2b79472729", - "11bb90f80911a5cb94e2e6268254789a49812663ff4b3043d320f1a305326f6e", - "c65fe1fc990248cd1449e7e6f782238efeb10ed9a3476fb1e2fb70f359a4395f", - "a69179262617a575e437a3ca616bb0b837e1889ed60da3dd18a02f7adff444e9", - "f948adc71455b1b4f95d8a09fd3f2476547ebf5ae6cf324e65c48e74eb66ae7c", - "4b9c2e6b5ec259761ebdc416b359f481481c90f407736bab081af6a94f3c7208", - "6bdae6131da5b9fc447446932626cf1ab88d3979c984629ab27d9b927ee2ca3d", - "f0b1f2cf6c7db6651372b9d7a4371fb99753d911a1abfed717e7eca68d22adcd", - "78d4f637c786ad0054f34bc5386f18003df95dd08c823aa54755cb17e8e89b14", - "5b588941510f2cd19602b9f9a02ef95abb34e7292a8099140a804df9e6791edd", - "04de09a9b646b0ace63829952eb682aa270397ced9c57c9475d75c9735177f7a", - "cd0253c1005abea484815288a0165a7d3888fbc5c948b31ba77526e1c6760a6d", - "4115c8226fbf678cab2cb8827f9ae637706b99cf3744e5a03672e9e24ad7e660", - "9b498a816dd4e456733b0ca542b8548ace41c10e8d9bf17a23fef639e3bd20fb", - "2b09a5ccfdbf735d9840a327371e54b81af523c6084cdeeb0e6a6201e0c5f381", - "81335dc4bbf9cc508d357d7b20d2c3a6fe8e89ff0cc0f320c30b9064f1e1812d", - "2488e587c4c4418cc26844fdd9d15a9a8355a796b0e896bdc8352b5d73bbf32b", - "858f64e1d6a3d0779e7a653e5482b3b3e5fddf7608df6cdbb1a19ff3c434a210", - "1364e2842bb897e6faf96eed7aca7177646e849c7c99cb556ddcc15fc550f3b8", - "973ace2d8e80913a5c83d8dc1fb1484d4fdb5da471bba5d32e59d8b247dd731a", - "d852210b84a1501a64cfb93cc4d07c829d491bb4e0d88dc9320d92ed1587e088", - "63cbfaf90920229d37728832b2391d7873bb942ad6d9c1ceb0a3773f0b97fdff", - "ebf367740d765ea37260c4de18f0dc9c25898a53fb0ab1b09006e6250d44a025", - "19d7503ae831ba97910d8c2a286bebcb1519c6316e78523e8204af5bc13402b6", - "f85b29705e66a8f82d5aed05232a2e7d02901b03018bdce0ac3af8848bc9f5c4", - "b13046d897fdf4cecd1dd12753fd318fb14f7a3e6b7133151dc7c52264255814", - "a25eb7637c312237683a208dbee5f9aa9e8854a0b6caf8d3f4ced4ceb9f2100b", - "6dcea41482c78b8af40baaadf3ee14d14857e14ade30800851ab25a090c0a06c", - "9c284a07e7f275b9de6c2c541497cda328f61fab05f14ee23094bab34b0d6657", - "d233d00761261605af4ec54185b01a8761766cfed62c0650bf25cba6fd46573a", - "8287ce606b5eba0b5bb3016317efb502575471c257582176a92ff07b76c06296", - "9bfe2c38aba043cdc1d521518ca2d5b7b37f18561555b27772e62ef4e2a1ee8e", - "26c59e4ddb0e657292bff62daceafdc51da82f0819cec8b731be5bc0774d8da1", - "8643c5ec6ed53051d98f05ccf4e46fdf73d41f29b1814f7a6c684d6abdd06369", - "c1db2b7464935d9dcba47bd48b789a2d5688403da1006d510c6aba6e8bc69614", - "30d94a9a00b663c2d22a1188c5c98c570e463b00ee8dca36c8545662d1471e79", - "152eb74c9194d1082ae82a958bff54a091e1d02fd56e6d914181752f56fe05d5", - "83183a9d4ab7d03580d5fbfe3b64439ac82e0d6fe6cf6fbc9f2b0f3829b34328", - "cf569b33bfc2328731b286aad6bbe345c46b011edea09cb2cd0bb780397cfdf3", - "67b535fe1b3548e6d8ce2a58ae45771092e4dea915990bbbe59793542a021269", - "f4f4e8b012f0e6c04844787bc2a874503da0b5b3c6338f47ee2e868139daa726", - "5eac17160a15af7ea46179081ece19e9290268bc13b74278ddd63505397990e2", - "4705bf5d4aa2b850abf87a8669914f48671d8368e3332d5f7a9cda3e5b008622", - "f972b3218dcc32b74222eff4b728d19eae3c2192be9e53c8a42355e282fa1c75", - "e70cd76e0d7a120c78583b2f8103a63aa38e4154ad69035f53bcd82428ad3d07", - "0b99e97939f93413a5b852b028634ecd4d803a542654dd47a910e18bb036f727", - "acceaeea75474d4f87d6fa66950365f8a0d3f33e99e2ceb4ce71bdc712bfce3f", - "627a18648cb6f175172b8295a759f350604687b92cd4cf177a8bd97b788a82ac", - "f2363c72f6fc03675f657d6c64aeca44bc9af5db0991036cc6b66008ab7be170", - "9e0ba9cded38834cb41bfc5736ab1c1bb7180afe4148bade12ce11e8f65c2a64", - "bca4b9e32f8b2627cab543ec732d37b7f6aa00e16e98e126e1795d1206bcaf38", - "b3aad351f494ffa7355c54aaaee81d07f4a85988b0fc17ab54c75ddc96f14bbf", - "fb5204108471281df246c1bb1fa4ff57a4abce1ee2827ecbd933defd25804f66", - "0cfed6eab31e78667c34d418581040ec1517bbb0b2c4435dda3497ea966633ba", - "2d7424d5c4b6d3ae9d5d8c8d48e9142979b7b1a399c8022491fa06698d11b20a", - "a4f7ba95316667a426ba28338e2786b2732a089d61539cb1adb1b36716cd11c6", - "c82fcf4b9eba92b728936d0a2679ebb56ef029bc8e11e97cf5188c95e515390f", - "a211a985bc1b2fac0d023c32d3ae7a619ed810bf377203119ea3f50b368ace19", - "3b768037cfcff78e9ce3aec934db28db93892fb30cef443cb463df81e755b518", - "af3d6cdd5fd821c3d584e2d9b87a975eb1751eb79dcece1de027b5335a2dc3ec", - "3b56df2f2e858025d3dfebe768d98675e960a86760d5b31d1c2d9b0e55645164", - "c429b6d19d78cb51aec06bad76d60a1cfb6420df598c7b4d627c2127ce61c3e5", - "cb91ebe556a7a3b417604a0eb9e13f716ef95083f12b5d7df4ad9f2eb0757ed7", - "c0454625b364093da81314e637b5bbd7f11fbcebf7e08307ba5415d4c83de561", - "73b1eecbf05d40c1425e37cf5220ff12568a259e7087647a18e0ea46c5f6d0f9", - "4248412c564c4b77599054698ac64677de32ac7e57cc30b4199cee54d78bfbaa", - "a4e8502fd8066bb27a629015f45e7fb0949d6a3d84eeef05b98fe55f966a33dc", - "58726715db54bbceeb22d888c89711b0e2a28b2dd4fc60b63f0b0712cc03fb39", - "918d45ffa0da5fb0ecc6326ae07fa8ebf3da200b43f56e4fd85c59edf4af75da", - "824f68239eb55af3f14ea3172a4edf9d2831c96febd61632cbb6c18295d991a2", - "324fc02c11d918d3e8242cd2dcbe4920a09a1c4edab76da1fca5bf7647b1bd05", - "aa20f8ea44696ee40937e786b66c20b262dfb62615163918fa33b07a17b7cb43", - "041c3be5b7dc2d8b0975dc84a2cf73bea4c7b1eb1ca095099d5c94c2cb80141b", - "e5cecc1af998f07bf6b207c87d7e2a7d6e994c3cd957ef7de5013012aeb934f5", - "5e5722332d289f6006e85466128b91f4cb5b71cd2f64d259925b7e69570055b0", - "f218c41a92394ce51831d6127cc188e133de6feef94bd90cb3b7c261a902e43b", - "01eeb356349607084751794a9465ea408a180a61fbd2ab52f1d4644399694fe4", - "91a9158cea8d5204ec0f9bf52ae3aa0c94eeceba93c896510036fb561cf83c34", - "3e11ed0c14a006be7368a8c8bc78b72dfbea02aac93136a87d33be1766cef8b5", - "d8e441b681d77fd7678155df12f8ea69a70b0e59a41bed3f9aa62f3572521b26", - "9e84c3f8e8f205352cc549f387e86e11b666d0d0719ec5dae8f93225b0fd6b75", - "a5d57ade0475cf57a8b06c7d402e56d577ecea55d0ae1a1266bb35ca5a490584", - "211792c493e3ea14985c3b5b5346aac3eb496ea9860b4f000ecfdc48b9b75e89", - "9c8ab34ebc7c9eb1aa55bb508d6e68f40d0f03846a72c8a7533f3db1697a7135", - "18efc24ec9f6afe1348f631f4a15c5bc4367412fccd4fc3326be2ebbd360194a", - "0d9e89dacfd71b91d4e354d0583ceb09ada20d69bac09dd9e92807a4d29d237f", - "f2aa42013af88cdb555149f88d8cca6d7664ca717c1f5f2fceed3058cdaa1fa3", - "c6817fdf1e643422e1e17fa8b6cc25e103b055145cc93f55a9743b48773edb7c", - "0f855329a318c960f150fe5d0a358f09bf10628216a5ecd077803b0b499acdb1", - "aac4e5c20419c2017bfebe6a124177b4c4dd4bf9f7a35b7eb8f0c529c8a9d457", - "60070d7fc490bdea0c0bd5377ba6cb8c7869fcb9fc4ecd00adddd1db45e4db81", - "3a7b01dfc32e53176a367509f5b96d492f72a09484e831092d220bdf96434e4c", - "aa3e9dbe4d9e854e058a7e0c21b7fbcbfe22bd7d7bf3f09bedf9d6928407e923", - "eb6d5203c60aeb3118560e74ede7eebabe5f6da0cfdd078429c4199dc9779a98", - "1bd198c7e2d9fdad965f93fe878378f5cdaf41126e8617a226f42eb01eead091", - "3f7fa71b98db741b3bd494b32dfd95341759b9189d2e8162678a3d782cf0cfc8", - "a2fda3f614c5b7f3baaf691b0ff1547a3cdb3d9d307060e2c1b471b94f8f26fa", - "34ad91984101a0db933ddb605af1590da0fe70501995f8fb31128088fa83cb6d", - "5eb014220eac34acdfc886b9affe1d30e28b0391c609f413ad47e78c3697f7e9", - "ecf90b388ed29da03ef26c9e39d73c454736e13e209000af074368517a1f6de0", - "84be95f6193ac87af28a78d49e03c5bc3c09fa186b62a49dcd8a783b0fde8ed1", - "e6b1e202bff2a97266e66995310754b26f8adcb2b5a9fe7ad52e684527d8fc2f", - "afe11e04609da8b7143044ec323af2730f1f52f696ad86e8b8ba7a0ae9cc8915", - "2379cda51ec61e72b0038f87f40e656f8e906eb66baff1cb08ed5893785591b9", - "129c4874ae5eb4e5b0973c82ecba1af4b8ef41f4f466f59a3a3bb225364351bd", - "0413ae601d912f1f9d139a34390a1835298d7feca803557a4372fe6ccc3d20b1", - "ce35315ce57f5d7dccbe266e5935718ae3785f1731f50d36d5d20dc74760b28b", - "79698afa503c7bc7b46d065af1d54f72f8e85de94dc0831acb61e9c7699023e5", - "e82c69adc6fa96510022b5db6a4339f94bc6a28c32978aa1beba3f060fac570f", - "404fd3eba2dd08c02e8e1a1e6e71bcc05123e656e7fa0c6b9490f0b82693da40", - "490e0afef12da3be6a1b476f86eebd6ac7b53e7342536a046e62048ab454671e", - "2ee5bfe856b10fd09cdc9d1ecfd9c1852b1551aa5dc800877f0567e87201a21e", - "201faf8ec14bf4bbc22b05bfc803a615f3ea385602c5dc8652f26add9d5e8186", - "daccefa959192fe0c4a384b96bae4d62286d64ef374a69021a9d87e825dff721", - "358a27b3ce0593f337fba0c07cbbbb8df11f831292699dfa30b65af262977761", - "76f8abe07066eff77ec01546dd5453bea392dcb12bc3a89507a6b391e24ede79", - "b6951fb57462b78ce4a4b81c6401337ef428fc36c2f93a0288f0baacb5ea1c4b", - "c5a84f9b8b66d314e88d529efd3b949f5e1a56b72416c04fc9422705795994ee", - "5b5733181fd47fa238d4c09e6daedf3d93a8e80392c2893676429b9145fbe35e", - "e12fcf90dd75e4740860c7b4612f389826cc91695cce3e4aca0de2811f66fda8", - "b199e122ede531ce6b8af1edc3c295a789cddda7bd8c4a1c86e583d552f90c82", - "408eace15b6447ce8ee0206d7ecd41248a7a476cabf5d2f6bccf44b334d57935", - "d7476d00322f2054dca81a5cda6e0edf524a60f63e64ba17abe6fb9c30a4be7f", - "83701d1e32a23fbeab9ac66dfd456c980fcd714192c2b50b8f9e1b184e10fcae", - "815fa9bca650259f0ffe8efb24782ae9c8814bc04ead9717a40791c182b33d48", - "95e532cfa96986bdb7d57d883aadc4e7bea852d5f945659018ad067f511c9bb0", - "9daeef22ed4f90e5ff075c78bbedd46c6a4277a3552feab0e38dbef86c031113", - "c6b5b32b098d0be199b709cacceca983660bf2bf0dba0b9f40a0efcef63f6393", - "04f3ccf08d809012cf8eeac74c2bcbaa9d358cb237d09db92f9540e8d126f052", - "b384fa8ca77d5c01e8405f9121c8613349598f59d0e63c9a4af7464e97535444", - "bfd3b370fd5964f912a18b7945ab64df2ce91aeaf39ee88ab39a55f34642a274", - "5a216bacae12c0defc9972d4c9e303f725b8d7fc1543d5c55d34a4945a25c4bd", - "7a28c3c155210b297f2f1c079f7f428f48c35818aba7e9323ae578ac768686f2", - "d66e4a0c5295cabedf6e4d63ec9c94c1b6f331ade27cb323c2b283c420599c22", - "5eed3f42e9539279f61f3306e9e2548e9aadc1739765239b0fb7e5627c1506de", - "d84cb949b83422fc2618dcf59178e36996f8cdf294f82ecc3d909cb20d46e508", - "05ac5547168838ace7efd37c7d038e4da42e307544f5e044a248b3172cb0cc7b", - "c77cdf2cc7d18e7ee25f310d6ec31af6ee76b73b9c59999e502ce313a5b81a1c", - "54d9460fad0c465c5a802fc0c7ee0b8460816781869564447429d3429d51e655", - "e67854450040e56a5d76233c4e6148e17fab68984680aab0e0320ca908015bbf", - "084674ea824f5d69b9914da67c39f8cbc65dfba35ffe74a22c4f807d55634589", - "7cea113704c5a2385e1a3fd42147df78897383e37eed972606af8e7fda7de79f", - "7dbfcdd52efad323d43d6a5644e5b505d6ce1bd4fb3fb0952f9c178d2b38e12b", - "1563f1d49afae2a4a2565b2ee310fe4f50d800837b05b1ebbf29cb1eeb0a0671", - "044da3b7e31564616661937777d580c3512864e21873f6f7ffff606d7b8f11a3", - "29662cedf4f767ff57bd58cbace1728356fece4beb72d95b6c613530b4d02f39", - "6497eb7fa0ebb714c7f96a3d80d9922b617e008d997fcdb020f32168814e3f7b", - "ffd9e57be103bb944d0f6cf9255cb5dc95d4f16b8a9cbb54d321dbef70c221d2", - "0421c2dd660467cc90cec5d96781fab4c8c1d09ea62695dfc93827cac6ec17f8", - "ff6757ca42dd321d7d47106a658e7e1a2615b52e8d3f46dbd798cd6d182589b7", - "2c31af7943d19987ae122779a9196762c6491e711e7d9c7bcbf5179a742b7e43", - "9028b8481a660da8255f8fd7a7522b2dfae318e932f66208d6fb846ccb945de9", - "7d04c46e2e4fb0e7d4b4a7cc4941be7a9a3e99a089503874580d34cd2bfa8dd8", - "100c98fd0a4d409e0dfc2d7160b4bd69bbaf9bae2b18f96e3b48a9531cf79ab1", - "9e476be29c834f2d74b4b95bbe69e19e3b73d9743130d63a05c34ec13ec4293c", - "8bfe5e9063739e8704c1d5daee77cc70ecc020e61fd7d91c722778207b2714f1", - "38bd849fd4136d74c71d0591ec5168a427e37f6f82369a0b20454c7fc7a1b3e4", - "58bf1582f5dee6cfa814b57aa4650510f9a03dd9ffd24fd3e6e8e8b353fc522a", - "a22b7158dfb927b00db59d5f8e17122ecfb0e79bbfa4a3d9e95c6cbf0070f77d", - "3de7717fbcb6d9440c7ed00966e5b3edb3b5739b23e2b6016ee91a1472a758a7", - "b7e7daaec5d65c97ccf0325440d7f39d7ec455c0d7d205940472306cdd24aae4", - "c7d0c7402831238863e510ad25d3e1b427418dc5101af8329b02b78416074244", - "72c0d05aa839b8a85fc0686d56c470792e5be619f9651a28d1f3fcdd6c4e440e", - "acd4a5bfbe755d09372aa40f7813bbf16f24f797093890c66773ff643c0b69a7", - "610b96de8f876b91d9abb677420eb0866d2fdc46cf969479001343deb8f425cf", - "fdd42630f74e1feeeba1c6666e89b184dc398b7c1431a6d2af1ce19a8389a863", - "32480dd4c5c21a5500a61a22b2637c75a6d34380c82374f288f2d116e10a8b11", - "37c6a7f249b02a4fc2ab86e650adcdba5b18ea920f005dc050d946febfe748bb", - "9b5acddaaa25aa80a880fcc323b25daf69ba9b25e287637276ad4626ad680c93", - "7840099d0bcc7aacd3bc080ce47539f9cf40cdeae919df59f79a1266dfb26d73", - "1fb740c304ebcc87ae85d4227c05ced624b9f7dabaeb71395f2611f77054b3fd", - "f164a672c9d7b212ceba62427db2f5d00304dceecda64e261d12487176f1f7dd", - "43e836e3d4f946a249d0350471d8fb963354d69bc6343cc4eb62ff65696f34dc", - "e47d10e0f06c60611fff1a0cce9c58e055553f29da1efeb96d1fd84cf9d30e67", - "837b7edb5d99f10a546b716fa18af7aca2a2619625610c0cbf05412f05133842", - "1ea844dfffc9dddf018243c354d3594d14ad78f924bb2885f11d11e9350c4dc2", - "c39a3ef307c1cafe2fc2bb33a899275325f79fc4107a09a886b2f24a30feac03", - "3cb2562d3e07cae55fdd5cda6f466e1f2a7a5d995f187618398e8935cba515a8", - "ce10c2128fec397c23f430fc558724afe7d5a5eaec773845b4507d908794c804", - "e4b6987aa8c2a12d1cf337df06ba374d03d49c3a87b8f96ff155d58aa5e60285", - "8351cd528cf24ecff6b1eb5e0227e3ec3ae6e7dcb5e2e7e0166722bbf1a7f53b", - "2881f11187c017b032026cf185cff5608daad1bdc7c8066f6255084f5bafa0cc", - "3f7cde3fc0f04ea13a38d3a456f220bae99268d4979c445200648d77eb2c670c", - "c26c25635bd29fa62d9e3ca60e5df92db00c442fc46798859a76fe6a6d55a026", - "112b2dcb8eef9a6ffbd95a55653d9b018ba9790eb4e94e90379629191b041c8f", - "5d2bad8bc8b9fb74b146728978590029be02ddd579cf35895ff9a7d0cda39e83", - "f6e62c05ee699a1fa5442b0d59d301c40736e862a4b7fed7e1bbead2c90de7de", - "561bdff942d4cd5681ff3b72089181d5514f9a200647a62604ee01f7f4f9209c", - "ba35a0263b86d209edb0786b9e917e88a31abd7e41ebdb5a1780add4c5039a41", - "c565b94f4df1ca5d6bd1e4fa0f12e93215afe4d379f68fd912a6e43eeb4c8265", - "a2ce4c09a78a7d46d29f6f2bd3a4874d0c457393fe9c4bb8ce75565de83e5f03", - "2fde3e6cc5fca15f49fdb1598531a3d1d8a8f476f793ace830825492d8a834e0", - "5191e7025cf03f69fe518396946a5155deee708cfaa030d3c74b6eb2eb219086", - "b9cd848b2000231b753e925b8638d3bddc3c90c5ea1d0a25069efc7cc361b461", - "719824113b1b139157cd44b66b4d03ea232b61050d801f21a1d927e098a2f751", - "1617a6c003efc8b03f3fbe8a9e25958b54f0918c19623b1e85952f6c2a7e517d", - "a70e1ff2567098b1e69fc10b815cf60756a0ed5e8b173d62961a530aac0d1000", - "74cebb13c351d6c9224206b7d0f3f5e5e0faf8b11a62c6f5e1de97203c8a8ed9", - "a5d6f0e7e4af3cbb8531798b2727377061e4be44481b908885ebd61c1af8df62", - "9a1c50970ed354a631712ac617b2d6bf7c0bd9d1052669408f5f60d124205775", - "adc78a1e04af3869df92ecf19bc87ffc385d41bf2341a050698f768d1b05ec44", - "0b8ba6ffa06622d4cf7b34435c64335509a7c474e5d533f6c05ad4d9cf144fa5", - "c9559fcc0b47f2670d9ad3efef14ed4ca4b13703d87881a8304df60d01246335", - "209d44cdb962b2542eaeff341e43a0858ebff6c36acd270ba51bfac4740675ba", - "34b1e8a87b28cb5ba1081af57895580529c82b032651d4faeb46332522e8801f", - "eecc20d162ad10f69bd1acf8c212975595a7708d70bb60ea9acd9dda3fd7efab", - "eaf5f5e872ad315cc1afdf8115329f7a80588531e7aebbd552e51b5932e257a2", - "58405400888fd13c6896b6b400e35ed5954e857e8d23b925025b5915e02d31f4", - "0c6ae18f8b12970f95ebdef2ba62bea434ed0dbe8ee47cece81c7d1e05f383ed", - "bbdccc1eeb69e07b55d1481ebf069bb982efca783bf402ad8239ac7978fb03fe", - "053982a0e517b1bb32e40a99900cce1d297c0dc63ad6922291e3e23dc5629f7a", - "a07635ddff11fed5a20cae7beeaedfec0b219cb636104cfe83e4e77bb2259ffd", - "aaf50eb691e5d40aa806551f64d08c04d8633f159e84a9416fb220ad1614de1f", - "f76fd1b8f5691a24dcad088f4db1d1b35ec7ff48f62b8744612816edff0278d4", - "843d93d1c85334d212477de9619516cf70caa0d9676b056748600362fa8194c1", - "5b1fc64df03faf7a1bec12aa2248ea4df81a66b9fae2dd3483480a0ddc46aa3f", - "d77516814991f7b7da4958f638f6a097501666b997152cacdc81b73989e6f72e", - "85266b4990d498515d88f092922a8636b1267a507975f0cb541c889660ad70de", - "b57073fdcf4afc07fed4965eec31fdc9e7a83325429db0999c44bbcd56912ecd", - "291480f876c07bab68c484b61917750a64b8131a100a9728e59c2c7385fff0f7", - "0e63aee803661d1f75a2b237d036d511e709cd1c3feda8836254a1090b3542e8", - "fa372f6a08b2193ad7ca562805d2b92818acce61749b566cf8da459a63bf20aa", - "aeab175462bb24f81934c6b316f8b9d20454ed9d15a37521251f1bad9bbef068", - "75662fade99d809fda35842bf0e528714d70d4163b7ce765544f03cb59847d32", - "3c0cff36bdf3457acd04f636b757600f964904091128e9ae5583a7f5e0b1cd8b", - "33eccb9100bd23371615fa015761fab8891d1a4abd69b346a0770bf80909c2cb", - "f0856130b085d8824bc40e2c0b95d4ba134b52594b7b44b8a0fbc2d1c35fc3f6", - "a3cce33fa850020275acdd5a8658e3137e505c1b0fdee11f1f03b10b48ab78a4", - "b7cd0d75413b618dacbebe734e7a9f4bbdcc20dd13907c1c1207ff5d6b3aa8a9", - "054af95a935c61be828e2b2558fd14bf2230d6f9301beef60c8c7f51af477573", - "ca0b84eade7fff0110bf420fdff27f5c81cef94e1e0906acad99852e0976623d", - "b6ebbe6953557679cb66e79ea68febd869df2232e41ca57f0a6b397e3e045614", - "7d276f20848c7f1b14f70852396bd0b60ac237eaf85b7ea3cb910eede38d24e8", - "079773de5b5e035fdea654cc28b7105a2294ba5c382babead328a295e07b353e", - "cbb5606c13f0c3480630c60999683fa06b5fdd0921a2af452073349e65790bc9", - "4c360b423432d0503488e6c3136b7ab131a5ddf7dbc0a7bf299d4affb49e1bca", - "8af8cdc048045ff94dbceb334e34b4b310e9958870c58cfb7334fc1065278c98", - "4244c2ca1cd3db2624b3d805ce877c14f507294664079b3804e52633af162df8", - "f4a16829db9cb0781ef67ae0dbff0442c0263e5b6bb181d343c4f2d6d256635d", - "033668eb3069e26f2759d8c0136f75f56d3fd700bf605343d80b72e93aefc9d3", - "465d16cdeb9644ff5d37ce33e36379fca2bdfb9d3f5b9703c366518a8e508763", - "cb2e751ccf392f72e6f5e3d4ee0fb50af6d46cc1a437c368182ce8120beaab2e", - "19d360b535680fa02e051df593166fa3b9c51c66ac17eaa8e61ef7c63fc3a22c", - "5cfdac17d377f72c478c82f39980b9a9c80f618e494946aa7dd846e575ae15f8", - "7a5b8c0d5c42135cfa4e6b14cc785c4d840f55dd6998d0cff703d9c4a6e40f55", - "24705a887746073a4647263707469df672968f33e9e0466af4d4b2ad4416aa53", - "b2dd562bdf79946f22191a4ee39c4eec364c79160f2de4f70ffd11975a8656e6", - "6fee815ec856a502e09def19243ab284d4de5e462a6cbcca873016f846b0f243", - "e9d900d1188197373aab3fc32b16cab4b71cb96bfaaf03039025ee8c5c75376c", - "4d65f9b27112242616c07c7b25d990c6be09f00fb656c7316576c13ff1e2ae8e", - "cdb788c2090f34df1dc8aac0723e4d583150a8b587a0fd036edb6e627917469a", - "b239a801588517d670a0e35c3d64ce35c41a35cb55d9806e2086034d7fe9890d", - "964408c2f1f96d5fdc6258cd3144f46bfe6b86d9eed5aaad993aa19ea1feed17", - "ef5a4f03942bce8b807eb6f13296328758273d7a43409292b4ecc7290aa0592c", - "ad9159330f77ba5b00c8e8f7513b9a56b76847e78686aa5685b6db61ff4d8d74", - "25d8d234ce63b7bf09a132b6d9de727e9579329b04dc32ff09e7b6dee0542aca", - "2b08f6bb4a9257c519707cdbc3090f625d300f06c58cac948dba2594ca40b378", - "9eb7beb7f371bfee5cc1fb8cc0fa336340390729e999ba5de205b5ef08461209", - "d21dc0f109a41efc1cbccc03a8cb617ce69db0ea6861028d0c99f52cb8c43fea", - "564d14a17d6958801c6977c35b4516e14f6de51c6b23f64e69abe9a50b7bf9f2", - "2c1c1ab6c713ba78f642fa2555e3134547c83b188c9b59b4eb57d280ef74c82b", - "b93d58141bd57c0ce3c5124bfc030545548f7478da954c6a41fcb0c9b55c2fee", - "523f26fae1b9b674595053ac3c6ff38cf9b7d2dda96db142afe2aa389690fc26", - "c0ed13eedaa5435255c621f7f293745563c7989ea21662468bfb376cc28d0eb3", - "4ab90c81f7c02b5dfd1852bbf320107d720eb1ecf009c0ca97c1832ebf7f8381", - "99178dab7555e66ea32a900c8e0795e6657f8a5f32e46532067b4bbad4111a89", - "cbb912be446485233c6bbd68d093a51f0f301e684d4e3bd6f5e7319c8a583d98", - "f087afb772b9577403984dea0382b88217045f021332501234da92017cc82f2a", - "925f127eeb7eca59ca1527f12636adead00e451ad263af060a1f0adb0976c029", - "70f6e6acb2fda4e988376dc1fa38ca8e36738b4de8271d68cc3c16313b2f33e8", - "a8b679386d8236a9dfefe4d97f7c5ae3695ec2a52e011468a7ab8591f8981af7", - "03095d920c8f02c431a3f4fdb32520e0d77ac00fde33c747363bfd37bdd365cd", - "da619f317ee32460e919679486f606de36deafc5431f36c64fb59a035510ad5e", - "fda4df573eef6eefa5191fc0ed09c6aa92d5e029f5b78be586bad09ed8cb4e15", - "92071a3abb9a62e67cadd3290dcb160975b8932d6df7fb9b6ad770b480819410", - "8ffaf1e4ebe441640fca2c9b2be37930ea2ae805a70f9e5556f3beb8ee2b80c1", - "793ccc7ed2f89277a012249d4689f347dc960169d751390efe1c82712e747ef9", - "f60b797d30b6523c393a33a282af1b3512107cfc1cd9b13e428a4483678eebc8", - "1147ec65ec631503a2cfed22c477a6ce1eb350b2eca2258629dd3ca768005c60", - "a5746d21c1499cfe99a3b9e2d3ecc2a0f0fb2f461fa5f9ef08cc4f639d96a38e", - "4bb37f490ad7c7be31565ac485a9d0b641142c68e7bba0d9280ae21c47e1a827", - "45b3ff136a4030832cb6d077dc0b2cda209332fa970790a13d02963e2d7aa001", - "3fe746b1d8985406c883c1cc1329e07fa95da3b7800ba630ddbfbd6e18a04c73", - "c0ed7c9f0c0821266d0307ddff9522e770fc0ecc57d4cbc14d66221cdad54b16", - "09a6322959513f9b9323c41004f37eb98eb6a4fe1f3db7737c928344a409bdc8", - "5bff2b26126aae81725345331e3cecf834a464e08c2c70e4edf1dc933fad98e5", - "e63cd466c5392c925870fdcd96aa1656561ff73dd7308b417bcb357c802b53f2", - "c66908649754fc4d5aa11a0716adf28fa86ae01148cbcb3983288219f302469c", - "695de2053c58e094e67d199b50e24d148e4d1f5cf9b34c1f931e244450f45c2c", - "f945f3f1d63e2f8f484c138ba91368f16abdeef551a882521f39494d3e25f5f1", - "f6f393934600d65d751af1c28e1ee06fb16236bb3a1600a7fb74f58625808669", - "636ce917554b11a5b6ca043c9cbd7ba36a32c4f9c213563e341ca1428a02bc73", - "63d36efe8ef5e1e4c372244780e8ef6bb583196c30bea3d63d4af454c52310f1", - "99d4170994874d592d7c37a9354a7332a8eb8c557e898d873ff931c915ff71d0", - "729bc56b105ad7d5b3ec7853c68104606547b6087ddc74f72ea7a9c0d6befc14", - "c1e2ceec9c160166e0fca9d801cf6c2c0c857c775d4e158f1c28a5985eaa96ba", - "2f01943ac22268443faa68a36874f163b90cb722caf96bda6afe7d28225f80fd", - "cf9147a2a315ffa3234fe631efb54f4b2910c34febb5537f50c3bd62ef079fcb", - "c07f05daec9f11a927bad63d53f60d3af70697f12ca845aebd5e90f1a5d2b7f6", - "a7584708bac52c21d0cd8465368448b0ba604f3f2c329a76c5dc65dad8dcf269", - "14d79e9e816e9589eb5c8b3ce0c3b797a01bc422b0bf2241894df3e02425bcc1", - "2fe178697daa52a79d27e65d040f9d5aebf1589a1fa32913e3c5eeb5b6ba9fa8", - "a864dc86dc8ea58ed565182773cad156842e9cc628ccb99e4ccbd75099713113", - "acf5690bd08e20412263e3b304bd98ee6f3bee6a34ceb4f1d46c471421608f29", - "d5298f13c3744975e214c4059931551ce4d10fa067eb225f0846dc83036f9c41", - "41474b81b42ed0f57fa03ecccb6d210ce7fb77f1eb95f8426a722cc50d2a5795", - "667826158498d8bc0e382c0cfadb3c4b9ae217d4be44fb58445bd1643d43923e", - "d2916390aadf9821edaf48eba4df22b3a405d614fcd2afb5724926a613b98de3", - "0ea7dc48e4bc4d8abcb8087c5334549c129f29cc0dcf7374bc381cfba32c5d58", - "4be689bfd3159c0241272b5aad348fcb0cd32cadd6220256df476193bad3c63f", - "78a397505d47f2dd1b4b321b38f78797d74c22a458ee8165180601d2441d2820", - "8425a54f829aa3232271609e6befca4bf7c669602fa9f4fe8cd13be7c80c9aab", - "73bc9fc8c0d4887468cfb906be396069c270231615bc50f372c4150beb7ff808", - "4816e89a6c49a13d6ad012c28123ce2e16aff4f85b3f61cc264ed32ef8db48c9", - "8eaf4616b473fb405dd7b59a1903bfc004e854b706acef95e2fa54e031eda571", - "b8af778a5356dfe6fd05523e9ccf6da25497107e7ef36535922d118f4cd0a056", - "70253b5c585c805aee73266e95531c774f3b3f4555e3cc6ec3a6243a4b7811f3", - "2388031b6b5ea8b71f1df93fa1be20d1a5ecc314f34b9d8a9fd819ad2d1187d8", - "4073c1c4193c76c38764e0e3c5c4a63fd6fa0ad18872fae77e5f3c6c05eca6bc", - "8cda64c8954308458d32f20e324e2b41b71461fafa26c6e2b33fe7e2076ac364", - "1319ad00951ce100bac90e4aaae45ceb99b89288e34461f309b647e893b34388", - "220d076c227fe13e42d42eb8fc4b94892bee8557fb3e17e2fae65e7c51ed1de5", - "7622f7273f2979e6e79e4e79291feb3834de2ad338d162740552f22862c5fef3", - "678aecc654d8c84b2be4d9790564f1e841d53dd72dc94e4e21c9955f68e66972", - "7caca6b8b13e365a4d970354b20ec954719dd2c80b4a06ec90cd70949e31730c", - "13a91b958c191f63ce656b63ed7406f19f72296b0b8551cb2a03d3d44f4d393d", - "ed42214ed3ff8f747c1a446781e6d70373e7cbb7d69d4f6c46a0be83fd543758", - "a23979804f60debad2539e5fc629cb05b77ff64f0b640093e22d9015ef1c857c", - "696268ea6b3c0d3c81c5cd1b3b3eab5601392923f4bd6e0ecc48f7165d0eb938", - "f43228dd01492416cb2a5fd66047729d6fad9ecf02191e6e17c1a2e8f6036852", - "1c697afd9dff269600f1ef7e688a8e53fbf19cdd9fa57e61fc541f49ee1b3c59", - "24b21356df4e2692f1e12e500cb2f382219f1d0591cc2b764b7b6056f53436d7", - "e37fa615dbb6442fd9f134a633812c2048b700694630d2635f2290128e9f6ff8", - "40ca7845547ca4ba764902c8994db7e3238bc75eadfd9e34142080d5bd35c7f5", - "58cd6e0af662f9250aacaf8e3cfd7bd7596d9d70d5169a07ae42cf8fe9bdb97c", - "81bb9eff336e15016f13d8c668bca0257157048cf71d2c453e984c45feef2068", - "f3673a8bff59f1fd44ad40a5e5b358929cbe3abdd9ee8fc13eb3f5ca04823aed", - "181a6ec56e5b5c4bd97247d7e77a05f1ea5c935a6acdd63b9563b31ca0adff1e", - "4ea4c856deb60aea4080218f7223837d29c8d6f55a7aeb3af1405a2a91ec9766", - "038a65c6cd5af5017436d2c9fbc359991fe03b78341e1b70ad2753168ba7757d", - "a14bbacd87fe944f91aa3e42a1ddf371f8fc8e771f0b3cbee14197418bedac1c", - "d6beb3a81409d96567e9ff67b17637543a18921e467435a202c2ed7b34313983", - "87488488de2e2b7a4a7ea0fadfb752bd5ea60a9866ee430442f31a8878c43f92", - "8a5198066e5a3f54430bf6313d439969184b5bca410ac14fa02d56293c9e6b66", - "953c89d31768f1eaec8034838d68228c4cda2deb99a9f954243f84349b890ff3", - "d2e5bdfecb5df0f8b81b0640e4760aac167132b5c9e9b86c264dc21dbf5f69f9", - "93a719b1e46aabeda361b86889a58503b354f012f5868cdbcbd4d24c6e0d0c48", - "476675a2404ebf90b321c8b5bda3165d4337ec59c886c9f771ce79f397fb3d4d", - "c4626753088491fbba53a42a782489c917088027b840180fa25b8172cd20ae38", - "44d2db80a3f6280b0511601523451b3f09bb71dfb4b651d516120ba512e5ea67", - "cc4d131f6745519930cbbc963aae72b4a84e45f885bc00a756cb49af7e450b89", - "cdbd8666498c5d19a5be6be9c3be20beec4bc1d111129fff9a457ce3e782d939", - "e80e638a37daf1de71be5c1e74ba1c2ccb7f1450d0ec3243f36fedd2cf48655d", - "d1bd4698a836aa0e9646efc6df957669b0d0e60914a6bb092f6be36f1c07ce23", - "0ff6e506764fe7b530bc6e2069dfe1d960f4cfa46af67e9518e8aaf7dd6653a4", - "1ef414b11cb108ec4e67e47653fb99a49f5eec0ff2a8a2afa3d9de478efd5729", - "5bd76621784eae16063f2833d0a320e57ae85c9f801ef0529a0c5e63784c9f81", - "2ce7eb05f2a0a182dc7ea378dc6bbb728cfecaa09e27f41ef5c31d0b36597825", - "647768b771ca2b1a74452fe186a89236cf489dd1fa190184deaefaa0283f093c", - "11b55a23b6cbc0d10f02cd53adc176b5fe40d155914fbcab0a8339c4c4077847", - "a9811eadb01929a363f7fc9498fe00c74826b01f77e583ba03b85139a294c53e", - "5c7efd9a2dd764762e630875dde9504c93a2040c2b8e9d768631c94376858226", - "0b6528684c24a4e56f2a85ead5c01cb9da6ff9ae6c615f7e69c1a75af8baa389", - "67fb4cb0434dd6f80b988c622aeccfe6fd8e063b432997d11f423b6b3c948a5c", - "d8cd1283cc9b6cdaa6adbb2db51350e4d8a154aafb41d57b0e82d3e83210fa0b", - "297794fc3bbd6c5251e2ef72861937841279d61c82623c6da3b6b4ecbf487a79", - "0faca52c742083f777f40fe1319928e7ea53d6e518ba8de11aa0a1f85ee906f1", - "57b76489999eabd495ad1289ec5b3984f064a9af35bf20a730a8783a0b40623c", - "7d5f6c45491dbdd798b4657eb229c0c8e1051846929c71658854788e7f9d0f1a", - "45d916283848bc09007cca9e644d3041c666e867f4088a711c703b23782e773a", - "e88a799398f40b7967715c39925e9da8cd526ed347e9cd3f4be5355deaf5c217", - "7b7d5373cdb6dbed0acb9a998abb28c832b5e1a1910a947cfbfca2f7a7df4c93", - "240ce500fcc78fe5dec6e1462caa7cfeb3f82e5f43371a10072aa116b81c17dc", - "48d7904b3b7f519d3032fd9a1848567791daa7fc9ea40b99a72bec68e5414305", - "fb939817348604bd0f7a87b4981b87c38eb3274a9c77403e1c6c43d167b5a6c9", - "467fa3b440e95d3775a4675fb23c36bccc3b4a3296512f8bf3acae8d4de5eb3e", - "10b1deedcf9f494dcbbbd4433fc4950c6ae5dbf53374f2284d76fc4e15f79751", - "eae21e84b02e801a0b02e99e044f1c88bb3ccc18cd36d137ac3ea8c6da22c2a7", - "e05f94edf605029b9d9dd4b033eda3fb25565be73695eb17563c497975d4af61", - "03480635707ca98ba206faae2574a2fc7ddebe34b48ea26fd513987562278c5f", - "f5f3b006959c0acae588cd378292ae9578e134841e7ca542e15fd991c6865687", - "494baad5e5dbb18104b42a978e884bfb66c1d865f0edef50082d4464e4cb7881", - "32c8bc784c984a8c3d148065768a114ad637c29904202a9f66f0d59211436d31", - "3748a064ea5d7114e3b64ab8375827a62139303a83da8d56bf4daa799ae54c2d", - "825b8e4e4e4395c8e5b85536e95500ac3f0157a26f31dace065538efdb2a2d74", - "e8b0a3749ff44df4fe2d53b7d2712b4973477a53a15accf7bc683fb34e93c5d9", - "3fabc50e8f30781d7560c83d1334359dfa9d1dcd6ed4d19b9817297d3eaa998f", - "8c8f5ab077c338e241b26c83dc7508adcc3e927ee7116b404a4e8ab0aceb2d48", - "04609e2f93068bbc69c75855f67d7f73e8d2029d9209f503d254f20287862a6e", - "cc954c0322b9ee498a1ec0a81dfeddfab4b95f7d85b8d6df0fdbbf43031a5451", - "07cc12bdce163d56052eba909d7b7a93632787b3b1834b610ad7f00c1b7645cd", - "08f1ec09eff0345c2391924bc3a7bf4bd100b091d7e05c53dcbc5e09aca00b40", - "210df23720b3d783d6b1adc81e3f9896e80d29bb052a9815f46561bd02b60dbf", - "c9d0c7cdee0a3a16b648f264309400666e2db42c14231d670952b20a64e8eed0", - "915d756bd15b535d4fb00d5e6e5efdbbffdfa50925a115aba6746aafbd3fce0f", - "fb7ea4e8dcd427377b957bbe13c1853e3631c50f308ad61e7c8be0c4a519a94a", - "654516fa1a1563b8ff7958d987a9a960c7dd2d5afcce671c9b2336d447983a73", - "d136b1ef234511c0ca47d4ce2960ea2d5541df60ed25b4c0d096cc88acc60602", - "a5149f698b63c386965e9d375cc90dd779d3fbffb586f719f53f426d825d3697", - "cbfdeecbf808ee52f007ec66bd0d5d06d746580e3ba7880b17336bcfd8c075ea", - "81e812851f2ecac4179c936be3f140e84e3bdd0018dcc71a9a8ae9b46f73a54b", - "941957faf5e28a4e60940cea97a2b2862820bb0f852e4cf6287eafbb81186ef9", - "f9ce87851ac3a1f5b04e8b16d0410cd9d361b897c5cfa3072bc63f0f5b21adb7", - "471b9095421501815ce7cb3fab65098e4c39ca00aa1181936cea68f1d51ef71d", - "804a9615eb802f1350e590b4a8186bde3989bc562021567255b4d6e902f3be04", - "c24fd7d226faa5fdc7cfcec0474665455d9f7a0950bb8512b2d2faa9916f0a57", - "ffbd0cb89ced76f364a29dd4166a8c46df1199a8b13883740cb1017314c93286", - "611ef395a81e9a87f18ec5ff05b777319874fec16148d9d89359350ad67ce299", - "deb921d7c5cee987d8a02a82d7395522af1f0811265e9ae19a9685e50a4e9f54", - "58022833cfb9ce492189df09491130e6dd7b4b43dda517801e4d308fff196df1", - "d7a5c587286f847c3fc5265a66e170e54fb0242bc53fcb80839fa395d99b987c", - "af80f96d008e34acced2751eacb1fd5112ca46ff9732d72fbac80e46d978126f", - "216b507038b16ee24937a0c5fa243fe4c7d8285f5563e7b4211ba8d2092af719", - "b6584ddfd61ce69d8ad166e551cbd741e0a19235188a95eaa06a12a29b62d75d", - "fb290ca435253c08409cbd8ab9f24cbe002e02c3512dc2671e999b7f19b6f429", - "31248049bdfb4246fbd069e73222ea64ee01f28f0dea865a70f385220be0128f", - "941043472c7e253253d9382b446f16febcb655400ad320418635e709ff03dc20", - "5e14ab6ace69a90e080ed89b1a26cc538c3afe80a4dca7e734f770720efcaeeb", - "763ea0699b18361a65cf187364f9d9e9f4ee0869da08530441874f488f8b9eb0", - "2a1d8403c75f3e12d001bc43cc7c41454d80c5abed1aef60f817cf3a8520e680", - "d8af9c9b9896246abbe610d62b80415053f09b391175f8f74429c91e767a5e5b", - "6a6ac7c1271f08670dbc082c4acbc8b9661e134101dcc53ddb357c15400d875a", - "f6dce938725744df5d960de896619bd87655605ed1dd686dc49d0e80a3475688", - "af06549107c84d8f0f664cb07467ef4f47144846b9fe271c298a0378f6d8a5f5", - "0aa159ce4959e833829f315b9a1fe72f1aa0aa3dd675d77c4718a1fb0711034e", - "fa2fb1106ec93ab714381a8027dce977a676358bd573b8570c85c1e4ae56b9d4", - "12b6a1d219a8af1fe3a85a17b96dbbf3ab28eed4b85da4fde9b4869a7e0c7107", - "ecdc1394bcc2bbe1bfd1c3b80e5d27bb3a2027ee6e910831227896e90f08a5ce", - "f3e7d1663c7c8ba0d855ee9732184eb05b0e16176d36a7968fdc0c310477a6aa", - "f022c30ce53b0f8eb04b0ce7f01061b446ea9ef7b0e7eb83d368f0bec4f0de74", - "9ea913c8b386303c5d62683869baa107f1d91f5096b54d627309ab53deb6ca64", - "e7011ea83680e73c4d1a5f62975f40327caa7320f04f0248942db89d6025b38e", - "c8d58b006be0e3749b5e129b9c3e016f7baf9a0b094ce45090bf3900f0915cf9", - "9a814f0122de7def198df2b5360dd63ad9496c26411fc85fa12afca9388b4aa0", - "3807d75f4af3f160e21a1452f86995360c6b9bb54163888f4be9aa19ab18464b", - "b82e6e5b505e766766ddc786b90ded51659fe8b1d72c5116ae6922c1b8789182", - "386e616df27b47c7e9ef67a09e662d3a4b89a549b14b9226e39d17591d5ecbea", - "f4776acd725dd109ff4393a88c5ec720ffcb6cc6ca158a1cf2424eb64a4d9132", - "913d51c2582810554d2987cdfe46a3077c05f3bec321e13ed24cc83a4bf85b7a", - "000e2a74c46adbb2dfae5d689640d26913df7bf7c5b802e4fdd3d2570ff82f02", - "c26c9c6c26fa7a73ce0116f529166d32938eec9e32c291d1b586bb17c495c536", - "788608edd29a9361bfd26d3366855ae31df0fa50eee41d5af0f51d07d741b508", - "a10b7d7c0ff384de9dda4d84adfd738afbd24ac18661e37013e262cbc0d2dfc1", - "dd25f600a8ffc4735ad5f4a0167630cd14ba347c79aafe3eb76e2b1ef7f8c6aa", - "0ad4c1ce4b6253cdde0fe2b1eac97de38c1352ab637cf0c06c8a8b78ac8b5622", - "dcf4eca20d9cae16df84931f29922cb2f81c7460115f09585b1e789831b6121e", - "4e34759340c18d96517b6b5decbee894cad530706fb8c5661f525114e57bb314", - "2bab2ebc2cf33729dc28129bf540a089702ed5bd9749c6e1f8f205516e26a118", - "b6dc32fb3af3db9b93f2a24a933ec21768c0cce256248962b27007899a03f9da", - "e256aec1abc1aac6236f7591e2171cd2d8b3bbda9ad49663bbb6984bbf6a1d0a", - "49f7ea11cf412dabcaa431bf2fbb4a57c9e1639fc75d53910aedd426cdc8cd83", - "490eca8de34b4a2e124309623888014b75362c6652d14e70dde10c65cdbef20c", - "480e2f936e4667e34d3881676a6f3463070d04b097d6ae367f2bafe6b6b352ad", - "2e0f25d74737e447ef43fb2a7f5d69208936d757086b07e026f28bf2ccc87ed3", - "b87e6af3e7e43c2af317b9dd3d37d0f27a45b998839f5100af0dafd34ce215b5", - "ca395477b222318234f6511f1c133be5a6bdc3825788c806102496a1bf11071c", - "df677f5bb9545d92522dd03d893669ffd15c9f8202ec085963abb8c0e8b45567", - "f7d94dedabfd569fd40b3f4ee181d10f43e4b416b309e8fe8892a32353598cdb", - "8af6480ba21d35cc048dbf221375b120f5ded9ae3453ec83c032bd09e2b0e280", - "1f4fc9408f2c2828dfb62ec0a7ec33689a66a2e1111bb519e6ba77944ea6fbe3", - "aefb40ecb83ba646db519672735ed34ceb1764fc8d93e633963fe6c15a0222cb", - "9b66a7c673c7a00b9f7e0d52762e15ed8cace8374c64d00801ba7fdb0c540768", - "26dbcb5645abfd4b8a3d8d0724e0ae1ff293704728c6acd63d27e3664039d3b3", - "eff9773eb32f72dcf3228f3f30798919af285cd57819f6b70c94c361d4bd2472", - "f1cc479aba8e61409f4bf03fd6faadeae7343ad30f8a3557b3c9d453e608c0a2", - "080871d764a0ab30d60f47c821eed70b8d97d6360496cee48305eacd230b0ec9", - "a1ea054ab7a912a652caddd7d082c28a5ff400642e36c1bc5df7b2b3f04ecdb4", - "a260e90fd31edd0bb4b7e0cdc2b4a1d415066d7ab2e25ac03eee941ce1fef683", - "3b76ebffeabd27ca03fbc93d873beca01f3297b504c9a45d04b2bb5f7c7f5596", - "16debc42d6c4056ddc0ae5e05b2be78b068ed861025cf0c4e78ba607c042e434", - "c18fca9a7e9d28996af4fc49522d6185c9f4610875c062f03b85e4f7b1dd11ef", - "61a39b1d9f35d384842880c1236bb2d7c6e1c821a7d03bd7932abf06273c3c56", - "4608bb4818c31a1cf9e1958484633c58426aac060e545da1d3a8f037e081e05f", - "75153b4045dfaf76433dee7ed8328053fdd720e73846ca4ad3b3ebdc7357c837", - "c0c19bd1e0b783b714d3a608824038a901e9bba10891205d0fee94568c5191b7", - "d212660d7e73f66ed576aa84c08d4d5b28bb3ddf89c8c79587a1b1e7f399b83e", - "d47cdf9f4ebe5b078ad07075e59bdf0bb69ed825d90c9890170ab55485af1de6", - "64e0ccc20bc1d5a4319621a1c71086d1aa68b6f8d830e2d0339426fb8728e638", - "54bb06084f13a626be608f1b991dd0a5c57b5f96869177e98d652167e4053dab", - "a743fd283256e21446ee38f18a1a21b7843ad19e9214797d7d66c91b4e6b733f", - "63b3c63bd2e3a636c1a43262c006594a850260a510042e946f98da4e8b43d1fb", - "c3cccf38fc37cc93400653230e3a77c6cd734fccefe6c2dc0ae5642ba508cad3", - "4ddb04d1e30552ae197f813d08cb8eb8e35246fdadfd8eb941d576c8f5fa1dd6", - "59b354d9f7ccbe5d7c6a0d84ed4c07ad4dfa487f19dbc146612148d84422598f", - "b3c37afed047fbb3a4cd461fac13df6605e9397329e79c25198dea598a765c39", - "4b7b7d7dc7aae54374fa15a1594b884ed15e4b506b5cb52d2d714f15ea556554", - "331684298c2f229e423235d7f704991b874e9fca368c618082ee041dccb1bc73", - "2872ccaf2ac205f3f003b702a0417c5ce2bfa9a263b4f6630a5055e6d54a5104", - "8b53b63a30ce3dac1cb3fcc7022e7bc5d81e5f0c1aeebfa8bccab9bdba77e630", - "d16fc66999b3fb4a0ab29acf2631d46e02453e23072cf564d508e848b71aa283", - "f03ac4a8198688409686798f90d28bcd3e812b7c187f8d6f307b00d8ee6de91a", - "1eecf9a44b5c30d3bea751ec462dfcaad8bec4e42d5fa0766c4eb358613b5e19", - "0ed692f824cec11268003ef4c020175267e2e4ed38df2e7b3ab6dff8d48a8404", - "3981d51304a40811714eb8f4734d3bf2bf2bf6c412af5ec7f0d76ddbda8aa494", - "fc9dda5d15cfc29428d281aeb47a0127dea341e166c0d727374225994e1cca75", - "8d772d48bf353563d87edbc235283e016f18d572c3b82076bbc97b72c23cabd4", - "59062176a96e929d368de15f11a6a1d7d744ccefe4557c16fadbf4f08d6d1025", - "41107d436e53a7eddc4f376734c3f656c3d29b844d32e73d535d09cb7bf7ad69", - "4b43e37aaa483232b9fd45b28e7a6928fa2d9b1bdf09b016c400e39164180033", - "cb7c0be7187155633716800ac42e51fa4011a21e3471302f64b14d202aa06e04", - "01438422c0f2ed50acd900d2d4c454ed9c20b8b889ee2c5f24ca26c9de994241", - "cbc46da9b340c3ea79cd8e07e04afab9d008a5a76fed98c323c60e5483df4700", - "1379c5ca91ded949624a71bfb24a5052c85a809d066c31c8a8bd0867a0cfef49", - "5e6382cefc66c9190f8ff677aeb71546dfc1b3bb3192044156264cb54ac2ac07", - "340b959d5044ef9f18c3e513c0e5876be0a4739c9eeff3406f833b30afa38b15", - "9a865b11f6513d18067b55f20bf9d59fe7980360eddb24347ebad951518c413c", - "69352628f085de1aa8dc832b7efce7345d85de52d2c3a9c4a75ebdaaf3dfe1ee", - "34daf7ccd4059462e0d2d6c6a2866e13279599e8cbc271cd099530e711fbf2cd", - "eb4ce991bffdf77e4d390e8b4b8793f346c53ead3df089860801e2d7c4bc2502", - "27c0630faa02191f43283207fbba03591c20a6b83437ab4f5c6dd7167c3e6909", - "c099a97b4cb2911c144ab003073767651776c9c63aa6f3f3992690f3dee5e3a1", - "9c013ae19f1e9845cc7c0ae103b811e637177967f2f7641a88b8923fb91effc8", - "533c21ef106c84f4ca7087036b4696d87d50e8955c9c40c7675c4335bf586c74", - "2ef503ee5d4c3d3ced8269234d40465b324c1d153e24d41f3c641d5b81968255", - "8597e3584d92f90c3f40995e6792dce1f255b8898ba04339a91ab988540fb229", - "05624cf2d04b4f1a8bf90982a1f46d9895bd7a54e6ecd2706781253c99c509ce", - "dc7e1133ce3cdfaca0018554815edae3abaa079ba490eb2afd4ed60e1dca3282", - "760b148ac67dcb7f990a86ed05693ec96898a20b1c7b37dd86d10d5420776ab1", - "e3fd024ac8aea59bb0b56aade8cc75bc16a6c320d13932c2141ed987db3b938f", - "def9b16d79ca9b8b5e3ee00582ff3e221dccf17bd67ffe5ec69bac168c0ad88e", - "e4dca4a5c511b851cbf150efd0386692dc06a4253a12578b62cd3297159c1c53", - "fbc4e91a42d2385671586a9e9d3bb703ee2a061e1747bd8b41b93f6caf395c69", - "958334ba3efb556ee57d5e7ee359e727b408129eec6d61776525d9b80fb4dbdb", - "84b85b2e0aea313059158fc3b7947a9f83dac9a8598fa4bea1b8f414bb11772d", - "560b55f673c0f89535683164d2ff77a1f7b2d7dc74a67c208881bf144643bb9a", - "bbc0e2079b247c294616520ac58044f222ae7f7f87ab936931ca5a70c669621e", - "264c0483e57332f1c536f0d4da3199d3db77b57fb88736089bf83551ae46527c", - "98a4c6818fb2683cc37ee3f84c75f2481535ed9c47b4b080d127796d4a860ad1", - "7cac667dbb32d4ac34b3b641ac030820c824dfeb64bf1b71b4e67d7cffaa9161", - "a8af4187b34d2e6cc0d33f8d11e13ca2b8a545aa228e7e76bb31ed3781bcd832", - "7a8b09310be576922eb0e18761ec8eef69b3db98a6d6053c0a94abdd79206768", - "0904249adc1cb656c328dccf22ed468cba6b60f51a312e232ebfb9dc2b79d6df", - "edb480f192fa021f28cf634e12e6bbd8fb72831e3b5506b5c8c6e24ee9b69a8c", - "7ea98a013f65954777378a70438bbec173aed340ffc0aefc6201bda6969b8525", - "901927e9be1f342f61c9935faa4b6e36961c3e6c7788ec11617d2d07969f0555", - "aa3d7d21d99a1963a45bd14b2267ba3dd83677e2c64ce9d3916c5e8e29329045", - "5103b51d956a785d83d39ace8b714cb1c0191500569eee72a1dd7c3c51f5facf", - "bac78076aac62208cab0fc095ed46f98e6ee1ab4da60385c96c3889afc2afd99", - "2db4f9c241c4bb17ea235d77309ba2cc2a981ad6666e307e4a7e46827194935e", - "634a5e12580af1e251e856d560f9585307ab76d0f36bb466ebb68ed52488a364", - "ef7e45f23e1dc9253525e54ea0f7394492c7cb77f34644f3da42c8363d86a9ec", - "7d5385233c07ab8cd406f3cabc6de59c6c335cb2844b27575bba23fd6476aea4", - "3f4671e5e7a93b0f5a9d69e38bd3f6684c518fce138f1922ae99eda89833769e", - "07418e821311e66ac49d823e7bf7764ead613d3e20fed653c4c1e322b2bb805c", - "f03ed435e07ea5e96454c4c93decf87362ab2179a04055a13efd58b67619c57d", - "9b69ea1bccc45a5d4a7c3af03a6cdf97a49c703567e03663cb055f8e708ca0ee", - "5477ebced5af346a14aaf7e53ec54d6c60d135d2507401ae6199f82f0b3e8a85", - "6ab5f25e2ca5dea135ba2fd4ee4d054fe6ac97233a6c8325bc4a1b3d18791a53", - "6c17ff1956122933495a0582fc643c52b74589437710fbdf088490e346f932d9", - "2e4398c536ed0df4f416ae3415bd526a253149b18e23f6666094091cdbfd255a", - "cefae7fc38af25441923c1160e72d58d8f34592083529372419e798d57859161", - "1f000254d6f3cd4a89ea361d182fa2ddd064911dac096c11a69dbe2d37d1e338", - "7e522bd10216d9eed7ff080cd3181271f742d8782def42ffe5f495b9122c3612", - "62f251cc4482bbc3b5d692ee10e2843462e7e58ce307f04f558b29c5c29e5254", - "a803042a78ead3a573f756cd36f9fa9512dfce490685bd7fcb306eb172487568", - "9770ac398a7444d9c90fd74cdcf9a45d0910e60a6ede6c5ebcb355534f363e34", - "bfa06166a3dd33606a9c2f68ea85f352ef0fcaf1b768fe1fe606fdb4cbd30e11", - "6d8510af0dc470a243af3b78fed0c9754517cf23f84303ca2035096c406c4cb9", - "68f432a28660b4a9f19ca0f56b50e064dbfd4f82af8a41461524c9e7b5bb31b7", - "bc105d773f9f9953649fc54c720dea243d20b2180b580cd196f07bb9d425fa55", - "c0f4aa4ed32b4bdd71a4cb5a64782b9d095192e9f2a5d3b00184ced2edd8c0b1", - "22dcb9a75836ee715a56bb48f6dde0c210164fd9ac74a481e1d7060bd7e625ca", - "7e143d896913dcd47d3c6e99a1bd64893b502adc89309549cf562c9170c87ba2", - "31592b9865f9b3527cef1061aa49e5df31cafb4ebcd14c0c6c1a531f523fae03", - "87e0c6d10b8f93464f9aecddb3a2611d5702220b3583cb26554f480a462209c6", - "d531089775405d503d8063f9db33c5732407136db6ff01eb50bedcc3aceec7b0", - "4f60f9da7fda3a07842768d019fece068b466d826970279039527d3465f9e8ec", - "66aa3b424bad8bec58b8446a43c3ebed5f0ac17b5e7f8a28651f99fa6bb77ad2", - "699feba5906a07bc7cf855ccc4d91641e30f505982d550062620be2e24da4f67", - "cfa3463c75bb30a54d855e774a8f4abcfb2d2d46f9bbb251bb13651c6ed10cf6", - "c2d3da2256d8016916bb00cec2f945d0ba093c955ee1590418784e10ba9516df", - "6ad1c800c511c9e15d0916310f691ead297e124671b052818cafa7d4cbe15833", - "e2d4067d7ce00e00940427c04baaf413525ac1ccd993a3da1945ce51ed72def2", - "12f258903063dd705459544b734cc5ed0630dc7f7c5641a4750936f3fc89014a", - "85571321c1e34d478df6dd1a2201075f802033cca1471e4a43f025c2ed20cd29", - "0c17f7f3ae0fe83a23d8c9637ade4e8119f1153aeffe5e93f9a332f88cfd9b07", - "58f4fcb02a42e200a3d70522741834d180dab1529ad912a6d5ce58e21544369d", - "dd7169e41a64b531fb706d53fa0c5822158dad03973a9e249ad7c7aa88b1110b", - "a04059a0d7791118dbf8155b875a8bb0e63f2d126bd5176cd0071c056dfa41d4", - "b8270d6d33dc26d33e55234f7b92b30561616948a7acd179c688233d751ef3d4", - "1199e38a73ad4e5b23ea27e835262cd639c9cbd445c7cf5a6497b89217e6d015", - "b4da2baec3aa5ed705a96d4c7cb3cc454d2845cbe4af34c1e2c06373abb9dd0a", - "51d16c2d6e0003d269a01664e3e97582aa2d64ae310c6ad152b1be4278f48067", - "9ef66eaae4c106ca600b86263f6739d20bba8750e242c9d822b49901847fe860", - "35b36343eb782d5cbd2c199a54a5b8976248a926af3e1d5f124522dea38412fc", - "9325b484600fdeaad53feb26237d9b442eed683fbf0f7e851818bf77ddb775e6", - "13513ad9aaab5d123b78327367432f6bf15a55cfa210b3ac2270b92934279566", - "2749533a5e78747895ab73faccb0344b3ea3bfa9bb5c45202580de686e26a5e7", - "36324403ec5a624813aaf732805d3b0da1d6d95da120c78d541a7c791a0017f6", - "91e9145d770152ab802f19739e9cf886c8499c40a11958b4b8c2862074631d92", - "c9b007ecc01e521fc3f49bd38070895e6a19e13f06b57dca2288147dcc6d5e4f", - "5925c5328d71d6c4b7bd7479b03bab736b8c7c15ebf10ebc6eddde4616325fcf", - "d5dd5c43467cbbde9c6ab2d8498a3b312a3980171f20ac81af89318484f3f195", - "e05fb11b27bcc8e966ad585ef7aab9e8c74ea1bee7f37cf13446dbca2e4ef583", - "2f2a2aa6bb1afade0925f6f687aeef3d0027ea89c0fa60c31c2434e840e914f1", - "b4c6499d149270eb22257bd62e5fb89416a5a85739ae5960e34c51ab62954952", - "4211c7a7bbaee189477a269bb7411bd92ea87794c6eefd3795c069d3f49e070f", - "febe9b48ec2b5e23fec1507da63be6d912a6140ebb83af173a77fbabfe2ca72a", - "82992f0b41d82c113fecab51e208316a927632353fc7329712807f7c1a719eb7", - "0dcd7ff51b290042f58c27cda13862c354e0234c3c6a3923ae60ab52d01d7dd8", - "42b40ab144dccc942a3fa40196ab4f74831882b868f239d6cdc0d57171541274", - "600deba70681292af7fddeda3f10429817faf627b6fadcc63530daa157946f2a", - "10972b2563edc0bb8dab7932b6d7172ffcca0561c079dd12fefb57ae6fa67da4", - "6345bb5e343a7b3430de5309e8ffca568b2647a0f1b7cd7f8d6f7d3000e4e500", - "9e90c82a056e7c86abd42ee450f54d65258fd8230a002c4084d7069945e63d29", - "3eac73e002d26f97a4c30019985a27f21d891084f32be9cf4ceb3aa797156da5", - "f3ddc409e3db2c25c67a6a25ece6a50a00aca8e4e49b897c54bf67b86f22a09d", - "6f706aec638da0526df001063980d9e3f7e2d2989c87bbcaea0d74d137bb07ab", - "2aacce79ca665d110e1d7f4bf4bc0a26a2800fb41ecb7b34b0a538da5fe01614", - "770f969b40cae72d2e8b2b9f68bc57a8d0e78cbce25023f0a7d3705d6c727f2e", - "ca5cb05edae6c02beff5b9db03d616e93b98b1f357c0b0323fffcc0d2cfc29a0", - "b1121a2ca8976246a11ed6832d12c23c4fc138fb2b6f32fa4613d766b22a4f49", - "9492bca061a15b9cd33e2ac18d9c58833acfd365aa2b6ccaff729bb41721222c", - "c79a87a942288118296d7aa886b0bc5d64626bed9daf7b6933553f3fd9609ae8", - "e6c8b4b21e236965dccd6d5c79107f357488b72dbb461d5dd6b422b7d57b1262", - "83ac7e4478d22f1644490bed395e925d22ac63375fd79fb772f6dfdd418f1ebf", - "6f83b7917ad0425a8c9a017d25d5dd804baa148a0d51872066d35d723f9f16ea", - "56cbd6ed07c5552f111751b1fa77feaa63c06ae9f93be2f00a9a42aba9ad60dc", - "9faca17912c0f585cd7825ef46bcdc4bae5f14a8699d0dc8a010a7f98ac182b1", - "46dd8df17899811f58925edbb43a273955ff726b333e4b93f9686ac25e64680d", - "be0ad5564350a0b6f5e49c4d0b0c0e8cafc6ed8190f2f0f506276a0d1ddccabe", - "b09d3f8b2868f14936d4aab52cde03c57a54db2c832883ca3f8639410029ab02", - "f34752fd653f662d92a2343a249bd50bad6f587e47fa85f6899870587521f030", - "f934411a36514c4d841597e893d3bf7c042ec324648b62aca39c58a6d3aea810", - "54c78388bcf39556dd1d8ec1f8808049a6a151fb498c62c8e65177a99d99f906", - "650d2e68fe91fed9bdf99d49c930409cdd51dbd21292e55b2bec41cb567573ba", - "f0224f159cde30fa3aef5cd46d09ae6cdb65989d8bec42a017ba68b1dc004ef3", - "1708f2e33f01871da783028a2a4defa537892f32f1188a20f0e4771d8891a704", - "bd92adc4b632d487bf5e75743878c4b66cc5ab80b648b3ccdaae40e31fdd9245", - "9162b1cfde5208303e028bda4608e21b7b39c5e86fa05ac27c9efc03711a098d", - "b846b16dee54c3ccbe1f30e3798c66af8ab996fc7b15359ab8870e8d5ec7bea4", - "907d164716c01f78b6c816f541fe1fb29d29bf6c81888c425e0b6df821ef2dae", - "6e9d38d12e09211b6fc5eb5f04873aade7f3173a859042d21e6cd3923f372b4b", - "a967fdee955f0ddb0f89d1e4401bcacdf58f17c7383ca3b72a77c114985b6c50", - "5db32d3df13223362d32de42a62530b2b35072eef5322a0b5685702da0141677", - "1576e2b5d7808a821849bdfd874c61ff0ce7c4ae1c67ce5af81ddc583d2c92ef", - "95c321e4982801e86301c970479e6a754bc3ee3ba67ecac123401c3f1b9c8d87", - "e461426fb1a733dea8e23c8828736a156ed69a3d40b9f3bb8abf76610677c188", - "a617fe5343277690181b1f2028849a48faf7db403b70f46ab56d17cf46e916de", - "7725e5d51470190c942e67e78cb1452e66343433abfb6bf7294525c16f011a3c", - "6dcad5fe7d0f290899d5da02a55a5f29610bd4250d62a4fb6195e4ec4a2e9155", - "4f33bbd39631ef5efd50b5680429482a77be73bff48ca39c28083c94dc364122", - "fd467a35752223d5eec53b7665d9a5c36cb7a1235c10584d9d0e360435c7bb4f", - "5ad2e2a1a6ab408915332d5f48e4f8d50c29083c50a32b32953a91bf5eaa15f0", - "3f79aafe6c4c8495cc83af4f6de2768e88e95f0e5c18da41453b736f8357f0cb", - "9d2546353143e2ae5f24a70cda402aa612ab3e2e7661c98d41fe90d631d87605", - "67a871695068db84c8fbff994d7679b8e2175ecfbe12e6641918197f08d7b0fe", - "c16b360dd373d4f28bd3bb7bf38bfe916b22c8dfec7a0773e98f686137f4ae68", - "4aa55fbf8d2e0aa4fc473f8610b4201af965d05430a1c13430db6f343d2bdb1f", - "22011dcdcfdbc7f4198a6750169aefa70bd1928755e75fa6ff10e9848a958ebb", - "d190ad96ea59d780f3ce8b65ea6bfac5410994e92ab26a273bc560ce66516c22", - "e83236f4f40d8c9c677a3de4f8825ab81ed0bb08e27b2ea1a374ebdf3fae588e", - "d5e276af5fdfcda1379f122de0bfcfb2e74acbb404147a1ef80cfe4765add67e", - "19f8eff478964576d4604d92602c7c8965150323afea8be3c370a6e10d4b6494", - "279351828af33b41774eef2bfdf3aae276f7470d1ac8a94dec054a55561a5ed5", - "7d85be04dc7a6433befdff12411b60e6715a4e727071275ed23e5db4814a2790", - "06b958e370f1b58cc818f22bbe75e02e2858f0ff4a809fbced9c0b69ed8802b2", - "4902b1262213c5910152ee7fd29ddd8d92f04c322d5a403434a6011505683400", - "bd637c0b1136fad3e1e67de68a516a6251c7a46b170a761112fbd1fd9b5743c5", - "017863ed8e01233bf0918ad0369a748f053e38b924fa48837f2f7b1eefa585f7", - "20560f39e7bbb191792d778ed7a4c647f610e16f74804441d1bdacdc97b1c151", - "8a21738c64fdf45c81431562c22bd8b66409fa1ee11ec45a67f24d76b12b1e82", - "648032aa67fe2bc9185a96d47c43ce39e23e980ee92b70f3f8ad8ae3e1e14135", - "794c779002c610cd88d426c68544b964d341598f4da2e50c4693a3ec0ce9e0c8", - "c16d53a68bcf9057e34ce8f09b958dd20d90f51b27a97bfae8c5d6cafa6a7e1d", - "786eda810b83f98457bcee11c11a24cc91b4363b1262ad9509a439a36a167826", - "1d4c62db5a58a76f384e46d940a9d664b4f0c8474d1d7ee5ea7c9e9c030e4e3d", - "054f676954b22d23275c61b1b548d539a4e6e187ae9b6c82e5fe65d882871ae7", - "9072ee552c7daa39a33f9da646adb3b248abf8eb44c05dea42095fd3d7bdde23", - "0c07091ccd9995f215e827e2b42938c87da57f0142561be1794e2343faf301a5", - "64edbeae3e2c57b8894ba48502997bd974b2eb59d802c2e701b9d9e75b1c6680", - "e60fb5d39f35a1623dedd74cbaf25dd3886522ba4bbf9838d83b25f7a1268b86", - "eacd57508e2465a390555ae43c730246f65b0a4ff87ce753c1cd4f61260a1461", - "09e89f858b77b1b8b325c3c865e13dee21b62a029f10be31bdfaf271f92d46cb", - "41333846660419da382dcbb2577d6b87bd0d039115a20deb9a3b17712a09faf7", - "d7e45e9f0bee13adaa71f4783f5c85b794027bd62abda32460504d368dee6d3f", - "32ab4f3ac31775638fff7c28c07c80a99d1419ac4fa0a82d7529d30ec6452d26", - "b4eedb431f6312c916b85282feee34c4986d02254767996ca72e95281fe26ac7", - "5bd68c1a8ecdf61d6ef084df2088405c92fd087792e7dca0006eed522f55451f", - "e87916d0531608202052eb6cf857ffa58efbc17f8c4e8f9572003ab5dc4f6a0a", - "7747dbf677449d409eec05a5616a2c48b053ea758305b72aff3069d30ccf6fdb", - "464ad3c29cccd16ac14ad1c0e46dcf9567fe39fe3459856642ad1642b005ff7f", - "3b87a597dfce8389982b47a3381952f441373e11d4ef12858ad19ecd8aae4015", - "ee362d9f106d95d34104a75011e71cfce4d2ee83543a57d7fc3b487f86cb3953", - "81d08401d16a3e253c234f5f9a264a1f83972a20108d1bf9e8b57f9e61cbd6ab", - "6b9738b829a156d414c1a7aa35ebc0b4a46af5c6f39a03803cae600dec6f666d", - "e7acb1269011729d33838f624933628738269968cb7337dbbb815924eaf9517a", - "14f34204cf4510a5032e87735262f36fb5be60602c6a5572c0e05e7e3fb86447", - "6208d9e4e6c523976453dc9c459451452495eacae846d05274005e4d7e33cc42", - "7af72c75265e11c5adbeb6de24a413062bb3db56f9c85f6dfb1abee019fe57cd", - "eb14c16672d95a44eea2c658e7f0f671198a081729838ba5d84ffa7d6816cf97", - "0d194edc60a8fc4e780ca33e439ee9ec9c726f4bcff4068b6b8e6d75a8c2ba80", - "fcb7ba15cc3644e12279a150a157004003cd891436841ef2656a182cbf371a3a", - "5418be7e5270181f213c971fe04c4000acda36d8ada9948de6b4dd6daddb8fc7", - "ee70dd6b59a78f72cab79631520f6c4581c60a38f963e95e3c1ca77500c10409", - "15ffd3f17808e56354b32ec3ad59218d2b9398e7595b9eda405c8d72230c2ebb", - "cc1551c67fc83e8f11c46dd1de41fa079450161bf32ca160628d4b84c8402f39", - "f23d87d5cbeaef6a256d7ceea6ea6f9ab0bac76ebbc1949c251cb3dd5a74ac3f", - "1d292ed8876f62521383ce5176e62c604c3d94b39ce6a1c8d5ced5e0ae7e9e55", - "b650a2b87ea6c8f7f47beb3dd4a63f00b776dadab691a930753291416b44b3da", - "22f7df148814aae9f7f4035cb092082e1cf59013b07e4f06083e90e77f6bc52c", - "d7a47590bcb5d4b79d496e037e0b01e13aaa29560317a2153edfddc58b838d44", - "bac22a2d168d0ca82473e3ea7d6819ed87cac688fb59f018698c4b3118225c27", - "2befb9f49c72e16d95f883f1d7e80b3bc0bbad1910d206635cb2ba8851694524", - "daea145158b779636056af234f5ad7d3106f2a310fe55c3bafa6d009d19631db", - "2d15598619a2e6539fa3584aead185d193b22d1bc730277a1c08190e58ced946", - "ad0a71603996df67d67773bea4729049cf126d875c3aa6f8a341807ec6535831", - "5d1f8ae40c4920870a15220dbdd46c7ed1dc82ccf9a6b3767b63a5440b6537b6", - "e954197946ff6b0cb0981b612cd3f9fe89d42830692a5ee4a9d87ffa6d21b5da", - "148d5c11dd978e0154fac6b10b5b30a6d92e15c82f8b0064c0f15b4a01b76a48", - "937350ba84d24e18b098fc97aecb98565128d0f5048ba313d881425c3f20e7db", - "1189264a2a4df5bf3d6057ae07c295700d2efd6cc5228c8d3a5a64d6c04b498b", - "65c64dd0fdf5357614d96d7da062bfea9877a2018751d3b42bdafaa0e235455f", - "dd26e9d31fb9ea072a72b01c0499aaac9c955ca27c035995e8fd7ecf37d5557f", - "4859fef1e9db43993703a857f9822e7ad6e3a4774f51acba2b59fcbb785bf3dd", - "afec041e0813c0002506ddcb3190136cd7d9dfee3112145b06440783dfa567c5", - "ee22d744f5515ada982f3df1c242da93c8d9a7b596faf7bddb1f271b06200711", - "46ca4d73214ecc968703502edfb23502d8e9dfaade0389d631e812fb92a35803", - "758f60d4e92118c936cf338134777ea55b5aadce61d6577d18302c461b242ed1", - "53cf12eb12eb0354071d257274fde441a8b040a8a1a37057fcdb61790f97bdfe", - "5267eddadd46936fe5ebcab174b1479cd3e57544c3e634c97f658bdf26a8a073", - "825e9cd050d64e8e5a65a59d2730a4b01fa5667649f3aafb015286b792a4bf6f", - "1c388369e9657b49c5fb73fb1253d6fffbc68503df61c77d019df5836763bd1b", - "b967713875b4c9b0bab68ec46f96ed10c563fd1b5a4e3d5cbc28ee135f01ba28", - "0ddefb3e53501d88deacd45b43d8e095ede734867f2cabda6580a6f3f12e5547", - "7fbf980c81a962d557347724c25b5423743b92ce14bd4d3626a6ae980c648f6d", - "c62194de5b53a922bcaa3e933531cabb8fb733bbeb776b2f228dbf848dec4632", - "7f7f39b5d912d331e4d2498417e6f86f51984449ba3030331ee50625c81fa247", - "918aa8920af10ff95b92931bfb5874609fcd189bada5ab021406784f58577353", - "87404f4b7f6e2682bab525bc6cb5457fb3d71cec54279130f694af06769360f6", - "0ba802592058f2efbd57cdbdac543748d3f8dcd601ab5db154fd9dfdb7f9c64c", - "175c25669c8c1bbf80964905225bd26ce58c30342cad04aaa4ef8908e0bff9fb", - "6e1d00f0a783ff127538e670c2cbd692021d75271a0c70d848861f3bf5ba7758", - "cf68fafc5ff3318155ee29a500fdb985e284ab32c28148e894dce966c6c9e321", - "6156eeb238176185063a2cc70186a36a5714d7b8eb9f92d14320c14e5e6e6e70", - "92d3db568af8bb85a4754f8fbb160a32e664effe1599b7b45f6cbe2edfa02726", - "08b54a7811abc13ab65441bf604e6cd57e76b339a9f3f162dabe7baa432897d1", - "8322b25db829b63d5f1c681516fc6401479a646383a0c582272ba57c88784edf", - "905d9408f581faee39ffdfe4f0a209e192d0796e08e529cbe01ba9319c698c9d", - "ae4d002a7eb87d15c0722d7361d248809d8c66647c01d1bc22c0d1d8d102d517", - "d5a7d31866adbcfd5df12dcfd0fd8ee4db1e4c8e7d2db3c0b9d21ce1380bf259", - "bdfe2dd2043be272681d62547363861e1cc9c03da2fc7b57ba3ab0a29a10b6c2", - "1de7e34c99e3e853e24cb32697410a2f380b20588f9cec3648b4c734a88ec6fe", - "ef47f0822599839b4d58a72630562792a516aad1fe749e24d5e65670344f05f2", - "aed0ebbe4602081c85d91f496106156baf61914bd99baa55d24f294f9f809400", - "89a249a4517546dc85a89535ca3395226e77637e425dbf7adfab28505f1f09b9", - "be6f9b7ce6785f93edd9579ed124e09d8d8edeb0e1e852c0646a674c5e48a436", - "95c8c85370069a79cb46f4c5244294e0d6f911693060018497cc558846036147", - "ee311cce023ac868b4bec621ad48b8f631cdb444ecca2e5e0bdfb01888b6d1f7", - "c25a62586f0ef2a42259fb9060fb45d071a7338f3ffa888dacdf435d59858f0d", - "446b5ba566148d7c3bb433775f2dc2a0ac9ec2ebe05095761d5ae940f1e4c13b", - "69f639187bacb7238ad766bfb89d89c7143f44a2ffd5a85f5cb4743c8b0481c0", - "bdcac5b12dc4be937e501229c3c348bf929fd98472cf4f2dfd65d66c52ad0031", - "55b45d88f4733a3d4b1388e5cd91b09e0799af30bc30c6e459ae8ad5341bc06b", - "62a148cf2af3dd81d96b9e6a70e733b20c8d86da25a8cd56ecd1c6858c81703c", - "6c0fbe94f5989dcf5a2a53323d3017b780286a8afedc4af2468856ce643b0b14", - "6d2e52815f23c049be81a7e52854f2682f291605c44fd56b35b429e2aa98efff", - "087972c561b68b3741d58c107bfe9e65cf7abd621c378d1b068ac6157566448f", - "c482864a7d711cc9ff38d248313392691af29de982c168ab93aec1b3cc5dbeaf", - "bc92bd2bd4f7e824fa568ef5bad5ff2f843299b6f1ba95c057c7cc9f4362d517", - "f84d7fa335351dd0bde1c9851d91b8faa879767c6a4b00e4fd13eedf8d1eeabc", - "9a89fd25c677c7469085f9790b4195efef31304a742405bb56677a6e69adb38f", - "9d727336c7c25e6c9d6a9a9889388ff6b0138c615fb6c61939472ce49546b01c", - "3eefd14ce2d25d577994f77e82c9d89ea11377d7b68f11f543bc3ae38f8ecad8", - "ba95d3f0296fc40af856a3bf1bc484425186ef2c0d09807341b7a4af8e89d0d2", - "48316acbcdd3899915228a0e8e11cabaf2aea302fcb65767ef5d8f9c7aca537a", - "836a8ca24ce2c966aa2ddd6f59ae38efffaae8972b72c8d094539dafa254f808", - "239945c87fb6acca9b534280373067a74f327cd9067b172c3cbe9538760813fb", - "29156a8c64f662e05845b1778d61cc216692cd221009025935977103b33b25db", - "a73fdcd60c50cad6601ec2accabee29dfa218a21428208de7d82c7f4ace6790c", - "8e3633b1a23a4e3697dcb2ec7571900c4dae44ee5f4edd10e1240835e1ae4758", - "4fd7d5dfa4a036c125e8d5175c1fce6a87b04373fb461ea706c6212757fd5afb", - "9d252c10fd1c139eadcbc86e6bc5ac3fc19be3cf2dca3e8bdcb7abf96082361c", - "2f55d7e1ce114137abbce024b89530c8d4de4d33f3d9a7bd8572b1d5bb391097", - "c72cfea594a6c14a1c7c41fc31b82d67027aa9d4c887134f5cb4150a31fe6e26", - "acf97695c5f00a8bc61649803351e8d03d7f8565832522d336a7a2e3c8901a44", - "245028e92ec5560e0ada456367c77be23aad403dada4d0d1cbe6f5d804aef068", - "1ee4de23331d15e72c7bcc6aecea35c3863982d756c1460a8dbe4dc83a1abfd6", - "72d39c61d5cd22a78dc8a0f878f4c48e8e8e8fff218fb4ff5fed7e5febf12532", - "d99ec9123ebcad047a23056b4dc4d5e7c5a84e5e4527d89b70c4593040cbd1f3", - "6745e30626a292309b954d0cea465af22a6602d3420aff3c3efe4e6614dfc342", - "5e0d23c5b8f7da94181798670ff437c5a17b8f7461fefa489867a59b5f66d4ec", - "cb719e2d29be6dacccfb6411a702dbaf846193fbbc8e50ddedab656c98679f55", - "fcce5e290b0ab4a25cdef95f9fa5dce7f37f9187aa81818edd2134000f9ac43a", - "e17c9a5caa99817694a4507ba4ed967259223fb31549dc79a0515c9d8b17dd14", - "4f8774487c46308b9212cd6525eafe60ba57ad088f191dd0e8d5a4622302e405", - "24635d94e8714f876e209d56323fc8e35e80173104199bf2ce8e0af3059f73e3", - "28248d250bfa4d7b9219c7fee83687f34091a7549fd5453121dd28bcc3506281", - "ad24ee2aa1fb52979907dfef673d045c158dc68fd3f4d10a51bc15a0cd979eb9", - "ffabb85e0e1f06ad553fdb7f0aeb95253ba81e6c65a19b5795938d5ff112735f", - "143f648edc4de67c6269ff6cca1f5934aa1fcbfce517a19d655289a966ee53d7", - "7cd66d05eb214c91cc90845b4e30c29e8fb047a005af3735cc111b7239c2ab14", - "a4b7fa30cddfd792807b86600027576cff6f47747b4626d76f795a296391cd2e", - "fd0da1095e1f20568729f174107a5f12df992c83a400d41ac843315444816e83", - "89e527f0aa014e34707164920860552e6afa902201ebb3c313c3643a0041caa5", - "08bf6dae95d06f5df77785d35f763445ffcc1f90c8125146651c22ec702c91d2", - "1896c5919885e25eb8d00f2d0e22952764b1f7c4fb059d8686f85ce2dcefa842", - "ebf9d490cbeddba856bd8eb6be3c429302eb5ae6db7c3bc3e35e8a8dabbfad1a", - "84e7b7c7c5f7960fdeb04e2a2086e612d46d977bc2a576bb9293cf8d73581158", - "355358f833780d6a8f09a7746ba98a06e75e41f47149680f2ac9a2e4bef11fb9", - "3c92462abf3335a1eeadfa5ed884c1741d90077716a2342777278761d98697dd", - "99011458102587104c011556a3166b3c999181f692cf98935de8acdd4f66a1b6", - "35eb6f91e951031b6dbd0743fb24eac8ecfd8aa5cdafcd4d660d85299a7bb429", - "2f6a8f19a0dc2c8dbb63d5d759857756ba3950a66862c64b08daf80db0543690", - "1cc5af09973fc4bf7f1ddf5ef57ee3c7d8f32c6412776b7fcee87a69499ff55c", - "13d0ea9fbebc4530a516e2fa3952ce9925c9d77e464a7afd74fed0b2ac28a585", - "01a9fd8f147866824a8714eb1f5d114cc30f337bf0c825be3e0465a87edb91f5", - "b169e59f2cbb3880f62431078cda7ac38d3fc5c7bf4a17799f407873f7b82d17", - "618a2bb924c3a75164daef875f125ec21ec231c37b113a422c3be2b4644f7b40", - "f1c727b0d5b7152a90bf75c6825c0567da9118d3a02b9bdf29d5b6aaa1666df9", - "59ef18679c11c3690313ed2e538be19049adeb47085d3b6b9e3f4db218387f20", - "78ed3f9748b547e5c9cb171924ceebccc1f89c6f1c5c3408625f4dee93cb694c", - "aae7b3b826bf52cff853799ca26659bf4e46e50249b37620e2694d81d0677c03", - "042ee8b6abe9feeb30edc85542dd3cd1f16a60fd44877d4f960744bd079c9526", - "06017ba8380ba3b252240ad0e1d11124b2621e615883022bc867b2d558cd48b8", - "29fbe5801af575f362510b33ec36173d62200e821bd908bb8e9564db41f998f6", - "f551f476cd56d4781b2e3a132dcbb3849bea9cae3a2df1ae0a6d004c78ec20e2", - "942772b50a7658b66321d8eec5b999dbfff2db7cae7e54569c7abe46bf8aa459", - "e7959d5cd313c100c05aaef45b8a0c285a60689e8e7b75c1f05118802614bfd9", - "96f9d8bbca3a726e904175429e528a45b5239be139f49cc15eaefca1757ae621", - "a5deb48be71217283571df08dd5c604ff3d9345a035927766d736364ea799e13", - "669068bece395b4ca920f2f15984f7ae0c54b700f4251e8d732359fd46722910", - "93cf6efad0f70e5642a4110a4535b8fa68d701f8df3cf6891142b6dd0efc7e13", - "7a950f5e6b4987fbe12819300fdaae4b6d559985b7608eaa546e3629c4377732", - "79406983ce1466d30484c9faa9cd870520877a06e36293f5a66981a7ed13e460", - "cc989a5e9f7804fb3774898edf5fc562b1b915f808d50f5e8e5fa267ee61f06d", - "8bc7ee0b63a89a59ba9d7f2c5ffb3c534f3a1086cc8a7704c12eebfbbe791cca", - "79042a94e385bd61efea02a3fc35409ae646d0b863d76feaa608ef985fed36ae", - "38a8edb42cd67f676f1f3ea670fa14ad73077d762f0cab164a71d2c991da5c71", - "15de758ad123de47c313e30972cb203aa1ab39c674dbe44c1054740587a139d0", - "50dcb919f5b637e73b0ebb891b1d046abb81b0a7461910780911f2e4e34da0a7", - "aa86ded8d5cc06dd021bbbb4355ca3d17de7cb300f4995d908b0f038061fa183", - "ada238a842d1186d5e3a03d2185f84ba96cbe65ce64d87504a6039e10181ec61", - "34a68f66843029271507fd30e0ec58dea9da92af4cbb6a69a3d1d5fdb0b137bb", - "19f651a706f3d5d314e9a032f81693adb9bfe209fbf65db4510891c45f93ea61", - "9e88f053771fdddb1c598afe78cb36f0d5b3094618106b9772f184323ee4c5cf", - "624881923b1ddc3bc641bfa3ee6ebc223d7133f4ded4067072c4c4a8b47b0f36", - "0dceb064b74a4c8ba3cbf5fc4eb4cf18eacd863066087d57a9adb620b18e9aa5", - "072d61c5fcad3d8c036769cdaa39fed2836a87ad61a383824a18cba37e4607f2", - "5d63be62b0b40e75b420ebe8828d36980bff641e2ebda109cfef23307d5c961e", - "a4dc024db5c2deb7252ca3ec2cf4b92b090712cfa0ab24a5aed310ad1b032596", - "5bfdaa748199d6c363318361802693cd4aecb87911d2de0982aab68f4c8da2d7", - "7f29649d9c06d8ce7ace50cdc2417173cad31c043adfc08dab1deeba0763b8ae", - "6dcba786bce28eaabbd90a278001b393908674558967261cafe6c8a641243083", - "8a435c38f344f7bf9451bbd6096c943e7218dd56a1764290209f02070e35fa50", - "c013e2cd2fcb58c81c4b200eb606417288338e635fe993a967831f72aa3ce8bb", - "29f4936b9c9fe5303f8939bf5aa4b5475a1020059de5a606f5079a8c3be48c2a", - "bb9b947dc11e37a05ea710a6474b0e63ec93e03bd33ac7fc49d9240e85d9f424", - "f2eed2a7be20a25c35344987c1c31ace0a6ef081420bda5f256f01d6734457c1", - "fe7fc19b688fea21856b38a42d29201894898355bec32ab5c625bf4f95b2f09c", - "585dac60114e42de15bb57bfb42afd0ccfef2046ec204f9a5ecb3cd55bd49420", - "0f41d53cd3e93d1a64276a8ede64b197598efe7b15dcc7dd0a1bf57982f277a2", - "cd373369eb4f83375bae8092c30b9eb3037cc7d28b543970c9f8942a45790330", - "5e9327dff656bc631dfb7da8440214d533f8f12808dad60a6ce6cd78a5ae2033", - "0eddbad4c7be6640ebdc3646ac00ccd517ad15969ccb025f8ebbe2681c0a9a8a", - "451c9893d2c35866e959efdef56bdc9e25a595d451fd647b7463ec35802c2bf2", - "ddd36019d822f28e558bbb1e74a9565a8150d50797532836e88d9a002fe72619", - "8b68934c28e48ddf4585f82e3b9a5aa9e0493a1d49f07f6acdce6ac21cb50329", - "4b35979e028b750b693c8a3d9ad7d1c593c948623803ddcbd1e577f6439f025f", - "158ce5e108ada10870a0280827f0b3d26943551676d6e023fe98da87a5437ed0", - "0a0034c74e470e4282e08d6f41527679a7e8c91c873dea163386792212f07c29", - "57067ea91a1728e57040b4a4f098545e0bc7c63c3393659af49451f60ac00b68", - "6c49f148e6b0d85a7ad529a003292da4b8c149c3fe800ec1b7ebaae8472494ce", - "0dabfc249724c6c91d487214da25356aa5b93de6a4b30dad94960da8fcfc66cb", - "0a651bd9b54abc6e4ab5ccb2535d9fb3c04028e36c522bf3e464f14ca885c9ff", - "318c5b2957014057d38ec12f74e2c5c7b7d50d4550abdeac38bde6df0e37f592", - "2020684ad9f9e02829a9788b6b4d32832466233fe1d16171c11c4af8e8675fcb", - "a6d5c15c5a71321d88f0aa377fefdf5e05c406d23dd2c3c16c9c46e02865a04e", - "4af9a5ee77e6b7154b63dd14ccca4735ee9b8ab24550b9a0f8d25abc49561e0c", - "6adde369d3ac23d94945ab9fe086ce52793426b7a329450aec60400f446b2b4d", - "4f2d79c2b3de8ce8925e90c8266a9dc82fb3ee55accce430671147c0002741ac", - "e18c4ad8872c626d36183b4771376f634bb67462f495e226e839fe64f02dbe8f", - "b817fe17bed289d6b0af74a9d280a2ed09f2175a026a96830baca288f0fd60b4", - "b5414d579e3818a3b532c4d4e77bd2d6ab3e2cd805257e415b721ae7fea47d27", - "4f6f4cf88bf0d4a4892bb37412225e68029f024d9f33aec0607aa035006e041f", - "3d784549bbca6e7e5c6eca9331561ae1fdd74acb9dc1e8d904053d9552fd8902", - "e2d5a6f407adfe3b00ce45edeba298f07ceeb218d353168f8c6581445dc90280", - "0e771fb718d1623cd342c65965f1023f7239858cd191eb951e414887d18ae5fe", - "41c64a208256bb417190eea6bb4128d514caad4598c3a6a5eda44bbbf6791f91", - "23eb760b9099d278ae44bf41a14e5999348c62e307092d9b5820f8016d990338", - "fba1dce5f69bb0d97355fd1709a32478eed36f787dc33e429f23116e692bc553", - "f892bea8096636d078b6e40ea790a37582983dc32b8a6690e9ac3b89d1b03c0e", - "c8d7f129ed98789dd42bba553291b80aa6022431ec37212949c5882e19f3e644", - "edd39bf18feed840a08b68bed2a4630fc65c0d384d3ebcfb38406381feb83b5d", - "c6be113823fd4b10114ebba6ca140c40b5b7392cbb0c0603d8b8bd389a9a71f7", - "d02b139673e896877705652eaeece334f04cb49c064572ecdbd5b78b538ed2ce", - "8404a51420eed36bee0473328d313cdb6b18ac3aa2ca5b4056b5ba2ebdc0b87d", - "4ab444987c46396675d04aa8acf04d1f527929b8b1dacdc3d7b67aeef04f07a5", - "59802eb0b37702d8d5cc8e0877d68f1d977311a8663367a23823579b6a77adc2", - "2a23652a7d996f6c42dd2cf5e2636c92bb0b28a1379568829e336e3f3c9f5242", - "c6a0571b3256aff8bc94f7c89a54fc6dac27b63ddfac8ecfacb0d27707a5f095", - "aa0d107a8196cf7e2869885b60e86b3bfe96d5b936b868293435739ea5840c2a", - "e8baa087b75c485fdbd8c0e4dc0a7b157c9b91f4bd5c4cda5a3ebcd27efac6d6", - "508c3c88c0cc7e874c4ac23d2a497127baf76027c0d684aebca50e0296b75e66", - "6ce381d1b5d4ce7a83f220f53d02fad268146ac4eb558fc979ed76c28071c689", - "e6390e1b55643c4bf9557fcaf989e5bcfaa72ab55af16b106c221b3d63498bb0", - "14d9df4149630ed2e0b4f35451bc2222037921915d2778d30cc8dc7ae029ab16", - "9ca8d360273ebbd5607c5581f4f7ed6cabdd486f843a48dc61ca3f440f5a9ff7", - "92a27190da9dfc25fc10725647a7e3024184dcf24c44f060bb6b4e7137fa9a0f", - "e0f04248d0ccd6a598bcdcbb0e41d7afe39831f8e293e4ae354a68d6ff1dfca5", - "faaa83aa61125b67d131bad9b4b2970f67f3662b5125ddb57b0684c7ce10ecbe", - "ff96eb2c6808085fedf370d8f76ed41cad2b8326011774b6a2da7783ac7ea7c2", - "1d383ae63794e3bd261f74222e11ca441cd7f19ce23cf5e49fc8e5947bc0306f", - "91266b3ac849498cbf0c7733219c18df44a73be6d54009c33b1a9824cdd8fc52", - "f7b3dee584da19559be89d525a6beaa47ab1ef52a317342a9a0ab90fb10ee284", - "5fb7c223cc09cc0a7c1038e64e9d7e4e2534ee7716aa54d835ab564c7a8bed3e", - "64df3bd3b17a7faeaca1ca9416fe82af76878e8b985fcc3fcf8429cfb67e34cb", - "a73e9d23bd354cbe9846358fcb9928aa769b076eefa88cf62ca5163a074c2600", - "e13f7e60f68989c6df845d910be1125adb79a0b72d883eb369118a7f1d8f9720", - "de3719d43532deb0b6ea70efb28af2b175cb43e3076b27fffe622abe2d566520", - "77516441d937901808327e3458ad6c64f62d0e5ff3ad1f08b62eae50bdd2425f", - "e323a7ddb30e1b95ead655e111b9d09ff61cba18cd9054ef1ede119b568965fe", - "367144de9d8470c1aac553cbeb132b576a2b1ea9120d5d7866851bd3284031db", - "5fccd1b2411b568f3c85dcfcbba770cb337ddedf8221a67de6878be0b4ad94a1", - "9529775401b1c4691fcf0c685bc79851afa1c732e8ef8965709547abe513ad44", - "28004194a38d605d0251e8f4e314b48295becc30eee46e32db1ab597a40f6e96", - "903ed52ee045e7e2834d3892212311bdb3bb4619c9123d0ed763c9c9e6eac37e", - "8a2c53c62a23084a7d4c42e10c71244e246eeaed204fe12e2475668ae401e3f5", - "87a2e64551bfe7e1ef7ce5676735ef785dca54ef621828bc5f72329969294b99", - "69626c0ced456829c9408fecfd1ab1453a1e4f02b79b9c4127c3823b37b77674", - "23ef0c4c66be2a925653bb66fca90780d95a34fc728433dc66dc249332e2b7de", - "a234c4128ef4eb5aae9cc4a8f5be80a582f22d875343a672256a5645c1251cdc", - "43bb17757c572796026c9cc22d51d8be9715b3ccd4325bd3cbabe87cad3aca3b", - "d48e1d7876837a3c48a1ffa31fecf75be0847730b0059bd6ceba07afd51bb874", - "73a2a41052a4ed65d055649948f55a96ee1e59c92e2f1bc3049d012313849189", - "efc90558fa41e18c2f516c9323980bb109505dbc4d262f931eb4705fef79c9c4", - "b68d6cc023fa31f92d1ccb5cc8de06fb6bedee6fb5b5d100b9d3a1f8e8b00f40", - "35aa81de92422dc06d0b02f018e8c5a7e1ff530d38380ad9c271bf19d857594a", - "272eed00b7855700bd478220cbbaa5c8ab9c6f414ce78d196f43b40156efd01e", - "cbcbf7e3cc9b684a39596be8ead61651e3baa4e67f82cb80fc0d2a5fa3a5de92", - "6a6b5b640aaa21954c6c3b58251b3f5191c486f79d9a821e64adf7981fbe26ae", - "b2688016c91e3cb1d8275c8e69416e75dbc898c9657e8104ab97248e0508973b", - "28203a90ef926f40d829b9ac34dd8181f341fac9f2f67a94e223bc29f31d0a4e", - "46299fa70f8e600a5a8919836da460f1f70be3851921ec3edaad30a01fde95cd", - "9ca15656aaeca852520f6f59370c9ec4240a5d56995839d9e7d001645ae94710", - "b5a47d28efe0fa5d7779246e717d8866788665e9104e168054f19e913dd7eb78", - "908a7dcd11016608971b3f8cdbefa846ab6284a0780c430d7c1ad90a0afd7b3e", - "0ee32dd8416e844ba117b76d78339a898925d162a6b4990cf64b757112fc357c", - "5b4182b793c4ae3a827f53568b8b2cd895a7f002aae0cbe54dd665289c32a9d8", - "b7e82d8e4a53141514eb39b3361bc403bc3ca29c9b50b5e526572c0d1e2ee26e", - "73dc9bed3ca1bc87bd3a461234dd131d70e81437bc7dd870d8902cec6f3124e7", - "d36b66f70f81e63041de0fe26bc836d87802b063b715f3e6eb2b6cffd9a8f621", - "02aec78b7ac4bd76eec29c187310d60e698095a818d883f0704947e84aa3a7cb", - "42e921f107ed29246b737665f4d5eb2673f9f9fb55923fa245150ad9d2112f86", - "2cd6cecac98ddce394685f526a30867f269f0f237c1c9790ef7dba71423a77cc", - "1d9773b7420cf728711ff7f5325ef85c2df44d765bb14f9c8fe9c16299e67381", - "7c3ba38859d93d2c7ee7a4c1adc6c8d5f35c446c67afe442d94ec7a48758037f", - "e9c68663f5f6e3a0fbb8a52403414bfc2f7e3aa598278185d31b276caf8d396a", - "2864499fac73d4916e71296d51dcd7a05a3555c681554bdf374c263d90d2f48f", - "33eab1aa1d9acd49bd6dd25c18a5eaafca70c678c74fbf8778ca23187de0557e", - "a3964b866f4736868cd3ece5dfe97ba5b52db4d172a0e20a77d763970c27fa34", - "2c5ba275d1f95d1383b1d0c86c3d7bee598a6d4d02428db455619a6c48a7db83", - "d5d55d16870883205ce83fb70114a76b8f4488bbe481acced12843aad7c75304", - "013e54f9f8652b603857731996f04545e515ba38f3b942622cd2daf8fd19575e", - "0a53a03165e13993d00b94be3ee19d568a3bdcf4de1b6c0161c6c48bf4e97106", - "8d7d3c334607239e0c07d7e9e3ac1fd1c4a87b9d075d5a35bd35b52c0527be08", - "e0ba9f180e91f37041c5a7106c3dba1cb8432f349ccaf9b919831a69f7075067", - "ec3bf718855f7c6ee4df7ad7e72ef2815f0c4f3e0f2332f950d4bb212e169d3d", - "a116b8470b81d0d5df4fad6933438871442e38ddb7612ac1ed98ae7eb6eab256", - "be8d6f19b32f4adcbdbbe8834024a29c59351d003438e535f667ab071909c8f5", - "87054a7728ffbc286d5e08dd5a3ae06e72ec4a7460a8b8f4be959c24295cb7d0", - "f500dde120017852f74a526193a8375a49c7bbde65482e1951304282d39d9143", - "a11f739ac3158259e4f7f0c24748a6b9f50a1629f3380619f421deee25d1837d", - "fa3cf56cf2bc9d7f08cea3ea91d30e89e0624efd3339c0a9e91e0232f0d3ed34", - "dadeb44a60826778429956be65b3bc2fc70bc233648783d8506c91887f73cd6a", - "412469e82fa80481a48e15967e7235858b0778c834a64ab1140dc28e51a49b4e", - "640ee6e23e558730ecef51384b109c3de3fcec6e21261e7c7239e77cbc31329f", - "fa5ce1b6a922c180a1242615e86a677bb0c01a4cff587e2e830041558db9e69b", - "035ab15e52d395987dea293e084c3f8db80fbf0b4c19ac2d6122f5cda31e66d9", - "3478188fb48aa0ed558016cbb44fc5958db89fd6280af59dbfa51a88f8b341ca", - "1ca851d1ebe074c260aedef7ee5101a1a62bfc24991144ebd4e0230402ce7d17", - "5feb2e652a528f70bc809158add1fcf7c72cfa0e5d2ace7f4081b1bafa69604d", - "0de41bebc84ba38245b8d36890341e6192c495f5cf2eff58908b48d7bc42e79f", - "e27890628cde528f493f380e6d25ae75d0eb59676a395c4921a6ff0d678a78a2", - "40a409341c57c2fc2ffe313d3533635d4398451e0a8e318bcafaeffc0c481122", - "b0d20caf848cec59cf5c96cec0db932c0b4a5e025bd42c2a4c6d7b249f885df5", - "513319955628d863cc0232516d758825de500acdb61c2e0a948604d408cd90c0", - "1924afe2b7bee8bf2738450fc1f5b64d387206136ce0227aad658c7aa36661a1", - "20966ba8362b6dfba5667cf2aae88c69a009b21a62c1c97050e78589a1aa7e21", - "4f4755bbfe572bc59afedb35cc20e914c45eff4458c297402b67df6e1e50395d", - "11e149c48d5f7a3e70f2205c5bac6b732425cf82a7d66509943ed904cef9ec8c", - "b04bed55f8dcdbe81005901860c70c8c365450be07897327473e4310a995411c", - "d68e578417bcbdac7cc43e73bf6dd624b49eccc57ecb3f98b555ec3e5d7e3397", - "610ba09ebed0044f08f9171c6231c422f23eaa3d2247711f075c3c7664036dd3", - "55060f8461064336402441a2e6ed9738f4a16abeb4df2c2c37f93775d51eeb47", - "aeafab1c8ccf512a2f03da327eda5f6514dfbf83ff81239cb455d1839428409d", - "4c7a17b9b47dbaec98a09654d7d6903178338f8490bde9269dded97e355c50a8", - "552c050970321f3beec6cb03bc5277994bb90cab0a988c6028b779cc527a3910", - "740fa90920d533cc357935e118b9d74ecaeefbea3c0bd234059c0a7e360b8c5c", - "a0b0e4cad64f8b753cc9b6760a6dd135eb1cf8e73f9536838841f5a49784a641", - "bde29fe3c4ac4e271b77d6b45c778f10f92e83bf714662a941eaa13fb1ad9fa0", - "891035e61d2e14b6a85a9a18526bb81dcf91048495587d1a175e7cbfcedfb977", - "7136474a50e64a1f795e985b553e0c0517fbc32062b9186c7e1549d5cdc2ed99", - "3158bab69687215268e56c52c6fb15f2cb861b75ddeb2d74d8194ae78c7cf1ee", - "dec6fa14f5a3b18e5712ac6b477e107269a02b555008250bf5975c6b232463e4", - "a6456ff9d30ab9b6f661dd326bca4ab1480a6c953e24ba3ce987423b54cca884", - "0980989a3788f7cf711092424fa76615c675e0b6919ef9a3fadb43486d575d45", - "94b57e637fa28932977f4dc92b84b7f2f0ce723fd2ee1976332c6e3360d4d114", - "76e626dc70071dbad4d6d05c6b89196482b9d474368200c63b7205587b05ecb1", - "f062a4e844140739e694edd0d37e5bec234db68cf5f32917474ae264c1eb9305", - "811d9ab1b47b121c13424fb8ba4baa8dcfd66f1e9b073bcc10dabeaaba0fb285", - "815c173f94cf1b3c2632a00e86435fd3150161cdbce41d64b427e725aa362c90", - "60727114bc7fc07cd651d3d8b8bc9d84b4696e3eed82d54cc68d80bd428c3d5c", - "22057592e49f463e8fe52fae0ee412bbcb266c5d67028b1ee45aafec060ef24d", - "342d90f5e2275d58906ff7b7c36c31e7126fe000da3a26ce0ae83df5ac34806a", - "23ed6756aa7cb0963a6c071c20ee0d6c709c9a811cf128d34212ceeb88d5fedc", - "5fef36f8b859682bb7b1ed988cb77eb7616b1972a215723f83b6fd16e7d54b0f", - "3dfb662e04fd82e1f78a4d6ddcc712733c69d0be0a87f91181ebdb4a99e704e8", - "d07924752d7e730e5cbf22cdf951abba4289e7ad4bd93cbf11f97cef5f5a1f04", - "cb70e3e75fd6899797dbc3b6b78ba81272cfdf9ab154f23ec338d35193c769a9", - "f4a838610eaadd80dbc464ed0f627735d3d85c6f4e470bae83122f710241274f", - "dbd7afc3bb9ae2410262b8d2c60be35eb80a66433d08ca331fb2fd0196f6e515", - "a46ace773c16c3c87360577d66efe012d9f0d0ce8005428a86517b533b73d4f9", - "448962797390be026b3458a31ea3a7844b77099819f16bc2a46085ee99970cd0", - "51459de8d421cc1702f80f0fa6daed0b15c014dfe32c719f4cfe1de6a206ecb8", - "24f7fc4231f1de1a5a3410260d02f8b295092d458e6a9b819062d5f20db19e6c", - "5913f556c016ceb716d936b86ec64f62c1a309be36c8043b95bdf935a8e94aef", - "8e76d1dcf03ed7975616994e75d723a9ed7f6c968d0e327a6d9a87060e5b39a3", - "0c1fa56804b14b2aaa59725594d697064458bf7d4d06f0ca779acd6c4d1294f7", - "0129aa9a12abdafccae3799f5f300f7bf5974bd0e379d5a96e0b8afa8bbc7ef1", - "8f0254da4438b8db373fb5b3bed78efe002e03ada9cb403e4c1550738cd0a3d6", - "485c3d0fd8db94497c832abb2987a77f8343e80695cb835ddb44239f48562c96", - "29cbfa6e5238a3a448c04da3079c0fe1e2dd24537a77a35dcae454439469a285", - "87fc152f28310926956920a35afdeb1b1f020d3e3cff8aa28bc6273345d76ce4", - "a175ef6777d88ac5a957d88c31e0b8db83fecc87ab4a991c51b7b5f9c98f7dc6", - "8795461cad79979293addf746b74079f2c2af9ef9b94e1e98110114bb6c99ae0", - "e6ebbed409fae5b5ccccb244a86620d7e94ee144980c177721dbaa2408a98a11", - "5ca69a48313a9a118ac86cf64fa70ee1ac757c7f2ddebaed9020e7b514019c15", - "0e431cf8fb1c172908a41ac009da4fd9ca1bf24d29a47d44e79753fd424c56ec", - "e403ddd6a7301516883b308a4e09d03b095ea6aabc61bfc00a8dbd508fff771f", - "11becb13cc93b4f397c20d3a5117d467ad24767ac27e239dca96c94786db1f54", - "884847d1f507d6df424af5df2bfd1bd56adfc021293618a4dfc3c66d4bb5a028", - "d828354f051a6132b96ae371698cea0a9c4bc84de8cd3081f93a60f77d1ab4f3", - "ea51de1fe36b26811396d80804b6674112beb1b92e43247f8ef0054e4fd201ad", - "e82f0ce8864e0fad54630a94d49b9602e8e4f3342a6cfaac6bf4f07e07812be2", - "b6ba69c06ee11aefef801c8a49c636ae82f648736556e58390f7513768107725", - "f91c94334a8f8bff478661e33c9310007c9d60e6eae2b720d223540c1aad61fe", - "bcc6bab76d282e4f1027309ba2bda6aa6ed4b11b800794799567d48393a01be9", - "de6d9b94ed7479f176f59bf322b3738993bf30861ed0642fccdb97d9269550c3", - "bd339d45e64f0bf591b2ad0f9e9b2c0c80577021f25aae5c6b1146a5209d2bcf", - "0996fe2581a9c16ba07ed99b953e86a164267274bd14133b732237704c49394b", - "e39db23dea8685bea852753b264027b1b4e69e99090ae247fdaa1f715bcdb027", - "eb1be47239e1391890452ec332b2384e099a0686b5edfb86d3c11609771036a7", - "8f382c02e4dc09987fd7b2587d573bebd67004b70601d8015c0f621214bba186", - "e960ffa7b395306d10d4279a1d7fffffb325cc7fee22259e2309c3ae2a5045b3", - "2b61085e404105ec8aefb00dca5564150e9da4f2030cc33777966aaaba002be7", - "5fcbc4e8d73615a8172fd4daf86a28b983d97a6c675cd5391f640f43008f8fa2", - "a851b7b753aa234cb436627265cbf49de51d3af12b2a529c729edc3077c49a2b", - "03e81b7ad2c6ff691abcd84a9998184e1338801fc840e8d7d2a583699c6bc074", - "00ed43c2421170d5507b7fe0f60cd5955a6b8f8db320d5d35a4de96bb61470c1", - "0c6b500fc3039ff1e59c83b301dd2529047faaa49655ba06950387bbf047cd62", - "8f824fab5f366a80a63036c393565e6c3b624eb89db863da6c8b6ec87ffec396", - "0851d75889fbc5fd176eaf2b1792c5f17aa43190eaa907d33f885bed6a99fc92", - "9c82d46dc034ce8d9fb9fa97669a9b036363d1fb64d5a06d08e12792f0854783", - "94bd1ba02f93b28758a92bf1a154459bf4f9fd51afc7c2462123a49bf981ba6a", - "a8ff4c2186a56a48c636301a6a3d3b8127175261ace620744fee316b4d62a15d", - "33fd781f9212a4f3f882735b8af9a7ad11b88edd443cfdc4b68d34b5e7990e10", - "c250d2917c755136b60a22a2dc1ec8d1017071749e5401f43e07129fc4bd39a7", - "86ec627a5e78a2695159951cfb8e34661a8f2394c8f08ccf8ca31053485462dd", - "9307477f49fe2cd9e11a3362a04c579ca875c84b7eed490ac1a2cc4789cf9dae", - "a8b4e7f17d0835eb43f7baf8871f15d0a8076239457e4c117d4ab0c424bf229b", - "911f65ab3333ac7a4bece12151b330deb809d6ca466689daa678ad9f2627e554", - "756383e2ed2ea325d10d1e626d2e05148eef92d85e71f4d83e1ac949fb151dfe", - "e9f489097360f8cdcb901a1e0dfb994e4f1313af9b729f53214dd34ca1ab409e", - "cc34ce71266c3deaa40bccdbfb337e6d1640d30796bead9618531705b35389b3", - "e86eb06a9e3570b5b7d2c10fb42dcd7352906450cd3b0c0b7b46a14c5ea6775d", - "37c429f7c031526066c7ff586963e6802eb680d05b7ca986d7ffecb9c871e331", - "a055aacb600d980671bd00b435a7789b9c8ca4ce11b45ef917b2c433f551e7a6", - "8c30ffc8d0b6bc7840a48f5a1f8928dd3c169464c7c7f2dc418ea0f9c4cb22d1", - "380e0d558a131ed3ce2aee1cf1914f2171922ef989f201a76623310baee79e00", - "e064b106a028781e3a370536b68619c19a94d7700bb63c0ec00202094f32340b", - "8a2f0ded134668940d68c8f2cfac3d05f5622a4688f5c20385606d0b5d3dd2f5", - "5f80c5fa98613ffccf636f005cc185b5d073deefd841f892ec65ebef9797b2a6", - "51620a304f807170add6cb2b28ccf4b91b2cdbc2772130815764c8c46ef7ec60", - "cc7495200054d5269087bf1f2b412973542967cfe7530a413d378a1894f39690", - "f8b13ae3b4a9a508daa39faf2e7872eefa626ed5890f9081ef8da97fdb986154", - "323d64f4193a32e7e0316e89b6f4d31e306882f7c039683bae702f9cb412abe0", - "865aacf804ec8e2a00649206dfe3792e1d28521bf01a5d9a04147fec1ab3ddfe", - "75522d9f46389f842e3190c3e615a8ac58c31a31412210b01fd42c00dd0f7226", - "3c3d5759f8e4f994ccfae42befaaec9e86d022b0bad8392a777dc439ce40dada", - "cab7190713138df14008e8c4d7d5a88c7cb0f2fe21d8f192ef132cb473a01af6", - "415dcf185f889c4d3e16a6f7940124feedad7fb662f1e709a9feb57132980f27", - "83d8c70191358858169647a1b7343c29e1fe7263c44b9e8c995a5bd586d41dd4", - "f4c1817dcd9873cd09ea24b71931b782da6199cef187fe79338b50da663ad006", - "ea6afead381c7f580ce326c1cba81884dcb24651938a0cc3fbf5c063adeb485e", - "1df85aed8402d453a472527d852c4b2baaf47f5af2710b27a2e18df2c9cdadfc", - "142ffcb7d716b3f8a0f82d2f59215b1235a3cc49e1c15eca2697567013fb9361", - "87d5d7dd8901d2f9efe1d0150fa52a5aa29fe3a2fae5cc7686044174148f5a30", - "217f814ec1e51bfb23ceda502cd34226a904d4922ebb2b9f16d0f862b58db17f", - "6ee4ae6485c0d58c5e6a87e9f362ab55f6d102e99f5a2e660f1a38adee94c95d", - "c769c03812664eb25952f8849b183fa289fea272ed969b6c5659e64ad3f59ac8", - "9e54c514756a639bfad52d5c4a45b2a57c00c598797e35f972e37182f2f74a81", - "e25924497d6496d49c85262c3753d7909020f1560b214fd07b06070728aaebaf", - "0a46c387b7e81620c669cebf88cb4294e7b6a17268750bf5b5c4c49a4bb2b8bc", - "d4ee9c9dddf2093c0488e7a8de624964fb20f98d45ff1aee823e279159fbc3b4", - "a1fb6ee792ff95dfb6e855e84da977810d735b2630ff67aca30608eb0eb8888c", - "39e9c68559c2decf650880a4aba662fa2309795f733c53605bca2c7e805837e9", - "6510d88de7f7231e725f376c29a9c1a2f7d1e3328e6238e957f5d7431154a050", - "cd3fc9677dd2fe9d5d3d2e0d1686381d5594ac896b9c9da420e4d2f0e35afff7", - "ebb9ca9bc9304dbbc768af5b794922c6d92ae5d874fd5f5b36d585ad6753e2a0", - "4ce1bf0838adebb73671da979c774d7d2a6f12982551a7596128c71a4730e857", - "9bcc3f74c274dbe77faea99aba31df80b1a89167d814cdb20e5ee79917089aa0", - "5f7d230755b5c157080f2eff4dbb31ab6ee9cc621ddc4fd38ae9123b167ebc41", - "c7dc6dc03ebad09eac058fae09d741d83d80a0cb05f10b3805605230ad5cd356", - "cee339cf54e8520cd750339e70f4457b9674313c3c7e3980862adaf1fcceda4e", - "f6282ed04963eee44174f80bb3d889d1547b488baa451839ad09d54ff7fa733a", - "1bca99194b23d7b16a8e8bea6a61f002a88818b0d5ea0b711c5daabe60135ce1", - "cee5a63ac2cc30c015375db3409d1bd8ce0b6a3530c47d6ba2b1071aab70e466", - "78216fea85aeff4d59deed20d5b0f1df8296fbd5b82f8c7f99f8ff9c9612fb43", - "d87bd7412f6b989ceacded77c947b4579c6da7d34a98d44ab4b7c3db31399276", - "ef5588890b766ad1efeb228c0b4a01bbfd97e384c43455b60830d49317a3def8", - "e4f1431e68f35d8ee71ab4d852b6d8044b8a7c285b2b03377120ac8970ee8e1f", - "9cd2464cbdc82dfe5329374e4275355795f0cf6c1e586a68058659429fc9b40f", - "5f0d788ac91d967630220f8b4135dfb36a93fd5efcda1d73ec014b9c45d3f34e", - "20acdca21a452849c48f3973f47a39c179d05c46fd1751d46e5566af0a6a64b1", - "01f720c2b159bee347183d688f398a9e1eb7b168f7ed7c3f8356a316064f9910", - "a00fad3d580349b04b03351ce6a75d981a73ec679e24e9083cd4215d82813aef", - "c1393b4c3255f41aed9157384fec81e887d466a50d39b43b904c71950df4c470", - "b84358872fc48c78ae615c472b18f83330ad29641afb3d284303d2006a412511", - "56b5bbb6adef3e4e9d6a452e8ffda23661e930dab4310feec0054a120edcdbaf", - "bed85c7fa463b6b394370d49ca91c3229bf23bc71b8d14788297ac352f1609b8", - "2d4712710806cdbfdd2a1ccef73368768a4b860e8e8c063daf7cbdf443085cb6", - "c339d139398c53cb81ff0e89bea2950aa9611f540f4261896f11e78a6196f1b9", - "9bb56397484d995042e2a92f50fbf37f0e9fcb9cf8031fa3ac0e6fce86ec3b0c", - "1b40680807ff7067d10892607f1200a66f002dadd0f7bb6b3cc0c7cffdae7dc1", - "910fecd81d66c9bc32ce2d618bd17e3e529553f3ba7fa5517fa50c08a579a8b1", - "55b9c60c213a9e03348dbfb299319b2abcc679b9a989bc6fc3074da831b46bf8", - "d15f3a93cd255d9d28f912b57225a8d785b09a39cb55973566cbb889037d04c6", - "ee2db6c07f114cfb65ea9847479370e07326f4d856cf38b8deaa0421502d35c4", - "30915f2a00008d9736b669ed2a045f3c7ecdcd30489ca9e6d4da3c9340952988", - "6094d797186d4feb747be001f5799d9af394d8cd9c44177e027b97cbabf13028", - "c6c98675b1b49e15732512d67a205f0225c72a4ef68fd094f800f76ab863f0d0", - "f727412b05d730c9c87d1e9497e1ed92b651bfc67e20a788d3bf0eafbc9a1073", - "30d1b6b1daa5ba383ed2d0b15761f253f9e17e19fdb95c55dd44da3232ef746e", - "4400d16d87121aed40cb67677de5c8316c1e46aab2c4bca1dc2229d2af5181bc", - "cc7c3f817433d01707f37e69427ea88cc1c96de5f6bb91247b88aa6a6814955f", - "6d239eca13ef9e9e374cb684f320062ed0f75eeceb862e218c60a0b3dd3520ea", - "187b0e715d3d750b38d8d092932008987e6c35c7f75800304caf36edbcb562ef", - "91afdccf1123cd72ea8732f997cd9849fa089a999712f5e15eaf8e59ba674c8e", - "bdb91998fdbc15d50b0eb72bb8e948cffcf1360173594fc364f7ab7d2744e350", - "f73a388c5a23e50385e73ec15264d0708341a7529b6130cd0ca400de23ab9d35", - "35c0c8722c47da27537e01f192f397c6e40a48d62635840036a37c2d24a2bc84", - "e95bba17cd0d75d2e415f835bb966e92280e854fc4386d9609f5c3a1f3b41f27", - "a610586f4d685977561a5dff4c062125faca548e2d662d1c3dafc3fa1ffb001f", - "1c6e8f91f21fc90e72d8d0e64f8611c78e179107e60d6d132dc31c383857ed4e", - "df0670dac5318ef9a600f1d66d78348cd35917b4c22948cf29bce9e1ff5e295f", - "ab6c0418981a45b13c48edac4a4228b40fb2f2b4381e1d9be4b40f46d66b7752", - "6b9f21b7b939355ef767445e4b3efcd0e4bec6e728d8f14285c894bbb63460ab", - "015ea2e346a31fc7933d73d3448d113a03f4b15c132715dd28e59960ff3a27a3", - "42bc68bb005a0f81de1b7fe2c14a8dd39d5a4872979bdaca9213673f4988fac1", - "7da190c8ebc4dea3e9ce2437e2931cf3558c578c8bc362410d02b98c116bc1a2", - "38612f87e452fea4b7f652d167cf05168810f716c3d7024f8f7b157775cf3b01", - "caab29c2bac4fc16c55846022412773b2dce4e47ffa7aa3416e049944446fc0d", - "6c37345d7470840b47efe78e2b75b0098a856326c64b18afe56046e6dad8dc02", - "5dbaa74e64c773f9fe86c0269119a4b87fc42a77bd4a417780d892036025d94e", - "90f31ba0e3a599c8d5cbe1e2e42e4e2db8f1b9c729dcbaca1bf1965874fb4bf6", - "4f7e65a9207892352173dffb36d99c6f8825f75781818ed698abda21790cfd82", - "6f2bc8b65ba43f6667217f567dfc3a146459dcb32ba0ac5f82bf99c759f392e2", - "571aaa051606427582fcae7a8e44dba6055fcb2a2052cde364e1e5a025c9ee9b", - "7ac9165b797f0d6f62b62c233b1358ed0f539a5d8170eced8b3f99f55ec16f25", - "75eb4a35e6da26b0eb1400d769a5113dcce52e803cbb256546707409f7812bec", - "d99f2f12659c701e76b45b0390463b88e6cf508da425c97c1cd60b53719157c5", - "fcecd0dbf4878fc10f0ab500dfc612d9e1a141a3da586c190a0145e3f8572297", - "b362f6538305385ad0da8378186be806356bfdfeb46e605a8b9f42c82221d23c", - "8c007a3d2e1c75befcdec61bcb77f59be28da51cf8e0a9f7515610b366af6f9b", - "51dc90b74c4dbc86d69348bee2cdac6e329fd59bdb54981d35698e6b5aceb63d", - "ecc6b7c05e4d025d2deb043a235222d0ee19a38a554d2812edb671c42563d5a6", - "70b9732be21e1c34316325985431d85d94fcf2748b27d8c9a56285b6450afedf", - "3bf0539dce5df4b5f361f4135fb691618911f30cf213925158b3a3bd604170da", - "2ff4a420e64b01a3fe40ce559566620fd33ad7638d9e0a198e005a529d627014", - "58c3cc56a9264d860b98939aeeeac067e363b107e7442a4d03201a4902223c99", - "8200c47ac4c19952e30dee50c1b4d6a8c21514e548e0376b572b499c1b2661f9", - "8079850a32f09a99f4d0358b3ac0ab342ec27c2fb181c99dfa105e1032345b23", - "7136b97008677ef0da759d63a54fde84f9af900c91f1e67964db87249df75e38", - "56619393e0ac248d555741f2c7de0749bbcb24daf3d486c1b68d0002ab443f6f", - "db89efaed5d156faea34d13bc9f6dd7562f94d705f7c913427f7063fec8aa318", - "632148bf1ede5eedf03b0a24375cd0efa112db2040c895014ede54371640d3fb", - "c37036fb2042cf4a8f1f979cfb379984c15c6828ff3369d6d2357a310bdcb87a", - "4e74ff7073c3567b21965e8bb1f4c25a51c8f52f76973774e7da94d2ce7db153", - "12d15d3c0b730efe63731cf06f056e4fe22f54a20f7d67edd2258be24d2525b5", - "7eb5b22d59e43e1d619ed62dc6c1ddf13633cd73f893349626b7a9347ae31e64", - "aac58cc6c736c81940200b7b4593dd81846682e80351923924691d94bedc472c", - "8d50fa62e368d7485b29d0ddf6e9be7800a7e54f3f1a233ef03e8c41261aff3b", - "15f1f16525d09b748b811675e22752c897f24849ce1b70549bb54612ccccaa6c", - "41130f7e6fea131bb81e4f2b207147519ed8d6a140b4db6994c0b53935f98d94", - "7f1cdd18b0677fb6221dc679f77d738d8fedfdc0d80483b2a4272a91a1fe1643", - "42bdd975d9e0998abceaa88fdf98b3c509e8d0d644a4f2206be5ac0e30c9c995", - "d0451bd9b528b6ec89da118e7e53ca168994a9c0c8aa6c71ed8279a15140dcbf", - "3287c6e76c7b0df2cabfcc054f248f183abc8115666c809fdcdb6fce140a9f18", - "176defe0f33c8efd4020b98b0fd3381ac1ba4872d47429f094454e768ac3fa7b", - "2f92e45cd6ec0cc791bd100fd32722f1f46423be186966f6615712aa5e64fed3", - "8edcfac9eb37e88d35bce64ae57c677dfcc776b63142adee15a222fb2b81f90b", - "48b96ae244dc65f37d3976c70fbf5e5e255bd91b1f7e69850ea27c649f6de408", - "11f17b85467266a170d752c4999525948b24077f291691cbadaa16669f0b3054", - "e18d0aae5b7cc3551c2a46ba82be90b81c8b3cf023be4829a3cd6f5e9ea4f134", - "3be3611bed62c5e0a71047870cb73f562293698614b539c1d903e49b9f5d6ff7", - "024e0dc0fb6ca6270b4c84b7d9475149b180c4c923aac81ba7211db4fbb22b73", - "096f2135575dd9bf5db7f44710ea5a7c04dbdb7074862eabeb18dd92bc1b6240", - "4480ffa5244ebd1973623943439b26a5c72091c83fbbb39cf5004b385e4e8d71", - "05f6a6b667ab588625d1074cf4aabd34590186babe9aa8d37644b9b0b968d334", - "e53ce28b336cfd8464431e8eca8787da56fbfa9f3cc60100a55f50aa6fd4488d", - "9d26171b599f381a9a70493747767731c3b11e1c89b363e9d938046784c7029a", - "1d65bf58fb9c72db78e56ab974e1bff74ee9b1a713350cb71438a900c620daaf", - "523e30d3ca04aefffa83b4edf9fff0102bbd8f1a42a9d7d23873a74a45d1259b", - "f0bb46b0661d805fd48757cedae5344902bd550791e747b049d297072b7154d1", - "26c568373edc338b5b7fecd00edc17c00245667353166b6f749232b6fc398937", - "a2b4800440fc26e62e2c5f7e639e742696c593ab282d2c7e21ff54f350c56278", - "a490c3f4cb48597b3663274f4db9912ab9894ad113ceb286435fa4d7d11e5d82", - "66f16b5c16643f1168181909e3ad1508d490721c0a7b691c05d3684a1775ad87", - "841c05710260089b329617112b598116ce81ba1a0cc53217ec534d2c2b3221ee", - "decf7aefe9f315a86f6021da3571b258515bfe79c4e449a0824dfc36b9cdb54e", - "2a3bd49b94151844a7274c0d7ac498a314f913a0a59b3466bc9b3cace25d4ce9", - "24a65794ff953a1dd4008f8e647f53163c54b4d229756c2ac46a73a0244daca4", - "356808b6d449bc0a12b4f595119ac0dbb424a1833b3dc56d9656c9710575b12a", - "3114f27526ccf1e94452384f37173fa9a2b1783659b0f25e2e102133ee15e9c5", - "a87bcaefd9e4f3a563176e5ceca162b2858216c7f3ff943d3d54710b6eaa091e", - "015c1d5f1e1f52925ef2b4a2f90f03dc54515657442e0b138731f4c95fa5b789", - "e7057ea8afc2bb85d976411d2ade5950f5e445483534bfeb84ecf2e270c2bba8", - "d7c391a8ac88cbbd556af8ae8f1a6c1956a6091459e8987ee7d99ef9b50d857d", - "824b41bcfaf96ede1df9ec129e3a4d5f2ba3c81c00a073beb16b30010c8b4b65", - "0debeea8184d35da5333d9e36e57661d6b2446e339e0177851f74b7be33b7a8d", - "5b03336c60260df040fd6f9dec33f4a182cef5d199da0d908832b9b6334f4509", - "7111bdb4ed9aaccee39ce9ada81bd0e066f4af76f19f9d4d48e9aa8f9215e185", - "1e24eb445c8b5a45ae8c417d23d9976f7eec7c781001f8bcab24b4f581cbb7e4", - "8b6c7207c1b5571586a2d9e27205161428d202797f3e7a400c7d477c623e6314", - "8bf28530644a74790b82fbabf070ae6264c3a48778531eb3662238087bf1a220", - "625d3dab704c3bcaf063c848efb29a04450074a9e776094c1bbc792a22c10873", - "744f2555a1368d4391415f92672fe35f42135eccefd23df11881061e4ae4ac14", - "9a35c56ff249debcad5faf691f9277029b236d84aa7256adc4c824dafb44661b", - "64d0d00f80972b65a2b5ab9d664e162f89804c7d0394d9226868ebf8782a0686", - "e70d2b2a43613ab774d170ce1b73b8b326a4f624641f73fc875d776d1902318c", - "0da903b5911cd19bf185c5345c1db1109ddd242df540359700c8a74d9c1ec163", - "1d5c211d6a05bcd39c9c8c8b99fa1d5c8ddeb24cd14a03d98d6cf340f0a564b9", - "39c17478a47d7515a5cd36b2b6dbd531c28f4aabab6b15a16dc2f0e9ea7eac37", - "aa7be8d3ead53e4e040190249525b2dcc0c444d1478941ba4b34b6b51610f2d9", - "62354b9a35f1afd3b453efa93a83e7d0e7a19c05048d9f7f195c2951b4b43929", - "bb5407f10771e755464ae70db47239b90874f948510c7d582d3fbe21c133f668", - "7d9625e66ae362cc9c1a1b208ab28f041b278462dfcf234953a6768298a6862d", - "904035c21636dea8925e8b44c724fe68b45d491a4009b8732665d081e260927f", - "eac4892bc3006542939da1fc3964c6d310727ed8785e19f6ccbd79220dc4db59", - "f6b4911f477b467b9853e970cc468422c67ac213a923f037ae2e84bffb1aec3b", - "32e8d3e79da4d080a8cce9b2be7ba109bda637924222cfc149012e6d4161c3e8", - "064ddc6b068f2731989abf8ff42e8d3ff78bd5b2954a8d129565187ffd4cd0ed", - "57b813e4264bb5c9c5b993e262ec3d0148e2a3291ed52b367a7a29031cd3c0e4", - "4f5237c4a67430bb86e3dd2c685d29fab05af42e7e11bfe7442af94dd5cc7bbb", - "1b6e9cd98c581ff7568813259675a8f6efb326a9e51c6d9f1c32a3a3a93ae207", - "b1cad304b1938e9b1ae5c08c14d7f0793003193f5266729eceeed341bbf821fb", - "9eea71201b432099cab12cd0ebf4b25eb3b250354552bc447670b5036dba944c", - "caaf9cb6b09c0ef40dc625a315a9ca0f2f9def13f09d460328118647d6dbc154", - "449bde2d435f33d20ab1669017ceea448d82aefc386d668465dd31e5782404cc", - "ce0dfc964c6c33f574b407b5393f408c91f09f69f3fc1dc32f2a469cc925f5ee", - "a6e4d9494345c1f2bbbdf17b5a662a478d41e132640aa5be24a7d7c4564325c0", - "fb218d5112433ffd966931ed2286837c405a1fe7483690b339a15a0e401a84f2", - "55cb827743a21971a9c2c308d2a9f4a3d31ec9987f3d072ef3c2a7a7a2277624", - "c8989489d4f15fd97d07a5bd9221d4e03b64d871cfab1f24c5761fb53dd888b5", - "72a9c073d1bc77e4ad9f0329ccef68c8b1f7ad0626c33c3e92ac0cec380922ad", - "d855f1f061b4bb5b9003e85e7d44a34ececf2531e3b6cb5b18c45a3d88b3a9b4", - "2a9584e04b6e137090a7c2e58a8b81c4f63caff1d0343a4feee6daaec0476c2a", - "ebd0a201ac68bae9e22b18f5da3d6af182e9cde4609f217de1788ac4ea4b8d7e", - "8cb251a5246baea674a28655bea6cd18d0eae835371395cd0bccc22327e04b0d", - "4208d507d49d63f79e94ff534bf07dfae0ddbbab42a44a32b03b0df56bba76c5", - "c5a3dabf8957de3494cafcab5109dd059d4d7aa05845e7f87d6df208012238d2", - "880d0b4dd34c6ed588fb6f92d5d1ac59798627ca258de60fdfa02d012b2993f3", - "833b3bdbf20d68a0e1ad2743e5d927e00ec423007ce04c2d4ad55274e27bab7a", - "bb1ff861269b828c2c899b6f1ade18469d594ad540e45efc48f56823bdee5a4e", - "ba5f902fe89dc1ca2ee54dafea7f41f9a4d210128acf44604f11716b26d95b6a", - "1f7fc7975744eb40e7a7447f6605b12ca5307b47302a41edda76b56f44a31cb7", - "231e0c509b9f8a023d4acaf900385123170fc71a2ba0f39d5ac55d29689a361a", - "2ac08d4fb9572b24f3b56ce9bc08bcfec6890c0509f9280bcd8f842871c15838", - "aeeae35ab5cc83b9b060b30386d70f5cb29ba9d83c6c6c2e27b290722f7571b1", - "adba1c7084949c5709918a20a8bb9fe3cc4056e3e8d9c7e7afc7d34a700d8f43", - "ad89ad5a1060cf7386c7ee1158a74447482dcc579d782c5960990b15b0c7ffe8", - "eae7455ef4524e2f156ef68ee0e1d2493a1f1222c7c68fc1507097c6896c1f8a", - "fff5a52ca51246a0c96eea316b22a9b68e59cf5e7694d60ba027918a97a59f24", - "44d08ce09a9bffb5b33e38d5b12d3004a948edfe5eff8cf7d48faf064eb23dff", - "0ca7f2e17d682e780f68c04df63d3f8cdaec79b8bd9f5fada911f3898f4fddcd", - "09636040a13e5b57d2e801d492ed964c32486cc8ea845dfcb0afa8a971e8a819", - "bd989c1d1ff426ce7a0cfa8e0f7980832df3276e98af6175747dd44fc39cdc37", - "73ef1a8389e9ed0221db32e6c531e998eb1dcc4410fdd4fa6393083d5bf0682c", - "c60de3cf3d84bf42ac6d80fa5515582e4b778c4a848d362d12cd8a8caec03ad5", - "0a1daed289594cbb81b896f2865fc09c293e4f230b501638b0e753d0a47b0641", - "1bc09571ff8158e43c895e64d3218692b64b23326890f0c93548a424c6cd2dfc", - "f7aca36e568573acd8d6fbecc5ef49d6258d31bb475ae1be64cc68d1dce66a0a", - "aa60bef03a7d157e7419304a757826252d0b3d84cc1a95097d9be2cf641dbbed", - "7d615478009dd6b6055887b0efc84ddfcdb8b983f763591faf0de3da87f188fb", - "545371a89a9cbb17a305f9b7d3e80cea7423284205177cbea08be58231be95a7", - "85a2b955d173bf00c94f59b4da359f68cfe8d8864fc6203f7c695e27ab618761", - "47f2baeeaaaf98fccba38c382731543d98e13ba68592c9a260f4444455020d20", - "aaa2cd46b0e323011ebc66e795fef3ff9e2d0cd5e431bd858ffffc9ee96a48d6", - "34409c09667debe1627d96c1a75c7f0b5570dd9fbed693ca71a5c43e8242eb2e", - "48a8c3e416d7e9e7400fe6d5266b68f58facc12c3b7f20700cca856a01aafc15", - "57103b9612ff3b68bf9cf66045e595eee9b0d51f2c6aaa75dfb0af991852005c", - "9a23a84f08565c865eb55fe186d88b3a8041f5b819f67da0f2142c7dd78ca273", - "5b577552176d6ba567f844a5eec025cde196bc2184683af2ef44e24081602790", - "a0bd53bbc6891039e56d29e3ec8b4c359904776cf3b2d1a79c84078ac0945c82", - "f0557d3f47294afa5db8e9dd62ae0db4e69202dffbb095497d57a79fca6c56f8", - "8b904ef297f6fc817b779088649a8cd018dbfd081c7033ef03143d006263fcbe", - "2af223eaf625a81f3daeef7fd2836cf4b96af88bd5f995f51d79112d66a7529f", - "baf265601ee1b824645450794e39d47ddff8b8e4a01309ef05cc1e291c02f5d0", - "c5add024be9528a05f38ca58070b161f9f0df897a1a09366206b2c7a8dbdb780", - "dd79b84b3adb83ea6cfeb10bd9d8a10f58a8e28b99026d81c166b752f418ece6", - "6a9c1b64529d958ddbf8e5149e2396f270771f7fe6329a8945486ecda216cd9a", - "878108d8defb29434a89ca50c82235cb1197adbb77f35e590b7e1e3d11fd5ef6", - "e5c8d3ba6a197c713d13e22129acd135a2223b242d044fe6b3adc296d92ed618", - "36eef7ba40eae59b9c980f35b9e362752232f4b1e1fa3016e5d7058bc7784182", - "736664aa7ee3ffe952b7fffc2f069e3d1d001eb05d83c2cb86299e42671d3bae", - "5dacb73b4466ac98eacce97f7ba7a2c385041b2ce989ea0349dd026d677679be", - "4d9f0f5cb04fa44130a0615a22edb44f1b29933c9cfe955cda868791099e5ecb", - "ac549a96fce167c12f9835f71d2343ac19edde283722725fc81eb9b7322db685", - "301935105b90ad07f37125e7ebcedf4a016367e23b47d6965a8ba8a3c4288bf4", - "d070ce94a5963e412df369f4f82018c4258044d7c8417e9508b1c72181e33ae3", - "3cd21be8831bac539348143ad6bbdb9a06707f66f5571458b3be4f647ada849f", - "1e5bf840d3a98c5405fc8f745ffbfbf3e29e7b100e026bf07cb825592487d053", - "ae2a108ca4ba7fb5dbfa9126e068f619ebc35625e4949ea09e6cc587fa9d9926", - "75e16f6132ec40ab61f3db5988c4841af70cc819096b007fbb27c01ea9177a78", - "966e32641b852109eb81217d4b097e1cf714af2b9bdc0480daf27bd34f69c08e", - "254a138f79152b72a3035f9939fcc11d19caa8ed2502b3dcacb38ba03c837191", - "e2c852121fd320aae5e7c383fcd1db0090378d21f14a11a7ade28f501be20270", - "8886694b1b67061a51b30b03834b36080a78d2e9abdf8294e0e3b4168d8184dc", - "c26f7220614ad6a19201297479498abf4df676bef5abfcacc20de71588e80894", - "f65609873e4e9e3011404288e8ad61d970ba54c6f34bc5b622f62c4dcbcfd697", - "329980bb8fb309e0fdc8d217e66b4175e424ad6b25d26894a4c731833d01ded5", - "e745261d5d4a7dbf6403bdd8d4b68d80e21d9707b5d0e2e43dc272c549ea84b1", - "c35a164dd267084f25c8a905fefe11af5a52ccd81725d06d436af6ec90f30e6f", - "35deecb4d8682754c8bf330b973b93dd8481e5dcce7233f4ff0504fa795dc006", - "3663eecda4d8fcfcf30354677872d8cfa7da31881c766096078eca993fce443d", - "b9bbcb75acb1edc5df17c3c9b0c4124da605a73b18f94e9bc40d9c2949354b73", - "fec535747b62766e035318c1eaf298054f5bd2e870cf93c83ef3b64ffbe0d25f", - "bdf7bcd8d499b7864f13541c58240a1f080938a450206878860e52347e381435", - "eef3312f80267b4dc677933fd0b2f869c7b9bc07c27ba25197675d84a0522f9d", - "d1cf273c72671d71b29a44faae77ab53bf3856c590a76d53d1df4969220f54f0", - "280ae96e292c896ac8cca9b286d8e9713e52554a54f18186e2ad92900cb2d456", - "b820cfe53da8c3547f937c34190da52d89814f8b6e6bf09612d1c085f925d639", - "0981fa4afa8839e50018aa8c0ecce37b5c7fd21057898bc686596b7b6c0491cd", - "0cce8f578f3a42ae61075a537c3dd3dbfaaaa7d6d6ef21fbf3347183c99e12b0", - "da7969473cb0b0601f88d4fcb974ff06afa0148d615403eadeb46f0a50f5a7c3", - "d0afb519eac393ceeec8a72a8c7ae87f8ba076fbe73310e631d400a3d09c0435", - "5f002c992034db1e4e191ab44e5bf7770106693b3404240808381248563030e4", - "500437f18473dbcdab91d9449a21e70a0c56c03c8bf5ba8b524a2576bea96137", - "d804a9ae40c8a514dd4781dda517695d12e49cd1ab1e1980ae3b275566e76a27", - "e54a163f5355a798b70d5b84e414f3fcb78fa849b53247793015a12414dbddec", - "84640a79d59c3cc8711e6ffb390cf61a8bcaa2f8b9de5a75f3f3955ada9571e8", - "0ce83b5cb999f9b243a3c97b4ffcee947f0fef14790d932dd62a43e348aef704", - "0e23ceb4916b1393b8dbc0da09e47c2e0438b20f9414edb5f0469f3fdd76bb69", - "2b113de99917915d7cf3c6380b01dca5e3c1d041fd1208d698f3db0fcd25555d", - "8ff5563c69a1ce1b2bd6003694ba292757fe176108d9b197c31f3e421f81aba8", - "3a0d63573b6670120436f43967df88cf4b7bd73f5388dfeddea2b6c5cdbc67a2", - "cbb4b956ff238f27c52d03d30db931f2a20c2154f21859f83c9c35df0ea71667", - "815b071e1b4390616971546c20a98ea1d96660f0feda34334d7595378c06ffdb", - "fc205dcd2bb2e88ba3b3982851e92bcf3570f6277a64892d719215a63bd0006d", - "d5f59bb04f3686ca25cabf3afdf97ed9a0c93fe1852f6031df59272e45295916", - "c0a4ee81dc97a43196a2f2223e22d9404206722918d2a6fbc386e4ef2ff84648", - "6973bb9b9d19b3d92c7ccdf6618b2abe6ac93d9a2e3bebe7f5629485eefaa97a", - "5863111f850556eb7f7c0329a363d7019527da90126b91eb787c28179794fcc8", - "dbea103e6e53cde514c475577b078dde40669524b454e68753d25fd7a097a1de", - "2feb71a4481a50f43e1d99f8b2acbc8a22c9a7cb586407a55ebb387e55f0aa0e", - "6eac7c8ca75b84f03a2b2b528dbc61f57116869dc91492cdcc34eea293533803", - "ba724d2a165193da9a5bc9e0c5794b774ca0c46f7846c6f02753d2810ac6b535", - "baac5e300b8c2cb931aee9bc90afef7a2ef3099d79645770675c0c441b34b372", - "55b7a37e204fa1d3cb3df4e589e6c9d7036f8e7f3a3cc61b4668a7358e0e1c8d", - "2b05101c9eb68fa718974c93959945f10622f31c05547bac933ebe3a744b7fa2", - "d8eda9204b6be619012b01a7dc749c5f2268e2e1567ab0e8e18a4508102c0881", - "052b4ddd0dbb5338c248546f02d815d8641379a3aaf67fde1bd76d531cc809e7", - "13db470f9813d118f07f0faaafaf87547d515375cf680aba5d30fe57712b1deb", - "007c7a02a2010c29b8cf6d8baf86c569de6c744e06bdd76f875a9bb5c6eb8229", - "a2885bfce63814bb7744d4abf443c062bb3a05c53d10284ed013c6fdaefb15c1", - "2514b1446c01d776a487351b05abdb1d070a4a946406c67a8f7ab4c738c90681", - "ffe4b4b6737cbd597535d5e4c48a6ffc9bd2a37a6c33f257f1d85515679bfe69", - "08c2d6cb47d2a8d6e083ef3c6dd61b7f4cffcb7499954ae5b8d9a841c32650c8", - "1592cb230888a94644f0629c2f6e98de0f9d7348e41a8ae3fbfc1f2b2bfc560b", - "f690cb5d422887cc0efb96c9ea9ab35e6a5a7e6745c42fc79409385a3c9607be", - "800b209d1ee86e0b5365d1f65fd269b789783e7afdc029a0a9bc86221fec101d", - "f87000d526bae0f64730b7c437537131b4d044dec3d1ce6405db8676a091c412", - "ace39296fe39443c756f129d7fadb808169e588043b13678fd0c3661d9dbc6ec", - "ee3a62856134596af1f320071d2e5dad29158bd46f0138436d26e76c664191a5", - "8b3ba89f7db5311a7f70898d4d02a2a9450ef4091769e9705f259638860b31fb", - "4b6e6bb1eb305df0386dbda4217aacfe68d1985d18e3006c69bf54d17c0931bc", - "2650b9bdb19089ebda083ae4128523c2c9c601adfc792a7d9a742597e59cf14d", - "22b962983e46b07675a62ec0d91d42a6608838e1c47514f029421afe12f1e7ca", - "9b68674bd7ba913240d95d43e8a299f77f3979c9315ab5ceeb2f76d9a1a17ce4", - "c90647571952ab66c6f648179faca1c1bd54ebd34fb7090a28e608de160e2536", - "b36b71316e60cbc5e107a43ddefe35c1025a8d9208e9ddb7735147ef0026774a", - "e5de5ba118fac40fcf29a33dc260ca2df974997c1f2c913f4590593f410400b0", - "519159e263485b01056488b28ddedf7f0fa852e98e2b9ed6f444fb66cb924d2e", - "48b3a745466a51ddd8e020db902c15eb80a173eba97bb4bbe6db4ea234bb1834", - "5ae3966bc14322a9944fa3d41ea65d3151750a6484888cb163db34a5f60cdaab", - "f4b562b3536e3cb72f071a83fa1b00a5be9de2720b7dec82e90a23271f94a437", - "d0416db41bb5d60fc669f29ff4be2bd1bc1d2732b9bbed89645e1340808da026", - "afefb2b4eb544d0fa8231a5891959ab82ad6560ed4f7a422f7d22faae4020521", - "68f0a131472aa394940bd949bdaf2eda29b31f32acebedba554322d4acb08321", - "7844bc3b73c77186f8b0d39098e9e8df14c7b7ee9e8c862bcaae02e24a8dccf0", - "6160f56dfddd1ee530a19da6481809e2d806abd5d024a9d2dc250e299e975c79", - "2a5fe135dd718eada4a8006c158df42a4739513a3ae9e05a4349a820066e7278", - "b02c6fd6ff941b39274e653b3d3f3e69023474d1f71f6a4dee10b751efc8fd34", - "32e13a06d1c63beb3ca80b950bf6c620b09bd6decd3e5088f4d4e387f6f5617f", - "7f18d145a668e23a09b41e97f913aedfdf2c7206e67c4e2aa2246cba7628f15c", - "778e07380ebee5e80f1e5c4cd31f969c2aa1177ba421fb8505eb0401485ef960", - "b38af78d25eb90e2f962d71f9b8ff9a234d6bf3edb385c168d16a9d90d6f900b", - "3f50d91b457982d4724d87d297c9f585c3e3118b36ddf37519fb556b6247a2b5", - "9de6632c613adc417050a17d4d49e28bc235165db7d3d218069fd12ac7ba2be1", - "6648615f652a65df63302f5e3f784cb27e5d419a2bb28836bc31f71ca5aa4e1c", - "90ab3661482395133a68b25d2b6b7162001438ac5b7842eef5de391f7e10f43b", - "333f55efbda2538e4ab276996893829a42662647a0cdacfd598d360e32e1f21d", - "4c3c4833de29057963a0b6bfa85778a11096447f77465377ebb0c2f88b5cf645", - "dc578ee7882c1d64238378c582aef93f7833bd5e47cdd63c426e4bc4fd87b4b8", - "e627f8b34e9d6346a54c6b323ceb42c4f45788dc31ce070bfa7e36989c5f1d22", - "9be442f8167a6087403c50a7cc8042f35e57421bc3328555643a579ad98be0c7", - "cec75620f51298dc394f1b91a4c08830f3efdc9c8ba5dcbdc5a5754bd1cba715", - "8b4c7779e127756668e0dc07e895fd4136983428c47523091ea3907541519687", - "00d3ce27591d10a942e9d5faa3408bc554adfc41c026b8239274fa8e8aeb4134", - "3a2b3fef77938454325f4c1fc8cfcd2011f5cdda8e36795717edec90a616e148", - "ed6ae7a3134717f9e61dbacad9d290d54046a7bfe66d26803b02c218eb5bb01e", - "ec48bd29e9df9c9b9c31fd9486863a3dec1bb3af7ae8bc8d44bda7e0c7b61e16", - "c6ece07ef6e45c0fddeee4289f28e4cdf61fd4ae09be10a8a7f63cfdd884e266", - "34091e2111ef19f44141eb71f8d99f6c691235965937c2df60f7364b411f208a", - "1346f54a6c81f462886a6bb24c42849cf827d59e77edb41b2bc3ed8737890169", - "684d004b8a2875c16ec4c6016be7ca0f86b6c5938ef57f035bfb2d60f02dbec0", - "31d9cdbd620e6f5ea4477fe11e085e1af38d73db29a9f0ba10bb1b4187e46a31", - "2a26c9e6519cb9a46ce905ca24ff76ede1f0d92d3cf06ca3d0b4a8d99837cc98", - "3d6e363cfeb1e4f261b6724c4a2eeff85dbb0c10cd9e3df8cef4eb201fe9734e", - "f6a67a7551aefcfa47898547499cbe0773c87a86bda6a0eeca495d8737f6faf0", - "bfc70d9f858b53a6c18539c3332bb224fc39c04b0f542ec6c5070b23d2b49849", - "630a3f825e6b87d823bf72088bf10451079160fa2f17e9dde58565ca62dc15fd", - "1f807d35fdb41e808d7c34f2c68dc0afcf5213ad28ae98e367edd0d558900ee7", - "932462bee32a7e2ba65daa7e09e4bd8031e23b125c43f89e2ae44bc2e1c9cf0e", - "818c64c07a90e74d120eb16c7758a0da5157b3e8afc6f74dfc302dd5daa56753", - "65886043294252b30bbc62b2c28da3512cfcdcb63bab73da13a0a5f3344a943b", - "3591f6bc8a7dee1e8a94547867d6e9b4c1d17ab67378593031c89adb314db192", - "2ff373b0ab5b41c164d2d12d236edc9bbc8db45834151678b633fd66e20c4063", - "2d5dc9171dcb78b4c175e86feb9cf5902c76df8f808eb5593a08f08ce225a8ef", - "262c75fe4921b0c38446064a8c466779eb61fffd9e3f0bd2f54eb8d66a45d68e", - "0f2864c69d468e4de5b3eb018fa96351b02ae00ef1884a9faf756220b2f754ae", - "76c65c7deeac5e8b6053b4f5b10e43009a6e5856ffaa6722f2d90c523c64b6ae", - "0b0281b61cabfe0d67b59b12a0465d4fbcafc6a494812d809c0608fa99cfff41", - "60d505560352800d220b60e9d9f5ff3ba025e618f53420e37a2d1ec13d2a5cde", - "a27bbd9ea29c4614db6fc95382aa1854598f9d51610a7c2cc2ae71487b6d4b9c", - "9d14559a7e10745fcf28d55dd6ed13d59f94466ba4b3fe9e9c1b40bd8359bc02", - "0aab99f21ae98b572fcfe2e4ce5aca55df8c845de1ff9bca323d6725bdaa92bb", - "9e40f43a8ef05a0c34179d9d5fd53062406f82d58cd72d467408f52a34e60fbd", - "8240e413a7470dede0598993e72b521f3e2d4f591236446eb93129e6d4108eef", - "a4ba361a5942c9a283dc1da73a11abfbfcce41c844050d47efd4fd2dd4902339", - "8c7ed99b459252d25b7c0641dfc59aa0ed767e18827ce35006e0c0b976c7c44c", - "d6f03ca60080dc15f79142d1693c15abd067e65574f1a4a49e279e1cec633f78", - "1c6ace3c6223dfbc027c9b17b9e924f451ab75f2111859f2be58ee4ead25f2fb", - "c1046ab91b8e548bc0267121999989f23566d7494b2eb96b15fdb1ac38da992c", - "218249eb06b00674fa23ce653c508ced7b9c29ff0e47a0eb6b20e3c764b76362", - "ebcab6f26ac18375e9043a2f92ccc1ca2482ae310573696969a3d9fd161e00b2", - "2fe7cc48fd85c1f3e4eee2c941c2b322bd39b28e320fd13256cebcfbfa6b3d17", - "4e141dd879b937f2a3828851314505c190823d21d983aedad0c470906ef5271d", - "eae8aaa5bc96e9c83aaa3199bbd0b8b885eba4866fb69d1c3d6e61c26c0c98b9", - "2a7d3d69e921396cd65f8efa5c12d3cbc2f87468059c0f9555d77bad601f296e", - "0259eb89183df3dab7623aefcb204049ce56a1d37493f499609b6a72de6dbe39", - "f7fca0afdb567c7e0f16b8cb02534007fde732ddf4ac59b637fbdc462dbb75cd", - "3cb0590cbd7f163a4614d034189772bc60fd91afdfab8d719cd2e16226d6ad91", - "c27745bce42100642e338dcc774e35489645e2146e2cdb9653f7a1c19e83db1b", - "51a800c88905c108cd4f5b4d43d449a31e8295cb90846e79f29104e10b565aeb", - "293205a551bc99b68a176d186c5f0462a4403903f45e96d649a46f8bc3815119", - "c86953cd089c629fb611321253e3f7f04a5562e2f8fa1d5176bb8049380aface", - "01d48fb98ac0193373d8e7260f2d5edc93cb210e840488f623d4ea4ff367d48f", - "fd939d5070e5e5eefd2c01c6417849055602f28d66cf67d3156de8cd7e5c4fef", - "7c083aec436690d936f6367567d5b9ef869e9ba752e406b4a877a0da356d930f", - "411ba6e44df9dbd03b1157533558c5b48126131417eedd27558ef0428005226a", - "6276871c702c1374ab2e537cffbc36de814014ef778d7f4161c447f3e280c937", - "9b07b2ec9fcf27a6033d8be654375b3096752d2fb4bbd8b3438dff5a79311356", - "ed2c3655357fdd4d54740c2d58695ff9bc7f9926bb6af8ec7af7e9157d3fc5a6", - "d4c6046eede5c5186bb588ea4510aefaa3d0cd5163b391467106eb840da6fc5a", - "5101b0df53a347b1c91f30a98d7af60e8464f34204101045e9b942786b5f2e46", - "e572023806754d2cd881a0cfc7138ff378bfb2792e8f0fc3f6be125e37402824", - "8a0460b4dd2dc7f99768d9eedae832997b91b73b5ef6154be0edfa1b1bf7271a", - "7703f61707e9c8c37314d0f7b3a407f5e6a9f0ec1b7033fc31f249b763a83d53", - "14165518d732ec9efe9a60736775ba7eb056ee6cb67e52e3be4c074690e9ad69", - "22ba3f622d8660ed3931d56b0faebcfe147a836b28fc5db77a7f7ec1a8248d94", - "c6e8d80bfe1bba509ac5deda82852c15e8bd2b30142d1efe422606926ecc88f1", - "a5b827b7af7a400b4bfb7d3ef5e16ac194e631f9996f479398cdb92d87a54466", - "7f841c7d4847f8a32238e379ca8ae9ef46cb966e0c974911d273f28853f89dac", - "045b1943f306474702cc165733c4c6254ceb0e73b01401318207642684ca1e63", - "d6490a50b99f1e57404d2dce5ed2c54dc77027bfab479697f1ee236d249b4ee6", - "8e1dd12401b7c7779628391c894b277e43e4e22d789ce3939e7927d3c24ead14", - "63d787a5fac5413900cf1b805e48534207b4633a073c3527a2be874368993718", - "bf8ebf9bf731f64ff71435b4829b907fb7fb735efb61ad3aaccceb0adbac8577", - "2f2772676dda9c8ca50da24148ce6791a68353e67f77fa38d89b91bb90e7fc98", - "525ee300e70057b8c11b6c907360c61e89a6b1dcb65f5721b5eafd2c3ef9b656", - "3dd8c0fa475844c44b6c21475dd4c052fb49c540aba873ba2cdec4f1bbfeb39e", - "8bc5e0e25918928e4638d1af1b5810d18c9f70cef9430b6e2ca62581fd970424", - "1e237cf1dcf2201633662992e6f6be06fa7fdcdf40a5090d5f1b302882e36fa1", - "6a3b17c2ca9e68774b0b1fe6fc3c687bc6cfd955fc61b802d0b395c83b7725d6", - "8c676127152b093d9384f55e4af8ee3197fe7aba0cd6e80c00e4d37ca23795b1", - "3931a5bc6fb4525e015b1977ab6b31ed108154b2934b9324e9c6f7a74f850a6e", - "43e1b1014bd37445f49d9ff5fd984ab9969e89c39dbc1d6e76b70c6031d55bdd", - "8e2d8004c790bb6df23b5c058cc780aca26ea3b878b8afaa6193b8c9fb1b7248", - "fe432e76bb3cff6903502ed742e5bb6b58b05ea298c96bfda3733599b891ab44", - "f403be1a75e286d2ec16db577c7696ca1a3e48ac59f2f39dfbe751e05700b2ba", - "7346b7cbd674725c8dc0d4683c41e53f7e028e17bad07788a34266e118267935", - "5824f623ef47377559ab7a945891d2ae6cb9acdcab329fb49d72714e2928ed9e", - "d6506d65b26b038d92cb89466d764a8e4859c3b8d6d4df813bf2f4a5ad36cb7e", - "9d7ec98b14d409f0efcb3076ff48f1b789349894e7ab480ba4840833a49c30dc", - "c5ae4855d47cadbbd957a81069c5ef21355cfca2aa7ee13d85988d06a8f764ed", - "f9605302cd9843a64757dcbf57be1d5d924e1a5c476b0f1c701de5fdc11d380e", - "5d3d126be8f47ff939c4f43ed707fb908454e6d50187ce7e53447b14ef441c76", - "da4333e78c87cd0f666c6efa507fba21a9f163e14377e68129c0c27cdd656df6", - "38986682a0a218481cdfea85a01343b4d16ef4215a8d2c9c0a204e9e4e180b9d", - "1a66742292702a09094c9584b0940635de4c6468ee97da9063e3a89324f0aae5", - "631d0a86762da9a11acbc21b1bfe2636b572e1011cc90d3ac750d62714287c21", - "022ff83be7ca09c462e674fb3a65ebb7148285568ab8888fcbed19db6bad888d", - "5d368603c11e860ad06ea47b828275908acce8a4fa580c2b10b98382440fb7f5", - "9c527bb937941dac673e5bfdc6ce255ee42c644503bdaa6ac63cc2b60391432a", - "b547b7bd6619af73bb2eec5ba44405db8ebdca59351a8a82967e1c0fb302332f", - "978d7d91ae733c4239f637054d2c62c3dcdc2f5b9af5bb93e0f477b9fe3791ae", - "224fcea5028645c070c706f652e8071778ec8b5f923b8aa587c3517a3aeb4947", - "d12cad0920c092b60a5163012b051e48a9b2c7e5afeabd5fff9231b78eee2dd3", - "cba5bc458f7990ec5ef853b1ff422e9b7fff1e647bba2a311554eb0ee344c7d6", - "0f85579ca58914ebd0d31c29f2a98f5338d37e6f82b089683a74bfcf56d11dc7", - "065626a886f2b2598be9cb2bce35aa5fb606a93d8571939be12ebc6e53b3763a", - "b5f0e6d7e34cf0c99476f35fa06d50b849f03cfe5cdd4d46df4df0a404fec31f", - "d53287e55a26fb6e3695493916bd03f9124b5b6f5d6a02a01483d7b2adaaa2de", - "e16df016e5aa8036c7f1815773882ac0a42d76318efde9c479c9f47094f42c8f", - "815aacb153df0e5e8e0b13b2cd0a145eb84d78806eed6a5db1396d0f3d664f36", - "e9b47c94eeb252752020c399029a203d04f918ca28418a0f182ee57ba984df79", - "0aafe2c53e018bd57060c6a7a840095413412ed7ec69ffd1b5ffeb020be28875", - "bff67fea45a0ab219813f34aa9f94bb50272a8bd5236e850f785604983928de8", - "77f35bba1fc59efd71e78e7b2b2b81d6e0aff37c2cbc3cb5adf755658f66be7b", - "d4783be28a711f6ee2443f608c4e2fea17de6569b9b0010d2e597f1598ea2cc9", - "d79608a5a6316fdffa84457dcc2a1ed206039004f17c4814545e1a2d471549fd", - "e8bdf66d81fb2a2ec5d65921b845a56618e8262fb7105c76f35f41f7ee55a317", - "32cb357d6af7164b1154e2acf4b736a98006347e9ce2d63d8fe6ea40569a948c", - "7a3b48959b977733325eed7fd91fcd035a7387bc3bd99db2bbd81ed98130cb51", - "f4abc39061078bff0a703cf31b7af94360d7f148967ddef8771e0f5a1d1dc071", - "ebed2471ba3de9752bee84d691bb1a06afccda6ac8de42340eb835f2c222dee7", - "be56515a98159fcd52dbc6119ad642e8cf580e70611fe950fe4e31ed84942bff", - "4cc44faf944c5aa927dd2d741905d0d4ab33ffbe48c921cd8457dc75a9d6e0ad", - "09c03c5d53ca77b1d07976e44cbc3a535e1d22d39043a0523a654ad997c8dddd", - "47bb9ad26e4c12ed7bd5b6b72e0c62310640d4e96d7953dd295bcc927d461827", - "8292c391f93bfbe3048ed841f81b62cb088e8ce189f5918cb849339dccf669a0", - "de3c0bf9b8c677eba0c4489e6bee884d4a07d0ae9e07c6d87f1f89d89f558515", - "38762a9ef3332405bd8d1492647573812f22ceda4a7cbe511505214ede580f1f", - "3f42a73db789ff7a155047ee834ba4865472a8896db8c20f1d84227fb1bb117b", - "5eee098708eeab85bc6cda843a8bd9485bb07bb99b498a61f06dc7ed56b15c35", - "7d7d9a2501830c5056f4fab019270033e19ca9c94a410a334495e5c221269af3", - "a364a9c2b0ed2f5c59da47e2ac02c60f4a8f9f93261ffa6e2f06f8a26659813b", - "c0ec46c626d4a6241950c8b4db7c1b31dae1b4057b8aeb31a317a91fb9127e5f", - "de07523dc4ee1eb926f6b0fd528c4511c75291a3c45991acae80185194e01438", - "c17d857ed72624036310edf4ba3038892a40dda3b1a30c665e75255d531c26f5", - "08fc713ccb23a1edd0ad021a715b4e229143bac75957fa4e0aa609df90cd9661", - "eb4b42de167eb9a10f7b2cb4e3eef22f2a076f62369ead71a1092352938e513c", - "5bbc44072314b9b791f8ca03768af0df278946ca885d626d38e00dce1aee0c79", - "a6a1a2e7b0494e13ca4923bca8915dd954b0a989ef26a065367a87944643b9de", - "d3231efc25c269ec0e6e0209b6fdebc5d9d66b200a3ab1d34d79e7f6357c2445", - "98dbd4631c7b54166bf0448321d948ce95c936b8f5f77e7cf4fb62f478916df4", - "a0885a4049b4235e00802cfbb72fbffa0f15ac429d71936229f07a01c5f2ac42", - "0aaf5572c36efc57ff11a1439eb7b7e56915e472c18a55705623701f83e06cbe", - "0dfcbeb864b100aafd3480773cec175a6af2ace5eb0a8c03f0ec6e042ddd7f13", - "99488ff4244f111dada47d61e0be074043b99d897d2003a11e3bc9c4e112f298", - "3a8ad28a47d96064b84d881ab934683e773382618a1f8d6228a70c2c11aecee5", - "1f1bc6979be7ace00f5693808613be382a1f0697b7999454458de0306e27b82e", - "96eac2ce57acae01881b8346e713a48d1fda2be35c2297d183041c210af1eebd", - "1cecdb21a446923e782112a0272b59f6459e9a73bec7d2f2886d7f8afac3c6b3", - "4cdf0fac1aa0b99858181b0998cc32701a8751664829ee8c653b15cda79e7d75", - "118ae9ab7d38846aad2b7c76ca029ef0c6202383ce33d9542b584ca6493bb01c", - "7986a536d98aca384cd1b1bbf1d21e167ed71dd9a2f605dcc0fe166e402a9942", - "295aa4ab08916c381bac79ba69fa584115b3552d78f5b4e7341af410c2324c67", - "d3cfba96849f66a89aab987f41b12dd138ee0c662e33f2ff27150f605576e741", - "649005872dd19ecd3531cec9a7ff8090533ef204b2c07ade468c5ae43d6e741b", - "52071ca5f98842732e49c93ab4392735569f5d7ef73ce7e0c783f5c524d16e62", - "b909ce547bf652fbe9d50c02fde83bb32b7b4211d61edad96c8481d3f7d5fedb", - "e3ee8dbc1fa22eee108ce9e137957a1116f8ff826a97b8900a0a5184a08f59e7", - "0becb2d2b3ad15e04ff4724c0fd9aab6de46c6ea97351126dad9a11fe0406d3b", - "5ad51bb97a850394e6cf00815a12ea4bb5455257d748098c942e4827213dc3b1", - "b16520d3297b7c26247b7f479c9dfebeba39e9b5f92daa0ccb947e3b57542238", - "01ccab2bfdc35d0bd99687427ed567227fcf49eb062668f7d3250196205ab222", - "d76a1a9776109edd21f3de7c588474d6427892d0de1580c6f157d389791429f2", - "23d9241689c910ff2370249f64a2a87cfd9e9d51253417dc2c1c4aba31d87101", - "b17982f6cf104cb8043606f9b0f5b758f24d890585b3cd88c88f32181a00454d", - "318f9df96d537883dd749da7dcc8a4fc0ae2f38b4bfe9da52898647251afaaeb", - "b3362083e0083d39d1ff466665e1797c99732c616539cbdd685be9704b623b83", - "f2bff2b3dcb5c92af0b7a7d12dfe90b07441b28bf5366b95e573325715580d5b", - "2baf7896e8fcf4a7946faca3c2a75f136615f2155907fb5ad0e18dfb421931cf", - "afdbdbc1fd81242642fd59ee079210fc5059757fe1f81ca7c627451cc5640461", - "ed7c4b872de2df4e22d19dacb91c859fd4c27911c66311f2a10f944bd8e453e9", - "a497266de5b4b006a5deca5c03ebf64b26a2e63d483cad46af6125db26346d53", - "8124a41cdfaa1f8fafb736d507d5d485a60202f897a3bc8f6834dfd893a38da8", - "9bd670e2f77c24776ae9262d9eda7169ba2ab40d91b5d4cdb3961aa2545af93f", - "3fd82caec098f57d315841c9f3e6b47625c323196ee5c0138a749b599c33a803", - "c35d502516f30a17be4b519299fe8c0ac254068d45e403cc995b657bf7403923", - "f8caad3b2b057c8bbe52a24d8d9df9e1cdac0e173e88e0d16107aa1da2e22506", - "19be18ece82e234695a62ea3a12595f99bb8bd628850e4e134561392589aa5f3", - "c879b4bba67b0b1a3db5641cf63eb74b8a4568fc3acb9c44872bb6e549088c5c", - "da6a130edcb3ed7ddd0f19e62da068376becce2403cee03f064aaac5c718ec3d", - "15d5c8b6589b6a6ce08a8c9a1af87c69d87c9801a55e7c1e66de43482af51a39", - "0fc03f966f87dc2f47b014de6c8acbe2e719f33eb0299574ddf982eb05a601ca", - "210b5c89d309d45f6b1baa6596e733f70e37ed39f997caf6268cf458bf99ed6d", - "1557c4666fcbb744f52e2269be13f105fe3838d9e3662eadc91290ff474ec42d", - "1bfa1ef9214bd30d3f118bc922defd3950fb24e1665c65cc0709917298e6ce33", - "31dfb83ddba56c2ca4a8c3f0f1bf85212ee5511c5d69adb4807d85bc467533d6", - "ec4552ffe776a06668fd8085115c9c3959b70cb7506ee086519a02f998af1041", - "c49a15241b01bd2bc9bdee357402c0c06a4dca6acec6187672826834fe8d5ff9", - "3f2c92a078342ca6340b6be81457bb87dcc5fca2f9599b93a981eee34e2ff6ac", - "8ae70787bc7c7e15f852d2a161af7d4965d9032040f374f395d110c1b19c5ee4", - "f5eeb82d24d7bae1c8c6153ec63f5de897c9b7206144820451f19c74856671e9", - "f6b7ab3912a6275f5cdb08640ef325fb7dedea7fe975ea9653b07b9f7a578cc1", - "c31adbffff689ffe732783f595f7c6f06b557a40924f3bc76ccc8ed32882ff45", - "7c1af8137208f30e2d7a312d4136a97db639194ad1e42c94465b557767748dca", - "1696cb0616cc66781943482fcdba717df3b1a53e93450cdbf72882b05ea16263", - "71375b11f8f80d3b0e1c8dfcfc3173492c9fe4200ab66f0b8a49d027c3940ee9", - "b028d6e0810c518320e85661e4dfce2f9b289b8741e65d91d9b5f5d4a7b1cb12", - "288ce8145b60e81065c32fbb5e6f52bbb86fec5b7e99abaf5dd990687b1765eb", - "cb0454d1a4dc0a9de7cc04dceb27214577f91488dd62a558354935d5c53bd0b3", - "97959747b653fc90df7abaf991234c25bb7fc568dde72c779b8765e736b504cc", - "b28acd43b16f057096ebab8e7377e2396e5a0f297e35bb4123726020300c3c74", - "b2e7a9ffd6697c687958655fa11699cc9cccf1a020cc0de4d6f9a7cc548299a8", - "7366980343a09857ea83180062f234d6e41f8f02c484fb76ecaf297b427508c9", - "f1a359e1c08bb05bd5237ec925f9703ea38fcf1c134136c271ce8195893aa51f", - "08c2a39e0739fef6199503e7c953025d03ef6808388fc22256518ee0ce4f2c20", - "76927b182fa43ffc4d0845a5f6d52aa4c99072324bcb46c99fbb6b14e27872d4", - "8cbc1608993bfa1abff4c20864ac2f08fa5b9e8e2049cd90be0b4e062bbf8916", - "61a1d02d68a2ac2872503ec99b37d44a085c56edc4e53ab315f7c1ff52c12791", - "8c0b288db301c86d17d03a988d98f7df9f82c361d8bc5d512d7182b315250f12", - "8f6157482c20f37b28deb8280d82529b207b7a651eaac1893d7ca47789fb19f7", - "5b7613b5f04a17fd5b7d95109b32aa3315e130edb3842218e6829c273d944927", - "b58f38c7f239fd4eeea0b336f8b5438e517d6ab848198d78f7143c0ce7cabf18", - "ced5d9b9c0c7569838d9a77fe05f8963eda7531e67da1045ae106993af306c4a", - "af7d8da31e031727ed1abbab8ad96abad0b9a8f0d938c85192866f547256987d", - "a9b5696ea41d718dc21810c1ce7d82c717de7ccd1f5b5c75e27872bf2c8ef595", - "4247c2bfeb4c86cfc6ab58f347c7f49584f13c7fd388c9c8a3e36d59214dea32", - "e8ca470714eec845be25a363d1924b8ffa0eeab59be21b851d927d3bb82935dd", - "74df80f545d3da633400e3ecd0f5429d3a06effdd0ca96831dfa2b097bea9f64", - "84c121cbde3c31cbcaa3ae78ef794c5ed2c974ff6c91e55f69f9ba11510ef8e6", - "28eabff428594f651902ebdcce5bb51d72c5c8fb5c3cd9db2e25adc7998bee45", - "7a783d8fbc4c661cf9355faf42af5ceb795733cf9aa7eca27f1cebf82d9adade", - "4ea2857053c4c20a8942d485b7fedc98e6db6fcbb251f86e8fdfe0c81c016142", - "3430013fa736871e2321f20522fd69c4ebae70315541d0f2473af002d4f35616", - "9a1bb08d188e1da2e30e3bbd88d570fb3300dc4dc0f0fbfcbfc05f9128f9e78a", - "e860bf83cff7affdd9e80e6a002f3528c07a15e0cfc0313aefbbf2d619c3108b", - "6b54b901e7b7af33b47391e119df0b9182341271a3fede51c5586ffef244af57", - "4f03df06dadf160ac389ea60748cb50231ce3caddb17a45289685c23341e7035", - "50c6ff8a9a1e9c7dbe2f4bf72ada16a1dd286aa9fed70866c280749a4e0c93f6", - "c97a2afe666db231647a94bb4c4fd2b00d50dd425cdee6cbe26467b5fe5b7f89", - "4799843021bd845e19015990f373e25cc54523393335f18d2d6607d43a1c38da", - "6345f2323fd45493ac1ce7f113b2668f41f30f19b8de722c2b3e122f5680acc2", - "5c78b7dffb7721206bb8d6f4d188122337b7b606cc12231c7294ec7b209110ec", - "b180c1bcc9ec2b6b72fc1a45315db0cd094bb2e82143ee983d4ca761db5b8436", - "74e5fd6675fa64fd3f1875935e5aca4c28d19531cd038fca962533ebbf285f94", - "539692982279da28afe25243eb3baca1ecaace70204de153d54638574144e82d", - "fe529ff1a07ea4d93cca31556e96835fa5be90d74e566d270b5f790c317bfece", - "cca29253021ac7dbbc5c260d0acf3ec43977dfb22067cc0c9f6e75c46626ac13", - "873dba8d0d95f42e2abdd2a764e9579f852b83a682e8b8454867e8057779f55d", - "57f46fd536de999a9b753a59773144b910af4b2745ff2ccc6821b2dcdba398b9", - "84aaba1bb47453816c3b41c49a832b9f9e0237c95799d6fcf7d1f57293a73ff3", - "eb7bf28fa694f6129d8128a52d7ee60aa49da7b26328a5c88550584fcb03ac89", - "2f884ee25aded97599b3e4975248a1b4a6d34204855d6e69f5a86e88eff4d263", - "33408124acb95f4fa688486b96cb5f41c23d9f4a0010d5509d6c196b491aab7a", - "14df6fa4193aa0adc8a28e7ef233c54cee8ed9c7424a2d6deb1d489b34b9c1d2", - "af3e1af08a2294ff99c58f3087707df72e7502845d31be095c4f2e1bf09dabfe", - "b3d96c9dc80dd40e39d3ea7f1750140dbe0ceee0750aa1383d9889dd56da538f", - "8d8f5daa3ab4059a581a5fc6baf3c1af62ea476776759cab7cffdd56ec726ef3", - "bfd2f63df541764d7890d4abe3d476deb704ac2201b68b71a939ea08dec76814", - "d9c968740a27af8674137cd0ccc202afbf94ab1adfe93f1685fb3a5f03e94db7", - "675408d30dac7d1311c65b294153e04737068c181353358d709dc353712ea7b3", - "e05c5112d83ab6f079918cb91b73e918a402c9905c2a21f9f2cda9521d08fcef", - "6828cb30d4038bff34fa08018577de75c52d309c2c75f77a4f9a2b8773009732", - "2923a3fa79ed6fd7809f7091600a7e692b09e60babde75f7f3e9eca9e665c7bb", - "635c8c124c88f24a67fe42f516b786da75dedeccdc35463fd7696c70e56d51ba", - "93bc808c8fd5b643a3ad20ad18e16010901b7588f038b948cec95aff8d381f40", - "99a0046783e860fc5caf48fe608a6af6323d3d673d2ff03244b1dc120dd313b7", - "6177ce439fe1bdcbd5a6a6ee5fe194b298a32047a328854e86704de17863a23a", - "1234865e38057608aa61b0351579bc37021255417d5e3d88716f52d4101f645b", - "a617bffa9135bb50086ffe9b1e644ec80b53162b20546c609153f7769103cb01", - "ae2235e264ab16a30cd2ddfe8744bd37bf5eb3d3a993971933734076d281f5fa", - "a2fcfa3c014b2a453e1c7cf7b933a0702d792512db932e2a4ffec6957a243976", - "10a29a2d48d6c9f05e1ba292b8efa79daf827fde34c9fc0744a9d3f2b166927c", - "6ef4ef4677cd0825362de42e55051e4c44595918086e4b19264e75e3339030ce", - "e0b9d0530f806a8be54a952f869fca7f63a20c1a344a65261b1c1ef7ff30f0a1", - "731110e246d6008e1c25d79f894134f0bd95b1ed489f7110cbad9234bf63b7b7", - "61635dc7b26bc24c96a5f8b8c49b24567982887f50d122c8731003bd11b45708", - "57e58c8e8574170b8c5980df3089bb5f983dac7b84b0bc8f148b4f43ad3e740f", - "2277a2416bb17f356c02148032a589731f7781db4768daa6497491b958271615", - "0e4d3b393d26ccdcd92bba172bfca8840ddc87d6102d711d52a4bd79fbd4d74e", - "8e1da753231a80ec1a9821e32af3a5c611c51d29f2641b0b9b61eaa4a52a8cc1", - "26ab5b3c5878f996ba6e1ce6d47412feebeaf9fe0e1d2fb5c0d465ca9227550a", - "f5969e4b9d4573295d5de83d411f257ff729543c408f9d07d486fb828ce61942", - "6e4897eadf9b68b82fdf1e940326b4afe039c26232f6418e1f52e114cfd11af0", - "7ca362bc67842b666ede86279a2bf97145b08bb6cb4b9f3524aa00b546cf1933", - "94192b30352c13af52680ca6ee77371970107735891ef192690530b05b342d9e", - "d4d8c47026084b0b28cd352a606d1531a702f3becd6f276642e3a3fa65029bbf", - "0f5944e471997f11e4114ad25c043a22af21979cd2ca699e97a7e3be8ce3de24", - "3cc149ec471eefa8cffaaabef5f3185f8a81d017548b69af653af335d2659340", - "a75db05843e35b882efb8b88567c87f4b397e152f2386e0241f78241b0894375", - "a72901789e02d375f2e207e771689a322d6668b3d29abd24cdb8a0b16f09c986", - "f35ce172f36ce70c3376f374fbe12edf061eb71157663cdee6c97afda2dd9aad", - "8acdd096f18106daae7666e16e90b19c8d1d6bccb5fe0cdecd8a90b199ac44ff", - "d6b27dbf56e32394b9cfeb9c58bd5906247c49041d6c7741b5bf14d5047db1ab", - "07a37a2b085b7263bb860db5e357d7b0db8278eeb3067d6ee042c3b9399e77b7", - "cbb2c3aaef76cbbe524fc91fa31ea53c73e31d581f64876e96a511edfe2baabb", - "11724404c974658af477a5b779e28352b63da13a2c0f45766089f4d9281e397a", - "b6c57fcce004596ab87c7d8b64e8af125a759e2aac9e41e3b5772e7fa2f57a1f", - "aa108d5d6bf3ce5c0528d05f1024bc89cde46693a0b6acde8dda239bf1081e6d", - "17399c6396eb3b6e01acd8d89b32e95196ad91624e20323fc493e35ecf603fba", - "df4277c4c074b56e18359c518035f35cdedb923a048d507004b3bfd2eb5c4d58", - "6ccec460abf9bdb797896064d1e35db163de8e13b48f62c9c6bd6ce47ddca5bd", - "dda9a2d6a643b2399d8781aa2843a4fbf4a5c46abae57e34140ccdce6deef2e2", - "507416bfab08039f33bdfb4531435014ce6fd46f6bc6194e51a82fdf74b72ac3", - "16b0cea610a4501e2d39820373cf60b5d19fd0031ca1da031b556eef4f6ad204", - "4404a717f3e1950e0290458bc543d3ff3bea8e0aa591b5af80524d8ef7a5b7a5", - "52a912cd634fe0b85faf941ce71629aea5261f06d40f2c48b6b7101c8fe73160", - "b9e09fd927ed23474d04fa95edd6f01d7d92d1d039b6ee738b565491c3089333", - "c6fdb1a427b4303964a3169e3720c3733fac2fcdad2f0a1650af77d80dbb65d3", - "ba3f960acdb8d61271bc925a4572c2904aea1ff3ce45444a9b532cb1d5ae7737", - "b33f5f69acc19ae61dd7bc38ab129f0c73e7b46fac31fd890b381f4b643adac6", - "c426d9b2b9441b21f87afda953e9441adffcc2ad84289de32ef30e6a26f0ce92", - "0e9f8f8aa04f4b860306f0920802e64010108d5767358ee21f8f6c5771e10c02", - "26176d5bfa1d86aa29fc8c999267758db64f9a89590a80949744c18fbe1c387b", - "79fec40a6a8e594dcf2b5f58a17aa78242984c95989fe50a96946f0ab938437f", - "6649d3089e556e97ff617afb193b50bc2ad84a85830fd918a1d88020bdbcca0d", - "c310826e8f295acdf96ac90dd3e619c2068b9deb5cf659d1631211ab69d0b163", - "9fc97f0d35bc00c3f8f83cca9ddfe0e19d1332a8274d11e2f08fb8386f16cd0a", - "89a8a4e4d5ca049c4b3909539d18781e1f1cf58bbaf027587c9b4ffdb1057396", - "b174ecfcf23ef76ab423ee0160e799793d0d6bd24804c3655c9bf549c2088030", - "c664c7a8aa39f354a6e8edefd978b7d9089e53b1a1077804c5b10ad845b085de", - "2e49edb8349b3dd3853bd1953cb966460d080fecb999e33411c3cf60a69beced", - "c3791868dc26fa0eda723581e667ab779197620ef39c1090b7cead1e59a572bb", - "ec9594e7b5d725dc86f58b86ac42094d62c796c72b857c5ac034a70ed555478a", - "eb0f332e323bf32bc25546ea267f14c452da27dd9309ae7f6216580b465ab081", - "425fc3c7b11c00aaeb46ff8bf8bc9aeebf49221e7a1407a1f5d32766a45fd056", - "21498b768fea0e59deb12d631ed275f854b6bfd1f21256e20d1136665c316a0e", - "18cb9eb78beeb20645df70b7f7bc72723fd3745a902c34edb3668ff7d387654e", - "8c31021376e4380ce617dda8db95761cdade4bb26b0df9b14e06f288d30a4dd4", - "ea540748e94b3dce849b461aab72a2b8f49d54a8d4060354cba385e61501e8b8", - "dd3e48802f6ba0e5da4519cc7a2e58ed392d97f6a45fbc81e7efbf0685b48362", - "4e7c6dd0b2afd563876fdba1cb4796d3e84ab168e8702caa1dbc38e942b6b13b", - "0646e4e5210005f849694ccc919ebe5ee05df10ae3860c5e834fc2121835a534", - "c2d3fd47b086cfce7083dbff04f9608a8b504225c0feef4c536eb709bff591af", - "da28fe7a5c4d4f4af8e30f5fe54db647a9c826b77881275a0700e80dc387752d", - "8238d0fd1f79adab2f33aa344634d1fa114ff90853c2d076cf098246792127a6", - "0e8c636fcaabb745748a9f052423848943628586415af4d5590b6bf7917f765c", - "1eb7eccec9211052540e3e3c3d63347ac7ca5fab0c6a0fe5e37a170ebe0ba004", - "99bf1daf4c501e754cf40f7c84ed616b9ef2d05e89e75695b273430cc30dff23", - "33839ba9fb8d6989659b8a64dcdfa0d27df1e1b63455c5678e032d4fd1e450cb", - "80bd3bba4738645bbd90c8252e55ec8f6812662470acb15370a0b286e075633c", - "615e156f19a6b75d027a609c715f4a430449af6de85ec4db4591e29976059e38", - "2a87fe0df4e79e3b18451a2f03159c002bf140761ee4b07d0fa692f5b2625442", - "d9703d0cb1840be8c1ae79ad3ac9d12d0d54017101de4a110399e7cc7e0224ad", - "e8a9eca01595616970ea5be6e2a391eebe6aec9c2282978a3450c1a37dae47a2", - "615f06eef0ac84eb7c0bb95194bf828a6ca6425740915450df93204bd30cfd0b", - "6a20fdc35070264b7c5527cd019c5eed7d6efebc0f0faf0b04de69d4270e8ff9", - "a2868824ac9dcb2b5ad4266a42afe0ec115ad0e85dfa2182d9ecc53e012ab2a3", - "fb463b705f264023fb193e57bc43d96bf1323b5cd5a68dc28e257aac94b55835", - "86f3ddecf4a76102e15f30885da81699d94044a47033823402fdd02a949a6b84", - "96987a93260c10b36cabe6fc6a224c58d344dfae3c29676f9df6e979da278957", - "7e7547e5f1941f888d438cbd8794ca0c550ea50c429fb533d04a4dd648ce0324", - "68267993e5aa880c0971b35b5ce7f5de7d4881335fb646b2269f4422b6990ee3", - "4e44f9c8c94f12fe94375fafc4817660b52f89d9e4d0ae75de8a715d83e28835", - "1d001dc21136e387d9e946b93576e8c9bbdcc6293884b0ea72eda5befbe65980", - "a9a5da103baa375bd5b9e69a57e584f6ae5110da00e1d54f26c2ae0e4e2299cd", - "72c4ef8d5d6f5ff042d8af607f69be0d7946f976823844e17d769878f79da438", - "ec17617a843e8876a2f934fb015bf2495aa29d1b3ee4e57c16795555708dba4a", - "0fca41bb4ca1d16cd28824c48b6062039fc51291c3370b5c734eaef0a703399e", - "70911c66e18fbde0521a550e06d19cf781520b2710fc959f169982c4f3cf7385", - "c096cdefbdc227deee234687dd6c9fac051392a3bbe1cb7a6a84791753154743", - "b3b5d70dff7da0af41b7c6a3f848f481682a62ebe09345b5a515d2b3235292c6", - "b864783387ad483711f23594a23e44e167f54bd640112030fdb16e9161f903a0", - "d23305b0955fab06601444c7a2e08aa597db2604372c8188ed8098b188f1baba", - "e4e1580b346d87ec0f4bcdaa1ec1c0f4783f3d0ee88ead9e935746f9c05e5140", - "492b76aa325b3a24ac9b62bef2df796382383f6109b5fc8a4d85a0db24b0384d", - "9a6428992c7f649900e337db12982c110583feebff3b636a86c716d6bd61a740", - "ae262700835fca325e1cb567217fdc64a7af13da1734568ebdf1f575e79f422b", - "b7847d61535c00d43c9ab44cc1d4828b03626569a226f796b9e98bdade179f26", - "50cd0cf989459cc23c9e71fdc1f988eb51427da4ad7376736a450df8c7db5bfc", - "2f5710740704c48b28de75f7b54805a3ed9ebca4261928b67cc47d8da8381108", - "61fb96845602086deb9d9826eaa69b393842b3a7933b9dca6cbc0fedd68eaafc", - "d91c53f2bd35324b88a133b21b7f6f2e7e62b6507e06a806e0885b6aeea33ffe", - "0ced32b5d23b8ab6eb0f4153760f433880c26ae3b84aa491f741a41d12ae9b5f", - "c74da0d3e40b2868b5f57ef06ffcc1759311227632938af8a472a8d8904bb1a9", - "82fbdd38ca63539f519804b8bfc1b28b2e7688df6afcb6cc6b69865390628d53", - "b0041b20f8c5a950585b367ef74aa8739967e041cbb03a727b073a6e6b719225", - "19468a97876a81b5ed7a5ebe68f6d6859bf23add35d23520c65416cc9d198e02", - "31fcd14323190db3e63e20cdcb61438c537f225be3246edc8c767e1f8d9efcea", - "47607f951d00d5342db664d71daad5ad5f089c80aa9fac7e625aa4eee38231ec", - "8bafc42554b4d4c634005aa3e382f307351154e7328d4c8c9310e64ad80f9e42", - "10bc2108459edfb698a9e6fe4e9829627cfe6dd5d870f29724fac4222b89ef14", - "14c2cf87a79307d2b083c2e99ebac8bc5e0fd4804eddfe328b549ecc5845d117", - "6c05f6c74ce48d02323f5517d6aad56f16e0332e822983c76d9a7f4fb7de409f", - "5ec7163782782521d80ac1be11013496b3d05686b9440eac6d7bbe9757d6c38e", - "00e0c6885f398f80a48110ace30ea2192cc55d140531e2dd9542581b24f1e29b", - "d331297a4f3b8211117bdea3407f907e168355403c1112fc3ef034eddbde8916", - "04bff3b9d570621a324a34223ffbc932347e8ced658a241a9c7568cb6846a5b4", - "872c92a2b574e52d640dd7f372904f692f96b40d8995c88e6a6a73162fb7d17b", - "53a12d6121c53c71b22fe35028ad3b036435a1f7f06a5eddf81bded9f4ea8121", - "18ed39fc55b271492e728f0b9d0bc1198359dfac5c9d5abd7ff6a38e4a891ee1", - "af7c5b0a25f9ea44d5bb47cda5f031a16812ad74ac101d459a8e4911a3903f0d", - "dcc6dbc103d0a21ccc74a59dfa54b35bba6aa7ba05e8d8b13672826e52db5283", - "5ceff847383574fcea7ef91c910ed9228f9f9ad7cba4f834eec31c87586b581f", - "5f0aea979cc8f37469ed9b83b22ac16411ca3b5f2bc14ccad9f514102ffa3d3e", - "e2847d673f84de190768e3d91fb429125d745bb117ac4090ac7a75f976b59493", - "35d5babe0fbaea9663f6e8a1ee04fc9b61e75afb3b0d05ec3b818a432b89d28b", - "36e01df0165656fa1dc948753830d4897e538e595a5e34b1864dcf9d0251dccd", - "003736ab4cfe268cccad6a1c0f9b387310c013dd38690f52d696b45d6c973741", - "e07c699d9b5ceabdb15bed3525d5f3da8cf3c88e9e79a21b3c1cae6dc6ee6884", - "63e38ea70c2b11e2577d20db43b92c0c673464cc134221f38adf595ace63a939", - "ca84c8012682019da2355c33606b838f448e1efff63c2d90761496675851f2a2", - "2ca69fac69bf6bcddb2b62bf662fda5bcc9ff71182ae51917d5ac1b7d10ce55b", - "6045d003b868fda8e5f5565d7385d905a8c9f6e20b08a4e825415c1e845e189c", - "17e2123cf1f966645aee05d10179b84e5dff22bf8245f5aa845a127052957bcc", - "628d47080e4073a857a11e5fd706450ff5609e28836518de2c03fc8ea2b21a3d", - "3d9a04747e253779f7e9976c108fca92740ccbf1f7c92be9ead0cfaea0fd1c83", - "56b3739c65dbc87a407a333fa390e72507326f4d9e6fd5ea1ac21558596e7b9e", - "d2b72dc663ff6651d8a493023ee0c59d1d44f6d45d1694876a89a31f8b436c59", - "d0a3643984c8c2aa9a2820e0e132e83836ed8cd347f4195b2c257ef437301613", - "a8bcc95173676f2517d732384efee6c5104c07532751d7789a57822432d8f796", - "97bbb82eabe27a9c1bd2c87dfd5c93effe9c83c92be519b3ffed26dee69d70f9", - "10ca1c3dfb032cffe08d9e625c31be9dc749821c8eb28c0f0ffe384cae19bf1a", - "96bfd42ddc3c72be6b90c2a2559e366daf0645255c9dadf57a752e9b9197e8ae", - "74e79d85c3b37748e4d711b9d9ca5c640343ba093df45154b03e052896a1d215", - "eac12391617ce15482f6adbe4ba54b6e95b9fde3710eb1aa28734115028bb2a6", - "3399fb50d43546bd2859b83bf287d8f85a600051399cb4a6896fc35591f2c59f", - "09024351e93e19ed3ca426983a29d68fb5b1cd3832328e96ddb31b2fc631d644", - "fd34faf101412d9e691b5716e1b2e2733ed7417887b2aa47e0c720fdb4a481de", - "0a4e1c16c5d2b7aec0a3a04a4037423d08bd2133fd20f41cffc0a2cc5b9e98ff", - "de9c500ba481f7a7381bf17ccc50f8eb8a4a56bf06ca85b91e48cd57e70abb91", - "ba826f80b83cb949cfd3d47ef2540089949df5b6b74c50e6fb5e25b1db9199b9", - "5186af35a4dbb5dc53f7ed63cb27d0fab64660e9852955c2ea4228857aad3ddd", - "dcb2cc0d639d89dbc602a64764472f4f6c25de093ce41556bcaa96e8999d9819", - "d511745f906bdfedcf39cc05d70b7f5c9ce0d97fe482788afb5311a5f819b79d", - "fedbe22b36c42d9c655a782fbd7b2e619101c07f427636af0753f0ad2a0016af", - "4f08f961420b95d74a836078ace8889d2a968eee286e960ac4ef6d49bc248f58", - "98cf5a3720af9577abfbe60374a95c2ca055b825a73767b5ca21d44557655f0a", - "54610ff5ea33883564d6161e92436e66be6f97a1db4d72b0d196540e15446c59", - "6c787469aa77f0c7f878107e0ecdb4423be99d47011ff9bb06dd71f48b5992f7", - "c84b6a819967544f553dbb1297ed09ab48bf9145b771458a3c4ec2574497dadb", - "40de924a8ffa5633fe3191c864a1b1cd4530c919e8952736a99aea02f69ea750", - "95185c74e9d540e9c925a10de76454102ac81e60c6c6ba30991d55d49dc1355b", - "8223c0536156a03b29ac17769064be91112e88eef6939722146dcd2633cb0de1", - "5f26793b4fda2fb245861a550311954ab69d13856f696f1feeb6864827a36114", - "61d34eb3be7140686488122ac8e0b26565c031860776c5192bc9e5cdac5784db", - "06ca5a479d386c219d66c22f8235d68c5cdc90ffebf4c8a833030c749ec58764", - "09eff14517ebe82cf81655f7e37e5168472f39a62c155b6df4fa067cf4f4af2c", - "a3d9e582a1274e9cad7ded759dc9f34c89956c6cd22f82625dd17d5a8a6abf8f", - "c220afe398c4fd79b2437700f7e9ab9b2bc6d3f81e8a4508e4de002dc3840da6", - "33d4ec8c68522fc13f95ddea85675da2043461ed262341d107faaef60d94b76a", - "88d836826d4831cea0453a4d934bffbb9465092d63dd55c2fd0dd5d007fe2d41", - "4981048e4eb7c94b9d7d4166e06bc914d49fc8a248e0a56a6904377ac0a08c90", - "6d051194f6b9e192dba3b97b8a4c7f888644fb4f1b0e3613b60b539dc36a3b69", - "e9a7394cd8917b7a4be10ce95622939da9085951718abba97fe8165758c37fe5", - "2fa663917c5aa116770b678b853e9cfc0e985234e95541939a294283454195ad", - "8871496c53224b60b8c12404a78222fb82f02e714838e937776d6286358c2de9", - "f7f3ebb96b5a17cbc524806ff42c94741589c0b54909a96c6cc17098a11ff818", - "4049e878a9877822921caffc7b1689c78cb71b9ebefb67b5cda95692fcdae6e6", - "26a7be7c66a77d869e17306cf813ae1291afa388f16e291fd550ee906128c2e8", - "14af066c7c60ac26c36bfa34ede812b90ac8314e4fb38d456fe194977bad0877", - "c33d3b37c315864e10fcfee4001f8666c9530aa15bc951828768e41e48bf7866", - "1dc947429559433557e0d545e892bafc9bb51f6cde7f1f2516ca936b7e07f147", - "d284be770293ea01bdfc614077d43284ab7d63864202fba2bbf2ee2893f58c36", - "1b80da55c407089ff43e2a7c95a629559505ac30f60b2b2bfd1782ca38894c59", - "2cf2648b2adc20dd7b51408a9569ff8ca05cfa75ced9af1800954aa08176d20a", - "fdb4a0f142319096a26d191a45f8f94ccec3fda657122393bed56095793e4b17", - "a01302ce9bed0079cc8dfceb2d354888e5ede8dd2436ca68a8061033524aa6da", - "d11d1d8e76089f8be3a335774ae550ac762b570e9b317bac4fa97033c99e35a5", - "6afb816ee99654377933b24c7ff384e6304b5134bcc431d68766b2c32a4b013e", - "71dde8fe1af846db3558b3244a04c5341839a9ad1c926ed2be1de6491bacdf3e", - "f406ec83390e2681510e1cb69bf86157aa7daed35d8d858f1506c95c29abb951", - "06c821aaa16fe48278694d74b6c33bd686f105a29ce71784cebcf7efbcf96ac1", - "39466a7e7ff28af3ca4825a2328ec72f622300c5f264acdb100e482db538d55a", - "2a4814f2b1a0ef79fdfc5734e9109ffd501ec6177221e5635b7e6677cd5cdd37", - "7932e8753c78209b6e2c23aebd492bd7af35f6ae79aaa7598d4d2c67a4fd73ee", - "c4e24ef49a0e584f3e2459284600716c4b55151465b4b21a54f7b4cc125d8aee", - "02387789dd90d5b9bce3b61118be2c2cf533899ff1850fe80e51417bd048d877", - "5a88c418947909bb81880fe619894e67494adeb60ef5f7126b17f21e788c2384", - "1c35ec1d0ac01ff006eb2764cb59e1739bec5fa6bb3b5c4bdc742416458a4d23", - "4b969add13c23de140a8518a1b117b30af99d9ebc2460cc6a9cac36acb24a892", - "360fa6f91849c8dac8ddb7e2e60dba28877ab724d2261a4691c2ceca59934410", - "84e36b77ba752d526bc6953ef82b4a5ed018dda90510a56b8b051411f94139db", - "40671486ecbcef2c0ac54331948a3ab35def6cfcb096c07f3a56fbaeeb1d242b", - "c0913d18728cbda4c2569008f828e1a0389d8d0c26a6be5f80a412ed407ecc95", - "7066035be02b0ef2680656efd41eda0ba03b9f423ccfac87fb25d8acc273c214", - "b81e6ce606e55ff29c8da181c807a975610536862b41c0df5e07373a09be0f4d", - "77f8a0f064d3ea0b30691363bc0b576772017f73df71b67714a839357e7758b0", - "2e23ab2530916bb6698f7fb3f61477f6b5fff43160c85b7144b46b077d91f576", - "436432fcd26dd1007e5150644e2153082b7760f6dca457065404dce432341427", - "721f38d65cc40205ff242d638db1ac7be9f4d67301fdd9699d88985f1dd202a6", - "39fc49bfc4de89fe64200d508953cb70d77d261fbea0747b42bf577dccff15a3", - "ea1f1ea4cf96a86b7b880b9afc983e64478b659ad2ffb2ee69393ae21c69fb3e", - "14b3cf8a07581a1aecec427215cdb0abdbba5f57887d390ff0bfc450d6cce7d1", - "a861e4dfd0e3ad7eec7845a11803f00cd81b1e7c01f8728e00e51be47f8d87b1", - "b5b7c1c104b40e262288db41bc5a75890667e5f45b1e3d31388f9341431c4fe7", - "4437c7eac5aaa59766128f29205c5e2ad85c38cbe620d23c3b979d70c656f287", - "2969c7dec7ae3edd8361c1f1f5cf1a7556e07f3ce57247b8a99291dc5d0e951f", - "9c41459c066c8f0fd577dc09c04103b8e309b0f403aa8cffce5d70ca84e818d6", - "77fbb163c4212f1472e67d1f57798a0f16b9e80e041789ed13195e6a109af054", - "be5a33a7337cc4b52e5a52e93269669ff86a3460da0a760afbd901076e61816d", - "206dafece5e19236bd78725dc676c4fe9b2a2b70a21d366a18166653ff20d5df", - "b2cb0ce7a4cd3b275429649ae3e22e098b15f59767a4430560f71da755d1ce22", - "3c912e435b114375a20341d3ef6288d46de18d16ca234b3a252992c9d83efb3d", - "85c418ee739e4275a646d674ec20f776f902e0cc9e79efed4128e4de20b8cad9", - "bfe7d37817b1790e179750abd08da0b042153f7655f48e626c671f022423fcf8", - "5b08b817d278a44af50173d75e4e4e8ae4c40e9e944bfac58c3afe2f0cf80df9", - "8a6dcabfdcf370af3788a50d2d37ce07c341818442fc04efb10efa1c9b6b7f99", - "ec7c74a240f6c38f9d417ff58ca48a8b4d6710d29cedc24a718a9d8f1c7a5588", - "9bccfec5de240af3676765e4545eca48ac4feeea43d74a71a0455f5c88e09d55", - "784ea47ac7649d34db0fe67095bc25765d73608ab963f0029bf791fec7c03716", - "9e8f47968ae04a28dbbcfd027d27d2d4e5b4ba848065e7e3d3a0fbd5ff0cb0c3", - "cbe9bbb2c025d98104540653eb4ca11574f5fa142453f830a5d74efc35cc2565", - "2136147f333d5b753f15f7491e08a9143274594f93ac85a9cadd6618a52e2bd5", - "c2689757125d50504151bdd8950c548efbfe492c64a863146a00d370d22bc3d0", - "97e5074228dcf2121c39565a88ec8a85f16789e5ed6e754a575cbe47967d078d", - "4948971834b6153290ddf7756456a7d1f56c0262cd0a08322a5ed99748473e8e", - "d8540c541469b5643a492fd0ccfed373257e1bcd3dfb0a79e536410808de97e2", - "ffc781ae09315820488bb10953aefff0cfa498a2cb01f424c29a705a8e7113d4", - "9caf5f44c71e1b30365ae35ed4bf0d7958ef874d2924ab8b39191dcbb751392b", - "3cf3fb985a7cbedae478d21e3e43898c2f77439797b53196176e4506fb17d085", - "17409522db01ceddbf64e056101e3b30bd28b6af872f471f910553d6c0c710eb", - "96a857a4665b482199e9ea023bc1423ee22f3e1e8eff3f301730613e340617ab", - "58a7ee70755ba3c470ea23a9e0f1ca4314f8694de645bc8f5533135cfb66e16d", - "17dd0348f4e482cd6db578a54fdfa132e56d03a919f42a60219a47bbbb18542e", - "ba95128ed63d3b31deab13d4d1b952766bd86c4badfaddfbf6bd591c1be15b87", - "f90b4c69c0ad5ec410c59817cac3cbe1ae8c812addbde5bf0eb875d1f714b216", - "237488034acb66cc15018845ebb5f72dc43591345e64b16fbd9c57a22c006c69", - "464189364868250e7d1296e494bbc9d44827e2e004f66da4a6fa6caa4e2b45f3", - "2111e208e3f8dbc5e840f72551e887b102ef5e9e65f9f1fd01bc5cc8ea1221dd", - "b3483f692011363abca43ae0eb8eb88cea6bc8e7b166b1936525feb8ae2208cb", - "7c1e0cead236e6dd117be8c88453d7c529a74f5506471bace49dcc4b41a8b333", - "74ef613ee2d2fac9e7ff9849a44f47e3deee3a6490c4e1d8a7af01b065bac86c", - "a817a41fefc8137452c23f5fb6ebe7f1544b437c0777f0922678103e3ab5f152", - "18e59a74331fc16b1f741545626816903f28630b50ac39eecb0926b808e680fc", - "9a40b562e4a588517cd1c1c2ea596499762b044ffa3bd82795f672624736b6a2", - "d7d428a567846c0b3df4668c81e00a8c203f6140c28118f36bf3dd87d2e39d1c", - "511df7386fbbd1b20451fe73dfb532d84339cf97043933cdd8e24ddd61cf07a2", - "d91e544256a2b7e54072cf142dbeef656ac81c49a9818c3067b9e3b3467a02fb", - "1dba24fccf3ea6abb67ba5d2d7036f2f568521805a6087982f65517b2f9efd5a", - "7166034f7931b8b81b4db24feff4af9e874c1b85831fc91b011b2abc6d483bd2", - "3458c5ca476afe035818bd86799b09fe7a93994a6020c8f1d519f5f03c40cbf7", - "2a6db8887fb8e85795174efd913215626d35ed1002d0aa55ea7d91bebc95017a", - "ad044d24b872296724e9412987b580f2209a7a74e609edc8cb2df13c04293794", - "f73ec25b659cd56eb2a5edc00141b7e49ad67c9573efd1c8bbf67bea4bd84f06", - "5859d8a7fe48b45ea6dd90544726f91b5787239139d0ac5d27abcac61e3d526e", - "5b2c4a9cd801d952a1ac24234fea5e9db9a7f0ab59f3a1aee2de514cb438c218", - "e4a3b92518980c0de1be0df54a39162df67ad0c307611a983e9a0fc809d6644f", - "b279854ae34b922739252e5aced5bbee1974195cfc80be149790d4b3caf3d5ae", - "79495256d1ffe1988d1e300185ed5b20b2d93d6fe32e23a86d0b8e1f39e9bbb2", - "1531a79e467275c43467da5ea06850f35b959a000ebac426f574fe674e41ee66", - "21f02c9dda32f225162edf258be27f1c77596180f41790c6186fdb1c836218d0", - "09fd2db38067b29f47434afe260a8acee39814aa8681dcdf22584c60b0deb8d8", - "fe5aff2809dd06d4dbe5e049464482db1db6cc4e53d1df0a7754d1c574670cc7", - "950e7df86946904ec1820e2d9fbcd166a923b21d1eeba3de39323dc6248ae0e5", - "827d29181e27023fb160f751797b1d94c328c4b120795f17f62a30276aa257fc", - "1e3b9c0e36d0d5f87739d668d67d6d9484cba66a669f8fd1a2b561d55e6ada90", - "534317ce266014dc1c08c38800617e393c884a7415a71af71ad8aa78c1e63d51", - "a996c651fba054619ba5cd9bb52385ad6e853e4c3b0ad055a3c9bdbe864ecdbd", - "1da148a392464243372873bac86f921be63a62a4c1b2cd18332f047b80dda426", - "ad7fff6b4e2e849ab89a9368714fbf5a2803499ed65b0042e98af6025cabd74e", - "91f491b42a252fd3d60fc60ff395efed9fe56e4bd7740fecd2e8940415c3fe30", - "09477ad2c4abc7cb5e0fe34fd45d57199ab8f0fbab4ff1f0004f02a941b88080", - "78987aaf0677e675caed053e7acd704715d3bca40bd1feff972cbba5c4aba58e", - "42bce985ed2eebe2b4cb31dd777e76bb875d76b7040264d0b8d7b7bfc5304505", - "b3db48e310291925a13501222f59963d56629f42fe3b2df87d081a417ddc32b1", - "e94ee3380c26c7c8d5086f6460372bc7e4f12db1f0dcedbf8e15582de63a36ab", - "103b4e7c2dad330cfe95581cb270fcacfd0f4115933e4caae792cf27ce68c825", - "c478cb8968460476f2babbc50ee813ad4d3d8e729816c71238180359a437cf38", - "1aff1605cc77dc6581e6fcc9f82c56bba8c1701d42ccba0b4de7fa67fa8e4957", - "897ccf3e0f72e564e55a3d295eb36d2d9c65aceb9a8708e18bdcb46b4d05b6de", - "9bf6150e2e65cf285571c14ee9db1fb4a9f1fe15337a3b01b9b136961b195c35", - "94e08c675d1592096e91ac731117d0ed2ca132b2be156eb992a60e86eb51d65a", - "03fa5117411d94cd9011075419e80fd9115a0632a66ecd775ea873bb8985557c", - "8e0006e5b33317abec172a2c89ad1553ce7f6fdf532fb253a4fce60952272f3f", - "9265eba00610c2bf2bc298e0bbc21a73ecacf9d3cc1778268f844604daab5d61", - "a9da6018c91b8272349c48dd5ed168e87c570f6dfea9f7ecbe9d83457a693a71", - "323639c6a3b9ac7f99471b3646d606e5d3ac8edc4e4c4a62c787f97818d57b3a", - "2ef83e8c5fa7e0b7a3af2096547e62a2e71b04f6ef60cfbc6bb3760db92caa95", - "86ac669f861be2b29d90aca715d4bc7e143158b0faf9215320f8033096fca44c", - "9e2825a99a46e0bee15d3306bea2b66a1d135a8e5416585d69676f15f0b8e2b6", - "2e67f3aa211b2c78c004168a156e6470cfcb43b3994c86e34229f6c853da52d4", - "ce3dd6902631c9efe9b278f9f41ed2a03fea03c6330c19692b91ab8aab0e513c", - "06748b5fd5665edeafa6041207720b9bbaa92e45d322ed9341953e254892ce57", - "aff0895f6d07e4aef52278ea44009e5b23f4780bd48a1ea2238a7053a551e839", - "99e8ad1a1382c31656ce551a1b0ae6fff4d0d75bfbf5a41defc7af53d3f1abce", - "7241a1947af48d2290e2f8fb76e15473153da46a9af11302e431daa0211ac244", - "b222a4e9bbc078da99c6ffa6887816a812eb1676aef26618c39d361f0addca39", - "8903e47f134dc7be0dbdd3ebb8a09b11cae7d5549f74e905e26edbb878117de8", - "e84135ebcbb65ffddb23b00454c180506f0fc7970df9aaf811e27f1ce76dc408", - "c94bba3a01338cdc388b528d24361e8c0eead07d223268baa2a6e1412ad52815", - "2e135625903eaa12c90f1d21df4b20a1202da1443bf8614aafc237cbdcc51385", - "a82936e6f4d0f6e6a3c0149941c4adfe44fa184b373cc58baa8b6ff671447d59", - "2f97ae9411a23397007f5a54f69b928c92a2f97715cd365f1750b052af204e25", - "a68389b44e89a9141d1a6e6e4c59447f01440d430e1cc7af9de7c48bea6a1ea0", - "267a54436936132b06b922037a7674154c52084e7f04b187c6b9d159bee80a12", - "bd0c6a7f6c0209918cbb81777126a6d95e9a880125b1d967bd532b3fb8293b97", - "497204215736e9b9486455e59c4f17fe0ec844e3bcb88e8760550cb5aa611eea", - "5da3b8004af21ee8d75486e637c85e999a1dd017fe7d1007c858d350ad814301", - "fd941ca5f5931b964cf4ac5120bf5381b3f26d98d39eba66d248bb364adea3b1", - "8fea7cdbb0b7b6da629db9efcd8ac17c2ebd70e8fa54d5ebfaf25527cd3caddc", - "65f1bcfd8c38df84a410678a46b71ad031e79ba69c56ddcc7de866fdf00b6a7e", - "288b844a496c3a1a42cb63c3efad109357749d2e699ac5325e53c385a089a910", - "315003d9db81e68ca9492fb8bc36be498b4551e079a390bd09c66e354c97b17e", - "44c39932fec27e22131ca23018464965167392323b9e81860461944f62d3fa38", - "d95236fb30903cd29bb962311a7bfbc9ce0b84c42c45fa66d1adeb8638f31730", - "acbfcdc45acbfda0386a5ded7728327dd27199ed43b01fa96623af42ed908432", - "9f264e23195e2024bc98f8278e21cb50d41cd575db0a240c03e2cefcdea663b4", - "b8c03a03e07ffd73fae2efcce2d3256a42d8960bd15db3b1a000110cded7875a", - "743e5cd3dd598ea4671b91b09da120cde0e5a42da0491a2490d787530688a9ee", - "d36f991886db9ea543c72344c58e377629a6bf3ca2f6de93fe8abd45cf350461", - "688606ca2a8fca2e6a435c4f017539f7c8163f15cb8853e0b588b8a3863ee28f", - "9dd85f17a90e2d5627f2658e505fcfcecc394fcea49b24f429395486179e659e", - "e3f559904233a33d6125c654558e7a8b1d32a6ac3c366450517653256fd493c2", - "98fc030e75f4942d1e30e3ff8fd5d766a173fbe24a9d3628f4fb1de7d44d4c3e", - "8fd141a32b2cca929257704643fea882a07e5b0fd12d2b713aa5b1654f95efc4", - "318013d35a7d2b9b701b18eefb1d9b5d20188c2fc887e91703f7afe1de52b849", - "e5dbad7dee08ef7e14e8c4d1148039bc2cdd8ab43d166a11a1ea78fecf49b656", - "f177ce870e7b7b1185d5df698ac7fc73d1b736d4f5edc5b9ac16089ece2db6a7", - "7b8849f5048fd89bdad83d728d90b6eccc50f0a6d9ab8ee51ccaecc1512e299f", - "d643b7c6e866e8e3997405cff8e6022cfa8300e371575c6a84f6d86c458db8ba", - "0fcc0b8e86185aa5224cd319a4eaf6d338a7e48d8fc04c78a0699303adbecbaf", - "c7f0a0e1a673271f9ead930151cbf0b8edb34ddcaa6dd52613a5ef77a81f678e", - "ef703bd5b9328d773cbe647e76720de3450dc7cd6daa11eb71a4f07f4597de86", - "cacf2fc0dd00b5167bc8d1bde8366d67deea8a2e7940cf1dad54d68eac5a4e8f", - "47d1e2a9f7543384369d34a6442c87cb56c611b281f5b1f291368f4e8706ef24", - "7ac9b2d1781c8afa499c8d906a010f612a99a61262903bc7bead474efedce95a", - "7188a15e1ba21ac87d6fb9756176d966187ba98f9b3166d1507e428864c394af", - "3b43eb431acafe7b5870bed832aa4b95f34e138b86b75b57ba4666dcf29b486b", - "b11b5b01cba111a012b799b827770a7662cf784561dd85125d6a3ddbd175fe01", - "f34b8aa58e99382e214bf9e5b3fa2a80ce551ab3a984f3f39ef7acd0dd4bdc44", - "b7d7f49c796cee280a4f575e79e4aa68dc06f3e9081c37e985d3784ee39ede84", - "bd6823dc9a7a6821c6f9dcbd44e9a3f606b16fb3bce78daf69affaae36b48127", - "0c72abe604ce14b090039cca4b83a6b86e046088a92708dd409b8451942108b0", - "788b7cd45b83771f8e06fb6406a7e07c8988184cfc73fa23e2caa6ae7ac2c6c1", - "eadf181f61202ba4192adabc074158170046ca113b4432b754b46deeff7dae31", - "46ab2be7931c68286f29b6a61994f401135a39ccb9e8fdafcad8ba30cfe527f6", - "114cc9b82759f44b83642aa29ff0e7f67c66b66801ba5ef40e7500fa3c6d2ea1", - "af228383e1821675b642ebf81e59bf9e535b9632a493705f80fe5154d8d4fddf", - "a738b22d2149cf6c6a529d01e7daaf43dcfffd69be8445fdd09f4206cda116dc", - "e4e983b913051198d103e838c32ed3b63a81226753ccfb94df8f140276992d7c", - "2c1b897ad50dd3200ed19d167728fb78d92f396ae95d7fb9f385b6ed15b2648b", - "fba1ad39802515fc4af1e1c233add7c88b794dfe53911a2a8bd3f932950c8e1c", - "3f03a7fce5b854fe12f91ffd76f3a33cad3dd132cce6f7d17cbec347dcef81e3", - "77b031d40358a2cd574e9cd3c9c7238e6289b718b1d0a0c0fec5479a66ed4214", - "636c6e1c22ef617f324306cd3a90b28d3290f2186790fde8b2480df8e598d4f8", - "a2d4c7d4bd46a7bd5bc9f0f011e48bafb6b9a41e6aea719b7f89930e9671b90a", - "4a2a96e31d486d7920a4d6991942b4c33af3bd4598a0d9112f0fd53189017174", - "b58b03681f290f0ae0a29cd7136178b3096edd539f36cd0a133a83c20c326574", - "80c9b53a428546b346a5550effbaac7d0262b9cce67c7bc8ecd9139af49be3ce", - "c5e5ac8d0a29ece95f58205283562c6f2f15f61ea291feaadb6d9859c21c0b2e", - "65b13b95cc3acf97c63c19a087cfd1357c644e069c96de41df9c076b894fe1d4", - "571388dda6f06a77cf5bab3ad3846cfc4b18d0b79cea673ac137c75018581b1d", - "1a3867278a7cbdf86651620ed71282d651a910ba4fbdec5a44dda17c4c9159dc", - "61fa2abb9c15885871fe065cdf0a952ef0f6f95350398e7acbf396b4092bc87f", - "4bfa3e5e95ff914528f81341c282fe7cbdb24546aa078f6d281764aaab8c2fc2", - "f619ad65366a8e3d2c4326e15367e83ca98e9c573886ac8e3ce4e6090c100efd", - "fe15e2d7977da41a13b6ed3c3f8af501db546d074fac371ec0240969ecfd253b", - "1306e65833d6c1d7e7b1b7797d0ab85e31637ee07d768407b1800c4c8cecb32f", - "a0e14f8fb547d948c1892e6cb55c88d9454f3be182755244fb11be78e88fc43d", - "981b25123981abc842488fce12df35d5671b6f1b7f564b5758042627cecced80", - "8d196c09972bd126f8988495a95ff08fc61e9e6d35e3873a718414b8c6ac7873", - "36fd8d50b52cd27e15a05c8cce5a8ede6a0988e3582a90201f10272b49590067", - "fe91fb295c58fc2e9b6128eec8952a931cb857c4d4df95290c30d5782bbe367c", - "7add749551620ef3e3b4da13edafadaba10fe08c9924532c5ca4f1a653164b00", - "d47f525e1444e122f2684811f11c5df7c103c95dd5dff74bbaec3cd0d483592b", - "2af258a5c3afe86b384f20e2a36d19a9e923fc8c831b1aacb144291360148f43", - "45d284e36c94488129072b094ef0d0fec4b18ffbe8b4cb6217b5824585b786f5", - "623af209093d7829ebef700445211c0264752185d8f9e5e4a7161e9ab785482c", - "3083b01cd3d7944c6acc59824ed8c452b4167cd8a387ab2a12d2588d2fac53b0", - "976923af4699302fb8d81d19b8472ac0b812853a66057c46f329a5a7f5e64fa3", - "1c865fbfd47197c31e5cbebcfd212d6fc3186e7efa894af57a92954382630b60", - "aac47a29fca0b84856b3f18c79c00da64136f07712f0e7e57ed12dfbf9208b6d", - "1def7a917ef304a866167c7268cd2785b81dd6d553c8a8b4c8fc6b4802f9c802", - "ba527800fae3239326d3628e14da547a2ecaddd70579196fdefd451c028cfe4c", - "1335290c3b0a6aadb942db72ab9477ad7d6775b9e09fbe1934c74e027ba8d45b", - "0d7d610354e3b91966610915d0b66f274995e3e88cb3a6f39769bbbd2fc4f746", - "007de8568aabb0728ad6b9c2d1b07d86a528cd96d7946730d0e44c0b38a551f8", - "7d03a3009b9eeea0b692b76c6869c9509e9aede19472a302a0b037a9ed4f2277", - "a8c0b79f6dc08423fa4f710bc356a09656663f4adf2507981575de64f1f46a28", - "7fe9f06d81f978e2f7df60e50b52c70aa29411cdcbe407997919cb06b5c4ac3a", - "a5d26a58cf1b0710018cdbb74506698f6599b24a798f60adcc3eca99ff25fadf", - "0c4693722197f47e991fb8fd1908bb34826f9827346b404d2cbd2d44e8f1d3b0", - "948eab949916db911d688896cd997693d5338a780757327b92dcdcd897a9268a", - "5fcaddb84f6e742c27dedcf9a2a3cf2fb50c8a401df482a8de704f52762dd028", - "75b8de9c44713cc3046b4a11c1b037de885e5a95d7580a372c3d1d55fe5424f7", - "54e55e19d8261823a5d2efc8e2617186a46a804418b7b071c82a0688327bdebd", - "745a069b9e5553f82bd7f621e6754182da801058414b4ae9b53d41b602b4f284", - "5b79798b2ad8d87d7843d82d1479e35e6b88420213e9d1993c008c2f2d9b5283", - "c3c64e9fdf684e337adeef0f1a90963aaa9cc630cb81554f2da6cd26de1bd1c4", - "7bcb28dedc2231858bc5d5284add047c45210ffab57d7a8e9af92358b116cb59", - "a2079f45c3905dbb2c3ac249431a4306c8f4f7be14cf39912d67c9937b05732f", - "c5b8cb624e094e91acf8a43e754909ad9af933fbaf88864f59d8606fc105db7a", - "b124152a2835af4d08cde3ca979fbe033d8670bde6b4f8772df67bd2b55c7d8f", - "22709530ed8241ede8529fa5203b9a0a69d0e19090d6871c31052d3670a0b2f2", - "ecf6bdb364399843860d153c8797f083726ead8190ce92ebe3e3321ce7f0b720", - "2f6f4b3d86b58a7d883434be614329d510cc456712616ba65bb70d941e2197db", - "b7422aac89e01c8a360858f849c8efbef894a034798c7e87d338abffca1521d3", - "63cffcad5c4316f6457fa3f162673d26e5ba8a6e099cabb381f98b7d96d591a1", - "6ae0e6d28b0a059b6f940a06d56bd361be4d5d1f3fd0ca8cb31a4e4c52441c4d", - "8a840a2eb76ea784e2db460ac2359186833eb97ed39251a442e03ddfec59880d", - "95628ff9c8e7c59b631d0c6b242cfd04bb08725dc31b3c493bb8128d12705e27", - "550b7795c121bb1fb2874ce6536dc96f202296031e541ec63035f20007ab52d7", - "eec6c4b46ebcf8c765430213af559fe61c3a12feb53ebfb26a234500ee50022d", - "502c2a14565a3103dfd3c15a9fa5be4a06a6e06c8fb9a7a574d88b75cd6936e5", - "db4bcf4dd7c481839b5a79a260220008bfa7cb35f4d8e8786414175d44ffc409", - "67a4f6ea73f7c6dc1ace9460db3ae4db42d46d23d119c3fc7e75759a7375f1c1", - "82bfffcf704aba5eea783d51fb98137dbbf6d4758332055e12bdfe5f7125561a", - "92d032ddcaf3d30dcd9d4470f1059a1ee172017d3401a9cdd3375e9d6c5f55f0", - "2a1e8e9b2929265ad51b4a9337b853c7d1ab3a9510b2778ad95c4bee81f84f2f", - "d1877086d778ef99ea6b9f07c8d1a8ca958e49eec9f49abc9345ae5b7abe3978", - "8b92762518bb043f60ce7ac6f4bb8113de10dc59ff04b3b8852c79d207d807ee", - "99ab537bae842866c95e3ca4fbf5aa6de74ff490036df33ccb6ced455bcf03f6", - "a3c70aa4604a82ba484fe7c8421ec95cd1957eda9baf2a7b5fb097ae2b3f612a", - "55e03214d37c6b45f81e2a2618979bf892100d1be2a2360fd7c40727e7186a5c", - "e0fff18bb58dca1e3fab196c3fdc4be84e9ac2a4d2829c4de5e433731df5ceda", - "fae9e25be9e7f035756ee9fed30fe8a55524bf6aab3aaba10cdad3288b06e412", - "db65ec330a314686ebdd34e0e6e74f735f67ad36fbe0a1c807f3b1d5a5faf1e0", - "6f313008e0417a15f3f2b4ccbb1a4be52446708ddbcf7e2196886ebf7cba8f06", - "39a81e550191fdd05ee3abf484d69941395166dd0d8c2b46cf4af48787bbaeca", - "0d05bb9ccb9aded6a017f8a7b3540568d5a35a847bee5c0304d9e2edc8b2c909", - "62e303d9cb6ac3c2a77da13012972ebf8f94077b434b865c991d9d9e607564eb", - "2e21c7dfa164b78f865f82cb614f53e236d1012de4a613fd5e69faa04b009a59", - "d928c81e14f9e4d0862d977ed0b49a17a58f32715fa84dcb6952ade77fdcc74e", - "895bb48e4d8375e11e25c8d04a371ba30983409a122346ce74f9456615441923", - "22788a7dadc9c4928417c7fab086997c6e505a0c10389f113c917fb029c77a30", - "d4563587173643e019f569702638fb338824551a1e6d44bfd7c267c988a14518", - "161eaf6292d4be0ee1190b9a5588b07bd915861b4a898300746f069d1dc85fff", - "0408df2ed0d2eab537789e3ba24a5b37e7255ea8288e6e37111fe3a23456048f", - "808bc002b2061b4986f978d6c532d86250f9fada2aea4c56bf3b15ec96d8a138", - "317df4b0c685c29ba70398e0ff9e9ec1d4bc51740bb01bddf858555b96bf8cd6", - "3d06f04f3bc8ce841df76611eef8ae61a59079ba2b6d9ee354636928337a6f9f", - "5ca2b893b733624a82231c5e9f034ab40c3c75113f9007e2a4a82f56cdb57699", - "23dcb8452dda6a558e6a572be3af09c217c6b258f903e7f00266bf49ce39c07b", - "508cb6c2f0877f4749e103d4cf165d907e01885b5f9747893d312399061d9ac0", - "605a9652026cefe6282ee01355d7e566bf7e416414997695d1f9a5085f144605", - "d8f70a99bd05b9071bd1134561985c8a7ff1e7f033705c8768eeb422c80091e9", - "c5d09a41ec244717c926c00e73e2913241729a7cd99af27c4a13cabe39edea95", - "c68fa75e3c74cdbb0af6e16b873d59c07a0bc33226924ce70a04a93e7e69a9d9", - "c93a3c0fd9dd130584ca8703db4b22be6b9b02434da24ee23ec63cd8a2982f60", - "1a61d15754b7581b638df6e9f944a5c69de0351b275d8ea5209bab33f2964608", - "a7eed410cac5f729347be3baf8454f3c01c8be190d7abf722f18b2b6cecf4cde", - "bfd9ea44f78c3fed457d7dc6a5cccf78435301eece7bf4d2f9d0d9a9278d073d", - "4d7abe0b5a54f22dfa87bf2af8eed3b10c1e6b882b60455af2ddc4be869bce39", - "1dae8d89feadf158ec60d9a004f66b0da782f9f09f601d18c3a0faf544fdafb9", - "2e92f56e42c5947bf530986ee1524b457e620aba0305ae81199a58892e5cd248", - "a3c177befd0d47733450481e52566e7d93c363559e6e24c1c6ffd845516c78b2", - "72584776c0157f8da07f06f941203340b7de1679d4a2c1c4253e23fb9f7e592d", - "76ed20050af41a55327bdd1c94cbf1616764ba5ff7f15ff123fa0a5325d88b55", - "f08e4d29bbe2016f5376e1679a3f07b31f94af787fb3327bc0e5a3971025c847", - "48d8456aee525278ec9a239bed04e7173322ae40303b15301766e714ebba92bb", - "3a106a8e2f848aca84c13e9a0ae731a67f01507d69da26f11d85459b6aab8fd7", - "7cacd4dab8313df1c30925bb806f0b60e192e87cc5663d93f91ce7f0abc68a0a", - "bf3c8c02ba60a0b93e12f4731e51d55d5a5ccacbae3b46759d2999d8e533db2c", - "7f2bd6150900d753360792110a6f6c5f3a038a8226802fb5eae991c0dccfa4c6", - "3c6c4e8ef2cf216bae70396741e27cb6279b61badc7d1df2da3c8b227752c79d", - "2ec174523b394fd4ac0047cc85cd94b81a2589658380238f29c985c2ea4270b9", - "5ec7d942a78a312d46a01708f6d29785539af26e5696b115f789985f6af4ade2", - "8756507238e3d2ede81aa39d53046591f31f175c953623fa433f736969b9ed47", - "00fe63e2764d40612bd792d32f4be8353e72c386793ade5364945b52489e9c5c", - "309412b06a9a1e382c0d0e9677f4e47d899abc6fdec16f45208ce720f2f1e515", - "ce4a0c482a1cd9b853f158b8b48be08f2405992c62f3843bdc1279eefd19740c", - "505cd8dc51ffb79429bbb4b2a4acab9ada98a3e1a40bb33aa21e50374d1908cc", - "afc7e28f845cfe1c6324694c0099b8093e9fc09c17e654abb02dccd5bc38770c", - "a8336f559b36464e9990f94e615ce8c43791a989fa68d30faa84295d761c7654", - "ad67193b19ba28a02bea7ad56f71e7b472994e6826b7e0a60523125d4db9e6c9", - "ca6af878c41da9c1fbc04cae0f107c829609659e87068fa7534f4a332dd9fec1", - "3937ffc0838f6e370d28b5e19176f1affbe1715c510eb9b3812c7dde28e8415b", - "a7fb04831106033e01bf945890917391c09a3512d451040469750eebfe8b79ea", - "4348536307b691b3819cfb36f64daeee772aa46fb7cbfe857e83a71e933814ff", - "d9109ed199648512e4ee5821949efcdfa88d844963c7a367ac0427e038cb8094", - "2c8610c363653befe838ea29229d394f77cfb1a2c4903efc9407083473b51ec7", - "e36959dd249ec9baf6787063d7a0b86f676ffc4c80c1e4a5b80ede6214a41717", - "3014b9f95879a49c109934a6aa7f9e767f3120034885087095acfbf3e0b53a02", - "a9db66d006ca9c0414c08e1119f64dadb7a980e841d37c4f09c3470a8d61c510", - "d0a49259cf412c88f64cc7e2c22d8dec02ecccc723791de5e3c95d473734d54c", - "9808974e5e2b930fb7ac3606886ec7efa16549b9eccc679a78bc77048706d4dd", - "7965537936dee747b6d6eb1030fdeee0e870d50a24caefa94a0be75a02923717", - "aab50e3e5ca117a2797b9862b15f405fae84d83d12783efc312d5838c5358fb9", - "34c224f85983b5019948e6921b200b19538d3f721d3aec86380ab50f414e154e", - "a527a7e6d239f5f2a0bafa001032508f4b953d086ce7f439051094e7ce1cda8a", - "eb81ea829a789dad8bd10cfec4ab0dc28946766fe3103ac5856c94354f93ba57", - "1fb2ce0169aba9afba102d72d4ac4cee84b8e13d9cd4bc788b21776b9e9c1c85", - "ad56ff776bf884c315c1a886267d9ae36fd4c6075c70145cb624d0561dfd6811", - "fdff859e915cdd6f0242d169c6a115b178859f48c89ae7bdbb07d6bdcc796a72", - "e80dc4be3d9a8ecbc24825cf0e622274b4026e61b057e575d77409992b347a17", - "2cae266476e0c3290c3fb10f58c3dc648b6107ee16f1f32a46fedf57af2f0ddf", - "dd07d4b99ff4a8da50c2ac829ea892dc2b2a04838259f508026473210b88b27b", - "05614b4722189c582c8b3b462e4bf6d78c843f347e222b3d0430f938e2ffde54", - "30e7963528c0f297e754c263f37d01526887ff268ad51204ddf7c262cd3694e5", - "5c1a1304039a3b91ffcdcb44f141473bb557e8cc95ffd8087141fe966d594ca4", - "4c263e53a6a86ca1b8515beb8a13926ad2de3fcc544adb5e9f56acfd39b64229", - "36b6780a96784709bb0a194879b073c6ab4c00badcd07e6cdc97b1c0cb9ca807", - "62378846b39ea7543caac17caca25982b5337408140e45c95954457a0ce68ed4", - "bb3e4db3fc3fd16dd2a26e1ab02d19544a12221ee1db19f10145575cc161c34f", - "f731d90c43c0ca5df9627a83c9aec512204174864fa2b294fc12d85c3509d56a", - "e40c331abfbab09b3f339b8948c3cd53383516b7986619f6fc570d9c19b370b1", - "fdf1a52b7676625c3660304aed1ffc77ed63b0062988a0c4fced4d697c9e53e1", - "c1bfbeac9e65b928f074f2ceabfcc159a60fe1961a7507a6aaa80de1dcf921f7", - "d38b04b8938bd298ea067de2abe9c381afd3ea121de170a7c2f2646accf734e1", - "4d308c84261ee906d58e12a09c325f07457caacc22a9d1a3ff4dcd6a459543fc", - "a04ab3d7bd930cf95a79ef8f105e1ad60fa765cad9a6585011f355aec553e1ac", - "10590b94798b8412f40e28bb3610c55e98be92b75901f164604f24a4e4989882", - "cafe0edace10177e3d6d07b282867cda1ab407013b6acd3428f71f7c4b14825e", - "beb44a4542e074a19fc5a72842e58a7f7872378b7a57366fc9cb394c6f994978", - "d7bdd68297520098350bf50eb71a811410caace5275eccaad7e43a33dc767628", - "c5edf989939a952843d8ccbf1bd41bf7f1109e05a0cafa1b46162690b501b9d0", - "bcad83a30f9b74df4d5f12bd420e6e16cc0081a58be0ce81423f8657964c503c", - "19662ec1569e3a0bc687ac1aa8910ee505e4125bace36d96697ae70186f985a7", - "0505d0c7ba9724c97a2d79259b123e3f30a71fb7b138b8c060910230c86052d8", - "fe6e7c731555445d9a95a2761729045cc0132d36be0b7102f3a7a4c638c97975", - "17743fae1395d6de37883cd5c167247c6efa19cbb3c680ebac14f25b4aff81ff", - "9a4cf102c217080262aa22102048fa40d1bf8a36cbb55868b8d37ddd28ed3594", - "62ceb6e122bd0e3bee061cb7cdd675fad7d9a86732c40d4c193d016f3fdbb192", - "2aa07c8e65ddc6363757b7bceb95b39a3228c9820467d5f3e82720db5bf31b5e", - "374de615bd3a9d03c2650e1d846072ef8162e297405fcaf041d828b8792f6301", - "39e0aa1809a228e8f6476300976138e783aba8ff239f1f095729b1ede3b4626a", - "04151373209cf6b48fc5bc1260ebd592d1a7839a8a4fa5da29ef68a4a7a7393c", - "7b04799275176b574a4392c8aa81d95e8f67a2bb7de5b6aa03f85c319f09ef97", - "fe18f5a76ce396bef32cc4dec5a8bd4e694f6d3ba2b2abb76bdf167fd65f28db", - "73790d3d987dad0084621047cea1a577491e6169ecf0b585fdd5dc7548b5dd5e", - "24c9240cf4e06c9257f507da734ab155b1cfea94fb9e005da170c961c7087279", - "1f497723b64ce34eccc0aedd653e86fa7f64073b8d33757224ae1bb87cf78bcd", - "3dcfce0a6134193e74c8703889e5e11a4aba66f1735c05cf0e5ec34542d77799", - "1a721aab45f1e37d2664165e11472bdb2167442407e41f8b109920562194ef49", - "2121b9396653c24a7252e80398e9bfaff670c9d8ffea568a8f68d145b08911c4", - "44c43752508eeb398f6077d2e970ea7fbd12dd34398e2b6bbee0694503b26680", - "4612653c67eadd1f7529384bf09f1cd653cdc716243112ee222233d3da8916c1", - "2cbfb3343788f2f254b838d969fc9fba35b4becbbb10ac4275ecd31734004e8d", - "6d7c3becb1bc973c08e724238a45ecd63b43407c3f5194a6411775da8813c317", - "a195c9ea793dba855176937289d65e286874f4efe5907341980a997897167c82", - "308536b7b48a6cf68d389ec0bb520309f8c6e381614938b876cc98bb6ed2b5bd", - "62322863b343e7a0b5407103e9148afb850846218c1b4f776cb85d2c3479ece4", - "aac797c6a60038790d7b0ee246e8fc9ef148174b3981a0dbf75a94f3ad55a42a", - "c370a19bd359f382e7bfaaaf5a03e57d66aa14cc45c0596bccae4f3e92f178ae", - "0325f0bd3c45b28ccadade07b77b27ae47eb3e9ecc85e953a9effc4af894b79a", - "880e16a7ce0eff45fed5bd6c98752d36e4fdbef94cb97b2dae35b877f62ba9b9", - "0963072f54ea4ec3451aa7e1c593cbc13caaba1e35dd541450a37a73749efc02", - "6e7d71cf922c4414e8459294f1dfcd9d20bd2388b772b71abdb0d57868c26438", - "739ad9cbe9323291282d7595d1d4f7891347c01c8644b32fb8ab37aced5a987a", - "446cc3ae3bebbec67a5d6b6aa16c00b3a5b6f93af2bff0401f2c9422a09f5876", - "eddc45f65ee5477c8cfdb9fc0046b30988a648bb1e868abd30c5371dc711d8cb", - "21cf650a2de90620fc87b607ffa91fed77c2a124bd6ea6b66d763870768e8213", - "062f00e686919dee2c883914c8227c8dd7c226f5f7f1b82939cee14f62e58340", - "def141b5682f4e0b7f3c1a4d20e0ffbcb5a88e673cb081094e53575bfc0167de", - "ccd471e64bde23fb5b78eb237707164f5d2a39e7ed901c491417a45d69e57c51", - "68856c731790c5353d53ba44426a0050b7c91750da76ad0a0673cee5da616fe4", - "a94ae9dd564d7779d0b92f319dd967d94e4dc18faba2e23bd50d9e7ac67d4434", - "8403853a55c2b544540e8a78ae12fb8a6bbe27d78a3df986a8b9f85f4b5f6c7d", - "1e1d3661c5cb153fdf4f78d50d4d6c19ecbba1e7173192567be50039de6e3bad", - "de830f348b1852dbdffcd03e665fdc487a24d13a7c45b75875bdd0b3d3380b89", - "596e24f4747c8a077d68d0c8eeece395f3e05edb99ab211b15d1f18d99212830", - "25a20e28eb74f8dd946a8d4fc680e4890b2c991780a662d2c11654db068196b5", - "f5c8d85a840d715728fabc058e7b1526a224f1878ff7bc59c363b7b52de81a0f", - "53d0264dcd28a7c54088e8c1d2568271eda3571937dda89903cd1b1580cd6517", - "1fe69851bc7a616c9a9b5549270b1267218eac635b618c1473d56c892bf5bbd5", - "ca002de15fabb00ee59afe444b0950745b2b67942846c732354ce2172d4a5888", - "eeba29e74b9cd16a9f0bd9bb54be9755105c8c667075dae68fb99813aa7e1f1c", - "f2e5cc903e91beba49e9b1af5009bb23ea88d7b781a517d954227298c92c3af3", - "c32c326202a853d8172ab99636cb3c0f67f152983091dfc07ed89004971a18d9", - "cc9a291543bfcd8abed63d51d73c9c2542b7e88bf1255c9300ddcda79e615da0", - "4b1dd7343a0d32bfe0e14fe02df575029cea8d8b37a184632471b8791d87df29", - "c2a4daf3302c55f9d087a9e291c09fa6825039fa15a02f2c885e3dadaec21c2c", - "d3c402a1376e77022e40a94fbd160439d29893dfe995f4f3f2a5d060646d4492", - "0b8b47c62af604c1b3e422b004acd530ef03304499235f1a31be155083e1a056", - "ed48626954398799522b090ff073ce86e4ba335a2e8b2924fde2d9ca2715f33d", - "62493954ea9df0bce2b44dcac59da822ffeee27dc93f8dcf76e009f1f93aadf2", - "0ee014ff9ff75461055b3e18dc2c9557867c2d86ffba241b248d38914ccc21e3", - "7acc5b770b1e6c41b5c9b5e72097bfdcd9ff81a9e4f3ed6cf92df639869b7b28", - "598bd245ed1db97b166a07f68b6a3e6ddbb3a228b36ce5d99cdd60d380ac68ad", - "7942bb08956a9050cbf85543d9c38b2106a149eca68464b0571bbedc01ed7e56", - "a5fd02151681bce3c5c469e0bdc2fd7f26a6cb23fd1e6d55fb31127793f43680", - "35826287b4d03ed7711e0bbc8ec086d1e1867f5a7523ad43f892637028b09a73", - "c9bc69e9aabff5b5f3522eb4468d0d85c9c58101d98ca44f61e0afc15e17da39", - "2e320d99b660c403de77e693e6735b2e9e23211ec49abc528aaab8c1e4ff13f1", - "7f2af7a38d754b6738e429bad8a8340a2f283523e4cd7bbb9da1524a561e9964", - "3e48f73e06dff92a4f7ffd5cb42efb108511a5b17fcc4ac4ff5b7e92d97bc092", - "3bf43a4f141b31f0d2aa1afcb31a3aee504e6cb57849c4dfc454874499c96e09", - "2f7ddd40a4094171ca3149d36e356e609d7dcac395d005079624a7bf1ace6ba0", - "0e2ad8434d01efdc3feb933a07b720292448f4787f493d18ae6a595de0e29cef", - "054fc5b189af50892b85e8bae49c407be8ecb82c5d156c446c08128831fbcd9b", - "4cf97a3e5db71691c97e0ed916f0fb982211c717c276840ffa6c5b271fcec3f5", - "a2ad89b2c80d9769dacbef0aef06b2f5a6ecf87366aca76524c15251338a6e3d", - "1422bd80edf358a603d46ff52af5ab9f2cce596c7c8b2005323e6697e6fe0343", - "314e7f794f0cbf22dc4ade0ffa9bae90c19f6b09777d8fe43a6726c8b36607ee", - "eb95878c00238c13ee6af5cd55da75bd89ae4d64050502ad0ddb858e656f18f5", - "3346181d404f27485b191d902de15364004a2f8c8950145fff51430985fc1b5a", - "f674d76c4506e5aeb4cf96b2b9b07b7629b9168af1c33bec642ead2f0d29836f", - "3f86075375b034556ed43b916ff35af5cc5c06d8284d57d200209600d43f9106", - "f7a7309febaded6f154681988fa62ca00f9889c32114c07189b62119e9c191a1", - "c9f3bf940492c0783f9e87907f0d8cde8922a46366f7d77a83faf2cbd48e17e7", - "86f43e980726b39b8d17d4f098a22e33f3d9fb59792bc93b26973316ffc3c128", - "f63c1adb64c58c97fda7344cdc8e61b2a4f9ec71faee510cb7b1a0dccbebfa62", - "e29774d66990dff16ded5bb8cb17c56cdeab2080ca701969fd7feb7e98845c58", - "b74aa17d9b8993b269fcaa4ebc1337bccdf4c8e4712adbf599295d4a230ecf66", - "ce9f14acdb5e0ece3174fd4696f5a799af43015ae72e1ad740e9c8ff040ad0b1", - "999a3bcd956b95ff48de5bc8716f148292bbeb0e53c09631598f6ab601cbc32b", - "0ea5f41b9490e2266a8e30d1c057a5cbbc916a918b2b2e75cc0b8e213368fbf7", - "6387d0235cbcde889b6143017eedf144cd2f4fe3444aa47284e2c213d5d7599b", - "dad46b87df56a86aa5a288b9df15b75cf1fae3db11916b299464418888eb4ef5", - "4d13791041441c9d0261cb139272d3e02397cb4028dabd3c9399513b379c0d36", - "8446c30f4cc5cf8bb50b9e3679fb21846071d0d1c3798bbcff2c6c2e4e3444bc", - "94c09035937177bdaaec983be48757812eec6bedb45d7ddb433d6e8655ca73ff", - "02fd03e0d1d12569b131708a00a9c435ab5a2b8efa749f8c0baa2a54bad5325d", - "82c2f68f745c879888dd1c93762116e869647e14ba289f1404713386b10ccee4", - "ea691d8b475dc702f70dd2f785ee202dd86226de9206e180ff6a6aac49bab0ff", - "05502df6361e068afedd73bbbd9335692148ff76ff97597934ce822b6740348a", - "214d76fa522ab6908221d5d58409721c0b67e5c56e4e27bec69256d6a8bf13fb", - "9efcea834e02cb71f8cb703155724acdb153efb388903681141094045bdccc84", - "a271c4668a260037a7a7ce81529e57458c9ac2c307be2145816f6517a106f65c", - "23979eb5f492a88564ec8b0d2a1c3dad213eea3922d17d56b7cf4b9f733b55a2", - "4652453acd776db67bce3c13193deed06b7865c4ae37e865631c56160dd191e6", - "c25caf62825e6cd5ff51a535441b1788d2d2a92aa64ed33cb99d2de0440dfa42", - "987dd0f0e0bf2dd27661b00005c68766c7a7d6b2a7839044338d8b3b7a02db86", - "6d08de36d0c29a6d8f87b11fec13eed05245dde5b97cbd206fff7dc20aa8cfc2", - "feb8ac472e7ad954bb3b64351c8f12019d9e331c4c77664b554f30ef7798a994", - "7ac3637f1fe48da2e834043195b82b33ffdb3ba31fc9929136f09e1bf3dd4689", - "237d516482d6ccc5e2a847eb8ca7dc0519c1ff01bea226e4db11318ce8de3a4a", - "f6e1cac05152fc48ea536244688436be6049aa7ad7c8b090bc31e7a33373bca6", - "f7e7088f49216d0bc6486dd8a17c6b71be8a6a7a0255362b851ab5cb94ddf652", - "7635e786dc2cd2153f4f3093182c5b3379a30a779c67366087c23d91c0bf0d56", - "184fe6b50dd63fc2a2fd99a594f5036243ce6077e1b93a9d99ce2fbcc5bd9df8", - "d33e0e0c0f13bafc68ebea7916d6758de537fa2051a62c1853a125e6ae4a1b13", - "41846b7e238bb8927fe1ef2b426051dc9f7ce94eef7ea783916fb020b5390bf5", - "487677f543a5b1b341f66a5631686a7c283ef3902539f53597988bb5a85d0bab", - "f1a93fcda7767e8e4eda3d27e119c944256057427b8676dc790c3b16fb90b095", - "384ced6586ee0ef13627afee60ce694e6422a485738ccfeb8a292a341e30b156", - "e121a52fb0d48e97eb4baac68aa147a557b8421ab0d00b53c94bfda5e27fb549", - "63e556ca9e152bead6bc7b58694d08a0eeece90fdca1885903827ad252b80457", - "6c4558f9057d1d00595533edf977726a78ca72202fee8c9076dd73be6afbd3f2", - "1111d6b0be338f1b4ac5ed77cd92aad74bf12021714ed6343ac32f44090dc390", - "a49d602793621f2cbbb969baf086a87c564517f765ac8839da6616058432feec", - "dedd93eef438c9d495001b6dcaebeb2a5153a31fbe7e473b6e5e04e878c2c422", - "1cecd995410de7c3f01cc00932f3d835a6dbece64777ff36f5a76a89939e1618", - "169ba177d6fcd1024b588e05adb82b1ce953073b24caad089eca92e983297ed2", - "0db483f163c54def98102f2e1a2ff14dc96244588b29f443d543b9ec3d7e0ecc", - "688f6d8ad902e95904987d7dbda49c8fa2ef4d148657e015bcea0db7d29569b1", - "ffdc361279f32f1c99aae9bced8047dc9e9cfc3552b84edb832b70ed830661f1", - "a7758fb0a68042f66409c3831ec2e787f1820ccc5c2529bbebad6bc89b5c287a", - "fd028ec4a1e36396c0fa1e402a7867345249e91a9c596b145efe473b49135ff4", - "893d72d7cb56251724a7094160ed5ebd1b7fa876558508675021a10d2acae9f1", - "346cff730d275caef48fb3ad3c8f06d2659dd103420c7a54ceaba040387d2040", - "559d4a91fe3dc95a9b438bd5c7da79c2787dddaf3f7adb6b4d88cc12bc72916a", - "47c746695494e11effce2716ba2d5b2e628a999b3ac92a5c6096abb39ccffcdb", - "3d03a1b138ae7cf6da3b10c489e52bc4200354a52e99cd0e33d71af6e1b24d8a", - "b09348b0040d8fe1a50d47b90ab933d425965d9f83c809827a071734e7a0902c", - "d4de59ff04b760702f86adc70ba8772b2620d897c9684e33f14a2ca07755d44e", - "eea9463c34e7d8b72f4eaf9d69d244eab4385b455dc5b96e2d1fc4ec5371a640", - "829eb73b7ecc34daa854afcc2049e537f0d11d343f56f771cb7c4f8b4f8fd9a7", - "5109a8747f98b481f4dadf06e614165966d22a63ebdb1fd2198946934da03cf7", - "8e2d2ce186c493f5d2d0ce23d24525ef61e1168726ac7ac76b09bb73e53f81fe", - "74080ba9254d714a3fff2c1bb315b56cff45f6a741d392c2aa0a49dc53df4c6d", - "09cf41ff0261cf03329b0dcaf001b0e21d713aac1a82fc8766aaf0029d9cc203", - "3e9bebab313d7061b477d8dd3b9202e81ddd2253d81f94d1d3ec257241d62718", - "84bb610065f8b71068df43463f88057b2b11e08cd378f1201e6aa18b0271f9e6", - "86a33649e107aa7e509b51c94603b22a34c1c11a6b6c8c988b6bb2e1f45c2fe7", - "9e112b4dcfdd8bdc899d7882c732e4bf67ad8c0bb2014d25d8251c834b43e129", - "e97fa1f1a69189d30c9c696a2c7350354b2dc6ccb4cd00b6c36271ed1190839b", - "895d0e4a9b41707f35693b9e1b17417f4425c3d544b51404f6dd50dcd613c1cf", - "927e86891235b00bb4e390fa51f9055d3622cfd412ba3d6b020cb4a5ec78b255", - "f6accb3edca30b3797d742b6344863d5dc529a1ca31eefb202a3edda0ecfcc4a", - "d1a19eb28314f8beec9344a4cb2b5494b2e46c323eee5156ece87949db10b768", - "95e611d013dd9bd0c75c54e79d035a8aa2f55b055ddcf198613c2ee91ecdb87a", - "55591c90c0d82b619bbb7908b500ecf574a930d7ef5d03c7e50ab3d2f35d9869", - "739f21d061db574434b3edb4cda22b1e3bd5479bb5ba6d507b0280c82d018bde", - "4a0cc10c7fd7f6638ae80d3bf79710c7c22b0567e9f3e2abbb9336f3be321329", - "d856382f14cfc05ba557a828345663cdd6a0f507986c21e7913b4c3ccedd26ec", - "8c4a58257f338a85c4511e6ba5e25b2300c3cc1efd9f1c829b6a1f0ba78c9179", - "f463fc4482a5fe5f7a9f9631dc0cf687c32b189d91da6f182ab27e170a9759fe", - "e13c2ef61e4479604a933745944e8c847c61962c1d518e1c66671631df4a149f", - "35c9d33b750b9ee6398f5b9e9a9bb80d2ac0b9d2df09908b42c38ee0daecae9c", - "2fbcabb3d2c52888d521ab80f945e15caaba40434cbfc94ff70116a8c769997e", - "7df05e1b4dad1120be635b01e7810338241ad692c64c502d26b7af3df957b211", - "3b25e9a4eda81926039767249182eba61f1682be90755011356763a273b77c31", - "768fd139310cb32cd272f3905470dd6bd108b4fe654b89db4d0b11796874e2cf", - "4b286619a3b6ed6444f47c8470a16e324b7551c17e83da5341dd7c0b179ad819", - "09a8779d71a5964fac617d48d47fcc14992c0c0776d73cb3899a439dbf424869", - "8c17ee04e42773900a53c95f39218d876c4ae8a2e5ffe635137b7aaf811b4516", - "364b9b3c0fd54c8e09cfbd41b10a7076c971286b0650c4d5bf7be40d3a7165fb", - "165ec2037b775fa1a5b8d24d9b8522d6174076d96c3e09e7bc2e6a5e36216c07", - "6513240ecfd8a4278d53f1fe3f97aeb176d3c85f5cf79b45e58b75b403157c61", - "d794cba780a0dec635d328dab4a689d08e8f88fc0f5e40687aee2e8aec923b9b", - "4af0a53717cfe3dc267cc1966a69352ad640b8b6b2d9bab5afd872f59d9111bd", - "be29d5552d902de3a89e312d6f770c436e88074a7a2fec6dc8b1be483008e881", - "d26bbea1a31d7fddf1a2fca90234c6aea5bc431ff55c56f1199fc6ff38be140c", - "5e0b397b0348ccdbb8c943d90b35c4429fed23f155b75ef885aa991fbed1fe4f", - "ffb8d8a3527608ffa68d23c889dcec9a5cf2e8d22f1cdc36202414696445e1db", - "1d6a2cdbcf886862d53d716a357d4c768162ec0a575779bd1b1dbf04475df47c", - "fdb1493519d3ba01c7591dae4fbc4aa6f203128507d92488a9adf3c7b495a3a3", - "16415363ffec3454199ca2ebe2e1bd86bc3033fb26d35697d74cbf0794f9e15f", - "4108d4e2cdee639b29026fda6cf9e8a6c7e993377cecc45df8a05f590d594893", - "ca6a6262c8dd962f5252a96b3632e52ab51d41557bfca176a147d782dc72ebc4", - "18132d49d0d71d3f8df2da5056da4333601ea35739915cdeef2108a09009720e", - "88a362141ad10b6e2cbb6fcf830b08fac84b071de57b20cbd607b3d2ff742557", - "fe545446de6a3897d8f6d78220040406a8ed782c52dfc411681b36c77cf77c7b", - "fc96e9ae3878b32b9bee10aa7fd40757bec04437dc2d5fbf73f058e4320b468f", - "bb2ce4b1a994d520a6ab0f8adeaf535e46a2cfb932c07099f138d74fedb0173c", - "9f220115bb75529e7419cc198f12989eb4a751d84c9a9faf9c6d2615ea8d59c5", - "a7ded61a8a3e89638fab06c25c514ad469c445d1e5900d53334850eaa78e65bf", - "39b96175050e07373df39bcbf2f1d919faadede271938e1f9add7616f4f4f81d", - "20f6529b6ac8a943204748f9c0c5b6ddcaf6553f443a77dfc705f3f8e398d17e", - "684e0a399d97575161fc8c15ed5d08a9e0edd986d0f14560c58c9ed7a562e4e5", - "d2bb003ceb96ba1d6da569e154cd51d617776ae9a8fc5394fd650f4eefb82c44", - "3efadf4752fc8e2b6363b4def163241369a28d97ef5b4a56b8422d9a06329458", - "0fec555390a3875c1cf3d99adbbb05220c380c674ecc49c42fa2d2481bc9bb50", - "b07ac309e81d4995efd11432930d167271995db40e02ff8f36378ffb225cbeaf", - "0779b1dfa9d3a5df1decd615375548bd07637e87a00e8bef184c82da4471e0b0", - "dfda5d0d894bf5bba08dfbf0369dd8b63a649fba2b84dfa612982cba5dc2c45e", - "ca243764abda7790f5328be1e0b288c3c021942e1dda98e817cbeab493e4045b", - "fff19a757721e7b4d6dea1ee8b0887fe2669cd42e8bcc05e5c2213bf3b1f6529", - "4481fe1ade7f387efa19944d04280c1e5ee7b565378c8fbce9ec61819389d4d8", - "3382c88e49d447daa37e975133fc9b5f65c407012f943480307f727cffbb9807", - "1379eb3ef965fb6458b6c8768f0b5067553a4c505f573dd6bd29c62d2a2af1c6", - "0cd9c73a83e5ac69aef7d7a28e7c562303cf6efa7a7098936efbdcc923c078c0", - "83e8405c0e27d9ff91e4d2785b9289cdc6ae211540dc3456a5d8f9e8f8bbe8aa", - "51048b78403f209fa42992d2ce9bd7a2ca3175fc64616ae3647e469480568c3d", - "9f7b595589549a380e3ef7e139d77889d8671ed7955e41171e2a19e5aa140dd7", - "70256fb031ebb2eeb88b337cb0ac8cf2246cbe0dcf684e606f9752c3e2dde484", - "18d0344de042569f01343a6d6c88ae9f271986deb5cfc477660a41ea625d00fd", - "1c6a44f5eb3c76397bd21c72940242e94a9b880bff16212635c27714a3e5b261", - "1482b2362d8b6d3b5ddf8deb67966f9a94e0d22e3fb4ab1a2a245494da9b4496", - "c80d00af0050a3f518c54f83c0cde7c8999a5025790113e2ad7ff4cb74a64f21", - "749377979d5e40a76d06a30f68968222ee2f7e664d16e2b69cc14ddfabb875fe", - "fffcf8e9d32cc9d9a86b4e91663b26bf782d21741149a7a4e1ed7ea0c03c7fc0", - "272c266759f85f65a3db8e13a6c5aac89f8f701633e0f12c8780c0004cb9618c", - "b336d30c57c5bd4a8da2d8675880b4b6ccae3b2a0a7f67dbc6ccb704737d46b8", - "393cfe48ee636f6086967f632f5b67766aa84a210a1d9fbbd8c2d35f5fa97e89", - "b6b523d53513ab254e38ddee02d0417c2cecff05336ed35fe4df6aded4d4c9a2", - "6c0e82f06350330d4725f9dbecb6dc6521112d908f2152b8e999ed762fe536a0", - "70b351020ecf4e4284697c76afb0f43e86ae2f80d9cf0c1c422e387f36dcb902", - "72be416b970e71fb95ace5edf5176835c474e5a514bc5cc3317c980513d4fd0a", - "1644f3b21e6a93db1894229d3a0c7f744d0e3aae3f00d50fbd3769699aa1b940", - "542a02d47d02803685cb0d841bd716f539bfbf266b5516fe37d910ab9a36edee", - "24d703404013346ed9e30243231d77b50c7de12832a9b6acb6aaba78d38edc72", - "feb01b5bf5304e61fc1e4802f167291c6f1dce901d3ee52a00aa6a18607c2de1", - "ab36446e05eceee19ef6c3787cda8c09e3d9cd8d8f0fec3b06ca9dca035b85b4", - "ae0d42d490ff052400baf541c2f13677de4ec39f03fdac590fa521da72d1b009", - "58161c7ba37cf61b09823d33e8c09300ffea918d2bad204e945cf774c63ee24b", - "4d28f01faa3369ed2ce35cf05fcdbda531da41c49eaf836c5b7779ccec09c867", - "f09e5208dfbe19646da0814f4bdd2d6f38cb45e24fadd40524f79b2b8d6c47d3", - "b166c469d26d9b7739631cdbd9c94b2cf56979e17f736d017a582dd269b194c8", - "c1de5adcc8db936d04f993853bdbd6804176a71c49902639cf1a595a1ae52f98", - "2263b3283acc5b2ca9e687bc7c267131f4f0a835d4472f2be492554806eec898", - "37b00d9de4997ea4f948f9ce3f6253c8a485f786ab129d6b0302c2e6f62ce65f", - "557dd7ffd58f808b01f70abda5ef897b02534dc4589974b0eceeee356705b132", - "9db9130a103bca700e8eb0762cb4c6cd65f48ed75de9e68ec9675d52a75e644d", - "73204dd8b1ca5a3c4f499209f7cbcd10031b3722c0f4019c9f5d29e7fb5985fd", - "9c19194eee694420f6cdcb0a4295888aa062bf2bca814dfa0039928075b85abc", - "c7aff2b48f67c4935de630328215d0b03c5f071c05e876b9be254c088ffb15bd", - "05ab436f9aad279e77b3509d4eca4a8214d25105943fe293d62676a7b3e0daaa", - "2bc0f309cbdc48dacdf77bbd3eb1be2748906f6d96cc936489fc513ab38278e3", - "92f4642b1332b9b426760203c427ce5bae7220d75b85db89ca3a56bba6c1db24", - "c1e4fb75186d8b843d46cf7bf2009f0cdae1909731c418f3165d80944bf82294", - "fdccad44c81f075fd8a7452c814a4fd9abb2023c977f437d1d6411e13063b96e", - "7515d59f5cf00ff2b5611d8e426620ae1f31790a54dcf04a44fd2acfe43dcb49", - "593f2095955ae42ded69748082a7ac6cf3c357fd0383e7231eb1e4ca9a99004c", - "9c309de04bb00976914d31f70756c4c65847ef5eaaeaadca73275d3b331a1b80", - "37ff01179a3ecdd9a8a0640d697fa1cd1095ba1cedd3560b8bba8e7197024586", - "d8b6de1f616f82ce6662fce4147ce5ad2f3ac9e85e9bb4be167b50cced66e04e", - "7bd4f7ab2619115e73e3d41ce8c7cbc7bac6490713e72a4331581804216e17e0", - "2838b9787f859c04e93bd00082b4f2646a9249a85b0cb0b89f1ae5a06ba21b34", - "2c55fe423f17ab6ad8c12a325dfe221e90a305bef8457820c43bc97562c399fc", - "e45e932799b87a8537ccee0b94211c73044f98b930feba1daafd11aa9300a24a", - "c3b06ac8be7fedae92e4b9b8a31aa2a95ea0c5bd8e9de63d01f427a3123fac4f", - "ac2104480eb42a38a5a76d5647419c25369ea482fd97d37b4c3be20a5d0af439", - "0f8fa8f632488bd07aea7dabb2ef04c0ba05e6657286ef0953e6e97e62c4f485", - "eeddecd54f0ea9803bb715bf2507b84d7d44d35132da8da1454ce55e849323e3", - "848c9ca646aa8163aab041fcc81198482f7067161083ecc0786c5ea38b5cc4ed", - "af7ce51f0bdb02e5ddb6c49edf88f5df87dda67de83fdede9b413472e1d86220", - "9b2b12901bdce01051832f397e4d26bb3ffc750d60b08921c2538b66c1607eba", - "bf28c716f384af9180a020da1be0ca830156b975914dcca0c102e5b9a5f878c5", - "d7741b6ea11673ff86c2efec9ca34ffc4e866c521ccd9499d3ea1e1afd266caf", - "ac8be9adf1aa29d33760ceeb6284a26f99d46139aabe63b99b1e2803152c4d8f", - "7cb25e4423d0617032555421823c96b9f2b78e956a967889a8d17911dd0a3299", - "7cca24642b0d394e26e8da9c6144a237be74ec839eea7bca96a718b63f1c1bb4", - "a6fdcd82b80477477f42e5e1c69405085bf8b68e4c7d4d36d99eb9cedd5d799c", - "c57cce202eaed03ed1c3eb03945e132a5b8c11355691b515f12adf28c5c50c9d", - "44796c1eca726af6180c1bf90da976ba20875cca14cfcd3729960f748f3a4b43", - "3a5dc0f23eb4638d9eb7692d8fa9564e4802b2b07894a4af1049a2c2c3fd0cae", - "7ddb68f729c4818eb5e4327691bdc2ae4ff14dfcc69b4ea168142d1294bfeceb", - "33d01b62b8a7da82e2d3453278a4ff364d000c764861804f3811c36a35755877", - "44f4a03fed4e6104d481710384ec6c1eb4fa2f5b44e495e71351a33360f827cd", - "fae61e894d225718dc10217770d7c873cc932bdecd70bc4f4f9dc339bacea784", - "f998b12572e88f8e90df7797990a829f94342839372f7a710eb4ff13401face2", - "5818ba7f36f21f912985c24459c20ff440355b2c6eedd306142e173c043c4750", - "ae7a6aee9293e98d5f8d8fbeffbda095530e8bdd5dbb7e358a1af2fb06d450ab", - "6f3446ba8b186a96dee82cc5f3731687cfbbf2af18455c093095ecccd5e80306", - "a3c2c2a1037e1776edc1daa5de09754badd307f3d536d09bf0fc3dfa86907e1b", - "976e0431f8a990ce17fb491dd5a1b5f3283fa9bd0b14a00c2413e01b59b9e486", - "84717f31799a25b1fd95f6b7a446fe643044ae42467e305ee5c06e151d77c253", - "928679376ff6981e0245c90a53afcc93be9dcacad583409120d963296388ef5c", - "86358633656d309f61ba351e231d54485852c1a26271085bf5fb3f98a7dd3c09", - "7b049d707b54a748ce9393d44ade7a2dcca7e3fbb5b671153305d18c2b948d4b", - "8b19570a4943e6b940204816fee314ca96e80aea34ed269acad0f0a83a1213fc", - "7629cded49a88b005563e302bbd029bf93f23ce285079a7fa5ac09a1659c7f46", - "abf9d7b62901ee4b60a968def1b59e062a2d15b4cb8b5b750633687ad6609438", - "1893eb11a4db9b70c229e42bc159ada2c7662bf2512a460f8690d77634516bfd", - "e2b986223c27bce69410a1188ed494cd54fa4e86649b50bd94d7428fff697968", - "6ca4cc271a029abd70aee862d4fed1a79912919e3282c519735f522d35f05af0", - "4b78e1292376337a64a9244c5d7a8c1f870ed65a6cfe4b87f49a4ce135d9aaa7", - "a607280f2a3e58ca59ef687efb6f57cdf44fd92d23089188ac71cd13980f975f", - "cf6167fce7da3e4ebb3409030e79121e70da6ef263b3904866107b0cd7614691", - "8281fb22dbb073cfcf7de8dcc380156ecd6ba243cf05b1b42c190f6c6a971ecd", - "812a6d388a7fe6f916bb9a2d07eb363a273e8486115bdabf1a56e40971892dc4", - "6c2785a6d3b78244c3ed3cf59f86c9b1d8ec1636ca97320c58fce2429a1bcfe0", - "13b671961f1bde8a5f1d39e92c803262c018e988c817591c3303dddbbd179a97", - "ba91d9d66d1d79d5776af29c6b4d607f55c82391214595cf76c1428eb6d5294e", - "40a3cc45e3ccbcf16bb95e121d4810403e5833e2dcaae5526f6a58f6dc5c7bf4", - "6fbc337d5bccbb9ad5c66504f9537ffdb1de9db443a64909d2226e2c0e88583e", - "87a29ae500c53d50019db2d3fdf1bff08e0d221e6eccd2cad98f4753ab2a0df3", - "82d93d9f61cc4de612ea8c2fc629856343ee0aa0f2b302109391aaa240722891", - "20191075f780fbbfe6476d213df9ca3708149afe6645365276d600c50199216d", - "a4dbe5457db39e419d0974b48d255ef655a27cf72384afb56b70571cc8fc6b48", - "9ff81d5332406553c3b45e869504bce6fb8ddf94b1f86f431419897e94a9b5dc", - "c3a58aee21418495101e5ea3c0364cab324ad2893c2b2d6b853bc49accfa6f47", - "7a4cb675bb4ca8adc6c8ba78b5713942a001b942846eef8b037a5da5e41eb117", - "3b98d9cf33113752c5d29be4b4beaaba3155496361f677c94da5bdb82b30a2a9", - "e8cae2a3fa778a558b4f4bedfe5c228fa72e2cc619e6847220000804f578744e", - "e9bee161ca4c7befeb1b2054958093dbe96af74fdefaaae3a1d8a6aaef28b847", - "9bffd24c3f7ca7d414c8717a241bdde13951209e83c04bceaa1e3d0b3f9ce4f4", - "ffeb7b9cc7ef8c8ca0ae63c33677c6342689b19b587a09afa947a6d95dbe4e14", - "ee8889149d6067f8061cc77d716aff43bbe34fcb9ee24a1b9deb19ac28618e12", - "64174f5345500c605cc3be02d32dd9cbcb686823d613f013a4209797cd6d4123", - "ccf96e3b2dc8fa0d5599008cd2a5367a026107c876f9f081913745de734fe5fe", - "ed5dc04d9f4868fd7697343d3e58d45414f075eb1dc1eeeb4586013872903f05", - "7ee88ff8e865c7dc78aa91beb71728f1b70950b9abd6711574fd7e298650c98f", - "e8851cfb8767a3587bca4f6037f0fbbd00405d6d58eafdaabc1d58bb9bde0f72", - "54398c6fc5fd749cfa16aba221e33a759f5e9bfd3455a339ea5d6ba955097a37", - "49d5bdac1602103dd6839d07003d4e0e04f2704fa3db445d778e921a341eefa1", - "2075a77c383511ce110423c5e3d8ea966b9394b103d9c5d45d57e64b4a1bc093", - "cecce1b0a05bfd4c84f590fb76a9580c05fd84afa892823fa66e854e8a4cba54", - "320f3d520b2f46d24c4a4a85bea290243338871ef6c96f606b4d39535c1ccb3c", - "c8caab859bd1139e492f11974a22f87dc89eb447e3b0516601ddc107aab2faa2", - "cfec177fe7968cac630793a5c46a33baa84dcad37563950a1443a48be67b6aab", - "56b7b5259584bec68cd5d39392c6b82885c01084518f537daed48f2ea72dc8ac", - "c44e5409a1aeca971c715ba8db6bd8fc290c538ac7b0fcfccba1044278a51ee4", - "877c50c1aa32cdc221610f14b4cb94773ef8566cf0c56a22b3618be5e970ba5c", - "c25ea8556a62adbd7605ebf55a73dd1ac3f3257aac2a634b3028a71aa07e3995", - "c85b5487817bcb27826cf9f3700b9434baa6cdcc12e0bd55d2a277eae233d5f8", - "e42fd24c15be805aa7e0c850fe3c1af1732e7e31d30496b0bb00745ea5b4092a", - "d24016ebb7f1bb836f4361badad8bb77433e6bf447a5b336f61a6b4cd0867ae2", - "ef3d29e34bfaa32c5963da8ca21156d1de87186a1b750ee092d517e9ee9fa008", - "b0678f8706f64be5f4066e7e517fd57f36158bd78f5824be989e98b150070ace", - "31495415dfb4b83c52eaa20e6f79d59b0c54cbc48cd70923b263409b4d8baa9c", - "1e50b41f6649b7b821375d0e05bbdd359a9050b66152083cc6dc17d886834512", - "8c058a6a43e9de7cc46782c58f601bdcc4399ecc3378fb151041e427afcc5594", - "2f7b03cd581c178165574d20d9fed095d0979ac1d1896eccd958c3b6c9271be4", - "8b96dde2d2fa655e8aee5c9f1582c82476523df82bcbeccdde031049a2e93d3d", - "6630255ca2bce2631575a38f37aeb92a1772de19693c4fd3cb4227b2c6c31cf5", - "8675058244a77a3604b7230004e875407b74f6e6b4348cfd0cd6da7efbb49e06", - "ffc7203f37e5662cf11f93cc761833b648051c0eea8d63334f025c4dc01bcdcf", - "d2e9a0af2b0686ad8305ce2c29143f76f7bf2c98767d3e247ac18ea48e3a7341", - "600d0dc5b13aae6570a236e093381b02721488abd415fc4c8db15cbb119d7a08", - "f71872c66d5124c8cb20b0de951880c26a7e7a108de3886bef5c4d07129ba94c", - "ef0f8b5db83fb24ffba87c9c5583c45fa24ef501836c4d878780ab9b5d5d8426", - "7300bdcc3e49d5ff2b5af9f858c212374bba045c6d5f17b1340e9357f3632649", - "794685abc89fc90ea9e6076ff70e9418ce57039a79869ce3c3eaadca743836f3", - "31afbb2aa88b2663b7bfe4e634a3fdc9edc63a8363e90e3deaff032cdcca03a3", - "31e1a266b0413207018f0be43e1429083933069097395ac49c6cdb4793bc514c", - "b5bff84f542fb10ca9486a0022226e27ace5b624266129d204e990e6a9ad2b04", - "d7c786ab3c09e5d3797492b15479cbfb89172adff049cb2c2678ea74194ca592", - "7c5db1bf3e65e74e5c1486c3b7d00ef1c969715095c38315478ee50456ef24c0", - "65f7b366f95996aee5d7e7a2f11d9348831d6cbc883f8655354d6216c0507889", - "9a64989cf876f5d4cc86ad35ba2bdfa7bdee68dd53422469a80f51fa2f2ccc37", - "4ecd1e10cbe6fbb3d38d7c2018ba29eae36cc0f189493c69fb14dfd20f40d81a", - "9f9365f1cf7f8ad6620503f05d14027429f0599bcfb52b48e9534dae391c2d3a", - "980f143d88e19dc71d2f7d3ab4d0b868545e50f7f06c9712ffa1f030fd907537", - "ba2ee9ab8591d32fad20886e21190b8bd06d4aba67424a0dcd505b402f14d8b8", - "dba5121b91c0a62cca93b477fa3ee627082531f6d56710ce6261e781abe48995", - "b7f8adb666befd4aa90c3822c2d72b5d9b229cb829c34f3b9007b2c0ad69ac44", - "c7e0312d365735b8d9877d283039a26ab8edcb5989a5d4e0e46efb6c8dc0c149", - "2fc29a966e4ea9bbfd611b70803b0b1afb7257d4f3711cd07cba9f15496c4f82", - "e4342621e3f571e08ded83bdd53baa2bb7874fbff4a331dc522eacbeca8f5577", - "78e987b78e8364b5ec5282c26a5e5278a568ee1fa226c487d429009311751926", - "effabf632c8dc6f1cfcd090b0feecef2512cd30ba632cb2ba8e4c5a22bb2f0bc", - "30b011fab5a06882470e119a6ec4fbd6c5b5e10007bccab2d3510a55c11374ec", - "7591a38068fd8ad9f53fcd4c96a4ca786aad89e58406dc1e7c19d14c9f2933a9", - "3827521f478fa130020c9202d45cf64ca93ba0b2e812c267862ea1d6e608c62a", - "4c9844571b8baa4791bad557816c2279669f462a66240bc0aec3e8c676e772cd", - "67c33e89cfdb2c758ecf3144707d13b8ec6b850ed80710764b4af02b7e78630d", - "baa3d66b004710132a718c374b1f2a128e662cd1506d6fba11e617167c3147b5", - "7aa5597e2d2ff368fa103541d97fc3d8e5abbd15584be0c64e554c102a2ea2ac", - "04177a787fd02b40eb67ef530e685922130b0858f3455cb584a9696a7caa9eb5", - "028465b080833799ac58aad433b928456acf5d9333198563568ebdac403c656a", - "f21fa125aaa80c4273b5b5da4f55cd1b43cb7b4e889ca56ec05f5715bf038d74", - "0f722839f95e4f63eb770d8f12628abe0e2c28f1cbc498d3f9d8b20b1d877941", - "919c6ae484cc208c24369a54abfbc66335de2161fcf8c52beb1ffe35bc6aff06", - "bd0703269dcb9de58734b41dbd3d1cb7c6e0b33e60a7565664a7ed2388da39c7", - "e7fd397a054167958d7954decf9613ff721fff4cfb55db646f2b4fb56ee4b4a4", - "4c2a4852e63797f113bbdc3962e0a6096559a60f6630c6a41b2ccebcf0c55407", - "fe9303b0ae572a68148a5d07d4e7e3d4fac64bc032993d20e8275c77aa0c1c3d", - "f3cc2b3ea452727c5455eba879672d37a63e0a6afa8cbfd4ad7a1beefc4f5e32", - "6931f16c60e25952965d045c14b6813af6839e6b5c8699daccf1a3050bf4c9e8", - "4bfc8b73ba65bd720a87bfc5f8a893a475cb8c7e079310ceddaf284c2ed4145c", - "9b2ec9a64f779bbb4866128458b808b72e74f6cdef4efa4dbeab2f4c36d8cc3d", - "215a7725df74ce958caeee17379f688fb4c6e9a965b2a49162f805312ccbde08", - "58a43e9333307f859b0200feee63f2f4f103e03e0f6d9006e7485104aef48f80", - "86743197d26486b0fed285b72d8b963255a224d9d1375ac2c05170304efde2c5", - "f94660acf72e61bf9bdf9b9efc01fd8f57ce3f43f3f9776cc11782df6d4d61df", - "a83c06d81919bfd05aedead1353508b9dedf132758e318ab00e85246922da420", - "ab4e8acb7c861072368025d27dfd6f17f34109b9ba4d89d929cc9540c6e4277e", - "79dddd86b9a8b805971b646b54ab08260828e69e496f6b4dcb2570ef1cfb7bbf", - "df9bb973c21f4fd24687a87c07810268421bd162b302c201f9c03a7b0b34018d", - "4e94afc7ec93b17ef3fc1094e1ced88f57e0e05125f7990f556bbb828816be37", - "e46d50bcd4cd83750d447e644d89c8b019b20e48a95bb87c62582f607d8da53f", - "5e75bc5d6abef74291ba4dd015d4a9489da72f2edae557fdbe158e854a2a7641", - "052c58012706a11dacae3a9f550b846aeee4f046447ada16522f73c937b71294", - "994ed13ef7c909fbd3e0affb7b273a981a737c83dbe22c18a51e98b88cdd5819", - "8802526c3c7f7ed427beb37eff6f32aa49414c7c4c9b0b53b29fbabcf975cbda", - "9bc00ebe03b7d2ff3278c6b55c8816d76bb9a4e8e58aaf6b023d00d6aebcc05d", - "4a2dae43dfb4be67dc081f7d6960924ab2b6024ea80e781592f83b6497aae681", - "6b0e06798f6b5c9b5a67d6f0faab2aa74f98400e7a18f5bcacafa192139aed41", - "e4f6f9112ce5a7306e09718bc890992197adcfcba275ce6448fc01c6e5cc3fcc", - "efd40913d9767e5581caf4eff0a21bc7c63cb5f9c25b0efb1c9b6c223d50ea8f", - "fb9327f8462aebd690cd8a8b469ac7e3a6bd9104b19bd05e7679bd4db5331d72", - "9423427d9b30a7eb81bbbd337eada768a2dc2aaf5a4c1a9251ce6dc71aeb9eca", - "f7dec7555d1faeaa7cbbe4bab5269a51dea74a6ca7e43dd5078336db6c172c8e", - "d0beccf1944dd91c062b641c2a9bffae0257d5ad57f096e76eb0da7b1d5ee3c8", - "ca9562800639464b7f6fea8d83093a38e21a51f03877629303ac1d1108af47bc", - "7f1b1ee85cd2ff617c4805a8a6e26fffe6ca6ffa5de6e7c347f28b2b99548354", - "992373c25b250902a49b5a55aceac8cd25f78f58cb71977afd9a5698b679e682", - "31cbc8d4938847d23bc32d50a7d823071de4920b9da83857b3fe817b95c9cb21", - "51af5ee27f241a10a5011b7eaf451260caa5aea2dfb2067d980916cf69c6433b", - "a47c915e6f57769a73b72ed176ce28826e65bb5131f4615d890a95b925d207b7", - "3b570af6133f48bb1622877bea6e4e01f0bb6fac691ada56c55254f27b883730", - "28534c23379fd9db5942326fb618adb19db2913652a6b9da07564f5bbd3f8257", - "1258be7b40eeb46cec8625f19898e45028270925b9b27fe4d64f66dc626164c6", - "4b633b80f974fc6dafc0a573827a0d0c190d8e5fa5921969b0693ab068820018", - "9000eca433a7e5d20432ae763f32ece960e01929c4539110be62fec7b95a73e3", - "4ece704ccafc1df32766ad59c31b47ec1d819a1920a454c61bf33a5e9c8470b4", - "9a3bfcbfac44f3a377c7855d2db176e6ef014fbec3d30f5dbb63c2d66ff797ba", - "546e9f9d147f410c1f49f824ede4d6db50bebdb8a5dd69608a9c237c3ac031b5", - "09e009469b73bf34a4338365d3ee0ff45b71480595471111d436edc36599ecc6", - "ea53e4f44537d1e6f1289c020269bfe9997c8ec3e50216607fbc1603e3d62a0f", - "67093a62893317d5900c415cb7638de9104f80922aad1c8f8a6e1230e6616a84", - "fc96b9f75a9d45c826aac166684bba011fc78b09f82732133c98612835a9dc87", - "dd89ec62bd118411487b289ff4dce9a75c9a6b40b45b2eb5f0458cdcf3211958", - "cafb2276e43e9b481cc7001019e89ada14244c50dbf249b12806fb3e878760bb", - "f640d10cdc25ce5990fedc05f8365d08f718d5a7aa6e8ddc75f6608c4790e98c", - "4379b5f627f4955f7c206e298e7e57bbc7ad8d234d38441ef66e12089e95a588", - "7ebb65bd03e947b551d657ebf5e0ca35b774ff4bfbc9f4969394aa98a4552304", - "53f601702de1c6a8ac22fd38b796fc49df17335403e4adda60b6997905cb4cf8", - "c506881b3dc4f776bd713c46bf3dc23427337a73aded01b75ab3cc8050aabb6d", - "2e46b49baa5f0c8c71a5a1efaba3833bf792fa319e28c75fed43da430cc5a9a2", - "0d1289ab2ad802f3e482605710a874ded9f75ecf4be9090497efdf0423af7be8", - "28c9e9c02ba02e4d58ee661c5db41ad4b3db231c7d21470831ce9d94c489a11f", - "2be50c06af20be9b6cb5eda061401e39a24dcfdf402937ecd4d555a1071242b3", - "d170ae02af961207a480ec3e7b0430cfc7177dfd29cd71543db8d3c0db563d53", - "7751c2d9d92e933b52185ef86c34f1a70af11331da2049cbc8fcc23fe73b1b2f", - "7d68579aca63f3c17a42c5b2880a06a074cbd36d07d2139ec0890e73588cff01", - "0094817022427ee38f7b56efa1d3665b7cb95c2d451ec682a83cddbb8f22793a", - "d5d6760f49aabb9a49084daf205bf6f3901ea0639d39db056bc2bbf8bda1964f", - "2e0e4e58728639ee6477733e928c08582b2f4f43fd3f41322d6916f0ae949b38", - "bddb426ec031fecd94e6a18f94a05f2be93f66929b10b9d7cf95e406f7d148d3", - "0b69d445f9e39049a6c7648b7afebef745df15876ab009612bc438479a4682f6", - "fe659e3d0827932deef9199d0feb637a5f480089b5b3ec882acaa5ca597e9f71", - "f3f90d48ac2e29b83496973eb0b39b68d8cf780abbb7d2b85a10d82aae920c2a", - "d523927915fb746dfe68d95cd8a6f841398f22fe9dcf8104567023540ae3f087", - "cbbd519e4a1e880e7a5ef960ac506b0e0a533d79233f4022842bab3b066de923", - "3563900fee5a0b42c76c0f32025bf796f5975d195b12a4ba2035e331f52de135", - "c9a7118047fb16ecaef2231faa98b4b0dd975949184f62a75c50e022c09d2147", - "2fe9e8bacec0ec997241568b3e860e902bca653af260434a1a460c6c4966b7f8", - "85cf753324de7bd42eed32c516322b6ef29f64f3c98c3b699027cd679ad43034", - "ae125c6e3da253ec8b0e4450b2f7c4ea19018c2e4e72da606b1b48247cc1f2ca", - "04c3ac2d69d4ebd860034fad117d349a5e3022739b4b80fb44e600525086f615", - "0fb8db90b62e6953f5e9ac967bf66d0509e98e0535aed10d34d06267ce07b714", - "6a0a6f3c150d188200b3af15eda14759831bad23b4d1316271963fecb5ae9223", - "a50ddfd2a7235297de14269865098f289637910f3f460c57e8669ebea9598a00", - "4b51ed39bb069e8110ae81f14483495cb7f88579caa96f43ab5402345b0b7f41", - "48b0d159f59487967a7e21a7e0b81f83cb498f0695b6163d33fa1d504a670d13", - "997906c09806cd909a7e73f40da1bcb4c13c5bf86806e4632e4eedc34670b04b", - "9328a3315f3cf33566012a21cda7734d93f08fe2e0c222820623d13dae7860a9", - "4ff6edb57c04063a7af065be4b603ddda1f8ade3c069a70a04c3b11d9da28f3f", - "408001fb111ec87565757a300a970baa18bf1f8ee2fd26d81124615acab8b191", - "aa4e817a07884ca3d42be57306433e00589e7bafb1486b65f456b6b072afaf22", - "83df907ef979a1dd0efe36cca5db36edc046a09658eb7b154511eb5bbd55d56d", - "10313443c971cd1f3a3534775f89a2ad2dba3b4319e55f5b167af21c8e63e694", - "30d84714128f54dc28e4bee5e5198f9c465fd5eb71b9f1aef9b2511433a839b9", - "033f11815dcfba641ba1167a7506a5a0d328f50ce422bf25722b4fd861d433c9", - "cfef29b3f133162bbb6b268c9ba6b7022ae830e1a68403fdc67077a97e278005", - "52244d4b99e5c6a4581aca6ba7747e8e9c9f391b629b57280537c8c93092a008", - "6b6a3a6cfea50c9f238b6d4de4f04f47dcbcf8af73511203d768e9421a78869f", - "f953ec1a909ac31cf33708a433ed72858a837fdf298ffe8486e7097f8adaf497", - "0905d3e9bbb8d575cbf8f5479d9c92e0ad1b3d538f83b531c560e51178e9bf5e", - "fa1f631f0a2cfd1978966409c2cea41cf0bed03f873b5a32b0112e35fbcd5814", - "6c2f26320713fda8eca73ff437648e7b4fe87176bcdb4f3718dd0e015cc30440", - "046beb89a04d55e33e81368ecb46c87aabc100808b91ba86e24d31c0442dd018", - "394f3ed54d064542d1cef3460ebb5e4f82fd290bd9201209609cb7e7347fff8f", - "ed1572d114b4b99fd624780c1b515b5402ef46059ff9d5c0eb0d167a88f29cf8", - "d13e50bec4167836748d0277e7490d7e539b53e99a51eb4c259de6b3470e3266", - "6e13ef48d79ec238905dda379394609844de1173fbfff006ec165167e9632f0c", - "b816c5a4630e937112f5f3aa372cdd88ec5796647661bf83b950b6aa78092b0c", - "c135de8da6723e42f2964a9e8c0ccc71fcb275556fab0106b2dc27264583ebe8", - "5bc5631a299b5e7e53766f6049a0430b38489f578acf01b51b0ba411774057ff", - "af1b865b98547d89277ce0077883989e326325b01af8bf67a4e933037b170a39", - "d036473f684e85de987fcb32bc2ca6a059557ef30610f7f7052c3cf7304cce27", - "3a61179e04148fc76994d9422092b1978931f21c74a9c52b1e97d1de91629f50", - "c618f2396391db4990185ae1a46fba7bc367cfcb677b4cd8caee38f4aee61436", - "e62d071ef15cdced865ca54a38fe5ee201e2f3b6cfc911a9f0f3b5c8a7bcb0b8", - "28030cc50bb88223f2497e69cd87337e9f13805c71a23aa517f3159bfdc2d108", - "d9af7003a94f7bf09b295de5fbbc9c313c0d12559354649932c1c8d986aa690b", - "374f99fbb31673e0db4d9a46f4d84240e55aeb6a8a9cccf51f1371d666829ff9", - "6c72b3de813d5fb9e9153b48c544c3a1400b58ea16af56871a918d14a9b76f3c", - "73e96e2570ea9153da748f19b9f29ec8df79d8e1a0f774e29843c8b70790d60d", - "0ec31754c6eb7a1f043b515621a22c7139f41c960d3107f3ffb49e981f9fef53", - "ba8d50a204cdce4b498b58ba2cddcda0f3250cb0dd1b21ae64a1624a4b0cb217", - "4501321a99cc6802efc1f8e02e9a46dd119b4c1ec2fc3764954c6fa3af25fe1c", - "804fd5e078f105a5ab00264e0e665823d33a4b8f653e6ab6fbdd5e510d4f20db", - "ee2a5b0b40d79636c2827a08b2fe4542f0b996160460a79644432917e6d514b2", - "6b14581f4f8164eafa03f69dc82a4010345c2ed897db90208199f2777e5e4ddf", - "0eab16e3edac2cde7c376dd7547ad55c7ee14756e199c53c1b5635c935b0f14c", - "371f41dd9cabb6fc6123085a11f365fbf4a0ef491b0e2e99489c084d53c8566b", - "5c6a249735169137b1bb60bdb3347dd1008b1f709f06b3718601c30254b36286", - "1d5b2fb46d963831f65a7a6c7a95e6daf7691d52b0d526fb85a68d842da82ceb", - "765175dcc0d50bea7d0900b1f4ddcdc115f03bea496b4d804a25461f162aa0c0", - "462010c1f38ab5ed1f7cd642e2b1c1b0a62930d4534ee2c129ce1ab69e8a5aeb", - "e2cf1e73cc76a425f3f7d2bbaa616d78fb605f2dc1a2dd7f6fd90d0debf0c00a", - "f46baf28b93bab0407bc7ccab3ae536c64d5cddf21528ce6044afbb6ac2e0e8c", - "8f8c84a252e15f8ef15fe8d55cd06ed769a763d5aa47f5670ca4884aa3747a4e", - "ed8362b752ff4434303a6917bdcffc4744df8d15de8b38749db9f523793aecaa", - "f3962f100afe131e755ce046f86c319dbdb40c03d792808ab21e3c61e41418eb", - "4031800e6d262dcafcaa9a3b6b4545fb2ce3b2f6e723909226ec05b2f4d0c491", - "816ef15e8615178191d6aa74e37a3c017c11757b41cb40b166f1952e8a019ee5", - "52fd5100e42093b65c5fadc3796aecd4fcd21ecae124c0d8c4a5b26ebd2cf607", - "c8f1d2914da6ab8608aae61b3942fa68c94cf9435ddd29cf6e6b9ef3b40ebdc3", - "65089b920df849850cc76f0c302ce6df92afdc44774c74b103113c12606db5c0", - "fc314b3f7c2254daff94669fc0c8c713f372a17ebdb013d69229896aad816bcf", - "bdeda62fd46cb4b42261c56dcda9ab9cb73759e9517c7e1060ad7bfbe6155373", - "d7994a0e0ac89f8790363074924f97100e9bbcbe21fe28c06887b7853616dc4e", - "fe0e16282034dc70142d11dda0b90cf8174570024b3638b5d71fd9b6cfd92264", - "12bf44325b0e5653266634ec5dc0ef6e80277ff5acc89f417bfc6c1ac4ef1c7d", - "38252e324b92390fb9e7b26b025a59ed165115658c449a310d66e84e8ac2da08", - "04bf16a347629f037a59471817a8f1aea36dd15111e34a660e42b61abed24c55", - "a30c21d53041de32f8d2155591d0a8233b9dc7cab2b4ebac4e4749dde0e07d74", - "7313c6b77a1f7d1c861c29921cb4e0bd47da9b90b0e229a485bce4bb943eb353", - "c63dbb165d96a35dd5ab89a29f244002d3b28c7998cda1fcfdeb23ec7d7708d3", - "dec1d1fd2baaac6efe91c7074f9944f0a5883d4092bb3fa6c9aac9e8c918957d", - "526426db73b90e00bfaaa08b8edc5bfa47b2fd82d9fc2a6aa19ff539d3d0b912", - "a6f9e632d010acbdd4598a2cb09b7065a3239b5c563a76fcef6147ccbdb01b6e", - "e76ca6cc32eb387d06e3779b0e281949fea36ed60779968168ac609ddc28b60d", - "37bd4a01f0d88fa190ee5571725b44e4b476b3b4e302c2ec6996c49f7f19eeda", - "044201505a37b776832e52505f8e34ed1e9d91a86375ba396c89506e60bbe32b", - "cc1197b1ded00cbe3fb7b38bdb61b554a73ab08c4cc11dc1075133a9d7a4679b", - "a2152c10d21e12764d772b1aa8c8ed36908864d474add8255314f47afa40c4e4", - "323fb02414be491c3cbed0b108d5447f08ff90c0b9656aea89c5d70c3bd23d39", - "ff30c723dc3dd7353e7b2c4820d5b38f5ff5fa03a229cf33cd1eabe2725a1e19", - "4a109d1a9540b53f95fa334ca4c3a60d01c14ec6f43af001e589f4656038c7e1", - "be74c926d79b0056183ee8b5836845552b2b17949dde8feaa314f0e5a2fe65e5", - "993464d877843e338d74d1d4f8a9f99c599d3a2950c688c305f5f4b0c89c1735", - "e8adc3ce9fbd287eecd69d180beb9b7478d0c0f974924915b3720408f687673b", - "506aec0ce1b6e9011fad4f799b210719cc910e714c2764dd563066b3f99f5d1e", - "e0ce4ca804439eb9ce6e78e048eb2e694d0a9246ac44fef930b69a2077f2ef2f", - "e532a835379b7977c804b0c60acdf52c9940b8f57cee274ed0a87fd09a58b463", - "d2c4f3d74ec9256f063ef0c20fbc6359cfa9fe5a17f52954b840a4748986953a", - "f0ebf5def1ef9569bcc96714ecabfe40a291def9e6190a4d3424fe20632b2ccc", - "76593fc258c5e5f8ee866dd05942ce0d8184896050cf1c2cd245c1408328b1b3", - "8b2090e99479f2a831843c77e8b769d5c94c42f67ffcc7d5d88f7bc794a8f505", - "444b384a58e45d8dabbb34c7e1332542232cbb7d6f919af68bf1fee17e03ced2", - "2e03a02380bff9c0ca6b77acf086d8040666604fa17bc9abcf8960c66de74f4e", - "dbb406a84271ba2dba9c9bcc5ce9dbf5e897d6f2106e61cddde1fecadb294a7d", - "b0bea8552ae13478dc200c04bbaa220deaacc57a98765e4472908924c3648585", - "ee54de7109f3dbb60a156ee74ed36a25b08af33b0cfac2a4295024cacdb86d7c", - "407b136a76cfd3c92d2cfc8cbb55239e24cf0bf9bfc80da3846b6eeb7ec90d73", - "28b22ff039138e326302e93338320b23ea7b582495f464b0527a72ac55861be7", - "9f3f93044b306f199e8ccaf6742fe9dace19a302db395feebf59ee6101b4c914", - "6cbf7a16d84ac68467994533809a2ed9e6dbdc183f05fa05cdd422d78b087196", - "c72a37439ca454be8336d897cbb9cbbc087f1b9b5e147156c4648658dcdec559", - "28111f4fe7a7e92057704b09bab8c1db147dd5cf531f146cbaad4e7f1b6deb29", - "0cbe3dbb01350292b42f6002c8f6e8ce47cfa2bf678210aaba058d62ef3518b8", - "0947e980c4d1dc7220618ce8878bbd794a7ce5e0cc67f58a64ca2c5f39cd8a8f", - "c2d0f2f795255e1c2d36b39e8dd5e63f86e061ceac9853b024a8fed08e14855f", - "83905477a52c05745401a615bfb289c97db185dd01daba6f73f6f37ddf7d8df4", - "c92cb3625c9b0f21de7a94d7fc0905d32bae9f22a649a431b085378b613e72fd", - "3e5a2a25d00eb5dba15ec38626049daeffffa227c348d8bebaa744bf9de5cdf6", - "72d30ffbf0b5d999c809b331e9a5bffc9e5e028b43a90d2dfd617f09302d6483", - "bd28adccf86c0fd3f231954ca2379d983cf210620067b8493d3a24e7f4ed4c44", - "1fe453a3e55ff6dcfa72fbca725c878007f08a6c9858350609ce3e8b1307db90", - "b51d2d5701a23408ff7605ab257a59915f6291527bd3c74b2148f10156351ba6", - "939c5dafea6846a9650d34c29b12e78b346ae177b6808a51a51c3e718312ea8c", - "52ff8b0acf0b2289481f7aac10b228107e771307bf9e27e41425f3f304f27d15", - "2846f4d0699c51571fb844eb5a0ec411f07727c1a4fb441b17f8a39734b3591a", - "3c3a850f7870cd600ea7537ee2ac6825913025522f1eea8d637212f5124b140d", - "da70cb37bc14ae41cdabebb36521d2a72310e4625b52fe18c816ed1d00f2f53a", - "8ff04b2d2cec25f7050d80b90527c330ff59f42538f53df24dc47ef27a3565cd", - "0860d48e628226f15cd70feec7101fbbbb0c0aec6be6d51a6294cada7ab773ea", - "3a3cd4defc76bf7fb35785651b2ad22962c5cedd86fdb61bad61448f58831d93", - "dac1ca65ae2e2cc25af53d8f77c7fe1f5743aa1c4a129438374e4b9ad4a61f3e", - "d6baee6b464d6cb291feabfd8917e8ff7b8ebb2dc842595428e3e00dbe054de8", - "13c05b4c623f1a6da0587d761c41fc0e794b736195aaea3512e81e3895f77ab4", - "58c420f9dcc33c301434f43f4fa4c991f8708078e2a61cf1dbc4a4c7c1a3e932", - "60c84cb64c6aa6d649c648cb8dd7160432bd6da4d4372f60fb78f57560271c6d", - "e153cacd89c119a514122b1744938276dab547f088c3bc4facf54a6eaf2ae4b8", - "dd822063645adbc599fc63408478730efae60dc941514707d4a32a415d9cf8e6", - "20e0282a8ec31f9491792ce7a2b5ff1ff40a5a36b1220924b7ae6dc16073781e", - "b7891ac04374a664b991a595d6d759ce8e20b605e16783ddd845ace526ea40d0", - "779d67cb4a72a30e7d37bb4fc9cc878b3f891c98d5277363a4f9caf83750efee", - "223fbaedcf695188c6d523289304b273a77b6a7970d130746f0c9c90528e0d43", - "e63d11b0d9d8ffeff3030db7a0db31b9162939138d5a6d089cb333fa0bc2faab", - "88281d68ede9631053a6e02c879bc3d532c073c57ca05121b23502e86ea2301f", - "9225ad9caed421b0a7dfc01f0351c7de236642e24e307294bf5d9a7fa4c0800c", - "8a3fb6e057a6d6553eefafc32b9ab8e912a493f36a655d4bb4c5dd4696da71c7", - "533a81aeeff7437802885c8065b3eecbc2880a8d9ab77e5db5d54dcd2a424e4a", - "d49cc63288fe9eac368269f3d3e8b5595c79c58d8c36b638ffe031a90a0e3802", - "f7a4c9253a162b445a467a3908deee43d680741d712e3121db9b5c18d0d4cb5c", - "0006c80d3055e74f665ffb1fb724eacbd82478e8cffc3eec0c6bb211beb4d654", - "9bbd5f4b86bc9deb0e921996bc2ab91d5abe665b5ba322e2dbf58a6cdfe490a5", - "5d7fe131916512200da8e8831368cb4e3ee099552572349af7d37564e3d3e6fb", - "100ddf9ae23be42cdbaacbb516588e5819364201ecbcc1e9ca2a5a710594f3e2", - "b6f2817089a930ea64dd1f689ecd508e781a27bddbf7ea3b607ede75f15a3be9", - "e5f87e3b92007f4875ec81303f62ce20f8bbbfebd77d0999755e5d952c35fa4a", - "a97c5dfeb0a1bfe35ac2cd05320ef5059f343c3cc02cda429284b48cf75e6f34", - "f6f013d051a5cee96d1c7ff322a373ce36784719aa3e3e1d0d0305806b486c5f", - "796520976765cc4a58e136f0ac429cce959699d31eb463b506779dce838555f0", - "588bb438efa586e274a45d5d600f3ebd098c969aa6355885196ec52fe7c73f28", - "1731322d813bae67fae47a16ebaa5abec2641269cf9354c7a458953ecc529406", - "889ff8b13d32d192f3f889cb7059e8df3875887f0f6b77728b13b6ef3aa480d3", - "57d58815797a467fb58dee3b9902605f3f60a58bd3e45adb55d8e41a4d8bdb1f", - "dfd96fe81fce573a181103bdf368dfb53797ef7e85b3e1fd313a45b7cc7ec05f", - "ef67ddce5c19baacce0a594256591bb09e1ee45922e546908b5c1a3970ba6b2d", - "5e3e05fbbb1a5b7c10a9828e3be6866bd8d64097422ae0c7a3f2f16d83e55b19", - "40273a0f2faa9c5aa5a52efa138e38c209574a90c65884bfa0b7058c25f6051f", - "1f95809f7dd6ab5b9c581aa7fa02fa6f2427b738554083f334f22c7bd6c6f9f0", - "36b7dd40a047725064959252ccd1b5aec60f527d07f2e4f37bb2f6c13fd5a95a", - "8daf53a8ed61e1618ad01b5b9ce82f82bddb51dd83c03a93a6569f2a79657c53", - "5f81f1b0cdf66fc973ed9792cdf0249f11acb89e464ada94376f5b67019d2c96", - "8b5444ee869b0a2841b4cbb94a5b0de5cd7467b6a00d026f2ce323687a961889", - "422c8f0ae3933c9407e8febf69a734395028e759c9508a60e9cdf80c7fa35a7c", - "c7caee649a763e38ed67676ff329870aa4dacb3884e0809e616b197805a90762", - "1fcb6443371a02ce16c47c1cabe12362d9d5e901a69f9ba4c6e445fdeac97f83", - "b0b6d3d578b09e7968931c5235c7dc0ada4c61a50e7a64b0ee8a705663eac80a", - "ed902314ab33d8eeff8d73b119005c896c96e6a38b3cd1adb1505d609ef90dde", - "5c1c660fda84f85a0c88d4f848de29ca4cdcc3de94b47674ba76aea75595245e", - "1b704a4a9a8a43d869b726473d8ded3edee28c18872a27237c167b7cf879d658", - "e5c7e2acbab28d82d5cf34c281b9738713f60530ad92813e33f381bf1fc4c3b9", - "ca4ec4f6d737a32e1223701354a7b1f7f20b524242f5fba7a57b8a29605bee9c", - "86cc9f44a83d6e4fd4b4ac60c5ec06e64ff5884e2995f8d85fc333dc2fe30b4f", - "6dbd3b5e1ddc45fff5430e277dbed096b7c3d6f1147b452fb0056cf646d26024", - "e275e6517afa1d9ba819e6371f85ff91f5d670cffd84599e71306d389e299edf", - "9a978caa3549f8c490f45e3eb7a22c0392fdf44bd0438bd9bf2235f20707fde9", - "f20ebda9ad981e0c6d005217f756358f40ba6673cf2b7b319a79f81dc0520ad1", - "82fd49aaf25cc42bb3b0507c670cb97099024d16d437ca2075aa2b50d5ec1543", - "3be53ee805883bef8bb2f186efccd09a90fa4ebfe6958a7029b8f2c1a999b19a", - "8c8b8e9e9d74e303cb527281659ad42a923b51d0451d2653d6d847a3aed7f525", - "38dc2165e604acbe5cf4befe428a12e89afad2bcccf0a154c2279a0d64acf818", - "bd44077c91bd1f417f8127fc85346d4039045cac96caf18ede97a25551b95046", - "dd97c880b7d8d10603d6883b6cf56b28f4a9287dd70623f494a3d260618595db", - "dd7703eaf3f4c7b8650241ed51d0372ce9b86761a6e7392f409eb9ad601c1086", - "75d0855d642d5bc684001d2856a62a244e325e580fece3f06b19ea8e3f8d847d", - "87fa8f85dc0cd557207d68d64285bd372b17f13aa4ec5d2a6d539210f5c2ae4f", - "9865066f81e436aae5e55144cf4ea31f8901179669343681334f14dc113a40ec", - "c0d5b260a51889d84232d8550d422939ec10641990c008e53e1e83edec965fbb", - "d5cbd67353ec23cdf6f4a94d200f64ad214e8bac80977da4d4bfccc4139c3790", - "b5c0c510fa45b6c8f247eba01cfa8321d3aeaa4694f99338f4241ac97c9c5ed5", - "311d6e774463418135cd33b1acad9389df55303574f9dde214b8e5f60092134c", - "b4cb0e23f4f5273c624c1a105f9b4e055a71f8f64b372dbc07dbc75e0ffabb04", - "c2aa5b2ce4d3c654802e865b75eb9799919e62ad86ea9c95f1a717f8531582a4", - "044b19dbab865a05defe8166fe38899f5befe6ad5c9025a8029eb8e8b2d5ab80", - "c37775eb80a11592c60c7f4e5c750bfb9e1c8b003f61c3f374f56f38dc70c636", - "444e0de7442bb0165a85aca4eef521b000707359960398d5ad81f6d535b6af98", - "8e27c89306c9a9a859cac07891b613613f5fb2aeccbf9c3216fcc387fa6f09c4", - "b6d2db0dae5186b1e99cc16a776011c4eb4de93e58c8e7d9445d29d6936eb040", - "5d1031984a686e161f45edbc8a7fc0b5aa5f266b1e3d4b34190dcd5965bd7d2b", - "626792e07e63bc57a27634a225f6197fc68ffc3e52a845fe11936ad77711933a", - "5f87640d82cd5c89512a4b8f8255edc3552defddd7fd41a3e83f18886bd695c4", - "b8eb7eb765e68bd1e21694838c7f0d3da3f6f9344b8a6c36c65a7ad956272aaa", - "64a39a4c7af7a6670c8eb0852a464b06e5ecdb268fc3e065537cffe18227ae7b", - "cd745b5212a1fa73b2284aac88a306bacd3112f431e166ba828d3ddb7ee48fa4", - "c069237be4201e0c4cd2769a41a6f20bbe4b8ec5d26750eb493675e7909355f9", - "4ac6bcc65f37f37dfc2aa0359eeeba61c112058aff57b074516881a4cda08a98", - "ef316d6ce81f2dc165ebfd3ccc22fb5b739e7603d257cc8101e7fb541a6271f2", - "542f4b5598952c29e8d0e6499115cee5373613e05afcc273b963d87bf8d64eed", - "3d19d63eefb07f8b65017990f4399476bf5f5e17998d6db7b1b12eb5ffcc4e3e", - "ea24197dfc9b0e78ccf86f92e4fece2d62f037ed13486aa29dcbf56b99cf12aa", - "b6e4279cdc4212aeb7358adfd95bcbfc8f7131cbcbd694d60afb27313ea0e53f", - "947d8172af3812cb2f720d8123dc6a09fe71aa2f4b4ef2262223778deeb78016", - "323f1cf11b8ca9eb4a85ce457a25be4055c4ce42b8518deb8bfca93dc40b928a", - "2154168396ea2e0c20d0d94db4cf5234670f49ed625341fbecef3f4ff7cfd4b6", - "f08d526f17c1097da56b09c60e056bfd41cdc98fb9bcf5c648ca0ef7294b2958", - "6171c25f68da57de76a19e1f751745c08312b8bd2e78df49b6bd2761ada0ee38", - "7a34aaf8985a31cca37c2ab6eff8fe67a044ab35aa506cbd5bf18bc694362227", - "f4419f72beeb0dd98e5c8505eeb1698cacc051bf34ad314ebbd1ed045aa6b39b", - "e8cd12540e69e91ba3dcc58407b5a61f7d10402207d4b1435bd893a908aa48b0", - "22c225cb98001a98ba5aaa94ece0b0aed8019284e583d366fbc94bfe3330c360", - "3f2ff2c5afa4db167c5b4d6dbbd31a2a61f8266422b36514637826aeddf6618b", - "5cd584ce2a522e07d07f0d6f5206318c915e442850f3a3fb9602f2c91ca9249e", - "6ec757e09e63fb3f4ec77bb85a86c450dca09bf824ee3c6b7d86535c92953732", - "77d5877c6893d29b6a8164f2913ba1b651498fbae44872bf6a860dd292ffbfee", - "82932ebb3b7462310eede307e88f4b1e6368c167b8f81ca2582d1865f08b2dc4", - "1dc4ed71b8b9e9be0a02d0ee87974d3deeb38df60a672eda708c09754fb04dde", - "720f929f45da52b52df9b8cfe7151dbf95c80e72ad3712a07cc8eadcd6eca745", - "201ff2c2b1c0100dbf4ee9ba2d94e4639fb1120095b4af3b3ab73553364f143a", - "59eb4f441f9fb05db5b21de45219dc5a132e5f873426456071ce9e869e43ec54", - "40a660e097aad22c981f62dfc53e03f3f8c5054680266ff15febc14b1734ab83", - "48c60bb31b4c5182551ed46057fd5bac9f9ad5981a66b8f8da36f3ce8897562c", - "134e5e5bd4bfff0aa6e2e57f7a20132036f7af874af260fa245381ec782d2b14", - "a346f33d938acb74f0df5973a85bb61cf23ef0fed355bfc83c87a8d0796a1260", - "fe9c43cecd768f6670c556187659fb0da67a908357a5a0b8a7d1238bfa48b8db", - "829f220546edf5bd6be6244f6bd96e1f9b1787687208b572bcbaff8fa9ec34f1", - "810bb8790a7403ca4707e3506121498f8069111f52295b81ee15b4899470bf55", - "ca015b5376bd81467424dbdf0684f81f564a72d588249a5754a8a581180d54c9", - "f29db8c66c83ca42041c7fca4a60035f946edba48c9b748906ec688b31b467e8", - "648b0158199385ff9b5be763da800d1daa4a763cb0fd59c05fdbb4cdd512e44c", - "081c0c12062d48a8eb6ceb21ba2b92dac6af2c9cb1c912897b650269ddabe80d", - "3df5d52d8d63a8a901bf0461b53935fd833f04a752fffb6f5b2973ef3b0d329c", - "f86a4fe7cbb2bfecdf9671309b3237fc753726020a096b4d204407488be3bee5", - "ff7df3c954a3e88fc5647d47f3769341675b14bb0641d63a46a74be1a89a5864", - "700c15ec26a35e5bc50f0fa689583d6fec69202f775cf1985d4656f6e781fbb9", - "95275d8fb37d2b26d0a5f8a1205ebe3324e85c9eda1ada71669a260333ca9711", - "504b17ca8be146d52ce3fcb1c2d575c13840edf92688da060d76b18669f13bb5", - "5a7309f531bbf69ce35e0cf533df115fea1c6a53bc440a77541e97b16f331a10", - "3e004c46d3ecc73cfd37e1595f41432aa3b3978528794b7f6d223da70536154d", - "b9de6e63ea2cad1627f33825ec8e3a0be11c2c2fa0864bcde42a457dd067bf64", - "627b05c02d881ce23a71ac07cd754962f88063dc0439d13e271a6f8667a9548d", - "54d7cbf353c684c99fba3b0d832967e3dff1e50b0b2232f94a7e53484e241872", - "a72bb14aa074151c0b49c0079c5b961e4ceac175d6410951724755ce61bfc23d", - "9c1659ad0d621772e6aa9378733cb678752d5f434f508bc0a8ece3a652513b12", - "1ac5ae39d7de1a22ed2e09ec870dd2714e1690fdb30d12f06aa7b281efaf2c96", - "ccb2b29e01ee228e13ee35d97a9259d132793f3d9639c342504380a771d7be4f", - "91f52b69c3d2e600cf1264aa22022cbf4dc472285dacb81bf417f026770b7c01", - "c1849fb4b7e2c9e44479a50d28364d3a687dda3c09074cc97891e2c717e16d16", - "639c4f419e5cb6b5ba6e0a6c96fbd8cbc34bed453f628db2b7e5f9c41760c804", - "df870f474afb2e27be43049c4914714422b4eff4ce81d68b13a4035ed625adb1", - "c7b9e438558de7ca510caaf9e9128fad3ce236f2efbc23f9fd9a061ed69e10f2", - "5f9ed7f0dd4fa574bc1f247e4d6f47af874aaf171de4bbcd2567cbac8cf4d880", - "2676c69c6d807e2ac61a6a072f8a4feb15e721bd91958eebc6323aeac96f98b7", - "775efb191efde5c2c674fa0499dd134c5a634d0bf956fc0c190bac37de10a792", - "b3ee566e5edfba1086a6930390347c11a096acdc8c447ba692340e3ef194f034", - "702c2484fafcd1e30fc1c150ab310826dc3cdf9fe3e80be44f6802df088aba12", - "998bb3df889e0fd99e5ab29dcaea6377d784c7ef5a96d3a8db484756ec3f4f5e", - "9a2fd84f4dc6465dec4d43c34fe0c47ac3e426c6360114cc33f6b197a2ac456c", - "8f58e66eef8e69426c7682961fd3e9105120e920b11cf2c0a5cf329437c85736", - "7faab63914531a3d03c68e07ea5e3c6ff444a8de3f46b5ba8214013e8dc6b037", - "016ac58920a3313ae9e655e1083da57c3f453f9958ea909f2da8239a1d2e00f9", - "02d0d1aa09149b233ce803a70c5aedb7040d3d2f8d51159d3478a6190115bf57", - "e08ca457eb38536c62ded1eb9900177d05e7a61b111a70137dda462e52204039", - "e73c6cd5243214d9fc679017d206d879c270a67935be1f8ca1d8b07b06037092", - "9bf9f880677b2217e8178630e291ef7976fcfc7175ef5e1c673e34a565bba8ee", - "5eccf5920b48b025e7ad98592a881f8abc3f8bb76a50c05a71029dbd81e5de57", - "549898070b11d7f034b902f2b1ca4b22b7def37741e575eff4c7da4f20005b50", - "8ce23036085a981c79789a14da1db0d4af8b95e0bcaba675e3be186659a0206c", - "c07165e0f7274876c568367410eecb8e711e5669f0cd5fa5c7307c8987626636", - "5ac0d1dcf11433e6040be054789a7ae3b9448c6517f57c903f15d957c8bd49ce", - "cfc6d86eb666fdaae521c4c0ddbabd37b74c09046e707bb5117c331b698a2e4f", - "93f4dea8f27c772aca2b706f4db4cf236c63a7c38697239de0a45fb9815a2a47", - "baa5c1744848bef4572718d8b42f2f4564af48083ff704fd0b9bdd9c0533084a", - "150261b712c9738429869bbe7b965a63f2c34a1da8b7bff710bc651b99b0b731", - "f6e6c386c9fef450f84a31c31b01565c58f8dec9e0704a4ec0707781b5b2f79f", - "09ee3defca5838ee6f2427fbf3ba827e47959873101e3a6e724352d6a5cf07e9", - "959013b4c97f34b06a13f57dc0cccb99ffb547f4c128bf71b2d57dfd8716c185", - "adf47af57faa1acfbf0331f3ce3359dc8841035f494cfa3f4a50cd19447acb4a", - "b4278407dabef68f058243b0bdc7a80044b5edb31d3ca795bab0e3739cf7cce8", - "b343263868ae30d476ba52aa51ba97d07ccb6c52925a1eabe863477169e99e3b", - "56db2cf5a28fcec0dac07287a56238aa1686503f329081c45baa0bb86127106b", - "ebf8f428112a1404eae6cebaa51a0963cfe62ee272f407c4baa2e1af2a1e4a69", - "7149e00acfa28bf5f00ff484b06604df36b9e9e52dcffc55de19e227cacf6db5", - "cbec75893a50259fb06a0c57ebd8f896794d847adeb7fb8e9351f87450b02ce1", - "7e522a734a8bbd9c6754a24af20b66524fd10fcd17484acd3ad1c37ebf4b4e34", - "d3de37f44aa290abe81b36ef4c13112917bffe0c8844e31789713f90157a9c88", - "2ccb7064d6b80f03ecefc63d7580367cbce4533bd5de7379a22e46e580357851", - "d5c540086952b9c05ecb6ea9154f6d7a5bab2b5ad06adbf8afaa7d0ecb9d9a2f", - "8d271aab1c906643680842ac51bbc69b2e31041864478e96fa475f1917214571", - "bee5dc578804ee43a979effe6dd3d055020c3dd39a894dd31820aeea39fdc1d4", - "372ab63eca5d58a26b668a60e616f4111270ae7732d9cb83d4ca315971fc1c5b", - "a0c85b34e7702c483e64b4e70e0b49e3b687a2f4c1f8d2a4dccddcb4c2331e20", - "aab7a1232ce2d792d29cf168a6b6e56e62ae02cd1e237546465d0576fad5adcd", - "d6cef093ab3a0080aff9fa2b476ce2bc75c679ca5b01951c79939aed3fb74c05", - "8fd6bac6b8aacb20bda2dc6a79527fd4ba3959c06fc820769d05e1d3757494bd", - "90c2002ebfcd68b33999caf3ea099b5d0d0ec23d34d675f921f867e05b1426e0", - "482f377b4077eb18d3addb810689506694d7cb24f19f8f5a66e71180b00ff7f8", - "f129e574e88ebf01add0c549c15f18833e479eff60fb24f30cc44c1b30edd3e6", - "fff9add5bda00bb01b608ebc548853a6f881b134bd77986211a2b3eb1316db2f", - "ba40d2ffaa84b85648aa1c50e2d58883e26f7556e7095e70b10b024c50147a37", - "65abde7935266fbcd9fff1e0bb284121c7e8ccaadd744f4da063776a2f0fd6f4", - "d4f64ec69a387ca6e85d69f3c9380a5aa178fba12d5bf899205d0aa02d143a19", - "01f311f4bfdeb21adfd9013ad3a8aef983a96a48034ad07791b456b5a34e67e1", - "f1d68c9f3e038777d4847383211adccc667844dea2d91fa261b6442e340155a3", - "394da2a6ba97aac2fce0ced73d71fd18d085743039371f35da18381b05316fc1", - "d07d82d2884ad0ec5dcc11383f13379419ded79899fe7b601a8515abd8c7974f", - "8e68b8c790babaac5df468fd33751383c02bbe14e5d6f806c30188e1efda5e31", - "3332c0912218547f666ae1b2a1c65b954c103a9addc1f90cd93c322bb3790a7d", - "311df0ec26af644a3fce24289f9b4ea7f895cad7b14a7650d3aab26a3c759aa0", - "4f54705f819ee79df12eaf829f7061286714d9fbc79f6a980a5158168802f66d", - "1b7ac7ad39344673fb16f4580f6d5399f41ebb7429424174f18fc3e3839fd46d", - "d038d8951b9ab8eae61eebf7dcdf073a69e12fb9050e1e1ecb444169f8915b37", - "0f4165eccfadda7de452a3914f871c8e0fe0be89cee78420032550400c31bf91", - "0b560e17498fadf4c1a69291e73e5e093a3351233401cd368771c4498da90d51", - "b61678ac20aa361d3d832246b67a8c0965219ebf0390d50bd92b4d5c5dc61723", - "ada009d9edc64fab87335c17615a453dd9c51519d5ea3b51b4b1c9596d0d32e5", - "8d96869eaadcb13227d8615482f7008950e467ef226eba84b04ffd89f1bb569d", - "8640af15a787a8f4116ede1df28e36806589b696be6cb335bbd5eeb39be52143", - "7ead4c24ec7bfb4d85074d0f6b0ca18824f02ff8cd3aeab13ba13b493a9378a9", - "85ae36037e7aeb0c05766541fafe22e790eb09dd9dc8f02302d1b1e74c77b6fb", - "c188a4336c00827deaecfd61ce551243b05778856ffb2ec1458771a082574e99", - "344f2f5c22ece5f19013618be78dd7d13886ca847d5f89399fd99cef10e4c284", - "ddd0fb3343dd04d4459e1635b4de67192d5cc4d5bae01866ccb2913c8fc9121f", - "03e3b7c6309580000cc5a05e75d4b711b38e98f1d3ea48e08d2ec8432eff85dd", - "1896e2dba2c8ea7f00344566a49d9128633a6897d12f1ef3cd0b15fd06054ffc", - "7d1b4a6deb923c3f852b08b44575e3f4d257dafab6513b41a84c20477d979772", - "a7140898a7bf75de7a889d91d49639695a6626f2bb3c7278b55e0438d9ceaea7", - "7a4b484e7d903b254d858379b1bd6d042ea2eb03caf3a9889f3a53f4954f9bde", - "5492fbb160aca345ad34f6689cdbbe803c9fe4e45ae2683607f4aee67346d355", - "1a2631df82d6a05682af475ed6be10adf897000951e5219cf980d2db8f728941", - "30b7582c84cad4cc66ae2a4a649d202ca4767ba806c4525d66ed579412d7af75", - "bdbc413bc35b4a296ae4e264f189652246bcccce6db460dd032b8044de19f626", - "b41468d766265cff526f826260c420703acbcfabdd496d3c7ceda8069b58a7ab", - "0d6d2db68a547634646e5ca5ecbd3d28f6ddb777f926356457dcf18893ba5e66", - "3f70ffb364a57b10551e50fdcdcb518b3fb1269b32414bfef681df0017c1efa4", - "2b29e7ac7abc0def5a703ffb1e078403ce6ae8c4cf3b6cbd46891b073d88144e", - "58cd1fff97c619121a15303cf4a73ffee9d5efbe75b762a63e9482b06d08b43d", - "f5ea01b8fc72f4507cde6d4f558f3b2f5304e197d82b47706b4a02fb2b7c55cc", - "39908dfbc1543463369a4304ad68e073847f008e9859b13a55be1b3e01da53a7", - "dd328612d6f47636213e42ef1259e524348e4b59b5571124ab570cb0568c4533", - "f46ec5cca59e8b1972dff3ddb3508351030c4edaa91c36ac0072697cea48a86e", - "fdcf96bc5d9d683baf77e9c239379acff0e9ac1756aafd124b21ae311b043f55", - "9dbd2928b858b43b1948c9955ec3c9034690f0a301582a11ca69a7192b044056", - "1ad552f34936be770ea0f08ae290d515f5fbdced304ee94bd882a31abb6a87e3", - "58bc96928c3ce17bde057285ef4c4c93adba5caa579fa947f2eeee8bb2c21011", - "efc68b1da7b77ba77d5998dedb36929ece22b0127dac14e9d816c0c742ec47ee", - "860e8f90e9fef5109247dcfa692123e233529c3f119575164036e27048d82830", - "803f3c4ed3a86e7981eeb5eb82c47e2ccd8f4bc73472851337dcee550ba1837c", - "030e069a845c965e19ac053b56301d18daa6355ae2785b3d71e072f000c79040", - "7978e47b3aa92af24a55a14b98a99d5765e35a2b25dc9e6e9d6d8aaabe8f13bf", - "57cfe38ba786d216d771a638b811c2b419a6d874728ba5f6780046290bdeee88", - "b2c25a71f8a7c43555667d003404307de4fc23311b6152274233388a19e116c5", - "b80f6b0023769549dd69e1b9461fef55f5d1fb20a5e789ecaf67bd0b68d40faf", - "2b114455283f2b518aab48dd7095efc8a9b9bbdd8a0a3e330de1bf90c94babdc", - "7872884fd7e6ecdda9f9741c2b022f3c082ede22b239c7b32ba9fcb1eea095ea", - "2527a1840ae3979140368658b95f45bec4ccbc181a7dc67cbab8928c13477156", - "b80bdf9d0a56ab5421c128ad7a32573b287e3db2bebcd8abcd22524ef9215345", - "24de79b33224bfce6b9d58ddb12488b1447474cfad27050ee04f097ed70a0eb9", - "f0d2841cf94a82f8328017b1b5d071e28909046809a80d645dc4d967bb90418d", - "943049d21aa3812533873ec070b341b0acb0253af4da0863023eee3081a418c6", - "49dfcd70e06d7ad1c577b0bd214a69ed9638b0818772d11911b8687af7713180", - "88c46f40b916cd6dd02fde28cbf6d063ac469dd02c5a413c013b7dd14a11d8e7", - "e1ef0026330668dc7d7cbbf941eeafae75cc7450c88cd30dd48b8e87119fa9d5", - "ce35b1e1055d55cde338fd3766e7139ef17b5635627ff5b562a0a0498252500b", - "372c33c323b35621aed3f9de9bf02b9d6168c342f9eb5601fe3e7da6b1722dc7", - "824eb672de0f1fa73107c06cef819189b2a04b89b6efece93cc8173adce32199", - "135298b397c2ad3a1511214dadda9aa986bfd9113fd130fd8e0bda9d9f87dc00", - "57c1871673a2581887e1cb63f95b6affeff7865245b622917a0ac7e4eac6e8cb", - "8eacc4d935815535d6184fa9b6bf1f2681c975717c960b7a7c1c02d8e6038f34", - "570c09dc4bdc5974471bfe1ad0ec88cfdf03e7dd744ec63f852f339826183aeb", - "a2328ba3df4fa12826801cd2a32ab404963548ce87dec9bc555c5cf10e9032ab", - "7df5985ac9fcaaca1290c5c2a3cca510d76fe062298aea168790a70f92eaea8d", - "7388bdcb09bac079e6e88e18ab7e70dacc3d2ce0fd7203e35b5134f55b1f432b", - "5937f436ebbe630f5a893f800b12f885a031d4da93471ac83ad3fdc01431428e", - "0dc49b0e81b2b9c08997b6d4d86a17814d7b4387669598a1f0c35d6165154d95", - "841fc75651570c3ef15a2b6b8242962f00a04b64e04a71d8d3808b8890c89c2e", - "d64b88478dc3781a033723273f16726c596830e8d19006db6c059ff80f9cf0d3", - "a2a6f6be6a5d01aedbccb589535a65fb4445ddf07bab3b03292dfd031f2f103a", - "f1f657174d8ce378f02bf428e81c29325d95b003883bf6c14a37b2261549cde5", - "072b17ca63362d82ae31bd6a64e75712827e8d3120af88ff4e7ae2bd302b0a69", - "3ee6875180e68fc45170978c455c0c768ba9a01108fa93ab714db9640d917dc2", - "4bd311d9ef12a18db6a7c006ddebf8b8c7d4c8dc2f05b853a1dbafb47ef00d3a", - "30cf484a846c35e648cee757aeaec513412c48901a446943c1c2a625a0ba6f77", - "4e059626dea5dfacd46affc62dcebae39615be20a2c41b3c9da74f0ba96e9544", - "dcbf4e2214e0dced70fbde3f82092ed7b8ece7f6d7ea3481f9bc3229176a54f8", - "c96275fd9293ef5aa0d640996f8d0d751b556040924c7e4daf3128f339555b68", - "5b25b36479c8546519d936b289ec77b98a517e5663ecdd38aa94e1914b9dd932", - "bb3686ba35aaa0fe82c328adf79ba0e9165c31ea80b0ff4b01535a924a4bed77", - "5bf7a85d6f5c4f1d53cab46b60e66268f508257c02a01afc7e7ab918c001e852", - "9dbde241e058540dac3e03616d1d7dc80edfa4de74444a1cd97edeb228d1b3e9", - "c486abdb2a644089d2fe51f4e0823f64d0321523aa4e5fa053ae984991454ec8", - "b3f2008f677f9e0d39ec8ad607e3d696618062dbbab98670bed81a92c67186e5", - "93b213ec52df8046a38ff53c156167620c9e221070b198dd167e9734ad6ed9a2", - "de0356602e3039a659c9e6ebbe4d701f47ff2af9c55f21ac8af128f0e335c7c4", - "60494ba8c4fd5614986e580d834ce09ce99287e00438c2f711017441e9e37818", - "de00585345995c128f643d83acc949e6cfbbec154851007c588607781bfd2c44", - "1e2022f5b9446c4f544d741edf549a1578fc52b4f276687a283156c2fcea7ecf", - "55b78510f34a2851134b4e04e41fe95c9f9678997fc2b6f30ed0c9878a174a72", - "9a0698d5c7801bc4a8a82969a9a318d035d36238df7b3e9e74ade2075eca1d07", - "4c6979897fd881ecc08876f14bcabefb157298c92bab829f5ee3b70099d314dd", - "fa93a8423676d5fd03c10656e9964f9421e2d0edbe1700b5c53e3f8436417a1e", - "50e997d938d6d8d6764e673aa8bacdf711714c404e1cdfcdc840bc426108df53", - "e18952b40d778a36e0e93756f57aa04200e8767ee73eee5e0c98746708a9ecef", - "5d9fa8ea0f76ee093385ced018b58e670e2a8149f5c5e27b508e7a12d70849a0", - "77a6b631797487a3a6ce582e69493fa9b761f7469f03a0213fea8b3820a6b8f1", - "76ca70868c6a88829a27b42ae275aff3844f90ffe741f213515151f8e4bbba00", - "7e4a983308906266e7914553b5a1f9b8639247014c837030b5ad0539ebcfb1d4", - "2662714de9de839b6adc87338613e7058045f6034a7ed83ad280dc3a5b08d003", - "52efcbf5ce47c0f03b338f0ac7c3f8eaecc5730e40cb78937eb78f4b93a4a708", - "dd75e6f516b15f582c0cc84f083df022add2dfba916f4a38b4c4ea85afcb7019", - "92ca94e7bb24f861b077bd4d4a51e895ca0b6db0978892f3e70c835b5dfb40a6", - "b3477c33b523710b24e42140f91c48e7136281f7c81020a3b1de40e1e91434c2", - "1c561ed254cc6499030d9d388e4e66078a925751635768030ec554cf5bd76d0a", - "1c7b25accbcbce27cd12d855ec4531077f9215c3a813c5a7d15a23a7de89bcc1", - "72e0c4d05a0ba63f254e7aeab28bf9c1fbdb9a3f639e863c7584ae71f2ba24ed", - "28b2a0e275201b1c3eba26ea7864ce898de372b1fa14f78ca630cf2c5dba4c63", - "b288d1becde2d93e37879cf29037a0a193c636fb70ac7d11ba547ef4d11a3cd3", - "4c8b3628a5c118277a3bbf05695bb12fbd679908abe25696bd1186e557e675b2", - "40d37324c145f03fbc6992d0e3912b8a891ac7bd351555b029214521194f7f86", - "4090811d928065b97f4724d61743e7b9d238df189567bd886471fff049240bc7", - "3134bc98528fc28c0bdf6a829d39aa157ea2392e101fbf4b6cb8fc7a20848489", - "f7a44c39ac3d447dcfc090c87c874ef0dda2d52428d3b6d150b63886282546c2", - "d72c553ee6452a18a14320ec856007191d9498311bebc14a20e32202ab9731d8", - "3af646288b1e18c7c57928c8970312c6689421ef9803cc7683c570987435c1ee", - "4991e628bfb296fda302b7f30f748a1c1dabe8d09942329c230274c7dc978f31", - "d6b5804cbc2d81213b42e7863195b8225fa8ce7c503cc1f8d3ca5fb74318c8da", - "5d302103ad601cf79e2dbc25ad8f367496ffeebd0e6bcfb2960b098e092abfa4", - "2cfff19e52e28b7673a111f283ce0dc5cacf49c6ac9650b441c016cadfa6288e", - "b6a90e7fd07fc2be9a0449cfe6225db8b2c816943043197930c776c98517962a", - "d8f3147522544ec6608394c8806ba182139b2bff4dcb37f044822a7c60a6712e", - "61aaf79c393a214db570a4a70b994049533d37a2f90309c49d0248f49ca7313b", - "79e201176a1f7d6ddec53e99b769448d1387f23bd04d3aa06eb599bd492e7914", - "e62f64ff66f8cc8c773316611cb194f73d7ebeaa2407ebbc26a2b1e9738cbb47", - "cb7da09742f54a28f838e56ddfc0037f1b45858b9909523aec98d5ce78734281", - "c14d2253c3082255c6b3ae7c71115f8c76e364ec28d2334cf94d024d8d0d1228", - "5f51de02cceda6ec91bb25720f22bd43966d026a7285c8d94ad8c5a59305db13", - "5bc9cca3073bad8cf45708e0557f2929367f64bb43fa98d367f41e7666fc5d9a", - "f3e5d9f49162e736556f1f913fbaf06c2bf4956dda0681f306aac061f474778c", - "dd8069b400da26fee5ab9d36129b08f7a08d4b7ebcf611c196ac2162e12928b0", - "80d5dfc5c5625cc65535a0afb1430f63d3ae4161e513299e735a18d2aa9ad61c", - "74896657c89e0259344a0b8e07d5dda5ed5645484bbcfec42fa552f3d32714db", - "32e5a3908ee2cc67f3ad82429d214bb60f769609d4a859a508a6a3aa3ce4d6db", - "a68e07ef2f7e59afff15ef02e499c6a55ad375b687e80405d2b66daa1b363fcc", - "1755743170d111616ac049f0d158ec013b2627081c6361354c4a0e39feef3078", - "b36dcf2de62c1c1f3f9c34f34bfb86040de1eabf8cd88f14c90a3a4c448e4732", - "d7de8906996d90955907a9832fd8a478d88994a6fc634abf9071024a285b21bd", - "1c665a269034b131eb480029bb0d1920434b5bad57313241fd2b05a40ebcc976", - "269ba38b6917fedf97b96f4323b7db34aca701048b5e6e743ab4b3811781463e", - "20e5d6127907a9f7b758eacc715b8146b072896b08eab5d0bf92d76ca4154218", - "9c963c483345b36fa6bc87a86482f3afd3f3dc3acecd550ab36bcc3c40be00c2", - "4d536a617334b9d4dcfb9b27bcfae266c72885565c0e049173046fbce47af17f", - "60e321450f0589f64626030b5cdc74e60fafc80a280f2735b8041c525728ab18", - "b1e78b309be4008c718890bdb1500c163892867d7248100680637cedffbc4597", - "1bf6abee16e85dff35e39656d0cb85a47177844da8a5fc2380e3c4829885eda7", - "18ac6d310a975111832406aa489cc5a73c398c242496c56b149e7aa27ef8420c", - "5bbaf5318d0235393287635699e56e5397ec94a01ec25c2eece7aad2bf5da360", - "184094a4a80af5e198cc129681d5f25794f163af5295ccb4b1ca733bc5a20cba", - "e8dca1ee786d07e03caaf88b3d8ee04ecc62eb18d0eb3d5167f0a6671abbade4", - "bd1fde42c21da4661e62ff7eb36757d90d8c3ec3401ae01aecda71e5c65e46a3", - "71ce2ba6a5a89279e9124f3e832d013a816a91cad09a64912ca7496bb0ba70c1", - "cc904f9b170ff119bde6dd72425eaaa82021882dfeedbdca0ad2280b4a937ed5", - "61de422468642339a32ed4d085ee18b9b9547cd453797d7765228ae6d1ecbfaf", - "646564d78e288f0003dbde1deed9a27cfcad4185f7c5863d9a5fcb294c591cf4", - "b0fb9bd22cd7cca5bd290a0b45d43be0ad8bc6a76d93ef7143f0e5be982682c2", - "78c984733e51fb82a23276fa96e531f4bf60b357b2f902def8dbca77ccb01c3f", - "2e77671810c8f30bb875a2f7143012ff2aac54d8e877461b200ea94fe324901e", - "0ebffa2c41e1db113e0b628cde590b2bc964e28d276ab58972d1e81b8b50cb72", - "7c7db5769e43b5d3fda7e54be8e3cded884f6b16e11e665221478d41e83b11ff", - "dd5441852d87de460be02b0a149315a92397863037b5758170d1290f9dcacdfb", - "2af0afa8b615bef038541aae1c4801f5aa7978c3daa6269a5e187cf53e7f5a9e", - "81ace6f20dc71e2c7f11ba192431197cbba6e0bf9a9400e8a39a7a89abeb8f6b", - "e950dd8fbe788b1caac125eda3bb971070f0dc056393d91c9937ae4158bf44b4", - "490d5f8e1a2c9e7b4bc82a21f9e05db5097e4d8fdbe6addbd56e9c998e7918c3", - "11d311bb4c618c9d5d87c115dc545015355a5e65f341533cac885e58dae0db79", - "34751c70ceeb90b9956c39fe89d3e220c5267413dd5b2061d9c4b8c9d9148822", - "0b331dbe269733582975cfd2c1fd647548686518a9d2db3f4191c239fa763518", - "85c911e19e8f3ca2191a57f082e1e2ac176c58368daaea01828a45fabfd2573c", - "943a04a785488e45aa67f077158d5a00c98a8015537c02aae7415f18dbee1683", - "c390d4f43c25e4786c900b29e7a0ed8d7f9387675cf9e560536f84fe6d8ea119", - "cfe2cf0e830606ac6d33e212fe9d3bbdcb231d3e6b8aab7bb0bbc22782b05cb4", - "8e2d517bf0b61c0360e9237ec0088f62440ca6031b4c4e9b5eacc57dc74914b8", - "5dddf5251e93a18385376a9c73f0675a820f1b558802736d8d813d49747848dc", - "db719b260aaa46f0742d3d6748aca2fd1bbb2efde3cfc1fff5c45bfa7549abbf", - "14745cce081eee53adf213bb1a98d9eb7cc0020168e8d2ddf0961aef5dad1c3d", - "8c506f2fb2088b73757b521591d9e4056e21465bc3dbc3e827df4dab97e5a10d", - "df0dd561cf4a5f3745515c89a9c92b57002a059b7511e1e6dae26b36225ad2b8", - "baf7caf5fa6b3e8d11ed90ffbc99f7ceb7dd3ac43b128f19dac0e693720c8aa6", - "3988b1306fe289c5ee877124e97e5b830b7f719ddf2f7ccae6e0c46ce96d1557", - "370fc2391f2a56219923408fd8631e9940acced0f8d1cfe1ff5a3b3cc562075d", - "b2745aa0f739dabeeff9edb89140045da9f84be115a9264ce58240747bae15da", - "d5485e84abecd877488f6173ffa5d9dd4b0abc1a3080b45c5f0d21be58879bc1", - "b510d56dec21e0e6c449b9f68c28dc06edd2f54149069747fd2f78ac212d750e", - "7ebd54227809fba2e35430228273332c4807a2d2bc3183ed82f3ed25078d46a0", - "86635675f5b09d2bd1fea32025809c9c12e225cefa1943ae49be9e38569817c8", - "d35c7bcb6c38942fcbeed95e0ced4f548dd2b71bf6af77a0443ae8f88b139d04", - "73d98e550401576c65aaa4ac705f7a653479aa68d005a7abd056bff37ad06208", - "ce39eb8cf7eab039155e8a2d5304a5a307d9edf4d57bbbf88a247409c4c0ad8a", - "819891c61261c4cb4efba74cd297e9fa5be6275258f93d0ac8ae42f3eaca560e", - "3ad6bf5d3a15035ce4f175b2f91bcdcadaa39b0cd0ea75d31f872008c5b39eba", - "bfa0edffe84091f5ac5a23af238ec777fb4167eb1a9446ed7c4527e5383d21c1", - "5361b06a2e61820837e673a6e52f08491f48bc04f4900a7cfb8571a6e586b831", - "e09c21d0cea033ef5ed36d2c5ea3c855ea6c99baa2611ee15ab658f064a1b7b7", - "12697c192f2028953a570dafa24462d85bfbc7140d646fa7255b3fb97246e4a0", - "6b281e4839340fe81a1162d42be24c95b0e3fc214ea240d59ebe4db6e0915bdd", - "84093d9fd8ef3651ca72f1a85e79a3bde038773ac858459a6d66d015a143f27f", - "2eef64f2a8e1b295dfea8e9e5ced079001b248415cc4628ad6d66d67ee0334be", - "7408d7f028aeeed4b672b6c4d96b111d7a9b847ad2602ad08a012e72e4ff5436", - "ea14b11e1387606361b9d5163023ecb479f0e3d1e6d921e65bf70744fd940929", - "b05051e8622b2dca80f604a09ec0be03fe7e440d261c43b45ebac5a642ba0af5", - "ee09546228e09b6f968b71ccdd164163856db5115259daf63473b4dfad4c7f00", - "0b7a44212e9b3302bf8967390d79d52efacadff615b07cffec8cf506ce73a926", - "b636148d2ee2d7e37eef1d9d03b377ed906ca82fdec932aefc09e00eb71eb19b", - "90bcf36cfb2579a15efed9ef951e7f81688ccc33dc7646fbad3c3f327a06fd39", - "973dff8eb9c5682b8c9376c6e949a532c52989235c8615c04395dc8a44ec4595", - "5a818974f66be0e8a18b466a189b88fc8355b2743510f3f55a57b8fab157f48d", - "a6fc8bc8e34d522e4359998dc496a9f7734c2ff0e096710ecc2d88f5fd3a5339", - "9129164358c8bd91c5e8d5e553f31fb5ea9b734caa2c06ee37cb3294d1938ffc", - "9878f27536a2fadb9c01d2dbeec8bb04c5fb29a18fdadf71fb3e3dd9bc410f18", - "7947b0604ce2c651fd9eaaa2d3de3e81f02951b48ecb452f1b915fa82dc7d4b6", - "681700a29ce4f391d67f245cde325f33c52fa0de2682159755fe9c644e3aab89", - "b30733c1fa5f77ec8b0a30d312b8731297b19a0571c5912887cc4159fd9b8e26", - "6732fb06978a3d4fa6b4b7fb8b21e8f31fab7aba71028fcfd0bc79d18ba72a59", - "dee7234b604b82155a864aa7acf7c67b870690b1425548ca06c37ea0eaab3c81", - "fbd57dd333e0ff086c4ce00c62d3f4a9a877747a6297f4696c30284b6e91c347", - "ea0626fffca0b8eefcafdc46fb28040a60727a978701d502eb8128b106813fb1", - "4ceacc487ff80945b8a275badd9a38569c64cb06f318fb9727be2731303092e4", - "049a62035adbde7431796967a6074fdb439c0f39999bfc827959aea319f58010", - "2521fb27cf28b67ee1a5e4b4af72812ebd0ff27eae8c3872a416c688fda11d59", - "8554532176f5d6a70515eb6df992ee12c406369c3fdb48e8552c04474bf2b43b", - "381e67f09389d456988352153f412b462bc97c730303396c884e2a9c33b74393", - "762d6cec01c256c85168b082fe69c2b75eb9bf09e087f8e8d0ef148be35edeb6", - "ef7ef433653cf10e76bbd310b16da9bcf3e1e14d04b4cd8203ed4654e5612c0b", - "f223855296f9e0d8f59589034f582d97a71477fce7fd8047ccf4e5aabdadb8d5", - "af9a1c852cbb22db7c493ff99dd77cde2156f11fa4d450fd9b4460ce206370de", - "30dd608fbce950adb623426760b4377493983910bca08958f64891921b32d178", - "ebbe242bf2eb02cc54c53dfdf2c86b3445545cdd84e906588f56f987e7a621e6", - "3cc75d95356ed3544eaf527d5622293c38cb588e66cfbbc570698ea63344ce58", - "816eb32e1f316cbab8c8bd1f684c228e4209b70a3f2a9ce916d0e87faea195f0", - "10040dd03ee33c9a8bb54423182f4b2aa2d0aa5a99805de23992acef3345898c", - "1fd369c965555b97bb0749e6d659801afd0cbb210b00dfe7cde7167cf141e32d", - "91e79a12643f94598306ca85e0d34f3d9eaadb9450dc8d67681be20307d14036", - "7ae6e4d0b4aacb80c4dd9d4667bb68fa81e412232603c430b06965f9dcb56e42", - "0ffd5ac95d544b5bbbcfea74ebd741ad10fcac5085d8854ab256b77b199f825b", - "2af7883e7dc7d9a57f45cdaf31f7aabb506d00efe929ce75a3e6f988b3b39920", - "3b2d2c8ea9bcf3ec19cd6b9f67d1749f43de4228531a1662110653d0c1a55d1c", - "8fb6e893f9efca9483491605d1d35dc120f2696080042057146331a6224d4ade", - "6971d106312f484919fd64ecf235df3217ae522210f1238cb0b7a758870872b5", - "33bf60d765b94d150e20d726a08458b901dd4f1b144557c8b0049d93bcf181cc", - "269e1fa2c68c145c68cde4e28d8cf4b89edd6463dbfbacc4b5d07abb0c1a9eb7", - "e05602cd5434b38eb14529a3a984903912237f0e25c513e44deb148dabc62480", - "a54015cb52a7ef889f9d99f93414037219e55843620072fa1d9b7a58145ad5f4", - "0c5f75a97754269170b144454489587c73d7766bb6f20d286d6fe84ec1a61bfe", - "1a08292025e3f2c6fcbf5c66f86d1bb7e4db6e7abfc351d9414b97f025a5ebf4", - "49b534e548f5f0fc9c8e81d9865f7f65749e083ddbe21693dcb87cc7624a0c33", - "c9086de344a83a706d1b7fe25fcf53de641b3098ca008bdf877611d91ed2e091", - "25ab6fd1235de3bb7fc74f80c550fdced236c43a48ed35c164601a294c95f9dc", - "967d53fd3f864e9dd0ef128d0b8c116d89e0e8984eecc5e56a8dc0382fbe45e0", - "2452883880c3e2b39e51d7081ef5b49f29a5ec7dfea0ff9af6730c479e3c3c55", - "570c7506adcc009f99693ed7b46038aecd7ace52d369b822c2fd619a5f243c80", - "feac4103e9fa34e7f3da23bc54691e0c9e60e0158e6094afd3a4aa5342375f60", - "c65bb365b9d639c2aae58d52325bd232839708b3c09a838396a597cfe91dee3d", - "a02a9e7d27eabf8f365276a61241fcfd37b812f0451573bfc7c72a3d41b4deed", - "21316d5d6b00080dbf09fca2253cb98fabe030018020ecdc612e9ac1418304cd", - "bfe46a35a38170bb31ebe8f2aec76b8a199628aa21c7503d141ffbb0268474b2", - "c61605882c291b40aba8da23807de94ab7a8bbac8c7594f5b6209f6af6ee7a4a", - "8a01837c803973e6fc5adfb58a54d2456d5ac1742099f1f5f4b8205bc249e562", - "42a73cd2bb96776d92f04e017db20492a8b23c32417c00c94d1ac239f7f64bc0", - "d940875bcd2d7bc5a2aee91925b6ea75a128104ea5509dba679560ee27cc9c2d", - "83ae8169e8d38e4ba40fc1230e98198da209e327c552c9d06ab59cff0711e017", - "c6a16dd03d79338907a0a66105c0c90e7ce42bcb71a74a617fd0a69ebde15299", - "2e376b7c3ea705a1ee0f7aa7f0f85c6084f656a6e3d2e22f5cd6dfa8ff5cfb5f", - "4565025779a54c802be987bb15dc324be8385bcf77c911155bd1df12fca9bea0", - "a5a9d575c8b6fa68ebe04009a13192dc0f6ac9b6fa26cdc2e5f018a5d82cce67", - "dc5f1a278544421b98bde49ce7045b4a8dcc426b11b0e213fafa27d44e69caf2", - "f14a4e9108b8b127f3acbc5c24977f7ad6878d7301f22c2330a8a961469c29b4", - "26565f9323a69d8b042868c474a3f1c28c6e188dea5d148f00273bdf2d30d160", - "7caaf52399a4e60ffbe0d79daccf73dee0525005732f84323b6bb200693ebd60", - "32cd39d43be5fa0b876ed6ab20ce62ce281fdb0586b0f10da5a65bb67dc0dea3", - "70abfe09bc5e2f2a2a4fd5bfb9208a0c8e04d3de49053253369c37bb9fecd944", - "e11afda9dbea377f475a5b116db4e40eb350fb5195dc03f941af7faa28950668", - "906cc3624403d81eb333504f71aaf7d0e7f7f3452b06e59636aa389be64f0b0f", - "dd015268483e3d58829eec4a0826e9b3332fd193188ae8861ba20231c8f71e39", - "590a0f4137468c82e10547b7a381b92b52b5eb8b0c7a4c8768222ccb1da90c3d", - "83f950bc8f7fd79152707d87bf30bd3590229f87a68201cc56f706b340334653", - "0b6056c4955ba71c02613de06b0a2832a71348598ccc89aeeb684efec13b28a6", - "a476964fa6b2a855bd20f1ba36a79aaddf8165766ac5d8c43988c1eddede68e6", - "296399e31f4ac424aa29a7b3c6202db96067b574dc9cdcf1ac02f8fc654afd3f", - "bd74897cdc75b7b302e99ab0c7e8a9a11827a4a513369a911a752ab0aa14ce67", - "c7856a03e4cbf6a008bd6aaadbad10ea3254905e3b985a9aaffdd67466d14bb1", - "ff72fc8fc86ef2273c6cf26a4b50de0d48955ffa03a43814f153187cf891eb87", - "2501e22528dbf7d6baa205bd9aef8f4973f4e215b7fc4d5de88f344a6752ed21", - "3cde7f6f27ed884849d1e466d793bcd5fd4ca0d048c21bd7db73d00e8e52bc72", - "29cb6506fc11f5c803a65ea982c64f2caaad31d9e83771b67cc3b6e4322c5d8e", - "68a4da02585431816b29a91815405970bb76b755ef0c030805b0d0e532a191ee", - "10139a23afe28aa20e26514fff905a611579dbd94acec908bb86edbf10df3a6a", - "a6fd8fb9ac542ce8da923dc5188df97acc8c806421f04dc35805548e76deca17", - "ecc1916f7ef6e51f80cd2c2cdc87e1ea009fd7d356d7f4af8bb95fca80b43a9f", - "109e27efca6e75547151f474655c1ec8c80e331a05bdd9fb91ad7b4c55a5c068", - "105c88f6d78ad2e6cc8528fd9880d34cd8ff26bccb60be1899226598dd1e8cc1", - "3a2764c8766c82c1fd71a18a34921243d3f2deec9b1ade8acd0b7691ec9c81f6", - "4687aa482f44ecf8a986ad9a7587f672aa3411307755edbd5909c86d6655eba3", - "97e4eb61945f1785d426c2656c2a9a80409285bd0a69b8117c0a7f9dce3e30cd", - "cf7653c51d3223f297c92b3c1f65bbec42f08d17b5febaa97d8539938561d873", - "17ab7109ef9b75f530e58b24534d7645cabde680d2657987d65259491ada55c6", - "2dd0524c65876933cdb571fc68bf292ec62fa3665280ccc1b27c124c4436da53", - "57ba92e1a5d34af3816a5b83fa00b9c3873048b554d2e3a9e51b6ec10098f69e", - "1a997ab1a761734cf92f0fe857d0861fc2897238a8e315979120a1c65643683a", - "2d61c39634bd51bbbc2b39536eb696e56a7dcd7a5b097c991ff6f00bf8042ffa", - "fe71cbfdb74c16d51dd6d9b26d9525fa7f46b6f9cb1712696494b54c9c4a9acf", - "09f167ad01862780a14498dd744b24399c2f4132a73e38cb9077dc866b5db142", - "2c133bcf8c222e0be18f2a81c66df672bfa5677a96366baae6c8ceca6161af22", - "1334dce3aab3bbb6cbdb62a1cbff8a99baebdb7ebe08989b8a0bcfdefb528dbf", - "4fbb5b2254857bf0d5ff56dfa2a1184e80636c720a2f1c61f51aa3a22b3f1c3e", - "89444213266bbe538a862d3c3efac139722022dcc04d383eb12b518299d249ce", - "608624b9326c56c2606418da9f950f8dce96583ee2f8b5a25aec72297ff3ef7c", - "8f107296dc64b4dd1e4e865e578516b3633ee648f74ad3758e2c762322810ed2", - "34addec249f95c1e0353a180f2ac62f96901c49ad5f0beffbd6379eed21eb35d", - "a9ec9f6fa1027e3586e966c1f2679c64575c9215709ffb06655d569494b779b9", - "fa2406f6e171038b77fce86e35b690ec4d506eefc3a6d62eb5c429703ceb7a75", - "e815b6aa396407d9bda1cf11fcab2a83c257d9c02449d5edd4836ca1467114ee", - "4ca31659084fd0bb96e4b18cd62f9dafb976767959c5739a21817cae4de6f6e1", - "676ce35f46d1495a79dafebb8330a8a681fb3680bc21fe982792d9b8a1706a5e", - "649531cd254080454053b9692f3cf9c49b560ec610c8606e30a00a13684302f1", - "0c7508c6d9f40e3ef42bc4eb4dade997854be9bca05d86774bb49ece610ae80f", - "b3651fa209ea89361f885c3b6e106db52a2257a12b74770a105ceabbf7d4eccb", - "accb1a2215c871ee8a88b119aa46df2137f2cf17a1d33a892e6540064914f41e", - "2a3c20fdad7f0642cd961cc7a6cd35b4bc732cca36c92cc21e1dc8c3e8e704a3", - "e726b1de2594695c69eaddb3459630c2266496fa7cab3f0a38f395c5da0962cd", - "fd4c808f0d94c0dd5b5e611bcc38e85811a111aaeaaaa75e9c7b39442c4d0e3d", - "70b752cefe17111dfca292909c7138b356bdf22120741e63de1ca08d7476126c", - "31e6ddb99e881e56cf30687b215d0bdea58216340d4219f8b61aedf850a7e7a6", - "2a8c3f7b5f89b9b0de389508e2d60609125c08f05f5e1515082ca2e99ee3725d", - "e79d5b94d2faf4e859fafaf20035690de7fd74c49270e4dc8161117ffe62c298", - "fdb3df0c25e5eea231c2e8f8761d62cffbf8debe6ec6f86f72ad25157e999d32", - "dffde02a83f3a1b8d6a73c5be98e0745d4844f8e705aa0f57cfc5f086a40f874", - "752222f87eaad2377792a784f4f8f79444e8b93dcf082fcd436efc03c45826a2", - "0e02517fde7909a305314a38426d44855889ec71a2c7c07e2eb5ec47190ea8e3", - "1c4fca89e8ec4b88ab5cf135513ddd3c40c22cafcd87f39110714ed58c3740af", - "f69e8c4381d71c1de3425536fc13a81bce42ce8a5e9b0f6ddb79775d766f1dbc", - "8456edcd8d94795ef82440cd730ef6a1a62cebc678b2f74607160c04feb8eb8c", - "863af38ae13726e64c3498155d4c0b4e4e599a86b32c5e6aebd1a55fbdb4dd6e", - "5e70a67772a02eb18f3e3f5ed3b87db7a781f77a0fc21e6ab04959189192e4d2", - "acd6516e4568d26dcd0784768294a278f78598f0729e1afc0e8362e620e11f9f", - "80e64e9f94bc02f0df54f60efc80190f0719d2b15ac272168d5d08ae373d36b9", - "d18cbd5dba30a205c9dd3deb90ddb75565c992f12f749f334629ccadbf57f1c4", - "b97edb603541a4d416e0fb574d1ca902cb5373b9b0dac3c1636b6ea0f230509c", - "e413710b89642dcd6787fecbecf88449b30840be0b0e92762142e678053509e1", - "35490bf11627a35d273571d0ea18a23287f12a85aae2975dfa81d23f1c9d502c", - "29db30af9c3b492e581e7bd51488aaa89cdd35d3fd4bb3520f9d56f18edf454d", - "73956b417a1b7db1d6be83c9e42a3d1f2200d002a30085b73be35cf5f2d7e828", - "dc1e330edfe915f24a591d9aa3e8869241cd900aea7b47d33dd1f401c17f3da7", - "79234fb599fc515d1d919d142c009986819adf76f934480e3131b78e64ea154d", - "a2c7bfa470956d0a9ae333a6efbdcd23f971b1c9cfbc7ee18712cc04ab406e41", - "e762628a9c64dcbceb243396872982becd616b1195f64ef304b108b2155bf02b", - "d390014b53367f79a0bdefc7c8cef24891c6876066c2fa5fca181bf3efd9ff13", - "8da662cce56fe93146dc694a2b2962a0cebffaff25d9622a80c2fe56f92d38ca", - "1445cc9d9c8f4ab656bd168d8f9dc869ab0250a1d517b7912ba357c58cb8ce90", - "89f27253952361e26c3b33e5b448c5d76b0564e9d0ec5532cb4e84d33f4dbc45", - "dcc35c31aa191e10b7fcec948be37bfce6c6821f13714a1f53bc5f5c48c1c3a3", - "44a2dcdd59dfe5a920bab33d3cee19d6d6b6eb92a582ee63406424fe135300a3", - "1153545c64a2f391c85d004dc7a430fc3ba798f061e679561d854921a6b978e4", - "8ef7af36a39638253ec8605bc52a182e1b0168b032ced10887b9fb09016864dc", - "93a4c0f203354c43359fe2211ff801f8f31603a6a1952f634293a53b4f0d70f6", - "a4e2779c3af7945431fe0dc39a602d9edc1d892d9036e26e420e27d9e3853df4", - "7b6bb9bd37a8151c7dd320fb65a3fcd70de3cd334e4bc68c221e03e6bd1e01d9", - "b61e4edd067e83f2d5056cbcd0da859ff3fccaa78606c86d34f551282a4242e0", - "fc0f4a94c68068f9dcf83113cc7c20d8b50a2ca4b4ca774769285bb2165a9775", - "365529bb8d156a35a5ecf1a5d76ad72fb5e9637c7f657b9aca15b1ca5cd40f8f", - "09ace9960807ad4e2d4607d744cd8aeca16d6f4270dc642ecee398ce9b89f9d4", - "81d1264548e4cfcf1bee7a91ddaebca73f540f302fcae8d7623e7ce480cb35d4", - "30828b1bec73d0e0feecedc8a83a16c760f46f0c18d6debb0297497ad634ee70", - "29b79c8341943682f4a094c7f23d417fdbcda1b2b69cab44daa474e8bae039d2", - "d865985c216b3e7cb56f5b335e979a11ac2b65a30df97420cd0b644627ee8fbf", - "a1eec453765ac223f520249d3b6f842b327e66a1fdd30a9bfc8fb14d984c8e3d", - "b9a5358e41f7726a142248e3366feee35f94f32a7bf35c46392ecd651331ce92", - "e0ae1f32773a388ba4ecb9abcda2b8a6e6609a4af1bfc71b1659022fc1aab9c9", - "3fde31ea5f696e45f17d114002f173a36505ebab2cf53606e1b7dd9c3788f10d", - "713f305e9adfbed3e8b2ace2e78fb0d30a5a543172b06ca8bd68f157ee52332a", - "1eeacf04acaca54723cfd1a9582f3e1dd2fa1cfd44633192ad8d41858f6e2071", - "6dc764978ef5e08a575a8eeff07d4f1907bb7e1863bbb91f6cc24d0c3234d372", - "99a7015a5530f529962ef32aa56b745fbac47cf727d979254af061ef3a1761ff", - "bd6b95d36b3ca38f6b5894262fb4fa579ff1774469f24450dde2de99af5df598", - "d21734a8510fa3d2cbeab4164d04e2484131333de53ee9ddd531933d6da6d722", - "286ce6d4d7db134e8f3b55a562b94fc67e86be23eae94599486e8f13a299465f", - "9325aba4091f1735e51038ff50de519c3f528fbcd397cbe8b653b1ed65179260", - "013dd6823f86d1642cc41985fc7c80508b4bc882e8e56ae6da4ac3423215aeae", - "8c4a10b0f9f939ad7e05d7f3d970e661857b09a5d39fe7abd47cdb91ddca7165", - "f4d42c7cb6b5642abe7a4a7dede40ccbe476c43cd8da9351bf14fb6f05e23ace", - "5b34ba8c4b4ae52c0c8224b89d435b2219cf2bfa44e5bb93914527acd344f6c3", - "3b8b07eb5a77af854425cac986849c935cecfb48e8e7a6d336c066a03dac38fb", - "fe38c9b7187da34d2f11e04e3101e96aede72457bca2a7e1faf6103a8b94dd57", - "e393d50cec766dd8b7a4ba75d343821d7bba155358c07088dc22722a25a8189c", - "e5054b172c4e326ff17c7420b68bd41f95127476e448b250d113a1ed7ddafd83", - "c2f3946d999f4ec124ab0544c5d2629e9faf7acbf8285ee236e1b2cc3d95b20f", - "034959be5efcac36fbbb5c8a576522ef9d72abedf473c176ac20fb8d95dd29f5", - "7581c15197440a5781f15bc32a4bf02f289f8af4177d670130babe28a74038ea", - "175a826fa7843f5785b81fe9b2b269599bab32890705edcb9681df85170f9d4e", - "68b2aea8d33d747e92e6ceedee14781f4326da6151182ecbeefdcb7407fe89fe", - "b8f186c36cfe6e34ded58256ed149eaf3dc26ea830afd52c72ac0b1427d5603b", - "a7cd85525fcfd1e88fc3da46905fbf80b0f8779b56c914d62ca318f2dac90cee", - "7707cac384a707e779b0e5649b8d069a7a0e144a2c7abcf549eae33e97d0608b", - "85055cb09b73351f27b73232f2efe2b3878a478b621564d0a2e3803daf697f0c", - "ab23814284403cfe962f9be1c84e5915bc6971a33efc360bfd2b6369c06a5877", - "06b3dc581b3d03edb965df1be17ea5db936621bbc9f6969f36db40874ac50693", - "205251027d574a01e21c6bdcd2269f69f1915035637bbbfa9ad2e9319ab457f9", - "3cbc145e915f2caee7b0303f8df99fc042d183732eacd57753c049a46e52495e", - "b202a1af8e24edb01b9d685344ee5f257772bd79bac2cf50243f04a343792659", - "7fe389213568eedc2f0107ea9d4be196dfebef489cee2112f802e08af11dd2b1", - "e7c8e843ad7d2e2e6deda99ed7139af1df7610776fa1bc4d8bd19a9035c157d5", - "90999c2a6764e171db2e7e93c602d36d7ec38515ec44629c3e52ad031af81f00", - "1077734583e273299825db8aa766f9d80e17537ac1dabbc308aeadc3cdd88e6d", - "15f8aa7dc2f357a79ea3df1b50d864579dee330e4eb3b057249fb0f538c30dd3", - "bc3685b6f54dbf06f1da90ca5bad3526a84f103469bcca1da62b329b73f65fa1", - "124060e254d633da7cb64b3dafbd0e7e80a044ed3d780fccfb00f9590f3462ac", - "9d61cc705e5ebc756b3a07334a890ed34cbd380817cdb693a2b99a3f0235e905", - "c7841dbb304889a1f24ed018d14fb47870d058adae420930fc3a038e0a4d730c", - "eafebfadb2b8d28e162bdb13483a05a96320a6ab48d0538e8c85b679befbe151", - "2918f911a8655fcca58a20b21e5072b096d89be29486fc79fef13b24f7726d81", - "c504d0e6a7c85d85d9815fc4614b04ebc78c2914c3c081179e6e7d58f3c8542c", - "d8354a0e039213a3ce3318db8174838726ad93f027ff005420210cb2c2136205", - "e508cd6f29684b096b61e23a72703d12708a3d24ec0229d2356074cc228ed058", - "97f28d93d3d5c0e66db9c365a95d39d14b031b5f19f7a42914beb6fd51574d13", - "da8f905d2c6478fa8c6692415564ba756318bfeb273b9a8363487945afadfd05", - "7ba7d4404a6091b0e35bc0a987d52b43f4f7e710bf0cc6a6205285d05bdd336c", - "113d9eaf4ff5701e01a5b4b5c0abccd3c66b1e43355e06b6f7c0df6b10fa2c68", - "66423ac2bf59b9cb9c0ae3516146e7b13687dd7835b524fc552f032ba376c695", - "a6e1d342d76828b85f4ef9bdd88fda29a94c136f944c462268c137a655a82c7f", - "534059fcc86330ac0baa855f92f7aadb5c873f3ed37d66921f5042f5d58e95b8", - "afcf1b1d828535e23838e84025ce05b195ccd538d9d7b0a519728d8dffb99f8e", - "2b7a32102b22f84fc9542638eb66812a94816df15de2944dcab6ef9c9d18564c", - "a2f3701b7ef8b98898bdcf1b30e4b2d5b1fcad112438778db46a6d5871163ecd", - "4cc877779827b75ce022a1e22cebd4e54dac96156539bd01de808288dcad98f4", - "8e0f68cfb1cd253c5697c9faf7646221520a15145d3d3ef1327ca334a2fb59fe", - "6d29ff3e86fa5125f7977ad745b32f348f70b90cbf8bed2785ed165125d148e8", - "34dda732a758e30db2e72227a84d786f44513e89cccd91fd00f7e22d741735e6", - "bbbf9860d615a7425d330b9475f315c4def0f94cf241414cb4a01217fc6a8f89", - "1da3a2186e42114beec43934b6406637553bb1803be60858c26e9b798051d1d3", - "d59b5beb8fc30badff57c62fa54ba1e5e5c517c81597f49a714ea332d6a6b8c4", - "d1ae9380a84dd42997db77d8b8a3c8c9d0cb9d6e68209da239eac066ae55d331", - "79acb010532595b38e9bd0c85a7fef1675b7a0621e54f92858abfe9eadd9ed16", - "fa5c9d8160f65c06c3069146daf183aa450eaa14a4deb22c892aa808bbdd83c3", - "c4ed11632db23a1cdb61b4030d961c3c66471e05a7eb26807b443d568289bfdf", - "f2e6a61b8cf12745aedbb88c4e14346b453478537ad5e763841782ad1501f069", - "37132f8d55d2230bb44e26565bba5b88a4b4f538af58cb0eb08066aa4c293729", - "64517c47366ca0a3e1fa3da449e75c58de70dda84beb2c8070f62c19e64b193f", - "bc63abf835e81d75aca343d79de52292fe6aed0fca35545956884aa345456db3", - "988b63cbbbfc0f09f361c9ed70b70f33de58d5e852814e45f8782c2851d371bc", - "afebba1bfdbe6e85df51be740dfe3c9b87212a41e1b76b2f8428eb9291724a96", - "3a543bc6b55eb542bf314b4d05a93905ea3be4f7473e8ff0e6e3b2fab25106b8", - "224f382fb6997632c1cdf14c93898404f2a43758e395285bac98a42fdbc6d0ef", - "e6738c96821e43fbb72f274be0f8b3d3b2d3b90b543a623a5d5cd49ae35b2790", - "7c70a7dee967891c0e1b9a03ef6945cdb7de5b0e5d5c51d7df23c57e6a8b7e40", - "41e8f2930c59e7da2ba126f56d1d86ab816d11cd722d77b23f21fd2c372bf2ea", - "c5e60a8a3408eaa37898a71bf578eea1241d627e15dbc59f0963b553917e3290", - "a35944c141e5d906e2acc40489ce35f7c600cb3790e9b8e70b36f141f7818245", - "e73cd34248a527cf6c9e9c00a23a98e633581d60aa5ef8e9053d32b571daeef1", - "cadee8e55fd3e11b621abf3a164a0340a8313fb149503a1d1a1229085619c59f", - "7a63788cbb9ed12ebbefb54d639ffd7a653724366ba6fd52b8bad9a8edd3f686", - "e65f6ebc22978e81cff202d442e813ad84ba9581a76ec456eb5fb54ddd8a86bc", - "71003f88ce425ce4d807f755ed709d86597f18fe8bfe27c81b38fd94355f6781", - "65588dc1da3d503d4b3b9bbf9ae4f7b1d66aff910fac89e14923ce4d9b35bbf9", - "1b70650176146f4b67e5c11565b9faf360ea65eb6bb4f4f9847c1b262ae6aafa", - "7f6b4cfc519c8402e9115a292bbf5e03c92e10a0be558139b5da3391a6b13261", - "0aeca9230a474c204566dd65c990dba035ed2a7c45a593330a36ff851120d9f6", - "31a2ab8d78335f22654c62493d99641ef90779dd4d955528ab0b03f1303ccd2c", - "c0bd58a6e951ed0c8b61a245b6b93838de72e1b75bbec7aadc320016bdbe94d4", - "2d6fce27670e0e94d22eae47557d8dfb0495e33c114978912a678cebb7562025", - "2f4632e25111e1f7996b2c3dd1812e31a776b27a400ac6cfe349d0b684ee386a", - "9695cfee8b2610dc087c54b2efd37c7af8a72a6b76a4d8266123dbcd014d6e61", - "724429891469ea8639d6daf8d941b8672611a8906d3bf5825d19e2b898f4a4d5", - "2316355892c69589409cb5e6eb3bddb7d533afc963371dad74d2c052164a51fb", - "1b1e20e1cd8b4ccafa1b73042a38c23ecc5127ea8b47c4f311e2140f024ad0ae", - "644f2cef990ea6f8a1522622a873ef6cd329ab58b12d898c304259e699f3ec40", - "b5ac3826e375420b859606d30ed513eede5ed63f5e2cd4681b84a580e01e6f20", - "97040e02edd1f820715d2250fb929da5853e862edef241e1f7bdb6c9970e7f02", - "7c9dd1ecb2e47ff16bbbb4a596cf6e7d336987f387748ea0b10f9f90e9cf0d80", - "3f498f1cc277896ecf7fdf2c8aaf8c5a8179371352ab98b284b773b1c80fac3e", - "a8d6f79545372f570e32e603b3aabdb4da942a7e5410bf28e39e496370cadf6d", - "26c5afb3f5d8f49a6fb25a92714ea73bad7d0ffbe6a3afd93136a779889dfbb1", - "74b4ab2a2c73cf6af4ae2de2f10fdf96e0b6f729b3dbbfae0293ce4667873700", - "8aacf02c7c0c6bbe307e9ce0ae65d474fe23df61f3ae59772fb04f0c30a02d04", - "8c718f60c054c5ef7fadbc279a9367c523805c1f707750e197a19059795d2948", - "45383c49bd1667bc12854f4183ff28c112dc677907c99f113539f35546e69e10", - "8910522d75e1f1c1abfc5b97da465849fbc9443bda8e9f88977568d6c901e68d", - "19e68fc7d3189f65ad64f3c876d885d596d9b19fab79ae0f4cef258dfbbdd240", - "878161d3c610cd15b48c007f9cc682c35700f75cfb6951009c25b541f5a8d3ed", - "838e05d64d5925d0e71316ef6b34849162f1092596fbc2b89a11b68316b147bb", - "3ceb678ec095f542fe3384462238ad3a984af88e47ef27afe825e96b0ad1fda5", - "4b7b0e2ef5673552b803651d0258602145f3075f919f0122398382694c906af0", - "e9430de13a2c1bf0be8292b537293be44ca11aff3913d95b40f712d6d7fb3c5d", - "71bc432eca76aaf38c77263b53181d9e116a4d433f171219eccc8866ee32931c", - "e78925d1b26a32d68125a6a55dd9f4fdfe5e36aa6071891bb9755ab66bf5ec78", - "e772e95ca39d73e86bcc7eb9a6e1e8a838598855e23ec8c90b0ec4b770f36a4d", - "21e7d3bc54f9f00ee4abe919796037ed3ac2ffa194e04f14a2d04210b23cf92e", - "51ed3d049da661d497d359b06dad0c1cb61dc9ccbbfae5d246fdb356000930fc", - "d7f8d78a9a41e4cbe24cb57244f0d487db8996f147cdc3dda250cc451cefad79", - "81a59a74f6bb9ecfdc54a71dc5de25e5fbf96233ac424992ff706b3452534387", - "63bb2545296f8d38c07388e5f315d799c08f16ba4d87a8e1c45ec9f6fcf855a4", - "07f784652198d50e9ff654cced480ff60222eb7afb60067e138a533d9fc91658", - "e768ad4a9f8b8e8bd10d5d9ad4e04b1a855bf1853ac51970bd8e101abe328c8a", - "ebc3bb04bcf9168afca533578af9d85101e2be064f430c5d35d214343285c2db", - "32da18b88a678e05d51fdb0edc4c76f1a2ed45554d86c9788a572cb6f2118097", - "ccd68339e5b31f61c975200d026e1f1edf141907dabb29832092614c57f2daca", - "aee7016efc549255ad56a02ad6eb63bf2772a31056bc6caba1066ff132ed53a8", - "226fa1591bf002f8cebccdaa2174df106c14fce6e3f8362a1312fc943173d9c9", - "e5a15ffe924798148f6641698d45dc8fcd6bf9b1ac0a2df4f784af28caa7cd9d", - "965bfef95a37b35a2e5d1cc1c15564e4252db20e38818f8c3cfe253f108f32cd", - "039538ebd2dd1f1021e656cb78dac38f0ae31e522f37b72a4363f304a1a7e1b0", - "ff31bbf92c87f07c76aba6faf4d3e49408059f9776699e0b79eccd2fdeed40b2", - "2426ca0b6d1acb84e45c373c0ee4f71a0d404476a601ba996cf911719ff60c59", - "36c91d64e051eadbb7a4888fe3931526ebee90eb745b7b652f8e56f763db48a2", - "f8a753251d795f693a3f020118d415c643e0b989b0989a284c8b2b75c0a467f6", - "a9098c22bb0bdda55a183856921cf97bd4ff52456e9e4756e5551c53fa5b1d58", - "cb5f44afa48b1b732f0414b2ac95dbf47f2280521f67d8017e93c0ac492f5768", - "55a78f763fa3e9fe9f59aaf7c36ffdeae310cb7ebf8e3afb15c8e7a33df16e5d", - "768bb8913dfb231305e71a3ed34ff64c3a8ffa4d9b72cb332d61595bab75ad01", - "2a70d2b9e778daa935686f39c7bca61d328fa9d6f44b6cdca8f492d7a799724e", - "3db0d67f7162c5e8bb31f3960869e01c771834a7adaa46990ddf7a95ce1fbaef", - "21ff14d7e098bff355464ca821367cec90f980fdcd82776cc3f8e67dbb1a76b6", - "fe46dc4652b0a902cb49f1372fedf5b00b6b4a2c2239f680a0933756f847ec48", - "43fa8c18720abcb5f9af1bd099c8271828e98e2ed88ca4657e61b4018889855a", - "77d28b66807645f052220f74efd25cdf21346da1c844af1b38edb6081c4c9f65", - "04906429ea8ca9bca26417f39fa79f722bbbf73ad700e87cc62a162d1e5ebcab", - "5f3b3dbe9ff5b23f102387deba1fd8d81cfe298033afd056a8b6dd1fc7093030", - "fee935aad9d2e1cf0811435c87c90b9a8983c12af7e4db92bfab58788f870a7f", - "0cc1e3a4808f3f97e23195ea738300744d3d1be3f3965d1d4d8e1f1853e9cbf9", - "3fa24a4365630a2b3ff8474b6fbf336ccaf1974be574c8dc10a0432c129b75f8", - "c9d42f7e9b05333e0bf20d71e698a490e4563f0184667ea759a90f93ed7f8bba", - "cd26d128dfc4793be0261449b0790d4966d91657c1a4622b5b9988697c18b842", - "ae23c89323169c559b317120a0183115e9b5cc9ede212ba34756b2e9a157ae01", - "2761593c6b4dd6b2a3761303fba8bdb9baad72a8fccdf90a94ba31783175983d", - "1b6ac828b60b8e9dce0fe206734a016e881096068efaf1acc0426e68a4694336", - "5f34f4d284119749afcb1fac116bade8df8a855c7e5579005d6067edd038b6c3", - "a502c30fd769368d7f03294b9328c3d246db6dfc67adfa150136fc52d9a885eb", - "f4cc519a57979c8cf27faee2fa4f5e11e6e1cc0d5d707e8cc0d97014ddf2e9ba", - "a529b1c6c5140eb6a19c553ca7a302dec0bc9cf01ec3d29b1555406f92692e3e", - "3f6291a8d54baa9b3d8f85e335b45aa37e578632b337737119aaac4d413cac94", - "396b3590788bb345947a7ea9888d4983c018b4b9a534b7246f1f8adb5fe9b888", - "bac2914b0e90a524f9e9b7207b5be42c0d559c00a965be337a1bfd38706620fd", - "8ab628d490fe23f22707d7f4f42fc5c240367d990c058ecc32ca7688d03c2456", - "cc7637a509db67064bf6b3219a92a425ed6639e3ce8aa708b5b923b3cf96c5ec", - "8866ee4a68cbe97d34b66293b990a2690bfffad85251a8f3ae559569a59c5986", - "0a2b4e1b87d6cca653933306d04524160f00e674f8a6f362edf1d9334a1d1250", - "c3c4c3db239022b7abdbbcbe1f31daf5b5e463606ddb0e0c04ed7335b0a2fc19", - "31b850f5ab9e1a3f739cdc291d7b6d8b1e8be95c7cf4e8f479afbc03facfbfe2", - "90ac542476b65dd95e6e9a35b03ea992899164a78815b3d2cda84d4a5f5232c7", - "effe9d6612999d9b16573dc016161607c9a5c6a30559d4d87eecac130d957496", - "0580d7084143905eae24ab751a8ff2e7bc5830336eb324ae6448191e6b55eb59", - "dda1f1a7fcc08249800e42650ee34fc9f8e2c83a93effddca2219fe9606ba18f", - "f5b3c9e10f9e25e36b5aada0382f3c6f47b6aca996185475090c6db1bdc3a092", - "e210165e160733587e9cc375c2e288eaf53db790219945d1bf3e11ebe8cc5f05", - "283e4a08d0dd21580c8daeb1bde8b529759b67690b1982561e8e558de4901b9f", - "07165b116a44d63bdee26b0cd1ecb11911762d497c258a4cbdcdbae1518a773d", - "a257e9157f738ec0a73b39aa77d071d19718293b9e5e4f5db8150d17cd365342", - "fbffb0fefec82a18b8dc32613c3bb2fe82c408a04bd047b5348cc0a972d3f02a", - "04abb052544fd537b2ae5871baef8d8220660e5de3ffa21daec23cf10af17dd3", - "2229f9ef1e722a62444038d41b75112a44aa31bcff14004bb96b8e2a4cf490c8", - "123eeafa55a056b9c0386d294726032b3696df2baed45f0ffb3b67069c888b3a", - "146693ce43be67823d0d0dbbe045c217f1094cbcf2bc180636ba95d11f100a86", - "5b877f52ad98daf04a0d9b5ed530b26f4bd54b06c25dc19518a13a4d7020a81d", - "965136210826921186bc47c8a4bc4b43635a13701e87581c2a2971d568661852", - "829abe0f2d9d7378df52cf9d970654289c18e4cb5deb17e7239461b68097d080", - "c57f29e1f1b5b3ee9c1ea6c5ae5d68371d78808bf4e8cba0568dbb5e24e394e9", - "872fa3a1bc924eb27376fce55035107b8a786b0d815ea57202797519682e3c4a", - "ad151be108db1f833ef344c8763817d3666c804622c9837f1ccc89393335bea3", - "8bcac0af268fda086270e6c8de73fec66a9f0fcd823b903607061eb0e7cc8798", - "eb4573cced3a047a81e61af71c120e07a4b842b26be7629b2b1d3c9a8dc2dd7b", - "4496cd5046f752622854e90cd452187d1442cce5450ea1e959c82e7f58a70ae9", - "127264c14b4e51ee0013e2ecd2dc4660ef0e27406f0d03c4e7049ac3175c0a90", - "9a5b0deaa0d43b3e594bd808c4372cd7c04a22730a53a65f908d1a9969880476", - "eb8c4d6656201a78dd8c4a7b42b8afb4be06adf8d77a30a04f6c68265cb754d6", - "e10c707c8c7035a769c49790638a6cc4cb3b65a80f82647a7fa1d0d8f50b0f83", - "c7d4ab3f14c6bbeabf618db54a6277ded90a44bc67a394b645c562842fdfc6ca", - "3bd5c982f16388144ea8ebd74f28e2bf5651cb8dbd067f139bba4ee685e2d860", - "ff25149b43f3c9731c7f89ce3e8208cda16926620aa707add405a9725d3ca5c4", - "605a936d76aa20f80d77496b403219c6f088ca380969d7e27f262f428745eb06", - "c26fe9f92c728330e6a03be4a63a724d5a67fa8c2fc555abb7dd303cf98a8767", - "d02627ab96e2d2f9fa6b8cb80de96cbdcc31a9a026fcb0c76f0ad5be8e2849bc", - "d09381625e252d0a12dcfc49d59d02744eb984d4afb805b8cdfae34cba4c67a5", - "926d26e046f259fe41f442f7d91f5241d0d740e6f378fa9b565b8468f9decf47", - "aa2a786d665d22e3fce7ced51402a4f4183a4baedf097331b110135154970ed8", - "c0398b4c79d3f5739f759fd1684d90eb8a73d351ce7d707ab59066126bd640be", - "349dee4639be4e430e570e2f6cb4c569fd9c5b94e31da22dbd74339a452f9d8e", - "bbc6c84c5e2fb14cea46306820ebb6086cbd5b476ec47e13fc06be6f9c3b3c03", - "a3764a090e1aa3876ab57ef2e66961c2b3c3a8f26d11a62ca8eb717319c26acc", - "87e5c6663706042a8815c114ed4f42304ecc1d859fea888b27efcae9f88161af", - "0bd599cd78e1878fcbbeb187b05c98c48fcb3b2a2f2e7e00f2357e4f5313a04e", - "3c8f50b25cadfaf8e143aa1ba879a007514f46b0d10f8ee463a8a0af843fbb8b", - "66361ad02a594df354fe9872bdc9177ffe75f2941703f739e713aa8df47d2931", - "63138ae47b31847152b916fd806d3940256a43f77046e45abb5681cd457eb3f6", - "cc7cf6209b6b6f2d7c5c01d5bb8331cbb0acc3fb9524e3d441a6ab5ec1b62b10", - "cae64c45ff455e099711c76a9215b3146e50551f77fbabacefadfdf00a3412ec", - "03b4dc7f77cf129dbaac3b8f21601147ce54d2fe9600fa0f973804ae2668f0bc", - "b45297647e2a9f3e091443bbe836a78d78df9d9843048e60875a5b0cbf1c43ad", - "0ef454093ba5e4626dbcda149e5f8a125a4da6453220c982c4b0611570efed98", - "c04b4ec777f228483b06ffb648e93cf449b613bc9ef39ec747a49a65c02668ed", - "d2d33b8585285be6173f55795b70d0ddc8747e3f53081018d5972ade02efe13b", - "b1e312513a06350147688f99d2fe250cb922dcecca0af686d37dcc62ab5bfa1d", - "85c12c0336b6896b3da11705bada4996ab276029ea9dd75916c5ddb894b6b3a1", - "cc384579f64d1be32d11826ecdd2128fa95979bd9e72a48f0e630aacf7350f0f", - "6f6b0e83da8ec3366c92b6b3475fbdf165edb67039830d8e98e884bb1fcd2a1b", - "0fa15f97da0d16f832f32959eed6b1ac4bf05508e868f7aace3a361075328142", - "446c1a396a4ff8c0f89410e2c85dcc615d0b955a40f9633c906f53b679561626", - "09a77595790b6a714976a658e5f55b6d444678e631877bb449ae9e50fd9a1a4a", - "d0eb2d5f4c6e080dc453d58fb95bc2a0154acb7b6724e703e1b00965501b0bd9", - "680eb37969146a7aa051f98efcb713c9848740715d0cdef1d660a7512b99790c", - "b1df0afd3e5de209c76355f3cd4b80d43989438bd1da44c1570af864cc8cc5a3", - "2c033f03bff8aae18b5e4660988175262bbd7d4ac05cccbea98893088ff79864", - "06a89454e2f47c28136491ceccfff3943c3bafc6c766a8fff2596c46c9e75361", - "948fe28288fca68bcf0cdb628bf397464c66b433ffe1b3b8922cd2ffb6f6f5a3", - "7e22a62b6e571f774d42939a80289b14e5e6040e04fac5ee12b0aecd980bcdd2", - "468c1cc40a5f14772cc500a3056bfcb484cafbd8b3f5ece0d725764a4c8719ca", - "5e96be53874e7ae17327175f94839c4b901b90968f6f3a49ddab83d8ba83d5e7", - "aae6509c95de947809a12af38be248af606795fe70c866dab83298927752dab3", - "b592e46ea3c8e8f538eb28113a1d593b1ebc47cc584bbb43524d8b8273a37c9d", - "c1fa527c6dd810f59448846a7d9c7d1a175192fb1fa77348b2dec52336ee4390", - "be84b494f47a0d25c14c0331a6d75577451fb1611dea464115279ab7d92a8075", - "10414e91a5dd5df93211aa3545cfccb5cbb26ab0b0b6202cd0943c74a32d99a4", - "0031a7e8df3cbd73bbac2e982eafe109b7b18f2025c208006f107a01a1c2723f", - "b2df094ec6286901089f972abbfc85d1231bd0d507ab59b4718d1aff501e329f", - "8d701acce12f138e15b2978cea0add9a7616ed5e7e7e1d1a3b3acd305cba6582", - "1ba411b4fd0bc1d2d08a284241c0e9f265c6070fcab0fda72a57853f946d4bab", - "63c30526fe0ec51810f27a3f4a3d5501aa09679b8af04fa426b2bc2c3c3881d5", - "8962ab2d93152f1afdce9cdff474a8406b88c8248ca8f1c157526161cf6f3972", - "f134294060f4410759655a48ebfd22bc8fe39b899dec8950d1567002cc7bd0eb", - "27d65aacf248f4fb9740d4d54d22b1e1f936212b476c06e4319684b0a0edcc72", - "11b543c079116e3ecb62cb7a8cff59adb404ff2372436873fc6ee79ab233ff7a", - "b1b7254bdbd8c5b9fc650bf571640b796aac19243badecbd0cdc8053595c37b3", - "833affc813d79fa26204283b4b15a219ed7d90d1ad4186c49eee9c4771d5c430", - "5886c831d13d31c46c5233a1169e44c5e4c8fb7faddf54dbe9c0affb0875f4b7", - "fe78453f66df42f9aa151778abdb80e9ee7bb72c8ad98edbcf067ebbc0a863bd", - "cac98ccd29f9381f29f2008c52c77063da878aef85ec6a31d8e23b72b406190e", - "22cb3f345383d07e7e6abf169b75ecc22299d9faea9e15c38555d78e0f8c60a3", - "76ec5f190ebcb14ce616d2d25863174ad4102a1b84f7f9ad2b35ae8b8a3d114b", - "7fd0a6c97d46b593e7df9684259bb855c795b8d46cab99ce2791ca157fdceb17", - "5f52700b0e97983cdfbbd14e4c6530c5623e227855371efbd3de02b76e88e5c4", - "25268bae6ec4939977f0b70d7c505c65b855da40b908a5d81b728a64f6c08cd3", - "a7c45de771d6bdc5395ae2cbc772c206228c467dce96f9f2e8476fa7c17aeecd", - "48d7cb498c66d276541a4fcc0cfdccf921ea2672d9c74126867c2e6d411e378e", - "b117fb64adbf739ee825734b549729176afaa9c7abf5ead846ea0475e63d53cf", - "63b6b7d8d1bb04addffac3f35a43ffb7f657f2444ee0a772404d480c8c1ffdd8", - "fa1c0455b2dc96031ce4173dc35b8239e5a3ca593dfda9f9dfe578a84d594fe7", - "3cacd975a46bc33b72d1c1315d49320ba51cf20f7b79c02f61c2c8e6ca7a69f7", - "4846653fb2dd961ab7b3a7981f37a00aa40d23d106197ac2a07c3612a4d6d869", - "9f6ff4c45547a545920f4423c58c04827975c39b20edf2457267ddb9280abf6e", - "bd799585f35464618367c980a8a4c1b977550834562075c7451261afa142a3e8", - "dd26dc2dbc6b1d8af6597439a380261e744d9b669aec35ef68e7a2a7e00dc938", - "6aec57ed41b4805da37b16e530996682d49b644cbee56c5304adad0a1dbddb3b", - "b92a4bb43341ae780aaecc0190524b68beb0a2bc7ed836892771cf0faf1292f3", - "7576c502a3ac99a8151b07c8e95e9946d49663788f2e3c824c1214195dcde4eb", - "55d88630932add51436b605b0a93ba68029a8ad14e77672204fa02bf250c6837", - "6698e4f24c6e7de2e58f97352b15dd460ba8a13c1587d024fd13a21619bc0e53", - "a8b02f3da22d90657fc4f28503692847d446f9edb088fdece160f6b225a94f3b", - "7df68151fc3e6cee87b83da0df52df32efae1f93550c61eb6b08f83c7aa84f89", - "bcc120f3081930377ce2fac091bf58f864cf47dfa2cfd99277bc119726b939d3", - "7fc433cf46e1df23465aca9949db7b2b8a2be7bb4809ac711c8d9370cd4df803", - "0fff7a495e6c30714f79168d55b617c2815a78f9187d53d6e56364c524a80516", - "146e0880668eb037e9fa6ef25926f64428bffed89a84d8c6b7089a5f264df882", - "e3d38be65d9eb17dd7f35d4b92fc11c698054de5a2b31c9629bba1ac864376e2", - "536467d04390158b23f634860f1cab4e8c4c5401d924064f93de1d46e4ad3630", - "ae1da5757be652c59c3b2c1183bb4fcff147fda0046d2c2f14e34df13ef034d2", - "74272908cd6307e331c7d5a46093f5bab54b799551c412a41a4cfe48518fa3a4", - "61cccb44ed10421dbe2298dabd4146fea011a3580987846fcce1e18f988272df", - "6ece73b624705f21f3c6b3d507f40b3be6cddcc017cbdfafd5f656fd3a0688f2", - "20bf22d4efe869c7974f2fef450497805c646fbb09c372fc5aef5e6f056364a1", - "092cc7c03da1727495078bf2e98d76c83fa6616339624fc20311517a4b2791ad", - "ae3a7a3ba291eb63d2892c685c951191775c5e8f4cf74c69ceaf5736e94d7194", - "983e5233f01b16b482c9ea2b300b5a3bc09697f6da1f98037fffc4d2b8b47d02", - "740074ba2402cbd3be4c9b04abaea132254dbb70e6a0726b5445ff5e9cf627ac", - "deb2bf67b3ad99bb25f19f50b3c2ee370bcd1a783e28e37f24363364883103d1", - "bbfd6b678de32d96de30a1235e88c4ecc18966bf940ae68454fa513a32b8b342", - "8dcaa57e5e0d0548ba15b712799ec15a8e77543a940fad6a43bd7af411f390c2", - "28b09738fce946a806ffdc36585052baf9c08268752ed243575b88ecbc33ad9e", - "224d66c793b5571e2afcbad73edd0caa0ce0de6b2f66abd1ee5d3481a198ca38", - "ed8be5ceaa03fc3c11fa0f54302b88345604015700dfd68e6ef03af5dcec8da9", - "670b242d32038ef5b1cf33b246049028c1a5441602f685fec9db88978e31dd72", - "41d10da4ca6b29f3f97b3ac55237e7c66354105dcd957e6943d74efc9ea1a7dd", - "c064be42e5eb9ac4660b21e01f449649d82f04985020f05bb77588d1f6afdda2", - "f751beb0fd0439f484b184eca97aa768623497e228ad1517557d565391f59c23", - "26af4f5a35c42ec187d0b17c3973495d6b8a5179bb0bc09841fe77eb80c70e87", - "0e8d283539bce5e844d3c55c7eb9376a52354dbf24f4c811252dd003a050365c", - "30178a40707744a95985a5a6f070180599b2aff04f9d133f3af974963acbcef0", - "cc6cce320f2235093bace5f093d5abdd71e0e2a442bf827d94fce0b99a957204", - "d7471d346c13e51999ccc9bc740f952c653d455bbe9f15dabffc6e1968472e8f", - "4f5b3be9a14cecf896c088c5130baaf951565629abaea0e70355c0d359aaaf31", - "d66b56f025542a6125c5b4521e4ce74d639e04fdb9be2faf6330a0ea1a3dc9f1", - "723e284c20925387f20513b77b528623d2ce3d1e47d260299d2eae799b9b71fc", - "b524100685a15d56cd73e665bf6718a492514ee7652dbf27a8317ebb2cdff235", - "0f4243ac8aa588135675224ad5889e1626777c190c19c06e607e41bf3734b664", - "e339a4121cd100c6ea7fc59e2154c56a15f3f686be01e84119e11b61ea19410d", - "a41bbd04aab34e31262e620307b2e64ffaad6522c56b07eb1bc9d99552c1a91b", - "29fb7c2c68d4c707048cfbf1d3057ff9504141ff031e566d1ffa4244d9733961", - "605f4ee1fb2bc1e9212b437b91f4dd392a4542a7095890e1a50c4835f778d4df", - "3e182481692c2fa2c4cd7fa2d4330b35ad5cb728c47f5a51bfa8093e7e52cadb", - "f210c310b78e87045e344c80d84dacb7d94c2fdb1d1d9e7dbad6b15c9be9c922", - "d5858cfec480cf5e666a2410a1aa471bfcc8e14ea67a6655068262fb4b62fbfb", - "61075ab57f6e3b4aaa1d8d331fcc81ec37aa4c96706cab341cb1b3c064b3c5f7", - "6367683ab919049a6cfe5cd449520b06e571879bc27bc36af1f8fbc76da6be09", - "5d7d5d35f30a7cc6534097746eb29990f47f0b8a554d8161013586ea0261dcb4", - "fad9e07abf97b3fdefc6b52460b42366c1aaa652b499d47ff7949f4412204137", - "81c9b259faadc4de9051e3adb8880c339c06643c46e85bf9144f904c16b23dfc", - "8aaecbfc397548ac5f5cc97a5a6f06c57237750c7586bbd53d542defb2f3c6b7", - "4fb7e9bdebaa9c7129131c453293c8e982b77fb6d9a222940512688414f051a5", - "57befa68a12b3f01b6bfb7f16c8afe0a9e48aef3ec568055e709e234921f7611", - "09e67f783986ed310ad12044d9b54f55c110481f9160184cb872bdd75f755d58", - "fa6b986ff8cc1a8a6a7c315f659bdcd071c253b40244ef6c51fdf92765d17157", - "dd0c39f68ffae629e014b61c8ddb8c3499305c9225bea03a2bf525caece7d3f8", - "c07d6b8e3d692a94f76e8a93e3908eff9dd4609e7d9eebb5b9fda483bb1e59b6", - "9851b3b0c96d93a8e2c835a7c51ac487f83c815fcc867da455b9f7ddf5d6e88c", - "b5c1e63a1e4f1ef6ed37417f553773b8a6b5378c2963348342f3f87d5433cef1", - "31f8199b1698532fdb49ee56f9e394de9bf6e69fe9d834fda78667b3cb0e2ba1", - "13a37be252b295c571ca56139d5b74cb90b01d3c303a9cb77dd06819ba170dd1", - "484f8dc11944c9ad377a336681621e5c900e5989c34fef51ce2f09c265236b3f", - "35d1323c4258420a04b775d3cc834690130ba3c7ee8d1cf1eb57b909d3e46d58", - "024aa8599788b047c03903ddbb987b1343aba3e2518f359378b858ba367de939", - "3a63298cae98029946fdf7f90977a09a2718cd43ff149d25b3ce08d3057d9043", - "daa890159ece86f8e0475e029dfb727b1df46679c5f102974518da4d0fbe79ec", - "609d536b8d95dc4d58243e96049fd5863e98018bba6236e3cff9e598f5f061cd", - "e89b617a7a0832cd02b3666d912942876bc73d141e120ef19c750e458067f051", - "aa14b3b5e1bf25be3269c38e767bd23f2bb023a8693f2987718f1281b724833f", - "eece12b1e7b3498abdb9fdc6880e70627b023c1e1573941f8847cb2062675ac6", - "1e6370e1049ff587ed6cba64e8ddba2d3114f3154f083e9e715dd40b8a607f9d", - "88f9fdae3768e28c086d73acf39d884f21f6f5f7fa3f1a4fdc6d0fbd65d82018", - "c1350530075684312ab528f2a1d0db3e1894b225be0b115b35d94171f61250dc", - "c7a8aa08880589a7e77179a5eb76fb1074dcacd0264ecb4d64837a131b880965", - "02cce20a7e0443fec93cdd28b4e304ffcbdf92c6740d3a2edf8cdba6e2fad61c", - "b65fd5fc9c7f2f19b41c9b0b90ee27f29e54b96ac798ced055f10c7e4eeda0fc", - "39dc18d5a89ec471efc3e927a766ca0a6029bd0972f190dc9dce3e5876632eda", - "0a7021af5465252932a7b7cdebb3f8245e2c7a6c40d713971dba6a259928ddad", - "44cdbb3cb6f759eccfe2bd427221295974b4d21a77d42e7ea83dd04af2c1be9d", - "98a0cbbc6732a770a088cfe749aa973c89aecc58b8e12f08fa3463d9d3eefe61", - "ec700f3931969434f6561e72cbb5271f0128ec9d126ae76798f004a66215b3cb", - "fb4dc101861df3c06604ff06c189ea47a8d1bfc225fb5446aafe80d4be5fc336", - "3073dcba6f22808e6d4498ead1ff0cd8c311335bcef3b40080fe4f7f92c14ebf", - "fc1c90b8a7e09bdd15e5ceaf9c287d74d6580f4bad6b1901393d5f21824e979b", - "ede146a6d603d1c09cfc5f0ec7daa519e868541ddee1812780824a2fb25bb9e8", - "8f00b77e082e0f92089f4b283507ad8197e199b1d8f3b983172289009ddb77d1", - "f9a76ba5f1489b2657eb6b5054628bf1d4ec2ff3401e74339b9e8695e67b1805", - "ff69751d72454b5af251b8fac040f1591c890fa907daaa1de40ce1b9718d1c36", - "cf17294a065a33e5801fac5f89c423683a8ca153d26d7e69aacef0c5e3f55d90", - "2596d1923e10f72c0877a69eb30ef321f9d84a2a2bbcceb2c09b66a3dfd18126", - "466187e74e70e1e58ea97d93d06eac47793fdd228b342afb31dee7b63a5d51fe", - "b23f56e2d24aa454e0132b6198304b2f3bc28a70cd92d2778d4206079c3211c4", - "b87c462589ce4384baa605809185dba64b2a6567c74fafc18a8dc4d83c8c1166", - "bb44412ae9305b8c4e5820362fb2de48eadee99b0e17b53ec4ec35e5cb9b99eb", - "67de7c9514a3d5559dc3f30566d77b87da39b722ca22589fa4a6a92ab75306a8", - "c519d6fba1309811336e21efabbe77db15f48a1a7a000c330a86bfe01f6ebef6", - "b1487502400a62e901f762f09e5bd0de0d3f45d45ad77a02d0254b51bbd4b9d4", - "e2409130ca0e9e282edc9766a1e2e30925d1cc57b5152365a392d616f4447f28", - "ec97de4ee7369254b00173899373e4547c99a9ce1d8b9c4aa44f91fda04d9db1", - "959e648395cf1aa1ffc1bcf2156a66e24d7c0fdb97e7b69c5ddcba91510156bb", - "11d11b7f1aec299feff0238a0a497f3d676bfd74100233126cc24f3eb566609e", - "52381c7d3439cc7ee59f41a11e13b8bb57489d91eedc1299cbc85092c9d348c4", - "bc2baa30e4c892110f943f47f4a9f8e5710a6ddd9990a8ef4f8ca930b2886be5", - "ba83ca472df724ba7e84b7f1f6e1d0d0d8bf24ed16d32afb35bec6b65e40bd39", - "1528351fb8df8aee39c5f4bf34550cff434135ad0de797560804bddbe5862c81", - "193176555f3a1911a3f3f0cd57b1852b920bf04fc4b3e582965b2bb3820ea83b", - "489accc4bceceaa7a6bb9bb83641b3c2aba5ce4508abbf7fcba4702977d8dea3", - "5e3e0a74f6d67071f84ed480f22a4fa83a4d459560eb561f642d302babb8b73f", - "b8dbaf61fb80602968eed4aa95cc9c8af44f264f0d5cf4051e4a04c42732ee7c", - "f578bc7ea8083888b9a43e23972697a6f9eedea5b991c9081610becec150be72", - "3b5da8e500ba2966ed3b1b47b96a24482ceabdfe08df4be134be1c6abaedbc48", - "9e52bf5a2659c29510b2c48b3a34519d0dbe3159046072237fd577dbca07aace", - "bf499ab7b6e999d968c36f6e360027cb66ad6803c84e44e902b13e7fa60bbc88", - "dc77543eda1eddf583900f3d634ab6167e21bb8aba9602597ba452619c1f93ea", - "195b38378cacd12f0df341efca40b34bf7bea38a43e318d743043b1dd38352ee", - "32bf7816fb0eac45829139d9026d415f596d595f58e76b6092df3a2437e602fb", - "d6e21990e48ac39bb2509ad5d4f5939dd24d63845377cde4b2f8feb69012fb55", - "1945d7d4a3521d92daabb797d409bd8c5a7bf94d0371e5824148f9c0e7699778", - "4beb7590b0fc43333f3d53fa66d035d823909f43389cabb4132ee838ced10b6f", - "2b66a5b484907bd66b995ab6bf87c964e2935482877625de110f4f8c2cdf2c4b", - "073c8bc7e975e18c5591c2f6e422903eda550b94f2744494298736d8ca8888a0", - "690fe6534efd81a80e1f12544f37088a898ee8b8a65cc73024c40b265daf3b7d", - "e93e31bed84ffb4a0af5faef02e1c41efcc60fa5f98d285f164c4e322f441214", - "705b3e71ddfcca359a3da28aa433b17ce841e60856fc46086adcb25098a95b2d", - "4bbdb764dcf186fb68755469e4249f02e2044f5e1075d6dcd9ad97ea502231d5", - "44deffc49bbf27fcce81322d0219f66f2962bed7d23df3cb184da01e76ad1645", - "a65e0807fff21ce40e3b5d1a8245d74d5aea09511896b8044c91d180019127ea", - "38ba9792798f0ac068cbcd1fa7045af6786e0dcd7d91c9d1ad4c32677003f8bf", - "76dd837c5c3dc8de4f5df9cd865e5cc38338268331d432e8a67632685d212af1", - "f169cc02853f314af57e5271a9cefb1a1988380efab3410f2a12f08f28cda398", - "d8b680f4c878d98e3301219df0774acc9f376094b4e82a54c3f28cb99f5a6f4b", - "c7f77ebd58dd800ada6cc5002b5a129dc0d7db82994780633e0459a109e5fd95", - "99f61a0ae0f685983feb6dd41186bdb4ff2736f960946877c202f7345b41e289", - "c9d2eb2bfdca0fe38158d892960dcb950922c9737cf71ad3351216689a07a7c6", - "882227517a3c54e781f5a3cb88993b67bdfa6a085751d1de8fc2b721ce3c7710", - "fb4edaf0934b58b57eb6a2dc1eac1383e1119666baa98d7605a2315e5b8755f3", - "5f3e426d3402f09847e03db2486105ab469663635ba2dedbcfcf8169d6532a97", - "a866e784321f257c98a5348bdb7b47bd47c7b0d7b0b582371751a171ed977f8f", - "012d09fa431a4794ef322c444d67944092ded64f025a539d2afc32767490e47e", - "393d09905808fe996658fec9a26642e7a847d95be0e54ea089dccef17b48515f", - "5357572b65cf4d3c91c020575eef8318d293765d78a7c638cf4bcdf57f9a0915", - "b0ed6d8273493c9d04b738bc11654336c15d514418965fe07586253e1c17b078", - "3184e0db9a7cad18885a35fa36c14304eb8fb95d7e100dee02ad502ee160397b", - "cede4a244b4ec022e6ef11e65b4d4256ee4cc933530c3463a05797ffa9fd0718", - "190d649b2e75f2128b8347b8ae8cc2e1ebab8147f3a2e68b029a5acd871974a1", - "3c8fe85c1ee9cf7900190e279c389ec1e601407f4b633363c681832fd8d247f0", - "8f3011ba8279d9ff1e9445110d865bd960a15421ad05f0aade352faf82d9939f", - "939ab7cabecdba43bbd4c7e8555e6a0d169d9d8421ac1440dbf2e13bb3beeaee", - "91c1fb127d1bfa67ea0c4df71a5f34d07e6cfd946d9dda411d21f8f5e6c28e8b", - "7aee41c243f2fe7c4037b23b36d1bf401e555b147327bea7475c4a95b80f6ef7", - "98dd5c2fe927910049351dddbe7c2ea81aa09fca4b57ff86a43cf0c792a4639b", - "394df0686be66f834f2b6510e1c5ff79a569fb117ad88ca4b19e569b28c9d4de", - "0a64bdcb67477da5dcc90dbd4e67cb6b3fb1b32d6cf9ab73eea7f122636cbcdf", - "2391b22b80187d3df22dd7428eb76346767e90d6a36074cc12c2496756f28375", - "52b9afd37bd6acd7b5020fe3fa76b5147f97ff94cc57e2f69aaaeabb0616af0a", - "1ed32c3df501e48389016fa2a09b6d44b4246bbf091e38ebdf856a9aae9ed577", - "c214ea63d6b7f2a603fa69fc56c3f57cb883536d550d5ba01c28726b5a4f5732", - "7272240d5a0613fefddb847eb06909ca51ac3e3e835f0ab12f55a7af4ff0ad9d", - "d6c7f4597afc41ade53c4c9c509c6439c56add92cb780ccbb7097b4bf2192e29", - "8134622877cc9a5e4f5efe0e4f7bbad0b94c7614daaa4936328eaa06924d3824", - "508f324347eecb4eca5e090db271b399c9998882afb0be5dba1cf3931b948f03", - "8ed35b6754f7c84fea7280667db3b0ba8c01fbf98dc7ae2ef93a690fafd48671", - "098ddd691e83364b08d13a6405cfe80fced336aa993dd4dee01107d8cf928d23", - "192694037c4d55870503874c1d190487401c2237ec0d5cb2fec6cd18235deb92", - "d5bc3a03214ccb4c4f6c6a0ff1b1dc108ac1a847216e49b01536877cbef18235", - "f0c1159cc58637f570b503022de3596aee614b709dc566c883f8bd09ced0893e", - "1492a4962794aac0f5d9cfe606f7cd98357eca56af8c42141ce661f103762206", - "799065cc19332223f6310b060587daba999ba9334af6f5bbeea742fb1627af9d", - "1eafedfc68a6e3e2fb37299fb5673fc17f1e096c99d6dbfeff9944a318d274e4", - "286bed9a9771061ead6575128cbbedfc4f6ea7116a74c713f2828207220ac0ad", - "b2ee2fa469924b612cbcccf9f441dc5851b099eef6d6c4700d43cbff951cef76", - "8ceb0182c9cad4c96b00f446fad0bf0591e2032e72c5d3ece5db7567118f4f97", - "0be274e2af1c16cf20b505467a055fc0567fc4b9d80d89aba7e5bdf3d7894040", - "316450ed829b20f93c23f8118930fa6347d2baf7cd4321941e810fba8d5d66d1", - "eb3fcda6970bcd19c66f85999d9723c1e46f878a3a7d2e96c9f0187d0798aa79", - "cb6d31321a2625eedd5a5b3e978f79a81ffa688f1a404a2c5998f5af75bae67e", - "770fb4a51cf02b11a7027de7d9e769426466b693baf9b5673dd1531d0dfa6263", - "6f23dfc449a352306ca273c17e73cd6cc24755679ab798c98af05afbd301e93d", - "a798ab92d22f3c40841c89bb2ecd62440842b1966c9a93025c97eedf23d82568", - "f857b2b50a73a0a03fa08108afeffc3fc5dc1357ac5d58447ef3eeeb958aba20", - "de0e4274cb50d3d65bd2f8b28cf77bfa4a3aabfe6d9356c2be397b5c92e17736", - "3e5e3618eca943a5d68fd307a3e05b71eeb2078193174df342897910d8d60c5f", - "f84ad8caf6496613e6326cd3d335a0a16d694d1617acf5fc7a4b2f6ab1a2f35e", - "f2ef5a3b8719b329009c5a469676beb851328ac01e5b58192e072cb6609fe1e2", - "21efa5e2b6b7bb81c88adf8fe0e3a6935aff93b2091e1e4c2ee98fee8d1a976d", - "9347ddbba7aed7f6b5f512b9d8fd5bd4c30f8605fca366deeb835df53c9d2bda", - "555e383968a5ce45bdf887959f2149e88ff34adf7b2b4c73d232f59ea57d417e", - "2f877a7f3efccd33eb77e553a4dbfb20f1588ae9749693e866450e7ce97dbbbe", - "ce7806b3b83999d128381c2a542c1724d6371b617832c1590265edeb905d6eaf", - "385cf08344825205d3be04f73e06000be6e1b066cce62677e549d73e61a4509f", - "cb6f60c7ca63c7bde1bf4898857c40a23ad84c1b5777133d284202a4d665d487", - "a0ff5422a38a55efd2ddf49b6513c1710923502d3b8e491f28af7e468e27add0", - "ea315a78e837858d966da236119c8b098c7f3811c5266ba0fae98e46f75eb174", - "138da854be91aa4d0af3a53c7edc4eec60bf553fe72ddc0804c1d761da0bd2d3", - "c26d0380e79248f5f29912da2f919e39dc4d0e8ff7c22c368cd1c208076b7e4a", - "4a11e9ebde599fc4091b04bd83c8fdd085e7d6ed4ffca8c2c7e4c3f6b041bed0", - "278db7d9301e02004978f67798fea63f42735060ce501d26bad6d117acce213e", - "cbb554581e831cce3728acbe92e70176de8920828e1b318cfe6d839071a71eba", - "0295f5d247f50f69bb7495eef45f09e2351676cc0d2c730c3b82fb73266c2b3c", - "6bb58fd14fb4595633852913049c717d165520ee39be3dba01886b3059d6d733", - "767b0a72cf703188203b1a563a907fc3325b5c4319fa2d889c8de66ac5433cb2", - "bb36d4f2ea553efd05fb70ae5d645dedd7c49c0f78d56f9dee53f1f70b36a43c", - "661e83c7ef778d4a41a6341c7cbbdc22c567114de135560f96c1f40c7901fcba", - "733663e749faadc0ac6db0e9fce80d6785e1a30c30cd8aa1d0e4e03663f9ba65", - "0fcab20c779fcbb055a039cc3ae5f146bc1318f302a261826b7f2630afcbb8ed", - "0d688220714d831b913600e60e3e01e1d601a299963f57f172960f8a21391a41", - "58ee3fcc78fd6b0e961811142f3d87771db7ecbcc2ad9c346468fa8b9732828e", - "cf8fb21ffeb890ce000e2c99953ea272d5b7bcd8d4b14161ee8675bcb596275e", - "d6b278f3c8e3890b2df5e0b9cb38f2aa7f4596f24bde9802bf8da98fb699dbeb", - "0fd7a2513e0003cd09f65f2c6be1d5e1722f55b1ec0a5a0bef33f96ecf160444", - "9e25ffcc0abcea2715f3cbd5e0fe9f4088ae27d0b96dfc38b718e795c3e6e1f2", - "55c7aba67d0ffa297907712e61f52560daab0c603dd6681ce75779767de42ccc", - "5f76fd8266aa120f7944102a0e7ee6356d02690ff0f7e316fab504a380693bbc", - "f938497a9670c12f7c16f68c0787cd7c3877045050fc87cc88f24aca01ac5f1c", - "a26a250fe11eb92c5e8cb5a63cbc1be4f0335b6542991aa5cfb903925d271b2e", - "865bb1c3fb7e4cd2cd6c459c34672de2169caa82c29312dcd5603c8c57dcfd53", - "5d72589daf607054c33bf09d68993b88c17807dd55e0489b57a09b2f34cd57c3", - "ef539c8cf69f74e577180212590d3e6a667e1d4711aaf70208a0ce7550da241d", - "081a2d7671a26bee583004cbdbe694303df6617b6a7b9140d8514c44883dab39", - "96fb125fb0339484f37193d6cda4c036cc93231b8859b75335b21982bd69dc2d", - "25f3e21ee28b46d6603ececb2da3a699d61e734c318289fce093b404d8d7f0ec", - "88c511257b3142a1a74153b29a3881a454d30bfa656fe9f7336a7de315af2ddf", - "d7cb105dd5bfaba878c90fde3ad9bf70e51bbdc42537623fca6af45f399e884d", - "bc81c8efa3c321c5f5ba121283606555df26796f6e0c219be87545970b00fd03", - "91bb901755828d56fbdbbf53f8c51a8cade23cf4a0e74d92c6161c34c16a99c7", - "8832f7f957187f283becbaad734d69ac86417c1a7be114869a1ffa18a4c16624", - "5da826449d8e8f5f1c035fe3badcd153abfafb419cc5d3e241872f888bf06ff0", - "8e0c2ef491305995a960f0a394a37e8c0901e1d3b1d48852d5705fa150703ac3", - "8ac751e3cd08a752dd25ad7df1c45674cc0f754be6a1ccdd130d366a66a885dd", - "866dc13a40903284624597ac70b73cd1503762603070e3ac30fa4407f56edf7e", - "d4953a4d3e27bbc23bae68408460ac03f65a0165f32eb06ecf7350c88442cc34", - "7731b3141c55fb2da5dea9caa44a4e58b794c63da93ea53a6f075eb9a324b0de", - "d3c12b4b9c464adc1cfbca6fa77d7648b7fc76ab775760e8e493721db23c2f46", - "a4fd5c43d8a4da085acb7407af682494c69ba2e00961e79515ffa97e58722999", - "cc9edc38171e89a15819445c5a4bfbb2e538bc223a1713ac56c370d47e72fa7f", - "6ca3182b5950f0079e4028a808ec25656adc80e1ca0195c075808cf10b9f3375", - "3df9e97e0f6911def215d134f988fa64baa7e12d9b2569ae49208d0af5e45ce7", - "7eab58b9a5d63b78fe8575a5c5430abae41640e489f692fc6266cfe0ab9174a7", - "b7dcb5eb86eed613145dfcd38d889b7a1b3fcaa1a9c5553163889229858921b4", - "3d72ff813becab5781435e1d74579716226f928a73c537536cd88b24e33c20f9", - "50b3b19852afabf3e83eb23e66abdf055e67797cfbc4757e7648a51e75b09b62", - "000aeb25b5138e900bceb04cf4489072c9169a86ecb20ae49f0df73185b3b681", - "7eb7f463cbf4880ff991c8818253aa5c7be2122eb6a35944fc6444ba65a50c62", - "3210129f5befc5f494aac6c1cdec9f124a8d37e25c7d80dae8365bcdcfd4630e", - "9328bd633e4ababc64701a42dd72a4ec59152110384b6ac870b07409a1ad3af2", - "130c8e5bc1c8be8a82a145a8a5b131f6cd274dd264b3380f695bd3d6971fb275", - "1eba8360a9864287bd4b1cf489532dc345db5bfc67ee122c2a62b67e1356dea8", - "6be8157f9821089ea827ea7bcedcb715a19b90fa1e7d4301d9a5a43d42b32cac", - "ab6cbba61582192a5141130afb279975117ca34364b4ae24c09a6fe93e8ec99b", - "e88fed74667bb7359e6c5fb86fb241575c134966e9c3230866990aef8fa8a6b8", - "81459121b9d6f4b80ed0d41b666054cca59f5f2b6a68cb52489a323dcb54046f", - "e6a869d9e38763b2e35e7f26ddbe541bfffaab526d6e4413024bf60a790e0901", - "fdeb56454f3daeee9bbcad2789e10a41a785619e0a184573f74a2041e423f5e5", - "a20543e1319638b38ac9093a34a48303c2c6e189f3817d206c1d9293da48b524", - "51d51f33ae550cdd0669075be4a7739e96b33b02fd5ebdfc35f092ce4f40e3c7", - "db73c32c602904da42b562bf5484e5fac2262ec338cb92fb8ec517c0503f67fa", - "2eb06ba8e16b719f648ef717925b9f01980cecf2ecb6345c29bfd790715a1dd9", - "827ca23252b63acdf4711c9dbf16e7f0b79376b0ff3bbcb02c34b889e1f3810b", - "0d0f3c030bcac73a45f61274a73f04db383103768fb8c620a2bb1d7c13f697f2", - "1b6ee93d319b9e8a4c870309b14ff0c52c6c34eeff3a8d78db7caaa6e43e87c4", - "aa86ec30da8c806204b1821fc28b0fb15910a8b1d6564de6b48e4eaf17ef17df", - "d9702416907e0cb9474c4e0592f49f1d9201d229934101e1b9b4b8a5149dc178", - "7c9dfec7c950659eb5104f679c6e1a501fd297e127ef922eeb7d33258b286126", - "b3b4fffaf3043ab0e6170f5e2e12dbf553f6fd5336509370924db942d10f1f59", - "37e57c6f675c8094cff974076563451b6c70137837ed26b28590d637210644fe", - "acfbb16432f1a0033994ffef7f71bb164cc423548177b75147c0d4910b1e4c21", - "23d2196c1b70ec8fcfaa5022be45cd69d853edb9c5524feae0174fea253a724f", - "95ecb94732bae9bae6ccea751b2ba1560f2f7cc7b1f7d2ea440494945e677f7c", - "084323dfb8030f67718047cd9babbbd7ad9bd81dba5a0be8cc2034a8bf8ca760", - "a6bbed186b5a542c07701f9958067d1e7cd40e7b5fe0b9d540ce56a621d130fc", - "92cbaed8b03a3ce8b11b916abf6e3629bc11129c4e9e46509206e875354cfebe", - "4ea2fbd77779953c73a71a22c621af71c9839c6bf512287f4e59071387af949f", - "7ade42db95a2c78bd63185660f624ab538249180aab5862f67a94623b1934a6b", - "87d70299c371d942859ab7b71d2f7b5ffcdeb29f0ddaab36bb09c6e43a1c995a", - "a165b335cfc40cc48679380215604cbdd010fb36fbb9c98c42b8969a6db31efd", - "5e7ed02a1bc5c69a291252345c7e16dafa802729964453e1d8f05c265b0e0085", - "0a238b934accb721db69cfcd7b765f01d6a6532e380678a69e4c8dd15d817a00", - "4c8ee351f6916a900b9c754cb60dc046abbadc0318e0ef97285f6b0ac51ab744", - "bea3e0a38261371629f0ae3aa7f7d32d2688c2ac153ba03d75c212f07692db84", - "dbd59f1faa1b10b2fd4dbe308412eda88aa6f5b428020d4ea90d249e624b25bd", - "f7f1619cea193cebe64b8f664b94ae4ab6f13b318a220f8be8e1d649c4dce610", - "3d98a5ee076ead400d9e97528a30595bf62764ad38b54cac095d598399b9ddcb", - "4bfbe2d499e85cf7db4d67cca8c89c0d064cc1c2792771dcc43b41e951141f8e", - "1d1ff910c1a926ba19c485964ab3e790bf4f2a57da051143053673ba1e188971", - "46a5ca7bf37329dd873daf8c90ea438c804100ef2042eca342467e2661e47605", - "9ad19086ee2a26ef822f6dc47a62d37587afc0eddb413e956061b28507de39e1", - "3634a44db5704da76899fc4adee373fc03290cb6df0ced879c5cc2bd9f4d9420", - "fa1c31a21456bd92000e4bc63a0ca9209497c0a7182598dad5195a90e7cce63d", - "71234e61d35269840217936cb1009b7338858f97399dcc49f0de9c2c718413f3", - "4ff68e9f3bdbe2b51e13eae160c061b47d7791c7b097e04f0473e83fc7d54b46", - "4aa4478cfe30360a522f77ec6e09b18ba71f72c5ecf7a5ba181a22d84c0a36ee", - "1b6887c4774acb767ae9f3c6f38eac5f145ec16b70046415b7efbe8241ae6c0d", - "0684318e5dd0e36c75d7cda50e2b8f824d973d96f3cff4c8b0124752aed836d9", - "551b0f00dc78249076e2f3d94f375168bc9585cafaf7b5d68b90168bf9395113", - "7b7cc1f9770cd2349c2ac81fd9d0e5ba5d3e1bcaa3ab5856e29d0f1d72a6d0d9", - "ab2386e1cda670fd0cebe78ccec5aa1d3be65338a7d9ca0d1fd1e55b20c4ffdc", - "ca061aae0e9c4e38c99c8b1321be43f8d90a705c54051283cda1d26244d3b595", - "63ed61fbc28a8cdbe86158a931d55179fbce410e8b17c22bb0087f466d49d44a", - "8621604c19a75eb696cefe749fb8fdf8dcd645ade235014cdaae8328d623b9f5", - "ec891edc4433ff1fcccc5a49077099300b3d2cd323d8e9649350e8efe8bc681a", - "59c052b7abbcb8e9fb0499cb8a2b9c2489b6950778c6bf5700b3da479b3b2e27", - "9176df3f8a29edfd15c152aaa1bec2bacbec0c46b09db10f62e361431215ca94", - "876eae429df7d1a2a340d008c5e1b7e572351a93d1f96ca5dfe6020a479c3863", - "3469f9251dbac79a1b23f0bdcb563155b2d55e4b77d939a2ad1778f447d5c963", - "5debfb8ec1e8f9aaef303f1cd203527449ee6bdc74845c2441948a0bb20d120c", - "92615347fc502b8acb8a15eb3c044dfacfac71bd990b592e5178b6717225f20b", - "1f908af3eee479c0d260fd462ab06a096ed63908a98d76ac26bafd93f1360d08", - "9ddec9be0775e45deef51a89af67b8d99e2404ee198a382d5613a4e5b60ccfcc", - "8e4e37f136151ec08e7801b079d39dbea3e9fabe301a2ec011c349f410ba232f", - "0b008f95a3562108b8ab581691b406a85059af8bfbbbc6dbfca04b9ad02c16fc", - "5fd4dc8936b873a7273fba443126adc880ef88a08f4367715b432e5a1489ce99", - "ba319207187a0b00cb064864170cbb040c7aa17150c3cb96fb392c371f393341", - "f70ccbdfa7f6dabf3ee2023562d14e0c7498948f514355cb939052811123bf8b", - "9740b64a7b52f1fd63f02f877e54601d8e0a561185f015fedf3f9175fe22d7b0", - "65ab1fee51669a104b59ce346b417f719fa649800251afc40988bd00d2734adc", - "d6fc687b129e04b08f8c15d2bd320b0b559895858266b1eb376da2ebebfcfafb", - "09279abf932bcae062aeef0a54a9bf10621b07c31b00441027a6bb0d9c33ba03", - "3f757e8bca5e1e170b0a9985a6e0bce515c7b55f8a60f24a942491ad3177b88e", - "e678beb17399544ac7281e9885fc1a60253df7ef2b34d05380e6b0e89d3e8ab7", - "3aad51e6f7010518536844461423c3cd80bfd5307ff9af3f59f5e22b2d177d52", - "a910a55a249b45dabae3b8e5e33709a192f83db96fd270f85a34fa27473b190e", - "ca57864fdbb8211ac9536598f5eae09dc96332cf86079f2c413d004637bdddce", - "516ac684ac22f22dba50445ac14a03dd17d1858f699f981fdfdc33ee7b5e656b", - "cd5063cebf0ae8544150565ca7c0e304a14b2db72fff6eebaf57105f09c2207e", - "5e80a8eeda7ac07c6838a1149d736ec530137c594bb26788528b3ccb067adbbf", - "72d242878d7160a2a3160aad0aa4cc97773aa0c2a30c826892d0e3ed8976a2a2", - "2511bd900c7b1f08b4f7edaf8a1486c57250c0065a730948a44aa3ab96b32d3e", - "890bc71b409aa7284965636b36566531ad4048055550c94091363ddf1cf3e430", - "8f56727f28341ff9aefc499030e4fac2c19397d212d21007ef7b462cc94f5e1e", - "62f67d874e7e98903387788ac86a1b273fb0bbd6af8d1006ea9695551b39d568", - "148e6c960e67f7d610b5f592434a153adaf9c62ef68b03fd6570b64701c92f21", - "beb6d0ec5ef5a225848a950c946fffe5774d0d1a94899be6242da5f9442a97e6", - "ef8609ed6fc3fd9a34e7570c2d0d5c9a9d72a0cc44b4693d1a6e69cdd5d60470", - "452c511cad8fa13845ea71124d677ee117d12728962f034450709c45f756cbda", - "f7a55f7776a8127248dc725062c8c8125050f20fd67b876163998460e3344acb", - "1b75af945257d71059a13ca435221b8ade74cea77037ee04fc0d02e893ecba52", - "4930df07271c0e37726dafbcea8789319a6448996c65501da62be4a37810f1e5", - "bff0773df15674891d7e2fc59966e18d56e9f12ef4ba0dffb82db2f03ffb01c0", - "02feb8445357128409cb5beeaf6461c30db5fcbbcd32b8f18a226c1c1e2c001c", - "ef5d99472230fd0fe863a12d8215416e5a472849bf0d2f2c2ba682fa9e10d4ab", - "f6a9a04b1571343c6a59a489a0db48882bb7dcbf273170a138db3e0c7bfe85bd", - "3be0c939370c4a8b6b35cf26d85e1af97665fe6db99587c5d3d10568e361fc27", - "b8d0832541d47fccd01f69b3a16fc21cba85af22f99715c85966120fa59cfd55", - "8437ca3a347095630aeff7b3b33f55dd33ecd684c34dfea9a3aa399317ac2db5", - "aa544a9b57378107c7b5a8a725151591089bc25c4312eb3b2e01d0837dbb96f9", - "50da7e5443fa9f05cf6ca938c5de092f4962fc3b10a4757c97aeb3ae29884e69", - "361a97a8149caa21a2f73168bca95e03be3bbcf2e502d8ae0ba075ee9e578e3d", - "ff7c8769315269c573318a5fa6f8a127a94f2df7d73643868854a49f4674f38a", - "f87341c85f8414e21880d55d27cb2e0cfa7a2ef9ece0c2158e90ff835ed4c01f", - "f05626dbc398a7c0cfd15c960f22f3843ceb5d0a7551421a06ac2cd8c6dabb1f", - "99a12d805ecb10a34e3b5e59e1f6e6ad528e8fe14b45de3b6ff79e10448b05e7", - "2eabb3ed8bf4e418760056fc6b9367ef3573ecb2817b52f82dc2dd2a2298bc82", - "4e5e03c01162ec5022a0242d20805779d52084b5716e60da5c184bd153558aec", - "233d00d4c221956d9175d9c42fd35439ceea7fef244e5033daf89e742fa6b500", - "9e76fb1fee4777cd88e713f4206f4edf164676d4476973fee559e0221b439fea", - "b21f6e5aa9252922ce7a1139f69f860b56f6275a53f47c25f293ff383e357653", - "c96af4e33f5d6aab0fa19c073973798001427ff833e0c702befb1aa3fe14aad9", - "a3803267a3e34c87d71ecd388b9fac32eb8eb71837ccf04630162aee3e2c0e30", - "41d3bb2c65786c205eca65ee68fbe8c981fe374a98308f1adacc9e76d4a9add3", - "7094608c808334921cc552e582e91e153a7c49a34d23fb961e4e444bc2be8653", - "2e3d0ac3292f08c35d2a71f9cc7defc079845de391bbc75b13f010d50179b9ef", - "fa4c1a4b72b0ff7a857de30387a6c31b499fe23b637376f4a49c24c4da25c8be", - "f98c221871f986839d2abdd5ac1a6d60a415211404a9703d517859d2f22c8e61", - "4a14fd250947ede501b9e22c0b91b52a9a1858d6fd769872103511ed45da9bdc", - "64322648246054d6a23917944d54764bb3249d1856b89011d3df8c353dcdc56c", - "862afc3669d3dd8ff063321bd4f83bb4ed98ff26662a8d52fdd25f6d19fc6387", - "ca43d3bcec0dcb0ab438a141f07517c0d88f66f103765e100226dfd17cef0605", - "f21532c3cf0518ea6d2d1835bb21c711905f71fb21080f22dac732d9870c1f4e", - "16f4e7c691dede8d6522caa583f1c84d046b42a3b79d838024c4643453261aa4", - "9ac506d7e2ff5dd92d5fce07adb7773b3d08fc30d96135be9f058a36a934277c", - "3b08df0a855cb6d79d305b8ac4aaa1ab94d149dd6bbbd394a3f560bff8e11379", - "e7a33506ec29b25b62309d919d55b4b9bae593538d64cd414d6bb2f1a322f03d", - "c75c25ceac818061b8b6d9c9604c76bc9d874f72cc2073c5e08a6f29ac05efad", - "10dbfdb7de9f65a23e5c75d9b5b1a5d95e6bab5b01459bcbfa7697736c87ba1f", - "2a910a06bb88240e26507ee8d92264bb5175e61509ea3ebff094e62d65224fd3", - "1cdd9083a283870eba48b182a3e33a3ab493446817a6a48e20575edb94305b43", - "8e92687d92ad4e0afb6de5690cf5591fe102d9ab2559fee6614f7f6e4a2385da", - "88512e8c8aca5c75b0d1435bff3ac2155e66ae39f29e7d13cc2d66b16981b088", - "d947d4e2e722abcb18e8afbe9a634b2a7eea32e6b317fe6167a058ee1c1c189a", - "e114271d35304ba82c21fab5cbd0e8e4f4e49d4016bbe90406197b8174da7624", - "913b229ebd6a85fccbfc968e3ef2bcf5b5a17777bdc05a98070424d9f902ead9", - "5410bd8b71c2627e1f3141932706ad2534785f1e61086bd163c36430e78e8ca5", - "27aaba49592710ba0e3fc4a682edf6527386f759921576003e29a3e9d201069a", - "bcc7b85256e18f377e99411e72ddf10029d581656e19ada170e167cad7b0f1a3", - "ee309903715356ec4e334a78e26e7a6054399dbd94da7a2618f6bea179e5c5b5", - "45fa98acdc871185df4f8391c741d1307f7a56c96178049491dd4b64e3c918be", - "124b4931aede1abf9cbc43805a38d112faaffcf84ace4d4f37503b886d76fcc2", - "774153e590b8dbf93038cb063f51da3ef274397a1845636d8b69e8d63376fd55", - "3126fafced651d5481b6601546aa92c470f01bc39b1430014a16791fdc34d48c", - "a61e3d9d4ef1fe3b78e5a12f28dba958e7814eca7f98804a83f05cf172842cdc", - "e14bedd7e0b1c64dbd943678ad97deec5032d22844511c05da87d2e7a93a01a6", - "8f06bb95a22fefbcb93e1ef4fa90618c833fba035f37326ea94506e14d7d8029", - "88f5cf59e37485625264a7fe2df68afd2c37acbcc9e3852cc86b6522447e8d40", - "8d94d2b3e13275fd67dbca9fd4dcd09cf0ca1e32b79cbb87f1307e7ff4d98532", - "2d5f26d92451b91b7bce0b42785ee2f7903bdb2b4779b21c826e8252bf2edfb9", - "d305dc5b95087a4b8619201ed505a97249bb4ae42a09e1bc6bd3473a36d42044", - "66064e0f87ae756351f6279f049b7f7f6c0f4c071083de86aa20f4724a218e4d", - "3a6cf7997022cac1090b0276649ed4fcc90034143787deaaf43db9aa70a5ec59", - "ac8eac079c487235b490db6aa04d0ca3d7c81fcd563d01f80fd08ee9d4281217", - "8f6896ccb972bc0d2c229770207f9a0c0e530cfa725d2970e03e6964e19a4847", - "5371332ba86a01a1c6869333216991f1def3eca96205ca6e9b073322da2f576a", - "523bfd4145d8884b7515db2d3ad2e93992aa63fd337587da6ae06889913fa59a", - "d30c50a0d8e8a6fb8245596e726ca201732b4da92f51a82b56485fa9a6b5887a", - "26f7aa845e57254be02812c40b961467dbc8bbf19e9619e54b6569d8351489f4", - "56c6edd89d4caf5eff3aebaf26d8cdedad2935a4e7d6b1225e080eaecdd7e255", - "f70187accbd30e7afc9b4c30ee9b8b75703ce3a101ae8c2ae03029fb11817378", - "6d19e490e7cec0ffca338e5c4c4febb3de9d91ce46c717331a9da2ceb0d6c383", - "10a1335ecf20fa68a3e81c70792875c5cf3e2bee53baf7abd7eec1e657736a66", - "77bd6b1938368b11134f9d7976e33d5ae2bdecd2da07b2c16e02070ab3c74d5f", - "51460c197d048cb0ef91857dc7c19d310c218ac3f2e02120570d0b5eaf492641", - "997225041ebb55cf443a0a13c6915ba8ec987d6ad947ac9e81419f91e18d7ca4", - "6248bc306a12ccce6c2bbcec254694c77c09b63230050e8314586585c9f8627f", - "c683634977d387f6cd43d7092d12a2b57b0dacd481622605b45aa02b39418822", - "2423e93a402e5098d320159a37569e58164831d4158e7cdcf4ee4e9fa52081df", - "3634c0eedffa55a930ce7ca551106e8c132c05b305cf497136d7acf6ec9f10cc", - "cbf790c28b61713e0a9b12e3151304295216a67598988d739d31dee27e7802a8", - "58d8101cc60edadb56ee5cfc0eb4a29bbc32fa4b8d569d85f50fde8face49e22", - "46e3f9188153e05dabf85bd295cf9ce4b6738f189157c2a9d24cef2003b878f4", - "1cdfdc716a3d0689cea9a967ebdfa5d2bf7e94f2746dcfc7ca193fdaa17c5104", - "35ed94b36768b9b0a48f50e58690641ff029a5557f77805d724fad3e8bb04c81", - "430932bb8c5905727d92ccc6cf6ce25b503caab3a5c5dd69bcadea050e7af133", - "a8c0f30446dc53e034b495345d80228748411bdbee502e3799385cfd1cd98da9", - "2bf6171f40e8627256a06c9fb528acd9f6d47f2b2c7fb7bf853c9d4277c4dbc5", - "b9062515c29462e9dce92a51f9dee0839a416e4af770fceb47d44d5e9e8ae76f", - "b6ee52b8d2de674aee8fe899c7263a40d285295bf73a40023747c97975ff24bf", - "e80c347e691d288b6d4ba084d764c689d774f20e020cb994372295cffc010a13", - "f8f581d22c1863ab7caa7d0015c5778c9e95042a037b0e424f36fbde328da33d", - "d49a5d446dfee68c4240b17c0270d568adb929ef0c033b36a8fa1e75a196cbbf", - "39c24347e1a632060578df826cc035db9de7ea555e47af77fa8e4883655f23c3", - "3e41ea06a90c9c569c8cfcbe85686487d9d414246ac776dee965ca30581e0042", - "f069a56cab5396be5c73a7df2238e9685509dbc7bdbe92ef6c8bdf4f3b55bfbb", - "463ac6f36d8869e25781068fe42ab0de555c38c2f0f21a38e439cd9cbe5a299b", - "e0ff288a6a406bb4d044e68934f20946896b54af67fc0c4a12f32dc5f97fec15", - "d59d2ae050d47a6eabb20b8fb2ea0a8f270fc050efb63929e1f2ed62fcbc93c0", - "2558429d4709ab628afbb3e390a6d548fcb329c17bf2d486c2fbbadebd079df1", - "c250266637b5016ee5c6a8246b0bbf89571710db31e91d20280d9eb99ea61dc1", - "8550d2e5c5599dd9c7a52671995694c725fae9e594407fdb726a3db6fcb296c3", - "72c1ab4f114bf97106351e56bbda9fe688e270573ff28b7b87bcd759149bedc1", - "338ffb696d246b11c2176e99c6d32d252bf6dfd24ef35caf6729cd9e44e80223", - "f76371ec3ec0ea56212cdf880ec615267c4bfbc57b88c371150e9d8f70d3d588", - "a7f5b1c4cefbfbbf6ae2ef89aa46edff9ac0d1c605d60b6306b23cc848e7532e", - "ae35d6b11da89e30185e8f4043c63084d4f8e139c592947960e1add29edca708", - "ce3a7670b6844df83e2bd0192f044c2b8598bffceff2349db8aeeec2c7632200", - "b5c2900b2253a9ff6b7ea92b474eadcc1e46444c92868183f559d36e2c945e3c", - "7e1aeb3e42ced482720cb2967dec1c9e0b6adb12215d6ed53128887a0b377cc8", - "f09ddeb60d47ca07ecc6602bdb5f149cac33e2ad04553e5a09c3894fe0c1f40c", - "b3958cac67076810fd73fe101eef4c1dd90adf9e953c6fbc803db593ed9e63cb", - "c00482490e93cf1b4aa1e79906f3800714e87a84b955cf6ac8d295c278a725ea", - "957f72732a5844351e5668ef688655b7bc0516f630af11886008771577ba55ef", - "82bb7e7401e2e45641eae437dcb9f26f37924d3ad5c039cb2f13dd9b429568d5", - "6743c26650099405dbddd3cf3c2ad40cb0497c1f3dc3b083cb3b89d2a61388ce", - "832e0dd0ff712e87b9c47f0763ead3bffcf0229ce67f002163a6aae7957ced7a", - "6a75ff56de7a375f9b6ce814b95cd8df8b8c66d608e850bb54d61fbbdff365cd", - "71025018b8a9d4465f6e8a545c2787ab9d4fbef418fac40369be436e5d26bcf4", - "a9a2e724ea03598b64cca50a703169d03178cf8ba0e20d832428afdeeaa4975d", - "4e5f6dc73e7c37873f835418d9b3ccb24dde3179c02bc779818089ab2424812d", - "6057357bd33fe88dd4ffe818a19bb73228131e1b4a47900f7fe9515d8e58fd80", - "0ad53fe3f52032d5508d33ae03e1a6cf2a8a8abef4626f2e7c709dc20b581739", - "25b98955851a7a51ab9230ccc05079672c7045617e101b36d81a3f794c9857c5", - "715040d29e240b4d19cf4bd6844c35e36128e5b2c35185e24736021913e4b3e0", - "d4fea90ab43e09cc30c4588a474ed25ce84b531cfb1ad58a1ef30c3e8806e92d", - "ffa861c756fe927070ffb92f1ed712fe7c69a09d0de7fe8ca765e88c6a6fdd58", - "7ec39e78621572a04c2b08e4698061385ec1bda732f8e6ae4ab067b4e29cfae5", - "22d4a15d11bd5b8288ed62892d62aa93aeb351504e37f9c76c29ea6cdefb8a84", - "5f230d836095bbad236fe43ac94b6825550855358fea197ddea0f9505a14e34f", - "d092db0d017d7841e4c5a1e9351046a0e9695dd53302895ed52b70998f87e8a7", - "5933d906be7f1cc2149bf5a3ffc258e5ed4b77cdf4fbe63bd42d67e68000f6b4", - "8295f5bea00489148d5b5b9c508b98af08170d331b420740155755ea6d714264", - "45c80730417da685b8a31d1ce97ba3464a4f8df85a827a651d3675c4ac7685bb", - "7baba6a9a8810a414916a59a4687c18edfa61597fa20e61ca6f082ba482d3c65", - "1c93badd610d562fead613b8a79750e4151655ae7869aaf2fed6730aeec820e0", - "249731d70f4e1cb7522e2366bba1a94b9e10ca9614f29a98b287fae56608b1b7", - "1dda9d4b6b083477f13af26b08b0ac47c8d1dc6b2b9cfd1ae0eafcaaeb8196a3", - "d7258281700ff78a4ffc1e9d0e833888d01b89c1928e8e16a539b122bb3c5ea8", - "25df12a067dc428773165865b68dfdaec65c10e312b8e92220b5d9a08edb2a7d", - "8983b36c31d5aa937222dba0fd8d48a7600f34a6ce2058bc211533901b70590e", - "d3c8ae290544bb08b64b04f9ee6bd3da1ccf41920bfae5623209da4105ba0ade", - "d27267e8223bea67be969afa2e0b3b4c16626ecaecbbd61c12201f53c8cc0a2b", - "e93d4f80e3e0c3142294e166e9dc326e46e807ba837901ca60d486f4388c7f37", - "eef4bc32efee272f00cc7dde2b80fb0e74f8a31cd539ce9b324c023f0761fee4", - "f77814800c952459c504fbc60ed344c9043d6fe00e9a38ac623d79b5c4a7fdc8", - "843423cfc0d1bb49e26daecdd8af6cb6c00196640a92ef9b7242020479d10bd5", - "82900a50c45790bc981f8368b3131b6de11af6523be7ca4ab0ba3dc495a17c6c", - "9a86608045a8e9cd3fec8531a42356e3e3c26fe28534ca16ca11f2df0b4f7fb1", - "d7173104ec8bc43d075b5d60fba7731740c060755cb02d9050f5eedd4d802c05", - "d72971f5cd69fed1a95785139021540ce8132625f5f6c2257317fdcda198589c", - "bdf8ffa3f4214f7d37773caf6a6be149a2b8cf1404e3402621bd31dd83a126f8", - "13ff3c90f2dfc7473fb3484f4803d68b92c7907bfe4c8e286bf02063cf26c8a9", - "3b3ff3562d79847cb01f0f57e98479c8659551f3eb0e427b2a1f7066cfb46552", - "c6f862feb2b997c9b799571936e353aaa781b882069e82cfa1ee2bf214ef41c5", - "351bb98cf826a292a6d2bdd1c2e49d2f8cc4d5221e0ccf40166960b2f8d7d353", - "961c80e567b1b3fb80094eb1c01d83f55bbf4523b100aa32e1b7f341a2a3d9b8", - "070e6c9333a310dfdeadeb2b927af19af13abd1a5365eb2b704d1b7e746cde39", - "f7c460bada4be13d529fbd97504386fe01e824302fcf359a13ce89133db775b0", - "30bf821fd88cc1dfe57ea46486d52a833ca977577854d0aec8d70de8edaff343", - "4a77a5d11102f3f379ba38bcfa1f3fe0ca9956e917f55d725e54f7dd30f5b458", - "efd62a226d3d6a7b1a96a20c8c84e03ff1c81c23e4702bd2357a467dc0805615", - "824b5f501f8f5eda2c0a0b454cf672f53dc897b35ae1784e5b5b71d131b020c9", - "4c6a382f7a280424dda9d655343e4b4c590f2d10df21fff57b78eea09e8caa98", - "28646dda5ed9cbe701e21ea9bd1344450b84852e2bc2f22df1c487aa4cdab9a4", - "c7a826944930faf4e280cb0d082afa299f09887384af00ebe876b271970f42b0", - "be3cd0a36283be899ddbd8f0c16271cd337255d7d87c875f673429ae716f997b", - "74a9f5dac7d9dfb258a5440b7687c8e6a0a615a1c9cf0a388fc4c6e20413bdeb", - "3ea9935b01b9cff4d5d8d9fea1ab36486949d4b76ffa6744c59824217fb1ed43", - "60650127123f31868e95fcdd371b4c40278efc69896b4212c2c3db2dbaa5fbe3", - "612e9347931432c407a89285428649293b8c0b3e7598a4ef9f80929bac0c076a", - "a92c19d39088868cbdd930ca6874e5572bc97fc27640754f3a5d91ae73749e46", - "78ab64cd9d3ba9a210038b3c48dcfa2eab3abd2a484c0dbdd2ddb358882bcebf", - "c96594c6c53f0431d0861bdf83ff6897f871a2155a30f4e05d0c38577de70455", - "5a08369d3499cad645229c399c9114e70dd5d2e2dd0c3fffe2568a0b41cb0bd3", - "4b24c35c5562e8c7d76fd87b950e589acaeceff567bb71ad401a2b1a58a04309", - "bbfff017579b62646171162091b6fe1b78c45f48ebed01171f26f8c1ee6c43d9", - "43ae4b5adb5125bced85e4105706b4e34edbc3e8d02d94d76cc42ff5a232cecb", - "5eeb4fb703b02998f7321cb6e9cd12ac94f0301d35834af3c1209912dd1b9d2d", - "603f2858fd92b4b72b1961f9a971e3b27efb8c3179f4cccf0aea9b0e3579b5bc", - "73ce7d1c511c8aff2dcf34a39bf574ff5a95347543f332c09cd118376ae506d3", - "cfbefdd237ab7f8f6a2c994c6a8b92d88b705be2cd3bd522d8c767266056a4b0", - "942f1916dcfbd04adf0a8ae8dd29d7c168001ce4179940b1dd123d46fc72c793", - "77a73f2ef790adb4165c22dd56fe97caea13574b28829350b423ad8fc36baa28", - "2dd2bb27ffb60bf8a99b1a6990c84498f82c24e8b36ca986bfc357e997b91264", - "fc5324b49e947047a9fb4bb67536bf03f29b46e099cb714b94a4c8c5b65320cd", - "6a7fdb78c4ff53086fadcb984178e124e369cd25b2f47a7a9e243c864335d777", - "f5c534d974966db7ab693e993b617d5ca24a9e90b74a9664a61bee85854c40a2", - "53b3ac8371fdc26461b9249a686acf7b4f105d4a5c3158e7bba00a5582de0540", - "cd66d252c8ab3159701ce0dd896bf767df6dce2043471b0d561e900bf384a268", - "75b2f828a05edcc7a2369a254c84639f1be94109c40edcd877f940dd227221b7", - "4ee047b524fe96cd06844626eee528972ac9943bbdf05b1e13d147f0e69666ef", - "ab31e80ba05a2ac9cb60a775ae5a0699dcd260826719fe5cf4d9fe082a42db46", - "682d7f7aabdf452ef304af5689d029ef63ced434cfd971492ef31a277acf44f7", - "9543520cc5319e7f14e7dee0c9a8e4dc1e3683fb967c50181d9d843906688930", - "a9e04c48c3ac4497def18a41393706780e3fd5de339355f5660c6617ba1214ee", - "7ee4313a4aed3f65667ca91446f430c0aae81c4485b9a4daa49f785539e90916", - "2a2d288aa2fbdc502735fb81ede0d4be32e9d93d0093ea1908d73297ab3e6560", - "9a430eec97bd8d455b9063dd3365e954c4e183204f89ae0280046c753f41cca5", - "ed957c05e3c728d8b4e93d5b92a85eecbf8865def77246c261b0ab37d79da859", - "20737996c0e6dab8325e8e4575221f09cc25588998d7783126e35b30191e1192", - "61153ca07643611e56ea0013e955cbe1bc76b11a74dc8206adb3968fbe43fb34", - "79801b120302e49d1ea1f7bbb7341efca2b6e0a66c9f200bd722cdc4c4c117d5", - "1f44bc31a92a0f2b1148cecf48e5004acc800af1ce3253c98858f81f699b822d", - "86bbd1ee34a37e63d9efde6e44d74fe9df09157985e08d5554e296fa04a3b3d8", - "80e8fac96d0543c5ca9991df5d7e03a34d91f4807409d5e9190abb6dd9a2ae5f", - "e57db410c2f51bf377f6b363b5acdccfedeb64d35156e94c411186156d161311", - "ebc146e67ab231810369274a50390c8b3dce6f119248fc76d26d2003aad4c4c9", - "fc902f2c169a5b6d3e8005a1373078b426bde31e850cedc7188d6d44a4c4e105", - "d97ca7cae9a21e2b5e3e8c136b5bc15fff9700fcc5af0002cc14307569ff42a9", - "7745eae4eb0d66409067977a57a827a536a0c32cfa936d33fc878f5887a31164", - "c4d57578d82a22d1a0f2cca04840446e6cf5330c257a7eea0ada0833732ff6ff", - "46147b3f06588dd8e38abf17cf75d82a901684827b3659a1b9e2f1d56e8f55c5", - "7e7ab8fbd7ca7f6bb4cfe6c871f3debe508c7c18dd029c8cb58f49d8ee7e3a35", - "5b6eb7ec58ebaf201d6ea8fa093f590573c9c46ff5875484044baf9e30885343", - "850955e476ac6775e81aca2229eb508090f5077da1fd5b13d78aad8ca0fe4de2", - "f88ac7e60c1591786b07aeeab944b96a12b7a97d43ecc92d1c7d2796fccff0bc", - "7fca5c68aac68399b2c64f5529da3b0a4213f0d94ec79a0e5b46fc8bbea222b9", - "03f8b9a38a2f66703c9558fc64e47fcdd16b96ad45688e4da47361158f9cc8e4", - "4ba24fa953e0df1aeb3119bf53fc804d2aa540f927caeeb2dfe3e7474bac65a4", - "6c382464ec09021c39b8ef34b468c4dd6c12542023a28a47bdafc5f1bf0cf9bf", - "a2f2345a5edf35c9965d859a3fb4d43118850b9e2e359e74449a912cdeffbd64", - "99adba2b0d7f872803a4a996bcd2afe787615568f11564860309d9161cf37048", - "646d117efe68685699eb1e589bd16a271bcc954c1e10424e1790d52c58529cd1", - "749d851eccdfb33a256f540d0dd9818c4ece463d9c2e3de3d8fa6e5fddad3994", - "6341817d61de56e3eb546627fb8e74f5cefa5560dd3c6b4496de0598362fd9a3", - "fbf902e2f6b639d4b6bcb8e00732e62e92143156f8270e5789cbb3c21371ca24", - "6903d0b287e4857e245e573a3e8870b7aeaaff50ce8d8974b52fb7f784acf8cf", - "19c3e030a835c4a54e5964e2594ed75730a85197239b78471192a3c938b5da6e", - "d06e033ad8a8551dc8ed66af377922feec7f153e9e208bd627447a955508aa88", - "8301a1cb963b98e96eaa3b7797186ef6fe4d56af0d8568a8c5422873358e09be", - "1e7ee2036139fe74bfd342feab768ca9a5f6db2fea1546ae545688de36d248da", - "1702c134f8143fce1dbea71129a3ab11e45867c2d5abfe77b90c90b0bb09ef5d", - "a20233910fac876af9e31b43b6730f6ababbd5828317760a32ff107a1911d5ad", - "70b34410968b63b2922f7a6a7534097093bddcf312b50ac33aae99c5389cdb1c", - "473448f7a62bd05e434aa6735182acd0c32dc6362fc3ddcb08e842b8fe6c71fa", - "9ab3e18e150b04996168f4b248716550bb458ff4362c2a1a8fb3e1ef30f34e44", - "b21a004c14613d23fca44fb58aa87c9cee5e7a61f7430c84ca9dac76bbeb1257", - "edb83839b0e742a450d5469c6aee803633f3441045a980e147305df58e5077dd", - "a36b8a74f26a5fe70acce55e0733d3c50637372494409db8c56538bfc7cd6587", - "b6f200221088cb95d0ce03b5ae226e025df8a74583bf96e65d68aea3a71e520f", - "110577332950beda39b10131077bde0966c6037b15c154ff73081a30ede51bec", - "2e85a658f9194b867edab5d2d233feb6c86633c9406ff7f6708d259ece28fb69", - "7285fb029df1581cb1d40bf27df5b28d79c882fcb719bd03dd2210b921aaf6f3", - "0d3bd936e6d4a75ff67314753dde15e8159340326778bc559500bd1c683b8d55", - "6dd2a1653af60e726b5a177ce84ee039e70ee77e77dfb1f0634f2fb19445734a", - "4c462a41fc56e6e3623e75dadf4019450cdbefa438e30f1eebc1561c0b50b059", - "b9b95d1641116066bafec492efee141382eb1ddea9e33583caea668e15280719", - "83614d8f7f5fe12985f9f3c5f9f88df64294449ea2f2bd32aa3e697928478527", - "26c74f645d53d37677804eda4c16e0718385f42a803600214d2a47d83ba455a8", - "fa406b952fc081dc535c42a8cc8d1ef64385aef234ad71e85da67c1d8edb7db2", - "ab91677cc643c0fa49ec5e0266010d584cb7f04a16782aeea94b01b92588beed", - "47564877fdc1d909eb53e7836f4bb7222e85759e6be51bf6c712bb6d3396fd10", - "4157c230a73be6b4956e50346bff65080fb0cd928d7238ab30b22fb6734a1728", - "d1dbcdd318ecb2c15d3762062f2c59d79db5c79f3013f687dbd8cbec950a20e6", - "8a9a8c17f8ec9cde5bdd26246c7914d03e027340bc0a2c553b862e552939e21e", - "9490e25dc2b64465e9820c5874a71899704b4b6e90d2d97940d8003683a9323d", - "78fe2edd9419433abd745218cda7da8eb2119e00ea1a7c7d85d24aeada02d473", - "8fc5d91e61088ddef8af7b74035ec0f29acdbbd8286f7bc4d2aab70639246353", - "0c3aaf95f58362f83a3f8d3fbb68a73499076ed354a12b376ae5829c21be5f03", - "cc22ed32f179b505f9b71a7dce069fe886dc2176f94d563a726b65971c1f2f70", - "cc6dd8d274e5b4c5d307a40fce648dcc5368feb1e241712d069f781430e3a6ab", - "894671330499daf2ebf45c81947aa8e990b73b4ccf50d340626a911f30d89cb1", - "dd947a7fab75b591cd3d3fa8998aee82dbe850c86c7e3cfa157b0bbd93b54a30", - "16035a3a56689541ba44d932386076e17ca21a3837a7c9708a7da13f4b182ae8", - "ca2238b1bd3eda442bc35d4b26f8e6939992a7990d7a479829bdfdddc4aec85f", - "504c530ba87af9c47c428513541eb78e328182da3358f260da0bdfb6f5de2560", - "2336bb433f1fbf2189a0b75777d1f68d3d08dde495276579f28ce154d17bc989", - "ee139b7d089977964b546a06ca9be7806a4b4418d42210c849733be27e15ae34", - "d327f87b13798e5ad3d3c5a75cf83fa053bc3cfcce9c626f7998a04920ec8558", - "949d423e76a888b22f71fe8e58e6cbdcd5c3faec5ab4b46d47637917f769d5dd", - "a297096767c8b9ad842cfc0d57d2013b9316b2af435fb1998be69a59ecf676a1", - "1bb30d24d89e4f891c0dc9cb9bca273e28b063a9c3cf2747b22c6f74472e8ddd", - "a81b56e91b19b5e4bb19d416b6c62dafb3c1302dcafe9643cec4a55f126c2f2a", - "5de3b658d7e22521a4dcc4e223eb11b180f3808513ae9e3cbb746e2a8c9bf8b2", - "8b93b57eca4e171210d7d7b369e2cf87f83bab441da2b5bfe53794d7797ee06a", - "d557842091c6ff5276f06c104eb4beb9d39970476cc404578191fa1285173a86", - "31ea0a6ecf6a85c3ad8c3c87f698218917c80024abd6855e0fae49349023ace6", - "395754152a9b131ef1506517034866d9204c0ce7d07de50399a66d09e27979ed", - "1eebe02271e32e180a4acfb6f083c88da98c3de05170a14f825172f0784ad12c", - "253b3619d43d51661a6a643ea0aedecd68bd6cfa6cd6e4f6b352f7c6f9803633", - "9d2c2ed6a58db1b20ee1fe95b60c5b286e5cada9225a0f95400599c8bfe046fc", - "a044200de199dcf4f4514c3701c8ad4157b41e0ee510c139111872d57b9ad013", - "434e77eec5effc8fb54c25cc0089925f146a53782beaaf060a1e35a8c3d15570", - "127ff77bf239ac99dbc57bf4a801e28745467bf52e85378611b1e6cab897bfcf", - "2cc4313f8093633b6f9bd01b44a84e81152073f0d9a57361faf2d2ca1d6c46ec", - "06b63231381d6c571404c3f718f314e2dab44adf26de5e364226f4c1858cccb3", - "f05a33f03d5417f9207e3072b9e123593f14f7ffada5e698317a29b747bf492c", - "4983d641d21b6c7166f049c21a0f961cd79da2aff308eaabf3c2a43b49303a5d", - "e37f9c44d7f5aec1f4c987d848eb012a6afa65d803a314fb0e4e12367d8f937f", - "880010b0fa2e4bbf3fc1753bcb0a148682433dc6e60561dfa36eb23e69dd7a6e", - "8f9f42d2a07ec03cfd9bd81a8272599dcb6c17cd30daa2cfb82897a0ee756bc9", - "362a9e6d4dfa1585f79ae50876953475dca928186a1924674b42e80f1ff37455", - "0c400e1bec6ac21b7ae2a9b6a939dc9829f4bd84762d2bea16611b7eff49e106", - "188cab246e7875f902fa7ed18ebd8d67ba2f5b536dcf06af0f817020e5bbb145", - "49b264d4b46512e2d8461c9cb12349b78da93557f070f04a5b6c0a719c69999f", - "438e17aa75f7e30d7afbfff35f617cd1c1897edc6d2c1917348d3f7d587d54fc", - "11c044e69b235637b6180cb39e7dd93c886edfa4e90e69f2b11c432807254361", - "59a803ef44d25c888021189f4e7d842f29ee3a6244f61ed822681e0ce090edc1", - "c52779a55a433faeda163dd69a034e913616ef894ca747cf58afce1e3ee4f165", - "604626cca28e949cc548aed36bc736505be7deee87626416065091bc66c82498", - "f4b7a08fca60d87cc0c52752ebf24cbed74bd340361df02eef736e0066c0719a", - "add0e3c5b0232e0b3f10099f6ee1d28fe8d938348912d6b226beda9774ed5a02", - "cb21ae8320ec3875ce4c268e85083391bbcd5b5725b306b696e9a2878880d6a6", - "53e05c90b1d37365ecc8e9791c991ff07b882c2d92aa0ea4aec8a8ea90911b42", - "e6ca90662444d6cde65d55e3fd709910a9765cb723c1e1a4b8263f77713e1044", - "e67e20deecb48ea6b0a573060b0f6a05f775dcab473032713a9a75581bc3b064", - "03585b132d0d6e31f90386d8edf84c0bec26fe5edb7f0620c25e534a1d619b8f", - "a86b217b89f53c2b3f09dabc7137067c96f8551969cbf02fe769607bf32b7d55", - "d57a9d5b614c7ccd817fc7d656460f8325b029844ea363cbc22cd658b08668da", - "9cf05f0a871c99575fec6defa24357add930c61393cf359271ffb3a9cd450691", - "50f74c04e998333c5f64722730424558d283565a7eb4deb4671ef8937b063a56", - "35f4f9d03c2305b5fa6f3fd65688421f3e5bee9f0f73be965095fc167d798ae7", - "7f43ec0af4e7e642e65d74518559f151a5270d7eb3ddb4dfb8bd6d8d310f40fa", - "2dbb1a9fabcee8f2dc91e132bbcd9463674d96d9a98d346c8f05c7488f35ce74", - "7cdde9eafd9aa9010b99144e1fbcd165e369c3b67e08caf01883b69239d00075", - "5038a46d25741f2a30e33647bb96338549c9759d62860e3507af68f510f217c4", - "ac7523f783f50df4af2f9e780d78e53b5e2d9cdac0ab7d55d42feb78044a2bc4", - "b91e8a0fe7f4a0ce0a415d76b554c75e45850e641085b35fac90a47a97fa52ff", - "a7f34fc476dbc6aefefb6dd715b7bef97a908b5d89b1049dd90bac24279490ab", - "782dcddf04045d71f3a425da5580febb7c982ac097dff71a3069f613c617566e", - "0ffa464411d4ce2067e6d30d8c1b08d3783bbe046d035af1308e0964202c927a", - "8ad177e99a67bd32f649977b640531ebbe60a6c588e6a8e7992093c901db2974", - "09a4fc906240db96383e5a5b7073fa418a9979f773efcf38edc31b636124a332", - "855af09f93534eef442804e84fa36ac5443cfb4af16714f6e0381979ffb2ea31", - "b6c7084ac0ff9d721e03471b7209138444b1fd5523fc571b4578a14580d35e90", - "a0f796b81732fe019d551c5dc4faa2a627bfe91e58ac99fa8ec29221df4625d1", - "00d19f07804ba27bf4e2d4ab55ed97e0cf2cedd0c116483f3ca5c75387abf946", - "9b042316c02466ea7845e05495a11417291ed4b9de5ca08640979a5b361c9ead", - "712a18aee395fcda00eb71646310c5da2f6d93c407c9592ccf8efe6f462319e9", - "42932e7f6c90bce92fc471468ab5f44358752419f4562cfa066ba861cd6eef9c", - "4bf8a78bfba578aa1830a95c4a24b6fb1e7a8d421b1b82b75061314bf66535bb", - "cbba58ac0b2a50eb4a6087d5217aff93bb7aa3b638ccb52b25f5de399391ab1c", - "f0a5ba8ead9a41577b62e31ec62c43e2672186b650e6cd7af686147fa16f301f", - "d668f0e1599394134620164815c5ea8524b44affd75071fc370c40e7f22c2875", - "da38f55881c6051784675a170630eef58976c0538e4609b63a28de4309cfc718", - "36d7bd81ff178e886071d8409f03a4fdc5de5a41d131c995fbe30633ee56122d", - "aea7d080c952a2c533d2a3139bb299132dc49f4168bdf7c0be5350abb07ad031", - "63f6d43aa7a892591bad92ee61f263bd870350eaff65913f171f53c6f0468096", - "46f1b2abb21b9a9e8a943901b74d1e3e87c4183dfeb77c72709051f271505798", - "85d3695cdad791e27fb948d567e5209d358545fdb1ab64fd6c6bde437a74b1a8", - "9d049dc88f67b3216b38992a97d354a72f4956239ca31b9179b3870f32cacc4d", - "d5bbb275970c5371e5e14b3fe8f82e3d12cc0bcacf6acc6d1f9baef00ece75a2", - "66908ad66e02afd215c8808465a1d0dc3215f35191368f8a673688e5ef22a634", - "180467622b478c53c999b306b8ddd776e0c9f4213199213adcf42f0af391ee9b", - "fe5cdcdf1bbebc0d8a1b0d5139c412b0a08f17feeb7112f98fdad3aecfcae0e2", - "91920a6058ae9a42e924c6c4b1a2ad74eaf749c79ed36a87bddc6c1500a48a1b", - "0cb876edfe701251500bc0c25d35fe31ae96a3127e3d8fbab9a4d74c16b5952a", - "33618dd4504e2c78ef81f9105cc9688e39e369b9f424567156a18e2774a62db7", - "f5e95a95e8fea2b99b397b963f9dd9789b28290e3dc55f1870fcfc9e4afd36a3", - "234eeec9f1593026e0feac4bc289cec19d5a5eb0272743ca819cdd49580bc34a", - "a1af84ce1a064d166f18460edc85f3da1e0fa4235bca2f9b89dcad36df81297f", - "32e440f5b80ceaa84e00410a0280ad5028b612b6de5ea0902af4df35b7e097ff", - "388157011384dbc5b7b6e0ab22c1f64d066ec61f86cf6d083704951657c6eb31", - "13d5586439c87539ca5f0a6e69c585e4e9586046e9eb75c07d54379b0e6c71b6", - "5b10fd34875646ca9c1cd7dac48f9b7e9cbe793201b1776b592a71af6514e198", - "45426fdc41eb00269b081aab40f4a6f8dbaed6f56087e1c892af893d54b9a46a", - "d6cf81a00640e2939274037b816774ac53dd1f9ac5649898102af3e914c5d555", - "f7918f8562c0a32a6623957eaf9342585487c6077868e9a363b7117fa0dfc5cd", - "2d6ff056ba284a88541ad56900d5d7b608aec3f6cdc635e70d3dfbf2e9cbd1f2", - "3de72566c1e4d1cd80c682c21b7bb609bb906dfee0a5bdb70e3f9c66da28c5b9", - "05e88ab0422c9e87e2647c22768056a157f341dbc520a72b61354a0b67d0067b", - "755a04a664a6f90898fe1fb2bba1bb05ec1588edd19166197bc3cc7c8a2aee41", - "4705623ba37d47337d387cf5bd3dd2873b1524336971d56458a0883f550df85c", - "e03c0eea5c7520d6ceadeca0d7cbda08980ea81e9b5645012f586c3a3151ed2b", - "e68279c4b00b2edd6f8c081c89a8e1bb53cac3bd70ea9503d3c070c8daafeff9", - "e1ab6335632f09cc5a9bcf1bc91ea81262b4406c67cacf76333ec99fec9c16b8", - "015bbffdde090a023a0372686904f662425d978e10dd92d91006397ad63d5d74", - "1ff3f299eddd2b1d59545a89985f8aa6ff158800fcc4209adecbd64b7c1f1543", - "bfbacf3d4563191e7f72217537cf692eb5df1c5262702d20b8901e7eeede347a", - "696ebcb2b85cdb2695341d98b8ce2bee3cca5af2fbc21d238d59c98bf867b584", - "b307348bc4dd211027c847b1ea2b7fd89108a3edd41660f14093455db22e1911", - "68cccf0bd9373610ae140f4cb7d10aed8e2678b05c296fef8fb78bf956c15ff8", - "c0da5477b8752c6def242a09e6157e0850bdc4a0e7f3c8df667cc98428e28382", - "19e46e531c56efe76b1b5beffdf36ed6c615e79174d8188b49d8ba36334ae8be", - "4c79d95452b108d928bc76e01ce9476ff92d15b558c20090aa4d86a835d9a0ca", - "a1bf34ab892b2fe000f780ad6e42dbca5f52985e90d9abb5d22e4a12f7a1e326", - "e96b917d9af3ddc2ab751a1dcabe469e6693e3f24f69b8e70de73fe6fa1a917c", - "c3b200d5874e85388775cb3840fb3e4421e77599c8ad0c28241aa9c7954d3e83", - "1c1b7720e60183d1ed3f13d9f3f73fa105ed696e6d2b95785e3a0082ecad757f", - "ea0160d0f9e823eb82d2a72b06153890bebde8518f38620e58c20e03d6eb2a49", - "d9b8f21e5b30ef9e2318d63c16810422f276cce8db5815da38bac6faec9c36f3", - "e1d62506ef22a3d9ea39728c1cea375cc3200f54ca9b58e8bd44b315d73625eb", - "61ac697b4ded72763413b5e9008fabadcb81b30198b3f8188839a1fc0c6067a7", - "03107552c2a8f3c96b1c198493e10482c9443e079253417030eb853662ac9f23", - "e844975f30e60a3c51b38704fa8fcc5f7881aaa24df5beb5c3c266770d4be9ad", - "820088ec9231f5d849ef33f04d7ee269eae3a3dec8e697f096caf5e5efe00bb2", - "a5a3e9e1c5a07ec443e66da33d1847b71592a026913c56b19da39b31cd20cc25", - "95029e6b32ed8d18621b5ad58c504e4ca344e5c992383df4cacfdef0d92cbef7", - "2b117c6dcf52f76d58747d011443e0435cd605c4d4223d451790dcd377d3be16", - "1b4ec4bc0a1a9e31e74397def39fded038d73e5d4ec1e47a66d28d329d5b7bb2", - "85bda0e6b21be8d4d683e44da7e574dcd1798102f952c817a2bd69964d5a4e5a", - "bf4471aab1567cbd3373b9d9ea8ad810d4bd16394d974c0854aaf2bb4f82a94e", - "9afcdaaed09fbbbd34324a4c6c16ce43f81521ac901864115231965e95964b58", - "ef2258f9a8723ddda7086aa48033acf446d80823f090b049489d1ba92da709b1", - "6cb2eea0ef839cf994f95175ce2b1326eaa898fd1e5a0d6e09fc5594171c7726", - "6a379d05b7789be5aa7f87cd9499afb5c68ec0fab32310bcbdb85e4f47ad8c99", - "9d9d7ea462301cebea82d008ee46c0363556d579391e46f9249daa4a29f58d65", - "b8e71898bb02d2fb018436326613f45d27bcfaab73c5f73b4b511caf523faced", - "1edd660c97fa17da0c27300567eda4484acc9bb0c5feafda5e9ff4413f29fd86", - "ae5fb8d6463cb9fc78cda14cae58fb1f79bcdc54e1aa17bfdfdeb297cc465c4c", - "a5e14009901fa79be86575e997dfa94b0177b5523993d43933daebddc880871b", - "cce57f3fcf735b7d410ebfa6b107af0e35ff308eee7d379ffd12822bcc2020ce", - "f9c3300fb2ee31bddaf0ce5cbc5789c2c2d3abf451dd5b2c75b40ae964a58d52", - "c3706c96e87c86a77ff20c21fb44db82610f14515bc8a9ced92a7b11521d5c39", - "e0beb82b7732c536ef96f5aa2eee3d16038075ace61460330101d80d298c9246", - "d57d503db62f4f7df4316290995d488bdf811c77284675254f60d0c41fb9989d", - "6b66283e00b58129473a561786bfd9aed92c706ccece184c44d721b1a5785952", - "01484e38d24b01c9c9d4752f505e8c9a72c05fc88bf0aafe959452193d0bd235", - "a8946dcc86efec58a9a1649ba3f0231124f5e6e1dd88283d0078f35be8fa857e", - "7334f8b9905bd26d57bb4b6ce7dddebc2e40213dc421aa32c87f732ab3d1a018", - "f647a1ee1839858fa6147d094d4e5419f628409cdc8346c79f637972346c10c6", - "6beaac233e5471228ffd812ce98e4f15b4d724152c2546d27da0d8422cb6195d", - "ba6f4a83ed37c12681c3cea98f5faab47252e3302dee6a5d7a45390303616290", - "476374e5bc8daa4e47d5ccf4924d69892a12a66f1de2323fa8c379e29854dd15", - "4a5ac584d3494bf5b23b80416e44ebbdd79c6925030eb0674a3a1a1983aadc3b", - "827d20ff691a0889aaf119bbb06e27a286570de6f49351f535fa551defd5b9f9", - "3b7bebdf27062eba02f9e7d6354e29b79dc55af934f182a42b673ca453f8e8a8", - "0bb7fa7b6b02ef4c90a517e0aca800539e25de4ea2fc5bd5ade1bcf708018d33", - "8eff04b0b1301fd67ff1ee81b04d9376ac6a6184da7e10f770d356cc20dd6834", - "bbe00deed05d94c41785a19cd900027262948b80f6245e2dadafc5958c5c24c3", - "cd2f3948923a90568efdc217ce3ee12405dadc453efd640ef9b523ea53ffeb46", - "5a51c6b9bebb2b56fc4122a91b04587c750597f358dbc8a49c768bf8447078a8", - "8ec90d68c656924d340dcbd8d0036ea568eedb66ee7df2dc18ed9f42b6d0828f", - "9e8ac0d9798c032ab6608d42b81a989151381ab692f3b9bdd0747e03f38308fb", - "b0cb26539540555cbd0d98e48ab745fcac110ee445504c84c10766ea8c9edc72", - "9a6a3208ac7aeb6696b3e06c04d276962b8b20b81fd94118a4f586cefa2d3f5d", - "b961f9a77d8d1c4f77b5e14187701e2cfe5ef059d8cf577fd2d0588f6edea55e", - "1ea4ef395619ce3e8d0208579ed102ae1cf5d80ad6c2d9394f9ea9f2b7505cb3", - "c75da966eebdc9feebc600dfc1fb5ba800cd8e50fbe39ce11d5a1583344c4102", - "ae613788720934231450b577ef6d8d421ac88948bbe84fa6671167c6eec080d3", - "7538e867766446c8432aa90154c09b4cb654e7e28ac10fabf3521647e883e8a1", - "ea4c7344a411fccbcb0dbacb275186f83be1efcf46d817ee918f84f950ae6216", - "f44d44f465f8c0efb4245e95e31eb05dab43530e194f5cbd8570b93ec9c4828d", - "7e0e8c6e00d8e90977dc4fda6c73dbcf4b27b0d04bfc00cc925b51f6ccacfef8", - "93729e944053fb7b20158ac5da0bb91f1f7301d40d77c43e62c27bc7dd1fc2eb", - "61b0f5be2ea6cdf2be5179892cd6cae11bb69a848071e70dc2240107b6e869d0", - "099da86266361cc0a4f84204a4395e7bdc19437aaeed77afacef0f056e11d955", - "cb2eee61e4995a5924fd90e3ab3d8a0676a7c965c8f621025909a9978b7240d2", - "b4c713dbbb244ba302110b36e6ab46e71bde1d4fcd7a9b529ae338d974341b7d", - "a625d51cf38f0e44e1249e2f3db5a5616cef20a63f9c1325b5956005f4494b69", - "da9acd9f64e98bd7f7d32bc432b5427c6822810ccddc342d49bb5c5c4da5074b", - "dff55c71f61d1b34a22e80d7ba169f9e2318fc2ea5db7c9ab59a05523d96a417", - "9a3419a085d7827134073c38fad696d8aacf3aa3aaa566fd41b980f8fe5be50f", - "4d91ec0f2435b1522d9e3c287d9666f4eb8781b96467312072201ea387a84ded", - "888c8b62c1305fbfd6f414c858c5fcabc65d751deb0721647e7cb11c11e8f3b9", - "d43747372bc5dd51ef76f58446703eaa4a61dbe6826d017260362a73f89831aa", - "de84a74f7a11fb44fbbf8f148d7e768fea9f49a1af17fec8770d23557a3daf36", - "5ef06635580c53a27ad36009d045a024b94e527d2d26d8acf5330c5e55abfc4f", - "f4e1f7891d3c5c4734e760244f32c940fec692ada53ed2cd92b8f981d1237513", - "ee201b0b30fa6d7ce57cd35d6d28f5ecba6ac05742f335db5ac0fe57d9dc4b57", - "eadcb538166c64f8fcc24c16a1412d183325a00455d9acb2692b18427679a3e3", - "41785935d68080c9358d97c704d9d173636f5bbd53357376599b63d20d0f08b3", - "c0d061b74900d65431619be0c399cf40100c898503d426a1cef4d351452aa338", - "32bc09d2395d80f926b121ec38485334440af7f9df8bf6c121010b8250b8f1c8", - "3af5da4081b055bbec1141bf1ec8dafb4a870c55214781f47b19f1e305552cde", - "19d880a7a48fac6deee96e10554add9ade3ab42a6013b2721585177cc9007db5", - "5c302fceb4262fe3e41990f6dc87bb57594a1915fb14bc9d6215e754a7f290ad", - "36a963fe75e8346b1606c9fd5200ec0476de727b65137c6f150931eed2a89e49", - "2a1dbb88423cae5ca5f67b55437b171bfb8a44ad8f77d506c2518e2a85111d41", - "00d2bf78422e99461629e5c3ab011eb8279006406a27f3473ed843bff299327e", - "b8d8b5fab2920aaeeed2078fdcb831e2750cc6da6763146074066bdfacf51e63", - "2197e39562a88b82bfa939acde06156c52c8a22d26baf110b797b1ba14df0ed0", - "d9c00862f274f61c91ab7b9b523a7bbef9f5cc4ca5da10aa086d030558ed8ba8", - "6dc8c1747a17b2f2598844b40daa940448d2bf8c322ca1de8c8cb7f606cc4cc9", - "9ca1afcd005165c2187cc8166146fa6681fd308a1c3077c738a250bd888fc9f4", - "d6493ef3f1fcf42b5bff3a961444616317b44c477ee0495673e9896be0519648", - "947025373d9734a7f89a83c7ecf7584996e0b0c4902f144c75b75b73904acc61", - "4cdf9c178c7a4e4de08285a44afe40447876c8e340d7e51aa7fad8585e97da15", - "739f39a0a8d2a2df572997d36d2bad20003f399e77a6123841f45f0899075b9e", - "7d7b58304733cbb56e0fee46414815c7f20c85e15783adadf3a7e9893b5e6aae", - "21e863e8960abbb57d67874edb798d9b8d24337a4889c23e39ef6f7d30c24376", - "fb7273794614051bba70f9dd9f4c4987f72eb1c06ef73d04967c708975c27f2a", - "c9ac73998a07168f04bc24dc853eb2d83a6382381bf8983a5c5f7988b48bb59c", - "a4c8f01d6b50d05cfb1c4a0082f6aeb6ebbd65d72eddd4b250f27435bd261389", - "b00a67e45fa2794667d8c996a1d4289046330396afd0dc5c16ba184eaab91f15", - "7b76c49839931712228bfdfb758275bf71a709f0bcc853325f73a76f7df7709a", - "7250b20b0dbd56cc4d46fa456b3a0f5f350a70ae7cb224fbe60a400c4ecf802d", - "035547bfc122639df726407e24998cd149c0b49d563fa99e8861caf59b39dc51", - "532d144d5e66e5cc2f8efa5804afde2ecc18cdacb41fe7dc4581bd979b654b5f", - "954ebf6161c047081dae4651f0f4cf6f3229b235f627f14eb318ff3d1fc66f5a", - "3ae331da6c61fa1c71841c24974c085a56e052f614417d04bc7cca20d341ac01", - "5d8efbd2fd66333e73ae7da1ee296461b368a71ab002371aaed4d537d27d179f", - "6da1527db297b301de26cc1a6960dcd9bae514934e9ac9f46ed8682ec8d51fe7", - "8fc0990cfb6912d7aee2d6bc564468c5111d94fec2e99a7fe98989200abd4b26", - "565cfbd2e900d47eafd0e1069aa4258bdc79c7d18a22ddaa2c841d437b4cd51c", - "cbffa8530e1027ba59437425fb6fd68db5995304b5f0061b0d90d2435d9c5d76", - "96f5648cf4ee100aa0372aa046fc07188ade6c39ea26f9099efe617adb98fb3e", - "abce3ff53090ddedbcf220ba74d69e0de7fe382e5d405a36f0c52df34d7b3478", - "f27ea757e35ac948853650f9c2b799baf9699c941d70ae507e921e8919063ee7", - "74258a96fa69dd0dcbf318e05e65768dd9c6ca17a12ae2e1c5de649a0327aea8", - "3ab1d72a107005810ccd5c0d21adb7167959717036b6e7453a6b53b05323995d", - "7efa38255583bef179af3985aa263c931601004399254a0218fc20a2fb2f572e", - "2202ec35741d29765bf2bce0ed3662a519181e76425b638ad9ddb60714b22f72", - "e05c933c936718fee0b70e8ff8c6d5d42929c386a22a23e9298a8973b3c1054d", - "dc4272a21bf81be42c9e28cd3d8e1a6b9732ba096a203da704427b89435b8bde", - "0320d198cea2b38643ce6408e9a05a853133fa9ea4ac0b761022a9e21f4fa43f", - "8d8ec37212e96c55b4e8a91be3eda08a1716c8551afd5b042981797240b3f014", - "40f92825b57181d65648b5deed0ad3593cca2bb9abd04c5456a1a00ef5ce99af", - "8d11b11c329718b36fd708985fe2fbcda4781ccdda448e92a7be64e8d8cb8283", - "538e7abff9ef3045a0b4a5f785dacdc8fc9359664e6fa418a98d323930fa336a", - "371c42bd6b90824a401e086629c2639fbd3d829357674b71bb018c87c1afd3b4", - "77f0914abe9d5b1c87d3ca4b1fef0a4675805bad875ef57fd0736b3a77047daa", - "4395db71e51dfecb932edc59d80a440b9fddceb459b504d3495948032fac13fc", - "1d194305e8cb1bac5b2c174e708c7f916b9c63ef9ddd87e113493d783f671f20", - "413141825eef1e6f2edbda59f9c770dc8e11cfa5bcae5504b26616e33e985200", - "f82e9bda80f2e649eeae01294d4ad1cbe0e28f4db4e3ba59fbcc7c6561911688", - "30ca6665f81e39544b04eadfb289a8ed096851d329177e592312b99d14e479c4", - "055c1ed475011d506f7809ff9280089258ea01f01a23ff6ba4296d526cc4849e", - "041d24d11a2fd72457c57aa53145c78aa11573e4eb7565264c3e26b3bd0bd96e", - "130c5ab07f69f3abaf3d0c5f520e079c8961c0263ab2c8c2a4f7cf76a0f43729", - "3678dbbf2baf8eeba82a13fb20cc761b0f6a46d3d03ac1ec5c5ef6ee4e86c997", - "7e0162dcce224500bad6074bc177e7309896b5cbf90b12fcd4086fac613528a4", - "ce5208dbc86987480aebff5d8adbc9f6cc91312fe2ac482b7ad65f9a6c0fd8e3", - "bda52dadb67541125d5e061508cb3fc02d4176c457f3e5b4bd1ed065bef2e4b1", - "7790e32a6cf44f1f60241cfbfa03a9260df0c8944178ce690a5d48adfd090660", - "72c2f2257f47e9a3131e2b14af38f93e1a4c12bf2434aad61496d1d2e329a8e8", - "3e929ce20655584c915db9a5d6c63089246b4017807ba68346074031aa5a7802", - "e3403e925dd1c3df1ca11755033cd12ae89f226db91bb40ccc1b70c6ecf414c5", - "97d545797d91e4db42e37314e95e631a35f7c74679a7ac5d634348d3d1283d53", - "1fc3ddf3191a52cd313858bc4b87aa73eebfd728098b7f3694612ed5c6d53c9d", - "afd5fa030f32b6e7ae22860960fd77b8e0fd05f48339057b85faddebdd8a8d31", - "15cad0b56a54cb18a5b606050a3deffec32ac1fe17246312d574cdf60c45f6db", - "b5ee30d93a9feb07d502e4393440d5350c3810b5422f9af017ef9b357cbdad26", - "25f72b9a73334e198d158a76950ffb2c07f5621954799670272c357776bbe4a2", - "dbd442aae7f2c477a277b70cebfdc8e806e7b9bbc8b24441f09d7f897f0ed64f", - "e5307243c50fe39da27242bc9e9b3fd5bca6ebc4f7c9a758c0a4fd45432500f6", - "023f1dd8b873bcbf04b9cdab238296c71c9e974b23d205167e1311a6b500db79", - "0f4e3b6aa29d19735ff5dcce758df41e2aeb22e2f5d3701534f745191ca5e243", - "e688d0952e020dbb050bbb18e70d2b899e919ae911cfdffdc361622b7b7f3085", - "f22f1704f633e183463b05c7c2742a7c5252b72750dc36b5b399181c70c1f237", - "ae6b5e64660dd5495a88fb7cb2f664665c39af5e001f4acf6831eea8316feb88", - "3c07b05314e2f3a99f8d424c593866c65ebfbdd92e95bf8b365941a4734d5aba", - "fcef210e0ae391594d0ef83a87357cb7a18bb031529bc8f34fd998a55c856a6e", - "74858a03efccdb8713e0515146ded970d4a076d8465a241695664bcbd5b5c2d7", - "baddb7eab144acd5808a975d5eb2a3ae8fcfca9a00dfc7ee54f0e9a8def6b260", - "9cf630a8e808341b9dd3e1f5c6214585a1a8f731dc85712e14408353d000214f", - "5fec19e09e139fcefa690f664761660f51e1be273f7cf84e2fc1ef9a15ba922c", - "02e1bcd05f23ed4e2ba491d5e21e9489ffa991e5d9f365d1d5f6a4a2266989b2", - "1dfdb4de36b82ffc37fb7f809f2c2cd06a588f96fed315aa2b3207946d92798a", - "f3e7395b305959804bf9433e8228fb0c76a0dbefadd225dd45ddae5fa9229bdd", - "3193e8fda8ae66f404f70aa5aabb4243c1ff1b4948fb460ac21733688ab8dece", - "f7ffeb9517137eb2c858b59f3b63dba8b06ab01f4fb6418e54de362657186406", - "3f07048ea483e6933b0c26731b0c62f8c6a8a880b636e88ec40afdd0e99620af", - "7d9b41ae570a486db7a9416be54fa92d1c8c8e4583217426b6dcc21e7e04998c", - "89992c9baa0ff703755ed0260350286f727e672a7c40e2bbe07aaf585d403a4c", - "50971b35a52e10021ca25b879d22e6edf9230461163224f19401980b9e4e153a", - "c7f99cf332a5c8f7b2bbd7009bb5335611995975881fc8c87d5144cbfaec38b7", - "26275293665fa39494157c154870a59a1c0c14a554b40719cf720a695003221b", - "e523bed301fb8e5b979670a363dfeddce2b94fe8fce1baac75523175955dd606", - "65dc5d3104dfce438c3a8580f729da8090726a506ca56d15b3152532aded544d", - "85b7567a377919904a21dd8b887b46b7474646a948999815af3dfd0e44965e75", - "5291d3013c57d828570446a6ee3c6d81e292dc22d3f4734b249209bd753a3fec", - "46dbdbe96a19b7fd63ea2ffb490f61cf7a44cfb6fa40560e26de7ed15d98e357", - "a44e115fd61ee5363ad98ac9eb8ffd88a468331ad03e2a9b5c8d883f1f080e29", - "fc48f09a772c6c3935e56892ae13faddaf960025d453e51f12a7e05ac012f75b", - "e9aacec72c551319609a12cf727a26a01e1bfb8404549ade2bc15d742f1d98b5", - "2efc7637b5429cb88c6d8fd880eb328d3635fe98a47491ff326874355676b92b", - "087dfdb4fb8ce4bcd621bf7f7f12d7ff359583a0d7784a60e6536284f83c3814", - "4caeb9686cc2b4f402dfbee80bd426e46bca994368e2fa4c5de6649cc24c174c", - "daac7820ccc1fb0beffe519f3689c59da3d0ff9d51e211b2c2e3d402745849d8", - "07a9ca7e271cea1e595722068a613640c1148b199ec628378c3d34a1f0a7e596", - "e9e3da6a58b621a22b7d67527626acf91bf988a0bcd7c5e48c7ec23b7aeb37d5", - "9e660cba5d9a4ea27283446f0054fbf93a27714c7387675cfee0773c1d261d1b", - "5e828110abf9a20d26dac718f0ec9fda26f9f75179e08ce9a4d6122c83b687fb", - "e2c4503f1c2d99ff7a589e47d4fd362fe90ffeed6abf6780c3505bc7c06d19b9", - "c1a8ffba84597296c87e9569e2c2c353736d9d0309e3b88d2019b9704d59387c", - "cab7e200f827e07136b370d1aa0d693a8a8d0e0d9b0081a760b5ed764b1b40f7", - "3e19ad70d28e65a9e1b019beeecbf2db333b5579f55f113e2396c42e6d6dc4fd", - "2b5276c2c34992af180caa157adca0fef9b3ffd4dc5b4b77147e7645a91c0a61", - "4e4d8b265448814926de957b630d0f9931ce770720e8d4b3d9b730ecc24769de", - "efc90963e2547e8d607d057fb41973a675c213630e4bc9335cd34994a4796f9e", - "1583304209a41d4546dd63d967e5f4d896f30e0dc8a70a60d67de0cf537eefcc", - "6bddce87569c6275f3821827842cc8c06870c543ff8bb0e8cbaaeecbeeb85579", - "d23e1bb6aacf41b3e31f47fa097f0ca400cc7f9b74df4ded7c9a3139870606d2", - "b3e8a127f3701e039881c333cf6ce8841227ca0d421fc4eec9b4a42d283e4e01", - "11ab8abc10fcf375053868c0e6932f51a22254c27e12175a4d938788be123c90", - "6f68330603b1c954b681e81cdf06f18626c5810e0590415328c730258ccca0b9", - "d4cb9cd324ea21150495a54ffab0a19c136d94fca8d4d695305844712994c675", - "568cff7dba01730b426ca43fd4fd666fe82c87c13aa06970e3fbc56037c3007f", - "c909d1daec07b42b76b758e7b8cfafc3f04255d55f0f28b612244a73f7dce23d", - "f6ff898b0edc2f0d8590ce68c0b1bbf5d7878cd3c547cf6e099465fc7e5d8273", - "e6f66cb58c38499e06239d30188f08444c3aff6e5924efdb21138cbba1de78bc", - "9d1aafa2189e06c04dc4f13f6dcff21c2c9989b80bec718969544bc7d837c18e", - "b61af02df8174fc080f177c106803a2380c756f923278f7ec64ad62658617293", - "cd6241363a9fb15d35bf318e69843d5747dbbb272deffff278978a323089ca48", - "36add62decdae07e5e667d98a7b7ba3ef90d6627dfaf1821606f816b1dd5cda0", - "bdec90c74bec23dd4772666a66b7c1ee57e0c7167797fea8cc69991d49a9856e", - "c00e1ae1a9f56bc88cf1e7cc1765e62f408fc352725268b9ed46d750cc04573d", - "35dcf612648dcdd81a5c8ecddf4aa16e2bc8d74fb4895bba5cfaece68f70c7b9", - "fc23173ba281125b5ff1b0ff4b82698edf9b52aa41163cff9314776bb34345e5", - "bf8e4df51207481911cc1aebafe72dd9e2d36ff98d2bb2ed9a426c0a98ca6774", - "5a405a4d922667383c553cbb4325b5b66b41f609c6f6e81d24c3837ada171110", - "e14e6bc6b3e54c134d16491c82ee4e31a41dbb637c8801fceafe566c2be13d56", - "1db46da4982494b8d5e43213fe3a1e065e0999c7d27de9cdefd44a2d3f6fb6c4", - "1f133815ed545d16a9109b663a5c2f66336983934366a592cfe387b004557f3a", - "9ca3325f2c2c7f458e9971c614f0501164c8aa17fdd9b9aa59e7e0f66a980aaf", - "3efcbfe7ac4b55bc8d500542592c92e85e4b9a36844e856bd61c7e8ab402f331", - "9e2a84771d83353c02c1ef7ac4e378573f33693aebd1197fe23d46c06d804d08", - "f1b2ba640810c9f4581746d3dcaa0caa26580ed00f3539c79a9943463a6b62aa", - "244ee608035fa0764d976668e88ab83087bdf52dad6df8f9832a5cbd23f48cbd", - "0f9c6e7910e245e8214c360ab45bd219d0748bb573bcd1594baf0e6e5ee203f3", - "65587c8b8413ce373ef775be36d80516d360a49aaeecd37aca6f84f2716ffeba", - "6573a82ceb823ff57b78dee7593bd51d4a3d63a468f8e124f485d259d4f255b2", - "77dbb1a7571545fa5a53767c337f704a68fdadab4554a4b30539c5091de33420", - "a5c5188f854336893d5c0467de69272704250d48a8b370605563d0aab151fde7", - "ca91647080b2c5e6e3b8bc405c794fcad5ce0a2f945184482bfc76e828474584", - "5b5467b1f1b2e20c9c1a2bb5f789115820fcf4c4cdca6f1209280f1212b967cb", - "a6878a49cd5a01e5c950522ce8ae3eba451894d6b6b350aadac0efd8fa3a3713", - "0004dda375b0c920d4118cb63170786a391886c6bbd913a3cb9256e787b21682", - "9a1cd76bd89c07a7a37d96d499290d966bd15536a0772714ef7a3f6ad1ac76b0", - "f7378c7a9eda474c117fb91d17563056a2db7346118a705b553e2c54476efd7e", - "cfb8b791153bded9d6d882395d6c2af3fc60fbef10d6dd77d012982f1399c55c", - "9f94797b1e644cafe1c06a7dcd26119632e1d09a3a19f111f51bf52a4e326153", - "314869fa3ccae94824a7aae8741e8d4c9186982781e6d106e65ab5ac0ab63029", - "3efdfe849f2491e50b39c46bbc2861079eaeeaefc1febd8954e1cc2b4c4601f5", - "836153d77e5565cf3cefda56278972aa1a40a9aa2c97d72efb23e9ea7ea4fa37", - "c5962824a65dc7362ed9d2b72156213ac6a0f9be61b6d393ce242097bb04d72b", - "99c04079fbe1f4a67fe6d9dab0a1a6c1e494113ddb3d131be1b77d1306bef011", - "2eeb60250525d51d8b7ee0e7839ed6925f11f87e53f2b0377d465889449187c1", - "fb02615205e55afd6195afc68c05e86430700287efdafb4238706aada718328e", - "1df143bcafaacdd394f2074924260e346cb258d2c965bf770cb265ee8c0a14bb", - "3497858b68b271ca130d2a32dc9f6327804c495ac9e30cb5270bada78a2fcd55", - "d0601d3fbe6ca5dc595a87ef9039f9a64f04d02a8e355a8f23d85fed77a54db6", - "d83fd21cc5d4cddc0a19539871a934d79eb64d2f64347b486954ab5623ec1878", - "d550dbb9096819e4e4510864eb25102dc15dd94ac65366f7105720e6ce76054f", - "85fb26603649ac00a8b96b2a3c30609ba06608d86aac401dbb6f1a654e36c248", - "a4a3522463f934ed5e63dc535da12c828b19cd066c48b852d4cc26f3ab161eb3", - "3be5d5288f826a5fff68835ba8e9aee59ca0490800cafa73a7ce563b52fcfc98", - "b82f80a2fe02ed0868ff95a61636a4105a9ecc262d755b77bde1f471fa12783e", - "2ab2cf55f5366ff3691e6ceec10b9bb38f53854b3758ef50d1370bacebcfaacf", - "9bc48f4a055ec8ba7604c6cbcc883ecf99ce84d89ad571e80a82bafd930de8b3", - "9a46f634cc7fb378862f308db3f139f889b8ec9c730269eefca37021323a137a", - "07c03dc24b6ce7843cc57636476219aec43dca70fe8bd8341ebdd17d55e9a9e7", - "c721dd814f7f995a48fd0a9c612feebe52ae618de0ae63878a676a35c182e794", - "9301d5f616bad6462cedaf1d5abf84838f402db7e6815febed7962c9e1f1f83d", - "9efdddaa2c9a2cdb393ef512eb676d3fa00a465081428671e45328181aeb89e0", - "5aecec7de34220b9fa59d7a2a93371b02078920831d53fcb0fe628b6af3ef8b1", - "04c28fcd26fedb2ef68b5a47f23e1ea656cca40f9d745d4e096b143555989a76", - "3dda89186d75b0a38b52567b15d41707ca4ba8ac53f08aad5c7093e0620b9e18", - "c4920f92aba599d599f068165cc5d5dae78fa4d99443656789ddd452415e0e3c", - "6617fb1117f7c80ea3827f0f636eaeec76431c9e026935b012225d53b0f6072f", - "54fd49aca62b70f3bc222aea57930db783bfbef93fc45a5e4b556d36b34901b4", - "ae134fde9b61882595788591f7a84c0ce4dec48d95c0da419d0793fc6316aa6e", - "f86de9b1215706e03e787e55a8ab701047d7e4a9f4d530ca52caddad4636399c", - "5f9216642e44babee3d4f3d9debf06722eaf4a7f2d74119f3e02106676576e23", - "f2473678e9ae5fab4266e07a1b5dd3924b505e66e63640a5c77a6db2adf9e32b", - "a289176682b70379df0ed36fad0f49010e4ff927c5be11e1a81290d660dfbcaa", - "b49b5fcd44d00b8537b4c26db651ab0b373fbdb04a67e5223ca5beb63f2727fb", - "8d126a894a30c1d0769300772faa1936eaad262e5a38d7d8d834fd150a434411", - "e96a3d54f147b8a391b817a853d410c5b3c51d41267482e618aae90b6cb12a8f", - "44ab4bdc7a6a7a817ba5a62510fa07e3aec3223cdadf1319ad7966f1a9dba747", - "fb6d7d1178ceca3b24700f51dbec706a0d9adc753ef668020c01ae5476c6735f", - "f70a4119d2d6001583df64eb03bdebf8b663fab736e4c133174d31ee74d3a965", - "8aa2ae2c591e0773cc64579370d6d4ac82ba5b580c3e26ce0a679be298627517", - "0dbaeafb4baa35a408efb1c18e4156d1ee82f80653aeeea126f83e8c8b1224e2", - "ac7bcc1fd78628742490d829bdce97cd0cd8411a5426572d193d87f4d251e69d", - "c6732872f9f61c06f66ea59c0043ac379c7f500b20a9c80c07d3afbb07f0d842", - "7b775cf0cc97498d3f0ec98020a1284b49bcbdcd675a0040de2086761c232fda", - "1faa104c7a4d483ecfa3d2e9d04ea9d2a8ebab63a072e36633375c8ddf9aa351", - "709a96ae25af7fc38667197e11223e8d4a83e39fd93357e6440e40246ccebae6", - "54c75f0c5e054bc5968ee2325380a35aa7cd421a8d0ee529082d76cabc333a79", - "d9992f536df2d7e3b1baeb694a8965e6df2183d0c0f68f549450ddf9a9c8d979", - "911d617637520b177cf80b0d07b8c4c943e1a66a4c1f9953dd297104e400c5b6", - "32f2f58accbf3b73173ee39143d03ad11a520d408185c7c3029f73a91e11c002", - "8becc8e6532da6c780cfeb14d94a6509e245478ad733e664d9919279a51cac10", - "0455aedef8c1f53e6875d0b5a9aeaa2eb728550d788aea4e569f379e1737de94", - "164c57df4d02f1430c583c7b78e3a4f04e934a2094e773f218b0087dd2a6e218", - "2ecbba290e116b62f02fb160254f68dc18d2533e107695892f91adfae19ada70", - "ecb6365c43c77a9edb554fe9f32019c256ac8d8eb59bb57c9618e332b9079b57", - "3817bd5e8aefee77ff1e946ca0aff0f453521775f9a6a1553241352684d7ec5e", - "a2155fb72b2c694f24f112681a569ae0768fa403713c398276ce945be66fb161", - "89729b0c61bd1fb3a2db306b5f8791fbbcea73af1510b9331f8be36b700d6f0c", - "c3d4cea5d4dbf3f506b030622b1a43a4e994f6352bcc63835928e88ed9776961", - "e3336ed6ac55eff520357eb4996439bdca7155506aed9ea0a41cb5f5fb36c238", - "8c51c397103dcc1b0c9d3a2ce49a0121ffcacc9e146d42c19a9c943a41d4ca84", - "e72967890a932be863e25750c790b127d79ff92ea97b19e7adf5936751d20d61", - "6f03d98c91eb1627f07f04255e17477f77df949063d171e74667d3c8ae7083d1", - "153997b5d557d8ddc91ce5e8d4200598de5b7867ba553ed19f8b741371fb9ce9", - "d79ea1536289b9c6360119eeda18fddba365b14df73d6bc858894b2c247a17d9", - "9fde6c1140e7e4109089f549a786afafea9f17bf6110bd192391f158931e3e30", - "d00e941fbd4f1794c44f8fb4d3d7720e6b2276e762fa6766b27bd1435b47b3f8", - "75c71854c30cc10afcc3f742cf6c351a5fced32926fa5cd3d9738b4508e633d3", - "df75325b6e6320becbad55524ad5c6f33f5e03be6f9ca70a16df97ed47b548ed", - "8051349c88d29a888e1baefc3b9bca2e2c6fe343daddade2186f41c864532848", - "8d275e447005721464b1b2527644da2327d19dcfa1953fca425e5a3e31e31315", - "bfaade35750521394f89d49e08d95b13f0c21ff7a70d110f2bd9c27324f4366b", - "87be2c8315e57d6ab465c6abd37662635fa3cdeb361d9761c100453baf3b6555", - "e32fe2ff5159f4698f6d9cf929593d936ebddbc2039dfdb2eac60e578a77f025", - "7855f681a42561cbb007aa192d5dd0d165a87bfe94aebd73c20bf82210a037db", - "745895380d6766caab13b955d1e78b50ab794e4f8d781ebce738f87a6dc85378", - "68076dbbb73da46804c01aad36ef9a76d5f7edde47cf5360328b193b50bf8d1e", - "877c8e8ae72afa9fcdc01c254e047477ec7f66255b350ee6ffd7f3013aa9cd1b", - "997f960f467f5aa7e9d403119855760ec1457cdeb28c7751dfe0f004e7683ad4", - "6a30ce0ad0fb554583c4543c74e05c786e0abd1d28934484bb2d11d7742b1206", - "25106055f9a8d3c4c9f4e9b25717379813fd9fad2f4e4b4bff87ac9afbd194f9", - "95d30b66027f9619ad432fab06aa315b957edbc9d9f9cf7e4268206f9519fae6", - "d7e3e2edf467c1a025095936ed5223f22021018ea9c842af7156bd040c8563dc", - "538e771cd6ce6d1857bd76593885608d3995d283d4f338ca3298b87430e41106", - "650ec0b9369e2794671d10e1ebb7331706d49079957e81152873bbc1778f3387", - "e5e53ae51577549ee9d900822d00389f0253bbdd4f8f46f9894f112b36c17232", - "bff933a3ab862976e0efa0001c13edd37fa838b8b73c3b269765c2995806d1e2", - "1c9413d8d1237a275a2623c8061649b4a10913af9f09dee35d97823551af224b", - "9d2be74054b9371c1b0bf28ac18d18644473760031bfeffcc5263f5bcd7cab4c", - "0d979f64d8dfe8e1f8ca3aba012454ef9b2bab58a1fb4286b26b5205729ddfe2", - "4849a2ed064eb9fde1a0285ff8e53ccffa8f4ea9bee8626e4e5f1fdf715255fa", - "16d8581551a848dc2824fac8dbe431c7bfe3fc3da2a4005cd4f32eeb1bf673b8", - "b36df8c3b0fd1a96e34067ec50fc43ffa8f1a6a1b2e7d17ff749229c21ddd39c", - "d1f4e1e531cf8e2ec5cddb6a04520b0f57c03b6f3cfb1c57b3de1f8e84b91a3e", - "2d9b4a593a62fd3980c8c4ddab85a999196a8581a65e4441065f61fc3071382f", - "05414f85f35d95c621aa67f84b82138de343a1e592ac526630e5b8dd7f9ecba5", - "9545b07de1e0ede89954200c879d69d5dc924e92351a0f078cd838c791710753", - "5e3bfa6856b43a4430025bb115f73163d4bfa70a07ee82f99b5192fcaeff0f0c", - "a34f92fae7b6c230484318cbcf295a2817c68fa02d3a7a9e44b3b1ac2f6525cd", - "6c0f94b0a2aca0666e3df7639d51e1828c61906356eca8e82ac4af4aa135f8d8", - "49856eb66041679b2c1c172c3d621b9fc04e9f5a3ef80e2289442a7abf5a68d7", - "95d91e62f628f10ce3a92c7c67c221b60c1449fb9da68285265e4edc8831c7bb", - "8136c0565fd526ffd711b674f9e00f74796b9e4e02387108f00e889d943abab9", - "77f5c0da98b94ba6e1c10b88186f65993d723ab63cf513429bff5d73614de86f", - "484d0201c10f9dba7270882ac0ceb321bc3a6229b40d488512559cb2c717c5c4", - "631014c13a49d1df7214333741f610712459984043f1ee8174e0869e2893fb6d", - "476c14a67f34147928319449e1f64172d1bc19f32a8d5fa383728fbaefc32818", - "1187d729a60152813ead7efddb358cf3d11a9c2242866a275a8730e61081f690", - "b631690762ddc467fba0b26d9cdcb11eea5355f315b22e33d846b007199d57f7", - "e2695b841156b702c22326792671d10e557f01fc91752f9e9bdba86077c2df47", - "d84169ba77dd44dc7e0d9c8482dd811c1059603dd2ffec778e2da6b7174fd9c0", - "eeaff117bb2d4439eb7a35e455fe374a1d7d6a405bb35b2767231e43b972b5cc", - "bf907f45b20ecbe949750f4669ef88b3a923a4f57929aa9aff02ef96811270d8", - "3a0e5702c40f409bc7ab9f6bf5fbe39d0088c575046f9a1c7ce6f383f8ffab55", - "a0504d236e93682ff412bbb35cda86598293744dfc68b81a4815ca417119dd34", - "c5b783be651b64d568ac0f4215c56a51c6de1533ed5d8d59bd39ddcfcad48d6c", - "41abd3743070ef25fa986fe5c0ac9dcbc113ade5a3317afc67490e1cb9be0260", - "0c39b5cdda72b1ecdea9b8fab92cbf7c6718e78f66b736b4767cd1798bde121f", - "03508025fb8622859f1a1545e9b9e0a6e10ed250429e46164784d80a78686045", - "448ba9afd16bf9851f550b0f640ec0ba07969bd821414df95b61f20760af9447", - "fc5ea0c04e4061f75eb3969f87827cac0986c9285f46e14f1421f8362470f570", - "f0d93c6378250b3861aa50680efe8d143f8cc67f986a3e2e52d073a4aba8fb9a", - "05b73ff94795efe571c65a606ace234c15b7c28ed81110f1ddc4f6aa1cee6fd2", - "68e0390fe1b228cc9af1aeddc94eca19030d0c0730c48e1de7eac09ccb2cba5d", - "a9e40a5961b98dae9f4e3fdd0887802d4c45eeda9653b6b8fd713d074e19c904", - "361b77be6ff2e89d6ff6e61b8732710e42a251906aed5b7af5753dab3e871f4c", - "7c889fece53ba51421c9132f6f756a287f2b95ccb9ddb0c7d146b06e0bfdb5b2", - "2120074166d6dc5ae0b05c4bf6b66b9f1fa1eeba0c95f63c48de2a28215d5b3d", - "a58407e6ecf6fa3709a3e1b9d839ee7dbb73937b85c2661565143a1778c4a12f", - "21c5664a12d5c0802ecda15aebf66b358b69187e43c2d9e704371cab78f3d52d", - "6cc80bf580ee90fa6bed9d6194712859a28c817c51528327a218467c8d1a27d5", - "e45e9acfdb3453a8fd7aa5ba5e792b1c7e81b01e8ba122d2ad1e15665cf8d242", - "a9ab04222b4b799899847909680147563f7461eb5b567ea84473b9947b7334b4", - "93ed24de98aec0fc3554209e306fb2b68667f5a32323b5bc56f7cebf830ed0e6", - "2ddba8f9d6174fd091dc809f5c07c9c59f3d52a73aaa3a1e02f4244440d80bfc", - "4767bdeb94ba58f031ba7d42c0a4ab63d6150ca9261fd1123af745c62d78f733", - "bb669d70333fdc6c6a82e67a8daab14a9e4ebea29981082e480a38774172970d", - "f10b608927d2956ed2c5c8263fdd1d63e4281307608a464e70c44d1c89e8eed6", - "49145252b80178834a8cfb9141eeccf155faf4e2709c5e1455b0b5c56aea02e4", - "18b273b2b3b3199efa0ecdfd4a2b6fa572f5da1708d3240cdc84afeba4014bf8", - "04617595aa3aef7ceab899d5dba47083567230e4a30db1e57f04b9e93b6a0b3a", - "6faee63b335973e9d14d678909a96de12c2496602401ea5c41cf5c47bd1bb24a", - "b02b90963370f80e3f47aa43e72397b518101969e3fa1027cd02eb7d2f8a83ea", - "619cbfe0703520d883f1f06db3cf4cf079dceb11cd6e01237151ad4c45e4e1dd", - "a252973c5cb93292313234b6a638c7f3a4f766049d72f0857a64019aa7be33f7", - "9ecbf79d405608d6a7a20c5966b1d434f9aba85acc05b7b7d2932e750d84b745", - "ba0593c6a0c475b682a6895e5fb60c661cd3be101c1b4b659874dcfbe20f3017", - "463487add9034a92a1e774fd753017ed4385912c993e7fb058964bf23abced60", - "47b1f671528e35220a11e3a2c1bd867ca85bc96a59209cb13383884dec70e69e", - "09e0cdb7c21c60df2d5297bed84def26738f32930139d80177eab8b7a358355a", - "c3ef56988e561c345493a0cdfe3a5b709a740d368a3e7346dbb82fc0e05f333f", - "6e061eaef8532cb3f5753f8be08f336b7e56ec579f7111c60939756717e737cd", - "e3ae6fbe94d335ca91d2d9066967ad78ffc14649a01f481ba6326e0c93539ea7", - "028e0e759165583141afe7b076befe0049aaf315a9fa74646d16945bf15becf1", - "eb6e9cac2bea206f0d45d36b3713792189ee52586251b7ff151c7054931cb292", - "6b6cd6f09f9231a42852e1816d15b84cf0edad1a87e9c4a76ded5274e301eb1c", - "85c8ef46155e195d641a7ba26456f3dfa43f2d78f15bf48c496d72934aba4637", - "954cd0538d4a4aeb50ed2f96f9b48bca3018b521d2ee5aae2bd3485b0e0573a6", - "47967ad927e1ab9b82a22575c12c1cd02e084b4343859ae2a199be21dbf302ec", - "83010712b6814bdb9bc21b68800db871a598aa1b50483df602896bc2478a257d", - "0c47453a33a40df53f5b84c8d1ed77b01ed0e6d7c4f035bedf27e3f9dec17b1c", - "b033ad8a01bcef0fdcbf7fc29bea1720fdd29332d7ea5bde8e880da99d3135f7", - "1e89b996bda7bb84e3f4ec5aeb8c19ce11caab949121da0d547511195459c58d", - "d5f4f1e8298624dacc7207f6b8946365aa52dc01ae3106e536b39355ee0f94e4", - "506d90b407f48792e8929a93a52b3277d7385ec8a89c13f85f2721953e6af75f", - "5c09f29c0f41dbfe82b020612d6db82b496a630e4ae2ab7663e37d9f12391c97", - "edeed5fcb8fc11c142a7e8068e98de8560c448349c97200765a5660dc188a254", - "d2a4d5fa71213c791572b98d9b65eec3f099fdc8ad1ffce9ebc8178ed392d80b", - "0535d4f3e63405f3b340d09b97e4cc354de72088989c16f89e8931966dc47003", - "945dbf57954e438f834672185cf3421a91efff117e7bce192c7251c20e43f208", - "f58b0c8f5b61746747a17a2e5bd635ff4847e94571f344b7bedbc9ab7d5a6034", - "901853ec64375d632d0d03d02944c19303838142355d6fc63182a6b6a33f5891", - "a04f2c80ad438e2aeafb80590a95a19919c523f68bf219bfd363191ce7fb5d1d", - "a8f2fdf0af54910dd0fa14f07a3d9ca01f0219da0cf548a0e289b4ddc72cdf44", - "73345b3b1d187915b0af80551f062ec03fd43f68ec26ed4d1c5e3b1604588c5e", - "ba3aaa17a9d5bc69e6fb05fa8ffd43baea48889f3a97636e60e8f6ee2927515a", - "176f39f71177467280ded12e952b02504dea015ab6b75a8608f894155a5a310c", - "060036fb10725054277555ce84a93099a20e032c90c278a8bd1b772454d74e5d", - "0902ae1b8b95581764458ec912606bf7242b14ace247a8a1cdd8dfca775ef462", - "475700d529bfeddae563227d25480a7cc5c610ca6856822c57fdf57aaf43ac45", - "64c51d4f3499d01a2a87a5a7c94612bf0e61e1d5b984a24383287d73a341d5d0", - "19994f4c880ea08af067cdd452db1d656df2cd1e478b65855def2f37246f6428", - "7dd844a4aa8e462c513b19f5a284f64c2b92ced20baa53e9e33ed96580a75afa", - "7edb493aa569fd2e856d9217e427f9e75d913ca95ed2711aee931e2fcb8924f4", - "48d8b35a5b3ce56255dffd855e693abd38c78abf510f5068864859c052dfc7d4", - "ce15abba5d01384cbc499a6f14623a77a3001f3042a5b4b30e2fbabe4d9e01da", - "c44e48cd495cd061b35655e93080cceb7c3d794e131a9445333a5e40d1ca33ea", - "8cd4ef7aa617f5f2dffe023fcfb591375b4048d094914cc265edaa18522401a1", - "742a4b803b49cd5f2403f02d55b43196fff116026f123009bad61e9403935c3b", - "743908b3eef19a60e43ecc4c40ef926ec07cb793f313f7fe8fe4d2e6314845f2", - "1faabc28bcc153248622731a443ea26cf8736bf03f14e42d010087f63b7b1692", - "d81f8aa3486c23183b67e0ae03578a2cded7c17af369af50486c18f7bb777c6c", - "8282e31ebf48c3a72bbb6bfbd17b7f27d70cda98fe2d99cdfa2b4b6845bca843", - "480860ae9a87d5b3201fa9032164eee3d8c6007e00727195325a6589eddf4afc", - "8751b96971d04d9798ded87ffcad80389ece20186c520e32c5bbb99b339dba94", - "1981a3af91ed501bf2b0f3aea7de3e3236fed6c023269a1d14bf56f7987eca5d", - "13c7c1b9fcdb41bf825e4554c3fa645f638a2367870b1d61c3c3a691cffb0b28", - "944f6518c435be6d52995c6b3609a8dbb6f68175a6f7f578844a3ac2da37a896", - "63da81d52e32d74de84b4760456cf16c77f21b2a682d5704e3aa9feb264b73fa", - "b6f1b809d2ecca993ebeaf14a28c7ff08853cd984b72e6aafdef8801e822b520", - "2c310ecb448de21d6abf4a3defef51b9cf37566529447f0dd91b92d76d84f9f8", - "ef70af8af2c36ff2bd56cf639ff5bf5316946c00c2f32550b56c4c399a8d054f", - "fd53b0dc3316f57fc80f3c9a3c6273886bfdfd943706183105e9db8cecbd70a8", - "4474fa6b5eff4f41282fb3cd5916f2ebaff2a6fddaed56ee9ca9d9561a7042ea", - "cdcc94083c183a84b6139d97b4af788c0d01863ac514ec385f6af0bdf39391f3", - "766a2ddba7c81240b2c3d2ea7054aa74ed7f4541a2af2e9c5ba9a9a2e6d23d05", - "38367e12ea77b4673e1298f15212cf3e6e7e3ef555db7d2a42020ac3cbc4fdbb", - "4c25722b63c36ad16825f5dbcbfd1479c0eccc0519e1815ea33119a53244276b", - "55194e347a9d4ca2fe5b731fe3d0ef36ef75b945d797ee4953e1737747cecb24", - "1644d1d3734be9e707bc3c268f7b42b9c0bf6ab8e0fbd1b912a70be97493cff2", - "513cd646403e382db685467658a5e92ee221683037513878a49ab188e2b2fc85", - "8cb588d40b9ff9a9042008dca0a319ebca6755c9ffefbb636e0611822df21c98", - "d66dcdacd20d0d7d266801d7fc74a2555bd412e4b6e2622af33baf146adb541c", - "de501510acd58441d5975c3203e175747a3703b84fe3138d6805342fecf459af", - "37829a7b466f5d5e3abf5758cb5cce09f54958dccef9809b5a94946116d79e44", - "3493747a6e8ac0a4e8fdcdaca46bf589647d5eef3c23c0fa9441a9e9ee56593b", - "90bdc109847452ff1a57c592d50c2becb985745873091943ab572821a4251630", - "9b3403043328485934cd236eaf3f8f14886095df9d3bcdeb6405ade6a91a7b89", - "a0d0097a015be5490d5fae7e9632ccd84e73172d6fa53cd371d7df3f4cec1e6b", - "16c5f898ab9bae2ab73b31774d6589243b2650c90fdd3503b97f4bc0929072e2", - "729f1b15301d9a4fb5a0afc415d33b2ced866fda277307dda031f05aeb3391fe", - "c5374a8b91d97425729e2b11fd4c806453a807a57d36b98216668f9b1c2c5519", - "2e65ddbe84065a2a4fc5fc3f5c9df2f19144055ff492e35816a7d3a1750e385a", - "c8153b6855ca4b8fdf736cb88d42cca971be2bfe742f11a4988bdaa2a31cc7d8", - "108fb418236e1a29a5aeca083e9ef9802915690523d0f3b44135666974660cd1", - "2065826194a1c325f72242dc1a22ba752a1398fafdcca9a46344d41e8a9dfa7c", - "9b97b8e55e05fa598004c8a4ac0b8703f1965f450ee8c7fb242db3abd6f06e84", - "6efb2f42d0381f2aea2a51d157260adb103e5cc150ac9389c982b98c79270e49", - "f6a127d5cc6658c781fe5d3800d42983b8033cb1e225a3ff107f0de2c7acc6b8", - "ecdb69f97115842594f5ad40866ee217b032033a3ace45305210502acd491392", - "ac659ed6251ab3b123576c1b28448009156f3588c302250c4d9a5739d1044364", - "97d934f706424c6cc5db63efda2cf571d6d51c8434bd28a955564888b5a78920", - "ead4edbb783554a709f4b8a3a70e1dd249c69425ce97953d50131d6cb0e9df93", - "b43485a5fdfd7f083bef874ff5a1f82507fadb5d6909bde6c08b4e247ba7984e", - "28d88bd4f7e5ce7d91dedcbcde0433fd67a4364755c588f141fb57b50b8f53c3", - "00dcd46bd1eaf418b5570ac909d6e1f55cff2c499167444f9c095b087c75210d", - "a1665e52ce2ef2c5d516721eb9fc27cd6b738c8efa5b8b857fa2361e89b3b35b", - "4ef5b2e7f6c3450a654d08487ea331d2f9dcb130bf2d56093a7f8f74938a7b9e", - "f6a995442abdaef420042d2af2da196ff9e134043b7bed4f242e8731e6ca35af", - "c79bb9d322380e7278e6cf9810b4942dd8640543678fff047814dbffaed6e7e5", - "77e32258778adbee9f46f67ab684704f6bfbb48886089122260537f39e5c9f0d", - "89449ef18b51868c04a38a6b0764ea5a46645575fcd830d325ae9f467bd0d17e", - "5e91c13794f2a20b4d4bf7ed742e753cd49e515e6fc682792c47338f94d89883", - "afbb24f69377d30f48b13ce6a3fa7973ebb9c238b954208a99659a622ca02376", - "2994dfbb13b55c27066b3ac4a2e4ef983b7c0eaa6a752f76b78a92a8429120f3", - "69319a640097aea3c73c44d2171f19e599e19a0ba9b75f33d29e75788f864d4b", - "6bc43204d649a3ecb4f2e1ce2b6c513855cbba0ad5980a24b5de4ff9a74da070", - "26ec2af05c3eca81a2b7e2c95ce49d02fcdd79ecd7f2039f0dd4be94a3999d1c", - "31157dabe8f79f35ea2ed2ae46b869b570e93a031c490325c73e070950559e39", - "2f5ef7f148d1b85197750bd47e6223d0f2bdd3806e192c0e755736fdf4f82501", - "7600871f58acb582b357abcc3d9d0e5c747a162ce9d8799ee0dc1395a18ae33d", - "592f32b76e13ab7eeab2a027677eafef6b8369e9511dc6075095ef3fd4ed88a2", - "caa8a707aa8dd47a5c5e716ef82a70e1b344c00c677ab36536cd1f0f990a5221", - "ce86d51a977b6c8a6ed820513248e7b470745d438ad5f78ceac4071e2ecf9b19", - "6fcd70408be21b1eeae11008996abb9be725618cbd3fa95f78af45a71b3ce7e6", - "1719fb5fdb70026d1b617e3f14fdf37ac504f408d5dccb120a2b8ddb36187e17", - "9a9647b64d26db8de837c6edb571be2d9a6e72edaf14c85a077c72f928cd51e2", - "c8e211513d92c5e15c9c3b498dee981a72d90de88711e0a75eb5c3af3f64dbe8", - "145b3ad896a5ca7acf6e170bb1715c71d55df4de769007542f72eb342ae15752", - "52b88bc69d9493ed141e60c380c1916082c1006ae790c16b5ef8134f0066a06e", - "6d796f072071eed2b6382e97ba81090af31760f9f54d2dd5b3814a69d2d29a24", - "b7d81fcfb2f2e5933b6eb8686fb20c439c7aad08f7dc731e3c0ce38f9264c66b", - "e99a0a1f0693f749ea30ceeb9385c87657e62e6128eba6fb8958491c24103c40", - "3f98cbcd001404285ce585c36036172872decf90b1c4425aaa8d20ddc493011d", - "3a3e84ef9136e5b0818ea2a75ecbd1f949429c3481a9d28051bb7bf35c3318ad", - "64cb67f040da9d19fe6796537bd6d874b25de12d617162ad1bd8f5163c7fe9c6", - "b9b41bb5a5e98297dd30c6cf6858ea8357e7e95b2f4326e055c7e6185cf1358f", - "de7e5be3b4e510f9ee4a3680b726c698a59e34add067f622faf4fe7a8ea8ef3c", - "bbc6379d2fdebb14327bd99f2eb48c43f5deb9eddd16a044ea12a7b3fc94ff97", - "52f35046bfed878a1478804e20dd18665c03f18c01497fc2652ce434c3efcde3", - "5725d98d8e2f853697b427176a726c68dc642c6e727f7bdc7b3b2e3418a4a2bd", - "6eb67ebe072a24f3bbc24950388fac0133b2191e38eda5a8875c77a4671aa553", - "76c823990e137df919cd36374999131dae1e4f17f725a571da4e634bd82a0288", - "e71fbbba558b0a25d39780fc92f3d31afe53a1231945ca63c9419866464b949a", - "452fbbb1f8fc9d4bc2d6c2fc4bff9f3dc013807ddaceff916e17da1832c95ad3", - "5ab9f89401cfee1924d6bcc3f43103af821a304eb4242f1200b72530528661ee", - "363f0b3ecee7b197822c551c74c38a5592492915da5b0afea1a984e12572e599", - "406bca307a72ee14a8f6b657ccbff76e9398037bf79e4243d6e48496f11ad170", - "5149b97339ccb3092c299f4c6eaaebb8941a3586bb0e992395ce202d4033ed2b", - "4b8f725fdf59cdd1cbec5a0492e3b9b348c80c381f92335217d0ad7dfcb94f4c", - "8b7b493046ade6080284947c2ebed8fefd7d88295f049fb597499ecc954c71b3", - "cf031e429be00688d34cd9dcdeffed43c1dd5701d313f118e408e114c2431b92", - "74ca5569749e48f9ff54e1299229e364f8215e966a25ca4196ecb1c8d8239f59", - "17868c5a0d541ece1ccfe9a20feda47169d81aeccf673d1a460a393180222a4c", - "9761cb0ba8429db91cf6b8e0eab9490f7f43381a54367a81cd3d0fb51eeb5b28", - "3733c45b1551d445eedcabeb1864b90e458fc0b07e2b78142e3026e9f105ae37", - "13c5a7ccbe37704172862131af52d6f86793deaf32c8f5de62fa51e89b3c9dfe", - "9d913fa7aad7d12012de48c4f4b1f06ad5692268d4f81205e2c749368e55ea17", - "5af680772437347722dcbdfbf7e9e0398b947dbe5eac991c32d44dcbc7b8c0dd", - "4b395786687cd4aab5ec9c2ca8ff915196b2402da4ffca7a3ccd1fa51d7798d9", - "f2992f063fb3e34d27c9f8c9bef185a6b68587c9dbca6da11c88bd1068de5b2c", - "64cf4b2a73dc68022eff209c01c6afa400e1ea7dc56bde850b2e933a64a78ec5", - "542612ebbe623ca44a6360b65f310fed182ce05e0e44efdb4dd1dd9b932061cf", - "e03adfe425ff3d2270d88982b7ec2e8a66e471c411ab0a98ecf19eb951fd11d0", - "0cae185bd9d762fb6d44f458a43c1ced8bd117ede6da332d3787d54c41b1ef29", - "02401d867da2ebeea12e7784e3ba518f558e5b5d93289bdbad7ec63c44a67ff8", - "d698e7533576f1b196f91d381a74e206ea78234e4081f3f5eeb0fb538550f8b6", - "73936634b629f0647f714dc0db042a63153816b4feb6fd2cd2621d0c1c686032", - "16eba6b437dc244ab129a9fd6bfdc711ea25fdfea7ccdf819a45949e13159192", - "802503b33e994443b8b9d7ca099ef03b345449732cf9e0897df837cb19f1bdac", - "5102f10ac2717994ab8bab6465b10932aec60dabdb81b1c45b1a44f4ef40708e", - "3e9d0f308d50780a33cff25d6d3e7caf30e92169e9e6b90c0b15f1c0ddfb2df6", - "d5b09a1698ec5fc02d96cec71ad99ef0b38473b8bf6ebba9747dcebf55ece040", - "20cbe95e09a45407aae50a0e1ca0e8829c89cc83aaab3b5d213e230507722010", - "19f95282a00fa3d56bc969af93c351ff893dcb9c1c47902c2da0374c26cace91", - "e594f3f4fbf8c3bd18e58b6d54e7bea33c63fc1a1115639726ada5987e1d9f67", - "5934c485565bd6c4a00b79121f652a900bf5fc69f33974e9cfff6250e7e39c51", - "a42f0951a9a96ea4bb1fc129cecf30ab4b30dfec908eb523e073e210024d1ee4", - "88cbea33750b60baa458578e34fdde479d374c1f1c9db22df8b85636d4964394", - "3d056832d64724d27a6a9aaa52f0456b79d1e05cc8b4a1b1385cf6d08664972d", - "a31824523d10fc86766581846b39171680429c5545c8211f9a8bf9420dc9eacc", - "54e8adaf41e8f929820bb6b0607be1190e6bfe678a7fa38a2a6fbe812e790d01", - "ec8eeced9c721e365285b97c1fea1ac8897a8f6403253dcae2a2a083d1b49753", - "754504111f3145e90f3e904b597b02accad04186398c0169a269232c54dae006", - "e582476c0d7e55421d5c3f716b65e2f85f771cbbbe56d62b570c11bb0d3e7a40", - "6841ceb98521dd8318b6859150a8b3714f49c1065fd3c7c1db040861e6dd4773", - "a883c3dbf53ff728441f66d9761150dc606a1e4a4d1378ef5616ed4477f8d022", - "730da68c3dc06e8ecc256153352663b0a8ab1ff20f7c1426fd648407d2177540", - "d69eb519eca6f51b702a109d64cfa0ca52b98bff6c07054442981843c1c00d13", - "ec0118e29fff389c57d1928b5de37e105e9cc361fe9d1c7a94c7faa296b83efd", - "0257980401f017f883d067daf2a9d426e5072c54f74fa1977692c2a200118eb7", - "e4b45aa4d450ecce12d46c7fd2aed07c40cae393a47ad9bf66e811d9e80b233b", - "9dfc592f9dbe343ed4b3b6de6b522da06f505cb28d193536a831f30a9c1fae37", - "34381a8f1b9690985380e85aaf6ad9c8b9bed497e3abf7ca0cd44e1afd328339", - "44e0bc8e7f7abf15b2b16276b1ed974fecbdec1f4f3cde2a92609f6bfa67a0c0", - "655ed862d9706b90540be35f7a35371d0880b87dea5cc4519cb401e521b90031", - "beb4054c5a4bd4b7e21928dc85104ac24eabd1c57e726a11c76dd3cc95975954", - "bb4d85747f676cf0efe605fff302761c77ffdb33af4df417c8cbe0e451fba935", - "c7cd1a0c7a7c5298dd0f52e474ee6e36d7552b6fbe0377ee56f09064dfb9cf56", - "a99f08d9da6b3f44cd04fd0980b01b1119dfb1dd2e29b94c19ab5e4940ae23cc", - "bdc3b9355292547bdafb6ba01b0af5393f92c1d90d1b3bd6199f903c04478562", - "e04d8e515771215ca7062cc60bc9e06885251462756142b7b049f99c60b04c54", - "67b31905fb7c2707028b98ead62017ccfc1a3a9d0e327df20706133789cdbbbd", - "ad019a28a297a249bc91f858be2ea4975ab8788ee40ca59b2368a27b41b9ccf6", - "5119f2f19bb03dcde72ce2932c08d58c46c3268f32ed94ee19f098cd0a01f411", - "53c485b2b6afc88678fd00113148406dc5da365f3c49bd01135f4a5779698ce2", - "fd9b7b5a529ddaa6321f13c49198bf707d9b1b89991ff7201f4a8bbfbda14a4c", - "49ce48566e10ff102ac999d4e1df2bd4c47600aa42680e922aaec2fe4872ae76", - "b3ba135efe93d5f5fcf127a0d31ba45fcdd44cbb7c31b68e7f55e88bdde45c8e", - "937396f9c750ca35ce77679e523b2efc4b49abe5a878125dc9722e419fe4fbc4", - "d9ad27d4711b5312f8e207d43e24ffad72da1cd62c2e8a9a5f70ba7c8f7b5046", - "96ce0cd5dbeccaba2a97cbf2cb5f6de4334d7ab92e631ec3e83dcb05204a537c", - "f4594b0a110dc59744771723e5fa9460654e478c3f33fc87eeee5641322f196d", - "a7ce7969d8638996de02a86d841aa94360fa007787bbf473e596f5ae34037cc9", - "cb5d99e4336ee8c942fdd65b6666270950cff7fd116e923071eb52c8d104c11d", - "1e88ee9c17bd147f374c09ac60e932e03ec45687d3c5aea43fff8d61411e54b6", - "4b5c66f7ac399bab5190398dee9f448ee29971453e37bb19be37e182c87d8806", - "b299df4472c3857ecccd42ea98baaa18bafb3470229e88f73ab92e9b8f74f4f2", - "134c0c24bb4b2b25c2f1a3e64872d01a2d833241aa4a14b928724ca4c69361e5", - "ffa3c128838f9ba96b8087948de133801080032b9eb1ec3aef015ac1de6a4faa", - "4a8f36afac169e369788f8427fb83468cc2fa72ec6d83e3f2d0c271be284b5f8", - "508f54f3d347a6ef1e229f04101db2fe4ecc807f3f7be20df2f52a916e6f94fa", - "0b8fcf4e2743fbf9ea424ea56d5d3415ad815487abfc318576d51b5a87bc918c", - "f1ee530f0f09002c2ab6b4db6e245664a3d9439d30807aea60c038bd2fe494fe", - "f63d0e0b811a5cc97cbbbcebcb4cba24020630b2529cf8d33341f1439a8d70e2", - "da66f46db4b5b49a381a2ac884cce5297146100fb742096bdb748d34b10bfbd8", - "b0a9e7c7742b49bbd7173a9555cd7dec5612ea1b0120185cf6a8f613dc1c739a", - "7eeb7bdb632934bded79248518a25e6652c83c6890cef6b2857fbe435a2f821d", - "14cee30e95cbd50eefe1aa7282b6de86c5b9b37fe56c572814810dfac6ce9683", - "adc7d214763f26a5a1f283746ecf4b8beddf403d59075cd09e540a29b0a4babe", - "a3b6edbd7947d0ce11e7e2b367f528998bd3e95b8d512e8b36bd5344796cad53", - "db8ead0387aed59548c3518323a61dd95ab09bca428dca91a2a2aeff752f3fbe", - "11f9ddfb1544463cca5c6f8285e2ef1c1c8f5b744de3ec3b3da656432800067f", - "b09f27ab8266b8c2443e99db5a28731d78aaf4d5fc49f84746014df2acab59ed", - "7d27da5df57a9a41348e2ea4de554087c7cc7509cb777e896ecca765bfecb98d", - "5ce499ebabf6731b7731604eaf16aa69c28b5421a7f89cde4cf590d809ba57e0", - "2dbaa71fda94eb3a4f1bec46641827c2e9632f4b048358f2765ec5cbf3cbb5c6", - "0ddd52ed53bb4982054705785f7ef06c3cbc1d1ac861cf689268cfdff3722e3e", - "085ceef60efbe695bdf234a082636ba233c86acbf3fa9371c906ea9a20a56186", - "d8d9b9bceea2ecb77bcaa713b6cb4df127944a912ae8b017ff9b5c1db197d997", - "7b35bc18ced3f2a633685574fa247c7840811bccfb1305773c4991a70d6fb627", - "3249757aeae6f382c4b6584e3dac18a281d8908f84b0d9c7829256cb1653036d", - "a41a655062309877f6bc69eb199d759538b3795381963b95cb28867dd4ae7d75", - "002bffe7a07112f3ea5ef4392d998635f6d710f223ad540c031e3e8c2de3941a", - "8e3686e3b0065f49cb75f949f4e336131d7491519610684e47ed3147c79e49d8", - "4b55cdf8b7cf57d674a134d841b46854172801824bd24f34d14e8f7b25fba611", - "03f370d57eba312ec71f08a720566a29a17e48d39dc15fb32fdcc49f4e7df2f4", - "4b4cf25d20921a0394c2ee59f132bfbbd9f7e4f3bc9f4caffebc5f4821e914c2", - "0976bc4de7bb5d8e422088e558cf7fa80ec65fda5bc53f1768aa6f5bd944091d", - "e69c35f171529fcf34038ac13848f5c52003cfa6db67da7caa923a090f6a7271", - "ef59346561cca786d1548dc73921821994ee37f28e1510ff9a3b923c75f021ff", - "75070a2679b40eea961b09860a6aa68f94793a26341b211aad836a0155d1c39e", - "256f636ca0cb78ec85f37c901ed3357eaf6919e788790884a0153c46a8a2e0d8", - "29ce4f90500bf2548137b177845a40d94f51893c3557d506fff24737c12e4b86", - "92634fd59889ad99f9638db8b6e4b7c5ef4c10e10c084af007b8d43427377ddd", - "eca3147c69532e01495d91f48d7eaa1a40a37f18be2b31b8790bb5437e6712d7", - "145c36d2d9fdbbb6c0794b99b2390d169ff66cfa8551defd409a79f0d23362cb", - "b4be3134d0fcf8e021f8a5d060f8c7ad916d8a74da88c24678cdd2f899e0ac3e", - "1923cc053135d45cedaffcd340533abeb468e86649040ebfa5010e5436687f2f", - "7fd0218abf4ac50c613418d1a4ad131d1864fd93228e132986be77897cad1e8e", - "886020ddc9abec4b43ba820777bcae0229d36abb08087da12c53e6187630e9db", - "8ce9a3fab1d84b53d5a104a6e8161a5267f2aa4c2ee2754ab0428d7998a2ea05", - "d14a430945cda4ed06433e152d3ba92aacbc2e42d1d296dfd57a6c1db2b56deb", - "d41c63edb20f48077f023c2faeddc4e5b19b9bdf92f75e2b91413912d6f685e7", - "76b4ff37a21fc60f9c6968ace573d6c5ef382065340871b4247a901b2e6dd54d", - "b0b718d771b0d98b60bcb956b8beab4e0f4cf757579f2faeb1fc2b624debf26f", - "8f3a6e70c064838adf13affa49aed4e2c184a3851881ec4365483ad7d2937a9e", - "c89e5dc1d6ddc1412fbd51e749a01b352eceeb1ad63a216c29edaf8de3856989", - "1647566b9a68ff01a5edcb9ac6744e24a9af5ca45b3b4e8ca2a46ea260e94e88", - "34c308bf79ce4d0982c42981eb3da75eb71c181af96f8dcc09524087d987a30b", - "c47e36d118179d0a79d4e64483f7e9e231b060e68a5875f3e2ad5ed608187439", - "75213f695a58be193e1ce8f62d3572d6dabac02cef1a0ca46fe63cb9a46bd338", - "75b29eb39c6352618071c94bd4f2c93f70c4820eb68008261dc85db0f0e9a511", - "84e269d18d10d5fa6a273dbce38bb9e4379a80e04e90f2cfe0c4eac71340ff06", - "c9b40ee80eb4909ec10b282c10af5d5d1c2348dc9505f774193dc8f7a7d803d8", - "5d0680519dae8b0b5de09081f2c4c743394ae1e415a91141078bec68770883cb", - "9dcf123da1cc78f7c20562c986f4f839b0c4f1f46fc4855aec552daffa3f2110", - "ff5c92cd055d0b78a3149bbeb3775a3a9bc1388d15aa49d9d6b09f8cf3152a2c", - "4210b2c825df4c45a24648c537c5d2c4cbfc592e5aa18ac623b713902e128840", - "a32babaf8a4a6fd98b80b46b6796bce1e74ed37b250e9513c291295983259ecb", - "eeeb0edee105b3961d276392bbf473486a9f0750fab1ff01bd43a7a72d00f8dc", - "63f99f8f777f3272dcef493e986190494684cd9f9fcf15ba39436cdabf63ff8f", - "71f0d37603a7277de50a2849e162514d7279766dd975bb8998e7ade195167acb", - "53db1515d31ed5ad0522a35c3633a3612e1c8796af95eb959006687629a2af1e", - "a4ea053c31f3fb2487e4961ac1a7157ef205173a36e78d1f5dec1b800dfc95fb", - "03755af6767d422bdcab4d013f22a1294c5bfafd57d4f4ff8c61f3fe0ea03156", - "6bf69fb1879806144e7de5bb0e6c9820f1e18c73c7c2126a31929471936a8457", - "a689a23c7d901985eb536bda992f3cb82c8336d2d599e8829c05befd6de02405", - "cb6191c29ea52a9f4ff1602e0d0b928d0e7f444e5f697f3affa4a92649ae3c8a", - "19da17b5505e9bf3bca37717c1c2abd82012a8fd2ae3ae8e9e35a8087fd49ee0", - "1a3d3f8beac46dfdaafaa637000d3ce427413a1b3191c992f28cb38449c5f0c1", - "ebd16b17fff66573c5052017e4c27736c5a606a098e0d43d6f03104014fa35c4", - "30a1c8ac7e7c9d15f3c71b4a6e23aa19c4be3671a6a9484e0948cd91b7b3ca15", - "6ca285dfde6e3561623c68bb3372d2788b45b78ac806bdd3a69a6df8291ac688", - "483470988e123c962ca6879863be00f35e8b2a402ab2db06bdee7f70f7504f38", - "9a0b3546859f00a3bef03b077a14134bc9d65325a353add849f4549d4a50e513", - "e649b8ae8cbe542b9405419f08059533ee018bd12df80a609a60291771d77175", - "288053462fc373e3f1e2ebc2358820b0a243092978dd7a292383bd73a4a6f547", - "2861378e4edb22b82fe910abc6ef050a5a052cc6173f6903fe2a14bd45b1a294", - "0177d42ed14806ac378428b16461dd609d3c0b005644db720cffcd1980eb00ad", - "b984f4e879fa6953971866ec5178eaa72f99496b1b71c704b92718993344eaa7", - "c5272122a4445d8d49010b522d2cc4136d345a44329b627bb7fa2496779cea9a", - "9adcff4e747037ac9b5019ee80fd37074accfff7d9fa652d553e4f6c39205cbf", - "ec2c85ebbff7dd4975b26ffbda3ec19ed284ba977856f19b42e733ff99604ed5", - "2eb8481b3fcbc6e4ddf82843a803604d99c8fa233b63525ecd77c33ea96901fb", - "4f283f8de39d4db8dd8d4cc9a77c5e68206412ac2489667bb2b4ce82dc103fdf", - "065c9e623c730460dab6ed9bf738856f49bc44493ef0e8093afaed74cecea7fd", - "4f0d3e4f7e5239fa9fafa184cd5bfced406869e534fffdc8ea2287922077bb37", - "364c32073f51e85be08120e98340d36f7e49886af4ca405d45c0826dc649be9f", - "694085bf65d97cf91c0fbb4ac64c9c00dc542a8ff08fabf2e3e78fedab667821", - "60de2c1f4c94b5615935f876caf1275991a4633bb92a77ab52b2866617fca4db", - "0e3de664d36d36ab0275cddefb1d1d43c8bb4d362267e6e91e4b10395e660068", - "7ea4e1539c112ea67fe38081afb5e2e7fe34d1b479beade4201bce56294d82ea", - "c632db0b47a34a5bc40863652a1a467b178c42646b41031f3aec417d0748b473", - "4edb0bc1a8d21b86170aaab0e78bc227d55d3a105d7a7d9d3f672484aa8cdf2a", - "484de982c0efe6687940122b3744f4b54596ae97d568a695654bdec5d813e3e8", - "938b3e619c0a4f451a41feb0fd638acb3224338c40ad394e187539bd174e5891", - "7a55241ea1758f59804a785c8f46ae9c3ffcccd47d5e3e2296ff7141dec46842", - "bf34ea83f1e64340a56b6616f7ff9151cac0a9dfdd4557844b1f46d3b9ed2b7e", - "fcd9ade0c06510b87d01b5363fe8edc3c21ea67381ad8a118d58590eb8e9b4e4", - "9eba740993a6e097e7058dd80ae5f910f939d392f764623f406a8af9946d1cf3", - "66905a989e0b3e82fab8fd80ceee08b9e143c2a7219461cc483c21c850b1ddd8", - "5cb91358243f12a9ca64dfa78bcfd78b41e6d8bd7733ddf7eb224f25074cb084", - "1c858a43ae55de06df27acffe83249c8e0c799141ee3dc635ed7cf0647805dc8", - "3388c7db6a9708f07d5a33517da43ce47f2251b8303d10de2ac4558bd06cd60c", - "f91c920219b04d11cf4ffdf62a308997e40d41b6589c23930ca9ce52bb9a8d82", - "d19c1f4fb37bb3133dcaf3ea3e92ebdcf5ccc023c4ae1a552e23115f59b9b578", - "f7455e3f3f4fb81b8ebfce2a0c88f711c3c1898e51dc22977d08083b4812cce3", - "c0effe3d0589f90a77d4857ac633bb96b1ddf08ca9a13a0f559ea51e8b2c1f6a", - "ffa3077112375ae58ae30aa0e4c6337ed924d452a6348d5f1131d14b3acd9e87", - "7715e76d667d68b138e7b44fce781214d08525e3b1211056666c3e5f48fa2dcf", - "30469d3664a8b04f35097e85e0f8ff262149bc6aa911774b7c9ab6ff5c0d65e7", - "a6ed5261f40b77cabfe4223d9bcdc8fdf19e60744fea4d34cf7c0a6e02bd7acb", - "c7fdabc37e5713efb0f87e617d88b6e4410481f304a6a7f8a75626a5f1d57b1c", - "65c6636d00b8f1b2874e296a9674a2760b01c82c0eab103e8bcb2dccc4a3b490", - "e78b959ac8be1ec83bb1e700dca22dd66deb2b4d2386c062e9c29459cd2d262b", - "37bf51e29ec6681c865893a160aed6cb35241d9b9d056f40d455f225a4423c3e", - "4d9a6d3a69427976d35264167e15190b1b27ef05e52f8898927c7721946b23fa", - "c21472759e4b6d229e002ab66a68db625c9f259c62820e0d7bd925bf2a07b972", - "2ecb07e9c0722b8bb4bee84f96367195e22ce0f406b0b6ceb53afe7deb03e353", - "433ecc13acffa9e34600f0a6348acf25889a8f9e4f21fda9f7e2e7ef5af43df3", - "6bca1b0fa4abf057706debded07ee5127d6ef93d48a2c4d6a3c1e577ca1cb671", - "9b5f420a90e1d2e8ef06e0ed0e8c5df8d3602c6f3c5fda3d680bb7589521a823", - "746361cab1ece5d87fe95fc23f800725431e8a09bd7bef4629ef1ef4bdbd9179", - "9b7976f5dd17dbabf62c75d7f95b060f35fdb98f914df82bf5dc50be02934ad8", - "8cf7b69fe8a37692b93807aac49c17297bd8180c9fe3cd4c854525b0af72cb48", - "9436f919e61626b6f92b9611a841eb13ecf30fae588d8a660dd1d1bb07256ef4", - "b498b738ed83b0df403edd2e427c967fa1c145981de1f3ff4e2b02334dea5350", - "1a13b89f60f9a605d44773d9dafbe2b9bdaa8aff6763fbf66c6f4802c53ebf68", - "28be3e18c1ffe348488cc7000484090ae7232d1b91b38fb9f368969c5d9114bb", - "4efead24bc4a14e42495623ed6d80dd2265237b181d72453f1bef81855f14410", - "32956233d7fbdef8d6579e267f6af58b84da615ba13971e3cec206c6fa8f957c", - "2f0ced3a2ab5eebd38c93c5bafd612d3c5180bacaa59336ae1e6ddc27c46c201", - "c9fe80a09fa30b8393085237f210c69547eec6237cebe95408127850ed83035f", - "7c4745a3f4cc2ee41497686b3fc18d810bfcbff89c6f338f303a492579f06170", - "c1641b38e8dd453be02194ea8f9b42fcccad48143b29c31d8c1e03a0bbc77639", - "1ece33bccb368553e94def559af9872007456e1fa396b4f8aa51fac2483a3631", - "aa1dd1e5c6f8f72d2a45d0492dccb4ad64e2561f56abc130cfeae5b4cbf0b2f8", - "27ea0380e4076f5885f223ff174f3d684584f37e5eef3a310c6982210d272556", - "190448b86c008cabb081777b44ff2d5e1b5db6eade79a47902d2bfb7d651094c", - "01946f08331c2c74d28fbcde64f6e4fb95508ae191d7dc1c7740b0281e25ce82", - "03b7ff2166deddd1e7aedfd53b1ba2cd9e2339734d137e7709d6c04fdabba7b5", - "4e09722173b70c7a81b61ebd88cba3aad1c8185beb5166dd11df07598fbd105d", - "d9bbb91855b93086a92dec97f983ee848a9880cda89e9a104ec31b86f4388b01", - "086c3d524ff920d8573c5505daad86752417b4494d937c58802a83de2d5532cf", - "120397279363574e3bd2316620c0b6364ad003179d5e80767f6c7865bb0e6092", - "62b7013414c21fde01dd31a93532c0ac5a52ab0bc837921f2bd21b92f624c789", - "01753f56628fd7f73fae4a9e3c909f1e87fec7caf82910de9d268e86c1e880fd", - "0eaa93f3e56ec1c14a5e3518fe2fd4c43aecf4075a9f06013f06a45e74fdcc36", - "37ab760b586b732f80221f4e8045af41e5a39a9e06a761dd04516273e23cb0e9", - "8f232024c3dd0ff27d7741eda6a290b27d939c2d3c3e5803ebc6119779fe04f9", - "5ddfc7ed59de073fa65a1e305e2cf9ffb424c4d34d391cd0cc9ef26984c59b6c", - "7af13966376599ab9a846e497774e9b096e265ee66d40eeae95fa29110a236ce", - "415548da2cf06644aa283bbe3869a98c6ce461129eed7eddd94438c5ce40bdd8", - "01debe62626e24493f796c4416eead0f0c2c11db27bb29faab653077e268e50e", - "16cc0da8a2613de907ddf61f70e15ef56e9e1ff7b567761a063433ea57520607", - "3acdde3140ebc0d89de32ecc663b4f7b989ab1ac09af5ef565dae622fe437f39", - "329f683834f8c986b6830c0e40c06a852e51bfb984fc99e0474d26f232d77f7b", - "57359cce9dbd1829a939bc00076791363b6347040b99e155b6e45ef844fd15a0", - "cda0de2d620c9b7c1c58b240289eb3c3634398af3465c093bceb6f31295a192a", - "8b965d65fa52a56d39839a85ef1985aff13095ae1e3faf4cb77d03375791f235", - "84c4a799c340c49642074994bb139f4b5448e83588f5e34961c0c5b673736294", - "5fe63f8e3b68cf936cbddfa19dbf87a329673986e079e0c9589297e17a584096", - "3f98fb14485dc20f232109c350135a9e02ee81127ea1d0e91de3ff321c4d47b9", - "d631cf9632c7c0a0a1bcebfe8adb9994d4e2e5da16dfafa16bc42773278d2cde", - "30d7e199f62112bd01a857674d533cfc5c194bb182654cfb29706070d4084d4f", - "5dc264c2a875f90dac6b1a24444fa08989a093272cdda46b235d7f75ba276e7b", - "9d0db8a463a0ee4fa44f083465f505b6368586acb7eac3de10c5352c6d6d099e", - "cab653f0918efc8e767bdd3a54f6f2bd66dd97ed5334a9fba0e1a2e94831f049", - "0d4a83e98022f426e4528288627be77c4d05d403e97e4cbc15a42c72eb7c2925", - "33d530cbdbfa46b1a3f407f322433345b8b6ebe1a333663739d3c626c874b3d8", - "a944c3692628393cf04cfbe7c46fb4706f6d3445c89111ec6250a25889a81f70", - "7186b13669e9903affa13a68e41df5a0e160c147f05b511045a344c03ce21d3f", - "fe7b7c7c627f3c5667dfe40901596067edf12880cd0537cd68f5342dd3441f47", - "77daac59edf42ea663995406cff3575ebaf165cf2d28784cb17dcf89f73a2d34", - "e15d461c16facf883f911e4e56794f09ad0b37dddd5a87d6f73a692ac867301a", - "f87772a540609ebc033ef6be80dd037593de1407db811eaee07e633751c7cfbe", - "ad8157179f2ede870b82782f3dd4444b97d1e4ad2d6985a6dd98e61257be365a", - "352e2ede1e290171d4c69de20e9a9be04c7458d4ad4b4faf9cff51ddc059e35c", - "679f22ca58f24b489e922bff1f643357fcf40c853d038b7d195b30a37207a48a", - "07d611673072d929735c932aab10978e7b00b59858259a9dd2310df2f2076f23", - "35660413a52f97c820edad241d61933b9b0ae30aa128fee0dfc19354f1f352e1", - "65576193ac31dc4ecd7dff5c1f6bb491efbc841ead45dc36bb1f76d399b80e24", - "068b3841388de77422052b082fcc49426173a4fc54114bc4431ecffdb04cd602", - "5b05d0751cc9aef190b3affe3cfa0f3855e6051c430ba7f80a795185cc3c66e6", - "f2b62311744c8ed48fc455424565c57a4091ef8a56433f3b3234e40d4fdbed50", - "837ca1ee909b3b483638fbb586c26b9fb4b4428f86e3c4b3c557007ff490b7a6", - "ff27d72e08b10d112aa85ce31b02ea76dc19c6abeb3d5848128bce4382ecfb23", - "fb2f3c7cbfc89cb532ce656af5c0aa197e2d89f71de8d36f5b1c0fdde54d54b0", - "68967d08df5d04a11443f4364074c396726b35311ec9da9edefa24989f4e92be", - "e7cc80e88dd0654f53192f2d1955e9a01b01ef832769bd0b424db8544458f626", - "d9e3305786d12450b4a005dde736aebb45812cf8ab643ee4e39bb6dd77717737", - "4322a8e23705154f2aa959cac5d3c3ec2f072e389334b27b303f153c4530997a", - "418eaa5ae5e7207844c578c5e9f8490f00062b02ced41dc6141079bf1a31bf32", - "290469f72cf70dc5948da71b2d45cbc5c8a840787f46cce6d0bc9e9c860713d6", - "ed9f9aca66ea8e7f60c1f8bcc86adb56be7e17e8ea0f3ed9e8b167ead24ad5db", - "0b155c15dcb55281a8daff4890d6cbeaafce1b688c1c33c350af56aa1fe184b6", - "a3867429e70f4f980d5f99bfb467625b619620a76ca9ef41430b9b9cf8042803", - "9eed8d374252ff24c3db1a3ad2ccd179bb8f420ebd9e2d3318ba51a9a3ec542d", - "867928189daf1a1913ce34227aa9c52120b0c21dce599a4db88449fd3dd4361a", - "820c7c7762514b6923f063397f3e202dff247590aa8e55c60287f44d078286d9", - "1dc89428fbf8b72271e615993c672d6d67513f3b954d97ca83729bbfa49a78a9", - "8c42309cc877b2ae90300ca7a5b08ba45cb3e67312c8d7db8f4e6e8ec280dc28", - "d8a31be1c9120d33677c0072bce9b3db949738b8fb05ae53f870b36cd12a36ca", - "8b5930336427cfd261c778fb68a83903bab97a4043f955d03502f7fbc326ab57", - "ea7d050c91c1168aa5bfb7d1cb8256199a96cad6f0a507dfdd4e8af108448374", - "de2cbc099819e23f5a3154835f6013a2a60ffa138bd835bf47bff4e4fab3dad4", - "daa4f2d42ec868e43bcb4f8a477c1fb004d74561c1221c0eb82a171d1731cd81", - "0d205546dbc3d23cb5bcc537f0222878ed9628648276c6da4e3c30906d21f2e8", - "ed5cce8748c96a3c03991f51329caa6368bf1bfdcf3f022435eac54c5a98d39e", - "df82dd917819d05e6c719af84912cb7a9c6f7bab89ceb297e7c81f636c71ecde", - "03ce0e6e2d7a47a782411ebe3739a786cd9d1370b7018d1b779d0a0c48ab47a6", - "08d588e87503f1027682ed37f57b38870b30da06e7e4ea81ba92e2222bce14f0", - "28f2e4898bded52e71bbdb31a0e96e472ed7fc96d19b6cd94b017dc90a4f89d6", - "804daf3d4bfa52cc3cc566480387d61daf1e28d36336e4a01fad0c71c2899994", - "b3a8b9b730e580ead532cb1309b5a6fb12933dcba73f2245522ac125b0b301d8", - "eb85519e99cc61b9f14ebdcd2110d1b1caae1c92359141272d74b08ef5c668cf", - "b6df02fef866bfbb231d632402efe02d73ac16220962a6069b9480c5e405aef4", - "7ecc0860b7b3d2cc77821acf980d3368f72d631f020955f177b29ee5480fd3b3", - "101340f1bdc918945a4e0d239475e43d90049a2bbfb951f129bf3cf7e866aaca", - "92e96f19a1c67902c4c6d15867dc08ba6fa3b6f80509ebdc021d997b63d4cecb", - "7c0dd077a8e04f93d25b7a8f07b2e50b6e230d95d3094ea1be76f469efaccade", - "67960b335cd7f5edecfa8e85940773761a92170b4991f8e747da6a8a1d6400e0", - "788771b095d928fb66a38ec08d51f8c4d8f270753cc1a70dc5725b2ea7ed10ff", - "77d96cd00a808cd3a01e7236a6d31592e658c308eaa8522f86454e9307bb03d9", - "98d83010405412e80c64b36ba0dbfcaef9c0f6fd553af4e50ce62e13f57bbc8e", - "9f24e15415cfc69aea094982b1be40b28630e5f6c9c64f9c739600ce4ff7d4a7", - "8f5d19a396c9879a1cf76fe40f6dc1629e1964bfd3a63944c1eca5096bd6f9c8", - "f8fd5eb6b6bb8860382725fcc3ac0915aec6c81d1a760e01fd917836b6def69b", - "ec1c5192cc216ade27ae4798228ee6c52ec5a1ea7a718ce8b32b77020f01251e", - "4ac28335c95cb92a9ef14c59f23ca86468ce8cdadfa3ede4d73ebdb6dfde0953", - "a1b9a85dae5a562cc9006ef2886af40bd70d4e5061bfeb80d377146ea32f9b1e", - "fa093fd56822d5c995699da076cd6401fc9e3d0d079e07d6185cddb87effdecf", - "76d913051434c3ef9f0cb9f2c44719a59e5306478a76ff15f4bf60c5417f8fc5", - "6dee70fe77fbe11f2e7e9a43fb7357c5396a0bc06ddbca8ff30259c20474ced4", - "8e59305814ef8c1a8772e3d7b34faad4d4053af13234d4b190b7145436fe9ed6", - "ab05b1a620f8c482a21e4a6e69fc8b995b075692705cfea2ec36be889fe8bb5c", - "bc7b6f3dad55c9983a6f0a0d67965e11ab61e23255cd1bf794b6fb761b7105c1", - "f7922e57e4a98a539c9cad8576f6b33002c8f15f751f0e0c815f94e22344247a", - "8f56c2fe647d34d70f816a40175ab2995c79db6db198b9a061b8a0722561d1c2", - "3827a3f38d4de02ed3c7c5c43af7551945e57cf1ea4fc9b52bce4b64f5e809a6", - "b388e628ecd192ee533bf5f33a5fd922af77c8e7eac13ceb8b4be5deeb6510ac", - "3e8c2102341f975f5e773e18e75a4d7ad7716ca294dca77ce898e6ec2af0a19c", - "f075eda56f9701d1b02aeb6806ffffc4a8d4d0fe1248880ade3d87e1a2e78288", - "4104431324e4c7122525a03d5ac007767ef86de847be503fb0e6b9c0bb8335c2", - "ba57a123722e9c87f749a4c810401972ef382ceb1508004f8344d79480eb59a7", - "6e9124a905445ff63716ce7308febedd2240c351a13b24b31595d412d4beb668", - "2fe6db4656fb5b295cee1b4fae8860b01043f9da1cbab0eab9d0a3cc37256ae3", - "ebb03372431fd3431dbd898933ac332c56367bfe657bf8520077fb42cb7d1547", - "175d6ca0830545c9e90dee165284d80f563f65522cddbdac8af9cab04a71d167", - "cc3a56a1d316546ebd7fb3bd3f5294e5e488c8be1f2bc7f453dcd6f7ccb67159", - "68f8fd942b8f9222dcc9f1334aa121a929ced14a68be833eab167fd55a35974d", - "804e986bfa58a19b56712fafb7667e8299b8230a5e2d244f1b43608ee4881ba5", - "596fce5b675776a4591c2966ff86999ec1ad3092897f38b4e34a07d6185a1d75", - "ea25b2a80509cf0b045f07a50cf77869cf63da05e4430a732e2e6f698c0f5746", - "290994434cf5bc12251d5af395d474a96f64de54327a1f31e9563641f95b2e82", - "4a2539673baf650691f514c9b2e90da00c93ec1bfb40281ba2dbc77e6c608af8", - "68f5921b3f2dbb0ba1aa595b696783437c2023b7dbbe44fd6bc0fbf755fed0d2", - "a0f641108cade944c451d1edac76ce5c098243218b497b28e24ed7fdeca54790", - "38569275b4bbe53093ae5811e7fb2027a5afe83d598e7b52e6bed4203621aff7", - "cc5b6c1f8d1387d8285a179b4d64937e83475c86aa1ab5df538b2a3a89405d9a", - "1b8adec8d3f85368710393ef5d6ae499fea9965009a62891ad6b26823dd760c5", - "da3d3742dfe156c84ba1431f8ddabf10502014a0afc8acfdb4308df5bcb2df7f", - "452febdbdb8e08839c2f992b423aadfd96767bd22d8a40f756e540b76dd4b004", - "90a876e2f92e0161e8231b306893bd1d1dc67ee05c67085b099d5609f3e989c0", - "92e51dbca875ed6e7334dbdf213263772a11b6cf126857de386ee6db9dabe51e", - "7601a1162270f21099549e0a72de33a7b9b51dac50d588850b9cb82024931f35", - "fe8c9fad3f3bd5c64a3d640b194bac0521167f0f0386aee249bb21d0e6a085c8", - "7e0ef47e5751d818e60bfee9d5734621df8d56b2482b44c7736dd9b30bd9071d", - "6048b018702a1d19ed22df4d823bf2b1e73eee709626878f2dd634e00c565b94", - "898c76ea09f3c32f5e2b2390983e58ba5e23421a865407b62fe0d5783343834b", - "8b2cc2a3d870a224d82823d55390a2f7e38b77ffedb9837282be97a348a170c2", - "518a5812eb9d99b8293677760238a3d1e5994f2f65a6030e346daee4e1bf7a2e", - "b6967a4f7e0b27c9b978f87937590af9aa6ec45c141a0e2d6b3886fc52e8edd4", - "7e076aaed457cff57086cbc234af0aedf7f26c6fe470cab011dd2bf7b16e49e9", - "d2187dd51533fc4263830e90d731be3637649b4d66ea110a43e3ec73d1ec3ae0", - "288bb0a5aaa3447de717137981c431c8e4f588007d79fef18ab157bfde367fb6", - "f71343e5880bbbdb2aca511d0f7af25557fb667d29bd5e25130f6c9172b13f5e", - "fff3ae64292c71471e4c2a52d44bf6913ad31dbff222c4304c14c5872639cd54", - "a7219f359c9b3f2d47a1f9c4b067d3fc80001131c63998a8ed3a9d38033ce226", - "dc811ddff5482e92ede974e6b110604e3c259203765af4be1c7245dcd9b551ae", - "b9479e092237b34f08d9cfb92fa1130eed7ff4ebbde815002feb7d68978dcca9", - "39378b4430b4e961b0f4c0d9241ace8d76f7d0eed24416245217ee1be961d4eb", - "5b874899c8ea96ea8603e4fa2ddea6a3282498e737a2e4a7ac4ef99d34b0a47a", - "34bb9cebc1a981239c9dc2d3854499c9a0d46530bb5e96fad7131b4b0b5acddb", - "28647112a41f389313a88a95186d7c53266a5db8d2a354a72f7462a050fa7166", - "203d21e65b7aa74d1c6a93b4989b4e21fd5a71d8c4485e06ade81592abd84d49", - "de3e3c7f60b19e783170d91b35efc2e5d6bc13b374e4400f3dcdd200ee4209d6", - "03c945e562b47a7b66143c3a137c975453a81944c1865229f5da0556bcd83038", - "478d25a833c80638f0523f58b309fae8df3ace2d776b216d35f0eb282534f4af", - "eb997652e9b34d9611d9d9778099d291b0785b4de9384f8bfc247da1c050687e", - "9ce3fa55c424b1f2a58cab1127544d6b39040c685fef21d0dced5c0fc7d1ecf9", - "03a9fa9e350540467767d4ea596c91d757d3df07b5ab340d88ce90607bffe569", - "2b94d7a7fb5ab3fcafe97bbc5def4a9cfb6859421dc907689e8dd71166dc2c37", - "4e06106f84a2861be0580432efae2018d8b43e7d00aa105420a57cffc72700a6", - "39348a56549434f1085f719907810a88ed55b8785eac86468cf02dba44c7842f", - "8c81ebc8cf66e1ea0ce9e5c7b83ad8404463889f5eb4fc4b216eba7aa9853dba", - "cf141a31faa0c922b49515f6c2e4139a40d750d9562049a784871b37f1576a03", - "414b5ee3d3ac4682d682935fd2a6df7b0bd525057b1d1c0e19a0ed2c6972ff70", - "47b834abec00a517654d65c28532383c2ceb2d8f475a05995462f15a57b4173c", - "298c548b1da264db8aa5a2a296b568b4ae357a071f2816cd4650940100b6d9c7", - "1aba3fdf6a8a6ebe2d51029d66036b10054965d74b7acb0f5b63c43e780cec73", - "804d84a561ee17be60a6f461a6fe52c82de18aeef00fd3bf57c0460d70a02ec4", - "73c10a4a69cbe22e4146e78fdcea8b1570923bbde2cd3d0a3e7a0a87a6440352", - "d6ce81f70e7ee1dacf50e46fdeba20d07a5f97bd4f9b0b8a4c574a4b3043352d", - "4c1022de5280a9d3df01602868cb9dd52ced403dba71473bf23e0a0fe05de35d", - "ab03e1479e91af7d3b14ab0df84e26948849107b7d72a1f16a18deeb94a62c54", - "6ccee9fb936edd46c5686cfaf050057f3fdfcd356f59dd263b1e02c2b39215c9", - "dedc114baada0cffb6220f53b67140b7b698cd895eded192821500d77dc48f57", - "3f9a989ddb32b10ea464f43ed2b23d32114e1d2e647936db81a28997559e6e7a", - "e2bfea3d0072f9cc66c65f2b1cb38a9ffe6d7347c3cea734e9c159dc950fd3c8", - "47417fc8f7638539b698142b07b25db344565d2bee0029fa8971c16281880dbb", - "9c6c100f49483ea93a0df683c2f11959f6f0a87de607d9ae9f11837ee10d6a35", - "d0ce335fd6c938409807842e7cd4b04d08c5f7d925554b7ac7e8188f52ac240c", - "2125c36163af3976dc1e96ec8c6952e0514e9fb5e7dbc2efa86b7fdd07a7df7a", - "dd93f707ebf4a8b8e1d67bf0853a81c64e93e3b9e009a988c4bcf187763919c7", - "50b4370c8228c08ad06b2722da677aefa5b44d69468d92491f6a6ca1ddbd98ee", - "ef581defa091edd7422f77f28569531fb523a67d6cc70010c46b2887fe1407cd", - "c28cde8cddc5f3d1b1b531527647b2a1438e65759c569f271ca03cc56ca7ec98", - "f679e3b5802371fa425d252581cdd6965eed0bfb766d7268d407d08c8371598d", - "4d7a64290c38cf9011d3bfa8d5490ea4cc6f8ad102483e59c1c08229bd764e2c", - "6b3dd94187e4184c224419f43a99b5e8484d541b2914ec8502c0b7f9e1382caf", - "9c2897d984ee686c533c5362fe404aa5063ff72f8742557b3f6a18d68d50b63b", - "ad910c9419c2e5450648222d57890c483942afed72cd34c68c7ee513f63d13eb", - "0c4ff89e88765f6ec3abb2782f4c6d979f23257038309cd3decb5226aaf25414", - "e73ffc3aa5e3e974bc55513a2b9d25c7d236789991bfc7cdc3c245eb2f26df6c", - "83d096a0fced478283c814a286b526a9a1fc1b8a96c6d3bc725d36be7c9c0e80", - "8f7d69353414f848c1b4a808b52f39a06837f32672dae74095c7021e4cf4a35d", - "eb743fa95ea0d78df0d8c676ca2e9a1cd38e38ed715258099ec0505c1541ffdd", - "6c2e24696333b3ea1f0d79de3490a8ba657b5487806bdb44176ac995a716cc9a", - "6083e2dcf7dbd3fd2d992dcc5eaa818cf48d8515abb545e3b832bd798dfc054d", - "4abc87d7ec71c6e2907d23d1fb11cc5984c40e7f9e26893023e307fa592f513a", - "f4443a97e84ca8c370e4afa21148430efc019c310e32c605bf265743e7cb900c", - "ab6b5fc4c9c840caed1e2d028dcaeb6e20e8a2c26fd55046da493c4a807b4c41", - "6af91733ed29cbaa4753e9b604a03647497d27a7217dc91f55de2e9a4b395389", - "5153b9e0f259119831f6409359570612d987d022121447edaf03163896544036", - "adb0d8448bdd61a44ad0a08c6f51738f537ab3965b3e4a60471c9f5e5ab24cf0", - "3ac74b4464f7ff7c100eedea7d604ef4b927bf65269d431809c7643cd70190d3", - "b73a019d77fe3a579e40fd97acd9364f95cefabad29354bdd42dd17750627074", - "9d019ee6c112d9b9b4c845bc36a009bda319a3ace1762dd288a45167e977ffb1", - "ac95952b2929e4e67c43d8e65c05681fe8cc536b3170aeba49fc401050e2c9f3", - "a79562072b2740a7633a63b33692b397e50f4cbf48696c5e877a8e409b07724f", - "d8f2b4e56e43e9ab34bf407e87a44888c10ba647309bea4d26a2aeb4fb53b135", - "cdf84968a30120225524960a3c9926e6c0773c615d6a106b760f8d909a86ed75", - "54c47e4e835e357f1813c7692097529e3dcd159fa8d9970f2a91ee75855cbb23", - "0577e64baf4b905214fc8334e9422c53dbbdf49c6b82163d7b51c140c0808cc1", - "e653a49ca1051fab3e1ee6836fbcb3348fd25e513246b8c479dfe88f6d9ccb23", - "fae4987ad9d5a228688bab7ec6622c4d6def90c127bd5aa1c55a94b525af3597", - "5c541b8eea6520feae71ca5e40caaef093e9b337a9b7b9f233b8a8033ce5a39e", - "4cdfe256288ab00ddb7a3b3cc99438559495955e1cc6eb44f0f30b235084a742", - "865f38989081fa7cddf852cf06bab98983cf1322f0a2ac0d74ee983842db081a", - "7e7ec03d08480a6af1457e4b11adb1f91d62f120d379ebabf5fc4110fd92a53c", - "22a7a661a5bd0c2bbed86767a3ce4e721629612d3efb967bde2a3dc29af85941", - "34d943f1c36517442fed5483f9c4b83c06df38698c8fa3334fb865db33fec806", - "b9910c044e78bf44cebdb4cfb864cf4ac3662c9f949b56ead485240e158d5b27", - "49121116508b435d2d11e6ff2f371b7b6b48591583692c6f0f727093b69d9f3a", - "3fd213be3257fb7886d556738fbae44d92b75b944c8337b25d7bfcd06a4dda5b", - "2c549f8256d22279e53d3e3bd54c9422bb7ff4efa6fb39652eaa6d6ae72a65ff", - "62772e4c74ef284e525eb0279125a8fc94b75f7c0cab571b051d96a80faf3db4", - "4d9f3ec4f2636be8456ea4798ca83086ecafa2a40e71d49f9a5305b9f7bcc236", - "87701078dd0109498ecf16e75116fa15e2669c9ff44a44a9b443f5e175edb8a8", - "8f4009f1cf43e63936809f13ebd1057a08fdd3b7dcfdfb4a19b573a1574b8f0d", - "db089e2091cfa1eb5c05fae038cab3f2a60ba1e3bc8d9b2560872ce2407760a1", - "f7f1a1a93771dbd3924b9faa6176afa17e96f4b7bfa16c8fb6c389f0ea558005", - "18a71c6ced9e8a8709bad52f633f4499da7ff1b391c919d48162a73ad0381209", - "234bcc21d097a09898448d029424933e47c91d185342aebe2d0c6c0c30db023a", - "3fdb583af7fefa51203d7dda01057ea6834e4155a2f174e35d8692e2f998b4d9", - "cc2c1a61a73ad45f9d9c4872bd534c1fedbc278d5414034f8f12356f5872822f", - "660115d84294f7bfa87bba29ee26a01b9666bdda8ed0f9cdf188f39c2ef8b13a", - "120ef1916dc7ad2d7ec457c191e89ad83ee194cf17995eb28dc00888c86e7022", - "7ff786c1672f32fced067f36d6626391b3dc274b42ac27e4c15fbd3e529a1f3f", - "6331e6f79479ebb6a6e7e43faeb1e2e5a23a648b7f461ec94956d4950feee082", - "f521e263a687c0b8b69f324b2961ba2ad248f04531313dfe0966aa7f08b7fd9c", - "f30ef25d4747293cc99d79d860446fe44dbae06e54245f7cfcdc272be413e72d", - "4d11991ff27ceb0fd3aff836453137a7fb2bffca67d32efae5f78a86105c82f3", - "30bb3aa4a1fa71b34a67102ff2a27feccb2ca7c6a17014a49764efbd60fefb78", - "ca8cfdd49c244d35c7e9e99172bdeff31448d56391d28aa693967b722f9a8acc", - "75501e388553b8aa4f843987cd765a267c3faf6bf6dbb41e26886cc92f5cde76", - "b722c7e23bcfb1c11ad7b44d617d27596f4ccf8e7d52690fe24c19fb591cf507", - "ddbfe6db3b119d5a170f24a727d99cc5a0b24e76444d496799801999fc9849e0", - "493632951ad958bf63656fca675f215449f851e1db81809f55084bbb6c01bc0f", - "3c2cc25016c19958a2dbd7b029cfb4078613bd62ea2a2293c3775c7dd5515ae4", - "b5fcc5c7006a29a3579bf78c4096fcabb97266778c9d76da66cb4f1a8496ed8b", - "db90e8f2305e7a5d60df286e757f5e961964ee64c4203ecb31e9eefab8ded10f", - "3279bb646f727d09bed158c97ba5e98eda93ac7daebc6fa54e0e08002dfdbf1c", - "14b78bdc870717a0c5f43bfe5c41cca9ae7d73e90c1e44474f3c5006333a2488", - "c335bcd6edcac0bc3dea7c3e27914672e4dc4cdf51fad28482899ef5eb685790", - "bf75838ad673978cfe89d4aa8743a2b9617afa04a3211632bd2cb60845f14dc7", - "1bb9333011039b5e1155dc492e169ff64298a6e5df4bd15bb6ed7e43d5bc5b5f", - "55569fde48bc498dceb1f725473dcff385331d5d8ba3a0a1a7c70d841ed37d37", - "abf84147f74cc0cacb7e98a70a38aabc0dd61b087946b41cddc721d50c3b5a7d", - "0ec363e77af2fcbfe89562b808962778d06cb29f617ce94dbc067981eb6b70b9", - "693d83cb2299b8bb1dd435ba2dbf3aea98baf0e95f5ba8139403ddd42d596c98", - "94c566fbd233f819731dd9b15146fbe1558d7d2cf5761f58d3d0ffc0c14c1824", - "bbfc4a50cc2775fd80822e62f1e18afdcfa35c4633b84f7bb6770764f94bd34e", - "e16592a2ffaba8fed4ac585a9634c05c5cc044fdf58ec3d30112efc112d3a8cd", - "73168c9df8429ac1df47f3734144e010278946b89df4254d032a3b6afdcd5136", - "cebc9c08e97e7ecf99d624ab4139bb60284f0cc1eab1035356eb5257d3d780a1", - "049bdd9e29133ca94953fab3ea7f1ac36553b9ce030700094cf3dbecd847f87e", - "340bc9d4da079847169169846ae2b3502dd3dd4b28c45caa73c988eba424f4cd", - "da17a31b710dd4bed22a695eecffc9c432448856986ba2185d1a802418456e01", - "483ab94f31b7f231f6f5d6a3cac1ab399f712c035fe86f97b832187c884ed757", - "0d4fedc67745f6fc1d215bfdd8c1c472e42d31e08ecb484b5febccb8703de928", - "f0ada0ae981b6aa7608a84bef8a6f69396397bf0cf5dd95ae3359345fb90df38", - "07a88f0e7bd90b107c3a79aff43dc89858b91a7c7a8cf03a91676da28c8c582f", - "14540174cdf47b88e256fdc507c171082289f53b28d243c2b1240eb17cfeadee", - "2c17843ba618c23cd25e5a57edec90568cfe5df1586b9f95117523cc5edb6092", - "2829d2153d47e478d7f09662e6984718adbf15acf52f342ad5a4423f7fbcaa49", - "3abb08573e0963576fac4df512a4588e8ef9b29d72beae764eb19120ff02bdae", - "1210fcced9e7c62ca9a315d1ff0ad5b41d04fa872be1c198a465c0b14d668406", - "62103688375183974f1931395fff1c613d2741cf2bd11ae34aef604e514043d9", - "7e55156caf131cec64b072bd9e166710d046a760acccfb85855114de47ace60c", - "61c5c90fcc3c539a6c47df1a7643efd44aa85b99730ba54719ba33fd0e0a1f85", - "a6ffc7e4c778c6d5e154ddc2ac4364b6a48405ea3d9facddcf05e76406000aaf", - "962b34a7f883ed6d54d58cc5a3f50841ca9b5bacff1c54dd23ee56529cfe87e4", - "cbe544479bc8cc0a065139cf74d17a643de1d35ed24e7c929fc124e43101fc99", - "941267ae1f7b437355c5ae1480e97de7f969e963212f670eff704f0784cc5645", - "c58698f102c844f0070e97af2d86921d1e3c4717291880d2a64a91124bb18b7d", - "7510a0af82e3313d44d38a502823fa90c350a03d57e92ecd67e4208504a2215d", - "64079b80b89fc2f3ba07cda1b355eb83123c5f71340a955261fcfcdc4fa7d349", - "84181e5f9eb74ce7751318b3a2c2a64262587a84281921e8af638edf6b7c1c37", - "bdd3ed495a2fbd3c97643851d55204c3c8ec97b436e0b32a1e0fa92ede542f73", - "30195584b7fe65ce2e400675a131803ec1194e032495bccb5c3e263fd59912c6", - "7f1b93ae05f8d9dd5d295b5e85e25da52a6c3dc95fe108a6c55f58b3bac5c599", - "2e99b09ec1c5b75cca69bc842ab95018500df6b11484d57fc594285c3d6a1441", - "e6a238b4e72b8f2a37fdf7b8c11f0eac2c98c3813e273ae1dc4d5de45f96e910", - "8d26f52d8a79019864fa6c49c8c57d42bd0dee69ff16aade07dc8e6cddd71b42", - "6ae42ffc497391a15bbf460128d49a7383deb36f2081d14472100921fddf8f11", - "1d48eb3bc556fc8f89ae57a337010abef4be3a7b2ab3b9a83822ad2448a71fbf", - "f2fcd9b0c4367a557004aaace2ba004ad80538f01b6ecd186db5b301b2a9e41f", - "1d61543456bb7c6cee7ea2bd35db15fe948b0bde56c1d3556433bcbd203752ff", - "048cfcfb5c8209a7fd4250b5bb2128941b9e1341fe4b94bfb91c6875d36a68cb", - "8dab6962d1e4bd01ac10af0a5ff023962ac3f42d5a1c874c86d419a7359f0867", - "f47c5aa4d3626801b3dc1e68551da00c31faf2703afe7b2b8c7a6531294d034a", - "3d6c07019098d853d3d969d5d05adfff9e1a7a53035ac9dab0139197621a8c7d", - "d2325c750b60686caa4a404fe9ad66ca7f65d92eacd80cd3a741485e12e5cfdb", - "2d2c6032ef299d2c091ac2369b724bb8cb19b4894df9a463b9645c1f221a5337", - "3815e5b0ea30e6cd942e137e7818905a232f0cf1aacbe9c8c340b8efa21bcb85", - "f5944d00a38efa978e25124a187251416b9d031c27b676aee9c608d6e15745c4", - "b5689d69c3e821aeef808d1d25879fceeeea79a180d51fca80bd83dc695da8e8", - "27f1d20f56d8e1de79399a0ffffdec850635d9ffe07ee0fdb0fb0a384e5e915a", - "ec53818fa6bb635f5e7b941715da9785e8e2199b334f3931f6f35129ea00e3ca", - "685782a99ab84c8fd1281aab007818333de6bc63459f9435d8806efa084c16e1", - "fb4c9480e5c97c890462c6d64ad5e4f48ce80b8fa35ea8a0658539e131550d1f", - "c3ffd8dc04e05c85b3cd4f6ae4479450336189707e09df2953271f42c854d526", - "0cb5c0cc09e13041d10f4f9caf1c282b2c38b7f23e5542416c407bf93376d1c4", - "975d27759ed6935e19f878d688e06d83dce774d8751cb49d04ed28cf256614cb", - "8a04438e7e4c23db8aeaca26d04b089ddb9b076d31b37073770f0d6b31149ab5", - "bb49860e7abf505df4d11a43ad6735bcc073ffd124dcd72be8435d5cea5b80d3", - "651a2bc263b2c7e2ed162e4b2d90d6b19d364cbf20d4a88ed75328279bea741e", - "78158c3c6c215c65234d2503d1121e5d2602087c834ff047a91a014adbc0823e", - "cc762433a92ca8f9d170522c830ddf49c703f3c2540bac072c8e073315d051c2", - "9cfd1d316195b53941ca3ae769abdcd0335a83b4d54b14e2d88ce37d6895561f", - "c55d367ce2a3c93c1bdb31da8a8034e3f0767ae838300b12c58042ad2f37e4fc", - "3ad330817aa69488c3e4f76a749bb8a2812fd87b0282f65ee4ccbb2a805a9ee4", - "f468940ddcdb39cb3d16e5aff5f2c45ccce59024c6bb5a1069b11fdb3086f9fa", - "463c2439889273bd3a706f98abbcbdb07743c340a02701b6e758093db5147384", - "ca3c1e5afe88b7453e5919aff63b87f664bcfb5c2d31095fa55c4ad6bb4b8c3c", - "93b1e9e501e10de5d1ba4ccb84481914f7e148d15ffdeda88d33e0500ea49aa3", - "db131200a53646c467740c44c7fab41d6dfa1aa7aa85af97b691b4f30ff1b32b", - "004f9a7cfac4dc3fb04c700d1e27d0298ede4d82f8b25642375d998002a5cfd7", - "05c483222fe0791e15cd1b6008362899b36a9d94dff6f29804e667054922be05", - "7a28d88fbc88bfdc8ce806401e91559bd66457f24cb772425dcb4aea1d844265", - "724c87c0dcbfaf818aa7660bd7baf79f134ce914d3854ba9bf292b42a47ce0d9", - "ffaefee4c76136e9250400868c5d5b8580378acc080fb01dbd657ef578dbbbfc", - "daeb27aaa78759dc5a1b8f3abdd72463980a3fe864c97db62fe1c13a0b01a603", - "c35d3f3b7ef5dec81b149efcf97f05812dbe9f520208002beabb644a65aa44ed", - "f6eecbb024039a7c546fc56eee21d1ba11034ebb540743bb71b0520833969fe0", - "bc5db6616d5bb55ba2fcc3cd443f70c16a4e03cdbb9b2e2e68d813d3bef51daf", - "885bd42a58d7d76248b11f15ce0d06a7987b9b7e819a66202b78f9524b145b99", - "b3fb433ae121b45d519750823db9bc8cd9c7b8580591d27882106b37726a28cc", - "1da4e8dd3d74e41d8534dd89511c623af0612ead2f2ddd2c66b6ea8322569df4", - "973681b796fcc87a74bff394ddf422f082a7ed846a2b720bad1ec6fb32a57f94", - "9761b791387e0193978c1d5a71547d439ca1c68b45374108da1ebe62f7f247eb", - "72afe00c1f60320b98cb3777e7b459b8956bbfaf837613b37eaad81ffe82e437", - "f398203c2e5b15dfe9fd43dd5e0ba178744f1bd2e062370fca8d33be4b5d0a8c", - "d6c1c3dda29e373a763e34ede7329cba006dc60a3c552e21ba904f3948bf47db", - "1ca801f867ada2d8a2a310e0801f92d1443ce992b1c3c7b8e4be369b5cce8e7b", - "330f55c246ba0d35e3df068f87f73a7f8e35bd4897cdcc856e2903234a3dbb5b", - "8d9454603193da90be08f82094c6816d3a48a4f5c35934ac9c818e1883d6195e", - "cd900b44118f2875a1d99ef5308eb6a16fb045a66041ac255af01e7085c74c33", - "09c0db6463b1b6d4ad5949aa77b20e13bd4142dbd4de38be594b1ba5fdfe96d2", - "c5f034d1c1b16f63340befa565403cd6391e95ffbc9fc7a9c90b07b72ce74e07", - "9d201e14ba3c075907ac6df3de2731f6c970a045feeac6404adb3744c64023f5", - "6dde2cdf7dd895f27d5a6bf6a6d2cddd3421dd149d452562d22d439b4520aea0", - "0240419b4f5dc3cc21b5433086c919574e6eec7c424ac8cb8754fb8b779a54dd", - "1a9ad7c8d45dceecd00811dfdb5605f16fd63bd4a79e962fc337f0221f31f84d", - "58b5bbe1bab99816d047302d20a419237560924537c74eca6e376882e26af97b", - "2473f4ef9885ad492f94bc04d1664a526aa33e5a0aa3492a82841f328d83c465", - "2cb75ab1e11da9b0501a84959ea9a12796e28718632d9b534e5cb0e25158284e", - "4ebabc0afb7733a679f9e764d10a433d875d845896b1d65778c398bea7081ece", - "9c04d4f644bd2973a4c2676393f82a40d043312c3433a5d1e5d3fcfd65c3d29c", - "e57e8ff3d46f4d9b66647030164d7955935eaa54bae23046ca452d807a605b4b", - "eada057b1dd0c7dc65774f1c63768ba5e4445d972dc85522b7dac259faef1a44", - "d92fe5dfb8ae9ea0202d88f9e8a6149612067fb04b9e0282c52194b71e46c4f8", - "a39c5bac5fefd4564212b144cc0058c063dba2cf93303c24c380b97daded3e96", - "43519d37f8343cce70b12ea3c89d1c8f6920d33663ad4a7b835cebcc2f0383d0", - "757ba20100956eaaf492d40abdd8afb463bd0c9b05b0fa0b8125416f43792596", - "8e08d744e23237cb871c93b7bf0b00d42949041a265a883b753f160cf56327b9", - "e20fd340f8a8e3dec9cf9a1839b5b0582b0d09fa43b1184f70586ef85ff00070", - "1ee6395e57d29ab6a8b8bf22c3ea7352166aa4718227975c1090752ebae5bd3f", - "ba4c86e37ab25e423dce90c6ba7835058080e5ad2753c3372808b91963936612", - "cb4f4b21f22eab15f240d5fad0ef104d08d096a558e943591860ff7c01c53efb", - "ce9e2c6e8621c950200c31412edc964133f4f6fe4a5334d6df1168aa324a5916", - "22b7d38f03604e15bb8071d059b1f5e3bbb4f73d8cc5263a76343561094de79a", - "1839fb8333db2dfe2f5816e5db793f9ec607f9a3fb5962b78aa1067c09dd2581", - "301ca888d645a065620824c992557cd1b1a41e0e58f1fc00ef4bc7bc20b69353", - "830c324f9e05a0821501f0d7b5f2d7c2d8d92f9c9b03e23524812cf081b2ab36", - "1f461358188d310025a741ebf56b339a64938510a0e150972cd057e142018286", - "27a097e65093e3ff42892370e824268da006fd8120190abcd5272ba5339833c1", - "f0606684e7db08257545edcdd58fe05ea5e4323e15917b0c7b7f339a69f071c5", - "9272af4a6470f0f46913437b1cd6f66886520a1c85fd7383aa213c06c8db7c26", - "318f01d74b07674538b2d616eabfba849630ddc15cb02c212a26ff90115ab90e", - "098dd30fb414321317346676377d1bd146c1d0b49958c6d1c1d82110d9ec7e03", - "86278926af2618f7b18ad6590a4661c3d344174c4053c2c9c14a40a5a30a968a", - "fc18f0c90b67458b79c8e59a0f24525e258b852078af94d17bc652e3309538fd", - "b3a5d9b01e294055ff488601f08cf9653bc5c460ed46316c66b80922b0f8dd12", - "733a981affb6e84629ec0cb8cb83e63e6626cc9b9d498bef29c68ffd6c6dbb18", - "157fd3b5c8984bf10be67912a81307ed1e5e3bd62534c857c72d7163e10d16eb", - "5adb5103410cc7a9dade8ade81c3ec7cd94c2b544ad839d5a8ac3be079bf2822", - "14f11c0c4868e47253585c56bcac8f28d78a16c793c468afe0bd583376818b4c", - "55923f224f73223548772b4fb677eb11f8164ed6e022013ec3f1886028b3abc8", - "b71304c1a4991a31c372b38c7b99ef691a53c1017de30529e2a887abe82191f8", - "f693cee954d37395b109ff0a5fe6e0f3aaa5c12be9aa4c38653df8f3f96a73fb", - "2e20ff27a1704ad70d17fd37bb55e038bcb065eff56a51c6843bbd51f5ee84f5", - "615bc8f24458c7b657c839b943fe05d6ac3f9b43175a84f54d15a1440f8d70b7", - "c576adb26590a37434c9eafd3b56c00ac2cdbf50d290195b51fc72550042c1a5", - "8dcc49b2e8197b1c9825e4e4d112fdcc8842d9361e794f1c128ac6124a0fdf63", - "72795696f74d662ab692c1d1c7bae2bf99ed7120cef8459c5a6d44ee10bd2160", - "16ea9056afefe3e2706b1fd6ced5bf262eb59cd943cd5ab5fe68ac3aeb51d328", - "b46d8c3ed4310e0959a1da36c2ed223f9ef86496cb79552246cd7572cba6830f", - "3c1946dd5c28851d50cf392732c263b531c83917c4537a95dd9bfd900dd980d3", - "ce2711a79d58c06a59002f92ed14401d605686fd8c1e00ead412fd3a6af78627", - "4894f60c9f9b4974e7ebcecf86a392ff1e81b17f6359538ab4986bf2da460afb", - "ea5f99bd8832ec026e631acef8eadd5f30f69a440c100771c620e32932ef9c97", - "d1ca34938f53683bdb9729fd940f29c667b7d75be1f5ee3dd9e76db44b3e6824", - "83c0a0fc846530577c3eab0703bcd738a12648c98881d98760942511a4518b94", - "77e4a7f2516acdd0ce6aeb27b2a8105abfe2101e7a616e7884ac7f91c477f290", - "bcabd5a5a2633c85dd53d0fb137a7250eb5a3d3ac872e1318f7e852490ec80b7", - "52c9d247c6816a56acd6fad84c3395f2ebfa266eef2e92be2ce40d83c435169a", - "7ff8a91dd4a0a74423e6acc67c055a8e998a40baad2bb23188e14e11eedd139d", - "b937b3e69a24185c263c17c62a6844755c3d02d5233ff17f851cde5d9c05490b", - "46f8580d405ed0395cccb7c87c6a61482aa86243f4c4fbff50fc108d01092b71", - "bb7ea83dfc4bd2fe4135c9a24967392f99a4dd5d19d3c2e001a955fc2545721f", - "7007a5012b36fa2494a476c78c8bef6ffb169faf65443993478f64d7815a68b1", - "76a3b2966f3c9b57df9fe18e9998fab217ccc2e55f0dd47dd9d09fbfe93d6638", - "d30e824e47fa0824cd13c16b7be922e13410ab883118eca9ef8e2fe7ea23cbad", - "14f85911fbfbf854b11fddfa12642bb74fdb48012fdb3f66e886306a61bf846a", - "8bd708136e82eaeffb3f2d005349b0bfe9b64f22183d17fe4a4991962de4ce0a", - "7735dd92bb87b52a620e5349fb30b50362ac0837b177416f2471ba460298c134", - "a9344b5b455e3dab2c72c0742fb457d2ced9f684153b62097f284372800d41b6", - "bfbe48fcd4e351c83495f728a06734451350197cc87e257bf7d62bae004b4233", - "3dfb4f5383b9c2d0cdb8148d50f6d74d17e01cbb295dc562c7d2da00367fad00", - "c3e7866813bd19483c164459d32624bf0d5aa6e7c8ee106699e5df287ec213ae", - "8c2c82dfbfa4ef34fe9c7042c75f0585c14457e77197c6c0595721b7a17f32d1", - "4b5dbb296806bca9aff3068d68859f8dde133f9fc932c7f4aafeeb6651ae8a98", - "675531dfbfa01036dc91472fb7889f495889b71714170359a07e0c458b816c70", - "1c912b296459c966f7ac3e690896b78188b575afcae9127690ca4af6affaff8a", - "e1389d37110c855b6e830291074d066281f7e64e1de5b49214b2d38a5a4f0e94", - "b7eb8e0a0a8685e9fbf7c090b9c16a5d78c96724020b28711f4908b040f7c8f1", - "3c6ede1c61b829285cc037695f82758eb9263b6203f7959aea277d01dd00be08", - "9bb4d2320db98c5f49624bc8e746428ab89578af6b63873f72fc6a459a529d7d", - "cb6fb11c5fe8d380bad6164c26cc5d876c03ad86816b317eec1de71b77131128", - "03702aec6a15d9c35671bba75443a2968e3f1ae83a5a62bb05bbcea472568ca4", - "b2bf12a7db0ed775768b43171325a65f4a75e57797e2ba7a4b6f727c66f9caf4", - "9768530ea8cc31225b42d0ce292f3e1dff10ce86ead45eff28bd79eab0df438c", - "f1f307223215ae148e97e62401228106371f6b4b340cd1be1f93a6e376bd1b69", - "70dfadcedb37a3710a590a8880f01bc2985a020e37a38cd6b7f516142cf096eb", - "68f2a5e0ab0a43def82379574228400dc502a7cadf2c853542b0c7cf2c4b90aa", - "328f8074661fb0b451abb9b7d32935832374607538c384901c8f7486127d1a96", - "33ac50347334e2ed3406753f8e989907d55b580b126ed69033496e368cc1a8a6", - "739885cec08374a5bcb1129b8454c0708243dde2ee8b23b2f7ba4b130d218302", - "11b71cc59bedcb4c07838106d6fbc155e11bf2e6deaf14878e0e5f04f1fdccfb", - "bc75c2fa35323f6b6987994de87e042b3d0bb1d7c31f6d4e2ae32eaaef778ea8", - "04a728235d3bd7af787a523a4f39f381771fdb9cadd19048caf7791216a05925", - "32b9f6972fc52e22877f12cadfbb71d2d0920307b6299a15dac27830fe504492", - "070498fd5a28e121d7fe46c962fea6c8d4f44e971f7c9860c5d9d96fdfead481", - "d2cc59822567158aefa90aa159b6fd5ac5930ff098fa6154bc245fa43003cc68", - "800f3f277738df5d374c3ab2a3b8c1dace15e8af0ebae21785c5bb10d276befb", - "d8ee7ed701a7a13c818e0f4ee054569c00bf4f0c5859d4bc76d1f14071a8ccba", - "3e3e0f07dd3248e04ebd12cbd8247cc76c9f9bc3ae149760acf40491c6b1d890", - "a0fdd6d99d173e2d0a40aa1e1bf84998589b41f78c6cc422d71e97f516139d5a", - "aa87868df3571bed9eaa77d1c7b7d13d18687094ae3de6f6fa4132cff6eae032", - "d0355204d221285faea5619bc386b565c10569bf84bf9d6b5dbf310db25ae19e", - "adbf4eb427985de26db4e2521838d4fe80c37cef2e8023a24d68ce0f4a612ec2", - "2a52126a6aedfef28a0ec8ab0058b743848427a40bcd3334714982ea53b793f0", - "5c6f3b50fc25b89647bcb9e9db6bbf77d82d020d7f11a6c9ab7e8f03ef9b553d", - "d12130f8cec34c9a08004b769826f4e3e2389e00a1229701de529dcc61e27bb1", - "c3e7571ea44f0fc2c314be9bc083de3302c3a892337ac10321b50b803b9d54ce", - "33e3615ada934786eb05284448e7b2d59c6c53c539b1632beac2f9039d2c9098", - "473f6d094d7d5eec6af6a0caaef62f1652bb71830d5002f9be3101fbe1efe3c5", - "850cb14da6b63db392957d85586d7037e32fc4133555c396709ccb63bb96b519", - "7fe617bb3a32ce9d83f8c7eb1f49094f509cb303f08f78cd9cedf64afabbd958", - "c0c3aca9d3ae0701c6ab7b723d8ec518c8f0994c9df348c0e8106412dff45d3f", - "fb498f217bdee99b1cc69c8e6f144afa9f6c55e1d98d6a0fb672f7c91392c14c", - "9263c99a6de1171ebc9ad13773a7e4eddcb56b11149237b16228de85f73e5e5a", - "6d711263b4c827f982c966cb4581f6bebc55f8b7bfe627bb76d7ba392860ce5a", - "29e820c78fe45236fea8ee4192eff0a808382645e73f9b10b0378ec7fe16a1d5", - "1e00cbe59b0b5c150f1bcdf1816e705933c7bafb1e877452d320bc9dee83a494", - "578789170f3a4effadc70af79101f8c904411643b6fc1c32e9419dfaf995b2d8", - "545b2ace78dd5c5e9f6b5d23975297a6a21a8212289aab88909facbd3afa846a", - "8c624a82bc15e50252819e5d89532e6fdf49a4a5296b54b6bd917dc8bf8e65e1", - "525b05b442564d3ea7f2a09d0f77f313cefce6d01d747ad96ac7ee7591e12168", - "2729cddbb414d1b0f11d78c30e6eac28d11b16c2b7956f09b778e41a58b35562", - "d8e81b6cbfc8771c2a9fe3edd09754bf817c9c2720d10c5ff79164aa97d34381", - "77c0b50742de8b2f9b48d18650b5d593091944adde45d261ce0e8ee0e2948c43", - "61bce4b3b5d54f9f109f9320c285109de6e19bd018e5cd7e55a960f53ea8f2ba", - "c0674f1f65de669ae2d7ea14cab25be1f06083b8a2bbaee0a6fa5b093f482371", - "42e7be14c9e3e5e907f519cc2ad5d5fd266bfabc71021b6daee6e35c5383e84e", - "ca4c74c9da6bf4b91fe844e098e91367899abdb1b6366e90513620ebb2c89e2e", - "5e58a0c19f437f8cdf61fdbc68e19683c5aa945e79123ca3dd8ce81e8e4e683e", - "9c6b0279bf3922c209b6ba5d79e8485e0b7de7882ce3aa49522905182bcce775", - "a533d21f495940f8334a5c8638cbc76326b0b886bad980d272282b607e8bffa7", - "38e5131c7752888a3f17440444f64fd9f179187c70ec80a369bdc0eaca18ef80", - "6c2048f39710f5bbbb7dfa0e29666a12ef368ea0d8e66e37a8dc7cf43583f405", - "8f872e3e5ecd29e5e47120f6c9e056ae1731d54ac1ddd177e871c2feef0280d6", - "a05cdb376ba20493241c8e982b9016455042797a1613fd19fb96b44b1307ed2c", - "2594c8156380d9609162affb49bb89026bd03b5c6e2165cf73f70fbe6b89e2f8", - "47bbe13bd898e789148df5c000d020f04180617603a3aef02878e3c3690fce36", - "a32f6e747a2b03f11752d861cddbc3b000fad63b64006699d6cfc3c8231d8887", - "6ca6dfd421ed67fff05f66c03beda6789c649f40a1b8c27c6b5c418e0b5057e9", - "48753e63ebdc3dc456a65c3aeae67d83678360abbe88ec2aa87a05becc0a6563", - "99b86205a3effde11579ed72612d12912cac4988a8545e3746197206e3effe3c", - "076756d9c0d1a9b9c857cd5b8bc5cab1001151b717162295cb67baeafd9df179", - "8d7e1afa0f5960882c95dc6ca55e546e4f57866c06ca82c557fa137ed364730b", - "b93ed3c2734df2fe7befe810bafe5948dfe5eccecd701669a01047a45bf6a5b9", - "24ffef70d69a9008fb9c55cff5b82fbd376269c67e9a47014213e3add42bb2c4", - "b6b43c6130fc438f7f3f444833467a7f0b89430f53d81708f3d8987066bb0407", - "dd2260af507b7de5ee8b9126f0d98b962e50601c7623e8c8fe5cc2d2cc10af54", - "64ff6b46ff6be2d0738ae2737840833f10b60811c0f216197a82944ce1b0e9e3", - "2aea637548f13d50f1b36c5ad56ad6789cb6b656778c3c75b3fb7a282919b69c", - "fe9d1462cc50030ac8b420b703c0f668ebecc45b27425298ea6529e2d72827f8", - "78f6f61cece8bd6b0e22a5a5688003cfbd0152c072d2b8af8296e8337e91b1d5", - "4bc2ff011b1115351040c13afd146a355cbeee841990fb22268d0293289eebc3", - "763243b338f23829fc86235b64e039542c35b3b1f4e353996716da50c4f0db98", - "e28d1c6ae2127e230148bed0cbaebd151011c5814dc8712736d6beaa40cf4ef9", - "8c7fbfb11ad0066b6d92e6d6aaa2e41fe3a03249e0c8454c7f409ea51666c63c", - "c6e5a680d4f451bb67bd0e4263e44bbb8ed32dfbedc2fb4af7405a67611341db", - "577b0d40b1b9ac4e7d7447d5fc8ceb697b8232c42c63aa12032915ae00b9ff8e", - "209fc0af632fde47c6c2785c23ec76ae22ca633ea0cd17eb73a41fb0d5eda255", - "449fc8c57ad68ebc11c9f54cb367aa05ea6b157785c8e291447435a708e7b384", - "afe5dccc46caef7cb3a5391245f8342d1b8b7cd4f6a7a2ba6a0852fcb34e0a88", - "a1febe54ddf386d51f55aa72e1743ae013a3b12e11cfc032e5cf48b0eb1fd799", - "703bd55f4e9fabeda49c9fe3daf8bccf675495c29922d7e3b7639fcce3e029b3", - "f020afb96fe4908bd2e3f9064656cf96be41bcd435d7061dfcf9fc3476c1cc4f", - "6a1eb7b88002ef52a8520c2ad506614f8b80e4a9042bfc679988280716ba3e94", - "6a8980bf184ea61dbea2f8e6f8515b9c40390b75d1c7d3368da9aa1c8a26c0ff", - "234e8136361499b90f298d962d9ec447cb5d20e6c9eade3b469adaaf3d5e8287", - "d25d2c55e3bb8ce5fbf43995a5240eeef217b0627ad53290eb2ed9121046cf5c", - "9ca21100c9d0efe973cdb8344c3f2d5f2cfb57caa0222b1781151f50a6c542d6", - "63f6ca26a69bf40a418cbd52a5a54874c453d0b3d3869d68dc13fa893406bc65", - "4884b9887ec2ef1afe24071b0423e87009d39c1c45a65ccf4ee4ac8aff48c445", - "93cd0bb776c1c2c1e6d196a74015ef0d7a99566ae04210f1ba90746d1789c615", - "3b0c248c61ec5c3bc8d553d2be7ce6f297cd22241e1bada2f04513b2b1c69c1f", - "09157e2c8996c6280abd7f53ea9a4bc2510f44c1bd09ea51722f47a279fd9fe2", - "9cd12473a3e4f294d4abbd65ae750a684070f0fdb384011e53f1fc001ec32dc0", - "d30923ad280dbf93b38a57df9ea75b4394cd1ef3fa99b89bc808e9cb58f5db4f", - "2fed3f9c12c6a9c794261026321df6e1e694c7f9358b3644e4a2da689ed1f554", - "398ae696e67e2eac440b7ecfd609b58c5a2a733957f74ff4c8d36b8dc98fe1cf", - "b01bf9fff235af8404016bdde58f23bbd0fea2dbd22a0efc858c7aa63c4b8ab0", - "b08f834ee8118fb279d6e726a30fd377673d4e423795c543a1f03cc9e6cc8c24", - "05dc959ba6953cf864a8efd9c8cd5ceb230875b67c70d57b5d34f51c811a8b25", - "efa8780598fa1eb6369ce31f9e1737c9f1164a9c5a013f93fc338dc89bfae0f7", - "6d1e5bab8f553f124392f762ffdd5e43c9dca65bd6d486897933eaf53b87728c", - "3cd27ffe520b480ed771df4a5128169f8fa33de72e015aa658220a002a15d335", - "e5ae95556bbf8f9de8bd3b65b22fbc02355859f7368dcf531f683c2299d6781b", - "6d8d03d91bce244170b8bad038097f87ea5b781c8ef5ad2a1f303d085b0ab281", - "4f985dae0854ba6e4697d1030563de3bbe0009b75fd00aca47a01980954cae2b", - "5a2af41c84e31d6e7ea4d729280e5be48fd516adc36cd011410eff242298f727", - "e0cd808c0ae7a8cfc11ae8acc39c4a683fc3138b8952c424d7defa18315b539b", - "6cbf8ac25aca8581d6bb4812478c23031cfad8d8b61c9e5b58b1bf8a4fba7df5", - "f4868c7375400a1dc90e92e45aedec1d757a00706a1ce5acbcdcbfdc37825ec0", - "a9e9c6b7bb40e92a669d98ce457e99576c0aa53afb36fa5721b11bfe478da936", - "be0727404facbcffe06de093c40435177f50425d0c9957d7c4dc0f46c15d98c4", - "ceb50c8a400655fa4fa0475d9052204cec72fcf9e2057328668f1df116bc7eef", - "6e5568ab18a9f86539fa02af172f55164316a8083cbc6de1f89631cafb1e0aa9", - "b34ee7317f2b594262169f9d949930d5c37595d46124ffa6b946c1752d137bfa", - "b87a8ee9ea5d1b72d4610778cb112493e0c6ad40d3c4af6bb02648eea128844f", - "cfd2a501b988204789b3f1d4cfd2d50668b9684c1c1f43dd4ef9997058e8fb7c", - "f60af151ab5277aa42650d35d82d26987a9b8998fce19f1bab478e290874cac1", - "872fca09581bf884f49f4182958bbf2b4fe5f1d945af0bcd45eb7356f91c1fc0", - "b7704a0d5a2826788c965e8e78e44c3b17df29480309887a84ea8a669ccd38b8", - "dd5caf1806be260eb1a41f2842a382e4054e2afc3901c3dc75f8a7bd49f4cdbd", - "a77773bc9d7e111f3f9f46cff0f4b01e50dba1f6405bfb7d3cee729fadeb686f", - "f39db084c8deef99086038d3fbbc4d4bd7d5dbdc434e39eac2a75f5c38f4a9d0", - "8ea0d99cdfb190347bfb7ad0c12d1ff96c286a616fc3010715de366cd0e74717", - "22af4531c5f8fa52ea204a283ca04cfea3c5da7ce5e2a1a0c2580299e73cee45", - "b0e186661286b8a101337aab396cacd3e94a7346e2274c5bdd4ebfd1711ac2cf", - "0fe13718e1f27641c0ab373f64941065e2d6537d8f8b53457ee175becd432216", - "a85e7edc403ba08925b13adf24eedafa59182acb8cd73d40bc55f95e5a891cd2", - "6ab837715d166a0b78b0f236fd6cce252c20430f6bbdbe97225b6f5ab2cef2dd", - "8941aa2c07d281600e85ad796214e99fc7a8aef74d50bd7d7098ee6963a47e36", - "263d5a5ca1055c7893559d8155f85b077c76bd206fe5a78592ea40fc372b7122", - "551aefff204f098a38da2d7bad637c0fd50e6a4391d5aa4fe82f2101f6a5f31b", - "67d0c4672c7b39a41ffdffad87c5bfa6f985ff1e8d8f2d3f8688110e27585a83", - "84cbeac9371c7211e362fd31aa34ce2d2fc331304c8aca7d3a7ea55e3076ffec", - "b2f14a4603f12f6fd599f5d77cce4fdaa2a6a7c81b7f6e7339c1d30a1f169d84", - "8909c3982fd63dfefd2226c0d9a7ce49195ea8425886946b0fa99267867d2704", - "e628114f0d335f1435b23766edc8ccda63f8f73aae8db7ee1c794dd98dd467b2", - "ebf95cb50d2daa612aef1391f569724efb6ac91e4344dd89e5c555f3c1b04163", - "64b2c8438838fce49972971e3dfcd55c83924ea7045d5d6860dfcfa5a2f4a340", - "153622678256c76aa0a21e1c0e00ed59d60111590e14ceaa7dbf9804154a5b60", - "002d093dbf3556e3f78fd62618e440f06a88711dd83456dc786030da79e16ffe", - "36f48aad6e73f85d4da49b11fd741bfda13862e93a40a6d3ec8484786242208f", - "3e913fd5f0787f7acb56688760781989fdcf2c9f136a487229ea48f492665a19", - "8b52fde0ad36fd3652aa7e9416898bddcc16a6df29e1f9b140ffb71aaea72731", - "9a788937cad6abbe740e45d2b127b2b3cf858b3fa992c6cf756f1a375939cd95", - "497f2e8da96099346157b6928f6e7b7ec3188a38012ac975028de52195e6f8f3", - "ec13473d1a4db7a745796612df4acfd89d33ff01a8b4eaa74c5799df74b2e87e", - "c49ebf08bb629d67e64815d51dfb4d05f124648615059d0c48cd07e101524536", - "7efd772d20618557ae8d549051dc78f1d2c86c27d0376c1e8012fbeb6637aeb2", - "df532252ad173ada676a9ee5e9c5dd415e0cba41aa16c6e2291e0e8d9971b906", - "ed4c530ead1cc482e9a963261edf39ea2bc7db22e6b08cda4a156fb7b0d8d584", - "754ab7873d17a8be341f4c8149d72452be1107efb9bf73641899ddd867664f77", - "57aa8eeed1ce80bc06a1ac23016cee7fed5af4d2d0aa5f8d1d743686189e67cd", - "4a4b77f18a024976142339b16325132dc904c86688828513bf661e152b328629", - "24c23a4353aaa3fce28fcac2a2972c98d5d9d971711da0ed6bf7948b6756b839", - "e1edae1347876b2831740073c3e66817eee77a68de23072c9576a440e85ebbcc", - "0ffcf0a475dda6a800d9e23593b6f94ca5925c4a1fb74cf180d9b188154faa11", - "42d491024d045bab467f07ad409c1b74a8cc92fcc9039a76400d04c5f4fdcd9a", - "50ae055195d83ff152c35e406fccfcd55602c37b8d6413801bc763b7d599c9ba", - "a2474d742c06c0f25b84e93a61aae33b74f562472311c3ab4d0559247322b6d4", - "cbb40b93175965ef85ea3047e85b6fb7a699267ae5fa727bc9d0c73126b653cd", - "524f6124be34caf88bf2aa5d1697da39e6162278d3e1bb8f943b25752df4ffb0", - "551f8b146e3f9638b07609d317b3e15686b1dd973abec0c46fac1098134b34fa", - "acecea45d46e52134e7a523734062829dc31c236c7eda4f7eb022bdf5c94e51f", - "c3ed0dcead73c54fc08672704db046e34e2aa75ba6ebfcdf27859fa91b5e7ef0", - "4230f48eeff8b48ca9b1d0f9a131c063c3652d7ef43672a6b63b41ad6436b1d2", - "f16ac278ee0d4602a787fa9ae24bda791cc1619a84660a209d3837b624988476", - "28cfe2194b07459b5663eac18d32f4b5c7bd98f87f47731671d71f923e12cf13", - "5b52de2df3ba231daeeb401fd141556c849bba65f303a1c0fd768b7cfc12dd3f", - "b4e0529b486e24073051856d215da99e49cf1b560ca29664d772a334735f4bdf", - "28417f1c0209b584eda158fc999fd91d8eeda208b91ed7142622340f789e6599", - "3577e74a5f230656446f9f620009c2dd6a25700449523e1c1a75cecb7ecb7b9b", - "6bfe6d00c662b06f80fdcc5f32619234f7be6e5f6cc6763356746393eb4b7130", - "e6568c4c71babc6cc0b18658d95de89d17545508dfb7f4f06e462638863ba50d", - "6dc11eb08f497eff45b220c40a9b763ba27ecc91528adc2df3fdea11c31058a2", - "6df62fa124ee7c4fa9790a914036f0315e44c2c30bd4b6519d283dade6486538", - "676e4335dd13197b3ccfd9474f05ba8dd10c8306e6191be31cf85c225b5a293d", - "2f9bcf80258408c414cac1691dbdb3fb12b147e234e74db2a8daff3980323769", - "b94f5a0fc3602b8b0299b8b1b0bb421c7994ae29484e318b63b91699b43129fe", - "6c819a938a3869cca94c3d00ee7a21340abed327c194c48271119ae930b500fd", - "3e2b5c4e3b175c18a921f2c9b81df0e80c8bcf8f9c12ac500b22cdd89d5a21fd", - "7aa12210aeacb1ed49ed4514f173043ffa1046a430f06cfe772d2812ad47065b", - "d0f078eea50c67f96a016a36a0534c6233b94b78f87afddd4731f7dee93105bc", - "daac741eca2535bd06c94c1fc83416af48c4b43d5ddba099b30bc5c785fff021", - "7792660c820d86609d9444df5e306a2830a714863c9c426b546547da127b8563", - "79f7cfd77abb5ac543b96d3be5e3960cf513d8d647999c15837e5ec44a4c15eb", - "043abd3a35c47bc0a562404f23bdabb16294616072e4d5fa0f5276573f61a925", - "311de13a623b5438755dbe008155f73e3377c768bc1a52a8bba997a656a18451", - "e29f05e4a85c96c1f79e80ffce9b7f17fa8f8459c26a0ea24877feb69a7ad26d", - "f3c4b0259d954ccf2e77a6a0f2414835833b843a35f956c715d0fd61d21346c0", - "4a97da572e3e48577fa69f7a284643d6025cb5e5d643fcf413889963483e6ad1", - "18c2d23562561e08e6bb7962ca95aee93b79e6c769ec43c352c9d8aa1208ecae", - "1812bc48079b136ef15c980ef2857986bce2a88d578588462f4318b9592500c6", - "e3c1f2d926bec8ee8f80615bd2c8cd6bd9025e731341066efe619adf13486720", - "8494123c6d23382379c96f9bf87b72b5023db5e3d995c2f7d1f546d63d9adc53", - "8d9f36d5292e4a06621a7394abce3343013b2a02a98314f8197f22d43ea1e219", - "b9e47c3038377ecbf2be974037fddf94ce1825ac598078a47cbdbb76f4935b41", - "2b4932d1a9b9170a2867cf57198e1ebdaf370aecd291da31fe080797dada9367", - "bf4d60d7996e966570d5f08f212be4b8b8b8fec75798df83ae0ead137072b18f", - "267d77003ba677bf7b43de145e6784f4a0374a12647f282eb8f9e3e6b66b9a65", - "ee368066240f82fc045d6218746497799c04d12fca62ad4bdc68b0c40953fa4e", - "a7c2734080f038dee617031d208769cf64b1c6f80ca3205a94a39e6020a0f6b8", - "2a8aee32609f87d387f6c77655741d8d4818be65b2d3071ee043a1f23b4c084c", - "7f0cc9b5c09ba94564b77e6be81f67a461af33dc1b0fcf3bff5ccb440617410f", - "f292702ef90940b7892af0e20a490c365115fe5bb3fbd01048f662e73860dae8", - "11fa1dddc0a2cb12a9fde7456a46268ca899ec9f78aae032703df952d2b5c224", - "a4d5c4b0c706aaa2ae77acbf1b0b7be0d72d21a12e63fa13ed55dfeb1458db5e", - "eb70758823bc79174394ef2963df102dc2ea3516dcd110299b2f9cdf8d32aa2c", - "742efe998c2c1164c2016aa210a7fda82a9975021ab36e64d02061f78c39e014", - "d33fa9a3bf034573efffa2b382709edd8e6a0cfdd3d8d261b4f9fd8a3c7fc48b", - "acd68b0c52a029ace2b7645063e8c891656e6351769efe056fd4b2d7efa10874", - "0409db135e375a1492dc4da6f12c1308a13700c2af6ef92755896adf04539b32", - "27991c0d20c80074ee8ccd2d9abda0d9eaf4bf7be23c6ae43c99d594d2c943b6", - "55d6777d43078ee2d5739725a70fe997f01ead772e9bd5d4639b6830f088597d", - "4d92a119345d59e0b80fe1662a0aecd70f253ddaf37db974fb403218fe5bff3f", - "216cf77da5ae327baa720f49017324a4791580a1e0648ad70aad7e35b5675445", - "6e95d4c4f72c015039cd1b077f18df3b8a5b0a790799fdb6c54cca50d28d3986", - "b3de09ef2b7d4a910d390b84909196dde9ab6a10bf64768cf9596209d221e6c7", - "47844a6b46752aac94d45c9f23a6bc78c4fe2099c7223a7ccdecec77fd7a9d63", - "467baea365ee61d0f4ac34f2ecddf040304304d7fa4c26dd4cdfbe73a2c46cfe", - "60cb0d39fd40e2fe922a56c7d0db4c59bb261d0779a3c607bebb8d2bc81c2a07", - "80d88837cc36cc3530453beee99be21360373d57b95b56e929c655fb2ebae403", - "549ef3fd098460f4854463323c5c58ab7e21a2a0e71ad60dc518a39219c7e889", - "1e2a9f164bd9e5f080ec9c6592dab0e75ffcfc113f26695f1150bb09df6daab5", - "6d50fa0a3175febfd452d2787c84866a15b3dcebad04b4fc7099805b002aec0d", - "4782aa3a63f4086e1d15f42c70cbdcee2a669fbcc88acac77e5c601b7b85a852", - "9d6cd7120adb8892bba1bb3c5fc84944f1f856969a7d8be2c441c9219972c019", - "1886cf46cd6df13307938c07ed1567787173f38a4f6ecfc1edd73221d6a9d27c", - "c3fabc2bbb7590822a3cd82037c814ba483b6fabe04acf4f30d63d013578654c", - "88ab0e9209d509b55cc79627540f35109dc2d954428acfb5135d03077766985b", - "189ecde1924d9868e1e6acfd51bbf585f2ec6f02d632ba4b223ec89d30b3bd32", - "13d736b675b1000bc9cbf680cd1d5c5c5d5cffbb146f3421bead4f5429564df1", - "41c0432cdd2eedbeefcbf4e9e32e485d9dec253010234c4826fa430595b59eaf", - "1875bb3ec821b65ca3cae4b2684e1360ead5121dacc32c6ed21ac2fd0e07f920", - "f6bea8b41954c6e8f8a634646d342d29c7cfd39df9af6a4bdb6f32b3ba2aabdd", - "e139534277a1680d2b87565927ffe365d8f959ab61ec4a573af0625f99cd95f2", - "c248e18ae296a69ef2d4a01d2eb400151970d860b5e74971034be997f2c05fc7", - "bb4aaab55e659769d42071292ddacb148919aa9908461ba3add7c9a78ca8cba0", - "7a97a6e94c5f212b75966d270e86c29dbf8d51fba4d63812ed6ea72682558635", - "8cc4d856b24c1e67a74813fff19265e0df7ad0731b1c43a3b60798cea17bd5a2", - "c16a0de56d7ab71eac3f9d12d84aaebcd7e8b66c7186bbf5054605d635a4610f", - "ab8b32bece96fb3027c0d74e9a29cd89eba247b7d1601476ce96ab256f48ecb6", - "932576300f15688451158904fe705cc97c70f706bc2d18fad5e93fbc35214d04", - "fb132aa41cca7e941249a27cbd9d2ae5cef5ea097ec0cf125123e03f92bd31a1", - "85be970a19c764f281ea6d2a89694eb0b69a87f6eb99d77e26a053f3ebac5839", - "b94ca3c67f9e1f3504e36dd58be000f551871d14284c8896c70a60d8a1074670", - "693a8f00ebb87c86000a4fec9896df69aceafc9074885f38ec555e506d477709", - "15674cd13f8f8179531edb3c05cba46835a7ba9ed912c06b15ea2cfd7edccbc5", - "879660d1aa5a68a633a5938878e2a75286f657dd89fc9eda647e02d145b7b260", - "ab387946db58326e990eeb85a81bb7619362f0d75bb32c296cb9a289bdd7c6d5", - "b116832ebc9292f0eba15ddfdcef5c4864fc27b76139e191a75175092dc143e8", - "7db753e3bdca5d6d6d11e793a6f9e402f984ac31f7c0ae315e8337c7f65651bd", - "1280fd05e1abb9634e6c3401c3c3082549e0bb3c474f9885c5d3e5d124391725", - "bb79766925f73bd7c3f7dfeef8e4c9e14c400582c10c89081b372e6c071558de", - "42cd44842e011282355fa3532e548ad60eaffd3c6fa6a4f5cac41ef75aaeb1fa", - "7c197e11742ffe4f8e74da91676651b30c9da49d69f7588ef619669e32efdeee", - "7f4ca4125dc3a2d24d0d3fab8c50e8bc1f236af34201428879e1cb09193a27b6", - "b33821a53696a4a0537e23715ddefb632240f0e28a155af30eef689e295d6bb3", - "095cfc0706578df9430b163c799d81b8d76943503c638ff11b2ea166519541a7", - "b08f7ddf17c1eaa51b9105d7b87e281936634b62a2bc58b7cb9b088b9586ad3e", - "25b2ef787886755d1708e64817c1b87b134f8d1cdd11601a03f05a093b12c7ce", - "84ebf5d2aa6b325c777cc7a2ea9105b5310edf9a35c8e1b3466239963178652f", - "2617e8276b8f6e1ed62701e48b8dc45f01cc444d18642a558189f6a9d081088a", - "e97c4ec95c4630199a62a0b4ce1b58ef00ce5e6ce5050e67092c564dab6024be", - "62b7257bd5eb56a77c3846885cd051b605e3a4e997fa5a977a925bd4b573a588", - "4d2ec22aea40462dcfc555f38123473318d8f70cc22e151f8a4d1813909ab090", - "621bf4cf2c25c195665502644af9070d32521cad0070d8129a3d4ead98ce98e0", - "d6902982225549bf5a17efc984ea5c1ef85f2449b6849936737d0198e5c1b077", - "b0498080592326d648f23fb4eb593394b6007c630607db9278f823abbcbcd1d3", - "cf891f390f3ef0a3014e50d79fcc0ba35462ac37c7f57c9e8ac3acc3eb20ec48", - "593631307b6bd48b65f08621c4064d42fbada1a743b61fdedaddde7478aa59d0", - "852f01f83e5fc284fcb3cfc2cd8f7360f134a2f285c820879ca5e61e502c5060", - "ada5f1dabf46c686416dcd028e3e5b582f22a226e9fd294ed22631a6d1ebb77d", - "f05e54907f30a81196e1706e5739d368da0bee6608f8c297f5cac1fcdd89a362", - "3d03221656b5a117fbc46123567fc1d64e15f9f8fb9dcbe7ddc06f132d7f335b", - "bceb8d65456081033938044ac6c3e432025d298909a7d109cb111dc8b47856a6", - "23a09e4ff117a6dbec0233cbfe07f4ca2209df1446ec2a84e8f7ee25ba13ebd9", - "2353e8a737479eab227a2c7ef055083185273a25e22123983025a5f0a80aee84", - "120157e5fe2c052fb39639878ccea61c27a046a650449360c5eafe4d3f3c684c", - "aafdcaff42c7525e7641927bca8a8c2afdfe47b35c3cc3b0ad1dfc2c82eabdf8", - "1004661b2e88940831f876f4542828c0de03a194d62b50d184621b4114e1654a", - "7e70dcd698fad37106205965e98ef453a4ba6247514264b8b937b2921980e6cc", - "4dcca4d73c16c0e1299f5a73b45b8d4fdf6f1cc9ba3b723d1c1e85f33d1d108a", - "198ecbfe4901cc8cad2f992c504941c64f9e4972b695813479dadd675f28a53d", - "a438a6b61f82bcf756475f65297c176e5f817d0f38401b18aba7409b0667eb80", - "d39e298ab7b61bd2da517c268fcd4161b2e1aaa8dea41934201ee569ecc28514", - "34002d67624e2c095a8bd8396a6f4e24e5bdede26dc4259f41acbe6793fca1a6", - "38df20cc3bbe7b983c2b1594cdb8773b2dc2f5e07eb4ecfd880cd6eb91823ab6", - "c38536227e5ec221a9908e756dccf281d8e97e6983a87044ff384eb3ee7de180", - "90396da76929bc979a2e83edba8feb060a52700d193711475a5484ade7103ce8", - "a2b8641e690eb2a50195a0c8bef05eea6fd21a619edcc61b436f4fb8c65de5ae", - "9765eaae95c08a37b8b84cad9439b0db582984dcccd53d2962e5a3722db6ae58", - "2bc4921d734680f0ca42a4e1b9f99a89ba81c6bfcdb0d71d83942a0ae80ec537", - "f73fcc67844be0aab1aefe8429b4c1956d1dca0957e1d86b5759d1330d08c245", - "a8744f47aaae03e0d4d62df7f4c2a2b60eb0a0725eb4c65280f9aa1d4a7e0168", - "fc158dcbd89c7819efffb5321d829753a5bb2f105ee16af2f5696a6049876237", - "cc217bf7a463af2c6030de9866e5e13eb3ed29d66418d2dce431342964e730f3", - "7ef13ff30ff2ef3b7a526b5691ac88b6830815933bad39e0b860b9f4f4af9841", - "2bdd8c40a18e058159b7043be37e6203d7174be80f70f7d8d316f61d042a6d61", - "a6e6966d4eaed4f7845a9ddec1d8517371203bb8f7d10729e6f6f122ee4338bc", - "1859b2de6f78a80d7a602ba2d6725d32fd524401462c07e379db110ee2692c01", - "80b9f6141f1c34993942da5c6569e2524e1aa82fb1d81ed6b1b0c1aafb09da78", - "91d3adc9a02ce47af2b852d979249270b1c76160d233b9812503581503375124", - "1276a0f5690afa7ba557ee7fef55f881dd1103562e27b824d24c58462d8893f3", - "76beba8fc8070fcf4c2fe9675a7c4db4175289f7feae6e1d1ff43e3a99e3a176", - "63044f92072c338ca1cf00c99eab5c7f0642f240d006e617fe5ec84519d3147f", - "bb7763ca64fcc5e8e06245d268a3b734230394e4374b661ed369c3dd892b40d8", - "517f8fff9aa933ffc453afabca736747810d59fb4b574138ae6e89cd41b3d8d7", - "4dfd4bd765cc842f757372f2e21643af862c3923354b147048b6ca72dfbfb80e", - "6e4ba5a3303ba976243293fcb4cde45bd44e9ec03f1c9fce680ebe08f7926563", - "cdcd4a5ab324c12f7ebc92c8e003a87b6e32088a29ccb2cd3e3b177c916f5bc8", - "79f1ed02fee1a0690c4e486c343845997d81b8b951569b68918483ce6b2724d7", - "11cfe0764f517c7a3ae02057421463716733b532aa38ffae564a1467a8053a15", - "01affbc803e7ddc1bd3e34773900511908e1aeb0bfe338825d653dbeaad5b835", - "39087760ff0809df724ea63a22e7ecd97e6047ac46183ab3ef9606c39948316c", - "2d9a55502671476df4479d17d38722f4ef734e31438c3a50555f324281a2d370", - "d754736bb6809c42468feaff87493d922d55034e7483e9b46b4f54be2e5f9ba1", - "60e7f9174f3e16940c4291e579c476efb082016e2c05a44ec9c5351e5f70d274", - "56d7d5f6582c6cb833b64c838a8d10a900c9d7d4eff248b1d8ff02338d1463cd", - "d0f089bc8397ccc4c114eb9fe1104bc5fa5717d9caa6419ef0f13c805ab0735f", - "d5a7e72b26042e0ffa27b2c76ab48d7e0c391ba11d3de5f08152c835ab590ca9", - "57fdde73e4de4c3516fb842e937cc7e3b162f3a2770920d1998cfd69638e7eeb", - "7c42ebbcb90663207bf439df391cb30d18e80aa5ce4c5a9fad6d0a643b226bf4", - "f8c9371d2e8c383e9efc216154291e4f1f6ccf4b18c7b0baa6e74cddd2a22b5f", - "0429a88e60964e92f81fec5653701d32db534d37ff5b168911a6fdfc7e1b2e67", - "91c5ad48093e9153b35a3374727b5cefcea83e2d3b8b30444807ce2d555e9d4d", - "0608417524ff25b5455907bab9077058471a3f4ec41046360ac8cc0f052b0f47", - "eb062c7cfbb242936e67c01487e8e6fe1d415a9c93a6748a6a4450c46bd985ad", - "c63cba2dcf4393154c95399046d16b2fd6da0750c7cdc9f5aa5691565176e8c8", - "c3956ed6c76a50d990a9646cd8260506977313da77d6a08bf06d604a6f78f7fb", - "c19ecbdc82df076acba07c5b721e9b03ea106df4638a6bd96513afc11828529d", - "33b48c24e870c15512bcc17e4338efc61552e5715a2f1fe373c8f8b8973315a2", - "5e4cadffd79f89d261356e9aec9858939798fbd7674ce3f161db7165fb7d26a0", - "258cd27d669076170e91038a6f6b82a7569f39b56ed12e1da684c916076e507e", - "02b76135fa8485214ffbacb3f14a4fea3908c7bf4ff3765e7d0b5411d6bc5ec8", - "37568d28e13a61edf7f904b822af27428f6ba9e578585f48f215869e8b7e883c", - "455ab81d653bf4130d8bf1dcf81f33dadb8c04efa44f5733afe28f152e433f82", - "bafe874da339b5bc6fedc36cbf34c160f7f746d7ee2d089050f78ed0095ba438", - "c76902639c34ba2d9a88681bafd1aab701c88fccd206d465ef98c56a12bf1918", - "6268c88a21c81a8b494549ee7e9663535518eeb6035d4e99b3c2e70db6dd481e", - "f1cdd360f54d1d4d7675900737418e76d5fd45fe489f9e7a08f574aa0dcddedd", - "76226fb9d6949407cae29d6fdc9e9a08bcc59426330ac689566896761b5944fc", - "6fbfaf366875e9f7258a8e84303395865fd0de4feaf29be66c1092020353d34d", - "45e5351d281ed1e325e0eaa76538bee9006677f7b4d6c8f7b841a3c4ceb82096", - "e7942616a00bc692fe771b1e19f864777e3dc7def5d491289f26c2ff5cd21ee9", - "0f0595890ae2ae947004d9501c59657285c940d06cda7260c487d944634bc8dd", - "10bc9b6dc19196992e8f02938d18394db8f6de8f89628906ea31c3d78a583b81", - "c8d0f8f8526bbf130a613ff70a063f641ccee9124861789afb136fad1cc0dbce", - "6d6049abbc9677f25f20e99198f4a5e8aec00eab54d6916c05821af952b792ac", - "a3c2b0dfb7e4f803ed27fa97101d1ac1a9356c7dd67c0bc8b9c8d1d10f4a1174", - "584ee9ed9d3a920fe34bfda1b681d62927946b10dd97fdc5a80e205ca0ccef04", - "9c1227b31aa7e259fe568a212d409be6b85eb618f13ec8bd7f0470a6c07c47bb", - "96f8c1079f5e9aab2f1f49b967e887bb0ccdc4e8200edd7df9f378cc6307dd7b", - "7e4a6f4c46c6b9dd87778c7cf4e945a24f255b00167345107c46d2d49f0f4763", - "cace700da844fe90c0f27997d5454f4e5656f492142a3e9bd225ed771c69339c", - "70731abac09206b85e3f3c5e8c62c9c575cddfee21498978c7cb80917749fc23", - "0828b9da16161fb3c0bec2e5be213a45c855b511988a3071578a6f88c31cafd1", - "0c77e4473adcbb8ce076e71bbfcdb3c8e53081cc125b392b2165a073c6808cde", - "0b9ff96accc6569ff3cf8a754f2adbf70caba3efee96d885847137c4631e4155", - "1bd8c66469ec02a91be3c672843ce38efe93cf0494cc5f65bd5fa81aa4e08640", - "cd0d84c82ddda0cdca0101222c607351e247fd54eba37ec611ade609f485cff1", - "5210fe232b35fcb05df8be62cdc47695e24b6b6897d616c06006c163b0c46d9d", - "7a9db39f352604985c4ad71a0d8980626b6c3ad7d423393dde6dfaa49b7c4667", - "2a1dcfb9c06fa0347663d675eec65efb9f08b47dd20f41691ceb99d3a6b6acf0", - "69bc6abed8f075a2f13207e8d80e0a26d95424967ad8b8dbe416759314b30b4d", - "b584e9eaac6311e4844c91617fa412824581d288cba21fc79281c6acd38adf2b", - "8f19b613245fb4d448641cbf1e7d7eda962ad7bf9ee526c1266625d4ae5b1a80", - "072ce7a6465ab2c87b78f1e5e9c701556aa03ee234914f303404d4fd873c8970", - "94e0b21ca7e1a18baef4f74b98e5271a95e5909ee561852973ea0345e8afd0c5", - "02acfee218c5010348824077df777e0bd76890494545f2ef08c7181d31a741cf", - "dbe6fb078d3a669e5de0e2284c2334c95b91e0db9731e4c7ff65385c0c2dc693", - "d824d67b6de04fd5d943dab9ac2b2469cb1b70476d03c41823ef9e9ed7a12998", - "4f45fbc7389598144be51ea5a8dfd9a43dbe7b5a3c9fad42ae377c522395de03", - "c6aa4e9b61fa157e755e7531009fc68889688f046ee34fc13dcb56b7f2117ffb", - "aa82213d0e360c02e7880f31d239b3303dcfa6cb5b65781f77354322994463d0", - "7327f2b8a4aa0080b1835ba75133e52a0d24ea1d639ec9428dfd8b28dfd4f73d", - "6c9ad00678b02e6ab807b92eb8a4a10a8898d83189c2ade90afc5f577e02ac21", - "112367704bbd90e4c0234eba91d9bf740892fe7e9ade36b0ecd9e0596372fc00", - "2acd616811faed5cf9c7b0a39783527ba8ba1cc726ddeca6953a1c06a9112ff0", - "d7cae50882dc0f6371d5bc35cc7183a0a0e361e2c3afc176e1b828d1378b6e4a", - "0c3e6c34bcae50e2f6e527274373d947de70075c9f681c7cb833269e95ba8f75", - "48f7f2b14e5155526f6a975bf868660f1aafefed0a142304337731878dbb31b7", - "6a0ec8aa4085937b8e52e323f676ffe5d4a1359586195b8b51622b3996b89605", - "5ecaf8434e8ccc78fa0cdbea24b49f752019a1900919932168bb184abcb92570", - "bc859b97a286f81901daeffd3350e146699e75bbf3eb4f2b464410be55a33b71", - "4bdf4d23ee437c17a84f0c953072511737c939ec7e424592519a2557fc7518b4", - "26e0b8fca03e4b034db28035baedd036470201feb5c79a863aa569bb1ac7f4ee", - "f9cda1958bea4f61c5ed9b13bcecac3dbdbaf8e2e1629d5351cbdfea031cc059", - "980da49724f318ff851a710a6c184e4cbfafa56509b4973dc6419581013c3d43", - "f4b21fe614f65e00e025bb3710c2aead842f7d2ee20b3864b5cfcfb57a900443", - "dcf32381ee11c562179efc06dd777212353bf2408b51de459864431ad0f7f447", - "c5c973628ca21e195cea9db0568fb8499fb10fe99d4e410274914194416016a7", - "20d617865da02cbd04056fb716412595c981b77c37f35feeaea71b4a22f29c3c", - "ca706b1c5361a93809563919502f9befa0905d0d7da25f352c1e2fcdd1af1f6d", - "66f82ac482ddd4ad31b39d4268c5c76d299081cc66af8364cf43a7e0c3bbf386", - "9b7accfef0e53adadd9dbd6a75cb114153299fd0f146a803e955885e259101a0", - "8d8b527e1bc3cdadbf10ecba493262920d5fc1545aa665907407035808db787e", - "0ccb03703b24b0e6484a1f5c2184628751eea125bac94c574e9963f060ca7703", - "e41d1f81f3c7f6e4459ced8784ce4296cd07983f181ef3dcc0cdf8126ffe9187", - "83df56ecffa302a42a863dc4a07236897b8346988ff3cc9007a10e4218c63f14", - "a30ffc23ec13c06e6ed21f705a45a3e24e8d0c8c2f70586271af8305c9a7fc4a", - "929080d40f9b926f666136e9c13995132079871c518792ceb83c17abffeca0f1", - "b462978443dc736a0724a0e7166dd3b0d1076e33c56c381da3cc215886a55a01", - "1046cc4c1926d9386d5991b601c1bc0a2a0a4d1d49cc4aecd037231f3ffcda8b", - "953d7de55b16c0d1b515c215ee3e240caca701553e637519b583efd477dd2e67", - "36c0886aafb0fd6bf8af9281e1d9f7f969022fd70530df14858cbea76b30cc3d", - "ce1ddac5f55235bc83aaf5a78bee32327a0138df92db14710146ab1a1f5641ec", - "c4e83010db4e9228f685242d3bd9873f82439fa87b8f5120f7508e747784943b", - "34b508ff0a74461bc36eb9452453906a30dbdd7162aa6951f2e0e9c53b0fe6ea", - "1468be1329f76b33a05b48de0510bafd7faa47b2b6d17a2fb905a521f307f853", - "91d93339fdcf802969153135746463fd7433aced0b0f1f4d8e0591adc4a6018c", - "9f2ee08fa57dc283b4cdced665f8e2eaea5703817c42118947b86a376b71f304", - "c896e17d959c7c03a950992ee23167f410b081ddc4b189402d9331c9dfae3b27", - "74c9d93a0cd0c13eea2116228fef5cde4827c5b0b610310b873ee4333b8aa339", - "7d91a4406e8aa21ade82f09424acd34829643af5f4359895adfd413adf73c77a", - "a73a08a59380810a5904645a515e64a32b4e46b49e5651cd737ccf40379a29c5", - "4ab4bfbfda085e2e664ee778c576ef33115c9918164d1c6f1b061f381d858405", - "6d7a89afe1f17d6051e2435c7814471c18803fe355503ae7e0e33fe155aac8f0", - "bfa81d8da39e8c053de106a825441591ac98af15b7cf6300a309d776253568e8", - "95aead00104cf3524952b072f2456238f4b705ee4fb307d428cc58d4760bab2a", - "5ff10f18c20d943c32f89a0a14369a8aae5a1381b8ffe5457707326bfd8f8046", - "e3bb05b41e3f583153d8572684c0b2bb94d68328b83ccbd3cd4c30ce3c0a6d80", - "59187e81aff1c11851749d590f602de26c6a63473ce61d1b0f6cc47aefd5cdf2", - "940218aeb1d7d4afb6efca2512e30979571b879e05740fca66442acf4dd716a8", - "96c1dfb0445a15d8fc7a9e4b7f62bcff74cf2e754ee6391da06190c527392392", - "c2c61b506553378a2d222296a7e0107c949071603fa08647c96245eb96feeb6e", - "55734aae211e02120d08030bd09220a2a9f512f9cf213fd8bcbc608438b60857", - "a3640275d653fa52405068f1d0ca1c3dc0e080f5eb54064b6bbb2cf1454f0bbb", - "adab0409fd545979a7bd96d2d5d5ae76a89edddae0d93a4588a2329fe3a7fc09", - "a4c89a4312be5397b1ba7b2fdbd2e98a8d130a0c47ba58a9f60096e5aca4a347", - "488dddf4e46dd5ef30bd98da32d2c37b09bb0326af21b822881be15d7f1f92e0", - "168d27fc7b870cd2da34d7be76a81d01a64778dbb9bf1957ed6719a4763440c0", - "eb999eb2bab36938505ba36624fd28c11d1d5fb94b3748b645b4297b2ae0a928", - "702c0380f3346564409ca155161fcf3f307b8eea1a8eb5ea65c95eafd9599ee5", - "20592f614e8a423d9add04cbef5846d1956a8782f33d862edea11b31e55aea3c", - "60f7aff1cd8f4b0442afea5f123db09a9393aba9a1fca274c6b62f53fd56835d", - "b1342d6e0dab8ebd7cd01af962af8dfaf9792568bf736cfc432c6d1fffa86645", - "368f7e6c66d6e84e2d3d2b8873c5ac7d8a733d5f6fccfbee810fdbc7975f019f", - "438efea06921290777ff4027435e0dcf6da33b712e23b6d6523f66cca6447484", - "273b15b4e53389f67f7d7d504be8a158617653f46ed06f63a2c333f2bed5223c", - "87e9d2960d2b4f7726e36b94238998eaccd795100e7f5fbad7ceb110804413e9", - "879721ebe4d89209a9ce5b8f48f20ba3a4a2ed68bafc8872acda0b2238b9accf", - "f0bfa882ef4f8fc829a613a1b9118f6936708a127871b1f3dcd2c817c5a024b0", - "a9d8c3885b506cc1908fd8b7977cd361651ce541c460268bbf148f95f0aaad83", - "f69581f5adf019fc1c418cb72388fe5be84f5cb37b1f04164ce76b38b38d7a85", - "fd914b383533c544972d5b5f7fe9e098fb391b3c3d26918872e24b19f25de618", - "b644cff9b2474ef6a812bc64457d7ef531a1e7beda6d10a3c2cc728ed47baf15", - "8561d6c0023524c0f5091352c616fb8ce471b8d097ff24b5548582e91c609b09", - "576be883135678ec4c35cce22b99cad2fd6fbfd98815ca6701233d6fd7fda6d6", - "b7589175c30b303755d438fd0727a49371b119c82350e56f191a40728af9d07e", - "720cdb516fd9f9197c1bbc4492c95547585aae3152d3a3930f2c4e3d8e194281", - "3408eb076ebfadc6210b8c04f1c14ea174bbea92fa00c4bdff53069112472cbe", - "fb7a27105873ae28868bfd9f99c84576e368203dbcae986a70e9029ac615631b", - "aac089ba7df92674e5f9a8061d6c1a0e8f18e600fad035b7661f5e490bdf01e8", - "cc54f5397224f803a017764739dc9d938c2049242d39dfb11086596cb3a23404", - "f9fdcb99b6565bb9f6a1fcc35687a1ec6f36f01cbe701b490e45e0692701679d", - "bac78226fe21d10f05abecd95b272a09867aa8cc33f62c596fe678a04dc4710f", - "01cf0ab4e21ad9c9206438b3cc212d9d09a6edc0c32926a3a17b7424852504e1", - "884710864a61fac2dfe38b137a5d95286159b22d11a8d9852ff19a7d7ee0fe43", - "d9927027552649287abf261e2163a3d04df2b28226a9f9e3b69aeb0925c468ee", - "c82160a2c3fa8acddc37b123f5589794dfc93594ef40a49a69a4784b72bbeb61", - "15cc7fde7735f5293098655aad86ab2a77854f1f32efbb65eed4bf5c49d514d9", - "18c932d0da3805090b1ca5ccd9d10c7784f0ef01ed94d7a2be4cf04a2ef1379d", - "e11a9d1572ff9b5afa61cca2a815f4bbe9dabdb87595933f1cd01083dade8216", - "646c4ac098f8b5679013982634d50803e74becfba2bdbc133f93640b3e7f4681", - "ab9fcce7922c5f6204f7563e2e080335066e12154eedc1bfebf68d1bacc98a64", - "50012705319aec2047bc8fcb6d0e8576eb12f96ed69f900e93a9e532d6c57715", - "32ebf951298a139452c0916595a9222c70398660868345409fc17e89f9ee2ea4", - "ae822c4a5b05180cce56bf7f0e2323c900d1e8f6f585a878264cb79a341d25b8", - "6cd9ddd20de857b0b62fab962aae20a8276a062195709b1a2f2d5d9b8ea4909f", - "f708280424aa4ff00522c28ff5ed40c6cb4a30a38d065828efd770f141210e66", - "a7ad873fd70e478724f6afcc51fc5f024a3cf825846959193ba7606fb2f04aa4", - "1f58378171f66b5eacd9dcd5547708e03907e7b5022bb5be84b04350368642b5", - "dbb8ab7d8b4e2e5abe0af17b51a6a2ae9f1ce590616d586d9e06f5a349dbc1b5", - "047642de55d934caa22a78cd49f4df96464fd9a23ddeff50a7a3992a5daa2b05", - "575785dceceeef53404f92d0bb8f8ac5b0251e2c83c4c9998ab3a11bd00813dd", - "c9c892dc7a0529c6392b07a6de93f07f28ffd5fa0fde5a3495f6d0e32c070ddd", - "9c9e948b14009bc3f4c9bf78a4fa94d7cf22fe5e112e3c3b67b6835eac21211d", - "188b63dd0e33d1e26e6cdcb86167a48a40ad529f471841704245e0b3631c8161", - "e90d8b23fd23eac22bb077aaba2b79da593e8bdebd6675f2e5824207a7e4dfa6", - "34fa3f673946f8207fc4f4c029d679e084bc3ef759f14c719be9d494bd4fd692", - "da1fbf08025c4fec17cee2df3f46e6bc7ace425d84f15622e6867fd9bcf83ef1", - "2dc2cb9ce6147897334597357ccf45305c2127f2bb383730aa8a19be45c5d649", - "6a37105602b2a72481631b7b0dc1af4e8757e8062006d4f6f788787bcbdba315", - "06babe53e6abfaed5a8afc001f43e2cf2aee86abab37a7d505e4b260e63a7dbf", - "9865297515c13b263db7d47bbac4484c2cea68952b21dbcd40eca27aec4a33ba", - "4c7309fc2af625f10e0080a3683b9f8bf72ca7341138daefca0283944962fad4", - "9779b9b6c91cfe7def67c34567e228dba3782f03a89063a0b44b26a54b0274f5", - "15611b0c47792a8ce8993958becc6ecca6a5975bf982b76f8443e37199037a75", - "c3400c22d4e49f514b0b201bcf8989dfbd05eb565882387c236d3d1c740468e0", - "b66ae9693419c56960e283e5e9ec135e49ad48e041a060f4f6b7865b57db24cf", - "58254691e24159bd2364c4d90e07e77c2149bc085104e8da335a6837667a0ca8", - "c4a59e8ae898b46cfaba4b859e1024d9f4121c90a9fbc8c571a5fa1f8912d630", - "b3404e4876949ea71df0142f0b0a11fe4eaa681fdaa7de8d3cdd19cf81a15dc4", - "21ff17b23fc719a6744bfe59e3adf69f06fdf6e20124f493a0adb733d058640e", - "346e96469e7adb2d309bf88fe9c583ced13874c9f19c675bd2778a404bdcb9c4", - "781503f3af68fa3f91c2e4551876155f712b1751c0f367c734cda1d701b97d2d", - "0a0d81a12b7ca05a3440157f4b6969fb42e50ebcba81896260175e4fa73fa0d0", - "38da09c39ce9832d89947ab40439ec53c4fd872dcfb6039ca1376bc213005718", - "9aa8c81b6972aa1b08ac358b0db65bdc6ae8b0017520b9a19dd6081713f0ac4a", - "51cc33736e371695e6d25388352a99a4619ec898d244c6980efcce6b39bd9b1f", - "d3d94d4c03ee50429e60b63101b1eb7dde5e7b67f749dbfbf3d7e30cfe387202", - "121982999c081a650a4c9f39e2aa8330f96047ddafb9e4b2039d8c812401f6de", - "5954a72c24c640175725e2af95fd1f7489da5345c94c85c8080d559ca9d2858d", - "81b7f36d3fd4a60f5685fd49e5fc44156055817e080dcbce7506f91255ac8b14", - "401114252f10356ca8fbafa69a985b52e5bb4a1c5700ce8af14f4b023436ee62", - "fed689fe23bb7f579292a94fa76dd2622ba8db32d6db1cee04f25aa4dab87747", - "f950e6f118279fde9abc22907faefca78f223509c4c2b963e0deb9a3d07fc657", - "f18b1a3accf1f9a097a8238d48ac82fa4ab05e333650a42f99f4aa626242f5bd", - "3f1b1ee59c9d81c9cc050f83c03cc222a4179599756427fb83fe2a86c86d8b55", - "777f18077f60c31ff79d4f5ea054fdb967cf5a08efc8bf603ab32c41fa4ff2cd", - "1d8603647e1c27f07af8145bb1922bf0d7719a3f95d1c237e252b61d88f513e9", - "3a3f1e7ed2632028a892f203e993ffc2e89613cb65438fd68b3e060fd6fabffa", - "688acb0ed462f872e7b7641294d407f19702039ad953ac32d737dd8a24eb6f85", - "b1fc78a3b7fc5f5d7c79600c0875de057250ff1b7c4e04f3ac49a0f947d74c10", - "84cbe700e64f57bf0ac70cafde5b660ec0804b51c5e4cd082b0ac83e9d119c09", - "82a21280616a2c9c3f1b3f3874c6ebfa43ed5d0dac49c8114542333d5d94e269", - "987d2110ede8083e1e16bef4d42f9c6ca09ddbafd5b2160a94fbf34681829743", - "bd65ecf989d3b57b34c26ec46b4e412b1c45ed61c44f50a4577d2ca44594ac79", - "101719df6bdeee6dcc737704f01165e1662957f8be997a9701437f3b5bec015c", - "4cf253138443b5cfbb5edb77a37e75d3383a2a7b2e2ae9a701a0c67312eb015c", - "4595b4c7e77cc0a222b510e4a51430fdd6bb91416a90a9f2aa9c5dbb345c59ae", - "8a55cd222aa97b2b93ca496d779cbf4e6b556f729029fe25d71d534171c483d2", - "b491ea90effdde9d43212df0151a72a001d4d48f2e2cc52cc3a632e763548af1", - "cc27e2530c20214511f31caddf0d72cf40cd22aee7526f5da8c8955d6b82e289", - "c073b93728275a5dc240b749b73ec1aa25a85d36ae2f6f5ff203e4ede1c8ea05", - "8b7517bfe717f5cb83ec067dc90458dbaec3c72123f2edf205a0090933791e84", - "2398038e05307bc6cdab54fc33d8b491e5759429b774842c5a62a01cdca34dde", - "737e7c4bb68f7121886e220d15af0b0e1a9eba510aba4a516ef30b9dbfe1a03b", - "beb324ec23d4a43af84a2882775ca67c8da097f033d9d4edb2745b3e090bb07e", - "662a6882ec18f3f25205e5912ae2a514a7dc83dcc7cd068cc66ed5a53f8cad8b", - "f663077a8e5a7f7b7f14cf2799ca2acaf89dff2c45bb08594ae4e14e138e7abc", - "4067da2f2088aec8bedfe78adc5bdb469acaa1c6b03d98ce85d5ec71ae261754", - "84ba8c7da4fb96cf9978eb3732e00e1c6058b47e3c6465b8010ed407fe7dc7f1", - "447148b59c92d2b074ec8c0a16cfb5c6f6b244a5d657aaec04e9b112e9be17d7", - "e0d71bf56c7f6731649b1a29371444ede169ff6c4cf3393e443c8e61f45fdb21", - "4ae587861b35e489d1a3f2533947db91c9f8756b3d93f9d2353cda6bd25b326f", - "7a6167731df4363a98e7c0f6d7894e5787407dc1b82d26534a4221f07d235f2d", - "68c96bd94fe2c5723dce619b161faec09416994a2bfeb3a6a3fc92b60e1094c5", - "b6b0e1582c859970a2c26f0ae6dd067385ee0f83fd5ade3c29c072e68dd0424c", - "e6c5803fbcf04fb272f372d4aff0aeeab57c359f0412fb04df11a6063f9021a7", - "996b847c0a828b4c87c8fcc15382d212889d0c2ae1830072c8ee8e2ac3f8f486", - "d45650d3e13fc8cf9cf6faeda3df58f0b7c47d177f3ae521e1cad1000370b3fb", - "347a594a92128e70ada66864b2035b89e8a8d4273c45f26e1b91a6b8c7cad6dc", - "5a781f5d7374af1319c3902acf08b4e833553f2855bf3dd335b827279993f66a", - "bcd8ecbaa00e32d797db422f0cc5013db7ab0947dc584315ddab57d8ff119e6c", - "8fb68ed1412b892504aa8ebd83cc6110bc51ae73b019a8b187f78d9139f65a4a", - "12274e72ed639bdbd8fad6f4d6fe16cd098d2c728dbc01233f3e150c63d538ad", - "d214e3faa35583f85e99bf6c69ca7775615ed11b80ad8cfbf9284568995db5a1", - "80ff71aa8c30f48b7d73a4059216b843703903d73da314c3fb903ee21533b8e7", - "3fe1af1e048700a6a3316ac93789918f06ea7bd3fd7b870b63982f3163dda534", - "239cb7f7c28e755cb4627b74cecb9ab1a715e40196c444b7d57cc3ac641a802f", - "2a80424834be0b627eeed0d006da7c4ac9162df503e6e46cf0dc0fb90cc6470f", - "ef558dd5094ebd108d8f7002570942d94194234e303eaa1690d5f3a055caf0f2", - "57eeb9a4f4655681fa97d846ac47776ee0b90e0172511d506412ca394830682f", - "6d71e58fb7377876f9486b23775cac6da2e532722b58ad4514f33a8f792029ff", - "5cb410064a9b70b83ffa82ba18185e47739f7a917ef191744767d58f20244c0d", - "e88683dc480ec80120a112beefdb22689f67225bdbaab8c3ce22463a02aa4c67", - "3857e8b8cbd9270961b4e22902583243fc542805d7c2a66df91a3e96dd70996a", - "36725042afde297ac5799c2a2df5e207d069174e383f07b3daad3b2f530bf8da", - "a93aaa65e5702721b2a6c5e2bea46f3c8cec6052153f6063882c7653a94db154", - "e53fd5a447beba6a09b23202308c8b3a0c955d4a98aaae59d91e383f3d968984", - "5ca42e0b950e8b97a1dc7c4f74e6b541eecd3bb1f6f1a6633f5711d9ff35db70", - "f26a3d2b817ab891d327862a1b8b69563ff95a345ad708bcd8a1621f620affbc", - "1e35b2d1f03eb3922c0c3e7eeb74a9f3d9dbaeb27331f664c74d9e41867f805a", - "53fe4bd1f1b552970a55fe5fd691ddb3f50b616b13a6aa6d1d3a30a43a6df3cd", - "0c1a8f3f97355c666f890be55975282d0557fdfb7247c7fce9fb2d655106f2f6", - "3ef48941d12921d4f57afbf457f0c2e59b25f242e75824a0f49d29158720962f", - "037c73d78a667b23e5efe14c1c1b133e61867e7281a80ecf57a758df9b30a940", - "e7bc3d102ae6060791116f6fbebaa03049f197f4b356c2526bb388ce86ea983e", - "f99d18f82c0fa91b8b571513cb41165db03f9ba7e13ce300925ff29b0c685a16", - "55e280f8865339dba5423ab58127b4ea0045aed0d4a3308cd354c009de84e7f5", - "c37a04d0a26a600cfa6548b636bcefdae06588bab7491a0853aabc3d24eb7ddb", - "36e1f30d2b4ed7125d95121db53a793c9675b0f3e71c5de0281632b88a39afda", - "0d4d267d3d19e1fe9b5a7a72ca80166779c193aaf5a1a64b379054181d89df10", - "196ae8c2224b427137c9c88c8a649165d04fe2bc0db253fc4aa94a9d79513745", - "388ad7d568b438b735c20b58823bdfe43ec6b83ab55ec027e66e6221977117be", - "37f6c3a99b4ad961c5f9342f34457743dbe4784d536990c9c34684d95782f007", - "cced704541c18df0db50fd89e1cd89efae75057bf07074691c8baa1bae9c546b", - "7ed2e31ea6378ea7fe9b30c2cdeb6ddd2279cbe7aaf290ced929e4f1787cd0a2", - "d83393358dc5e454b710e50921959299172bec4b3f81b68f413f590473bceaaf", - "e61ab6477c76afb596711cb01a36d9b8970ca4f5408a46aa5618995d116842de", - "5baed93ae4b3d110613652a712f8b1ad2913ac55530663b1010e688eff848557", - "b2dcd4dec4cf6a59cf8f434afaf184d0b111a7f1336a943a38f6f97169e35ef5", - "29339bef7d6decbb7a54bee4405d2d5cd814730541f698af31cb34b694b2d282", - "a427a27e997e08a84ebac482996a858f596415455cf2847152d0310f4ad04081", - "ae7fe703c380ee829c2e5e221f0a0af3f08d800bc403c20850783ad6e8616618", - "6966a33565a9b5b3a67def054e809d9a2683587be17a774c3dbd86d7bf10c418", - "912a46c4de8c393f1dce28520025d085de79c6879fe6c5c71b79908b98e28c3f", - "a9c2a64d3aa6d5905fff59e4b7178785a3af643a1ab046989e523f4742af0f6b", - "0baee77c876dd627ba51c7e1a1437611f36a4f51732f878d49a57ccf53eacb94", - "c04503b0a737d6070edbe0b43b05624151a6319936bd1d88f62d275534069853", - "9ee36f5695068883f42f64d2dbedd0719ea9c40f01405a83e9a82cebfc7507ee", - "57240cba953ef827570e9626f8046e9659eefa28125e638d9168da466a40cd08", - "5f94d89e9e53bc0b4ba93471be98575fb1ca0f03094273778f1bf199946e51ac", - "3201d415a1ffadc38d62c1c4cdcd860fbd50ba56db64d098268f3bac6c316d10", - "724ecae943157fe9d3e7c118b0b269d08d2e7c788d99ff9bbe1a094efd5d9734", - "69ce45065a23ef903f957bbba082bb6a1b37f7699cb1943479afa9065aaa0cfa", - "72cc3171898fb359255e34c5e77de20a210cf702fe399672ef6beb7af26b9940", - "9acb5fbd47e3cc6eeedc36f789129421cfb73231286b05e70e2951ed68a779bc", - "91a7875cc53cbfca198590ad79049d5a89b032c916ebbc1721da0aa91ae6dac9", - "df8d2deccb15c6eb890a31c6dea6591ea387acd99afcb44ba0282fd5f343ec0f", - "d2789e5f876476117680304683d00bf82565a0d1351430433cc72230681f04d9", - "a8443baecccc89891d5c4d73a4943f63ef8e5a46b3cc82bedb075dfe54668362", - "fa233b808c9d71bc867f8f4d9c0fe22fe10ffec29767856374590070f8aaa235", - "3482b2499060cc6052d04c154f8d625efbbee462ae37c4362ca5461310074655", - "2a182f63717ee13e78a0debce582ad2167baa457558274fffa5a3d4e87183b97", - "a28f454d4d6a7090cdf129db2455180630670287c727e7084e7a858b95325706", - "76c60cbd8643a0bf3eb59a0295d501f0774f678517675b21e79f22542805ab22", - "23698c7191be86ae0638c8d358b26d9f24f721170eb924f2c1af8687ef2d1787", - "a8457fa2356bdbddeec7fe5eac2bf13ea95b11e1f79227b3ec5e74c22f5c20ef", - "5a2782462e2a52a47ae583828e9683051817f32c58db5887f23d5eab294c117d", - "bf380ecc2b961b2c4cbf9e3cde6a30e57d2a5e94162c3e6b22e34e52392f0ab7", - "6e272992077561f5ad4b80106220a1edcaf86f8e63be65f5327235d280687e8e", - "64e80dcadc6d434a1830d8ac580b566d4152f26dca6ce9fdd2ac568f5a0d6497", - "00c425343f5667f8bfedddd91d052053fa51b34fd134c789689ef0a0a6f8646e", - "817545d911bfab9adfb8b9a93c9efdc19cd74a07080ff9a7cfd35eac6b75cbca", - "42fabb3b5967374f60b3fb06389b462ab6f35b8dabbc41efd1c5f99aa05ae89a", - "d41390b2399dafe4dc48fbeb2020b22126205951419ca8068102a6dfa581dbcc", - "73a9779d732586c96e407e40f04d5a77d351040b982c91a3e0e12d4b6cffc03c", - "11c8ef75cbee4a4e3da8e7e64119dc62020e224608a2bfbf8e6948811288b96e", - "dc82480cd70a3dbd198871c81e419f359158d0f34250bac4693077a87c6b9c9c", - "2db888bc4d36d917b5aa0719a8ef9a5d1616bb20cff2480d33e3fe38a0f94919", - "52a94c5259d499245641330d62482bc47166589f78b86ab376422dccac560c4a", - "9cf9f96a4b3fe3cf937480f70d62fff4348e3e28791826330390f3b7cb524e1b", - "7ee96239b582d4c529f2f545da8be2bae05f30b2d7329e2517f8cefdde6ba4fa", - "888ef485d6130df1996d7b37f5c6d4c4782e53519fa8e4e3ef89961495cc19ff", - "2daf970c5bbb237372f05718e629669188a3c99a8de7a774b18aad799b645c2b", - "49f5fe72f2db574decc6ff05a7c2b7abeea0d55347edb143955392231708ae9d", - "5d8660af95ac13a67834b2e08e01042ed9424d383c8d58eefb556e44401f3fdc", - "4b7bf549720e25954128ab7b4bdfaf6cd3d57daa4b356c057f8a6a22a1408fa8", - "5eba6a186f6d82f8fdfd3c96faf09da6473d0b435828e04cf1b2ad4d8c74c3bf", - "907bf5613f7b2070bd872c4fe972811d7b472351650470889eca2f303de8b0d7", - "9d5c07c0e90ecca67b384c0cc4bee81eae0838165c355ee7f8ed2d7aa48b8414", - "88877c4b830d746077347c5abdb63d52ed99ea537683959f312a545df20a84f4", - "cf529be9de86d503cacb1a6351f8ef759568076fce6a4995a476bb251dd023db", - "043ab3b8b987cc1ae2d0a57a2715256dfcf50e5a907b9aac519192b222f43c60", - "b54ea39b32c2e9d0b0633f9ee8d502feff0003477d251bdfa012ed6beaa9345a", - "b5cf4223933bc3a0f696e4296c75c8d5918e0712790a80165c747c9e6e6d6344", - "82acae825e890d2cdacc15c6626ade68490d5c4db0654d2239a47867e106523a", - "aeca85ae54d6dcd44385c2946471a2e8279b7491f80f1ab8c41d07ce5715d211", - "c6b8494d553517df9a5c92d68585a96114480651ed3ab572ddf86461d4c8cdb5", - "5a6a186bcb4565042ad62abade68613b83188c2f55c8a54e51606e43a5946e70", - "e1fea245dbcacfcc60aae02a66894ec1c6b57a660aed071ce78bdf78da8d6ed9", - "871b0bc91017f3db16f334714827ad82ce45c0e542abd87248591a6c8f82bf02", - "47d0546566224ca1557284b7713da24b5bc385af99036c28464b55c793130e5e", - "d951adb69d637b157293562bc990c51c080f829572021f0dbc53f40f55364771", - "0f61246f9845b401392c31fa50e270765e7c824293a57340b7a87ef30d46f199", - "ed0538f837431d3f3457aaa30827a5873b2b3762942c6376ad7dd9aa2332bc06", - "5d72240981b88e41ccdd9eeb0bdca6331058ad6baae8c0464cbf7ffdf59d3f65", - "a9f3dba7c916dc5a43787a0499dc47c677fa48ef967efd92a9e3a00e982d76be", - "6320bb33ac0ced7d8cbcf03e59aff9388ac3fb65c30df8992ca9a6c79e08295a", - "796508bcb1a874c6cdf5fe51b24de1a9239da453daa6d3fbcd61e19c1f3139ea", - "b196369f255cb6ec67d278ebcd22477a205dc57f862165d8b44ff55f0c091628", - "646d9afc2f99a90df021ab783a6eaf7fc99b84727672eb78960eb3afea5b745f", - "1405440311960ea92a7c3986e29acfdc5b54cb7c83789451e2a2c19e89e8e97a", - "9ebfbb9d32421d308907a5c4b537c2dc9fc895a39bae61f6798e2b49ad55f0e3", - "78acff89c87ae8891dd8b47b540f700770113d4af15ab9a8c5a496771d366ad2", - "9b286b1650eb9ca73c27b09075fed68509e2e5fd0cbc030b684de87220a5e6e8", - "d4f98b395f0b75fb577f2b65ea327f64b8c39428a510c45ea684ae6463fa44ff", - "d2330fdeff16e5b066cb908b9d33c9493540c73c182a83a6ee8886c403319e1d", - "c14a90b9734c539fb4e410dd7463dfaba1fc674e01473c4f819384dd7cbf6031", - "3b0cb0c49042ad0fa6b42563a12f48a8b24920b506604e3a3e1c06e708d76160", - "00770691223bc53c8934acf8674a5e6a2f45d9dba112b0a46aa326a5d8b256df", - "3f4da471e7ade0e757a397638e57ecf10a972ce6205e0532fbf2cf55b4a9e12f", - "3280ae42ed1ff3ad755fa3711dad3166bfbfb579ba63838c6bfaf8c7ada8e7ea", - "820b80a3d50d0965938fd9f05188361fa5f40d34af190787b478e7ce0d3eb3f7", - "4c0d4b2638a22b40b1b3aed00f9a65d0c3c95a2ba03fd5fa5fa225e139a1889e", - "7f84f75329e25092f9c40dd9d887a424ad2156cf64f0751a07025542b161f005", - "c875202bdebd7524131cb737b77b75fe8ba2f6ade01370f5d4df48fed9f2f262", - "2e577041efc928bf5599df50befb259910711fad07cbc0fc416847f09c1b7cbf", - "64f155dbf23226ad7cb8f5ba08fd1a382843facb22532624dda125b53c8ff17c", - "ba25f2adb69ff84d2e36bf5401b6093df26cb76be1e3a4feb4bdba154083fefe", - "ae0fbcade790652a18e401e2e4c801d418b1b11dcd96704429f93e2013f3fb76", - "145568720f9bbee3bd0646565adc547c45c9fabcf8abfcec6b46463615d985fb", - "2a28532b5e37d7f006da6cd4f7c74e4ded07503c20a3920871d6a17525de9bfe", - "76501cdf98ed7cc26cf71078846a828867da0f9581d83ea1bada1d8916d9347b", - "1aa1095593b89e0332e5b10909b0af1f8c2731bcc11dff17ca26a669c3a87cc5", - "489d30019e38dc7e3842375fd82af6d3fdc1143c227151ce296bb4e3b9925344", - "994c35c90d9ff6b4feedb9584cee72932acad0a16b9c4a6517528d1b585245a2", - "d4a87fb5369c1c4393feecdb07b014797699477d9378e40636183e0752e1c254", - "5e16f7c9dd6acaba2cf9f610153b531de9e845f3807c62b44cf6290520b9655d", - "8259c58229003187ac03f8b46bbe4ed4b0a9c6bc93260b698d522a9a5550aaa6", - "716bf2e69f4f310bf68cf06b495deaa8db479e5c414da451a1d9b2ef5b702021", - "d15b5767251bba33fc4818898386e537b1d55b4cef33c36b86772206f8659c0f", - "3fd0e7e608bd8b7974172a3b83501d0ce66cce7816e3d724458b8782f2a8f101", - "6c3a4457795602ada157fd33d5d31b7831039c63369df8d48aaf78d1f13297bb", - "355bf727078ba359c843ef0b4f6e46ed7b0c5c04468ac35279701896930e338e", - "ff982a035b6f336c40f4d46cdf98e77ba9ea639133002ac5103942516265d90f", - "398666447f9770aac828337448d86688acebad2643b6d354009d795280cbc03b", - "31b121d34673aff458bc5ff19be6a5937db9e8ed77e3b9dca6fadd0a44189caa", - "397d20ee2ae164f23f48d4b50fbd192d3283d0dc10cf333b81913550d799f947", - "4d6331fc77772ed5781ceb51b3b53cdf08f27329eac48e04e3775379469b41d1", - "c812e473716e14fa67089bc26457da1ef8e1e85ab220f3073236d6b7637d2ccf", - "61afa15185220ddfb558bbbdcf147fe8e3e4ccb56fe4b19c44ccfdd68a4f5e10", - "b5333af5c1c9fc334d79e0d1b750ffcff5f3dc60a61737891812ab2294a1a964", - "d774e54456aa6e3b0fbccf84747082c893bc10aa0bca4317254df4824de98ff5", - "06bc8fda202c1c06515e84e58990731ee022c273ab24dbac1a464fd6095cfa3b", - "3828cc19d9e6256adce28e6d207773c60e343a6cc278b65f26f9fa836b22d1d9", - "900c5a0e4ba10bb6b11ecf6afeb01c243f022d07da123e0a96fc69f4de794a57", - "2ad43b8d1a675462fc3f975c16a3e0d80c091dfb0e27c1f88c95d41f7e13fa42", - "54d71849a294f8abbc35b0c8dd06964ce53012160a9568c6af76ccf470d0e3eb", - "9a7475c050411731a168faec575ee362245dd4ba614dc1f08e38588ccc32dadd", - "181c76598b4643c2fd4f855ea7a3df7594680f3298373c39dbf5c37f8eeb5fa1", - "6d2bd4cf738b25717ca7fc49366e231eea10a2f43bc9b9c9d6fd0c82ffe98e9c", - "62f28365cf4a0df5ada77d8c95f746d8f02e7f6fbe5dbfa04f6a5be9b0525342", - "8ed89f608f56f726d78a3026b1b2e291cc687b2f2beb2b70a1439fa6ba0fb1e6", - "d4bf69253cda96796ff574939d43eff7ac6b4ca4bfb1e8f58e8ad6568fa1667e", - "23babf73cece755d322978d58c5501625b772fafd539b77c98a5b17067f984bb", - "029a3192d6e3a817113427c32b305d740f34a9ed8a0feb05bb9affad1bf81e4b", - "a79e26c89c9226aa864698303193691fe5d23294aeae4e9518868823646dbba7", - "5d91b40dd438da8200acd19e81e56131652990a2cd63ba527ea421fced411f50", - "5d7759d97582b4a3121be333e9780f947d283c8af2ea6d1b2860f27899b61f88", - "84c6c6ef077cc9354a3955e5d4ceb4f514e9de4ce266ec49467365e5c8808fe6", - "fd84100d28225b0801ecdb47604d40a0d0bac8619a746d4c7a2583e5be6eb951", - "0dcab8d3b21bb4934df3ce5ea5419f6caa5224a8abc945260bf456c7fac77fd2", - "a7d0087df748cfb7f47b3e2f04f90f958ee43e3020e3de75b7423e6b7c7167e7", - "34d859ce07898d51bc8d043e365be9fe697ebc400d7954066686d01bac05ff54", - "012ed1cc4cbf0e3fe43536bafa7127e1dec75a89d1b06f0c979725d988684e29", - "ff6498c2fa8bd2158c34d5988f63fe5d1aed239d9ad5fb6f7af1359d329d0cd2", - "380c2798f2b7384baeb48827bbb994c7628c6a2cd23211e30e28bef42d3036ba", - "3499d172a3aaab5695f6f831a37028a64d1b94290a5a63bd7ba93ad08413c00b", - "a7d4dfa0081a46ba6f4f82edea06e66b884d55b59c4e9a55b26b65e811057731", - "bd307c2505ffd9e830ff38764781f0df1642b3d4a65455ca61f8c37849bc8213", - "9b3beaa25a00ffbc777f8ece116c67037c6e8f3580562da7e4755c550e7a258f", - "fa8540d3a4bc6b8e5836399521d82228a3cbe98cf7d488199587a947ac12f4d9", - "a9c3f6243ef4869919fb229df5b819d17c45b479640ff67f8cfefdf9a3b2e523", - "df123415389c4a5e80486d5a288298475b54831dd87753718d5baeed1771dd0f", - "262680dae09c5612b35d9afd7aec543d54d20a28efcf164bc770d71bcc85c5ef", - "d414b5c94f973af132bc064427876dc20791000fd850d79bc9f8cfac5d45547a", - "8ee0815cde99a650b5bb247019a1f87ae7165b9e4f5764634bf5824547208c2e", - "6ae2f78d3a343a9dd94e498b198c9cc06467ebe73bd055e062b9e9d86d56e510", - "ce9482e85fed22b7ded6c138cf9b5108ec13ae90818a488a4cafd008970d030e", - "93cf6d705b85d2249d5a4ab21a9b512ad602405ba038cbf73699a719ea3a98d5", - "b076e49eba527e66fce59eeb478d0b1712b7816e90df3732f7818ca1152ae866", - "81f64ee70e7f39922e9b7a2f8dcb48ace932101909e8f5584d55b119c8c903ff", - "fb4f9aecb530e5985909aeceb14e644c7da7881d8a71f5ea0fea9688728a2a75", - "10f50ef243098e5f216c709c6e680765f83ebd6fa5159259d1a582079e686195", - "baa1d4f7ba1289b56134dd39039dda6c51c14cd2131940a36abc5ece6064527d", - "bd248c13d4c051a780c3c5697a0fb6fe182c2977ebbb821a2d6dace5d500f4c0", - "14c6e204a7406fa7352adf8a9b8c8fb04988b5ce3d981c050cbb504a64daf5b1", - "25556b4e5ede6c0fcdc7e523126d2468ec0003d1ff7e3b9d14a7eb5611f09206", - "173ba16e6ba52d0f266b4046e11cbdf2eb44e30f9e7fa89e1de6304964e2b2b9", - "76df0580362b7da6e2f2f051d8b9cf23c6b01e7cdee0a1322ef129d7afc759df", - "994c88147efcaf3ad1402208e8eebef60556efcba34c8c9128408e1efe35234a", - "bc52223fb89bf13a3e3c9d98daa139ca94ae1f2575a78ccf52667b55b300046e", - "44628d5d4053d453576512e4442bf9a2b0625d2dbceb2b2849e30df484caa14f", - "7f177347d3a626d7a3c82826f4fa2fdea8a4788deffc5b7746bb986a83158ab8", - "a26e7e8d9b21970824ca064336ae94c7d5a88ef298e38d34d8d444b8ed5828e4", - "afe19d4fc7ed4e2b71dd0dac23b6901220e81d00dc932921d74b23bf14b3a529", - "4c01888ecf76613e86d3b792685e3901d690575cbd7e4576c5fc24c2f531539c", - "9584d74811a7404f6e4cac125d886c5aa2ed88d5304cdd5cd5ea3920088d0cc4", - "6856fef97ae6d43b1e56f7ccf01587e9e8fb9e3490f6d3142c8487197f803f0e", - "9ec0aec3e6fb77b254e58684c363ff31877818b2a6707ad0bb931358bba3ea48", - "32e87c52647663d0e232c0ca74975f7abf7a773d2313a370ec0b6acc00c97553", - "3a52a8f17966013745df6090190d3d70a1a851831679a671291a999385679555", - "d208dfd46183e80d153a693351a4dd0daa7af822be7a9ef70505dfe84d81f18a", - "b83f1cd2c73123fcece9492fb8f8b9a46d7582bb3641c861319bfd3313bb86af", - "b39511d193644121b3995b92deda55dee4c41a8c5d02c0315ef46342c6369ffe", - "b9e35025ad638fa4c0a33e31441d4d3ff06184438b623bf8d3438fa4b5655667", - "3d7e6477017b3834b6f471c04f106b9e838d3a1936b2ee150a800d8ad410dc18", - "5c120adc5ebc11e3db55079b05ce7b48ddf2ac7b3c71e979eb5773dc285bd6b5", - "891fdd9ef65afec66a23de7a800d2fb65d21649ec454e765b608056bed8624ad", - "7505b4d6f1194edc358534f5c3e2f8c21ddf2bdc66b9fadf846571385d185d30", - "2dde8058354c57e033bb45a89be901a9a4382822af86eaa12119b3b397483b69", - "66b644e0d877f9bbcfb2d7e205e31eb445d966987a61266df17d462a8287fd85", - "7f0f3d9dcada88520805128272a23139acda1dcf4605123dcb86a1f87744cd8b", - "9e96b3b8a55a937f4fb12a94eceb6d95a1d80cd73827dbc269f3a57239efba63", - "78a4886814146fc8accf33ff0be12894be00bc20696cb155c2c548bc9c5bcd75", - "908d1b31bd175dfefa2b1629787ef524c0be9fe4d3255b7746270392bfe2a3c1", - "86856906abe06c7103c0db9d402c34fd3743ac8a596017d2200d526af8a31dbe", - "5f27a67c7476aaba641bdf4e3b80ec66db4642d2e35fce690265aca91b93ed4f", - "05f7a3913e7054bfeb68208da8a0a06ebd99a6214d99945dd7a2ed6e59207542", - "b06df73dd0a804d48e2efaf492af71fd42f1997f17d4b207354fe12323d5760d", - "f84a8ada0399732a5c0bce9bd96f40411cfa74641a80f4fc77cadca6094b60ab", - "f560dedca2ec8e74c82b1512c846f79501437411fb4db19568d3776d9d477faf", - "2d797915bca31f75021cd03be09c0f3ee26875add1e45e3c33d6c687f9b720bf", - "f1a5c6598e559cb05c842a7c75959b176b1f31ba02d304506c9e00d55e526d62", - "136282e629508c93eb321e6c3915f3ab166506ab5b4c6e6791ca90e361ddb590", - "2d4cedc33256cb73231782c9a9e05133ff494a5196022b56d08b128c9743bb29", - "1deeaf616cf75111e38c894440854a5e8b7646d5c338bfc981938f7f35149c77", - "56ed60577085f73b8e70cba43b30ff542ace39a443cc76af80263855283d8ec2", - "5757af4419bc6428b2dfe9db47ee5036328636f0547a52db47352681aa3adf42", - "0e49fd8251c6655e321799ef43fb7e50db9dfe01b6bbb37d2852b6d2ab0ce98e", - "5628f87808b983d7a1a265e9dd81acda8ffbbc8f743db1a2a27c59ca5372e993", - "85db8a635052d8997160c51758039c7d463a43f48868ae100182b619c4f6e730", - "7e474de3c398bf00d4146e6ecbb2ab7fc709aa76e0838834ec2dde62d69f9dc2", - "412010a12d64d39496d396aa64d7c2b2b7ee045ade4c5816fe79f37ee32263ef", - "de27f04323dc5f82b847910dcf6eb01c3e5641afc0a360c4f609f424a48a4dea", - "4dbe005bbe1c3e4e78114a7ba9755d08c1f42500f79e8166090ab1b7f1f3ee6f", - "e5c1e67e695d8cb2508af5751bd9ffb9c5809c96f7c6e51a117e75b4de1a033b", - "2901e520475e0667ae05fc864550d9a6490ed29e6631367467ae6d6dcd253c0e", - "21d59641cefec9a3df42654fadad51b2d95343c965c6abf061a4df6c032d4467", - "de1192339f06c1409c4cde6e801481b4e48339675d60b8d6ca2ccac25c3672b6", - "a5bf6a9f8bc29cdb53bb56dbf1ae210adef9f1339365b46c15e64e80bec8a15a", - "6314be1498c733512794589d686b16f94a6ee41d1abbe5df202eb4ae8618b8d3", - "2463ab5704cfb6f41bf2a0be5b333212166ed0bf87bab05d438df5fb1cf05788", - "1d4269805da90d04fc4c26a2b65d4dfe04e316bb744c7c4e2062998bd1265c52", - "c1c229f665ca7b260311c007d36d51a95c8893d3d4c3250d5ba6ed298e5ae8a4", - "8d90b7cbe45c513c27ac65ad9006518eeae9482fc5a2afcc4e683450f8ad4662", - "fca6b94cf59bd085a07f561ccbc0d6b785d8df9034cdcd0c57e73280ff354409", - "d5ab7b7e5ba483dcf157b68f6e87e1401ea3dd86bf0a27cd423b962ca86d0db5", - "43f2913af4aec3b46b7b80ba6412631f99b431571b85f8d67a86c38455b15850", - "30e51c8227904252471f86a928358c8e462ef04701bcec824501f925b0cfdc0c", - "4fed0b79dfd122a1bbe2a0375089e720f7e37b2677d713396447b66b665c4e98", - "83cb96bd7acf0d94f065e229efe5172446203eb41dda4c958c508a71fecd4bd4", - "1e5815e7fdd1d8f487ec566d12ae4c0b85d3da1f7d7fa99a8dce89e439c3b8e4", - "d6aba6e0312b23802c08b45d60780dcde9649d3cb8dfaba63661da88ed8959a3", - "fe53945e01a3075d798915a0a5484d1cb6cb233ddacb104c0bca95ff2595a371", - "f11a417870e33d2fad43f17302c66ccbdc277290d370ca1ba6539eefb9b4463c", - "ffd4e3580bec31aa3e898ad8dd17af359a8d13726525ad45f7b519cc8c4ea7f9", - "28664c470ea5243be259b2882041de1a84bd163a07bfc47bbf14ff8d65ae843d", - "d55765ae5294e12602f5fa58862e104dd75cea4d28d5c4b4c149652520f970ea", - "c7ecf0373ca7f67fef5a7068a082e3127eb180dd73d5539cefdbbd04b646e76f", - "5cd22da16e02d4a39122ff6e1288384e69e1d11dfe487414d6d5691e670da653", - "4b02867fb1f790378c1f6fb618500abd000a2e3259c7cd33fab602079ed26209", - "2b31c9eac99f134c8b3c68706c9421f348c3801f72bcb2653b55b55d74ff99df", - "d41670c7dae584b498fdcdb94ea2038e1a3da765745580a36b2cf0f3d3e24146", - "9464a921cd064fb93430848cce35dc35024088a27d69ea0cb567f75bd4e561e0", - "2b23e63d484e69578169b24d26e6d573cf546ea83bcfbde2700e1cbff71b1a48", - "44d1d22ba59b9236a59f3dced233c348117e2a92d15d9228a1345653fa2f2391", - "6cc5261f14c14409e9af72c8037af29c8d398c16d93eed093afcda5ed31b503d", - "1df634dc2a62a27d9a97a53801cf773c94955acec6aae6d8469f42baeef5e50d", - "71e39159af21927a7ecba4fad0dcadc8655ca4aa212c5b2a58b7ddef14c8d739", - "3a2c539142d0ab722473476e17a95c43e032ce342ab82db0067e3719fc8b6ff3", - "df1f27e229866ba1c4dc8e1b3ac6ec14f64535de66d33a975a62ec3f05fae834", - "dbb7682dfac4e00b0e4f5e6d3a5e628326e690d3aecf983f98ac61b9f266133a", - "e82551b00461a65c24342c4ecfa75650791c1fb620ee52e3cae377a605f287d0", - "55a6ad37601b8e37e6df873c2e75b9fe64bd548511d855f52a1671af62247664", - "af88f3acf74633ebbe5981777fc6f14bb0aca2b4f4ed7af86ecb17ac61e6958b", - "119a921377125a33c07ce377e950eb10af5355e2e31e1410825813c13ff7e5f5", - "d6f99923b843549e67f606822d170eb8d452604996069be3bd36f9d878ed7e82", - "597b4d502a2ff8e93a69cdb04ba41d66de193b4c5d04f36196582d726af0891d", - "3ca15270151628b5f62049515db11b007d371be6bb4cdb8ae05cd02a7e4f934a", - "7cae09514b6e0538514f290ea3cdf755c2557bfc812f3d26a2cd1c4fc7616fb4", - "6de4b8c69df05451cbc456839a6947a7b8c61bdf38ae28467cb5be39ffffc228", - "1f3044328354a37c3dff7de7704e5b7029aa7de07afe625a2995f21276f88daf", - "4b88e635aceab636cae4c047bfcd5ba7fb424db94ed9ed848821aaa6f52f9aa1", - "79b8852a8bf69a9a9775c48757fb431640d141ce263858e58ed14c2e9983a0c8", - "3fbc63fc3841c51cfae1590241f9e98236f075ee16cdb19117225ff3cd9daecc", - "04353efb989c97c8b42d58901c8b4952a53ba3a585aece4215c409601ef271b9", - "1f81bc7d30f60fc0fae8fbf98a2d8f9f4878be5b6d8d5375125ddb62409f5cc8", - "fad363e90faf727f7b8da77600e34216def7d7da65e99faf15cbf7078976e81b", - "fcd7885e51c3708532dc49ecf5a302f162af555d48d769436481fa2cbfc5d513", - "78dc6387b8183e52d17ad36487ac626ebe9cebe8bc4b9bb35258e9ce87532343", - "cb0e3a96fae25346e95ed3c7173d497c22760d2396e9e7c87b6a8cb965116416", - "05b48c24a7814ff11bb9797d665696fc21ba29698ab3b2fc63a7409dfb0d6e98", - "fb54ae762d00f01906385a2bb709a3b96e6672eae75167feefb64dea4b5d0ecd", - "9020748ebb8a2fe1443fb4296f638aab5c04b1314660a5a4f0cf29e6a26c7f77", - "98fc60e7796eb8a2ff7d2ea1eec65d8694dde2c1c4df69dc2cead77da4fa638b", - "4dbfc468efea271a747fbfbdc720fe1a51e99363b5d6555ed944bf6e0c91f4b9", - "10313dddd95543555054cdd3b2ec9574236a7f2c484f6853d331970213f7d7e2", - "ec804e82c8b38ca2a79432a31d1b37a6bd3d8e3101969a45e1bc34a77c37ef9a", - "4c23f3a655a07a7b821dd1e1869565d43bdf37fd96a7e23fe99189a38756eef8", - "9fdd57115e0a6b3f0c8a08bfddbcebbcf55e4e917181680704207ce790ce97a5", - "85c0b895ac390ac19ee1a7fa5859760e3c87f6ddf12a6a242f940c406cf40ef3", - "787b45a8617c562af1b27a785bd52b3839675b880a546eaa9744e6d6dc3cbd0f", - "7638ae00828ad25c54eedf42c3adb3d7e989887231eaf2a9ec03f2c715e90170", - "c6f6034701aad066f93f9b0a4220d5fd79a67ab437d774967be87f374302a5cf", - "1c6ca579a1576b70414c4f128d1a6ef22af46585f1b062ca8dd1d22583ae9d51", - "d372065c8b8995991a40df44bcd61f96da6e73006e702029484e4de507331ff3", - "f45a623b36ca4d915f6a0780b19a74f94b0376a01babf891d0fec84616c04e58", - "5f2ceeb1681c539e0ba1e09b7f942b3403c5afc4beccf7a12771ca735822bae1", - "3bc818532b8fb41b4fae841931abef392eadee13dcb2caaf58a934c89036b112", - "247ad16f9dcb8478f921d76c9e9561c8aeffadd18e3d3c48f884c230c7830a0a", - "6946c8dd91ae1c0e8d5919f3a14ba5fded99fff56a25bbeb8aeb9b12f5e882ed", - "a29016ccbced48f38f9a475c3c1d825bc0f70cc1bb8fb1878df0dccad1098f7e", - "7da261129b00e966bbe311fe8257f05645f89d72fd59f95feefd6d0a096968d3", - "5dd244efd010bb8c286224e125960a785499f2a7060a938a03eededdaad8c5d6", - "28e1d094e3ed60a72a61bc540f0ef65dc44c9373c78acd98dda6c7aaf3136240", - "1880dc9d254f97345c491745561fd8020912c6f9811bdf197780c93b8f03e296", - "8a23b850b4089a5d82a7ed037bbe1f53b3e2667edcf3927fc7bc9ef5cf2c545b", - "ed4b866c64316338aca01cbcd9f1763f0ddaa59475a678d0b4ff6dc55ea9f0c5", - "47d7ff73735fa3e47c3ef07092898be6959eb3e0b9169ea4d0fba005bab05f7b", - "db4ba1ac4174ae731e70d6c39503716b3f3b72db67c7101471b91254693ae772", - "15643119787bc94bbb29a8d852de60faeedba2167686ac778b4b9a9a62f9a9d7", - "ce182497074984bf8c24a5fad3bbca038090fd90dcd73527d76b4935e8c8e0a4", - "36ecbf6f09b421ea52c9eead0bee37c66ad45b9e284170e279a12f913e42bf50", - "fe60b7a64609567db6ec701286494f252c3edec18a56c9321129cefabbc02822", - "4bcf369faabf056ad0c0b93edf10a50916c7b3ed52669db8db652d70ecac213a", - "9d00ed8bec12c3bea50e235e606269f74503ca44cf7843974b4346ec9cdf8f68", - "51a86266b9327030554bf066d164531a0b11e43a03d3f6e0a25cf9b817e2005e", - "afb62038a1e6f6e06ad1a85f074372afa21af94e887b5aff068e9a2e54555f8d", - "59d56a34175b36c4ebc9b4c6da63b9bad294f2d99385e143879d841cb6ca2529", - "4f67894f4f33659c70ef3668121f1e816350857dfb98b5bf8169c748bc990b2f", - "8eae86311ddab1bd92762635493c35bba9a32a1b292b2ede5604f6ecdb38408e", - "94aa84ac1ff588d7bfddad6ef7dc0e494e6277bf8367c5208c26014e9de5f34a", - "e1301cb2102c4487b9c3b92e7edf6d3788cf4f8bdb900c3458498114dcd839ae", - "2a988cbf77c26b302af9a27b9f5cf50955dacbd09e98fd80a5e68de060595924", - "1cdf41d0e614c24e1127e6b39722f0d09ab8a5418d7ed132ba5af00c3f0cef4a", - "219922a9dc1568b1a46b560918fcfbf16aaa5d55f494e6085d5775f5cbd9b6a8", - "4a8e2f9581b09e51bd7b84cb609301c969db489a2d9c81976b2c8360a26096c9", - "5b03a9bd035d0b5edf45facd9b663c7957749b707487e68fa7c314a70ec4ae73", - "8fd2c82038c01ba67050cbb77143402d64159947ec99546ac10c76d643a236c3", - "83cbf792969e3c9fcf88e85833485a9a45cb47c168a7eea9cb01f43d107eb5f2", - "392f81d4fae14ba583a3bc0330f64ff62eabe8dc81b7d3160310786b0c7076e8", - "c16674e2777b9892c4d30973cb5a9d8cd0ae12ecf497726ac91a742a832a33da", - "187a3fe89bfb1ecb3673033fada8d3b37eba15b672ce52c243b32f12f1375823", - "63bccd62472dbddc13cb33bb7a7240b4b3708b2abde8716999e425ec78a96c8d", - "b1547d6b38b395ea906cad6f4b04416ce63ec0ab8ef4a81f137af4533068806a", - "3cdb4aecfe5d895d3a72b2f7f9b3905905032671df3dba69942813c19a3d5aff", - "7ad1e7aa10f0454c19e50796d3b57f418afcbf2bd1742a4814b78c995067463c", - "511c874b53bf147ad3a7801a53d24ac847029ee43bc9e9143c12b4f9d34be11c", - "60515ecdd720ec63855d0404ec4f2d2ddea6b1271e7a55ed75627d5ebc2799c5", - "6efaa8b02010aee122f30ba545221c64a383cbbc2c57d64bea5331774e6d9971", - "c555bdd0666c8402b690bc65becf2eb506f017ac6f48c9938757b18aaac6a74f", - "1259f14ee6ef7fcad2392bb5dfe6a979e94aaa36935cef8bae9f9815c7bd67ac", - "9cdbcead5126da4d31e41f1afe50571ac9fa24a2df332de7a81e70c57d2bc0e2", - "a20d8e9c0111841af454e5ae81b4a0f45e89e6189357315660377f9f0d5698b0", - "674e86598ec7656d7700bb984b5a47a07ee5750e097c78a91fdb7843c47fc9ac", - "2ac2d3c7ca61deb65497134e862da6c51b4212c48a95285dfaf0f2c3582622cd", - "025c3ddaca2a0e149947733f5d5befa949181dbd1551619486a7b601db5e9059", - "707eea9e7fd195473695e2cd08b95e18e2376c59f92a2a906d62c050b9f5594f", - "9ba0d14e1f8ab05ecb12670cb53554befd8bc0155efe231e363af3ab14714585", - "2508ec95716884674a3c0d02c5470bfb32aee24e3f7744e60b93dc5ea1f3ecd4", - "7fac9c4f0860ae74fc9f846b098200d95c1360d97d7d0c262a4e7eeadcf0bc3b", - "2c7156f76f956e342a2ddc81afba42aa851f381149d0b4c45cb0e42a7a9b4f6c", - "9e81c1c64de60d0af0635d313f8d50c8ceae20b2441c15146cb77476ba52e65e", - "750237a3215d7abaebc6bf901f50b5ed2acd370a0574492d429880ea889e9ae3", - "3eb4d09c1bd98a6274518e7c2165c859f45a93417c0f3ca9f76540fbcfe89a4b", - "a1697587661b9cba682c758d4cf3a3fce2e427b6e5b758fecebf1f5e9a26c924", - "e77a70126d8abeca61881a0c7418c97d281b6dabecec7ce4ea40020b40376e54", - "5d8c77e7a3df04e6485fb9ca6e0bfaa355f11d4ec620201bb4378e23eba43d0d", - "eb13293df42c89ff666ef309756ac885b8e8e996b3e8792bf2290d3b10aa1755", - "7ee1cfa806b0b3e2dc285ec8ca55857ab4b2d33a2b196e1dd6899d2f9e975cf6", - "aac6733f20102ca810a89089f2e1a95a1805cdeede0a0341f986c080359ad24c", - "c50a228f23d4eaf10079e48f19d3ccdd2ba6dbe0909695ba52a4bd38a920c34e", - "24ec216d1b9b934b296bbf544a9d0a16c2762aca902871102e9f070a48e33e8e", - "9d6894d61872763a9ad6bb37b79e0198fa4fd766721b5b52c6baa826a484b683", - "8b4a651cc8f71d4caffe20e5e9a8da4645702f9cf095c1ef6fdd6a4e5fe947de", - "e564c7547112e936ac936288c192c666a5531fa9efc56a5bb488b5382456ee87", - "af44c7921ba0adcfb47f3ea49805f54a8a38a223bd4ac5bbcf7ed4db8e35422c", - "5dbfda11f870a6743a1bebb100a6e6715385091c7f099913c24a7abfd47d61be", - "9abe782df04634c329f678661597a5e460d1da13da754258ad79f3e2cec89002", - "dd0f7b4e54a1cc2188bfd341f68f005f99153ac9360289af053009774948eba2", - "4c3fcd5a0ea2181f44d4b6cdc992dc10be1362c77820bde0040713dadd0cf26c", - "13da88e3bf2bf92e0ef769f94793268f29d17df3a151d536b80c7396aaf5c7ae", - "34bec0769126dc1b444e622bb269f81d2008f86429f9f0015bc7a0991dd9e3a7", - "a593f1ff0621e376f18e85db28f643035d4c2b71c5894ad1f69c4cfaa6aaebdc", - "f0b51550623cc5123c4f9b135dab207b50b4817d692d379f6dc7f71cd0c38881", - "da9e9e36fc5dff4d5e3967c18a9a3b1381ebffa792ae6c803bc5e6070d7f8e08", - "de9857b2083d41475e0a24d891fc8ee1ffd7b4bb9e7917e7a0386730d849afe2", - "6abd03eac2c6b554178e9ca1240a81bae3c4439c2f4449c54fcb416a9e03095c", - "45b96cf280ee9a50ae598bca9eefafe69ac095e339ffaae7c0f0d6bbdc81d9c5", - "5c287a58d35d767425978211c14e7dec71864f99f200cd7e6e018de57f49d1a0", - "604287a4bc374d1d00544b31d015910a2be3220daab80cee0997e71f3f68fab5", - "93a99b3971ec40ed4e23a41426201dd45d2860b24e8092e8560ac5fd303e5601", - "a9d9d50f46225e0a20fb230cc9948519902b088aed4371601c5532697f390e2d", - "76f125ad173078bb92fdad6fda37a0666882b5cf2b11d8434cf85de84389a745", - "a708ec8311d08c745bbfbeb698b17ab33871d23c36cde8f671e7a9da7cfb0fa6", - "5b3dfd0d60c486e068d5a9509fe4483e2f1ea1778f3f65e5f660d718bb8e94f2", - "fef3049a4603a72a02cb840c5f488877526940d26cdd9b165239d2bc5261bfdd", - "8534e6143385bec4f302be9da07ea790beaef919192d19078d630da5d58f3a79", - "76d0ae321483e208a76c9421b261cbe67a82f2a4dcd81ba7aa4da2efffeb4b03", - "794a8bb4c239323ab7f74801bff5a53a43fba20f21806bcb9ede1e18497c18b5", - "564c8dc33f9e165090dc73133a5f225d6eab72664cd43a72778b4c0161ca3cf0", - "b8eb946b758cbba8e7b6d783cf9b6fce20751b7a50eb10b4072d1bf6525b850a", - "511e2bd4aee10605264ab420dd8b1d9cbee9aa89481dc12a97b67320434c8f3f", - "fdaba92570707e5f31d38f0d674a42a2bf8bfc7f69286f768c9a2cd292568d90", - "d33054ab0a64e0954884e1810998a09f2ba307ea37e38cb2d53e80742a8180d0", - "cb5d0534df915270f7a5989256019ae6c42629efaa6db824d62fc762c488240f", - "97e42832f056999b0f85dc67a46ffdf8513a0f2872f31c5cc01e1b49a39d8641", - "5aad81ff5cc51cb29833c836ff6c07ba42ebd7645b90ee300f89835bfb542bdf", - "b8117feb17978e5a5cf13d4bda1475e2ba3a1ed2ad0cdbec43c01f12866f2949", - "f4a7999f33b61ba5c78493a27c473c122663048509235de8ad468ab52d23c1ee", - "3760608d9205fd044684ef8909df91db4b8dcfb5cb434490ad9294ac3b1f6cdc", - "c9df90e65077fc08072c8237777a6a4950f6c713ce4846ee91c5b0f7fabaf105", - "26850ded46afdbac125ac156e23ac23fe89fddc1f06a0a3e4d147f6c568840a6", - "f0a48d84328961c89c762e844611f199d50f8e1db182d0b36c93f63ae2d3cccb", - "2771473aa5d033a860150c8ab31d1f02381415148bdc12d2b8b2e6d6cdd788a5", - "d91a5f59aeef5558389a3c04ac36bbff74d7ae1f6c8c4e532ad0c18aeabd8781", - "0efe9ed79b624d9543bb7577b4a24568b813a84361c29fc870de1d37d88ae444", - "ad48c57202a623d843e6699b90efbc69311284eb1250c653aa368e8995181287", - "3175905313d19e476862381957bcb268dcdcd1a7f92653ddc0d51f76ec57cab3", - "9b0c9063fafbfd067d09ffca003fdc08e3cc2cc9900c8afe545f5eb3b1f3bfea", - "fa14ffb4406cb6f29fe1d0cbccdeee6b1eb84a90bba800b1728b029e64adf158", - "bb72670cdbd50a9e0d2b5d0f1b2c4e878aad2d03a8e418e9e3c04d1222a1e927", - "33f77508906bc2fe1d6183a63bc7e84806cfba3895d62239249b8206f448b68f", - "2a80e0382b7dc51b3b770a1d95691b2693dbb19226170be4ae2f8d1d2055abab", - "933c0d8cb3c2b5d5df2fc620f9fc2b7a4dca4033c49e30cb5d51dfde7e2f64c2", - "e707b14db6ca7d64abab6774665fdb8bfade252306e98f37293de0b45934d2e4", - "0df42f60d6012bd73a9bc74782b4852ef833f7bed3f4ed4a14c1dbf714dea9f3", - "4e34bb5ab8f7abd55646ae76e49a77e56d678828287c0acb16fa675b686b13e1", - "6c161b4d41d6111a1119a040b928c155ad8289a3ba39c82a2055e30c3bec993d", - "b6f70f1948fb88601cde1d63da608445c3dc1ae17031d2007489e46a19473008", - "6097d7d23d399165136191ff92d88fe218b732bcf08f4a83ea45df2bac5a3ae0", - "73eed7210e8b4700ac4fa61cfdfc74fecd69dba4a40e1dc7f7b73edf4a6bace6", - "ee9ba08b2b91930a6bfa2a4c86acd6c5d9fcc38a61fef57855b391eaa43868fa", - "c52d723327bef685430afcba9dcdd61f271afc12f613dca6b045ac46963934bd", - "13e18460206793844d65b5e669e20a319517f3574db60d0ff522262b29a9f6af", - "1404c42307a5fca0f04ba74401515e2fcd8bcb96fc5a0dca940b4471b3b1d955", - "eb0d7a49ee2ebee7bc91bb89daa3b1811c9e66f55faa51a4e85df503c9a0b638", - "aaaf6f95bd7ecf542dd553fa163c665d0bcf59d1ce58f5aa2ef65bd922870f66", - "725c25099a7fe7300d61e0c42d99efe93fa7726b70b7f7b432a55179b9c38927", - "a644a38f58b64446c09f3ccd4e7606ca24ddfb9708241b959a36e0297f9a4d73", - "a88d5e02adc7e9d6d49f12c433ea5ef4719467dfab0bc8c53d9f78d37da4c737", - "d0b968c6ae5d2848db8f7eb1b5e692c814e8219552b665acd08d5f46984a018e", - "28c9a7cde3d986122f5153d49a5ec997849048d0f7c305da933622b4d503f9f6", - "be819287472b910453abbc742854e9be7cf35add52a4e0811a36f2db4d621b0b", - "925eb1ab59945d084b045f2eecc0363aad1181e71f82c9dd3738a60f89ded901", - "9273b1af8563b0e5c7ecded3ef75af44fbd0daca24005596085bf6967793adf1", - "9376436aebd3b9fc662f4a5a32a109e77d5e3451e3370a6a5ad0b4116833739f", - "8f45c81d296af93767c433d42671e1fd47a4f0a2e2f8fb79c385381b900fb83e", - "cbab5ada334afde918a2c1464e1e14e02d35feeec874a6fd1ee038aa8207d853", - "74dbc824aaae1d227b426f291e6f8f3ba545c8e645713e1752c55b811bb3ea4b", - "62b3087531d3e6b36c2d0c2f5e0b872809d0a2640a5b176fafd68f245028bada", - "ee7177aee54c48af39be7f55f39906b554aa970a744bd5f04240da491586cf8c", - "a7ec3974f0fbd63adcdb53be68436b1600c2566fd7e4643863c6bfc514b0b947", - "05a82f05d8c7713415c7ee27f3f9df122ddb3d857821782c482c1e0bd798ae41", - "696448b38a7daf3826fc7be5dba31f9412bcfc09fd23f0286aee605ec4be5d18", - "96becb71f4fe632c1904295b80f9d2e722d0b3dce04ea8478d33a29cb22de133", - "ee0d672a7c39d7005995ec734720769b571c005de1de54dffad755a4095cb4e6", - "b56e9b6c0d86ba8693352a8d81a02219f179f774816476137c4c0cb96abf3243", - "fe82eafc80b61f70967a35e930390419a4dbad3b5a3a369a672e44f64546cd4e", - "c69ea19f3fee9fbe42c50f7d2c14b30d4a9e615eaf583d28668edf98b6ddd929", - "3caa059127039fb8e3b7d74962585bdc0ad5d1754322946f51b6f503a693a302", - "6179369bafb841c13f01354a3e8fc5bf3d0d4ab4aa56b04909fe0cf6cd418bd3", - "14de746b7b9165fbd42bf3c249c954c6957171cdc4254dad59a60f28674603ec", - "f5d2f3e4bfee184feb8ab147efe5664ee085aa26014c615a99cf7e06d07808ee", - "081542c1455fad38a0dae9f3f7ada9e2a61e3a4a024b9bb0b35d6cd24cc167f0", - "3c2b680460d2e4e815c9ee3ef6ce064e29d6b8a7fe9c4ab9dd80e8d9fc7cc2ce", - "686c2389ef7385108fa7f6e7336179189901115dd831f61da7c6e2217d7e9085", - "3af8d4c9a4b6a34224d6524b3b7db49751a0f9833827299fec701d122254fa1f", - "7bd28cff67ae2788c37f26e958c74428f349f56fb1d7cbce0b9b836e3421b91e", - "0f16c824930db1951973bb14bbb750eae4a6f83fdb089c16a8d068a50745a9ed", - "a3d0180bc8c24a8b742fe3f24bd9e4511c54881330735c013679222047d0ed64", - "ca496a760a76f5a38fd0e678fd3b2cb1ffd1c723443a5b8f61dc27edf9195836", - "24d304295acd8c86fb73b78291c8e8fee2ed7951d3e21c278a07f624c3bc8982", - "e5651e02a7599e9b65e365d965270a69a85b1c2d601a346245c8f3daff055abe", - "21a883391b7e3be7535e7802e01c21e81c8431d4cd800ff3ca4cbf7771c680a5", - "9e98e766cbae68c93965fd9dc67b83e42733b1ec242dd2ce7f65ee56936e69e5", - "d646b928237fcc2808bce4addf20457851f944cd7cf0303f4ad0531a6c7f17ab", - "6ca4359d6e96ae34659945f7046b6ad7ea491f8ed9982cc62bf90d15fafeee15", - "acb7f1ccde64ae33dad54aff107ef572d30bdb20eee46a955b81e2bddb61efa1", - "22eacf89057ee2cdc74c8a0f94314be251b8c230853debab30820551e7c1e8c2", - "339f546d87ed1525bc10ee23e533be69650ff2bacf8cf0a5caa33489c037d0e3", - "bc860b3c904475855f7ff1598edc8f5011d7271a2364febe81520ce08bc36398", - "23233aa1a0f3b2e9642c90b1df4cbbf65c4a0564277e9e269c230b5d536deff2", - "7261ff929b1f225aedcf830bc66c8c16a269cddcdd6a06f4b9f7489da6da4f07", - "abaae8cc262f8755d73b2cff695eaf9b948f7a826f9d454aadab0a51d5baa8e9", - "aa20fb06a10111d1a9a56342d992e8fce898029b48ee3701f3a1a5f2043bcee2", - "fc6af53da00cf03d0b5928d20c5cbc8c8d21a93220ebe1d286655708ac568da0", - "b6fec7f57f3181d7b6783ed4216b02258cd4934a3deb3534846988b7ccefef0b", - "0fd44b7a65109f63dd28e67eae5eb9cd134f1081b0275689a0cf380fe3c6b237", - "7880a565e4f3dcb650632496d2f99dd80ce2d6c2bbe81d9c3c6c664bdcee05b3", - "bb837b5676c1bce70b09411d5ca92af52f2018cf0770059ba4c2867a3cf063f5", - "ba14a9e25b5d396b22c4dc5deb975892314026205864594c0b6a666c3f9bf960", - "8acd641740e70d6e787e86983e2d19ad911d555f09adacfc9be84137642bda1e", - "928e11ed0f0516a58648bc4218f95778fd4cb17177f22534980e99e73ca0167c", - "30f8158b41e6fbb675771b32fe6ae49a7d8654ed1df25de7a4290a21f103b254", - "ec1b77ddda3be6a1bd4e5090e13382a2c2b2e70fc7602d1a014928958f8d3a68", - "6386da21bae996e9ac9b6972cc6262242afc036248ed1c2960cb6eccb0e1cf59", - "cee7b1f656c2e04fbbd20852d6dbaf40ce60f0692958d8d956d2245b036f05c8", - "3b83951776c943c2e47c42caa69ef1cc3495e2577d70335eaa8b2a897a5f64b1", - "7e4b0ed6780841ab1bd248a634520fb41bcfc6d032b4b3904277a023e7a46623", - "d528afd007a5d7033812627831c7531dac70c43573ae4f11b35758d7a0875e5f", - "4113cdf4617498199c917cfe8231286c1347691bbe072ca7b6b176017db9e914", - "8438ddeb5877a6af878c05cc9e34dbc5648b89f0dc72dd1de8096c9243af006b", - "006ead5e2ad428b722189547e32f6c62b05ee86d674011c19dd90a15d8c88ccb", - "53873ae4879d25bec63fba1dbb823ef17c838e283ffbfa69ba3d06d653c1f716", - "60f2fe78978a4fb6538859842877f1420b86186e61135a7316bb2628e65376da", - "eee4829689cbccd74cb984e61f850e3dc1b64419c3af06d507f4afeea8fb7139", - "0288d5dd0e2ef7937ce66421ad2f5b9d217d254cf7eb387ed1fb612f0cef44d4", - "3904caa9a4f2e9f1b262eccb4d399c8b1283f28aa9cb367f6d7cbcafc4955709", - "99db0cdc26a1f7fefd3482bfb86a4e6c41414807a95a49ca40607b2e1a3991c0", - "bdd06cbd3a98156eafb3ab363635c4e24b5d7051c4f3922daab3af5caaf419cd", - "16fbe2670d623ce184866d8a7babffa7c06702bf1c8722ef622df3a5a72d70e3", - "b998c8f72dac4a7184e57f1afe3d02fbc1df5899b6e2a4d1a58599a75eb737dd", - "2aa06bab4bd8e803583c5efa6d4d739821e5b30be7b1b2a52da4690d99983174", - "72cb52deaa4fe35578b1ccc281d40a845642b1e9c8feb2a3fe5a1ae542824fd2", - "560737ddc8a13d5cac469a3a59a0ce6efa2db8f66efa90f1041311a0a1931a13", - "17e12a1e8f04988cb55a02e7f58097e62786d42ff59f45137d069db897032c3d", - "ca5df6cda07e47a81c9190f0b5792b90b1069ce0e64b3aeae3823f193f6a46e4", - "2ae87a155977c13ca25987d32525286214e6df00943f679d6f27eefcc5eee943", - "016b37e76cfe30c91157a756fa98f14686438afaaef5b6561b49a3ed82a12bb2", - "12175439ba548e7e458228aaecd74e1f3743b114b13287f8528f461876041992", - "b2a440ba68dd1c30e3dcfdd64470ab60c810784069a26ac664c4f71eae36c5d6", - "bbfaba52ade5403adb43aea253cbd35c2faff2c8aba046b000bacdfb7d9e0bd5", - "89a0b5b70ae97ddcfdad854fde33c78e1657b028dc75c8feaef5e3c115f7b136", - "db014ea54a4aab6fe93436cab50016437aa22fbdb39cc96a06adf8d5622091fe", - "b005fcbe4f82b9d707d696fad5febb01888684c0b3bcacf33ea242bf96fff250", - "ac5066a73b940dba8bd5faf425a16db553a29e5ea538fcbb394bec87ae052723", - "299987da901e1f604b0a2f75929ea348a6fbf0cd3059143ebb953e60668f08be", - "2d8538d3c7f06b69f71dcf47f46171736db4dbb3b93b270b7a606e5efd846e52", - "05769feff2c2159e9783339a428092edb3b70fe9b1cca03242660f1a0295b9f7", - "eb9a1afe3c16e9c99fbf7559ee043db11fdcd28d9375ea8c66e0ab8febbba10d", - "3ad281b207f2991a4d0e693f64f4f645cbdffb33d65ccd52c470d2f1b921696a", - "fca1eba0ff3c039cd168ce9f73210f65fc86a772929d00347379f5fff4bdd682", - "d746de162edff47ec679d1141a7b8ae19b55990fd249bee42622bb796a96f164", - "02f0768742270a211e6d90595e32fa6a84ec9a5c10c45e38f28e17f4d1ac6145", - "a628d47b4b233ebb20f5507bd486c17fd301a11279ed55b112bea5f34cc8934b", - "80c9c1a1eb6b32f066e2605f326ddb066ad82a748f4fce8af1747931a9ca01f7", - "1dd32109dd98ef4efad7ff46489adf237c2457177f8a84d0876d29541d0e937b", - "dd0e4f76c8aaf9aa8f5cdf81fcf8930dff1ea301c1d3bfe5719a545874f6595f", - "2b4b2bbf04359ee5a6786ace1ec8ef9f0f9f3138be8b59c73b2d26dae9c1b384", - "9f99445efaaaa531e133e94ee54082b02474f4e017435cf50ee5e6a0f9b7b004", - "e54f9b15c4881346a59d7731be69bbd9a5e1f40a23bae0acfea99a8bd80ff7a2", - "b281abde6f8cae1aec1892a2d8923a2919954370c3cfe1fb6742b49aa1dd9402", - "29a120584529a2591b89f88d977e4925cae8c15cc8f795a5e17d3efa939417b5", - "5afab7d8fdc2f43fc7e7cc9fb7a1dd0d5d657d65897b0325a1899fde3f1a7467", - "f77269434f7adc50d1bfebc86f37c86cab030f043024e66e13601a43369272c5", - "d012b7fb991e2983d109795732d8d8ed6186597be35bbfe924af6970acc27b55", - "31caf433f86f64d64cc285c365348567f9deeebaf2dd13255ef7f0a51618bc79", - "ffc1f79e2fcc526f9e0e830086e92d53b65e16dde4627275b2cbd36cd729aff2", - "26cf9ff80299c5c54350a10a0e97d8dd1afd92de16a70c62e86cd4394756511c", - "f56c72cee4c863c3b2f3ec19b289831bb0de2921826e8c02090423b4a196defb", - "597fb0f6d51741f86a59129cebabe823c022a2213f9bbc596b74e348ae28cee1", - "3e99eb8e46c3bcdc17370ab147697104f7421e5110092298b70437ab51f016f5", - "59b7a95c2b5f0673e48874c29f04c0ff31d81bbe6bce17299ece1b602e479bb9", - "34535feb950c3c92d668a32de3e0cf245e148ebc07b53538ec5c9b110215fc11", - "1f34b701cc5457051408546e1a77aa139430cb641ebc90203d8e2f409a5aa3b3", - "0068cd7a364b6fdb1aa5cf02c211ff9528c7d97213d0d48f5f7987e70771f1c7", - "a65536e08a17b0778f0a12573010633927a8418adf0815cfda62dac9b3040c55", - "1bea20167cf4b9bc2786442d1e0b943fe2d7ffbd849fa58c7a7ca0c410a551d2", - "0064eaa854f1f8041ae6fb307240d38afa04f3b8f7179f19e0e37e7a8fb119d7", - "48f33bf103d74cee22f5b52d3bba84e5d827a0f2b81ee376a558200499f9003d", - "20a22a008d16de858c043d1146ebdd53a3c55a4c3850ef23e42c11ca30d97c43", - "c903f4b77876ac4e08264e59550239639b6fe7bcbc89abce17d0a2e946cf2a95", - "7f575c4907aa7aeae1c23b2da286e28ce03e02908d3cbf27d4544317fd6930ed", - "28fbbbf3ccd69d2e49580f73e29312a5cde8243414c8913dd1e87b47f515c989", - "db15411adfb950a976f2e62c840ca52398b79a3fd03a02d586a3978a6c1708c9", - "0994344f1517273b9561156830bce09ee93ec231f841dabd0358c2a49c47b0ea", - "56158fab24eefbd45d540fd72025278eb6f4a26512123622e5d6ce4c2a9e88f9", - "c83f6c3c67fcf0d6f41d084c879b4cb4840e965eecbca50849c101b0fa652d96", - "b841ce62443a4e3b877ce8b35e204f775c13ecd178caa0bc2264c6fdec4e68f0", - "41340705d2282a6853d7adc16185dcc664a418a912f82da83802397ad9d6fbf5", - "1e4393d8bf0ce7397b2037e2e8d8f56773020496badf5dcf7e3041c7f943e5e8", - "b21d0ae6bfe5306d1831558c1984b33bd3dd1d4b009b251512a82dbcdc04e426", - "741e64e7926b1878053229c933849dc5e419ee45834e3e2aac93c92081406a03", - "66be0935bffcde493538545f72b7bfca6455318c00e468a5fc04f708d59b5804", - "d15dd3bbb8b2ed71434fd70bbb321d702bfe89affc59effd8360050d23ebd293", - "a0049ebbdf0d29e9932defe27d4e829afd97770ec227f1b84f5d545164931267", - "94290fa00fddafd4e15d916fb87911379f820671b31f064d3673077ab334ca00", - "24faecc6ddfa095d9d6c0ba3d79256913acfe30b53884f923b07c186b336bcfa", - "be4c170a572a49afaf9a3ab1721b505d0744b6412f3ff88ab911b1fe475b7f7d", - "716ebb337060b5bea3473026902d1d31bfb7ad26d115f479de401bb741c6e209", - "f02d7d97c9782672a5b5f96bf5433bc239575f76a857085f66e3d3dc4957cb4a", - "6be8f2b4ce4642f568bf0d9e313dc206119c015f9925da99c7b3e22d568b8878", - "79cb8391d7c5953de099c56b496e05295ee4ec980d453d09f8c6a35fc8c05566", - "1a0d3daee5231f93dfb14317c37a504fbab4fd48ffaf9e4caa15f600fd448a2a", - "72a5bb82833374cc8527b13fa6b8f3b052ceb3e4ee0d33b9dc53f9ac7f5829c6", - "25f6de091bfea3ddcfe326f88633500810cd48e81c78fb9c956289398320ecf7", - "6bd290e9a12cc8f0daf2a5b4f2f15a2038b65fc5a28cb869dc9587942107b7d1", - "6c4073adef54509ddac50ac2cd997a68c435135db7c67c8b3b6f106bafbb7944", - "dc41851c4948fcf1b36e4077ebd6b2ac29ee993688f7efdda7135684d93dc22c", - "890baa9924d74b96242149d087b5d0569a52326517c7178b35e340e25f8ccbd6", - "e719f49af9384e292dbf1b771dcea7e32028d0937ec55e98ea1e498cff938d47", - "58df10f76a1db5cbbffe49ddba77d10b0e71bb99a912868511678589cb1821d3", - "b695ed918f5e0a279232e554ae606fd864679c640ee415a0d36b9e878211b2e5", - "93bbd77272c0539234102d91124acf1a84d8080a7a32e46cff52724377466143", - "f09d2704259a4bd4edc806900b7ea47a02068a1f6a12a0410097ada60dcc5511", - "2d524d7677b100ce66018de78d71034e686752fb1815cfe3232c169b42560a05", - "eb60558c1fff98bbecf371c2198420386adcd6b74700a490506b5121b529a385", - "05f91ba7b1e03717bc2111da0780b8544ef1013058cbc13c20cfea7cbefedd1c", - "1155a9cca81170cbb065baf18095997404135f1f573c2b6ef69dfbd472ad4b1f", - "15e46b1819b6ae64f3c0f32fef3f1ef573218575bf03a04b810f7d03706d7283", - "79e280070b626b7e18dcfebda12ca9256ba3da980e47e09bcf09581e329a2806", - "3f83a6db490eb173de9c55fc43c88f22b4bb895d9ca4083ad4009a74819cf37d", - "2232b92d7e08ab29c70f3df00f80102164e75e656019ae487b3d02a6f9a13b07", - "f3c34ab9aa14b9254f96afa226fa98154208e5ebe23616e44693e59f3489f1b8", - "bd4c23f5da6a746b4fd8454d02b7c175004cc73171dbbf145cbf2ee0f646b3a2", - "5609d8f6b09595ea8bb03dedd414b71e9889c19f017b422b6ba27f5188268c6d", - "3c156e8f839f4223526d8646542fce63da59396a2c8d16ef059fff9794e1dbf8", - "4ac507247c846fe6bb49d1b12eb7a94cb7f3187d9b8a4b87d6972dc2a692191f", - "3b0fa857c926506dad7b494ffb1ef9c21bc960428e61314539563d7aa061ec7a", - "030092b66ac27f6bce938044d23edbabc05aed0b89744c4d5a1125eeb91a241e", - "ce5795ba0941240fdaefeab6f4e1450b725da5fc2ab878c635dc9605c32a4a8f", - "989f34f7831a7499059d93b1b5bb978b4c8165e7316c0d53f5d33c6317695316", - "6f779f768647b79a2016d8a83620834a5248e28830f9a3275251ceec389ccb96", - "d4ccd8b8fed05fb4d3756e30676f3dc74b8882d666174ad641264514fa087b3b", - "b526ff1fe9737c974f5c7b41dc6cb97cc86fab0fb643d4d643431771ff75db1b", - "2b9f126343d9327f8d79edd74b8a8f65fa6035aea1035bfbf33e28e992b46e3c", - "8ca0b02b65e3e3f4cbd123dbb2e87c1f333ca2da270023dbfb429240571a6567", - "5d17aea25310cf54366957f95cc53881e0d77321169b2158529e59c9fd99a276", - "37f207b93520b439c76f4c0cff6598015762897426cd27aea03beaac3029d1f3", - "fc6b6b59a58ac944bf32561d2cca83557b5ebad0cc8d50475feecce960539bdf", - "b633783ac28e5f38527d2b5c9127e0775c4d665976b251b77b645ca7c67c44ea", - "61548bf784da288bae59511c654d906cdb91e49dc4d7e060bddd788db53191fc", - "5ea20f78cceb72c7e6ab55d52fdf7ba642feac6602ece6a7b2fff842f9ef8c57", - "df488bacc49fd5a3df007794e40826d0815ee517e298ded0e54f42efdeaf03ef", - "0b985d8f9669dfeea315a46ee19c3d8811485e391d827280535e76ed7a76327f", - "1d8f901775318d57a4122a14e9b1e5bf14924314ed1f73ac6170030cfc574b22", - "1d81a5358a7b83a85727367a90e5d3e4a6c78bb521a2bd982e845693669d89c3", - "4dd5f45efdf3b994675ccd7938ade1fe55a6fd6ded29d68251aa058a3c10a099", - "e004cd4833d47319abd725734570374db528a09dd998bf184d89852f8922f5a8", - "346c2986108014ede8f2be7c5e42a1a118aff645fb502b5c6dc063df2b4b5959", - "36b18facb901fd7aba3ad97e51d65cb652e222455c088d8dd449f3be77fa8163", - "bd6fe452f989f9edd6fc01cd45d652fc87f6666e457dc8a2c214edb0b1f9aa2e", - "f48c0c7cee6b39b038115f0a36f01ff1c7c6037b48775ec9ad1e7e8c8b81f5cf", - "782c17b0ce2170572086d94265b3c654b85b9a2f5652ac7329c9297d986e53e9", - "798fb649131e18d6fbebe02232516c8c9e46a464e8e6e36362780022963eb0e6", - "962012e3e295306eddd9c69b217e82f398ecb4c0b7f77ccd983a01b7d2f1ac20", - "7fd1daf6f2cd425a7055d32d327fdd8ead556790da22c1dca3ea5fd31331ee86", - "87fbe26be6347f81edffdadccc0bb5e259511dae2541df0b6a9ae56365319aa1", - "c2244bb28d77d01451adc0ee9cdf634dea6e321aee8600fbc4ad9fe99b7f30f0", - "25683b1b6afba008fe7873cff2fc897a233ba9d23b1cd947be0501a9cb827971", - "a566c875656349f136de366941f71634ad477cafaa2f9ec6fa91186127de358e", - "9c0b508357d94a091f92e7314c436244a2fe747de833e4faa66963254f31d08e", - "086b7707e596b2acf34d095eac9b683689d6df2ce0e1d8cb10f5f179f65b60dc", - "f64c6c9f39ea7f34fcf0e146652d405913a18f337f76f6a2a8783df211f3d422", - "1478d856a4cde72a04d2699a53b514d8d1a451fceb14aba1479d474037e2e257", - "37079fe35cdc8dfb2fb4b2116ffc8a158dd3ebfc9918239064787b7430edd9cc", - "9de3c9d227793718a3c6a953922b6aaaa5443c41b6026e1881e6e359e1e01afd", - "60edd987eab74c849ac7f8747097b8bb320319fa1821a06ddf33d09147958b81", - "4e35ebe9ab8ce0e45539f72b7e84e93547a43e418933b2a37868f770e34ee3b1", - "d903f51e13727b4ac15dea7205561d61a0795a26c37bcf32911a1e94f5eccb9f", - "a1f8b892db56ad064ee04f94b8e4df175456feb2887ff9bccd6ee8c53432b36a", - "41823d8bcd25af7d706f9db0622117240e6d691c0d933059178289314eecd21d", - "8b8aad218ac3de00cbca4241994dbb23bc322032f0f9c59a91cf630eae8243f9", - "9b956f2e8697517c9aa3bddf96fd64c74ecd339fa5fe4b8eb2b7f9c0ea34eabd", - "c25556b95d42449bbf923a50126c31873299524e84c4c62da1a7e4b3918ebc94", - "4593bac551ef0dce138d6703d74617d4da82de4c85788a4812548593450882b8", - "a6188ab837b75b28834c73b93a879a3654193770ba99f68a3b7d0603b156533e", - "a4dfc5b9a1e9e1911469cee153528c11e263162887b9e96a0022ba1d192cfb7d", - "d6f949910c5bf41f29d18aae3743753c43d4726b3cafebcc1085f938e420ddf0", - "e21c8717f563121eb3857492a2edb7ec21e33e63ba66469cd0adf1e79909518d", - "5e914b9ca7ca13483413a31a4ec390235fad9a995e69b0d5be8828b89c2b7219", - "4f9700efb64bbd46d76c22fab358c1967d30145af640de12d5732f4ebede53a1", - "012a01258c3ec83d3982576d2428098331f144afb85da3b2e2e8e43210234d6a", - "d29149e3fb0cfe6f0f53bef77d217fe805db11f2561f1e1e204f26d906b72741", - "b1b0fad68607a83c8091bfd1dfd5daa902480ea0e6632851a04e013d87253109", - "bdd79ba04a31b0443f07ae8fcd9a3c85b3e4e6ba73120afaa9b39826e5df1e28", - "c78c13b14ee48ce549498f1c8efbe8fa12222236e5f2bfcb1c216bc65eb15cf6", - "cdc122d8f125cd811992cb2caab741ca13878f1bc21e1fa4fbb78dbee2a27410", - "1c6f616049aa5d49240bf698a3af963c160a3dd7215f7a1f5378ad8820040490", - "67ad138970e745dc2e9727bb8ba4ffc44da25f1cb45ffb3a542317fee86cff6b", - "2e62c855b4357206c487d041290d89f25af5629ccc55e66dd1eea3f27e2954a0", - "27b99c020c68f099b824d4dafff385191f94fbca091aeeacdda76c963bc9e603", - "9ce469cd5a1ab7b7910e8fa29da65cdfb8a6b546cccd4fd31d549d7c21bb8908", - "8e8d283dcf24c43a565e79e5cf4705577b026760e4284bbc0260e09d0436a831", - "bfd9440fa97814c2bebb4afdc285895f56c44098b49c3ed510e02ae4dcd6cf34", - "ef9b717da5b7702616ea7d23bf92eb3dd5932df70844f48a445e6d713351edc6", - "d1f20477298f2719d20982d920c2abd5bce3b74db201b882adbfb0dd33ea5386", - "39a63c6e65df694179a4a22486f6feb1ecb89e309348fd29496e0e4780568f80", - "218213bbfd6abd8cee49967a3e57ea5b0080134adcf5f01a1d16644f25bc8385", - "3fc45798adfe9f880ad8aad64f022f60d7e4bbf484f997af468be37d0782f74f", - "6fa5e63755b94e1d7d5f74b7676beceb602bd6bc5e670487e872b2483986c062", - "6d9e59571a127b3f6bb9256c2cbf12feae2b79ff14fc0d4594dde715ab50f2c6", - "1e8e3c88bf6027e35ae66a05110a6cf0d2a56f6afe2c6ef5e7a01f1540d9c4ab", - "22f5f223583149d3ab5e6d24b566e97a3a1f170ef1a0f44cd4afae1ec68bc859", - "272b59d824d78de4223f5955c91a547fbcb24598213f05cac42dc9ae5ad1731e", - "23fff93775bc5b44583203ba7e30e38db4045fde8025bfda2171ee3bcfadb40e", - "3edf624c5be04586281f088d5cbc912e45989bb0eb6e34589fb35b8b58bcf4d6", - "123bed5acb412973f5ded07b0317be549fc2df472c10117fffd3a4ae55b5b09d", - "677fca70b4b907b584727a9070325ec6325377ba71366a79f24474f0c3d54f54", - "f56eaf69e03705530b610f69fe0a38c5110e2459aefe659d310a6b2f5461ba2c", - "c1ceacf165c897b0a99d3baed62476b4d09a153a158975b51187bb7a7c1d8ae8", - "7caf7f8f5d9965845f8daba4448e6fef9124756eade94bba4292a384c97da666", - "6e3f2933f0f0029de5d129217380281bdea1f093e565a2345ca98a2219b4f871", - "e92c8b393151c8c05f89dbe5570d06f7b33cac5c16df4af43db96eefcb1530d7", - "1edf229472a810197b2cabfd01f065de643450d7ff1460045ca2f3c186e397d3", - "506b2914c57e5aa7d5ae04929979dc12c2bfa563905a68006ba83e659e07dae8", - "498ee9f117942010dddc23221d7c857dc90aa920d2738d45b0668335e929b994", - "bd6ae10ed6fdf9eb18ec75e6ef5f066a94d42511f64ee14d5ffcbc1e2d5ba398", - "3a35089cd438b456ec6a4745bd62305358c33a63fdb45ba87ebbad1bd3535413", - "ff93d22e3ebba4ba209b9fe4cdd85d83bd0bdda7a04a21e833cb076608331c9c", - "3df882c2da7aa1cf1986a1f221cb791ebd5cd4ec288ce22b1efac9ec2d6a70c7", - "01defbf62c50c590cd3959d43c94945f1f615ccad8e39dca5bdf16fe400d6d10", - "cb3cfeeef54504da32f1d70e97a430fed611580df19df6c2654c27953ab6bf94", - "f06f0df1c248d7b32c06f1f18678c2ed7377131a702594fca799d9468c674ec7", - "3b7df64cb4e136f55e76e25d7a6890f851c5d3122a1284f495b2581714748b26", - "cac3842ef409fc1d3ba81e5920e0210e4682d0b52f422ce993bcb3eafcbdcba1", - "d748ff794635b8ab476e19c46021d3eea1815de0fad99e06be2187db5935f09e", - "d42c70fa07b4f51a43968df7a5a0bcbdad8c73bf1f841380bea9a1076b3748aa", - "174621f1c6fb820efa6ba16919629525f1e1d2a0b88d790d9360f73034f03967", - "4a77af72129f37e16bd76a48cc31fc2085ba50155672ac743c5749df13c8b671", - "63d2a6f6c279f24c3a67e22dc61bd3ca52d46ef7f45b608224d5a4ea7dcd1362", - "218f76425a1207410a42714b7d13a2115bae443a821c26136e628951b1acc13c", - "8448899fbf1967359869584022b55508d5e123c57d2729b8e49e0d0475330aee", - "255d90752b2d44f3229dff20eb460ed3270369b299d00376857afda7a01314f4", - "80255ebe6236d101377c799dccb87c67aec1aad7f882b52b5390012200755b8f", - "8b8e21693f93e250a1070b09a6dce62d41b9647a9f6aaf3234c0877f0ae29500", - "fe7386e9a8f4cbe9f87012ea784fcf6d7c451e1477bbd1e004dd43bbaa5e448d", - "e36f39f3e4e21f3dfbb876ac557cf1e49e06debdc938347bb10e68bfdbe963e4", - "c9d670f93cad7b40a92462dbd1b89aab072b4d831df886dc9ba1ab8b2ecd5c60", - "763ad42411a5449249832a2f8c303206c12cca593f40bf2717398dfe4f27e33a", - "78ee42871280c2beaf6089b0c527636e4cbd485b73a2468398e94e95a6227739", - "cea7f0dd9f70c5ff8deff09e00d0840a6ecdb74a835919e6cc84bdada78731c0", - "6f2501102f4c97ee8dded215e3c5cd2c3a175ef6b7cd7da8915f1a21c330bae3", - "8ef7d22e3db4c43f2ff80eb24399046e5bf273f3efd74c61f49f91af1a940ff9", - "30d3bbd75fd28c81a10767e23aa378cade3dfa84e307b674962a2ca55c212000", - "bb8ed9020ceb7bb37a0a4f3bf7f1857d4bcea3552e1f43ad1d70aadfb6030f67", - "8821c822915407c39ad61f5f17f94c9e8f2b1be336b51b29828afc16e28b1f8f", - "2318659654536842197097c9469c510561a0baabe2e94965d32729ef622d642f", - "6f691adef882e93a9425599ce5402b215742cefaef1acf72c7ba5de75eff3b2d", - "2650a5503168e9354c81afb1489786876e8e76a632bb4fe82894958b4114b01a", - "ab2f1ddcd9073cea5ed38f1a604ebf9f7b70b63eb81f5ec5ba504f9bbd142127", - "b494612497c199cf976a017be0b9e52ad32d7aa80844341c96e8919ff44263fe", - "bbed076623c92884741a77b0410e868b069076112cccbc0264fe9231bd7056a9", - "8f8057ba1451caa286d04b400d71321df283b9d9127fc55595b380cea9d37584", - "dd77daddcd0e1a52a9dac6336259f1bf6288295c930d9004bd92f03f06673e6f", - "b570affc83f6d3eedadef9f75cc94e808fef0fb77ae65af6f80eb8f5f8cae269", - "cecad9fc4da6d0ba12984c2f2b8e02a6779842319fdae38f0ef0df493c76f3ba", - "4a0ffce73263444d8e7ec22106bbd95c06404aa315f81b56a58b36d24ed88c3d", - "0bc8cc78d70e73b1e15b4734bcafdf148d2b9ff3c0ed058cba9dd161c099371d", - "cb51033dc2823849a938776977160a087b71aa1e804cc7f802ac1f2920e425a3", - "5d41af032f585e7fd6cef397f38cbe8b4c67d7131dc4d48679c819342dab951c", - "f95d19898c96d09fed2d34cf162acfca400a90d51e27f210b598bef69b4040da", - "f2230fc37be172c9a6d670cd01160146afd7d551d29a6bc1f5b4209ec73b19de", - "3f54a8e2136c2218a94b42b7aee4b50536c471f53db769d3da58cf798c1889ec", - "7696beaed0a14cfbb260dab2c5fb6a6ebe1de9f251a00d60ac8bbc51d1d8a36f", - "3e5e0ee75f3067d113b0658ae8b844484fd7679c8f5b2b06b122763162b813a9", - "6453677ad6122d0aa54091b17b4a60746a65f3583f2a027dcd159777be6bdc3c", - "1ab332962dfbdf7745eb2d16ab71bf26921e5bacfcd6ada91c85cf6b0b749d21", - "ac65ba96ff8612acfd5a1c9a933df6a4294d06010d0e221d5c6dad936de3fb05", - "a40fe4255ad3d45ff1cdcda34008688135c85c423c8cb5fcdafcd4a885a49d96", - "7231fa7f6bd34227af6b8fc666ceab3a8c4c178169b8d8a73527ab3775b964f2", - "d89b054e8b97aff4550fb46b093cb2fd6cad7ee0eea5d531d1c57695e03e4d76", - "2b97f73373d44a87a80908ef1f777783ee37cb2bf9d2a0479fedbb82a24d1877", - "0edc401cb0fe1369416eb4f192ae540ee54e058826cbc314e266129094cee6c8", - "9547b049cf22d4853dc87cc8b078cf1ca15e2fe3aa94fb05658ee34e4572bdb5", - "925643f1065d3603ca1ff2ec66d6d143f67ab7dfbe0e1438d550e07128172e01", - "6aba5b0959aeb543419855d5fb73c798da05846237c25388176b87601d037dc9", - "12aa7f95d3daebd0bb2210296f1eb15859b332bcf22f4b43b93f2038790d2d08", - "c150736b57cd7c2a72e07bdff2dd2abed2e885270daef53c207940735cb837bb", - "42c3dfefff626b9bac69763d321059d81053428ebfe290faf20cee9f45188e62", - "056322429759738708950bf670d158ed36e7b917825f68bbb0763ee06d629817", - "2be300937b0130f7e3d731f3c5fdca9b9a7af08a40bea2f38930afe2a2660680", - "b4a13500ceea94e67a5f13b656246ad59c4f90cbb9daa4d8209581e732389fb8", - "d96009d7496fe6c3538c02e54c7ed05f3cd71c01bee9b3ad2de044c35e5058fe", - "ef49a9ab4d14c13516e5b53ea6d277800ca3494ae63cc115714e6f0fb669d633", - "c9edc839839504787c4772541bf55f312a301c98d5d99f1bd99c14b7ede7b35a", - "1f5cb90634bbcde9b35f081ae8963b9f170c442deae2ba26279d98782090fc1f", - "067081a59abf2134c3bb10aea41cfe58a30d00dbe825f5e5b623de3f44dcc969", - "b10889443959c1c09976c6a4c89a1ce63d976b0d57c60422cf29da4e591bbd9d", - "0b74fa10733e0b8a513ae6bbae292d14ad0a5f9a2d81eb0d850edf0d0594875b", - "4ad742e534393b3e99a044a3e378db6f3c5d8bda09d1958370378630f0b0e5d1", - "1b53fdd2f380ba90159f347ea03580c87e49045ffdb830404ab44b3d12aec654", - "0ab3bf82b97bc2542bba18c29984452bd65a0db6be8f0c9547a9f1ff659d15af", - "173988bac17fe43d80c87e9c1c0b934284ae6901c81a83d16683e58d363ee605", - "5a12d4f86169f7cc4edf6f69f25257c7cf17dfef37fa1b9ea3852eed2d49982d", - "4a69629bd44b17015fb068abc4835082b025b5b8bee2f016b9be0e896acf73e4", - "b0a48487401d56b8797c0be8e6978631d53795099c69ac9c4f30b93b14185171", - "8b96f4631e82e9bc2c9398e9a0229754bc216bbfa9b1457a33e1e447be6759fe", - "5e4491f6694a5954ab5815c3312be2bc27abad7ee8ec80bc7dd5d0cd6587b518", - "a1df9248cc61f916faa562fa84b1953ef418111a56b330c9ad2644efd19ddfd8", - "270796f788a9c37e8e845c6a592b8701d4217c7e81a7e67ccb803ebd08c6dfe7", - "7682452decdc7b19c4b0366d9d24d12cbf8224a0f790bfcf244e2e5070737c3e", - "fd9dc50483c1609f87f321ba2a0ed006be12b539763dfa99d60f07e9e977846a", - "3d8a0a5f94b78883f79bcd6facfd4752528a480d9c765d1e9ff1eef1fde27b64", - "db7d0e38e3f8aa5d6fb2ce14b78446aec4f3214a6146ea16f83942efefe6258c", - "528d9f7be5e2bef2ebe64d399d1226a46fb73432bb03c6a0e8cf47664872f9c6", - "d55c03b0e87f5f88bad517a7abb966dc9fc96234765462ca973912347ab3c9b2", - "2aae8bb2b7f29c5d6ba165a4ddcd6016ae32831802eeadead712aa212c3efeff", - "fb6841627fcf57128da5561be7a352216cfd1f729bd2ba850712ee789f365adf", - "681731a3ee413fae1fbebc59319426912891080e9964abf125ba262653cf1ac2", - "6f073bb48580f0c66f7e5d191592e797d0634b6dc66e84f794b43ca1b803dddb", - "f36ec006d23bca665455149e01d5ea7b52bcb2541e5e8579a0e5c7bc9a8d4b00", - "e7267f4d451ace170045ed5c1847a4d54597d1ff0faf6ef82cfd51ba38a7f884", - "4c83c89dc6cc9ddcca940ca3ececb0f71bd7431ea5c603f03fa2e12c7f108451", - "949cda877a2caff6e1fb3165c1a52f88cea0ddfdb466a1307ff3cd03cbbec23e", - "a7598c7d267832de9f436d9b1251e90193583db12561346d1c9e3b26e9cbc834", - "14f0c34cba55ca6908a04cf86115636a2ee4326de0c82654b80a701966a3e2ba", - "b304045ed2677c13091508541eeb1bf2a8f2f703161c37ab44a773caffb0c955", - "71a7faa4281b9df6983a09c37476a1585abc8044b75b8d13c5e9672ec87d4e76", - "0f780bf0802eab2214ff18b5dba0899803173a7f8b8dbe14d5a93b1dddb38472", - "29ebd92fe1007dd66420d2c99da3c2fa2f6ec28f3d05ec9309ad76ad9828e26d", - "1e994786ed49d5eddd7f3c49334ab5400c38f2a822dc83861aaab6ccec6e4865", - "ab809f5d061d3281ce72a825562fb9d09000a83b323de3a837ac2f9071b8e710", - "26c7b8c830e86842c5cdba6ccdb2e2a24206326946bffc9b7bc77ec946a0caaa", - "a72da23b4d76e905befafdf0e026630d29dd41b5da3053521931cef69762a12f", - "7448aaf6ed28a37c6429bc82f91e6dac19fa77e60259c0e99aa674dbe8f79f7e", - "99994ced899d3196f6303fd1d50f78c3e6c7c755eddba83dd3b4792775d55c4d", - "bf2d4ab30194d519545c734e3e616ed5f30c128241393991f5457f1586d0ae6b", - "5888cd8aab99034c3c96c08b1f9a16c9c8801ba3aa68db664f2800c96f40bb1c", - "f22615a83755c04d5a35bb596247d40a22a5ee5dba547538e7b537b12f482a6b", - "dbe5671d32d7e71b1204bf41bac95f0eaf4848c995758c7eaf18a670140700fd", - "b5297aadc066e8daa85dd69e866606e5b43b22aea0bfcf16e7a1a2b454572cbb", - "8088b5af9687986dd69cfc0a8a940a9965da24e8f964dd1977efe6cb751440b1", - "76d8a50c621667c12d316cb4d69076932449f31c50184112ecc1665d91cf81dc", - "f52d01e911431647e426907a9f55eab7af986bca6dd980b63b5b253ab2624e98", - "38b65673f6befb43c00379796336a28844fb684388492e9c7f6cb057ffcdbe91", - "4be9211ffd6a09e028b40bf097204ed9a4858210b04cc2169c01b3ded6b6edff", - "e1c148086b48cf3e1b4aeabbe7c5e8e86edff75844425f92343a233b23a693a3", - "3cc815e7696311af9b0d5073a9bebd7746f2cb7a8106f2d6265c6cd8103cd538", - "08436ebce9a4a32f992d396fc9d4dfb91509375bd62eaa99891ef4b2b6ec5e5f", - "d2a63fa96abbb3c4fec4eac6a72793616a689d789196275e49b5607654d47778", - "e6dd9d7ff9a1ae822ae6030882ad2b724d7f5fc13244cce5d06e0117e799742c", - "0707b86da62787ccebd235c731a0bfe2ab3a669ca006d8eb7a8fce02f7c4dc61", - "39e4376d272666d10b5b61527447bbd1f58649472523b2c5b28735a3cfae907a", - "4cf2b464f005117db7e4affac4887001108e5bdf8afd7cc5d79bd44e8f6f4972", - "27b24a5b81dbc235727886635ede8cbaa0988362ee383735aadbd472aac56c62", - "625aef531e312cd9918490b10ff624f34d367c8650d3a104853c2b53dec31455", - "d0ccdd4f6d5010c6842d3a26e93e30f49433e8929860af4b48a6bd5bd43a9c0b", - "485fbe5d4e1b3b6016f74b2c9d5ad638761dbe1b976ba55d32ab9913c3a5fcad", - "3b3427cb47961c5498a54749ee5bab1634f603d9838d9119d6d261f6455f451e", - "53b6cfa3b8a95cc3145930810f4282ce8049cb17b4156901a5ab39e6c84104ee", - "948c8e5d8849adaf806a599c5eea10129113321d0850cd7756606b6d4d028d4d", - "25ef60869d3d127b57fbce5cff9f43d2864612adf2e68d714d3d648c328566e5", - "5c4aa42d71c2a19349bffeed361733c4f44fbc45f1ae0b49d98ed55b94027d5a", - "a187af9f0bce91ab6055792560c05f30c7e6dccb0a3c1a290f3577fbd993e906", - "d6eea70c819e81aa4ec32178edbcdb0860f1c009b758c5054d52f7d599683fb6", - "0582116293ec6c70d7c135691da8eb798e5596e52fac23a8255aa146ee9bf396", - "ef63c0a60375fbb93f30aa0c8e1dc28d047c94dc26d2c1b6b6b51602697531a3", - "b51aa3d4907c5fefefa6bb6c5857e8e8460c80271d66f16bce70993f043b8d5b", - "e85dff9ad10f7d576090017fce1f19ef82ccee4d920e9b6eaa4311a9f6ea0fb1", - "536f61b784f4505a5eef984e402dcfc185d6126cdb2e6c82b888ab17aebf9ae9", - "fa1bbfc4f69b06bbfd7a7a97022b25975d2b03d0e612431717757ef9ed30ccdc", - "51c5d83dcca5d79531973a459ce6c278f7aecf33a131c1a8602b121d385e6a53", - "67ffe7325f446383319b0a88faafe9fafaa65317a8a7ea732cea2eef64f7a69f", - "778a16d57a3e8e77b5ac08ef3d2df13f2d796773834485fb23f2ae8e990bd5ce", - "bc39a3020f5c7fdfe70d4cc397abcec1577e9600e9b802708fd6ab3b036732cf", - "a3252954ed366725da6fc0801b200632f47f2759038088ddae9ba0a36ae6ccb2", - "a202be7a3a2a6ce8265c4d19106148f25b4660f250d3ee97dd53d701146a36d4", - "c0be419a551d8ca5c72c72fb88303e88cd0afe27312be6eb21d0efa60bb70ab0", - "b371b92dd540b25553313579a7ae9382a68516968dc48765699518858a240e64", - "96730ab6177027ffde8f354f7209ecb0a7343ba858529b708d73ac61b6e61db2", - "897b27bc131e8537ebfbfcb464f2c48f08a3efa84624c7e5071c75d38d2c46db", - "f50d29f0b11984cd3a23c2d28c3cbfb2964e699836a9d86c0ddc5edf77adc557", - "ef5bbfeefe1a9e43f9c51c74d319404e221a953bf6c0cd2e5ffbb8aae5eda049", - "409030f7844ec6a6fa25f6b2928c9c4666dcbafed89721da0b26e5efb0c74f34", - "2d40e2242a69532354b3f03713c86f4b17b71ffb67402a2b7dedc2648fc62a63", - "f9bbb9cbbdd753cb0a6be0759734e17f6009c5ecdfe4830879b380edd5234c7f", - "15d1b8c17122ecbd6b7d3f8c2eaf2840377848124921994918e5d214a0c9db85", - "126a5c515d768216f9d386baa0153dd2c4b74276651c7fc9aeaa078ad8f390f9", - "6d0ff6fdf2fdad9de5cba04e6b950467211e3b157dbfd02bdff7770a6b2b7f90", - "605953ec33e80d1b5ffd5cba979a8a2cfe0ed84fdc6e48a915744012fb22c3ad", - "b8e9fb69c65134b7c1874503a962ee662d1f293c8a71436349256615003e911b", - "d5ec931f0bf4f4a5a1fefa9deb3ec4d4e9e305209cc2ba86f88c8146718c207c", - "09662f906cfed7d0f65eb87df6a104f5eb0c279e58187277ff1824173bb0916c", - "9e3fa19459321bde349e93e9e4f6500e1850e2b6979f2dd902272c6434db0525", - "01b8d96032db59ddb81aa682c221dc2e8d7463473bedcc5ad50b1285617f686e", - "aea3888d7a649fb27b308cf997acd909a1659a9934608bd14eb33b45640b4424", - "878bd65ca7403e18badbb50521442217c7c0bd582e21b490022e3349b35c6240", - "529db90677dcec2bdac8e38467cdb0ebe14f0c484fa7f300f166250405c5c58b", - "c006a596420e80c1440f0f9780a889cca91bdca67c348b0e2e9010a3a932c35c", - "049d6f97465e81cc2b2de44f8c2d5f18ce46815873c0ec93677f63bdbed427e9", - "dda92eef90aad2688b70d40e78a4f56828ca418890867e55cb0aaed94a66f773", - "9305b4ce931a666524208d092a5ad3abc83b60eb67e0073ec2e9d5d24552668f", - "04ad2865c83fb43502ad6fe1ffea5048e00b8cd2782d4e5a3abea353b37cfce5", - "5d98c7d10d0db696b002006b3608e958a88cd3b3c1ad5e07cd03ff3fd5c22492", - "eeef440ac5fd09127db4d52a4d58c009384e1ef2eeca41789a2cbdf246eb367d", - "2d6daad3f3e98b47b76a9366f96b002bcabacf3e65c244825d5a1b51f71104ae", - "e02f741357412a7961fac87d3618fe257a607fafdc8b3dfcfaf601e22bbc6d38", - "a1e1aba04ff631bea34e3341728c91b23574217209faf25624e003bdd4ce2df0", - "ae928127dae8ab8bc51c04451f86eb5fc521cb1e1c476f2ef07c6b64f24e8c5a", - "3b741d148e13dc83d3c77cf73de0d836cfe6633299dc24038775f2549cd52038", - "53b16cf4e6650f7c98dcaf5fbbab2ee54accd36bde5934126edc029b81aae069", - "b21a39b6a2369e4e7a7ec5d74e107afca281f35239731213d321e03fcd8d4d04", - "026a65f0777837ac03484ea64c696aa2bdd51939c22a1889527a89e4ee157249", - "2a9ab2205893a665f88d1fda534b3889bdad977e5accba09286f9ca2724c745c", - "b5c6e212c4bf588345fb6ad2fb0e938780687a2b93089c86e407ae253e1166fa", - "ec472964c456157134cf7aa259a9ff7227517e49455df852b4ecb197d2285fcb", - "2a0e63b26ac073a2c9d1c73bbc4414939f63d0cbe90505678fba9dce35d1b037", - "e8c6d83b2f36060f56ccceb586c9f3a792de1c5c2370f47e4b9731b21a3e5560", - "11a131a89c6a8b974ada7e7f5e3ba8d30ddb2e8590c9408e2a4aab249cd2c862", - "34cc7656d0fed46050153e9af4a3ec3fa0464ba28fbb7c5acd8afe46a5ba0276", - "37b76082c097360c04428c841cbcc7ce4c609f64afd65cf09df8f0d5166f4f19", - "7d0fb51e34638d14bd9d57b41027406b26bc4280984db99bdfbfe73483d87c72", - "693ab3018a227a0a5aae7ec51a9b26ab80fa378ee0e50922398d11e1467c3f63", - "1ef4f8fbb231d0171db1dc4d9b20b18380be91bb02933998c477b52e867adef1", - "8e11d7afd2424f94a40a8912247a992d2d9006a6774f75a0902b0cd94de8042e", - "4e6c087a3e99d97eafe1413a9ae53e81100a156ca6214bf77728bbf4f76816d6", - "eb32d7064af425f87955d698b5e9d297aafff2a57d6ee4a6a73fdd815a24f4e5", - "853e76007659952080f910299d7c31a2a291621cab8198b50c5a03d622a340c3", - "ee48bc990bd71ecbd5f9d3e149817ac43092f15c48068743275dc7e9219a9e8a", - "2cadec0688cb117368f8b76b37033948282c855ac8d93e25b621ff323ae86c40", - "b0b1f9137d64e033de21f9493ffca89ea26dee74f59f1dda4c8f3c57bf5753a9", - "a4f462180a0af5b8116b5594b211623b0bbec0c91ec88704fe0e60ddfbff3ffb", - "a40d5bee3452b89d83758f893264c4c9c98044ee01b6fc4af146407b2a0f5ec2", - "54d978797431e1c07d3c6df03c30c5da0d917ed6224c0df3a794d62261e2c2fb", - "1c2c368e150274299367a2925470b2b6178de2cb0ae7e266a86aa2ec7d0b676b", - "82e9f8c74b4d263a17a59505dfe44abc4e5e52af1c1f6b73e5583a2d1706ddd3", - "0faac103d51917c80f83a246afc606bc2055651d97fb82b000543f80fff9aecf", - "adda7006938d1d4dbe553c93aadfa4d558f7789f8234c2a23d7b5f14638906dd", - "cd04ecab1771b984bcaf9d93f693e1d159f1ceefee8bdd818cfb8ec1234981fe", - "4366a9bd71c2b085373d5031e532d97b83b25822b5d11e0c0d96e964a5a5ec89", - "c7cda86658a8ee35bf5402a9992211824b8d13d885596d1ea31d4f04563db28d", - "b407233344853339a29c935cae89599dd25ea0d1cd9b117468c4378635cbdb7d", - "58d69b5600feb321c8ad5ebda8b5e94396113b818da49679dca76a406a6830c3", - "618e263b16ba234793b234a13b03e58e3ee824a4da8f7e29e49f97bf273a8f37", - "1f244cdb04f0618ed0515df582da658e2db9a508c96d16acfa86f7c19cac2705", - "d65988e04a393c74848cf2ffedba007743d44dcca90a8290acd6a08e5f34f36f", - "e18c856d976b4507126af505dbb50140f22f7d4a4c61818ccf660d796a92fcc2", - "437533b32373e7754791556fd4ab7f6a8b0b803aa6c59eb48dc99020a7a125d1", - "12d5f206c0295c3eb81d99ed774452c6c32c4b7975152f94890058b9a7f6243e", - "4f37006e58bd2338f42f0be84eebbcb898bbac602402267e68ede101eca0ef7c", - "c012932defc4ef8ed0c2fe6a01f5220e35234e1858b7754d517e9e140007fbec", - "6d918b8a6d76aa9d56fc09fa0d7f3d39e2861ee9e02de19c64585e982378f575", - "a7893f1af11b518e4cdd38b9b6ae1838b6622ac5dc19b60c230891c8321ed203", - "a66616b6d128560818787a034a0b0a28b1b4cef46af542ac8634a75113d18317", - "fd86e63266846d8130b995587567fb9fb2bdbcb34f1a189f452f27b29a8013b2", - "071ebd32f14573649f9d32b66aa64b116cbcadf966f9bae2262e542e02df1ae4", - "405773a9723fc92e81f2b4a193a5ae7cf6c68dafcdf9fef68cb51c3605fb8706", - "59fd4a5ec576751229b24adfb15bf54d65eb072cbfb15836f8defe646f65e7d0", - "e9f7478e189493b65bc8576101d0377e6687eab02bb542fed97ae13833883351", - "79206d62c9d47701e39e001a40ea065937fe39c117473d3b74af07df0602d58d", - "5e66d9a378938dbef0a3c18cb6bf345428e9cf04bbbe04fe3372bc17cdab4f7a", - "4b9668c1f5702b544b6e830847ced9ef97ae3bb14d03d54830c6b3d70a1adc50", - "e89fc937a5a9f39ca8d2007bb83bade83921bd7117d86820aae0433aa236a5be", - "e3c3269fc9f3fbd2a1137b8cc7f9b10e8687b7799023c7b2e5db74ed065511f3", - "63147ce0c4219e566c79c50e9c9997d0bcf7fb6f30904b9ab49a22611a995b8c", - "a4bcb803d38e2ba2d666b0059d08161e262dc84e11d54d831131d96a3364e4c8", - "0fa04ddfaf10591f09e252178921d24255f03f59ffece02449c7bae90e070187", - "951ed24027662f6942c02c35fac42c6b88ed6fca8baac90e83bf7c607de0bf1b", - "d19391200c906999cf1993e310b64eed1d5241877193c46cb9c4d58fee56b9ee", - "04ec57699620835fd74cd1060fb8abd42b3d8d720757584198df42c3e4bfeace", - "a48a9d117e7f8f765a04a315909d36732e861abfbf04e400d99e87306657608b", - "225f30cd315cddf59a888e87ab9064ffc330d7632ab6024cb4347c6519d5d1e5", - "4e8b04d58a29a57ebda4e45bcdde9c00e46b8ee7bea09f98ec71c20fc7f65703", - "09a33d898c6ff5566908b770e7f202847070dba414274b8aa08492c9c97a2f86", - "89c92e91b2e52b49f3fea687698cee0481d711cbbbd8ef8aef7bdea6e5179f45", - "500df0c39394a04daf9b7dd83188b5c010215a930f7df4402232d272e1d54281", - "08877b5fd6596fefb4162016951d880358793cd49f63a9290c40a31372524835", - "57442de6d1b938e3af173239837f573391389f5714a03734279bb02726e4577a", - "f5a664ed89cad7fd61b6e0a15073474579b8fc42aa7e135110ff586d71f182b3", - "1db365867b46de18b3ede5fcf69f4418b87d00b90796fd44f721f01609304a76", - "d6af1d21774b78ee85f751455b179f69057cfc0b6a68232ca909d413b7040722", - "2a159cb442565e90b1e8bb283982c5ffbc4d010f67c8306cfa8158235908a425", - "ccc33c777170d168d412d8d37ef72c19d4396ad48622bc017a1092fb1976d067", - "6787339f6713327d6ad2e13bd75e6cade5f0e64030e2cbf475a01363d1a54c18", - "9aa960a52b1d8dcc1101d6a36f615ec7db18d2d871ab38aa00d1c8213830bf78", - "1aefe0ee058147f0bef21cf79abaaeb0a988e48b8c9ee88d09661faffbd0be50", - "876a474cbcccfcbf22f0017c2916ed51d83f3e291064336f0c6dca7b085ef80c", - "c24cbf5874e7a5d80d3e7f26b16eefa0d9b17aa8ee28ec31f9b05a927d3c3bdf", - "4168f32dac27fe444b584422b49d370e9440624912264785309a200e3753e884", - "92fb646f8cf0b455eac4d791bba0de5f590e5ed9308d51ca3f593ee4fd7e11ad", - "21a368e473ecbd061aefaecf69c515518c2b36c36fe728ddc0468aa6c00bb69d", - "7534c29c166ec7ba62cb96d4a96413722cc8d99b3c2ad22c6e93be333889e292", - "dde7eb952764f2b8c34ccdad8b12472a37b6a5a5993f2d56fcd5ade4e5b9a6d8", - "ae36e5500acf42984a7861d9b55789837ae77622e3f699e8a7667030aebfe3e9", - "ff3a780e329e854fc845e59e1c459ec68363e1a3a28421e314017fb6cbb4791a", - "4a4a780732657552a3c3d1d249632926de7301c47e5597c239290202df78dcf3", - "7e6fad1db11b898d384912c0ea035c548fbad0bf2e06e2d57f4d84f0516660c6", - "338c61e333425cb647ae20568b3b7f069ba54dd38b1b28d49137773dbe6102d8", - "a842c99baaf4ba1b7fe969194442cd7b52cd69691f8d8f27f7233262a3aaccd3", - "95651e8cbf8399669dcf486e45af3bd5909604b3d6e80e39a8053536b9737a53", - "007996c22275393e3a1428c8bf6dba6e9ebfcfdd8f79faa7db62edb4e8daed2b", - "e5fb57a82f14e67e8455baf9ca582b5ee9299cf77fe8bb152382b076b332d255", - "3d0dd2f6166c1a959d0a60f5cb92f03797c3de1962335e7eed8578132090c848", - "65aebc19959ee3f1acf27cf20922ddb10ce86d4e3d0203e912ffa67fdca640b9", - "466674a12caca2d3fbc669fec6a1f24c6f8048dce844fa36798446951b339c75", - "ace0a114dc9cff578a39a1757787768a8e6e77519b8b454e2868f280e07713a8", - "19f7c7db5c820d4a3558493a3c9f25f8e0b20706c1bd023fe0e40680c81cb6d7", - "7c859271e84aeebe17a7cd9d4964c81a837efee0158393d6d2d20bf3391f8c1f", - "61884cba28dfb7dad219d7c444f246abcf4ea6b739390aac9e3a78f0d77565c7", - "280c547e0a83da733b7592bf105c1b09980f284278ebb59c8dc303a94c2726a9", - "ad50252d60ad88a74ef6be7cd0141af623eb05155e5dd1f86b36d4e05c076bbe", - "e7d6259afd83f781d798748c63cd8c9a7c584327eacae25e3f16a5cb7de8cf11", - "d638337b0c6288be196aaff23331252ebed194987c9a4b6c8827a3dbffe8a3b7", - "01d81bf5be69298b06d26cd7acc2698711d400845a1a906e173424908a9420dd", - "ff4625f84dc8e6f46ef91b07372e6230da0ba63b12a6e511a105d4f53cec1452", - "241e4e531642c0efaa90b263ed8bc5e1f02d064b10db7b853716756c67a1da53", - "e4cc11810a81ff4c8b77621399965502f3e813b805490f7fda4ee5d57aa430aa", - "30c03059947604683fe58ec30856d4d524b85bb322856d93e82e09b7fde21399", - "60d7358068f011af09419460644579d2700e838bbba981f121189a37c79a9eb1", - "2516b67455e542ad859f3c0c2a49a7df020f4c536e1475b52e03174f4feb7fce", - "3045de77b54246c5e68c81f83ca9d9da8cb7469a9bab63f2fc8cf216aaee9e80", - "e9918e1e0a6a814e4505226cbef2ac0f67715ec5c6306dd088d8b0da33f72728", - "da23dcda379dc073762157f21496b87adc5a3095ceb7b7132812ea4e2e65ac50", - "a5dea3f50fa7072b056948db8835c7147a7a95808e6a07be2c1103a1e00257d2", - "d19d9c7bfb6968ff5ebbf86a37997f51f7a023d3c9e968524399227883d78335", - "de4e58d69d3f0cbe632de8b779cdbc71f54fbf435cb5a466ecc31bbf224f5184", - "725064a67fba149d808daf9bf46072052ffecb162e4f7bba8d69a2fc5d567838", - "499f262208f64d2c296fb8df43edf271eb025caa2635fdf0128c4492f2460b8c", - "7a98faa72ba501c84d73f38027020661103ad3843645c279817bb3d32e22e4ef", - "4466d790231db6af14e506cc86f48a76e3b641643abdadd2ca773d7b27d8692b", - "b949398ae5761530070114e4d33b90c987f540f3d927c3620afd508e512d234f", - "4a8d9cb9d863c35fe00bcc7640cb5bd2856f8c2e36652a2fbea09b7b7c2729fe", - "e0e2b09e708a46cf751898ed9f4c627092fbdab686d42aaefe1488ab8e7fab7d", - "ecdaf1bf462ddeba281a5a99a8124812ac972b028a4643f23d555d58acdb8ee6", - "6b5f6a3b4aabf16e755ac9d41f078b8ec0498dddcf9b02df434e87207d161e5d", - "2d138a4ccc7d482991d798088d19f2a0a0975c44bf32ce1b99ea7c490ed4bc63", - "8bd1b8d8c8a0714deff40fd8ed0875c820110485b74200b4f4945e2785defb7f", - "632fa33751f3dc164ad58e22dfb262c4d8fd423ca03aadd0c891a6e871a6a29a", - "793066878f632c11ade8a39923ed36f02eefa44f1d0c58acc22f0f0f60af8c1a", - "40a4a7e3579b0818408a961224bd23c9974d94c390e28f5e7f83c3037390dd63", - "b9115efc78b692bcf040ed0d800594ba4b17a73dcbdcf8a720aac77617aab57e", - "331d06a9d607c52de8e8c1a994ca61e751f1c5194ce720ee0ac8432d177140f9", - "b48895ec3d6e33f136897f4270f549b2ae81b82d9f2212946707ac69be87aada", - "f2d934defff7c7692acccf793a70e178445368f343eab6b9d874824464f996f3", - "aa132264a5df7462902db468b4d889788ebeee2309ff8a4ffc63ee86e8668cbb", - "b40aa592bd3e5e3c18b93faa71b8707e6704e08fcf555a4c707ade3e28c35ef3", - "90e555343f56e5c2ff888b34581125ab02926ba62c514c9c403bab96b76c0fac", - "87db5ec962afe33e5ebe18473fa7b17a373c0eb31a454a89e144cc025959c254", - "f9c29de7dab086b59ccce20f1565023db70150b406fc760eb95f8991d28869df", - "dc85edbf215a97d75a8e5ae9eb26d292652b6b39b3df0322c9f4ec9df99529c1", - "9975af8791588b8f1cb8a719d1c14858ddea0c29748291e70b353e8e5c8c3c04", - "c83f8cd5c0f799a36ae899cf13253fe5c3138fed402e7145dd6e26e5365ef737", - "37c7fd022cc45197d4945be44dadf518b9c0e8a65021bae5b1fb0906848ba462", - "794a2d1afebf879dd17b094c519f81bdecf1896ea61a77190290c27b64db9bb9", - "0b671c5223b8a1399de3275a1855cec46258f2a33776346e45f093868995262a", - "45eac20836a494638a6e37740d341406dc899f1b6745d8e2a27098800bd17c26", - "422db223070be76d583e1fb905d7f11c2d2e631cd893d2cd4bf32a7115d20647", - "e6894bffcb10b4a7b047467334bf2806c85c9372bbb1f74610acf141980640d6", - "77c4ccb4ded7504271d4569a99a3ec2c1af1412d705ebbc89fdd6a869660e607", - "5daf82f977202f33e73d1f4a9cc7a11a8c05721ec9586273cec2d0cd7238825c", - "1fe15f31f2c5f4f2d8270baad60957b5b4241ea76a19a93a95f5d04ace9c959d", - "c7b494c8c17f05474a8fbdf3e7101c5ce559c513cadbcabe9a81ae624d825be3", - "e0faea6336252a58709599b350d0284421e7d943ff0edb43ad989d7f1fbeab60", - "4031ca1b76ae4174e0fc424f111b34f7b2022a4a70572b78b2bcca970a92f17e", - "92ec12efafabd0b79c24583777c18e233dd056a4b4311e0a66ebf3fba280ae62", - "4b01fe92ddea1137458341aa83e4bd177b1d22d128dd0aabb6831fc4ee3cc661", - "ba654f0d977cfdec761b5bac708268bd17de5ff7dcec7bf6917a45c8701a79b0", - "bc434a944186f93a98bf8716f4eb480b41f0676c99e55aa9b9ae9984008aebdc", - "8f86bfba84d3766b003a24100f13fd12df0bbd61c940b83f04b74013c86050a0", - "2742f1468d9e528d199afafc10b597ca756acd2d38065b5d33076226ccd8b76a", - "acd9f3cd6818cac0c613fda098945547728c2550655da836c39adc3ed46b2876", - "a7ae6d7203342de06ff706bcef9226ace86015cce33376cca2c881565042d771", - "1b53a54dda69ce23c93099de4945c1cb6ca0fc8f298c80514787637eced6981f", - "4af2b766486e7111ca17c542a37850dbf4246ade18201c4cb59a1d06e9c1aad5", - "c8c2ec47ace24d50e064689686817ec36e47d66d42e545940b13f8ae70ae85aa", - "8eb9f52b44871101d6ad8d07ee7f832912c6e9ddfb30351a6ea07fa4a0c9df87", - "dd75854609b591217fc4d74612e1a42ebfcefcc6df12f8c81d1a53309911805e", - "4b9d33f3803fbc4441bde106e89c8bfb1d62cb89c6104d1d685536f9da24d7ea", - "2da76d073899a20da1332e46922860930dcf28026bb52235ec3ee871f7d55a09", - "7e791b6e414992c3b82206863df518f801a132b6f36a5ad1d0481e8dadc3c5b5", - "64a870c032e8f93bd5761cf0c340f44f8ea4e90aeb96d8d1dd5e34ff8fd67a2c", - "666df64fa10453db09822d382565180427eda718def127770c579d0674d9f184", - "7807cc45c929c8cf492ec0450798310bc6661af6c0c8b792b4572ada5d432a67", - "cd6a6cb44e5bcc650631e675bae858ca735bf3a06275f65acbc2ec62f5669a34", - "be874ad8803c0e56deb334c1be8f6cb2fb1c79752d3938215a6bf1332e7ce63c", - "9c2bd8c99d47a086b39702c1be5769467bc3ee23dfa1259418a6bf8e1d24a03b", - "b83ccee7d687ff8758816a3ac95af480f51ed2a6db6354acf8e11770e7e2a5fc", - "42d6d662c62eb6732f1de7f37c5af3833a94e58e6fbae975bf5a4b568bc2e5f0", - "6f61058ac9e424c38295a3e806ee287cbaa1d96ee2d8aca3bd08c0aa8bc0f8f3", - "560c231b431430e41f3d09e5509b00152f1cd9b31e77855f319173dd0f2f333e", - "996dba0acee2bab8e67420c515340645ba3e8f7c0717b5b9ba96c0883e615f50", - "539e5b31279c94fb1773584a3ecb63cf192df615c254d0b5b8fcf2efc5256a7d", - "f7cd2271933ac5572b51e32b024b1ebfa13e1aecfa5010ad99fdd03e4c9b98b4", - "488cd5f57162aa739f2c5e71dd76b3744138e13960030ed87c5446c463a696a9", - "670f3f0c28f33e8ca1fa5ab929bb01a4fac8a139cba9862a0af7e2989fcdbff9", - "b15b04514c0a454ba43b2f74db77525fc77d7cd4d33713a536d90adf84afdaad", - "e2087ddc36a7ced247f8f189015d1f54a04d6045f437ae65da6233d88cee7b2d", - "da34217ce31ef2dc7b6567b1e3b27ef13c5af181a2e160033efd2413fcc9d7be", - "8e0e1e911a4e91e55f5292362e539d1fd93699c6af4b72ba408aec5408316176", - "86c4babf4c07c667b1abfe01f9b75162c2a330c104ea3c13d243c090aa55ce3f", - "1eefb2545bcf707d2fc6572836ce1a2362ff0b7e59d815f3216b7444dce2c1c3", - "5f3cf6305a0c18ba70636b00ad11aebf7962658203eaaad711f9e2cba9c20f9f", - "5ed31eda5718dd2bf9af59dd10afbf47fab011c8236fc249d4df5427bdf0a9cb", - "d40f8491950ffbb36d3b69cf11756f8e19c9af113203534518e71d874d6155fe", - "f7704246cfa05a65d43dc5c8350ac29e75d6bda096a1641137f287a7cac44c49", - "148555a7b651b50ec549a1499d93d0a7641964dc0d0f9a95adfe0874c8b32e6c", - "12252fe218c4cf9046f9cbd6bef8160a056e07df124a4098802a07674b247761", - "9a97fc2408bcd0327a33d1605c91d059632e47ea83f982b0e31a4b979fd12807", - "d8c46c0a2d29d9ca6714ff7ca9bb236508c4123abd7d5a9e1cd471fe19c8db8f", - "b56bb51642119d176424d1e06c318d5ef9e5dd0460849c369443d7917f33cc5d", - "1ad4ed47e4ba446a66309fdcd9fd53f73509f1eb46037a69637369f2a1551586", - "1eb90d2a6920804df353fb141fc76b2e32e7f9aa504777b907963f77d0473d5b", - "adcc87dc39d0804efc24f3704bf8e020ccf4d08632b240adb22396e20d506631", - "39446c2b42d35dc744a38106910616daa3b570021ad6fc13e531718aca430d22", - "938e457ce711d5dc11e8c48eb3a1ca644c9c3ad6c21b9d30dc877cca58b71dc6", - "09dd856174b3b3be9778fc7e0d28e603b1ce541f2092d57f13137e29638522f1", - "60f96211d6f117f95ba9d9e62b3ebdfe569fb585024ecba6e72fd172a6f323ed", - "b93870567ee8c7c83cfea739cfe61c74c84b1c62d0ab9a1acc50294457858e21", - "b71aeb2127f75784a93d018ec828abdfb68a6c0ad42bbe1ca5d90e80fba3ef94", - "0e5f3242d87a32a01775fe589ac95fdd52612421fc3434b3208fd99281dfe91f", - "ad5a9967af40dc3f07a021df1808bcafc8dc04e33b94ba01925e35c0cc35c754", - "e0fd7d2f72fe5d59e445496183935bba1aea91b82c447520081355f02d96511b", - "df390cada22930869e47a4fdbe83003da004c0df916a35762345768729eec94d", - "58eb089ffbbb6304dd51ba66e6f4827cd9097f22f1cf30fc2ce109ef4169f4bc", - "18359038b4988bf58d2f1f1463eed44ff713eaa8b42715ae3a1f7bb3bd533330", - "6cb9d72ff822ae2b706a5d8dcc7e2cc14ac948ada7b4df4229a2357e7ef7ed10", - "96caa35fea4356c7ad5cf5cdc94621a223853c5ace8f41c3a5b38563987ad3fc", - "17b4fc1af09f0c11b611238ed2683d677f388dcb0c0283385adcf881463a6017", - "9097bbae742267c1d18ef2c6d4cfcc2b4e7a172b27f5fd63e99a5117a97bf7d5", - "1f0d68623fe1ffa8df86bc72fd4cfbdd79e486a30cca7c3f3d220a3baa3cb25e", - "ff68c5a0b8915d0b42313f844022b04044d07eae572ff25303207e6c68ce969c", - "6b558a7111f34ffdf7b94e745fe534a630674d328fa6b7dfa11061cfe3ef77ef", - "94e2424d118babf466a6c22ae690bb696c6e714256a692c980d72074b42c7130", - "01afad82de2b4794f9f0f4c560da3329b51b4957c92cebdf0ea038f74ae3ecf0", - "6b214f36e1251288be541ade17b6b6b00555fe4e7390fb54646d64c1313a4844", - "7bedb547a12619476904b69bedf744f0290ca4cf9fec06c246bb52ce78892fe4", - "57cf4f8eb48dccd3955daad68820d646de6530ad4a69892e761b31513d35197e", - "4bf907e6fe63eabf68f13b1c6e6ef0e99936f09d6a6cf342d0c241cded567f28", - "1081a653d3b1d414d1366c0bd9db3a5188a9f2cb84c32ea6e0617a914cf952b5", - "cc9f50ea088a83420838a0b3ae4cded54e3d184ae4e3308bc46edbbcb92db547", - "b5e9b34043e81dc371aa6a1adc71df6585da876ec5e274fa9d1e88fad4dc85b0", - "302c0f17197f09415f5d68f80bd6c85447b69d2f20d04a8c4383182ac6297aea", - "16c02335baa815bbb82ba5324abc9a34dcc9c59e0dd947e400e05782831fa2e5", - "700d0b3d17061e725b3ccce294728b68ce4ebbe66430676b110420fefe71f031", - "398c6b8a0c33c2b72c307e9f4cd74d6e74a7ae02b85743908baadc9ac402addb", - "b92e3ece067c8610a0ee49e6bf8513994a0f55ba51b00caa7c0e53add5710b08", - "ae5e0c6ef09b0804efbc0b944bdd508754da8a4231c0ce8f5ca8c1a92b90a4d7", - "42d89e4753b3063c102e1f3be6ea91e36dac89dcf2d073b6aaea906615e8ab07", - "94a359a63918c95f5b23ff05732008aeb2eb5063623639c0f9f728505e6c3271", - "4c09ab9d63ee2538d85c69a4f2a4bfa9dac564159cac57e53bea770551a2595b", - "f77f13f2ed50b0097ef2fbbbaa523cdea0756657c1614a1ec68972ccf7bddb16", - "8ed3f0e238ede9ed41d4b8d538ec9034c99615726efb55c8e965359cad1caee7", - "c88a3ae7712edff1a493c8a3d69ac6546ba5f24e80b65ace93d5089f7cfd8eeb", - "a6c3d4641f4014e7d97483af33d8d27819f721d7574fe702eb66a003caad79e0", - "c65c910084c35204a79f6c5c8eb2fa780335993da9d0b4842ffe28c055557a07", - "d86e0e60fcd45b3b9cb4c7b86782b4d93e56f7a649db821dde1b5c147a7f9027", - "d1db20f68e60eb20c328e3a64d1de62f07c8895a71e229834956ddac34248b8a", - "5ddd111e5dc6a26337d15aeb4f49cffc809fa8a87b04fb9be96f6d4fa6808228", - "f63861bf7d687eb6db36f204ef2d5937a650e38c73ef03ccbac91d69f926404c", - "0eb1304d2b26bc6ab29037b63bb0d7ac729a2a3d16ccb2a4174683f272d282f1", - "ab2add20d1dcc3df3921b6770fa112ee71d26e1d447ec23b8e7899cc68919fd8", - "3ca40f671ae373c60388556a6dcdb0f5d352a1a6513f02b5b86881262c193e0a", - "c4d7650eb285fea97c414cc683ef597265d418eb35e2ad48e59cfcba85a766b8", - "43cb7bb952d90244bc54a82f2f7f23362e62ced3cc8827382a3212477e67c893", - "87d07123b5f6c6a4fcb70759f8d819bc06b42bf1e203551f81ae39f3a50faee3", - "d8279dd817b8f977f7dbcbf0298e562d9ac6e14a148cf129e5e45bd20845bc77", - "deccc67e0b001cfcf7ceda52ab9499b91ff645db1758aadf3c383076f6ea009a", - "e823f8a3a7722483f6a66f0241ae800d0bd29b1f6bd968c4ce5d6b0741fcc14d", - "8299838ca10cca7383652d3c26ffea76fa17fff68b6cae41d13aad01c934f76f", - "724c99d05d390c368e0689d79e35eb31012e7fb0cedc98aebf85cd735d672e28", - "3db598d26fe113d80709b71d3e22108bf85c2a8ac9981c7889d880783100e310", - "b653dce297d058857458f3dfdf5dc9ea5f15f77952132e1a50a9933160e1d537", - "a7c1b1fb624792e25bebf698de6c2a96cd4bc67ac4c75c1b2002588a9eb35ab4", - "1dbe0d3d2ea4970a5f1b2f192d23fee6f58b5da4bfad85360ba9a2df1c339cb7", - "82c8eabfd3c3704401827b773dba61d08da2f9c4518e01d66b2f97eb51573c9c", - "6469fdcab65067206b8370dc1e19c134e88815a819d5cc896bf95e1263774645", - "8ec996e1230be1aa68ee5ecf47119020ef5bdb65d13bc3b7147c53a50c3dd9b3", - "5c4b29f3750d7ba7e06ffcc247b9d17fbc1436b8e9606b422d867cf0424fe8f7", - "7d64ea4f588c7557f752df88244a935a35cec7b32466f0ae58509655de2279a5", - "2e5767ae7355a1c93873a742e85276a0c2188154c0b299389bec752756339642", - "41a681c67b9545d7e5d721c19d3f3ebeb9bd5882bd9213ae00c783bb804d24cf", - "748de1f0531ae90e9144c5f7a3c1ab8e8e318096a90aefea6c64ad97b84aec27", - "65deb5f0a97032be5f2f587557d447f3d6256083f4dc35fe9246a5a978fc7fab", - "80ef0b14a45ed1fc887839824580d5ef304e4ea1ee2522d820e9dfeb84db99b0", - "d29a268875876f9767953611bef214c1718f210b38966488c687489f0bd521d7", - "1aa76c152d28af919f984ff69a4ea97db1102ef18d3533a2acb8887d12d7e728", - "a1bfa960d70337f9648ca4563f1fed867cef7be7f7fbb6454e7e7f59838398e0", - "ec3359d2ef84cb260a3f47d5d03030ac1d401942dd33040cd290bfe21ce63d50", - "b545ad94c89b8e0925df6a9c829c0f185191ac29c7d99b7b7d57d393b2b9f637", - "63960888ca3c0de26c6de47eff33b8f291cf395e307c18b6f3cf9b77c29a7891", - "45c11d862bb3ae7dccc0f1137575240be87d9af222dcdddb9bb822fb5b5f951e", - "bf928211ade9ed7e2b98fa2f15f8023e0a1b002e8f363b01fad6945cbd216240", - "12a55d3f51455ee0aa39d2242e285172134d85e003c974dcbc4210a18676efd3", - "f45c529eb6ae5a3d51bb6815ad7bec12aafae27c2543fe9a5c7eb5d679a087ab", - "9fa2698120a81315b59d00abdc958af2d5f1d4c94732a7cc6a039a69cda36d27", - "3e24acafa752622ccc0b0fc60e9f9a0be51de31b2aab82c035ba923b9e7a34de", - "cae1aa9d3413308e9d96afe6e942ad1aae786758cf26c3a1e32ab0fc89d9525f", - "912ee05f12c888c30a1d3f5df7c601d89660e2cbc0b01f06fd50beb5217bcea6", - "584a1dd7bfb58d0bc5a9845919fdc69ef9c846270f4df011ca62986d64bc9fa0", - "522b09c2180f1741ba4370f54865c29d9997ae5e8a7d2500a7683561f1f67e76", - "44bca68b213987dfd109948d9223ce7a4aa9b37a70ebd8ac105f489d3e5aff92", - "163182370630a7967dca731dba88936d0f137b29ca446f95cf7adb2f3b7b80e3", - "06b37fa1cd6a7f8aed06413df90fd48bcb8a5159aaeba19490e3994ef4f03e67", - "938fb08a6c1c66f2d08cb0bb878b7e34ebacd9e88b1309dd81745e321137ebaa", - "76fd4e8c6888792dc154900c46a3c513d1766b81049eedaa663b44bf5ab30af3", - "447b81da21dd11fbaf8fce0dcf3aad870ff517de03c0730de725eb5702492190", - "82812e616fc20698b4e1dc044236d70a2f2c0bed7b34886f2b4d8ca9e857e18c", - "c522762086b35b269fd64d28e4b41e387be64ed9c5854036a0aaf07e5946a732", - "0af6440a22e70f95d43899481eb3e11e98fd60ee96aacfa517d9f1624dfeaaa4", - "496c65127bab52ea57f0cbc728cff6e9ba0a5f45b9382b3cb945ec024d1d196a", - "6f72a051d2b88a180df389ad34d518cf8fee9e517af11bc60cb377e8fee3ec4f", - "ee37334049185d2c28e18e5634d88c4c0585a815c4324ceb322934493c8caa56", - "60d6f4e91b30148b877e4de40e147025a9348ee3337114bc559279ee71beb3e9", - "8367a53690e1e35c459d86a6c634aae0f61b2228427c4f498ec8ca924a157df5", - "814bf463d7a732e473d60bea9126dc0fbe1a5df1f3804384a25b385add713612", - "8a91aee22b156e08957d0c7b7a5bb407c8c1ab1b99b6ec2dbca2c9c452231da7", - "ac84006b37102a9794df08faa6053e311a8fa688109b69a881e872411bb4a13d", - "0eb997b92b6c2764a439aa57ae00fea491c9369f523327a02acebb13c209b365", - "12050998a07468e7273f5466e090ca87decbebc2692b4ed949d289ccd6ab6782", - "3dbb7894f5cef7a54e6b7007985bcc4e29b5e805e85e400c9e331dabac54c07e", - "43bac645bcac13715fb34702f46605cba6b7e6ae7120d63ec1e5eb21be11c59e", - "f4acdc4229f30b4fd26b8209c237f92978773d739359ea2acf80685e81400a7a", - "e3eee1c0b56050085359cdc61683108e9ffd5560d4becad0551e4cead906de03", - "af9d9da21ec7e50bf70ac1546e6fdaa88926fa4042f514ea10d5c67d52c01002", - "8accc1e318e1c6a2e8849e07ac42a54f56703aeca9cc4fe6e2427978f8f4582f", - "d597d58990c0fe30ae46d15006f9a2dd5d306c4267e841753a7487a7fd7455c2", - "9599d05d05e47bc7c98f1ce41bfa91ba1bbad30354f66582eab9605beb2a9459", - "3151485ebf065e21441fde03221441b85cfb9b30e701e0108a13197d32aa5f17", - "e95c67ef6cbdc8821f1570ed259e1066dc8d8bf37a1bf3f2a6bb3a447873e41e", - "b16be202988f0e429a0ab2c6606ed07ef7d933299689256a93e6fde7a96c9f92", - "aed487ff4c1b60e59a4db6e7a0fcf47787ba7256958d9fd7a5e1b3ca632ab5a4", - "476e359809cb6fe6179591362d2ddd20152623ebb4a089d16a7bc24a302303d3", - "a8b30b375dcacf8016b41142b967a548b1e80c74f6a7f28a388dc86fa3f23d4d", - "971a538cc926dd2ec3c5a556c71a56ec701df879527dcefc5fa3e8ba86bad7c7", - "e58b4399ce831aad818ef2447a6041dbd70c18f03919513cb434a89d04a51104", - "4cb6657118bf37fc766249a8fb5421baf7c845d7f691a2838b941232ad4932a7", - "ad744718889075920ff807a02ddef68b701280792b80d8808032b8b23d36ac04", - "115f32fac35a3cd93dea7b0993dec7f4e0fd7c04e73d905ebc057f71d4eb3572", - "90e326d1d595da60164fc6368b1412e4dcde33eb93b66d8dacd418645d140298", - "35dac4b3ac331bfee4b7a27ff6b54dbd22e85156b9f7c62bc0f77683d14c482c", - "d2da3842f1991baa4fcfb6adf05ab5db99776c4e18931b0dfd12784bb4a53ec4", - "e5ebd99e48c8ea11b39ea5c4545ce3a15d7578bb5158536e4003d7f67a422158", - "11d3eedb592e5a3d34853e47e2cbf67a2cded9f00b8a51ac19fed929b2f24d24", - "52dcfa61720906e7fdcd3307fd4f2f39c45a66ea95a3955684e014f085468629", - "90e9c8a21752ffbe2f4c3509fcbd6ae1536a45bc453dbeb1217abfbef96bfb06", - "bcc58332058056536f29634c91115a3010e080692c73075dfe4609130ca1a4eb", - "f9a46131d2b5e0a83af69f80bc92123ec0047fbb155860cfda29e862f5bec7e7", - "a4711f7096f0e1ec027ea2431eecd3c33c35cb17cce780417b9539ce66103f74", - "6ffdd33a87bd02355d63cf49d3bc6f4286631e41eb3e57de913e8ebc8caf330c", - "9a33ae3acbfd8a0ee8f54c903eb6be70ac0237b8e857895a9138bb7428094846", - "2369d472253f2cc5c340141da52b7f8bed2ba42295562c8280879cc7d0b23c08", - "4fb61f60f6eebc6d655bafc8ddfeaa3d0ab2859d9b671347e2a83c0cba9f92d2", - "b221ea31b50a5b010f3be5f56310d09f4057044e4203d158b126cbf9060ed379", - "7918422337d20ab441c74744e59e37c4dd27f4d7de34e832f72218d10b9010d2", - "cc5808340a491ad2a841d80dac178e0addc0de14f156219e77fad094192cb2d0", - "27099df2a33831c775e6507bf785f0f581e6ad49be7ef63bf2225a3de39510af", - "d93c5e315637dcc1137c8856dcf927e61056d6383b85640f27c839bd4c923b79", - "52ba9c6e6f25b3abc354d82467ab2de764fef9f4647b1504049a119a6216ac92", - "7d0918d699c327f115527b78e037add7fe131ce02beb02ea3feda604c1bf441c", - "3e04caf98e617febcb64843ae1cc3a21df6ac8e1dca34f2239889c36a6a0d8bc", - "a5244a4a810e4a01fbee5c99dfd6c2f978ce0f424f4ed5a6e2f60f96a7045585", - "35cecd240aa6c478677e11d8ee3826cb5bd931c7e218546c9ee8d858b24aefbd", - "bc42d8e3e3004244ce28414aaef4980612b44f6bf243ec36b4d76029896149a5", - "8f55a7dd821492ee00623e45138bf430552459e65797ddaf90ce9b343d410618", - "1674c6298061f1cf742c0164eee941460676f49d8c27ff843ccddf5085f11ae4", - "8cf0c3672fb139ae362e5109c49946b1fbe8efe3f0d1b497d3ad17ad86c6e3fb", - "fa6544a7975cf9378213f9d6ea48eae2c27a9726b4c9d641485950816af77d97", - "47f50e3946085a5d3ca2360c491b5f4698a56aee6e3f7aece0c1af246bff5f3b", - "86a9785de346357ea8fc440cc5bc42df5874961fc451d167784ebc9eab9795a0", - "eb0403ad61be03da4af2eae04768e5ed814a3e6e335582044e2d7418ecd8a279", - "4cbd79700a845cf222eab5975bcd4c5841fe85e57693caa5ee3e64c1872b7d90", - "de2688edd720ccaed43426c92c8fe70a099eea8a6f543b3a0e0f43db1d81a725", - "fe37059ea4f7e13f8572074c5a491195e4f328e7de6f959c688670991f0ee65c", - "fa36424c50db4f6e725999560891630519eff99000985ca7cd702cbea1654a13", - "aeae157b4dc866502bf90cb9b8bd2b3a80ceba3a3df736cec76a4db5a6109209", - "6d94cc5b100b9d291cd244040aa06d3495daf10e06b80ab075b746b15aef1e2e", - "c11e812f71182035342d671562856dc32e1d238d920491780223204af197503d", - "9eaa2c7c27318cf7c1771a2901b9bc03c1c16fd6dcdb21f7bdf14c56f586b2c8", - "20df45088eff483f268bffa95b511da7d076b960f3c93fd8211ccd5d57facc5c", - "a61855de93e58ed71f3f132ab2e9403e4e1695ee865680244d7d7c4f06eac351", - "216c02f4cf960179722858763ee010220927bc68c037eea73b36eff813e8209c", - "c70ff35010fd697fb4562ca8a41386eeeedca7f90ba71163abe30b8c0a5bc499", - "062858ff4b15d4a1d59f1189b7f9beb730145173053288be31b95e27e6a96223", - "38a5022b98fcc16a5f30935fba2ff670625a7bf234aa34b7c0d33bb37e013a23", - "2682a25d036f9a4ab0389bf4b0974226d0895d8f0abb997053f68fba8a2fed78", - "59618bafccb22f43819a1bd4c12d813d1318e5ad0a3013ece536429e44f05447", - "b9b43a9e05384080ea8632d610deec44b0c62e0af42ce1f2077944bb912a15ec", - "40129f16999e00013ed79763a5138148cf3a764fd29d18d87c154e840f8ec675", - "4ebff060d6505750c0b243414b5dc16c4a4c871e5d4a673c4942043e7fb6e339", - "03b902d97cdb852f9ebf89eae579779251994ef257e23013c377230f5749c81a", - "623ca3d065396c3ffeb07a78c72ffdab2d22761de443df4ebf78c1527313ef1a", - "3380e6f37d8529a112f4a65b7d99558b55ca009f3a98be869beed2939546fb20", - "823cd9e13578e7f669463c4b09b85d3b137896ceedb297840048292303fe59a6", - "8e941b0eb7a943eb41f6d57b9045be95e0485fbcb3a6f87c7bbad7600321e275", - "ae3b7553ca3432957e94ee6c30a4b0afd5c97625ee8e3f0270fef98fe2d031ba", - "152676c644244be5e16082072938848e465fb87e48935df0628c3ab1583a6799", - "bfcde855ff95660d7b8f2a85783fbc1ab07f257693c67a7a5e673f902cb698a9", - "d0f92b21d250b15743a7d382a66c5dd329a43f760b5c122945c3689136a87dde", - "c5a86b4215adfe0abceb3ff34f95566a6b33d20bd5e6e2cf6d228d4ebcc2217c", - "df84e2ea24720382d933f4ad9a94bdd03abe2f55be1f6e7fccf2980b90560599", - "2467371b0fa69d670553e89a3ce090bb104d806c2e0615e2421ce619cd3a9519", - "c509a7d2d8a4a8ca5e122b39a90412fb8d64455e0ce340a198045bbb093b529e", - "413d2f019e5efc8a7b102bc7d1a235ec0141aa4dbeed45cb13a146e0e903e28f", - "6c02e0052d05b9e6e23a666af0d3de0406a98b309ae937794cf084be3e310001", - "4b46112b816acaeea5fb0e34f7f2626d5e130bd9813a3bfd98489e16c4a1bc01", - "0542bb6b31d8f6651950875a32c1f13b6752930ddd9d8b95c2b3da6a25f7c16d", - "4c9d1b3ac275ef5f0419f53fd93d84c32a4a2dac46cb8006fdfa2117d904a8ab", - "ed26956f9bc6c4b23ce1eb839a68ae3f7f17764a44d54041300a86a053d525b1", - "00c03123c1891e182b75f65eae917f80d64e5782891fa3d96707fe9adb86e5e6", - "356b6fecdf46fade42a0f815cb9e80e365ff2215dce6a2c5acb96ca7987d5269", - "83d3abf55d921c44508676b9b630c3ee3cb9913e8a9816b9d1b5344dfa2734ed", - "c160ea7baf12e1a4039f8dbdb8a1e9e741c43e0af9ecf6c506ad38def4bd66be", - "0baf1ac53526527feaf406766132e4d40a63f66bfe96316d84f4f36c0b881ba3", - "11ade0743b4f7ce46ed3ffa238b8a944e7bfc911bbf583aff0304bfbfadbab36", - "aec1992aff2a7fcdb5a250fe9cb9b1aa7fab396ea758a67d1dfd27edf233caf9", - "64ecec9fac9c657ac17625f26ecc2135e4b0cc0ffb1e44616b6c204f6d54b138", - "9a67a2a3a6c902a3200b88e128c7be219374d5705141ddefbfb735b77c9256ec", - "25e36a9ca5934d92c5d9cae5539ea203603dd2cc4731c42264fd96d2c84ae859", - "b9870efcd6682a904e7b2183fc6b339da9490a3c41d7c03af3be8ddbd9bd9752", - "deada6aa80607f3fd877ca16f022d1b4f0f789cb01b825d5dbe9608e2b1349ae", - "8578287e10c4b086855d0cff03826b63e48677911703fecf1e1093e9f786f42a", - "7506d43b38d3863bebf5dfaefcc5f603459a091ba28031fc78bfa68ffbcab446", - "27cc229c9df77c1d15331171eb5143cb1846a835bdff5b1c33b7a08c0e1b81f5", - "19f012657551d620cf10265d25e3bad672a533a76851c35bf0aae4a175e64d9f", - "315dd7acc8bfced172e53de08fb04711345a38d4ef78b5793b7c97bdb4cd0a1a", - "b27196c17c76737bec70ddc081fafdb966f12c6ab5f7f9468640f97e51f685f1", - "162451a3dff73ab76ba697368ecd8d372023b874a101f54eed67cd91f0f6a4ba", - "72aacf76c4f18a21c214166a5ffce82bb658c77a3b0cee9dbcea070aa3bfab60", - "ac6431b21a4a394c4121d5ca7fb571b5d9aafdd0048e1c99ab66cd8e2c3028d3", - "666bd90163f7e289d9e47d8c132cee9ecedae8dcebca3c6005f5710b82480099", - "b66e118c0733c7938d24071759a862ab39401e7581b58982ceb969a4f4237263", - "ecfd827e7d985a4b3c642fe765bc1892dd17cc3558b5385b8beeb6eb93ca1ade", - "d2bdff50355f266dcfa55421c09e64a79792582549dd3490fef1013e95647395", - "dfcffe531164ffc5b7ae96ceaee180444b8bab7904f37535390edfab69788170", - "5262cc910dbf9878667738efa63a49b628327a79298bfd41d58463a9b650ace4", - "32fb71b18cdc625f1ad872fab6456640853a43c510e73aef59e2efb37c53b81c", - "32b83e31133774ab64066c72105afb6c588280b977e3b54fd6fa314668dc8b8b", - "fed259aea8ce491e2bacf92559cded012932fd49108deafc6488a069cd0adbce", - "7dad255ebe4b499d118df4a4e6c3ca0746181b84fc53abe6647828de4863e78d", - "fc56373462bca6b19523d21688d8cf60e2673d4f3cff4fef2f50d492f810bfa1", - "fe127a45e512038627c7c2b1d1b029876cae9f41cad9cef62335666ccf093352", - "f08fb5c28f7f01d0a1237e2a72c3f33e31e44ef50500e6f54b5578f9f94d7ef5", - "b99331ca9b1642cb02b98d99ca1e91d93864047925961c47d954c0fa2bc65546", - "6e6d2d339d265ed4fb254760e22646a0ae0f5870b20c5550a45cb47b60340c41", - "5d79b4d059880f518ea087c92b2ee4dbf49b741864a1bbdb212dff1f70b852b3", - "54f3452fae6b90319c0486f2cac663dde884a5d52fe3939e149d1a510cd5c3ba", - "977ed99ae5ea901ac48fc004f07aa70e9904bf947695d711b8bdcb4493f689c5", - "918fa99e02e618ce1be7cc79eb219eb4adc436211da1d190857f2044a73f6136", - "9ef828a4c96242c08cd2edbed59e9bd8f3d2be3c59ffed43fd7a98de178ce6bd", - "66eb2601fa9de0363b2a677ebbbce59201f398f3c251036a57132cac4abb208a", - "4080cc86106a309a9a7356349b11078af92f5a1209f3436753a1114a0f4e8590", - "2091fbbae872596b40c9006fee546337f073aa479224e8a0978057f0577d1ccd", - "3b7c5c4e2900578b0a833fcf246394bb27a4169fdd9dfda6684ab3d1b5352372", - "778bba71029871a465dab9534634086d626267b2358e31eea126e528be173c0e", - "8a65ae3e1f96d4b1bf346a6110190f72abf243b4fe748ae52ea7bfd309cadd07", - "bb416463dee655e6ac6a9f4dfe3cbe81bdd1b07e4e445d4ade7811a0818d1d6e", - "9323fc6edf5d5d308bb4f5ae490fecb4bfde9304b0cd990b8d367d1cb883cf50", - "c6ab4df552a21a6c0a19b4faf26279501dadf3874f0ed977935505415ece2ec2", - "2ebd3913deb73462f9d07ce30c5e5195751ddda45e259d09d50dd63edaf3db5a", - "2251a0f402522863aff8411c33eba337c016fd64c0546aacafca37d9c3b99d76", - "059108a95c88b4971b4f49620fa8c1a262cee4e69c37e74f00c6f07efae70a79", - "9c43ed9fa70a1b0dcbf43c6f1779009ebec1c094a9e877b1e7272ceac51c4d4a", - "c6933099f6cbddfb3e10c55ce672b30826636d19a3796e8871ad689d9c5caa04", - "dc83dfd02f6d432c0f264717511eef01eaf03268374ae3e4611d08707a52e7ca", - "eab01648ca4b956e63b909b35daf0fdd08cef54daacefd59c5350fa0a764a107", - "c49dd9698d9235946703730cd55f673dd4291ae3aac2c12a41db88d4300bc3a4", - "3c44bc44cf676c309bd345c1305b34be7d29d3bf2548cd7980716ce25d11ff5f", - "6dca00116108ac7a48f42ae968561e3748cb379794c4507ecdbc8e3f7e0fd015", - "410703f9dff3df134d243c5c9ffb5fe10ce5b7bcdcf2c0ae93f787aef911b0be", - "a830d30aaf00fdbb724009111fe4fe82248461973467294400a8cb8bf39aa5ce", - "1fd84976b6c06c7b50ede9699dbe3bf7c69712cc164003825316571e4279fdec", - "4a7577ee2daa5f1a4075ae6f37e052cabcba3364febe99dbd2b6f56b47de9f1d", - "e918aef12c9fd6d422c1fde992b94fba93e4c7924af6437ab38b74cf26c78405", - "aa4dc04b02cb2338684dedf09f87260f1ac7b0d26fe3de86f85cbb1535d30ac0", - "549025bcc7ced117c4db991900afb8c4eb67cf9d955e254a5838caab31f4e653", - "a406b210af14afe82ede4ec5caceee0918714b34222dbfe83ca55cc65c24e3fa", - "2e94dddcae28e659722adea28bf4f88860a77b08fc51c8d824e4fa39e5d9e75e", - "76cdd365141eb9944a8c50f248c2c9d1e66976a37f5848e2abc7e33cee92e7fc", - "e3292b4813364468a6ddc3f344d6e33c259c9219ebaa1e059e3675717057d9f6", - "a7eb2402eff08f203ec4a93f4cd0558379778e5d61849679710403b597ab19c0", - "dac81e5c0e2236da326c6b404b1420efc9d200c2cf5316a335d9578f66542ac7", - "d17bbeb197753c6cb05fb23d5a305e17e667c6fdad1b7d3972dd5c09907824e3", - "45825ee0d77166d99aa48446e858fd0db4bdc309f88d30a3df7535872a836420", - "07add2965ad84b69d09c8ec3a3e8ee087c61690e9bfea810d2c650da99b3a36d", - "4290da5b72fab3fd46e350a6ecf9f14ba450450b4da7384d51d834e40151bb00", - "8c654bbf159b88f79b1054060b52af91d3cd4cff9405997bce1192deed15c31f", - "6e1b5048cd7fd2e975c1bad8fe0bed3a988b9e15bf39739ba9db4d9a2d64209a", - "64afcd64eb0da81a9a4c8acc5f5fd086adf0fe007cf5e7f0354a7d691a5fe984", - "8cd00033e860e06e7865ed7c1882418147711661d252d330f243ec33ee21d1e2", - "21651234077026f698fb3bf0bbb89b1ba3c6c9197bf4939f9c420849c2724eb8", - "42d46286ad753f0fe383038cc1eb0df8e27c46738153103899c9c20ebffd2dce", - "8cf8e767cfbd6788f790795809d0ab847b98fa199c280f76f2414343fa0455fd", - "fb8c857203f3ee6d0eaa9aa676deeb106b354cf79605170cf68d15dd4974c03f", - "b5f40488c1350f3e83d5c01833a48a7fa8879515c7dc7fba30e633f76ff15f50", - "549de1fbc60bbb4b7541bf18a0e4515f4fae362582a102ca1ef2634210bb49f9", - "e2fec30030502f12d8325fed0ef3e1b01e186f131667a3061ff5e822d7898213", - "d316d5e938e16dae4886d470806be7983fa3f176f68d7166b8c0dd7eb8f46a21", - "7c74bcc9364a48207222b3591039cdef793266a878eda4f4e2874a39258cbc8f", - "cecbe10ed0e09d6396e1346c958eb6fab4c7fe2fada4dda961bc389b0ff83f0d", - "ce61400c97c6ceb67d927ba253f71db177ce04878f964323bd2d02982208ffa6", - "fedc476e96c34154acbeca2b326e8f0816cc37e55db7378de2ba3aa1713e0ec7", - "0fa4f9b38b1df945e79c5bf9e29bfe1f5501944954411476f462d0364240b537", - "d7a40e0d7b981aca14258391b13d13fb43177b8d2b3e38da7efe4d773033dc02", - "65972f5f6d6b210725e8c2de17a1550789067039ff7a65657046146a857c5c9a", - "007f576058f30961c8c2c0281e500e2fb272f704a58f24cd9fe297fbac28d995", - "99999e2f6ffab2f06d8bc38ae268cb79422d2da7c087a0c9c980bb89c1552806", - "7d9e631f10570b5a197db98dda341bafb7eb1b3de7fb0fcf188637a81fb3aaf8", - "a0f1e7a8ec5e659b32cb0e07642dd65f8c5b346454dba5bcf0bf2f3a196d41d7", - "4222065c09f20222612370b752e1b4e98a0450f137884533edf4f47fe82a63b7", - "b0d983134852827356712d64c75fe7df4bc1c8ac329ed4ac5e98c06d5cfe4cea", - "34ef146214add2ed6b08f95a9beb2bf0b26c50ae0ab34c237a2164e00cd65d2d", - "6481a4b2243e8fb59c4681d7e477f358d672dd442ac25475cb1e1a9445d6c168", - "a0163641f054f76361ab96cb26b8b133ec64059a1b8cb0c48918c1b18f9ac226", - "9b461bc9cd5acf9d8cde6dc8fd1ff47f65814764c87d957844a9829773a09b26", - "da870a7481bba0d212f1d7c5be86b694b2caf1bc74694f19a18e334533ac948b", - "53c4d3bc31111c597e3d9a5e911759571230fea5efd7939913fc84ce5eef2a14", - "b7b2fe0e9d50764c50128135cf764ea19533a2108a8d216941bca0c001384ee3", - "57ad45831e311e8d7ffd2cea6a772b1c5c8e29868a9491241ac2b10376415800", - "614971eab5d69571a2fbffbb1e90dc02f3f85df875d117a923c3dd9edf6244de", - "411a6d02f729520a69481826da08efd538af83145f67b233dbf39d965187503e", - "b93e3bf7dd5fe997768f549bef02debd34932eb878f29be1252d1f3f9aa36a6f", - "532b4739d7305596dadabc50592da2b0d71508d3e4153aa7bfe624774db33be3", - "ea0ce1f3b1961037ff8a40e1e0a00caf7274cbe2ea32642f0394e3355d0176d4", - "c3b24c19a0f462db1f9906f018c1d1407be3965fa9aec0efea1f8125ffc579e1", - "97366d46a16a5b9d0bc92fbf53e592035942ae9af119103d5b8a7b11d555f08e", - "bf778e1d70c68e044b7a95208e469e4c304059e3e111a54bdb7c94479a1423be", - "02d09db767e59f5b3b90291a6a5007d2c00192e23de43e5e0d4b081319dfe000", - "ea8b6566c761e18b39e105d7a9a099e997079a5adcd2c06352380ed36d7814fe", - "e891ec4d61ff28760ae2afa655e374c0246eff82571cae3d771c466472f315e0", - "0b13ba8c0cd764fb2da725d7c6594969df8787c38954f4112ac7c7b90e5af9ec", - "33ba36804b0de561ad0b74b4c5d6a841a4bce8a5990d9eb0e54144d4aa8cc4d4", - "dc882b010b72a6257216f53a0d62894525e9af881e97bd08b80bb5461a45d3df", - "4a1b997727790cb24196e38c9d14e7aa49233511016ad026407daffca58eda4f", - "c9a9886c1bb9082ccf71f215e2c5af6bda99591da6d04425f651171099286ee3", - "00caa47f8c09d3828c0b523b7612f74942b5f8e4d9adb1981c2819bff67c95ee", - "a9593a22fc14775662359739257831d02381618cfa8d107b9d98c77f533bb2d0", - "20cf5c653867420a3011a2c23e2564241c0b5692c203c9a1b8974bdfdfa4259a", - "6d4afe7412178038de713f38555101731fc41ce64ec2bbbbed4fd7a8f88f754d", - "eca295afa2a15d64fef91387c8958df4dfd9d9df0ea4dddfe10b32af290e3b36", - "f1efbac82e37d03766c0012704002edf6296d76e139b009fc22a6802b0b0e94e", - "f98692f67814cbf69d98927994bb852775213d8996172a55d8aa72dc3566dc4c", - "86fff4a68dca657a2ed9dc92528753769a47d64df67e233dcbc9ce1fb366f1eb", - "56f3f8d0da436c9288254cc4e84d27d8df7e36ea291a0aa081e72351cdeaca7d", - "baacb9736ff2b11c62e26ec506a9a447bb3a7b9ba01eeb95153496ed0695ee1d", - "d396f00979a545a905a91d4793caf0f3212899d2fa0056831ecea4c5296bf0a1", - "ba0fbe10c162c3cd6236e2e932b29dfe51d663b4f12bd057df90d361f4b70d78", - "f14560149e649a7622fec7a82673c66a404b45e517c898d7599f3fdeb210e99f", - "54d60ed8d65a11a4e486aeaa360a97221c38e0dc961ffb460c5435789daf28e8", - "e9525a8f3e360a259ead5826cec5a67b9ecc766ca62c21066a8709e1943e7fa5", - "22de83f7e80d1d6d6a61fa8870b407d0c283b896adb581866e883faf947f3e96", - "ee6b4d4e53c706642772d5094b487251a5412942bc9efa91c3f4c50f330e9800", - "e8b9c682774c0b5e1c80922965fb9aace1fafd6476b4c81dc25b701619a30a81", - "865b03da21ce94e2dc96960e6fb3c13455c25e2066fc06dd57920c1087c1a948", - "68b1be14f5a2cc6f1b06b3eaccaab0ddd1c6c2edc051af24326e1ba7f3eed88c", - "5e490f6e643af86d0325567610b0199676e52c96b24eeeb4fe79e0652d406a39", - "4e323df34dc6da2cea17da8dac6a2e42a5f844909438faa2399b853151f8acbd", - "3b5450f50545a4609bd1369336d90efa2e919cebf82752a9be7f9c19987226f3", - "168130515dcf76fbd6ca81b5881273d95e6aac9e4190d358335a2e88222f56cd", - "d40e5662534e0e548801a11c2b8001a7fc74896254b90015ce5c505b57a4ae2f", - "968eb356037bdec78340a4f92ece73b35fd02c5778339465778125b6477ba68d", - "188d1c4cf54284373aea9fd83b7e94c5e77de64629ce986e401c0513a8018bfc", - "4e768cc2c19b051233719cc2e96bd3a6e34def235aa21171b89fe818140d94fa", - "c7eef0dd65616ed8f94853a6317cec5b7d7d95f74fff0e5b5fb4ff8ae5532189", - "8e62472bf338855210be1d5f41c8e8cace55c664c591e6fe8ec96838ced25576", - "aae8fd0c77f96c399345f35e08066b673027d79d08d8f07914b7b7ead145329f", - "9473159056c1f52ac4e542737cc030723a5840a260769497cea9850bbb179c4a", - "abf99d69c21681b621626e2d9f91a3480a5e1a272eed10ba9b37493175d8c0d4", - "7f5c34045f080e1bbf9163d375c8c1e8435fbb3b9d631ba5bcea205763039060", - "0fc1a177ac35f40e8c383d823374cca05c2cb4273997926d373d6f5ba1fef5eb", - "8d38b41a5fc28e5120c1f83561044d8b78503c570208a17ad436eae0845ca565", - "badc662c444d329d714b39dee19fc2d77220e3a248460c00ce95b4933e7c18cc", - "77816a03414a29d8212244cd2ba53aff0d00674bc0af7ee21112c6f5faf08903", - "0f18b6d2e9437c6f13342ee826e38590a0fc652ba97b841d28f67ea109afa435", - "1487ebd68abd53f38764e38083f889eb29c61ed0c998fa653af3207377a2c7dc", - "beda09ca19d8baeafbba346ea7f2b5503747f4bc93c93b38bf7780a1b17079a4", - "21ba0d0a9cbec69264d6276ee464704bd0a2a7ae8cc77c3767181e091a21ad9d", - "bb7a327177f990b085c16413fe2b6224392d5a2c69bfd8d633b75b944154760d", - "e1e0bb331e551e1361a27e173f8e6880798bb6a9223f516c53cecd4403058bad", - "56f74f97968991591b23b259392f0f60f0449a4957b0e126f7182339dea24943", - "891e37391859561e4a47dd5103e0b0aa3ca00a048c26f59cca56b77173fabbde", - "6810c4d75d2121fdffd4dea650d790d21ce44d88ec10e9eaf036105455dc761b", - "5d1d98dad094a4e07e42b08f49ff58abf14dd305451f0d551df832828eaaf1e9", - "8edf59cf35d1f04714090822a2ecd423f2408edd6fb390a2f650334085587e49", - "77a9745a8e311c762ee03380e31d682c8cf7d6a90ecc9f9a38f0af3c25c6a03b", - "70ac5340bde5ad031bb6b4c428c64de5c030930986d5d64687ba79f8758a1a73", - "453ae4f424cdbbdfd52f95b9576f49cc3fb3acc78145bda166de72afa8a02dd3", - "f9498688615327b5452d6b5afc98fe84c78d56409fc77cc049199255971972b6", - "4fa26d90490a7eaa12a7c09246a30870dcd2eb9c3c27623d51cc70de238f26ce", - "4b8c65394ece42e394c041cffb210963bda0fece54c32dffc524484735d8e8a3", - "5a706c7baeef46863947da069acde33207cfae81aff04d9b2ddd49b5a52d55e0", - "1f50e0768250e2d83b44f4a6b3281e212b9235314f766674403e1105712f91e2", - "cb0210ee50bf06590c1a8936eb2a5d0b57161ac8c9cdcecaa75c838f916fe6c0", - "4172e17fcc8a86f479357de2f215d48426404a6b9dcdeedc70dc45405623d763", - "c3ae81522dd98ee22ca026adb05ce805d88bc8adb5513ae11cb4100375e21f1c", - "957f7dfafde7b93f6c2f17a619257fb5e0be0c4f97c8e97a10455605f7feeded", - "e5941cfc0300ac637cd3cda075136af893f07cb3c632101a6f12f3bf48af14e4", - "6cf7d101ad41f9b6ba11f5a422689bd99a32ad6294f9d9a69a4e6a3da1c31710", - "d3f43dc468d543f849af8886a370a4f057252427016162b3e8d6a9f1502a2b45", - "caae8566537b265f2b49defb6acc9f6d7fbdc6cb651e197b1cefe45dcd7b2b54", - "24dfaa3160c8d2cf779ff297765fa15ac7ec1a722ce45a815178cc9ec64bfa2c", - "136ed7672b64ae2a3f03fb300a96cfafe1e3a83fa1e5fcabfc39a186619199c5", - "0d8b083d09202f093d5feca7b93b984cf586412a55961a5bb811938da2f93050", - "fbf3366e109f3b8fbd184f5d8ddb700b360e445da53bd779212efadc92d94244", - "25d21b34afeec7594545e6f19e3a9c2b857106911a3b117c4581e6aa49aab3a8", - "ad6f539e31e18f2477a1b470efb5d12cf57f89ec742f0d293f0e971480e13292", - "358b7ff01e64331d5932f3fc5a7bd6e485cb9138fecb7cacd3d45187cd7f7ae9", - "20d6f84440898bddfb6434ca72d3b3a6e655efea8d352eab3bb38c6bbb0b70af", - "984544a0c5ddf5b6f8524584553778d90f255156ed15ea228c14200da5184efd", - "18086d5d7eab6628193e8cc515690382aef01f02bc77f1953e8b6e0fa8de94a7", - "46360768decdf385a6f079f384169527678be798fd11daa49d90e6f940ca2ff2", - "9d7c29633a9b304c53ea399652e0eae1f4181124e8c777016233654526f47457", - "b4272680169847adb2d5d1ce03a09de3c1fd86fdcc3aa94b681eca0b86247677", - "351adc461951268045f42db2a362a9dca94b50e1d4ec0b870c7726f1c32a8289", - "7ab57c12dd005cd8b45a4c8a66e5352a58c76acdf0689621aac6a498434856f6", - "3e6bc1a82f5499a936baec4f7d0f8e7a204e82b1d3b9d2230badf0103776efde", - "a55cb11a0f5241d81af45792ed0e02da0f217e68557172ea410109bc10178930", - "479b19ee7e792ac2a63636f0dc350e296f43cd4f7b1e0c5b93e535aa1297fc66", - "b9c6c212530dd507548ffd021392e7d7775cabeaf7f6d88f17ccf69bae4ea9ca", - "61e5f526734a4e0da4b3eab8d88071c034ddf4632c7dc5c9421ee2f8fd2cc953", - "f94467702c458cd63a66ce767ae7af413bf52120c514277aa0bf52fe4b4a1bb1", - "fc1b9abd66a879210577bf33e830f0b4184576e5aebd5152a178e3c5b7331a5d", - "d55c6091cb2232060a0e89a329f2b06ea7ba94258d89d905ff40af914ab1bfd8", - "9836c4517ca4f990365bdccd4248225992e2c77e1758afab52807f0acf01a27a", - "732f2f11a9ff21bdf92f5659bb5ea6c824b6103e3cdfb852550ac3f8f4bf2267", - "a999358575134dec3bd567b7d3de92f59e7811861c3e11bf50e2c56cb558ed7e", - "aea61f932f667981180b421cbfe595cda006bc4f749c9c71805fad74176c38d5", - "0c336ed48b7762fb7a866d8afedf620f22015dafbcb39707116f4d1cccd39c0f", - "048af9065b69cae33ea08b1e26eff6a75b6e045ba823b49f1c274d8401fdcae9", - "91278bd98e08343a99e0ff6c12aa12b0647d15921c72f37f888372e41e8f746f", - "66a146236f470b6ea953325c04ec901b3eafa34f8079b30dadb12dcdf3e45e56", - "a77d34a2a05e618af74115d2ae1b8cd8c27201556e434f5fa415efaf888d1b2d", - "5f1b965833a1fb0a5c7b5d1bb6ab661b7909ec06a09eb1360e4b4a75aba1766a", - "c96b8626b5db6e1211794054b004777ac4092f9d97dc416eb5e5f4f38f6804fb", - "bf1f29f47df3f11fa1d06beace710786c53d74c5d716190520a7c4fb70b4a522", - "9920d5e81e6d804705001b68717585a03c94370b45124afece704ba03b0257c5", - "15026d27053d941707950d6dd740da6158a783035ae52c1f62cda1f9f8cbb0ba", - "ba994f42b58b637d0cabde2ca8031d8ecde6a38498367f9df8f38adcb4faaf34", - "b49fbe4eb0b86dcef34d17f82bd7fc054655f7985516346cc206652a06338b4b", - "bb91459c5b1bdceb2efcb6b1294eca208577559d659258daf918ac58f699e9cd", - "3e439eb1888f9b255e7f6595250396d4e1ebbc97d80807baee2109ffa15bd6a5", - "8e37fab06011c5ceaec25b77f119c2b7d886bf329d685014e12718feefcb9932", - "7de4ae059b4eb933325b7e4454d3f750d192adb2ceffb887d0acec8827540ff4", - "d3ebcca38d3132b7f091c2b241386622709206ab81aba7ea3908fad4925a10fe", - "f1f9144c47cb2cc84001a660c16c508c4311dc3c80d0db98427a33f8873ff630", - "8c722cb5793ccef150e1587f4a6e2a2280fd961f0d6d452708fb1fed984e4522", - "3dbca829782416490a75161c8502bedc9dcedb9f0b37c18f64b736f38c7524af", - "4e6a8c66fb349f24e18f131de30730688db2401d4e49ed83e99226830ca806ac", - "560345b327edbb29f7676c0be7d0a9a58c1739d3fefc4763c7cfdf3d087eb61d", - "a5b52dcc2e21984409e61028ac03f26f71fbb1d8d6b3bff9c0e8403a3d42a703", - "ad9f35fdcceeea7f20ba1b9b6ec857e95f06507c220d953901efaa5d1eda245d", - "b4d54dcbdc7c8fb8c79bf6d7f427d7b4c8cc3274bf30304e1b0258dad425adfc", - "348804233490c7e68d79f033b6d6521f08b51bf210c96fc1e635b3c06b330f09", - "7f4fe7ecee1a5f42646c87826d57f7fed4824b97a5d6d73cf2b37e0c27567132", - "fdafeec98138afc3869d8c05f2c576bd1c36209f355dc9ae8d2e5de81c64c17d", - "8f3adadc87455f787685944a50665d45141f7b007b5a667de79b05960e1aa633", - "775f02bbb852427fd2ce02ddac9486f61a5515bc8fa52e631a99a7961ba754a1", - "82a52fb2e685e4eed403a408d4c13a69748fb8a9409371a2268a96ea6c1ed303", - "93bab15a155f8435fce13994dcc2702acb5e85ce57f518188c6406b5bf07218f", - "33cb16050a4609f3a9c680215eb634cbcf3139826892d419fb6c61fb191a3e8d", - "1885b2c7476b92c2d966ca835ac6abbabef974192640ec8a76772500ed0d443d", - "818afee043d6c35aac7df1f10b166cf3d763d0700ec1eefc075374f820be6d63", - "cd5d93f067f437f5d84d1597c9a36d948e221c643ab6db96e9f9ff6ff9593c02", - "33a4fda46bf184e62b935a3da88cbcad95bdf908d2db1d883d0c1470a59d8c9a", - "8919afc8a8de44b118c680b61df8122cc1728511fc436548bcadfd152568c93f", - "fbb741b1ddd0dd82629623bbbaf3e5be8cd8714b262cb7a6185ba4cfed523c70", - "1a10fa042895e50a13cca6bf7997339704de1e87eb2e2b36fc79f39826dfa7ef", - "65c7c668d7d908437aad50e44b756ad575d1868663db605751103b5893af9d1e", - "ab68507964c665fc365fdae7620b2ab7ad06da1abf0ea5c94362e7c207292754", - "2716f973101a6add0ef46a496156e4aa22562d410767fd0ffffa0e0a418f60a5", - "2918ab19658ba41b7b65d938f53ab6a7253cf2ef758b90c90bf53b4a578aa828", - "94ca784c254be739b172614808218e68da7b3656bfbda6e7d78d2d6c9831fdae", - "3e130eed00c318a087ad6b2bac3824f8b94d73d271566f78455d5e2fe81b8a27", - "d6d0a1b4a3059a1492214eb43599dee3e063dce427656ccc7378ba121fbd9021", - "755b3077d5ed96e03cd785b146aefb417bf05d2db8aeee4e459295be3519496d", - "e5e21a5322aa135d086201451bc8d90fe864625b8e2bb319e89d69e2ca316f67", - "861d833e9021fc4b84361474781b4802d0417ec12c66b15bbf55d6617d9ab0b8", - "13e665aceb2c2a3c0d4216b5d0e4e10a8b50e4cf6c1841256980873fa610f04c", - "3c1b967552a27e4da3d0f18bfeb4535b8027dacc5911fb1cabdac2450ddd1d54", - "38d617cc31ea329861856eadae021df412ae85cc6fdcbc2270d3b2656fd7a43f", - "30664aaac7b6cf0615f1fd1840d9bc3e9faca390c41e50fa24da7cd12c99456c", - "bc94a2799754a649ca0b59a6ad8625e599c55160c17f9e817977e20b598cf028", - "3299e3a99f3467379ebaf5c512421c344791febd2518ae362bcf3c853d00f939", - "3072db9ec2230fecc07575690e277d0011e4c8e8502b6882915098fa0a1f62d7", - "8d2016b5950204e25d802892adbc3a32e8e19dfdb096b8352035804ed82949e2", - "7354bcd51d047d3ba050949f6a9c7394215cd0f3cbc258d1c0fbf0831dc2a300", - "7a4c7a158c1ef5d98e54632770455502cf36caf6bc4aa89af00fb19304d752cf", - "8759076b76deb29b6c8eabf0de43c53ccae0ecad4015bc0e964fac6a0bdde9b5", - "32b574481802604d7e4c41c149a79e02ea910c2a8fad24d076c95597e5ba1d5d", - "d9058feb9808d4b9b4bd2d7dce2082ca4a25e36f8f1f71c98e1aa85fef56ab9d", - "f0b9616194f6ef0f6c4778ac86cd660755516fc34c821afa4e6ac0b58bba153a", - "16adce3c13e2b2f96066f77b572b5cb41e7196b696549740b7ba7cc5f8dcb71a", - "9b6a5b4a6b6a299e8b9990944508ee9adefd22c5a8b294b4d7329a7dfd991327", - "42cf3e52e77ec2a000cd4281069ff9a89e2507352b8a35f1f68d1f23618d4349", - "79e880723e4ab742bcb8cb73f493d3d1758ece5261f7a82a3eab4a987945ad4c", - "f675b9d784087ab1ffde9e640b4044dd3276cd4d8192efe10b352919a2bb1d31", - "2e1ebfd9ba5d4918e001315983a2ed626c3e7ac8fa8c1caa8aadd3e4d5c3fbc4", - "19499ac77ba4303cb99401f5a7e381d1f228308d215968f8da07e229cd623282", - "aa29dba055ee98e7249050051211d7b0127ad4d09f8075bfb2e9f3b3877a7779", - "cabeb8f0030b438515e15cbcea4af32fe5442565d90aa7938980b27e9778b7ce", - "a6fc635a14941214bed026b60361823d436a3bc7358f2d3749734b5957c1b3e5", - "d8f4d4b930d54de236284beddff3cbd1c98f4f15e900ee91c9380d4fdc38143d", - "ffa92b20341315f62803c50c5235d7e040b260d1ecbde057fa828b262e940d26", - "e8b18643d9edb989459644330980e33810e84310a602af8c5c1ca337d97393e9", - "6aaafb5d10980fb3c4e9bec9938449bff7242f94c3f8b0afb5960d7fe9f9015d", - "b8fb991f6fa7bc7d186ac820808026454de68991b3e016321ac5435d7e903fee", - "4354056d3219fe663adae305b2382ab22e8aad8435f96c5d3464758107726069", - "3064b6a4aab90e13a77138017578f7105675b41be664666512a8d7c986a378ce", - "2b55f7ba52525a915d5d956f48eeca41a06508872adfaa8f58586a449b455e58", - "44919b33748952c8ee782d4cb00beb8942317f0545a845adcb03d393ee027391", - "24090989575df0158f295e2fc99c6992469cb7285108bde8cf17cc028ff907a9", - "a6b7205686642e328107ce539fb886a606de89b6db3cfc5f5861e149cf2d62bc", - "e0cc33dfd2c1ddfc01285bac2e7eba1adb2978d419d24aafb0c7e7028def20c9", - "7a1f27f3a6da9aff011e0b026e470037337ee389d644a571935ae3c413437427", - "544f695db9e86e07c76f4311f4d9e62a73c51186c05232a742ade396512faa2d", - "d64542da22f5bb2dac9e4671f59c9e6baef1e2b68a0184f4d73cab38916fdaf1", - "66dfa9c3e013cfa5f6c9d144bf13d8ebca39fb614f68584532c93bee15e47f2b", - "627a1c942a7077ccc9e44efbfd564b0504f04d7c5ddd94a5a09f6d59ac4f9259", - "8f68cf0af78b48cec19fa645f44f3eb68a6d956654b0bcb6cbeb2d87afbf0f76", - "7cb72d2d4cc212b0e5c5ae514cb9587496a83d412029ff2625976db4e16b0540", - "8ae185508c0a5723a7e57460d12ccd8b70ad4f35ac690034b9e188ffcd940316", - "c7ceee795ae039bc38a099023dd27f2c207591dac5627a8f6712157bd21c856f", - "14bfa6aed12062d95ec77168ac681dbee3b2a645c88e616fc9389293b4f8c866", - "99af33f8431f5b397009156aaa6f26bf8d8bfe0f1e52ca5dbaf4fd1b256af466", - "fbfae6168f1765d3cb74a5def8975c3f3221549c1bed35ef41dd9f48847a7875", - "3e51b5670c702ca4537bd34ab51b4770769193a1fa3d8ad8052c412b0d2ab4b3", - "a1fc461be5052671e646a73913db4b294165e25ad6a0e81d65a891db0d42e6cd", - "7dbbf7cf613fa28a4225cce61a7c8bab8c5595fb2869abc0851c7b8862f6d2f6", - "7e55395776f54ce7575364276661baee8698e9b185b60c2e68d479f385ac5f6c", - "e869d3a9918b7253b305df8ee5768a3bfd12bc3f8284f2b8381496330fe92811", - "d259c80ec5b07aca93bb49e51fbf9aae266027fe25ecb1b2ddbeb8fe05b18410", - "0e8fc03a1058e2b0d6c15d0ea4d80a6ca06f55ed18ad4d5bfda12c7720033a08", - "c74e46324dcf516e210922d933532d1418004f3b298eaf27982fc0a3a7e8fddd", - "0f18febcaa12245800c24c751a1e16e7555cffb74aa924dcb139c9167a738204", - "c54dc96b896656157ef533104d6dc12b9014394078547d5d8eed5a632c1ebf47", - "e00a4d586979cc4e7cfa2cf1cf7137ac8215594ffccd885f438f4b66914eed80", - "d8d44a58f97b0c1371c10ecbab5531d3f3f81974c6a0b77514b7bb7eb1265043", - "ebbfc06e65ce6155367af79fa6fc0223d6265fa414ed25d9881a0b151d0e6d4d", - "9d4a8fe4e4fad6e806a052dc761befb044458b6ce30ab35dbc641181ae861117", - "29751d0be6d14e13d54d5e45281e1caccd82f28b9276fea6975f5b142dce0712", - "5117ab6f6071c9ed33c6b8a53127bb103437571fdbc40a45447e85c3151bde41", - "8e8ee7562fe607e392d0441efbeffac0fc67ecb36e148fc33667ac34e7be8627", - "5ec5f79c459b5a0e0fe9eb817038bbfdd3a88949e10d798d95fbd010a10d6c8e", - "9a6171a8247d948c361ff2c3e8784e99744f3ea5a49dd7b13709b50aaa653c6d", - "24260829420294fb8e1022f8483b7c05853cdf589ed3615d3c55ae4c1b605c4d", - "cb273f0320cabeb3442c9c9bbd15462ff0206d96f93d6ca13ea3038f02979504", - "774cf1914f53eba58c987d8cec37ccd8247d14993073b86bd6732bfe5dc4fd70", - "8fc4a90ebc330ede20893a941a221c58ee1317b16adb11331e1eb2ae1d947dc9", - "d7073581ed3d8740d107c83ebb61f06828aac69998ba3b78aee4a84954631e86", - "8d1d6df65213fca313c3d1c4997c6331c3327486f3dc08439dbdc10d311a49bc", - "3ce920d8d5fef88ac795f865b6d9eb2de7fa936e2a292b8cb63263b19b185410", - "919a9ce8afdbe236592d858ce5dc212dbfff56c5b6a66e4ed4ec359cf2fbb1c4", - "5dc4db2ca16249a20bf40e2df8922975b94f9a02f08c9fd654b240adf35270d4", - "5a4632f5472e206fe009e38a9e6ab63856b0c30415c411c68cca60a3f6857b23", - "48b6598832f7cdf5652c5b5b71a392aefe90008d8bf9a97d87229cc0f239dd86", - "ec9ffce04df340f6b92a52bd06f7c7f919b54fd4f79d65dfcf24422ed8cf017e", - "659c76bd2a0a916ac01e45a2d5917373b28151ec4f489fd68113eb9ae65a8f0d", - "d132c745479d3e0346619c7f4ee0fcd1b0dcb5e7933a5a0bc1ed4f38c0e66256", - "cf3649aeb91192eb2218c822ae479f90fd9ae18a1964122eeaa3d313bf8ea22b", - "f3b6d0d6ba91ce783eda0e09d85ade4438682b335b75e3e5d924c06a9153bf85", - "5bba2b602819eaf35e0b600884f46d195dad3b840a44cf55c4cc5d737e0120c7", - "3b75dd5e258f3ec8a513545947c0cb7881248625b9c11b40e62ce0db8ec38923", - "a7a378211d508adc260b781175cc66409ebdb71b0985555ad6b20f86e37fbfaf", - "93ecc4bf0fc9a2ecf1ca68c44d2e1044c3a635c0e715869a6fb65ccd6132c529", - "eeda587d995cc197e52ca8621e03bf123d1d5baa8b87f44c11fe09e90bcacce1", - "01c530939f527de8ac87b0f9e41a6990d002e71df7c77f734490f413d885b2cf", - "e219963bb9ac5ec8efc12f9fd9dbe247da5f13c748ec08b2b99f9fe21a18205c", - "04b47902fcad4479ddfbdefa66692be80650bfe1818d6b78a12d2956a2133068", - "bdeb11e97a2720ac91853bd735df71b846e3fb432d3ed1ed9f6527dd63c9145a", - "71c93c23bda016da33049d371cf766938194b854ef45618154858c07da2a160a", - "7d58e6f56c9225df819b3dd2a65294aa17b2518a7648e6fd12f7d15dbe6fb3ab", - "ee6d9edfe17c52cb4f0612598f4b985c88fdac9695ccb1445eff84c28c4af46c", - "e71f17ac601af5046aa756d36c0aae32022b60f5de9e945e9f2e2c6192c5e9a0", - "b885f810ec5608c9589b0c5130ff618972c6c50a52432ff41af06de3cdab66af", - "2ede8e2030cd9978dd9e3ca3f22d76076bb697d9aea38663ba512e2cc6aa0822", - "d69d3f87a13e20287ee222d2cf81004376abfd728f756955fa7b50da51436d86", - "2a7fba9893d65e3b69f861b9eb1fb2e63308cb51fcf2825e7722cfa187ec0be0", - "8652c44ac8005b3e108faa671be12a3d9e11d435d186d1a288606ad3fbe554f1", - "d4b89e991232c769ca5d6742be9b61a7408235238a789ea1617cf090e77ea6c5", - "5b298a00a2368f86040d0e052b4d7081c1ea74efac50b2531e8900226c30decc", - "6ab271d0e0b73d0f25674b678e0125ee6eef70383d97217109374328b7bc305a", - "df0995ab427431ca7aa5a2866e7ef6c06242ac945fc02fa099c1b620b699c81f", - "cf9e0c14927702f477bf7e1aa30150b92326103b9f3d6043841919ee9067f86b", - "0f26f9f0598da1dc652a19ed13f865797c9d9f3447c700316859fa7f062a5f12", - "82d3702c512f14b60346e309a6944255fd974985a431ccac3098316a43d2c8b4", - "7d3331799bb208bfc9e0884febe8190b8a47db34b6636e0be56663daf54086c3", - "180483d7ed9f8714345ff8b35f16c5aa85ae7c369c30cbf043b5e84d676ae92c", - "f564460e5bee880c1164d5b52fa7a89818df532a30042d1a220218fd6974f562", - "8d614482a85b8a57f8afc8692d7e643357a77dfa65e3c3c1b4d1f1b948d80545", - "620f1f6951f7a1a08872e0d7c8e099f2aebe5a0f8eccc961533340657179d410", - "239b52f3728b70580dcfda6f6111bae8da8d18353799aa31ecd016b77a0ded75", - "d3e73a756c099f708bb8e25f961710702f5f146ad7ef58b952d3cc70ee105b7f", - "bead5642392c90d40a991eaad9505e103847a75ad36e5f56ef2bca8961079ba0", - "165ed62207c9f90ff03a557c3bd65fd74e9cea9f15935d894ccfe541e1c3a0de", - "af1fbba286a6ae6f347ff0cef2ec3f587e6e03910bf6711f67af022f2bb9bf8d", - "15bfa31bd826b5197e6888803c823d1f84e17076cd0d8a77abacaf2e224e817a", - "0dff5bee0df88203e956078a9da1934ab78a6f6d8d53a00833690eaff0a6c276", - "3e8cb5852d3f3391f5147b466690bd8d455aac2fa49a94df74f151c65fe1c824", - "1b225aa09a5f93fd27c7c759ed871c166baa997f0edf04efd16de4d1ecdb1cf4", - "53f5a677973c588b8d14a1540174f2a70bf0c265c0ccb22c45440d9428d68bf3", - "69fe00aa273e1c22db5f6ea571c522e6ce4b8c33d2c234f0bd1e096466882a8a", - "50b77fad374e00fe56ff20b4978e80349738873328891f97e86b8ce78afc2cd3", - "af71540724ac396ffb39c1397bf71949053ee23cdef6de2aad05e62a24a38bc0", - "b89cebeb92b746bc4761516d2b16e87cbc748ddb7b117d7088e7a4e49cd74adf", - "a0c2efd02228178d55ffbc965cc9c5ac908122c8c99bd4bb6809d3dc3ebd23df", - "78788721e1fd623479096a84fe432ab7cc823767cf1787a35c3d61cc43122227", - "6f34f17033e2e4cbe93c75ad14601d3a8920d6ae374dfbb2f53d4fa16edca10d", - "4fe3594a295d66bcc91dd821f0103740f18ca5617161ecaa5ef157c5c5bada1a", - "6f0c5f7944013f0e4aabeb6e82cf9c9a8874e7b0725ac27c1e76a3e4b7d47aea", - "298d50d202523fd9b30342708ce0656d6bc6431706fe83fac1b9c7fce2042a0d", - "b4fccfb28c94580d8a3eb3f9e9142b9f0578c43b47806a3fe69cbbf75896726b", - "0cdea26a1b5620645b19e03bd988e624445c07291a413213bf148558fd57a8ff", - "c3d14697a8b3ab843f8b572f96e237634adcdec46c73b05cdc17f37426d7f2f3", - "1d642d9f78b0309fd0e80066a05bfa6987670f7cd3c31b788b9182ff447c4429", - "7a509a5791d560e23152df5447907c15f1bf063dd90a74c65c8bd60980f5bae3", - "3c93b076b3607f9e05382492b539deb56c9a5bbcf3a8412963abcebb7c54db2f", - "b97e90f3e7c6c24360571d2950abadcd26b98288138265353079d5a44d7985c0", - "8b24dd4515568e133f3cdf3e54f11cf1960e3421501bad2bc5b84e58c5337e2b", - "89232a9a312594cba41f18bb1f4213404330823cf91e82109255257e9c0c7d9d", - "5e26969f58d308ee745de474c274707dbb09f114a9db73eef6509c2a356b03b7", - "8879852c34d8cb431fd1a15471ac59e645ee1c0be9dc1772568a7ed6fac1eccc", - "10893bb9f2c83d084b2149f59dd7d7035b6720d45bdb70d10282c9c06b8245a8", - "dc710e3ec899244a8820add31bcea867a9898e015db1799b9548ce163acc75c0", - "41bd877cdf92ff9c7b617a289cb758bf50049400f45a597b8c0426594c45fecf", - "ee6a750a2258bd4c4700fe78ee41064b887938f79f9c68a4ab9b85931ed319fb", - "dd3d6d8b0d65396e29c2078b08cadc368a576c0b48aedbef281e9631551f4bed", - "57d5624d3df021e6bb44fb64f655fa2765fdb0597d42f0a2d9643d9417f18734", - "45486429d276c25ddb97fa23056b799208edc2f4cdb98293f25eead3d240166c", - "cdb9ad38c96c2a2de6cf254b83bd735ff5c303d42ff89563c8371ccf45e49542", - "bf61bf3465412701a8dfe751f5692968c5a66ff910f3e8fe3a420c13dae462bd", - "c7d6b7e54a67ed0e5ae0519a2caed532564e6785b41bd8d2199b45be619542ef", - "84981904583e555bfbebd3067463cff03dac94a636ea74c172e7576bb8ee3f2d", - "0822e8df5e83c20cc35425c32fbc1f6fc48d83965dbf3141903a1560b31d0eec", - "904fbb3c25bb80b51e6e1745cdf632d9ed2238ab0abe81cd1155d5bf087110d3", - "660cb6bb182e0523dff507985ee544740913a1a2cbb64c2586b543276203495f", - "84b9f8cff1a8c3522d0247b9dc36cbc81031cf50468432e53c2dbba3c7ff27e2", - "7ccb1dd4034bf21ac3307b2696e220d8d07503b12b1b2a001b191920a577ce08", - "7ee49a9e04e7ed323bc89ac4d76caf29f834510a61ab54ea87553d92fd025477", - "880a4715419fc6e7a427a9f8206ceaf47d3ca6d6f225c46218e79afd7711e58a", - "1a03640a59ee6bdd80ea5766d411c3756f49a0e1e00b252ed908fa1f7be649c0", - "b46e9b1b56b57f43c41f002f178220272f12842dfb1c8d543fbd251ca6ebb833", - "00dfe2f3abfa2100837d39bec14ce307afb99cd86b8599318c8b834acf5a3179", - "6d5764356f75d060f59d3f9a24b0e875e93b570b03fd66e98efa849e1b4a9e59", - "09dbd49609db5d372973ee13e0acc834786ce0bcfdf0e8e1cac7863a0f6406da", - "760af145a66d51a1f9162aca86573cb5f8e002ec74d7e9683f6a308eab69e905", - "367e6615637a088a40b6fa2bc13a60761651529a104aa2d1295cf2cb43783ddf", - "457f4e29fbce709bab79a2fa3d4357282af87dfdcddedbecc3ae3704d48fe93c", - "ac95d9eb15c07a2711d99f4112600e915a47872ea836bec1452e898be05cece5", - "14bfdce01899500928f18896679172950fb02aad08e2e92ca7b4a44d52fe6991", - "e3d442f76e8ae61ca9975456569e2d38eb98599952c0406ef3adb6006d9bab50", - "b01d8c1e85d9299441bcad0f0e3ef786a9dd91f33c5ee38ee240357e7be161b9", - "93fbc28cd09f810a908abf628ae9c522178614c6b5163ea8de8de8f84e272ea8", - "3b556e9c58dd8439f4283ad3a538919e37ec63761fa321785eca7a91c0d6d0df", - "a778918fdae3cdb8838b8ff04eef26b2bbae88d899f3134f532bd01d970feb68", - "6ad7685896aaca1eff3d53d37a334f29db0b1cebfab5c1afaa3b31cb8ca5e9e2", - "be010af9fc4217ba259e3c3e65ec4ab0742c3b0c7ac1bcfbee4767100a3c5ee1", - "38d67f8e2fb917a67a3e6594065aa8ad77926c9fdca6818620cf2092b7e9a7a0", - "f39a222164f8e2780c2161c04d35a05949d99a82f95640be4e2fcd7483087362", - "4f05df235112874ee5ee96d1d769d88fa5e686ec653d94226f62d826a926f0e2", - "1b14203b378954ab62d96984c9ee32a838c6ad3398eb30cbaa0ec273eae42372", - "98c9a0cf3c3fd9c22328e683ec15032fe951ee61f62a3641afdefb9284cdca76", - "cdb88f81b6c367622647d4073d101d45bbd5a81b43ea95f54e66cce696f3066a", - "2250a50a506b9d4dca113ca03e7830e228e744ffb1f1dd751b48f9851e75828b", - "0478f16e221c5d6b7236ca6aeafa0f509612fa9e4f6fea959b21e80453cc8495", - "cbfb618abf140b25600e1b2daec791f1c107431637b900d73c0ab5c6ddba0614", - "372a55c6d2d12d90253f9bb6cfab2459742dd7671f3570bd7385829c41a03829", - "542bb6c5d32e5dc54a6cfb040c7460d990f50914ddc35657afccd3fc115f13a4", - "407add4c9c2af4aa2cce50eb685f61ea37e433ce02f0e427a8bbf024f7c02ff4", - "9dc4af26bbdabefeed6dc61317e1eaa428473ae0daa1e138aa7659b916019396", - "3cddf1e61dac95aff808ae5a57cd22fea433da02c438de305d753599c8bcc00c", - "3f352b481a7c5b602fbdf434a1e2df167bc8f8a1494dde3500e70f3a04f7304d", - "db96f36b869b8f2bdf08b6ed3182eaa59e2988d7f0ede97d046e191f7e19c548", - "74354dc6d21047c68a28505f648934029da4ea788dae53bcf3f89fc58412efc8", - "047ffc30feddfe4c56a89e37106caf7b9ecea6c7f32d84789335fae1fb4a2f7e", - "83488ef357f757059d3c539a6e60af68e36cea762fa7823ebc4984f0bc0d53b4", - "e93bb6eb951d7aca8c4d3b2edf8a4297a1c61d88fdf1d1c146f5778dbd62f4e0", - "5790c436b3a1deed0698548f0d05d7decf011355cf2c40da15a33e41269b2d83", - "b0b02efc25014a3d57ce180842c0d60127575f92fd23d0fffd9854f556d29b95", - "acdb420177ec760118e0a14bd23aa43682ebb539fed9ba16b92257c58e42d616", - "f552ca9ae4c69ec4dfca62a2a3c85c2609a68dcffda4c088facb4b89071fed03", - "496c00e705da29174c055f138915ee9ef7cda9888a8aa03688b9e70d42b9ab00", - "3d25a5b8842efe86276bb1e947c6e76cf44a64276fa1a99cded76aa0af23698d", - "71ab5c7c7ae296856127a66d24fca285ef1480e191b92dc84c496a641f6d94d8", - "9cb02f68185ddf62d933e392f50c82bc64535bfe0e8d4e886811471cb9cc8ddf", - "c7d2e091d038dd5cacee66a4f1611adf8f0402cce3b35540f5631da043e0e1d4", - "3bd1873bc8ffda23eb91741e1208bebe9bdf8ed60b81c1468055d04e9f6c0aa0", - "c2a47eec61a78946e58035e34622d94b9a95af615646a2865fc4830bad1a00f9", - "0f29b3f3884c8e004987bc0c9a70d4697cfc3313c4e954ced8fe04b5f70bff5e", - "21e38242310dfc731fb56de1fbdb192c7be976a034cfba6d7caf6fa88692cbaa", - "d8a4fcac6300cf5c0647ca388bc2cc8f1fc79bfd10712fcf1d218ca84ad59b5a", - "251172ee4ba67fcd33f047eda96010dcfc2fb2e2324ff25a9cab6ee077ed12d8", - "50d20c371122408a764e50906cf105db884e1eee0a01cb51661541adb84086f5", - "d09d1ccde4b9a2659f650159af15994493451c2a4a9b71ed73dca712f9351ae7", - "a8cea9412fed9e8a56dfdb87b4843e61ace5860d221b98e3158b46dfe436d356", - "e60764e268ae37f887f181c4b8daab2cfcb96f0ed4108d1c7aad80d00805557f", - "4d81892e2eafcb3442b3d28b1ce57192eb13757af3a143712293d98333da116d", - "956775393d011f4b7946472eb7f9c2935c3e4860b59b8fc794ba6b2949d57a36", - "6d09e6e72d83a219b8ea1d5bafcc3b24caf387e69ac7f9056c0b71320ebb6ede", - "f35aa9aad59416237a9368bc78a66cff4f47c4d87a12ead9c43d023c278f385f", - "c4b9411f58076becf71b3a71cde993459d2f800100cec25e56e55a97735f9473", - "2db49f68c3fbe6821882d34512c1adc769fb1bd3dd5f57fa0a5002ad2e4f6ac6", - "cbe5b4d3720110226c80afa84df87f6f79316086ae61c4cb01d64b6b970d4fe7", - "14929f6b4d589f234f655e4a278e1af7b2a43cf3c96528739d5c01f09fa4b19b", - "119a1bf2db871d36074a92de533952699ec092b5df5b0760e4549b5cff73baec", - "3fd08c77ad4b6d5f16bd4226b7a766f2246317ad51ac6544d3b4f6d3dffefd13", - "801be77a77a68e7fc8bcd4016f6de27e35d36365a71b53892d241106bec04bf1", - "b5c5cdbf9d6065f33f1270ac024cd144f61481397d11de63b510d09c47a4193f", - "b0c1075dd7170a8a9477915956beb72834b53701e841382eb67fc7e7d8393ae4", - "84f670ffc46c584cb11fb97cfcc69b3f67159ed9b78069aa300b72054f1ca940", - "0d1fc4e942ffbe61974f5f14f391bd80f104bae2b3b979678927935397078f2f", - "da28ce13695bd38295ac859ec3f947500c17b3477e394104b82d689f8577d070", - "41df4b31de903f9bfd24a868cf371dcd8b6a58e3a42006b87951d5f06352c4af", - "8afa2cde587f1829c755aff20b959acd7c77c3bffa1f0153021f772fb4f8a56d", - "902d58d9d586146039f24e2b9141d00ee86711e2125c21a83525b1c836974ab4", - "fb1f57897992fc496ebe3cf933cb9ab0c840819bdedd619c1267fb0855aa9a02", - "911bf06982e19c62960d65810c872ecbba93e29fdf63211402b31492ceb36310", - "24394ca06ce11df5d8bcb7e0409209fc28117afa2653ac5633169132b83e02be", - "d54be8226efe22bed7ef1f3703ebce35cec363cc4ca0dff2e7d89b7c3e6d3b4a", - "a424a0080837950b7f827d3642687b53b61448611ec86d48fe4bbe1ab78b7205", - "e31dbaf064fc10b76755d1647e49be6ba32191b0e237dba530e5b2b8344bd5b8", - "c39150f73a01664c0da387c59647253d46cbb9870787105a54936b454dce2279", - "4432872dae964e3520c7b674a4db130495d330ad139489d2b82e975a1a87f2ee", - "f64aa45b8ee0bf3cff402880929ebdc8adbe1ce1b8fca495a117a24d8091c0fa", - "1229c2371d78f7e474c11b828a908423831a06b853e439cdf0784f09c494b55e", - "0cb98a0b5e49696af7bace032951a1b409a9b44e03a0f9a5447c8d2e7a46416d", - "92fcdc407c601fde991845f0e25d588ce788197b8f367a041070107fb35d5958", - "e4f2fdf09bb23a2d0aad09ef61d63524939870b7898dfcd61826fb11381d9696", - "2ba9e284ff81af9e0a83d5129eb1b28fea66c0a503884c5f85dc4dce7ec99c23", - "8300cee56172b50a943b057b783146ecc20636e38787860222decadf4ad12c5b", - "3b88127441c625f7fa5457c526e0f0ace8207d552de827a01655db9315d45197", - "7ef447887411cc8a718df2f8429db16622be59e25932dfc291914c268e391629", - "463d4e87f278fec08189395d5a2752b909bac935a4893a2e3df86910310fc3de", - "2d185087676e4d96fd3200b6b11720131839b70a12136b9f902a8a4161c406cb", - "ac54b270153c4c67754766d5f2baad60f9e2a9daee8bcef073dd8cd55cc99ce3", - "b4da260f7d841066b8b73707317658ef3c02931ac17f0199dbcaab10f69b0168", - "74939f581fcd4254fe742e1561843841bcf52f82d5ef43736278eaec42bef46c", - "a50184bd6a4f56dc47e5917cfd76684919d6f8094168b560b551d16b1e77ef91", - "18d371d2990c327002b3bcedd25babdd600646a68fe75b544916cb5d855e78c7", - "b090c1c61d932a08d1637371ae7f5fef1aa3eae2608995fe0439008742355f59", - "380bf1bbf51b5273b286464ebf1eafafa07ab9a96a5e7dad93258541f9699656", - "c231a850e64b9febd890af33d22cab1dec7fb60947f4a9ae16f058063c0ef924", - "968da1340ec91e32b6011773765db6254fe783c184093dc4332af45e308d0a7a", - "2f00acf3d89fe8d4e531c9a76498cf29f2032efc170c51e172e3744bcc02fb24", - "7cc4f6ccbf320b422320bbf02e9a72020e0fe1aa7b86c389826c146977b41611", - "35596166cc978922111e2335e5ad8d75143718fa7e6a266f6e38144ef2354eba", - "3c5ae4d2b540e07c01aa98750ceb641af7dcd0b393c2ee5df426d2ac60fe78f9", - "ae4f3679c38b7836d3249f371bcf29b11cf760a65b28ab120c3309756544d0ba", - "334d7a2065c5bf0d2d1d9bb6b009b34af7e0a871747a120a59b2ca2d1eeb2dd1", - "ca30e5f5df507a41093a174a67332dcf5b88ea3dc3aa55e5b9c6f572a7b8a7be", - "720a28587ccc4086569f9b3b4b5a4806e0934d6de38c1f65c1bfbe9265d48d07", - "1d4cf24518542c7b678a0919e2072e13906bab003c01d8aeb20ec1f2b171cf90", - "999b8f4ba0d8781018eb39962cdca3800e93e108dec89e3d4d8a491adf1da248", - "29b9d1ec184f4b2601498fd09d6dc3ae0a5d6be7d74cf324ce8ce72f76e3f8b2", - "48907d63f3c17d817ae4e3d8fb2972bc215d3a2285af46aef4f0a03efd5d97ba", - "71e1321bf973fa82e339c793a98704d383ae3a2e5d12698365930eb8f103700a", - "054c4935bd83bf4e5a3d436f30732c240b181f985d7285b964b08dbcb35f22f8", - "2ccfa167d90e1451fed999ea7874b442ea5006f6716a6a6b2d0fa3a004b04eb3", - "7ea4a49daa7124193e3854cac5298ef01a2ecfab3317cf483ea7b1ed7b7554bb", - "9c5edf5a9d2a57e2eb3ab37ef7b4d3bc9b0f328ef54ae95af216b38c867d14d1", - "1666f21bdaa89773d459911f5633aad140069e77582399f1981a7333cc248311", - "3f4f67e32881e5bff6445bd559e0fc78a9d1e90bd12fb65ae1254b34e3852757", - "be22f3b28c63e896f788ca544c68240c8b1d4a0e6e6bf5adaa2809b48768f421", - "c50a7747b01fe5cb48c942d748e36e2e56e4f367caebf167375c1fb8cadac0a4", - "35e5f765b93a3430a67a6066c5d124a1d5078c3a40b538108022baf537d4bdf8", - "6092a19e092eaed735e09b2a726de78f04fcaa12b5a25f52edeac17fa4eb6bd6", - "31cb54f100d45d6bcc4e32e18b500dc18c895d393b51ca0d7c92bf812aac8f3d", - "541090ffdd05abe8283a893615dbbad1c8a71e070b527b13dfeebf475c607194", - "409bcfc7f4bfa3ab436d11718d0864eaed17219f2b54316b678ccc2c9bcf2ab8", - "c0a10f071aa5bc85aa7291838875cc7baaca711c6b642c46c375eb5356e19df1", - "10c1c015711326a5b38e0d9bfe9067363c34e57ed57c46135919919d6be1719f", - "66efea504c2c0902f6921cdcf7c1ac2560dde7984ad90043c990f1f3eea92b9a", - "385da045fbc9fbfe7c5381055528fddbe3f267f68e20eabf6c041c4900672f76", - "ea6cc32cd1133ace244076d533d961ccc2adb4124b403957d9d8a177f969cd04", - "af999da9a51565f6aefcaf51217fd298f92728ba23bd9183af0f2819a24c8ca9", - "34d1fe0fb6f9f624f42c83329933779053560cfcbd54e34ca36d5ba6a70bf8d5", - "008852a7a15b7e81921e4009727ba6ba94b589c4dacbed7d93e4818346788a57", - "9184f5bc06b09c00dbb84fef01477e06289354a95735f2ba8b8da23b51b45561", - "69931c4dc0e0495a2bb46f2e2ef57e529c7927cd91e05a8aa5cdfd08752f06ad", - "ba8c5026a937f3e6e04fc8317f2dc042e6bfb7e25a47df384b93d4acabe82882", - "66a2bf33ee9179e8bc5d6733aabd50c4043de78ebdf9a17c59ce44329d08096f", - "e3c11b8f57a29e88d6f278302151f5bcd064ea404f2fe554ed13a980b85569d3", - "611650493eed0cbf5d46feffded928ddc9455e619e3816ad23e34840cf6a9f20", - "2227a516de0b39f22937192ce670d993b0dd3aa17b0606b534f5d601472186b3", - "1883418fcb154f1254f001b39c2f01b442cbcd3aa6b638bc2cd4abedff4d04ab", - "6e8d3edfa87760ff9f60b1ff00d55951a532f4a8bff46649b4674d075d673303", - "a0fd9d4b8b35920b0f8b525461ef2eacc64776ea7b09fafacf8c4c13de31cced", - "9f44c32ecf4d6b75abba7f7ab874a47bf98ff17c11d37984ca55dd0f35efcbdb", - "c68b57ae72803a46b5bd7b1eb3bc5b183922a35ac97bb51f0eb62262ce5fc9d6", - "22ec47fd7085c57728028beb3a910d11637d3e8dc8d9460b0ea025639c8227b6", - "989e5dccbd30d6da82b2794501415dd8c8c42fe404ebb5c4e8ce833731ecc0a8", - "5c18c325682306d6bb7bd403c6f6281783c060f79196a4181e91aec420e40287", - "879dd9b724496cfef67fe6fd2915c84070116ae8668fbcc5735b850dc59f4a99", - "ad83d6f79fda1d06dac15ca75b40229c8aff254d3a721d18380bb23897cd0f7c", - "1b14a6e96230e87ae4503c90b3d5e0de88bbb6e0eece86e888badb8b76addef4", - "18fedab080d67976b14fa7e64a281069a411de3aede6e63fb5793a02acf335e0", - "528a4967b6c3e7a4744c7902d0b233a7b9f52cbcffbc1c78eb737fdcba009d2a", - "94f8a1930f213485fe5297e1fce8f245a3aeff38c4ea49c839a2d67ab450957e", - "1de5d4c0d1d229b1f7f8d297c37deea4dadaeee8fbf7aa7a9af645b3eb10f1d4", - "a1d87ca97dc6da5cf96e3fa4bb82903da4862c679ffac53402c1b0190f9af047", - "4ed60491ef3be32fcb97f48005d703043c515c2cac3fb1839a0b5f2fd60ab31e", - "053e0e33d34eb4b9312a602d098c12d5b2d7fac7c09b16c0bed0667f97fe325b", - "5e278e9edb160b2fdc3822a244bae047a78e6d617a4270892521e385ee85257a", - "3dbae01b8836201ff1707a8fc48329a6ffd57bb3c8de9b5ae90c4bff482135c6", - "e5bee6c39776e0ff08e4dea4deb2c02acc1b731560e70f5c556a27ced908bc30", - "02f69e1ea9ede6e074ac424218329e818a7d178e7c54a6e513849d171eef6e08", - "a5e0744f81e945b05e4872b52c88ebf35414b7319a57b63a22b2b56ec838ec46", - "afd1d5ae93c5e599d50fa1507981325ed3bdf6c5bdac9c795788fc00afdbb1bf", - "e13696352ea2ba25618077516d4b15711a27e924625dc5ff15ab95dbf75b47bc", - "c318edccd8a842bba9bc768a696004a0b2b19cc572ae2dc14da4bb69314f520b", - "7d17369977806b8eaa5ea595f51fa9117788ca917d946955879d617ee6e4e60f", - "5d885e62d3990bf8bcfd2b95c9a964c39705b7661e9ed06dcd84e8f62fe6f89a", - "4a4036ac2f392d2ea3b9fe4c77f532a184dbfd9ada243e90dfdaf0af2d0186af", - "edab2da424705c1132ba1264d9b64dab85bce5bc4b6559b9413923a252d17b6d", - "ccf18267ebef081303b8cc21c8231d2a60763bf5392480e88f5cb2538ca046d5", - "c39ad70a2beec5050d77e8d8be9b8891d961f545bb73cd6d2bbffae00922ad33", - "81b9570a6d81c278fd244a38484baa5d485f3c549ea0b28b8b678019113f7023", - "dd206302b5c7546ccda7f99a6a70d048ab3353923662635c20718d439011bd61", - "74517d125719d0c0388530b94320aed00a1a501dd710c39b698328beadee1888", - "98631b8023f93d1ffe81e8e1c7c73f4809ef682380fd4ff5f65551434d95dbab", - "5c457136cf7734d437132410947016ce60ecbe5357ec791b81656eb3375dcb35", - "56e60ea775f91c22ecd68356d13ad8b9b6b2107528cfe4acd6be3bf8801814f2", - "b59e59b64eca9d78a7e645e870003f5a59f977037c8cb8bc269069a44305c6d2", - "e86bdf13abd596bbf0f09df65f5f67a34cb60c9e0d6ff77c245e26896cc0db86", - "c1e105b34daf19ac27fadf393719a390a722e5cb1aed623c4a8de617fb9deffd", - "4bb33b61fe8d041849fcc5ca7946fd10e4d8395278550b88a44759cee455adb3", - "9ac331d6eaa2f44b6f723ec0be1804217420fd0dafef29fdd8314860f8fc9fe0", - "38d21433cdf386844128095131b907e852f0a924c838ebc43afe919561dc49bf", - "138aeac75bf5a0f5688886b8196dbf3eba8c599daa52ae6454528a7e558b95d4", - "6111725062eb2f6aaa00566918e82fecccb98921235b2e2a1b1196215842fd94", - "9c9f7d601aabae1aeff6d61d331b2aa78d182a2af4cbdc2ed66f8e32e530ac15", - "b536af171ced79bcb2d8a4295aeb24fa1896a4adf2273a504dcefcd90e27ea89", - "07c1f429e2e884da74d72c01e0875047562a626ddfd17806d8f4032e9acf875b", - "a6ffa36a34a9aa3f62289daf27c89d379014633133bbc70c94345f384c5e38a7", - "fd7533b276131d82571da4e55522a6f6f718a9216786943d24209ea84a3cb682", - "8d71bb5a1d228c1bdc222a7a424aeb8af47742a0b2265ac1efd3bfd1387d99ae", - "e6bfd97331daf409ad0ccf23aaa3846f7edb434b900dcf7d6b5928c40aca810d", - "349e3c83f80e4c5590e280c19726cf06e547ce4a0f9696e0bfe814c4bf7d83a9", - "ba08ed4e06e5acdac64619179512779a12f0da3dc366f12f8f9f86169f2e63e4", - "4d14ad123fba13aa743c34b9ad1f74c6b9005941f9faed9257a17e88e2cc669c", - "b8c2f06a7d5f67cf458b4919018e4a01cdd06bcf0868c1ada976ebb2af143539", - "e02dcc8939a5079ab806643ecc70d5617fb8744e51d88fbe72e3f51656c194d1", - "85f46287f27726f0a59739dda630eb6976ca2f9b45102b788b6f65ccf8e1d895", - "7115a6dd8aabef5094fbe6435093f3df58e8840b703e1301d3ad85cdab735384", - "3e1e10578235ecd3017809457ee7a1bf39caf30d3cca819c4baf9d34b4fa6b6f", - "950435ca5e457a0a8215ccdae1babe7ce26e50d4b8581be5180b07c6ce1eac37", - "528d940b8bc25f9fc673b26db211ec82dbf08f680d524a3b1acace568b5116a3", - "d66c71a7757c629c9b83818185e5e0475f32a3dc009c807533703be3191dd2d5", - "96fc0d9bf8b0b8492d44da20231ab4ec2433dae7bca64c244151cf8829fb6ace", - "fea9eadb7b0417a4fe884b6f3c5aafd1737fa1955245a100b736c33616bb3ebd", - "0ea4cf169367f1b3bd1d93cde4eb9fb29b646b614fe201e1c61f55716063365c", - "d5e1f5041f144626e3dd7b4e515259268b52e917cf92f5bb0d737971d2d1bbee", - "464e34bcffb8145ffa338cc8e15d765aae669addaed823839cfc585dff92763e", - "7ebdc092bc390dcc8aa9fe48f75c7178628bf6a5ce84af0d77291c7108074cfd", - "560aed726e87e366a49f6264c9ad9b593cf44930872eb396f89b2227bb4e1475", - "63fccf4ae18a51f5bc0fbad45b7e6b27be6501d0fda61bfee8f2dc015b96bb78", - "7afce2e2ddec26db75dc0c963df9541d612492c01c4f032bd037247281c98ca9", - "508aad95c02ae8263c49fc03176e4a7c4fcf977d0e48f2f53945f4a3974a479b", - "fb2595445b142ceb24df4631a422be43eef766a6f23de52fbe662841fe1e9265", - "bd90646db468b0ffc1e436753c5d68e9bc3f08763b27ea310b67b55ecedf60d0", - "75ff3bc6261f774c03f4fb1f6e8a142439b2c38ea225eff08c25e3becc4c4e1a", - "bc4944815b2d559c882203bea93e585b8064087d49d820de502eb10e24f82455", - "34982e7bcccc46f2875809ad693bdacf10a9d0c6598e53a72120b6a0d72d98e2", - "44b3e3063bec4450671d8de3bcc4aa9ec5c86763c98fbe83ffa74b0ad8a091a7", - "5965b0a0d49fdb5fe574eb5f97f02dd19e6c84aea616cd759f38d5a9b7c7b607", - "8c595a3044b19a7a6e1c4969af47927a49e645c9b256b8edeffdbc642ecde6ca", - "3adc2a5c185898972aea1970231d166a51136811a7cd1f8b92bb312c83ac2f99", - "142b65a2454a071218c7e8bec7bff0bde133cdb5238ccbcfbbd736fc04506b3f", - "3d08849a86e4f551a69be3f34b9d58f0dac355e5e249a2f63ee3a08c78d2e0a1", - "9132bc463b28b9a162a76761689f8b6b67506ede9cddde4c6426183a3bc57a84", - "15975203977289830bc8df57a3c4c27639ac1f4a71692789d5653b1c14531cce", - "dd50b348a3054710f777bb285074102518f33783ccbf41420e900aad9c4a6dd5", - "7582b8a2b8269c682f4ba3b3b0867fc4050f3e47e8aae7c94498d48c465b95c5", - "8054c3fb043b6f2524ade5788640854ff0f656a04aaa3ddc71d805674d37a63e", - "9e29154632f517fdd530c93b0bcd99861a6bd8db1d353c04c5cc895d7af08d24", - "c3f27dd88c73b01205a38af912ef4aa62a57e8de8e0ca2c173ae13a1d23204f3", - "64703be82e6dce5e1eb6d29491a717bee1583644ac887656090878d82b501331", - "c363450c9cf622e0b5233f25a6857a33c43f225797e73324e44e232185f85652", - "b4feb6365512f33632cb616e737c3319765e12f3e4b929af4ead8687bf3b1a18", - "7aba94e579bad2722fcc6169a42840ee2ec6d1415623aa596a4d2f1ba9697ec2", - "3fb000ba633211e2b63cf4b7a1cf804f3a34ba3431ea29a346342c1a4508b61d", - "52d25f2c2538449c6970aac09b7d8cf075e9cbcddb91b45fad7860da13e3685e", - "613ee0ca8f0af49c9f8b79e1b983ec20d9890f40644b83307a517bf4132116af", - "9cfbf34c4ae8300cf61c6bd6ebc2120abd815122554f82a442065ab9506ad1d3", - "ba76b337c243ac3d012eca9954f7f20691a5bace27ddd10b3554a282924e65d6", - "dacb31ca46190b645b8f3b54d99f447b01eedaa7049297495cf0c18f09469277", - "7f0a097a16524c9d711056554d6884b8d83e7d6dc1074445b447f693c9be453c", - "93ccd27943227fccc13d9201d963315d69ff5112e144e1eeb9376ef96cc0931e", - "f86a415436392ccdbcb0fd60a021abc1ef7d01eb40ab755cba0a6b0edf1b5059", - "d5e9931e2e6f17b8fbc8a0e8fb7385072cdd62a20225bccf485153374b98193d", - "29c9f5b6cf27ec1e69a2cba8269b8dbc10eaba3418b7d92ce9b6b42914b8bef6", - "1d2c8f77128491b9eb25fd4294e5b93247ca8a7560cd0a8f278373cc4d33d73a", - "9c311a11176e001e0520c0a779b7edf16bdf8a56be8b3749d583a9a73c04fe21", - "01bbc2cf9bdb76950e16c798b08f0d2e76f26de8fe1da02b7944cf584a0428e3", - "bdd7da4969de7f4c1502cac1488da51ded446ae0a37537e900f704bb5ad5e67f", - "694a7f47761ae6b581009adbfe89802bf561e25273300db9aa8b6330076c651b", - "0c01a83f2ae34a66cb50b54b5fbb628cdeba34a1ec1188f69b9c498a1e862548", - "8d3c645f52665fade8e2305357efd8e725b1b0cb1968bf8c6d4da0dd52e137e9", - "a08a13b9433647422dc03263450f152822c5bcaeb78861d9ec6b9bc7ba01f514", - "029cf9365a5dc152a63b7835ed9e4c043d3369ca69633dba837dd054491689ab", - "27a8c1970cce0ddbdcea66fdf99525505c217c4b55eab42ae43573848fcdf2ad", - "2973286021c04c2513a77f508049449cc1911a1c81fc9339362b7a345009cbbf", - "258dc6c97be090c8e6a8ea2d6328cbac024caa5a9c54f2de341f8f9206c5a8f9", - "868b3e6a124f5f168df61fea5c6fd1aea842474178421b0ce2c03a93884a378d", - "481d08955fb2efe54e74d76ecec7b819aab0dc116ff5e805fb9060f67d36d750", - "662544b36b84bf868bc70c87b7b60e285028c3f957411496b50d47f702c44b4c", - "c3f9abeb65bee148924d4a665773522d76c18d98885961cf8c3729b18a037216", - "60d800e37b82dbb7aafa297974a74dae49a9e1d0dd18ccf549292eb2cc73cc6a", - "b6fd619a294e938fc02956e89f2a33fe41013edc5e51a25ff1657a02b910d82c", - "0febfb7b22180e32a7cb0d06662617b441d1de559e6a54eaaaaf20565bc49c7b", - "e7d4f66aafb49a8dbeeec31834ca3d748462bcb6a94ec7d00337a4296b261968", - "51566827678833b002600a6865ca88eb18a86b45e11d9b449626de893e440020", - "49abd77358236ea3c1ef1b1ae529c3d142ab97e31e8f9e8a3c521089f6fcf591", - "f5282657eabfa8e75eead24625e91e944a35a63ba2347c3a60ec2c982b9bd8aa", - "dce3e11362731b0c3c2f75b8a455521290f7298f2b7dd24d28b90a4057573394", - "7a26cdb095328ad4fa3ed9abcb16a3384af5232cea7595141bb4aa62049aeb43", - "8b4eee299cb0df53a17c9d084d54d9efecf3d5f4ad6fae82eb4f5980b17d62a1", - "af6dcfaf2ffbc0f4efe050b426ef605d31a5825f458cdacfb92db277eeee92b4", - "336fb240d7f2d81852bfa784163cea0cecf1b237f672b6f17152ae458afd9164", - "e805c4e3fab906dc08a8821a492a4c83deafb54eb765e635145652019fef0fc8", - "5876c57c08bf0ee0f7051f473cbf30d660e81bdebd71c9647bb61964b7d0bd5c", - "33961a319902700ef51471dff04ca131ae5fe7fba68e2c2e00c5d6e5a7a1dd6e", - "88b8d16dfaebcb47300c2b136fa606495186e612eba1ff2618e995547da03efa", - "4b30cdca675ce32d1f8f19b5048dadc8fd63c6ca4cf1320a6a2d2a152806124d", - "f78f9b5a988c5c1ae9a29ccfc24a2b2d4a44787aeec4dd24ce81197f9de101b8", - "7bf6a33368826a2ab08ca71a172ce91cba52084714e757fd7db13a77a039744f", - "7347a5aafef7106bf6155905d06fdee41e0e936d3b510208eeb780d9667ca09b", - "1d18f42d676d117983ffac4b199bb5b49432807d766dfe0f63f5d119825b3472", - "d500167c9ec66b1212fdd1ad44605a27eba0ce9e841d505ee2f552eaadee6de5", - "7a8f011b9d441d53440b200c468fee6565a5635dcb33e9819d7ce135ad6ba7a0", - "cfc2a7d43b3aa2f1557f42f87402ed6d5b40837ad8b49ddb7bf3a63711b46a7c", - "c4fd723b4b11f2bf06e827d2a2e2cde975c62ba2e820e5c58bf1354e799b7426", - "9d4a267f135b9457a7b8888eb547b2fe3e87f3e03bd6062e2e5beb7e714fd9bb", - "df6c9ab622cf86be1472ae928e2d75e43784c806e1e5a68f396a9f8d33de3b5a", - "f2039598ff1606f6284fe04384fe9e42e6e6b2774f74641a082f4a6134869fb7", - "9915a413941c814e194bff02966c6f73a28db5fbe31d3ceb27911ebb9bf1f822", - "684ef742550326d72d579cefb064cf68a9557a0db0a912b5dfd5d1fcdc62d4aa", - "092db8f12c5d5975c2231ede7580db17947b2944ae17ee563b1a89ea8b359e5e", - "eb24624dd1b3aa58929c49790b563a2af4468a9154bc82538f0de41f28db384c", - "67f91805a68f9a8c87f49d934da417bc990544845d469feaf643bbbdb99bf50e", - "c72b7b4a67cf1bdb56a4510d50755cd7362649b75b2090ef5d67398f8af8260c", - "273003916321cf634184acc871817b21d7b57a1361839c9543499ea9ad59acbc", - "0e9bc6308b4c7cf085e9032cc7c3bef4384185e5ef81c0a77387285f4ee0bc10", - "a98f45f68507fa25b8afcf39416c55c2c8e5acf1a485cf692184d2665b716374", - "487542644d2e6142fb7aacda63bbdfcb0deb5b122547533ecb9f6d146ae04feb", - "c1f2be7ba65367bb46da13390fd59d6cb7767344e50a372ea379dc46a41e26d0", - "1f85973ceb74b644256321ee88d1a95aca6bb6677e61686ba1836c1783b33413", - "72bf9d77d7c5351dbc8c941633fe8855f8d4deb2bffb007d399631983f5619f7", - "fd0aa6673233974e03c726d4a410b18d6f1aea9ce18233621e801165b0d4bb0b", - "ad7b116f0b520f4fee2141d19e08023239932fc76551b9081f01fd9128114fd3", - "dceb8e4606670966f1159a172fddff7a12f733f882b67a6f26219cf67576fd1f", - "62ee69be74a41c986013d9d82c681e6a6574a3f2098b1dfbfcafcdb25676ec43", - "a99c06a4b79a2561cae3f1fd74c3faa249ce789f810ffdc697d348a3f9d549ca", - "d7e13d01c1773f61822ef97b4199f4c966125e54c29180f388832b730fd30b3e", - "59d58375a54556e89cdb8bf36111bc0e8cd2e526d8a2ab58ee40cc91203bbfae", - "c00eec142ff7d8dc03b30941a8f2965d1daa265a5231ebcbbc69c1d26b2cb6ac", - "e1992508fdc9c0de7bf67da10bed1ab7eb658b84a894c8a71f34926f24caa893", - "5f94634c7e8640b98869c8342d9bc9eb1c0cd793e9ed5debeaf5affe7c3b9453", - "b1db6f5437a01359772e129ec52f1a3c6e1017c5d4537a40f3aa0eef1ff9f721", - "bbc381554fa45151531ac5a595b3a35dee05e11d37bb2ba98646331e2ca5d8cd", - "8ef74c1f9b5066323ed0303eb4ab1d5b005547d03d5e2f9d94bc0d3dead782a4", - "2dfef738df748c3e74ca20b2ea4a28cd032bfc269cbab448b8c13386fc8135b4", - "415799d7edf182d8ea69fe70937683ea63fe0efd82f199b6b8907963651d946a", - "3b89ea844b59754417195e35d7b3592a88b333f0ee34f04ef26cf48782c90490", - "69e0525c31065044cdddef356ab3c0f932ba8286a7843b9d9d009bfdfd1d68c1", - "e4ca15ae3b17a39945dbb30c0c183bfe26173ec7a9fb30bd685d00197a66ffca", - "c8364420ed08b4c505add2c5a1aa5d7b97d9b42c559022c0bbc0725dac8058c2", - "a434a35b198b9d9ea166b6081fa5622e5f3374e069d0dacb27012eed1b76062f", - "f10650191281b44b58ddd816dd3c70365d92fc407736466c41b9e2117897ef87", - "5425204d09ccf6cf186076140234047940f9d3feb16a545b50a126381d4401e0", - "1c0faeace5e4393466834d59bd15aba9e01b0385afad96aeabb753beafe4bf90", - "317e21a375433ee841b713b9d4781c91523876edf4a8fa73ea79f5c4c04d3d40", - "521c3ceb85dbbd1b33b03b63260576ef146182ecebfac2c76281049b3393f1cd", - "03815ec9ff8bdedeaf97c90a0a81f47fd94e4583c49b53d933737789ef1137c1", - "7b0c9cf2744f0236e5c3428b73fb75f454dc4dc42af83d4313f38f3600f995be", - "c491babf7b2c1531fcee66f6b9171aa74d6f48b7e75229ea020ded5cf11ed64a", - "eb8d248050a49ba925db40ed3e74224f51710f27dfb5611c431f317a46c1980b", - "731c5f68f1306a892c5742b1b49eec631b634ba15b912a79fba9e73243fa2314", - "69cf638c8caa77594b196baa1ad2e466e3de6fbf3092c9ec90976d3bc8d9073f", - "ec58c4806514ddc3935bafb858f4fee912ffb7b7a63e4c0c8aeb93eab0268afe", - "2aaccd1e94a393be2bc24ff3ab5490226548dc99959e0d9633dad1c1c587ded3", - "a2971a81bfbe367b0812b13d49465b355f1be059eb9d2192454c57107dc92598", - "9034ceb3a34b4486fc64ebfd968d260e155e65f88256ecf1fdee220e4619aa81", - "ec7b06b4d4ce1f3adf74e51e9125ed1a2732e6897999422780529d6db140cae3", - "655a85ba679a56c6c154fd9d7d6ef838efb6c02c3a30c635103b37f2082724a5", - "da477651a09471e49807688ee4e6e4a57aeefd436e34d0aa676c6c35db0c0b27", - "a6fa92bcd7aa539998d1e472e4eeca2f7a99d74866988865884f46e36f054750", - "5ec7ce5a9fc3e93dd1051a8585951554ecc2f361c229770557c6bdc9e00475be", - "359b110dd0b23d3be2afbbb2c224aa4ffaec199987abc67ae8cad67bf7a9d1a4", - "fde1ce586a0618154ee2176bed1bcc0e734744055815125b78523e4bfe7c30b1", - "db5f09f1cc9299de04e994f25789b2ee84711223e7c9f4442d26a385222d474c", - "f55274d067688577c1d33c8de0933669628d7fe96e9c0eb8aa7f8e39b0cb3115", - "ad8c57d34ca427e0d824d8ace06100c21821ca6b003a48267fa3e3510af2e8e6", - "87ba8e28d6be7e9b7656b40668eb715604ae26efdf9bd2c014d817e8c72a9a3e", - "a6dff7f7a5cbf12c41ec7cae7cc301e2d2aeca2303a5534a9bd524818e649edf", - "ad7d5d2eaeb777240bba0cf279a3723b74d047a077de2e79682e556f7bbae480", - "a60c517b473432c553c4a7caa8c0fd5da42167234d183fa0527c929386465bed", - "1b546f0e24c78ec141052b7a82663b6c12dd45ab2274c709fe22b9409a835e93", - "8927468c1757d9db8b27f72ffef24a341afde57f596bfac53b962af6cab4455f", - "60114b90c56e8cee0b1dbd075ba55fa62fe538e902f190b3a33ca2493cae4bbd", - "cde5ff628964382475a8c7f2efbb3d35643f042f33e87005ada8be7028c10030", - "d6ac90ae2425e61eab9b6e50c9d78c58e4e52590a18baa813ea5fd6e40d0cca7", - "1a25683f5e97ffa6d13480f6fec4528588588516431289d5f3d71fd6cb82f844", - "d3cafff7edd9dc4f07faab1e0ec29a3ac5eadb7252312e4d8d32b6daa036c49c", - "20b341e5e4bafe3c694ea472414b223e55265a1ad60f48321b2100594f1c8fa8", - "7120e6d898ba09de75a26d2964e43141f2f77a1b8bf5d057e7f51485032ae0d0", - "b16f752dba78ec37a4739746e0c1145c2bb1f2c2ad2734ccc41cdecec4523e5c", - "65d3ad2e24eac3fd2f4ebb263d4c05b7eb7180af69c919c71c377ae41ed95e81", - "5b5c3f09f84b31c9510690b404e653135e30582d614d4e4141dc6b6d39023126", - "7680448729a59aa2c71e74527816ed2fab019bd847bcc22645b0166bff4a9336", - "79ccb8d7e13d272fb5905ff337a9cc231de65cf12ea01a48c72d4ff1d56d3160", - "f3ba1740db6b14fc145573e285af8500a47cef5765c9567c12d54082be2c13f6", - "df202bab3d06e875fcb42de850b1c13f31efe74ebb1d2b6659a5e75dcb6774e4", - "72788ebf2bdcff5b23493d1a61bf6a800f56dcdf8e8d828bb199e4e4a4f8163c", - "b095c552a51c6cffc63432d58a1a5cdf0b72b3d148f5821ca5c875c04abea0eb", - "0432dff110056e4fbff26223e3ddf524dcf4598431314ddf880e0a1ebf98d601", - "1149696a18b39931cecbf2dbbd5415e16f8a748fa300e88b1c482e2a2780de06", - "4d932dc1aff4ae7d53136ac0f820a8610bf2abf51534d6826ef868f126e3289e", - "19cb18a2c4a59ca43e82f81d4672e01029bd6dbf01010c72df3978e680c77b3c", - "909385e896a01f5c63fc47383fdf43f1645139f53cbdaccefcfef6a72bb2b017", - "3df2169324f09a5bf6ca533501d010cf0b80d7660f420e6dc8b7526a9e94a7b0", - "df17fbbaa93b60dae9f5d32bf8ea10fcdc97598f6304490cb6cb1402e98e34dc", - "beeeded7edcc10be0a57633035152c88e82cb3ac6bd73475417be38494efbcd3", - "457a5c0ac3b2927a35e4fcc0a10f31d736236b6aacde344afeb95678b07675ec", - "a768a840900dee8d7fedf54164a58dbdab42b2e53faaad9ee32a1fec7be1ca1e", - "49e1c4f30462278e8ccf29f8838fddf1f4d8a6252d9c9eaa396b44ed5d2d7023", - "d1ba491204dd10c4f65f91526e59db611923525485e8059f516da8e36e3d2f77", - "b14b09643ecadb8ccd91a7b6520ff1f960b5f777209aeaf6184095996c7c570a", - "cd5b52462d43eec7243c97c46ab5ab360de200889ff3909d7245120a25fbf82a", - "cbabe2de5995795e5672955dad2ee6481cf442682368ab760e1205d421810560", - "bd38564df64637be6fe305af558a3b8fc1ffd5cdf5ee3a21130e3f69312f950e", - "434957ecb00bb4ea226470464d274434a73e3eb3a5468883923f68449cdd24d6", - "76b5a690d32d38ec0dcec8ebae25bec229886d9db8d3a3ab884faafeb94ab6f6", - "886694c8dffc6e22a631065e2a76ee747f576913758f3a88617b84083d955dd0", - "dd96e11d49219f50e36dc4e5370d6e88caf813978121b2a00a4c5607eb63973b", - "b6073f9151b4053e620e9f1a178207b8ca634f5b59352942e4976215558ecbf1", - "78c91fa8a62b74ff4d97f8003352c0e342b06a4302e918160ca5cef3c0866e86", - "e3d2e8bf03896f71fa6648d034c86666b68689afc07b97f324f528c27bb9a368", - "2d92eed7ea3b23f80e1dc76ff5d70a554ab0ce6f3ff9244db1a0cee8e6919137", - "c9669641e643a47f7cf7a4c2072e9539d6a320a59f59a8d2b8d4644adf5da7f3", - "69f4132f56077881ca714dc8e17a456f2977a47c7d875414064fbd09a8591acd", - "6a0697d35dffaed49c060766ecdd8d5f8b152d362d446fb26a6a01c0a4375fb7", - "5dee9a98188b7d4b0464e1c469908ac757fa623d2e747a663ea14947df0e1d19", - "ccdb82b9cd560f4aac25ee8046f8427f7ea2e3e8674f20cbaa878a624abd5c09", - "72c9de600a857119dcd36663c9344dec6b6a89a1f0bd93714bbfadd4780e2479", - "02f1f78ed480be160bc5ee6db94345169759e8ecc16d4f670b8a4fc22c74dbd4", - "3e2a556f8630deb5f035059e1e736a53a19de579f60656901b11e204885fe625", - "5fcfb923ec50ae66607485ec4ccf1be79814952728f2f4503e186370078f9127", - "5d2be398ebb0f8a10bdc26f0b6306f633c177ff6c894246811c019e5183f5a47", - "65a6576e7e4e44501544ca00c1062f3d2b42b4347c1b9ec2047d4411f39583f3", - "16c6d08b3b4f7f704d5e9fb97eec261d24363cfdc90ff98719b459bf04ae49ed", - "91be41a6d8b95cecde29ec0e5ace02ef716828ba1b453a1727b225bf67bea54a", - "38d40e49d61c8d2baf452054f68c450a3633f58e1a6362176c50bba46e73f2a2", - "3561bcbf060991008c2eddfd61b36254f6427c50b1b5bad6d6245be7ec3c699b", - "954d37e251f8dec35f41bf0149437227755558b8c0a5434d36ce317859c4f685", - "c8e6700a27326cac21b12f0bc3435433b0e8ab6de14ab1eaf36f47406d750870", - "df78962b52374335238409a0c9e8827e29112b266efc0044f193e8c95e824fdc", - "89f5d5e0c867f62926b333fec1a41a70273f2dee492513ccaab444ede4a499cf", - "84ad5aec47bee333336cf633b8683ffefade262085e4d80ed7516bd1c34dee7d", - "7ac8f62fa25573ebda99f525f81e361d2b6fa6dc694a5c5bf3047dd10a82008f", - "b3b383d1c6f661b47f33cc30a33688890bd528faf68dbbb33886f7fbbc556aba", - "0a8a37c1557a3a491aa589d05fb768033e7aca1b415c164de0fc4e9cba1ffb75", - "a5e62bac6caec556927e3182b8cb4bc0fcda3479aa2aba9b4841e5d7a0b77bbd", - "97eea20a21213946f5437347ab342a755aab78f858f94dd43c9587c05000d972", - "4d6ce32305d07f659dc9ca84a5da03891791a12166a5fceb90109a2821c58e59", - "02aeae58a40ae34ca641d0e76f70f15f0e40e8baac6d48755377c69a5ee455d5", - "f6245e5a8086fbcf6d5c0e9ebfd4f648561db55d41cb47cd8bd54594ba1fcc44", - "e767bb78e974a962e3a5c66be94615940c77e75d8c267c2ef366d13cf0e792d1", - "267d5ff767b01c1b00e5152a1cfb46ce9b17caf5ebabdb7e38f4ef8a29bdafea", - "299814356e1983a797df2b5f01d7d66b18b7b0ffe66331bad31031791e1f36ed", - "f4f63b64d3ece594a3965fdc0c2c01289e95135bd6dc11e683b14aaf22e4a878", - "c2221bd8897df58b2af91b070f9e342513bf684280e554261dfd16e05a35be8a", - "858f920d24de6dbd9dde331f8afaf9608207628c9b3975db76360b069f037d4a", - "b41572093669c3065e2dbfa29996930b69a384857cc81eb2cbdd56fe4e6700fc", - "bf9f39eb0285abe5b8726d8fb44e97f31360a4d9dbfc574ab87a2c52119251ce", - "6b34213aa4df9629e8ccbf8986f96674df6eb36df7acd7a044bc7e01256fe020", - "1d0321428a00823cd203f643675d7b965f70fa6919d5f9ed373557471b19df44", - "90a37ca3ee3736f9147427bda786a6480ef55de28cb997ee89ef617f1ba1695d", - "fcb9b1b7b229ca947eb3bd127be57b3c498177bfc048d357ced24bf86930adfe", - "90c817992ca5b0cb7bba76c1bd4cfc26083e489f040fe5a8ae571b6c9c297298", - "2b4e2711b933c78019dee85348102c2f42da548cee179bb44c78255fe09eb41b", - "93e4e33fcb87b579dd83d1738c8022dc1ea72ee1d7d92d5340c61c69ffd40e7c", - "ea70c5bb511ce0ef1d1fe885478f3c604d81736021cb8b64ee75728ab1950c96", - "6d69cf9c138db7a1bb5b22f94a045542ce562d950ebed244280bedda187425a1", - "bda9b32db2deca1789182e43067ac264cea1bb918972659da6b5243014311e08", - "80b7336bfbf31b36aed5e8cecae273bf9bc88f7303c27a87aa8547da90affd58", - "ba7107a4153ef8fdf2ae3e771ebbbd61cec7e042df5e02adae2d6aa60ae6b041", - "ea33075118bc23e1cfe57ab7c5c9d8369dd597766372ecbd81b79ce7368393c0", - "70817f315b8dec71839567a3b825469461d3bf6333bad32acaaedcb55fac9538", - "3dd2edfae4bb3f81b1634f6d4363bad5ed5385005ebe113f82cec83947ef93fc", - "cf67236e431b11ca2f0b93a697f4ba3349b74152e3feeda2fca85b49f68e2b5c", - "1ceb869c95ad1374f726275d6d1285918d82cf9b5b5d19a4b9829f68638fc4c5", - "0b11fbaee35d41a56f53031f3a3c11ca037642ffd2c951e358926fd1fbed10c9", - "677550d42982ed5810902645bad51d670157dca1798e7c5b1e256349d5c9ba20", - "31d3bea0691d30a2bd4cbbae061806daff697d95166ff916a6a79254735a229d", - "5797d1cdaa4d02d0b1670cb8c281e7232e60575572a87a761469f3a1ceb13b94", - "18e2f293f78f131798094d9e6219d21b4cc48c6b918d0704386d6bf19e00cc14", - "4e111cf971c9ac7bebcfd6013b61620bcb3a255731e074696d25341e5474f2fe", - "ce45fed419f34a401fa31e3321c1a335b30cbde0cff827c4dda079107726dfce", - "756da3440c19e9b6700d61abbfac8c6331bd47407bbb1bb5ce0ceec89ad5d1c5", - "77872f21ac7bbb4684e10b6e9d98aa042bdc9d16834a16aec8ff4ff6a98994a1", - "773ce569d3f0f39a1252f0cb96895888ded86345b3495885efd058fa0c9eb652", - "15ef125eb03ae51c509c0471c51e64c3f6d2f0f2d03b55c948e98ce044ad4e8e", - "433b2e838590cef453bf74a95de401d58378fd37d5137d7b1833b52a39c2a308", - "5c7fc833595c3f8a2ac32b161753ab52ef5177d84a0f0f398adfe64c7daa776d", - "46784cabb35061aff42d007769841c2ce3ae83702d23d4efd3f7f71919e8b6a9", - "63e2de68662dfd4e0f94763a0ada2a4d71fd2c23f9b95c390bb0a3c24350a052", - "1e2c5a52dc1e51c723214b61afe44c8b6869b70057ad58b08b39b4c5168de9b2", - "cc65158a559d619d0b77af813e8efddf3b8480eb05bd7fccdb97cc850defc834", - "5a9810d3e5ac05a53060a8b5f0982c511f58a0b30611709490741ffbb7e0dde8", - "3b556f40af56c813c5069e8e2f0530480b366bd98884f60e638045d6c71ef34b", - "770d2ea0a0bfbcf45ecd431b21daaa8e466fa41fc9e7c7d0ad48686050ea5c2c", - "8bf0373446df8220559c958785505b487dd8b845eafdb61453f4827bdeb0e33c", - "d623d9308e1fdddfd51651ae0d408870e71dd5708b02ad780b50817ec53e06a4", - "c0737303036ea6a1186cbc79cc4bb69d8e6486899060b7cb8cf1e21d006286a8", - "e98ceae21c27ebc2fadfedb38384698c2dd756f17f336f778f094ae433858533", - "26c4c6bfe2dcfa7726df9c61b396a51c291efd81ca33de79b9db9585d29d36ed", - "d2d020ecd963b88ff6f2eb76723d47d00bd94225f28ca0d5b07541df990d1c49", - "392ba7732080dce19285693aa805fa49a6ca656ab551a88922d26d6eae9d0804", - "d53c9bf5b471eeb53bceb8b795e228889698e5710438cdd70d42678fc4e0e44e", - "939b94f78650e980dbce77fca042109e9645816b09a064b75ca9e5722cf56731", - "c238df745e41545775885048a830b971da1b7128a0003fa1a34c21551052370e", - "60c310fb6e3c050be6c319c00ce12af3b851313d14605feb5b554b8b5f46409d", - "4d6f34bf54d8dfa43a3a0ea36a8ad5e6dc97665f7723aa96d770093c483daf11", - "cfcc8ecdf2e04e6c8302f13d226ce97f6dd081c709770547c6dbcfc5c41a3f10", - "2d19192061f6c4a2e1345b14f05a3ab4c128c72ec34724f5d8028206789d7a89", - "3cd3a389c8a69a3387590f605e06cdd8be6f417147ccb1829fbf15b2cfbde1c3", - "6d25d11e6b66d880ab5bb2d17fd021bec093846634595bb1652ff3e4a6c0a200", - "c11b01b51eb1469ecfe276edb4f573613b7a6820751e51e62039204bc67888e3", - "3fdbe99841491e817ef0d3f9395afcf6e9a4377f1392af14de66bf34487ab3b2", - "5495407603680094ff74aca42283446838640fcd13de9f499079ae12d2525f0a", - "8f281c960feffcbf1e50275fb37c1208ef1eab11323f32dfc2e2c4b510cbafea", - "d4229b1947b2f308c9e7572dd8c8554624ece89be955da1d8db0752d78e90f3c", - "578027983b13f2a5820278a16a9b96dd3abc09006e7641bd9a4b1f7fdd15cd4e", - "dd51516ad4f72137d386f8a84ffd85c1319b6b1440f2f21d8edf95700abe62f7", - "f5b4d45a2a7cb4b3271df405f016742fdda9022c6b6ce744c064c7db0e5a2f83", - "8ffc6868a34a6db9bae1041f9126be768e36de0142c398219ed96a2c7e4b9d7c", - "49d682df543b0309cfbe79fc144de6c4c0a35785cc34324338138d8b8609b5a9", - "40314804f82ab722ea735a91ca406ee863eb77d066240767074ee6a0139c541e", - "1a30046353b5593d699960d9d4bccf4d701a33fe52ce0f0d3d5f593a77701868", - "3e3c14a7def5f961ad702ad2811c18e66c3f894b9bd2cc3fa066793a26731f5b", - "71b3ec2177718b0c78e9ad8650d7082e4d74f9f3e0da29f6232f035bc810f737", - "01599d0e85de2d71a1e7053982b6f03f1c2e7a3e1721eac16942597308069bc3", - "bd90f6c899b4c7e2e67a75a2632664eed7b6627faab968c97bc0ceb44800ff98", - "0b167ab9c47c77825c94a83b75cb52cbd843b5e9109242159a54ec97690e6bbf", - "d2ff669926bafe83634cdae9024d6f921304fc985f813765f921e23c0d0a7929", - "4050b6a2d2925c033cac2b074565093993aef852d1bd44cae31fd3fa511801f0", - "ec9d5bd6d277451a9f02efb859920fd3fadb60986cf4027e68a3785e94a16dc0", - "302a10c71f908016ede2e79cda33b6a785822a1b5e5ce734a7f807d3bc476c04", - "00e6200a7fd3fcbae4f94914ce575e688dfe475a4033a379424f876b5a506a3b", - "e2ae94ec65033568ddd72ff4beabd3b009e7de8b6218215b7babbdace3317589", - "e517e466938a44c2d076d12e4f715e89c66c25808dcbdd98be5d4e5bbad15ff5", - "88d4ed16b39c9bdfa048c612baed6eb6977caa25d7bcbb2160f8818729b6824b", - "c7c85f2578a85cf56e8ee2b65c356c99e409e1fa9d8358de0daf81c5c57bfb61", - "f68399ead37afc026228de1646583ec9a08d0fdd6188df55b083069eef4901e2", - "4f8144a6eabb9fd6cd10ed50854a9ad31d2159be74c651c05980c718007ca991", - "1073f4a595a035d88cff7e536e47f375c81c3b3a10a69d794b3d86292d0e62c3", - "b58fde0ab813d0aaf3768362c8ef7e3dad42ade92ca5f16a862aca2fea270731", - "088eed3c3350250263036eb3792996baedf8c8242afcbe7d8faf0da914b7b92c", - "8787cc1dcf3312883625d360a45c98d6f5e951b2e5675d3b4805a12bcf7cf4ed", - "f7c83c2b8ae9498aef7da9fc0a942577f5c3a3e7e8e040cda628212e2908f2e9", - "1bd5fcf5f38351f8c9b50c25d72f61355594925ab78a681402d1e71353c28806", - "90412a5fbe7df653201f12a886ff867170ff88f4f08a86ee06d16a2a1784eb9c", - "0007c826fcbff0dbe9d4f4864a7d93e8410f21b70972bc7f6827f811c84229eb", - "5dc2afeca53c110c88fbe5cc32dee1fd594d876434872ea8a7301103ff0efa05", - "79e6ea7fd4a36823db95d58ba21ae014ee6be5fc7b400a44547a3946ef4314db", - "503c50d0c742cb1deeecda288478c69f7239cb0a260d59b7973677140a1d961c", - "b033ffe12935bb4388dcaba3d1847fff189f0957140da02481e0ddfc8ee7bada", - "90fa31bde624b8152ab7138919d107b66aa7e5688fc1572acd0987717378b36b", - "a1a97f94f54996e3e8303f646d6bc036885b53a01aa80df8610f9044d2f6e877", - "6711cf1e96246d633705fc7b65431c0a9945bc8231e80a705794dec5f4798cdc", - "52af7de6aa3163e54b6acb05f6c09c0715c104a1289ef8c06a4c11837d519311", - "7a9341b52c667020cf9ce3e1eaf3b19e384b369b21c7c679f0d708e796e34496", - "5819850638808210b4b226cb0a1db57112576a8de103b27cdebb573d2e4cff00", - "01fb346be24d3a35936b0f79f713541dd0d34d8e2525e6fc90059f1f2c583691", - "07fb23e6754e7f3c85baee738b7c3da2215fb58da500b7c633378e1760f9a3d0", - "91c79f8c36d71c09e6a5688fca35b7298f9db91afc121f77ac823fe59ab773f0", - "82d4928deef6a8d3eb3c03860092dbd37a55fa25d6feed00a35b3faa51efaaf2", - "7dca2b996a0853bfbbf90b1d65466d526c97a1e481618b4f40bab2819aa27ea5", - "d974bb66231db38e1ad5f0960e815475b14ae6b6da9dae6dcaf6c2dd3f3d0f2c", - "784db309745ae73fba1b3eba12ad19bea01365968aa11b2dba393e3fc3a34562", - "337b8598ca6c92c162c7a8647169d73b8b107d25f3b4af1927f0c22668112766", - "ebe1733114ad3dfeea380e0a970a536671a6db9b21aa98e26ca6fb75df32e417", - "157042ca479de1b73218e9e71baf530b42de52cdc4b780be1fbe6f4f14ac9338", - "eb6c4c9869afdf7362913d5645523af381a3649db1ce429dbd97547664f3cb14", - "b8a6a96de07c405e258905452372068e6c98df40c2c1f5f13bbedb3d46069529", - "084ee5c2b06a3c1070fbe74a52bfa8e98f4d1d5659d3cc8fe6b7ef7719db8b60", - "5f387c866808bd587117b4e3956f03997dda7a2ea4f866f4791448d756a49e64", - "86099c32897feb41f13c9881d11a44f7068cd1f6a185af652d0b300a64e084da", - "52eabcf6e135a8fb6c67c94abdc9f68c4141538a184ac67e8544813fc4e3f857", - "55f9e2e79e9a97d020056d675b3784b79c17dac37616cddc72e6b25e8adec4d2", - "1134d2dc65fbf3ed6616afe0482c3fdf7d6c1242d01ffbbeef0480ce1acd81d1", - "83e04ff64cd2dfda31520080c62e18ce25951f6046e0f7f82dd872c1f1622f93", - "a3e306f2388049d24a7360fd53a951051509e2db40ea504c41f2458ded7f5ba7", - "001a84cfbf8a1b5050dbb6e90c422d143b2f9bdc9ac09b76faa8774acef22fe6", - "edc1e9edffd68481f54a653062a94ab97c50050de8b663b682ac718cd6c3ddd5", - "99577b3cfc3f8b9e13e8866d7488f5ae3ee08a0701cb9500d53cc92ed6450659", - "ccd04822e98f9b35470b2bb5b5c2d77c948df73eee750a8d8951255eaf0cc2cc", - "a5e4b9c280bb6ce564b38cd92d97eba1084fd9032f51bb529b5558eba6bcd2ac", - "6001fe4eae7339af6a5e4baca09fba1a9e080dcb6389387f661a64a29a67e3cd", - "c3a4504a5bb7bcc433cf1bb0b94693b3524ef49f54c29b6426b0345b74bc0cfa", - "44d2b2746d252f3181d084fe49313f5afe32980c669c6268a5963d4f0089980d", - "750b268bdeef05931a974f6efa8c0ca7ae9efe2ba60c8949f6ecee01fbab19c7", - "109e17ca00d794f97fceca8578c6c42dd5521d02b88a1a67de22ce73e7443c72", - "9ce4d3f900567d99c5cc81b398251fe07c09268d4639dd0bcfd47e5b540e26b7", - "c3310e540cf0a46131fc1cc0c62fc81222775813b0b52ecb69ae896db8b3bb08", - "b4eba86a5a5651c8603fa1764d94f01e2f57f61e6b9d5541565798c045a65c87", - "dfffcae23ca1f84701e8a311ab0f205e4022bae725c8931fa2d311ebb78c2a51", - "f5d23c389e29606f93f0ac6abc694af1c4336a33644c094bb390662184320045", - "423654b15c43fc701eb39946aff2d7c30fd2596f6ae99f6bd4cca95064acc160", - "0b429fe8c70ed5a096c1f3aa91037c6e6b200b5127d3888943311a3c59327620", - "3eefec80688a47305785b22724f5771ae7b71ef9dbf2f92490fc35b5ae44afe4", - "94d513384a510f1c9eeaaf35ee82a632dc5fbbc0dafe367c7f9603621b298856", - "00cdc370615832369ae9d659d50865e8a088adca00fb11a3b62df2769576a77b", - "d3bff3dee39e58273fa5d8e00ce8b3b9ce862810730ce488b0ee5caa7f65cb27", - "dcd6f82d4c8594d544f0ad00108d4086cb929c3554ea38eb3a8b6e50e3b3a0f8", - "9e1c3ea7202007e20171dc91eff71e6ecbab827a2c35d6843a27ca96bcc6dbbd", - "b92f96a330541c7c6108ff3fc22e4d87b7a5d3e3ed4fd8b4b91aa10b70108b0d", - "eb222851f1f736aad5f492225db3a9b58e20394a23691cb3ff0b4c20eff2893c", - "cd64fbc3b5f329c29f3b12bd8f7616d35d808d87a8f9bed279c654542f20d44f", - "ca0044784888d17f166871e2245125efb3e378fef0c92c1463a7a061869c8e08", - "c307bce8d7d0bf94ae4e135bf9065fc8747061b073618ffb8a8ee1d0fd9f03aa", - "34ecff13d41d44df8a84c823335f044abfe5e17ab53c6d985cece594fb5222d5", - "dffc7875b6d8f242883de0064f73469411c0c45c3e97583c2b5d9b34ebf9169b", - "18fe443b1504f34825903e72f70939bda9442fbc4a82724ccdc99d4e955db7e6", - "ac98c9b7e91a0131a47e61cee08a8634e7b14d208cb9b01a197540ae22180677", - "c715345bbf30477a29dfa0d0fddbdb0d47e3980f7c519c1b02b637cd5c0a91c9", - "e283d0f734cbd84382f16afaced284de61210a6ee8634f1809decff2dc2f8e1d", - "6251fa0e09e9c63fb58454bd358a200b02fe1d0d48a6018da39ccd636b60ff94", - "af786351b4704284ee90403692cf1b52bf7b7b2e7513c6e40dee09c4dd609070", - "007a7d2b61a6919020bc4bbb4e1f7f5a570e08953c0f580e4f6ca97eee6e41ee", - "9ade4b1bb728bf3e9078ea2631447ecbf7767a2c27384d7a13d7d9633295744f", - "af62047d3df428eac726187c56b7960b7579cc4ab56a8d1331b60feaeb091786", - "6d93c1efe75a49277aa3c04998c25853e238cac56bef81cb39fcaf5064fa2c4d", - "916d64508df16e5e75ee17be4c8e0b82fb0cf182ed7fcfc458d1b9c4680d2385", - "b345ef9d3529442cd5fe18d9725c64a3e7826705c3ff8467c7e6c2077e153934", - "48e7c9d7ea365a41db48842d207dc3c41581f3ebf87973000c4a9a7fab7e6771", - "c401da27f2ede325cef09ed10a60a147e1a79b5f606942fdf2e146213dadd1ed", - "bbc51456e7e47410f6d26b0b119ae54475a6fce26f14fdc255343310dea0f5a0", - "09c1e52e7b50a79d6d207982887801c9e4714b5b053669710694d2d8e6fd4449", - "7334a28b3a752882fd3caee7cd34a7ae6ebdc76dfd250d407b0ef43215999d42", - "748d9cf9c0e09bf2fb4c2ab9b423b3d8d2442db15721a8cd4830079405f532b7", - "5ba8b7176908a4e36876a995bda484fecc11b26ec5d57ba254d3fa0e9334efdb", - "979242a1153594d30ed93298794ba053f3fca5f88a278b70d03573ce83f69bff", - "9c247ec8620d72c08fddb2aa4d873345fc9e0101ffa9b48317260c4cc7e30237", - "efb433e870e301e0bfe8addbae80e0d342d8dcf4108087792fd9954be9d09b2d", - "777489599f786e3b84bb455f0cf8098c7d55de586e5bf6832d914d0c6eb67133", - "cd59adae28a850d81f02cc5f1579b7584ffd7cc18fa5e949517bdf3a3511e93a", - "986d0e7be8188e4297930fa84a6e6446bac9901c3d7c8795ef615334e97b6e4a", - "6f0d06a550ad412da4d9c27411178f00b6c18c93053f61cc3fb2a76d70e7be3f", - "9e61c1195e04e1e9092e717a4a81958e522cffeec5e9a2ccbb496ef5a82b86e7", - "4ab7d3bfbc869848c8d96e1bd6f436fbd6a4cac6ee91a71ed1b2ac458870b2d7", - "d6273438d48d98454c5270631a22168aa95379abd4969aedb957ba45180c02ce", - "1085d4024e3f3bb2ad367d5abf72b811a1280916a44a834cb11005baa5662a4c", - "e6369ae77829ce766cda82e07a6abad6a9f44656994861ed81914bc1ab6b5589", - "5d24a5ab51e0415adef589d82f8d6593f0b4d6a50e664fb4453d8696fccca188", - "54ca0d286023c8e05eba5f21ceda0380d2794fa4a9673fbf1cadee68bfd776ad", - "a7885d6383b5781ecf09be3d7cb63028507ac37adaeded24218eff21e3ac2ce4", - "d3f4be0edd00f6e4797a07954a1641a28b728a65f556983ef0d97ea5e4989cf9", - "aa91f00b7d81f679d3daf0df5022f19228ba5f007a3d4669884b8a8f586c19d9", - "7f60b413a80948f68ad484b4bda9743542834a9de64e4c843bac0224d2f11c01", - "fcece92f40dbc50b32fc7a68f525a03571f5ba4e60273838e57519dc48fc0693", - "dbe90cf3c395538eddfc44c6c9ff643f0c31534f6a0a32ccbc1f72746542cb8c", - "be98b460921b4bcc3ed3b41211b1fbc76708134ebf45d55953cb06fc5b17800f", - "a50da25f4a13b64b51db54f7db99dc45a8306ec880123be08b7dbde1cdc5b891", - "fcd99632a4f199e11d5ed599ac9a2c92910caacbb125ad1ec451c080bea025df", - "8a8b0fc14b6a116569ae7891b33ca325460358485ffaa9b5ea2f2d14c50564f7", - "9a4058b6a53bb5ac9c9042652dca1de687b8b5945ed3cd1308ced1f83830af35", - "79ebc92c26b6c6ec4079f6f5336070192394260cfc0b47f88cfcae85864b9888", - "e7253847e03210b957cfef1b8e9d8242687f09b5d4d4c256a8764f2d2fabddb6", - "837350f3224637420a17d79f6aafd6143bd96b42f3a18bcc66eec63a78735c84", - "e047b9b867497c770f1d7327d13b4c4d8bd1d8e23dd1a9c3af2ded79e23fb117", - "4352e05bfed3db8f3e8963f465109dec13a7e86b1616e46bfa0ee88629052ccb", - "1098021dc9447f5522b525601f74ddc4ea5f1d1b97076c81068304826b19ca2e", - "dd8fd789282e71ca58994858c81f47125e1c22e44c6a0f7f91c4db179b25fb4e", - "abf92b079d9224c718d090779517af180666d2290626a5dc78325eedce129d59", - "66cb7c010579097b7ab5a42aedb76dee8aab5321abdbf73403d60fb1b3dc2b20", - "ea82fafc43e22501dccde90d58ab6154dc025f627e9ffd9d33b9d1de7d258720", - "5970e9c98ce1b1dacff304a7a6f7fcf6ab6564015563a249c1b079445acda741", - "a0fb07f19ae28e449d14d245b52b7ea57dc2bf29817cf9bc71c4f9a6bb4c58bb", - "5621b56335d627eb22014001d76b73689f7964de490e7a3ac0ddf6cce62c6db1", - "469cda895c28bd3febc7c6f9f110c6a1c94bda7af7410aa43654ef66c1af9364", - "14d3d1c1e5278eaf9b73a426f6e7ff6eba3a06f08155fac616a50e70eadaba0c", - "366d2f5963ff16bc8224ed4b82f846ce86b90aaa0e5dd4123f55d01c4d5b3e30", - "5102477be1653a2d283cee4bcba2b68635a9afb127cac44cb22157ddb2e2e1b6", - "9f6ddd12382d3ffbce13afbe9f9506547a67a278db4d3dc11ae9d047d214c27c", - "abe764a0df752a13796822122cb4280c683bfb34189a8b04b79decfa5bd64c0b", - "99f105d9f3a58c01a8f4db08730f4265b088d41845306aaafc28b0982b801f69", - "5168add42ddc13b497241d01965d13f9e0354998f122f8748ac39aedbbe64735", - "07ac72bed833843177a083f8f4c510c7d95555b04860ac25779937574a23077f", - "ab479306e293f1519d84a81e56fc2a8f2f08e56e98c7889cf5cf5b2991f71586", - "c6a05f100fd342826cd3df9863f4e645449c75bacace740d5e577ec8254cefa7", - "6f1ae8b4f92de0f75baea939553f2ac1b270ac1d6c28c8c99c31f1cb76ef649c", - "e099ba47f5b275a2c122e590e23cdafa5d0c1bde27f878b91b4b967597820c0f", - "65d45ee6aaf2c9b0236aed2842df85d9c73278a177e98a851d9aa6257d1c117d", - "be011cc8ff3eb1b4600557f34b6da2769d7853c942f3bd21da4feb0f10f9dba2", - "c6e22e3059740d1994ea50bdf13472dbdea52d5311a989d1ea9f4b4b2072d825", - "4279edf31e417625ef2663b3f5004b184fcf5452298f5bb8e210d9aa320ea88e", - "26734b95cc19dcc78f6bee364ec21574af82077fe8a9a9afb231da3029b198a3", - "ebf3fa52e6cfebfaf7cf954dc4331a4068a2c735bd002962ace5d4376fdb5ea7", - "7e56463a92298d244abe08e2656e00480f9335b0e789efdbb4c8cb49809d9cd7", - "c09c79e4a1f009d6d2ed03029b93125bbc7b4a9551675fb6e84f1efd0864118f", - "efb248ae0cb56b3e8301079240ff14d82b463605b89f4bab75c1c39e572dee4a", - "b717dd14bf2c7946cc996faf25f831e4f35cb456e62caab7fc707f84fc77eea9", - "cef3b03203a81614b03a506dcf49c4ceca8791340aceaf7b10e22daa14c80a90", - "cabe61fc6575bdb2e51574bb45109cfab9fc7c9d510e590cc122b8f3089416b0", - "a4d5afc6665682425a12bc134cac5e6cdf203fea091824665f21f4d18bf98a21", - "fe343996c5884242b6e7c28fb5627cc733f67f9f2f4a180281c47bc0c47c2c49", - "e21b6985b961af9e7de5c9c516f4172ff0de4614d5b3437816af8114eef358af", - "6f79593ea464407241217146ed4c65f5475b5fa8eae15a09b745c2592d3edd54", - "e82c7b0b416a4b5cd40feda5f1a90e4b52e19d0817f9b4008dee5451fa748bee", - "2c89ef8c2c6c05c3cdb003defbad59ff29f8a09ae67780817c864359e732cdd3", - "27f1f736ce247028f6a78517bc703e4ff361de431b114d649498fd99aa188e0d", - "82cb35ee07e89a2c5d31569bd509937c22a4df85fa7d2b2d5013618cee28ee59", - "50cf1c56310b11c68f82f32c7f9ecf4872841ca498d7e9412a64eaeff0e16c58", - "1bb6085e52b4c7808528a3d430b664b0059d6c79e032a697883d0cdd937b8099", - "af4daa95b28fd52de37341b7ca47d08abc945374d5ba3f651a0145e7b301e613", - "a3e551d0673508ad68146a5a15be01831ab2a9c90917543d147fe2ec1f82b3b9", - "37237513eb6ca8bfd757281ec885b920537f010f128d015314b6bc153e637395", - "c893faf977c33544adfbbb75c932647a5d25414da9b12875ef356da83a356e51", - "8f47e9d0952ef60b7e5e80f83ad275ccae2ab52fd46b519de99e6fc96c4c8b76", - "9eaf6c3253d5b1f6c0e721776194da421743d77b139b7c52b7cfb0c8e7212462", - "611955cfdf0afb7a547488854c5ebed489042d24528ac274b77bd39ebfaa9605", - "1237c2b50895c1479e8406fd154c61e7706f70d465d058931cd167a8a20f2649", - "7980e7ff2e7ff5965ec664325c99a7a015b0748c51e2bf42106b06ebb82fca8b", - "ed033863d33e363b6ea2f0512df7c3df9dab17290bea9fbc8e368fa6cb124be0", - "6c420c9ee94d2208fc92833375e2bbb4247e68eea0459d6617fbdd88f2ecabd8", - "981ae899116cfc392483dff705dee1e36e70ba6025a04d22f444733fdad91a2a", - "0185dbb8ec6808e3673f22bee15d8e078a3c27d91adb71667d668a760abc9baa", - "6d1638e0fff0120a6661710fe68b1768ea7ce36d8bde3c79c192a20956e2be2e", - "eef4b698c38e15728fc5f29af60f64870819b1255c33d9560d10d0ab1fec6dd4", - "faa957c3277b99ba43b06198c8029cf8b75809c1c6166d651fdd4b7ee0f2f083", - "2a8839f5b3e5bd18b5f75222b7f500284c1a14d1f5e8b17b061f0cae698cd341", - "34aa4fa711ec384dca5b0ae63232956e57e44894f56d808663f051316624be7c", - "602dabf22dfb4a355687969f5087aaa6867d2dc9ade797276837b113d7a34ab0", - "b9e57116eeee1900e95ee5d0c5c9d8e9b5373a6491fa8dd8807c186f592456ab", - "107a92a1e91a48b597995f7600cb00ac3e48e436df62606c2f367d9fdf9d68c3", - "e2d89afa715f0e16cc31580d7d8b4f4cd21b9040b91b20e9e42db607191e3ce2", - "46fb7b7d127e0a53c5a2355ca333e834cc804aeb7928737fd27e50537d498918", - "41be21983ea4170bd226242c9147f20dac3b74420b0193115e2cba9ef25dc632", - "a0eb6ddf166ceb8e72faeb6983bbf64af7dc332f4fe55b0af8f92218cf2cb79e", - "b671642b769c850f2813b4f78682a512af0c0d15942098b88bb2bcb90971587e", - "b932b3777ec56ac45824fc409665144a16bd675d2735245261aeb57cacbf7f40", - "b67660eec2274a55c3d73f936972d4992a2703adabc3110eaa5f8e89d758971e", - "f2011f7a3555328654f7b82e4fbfd66ded6e3493e3ab85936e949a14bf2f3d8b", - "0c5bad4a9ef296c3d87f1327d6a7ff7ee900f97212cf64a05cd38cef581d42b4", - "f197d26d42c36ba1a669c1d013096d1edfdb57ec39ddc17c1812ef8992ecbb1a", - "69e2eec64fd197fe0d65a96e3472367071672aa703985c721a0b984203170007", - "3c20dc36f7f44a2e7d909c0531fa7c675b3a336b4335b1b64a21940a5b3a0a1e", - "39a7a932524c359d59dcf8f630f31d6388414fdda1fef0d92b51cbd281100f5d", - "d9a12ec8eea2dbedc5732ce4076c05e82c1f28349eb5376ca58e552c1ea596c3", - "8696f99d03ed3e1835959128040570c0891ff319b45762f3fd2c47edddf899ad", - "4dda3419f0da04d093ff9d470a280fbff8535648de517ecd8855fc822252893e", - "5eecc284b236cb3ccbae532803317a932652225747a1be9dbbf6ceab909a0227", - "413e9fb14b603705c8456703f5ade9e7943409aa64e6a55d0a61073f98038117", - "969a72c5192ac7c5e20b8d065b8cc813fbdc8fb6fe9780f72bf3a105f6ccd223", - "f2a467c03bcff3e2101538dbe951cee46538ef1872a7f0d4d4da3d6f3dd9fd6d", - "e1eaf2f253c674e5e200e0681d42f43d012e791ddebd83a9cca5832b9eb864af", - "186d9523fd263873f997e789d9a1e027fdc1bc9a8986dd0be531d0fe0b1f3172", - "84950c8045a7e22c0500197754046f2dfd350201b70be3565e2b3c8ce5ae5c8d", - "9441805d1dbde07b71520221ca9a4f352486db0d87e3eb642395580e22ac6aed", - "825ff9cf8c01c0cc66a92c1b4a55f78c9dd9cea354c928e3863e78b269331145", - "fc7796d0c853a9364c1ce73d02582a69bdf5b0b15a38b8f92d93be7ea553bc2e", - "53e1bf8bba3d8c83dc51e56593c26ee2def0f1de1ae577dc6022ccbc756ce751", - "9851b3998c8b9f0e47c52853472a0dc297340a1592b9bf44bdbfc46ad54bcbb7", - "e046042be141fe074023f44f50a27685b14b68fa371a4027a95f18ea30a29e7a", - "31c58354a5356792914ceb00b7f7032e54d03adf18321bb131b8cdaf93e59cb6", - "0b54074b8e258a41e93844f203d5559785e69ee0a3f99d80db1d7560f6254864", - "ec1772753cd2797aa2d639040457aac9921e0a06869e032788e408b50069e2ba", - "86bcb91ab6bf642d2d064a0cc68749d86efe46f9fb0f66bf2186ebc0ba2fbf57", - "969b964220b6d139c4413e6486cdcfad50233333213f96b955ca30aa446c599f", - "69d141ad2035a65d988e611e8639537524aad93b1e0efe926b3b15c6418fd15e", - "1226fb5aa89872bc302b83f4e14fabe442f3f5a1e0bc2f4910b15cb7e200ab5b", - "2821697b8233288975b15db4c46b6124594495ac7031d87a054daf425506b250", - "ff10f96bea88bf9843806937a9915cef6bc2614cc9763909ffb399cc80be773a", - "3be02eb9051e797de262b4a0a815a34acdbf3f8034e8ae4ae3c0886d6b38b4bc", - "9bde5cd126888f9487c3ea9911e855121cb3dd46cfff91ca25773252c640547e", - "63b56253e3cf16e3ee23b7497e42bea8ce961dfe4ba5c65ef128aa38bbb53d22", - "17eea23b67365cdf8f72f59bcc7f3c2e1fc7f8b2bdf4ee6756f3204c571a714b", - "59dcd30ea4ec00e73a686d9be0f2e729e92d3bc3002dea39de1c65ecd1a70a59", - "abc7e96390083bf8576c6eda0bd1015433296a7a7462af725557d08539caccf3", - "be93c7b9601f889c467ac5bd642118f490a5ac2a6705a8bddf3f2d78b34ce725", - "71119e8cabcc2d3b8cd080e3ef9eb274447486b7268708dc3a5bb92c85f6afe7", - "d34862c4e65c72782ae711ee9ebdf29ba2b65d29c5df89f07db475d0d7a67b8b", - "b94d668781759ed1f6b2355c98ad87effef9f683390462c3b30772df7f1d69ba", - "64fd410336814f5354c8cc1e5c3432e8346d96ebffb6fd92018050f9f24ed121", - "4f55966f116807dcd6f041404df00ea442c4e66441f40a32dd8d568c442eb586", - "e99b091744a187f2cf845aeabb7a1f007e0b8bbb4fcd3bf6efd81f11c6d1de94", - "f40d3372c2ceca33a80c4413fe0c060b289168b7a256747c7ba8b3cb99203ddc", - "208789aa325770f55819676485801a1651cafc3200904e132f0114481d4c8591", - "ae465e16435a3cc44230ca5c518dba3682e00fb9227587eb67d21537a1d4b31f", - "b1ab6f3e85f508de6b61670ee1ff1d66fcb593b44bc9e3bcac190a3c1cd5055c", - "07ac31416e543b7122f57bbb1e65b0c7cdac9e29cf153b4655764d0aca273aa9", - "3794bf35e1f1a6edc9ebdb93146c481b256abc1469a2dca23073bd699c0212d4", - "d826b59e660927b1a340e4dfa10b74e3f587c89e44893bff12acf90d38bdea59", - "1a5761ddd256ac36e016f57800008b505f441050c6a8145c343034fe4995c4f1", - "721ec40ef7e10b9f6dee61fc1470f6cbe615e7cc9c90019ae4a8bb760478d3c5", - "5d2a6d92978d697dd8a3b8f933acf919b7bcc0755003644ae075d675e377b391", - "be005a3effe7d6cba1ee224d7786ae02242f355435085fd86756fb97a9e3c6f5", - "60659b80d80246fe2b8e28282cc0987e7ef3555761cd2fbcaec01e76b1295a13", - "927bfbc35ddc0f75353cb73d7365f8654bccfa531f4397d751c618f71033e03b", - "6d84d71e8eeae2a8279d468120624ec7abb56843ce6ba8b6d89a2f35f322fe04", - "e8d569383b31418fab615c64ae5289f3ff87328a163be477d23f9d9b8ab4f242", - "cfc677af4f4c09e16add86de03be46d076db1fe355919f2ccbafbed73263aebc", - "fa66b03820ec40265512d8f07d28b39b28675c6a06052048509bbaa1eb08fa82", - "1c95b609c4b2c2ce711ef61fe05e1c542d0135db1139493b60013187b9a51239", - "b5bf55619192715d4029d790b8aa6f03cb9ab493b545c11e1d946bcc11caf549", - "1dc603cb322af2374808f611f77d00fd1f3e88b8e49ecddc741174cc5533befd", - "9a35c8388c7c98bb4b5fb2cf21dd8ec81ba3d8d68e8bf34dbd5f013e4831c1f3", - "4199b4a181c01ffea516b9ae1ee6e7703f75d2300dfba03276df827f21d61baf", - "70e88e64b4f193623e3f8f109c9c9ce61cb9a2b1f749cdb19cec72308e20c073", - "9576e542c15da52a31084d2b57e72ea1a8142670c93a06122bb6059a7e06c00a", - "a2f38aca898b51156b29a4c9725b9a5ce9dca34c3932d8e4db0e4d7d014b01a5", - "c7a8bf5454a8ed64c958623ab37d8219a4ec5d2f6bb092f6a2ac6c9888e5078b", - "1cbf1bba271b6dfaa4e4b40c59fe083c1126cc4a10df397151f5c750e88bda82", - "e4377676bd99bebcf41cfc5d0db3f92846dd9eecd0c8ac17f43e072fa460ac15", - "b25011c1ddcf842d5c30df55b09d31bcdbc729c006383bc4c6a30774d93783eb", - "070f96a253ca3377edbfad1d6a3fba0f60af2326c8da612004bea6fd770fc8b7", - "240a712c4b92ccde2e3a869ab7ca86917117eb9a8f1ccfc7ab621e4f82daa6e8", - "69f84f2094d8c8b8c54dddd4f81e006786d843d8d1cd469b54e5b8b7f3c87fe2", - "a9031ca71e76eeebf671813821d82b540d8797c7f9764257da03b180d26fc5e5", - "1eee2d51c444de9b11f1d4924fa4d17bc37c1987079f6b729ae659c56d455265", - "29ae6ec5ac0fa35bded966517c76dd8b577365c2de0948745d91a6b1dce811ba", - "2242a517c58b39f014d7e3e5b1676608f0f91f89895a8a6722e99db04bdb5dcc", - "9de745cfbc5bba4a2be48e4328752c35b9b8354a86c930fc3982ebd971b29f02", - "9384f1d33886847cd57ebb5d2d1792099dd0ca9d2fb7694f343999e6984b0a8c", - "d8d52a9c998c9bd0d2b01234132bc7aa2fbb7c9664c05c8be88daf57b86cf2ec", - "2f5b43cb82a878f487a9b4627be4740106561b28ef2bf25af0226a8aa6f2a23e", - "af92a30bee04ec427fe5eb6c4231260aebd6ffe602d4db243c766b11bb520bdf", - "92c9ca86bec650b8c735b4db5cada1b0cdb12a2d0c0eb33f14f0ac5c029a4b41", - "d8b779555cda2b974102419038bab9e75be62e2ac172281d77345486ba5f79ca", - "1c4fc8d9684db604097993f6f917d8cc3bef98a11a9eb40bd543be2555e520f1", - "d490d3f149a9937751934c4e95b2c4bf8bfdbe9f490e7adcde6fc32e11da01a2", - "fdf55387d28793d6b0d998cc7ba7606d5066c1fb045c2cc4fde489d4914a00c1", - "cdf9cbe431dee81b5c2470742182d9d6bcc635ac4569482e5bce69360dd321a0", - "7ab69796c8da2237be855cecc5f66a644d41992c82d5b7b5e20fd165f1af1560", - "53125e8daa562f032a9d915e68513d88b27f0f44db8cf28c434f5726ec35f040", - "682fd0bbd75d2c484457c0e3c856d41e96f8fc2a436fd952080df7793f10bb07", - "4ef148febfa78793c5af23d320a09d04df2fe978ae0fcbf1d6786e84eea9ec5b", - "bccc0b28bae2b6265e64ececb346e6694d74ffbd37016b2252d11349c29f1217", - "7d0eb6b171ff274147ce24aee7f62e6d350e4a1326679b232ec585f2cb69eeab", - "dfda39d0a0577230266cf0ceeb2072b84f10c66fe716ecf94bafd59a54856ba8", - "8c098fcbd1014d643bf6fafa5ed7341503c791b9cde3137cb022f40b2fee8196", - "54b423794f9cbaebcc6e32dbed9d003d6d8a66394bfc77597f6147c29aa1aa00", - "7685a115a2864d4b065af73180fc4b7f7a5eca9b4f0a1d512b6975fe3a688f14", - "3bb864671f9f9f0539ec24ab0e27f7250830f0cb5e2173fa17a9414b1b4614b5", - "85fb54468c6c376dc853d511fb27a245c55fba06c0196b35f0caadc7773265b9", - "f0199507de1eca6006bcd16092d697226fac2542d35c2f616b3a2e1c871ca10b", - "a53b8c13b2ceb7226725e93d89ceb0eec9b8d95a5dd496f688bb91aa0d6438a6", - "c6ea57bc8ee4c722f50760bb389c75ffa57bf5a5e2ce45843f6fafdf2be327dd", - "8e0cfb68b1f2c9a55079cf7c68e0da30b99e05124c638ade6f1a0774364ad23d", - "b6f9b58d835b529dcebd629a9e814909fdc2ba443a784c90c0a37e6a76181ddf", - "e42500307ec44d0ea62d44ce7f2e7293d18a0cbe6c8e086ac16a35e065b1e662", - "35f2ea690a4a6aa18d8fb98f0f764c9da85e36062b0f4859f99253a7dd8e706d", - "92273c3befa6419ee000630ba1f8c56a7aa66a4feba9b23b2cac22dde5b6d88b", - "8c011577466d5c8f319cd28e38774245fb83da7b59c9107d811bc28760296acf", - "0ea9e054447a980e125841906274f7ffcdab4bb8a98935b78c76bd60f5732710", - "6e106eeaf079b1221c2d87a9170c64806bc7315823d63d96518e87838dd40247", - "379bdc25903dbe3286755286355013971be45f88f9a8eb8f6aa610cc22158cc5", - "99f2df4a7b2028d8b55da1b0b4a6c9e1b296b89840a5315eef4af3fa1f948e51", - "c3873480ad8180cd5c94555481475ee2ec3a3339044ec98929c6aa8f52cf7ee7", - "77e3c3fb1f2167a840a5cd4154bf296e32a0ba815bb905a21cb5420077ca7eae", - "56a5a758392b006eb8a44dea65bdc730fe0a6fee1b156120125bb1c3eb1b6ac5", - "b8a2be238e65db4a811642cd936b64b34bdfb86a393fe9b04b3aabf8a0f715d4", - "8c7e3403cbd02843315bedda855f79ab4c123153e89864e1a8331998ef44cb63", - "f39802519cda7de8f8d77a5bfd0fa81d46e2a196a150150c5332316d8d8c6b4a", - "1af6395694db801af08b4e763d642d6db08c0e72f78976795e7c0257204e3cdc", - "21e5f8d43661a5bdb201b2aabbd0fe74d3d575de8ee456805bf339475454e3a5", - "8d38f36116256db41469fc6e8375bfbaadbcd800c3d45b5f0a5c5aa2be6fcb31", - "2692ed3109751ad1ec39fc739ce2bd2335a7f572538d5237fbe4998560c42b56", - "50bc7135f927bcaf2ef96c9d70adae676e07b085f448da71ca9408e9e5258ecd", - "dcbac2c0c2359f4591ce62cc190d996fbf19d323482cd490546a89cfc1ff3570", - "75b2f797dee6a0a920b774c1b9b6a41cf6c64e722af2b06827d3f963acfd6f43", - "815c979cc01494c3dd7661f64f71cc35e5348d6c4d62ac211af6a692bdde94af", - "fad7f5e7fa73fef925cf45cc99b9114bc4dc51e1210eb6e5cb35c912f93b96d8", - "43925fec7ee6e20db01ff88b29f0e279cb24f3198fb463de06875c8f96946b14", - "902fa7e96709208429dc7b43b3dea36a3c37d21d3f34ff565fbca5e3fe16108e", - "1fbf0e944f20c2e5f97d59645e09e206b96502a21c2f1776898e68da4e1e6ee9", - "1825434fba1e8f41f2738571bd93a73660cd51ba4489be1ac2ababa75393389b", - "5fa0906570cfe04316f56e458570cf36cc897ae08b279afc98f7728b1ae18d29", - "166fb707cac61f76226ea317233d07caf4a43cc588efb94c0efdad4d88c6a0c3", - "3303337e2daef9d82d268b788fe2fafc769d92c4e23146b01cf4b49551bb9960", - "59b2a4a2607931ca7273ac65df7a9aab8ff4ca742df26af1c833ab685ad43747", - "dc6343daeab6700d63e29d124f2c3deb76629fd184be291142a58f357e7c3724", - "b15c37f117226e391b6d234dd45fc30178cfe01055a23b6564e88655cb9ade0f", - "8c55195ffe58dc88204b7a35d59c81bce8972625acb0dcb06b18779324b852a3", - "c8cb8155f58939798891400228205ce7375875abd39486ea57d93a042542c472", - "bdea69ec8ded243d4676670fd427ef1e87f68cba3e9f69630aeadfdd22739950", - "a1bea9b5a4b1e3091c1598ca6fd0f8dfd49458b431158d625c768e7026007f12", - "361a3581d6de5c497d10a4d75d4506e33be62d8c6d5e4b83f3bc291aafaac0a4", - "74d5185b249e60bd2230746d55008725534558e453d87269a385008d9e2b9e74", - "2b08859547a16c7211e012b86c407baa5c1757228e6e3a2cf35b06cccab98e69", - "52d81ecd4e4ab60fff1befe0ec9726ff40adb51fd4779647f3359f6874ad1d5e", - "84cbbad0a8d562d1cd4aceac8d3a07e77eebb651ec780ec1ac158fc49c2def17", - "bb89a050e5ea3a09f7f1a3a356e7df189e1ca24184da2cf5fbba12dabdd1eec7", - "95ca7419c4934e84e2c35b1c37a7694ff1ea49872de2d9786721cdb72eb2b523", - "9806304b11568f142a3fb4ede2b1ab63d403420be7e7283b0c8007b07546d6a6", - "8d7aa5138142091173208452575309e13218aa064a105b239c3ec272c2a0c97e", - "f548c553e1661b604ebc58a82e932ba19c31d5df30d6db7e9336abc6cea17d6d", - "44b3c0197fcb8d87a42762f440ec5ebd2dabaf712f429d2525ae85408fb56af2", - "0871cc6f1f8e2b32f824a40caa533d76ac5766471de997ebf7e8f3def99892bb", - "61d207d671b6ae0775623406d1882ec96bb77d443b5d4612b18c9fc249e98d41", - "962d54b75e53dfa45e086b59607954433812dbf372868b23e20cbb041df61584", - "c1ff99cf2241b885b569ea46f466ed70d72922e24451d226f8d4e6770ffa7e24", - "19efcdee2ecb0ff22f310c170fbe21af3520d8e3b883d581466a42414be2c8d8", - "ba46ab8f9e7600b35870ef1278b112fc3a3a59805159f3ba8d7559cdee16d62e", - "cfaf4a7673b364e9770da36c6f305aabbf84fc0c28a7b9bba539135e05bc211b", - "74ab951f9f337f8a6ddb7b81e562f8d233228048dfc8ff854282bb26166d1647", - "6c0a54604be734951e315ef6a0a4816dea72d120eeb90350535476d0af2c6773", - "b1353c5ad57468fc17376a488fa310fb030e43fc82b14d6bffe18614f7e1bb02", - "8b2ba217649a1488de7e5e81eec02c7fda436a6d0b83ff1b42340c9d4444f4df", - "4561b5d58283e4d0fd78f24a6a5a5c9e6b01614bf670950f6eff78348096d4ed", - "21b6e0d3e0f37b1d7107d128c8c5bc0081ecc0fb06932a26245cc1f022d29b75", - "f84755bbe5f252909f8004d6afa5eb5380daca2ba3096a4797cc089d58b5cd13", - "d9af88ff35a8ed7e8270dfddbe26a97d22e18308d2d8a3597cc38853fd70b027", - "2c82ce8f92ba6d26246a35ff27b3289912f5beaf82d1115942328be929086d38", - "fa1cd71febcd307f08926cf8e39a020eb8a57b605f2fc1a61b4ee6727b2a5d99", - "32179fbc920a73cb4ef9fa60f4ed5e2caa5606b8b32ca19e57d97b8333ae7917", - "a0cd7d4fbe224026c07cd66eb2954102b9d3492e386168e325fc753b6c941ee3", - "238140b865c6bdc7a53b5af2ae1bdbf227f86846a422c10285260b150d9bf49d", - "3d76ba8b379d13ba6e2bda9a218c0a7c235e7c91e8926f12e6a69fbecad3be2f", - "f66307664d117ae0a713f85358c3960895bf5301b0f5e277cf001a35f163d449", - "2d9129c22ff50911b4d4dec707486efa7a20783f6d6b16d531f41f79ca407a34", - "7fb330aa08f29102425b48f4048b3ef7b5e8ae5fcedd6d79943f552962f09796", - "b946a0da31504fc21f02e908d7c3934065d4d6548fdb8675adf4698b0c58e76b", - "9a5cc65a034c76defe7abdb8b28756f499fee9956c91d1bfe6d1c2c210c50ec1", - "b3c37d91c4a1373a6a13bc0e093882b365dd7daf564165b79ea87aa86274f7d6", - "6c32ec6c28f171d10a472a1f47273295c52e9d3f7101f74ed8c85dcc0c1fb2c8", - "c8647a5b3b4a1711203e0a221aa097e9f348db253880b01e017b6381c076eb62", - "120bddcac50a1deadbdb158346beb1366880527b4dde77591cce6d83c7c051a3", - "7ab3184e6e19b02bfc0493b429449c8d0b4db9a99d1580a51dbc02dab6f7724a", - "935e925592fb796aadefb2f9ec7bbc87bb2650786f2dc3d3c2f1762a5a61b4cb", - "2470c75a592fa2c740d13c12652125b0fc7713c550c6a5abe882747ed6743a95", - "048e7913e748b497f6be6153367a5ced9e8d42d463e7706398be7cedfed07401", - "672cb10c351904f0e74dee10a5c37850b5cbefc5f64dc55fffd0506fcf2542f7", - "051df706c99254807741166a2fc7da58bf289d432c56f43e1bd45950fddefd22", - "86eeb2f482e2cac9aa7a4414587baf47616aafaf23c5d8d8d41e058bfd797ddb", - "2b8efc1104e06bc689de3324e6413bcb33e40efd1e6c3a125a9927c821d021ab", - "4175c4f0b83671d7f5a6471ddbd3e764de7ccac37c5ae3e0d7364b53988cbc93", - "c5ded51f1854a5a05978fa8c09654d4ab3b88833e603d6767e6aae4e49fd3f1a", - "4c40c67615036b303f5297baa04be89533a89c318091ec6b6e17e7c5616d2249", - "e5e78a237ce72945e5da01f04b55eb9001547a8baec70b652637432893b9e5aa", - "f3de3c497a9522df15f2a95c6cd7b2305288c570b520d62b5f4a08b354fcdc1f", - "61c3e08239b6d27b5f86bba4e01c4cc9bf81dee53479703934ee6af2b9f78497", - "bca4e3c67c9f51d6b7d63265db0b0ca95d0378a37fc0639e6cff8424c33e2670", - "e68940347122f6529f2255d4687225890a241645fa33aa9b61a0e05469cccc22", - "dbf7981fed234f39f912ba1f4084033f5aee67924a848ceea08fc7bed24f4310", - "27d5ec8936a4739d11a4c81d50decb4446be4c60904ba78a569528474085fbe4", - "d105dea6205b00a0c5bb620b47bacd1dc48f474671fdff0407da181874946681", - "cfb2900a8b058a9c67b117b09ea817d5232196e2a20d7f773d2055837cc59689", - "5e837d4d1f25e04c7d53cac9e9ebff97d1ca951df08bcfd45885c9e881b387df", - "a75ec525893189976619d978222dee3897ade3f9af655119ecfc41f7ecad5ae2", - "224818cc635b6117cb2b90ca49a9be9f8dbc4339725960dc022e245f4302f3e3", - "7cc3f19ad826c9b22f7adbf386a3e69e590bd360871d5a065938af96795fc3a8", - "e81826bc8a7e35d57a931c6509f3a300f751c8f349938093ae832e2019d8d448", - "67a0b91616f60660205465c67ff18a2b818fb2dadbf7b12d124241a71a73d384", - "e8160bdde63f10c8516d188a890d84015c166af89e80eba55f41fabec421219b", - "aa25d0a086e5a3779dfafc1978b7cbdd805be58d82a73b23edfb9ff7a2660659", - "dab327afbedd5b2620bf04417aa8ac611b8e7badd8a94c5fad8f4ab7fbe2c5a9", - "3c78aae87f6a096936d230255a98cda258e0ff85857d6a6583f9e3c076415641", - "f393c6afd28859d6ab47b644a21c238734aed0e8d2938c39d1a84b0e90ec876e", - "70c2661568a7c7742c83a3d9039601d452a15a2a51c6efeccde44e9920ecd313", - "a2ca2046a999beffb53f1204b24e8e037dc4ea17a230eb87e8c0443318054364", - "6eaedc535b1a25c326cf8377dd478d9734d45fd581ad28ec34fbf49f8d1a662c", - "f5e9497f5ee30e576e25f65f04b0b70677c53f40f82c957a71efafb77d956bd8", - "93642f96fa649845e2e0d681e0816c6281858122f0604dc7f451fcc63e68f6a4", - "1b76c6fbd6ad50747e728ad0b99bfd713e02dcd3c55435545ffcb486a26bd8a0", - "98718cda936d637221e3058f10443c24deafcf62ba3672f4efdc835a577c34fe", - "f47e0243c29ab0a26f64f48c1f27b02587d77cdc4166d8a6c93b942d7e18091d", - "6a31a49d0cca09459fd1674ae483a80acd25d511c4c71d56b9172576f2f56e37", - "c95a72a0a736b42091822da57163d7bf4563fda436dbaeeb31e26c144aeab81e", - "12166a094fe8f50c5abaaadf79828661b951e6db86cafc4ebcc4bef336fa5af9", - "1f1e8b26aa137541b1a5b58c1a07471e8033bdd8003d340a72cee6464d2883f4", - "5d3f61e53f1f16eacdc2f4aca41603dda3f82bc183721ded079575b78580e50a", - "5a3de8fb941bfedead7fce758a048bdb0d245d8356990d0f09ccaaca7898b23f", - "f1532c987ab29cbe12abd72b4d45ac1bf53fa0be7dbfd6c8acfaae036e6920e9", - "54474cdf2b93c31f0d9188f98e98e0770a85e5d51c2289f4b45e648e2b41e1be", - "10685ef78f09bdb875ae2385267aa02e36110c0229b5ecd5a3f83d60e487d70e", - "a3897880499c1ac6b1180d6b066b0ddb6f8d7718b7f2070d96df65ae111f8e77", - "aae4ed4e6f50cefa78942a6ddd7021d62557a129cb9beafa1f5206c7a127d750", - "b24e3d278359bc9ae9f4376f2feb12a55c807bbf48b04b8795a23ee5fd03d892", - "af3a082d29e0d2a09ec8148be4a23902c126ee7b1b36efb4091bbdee4172fcc5", - "6437ddaf719a37889f07913cb33aa31c57861898b289d2678382b5f996930cc9", - "c2f4effd6d957317abe0f824abaac95f738748982e3f4d0841a3ee44cd6bfd2d", - "aba7b3a5d74e571e224830f77cc884974762ef7d62b3bfe66ae399ae670c5f54", - "c526ba0e3ccad941e41743dd7f0d3ff8f4c7515466e82ad27eac104ce38b39b2", - "fe1c933ecface75200c776581889e56e48910fb591fbd6bd74b3f3cd10a9e960", - "11ae3137cb70ad866c9b43a8ae638697fac5ae352833ec3fd41064b7d4143ea5", - "67f91936d794cbed4bd35b0ca983bdf0c5fc2ce29dc4c45b0c2538717e102f8f", - "ada2ee40680761f4a2bb46f07403477bca42b3d941a7600ccea0da62e55bf42d", - "0938a6225a9d12621a6deba3bdbfd2cf9aed8c21ca293ec2715673bb26d12735", - "9ce60f58b743fdfe970803f497d52aff7955c460b666872fee873d6a45123130", - "a09e8ea62bf2f192e6009e2c785a031e80236488b4647b5569b25255d6ba5334", - "a2c85954b9d0011e513abf0b35e4fe655d9e35029985cae248bff9e512f8e8b1", - "6b0dc86b23a2c5e568b19b8c73b0553ef645b0aa78d6586c91d31f47c887d27a", - "4482ece0dc730e7aaf57664f52bd8254829216411686200d0f20f3e8d1f8fd4b", - "f29b1b991e9399f8c8138e94471337947df67093f9dbf6a7dcb4bb879ae4ff3d", - "db9f38a52e50e3e8d02eea4cc1f8e8491624118dca27b720ac97b6819debab06", - "0b691813f3b9680b69f21eaa4d5c57f3671a45eeb7742f8f7f382deaff8539ea", - "8aacb74d89e5aaefff5122d45d4e06a04650a83a1f30946fa5e90c85692d7077", - "37abc333086cbdf43d98cfb54697175afa16fbd3c84d171df7ca16dd90c8c015", - "cc509717c61ed1aa8fedd6788851c55feff208ce9fe9ff3702507ef55683f606", - "cfa8081f3672d587997551f1810865ca3c6ca00acbd2b30ab702c9521f58d4ed", - "33dbbb0ce85daf8accf769363506c34ce50a5b6bce7c13667c5ed33eae1dc5f2", - "4a0ccea4527ed8ed12e1704a588de351ff65729d58e8da96a81175764f19c40c", - "2cd781cb181a9890731f574a9a38b38870463e9b96bccb8ff176a26f76200ee8", - "c62c4a0e4d2b7de5c3c72f7401c858e152f61e3b65b1f20eb95736c3fdc06e48", - "61394db3bddf90f981294766e2efffbaa8fe4aa99e2a2ffe27c3851e3c67ca5a", - "7215514fd2dbe15a7dbb7a15839d75d93de37245362b9f11055f41f16ea4294a", - "c971cc3f7c54fe8114ea9b7d0f68da3363ba2335968f5acdc154690964b6a9c8", - "5016e061a8f7562542b1ede670027790ce82e2f845d136c89b9a8faeb5744784", - "7ca7003e9382ca32bb003f7892c38edad5d682349887e4200d69bc4626a8922a", - "2529e48aa47500d98f49f18898a15e7c1a34e63d0f3c42b700b1970af9f28372", - "2a7d3154260c69cb4021231126d2621d725e378757211b16a347676d5e158b2a", - "6b3cf2a3bf0a824514c1734c2c58dd54983aaae7b21500e05010d9520a56e517", - "b780e0b7e9932f778002fc42a533b5a23844c90b24b012611cedc878b521dc01", - "04f41985956b5790dd7b77f3dff6f0eb31a43a1e39a334d8502bab224da153f8", - "729de3fb3fc477c5a5542b3506ed517fab1cd4be69cd10000a374094549e3745", - "ff439a8cf4ae852e02b59bf46780928a595d307b8df0fcf9bd2c5967a705f1b0", - "bac806b973fbbc5dbb30677490916f5d0a6d76db2ef27fe855317a7c8ead16ad", - "ea894bb2537ba80b546636d1e9308cadcbeb76f35a631453eab1c20fc02d4fc7", - "877612adf047ff78707670326da7c2792ad3b65617ebb277b5fd5dfaa26627b3", - "f2d1715ad387e549daca4348e0f0e59bcf6d1773c95b285df69946bb2b1a99b6", - "140e3e7bec8283a72195baf53b61bc4338d9f8ffa172f238b141571398ee0c9d", - "a28d7ee8cd89174b2c92f8ff34217c9015e2aa2fc0e0c7ddaf66cb47509a806d", - "8baeff30f22b33aca2f795e22f53c83cdd28488c459de5492a59a69b19a3afd7", - "474c56c9bf9046d6e8c7293ee0fdf446e87e7da66ca2010ced5d00fba53a56fb", - "cd3c5fc5cb263f955120f2b91e0595270ca30376d75ea442ecd0fd42b0c37941", - "74c806e6689a4687de710cc28520e03cf4e0279814cbaf481965197e4ddbf691", - "676e047c266ac67b47cee3f13d4e5fbd7d3db4bd1d8b629180d2fc970a20b905", - "dcd28479d0025204267413bddf5bc12e22461a985d6e35cb202522830515b465", - "7fcc47f26e626a2eedc4d509a3deeb21e50d6bcd1bc73d869a8aeffc19b94ea2", - "4ce50eee0bf65333f1c5e9a2cbd80cef92ccb45d8dedecae0906db17417e685d", - "d486f9d2672cb47ce65e906632d3c7f8158e1ed54d2bbba2ef27f4fb441c8d21", - "8a0e1db6d6e33fd426354d2559c6948e9fe49acf889ea6461073de780b6fd69a", - "5cae7da6ef4138a89b71bd36e749394636eae1400cbca4dc46cf3c4bf3b4bbac", - "0ed59e791f030d6b17721514cc3eda6c4e246a57551139a23d53faafa6aa9fcd", - "e33d33541d1efc332ae576b8d216f53eced0b01019e7c38a8ae36868935955ed", - "a439943814784b2f7ec5ddf0d98f8075f4758a021157ed94923b150d9349fe6f", - "bb47b6efda33a10f5365344b8ba5686f16478f6efbdc7e632d87ed5159d1dfe6", - "93b9e5f61c77a9dd68cee25725eafc8288a468a69d832ccdf2a9fcdc37d40ea7", - "1d90205536b26117d0d72535f27b808abd622179bdb63cbc9d9acc1fc65ca589", - "edecaf1f10cf6039fcdfd5bc1e9de7a52a6ce60019ad5a6848ca4deae4a9f303", - "b7fa906e0e13bdeb3c1f0d749cd861362b7c4df3be61b1bbeb6c179d378afc98", - "f81d1aa8a4ef7a1c5fc2f04b2ba9589f100bd9b2b04d44e6092df111f44af575", - "a01435d3b45e279633670c785ac83dd819a17867d970a5595d27cb3faf39bb58", - "06a51b53e59ef58f4f873b0c40636076c8a9aa022e89b720604ada3e353f92fe", - "9199e8c5e0b5a5578b5209be269d46eee4f3303fd49974296bf0e55266fe0b79", - "421d293673a465997ae4762fa20e7f6515c8aac18108b521e13ee0bb8d7ec682", - "71cb0c8a7cad138dfe594eac8f67e3507d841bc1b4fe21d5096812d2b71f5175", - "e7819b4bb47b81740d2ddaf758007840f58e13df0dcecdd2341786825f1b39fb", - "21d0194c0be639e9229dd0b406764a490ffdce83e957080916f39c443a0be1f1", - "232642f81570e6c1b22022313ac77445144abf46a0f78d6f08cc2134993deb96", - "12f3a527684de93275f0619f6b5d858f6d28338fbc164b62137bfc2f3f435db2", - "581f60169a8b3b8de411e80c7035dd1bfe328a7fcb5688fe8305ca2e8721746b", - "d349f25f9b45ffe6b04ad42c2928b31948152dd2528bcc762a6f7f379d8ae130", - "85618df1af60e21e43ba68b58f71cf25b088b079f65575cfec75a569cc2366da", - "0828417042b3991e262b47cd21729dad3317919a830cc66ed2e6590b094135b4", - "787dec51b05f9d4a1f05f0a3b4c36c84d8bed579ba936863251c62d195dc6315", - "1e5d111ead1e03b5c5130d90f7cd0d5856dabcae68ab667bcd6b5cbb67106b99", - "83488b20077644cc140f2fa4436f96b765dac1df3bd6fbd75e07ab3514834fd1", - "a0bc5502520205ebb753ac11118fed27df1bf07ba03829996f21c9eade6a8bca", - "d0ad503d88cd0c699148d6c568170044c0d92ac69dfd8c14abbdf46c6588ae23", - "2104abb1cf2e3f1686a85f20749bd328499ad58cc9c29aefaf85dae7d8ea1cec", - "c8ff0bb0c7abdf9ef9e74b96a9b8e977a2e4c4d54b4c7edbf30a0c02e49da8cb", - "b5d8b65aca5b09a790043bd2530c04ac68ad772f84dfb13d25d4d2b39ca51f04", - "a3c6486a7e4514c8480b416fe15511b4bf64ea9d7d1779c6722c2c98b502ee0f", - "f21bf250ebf69b23bac75b06e6ee19069240efeb5851ba47ba64446533c762e9", - "bcc66215e5792268ad960680b87f431ded5a0839ab43c6db31cb65972910de74", - "f6e79dc92d34cb712938580a44ba5d997374567506c1ce87d968fe8998899428", - "46b2fdb030cdb3391dfc47beefd58ceb5e924948922251f8b3c5aacc8f09bff6", - "da2b0d0f34948e1fd672ecbac30ef443b0a8053aff65378746106b87f9b1be34", - "cf8d6892ac99be37b189867d7137d396daa9bf39db3fcd7fd7cdba4d275aa429", - "20212d70530e121f621e7831b73e5b2e0755de8a34ff15f501149144c001000c", - "81473a30ab7c136c8c5635843d2f41dcd39580d9f0126508917d258c380c29e0", - "6331b9d138be106af8aef4c6b4be5e9ea97f58770daac818a389c86fb02e4ad9", - "2b8fdc3abd228417298da0f56a08b5ab5bd6c5c6db34a2a06b2914719c8a2792", - "d185ebfc9b8ac4649a1a1dfbe1a5b68d90317f41ededd7a950ce227d32ceda47", - "588a4ba56918b43b3bbe80fd5630d9ff43c02405b43a43f9f49a657c968196ba", - "c4343dfa672d5d0cdc70cd1353a65892e01d54664f3055663035dfdc45836cc6", - "c4045d8c45f222a6ecce52b7fe5f20ccd0e2ce465dfb9364cada85ec7cf97028", - "41c2e990e9f889bcba57c284e3eaca36504c2b4228e0f2e143ea5acd16207630", - "ba46e1480605e33432ed1a81140e31208ff8f52caacccea79ddb2a29ba90d73c", - "20bbafabc6a9144253b3c4643a347b226bb876bfdcbd3a1a00454d9e7d7bf08e", - "1c7fd33792acb95d8c9b84d699f0b8caefecc23b8212d98d3b93494039019a04", - "aab7dc66aa05148dce7aea89d0953bcb78138806ff26ca76f39879f2d6947a02", - "df399e609e86b4a6f93c472db1df3831d9abdbfef6dbd633eb086e69a8009492", - "05d37d58d04759e893ca3f9bb3e69585f69999dcada84846ba0b10ab4df826c5", - "42df6ae602403877e80ad6087d07f82719ca49860addfd7f694aa5f70fc37636", - "b0fa2ce417fafc3867b2d72ee46e3be74fea8550a03f53e5a4e49b1a053c19a3", - "dbfa4ea0e26695f4d9c99b013d0bbf199251950af1684aad3c17887e80dc07c5", - "fb54996000e95e4b5ee0da32adf7637825977af17d8fc7a52a3ba7ac5bb03522", - "65ffbb32185a45506affa71177c3d87a3fae67486eca0c51ea17dd68ce282fa7", - "a06504eefc4398599c2eb3a92e869dbc374a6fe54231a36f080a37f6d730456b", - "79383801ea0ce06f68479889cbf502cb684e79fc620ec6ce5eb333042164ae68", - "1dcdc891dc9907e63f42338a12fa75cbafa530038c7c13c043d019bb55addc73", - "21c26a43158263fee0680f6aa8f249c12da323afc874fc7d2f2a512a26a56d45", - "30c3caa25f942f75f2080fc31bf61db9193127369631ef7ba645f2b1dc395ae9", - "80eed4362d039c260857666339fe01ba856a6a659faaa5d166bc54f7c031b118", - "91b8f49a84d87294147ccec8f121ef70dcca36e0175a572927e58c0ef3b66af8", - "c8eecf2a6daedeafda893d767f16905490b406454d22db3cd070042a19381047", - "516e543e5fa6d50a72a302dc281082fce3aebcbdd0c9e7ca551f9c0062d51626", - "8000271bd138549f80a76ec80e9ce6ca8a2479c0f17d4124e819c4918ec76cf8", - "ca52292ac6bc38b405145d9e3805a15b21ec6bbf3da0a131ff87074993d64600", - "577cda090424a6a8fce17a8c08a53cfee8f9ce3525f8e529bdd987e7f3991cd4", - "6cd85de5e4517b69c7a68fd9c5cff4f0213f903fbf7b315e392ffa64e05221b7", - "e64f776780be8117b10368384dc2ab9f4fe40aed26a3153165936d0e192c685e", - "3306a264980aa85c247311cf379ec662a8fff16bae70d71a140dcb5504aa2b56", - "1f8a315c83745df61070ab4fe569ed8451e7f9ff06fc448f30ab3a225ebe42cf", - "e0ca1760957f8aa7ef70b6652e60c5ecdd2d78cb50678a9c3b70791992956d9d", - "bed0c4fa89fac6a09245620cba2b90fc31d19243b47894798b9573e6fc8b39be", - "3f7f63a42e85d1180762270c2faa55809b661365fc8513d98f3289e2b2ecc122", - "25ad1beac2cb8a3f17ef0bdd1135dc2a1d3a77998b52cd43d155cd45528a9b9d", - "864ede465feb59b2cb5e69371995126d51c88ff12a33edbe7c332e8a1984a961", - "06edfb7ec2352c593fc46bcfe852303f85d63374b79f66c4cdc3d837401b690e", - "793b802d5309697ad9cb37046f50f7f4f4fe7bdc643e65e49d2c189190b1c990", - "cdad469d3752e5d54360e1d9abc1ba8d48c13b549e681ff2f4aaf9e3a67c66ee", - "12cc9384208798c6b493c8a9624035896b5d11346349242b596656ae0ca120db", - "a8c219bdf8cb9762aaefeeb5ca8fd981e2e13ea1448936954b3c6784f53d0a6e", - "8e706a63547ca30fa2278abd66ac7543f2ec52cef7431829284a641b79dfdea0", - "3e042038a81440cc5e7d3563ac896b8933f7fa23736c769adfface305296fb4c", - "9bbf62059047e1fd4f77058396aa85ce1bef0d1b900c3036bbba357c5a027018", - "4784fa36a0892fec6a5029a05cb56fa358073daf34ce3c0f527f3b85fe2a7cd2", - "b2441fa293cbf3598fafb9b82474681b6364cc4ff774f5b8983044e3228b5f24", - "682eee2cb128504db576f6fa2a2b284160b3ab31cd89f9d04e07440a29c62a30", - "9b0a0b0b1d716aaec764b688f3d574c4fa42c6f60b411ad42a6c46b090c96827", - "94e0a04c0475339b4757b645cfbf2f56a5a05d2554d4f5abbf854127cfd1d94e", - "1d93cb0d09b804583877b861012cdeed895951561abee05f7e65df707e6d5eaa", - "8d00f71be725c267ad129b439483fb14bc3cf2c01695a32e86e35f8a70169074", - "d3f8882929bd1023ff009cd4fcc03e6d645ec04096d78de620b033ea6a3cecfb", - "a8ca5d336a7d697e2a867b8d518ce105a1429c04d81fbe21e5f57cfd7a573040", - "8fdaaed624ab12e8eff411779f11d3acf77489a16f14fe9a7862dbba27e4ce72", - "0303af75e014684f4665eaf309b1d827d3d17a00b7d8a1fe4818dd16a29ff8ee", - "82be8d707f6b56ec1caf6044d7aea18ba02d1cac80e19a51ec52d865aa39d17d", - "e3ce7c6a16cf04f3d98315861e4af4aa1c37f41c95c0100dbf533e27d6c2adb8", - "445a6d1295d19d3deab4b462d88efbcb7122c5ecc249fce6fd4f5a8c0769ab55", - "506a1c8afbb4c7e150811324b2477d9ce60fd5e60ad4eb6fa9c75c7a2a0ae119", - "3f330e1699156d447e611206d537ad98e1df9992657eb5d65d6133c4cf58a642", - "381404b45f10c814e5e777fd0018630d4b1c1fbd42ed15661dcfd187a1e46e23", - "0ab4d21a9dfa0b05027cc1da89dec83bec71d3ff928c8fc279c0f7e7587bd6dd", - "f1a9ace2bcdc7e62b798f2205c24de5e1e63121952145c49f6156cbf9adf694d", - "a867460569466e786de80f64a6a7f01c33094a7df1abc245f1c6b527c2065d25", - "21948ff4588cca135c68826dd3fffd8ecbd62b1134bbcca0ad20f3f2d40b9a20", - "2aba6e1a49960c4c276fb481567054d7138e37135cc133db3c02a913db5e8cfa", - "f317e63358cced61f63d3d52b6eec08f45f58348f354ba52dcb6a63383205a2a", - "f588016eee0c7b8229875fc81c692f354db59321bca090e07331b7dcbffa4d39", - "73697b42eb99d73719a63439f96839972b7cdfdaf69bcacf547b5269ddef6700", - "36bba42392fe1e7e286be94f1fc1f740dd077ee74d44c1e20e6086c96c91907c", - "7c45d28bfae45653578b6609459da5efa0623c7586cf4fc3e5e991114235a7ce", - "b93771fbdc282ed27a374eafdd235fc50db19120656606aaa807e831d42dad54", - "909ef9c458bed0b5b83820e26cc477c4efa6eb37d3464205be81fb4f0f12c028", - "92ac4e70e0063906d68872c31bc4b57a3a644cfd0aecbe70399b6436284decf2", - "29c97cb05f95d555fd503e88179fb6d2653a1193c0ca47a79bf5419c303abf03", - "76ac746534d5542824b6611b862c73fbf5be385b0cfb0eb8d8b25f1a389f0275", - "3132a927d5f5dc248894a3fcb78acff3bcabed52d65cddbaca8eb3cf4b9ef96f", - "5119f696e56c70499cb421782787d627a3a30565aa9c69aa5803e5944cb403eb", - "16f40441fa48053c5eba65c853353324ea145d73f5f5db8d55197bfee6e96702", - "6e86b66060ccf5c37ebacc272611195501543d9b440ef7582bf7717a043f86ca", - "ef9c6c68b7cf301aff05554ae686a6fff4a58cce553f3252cd209eec10e61aec", - "71952dca8d51b2dd834c08f391f1e8ee008a5f4afdce4715aca0a5de5c6dff39", - "cf77457584a279d21c811ec665591f9ee4af960ef17db30acf5708ff092cef07", - "cf51fd7d7899568b04cdd3c240b7beef97fae5469cfc2e693e54d2d2fd302647", - "0f2f2ab1e16f14a9fa7023677e5c2e7cb7e5596aa0fdc0b57d3a57438c066f94", - "7eb6e5743b0c15d7f3d5d994f63fb3ef6095832cd23da171495e1882c83fe8a6", - "7c482c21fa808a73583583fad7c465feaa4e7b245b3f629ec52b98fd30d11b63", - "b09459486e613ed354c9653f206258c56ac7b23717f359629a1c12c165acc9e6", - "e07f8e70e793b844b0d17b641c70497283d5a8ad345df51212cd63a3bfbfff70", - "5b3f05b483181b357d1a0d86b20591a0cc9c0bd08f650ac7f198fd544fdaff73", - "7bd86a11f735deca85dbfbc7f6053715b9782e756d7113b81141ae168c3a7100", - "74b9d4a160ee6ea69a9a9f195158da5663bd01c962c7ab5fe15979c78dd55872", - "18258d2c3e7c69e8b6ab055f9bdc8c95042124c868a6d6ef1cc3db04ac37acde", - "d825d1dffec80baaf9d9756feb4ef8707e5480cace7d6ce4936b32729b323ba5", - "53e6f8b23485f3e5366c18b39cf2a66d3b2eb468a21a210b8231eb70a8dd834d", - "9c55bc062fcccd59f747c3518e2c0091b37c9a04d8e435a53dbfa33119887116", - "7ce107fc9e65fef72eb22362a45f5e1d071c4b6307a89ecf08abdd599559b981", - "d0b633d996013edc5dad7017f8f5584e06e6cef706ba429e4ea58cdd667ec764", - "fc98e44f67f3e4b32f5e6601e9174ce66e2f889c549c46a09ac8b452db5444fb", - "09b19e76d720aae86a4dd77baf596491564ce47e289a7d9bcce258790bbf6a6b", - "c550a3238690af6e0a267cc10b1d1a6da422b07c6d2caea85282bbbbe5151bca", - "96030ef53c730acc2c464a909047a5153b6f7c8f04681433f32f795b16bc6126", - "daecb6cbe126930c7c6c898d3cd44c31ac8259df96b92f82ed8a4ec90165806f", - "5b4eca6d02064c6289cf535fab0c9606b529d5c582c3faa0f70e62532d25e0b5", - "dd71fe7af2ec401e7c32d1cc5697e53966c9be7710023b5d6d299f61122ef1cd", - "4eb529e9a9ce57ab0cb87333fa829492ac7c0174533b9ab6a04c80d2717773cf", - "ecaf0ed174fd482da1afc951d74cfd3cc97c83c7b243d7504d386265d7a29b61", - "4c05766f772c115445ac5df772c012479812c708c2a4277910a059d468a99618", - "413cd83914ff13f72ce40f796d3507b5445fc4b93063a30d29373ac8e7ee22d7", - "3895903108a3e3473a5b7c27ab9fa7751bbf1be1e8773a3483972f4f650195f0", - "20c8f662c35d166d903c5d08587789cb779d0e121efff16e929b3f746385d5ba", - "c33647ae07ea0cac7058fa09df45d5039637b2f9dafa3adb7507e3f0580e7a60", - "cd87ca27c936fbf958839b0ee9a41d6da8a48132f03459f20cce424002256e55", - "63b2cf3d2ad2c38c0cd67500f6bbe404c3e609b1c8e1233a7584181e0657502e", - "c2befff0b3c97fdccff72aaa6ed8ab831dfebffd2c3a99ccc672a769f3959609", - "8c60db064f4a11ddc82c59ebd0cd49e71f3c2b2fb516b6a7ac79bded4c709111", - "e181b2d25e14517fc1f44749138e09cbce61d0ca9fcafd399fee19939eb4560b", - "179f22ddd2c6dc41db8c28f0ec63d11126684d4066b62221922edfad1a13915c", - "aaecafb24997419d31c9a234afa152ae303564cb322bef49af709d47ca5869e6", - "5fe574dd8a97195d19e4948027d6405cfbb9ddf3410d19679a15e497ebfac785", - "06757b5323f84ce7a55b588b32453a6712e835f3b4e590d1f49644c8b2c63298", - "274a3182e6a7f0b5d2786900482f85e6a1c1e941672a424f02087591bfe08bbb", - "d0ca06a5b8fd0c117eba2b2307c2329c3baa62cbd29cae4d1c099000f62d4fe6", - "1383334caf6e843e94b4ccc2a3be2093bbdb0ced38a77add16f7ea3a5f7788b7", - "c6ea7fec8abfd01e96bcbc54d9503f00a67112e9f65b42556c680e10734d7bb0", - "783c9aa4e9dc7dd8e597efd0ce97035ba1182cacfd49bcc6ec77621d19c558ca", - "e9aa5ccd14a4d46f98884c47458c6cb0beec43350ae714c8cd4a74fd4650f3b6", - "942f2d07cd0f43296a9248f3e131a91087fa19ff44f781eef9c512e1c6346d54", - "64662f333f43310fbe1b915b2d3a7200e77350605b24e0845c2bb4ac45bd385d", - "69264ffb91905e854d2d3da7c770dda3df23fc02f141b9446c6baef36d22d676", - "68c6d53dfeb48daa2cfc9facd402b0c06ad89c220c6979ec2934c8f40f4d99df", - "1ca8ec3342b6770fc0fd78d60538de99be161b6a5d473e73618541726388a0a4", - "3159e2651b9303a8eb747f4ce4df12bba20536c17a04a7ed2548ca5f28ea1ff5", - "c051fcd71e741dbba0486f2f3a8b3a1b49d4c3b79cba108b0dc7111902abb3ed", - "873180735390dd8138d1de7abbd7101abffd26cfea0392a4921ce9daa28d1ae3", - "24e513ccf0af3c43d14acfcf4b8c816288ca5dd24046874f22a343f492d64790", - "b1aebcc31dd55b9bf634cbd9653798d0cbb01b0cabc54cca243362716dc6de3c", - "07738ca1a23d5dcfe36b3006de4e322d6256b26eabbae2376a5c03c98d9260dd", - "aee987f4d5a622960e3dee0482e58065e341902b6209db8a79e9bba1f95cb99d", - "9afcd6946378be0408bb26202502be7ab56021c0cb0d301f2dd2c8220eab9590", - "707e767b0c8b3b21bd2fca54aecbc5bb45287d16e1ad40301d2ef4494e9b70f8", - "106392e44d3c6675be9156470f9176825bc181b5bfd9f3a269509c9698d352b0", - "f0ada6bb633988fd7e33247e00ba96d9e3ff37bd321720c98e8a2a292361ba74", - "11d2fef78651d67621b727fdd3206c3b67cb1518d739a8804ef92db244fdc716", - "5599db369b96f2e9a26b29d8bc6403291c083070446dbe721b7cdf710af133a5", - "c64002116e6b6d37f8d2896de507939cd8df12400798109e820a138263339669", - "2b3029fea45b48242f3a9f4e5a80f9162caf9cdcad3a25c7a9c791fbc8caf2d7", - "e52047dec2c6cada7c94703a7094932281558029d4cc3a37826401084d33cd96", - "ffd0a1bdd2c0a110f0fe67abd2f338ac023f50eae61e401c380a8edab566f552", - "6c3863cd5018d4b56290c9e514beab090bdd52fc53f2be61e172646cbfe1ad0c", - "205c7f196a61ff5fdac06873f25d9b5219474494b7346f58a4c997ff809adb57", - "30042b19469c42840bd7dca10c5dfc4ed5b5e0a55e556dcb0bb9da99bd5efbec", - "3f2b5b212f51509318f5ad40b376f63c8d499cfc582420efe3e18d3084aeb789", - "fbda1edb6aa8212a4f022d0b87d4590e41dc33108f7c94dc2f5ac8a21d1f22ad", - "101b05eb54c17b1bd4224772342ed6de89d6670d83f8dd7c5036149d794fe98c", - "ed88296b3f6219c5efef3c5c0d395cac0d34a218fd6c048ec1b8f9aa8b897eec", - "8c5c6f78dff347d6887acd915c780fc57a23bc13452e2de57fac6c5b4d9f2656", - "8e89ed3f739d1e624575ae942da0f770e45c24047ade8bae39c00d799d8450ae", - "03e9eaece1e519495b77beb54e58f24c2bf9da0f6b0865e43480de0b6c9399da", - "71e4e47520402100dc61ec3d8e1846dcd2dd9b45bac8c968488e3978bd4f0f13", - "f33f53eb3b5bf6f840231cadf7f8eed9002669c63d344e32657d64d623e762bb", - "950144849c1cefab6851c30f723ce3167e6fa02c2fee564efbfd4c606bd71d0d", - "cd7babcc60d6c92a17092e8330808321ec1ec8b80a2137ef64634ddec9597d98", - "139bb9c82ff669f20d410a110b7648a39365dac4d5e58ece1df54d445dba95c5", - "545da737e190863736fb548e85a09ed36f8a8a6bb893ff07dff87a8a65846613", - "c0380e9823943cfb65a560dff6f72fd8b5a096ef1edcff2f434c1fb73338caef", - "4d95f7c83a674a04d2e253bd03c0493482750c47ea91bf355d30a342cc08a539", - "032f1d7af8db0140dfb52bbae1575dd3ff985320fe5c72867c79af2efd9bd02c", - "b977fad1bf687feeb108036a893868216bda148b9773a6e55d94d3d518cdcf9c", - "fb8ce13f8576d78cdb2e0b6b3f11807f81619576db7698e7b73be4b3cb27bb00", - "d7e49413cc9f824762963c63c41078ad7f00bab5e2825c10acabb990d210f9c9", - "cbbacf4a6cf839ec5cb966ed54092c0754bbbdbb4798937a7ba0d4b11ccaaaef", - "44485915382717657b4b59d9be659b4d92daab36a63568a26df546c8c1a1c974", - "8ee8b371b57e8fe07a7e7d0ce9c1b7886c9b6b15cd933b898e0e081ae953806d", - "3f14817aa7a7b2cb9dc568bb36d0e8bb4cf5805560c44c5b7ed6cae094ec44ef", - "530f5422e536983018152ac508e6bb3123962cfc52a9bb7ea8d9d2a3141af3c6", - "6fda3b38c34702089df81263fd76cf0853768ad80f22b4c1e7ff1325070fda8a", - "a5a8205b4ad14b8423ad21dd7ff5d6ed2ab97665e839d8fb89a47475b84c5012", - "89605d6645ba2be8b1a361ac3dabf5ff703f88f0810e10ab4459a841e082c446", - "f8f58959750407fa0d91173db5b6e571e2c4f9a9886ee2daeaae9d51a48452b4", - "58e2fdfd2ffff9923b3f6efb9fc43cc00b2bb9831afd0cfecfbd14d8901a7c89", - "250d4043ebe85a984f20604c03ddc9bf04981408de0f0c1f4ed78ea0379bac98", - "b86650d7bc80b00beea1b4731cd2944342b016a518a866011b635b0932022e49", - "3030c2f5368c05dc742922163f3ac69aad55c3a0bb1b7849bcc0b26ae41153b5", - "dc9204a46df8df3fb333ca960edb445428568e0c2c31d383f788dca859d56638", - "58286852e5151823268a5f869575d93977cf292b24a3fbe0f764e6d721f007b0", - "876025c70764ed30e83330dcd0f89a2af785a0880a44b1ec53b921c4e2347c37", - "5038773506eb4e69e67f7e1add1b669ac1e3b3faa38961106152c1abedeb9692", - "7c87b35f8e94c80ea47079d41140dda601d8b12853389c15b7675f118dbaf997", - "6d8d9457c01eb28a6e1df3613d431335ac17a1272a055dcd23118c2cc2aaa237", - "6febc2fb574c09b6b76f98f7e09d40bcda55fec4ae585732b3f36134215d8d64", - "4de57d30d300fd289a91cc4985ced4846605aab92b3a64d5f8f960cdcb97e65e", - "ecb4c078219e3bcc5bfaa670d00f6f916223fa7206d12032c135d48d86417b37", - "05d5eea806c1bc3e089aa34809c7aa5876e743b04bbe7b95d1f29ad6ced9a2a0", - "6efeb1873753c4fd64e04b183af21f9f098a9d0a2fe1032d36b80e07e5b982f3", - "2d6f96869769e61102aea57a460a7c9812e907e6b634c6c852c25c824622b735", - "6b53e875ce02bd6201eceb806dca56319707aef7ceae988a77d23a42e0a4a6ee", - "cab738263ee5925eb6e653f81e9a95308c202d2e29128f3aaff8bb5af3935d20", - "13d0feb3ac10b58297b44b32dc8d5ac57e36baad9b3e685b9af5a945d9b21ea5", - "565ae82fa90dd8f74b303604354ad739539ce8bc26470f7877fbc1520e6a0be1", - "94c37e121937325f44cb2d8d3dd6bac0f616f6ef4ed95c6be36c39a27c95e5eb", - "8eb0a6fb32d8dc1e558c0c1a52eefc82a5875daee79aa7ab72302656fafe46b4", - "67e1d7e75690c0ae463f5553302252ee1441d07482401e663956bede2e52a550", - "09fb897d9d100e50310aaa7f86c061789ede9b0db2a807e947911d7ad0b03e2b", - "079014a6509570698030f031adf49e24d23a93f7a43f654d75d3e332cab499a0", - "213f33363eca5535648c14a93a6e6c3c66b5218790cfa54ffb38fd02c3b6e843", - "563c2106ab8619a174f26c764ccb64a87fd03e9282ae8feb7c96b6aa8af8f8d6", - "dee350e8dce6af0397ecd525930cb9c7542a610fdae4b44932e773619bfbd9f6", - "a31c399919797b90c2129142125316b5239544e79294ac6add8d772127148de3", - "348f30be329b5088eb53b9e54fef80750b626d63f3b2e4a8cd0c3fde3f10a123", - "cd37bbe9d26aba3dfd9a00e0943b65396ca987ca1043e0a156c7a4e818a7c04b", - "e6185f4e2edbbd62caa4d2095c69cfc983f2d53648c43fc175fc7f3c32ff4875", - "c843c151eb881942afaa820ed58fe4d2a9f0121949431ca3019797ab12cc5a8d", - "b68345e8f9eafcdf7ccb1433afa0de1bcef374cb1b658b60b41e4a8047050f1a", - "70f5c38aa4e8d0961a3e1272bd8ab5f87fbc31b3c002d204e321837e601f0371", - "bec5efe1d8da9a444f7d064e692d7640990b7e483737635a37e514bf6a1e6728", - "90ad8567a521e0dffc27cde8504ef52477693cfeacfeae76f2d771530d4278aa", - "4b66eeb25c03f8adf80b35a9604b69945a0f5b802aefd8264f890c55bddad96a", - "d2e745ebba757759270773ebf3ee2a410f1c6adddfd1b63b0d9bb3e06f30eb34", - "142f7a83bc88c319912d106d7fee5ccd3b219529e591bbe15f204915f57ddf02", - "0e41a6a107f9d062a1547c60ef86cb9df54c7122b71a373c855650837c4176ec", - "551811ab4e531b9e8b8cafa6b52a60d63db723d224773a211df954376cad7a40", - "75bbf2ef2c5dad30af5f9a5be789656b874d0110fbf19509782f4af1db1a6862", - "c0d08161f96b825a19e2a79997a303c281ca7445779ed89086862a03402e02de", - "de816b8eda15f8e804af7a9ce4ebade233914806c676f1aebc0dd100c31e765d", - "ef72fc813dc3c76b402993be34bb3db7dcba9e3184bfc3ff351ba9c98a852fa1", - "717b8918010f2518df9aa2a0473ccb5ee70b9ba15ab7b7faae7c1b64bf2937b7", - "dbe95ed3a65941b616896af20977c9c63d1e560552a5753b0934d296c46a3cdc", - "d3ff070e4329ed876e82aa8a7a43cfc0e68d6ed14081224f11eb04dae040be63", - "790460597be886351a6095d31d142bf29501e9a5c8d692b3207ba6fbbd9f9ec4", - "0a8411aea7bd873d0e24b47aefe0e51ae3a2992df6b47c9ff18ecbb90fff27dc", - "442e0f560f7d4f1771c91e920dfc440a179c73e367f3a37acde54b4d4121aa2d", - "cdbaa8b1fb63f4a637804e353ac6b8d27ef944774f4b27166fb625849af9f471", - "0b2f2a2a037f26ab518c966e4220af6d4c957356c0805052c277bfe778d9be09", - "556fdd81c3a3ecd3f6173dfa9d6ba54f8bcad16f4476fe97c058665195db2935", - "9d5e646c6239296771d667e4a4b9adb996a213805a73b4aee6869ff1318c1295", - "d80e6eb08c3af0105f3baff2c8a498e6485eecf5f82300ce536c6d7f4c486d33", - "8d8f37da4d65f90ec1c204aa97011e5602a4d5da6f5b288a59a58934806a41b0", - "dfda7716f103c8a576a83b416f697bb290ef9309fd585f24ced5cdd27fed1639", - "a1197cd83fd22fc8f8800a96ecb91ece13380655ef690f3c34d77f7c7bb5771d", - "1dc820d74a9ef4e6dba833010f0a7bd317b21a4b4e0e32f2bc58e1760454692c", - "956a8139153d1151224d059b125df697b01a2e5b32df873e8f63e3464ecec25d", - "673cf10cf75eedf4b13ca4c9cba36afea045b781caf4946c05fdfe59c76aec56", - "a1e8d86bda72d656cd17ef9f0829247ce97d1af168dd0de624fc7614677dfdad", - "f040ab53064d4f2cefaad6f978ecdc37b43734c0c8193f1b6b5655e62e09a1a9", - "60b02c7edde4db66b1d60169073c2be91a942010471e12718d12a8152048c889", - "c143d570432198235137a17e517b4b9838dd45c0163ee53ab65a2b8c8d4c53af", - "216239a9a318f8fd54aeb7048856db70f60b8dee6c9b0ebc3a9c3230bfa9e258", - "488b7e789fb11072dd36a09f1ee5546a9a937433af4f41f2313abedea757dadd", - "2df1077b1754b73adf58e9642565e11a7802436188e061f75fcc4203c395c39a", - "b158ae7b0eea169652050f6567f5ac2724e03da0996dce9ab5f34e8713e853ed", - "f32c0fa782f4033665682be2ca54e5fa2b9137c2eb2ccbbf811ac852c31c5292", - "fcb8ce5bbc5facec4fcef8c9102ec656f873db3263439b505c4c917e2a5b7eb0", - "71ede2a89b8ef270057baf4fb35aab174b937806db4a8dd6b2794342e650f5f7", - "8c7820bf129327eab16bc752692aa8d03b7004500009d46d81a82b38cf52f01e", - "abbbd4d573e1b57e1178d937e62c62ba4c34758c230027bd1f628527e9339121", - "fa8e3942eb8a29995ced6e6fb30904aa8039d3d292345e82d59a800bc110cf05", - "9851c844c84d7f4f147e8b3d42bfdf3abb927cc8b85a6e2791a3ae619b3e398f", - "40187cf49904206fd4c71a0f8d9dcc8c070bbdeb1737505ca483634c16fee6c5", - "dd3982ad35fe5e6fed43cb0e67981fc91e5b34e96e57417c1e31c9cdebd78f52", - "a2c97c97e2ecd7064d354d63e03cb46407ffec81af4a004fcad4aa4357ab6323", - "f475cce151565e62ead0ba37ff34f0c4352223a79ee0c1e5ed6804123848ddc7", - "e3b9fba416c16bbf5180b95a4209642ecf87c3ca05806c53dd43a06c9b91af30", - "e9d4cfe6209c566d1afcf5e15a2a15fd82aec71e56df0d92dfd598e7cb09516b", - "14535c98f54b187a95138123fbdf9233fab8f4e7daa38d80e48eaa4774976d25", - "c43bc3eb8ab2d7e9a34f73c6ad53dc4e5dc41d005209dee2b238f90485e7f8e6", - "16e1a3e8502e9cebb81c845c93d3e3f018ed52f8c2b3338be25ace935b277bd3", - "0f78f190d320e50b3a27322ff6eef9abfd0d2ffe12feeb40dd5e7d901adeef60", - "6157ffa1923d7af6136c44df128329420aae6fcdb8a40e7bed7f8b9cabf78707", - "fdface959b53935457a858d93c27003da15350e38582ef25eecd07e611d7cdb6", - "537193137744bf7b38218849f04ec96fe38d8a7efc4e4cfd103094ebb885ae2f", - "e63d1a6ee142220f551e0292e123d4de7421dc4873502dec72d73499123d8bba", - "2f0be929a89d9785a85ea2f6b95f0514181e4c3215a60302edd6ce168a9482b3", - "6a1544136f2e5313cae4f6598bc600f506c1aee087ad1022c18d2ba43917da4c", - "1a2e320b6b1ca354cdc67567e0d2d6061cead114fa9ddb1e118bafc4eb2cf0ee", - "058e6e7bab0aa25e0c91cad01fd64a30688e9ccdf19ddd0a087cd3a7bcdfdd17", - "a345b17a72a3de023be7c8fad3c376cc2212008b1ce5216b86e09303d5d693e1", - "3066119296ebec89f88aa04e64acbe5d2122abd045bcb7d8ab8920ca2fafb69a", - "663f498a6d25b350b21174afb4201814b4485a1714a48bc09c9abb2c9fa79bda", - "ee190e5bbae4c14c0545963ddd499a18d580e84da652e8ae7b4598e21f06a493", - "c9add702f519a2a56206bab0b13ac2c97ef4aae0d45d9ba454c6ec9633a2b2a2", - "14b6c9594ad495ee795618e5059c7b7782647eec456cb499e3ae9254ce5a0ade", - "ce6a34ff617765a5660ce805bbfe9fdec4c6df61892c392ae7e84ced3ce6ee7b", - "a6cb036ff1e8105a89acbd40a162339621d59057d7daf45b187e8837120e01a2", - "bca74b5baf22647dae17688af82334f09b00c1246e0e9a6fdb6673c7433f4eb4", - "972af9f70577e7090b18c8665d12a6d2e140ae72760f13130d2e9470ddc0d731", - "ec32f4ac3dfe8804f6661bf74f3ade60edc8d152e880c3e0ab4200a84d30569a", - "92200f572642aa778af1f7d8e55f27c6169686216f903d9b3bd1d3337431cb86", - "dca15c93cc3d81c1d167635c8c2f94915812c5f28c2dfdf129828976a9712e91", - "44e0b5a7a420d7442754ed3a7aaeb2137ce196559cd340271452053796b3d9ef", - "b9fbe9d9d920481040a0ee3dabc5ee82ddc1495a5df88eb6ce19bad85a508061", - "1ea8a2557f6be28091b5423e4737c812405e15b209f41ed825b10f83cfab5808", - "7f8cd0c5e3daa342092c85541921b5413b83ab3f9a1fdb311ff76cc577726718", - "993624be4b13a926195570812c9e6bfc8657225c785c65360dd265e98bde7322", - "8cabdd82db7b66662b823ff1d4785f3ab1dd045639a213ad2bdd1c16f4d80e35", - "b8b4f162ac164f76871dbc155023d620b7d402be7bfbd99a23efe7a0148b2d7d", - "59c0dde80d625cd13535acb73dee821f3c5b12f4dbf5d7bc7af9dbdc7c8ba762", - "a991c26977e4c3b793f88166b5d510358a73f781bcce587d9fed1c866be17e07", - "ce6b15f558165565d98a9c9276173e44bf257fc9b4594f11e7d3c7aa995133b8", - "44378e2212c6749e57a3d029350f57a672e98eeed9d719ab4543ae75d3abc1ea", - "149a21206f535059f7c1994e332cbcb561b967161b5a1385790bb5acd7491e15", - "ca3177a671bb1f20d34a6a1b036f7ffc810e9ae0e666a7a66956edaa2c1f79c6", - "bafd296b45811aefe7b6c9476c51c4b53f56f82d6337b9c8917993ec9e3b041a", - "8843e9e077b44ae0a2c2767e9bcc45f4291e695ac608d73a41ad9798af7d1158", - "95a6e2d905cd1635eb0f9f52b5e1112749cce2c5e79506e6476afcd984775bd3", - "7d57d3cd27b26fc0a945b3c8a17bba28815330224b9bde405a1ca877cac79edc", - "dca4d16625bbfe9d56069203060f51b154f8d94d77a58d87abebfcd0be41a5f7", - "26fa3c7c86fdff0e339a7fbd8867bd6d238fffb07cdd06fb3c9a831aa0c247c0", - "272d002169b3285b32e3d1c0c9208f5c0984d59dc75b4a5316394e9f76fc1192", - "823bffa37774b4457710e067f6a677a3492cabbf9d343a5e4defb4bb4419c073", - "2427f91ad304e63d5d2a8079382396ba437bf33538e4da9fff105e214578a504", - "59c8a7948c840446b74cc0ee03a9b3b27dc1ed44a42dad5a952b285b3c639ef6", - "7781bd38aa7d757e054ec5a82eb9b4ea79af728ff74abd99753b204817849cba", - "3405223ef0620c016eb3478535def2918cd70ad2f9198016ecef2272d88d551d", - "645bbe6a6775621ac91d3ea7bf75eb5452495c797226642a3cacac21e1dd686b", - "8d0a53878e71049565120bf174b622cda027ee070871f1e462a10f528c7dc99d", - "d2315edd819ee9182a9f551be69a4d361a1c602ceff7fa4a53ee014493b7dcce", - "3b3c3dae5dc4e3e25272757ab5927c0817ae0113b8a2535806cffb2cc464c2f0", - "2ebd78ad12dc0c274e7b34be529ba91621ea9618d173c71b07583fbfe360c38c", - "cc6cb5e9c05517edb8fbfd872209d1d9e92893f1dc5683db4da4b6089b50fa1f", - "c0f31720eeb1748bd800052f097642bf49fd45bf0f3ce725ea4ead2a56c41d9d", - "fb5bd8b58b03abd9bd926ffec59b2386a835a633791227ab9b38d92777747e82", - "f3d97fcea119857bc238bbdad97d33fa0b1cdc2e991f8a8cbee26304861c3ada", - "13be5f34673e1020217b19d2fbf040e56b1cabdac0ef70c0b19e29e56caaf58a", - "7041da5e7695ab7cb725d597e8a5a67f775ce36628be63616e4c982dba6247aa", - "266aca543a4c3bbd85038bdbed85a5d432ad42f4c76fb0c88c2ee4f91280f78e", - "49ac1c1fee404ee52c75c9a00f7777bd5cbe77e2c062a19d4e29fa76bdbd7539", - "6671e5a83f1117a9398cf3b9d41fec51735c5a8c41638d63972e5e6e9df0b46d", - "cd41f4498d0b2a537c21d5a9b11868deeede58fc71e23da4ed94a471fa62ba1c", - "c36b40945bd3bd6bdf7717f47a8c8386074da8ebe7c768f19b94407fb0c5afb9", - "6f880cf160aebdfa64c25e4529d1649eefb46d1e02175c8781d570df418f8c07", - "42e8c3498eaec5695d6d34c797fe07518b70067274f7431f8cf8b6e9fbae9107", - "bb75e65f28e0b3f1398f935f4302474ef2830e9f86dd8eee0f853c01c88af5f1", - "03ba159a4c42df5439969603652e2d4837124443e737f7899bef9985ecedf3e5", - "3e2299b314ba660ae3d86767ee6fe6af0d1c9276d1bae1057954887a47636e56", - "469f647b10b28dffac4ab29c0a2fd7a1860eae3fff6a38f5c4920076b948056d", - "351c3d10cc7d01c700a4e88194430f85f8c1ff1735173f2ec061cda1b099b94f", - "f2e50b8ab20b16c9dd8f76af4b5d6fe883ca3439a13217278312f5f965091167", - "6c0ed980e8796b2487a2196ef1766bea917222070e174508f256f1b8b85b8139", - "83eadcbc8aefd0379f3936bdb023e034e3e3e6f2578e3b7b7d2e89aa19e4edd3", - "a1c257a515fc938f89f7a74ec32d056543427be0d4b1a6adf17185071281b69a", - "3b23e8d070d05bcfe8058d5ef1827e33421d84849b2d9c29ae7b86f2bcbac64e", - "0aeb59f5520944f85f0e838d4f5737a4286936466e4771336c5669ce7981c48b", - "145e45075a4e1cc5c95269c5aa9c10fdfef82462870331e4d595fef45dbd0209", - "008ed422f8f82a2561045b6d081b7e61eed9ad59c95d554634516e8cc81e7b57", - "9ed497946f23dae729027270a5c6d9e4fb0d6aa85c1f3321e4138d5414675495", - "0fcc7ea80c59c5ca4c5631b2f01de5997c2b91d5da07ed08e6494655fe394a4a", - "ffe319ebac5a82362b0297b0c608a7f1d189918003e71630e6465178099779c2", - "191d731a6f5103414d1814c11aee1a80e8cbfa00ea452c734fdf060f81d174cd", - "2feafc48a29109af55e75180279c3df1cbffb51c61fad04b5ce3bb747b53050d", - "581dfd4ada68e9c5e5c6509622ef7dffdc72ad39ba7d5e04654b6d411fcfbf5a", - "3ae57e034e5d7ce44eca72e14ef7b792349f75167ea1de3b50d336615a2c0c39", - "daf3b10ada3ba6d42a9e5007fb653412dd3ae3e3dc4ef0ff7af1b0f324a1f6f9", - "70ed01c000d555e64c0eddeffc4a376d9318e1296efaf600c044dd128866d202", - "1abd84d2d4e0395e6dbe37d89c99dbb1588f68c1ff16c33c7c18cfe5e3a24d55", - "04b7d54ad2c205d681f3b8f91703d8fb3e8e43d87370a1a1c720d64f7f6b3f23", - "111f289ee5967898b167307d7c0a68aa69dc9f3b4cd33cddb6da5a0b6f403eca", - "96212d2e90baed7666a5d3b38c31075b11a28298caf2ad8563fb7d3595b15059", - "07afca79a45203c676ca6e0d63314f4ee02fd3a073c537e8715ce779f9c3a2cb", - "7d4a0c2ea7738ead9615662ef5e29ccb45b6c349004c1983dc0db6c6f3849c25", - "ea8890cc96582fdbb76fdb36067c9735d9f3497e67db90ac020eaf895ebe4d46", - "4a216917c83b3349dfa78df11a9dd3e63615660c3c4b72d6d08f089b559c0e0c", - "7f987f123e8b4f1b0f9aee885d0f72a5c48b87990e24f4144318c9a2acc01837", - "e2e1cfe90cec1dce4497e474b3b3c16ddded75664c8e74705d52a963bcd593f7", - "276a970cbcff449be678868e6489645c5351a847c3311fffc4ee1358b49ee12a", - "873a6f82c6ab88bd9344e089721774cfdf3b5c24f85d8d872e7dcff0c101f22a", - "c6fba5dd368014653a7b6346f212b581192687cfbbf4bb1fe42bf86b947bc593", - "5c26a067d2a7d3c6e766e64bff7ff1a8c66074a0b9c691a9e299d116ec1bb2fd", - "08a6a57e7f75d7799503e9c5150afc5e1003b21a76b3d9b1790f99fa9ddebe09", - "4bc92f4e47648b4d9c835d213b4fa79275c58a7eaff2a818a8810af4a1de2855", - "84b88488453aea16c5a95819aa2629921c35b03951febdf91870000834a7d23b", - "aac3a49b6f3cd0b5ef9493433cbf0ced9c669330d0d91e9c41547dafe3748f71", - "4a7d4ec6eb15e4d403d25b0076ec6e284f9e6d39abf0138e02cd01fd5cecbd6c", - "bc93f74bf0c64536eb3458cfb04230de7d7883129ae22b3a969dda0bdb1f7a69", - "1638847bb533d4355f3c3c5473cf994f370a2b7ab20090e22bf239f3054083b9", - "fc909ea7ac185bc0f3de4ad849ebe58a4a039591f0b3fdff2267e7ef702e92c3", - "7d9da506d4447045043900a3c4a031cbf53f9be41cd704c914ee2ac0de8e4549", - "947cdaffe0635342e1be7db5fe5121a88da29b100c89ae088da3a184c550f527", - "c5389214bf47591d0dfdd4417125103a6c9764bb4a988bdb7c2b1538ade58b49", - "19110610c360e1e919415a9015fcc707104c6f90418d73a26a588f588e610b0a", - "df11a94c568931c86a8956909cf39ef279d4896ff29decefefe7f13067d97bef", - "72c568decc724040aecc7a75f6e1760d6b4f15ebc2069c0a5fedd8307bd1d0aa", - "5f6c6fbaa51504a155dbcb0f116d4b0ea2758c0e34ce185c8a4f149b219c9784", - "0e9e399d440aabd563c007f3bc64021ea60886c96c9f304f2822de76045587da", - "57b4c39b8978fce139fb20ac74178741d2f4ee0fbc2fd7c1767b1debd777b173", - "b5335b9b5fb9e74b7f6b53ba332e0b5f69f8e86cf20cec34c47fe06bdd075119", - "b4eb5dbb1b74989c5c815daf68cca26f26216f1b495c42d1be72adc87a9a27d1", - "2f81e2f984f039b633334099318a0a4e66d3ece72b1fbd65107ee32d327a680d", - "cc4e800a46c22a8a1cd8e359230e9ea5608fe8924f45a9fdf508c38282390696", - "01ac0d06ff78d26e3dddb056b8dbcadf070470c1b95ec871a1472eaf5ccd096c", - "6e0edf3dc1f374039a18ca08047d303e24d81182b5254dfeb4ea8300c31de962", - "b251a8fa83da605152ddf3f2ce46e5f49b5cc4d7135dd1fd3522d9fcc3fe4b23", - "b2b1b1870f56302a17187fd4f3fa4e120dea03f4d9715c03844fb7d93b8db183", - "d57ad20010cb5c74d5461383e8f29d0974fd9ae8b1fa21c5ef9da4c40fbb54c7", - "3df7ecebb71b3548f6b14de35bd33b7d96ab3ba25f205a9acf7a884525faa23a", - "17355728de713ec4ae7a5756a0e4cf908702a0d5d0b1ca480bc52687f3105b3d", - "8c8c380695643aab37d247087d9f8630c7c521e7504e7101f7b54dd3aad381a5", - "2c6abd0c5cdb6e4549b8adec4377bde46a7a70c1c53668f72dfd3f8f10cc7849", - "8ff7ce40d8410940dbc5746e7b0528349997067e26dfe3f6ca4df20020cc3c15", - "ae99f2caeff2b43c80c8b90ba23c945b822ea9bc9267aa232736c15e72146ade", - "ac435ad768f3b84db16477ccccfa12bfe19322e1b6484f055af32301bf19cd0f", - "57a73c7966005ecd0952088645eaa61bc549585c6053ab2fae7f2f1e7ef9ff7b", - "b139d6dede9319f2cead7f469a151c61987cce897e2dfd949f58158e2e9f8701", - "250d19fb56cf396cb2d4d5982d1715318c1206116d4b77425c135a79d241e5c5", - "38527b24086acf65bbd90e04eaf981b9ee78604c14d46756db680e2b378c314f", - "33447a994db819b57df245e8ab7594f88e5ca02115ffc5a0d94721c874c2c2d0", - "ebc608b1880b1d559580df89cc317930002bc541f1c5b0ecb0e5d737875151d7", - "1f51cdf88c8c7da8c3a0448b5888e8fa9032bb218d501663c2dfd6e4155922e7", - "ffa58bc0e116242f7593e873920baf1f00ebecd3c7742e6bf4cb5e659f91e62b", - "cedaabe903b5d9dd489c72e4b16f31c6c26b088af770f01ad1d842ef3ec08119", - "46f68a6f886884694fdc9bbef89524672d2eaad3dc24006918c1bf6cd46eca64", - "17b93d43fe675eeb5fde8761f27d7491125baf1201a85fc2bf26da4535794b36", - "f0477480abfa8e05617c962f8566279d62be002bf164ecd4dce4ca452a866970", - "b07a8cdfd29c3ccdddae9d84a48a77bc8558489a8a2318bef600ef513d23351d", - "48894a263aef4251ea64bcb7bbd0d9b75dd079a62d8c0e4feee9516993b839c3", - "2edb62d2e8866cb08e464bb96ecc3eecf8e0a99dd6ef06ad7d72b3f0dfe5460e", - "845a8f6ec24d0fafdb62f1c1a3a2c1e7bd2f8a39ee5a5fcc14991805d68516d9", - "fea15103a208b5346cb6cde212acbdf6f237e61124f07a521df07e9aac47b528", - "157f7a07d8b458a19de18844ef0b26f02e609ddf07f9132903fead3fb56d77ff", - "a8e284c175c321ace949264c92d1f751a96ed716492bde6beb9d5bb46e89b022", - "b9130824285eac34b7b559518a8dfcbb46fc8fa220e5d8a726fc4a1bf4210ae8", - "79e8b38907748b5268b9d2b1b344a6f5ddff9c93f4503d6ca0ade0797216465b", - "c060dd0113babadaac5ccd1d13b5dccf8933c160f3bb857a80f97c39ce1e2c45", - "216cee615626981e115cb0cfd523e034a76739fd8d27c836632be69db81765fa", - "026a0ef9c29755670e990f6981f6cb6951661b9ccf1d99633d9cafee8a6552d5", - "f510e0cac810a634de6dc83993a1d51db2301a96744044ddeb62178daac562c6", - "e2f6e8e415bf8366527493e1d3c24ffdb195b5b71cedfa76500df22af488004a", - "920bf57585527c1e097e0ba75554fda6446979ceb8c530b506b4fe5e69862631", - "902f72eab032c19add60bbafa013767e2b0f71e70ac523ad43cea6bdf729f55e", - "5608ea3cc0f420ec143126d124fcda851f5c6b4e4ebe9108f259ddd0108259cf", - "366fc7872593458cf48b212bd77cd62159fbab3cad3a2092445050ced5e98f2e", - "dcef5c2f7f3969305765c4d3b92166b3d7e02f696223b5219c22dac21f7bb6a1", - "83234aa15b709c1ff8110dd7d3ca2aba8435f0bc034b7a0310208a004e38ba91", - "5e9763cbc8f79be282bf776a3c5e68a355b7aaf9de6ca2f8a979dde69dafbdb6", - "cf3455fbe9f4290ee742d215bc02a3251f70bdab8d8de1555fac9cd447d80dd9", - "973893dd2e58f02727da2fe75fdb0cc21ad10420fa5395f0935be793255ea35f", - "60576611c1814fd56a4b4b3f8d09793d148a08b975ba2333cf9acc69792acc55", - "7662c5ef7f717c32e0f8b7f29ef1357f68db99714768c7063e72c0c20633c98c", - "78a04f1f6e42b4e27aa0a911e2e5e88836d8d2480c970bbc05e3ee994ef20a08", - "b053a014644afd51f094860c012d85ff8d4e9d5b20f9750532a58d7ed92df5e4", - "b3232a1efd5c1841ecd5db567269496f62cb0af2a3e25fee9c61a7d7270e50a5", - "afc0faa9efe42c9ed87bdfcb4375f109cf1c24b142b1f396029f9236f8764a00", - "bd8f770c5edfe25dd3198cd50b0f2681d749e43d1ee9c643f624b3f4fda046ce", - "5277b738cad9acb7434b94da5986b6f35327ddab898173577019d9f8da78811c", - "530c00d34e766843cafed79e8f6abd25e15b5b6e272f8fc5566ee8896bcfcba6", - "97c2d46c651e29f3a7a7f218fef9316426f1618467f146c02b22d666900045a2", - "ac294d3cd046dae16856bf60fe26497eeff2cd5465138f4847cf1a369fa115c0", - "729fd4968392898ed374f2aa5b575c42584d22a9b927863675a275b43d7e36cc", - "48be311339a823ce8e4d420874d08058fd3483570b6234f52b0fd29424a1357a", - "a56e72de2a2c280dfd0f4fdb05a5b2325329d49aaeda3f9919f01805b922d1a6", - "29fd7329b884b8c4f62e89890277d9be9ed80deb293efb3de574e949209ab0de", - "e3e96bb89601054d1ceed3ad735cb9fb69caa8d7739fc7b0fd9cea4938f4b5cd", - "a3610a7281aa17588c232ac088c4742a89f1bee96e47b406cb5b9c07f368ec37", - "e220455463d3d4a72a99559e4885c4df36f4ecb1529eee9a7fc71d744597328c", - "f776ac2627ff4f2b3560ca97495d89437ab750557e9048a345f25ec1143458b4", - "d9fef8b5baf986ddc2b5a422229f9bdba98aa3f73cb4f828cd583b3ecf688c0b", - "1c53aef24f63fefbd5d0daa2a395a7ea12ef02e4e57c7e94eebc082322b08348", - "c18b5c791e249ca938c1aeea299327979d899f752d7de080aa08a5be50e0671a", - "ccc9371fc591ce5a173660f8341311dc7becfdc2249ae3c1dfd3ae905727ff79", - "565c7268a0dedbf8330a60137455f9669d5e9dae3f42ea8b74bd1735ad3e9ecd", - "5b2381485c3a3105264a974a6d1e2cba6f39cdbae5e7afbb4365917af7782b8e", - "36498f855b8cef7bf44091bec773bc2ad81ee78baf25902403006b6625a66345", - "8065046a530d612445f7dece74653bc1c3fad05dfd1d1ef2bb235021059ed81d", - "8a872403017ce53528b7c58a9335858bb4254beebdb1ffc1ed6356196ef75bba", - "1eff62ef85ce9bd326c9f96f932d29a49ea37869b0f2801ef8c35c5657880f1f", - "20169d28b89ecbbf72517fd66a98eab3a4518441896ea1717accaac70c67df30", - "165975d656cae5db7856a8d574d46a0d18c888f17ca2ab6a19d24dea924dfec3", - "6613343e10ba6e52a432a393ab8870455b726e9517b9415750b392d00319b578", - "c960d30aa34d980121730fc1bb97eb8c2938bb7961f12f8005949b89c3f6b918", - "dc745c15e997f27ac18bf2bd09c6eedc0ecb1ea7fcb329c1e3968569e25bd1bd", - "dfd462492fa46f84d771f7ad136b598f425f6403ba0788d5b29b3c7ce4fa226f", - "7ff0c6ddb16fcca97f16f6d31d8dfc0d4d80c4f6850f60101d146015ae72b975", - "be41b604c243c12d1a0edd0beba4174084d0f838b0d9915162706f790dede370", - "33667a0c052a0b88444547ad88cb199b41622d4d9530995a353a4d9225fed593", - "7b2ac230bb7aeb7605d4af997445a3c264fff15fb1ad16453733c483df63aa40", - "2fd7355a1aab031e20a8d4dc6a0cc228a7678113b9b7b9c727edb21adc32c816", - "0ea7619b4936f7acb54aa57ee3c2d57b40c5c84545c8aecfeab6aa84db6de128", - "b0ec8bd85711095e86bd97b70efc8ca26ccac1fc45df9d7f7f179e1ef887e3a6", - "c0175d18ee045e9b3b498e4431adddedacddba8cc4d1e85945a2fcf29109f242", - "33e9a60ad0893bfd9e3ee4c683f14d96f25e215f6cfaad1cde67be18e43e5be0", - "f99bfa87ecacb69bba7a26788862c0fcf78f743b3e703412a71b457a74f240d2", - "e09c38c2c7516cc90a2fd7df879c9400d25d3dae24279c9f8d8e129bea4e4733", - "2d98206b503e2df8271f2de1ba64b96327763eed5720fa2d48851af4b2ca19f9", - "f516d664abacdf2d5a6f66397fb7629800fcb9cfdae39254920d25755a3da7bc", - "12b469850c76a4594ac00ad37787281d8414d9674cecab731fade8f5ea9b0bbe", - "4dadba5834a0ec284c144bdbab6e22deb0399be342407d9c6737f1300530d652", - "2dba7b3c918c0bdd575bbef253c56c367f1204da64cf3469e99743d289740d30", - "5362580f9be29c56dc3a1ba143a076a1eb3b44cb9a2d08b4af8b907fc49a29fe", - "e1978d30b4de1e130378d85aecd8af744f7ccb62e68c2eecf70f9683bf6d83d1", - "b8223527c85c57ade7448a6a2eca113a5e959ebdf2fb11a802724028599b7f39", - "00970f90382343ef86389e93770cdf707341ab808dfbb8ddaccb979c541dc829", - "29a081ae4e8e498d9959b1967377ff8417f4b848d081c505972671b4ba9fd089", - "cd6f55b8672ab63a2bbd5385fbe99c458789bb7a3592b1d560f7502a7e984425", - "9ed5b082c2219cff308643104edada452fc78311de177dac9e9e5f50034ae8c5", - "a2bdaf8eb76f1f8a65d13f032329e2ed71d5540c98ba949a449504feea27b89f", - "b706a073a6e429915e886d0eff6b38aece625941cabdd7f09d0e4d809e9a504d", - "64b6c79e8676dd6c0af4c7efd9fecaf46dfc27d61cad308c5bfe99f45cc6514b", - "76103023b2efe298ede8d07ed431ef3c808af8779511735db23cd2695af1e6ad", - "18680df1f988481aff610baf486bf69e2d41e9fdf0a62c3a28203008ec4816d1", - "68e1a56e14d322448894c4be9eb5256957dbd1ac74837eab881f841f1578451e", - "a9457677229652794de29e52a68d7fdf1f259b71028d3a166769ff0b71396866", - "8b75805b5318cba575f2ebd5d267faddaa10cd293926dbc7664c9132e34b5a5f", - "f89f6ff9a187513db5c5b6b6518cc45e3b51d4073954317c13916573c95a2406", - "8b0ef5f9096cfa06a1de4e5aa76b6972614b4681f9fd2f412019018ab33d72fe", - "d746c52572d77afda5325431fee163aab369321717f8bd7873fa3a00ad1dacbd", - "d1319af9cb06b66c20b28008bb3609f2030919f7031799db791cacaebe108c12", - "8f759ae68e15c7ec19bd84f9fb6bddd1e3fe24233f23e526fec811f7691796d2", - "f471d97e804b5d36e194208622fb761ae7d702bc3107b126bcab73d2b3f46ab2", - "c03566506cd2a1ee088330a13d839ae885ad8abac79d5ef2646f6f85d2ce2aab", - "1520b73cf3728ada45a97f471d61ab03e018ffdda1c5a0122ce1ee8d00b8c5b4", - "0142be2d8be1d348e33478e41ba506c0cb9bbc0c2b9fc86f1d32ccfdda6fb36f", - "3e2e236620f2c06b076649b4dbebfe9be417ee517f7bd9763c915b0accd2d8b4", - "3f41671ad37f4e871031ff6f2c17ec4c76e6f211b8f3d47a19f43748a4f582cb", - "fd4029d72e228229be58e7a5a7a922bc5ae817c030f3065b8cc222b48e1a245e", - "22b97fec750a9bd4e05540913737b5cbe74dfacd7539a51b831206545c2dfa21", - "8b1c5c534f1d0e49d7cdbe0f4bd7d76005d9766c110fe062b46b2efb9b6860c2", - "35701e853d146ead10f71e39023fb1dfd661bc5e9847721308c6577e1699b9c2", - "04b8d31402cf67d4aa8a122f4e0b468997cb9fc07a6304bd5d49306997de1b38", - "36a71e7f7c725f0bf3abd84561dfce1bf816b69ac6a86b39e7c1c4ba3b9805c9", - "cfd20a272e4a6db537e258a2ab6ee47ed3cd0a851519950097cf02ea5b8e5211", - "8db35778203d741794fa034be8c8908b5c17c905bc2dd8451e9c8efed4246ea6", - "5f29597db5260b610c254402e3dd2b44f55afab7b7d264311923abf7c980f0d6", - "4bd5c0a2cc15249f0583ffdeafa07db3f2ddfcf58b0a7ea80d7354043c3f579e", - "588b5efd625b4a50d0227a2f30ec0afdfaffaf3b11715511783a970d315e34f3", - "f01b6415c2e982b757ede3b361cf087c7c1860a84d6cc933954bbcb4e46b2e90", - "db3692dc3ea5060d36b89d92189953d08d50218ea129e0e557da7cf12bddbd4d", - "ca56803cfeb6f5e500f545fc44cc70d1281261eee1f173890826a253416685f4", - "5e9f4e9d38f7af9e5a3499628895013dea755641f07f5be6a9405ed20ea1fd6c", - "28282fa80801f52b9b556ce2db4067993dc319cab7b61de0342bb3506957f700", - "405a078d1bebb1e0de99f2d4496766d610582dbb5f6a6a6017deb57a994b814c", - "17ab0cd9ff65dce4529f3a48858055fe0cd93b99622238e01bc861282992f8df", - "642ee626a9ac083f34ccc31c3395efc1053417e72d6172c88c2549d87299b2b9", - "64e0cca0b1346e776a688548c71ab83e7cc1a27221a9ebcb82176fcd5df7ccce", - "96d3daa2d43d23c8342feb3b2c7a6bbf91aa937a25117656cbc01262a228d7ae", - "dd5705446384d26ec54152179e5ef17e99c037b66fbf1a19c48b1330335fbb3c", - "29adb123f806aea2dc69fe7a604d7067e4386179b123ae28ba94dcd278fa50ff", - "11ea96a44ba751785150a85df4f5d0bbac331a4d91b830656f2c76132de849bf", - "aa896a5727eebef9c7f48687dcd300e8a4c1a06f32fd7b25ccd003cb5c245d76", - "4377bef086e27c92d2a75955b2fc8af993912672788d68a2895ac18cc67628b5", - "02889c22b1d05cc66c964c7e1c2aa0bd29e99af13f595c621dc555396ff3866c", - "36f5e578feec51ef129b816637e0ced2dfb652200148eba30130b279ec4793e7", - "bb2d525b72d1113b3ab0e7c13de935f0de62af5a8500ab66fe642253af65c588", - "2d904d2857daf9c981cf4a4de1834468a35d44181194fec5903dbec79adc1c78", - "acb87e64b7a14da5944fa18c1c4e7bcc84fcbbb13cb7dfd8fd7b6853821f1d97", - "995cffee699b8fa9f26a024e591e555cf3cdd3937aba3191561b0046dcba2abd", - "38f0085c82b3e3c814a4684cfc8bc2d54f45c2a43ac3776d0f3e985e6227e786", - "64591d73a2d1926476d4ca7bbb0da6f4590db7ffce7a03a229c59b31043f1a41", - "5e16bcd731d8bcf7a57434c1fdb277016051479f7d875ae5d37ba7ea03885ccd", - "eaf4a9e14f4783b6f1dd148744a182a4d3dd56b953f99ebb0db7021aa5920c27", - "9374b2e889ab8c5a23de58b4ad2ebc925d9093edd2f6f6fbd7c99eb51b2d0e84", - "fd262f654ea55eaf9a0a4bd607ea74be231d793e20e49a22ff0b516663854b2a", - "197f1bc167fc15ce62dd00f7ea00441d72dac20412cf3cb00a3050c716cd5fbb", - "b54da30ce1cc56e38b481013e810f937ec803ef01a2e095cab729db028042bf0", - "76975f9c5f317f067608556a980da52865ead3f15dce0d64b1702c41688a44fa", - "552e28a90719f943c95888b1453275e9d540d1325ac600ebe036f06eb87c7cd5", - "b3caeac433940aff8faa89dc8bd488bd857e5b4aeebe0652983f3a66f309879a", - "83a70cfb3a1d88f76f198dec5987ec7b6e05e6542ec9c97b9b8f05134abb7f11", - "9fdea501d0299fbc1231934194829b620bfbe4d50f04e53e311f4e1aeeda77eb", - "46b278a07327403c0060927ceb8028bb838bad10944d254dba75735db8b52773", - "66a2a9314652f93cdfc69781c50f5dda3a3e2aac13758de0c0ea358d0fd6212e", - "bf7162bd5be167cb43ba308277ca2c7b0516415dd9d029b15e744a10057f14c2", - "7e66da1a86697c3312b4a421468f5ad97bb51bbec61921e283f7405df328c045", - "a61ff9c99dcf2cd724b72986c0441b6c87ed2444f42e8a24ba684c33d12eb4d5", - "bd8ad2104f04e12c7e4b75423586fe583fe0d8da6f2efbab43cad75b640e6468", - "57ee4e73909b98aa29e2176df8a32183ad50bdd39b19c45b22e0a2a0ebe1e7ea", - "b6ca8c6901faac4dfd9fe042f90085ca095c497c595df9cfe178b84b23346d18", - "6f6289e354298302fc1d955e0726a8a41da0eb20504269864044c4845bd7fe75", - "f03561f97b7a75063130e884593d4ba0ad729267969bad42d2888a8c7fcb56a1", - "8ab1fdd9e20fea58c83bd0e83b95a3d8580ecd70ba7628e46a08d33e45bb703e", - "c904e0b2e13a555e544a6fbe532a0f2046e5d760c3336c55d8480dffb84d432e", - "732132f76bdf52183c2b545d5dfbecb9b065eb4766e4a09e4b3b70ace3c6a471", - "dd286a0529e5ac635bd6d3d3263f10473df0f621aa38f199abc6c1187b26a7d6", - "10df0c76314d1648a8a72d713b9964ff6b1dda0a01dc2ced2c54e5640d3f9345", - "f12ddd990b8611088ee57d1ed5bc3601e3b4a0519fe505bf1a77f824a51c4f9a", - "9db364b0eed5f9c729d5949da322affc45f459476fa060fd35bf0e5f0cd06875", - "6e9826f936ec615051a77f3c92683b36139ba446f6314714719c3d005b8c01e7", - "b31744f231552e709ee7fb849f5b94ba79e1315a88b7523d3aa28d3b3bebb1ef", - "0a22ebaef020ce16364b1d673ac615a2686c197b4746a6279f5a3a02c8236831", - "b36152bd91c9f22f9c7d459a743acf751a10a0f5c2e62152662109dfc1e142e0", - "cc165e2977b7b7dba0ce3f78a941ebe384235c30f9031b002c6f1f15728d550e", - "552b6f1d5f7d2dc43b00fcdcb420ddcf6737e29f9d3dae199ac98f2acd10d017", - "e0ed99a5167a41228688e24bcf859ec75dc862cf91caeeef743882856ab57658", - "023130e2b58e2106f97ef422b02debe38cde843d07d8b4155100a3b04281dd08", - "b4a1a51d64c688cd000a129ea0f6728b6e042d11e5f2de41dfe9eedde6488e84", - "f818fa35f9184be4031054f653d16dba75790dcf89a17a704e602a41c78a3f1f", - "8a25bc47934c342a3d9f3c4b95d263fd67d11acd0f2ef9626f56dac139bdf96a", - "c3a90843c66564073e8173411c964f4e1141c69b778073fc8301b0cfcb289552", - "c5b2251f6cc83a7f0823e77a03bb09f8ae167a7b93be67e805f2b2c49a38d8b0", - "be7b42c8e61b2ddd429665794e3dcf81dff26a297b067f328cd2913df96f649f", - "f0b78a2c869faeb8d5ea5953bae18819f6ce49272636aebe3e719ebef4d4327f", - "462f33c914a66530350512cebe61a1317819a04a714243582df282e8f7b0f764", - "ffcf7064e103d79d74831a4092332a96db6089d53e5d983b0af970598a392cc4", - "0593604309d673d443dc156394fda130c3c7250e204c8533765bac357e8233fd", - "573d4ed64d0000e46e15b549906c3af77ae97c62de5d719b1b982831fd3b2448", - "bd8082e0fa7ee7ed0019ace429c765f5998694fa48e24d06620640caf733cd01", - "a38f4d746197325485f5b794638d3cacb1b3c9545d1038a32042e741387d7c79", - "c207ab72cbb141378ad1f8ef406605c2653a9ab1d4e043d90a2c41bf963ad6cc", - "d62db8226bd9f73a02ba53ca07ae177ed8204aa7bf26a956c5ef0a9a6a22e093", - "fa9b7508e88336ca0fe7ca480fdea7cbb757b0c3e88dbf460890d4cbd3d9b7a4", - "b0f7742814453649190511ac0856653816ad3f27ca56021944b66c3edcb0cf34", - "a03ea3d3012f066fd5db5ac2f793ea11c7c4a3f7ce9e6fc187df2923f81cc6b7", - "f6469e410cf7d2d9a654b629be530b1cb15c1955a2e16d858bc0e82a36ac69fe", - "17ac9541689454725667f91fd966c10c16b19d35b2c25ed10980752964b09907", - "3581e248f15c02c87b6372df068de99494d191ef188712ad60fd7f312e7dcfa4", - "31e9ef48a325835525e4a38340908f89dfdb8b00b0ed5bb5d6d9bc0673916f2c", - "286419c69d03df21a3ee501743076a192436e5eb5115e4846ada6950e12dff25", - "95277a4500a097614e76cef840be66743b8749fbad353abdf1bf66755b04b13f", - "7a354cc05088de763bba9ea919d7b12fa7055bfc8d2ee7e4804ab5e94247b3d7", - "86d815fbe39ad8b13032da4147f1ca951f838b7ac0d86405a8d6e519e48db06c", - "c864ac3d76664c9f4a854453e81d2ce1fe9c01cc923cd59737caaaabbc5993db", - "c593cdc747f6bbbdf2cc934ce4a5e432c4d9132d3a2b7f2bee73a46dc82df7ac", - "770558f23990dd9dd6230c4be6d46bbba0abd3d015cb18fc74d346537ffda404", - "6f879a1c42ab2a7b67c5e6ec9dc506cece961ea3360aabd7bc5eb02fd0f208a1", - "e2817f276e06514acd6356cee52923c2af8be9a21520eea90211939d06fa5c71", - "76ff6503e7abed55aebb6db597a819dbfe7c2df00159c782c2bfdc808e21f5bc", - "2ff52e3f909945e256b2c0351d1ceebdc7004f7e9876f7bd9a59627a71c44270", - "c2fd63605e7ed68898015bb8253b2788df20787641f666eeb700b6371ed706ce", - "13265053bb4242475d7ed4a95516284a579932d34ac1f91311ad89a02918dc46", - "a0ae870be9bcc158e3fa058dd4d3e432163931e717b079cbd61be9e05e0f5e9d", - "9e26ca4333cf5eb7f82c976332f32e979d4f673960d24e4b284518c9cb8b912b", - "9cdf4734ba95a34b5ac51e726c2e6c7337359e76404b2c7d32f9aead0d5d3003", - "4e2467c61b2bea2f652276c4624ed670c9fd7fda2a311c868ddece1c8b1097ca", - "a9f8fc008faee433ce921c14eeaa0449c5eb17bd6ff26b808f740478bbeb5cb2", - "4afd790aee9ba093bc99b6669f105523477b3cb2ea1e2ace9bce76d6b5ea7ea9", - "d763f7a5c270274330164688e3dfbcd9ad313941be819cef29e0d07feb4759b1", - "c7c284342c8f3fb6529938061e37abc92cb61edf1760f941f0fe1b6549c07d76", - "6fc3d5eb2a67bc6461d614c18d589dda5356e519f8d8ba33ffcf27e17aec996d", - "f3636c6c7dae04171d5b5657155a598d0e787f3fbde44d51e5ff8a3b28c25b4d", - "abd5ce9107987ed05c8b70cf93843637e31e08d4ece5cbc90f7020e290d68de5", - "012a0e6583f8eee2f1a8cb532f568c19bf1dad7d096b2804872d8a94ac4a2dc7", - "07f87a8112d8d3bc7609e10f95137bc39eebf7a7d8c3acbcfb34043b3991869d", - "e38d37ffb5bedb405935b6969c92afe2061bf1322daebdf2d8c3ab8aacabda62", - "6dff9c78496dc147dc1f13cce55f45fda259e35672bde87b47901c6fcc8037f1", - "260f9a299f2bd75091e92f514bf4f003de6907cf8778364bacb0e2ea914573ea", - "c1d193be5641463d76203cce515ce1ece6c8625de3ba89fcc5c2a0ac8a401637", - "41a2f7595c741c47085868b7c392b8785383dc11695f7b91a587ab6ecb24d4cf", - "4b8ca5ccf18233f7d8b6355247ac0fb68a52c78624ac3c3b14df80ef9d6c7c2b", - "863132b5d5679918136dc514f71c8cb37b52645d887404390428f64174c024ba", - "b8445f21c0fa58a701a861f3b847fc3416ea20eb8b4928567efeb63411ed2596", - "0c5fddfd49211da756434ab06066b4362e5c4cc55c53a8b32776984aa1beec7c", - "5c68d0b1616a54d713c39914fee095772599601375c706c719252d6c695ff1ae", - "548483b99c9c76cf3655a8c5cb8a3f65cee83f30f20dad40dbbdaafb35c28576", - "5b91b21573927f82b5770bd7f719ecc521a6e079a9ecb0e322ccee8f5c2fa29d", - "aa3b937dde4fac8ba283b5019498fc4bd3cea7ca70fa246ea58e00dd99bd4dbc", - "c0087c54cb18196e9c9fc253ad7bbcf2e19c92e99a1759bcc84a607119478543", - "ddee84d3f133e3f91f4bebc21da015109c26007e373e496345ac2dd013c45037", - "4ab373538d21a894564aa430ee50040f0569054caf69380b8491181834f73f45", - "5f03152923c468948524136fdc3f5b6ac4dfefe9750bc5b370e4972dcb699294", - "1b3d7c29b1af1517aa55060497a6158c141e56be80381b2566bef46972f2370b", - "aea2d22693d65480fe7e35f4ad7b7f75fadc1fd51d4bf9da4ab7dfc3f9af00c9", - "21d100a499fd253d35b6a7ab1abf0087293bb1c5904bb3e1a08eea6fe6b28f0a", - "b9f3625ff95932048c060dae44dbee5bd902a8bada4d3b7d2b548701626a4fb4", - "eba3d5b92b9acc113c3364c78bf70fc7b7df417381a0e78bf069c836b172adbf", - "8cec45258ea0d469e2892d655560f0dedfa31e36625304e9781d56b6f298ebab", - "90f6e9fc7a536f82f9747e6cbfac3328b1516544d9074630df52450c4f76cf28", - "1f6717d30cdbaea48146ea79e5ec1aec922ce71d681fcb3f9c1e7fd5a6307260", - "dc485fafe091e7787a4869875239008478b6469c27146cd32e5c0b6166d52d6a", - "3662c0356df79645161dd79b4b56224d3e014d02d9f61642110b46ecf6cada5c", - "93c40f3f635191c73e5ee85646f96230568d9b7f253d99f16e35cd4e7325f93e", - "e18a187ccb5ee18c253b008aecd111337f6125d1c470bb30afd0c4f089289995", - "e6f60fed7d696a797afdec75ed5c4ff6bf2980b61110e4de0e90813450f2cdea", - "7c4fe3ce2675ac768dcf10484f562cb353d0d50bb4d67e809d0d0575029a928d", - "6fb8be513062ac33d77e8d4da084edf2e23a676085b23dda06c3b52a5f154ab8", - "b02bf105ea2a041dae1d2a0a06a6452f8c67676a1228147000747ad8c0797f44", - "05be177428c978e49ce0e5fbe9d48bebf76d5b620b495ad45653c975c456c3ee", - "55e20789dd6806cd71e898b5f4601c80b84f51dbc6b7b53a64a5b12887fb0046", - "49b8467528b47f2c439a88baa38c33e56cf16c9d336b498c9030f51be7067df4", - "f743558ac3b8eef509c68f0414f9c3935f6c2a6da2cc488f287c6d92c9ee4243", - "508cc812de55049f90cf67dd8ed2199cc9fc11716752b57e24bbf492956ee6ad", - "34ae372039be8ec2bcc8e0fc0d8261791ef1faec54209974025b0521a868113f", - "b9fe1b0920f1d43ef84c94b871f7f5877c77e89708a220971901c5858f17d8d1", - "2ada3a0188351e847033e3d1006788619a8ea9da431b4c85c1cdeddfe5d074ce", - "449dc5d7684f2f67b445d1dc67a249e7204a7d11a6ea1e2539114748a5631ea8", - "f073699a1f5d044906baadd35cf34e52723b4f19bbe904c883f522ecc81995e2", - "2e540726d372cf954775a8ff987f24e9d67e4fffd10c37a6b3d85b17b6a07ca8", - "3ec092d808718c5f17ee75d4f952953becf43315e9a3e95588dd43dbc7e10e52", - "ebb0f571122fb78c461f71a89ea675c907909a4ed65097219643a2c5ac42890d", - "91ea30ab82968d95ca2464943f29d81f491a47743d44966d9af07f4f0b2fb901", - "15b489eaa7f6035d534da0484e4ff6ff2fad01156e344a52fb392f9432cdfcb9", - "49b00af6ead72b7094f68d9dc1d202e75af20ec87e0d2f75295dcb81535cb6f5", - "f28f8b93f3fc3b431bf5c9d9cc128b74dac0906d84d0a268b3ac91e091f330b8", - "a896f2feaf9551050bfed9a64352ca2bb2dd6a7348f8e4fdb6b8c41b4639435e", - "49d886e187097f2b34c82856ceb3701c9186d14c6a2d3cc85f4ca89c9954b24f", - "397baace0c17acb32362a5e5ab67076846b08106f2c84638075ba62146051e9c", - "bbb09eff9fdf2425cdf52a548731550abd2e9178c589feab1636b652c51cf577", - "65eb7d1256558b24feac5b2eef3b988ccaad4d7893d7b0655ec28ee491c290dc", - "eee5ad1babb647bcd66c51f906bf2f83629f64bf0f59c32779c0ef82e0ae7a46", - "50e6ef636c66f2c89a6a2ae95cd6ef6d578b0df2fe34ba3b134c7b4e78ff663a", - "72fa6e35ce0d5dfb412268e06d65ec95fed88b776f08143f8a5251eb41da4c6c", - "b5a46438b5c3dab5796d0bb2b2a944207e182afe0b8fcb13f3525cc6d51d821e", - "d6cbdb5d30aa440f5717e8a00e0572272f1d04a4a236e76dffd17cf76604c390", - "60e584dec66b5f96ab24031048d0be5f9af5e5a1b360ff29f2620d644d06e8cc", - "600fd2ab34fae4eb528a91fd42ceedad0871c882dea3a57eeeff5c808d0b09d4", - "b323d37ccc780f72807aeb56062f7496ffaceb4fe57acd0528c68b316b5fd9f4", - "7ea6bb26066372cf40ad6ca9c9d4541763168965b1c40ffd9536849484777015", - "262b214252a4fbfaf0c5de54e3a87ed91e9c935b90a7240cfa02bddd61f2aa61", - "c7bfbe383f80ce93ff989640428cb301094d17494934096aed1a039c380a1721", - "c2f34df80f9a0d5d13eca3efea9cdecd27356cc8fdf1452b24a218fec47a9f8a", - "49d98aabbe9cbf72ef06478aabb41fed3fa006e35902187d290f989b3748582c", - "02c3b44b44364a08b29ecb1ad93615b5752b65780923cc47e3f607f3e3e8bc61", - "f1fc06933f1dbe236bec3792c999528593de2bc2eae08ef7d64e359973aa423c", - "b27c59cc72ca6928f051cf3946a56f5afa6954c1027284cb7c3ffd9755edeb1c", - "2df386db2ecef8ee54e869476190fee9fcc2c8a2088e3e504b84b200f5b3e80b", - "583e112dc328269f8c19d4e8c3c0f7705d45dfb4c767f467ac5215ff0654b062", - "88ef8a6d5874dbde7ce86a538e3b1ebc8bdbb12c666c909ea158d045e105f06f", - "8afb66779ecf0ab20277301bf6c075f60b4b1f009a5dfb065029bad8783c0958", - "28035c082fb361eb20f199db0bc964845a217d14216aae5ea3f1abd754eb3dee", - "d21820c4e1928d74569de5b3a3e9b022f997ac7ab5cc20bcfe168ff34f401fbe", - "cc00971ea690f697faf7ffe7ac442292c0a2803903a6954fe5c5807d992ca1e9", - "d2990e6bfeed5113de9f1c5333d8bb9ea8e22c19e506a2a7477436507fbf127b", - "1f8f22f187a1c999263fb7e80139ca24f5da82ae0484e95eda126489d462317b", - "77ac9e8aa589a18f0f43db257f08e51dfa7312af31e73cafaf433de039138416", - "be18415d4809548c8c528ad08b54bf1cfd26bdeb234978a78ad1dd4285639555", - "7495558bf136d54e665330f365df0f50711e7b06a0aa20c66fc1b14721e7b4e4", - "179b2c79c89abf0f856910284441ea9758b56aab11af5f14fd37df0206bb8350", - "898753597b0bb7e4d39d2931cc8d4d979d2211e6bd0de8849ab700d1fa2a7fdf", - "b206065847fc8a3e06596f7e660c88ff8258becd909e5cd529b111ac406b6350", - "98216af805ed2efa328890b9b05cc7318726a8f74fa17f67b82eb4901015f475", - "bb3a3794c0e7db931662e09c242f2733b245d9d03def97ea12ad8f3b2f77378e", - "fecfc344c37460b562f08cd437247e4c9a3a52dac7aab30aadee2b983fa5dd46", - "146aa73265cdfb3350f2028540c4d624fa92ac18ed6d03c392cdd4dad5544d5b", - "fba5ef2bf80b608f948ea2828bac853e8ca296fd4b865eee139b185294e0c8f4", - "2c8a1e0a69defee409d771a336e6873eb24508eb3064004cf7eae0b1faf9c91f", - "d4f4d7b790953846851e603a90250b69d4a91e5b4b8b67f15a98fbe3e46f3b35", - "6024089ef44a1844248e2237f141efda236f35e3f4b0b127dc41601a4bde1b06", - "adaaed7d1b3ba48ae1366ecee5b14dcb92ec49e80fd8229afe2d20636ccc362d", - "acdf3ebfc0160923a87009c8a11b5f1d30a2a0c0ab1580aa2cd1cc13a8f59c34", - "67c4a41771c1e73d04e7684f3e1ae63843a9d29299d660326499a3c7a5710b62", - "90600334bf515c455794616842770f39b416a4be4a8be622abb65e047eeda6ec", - "f6170810b247f2d2227492a98eafa0300d42eb7838769d808ff03644389eb9f5", - "6faecda05b782a04f7f34575f47d6a244704f68c6a666aed82547ebadc64e636", - "f588269a62f521c917c8f4fc2d9a4eb15335eec0d28a55d02d36bd0a95fb3bb2", - "1d6f94d13b09ba5b71a774a21863912d6eca1edee1871235fb223510a652fef1", - "f72f832543249de62ae98709d2f704a76f5500242f94d2e12927b342868c0fae", - "a20b343f30dfadd9bb5be75872dc44855bb63951f862b6f49bbd58717ae8dcba", - "cb310546cd01608d3607b2dd8cbf654855905837317e634d9eea92a7b9095502", - "486aca1643ec1e218eaed74655cc86dee9a90ca85706040d2d48f765b2358c17", - "bc0855706ffff7fc990c476a2bf46950d60af6dbd81219c06fd2a5c50192f197", - "87a5724da66ef4a63b9f9d71be632be48e107b4fc3b8d474ca6ea0865f91bbca", - "f338b7184d3f0b52042200a25c431802b6228abdce23a26c96aaf408dd30750f", - "32a39e5431b0d7755b54c0b231556ac15a99db70566be7cf212f917e6636fb8b", - "ea462461bd1dc3e7702b4d17a988345b1dd74057462ee9e4065a3502936a4246", - "b0000d762ec62089eeffe1488e070cb003fce3efce96081dd47127ef618603e4", - "5d6bbd27980163d511fcbe4379e6e1382cb89a969d0d14004f1d20c3dee01b87", - "cb35da514e7ed7e8184cc3924fc7c04e17ed0db319ca35636b66e1cb47503f5c", - "50bf4354a0e1e8ab7c88ba9acff0332f657eb9fafc72d7b7af8468c6a01b6292", - "742e576f3edeb2866c18495aba49e63588bad25448c23c47e2b5e24ec5337574", - "405020d0233a628ef5fbd392c3e9493d7831fca8fdda8544ee103aec411436a8", - "4ac628de56e66041cd758faa8a9dca5ff7cb1b4db1ae8e69a56c571f0517a1c0", - "dcfd1c5f7f8c4cac1776e0f09d954c519ba4ba7de4383451b005f9cee2383afc", - "98bcc486b8459f9bdbde88bb8c7224700ae971962530a6828729fcca9f1074b1", - "679c762b418da8cbb664e8c12f56ba45ce62f5226ee42060b32edb2f35326bb0", - "466b7c02251bfe204f96cc7a74078641620153eb10b138fae603a05dcc035f9a", - "d3042df15bf8637d05e150f671b39891b523cafb1cd9670c4b2233d5da8d14b2", - "dbeaebd3711c899b742f84ccf0bab899130df0aa2465ef39264b43d44b11e0f0", - "1bea5a94e22b5d4c07928a5b9509ec92ef279d57490939095e2d40d360ae3fcc", - "85b285feacf76d2eb139fb487900d3df9e03add2e8553f6a4a1fced2cbae914f", - "a0573298f9b670cc2e41e850a389e75cfc324bcc5fe38259a057b0f8851195b8", - "2b9dca30422ab15078849734741da9925e77462bfecc93f4fedb0db2247873b4", - "8c32999398010eb26c8cae23e54a8e090c82bc6b3e0d5d40f327d67bcc3a861c", - "53dd6c3795896bfa2663275f737241441607de5bda869b3ece2b1ab6df999078", - "61743b8a0d02e75244ff095199d195e729f9212983ed15e0329c2cb6a39b52b0", - "15c75e5cc7b92f5e4cb1f49e0a9cef587ea5ca606a042ec5948504ebd5b82cc1", - "1a7ddfd7019a8c31a24841d098ab32574b04f0226ff0ecaec0706aa51f7baf2f", - "f61cfbacf406e75d7836864fa85a3748caeb6a3a161b9d0b8c5586d829b1c0ea", - "c99a0fee5ec0b9c2df03321d0d6a7c02b2068eb1a53b78d11865d419ca78bcb7", - "0deafada792254a34f33692b82dbf81ecfdc537f6d93551d2188186f353bd2da", - "c2d6b7c2349c2499150d4cd86dda9cbf0d6d090a5ba49e34743fd9f5b3e30f5a", - "3a07b575faa1a5a0a3f2a8d6195eb50dc0c9a25e3bdc6a04ceab6ec783948a16", - "a58d249113883549f4e766674487f2f80bafe4d193971ad7df2a8c6df377bae9", - "6d6c6a7a9dc1f21d2ef1e73d941c17d3ea25d6799da232214d0442653c918e2a", - "664f7d9245793ff88eca71941b82f166bff946f00f1272093edf971540be1037", - "ff11bba1d74c830d0fa063f981cb0da8d6c9f751c02a9c37dbc4cd2ffe216886", - "92a83ce390af473fae1e28c02098a47276de27a35158a4093d0195e8f876de35", - "f26037c7ed6266fcb75bfdcd6b6d0a658bf5dc2ad854aa017a98deee0a847c35", - "aa8ae70dde66c51b6944770f787cad71cb256bd3eb0984145360d11caf1fb1b0", - "a82e1fc3197dcb69cc93c273bc7c8b874246369ee057919d033eeea89f5dbc79", - "ccbb38e86bc6153c0f95f7ba5796a4b55f33cc76dc1ba1bf0abec7b6742db7e0", - "1009f9ae41b61abb4ca7e042c822a1198189a1af3eda5e75f1cb61fc3c0a2cb5", - "e09b48ca8bb0cf1e434aa7823e525c16f274d671a6f70e77d1eca80bff17bd78", - "ba0265c124cebc3b90ce4d6394767457166219d7daf196978493ab7654b65d9e", - "927124059cc3e7f3e0d1ecfe3d32b86cc69331f0d1e4a0af8ea7da526ae4e105", - "42378bf00fc6a3851a9515844733e89f046c9562b35751d11013fb55b5922de3", - "1717c2cd772240af14234db29960ea91d84bdc296c76e6419eef67b17ebfc042", - "b96dec9a5aac16c17822a87a6e05025c5274f862cb9b8b55c137dc54503cca97", - "a2fa0de1866b3720eda29b6b42022739961e65dc4a0b2bb93184f37e85e807fe", - "d52c7709ac45c17266251e84926964019c8e0b0ecc89e8ef95923686700298f4", - "db574b6268f7f166827d0e3ad34e9dab111af489ab27fa5e2fd38c56c4db1e98", - "2876a5e8f8c329b6d0c75527493aeba71875b28cb32a8288971399230ab39bea", - "7bad9f09acda085990534d107c25e8f2a33054caa6d7772d7d8047bb269e0b0e", - "99beaa933cc50d8503477e8c48de9c64e0908afef906b341122f8887741b2f61", - "a9be5318506ebe1514369b56ec51d854fbd5c1197de6ef8098ad5257808d121e", - "128bf50b6c7b57a7906db7bf3c244b1f2b38312c9db905adbcd9e85f78494a3d", - "27c610f1248f3d313b81a141ec3a4ad913d84e62b3ac935db88881b33d19ad14", - "e48b5cf34ab07d02223788e005a2530881021db26235b01e3e3f77d441fc8739", - "b8aa0aa94e8b2712eb76f036d069de76b8a43857375f1ebadbf9c4393e56e002", - "dac038912c24ca8c51ab7ed5bee0935c6876abe5ca3d85e5b4328babb6bb6299", - "c06c65a4b4b8f47c3056a39d262c7617b04170f280fcd91d01e325dec229f83f", - "2c69f16478b232cd4f3d215968823223024ed460970961608d3fea1dbde4eb52", - "4eabaaa0f9ce1d2bb41557d778fb2d2b7292ac96eeb4868512a919b052ecd637", - "11e42e3c5998e6d46663cb28e51b8f7c11c4b373ab7c75dc44de2dc120aeb900", - "e63cbaaa5319a178bcd4c19bc4b9eb04bd74675753d6ec3010f8e7e0ff05b461", - "6159c1b564dca76f6bb0d4f633c9c939b42defaa353851a2cceb72c20aadff1e", - "0b5f799b5872b7d87d444a2e467d2b2ac8cc362a09e08a4cf0eff666ebe85506", - "afb2d0d95c6cadae115485f90173d255b9193fff912e1ef122b7e8e2121407e7", - "f2c9882cfa88c7bf5d1a82b111bc4bd9bb8416ab92acb6a1da0b0d7f8d0eafd1", - "f1b721f43619373a2ff5e7b984a2ed89c52e8302c9b6514e4e1aeab24ffb5a02", - "78f7d1d678b16084012d63dfca9ea7cd098c219fb6b9f49e7a12ae5bd9656978", - "7ab35392dd6ef3a657a7a268ea0225e03d1016408118478a61cc68b9eb3d812a", - "a0fe1d0a46e1beb60b7ce7cef128506547ab1bd52a881f6184b4e46773dfc4f9", - "37771ab957656acd855b2c61ab09477a2a7ddb2dfcc68ad85949be0e2e3c8b00", - "8fcb0a8879df2f942023ef5ec8c4880a78463228d3db354b69679f98602c5993", - "526777a079792aaa4af4f46bc8c965bc61b2ab82f85874a9771528029aa15f9f", - "94abb806e4300a9b7d15636315753c3e3555c39ceef2acaed11086ac67b1e782", - "2583ea3f626a4138254fcf394ccfc8d82e8d92889f46d38e279a97b26c7dfd55", - "5a16e115cbe19f62c9571077d1c693efce2110a7631366717f31604503a7bdfe", - "84dbff5f874b76d2aa30606f2055336e50f55ff6acab0a3c142df20c0cc84be5", - "d971244042cdb6f2645bed0ba773f48ca250f2341ffeb4fc8b65da36c938df7d", - "8e8920e6695d6eaa493a14c2b9b7d2cb2f5ded3ebb3fd388b85d30257a249726", - "b4811b7fbaa875562cd3b3a91937408fb8879b8e63634b0004dcb747979ffc85", - "f7fc219a87290edfc6be7d60ca86ce52ca87cf648c09aceecfe4561ba5bde2fe", - "5957bae04c8a3ce434e3096c249addf7165e07fb028591d37766299e138df2fa", - "d4d6945026b6de6323c746fb5bf8ef6e7c2fb87c1d552acbc8da695e777f7feb", - "9113effbc359ebaf0b6a531044dccf9781ed8efc373157fdd211fd7924b53a29", - "aec8ef6b7d363b6ca1ac6e433e47fa20f4fd8f5e4ba27228655b263b1ad43d39", - "055b454e22c5d9e3f67d6f263ec924415cedb094cdb92f22c7e6392ff2d95f18", - "683c55196b3704bf0d0ae8bad1bf65f4ac37f3917c96a6ffda68939c602ea447", - "7becee69748b8649f1d670168a2235420c1c1a004da18262dc78b97953a7e687", - "9b022de85a42d1cb0517e3bcc0a120401a43f3c4783e4d53f67a64b6ef010a5f", - "a2d1540aac36ea1382c6a80d893633a840e90bbd855dfbd464251bc7ba31b3a6", - "ba332cd6e0331778621501932a351401e7829530a88a46cdca2c37bf7b42b1c4", - "0ae20ffe67136a6385219464b84a737467cd8e2a4e4c5ed96c0630f1b518b626", - "df2d3a119860ab13a9d42046e0eeb2e3995759cd2c79ceba661fca431aa3597e", - "5c8c1a89a95e4f3ab0f7981810b2f9bedb6dbc59f892047ae74ba5af348ed30b", - "ce961863c8ea911942c52f537207fe611436dc9371d6b0c0c0ea488ea03162ae", - "58f9351b30f0aac1dca1e0317c0f8a8d4f2c16a7bc53cac889a414b688c12920", - "ed7de86d6d62e947c53cf500ef1027efa0cb606f31bd936e318f106871219ac9", - "baff8b2764b1c5c49109b3b828848a9f05d9ba39b72df178d9df680ffd369130", - "b1fbe6ac0052344edf030f43590febb5fc3cb51da038b2e8232cea7d43734744", - "69f1fe0a9c25d35663e366de27f273092fc3e0dc6eb1e6df0843123a7b5241bf", - "afbe8cb96c11a0a54a7b764679f7697ee567fb0c56d14a8c16277098188500d4", - "81ffda1de866cd55ef2f73498ffd497c6ae7239c47bd35c22b2920d259671c62", - "733c1c602451785ab51d62363afd67eeef6f34a06821b931f468ee96848b423e", - "3d836ce0225d149e04fb38bbbd8e00175ca9c4f37d237434e48eb1e2e9f7f43b", - "02579473ad5d924bea2fdc486093c01418f6dbcc8e04f18a332d6fb13d787ce3", - "c18aeed0c52242b88303eb4466b74e6312f88ff31ca814d2b95df97e6ce1e056", - "9734064b2fb25b81784326f40ec3b2023a097fb8d735ab3cb562a4c920f8de5f", - "3c68510fdd9a1fb400828c1d1c1f7cb3a49e8097d68871126bf8c8c68c9a780a", - "a0e233aee8c92d1a9d06b4731a95081e098af8258191fb9e8af7600795c1214f", - "8ca98ab569632e3cd5dc3589e0dffe4966ea6a213032545d9dcf0d886850852b", - "9272577129b361570030ce5629d682dc4d9de97b2f4f2700f59c1bc1bae0819f", - "f118eec5219462de9fe7c88a4a6ff0f3d35326c5cbe29db6bc1b525b87b63754", - "dfd6d548e7e6294082287ea737980c5bdc2204987e4e6abcbe2b3a4156dbc236", - "8af6ff01ca09feee4066e567f9eebfbfc023fafa1e81b137840c71460526446d", - "013b930de3c60a3aebfcb9dc96b37569a91cd3b7a7ba5cd60c9345e561d552ae", - "132548f11cc3e3e942bf73278bb3d695dbb438f1537da9962660062f16b0098e", - "f72f86b55222ef245c9afb21f0edee3b8afca9d47526445be0c97c5101ad4d4f", - "08533c838d03747155b0343d42b4f3b36142a074d7f48f04b5e530eabb965b66", - "d12f7f25311ead33e15f0885f5788315228320c84ff660d4ba76ea79502fb73d", - "9374b80e871b82ff62b3fbf26f1aea2bdf532d868533fe8e0ceb7591e88ce4d3", - "e406112f93fc22e28c3725da78db112b8fcbd887d0cc1f9ef81502c3100fc57d", - "d3b976b569625c27c938cb5584c80d19d52a54e3b6deb1e9c180fd4c212020ab", - "3690c03a109f6a9af80c2212ffbc6cf0ce88fadb7327deaf64a589cce1762516", - "b9604501d4352e68f451ee5a64e78b4912d169de5720ee8b1eb59877e4743c58", - "c2da79f7439a707f3eaed949405067bbabfd5090e81ec6245381ba9448a4c9bf", - "c241255a4ca996487ab14fbb5abd8cb75caf30fab3e61d2487c505b6bc879900", - "e06e61c25a5173ead31c59911a5612e6bf0a761cdec5a7982931e0c2df50bf32", - "ab4cd24b066961232f83cdedd409fd9ec819b9ba1afe5e9f0748b1b93807d554", - "dfdae8a0241b559ca5b188e13ad389911f141f2cedffc340f3a5b188b86d6123", - "ef4d9c6b8ee45c822f3f3b88f823ab1e43dbc9004c527e36914a3fb13459e654", - "476704482b3086ccd9397881be1f48f4b6147fdaa6917b2c5766bd7eaa29e529", - "483de97669725abdb6da0eebff7b0b8200146efd63a4dd6680364f7050538242", - "da48ebd0393129d03de310c08c8370a5b3d3049bb8db1a9d2d28b5f56939d097", - "6c5ede368d45db014af8e13b13d895392fbe62485b847f866ed571080de06050", - "7d6934740769ec1ee05a35e3b8e4102f962eec2e02ea1a9140695918267c2b10", - "ddbcb6a13285d53d0584caaa105d32a41d5036a8f689f267997301723a6370b3", - "c920e00f5549bb44590304e92e1c3d0f958485348e425448da0d3da8135ffd9c", - "4173e7b31955908186a6ff63a220c30fe60024dd5f11cd5ab0f72ea0603d0462", - "41b9eb9da271b3ba65fb5b6c90ecee680c7cc827e0b95cf6a5d447206798d48e", - "1491d4254eafb19363223e5ac53f667e2a1f4dcca8c7a278c64773bf8a238ccf", - "86e211dfaa51fcc489da680a054ca3a83040064dcbb7cc14573cd37f95ac5d79", - "c076292b3f592d9de02d160dc9c9331a5be780a78c34c7ecbea4b5aac7f0b8cf", - "594d4c505e07ad57049373b52ca2b39b51f04413b35a3b62090396c117a5043e", - "1bfe2efadda220cd0dfa7bd36a053305d06eb86fffa55881b44106f3ff6c0ed5", - "afa6cc787227526a5641c4aa0135589f7b057214d31567ecd4e585040094ffaa", - "5f393d802a70ffdc399cd661a5c1e81ff7917b44d7dc84b566021d3be6a24b50", - "4d9494490d72d69090907679859c16803823f36a4c15d65b7637c2561a1b2fda", - "2f9f25a4a85cc26e0958c842bbef7c5dff8a2e3c6cb86d8810553c4169aa5a2b", - "5c6df26255b9fad389e88122a13db6d1a93a701b984210c6252dd634afbbd5f9", - "ad926516173ed858e7f8ffc06b6e05cc8ce1d2f619293b5acd7b87c87ff3ea65", - "aa7c25bacf89c49339a526a4188b1b3636cad895b0c9d821daa68c4b0ae2e75c", - "d7354e6be028d55d3cceec8c07eacd14de75acbab8d0ca17ba6d4a604dcbc256", - "c0708a187fa59de8eba53e7a7a83d53094b143a62e5e28714f8bd6f0acfd57ea", - "c38233c9e100cc44261c4a43eefd2becd4858e057d13bde8cb36bc02dd1357e4", - "3ee9543691e3785838ae3c1aabae0cded1f9fd6180c3b9d7d2f670ee17315fa4", - "4b7729f78c9fec91010dd0aaedb9c899bb499c36f9737d6493ad0bcd4f4251e0", - "ba883dd4386b8b6e5b3a475347ac28a8ef35c09c054354260c4c00868a6e6149", - "911ebd449cc890fc380095f07b11f62392d448af2a266cef27901eb68983b5b7", - "3c0cc17ef567c83d4768e1434c42508c22f5902238175138a6808f10c4648688", - "e65919fdb4b9c11d72cca3c0488dc1489eb868cc4bcbc6ce0261d31ec354b65e", - "ce2e067f63b516d956553d7db76570478996abfa3f97b6e7a821bbb2702acb8e", - "3c6767dcb8979335a34c6961aefc18e407b6a0c3bfaf3864f20c8395bf3c9711", - "80dd7631528f18dfb62de51ca4609ed76156fc107743611bf33e9b4dff834788", - "be17030eabce2ea2c58ca349152505e3163f24c4ad050c90d8641b5cbe4e6e18", - "ed94ef4baa5325736f65f12380348119116ef686378adf3ccd81ea2953ea8ad0", - "59d0a0e0f744d718454b0b5445373a7f00397ed067015d3c2d8271deaad18fd4", - "2c7fc8086485d05c273af5a1cc30c7ff396ba9ef2f5ec9eb0ba44bd6b90d3685", - "72084dd561649017024d7e24d89b3d22379553347c3ddd13bcd7eb109a495675", - "6abccbfa396f2dec436966b78e6261ce0a6d8be6b5b2fc48c0dbe98444705c22", - "93710ac9bfc15ac666ebc569ff1ae3097e90cc75152ee6e8b5e6ac2143318ca5", - "8e275c9320a49ddec616802b44433dbb5864a5dc01c322a150d64dca06044be6", - "d1b968702589b52096e6b8aefc1ed1a086a5596abb163e4875270acd958f1248", - "e0122a17c010ffd44e21aa48c10efbd3896ed12df3a288acb10dc991f5a0f20f", - "ab0cb94f90ee5b3a878f571bb68cf6e6c8a2a7148cb79715dea3554065572f76", - "6371de700ead97e298c9ead59fc805cc3ccf7bb657391f22a0294b8b419483b3", - "9c1cf2100e3e686391c7745407f1fe05dce853cd02c405ab0258c8c91491dd1c", - "20765f766983eb4b06f3c2ffb4021097ccec39cf4129dbd7b218641950a10442", - "1b831aeb2ee035c2075d0d386646697f9b3c8cddc1c224700614a90c1fca04a3", - "18418af4c7a2edccc19f836c964f0a8734e166db94bac8699fe76bd2f0ec70bd", - "757323f105208095c82c93fc091027d4e549363079d54f59f42e3a2fb4898db5", - "286ced1b98b8bd1fcf0c76a280df7539efe67dc16ff0c8d333b8f60f6d4f6020", - "367155c3101ad5eb0ca8e77034eb4d055a93e6b7d29e8e51cbb26793e63a1b5c", - "cc60cc0a491418c1bf80f4490b2b21b6f997328099f62d64b43a0b67e67531f7", - "503b7087fddfe4d1312bdf820940fb968ce829a8590a04b349577b67048f62a2", - "28c447191c96083365f7362cc12ebbfb75be7ffbafceb312ef4af764d0e60dd0", - "9a232dbf1da1ad17715e295313fd063229f7c25a731c5bb9d7104b57a7d5ed55", - "ebd58f827b4150239e52125fb6a7f4b6803ed204506ac9174b150d928ea02426", - "1ee6ed207f22fbba85859cb5eabc6d939c87c9f46a0061c854b126d9077fe01e", - "52cf599948d87bb5336cfc65df2eb5fe7f1677fde6d446b0d34a5af9e0eba8a0", - "e32287a1f52eb2beb6f9a837d3c69460b2d8467496597a3d3da32a19fc532248", - "5daeb40dd7f7086395b73d4d32153a701f7917e771aa9acda6baf2a019420180", - "e3cbb5c27b6c4affe7bb83008588c67499307b860adc2b989b20ac9644bf881a", - "cd6c11f7ddb59bbc8d3937e045143567f3de19f616837d70527857dce57a99e4", - "85510105e2673e8c9a3acf4ed07ee8bd27b2684594f37c579941f9f3072790ce", - "4e2172c1f7ab703bdf3ae93f65bb86faf4257e70d29576ef9dc8dacd06ad0658", - "83d2f02205eba67ec7814418bbce695b23ae35f48b1a5748770e17d8024140c5", - "1611dd8154803edbc0e9b6b2089b364de6df65056e5fb1872fe42d87ab1afc84", - "df251fde8c779892f4dd7bdf4c195f64d35b92c8d803b8b6edaecd90805e24af", - "c17473eacddffbf760b350eade266529b21c49a6f905e01208e350e11232f4ab", - "34a642f630dd3a70aad48846098667d42c027427cb6850d3ad0197af0a16a614", - "e84f715f48a084fb5b258d357add89071248ba7c9aa9e1d04346767d69a1f57f", - "60414bc58654a791e05c18bd5ed2edaedbf35260ab288eb80b563bb3bb6c9801", - "e00c62ec6f3e8c47a373296a32e55a4d891f6d5f2dc7c83d0cfd43db43c0c36a", - "fb9d1004098178eea7a120aa4407bbff0d9038b72ab12d5e2a166830c31760c0", - "ee7214a8814ce4585386b35440d7ed1c258102331b8cf0a3d6407cc3fce9acab", - "034f87f83d77c87cb13c8921b741d7c3dd394c6a5ea3c97913d6f8d0ac06c76a", - "29768acbf4e38a1d55d82791604326cb9326da1c9cc6aa4a2316f3005db1b2f6", - "cdf9911a4a10de65cd3ce730b75994f03a5f857db03b0ab0121b0ec92f44ac4e", - "8719a99f482e46aa76095f5662d8d10f5a3ed1dbdf77fdf505b31e3fa3a95a4d", - "aa4e981c08b33a2be8b4391ff318933c3473da1cff8d2df464ebe5da5192411e", - "806058c6cd206199a93d176c190938d6d977758ccd65b512024597531c50766f", - "dbd548888bb46b95f2622d7e7f3189430d46f77a6efcac1d7cd49d73e412f31a", - "d777201bd837dcf49f84bc343c6af6bb200a4eeeabe31fd28c8ee9ab88ca6436", - "45c1fbef81db009ac0f2da6daf3d6d1be04c382101180b36f8f7ee15381083aa", - "69d93eeb67ea6bd788c5173660292c4e33ffaed1f76ae6441d44f0a5962ef6b9", - "34a4dbddc5db1a170474f209f4425b045d2ab22f2550e77fc21d7025e16c1c23", - "52b3329be491b9c3cdc4b2ec1cde19bb3c74b5d68c9351dbc7d6851665894885", - "bf2f3f148d1eb1601e7d711fc0bd0edbdf321c9591f78a843576399e7c5f58fb", - "07958678cb7e289769346ab707569c5ca8254f818f9a2c238387660f30214cd4", - "18ec6b25b6f7d522a3487ed297985ee134b4fa68364d5cfdfce02a15395150af", - "71a7ed17d067196ea743bed838a2c8faebdafe3ce45233c7f5500821b2f9712b", - "2559edea64e3c39efc7614e62ac5b9516306e0e094572399af04a2dfd999b417", - "bd13ec6d29b59900c48174c90fef7b40de1159c83d6d4fbeac49fcd22dd3e7d2", - "30b3c6bbf43490baf061c8e705d67a755220db41b046847df32348e36960e36b", - "a8b4e0a7e6f0ca905c43462efdd5b10942d920fdd7b90981448065a0ed36d21c", - "af52804a98b3a94cfe26409c3370bdb12da205ac5e5b931dd927ebf32d13d455", - "1e231f1077b7f39963d2239bada86699b2882ca373161cc165a9570c9c8ca619", - "22bf31db6c291fb5fb9ef7f2689f04b3cd4d705427e0928c8a252c6847e16a68", - "ee061affa0d5e4f12e14d7508fed7d5229e8ae25f10697513af46ce7f647874f", - "658b21b57d87560eb854b0a1c8294d5c6c5acfe6c2b585ea5517099c60f7f010", - "a1d74f276d9b7c90f14beb28cb3360811d6e9acc926693a7da2976e43d3db369", - "6bb814542719c929700f64286ee237c92e7ab868344f22080a794766c1e93482", - "255f8551d83e2013f4f808a8aaa4b2110f89b27a47236b650517867d78ebe855", - "c37113b7fc6aa18c6f7d5d1ccfeca1ea83b5e38a1b5cd8c5a5e6477cb1b6724c", - "79112f7220b992a11a06e381e3af86148790a10cac1329a4f225cf1e97e9b835", - "ed2a04bf4eb0fa54ab4721daadc7addb68494f2f910cd33c71f10863833b9432", - "9e8e295c1e7af7e4437ec4f7651cc6287cc2e75788f899dd9e47ec11ecc50649", - "5737f47f3b74eb55818f4dc4be6180747ebc5ff58a469ffa28c390bcf4b3b6fc", - "2fe0393bdab8b3d0202dacec3a6776f7ee9892916031e6c918569eba6c795380", - "6359f7c1b31160653a25581785c26a600f2577ac610528f04d499984e8fda41e", - "a8cc35cc2d6fcda8b5305cfb3b60d68f2c7298f2607776746440fcb7a2c333c9", - "c63bcf4e83a3bf1b8cfcca4181b9ba7026e2690eca7155d95480bf76a8ff3faa", - "ee9deac05163bc92ece51d41ec8d280e12afdcfe65c3bc86c75d004ac22ab4b5", - "f568d1eb016b1265337ce9def72f2e81d8379152dd481d93ba34dee165f96ec1", - "b5a110efc870e6b17b5757fe4824976ef858821bfa80c5a6db0e4529e5b3d57b", - "19eb6a9cd21a8139ee8f7f1c6306e8745281af3de444a4e2f995ff4d5d42416f", - "f43afb7113972c0fcbf8bfe54e1c6a98c6f234f23cf7d143ce22bff4a90c3ee2", - "f64075f132d309c55fdf2459046210e27fc2e2daaf26caae0b497dc7fed5add0", - "8ed89f63c04a60fac5060bde597aecef1b8d4d39f9dfaba75ff9565efcd2f988", - "4badcacecd9d405245795eb80bb4785b3ac74369e24f2b8de02474e0fbcad3f7", - "9ab7d431c22da9eadbf7640f0b820093ff91583aa9d0109d1ff5c11b1e8508ec", - "cc5eb6edac84f49b58f93614d977967fadbbcabf08c6fae41e8be66dbb547379", - "8f48a9560654abb328fc4373577328de927a3bd28c144d6e4230698bacfeae74", - "001aa086671fe7d576dba6ce83009303d5f8d9bfb7b4669238415003b9039711", - "52d890fbb615228781a7a620212d779b190cb3e7a683523ed12d237ef19e374f", - "186a523975e035c2f6f2ba04bbdfc2cfc44b6aa26fc80c89e05f777c673b1777", - "25f45dfe8ad85ca9e009dc3160dadaf1b42c74afa68c83476719b6db61e025c4", - "ff91120ff4174641c40fb7fc28d63557a45e8540f9fb38e7fb8b33c530090391", - "13d668055c8a315dd37e0a4f1480a57703b424f0ff15b99ef15b735389f21760", - "c77b888499431f3825a4c7e5fba226e4597a4ef4fdafeeb2386c200acce15a24", - "aa7bd27dff625796acb2a51f620cc6a93cf5796e4c7bf98765f284c57020e9f2", - "ffbc265a7f9099c7b5111f49192ac6889c819b8d177b317c5191f8799260852e", - "584ec21ba3c041c1f489b8e7f440178addf1c57b85fb4d9606ee75f6df80ca57", - "a8b3ffd887c1a4486a3a661d0d3606d79ce34990a98e551ad6f412026efee520", - "4cf1537be57efd1f77cd58c1f3ffe8223b865fecbd6a226ee475aaa8522039ff", - "bb69f866c40794be4096e4c6ff73656ed2b70a934397fec3481dabd7b89c1d88", - "63b0e083e699085def8c517f4ad9289bc2491cf4bab9ca0686f0ef906b9fb859", - "b6a7676562c2c0afddb4295f06382a2ba8d564bdd0617ff52a0ae1938bd48212", - "625e6bdccee51d22ac6ea09225375dd79b5c7f4f1d828c529195f838d04f9319", - "79c7d96f8b8f68bc23a1ef3a8cb8942b7d752a2097cebbc241bbe15c2dce0c59", - "60020a7abc6a0ce67825c6bc38849ffee28301b100a6febc479212dde01a08c4", - "5870665c7dfdb198db8a1a4c9f2e30fcecbaffc9c69957395ae17370087a1093", - "b395c9e9bea0dc1a5532a436e845db34027f60ca5067c37e5ce23bb1442705b5", - "ef708a5e655defca41b6c668649d6e134d8a2e7b86f6d63e42bc49298b4c58b4", - "733e324dc3594836d249f7c97662b75617cc7128a4b51abbc15c62283820ab45", - "f39fc71fd1e9003143ac98dc5462f5bca9059a930e3d6988037cf065666ed1d9", - "4ef0078fe3965b3ecf488f87414d212d9b3442f2de519268651201832a2b706b", - "ef44ea2a41499585b4c9321a598edce74ea9230af4e4f06c3b4200a9141f6418", - "8fca835b096c45d2061fee26927957103d8848ee9e6fae6968b1060cf15a5d34", - "887b69c157e93fdd697bf2d77733bf1fcb403703ed5702f7619f1b53dc70c314", - "0bcb095d1e1c80693425d8ef9cc887a99ac37cc94620995fac029e3fa4475c2c", - "393cec25431ce6e0620983c4ae8f9b316065c944d02b11e852442b0e33b27cf1", - "a039e629b6a67b03b2f1a2d39b03b102bce97e938c1ae894a22b8d505b42d3cb", - "bba5f669515df15b6fbdd2b6cf16cbf5a43a6b77b0122e78fc0f660e7df788c5", - "935f27d35c03014362d1ce2a4c8e362ba553dcbd6da9373a19e3c56b5f5d4ce4", - "fe5a2f5a06c5c087799ce7edbbed7cf5b83bd0354e3a539a05af4d806cc9e115", - "89d41c2227810f3125eaba4a1f9d492bc94909e19d66fd7f80feb2f75909f558", - "adf1cc39091f045cefae7adbbe47c393b7dd63c8c3c7d00f8e84b2d290b24ca8", - "e852e139450961ba5fb27e29091feb5e5388d3240a3de8e300f83e06d4cb8430", - "511528f2127cc90b288c5df1d9eac6e21a6a3a68974ddc2c592b104014120ac4", - "13961dd1c3633fc1b32af68a259688db1001422c2b26f6243eb0d7336d5e4413", - "ce968e343b9430d84a8cacd288958a54e8330a0edee944c3802eed8eac075d44", - "531432b9382209c6fca611b530670e6738fd300cf1b898f1d349e24390d2bf60", - "37905bada8861e4e49ee69753c48d065c49170091b17d9d2c55171aa696b4833", - "448caed33f407d607ce77d8b03dc31eb5397c33de6da66289844cef6087e78fd", - "e37bf3db547de328cb938609f7babc79041b2e5a3d86409c522785f81cf4c4e7", - "c8f7fbe9c40172fa31ffc39068ecd0ba863da5efa295cbf71424efa9186fcc5a", - "0c4ffb1f26eb0e4c74828b0e5ad838de3972241ad46509e6aa6983d943007b69", - "2a8b0e1d584dcd56216b8213a83608f4635d6a66382884900d607066de75c6ac", - "ae712b4674f5d912e9151bd08c0ff02f852686f94bac7c9a54946127cd3cd914", - "8e22545a5eee392bbec77bb0b66d3ce07719207462c3d29fd5736ffe6e75a602", - "3e154b19b05720827a3c72003e8c0bf572e92d1196705d7744c72cb8cc7f91d9", - "9df05a0bb4814956ab5e730533e4fb615310b826d6642d841818dc775bb29451", - "727f8a1d77312c90b498e3a1e75be97cecd776b89666905199dc0bb1f5e82253", - "f5f1162451b01913bcfe4976531531a2a4cffb387c4afcd4bd27043f8c121e3c", - "be56d8b022ef3c20fa6402c0628f05fec408c10723adee433f737ee1a94750d5", - "a62014c25f0fe32e5aa2ad2a2b8b94002ae8137f52f70905172ec4ab2ee2cd09", - "921faceb9ddf6e73c24847156d82927e24964deae4ae7abb33394b144459b3c9", - "d1d0ab9690f180833724cadc303e1673a2a021ec8e01494c1701c196eae23d28", - "ad09f854bad5c260b7a96ef5184ba9949fd3acffb4bf5ffd1ba74c2fc3ad6762", - "a7234afb5b9fbe41d395c44ec175a1a329e43af2b65179bcd028d50346f4bd24", - "4e96101adf8ec4d98cd413146f044ea4ffe34ac89f2c7249759c969c2c9d78d2", - "25d3db396530cacff359f1ade7d107affd36c85310adbe3342d5d3ca601132d9", - "4f2502d266c80e7929b339cc1887daba5bbe2e7840b97e6d64f37652b3683eba", - "f025c87e3b768ab4836472c23e75b1a3859ad293dea0394ed75294411a615708", - "b8a97dd8797254591597d1bb5b7b3903cf23f4f79c3afbe88fba920ad96580aa", - "d2d24cf9127e4c4cbe6caf6aca6a1bf2b51b2c34ecab676ee11e65930a7c2d10", - "7e00a827eb87eccdb1893e8caa42bde593c4885236c06f1e1ff5e5f893ff8790", - "eb91711be39ecde8ad865bc0dee913b4bda4dc2ca4d3da0d989f3d49119fc106", - "b1a5c318269359264ba0c18cba1d154dbe8ebf2e129219d025de33858a0d31b9", - "546a2fb6d4045eb203e2a7ed7a5391abd4c90fdfb0d0824e6e61f8a4f3dd8899", - "d61f0051b7b1278245896c086d422ba69d5b94aef81e73d0dd553ff17b4037a8", - "a2fb275bb1408b235b8263702a0ac5c5b537a9d478adfd9f177fa041eb201a76", - "7e5bf10c74c9de7fb9ef456930f53c0aa5885219472cb57965609d61cb0aa7d8", - "11103871456745c82737ad1701aec7578cd8f2306073c9da63fac4e323510328", - "69d5fc4f069bdc42be8af47c757867568edda92a2ab8a884b0cdf373f9e2c21e", - "334220d133e76da1989d1e23f46f09571233352f19da65909a1c95830da2b2f9", - "69aad69b0fe6d818b868b0604261e90df72ea4ed04daf32703737dda2bc07629", - "65c0948d39c983262dfba0e8ab8a579890b97fbe4078331b216b1749cd649b7a", - "1651ca907f02939fb8237ddfef404f2e7a5f7d0e0469b3c0b9f4f0c72bc75969", - "5050e0a7da93a3efb62646fac8c4a48cb715cafbd940e214504c2397041bf762", - "d384368d2aafee216b0d7f1a86f8c89cc85a1f044694e5d401bc35e98342153f", - "311546368c032908d28051eb52552099e724f905b43ce7a0c9591b467d5bfc16", - "0b1a9a5f105bc22bd44fe4375cb1deab4516632513cc6fd7fc4df994b8cde9d7", - "22d28567b1181d30de7660cc950738a519e3dbb47791eb58694c4dcdb2e353c5", - "906109d1d9dedee6e653de9f7ba9cebe660990ccaee105b2fc435c11688e736f", - "3a6e33534850023e86111d30487805022565f83d0b10d2f38698aa0c09577e31", - "00aa3d9d1d9c9a4c03e118f20589dfd38e30e466c55e11b7428d33f2e59cddfd", - "161d76c2ac1c6205e204dcabe7d067518f772849b3e146cdb7aa0b297793d1da", - "3207f3444aa050e5c265916389ba26bb11000605c0cac646ecb3955ad3cf658c", - "fc5bf41ff7939726b537a2c1bf8643cfe5361c02f43ba66b3519c51a3219d1ff", - "fde788bf1cb35320e70636a706b66ecc7cd5dad8ec4cd4c1031c9648ec3f3352", - "1a26403d136f11353db1af7cb3e177952c695dc9653c4716387c8f0f54161f1e", - "68eb31c7bbdeea8959c567c74afcd851719bf70eb3bf14af972eb10861416696", - "878443421760a6b08fc714fb3a5645a007655acbfd81e1a2758aaa22a5605d36", - "fe492730dde561e60ae1ca6ade7b609bfa7d98dfb92c5b4f8198841f473bf538", - "faaf630b960840ed4b5a85f4e29348bccc0b8faf79b5eaac126d7c303a3b0b81", - "eac4e669f7e4144854bd9c7ec583b14c192b26d127474ef537c6e82aa315dbfd", - "7462bc87f8f8dafcb6c9a14f8c917f2a99ff57df654c7c84b357e247bf017e49", - "63e986db68d03008de1826b505f52983e0ab60cfb02abc921ff163d23c03a7c1", - "c669ac6e438e0cf17d4d3b0601c2911e5049680264617edae6ce5b37fb4b44e3", - "bb4fe059992b9dc5e17b874d0c8ea807ba761c72bcede8495b5561542854c394", - "d2e2a39dd9df09dfe7c7061ce06da7e9bd2818048739c8519bdeb346b996a657", - "1a03580a74854fd3caaed4395118c31af900f0bca924570336c54c2245562456", - "6d7f15b82ff50ba284000560da5caa64e27fac8984dee76d5472e21d1d9b8f33", - "2c1b9b8d01a712e4c66a1411799a37100d633167822399f8481ae1b164b5e22c", - "b13910e0d556c7a26e90e3f0878edb73f3549a704ac2ae54ac3e8830fe59120e", - "f0414b9a737339f348d72990c06b1d5f75bde1a3e051a0ac30dbc4755bdbb7ae", - "b6f9d69d82ffa3094ace15d625f2a0943c8f20c203089e51315015668405fc19", - "038c1ffbc0d70a420db49296fd37f6cd3ae417238b00dbc7dddcd745a1bf1cda", - "9b287499fb6b2f7893482557540323b7f1d1806547a575cea5a3a0e6e3274961", - "38529c286fdf699b8108deb6f2f0da8495d0f43127b5e1861ba0ca40eba6f1b6", - "fb6e7af6779780c45881480a88b23d6053f9bb5f52bc0bf1a1b0b49610c0ff38", - "211937e07be21e29e32c95e68da0f2081dab67be3736b3bc37197200df6783dc", - "76678b932f572cf96f00dedbf5c6206b083c35ae60156c711b3e191b70b6610b", - "80d96d2eb884fb5b530921611f811ee5d345361e61b7c3d5e923c0f40586db9a", - "4b6d844bf0322e5c945d873bc077d15ef78b5069dfdb102ca6dd628af4245171", - "12e02176b5358a61e5d7947ff44fabc31d797401217066d2318104e989e82668", - "899613227d85dcb5f0c5e6dcdbd090839f9e72dfaca92b8d59dc601dbfadebc6", - "20425ea8b0a1f6bc9bffd540d0695284c82f354606558e3f170058688e9bcaff", - "22f707b363c3d53f00339abca83942c4aa29ece35ac5a76618e5a9787c62f580", - "ed906faa23e491354b45f1f2d4084e23183df875a56c9dbc4a23e4250cf7d8a3", - "05bb03e2461282d37f9d7e56569a07034f49e949267939401c5abddee19b4b88", - "d5de8b2fdb7ccaff2659cf823c96298bb46e82bcfca2624301439a472e59c0f0", - "9a8bc205ef4b4c370d2291b53cf06bd27e6f1e6d9a4b5926abb12639ae26b377", - "ff1bd1ee175cec53bcaf8025b4f9ba75676871b8361e8d5a77ff50de87c5caed", - "d7920106f1611bc0c2f6d3f98c5566ac7eac5f39a2b4ebbaa3b9f08e940e68b7", - "88a5ed485d867d0cf80cef07150af13fe8ae1b6225928a3aed34b9e5920848e2", - "a6979a923e33fef398c0c4c367209d27c46f4abc35ad092c6ca90526e6ce4206", - "19632f679e8eb9bf8f0d5fcd88779853e376da1ba60af9aae47962f870ed9bd4", - "318dfd72bac3b8f99983a791e1f4aa8498f7b466ddea97f0cb045f0971f9122c", - "af79aa81b980108f5cebcc66951306e5a4d18efa60156d38153e4dd0705ba58b", - "30b9ea09f5550b38ee6969c96ed3cb6b3613e6a23eb0847534a9eacfeb7b6605", - "c8d784cac83cb3803a8d5e7039e48183ea0401214cee8587d6213231cdc8430f", - "f1e2e900ae138eb26bd5b53de9e3863bbc226ba45191efd6a91f3a8ee1a6836e", - "aa1ea897c1cc835a0cb53e4a013e1b88c9447ae8cac2b1f7c70ab00680ef9e2e", - "fdd20818a6d27aa79c87a2b32bc5363a402b6569bbb089d481a0b1967408a9a2", - "aabdeb77796437741f95cc83a2ec4a4de76af61bdc832252c1c6ea6f105fe4e0", - "74aa1dc9485453f812f96fb9ecb60bcf962e2f2f92057bcab814e9f60a8b9b50", - "c6380b4b732db3bdebc4691f5ce97de1d7b34a0e5341a36b29fade7649d08092", - "03b0ff36bf66910f849699af8907620068096c7a464e0214e17276259c18ec40", - "97acaaa56a438e73b90792c715f2bef9b73dc7322ca086bf7f5bb56088c5f5b6", - "b0fa367546f746f4c08d0dc2e3657fa732cb32a65d5a327d6ebe7f1ce59ff604", - "473e9b45965fa0ac1c44964da97e6447c52207bf997e64dacae848dde0fab7a2", - "9515ddc5d2c5e12fd5a047a0552e93ee935fa73c96ecd0b1940a4ecbc0476f93", - "5dcb3db5a27f0b1782be9e44ab28fc633f5b2fef1a941a96eed4cf7c03d68780", - "6d61a9827e1cbe50308f6a0264581c6cf78e00a9de4bcdd059a4df77873fa36f", - "f120b228064b2b05664babd37debba6f67e8191f6c3a32c79f81f977d6d1f205", - "9198651d87e04ab47467e00f18086be7589742d381580c30092b22c44adb4cfb", - "29f2d9636a0fc77a290194ef8b49f75aca0731b47c79d2c083818ea2235aa0bf", - "473d1519530a988eada298052a7051592d9475bb42cb02db252e024206aba5c1", - "1dc84dd41cb8174e090ad3148e52d15ddc26f23da5e0e68cb7e957265e038071", - "c754b2351d4bb2a5da53b0859043869aeefd2402aa5ec6530837535854a7849b", - "634644483d446f43d871dd8ce7229111f0576e4ded95f4196a431a6e653c61b9", - "d0a9b01a770749fa4c33eb750ba09320d16dd37d72262f7e8c63d6190b32bd20", - "db52b1def9d0cc3556e535e3780ddebda3a829a780cf43da1fd1b27c087acff7", - "270d398f5f351944c399af9561a407daa6d290158f91276371af1cb928750254", - "7ef18df5503b832c9553409acf92efeb317bc93359ea503bd1e0518237948f5d", - "41ee86a347024375b8a3c7e21a31802e307456fe9d08b49d009625cf0b5d707f", - "94e2dad545e77d0f4219f8485430739a85df533957b0eb67a033a0b8ebe13f6b", - "328de07d3df5a96692ac5b07a8534c31f500855bbd1b8babb601dd4cdfb9cc11", - "689eba03020aa453fff5a07764823bf9bb9dc7cec21048eb01ef3a3d71b9c9e0", - "24453680d57b924f58ec6a2efaa929233c39e5d8a0aade525a8d4f8b60f676b5", - "0c5a4db0f2177f1724c020ee829386499689eb5e46e4c278412c69edb56c9a40", - "acefc34496c0bdb50e29e0551f3f4663861a01064959be624f49ea368f42184f", - "5d8a65edc967cacb53966f8ad19d9a71568744003f93e8e2036b464af56fbdcf", - "7276642d91a93f349dd59c279172f7f20fff46a991ac0c2ba2e00ed70b0fa631", - "eb32aab7c65f4ccbbf82f997bfa1333d4d4ada44959e0a7ee1d9d6893b4e0b4b", - "87d29ae6e310307f81d7d38e5a26f5235f71598f471e48862eef1f9c5911823c", - "7c3cd52f61f75cf319397cb5d5526f48bdbb6948d137711d2295c087debe51d4", - "e244e98b43e321cb605f4f814e4d9541a32ac7fe6f435ec4b57500fe15c7d5ec", - "e9186601c1ba4d3c9086c23ab47a5114e6324b6b1821c441fd9f322d37b3ac87", - "1b68f01f6ac481499f61aa2203f2786fc81297fee8463da2757f108e05506236", - "cff213eca84e57ae6976a2d13ada1a88516917c4b6f77ca2039482dedf39f76f", - "5936b9415f0884b5902519020fec21075588432cf57e3f43000c7c514b4dabc6", - "86da346c0dbd8b27e0b16781c697a964778246b9c31af109edcb75b8a064dcea", - "1e98dc3235c5354fce9a8229a3d6838c5701f026ec5b370fa5389c569ef5ce44", - "b1186b92c3094a84e5a5202a7df33c04cf14ec91f739f5ffdb8c8159f23e6bba", - "fffa2743e28a673ebc52e874acbe5d28d9ca67b235bc69dd5b8ab3e994397c1b", - "191376d3ecb852a2e38abf7f0070c78eea65212372e2bf1e289bc442c86c3eca", - "8eed3f15a7751df5d9df5ddaf8c96c9301aa30f4a5f92a1d2a62af84b06a32d9", - "f1388c6af000f05636ab663485c35370e64528179595df9e6d36e62bbbad2b30", - "bd02cac19e9c367f5c2a3a00b41cb380b3742d8b6c35f1ef80abb71c612a530c", - "a0a8b5dde6ea75a833c20da062e38a6b28a735fa767713897040717532f3add8", - "24ccc7434547509eb07644770a4f8fd110dca57f8150ef25f3b6377bf9e897d7", - "894249e30acfe8a551e112049944fe243b7317cb6a6fd4f712ff94359d5dbc9b", - "cdd1374dfb31eced9ed3482ed59b90ac098654f3ede96d211cc25de1c6b2cf89", - "f169a27ad9eb32c28c753104c483aa89716a2aefef65d952b9ed8152aa6c3362", - "1d293397e2a4adf2140e00eae92cf2d1e3fbe963353cd6ee8c435dd35324c6f6", - "13021674c089bc22bc11c35afc830bb27a53d6547dbeda1c41745e7cfa127aea", - "6ef66b5274c38a013fcbd0ce2cf1c1ef3bd9bbe32f62f2d46bb0c5da0d600cf7", - "ead6000bbb8e76489482fa98a48d00385edf7fe4f5a3b7343074f585ae7d0469", - "3a483cfe79fda4d6968ee1a487a8b5a70a55999cf1b29d17998d7379a7f921ab", - "ab425e7df198ca733a44279dd48dcd185e90cf1bebf2be8e7c58591d70022368", - "8eeb0845e90158f50d5ee36aabf326f3031cb2447faca33b246d6e162c0c18c1", - "c68ccf7ba2ebc9f7f6bfee30083361abf98acd9d0d73911312669b9c20b01f9a", - "2f452d9dadc334bcfad15330a8b11bb3e150e226718c17c6fdbabeb0c8b24bca", - "eccc057e9f2294af075738cae081ae00bfc48a4aecb14dc2b365cb915a7f1569", - "1d9354b015d85c3c1e8a121d9544cc3c8a8cf65051b249b62955b912c06b5f54", - "003f13e4f53e8ab3386e0e98af1fa0db8e88a7867be60ce55c1db54f4deed370", - "8d67a71e82e3f174e72810f0b5191119c0aeb720924a16fd27a10fecada0b161", - "1058c6372b3eb56d01b20239dadfe626b8ae2c0f1c8656faea7a6c9107c886e4", - "abf50b0dae484fd7d1487b4bb9a2984ac737234277124713bc6ee7c6d07f51e5", - "aa0a43097b36aa3b203e35ea82f6e8e34125471bcaf674785df893b1f0a14c2d", - "0a472750f810f317105a9d9186e74c2bbacee736bf3c48dd0aa772aee3ecd037", - "8c2171f2aa2b8f8303fe229d41be0943d1c6e4ed878681fc68ea0479e9b13e45", - "f63cbe5717924600989f5e1ecfcf5f22b62fde08512b66de43a419d560617d1b", - "e4b09401af7aea2a7cfca05dce76d1e14c3abbd085ec4eebbe7f5f29cd3829d3", - "c841081034919ef13866b5bcf3a0201a8aace3a10f51fafdd6a78d4a96cae1d4", - "a70d9e60806b585787f721440e1f78846108d0a8751d98066b6b620b7930fbab", - "804b82a43c990d2d234f9895d40bf963683427583519fa18f7c9dfc653dcbb9b", - "63304e7a62b1bcb259e878d304f45ce46c93b2beaafd615e5116affaafeaeb35", - "4adcbe2540524ec85ef1770dff1b8fe95e8175d97523b35c8f4c7dab0764bdea", - "563cd27f5e9ab3d5ff9573561f6de9c21fcab6ade441c66ffde787ce9fcdbcb6", - "98eff344ff931143885127135129cf54ef7eef2e259f2cb50b4214b24c87c022", - "745d1a449eeea055ce815f581d2fd872b0c8a2019d0df9e975ec8824dd704ade", - "6c1a992fc02d6cb76688e9803a4f58c95f6fc492f76f6e38e94d7055ece4e99e", - "7804630f925fa84799299468be893ef110637beea89252f82e73593fca21ccca", - "67f181592cb8d85485d9b7ada7329f77dbc7b3bd250ed1ca8d73afb067a7d1ae", - "b1509b67cf3c2c2e2f452723e372aae6ec3695c9da11420e65035209048446eb", - "c4ca0b78309f24e098e77da8c3496ebf8a0116ef258528c677b28466094aed85", - "d2ee118c52b2751fe3924db647ef65cd7ae836946884373a1d7f7ff6952b845c", - "1b8dee51ec9afc9e1f00da05c4b4faee00407bfd9db132b076e7552b5d0d2b65", - "568e4f83ee5977b25aa89430ccc460b2b5e55a4541f421b74b4efaa4667bd8b5", - "8fd863232052ed39759f1988c1d68925f95b65f72cb216c5cd6430327bbb8461", - "93e4eaeff234de823b03959dada014ca60fc37f1c7e5c80d3c5f11a64c611f01", - "c31ff93f20f59c31bd85c7c873cc908925cbe503fb6cb00fd8c1388df80598fa", - "f3e23f53b6a95b2bbc61e2d3f10cb086ad1e2f9cda171a51d3eee7d3c8a8b442", - "bf364a928cb5afc560b714db5dada595ce98975fe62b7fa62060f4c2b0071890", - "df6e96af2b340973c37d558f4963c9b25e389452b969bd1644c83b196b16b54e", - "86d9dcf497870a2950a55652b7b5df713b37da0be475ed74cb52ede29afdaca5", - "b1fa443c4e705791a4ff845617667f9827bcc15bb8c90102a4f4ebe39a3924d4", - "026a65cdf4b55ff58207b00460784aa70d307b217e2cdc74e9320aa80ca2c062", - "243e6bb03880527794ec8c7e20747cefcad1821f3f43f2dc85b6b1b60875c17e", - "0a6291527c0f9432ad40524cd6088f2602008918e590575a3bd229adffa349d7", - "c8856c06849636c542583cf50decd65962f49137edec2ab3ee9980a192c4a80e", - "8e5e3bc51520e0f0fdf74630d828f6bc391e0e4630f5ffafe557c0d6f5213cc7", - "065e3c0a24c8db94179199139e2a31e4d116145bc9d73eb246380540c316964d", - "869bb0895d92ed60da05237f2512e89672d6726642d0930ce22bb8f094e74e37", - "18f855c4dade5d24b7a08f90c2254ecbe806c4852ce1908da39a74d70c9d05a2", - "da435041a684adf7b7e7b8320be7658bdc60dd7af02510cd2ca91c283d096d64", - "5b54194d07620ba2623217153405630977e2028876359a96faffd465c0e14ba8", - "ac22e755623e83d38e56c83b7bda7b4c0ab7177c0c151abaf588a849bb6ae3f9", - "ebdd9d56b9f4826583a7d432a09376e79aa246b196c4d0f38fbed54f432247ab", - "b5e2a3c421da84ee1a9a7f32bf9b3c50b32d2c2fde1f909a00e939a29317b38f", - "02da81e3d6ded18bfb9add36716054ac3d8a157e5d89f6774afb98d03b9014f1", - "a8ccd13b90f38b28645656b88fbfc4649774ad5f57a7bda85426259fdc43651a", - "a87e9b47a6fce9abec10f8d0b844c855912383973be96fc66780b680f2aefb39", - "17579f4392427a4a5df04c4a2166617a8081b99c0032952dd561d1d49da6766d", - "bb147b3ca5bc062b68d66394c3b703a2688ab93390369c404f2927437db8729c", - "9701129a5ec04ad0d8944a6dd766eca2e529dcf4d142579b0ec18421598387dc", - "417fb4c0e09f1a0af50a8c1a9bfc6d5639aa71d2457b62bab2dfb11fb3cdc0cb", - "42ba2af4d12840609b7a7f47bf9ad8b99f30f72db9153886180c35eb61c2d3c4", - "692225088cca91d486478ea2abae249ba60238a181d7a43670d1b21831abaf4e", - "fb1e36c8765418e06496610cdbf7faf919a80e9f17273843f524216013ff9f47", - "8f6ff91ba3581457de185c183ee571a3705a24577f2a2b93992bbec470547014", - "3f23e0390fb9ab5074c70995df00ab7f9ecabe4b2ac6ddd7a9f9e201f909245c", - "0284ce215861526eb2ad02340fe5a5dbe8ce6b73836fa4b80b73e908c04f5b5f", - "7f47285433105e37c40c8f26857bffd8c1522b9d5d82277f4fb90b075a52f48f", - "c8330e7ba6674a8441b227324f0de6b850b7ceaeb91b27af11977751651e71e0", - "a05f4e85e9b23cafd5439cab5414c08cdeb67a20f63606b1e351b119bc91c77b", - "e7e32a7954e169ad087d083f9f08be5289688f46737c127a05a26a6053a94592", - "324794c237ab4195e813e8271beee9617d7e971236cfa822629e829136fa4c98", - "69aaa9851058b17f39d13fff9408b5b416efc7a8ecbd606837e707d0213f2266", - "c152e39a9d92dc7eb4b245e7674d4efe5ff7b46c8a93f54189432ee948ff948f", - "a12657f10f6957ae78df56bca4c835c58bb2d78b6d1aa702e67110217214f594", - "d97f7ec582e61047f770a1d095f75e168180a8b93ef6be39a18770c79ab9b07a", - "1d56a0984d98e9f44c62ea8b5868da4aa3906721c2759dcbc27975035d1cece5", - "3ff6badd7fc5d8099b7d32b398f9de416114060c2e00c96ed64f383a711f57ec", - "669ed1c4c3be476401338eacf6edf21e48c34812bbf85e4b7a28dc13c1ebc828", - "6ebb48df1805e1320bc8f0a1ccd9ec9f6b040a1e1e813f3d739e3c89e43518ab", - "994922de4800164f2e2dd693e608b7b7ee1e999524e41b9009df507075e4235f", - "417a6b5058339cccd9494c54d6fd90df2a1694c2e4c3d6c8b52a8b134b2dbc36", - "d81cd6a082a0c6dbad30034f5166e5e9248fee9b0e3be9a6dde3333d16e55fe4", - "5ae1dbc56187368e9f7ece0c12f4255516c04f93b7814f9b94e5027dd7c5f137", - "88c762cf97afffb8ccea967b84119045dd8d013eb68a2bb3d903ae793ac43a11", - "04ff74972a58885e2cccaafadf579c8cae1d5a8ef968c9be2f12ea670fdad8e7", - "5671167b31b789b213493bc2873bace7c9187382da90bb1afc98964ca06e8d7a", - "b9c721e287539fed243402d1b7014c5269b268813db5f41788f135b7c3231f00", - "04c8eaddcf582ebe394208b87d5a896175b5d0cc53b35d4077123efe245eddb8", - "672f7362f5164ba5487f359b763ad0b3134b8e18e072dfc05309e1b81e5c4dde", - "e984aa42f3cde7466c356daf28edb5f5e7e8479c5d972ca935596ce04ed2db4b", - "4068ba6d402d5c51328111ace693e6a51fbd03eb4bee6b118e42d48803a98d4e", - "7bc282852980a05826d99b611cb28671c32a7725fadb6ddb08320311b806f148", - "331a3075d0beb1fad3dde89fff463ca54a5a42511b171f466ae699a4cf4d945a", - "f686f23ff5861eae25611880df0a758501722f55a407b70da76cdf01b848b888", - "4ce71937e7eefb9c735f960dbc3c780ce95dca5a0445d8fbaf901180d1ddb883", - "a839c57d138098735590b1326a345a454110b54a4ebabca53a0246d784aa5098", - "58d68e8d1e5dcb99fc8991bed91106f855f10791dce401ed8ef53e5ad4425335", - "e64871a85b30cb928c0ed625bd56fa597f4e13a1c111a4a6beebf682c25ae51c", - "61b2b2be965ae21be5e9d687e1ddd22c333b1a5f2f19e3793000a261b58a76ac", - "ceee0dcac5aeded4015801f1dbb9282088714d158560c63a648a1fa6110852c2", - "50d2ad19f251206346c9701ea04de9e7ff7fa70d3221fefdf58fbb1d768057c7", - "43e5aa4ea270ff5f57db8602468b8d9540015d342e15544974329c4d22a961a9", - "c4e5c04205fa2316a1d585876de2de97c5aeb4834bc2065c1e99dc38feb2ccc0", - "3988dbde4c9df5f5e81e975600876ead0794c47200f7e1ece203288a3e149f7e", - "3769a26804ee4723300cfddba1602ab62e3854215bb9822740b4e22f29877268", - "d241906fb7f98e381cc91b2764e38dcfc25fbbbcafce9fa7ae59c6d385577a38", - "c24c85dc8aea6414792701a9e230f23f3216649f328c6f067d66e4565e4c4b64", - "0f0b88ea25c0c636df3c010a3cd0982698eac83d26fa8588216bba634b5b6e9e", - "1829f9efccee170217971a1b786f3987bb5058265804ce02058346966aff7939", - "09db59400b259163a5b76e13c0e1deab21a1ecf86c1d9101498c135c2c4ad607", - "cfdbc53f4aa86e5e062574a55619fd1e544f6d59fa4c8ec274b0f8ac5c214cde", - "d0a388ad34538ad8b910de14b4cae91441bf55ec7ab564c9ad17f98af9cd55aa", - "7b7010a91c50a7e22add803e4abafdce6a877d60bc6681809a20b0d5b94ee95a", - "83ec8115b25074872c434547620d378964170bd5656a363911b84976583980dd", - "e794b0dddaf3cddb007ed506fc19822ff39bbd7961599413701359046e1f21b9", - "435bf49ea888ade4f8f89befc4b016f60783f006b89187c642cd8a697cf9030a", - "810390ff35d5fa9852711db94bfdb62766f31fedd8c1547c04534dfc61c852b1", - "84e7814c37882d6aa3442e721f08fff77eebebc8b1f2b3dc65054a24dbe7601c", - "c79c29fef1d3ccbe8fcaf6dd84ba8c87ceafdcd25ce8d9765403bc71b6b136c3", - "55b166333590cd7ac8a5ca6b83b071456a38163b2bdf6424dd69084921198b45", - "9240d1040773b179c418cb761cde4da09cf22fbfcff06af660978609e3619226", - "c068bc52f3fb4ae6f63c80b2a8878c773877ca2c66bd07e878f3eaac9342c42a", - "9b448a6342da4dc861993e47a1dca527759fb6a1cb311d3875724f1d6a4e25e9", - "d8149aab711b51cd7b9eb2bf62ab7e2b688c053dee9cccd7d9e77f05c1fe80ca", - "ee70451506afeeae48127826ba46eda9fd512048932e61559e5443f00927e5dd", - "543ba0a747e8400c1bbf511ff1da7039ff2f0df261a131a76e7546da49472ef1", - "ed7e300fe94d69653759daaf2b8a4c9f7d3093e2ce9370897efe79bf17e8439e", - "b2e9dedfb0a5d6f43a7e8b4b48820249d1fceceb8bacc282915f8c870f29a1a3", - "0e2fdbea1b8c4d9cf4799c55d9f8fe39418a6573cedafd7af1d2000891232821", - "44869e3cfb9ff93ba16879594ef14ae724a2081d0117981ec4a5700132ac3fe9", - "23ba710b8fb5f6daf4a96abefb8441a74615fd39431037b136717dbea32ef4d5", - "842245460f96a6d72efbf7e380a3309705653c9419538e6624bc902236a8685d", - "9bc4e28439ee74ffb53a67c35ac35df6212f0f17a28f0d583d6ef7c5924f7f6e", - "d0ba4683352f59e5106aa765118d79158032e220e69cbf17d1ea52768bc1c0d5", - "6b1331a5eaddf19fae3fd04802c160b4cbff23e2bf61eac8d5b2ed1a155bb52f", - "9cb4d39bc69523ad49cad5c0f63785cbbb071eeb7c6cca61716256728b188ef2", - "42b504b8de535a2ac6dec6d670da9e00fb9df70e6b5dd541aec5b23377030393", - "df570350fea2e5d6a4628f9b62c7047dd8b55c55b683a2b78ef9d52db5292949", - "126bd76f754ae04616cb70957043531f1830f035365a4f08fed7fab1909def1e", - "77aa941c5954f781cffc106ced779c631df09f457f0d5c3948a246602eba1476", - "31b07a5b84e7d2530fa5fe9e35f47513d2ac23019ede09960698a379044d15bb", - "62539f4c1b5275159292e2197efeb947edf4b309a00030ab236f645bac8b49d3", - "5dc6c97c90ea16d88ecce6e3a4b18e31bec791f47faa2a8966ce1d2baaa98446", - "700009bf39f038fe9b84dd2aabaaa7cc754963088845c7de9e63ed04d34b57a0", - "bda92989aeccf6fd21a0b96ea400cc26d77135936f73e2628675995a846a0104", - "72528fc5c773395dfc37d94e9f2c9025a29db501bcbf8499c2b82b2ae5238c86", - "a1027d2c8adb93d7a77b7f7fccf08b5db0a33f9cef224f1223e07674dd5f5c1f", - "4619713f7abc8c8e030e8ca79cadeacd5ca0571302e13f69baf7c8616a80cc6b", - "335a9b7598f5c3951c21458581f82d198f13b26035263c7e230580ab0addba1c", - "6194f5d280bdc5c92ea6ff225a8514abe70351cd28cf29a6ec25947b9a41bea1", - "459f263ccf103e9c7fe9f7ada1702d782aa28a6afc8ae5b8672bb2f73cbb34fa", - "6f80af99ed1d0a69a5dba2643b05c09c3de6e8919c05d0c69b771a3c56c66cd7", - "30150579fc5af52cd50ed832b6de4c3facae24e86525012f5cbf911d9a05042d", - "8131d3d0cce93eadfd822ea53138d0c861deb252d7124c8846c64688e55529ce", - "8b38fd2814f5ee09d87233f65b933f334cfe03cb57a6368c6637b62b20af74f9", - "a956008f05ece03627e3a2866c375b6735962403d2668d59c6974e092441e235", - "bbda655ebe35c61c9e29c75ae41ddaf839a151586df39468fba3ba7c0add2de3", - "92c1f11959ac21a914b73f6f021af1d8e3adac78d53e60f39f95e1a76dc71ddf", - "55ed288eecb7e97f59b01ba89c44b70d65b1a5036b7c3dfd379a28d10093e978", - "d1a1cbd174825c1d32feacea00f5a6e2e860918c86d9ef603f4371fd5ece716a", - "ddfafd0f3d9a4d1fa34a553363c17bca0c1e44ddf51b54e457eaa1e0a6abc9b3", - "df38053a3837c19560bfc793186517a497b19d781934dac70471f7eec0647c3d", - "442203e4ab1cd7d821eb7e473de6604c4030a2aaa80531c9b409ab2530c4adb8", - "a255499876d573da3715c87a7a99a25e7e62627dd25d19dfc143749116062bf4", - "0e0ac2926becfc95147bd5abe6c4c098e4e5d8f8f81091161af0492b1f5daa8b", - "0a27d7e3aa7224b15ebd19036490af9c725da52db281925962e2d004368cc5c8", - "fd1d6ad4b172abcefdf8590e54760879ecc40ef35eb14276cb756257de7abc58", - "3c7ecac064f4ccd23d6560dce992443652060e3b428d57b2e140a93b8514ac6a", - "6fae3542f854010fa9be62970a50b4dcce53c34b1611e0dfa431381b98cab301", - "2a5e5bd3377cf00893b0e31f676e2304cf47484a10ee170a3e12359c734df8fe", - "340853213164db91ac50b38a93b695c7703d91bcae55c7f53112a41b0e5d1cb1", - "0d8ed7e1ecc80c78cb1898a3657acdc01ddee28c86bf51d17c6aee0fbe971a77", - "ad53d75ab5bbe11d4ca8fd60f1e043e775f1975e8ae3a24cf659f767ee3f34ba", - "c0143f64ff346744d73906b243cb2265dfabfc471c77a8634fb44f0f0af396be", - "33ff22845a3b7664efde00cf6e1b177cf97dc7986236b57d612abaa580854028", - "6729708a6c533f8f52c5bf3bee1c7e0695bebb499f2e6d8127aa679faae7e3ed", - "19aa982d4a329252d8d9f8068051f46b50fbdaca91f1aa5e9ac1b174f2a39fa0", - "b7c5c7266f6e6207d600ed2ac3a2f148beac96938df2859542ab41fa85804996", - "31476c38e0d2b0e9c8ab68a61df89af0b36f08fd756d0f66e5f367a44ed7506a", - "c141fa6201f5f969a58b41795241cb4b644bb2ed2085dbf6be93da47e1e99254", - "fced6e12e5aff1b1ec5fd7191b72daad42147a92235909305ae16c393229a4c6", - "e9cfee4c9cc090b2141090348643e336aa6d0846ea2e3f2fa93febd859cb6888", - "07fc04a287ff93735cedad6572132b459c3afd01095677f8471b37d43627624f", - "a845a258ed7031c6675f16a3362e7f8d247d15acb7166c2022af711480525518", - "deac75689b95ed5a462f771c02a6162a6124781949ec5740c7af0c81d0c7788c", - "c32d8b12323d8f48230069896353b583259af4ccee26f3857c1fef329734e349", - "578ff473cfb2a3fb18de304ab37e69324066fe1266108b72d805e28295814abb", - "ad540746c2c1434e2b98f6af3b2d21685ac2eed3adcdd4f69e6ac310b5f07ef9", - "c9549ffba2c5f34bd2e048f2b4000afa6ee8ab7bb78128d5c65c25479586d646", - "a0292b7c9d30ad82d848f7d84acdb85c722cfcc499f3f609a3520a3ab27bcb95", - "508038c33b7728be7cc85102de3d61cd2440ce39a23e736befb94854426159f0", - "630daec84848cb8af05e2db6be9808bd74c75b419ccb8fbb27eee8c4f1c24c48", - "dd6582de098b11e937e65809900797034f907ed6eb1fb4df173e38bbb107ffb5", - "8802a439549d513e70f2049d88fcd2ff696c91aa837546d14a07ce610d59b37f", - "b5f62700b107726ec6deacc2fc572804e60045050cbe3035d9b2f073b5b9f4b9", - "0505a2caf98c6c3148beb03e83e3f20afca422fe28b981ebbeafcbf586ac8f02", - "08fc203b7d8ce3474fb8f846a72a8a3513d009122e9271b39610b8895ef4d27d", - "31ba757f5dc2e1f3b9b83817e9a62538d4f05f05dae3dbecad2ee66abe92048a", - "5f5b63eb9d52b1a7727152196c78af947de4d4df44fa3acc6879c84de165e043", - "ce49cfd414d5b663ab28c5396201fb0b771c34664d3a6dcade9a12fbe45b66cc", - "a3fc53cd2d68af555332f8b4883871d883a8216e634866fd050c84c53f4ab4d3", - "7c0577ee88241da37ca4fd4d1b47f9c76f857cb7a5f35d2cff287a76fb241223", - "7675f06902c5963a57806e779edb7995b17b91cf20c109282012b288ffdae571", - "92d4d77bd74bdf93dbda549fa5dd93b27a6a137420aa23e28286c4040895f395", - "4536a9f661887c75fbeebec6186d0f22ff0482a4f64f26189234bb0b8e81b3fb", - "e3ba1219d50759b0632ebdba87816803455b877f303a6054469a1adfd85aa3b7", - "5fc64cc9805fb9775d46bc5101dcb0a68ebf1f80a4306d066b1bbf06ceaa9f05", - "74a3bac90ef9a1b69491fd20005cc77be75ba1ecc92d6113c7bae9e84a45047b", - "d29f9f519678b3af811fc356e15cb6559aee91806379e0928263156c5cd37d5b", - "690e46dc20ac0e020cda8be7c40d3b01aec1b474f1ef2935983c37ce1a33bb1c", - "ef5ed44a5605c242eeec2950068e65ec39119d5f9e07dc072a6f919aee0e3fff", - "145cdf7dfb1753a26defde545878e48c311cfa253de726b7c5dd6d1360f57e1f", - "25cab7d8c6cb11116ca952196b195bb7fd7c10b111c69ceef73549e74b017496", - "d0fb02d57ecc41af4f0978d934260a8f27657f39054ba84ee4f009a36dc4c01b", - "dbcb3e95711c9c01e8c0acc9a9e3c8c0be7b099828cea2d5a81029efbd8e68de", - "e89c839f79586c2659b724e31069c67371517f0b5697f73ee2b07cb58f3902fb", - "7a208b2760c033b67f3f0e54e55f58ea13cf812f907a310e6d958cf93313d77b", - "7989dc11a5d6b59f7d92587bb9873fd378fd9d22a1503460437f073e80957634", - "67cd3ea4a08f085ce37934076ab684be4bafc379a8478fb298ca64dfd5fb0499", - "0df35672148222309afc6da91f5b51645ba9ad492ccedc1df34c1795fcdd8ec3", - "694a9bc3281aa049518ea598f58f08d9c343ad1219943d2b99d49e7209c8c06f", - "135742d22288330340638e31262e7307854e7c741cf9df19531dff8d82abb555", - "072b6232c45379f195a30b1080d80efe1fbe096f8aca0162963ca76b0c8f76eb", - "e729d2bcc481d0430a5ee1be082817482453a4eccc9c74bcaf8f0d985bb3503e", - "7882cca85fc9eed305e73ffc9799bcd0c14bc37a71884d9f6c5d6711f01aaae4", - "e98dee08dd9d6721e38e593239f7c9bf3d95bec2522326df9e8a815cdc03500e", - "4ff199e77d94a57843e2c817ec9b8718bd53867df0e5d4165382868aafc5fc83", - "ac69e83f3d7081f388fcf9c33732a23fb144c73b952015a944919498334205b6", - "6d48f8904c6e6913d07aa6b69a8187149ba2bd5e4b0c2b3e4b1c0ae1f63446ce", - "7797d3b4fd0335bbbc36c04c6585c4a1d1b3e475dc72d30ccb27bf76e4366317", - "09cb7f1efc66d47c2ebfd5273197957fafebc29ba07f1c615914f52840ba6267", - "db7278aa3883946576cfd54412c3cfb7922bc7ab53169d3d026340d7eda17088", - "491109e2ba1331870d8fb421395a6623b0d259b33b75b0925253af1934fc1fc6", - "e5c2f4c89b1581e28826f2f1e0d733115f003464e0a5ab23600cf8740ee98b0a", - "ad51671b697fe30b91fbecc297df4707e8b25bc472c39eef8a1ade0125fa993a", - "33dacdb7230c57a20b1720dce87acd41eaf581be86b9ebab9f0bf4222319050a", - "d6445963c7c3d132573a079da224fbb0b9e41909f8a3be0a174820420491a6bb", - "9fd62e609cf8689df57a98b30d619e957948eba7f7fdf62f8b33b4c5353aa806", - "6fa58e6cb3dbc923f40c4cf80e367add32edde1e62430eeba717111b36bb5c92", - "a0045de5bc108eadddd9df403e40247ca79478bca1827665a84e74f087da60a4", - "8eda09dd25487904427eef5fefdc22d1c8989c5616c9ff6159b823b3bc9c853a", - "d56fb8f963cf8f2599133bfcef1fe4177c831f3de60e63f19666e5e96e1ec2b2", - "99543b00f062c9bfe4031958dd0efc7dc4f22f4dc0576e9d8f8813f74cdb12d5", - "2471a488eb69370202e657bec4ac825ed177d778f45c2422483cfc28f5c3db4a", - "6430e739bc2020a48dad2a632ce512653dccb0a63cb017b226b6d4848acde008", - "2a1d43ed121e473c74fec7cdb9e969b0daaa36233f2c7192c38b21f578fe6de0", - "568dd7e56c18abb3c435693a29a3d5787a937d5c70bd43ee1484dee5c36c1cf1", - "ee8e9368dddefe7e31f965de525ad2f897b07e270b71bbf246432492b3f48ca0", - "33618a51463cdd28d5c053cb44ca309070f1e07380905701d1b05aff57fb2692", - "ded9226816f556e9b6abc7b1a011adf9912d842b376bb1bbd35bed404706f88b", - "08aa5e5be401af491fe84da1b058f065b33eababad0bce340ee8f48f8ed0622e", - "ee70a617b1a1360f4c3e5c5f9b6d9e55a0f283b149a4a810c199e66eed726701", - "f12180fb539fd50ba177a849fa8cf9ed1299f9cee304b9b1be97f194470a3511", - "5a4b948407fc0c897ccf801802c0bde6327102608a0c7ed0e94d26ab0b7f91b2", - "63ae188ea6d3d22926f2ac1bed650179fa1594a580875b89cc36ad992a7e750c", - "92ac73b292b104d09fa3cec75f722308833cd8b414be21fe27bcff685542e7a5", - "4d21031b094261f3677ff1540c261662cf8946e745639ac355b7e44f1ccc7c14", - "dfa950c5e797fc1895d1802ba493e95dec3d08b5cca4951e790dcf7fc78ab9f9", - "79955327094e99576959daa6f1e0947f09fd70f181f656d892bba05fbf8a54de", - "be4e67fb1fba2c5e66f61543f4f0cfffb792185f8679e24af0be83366a724e57", - "0acdaf04b20e2ef61ba2118f47cd77d388cf7bb15362d7c368689e8bcf338056", - "48444aed85a2f331303b01adedaff7123dac8573c354b0b639a3e79e82d1a98f", - "cb8b83f701d8360402e7a905838b86c3d0b79caca062624efc92ca3a2c0b196f", - "31309a45878af32a66e6d3762d777c0d28d4a430b55f3d774805a8078f26652a", - "1582a5ea59ebb15201e244cc409f916ae0b13137f0db65f328f182f5bcc2254d", - "e324fd7093d553c85b3cbc69c7886c116504da2dc839a0c62d62c5ea3ba839ed", - "1a0f2c458daddbcc6d7aaba814a29a2b093847d3016b3d14f59ea2629bcf2f47", - "ccc616161cc6ade6d0a98b4aab5f15e6c23877912d47e199b5fb6d2959fb1220", - "7aa3af7cbc0c03dd369766bfe317ab703b2eee26699c7d8f3b38f3927b0848b3", - "12e19d4c14c1613e9fc4f656eb85a55cfb10971bf0b4dfc76cbfbc192c7a75de", - "7785b0cea638902b6652aa8f5a984cb72fc92a98b6f3d1b23fae1e114fe81814", - "8536f570e3f9f269f133b37903597883b6ab77ee1cf4c1a58386725ae14c53ee", - "cdb6be5ec0c9050aaa366c7ef055b9262229c3e15f00fdc525112188b456d610", - "6b5486eee48d47766afafc5891377f1831d5a3d9bfb18df6c0b6838057786473", - "3c658510e5bc73c857c6cd8fd8962075af7cec1d3e9a0a015ba2902eabac5c8f", - "1b2eb247247d0ef64870175c4f1bd0ece2cd162477a2340860426fdde3e493f0", - "6b0d55d416f6290d165f3c6ee9c947a2c9a4f7a42204aaec50123c768867c8a5", - "b86a63d1be32a4de68e2419068a44f25d3df750ebf86a58816c5b1bfedaaf0a4", - "f3ae552eaf20452800b1cde5a4884d9985b5a84394575951c7674fa9c383a754", - "1f4d5a1b8401ed8c88570a51e62d1f23797cf70c27273458b943a67dfd32bc90", - "fa40acfaf114ac6de052e3a26a933be1df55f6120eed0a57a40bccd452a47eea", - "4880df9f4510602358e7b9f00f78a9972f141bc5770568705675c3baa23d70ab", - "cac8ca653279c8b739d0722bdd94944df20eaca75b74c367d20370b84884ade3", - "92ec63571c78843eebf074b1cf103052e886cecc75d0c132b8509a45f549e059", - "7d67c26e3ce13e0c340cb5ea0ecadd9434393897316070cf42c64714dade5c6b", - "53e79a2ec866bb3ac7a1fb36f78d39018342aa233a189ed84dc8c350f8a23937", - "d42dbb424a32add8f2343433949558eb7efa441b7b269c21115411185e4d4cb7", - "faa1d9adc53ccceb0ecf54beafdb9004584f3c31d1e188c75e179fdecbb279fa", - "925b5cf585e83789cd672822d2bef552e1ecfbc96c26c7e62a295dfaab37ae55", - "5da7ed678fa754447f713d382fc338e367627684bcd96fb506686ec79730e436", - "85ddf2311566045aa03118bb4005fad24f1843a46e1441344bba3f6375692f04", - "de96c4d2a7a9ec08cfc9249632cd78cd42be8b268388b817e30370a7a739e877", - "75348d1eac500bc84b1a85ec92d111629619f7547d6f7f04868ea4f84408c2e1", - "a63a753a0f5ff87f9bbb415ce6a91e6d749a1f466acbb578488584c3dd935526", - "77f6f47f319f2420fed04ba9b3b63aa3573e70ea91805de0f25fe7c002706546", - "f1ed4f664e6e1022841143a7a1e7f7142d25b6afd933af64d093c8143eed08ac", - "9a3a9bb3c32bd678a3219dcd2c797ae132b777151345ed90ac74e3609a225ec8", - "6776b3fa70ac5609b8cb94ec57781845fa2468e9e9a45ebaae26126044752f48", - "70824bdd67ad675fca717fe0a941c314a29cea2c17ca693131baff8c3f80d26d", - "79c1ba5e4a3c7a18b4c380eb8f83205c809237ea54b763787b60c5295e5d09cf", - "4badfd518a6ce8c09f68bf8e1adf05f262c03bf75e818e7b3889720c3e641090", - "c87d235b25aecc4163b34168c13ae490b71db30eccb34ca198700802f2a4fc6e", - "18386875441468b9be460e7536d9c0a371ecd303554bba54ba9f0ba2796bb0ae", - "2ee770bd087bebabef2f72b8be4d638f0884eacccf1752ae8c5c78201b823497", - "f8bc67408fae006ca26eb52ccdd2375a2803f9e906ce2ef8d6b81d72c201d065", - "4da52bac06ad4b9f06843bc4fbbf0741282c0b545f62840107d2152986af2975", - "0e40e3eb558a080b23e9ec35d7083a7dad0a3dd7cc7a6535335cafbf2fcf15dc", - "eef82173d04a8973101f82eee26f8b626acf4524491b2de23f93c68be70da46f", - "dc5ae2309a245088ccc270052da7aeea7a3f944ec74772bf1e1e9b34b3843403", - "48cd6fda82b610d22ab8d8e6c31599163d3ecc39ab44762ab43533ccbfdf3e8c", - "db7f9b964ea3ce11ec3eb4bc86bd38adeb7d42fbea5366a83f5a808510aa7f9c", - "40ba3faf8ca856174194b8d2d05147897311692de36d68973bef8535536f7e16", - "6cbb715e81b61171c838b9ca4f10660a31587f1d3bcc91c059dcb2cf9a7ebd7e", - "e203432aa39909381a8759f9588ab7f4e3c6a74e29ab56733d93c338e21a7e95", - "5282156578aa55659cb2c767fa8ebdc62895424c4c1dccb4b03af3dbb692a922", - "2d99cc33e55100ab11b9474aad27ea27f8a3346034f773d484367bfe88c5bf51", - "91ab4409fe2f6453c5d1b3d95132ceb1fab30feb7380927fec01f826f8200545", - "11b597e4e373efa5262d243b21776af60cca0c54540df43b142b130452eb7305", - "04ef262bd7ec8816e9cd038cb1d5a175b0f9bb6e881e2eff018115d8bff149e6", - "7372b206d764fe38f7bea02d5a1a1bb3863ddb895b68724f3f0f674167500fcc", - "b1ea0417fecc46aa8f90756a857d9bde5acdb0795026f2964b2f4d55c1ed7292", - "df2254fc3d583cc50e71f19b2d51f19e53317e5f3f669e59486689382e3f0473", - "73203e99be66c406af4bd6bbd1f8035619be0236fd06276a9756351dbad642dc", - "b74ccb96038278c1502cfd84e7e2b5cdbe4446d22d7ec7feea3bcc42f35f4f88", - "8e6b5229a9e284ab289153232f5a2b12a95979c565e22da40e55f519bbf11fbd", - "1468f079b04135b4b70ed04bd0b40ba7484ff2413c137967e770092039f0ec6b", - "92be1160307cd15b05741427f001ad71e15a2e530b2ae23b16be662f85e889e8", - "ae0bbac6fb5e3b6c2936f8ed4d96e9467d6a0e78db5d5bebcd7fcb9f18cfd28e", - "11f1c85e2381f3d097dc8a05c7e4110e9d01e492370b816b5d504e8a23b97394", - "ceda32e6e3299c8b25c8bd61e57530eca691d404c983fda301ff006f196292ca", - "deedd021aea9fb767de7494e591498137fdf5b0ca8537da6c71465a4e7dd5711", - "aeb30b15f30e1c00c16e4a9611d9f33acdeb419f7ab93dbe296a0a406f166419", - "c56cafc8ede215b4adcd77c1691d5ee19a0e17acaeba3e258ee82f73b142e533", - "d38ce5190ace658db2628c5d4f719caff23795dade59d12ea500712af4f92403", - "9900e45e1408face3ee8e7a7e5e800a4f137e5c5a5a013ca3dc5a1aee67e1f0a", - "b0a4efc2a45766d647ddf7f3436a716aebce711d9438dce6ae520fc95b53c5bc", - "791bbd22842747b9d57fe6f16eda59ae6480aa4779e6653314f10438e8253314", - "b85dbb65c5fc5f75ce9ecfb58c56ac6361cfa7f665aaa87775ca7877e302e89c", - "19091453bd15d5e2dfdb57c2a49dbd98adf15540fabde8df8d93502d420dc2df", - "7ab5bce201c2e2388dfa62c413d0c3109d995ecb8e628a65dca2b36a9a432725", - "d1f6ec99ad98500f7ed6a3b530b6446ec8ece6abc1e66ef3c26133afd28bc40e", - "29c147acfc0c48b7b5d395571bb2c55486be4e23e4a8787cac410e5291c01351", - "feacd89f5de28c1ac5e982bea694fbf7c70675fa5c5b32f0de2444339ab602f3", - "d8ac22ec515cf93c5cc564ad2e2f45b508840946bd4f79ddac2876f8f64cadcf", - "6998bee07109b8d82536d9dda5fd5def4212fb6b58c78ade4514d53fca9ee3c6", - "f5861b525cfd65a8b8983177414d81c2822dab28fb1ac835d7e35a2b9342b1c4", - "9f7228eaa9de51ea2afe3464fbb8d743f16dcc5abe6c0a03c0ad1dd818dbbfe5", - "f865ed4a124c43ae9f582f07828e2e7275a69678fe7a60bd3924cef0859ad040", - "ac72baa0b39b6e86d7693cee7561283f2ba712571dddc7a611bb41dab2a270d3", - "814fd31f9c44c992d847c6cf98190239ef32f17c74b4543f6e3ac23889c9f663", - "690e616a7023c1bd33b29d0bdc6729634fea45f733710bb406a2de251d385b9a", - "e1ff6b3ca6215da57b03335a5d375615b5cc48c935d0869a647a52779346c9b0", - "a7e7794fc85d7bbf7f0e4d0618638c6b2700582ce1cc00ac1b7e9717fbbc35b6", - "c6845199a595c146917c172fb1bab8b0e9520d2a3df74c4b16bea3e873e6206a", - "8ad2a02513d6b7ab43f76ef14d418fc9a32a4554c5f895a5e767ba51c070bbf5", - "59640268ccb98f1dd52662557572e57f069add05450c47ec201d1ec37fd5616f", - "4b6068e335699932780ef826a227bf9ac06d35ca69d53c3e18d031775086a882", - "eeecc926e0548f16f703cf6116802affe9eeb3cc06d2e5e99ed589cf87409f19", - "4268b33dccf1f88df2f523c394c221ed74fdc129483914165c2aeba9280407ec", - "c5dc3a3d4cb0d1081afd5d20d517b70f5df94141dab961adabc1d74876397893", - "7809ff3c65dac2816668c3f8d53fce59615ea0944cb47af0fbb658cb25e730d7", - "b86bfb37355afedbc03bd564b5b76ca4b3fc4ae3a4a2842253fa775d73da5676", - "cac95211c015ccb44e138a073ce8a85b358e1de91c639ffc2b353bef7aa049dd", - "b989c44490f51ec34df0fa5a3a3d495dfe6394313d335ce2d72be68bcea797b5", - "ba74f739c939c29864b95367b7d4661370bc1acb45d3fec8334ce7b77e5183a9", - "5bdca2576b01d998cdbe8a3d98c6fa82bd30e71490b15cfb3d107bdc3c6dc61c", - "dc0c2699bb180513bca58fe8757b2f409f86117cc8e2b90b498657a11803e1ca", - "d1df5deb52c5889e59f5804e868854668297d39ced6fb54cc631484b5656aab9", - "5e3604a917ffa9e8ad4dcde0d27da67ad1dab8316955a132a7d093f61f1ce54b", - "c69975ade8c7fd65d45bfe920782aca63ddc2c5579c588dc6634ee9933995e42", - "aaf288d244335fd986173c67e31400807e7b508f07146f0af51f21c1e595c575", - "fd40bca5d6e7750e7251cae1b4930ba0a61eebaf66811f9dde776e50c5881b69", - "af1c6f8157b8fee2d18f46986ce3bb8c538691ac446b4388b51bff1c85a95c34", - "245960bcc6ef6d401002e005d79d18e124827a016e7e4114f02d9f6d13d6ea87", - "e5945821a4ae8b6359e6d3733808d36fd1d5d99130dc35f49f9a60413dcd9548", - "c7b8da8bde2ef7766173e3ef5efa57fc584d74a76576d475f4b80235cc428ebc", - "bea1a99b14ad0f9185ee378d0d0c09bebd893faa3af80f8419a01096886abd3f", - "4cb576fc564ac33e09413e94c8b910d8f22812e8708694fb632fd2078a52f99a", - "43e7ef64196fa5df31fbc777d0f2924c5c43d01a8fd349c281323f63d47189ac", - "0b16e9ebdba231fffe84ff16e8ccf2e6e16f5815ecf967e477a6bffadf5c9964", - "b1db198477dd72b937fdf21d3e05c16a1dda300956f450f0848714950f8efb98", - "c74750223602597b19cb2f6b2397196e5987656cf5e04d1069b24cfaccc24968", - "9223082c2a1db972bad3034c2a153d903d40f86119dcc6662564bef414c72733", - "50ef28e04e22b9b7f1523bedafc646001f5ba5259229d24d3babfa085bf12791", - "a6e49504bd710369aa00baff891fdfe06fbd22799529df4b66c1c08ad1e438c8", - "577cb98687ad55f6fa3d9083a7facb614934a9066c9724413c3098e8b36c5a61", - "33d53ccf6fbad97ec509814264437abc851655fe4c7e56c935601eac89c13b61", - "5e3b0a7c767ed359db95123be1be7c9278a3133fa14f91d974c27284afc3eb39", - "170ba07b55258e47ec8f1c78ce251f346f5c8290a7160632f8b04122c821ab7d", - "89a554c2db25c6cbc55d2cd0094e87ac96182a7373e0a3af08b484f6bd396709", - "a5dee2c7916af48b054bb56ca4e1f10f317b8926c061e689b6c08056da4b1d02", - "757e99993ac1c03c4564e4262b4861cbafb9d46b0c614eaf1df270d417f5c719", - "489391c0b0c274f5172c7114427e5ec8cfd31b41f67a24639c806f5a42200dd9", - "7a2c58d8db4a65b89c7817cef95b6c55cf07e3295c2b8bc0b8f9748b590e6acd", - "9a25bca10e0b60f461aaa16125e7a3dd3f6152c931f84b4d8c2bf5143fcd4047", - "dade9fd3a7fe339c4cb2b4f13ca3cc9eb3cb8d512d31a89f7a92a20c97e7eaa0", - "2bf8df9c88dbdb81bac942ce8896bfb8bd81bcd9bc8d422a95450ec83df08cfc", - "856ac2faa9582766c0d177837ecf3c5fd7a0c79146c46b8d200fc00a5cbd4bc5", - "32523c1b1f432c3a4a1284b064725342c8231fed4311e64e55aa72a6ea20cf62", - "8218422ea2bc8a997ca93eae0fd8f62cdb6f664fe657425f742ee290e5f87e0b", - "3292a6b6d8d865eb0cb52a8dea0f04857235815d602d1216c0471dc90451fa98", - "92200aa9de8eb70285c33023e92424a992c5eb8d17f509e5130041b105d0e284", - "41c5ef38b6a1516a94216f5e4219a0a593493d924a3a6f35848310d12ef67f49", - "04d07dddabe6e7012a5a41443136402ed9933ac9adbb44bee9c54a400f383d78", - "251e10a247383120d5a43e85e588046030170d329b9b262fc84b99ce0652441d", - "b84cb6b10d3191b3b877e7d64e3be173d1f7045f86b5036c2bdeaf6813975d51", - "2e0d37ebabe53386647439c858fdcd17f51a4d43a54a878a10ca4871499dcb17", - "24ba43c191fd4ee39bbe550319eeb6417e51a1694334f726a137cddc55915d00", - "de7504d080d475518de4cb401010bb5a1609385ae0ac50309f0f76ec24ad3dca", - "6d761204623d073a78621b12c206f7031486af2f343e235445b67ff5c681b2cc", - "c565f9c9c9f4abcc620b695cbd49162e5e9171a59faac4142fda4b9bf7a39683", - "7c3bda2a4cc7e4c3b9411cf0c104ff0548cb805da32d7b9e1925778d06b0f2a6", - "18bdd22968193dba939d8004001c12a9e1d26387d1ba70c1e2dd6ce5b4b4173c", - "516254ac443be9935912b696d685a8acd403249ec666a55370cfabc733a4840f", - "5f07633f3cebe4b60fdba8cf447b0838352c37fbd71dc3f76b217c59410121e6", - "23c6d7c9d083d9ae07cf0e3d252ab7b164e00e40dacd6cea026a91bd06d9cac3", - "bf54cdb9414965a55bc2b0055b819df5ffa0efc7a97dd3b34cc931712d85000c", - "248fa72958b7ebdac99fc61b62c8a24cc0ba8e8d716500be6e0b3879536c57d5", - "64028825312d95c0a65883db1ebd149251ed13e95a85bc7f69e9d453cc2c0b7a", - "c957550ec72301522175c947b0b00a1c99adf1ebeb730c977ccfdc42ad06548c", - "dbaa229e35c246d8875223a1a414c74497de74987ef703b9d4158d9b65344e30", - "99fd25b9932660c20d292b511ff6a05f98a4b74e06022b235f9162f66d13b2e4", - "961f2a9f23443d45da12fa8ac768a2d0c1aa230324ec832b2a819bbc0d414496", - "c29065464bcd43987dfcceeb78cd997f9412506b54a3c27fa13c9eb623cb9e2c", - "76eb26e8ed1765192496708ff4c462a6e6d247cec04dbcfc4d36f2a3e2f76466", - "db90631f430fce7bde3133076c5744972eb86d29345f557fc94ad385391ac975", - "03d5cec60d76112aa0cee079a8ae51399a4dc016044a457757ab146737da9f3d", - "565f7d9fc4dfe7c84269a2c53bfd990035f42cd0c87b075ad8df02a6edeeac56", - "4426d97cc533b3c0894374b2eb1970ed90d9d46f27f109c2847d73f839a5a0b3", - "86073e16c7071f2f5c1627bb14370ef9495992b1faeec332785cfc85630288aa", - "f5504cfbdb413955c94988940f862fafa5d5d78e0afaeebe8752ef075514b0d4", - "4e5ff7a3a33df37283cd3545cd3cbedd33ed3bbd685105d8b9ead448f3c23dfb", - "84a8420dec71bc04ed3c56673070586bcd6cce7758d4fbd07b2cf044c6f29217", - "e52a530a93d0f022a6b65a18176ba4849b499de13af9e8d99f4357dc891d814d", - "c863f64fc235eeb74a324776710a971956ce46c01d6f745b44af9ab0791e77a6", - "d9c6e87c8de8be0694948fe3cb9f74a009562e8b0ea2c8aea99c2b0615d61660", - "51ec20b00158c6c82e5c734d67ef411fb43d967077c7f97617ba17b94199abe4", - "efbe85bb6e07a48fefed24a7d3549d4036a80ae6cc5899316f497d119522d2ba", - "09599c930a4853aadf1399f29b542c3b3c5cf2d2beb50841b62d98fa91798b38", - "fc449f850633ed9d409fb35ade005cd7b892047bbcd3f7d7f70a762ba11f2043", - "e082bce5a94021e3cd360651806a29e54f5ad57402c348e748e3b75b5bfc35de", - "320ebf7620c3bcc673055df62fdcde50ea4d8b82224e6e1d94a95021bda377cc", - "f80a806d9145cec54a37bfdcd8609f095ae2e25af49bffa8e4408f4aae196a06", - "58037219507fc5ecd9ff9efd98d483555311516c43d87736a954eca6962c34b3", - "3a2513a30bdd7bab6c92356d7afca9ddcd6d9bad63b40cde6fcf92843edbe84b", - "82ad1a4f37713fea57b49bcb7c077c73277c73ff5a33999ab3e763688ecbf7ef", - "7d5383fe0d0295b1f69c10006f30d511346c0ab950bed5646c42360e9aa8e119", - "3c8b8d5a5043703b1d49447d5ee2c35a65cc2dacae66f0862dce77ba1439794c", - "743edcb2189a7f8b71c759adc1c0b8d03480c8a7be5ffedef8b7329578d49ed7", - "3b13df91932fb3add134cbee5ca316ae029d638dd900c8df464a61a65b37f5db", - "28c09083a317bb97c64445662431cec70f48a3d33da0193945a3963b3a10baf8", - "61b4cc408e7bf69885ebae8ab83cfb7262bf22af89fff6ab64c91ee49fff01c4", - "e12ec61d54c30e504b342d4abdcd905a78c0b75c168008dfbe45dc9c26d2afcf", - "c156b09684b5e317e53932670d485d8a45bf0a61fc407a1407de3a12ffee5caf", - "38b5030868c027dd20bbac667dcdbe1801f225d414469e1eaae7139624a97e4b", - "07a13dfcb0316295004bc3e46f656691a908d493c4088862571efa8cabef51af", - "cf3ca50e78892baa4541958b817688e0173faef3d87d545e2c985cf1a7b69228", - "ac4ba42f6608493be2e51654478a668a3dd77b90b7a5bd3b0f1066de15699a85", - "4cc8a43d08c92df87ac888f1e0e738838c17c974d00680e25731e3b67f9faf66", - "0bd992c1285e5606db6496860715d821624f9c40c381219c0798814f15213761", - "2ed007b4e928008a40e45f839b394e6544607ddc8f86f32de710363f314e60ed", - "7459c10d51f8acdb5043faaeab57dfd05560d1ed1ec9b19ed0b689ea60f853e6", - "5896791c30aa8357177785150eaac5b8bac0b390c86a8913ad50d342d9fb8a9d", - "c1cc4d318820731f8f0d8c607118ac5a0ad9ef782fb4b8b87045ea99a405e98f", - "aafcc308c0a3cf9d9440ede9f99043fa3b9a036d7ac76ab2ebfedb645cd812fe", - "dadbf3f084729651a6eb226612a01f861dfa8f012fa656d19ffafae626555605", - "494fdbe15d8bcea4e65c716c57d6332dbe43d283c332ffe2def91b52a3b18a29", - "d171d7cc9a2f63883f4d27b4837e873664336e4952a4985336efa00406769b48", - "27d39107a1140e69714a3958cfd907a9c905a56828cf7ffd4d2b82e3925a7ff8", - "e89c690a5f8af55eba9206161d01462b85034fcca84e38e324f12d903fa84098", - "5cca804ef1f353b8ab9627e9f95870a6513b467b5d4b2e07db8e21de77cb7db9", - "f399515b7909e063b171428d304c7f4c78ef13b40c048aaa41c7f18a201d7d73", - "b60acb0a51a964fbefbbb79b646e042f33d99681fefa51a96abf159426bf67bc", - "01858c7298b54b9ba85324377d107584343252a7e1d0add4e45da7df5de317d7", - "46ed4408c30bcc060e9d25990a14b682b3042e884529e5a8b47d64a88044955f", - "190da6543e758f6ad4d6138bc0272e9ec5a59b20f392876cd67232d80f3e7c5f", - "0911bb34a296c61804a8fc1406139a7f71ac79ecceafa87d5cd985549b50acc3", - "34e7c1f07fb6f749e14c29953aff8be50bbf02e03e1ffa0d4b398c453256d1a4", - "23ff69a634ba1dc8f12924c0ff7407ebf7f81288eb7926f5ac76deb4c7180d41", - "a9af9f78d35c6b673546eba061e48b51eb82a472570d0255c1f09531e445f945", - "2506210972887e584587274b63c11c3028f2b6243cec073de04cbda727eb5c4e", - "74f8adedc602858e850268e683bb10e7f81c0943a2df7fdb507aee47bf4fe944", - "b8580d1d08bc3eef8178e15c726f11a9cb2f077e553bc2d6ba38549cb0dcd24e", - "6e56015bb31da7b5787c08e7eac424ed5752645f72f1025848810f412cd66bf5", - "3fc334d0e7da0c55fa608f68476f05acda914fef2b419a27ba2db78e63921618", - "76698acde2b18524bb99dba6651f2f4ecdc8f80bea610fd27a736fe6fcd9e6bd", - "f5b731984ec4b2ea08852a0bc6b2ee4cdc7f739333e4c5daa079672dc7ea244e", - "03483b0769ee2f2db74f73167844fdc8b1e594c12f9769f4ca8af6980eb5bee5", - "2699a2cbc9dfafc14aa27ff4d99a15c75062e478ada3310e40d8fd16a244552a", - "6d4a04ff683cccab91455a830db360e673a4ea526a06e2a3c0e8a61cfcf39c10", - "1482ee217bff9dc4b96f39c3d0759da48df88c8bc570a165b484c1b199fb5ba2", - "c5147bf92155b93d3471a57a885bfb54b1193bc2af57d85e4f0d75a5df4ba6cd", - "7dd7b97ca4cd72c0280aab7d7ae78198ec7df62847826fa395de5d427327adc0", - "0f05c40b6325e78812d1218aea7aec394cd6bafdfd5d453eb66f49e606d2b4c3", - "96ead752459b3350e233aa01670b0099d05296ef1a0eca7d9ff81d4c81d62d85", - "aeb8dbb3a0a61728f8176b93d56a8609f222b32bd9144fb2a5e010521688ae7e", - "8fb32d4d7fb0d61bfee8be11cd45caf4bf99a9d55e29192099df1f21c268b758", - "e035d190e8ad3c2693ebe42c5ba14bb6aa383a92efd4c367601b594e139e4ffe", - "0d630db3b87cb16c4eef8f77f9cf000c0f7ca041b2f8b445e3b14cf8f346f5e7", - "7e5f4a3cc846a0e8e24ca452d0cec0e6963cd95cf68e7954d6b716ae3e924ac9", - "78f3f16469a89226828158d20161cc2f3e6d836bc3c69b85bef4211933ae8f25", - "21315a086f414bcd6a7ec34702d303b98e2b33a96a1ee38a2ffb9bd490d753a8", - "0fb6861b726dff5bb31a9c98f5818e5b93faa5029628fd9a534d4780b62f3c83", - "97c28e461bc14fbf5c9163e1d672c8cbf83d4fd16547f9fa6d34a5e110cd956a", - "2d38c32b27f9ad8bb1e43b4c445301d79c1113936b6d54481b2bc68f140a1439", - "9f509c4f80c3a945c6aefddce3e42a03eb41cf7c1f0b1794219e4535e04fd8e6", - "eb3e55e7a42e60124af1a82bb9425242983769daa169c15930b156ff22f720dd", - "0ef0e217b94bc6e382f2d24959200d25729d6818a6b2b2a38307a57786df195e", - "52134e83d7b49242d54183d18d2a0d64b22d82c5e32820f75b4ada4c4c832660", - "7528b870707a40a720f9e5bba69d7d9f07db178efb3d01f3534dc4617c67eb75", - "e2af091a0aaccd9e8121403821ece7aa91d46e01f8bb8c57ee4e967f635ab106", - "67d3d7d4256a3d1eb0ae34308ced36c3713e37afb30c29c2df0c3ed95f89f70b", - "2653de4162c55c2b8fc4cba7274cd6e6b3ad4fecc5695ee3c3dfcd03350bd23a", - "ccd02c32e46ed0d17bc984a0b2ad4e1e87b910ecabc17745437f08015261e5d4", - "7ce5f35399d4cf1bbcecfdffa21261fc60f0dbe2a6dd4495e3412c411ced753b", - "d540e7c3bf258aa079bf035af8c409aa19dd741ae86443ea18ada4c4dfa39917", - "43d31961c27e22cb350e4712f322924c9a3652c3c3145582eabaf8838b833de0", - "b2997a65fdcd6349936ccea2e871a4a56ff6f9c39ffaccbaea303454b05d35d3", - "dcd8e82f26eb587d5795399638cbecb412488a546001f5bcfbb8e571a6724619", - "fa58a93c5407cfe4c26190e7c3cff1e79eecc5bc022d5974ba95014806b9baf3", - "4d83dfc58b115b173de6c2c24d1dc9f97faf177ece4f8774dff0cf764ed14919", - "6229463953bb5a966bf2dbde76f7cd9051e08a7de77b8a40712ad137571eee34", - "70892692db51ca227ac26130416a5e1cd68c408da3bf06400785ef212a4ca630", - "9fb84aed2ac2f71ebc016cf3433a40a65c8d89223579a99155cc06b587bc350d", - "9db910ca24688b08a9becf5fa9231fee90594b0fc3702fe50b665cef5bdfe2f4", - "0062a7f9653c25086c82261fe41fcce0b6847e098c5f77819cfb7961ec50e864", - "06ad344147a10cd450ba3cf965705cf76be671ce580fc4a52d080bc79b19e34e", - "f5ddad8f4c2123eeaca30592394d2d4a462bbf71b54d7ad7906c8c499f6c61d9", - "5965ffdf0aa34f14aa1a57453b9885cab321b79f2719ba8b7b5d4d7391cb9e88", - "8ec2966be37ee985ffa76d41917a37575faa8b6c349971e4d78fee13e86d19a1", - "b2c54df0b2cd81ce3eb12b1ab034d7c3f570c8328978e5b3ff7fdbc82221af5f", - "f94aa4e3496098987f1a418f655b43793bc9aaf77b68a2d400bf1f79a61decab", - "46d84c88d82f792b917c25abc5e7b7d90869e8f19e5c1d5dbd64a627832298c1", - "7724b45bc2972815eb599875329bb74e8877a6ecd3540f09b962ce84c3225d03", - "0ebc2df0ec86ec3ac3e25c43b97f0a99c3c5bc141709c55c47a7b3f7274b921a", - "f09113ecbc285be1ff0da726e4ca8ca5a04e2548eafa01907e4fbf516da6a1da", - "f4461503a73a077b7680ba79c90c91428e3a6024222e68222a5f51973a2d6f08", - "ebc9fcca881d68e23290dbe1a8c2ed825ae124a8e7a94b2d3907ed8176868abe", - "98b48de52c4004c441f408168d1158348cb5d18720d7b213a529259837e6dcd8", - "a73fe9ea7856a8c7e0b22025b29c128723a5a494d770a464eefa43c8cab334fc", - "24e690510ce38dd2ab88c436136e4a45d6c3871da27542510aecf11c821d8257", - "7336f0fd83ed0dd57719fd13c1db449ca31ffa2eba934ddf37f3633584f3909d", - "328cb1ee233e88f4cba01b22c8fb410d09f22a9b0252a9fda4d20a1eea0017f7", - "83c55a1277132c9fd1e505fc04e7c5af2454a79cc7326edf278e4a96eeba84db", - "2b528ae603e2ecaaac28cc13960e14a1bd270395ce9d70464e22bace78a7f624", - "9f8c17b006847c7ac9bb3b525246ee3263ad26a1e6ef7729575fd38aa79e5faf", - "55269689f08db588a0f494734a4871611cf193ab7816efa1f14fa9cb19b85540", - "fbb006efc08305bc1a8df459fe0a1c0b17131fd2a8a4c039bf05162a94308c86", - "a90ca9ec1c9ddcbcb71c987814f49710630abaf2e5c0364aca6c5eedc569d6eb", - "b52a101d1f7f25ae467dedd212a000b1bb42e613985a853b8824ff1c0d928a44", - "47bc8d79f3cd0dad8c8527a2b1d67c08bab42985ab3046560e15e5f64886849a", - "6489d1a2b3272e6f8dc756b5b0ddf144aedcb5b8e8f94c4d21444f6ae85a4341", - "2d29d8a834da6740e09daac8dc43f9507299e5c9bdc69dd1cf9966562ee73d50", - "7d088deefac1bec59211fccdb95df1da92d8ce5cbdaa9440074c73f873426b0b", - "4d6f124a4c41b2ce1ba86132e0b09f21d2bf845c601ba51d9b5c9a78bcd37a1e", - "2632e2e9e7980f26cc471312de33231d74ae69f678af62b9286148139a698233", - "e5b3fd95085bc3b5c1ba07f500691d66e3c9d5395b355103d8295d74b8fbdc91", - "0ae1292090edc2e92cb0c6df7911b929df6dcb5459264938df8b27db9c98bb35", - "36a9ad91f3bab9632728c0922616c428b7cd769ebc408dc6667a3b4443180908", - "a04bbc88469f8aebfb4a1beec43e2d7357d623d31d2ae9cd4207894374768e55", - "3138783e71d9b3ad32ff3bfeceef542cb78fb92cfe283396f75bb31123d74076", - "f1197fc0e245d1820a35e924e49e802530401a107e96f9a368793ff566de12cd", - "3cac556d8012813ae3ddfd2c4abdfdb63f860a80849481094958edfc28e77460", - "aea3cc87b15b0b987424098227dc59f95284e9c65b8f855ad1815e6dfa285182", - "9552b1d3f90f957ecc01fe1b2ca4bc0b751f69300c650dfc34c063372664cdde", - "b520686be90eb6b034e5e40bcf4af8dc984cf838e23c51de8e9c04c522a46074", - "f3ca7aba66de92ab5fabe21247dd90653264f15474903cecf9a38cba5a858dca", - "5fe2f8d8f99a8c3777e318f3f0250da1992511946d91c11d26ffe9ab8bd516d1", - "0c71b5d48efb65b6d3e3145e75e24c779818af35bbd032eaaef5b141f79ce0cd", - "b7408cedfe67480cc7793edc190baf2f8672e1f816364eca1700c0367eafeade", - "cfd48f760ad624663a449adf548108840260afdfcf49aa94c17f94a1ccb15f35", - "53a865485d1e7d00ad69c735e1d6943ed485b2393e99da03ad465e6105b99a09", - "3f5fa4690aab17d90d599e29b1050f45e9ea171ddc125e6c29226b814fc4b2ab", - "1ebca6de411c0d03c29247bead26451f4b861a946513eaf13c2ff351d323f7ed", - "5aa461991db9abb3752b5e2f1d3a5c5f1707e51c6e9a15f2d39410644ac31f57", - "12f79f41aacca69cabd28594e842f2ed6860fdc46262ea07d8efdbd009f27275", - "2aa8f1341e568f5f7add474509df8124612fbdfd65c66ebbe9d839d4903a4bf7", - "798c25b9331a804883258416c1c1e2ea65468725168fb598d13f29ce8a2b4f00", - "748d7e719300862fdc5dd5486807bdae086f7db2a1dd7874d2416acd9bd78092", - "dad84ce1816d9265152439c5a3d4f1592d3abd54ae5ea64346078c34b9568b8e", - "ff64aa47b88ebeddab3c4eddbbe0cf10dbd6d8821add8a34ec3b12eefbcec36d", - "0abe78822dd0c6f4de95208ae04539307b65083d154167b582dad96f59f219c3", - "6ec325c32c33e2416324b382ececab1b600ace5fe1233e2eb8f6beaed38f7a60", - "ad200e61dd1e1215b98cb7b164ee7c9bf5946878d38ef9a29af66b6e7f89603d", - "812cb7d92213e196adcba6252aa86533e4ad4badcec5203d420d5b534b723a8c", - "34ce92876249030a6b3b9424362139136c826280a96494bad3d1c8b6dc1f995b", - "dee0ca3a36e0fe98a5144e397b2686e0cb1f1abc4c46c98ee45a35402bdd5f9d", - "4980e06fa020bc0dcfd3b8cd1ba9736d42d2eb5474bde439854cf00e7ca64000", - "770f4829f90dd15b8df10227b98f71daced572c1ed3d62882f07345fcb77ea5d", - "07984196aafd032905e3498e73281604c001453684d077c14be5bc89c20b4b8a", - "1b7510915cb512d39f7ef2c2dcf53ed0f8f0ecf8a6b924e084a73fbeeab37e37", - "ae95f7485eac2d8e175d6d7885d84085c200bb30a6b82254cd3174271d39fe34", - "8df19f8c62186d3efd403fcb70ed032d16af23f17bb1f948efec35a973ccf3c2", - "9297f17c4f99d461608d1b8f60de61e392f07f936b83b8688ee670a862646b57", - "73a4d037c175805f0fbd5c58a22d320cf5ad28fd6200242470f62ee50616556d", - "baba22709064f4ad733bf644ece2785fb7235220ab5c374cad67d34282055c4e", - "ab0169d3fc4b17b66080f2e6a49008ab53be9ecc5933138c3e98ec4121b5f0bf", - "06e048952068138d9cffebe61f9ff4e982296c475896ad09841c2bad4afbab88", - "c42c859fad9bb7051db81df477a519e27504ef971743261ad69fb0d3e348e30e", - "921ad063da521c0c8cb3f6d3a9a7cdfc6fca759f5f574da1bd8eeee3196cf832", - "e086c513b39a895c836ccb1fe35e5539101cf58433e48ab498975dd5c917c43f", - "b06e0b35332a8ab0812be0650a1b6baf787aea4ed2b4ea31ba56866db701e193", - "fc208230b7c91b998c585425ab7f158a582ace7040f95ce05998a7b13f8b3828", - "ee02ad30829479d911b879314b983477d069b60d046b4cd8b4d3352424ae8cb8", - "0a5c522c9f1e91a54a59d36a7bd92401b2a1b44e260cb4004f7ed332c897b58b", - "cd8a87c3d1a5bb2360197fadb1e224ea9e74f886266da664ad8234b581d1b1ad", - "bb6793bfe6006eb0b5bc63480afd15d0511b5016b71a375e35e8bd88166cd4db", - "53d06ca539cde75e4944b9f7e51d2b9f54c2ac7552b74436dad315f155078c0a", - "8be5fa6cc8558f9da354b682e25178c57294979164f4f13c5fe38ce3e115761c", - "3b378b1cceb038e90f82fe6efdb4a3e0c084d55649be7f39d1acb86bc5113464", - "0b0485f339755c80f707d5b56adeefc03d6445a848e0a868f13da01eb4acbb30", - "2ace8b7791d54280093e3bdfc91dd3a12443715e6ad2161f7f9c9aa71db629ef", - "78a15705c3150b09789a24cf3a7dc97f57566b21e3e77a09ae23373eea7f8087", - "0ad6ad5b3477ee83c6632caba965c7eca2a09c3668393ec08e27126f99c03f0d", - "ae7d38da2181c47656c9be6921decfd3e05eba28dd88ce2577e56aef389b9f26", - "a79c41d2dc3a3afef82850963e5e1f6630176bb670fd5434b133eeb58619d99e", - "4c28c3273571b9a0367bcd95ff9d64ecbd2f767c6da4174855d2505296b16b1a", - "9dcf477c67906d0fd30564c5b82778ad7a19f5ffc1c6dff45262e9e38f66deb2", - "f447de4a87f258e7e3d138d9a73425c36e03dfb384104c991e7dc3a0170a0cd2", - "d4436713d1fffbfbea7c5a714f2cf7701c25de56b3fa4a1856aaa7413fd0ac5c", - "ea582d5f4659e69c91047341ea66f2b9620a6128d0933639475c931ad030b578", - "427e750a619ab33ebd160236e407b11de7e1de61cf90663e1776d307f9e2a994", - "d7856c068ae5c2a3ae4b39441d233280dcb07706542c6bdc32106064a5ef98c4", - "bc4d22dc7c978e1c001c1fd48554dc60404f62361a0ef6054f8344b37e145551", - "482b86e248ddef714505ef50a9499e3581058d09ee76967008e394e7893a0acd", - "77355c7741140fbec1d7bee57f961a72e5e9e41334686e05e6f8e34e02c052c8", - "ac22f0efee4db787e9cf059ed2d2d032dfe78c361c47203e3e0e10fec2eee4f9", - "17fa74b4dd51dbe6bdff482b14d3a4ac0a6d8da60e6a0c3cca6087d8cb3ef8f7", - "7f29ae099bea02b9f0e67b746b77e49ad686b892b7323d5c0d909d35a5ae4305", - "5af29fe0771319585b952824e8630aa46a9e102f65fe520496cbeaa1461124fd", - "b3a07a1f473ac2abcdec6b14c633aa754f1da99ddfe4d57a38b86ceca930acc9", - "cbac150a7c9fbd3baee8eedcebd6c3e652b08dcdc4a5d61eb1a9f5b8e8b0fa93", - "a909c9da976020bbfa364da6929c23b5fbbc6a5d193ff5a7f9ddf7afb1e2da3c", - "80ec27a47b25755b595f57c8df43ab45f410f509e58a8ee4b2866967a5f6f591", - "6adadc26e453e338dc465a8d98d8d1f5dd2a38eb27627ce200eae3623d586fb1", - "8b8ac6e15fe4f271b7726d88a81a08ff01cd0d95e3218b9d6d50df7767c02dd2", - "727434e5fc3f52c56a88a3818b9a51d3b6fb1613bef4d4af3c8f6f0ac7227108", - "43ec15dc4d001422e2748672cc021194822af91f492bfbc3723c11a693ae7f63", - "0c4f418fb82729c18f01c20e8527a50b9a78d372301945cdd9ac21e800dc28e0", - "66870149a4416d6d434c7d4bb475725ad7bc2ba45019b0890f8d965343a1fb8e", - "626c5d841566a0714e9e1e4ed511db3c60dfaeeb0c0dc85304bcbb65fb55f3c6", - "20f1556afa46526c6d020ee3afafec8e17de8a153c8b893bd24ce9e75ebffdf6", - "426b9b56e95bfe53820b005d859416e89a7ca688270a2f6a8828840786ae3537", - "586346b89f4efb749e018a09c742c729adf8a124225a7f0ef49f2fe444da53ee", - "fc932a6970803658ea744bd35a986bd0eb281c17d36ac7a62dc7b3b329dbf537", - "8bde4371ccea4b4aeec593a7adfd361f1ae221e37a70f6fdfbc8c8ea57eb863a", - "563a747cb1655f9c374eb769ddc8e9ef3858171a8fc08ae172fafd2799c8912f", - "e05b251fca537abcea62fb506c1e83faa2f02d74aaf337d1136aecb4338cb1b7", - "6cbfe2f2f3caf22b0a41755ef112f68f9b78894ecfafa7730f2896579f446893", - "326d04515b75d7a755fe571bb0e1f2734190433d936aa507e825160ef509a77f", - "16bbff23da24087930c88fe3566b9845d924d3d614cca6b098dd71846a0dd116", - "47e1e12a57ccd257354b6460c87240d64403a6e7b8b1be766c07b2bfa228d7c4", - "9a79265bdf32c69799b1078aae3fc01159f6e5751217f21dc3da2428d53d6bfe", - "995b8385d13255d5b164c9a2036e1f3daadf8f451e69e1db83afd569a8b0f160", - "628cd6b5ac07fd45b8881e71bf448a78bb2cfbabee375e2f3f23a05ea77a2ae5", - "a30e99375fd28ab2be2d3d4402dd9bbf21cf5673775486f70f6a8183eddcb10f", - "5d04a5d14b5ae4fdafbbc97d777937edd03f319f4ea02652efff87506d6bb21f", - "bfdc8e7676b2ee733fd17f52391abb7ffff4cd5a84e7fd38aebec8208f3bddfe", - "51ec52185700be46a56b98d2ffc281826a5fe8862f763a1711f7aeb38e6fcf60", - "9b8f7a809ed40cb3500aeaf69a418aea5e7c882fa626d6013f2fb34fdb9abefe", - "39c33ffab1db2e217f7179c6b67406b136300e2fb2b39a76129319d1b414faea", - "0201f28d8a0a0ca421c399329bff3ef2ed7eab3340f6c66e0c1d6b9e957affbb", - "fd9ada647d867e4174a1d41df2966886d793adc6ceb1577e728c6bd987aa560f", - "bf16f09e25eae7a9c1927f9622c474f3123279dfb3acf9678c10d65e83fc0826", - "75b062b9c0cec5068356fe560ae66eabd42c59f65b70896e475af9c6bf1c86b3", - "84e1710ea8323a650da738b32ce74dcee2c3eea5e637b70313e0fdb0419c3866", - "7bd169c572745c72468ca0d9aa62f6e451c12ba6e6584cdfb644d4cb982df12e", - "e3bbb9d13aab80e1228d3a53fc14490fada51d725e438f18bd78f0b203b786b7", - "f4183b68fe88cdf7fce76b1cd71135afc7f5ba77c547874a5077d3c6cb93247b", - "c751d59d4975a8ed198c1807b590da60bcf8981259f018e1917bd8349db51716", - "f1f31b68703898e47940302523339de375aece9dbdcee4ad509432cf7a5c3a09", - "a9ffb43b04c1c6dca57f5cf55568fee2a9715ed7bc4f3eaebe9c05989fdb3245", - "c4ab773845bd9f806cb80d3515cba0eb8b9c6e75bfd95994f8b51993393d5bac", - "e73e3b3d97a1722828b2ce4b0ffe9b6bad692b50073864eac4573d285c1270fe", - "64c1c03afbc1396c9f7648f1e234fd3fe7a6cd6a54b43e00c42bf04c48abd2ba", - "049fa243f0dfddf63f21c1fe60979ebac24a5c69045f62147de550534d63c6c4", - "16407a69e644458e9d1e6dceaa3ae5ce6f97abfde892bc5bbeebea0aa32c8323", - "92590599498d78aa693b67c4f89da6dff2a0b9d2f2a251697bb14ee4daa05d09", - "19470f333e0c3a7fc4d0b17fcd0f681b00708500e99b12eb4111c0b6fa76581b", - "5be2a65cc33ea788e66cb5229ca36c7f1ae354f46781be84b1e515ff76fb636c", - "095ed36197a5997fa7b17fc148f7734c3ffbb598d80cab03f77b48e111d0468a", - "f29c0900cf978a7a6a302007eb939b25894ca213a8ecf8b293c721a696018fa6", - "37fbe84299c4b5b7cb3e8ed32402e36d468898093f4512ac14a5da5aa2735ce4", - "212172f124eacf0a8aae4511cc172d86ca69fbbfc6e0d12c56f518ef46bb7321", - "f7c625a83672861b8b45578c7404d04911b5c4a6aded63985efb81bf0c876bda", - "9669b87719135a1fc34482c3f46b31e7ab1f1899806cf3a0a9c436e1e57656d1", - "bae1ae5bd7b801d21ad14b93f0cb6104bd51cd1fcdedfcc0c607c4d4ba8e4d64", - "896366d82e48200611a0fb7e0ef1d7da56e82b94c876e7ab2f725ca0c963febd", - "5820e48878e7bbacf14077b5faeced0a485b130edb40ae9ebb797f899ff3dfce", - "6d1fdb8833da2bab6b5dbc263973567c8aff506887f663fcf6a7e0bcbb560b2e", - "3f6693e14fc8c963503be75940409d51c8a333fd734b1e5a4f4ec5f48e908f55", - "163193b98cff06d1f7ecd2a1566b032a5a50fed2c0bff6d5e0dd787732353800", - "c78e3bc176fb9879b69569dcf56b6b4830220c41e7d297f38ad91cfb3fb17c51", - "1f79a03642a18b6708bec48684058195c776a8607b959c2b1d43b090629f65e1", - "6ac3dc024f874a98962031f48988d5f45b52a5c56de0f003ed61ccfa6fff0cc9", - "8b73f03e73d7daa96b1c75d0f2b77d7c2764c7dd18f94d3cf8b9908a9232d213", - "899dcd9fb9f56e13cf1c2804c3e002af89450c31485071e36331a4a6e826fa86", - "e3330e03107ea7f88d5dee00db9c4ef6567367853c5687672728eb08f3ceb42e", - "5354efa05d1f0406c62f938edb5e01df3757fcd12a5624e4d1eb8a99d36ea6b7", - "226594988b1835bab556cd67b79ce8cba9447ddcb81601c2cc89dbaf1c7727e5", - "094000abbf70bc60170b2f402e91c77db47df3a1ca0dfc80624796774eba1a60", - "8f7db94191cbf9f99a6eff7663906b2666c967913dec78e6a085edd13522953c", - "213aef7218df4a6e8766e4d34c639f6f965fe72d5f8979fa34078f198b24ed87", - "02306d335b24e8a195eaebb5dee66b52e8103e7b456093504b789f31e2e14a54", - "b6d0bf8f5888b7cdbd39a2c3fd636420a2293d684f2c6a100c6cc677e32658e3", - "c22e8840dde6e8d1ff985252f90e215657b14cc50c459b5e38a7cf64aeeb8402", - "6837ef786b919306d5879fcd5639d117a6da6b649fb497079816125d76bc18e4", - "1c5a49839651096f77406c0815bb36754b4ac23f719014c7164d5d00a6e56a02", - "f117230929c645209ce0903e12619389135bee9ab219e35c5ea8b520dd164a36", - "3636d27110da8a97079ec5ea45600c506d4660793c37fea94f3387c9e7065efd", - "d2ecad292affd50b33241804351e37d1b072433b3f0d765f71c30b7f3d481775", - "157b3ae2f01f0c1b7ce12485744e69017eaecf36c8a70eeaa1e6ad5193a838c8", - "b910946f4c3eb49cfac58573f18e42ba8fd8a635448ff8ea43ea28389b7a76c1", - "4729584d2a3d223d44194d8a7e1775d9538c2b59931151aa838fc3f443014244", - "2c9f4544430f237b981688775dd453ee73e7cafc763c1cf8b76231ffe1979803", - "3046b404558689f1fe5f8fe8ec17b8fcde5d2635fceed3230c396b7f38baafdc", - "e51cf22d1170ed72f4a053282ea50858298ae52d193a1183587b6d34a67063c6", - "1552be5d27fbff38e840df550b371dc3016d6e8edcb49700761f15dc1f15fbdc", - "9d78a441cc43a468bd45ec4d676540c7741a9b2a296882b21f94315feb818436", - "a02e1f7ca207a218f46ddde5da64059c19f69d7c1bb6d2c4958eeb19e81f849d", - "bb6f5654a1d0e10aed1d14c8f38b289bf67d333863fe3a22d73c4c110212aecb", - "03a5990a777e56dc0a3374a10066d23d6487ecf4fa70bf417641835415298216", - "1bc4f180095984dd3ca1e78d1b6e4682671e5bde58f4549c5fcf4cbcb30b0184", - "4e2ee6555adeb099f0d2f8d84ea9e569275f5e1c50cc8c6743976301cc4f267c", - "0e4aceb3d214f8502b06a459804f39bbc84509aaf9d6f7d194b16c539f680dd8", - "d979992a3702aa99cd2af3cce612d3eb8dd51ee78d0225e2d4ae9c8dc1e2cde4", - "ba25bab7a90dbfdc25d0a458bec139a6729934107499fcac8e65c1115739143a", - "7813772cbcbaa67fdd14ce05fd5f55c82ecb4b3a6fa20e9aec1ad0e89cef182f", - "53de9936c31bd7ab421710088432f8489af20d8cc6c7b90c811dc47f4069ee48", - "5c4ddd5df79e01af7e4751fd62c1750bff53261db9ea4b8413f73665fc36fb82", - "99beea37ee3132c76909c85f428117690e02e14196adaaf2890b47a0e2f43ee1", - "237a6520666cc252f8aab58f95d1c2cad21b7cf6b046d6aa23bcb851c40cc548", - "6cc1ce41fd30c6a5cfe9c42d823b5f3a391af5dc418d938e87868c06963f0868", - "9c009cc045a34741f06b037dfa8163642710accf82913b865363291d685f0a87", - "2fee5c6c5682e44ab4707217130aeaf0dfdb9646c73ffd70aacd58dad37a7bae", - "65f6132b28effd0d6f0043f61161859bb791d236151eac5a80a7013b62833a29", - "3fd56131b1a8174bc602275c476fc850d9990f04a8ad6b68f255ffa5866ce1dd", - "ab84b8ec6daef61194ded85f44926164a1aabb7d6dad036a1c4d5184a4154627", - "5eda20229105ab33424feaa13f1768addcc43ffd0c393a0e829be5a49472d8a8", - "0e64749e56ec16e4fc324534abad8257d4164d91aa98f046f63717018146c360", - "6bf845368d36c8c32a608bf4f755f2dd98f7dbab1f8ec42e1b1d63f971470c2c", - "067134c87ca36bf81b0e86b7276af697003b12d084b722ecc884817c61f4ab05", - "8944bfb7511c18f128f56d793644feb8f2c744c6da01cec9c3d7eeb78f4b926b", - "d6f8ed31b6852d6b8cbe7def815298215f4505c621edf73dd4680d6f431f50cf", - "bd0875d5c772a837773ac7c8dc54927bd5aa7d66cf1988459fd4b8d27b911abe", - "65405e216009b28559cd09e5ff1389ead98664ff9c9d7d918a53291f2339cca8", - "9f9c702b5f8e2e84eafb0f5d3bccc90fa58688bfa46f224760c2d51e8367440a", - "179621acd5f4e3de290cac56b8513426359c6e213f8a03858346cb40c0090b51", - "10c811163ee59ced1a20182e28f86b149f8c0eb9fc0884693f1e7f66074fbea6", - "6c5eb1ac9ab54d9a326caeb6d89598290c58c35e79bba3fa4a44c139461c476c", - "25eaeecb943f9085f8aad40a0d7270ad3450628d88b0833167add8409689b0c3", - "6f2b5363417268df9ab1c88990c1c803fc122fed6827f83361c4ca5b6da90936", - "da5a34339c1ae4a5f8628b3ee16de2d26c50a95c368b766fe094efeeef50323a", - "12f524675d40ff8b9830c04a5b65c54cff552d31187693d88f2cefc26cf4c4bd", - "02e2871222500b0682425f42e35de4e5dd4d04bedbf795104da820cbe21e924f", - "4b573ec5090fe5018b05f17c43c39c8c61647fd5b660d3b259176f52eab29019", - "eef0cc01131cce8f89b63cd425dc501a24ced20ce0b735f6121959c85d531cfa", - "4c38130ff46d58c37242679d93020ca91af915e8b58cb0dcfda965a116f307fb", - "4e8276175608ba3068806df128e7ed4a0d417efcdfb12d21e9bbd9761a74899a", - "01e2f89d0b5ec284634ee426cbf708d01cf9cc1051f71cf35c8b3abf85fbb0b9", - "d9afd28430878c6faa86d3c6dc37cc30115e09d4c0322c57e730947c2a9ef2f9", - "2e89cc58ec812349c8819509dcc06412f9cc9388757586df968c5e7a14a644cc", - "51845175ba76906319c580dbe9a99877f3402b61c0c57817b4227d241615cae4", - "91096fb6e673dab4df2d63c4dfe72a9c9bee950d56aa22265262fde1b299be53", - "fa1d538474e328d3a964081e8176bb1695a73364c827d1c4228ed9320599bd9b", - "0630ff45f01d5ae3a30501aef42180c922a636f050690927ce49202385ba45fd", - "646896b09d1c0d0a7d31f21e162cce944a998cd6f25dae71ff3135a3c88f96f1", - "12bb1206daa1a8ea356ae5145ff4cba36cb5912c3e7ea4fca106cef1953a6150", - "55b4c775dc93942f301b63f8fa8b98050addf613c06b550bfd5ffa78a7382332", - "feae6690d36d8999e749f774099a7249b8c53021744877af64ed4462122a4319", - "e42aeb3cdfa5154c8018dee4be343b104d446428f3a4383e10792e1a5fcd77b8", - "72acda61a02bf20fefb74e93e59b06b157ee0ad6603c73e473cbcb640d8e3499", - "bf9753f0ecf3078bbc8eb0d1a590284c326bbc1d5739fa5e0226f6a84946687e", - "382a28d9745e065777cd9ecd6cbbfce17a73adbde9bd602f5117ffac6003a9c8", - "7ffb453bb572523c7692a62a7d5cff7f806fcae54620122d97ecebd51e7146c7", - "9c74ec0517cca98cf18436a063d93df54cbec56dd9e9c5797a1f82eb8a5d79fa", - "920888014ca38c184b91b316f86a76feb9f74327985060b18df37b32e8b833c9", - "09bb38ccd010864abcbb3115de3e6cd91049d908c587423fb1337680272aabd8", - "6f1877666e68f5f91f164709cb11aba559232dfbe579df7891609a85f607955b", - "cd502889f6147fe4c233f368ff31641bc0d02aad44ae01cd88753e7c943fe4a6", - "f0a5dfcb67968a7de369a394b67526027a0c81b67b71c952c7adef4061db56ab", - "7fa730cd652d9eda9c95b693e87122ea701dba5c567af203e750a7fd1c06334b", - "54cb50e21b01c2f157ae42b487e2d0c01e7c566944b38527d6fbc57ed3f7b799", - "215de8b8829e514f2684dff3bf202322fd3f93b466ce15bbe9910c04ceaa33a4", - "793746bff556ee3c25b7bde5e527da52b76b9bb3cfdb08bc080b514f157f8b79", - "243e325b5b1080cf414499360d7f42853bad58ac039ecf256138f2451a09285d", - "397dbbd075cf983ba800538d25b1fd1a2ef38a939e6aaa1d5987e339badc0da6", - "cd734414bbc7943962063377e1636839d8902d7d5cb4b634c9cc57133c18c054", - "06aa87b3417eda5e209ca9930412e6f2eba049fcaf9b6e714c25916a707523a3", - "46a9f96b4f6af1201432e997a41c8594ef4c67275ddc568a39cd8ff1559aa857", - "9a90cd4cb96e7f474a975593fe1c2a2359e207c69948463d164fe8b61d791ec8", - "71c5380a7e8389a784f080c4cb2ef86db321ee0c09aadf6d65834f65caef0a7d", - "d41e8d112af956dbe07ad4f008fba19fee72c1037a4ad9b4b4bd0e8ae8ce1798", - "7c7e353e12b269f9b414dc95bcc05d093c89ff5466859a3590fe413bde8ba837", - "813512f8060b19d256d394824e9a2289ff7756cef63eec6b8207a3d8f67892df", - "2962a6316c7009d8270f6a9cec0dd030ddd63b1a00688b26e862373e082cdb29", - "5449d7e039d8bd7e3fcf839db33997cb0b99b70b566e37fd70e8f4d1063d80e3", - "d444e9e5c0a06079f2d78cb2d6a38aee96d96ee38613b2657470790de4662257", - "cc15d02de563615dfff3bfbfe5837a04383fc1483478f2738d23e4c7380a9af6", - "c28387454fe6fcbddedceae08e0d4c52632ad80e289492dc0a419b0229b9a2ba", - "a4aad243a67185d759f91989bacb5d87145475aec46b03652dd4c94c8b26a741", - "05175bf7f6b4bbeaaca3acce17c49da6aef7ac4254159582a1196538049e240f", - "da2ec0023e50d4461138b5c929c89e123dafacfc82dea5888e1346b925e73119", - "178d8eb2b2bb9048fbb84552ebd2ad096bd94e9d012db4a5c81be504da0577d1", - "e50a29a32f9e301e25eaedaddc1db77d020787dbbbef16f353d2234531750d16", - "2de84316353ceab74c188de8d9b7ce110c1504ff9a9fc95442a1bfd7e625134a", - "b010cfceef58d1dbb5aa23230b1afb35cbbe2d664983472090f37f76b50eafb9", - "f4ea8f015d1b96d3e444b06d5f46f0ebd35c8935ed1cd7b9fc28f7e97fc24222", - "4c1dd54f3eac8e4a5ba70e9399dfed055cc5d650fc1ba87bf1babcbd48967116", - "f5363305e4f14a2520010e9c926033ff34037872bd4d19db60b62ed9aa28660f", - "d1c9dfb7b07c784201e06a2783211cb7fbfe3ca60ece75e77e6459c6155960e5", - "bbe571996e847e99c49a754dc45f5c0f9226f90dd682b73cd214216223245fb1", - "24781c170a5a7e25579b4dd24452fc63f975d919bfe24e0e75765d0b3bf0612d", - "f198807668bd7e1d3de585f2f09699a082cde793eb8658c1b1982d6e860fee90", - "4223a42fde45880065c19f710ff3dc447ccd05d1d532fa41ae281a0c8a3fdbff", - "91efa46571878ae2bf42c521b33709a5360369689f0cad1ba7f7ec636536b540", - "2e65f41ea86b885a5770ee4121c6f4010228f9e904e479f2e50f1f953a68932a", - "d3d8a5e93d7cbf9c8bd3b4404f0fe30ca498299e64d539cec1b19254b6b4e533", - "334651905ad0c06b5ca4c2d072ea93adec02b71a8285a0405d2145622ebc291f", - "a8cc6db28d37f4c1bf3f11da3facaef82f7cd304be7ab1ff119e46428ead8ee4", - "065d5078babd67fd7d6cd0061d67dce87f798e46aff5454e2fd7d97011961c60", - "44b510258d493002d1486aa61017084a0b51e5aecee016d6e4ca965be293e5c4", - "fd728d783188ddc4302986d2507b297d99ee85d0698f035734aafa0c4d0a9c2e", - "63298b5ca9788b78887cc3b1163da3cd621568a6c6c8b963cf8a38a5b4ff0d31", - "10333e6777e82feda55732eddb34896f5fcfec92b2b80cafebd3fe7c16cb3f56", - "55278318dc613e7c7c0c684e09f0b65732b96b9cc9fe0f95906302b9619ccba5", - "6fe532317d6069156dac9d3b87b0d5a140c9e97e05fde67cbd256b186e987a90", - "015a568060f5f6fbebc67794b42a5f0db91aecc33a6af5c25952981b541d6413", - "1952be636d3d74d777e3d82ec44f92d40e41bf4e5adba79e2016011d6dca8b48", - "fd66c9032a74cd411bcb394e60aea9d3a7380e9d087552fedf5e0ab0dd00c4e0", - "e2c21529230193ee00049aa23edffcbe1a161e79bbd89c1e3809041d69b3cfc3", - "10ab816d85aeb54c4af17b382380694099159584e3d31736088d33c2272c63b5", - "e767eeabd20ca28d91c9a460ba30bc0f9c0795edec567d030c29ba1fc2a8f2a6", - "d1f5fbf5f1aa1bf143114084d1f6d5ee599d09ff185d787def03b9847cd84e04", - "b90edd26edb0a5bfa63ada4ddb03930f5ddebdb225890b42649d48dca542b168", - "c7300ee031b13902747c1d348618cfee292225311a46d6349e10d21e3d005bd2", - "3d98ad9ace9b89472d1697914598c35c62cad8d37c0649efb92824d7132f369a", - "f3f9047d157658897ec6e9ded7f0dd752e0e5ab046d963a6bb626b5b5cfb941e", - "7e30b5761ca2ebba5da1f2a136c273e48a6c603ef50fc314f854442a9b668bc4", - "09e6b8dfa6720e460974c008f7169aee11b55515f57d2ef54afb2e9f10f0a3d4", - "fd7ec07eb12435b66ad6567feeb0eee9f55d5689b83352aaf87343596065b67c", - "fc4dbd1332e6564995bd578677596598138f3b14481506dfd0c14fc8d2ecc631", - "4fa65a6de442e3601612931861e526944a249fc284239b907ed9341a62cfdb3c", - "c8ae33d13f8a43b3df9fb410bb8a1943f1ae50ec4059533bb9b2c6c523906fec", - "d588c5440286877207c2ef50b4aa6e8d08db6e274cd17b45024f51425227a0d8", - "b550ff7aab860e565a9c7620dd9a3483c23f882c6b6ba2fd9f5e94526eca3e1d", - "225de738090e7a6a8860518f72bcbcb0d6bde4038ae19824da3439929b39484a", - "a14b5afe81da642bc4a04fd2ed65571f0ca9ff7ab51b32aca20492f38f10b7eb", - "afc7f41530864fa4327de4e488a073b9f83cdefe6ab52fea88632e6ca4d74c9d", - "463a15ee73f559a0de0f9ee72236731a0a0746a480fd5d862dbe039485b572f7", - "33adc50de4a5998f8917b377a937b767b0a80108507364cb2d5a98f418f94975", - "1f7e72f20ffafd9607c98275fe0b7bf2ac527161b104506f8955cc0ab52878b4", - "9e7bc7c31e8fef39bcae6b5797dd9e234490cc25a6e6fd361a697e324d3d298e", - "bed797f5bb89a2197e3f21db10ca5817d6d0aa07e9ad251b87f62be177fc8e14", - "9d3cbea66ff33bb9bd7e6ed91fefe982b1d5f91f23a2babd351c7bf660e7be5d", - "a9568193ccead9024362e61faa124b4c159e5716a56f8823760a2b861b5edb69", - "c2863025a27189cf86fac25da04abff16fdc1eae3be6e0d5703e3b9003060a26", - "b8ce821aaf7f8fb59f648bef27d24342c6de8ee25d2d48ba3a1e32ef801647d8", - "d5726bed5b8d5b8bde85a158e8ce27561227f7d9213bfa4a07bc1b3193dea082", - "6d1ea3d8d524907f29e51d92f7d451f6c62edde268374273507bc50f6298de77", - "39e1fb5b8af09b5c6ad27d88e3574cb879eac6b6eabee44ae888fb674ee4f2cd", - "37c6ff6ee23254b08309c3d31a50f9b2866f57fc90e3e217a35fc2fef47f5427", - "5a6ec16b69112ac209982e73ebb7463f9385374246504ebddd76650eae4fa2ab", - "f8009dabaf1f1d43e586978fa12edfbb81e099fe0d54eddae8a96ac1c75dfce9", - "852aa749cb004025c4e5e9760b2504b4e54920f2f1b6a3ed6fb149c87eb9cc23", - "34ac059ec015a8b70723cff1e444f59f614654b1752ff5fa206cef58d2f0da72", - "6f101cdae28572f323fe1bfccf9b049bc406e06aa28b343f81fd19fc471e5610", - "1138ca6d0f2e20f0f49a84a6fd2bca6e093be51f91a8c3c8d9988239c6f3c56a", - "ce27bdc0d59a90617ee5401fa1d3211875b3a588c6e999570db94a5cbf325040", - "b5a4b30dbc18494ebbf13c7aefe87820fc0e008d5352c330eb33e9ddb37aa447", - "ac382e0a63d2dc3196f7de1a6dd4226d5d9f65eda173970afca9c36992f56e22", - "e731f3f6adc8a8c5e11c8652a3b4510d99db006c20ad7c1e9358ec37bb872350", - "1cb33ba4a8d78f72626cec380ab709864e565bf454646f7edef06b79a53539a8", - "8db69cd9c9d82da3c9830cd34b2a01e82bd4dcc847ae8882948e647facfa983d", - "731db267837a824a830f3aa2e475ef879e6010901fe30aea8f12cc625e18c8dc", - "17cd58afd1d9708388591ea511b104882e67d5ef02d633cbc82004f070178e35", - "16c43a3b77e761076a0e96f0c378222cd9e0067402ee0ebacffba92c26df0ab9", - "1d6d89e34fdf9957b4cc7f310ae3e830dc85136a49f75210a0dba84f4d6bcfa0", - "ebd940126f6ec712325d8ccb17f0f0a9e503feb9f00ca623a06201a5e108cab0", - "7f2683b05a60135685d2e1969207ae7824b525b53f7c7fc471864edee0681a57", - "d3e7f438da64c2d36a3e3b92dd10b4d1739222762a90fe194acb962389b522a7", - "2866034a4794ad91a725cfdde9644b52cb2607b4eb212a6d1600c892a48ba550", - "e9e4a7c658779aa64606d47575501a0c1bba0758411f50d7e102265669404e97", - "b14a17a11de2e200ec248667181cec7d74ab82ba667c34695dd5d88197e8922f", - "a38caa4e1a562f9385b122540448236ce2c11246ee65acec00bc80e9cb2b3a5a", - "c6f5e82f9f15ddb2dae7bff090e61bdc1c5cebf0a91a4c5fee87b69221cf2d4a", - "890b3a9896a34b510427aff44a8f63eb41ac3fa42d4f3ddc0b6f7a75da263319", - "7161245e0feb4f5b6523db892dbcd11b91f08682367254700f35bec814d6a6b2", - "48d2aeeb8e8a104377fa797fe4347f44c47ef5366fad5dd92915be7f801ae26a", - "27007928c6f5b1b27a94480cdf59cd2a680eb805c996583e1b6338793915cd98", - "a69d799abd5b01bde1d23bdaeb18fd57b7a6e761bf90d9b276bdc6308a3f2be6", - "08644532248609a4fd296f34cbf89119e6f8a6f305e40b63ad3c5c4d6af5bbac", - "a5b223c5e892be4b43ba0176a4fb8af15c7e226a987d30939183a0ce6d837b47", - "214fdd9e4f2899d76f93e7a0293edee438e70d0736186bd5cffc14215744cb74", - "724d0557e8205bf6841095674b61980eebff4f7495cda8e34a1c7b8043b7b291", - "3dbca66bad3c2da48f84f0f5b6f1749eda024f7ab40cc562d653b270dc44c827", - "68fb0aa26f64688e3e73796eea2c8fc06beb75f12fd91119b55e45e2cde199e1", - "2d4e812f62d8bf5de055e1e193cef8baf3f655f8df517e57038561841118e923", - "345b0d72b514819a882ea172818fdd03c8fa734a5f01cc7375b9bd77dfe3487e", - "a59b98a39f228607f359149cdbd09824b52336d76fc945631a97b53b00fb9b6c", - "081bc3527c41cb8a2b823c26dddea0c664a5bf586f08aa63859893b3f023c6bf", - "4593081b70d6648b5f33e13ae2df1ecd79b2512a2e476a8ade4ace2b0d56c65e", - "c5130782be84e9fcd26e9385f10e074100d57a5052345344a3fa38a56c4a071c", - "b36490e8ab6ac1070c6bec3e0759c2e5f002e4b623a06b975abe9a2962a38dbb", - "f36fd758a7dfb553cac25a0a8b66f0c9d27a2a5eb4fc2308aea01fa828398822", - "32a1e8ad904744f6e924ff10a13aafb8ce07ec28770baaa5944db86a39186554", - "bfb63ca74368aa289c4bb2372ac8b1eb5d456cd48a6d2a06be12bf73819e3da3", - "2f667147cc4ca07bfa5e19f2ac830a50e3dad6b93976778d96acd59030e792f9", - "1f6ad268ca619825a38eb22da671b6edefd4fae794318a1790136394e4dfcc74", - "9f580d30ff3653b1076210ff776cee8aed3a36696e51e486375af0b8a97ca0eb", - "577f7f115a0d3d9e8a617d755d84025fd8ad064498c6871c81e0394f1c7393dc", - "53fcf965d918714793a566766012be6f90147eaf140d13dad3c935ae32520a4f", - "913237e40d4a1518c7fb064eae8bbb10ee9005d51e997a3ecee7646a56dc0e85", - "1fb19a263faf87c86e4344acb9684e1c6b4aafc4aef10cc2fb54d7e49e2b3139", - "ce465964d7b4d185c60238b369c5fb64a1e2ae48a77adb93aa266281caa10cf1", - "95f48424af2f75b90ccac251c8e6d4a400dc34d29801313c22c5e6a43d884a2a", - "7271bb8582a5f82349dc3eff468f4a3bb07c58c556c621760fe78cfd9db04e66", - "2dd0b963090cfdf5e88e4542f136684676e36fe518d282c8f45edd0d7e3d0ac3", - "138e064d96ff9f0a72ec2935cc2b04e31b6e27918b65b0f30d5efc999d1a189d", - "8bcda7aaba6cdc9e81bc3003de8c24a682b78bc3e7d0a780f34727e39fa6b963", - "406391162ce880f472b8f38f077ed608949fee334de422c9f7ac50e465056bea", - "37bcc9f7413d062c4c8867c3a40f7abca60d5ea3420e46267bdc20dc18ddb887", - "fad2ad46b0dbac2cad383b735a49450d54cc291fa0479214b61520917f30c12d", - "40ef170ea65e27aa008fec6346f71573f83230c61f25d1efddd57a6baf6e6592", - "82fc462ed6809bb30044aa619220e530b06849f5cf50073e6f62a3f831bdd7bb", - "4073ed46e2dbc2ce940318a4b745a3056141274b0fdd5240c7f7ae849970fe91", - "9d0f154e87acb11156038ccf131de3aa7844b9a3e0c7c812b629c6043eb9504b", - "18deea80f263ec51c7ccd30e4e80389d74c3166dd5778d4d651489404abe0931", - "9986643d46c5bbd553952eba2f2780212147e2ad3a61046dd1d1aa536bcb3bf5", - "75608b7598dcc503abae9d60ee9d0d668da858ef83c24d73b43305237686717b", - "c5b2a0c3f6c0ecd7b25cfd43f4187680b2a2e9d606c503130e027293420112f2", - "67f3d8b46456db57f7120eff5eba53f39cd5cba5b9d583ca3fe2c9b843a0a3d2", - "dd180437d15a2504d97fcfd75b81b93e982fd3d5cda38d071e171040daad90c1", - "e833a10cc104cef36a2683781e3e905ca89b2e6ea789013a7cb930fb70988d83", - "9818e26a3501ba75221203b7e306179a3d276fbceb51d195a07a7b6d26ec7c51", - "a65993b9b45d672765dbe5d873d9562c66595c836557db34f6bffa09c5711653", - "2d6ab6571f1469b04a2ae1cdd11a55864f8e1562f1fc5eaa67778a4fe1e38d11", - "a08170e427eadf289b83fee139cdbe70d423f2ee9ab4717b17569d59d870efd7", - "204c9ef67d234ad85473a6975013192be7d584538f4a894045cf89decfb8f8de", - "81816d13dae4044b70bd63f08b1e7ef6ff119717d962418926a0a332017bc7fe", - "a117c3ebd18d0bce2c7fc1f4f8c2de99cd28f0c94b3cd7699b222767bfd6a573", - "c08e45dd94267fbadc70baa625ac19a3cff59c940651711359a74916d41df0a4", - "5a4ecf9af753f6ba5f0838cf4a6c6da3568cf3df4c75dc3cc87b6d335e70b439", - "d3f6892f633ea10e62ce70c314add5342770a54980fc84e177a56cc0885f6549", - "ae9cc18205865d86581a735cd96edb3a604d28e8272f88284dcf2e370d1891ad", - "5ed462d0b15914fa927abedf522e1c4b1b8e3e588ffdbb7007b371fbded9d27a", - "c348688870dbcec97b06c4ea486dc0cf5358c5a0977b31a359c311db71bd61e7", - "b6a1261598ce45107397e253473f1aa907680476b1b405021dfe26e768468f67", - "cb591f1e92dae4570dbe53d563284d4a2a0ce6cc44a6cc223df668187f8ead77", - "5acb83a7e52eed16cfb671ac9a68853dca5b2fdf4b2d1beb8f5fe058c1cc6ccc", - "b9ae374dd72969b3d5348d937f96ecbb986388e21181fe3220e288dad1a3aed9", - "bd02df472d370bc49dd1b92c28ae5ad92e1302e090130e03fe4466175f5e1fb9", - "a089c7eee2d66c571fc449cdf3a2304a2b11115f9e21a55452fa8639a2026ae1", - "5b877dbac54569faa12df4418ef8c67a3b01823ff1c79a65913792b20acc4918", - "7999f7e595d5545c7d1e3240bd17c8b74b9eda7d9f38277847f440e39c288e76", - "4edc483ecedbd93bde02094ba019686c5a0def728845b5b1af824adefe0e87cb", - "93c802b45e5bbe52a3abc46193ddc8c01de9a32a994978ef21bea7251c476492", - "c06d446143c1e4b3b4bcf489e58e733b77d915a29c8861349d92a7638e681423", - "31c2f49daa54a2f472ba2aed5c464d63ce6930f9bbc6711f86694ebe287dde5d", - "a28527bc5b2a7f074929c04fac74378b2aac4cdd53afe637ca666c00d02d274f", - "da33fa38f995c8c81062cff7091b5ad11d2a5d0eeaf47d07ff5b6d9279294d28", - "9442e2479df0c2bb884848cff8fc849060e4d4972c21d2cdbb1b585f82aa14cb", - "9b02bb4a67d0a83b557290c4ff440b6adff9bd5a1827efb4bb9644191e55819a", - "abd6faf4081acf669ff9f0efccd19382e2287e911c8c0d4ca736ceeadae1babd", - "c840b306db83135ec44d390b19885917cf37f7cbbeeb6bbd20c48d99c057fae1", - "294431b717ab5535f87c3e1826fc8e3db607a36bdfe243934e356dd95976ea0f", - "569f110eae1bf74b73c8daafbf2bcf4e134adf5c007bd6afd07d725e8df35dc4", - "8ed4acd186304d01767efb5f2126728e0ed18f70b3b6d647663fc51bc0c9158a", - "b4a8f41f6cc77f8c4cc86322442134c68892443c5b6dcc41c65d19818f8463b2", - "5a851f456d469f3f3cd362d9576cfa2e4bcc8af154ff0cb91fe518f31a8deeaa", - "9c9dcd06cd386343c0e8cc6a5f509ea245a4a10b64a910cea55e90d2483d3632", - "2400c9b7bd78cf0d1e9182dfb6508a78d9e7d0770153dbfd05b791420b57cf71", - "17539a5aa11631a61446bc62df0f4abde921f33fae41bc9de3cccecc0c4332ae", - "0f442016dc658901b1cb192d726525b58793b67c962a451f32a4034a48dc3236", - "4a1cb9fc2335d373a60c74e79c358cb4fc06da36a1b31943294035a664e1a55e", - "ac32e26476008982afc76c788c63d663282d3e23026f9ec67b221e848068112e", - "526df401166da2c8290e3c1e1c49094d4e0b333e0ec12cc0723c664a33b58df6", - "6bc6c5bb1743c8d85d654edf71cc75aaa1dfeaa5c5247a3ce0052e0e358a6d0f", - "754d05abcce29fdd0faf36978a9f199fd39be88e6d115e4c00e915072ee967c3", - "2bc3191f479bdc03346464adeff386ba3caae03d3df75cb1b897c58755d5e682", - "f26da55ea1827534f3eb1ec38c7aa1043a2544264eed71e47bc7fd9d41b99779", - "6b8bd6d6830394f7d8b8b4080e4e07e6c2e9f46ed3881f2893d323b537eed643", - "49deb724c5544123530c584e580bf84d2993709f1b3c785df4538e8dd3a96253", - "3fbd5cc66334b88022842898cd9a33f591dae4831bdcde6a21f5e275e8241ad3", - "79b54d62e6502f3037a0b1272d9deaa77f58eca34c602873edc2f4e2f5fd5e0e", - "a024d175bef1f52b8db382fe1398356eb35ce30b86c4abded49aeccbe8aba742", - "f903cfe518eadecc827a68c6b444c0ab4417cfa12b4e1bc7d3911688511ae07a", - "bb917354c62224ed1814cd695fa0b970713b2292daef792f47112c7726b89690", - "c4cbf4d31465796fc63946cf191a6552b694862328386ed8dfb3bc660d15c183", - "e5c820ac98f1a30e04c54b99faba7df9b85766341b5b3d993f246debc9defe74", - "6bdce68340c0a65515c37ed4d7513ab336262147ae241fb8b67520be4d244d6a", - "c33de3f6bdc4c456bd1844cd268b9d389d78767df7d038c58b19d0691f2822f5", - "eecad4f2dd03aad3d7b761b10c63e565c3dcac1c8e7dc1615bc184d0986b1628", - "bf4c099a195e2de7381286cc83187a60fc5dae0265f6f291de7176ed39fd9d07", - "6433fe70b699f932ced39280ee2ecdb6339316aaaaaf94df0c2a0546ba6b0920", - "c3d2cde8e30f64590d232da28e41b06288fe474e1fe348f40965b48ca657026d", - "ab712d7194a7d082b82d8217cd38d7b8c8483d69713c179472a2f1e92f1787c2", - "628f9c544b4425ecefce5066fdffd9d6878e65a79fc7c531f11d0680f89eb33d", - "560ddaf4cd324c17170f7113c258e29fc7bb79b40c940360cec4f481ff1ecec4", - "3d3a20e8531ad5bd80ef20544e40b8e648f909f8aa2666cc90456264cfd08e9c", - "869139527470cb273af2b61f8fcf4b58023f73b8808b26d77129bb80c91838e2", - "495831fa6af72fde604be5b347b9e9f96737808dee60c81cfe68e8bc6280227c", - "6f451319b604854bd0ea8f7dff274feea440bd4dc5075f83679d4fcc3f6fb5dd", - "a742f266e4cdbdae8c392dcfcbb4b8c5a6e87a582144192dc84e5ef598ccb3f0", - "bfbf6738baad3da5ddf20be9e8c79f2b7770caed2e199a5da04550609590674a", - "6d4f4f932404d4334f104bf99f23070637a0388820a4ed661fc15fde0d35b6aa", - "3384f8551752f97d723d8e992340ca5858791649213fd69f5e060f2f33b88b55", - "fc449040f227ef9edf8ce200e47abb80804291ce0e586b31d28362bf5bf1f027", - "3f68120000b5980b8cf025d3c129daa25fdcf496e776faf383633bd4e791e975", - "4659e09058f021c4b06ed92650935625275dd877a28e3080e29d153cc543295b", - "6215519f05c77ca9fa7aa0ab8044450fb4d71b2caa9c8f8a4c80f3f2e07c6d5f", - "db3d82df265c14b3d64f9bc454079d96a83c56a82ca102fffed01a14f6f5d39a", - "7122702af1c6848661a459c96b9f43e4dd8033a3b0d6fc3d6561aed59091e6da", - "ceaaf6f1433d1c4b9272af81665c4f3502fb33f326d37c47ade98cbdde0de806", - "24640b33542ea6a044f350e25d0042c130a1aecd051cd57e89874c1135fb08c4", - "80fe27a08cc002ed5141bb435848a5492190a9c55934c5c6c5ff1a1877fb4e34", - "81d4915dfb4c5e9614e46f7e3c7fcc1a404ba1b0d5415e2d9d809a646939c22b", - "007531f393e54da81c332e1a958caaa1094de9fa20f02416d5add32e87003905", - "076a32e1fd408d57a7d5a20143a6ad274226f8eada239f7a738edb0ece3d1763", - "ee93ab85e046881f9eebe972781f7393dbe0285a9bf3c8fa505501619babefc5", - "28bfa23d5bea126ad0eca5229ff0d560f60ed1a1fb162309651128282f37db07", - "271d1c296591649a013c3faaa362e0e792aaa9a8e41000186d278e3a8b70fca9", - "571e84a95bc3a1afaeff4a0cd5372cfefbe127989db77d70ddeb1ab49c6b8154", - "2602f0200ada10aadaf85a2b4385c5b400e769dd9dca0b2c214b4af596e65e85", - "e79671932e764b57562eb5133b8d81ae76f644a20d4640f44cce8f0fd380beec", - "6edd8d377963efecd1c9106e06ea833a924b44db59c8c9e328becf3b5e9384b3", - "f216f409fce3b9515d3d1560bc207a15561e968f39420ed4d56eec9dbd15b43e", - "c2619fb5922f31a082d7f3976186c467ed81f098e5c47636a294ea43fad82441", - "0221a2adb55c0e0f0af9985e5f7bc185fb7984d9e369b201f39c6aa137d19ac5", - "a8d0bee197f20adf40a4bcc8ac47e8882e78192f8b4bcc94528c5740f0deb796", - "d021ed8c4e1db2554a71d03b8911cbbe2b337cb84644999a3097bdfffbee930d", - "9f5e07a263701954fd27385267048979302a71d1d3fc68db89d405e2d51971ef", - "ceef8a84991403b73c0a01be3ed94e8ee8d06293689759db66f6759774c06449", - "c21840f4b92a8907e7602d85f8003e3dcd9b9fa326d5cfa5aad168c3130372d7", - "01e83888533966f6d2a7fdec88396c88570c41db63db2ed247ae4582af0c4c89", - "2dca349c1914f2da0bb7a508aaa9640cf4cdd99a6aed288b794aee187a04b3ed", - "cc58b653b72d8a643eb3869a5f8fc58b54d1aa8f24d09343321663877d5ac9ba", - "d67a75bc97c0abbeb1356370c178b6d50aff0734a5487f10bd8a2cfff84f777e", - "7fd95c7fe034a5ae41024d0bf17877ac815e97cabaaee845fe0d6513e5868a84", - "3ead501b8e1794ff8628f85bdbd6ec7b846fc67430050f9fbfbc5ef521b011e2", - "b4cda6e760c30d044f52e9434657799836f997591f3d77613f0023f212770918", - "128b18551cc8c195967f61ee715c91c4870f02a855622029f41b2d619fa5ac9c", - "193221250d1753596a8ebbb3a8101ea222ca6c75f26322b333c95b77af476575", - "36a343c1cf1ebb0a5bce03c908c982e6632bc7ad1e562c8ea4cf02c9d94599aa", - "633db6c56d25bd6afbe3cdd1f764aa359046d0489e203899ffc809f0095206b1", - "a1d3c6cd7062901326b6c867ff2c868cb3c7cf5bb21bb956bdcb076a3630670a", - "d2620985e47cee8723181101a6df489dc989cefec8f60dbbb9cbad480d4850ba", - "5e6820dac77390ceceb6d5865ace99ce372388a4fbbbc6d03581a77e4d58c38b", - "b91fbc3943b8285eb445a56d74f1379289f2eea9a8cd0b256fcadb4d81aff1a2", - "5724fc5c2c3e0ece3a2d09a09c46216944149e98aac97eb507a1ff25606e3a3e", - "2c999ef39a076a048443a549fdf22702e771fec639917ab6006b2a9ca4016c2d", - "6213e14d4f5eabce4ff378a4428111a1a84ac0bf0b016b8472ef13c03f2c23f8", - "6f0eda4db3f778bc7d3ed323b621e6626cf2866a02f1ba59508ef213c749834c", - "96712916329b4d6fb990959023c2477c24e2d234a68b5f86a7bcb409608439df", - "3ad947ffc2af9dc99597a88e3f4b6694087360132dd4f7fa86987c88ffbf1855", - "ef01bd9cee88d502bab9a2bf1bad346021f2d77c4798054c94a4b821ac942200", - "62eb4c29c752d244b5f20c68d333253917c3585119ba9fbc411d53f24fabd76f", - "2ecbc8a98214a2b550614e8142b51a301d97b0852f247b45c21dd67f563724a7", - "8644bd1022d26de3178b9d0b680d3c89ffa9c66699fea37ee250830327deca82", - "c0ef454b1f141966ff46b508045b1ed7a047a0475ec4a25a5b814776cd3cdd5e", - "ee2b23d801ab7a645470663f8a0c97a7c66ccf8071dd5f414b8808e2759932db", - "deae97cc263b583fbe8f1c28ef195d0f667c485b77d07264677afe94c83c1b49", - "5554633d987682c25ba2649408f643cae499e0a431551de1d2a22f473372e7bc", - "397f696c22776acb0dcf9f1dd7dbe9617e27b7339651d13b2b8bd58c6f26877a", - "0fc58eed70782d5a9a56dd717a9125fc253755e29960ec59677364a21a2727e4", - "f90b5df7def75ceea58afec2e0cda0d0ed41fd3ed81860437d89252280b0782c", - "9cb3b69499ab42dbc964a65ef62bc8cc1093afad48ae82bc42a2f032f2f06f46", - "396a3b96b1c4447438c1e20794ac4ae79a9b147e0fc1e2514a9e2c40cbe35763", - "17aba19e3aa2574f53f0bdbb46f8706d7f2172edfe5706fce662dbb7c275e85c", - "39fd4df92f8d795821857c68cb98f032385d161f53e6c6768f8d059d8c4415c5", - "eee7737243549f3ed9d75288090ca4b0eedf0d72ae9932bbe60cd7d38b5903b8", - "cca922b3405612a5ce8d2cc73744abee1c536c83fd15567ee0d13a9754704773", - "5545bb514f1e983669ec57005566f4867c303d1f2f9aac3cfa1d0870b2192111", - "a128300f8980715a373afbe75143762157e9510021d1dfceec1224dd97851e1a", - "832ce5f360704cc3dad202507610357e71f2d0eae2e518fbb054af3fd5ba2762", - "3765ae1a7273c7246b0aebc5536bb980dcb3d2b70f75713c4e9ebdd40a6b82e5", - "ec47e0265fa0a1977976e8f20649d5c4a0fca7d9997bcc50fb541dbc3bc37307", - "f07e3c60e3648f501b9359827a0021c1c8910d3fcfb1c049d6f72ad01517acd3", - "6a7c9120c8bb2a239487e8f0717f272fda76c7ffe2ec0ab89f3406a4f5d6b5f3", - "746dd3cc69d445422147c4090984ff699b1116b795de61ff0565168925c0d3c6", - "fa2d83a46a47f6a108eaa9e6d82ba635458a1a37a68fa3c263fb887386158abf", - "bd45074ad97989b9568cfa1f96bc17627330943922a28e0b4a7ee059e1d29cee", - "92e72fcd5f8c5f1af92d7d4023397b3fa52d28cc8c44c6e06471a97606f0b060", - "d36513107ca470b8ff25dcd8da44d144d467d95dc3f7cf88041a00476fc22efa", - "5cd77ac089338cd071ae36832d1f6a8fd644662761dbae493c84bcaaa70bbb1e", - "204791f1d142e1e640397f1cc3812319f34dee67774fe4a9efbeb1bf2aa829af", - "3f44dd155d198fc918ee07ad41d90c4a15ce13fa6e621dd98caa6e21ef87a581", - "88b7cad903d1e6bf3680b449fc323657527b047feb232d4a66bc42c2f7b613f6", - "d6117f6e92c66a4c0e62c893ea41cf41f8cad0b80e93cc976edc381ae529bffe", - "3c969f694b721f745839bf8c52a1748883a69c2aca780d08f1513713239a9abb", - "ec0b61b982125f69a67c334a9eb8fd8d584163862756265f299a7a5305feed11", - "89bbb4f3635a53f5048515ccb77a934448e90e25b196729553579d3fff9dac8b", - "0a90ffff1abf71794e14de2471f05ce6da25d686ab8c24248ba1c2f1bc2b5a66", - "76a2efbb8454480ec8ff056b2749cb17f0cb658c33457e5e1df28fc0e82354af", - "180390a936272ab05b43104d8900ef21b68197ac7355a0d96995a025c830cd8a", - "5eee6dbfc14dcd51d4773a00414b7d441f51fa0948b99c52c56e639d57d1111e", - "f0a89a21565da1f1764838f5b9d3ba83c0b24bd2d7a8c6a6d0717198038ff451", - "e22563f7f5ed701754f9c94751ba7bda402c0080443ef624304d73a8dd7c8ac4", - "caffd5e658d95772d130b9f32303e4645ace259b7d143451fca68786849b0ea2", - "80942d02e71211a1f05ffd3e7f63bde9cad9292682a7f25977b111b99c3f9925", - "9df0b03177edec7a7280b61926eecd5862b496078cb0fb046374c13745b394bf", - "f46a68c5e8f917e72c4c20bd1928394052811a58b262754619a08f3e0d40e887", - "40121d9466ba7a731940e424047d500dd8a7628ef1c5acf89e315f4335547692", - "9b9c1b96414b9f39ee37f7a1adc5b076a5c2c66f1baefa7fbfe7629158016881", - "88d13c227e99397adefe7b14d5110460cf051fb2747c7701b02ee852443b3131", - "980b507be27ce1ce517a70d82975b638372ab48afddd79b396743b94c211ed1a", - "1a57670cf63c55b8c5f2b045c32a50bdfcb9fd9b4bb4563a39d172b8bf7c6737", - "77c0a6d55da52fa58a6b100c5be4868d0d033d9fd4453a1ba9959480949a88a9", - "a92ec863b768d462e805dfed8cf885bddeba94d300c14c0bf3a73feddce1be14", - "f203f0b17c9d45aa239bf4bc233cb10cc07052c3428fb2a11ef73f7fcaf9748e", - "fea6f57bd45d026f714b8eadf9a21b4de42f2488588dbe4ee538b9444b0a5cd1", - "1c399e28c0b71e3a68ec7d43f5f29c68c63cfeae2a374f1b68c6bd969dd2600b", - "25c81f22a9af6c82832a3672978dfc7a9284c2e27b0a21daad5de96912096426", - "b0214cec27b30377a57fa305912ba6bb0031212f47f1ccd1d432b22a1f152720", - "721b1bb01c0872102360b54404b203cbe9dd39c850b1d45e27f1480dd8957429", - "8154c0a4e28fd7fa2dc8b019e339a0271eb65089df2ac9cdc02319867dc10f05", - "cd27de4b30892375f54d881adde9ac71a02fe6300b29f00af895c1f8d6d6d0fd", - "e2fd430f555b3ec703f182a16c7320e92d4b705df213a3eb5ff8f35bdab3ef1b", - "d5f652087e9df16ae9ac35b208432d5a7ed0fa2ec0ad91f9164dda1a70f3e518", - "a3b4d4b49014bd3ae8ec5df0cf5c09bf7b2e4edfeb8fa37461af479f5d7ae8fe", - "c9b5c649d3e5588fdac20e3826ad2e236aa2ed6d25cb7602023b2d2abb550e6a", - "ae201cbe0211bf179146ab11c13f990315f7359b6eb597890931f395d26f572f", - "73f99788b4150211db65681124cb2a9fbdae2f0534a6c81c3c49f559bb313624", - "4dcf035481f504e542ba5d3553fef0e81aaf2eb6b6b2fbecb8f0f4ff5de05e32", - "132197ced7c9b2a415e060b4f872ed9b9ea8f30edeafd664fc9c031613149c93", - "4f3c9e9daa72e36d016621d5f78fe7570c7f78d4f1daa809c1a752c3d93b1400", - "1394df12fc6988739b8829e8242fed983ce79a85a42a188a65deee63cd3a95a4", - "a2ddffd07938559106c809058154c9d972ca983367969e58d3e79242bee51520", - "fa6565451a9012ad5a54886242873b97ea294642c5cb7a5a0a29e20fceb2a048", - "4d9c9e59a154d8cc0a51c38af563aba16ad337374e421bc6919ccebc004424d8", - "1f7aa528e0f53366c7c05275c46b60a9660070b06e65337620f52367caa39c9d", - "16471922b2f257fbd77034d2412aca09a3a3c0126b9a841b874d03ce10178ae8", - "677b8cd9d79ae797e550e8a50186e1f7770dc2f2d586d2c190c07159b8925bf7", - "f5089e6b97e98672ffcf019e2aed5968d191bb4c5644e1735ee54c132defebfb", - "bbcdea041942ec3003a3d24bc371e94f486be99d629bb3a4dc727e9c06900ea2", - "5bf7c26ae1b780f89466234baaedfc6f2e6cd0aa1cef397e3dd0f91ef9c87c8e", - "8e959270fa69f2230e99ea8cbcb639d1903546c583d612dcc61259190f86e695", - "1ec94016006c2d847346e74aa894c84e682808811a40cc7969f64db3cefade22", - "85dac4b037b17de0fd8ff5e77db5d70d81c075151f4bd6ee3a5b849207681683", - "34462a701ca48ebfcb2b8f11f31812eb52a99453b68972a087b27e4f9cb6955b", - "03f7859138d469021bd5e35b1feb18a53d09749853e2ce1f2853486352dacfca", - "43e0a450d0b66c1e87dcdaa5c8857754abd6495d34654c5e88b7c865321bf514", - "b702f3d6bdf11988ff2a91e218ea58179cf21efe375a3abda7607dc00c4d5e4a", - "e829c53720e93e1281b02f9c996586cb9ca19a7700dcad9271e4bd4b319e7629", - "cd1988041d817ffc5f6faacc2f75597f83d23381c0f4676a6ecf299b7aa875b7", - "f55eaf1fb5ddf503a9cf6ed840a4188e362a171661edc0e5ff086a0c95f505ba", - "792b5fb537e4d27728a633ddfe090341c0562d25d08a27836e6993468386b032", - "cd7416c065b7faa998b61c5ae927a435922dcb8952102e9c5507766c8434f3f8", - "8b51b8e8393415dd08ec44d5390debf67c00b0c7309a7dd161550a67cb5b5dcf", - "86797edc6de9b23860af3627cd4a5f99efbd2b355890192c3130ddbfd3feec7b", - "bab003eaa2938eeace6105b934c1128904da095a18c7f9d7e172bc0835629309", - "6296b9c9ab480e24c71566e56bf0c865e30d7842ff81bb68890de9a2e9dce117", - "69485a08a20e82ffe641e7312a9f1b3901ac8d0819d768ab46ff003d6d41f489", - "0f4554422c1ab4702f5918b015897d79fb65ab4694a7968cba72ad28f8078125", - "018fc9575e4b6c1db4660f8c35ddb5e2e1b96ab5ffc50d476639113b51b98df1", - "c2296d79f53028dac2bd8842fa89e876b8f7a36a2ca56d2779baeb044e830960", - "d202cf7162f6618892622ebd18f04b5f7c5d4a0c088edb55a635558559e9244a", - "1290a0b8228bd07cc449ab861cef5840ed8188d6daf9b28bf1448fa26eb49a0f", - "81e1d569f1df117a8344cbad1dda665948846a96bcfb75cef819b2bdcd60d5c9", - "13256e4a1eda06f14f9086a3e83fa727eb275415ca44e18b0da4312e05da2978", - "2e10ad7ca74048e1b88c59377195a91fefc60e6b444ee40576bf72e66f516a85", - "e6d496a72d332a10881c83e46edebd9c9dcd7e67ec329b5ae2b94373bb67341f", - "02a576321eb4813be3a4bba1679bf0306d05b63893ccff85700b527cbe5cbdab", - "4df7d42d2450c88930a2beda1443eeafc748b4878ed2a9f65f1c82a8225a4001", - "d5ba5a0f8152178dd37f17d26ce2a8ec293d003e22cb0036c2893691a5d1c884", - "08b07004f7c63029c627a61f175f0e60965757dec8c879c0191825a1a17177fc", - "e0063a2faacd4f936c1359262d0cda10124e7eb51fae0f6d40405014c2ea32aa", - "93ef7b57eb4f601040dee38710da4f56a110c7b0386b0bd7247d0cd24c595e57", - "90030a0e2b9b718a371ed0dc0d8e2b90b8231d9d2889b608258c15007bdbd535", - "5d57f59167a2668e8c5586587e35a3b2b413dead854d4b5075a8491ed285fa08", - "15800d4001364effaf9f08b6e576f425a962628e044ef08c8fb8d596fdefb00e", - "4c45b61fd4dfe2fc1ef01f0bf79e86884c096d149a386171873d619f32bea642", - "6f3a45fbb3141e27f001885cbf3e87b4ce2c2babc4f7732c7c427983b581b904", - "6ee4f01c3073b20e7d2ebf8bac8cd67b0f5263afc00576602d5b3a2449fa5069", - "960955152c89bd88814227cb892ae076c5d12a65d93ee77602c94c9cf263d61f", - "bbafefaf0e9b64ecaac5ffa2a3f606fb58b72f0123a8bd9f024cd0cb24019d04", - "5f483d1c1d1b96cf826b507e8d9e7353f2cdbcc88753714bf21212ec94f631a8", - "eec1debe0be421f3d33ee7548d805342e79c38c2731bc0fe2f868ccdb7647c31", - "84fed49722333510e4766a1375a7539fa93e91fc1e8599a597cf11ed22dd7c4a", - "f76231ad3093a92f1e03d3157d2b58d99a85d716720c4034f3bc5566428ff86d", - "cd491c4273efa4deec845eb3840c1f8f02eb4e2e83a73f5d588b18616e8ca563", - "e4a663567f1b1bc4863dd9bf7ec35805e33e8e4251f0603f394aa94b2e17376f", - "3ff20d517cc3fda71e94d8eb1cce4c689326261b837012d590545185cbaa4953", - "04cbe9fdcf47368d8235819608dc66065e636b97f7041b03b5360f100f399090", - "0c11c8c7c1c9baf299a54019c91fb1c0d871abb99818285f0b69371a17daa99d", - "b0d77f2c85920a4851ebb4aaf01312f14a6ba99e23375b7c6a1ff8dcd725da28", - "371d6489d2ed968be58663aa74686cc898f818d105411c813fefe3c7534c334d", - "e0a74d8dfe767cd09a3f3552e3d5b009b7e89c2ff0a66260ca4597171021d5bd", - "637381d4f95ceb27e00370f14040d99e7f353fd74a995ba2d1e0756eecefeff0", - "602966994cee7536315d2aa6df4ddb7c33083baafa9264585275b9155370a5ad", - "dbcb4ac7ad3a7d298948ff000d90728cb0e48f894c77541288174146d0096024", - "bee6a740eb350c47ef578b5df27620d58cf7722e9c95939e0dd9da90c47e5963", - "4128a6f87cf0daae7a21b251573b4c33a1f4e6a6d5cdc1158a4468b1ed87a91c", - "86194a74d09a5da64bf62cbadf40b911b2f0f2c6b8a15c48a14ca6627e9aab37", - "9eda11587bb44df9446fbc1b8c46770554b7c292c4a68e85eaebed7295fe3701", - "7d5bb37da1b33b1254bc3dd8aeaf805da73ace7dd3fd0c3bb4646c027f2111ba", - "c2ba2b86c12c2c738ddac630d29f525c617267d22f4e6bbd45fd173f0e9f8585", - "4d8d0c79893de0d96b7b40e7aa444682fbae5529ad539436dec233e405163747", - "2a8888df13b5e6a6a7fa30b7442163bdb78444483025704d1320d5dc252c2bfe", - "7d14b81706399615872560467a7fd2986d3108df7cbcfb58695f557a7271bb90", - "acc1de2c8ab429a4ee1ca6598686a0605191d42c54b10615516cd71f0065c36e", - "f182cf6008dc761084782eac439cdfccfc494c4871127edd205537582c5d059b", - "01475f671980409ff921898ebb3e82d29700d36cd1a2d478dac4524915f2da35", - "782395411af8373d5c61a0a4831f05d23e9748c6c644dd15e0322bbccad59124", - "27ce03b347595fc96d2814b4dbcb8a70f84aae180b2398cddd543edc12637638", - "f577052875f5f465ed7059e939f418e553d9b4be2e65f7d4931432801f6b22a7", - "139b1417094052dd0d90b401daed2c74165e77e78bb516f25228802d837e1dca", - "84dc0ace3632faf1ec6b64136beda03272cd5e99b492f741d65bc47896bec69a", - "e8b4db2cc7c17a5285b09fee69e88b7df80a0bf519c93ac418d049a03c956497", - "b5ce0c8b6363f33f756685b83ba854f598f40dd17b3ff8ec7ec946c43dd1f39f", - "3b628985d5a9f3bfba92d3d7709bf09fbb7dd91e065b7c2b7f0666294d3bcb42", - "f61e5eadd67d7afea15dd632c6927652ce15e1abe919fe6ca2fd91f456b9b037", - "a2c6d505e67237bf4a090f146e9b2d8a7f5e1dfee1c8bb758140f241f5d0b3b1", - "dc02210ad9242f2aaf880ca3fb01e315d4b8bb35f78655d790c18b6ece0a849c", - "c08b98c4ed20139a3b401d90ec99b71b37de6a58b4b650374745f16a9c7c394e", - "edadcf355607f53c7210904816d131ec4ee2c4f005b88d4b27af7e6f9fd9e8a3", - "5a308aea6028c0322c4fc1eae749563ba51751906dc796a02316d761aa9da64a", - "460105e8c33be319905ef614e10593c2fa765f8da8993e62666e516d00733919", - "f1b6a281fb3d42f20bb83c9b93793bd98f9a8e65ba815a4789ef702b1558e996", - "623527426249480b407a409b69647c3ca94730b80b901717c78275e44e5c2f17", - "0922cadd7279aef3d86836c1a14c9edf64bb2cf39638cd3b7a7cc20b77aa1f6f", - "59b0e8b50cd4a84668e2c2e49c3f9261f9670b3fc3e539ad29bdece0033ba4c4", - "4bccd3907d83285c2179fee4608e9b27115f3655998c13c581941f6e29b8d5c4", - "ec032627e9cd6a619afb96fb6cde7d881575eb52afb2c390f3515f67dfd7c500", - "1b2ce1419b25b29c4853b544ea3f87c4b35d3fb3b1b4d80f63b5ff2c5fc3484d", - "d76b0ab32835f70808fd1bec716fa5494ca5657c39b000e8218505c9f849c6fc", - "c26026e01ae8c06d16135394b51e65f75d7b3756de75f253e2421b34823bfc44", - "feff614c07bb1378548b389a44c8efd2e5244d984d2273b35e21c81846300411", - "cede55666f25e142d72e4261af3c84c068057dbcc1cf28f583aef8e81cd3db5d", - "f5f76b09e98c08154ecef0c635493215f661fc87a52729117975657716419cd4", - "03da9bf211af103f1aee9735dad4983d184ef821438786bf34b255511ad2174c", - "44590449f79901935dbf54b7f33ed9690dac70ff49cfb2213893af5ae768d41a", - "f8037017d64b15af398cf3bf92293c7cf6b9785e2c7ddaf88f9899807c57622c", - "3264e12d1360ccc3af7989b99130c9021b09361a87666eaa937f243a6726487d", - "7758b598fcca376c0854e625ff0c7a8dcd4c169f82e9b2d914ff0658dda2cc1c", - "d67a7e0e2436be1790ac18c1be355fabd708b5ca4de3d5bc3445afd21faa43f2", - "78f2dc68544e9a027ea319fbb969d7593576b807c9488f6b0fb7b64d065e6f5d", - "8c998f32b33c664bdc464d4737bde551a0acb893d5212e9581ec9c837d34ea31", - "babebf3f8b270abe11ea859f3574ba4975c7459d5b15bc634dd6071fc2f70073", - "92063ee228a1540a6b3ddb2c4661cdc383fd1754088d8b88bcf08db062b42b33", - "f081ce0f1fa788812a353b9439749fe0b969c5b6cc2fe3f5980af9877bac0101", - "d20398e913228ab49440334e9399e3fd9c564928e6449be23dce169eed3029cf", - "8fa1c340859be59e8f9a1e024ff3903ed932738d1600da6494e3c6173b5a8b4b", - "8dedf8710f93cf9cf335dcc4a1de929c41b893be10b1c146ad64ae289a23e368", - "99cc92c4f3a6135fb9e5993a03a08cc5d84e2d85cecf5d1224cf70aa1f2b0194", - "337388ef81a972a26dacab04c5b4fe94f08c3783f1f87a584c6d9a68fd8762de", - "f1613be27c924e24b73f61fbb83fcc9777980917c1ee6bc743d8c6b65b4336fe", - "a00fe04ed79376d5c2ba532d28bf22bcc11aea49d056bf644e59977b6d5f7489", - "7941537ed97b670773aac386c4355f60c999505bc264c73523499b936cf9fcf3", - "b7e28df3e4dc8d8d9eb9153b4e8c7aab38dd4c4eba9a6160cb91f5fa7b8aedbd", - "7860b3a473709a7fecf5d047f84df4f7c3751faa268e8406594cab0753689c4c", - "5e0652dcb4c23ece988e3a79b7f9c76a248e78753a56db997a6992f860be0112", - "0eafa532429e094180a725b77e0cd5b1d9e4a84b1a5db9ec2fcc643db7d0c53f", - "43c96e6b141d25ad9ae46b1f8243f1c73a2ae0b2a66edfa3451b7129e311d08d", - "22b42de6d3cf5a48b50138ddb7da9a238e9f696c4cb279f0ca3512f0c6034be3", - "d238d78fcd297394ac90bdf4db8ba72a3a14e2436d15416bb89d58e7265ee686", - "df49abd33b2fb28c298e43152bd8f8dd93988a1c13a7ed5e4b548b2c86478abd", - "271400084f92e4bb7905eac28e39c2868e3097133da07ef92352080654dce5b1", - "238e7c990b295b5ef6e12b35bd5c00d9fd54a5e4ff761b8dc56aec33c807dfa2", - "fe17425edce3151ef1191079cc625a7933d5e463dcf04ee877bd703ee13fd589", - "ffe0ff5b0dd23c15b48660ac83cc9cf81d923e7f59a3869df386973df459de10", - "173058072a29f0ecee3810082b075e166f0820109e0a0024b61215a16643fc90", - "7bda1a76c69ba61f86b96e6e036d438fe208675c13bf07e29cd0ea36752a2d50", - "82a9a0088aca212a0adbbfa3ea6c7cb75b48220c5ba0ac5be9849956b5c5466a", - "a47031243774f7de2d66276fdc0d63c8b18e24145e27586452232df161ae5cfc", - "e59a40bc38f1b09670628d73fb0c3a4842ac7eb46760b8eb9e1addbd0634a58c", - "226302aef1a51c6b5b61e9766c80c52115c5ac6c5f1a6643efc38abc5ac5bf06", - "fe9ced7d66ae92a4634505abc40dc4c11ff1cc406de2888674c8fc6a1acd66cb", - "bb2fab8fafe0da12cb292cb292dcdcc9310366193128d7826dd447a1eba05a51", - "337ec63a3fad1890f4d0660e7432b8915927759be1bc1f10c613980f353abe0c", - "fd4841c9d948d1cd1a54b1f0f3d23e063ff91dd91e991ea87b55ddb822f2997a", - "cf8fb95bd189d1c9d0613f2ac0db36f0ec69279282980c4b99d5ac672f668a01", - "f0d34e87fea61be700f042110e1e10d788db3d993d00b0598670acc4b5653460", - "f63cabdfe474de3999edc82511b2328fb7dbd659e48531d673f6b74d2344f13b", - "6a63a95be7d45848d190487b1c9538bcf8f3fdaba347436533018a2298a32ef0", - "2d2ad9b631b24ec8b98bab767190370c0b336418cb5c81cbb548c12a7bfad2e1", - "28127ee6b57befb302df07bc77e77ba1ca97f98e073ba2d2c6ac31e20a496d33", - "ccb917c76768af085b14786411afa589fa73bc7933a35193e2c166c1d84b82a3", - "39f4b17a668a313e309cdd00c16d51f1f90b6a04371fdf7aeb38f223e43e974c", - "842c0810eee32ab57a0a2508ede66d1434f74f346e2faf6a03e6c82e1fe7c36a", - "50d26785eb4aaa6ee902bff614f3e92aaf0abe560b73082af04262a6d8b913ad", - "3d495c2e006e4cd9cd915e466ef7348d1e52df1bd704da437c5ecc564a86e258", - "1638b9898db44558dc5533137b89df0469e6c4bbf1a52c0d2dbe32a1be8835a0", - "dace28bf7a51c497c5d70ce79cbb1cd175f5d87212afa90ae656a8c599a9fc78", - "c7ae93ea6d157fd26c60c742a97a9a11fd59c4cdc49093307bd890fe643f9312", - "1ca61e811f855e712763dda4d3c777e75ad050a47661b095777665993be49dd8", - "63bb425aa004f022aaefbf6163a5ef8ab7721fd5b1ab4d7317802a01895e63b8", - "13785bdba6ca42cc2577c3821def5843b6df68cd54a5e7a784d103586e98187c", - "5c457ad55131c6bac164e4c5488d30e76fc5ad2c4c0efbe99ce590e1e1d1630b", - "6aefc6832d17c7cab16818ae871ef252c0c4d656d744296ecae74187a1f10072", - "31957b20430c0205a6c282e20a8ecb03d69e43e5ea450a5c3767b5e72d05de5f", - "0cf045683c5c8e9d411d2fb7ef3a6334d54d57628f69d5cdf2c3a6b7beae1a19", - "ec4a9920770a89cbd924fdc85687137bf81e78eee608fdc4bf00eef9f5f2c3ed", - "4d58a127cdae4f909b67f26803c0b2ec01d7b3b66ff64bc7ca2c76c0f987b2cb", - "a0b32677709222663da63e4142e9d00392709f0f1aceb08b55a4741a275c31b6", - "882757b94e235ca8c2cd01e4b40a72d8f3fbe693d3c47c078c753bf9c2244afd", - "9f832bb1f6f8b0a4764dd48a08157301b0410944eb37dbfa54a5ad20fd650edc", - "02db34accfa27c8b7e9078c5fa5f380c41a22d849fc74b10fbd5d108f25e1cc3", - "4c57c188df9031a9f6dc4bcd936f024d768da1ebfa1e97ccf9412f66a2b44ecd", - "51d8ab65748ff1f9182929542fd1164296c58668f785a74c381cbbcd75c0dd9a", - "2b25368972ba3f7b55068c5e66bc855040389a9a93309233fee189285f4f263c", - "1beaafa0328bb1c62581f76dc425c8526081854d2f4b7dd6f8dad86919c81f4c", - "21c66b1c8f61b76e13e1dfe81b29473092574f584e86cd6cb76c430eb997336d", - "032cfcd53a24358607488d1b7a4bafa5dc2c77ab5e577d22b3f28ddf56c36661", - "2c10df0b8b6823ef67552dbf5c604afb91ff2a442cc0b121b6935c7a2d4b5619", - "aa34d14b8e6e1490126bbedfa869e05fe0c0d6df88b9163dbdda185924caf666", - "3097f1d28c65ea1ed2b591d1f6ba8e4e66fdb0010f3088f737648efbf96c41aa", - "8db10c2fb03070f269522d6e7f70fa86bca0ae6c0df3101be2bd303d716244f5", - "7ca1dd9f4bf758bb5e899b5df47c15a662aab816e803f2cece4073c67f5dbff7", - "6a6720629cadfa53f36797339a21dc0f879bbcda1561661c9ca174335de58328", - "8761d1e4bcfa20d20981e1c1bd217f26afa89057999139f8dd1b000695d6e40c", - "d8f1170041240e9c73fee2fc44dc7922627ea858ed529fd31f3f1338b8aa7afb", - "753a56401d91c32b35cae39aa733d4dc0b3e54c8830dad8ee77a02bc0ac22048", - "4e9ead36b334a299c91e87b5f12222f62828b3e6ca27a3e1dcbb3137cd0f0fec", - "a40c850ec17427dedbf4fbb156306cbcc3cda19795b806345e1f285a65673bca", - "82f40dd5c370ceb33acf84c9a81554ca2c15df08077e7a21652210611467f182", - "5dc8414e6bdffdb3d3bf541ead58de3652bd90028e3bbbf37f51566eed4a13de", - "9bec5ca4872de4b40401fce2208e16e125dbf35c24dcb37e057c76dccfcd1157", - "1337a1cac155b6f64968363b2e2b032143334154e39cc4324bb9cd78f4bb6191", - "c6a7788a58112aa1024527e1b5451038d791c0bea58d8f9b4a542f99d1de0a2a", - "22de99900888644dfcdadb6e0759fd9b43c8edd0645b88616467a4325688f8b7", - "b782889cd0b2ccda9ff9bedb24a3237196c4de61ecc110d7e14533bf3b590bb5", - "ef980622695f6769d9c737bdfb65388a6aee326f6b2459bd92584cc8c6f33202", - "f2291dd7aa5ef0c2b4b140555ed189490df258ebf7bb51f817a78bb86563abc0", - "0c900bc1b5084609849f1ef13730ab5b2ea9ab6bbeae9b23c540349f002e070b", - "be210c6fbd580e396dc3a42a9a4c11e92fd693ef85e3f551a00bda9e17ffacf8", - "05c8a764ad62120665590b0e89e629cc50cb9c297c07087c5db73c8c87ff54f0", - "8db2116fbc6420ebab2039153407471d5526ea2f25541b3d49985a7dd4f81492", - "bce4997290a6d05a7e1e0f9cbdd321c10ce260329eb209473c900e56160eddbb", - "d4b1da8466672d368f9bbaec1bdc6a02ca50869309d5a5a5e8ee25fcc1131e70", - "e7f07477e5ecd600467b7b8963c844bab459cd0d1b1619909595a6972730c227", - "1a52f41dd4109cecb082f51ba05c1fea099228c041f45ad2a11c1a42e77d5eaa", - "de1f85df92d2cfe743c4c110e6297fd9ce04edd1413fc3d1566bb70e01bbc106", - "f6c1dc2a5016bda8231f1e3172fc9088d56cce68e857b73eaef099e1af37eac9", - "75c609ec875494efc88ad9da07bbcceae0ca374e8067f227456fcb2f3015cb5a", - "1e8e05a73469dca4c33e3148387bb8edb8b1ca021861ba45ef9804646e4c4c3f", - "3f4c9168ccab8040d5c6efbfc27e93ec87c536be9c4adbc0784d448a80b5ee14", - "8104ff1078b70cdeffddf85abee3cdc398336a277d6512ba3852f3f31944418c", - "0db3c1f3c8197db3426528105ce554071749755df529e8041449e75b27dd1519", - "d7b1b4a8fb9be6c25232ead78d0b14e3ca47e32e887acfe8dc0bb94eeb7c3e67", - "ebf3fb781a5bc65531043d0a0fea0e3411ee47bca3028369c54c11a604ec9ea7", - "f3d0559a0dd2fac80f4bf0f8f830c12178772572747cd11be3d7c26afe4467f4", - "dd0db5d3f1fe246508b1225b8d310111bb8c4d1e53367fe6d3e733d699c2c59a", - "b45996d544f3a4da849bf0bbf706385959540a30f53abc86d77b16d283c24643", - "24b6f8b56a867c982a51b6d20b8d26a8fc3357a0ad9f4412314843b2003bc33c", - "597d0830bcdd062155e55aeb8485374a9c0d58fe9c85e081b6bf3ac178dc92a3", - "183d29159d7039bf5f3fc910c6af902f45580ab8847bfab897cedded4b2d3745", - "e51be04006a7267f4242d80da60480e9422f6eadeba80f98d836186452b5e420", - "f6bf94e0a6b574fe950056fa9506a12899c9d6a41e134e092a293ec584c347c5", - "64757e8bcd230fb990ba139c43022ff50d224e4452a51f34d50db9fdecdf6593", - "dbada8e3170127c60efe3b08fa5a9a98cc7c4d958663984258fc967dcc904a83", - "b593db01389b7b4f47de248bfe1774caad708ad2244147fe1901863ad0e42a3b", - "77886426677d12e2ee206b6d3ed6c5691a4252576e0e9ae12650c55a1c4a8878", - "7790deacfd481366a355abb4648e2e44674dc3e3029af992c6239ec57f01517a", - "9af8415369f1fca18e976a8a2f4c15179f153973d8b7d15b24f309cb0d8ecfcc", - "1b257cd3f2cc373212aed0e828483f7980f53aada0eeae3095d44a8ece5739c0", - "71fa61eef12d4fe9379f72b134e1983172332046cf4afc3e712a5543e022c993", - "c6ca0f3d4a6999316d44737af17fdf06c0762d84e269c32e46df71fe5d4c3f8d", - "32bae22cf604081fe4a0225f34e7f72e61194dfd6952185b2266a0ec26e7306a", - "4a9364e50a14751fb87379451f287c08370b3b6a629621e57779ab2e9e6dfe57", - "682e179702a288e40ed1d75a0da4cfcfb441999560c441c34d63c59888552e1c", - "9c757c548aeb6c5b778c0e2e3ae4ad17d18ad08731179b66dc5c30e694aa8abe", - "2ba5c93cbd8b8b3b877788edef3bce012e494ed6c4e91f84d253561ecb301463", - "b2275b463726eeafefd3a99f8dfc736435cb7956e96264fd7c88d3b29bb42a58", - "7607c93fc537162f9e93535e97f3b6f9ea432b33ff1d37456ffdfa5478fcfa25", - "fa16d19d719f7a26a81f98c903ce295befdc19f5e0221b0fb8be99fbdfbfd688", - "932eb83feb7bcd74810e3c36af4536eb2ab36ab433c6c32afb8f2ee47a292c9d", - "2da47d50f425752b33fe77d1e2de9985c7366646495dea4a0269b00c27b4d18e", - "3c4940f0e7d8c3752783af0fb5392b1dfd94e61aadea607924d08581c8971c64", - "fc906707a916729165510639e70b62c4442f43522b8687f583a05158c71a958b", - "7cc0805c2796c2139a3ad72813a9f6c9b967fccd7940f28a0ed46662edf86fb7", - "b593cf41c380999d8568b71620d05b1be6aa5a867474bd6ced8102fe628b133c", - "3d317c8a7de70e3e0a7ea36948dc62ffbaddb0c2f6ab332cffb608117c88354b", - "9d108cd26a6f363a5a66817a1b43907d5a29443b219ed06772857756536eecba", - "739e365c308b06d3bee14330e2029c5f967b1272b61a8201eb97db749504ce53", - "5e68556eb46a0a4fd7f270976b65ec80ef55106b3b1ca88a907886d8ac2e92e3", - "568103cafbdfc7e9c90f01e571459cf9bd6e21372f0fdbf5e2f7837306b612a9", - "6090a451ac41f77e8eac8d2f44c86cf666b9fad5d811731535be442ec2c0e452", - "3ed1a7484b2e590aac3336f3901d0a698059d23a9845a5007d0047aa83548ef0", - "844b63c8ac3cfc4a27b0982f29c542a808df7a9a42b235061350cdc51bd75f2e", - "016dc411890e9e77ac6beb918b8c6d4b47314437287b6804f6c268fed1e26a55", - "e8b219909fee584f65cb85b1fde4bb1753b06dcca40ca798f4c0e9862c89e3a4", - "86d5d600fd77fb2a03b178276d0fc331245651b4ef55e23b3eb623671a6cf30b", - "ace3788e6332d9b0334a18d385d77dc691c86140778621cd974e1d78830caf60", - "07a862d06ec411cc9f9d4dd33e0ef41c8099e09445695995abe29c03765c9c09", - "e2643d9df78b53b20d0897ef28569eb03edb1ff8dad381b1a04b0d429b0d049c", - "7aa88862f1e23e292a9967a3b7b895e1dcedb25a61771107a70fdf276c071fdb", - "5883e902569b27f5ad93efa4ab16b4eab05224159b0c7db3f5bf6e4f80380ba8", - "b0cb6ba5e7138621053ec94bf121cd4cf35655882caad8e1138edc1f60011735", - "f3a9605be8faead6cd1604cc1a4bca01eb1603f9448fa7fbb36a7a0cee698bcd", - "08640a8774f3478ca0e9a99f538fe56557812640ca3bd2baa93878d31d6d48f2", - "b59cf118ea64647ffed0466e23d85a5ea7a39e8b093da7ae654ad577a1b1272e", - "b2f873313a056d377eea670ec795391be63ef4adc9d10011b341b15f1a4ac4a4", - "2cc1bfbdb8e56e0b6e52ee9362e38f417481d314603c3de00787cf18721bce36", - "1d11fa2f221d30f7e71616025e13f343627a04ca256e6931193548aaef2abb1a", - "769e81ca53227d5703f74523ad4de9eb1fb7299683dc2c81bfe7101229ae3a34", - "223b22a077046fd304b500c02d07809fd9f64cc724620548d4ba7ff2853829f6", - "5a39f21dfc591b9c3bed6352784231773497e26b35338024a9e32eba04c418f5", - "119f11d724ce00c9103b9cbf5953c579622d98df7b2c95546550de51474a18eb", - "f47185575a15b189ac866681d3f8074d99cb718707e929018922dc9ad685729b", - "ed3148eaaa21c231f70c7fb3a17ade84a8981137ea19f358d978bbe466fa5884", - "fba5a2af45a31d94989efc773a7816e0b2fb95a950315765fcaf917d7a7ed645", - "589644a5df26afb2759c404848e9d7dfc3935be75d1b10768135cbbfecf3c1e9", - "d76223e39f6d6379bca43fc686510237c979aaed5dfd0b80c25c46d0782f3af9", - "ce6a1fad1c2d51f980c9b60ff88bfc195806249fc015e8dc6e7077ae2c2ba4da", - "65c5ee208b276b3388e9a00923eb50cb0ada12e9f8404601149dbc7df24780fd", - "13871358705cabfb5174c3b50791381da6e2d88e2b5365550af43d6845a9ca25", - "42d7132ef9233c50bd9e0f18dcacdf454a062e21158feefda5b70bdd9a2172ae", - "e0b261f8d705324023dff606c7271c715d79424add96546c49327a6655900c1a", - "84a5a9565cc5e9d06b5ec773d7f2ffb555c891ac6e603af974c0e37370270f0e", - "8adde8e121e6a604817dcf62974e76dc0fc557b006bf17a46bda07fce8096b72", - "82f341813e3957966847d590076ec5b78deb12f868a24bf89912554313441c87", - "8e0ccaac59f9ea909b40d8dbe8fff7ac60a14bd6f34a0c3c15310a46d4ed153c", - "95dd113111bd6ccf8628edfa9db4860ceed6aaee4abedb6f3641397e5ebeed9a", - "279dfcfd39d8c96d0cca5b2798971b2b9e96072faf1a15a46750ca75bc2e6abc", - "128b5defc620dbb2a61c5360631ede17429c6adf7144d0d79c350ca5efc24cab", - "396001c97784aa0f64fa41a3ec3f64a6505db4a88bc860f78f2e4c452a7aa8cb", - "461bcefa1f2a0718b590425ca5f4b1a879c8991671d257fd34b5efb00b950443", - "0ec962e2c724a8efd4f7ec427288a1dbf3a2c335203d8a7d67ad75610eed82c1", - "0bc7b462e78091c574a08075c0fae48602016c1ba10d62718f09eec974a24866", - "bdee17931207c78b28ec5a4be676baefc4b7fc595f12862bca556e707d462fd7", - "997bf911287de58053b8f5a211afa5e128b79a3913256494ce2ba17e0e5de5e1", - "88775c97042bf660462fb5923610d574ea3ad63a7f9f6b0e249dbfcb7c0fcb04", - "f9d2d6552dbba446b7934a91edc63f4476dfe4bfba921365f44ef43a7d5fc656", - "2a7fed89c524d22d178731e47ba613fb9c62e54c83042e9e85eccef0ea94ca18", - "4dd6884ee94dbda7c51da4a5ee8cdb5ec828d6a0901fb0f59e766e2caa44af78", - "8ff403911e4efd9ad72ebb833b8601dbd40fed2111f85738bd510c693010f34c", - "13c65f8259d6d4a75d944e04ed47ad969e9309be9c0660909a38fbb530af2cb3", - "596d7d5bcef23019b5bab259922f5978c03cb9bed1a02d5196218b2243f6ad3d", - "b6b11ad094dc4aecb4abc0839b42647e73990ce3d89e01555a2776f8048c1dcf", - "0348b513fe724dd4e4753b7ad6171523622c8012a87887f8a394ce7d897e0670", - "0cebcf7142f7c0355b36a4a61c0207a527fdf8659030d8e1d7d34168b7997988", - "c7d61011b7fa68709283440b55012ff77cff78756f648f0ba7b2ea17a6f38106", - "349a5bc63aff2e72d3c25604d46c11174749e7f3d669e1b0020b22132b33bab7", - "19ffc7a79caf3b555df5ac4e13f72d552cf10710bdf1994aaa5a40a215cabbba", - "edd2ab44ad19b9fcf1ef4fdc46450d54539c9d6059cfe653439862a19a032432", - "9d3e273b4f1ab6e552d7f1b42e808dd9cda33a6d4e3961a31e8f62b61766cdcb", - "d4c3c377d0125dae20a16fff18f759699793b26fe189307bbd49d7ccb30b9bb6", - "11e4639fd84683f9e66a2f3aa33f8f113d34e306191db1aa6831e9b321d9b87f", - "bb45179ca8642a0c6b36a7a087b8e1021cc0880d3179840542a44cd16d40c550", - "617d968abf316a7dc599f401c4e2becae6a1aa3f375ec8c4669def32d846b429", - "dd65851a9f8c0d69e5429668b9e12f11f7124c9a5955b32431f4490c74c7e8f2", - "617c7a69d5a840e834ef5eeff820444e9b714f05ea551b4b29c600e350c7e78c", - "4da21a944f368a9df10a757b7949f1bdd396a3883b20a4ac88ad71192d70d52a", - "f5ca06aaffb3aa0cf7b72b6c79c122bdde7722bacc10b856c8cad6dcc375f898", - "7d8e7834394a82914a0449f7495d345020c0e76a105c19b7aeafac2976fd6602", - "67fdc4886967363b8ac6e69f42f0a408bff34c1309a94ab3f413ff444fcfb322", - "1e6bdf86d3843014999407c2d1f43d2cea87d9fc2d7f96832a290db2a884348f", - "ff9feeac52b13e1100ccde2b6d5877a03128afe1854cd0fe3dd279eeb0e2a88e", - "846ff3987165445b51f63224df2052853fe73cccad41b2bf42f0ea48f5fb5726", - "29b6fc95cb5e14ba29520248622972b6898ac0f191935e2a6577b8dbcad25126", - "541a5be6485718ceb6fd1e494d0f360109870eff4e85edb2420b3fd0a4698c7c", - "949bcfc993508b5445066b8a33f77bc3c25962941e76c1faada59da470fd181b", - "cbda4fb175697de10d606789173e34e151bde3e34a8147ee36978ddd969fb0a0", - "8eedce4102049fde390b52c886b0020878ef4c2c9f3eb3c4d2f49068bdec5c60", - "deea770148ef214b5882bc03c0333d2e3ae043b025907b59fbfe9a52128a7703", - "7a562a52a2c76280728f5b7b56217f062fe3549c0eca9a5c87913f48a567f714", - "bb26e1482bbadd7cde4577877f2feb814414f1bef0656bee2f52e2a965eee562", - "2d27f4b8a954898ce8da65d58f087d27df9b29f0947a0df303bca84a8b493f81", - "82e89ad16f88b312bd869514fcb97cc31c478e6e081580b8e664c6d66e965993", - "c8b0a91039fe8eb4a6269a56e110e9d6bdc80e327eeeb890f953db1f54779df8", - "900ef0b27a7c693ace5ab0d5fcb81a55517393570d78ebab348148fdafbb7596", - "bf8a53a04e355cb90e8c66fe47d1d350b9773886f9d45f6038fb8a876e24d394", - "7430abe5b3e1afb7e5f53f362e31c66da2abd35d5eef97a65e750f21c5ccaa22", - "8676254907abcb3559044bedc788964daf7b0d03140dec3f2edf230cf7b285c5", - "183f4abddb7116975f8f17b0f7347589fe6e9acee33b65b50ccea13bb0c5da06", - "e0311f15964248a6cb0e072deaeba5321d3d829f1e742a916e8d1e31cbb63d19", - "1bda5ee6d342fe26e7f7d467438ec177a31637c0d5247f404bca55c4414759ce", - "c54133ac7e42b8c243509563f27599f3e1cdd753d625e24cc3b1509fee9eb232", - "b5e89d6816483adf465801ce0866616faffea06b7d3710942331c4c548218f96", - "43d17a4a8f89bd70a0692c6b4d3e4980ac297f67b77a90cf61bb93c21d8239f5", - "10e6dc55d44cf90dcffe8d6d857057b8b7c2b57dee7a0663f0623092ad49d007", - "a6fbc6a5e87f93081ef8187694ba80a2088602ab1c1f103505802a00f33371b5", - "1be611fada4cdc918c5542ee9f8533c3b4d9fdf760cad152a505bc9f71e2df5d", - "22f286b58468f7bfe6637ee0763672d0e017b4f678a6c780616de8d200d70851", - "2beb166461f9498cb98c2449dca33b8a211cf85c7ac66c2733c836895cb16628", - "7f18876c48e5af5eaedbec0328920275287ff23f0db6a656aca282ad0f93d74f", - "71e74dfb5ab268ae6d94893af0333df33d6269bcc54aab7540ae196b38732855", - "d9771b8192b1e9d60da4e67276ea7a3fc2e0644662c348b4fbdf0df69db69f40", - "3a5fbeb3209e884215bd461908cfc8256c104eff4a79c06a11aaccd317e3fef2", - "337b2b5095b9d7af185ca267a0c0046ddce94c65c249f3de43f357d3ae7200fc", - "d4c1bc3d13544a0cbc2d92ea047dcb3661dbfa01a837561ce9a0ceab684d2cc9", - "bc3fee392fe1c6a021132fca5e74d5868a67e1e7606226b81d7f7591df54bc30", - "495cafb9143e18b7ccd323636eb1e476a61d5883412b02eeda45c11024aa5421", - "bd01f04949b4dd88711318894ae8e7c762a96798dab62fce8c50a9110657a4ed", - "5f90588641b6c8d892bee98f627f3d376957ab9947434d67127d68bfff3bf046", - "20d83a3640280102f33d7c8c5561646f1ae52f92c507a8e20b7b38dc71988c4c", - "f183d7b143434d73eff152491d80db425ed4c495973fd5903ce7563aa924a05c", - "5ad65fa0f806f4a1d7685b1db91e837b6ce426e0de3aef08983898381775e6e5", - "b8dd7ccdff80a5378c37d7128d6c38d1a6c47bf6858b106289906283fed14304", - "04223dba16f172d89d5583e31fcb07b3c442aaf72a59b75226089c75f78a24cd", - "649e147da6eff3d01ffe70f5bfc33f23bf94af9f03a5832aeb888d9722b014d5", - "2fb169d8168a16899f27cced75647067e2045f1eea8eb3260934c6cb52e6d55b", - "f38c094a5799a832754f68b43c8a026499737e7c3e55bd76cb7aae01fd4a9d78", - "7ee90196dc9bbd80c566c5047727b1f905fbe16c64b377b5b84bd65d7480b180", - "b4e1a30be1db2daed9bbbbdf55bc7f449e30f5740c4d3e671fa993a374b3417e", - "7f5fc4684842f6a7ee8a0a0f36e45114a4fb093b1597720050ab18360aa4830e", - "47b3775adf9df76ec233e5b14f0cd23c77184ec8dbaa65946d4487d0a4a2a0d3", - "c1e696164a31a88907996ad5cc7b5bdac3c23480458d6ae104206c5baab0d90b", - "d6de2beaf9ed90d5b878de099b9b611b8a68aaec006630f46fbfc474708c3f86", - "920781d2c03fa408551e90d290db32f37fa9759413b62894bf45e93485f00779", - "fdae1738022557e185281b5f9da64821b01533fafb055a0ef65c81790ffd074a", - "f3b89210281cdada6445417f749749f84b34180e0f408061db9d1953a660156c", - "f04f8d5364c50e13f2b77aef7fe6818ae61f5633f433cd4812e7cfbcc12e401b", - "e9dd640a0cca4704f7adc87ea3cf3aad9728cacc9aff9b82be4fa84daafc3f92", - "4f32edfb7ad7576ce574bbbbbeafb62365f563464310992f284df98fb737bb54", - "9b6ad190a86f955a6c8c012a71050191f3f356f81f9638d9113064201932bd72", - "8a8e43ae1c5fb2fd2f4bb46357d00befadd6f51213e0c0b5118eab414e0c40a6", - "a134eb7924526eb81022ac280c754704de562aeba259c7d6db0c3321287029a8", - "24b04c3615ee2b6bf993a7fd46a4b887f94f5d53911106b3734e9ed33286e80d", - "fe99fa5420abba00300e303b6eb53a625f645fe0d7d41ce318eab524a3f6b49c", - "c012675226c99f95e47fef89c2e2cb5eab1a1251b308de088ee44dbdbde41b22", - "bba8e2d854c03e7534a6e4dafdf90b07a6beaae015afd310c3184880506235ed", - "7ca0f0b32dd329101c2475a56b584d2ca28b0398e68dfb1ac472597c0ac43fc3", - "3e9adf80d898a1c7f01705638398e2db727cd169abfbdc081510099e83e18050", - "48adc20208df3f90ea7adb3d0069d3cac03594b9b5a090c9534f3f282a41a1eb", - "8bf09e2bf481ab193a8d8193cf5463c32eceb9725c853baeb2755ea326e74266", - "9bae57d49a065f68af4546892f3b013b727a15e5d6e91b7071dcb1e0228ef0d7", - "6e336cb89c285b030e2c0de30fe2e56bef755864ce380fd2323f82872f402584", - "2f31c22c39e5d4bcf29211be64f16d59e61a1024173d3878e00a07cca2efe43e", - "390cd20fc1ceef3cb6a9ec77309b74c033ac0d7ea7d7734bc143b4ac9d437298", - "3be62d5a2f2c93699a2238743777a95f214566ac32284ef642474e32e3123d52", - "96488cfef38d92e2138d283a086f3acf96598b07cdc12f51dd6dc769f6f0945a", - "b4a6b02905b376ba5f2e25d9e33b470cfcf95b74aa109cc964db6a22f79fd001", - "1d5f666221d9aa57f01d0e6d5c659b9877a2f79ffb59ce17467ffd73ba604c11", - "0c5603f081d0dfab01615aac7c425ec2fced12e5eb51eba1c8a7c6ec67ab8909", - "3187aff9605604b3358e893cbba7dc7a178f6037199b4d2b116c86ee491c5220", - "2b1638adf56e691d7c78cfbf41a2c56b370f87f53fe07ddd514d13d7e6b713b7", - "ff86fab3b4bdf2d6cd97336aeb0810ffc92486c552d741751df07d55b1224464", - "998a23882af32448c04d44dc8bc8c19b62a57de1ffeefa5449a76628c43cdfb1", - "83d219ab2591c8e539ac149caf9f44e68c511c731cf648fd5f93edc66a0c7cd9", - "8b1a5fa400274b8c343ad3bfab394484f49aca26ac8652d811c693659057dd0f", - "c276632a487dcc28bb605b86148dd017a3ebd298f269840c8fae36208c10da87", - "09076f243eb3cb34d3f192e326b714f92069e6438e048583481c0a8ca24f30cd", - "c9c2b823dcb4d677d46ddbb6ecfebbb5c7cdc6cc3355a3141ff427bedc9de1e0", - "e8d6b34ac256e511f725269418c692f52145a066e1ae0efc0b533a4daee5301f", - "5be327d960e632dbd911874c56617c0ee6bda9f09b94eaef8030d06df56afd19", - "afe0773facbd47ce35c67fc3dcccb92086ab576fcea5d42bb20dadcbfe23d452", - "60d01097bad8b77acdf7684e742002c818e24560dec4d596cc6465409b01f41c", - "98e29f6296e340fc1d8c2d78fa56d7c5159f609b0c1b86c301d01bd3c583b3fc", - "bcd3223bf4eb6e29fdfc3179c4a63962764961cbb784fe174a4547711b586f2e", - "df9e467900bb86d63cdb55ce2546ba58c030235ca2dfc43cd8ea2528a32c0e9b", - "d6305dba2927a32b1404a72f9f1b93c5e91c5a925e08ab3ca256e588f2703ed6", - "bae602d26495c28dd696c00d755e62c977d6d7c9794835762940940f7685ec8a", - "83e396d1448da834e06ba61dc467dd6bbfc26e62a700cbde7e47b9d4f819748d", - "caacf2de83a573ecfc5abf58f7451b49426e24ccf8af5ab4df7634504529fae6", - "bf3f5f01c6694c1c2c1974b1fa4d5b0a7a54952b9b4a0114c2da576cf5b2c788", - "dd1b52a58bbfe83077798f451fa081f91dde03c4d0cc6bf3aab28ff9ee1ba823", - "6876ac4f1a87ed0138745b5bf183bd166dc886da9fb1811722514b52816b88aa", - "a82068380b31a6f9c4496b2616e78bf6e0a25943c6c22060f69673af2b48db4b", - "c5a22393b546a927c6a3d80e160b80bf45d088214694b9608dfcb9446ef10abd", - "563ee22ea99b90576d1517517fd79705300d924f81887a1d4875f04d65deed46", - "96fece6108fc1e714fab14441189855d61c58c2eeb3513da396aec2c47e281a3", - "48ff09539c3c5f71baa40891dc914b08f62ff67662c17b5d963f184a414c3c8b", - "136cae98d475e921898889145247f12d630c5bba3aaa0dc3e9e2953d152ef9a2", - "6cf4fe53be21ac2f79ea09f285f5103d407a6fa65bb349fb42d790e86feb7cf8", - "29df410575f964cd6c3c5779a3a0c808a4884598d4195c42725277bc29a7e593", - "d9305b6a3563a466748c5615f72aa3e3be513a62831c8642ec02737618eeab1f", - "27fe11b74d094c498d27e775dd010570dd565ff8e605bda61cea70a1ad8775b0", - "9a62c43631938571d9db2bdb7fc906b49335a293d607ed66cafdccf3b79a0598", - "5fb545d87c91562b4a577abe87e2659afdc38ac5d659af1367261cbfd111b703", - "9ce9bb7088addd2ac482096a5f339e174ff80418271d27488573a5e19d2a1eec", - "ea59a0f1afacaa8c90a48c3ac8fbdf5c85e4f6fa05f7b26cc505c6af0c9ed5c8", - "18cb65eb5e85020888f43f8f7958a31a94d4ffd19b8adbe4d88b21f44214d93e", - "1554b19b173031c30d23c7f6694ca034b756745fc27227c45706cf5484a9cf10", - "3ccc6a4bf8dd1ed04c541858f57d81e2195e108bec93a15d8508deedf27ee515", - "bbc863de180ae6118195bd9d46c632062ab8db284212fd64cf32ad668187de3d", - "3102614e98aa385a2934c75feef6fc2f9eb3609da12dd01c08bf1ffdd637beab", - "d981f198276c20709f9fc74b1b97f37aaa55a5fdf78ef7a8b8c86313cb590612", - "766e16686491a7cb310a85053df8fa1e57acd4473c51aacf293033168d60bc01", - "3e48397b1c4102d68e024d62c447df08b4b1472809be33ab87e7ad1f9cdcee7f", - "2c170ea32898d207361ba1cce2e8bcf56ed6e2a21e759490292a58a63fdb08c5", - "4f9275f0e428d891503f0fb1f16e0ed3474dafe0560a4a78d5e2a4e84fa54fe2", - "83b6ee8d7f44b3979606c770806c34ceaa504de661538555991e1980056e8a9f", - "011e2d3afb837b5e7e16e1ce42a15564bc8d65b153b63fbdf73d85595d9728a2", - "7569b757e1b6a8f22096b97ceee993348f870b8aead549954419532b70a0c33b", - "c7dd8b5d1da17f9cab677ce19fde1a533b9325573abd40677a539122ee6b693e", - "cd1d33f69dccad4667c95183265be14e15d99206386cf3ed304f083d8edcc343", - "0b16b36f69717ac1eaa5d005a4caf0b81ec0b6fe1542af110875b3b20e2e0436", - "3f0c1737310fef68bb085db510878d4fb00cda54a69f4ca0bb86878680dab4fc", - "a4caa5a4ba15f80c6ae411c24067d33721e0d46af79af96a2d1e29e3c23335c8", - "b682f682d35102fadb4f70a0d5066d4fde7737bc645f46f3a55a7fbf71546d1b", - "75ae4ab3c09633e531a13106aa063201295b5d4187f6c3e7651c4e696c9fafe3", - "7a613582dea6d16d527d4bc5fcb53159e4d150548574b8c219241bf9614b2f74", - "54f8f00c0a6c24c36f1cd823d74f646f995a939b0c0b0f4e7f684dbd7cb79c46", - "cc934230672be8437c22052676ee2281a857e23eb55f6fc17ea65f303d6c3386", - "2cd80e02b630333e6abd24c4eefc6da74ae14ec68e5905aad44eb283c0202ca4", - "b051b74d3ac25d3bc35261e115e74a48e90590fdabe8035b30ab2de5854f4580", - "1f3c534b54d13dde42ae2486c97170c8f0650fc82128ef2d31306571c7299181", - "b28d6271fa3c786e9bd97eaa62f026d4169d4d62c7beecfe8a27b5a3a2e08290", - "e1c5de8a8252079f2b42ea22e232a5391cedbc55aedc2c93d9c9a48cc4d147b5", - "9b0616432af0f311c92fe4ed2a1a856f65179c378974d71ab94b04cd41e7e86b", - "972c192ca7d953dd5e651b9bf715e9e7768a0105ba2bdef18ffb01ca0e75d4b8", - "f1906042db05c0d711c832a64bd94c7dd4936120e28c20f23b9e00408d630d61", - "e332b80f66851f7d1101f6801d6cc6653df4ad2e6bd3aaecd44205fdd5fb1655", - "ce0c59a7adde6ab1114e4dd72fe8dcfd18bf42a8c263b6ca37bb45203fafb07b", - "618b21d957c0ce94d40fb760eb91ad752592d842328dfb33f9aa43b9a45e3eb7", - "39d055ca52974837d4cd870cf2ca845b505f08dc8d237f32fe9dc3ed3b5687f8", - "de9f8902dcc098af67c8d1cc1d4149332f13127c3a1ee410b5eebd48f1c13468", - "27679def5840bb88da8207c21368e9d609930b82f19e5f856e03a200ecc16b76", - "9b0ef95007317cb33e730c686edaa642852bcda5783c1c0021919301b49b43e7", - "50fdb5a6da3a2e624a8caf5e0f5170d8b6acc54ebe8e5519e9235ada6c210703", - "2cada0ea703937685c22b24e8c31d33a0e7995d2fdd3b55792b7a045a853f27b", - "019a576bc329d4470fd5272d2032f840688d66f91dbb612f6a248f3dc83de69a", - "4d3ab3984620e6460b3f1741bbdbd8664f02cc45b63c9b6eafe2adfcecc92750", - "ae0559a4d62e7c8f25582141efe7fe3d685a86a4d1b25f5ef43a4aea3b7d3fb3", - "06d8073f6f6b3b5357efcd9398930f1497c09dc61e7860aaf7f26a4c88e7dc18", - "e736fc11a298e6f6a24eb9ba78c323cfbe1f799a280b83fc44c2e13188c027c0", - "4de74622620366b7ca7644e2f05cbbbc51c392bcc4e9859f2090e42dfa7f5887", - "4b1952b4a097baf19561f96e73b9f4e44f0139abf4bd0e76060cab80ef1454fd", - "a5b42b1ee817f025f7ddef04a10155cd9e2ba565b0d8b178b8fde8e2309e5b41", - "1ecbfeff1d2f81b85d307a4f17f96e1fb4d58e8ea6281df61544172a237fca77", - "f8bb837fe9b5330ce33abd9a5192394800f37f2fb8db40545952b9491b8aa750", - "b17c022fcb53a5ef8e99f62ffa8108bfe40366397c7894bf7175aa0247f21367", - "b782577b0251691723bcb965f687e59bc5da5969c989928127ca065b1aa82c42", - "18f434cd3a376373014f7bdada0ba9d089fb590f01ab8383e354d341741d5002", - "0881328c7c54836f90860ee3500c16c807f77740dd617332f3804abb9bd3405f", - "3279075bebc0be02a5c41884515ac822088f459fa789e9b866afe2077d3e2513", - "8faae575188787d659034c007f28c58dae5a285159466909aca1c8890a0a6259", - "fb85dfca20a56b9c0f02d48001bc3a3deccfb31b27ab3ac3bbf7b72745a98f0d", - "5c25b89a7e741dc6beca80610eb5bc678530f985e05c53bf4dff00e20273c592", - "c78ea17402d009cb454f88846a29a58f8b78a2e7cb52d7616f87088930370562", - "25a99ff622db8a105dcd348faaca092e9ad826ec446aec4bd5986727d9bf4a80", - "b0129acff53d0245496f95f067afb1d376aa3b11c6a186023d95504bab3a9e08", - "6e25ffb5c7257f4dfa5e2a8ea1f2ffc9533e449d5def73ff17b43f5586b655cd", - "bb201c6b00ab7d145fb77c512479feaee04127cbe161f3944f7292b1a6554f02", - "2efe7c780a427ee0c90ffbe450b6b9cd6dbdf3f6835b2249108ea52b5a4fd755", - "743a97025c40b6af8ff91e164794686841789949600195fa7bb197e4f5155ecd", - "e99ed8f8a8ab63af04f4410fc5b770f14930f8140842952aaa23e1500a06f072", - "35baec5adcb664d4bd4c1e30ed29b00986c0abed7e151e5363eb25dc811457e2", - "2a25ce1f01ccc7b39ceffcbbe8fda79fdbcd1a3f67cc4164eeb0e54b96971bb2", - "514bc2309f98a2dc17331584e74d6c4f71aeede99358af1c0067e4e6e3aae3bc", - "4a80204bc5300771d6b5dbe81cd34ac25b354463c67b621be3bfd4bfd8119e97", - "2bc173035b5e58c2ccd59699fb87393a000f506a88c14797f48b78396ff0b484", - "44ba08f04939b433adb668b40a50e4e223c25f83180639bbfb0d8b175dd3823a", - "904f51384f34626fccb4f8a275da6230ffcb8f999f05abf2ebdb21706a23ab27", - "b71a4939f798f0796d2ff382c62bf1cba06380db1fc28e4333ce502784e84b31", - "170573903b54fdc17c85bfa42d57553b241f6e91d3d4b4245572f86225b343fd", - "82c3dc6f38a41a322ae6db6c955a42561fc7309d86be05914f1c9a07d3496742", - "e88cad06fa614e7b63e8cca23e300af8462f37e6e81086a4bf75f772789c2c77", - "201e963b7ad0d0465ab7f06cdda66a342e2bf879eef0c1412361ab3b219eebc9", - "140efce23648f9b0ae53fbd669ac6bd0d942e4c31fd3efdb82e3d13f851b61c2", - "2e58a09a9b3b4058d7250706744bd86ea87a3178f7a64d4fc35e58f31c92f614", - "5861a206a4e32ce8458d471b7d089554891c4bf14b5c4420b046b18cd819763b", - "74135ee0e7cd763734e45358c6aaf48e3fb3a4349fd4082f89e25588332b83ca", - "0ffdb0959585e4a08cc4b53080cc6c8b8b2507a47cde9176176c43062a33624c", - "5f2bfbf9faea81c6dec7b3219571dfdd582bdbcf63ecfc41a03ee539e855fdea", - "85679057e92a8f28f035e90bf354b7176c03e1e873dfa94c38883c905295dcc3", - "17af3ea80a5ec834d2241715571fe3d84b548f5639bd5d2a59f8af9342583af0", - "ed3cedaf6ebdab3b7591531d33b18bb691fb748b0936e86588c67b638938245d", - "234ae5d05bca38cacef25cf0966dd28ee2887110e476d54defbc1230150a2839", - "b5f4a9b57fd9451497b0592bbdf2fb4348c8702e5aa1564b0299c9a29c9a26ee", - "8739d3230699da49989ffb12b46fddfa327ed64162345ecba94688667e097897", - "542185b2758e0ea79d8d8d6d922b21af2cf2f2b746a8b45aa1c114f2e2548c75", - "143209ce069845b54a702bbe03988e304c157dec20365107db82ffbf0830b606", - "03317eb140ee7428415da3c85f5f4c0aa3a61830f2629866ae23340969a2d122", - "f0ee60addf083f3184c4a9f9f92d91354cbf9db0948d44590f906136f5d9d22b", - "25ba88898f533229960c7db01a0405e2fbee9485a7e1f781d9b856a39fbfdd50", - "8d11969bc2ea6bef195cf15dad2b855103dae9e21b2c593fa9f0d6fce000d893", - "9177d85ed2a4686fe1c8a9affe9480ec16b7b1ad33df454bfda9313c592b003d", - "81b873fba56bad2e6e25727452576f98b40aacf42c3f22b987449e1e97b54277", - "868d62759a3880032d9dc9c1075bbae120be868a0ea999cddbed89aeeb0b1fb8", - "51f7ab2919c01aa8540dece9f326d5829e6c314f5427f47c33888dee9cc8a4cf", - "13afda250a253acb45526c9a7306097a7e5768bea746a35113bad2c9b2c70f2c", - "a6f448ff4dc56dc017f0efd3aab42d0bdf26965bf853be2de192c5439d4ae37e", - "b4b459bffdbf84527cdbbb8eb895fb8f4e615ab4b491017644b1b889321abc52", - "3120e515246b42ba40ca40e56a67f8a0e1d735a17f5d7646ba319745b180fd4d", - "059ae4396957048929e5b3068db05b4845153521b680869770a2e9ecf1d97221", - "57861572f21b48b7a5b5fd6c417da7aebd79af25b308eda13cc7023789bf19d3", - "063ef52294af86ef23344b45b747759f9b62c217f5972f418736de67d96506e8", - "1d9c31dbd282c1c04aa8bcb49cf460501732ba8a18faaf029d58c6a0c98d3d1a", - "914ccf088469c577f5556e24bf161ba010245751edda5c13176277ffce19744f", - "c4c2094776e3393e24ad0aa55abaa27b9f6ea6534c6cbe6c79a32e28eedb9bac", - "05bb8cce62ba51bb3a06c85efd4a42b7200866e5b21c4de57722b9c8dfc75860", - "6bfbee0e84fe93c90f6d9a32fdec02bc5ada1d3832d2fa5a27914b442675bd37", - "bac4cff701e51d31824942a3202b5af35e38948ed6776a27bb4ca90d5338fe73", - "bf7af68955864199341fb43af653518fdbf99c9a29c280d3a0249701d532b2af", - "90f54e3c8ac64c8bb1479746909f207c11323946863d6ac8b088619f7c7b6722", - "a4e073cfe3de19607c743d0ed32fbf20a93ebd0efb08bf3b7cc45ab7d58606dc", - "8286a169aa55703c1c1d3f15ead4c2ad6c3123150061a9b04c78069c254b8709", - "d1c2350f71bad79ed43a72579b382de9ca31a10cdf41dd0f2f5a100f1ede3952", - "74c4787f8b89d713af0d134905551f510757b85f7d61c002fcfbe806f6f37071", - "60b753ca51e67e13a1c0d3661bb1611316d752ba41357fb2ba160b6b497a1f79", - "7ff27a67eac0a8391da4f2395b11fea25bc70e65cb8c790416b57328496eaed3", - "e9d4fbcd61877f5ea035bea2af9ebd9c4e764c70345c13658682857b72a04a85", - "9347a1ca481996b498b936eccc6c2292ccee76430b136f2493922487bfa0d7b8", - "79daae95156022f2f351b51a3c66a163de6f25f19772a4e07b8d5c28df6ed010", - "e35aa50bf658d1c1af955708d33834c3147952042e1579c62691369c16df7137", - "178ead206e0537f278b6d2266d8b19b3ce83b9b5a2e5f10eaf9eb758358fd0d0", - "69d2d227227569e583cdec3a850ee1ddac6665a1d54ce145f2f9801a2a14c9c9", -} - -const ropstenPreverifiedHeight uint64 = 10617024 diff --git a/turbo/stages/mock_sentry.go b/turbo/stages/mock_sentry.go index 9faba4c7c07..9786442a557 100644 --- a/turbo/stages/mock_sentry.go +++ b/turbo/stages/mock_sentry.go @@ -6,17 +6,24 @@ import ( "fmt" "math/big" "os" + "path/filepath" "sync" "testing" "github.com/c2h5oh/datasize" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/direct" "github.com/ledgerwatch/erigon-lib/gointerfaces" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" ptypes "github.com/ledgerwatch/erigon-lib/gointerfaces/types" "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" "github.com/ledgerwatch/erigon-lib/kv/memdb" - "github.com/ledgerwatch/erigon/cmd/sentry/download" + "github.com/ledgerwatch/erigon-lib/kv/remotedbserver" + "github.com/ledgerwatch/erigon-lib/txpool" + types2 "github.com/ledgerwatch/erigon-lib/types" + "github.com/ledgerwatch/erigon/cmd/sentry/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/consensus" "github.com/ledgerwatch/erigon/consensus/ethash" @@ -26,7 +33,6 @@ import ( "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/eth/ethconfig" - "github.com/ledgerwatch/erigon/eth/fetcher" "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" @@ -34,44 +40,58 @@ import ( "github.com/ledgerwatch/erigon/ethdb/prune" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/erigon/turbo/remote" + "github.com/ledgerwatch/erigon/turbo/engineapi" "github.com/ledgerwatch/erigon/turbo/shards" + "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages/bodydownload" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" - "github.com/ledgerwatch/erigon/turbo/stages/txpropagate" - "github.com/ledgerwatch/erigon/turbo/txpool" "github.com/ledgerwatch/log/v3" "google.golang.org/protobuf/types/known/emptypb" ) type MockSentry struct { proto_sentry.UnimplementedSentryServer - Ctx context.Context - Log log.Logger - t *testing.T - cancel context.CancelFunc - DB kv.RwDB - tmpdir string - Engine consensus.Engine - ChainConfig *params.ChainConfig - Sync *stagedsync.Sync - MiningSync *stagedsync.Sync - PendingBlocks chan *types.Block - MinedBlocks chan *types.Block - downloader *download.ControlServerImpl - Key *ecdsa.PrivateKey - Genesis *types.Block - SentryClient remote.SentryClient - PeerId *ptypes.H512 - TxPoolP2PServer *txpool.P2PServer - UpdateHead func(Ctx context.Context, head uint64, hash common.Hash, td *uint256.Int) - streams map[proto_sentry.MessageId][]proto_sentry.Sentry_MessagesServer - sentMessages []*proto_sentry.OutboundMessageData - StreamWg sync.WaitGroup - ReceiveWg sync.WaitGroup - Address common.Address + Ctx context.Context + Log log.Logger + t *testing.T + cancel context.CancelFunc + DB kv.RwDB + tmpdir string + snapDir string + Engine consensus.Engine + ChainConfig *params.ChainConfig + Sync *stagedsync.Sync + MiningSync *stagedsync.Sync + PendingBlocks chan *types.Block + MinedBlocks chan *types.Block + sentriesClient *sentry.MultiClient + Key *ecdsa.PrivateKey + Genesis *types.Block + SentryClient direct.SentryClient + PeerId *ptypes.H512 + UpdateHead func(Ctx context.Context, head uint64, hash common.Hash, td *uint256.Int) + streams map[proto_sentry.MessageId][]proto_sentry.Sentry_MessagesServer + sentMessages []*proto_sentry.OutboundMessageData + StreamWg sync.WaitGroup + ReceiveWg sync.WaitGroup + Address common.Address Notifications *stagedsync.Notifications + + // TxPool + TxPoolFetch *txpool.Fetch + TxPoolSend *txpool.Send + TxPoolGrpcServer *txpool.GrpcServer + TxPool *txpool.TxPool + txPoolDB kv.RwDB +} + +func (ms *MockSentry) Close() { + ms.cancel() + if ms.txPoolDB != nil { + ms.txPoolDB.Close() + } + ms.DB.Close() } // Stream returns stream, waiting if necessary @@ -85,12 +105,20 @@ func (ms *MockSentry) Send(req *proto_sentry.InboundMessage) (errs []error) { return errs } +func (ms *MockSentry) SetStatus(context.Context, *proto_sentry.StatusData) (*proto_sentry.SetStatusReply, error) { + return &proto_sentry.SetStatusReply{}, nil +} + func (ms *MockSentry) PenalizePeer(context.Context, *proto_sentry.PenalizePeerRequest) (*emptypb.Empty, error) { return nil, nil } func (ms *MockSentry) PeerMinBlock(context.Context, *proto_sentry.PeerMinBlockRequest) (*emptypb.Empty, error) { return nil, nil } + +func (ms *MockSentry) HandShake(ctx context.Context, in *emptypb.Empty) (*proto_sentry.HandShakeReply, error) { + return &proto_sentry.HandShakeReply{Protocol: proto_sentry.Protocol_ETH66}, nil +} func (ms *MockSentry) SendMessageByMinBlock(_ context.Context, r *proto_sentry.SendMessageByMinBlockRequest) (*proto_sentry.SentPeers, error) { ms.sentMessages = append(ms.sentMessages, r.Data) return nil, nil @@ -110,9 +138,7 @@ func (ms *MockSentry) SendMessageToAll(_ context.Context, r *proto_sentry.Outbou func (ms *MockSentry) SentMessage(i int) *proto_sentry.OutboundMessageData { return ms.sentMessages[i] } -func (ms *MockSentry) SetStatus(context.Context, *proto_sentry.StatusData) (*proto_sentry.SetStatusReply, error) { - return &proto_sentry.SetStatusReply{Protocol: proto_sentry.Protocol_ETH66}, nil -} + func (ms *MockSentry) Messages(req *proto_sentry.MessagesRequest, stream proto_sentry.Sentry_MessagesServer) error { if ms.streams == nil { ms.streams = map[proto_sentry.MessageId][]proto_sentry.Sentry_MessagesServer{} @@ -130,84 +156,120 @@ func (ms *MockSentry) Messages(req *proto_sentry.MessagesRequest, stream proto_s } } +func (ms *MockSentry) Peers(context.Context, *emptypb.Empty) (*proto_sentry.PeersReply, error) { + return &proto_sentry.PeersReply{}, nil +} +func (ms *MockSentry) PeerCount(context.Context, *proto_sentry.PeerCountRequest) (*proto_sentry.PeerCountReply, error) { + return &proto_sentry.PeerCountReply{Count: 0}, nil +} +func (ms *MockSentry) PeerById(context.Context, *proto_sentry.PeerByIdRequest) (*proto_sentry.PeerByIdReply, error) { + return &proto_sentry.PeerByIdReply{}, nil +} +func (ms *MockSentry) PeerEvents(req *proto_sentry.PeerEventsRequest, server proto_sentry.Sentry_PeerEventsServer) error { + return nil +} + +func (ms *MockSentry) NodeInfo(context.Context, *emptypb.Empty) (*ptypes.NodeInfoReply, error) { + return nil, nil +} + func MockWithGenesis(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey) *MockSentry { - return MockWithGenesisStorageMode(t, gspec, key, prune.DefaultMode) + return MockWithGenesisPruneMode(t, gspec, key, prune.DefaultMode) } func MockWithGenesisEngine(t *testing.T, gspec *core.Genesis, engine consensus.Engine) *MockSentry { key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - return MockWithEverything(t, gspec, key, prune.DefaultMode, engine) + return MockWithEverything(t, gspec, key, prune.DefaultMode, engine, false) } -func MockWithGenesisStorageMode(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey, prune prune.Mode) *MockSentry { - return MockWithEverything(t, gspec, key, prune, ethash.NewFaker()) +func MockWithGenesisPruneMode(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey, prune prune.Mode) *MockSentry { + return MockWithEverything(t, gspec, key, prune, ethash.NewFaker(), false) } -func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey, prune prune.Mode, engine consensus.Engine) *MockSentry { +func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey, prune prune.Mode, engine consensus.Engine, withTxPool bool) *MockSentry { var tmpdir string if t != nil { tmpdir = t.TempDir() } else { tmpdir = os.TempDir() } + snapDir := filepath.Join(tmpdir, "snapshots") + var err error + + db := memdb.New() + ctx, ctxCancel := context.WithCancel(context.Background()) + + erigonGrpcServeer := remotedbserver.NewKvServer(ctx, db) mock := &MockSentry{ + Ctx: ctx, cancel: ctxCancel, DB: db, t: t, Log: log.New(), tmpdir: tmpdir, + snapDir: snapDir, Engine: engine, ChainConfig: gspec.Config, Key: key, Notifications: &stagedsync.Notifications{ - Events: privateapi.NewEvents(), - Accumulator: &shards.Accumulator{}, + Events: privateapi.NewEvents(), + Accumulator: shards.NewAccumulator(gspec.Config), + StateChangesConsumer: erigonGrpcServeer, }, UpdateHead: func(Ctx context.Context, head uint64, hash common.Hash, td *uint256.Int) { }, - PeerId: gointerfaces.ConvertBytesToH512([]byte("12345")), + PeerId: gointerfaces.ConvertHashToH512([64]byte{0x12, 0x34, 0x50}), // "12345" } if t != nil { - mock.DB = memdb.NewTestDB(t) - } else { - mock.DB = memdb.New() + t.Cleanup(mock.Close) } - mock.Ctx, mock.cancel = context.WithCancel(context.Background()) + mock.Address = crypto.PubkeyToAddress(mock.Key.PublicKey) - var err error - sendHeaderRequest := func(_ context.Context, r *headerdownload.HeaderRequest) []byte { - return nil - } - propagateNewBlockHashes := func(context.Context, []headerdownload.Announce) { - } - penalize := func(context.Context, []headerdownload.PenaltyItem) { - } + + sendHeaderRequest := func(_ context.Context, r *headerdownload.HeaderRequest) ([64]byte, bool) { return [64]byte{}, false } + propagateNewBlockHashes := func(context.Context, []headerdownload.Announce) {} + penalize := func(context.Context, []headerdownload.PenaltyItem) {} cfg := ethconfig.Defaults + cfg.StateStream = true cfg.BatchSize = 1 * datasize.MB - cfg.BodyDownloadTimeoutSeconds = 10 - cfg.TxPool.Journal = "" - cfg.TxPool.StartOnInit = true - txPoolConfig := cfg.TxPool + cfg.Sync.BodyDownloadTimeoutSeconds = 10 + cfg.DeprecatedTxPool.Disable = !withTxPool + cfg.DeprecatedTxPool.StartOnInit = true - sendBodyRequest := func(context.Context, *bodydownload.BodyRequest) []byte { - return nil - } - blockPropagator := func(Ctx context.Context, block *types.Block, td *big.Int) { - } - txPool := core.NewTxPool(txPoolConfig, mock.ChainConfig, mock.DB) - txSentryClient := remote.NewSentryClientDirect(eth.ETH66, mock) - mock.TxPoolP2PServer, err = txpool.NewP2PServer(mock.Ctx, []remote.SentryClient{txSentryClient}, txPool) - if err != nil { + mock.SentryClient = direct.NewSentryClientDirect(eth.ETH66, mock) + sentries := []direct.SentryClient{mock.SentryClient} + + sendBodyRequest := func(context.Context, *bodydownload.BodyRequest) ([64]byte, bool) { return [64]byte{}, false } + blockPropagator := func(Ctx context.Context, block *types.Block, td *big.Int) {} + + if !cfg.DeprecatedTxPool.Disable { + poolCfg := txpool.DefaultConfig + newTxs := make(chan types2.Hashes, 1024) if t != nil { + t.Cleanup(func() { + close(newTxs) + }) + } + chainID, _ := uint256.FromBig(mock.ChainConfig.ChainID) + mock.TxPool, err = txpool.New(newTxs, mock.DB, poolCfg, kvcache.NewDummy(), *chainID) + if err != nil { t.Fatal(err) - } else { - panic(err) } - } - fetchTx := func(PeerId string, hashes []common.Hash) error { - mock.TxPoolP2PServer.SendTxsRequest(context.TODO(), PeerId, hashes) - return nil + mock.txPoolDB = memdb.NewPoolDB() + + stateChangesClient := direct.NewStateDiffClientDirect(erigonGrpcServeer) + + mock.TxPoolFetch = txpool.NewFetch(mock.Ctx, sentries, mock.TxPool, stateChangesClient, mock.DB, mock.txPoolDB, *chainID) + mock.TxPoolFetch.SetWaitGroup(&mock.ReceiveWg) + mock.TxPoolSend = txpool.NewSend(mock.Ctx, sentries, mock.TxPool) + mock.TxPoolGrpcServer = txpool.NewGrpcServer(mock.Ctx, mock.TxPool, mock.txPoolDB, *chainID) + + mock.TxPoolFetch.ConnectCore() + mock.StreamWg.Add(1) + mock.TxPoolFetch.ConnectSentries() + mock.StreamWg.Wait() + + go txpool.MainLoop(mock.Ctx, mock.txPoolDB, mock.DB, mock.TxPool, newTxs, mock.TxPoolSend, mock.TxPoolGrpcServer.NewSlotsStreams, func() {}) } - mock.TxPoolP2PServer.TxFetcher = fetcher.NewTxFetcher(txPool.Has, txPool.AddRemotes, fetchTx) // Committed genesis will be shared between download and mock sentry _, mock.Genesis, err = core.CommitGenesisBlock(mock.DB, gspec) if _, ok := err.(*params.ConfigCompatError); err != nil && !ok { @@ -217,12 +279,21 @@ func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey panic(err) } } + blockReader := snapshotsync.NewBlockReader() - blockDownloaderWindow := 65536 networkID := uint64(1) - mock.SentryClient = remote.NewSentryClientDirect(eth.ETH66, mock) - sentries := []remote.SentryClient{mock.SentryClient} - mock.downloader, err = download.NewControlServer(mock.DB, "mock", mock.ChainConfig, mock.Genesis.Hash(), mock.Engine, networkID, sentries, blockDownloaderWindow) + mock.sentriesClient, err = sentry.NewMultiClient( + mock.DB, + "mock", + mock.ChainConfig, + mock.Genesis.Hash(), + mock.Engine, + networkID, + sentries, + cfg.Sync, + blockReader, + false, + ) if err != nil { if t != nil { t.Fatal(err) @@ -230,38 +301,31 @@ func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey panic(err) } } + + var allSnapshots *snapshotsync.RoSnapshots + var snapshotsDownloader proto_downloader.DownloaderClient + + isBor := mock.ChainConfig.Bor != nil + mock.Sync = stagedsync.New( - stagedsync.DefaultStages( - mock.Ctx, prune, - stagedsync.StageHeadersCfg( - mock.DB, - mock.downloader.Hd, - *mock.ChainConfig, - sendHeaderRequest, - propagateNewBlockHashes, - penalize, - cfg.BatchSize, - false, - ), - stagedsync.StageBlockHashesCfg(mock.DB, mock.tmpdir), - stagedsync.StageSnapshotHeadersCfg(mock.DB, ethconfig.Snapshot{Enabled: false}, nil, nil, mock.Log), + stagedsync.DefaultStages(mock.Ctx, prune, + stagedsync.StageHeadersCfg(mock.DB, mock.sentriesClient.Hd, mock.sentriesClient.Bd, *mock.ChainConfig, sendHeaderRequest, propagateNewBlockHashes, penalize, cfg.BatchSize, false, allSnapshots, snapshotsDownloader, blockReader, mock.tmpdir, mock.Notifications.Events), + stagedsync.StageCumulativeIndexCfg(mock.DB), + stagedsync.StageBlockHashesCfg(mock.DB, mock.tmpdir, mock.ChainConfig), stagedsync.StageBodiesCfg( mock.DB, - mock.downloader.Bd, + mock.sentriesClient.Bd, sendBodyRequest, penalize, blockPropagator, - cfg.BodyDownloadTimeoutSeconds, + cfg.Sync.BodyDownloadTimeoutSeconds, *mock.ChainConfig, cfg.BatchSize, + allSnapshots, + blockReader, ), - stagedsync.StageSnapshotBodiesCfg( - mock.DB, - ethconfig.Snapshot{Enabled: false}, - nil, nil, - "", - ), - stagedsync.StageSendersCfg(mock.DB, mock.ChainConfig, mock.tmpdir), + stagedsync.StageIssuanceCfg(mock.DB, mock.ChainConfig, blockReader, true), + stagedsync.StageSendersCfg(mock.DB, mock.ChainConfig, mock.tmpdir, prune, snapshotsync.NewBlockRetire(1, mock.tmpdir, allSnapshots, mock.DB, snapshotsDownloader, mock.Notifications.Events)), stagedsync.StageExecuteBlocksCfg( mock.DB, prune, @@ -270,41 +334,25 @@ func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey mock.ChainConfig, mock.Engine, &vm.Config{}, - nil, + mock.Notifications.Accumulator, cfg.StateStream, mock.tmpdir, + blockReader, ), - stagedsync.StageTranspileCfg( - mock.DB, - cfg.BatchSize, - mock.ChainConfig, - ), - stagedsync.StageSnapshotStateCfg( - mock.DB, - ethconfig.Snapshot{Enabled: false}, - "", - nil, nil, - ), + stagedsync.StageTranspileCfg(mock.DB, cfg.BatchSize, mock.ChainConfig), stagedsync.StageHashStateCfg(mock.DB, mock.tmpdir), - stagedsync.StageTrieCfg(mock.DB, true, true, mock.tmpdir), + stagedsync.StageTrieCfg(mock.DB, true, true, mock.tmpdir, blockReader), stagedsync.StageHistoryCfg(mock.DB, prune, mock.tmpdir), stagedsync.StageLogIndexCfg(mock.DB, prune, mock.tmpdir), stagedsync.StageCallTracesCfg(mock.DB, prune, 0, mock.tmpdir), - stagedsync.StageTxLookupCfg(mock.DB, prune, mock.tmpdir), - stagedsync.StageTxPoolCfg(mock.DB, txPool, func() { - mock.StreamWg.Add(1) - go txpool.RecvTxMessageLoop(mock.Ctx, mock.SentryClient, mock.downloader, mock.TxPoolP2PServer.HandleInboundMessage, &mock.ReceiveWg) - go txpropagate.BroadcastPendingTxsToNetwork(mock.Ctx, txPool, mock.TxPoolP2PServer.RecentPeers, mock.downloader) - mock.StreamWg.Wait() - mock.TxPoolP2PServer.TxFetcher.Start() - }), - stagedsync.StageFinishCfg(mock.DB, mock.tmpdir, nil, nil, mock.Log), - true, /* test */ - ), + stagedsync.StageTxLookupCfg(mock.DB, prune, mock.tmpdir, allSnapshots, isBor), + stagedsync.StageFinishCfg(mock.DB, mock.tmpdir, mock.Log, nil), true), stagedsync.DefaultUnwindOrder, stagedsync.DefaultPruneOrder, ) + mock.sentriesClient.Hd.StartPoSDownloader(mock.Ctx, sendHeaderRequest, penalize) + miningConfig := cfg.Miner miningConfig.Enabled = true miningConfig.Noverify = false @@ -314,13 +362,12 @@ func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey miner := stagedsync.NewMiningState(&miningConfig) mock.PendingBlocks = miner.PendingResultCh mock.MinedBlocks = miner.MiningResultCh - mock.MiningSync = stagedsync.New( stagedsync.MiningStages(mock.Ctx, - stagedsync.StageMiningCreateBlockCfg(mock.DB, miner, *mock.ChainConfig, mock.Engine, txPool, mock.tmpdir), + stagedsync.StageMiningCreateBlockCfg(mock.DB, miner, *mock.ChainConfig, mock.Engine, mock.TxPool, nil, nil, mock.tmpdir), stagedsync.StageMiningExecCfg(mock.DB, miner, nil, *mock.ChainConfig, mock.Engine, &vm.Config{}, mock.tmpdir), stagedsync.StageHashStateCfg(mock.DB, mock.tmpdir), - stagedsync.StageTrieCfg(mock.DB, false, true, mock.tmpdir), + stagedsync.StageTrieCfg(mock.DB, false, true, mock.tmpdir, blockReader), stagedsync.StageMiningFinishCfg(mock.DB, *mock.ChainConfig, mock.Engine, miner, mock.Ctx.Done()), ), stagedsync.MiningUnwindOrder, @@ -328,24 +375,21 @@ func MockWithEverything(t *testing.T, gspec *core.Genesis, key *ecdsa.PrivateKey ) mock.StreamWg.Add(1) - go download.RecvMessageLoop(mock.Ctx, mock.SentryClient, mock.downloader, &mock.ReceiveWg) + go mock.sentriesClient.RecvMessageLoop(mock.Ctx, mock.SentryClient, &mock.ReceiveWg) mock.StreamWg.Wait() mock.StreamWg.Add(1) - go download.RecvUploadMessageLoop(mock.Ctx, mock.SentryClient, mock.downloader, &mock.ReceiveWg) + go mock.sentriesClient.RecvUploadMessageLoop(mock.Ctx, mock.SentryClient, &mock.ReceiveWg) mock.StreamWg.Wait() - if t != nil { - t.Cleanup(func() { - mock.cancel() - txPool.Stop() - mock.TxPoolP2PServer.TxFetcher.Stop() - }) - } + mock.StreamWg.Add(1) + go mock.sentriesClient.RecvUploadHeadersMessageLoop(mock.Ctx, mock.SentryClient, &mock.ReceiveWg) + mock.StreamWg.Wait() + return mock } -// Mock is conviniece function to create a mock with some pre-set values +// Mock is convenience function to create a mock with some pre-set values func Mock(t *testing.T) *MockSentry { - funds := big.NewInt(1000000000) + funds := big.NewInt(1 * params.Ether) key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address := crypto.PubkeyToAddress(key.PublicKey) chainConfig := params.AllEthashProtocolChanges @@ -358,6 +402,36 @@ func Mock(t *testing.T) *MockSentry { return MockWithGenesis(t, gspec, key) } +func MockWithTxPool(t *testing.T) *MockSentry { + funds := big.NewInt(1 * params.Ether) + key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address := crypto.PubkeyToAddress(key.PublicKey) + chainConfig := params.AllEthashProtocolChanges + gspec := &core.Genesis{ + Config: chainConfig, + Alloc: core.GenesisAlloc{ + address: {Balance: funds}, + }, + } + + return MockWithEverything(t, gspec, key, prune.DefaultMode, ethash.NewFaker(), true) +} + +func MockWithZeroTTD(t *testing.T) *MockSentry { + funds := big.NewInt(1 * params.Ether) + key, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address := crypto.PubkeyToAddress(key.PublicKey) + chainConfig := params.AllEthashProtocolChanges + chainConfig.TerminalTotalDifficulty = common.Big0 + gspec := &core.Genesis{ + Config: chainConfig, + Alloc: core.GenesisAlloc{ + address: {Balance: funds}, + }, + } + return MockWithGenesis(t, gspec, key) +} + func (ms *MockSentry) EnableLogs() { log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) ms.t.Cleanup(func() { @@ -415,9 +489,15 @@ func (ms *MockSentry) InsertChain(chain *core.ChainPack) error { ms.ReceiveWg.Wait() // Wait for all messages to be processed before we proceeed initialCycle := false highestSeenHeader := chain.TopBlock.NumberU64() - if err := StageLoopStep(ms.Ctx, ms.Log, ms.DB, ms.Sync, highestSeenHeader, ms.Notifications, initialCycle, ms.UpdateHead, nil); err != nil { + if ms.TxPool != nil { + ms.ReceiveWg.Add(1) + } + if _, err = StageLoopStep(ms.Ctx, ms.DB, ms.Sync, highestSeenHeader, ms.Notifications, initialCycle, ms.UpdateHead, nil); err != nil { return err } + if ms.TxPool != nil { + ms.ReceiveWg.Wait() // Wait for TxPool notification + } // Check if the latest header was imported or rolled back if err = ms.DB.View(ms.Ctx, func(tx kv.Tx) error { if rawdb.ReadHeader(tx, chain.TopBlock.Hash(), chain.TopBlock.NumberU64()) == nil { @@ -434,8 +514,20 @@ func (ms *MockSentry) InsertChain(chain *core.ChainPack) error { }); err != nil { return err } - if ms.downloader.Hd.IsBadHeader(chain.TopBlock.Hash()) { + if ms.sentriesClient.Hd.IsBadHeader(chain.TopBlock.Hash()) { return fmt.Errorf("block %d %x was invalid", chain.TopBlock.NumberU64(), chain.TopBlock.Hash()) } return nil } + +func (ms *MockSentry) SendPayloadRequest(message *engineapi.PayloadMessage) { + ms.sentriesClient.Hd.BeaconRequestList.AddPayloadRequest(message) +} + +func (ms *MockSentry) SendForkChoiceRequest(message *engineapi.ForkChoiceMessage) { + ms.sentriesClient.Hd.BeaconRequestList.AddForkChoiceRequest(message) +} + +func (ms *MockSentry) ReceivePayloadStatus() privateapi.PayloadStatus { + return <-ms.sentriesClient.Hd.PayloadStatusCh +} diff --git a/turbo/stages/sentry_mock_test.go b/turbo/stages/sentry_mock_test.go index 206f0472993..f3d4096fb88 100644 --- a/turbo/stages/sentry_mock_test.go +++ b/turbo/stages/sentry_mock_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/holiman/uint256" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/u256" @@ -13,8 +14,9 @@ import ( "github.com/ledgerwatch/erigon/eth/protocols/eth" "github.com/ledgerwatch/erigon/params" "github.com/ledgerwatch/erigon/rlp" + "github.com/ledgerwatch/erigon/turbo/engineapi" "github.com/ledgerwatch/erigon/turbo/stages" - "github.com/ledgerwatch/log/v3" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -23,13 +25,11 @@ func TestEmptyStageSync(t *testing.T) { } func TestHeaderStep(t *testing.T) { - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) m := stages.Mock(t) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 100, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -53,24 +53,22 @@ func TestHeaderStep(t *testing.T) { for _, err = range m.Send(&sentry.InboundMessage{Id: sentry.MessageId_BLOCK_HEADERS_66, Data: b, PeerId: m.PeerId}) { require.NoError(t, err) } - m.ReceiveWg.Wait() // Wait for all messages to be processed before we proceeed + m.ReceiveWg.Wait() // Wait for all messages to be processed before we proceed initialCycle := true highestSeenHeader := uint64(chain.TopBlock.NumberU64()) - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } } func TestMineBlockWith1Tx(t *testing.T) { t.Skip("revive me") - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) require, m := require.New(t), stages.Mock(t) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 1, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) require.NoError(err) { // Do 1 step to start txPool @@ -98,7 +96,7 @@ func TestMineBlockWith1Tx(t *testing.T) { initialCycle := true highestSeenHeader := uint64(chain.TopBlock.NumberU64()) - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } } @@ -108,7 +106,7 @@ func TestMineBlockWith1Tx(t *testing.T) { tx, err := types.SignTx(types.NewTransaction(gen.TxNonce(m.Address), common.Address{1}, uint256.NewInt(10_000), params.TxGas, u256.Num1, nil), *types.LatestSignerForChainID(m.ChainConfig.ChainID), m.Key) require.NoError(err) gen.AddTx(tx) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) require.NoError(err) // Send NewBlock message @@ -130,13 +128,11 @@ func TestMineBlockWith1Tx(t *testing.T) { } func TestReorg(t *testing.T) { - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) m := stages.Mock(t) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -169,27 +165,27 @@ func TestReorg(t *testing.T) { initialCycle := true highestSeenHeader := uint64(chain.TopBlock.NumberU64()) - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } // Now generate three competing branches, one short and two longer ones short, err := core.GenerateChain(m.ChainConfig, chain.TopBlock, m.Engine, m.DB, 2, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate short fork: %v", err) } long1, err := core.GenerateChain(m.ChainConfig, chain.TopBlock, m.Engine, m.DB, 10, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{2}) // Need to make headers different from short branch - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate short fork: %v", err) } // Second long chain needs to be slightly shorter than the first long chain long2, err := core.GenerateChain(m.ChainConfig, chain.TopBlock, m.Engine, m.DB, 9, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{3}) // Need to make headers different from short branch and another long branch - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate short fork: %v", err) } @@ -223,7 +219,7 @@ func TestReorg(t *testing.T) { highestSeenHeader = uint64(short.TopBlock.NumberU64()) initialCycle = false - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } @@ -267,7 +263,7 @@ func TestReorg(t *testing.T) { // This is unwind step highestSeenHeader = uint64(long1.TopBlock.NumberU64()) - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } @@ -275,7 +271,7 @@ func TestReorg(t *testing.T) { // Now generate three competing branches, one short and two longer ones short2, err := core.GenerateChain(m.ChainConfig, long1.TopBlock, m.Engine, m.DB, 2, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate short fork: %v", err) } @@ -305,26 +301,24 @@ func TestReorg(t *testing.T) { highestSeenHeader = uint64(short2.TopBlock.NumberU64()) initialCycle = false - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } } func TestAnchorReplace(t *testing.T) { - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) m := stages.Mock(t) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } short, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 11, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -335,7 +329,7 @@ func TestAnchorReplace(t *testing.T) { } else { b.SetCoinbase(common.Address{2}) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -404,25 +398,23 @@ func TestAnchorReplace(t *testing.T) { highestSeenHeader := uint64(long.TopBlock.NumberU64()) initialCycle := true - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { t.Fatal(err) } } func TestAnchorReplace2(t *testing.T) { - defer log.Root().SetHandler(log.Root().GetHandler()) - log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StderrHandler)) m := stages.Mock(t) chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 10, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } short, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 20, func(i int, b *core.BlockGen) { b.SetCoinbase(common.Address{1}) - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -433,7 +425,7 @@ func TestAnchorReplace2(t *testing.T) { } else { b.SetCoinbase(common.Address{2}) } - }, false /* intemediateHashes */) + }, false /* intermediateHashes */) if err != nil { t.Fatalf("generate blocks: %v", err) } @@ -511,7 +503,172 @@ func TestAnchorReplace2(t *testing.T) { highestSeenHeader := uint64(long.TopBlock.NumberU64()) initialCycle := true - if err := stages.StageLoopStep(m.Ctx, m.Log, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + if _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, highestSeenHeader, m.Notifications, initialCycle, m.UpdateHead, nil); err != nil { + t.Fatal(err) + } +} + +func TestForkchoiceToGenesis(t *testing.T) { + m := stages.MockWithZeroTTD(t) + + // Trivial forkChoice: everything points to genesis + forkChoiceMessage := engineapi.ForkChoiceMessage{ + HeadBlockHash: m.Genesis.Hash(), + SafeBlockHash: m.Genesis.Hash(), + FinalizedBlockHash: m.Genesis.Hash(), + } + m.SendForkChoiceRequest(&forkChoiceMessage) + + headBlockHash, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, true, m.UpdateHead, nil) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, m.Genesis.Hash(), headBlockHash) + + payloadStatus := m.ReceivePayloadStatus() + assert.Equal(t, remote.EngineStatus_VALID, payloadStatus.Status) +} + +func TestBogusForkchoice(t *testing.T) { + m := stages.MockWithZeroTTD(t) + + // Bogus forkChoice: head points to rubbish + forkChoiceMessage := engineapi.ForkChoiceMessage{ + HeadBlockHash: common.HexToHash("11111111111111111111"), + SafeBlockHash: m.Genesis.Hash(), + FinalizedBlockHash: m.Genesis.Hash(), + } + m.SendForkChoiceRequest(&forkChoiceMessage) + + _, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, true, m.UpdateHead, nil) + if err != nil { t.Fatal(err) } + + payloadStatus := m.ReceivePayloadStatus() + assert.Equal(t, remote.EngineStatus_SYNCING, payloadStatus.Status) + + // Now send a correct forkChoice + forkChoiceMessage = engineapi.ForkChoiceMessage{ + HeadBlockHash: m.Genesis.Hash(), + SafeBlockHash: m.Genesis.Hash(), + FinalizedBlockHash: m.Genesis.Hash(), + } + m.SendForkChoiceRequest(&forkChoiceMessage) + + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, false, m.UpdateHead, nil) + if err != nil { + t.Fatal(err) + } + + payloadStatus = m.ReceivePayloadStatus() + assert.Equal(t, remote.EngineStatus_VALID, payloadStatus.Status) +} + +func TestPoSDownloader(t *testing.T) { + m := stages.MockWithZeroTTD(t) + + chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 2 /* n */, func(i int, b *core.BlockGen) { + b.SetCoinbase(common.Address{1}) + }, false /* intermediateHashes */) + require.NoError(t, err) + + // Send a payload with missing parent + payloadMessage := engineapi.PayloadMessage{ + Header: chain.TopBlock.Header(), + Body: chain.TopBlock.RawBody(), + } + m.SendPayloadRequest(&payloadMessage) + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, true, m.UpdateHead, nil) + require.NoError(t, err) + payloadStatus := m.ReceivePayloadStatus() + assert.Equal(t, remote.EngineStatus_SYNCING, payloadStatus.Status) + + // Send the missing header + b, err := rlp.EncodeToBytes(ð.BlockHeadersPacket66{ + RequestId: 1, + BlockHeadersPacket: chain.Headers[0:1], + }) + require.NoError(t, err) + m.ReceiveWg.Add(1) + for _, err = range m.Send(&sentry.InboundMessage{Id: sentry.MessageId_BLOCK_HEADERS_66, Data: b, PeerId: m.PeerId}) { + require.NoError(t, err) + } + m.ReceiveWg.Wait() + + // First cycle: save the downloaded header + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, false, m.UpdateHead, nil) + require.NoError(t, err) + // Second cycle: process the previous beacon request + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, false, m.UpdateHead, nil) + require.NoError(t, err) + + // Point forkChoice to the head + forkChoiceMessage := engineapi.ForkChoiceMessage{ + HeadBlockHash: chain.TopBlock.Hash(), + SafeBlockHash: chain.TopBlock.Hash(), + FinalizedBlockHash: chain.TopBlock.Hash(), + } + m.SendForkChoiceRequest(&forkChoiceMessage) + headBlockHash, err := stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, false, m.UpdateHead, nil) + require.NoError(t, err) + assert.Equal(t, chain.TopBlock.Hash(), headBlockHash) +} + +// https://hackmd.io/GDc0maGsQeKfP8o2C7L52w +func TestPoSSyncWithInvalidHeader(t *testing.T) { + m := stages.MockWithZeroTTD(t) + + chain, err := core.GenerateChain(m.ChainConfig, m.Genesis, m.Engine, m.DB, 3 /* n */, func(i int, b *core.BlockGen) { + b.SetCoinbase(common.Address{1}) + }, false /* intermediateHashes */) + require.NoError(t, err) + + lastValidHeader := chain.Headers[0] + + invalidParent := types.CopyHeader(chain.Headers[1]) + invalidParent.Difficulty = common.Big1 + + invalidTip := chain.TopBlock.Header() + invalidTip.ParentHash = invalidParent.Hash() + + // Send a payload with missing parent + payloadMessage := engineapi.PayloadMessage{ + Header: invalidTip, + Body: chain.TopBlock.RawBody(), + } + m.SendPayloadRequest(&payloadMessage) + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, true, m.UpdateHead, nil) + require.NoError(t, err) + payloadStatus1 := m.ReceivePayloadStatus() + assert.Equal(t, remote.EngineStatus_SYNCING, payloadStatus1.Status) + + // Send the missing headers + b, err := rlp.EncodeToBytes(ð.BlockHeadersPacket66{ + RequestId: 1, + BlockHeadersPacket: eth.BlockHeadersPacket{invalidParent, lastValidHeader}, + }) + require.NoError(t, err) + m.ReceiveWg.Add(1) + for _, err = range m.Send(&sentry.InboundMessage{Id: sentry.MessageId_BLOCK_HEADERS_66, Data: b, PeerId: m.PeerId}) { + require.NoError(t, err) + } + m.ReceiveWg.Wait() + + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, false, m.UpdateHead, nil) + require.NoError(t, err) + + // Point forkChoice to the invalid tip + forkChoiceMessage := engineapi.ForkChoiceMessage{ + HeadBlockHash: invalidTip.Hash(), + SafeBlockHash: invalidTip.Hash(), + FinalizedBlockHash: invalidTip.Hash(), + } + m.SendForkChoiceRequest(&forkChoiceMessage) + _, err = stages.StageLoopStep(m.Ctx, m.DB, m.Sync, 0, m.Notifications, false, m.UpdateHead, nil) + require.NoError(t, err) + payloadStatus2 := m.ReceivePayloadStatus() + require.Equal(t, remote.EngineStatus_INVALID, payloadStatus2.Status) + assert.Equal(t, lastValidHeader.Hash(), payloadStatus2.LatestValidHash) } diff --git a/turbo/stages/stageloop.go b/turbo/stages/stageloop.go index 56a8bde7c26..a0a72ef6204 100644 --- a/turbo/stages/stageloop.go +++ b/turbo/stages/stageloop.go @@ -8,28 +8,32 @@ import ( "time" "github.com/holiman/uint256" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/dbg" + proto_downloader "github.com/ledgerwatch/erigon-lib/gointerfaces/downloader" + "github.com/ledgerwatch/erigon-lib/gointerfaces/remote" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/sentry/download" + "github.com/ledgerwatch/erigon/cmd/sentry/sentry" "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/core" + "github.com/ledgerwatch/erigon/consensus/misc" "github.com/ledgerwatch/erigon/core/rawdb" + "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" "github.com/ledgerwatch/erigon/eth/ethconfig" "github.com/ledgerwatch/erigon/eth/stagedsync" "github.com/ledgerwatch/erigon/eth/stagedsync/stages" + "github.com/ledgerwatch/erigon/ethdb/olddb" + "github.com/ledgerwatch/erigon/ethdb/privateapi" "github.com/ledgerwatch/erigon/p2p" - "github.com/ledgerwatch/erigon/turbo/shards" + "github.com/ledgerwatch/erigon/turbo/services" "github.com/ledgerwatch/erigon/turbo/snapshotsync" "github.com/ledgerwatch/erigon/turbo/stages/headerdownload" - "github.com/ledgerwatch/erigon/turbo/txpool" "github.com/ledgerwatch/log/v3" ) // StageLoop runs the continuous loop of staged sync func StageLoop( ctx context.Context, - logger log.Logger, db kv.RwDB, sync *stagedsync.Sync, hd *headerdownload.HeaderDownload, @@ -42,25 +46,42 @@ func StageLoop( initialCycle := true for { - select { - case <-ctx.Done(): - return - default: - } - start := time.Now() // Estimate the current top height seen from the peer height := hd.TopSeenHeight() - if err := StageLoopStep(ctx, logger, db, sync, height, notifications, initialCycle, updateHead, nil); err != nil { - if errors.Is(err, common.ErrStopped) { + headBlockHash, err := StageLoopStep(ctx, db, sync, height, notifications, initialCycle, updateHead, nil) + + pendingPayloadStatus := hd.GetPendingPayloadStatus() + if pendingPayloadStatus != (common.Hash{}) { + if err != nil { + hd.PayloadStatusCh <- privateapi.PayloadStatus{CriticalError: err} + } else { + var status remote.EngineStatus + if headBlockHash == pendingPayloadStatus { + status = remote.EngineStatus_VALID + } else { + status = remote.EngineStatus_INVALID + } + hd.PayloadStatusCh <- privateapi.PayloadStatus{ + Status: status, + LatestValidHash: headBlockHash, + } + } + + hd.ClearPendingPayloadStatus() + } + + if err != nil { + if errors.Is(err, libcommon.ErrStopped) || errors.Is(err, context.Canceled) { return } - log.Error("Staged Sync", "error", err) + log.Error("Staged Sync", "err", err) if recoveryErr := hd.RecoverFromDb(db); recoveryErr != nil { - log.Error("Failed to recover header downloader", "error", recoveryErr) + log.Error("Failed to recover header sentriesClient", "err", recoveryErr) } + time.Sleep(500 * time.Millisecond) // just to avoid too much similar errors in logs continue } @@ -82,7 +103,6 @@ func StageLoop( func StageLoopStep( ctx context.Context, - logger log.Logger, db kv.RwDB, sync *stagedsync.Sync, highestSeenHeader uint64, @@ -90,57 +110,58 @@ func StageLoopStep( initialCycle bool, updateHead func(ctx context.Context, head uint64, hash common.Hash, td *uint256.Int), snapshotMigratorFinal func(tx kv.Tx) error, -) (err error) { - defer func() { err = debug.ReportPanicAndRecover(err) }() // avoid crash because Erigon's core does many things - - var origin, hashStateStageProgress, finishProgressBefore uint64 +) (headBlockHash common.Hash, err error) { + defer func() { + if rec := recover(); rec != nil { + err = fmt.Errorf("%+v, trace: %s", rec, dbg.Stack()) + } + }() // avoid crash because Erigon's core does many things + + var origin, finishProgressBefore uint64 if err := db.View(ctx, func(tx kv.Tx) error { origin, err = stages.GetStageProgress(tx, stages.Headers) if err != nil { return err } - hashStateStageProgress, err = stages.GetStageProgress(tx, stages.Bodies) // TODO: shift this when more stages are added - if err != nil { - return err - } - finishProgressBefore, err = stages.GetStageProgress(tx, stages.Finish) // TODO: shift this when more stages are added + finishProgressBefore, err = stages.GetStageProgress(tx, stages.Finish) if err != nil { return err } return nil }); err != nil { - return err - } - - if notifications != nil && notifications.Accumulator != nil { - notifications.Accumulator.Reset() + return headBlockHash, err } - canRunCycleInOneTransaction := !initialCycle && highestSeenHeader-origin < 1024 && highestSeenHeader-hashStateStageProgress < 1024 + canRunCycleInOneTransaction := !initialCycle && highestSeenHeader-origin < 8096 && highestSeenHeader-finishProgressBefore < 8096 var tx kv.RwTx // on this variable will run sync cycle. if canRunCycleInOneTransaction { tx, err = db.BeginRw(context.Background()) if err != nil { - return err + return headBlockHash, err } defer tx.Rollback() } + if notifications != nil && notifications.Accumulator != nil && canRunCycleInOneTransaction { + notifications.Accumulator.Reset(tx.ViewID()) + } + err = sync.Run(db, tx, initialCycle) if err != nil { - return err + return headBlockHash, err } if canRunCycleInOneTransaction { commitStart := time.Now() errTx := tx.Commit() if errTx != nil { - return errTx + return headBlockHash, errTx } log.Info("Commit cycle", "in", time.Since(commitStart)) } var rotx kv.Tx if rotx, err = db.BeginRo(ctx); err != nil { - return err + return headBlockHash, err } defer rotx.Rollback() @@ -148,15 +169,16 @@ func StageLoopStep( var headTd *big.Int var head uint64 var headHash common.Hash - if head, err = stages.GetStageProgress(rotx, stages.Finish); err != nil { - return err + if head, err = stages.GetStageProgress(rotx, stages.Headers); err != nil { + return headBlockHash, err } if headHash, err = rawdb.ReadCanonicalHash(rotx, head); err != nil { - return err + return headBlockHash, err } if headTd, err = rawdb.ReadTd(rotx, headHash, head); err != nil { - return err + return headBlockHash, err } + headBlockHash = rawdb.ReadHeadBlockHash(rotx) if canRunCycleInOneTransaction && snapshotMigratorFinal != nil { err = snapshotMigratorFinal(rotx) @@ -165,30 +187,52 @@ func StageLoopStep( } } rotx.Rollback() - headTd256 := new(uint256.Int) - overflow := headTd256.SetFromBig(headTd) + + headTd256, overflow := uint256.FromBig(headTd) if overflow { - return fmt.Errorf("headTds higher than 2^256-1") + return headBlockHash, fmt.Errorf("headTds higher than 2^256-1") } updateHead(ctx, head, headHash, headTd256) - err = stagedsync.NotifyNewHeaders(ctx, finishProgressBefore, sync.PrevUnwindPoint(), notifications.Events, db) - if err != nil { - return err + if notifications != nil && notifications.Accumulator != nil { + if err := db.View(ctx, func(tx kv.Tx) error { + header := rawdb.ReadCurrentHeader(tx) + if header == nil { + return nil + } + + pendingBaseFee := misc.CalcBaseFee(notifications.Accumulator.ChainConfig(), header) + if header.Number.Uint64() == 0 { + notifications.Accumulator.StartChange(0, header.Hash(), nil, false) + } + notifications.Accumulator.SendAndReset(ctx, notifications.StateChangesConsumer, pendingBaseFee.Uint64(), header.GasLimit) + + return stagedsync.NotifyNewHeaders(ctx, finishProgressBefore, head, sync.PrevUnwindPoint(), notifications.Events, tx) + }); err != nil { + return headBlockHash, err + } } - return nil + return headBlockHash, nil } func MiningStep(ctx context.Context, kv kv.RwDB, mining *stagedsync.Sync) (err error) { - defer func() { err = debug.ReportPanicAndRecover(err) }() // avoid crash because Erigon's core does many things - + defer func() { + if rec := recover(); rec != nil { + err = fmt.Errorf("%+v, trace: %s", rec, dbg.Stack()) + } + }() // avoid crash because Erigon's core does many things - tx, err := kv.BeginRw(ctx) + tx, err := kv.BeginRo(ctx) if err != nil { return err } defer tx.Rollback() - if err = mining.Run(nil, tx, false); err != nil { + + miningBatch := olddb.NewMiningBatch(tx) + defer miningBatch.Rollback() + + if err = mining.Run(nil, miningBatch, false); err != nil { return err } tx.Rollback() @@ -201,43 +245,44 @@ func NewStagedSync( db kv.RwDB, p2pCfg p2p.Config, cfg ethconfig.Config, - controlServer *download.ControlServerImpl, + controlServer *sentry.MultiClient, tmpdir string, - txPool *core.TxPool, - txPoolServer *txpool.P2PServer, - - client *snapshotsync.Client, - snapshotMigrator *snapshotsync.SnapshotMigrator, - accumulator *shards.Accumulator, + notifications *stagedsync.Notifications, + snapshotDownloader proto_downloader.DownloaderClient, + snapshots *snapshotsync.RoSnapshots, + headCh chan *types.Block, ) (*stagedsync.Sync, error) { + var blockReader services.FullBlockReader + if cfg.Snapshot.Enabled { + blockReader = snapshotsync.NewBlockReaderWithSnapshots(snapshots) + } else { + blockReader = snapshotsync.NewBlockReader() + } + blockRetire := snapshotsync.NewBlockRetire(1, tmpdir, snapshots, db, snapshotDownloader, notifications.Events) + + // During Import we don't want other services like header requests, body requests etc. to be running. + // Hence we run it in the test mode. + runInTestMode := cfg.ImportMode + isBor := controlServer.ChainConfig.Bor != nil return stagedsync.New( - stagedsync.DefaultStages( - ctx, - cfg.Prune, - stagedsync.StageHeadersCfg( - db, - controlServer.Hd, - *controlServer.ChainConfig, - controlServer.SendHeaderRequest, - controlServer.PropagateNewBlockHashes, - controlServer.Penalize, - cfg.BatchSize, - p2pCfg.NoDiscovery, - ), - stagedsync.StageBlockHashesCfg(db, tmpdir), - stagedsync.StageSnapshotHeadersCfg(db, cfg.Snapshot, client, snapshotMigrator, logger), + stagedsync.DefaultStages(ctx, cfg.Prune, + stagedsync.StageHeadersCfg(db, controlServer.Hd, controlServer.Bd, *controlServer.ChainConfig, controlServer.SendHeaderRequest, controlServer.PropagateNewBlockHashes, controlServer.Penalize, cfg.BatchSize, p2pCfg.NoDiscovery, snapshots, snapshotDownloader, blockReader, tmpdir, notifications.Events), + stagedsync.StageCumulativeIndexCfg(db), + stagedsync.StageBlockHashesCfg(db, tmpdir, controlServer.ChainConfig), stagedsync.StageBodiesCfg( db, controlServer.Bd, controlServer.SendBodyRequest, controlServer.Penalize, controlServer.BroadcastNewBlock, - cfg.BodyDownloadTimeoutSeconds, + cfg.Sync.BodyDownloadTimeoutSeconds, *controlServer.ChainConfig, cfg.BatchSize, + snapshots, + blockReader, ), - stagedsync.StageSnapshotBodiesCfg(db, cfg.Snapshot, client, snapshotMigrator, tmpdir), - stagedsync.StageSendersCfg(db, controlServer.ChainConfig, tmpdir), + stagedsync.StageIssuanceCfg(db, controlServer.ChainConfig, blockReader, cfg.EnabledIssuance), + stagedsync.StageSendersCfg(db, controlServer.ChainConfig, tmpdir, cfg.Prune, blockRetire), stagedsync.StageExecuteBlocksCfg( db, cfg.Prune, @@ -246,36 +291,19 @@ func NewStagedSync( controlServer.ChainConfig, controlServer.Engine, &vm.Config{EnableTEMV: cfg.Prune.Experiments.TEVM}, - accumulator, + notifications.Accumulator, cfg.StateStream, tmpdir, + blockReader, ), - stagedsync.StageTranspileCfg( - db, - cfg.BatchSize, - controlServer.ChainConfig, - ), - stagedsync.StageSnapshotStateCfg(db, cfg.Snapshot, tmpdir, client, snapshotMigrator), + stagedsync.StageTranspileCfg(db, cfg.BatchSize, controlServer.ChainConfig), stagedsync.StageHashStateCfg(db, tmpdir), - stagedsync.StageTrieCfg(db, true, true, tmpdir), + stagedsync.StageTrieCfg(db, true, true, tmpdir, blockReader), stagedsync.StageHistoryCfg(db, cfg.Prune, tmpdir), stagedsync.StageLogIndexCfg(db, cfg.Prune, tmpdir), stagedsync.StageCallTracesCfg(db, cfg.Prune, 0, tmpdir), - stagedsync.StageTxLookupCfg(db, cfg.Prune, tmpdir), - stagedsync.StageTxPoolCfg(db, txPool, func() { - for i := range txPoolServer.Sentries { - go func(i int) { - txpool.RecvTxMessageLoop(ctx, txPoolServer.Sentries[i], controlServer, txPoolServer.HandleInboundMessage, nil) - }(i) - go func(i int) { - txpool.RecvPeersLoop(ctx, txPoolServer.Sentries[i], controlServer, txPoolServer.RecentPeers, nil) - }(i) - } - txPoolServer.TxFetcher.Start() - }), - stagedsync.StageFinishCfg(db, tmpdir, client, snapshotMigrator, logger), - false, /* test */ - ), + stagedsync.StageTxLookupCfg(db, cfg.Prune, tmpdir, snapshots, isBor), + stagedsync.StageFinishCfg(db, tmpdir, logger, headCh), runInTestMode), stagedsync.DefaultUnwindOrder, stagedsync.DefaultPruneOrder, ), nil diff --git a/turbo/stages/txpropagate/deprecated.go b/turbo/stages/txpropagate/deprecated.go deleted file mode 100644 index 54c8df56ed0..00000000000 --- a/turbo/stages/txpropagate/deprecated.go +++ /dev/null @@ -1,92 +0,0 @@ -package txpropagate - -import ( - "context" - "sync" - "time" - - "github.com/ledgerwatch/erigon-lib/gointerfaces/types" - "github.com/ledgerwatch/erigon/cmd/sentry/download" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/core" -) - -const txChanSize int = 4096 - -// BroadcastPendingTxsToNetwork - does send to p2p: -// - new txs -// - all pooled txs to recently connected peers -// - all local pooled txs to random peers periodically -func BroadcastPendingTxsToNetwork(ctx context.Context, txPool *core.TxPool, recentPeers *RecentlyConnectedPeers, s *download.ControlServerImpl) { - defer debug.LogPanic() - - txsCh := make(chan core.NewTxsEvent, txChanSize) - txsSub := txPool.SubscribeNewTxsEvent(txsCh) - defer txsSub.Unsubscribe() - - syncToNewPeersEvery := time.NewTicker(2 * time.Minute) - defer syncToNewPeersEvery.Stop() - - broadcastLocalTransactionsEvery := time.NewTicker(2 * time.Minute) - defer broadcastLocalTransactionsEvery.Stop() - - localTxHashes := make([]common.Hash, 128) - remoteTxHashes := make([]common.Hash, 128) - - for { - select { - case <-txsSub.Err(): - return - case <-ctx.Done(): - return - case e := <-txsCh: // new txs - // first broadcast all local txs to all peers, then non-local to random sqrt(peersAmount) peers - localTxHashes = localTxHashes[:0] - remoteTxHashes = remoteTxHashes[:0] - for i := range e.Txs { - h := e.Txs[i].Hash() - if txPool.IsLocalTx(h) { - localTxHashes = append(localTxHashes, h) - } else { - remoteTxHashes = append(remoteTxHashes, h) - } - } - s.BroadcastLocalPooledTxs(ctx, localTxHashes) - s.BroadcastRemotePooledTxs(ctx, remoteTxHashes) - case <-syncToNewPeersEvery.C: // new peer - newPeers := recentPeers.GetAndClean() - if len(newPeers) == 0 { - continue - } - remoteTxHashes = txPool.AppendHashes(remoteTxHashes[:0]) - s.PropagatePooledTxsToPeersList(ctx, newPeers, remoteTxHashes) - case <-broadcastLocalTransactionsEvery.C: // periodically broadcast local txs to random peers - localTxHashes = txPool.AppendLocalHashes(localTxHashes[:0]) - s.BroadcastLocalPooledTxs(ctx, localTxHashes) - } - } -} - -type RecentlyConnectedPeers struct { - lock sync.RWMutex - peers []*types.H512 -} - -func (l *RecentlyConnectedPeers) Len() int { - l.lock.RLock() - defer l.lock.RUnlock() - return len(l.peers) -} -func (l *RecentlyConnectedPeers) AddPeer(p *types.H512) { - l.lock.Lock() - defer l.lock.Unlock() - l.peers = append(l.peers, p) -} -func (l *RecentlyConnectedPeers) GetAndClean() []*types.H512 { - l.lock.Lock() - defer l.lock.Unlock() - peers := l.peers - l.peers = nil - return peers -} diff --git a/turbo/transactions/call.go b/turbo/transactions/call.go index f58889073d2..82fe1fd85a2 100644 --- a/turbo/transactions/call.go +++ b/turbo/transactions/call.go @@ -8,7 +8,8 @@ import ( "github.com/holiman/uint256" "github.com/ledgerwatch/erigon-lib/kv" - "github.com/ledgerwatch/erigon/cmd/rpcdaemon/filters" + "github.com/ledgerwatch/erigon-lib/kv/kvcache" + "github.com/ledgerwatch/erigon/cmd/rpcdaemon/rpcservices" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/core" "github.com/ledgerwatch/erigon/core/rawdb" @@ -24,7 +25,17 @@ import ( const callTimeout = 5 * time.Minute -func DoCall(ctx context.Context, args ethapi.CallArgs, tx kv.Tx, blockNrOrHash rpc.BlockNumberOrHash, overrides *map[common.Address]ethapi.Account, gasCap uint64, chainConfig *params.ChainConfig, filters *filters.Filters) (*core.ExecutionResult, error) { +func DoCall( + ctx context.Context, + args ethapi.CallArgs, + tx kv.Tx, blockNrOrHash rpc.BlockNumberOrHash, + block *types.Block, overrides *ethapi.StateOverrides, + gasCap uint64, + chainConfig *params.ChainConfig, + filters *rpcservices.Filters, + stateCache kvcache.Cache, + contractHasTEVM func(hash common.Hash) (bool, error), +) (*core.ExecutionResult, error) { // todo: Pending state is only known by the miner /* if blockNrOrHash.BlockNumber != nil && *blockNrOrHash.BlockNumber == rpc.PendingBlockNumber { @@ -32,58 +43,20 @@ func DoCall(ctx context.Context, args ethapi.CallArgs, tx kv.Tx, blockNrOrHash r return state, block.Header(), nil } */ - blockNrOrHash.RequireCanonical = true // DoCall cannot be executed on non-canonical blocks - blockNumber, hash, err := rpchelper.GetBlockNumber(blockNrOrHash, tx, filters) + stateReader, err := rpchelper.CreateStateReader(ctx, tx, blockNrOrHash, filters, stateCache) if err != nil { return nil, err } - var stateReader state.StateReader - if num, ok := blockNrOrHash.Number(); ok && num == rpc.LatestBlockNumber { - stateReader = state.NewPlainStateReader(tx) - } else { - stateReader = state.NewPlainState(tx, blockNumber) - } state := state.New(stateReader) - header := rawdb.ReadHeader(tx, hash, blockNumber) - if header == nil { - return nil, fmt.Errorf("block %d(%x) not found", blockNumber, hash) - } + header := block.Header() // Override the fields of specified contracts before execution. if overrides != nil { - for addr, account := range *overrides { - // Override account nonce. - if account.Nonce != nil { - state.SetNonce(addr, uint64(*account.Nonce)) - } - // Override account(contract) code. - if account.Code != nil { - state.SetCode(addr, *account.Code) - } - // Override account balance. - if account.Balance != nil { - balance, overflow := uint256.FromBig((*big.Int)(*account.Balance)) - if overflow { - return nil, fmt.Errorf("account.Balance higher than 2^256-1") - } - state.SetBalance(addr, balance) - } - if account.State != nil && account.StateDiff != nil { - return nil, fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex()) - } - // Replace entire state if caller requires. - if account.State != nil { - state.SetStorage(addr, *account.State) - } - // Apply state diff into specified accounts. - if account.StateDiff != nil { - for key, value := range *account.StateDiff { - key := key - state.SetState(addr, &key, value) - } - } + if err := overrides.Override(state); err != nil { + return nil, err } + } // Setup context so it may be cancelled the call has completed @@ -112,7 +85,7 @@ func DoCall(ctx context.Context, args ethapi.CallArgs, tx kv.Tx, blockNrOrHash r if err != nil { return nil, err } - blockCtx, txCtx := GetEvmContext(msg, header, blockNrOrHash.RequireCanonical, tx) + blockCtx, txCtx := GetEvmContext(msg, header, blockNrOrHash.RequireCanonical, tx, contractHasTEVM) evm := vm.NewEVM(blockCtx, txCtx, state, chainConfig, vm.Config{NoBaseFee: true}) @@ -136,7 +109,7 @@ func DoCall(ctx context.Context, args ethapi.CallArgs, tx kv.Tx, blockNrOrHash r return result, nil } -func GetEvmContext(msg core.Message, header *types.Header, requireCanonical bool, tx kv.Tx) (vm.BlockContext, vm.TxContext) { +func GetEvmContext(msg core.Message, header *types.Header, requireCanonical bool, tx kv.Tx, contractHasTEVM func(address common.Hash) (bool, error)) (vm.BlockContext, vm.TxContext) { var baseFee uint256.Int if header.Eip1559 { overflow := baseFee.SetFromBig(header.BaseFee) @@ -145,16 +118,16 @@ func GetEvmContext(msg core.Message, header *types.Header, requireCanonical bool } } return vm.BlockContext{ - CanTransfer: core.CanTransfer, - Transfer: core.Transfer, - GetHash: getHashGetter(requireCanonical, tx), - CheckTEVM: func(common.Hash) (bool, error) { return false, nil }, - Coinbase: header.Coinbase, - BlockNumber: header.Number.Uint64(), - Time: header.Time, - Difficulty: new(big.Int).Set(header.Difficulty), - GasLimit: header.GasLimit, - BaseFee: &baseFee, + CanTransfer: core.CanTransfer, + Transfer: core.Transfer, + GetHash: getHashGetter(requireCanonical, tx), + ContractHasTEVM: contractHasTEVM, + Coinbase: header.Coinbase, + BlockNumber: header.Number.Uint64(), + Time: header.Time, + Difficulty: new(big.Int).Set(header.Difficulty), + GasLimit: header.GasLimit, + BaseFee: &baseFee, }, vm.TxContext{ Origin: msg.From(), @@ -166,7 +139,7 @@ func getHashGetter(requireCanonical bool, tx kv.Tx) func(uint64) common.Hash { return func(n uint64) common.Hash { hash, err := rawdb.ReadCanonicalHash(tx, n) if err != nil { - log.Debug("can't get block hash by number", "number", n, "only-canonical", requireCanonical) + log.Debug("Can't get block hash by number", "number", n, "only-canonical", requireCanonical) } return hash } diff --git a/turbo/transactions/tracing.go b/turbo/transactions/tracing.go index a01a6da6f30..3c3a2b3b557 100644 --- a/turbo/transactions/tracing.go +++ b/turbo/transactions/tracing.go @@ -2,6 +2,7 @@ package transactions import ( "context" + "encoding/hex" "errors" "fmt" "math/big" @@ -17,7 +18,6 @@ import ( "github.com/ledgerwatch/erigon/core/state" "github.com/ledgerwatch/erigon/core/types" "github.com/ledgerwatch/erigon/core/vm" - "github.com/ledgerwatch/erigon/core/vm/stack" "github.com/ledgerwatch/erigon/eth/tracers" "github.com/ledgerwatch/erigon/params" ) @@ -30,10 +30,10 @@ type BlockGetter interface { GetBlock(hash common.Hash, number uint64) *types.Block } -// computeTxEnv returns the execution environment of a certain transaction. -func ComputeTxEnv(ctx context.Context, block *types.Block, cfg *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, checkTEVM func(common.Hash) (bool, error), engine consensus.Engine, dbtx kv.Tx, blockHash common.Hash, txIndex uint64) (core.Message, vm.BlockContext, vm.TxContext, *state.IntraBlockState, *state.PlainState, error) { +// ComputeTxEnv returns the execution environment of a certain transaction. +func ComputeTxEnv(ctx context.Context, block *types.Block, cfg *params.ChainConfig, getHeader func(hash common.Hash, number uint64) *types.Header, contractHasTEVM func(common.Hash) (bool, error), engine consensus.Engine, dbtx kv.Tx, blockHash common.Hash, txIndex uint64) (core.Message, vm.BlockContext, vm.TxContext, *state.IntraBlockState, *state.PlainState, error) { // Create the parent state database - reader := state.NewPlainState(dbtx, block.NumberU64()-1) + reader := state.NewPlainState(dbtx, block.NumberU64()) statedb := state.New(reader) if txIndex == 0 && len(block.Transactions()) == 0 { @@ -42,8 +42,9 @@ func ComputeTxEnv(ctx context.Context, block *types.Block, cfg *params.ChainConf // Recompute transactions up to the target index. signer := types.MakeSigner(cfg, block.NumberU64()) - BlockContext := core.NewEVMBlockContext(block.Header(), getHeader, engine, nil, checkTEVM) + BlockContext := core.NewEVMBlockContext(block.Header(), getHeader, engine, nil, contractHasTEVM) vmenv := vm.NewEVM(BlockContext, vm.TxContext{}, statedb, cfg, vm.Config{}) + rules := vmenv.ChainRules() for idx, tx := range block.Transactions() { select { default: @@ -53,7 +54,7 @@ func ComputeTxEnv(ctx context.Context, block *types.Block, cfg *params.ChainConf statedb.Prepare(tx.Hash(), blockHash, idx) // Assemble the transaction call message and return if the requested offset - msg, _ := tx.AsMessage(*signer, block.Header().BaseFee) + msg, _ := tx.AsMessage(*signer, block.BaseFee(), rules) TxContext := core.NewEVMTxContext(msg) if idx == int(txIndex) { return msg, BlockContext, TxContext, statedb, reader, nil @@ -61,11 +62,16 @@ func ComputeTxEnv(ctx context.Context, block *types.Block, cfg *params.ChainConf vmenv.Reset(TxContext, statedb) // Not yet the searched for transaction, execute on top of the current state if _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.GetGas()), true /* refunds */, false /* gasBailout */); err != nil { - return nil, vm.BlockContext{}, vm.TxContext{}, nil, nil, fmt.Errorf("transaction %x failed: %v", tx.Hash(), err) + return nil, vm.BlockContext{}, vm.TxContext{}, nil, nil, fmt.Errorf("transaction %x failed: %w", tx.Hash(), err) } // Ensure any modifications are committed to the state - // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect - _ = statedb.FinalizeTx(vmenv.ChainRules, state.NewNoopWriter()) + // Only delete empty objects if EIP161 (part of Spurious Dragon) is in effect + _ = statedb.FinalizeTx(rules, reader) + + if idx+1 == len(block.Transactions()) { + // Return the state from evaluating all txs in the block, note no msg or TxContext in this case + return nil, BlockContext, vm.TxContext{}, statedb, reader, nil + } } return nil, vm.BlockContext{}, vm.TxContext{}, nil, nil, fmt.Errorf("transaction index %d out of range for block %x", txIndex, blockHash) } @@ -99,8 +105,10 @@ func TraceTx( return err } } - // Constuct the JavaScript tracer to execute with - if tracer, err = tracers.New(*config.Tracer, txCtx); err != nil { + // Construct the JavaScript tracer to execute with + if tracer, err = tracers.New(*config.Tracer, &tracers.Context{ + TxHash: txCtx.TxHash, + }); err != nil { stream.WriteNil() return err } @@ -123,7 +131,6 @@ func TraceTx( } // Run the transaction with tracing enabled. vmenv := vm.NewEVM(blockCtx, txCtx, ibs, chainConfig, vm.Config{Debug: true, Tracer: tracer}) - var refunds bool = true if config != nil && config.NoRefunds != nil && *config.NoRefunds { refunds = false @@ -139,7 +146,7 @@ func TraceTx( stream.WriteArrayEnd() stream.WriteObjectEnd() } - return fmt.Errorf("tracing failed: %v", err) + return fmt.Errorf("tracing failed: %w", err) } // Depending on the tracer type, format and return the output if streaming { @@ -178,6 +185,7 @@ type JsonStreamLogger struct { ctx context.Context cfg vm.LogConfig stream *jsoniter.Stream + hexEncodeBuf [128]byte firstCapture bool locations common.Hashes // For sorting @@ -202,22 +210,25 @@ func NewJsonStreamLogger(cfg *vm.LogConfig, ctx context.Context, stream *jsonite } // CaptureStart implements the Tracer interface to initialize the tracing operation. -func (l *JsonStreamLogger) CaptureStart(depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, codeHash common.Hash) error { - return nil +func (l *JsonStreamLogger) CaptureStart(env *vm.EVM, depth int, from common.Address, to common.Address, precompile bool, create bool, calltype vm.CallType, input []byte, gas uint64, value *big.Int, code []byte) { } // CaptureState logs a new structured log message and pushes it out to the environment // // CaptureState also tracks SLOAD/SSTORE ops to track storage change. -func (l *JsonStreamLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, rData []byte, contract *vm.Contract, depth int, err error) error { +func (l *JsonStreamLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) { + contract := scope.Contract + memory := scope.Memory + stack := scope.Stack + select { case <-l.ctx.Done(): - return fmt.Errorf("interrupted") + return default: } // check if already accumulated the specified number of logs if l.cfg.Limit != 0 && l.cfg.Limit <= len(l.logs) { - return vm.ErrTraceLimitReached + return } if !l.firstCapture { l.stream.WriteMore() @@ -237,7 +248,7 @@ func (l *JsonStreamLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, ga address = common.Hash(stack.Data[stack.Len()-1].Bytes32()) value uint256.Int ) - env.IntraBlockState.GetState(contract.Address(), &address, &value) + env.IntraBlockState().GetState(contract.Address(), &address, &value) l.storage[contract.Address()][address] = common.Hash(value.Bytes32()) outputStorage = true } @@ -270,7 +281,9 @@ func (l *JsonStreamLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, ga if err != nil { l.stream.WriteMore() l.stream.WriteObjectField("error") - l.stream.WriteString(err.Error()) + l.stream.WriteObjectStart() + l.stream.WriteObjectEnd() + //l.stream.WriteString(err.Error()) } if !l.cfg.DisableStack { l.stream.WriteMore() @@ -293,7 +306,7 @@ func (l *JsonStreamLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, ga if i > 0 { l.stream.WriteMore() } - l.stream.WriteString(fmt.Sprintf("%x", memData[i:i+32])) + l.stream.WriteString(string(l.hexEncodeBuf[0:hex.Encode(l.hexEncodeBuf[:], memData[i:i+32])])) } l.stream.WriteArrayEnd() } @@ -318,24 +331,22 @@ func (l *JsonStreamLogger) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, ga } else { l.stream.WriteMore() } - l.stream.WriteObjectField(fmt.Sprintf("%x", loc)) - l.stream.WriteString(fmt.Sprintf("%x", value)) + l.stream.WriteObjectField(string(l.hexEncodeBuf[0:hex.Encode(l.hexEncodeBuf[:], loc[:])])) + l.stream.WriteString(string(l.hexEncodeBuf[0:hex.Encode(l.hexEncodeBuf[:], value[:])])) } l.stream.WriteObjectEnd() } l.stream.WriteObjectEnd() - return l.stream.Flush() + _ = l.stream.Flush() } // CaptureFault implements the Tracer interface to trace an execution fault // while running an opcode. -func (l *JsonStreamLogger) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, memory *vm.Memory, stack *stack.Stack, contract *vm.Contract, depth int, err error) error { - return nil +func (l *JsonStreamLogger) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) { } // CaptureEnd is called after the call finishes to finalize the tracing. -func (l *JsonStreamLogger) CaptureEnd(depth int, output []byte, gasUsed uint64, t time.Duration, err error) error { - return nil +func (l *JsonStreamLogger) CaptureEnd(depth int, output []byte, startGas, endGas uint64, t time.Duration, err error) { } func (l *JsonStreamLogger) CaptureSelfDestruct(from common.Address, to common.Address, value *big.Int) { diff --git a/turbo/trie/hashbuilder.go b/turbo/trie/hashbuilder.go index a7483b7b64b..ca199c5648a 100644 --- a/turbo/trie/hashbuilder.go +++ b/turbo/trie/hashbuilder.go @@ -121,6 +121,7 @@ func (hb *HashBuilder) leafHashWithKeyVal(key []byte, val rlphacks.RlpSerializab if err != nil { return err } + //fmt.Printf("leafHashWithKeyVal [%x]=>[%x]\nHash [%x]\n", key, val, hb.hashBuf[:]) hb.hashStack = append(hb.hashStack, hb.hashBuf[:]...) if len(hb.hashStack) > hashStackStride*len(hb.nodeStack) { @@ -250,7 +251,6 @@ func (hb *HashBuilder) accountLeaf(length int, keyHex []byte, balance *uint256.I hb.nodeStack[len(hb.nodeStack)-1] = s if hb.trace { fmt.Printf("Stack depth: %d\n", len(hb.nodeStack)) - } return nil } @@ -316,7 +316,6 @@ func (hb *HashBuilder) accountLeafHashWithKey(key []byte, popped int) error { valLen := hb.acc.EncodingLengthForHashing() hb.acc.EncodeForHashing(hb.valBuf[:]) val := rlphacks.RlpEncodedBytes(hb.valBuf[:valLen]) - err := hb.completeLeafHash(kp, kl, compactLen, key, compact0, ni, val) if err != nil { return err @@ -325,6 +324,7 @@ func (hb *HashBuilder) accountLeafHashWithKey(key []byte, popped int) error { hb.hashStack = hb.hashStack[:len(hb.hashStack)-popped*hashStackStride] hb.nodeStack = hb.nodeStack[:len(hb.nodeStack)-popped] } + //fmt.Printf("accountLeafHashWithKey [%x]=>[%x]\nHash [%x]\n", key, val, hb.hashBuf[:]) hb.hashStack = append(hb.hashStack, hb.hashBuf[:]...) hb.nodeStack = append(hb.nodeStack, nil) if hb.trace { @@ -414,6 +414,7 @@ func (hb *HashBuilder) extensionHash(key []byte) error { } ni += 2 } + //capture := common.CopyBytes(branchHash[:common.HashLength+1]) if _, err := hb.sha.Write(branchHash[:common.HashLength+1]); err != nil { return err } @@ -422,6 +423,7 @@ func (hb *HashBuilder) extensionHash(key []byte) error { return err } hb.hashStack[len(hb.hashStack)-hashStackStride] = 0x80 + common.HashLength + //fmt.Printf("extensionHash [%x]=>[%x]\nHash [%x]\n", key, capture, hb.hashStack[len(hb.hashStack)-hashStackStride:len(hb.hashStack)]) if _, ok := hb.nodeStack[len(hb.nodeStack)-1].(*fullNode); ok { return fmt.Errorf("extensionHash cannot be emitted when a node is on top of the stack") } @@ -497,6 +499,7 @@ func (hb *HashBuilder) branchHash(set uint16) error { } // Output hasState hashes or embedded RLPs i = 0 + //fmt.Printf("branchHash {\n") hb.b[0] = rlp.EmptyStringCode for digit := uint(0); digit < 17; digit++ { if ((1 << digit) & set) != 0 { @@ -504,18 +507,21 @@ func (hb *HashBuilder) branchHash(set uint16) error { if _, err := hb.sha.Write(hashes[hashStackStride*i : hashStackStride*i+hashStackStride]); err != nil { return err } + //fmt.Printf("%x: [%x]\n", digit, hashes[hashStackStride*i:hashStackStride*i+hashStackStride]) } else { // Embedded node size := int(hashes[hashStackStride*i]) - rlp.EmptyListCode if _, err := hb.sha.Write(hashes[hashStackStride*i : hashStackStride*i+size+1]); err != nil { return err } + //fmt.Printf("%x: embedded [%x]\n", digit, hashes[hashStackStride*i:hashStackStride*i+size+1]) } i++ } else { if _, err := hb.sha.Write(hb.b[:]); err != nil { return err } + //fmt.Printf("%x: empty\n", digit) } } hb.hashStack = hb.hashStack[:len(hb.hashStack)-hashStackStride*digits+hashStackStride] @@ -523,6 +529,7 @@ func (hb *HashBuilder) branchHash(set uint16) error { if _, err := hb.sha.Read(hb.hashStack[len(hb.hashStack)-common.HashLength:]); err != nil { return err } + //fmt.Printf("} [%x]\n", hb.hashStack[len(hb.hashStack)-hashStackStride:]) if hashStackStride*len(hb.nodeStack) > len(hb.hashStack) { hb.nodeStack = hb.nodeStack[:len(hb.nodeStack)-digits+1] diff --git a/turbo/trie/stream.go b/turbo/trie/stream.go index 684ab985782..e2e773821df 100644 --- a/turbo/trie/stream.go +++ b/turbo/trie/stream.go @@ -683,7 +683,7 @@ func StreamHash(it *StreamMergeIterator, storagePrefixLen int, hb *HashBuilder, aEmptyRoot = a.IsEmptyRoot() copy(aRoot[:], a.Root[:]) fieldSet = 0 - if a.Balance.Sign() != 0 { + if !a.Balance.IsZero() { fieldSet |= AccountFieldBalanceOnly } if a.Nonce != 0 { diff --git a/turbo/trie/structural_branch_test.go b/turbo/trie/structural_branch_test.go index efe5a1d4fe1..7512479eca5 100644 --- a/turbo/trie/structural_branch_test.go +++ b/turbo/trie/structural_branch_test.go @@ -31,7 +31,7 @@ import ( ) func TestIHCursor(t *testing.T) { - _, tx := memdb.NewTestTx(t) + db, tx := memdb.NewTestTx(t) require := require.New(t) hash := common.HexToHash(fmt.Sprintf("%064d", 0)) @@ -57,7 +57,7 @@ func TestIHCursor(t *testing.T) { put("05000f", 0b0000000000000001, 0b0000000000000000, 0b0000000000000001, []common.Hash{hash}) put("06", 0b0000000000000001, 0b0000000000000000, 0b0000000000000001, []common.Hash{hash}) - integrity.Trie(tx, false, context.Background()) + integrity.Trie(db, tx, false, context.Background()) cursor, err := tx.Cursor(kv.TrieOfAccounts) require.NoError(err) diff --git a/turbo/trie/structural_test.go b/turbo/trie/structural_test.go index 20e6dcea5a1..20a0692fb12 100644 --- a/turbo/trie/structural_test.go +++ b/turbo/trie/structural_test.go @@ -22,13 +22,13 @@ import ( "bytes" "encoding/binary" "fmt" - "sort" "testing" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/crypto" "github.com/ledgerwatch/erigon/turbo/rlphacks" "github.com/stretchr/testify/require" + "golang.org/x/exp/slices" ) func TestV2HashBuilding(t *testing.T) { @@ -39,7 +39,7 @@ func TestV2HashBuilding(t *testing.T) { key := crypto.Keccak256(preimage[:])[:8] keys = append(keys, string(key)) } - sort.Strings(keys) + slices.Sort(keys) for i, key := range keys { if i > 0 && keys[i-1] == key { fmt.Printf("Duplicate!\n") @@ -106,7 +106,7 @@ func TestV2Resolution(t *testing.T) { key := crypto.Keccak256(preimage[:])[:8] keys = append(keys, string(key)) } - sort.Strings(keys) + slices.Sort(keys) tr := New(common.Hash{}) value := []byte("VALUE123985903485903489043859043859043859048590485904385903485940385439058934058439058439058439058940385904358904385438809348908345") for _, key := range keys { @@ -197,7 +197,7 @@ func TestEmbeddedStorage(t *testing.T) { var location3 = common.Hash{3} locationKey3 := append(append([]byte{}, addrHash...), crypto.Keccak256(location3[:])...) var keys = []string{string(locationKey1), string(locationKey2), string(locationKey3)} - sort.Strings(keys) + slices.Sort(keys) tr := New(common.Hash{}) valueShort := []byte("VAL") for _, key := range keys { diff --git a/turbo/trie/trie.go b/turbo/trie/trie.go index 77a6efefd77..afadc7bf625 100644 --- a/turbo/trie/trie.go +++ b/turbo/trie/trie.go @@ -22,6 +22,8 @@ import ( "encoding/binary" "fmt" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/common/cmp" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/debug" "github.com/ledgerwatch/erigon/core/types/accounts" @@ -356,13 +358,6 @@ func (t *Trie) NeedLoadCode(addrHash common.Hash, codeHash common.Hash, bytecode return false, nil } -func min(a, b int) int { - if a < b { - return a - } - return b -} - // FindSubTriesToLoad walks over the trie and creates the list of DB prefixes and // corresponding list of valid bits in the prefix (for the cases when prefix contains an // odd number of nibbles) that would allow loading the missing information from the database @@ -473,9 +468,9 @@ func findSubTriesToLoad(nd node, nibblePath []byte, hook []byte, rl RetainDecide } return newPrefixes, newFixedBits, newHooks case hashNode: - newPrefixes = append(prefixes, common.CopyBytes(dbPrefix)) + newPrefixes = append(prefixes, libcommon.Copy(dbPrefix)) newFixedBits = append(fixedbits, bits) - newHooks = append(hooks, common.CopyBytes(hook)) + newHooks = append(hooks, libcommon.Copy(hook)) return newPrefixes, newFixedBits, newHooks } return prefixes, fixedbits, hooks @@ -528,7 +523,7 @@ func (t *Trie) insertRecursive(origNode node, key []byte, pos int, value node) ( var nn node switch n := origNode.(type) { case nil: - return true, NewShortNode(common.CopyBytes(key[pos:]), value) + return true, NewShortNode(libcommon.Copy(key[pos:]), value) case *accountNode: updated, nn = t.insertRecursive(n.storage, key, pos, value) if updated { @@ -555,13 +550,13 @@ func (t *Trie) insertRecursive(origNode node, key []byte, pos int, value node) ( if len(n.Key) == matchlen+1 { c1 = n.Val } else { - c1 = NewShortNode(common.CopyBytes(n.Key[matchlen+1:]), n.Val) + c1 = NewShortNode(libcommon.Copy(n.Key[matchlen+1:]), n.Val) } var c2 node if len(key) == pos+matchlen+1 { c2 = value } else { - c2 = NewShortNode(common.CopyBytes(key[pos+matchlen+1:]), value) + c2 = NewShortNode(libcommon.Copy(key[pos+matchlen+1:]), value) } branch := &duoNode{} if n.Key[matchlen] < key[pos+matchlen] { @@ -578,7 +573,7 @@ func (t *Trie) insertRecursive(origNode node, key []byte, pos int, value node) ( newNode = branch // current node leaves the generation, but new node branch joins it } else { // Otherwise, replace it with a short node leading up to the branch. - n.Key = common.CopyBytes(key[pos : pos+matchlen]) + n.Key = libcommon.Copy(key[pos : pos+matchlen]) n.Val = branch n.ref.len = 0 newNode = n @@ -612,7 +607,7 @@ func (t *Trie) insertRecursive(origNode node, key []byte, pos int, value node) ( if len(key) == pos+1 { child = value } else { - child = NewShortNode(common.CopyBytes(key[pos+1:]), value) + child = NewShortNode(libcommon.Copy(key[pos+1:]), value) } newnode := &fullNode{} newnode.Children[i1] = n.child1 @@ -631,7 +626,7 @@ func (t *Trie) insertRecursive(origNode node, key []byte, pos int, value node) ( if len(key) == pos+1 { n.Children[key[pos]] = value } else { - n.Children[key[pos]] = NewShortNode(common.CopyBytes(key[pos+1:]), value) + n.Children[key[pos]] = NewShortNode(libcommon.Copy(key[pos+1:]), value) } updated = true n.ref.len = 0 @@ -719,7 +714,7 @@ func (t *Trie) HookSubTries(subTries SubTries, hooks [][]byte) error { return fmt.Errorf("root==nil for hook %x", hookNibbles) } if err := t.hook(hookNibbles, root, hash[:]); err != nil { - return fmt.Errorf("hook %x: %v", hookNibbles, err) + return fmt.Errorf("hook %x: %w", hookNibbles, err) } } return nil @@ -851,7 +846,7 @@ func (t *Trie) deleteRecursive(origNode node, key []byte, keyStart int, preserve switch n := origNode.(type) { case *shortNode: matchlen := prefixLen(key[keyStart:], n.Key) - if matchlen == min(len(n.Key), len(key[keyStart:])) || n.Key[matchlen] == 16 || key[keyStart+matchlen] == 16 { + if matchlen == cmp.Min(len(n.Key), len(key[keyStart:])) || n.Key[matchlen] == 16 || key[keyStart+matchlen] == 16 { fullMatch := matchlen == len(key)-keyStart removeNodeEntirely := fullMatch if preserveAccountNode { @@ -1236,7 +1231,7 @@ func (t *Trie) GetNodeByHash(hash common.Hash) []byte { return nil } - return common.CopyBytes(rlp) + return libcommon.Copy(rlp) } func (t *Trie) evictNodeFromHashMap(nd node) { diff --git a/turbo/trie/trie_root.go b/turbo/trie/trie_root.go index e7ec72fd3fe..2e3ee867af5 100644 --- a/turbo/trie/trie_root.go +++ b/turbo/trie/trie_root.go @@ -7,6 +7,7 @@ import ( "math/bits" "time" + libcommon "github.com/ledgerwatch/erigon-lib/common" "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/common" "github.com/ledgerwatch/erigon/common/dbutils" @@ -616,7 +617,7 @@ func (r *RootHashAggregator) genStructAccount() error { data = &r.hashData } else { r.accData.Balance.Set(&r.a.Balance) - if r.a.Balance.Sign() != 0 { + if !r.a.Balance.IsZero() { r.accData.FieldSet |= AccountFieldBalanceOnly } r.accData.Nonce = r.a.Nonce @@ -946,7 +947,7 @@ func (c *AccTrieCursor) _consume() (bool, error) { func (c *AccTrieCursor) _next() (k, v []byte, hasTree bool, err error) { var ok bool - if err = common.Stopped(c.quit); err != nil { + if err = libcommon.Stopped(c.quit); err != nil { return []byte{}, nil, false, err } c.SkipState = c.SkipState && c._hasTree() @@ -1102,7 +1103,7 @@ func (c *StorageTrieCursor) _consume() (bool, error) { if ok { c.skipState = c.skipState && keyIsBefore(c.kBuf, c.nextCreated) c.nextCreated = nextCreated - c.cur = common.CopyBytes(c.kBuf[80:]) + c.cur = libcommon.Copy(c.kBuf[80:]) return true, nil } } @@ -1254,7 +1255,7 @@ func (c *StorageTrieCursor) _nextSiblingInDB() error { func (c *StorageTrieCursor) _next() (k, v []byte, hasTree bool, err error) { var ok bool - if err = common.Stopped(c.quit); err != nil { + if err = libcommon.Stopped(c.quit); err != nil { return []byte{}, nil, false, err } c.skipState = c.skipState && c._hasTree() @@ -1389,7 +1390,7 @@ func (c *StateCursor) Seek(seek []byte) ([]byte, []byte, []byte, error) { } func (c *StateCursor) Next() ([]byte, []byte, []byte, error) { - if err := common.Stopped(c.quit); err != nil { + if err := libcommon.Stopped(c.quit); err != nil { return []byte{}, nil, nil, err } k, v, err := c.c.Next() diff --git a/turbo/trie/witness.go b/turbo/trie/witness.go index 925ae975df5..81c47182d06 100644 --- a/turbo/trie/witness.go +++ b/turbo/trie/witness.go @@ -2,6 +2,7 @@ package trie import ( "bytes" + "errors" "fmt" "io" ) @@ -84,7 +85,7 @@ func NewWitnessFromReader(input io.Reader, trace bool) (*Witness, error) { var err error operands := make([]WitnessOperator, 0) for _, err = input.Read(opcode); ; _, err = input.Read(opcode) { - if err == io.EOF { + if errors.Is(err, io.EOF) { break } if err != nil { diff --git a/turbo/txpool/p2p.go b/turbo/txpool/p2p.go deleted file mode 100644 index c0a9b1b8d16..00000000000 --- a/turbo/txpool/p2p.go +++ /dev/null @@ -1,426 +0,0 @@ -package txpool - -import ( - "bytes" - "context" - "errors" - "fmt" - "io" - "math/rand" - "strings" - "sync" - "time" - - "github.com/ledgerwatch/erigon-lib/gointerfaces" - proto_sentry "github.com/ledgerwatch/erigon-lib/gointerfaces/sentry" - "github.com/ledgerwatch/erigon/cmd/sentry/download" - "github.com/ledgerwatch/erigon/common" - "github.com/ledgerwatch/erigon/common/debug" - "github.com/ledgerwatch/erigon/core" - "github.com/ledgerwatch/erigon/eth/fetcher" - "github.com/ledgerwatch/erigon/eth/protocols/eth" - "github.com/ledgerwatch/erigon/rlp" - "github.com/ledgerwatch/erigon/turbo/remote" - "github.com/ledgerwatch/erigon/turbo/stages/txpropagate" - "github.com/ledgerwatch/log/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// P2PServer - receiving and sending messages to Sentries -type P2PServer struct { - ctx context.Context - Sentries []remote.SentryClient - TxPool *core.TxPool - TxFetcher *fetcher.TxFetcher - RecentPeers *txpropagate.RecentlyConnectedPeers -} - -func NewP2PServer(ctx context.Context, sentries []remote.SentryClient, txPool *core.TxPool) (*P2PServer, error) { - cs := &P2PServer{ - ctx: ctx, - Sentries: sentries, - TxPool: txPool, - RecentPeers: &txpropagate.RecentlyConnectedPeers{}, - } - - return cs, nil -} - -func (tp *P2PServer) newPooledTransactionHashes66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.NewPooledTransactionHashesPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding newPooledTransactionHashes66: %v, data: %x", err, inreq.Data) - } - return tp.TxFetcher.Notify(string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query) -} - -func (tp *P2PServer) newPooledTransactionHashes65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - var query eth.NewPooledTransactionHashesPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding newPooledTransactionHashes65: %v, data: %x", err, inreq.Data) - } - return tp.TxFetcher.Notify(string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query) -} - -func (tp *P2PServer) pooledTransactions66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - txs := ð.PooledTransactionsPacket66{} - if err := txs.DecodeRLP(rlp.NewStream(bytes.NewReader(inreq.Data), 0)); err != nil { - return fmt.Errorf("decoding pooledTransactions66: %v, data: %x", err, inreq.Data) - } - - return tp.TxFetcher.Enqueue(string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), txs.PooledTransactionsPacket, true) -} - -func (tp *P2PServer) pooledTransactions65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - txs := ð.PooledTransactionsPacket{} - if err := txs.DecodeRLP(rlp.NewStream(bytes.NewReader(inreq.Data), 0)); err != nil { - return fmt.Errorf("decoding pooledTransactions65: %v, data: %x", err, inreq.Data) - } - - return tp.TxFetcher.Enqueue(string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), *txs, true) -} - -func (tp *P2PServer) transactions66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - return tp.transactions65(ctx, inreq, sentry) -} - -func (tp *P2PServer) transactions65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - if tp.TxPool == nil { - return nil - } - var query eth.TransactionsPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding TransactionsPacket: %v, data: %x", err, inreq.Data) - } - return tp.TxFetcher.Enqueue(string(gointerfaces.ConvertH512ToBytes(inreq.PeerId)), query, false) -} - -func (tp *P2PServer) getPooledTransactions66(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - if tp.TxPool == nil { - return nil - } - var query eth.GetPooledTransactionsPacket66 - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding GetPooledTransactionsPacket66: %v, data: %x", err, inreq.Data) - } - _, txs := eth.AnswerGetPooledTransactions(tp.TxPool, query.GetPooledTransactionsPacket) - b, err := rlp.EncodeToBytes(ð.PooledTransactionsRLPPacket66{ - RequestId: query.RequestId, - PooledTransactionsRLPPacket: txs, - }) - if err != nil { - return fmt.Errorf("encode GetPooledTransactionsPacket66 response: %v", err) - } - // TODO: implement logic from perr.ReplyPooledTransactionsRLP - to remember tx ids - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{Id: proto_sentry.MessageId_POOLED_TRANSACTIONS_66, Data: b}, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - return fmt.Errorf("send pooled transactions response: %v", err) - } - return nil -} - -func (tp *P2PServer) getPooledTransactions65(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - if tp.TxPool == nil { - return nil - } - var query eth.GetPooledTransactionsPacket - if err := rlp.DecodeBytes(inreq.Data, &query); err != nil { - return fmt.Errorf("decoding getPooledTransactions65: %v, data: %x", err, inreq.Data) - } - _, txs := eth.AnswerGetPooledTransactions(tp.TxPool, query) - b, err := rlp.EncodeToBytes(eth.PooledTransactionsRLPPacket(txs)) - if err != nil { - return fmt.Errorf("encode getPooledTransactions65 response: %v", err) - } - // TODO: implement logic from perr.ReplyPooledTransactionsRLP - to remember tx ids - outreq := proto_sentry.SendMessageByIdRequest{ - PeerId: inreq.PeerId, - Data: &proto_sentry.OutboundMessageData{Id: proto_sentry.MessageId_POOLED_TRANSACTIONS_65, Data: b}, - } - _, err = sentry.SendMessageById(ctx, &outreq, &grpc.EmptyCallOption{}) - if err != nil { - return fmt.Errorf("send pooled transactions response: %v", err) - } - return nil -} - -func (tp *P2PServer) SendTxsRequest(ctx context.Context, peerID string, hashes []common.Hash) []byte { - var outreq65, outreq66 *proto_sentry.SendMessageByIdRequest - - // if sentry not found peers to send such message, try next one. stop if found. - for i, ok, next := tp.randSentryIndex(); ok; i, ok = next() { - if !tp.Sentries[i].Ready() { - continue - } - - switch tp.Sentries[i].Protocol() { - case eth.ETH65: - if outreq65 == nil { - data65, err := rlp.EncodeToBytes(eth.GetPooledTransactionsPacket(hashes)) - if err != nil { - log.Error("Could not encode transactions request", "err", err) - return nil - } - - outreq65 = &proto_sentry.SendMessageByIdRequest{ - PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)), - Data: &proto_sentry.OutboundMessageData{Id: proto_sentry.MessageId_GET_POOLED_TRANSACTIONS_65, Data: data65}, - } - } - - if sentPeers, err1 := tp.Sentries[i].SendMessageById(ctx, outreq65, &grpc.EmptyCallOption{}); err1 != nil { - if isPeerNotFoundErr(err1) { - continue - } - log.Error("[SendTxsRequest]", "err", err1) - } else if sentPeers != nil && len(sentPeers.Peers) != 0 { - return gointerfaces.ConvertH512ToBytes(sentPeers.Peers[0]) - } - case eth.ETH66: - if outreq66 == nil { - data66, err := rlp.EncodeToBytes(ð.GetPooledTransactionsPacket66{ - RequestId: rand.Uint64(), //nolint:gosec - GetPooledTransactionsPacket: hashes, - }) - if err != nil { - log.Error("Could not encode transactions request", "err", err) - return nil - } - - outreq66 = &proto_sentry.SendMessageByIdRequest{ - PeerId: gointerfaces.ConvertBytesToH512([]byte(peerID)), - Data: &proto_sentry.OutboundMessageData{Id: proto_sentry.MessageId_GET_POOLED_TRANSACTIONS_66, Data: data66}, - } - } - - if sentPeers, err1 := tp.Sentries[i].SendMessageById(ctx, outreq66, &grpc.EmptyCallOption{}); err1 != nil { - if isPeerNotFoundErr(err1) { - continue - } - log.Error("[SendTxsRequest]", "err", err1) - - } else if sentPeers != nil && len(sentPeers.Peers) != 0 { - return gointerfaces.ConvertH512ToBytes(sentPeers.Peers[0]) - } - } - } - return nil -} - -func (tp *P2PServer) randSentryIndex() (int, bool, func() (int, bool)) { - var i int - if len(tp.Sentries) > 1 { - i = rand.Intn(len(tp.Sentries)) - } - to := i - return i, true, func() (int, bool) { - i = (i + 1) % len(tp.Sentries) - return i, i != to - } -} - -func (tp *P2PServer) HandleInboundMessage(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error { - switch inreq.Id { - - // ==== eth 65 ==== - case proto_sentry.MessageId_TRANSACTIONS_65: - return tp.transactions65(ctx, inreq, sentry) - case proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_65: - return tp.newPooledTransactionHashes65(ctx, inreq, sentry) - case proto_sentry.MessageId_GET_POOLED_TRANSACTIONS_65: - return tp.getPooledTransactions65(ctx, inreq, sentry) - case proto_sentry.MessageId_POOLED_TRANSACTIONS_65: - return tp.pooledTransactions65(ctx, inreq, sentry) - - // ==== eth 66 ==== - case proto_sentry.MessageId_NEW_POOLED_TRANSACTION_HASHES_66: - return tp.newPooledTransactionHashes66(ctx, inreq, sentry) - case proto_sentry.MessageId_POOLED_TRANSACTIONS_66: - return tp.pooledTransactions66(ctx, inreq, sentry) - case proto_sentry.MessageId_TRANSACTIONS_66: - return tp.transactions66(ctx, inreq, sentry) - case proto_sentry.MessageId_GET_POOLED_TRANSACTIONS_66: - return tp.getPooledTransactions66(ctx, inreq, sentry) - default: - return fmt.Errorf("not implemented for message Id: %s", inreq.Id) - } -} - -func RecvTxMessageLoop(ctx context.Context, - sentry remote.SentryClient, - cs *download.ControlServerImpl, - handleInboundMessage func(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error, - wg *sync.WaitGroup, -) { - for { - select { - case <-ctx.Done(): - return - default: - } - - if err := download.SentryHandshake(ctx, sentry, cs); err != nil { - log.Error("[RecvTxMessage] sentry not ready yet", "err", err) - time.Sleep(time.Second) - continue - } - if err := RecvTxMessage(ctx, sentry, handleInboundMessage, wg); err != nil { - log.Error("[RecvTxMessage]", "err", err) - } - } -} - -// RecvTxMessage -// wg is used only in tests to avoid time.Sleep. For non-test code wg == nil -func RecvTxMessage(ctx context.Context, - sentry remote.SentryClient, - handleInboundMessage func(ctx context.Context, inreq *proto_sentry.InboundMessage, sentry remote.SentryClient) error, - wg *sync.WaitGroup, -) (err error) { - defer func() { err = debug.ReportPanicAndRecover(err) }() // avoid crash because Erigon's core does many things - streamCtx, cancel := context.WithCancel(ctx) - defer cancel() - - stream, err := sentry.Messages(streamCtx, &proto_sentry.MessagesRequest{Ids: []proto_sentry.MessageId{ - eth.ToProto[eth.ETH65][eth.NewPooledTransactionHashesMsg], - eth.ToProto[eth.ETH65][eth.GetPooledTransactionsMsg], - eth.ToProto[eth.ETH65][eth.TransactionsMsg], - eth.ToProto[eth.ETH65][eth.PooledTransactionsMsg], - - eth.ToProto[eth.ETH66][eth.NewPooledTransactionHashesMsg], - eth.ToProto[eth.ETH66][eth.GetPooledTransactionsMsg], - eth.ToProto[eth.ETH66][eth.TransactionsMsg], - eth.ToProto[eth.ETH66][eth.PooledTransactionsMsg], - }}, grpc.WaitForReady(true)) - if err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - - var req *proto_sentry.InboundMessage - for req, err = stream.Recv(); ; req, err = stream.Recv() { - if err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - if req == nil { - return - } - if err = handleInboundMessage(ctx, req, sentry); err != nil { - log.Error("RecvTxMessage: Handling incoming message", "error", err) - } - if wg != nil { - wg.Done() - } - } -} - -func RecvPeersLoop(ctx context.Context, - sentry remote.SentryClient, - cs *download.ControlServerImpl, - recentPeers *txpropagate.RecentlyConnectedPeers, - wg *sync.WaitGroup, -) { - for { - select { - case <-ctx.Done(): - return - default: - } - - if err := download.SentryHandshake(ctx, sentry, cs); err != nil { - log.Error("[RecvPeers] sentry not ready yet", "err", err) - time.Sleep(time.Second) - continue - } - if err := RecvPeers(ctx, sentry, recentPeers, wg); err != nil { - log.Error("[RecvPeers]", "err", err) - } - } -} - -// RecvPeers -// wg is used only in tests to avoid time.Sleep. For non-test code wg == nil -func RecvPeers(ctx context.Context, - sentry remote.SentryClient, - recentPeers *txpropagate.RecentlyConnectedPeers, - wg *sync.WaitGroup, -) (err error) { - defer func() { err = debug.ReportPanicAndRecover(err) }() // avoid crash because Erigon's core does many things - streamCtx, cancel := context.WithCancel(ctx) - defer cancel() - - stream, err := sentry.Peers(streamCtx, &proto_sentry.PeersRequest{}) - if err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - - var req *proto_sentry.PeersReply - for req, err = stream.Recv(); ; req, err = stream.Recv() { - if err != nil { - select { - case <-ctx.Done(): - return - default: - } - if s, ok := status.FromError(err); ok && s.Code() == codes.Canceled { - return - } - if errors.Is(err, io.EOF) { - return - } - return err - } - if req == nil { - return - } - switch req.Event { - case proto_sentry.PeersReply_Connect: - recentPeers.AddPeer(req.PeerId) - } - if wg != nil { - wg.Done() - } - } -} - -func isPeerNotFoundErr(err error) bool { - return strings.Contains(err.Error(), "peer not found") -} diff --git a/wmake.ps1 b/wmake.ps1 index ce06c0d3fed..7202f105d30 100644 --- a/wmake.ps1 +++ b/wmake.ps1 @@ -14,13 +14,32 @@ limitations under the License. #> - Param( [Parameter(Position=0, HelpMessage="Enter the build target")] [Alias("target")] - [ValidateSet("all", "clean", "test", "erigon","rpcdaemon","rpctest", "hack", "state", "integration", "db-tools", "sentry")] - [string[]]$BuildTargets=@("erigon","rpcdaemon","sentry","integration") + [ValidateSet( + "clean", + "cons", + "db-tools", + "devnettest", + "downloader", + "erigon", + "evm", + "hack", + "integration", + "observer", + "pics", + "rpcdaemon", + "rpctest", + "sentry", + "state", + "test", + "test-integration", + "txpool", + "all" + )] + [string[]]$BuildTargets=@("erigon", "rpcdaemon", "sentry", "downloader", "integration") ) # Sanity checks on $BuildTargets @@ -48,6 +67,24 @@ if ($BuildTargets.Count -gt 1) { } +if ($BuildTargets[0] -eq "all") { + $BuildTargets = @( + "cons", + "devnettest", + "downloader", + "erigon", + "evm", + "hack", + "integration", + "observer", + "pics", + "rpcdaemon", + "rpctest", + "sentry", + "state", + "txpool" + ) +} # ==================================================================== # Messages texts @@ -61,7 +98,6 @@ $headerText = @" "@ - $gitErrorText = @" Requirement Error. @@ -71,14 +107,19 @@ $gitErrorText = @" "@ +$goMinMinorVersion = 18 +$goMinVersion = "1.$goMinMinorVersion" $goErrorText = @" Requirement Error. You need to have Go Programming Language (aka golang) installed. - Minimum required version is 1.16 + Minimum required version is $goMinVersion Please visit https://golang.org/dl/ and download the appropriate installer. + Ensure that go.exe installation + directory is properly inserted into your PATH + environment variable. "@ @@ -89,9 +130,9 @@ $chocolateyErrorText = @" chocolatey [https://chocolatey.org/] with the following mandatory components: - - cmake 3.20.2 - - make 4.3 - - mingw 10.2.0 + - cmake + - make + - mingw "@ @@ -117,20 +158,6 @@ $privilegeErrorText = @" # Functions # ==================================================================== -# ----------------------------------------------------------------------------- -# Function : Test-Administrator -# ----------------------------------------------------------------------------- -# Description : Checks the script is running with Administrator privileges -# Returns : $true / $false -# ----------------------------------------------------------------------------- -function Test-Administrator { - - $myWindowsID = [System.Security.Principal.WindowsIdentity]::GetCurrent(); - $myWindowsPrincipal = New-Object System.Security.Principal.WindowsPrincipal($myWindowsID); - $adminRole = [System.Security.Principal.WindowsBuiltInRole]::Administrator; - Write-Output ($myWindowsPrincipal.IsInRole($adminRole)) -} - # ----------------------------------------------------------------------------- # Function : Get-Env # ----------------------------------------------------------------------------- @@ -183,20 +210,14 @@ function Get-Uninstall-Item { # Returns : $true / $false # ----------------------------------------------------------------------------- function Test-GO-Installed { - - $Private:item = Get-Uninstall-Item "^Go\ Programming\ Language" - $Private:result = $false - - if ($Private:item) { - $Private:versionMajor = [int]$item.VersionMajor - $Private:versionMinor = [int]$item.VersionMinor - if ($Private:versionMajor -ge 1 -and $Private:versionMinor -ge 16) { - Write-Host " Found GO version $($Private:item.DisplayVersion)" - $Private:result = $true - } - } - - Write-Output $Private:result + $versionStr = go.exe version + if (!($?)) { + return $false + } + + $minorVersionStr = $versionStr.Substring(15, 2) + $minorVersion = [int]$minorVersionStr + return ($minorVersion -ge $goMinMinorVersion) } # ----------------------------------------------------------------------------- @@ -206,8 +227,7 @@ function Test-GO-Installed { # Returns : $true / $false # ----------------------------------------------------------------------------- function Test-Git-Installed { - - $Private:item = Get-Uninstall-Item "^Git\ " + $Private:item = Get-Uninstall-Item "^Git version [0-9\.]{1,}|^Git$" $Private:result = $false if ($Private:item) { @@ -225,7 +245,6 @@ function Test-Git-Installed { # Returns : $true / $false # ----------------------------------------------------------------------------- function Test-Choco-Installed { - ## Test Chocolatey Install $script:chocolateyPath = Get-Env "chocolateyInstall" if(-not $chocolateyPath) { @@ -339,34 +358,21 @@ if(!(Test-GO-Installed)) { Write-Host $goErrorText exit 1 } -Get-Command go.exe | Out-Null -if (!($?)) { - Write-Host @" - - Error ! - Though GO installation is found I could not get - the GO binary executable. Ensure GO installation - directory is properly inserted into your PATH - environment variable. -"@ - exit 1 -} +# Build erigon binaries +Set-Variable -Name "Erigon" -Value ([hashtable]::Synchronized(@{})) -Scope Script +$Erigon.Commit = [string]@(git.exe rev-list -1 HEAD) +$Erigon.Branch = [string]@(git.exe rev-parse --abbrev-ref HEAD) +$Erigon.Tag = [string]@(git.exe describe --tags) -# ## Administrator Privileges -# if (!(Test-Administrator)) { -# Write-Host $privilegeErrorText -# return -# } +$Erigon.BuildTags = "nosqlite,noboltdb" +$Erigon.Package = "github.com/ledgerwatch/erigon" +$Erigon.BuildFlags = "-trimpath -tags $($Erigon.BuildTags) -buildvcs=false" +$Erigon.BuildFlags += " -ldflags ""-X $($Erigon.Package)/params.GitCommit=$($Erigon.Commit) -X $($Erigon.Package)/params.GitBranch=$($Erigon.Branch) -X $($Erigon.Package)/params.GitTag=$($Erigon.Tag)""" -# Build erigon binaries -Set-Variable -Name "Erigon" -Value ([hashtable]::Synchronized(@{})) -Scope Script -$Erigon.Commit = [string]@(git.exe rev-list -1 HEAD) -$Erigon.Branch = [string]@(git.exe rev-parse --abbrev-ref HEAD) -$Erigon.Tag = [string]@(git.exe describe --tags) -$Erigon.Build = "go build -v -trimpath -ldflags ""-X github.com/ledgerwatch/erigon/params.GitCommit=$($Erigon.Commit) -X github.com/ledgerwatch/erigon/params.GitBranch=$($Erigon.Branch) -X github.com/ledgerwatch/erigon/params.GitTag=$($Erigon.Tag)""" -$Erigon.BinPath = [string](Join-Path $MyContext.StartDir "\build\bin") +$Erigon.BinPath = [string](Join-Path $MyContext.StartDir "\build\bin") +$Erigon.Submodules = $false $env:GO111MODULE = "on" New-Item -Path $Erigon.BinPath -ItemType Directory -Force | Out-Null @@ -389,8 +395,9 @@ Write-Host @" "@ foreach($BuildTarget in $BuildTargets) { + ## Choco components for building db-tools -if ($BuildTarget -eq "all" -or $BuildTarget -eq "db-tools") { +if ($BuildTarget -eq "db-tools") { if(!(Test-choco-Installed)) { exit 1 } @@ -449,11 +456,9 @@ if ($BuildTarget -eq "all" -or $BuildTarget -eq "db-tools") { Set-Location $MyContext.Directory # Eventually move all mdbx_*.exe to ./build/bin directory Move-Item -Path "$($Erigon.MDBXBuildPath)/mdbx_*.exe" -Destination $Erigon.BinPath -Force - } if ($BuildTarget -eq "clean") { - Write-Host " Cleaning ..." # Remove ./build/bin directory @@ -463,96 +468,52 @@ if ($BuildTarget -eq "clean") { go.exe clean -cache } elseif ($BuildTarget -eq "test") { - Write-Host " Running tests ..." - $env:GODEBUG="cgocheck=0" - go test ./... -p 2 --timeout 30m - $TestCommand = "go test ./... -p 2 --timeout 30m" - $TestCommand += ';$?' - $success = Invoke-Expression -Command $TestCommand - if (-not $success) { + $env:GODEBUG = "cgocheck=0" + $TestCommand = "go test $($Erigon.BuildFlags) ./... -p 2 --timeout 30s" + Invoke-Expression -Command $TestCommand | Out-Host + if (!($?)) { Write-Host " ERROR : Tests failed" exit 1 } else { Write-Host "`n Tests completed" } -} else { - - $binaries = @() - - if ($BuildTarget -eq "all" -or $BuildTarget -eq "erigon") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="erigon.exe" - Source="./cmd/erigon" - } - $binaries += $binary - } - - if ($BuildTarget -eq "all" -or $BuildTarget -eq "rpcdaemon") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="rpcdaemon.exe" - Source="./cmd/rpcdaemon" - } - $binaries += $binary - } - - if ($BuildTarget -eq "all" -or $BuildTarget -eq "rpctest") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="rpctest.exe" - Source="./cmd/rpctest" - } - $binaries += $binary +} elseif ($BuildTarget -eq "test-integration") { + Write-Host " Running integration tests ..." + $env:GODEBUG = "cgocheck=0" + $TestCommand = "go test $($Erigon.BuildFlags) ./... -p 2 --timeout 30m -tags $($Erigon.BuildTags),integration" + Invoke-Expression -Command $TestCommand | Out-Host + if (!($?)) { + Write-Host " ERROR : Tests failed" + exit 1 + } else { + Write-Host "`n Tests completed" } - if ($BuildTarget -eq "all" -or $BuildTarget -eq "integration") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="integration.exe" - Source="./cmd/integration" - } - $binaries += $binary - } - - if ($BuildTarget -eq "all" -or $BuildTarget -eq "state") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="state.exe" - Source="./cmd/state" +} else { + if (!($Erigon.Submodules)) { + Write-Host " Updating git submodules ..." + Invoke-Expression -Command "git.exe submodule update --init --recursive --force" | Out-Host + if (!($?)) { + Write-Host " ERROR : Update submodules failed" + exit 1 } - $binaries += $binary + $Erigon.Submodules = $true } - if ($BuildTarget -eq "all" -or $BuildTarget -eq "hack") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="hack.exe" - Source="./cmd/hack" - } - $binaries += $binary - } - - if ($BuildTarget -eq "all" -or $BuildTarget -eq "sentry") { - $binary = New-Object -TypeName psobject -Property @{ - Executable="sentry.exe" - Source="./cmd/sentry" - } - $binaries += $binary - } - - if ($binaries.Count -gt 0) { - $binaries | ForEach-Object { - Write-Host "`n Building $($_.Executable)" - $outExecutable = [string](Join-Path $Erigon.BinPath $_.Executable) - $BuildCommand = "$($Erigon.Build) -o ""$($outExecutable)"" $($_.Source)" - $BuildCommand += ';$?' - $success = Invoke-Expression -Command $BuildCommand - if (-not $success) { - Write-Host " ERROR : Could not build $($_.Executable)" - exit 1 - } else { - Write-Host "`n Built $($_.Executable). Run $($outExecutable) to launch" - } - } + Write-Host "`n Building $BuildTarget" + $outExecutable = [string](Join-Path $Erigon.BinPath "$BuildTarget.exe") + $BuildCommand = "go build $($Erigon.BuildFlags) -o ""$($outExecutable)"" ./cmd/$BuildTarget" + Invoke-Expression -Command $BuildCommand | Out-Host + if (!($?)) { + Write-Host " ERROR : Could not build $BuildTarget" + exit 1 + } else { + Write-Host "`n Built $($BuildTarget). Run $($outExecutable) to launch" } } } + # Return to source folder Set-Location $MyContext.Directory